From bbd870b26c7094247235b064f7c8d970d5c7167a Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 31 Mar 2023 16:49:26 +0200 Subject: [PATCH] Sync to c987b4585: this is needed so we can later ff public/stable (currently at version_2.5.2) to version_2.6.0 --- .clang-format | 6 +- .github/ISSUE_TEMPLATE/bug_report_form.yml | 65 + .github/ISSUE_TEMPLATE/config.yml | 12 + .github/ISSUE_TEMPLATE/feature_request.md | 20 + .gitignore | 1 + CMakeLists.txt | 88 +- build_win.bat | 4 + cmake/modules/FindGLEW.cmake | 361 +- cmake/modules/FindTBB.cmake.in | 2 +- deps/Boost/Boost.cmake | 31 +- deps/Boost/Boost.patch | 23 + deps/Boost/common.jam | 1095 - deps/Boost/user-config.jam | 2 +- deps/CGAL/CGAL.cmake | 24 +- deps/CMakeLists.txt | 10 +- deps/Cereal/Cereal.cmake | 8 +- deps/GLEW/GLEW.cmake | 6 +- deps/GLEW/glew/CMakeLists.txt | 33 - deps/GLEW/glew/LICENSE.txt | 73 - deps/GLEW/glew/README.md | 196 - deps/GLEW/glew/VERSION | 1 - deps/GLEW/glew/include/GL/glew.h | 19753 ---------- deps/GLEW/glew/include/GL/glxew.h | 1772 - deps/GLEW/glew/include/GL/wglew.h | 1456 - deps/GLEW/glew/src/glew.c | 18614 --------- deps/NanoSVG/NanoSVG.cmake | 9 + deps/OCCT/OCCT.cmake | 5 + deps/OCCT/occt_toolkit.cmake | 453 + deps/OpenCSG/CMakeLists.txt.in | 2 +- deps/deps-windows.cmake | 4 + deps/wxWidgets/wxWidgets.cmake | 22 +- doc/Dependencies.md | 1 - doc/How to build - Mac OS.md | 2 +- .../corner_penalty_function.png | Bin 0 -> 35247 bytes lib/Slic3r.pm | 91 - lib/Slic3r/Config.pm | 44 - lib/Slic3r/ExPolygon.pm | 39 - lib/Slic3r/ExtrusionLoop.pm | 12 - lib/Slic3r/ExtrusionPath.pm | 13 - lib/Slic3r/Flow.pm | 13 - lib/Slic3r/Geometry.pm | 234 - lib/Slic3r/Geometry/Clipper.pm | 14 - lib/Slic3r/Layer.pm | 37 - lib/Slic3r/Line.pm | 11 - lib/Slic3r/Model.pm | 7 - lib/Slic3r/Polygon.pm | 7 +- lib/Slic3r/Print/Object.pm | 24 - lib/Slic3r/Print/State.pm | 12 - lib/Slic3r/Surface.pm | 15 - resources/data/embossed_text.obj | 2555 ++ resources/data/hints.ini | 30 +- resources/icons/add_text_modifier.svg | 4 + resources/icons/add_text_negative.svg | 4 + resources/icons/add_text_part.svg | 4 + resources/icons/collapse_btn.svg | 12 + resources/icons/cut_.svg | 26 + resources/icons/cut_connectors.svg | 20 + resources/icons/dowel.svg | 15 + resources/icons/edit.svg | 4 + resources/icons/edit_button_pressed.svg | 91 + resources/icons/expand_btn.svg | 13 + resources/icons/legend_cog.svg | 50 + resources/icons/legend_colorchanges.svg | 157 + resources/icons/legend_customgcodes.svg | 9 + resources/icons/legend_deretract.svg | 107 + resources/icons/legend_pauseprints.svg | 76 + resources/icons/legend_retract.svg | 110 + resources/icons/legend_seams.svg | 45 + resources/icons/legend_shells.svg | 77 + resources/icons/legend_toolchanges.svg | 10 + resources/icons/legend_toolmarker.svg | 3 + resources/icons/legend_travel.svg | 163 + resources/icons/legend_wipe.svg | 16 + resources/icons/make_bold.svg | 4 + resources/icons/make_italic.svg | 4 + resources/icons/make_unbold.svg | 4 + resources/icons/make_unitalic.svg | 4 + resources/icons/measure.svg | 93 + resources/icons/mode.svg | 10 + resources/icons/notification_open.svg | 63 + resources/icons/notification_open_hover.svg | 64 + resources/icons/notification_pause.svg | 75 + resources/icons/notification_pause_hover.svg | 75 + resources/icons/notification_play.svg | 75 + resources/icons/notification_play_hover.svg | 75 + resources/icons/open_browser.svg | 61 + resources/icons/plug.svg | 13 + resources/icons/search.svg | 4 +- resources/icons/splashscreen-gcodepreview.jpg | Bin 221771 -> 74931 bytes resources/icons/splashscreen.jpg | Bin 318372 -> 145267 bytes resources/icons/toolbar_arrow_2.svg | 22 + resources/localization/PrusaSlicer.pot | 9695 +++-- resources/localization/ca/PrusaSlicer.mo | Bin 527219 -> 519135 bytes resources/localization/ca/PrusaSlicer_ca.po | 10057 +++-- resources/localization/en/PrusaSlicer.mo | Bin 10589 -> 9916 bytes resources/localization/en/PrusaSlicer_en.po | 9722 +++-- resources/localization/hu/PrusaSlicer.mo | Bin 461570 -> 451702 bytes resources/localization/hu/PrusaSlicer_hu.po | 10064 +++-- resources/localization/ja/PrusaSlicer.mo | Bin 543582 -> 543582 bytes resources/localization/ja/PrusaSlicer_ja.po | 2 +- resources/localization/ko/PrusaSlicer.mo | Bin 316508 -> 313890 bytes .../localization/ko/PrusaSlicer_ko_KR.po | 10037 +++-- resources/localization/ko_KR/PrusaSlicer.mo | Bin 381072 -> 374896 bytes .../localization/ko_KR/PrusaSlicer_ko.po | 9964 +++-- .../localization/ko_KR/PrusaSlicer_ko_KR.po | 9964 +++-- resources/localization/list.txt | 18 +- resources/localization/nl/PrusaSlicer.mo | Bin 469637 -> 491391 bytes resources/localization/nl/PrusaSlicer_nl.po | 10511 +++-- resources/localization/pt_BR/PrusaSlicer.mo | Bin 515527 -> 507571 bytes .../localization/pt_BR/PrusaSlicer_pt_BR.po | 10040 +++-- resources/localization/ru/PrusaSlicer.mo | Bin 687966 -> 675903 bytes resources/localization/ru/PrusaSlicer_ru.po | 10052 +++-- resources/localization/tr/PrusaSlicer.mo | Bin 301634 -> 297651 bytes resources/localization/tr/PrusaSlicer_tr.po | 9828 +++-- resources/localization/uk/PrusaSlicer.mo | Bin 529930 -> 520783 bytes resources/localization/uk/PrusaSlicer_uk.po | 9994 +++-- resources/localization/zh_CN/PrusaSlicer.mo | Bin 451062 -> 443508 bytes .../localization/zh_CN/PrusaSlicer_zh_CN.po | 10006 +++-- resources/localization/zh_TW/PrusaSlicer.mo | Bin 261194 -> 258211 bytes .../localization/zh_TW/PrusaSlicer_zh_TW.po | 9808 +++-- resources/profiles/Anker.idx | 5 + resources/profiles/Anker.ini | 366 + resources/profiles/Anker/M5-bed.stl | Bin 0 -> 36084 bytes resources/profiles/Anker/M5-texture.svg | 1003 + resources/profiles/Anker/M5-texture_v2.svg | 1 + resources/profiles/Anker/M5_thumbnail.png | Bin 0 -> 37200 bytes resources/profiles/Anker/M5_thumbnail_v2.png | Bin 0 -> 26339 bytes resources/profiles/Anycubic.idx | 5 + resources/profiles/Anycubic.ini | 185 +- .../Anycubic/PHOTON MONO X_thumbnail.png | Bin 0 -> 45953 bytes resources/profiles/Artillery.idx | 2 + resources/profiles/Artillery.ini | 67 +- resources/profiles/BIBO.idx | 2 + resources/profiles/BIBO.ini | 59 +- resources/profiles/BIQU.idx | 2 + resources/profiles/BIQU.ini | 437 + resources/profiles/BIQU/BIQUBX_thumbnail.png | Bin 0 -> 26530 bytes resources/profiles/BIQU/BX_Bed.stl | Bin 0 -> 273784 bytes resources/profiles/BIQU/BX_Texture.png | Bin 0 -> 74266 bytes resources/profiles/Creality.idx | 6 + resources/profiles/Creality.ini | 722 +- .../profiles/Creality/ENDER5PRO_thumbnail.png | Bin 0 -> 28977 bytes .../profiles/Creality/ENDER5S1_thumbnail.png | Bin 0 -> 36850 bytes .../Creality/SERMOONV1PRO_thumbnail.png | Bin 0 -> 24742 bytes .../profiles/Creality/SERMOONV1_thumbnail.png | Bin 0 -> 24117 bytes resources/profiles/Creality/sermoonv1.svg | 4 + resources/profiles/Creality/sermoonv1_bed.stl | Bin 0 -> 35884 bytes resources/profiles/Elegoo.idx | 8 +- resources/profiles/Elegoo.ini | 1106 +- .../profiles/Elegoo/NEPTUNE3MAX_thumbnail.png | Bin 0 -> 40643 bytes .../Elegoo/NEPTUNE3PLUS_thumbnail.png | Bin 0 -> 35858 bytes .../profiles/Elegoo/NEPTUNE3PRO_thumbnail.png | Bin 0 -> 36880 bytes resources/profiles/Geeetech.idx | 4 + resources/profiles/Geeetech.ini | 1913 + resources/profiles/Geeetech/125X130.stl | Bin 0 -> 684 bytes resources/profiles/Geeetech/125x130.svg | 39 + resources/profiles/Geeetech/150x150.stl | Bin 0 -> 684 bytes resources/profiles/Geeetech/150x150.svg | 96 + resources/profiles/Geeetech/160x160.stl | Bin 0 -> 684 bytes resources/profiles/Geeetech/160x160.svg | 98 + resources/profiles/Geeetech/180X150.stl | Bin 0 -> 684 bytes resources/profiles/Geeetech/180x150.svg | 99 + resources/profiles/Geeetech/200x200.stl | Bin 0 -> 684 bytes resources/profiles/Geeetech/200x200.svg | 106 + resources/profiles/Geeetech/220x220.stl | Bin 0 -> 684 bytes resources/profiles/Geeetech/220x220.svg | 110 + resources/profiles/Geeetech/250x250.stl | Bin 0 -> 684 bytes resources/profiles/Geeetech/250x250.svg | 114 + resources/profiles/Geeetech/255x255.stl | Bin 0 -> 684 bytes resources/profiles/Geeetech/255x255.svg | 114 + resources/profiles/Geeetech/300x180.stl | Bin 0 -> 684 bytes resources/profiles/Geeetech/300x180.svg | 114 + resources/profiles/Geeetech/320x320.stl | Bin 0 -> 684 bytes resources/profiles/Geeetech/320x320.svg | 130 + .../profiles/Geeetech/A10M_thumbnail.png | Bin 0 -> 45048 bytes .../profiles/Geeetech/A10Pro_thumbnail.png | Bin 0 -> 33556 bytes .../profiles/Geeetech/A10T_thumbnail.png | Bin 0 -> 42760 bytes .../profiles/Geeetech/A20M_thumbnail.png | Bin 0 -> 42458 bytes .../profiles/Geeetech/A20T_thumbnail.png | Bin 0 -> 57482 bytes resources/profiles/Geeetech/A20_thumbnail.png | Bin 0 -> 40931 bytes .../profiles/Geeetech/A30M_thumbnail.png | Bin 0 -> 49170 bytes .../profiles/Geeetech/A30Pro_thumbnail.png | Bin 0 -> 38513 bytes .../profiles/Geeetech/A30T_thumbnail.png | Bin 0 -> 50478 bytes .../profiles/Geeetech/E180_thumbnail.png | Bin 0 -> 36072 bytes .../Geeetech/GiantArmD200_thumbnail.png | Bin 0 -> 41167 bytes .../profiles/Geeetech/I3ProB_thumbnail.png | Bin 0 -> 59698 bytes .../profiles/Geeetech/I3ProC_thumbnail.png | Bin 0 -> 62464 bytes .../profiles/Geeetech/I3ProW_thumbnail.png | Bin 0 -> 50350 bytes .../Geeetech/MeCreator2_thumbnail.png | Bin 0 -> 48131 bytes .../profiles/Geeetech/MeCreator_thumbnail.png | Bin 0 -> 49215 bytes .../profiles/Geeetech/MeDucer_thumbnail.png | Bin 0 -> 59169 bytes .../profiles/Geeetech/MizarM_thumbnail.png | Bin 0 -> 48858 bytes .../profiles/Geeetech/MizarMax_thumbnail.png | Bin 0 -> 31513 bytes .../profiles/Geeetech/MizarPro_thumbnail.png | Bin 0 -> 35007 bytes .../profiles/Geeetech/MizarS_thumbnail.png | Bin 0 -> 35146 bytes .../profiles/Geeetech/Mizar_thumbnail.png | Bin 0 -> 27120 bytes .../Geeetech/ThunderPro_thumbnail.png | Bin 0 -> 50599 bytes .../profiles/Geeetech/Thunder_thumbnail.png | Bin 0 -> 45095 bytes resources/profiles/LulzBot.idx | 9 +- resources/profiles/LulzBot.ini | 329 +- .../LulzBot/TAZ_WORKHORSE_thumbnail.png | Bin 0 -> 40220 bytes resources/profiles/MakerGear.idx | 2 + resources/profiles/MakerGear.ini | 1754 + resources/profiles/MakerGear/M2_M3.stl | Bin 0 -> 171484 bytes resources/profiles/MakerGear/M2_M3.svg | 1 + .../MakerGear/MAKERGEAR_M2_DUAL_thumbnail.png | Bin 0 -> 41714 bytes .../MakerGear/MAKERGEAR_M2_thumbnail.png | Bin 0 -> 52510 bytes .../MAKERGEAR_M3_DUPLICATION_thumbnail.png | Bin 0 -> 32512 bytes .../MakerGear/MAKERGEAR_M3_SE_thumbnail.png | Bin 0 -> 39835 bytes .../MakerGear/MAKERGEAR_M3_thumbnail.png | Bin 0 -> 38366 bytes .../MakerGear/MAKERGEAR_MICRO_thumbnail.png | Bin 0 -> 48460 bytes .../MakerGear/MAKERGEAR_U1_thumbnail.png | Bin 0 -> 47224 bytes resources/profiles/Print4Taste.idx | 2 + resources/profiles/Print4Taste.ini | 131 + resources/profiles/Print4Taste/MC2.0_bed.stl | Bin 0 -> 684 bytes .../profiles/Print4Taste/MC2.0_texture.svg | 165 + .../profiles/Print4Taste/MC2.0_thumbnail.png | Bin 0 -> 45346 bytes resources/profiles/PrusaResearch.idx | 6 +- resources/profiles/PrusaResearch.ini | 166 +- resources/profiles/PrusaResearch/mk4.svg | 200 +- resources/profiles/PrusaResearch/xl.svg | 244 +- resources/profiles/RatRig.idx | 2 + resources/profiles/RatRig.ini | 106 +- .../profiles/RatRig/VC3_300_thumbnail.png | Bin 37840 -> 34392 bytes .../profiles/RatRig/VC3_400_thumbnail.png | Bin 37840 -> 34392 bytes .../profiles/RatRig/VC3_500_thumbnail.png | Bin 37840 -> 34392 bytes .../profiles/RatRig/VMINION_thumbnail.png | Bin 31846 -> 29842 bytes resources/profiles/Rigid3D.idx | 3 + resources/profiles/Rigid3D.ini | 469 + .../profiles/Rigid3D/Mucit2_thumbnail.png | Bin 0 -> 54448 bytes .../profiles/Rigid3D/Mucit_thumbnail.png | Bin 0 -> 55165 bytes .../profiles/Rigid3D/Zero2_thumbnail.png | Bin 0 -> 60344 bytes .../profiles/Rigid3D/Zero3_thumbnail.png | Bin 0 -> 47050 bytes resources/profiles/Rigid3D/mucit2_bed.png | Bin 0 -> 10363 bytes resources/profiles/Rigid3D/mucit2_bed.stl | Bin 0 -> 763384 bytes resources/profiles/Rigid3D/mucit_bed.png | Bin 0 -> 9332 bytes resources/profiles/Rigid3D/mucit_bed.stl | Bin 0 -> 220684 bytes resources/profiles/Rigid3D/zero2_bed.png | Bin 0 -> 9707 bytes resources/profiles/Rigid3D/zero3_bed.png | Bin 0 -> 9708 bytes resources/profiles/Rigid3D/zero_bed.stl | Bin 0 -> 874084 bytes resources/profiles/Snapmaker.ini | 2 +- resources/profiles/Templates.idx | 3 + resources/profiles/Templates.ini | 2167 ++ resources/profiles/TriLAB.idx | 3 - resources/profiles/TriLAB.ini | 1340 +- resources/profiles/Ultimaker.idx | 2 + resources/profiles/Ultimaker.ini | 4 +- resources/profiles/Voron.idx | 2 + resources/profiles/Voron.ini | 54 +- .../Voron_v1_250_afterburner_thumbnail.png | Bin 64932 -> 39990 bytes .../Voron_v1_300_afterburner_thumbnail.png | Bin 64932 -> 39990 bytes .../Voron_v1_350_afterburner_thumbnail.png | Bin 64932 -> 39990 bytes resources/shaders/110/background.fs | 11 + resources/shaders/110/background.vs | 12 + .../shaders/{options_110.fs => 110/flat.fs} | 0 resources/shaders/110/flat.vs | 11 + resources/shaders/110/flat_clip.fs | 15 + resources/shaders/110/flat_clip.vs | 23 + resources/shaders/110/flat_texture.fs | 10 + resources/shaders/110/flat_texture.vs | 15 + resources/shaders/{ => 110}/gouraud.fs | 38 +- resources/shaders/110/gouraud.vs | 81 + resources/shaders/{ => 110}/gouraud_light.fs | 0 resources/shaders/110/gouraud_light.vs | 45 + resources/shaders/110/gouraud_light_clip.fs | 17 + resources/shaders/110/gouraud_light_clip.vs | 54 + .../{ => 110}/gouraud_light_instanced.fs | 0 .../shaders/110/gouraud_light_instanced.vs | 50 + resources/shaders/110/imgui.fs | 11 + resources/shaders/110/imgui.vs | 17 + resources/shaders/110/mm_contour.fs | 8 + resources/shaders/110/mm_contour.vs | 15 + resources/shaders/{ => 110}/mm_gouraud.fs | 123 +- resources/shaders/{ => 110}/mm_gouraud.vs | 11 +- resources/shaders/{ => 110}/printbed.fs | 14 +- resources/shaders/110/printbed.vs | 15 + resources/shaders/110/toolpaths_cog.fs | 19 + resources/shaders/110/toolpaths_cog.vs | 47 + .../{ => 110}/variable_layer_height.fs | 0 .../shaders/110/variable_layer_height.vs | 60 + resources/shaders/140/background.fs | 13 + resources/shaders/140/background.vs | 12 + resources/shaders/140/dashed_thick_lines.fs | 34 + resources/shaders/140/dashed_thick_lines.gs | 50 + resources/shaders/140/dashed_thick_lines.vs | 18 + resources/shaders/140/flat.fs | 10 + resources/shaders/140/flat.vs | 11 + resources/shaders/140/flat_clip.fs | 17 + resources/shaders/140/flat_clip.vs | 23 + resources/shaders/140/flat_texture.fs | 12 + resources/shaders/140/flat_texture.vs | 15 + resources/shaders/140/gouraud.fs | 91 + resources/shaders/140/gouraud.vs | 81 + resources/shaders/140/gouraud_light.fs | 14 + resources/shaders/140/gouraud_light.vs | 45 + resources/shaders/140/gouraud_light_clip.fs | 19 + resources/shaders/140/gouraud_light_clip.vs | 54 + .../shaders/140/gouraud_light_instanced.fs | 14 + .../shaders/140/gouraud_light_instanced.vs | 50 + resources/shaders/140/imgui.fs | 13 + resources/shaders/140/imgui.vs | 17 + resources/shaders/140/mm_contour.fs | 10 + resources/shaders/140/mm_contour.vs | 15 + resources/shaders/140/mm_gouraud.fs | 65 + resources/shaders/140/mm_gouraud.vs | 28 + resources/shaders/140/printbed.fs | 38 + resources/shaders/140/printbed.vs | 15 + resources/shaders/140/toolpaths_cog.fs | 21 + resources/shaders/140/toolpaths_cog.vs | 47 + .../shaders/140/variable_layer_height.fs | 43 + .../shaders/140/variable_layer_height.vs | 60 + resources/shaders/ES/background.fs | 13 + resources/shaders/ES/background.vs | 12 + resources/shaders/ES/dashed_lines.fs | 20 + resources/shaders/ES/dashed_lines.vs | 17 + resources/shaders/ES/flat.fs | 10 + resources/shaders/ES/flat.vs | 11 + resources/shaders/ES/flat_clip.fs | 17 + resources/shaders/ES/flat_clip.vs | 23 + resources/shaders/ES/flat_texture.fs | 12 + resources/shaders/ES/flat_texture.vs | 15 + resources/shaders/ES/gouraud.fs | 91 + resources/shaders/{ => ES}/gouraud.vs | 26 +- resources/shaders/ES/gouraud_light.fs | 14 + resources/shaders/{ => ES}/gouraud_light.vs | 17 +- resources/shaders/ES/gouraud_light_clip.fs | 19 + resources/shaders/ES/gouraud_light_clip.vs | 54 + .../shaders/ES/gouraud_light_instanced.fs | 12 + .../{ => ES}/gouraud_light_instanced.vs | 14 +- resources/shaders/ES/imgui.fs | 13 + resources/shaders/ES/imgui.vs | 17 + resources/shaders/ES/mm_contour.fs | 10 + resources/shaders/ES/mm_contour.vs | 15 + resources/shaders/ES/mm_gouraud.fs | 66 + resources/shaders/ES/mm_gouraud.vs | 28 + resources/shaders/ES/printbed.fs | 38 + resources/shaders/ES/printbed.vs | 15 + resources/shaders/ES/toolpaths_cog.fs | 21 + resources/shaders/ES/toolpaths_cog.vs | 47 + resources/shaders/ES/variable_layer_height.fs | 44 + .../shaders/{ => ES}/variable_layer_height.vs | 30 +- resources/shaders/ES/wireframe.fs | 19 + resources/shaders/ES/wireframe.vs | 20 + resources/shaders/mm_contour.fs | 11 - resources/shaders/mm_contour.vs | 6 - resources/shaders/options_110.vs | 22 - resources/shaders/options_120.fs | 22 - resources/shaders/options_120.vs | 22 - resources/shaders/printbed.vs | 14 - resources/shaders/toolpaths_lines.fs | 28 - resources/shaders/toolpaths_lines.vs | 9 - resources/shapes/sphere.png | Bin 13418 -> 15943 bytes resources/shapes/sphere.stl | Bin 61284 -> 64084 bytes .../shapes/universal wall mount hole.png | Bin 0 -> 6573 bytes .../shapes/universal wall mount hole.stl | Bin 0 -> 34584 bytes sandboxes/CMakeLists.txt | 3 +- sandboxes/aabb-evaluation/aabb-evaluation.cpp | 194 +- sandboxes/wx_gl_test/CMakeLists.txt | 24 + sandboxes/wx_gl_test/main.cpp | 221 + src/CMakeLists.txt | 34 +- src/PrusaSlicer.cpp | 115 +- src/PrusaSlicer_app_msvc.cpp | 54 +- src/Shiny/CMakeLists.txt | 25 - src/Shiny/Shiny.h | 36 - src/Shiny/ShinyConfig.h | 61 - src/Shiny/ShinyData.h | 102 - src/Shiny/ShinyMacros.h | 281 - src/Shiny/ShinyManager.c | 445 - src/Shiny/ShinyManager.h | 263 - src/Shiny/ShinyNode.c | 129 - src/Shiny/ShinyNode.h | 133 - src/Shiny/ShinyNodePool.c | 77 - src/Shiny/ShinyNodePool.h | 67 - src/Shiny/ShinyNodeState.c | 108 - src/Shiny/ShinyNodeState.h | 56 - src/Shiny/ShinyOutput.c | 189 - src/Shiny/ShinyOutput.h | 68 - src/Shiny/ShinyPrereqs.h | 138 - src/Shiny/ShinyTools.c | 116 - src/Shiny/ShinyTools.h | 57 - src/Shiny/ShinyVersion.h | 37 - src/Shiny/ShinyZone.c | 201 - src/Shiny/ShinyZone.h | 91 - src/admesh/shared.cpp | 25 + src/admesh/stl.h | 11 + src/clipper/CMakeLists.txt | 4 - src/clipper/clipper.cpp | 122 +- src/clipper/clipper.hpp | 7 +- src/glew/LICENSE.txt | 73 - src/glew/README.md | 260 - src/glew/include/GL/glew.h | 26427 ------------- src/glew/include/GL/glxew.h | 1831 - src/glew/include/GL/wglew.h | 1468 - src/glew/src/glew.c | 31949 ---------------- src/hints/HintsToPot.cpp | 2 +- src/imgui/CMakeLists.txt | 13 +- src/imgui/README.md | 19 + src/imgui/imconfig.h | 32 +- src/imgui/imgui_stdlib.cpp | 76 + src/imgui/imgui_stdlib.h | 22 + src/imgui/imstb_truetype.h | 3 +- .../include/libnest2d/geometry_traits.hpp | 8 +- .../include/libnest2d/geometry_traits_nfp.hpp | 459 +- src/libnest2d/include/libnest2d/nester.hpp | 18 + .../libnest2d/placers/bottomleftplacer.hpp | 5 +- .../include/libnest2d/placers/nfpplacer.hpp | 56 +- .../{SLA/IndexedMesh.cpp => AABBMesh.cpp} | 221 +- .../{SLA/IndexedMesh.hpp => AABBMesh.hpp} | 81 +- src/libslic3r/AABBTreeIndirect.hpp | 119 +- src/libslic3r/AABBTreeLines.hpp | 363 +- src/libslic3r/AStar.hpp | 193 + src/libslic3r/Algorithm/RegionExpansion.cpp | 539 + src/libslic3r/Algorithm/RegionExpansion.hpp | 114 + src/libslic3r/AnyPtr.hpp | 130 + src/libslic3r/AppConfig.cpp | 208 +- src/libslic3r/AppConfig.hpp | 54 +- .../Arachne/SkeletalTrapezoidation.cpp | 218 +- .../Arachne/SkeletalTrapezoidation.hpp | 7 +- .../Arachne/SkeletalTrapezoidationGraph.hpp | 5 + src/libslic3r/Arachne/utils/ExtrusionLine.cpp | 38 +- src/libslic3r/Arachne/utils/ExtrusionLine.hpp | 5 +- src/libslic3r/Arachne/utils/VoronoiUtils.cpp | 2 +- src/libslic3r/Arachne/utils/linearAlg2D.hpp | 6 +- src/libslic3r/Arrange.cpp | 60 +- src/libslic3r/Arrange.hpp | 22 +- src/libslic3r/{SLA => }/BoostAdapter.hpp | 76 +- src/libslic3r/BoundingBox.hpp | 106 +- src/libslic3r/BranchingTree/BranchingTree.cpp | 196 + src/libslic3r/BranchingTree/BranchingTree.hpp | 154 + src/libslic3r/BranchingTree/PointCloud.cpp | 186 + src/libslic3r/BranchingTree/PointCloud.hpp | 296 + src/libslic3r/BridgeDetector.hpp | 65 + src/libslic3r/Brim.cpp | 18 +- src/libslic3r/BuildVolume.cpp | 4 +- src/libslic3r/BuildVolume.hpp | 4 + src/libslic3r/CMakeLists.txt | 112 +- src/libslic3r/CSGMesh/CSGMesh.hpp | 86 + src/libslic3r/CSGMesh/CSGMeshCopy.hpp | 80 + src/libslic3r/CSGMesh/ModelToCSGMesh.hpp | 88 + .../CSGMesh/PerformCSGMeshBooleans.hpp | 204 + src/libslic3r/CSGMesh/SliceCSGMesh.hpp | 131 + src/libslic3r/CSGMesh/TriangleMeshAdapter.hpp | 95 + src/libslic3r/CSGMesh/VoxelizeCSGMesh.hpp | 116 + src/libslic3r/ClipperUtils.cpp | 165 +- src/libslic3r/ClipperUtils.hpp | 56 +- src/libslic3r/ClipperZUtils.hpp | 143 + src/libslic3r/Color.cpp | 408 + src/libslic3r/Color.hpp | 192 + src/libslic3r/Config.cpp | 75 +- src/libslic3r/Config.hpp | 375 +- src/libslic3r/CustomGCode.cpp | 2 +- src/libslic3r/CustomGCode.hpp | 2 + src/libslic3r/CutSurface.cpp | 4052 ++ src/libslic3r/CutSurface.hpp | 74 + src/libslic3r/EdgeGrid.cpp | 5 - src/libslic3r/EdgeGrid.hpp | 5 +- src/libslic3r/Emboss.cpp | 1819 + src/libslic3r/Emboss.hpp | 366 + src/libslic3r/ExPolygon.cpp | 118 +- src/libslic3r/ExPolygon.hpp | 194 +- src/libslic3r/ExPolygonCollection.cpp | 136 - src/libslic3r/ExPolygonCollection.hpp | 41 - src/libslic3r/ExPolygonsIndex.cpp | 82 + src/libslic3r/ExPolygonsIndex.hpp | 74 + src/libslic3r/Execution/Execution.hpp | 17 +- src/libslic3r/Execution/ExecutionTBB.hpp | 4 +- src/libslic3r/Extruder.cpp | 49 +- src/libslic3r/Extruder.hpp | 55 +- src/libslic3r/ExtrusionEntity.cpp | 79 +- src/libslic3r/ExtrusionEntity.hpp | 108 +- src/libslic3r/ExtrusionEntityCollection.cpp | 9 +- src/libslic3r/ExtrusionEntityCollection.hpp | 31 +- src/libslic3r/ExtrusionRole.cpp | 91 + src/libslic3r/ExtrusionRole.hpp | 133 + src/libslic3r/Fill/Fill.cpp | 381 +- src/libslic3r/Fill/FillAdaptive.cpp | 4 +- src/libslic3r/Fill/FillBase.cpp | 8 +- src/libslic3r/Fill/FillBase.hpp | 6 +- src/libslic3r/Fill/FillConcentric.cpp | 12 +- src/libslic3r/Fill/FillConcentric.hpp | 5 - src/libslic3r/Fill/FillEnsuring.cpp | 82 + src/libslic3r/Fill/FillEnsuring.hpp | 30 + src/libslic3r/Fill/FillLightning.cpp | 2 +- src/libslic3r/Fill/FillLightning.hpp | 1 + src/libslic3r/Fill/FillPlanePath.cpp | 209 +- src/libslic3r/Fill/FillPlanePath.hpp | 38 +- src/libslic3r/Fill/FillRectilinear.cpp | 4 +- src/libslic3r/Fill/FillRectilinear.hpp | 1 + src/libslic3r/Fill/Lightning/Generator.cpp | 4 +- src/libslic3r/Fill/Lightning/TreeNode.cpp | 14 +- src/libslic3r/Flow.cpp | 5 +- src/libslic3r/Flow.hpp | 2 +- src/libslic3r/Format/3mf.cpp | 753 +- src/libslic3r/Format/AMF.cpp | 114 +- src/libslic3r/Format/SL1.cpp | 610 +- src/libslic3r/Format/SL1.hpp | 94 +- src/libslic3r/Format/SL1_SVG.cpp | 317 + src/libslic3r/Format/SL1_SVG.hpp | 48 + src/libslic3r/Format/SLAArchiveReader.cpp | 179 + src/libslic3r/Format/SLAArchiveReader.hpp | 85 + src/libslic3r/Format/SLAArchiveWriter.cpp | 78 + src/libslic3r/Format/SLAArchiveWriter.hpp | 65 + src/libslic3r/Format/ZipperArchiveImport.cpp | 136 + src/libslic3r/Format/ZipperArchiveImport.hpp | 54 + src/libslic3r/Format/pwmx.cpp | 564 + src/libslic3r/Format/pwmx.hpp | 37 + src/libslic3r/GCode.cpp | 1780 +- src/libslic3r/GCode.hpp | 223 +- .../GCode/AvoidCrossingPerimeters.cpp | 99 +- .../GCode/AvoidCrossingPerimeters.hpp | 5 +- src/libslic3r/GCode/CoolingBuffer.cpp | 115 +- src/libslic3r/GCode/CoolingBuffer.hpp | 2 + src/libslic3r/GCode/ExtrusionProcessor.hpp | 321 + src/libslic3r/GCode/GCodeProcessor.cpp | 7839 ++-- src/libslic3r/GCode/GCodeProcessor.hpp | 1553 +- src/libslic3r/GCode/PostProcessor.cpp | 9 +- src/libslic3r/GCode/PressureEqualizer.cpp | 59 +- src/libslic3r/GCode/PressureEqualizer.hpp | 8 +- src/libslic3r/GCode/PrintExtents.cpp | 4 +- .../GCode/RetractWhenCrossingPerimeters.cpp | 54 + .../GCode/RetractWhenCrossingPerimeters.hpp | 32 + src/libslic3r/GCode/SeamPlacer.cpp | 175 +- src/libslic3r/GCode/SeamPlacer.hpp | 16 +- src/libslic3r/GCode/ToolOrdering.cpp | 156 +- src/libslic3r/GCode/ToolOrdering.hpp | 61 +- src/libslic3r/GCode/WipeTower.cpp | 272 +- src/libslic3r/GCode/WipeTower.hpp | 12 +- src/libslic3r/GCodeReader.cpp | 75 +- src/libslic3r/GCodeReader.hpp | 19 + src/libslic3r/GCodeWriter.cpp | 140 +- src/libslic3r/GCodeWriter.hpp | 38 +- src/libslic3r/Geometry.cpp | 536 +- src/libslic3r/Geometry.hpp | 207 +- src/libslic3r/Geometry/Circle.cpp | 4 +- src/libslic3r/Geometry/Circle.hpp | 2 +- src/libslic3r/Geometry/ConvexHull.cpp | 34 +- src/libslic3r/Geometry/ConvexHull.hpp | 8 + src/libslic3r/Geometry/MedialAxis.cpp | 257 +- src/libslic3r/Geometry/MedialAxis.hpp | 39 +- src/libslic3r/Geometry/VoronoiOffset.hpp | 2 +- src/libslic3r/Geometry/VoronoiUtilsCgal.cpp | 216 +- src/libslic3r/Geometry/VoronoiUtilsCgal.hpp | 3 +- src/libslic3r/I18N.hpp | 19 + src/libslic3r/Int128.hpp | 5 + src/libslic3r/IntersectionPoints.cpp | 170 + src/libslic3r/IntersectionPoints.hpp | 16 + src/libslic3r/JumpPointSearch.cpp | 369 + src/libslic3r/JumpPointSearch.hpp | 38 + src/libslic3r/Layer.cpp | 874 +- src/libslic3r/Layer.hpp | 315 +- src/libslic3r/LayerRegion.cpp | 518 +- src/libslic3r/Line.cpp | 23 +- src/libslic3r/Line.hpp | 33 +- src/libslic3r/LocalesUtils.cpp | 16 +- src/libslic3r/LocalesUtils.hpp | 1 + src/libslic3r/Measure.cpp | 1241 + src/libslic3r/Measure.hpp | 196 + src/libslic3r/MeasureUtils.hpp | 386 + src/libslic3r/MeshBoolean.cpp | 52 +- src/libslic3r/MeshBoolean.hpp | 20 +- src/libslic3r/MeshNormals.cpp | 163 + src/libslic3r/MeshNormals.hpp | 52 + src/libslic3r/MeshSplitImpl.hpp | 18 +- src/libslic3r/Model.cpp | 906 +- src/libslic3r/Model.hpp | 335 +- src/libslic3r/MultiMaterialSegmentation.cpp | 8 +- src/libslic3r/MultiPoint.cpp | 67 - src/libslic3r/MultiPoint.hpp | 12 +- src/libslic3r/MutablePriorityQueue.hpp | 76 +- src/libslic3r/NSVGUtils.cpp | 85 + src/libslic3r/NSVGUtils.hpp | 34 + src/libslic3r/ObjectID.hpp | 61 + src/libslic3r/OpenVDBUtils.cpp | 273 +- src/libslic3r/OpenVDBUtils.hpp | 90 +- src/libslic3r/OpenVDBUtilsLegacy.hpp | 100 + .../Optimize/BruteforceOptimizer.hpp | 4 +- src/libslic3r/Optimize/NLoptOptimizer.hpp | 342 +- src/libslic3r/Optimize/Optimizer.hpp | 30 +- src/libslic3r/PerimeterGenerator.cpp | 1473 +- src/libslic3r/PerimeterGenerator.hpp | 128 +- src/libslic3r/PlaceholderParser.cpp | 1681 +- src/libslic3r/PlaceholderParser.hpp | 14 +- src/libslic3r/Point.cpp | 177 +- src/libslic3r/Point.hpp | 1173 +- src/libslic3r/PointGrid.hpp | 74 + src/libslic3r/Polygon.cpp | 270 +- src/libslic3r/Polygon.hpp | 95 +- src/libslic3r/Polyline.cpp | 87 +- src/libslic3r/Polyline.hpp | 76 +- src/libslic3r/Preset.cpp | 236 +- src/libslic3r/Preset.hpp | 27 +- src/libslic3r/PresetBundle.cpp | 109 +- src/libslic3r/PresetBundle.hpp | 20 +- src/libslic3r/PrincipalComponents2D.cpp | 140 + src/libslic3r/PrincipalComponents2D.hpp | 24 + src/libslic3r/Print.cpp | 411 +- src/libslic3r/Print.hpp | 119 +- src/libslic3r/PrintApply.cpp | 2922 +- src/libslic3r/PrintBase.cpp | 10 +- src/libslic3r/PrintBase.hpp | 295 +- src/libslic3r/PrintConfig.cpp | 1415 +- src/libslic3r/PrintConfig.hpp | 150 +- src/libslic3r/PrintObject.cpp | 1774 +- src/libslic3r/PrintObjectSlice.cpp | 90 +- src/libslic3r/QuadricEdgeCollapse.cpp | 4 +- src/libslic3r/QuadricEdgeCollapse.hpp | 8 + src/libslic3r/SLA/AGGRaster.hpp | 29 +- src/libslic3r/SLA/BranchingTreeSLA.cpp | 427 + src/libslic3r/SLA/BranchingTreeSLA.hpp | 15 + src/libslic3r/SLA/Clustering.cpp | 2 +- src/libslic3r/SLA/Concurrency.hpp | 70 - src/libslic3r/SLA/DefaultSupportTree.cpp | 983 + ...eBuildsteps.hpp => DefaultSupportTree.hpp} | 223 +- src/libslic3r/SLA/Hollowing.cpp | 584 +- src/libslic3r/SLA/Hollowing.hpp | 129 +- src/libslic3r/SLA/Pad.cpp | 9 +- src/libslic3r/SLA/RasterBase.cpp | 15 +- src/libslic3r/SLA/RasterBase.hpp | 63 +- src/libslic3r/SLA/ReprojectPointsOnMesh.hpp | 6 +- src/libslic3r/SLA/Rotfinder.cpp | 34 +- src/libslic3r/SLA/SpatIndex.cpp | 2 +- src/libslic3r/SLA/SupportPoint.hpp | 9 +- src/libslic3r/SLA/SupportPointGenerator.cpp | 37 +- src/libslic3r/SLA/SupportPointGenerator.hpp | 13 +- src/libslic3r/SLA/SupportTree.cpp | 129 +- src/libslic3r/SLA/SupportTree.hpp | 123 +- src/libslic3r/SLA/SupportTreeBuilder.cpp | 71 +- src/libslic3r/SLA/SupportTreeBuilder.hpp | 159 +- src/libslic3r/SLA/SupportTreeBuildsteps.cpp | 1277 - src/libslic3r/SLA/SupportTreeMesher.cpp | 131 +- src/libslic3r/SLA/SupportTreeMesher.hpp | 76 +- src/libslic3r/SLA/SupportTreeStrategies.hpp | 13 + src/libslic3r/SLA/SupportTreeUtils.hpp | 945 + src/libslic3r/SLA/SupportTreeUtilsLegacy.hpp | 301 + src/libslic3r/SLAPrint.cpp | 440 +- src/libslic3r/SLAPrint.hpp | 193 +- src/libslic3r/SLAPrintSteps.cpp | 852 +- src/libslic3r/SLAPrintSteps.hpp | 39 +- src/libslic3r/SVG.cpp | 18 +- src/libslic3r/SVG.hpp | 6 +- src/libslic3r/Semver.hpp | 28 +- src/libslic3r/ShortestPath.cpp | 23 +- src/libslic3r/ShortestPath.hpp | 4 + src/libslic3r/SlicesToTriangleMesh.cpp | 21 +- src/libslic3r/Slicing.cpp | 95 +- src/libslic3r/Slicing.hpp | 17 +- src/libslic3r/SupportMaterial.cpp | 1457 +- src/libslic3r/SupportMaterial.hpp | 402 +- src/libslic3r/SupportSpotsGenerator.cpp | 1268 + src/libslic3r/SupportSpotsGenerator.hpp | 161 + src/libslic3r/Surface.hpp | 67 +- src/libslic3r/SurfaceCollection.cpp | 84 +- src/libslic3r/SurfaceCollection.hpp | 21 +- src/libslic3r/SurfaceMesh.hpp | 163 + src/libslic3r/Technologies.hpp | 39 +- src/libslic3r/TextConfiguration.hpp | 241 + src/libslic3r/Thread.cpp | 48 +- src/libslic3r/Thread.hpp | 33 + src/libslic3r/Timer.cpp | 12 + src/libslic3r/Timer.hpp | 31 + src/libslic3r/TreeModelVolumes.cpp | 933 + src/libslic3r/TreeModelVolumes.hpp | 711 + src/libslic3r/TreeSupport.cpp | 4518 +++ src/libslic3r/TreeSupport.hpp | 538 + src/libslic3r/TriangleMesh.cpp | 264 +- src/libslic3r/TriangleMesh.hpp | 53 +- src/libslic3r/TriangleMeshSlicer.cpp | 205 +- src/libslic3r/TriangleMeshSlicer.hpp | 2 +- src/libslic3r/TriangleSelector.cpp | 4 +- src/libslic3r/TriangleSelectorWrapper.cpp | 45 + src/libslic3r/TriangleSelectorWrapper.hpp | 31 + src/libslic3r/TriangulateWall.cpp | 159 - src/libslic3r/Triangulation.cpp | 328 + src/libslic3r/Triangulation.hpp | 72 + src/libslic3r/Utils.hpp | 50 +- src/libslic3r/Zipper.cpp | 6 +- src/libslic3r/enum_bitmask.hpp | 23 +- src/libslic3r/libslic3r.h | 90 +- src/libslic3r/miniz_extension.cpp | 68 +- src/libslic3r/pchheader.hpp | 8 +- src/libslic3r/utils.cpp | 103 +- src/miniz/miniz.c | 34 + src/miniz/miniz.h | 3 + src/nanosvg/README-prusa.txt | 1 - src/nanosvg/nanosvg.h | 2979 -- src/nanosvg/nanosvgrast.h | 1452 - src/occt_wrapper/CMakeLists.txt | 2 + .../msw/PrusaSlicer-gcodeviewer.rc.in | 2 +- src/platform/msw/PrusaSlicer.rc.in | 2 +- src/platform/osx/Info.plist.in | 15 +- src/qhull/Announce.txt | 47 - src/qhull/CMakeLists.txt | 147 - src/qhull/COPYING.txt | 38 - src/qhull/README.txt | 623 - src/qhull/REGISTER.txt | 32 - src/qhull/html/index.htm | 935 - .../html/normal_voronoi_knauss_oesterle.jpg | Bin 23924 -> 0 bytes src/qhull/html/qconvex.htm | 630 - src/qhull/html/qdelau_f.htm | 416 - src/qhull/html/qdelaun.htm | 628 - src/qhull/html/qh--4d.gif | Bin 4372 -> 0 bytes src/qhull/html/qh--cone.gif | Bin 2946 -> 0 bytes src/qhull/html/qh--dt.gif | Bin 3772 -> 0 bytes src/qhull/html/qh--geom.gif | Bin 318 -> 0 bytes src/qhull/html/qh--half.gif | Bin 2537 -> 0 bytes src/qhull/html/qh--rand.gif | Bin 3875 -> 0 bytes src/qhull/html/qh-code.htm | 1062 - src/qhull/html/qh-eg.htm | 693 - src/qhull/html/qh-faq.htm | 1547 - src/qhull/html/qh-get.htm | 106 - src/qhull/html/qh-impre.htm | 826 - src/qhull/html/qh-optc.htm | 292 - src/qhull/html/qh-optf.htm | 736 - src/qhull/html/qh-optg.htm | 274 - src/qhull/html/qh-opto.htm | 353 - src/qhull/html/qh-optp.htm | 253 - src/qhull/html/qh-optq.htm | 731 - src/qhull/html/qh-optt.htm | 278 - src/qhull/html/qh-quick.htm | 495 - src/qhull/html/qhalf.htm | 626 - src/qhull/html/qhull-cpp.xml | 214 - src/qhull/html/qhull.htm | 473 - src/qhull/html/qhull.man | 1008 - src/qhull/html/qhull.txt | 1263 - src/qhull/html/qvoron_f.htm | 396 - src/qhull/html/qvoronoi.htm | 667 - src/qhull/html/rbox.htm | 277 - src/qhull/html/rbox.man | 176 - src/qhull/html/rbox.txt | 195 - src/qhull/index.htm | 284 - src/qhull/origCMakeLists.txt | 426 - src/qhull/src/Changes.txt | 2129 - src/qhull/src/libqhull/DEPRECATED.txt | 29 - src/qhull/src/libqhull/Makefile | 240 - src/qhull/src/libqhull/Mborland | 206 - src/qhull/src/libqhull/geom.c | 1234 - src/qhull/src/libqhull/geom.h | 176 - src/qhull/src/libqhull/geom2.c | 2094 - src/qhull/src/libqhull/global.c | 2217 -- src/qhull/src/libqhull/index.htm | 264 - src/qhull/src/libqhull/io.c | 4062 -- src/qhull/src/libqhull/io.h | 159 - src/qhull/src/libqhull/libqhull.c | 1403 - src/qhull/src/libqhull/libqhull.h | 1140 - src/qhull/src/libqhull/libqhull.pro | 67 - src/qhull/src/libqhull/mem.c | 576 - src/qhull/src/libqhull/mem.h | 222 - src/qhull/src/libqhull/merge.c | 3628 -- src/qhull/src/libqhull/merge.h | 178 - src/qhull/src/libqhull/poly.c | 1205 - src/qhull/src/libqhull/poly.h | 296 - src/qhull/src/libqhull/poly2.c | 3222 -- src/qhull/src/libqhull/qh-geom.htm | 295 - src/qhull/src/libqhull/qh-globa.htm | 165 - src/qhull/src/libqhull/qh-io.htm | 305 - src/qhull/src/libqhull/qh-mem.htm | 145 - src/qhull/src/libqhull/qh-merge.htm | 366 - src/qhull/src/libqhull/qh-poly.htm | 485 - src/qhull/src/libqhull/qh-qhull.htm | 279 - src/qhull/src/libqhull/qh-set.htm | 308 - src/qhull/src/libqhull/qh-stat.htm | 163 - src/qhull/src/libqhull/qh-user.htm | 271 - src/qhull/src/libqhull/qhull-exports.def | 417 - src/qhull/src/libqhull/qhull_a.h | 150 - src/qhull/src/libqhull/qhull_p-exports.def | 418 - src/qhull/src/libqhull/qset.c | 1340 - src/qhull/src/libqhull/qset.h | 490 - src/qhull/src/libqhull/random.c | 245 - src/qhull/src/libqhull/random.h | 34 - src/qhull/src/libqhull/rboxlib.c | 870 - src/qhull/src/libqhull/stat.c | 717 - src/qhull/src/libqhull/stat.h | 543 - src/qhull/src/libqhull/user.c | 538 - src/qhull/src/libqhull/user.h | 909 - src/qhull/src/libqhull/usermem.c | 94 - src/qhull/src/libqhull/userprintf.c | 66 - src/qhull/src/libqhull/userprintf_rbox.c | 53 - src/qhull/src/libqhull_r/Makefile | 240 - src/qhull/src/libqhull_r/geom2_r.c | 2096 - src/qhull/src/libqhull_r/geom_r.c | 1234 - src/qhull/src/libqhull_r/geom_r.h | 184 - src/qhull/src/libqhull_r/global_r.c | 2100 - src/qhull/src/libqhull_r/index.htm | 266 - src/qhull/src/libqhull_r/io_r.c | 4062 -- src/qhull/src/libqhull_r/io_r.h | 167 - src/qhull/src/libqhull_r/libqhull_r.c | 1403 - src/qhull/src/libqhull_r/libqhull_r.h | 1134 - src/qhull/src/libqhull_r/libqhull_r.pro | 67 - src/qhull/src/libqhull_r/mem_r.c | 562 - src/qhull/src/libqhull_r/mem_r.h | 234 - src/qhull/src/libqhull_r/merge_r.c | 3627 -- src/qhull/src/libqhull_r/merge_r.h | 186 - src/qhull/src/libqhull_r/poly2_r.c | 3222 -- src/qhull/src/libqhull_r/poly_r.c | 1205 - src/qhull/src/libqhull_r/poly_r.h | 303 - src/qhull/src/libqhull_r/qh-geom_r.htm | 295 - src/qhull/src/libqhull_r/qh-globa_r.htm | 163 - src/qhull/src/libqhull_r/qh-io_r.htm | 305 - src/qhull/src/libqhull_r/qh-mem_r.htm | 145 - src/qhull/src/libqhull_r/qh-merge_r.htm | 366 - src/qhull/src/libqhull_r/qh-poly_r.htm | 485 - src/qhull/src/libqhull_r/qh-qhull_r.htm | 279 - src/qhull/src/libqhull_r/qh-set_r.htm | 308 - src/qhull/src/libqhull_r/qh-stat_r.htm | 161 - src/qhull/src/libqhull_r/qh-user_r.htm | 271 - src/qhull/src/libqhull_r/qhull_r-exports.def | 404 - src/qhull/src/libqhull_r/qhull_ra.h | 158 - src/qhull/src/libqhull_r/qset_r.c | 1340 - src/qhull/src/libqhull_r/qset_r.h | 502 - src/qhull/src/libqhull_r/random_r.c | 247 - src/qhull/src/libqhull_r/random_r.h | 41 - src/qhull/src/libqhull_r/rboxlib_r.c | 842 - src/qhull/src/libqhull_r/stat_r.c | 682 - src/qhull/src/libqhull_r/stat_r.h | 533 - src/qhull/src/libqhull_r/user_r.c | 527 - src/qhull/src/libqhull_r/user_r.h | 882 - src/qhull/src/libqhull_r/usermem_r.c | 94 - src/qhull/src/libqhull_r/userprintf_r.c | 65 - src/qhull/src/libqhull_r/userprintf_rbox_r.c | 53 - src/qhull/src/libqhullcpp/Coordinates.cpp | 198 - src/qhull/src/libqhullcpp/Coordinates.h | 303 - .../src/libqhullcpp/PointCoordinates.cpp | 348 - src/qhull/src/libqhullcpp/PointCoordinates.h | 161 - src/qhull/src/libqhullcpp/Qhull.cpp | 352 - src/qhull/src/libqhullcpp/Qhull.h | 132 - src/qhull/src/libqhullcpp/QhullError.h | 62 - src/qhull/src/libqhullcpp/QhullFacet.cpp | 519 - src/qhull/src/libqhullcpp/QhullFacet.h | 151 - src/qhull/src/libqhullcpp/QhullFacetList.cpp | 174 - src/qhull/src/libqhullcpp/QhullFacetList.h | 106 - src/qhull/src/libqhullcpp/QhullFacetSet.cpp | 147 - src/qhull/src/libqhullcpp/QhullFacetSet.h | 97 - src/qhull/src/libqhullcpp/QhullHyperplane.cpp | 187 - src/qhull/src/libqhullcpp/QhullHyperplane.h | 123 - src/qhull/src/libqhullcpp/QhullIterator.h | 173 - src/qhull/src/libqhullcpp/QhullLinkedList.h | 388 - src/qhull/src/libqhullcpp/QhullPoint.cpp | 203 - src/qhull/src/libqhullcpp/QhullPoint.h | 136 - src/qhull/src/libqhullcpp/QhullPointSet.cpp | 62 - src/qhull/src/libqhullcpp/QhullPointSet.h | 77 - src/qhull/src/libqhullcpp/QhullPoints.cpp | 320 - src/qhull/src/libqhullcpp/QhullPoints.h | 266 - src/qhull/src/libqhullcpp/QhullQh.cpp | 237 - src/qhull/src/libqhullcpp/QhullQh.h | 110 - src/qhull/src/libqhullcpp/QhullRidge.cpp | 124 - src/qhull/src/libqhullcpp/QhullRidge.h | 112 - src/qhull/src/libqhullcpp/QhullSet.cpp | 62 - src/qhull/src/libqhullcpp/QhullSet.h | 462 - src/qhull/src/libqhullcpp/QhullSets.h | 27 - src/qhull/src/libqhullcpp/QhullStat.cpp | 42 - src/qhull/src/libqhullcpp/QhullStat.h | 49 - src/qhull/src/libqhullcpp/QhullVertex.cpp | 112 - src/qhull/src/libqhullcpp/QhullVertex.h | 104 - src/qhull/src/libqhullcpp/QhullVertexSet.cpp | 161 - src/qhull/src/libqhullcpp/QhullVertexSet.h | 86 - src/qhull/src/libqhullcpp/RboxPoints.cpp | 224 - src/qhull/src/libqhullcpp/RboxPoints.h | 69 - src/qhull/src/libqhullcpp/RoadError.cpp | 158 - src/qhull/src/libqhullcpp/RoadError.h | 88 - src/qhull/src/libqhullcpp/RoadLogEvent.cpp | 122 - src/qhull/src/libqhullcpp/RoadLogEvent.h | 77 - src/qhull/src/libqhullcpp/functionObjects.h | 67 - src/qhull/src/libqhullcpp/libqhullcpp.pro | 71 - src/qhull/src/libqhullcpp/qt-qhull.cpp | 130 - src/qhull/src/libqhullcpp/usermem_r-cpp.cpp | 93 - .../src/libqhullstatic/libqhullstatic.pro | 19 - .../src/libqhullstatic_r/libqhullstatic_r.pro | 21 - src/qhull/src/qconvex/qconvex.c | 326 - src/qhull/src/qconvex/qconvex.pro | 9 - src/qhull/src/qconvex/qconvex_r.c | 328 - src/qhull/src/qdelaunay/qdelaun.c | 315 - src/qhull/src/qdelaunay/qdelaun_r.c | 317 - src/qhull/src/qdelaunay/qdelaunay.pro | 9 - src/qhull/src/qhalf/qhalf.c | 316 - src/qhull/src/qhalf/qhalf.pro | 9 - src/qhull/src/qhalf/qhalf_r.c | 318 - src/qhull/src/qhull-all.pro | 94 - src/qhull/src/qhull-app-c.pri | 24 - src/qhull/src/qhull-app-c_r.pri | 26 - src/qhull/src/qhull-app-cpp.pri | 23 - src/qhull/src/qhull-app-shared.pri | 27 - src/qhull/src/qhull-app-shared_r.pri | 29 - src/qhull/src/qhull-libqhull-src.pri | 39 - src/qhull/src/qhull-libqhull-src_r.pri | 39 - src/qhull/src/qhull-warn.pri | 57 - src/qhull/src/qhull/qhull.pro | 9 - src/qhull/src/qhull/unix.c | 372 - src/qhull/src/qhull/unix_r.c | 374 - src/qhull/src/qhulltest/Coordinates_test.cpp | 539 - .../src/qhulltest/PointCoordinates_test.cpp | 478 - .../src/qhulltest/QhullFacetList_test.cpp | 196 - .../src/qhulltest/QhullFacetSet_test.cpp | 153 - src/qhull/src/qhulltest/QhullFacet_test.cpp | 283 - .../src/qhulltest/QhullHyperplane_test.cpp | 429 - .../src/qhulltest/QhullLinkedList_test.cpp | 330 - .../src/qhulltest/QhullPointSet_test.cpp | 378 - src/qhull/src/qhulltest/QhullPoint_test.cpp | 437 - src/qhull/src/qhulltest/QhullPoints_test.cpp | 561 - src/qhull/src/qhulltest/QhullRidge_test.cpp | 159 - src/qhull/src/qhulltest/QhullSet_test.cpp | 434 - .../src/qhulltest/QhullVertexSet_test.cpp | 152 - src/qhull/src/qhulltest/QhullVertex_test.cpp | 184 - src/qhull/src/qhulltest/Qhull_test.cpp | 360 - src/qhull/src/qhulltest/RboxPoints_test.cpp | 215 - src/qhull/src/qhulltest/RoadTest.cpp | 94 - src/qhull/src/qhulltest/RoadTest.h | 102 - src/qhull/src/qhulltest/qhulltest.cpp | 94 - src/qhull/src/qhulltest/qhulltest.pro | 36 - src/qhull/src/qvoronoi/qvoronoi.c | 303 - src/qhull/src/qvoronoi/qvoronoi.pro | 9 - src/qhull/src/qvoronoi/qvoronoi_r.c | 305 - src/qhull/src/rbox/rbox.c | 88 - src/qhull/src/rbox/rbox.pro | 9 - src/qhull/src/rbox/rbox_r.c | 78 - src/qhull/src/testqset/testqset.c | 891 - src/qhull/src/testqset/testqset.pro | 30 - src/qhull/src/testqset_r/testqset_r.c | 890 - src/qhull/src/testqset_r/testqset_r.pro | 30 - src/qhull/src/user_eg/user_eg.c | 330 - src/qhull/src/user_eg/user_eg.pro | 11 - src/qhull/src/user_eg/user_eg_r.c | 326 - src/qhull/src/user_eg2/user_eg2.c | 746 - src/qhull/src/user_eg2/user_eg2.pro | 11 - src/qhull/src/user_eg2/user_eg2_r.c | 742 - src/qhull/src/user_eg3/user_eg3.pro | 12 - src/qhull/src/user_eg3/user_eg3_r.cpp | 162 - src/slic3r/CMakeLists.txt | 73 +- src/slic3r/Config/Version.cpp | 75 +- src/slic3r/GUI/2DBed.cpp | 16 +- src/slic3r/GUI/3DBed.cpp | 547 +- src/slic3r/GUI/3DBed.hpp | 95 +- src/slic3r/GUI/3DScene.cpp | 1603 +- src/slic3r/GUI/3DScene.hpp | 407 +- src/slic3r/GUI/AboutDialog.cpp | 63 +- src/slic3r/GUI/BackgroundSlicingProcess.cpp | 73 +- src/slic3r/GUI/BackgroundSlicingProcess.hpp | 9 +- src/slic3r/GUI/BedShapeDialog.cpp | 9 +- src/slic3r/GUI/BedShapeDialog.hpp | 5 +- src/slic3r/GUI/BitmapCache.cpp | 521 +- src/slic3r/GUI/BitmapCache.hpp | 33 +- src/slic3r/GUI/BitmapComboBox.cpp | 90 +- src/slic3r/GUI/BitmapComboBox.hpp | 17 +- src/slic3r/GUI/BonjourDialog.cpp | 51 +- src/slic3r/GUI/BonjourDialog.hpp | 22 +- src/slic3r/GUI/ButtonsDescription.cpp | 170 +- src/slic3r/GUI/ButtonsDescription.hpp | 65 +- src/slic3r/GUI/Camera.cpp | 139 +- src/slic3r/GUI/Camera.hpp | 12 +- src/slic3r/GUI/CameraUtils.cpp | 131 + src/slic3r/GUI/CameraUtils.hpp | 69 + src/slic3r/GUI/ConfigManipulation.cpp | 179 +- src/slic3r/GUI/ConfigSnapshotDialog.cpp | 10 +- src/slic3r/GUI/ConfigWizard.cpp | 976 +- src/slic3r/GUI/ConfigWizard.hpp | 32 + src/slic3r/GUI/ConfigWizard_private.hpp | 215 +- src/slic3r/GUI/CoordAxes.cpp | 69 + src/slic3r/GUI/CoordAxes.hpp | 57 + src/slic3r/GUI/DesktopIntegrationDialog.cpp | 291 +- src/slic3r/GUI/DesktopIntegrationDialog.hpp | 6 + src/slic3r/GUI/DoubleSlider.cpp | 329 +- src/slic3r/GUI/DoubleSlider.hpp | 31 +- src/slic3r/GUI/DoubleSlider_Utils.hpp | 191 - src/slic3r/GUI/Downloader.cpp | 247 + src/slic3r/GUI/Downloader.hpp | 99 + src/slic3r/GUI/DownloaderFileGet.cpp | 391 + src/slic3r/GUI/DownloaderFileGet.hpp | 45 + src/slic3r/GUI/ExtraRenderers.cpp | 25 +- src/slic3r/GUI/ExtruderSequenceDialog.cpp | 3 - src/slic3r/GUI/Field.cpp | 316 +- src/slic3r/GUI/Field.hpp | 163 +- src/slic3r/GUI/FileArchiveDialog.cpp | 387 + src/slic3r/GUI/FileArchiveDialog.hpp | 123 + src/slic3r/GUI/FirmwareDialog.cpp | 2 +- src/slic3r/GUI/GCodeViewer.cpp | 8221 ++-- src/slic3r/GUI/GCodeViewer.hpp | 1664 +- src/slic3r/GUI/GLCanvas3D.cpp | 14132 +++---- src/slic3r/GUI/GLCanvas3D.hpp | 173 +- src/slic3r/GUI/GLModel.cpp | 1840 +- src/slic3r/GUI/GLModel.hpp | 272 +- src/slic3r/GUI/GLSelectionRectangle.cpp | 189 +- src/slic3r/GUI/GLSelectionRectangle.hpp | 34 +- src/slic3r/GUI/GLShader.cpp | 181 +- src/slic3r/GUI/GLShader.hpp | 68 +- src/slic3r/GUI/GLShadersManager.cpp | 53 +- src/slic3r/GUI/GLTexture.cpp | 112 +- src/slic3r/GUI/GLTexture.hpp | 10 +- src/slic3r/GUI/GLToolbar.cpp | 609 +- src/slic3r/GUI/GLToolbar.hpp | 9 +- src/slic3r/GUI/GUI.cpp | 205 +- src/slic3r/GUI/GUI.hpp | 19 + src/slic3r/GUI/GUI_App.cpp | 845 +- src/slic3r/GUI/GUI_App.hpp | 49 +- src/slic3r/GUI/GUI_Factories.cpp | 327 +- src/slic3r/GUI/GUI_Factories.hpp | 22 +- src/slic3r/GUI/GUI_Geometry.cpp | 9 + src/slic3r/GUI/GUI_Geometry.hpp | 78 + src/slic3r/GUI/GUI_Init.cpp | 13 +- src/slic3r/GUI/GUI_Init.hpp | 18 + src/slic3r/GUI/GUI_ObjectLayers.cpp | 74 +- src/slic3r/GUI/GUI_ObjectList.cpp | 977 +- src/slic3r/GUI/GUI_ObjectList.hpp | 40 +- src/slic3r/GUI/GUI_ObjectManipulation.cpp | 754 +- src/slic3r/GUI/GUI_ObjectManipulation.hpp | 67 +- src/slic3r/GUI/GUI_ObjectSettings.cpp | 18 +- src/slic3r/GUI/GUI_ObjectSettings.hpp | 2 +- src/slic3r/GUI/GUI_Preview.cpp | 265 +- src/slic3r/GUI/GUI_Preview.hpp | 19 +- src/slic3r/GUI/GUI_Utils.cpp | 11 +- src/slic3r/GUI/GUI_Utils.hpp | 23 +- src/slic3r/GUI/GalleryDialog.cpp | 68 +- src/slic3r/GUI/GalleryDialog.hpp | 4 +- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 613 +- src/slic3r/GUI/Gizmos/GLGizmoBase.hpp | 159 +- src/slic3r/GUI/Gizmos/GLGizmoCut.cpp | 2637 +- src/slic3r/GUI/Gizmos/GLGizmoCut.hpp | 315 +- src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp | 3580 ++ src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp | 337 + src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp | 154 +- src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp | 13 +- src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp | 182 +- src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp | 42 +- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 450 +- src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 45 +- src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp | 2137 ++ src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp | 186 + .../GUI/Gizmos/GLGizmoMmuSegmentation.cpp | 190 +- .../GUI/Gizmos/GLGizmoMmuSegmentation.hpp | 31 +- src/slic3r/GUI/Gizmos/GLGizmoMove.cpp | 274 +- src/slic3r/GUI/Gizmos/GLGizmoMove.hpp | 60 +- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp | 570 +- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp | 104 +- src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp | 593 +- src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp | 146 +- src/slic3r/GUI/Gizmos/GLGizmoScale.cpp | 560 +- src/slic3r/GUI/Gizmos/GLGizmoScale.hpp | 66 +- src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp | 11 +- src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp | 6 +- src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp | 510 +- src/slic3r/GUI/Gizmos/GLGizmoSimplify.hpp | 34 +- src/slic3r/GUI/Gizmos/GLGizmoSlaBase.cpp | 206 + src/slic3r/GUI/Gizmos/GLGizmoSlaBase.hpp | 59 + src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 527 +- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp | 46 +- src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp | 412 +- src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp | 84 +- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 954 +- src/slic3r/GUI/Gizmos/GLGizmosManager.hpp | 106 +- src/slic3r/GUI/HintNotification.cpp | 24 +- src/slic3r/GUI/I18N.hpp | 1 - src/slic3r/GUI/IconManager.cpp | 204 + src/slic3r/GUI/IconManager.hpp | 132 + src/slic3r/GUI/ImGuiWrapper.cpp | 932 +- src/slic3r/GUI/ImGuiWrapper.hpp | 147 +- src/slic3r/GUI/InstanceCheck.cpp | 20 + src/slic3r/GUI/InstanceCheck.hpp | 3 +- src/slic3r/GUI/Jobs/ArrangeJob.cpp | 224 +- src/slic3r/GUI/Jobs/ArrangeJob.hpp | 30 +- src/slic3r/GUI/Jobs/BoostThreadWorker.cpp | 181 + src/slic3r/GUI/Jobs/BoostThreadWorker.hpp | 140 + src/slic3r/GUI/Jobs/BusyCursorJob.hpp | 53 + .../GUI/Jobs/CreateFontNameImageJob.cpp | 166 + .../GUI/Jobs/CreateFontNameImageJob.hpp | 81 + .../GUI/Jobs/CreateFontStyleImagesJob.cpp | 155 + .../GUI/Jobs/CreateFontStyleImagesJob.hpp | 36 + src/slic3r/GUI/Jobs/EmbossJob.cpp | 859 + src/slic3r/GUI/Jobs/EmbossJob.hpp | 236 + src/slic3r/GUI/Jobs/FillBedJob.cpp | 58 +- src/slic3r/GUI/Jobs/FillBedJob.hpp | 22 +- src/slic3r/GUI/Jobs/Job.cpp | 158 - src/slic3r/GUI/Jobs/Job.hpp | 136 +- .../Jobs/NotificationProgressIndicator.cpp | 6 +- .../Jobs/NotificationProgressIndicator.hpp | 2 +- src/slic3r/GUI/Jobs/PlaterJob.cpp | 17 - src/slic3r/GUI/Jobs/PlaterJob.hpp | 24 - src/slic3r/GUI/Jobs/PlaterWorker.hpp | 146 + src/slic3r/GUI/Jobs/RotoptimizeJob.cpp | 45 +- src/slic3r/GUI/Jobs/RotoptimizeJob.hpp | 34 +- src/slic3r/GUI/Jobs/SLAImportDialog.hpp | 177 + src/slic3r/GUI/Jobs/SLAImportJob.cpp | 207 +- src/slic3r/GUI/Jobs/SLAImportJob.hpp | 33 +- src/slic3r/GUI/Jobs/ThreadSafeQueue.hpp | 123 + src/slic3r/GUI/Jobs/UIThreadWorker.hpp | 133 + src/slic3r/GUI/Jobs/Worker.hpp | 119 + src/slic3r/GUI/KBShortcutsDialog.cpp | 24 +- src/slic3r/GUI/MainFrame.cpp | 184 +- src/slic3r/GUI/MainFrame.hpp | 9 +- src/slic3r/GUI/MeshUtils.cpp | 347 +- src/slic3r/GUI/MeshUtils.hpp | 139 +- src/slic3r/GUI/Mouse3DController.cpp | 5 + src/slic3r/GUI/MsgDialog.cpp | 18 +- src/slic3r/GUI/MsgDialog.hpp | 21 +- src/slic3r/GUI/Notebook.cpp | 19 +- src/slic3r/GUI/Notebook.hpp | 12 + src/slic3r/GUI/NotificationManager.cpp | 946 +- src/slic3r/GUI/NotificationManager.hpp | 175 +- src/slic3r/GUI/OG_CustomCtrl.cpp | 139 +- src/slic3r/GUI/OG_CustomCtrl.hpp | 3 +- src/slic3r/GUI/ObjectDataViewModel.cpp | 310 +- src/slic3r/GUI/ObjectDataViewModel.hpp | 83 +- src/slic3r/GUI/OpenGLManager.cpp | 352 +- src/slic3r/GUI/OpenGLManager.hpp | 54 +- src/slic3r/GUI/OptionsGroup.cpp | 227 +- src/slic3r/GUI/OptionsGroup.hpp | 40 +- src/slic3r/GUI/PhysicalPrinterDialog.cpp | 175 +- src/slic3r/GUI/PhysicalPrinterDialog.hpp | 6 +- src/slic3r/GUI/Plater.cpp | 1866 +- src/slic3r/GUI/Plater.hpp | 80 +- src/slic3r/GUI/Preferences.cpp | 2044 +- src/slic3r/GUI/Preferences.hpp | 61 +- src/slic3r/GUI/PresetComboBoxes.cpp | 331 +- src/slic3r/GUI/PresetComboBoxes.hpp | 19 +- src/slic3r/GUI/PresetHints.cpp | 36 +- src/slic3r/GUI/PrintHostDialogs.cpp | 101 +- src/slic3r/GUI/PrintHostDialogs.hpp | 14 +- src/slic3r/GUI/ProjectDirtyStateManager.cpp | 13 + src/slic3r/GUI/ProjectDirtyStateManager.hpp | 7 +- src/slic3r/GUI/RemovableDriveManager.cpp | 504 +- src/slic3r/GUI/SavePresetDialog.cpp | 299 +- src/slic3r/GUI/SavePresetDialog.hpp | 54 +- src/slic3r/GUI/SceneRaycaster.cpp | 247 + src/slic3r/GUI/SceneRaycaster.hpp | 117 + src/slic3r/GUI/Search.cpp | 107 +- src/slic3r/GUI/Search.hpp | 12 +- src/slic3r/GUI/Selection.cpp | 1812 +- src/slic3r/GUI/Selection.hpp | 221 +- src/slic3r/GUI/SendSystemInfoDialog.cpp | 20 +- src/slic3r/GUI/SurfaceDrag.cpp | 325 + src/slic3r/GUI/SurfaceDrag.hpp | 93 + src/slic3r/GUI/SysInfoDialog.cpp | 26 +- src/slic3r/GUI/Tab.cpp | 1282 +- src/slic3r/GUI/Tab.hpp | 58 +- src/slic3r/GUI/UnsavedChangesDialog.cpp | 649 +- src/slic3r/GUI/UnsavedChangesDialog.hpp | 133 +- src/slic3r/GUI/UpdateDialogs.cpp | 207 +- src/slic3r/GUI/UpdateDialogs.hpp | 51 + src/slic3r/GUI/WipeTowerDialog.cpp | 8 +- src/slic3r/GUI/format.hpp | 69 +- src/slic3r/GUI/wxExtensions.cpp | 419 +- src/slic3r/GUI/wxExtensions.hpp | 142 +- src/slic3r/Utils/AppUpdater.cpp | 654 + src/slic3r/Utils/AppUpdater.hpp | 66 + src/slic3r/Utils/AstroBox.cpp | 13 +- src/slic3r/Utils/AstroBox.hpp | 2 +- src/slic3r/Utils/Bonjour.cpp | 612 +- src/slic3r/Utils/Bonjour.hpp | 211 +- src/slic3r/Utils/Duet.cpp | 7 +- src/slic3r/Utils/Duet.hpp | 2 +- src/slic3r/Utils/EmbossStyleManager.cpp | 545 + src/slic3r/Utils/EmbossStyleManager.hpp | 300 + src/slic3r/Utils/EmbossStylesSerializable.cpp | 201 + src/slic3r/Utils/EmbossStylesSerializable.hpp | 58 + src/slic3r/Utils/FixModelByWin10.cpp | 2 +- src/slic3r/Utils/FlashAir.cpp | 11 +- src/slic3r/Utils/FlashAir.hpp | 2 +- src/slic3r/Utils/FontConfigHelp.cpp | 140 + src/slic3r/Utils/FontConfigHelp.hpp | 25 + src/slic3r/Utils/Http.cpp | 17 +- src/slic3r/Utils/Http.hpp | 7 +- src/slic3r/Utils/MKS.cpp | 7 +- src/slic3r/Utils/MKS.hpp | 2 +- src/slic3r/Utils/MacUtils.mm | 18 + src/slic3r/Utils/OctoPrint.cpp | 859 +- src/slic3r/Utils/OctoPrint.hpp | 95 +- src/slic3r/Utils/PresetUpdater.cpp | 725 +- src/slic3r/Utils/PresetUpdater.hpp | 13 +- src/slic3r/Utils/PrintHost.cpp | 52 +- src/slic3r/Utils/PrintHost.hpp | 12 +- src/slic3r/Utils/Process.cpp | 23 +- src/slic3r/Utils/Process.hpp | 4 +- src/slic3r/Utils/Profile.hpp | 19 - src/slic3r/Utils/RaycastManager.cpp | 362 + src/slic3r/Utils/RaycastManager.hpp | 172 + src/slic3r/Utils/Repetier.cpp | 47 +- src/slic3r/Utils/Repetier.hpp | 5 +- src/slic3r/Utils/TCPConsole.cpp | 8 +- src/slic3r/Utils/UndoRedo.cpp | 2 + src/slic3r/Utils/WinRegistry.cpp | 490 + src/slic3r/Utils/WinRegistry.hpp | 23 + src/slic3r/Utils/WxFontUtils.cpp | 351 + src/slic3r/Utils/WxFontUtils.hpp | 71 + src/tcbspan/README.md | 124 + src/tcbspan/span.hpp | 618 + t/angles.t | 93 - t/avoid_crossing_perimeters.t | 22 - t/bridges.t | 137 - t/clean_polylines.t | 83 - t/collinear.t | 87 - t/combineinfill.t | 166 - t/config.t | 20 - t/cooling.t | 214 - t/custom_gcode.t | 210 - t/dynamic.t | 93 - t/fill.t | 318 - t/flow.t | 83 - t/gaps.t | 60 - t/gcode.t | 9 +- t/geometry.t | 176 +- t/loops.t | 57 - t/multi.t | 221 - t/perimeters.t | 452 - t/polyclip.t | 121 - t/print.t | 65 - t/shells.t | 332 - t/slice.t | 152 - t/support.t | 272 - t/thin.t | 185 - tests/catch_main.hpp | 2 +- tests/data/U_overhang.obj | 76 + tests/data/contour_ALIENATO.TTF_glyph_i.svg | 5 + .../contour_Allura_Script.ttf_glyph_m.svg | 3 + tests/data/points_close_to_line.svg | 3 + tests/fff_print/CMakeLists.txt | 9 + .../test_avoid_crossing_perimeters.cpp | 16 + tests/fff_print/test_bridges.cpp | 133 + tests/fff_print/test_clipper.cpp | 190 +- tests/fff_print/test_cooling.cpp | 275 + tests/fff_print/test_custom_gcode.cpp | 273 + tests/fff_print/test_data.cpp | 33 +- tests/fff_print/test_data.hpp | 4 + tests/fff_print/test_extrusion_entity.cpp | 328 +- tests/fff_print/test_fill.cpp | 615 +- tests/fff_print/test_flow.cpp | 141 +- tests/fff_print/test_gaps.cpp | 60 + tests/fff_print/test_multi.cpp | 271 + tests/fff_print/test_perimeters.cpp | 629 + tests/fff_print/test_print.cpp | 67 +- tests/fff_print/test_printobject.cpp | 6 +- tests/fff_print/test_shells.cpp | 403 + tests/fff_print/test_skirt_brim.cpp | 1 + tests/fff_print/test_support_material.cpp | 261 +- tests/fff_print/test_thin_walls.cpp | 191 + tests/fff_print/test_trianglemesh.cpp | 14 +- tests/libnest2d/CMakeLists.txt | 8 +- tests/libnest2d/libnest2d_tests_main.cpp | 12 +- tests/libslic3r/CMakeLists.txt | 14 + tests/libslic3r/libslic3r_tests.cpp | 47 + tests/libslic3r/test_aabbindirect.cpp | 349 + tests/libslic3r/test_arachne.cpp | 351 +- tests/libslic3r/test_astar.cpp | 406 + tests/libslic3r/test_clipper_utils.cpp | 89 +- tests/libslic3r/test_color.cpp | 23 + tests/libslic3r/test_config.cpp | 22 +- tests/libslic3r/test_curve_fitting.cpp | 118 + tests/libslic3r/test_cut_surface.cpp | 171 + tests/libslic3r/test_emboss.cpp | 1279 + tests/libslic3r/test_expolygon.cpp | 67 + tests/libslic3r/test_geometry.cpp | 120 +- tests/libslic3r/test_indexed_triangle_set.cpp | 71 - tests/libslic3r/test_jump_point_search.cpp | 35 + tests/libslic3r/test_kdtreeindirect.cpp | 137 + tests/libslic3r/test_marchingsquares.cpp | 48 +- tests/libslic3r/test_meshboolean.cpp | 26 + .../libslic3r/test_mutable_priority_queue.cpp | 89 +- tests/libslic3r/test_placeholder_parser.cpp | 180 +- tests/libslic3r/test_png_io.cpp | 4 +- tests/libslic3r/test_polygon.cpp | 80 + tests/libslic3r/test_polyline.cpp | 28 + .../libslic3r/test_quadric_edge_collapse.cpp | 304 + tests/libslic3r/test_region_expansion.cpp | 284 + tests/libslic3r/test_surface_mesh.cpp | 122 + tests/libslic3r/test_triangulation.cpp | 127 + tests/libslic3r/test_utils.cpp | 35 + tests/libslic3r/test_voronoi.cpp | 45 +- tests/sla_print/CMakeLists.txt | 8 +- .../sla_print/sla_archive_readwrite_tests.cpp | 71 + tests/sla_print/sla_print_tests.cpp | 69 +- tests/sla_print/sla_raycast_tests.cpp | 2 +- tests/sla_print/sla_supptgen_tests.cpp | 1 + tests/sla_print/sla_supptreeutils_tests.cpp | 377 + tests/sla_print/sla_test_utils.cpp | 189 +- tests/sla_print/sla_test_utils.hpp | 63 +- tests/slic3rutils/CMakeLists.txt | 9 +- tests/slic3rutils/slic3r_jobs_tests.cpp | 165 + tests/slic3rutils/slic3r_version_tests.cpp | 83 + version.inc | 6 +- xs/CMakeLists.txt | 63 +- xs/lib/Slic3r/XS.pm | 178 - xs/main.xs.in | 1 - xs/src/perlglue.cpp | 24 +- xs/src/xsinit.h | 2 + xs/t/01_trianglemesh.t | 35 - xs/t/03_point.t | 24 +- xs/t/04_expolygon.t | 108 - xs/t/05_surface.t | 76 - xs/t/06_polygon.t | 21 - xs/t/07_extrusionpath.t | 38 - xs/t/08_extrusionloop.t | 158 - xs/t/09_polyline.t | 44 +- xs/t/10_line.t | 17 +- xs/t/12_extrusionpathcollection.t | 97 - xs/t/13_polylinecollection.t | 35 - xs/t/17_boundingbox.t | 27 - xs/xsp/BoundingBox.xsp | 118 - xs/xsp/BridgeDetector.xsp | 43 - xs/xsp/Clipper.xsp | 132 - xs/xsp/Config.xsp | 22 +- xs/xsp/ExPolygon.xsp | 2 - xs/xsp/ExPolygonCollection.xsp | 81 - xs/xsp/ExtrusionEntityCollection.xsp | 106 - xs/xsp/ExtrusionLoop.xsp | 65 - xs/xsp/ExtrusionMultiPath.xsp | 38 - xs/xsp/ExtrusionPath.xsp | 142 - xs/xsp/ExtrusionSimulator.xsp | 50 - xs/xsp/Filler.xsp | 65 - xs/xsp/Flow.xsp | 60 - xs/xsp/GCode.xsp | 53 - xs/xsp/GCodeSender.xsp | 24 - xs/xsp/Geometry.xsp | 53 - xs/xsp/Layer.xsp | 119 - xs/xsp/Line.xsp | 16 +- xs/xsp/Model.xsp | 14 +- xs/xsp/PerimeterGenerator.xsp | 40 - xs/xsp/PlaceholderParser.xsp | 33 - xs/xsp/Point.xsp | 13 +- xs/xsp/Polygon.xsp | 16 - xs/xsp/Polyline.xsp | 16 - xs/xsp/PolylineCollection.xsp | 81 - xs/xsp/Print.xsp | 103 - xs/xsp/Surface.xsp | 118 - xs/xsp/SurfaceCollection.xsp | 84 - xs/xsp/TriangleMesh.xsp | 90 - xs/xsp/XS.xsp | 127 +- xs/xsp/my.map | 206 - xs/xsp/typemap.xspt | 146 - 1324 files changed, 224568 insertions(+), 326890 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug_report_form.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 deps/Boost/Boost.patch delete mode 100644 deps/Boost/common.jam delete mode 100644 deps/GLEW/glew/CMakeLists.txt delete mode 100644 deps/GLEW/glew/LICENSE.txt delete mode 100644 deps/GLEW/glew/README.md delete mode 100644 deps/GLEW/glew/VERSION delete mode 100644 deps/GLEW/glew/include/GL/glew.h delete mode 100644 deps/GLEW/glew/include/GL/glxew.h delete mode 100644 deps/GLEW/glew/include/GL/wglew.h delete mode 100644 deps/GLEW/glew/src/glew.c create mode 100644 deps/NanoSVG/NanoSVG.cmake create mode 100644 deps/OCCT/occt_toolkit.cmake create mode 100644 doc/seam_placement/corner_penalty_function.png delete mode 100644 lib/Slic3r/ExPolygon.pm delete mode 100644 lib/Slic3r/ExtrusionLoop.pm delete mode 100644 lib/Slic3r/ExtrusionPath.pm delete mode 100644 lib/Slic3r/Flow.pm delete mode 100644 lib/Slic3r/Geometry/Clipper.pm delete mode 100644 lib/Slic3r/Layer.pm delete mode 100644 lib/Slic3r/Print/Object.pm delete mode 100644 lib/Slic3r/Print/State.pm delete mode 100644 lib/Slic3r/Surface.pm create mode 100644 resources/data/embossed_text.obj create mode 100644 resources/icons/add_text_modifier.svg create mode 100644 resources/icons/add_text_negative.svg create mode 100644 resources/icons/add_text_part.svg create mode 100644 resources/icons/collapse_btn.svg create mode 100644 resources/icons/cut_.svg create mode 100644 resources/icons/cut_connectors.svg create mode 100644 resources/icons/dowel.svg create mode 100644 resources/icons/edit.svg create mode 100644 resources/icons/edit_button_pressed.svg create mode 100644 resources/icons/expand_btn.svg create mode 100644 resources/icons/legend_cog.svg create mode 100644 resources/icons/legend_colorchanges.svg create mode 100644 resources/icons/legend_customgcodes.svg create mode 100644 resources/icons/legend_deretract.svg create mode 100644 resources/icons/legend_pauseprints.svg create mode 100644 resources/icons/legend_retract.svg create mode 100644 resources/icons/legend_seams.svg create mode 100644 resources/icons/legend_shells.svg create mode 100644 resources/icons/legend_toolchanges.svg create mode 100644 resources/icons/legend_toolmarker.svg create mode 100644 resources/icons/legend_travel.svg create mode 100644 resources/icons/legend_wipe.svg create mode 100644 resources/icons/make_bold.svg create mode 100644 resources/icons/make_italic.svg create mode 100644 resources/icons/make_unbold.svg create mode 100644 resources/icons/make_unitalic.svg create mode 100644 resources/icons/measure.svg create mode 100644 resources/icons/mode.svg create mode 100644 resources/icons/notification_open.svg create mode 100644 resources/icons/notification_open_hover.svg create mode 100644 resources/icons/notification_pause.svg create mode 100644 resources/icons/notification_pause_hover.svg create mode 100644 resources/icons/notification_play.svg create mode 100644 resources/icons/notification_play_hover.svg create mode 100644 resources/icons/open_browser.svg create mode 100644 resources/icons/plug.svg create mode 100644 resources/icons/toolbar_arrow_2.svg create mode 100644 resources/profiles/Anker.idx create mode 100644 resources/profiles/Anker.ini create mode 100644 resources/profiles/Anker/M5-bed.stl create mode 100644 resources/profiles/Anker/M5-texture.svg create mode 100644 resources/profiles/Anker/M5-texture_v2.svg create mode 100644 resources/profiles/Anker/M5_thumbnail.png create mode 100644 resources/profiles/Anker/M5_thumbnail_v2.png create mode 100644 resources/profiles/Anycubic/PHOTON MONO X_thumbnail.png create mode 100644 resources/profiles/BIQU.idx create mode 100644 resources/profiles/BIQU.ini create mode 100644 resources/profiles/BIQU/BIQUBX_thumbnail.png create mode 100644 resources/profiles/BIQU/BX_Bed.stl create mode 100644 resources/profiles/BIQU/BX_Texture.png create mode 100644 resources/profiles/Creality/ENDER5PRO_thumbnail.png create mode 100644 resources/profiles/Creality/ENDER5S1_thumbnail.png create mode 100644 resources/profiles/Creality/SERMOONV1PRO_thumbnail.png create mode 100644 resources/profiles/Creality/SERMOONV1_thumbnail.png create mode 100644 resources/profiles/Creality/sermoonv1.svg create mode 100644 resources/profiles/Creality/sermoonv1_bed.stl create mode 100644 resources/profiles/Elegoo/NEPTUNE3MAX_thumbnail.png create mode 100644 resources/profiles/Elegoo/NEPTUNE3PLUS_thumbnail.png create mode 100644 resources/profiles/Elegoo/NEPTUNE3PRO_thumbnail.png create mode 100644 resources/profiles/Geeetech.idx create mode 100644 resources/profiles/Geeetech.ini create mode 100644 resources/profiles/Geeetech/125X130.stl create mode 100644 resources/profiles/Geeetech/125x130.svg create mode 100644 resources/profiles/Geeetech/150x150.stl create mode 100644 resources/profiles/Geeetech/150x150.svg create mode 100644 resources/profiles/Geeetech/160x160.stl create mode 100644 resources/profiles/Geeetech/160x160.svg create mode 100644 resources/profiles/Geeetech/180X150.stl create mode 100644 resources/profiles/Geeetech/180x150.svg create mode 100644 resources/profiles/Geeetech/200x200.stl create mode 100644 resources/profiles/Geeetech/200x200.svg create mode 100644 resources/profiles/Geeetech/220x220.stl create mode 100644 resources/profiles/Geeetech/220x220.svg create mode 100644 resources/profiles/Geeetech/250x250.stl create mode 100644 resources/profiles/Geeetech/250x250.svg create mode 100644 resources/profiles/Geeetech/255x255.stl create mode 100644 resources/profiles/Geeetech/255x255.svg create mode 100644 resources/profiles/Geeetech/300x180.stl create mode 100644 resources/profiles/Geeetech/300x180.svg create mode 100644 resources/profiles/Geeetech/320x320.stl create mode 100644 resources/profiles/Geeetech/320x320.svg create mode 100644 resources/profiles/Geeetech/A10M_thumbnail.png create mode 100644 resources/profiles/Geeetech/A10Pro_thumbnail.png create mode 100644 resources/profiles/Geeetech/A10T_thumbnail.png create mode 100644 resources/profiles/Geeetech/A20M_thumbnail.png create mode 100644 resources/profiles/Geeetech/A20T_thumbnail.png create mode 100644 resources/profiles/Geeetech/A20_thumbnail.png create mode 100644 resources/profiles/Geeetech/A30M_thumbnail.png create mode 100644 resources/profiles/Geeetech/A30Pro_thumbnail.png create mode 100644 resources/profiles/Geeetech/A30T_thumbnail.png create mode 100644 resources/profiles/Geeetech/E180_thumbnail.png create mode 100644 resources/profiles/Geeetech/GiantArmD200_thumbnail.png create mode 100644 resources/profiles/Geeetech/I3ProB_thumbnail.png create mode 100644 resources/profiles/Geeetech/I3ProC_thumbnail.png create mode 100644 resources/profiles/Geeetech/I3ProW_thumbnail.png create mode 100644 resources/profiles/Geeetech/MeCreator2_thumbnail.png create mode 100644 resources/profiles/Geeetech/MeCreator_thumbnail.png create mode 100644 resources/profiles/Geeetech/MeDucer_thumbnail.png create mode 100644 resources/profiles/Geeetech/MizarM_thumbnail.png create mode 100644 resources/profiles/Geeetech/MizarMax_thumbnail.png create mode 100644 resources/profiles/Geeetech/MizarPro_thumbnail.png create mode 100644 resources/profiles/Geeetech/MizarS_thumbnail.png create mode 100644 resources/profiles/Geeetech/Mizar_thumbnail.png create mode 100644 resources/profiles/Geeetech/ThunderPro_thumbnail.png create mode 100644 resources/profiles/Geeetech/Thunder_thumbnail.png create mode 100644 resources/profiles/LulzBot/TAZ_WORKHORSE_thumbnail.png create mode 100644 resources/profiles/MakerGear.idx create mode 100644 resources/profiles/MakerGear.ini create mode 100644 resources/profiles/MakerGear/M2_M3.stl create mode 100644 resources/profiles/MakerGear/M2_M3.svg create mode 100644 resources/profiles/MakerGear/MAKERGEAR_M2_DUAL_thumbnail.png create mode 100644 resources/profiles/MakerGear/MAKERGEAR_M2_thumbnail.png create mode 100644 resources/profiles/MakerGear/MAKERGEAR_M3_DUPLICATION_thumbnail.png create mode 100644 resources/profiles/MakerGear/MAKERGEAR_M3_SE_thumbnail.png create mode 100644 resources/profiles/MakerGear/MAKERGEAR_M3_thumbnail.png create mode 100644 resources/profiles/MakerGear/MAKERGEAR_MICRO_thumbnail.png create mode 100644 resources/profiles/MakerGear/MAKERGEAR_U1_thumbnail.png create mode 100644 resources/profiles/Print4Taste.idx create mode 100644 resources/profiles/Print4Taste.ini create mode 100644 resources/profiles/Print4Taste/MC2.0_bed.stl create mode 100644 resources/profiles/Print4Taste/MC2.0_texture.svg create mode 100644 resources/profiles/Print4Taste/MC2.0_thumbnail.png create mode 100644 resources/profiles/Rigid3D.idx create mode 100644 resources/profiles/Rigid3D.ini create mode 100644 resources/profiles/Rigid3D/Mucit2_thumbnail.png create mode 100644 resources/profiles/Rigid3D/Mucit_thumbnail.png create mode 100644 resources/profiles/Rigid3D/Zero2_thumbnail.png create mode 100644 resources/profiles/Rigid3D/Zero3_thumbnail.png create mode 100644 resources/profiles/Rigid3D/mucit2_bed.png create mode 100644 resources/profiles/Rigid3D/mucit2_bed.stl create mode 100644 resources/profiles/Rigid3D/mucit_bed.png create mode 100644 resources/profiles/Rigid3D/mucit_bed.stl create mode 100644 resources/profiles/Rigid3D/zero2_bed.png create mode 100644 resources/profiles/Rigid3D/zero3_bed.png create mode 100644 resources/profiles/Rigid3D/zero_bed.stl create mode 100644 resources/profiles/Templates.idx create mode 100644 resources/profiles/Templates.ini create mode 100644 resources/shaders/110/background.fs create mode 100644 resources/shaders/110/background.vs rename resources/shaders/{options_110.fs => 110/flat.fs} (100%) create mode 100644 resources/shaders/110/flat.vs create mode 100644 resources/shaders/110/flat_clip.fs create mode 100644 resources/shaders/110/flat_clip.vs create mode 100644 resources/shaders/110/flat_texture.fs create mode 100644 resources/shaders/110/flat_texture.vs rename resources/shaders/{ => 110}/gouraud.fs (66%) create mode 100644 resources/shaders/110/gouraud.vs rename resources/shaders/{ => 110}/gouraud_light.fs (100%) create mode 100644 resources/shaders/110/gouraud_light.vs create mode 100644 resources/shaders/110/gouraud_light_clip.fs create mode 100644 resources/shaders/110/gouraud_light_clip.vs rename resources/shaders/{ => 110}/gouraud_light_instanced.fs (100%) create mode 100644 resources/shaders/110/gouraud_light_instanced.vs create mode 100644 resources/shaders/110/imgui.fs create mode 100644 resources/shaders/110/imgui.vs create mode 100644 resources/shaders/110/mm_contour.fs create mode 100644 resources/shaders/110/mm_contour.vs rename resources/shaders/{ => 110}/mm_gouraud.fs (87%) rename resources/shaders/{ => 110}/mm_gouraud.vs (72%) rename resources/shaders/{ => 110}/printbed.fs (61%) create mode 100644 resources/shaders/110/printbed.vs create mode 100644 resources/shaders/110/toolpaths_cog.fs create mode 100644 resources/shaders/110/toolpaths_cog.vs rename resources/shaders/{ => 110}/variable_layer_height.fs (100%) create mode 100644 resources/shaders/110/variable_layer_height.vs create mode 100644 resources/shaders/140/background.fs create mode 100644 resources/shaders/140/background.vs create mode 100644 resources/shaders/140/dashed_thick_lines.fs create mode 100644 resources/shaders/140/dashed_thick_lines.gs create mode 100644 resources/shaders/140/dashed_thick_lines.vs create mode 100644 resources/shaders/140/flat.fs create mode 100644 resources/shaders/140/flat.vs create mode 100644 resources/shaders/140/flat_clip.fs create mode 100644 resources/shaders/140/flat_clip.vs create mode 100644 resources/shaders/140/flat_texture.fs create mode 100644 resources/shaders/140/flat_texture.vs create mode 100644 resources/shaders/140/gouraud.fs create mode 100644 resources/shaders/140/gouraud.vs create mode 100644 resources/shaders/140/gouraud_light.fs create mode 100644 resources/shaders/140/gouraud_light.vs create mode 100644 resources/shaders/140/gouraud_light_clip.fs create mode 100644 resources/shaders/140/gouraud_light_clip.vs create mode 100644 resources/shaders/140/gouraud_light_instanced.fs create mode 100644 resources/shaders/140/gouraud_light_instanced.vs create mode 100644 resources/shaders/140/imgui.fs create mode 100644 resources/shaders/140/imgui.vs create mode 100644 resources/shaders/140/mm_contour.fs create mode 100644 resources/shaders/140/mm_contour.vs create mode 100644 resources/shaders/140/mm_gouraud.fs create mode 100644 resources/shaders/140/mm_gouraud.vs create mode 100644 resources/shaders/140/printbed.fs create mode 100644 resources/shaders/140/printbed.vs create mode 100644 resources/shaders/140/toolpaths_cog.fs create mode 100644 resources/shaders/140/toolpaths_cog.vs create mode 100644 resources/shaders/140/variable_layer_height.fs create mode 100644 resources/shaders/140/variable_layer_height.vs create mode 100644 resources/shaders/ES/background.fs create mode 100644 resources/shaders/ES/background.vs create mode 100644 resources/shaders/ES/dashed_lines.fs create mode 100644 resources/shaders/ES/dashed_lines.vs create mode 100644 resources/shaders/ES/flat.fs create mode 100644 resources/shaders/ES/flat.vs create mode 100644 resources/shaders/ES/flat_clip.fs create mode 100644 resources/shaders/ES/flat_clip.vs create mode 100644 resources/shaders/ES/flat_texture.fs create mode 100644 resources/shaders/ES/flat_texture.vs create mode 100644 resources/shaders/ES/gouraud.fs rename resources/shaders/{ => ES}/gouraud.vs (75%) create mode 100644 resources/shaders/ES/gouraud_light.fs rename resources/shaders/{ => ES}/gouraud_light.vs (76%) create mode 100644 resources/shaders/ES/gouraud_light_clip.fs create mode 100644 resources/shaders/ES/gouraud_light_clip.vs create mode 100644 resources/shaders/ES/gouraud_light_instanced.fs rename resources/shaders/{ => ES}/gouraud_light_instanced.vs (81%) create mode 100644 resources/shaders/ES/imgui.fs create mode 100644 resources/shaders/ES/imgui.vs create mode 100644 resources/shaders/ES/mm_contour.fs create mode 100644 resources/shaders/ES/mm_contour.vs create mode 100644 resources/shaders/ES/mm_gouraud.fs create mode 100644 resources/shaders/ES/mm_gouraud.vs create mode 100644 resources/shaders/ES/printbed.fs create mode 100644 resources/shaders/ES/printbed.vs create mode 100644 resources/shaders/ES/toolpaths_cog.fs create mode 100644 resources/shaders/ES/toolpaths_cog.vs create mode 100644 resources/shaders/ES/variable_layer_height.fs rename resources/shaders/{ => ES}/variable_layer_height.vs (63%) create mode 100644 resources/shaders/ES/wireframe.fs create mode 100644 resources/shaders/ES/wireframe.vs delete mode 100644 resources/shaders/mm_contour.fs delete mode 100644 resources/shaders/mm_contour.vs delete mode 100644 resources/shaders/options_110.vs delete mode 100644 resources/shaders/options_120.fs delete mode 100644 resources/shaders/options_120.vs delete mode 100644 resources/shaders/printbed.vs delete mode 100644 resources/shaders/toolpaths_lines.fs delete mode 100644 resources/shaders/toolpaths_lines.vs create mode 100644 resources/shapes/universal wall mount hole.png create mode 100644 resources/shapes/universal wall mount hole.stl create mode 100644 sandboxes/wx_gl_test/CMakeLists.txt create mode 100644 sandboxes/wx_gl_test/main.cpp delete mode 100644 src/Shiny/CMakeLists.txt delete mode 100644 src/Shiny/Shiny.h delete mode 100644 src/Shiny/ShinyConfig.h delete mode 100644 src/Shiny/ShinyData.h delete mode 100644 src/Shiny/ShinyMacros.h delete mode 100644 src/Shiny/ShinyManager.c delete mode 100644 src/Shiny/ShinyManager.h delete mode 100644 src/Shiny/ShinyNode.c delete mode 100644 src/Shiny/ShinyNode.h delete mode 100644 src/Shiny/ShinyNodePool.c delete mode 100644 src/Shiny/ShinyNodePool.h delete mode 100644 src/Shiny/ShinyNodeState.c delete mode 100644 src/Shiny/ShinyNodeState.h delete mode 100644 src/Shiny/ShinyOutput.c delete mode 100644 src/Shiny/ShinyOutput.h delete mode 100644 src/Shiny/ShinyPrereqs.h delete mode 100644 src/Shiny/ShinyTools.c delete mode 100644 src/Shiny/ShinyTools.h delete mode 100644 src/Shiny/ShinyVersion.h delete mode 100644 src/Shiny/ShinyZone.c delete mode 100644 src/Shiny/ShinyZone.h delete mode 100644 src/glew/LICENSE.txt delete mode 100644 src/glew/README.md delete mode 100644 src/glew/include/GL/glew.h delete mode 100644 src/glew/include/GL/glxew.h delete mode 100644 src/glew/include/GL/wglew.h delete mode 100644 src/glew/src/glew.c create mode 100644 src/imgui/imgui_stdlib.cpp create mode 100644 src/imgui/imgui_stdlib.h rename src/libslic3r/{SLA/IndexedMesh.cpp => AABBMesh.cpp} (51%) rename src/libslic3r/{SLA/IndexedMesh.hpp => AABBMesh.hpp} (66%) create mode 100644 src/libslic3r/AStar.hpp create mode 100644 src/libslic3r/Algorithm/RegionExpansion.cpp create mode 100644 src/libslic3r/Algorithm/RegionExpansion.hpp create mode 100644 src/libslic3r/AnyPtr.hpp rename src/libslic3r/{SLA => }/BoostAdapter.hpp (63%) create mode 100644 src/libslic3r/BranchingTree/BranchingTree.cpp create mode 100644 src/libslic3r/BranchingTree/BranchingTree.hpp create mode 100644 src/libslic3r/BranchingTree/PointCloud.cpp create mode 100644 src/libslic3r/BranchingTree/PointCloud.hpp create mode 100644 src/libslic3r/CSGMesh/CSGMesh.hpp create mode 100644 src/libslic3r/CSGMesh/CSGMeshCopy.hpp create mode 100644 src/libslic3r/CSGMesh/ModelToCSGMesh.hpp create mode 100644 src/libslic3r/CSGMesh/PerformCSGMeshBooleans.hpp create mode 100644 src/libslic3r/CSGMesh/SliceCSGMesh.hpp create mode 100644 src/libslic3r/CSGMesh/TriangleMeshAdapter.hpp create mode 100644 src/libslic3r/CSGMesh/VoxelizeCSGMesh.hpp create mode 100644 src/libslic3r/ClipperZUtils.hpp create mode 100644 src/libslic3r/Color.cpp create mode 100644 src/libslic3r/Color.hpp create mode 100644 src/libslic3r/CutSurface.cpp create mode 100644 src/libslic3r/CutSurface.hpp create mode 100644 src/libslic3r/Emboss.cpp create mode 100644 src/libslic3r/Emboss.hpp delete mode 100644 src/libslic3r/ExPolygonCollection.cpp delete mode 100644 src/libslic3r/ExPolygonCollection.hpp create mode 100644 src/libslic3r/ExPolygonsIndex.cpp create mode 100644 src/libslic3r/ExPolygonsIndex.hpp create mode 100644 src/libslic3r/ExtrusionRole.cpp create mode 100644 src/libslic3r/ExtrusionRole.hpp create mode 100644 src/libslic3r/Fill/FillEnsuring.cpp create mode 100644 src/libslic3r/Fill/FillEnsuring.hpp create mode 100644 src/libslic3r/Format/SL1_SVG.cpp create mode 100644 src/libslic3r/Format/SL1_SVG.hpp create mode 100644 src/libslic3r/Format/SLAArchiveReader.cpp create mode 100644 src/libslic3r/Format/SLAArchiveReader.hpp create mode 100644 src/libslic3r/Format/SLAArchiveWriter.cpp create mode 100644 src/libslic3r/Format/SLAArchiveWriter.hpp create mode 100644 src/libslic3r/Format/ZipperArchiveImport.cpp create mode 100644 src/libslic3r/Format/ZipperArchiveImport.hpp create mode 100644 src/libslic3r/Format/pwmx.cpp create mode 100644 src/libslic3r/Format/pwmx.hpp create mode 100644 src/libslic3r/GCode/ExtrusionProcessor.hpp create mode 100644 src/libslic3r/GCode/RetractWhenCrossingPerimeters.cpp create mode 100644 src/libslic3r/GCode/RetractWhenCrossingPerimeters.hpp create mode 100644 src/libslic3r/IntersectionPoints.cpp create mode 100644 src/libslic3r/IntersectionPoints.hpp create mode 100644 src/libslic3r/JumpPointSearch.cpp create mode 100644 src/libslic3r/JumpPointSearch.hpp create mode 100644 src/libslic3r/Measure.cpp create mode 100644 src/libslic3r/Measure.hpp create mode 100644 src/libslic3r/MeasureUtils.hpp create mode 100644 src/libslic3r/MeshNormals.cpp create mode 100644 src/libslic3r/MeshNormals.hpp create mode 100644 src/libslic3r/NSVGUtils.cpp create mode 100644 src/libslic3r/NSVGUtils.hpp create mode 100644 src/libslic3r/OpenVDBUtilsLegacy.hpp create mode 100644 src/libslic3r/PointGrid.hpp create mode 100644 src/libslic3r/PrincipalComponents2D.cpp create mode 100644 src/libslic3r/PrincipalComponents2D.hpp create mode 100644 src/libslic3r/SLA/BranchingTreeSLA.cpp create mode 100644 src/libslic3r/SLA/BranchingTreeSLA.hpp delete mode 100644 src/libslic3r/SLA/Concurrency.hpp create mode 100644 src/libslic3r/SLA/DefaultSupportTree.cpp rename src/libslic3r/SLA/{SupportTreeBuildsteps.hpp => DefaultSupportTree.hpp} (53%) delete mode 100644 src/libslic3r/SLA/SupportTreeBuildsteps.cpp create mode 100644 src/libslic3r/SLA/SupportTreeStrategies.hpp create mode 100644 src/libslic3r/SLA/SupportTreeUtils.hpp create mode 100644 src/libslic3r/SLA/SupportTreeUtilsLegacy.hpp create mode 100644 src/libslic3r/SupportSpotsGenerator.cpp create mode 100644 src/libslic3r/SupportSpotsGenerator.hpp create mode 100644 src/libslic3r/SurfaceMesh.hpp create mode 100644 src/libslic3r/TextConfiguration.hpp create mode 100644 src/libslic3r/Timer.cpp create mode 100644 src/libslic3r/Timer.hpp create mode 100644 src/libslic3r/TreeModelVolumes.cpp create mode 100644 src/libslic3r/TreeModelVolumes.hpp create mode 100644 src/libslic3r/TreeSupport.cpp create mode 100644 src/libslic3r/TreeSupport.hpp create mode 100644 src/libslic3r/TriangleSelectorWrapper.cpp create mode 100644 src/libslic3r/TriangleSelectorWrapper.hpp delete mode 100644 src/libslic3r/TriangulateWall.cpp create mode 100644 src/libslic3r/Triangulation.cpp create mode 100644 src/libslic3r/Triangulation.hpp delete mode 100644 src/nanosvg/README-prusa.txt delete mode 100644 src/nanosvg/nanosvg.h delete mode 100644 src/nanosvg/nanosvgrast.h delete mode 100644 src/qhull/Announce.txt delete mode 100644 src/qhull/CMakeLists.txt delete mode 100644 src/qhull/COPYING.txt delete mode 100644 src/qhull/README.txt delete mode 100644 src/qhull/REGISTER.txt delete mode 100644 src/qhull/html/index.htm delete mode 100644 src/qhull/html/normal_voronoi_knauss_oesterle.jpg delete mode 100644 src/qhull/html/qconvex.htm delete mode 100644 src/qhull/html/qdelau_f.htm delete mode 100644 src/qhull/html/qdelaun.htm delete mode 100644 src/qhull/html/qh--4d.gif delete mode 100644 src/qhull/html/qh--cone.gif delete mode 100644 src/qhull/html/qh--dt.gif delete mode 100644 src/qhull/html/qh--geom.gif delete mode 100644 src/qhull/html/qh--half.gif delete mode 100644 src/qhull/html/qh--rand.gif delete mode 100644 src/qhull/html/qh-code.htm delete mode 100644 src/qhull/html/qh-eg.htm delete mode 100644 src/qhull/html/qh-faq.htm delete mode 100644 src/qhull/html/qh-get.htm delete mode 100644 src/qhull/html/qh-impre.htm delete mode 100644 src/qhull/html/qh-optc.htm delete mode 100644 src/qhull/html/qh-optf.htm delete mode 100644 src/qhull/html/qh-optg.htm delete mode 100644 src/qhull/html/qh-opto.htm delete mode 100644 src/qhull/html/qh-optp.htm delete mode 100644 src/qhull/html/qh-optq.htm delete mode 100644 src/qhull/html/qh-optt.htm delete mode 100644 src/qhull/html/qh-quick.htm delete mode 100644 src/qhull/html/qhalf.htm delete mode 100644 src/qhull/html/qhull-cpp.xml delete mode 100644 src/qhull/html/qhull.htm delete mode 100644 src/qhull/html/qhull.man delete mode 100644 src/qhull/html/qhull.txt delete mode 100644 src/qhull/html/qvoron_f.htm delete mode 100644 src/qhull/html/qvoronoi.htm delete mode 100644 src/qhull/html/rbox.htm delete mode 100644 src/qhull/html/rbox.man delete mode 100644 src/qhull/html/rbox.txt delete mode 100644 src/qhull/index.htm delete mode 100644 src/qhull/origCMakeLists.txt delete mode 100644 src/qhull/src/Changes.txt delete mode 100644 src/qhull/src/libqhull/DEPRECATED.txt delete mode 100644 src/qhull/src/libqhull/Makefile delete mode 100644 src/qhull/src/libqhull/Mborland delete mode 100644 src/qhull/src/libqhull/geom.c delete mode 100644 src/qhull/src/libqhull/geom.h delete mode 100644 src/qhull/src/libqhull/geom2.c delete mode 100644 src/qhull/src/libqhull/global.c delete mode 100644 src/qhull/src/libqhull/index.htm delete mode 100644 src/qhull/src/libqhull/io.c delete mode 100644 src/qhull/src/libqhull/io.h delete mode 100644 src/qhull/src/libqhull/libqhull.c delete mode 100644 src/qhull/src/libqhull/libqhull.h delete mode 100644 src/qhull/src/libqhull/libqhull.pro delete mode 100644 src/qhull/src/libqhull/mem.c delete mode 100644 src/qhull/src/libqhull/mem.h delete mode 100644 src/qhull/src/libqhull/merge.c delete mode 100644 src/qhull/src/libqhull/merge.h delete mode 100644 src/qhull/src/libqhull/poly.c delete mode 100644 src/qhull/src/libqhull/poly.h delete mode 100644 src/qhull/src/libqhull/poly2.c delete mode 100644 src/qhull/src/libqhull/qh-geom.htm delete mode 100644 src/qhull/src/libqhull/qh-globa.htm delete mode 100644 src/qhull/src/libqhull/qh-io.htm delete mode 100644 src/qhull/src/libqhull/qh-mem.htm delete mode 100644 src/qhull/src/libqhull/qh-merge.htm delete mode 100644 src/qhull/src/libqhull/qh-poly.htm delete mode 100644 src/qhull/src/libqhull/qh-qhull.htm delete mode 100644 src/qhull/src/libqhull/qh-set.htm delete mode 100644 src/qhull/src/libqhull/qh-stat.htm delete mode 100644 src/qhull/src/libqhull/qh-user.htm delete mode 100644 src/qhull/src/libqhull/qhull-exports.def delete mode 100644 src/qhull/src/libqhull/qhull_a.h delete mode 100644 src/qhull/src/libqhull/qhull_p-exports.def delete mode 100644 src/qhull/src/libqhull/qset.c delete mode 100644 src/qhull/src/libqhull/qset.h delete mode 100644 src/qhull/src/libqhull/random.c delete mode 100644 src/qhull/src/libqhull/random.h delete mode 100644 src/qhull/src/libqhull/rboxlib.c delete mode 100644 src/qhull/src/libqhull/stat.c delete mode 100644 src/qhull/src/libqhull/stat.h delete mode 100644 src/qhull/src/libqhull/user.c delete mode 100644 src/qhull/src/libqhull/user.h delete mode 100644 src/qhull/src/libqhull/usermem.c delete mode 100644 src/qhull/src/libqhull/userprintf.c delete mode 100644 src/qhull/src/libqhull/userprintf_rbox.c delete mode 100644 src/qhull/src/libqhull_r/Makefile delete mode 100644 src/qhull/src/libqhull_r/geom2_r.c delete mode 100644 src/qhull/src/libqhull_r/geom_r.c delete mode 100644 src/qhull/src/libqhull_r/geom_r.h delete mode 100644 src/qhull/src/libqhull_r/global_r.c delete mode 100644 src/qhull/src/libqhull_r/index.htm delete mode 100644 src/qhull/src/libqhull_r/io_r.c delete mode 100644 src/qhull/src/libqhull_r/io_r.h delete mode 100644 src/qhull/src/libqhull_r/libqhull_r.c delete mode 100644 src/qhull/src/libqhull_r/libqhull_r.h delete mode 100644 src/qhull/src/libqhull_r/libqhull_r.pro delete mode 100644 src/qhull/src/libqhull_r/mem_r.c delete mode 100644 src/qhull/src/libqhull_r/mem_r.h delete mode 100644 src/qhull/src/libqhull_r/merge_r.c delete mode 100644 src/qhull/src/libqhull_r/merge_r.h delete mode 100644 src/qhull/src/libqhull_r/poly2_r.c delete mode 100644 src/qhull/src/libqhull_r/poly_r.c delete mode 100644 src/qhull/src/libqhull_r/poly_r.h delete mode 100644 src/qhull/src/libqhull_r/qh-geom_r.htm delete mode 100644 src/qhull/src/libqhull_r/qh-globa_r.htm delete mode 100644 src/qhull/src/libqhull_r/qh-io_r.htm delete mode 100644 src/qhull/src/libqhull_r/qh-mem_r.htm delete mode 100644 src/qhull/src/libqhull_r/qh-merge_r.htm delete mode 100644 src/qhull/src/libqhull_r/qh-poly_r.htm delete mode 100644 src/qhull/src/libqhull_r/qh-qhull_r.htm delete mode 100644 src/qhull/src/libqhull_r/qh-set_r.htm delete mode 100644 src/qhull/src/libqhull_r/qh-stat_r.htm delete mode 100644 src/qhull/src/libqhull_r/qh-user_r.htm delete mode 100644 src/qhull/src/libqhull_r/qhull_r-exports.def delete mode 100644 src/qhull/src/libqhull_r/qhull_ra.h delete mode 100644 src/qhull/src/libqhull_r/qset_r.c delete mode 100644 src/qhull/src/libqhull_r/qset_r.h delete mode 100644 src/qhull/src/libqhull_r/random_r.c delete mode 100644 src/qhull/src/libqhull_r/random_r.h delete mode 100644 src/qhull/src/libqhull_r/rboxlib_r.c delete mode 100644 src/qhull/src/libqhull_r/stat_r.c delete mode 100644 src/qhull/src/libqhull_r/stat_r.h delete mode 100644 src/qhull/src/libqhull_r/user_r.c delete mode 100644 src/qhull/src/libqhull_r/user_r.h delete mode 100644 src/qhull/src/libqhull_r/usermem_r.c delete mode 100644 src/qhull/src/libqhull_r/userprintf_r.c delete mode 100644 src/qhull/src/libqhull_r/userprintf_rbox_r.c delete mode 100644 src/qhull/src/libqhullcpp/Coordinates.cpp delete mode 100644 src/qhull/src/libqhullcpp/Coordinates.h delete mode 100644 src/qhull/src/libqhullcpp/PointCoordinates.cpp delete mode 100644 src/qhull/src/libqhullcpp/PointCoordinates.h delete mode 100644 src/qhull/src/libqhullcpp/Qhull.cpp delete mode 100644 src/qhull/src/libqhullcpp/Qhull.h delete mode 100644 src/qhull/src/libqhullcpp/QhullError.h delete mode 100644 src/qhull/src/libqhullcpp/QhullFacet.cpp delete mode 100644 src/qhull/src/libqhullcpp/QhullFacet.h delete mode 100644 src/qhull/src/libqhullcpp/QhullFacetList.cpp delete mode 100644 src/qhull/src/libqhullcpp/QhullFacetList.h delete mode 100644 src/qhull/src/libqhullcpp/QhullFacetSet.cpp delete mode 100644 src/qhull/src/libqhullcpp/QhullFacetSet.h delete mode 100644 src/qhull/src/libqhullcpp/QhullHyperplane.cpp delete mode 100644 src/qhull/src/libqhullcpp/QhullHyperplane.h delete mode 100644 src/qhull/src/libqhullcpp/QhullIterator.h delete mode 100644 src/qhull/src/libqhullcpp/QhullLinkedList.h delete mode 100644 src/qhull/src/libqhullcpp/QhullPoint.cpp delete mode 100644 src/qhull/src/libqhullcpp/QhullPoint.h delete mode 100644 src/qhull/src/libqhullcpp/QhullPointSet.cpp delete mode 100644 src/qhull/src/libqhullcpp/QhullPointSet.h delete mode 100644 src/qhull/src/libqhullcpp/QhullPoints.cpp delete mode 100644 src/qhull/src/libqhullcpp/QhullPoints.h delete mode 100644 src/qhull/src/libqhullcpp/QhullQh.cpp delete mode 100644 src/qhull/src/libqhullcpp/QhullQh.h delete mode 100644 src/qhull/src/libqhullcpp/QhullRidge.cpp delete mode 100644 src/qhull/src/libqhullcpp/QhullRidge.h delete mode 100644 src/qhull/src/libqhullcpp/QhullSet.cpp delete mode 100644 src/qhull/src/libqhullcpp/QhullSet.h delete mode 100644 src/qhull/src/libqhullcpp/QhullSets.h delete mode 100644 src/qhull/src/libqhullcpp/QhullStat.cpp delete mode 100644 src/qhull/src/libqhullcpp/QhullStat.h delete mode 100644 src/qhull/src/libqhullcpp/QhullVertex.cpp delete mode 100644 src/qhull/src/libqhullcpp/QhullVertex.h delete mode 100644 src/qhull/src/libqhullcpp/QhullVertexSet.cpp delete mode 100644 src/qhull/src/libqhullcpp/QhullVertexSet.h delete mode 100644 src/qhull/src/libqhullcpp/RboxPoints.cpp delete mode 100644 src/qhull/src/libqhullcpp/RboxPoints.h delete mode 100644 src/qhull/src/libqhullcpp/RoadError.cpp delete mode 100644 src/qhull/src/libqhullcpp/RoadError.h delete mode 100644 src/qhull/src/libqhullcpp/RoadLogEvent.cpp delete mode 100644 src/qhull/src/libqhullcpp/RoadLogEvent.h delete mode 100644 src/qhull/src/libqhullcpp/functionObjects.h delete mode 100644 src/qhull/src/libqhullcpp/libqhullcpp.pro delete mode 100644 src/qhull/src/libqhullcpp/qt-qhull.cpp delete mode 100644 src/qhull/src/libqhullcpp/usermem_r-cpp.cpp delete mode 100644 src/qhull/src/libqhullstatic/libqhullstatic.pro delete mode 100644 src/qhull/src/libqhullstatic_r/libqhullstatic_r.pro delete mode 100644 src/qhull/src/qconvex/qconvex.c delete mode 100644 src/qhull/src/qconvex/qconvex.pro delete mode 100644 src/qhull/src/qconvex/qconvex_r.c delete mode 100644 src/qhull/src/qdelaunay/qdelaun.c delete mode 100644 src/qhull/src/qdelaunay/qdelaun_r.c delete mode 100644 src/qhull/src/qdelaunay/qdelaunay.pro delete mode 100644 src/qhull/src/qhalf/qhalf.c delete mode 100644 src/qhull/src/qhalf/qhalf.pro delete mode 100644 src/qhull/src/qhalf/qhalf_r.c delete mode 100644 src/qhull/src/qhull-all.pro delete mode 100644 src/qhull/src/qhull-app-c.pri delete mode 100644 src/qhull/src/qhull-app-c_r.pri delete mode 100644 src/qhull/src/qhull-app-cpp.pri delete mode 100644 src/qhull/src/qhull-app-shared.pri delete mode 100644 src/qhull/src/qhull-app-shared_r.pri delete mode 100644 src/qhull/src/qhull-libqhull-src.pri delete mode 100644 src/qhull/src/qhull-libqhull-src_r.pri delete mode 100644 src/qhull/src/qhull-warn.pri delete mode 100644 src/qhull/src/qhull/qhull.pro delete mode 100644 src/qhull/src/qhull/unix.c delete mode 100644 src/qhull/src/qhull/unix_r.c delete mode 100644 src/qhull/src/qhulltest/Coordinates_test.cpp delete mode 100644 src/qhull/src/qhulltest/PointCoordinates_test.cpp delete mode 100644 src/qhull/src/qhulltest/QhullFacetList_test.cpp delete mode 100644 src/qhull/src/qhulltest/QhullFacetSet_test.cpp delete mode 100644 src/qhull/src/qhulltest/QhullFacet_test.cpp delete mode 100644 src/qhull/src/qhulltest/QhullHyperplane_test.cpp delete mode 100644 src/qhull/src/qhulltest/QhullLinkedList_test.cpp delete mode 100644 src/qhull/src/qhulltest/QhullPointSet_test.cpp delete mode 100644 src/qhull/src/qhulltest/QhullPoint_test.cpp delete mode 100644 src/qhull/src/qhulltest/QhullPoints_test.cpp delete mode 100644 src/qhull/src/qhulltest/QhullRidge_test.cpp delete mode 100644 src/qhull/src/qhulltest/QhullSet_test.cpp delete mode 100644 src/qhull/src/qhulltest/QhullVertexSet_test.cpp delete mode 100644 src/qhull/src/qhulltest/QhullVertex_test.cpp delete mode 100644 src/qhull/src/qhulltest/Qhull_test.cpp delete mode 100644 src/qhull/src/qhulltest/RboxPoints_test.cpp delete mode 100644 src/qhull/src/qhulltest/RoadTest.cpp delete mode 100644 src/qhull/src/qhulltest/RoadTest.h delete mode 100644 src/qhull/src/qhulltest/qhulltest.cpp delete mode 100644 src/qhull/src/qhulltest/qhulltest.pro delete mode 100644 src/qhull/src/qvoronoi/qvoronoi.c delete mode 100644 src/qhull/src/qvoronoi/qvoronoi.pro delete mode 100644 src/qhull/src/qvoronoi/qvoronoi_r.c delete mode 100644 src/qhull/src/rbox/rbox.c delete mode 100644 src/qhull/src/rbox/rbox.pro delete mode 100644 src/qhull/src/rbox/rbox_r.c delete mode 100644 src/qhull/src/testqset/testqset.c delete mode 100644 src/qhull/src/testqset/testqset.pro delete mode 100644 src/qhull/src/testqset_r/testqset_r.c delete mode 100644 src/qhull/src/testqset_r/testqset_r.pro delete mode 100644 src/qhull/src/user_eg/user_eg.c delete mode 100644 src/qhull/src/user_eg/user_eg.pro delete mode 100644 src/qhull/src/user_eg/user_eg_r.c delete mode 100644 src/qhull/src/user_eg2/user_eg2.c delete mode 100644 src/qhull/src/user_eg2/user_eg2.pro delete mode 100644 src/qhull/src/user_eg2/user_eg2_r.c delete mode 100644 src/qhull/src/user_eg3/user_eg3.pro delete mode 100644 src/qhull/src/user_eg3/user_eg3_r.cpp create mode 100644 src/slic3r/GUI/CameraUtils.cpp create mode 100644 src/slic3r/GUI/CameraUtils.hpp create mode 100644 src/slic3r/GUI/CoordAxes.cpp create mode 100644 src/slic3r/GUI/CoordAxes.hpp delete mode 100644 src/slic3r/GUI/DoubleSlider_Utils.hpp create mode 100644 src/slic3r/GUI/Downloader.cpp create mode 100644 src/slic3r/GUI/Downloader.hpp create mode 100644 src/slic3r/GUI/DownloaderFileGet.cpp create mode 100644 src/slic3r/GUI/DownloaderFileGet.hpp create mode 100644 src/slic3r/GUI/FileArchiveDialog.cpp create mode 100644 src/slic3r/GUI/FileArchiveDialog.hpp create mode 100644 src/slic3r/GUI/GUI_Geometry.cpp create mode 100644 src/slic3r/GUI/GUI_Geometry.hpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoSlaBase.cpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoSlaBase.hpp create mode 100644 src/slic3r/GUI/IconManager.cpp create mode 100644 src/slic3r/GUI/IconManager.hpp create mode 100644 src/slic3r/GUI/Jobs/BoostThreadWorker.cpp create mode 100644 src/slic3r/GUI/Jobs/BoostThreadWorker.hpp create mode 100644 src/slic3r/GUI/Jobs/BusyCursorJob.hpp create mode 100644 src/slic3r/GUI/Jobs/CreateFontNameImageJob.cpp create mode 100644 src/slic3r/GUI/Jobs/CreateFontNameImageJob.hpp create mode 100644 src/slic3r/GUI/Jobs/CreateFontStyleImagesJob.cpp create mode 100644 src/slic3r/GUI/Jobs/CreateFontStyleImagesJob.hpp create mode 100644 src/slic3r/GUI/Jobs/EmbossJob.cpp create mode 100644 src/slic3r/GUI/Jobs/EmbossJob.hpp delete mode 100644 src/slic3r/GUI/Jobs/Job.cpp delete mode 100644 src/slic3r/GUI/Jobs/PlaterJob.cpp delete mode 100644 src/slic3r/GUI/Jobs/PlaterJob.hpp create mode 100644 src/slic3r/GUI/Jobs/PlaterWorker.hpp create mode 100644 src/slic3r/GUI/Jobs/SLAImportDialog.hpp create mode 100644 src/slic3r/GUI/Jobs/ThreadSafeQueue.hpp create mode 100644 src/slic3r/GUI/Jobs/UIThreadWorker.hpp create mode 100644 src/slic3r/GUI/Jobs/Worker.hpp create mode 100644 src/slic3r/GUI/SceneRaycaster.cpp create mode 100644 src/slic3r/GUI/SceneRaycaster.hpp create mode 100644 src/slic3r/GUI/SurfaceDrag.cpp create mode 100644 src/slic3r/GUI/SurfaceDrag.hpp create mode 100644 src/slic3r/Utils/AppUpdater.cpp create mode 100644 src/slic3r/Utils/AppUpdater.hpp create mode 100644 src/slic3r/Utils/EmbossStyleManager.cpp create mode 100644 src/slic3r/Utils/EmbossStyleManager.hpp create mode 100644 src/slic3r/Utils/EmbossStylesSerializable.cpp create mode 100644 src/slic3r/Utils/EmbossStylesSerializable.hpp create mode 100644 src/slic3r/Utils/FontConfigHelp.cpp create mode 100644 src/slic3r/Utils/FontConfigHelp.hpp create mode 100644 src/slic3r/Utils/MacUtils.mm delete mode 100644 src/slic3r/Utils/Profile.hpp create mode 100644 src/slic3r/Utils/RaycastManager.cpp create mode 100644 src/slic3r/Utils/RaycastManager.hpp create mode 100644 src/slic3r/Utils/WinRegistry.cpp create mode 100644 src/slic3r/Utils/WinRegistry.hpp create mode 100644 src/slic3r/Utils/WxFontUtils.cpp create mode 100644 src/slic3r/Utils/WxFontUtils.hpp create mode 100644 src/tcbspan/README.md create mode 100644 src/tcbspan/span.hpp delete mode 100644 t/angles.t delete mode 100644 t/avoid_crossing_perimeters.t delete mode 100644 t/bridges.t delete mode 100644 t/clean_polylines.t delete mode 100644 t/collinear.t delete mode 100644 t/combineinfill.t delete mode 100644 t/config.t delete mode 100644 t/cooling.t delete mode 100644 t/custom_gcode.t delete mode 100644 t/dynamic.t delete mode 100644 t/fill.t delete mode 100644 t/flow.t delete mode 100644 t/gaps.t delete mode 100644 t/loops.t delete mode 100644 t/multi.t delete mode 100644 t/perimeters.t delete mode 100644 t/polyclip.t delete mode 100644 t/print.t delete mode 100644 t/shells.t delete mode 100644 t/slice.t delete mode 100644 t/support.t delete mode 100644 t/thin.t create mode 100644 tests/data/U_overhang.obj create mode 100644 tests/data/contour_ALIENATO.TTF_glyph_i.svg create mode 100644 tests/data/contour_Allura_Script.ttf_glyph_m.svg create mode 100644 tests/data/points_close_to_line.svg create mode 100644 tests/fff_print/test_avoid_crossing_perimeters.cpp create mode 100644 tests/fff_print/test_bridges.cpp create mode 100644 tests/fff_print/test_cooling.cpp create mode 100644 tests/fff_print/test_custom_gcode.cpp create mode 100644 tests/fff_print/test_gaps.cpp create mode 100644 tests/fff_print/test_multi.cpp create mode 100644 tests/fff_print/test_perimeters.cpp create mode 100644 tests/fff_print/test_shells.cpp create mode 100644 tests/fff_print/test_thin_walls.cpp create mode 100644 tests/libslic3r/test_astar.cpp create mode 100644 tests/libslic3r/test_color.cpp create mode 100644 tests/libslic3r/test_curve_fitting.cpp create mode 100644 tests/libslic3r/test_cut_surface.cpp create mode 100644 tests/libslic3r/test_emboss.cpp create mode 100644 tests/libslic3r/test_expolygon.cpp create mode 100644 tests/libslic3r/test_jump_point_search.cpp create mode 100644 tests/libslic3r/test_kdtreeindirect.cpp create mode 100644 tests/libslic3r/test_polyline.cpp create mode 100644 tests/libslic3r/test_quadric_edge_collapse.cpp create mode 100644 tests/libslic3r/test_region_expansion.cpp create mode 100644 tests/libslic3r/test_surface_mesh.cpp create mode 100644 tests/libslic3r/test_triangulation.cpp create mode 100644 tests/libslic3r/test_utils.cpp create mode 100644 tests/sla_print/sla_archive_readwrite_tests.cpp create mode 100644 tests/sla_print/sla_supptreeutils_tests.cpp create mode 100644 tests/slic3rutils/slic3r_jobs_tests.cpp create mode 100644 tests/slic3rutils/slic3r_version_tests.cpp delete mode 100644 xs/t/01_trianglemesh.t delete mode 100644 xs/t/04_expolygon.t delete mode 100644 xs/t/05_surface.t delete mode 100644 xs/t/06_polygon.t delete mode 100644 xs/t/07_extrusionpath.t delete mode 100644 xs/t/08_extrusionloop.t delete mode 100644 xs/t/12_extrusionpathcollection.t delete mode 100644 xs/t/13_polylinecollection.t delete mode 100644 xs/t/17_boundingbox.t delete mode 100644 xs/xsp/BoundingBox.xsp delete mode 100644 xs/xsp/BridgeDetector.xsp delete mode 100644 xs/xsp/Clipper.xsp delete mode 100644 xs/xsp/ExPolygonCollection.xsp delete mode 100644 xs/xsp/ExtrusionEntityCollection.xsp delete mode 100644 xs/xsp/ExtrusionLoop.xsp delete mode 100644 xs/xsp/ExtrusionMultiPath.xsp delete mode 100644 xs/xsp/ExtrusionPath.xsp delete mode 100644 xs/xsp/ExtrusionSimulator.xsp delete mode 100644 xs/xsp/Filler.xsp delete mode 100644 xs/xsp/Flow.xsp delete mode 100644 xs/xsp/GCode.xsp delete mode 100644 xs/xsp/GCodeSender.xsp delete mode 100644 xs/xsp/Layer.xsp delete mode 100644 xs/xsp/PerimeterGenerator.xsp delete mode 100644 xs/xsp/PlaceholderParser.xsp delete mode 100644 xs/xsp/PolylineCollection.xsp delete mode 100644 xs/xsp/Surface.xsp delete mode 100644 xs/xsp/SurfaceCollection.xsp diff --git a/.clang-format b/.clang-format index 440c89ec571..42ac9f1a076 100644 --- a/.clang-format +++ b/.clang-format @@ -13,8 +13,8 @@ AllowAllParametersOfDeclarationOnNextLine: true AllowShortBlocksOnASingleLine: true AllowShortCaseLabelsOnASingleLine: true AllowShortFunctionsOnASingleLine: All -AllowShortIfStatementsOnASingleLine: true -AllowShortLoopsOnASingleLine: true +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false AlwaysBreakAfterDefinitionReturnType: None AlwaysBreakAfterReturnType: None AlwaysBreakBeforeMultilineStrings: false @@ -46,7 +46,7 @@ BreakConstructorInitializersBeforeComma: false BreakConstructorInitializers: BeforeComma BreakAfterJavaFieldAnnotations: false BreakStringLiterals: true -ColumnLimit: 78 +ColumnLimit: 140 CommentPragmas: '^ IWYU pragma:' CompactNamespaces: true ConstructorInitializerAllOnOneLineOrOnePerLine: true diff --git a/.github/ISSUE_TEMPLATE/bug_report_form.yml b/.github/ISSUE_TEMPLATE/bug_report_form.yml new file mode 100644 index 00000000000..cb355444735 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report_form.yml @@ -0,0 +1,65 @@ +name: Bug Report +description: File a bug report +body: + - type: markdown + attributes: + value: | + Before filing, please check if the issue already exists (either open or closed) by using the search bar on the issues page. If it does, comment there. Even if it's closed, we can reopen it based on your comment. + - type: textarea + id: what-happened + attributes: + label: Description of the bug + description: What happened? Please, enclose a screenshot whenever possible (even when you think the description is clear). What did you expect to happen? In case of 3D rendering issues, please attach the content of menu Help -> System Info dialog. + placeholder: | + What is the problem? + What did you expect? + You paste or drop screenshots here + validations: + required: true + - type: textarea + id: to_reproduce + attributes: + label: Project file & How to reproduce + description: "*Please* upload a ZIP archive containing the project file used when the problem arise. Please export it just before the problem occurs. Even if you did nothing and/or there is no object, export it! (it contains your current configuration)." + placeholder: | + `File`->`Save project as...` then zip it & drop it here + Also, if needed include the steps to reproduce the bug: + 1. Go to '...' + 2. Click on '....' + 3. Scroll down to '....' + 4. See error + validations: + required: true + - type: checkboxes + attributes: + label: Checklist of files included above + options: + - label: Project file + - label: Screenshot + validations: + required: true + - type: input + id: version + attributes: + label: Version of PrusaSlicer + description: What version of PrusaSlicer are you running? You can see the full version in `Help` -> `About PrusaSlicer`. + placeholder: e.g. 2.4.1-alpha2-win64 / 2.3.3-linux / 2.4.1-alpha0+61-win64-gcd2459455 ... + validations: + required: true + - type: input + id: os + attributes: + label: Operating system + description: with the version if possible + placeholder: e.g. Windows 7/8/10/11 ... , Ubuntu 22.04/Debian ... , macOS 10.15/11.1 ... + validations: + required: true + - type: input + id: printer + attributes: + label: Printer model + description: Please, fill this in even when it seems irrelevant. + placeholder: voron 2.4 with afterburner + validations: + required: true + diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000000..a392acbb2e2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,12 @@ +contact_links: + - name: Do you need Support? + url: https://www.prusa3d.com/page/prusaslicer-support-form_233563/ + about: If you are not sure whether what you are reporting is a bug, please contact our support team first. We are providing full 24/7 customer support. + - name: PrusaSlicer Manual + url: https://help.prusa3d.com/en/article/customer-support_2287/ + about: We have a comprehensive customer support page and help documentation that could be helpful for troubleshooting. + - name: PrusaPrinters Forum + url: https://forum.prusaprinters.org/forum/prusaslicer/ + about: Please get in touch on our PrusaPrinters Community Forum! (Not an official support channel.) + +blank_issues_enabled: false diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000000..aed18468720 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe how it would work** +Be as descriptive as your skill level allows you. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or paint drawing about the feature request here. diff --git a/.gitignore b/.gitignore index e3a9db477f8..704289a2204 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ local-lib build-linux/* deps/build-linux/* **/.DS_Store +**/.idea/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 449f7539da4..e19d3147bf8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,12 +27,12 @@ option(SLIC3R_STATIC "Compile PrusaSlicer with static libraries (Boost, TBB, option(SLIC3R_GUI "Compile PrusaSlicer with GUI components (OpenGL, wxWidgets)" 1) option(SLIC3R_FHS "Assume PrusaSlicer is to be installed in a FHS directory structure" 0) option(SLIC3R_WX_STABLE "Build against wxWidgets stable (3.0) as oppsed to dev (3.1) on Linux" 0) -option(SLIC3R_PROFILE "Compile PrusaSlicer with an invasive Shiny profiler" 0) option(SLIC3R_PCH "Use precompiled headers" 1) option(SLIC3R_MSVC_COMPILE_PARALLEL "Compile on Visual Studio in parallel" 1) option(SLIC3R_MSVC_PDB "Generate PDB files on MSVC in Release mode" 1) option(SLIC3R_PERL_XS "Compile XS Perl module and enable Perl unit and integration tests" 0) option(SLIC3R_ASAN "Enable ASan on Clang and GCC" 0) +option(SLIC3R_UBSAN "Enable UBSan on Clang and GCC" 0) option(SLIC3R_ENABLE_FORMAT_STEP "Enable compilation of STEP file support" 1) # If SLIC3R_FHS is 1 -> SLIC3R_DESKTOP_INTEGRATION is always 0, othrewise variable. CMAKE_DEPENDENT_OPTION(SLIC3R_DESKTOP_INTEGRATION "Allow perfoming desktop integration during runtime" 1 "NOT SLIC3R_FHS" 0) @@ -43,6 +43,14 @@ set(SLIC3R_GTK "2" CACHE STRING "GTK version to use with wxWidgets on Linux") set(IS_CROSS_COMPILE FALSE) +if (SLIC3R_STATIC) + # Prefer config scripts over find modules. This is helpful when building with + # the static dependencies. Many libraries have their own export scripts + # while having a Find module in standard cmake installation. + # (e.g. CURL) + set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON) +endif () + if (APPLE) set(CMAKE_FIND_FRAMEWORK LAST) set(CMAKE_FIND_APPBUNDLE LAST) @@ -106,6 +114,8 @@ if (MSVC) # C4244: 'conversion' conversion from 'type1' to 'type2', possible loss of data. An integer type is converted to a smaller integer type. # C4267: The compiler detected a conversion from size_t to a smaller type. add_compile_options(/wd4244 /wd4267) + # Enforce strict C++ conformance, so our code that compiles on MSVC also compiles on GCC and clang. + add_compile_options(/permissive-) endif () if (MINGW) @@ -240,6 +250,11 @@ if (NOT MSVC AND ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMP add_compile_options(-Wno-deprecated-declarations) endif() + # Clang reports misleading indentation for some IF blocks because of mixing tabs with spaces. + if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") + add_compile_options(-Wno-misleading-indentation) + endif() + #GCC generates loads of -Wunknown-pragmas when compiling igl. The fix is not easy due to a bug in gcc, see # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66943 or # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53431 @@ -267,6 +282,32 @@ if (SLIC3R_ASAN) endif () endif () +if (SLIC3R_UBSAN) + # Stacktrace for every report is enabled by default. It can be disabled by running PrusaSlicer with "UBSAN_OPTIONS=print_stacktrace=0". + + # Define macro SLIC3R_UBSAN to allow detection in the source code if this sanitizer is enabled. + add_compile_definitions(SLIC3R_UBSAN) + + # Clang supports much more useful checks than GCC, so when Clang is detected, another checks will be enabled. + # List of what GCC is checking: https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html + # List of what Clang is checking: https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html + if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + set(_ubsan_flags "-fsanitize=undefined,integer") + else () + set(_ubsan_flags "-fsanitize=undefined") + endif () + + add_compile_options(${_ubsan_flags} -fno-omit-frame-pointer) + + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${_ubsan_flags}") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${_ubsan_flags}") + set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${_ubsan_flags}") + + if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lubsan") + endif () +endif () + if (APPLE) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror=partial-availability -Werror=unguarded-availability -Werror=unguarded-availability-new") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=partial-availability -Werror=unguarded-availability -Werror=unguarded-availability-new") @@ -296,25 +337,6 @@ add_definitions(-DwxUSE_UNICODE -D_UNICODE -DUNICODE -DWXINTL_NO_GETTEXT_MACRO) # Disable unsafe implicit wxString to const char* / std::string and vice versa. This implicit conversion breaks the UTF-8 encoding quite often. add_definitions(-DwxNO_UNSAFE_WXSTRING_CONV) -if (SLIC3R_PROFILE) - message("PrusaSlicer will be built with a Shiny invasive profiler") - add_definitions(-DSLIC3R_PROFILE) -endif () - -# Disable optimization even with debugging on. -if (0) - message(STATUS "Perl compiled without optimization. Disabling optimization for the PrusaSlicer build.") - message("Old CMAKE_CXX_FLAGS_RELEASE: ${CMAKE_CXX_FLAGS_RELEASE}") - message("Old CMAKE_CXX_FLAGS_RELWITHDEBINFO: ${CMAKE_CXX_FLAGS_RELEASE}") - message("Old CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS_RELEASE}") - set(CMAKE_CXX_FLAGS_RELEASE "/MD /Od /Zi /EHsc /DWIN32 /DTBB_USE_ASSERT") - set(CMAKE_C_FLAGS_RELEASE "/MD /Od /Zi /DWIN32 /DTBB_USE_ASSERT") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/MD /Od /Zi /EHsc /DWIN32 /DTBB_USE_ASSERT") - set(CMAKE_C_FLAGS_RELWITHDEBINFO "/MD /Od /Zi /DWIN32 /DTBB_USE_ASSERT") - set(CMAKE_CXX_FLAGS "/MD /Od /Zi /EHsc /DWIN32 /DTBB_USE_ASSERT") - set(CMAKE_C_FLAGS "/MD /Od /Zi /DWIN32 /DTBB_USE_ASSERT") -endif() - # Find and configure boost if(SLIC3R_STATIC) # Use static boost libraries. @@ -383,6 +405,7 @@ if(SLIC3R_STATIC) endif() set(TBB_DEBUG 1) find_package(TBB REQUIRED) +slic3r_remap_configs(TBB::tbb RelWithDebInfo Release) # include_directories(${TBB_INCLUDE_DIRS}) # add_definitions(${TBB_DEFINITIONS}) # if(MSVC) @@ -422,6 +445,14 @@ include_directories(BEFORE SYSTEM ${EIGEN3_INCLUDE_DIR}) # no matter what. find_package(EXPAT REQUIRED) +add_library(libexpat INTERFACE) + +if (TARGET EXPAT::EXPAT ) + target_link_libraries(libexpat INTERFACE EXPAT::EXPAT) +elseif(TARGET expat::expat) + target_link_libraries(libexpat INTERFACE expat::expat) +endif () + find_package(PNG REQUIRED) set(OpenGL_GL_PREFERENCE "LEGACY") @@ -433,19 +464,16 @@ if (SLIC3R_STATIC AND NOT SLIC3R_STATIC_EXCLUDE_GLEW) set(GLEW_VERBOSE ON) endif() -find_package(GLEW) -if (NOT TARGET GLEW::GLEW) - message(STATUS "GLEW not found, using bundled version.") - add_library(glew STATIC ${LIBDIR}/glew/src/glew.c) - set(GLEW_FOUND TRUE) - set(GLEW_INCLUDE_DIRS ${LIBDIR}/glew/include/) - target_compile_definitions(glew PUBLIC GLEW_STATIC) - target_include_directories(glew PUBLIC ${GLEW_INCLUDE_DIRS}) - add_library(GLEW::GLEW ALIAS glew) -endif () +find_package(GLEW REQUIRED) # Find the Cereal serialization library find_package(cereal REQUIRED) +add_library(libcereal INTERFACE) +if (NOT TARGET cereal::cereal) + target_link_libraries(libcereal INTERFACE cereal) +else() + target_link_libraries(libcereal INTERFACE cereal::cereal) +endif() # l10n set(L10N_DIR "${SLIC3R_RESOURCES_DIR}/localization") diff --git a/build_win.bat b/build_win.bat index de5030ee502..3dbdb0ad6ef 100644 --- a/build_win.bat +++ b/build_win.bat @@ -164,6 +164,9 @@ IF NOT EXIST "%MSVC_DIR%" ( @ECHO ERROR: Compatible Visual Studio installation not found. 1>&2 GOTO :HELP ) +REM Cmake always defaults to latest supported MSVC generator. Let's make sure it uses what we select. +FOR /F "tokens=* USEBACKQ" %%I IN (`^""%VSWHERE%" %MSVC_FILTER% -nologo -property catalog_productLineVersion^"`) DO SET PS_PRODUCT_VERSION=%%I + REM Give the user a chance to cancel if we found something odd. IF "%PS_ASK_TO_CONTINUE%" EQU "" GOTO :BUILD_ENV @ECHO. @@ -183,6 +186,7 @@ SET PS_CURRENT_STEP=environment @ECHO ** Deps path: %PS_DESTDIR% @ECHO ** Using Microsoft Visual Studio installation found at: @ECHO ** %MSVC_DIR% +SET CMAKE_GENERATOR=Visual Studio %PS_VERSION% %PS_PRODUCT_VERSION% CALL "%MSVC_DIR%\Common7\Tools\vsdevcmd.bat" -arch=%PS_ARCH% -host_arch=%PS_ARCH_HOST% -app_platform=Desktop IF %ERRORLEVEL% NEQ 0 GOTO :END REM Need to reset the echo state after vsdevcmd.bat clobbers it. diff --git a/cmake/modules/FindGLEW.cmake b/cmake/modules/FindGLEW.cmake index 5a2a9b83521..7cf950d3873 100644 --- a/cmake/modules/FindGLEW.cmake +++ b/cmake/modules/FindGLEW.cmake @@ -1,351 +1,20 @@ -# Distributed under the OSI-approved BSD 3-Clause License. See accompanying -# file Copyright.txt or https://cmake.org/licensing for details. - -# PrusaSlicer specifics: -# This file is backported from CMake 3.15 distribution to behave uniformly -# across all versions of CMake. It explicitly adds GLEW_STATIC complile -# definition to static targets which is needed to prevent link errors. - -#[=======================================================================[.rst: -FindGLEW --------- - -Find the OpenGL Extension Wrangler Library (GLEW) - -Input Variables -^^^^^^^^^^^^^^^ - -The following variables may be set to influence this module’s behavior: - -``GLEW_USE_STATIC_LIBS`` - to find and create :prop_tgt:`IMPORTED` target for static linkage. - -``GLEW_VERBOSE`` - to output a detailed log of this module. - -Imported Targets -^^^^^^^^^^^^^^^^ - -This module defines the following :ref:`Imported Targets `: - - -``GLEW::glew`` - The GLEW shared library. -``GLEW::glew_s`` - The GLEW static library, if ``GLEW_USE_STATIC_LIBS`` is set to ``TRUE``. -``GLEW::GLEW`` - Duplicates either ``GLEW::glew`` or ``GLEW::glew_s`` based on availability. - -Result Variables -^^^^^^^^^^^^^^^^ - -This module defines the following variables: - -``GLEW_INCLUDE_DIRS`` - include directories for GLEW -``GLEW_LIBRARIES`` - libraries to link against GLEW -``GLEW_SHARED_LIBRARIES`` - libraries to link against shared GLEW -``GLEW_STATIC_LIBRARIES`` - libraries to link against static GLEW -``GLEW_FOUND`` - true if GLEW has been found and can be used -``GLEW_VERSION`` - GLEW version -``GLEW_VERSION_MAJOR`` - GLEW major version -``GLEW_VERSION_MINOR`` - GLEW minor version -``GLEW_VERSION_MICRO`` - GLEW micro version - -#]=======================================================================] - -include(FindPackageHandleStandardArgs) - -find_package(GLEW CONFIG QUIET) - -if(GLEW_FOUND) - find_package_handle_standard_args(GLEW DEFAULT_MSG GLEW_CONFIG) - return() +set(_q "") +if(GLEW_FIND_QUIETLY) + set(_q QUIET) endif() +find_package(GLEW ${GLEW_FIND_VERSION} CONFIG ${_q}) -if(GLEW_VERBOSE) - message(STATUS "FindGLEW: did not find GLEW CMake config file. Searching for libraries.") -endif() - -if(APPLE) - find_package(OpenGL QUIET) - - if(OpenGL_FOUND) - if(GLEW_VERBOSE) - message(STATUS "FindGLEW: Found OpenGL Framework.") - message(STATUS "FindGLEW: OPENGL_LIBRARIES: ${OPENGL_LIBRARIES}") +if(NOT GLEW_FIND_QUIETLY) + if (NOT GLEW_FOUND) + message(STATUS "Falling back to MODULE search for GLEW...") + else() + message(STATUS "GLEW found in ${GLEW_DIR}") endif() - else() - if(GLEW_VERBOSE) - message(STATUS "FindGLEW: could not find GLEW library.") - endif() - return() - endif() -endif() - - -function(__glew_set_find_library_suffix shared_or_static) - if((UNIX AND NOT APPLE) AND "${shared_or_static}" MATCHES "SHARED") - set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" PARENT_SCOPE) - elseif((UNIX AND NOT APPLE) AND "${shared_or_static}" MATCHES "STATIC") - set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" PARENT_SCOPE) - elseif(APPLE AND "${shared_or_static}" MATCHES "SHARED") - set(CMAKE_FIND_LIBRARY_SUFFIXES ".dylib;.so" PARENT_SCOPE) - elseif(APPLE AND "${shared_or_static}" MATCHES "STATIC") - set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" PARENT_SCOPE) - elseif(WIN32 AND "${shared_or_static}" MATCHES "SHARED") - set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib" PARENT_SCOPE) - elseif(WIN32 AND "${shared_or_static}" MATCHES "STATIC") - set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib;.a;.dll.a" PARENT_SCOPE) - endif() - - if(GLEW_VERBOSE) - message(STATUS "FindGLEW: CMAKE_FIND_LIBRARY_SUFFIXES for ${shared_or_static}: ${CMAKE_FIND_LIBRARY_SUFFIXES}") - endif() -endfunction() - - -if(GLEW_VERBOSE) - if(DEFINED GLEW_USE_STATIC_LIBS) - message(STATUS "FindGLEW: GLEW_USE_STATIC_LIBS: ${GLEW_USE_STATIC_LIBS}.") - else() - message(STATUS "FindGLEW: GLEW_USE_STATIC_LIBS is undefined. Treated as FALSE.") - endif() -endif() - -find_path(GLEW_INCLUDE_DIR GL/glew.h) -mark_as_advanced(GLEW_INCLUDE_DIR) - -set(GLEW_INCLUDE_DIRS ${GLEW_INCLUDE_DIR}) - -if(GLEW_VERBOSE) - message(STATUS "FindGLEW: GLEW_INCLUDE_DIR: ${GLEW_INCLUDE_DIR}") - message(STATUS "FindGLEW: GLEW_INCLUDE_DIRS: ${GLEW_INCLUDE_DIRS}") -endif() - -if("${CMAKE_GENERATOR_PLATFORM}" MATCHES "x64" OR "${CMAKE_GENERATOR}" MATCHES "Win64") - set(_arch "x64") -else() - set(_arch "Win32") -endif() - - -set(__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) - -__glew_set_find_library_suffix(SHARED) - -find_library(GLEW_SHARED_LIBRARY_RELEASE - NAMES GLEW glew glew32 - PATH_SUFFIXES lib lib64 libx32 lib/Release/${_arch} - PATHS ENV GLEW_ROOT) - -find_library(GLEW_SHARED_LIBRARY_DEBUG - NAMES GLEWd glewd glew32d - PATH_SUFFIXES lib lib64 - PATHS ENV GLEW_ROOT) - - -__glew_set_find_library_suffix(STATIC) - -find_library(GLEW_STATIC_LIBRARY_RELEASE - NAMES GLEW glew glew32s - PATH_SUFFIXES lib lib64 libx32 lib/Release/${_arch} - PATHS ENV GLEW_ROOT) - -find_library(GLEW_STATIC_LIBRARY_DEBUG - NAMES GLEWds glewd glewds glew32ds - PATH_SUFFIXES lib lib64 - PATHS ENV GLEW_ROOT) - -set(CMAKE_FIND_LIBRARY_SUFFIXES ${__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES}) -unset(__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES) - -include(SelectLibraryConfigurations) - -select_library_configurations(GLEW_SHARED) -select_library_configurations(GLEW_STATIC) - -if(NOT GLEW_USE_STATIC_LIBS) - set(GLEW_LIBRARIES ${GLEW_SHARED_LIBRARY}) -else() - set(GLEW_LIBRARIES ${GLEW_STATIC_LIBRARY}) endif() - -if(GLEW_VERBOSE) - message(STATUS "FindGLEW: GLEW_SHARED_LIBRARY_RELEASE: ${GLEW_SHARED_LIBRARY_RELEASE}") - message(STATUS "FindGLEW: GLEW_STATIC_LIBRARY_RELEASE: ${GLEW_STATIC_LIBRARY_RELEASE}") - message(STATUS "FindGLEW: GLEW_SHARED_LIBRARY_DEBUG: ${GLEW_SHARED_LIBRARY_DEBUG}") - message(STATUS "FindGLEW: GLEW_STATIC_LIBRARY_DEBUG: ${GLEW_STATIC_LIBRARY_DEBUG}") - message(STATUS "FindGLEW: GLEW_SHARED_LIBRARY: ${GLEW_SHARED_LIBRARY}") - message(STATUS "FindGLEW: GLEW_STATIC_LIBRARY: ${GLEW_STATIC_LIBRARY}") - message(STATUS "FindGLEW: GLEW_LIBRARIES: ${GLEW_LIBRARIES}") -endif() - - -# Read version from GL/glew.h file -if(EXISTS "${GLEW_INCLUDE_DIR}/GL/glew.h") - file(STRINGS "${GLEW_INCLUDE_DIR}/GL/glew.h" _contents REGEX "^VERSION_.+ [0-9]+") - if(_contents) - string(REGEX REPLACE ".*VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" GLEW_VERSION_MAJOR "${_contents}") - string(REGEX REPLACE ".*VERSION_MINOR[ \t]+([0-9]+).*" "\\1" GLEW_VERSION_MINOR "${_contents}") - string(REGEX REPLACE ".*VERSION_MICRO[ \t]+([0-9]+).*" "\\1" GLEW_VERSION_MICRO "${_contents}") - set(GLEW_VERSION "${GLEW_VERSION_MAJOR}.${GLEW_VERSION_MINOR}.${GLEW_VERSION_MICRO}") - endif() -endif() - -if(GLEW_VERBOSE) - message(STATUS "FindGLEW: GLEW_VERSION_MAJOR: ${GLEW_VERSION_MAJOR}") - message(STATUS "FindGLEW: GLEW_VERSION_MINOR: ${GLEW_VERSION_MINOR}") - message(STATUS "FindGLEW: GLEW_VERSION_MICRO: ${GLEW_VERSION_MICRO}") - message(STATUS "FindGLEW: GLEW_VERSION: ${GLEW_VERSION}") -endif() - -find_package_handle_standard_args(GLEW - REQUIRED_VARS GLEW_INCLUDE_DIRS GLEW_LIBRARIES - VERSION_VAR GLEW_VERSION) - -if(NOT GLEW_FOUND) - if(GLEW_VERBOSE) - message(STATUS "FindGLEW: could not find GLEW library.") - endif() - return() -endif() - - -if(NOT TARGET GLEW::glew AND NOT GLEW_USE_STATIC_LIBS) - if(GLEW_VERBOSE) - message(STATUS "FindGLEW: Creating GLEW::glew imported target.") - endif() - - add_library(GLEW::glew UNKNOWN IMPORTED) - - set_target_properties(GLEW::glew - PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}") - - if(APPLE) - set_target_properties(GLEW::glew - PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL) - endif() - - if(GLEW_SHARED_LIBRARY_RELEASE) - set_property(TARGET GLEW::glew - APPEND - PROPERTY IMPORTED_CONFIGURATIONS RELEASE) - - set_target_properties(GLEW::glew - PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_SHARED_LIBRARY_RELEASE}") - endif() - - if(GLEW_SHARED_LIBRARY_DEBUG) - set_property(TARGET GLEW::glew - APPEND - PROPERTY IMPORTED_CONFIGURATIONS DEBUG) - - set_target_properties(GLEW::glew - PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_SHARED_LIBRARY_DEBUG}") - endif() - -elseif(NOT TARGET GLEW::glew_s AND GLEW_USE_STATIC_LIBS) - if(GLEW_VERBOSE) - message(STATUS "FindGLEW: Creating GLEW::glew_s imported target.") - endif() - - add_library(GLEW::glew_s UNKNOWN IMPORTED) - - set_target_properties(GLEW::glew_s - PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}") - - set_target_properties(GLEW::glew_s PROPERTIES INTERFACE_COMPILE_DEFINITIONS GLEW_STATIC) - - if(APPLE) - set_target_properties(GLEW::glew_s - PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL) - endif() - - if(GLEW_STATIC_LIBRARY_RELEASE) - set_property(TARGET GLEW::glew_s - APPEND - PROPERTY IMPORTED_CONFIGURATIONS RELEASE) - - set_target_properties(GLEW::glew_s - PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_STATIC_LIBRARY_RELEASE}") - endif() - - if(GLEW_STATIC_LIBRARY_DEBUG) - set_property(TARGET GLEW::glew_s - APPEND - PROPERTY IMPORTED_CONFIGURATIONS DEBUG) - - set_target_properties(GLEW::glew_s - PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_STATIC_LIBRARY_DEBUG}") - endif() -endif() - -if(NOT TARGET GLEW::GLEW) - if(GLEW_VERBOSE) - message(STATUS "FindGLEW: Creating GLEW::GLEW imported target.") - endif() - - add_library(GLEW::GLEW UNKNOWN IMPORTED) - - set_target_properties(GLEW::GLEW - PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}") - - if(APPLE) - set_target_properties(GLEW::GLEW - PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL) - endif() - - if(TARGET GLEW::glew) - if(GLEW_SHARED_LIBRARY_RELEASE) - set_property(TARGET GLEW::GLEW - APPEND - PROPERTY IMPORTED_CONFIGURATIONS RELEASE) - - set_target_properties(GLEW::GLEW - PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_SHARED_LIBRARY_RELEASE}") - endif() - - if(GLEW_SHARED_LIBRARY_DEBUG) - set_property(TARGET GLEW::GLEW - APPEND - PROPERTY IMPORTED_CONFIGURATIONS DEBUG) - - set_target_properties(GLEW::GLEW - PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_SHARED_LIBRARY_DEBUG}") - endif() - - elseif(TARGET GLEW::glew_s) - if(GLEW_STATIC_LIBRARY_RELEASE) - set_property(TARGET GLEW::GLEW - APPEND - PROPERTY IMPORTED_CONFIGURATIONS RELEASE) - - set_target_properties(GLEW::GLEW - PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_STATIC_LIBRARY_RELEASE}" - INTERFACE_COMPILE_DEFINITIONS GLEW_STATIC) - endif() - - if(GLEW_STATIC_LIBRARY_DEBUG AND GLEW_USE_STATIC_LIBS) - set_property(TARGET GLEW::GLEW - APPEND - PROPERTY IMPORTED_CONFIGURATIONS DEBUG) - - set_target_properties(GLEW::GLEW - PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_STATIC_LIBRARY_DEBUG}" - INTERFACE_COMPILE_DEFINITIONS GLEW_STATIC) - endif() - - elseif(GLEW_VERBOSE) - message(WARNING "FindGLEW: no `GLEW::glew` or `GLEW::glew_s` target was created. Something went wrong in FindGLEW target creation.") - endif() -endif() +if (NOT GLEW_FOUND) + set(_modpath ${CMAKE_MODULE_PATH}) + set(CMAKE_MODULE_PATH "") + include(FindGLEW) + set(CMAKE_MODULE_PATH ${_modpath}) +endif() \ No newline at end of file diff --git a/cmake/modules/FindTBB.cmake.in b/cmake/modules/FindTBB.cmake.in index a7eafa545f9..49e405c184e 100644 --- a/cmake/modules/FindTBB.cmake.in +++ b/cmake/modules/FindTBB.cmake.in @@ -293,7 +293,7 @@ if(NOT TBB_FOUND) # Create targets ################################## - if(NOT CMAKE_VERSION VERSION_LESS 3.0 AND TBB_FOUND) + if(NOT CMAKE_VERSION VERSION_LESS 3.0 AND TBB_FOUND AND NOT TARGET TBB::tbb) add_library(TBB::tbb UNKNOWN IMPORTED) set_target_properties(TBB::tbb PROPERTIES INTERFACE_COMPILE_DEFINITIONS "${TBB_DEFINITIONS}" diff --git a/deps/Boost/Boost.cmake b/deps/Boost/Boost.cmake index 971ce2c35d8..d819e28cf17 100644 --- a/deps/Boost/Boost.cmake +++ b/deps/Boost/Boost.cmake @@ -8,12 +8,10 @@ else() set(_build_cmd ./b2) endif() -set(_patch_command ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/common.jam ./tools/build/src/tools/common.jam) - if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - configure_file(${CMAKE_CURRENT_LIST_DIR}/user-config.jam boost-user-config.jam) set(_boost_toolset gcc) - set(_patch_command ${_patch_command} && ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/boost-user-config.jam ./tools/build/src/tools/user-config.jam) + configure_file(${CMAKE_CURRENT_LIST_DIR}/user-config.jam boost-user-config.jam) + set(_patch_command ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/boost-user-config.jam ./tools/build/src/tools/user-config.jam) elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") # https://cmake.org/cmake/help/latest/variable/MSVC_VERSION.html if (MSVC_VERSION EQUAL 1800) @@ -28,14 +26,21 @@ elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") elseif (MSVC_VERSION LESS 1930) # 1920-1929 = VS 16.0 (v142 toolset) set(_boost_toolset "msvc-14.2") + elseif (MSVC_VERSION LESS 1940) + # 1930-1939 = VS 17.0 (v143 toolset) + set(_boost_toolset "msvc-14.3") else () message(FATAL_ERROR "Unsupported MSVC version") endif () elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") if (WIN32) set(_boost_toolset "clang-win") - else() + elseif (APPLE) set(_boost_toolset "clang") + else() + set(_boost_toolset clang) + configure_file(${CMAKE_CURRENT_LIST_DIR}/user-config.jam boost-user-config.jam) + set(_patch_command ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/boost-user-config.jam ./tools/build/src/tools/user-config.jam) endif() elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel") set(_boost_toolset "intel") @@ -68,7 +73,7 @@ ProcessorCount(NPROC) file(TO_NATIVE_PATH ${DESTDIR}/usr/local/ _prefix) set(_boost_flags "") -if (UNIX) +if (UNIX) set(_boost_flags "cflags=-fPIC;cxxflags=-fPIC") endif () @@ -94,7 +99,7 @@ if (_cfg_rel GREATER -1 OR _cfg_relwdeb GREATER -1 OR _cfg_minsizerel GREATER -1 list(APPEND _boost_variants release) endif() -if (_cfg_deb GREATER -1 OR (MSVC AND ${DEP_DEBUG}) ) +if ( (NOT MSVC AND _cfg_deb GREATER -1) OR (MSVC AND ${DEP_DEBUG}) ) list(APPEND _boost_variants debug) endif() @@ -124,10 +129,16 @@ set(_build_cmd ${_build_cmd} set(_install_cmd ${_build_cmd} --prefix=${_prefix} install) +if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + # When Clang is used with enabled UndefinedBehaviorSanitizer, it produces "undefined reference to '__muloti4'" when __int128 is used. + # Because of that, UndefinedBehaviorSanitizer is disabled for those functions that use __int128. + list(APPEND _patch_command COMMAND ${PATCH_CMD} ${CMAKE_CURRENT_LIST_DIR}/Boost.patch) +endif () + ExternalProject_Add( dep_Boost - URL "https://boostorg.jfrog.io/artifactory/main/release/1.75.0/source/boost_1_75_0.tar.gz" - URL_HASH SHA256=aeb26f80e80945e82ee93e5939baebdca47b9dee80a07d3144be1e1a6a66dd6a + URL "https://boostorg.jfrog.io/artifactory/main/release/1.78.0/source/boost_1_78_0.zip" + URL_HASH SHA256=f22143b5528e081123c3c5ed437e92f648fe69748e95fa6e2bd41484e2986cc3 DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/Boost CONFIGURE_COMMAND "${_bootstrap_cmd}" PATCH_COMMAND ${_patch_command} @@ -154,4 +165,4 @@ if ("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8") ) # Only override boost::Polygon Voronoi implementation with Vojtech's GMP hacks on 64bit platforms. list(APPEND _dep_list "dep_boost_polygon") -endif () \ No newline at end of file +endif () diff --git a/deps/Boost/Boost.patch b/deps/Boost/Boost.patch new file mode 100644 index 00000000000..8c54430b961 --- /dev/null +++ b/deps/Boost/Boost.patch @@ -0,0 +1,23 @@ +diff -u ../boost_1_75_0-orig/boost/rational.hpp ./boost/rational.hpp +--- ../boost_1_75_0-orig/boost/rational.hpp 2020-12-03 06:02:19.000000000 +0100 ++++ ./boost/rational.hpp 2022-01-27 16:02:27.993848905 +0100 +@@ -302,6 +302,9 @@ + return *this; + } + template ++ #if defined(__clang__) ++ __attribute__((no_sanitize("undefined"))) ++ #endif + BOOST_CXX14_CONSTEXPR typename boost::enable_if_c::value, rational&>::type operator*= (const T& i) + { + // Avoid overflow and preserve normalization +@@ -311,6 +314,9 @@ + return *this; + } + template ++ #if defined(__clang__) ++ __attribute__((no_sanitize("undefined"))) ++ #endif + BOOST_CXX14_CONSTEXPR typename boost::enable_if_c::value, rational&>::type operator/= (const T& i) + { + // Avoid repeated construction diff --git a/deps/Boost/common.jam b/deps/Boost/common.jam deleted file mode 100644 index 75d995aa10d..00000000000 --- a/deps/Boost/common.jam +++ /dev/null @@ -1,1095 +0,0 @@ -# Copyright 2003, 2005 Dave Abrahams -# Copyright 2005, 2006 Rene Rivera -# Copyright 2005 Toon Knapen -# Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus -# Distributed under the Boost Software License, Version 1.0. -# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) - -# Provides actions common to all toolsets, such as creating directories and -# removing files. - -import os ; -import modules ; -import utility ; -import print ; -import type ; -import feature ; -import errors ; -import path ; -import sequence ; -import toolset ; -import virtual-target ; -import numbers ; - -if [ MATCH (--debug-configuration) : [ modules.peek : ARGV ] ] -{ - .debug-configuration = true ; -} -if [ MATCH (--show-configuration) : [ modules.peek : ARGV ] ] -{ - .show-configuration = true ; -} - -# Configurations -# -# The following class helps to manage toolset configurations. Each configuration -# has a unique ID and one or more parameters. A typical example of a unique ID -# is a condition generated by 'common.check-init-parameters' rule. Other kinds -# of IDs can be used. Parameters may include any details about the configuration -# like 'command', 'path', etc. -# -# A toolset configuration may be in one of the following states: -# -# - registered -# Configuration has been registered (e.g. explicitly or by auto-detection -# code) but has not yet been marked as used, i.e. 'toolset.using' rule has -# not yet been called for it. -# - used -# Once called 'toolset.using' rule marks the configuration as 'used'. -# -# The main difference between the states above is that while a configuration is -# 'registered' its options can be freely changed. This is useful in particular -# for autodetection code - all detected configurations may be safely overwritten -# by user code. - -class configurations -{ - import errors ; - - rule __init__ ( ) - { - } - - # Registers a configuration. - # - # Returns 'true' if the configuration has been added and an empty value if - # it already exists. Reports an error if the configuration is 'used'. - # - rule register ( id ) - { - if $(id) in $(self.used) - { - errors.error "common: the configuration '$(id)' is in use" ; - } - - local retval ; - - if ! $(id) in $(self.all) - { - self.all += $(id) ; - - # Indicate that a new configuration has been added. - retval = true ; - } - - return $(retval) ; - } - - # Mark a configuration as 'used'. - # - # Returns 'true' if the state of the configuration has been changed to - # 'used' and an empty value if it the state has not been changed. Reports an - # error if the configuration is not known. - # - rule use ( id ) - { - if ! $(id) in $(self.all) - { - errors.error "common: the configuration '$(id)' is not known" ; - } - - local retval ; - - if ! $(id) in $(self.used) - { - self.used += $(id) ; - - # Indicate that the configuration has been marked as 'used'. - retval = true ; - } - - return $(retval) ; - } - - # Return all registered configurations. - # - rule all ( ) - { - return $(self.all) ; - } - - # Return all used configurations. - # - rule used ( ) - { - return $(self.used) ; - } - - # Returns the value of a configuration parameter. - # - rule get ( id : param ) - { - return $(self.$(param).$(id)) ; - } - - # Sets the value of a configuration parameter. - # - rule set ( id : param : value * ) - { - self.$(param).$(id) = $(value) ; - } -} - - -# The rule for checking toolset parameters. Trailing parameters should all be -# parameter name/value pairs. The rule will check that each parameter either has -# a value in each invocation or has no value in each invocation. Also, the rule -# will check that the combination of all parameter values is unique in all -# invocations. -# -# Each parameter name corresponds to a subfeature. This rule will declare a -# subfeature the first time a non-empty parameter value is passed and will -# extend it with all the values. -# -# The return value from this rule is a condition to be used for flags settings. -# -rule check-init-parameters ( toolset requirement * : * ) -{ - local sig = $(toolset) ; - local condition = $(toolset) ; - local subcondition ; - for local index in 2 3 4 5 6 7 8 9 - { - local name = $($(index)[1]) ; - local value = $($(index)[2]) ; - - if $(value)-is-not-empty - { - condition = $(condition)-$(value) ; - if $(.had-unspecified-value.$(toolset).$(name)) - { - errors.user-error - "$(toolset) initialization: parameter '$(name)'" - "inconsistent" : "no value was specified in earlier" - "initialization" : "an explicit value is specified now" ; - } - # The below logic is for intel compiler. It calls this rule with - # 'intel-linux' and 'intel-win' as toolset, so we need to get the - # base part of toolset name. We can not pass 'intel' as toolset - # because in that case it will be impossible to register versionless - # intel-linux and intel-win toolsets of a specific version. - local t = $(toolset) ; - local m = [ MATCH "([^-]*)-" : $(toolset) ] ; - if $(m) - { - t = $(m[1]) ; - } - if ! $(.had-value.$(toolset).$(name)) - { - if ! $(.declared-subfeature.$(t).$(name)) - { - feature.subfeature toolset $(t) : $(name) : : propagated ; - .declared-subfeature.$(t).$(name) = true ; - } - .had-value.$(toolset).$(name) = true ; - } - feature.extend-subfeature toolset $(t) : $(name) : $(value) ; - subcondition += $(value) ; - } - else - { - if $(.had-value.$(toolset).$(name)) - { - errors.user-error - "$(toolset) initialization: parameter '$(name)'" - "inconsistent" : "an explicit value was specified in an" - "earlier initialization" : "no value is specified now" ; - } - .had-unspecified-value.$(toolset).$(name) = true ; - } - sig = $(sig)$(value:E="")- ; - } - # We also need to consider requirements on the toolset as we can - # configure the same toolset multiple times with different options that - # are selected with the requirements. - if $(requirement) - { - sig = $(sig)$(requirement:J=,) ; - } - if $(sig) in $(.all-signatures) - { - local message = - "duplicate initialization of $(toolset) with the following parameters: " ; - for local index in 2 3 4 5 6 7 8 9 - { - local p = $($(index)) ; - if $(p) - { - message += "$(p[1]) = $(p[2]:E=)" ; - } - } - message += "previous initialization at $(.init-loc.$(sig))" ; - errors.user-error - $(message[1]) : $(message[2]) : $(message[3]) : $(message[4]) : - $(message[5]) : $(message[6]) : $(message[7]) : $(message[8]) ; - } - .all-signatures += $(sig) ; - .init-loc.$(sig) = [ errors.nearest-user-location ] ; - - # If we have a requirement, this version should only be applied under that - # condition. To accomplish this we add a toolset requirement that imposes - # the toolset subcondition, which encodes the version. - if $(requirement) - { - local r = $(toolset) $(requirement) ; - r = $(r:J=,) ; - toolset.add-requirements "$(r):$(subcondition)" ; - } - - # We add the requirements, if any, to the condition to scope the toolset - # variables and options to this specific version. - condition += $(requirement) ; - - if $(.show-configuration) - { - ECHO "notice:" $(condition) ; - } - return $(condition:J=/) ; -} - - -# A helper rule to get the command to invoke some tool. If -# 'user-provided-command' is not given, tries to find binary named 'tool' in -# PATH and in the passed 'additional-path'. Otherwise, verifies that the first -# element of 'user-provided-command' is an existing program. -# -# This rule returns the command to be used when invoking the tool. If we can not -# find the tool, a warning is issued. If 'path-last' is specified, PATH is -# checked after 'additional-paths' when searching for 'tool'. -# -rule get-invocation-command-nodefault ( toolset : tool : - user-provided-command * : additional-paths * : path-last ? ) -{ - local command ; - if ! $(user-provided-command) - { - command = [ find-tool $(tool) : $(additional-paths) : $(path-last) ] ; - if ! $(command) && $(.debug-configuration) - { - ECHO "warning:" toolset $(toolset) "initialization:" can not find tool - $(tool) ; - ECHO "warning:" initialized from [ errors.nearest-user-location ] ; - } - } - else - { - command = [ check-tool $(user-provided-command) ] ; - if ! $(command) && $(.debug-configuration) - { - ECHO "warning:" toolset $(toolset) "initialization:" ; - ECHO "warning:" can not find user-provided command - '$(user-provided-command)' ; - ECHO "warning:" initialized from [ errors.nearest-user-location ] ; - } - } - - return $(command) ; -} - - -# Same as get-invocation-command-nodefault, except that if no tool is found, -# returns either the user-provided-command, if present, or the 'tool' parameter. -# -rule get-invocation-command ( toolset : tool : user-provided-command * : - additional-paths * : path-last ? ) -{ - local result = [ get-invocation-command-nodefault $(toolset) : $(tool) : - $(user-provided-command) : $(additional-paths) : $(path-last) ] ; - - if ! $(result) - { - if $(user-provided-command) - { - result = $(user-provided-command) ; - } - else - { - result = $(tool) ; - } - } - return $(result) ; -} - - -# Given an invocation command return the absolute path to the command. This -# works even if command has no path element and was found on the PATH. -# -rule get-absolute-tool-path ( command ) -{ - if $(command:D) - { - return $(command:D) ; - } - else - { - local m = [ GLOB [ modules.peek : PATH Path path ] : $(command) - $(command).exe ] ; - return $(m[1]:D) ; - } -} - - -# Attempts to find tool (binary) named 'name' in PATH and in 'additional-paths'. -# If found in PATH, returns 'name' and if found in additional paths, returns -# absolute name. If the tool is found in several directories, returns the first -# path found. Otherwise, returns an empty string. If 'path-last' is specified, -# PATH is searched after 'additional-paths'. -# -rule find-tool ( name : additional-paths * : path-last ? ) -{ - if $(name:D) - { - return [ check-tool-aux $(name) ] ; - } - local path = [ path.programs-path ] ; - local match = [ path.glob $(path) : $(name) $(name).exe ] ; - local additional-match = [ path.glob $(additional-paths) : $(name) - $(name).exe ] ; - - local result ; - if $(path-last) - { - result = $(additional-match) ; - if ! $(result) && $(match) - { - result = $(name) ; - } - } - else - { - if $(match) - { - result = $(name) ; - } - else - { - result = $(additional-match) ; - } - } - if $(result) - { - return [ path.native $(result[1]) ] ; - } -} - -# Checks if 'command' can be found either in path or is a full name to an -# existing file. -# -local rule check-tool-aux ( command ) -{ - if $(command:D) - { - if [ path.exists $(command) ] - # Both NT and Cygwin will run .exe files by their unqualified names. - || ( [ os.on-windows ] && [ path.exists $(command).exe ] ) - # Only NT will run .bat & .cmd files by their unqualified names. - || ( ( [ os.name ] = NT ) && ( [ path.exists $(command).bat ] || - [ path.exists $(command).cmd ] ) ) - { - return $(command) ; - } - } - else - { - if [ GLOB [ modules.peek : PATH Path path ] : $(command) ] - { - return $(command) ; - } - } -} - - -# Checks that a tool can be invoked by 'command'. If command is not an absolute -# path, checks if it can be found in 'path'. If command is an absolute path, -# check that it exists. Returns 'command' if ok or empty string otherwise. -# -local rule check-tool ( xcommand + ) -{ - if [ check-tool-aux $(xcommand[1]) ] || - [ check-tool-aux $(xcommand[-1]) ] - { - return $(xcommand) ; - } -} - - -# Handle common options for toolset, specifically sets the following flag -# variables: -# - CONFIG_COMMAND to $(command) -# - OPTIONS for compile to the value of in $(options) -# - OPTIONS for compile.c to the value of in $(options) -# - OPTIONS for compile.c++ to the value of in $(options) -# - OPTIONS for compile.asm to the value of in $(options) -# - OPTIONS for compile.fortran to the value of in $(options) -# - OPTIONS for link to the value of in $(options) -# -rule handle-options ( toolset : condition * : command * : options * ) -{ - if $(.debug-configuration) - { - ECHO "notice:" will use '$(command)' for $(toolset), condition - $(condition:E=(empty)) ; - } - - # The last parameter ('unchecked') says it is OK to set flags for another - # module. - toolset.flags $(toolset) CONFIG_COMMAND $(condition) : $(command) - : unchecked ; - - toolset.flags $(toolset).compile OPTIONS $(condition) : - [ feature.get-values : $(options) ] : unchecked ; - - toolset.flags $(toolset).compile.c OPTIONS $(condition) : - [ feature.get-values : $(options) ] : unchecked ; - - toolset.flags $(toolset).compile.c++ OPTIONS $(condition) : - [ feature.get-values : $(options) ] : unchecked ; - - toolset.flags $(toolset).compile.asm OPTIONS $(condition) : - [ feature.get-values : $(options) ] : unchecked ; - - toolset.flags $(toolset).compile.fortran OPTIONS $(condition) : - [ feature.get-values : $(options) ] : unchecked ; - - toolset.flags $(toolset).link OPTIONS $(condition) : - [ feature.get-values : $(options) ] : unchecked ; -} - - -# Returns the location of the "program files" directory on a Windows platform. -# -rule get-program-files-dir ( ) -{ - local ProgramFiles = [ modules.peek : ProgramFiles ] ; - if $(ProgramFiles) - { - ProgramFiles = "$(ProgramFiles:J= )" ; - } - else - { - ProgramFiles = "c:\\Program Files" ; - } - return $(ProgramFiles) ; -} - - -if [ os.name ] = NT -{ - NULL_DEVICE = "NUL" ; - IGNORE = "2>$(NULL_DEVICE) >$(NULL_DEVICE) & setlocal" ; - RM = del /f /q ; - CP = copy /b ; - LN ?= $(CP) ; - # Ugly hack to convince copy to set the timestamp of the destination to the - # current time by concatenating the source with a nonexistent file. Note - # that this requires /b (binary) as the default when concatenating files is - # /a (ascii). - WINDOWS-CP-HACK = "+ this-file-does-not-exist-A698EE7806899E69" ; -} -else if [ os.name ] = VMS -{ - NULL_DEVICE = "NL:" ; - PIPE = PIPE ; - IGNORE = "2>$(NULL_DEVICE) >$(NULL_DEVICE)" ; - RM = DELETE /NOCONF ; - CP = COPY /OVERWRITE ; - LN = $(CP) ; -} -else -{ - NULL_DEVICE = "/dev/null" ; - IGNORE = "2>$(NULL_DEVICE) >$(NULL_DEVICE)" ; - RM = rm -f ; - CP = cp ; - LN = ln ; -} - -NULL_OUT = ">$(NULL_DEVICE)" ; - -rule null-device ( ) -{ - return $(NULL_DEVICE) ; -} - - -rule rm-command ( ) -{ - return $(RM) ; -} - - -rule copy-command ( ) -{ - return $(CP) ; -} - - -if "\n" = "n" -{ - # Escape characters not supported so use ugly hacks. Will not work on Cygwin - # - see below. - nl = " -" ; - q = "" ; -} -else -{ - nl = "\n" ; - q = "\"" ; -} - - -rule newline-char ( ) -{ - return $(nl) ; -} - - -# Returns the command needed to set an environment variable on the current -# platform. The variable setting persists through all following commands and is -# visible in the environment seen by subsequently executed commands. In other -# words, on Unix systems, the variable is exported, which is consistent with the -# only possible behavior on Windows systems. -# -rule variable-setting-command ( variable : value ) -{ - if [ os.name ] = NT - { - return "set $(variable)=$(value)$(nl)" ; - } - else if [ os.name ] = VMS - { - return "$(variable) == $(q)$(value)$(q)$(nl)" ; - } - else - { - # If we do not have escape character support in bjam, the cod below - # blows up on CYGWIN, since the $(nl) variable holds a Windows new-line - # \r\n sequence that messes up the executed export command which then - # reports that the passed variable name is incorrect. - # But we have a check for cygwin in kernel/bootstrap.jam already. - return "$(variable)=$(q)$(value)$(q)$(nl)export $(variable)$(nl)" ; - } -} - - -# Returns a command to sets a named shell path variable to the given NATIVE -# paths on the current platform. -# -rule path-variable-setting-command ( variable : paths * ) -{ - local sep = [ os.path-separator ] ; - return [ variable-setting-command $(variable) : $(paths:J=$(sep)) ] ; -} - - -# Returns a command that prepends the given paths to the named path variable on -# the current platform. -# -rule prepend-path-variable-command ( variable : paths * ) -{ - return [ path-variable-setting-command $(variable) - : $(paths) [ os.expand-variable $(variable) ] ] ; -} - - -# Return a command which can create a file. If 'r' is result of invocation, then -# 'r foobar' will create foobar with unspecified content. What happens if file -# already exists is unspecified. -# -rule file-creation-command ( ) -{ - if [ os.name ] = NT - { - # A few alternative implementations on Windows: - # - # 'type NUL >> ' - # That would construct an empty file instead of a file containing - # a space and an end-of-line marker but it would also not change - # the target's timestamp in case the file already exists. - # - # 'type NUL > ' - # That would construct an empty file instead of a file containing - # a space and an end-of-line marker but it would also destroy an - # already existing file by overwriting it with an empty one. - # - # I guess the best solution would be to allow Boost Jam to define - # built-in functions such as 'create a file', 'touch a file' or 'copy a - # file' which could be used from inside action code. That would allow - # completely portable operations without this kind of kludge. - # (22.02.2009.) (Jurko) - return "echo. > " ; - } - else if [ os.name ] = VMS - { - return "APPEND /NEW NL: " ; - } - else - { - return "touch " ; - } -} - - -# Returns a command that may be used for 'touching' files. It is not a real -# 'touch' command on NT because it adds an empty line at the end of file but it -# works with source files. -# -rule file-touch-command ( ) -{ - if [ os.name ] = NT - { - return "echo. >> " ; - } - else if [ os.name ] = VMS - { - return "APPEND /NEW NL: " ; - } - else - { - return "touch " ; - } -} - - -rule MkDir -{ - # If dir exists, do not update it. Do this even for $(DOT). - NOUPDATE $(<) ; - - if $(<) != $(DOT) && ! $($(<)-mkdir) - { - # Cheesy gate to prevent multiple invocations on same dir. - $(<)-mkdir = true ; - - # Schedule the mkdir build action. - common.mkdir $(<) ; - - # Prepare a Jam 'dirs' target that can be used to make the build only - # construct all the target directories. - DEPENDS dirs : $(<) ; - - # Recursively create parent directories. $(<:P) = $(<)'s parent & we - # recurse until root. - - local s = $(<:P) ; - if [ os.name ] = NT - { - switch $(s) - { - case "*:" : s = ; - case "*:\\" : s = ; - } - } - - if $(s) - { - if $(s) != $(<) - { - DEPENDS $(<) : $(s) ; - MkDir $(s) ; - } - else - { - NOTFILE $(s) ; - } - } - } -} - - -#actions MkDir1 -#{ -# mkdir "$(<)" -#} - -# The following quick-fix actions should be replaced using the original MkDir1 -# action once Boost Jam gets updated to correctly detect different paths leading -# up to the same filesystem target and triggers their build action only once. -# (todo) (04.07.2008.) (Jurko) - -if [ os.name ] = NT -{ - actions quietly mkdir - { - if not exist "$(<)\\" mkdir "$(<)" - } -} -else -{ - actions quietly mkdir - { - mkdir -p "$(<)" - } -} - - -actions piecemeal together existing Clean -{ - $(RM) "$(>)" -} - - -rule copy -{ -} - - -actions copy -{ - $(CP) "$(>)" $(WINDOWS-CP-HACK) "$(<)" -} - - -rule RmTemps -{ -} - - -actions quietly updated piecemeal together RmTemps -{ - $(RM) "$(>)" $(IGNORE) -} - - -actions hard-link -{ - $(RM) "$(<)" 2$(NULL_OUT) $(NULL_OUT) - $(LN) "$(>)" "$(<)" $(NULL_OUT) -} - - -if [ os.name ] = VMS -{ - actions mkdir - { - IF F$PARSE("$(<:W)") .EQS. "" THEN CREATE /DIR $(<:W) - } - - actions piecemeal together existing Clean - { - $(RM) $(>:WJ=;*,);* - } - - actions copy - { - $(CP) $(>:WJ=,) $(<:W) - } - - actions quietly updated piecemeal together RmTemps - { - $(PIPE) $(RM) $(>:WJ=;*,);* $(IGNORE) - } - - actions hard-link - { - $(PIPE) $(RM) $(>[1]:W);* $(IGNORE) - $(PIPE) $(LN) $(>[1]:W) $(<:W) $(NULL_OUT) - } -} - -# Given a target, as given to a custom tag rule, returns a string formatted -# according to the passed format. Format is a list of properties that is -# represented in the result. For each element of format the corresponding target -# information is obtained and added to the result string. For all, but the -# literal, the format value is taken as the as string to prepend to the output -# to join the item to the rest of the result. If not given "-" is used as a -# joiner. -# -# The format options can be: -# -# [joiner] -# :: The basename of the target name. -# [joiner] -# :: The abbreviated toolset tag being used to build the target. -# [joiner] -# :: Indication of a multi-threaded build. -# [joiner] -# :: Collective tag of the build runtime. -# [joiner] -# :: Short version tag taken from the given "version-feature" in the -# build properties. Or if not present, the literal value as the -# version number. -# [joiner] -# :: Direct lookup of the given property-name value in the build -# properties. /property-name/ is a regular expression. E.g. -# will match every toolset. -# /otherwise/ -# :: The literal value of the format argument. -# -# For example this format: -# -# boost_ -# -# Might return: -# -# boost_thread-vc80-mt-gd-1_33.dll, or -# boost_regex-vc80-gd-1_33.dll -# -# The returned name also has the target type specific prefix and suffix which -# puts it in a ready form to use as the value from a custom tag rule. -# -rule format-name ( format * : name : type ? : property-set ) -{ - local result = "" ; - for local f in $(format) - { - switch $(f:G) - { - case : - result += $(name:B) ; - - case : - result += [ join-tag $(f:G=) : [ toolset-tag $(name) : $(type) : - $(property-set) ] ] ; - - case : - result += [ join-tag $(f:G=) : [ threading-tag $(name) : $(type) - : $(property-set) ] ] ; - - case : - result += [ join-tag $(f:G=) : [ runtime-tag $(name) : $(type) : - $(property-set) ] ] ; - - case : - result += [ join-tag $(f:G=) : [ qt-tag $(name) : $(type) : - $(property-set) ] ] ; - - case : - result += [ join-tag $(f:G=) : [ address-model-tag $(name) : - $(type) : $(property-set) ] ] ; - - case : - result += [ join-tag $(f:G=) : [ arch-and-model-tag $(name) : - $(type) : $(property-set) ] ] ; - - case : - local key = [ MATCH : $(f:G) ] ; - local version = [ $(property-set).get <$(key)> ] ; - version ?= $(key) ; - version = [ MATCH "^([^.]+)[.]([^.]+)[.]?([^.]*)" : $(version) ] ; - result += [ join-tag $(f:G=) : $(version[1])_$(version[2]) ] ; - - case : - local key = [ MATCH : $(f:G) ] ; - local p0 = [ MATCH <($(key))> : [ $(property-set).raw ] ] ; - if $(p0) - { - local p = [ $(property-set).get <$(p0)> ] ; - if $(p) - { - result += [ join-tag $(f:G=) : $(p) ] ; - } - } - - case * : - result += $(f:G=) ; - } - } - return [ virtual-target.add-prefix-and-suffix $(result:J=) : $(type) : - $(property-set) ] ; -} - - -local rule join-tag ( joiner ? : tag ? ) -{ - if ! $(joiner) { joiner = - ; } - return $(joiner)$(tag) ; -} - - -local rule toolset-tag ( name : type ? : property-set ) -{ - local tag = ; - - local properties = [ $(property-set).raw ] ; - switch [ $(property-set).get ] - { - case borland* : tag += bcb ; - case clang* : - { - switch [ $(property-set).get ] - { - case darwin : tag += clang-darwin ; - case linux : tag += clang ; - case win : tag += clangw ; - } - } - case como* : tag += como ; - case cw : tag += cw ; - case darwin* : tag += xgcc ; - case edg* : tag += edg ; - case gcc* : - { - switch [ $(property-set).get ] - { - case *windows* : tag += mgw ; - case * : tag += gcc ; - } - } - case intel : - if [ $(property-set).get ] = win - { - tag += iw ; - } - else - { - tag += il ; - } - case kcc* : tag += kcc ; - case kylix* : tag += bck ; - #case metrowerks* : tag += cw ; - #case mingw* : tag += mgw ; - case mipspro* : tag += mp ; - case msvc* : tag += vc ; - case qcc* : tag += qcc ; - case sun* : tag += sw ; - case tru64cxx* : tag += tru ; - case vacpp* : tag += xlc ; - } - local version = [ MATCH "([0123456789]+)[.]?([0123456789]*)" - : $(properties) ] ; - # For historical reasons, vc6.0 and vc7.0 use different naming. - if $(tag) = vc - { - if $(version[1]) = 6 - { - # Cancel minor version. - version = 6 ; - } - else if $(version[1]) = 7 && $(version[2]) = 0 - { - version = 7 ; - } - } - - # From GCC 5, versioning changes and minor becomes patch - if ( $(tag) = gcc || $(tag) = mgw ) && [ numbers.less 4 $(version[1]) ] - { - version = $(version[1]) ; - } - - # Ditto, from Clang 4 - if ( $(tag) = clang || $(tag) = clangw ) && [ numbers.less 3 $(version[1]) ] - { - version = $(version[1]) ; - } - - # On intel, version is not added, because it does not matter and it is the - # version of vc used as backend that matters. Ideally, we should encode the - # backend version but that would break compatibility with V1. - if $(tag) = iw - { - version = ; - } - - # On borland, version is not added for compatibility with V1. - if $(tag) = bcb - { - version = ; - } - - tag += $(version) ; - - return $(tag:J=) ; -} - - -local rule threading-tag ( name : type ? : property-set ) -{ - if multi in [ $(property-set).raw ] - { - return mt ; - } -} - - -local rule runtime-tag ( name : type ? : property-set ) -{ - local tag = ; - - local properties = [ $(property-set).raw ] ; - if static in $(properties) { tag += s ; } - - # This is an ugly thing. In V1, there is code to automatically detect which - # properties affect a target. So, if does not affect gcc - # toolset, the tag rules will not even see . Similar - # functionality in V2 is not implemented yet, so we just check for toolsets - # known to care about runtime debugging. - if ( msvc in $(properties) ) || - ( stlport in $(properties) ) || - ( win in $(properties) ) - { - if on in $(properties) { tag += g ; } - } - - if on in $(properties) { tag += y ; } - if debug in $(properties) { tag += d ; } - if stlport in $(properties) { tag += p ; } - if hostios in $(properties) { tag += n ; } - - return $(tag:J=) ; -} - - -# Create a tag for the Qt library version -# "4.6.0" will result in tag "qt460" -local rule qt-tag ( name : type ? : property-set ) -{ - local v = [ MATCH "([0123456789]+)[.]?([0123456789]*)[.]?([0123456789]*)" : - [ $(property-set).get ] ] ; - return qt$(v:J=) ; -} - - -# Create a tag for the address-model -# 64 will simply generate "64" -local rule address-model-tag ( name : type ? : property-set ) -{ - return [ $(property-set).get ] ; -} - -# Create a tag for the architecture and model -# x86 32 would generate "x32" -# This relies on the fact that all architectures start with -# unique letters. -local rule arch-and-model-tag ( name : type ? : property-set ) -{ - local architecture = [ $(property-set).get ] ; - local address-model = [ $(property-set).get ] ; - - local arch = [ MATCH ^(.) : $(architecture) ] ; - - return $(arch)$(address-model) ; -} - -rule __test__ ( ) -{ - import assert ; - - local save-os = [ modules.peek os : .name ] ; - - modules.poke os : .name : LINUX ; - assert.result "PATH=\"foo:bar:baz\"\nexport PATH\n" - : path-variable-setting-command PATH : foo bar baz ; - assert.result "PATH=\"foo:bar:$PATH\"\nexport PATH\n" - : prepend-path-variable-command PATH : foo bar ; - - modules.poke os : .name : NT ; - assert.result "set PATH=foo;bar;baz\n" - : path-variable-setting-command PATH : foo bar baz ; - assert.result "set PATH=foo;bar;%PATH%\n" - : prepend-path-variable-command PATH : foo bar ; - - modules.poke os : .name : $(save-os) ; -} diff --git a/deps/Boost/user-config.jam b/deps/Boost/user-config.jam index eff13db28c2..6d86ef8df35 100644 --- a/deps/Boost/user-config.jam +++ b/deps/Boost/user-config.jam @@ -1 +1 @@ -using gcc : : @CMAKE_CXX_COMPILER@ ; \ No newline at end of file +using @_boost_toolset@ : : @CMAKE_CXX_COMPILER@ ; \ No newline at end of file diff --git a/deps/CGAL/CGAL.cmake b/deps/CGAL/CGAL.cmake index b43467b5393..ed535f36296 100644 --- a/deps/CGAL/CGAL.cmake +++ b/deps/CGAL/CGAL.cmake @@ -3,29 +3,9 @@ prusaslicer_add_cmake_project( # GIT_REPOSITORY https://github.com/CGAL/cgal.git # GIT_TAG bec70a6d52d8aacb0b3d82a7b4edc3caa899184b # releases/CGAL-5.0 # For whatever reason, this keeps downloading forever (repeats downloads if finished) - URL https://github.com/CGAL/cgal/archive/releases/CGAL-5.0.zip - URL_HASH SHA256=c2b035bd078687b6d8c0fb6371a7443adcdb647856af9969532c4050cd5f48e5 + URL https://github.com/CGAL/cgal/archive/refs/tags/v5.4.zip + URL_HASH SHA256=d7605e0a5a5ca17da7547592f6f6e4a59430a0bc861948974254d0de43eab4c0 DEPENDS dep_Boost dep_GMP dep_MPFR ) include(GNUInstallDirs) - -# CGAL, for whatever reason, makes itself non-relocatable by writing the build directory into -# CGALConfig-installation-dirs.cmake and including it in configure time. -# If this file is not present, it will not consider the stored absolute path -ExternalProject_Add_Step(dep_CGAL dep_CGAL_relocation_fix - DEPENDEES install - - COMMAND ${CMAKE_COMMAND} -E remove CGALConfig-installation-dirs.cmake - WORKING_DIRECTORY "${DESTDIR}/usr/local/${CMAKE_INSTALL_LIBDIR}/cmake/CGAL" -) - -# Again, for whatever reason, CGAL thinks that its version is not relevant if -# configured as a header only library. Fixing it by placing a cmake version file -# besides the installed config file. -ExternalProject_Add_Step(dep_CGAL dep_CGAL_version_fix - DEPENDEES install - - COMMAND ${CMAKE_COMMAND} -E copy cgal/CGALConfigVersion.cmake "${DESTDIR}/usr/local/${CMAKE_INSTALL_LIBDIR}/cmake/CGAL/CGALConfigVersion.cmake" - WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}" -) diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index 2a83863cfe5..b00f85ba706 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -191,6 +191,7 @@ endif () include(JPEG/JPEG.cmake) include(TIFF/TIFF.cmake) +include(NanoSVG/NanoSVG.cmake) include(wxWidgets/wxWidgets.cmake) include(OCCT/OCCT.cmake) @@ -204,20 +205,17 @@ set(_dep_list dep_OpenVDB dep_OpenCSG dep_CGAL + dep_Qhull dep_OCCT ${PNG_PKG} ${ZLIB_PKG} ${EXPAT_PKG} ) -if (MSVC) - # Experimental - #list(APPEND _dep_list "dep_qhull") -else() - list(APPEND _dep_list "dep_Qhull") +# if (NOT MSVC) # Not working, static build has different Eigen #list(APPEND _dep_list "dep_libigl") -endif() +# endif() add_custom_target(deps ALL DEPENDS ${_dep_list}) diff --git a/deps/Cereal/Cereal.cmake b/deps/Cereal/Cereal.cmake index 28912ff4ffd..7aef7a9f1e8 100644 --- a/deps/Cereal/Cereal.cmake +++ b/deps/Cereal/Cereal.cmake @@ -1,6 +1,8 @@ prusaslicer_add_cmake_project(Cereal - URL "https://github.com/USCiLab/cereal/archive/v1.2.2.tar.gz" - URL_HASH SHA256=1921f26d2e1daf9132da3c432e2fd02093ecaedf846e65d7679ddf868c7289c4 + URL "https://github.com/USCiLab/cereal/archive/refs/tags/v1.3.0.zip" + URL_HASH SHA256=71642cb54658e98c8f07a0f0d08bf9766f1c3771496936f6014169d3726d9657 CMAKE_ARGS - -DJUST_INSTALL_CEREAL=on + -DJUST_INSTALL_CEREAL=ON + -DSKIP_PERFORMANCE_COMPARISON=ON + -DBUILD_TESTS=OFF ) \ No newline at end of file diff --git a/deps/GLEW/GLEW.cmake b/deps/GLEW/GLEW.cmake index 5916ce7eb73..76ffc0a8d62 100644 --- a/deps/GLEW/GLEW.cmake +++ b/deps/GLEW/GLEW.cmake @@ -4,7 +4,11 @@ find_package(OpenGL QUIET REQUIRED) prusaslicer_add_cmake_project( GLEW - SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/glew + URL https://sourceforge.net/projects/glew/files/glew/2.2.0/glew-2.2.0.zip + URL_HASH SHA256=a9046a913774395a095edcc0b0ac2d81c3aacca61787b39839b941e9be14e0d4 + SOURCE_SUBDIR build/cmake + CMAKE_ARGS + -DBUILD_UTILS=OFF ) if (MSVC) diff --git a/deps/GLEW/glew/CMakeLists.txt b/deps/GLEW/glew/CMakeLists.txt deleted file mode 100644 index 6daedaaddc1..00000000000 --- a/deps/GLEW/glew/CMakeLists.txt +++ /dev/null @@ -1,33 +0,0 @@ -cmake_minimum_required(VERSION 3.0) -project(GLEW) - -find_package(OpenGL REQUIRED) - -add_library(glew src/glew.c) -target_include_directories(glew PRIVATE include/) -target_link_libraries(glew PUBLIC OpenGL::GL) - -if (NOT BUILD_SHARED_LIBS) - target_compile_definitions(glew PUBLIC GLEW_STATIC) -endif () - -include(GNUInstallDirs) - -install( - FILES - ${PROJECT_SOURCE_DIR}/include/GL/glew.h - ${PROJECT_SOURCE_DIR}/include/GL/wglew.h - ${PROJECT_SOURCE_DIR}/include/GL/glxew.h - DESTINATION - ${CMAKE_INSTALL_INCLUDEDIR}/GL -) - -add_library(GLEW INTERFACE) -target_link_libraries(GLEW INTERFACE glew) - -install(TARGETS glew GLEW - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} -) \ No newline at end of file diff --git a/deps/GLEW/glew/LICENSE.txt b/deps/GLEW/glew/LICENSE.txt deleted file mode 100644 index f7078042e95..00000000000 --- a/deps/GLEW/glew/LICENSE.txt +++ /dev/null @@ -1,73 +0,0 @@ -The OpenGL Extension Wrangler Library -Copyright (C) 2002-2007, Milan Ikits -Copyright (C) 2002-2007, Marcelo E. Magallon -Copyright (C) 2002, Lev Povalahev -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. -* The name of the author may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -THE POSSIBILITY OF SUCH DAMAGE. - - -Mesa 3-D graphics library -Version: 7.0 - -Copyright (C) 1999-2007 Brian Paul All Rights Reserved. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -Copyright (c) 2007 The Khronos Group Inc. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and/or associated documentation files (the -"Materials"), to deal in the Materials without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Materials, and to -permit persons to whom the Materials are furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Materials. - -THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. diff --git a/deps/GLEW/glew/README.md b/deps/GLEW/glew/README.md deleted file mode 100644 index e7efc244f2e..00000000000 --- a/deps/GLEW/glew/README.md +++ /dev/null @@ -1,196 +0,0 @@ -THIS IS NOT THE COMPLETE GLEW DISTRIBUTION. ONLY FILES NEEDED FOR COMPILING GLEW INTO SLIC3R WERE PUT INTO THE SLIC3R SOURCE DISTRIBUTION. - -A CMAKE CONFIG EXPORT IS ADDED TO ENABLE FIND PACKAGE TO FIND DEBUG BUILD ON MSVC - -# GLEW - The OpenGL Extension Wrangler Library - -![](http://glew.sourceforge.net/glew.png) - -http://glew.sourceforge.net/ - -https://github.com/nigels-com/glew - -[![Build Status](https://travis-ci.org/nigels-com/glew.svg?branch=master)](https://travis-ci.org/nigels-com/glew) -[![Gitter](https://badges.gitter.im/nigels-com/glew.svg)](https://gitter.im/nigels-com/glew?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) -[![Download](https://img.shields.io/sourceforge/dm/glew.svg)](https://sourceforge.net/projects/glew/files/latest/download) - -## Downloads - -Current release is [2.0.0](https://sourceforge.net/projects/glew/files/glew/2.0.0/). -[(Change Log)](http://glew.sourceforge.net/log.html) - -Sources available as -[ZIP](https://sourceforge.net/projects/glew/files/glew/2.0.0/glew-2.0.0.zip/download) or -[TGZ](https://sourceforge.net/projects/glew/files/glew/2.0.0/glew-2.0.0.tgz/download). - -Windows binaries for [32-bit and 64-bit](https://sourceforge.net/projects/glew/files/glew/2.0.0/glew-2.0.0-win32.zip/download). - -### Recent snapshots - -Snapshots may contain new features, bug-fixes or new OpenGL extensions ahead of tested, official releases. - -[glew-20160708.tgz](http://sourceforge.net/projects/glew/files/glew/snapshots/glew-20160708.tgz/download) -*GLEW 2.0.0 RC: Core context, EGL support, no MX* - -[glew-20160402.tgz](http://sourceforge.net/projects/glew/files/glew/snapshots/glew-20160402.tgz/download) -*GLEW 2.0.0 RC: Core context, EGL support, no MX* - -## Build - -From a downloaded tarball or zip archive: - -### Linux and Mac - -#### Using GNU Make - -##### Install build tools - -Debian/Ubuntu/Mint: `$ sudo apt-get install build-essential libxmu-dev libxi-dev libgl-dev libosmesa-dev git` - -RedHat/CentOS/Fedora: `$ sudo yum install libXmu-devel libXi-devel libGL-devel git` - -##### Build - - $ make - $ sudo make install - $ make clean - -Targets: `all, glew.lib, glew.bin, clean, install, uninstall` - -Variables: `SYSTEM=linux-clang, GLEW_DEST=/usr/local, STRIP=` - -#### Using cmake - -*CMake 2.8.12 or higher is required.* - -##### Install build tools - -Debian/Ubuntu/Mint: `$ sudo apt-get install build-essential libXmu-dev libXi-dev libgl-dev git cmake` - -RedHat/CentOS/Fedora: `$ sudo yum install libXmu-devel libXi-devel libGL-devel git cmake` - -##### Build - - $ cd build - $ cmake ./cmake - $ make -j4 - -| Target | Description | -| ---------- | ----------- | -| glew | Build the glew shared library. | -| glew_s | Build the glew static library. | -| glewinfo | Build the `glewinfo` executable (requires `BUILD_UTILS` to be `ON`). | -| visualinfo | Build the `visualinfo` executable (requires `BUILD_UTILS` to be `ON`). | -| install | Install all enabled targets into `CMAKE_INSTALL_PREFIX`. | -| clean | Clean up build artifacts. | -| all | Build all enabled targets (default target). | - -| Variables | Description | -| --------------- | ----------- | -| BUILD_UTILS | Build the `glewinfo` and `visualinfo` executables. | -| GLEW_REGAL | Build in Regal mode. | -| GLEW_OSMESA | Build in off-screen Mesa mode. | -| BUILD_FRAMEWORK | Build as MacOSX Framework. Setting `CMAKE_INSTALL_PREFIX` to `/Library/Frameworks` is recommended. | - -### Windows - -#### Visual Studio - -Use the provided Visual Studio project file in build/vc12/ - -Projects for vc6 and vc10 are also provided - -#### MSYS/Mingw - -Available from [Mingw](http://www.mingw.org/) - -Requirements: bash, make, gcc - - $ mingw32-make - $ mingw32-make install - $ mingw32-make install.all - -Alternative toolchain: `SYSTEM=mingw-win32` - -#### MSYS2/Mingw-w64 - -Available from [Msys2](http://msys2.github.io/) and/or [Mingw-w64](http://mingw-w64.org/) - -Requirements: bash, make, gcc - - $ pacman -S gcc make mingw-w64-i686-gcc mingw-w64-x86_64-gcc - $ make - $ make install - $ make install.all - -Alternative toolchain: `SYSTEM=msys, SYSTEM=msys-win32, SYSTEM=msys-win64` - -## glewinfo - -`glewinfo` is a command-line tool useful for inspecting the capabilities of an -OpenGL implementation and GLEW support for that. Please include the output of -`glewinfo` with bug reports, as appropriate. - - --------------------------- - GLEW Extension Info - --------------------------- - - GLEW version 2.0.0 - Reporting capabilities of pixelformat 3 - Running on a Intel(R) HD Graphics 3000 from Intel - OpenGL version 3.1.0 - Build 9.17.10.4229 is supported - - GL_VERSION_1_1: OK - --------------- - - GL_VERSION_1_2: OK - --------------- - glCopyTexSubImage3D: OK - glDrawRangeElements: OK - glTexImage3D: OK - glTexSubImage3D: OK - - ... - -## Code Generation - -A Unix or Mac environment is neded for building GLEW from scratch to -include new extensions, or customize the code generation. The extension -data is regenerated from the top level source directory with: - - make extensions - -An alternative to generating the GLEW sources from scratch is to -download a pre-generated (unsupported) snapshot: - -https://sourceforge.net/projects/glew/files/glew/snapshots/ - -Travis-built snapshots are also available: - -https://glew.s3.amazonaws.com/index.html - -## Authors - -GLEW is currently maintained by [Nigel Stewart](https://github.com/nigels-com) -with bug fixes, new OpenGL extension support and new releases. - -GLEW was developed by [Milan Ikits](http://www.cs.utah.edu/~ikits/) -and [Marcelo Magallon](http://wwwvis.informatik.uni-stuttgart.de/~magallon/). -Aaron Lefohn, Joe Kniss, and Chris Wyman were the first users and also -assisted with the design and debugging process. - -The acronym GLEW originates from Aaron Lefohn. -Pasi Kärkkäinen identified and fixed several problems with -GLX and SDL. Nate Robins created the `wglinfo` utility, to -which modifications were made by Michael Wimmer. - -## Copyright and Licensing - -GLEW is originally derived from the EXTGL project by Lev Povalahev. -The source code is licensed under the -[Modified BSD License](http://glew.sourceforge.net/glew.txt), the -[Mesa 3-D License](http://glew.sourceforge.net/mesa.txt) (MIT) and the -[Khronos License](http://glew.sourceforge.net/khronos.txt) (MIT). - -The automatic code generation scripts are released under the -[GNU GPL](http://glew.sourceforge.net/gpl.txt). diff --git a/deps/GLEW/glew/VERSION b/deps/GLEW/glew/VERSION deleted file mode 100644 index f88cf52e6ef..00000000000 --- a/deps/GLEW/glew/VERSION +++ /dev/null @@ -1 +0,0 @@ -1.13.0 \ No newline at end of file diff --git a/deps/GLEW/glew/include/GL/glew.h b/deps/GLEW/glew/include/GL/glew.h deleted file mode 100644 index 702265c38b4..00000000000 --- a/deps/GLEW/glew/include/GL/glew.h +++ /dev/null @@ -1,19753 +0,0 @@ -/* -** The OpenGL Extension Wrangler Library -** Copyright (C) 2008-2015, Nigel Stewart -** Copyright (C) 2002-2008, Milan Ikits -** Copyright (C) 2002-2008, Marcelo E. Magallon -** Copyright (C) 2002, Lev Povalahev -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are met: -** -** * Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** * The name of the author may be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -** THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Mesa 3-D graphics library - * Version: 7.0 - * - * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* -** Copyright (c) 2007 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ - -#ifndef __glew_h__ -#define __glew_h__ -#define __GLEW_H__ - -#if defined(__gl_h_) || defined(__GL_H__) || defined(_GL_H) || defined(__X_GL_H) -#error gl.h included before glew.h -#endif -#if defined(__gl2_h_) -#error gl2.h included before glew.h -#endif -#if defined(__gltypes_h_) -#error gltypes.h included before glew.h -#endif -#if defined(__REGAL_H__) -#error Regal.h included before glew.h -#endif -#if defined(__glext_h_) || defined(__GLEXT_H_) -#error glext.h included before glew.h -#endif -#if defined(__gl_ATI_h_) -#error glATI.h included before glew.h -#endif - -#define __gl_h_ -#define __gl2_h_ -#define __GL_H__ -#define _GL_H -#define __gltypes_h_ -#define __REGAL_H__ -#define __X_GL_H -#define __glext_h_ -#define __GLEXT_H_ -#define __gl_ATI_h_ - -#if defined(_WIN32) - -/* - * GLEW does not include to avoid name space pollution. - * GL needs GLAPI and GLAPIENTRY, GLU needs APIENTRY, CALLBACK, and wchar_t - * defined properly. - */ -/* and */ -#ifdef APIENTRY -# ifndef GLAPIENTRY -# define GLAPIENTRY APIENTRY -# endif -# ifndef GLEWAPIENTRY -# define GLEWAPIENTRY APIENTRY -# endif -#else -#define GLEW_APIENTRY_DEFINED -# if defined(__MINGW32__) || defined(__CYGWIN__) || (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) -# define APIENTRY __stdcall -# ifndef GLAPIENTRY -# define GLAPIENTRY __stdcall -# endif -# ifndef GLEWAPIENTRY -# define GLEWAPIENTRY __stdcall -# endif -# else -# define APIENTRY -# endif -#endif -#ifndef GLAPI -# if defined(__MINGW32__) || defined(__CYGWIN__) -# define GLAPI extern -# endif -#endif -/* */ -#ifndef CALLBACK -#define GLEW_CALLBACK_DEFINED -# if defined(__MINGW32__) || defined(__CYGWIN__) -# define CALLBACK __attribute__ ((__stdcall__)) -# elif (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) -# define CALLBACK __stdcall -# else -# define CALLBACK -# endif -#endif -/* and */ -#ifndef WINGDIAPI -#define GLEW_WINGDIAPI_DEFINED -#define WINGDIAPI __declspec(dllimport) -#endif -/* */ -#if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(_WCHAR_T_DEFINED) -typedef unsigned short wchar_t; -# define _WCHAR_T_DEFINED -#endif -/* */ -#if !defined(_W64) -# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && defined(_MSC_VER) && _MSC_VER >= 1300 -# define _W64 __w64 -# else -# define _W64 -# endif -#endif -#if !defined(_PTRDIFF_T_DEFINED) && !defined(_PTRDIFF_T_) && !defined(__MINGW64__) -# ifdef _WIN64 -typedef __int64 ptrdiff_t; -# else -typedef _W64 int ptrdiff_t; -# endif -# define _PTRDIFF_T_DEFINED -# define _PTRDIFF_T_ -#endif - -#ifndef GLAPI -# if defined(__MINGW32__) || defined(__CYGWIN__) -# define GLAPI extern -# else -# define GLAPI WINGDIAPI -# endif -#endif - -/* - * GLEW_STATIC is defined for static library. - * GLEW_BUILD is defined for building the DLL library. - */ - -#ifdef GLEW_STATIC -# define GLEWAPI extern -#else -# ifdef GLEW_BUILD -# define GLEWAPI extern __declspec(dllexport) -# else -# define GLEWAPI extern __declspec(dllimport) -# endif -#endif - -#else /* _UNIX */ - -/* - * Needed for ptrdiff_t in turn needed by VBO. This is defined by ISO - * C. On my system, this amounts to _3 lines_ of included code, all of - * them pretty much harmless. If you know of a way of detecting 32 vs - * 64 _targets_ at compile time you are free to replace this with - * something that's portable. For now, _this_ is the portable solution. - * (mem, 2004-01-04) - */ - -#include - -/* SGI MIPSPro doesn't like stdint.h in C++ mode */ -/* ID: 3376260 Solaris 9 has inttypes.h, but not stdint.h */ - -#if (defined(__sgi) || defined(__sun)) && !defined(__GNUC__) -#include -#else -#include -#endif - -#define GLEW_APIENTRY_DEFINED -#define APIENTRY - -/* - * GLEW_STATIC is defined for static library. - */ - -#ifdef GLEW_STATIC -# define GLEWAPI extern -#else -# if defined(__GNUC__) && __GNUC__>=4 -# define GLEWAPI extern __attribute__ ((visibility("default"))) -# elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) -# define GLEWAPI extern __global -# else -# define GLEWAPI extern -# endif -#endif - -/* */ -#ifndef GLAPI -#define GLAPI extern -#endif - -#endif /* _WIN32 */ - -#ifndef GLAPIENTRY -#define GLAPIENTRY -#endif - -#ifndef GLEWAPIENTRY -#define GLEWAPIENTRY -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* ----------------------------- GL_VERSION_1_1 ---------------------------- */ - -#ifndef GL_VERSION_1_1 -#define GL_VERSION_1_1 1 - -typedef unsigned int GLenum; -typedef unsigned int GLbitfield; -typedef unsigned int GLuint; -typedef int GLint; -typedef int GLsizei; -typedef unsigned char GLboolean; -typedef signed char GLbyte; -typedef short GLshort; -typedef unsigned char GLubyte; -typedef unsigned short GLushort; -typedef unsigned long GLulong; -typedef float GLfloat; -typedef float GLclampf; -typedef double GLdouble; -typedef double GLclampd; -typedef void GLvoid; -#if defined(_MSC_VER) && _MSC_VER < 1400 -typedef __int64 GLint64EXT; -typedef unsigned __int64 GLuint64EXT; -#elif defined(_MSC_VER) || defined(__BORLANDC__) -typedef signed long long GLint64EXT; -typedef unsigned long long GLuint64EXT; -#else -# if defined(__MINGW32__) || defined(__CYGWIN__) -#include -# endif -typedef int64_t GLint64EXT; -typedef uint64_t GLuint64EXT; -#endif -typedef GLint64EXT GLint64; -typedef GLuint64EXT GLuint64; -typedef struct __GLsync *GLsync; - -typedef char GLchar; - -#define GL_ZERO 0 -#define GL_FALSE 0 -#define GL_LOGIC_OP 0x0BF1 -#define GL_NONE 0 -#define GL_TEXTURE_COMPONENTS 0x1003 -#define GL_NO_ERROR 0 -#define GL_POINTS 0x0000 -#define GL_CURRENT_BIT 0x00000001 -#define GL_TRUE 1 -#define GL_ONE 1 -#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 -#define GL_LINES 0x0001 -#define GL_LINE_LOOP 0x0002 -#define GL_POINT_BIT 0x00000002 -#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 -#define GL_LINE_STRIP 0x0003 -#define GL_LINE_BIT 0x00000004 -#define GL_TRIANGLES 0x0004 -#define GL_TRIANGLE_STRIP 0x0005 -#define GL_TRIANGLE_FAN 0x0006 -#define GL_QUADS 0x0007 -#define GL_QUAD_STRIP 0x0008 -#define GL_POLYGON_BIT 0x00000008 -#define GL_POLYGON 0x0009 -#define GL_POLYGON_STIPPLE_BIT 0x00000010 -#define GL_PIXEL_MODE_BIT 0x00000020 -#define GL_LIGHTING_BIT 0x00000040 -#define GL_FOG_BIT 0x00000080 -#define GL_DEPTH_BUFFER_BIT 0x00000100 -#define GL_ACCUM 0x0100 -#define GL_LOAD 0x0101 -#define GL_RETURN 0x0102 -#define GL_MULT 0x0103 -#define GL_ADD 0x0104 -#define GL_NEVER 0x0200 -#define GL_ACCUM_BUFFER_BIT 0x00000200 -#define GL_LESS 0x0201 -#define GL_EQUAL 0x0202 -#define GL_LEQUAL 0x0203 -#define GL_GREATER 0x0204 -#define GL_NOTEQUAL 0x0205 -#define GL_GEQUAL 0x0206 -#define GL_ALWAYS 0x0207 -#define GL_SRC_COLOR 0x0300 -#define GL_ONE_MINUS_SRC_COLOR 0x0301 -#define GL_SRC_ALPHA 0x0302 -#define GL_ONE_MINUS_SRC_ALPHA 0x0303 -#define GL_DST_ALPHA 0x0304 -#define GL_ONE_MINUS_DST_ALPHA 0x0305 -#define GL_DST_COLOR 0x0306 -#define GL_ONE_MINUS_DST_COLOR 0x0307 -#define GL_SRC_ALPHA_SATURATE 0x0308 -#define GL_STENCIL_BUFFER_BIT 0x00000400 -#define GL_FRONT_LEFT 0x0400 -#define GL_FRONT_RIGHT 0x0401 -#define GL_BACK_LEFT 0x0402 -#define GL_BACK_RIGHT 0x0403 -#define GL_FRONT 0x0404 -#define GL_BACK 0x0405 -#define GL_LEFT 0x0406 -#define GL_RIGHT 0x0407 -#define GL_FRONT_AND_BACK 0x0408 -#define GL_AUX0 0x0409 -#define GL_AUX1 0x040A -#define GL_AUX2 0x040B -#define GL_AUX3 0x040C -#define GL_INVALID_ENUM 0x0500 -#define GL_INVALID_VALUE 0x0501 -#define GL_INVALID_OPERATION 0x0502 -#define GL_STACK_OVERFLOW 0x0503 -#define GL_STACK_UNDERFLOW 0x0504 -#define GL_OUT_OF_MEMORY 0x0505 -#define GL_2D 0x0600 -#define GL_3D 0x0601 -#define GL_3D_COLOR 0x0602 -#define GL_3D_COLOR_TEXTURE 0x0603 -#define GL_4D_COLOR_TEXTURE 0x0604 -#define GL_PASS_THROUGH_TOKEN 0x0700 -#define GL_POINT_TOKEN 0x0701 -#define GL_LINE_TOKEN 0x0702 -#define GL_POLYGON_TOKEN 0x0703 -#define GL_BITMAP_TOKEN 0x0704 -#define GL_DRAW_PIXEL_TOKEN 0x0705 -#define GL_COPY_PIXEL_TOKEN 0x0706 -#define GL_LINE_RESET_TOKEN 0x0707 -#define GL_EXP 0x0800 -#define GL_VIEWPORT_BIT 0x00000800 -#define GL_EXP2 0x0801 -#define GL_CW 0x0900 -#define GL_CCW 0x0901 -#define GL_COEFF 0x0A00 -#define GL_ORDER 0x0A01 -#define GL_DOMAIN 0x0A02 -#define GL_CURRENT_COLOR 0x0B00 -#define GL_CURRENT_INDEX 0x0B01 -#define GL_CURRENT_NORMAL 0x0B02 -#define GL_CURRENT_TEXTURE_COORDS 0x0B03 -#define GL_CURRENT_RASTER_COLOR 0x0B04 -#define GL_CURRENT_RASTER_INDEX 0x0B05 -#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 -#define GL_CURRENT_RASTER_POSITION 0x0B07 -#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 -#define GL_CURRENT_RASTER_DISTANCE 0x0B09 -#define GL_POINT_SMOOTH 0x0B10 -#define GL_POINT_SIZE 0x0B11 -#define GL_POINT_SIZE_RANGE 0x0B12 -#define GL_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_LINE_SMOOTH 0x0B20 -#define GL_LINE_WIDTH 0x0B21 -#define GL_LINE_WIDTH_RANGE 0x0B22 -#define GL_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_LINE_STIPPLE 0x0B24 -#define GL_LINE_STIPPLE_PATTERN 0x0B25 -#define GL_LINE_STIPPLE_REPEAT 0x0B26 -#define GL_LIST_MODE 0x0B30 -#define GL_MAX_LIST_NESTING 0x0B31 -#define GL_LIST_BASE 0x0B32 -#define GL_LIST_INDEX 0x0B33 -#define GL_POLYGON_MODE 0x0B40 -#define GL_POLYGON_SMOOTH 0x0B41 -#define GL_POLYGON_STIPPLE 0x0B42 -#define GL_EDGE_FLAG 0x0B43 -#define GL_CULL_FACE 0x0B44 -#define GL_CULL_FACE_MODE 0x0B45 -#define GL_FRONT_FACE 0x0B46 -#define GL_LIGHTING 0x0B50 -#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 -#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 -#define GL_LIGHT_MODEL_AMBIENT 0x0B53 -#define GL_SHADE_MODEL 0x0B54 -#define GL_COLOR_MATERIAL_FACE 0x0B55 -#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 -#define GL_COLOR_MATERIAL 0x0B57 -#define GL_FOG 0x0B60 -#define GL_FOG_INDEX 0x0B61 -#define GL_FOG_DENSITY 0x0B62 -#define GL_FOG_START 0x0B63 -#define GL_FOG_END 0x0B64 -#define GL_FOG_MODE 0x0B65 -#define GL_FOG_COLOR 0x0B66 -#define GL_DEPTH_RANGE 0x0B70 -#define GL_DEPTH_TEST 0x0B71 -#define GL_DEPTH_WRITEMASK 0x0B72 -#define GL_DEPTH_CLEAR_VALUE 0x0B73 -#define GL_DEPTH_FUNC 0x0B74 -#define GL_ACCUM_CLEAR_VALUE 0x0B80 -#define GL_STENCIL_TEST 0x0B90 -#define GL_STENCIL_CLEAR_VALUE 0x0B91 -#define GL_STENCIL_FUNC 0x0B92 -#define GL_STENCIL_VALUE_MASK 0x0B93 -#define GL_STENCIL_FAIL 0x0B94 -#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 -#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 -#define GL_STENCIL_REF 0x0B97 -#define GL_STENCIL_WRITEMASK 0x0B98 -#define GL_MATRIX_MODE 0x0BA0 -#define GL_NORMALIZE 0x0BA1 -#define GL_VIEWPORT 0x0BA2 -#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 -#define GL_PROJECTION_STACK_DEPTH 0x0BA4 -#define GL_TEXTURE_STACK_DEPTH 0x0BA5 -#define GL_MODELVIEW_MATRIX 0x0BA6 -#define GL_PROJECTION_MATRIX 0x0BA7 -#define GL_TEXTURE_MATRIX 0x0BA8 -#define GL_ATTRIB_STACK_DEPTH 0x0BB0 -#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 -#define GL_ALPHA_TEST 0x0BC0 -#define GL_ALPHA_TEST_FUNC 0x0BC1 -#define GL_ALPHA_TEST_REF 0x0BC2 -#define GL_DITHER 0x0BD0 -#define GL_BLEND_DST 0x0BE0 -#define GL_BLEND_SRC 0x0BE1 -#define GL_BLEND 0x0BE2 -#define GL_LOGIC_OP_MODE 0x0BF0 -#define GL_INDEX_LOGIC_OP 0x0BF1 -#define GL_COLOR_LOGIC_OP 0x0BF2 -#define GL_AUX_BUFFERS 0x0C00 -#define GL_DRAW_BUFFER 0x0C01 -#define GL_READ_BUFFER 0x0C02 -#define GL_SCISSOR_BOX 0x0C10 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_INDEX_CLEAR_VALUE 0x0C20 -#define GL_INDEX_WRITEMASK 0x0C21 -#define GL_COLOR_CLEAR_VALUE 0x0C22 -#define GL_COLOR_WRITEMASK 0x0C23 -#define GL_INDEX_MODE 0x0C30 -#define GL_RGBA_MODE 0x0C31 -#define GL_DOUBLEBUFFER 0x0C32 -#define GL_STEREO 0x0C33 -#define GL_RENDER_MODE 0x0C40 -#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 -#define GL_POINT_SMOOTH_HINT 0x0C51 -#define GL_LINE_SMOOTH_HINT 0x0C52 -#define GL_POLYGON_SMOOTH_HINT 0x0C53 -#define GL_FOG_HINT 0x0C54 -#define GL_TEXTURE_GEN_S 0x0C60 -#define GL_TEXTURE_GEN_T 0x0C61 -#define GL_TEXTURE_GEN_R 0x0C62 -#define GL_TEXTURE_GEN_Q 0x0C63 -#define GL_PIXEL_MAP_I_TO_I 0x0C70 -#define GL_PIXEL_MAP_S_TO_S 0x0C71 -#define GL_PIXEL_MAP_I_TO_R 0x0C72 -#define GL_PIXEL_MAP_I_TO_G 0x0C73 -#define GL_PIXEL_MAP_I_TO_B 0x0C74 -#define GL_PIXEL_MAP_I_TO_A 0x0C75 -#define GL_PIXEL_MAP_R_TO_R 0x0C76 -#define GL_PIXEL_MAP_G_TO_G 0x0C77 -#define GL_PIXEL_MAP_B_TO_B 0x0C78 -#define GL_PIXEL_MAP_A_TO_A 0x0C79 -#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 -#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 -#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 -#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 -#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 -#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 -#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 -#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 -#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 -#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 -#define GL_UNPACK_SWAP_BYTES 0x0CF0 -#define GL_UNPACK_LSB_FIRST 0x0CF1 -#define GL_UNPACK_ROW_LENGTH 0x0CF2 -#define GL_UNPACK_SKIP_ROWS 0x0CF3 -#define GL_UNPACK_SKIP_PIXELS 0x0CF4 -#define GL_UNPACK_ALIGNMENT 0x0CF5 -#define GL_PACK_SWAP_BYTES 0x0D00 -#define GL_PACK_LSB_FIRST 0x0D01 -#define GL_PACK_ROW_LENGTH 0x0D02 -#define GL_PACK_SKIP_ROWS 0x0D03 -#define GL_PACK_SKIP_PIXELS 0x0D04 -#define GL_PACK_ALIGNMENT 0x0D05 -#define GL_MAP_COLOR 0x0D10 -#define GL_MAP_STENCIL 0x0D11 -#define GL_INDEX_SHIFT 0x0D12 -#define GL_INDEX_OFFSET 0x0D13 -#define GL_RED_SCALE 0x0D14 -#define GL_RED_BIAS 0x0D15 -#define GL_ZOOM_X 0x0D16 -#define GL_ZOOM_Y 0x0D17 -#define GL_GREEN_SCALE 0x0D18 -#define GL_GREEN_BIAS 0x0D19 -#define GL_BLUE_SCALE 0x0D1A -#define GL_BLUE_BIAS 0x0D1B -#define GL_ALPHA_SCALE 0x0D1C -#define GL_ALPHA_BIAS 0x0D1D -#define GL_DEPTH_SCALE 0x0D1E -#define GL_DEPTH_BIAS 0x0D1F -#define GL_MAX_EVAL_ORDER 0x0D30 -#define GL_MAX_LIGHTS 0x0D31 -#define GL_MAX_CLIP_PLANES 0x0D32 -#define GL_MAX_TEXTURE_SIZE 0x0D33 -#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 -#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 -#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 -#define GL_MAX_NAME_STACK_DEPTH 0x0D37 -#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 -#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 -#define GL_MAX_VIEWPORT_DIMS 0x0D3A -#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B -#define GL_SUBPIXEL_BITS 0x0D50 -#define GL_INDEX_BITS 0x0D51 -#define GL_RED_BITS 0x0D52 -#define GL_GREEN_BITS 0x0D53 -#define GL_BLUE_BITS 0x0D54 -#define GL_ALPHA_BITS 0x0D55 -#define GL_DEPTH_BITS 0x0D56 -#define GL_STENCIL_BITS 0x0D57 -#define GL_ACCUM_RED_BITS 0x0D58 -#define GL_ACCUM_GREEN_BITS 0x0D59 -#define GL_ACCUM_BLUE_BITS 0x0D5A -#define GL_ACCUM_ALPHA_BITS 0x0D5B -#define GL_NAME_STACK_DEPTH 0x0D70 -#define GL_AUTO_NORMAL 0x0D80 -#define GL_MAP1_COLOR_4 0x0D90 -#define GL_MAP1_INDEX 0x0D91 -#define GL_MAP1_NORMAL 0x0D92 -#define GL_MAP1_TEXTURE_COORD_1 0x0D93 -#define GL_MAP1_TEXTURE_COORD_2 0x0D94 -#define GL_MAP1_TEXTURE_COORD_3 0x0D95 -#define GL_MAP1_TEXTURE_COORD_4 0x0D96 -#define GL_MAP1_VERTEX_3 0x0D97 -#define GL_MAP1_VERTEX_4 0x0D98 -#define GL_MAP2_COLOR_4 0x0DB0 -#define GL_MAP2_INDEX 0x0DB1 -#define GL_MAP2_NORMAL 0x0DB2 -#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 -#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 -#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 -#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 -#define GL_MAP2_VERTEX_3 0x0DB7 -#define GL_MAP2_VERTEX_4 0x0DB8 -#define GL_MAP1_GRID_DOMAIN 0x0DD0 -#define GL_MAP1_GRID_SEGMENTS 0x0DD1 -#define GL_MAP2_GRID_DOMAIN 0x0DD2 -#define GL_MAP2_GRID_SEGMENTS 0x0DD3 -#define GL_TEXTURE_1D 0x0DE0 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 -#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 -#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 -#define GL_SELECTION_BUFFER_POINTER 0x0DF3 -#define GL_SELECTION_BUFFER_SIZE 0x0DF4 -#define GL_TEXTURE_WIDTH 0x1000 -#define GL_TRANSFORM_BIT 0x00001000 -#define GL_TEXTURE_HEIGHT 0x1001 -#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 -#define GL_TEXTURE_BORDER_COLOR 0x1004 -#define GL_TEXTURE_BORDER 0x1005 -#define GL_DONT_CARE 0x1100 -#define GL_FASTEST 0x1101 -#define GL_NICEST 0x1102 -#define GL_AMBIENT 0x1200 -#define GL_DIFFUSE 0x1201 -#define GL_SPECULAR 0x1202 -#define GL_POSITION 0x1203 -#define GL_SPOT_DIRECTION 0x1204 -#define GL_SPOT_EXPONENT 0x1205 -#define GL_SPOT_CUTOFF 0x1206 -#define GL_CONSTANT_ATTENUATION 0x1207 -#define GL_LINEAR_ATTENUATION 0x1208 -#define GL_QUADRATIC_ATTENUATION 0x1209 -#define GL_COMPILE 0x1300 -#define GL_COMPILE_AND_EXECUTE 0x1301 -#define GL_BYTE 0x1400 -#define GL_UNSIGNED_BYTE 0x1401 -#define GL_SHORT 0x1402 -#define GL_UNSIGNED_SHORT 0x1403 -#define GL_INT 0x1404 -#define GL_UNSIGNED_INT 0x1405 -#define GL_FLOAT 0x1406 -#define GL_2_BYTES 0x1407 -#define GL_3_BYTES 0x1408 -#define GL_4_BYTES 0x1409 -#define GL_DOUBLE 0x140A -#define GL_CLEAR 0x1500 -#define GL_AND 0x1501 -#define GL_AND_REVERSE 0x1502 -#define GL_COPY 0x1503 -#define GL_AND_INVERTED 0x1504 -#define GL_NOOP 0x1505 -#define GL_XOR 0x1506 -#define GL_OR 0x1507 -#define GL_NOR 0x1508 -#define GL_EQUIV 0x1509 -#define GL_INVERT 0x150A -#define GL_OR_REVERSE 0x150B -#define GL_COPY_INVERTED 0x150C -#define GL_OR_INVERTED 0x150D -#define GL_NAND 0x150E -#define GL_SET 0x150F -#define GL_EMISSION 0x1600 -#define GL_SHININESS 0x1601 -#define GL_AMBIENT_AND_DIFFUSE 0x1602 -#define GL_COLOR_INDEXES 0x1603 -#define GL_MODELVIEW 0x1700 -#define GL_PROJECTION 0x1701 -#define GL_TEXTURE 0x1702 -#define GL_COLOR 0x1800 -#define GL_DEPTH 0x1801 -#define GL_STENCIL 0x1802 -#define GL_COLOR_INDEX 0x1900 -#define GL_STENCIL_INDEX 0x1901 -#define GL_DEPTH_COMPONENT 0x1902 -#define GL_RED 0x1903 -#define GL_GREEN 0x1904 -#define GL_BLUE 0x1905 -#define GL_ALPHA 0x1906 -#define GL_RGB 0x1907 -#define GL_RGBA 0x1908 -#define GL_LUMINANCE 0x1909 -#define GL_LUMINANCE_ALPHA 0x190A -#define GL_BITMAP 0x1A00 -#define GL_POINT 0x1B00 -#define GL_LINE 0x1B01 -#define GL_FILL 0x1B02 -#define GL_RENDER 0x1C00 -#define GL_FEEDBACK 0x1C01 -#define GL_SELECT 0x1C02 -#define GL_FLAT 0x1D00 -#define GL_SMOOTH 0x1D01 -#define GL_KEEP 0x1E00 -#define GL_REPLACE 0x1E01 -#define GL_INCR 0x1E02 -#define GL_DECR 0x1E03 -#define GL_VENDOR 0x1F00 -#define GL_RENDERER 0x1F01 -#define GL_VERSION 0x1F02 -#define GL_EXTENSIONS 0x1F03 -#define GL_S 0x2000 -#define GL_ENABLE_BIT 0x00002000 -#define GL_T 0x2001 -#define GL_R 0x2002 -#define GL_Q 0x2003 -#define GL_MODULATE 0x2100 -#define GL_DECAL 0x2101 -#define GL_TEXTURE_ENV_MODE 0x2200 -#define GL_TEXTURE_ENV_COLOR 0x2201 -#define GL_TEXTURE_ENV 0x2300 -#define GL_EYE_LINEAR 0x2400 -#define GL_OBJECT_LINEAR 0x2401 -#define GL_SPHERE_MAP 0x2402 -#define GL_TEXTURE_GEN_MODE 0x2500 -#define GL_OBJECT_PLANE 0x2501 -#define GL_EYE_PLANE 0x2502 -#define GL_NEAREST 0x2600 -#define GL_LINEAR 0x2601 -#define GL_NEAREST_MIPMAP_NEAREST 0x2700 -#define GL_LINEAR_MIPMAP_NEAREST 0x2701 -#define GL_NEAREST_MIPMAP_LINEAR 0x2702 -#define GL_LINEAR_MIPMAP_LINEAR 0x2703 -#define GL_TEXTURE_MAG_FILTER 0x2800 -#define GL_TEXTURE_MIN_FILTER 0x2801 -#define GL_TEXTURE_WRAP_S 0x2802 -#define GL_TEXTURE_WRAP_T 0x2803 -#define GL_CLAMP 0x2900 -#define GL_REPEAT 0x2901 -#define GL_POLYGON_OFFSET_UNITS 0x2A00 -#define GL_POLYGON_OFFSET_POINT 0x2A01 -#define GL_POLYGON_OFFSET_LINE 0x2A02 -#define GL_R3_G3_B2 0x2A10 -#define GL_V2F 0x2A20 -#define GL_V3F 0x2A21 -#define GL_C4UB_V2F 0x2A22 -#define GL_C4UB_V3F 0x2A23 -#define GL_C3F_V3F 0x2A24 -#define GL_N3F_V3F 0x2A25 -#define GL_C4F_N3F_V3F 0x2A26 -#define GL_T2F_V3F 0x2A27 -#define GL_T4F_V4F 0x2A28 -#define GL_T2F_C4UB_V3F 0x2A29 -#define GL_T2F_C3F_V3F 0x2A2A -#define GL_T2F_N3F_V3F 0x2A2B -#define GL_T2F_C4F_N3F_V3F 0x2A2C -#define GL_T4F_C4F_N3F_V4F 0x2A2D -#define GL_CLIP_PLANE0 0x3000 -#define GL_CLIP_PLANE1 0x3001 -#define GL_CLIP_PLANE2 0x3002 -#define GL_CLIP_PLANE3 0x3003 -#define GL_CLIP_PLANE4 0x3004 -#define GL_CLIP_PLANE5 0x3005 -#define GL_LIGHT0 0x4000 -#define GL_COLOR_BUFFER_BIT 0x00004000 -#define GL_LIGHT1 0x4001 -#define GL_LIGHT2 0x4002 -#define GL_LIGHT3 0x4003 -#define GL_LIGHT4 0x4004 -#define GL_LIGHT5 0x4005 -#define GL_LIGHT6 0x4006 -#define GL_LIGHT7 0x4007 -#define GL_HINT_BIT 0x00008000 -#define GL_POLYGON_OFFSET_FILL 0x8037 -#define GL_POLYGON_OFFSET_FACTOR 0x8038 -#define GL_ALPHA4 0x803B -#define GL_ALPHA8 0x803C -#define GL_ALPHA12 0x803D -#define GL_ALPHA16 0x803E -#define GL_LUMINANCE4 0x803F -#define GL_LUMINANCE8 0x8040 -#define GL_LUMINANCE12 0x8041 -#define GL_LUMINANCE16 0x8042 -#define GL_LUMINANCE4_ALPHA4 0x8043 -#define GL_LUMINANCE6_ALPHA2 0x8044 -#define GL_LUMINANCE8_ALPHA8 0x8045 -#define GL_LUMINANCE12_ALPHA4 0x8046 -#define GL_LUMINANCE12_ALPHA12 0x8047 -#define GL_LUMINANCE16_ALPHA16 0x8048 -#define GL_INTENSITY 0x8049 -#define GL_INTENSITY4 0x804A -#define GL_INTENSITY8 0x804B -#define GL_INTENSITY12 0x804C -#define GL_INTENSITY16 0x804D -#define GL_RGB4 0x804F -#define GL_RGB5 0x8050 -#define GL_RGB8 0x8051 -#define GL_RGB10 0x8052 -#define GL_RGB12 0x8053 -#define GL_RGB16 0x8054 -#define GL_RGBA2 0x8055 -#define GL_RGBA4 0x8056 -#define GL_RGB5_A1 0x8057 -#define GL_RGBA8 0x8058 -#define GL_RGB10_A2 0x8059 -#define GL_RGBA12 0x805A -#define GL_RGBA16 0x805B -#define GL_TEXTURE_RED_SIZE 0x805C -#define GL_TEXTURE_GREEN_SIZE 0x805D -#define GL_TEXTURE_BLUE_SIZE 0x805E -#define GL_TEXTURE_ALPHA_SIZE 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE 0x8061 -#define GL_PROXY_TEXTURE_1D 0x8063 -#define GL_PROXY_TEXTURE_2D 0x8064 -#define GL_TEXTURE_PRIORITY 0x8066 -#define GL_TEXTURE_RESIDENT 0x8067 -#define GL_TEXTURE_BINDING_1D 0x8068 -#define GL_TEXTURE_BINDING_2D 0x8069 -#define GL_VERTEX_ARRAY 0x8074 -#define GL_NORMAL_ARRAY 0x8075 -#define GL_COLOR_ARRAY 0x8076 -#define GL_INDEX_ARRAY 0x8077 -#define GL_TEXTURE_COORD_ARRAY 0x8078 -#define GL_EDGE_FLAG_ARRAY 0x8079 -#define GL_VERTEX_ARRAY_SIZE 0x807A -#define GL_VERTEX_ARRAY_TYPE 0x807B -#define GL_VERTEX_ARRAY_STRIDE 0x807C -#define GL_NORMAL_ARRAY_TYPE 0x807E -#define GL_NORMAL_ARRAY_STRIDE 0x807F -#define GL_COLOR_ARRAY_SIZE 0x8081 -#define GL_COLOR_ARRAY_TYPE 0x8082 -#define GL_COLOR_ARRAY_STRIDE 0x8083 -#define GL_INDEX_ARRAY_TYPE 0x8085 -#define GL_INDEX_ARRAY_STRIDE 0x8086 -#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A -#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C -#define GL_VERTEX_ARRAY_POINTER 0x808E -#define GL_NORMAL_ARRAY_POINTER 0x808F -#define GL_COLOR_ARRAY_POINTER 0x8090 -#define GL_INDEX_ARRAY_POINTER 0x8091 -#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 -#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 -#define GL_COLOR_INDEX1_EXT 0x80E2 -#define GL_COLOR_INDEX2_EXT 0x80E3 -#define GL_COLOR_INDEX4_EXT 0x80E4 -#define GL_COLOR_INDEX8_EXT 0x80E5 -#define GL_COLOR_INDEX12_EXT 0x80E6 -#define GL_COLOR_INDEX16_EXT 0x80E7 -#define GL_EVAL_BIT 0x00010000 -#define GL_LIST_BIT 0x00020000 -#define GL_TEXTURE_BIT 0x00040000 -#define GL_SCISSOR_BIT 0x00080000 -#define GL_ALL_ATTRIB_BITS 0x000fffff -#define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff - -GLAPI void GLAPIENTRY glAccum (GLenum op, GLfloat value); -GLAPI void GLAPIENTRY glAlphaFunc (GLenum func, GLclampf ref); -GLAPI GLboolean GLAPIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences); -GLAPI void GLAPIENTRY glArrayElement (GLint i); -GLAPI void GLAPIENTRY glBegin (GLenum mode); -GLAPI void GLAPIENTRY glBindTexture (GLenum target, GLuint texture); -GLAPI void GLAPIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); -GLAPI void GLAPIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); -GLAPI void GLAPIENTRY glCallList (GLuint list); -GLAPI void GLAPIENTRY glCallLists (GLsizei n, GLenum type, const void *lists); -GLAPI void GLAPIENTRY glClear (GLbitfield mask); -GLAPI void GLAPIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -GLAPI void GLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -GLAPI void GLAPIENTRY glClearDepth (GLclampd depth); -GLAPI void GLAPIENTRY glClearIndex (GLfloat c); -GLAPI void GLAPIENTRY glClearStencil (GLint s); -GLAPI void GLAPIENTRY glClipPlane (GLenum plane, const GLdouble *equation); -GLAPI void GLAPIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue); -GLAPI void GLAPIENTRY glColor3bv (const GLbyte *v); -GLAPI void GLAPIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue); -GLAPI void GLAPIENTRY glColor3dv (const GLdouble *v); -GLAPI void GLAPIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue); -GLAPI void GLAPIENTRY glColor3fv (const GLfloat *v); -GLAPI void GLAPIENTRY glColor3i (GLint red, GLint green, GLint blue); -GLAPI void GLAPIENTRY glColor3iv (const GLint *v); -GLAPI void GLAPIENTRY glColor3s (GLshort red, GLshort green, GLshort blue); -GLAPI void GLAPIENTRY glColor3sv (const GLshort *v); -GLAPI void GLAPIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue); -GLAPI void GLAPIENTRY glColor3ubv (const GLubyte *v); -GLAPI void GLAPIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue); -GLAPI void GLAPIENTRY glColor3uiv (const GLuint *v); -GLAPI void GLAPIENTRY glColor3us (GLushort red, GLushort green, GLushort blue); -GLAPI void GLAPIENTRY glColor3usv (const GLushort *v); -GLAPI void GLAPIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); -GLAPI void GLAPIENTRY glColor4bv (const GLbyte *v); -GLAPI void GLAPIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); -GLAPI void GLAPIENTRY glColor4dv (const GLdouble *v); -GLAPI void GLAPIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -GLAPI void GLAPIENTRY glColor4fv (const GLfloat *v); -GLAPI void GLAPIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha); -GLAPI void GLAPIENTRY glColor4iv (const GLint *v); -GLAPI void GLAPIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha); -GLAPI void GLAPIENTRY glColor4sv (const GLshort *v); -GLAPI void GLAPIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); -GLAPI void GLAPIENTRY glColor4ubv (const GLubyte *v); -GLAPI void GLAPIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha); -GLAPI void GLAPIENTRY glColor4uiv (const GLuint *v); -GLAPI void GLAPIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha); -GLAPI void GLAPIENTRY glColor4usv (const GLushort *v); -GLAPI void GLAPIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -GLAPI void GLAPIENTRY glColorMaterial (GLenum face, GLenum mode); -GLAPI void GLAPIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); -GLAPI void GLAPIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); -GLAPI void GLAPIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); -GLAPI void GLAPIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GLAPI void GLAPIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI void GLAPIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void GLAPIENTRY glCullFace (GLenum mode); -GLAPI void GLAPIENTRY glDeleteLists (GLuint list, GLsizei range); -GLAPI void GLAPIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); -GLAPI void GLAPIENTRY glDepthFunc (GLenum func); -GLAPI void GLAPIENTRY glDepthMask (GLboolean flag); -GLAPI void GLAPIENTRY glDepthRange (GLclampd zNear, GLclampd zFar); -GLAPI void GLAPIENTRY glDisable (GLenum cap); -GLAPI void GLAPIENTRY glDisableClientState (GLenum array); -GLAPI void GLAPIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); -GLAPI void GLAPIENTRY glDrawBuffer (GLenum mode); -GLAPI void GLAPIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices); -GLAPI void GLAPIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -GLAPI void GLAPIENTRY glEdgeFlag (GLboolean flag); -GLAPI void GLAPIENTRY glEdgeFlagPointer (GLsizei stride, const void *pointer); -GLAPI void GLAPIENTRY glEdgeFlagv (const GLboolean *flag); -GLAPI void GLAPIENTRY glEnable (GLenum cap); -GLAPI void GLAPIENTRY glEnableClientState (GLenum array); -GLAPI void GLAPIENTRY glEnd (void); -GLAPI void GLAPIENTRY glEndList (void); -GLAPI void GLAPIENTRY glEvalCoord1d (GLdouble u); -GLAPI void GLAPIENTRY glEvalCoord1dv (const GLdouble *u); -GLAPI void GLAPIENTRY glEvalCoord1f (GLfloat u); -GLAPI void GLAPIENTRY glEvalCoord1fv (const GLfloat *u); -GLAPI void GLAPIENTRY glEvalCoord2d (GLdouble u, GLdouble v); -GLAPI void GLAPIENTRY glEvalCoord2dv (const GLdouble *u); -GLAPI void GLAPIENTRY glEvalCoord2f (GLfloat u, GLfloat v); -GLAPI void GLAPIENTRY glEvalCoord2fv (const GLfloat *u); -GLAPI void GLAPIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2); -GLAPI void GLAPIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); -GLAPI void GLAPIENTRY glEvalPoint1 (GLint i); -GLAPI void GLAPIENTRY glEvalPoint2 (GLint i, GLint j); -GLAPI void GLAPIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer); -GLAPI void GLAPIENTRY glFinish (void); -GLAPI void GLAPIENTRY glFlush (void); -GLAPI void GLAPIENTRY glFogf (GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glFogfv (GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glFogi (GLenum pname, GLint param); -GLAPI void GLAPIENTRY glFogiv (GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glFrontFace (GLenum mode); -GLAPI void GLAPIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLAPI GLuint GLAPIENTRY glGenLists (GLsizei range); -GLAPI void GLAPIENTRY glGenTextures (GLsizei n, GLuint *textures); -GLAPI void GLAPIENTRY glGetBooleanv (GLenum pname, GLboolean *params); -GLAPI void GLAPIENTRY glGetClipPlane (GLenum plane, GLdouble *equation); -GLAPI void GLAPIENTRY glGetDoublev (GLenum pname, GLdouble *params); -GLAPI GLenum GLAPIENTRY glGetError (void); -GLAPI void GLAPIENTRY glGetFloatv (GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetIntegerv (GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v); -GLAPI void GLAPIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v); -GLAPI void GLAPIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v); -GLAPI void GLAPIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetPixelMapfv (GLenum map, GLfloat *values); -GLAPI void GLAPIENTRY glGetPixelMapuiv (GLenum map, GLuint *values); -GLAPI void GLAPIENTRY glGetPixelMapusv (GLenum map, GLushort *values); -GLAPI void GLAPIENTRY glGetPointerv (GLenum pname, void* *params); -GLAPI void GLAPIENTRY glGetPolygonStipple (GLubyte *mask); -GLAPI const GLubyte * GLAPIENTRY glGetString (GLenum name); -GLAPI void GLAPIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params); -GLAPI void GLAPIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, void *pixels); -GLAPI void GLAPIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glHint (GLenum target, GLenum mode); -GLAPI void GLAPIENTRY glIndexMask (GLuint mask); -GLAPI void GLAPIENTRY glIndexPointer (GLenum type, GLsizei stride, const void *pointer); -GLAPI void GLAPIENTRY glIndexd (GLdouble c); -GLAPI void GLAPIENTRY glIndexdv (const GLdouble *c); -GLAPI void GLAPIENTRY glIndexf (GLfloat c); -GLAPI void GLAPIENTRY glIndexfv (const GLfloat *c); -GLAPI void GLAPIENTRY glIndexi (GLint c); -GLAPI void GLAPIENTRY glIndexiv (const GLint *c); -GLAPI void GLAPIENTRY glIndexs (GLshort c); -GLAPI void GLAPIENTRY glIndexsv (const GLshort *c); -GLAPI void GLAPIENTRY glIndexub (GLubyte c); -GLAPI void GLAPIENTRY glIndexubv (const GLubyte *c); -GLAPI void GLAPIENTRY glInitNames (void); -GLAPI void GLAPIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const void *pointer); -GLAPI GLboolean GLAPIENTRY glIsEnabled (GLenum cap); -GLAPI GLboolean GLAPIENTRY glIsList (GLuint list); -GLAPI GLboolean GLAPIENTRY glIsTexture (GLuint texture); -GLAPI void GLAPIENTRY glLightModelf (GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glLightModelfv (GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glLightModeli (GLenum pname, GLint param); -GLAPI void GLAPIENTRY glLightModeliv (GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glLightf (GLenum light, GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glLighti (GLenum light, GLenum pname, GLint param); -GLAPI void GLAPIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glLineStipple (GLint factor, GLushort pattern); -GLAPI void GLAPIENTRY glLineWidth (GLfloat width); -GLAPI void GLAPIENTRY glListBase (GLuint base); -GLAPI void GLAPIENTRY glLoadIdentity (void); -GLAPI void GLAPIENTRY glLoadMatrixd (const GLdouble *m); -GLAPI void GLAPIENTRY glLoadMatrixf (const GLfloat *m); -GLAPI void GLAPIENTRY glLoadName (GLuint name); -GLAPI void GLAPIENTRY glLogicOp (GLenum opcode); -GLAPI void GLAPIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -GLAPI void GLAPIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -GLAPI void GLAPIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -GLAPI void GLAPIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -GLAPI void GLAPIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2); -GLAPI void GLAPIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2); -GLAPI void GLAPIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); -GLAPI void GLAPIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); -GLAPI void GLAPIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glMateriali (GLenum face, GLenum pname, GLint param); -GLAPI void GLAPIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glMatrixMode (GLenum mode); -GLAPI void GLAPIENTRY glMultMatrixd (const GLdouble *m); -GLAPI void GLAPIENTRY glMultMatrixf (const GLfloat *m); -GLAPI void GLAPIENTRY glNewList (GLuint list, GLenum mode); -GLAPI void GLAPIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz); -GLAPI void GLAPIENTRY glNormal3bv (const GLbyte *v); -GLAPI void GLAPIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz); -GLAPI void GLAPIENTRY glNormal3dv (const GLdouble *v); -GLAPI void GLAPIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz); -GLAPI void GLAPIENTRY glNormal3fv (const GLfloat *v); -GLAPI void GLAPIENTRY glNormal3i (GLint nx, GLint ny, GLint nz); -GLAPI void GLAPIENTRY glNormal3iv (const GLint *v); -GLAPI void GLAPIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz); -GLAPI void GLAPIENTRY glNormal3sv (const GLshort *v); -GLAPI void GLAPIENTRY glNormalPointer (GLenum type, GLsizei stride, const void *pointer); -GLAPI void GLAPIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLAPI void GLAPIENTRY glPassThrough (GLfloat token); -GLAPI void GLAPIENTRY glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values); -GLAPI void GLAPIENTRY glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values); -GLAPI void GLAPIENTRY glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values); -GLAPI void GLAPIENTRY glPixelStoref (GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glPixelStorei (GLenum pname, GLint param); -GLAPI void GLAPIENTRY glPixelTransferf (GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glPixelTransferi (GLenum pname, GLint param); -GLAPI void GLAPIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor); -GLAPI void GLAPIENTRY glPointSize (GLfloat size); -GLAPI void GLAPIENTRY glPolygonMode (GLenum face, GLenum mode); -GLAPI void GLAPIENTRY glPolygonOffset (GLfloat factor, GLfloat units); -GLAPI void GLAPIENTRY glPolygonStipple (const GLubyte *mask); -GLAPI void GLAPIENTRY glPopAttrib (void); -GLAPI void GLAPIENTRY glPopClientAttrib (void); -GLAPI void GLAPIENTRY glPopMatrix (void); -GLAPI void GLAPIENTRY glPopName (void); -GLAPI void GLAPIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities); -GLAPI void GLAPIENTRY glPushAttrib (GLbitfield mask); -GLAPI void GLAPIENTRY glPushClientAttrib (GLbitfield mask); -GLAPI void GLAPIENTRY glPushMatrix (void); -GLAPI void GLAPIENTRY glPushName (GLuint name); -GLAPI void GLAPIENTRY glRasterPos2d (GLdouble x, GLdouble y); -GLAPI void GLAPIENTRY glRasterPos2dv (const GLdouble *v); -GLAPI void GLAPIENTRY glRasterPos2f (GLfloat x, GLfloat y); -GLAPI void GLAPIENTRY glRasterPos2fv (const GLfloat *v); -GLAPI void GLAPIENTRY glRasterPos2i (GLint x, GLint y); -GLAPI void GLAPIENTRY glRasterPos2iv (const GLint *v); -GLAPI void GLAPIENTRY glRasterPos2s (GLshort x, GLshort y); -GLAPI void GLAPIENTRY glRasterPos2sv (const GLshort *v); -GLAPI void GLAPIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z); -GLAPI void GLAPIENTRY glRasterPos3dv (const GLdouble *v); -GLAPI void GLAPIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z); -GLAPI void GLAPIENTRY glRasterPos3fv (const GLfloat *v); -GLAPI void GLAPIENTRY glRasterPos3i (GLint x, GLint y, GLint z); -GLAPI void GLAPIENTRY glRasterPos3iv (const GLint *v); -GLAPI void GLAPIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z); -GLAPI void GLAPIENTRY glRasterPos3sv (const GLshort *v); -GLAPI void GLAPIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void GLAPIENTRY glRasterPos4dv (const GLdouble *v); -GLAPI void GLAPIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void GLAPIENTRY glRasterPos4fv (const GLfloat *v); -GLAPI void GLAPIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w); -GLAPI void GLAPIENTRY glRasterPos4iv (const GLint *v); -GLAPI void GLAPIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void GLAPIENTRY glRasterPos4sv (const GLshort *v); -GLAPI void GLAPIENTRY glReadBuffer (GLenum mode); -GLAPI void GLAPIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); -GLAPI void GLAPIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); -GLAPI void GLAPIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2); -GLAPI void GLAPIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); -GLAPI void GLAPIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2); -GLAPI void GLAPIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2); -GLAPI void GLAPIENTRY glRectiv (const GLint *v1, const GLint *v2); -GLAPI void GLAPIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2); -GLAPI void GLAPIENTRY glRectsv (const GLshort *v1, const GLshort *v2); -GLAPI GLint GLAPIENTRY glRenderMode (GLenum mode); -GLAPI void GLAPIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -GLAPI void GLAPIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -GLAPI void GLAPIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z); -GLAPI void GLAPIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z); -GLAPI void GLAPIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void GLAPIENTRY glSelectBuffer (GLsizei size, GLuint *buffer); -GLAPI void GLAPIENTRY glShadeModel (GLenum mode); -GLAPI void GLAPIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); -GLAPI void GLAPIENTRY glStencilMask (GLuint mask); -GLAPI void GLAPIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); -GLAPI void GLAPIENTRY glTexCoord1d (GLdouble s); -GLAPI void GLAPIENTRY glTexCoord1dv (const GLdouble *v); -GLAPI void GLAPIENTRY glTexCoord1f (GLfloat s); -GLAPI void GLAPIENTRY glTexCoord1fv (const GLfloat *v); -GLAPI void GLAPIENTRY glTexCoord1i (GLint s); -GLAPI void GLAPIENTRY glTexCoord1iv (const GLint *v); -GLAPI void GLAPIENTRY glTexCoord1s (GLshort s); -GLAPI void GLAPIENTRY glTexCoord1sv (const GLshort *v); -GLAPI void GLAPIENTRY glTexCoord2d (GLdouble s, GLdouble t); -GLAPI void GLAPIENTRY glTexCoord2dv (const GLdouble *v); -GLAPI void GLAPIENTRY glTexCoord2f (GLfloat s, GLfloat t); -GLAPI void GLAPIENTRY glTexCoord2fv (const GLfloat *v); -GLAPI void GLAPIENTRY glTexCoord2i (GLint s, GLint t); -GLAPI void GLAPIENTRY glTexCoord2iv (const GLint *v); -GLAPI void GLAPIENTRY glTexCoord2s (GLshort s, GLshort t); -GLAPI void GLAPIENTRY glTexCoord2sv (const GLshort *v); -GLAPI void GLAPIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r); -GLAPI void GLAPIENTRY glTexCoord3dv (const GLdouble *v); -GLAPI void GLAPIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r); -GLAPI void GLAPIENTRY glTexCoord3fv (const GLfloat *v); -GLAPI void GLAPIENTRY glTexCoord3i (GLint s, GLint t, GLint r); -GLAPI void GLAPIENTRY glTexCoord3iv (const GLint *v); -GLAPI void GLAPIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r); -GLAPI void GLAPIENTRY glTexCoord3sv (const GLshort *v); -GLAPI void GLAPIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q); -GLAPI void GLAPIENTRY glTexCoord4dv (const GLdouble *v); -GLAPI void GLAPIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q); -GLAPI void GLAPIENTRY glTexCoord4fv (const GLfloat *v); -GLAPI void GLAPIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q); -GLAPI void GLAPIENTRY glTexCoord4iv (const GLint *v); -GLAPI void GLAPIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q); -GLAPI void GLAPIENTRY glTexCoord4sv (const GLshort *v); -GLAPI void GLAPIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); -GLAPI void GLAPIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param); -GLAPI void GLAPIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param); -GLAPI void GLAPIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params); -GLAPI void GLAPIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param); -GLAPI void GLAPIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void GLAPIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void GLAPIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); -GLAPI void GLAPIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -GLAPI void GLAPIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -GLAPI void GLAPIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z); -GLAPI void GLAPIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z); -GLAPI void GLAPIENTRY glVertex2d (GLdouble x, GLdouble y); -GLAPI void GLAPIENTRY glVertex2dv (const GLdouble *v); -GLAPI void GLAPIENTRY glVertex2f (GLfloat x, GLfloat y); -GLAPI void GLAPIENTRY glVertex2fv (const GLfloat *v); -GLAPI void GLAPIENTRY glVertex2i (GLint x, GLint y); -GLAPI void GLAPIENTRY glVertex2iv (const GLint *v); -GLAPI void GLAPIENTRY glVertex2s (GLshort x, GLshort y); -GLAPI void GLAPIENTRY glVertex2sv (const GLshort *v); -GLAPI void GLAPIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z); -GLAPI void GLAPIENTRY glVertex3dv (const GLdouble *v); -GLAPI void GLAPIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z); -GLAPI void GLAPIENTRY glVertex3fv (const GLfloat *v); -GLAPI void GLAPIENTRY glVertex3i (GLint x, GLint y, GLint z); -GLAPI void GLAPIENTRY glVertex3iv (const GLint *v); -GLAPI void GLAPIENTRY glVertex3s (GLshort x, GLshort y, GLshort z); -GLAPI void GLAPIENTRY glVertex3sv (const GLshort *v); -GLAPI void GLAPIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void GLAPIENTRY glVertex4dv (const GLdouble *v); -GLAPI void GLAPIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void GLAPIENTRY glVertex4fv (const GLfloat *v); -GLAPI void GLAPIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w); -GLAPI void GLAPIENTRY glVertex4iv (const GLint *v); -GLAPI void GLAPIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void GLAPIENTRY glVertex4sv (const GLshort *v); -GLAPI void GLAPIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); -GLAPI void GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); - -#define GLEW_VERSION_1_1 GLEW_GET_VAR(__GLEW_VERSION_1_1) - -#endif /* GL_VERSION_1_1 */ - -/* ---------------------------------- GLU ---------------------------------- */ - -#ifndef GLEW_NO_GLU -# ifdef __APPLE__ -# include -# if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) -# define GLEW_NO_GLU -# endif -# endif -#endif - -#ifndef GLEW_NO_GLU -/* this is where we can safely include GLU */ -# if defined(__APPLE__) && defined(__MACH__) -# include -# else -# include -# endif -#endif - -/* ----------------------------- GL_VERSION_1_2 ---------------------------- */ - -#ifndef GL_VERSION_1_2 -#define GL_VERSION_1_2 1 - -#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 -#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 -#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#define GL_RESCALE_NORMAL 0x803A -#define GL_TEXTURE_BINDING_3D 0x806A -#define GL_PACK_SKIP_IMAGES 0x806B -#define GL_PACK_IMAGE_HEIGHT 0x806C -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_TEXTURE_3D 0x806F -#define GL_PROXY_TEXTURE_3D 0x8070 -#define GL_TEXTURE_DEPTH 0x8071 -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_BGR 0x80E0 -#define GL_BGRA 0x80E1 -#define GL_MAX_ELEMENTS_VERTICES 0x80E8 -#define GL_MAX_ELEMENTS_INDICES 0x80E9 -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_MAX_LEVEL 0x813D -#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 -#define GL_SINGLE_COLOR 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR 0x81FA -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_ALIASED_POINT_SIZE_RANGE 0x846D -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E - -typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); -typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); - -#define glCopyTexSubImage3D GLEW_GET_FUN(__glewCopyTexSubImage3D) -#define glDrawRangeElements GLEW_GET_FUN(__glewDrawRangeElements) -#define glTexImage3D GLEW_GET_FUN(__glewTexImage3D) -#define glTexSubImage3D GLEW_GET_FUN(__glewTexSubImage3D) - -#define GLEW_VERSION_1_2 GLEW_GET_VAR(__GLEW_VERSION_1_2) - -#endif /* GL_VERSION_1_2 */ - -/* ---------------------------- GL_VERSION_1_2_1 --------------------------- */ - -#ifndef GL_VERSION_1_2_1 -#define GL_VERSION_1_2_1 1 - -#define GLEW_VERSION_1_2_1 GLEW_GET_VAR(__GLEW_VERSION_1_2_1) - -#endif /* GL_VERSION_1_2_1 */ - -/* ----------------------------- GL_VERSION_1_3 ---------------------------- */ - -#ifndef GL_VERSION_1_3 -#define GL_VERSION_1_3 1 - -#define GL_MULTISAMPLE 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE 0x809F -#define GL_SAMPLE_COVERAGE 0x80A0 -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB -#define GL_CLAMP_TO_BORDER 0x812D -#define GL_TEXTURE0 0x84C0 -#define GL_TEXTURE1 0x84C1 -#define GL_TEXTURE2 0x84C2 -#define GL_TEXTURE3 0x84C3 -#define GL_TEXTURE4 0x84C4 -#define GL_TEXTURE5 0x84C5 -#define GL_TEXTURE6 0x84C6 -#define GL_TEXTURE7 0x84C7 -#define GL_TEXTURE8 0x84C8 -#define GL_TEXTURE9 0x84C9 -#define GL_TEXTURE10 0x84CA -#define GL_TEXTURE11 0x84CB -#define GL_TEXTURE12 0x84CC -#define GL_TEXTURE13 0x84CD -#define GL_TEXTURE14 0x84CE -#define GL_TEXTURE15 0x84CF -#define GL_TEXTURE16 0x84D0 -#define GL_TEXTURE17 0x84D1 -#define GL_TEXTURE18 0x84D2 -#define GL_TEXTURE19 0x84D3 -#define GL_TEXTURE20 0x84D4 -#define GL_TEXTURE21 0x84D5 -#define GL_TEXTURE22 0x84D6 -#define GL_TEXTURE23 0x84D7 -#define GL_TEXTURE24 0x84D8 -#define GL_TEXTURE25 0x84D9 -#define GL_TEXTURE26 0x84DA -#define GL_TEXTURE27 0x84DB -#define GL_TEXTURE28 0x84DC -#define GL_TEXTURE29 0x84DD -#define GL_TEXTURE30 0x84DE -#define GL_TEXTURE31 0x84DF -#define GL_ACTIVE_TEXTURE 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 -#define GL_MAX_TEXTURE_UNITS 0x84E2 -#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 -#define GL_SUBTRACT 0x84E7 -#define GL_COMPRESSED_ALPHA 0x84E9 -#define GL_COMPRESSED_LUMINANCE 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB -#define GL_COMPRESSED_INTENSITY 0x84EC -#define GL_COMPRESSED_RGB 0x84ED -#define GL_COMPRESSED_RGBA 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT 0x84EF -#define GL_NORMAL_MAP 0x8511 -#define GL_REFLECTION_MAP 0x8512 -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C -#define GL_COMBINE 0x8570 -#define GL_COMBINE_RGB 0x8571 -#define GL_COMBINE_ALPHA 0x8572 -#define GL_RGB_SCALE 0x8573 -#define GL_ADD_SIGNED 0x8574 -#define GL_INTERPOLATE 0x8575 -#define GL_CONSTANT 0x8576 -#define GL_PRIMARY_COLOR 0x8577 -#define GL_PREVIOUS 0x8578 -#define GL_SOURCE0_RGB 0x8580 -#define GL_SOURCE1_RGB 0x8581 -#define GL_SOURCE2_RGB 0x8582 -#define GL_SOURCE0_ALPHA 0x8588 -#define GL_SOURCE1_ALPHA 0x8589 -#define GL_SOURCE2_ALPHA 0x858A -#define GL_OPERAND0_RGB 0x8590 -#define GL_OPERAND1_RGB 0x8591 -#define GL_OPERAND2_RGB 0x8592 -#define GL_OPERAND0_ALPHA 0x8598 -#define GL_OPERAND1_ALPHA 0x8599 -#define GL_OPERAND2_ALPHA 0x859A -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 -#define GL_TEXTURE_COMPRESSED 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 -#define GL_DOT3_RGB 0x86AE -#define GL_DOT3_RGBA 0x86AF -#define GL_MULTISAMPLE_BIT 0x20000000 - -typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture); -typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, void *img); -typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); -typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); -typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); -typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); - -#define glActiveTexture GLEW_GET_FUN(__glewActiveTexture) -#define glClientActiveTexture GLEW_GET_FUN(__glewClientActiveTexture) -#define glCompressedTexImage1D GLEW_GET_FUN(__glewCompressedTexImage1D) -#define glCompressedTexImage2D GLEW_GET_FUN(__glewCompressedTexImage2D) -#define glCompressedTexImage3D GLEW_GET_FUN(__glewCompressedTexImage3D) -#define glCompressedTexSubImage1D GLEW_GET_FUN(__glewCompressedTexSubImage1D) -#define glCompressedTexSubImage2D GLEW_GET_FUN(__glewCompressedTexSubImage2D) -#define glCompressedTexSubImage3D GLEW_GET_FUN(__glewCompressedTexSubImage3D) -#define glGetCompressedTexImage GLEW_GET_FUN(__glewGetCompressedTexImage) -#define glLoadTransposeMatrixd GLEW_GET_FUN(__glewLoadTransposeMatrixd) -#define glLoadTransposeMatrixf GLEW_GET_FUN(__glewLoadTransposeMatrixf) -#define glMultTransposeMatrixd GLEW_GET_FUN(__glewMultTransposeMatrixd) -#define glMultTransposeMatrixf GLEW_GET_FUN(__glewMultTransposeMatrixf) -#define glMultiTexCoord1d GLEW_GET_FUN(__glewMultiTexCoord1d) -#define glMultiTexCoord1dv GLEW_GET_FUN(__glewMultiTexCoord1dv) -#define glMultiTexCoord1f GLEW_GET_FUN(__glewMultiTexCoord1f) -#define glMultiTexCoord1fv GLEW_GET_FUN(__glewMultiTexCoord1fv) -#define glMultiTexCoord1i GLEW_GET_FUN(__glewMultiTexCoord1i) -#define glMultiTexCoord1iv GLEW_GET_FUN(__glewMultiTexCoord1iv) -#define glMultiTexCoord1s GLEW_GET_FUN(__glewMultiTexCoord1s) -#define glMultiTexCoord1sv GLEW_GET_FUN(__glewMultiTexCoord1sv) -#define glMultiTexCoord2d GLEW_GET_FUN(__glewMultiTexCoord2d) -#define glMultiTexCoord2dv GLEW_GET_FUN(__glewMultiTexCoord2dv) -#define glMultiTexCoord2f GLEW_GET_FUN(__glewMultiTexCoord2f) -#define glMultiTexCoord2fv GLEW_GET_FUN(__glewMultiTexCoord2fv) -#define glMultiTexCoord2i GLEW_GET_FUN(__glewMultiTexCoord2i) -#define glMultiTexCoord2iv GLEW_GET_FUN(__glewMultiTexCoord2iv) -#define glMultiTexCoord2s GLEW_GET_FUN(__glewMultiTexCoord2s) -#define glMultiTexCoord2sv GLEW_GET_FUN(__glewMultiTexCoord2sv) -#define glMultiTexCoord3d GLEW_GET_FUN(__glewMultiTexCoord3d) -#define glMultiTexCoord3dv GLEW_GET_FUN(__glewMultiTexCoord3dv) -#define glMultiTexCoord3f GLEW_GET_FUN(__glewMultiTexCoord3f) -#define glMultiTexCoord3fv GLEW_GET_FUN(__glewMultiTexCoord3fv) -#define glMultiTexCoord3i GLEW_GET_FUN(__glewMultiTexCoord3i) -#define glMultiTexCoord3iv GLEW_GET_FUN(__glewMultiTexCoord3iv) -#define glMultiTexCoord3s GLEW_GET_FUN(__glewMultiTexCoord3s) -#define glMultiTexCoord3sv GLEW_GET_FUN(__glewMultiTexCoord3sv) -#define glMultiTexCoord4d GLEW_GET_FUN(__glewMultiTexCoord4d) -#define glMultiTexCoord4dv GLEW_GET_FUN(__glewMultiTexCoord4dv) -#define glMultiTexCoord4f GLEW_GET_FUN(__glewMultiTexCoord4f) -#define glMultiTexCoord4fv GLEW_GET_FUN(__glewMultiTexCoord4fv) -#define glMultiTexCoord4i GLEW_GET_FUN(__glewMultiTexCoord4i) -#define glMultiTexCoord4iv GLEW_GET_FUN(__glewMultiTexCoord4iv) -#define glMultiTexCoord4s GLEW_GET_FUN(__glewMultiTexCoord4s) -#define glMultiTexCoord4sv GLEW_GET_FUN(__glewMultiTexCoord4sv) -#define glSampleCoverage GLEW_GET_FUN(__glewSampleCoverage) - -#define GLEW_VERSION_1_3 GLEW_GET_VAR(__GLEW_VERSION_1_3) - -#endif /* GL_VERSION_1_3 */ - -/* ----------------------------- GL_VERSION_1_4 ---------------------------- */ - -#ifndef GL_VERSION_1_4 -#define GL_VERSION_1_4 1 - -#define GL_BLEND_DST_RGB 0x80C8 -#define GL_BLEND_SRC_RGB 0x80C9 -#define GL_BLEND_DST_ALPHA 0x80CA -#define GL_BLEND_SRC_ALPHA 0x80CB -#define GL_POINT_SIZE_MIN 0x8126 -#define GL_POINT_SIZE_MAX 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION 0x8129 -#define GL_GENERATE_MIPMAP 0x8191 -#define GL_GENERATE_MIPMAP_HINT 0x8192 -#define GL_DEPTH_COMPONENT16 0x81A5 -#define GL_DEPTH_COMPONENT24 0x81A6 -#define GL_DEPTH_COMPONENT32 0x81A7 -#define GL_MIRRORED_REPEAT 0x8370 -#define GL_FOG_COORDINATE_SOURCE 0x8450 -#define GL_FOG_COORDINATE 0x8451 -#define GL_FRAGMENT_DEPTH 0x8452 -#define GL_CURRENT_FOG_COORDINATE 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 -#define GL_FOG_COORDINATE_ARRAY 0x8457 -#define GL_COLOR_SUM 0x8458 -#define GL_CURRENT_SECONDARY_COLOR 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D -#define GL_SECONDARY_COLOR_ARRAY 0x845E -#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD -#define GL_TEXTURE_FILTER_CONTROL 0x8500 -#define GL_TEXTURE_LOD_BIAS 0x8501 -#define GL_INCR_WRAP 0x8507 -#define GL_DECR_WRAP 0x8508 -#define GL_TEXTURE_DEPTH_SIZE 0x884A -#define GL_DEPTH_TEXTURE_MODE 0x884B -#define GL_TEXTURE_COMPARE_MODE 0x884C -#define GL_TEXTURE_COMPARE_FUNC 0x884D -#define GL_COMPARE_R_TO_TEXTURE 0x884E - -typedef void (GLAPIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const void *pointer); -typedef void (GLAPIENTRY * PFNGLFOGCOORDDPROC) (GLdouble coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDDVPROC) (const GLdouble *coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDFPROC) (GLfloat coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDFVPROC) (const GLfloat *coord); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const* indices, GLsizei drawcount); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVPROC) (const GLdouble *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVPROC) (const GLfloat *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVPROC) (const GLint *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVPROC) (const GLshort *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVPROC) (const GLdouble *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVPROC) (const GLfloat *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVPROC) (const GLint *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVPROC) (const GLshort *p); - -#define glBlendColor GLEW_GET_FUN(__glewBlendColor) -#define glBlendEquation GLEW_GET_FUN(__glewBlendEquation) -#define glBlendFuncSeparate GLEW_GET_FUN(__glewBlendFuncSeparate) -#define glFogCoordPointer GLEW_GET_FUN(__glewFogCoordPointer) -#define glFogCoordd GLEW_GET_FUN(__glewFogCoordd) -#define glFogCoorddv GLEW_GET_FUN(__glewFogCoorddv) -#define glFogCoordf GLEW_GET_FUN(__glewFogCoordf) -#define glFogCoordfv GLEW_GET_FUN(__glewFogCoordfv) -#define glMultiDrawArrays GLEW_GET_FUN(__glewMultiDrawArrays) -#define glMultiDrawElements GLEW_GET_FUN(__glewMultiDrawElements) -#define glPointParameterf GLEW_GET_FUN(__glewPointParameterf) -#define glPointParameterfv GLEW_GET_FUN(__glewPointParameterfv) -#define glPointParameteri GLEW_GET_FUN(__glewPointParameteri) -#define glPointParameteriv GLEW_GET_FUN(__glewPointParameteriv) -#define glSecondaryColor3b GLEW_GET_FUN(__glewSecondaryColor3b) -#define glSecondaryColor3bv GLEW_GET_FUN(__glewSecondaryColor3bv) -#define glSecondaryColor3d GLEW_GET_FUN(__glewSecondaryColor3d) -#define glSecondaryColor3dv GLEW_GET_FUN(__glewSecondaryColor3dv) -#define glSecondaryColor3f GLEW_GET_FUN(__glewSecondaryColor3f) -#define glSecondaryColor3fv GLEW_GET_FUN(__glewSecondaryColor3fv) -#define glSecondaryColor3i GLEW_GET_FUN(__glewSecondaryColor3i) -#define glSecondaryColor3iv GLEW_GET_FUN(__glewSecondaryColor3iv) -#define glSecondaryColor3s GLEW_GET_FUN(__glewSecondaryColor3s) -#define glSecondaryColor3sv GLEW_GET_FUN(__glewSecondaryColor3sv) -#define glSecondaryColor3ub GLEW_GET_FUN(__glewSecondaryColor3ub) -#define glSecondaryColor3ubv GLEW_GET_FUN(__glewSecondaryColor3ubv) -#define glSecondaryColor3ui GLEW_GET_FUN(__glewSecondaryColor3ui) -#define glSecondaryColor3uiv GLEW_GET_FUN(__glewSecondaryColor3uiv) -#define glSecondaryColor3us GLEW_GET_FUN(__glewSecondaryColor3us) -#define glSecondaryColor3usv GLEW_GET_FUN(__glewSecondaryColor3usv) -#define glSecondaryColorPointer GLEW_GET_FUN(__glewSecondaryColorPointer) -#define glWindowPos2d GLEW_GET_FUN(__glewWindowPos2d) -#define glWindowPos2dv GLEW_GET_FUN(__glewWindowPos2dv) -#define glWindowPos2f GLEW_GET_FUN(__glewWindowPos2f) -#define glWindowPos2fv GLEW_GET_FUN(__glewWindowPos2fv) -#define glWindowPos2i GLEW_GET_FUN(__glewWindowPos2i) -#define glWindowPos2iv GLEW_GET_FUN(__glewWindowPos2iv) -#define glWindowPos2s GLEW_GET_FUN(__glewWindowPos2s) -#define glWindowPos2sv GLEW_GET_FUN(__glewWindowPos2sv) -#define glWindowPos3d GLEW_GET_FUN(__glewWindowPos3d) -#define glWindowPos3dv GLEW_GET_FUN(__glewWindowPos3dv) -#define glWindowPos3f GLEW_GET_FUN(__glewWindowPos3f) -#define glWindowPos3fv GLEW_GET_FUN(__glewWindowPos3fv) -#define glWindowPos3i GLEW_GET_FUN(__glewWindowPos3i) -#define glWindowPos3iv GLEW_GET_FUN(__glewWindowPos3iv) -#define glWindowPos3s GLEW_GET_FUN(__glewWindowPos3s) -#define glWindowPos3sv GLEW_GET_FUN(__glewWindowPos3sv) - -#define GLEW_VERSION_1_4 GLEW_GET_VAR(__GLEW_VERSION_1_4) - -#endif /* GL_VERSION_1_4 */ - -/* ----------------------------- GL_VERSION_1_5 ---------------------------- */ - -#ifndef GL_VERSION_1_5 -#define GL_VERSION_1_5 1 - -#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE -#define GL_FOG_COORD GL_FOG_COORDINATE -#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY -#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING -#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER -#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE -#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE -#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE -#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA -#define GL_SRC0_RGB GL_SOURCE0_RGB -#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA -#define GL_SRC1_RGB GL_SOURCE1_RGB -#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA -#define GL_SRC2_RGB GL_SOURCE2_RGB -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 -#define GL_QUERY_COUNTER_BITS 0x8864 -#define GL_CURRENT_QUERY 0x8865 -#define GL_QUERY_RESULT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE 0x8867 -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_ARRAY_BUFFER_BINDING 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F -#define GL_READ_ONLY 0x88B8 -#define GL_WRITE_ONLY 0x88B9 -#define GL_READ_WRITE 0x88BA -#define GL_BUFFER_ACCESS 0x88BB -#define GL_BUFFER_MAPPED 0x88BC -#define GL_BUFFER_MAP_POINTER 0x88BD -#define GL_STREAM_DRAW 0x88E0 -#define GL_STREAM_READ 0x88E1 -#define GL_STREAM_COPY 0x88E2 -#define GL_STATIC_DRAW 0x88E4 -#define GL_STATIC_READ 0x88E5 -#define GL_STATIC_COPY 0x88E6 -#define GL_DYNAMIC_DRAW 0x88E8 -#define GL_DYNAMIC_READ 0x88E9 -#define GL_DYNAMIC_COPY 0x88EA -#define GL_SAMPLES_PASSED 0x8914 - -typedef ptrdiff_t GLintptr; -typedef ptrdiff_t GLsizeiptr; - -typedef void (GLAPIENTRY * PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void* data, GLenum usage); -typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void* data); -typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint* buffers); -typedef void (GLAPIENTRY * PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLENDQUERYPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLGENBUFFERSPROC) (GLsizei n, GLuint* buffers); -typedef void (GLAPIENTRY * PFNGLGENQUERIESPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void** params); -typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void* data); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERPROC) (GLuint buffer); -typedef GLboolean (GLAPIENTRY * PFNGLISQUERYPROC) (GLuint id); -typedef void* (GLAPIENTRY * PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); -typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERPROC) (GLenum target); - -#define glBeginQuery GLEW_GET_FUN(__glewBeginQuery) -#define glBindBuffer GLEW_GET_FUN(__glewBindBuffer) -#define glBufferData GLEW_GET_FUN(__glewBufferData) -#define glBufferSubData GLEW_GET_FUN(__glewBufferSubData) -#define glDeleteBuffers GLEW_GET_FUN(__glewDeleteBuffers) -#define glDeleteQueries GLEW_GET_FUN(__glewDeleteQueries) -#define glEndQuery GLEW_GET_FUN(__glewEndQuery) -#define glGenBuffers GLEW_GET_FUN(__glewGenBuffers) -#define glGenQueries GLEW_GET_FUN(__glewGenQueries) -#define glGetBufferParameteriv GLEW_GET_FUN(__glewGetBufferParameteriv) -#define glGetBufferPointerv GLEW_GET_FUN(__glewGetBufferPointerv) -#define glGetBufferSubData GLEW_GET_FUN(__glewGetBufferSubData) -#define glGetQueryObjectiv GLEW_GET_FUN(__glewGetQueryObjectiv) -#define glGetQueryObjectuiv GLEW_GET_FUN(__glewGetQueryObjectuiv) -#define glGetQueryiv GLEW_GET_FUN(__glewGetQueryiv) -#define glIsBuffer GLEW_GET_FUN(__glewIsBuffer) -#define glIsQuery GLEW_GET_FUN(__glewIsQuery) -#define glMapBuffer GLEW_GET_FUN(__glewMapBuffer) -#define glUnmapBuffer GLEW_GET_FUN(__glewUnmapBuffer) - -#define GLEW_VERSION_1_5 GLEW_GET_VAR(__GLEW_VERSION_1_5) - -#endif /* GL_VERSION_1_5 */ - -/* ----------------------------- GL_VERSION_2_0 ---------------------------- */ - -#ifndef GL_VERSION_2_0 -#define GL_VERSION_2_0 1 - -#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB 0x8626 -#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 -#define GL_STENCIL_BACK_FUNC 0x8800 -#define GL_STENCIL_BACK_FAIL 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 -#define GL_MAX_DRAW_BUFFERS 0x8824 -#define GL_DRAW_BUFFER0 0x8825 -#define GL_DRAW_BUFFER1 0x8826 -#define GL_DRAW_BUFFER2 0x8827 -#define GL_DRAW_BUFFER3 0x8828 -#define GL_DRAW_BUFFER4 0x8829 -#define GL_DRAW_BUFFER5 0x882A -#define GL_DRAW_BUFFER6 0x882B -#define GL_DRAW_BUFFER7 0x882C -#define GL_DRAW_BUFFER8 0x882D -#define GL_DRAW_BUFFER9 0x882E -#define GL_DRAW_BUFFER10 0x882F -#define GL_DRAW_BUFFER11 0x8830 -#define GL_DRAW_BUFFER12 0x8831 -#define GL_DRAW_BUFFER13 0x8832 -#define GL_DRAW_BUFFER14 0x8833 -#define GL_DRAW_BUFFER15 0x8834 -#define GL_BLEND_EQUATION_ALPHA 0x883D -#define GL_POINT_SPRITE 0x8861 -#define GL_COORD_REPLACE 0x8862 -#define GL_MAX_VERTEX_ATTRIBS 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_MAX_TEXTURE_COORDS 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A -#define GL_MAX_VARYING_FLOATS 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D -#define GL_SHADER_TYPE 0x8B4F -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT4 0x8B5C -#define GL_SAMPLER_1D 0x8B5D -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_3D 0x8B5F -#define GL_SAMPLER_CUBE 0x8B60 -#define GL_SAMPLER_1D_SHADOW 0x8B61 -#define GL_SAMPLER_2D_SHADOW 0x8B62 -#define GL_DELETE_STATUS 0x8B80 -#define GL_COMPILE_STATUS 0x8B81 -#define GL_LINK_STATUS 0x8B82 -#define GL_VALIDATE_STATUS 0x8B83 -#define GL_INFO_LOG_LENGTH 0x8B84 -#define GL_ATTACHED_SHADERS 0x8B85 -#define GL_ACTIVE_UNIFORMS 0x8B86 -#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 -#define GL_SHADER_SOURCE_LENGTH 0x8B88 -#define GL_ACTIVE_ATTRIBUTES 0x8B89 -#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B -#define GL_SHADING_LANGUAGE_VERSION 0x8B8C -#define GL_CURRENT_PROGRAM 0x8B8D -#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 -#define GL_LOWER_LEFT 0x8CA1 -#define GL_UPPER_LEFT 0x8CA2 -#define GL_STENCIL_BACK_REF 0x8CA3 -#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 -#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 - -typedef void (GLAPIENTRY * PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); -typedef void (GLAPIENTRY * PFNGLCOMPILESHADERPROC) (GLuint shader); -typedef GLuint (GLAPIENTRY * PFNGLCREATEPROGRAMPROC) (void); -typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROC) (GLenum type); -typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPROC) (GLuint program); -typedef void (GLAPIENTRY * PFNGLDELETESHADERPROC) (GLuint shader); -typedef void (GLAPIENTRY * PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum* bufs); -typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders); -typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog); -typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEPROC) (GLuint obj, GLsizei maxLength, GLsizei* length, GLchar* source); -typedef void (GLAPIENTRY * PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint* param); -typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void** pointer); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPROC) (GLuint program); -typedef GLboolean (GLAPIENTRY * PFNGLISSHADERPROC) (GLuint shader); -typedef void (GLAPIENTRY * PFNGLLINKPROGRAMPROC) (GLuint program); -typedef void (GLAPIENTRY * PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const* string, const GLint* length); -typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); -typedef void (GLAPIENTRY * PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); -typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (GLAPIENTRY * PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); -typedef void (GLAPIENTRY * PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM1IPROC) (GLint location, GLint v0); -typedef void (GLAPIENTRY * PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (GLAPIENTRY * PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); -typedef void (GLAPIENTRY * PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (GLAPIENTRY * PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (GLAPIENTRY * PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (GLAPIENTRY * PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GLAPIENTRY * PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUSEPROGRAMPROC) (GLuint program); -typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPROC) (GLuint program); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer); - -#define glAttachShader GLEW_GET_FUN(__glewAttachShader) -#define glBindAttribLocation GLEW_GET_FUN(__glewBindAttribLocation) -#define glBlendEquationSeparate GLEW_GET_FUN(__glewBlendEquationSeparate) -#define glCompileShader GLEW_GET_FUN(__glewCompileShader) -#define glCreateProgram GLEW_GET_FUN(__glewCreateProgram) -#define glCreateShader GLEW_GET_FUN(__glewCreateShader) -#define glDeleteProgram GLEW_GET_FUN(__glewDeleteProgram) -#define glDeleteShader GLEW_GET_FUN(__glewDeleteShader) -#define glDetachShader GLEW_GET_FUN(__glewDetachShader) -#define glDisableVertexAttribArray GLEW_GET_FUN(__glewDisableVertexAttribArray) -#define glDrawBuffers GLEW_GET_FUN(__glewDrawBuffers) -#define glEnableVertexAttribArray GLEW_GET_FUN(__glewEnableVertexAttribArray) -#define glGetActiveAttrib GLEW_GET_FUN(__glewGetActiveAttrib) -#define glGetActiveUniform GLEW_GET_FUN(__glewGetActiveUniform) -#define glGetAttachedShaders GLEW_GET_FUN(__glewGetAttachedShaders) -#define glGetAttribLocation GLEW_GET_FUN(__glewGetAttribLocation) -#define glGetProgramInfoLog GLEW_GET_FUN(__glewGetProgramInfoLog) -#define glGetProgramiv GLEW_GET_FUN(__glewGetProgramiv) -#define glGetShaderInfoLog GLEW_GET_FUN(__glewGetShaderInfoLog) -#define glGetShaderSource GLEW_GET_FUN(__glewGetShaderSource) -#define glGetShaderiv GLEW_GET_FUN(__glewGetShaderiv) -#define glGetUniformLocation GLEW_GET_FUN(__glewGetUniformLocation) -#define glGetUniformfv GLEW_GET_FUN(__glewGetUniformfv) -#define glGetUniformiv GLEW_GET_FUN(__glewGetUniformiv) -#define glGetVertexAttribPointerv GLEW_GET_FUN(__glewGetVertexAttribPointerv) -#define glGetVertexAttribdv GLEW_GET_FUN(__glewGetVertexAttribdv) -#define glGetVertexAttribfv GLEW_GET_FUN(__glewGetVertexAttribfv) -#define glGetVertexAttribiv GLEW_GET_FUN(__glewGetVertexAttribiv) -#define glIsProgram GLEW_GET_FUN(__glewIsProgram) -#define glIsShader GLEW_GET_FUN(__glewIsShader) -#define glLinkProgram GLEW_GET_FUN(__glewLinkProgram) -#define glShaderSource GLEW_GET_FUN(__glewShaderSource) -#define glStencilFuncSeparate GLEW_GET_FUN(__glewStencilFuncSeparate) -#define glStencilMaskSeparate GLEW_GET_FUN(__glewStencilMaskSeparate) -#define glStencilOpSeparate GLEW_GET_FUN(__glewStencilOpSeparate) -#define glUniform1f GLEW_GET_FUN(__glewUniform1f) -#define glUniform1fv GLEW_GET_FUN(__glewUniform1fv) -#define glUniform1i GLEW_GET_FUN(__glewUniform1i) -#define glUniform1iv GLEW_GET_FUN(__glewUniform1iv) -#define glUniform2f GLEW_GET_FUN(__glewUniform2f) -#define glUniform2fv GLEW_GET_FUN(__glewUniform2fv) -#define glUniform2i GLEW_GET_FUN(__glewUniform2i) -#define glUniform2iv GLEW_GET_FUN(__glewUniform2iv) -#define glUniform3f GLEW_GET_FUN(__glewUniform3f) -#define glUniform3fv GLEW_GET_FUN(__glewUniform3fv) -#define glUniform3i GLEW_GET_FUN(__glewUniform3i) -#define glUniform3iv GLEW_GET_FUN(__glewUniform3iv) -#define glUniform4f GLEW_GET_FUN(__glewUniform4f) -#define glUniform4fv GLEW_GET_FUN(__glewUniform4fv) -#define glUniform4i GLEW_GET_FUN(__glewUniform4i) -#define glUniform4iv GLEW_GET_FUN(__glewUniform4iv) -#define glUniformMatrix2fv GLEW_GET_FUN(__glewUniformMatrix2fv) -#define glUniformMatrix3fv GLEW_GET_FUN(__glewUniformMatrix3fv) -#define glUniformMatrix4fv GLEW_GET_FUN(__glewUniformMatrix4fv) -#define glUseProgram GLEW_GET_FUN(__glewUseProgram) -#define glValidateProgram GLEW_GET_FUN(__glewValidateProgram) -#define glVertexAttrib1d GLEW_GET_FUN(__glewVertexAttrib1d) -#define glVertexAttrib1dv GLEW_GET_FUN(__glewVertexAttrib1dv) -#define glVertexAttrib1f GLEW_GET_FUN(__glewVertexAttrib1f) -#define glVertexAttrib1fv GLEW_GET_FUN(__glewVertexAttrib1fv) -#define glVertexAttrib1s GLEW_GET_FUN(__glewVertexAttrib1s) -#define glVertexAttrib1sv GLEW_GET_FUN(__glewVertexAttrib1sv) -#define glVertexAttrib2d GLEW_GET_FUN(__glewVertexAttrib2d) -#define glVertexAttrib2dv GLEW_GET_FUN(__glewVertexAttrib2dv) -#define glVertexAttrib2f GLEW_GET_FUN(__glewVertexAttrib2f) -#define glVertexAttrib2fv GLEW_GET_FUN(__glewVertexAttrib2fv) -#define glVertexAttrib2s GLEW_GET_FUN(__glewVertexAttrib2s) -#define glVertexAttrib2sv GLEW_GET_FUN(__glewVertexAttrib2sv) -#define glVertexAttrib3d GLEW_GET_FUN(__glewVertexAttrib3d) -#define glVertexAttrib3dv GLEW_GET_FUN(__glewVertexAttrib3dv) -#define glVertexAttrib3f GLEW_GET_FUN(__glewVertexAttrib3f) -#define glVertexAttrib3fv GLEW_GET_FUN(__glewVertexAttrib3fv) -#define glVertexAttrib3s GLEW_GET_FUN(__glewVertexAttrib3s) -#define glVertexAttrib3sv GLEW_GET_FUN(__glewVertexAttrib3sv) -#define glVertexAttrib4Nbv GLEW_GET_FUN(__glewVertexAttrib4Nbv) -#define glVertexAttrib4Niv GLEW_GET_FUN(__glewVertexAttrib4Niv) -#define glVertexAttrib4Nsv GLEW_GET_FUN(__glewVertexAttrib4Nsv) -#define glVertexAttrib4Nub GLEW_GET_FUN(__glewVertexAttrib4Nub) -#define glVertexAttrib4Nubv GLEW_GET_FUN(__glewVertexAttrib4Nubv) -#define glVertexAttrib4Nuiv GLEW_GET_FUN(__glewVertexAttrib4Nuiv) -#define glVertexAttrib4Nusv GLEW_GET_FUN(__glewVertexAttrib4Nusv) -#define glVertexAttrib4bv GLEW_GET_FUN(__glewVertexAttrib4bv) -#define glVertexAttrib4d GLEW_GET_FUN(__glewVertexAttrib4d) -#define glVertexAttrib4dv GLEW_GET_FUN(__glewVertexAttrib4dv) -#define glVertexAttrib4f GLEW_GET_FUN(__glewVertexAttrib4f) -#define glVertexAttrib4fv GLEW_GET_FUN(__glewVertexAttrib4fv) -#define glVertexAttrib4iv GLEW_GET_FUN(__glewVertexAttrib4iv) -#define glVertexAttrib4s GLEW_GET_FUN(__glewVertexAttrib4s) -#define glVertexAttrib4sv GLEW_GET_FUN(__glewVertexAttrib4sv) -#define glVertexAttrib4ubv GLEW_GET_FUN(__glewVertexAttrib4ubv) -#define glVertexAttrib4uiv GLEW_GET_FUN(__glewVertexAttrib4uiv) -#define glVertexAttrib4usv GLEW_GET_FUN(__glewVertexAttrib4usv) -#define glVertexAttribPointer GLEW_GET_FUN(__glewVertexAttribPointer) - -#define GLEW_VERSION_2_0 GLEW_GET_VAR(__GLEW_VERSION_2_0) - -#endif /* GL_VERSION_2_0 */ - -/* ----------------------------- GL_VERSION_2_1 ---------------------------- */ - -#ifndef GL_VERSION_2_1 -#define GL_VERSION_2_1 1 - -#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F -#define GL_PIXEL_PACK_BUFFER 0x88EB -#define GL_PIXEL_UNPACK_BUFFER 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF -#define GL_FLOAT_MAT2x3 0x8B65 -#define GL_FLOAT_MAT2x4 0x8B66 -#define GL_FLOAT_MAT3x2 0x8B67 -#define GL_FLOAT_MAT3x4 0x8B68 -#define GL_FLOAT_MAT4x2 0x8B69 -#define GL_FLOAT_MAT4x3 0x8B6A -#define GL_SRGB 0x8C40 -#define GL_SRGB8 0x8C41 -#define GL_SRGB_ALPHA 0x8C42 -#define GL_SRGB8_ALPHA8 0x8C43 -#define GL_SLUMINANCE_ALPHA 0x8C44 -#define GL_SLUMINANCE8_ALPHA8 0x8C45 -#define GL_SLUMINANCE 0x8C46 -#define GL_SLUMINANCE8 0x8C47 -#define GL_COMPRESSED_SRGB 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 -#define GL_COMPRESSED_SLUMINANCE 0x8C4A -#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B - -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - -#define glUniformMatrix2x3fv GLEW_GET_FUN(__glewUniformMatrix2x3fv) -#define glUniformMatrix2x4fv GLEW_GET_FUN(__glewUniformMatrix2x4fv) -#define glUniformMatrix3x2fv GLEW_GET_FUN(__glewUniformMatrix3x2fv) -#define glUniformMatrix3x4fv GLEW_GET_FUN(__glewUniformMatrix3x4fv) -#define glUniformMatrix4x2fv GLEW_GET_FUN(__glewUniformMatrix4x2fv) -#define glUniformMatrix4x3fv GLEW_GET_FUN(__glewUniformMatrix4x3fv) - -#define GLEW_VERSION_2_1 GLEW_GET_VAR(__GLEW_VERSION_2_1) - -#endif /* GL_VERSION_2_1 */ - -/* ----------------------------- GL_VERSION_3_0 ---------------------------- */ - -#ifndef GL_VERSION_3_0 -#define GL_VERSION_3_0 1 - -#define GL_CLIP_DISTANCE0 GL_CLIP_PLANE0 -#define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1 -#define GL_CLIP_DISTANCE2 GL_CLIP_PLANE2 -#define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3 -#define GL_CLIP_DISTANCE4 GL_CLIP_PLANE4 -#define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5 -#define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE_ARB -#define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES -#define GL_MAX_VARYING_COMPONENTS GL_MAX_VARYING_FLOATS -#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001 -#define GL_MAJOR_VERSION 0x821B -#define GL_MINOR_VERSION 0x821C -#define GL_NUM_EXTENSIONS 0x821D -#define GL_CONTEXT_FLAGS 0x821E -#define GL_DEPTH_BUFFER 0x8223 -#define GL_STENCIL_BUFFER 0x8224 -#define GL_RGBA32F 0x8814 -#define GL_RGB32F 0x8815 -#define GL_RGBA16F 0x881A -#define GL_RGB16F 0x881B -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD -#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF -#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 -#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 -#define GL_CLAMP_VERTEX_COLOR 0x891A -#define GL_CLAMP_FRAGMENT_COLOR 0x891B -#define GL_CLAMP_READ_COLOR 0x891C -#define GL_FIXED_ONLY 0x891D -#define GL_TEXTURE_RED_TYPE 0x8C10 -#define GL_TEXTURE_GREEN_TYPE 0x8C11 -#define GL_TEXTURE_BLUE_TYPE 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE 0x8C13 -#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 -#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 -#define GL_TEXTURE_DEPTH_TYPE 0x8C16 -#define GL_TEXTURE_1D_ARRAY 0x8C18 -#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 -#define GL_TEXTURE_2D_ARRAY 0x8C1A -#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B -#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C -#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D -#define GL_R11F_G11F_B10F 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B -#define GL_RGB9_E5 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E -#define GL_TEXTURE_SHARED_SIZE 0x8C3F -#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 -#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 -#define GL_PRIMITIVES_GENERATED 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 -#define GL_RASTERIZER_DISCARD 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B -#define GL_INTERLEAVED_ATTRIBS 0x8C8C -#define GL_SEPARATE_ATTRIBS 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F -#define GL_RGBA32UI 0x8D70 -#define GL_RGB32UI 0x8D71 -#define GL_RGBA16UI 0x8D76 -#define GL_RGB16UI 0x8D77 -#define GL_RGBA8UI 0x8D7C -#define GL_RGB8UI 0x8D7D -#define GL_RGBA32I 0x8D82 -#define GL_RGB32I 0x8D83 -#define GL_RGBA16I 0x8D88 -#define GL_RGB16I 0x8D89 -#define GL_RGBA8I 0x8D8E -#define GL_RGB8I 0x8D8F -#define GL_RED_INTEGER 0x8D94 -#define GL_GREEN_INTEGER 0x8D95 -#define GL_BLUE_INTEGER 0x8D96 -#define GL_ALPHA_INTEGER 0x8D97 -#define GL_RGB_INTEGER 0x8D98 -#define GL_RGBA_INTEGER 0x8D99 -#define GL_BGR_INTEGER 0x8D9A -#define GL_BGRA_INTEGER 0x8D9B -#define GL_SAMPLER_1D_ARRAY 0x8DC0 -#define GL_SAMPLER_2D_ARRAY 0x8DC1 -#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 -#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 -#define GL_UNSIGNED_INT_VEC2 0x8DC6 -#define GL_UNSIGNED_INT_VEC3 0x8DC7 -#define GL_UNSIGNED_INT_VEC4 0x8DC8 -#define GL_INT_SAMPLER_1D 0x8DC9 -#define GL_INT_SAMPLER_2D 0x8DCA -#define GL_INT_SAMPLER_3D 0x8DCB -#define GL_INT_SAMPLER_CUBE 0x8DCC -#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE -#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF -#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 -#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 -#define GL_QUERY_WAIT 0x8E13 -#define GL_QUERY_NO_WAIT 0x8E14 -#define GL_QUERY_BY_REGION_WAIT 0x8E15 -#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 - -typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); -typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); -typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint colorNumber, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); -typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil); -typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawBuffer, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawBuffer, const GLint* value); -typedef void (GLAPIENTRY * PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawBuffer, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLCOLORMASKIPROC) (GLuint buf, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -typedef void (GLAPIENTRY * PFNGLDISABLEIPROC) (GLenum cap, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEIPROC) (GLenum cap, GLuint index); -typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERPROC) (void); -typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKPROC) (void); -typedef void (GLAPIENTRY * PFNGLGETBOOLEANI_VPROC) (GLenum pname, GLuint index, GLboolean* data); -typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar* name); -typedef const GLubyte* (GLAPIENTRY * PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); -typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDIPROC) (GLenum cap, GLuint index); -typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint v0, GLint v1); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint v0, GLuint v1); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint v0, GLint v1, GLint v2); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint v0, GLuint v1, GLuint v2); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void*pointer); - -#define glBeginConditionalRender GLEW_GET_FUN(__glewBeginConditionalRender) -#define glBeginTransformFeedback GLEW_GET_FUN(__glewBeginTransformFeedback) -#define glBindFragDataLocation GLEW_GET_FUN(__glewBindFragDataLocation) -#define glClampColor GLEW_GET_FUN(__glewClampColor) -#define glClearBufferfi GLEW_GET_FUN(__glewClearBufferfi) -#define glClearBufferfv GLEW_GET_FUN(__glewClearBufferfv) -#define glClearBufferiv GLEW_GET_FUN(__glewClearBufferiv) -#define glClearBufferuiv GLEW_GET_FUN(__glewClearBufferuiv) -#define glColorMaski GLEW_GET_FUN(__glewColorMaski) -#define glDisablei GLEW_GET_FUN(__glewDisablei) -#define glEnablei GLEW_GET_FUN(__glewEnablei) -#define glEndConditionalRender GLEW_GET_FUN(__glewEndConditionalRender) -#define glEndTransformFeedback GLEW_GET_FUN(__glewEndTransformFeedback) -#define glGetBooleani_v GLEW_GET_FUN(__glewGetBooleani_v) -#define glGetFragDataLocation GLEW_GET_FUN(__glewGetFragDataLocation) -#define glGetStringi GLEW_GET_FUN(__glewGetStringi) -#define glGetTexParameterIiv GLEW_GET_FUN(__glewGetTexParameterIiv) -#define glGetTexParameterIuiv GLEW_GET_FUN(__glewGetTexParameterIuiv) -#define glGetTransformFeedbackVarying GLEW_GET_FUN(__glewGetTransformFeedbackVarying) -#define glGetUniformuiv GLEW_GET_FUN(__glewGetUniformuiv) -#define glGetVertexAttribIiv GLEW_GET_FUN(__glewGetVertexAttribIiv) -#define glGetVertexAttribIuiv GLEW_GET_FUN(__glewGetVertexAttribIuiv) -#define glIsEnabledi GLEW_GET_FUN(__glewIsEnabledi) -#define glTexParameterIiv GLEW_GET_FUN(__glewTexParameterIiv) -#define glTexParameterIuiv GLEW_GET_FUN(__glewTexParameterIuiv) -#define glTransformFeedbackVaryings GLEW_GET_FUN(__glewTransformFeedbackVaryings) -#define glUniform1ui GLEW_GET_FUN(__glewUniform1ui) -#define glUniform1uiv GLEW_GET_FUN(__glewUniform1uiv) -#define glUniform2ui GLEW_GET_FUN(__glewUniform2ui) -#define glUniform2uiv GLEW_GET_FUN(__glewUniform2uiv) -#define glUniform3ui GLEW_GET_FUN(__glewUniform3ui) -#define glUniform3uiv GLEW_GET_FUN(__glewUniform3uiv) -#define glUniform4ui GLEW_GET_FUN(__glewUniform4ui) -#define glUniform4uiv GLEW_GET_FUN(__glewUniform4uiv) -#define glVertexAttribI1i GLEW_GET_FUN(__glewVertexAttribI1i) -#define glVertexAttribI1iv GLEW_GET_FUN(__glewVertexAttribI1iv) -#define glVertexAttribI1ui GLEW_GET_FUN(__glewVertexAttribI1ui) -#define glVertexAttribI1uiv GLEW_GET_FUN(__glewVertexAttribI1uiv) -#define glVertexAttribI2i GLEW_GET_FUN(__glewVertexAttribI2i) -#define glVertexAttribI2iv GLEW_GET_FUN(__glewVertexAttribI2iv) -#define glVertexAttribI2ui GLEW_GET_FUN(__glewVertexAttribI2ui) -#define glVertexAttribI2uiv GLEW_GET_FUN(__glewVertexAttribI2uiv) -#define glVertexAttribI3i GLEW_GET_FUN(__glewVertexAttribI3i) -#define glVertexAttribI3iv GLEW_GET_FUN(__glewVertexAttribI3iv) -#define glVertexAttribI3ui GLEW_GET_FUN(__glewVertexAttribI3ui) -#define glVertexAttribI3uiv GLEW_GET_FUN(__glewVertexAttribI3uiv) -#define glVertexAttribI4bv GLEW_GET_FUN(__glewVertexAttribI4bv) -#define glVertexAttribI4i GLEW_GET_FUN(__glewVertexAttribI4i) -#define glVertexAttribI4iv GLEW_GET_FUN(__glewVertexAttribI4iv) -#define glVertexAttribI4sv GLEW_GET_FUN(__glewVertexAttribI4sv) -#define glVertexAttribI4ubv GLEW_GET_FUN(__glewVertexAttribI4ubv) -#define glVertexAttribI4ui GLEW_GET_FUN(__glewVertexAttribI4ui) -#define glVertexAttribI4uiv GLEW_GET_FUN(__glewVertexAttribI4uiv) -#define glVertexAttribI4usv GLEW_GET_FUN(__glewVertexAttribI4usv) -#define glVertexAttribIPointer GLEW_GET_FUN(__glewVertexAttribIPointer) - -#define GLEW_VERSION_3_0 GLEW_GET_VAR(__GLEW_VERSION_3_0) - -#endif /* GL_VERSION_3_0 */ - -/* ----------------------------- GL_VERSION_3_1 ---------------------------- */ - -#ifndef GL_VERSION_3_1 -#define GL_VERSION_3_1 1 - -#define GL_TEXTURE_RECTANGLE 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 -#define GL_SAMPLER_2D_RECT 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 -#define GL_TEXTURE_BUFFER 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT 0x8C2E -#define GL_SAMPLER_BUFFER 0x8DC2 -#define GL_INT_SAMPLER_2D_RECT 0x8DCD -#define GL_INT_SAMPLER_BUFFER 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 -#define GL_RED_SNORM 0x8F90 -#define GL_RG_SNORM 0x8F91 -#define GL_RGB_SNORM 0x8F92 -#define GL_RGBA_SNORM 0x8F93 -#define GL_R8_SNORM 0x8F94 -#define GL_RG8_SNORM 0x8F95 -#define GL_RGB8_SNORM 0x8F96 -#define GL_RGBA8_SNORM 0x8F97 -#define GL_R16_SNORM 0x8F98 -#define GL_RG16_SNORM 0x8F99 -#define GL_RGB16_SNORM 0x8F9A -#define GL_RGBA16_SNORM 0x8F9B -#define GL_SIGNED_NORMALIZED 0x8F9C -#define GL_PRIMITIVE_RESTART 0x8F9D -#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E -#define GL_BUFFER_ACCESS_FLAGS 0x911F -#define GL_BUFFER_MAP_LENGTH 0x9120 -#define GL_BUFFER_MAP_OFFSET 0x9121 - -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalFormat, GLuint buffer); - -#define glDrawArraysInstanced GLEW_GET_FUN(__glewDrawArraysInstanced) -#define glDrawElementsInstanced GLEW_GET_FUN(__glewDrawElementsInstanced) -#define glPrimitiveRestartIndex GLEW_GET_FUN(__glewPrimitiveRestartIndex) -#define glTexBuffer GLEW_GET_FUN(__glewTexBuffer) - -#define GLEW_VERSION_3_1 GLEW_GET_VAR(__GLEW_VERSION_3_1) - -#endif /* GL_VERSION_3_1 */ - -/* ----------------------------- GL_VERSION_3_2 ---------------------------- */ - -#ifndef GL_VERSION_3_2 -#define GL_VERSION_3_2 1 - -#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 -#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 -#define GL_LINES_ADJACENCY 0x000A -#define GL_LINE_STRIP_ADJACENCY 0x000B -#define GL_TRIANGLES_ADJACENCY 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D -#define GL_PROGRAM_POINT_SIZE 0x8642 -#define GL_GEOMETRY_VERTICES_OUT 0x8916 -#define GL_GEOMETRY_INPUT_TYPE 0x8917 -#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 -#define GL_GEOMETRY_SHADER 0x8DD9 -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 -#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 -#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 -#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 -#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 -#define GL_CONTEXT_PROFILE_MASK 0x9126 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum value, GLint64 * data); -typedef void (GLAPIENTRY * PFNGLGETINTEGER64I_VPROC) (GLenum pname, GLuint index, GLint64 * data); - -#define glFramebufferTexture GLEW_GET_FUN(__glewFramebufferTexture) -#define glGetBufferParameteri64v GLEW_GET_FUN(__glewGetBufferParameteri64v) -#define glGetInteger64i_v GLEW_GET_FUN(__glewGetInteger64i_v) - -#define GLEW_VERSION_3_2 GLEW_GET_VAR(__GLEW_VERSION_3_2) - -#endif /* GL_VERSION_3_2 */ - -/* ----------------------------- GL_VERSION_3_3 ---------------------------- */ - -#ifndef GL_VERSION_3_3 -#define GL_VERSION_3_3 1 - -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE -#define GL_RGB10_A2UI 0x906F - -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); - -#define glVertexAttribDivisor GLEW_GET_FUN(__glewVertexAttribDivisor) - -#define GLEW_VERSION_3_3 GLEW_GET_VAR(__GLEW_VERSION_3_3) - -#endif /* GL_VERSION_3_3 */ - -/* ----------------------------- GL_VERSION_4_0 ---------------------------- */ - -#ifndef GL_VERSION_4_0 -#define GL_VERSION_4_0 1 - -#define GL_SAMPLE_SHADING 0x8C36 -#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F -#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS 0x8F9F -#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B -#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F - -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGPROC) (GLclampf value); - -#define glBlendEquationSeparatei GLEW_GET_FUN(__glewBlendEquationSeparatei) -#define glBlendEquationi GLEW_GET_FUN(__glewBlendEquationi) -#define glBlendFuncSeparatei GLEW_GET_FUN(__glewBlendFuncSeparatei) -#define glBlendFunci GLEW_GET_FUN(__glewBlendFunci) -#define glMinSampleShading GLEW_GET_FUN(__glewMinSampleShading) - -#define GLEW_VERSION_4_0 GLEW_GET_VAR(__GLEW_VERSION_4_0) - -#endif /* GL_VERSION_4_0 */ - -/* ----------------------------- GL_VERSION_4_1 ---------------------------- */ - -#ifndef GL_VERSION_4_1 -#define GL_VERSION_4_1 1 - -#define GLEW_VERSION_4_1 GLEW_GET_VAR(__GLEW_VERSION_4_1) - -#endif /* GL_VERSION_4_1 */ - -/* ----------------------------- GL_VERSION_4_2 ---------------------------- */ - -#ifndef GL_VERSION_4_2 -#define GL_VERSION_4_2 1 - -#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 -#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 -#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C -#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D -#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E -#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F -#define GL_COPY_READ_BUFFER_BINDING 0x8F36 -#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 - -#define GLEW_VERSION_4_2 GLEW_GET_VAR(__GLEW_VERSION_4_2) - -#endif /* GL_VERSION_4_2 */ - -/* ----------------------------- GL_VERSION_4_3 ---------------------------- */ - -#ifndef GL_VERSION_4_3 -#define GL_VERSION_4_3 1 - -#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 -#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E - -#define GLEW_VERSION_4_3 GLEW_GET_VAR(__GLEW_VERSION_4_3) - -#endif /* GL_VERSION_4_3 */ - -/* ----------------------------- GL_VERSION_4_4 ---------------------------- */ - -#ifndef GL_VERSION_4_4 -#define GL_VERSION_4_4 1 - -#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 -#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 -#define GL_TEXTURE_BUFFER_BINDING 0x8C2A - -#define GLEW_VERSION_4_4 GLEW_GET_VAR(__GLEW_VERSION_4_4) - -#endif /* GL_VERSION_4_4 */ - -/* ----------------------------- GL_VERSION_4_5 ---------------------------- */ - -#ifndef GL_VERSION_4_5 -#define GL_VERSION_4_5 1 - -#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 - -typedef GLenum (GLAPIENTRY * PFNGLGETGRAPHICSRESETSTATUSPROC) (void); -typedef void (GLAPIENTRY * PFNGLGETNCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLsizei bufSize, GLvoid *pixels); -typedef void (GLAPIENTRY * PFNGLGETNTEXIMAGEPROC) (GLenum tex, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *pixels); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMDVPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); - -#define glGetGraphicsResetStatus GLEW_GET_FUN(__glewGetGraphicsResetStatus) -#define glGetnCompressedTexImage GLEW_GET_FUN(__glewGetnCompressedTexImage) -#define glGetnTexImage GLEW_GET_FUN(__glewGetnTexImage) -#define glGetnUniformdv GLEW_GET_FUN(__glewGetnUniformdv) - -#define GLEW_VERSION_4_5 GLEW_GET_VAR(__GLEW_VERSION_4_5) - -#endif /* GL_VERSION_4_5 */ - -/* -------------------------- GL_3DFX_multisample -------------------------- */ - -#ifndef GL_3DFX_multisample -#define GL_3DFX_multisample 1 - -#define GL_MULTISAMPLE_3DFX 0x86B2 -#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 -#define GL_SAMPLES_3DFX 0x86B4 -#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 - -#define GLEW_3DFX_multisample GLEW_GET_VAR(__GLEW_3DFX_multisample) - -#endif /* GL_3DFX_multisample */ - -/* ---------------------------- GL_3DFX_tbuffer ---------------------------- */ - -#ifndef GL_3DFX_tbuffer -#define GL_3DFX_tbuffer 1 - -typedef void (GLAPIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); - -#define glTbufferMask3DFX GLEW_GET_FUN(__glewTbufferMask3DFX) - -#define GLEW_3DFX_tbuffer GLEW_GET_VAR(__GLEW_3DFX_tbuffer) - -#endif /* GL_3DFX_tbuffer */ - -/* -------------------- GL_3DFX_texture_compression_FXT1 ------------------- */ - -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_3DFX_texture_compression_FXT1 1 - -#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 -#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 - -#define GLEW_3DFX_texture_compression_FXT1 GLEW_GET_VAR(__GLEW_3DFX_texture_compression_FXT1) - -#endif /* GL_3DFX_texture_compression_FXT1 */ - -/* ----------------------- GL_AMD_blend_minmax_factor ---------------------- */ - -#ifndef GL_AMD_blend_minmax_factor -#define GL_AMD_blend_minmax_factor 1 - -#define GL_FACTOR_MIN_AMD 0x901C -#define GL_FACTOR_MAX_AMD 0x901D - -#define GLEW_AMD_blend_minmax_factor GLEW_GET_VAR(__GLEW_AMD_blend_minmax_factor) - -#endif /* GL_AMD_blend_minmax_factor */ - -/* ----------------------- GL_AMD_conservative_depth ----------------------- */ - -#ifndef GL_AMD_conservative_depth -#define GL_AMD_conservative_depth 1 - -#define GLEW_AMD_conservative_depth GLEW_GET_VAR(__GLEW_AMD_conservative_depth) - -#endif /* GL_AMD_conservative_depth */ - -/* -------------------------- GL_AMD_debug_output -------------------------- */ - -#ifndef GL_AMD_debug_output -#define GL_AMD_debug_output 1 - -#define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 -#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 -#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 -#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 -#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A -#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B -#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C -#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D -#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E -#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F -#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 - -typedef void (GLAPIENTRY *GLDEBUGPROCAMD)(GLuint id, GLenum category, GLenum severity, GLsizei length, const GLchar* message, void* userParam); - -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void *userParam); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar* buf); -typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum* categories, GLuint* severities, GLuint* ids, GLsizei* lengths, GLchar* message); - -#define glDebugMessageCallbackAMD GLEW_GET_FUN(__glewDebugMessageCallbackAMD) -#define glDebugMessageEnableAMD GLEW_GET_FUN(__glewDebugMessageEnableAMD) -#define glDebugMessageInsertAMD GLEW_GET_FUN(__glewDebugMessageInsertAMD) -#define glGetDebugMessageLogAMD GLEW_GET_FUN(__glewGetDebugMessageLogAMD) - -#define GLEW_AMD_debug_output GLEW_GET_VAR(__GLEW_AMD_debug_output) - -#endif /* GL_AMD_debug_output */ - -/* ---------------------- GL_AMD_depth_clamp_separate ---------------------- */ - -#ifndef GL_AMD_depth_clamp_separate -#define GL_AMD_depth_clamp_separate 1 - -#define GL_DEPTH_CLAMP_NEAR_AMD 0x901E -#define GL_DEPTH_CLAMP_FAR_AMD 0x901F - -#define GLEW_AMD_depth_clamp_separate GLEW_GET_VAR(__GLEW_AMD_depth_clamp_separate) - -#endif /* GL_AMD_depth_clamp_separate */ - -/* ----------------------- GL_AMD_draw_buffers_blend ----------------------- */ - -#ifndef GL_AMD_draw_buffers_blend -#define GL_AMD_draw_buffers_blend 1 - -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode); -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); - -#define glBlendEquationIndexedAMD GLEW_GET_FUN(__glewBlendEquationIndexedAMD) -#define glBlendEquationSeparateIndexedAMD GLEW_GET_FUN(__glewBlendEquationSeparateIndexedAMD) -#define glBlendFuncIndexedAMD GLEW_GET_FUN(__glewBlendFuncIndexedAMD) -#define glBlendFuncSeparateIndexedAMD GLEW_GET_FUN(__glewBlendFuncSeparateIndexedAMD) - -#define GLEW_AMD_draw_buffers_blend GLEW_GET_VAR(__GLEW_AMD_draw_buffers_blend) - -#endif /* GL_AMD_draw_buffers_blend */ - -/* --------------------------- GL_AMD_gcn_shader --------------------------- */ - -#ifndef GL_AMD_gcn_shader -#define GL_AMD_gcn_shader 1 - -#define GLEW_AMD_gcn_shader GLEW_GET_VAR(__GLEW_AMD_gcn_shader) - -#endif /* GL_AMD_gcn_shader */ - -/* ------------------------ GL_AMD_gpu_shader_int64 ------------------------ */ - -#ifndef GL_AMD_gpu_shader_int64 -#define GL_AMD_gpu_shader_int64 1 - -#define GLEW_AMD_gpu_shader_int64 GLEW_GET_VAR(__GLEW_AMD_gpu_shader_int64) - -#endif /* GL_AMD_gpu_shader_int64 */ - -/* ---------------------- GL_AMD_interleaved_elements ---------------------- */ - -#ifndef GL_AMD_interleaved_elements -#define GL_AMD_interleaved_elements 1 - -#define GL_RED 0x1903 -#define GL_GREEN 0x1904 -#define GL_BLUE 0x1905 -#define GL_ALPHA 0x1906 -#define GL_RG8UI 0x8238 -#define GL_RG16UI 0x823A -#define GL_RGBA8UI 0x8D7C -#define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4 -#define GL_VERTEX_ID_SWIZZLE_AMD 0x91A5 - -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPARAMETERIAMDPROC) (GLuint index, GLenum pname, GLint param); - -#define glVertexAttribParameteriAMD GLEW_GET_FUN(__glewVertexAttribParameteriAMD) - -#define GLEW_AMD_interleaved_elements GLEW_GET_VAR(__GLEW_AMD_interleaved_elements) - -#endif /* GL_AMD_interleaved_elements */ - -/* ----------------------- GL_AMD_multi_draw_indirect ---------------------- */ - -#ifndef GL_AMD_multi_draw_indirect -#define GL_AMD_multi_draw_indirect 1 - -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); - -#define glMultiDrawArraysIndirectAMD GLEW_GET_FUN(__glewMultiDrawArraysIndirectAMD) -#define glMultiDrawElementsIndirectAMD GLEW_GET_FUN(__glewMultiDrawElementsIndirectAMD) - -#define GLEW_AMD_multi_draw_indirect GLEW_GET_VAR(__GLEW_AMD_multi_draw_indirect) - -#endif /* GL_AMD_multi_draw_indirect */ - -/* ------------------------- GL_AMD_name_gen_delete ------------------------ */ - -#ifndef GL_AMD_name_gen_delete -#define GL_AMD_name_gen_delete 1 - -#define GL_DATA_BUFFER_AMD 0x9151 -#define GL_PERFORMANCE_MONITOR_AMD 0x9152 -#define GL_QUERY_OBJECT_AMD 0x9153 -#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 -#define GL_SAMPLER_OBJECT_AMD 0x9155 - -typedef void (GLAPIENTRY * PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint* names); -typedef void (GLAPIENTRY * PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint* names); -typedef GLboolean (GLAPIENTRY * PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name); - -#define glDeleteNamesAMD GLEW_GET_FUN(__glewDeleteNamesAMD) -#define glGenNamesAMD GLEW_GET_FUN(__glewGenNamesAMD) -#define glIsNameAMD GLEW_GET_FUN(__glewIsNameAMD) - -#define GLEW_AMD_name_gen_delete GLEW_GET_VAR(__GLEW_AMD_name_gen_delete) - -#endif /* GL_AMD_name_gen_delete */ - -/* ---------------------- GL_AMD_occlusion_query_event --------------------- */ - -#ifndef GL_AMD_occlusion_query_event -#define GL_AMD_occlusion_query_event 1 - -#define GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD 0x00000001 -#define GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD 0x00000002 -#define GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD 0x00000004 -#define GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD 0x00000008 -#define GL_OCCLUSION_QUERY_EVENT_MASK_AMD 0x874F -#define GL_QUERY_ALL_EVENT_BITS_AMD 0xFFFFFFFF - -typedef void (GLAPIENTRY * PFNGLQUERYOBJECTPARAMETERUIAMDPROC) (GLenum target, GLuint id, GLenum pname, GLuint param); - -#define glQueryObjectParameteruiAMD GLEW_GET_FUN(__glewQueryObjectParameteruiAMD) - -#define GLEW_AMD_occlusion_query_event GLEW_GET_VAR(__GLEW_AMD_occlusion_query_event) - -#endif /* GL_AMD_occlusion_query_event */ - -/* ----------------------- GL_AMD_performance_monitor ---------------------- */ - -#ifndef GL_AMD_performance_monitor -#define GL_AMD_performance_monitor 1 - -#define GL_COUNTER_TYPE_AMD 0x8BC0 -#define GL_COUNTER_RANGE_AMD 0x8BC1 -#define GL_UNSIGNED_INT64_AMD 0x8BC2 -#define GL_PERCENTAGE_AMD 0x8BC3 -#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 -#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 -#define GL_PERFMON_RESULT_AMD 0x8BC6 - -typedef void (GLAPIENTRY * PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); -typedef void (GLAPIENTRY * PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors); -typedef void (GLAPIENTRY * PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); -typedef void (GLAPIENTRY * PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors); -typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint *bytesWritten); -typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data); -typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, GLchar *counterString); -typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint* numCounters, GLint *maxActiveCounters, GLsizei countersSize, GLuint *counters); -typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei* length, GLchar *groupString); -typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint* numGroups, GLsizei groupsSize, GLuint *groups); -typedef void (GLAPIENTRY * PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* counterList); - -#define glBeginPerfMonitorAMD GLEW_GET_FUN(__glewBeginPerfMonitorAMD) -#define glDeletePerfMonitorsAMD GLEW_GET_FUN(__glewDeletePerfMonitorsAMD) -#define glEndPerfMonitorAMD GLEW_GET_FUN(__glewEndPerfMonitorAMD) -#define glGenPerfMonitorsAMD GLEW_GET_FUN(__glewGenPerfMonitorsAMD) -#define glGetPerfMonitorCounterDataAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterDataAMD) -#define glGetPerfMonitorCounterInfoAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterInfoAMD) -#define glGetPerfMonitorCounterStringAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterStringAMD) -#define glGetPerfMonitorCountersAMD GLEW_GET_FUN(__glewGetPerfMonitorCountersAMD) -#define glGetPerfMonitorGroupStringAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupStringAMD) -#define glGetPerfMonitorGroupsAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupsAMD) -#define glSelectPerfMonitorCountersAMD GLEW_GET_FUN(__glewSelectPerfMonitorCountersAMD) - -#define GLEW_AMD_performance_monitor GLEW_GET_VAR(__GLEW_AMD_performance_monitor) - -#endif /* GL_AMD_performance_monitor */ - -/* -------------------------- GL_AMD_pinned_memory ------------------------- */ - -#ifndef GL_AMD_pinned_memory -#define GL_AMD_pinned_memory 1 - -#define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160 - -#define GLEW_AMD_pinned_memory GLEW_GET_VAR(__GLEW_AMD_pinned_memory) - -#endif /* GL_AMD_pinned_memory */ - -/* ----------------------- GL_AMD_query_buffer_object ---------------------- */ - -#ifndef GL_AMD_query_buffer_object -#define GL_AMD_query_buffer_object 1 - -#define GL_QUERY_BUFFER_AMD 0x9192 -#define GL_QUERY_BUFFER_BINDING_AMD 0x9193 -#define GL_QUERY_RESULT_NO_WAIT_AMD 0x9194 - -#define GLEW_AMD_query_buffer_object GLEW_GET_VAR(__GLEW_AMD_query_buffer_object) - -#endif /* GL_AMD_query_buffer_object */ - -/* ------------------------ GL_AMD_sample_positions ------------------------ */ - -#ifndef GL_AMD_sample_positions -#define GL_AMD_sample_positions 1 - -#define GL_SUBSAMPLE_DISTANCE_AMD 0x883F - -typedef void (GLAPIENTRY * PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint index, const GLfloat* val); - -#define glSetMultisamplefvAMD GLEW_GET_FUN(__glewSetMultisamplefvAMD) - -#define GLEW_AMD_sample_positions GLEW_GET_VAR(__GLEW_AMD_sample_positions) - -#endif /* GL_AMD_sample_positions */ - -/* ------------------ GL_AMD_seamless_cubemap_per_texture ------------------ */ - -#ifndef GL_AMD_seamless_cubemap_per_texture -#define GL_AMD_seamless_cubemap_per_texture 1 - -#define GL_TEXTURE_CUBE_MAP_SEAMLESS_ARB 0x884F - -#define GLEW_AMD_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_AMD_seamless_cubemap_per_texture) - -#endif /* GL_AMD_seamless_cubemap_per_texture */ - -/* -------------------- GL_AMD_shader_atomic_counter_ops ------------------- */ - -#ifndef GL_AMD_shader_atomic_counter_ops -#define GL_AMD_shader_atomic_counter_ops 1 - -#define GLEW_AMD_shader_atomic_counter_ops GLEW_GET_VAR(__GLEW_AMD_shader_atomic_counter_ops) - -#endif /* GL_AMD_shader_atomic_counter_ops */ - -/* ---------------------- GL_AMD_shader_stencil_export --------------------- */ - -#ifndef GL_AMD_shader_stencil_export -#define GL_AMD_shader_stencil_export 1 - -#define GLEW_AMD_shader_stencil_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_export) - -#endif /* GL_AMD_shader_stencil_export */ - -/* ------------------- GL_AMD_shader_stencil_value_export ------------------ */ - -#ifndef GL_AMD_shader_stencil_value_export -#define GL_AMD_shader_stencil_value_export 1 - -#define GLEW_AMD_shader_stencil_value_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_value_export) - -#endif /* GL_AMD_shader_stencil_value_export */ - -/* ---------------------- GL_AMD_shader_trinary_minmax --------------------- */ - -#ifndef GL_AMD_shader_trinary_minmax -#define GL_AMD_shader_trinary_minmax 1 - -#define GLEW_AMD_shader_trinary_minmax GLEW_GET_VAR(__GLEW_AMD_shader_trinary_minmax) - -#endif /* GL_AMD_shader_trinary_minmax */ - -/* ------------------------- GL_AMD_sparse_texture ------------------------- */ - -#ifndef GL_AMD_sparse_texture -#define GL_AMD_sparse_texture 1 - -#define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001 -#define GL_VIRTUAL_PAGE_SIZE_X_AMD 0x9195 -#define GL_VIRTUAL_PAGE_SIZE_Y_AMD 0x9196 -#define GL_VIRTUAL_PAGE_SIZE_Z_AMD 0x9197 -#define GL_MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198 -#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199 -#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A -#define GL_MIN_SPARSE_LEVEL_AMD 0x919B -#define GL_MIN_LOD_WARNING_AMD 0x919C - -typedef void (GLAPIENTRY * PFNGLTEXSTORAGESPARSEAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGESPARSEAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); - -#define glTexStorageSparseAMD GLEW_GET_FUN(__glewTexStorageSparseAMD) -#define glTextureStorageSparseAMD GLEW_GET_FUN(__glewTextureStorageSparseAMD) - -#define GLEW_AMD_sparse_texture GLEW_GET_VAR(__GLEW_AMD_sparse_texture) - -#endif /* GL_AMD_sparse_texture */ - -/* ------------------- GL_AMD_stencil_operation_extended ------------------- */ - -#ifndef GL_AMD_stencil_operation_extended -#define GL_AMD_stencil_operation_extended 1 - -#define GL_SET_AMD 0x874A -#define GL_REPLACE_VALUE_AMD 0x874B -#define GL_STENCIL_OP_VALUE_AMD 0x874C -#define GL_STENCIL_BACK_OP_VALUE_AMD 0x874D - -typedef void (GLAPIENTRY * PFNGLSTENCILOPVALUEAMDPROC) (GLenum face, GLuint value); - -#define glStencilOpValueAMD GLEW_GET_FUN(__glewStencilOpValueAMD) - -#define GLEW_AMD_stencil_operation_extended GLEW_GET_VAR(__GLEW_AMD_stencil_operation_extended) - -#endif /* GL_AMD_stencil_operation_extended */ - -/* ------------------------ GL_AMD_texture_texture4 ------------------------ */ - -#ifndef GL_AMD_texture_texture4 -#define GL_AMD_texture_texture4 1 - -#define GLEW_AMD_texture_texture4 GLEW_GET_VAR(__GLEW_AMD_texture_texture4) - -#endif /* GL_AMD_texture_texture4 */ - -/* --------------- GL_AMD_transform_feedback3_lines_triangles -------------- */ - -#ifndef GL_AMD_transform_feedback3_lines_triangles -#define GL_AMD_transform_feedback3_lines_triangles 1 - -#define GLEW_AMD_transform_feedback3_lines_triangles GLEW_GET_VAR(__GLEW_AMD_transform_feedback3_lines_triangles) - -#endif /* GL_AMD_transform_feedback3_lines_triangles */ - -/* ----------------------- GL_AMD_transform_feedback4 ---------------------- */ - -#ifndef GL_AMD_transform_feedback4 -#define GL_AMD_transform_feedback4 1 - -#define GL_STREAM_RASTERIZATION_AMD 0x91A0 - -#define GLEW_AMD_transform_feedback4 GLEW_GET_VAR(__GLEW_AMD_transform_feedback4) - -#endif /* GL_AMD_transform_feedback4 */ - -/* ----------------------- GL_AMD_vertex_shader_layer ---------------------- */ - -#ifndef GL_AMD_vertex_shader_layer -#define GL_AMD_vertex_shader_layer 1 - -#define GLEW_AMD_vertex_shader_layer GLEW_GET_VAR(__GLEW_AMD_vertex_shader_layer) - -#endif /* GL_AMD_vertex_shader_layer */ - -/* -------------------- GL_AMD_vertex_shader_tessellator ------------------- */ - -#ifndef GL_AMD_vertex_shader_tessellator -#define GL_AMD_vertex_shader_tessellator 1 - -#define GL_SAMPLER_BUFFER_AMD 0x9001 -#define GL_INT_SAMPLER_BUFFER_AMD 0x9002 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 -#define GL_TESSELLATION_MODE_AMD 0x9004 -#define GL_TESSELLATION_FACTOR_AMD 0x9005 -#define GL_DISCRETE_AMD 0x9006 -#define GL_CONTINUOUS_AMD 0x9007 - -typedef void (GLAPIENTRY * PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor); -typedef void (GLAPIENTRY * PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); - -#define glTessellationFactorAMD GLEW_GET_FUN(__glewTessellationFactorAMD) -#define glTessellationModeAMD GLEW_GET_FUN(__glewTessellationModeAMD) - -#define GLEW_AMD_vertex_shader_tessellator GLEW_GET_VAR(__GLEW_AMD_vertex_shader_tessellator) - -#endif /* GL_AMD_vertex_shader_tessellator */ - -/* ------------------ GL_AMD_vertex_shader_viewport_index ------------------ */ - -#ifndef GL_AMD_vertex_shader_viewport_index -#define GL_AMD_vertex_shader_viewport_index 1 - -#define GLEW_AMD_vertex_shader_viewport_index GLEW_GET_VAR(__GLEW_AMD_vertex_shader_viewport_index) - -#endif /* GL_AMD_vertex_shader_viewport_index */ - -/* ------------------------- GL_ANGLE_depth_texture ------------------------ */ - -#ifndef GL_ANGLE_depth_texture -#define GL_ANGLE_depth_texture 1 - -#define GLEW_ANGLE_depth_texture GLEW_GET_VAR(__GLEW_ANGLE_depth_texture) - -#endif /* GL_ANGLE_depth_texture */ - -/* ----------------------- GL_ANGLE_framebuffer_blit ----------------------- */ - -#ifndef GL_ANGLE_framebuffer_blit -#define GL_ANGLE_framebuffer_blit 1 - -#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 -#define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA - -typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); - -#define glBlitFramebufferANGLE GLEW_GET_FUN(__glewBlitFramebufferANGLE) - -#define GLEW_ANGLE_framebuffer_blit GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_blit) - -#endif /* GL_ANGLE_framebuffer_blit */ - -/* -------------------- GL_ANGLE_framebuffer_multisample ------------------- */ - -#ifndef GL_ANGLE_framebuffer_multisample -#define GL_ANGLE_framebuffer_multisample 1 - -#define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56 -#define GL_MAX_SAMPLES_ANGLE 0x8D57 - -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - -#define glRenderbufferStorageMultisampleANGLE GLEW_GET_FUN(__glewRenderbufferStorageMultisampleANGLE) - -#define GLEW_ANGLE_framebuffer_multisample GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_multisample) - -#endif /* GL_ANGLE_framebuffer_multisample */ - -/* ----------------------- GL_ANGLE_instanced_arrays ----------------------- */ - -#ifndef GL_ANGLE_instanced_arrays -#define GL_ANGLE_instanced_arrays 1 - -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE - -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor); - -#define glDrawArraysInstancedANGLE GLEW_GET_FUN(__glewDrawArraysInstancedANGLE) -#define glDrawElementsInstancedANGLE GLEW_GET_FUN(__glewDrawElementsInstancedANGLE) -#define glVertexAttribDivisorANGLE GLEW_GET_FUN(__glewVertexAttribDivisorANGLE) - -#define GLEW_ANGLE_instanced_arrays GLEW_GET_VAR(__GLEW_ANGLE_instanced_arrays) - -#endif /* GL_ANGLE_instanced_arrays */ - -/* -------------------- GL_ANGLE_pack_reverse_row_order -------------------- */ - -#ifndef GL_ANGLE_pack_reverse_row_order -#define GL_ANGLE_pack_reverse_row_order 1 - -#define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 - -#define GLEW_ANGLE_pack_reverse_row_order GLEW_GET_VAR(__GLEW_ANGLE_pack_reverse_row_order) - -#endif /* GL_ANGLE_pack_reverse_row_order */ - -/* ------------------------ GL_ANGLE_program_binary ------------------------ */ - -#ifndef GL_ANGLE_program_binary -#define GL_ANGLE_program_binary 1 - -#define GL_PROGRAM_BINARY_ANGLE 0x93A6 - -#define GLEW_ANGLE_program_binary GLEW_GET_VAR(__GLEW_ANGLE_program_binary) - -#endif /* GL_ANGLE_program_binary */ - -/* ------------------- GL_ANGLE_texture_compression_dxt1 ------------------- */ - -#ifndef GL_ANGLE_texture_compression_dxt1 -#define GL_ANGLE_texture_compression_dxt1 1 - -#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 - -#define GLEW_ANGLE_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt1) - -#endif /* GL_ANGLE_texture_compression_dxt1 */ - -/* ------------------- GL_ANGLE_texture_compression_dxt3 ------------------- */ - -#ifndef GL_ANGLE_texture_compression_dxt3 -#define GL_ANGLE_texture_compression_dxt3 1 - -#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 - -#define GLEW_ANGLE_texture_compression_dxt3 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt3) - -#endif /* GL_ANGLE_texture_compression_dxt3 */ - -/* ------------------- GL_ANGLE_texture_compression_dxt5 ------------------- */ - -#ifndef GL_ANGLE_texture_compression_dxt5 -#define GL_ANGLE_texture_compression_dxt5 1 - -#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 - -#define GLEW_ANGLE_texture_compression_dxt5 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt5) - -#endif /* GL_ANGLE_texture_compression_dxt5 */ - -/* ------------------------- GL_ANGLE_texture_usage ------------------------ */ - -#ifndef GL_ANGLE_texture_usage -#define GL_ANGLE_texture_usage 1 - -#define GL_TEXTURE_USAGE_ANGLE 0x93A2 -#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 - -#define GLEW_ANGLE_texture_usage GLEW_GET_VAR(__GLEW_ANGLE_texture_usage) - -#endif /* GL_ANGLE_texture_usage */ - -/* -------------------------- GL_ANGLE_timer_query ------------------------- */ - -#ifndef GL_ANGLE_timer_query -#define GL_ANGLE_timer_query 1 - -#define GL_QUERY_COUNTER_BITS_ANGLE 0x8864 -#define GL_CURRENT_QUERY_ANGLE 0x8865 -#define GL_QUERY_RESULT_ANGLE 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_ANGLE 0x8867 -#define GL_TIME_ELAPSED_ANGLE 0x88BF -#define GL_TIMESTAMP_ANGLE 0x8E28 - -typedef void (GLAPIENTRY * PFNGLBEGINQUERYANGLEPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETEQUERIESANGLEPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLENDQUERYANGLEPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLGENQUERIESANGLEPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VANGLEPROC) (GLuint id, GLenum pname, GLint64* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVANGLEPROC) (GLuint id, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VANGLEPROC) (GLuint id, GLenum pname, GLuint64* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVANGLEPROC) (GLuint id, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYIVANGLEPROC) (GLenum target, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISQUERYANGLEPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERANGLEPROC) (GLuint id, GLenum target); - -#define glBeginQueryANGLE GLEW_GET_FUN(__glewBeginQueryANGLE) -#define glDeleteQueriesANGLE GLEW_GET_FUN(__glewDeleteQueriesANGLE) -#define glEndQueryANGLE GLEW_GET_FUN(__glewEndQueryANGLE) -#define glGenQueriesANGLE GLEW_GET_FUN(__glewGenQueriesANGLE) -#define glGetQueryObjecti64vANGLE GLEW_GET_FUN(__glewGetQueryObjecti64vANGLE) -#define glGetQueryObjectivANGLE GLEW_GET_FUN(__glewGetQueryObjectivANGLE) -#define glGetQueryObjectui64vANGLE GLEW_GET_FUN(__glewGetQueryObjectui64vANGLE) -#define glGetQueryObjectuivANGLE GLEW_GET_FUN(__glewGetQueryObjectuivANGLE) -#define glGetQueryivANGLE GLEW_GET_FUN(__glewGetQueryivANGLE) -#define glIsQueryANGLE GLEW_GET_FUN(__glewIsQueryANGLE) -#define glQueryCounterANGLE GLEW_GET_FUN(__glewQueryCounterANGLE) - -#define GLEW_ANGLE_timer_query GLEW_GET_VAR(__GLEW_ANGLE_timer_query) - -#endif /* GL_ANGLE_timer_query */ - -/* ------------------- GL_ANGLE_translated_shader_source ------------------- */ - -#ifndef GL_ANGLE_translated_shader_source -#define GL_ANGLE_translated_shader_source 1 - -#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 - -typedef void (GLAPIENTRY * PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source); - -#define glGetTranslatedShaderSourceANGLE GLEW_GET_FUN(__glewGetTranslatedShaderSourceANGLE) - -#define GLEW_ANGLE_translated_shader_source GLEW_GET_VAR(__GLEW_ANGLE_translated_shader_source) - -#endif /* GL_ANGLE_translated_shader_source */ - -/* ----------------------- GL_APPLE_aux_depth_stencil ---------------------- */ - -#ifndef GL_APPLE_aux_depth_stencil -#define GL_APPLE_aux_depth_stencil 1 - -#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 - -#define GLEW_APPLE_aux_depth_stencil GLEW_GET_VAR(__GLEW_APPLE_aux_depth_stencil) - -#endif /* GL_APPLE_aux_depth_stencil */ - -/* ------------------------ GL_APPLE_client_storage ------------------------ */ - -#ifndef GL_APPLE_client_storage -#define GL_APPLE_client_storage 1 - -#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 - -#define GLEW_APPLE_client_storage GLEW_GET_VAR(__GLEW_APPLE_client_storage) - -#endif /* GL_APPLE_client_storage */ - -/* ------------------------- GL_APPLE_element_array ------------------------ */ - -#ifndef GL_APPLE_element_array -#define GL_APPLE_element_array 1 - -#define GL_ELEMENT_ARRAY_APPLE 0x8A0C -#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D -#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E - -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); -typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void *pointer); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint* first, const GLsizei *count, GLsizei primcount); - -#define glDrawElementArrayAPPLE GLEW_GET_FUN(__glewDrawElementArrayAPPLE) -#define glDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewDrawRangeElementArrayAPPLE) -#define glElementPointerAPPLE GLEW_GET_FUN(__glewElementPointerAPPLE) -#define glMultiDrawElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawElementArrayAPPLE) -#define glMultiDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawRangeElementArrayAPPLE) - -#define GLEW_APPLE_element_array GLEW_GET_VAR(__GLEW_APPLE_element_array) - -#endif /* GL_APPLE_element_array */ - -/* ----------------------------- GL_APPLE_fence ---------------------------- */ - -#ifndef GL_APPLE_fence -#define GL_APPLE_fence 1 - -#define GL_DRAW_PIXELS_APPLE 0x8A0A -#define GL_FENCE_APPLE 0x8A0B - -typedef void (GLAPIENTRY * PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint* fences); -typedef void (GLAPIENTRY * PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); -typedef void (GLAPIENTRY * PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); -typedef void (GLAPIENTRY * PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint* fences); -typedef GLboolean (GLAPIENTRY * PFNGLISFENCEAPPLEPROC) (GLuint fence); -typedef void (GLAPIENTRY * PFNGLSETFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (GLAPIENTRY * PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); - -#define glDeleteFencesAPPLE GLEW_GET_FUN(__glewDeleteFencesAPPLE) -#define glFinishFenceAPPLE GLEW_GET_FUN(__glewFinishFenceAPPLE) -#define glFinishObjectAPPLE GLEW_GET_FUN(__glewFinishObjectAPPLE) -#define glGenFencesAPPLE GLEW_GET_FUN(__glewGenFencesAPPLE) -#define glIsFenceAPPLE GLEW_GET_FUN(__glewIsFenceAPPLE) -#define glSetFenceAPPLE GLEW_GET_FUN(__glewSetFenceAPPLE) -#define glTestFenceAPPLE GLEW_GET_FUN(__glewTestFenceAPPLE) -#define glTestObjectAPPLE GLEW_GET_FUN(__glewTestObjectAPPLE) - -#define GLEW_APPLE_fence GLEW_GET_VAR(__GLEW_APPLE_fence) - -#endif /* GL_APPLE_fence */ - -/* ------------------------- GL_APPLE_float_pixels ------------------------- */ - -#ifndef GL_APPLE_float_pixels -#define GL_APPLE_float_pixels 1 - -#define GL_HALF_APPLE 0x140B -#define GL_RGBA_FLOAT32_APPLE 0x8814 -#define GL_RGB_FLOAT32_APPLE 0x8815 -#define GL_ALPHA_FLOAT32_APPLE 0x8816 -#define GL_INTENSITY_FLOAT32_APPLE 0x8817 -#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 -#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 -#define GL_RGBA_FLOAT16_APPLE 0x881A -#define GL_RGB_FLOAT16_APPLE 0x881B -#define GL_ALPHA_FLOAT16_APPLE 0x881C -#define GL_INTENSITY_FLOAT16_APPLE 0x881D -#define GL_LUMINANCE_FLOAT16_APPLE 0x881E -#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F -#define GL_COLOR_FLOAT_APPLE 0x8A0F - -#define GLEW_APPLE_float_pixels GLEW_GET_VAR(__GLEW_APPLE_float_pixels) - -#endif /* GL_APPLE_float_pixels */ - -/* ---------------------- GL_APPLE_flush_buffer_range ---------------------- */ - -#ifndef GL_APPLE_flush_buffer_range -#define GL_APPLE_flush_buffer_range 1 - -#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 -#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 - -typedef void (GLAPIENTRY * PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); - -#define glBufferParameteriAPPLE GLEW_GET_FUN(__glewBufferParameteriAPPLE) -#define glFlushMappedBufferRangeAPPLE GLEW_GET_FUN(__glewFlushMappedBufferRangeAPPLE) - -#define GLEW_APPLE_flush_buffer_range GLEW_GET_VAR(__GLEW_APPLE_flush_buffer_range) - -#endif /* GL_APPLE_flush_buffer_range */ - -/* ----------------------- GL_APPLE_object_purgeable ----------------------- */ - -#ifndef GL_APPLE_object_purgeable -#define GL_APPLE_object_purgeable 1 - -#define GL_BUFFER_OBJECT_APPLE 0x85B3 -#define GL_RELEASED_APPLE 0x8A19 -#define GL_VOLATILE_APPLE 0x8A1A -#define GL_RETAINED_APPLE 0x8A1B -#define GL_UNDEFINED_APPLE 0x8A1C -#define GL_PURGEABLE_APPLE 0x8A1D - -typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint* params); -typedef GLenum (GLAPIENTRY * PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); -typedef GLenum (GLAPIENTRY * PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); - -#define glGetObjectParameterivAPPLE GLEW_GET_FUN(__glewGetObjectParameterivAPPLE) -#define glObjectPurgeableAPPLE GLEW_GET_FUN(__glewObjectPurgeableAPPLE) -#define glObjectUnpurgeableAPPLE GLEW_GET_FUN(__glewObjectUnpurgeableAPPLE) - -#define GLEW_APPLE_object_purgeable GLEW_GET_VAR(__GLEW_APPLE_object_purgeable) - -#endif /* GL_APPLE_object_purgeable */ - -/* ------------------------- GL_APPLE_pixel_buffer ------------------------- */ - -#ifndef GL_APPLE_pixel_buffer -#define GL_APPLE_pixel_buffer 1 - -#define GL_MIN_PBUFFER_VIEWPORT_DIMS_APPLE 0x8A10 - -#define GLEW_APPLE_pixel_buffer GLEW_GET_VAR(__GLEW_APPLE_pixel_buffer) - -#endif /* GL_APPLE_pixel_buffer */ - -/* ---------------------------- GL_APPLE_rgb_422 --------------------------- */ - -#ifndef GL_APPLE_rgb_422 -#define GL_APPLE_rgb_422 1 - -#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB -#define GL_RGB_422_APPLE 0x8A1F -#define GL_RGB_RAW_422_APPLE 0x8A51 - -#define GLEW_APPLE_rgb_422 GLEW_GET_VAR(__GLEW_APPLE_rgb_422) - -#endif /* GL_APPLE_rgb_422 */ - -/* --------------------------- GL_APPLE_row_bytes -------------------------- */ - -#ifndef GL_APPLE_row_bytes -#define GL_APPLE_row_bytes 1 - -#define GL_PACK_ROW_BYTES_APPLE 0x8A15 -#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 - -#define GLEW_APPLE_row_bytes GLEW_GET_VAR(__GLEW_APPLE_row_bytes) - -#endif /* GL_APPLE_row_bytes */ - -/* ------------------------ GL_APPLE_specular_vector ----------------------- */ - -#ifndef GL_APPLE_specular_vector -#define GL_APPLE_specular_vector 1 - -#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 - -#define GLEW_APPLE_specular_vector GLEW_GET_VAR(__GLEW_APPLE_specular_vector) - -#endif /* GL_APPLE_specular_vector */ - -/* ------------------------- GL_APPLE_texture_range ------------------------ */ - -#ifndef GL_APPLE_texture_range -#define GL_APPLE_texture_range 1 - -#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 -#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 -#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC -#define GL_STORAGE_PRIVATE_APPLE 0x85BD -#define GL_STORAGE_CACHED_APPLE 0x85BE -#define GL_STORAGE_SHARED_APPLE 0x85BF - -typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, void **params); -typedef void (GLAPIENTRY * PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, void *pointer); - -#define glGetTexParameterPointervAPPLE GLEW_GET_FUN(__glewGetTexParameterPointervAPPLE) -#define glTextureRangeAPPLE GLEW_GET_FUN(__glewTextureRangeAPPLE) - -#define GLEW_APPLE_texture_range GLEW_GET_VAR(__GLEW_APPLE_texture_range) - -#endif /* GL_APPLE_texture_range */ - -/* ------------------------ GL_APPLE_transform_hint ------------------------ */ - -#ifndef GL_APPLE_transform_hint -#define GL_APPLE_transform_hint 1 - -#define GL_TRANSFORM_HINT_APPLE 0x85B1 - -#define GLEW_APPLE_transform_hint GLEW_GET_VAR(__GLEW_APPLE_transform_hint) - -#endif /* GL_APPLE_transform_hint */ - -/* ---------------------- GL_APPLE_vertex_array_object --------------------- */ - -#ifndef GL_APPLE_vertex_array_object -#define GL_APPLE_vertex_array_object 1 - -#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 - -typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); -typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); -typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); -typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); - -#define glBindVertexArrayAPPLE GLEW_GET_FUN(__glewBindVertexArrayAPPLE) -#define glDeleteVertexArraysAPPLE GLEW_GET_FUN(__glewDeleteVertexArraysAPPLE) -#define glGenVertexArraysAPPLE GLEW_GET_FUN(__glewGenVertexArraysAPPLE) -#define glIsVertexArrayAPPLE GLEW_GET_FUN(__glewIsVertexArrayAPPLE) - -#define GLEW_APPLE_vertex_array_object GLEW_GET_VAR(__GLEW_APPLE_vertex_array_object) - -#endif /* GL_APPLE_vertex_array_object */ - -/* ---------------------- GL_APPLE_vertex_array_range ---------------------- */ - -#ifndef GL_APPLE_vertex_array_range -#define GL_APPLE_vertex_array_range 1 - -#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E -#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F -#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE 0x8520 -#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 -#define GL_STORAGE_CLIENT_APPLE 0x85B4 -#define GL_STORAGE_CACHED_APPLE 0x85BE -#define GL_STORAGE_SHARED_APPLE 0x85BF - -typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); - -#define glFlushVertexArrayRangeAPPLE GLEW_GET_FUN(__glewFlushVertexArrayRangeAPPLE) -#define glVertexArrayParameteriAPPLE GLEW_GET_FUN(__glewVertexArrayParameteriAPPLE) -#define glVertexArrayRangeAPPLE GLEW_GET_FUN(__glewVertexArrayRangeAPPLE) - -#define GLEW_APPLE_vertex_array_range GLEW_GET_VAR(__GLEW_APPLE_vertex_array_range) - -#endif /* GL_APPLE_vertex_array_range */ - -/* ------------------- GL_APPLE_vertex_program_evaluators ------------------ */ - -#ifndef GL_APPLE_vertex_program_evaluators -#define GL_APPLE_vertex_program_evaluators 1 - -#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 -#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 -#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 -#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 -#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 -#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 -#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 -#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 -#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 -#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 - -typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); -typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); -typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname); -typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble* points); -typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat* points); -typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble* points); -typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat* points); - -#define glDisableVertexAttribAPPLE GLEW_GET_FUN(__glewDisableVertexAttribAPPLE) -#define glEnableVertexAttribAPPLE GLEW_GET_FUN(__glewEnableVertexAttribAPPLE) -#define glIsVertexAttribEnabledAPPLE GLEW_GET_FUN(__glewIsVertexAttribEnabledAPPLE) -#define glMapVertexAttrib1dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1dAPPLE) -#define glMapVertexAttrib1fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1fAPPLE) -#define glMapVertexAttrib2dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2dAPPLE) -#define glMapVertexAttrib2fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2fAPPLE) - -#define GLEW_APPLE_vertex_program_evaluators GLEW_GET_VAR(__GLEW_APPLE_vertex_program_evaluators) - -#endif /* GL_APPLE_vertex_program_evaluators */ - -/* --------------------------- GL_APPLE_ycbcr_422 -------------------------- */ - -#ifndef GL_APPLE_ycbcr_422 -#define GL_APPLE_ycbcr_422 1 - -#define GL_YCBCR_422_APPLE 0x85B9 - -#define GLEW_APPLE_ycbcr_422 GLEW_GET_VAR(__GLEW_APPLE_ycbcr_422) - -#endif /* GL_APPLE_ycbcr_422 */ - -/* ------------------------ GL_ARB_ES2_compatibility ----------------------- */ - -#ifndef GL_ARB_ES2_compatibility -#define GL_ARB_ES2_compatibility 1 - -#define GL_FIXED 0x140C -#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B -#define GL_RGB565 0x8D62 -#define GL_LOW_FLOAT 0x8DF0 -#define GL_MEDIUM_FLOAT 0x8DF1 -#define GL_HIGH_FLOAT 0x8DF2 -#define GL_LOW_INT 0x8DF3 -#define GL_MEDIUM_INT 0x8DF4 -#define GL_HIGH_INT 0x8DF5 -#define GL_SHADER_BINARY_FORMATS 0x8DF8 -#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 -#define GL_SHADER_COMPILER 0x8DFA -#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB -#define GL_MAX_VARYING_VECTORS 0x8DFC -#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD - -typedef int GLfixed; - -typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFPROC) (GLclampf d); -typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFPROC) (GLclampf n, GLclampf f); -typedef void (GLAPIENTRY * PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint* range, GLint *precision); -typedef void (GLAPIENTRY * PFNGLRELEASESHADERCOMPILERPROC) (void); -typedef void (GLAPIENTRY * PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint* shaders, GLenum binaryformat, const void*binary, GLsizei length); - -#define glClearDepthf GLEW_GET_FUN(__glewClearDepthf) -#define glDepthRangef GLEW_GET_FUN(__glewDepthRangef) -#define glGetShaderPrecisionFormat GLEW_GET_FUN(__glewGetShaderPrecisionFormat) -#define glReleaseShaderCompiler GLEW_GET_FUN(__glewReleaseShaderCompiler) -#define glShaderBinary GLEW_GET_FUN(__glewShaderBinary) - -#define GLEW_ARB_ES2_compatibility GLEW_GET_VAR(__GLEW_ARB_ES2_compatibility) - -#endif /* GL_ARB_ES2_compatibility */ - -/* ----------------------- GL_ARB_ES3_1_compatibility ---------------------- */ - -#ifndef GL_ARB_ES3_1_compatibility -#define GL_ARB_ES3_1_compatibility 1 - -typedef void (GLAPIENTRY * PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers); - -#define glMemoryBarrierByRegion GLEW_GET_FUN(__glewMemoryBarrierByRegion) - -#define GLEW_ARB_ES3_1_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_1_compatibility) - -#endif /* GL_ARB_ES3_1_compatibility */ - -/* ----------------------- GL_ARB_ES3_2_compatibility ---------------------- */ - -#ifndef GL_ARB_ES3_2_compatibility -#define GL_ARB_ES3_2_compatibility 1 - -#define GL_PRIMITIVE_BOUNDING_BOX_ARB 0x92BE -#define GL_MULTISAMPLE_LINE_WIDTH_RANGE_ARB 0x9381 -#define GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY_ARB 0x9382 - -typedef void (GLAPIENTRY * PFNGLPRIMITIVEBOUNDINGBOXARBPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); - -#define glPrimitiveBoundingBoxARB GLEW_GET_FUN(__glewPrimitiveBoundingBoxARB) - -#define GLEW_ARB_ES3_2_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_2_compatibility) - -#endif /* GL_ARB_ES3_2_compatibility */ - -/* ------------------------ GL_ARB_ES3_compatibility ----------------------- */ - -#ifndef GL_ARB_ES3_compatibility -#define GL_ARB_ES3_compatibility 1 - -#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF -#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 -#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A -#define GL_MAX_ELEMENT_INDEX 0x8D6B -#define GL_COMPRESSED_R11_EAC 0x9270 -#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 -#define GL_COMPRESSED_RG11_EAC 0x9272 -#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 -#define GL_COMPRESSED_RGB8_ETC2 0x9274 -#define GL_COMPRESSED_SRGB8_ETC2 0x9275 -#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 -#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 -#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 -#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 - -#define GLEW_ARB_ES3_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_compatibility) - -#endif /* GL_ARB_ES3_compatibility */ - -/* ------------------------ GL_ARB_arrays_of_arrays ------------------------ */ - -#ifndef GL_ARB_arrays_of_arrays -#define GL_ARB_arrays_of_arrays 1 - -#define GLEW_ARB_arrays_of_arrays GLEW_GET_VAR(__GLEW_ARB_arrays_of_arrays) - -#endif /* GL_ARB_arrays_of_arrays */ - -/* -------------------------- GL_ARB_base_instance ------------------------- */ - -#ifndef GL_ARB_base_instance -#define GL_ARB_base_instance 1 - -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount, GLuint baseinstance); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLuint baseinstance); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLint basevertex, GLuint baseinstance); - -#define glDrawArraysInstancedBaseInstance GLEW_GET_FUN(__glewDrawArraysInstancedBaseInstance) -#define glDrawElementsInstancedBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseInstance) -#define glDrawElementsInstancedBaseVertexBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertexBaseInstance) - -#define GLEW_ARB_base_instance GLEW_GET_VAR(__GLEW_ARB_base_instance) - -#endif /* GL_ARB_base_instance */ - -/* ------------------------ GL_ARB_bindless_texture ------------------------ */ - -#ifndef GL_ARB_bindless_texture -#define GL_ARB_bindless_texture 1 - -#define GL_UNSIGNED_INT64_ARB 0x140F - -typedef GLuint64 (GLAPIENTRY * PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); -typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture); -typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT* params); -typedef GLboolean (GLAPIENTRY * PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle); -typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access); -typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values); -typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value); -typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT* v); - -#define glGetImageHandleARB GLEW_GET_FUN(__glewGetImageHandleARB) -#define glGetTextureHandleARB GLEW_GET_FUN(__glewGetTextureHandleARB) -#define glGetTextureSamplerHandleARB GLEW_GET_FUN(__glewGetTextureSamplerHandleARB) -#define glGetVertexAttribLui64vARB GLEW_GET_FUN(__glewGetVertexAttribLui64vARB) -#define glIsImageHandleResidentARB GLEW_GET_FUN(__glewIsImageHandleResidentARB) -#define glIsTextureHandleResidentARB GLEW_GET_FUN(__glewIsTextureHandleResidentARB) -#define glMakeImageHandleNonResidentARB GLEW_GET_FUN(__glewMakeImageHandleNonResidentARB) -#define glMakeImageHandleResidentARB GLEW_GET_FUN(__glewMakeImageHandleResidentARB) -#define glMakeTextureHandleNonResidentARB GLEW_GET_FUN(__glewMakeTextureHandleNonResidentARB) -#define glMakeTextureHandleResidentARB GLEW_GET_FUN(__glewMakeTextureHandleResidentARB) -#define glProgramUniformHandleui64ARB GLEW_GET_FUN(__glewProgramUniformHandleui64ARB) -#define glProgramUniformHandleui64vARB GLEW_GET_FUN(__glewProgramUniformHandleui64vARB) -#define glUniformHandleui64ARB GLEW_GET_FUN(__glewUniformHandleui64ARB) -#define glUniformHandleui64vARB GLEW_GET_FUN(__glewUniformHandleui64vARB) -#define glVertexAttribL1ui64ARB GLEW_GET_FUN(__glewVertexAttribL1ui64ARB) -#define glVertexAttribL1ui64vARB GLEW_GET_FUN(__glewVertexAttribL1ui64vARB) - -#define GLEW_ARB_bindless_texture GLEW_GET_VAR(__GLEW_ARB_bindless_texture) - -#endif /* GL_ARB_bindless_texture */ - -/* ----------------------- GL_ARB_blend_func_extended ---------------------- */ - -#ifndef GL_ARB_blend_func_extended -#define GL_ARB_blend_func_extended 1 - -#define GL_SRC1_COLOR 0x88F9 -#define GL_ONE_MINUS_SRC1_COLOR 0x88FA -#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB -#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC - -typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); -typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar * name); - -#define glBindFragDataLocationIndexed GLEW_GET_FUN(__glewBindFragDataLocationIndexed) -#define glGetFragDataIndex GLEW_GET_FUN(__glewGetFragDataIndex) - -#define GLEW_ARB_blend_func_extended GLEW_GET_VAR(__GLEW_ARB_blend_func_extended) - -#endif /* GL_ARB_blend_func_extended */ - -/* ------------------------- GL_ARB_buffer_storage ------------------------- */ - -#ifndef GL_ARB_buffer_storage -#define GL_ARB_buffer_storage 1 - -#define GL_MAP_READ_BIT 0x0001 -#define GL_MAP_WRITE_BIT 0x0002 -#define GL_MAP_PERSISTENT_BIT 0x00000040 -#define GL_MAP_COHERENT_BIT 0x00000080 -#define GL_DYNAMIC_STORAGE_BIT 0x0100 -#define GL_CLIENT_STORAGE_BIT 0x0200 -#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 -#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F -#define GL_BUFFER_STORAGE_FLAGS 0x8220 - -typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); - -#define glBufferStorage GLEW_GET_FUN(__glewBufferStorage) -#define glNamedBufferStorageEXT GLEW_GET_FUN(__glewNamedBufferStorageEXT) - -#define GLEW_ARB_buffer_storage GLEW_GET_VAR(__GLEW_ARB_buffer_storage) - -#endif /* GL_ARB_buffer_storage */ - -/* ---------------------------- GL_ARB_cl_event ---------------------------- */ - -#ifndef GL_ARB_cl_event -#define GL_ARB_cl_event 1 - -#define GL_SYNC_CL_EVENT_ARB 0x8240 -#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 - -typedef struct _cl_context *cl_context; -typedef struct _cl_event *cl_event; - -typedef GLsync (GLAPIENTRY * PFNGLCREATESYNCFROMCLEVENTARBPROC) (cl_context context, cl_event event, GLbitfield flags); - -#define glCreateSyncFromCLeventARB GLEW_GET_FUN(__glewCreateSyncFromCLeventARB) - -#define GLEW_ARB_cl_event GLEW_GET_VAR(__GLEW_ARB_cl_event) - -#endif /* GL_ARB_cl_event */ - -/* ----------------------- GL_ARB_clear_buffer_object ---------------------- */ - -#ifndef GL_ARB_clear_buffer_object -#define GL_ARB_clear_buffer_object 1 - -typedef void (GLAPIENTRY * PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); - -#define glClearBufferData GLEW_GET_FUN(__glewClearBufferData) -#define glClearBufferSubData GLEW_GET_FUN(__glewClearBufferSubData) -#define glClearNamedBufferDataEXT GLEW_GET_FUN(__glewClearNamedBufferDataEXT) -#define glClearNamedBufferSubDataEXT GLEW_GET_FUN(__glewClearNamedBufferSubDataEXT) - -#define GLEW_ARB_clear_buffer_object GLEW_GET_VAR(__GLEW_ARB_clear_buffer_object) - -#endif /* GL_ARB_clear_buffer_object */ - -/* -------------------------- GL_ARB_clear_texture ------------------------- */ - -#ifndef GL_ARB_clear_texture -#define GL_ARB_clear_texture 1 - -#define GL_CLEAR_TEXTURE 0x9365 - -typedef void (GLAPIENTRY * PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); - -#define glClearTexImage GLEW_GET_FUN(__glewClearTexImage) -#define glClearTexSubImage GLEW_GET_FUN(__glewClearTexSubImage) - -#define GLEW_ARB_clear_texture GLEW_GET_VAR(__GLEW_ARB_clear_texture) - -#endif /* GL_ARB_clear_texture */ - -/* -------------------------- GL_ARB_clip_control -------------------------- */ - -#ifndef GL_ARB_clip_control -#define GL_ARB_clip_control 1 - -#define GL_LOWER_LEFT 0x8CA1 -#define GL_UPPER_LEFT 0x8CA2 -#define GL_CLIP_ORIGIN 0x935C -#define GL_CLIP_DEPTH_MODE 0x935D -#define GL_NEGATIVE_ONE_TO_ONE 0x935E -#define GL_ZERO_TO_ONE 0x935F - -typedef void (GLAPIENTRY * PFNGLCLIPCONTROLPROC) (GLenum origin, GLenum depth); - -#define glClipControl GLEW_GET_FUN(__glewClipControl) - -#define GLEW_ARB_clip_control GLEW_GET_VAR(__GLEW_ARB_clip_control) - -#endif /* GL_ARB_clip_control */ - -/* ----------------------- GL_ARB_color_buffer_float ----------------------- */ - -#ifndef GL_ARB_color_buffer_float -#define GL_ARB_color_buffer_float 1 - -#define GL_RGBA_FLOAT_MODE_ARB 0x8820 -#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A -#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B -#define GL_CLAMP_READ_COLOR_ARB 0x891C -#define GL_FIXED_ONLY_ARB 0x891D - -typedef void (GLAPIENTRY * PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); - -#define glClampColorARB GLEW_GET_FUN(__glewClampColorARB) - -#define GLEW_ARB_color_buffer_float GLEW_GET_VAR(__GLEW_ARB_color_buffer_float) - -#endif /* GL_ARB_color_buffer_float */ - -/* -------------------------- GL_ARB_compatibility ------------------------- */ - -#ifndef GL_ARB_compatibility -#define GL_ARB_compatibility 1 - -#define GLEW_ARB_compatibility GLEW_GET_VAR(__GLEW_ARB_compatibility) - -#endif /* GL_ARB_compatibility */ - -/* ---------------- GL_ARB_compressed_texture_pixel_storage ---------------- */ - -#ifndef GL_ARB_compressed_texture_pixel_storage -#define GL_ARB_compressed_texture_pixel_storage 1 - -#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 -#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 -#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 -#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A -#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B -#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C -#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D -#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E - -#define GLEW_ARB_compressed_texture_pixel_storage GLEW_GET_VAR(__GLEW_ARB_compressed_texture_pixel_storage) - -#endif /* GL_ARB_compressed_texture_pixel_storage */ - -/* ------------------------- GL_ARB_compute_shader ------------------------- */ - -#ifndef GL_ARB_compute_shader -#define GL_ARB_compute_shader 1 - -#define GL_COMPUTE_SHADER_BIT 0x00000020 -#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 -#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 -#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 -#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 -#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 -#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 -#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB -#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED -#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE -#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF -#define GL_COMPUTE_SHADER 0x91B9 -#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB -#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC -#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD -#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE -#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF - -typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); -typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); - -#define glDispatchCompute GLEW_GET_FUN(__glewDispatchCompute) -#define glDispatchComputeIndirect GLEW_GET_FUN(__glewDispatchComputeIndirect) - -#define GLEW_ARB_compute_shader GLEW_GET_VAR(__GLEW_ARB_compute_shader) - -#endif /* GL_ARB_compute_shader */ - -/* ------------------- GL_ARB_compute_variable_group_size ------------------ */ - -#ifndef GL_ARB_compute_variable_group_size -#define GL_ARB_compute_variable_group_size 1 - -#define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB -#define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF -#define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344 -#define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345 - -typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); - -#define glDispatchComputeGroupSizeARB GLEW_GET_FUN(__glewDispatchComputeGroupSizeARB) - -#define GLEW_ARB_compute_variable_group_size GLEW_GET_VAR(__GLEW_ARB_compute_variable_group_size) - -#endif /* GL_ARB_compute_variable_group_size */ - -/* ------------------- GL_ARB_conditional_render_inverted ------------------ */ - -#ifndef GL_ARB_conditional_render_inverted -#define GL_ARB_conditional_render_inverted 1 - -#define GL_QUERY_WAIT_INVERTED 0x8E17 -#define GL_QUERY_NO_WAIT_INVERTED 0x8E18 -#define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19 -#define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A - -#define GLEW_ARB_conditional_render_inverted GLEW_GET_VAR(__GLEW_ARB_conditional_render_inverted) - -#endif /* GL_ARB_conditional_render_inverted */ - -/* ----------------------- GL_ARB_conservative_depth ----------------------- */ - -#ifndef GL_ARB_conservative_depth -#define GL_ARB_conservative_depth 1 - -#define GLEW_ARB_conservative_depth GLEW_GET_VAR(__GLEW_ARB_conservative_depth) - -#endif /* GL_ARB_conservative_depth */ - -/* --------------------------- GL_ARB_copy_buffer -------------------------- */ - -#ifndef GL_ARB_copy_buffer -#define GL_ARB_copy_buffer 1 - -#define GL_COPY_READ_BUFFER 0x8F36 -#define GL_COPY_WRITE_BUFFER 0x8F37 - -typedef void (GLAPIENTRY * PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size); - -#define glCopyBufferSubData GLEW_GET_FUN(__glewCopyBufferSubData) - -#define GLEW_ARB_copy_buffer GLEW_GET_VAR(__GLEW_ARB_copy_buffer) - -#endif /* GL_ARB_copy_buffer */ - -/* --------------------------- GL_ARB_copy_image --------------------------- */ - -#ifndef GL_ARB_copy_image -#define GL_ARB_copy_image 1 - -typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); - -#define glCopyImageSubData GLEW_GET_FUN(__glewCopyImageSubData) - -#define GLEW_ARB_copy_image GLEW_GET_VAR(__GLEW_ARB_copy_image) - -#endif /* GL_ARB_copy_image */ - -/* -------------------------- GL_ARB_cull_distance ------------------------- */ - -#ifndef GL_ARB_cull_distance -#define GL_ARB_cull_distance 1 - -#define GL_MAX_CULL_DISTANCES 0x82F9 -#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA - -#define GLEW_ARB_cull_distance GLEW_GET_VAR(__GLEW_ARB_cull_distance) - -#endif /* GL_ARB_cull_distance */ - -/* -------------------------- GL_ARB_debug_output -------------------------- */ - -#ifndef GL_ARB_debug_output -#define GL_ARB_debug_output 1 - -#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 -#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 -#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 -#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 -#define GL_DEBUG_SOURCE_API_ARB 0x8246 -#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 -#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 -#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 -#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A -#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B -#define GL_DEBUG_TYPE_ERROR_ARB 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E -#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 -#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 -#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 -#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 -#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 - -typedef void (GLAPIENTRY *GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam); - -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const void *userParam); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); -typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); - -#define glDebugMessageCallbackARB GLEW_GET_FUN(__glewDebugMessageCallbackARB) -#define glDebugMessageControlARB GLEW_GET_FUN(__glewDebugMessageControlARB) -#define glDebugMessageInsertARB GLEW_GET_FUN(__glewDebugMessageInsertARB) -#define glGetDebugMessageLogARB GLEW_GET_FUN(__glewGetDebugMessageLogARB) - -#define GLEW_ARB_debug_output GLEW_GET_VAR(__GLEW_ARB_debug_output) - -#endif /* GL_ARB_debug_output */ - -/* ----------------------- GL_ARB_depth_buffer_float ----------------------- */ - -#ifndef GL_ARB_depth_buffer_float -#define GL_ARB_depth_buffer_float 1 - -#define GL_DEPTH_COMPONENT32F 0x8CAC -#define GL_DEPTH32F_STENCIL8 0x8CAD -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD - -#define GLEW_ARB_depth_buffer_float GLEW_GET_VAR(__GLEW_ARB_depth_buffer_float) - -#endif /* GL_ARB_depth_buffer_float */ - -/* --------------------------- GL_ARB_depth_clamp -------------------------- */ - -#ifndef GL_ARB_depth_clamp -#define GL_ARB_depth_clamp 1 - -#define GL_DEPTH_CLAMP 0x864F - -#define GLEW_ARB_depth_clamp GLEW_GET_VAR(__GLEW_ARB_depth_clamp) - -#endif /* GL_ARB_depth_clamp */ - -/* -------------------------- GL_ARB_depth_texture ------------------------- */ - -#ifndef GL_ARB_depth_texture -#define GL_ARB_depth_texture 1 - -#define GL_DEPTH_COMPONENT16_ARB 0x81A5 -#define GL_DEPTH_COMPONENT24_ARB 0x81A6 -#define GL_DEPTH_COMPONENT32_ARB 0x81A7 -#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A -#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B - -#define GLEW_ARB_depth_texture GLEW_GET_VAR(__GLEW_ARB_depth_texture) - -#endif /* GL_ARB_depth_texture */ - -/* ----------------------- GL_ARB_derivative_control ----------------------- */ - -#ifndef GL_ARB_derivative_control -#define GL_ARB_derivative_control 1 - -#define GLEW_ARB_derivative_control GLEW_GET_VAR(__GLEW_ARB_derivative_control) - -#endif /* GL_ARB_derivative_control */ - -/* ----------------------- GL_ARB_direct_state_access ---------------------- */ - -#ifndef GL_ARB_direct_state_access -#define GL_ARB_direct_state_access 1 - -#define GL_TEXTURE_TARGET 0x1006 -#define GL_QUERY_TARGET 0x82EA - -typedef void (GLAPIENTRY * PFNGLBINDTEXTUREUNITPROC) (GLuint unit, GLuint texture); -typedef void (GLAPIENTRY * PFNGLBLITNAMEDFRAMEBUFFERPROC) (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) (GLuint framebuffer, GLenum target); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERDATAPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) (GLuint framebuffer, GLenum buffer, GLfloat depth, GLint stencil); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint* value); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOPYNAMEDBUFFERSUBDATAPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLCREATEBUFFERSPROC) (GLsizei n, GLuint* buffers); -typedef void (GLAPIENTRY * PFNGLCREATEFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers); -typedef void (GLAPIENTRY * PFNGLCREATEPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines); -typedef void (GLAPIENTRY * PFNGLCREATEQUERIESPROC) (GLenum target, GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLCREATERENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers); -typedef void (GLAPIENTRY * PFNGLCREATESAMPLERSPROC) (GLsizei n, GLuint* samplers); -typedef void (GLAPIENTRY * PFNGLCREATETEXTURESPROC) (GLenum target, GLsizei n, GLuint* textures); -typedef void (GLAPIENTRY * PFNGLCREATETRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLCREATEVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays); -typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); -typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); -typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPPROC) (GLuint texture); -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLsizei bufSize, void *pixels); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) (GLuint buffer, GLenum pname, GLint64* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVPROC) (GLuint buffer, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVPROC) (GLuint buffer, GLenum pname, void** params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); -typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) (GLuint framebuffer, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) (GLuint renderbuffer, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTI64VPROC) (GLuint id,GLuint buffer,GLenum pname,GLintptr offset); -typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTIVPROC) (GLuint id,GLuint buffer,GLenum pname,GLintptr offset); -typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTUI64VPROC) (GLuint id,GLuint buffer,GLenum pname,GLintptr offset); -typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTUIVPROC) (GLuint id,GLuint buffer,GLenum pname,GLintptr offset); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); -typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVPROC) (GLuint texture, GLint level, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVPROC) (GLuint texture, GLint level, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64* param); -typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKIVPROC) (GLuint xfb, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINDEXED64IVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint64* param); -typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINDEXEDIVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYIVPROC) (GLuint vaobj, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments); -typedef void (GLAPIENTRY * PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERPROC) (GLuint buffer, GLenum access); -typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) (GLuint framebuffer, GLenum mode); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) (GLuint framebuffer, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) (GLuint framebuffer, GLenum mode); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERPROC) (GLuint texture, GLenum internalformat, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEPROC) (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFPROC) (GLuint texture, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, const GLfloat* param); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIPROC) (GLuint texture, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, const GLint* param); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE1DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) (GLuint xfb, GLuint index, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFERPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBBINDINGPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBIFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBLFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYBINDINGDIVISORPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYELEMENTBUFFERPROC) (GLuint vaobj, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBUFFERPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBUFFERSPROC) (GLuint vaobj, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizei *strides); - -#define glBindTextureUnit GLEW_GET_FUN(__glewBindTextureUnit) -#define glBlitNamedFramebuffer GLEW_GET_FUN(__glewBlitNamedFramebuffer) -#define glCheckNamedFramebufferStatus GLEW_GET_FUN(__glewCheckNamedFramebufferStatus) -#define glClearNamedBufferData GLEW_GET_FUN(__glewClearNamedBufferData) -#define glClearNamedBufferSubData GLEW_GET_FUN(__glewClearNamedBufferSubData) -#define glClearNamedFramebufferfi GLEW_GET_FUN(__glewClearNamedFramebufferfi) -#define glClearNamedFramebufferfv GLEW_GET_FUN(__glewClearNamedFramebufferfv) -#define glClearNamedFramebufferiv GLEW_GET_FUN(__glewClearNamedFramebufferiv) -#define glClearNamedFramebufferuiv GLEW_GET_FUN(__glewClearNamedFramebufferuiv) -#define glCompressedTextureSubImage1D GLEW_GET_FUN(__glewCompressedTextureSubImage1D) -#define glCompressedTextureSubImage2D GLEW_GET_FUN(__glewCompressedTextureSubImage2D) -#define glCompressedTextureSubImage3D GLEW_GET_FUN(__glewCompressedTextureSubImage3D) -#define glCopyNamedBufferSubData GLEW_GET_FUN(__glewCopyNamedBufferSubData) -#define glCopyTextureSubImage1D GLEW_GET_FUN(__glewCopyTextureSubImage1D) -#define glCopyTextureSubImage2D GLEW_GET_FUN(__glewCopyTextureSubImage2D) -#define glCopyTextureSubImage3D GLEW_GET_FUN(__glewCopyTextureSubImage3D) -#define glCreateBuffers GLEW_GET_FUN(__glewCreateBuffers) -#define glCreateFramebuffers GLEW_GET_FUN(__glewCreateFramebuffers) -#define glCreateProgramPipelines GLEW_GET_FUN(__glewCreateProgramPipelines) -#define glCreateQueries GLEW_GET_FUN(__glewCreateQueries) -#define glCreateRenderbuffers GLEW_GET_FUN(__glewCreateRenderbuffers) -#define glCreateSamplers GLEW_GET_FUN(__glewCreateSamplers) -#define glCreateTextures GLEW_GET_FUN(__glewCreateTextures) -#define glCreateTransformFeedbacks GLEW_GET_FUN(__glewCreateTransformFeedbacks) -#define glCreateVertexArrays GLEW_GET_FUN(__glewCreateVertexArrays) -#define glDisableVertexArrayAttrib GLEW_GET_FUN(__glewDisableVertexArrayAttrib) -#define glEnableVertexArrayAttrib GLEW_GET_FUN(__glewEnableVertexArrayAttrib) -#define glFlushMappedNamedBufferRange GLEW_GET_FUN(__glewFlushMappedNamedBufferRange) -#define glGenerateTextureMipmap GLEW_GET_FUN(__glewGenerateTextureMipmap) -#define glGetCompressedTextureImage GLEW_GET_FUN(__glewGetCompressedTextureImage) -#define glGetNamedBufferParameteri64v GLEW_GET_FUN(__glewGetNamedBufferParameteri64v) -#define glGetNamedBufferParameteriv GLEW_GET_FUN(__glewGetNamedBufferParameteriv) -#define glGetNamedBufferPointerv GLEW_GET_FUN(__glewGetNamedBufferPointerv) -#define glGetNamedBufferSubData GLEW_GET_FUN(__glewGetNamedBufferSubData) -#define glGetNamedFramebufferAttachmentParameteriv GLEW_GET_FUN(__glewGetNamedFramebufferAttachmentParameteriv) -#define glGetNamedFramebufferParameteriv GLEW_GET_FUN(__glewGetNamedFramebufferParameteriv) -#define glGetNamedRenderbufferParameteriv GLEW_GET_FUN(__glewGetNamedRenderbufferParameteriv) -#define glGetQueryBufferObjecti64v GLEW_GET_FUN(__glewGetQueryBufferObjecti64v) -#define glGetQueryBufferObjectiv GLEW_GET_FUN(__glewGetQueryBufferObjectiv) -#define glGetQueryBufferObjectui64v GLEW_GET_FUN(__glewGetQueryBufferObjectui64v) -#define glGetQueryBufferObjectuiv GLEW_GET_FUN(__glewGetQueryBufferObjectuiv) -#define glGetTextureImage GLEW_GET_FUN(__glewGetTextureImage) -#define glGetTextureLevelParameterfv GLEW_GET_FUN(__glewGetTextureLevelParameterfv) -#define glGetTextureLevelParameteriv GLEW_GET_FUN(__glewGetTextureLevelParameteriv) -#define glGetTextureParameterIiv GLEW_GET_FUN(__glewGetTextureParameterIiv) -#define glGetTextureParameterIuiv GLEW_GET_FUN(__glewGetTextureParameterIuiv) -#define glGetTextureParameterfv GLEW_GET_FUN(__glewGetTextureParameterfv) -#define glGetTextureParameteriv GLEW_GET_FUN(__glewGetTextureParameteriv) -#define glGetTransformFeedbacki64_v GLEW_GET_FUN(__glewGetTransformFeedbacki64_v) -#define glGetTransformFeedbacki_v GLEW_GET_FUN(__glewGetTransformFeedbacki_v) -#define glGetTransformFeedbackiv GLEW_GET_FUN(__glewGetTransformFeedbackiv) -#define glGetVertexArrayIndexed64iv GLEW_GET_FUN(__glewGetVertexArrayIndexed64iv) -#define glGetVertexArrayIndexediv GLEW_GET_FUN(__glewGetVertexArrayIndexediv) -#define glGetVertexArrayiv GLEW_GET_FUN(__glewGetVertexArrayiv) -#define glInvalidateNamedFramebufferData GLEW_GET_FUN(__glewInvalidateNamedFramebufferData) -#define glInvalidateNamedFramebufferSubData GLEW_GET_FUN(__glewInvalidateNamedFramebufferSubData) -#define glMapNamedBuffer GLEW_GET_FUN(__glewMapNamedBuffer) -#define glMapNamedBufferRange GLEW_GET_FUN(__glewMapNamedBufferRange) -#define glNamedBufferData GLEW_GET_FUN(__glewNamedBufferData) -#define glNamedBufferStorage GLEW_GET_FUN(__glewNamedBufferStorage) -#define glNamedBufferSubData GLEW_GET_FUN(__glewNamedBufferSubData) -#define glNamedFramebufferDrawBuffer GLEW_GET_FUN(__glewNamedFramebufferDrawBuffer) -#define glNamedFramebufferDrawBuffers GLEW_GET_FUN(__glewNamedFramebufferDrawBuffers) -#define glNamedFramebufferParameteri GLEW_GET_FUN(__glewNamedFramebufferParameteri) -#define glNamedFramebufferReadBuffer GLEW_GET_FUN(__glewNamedFramebufferReadBuffer) -#define glNamedFramebufferRenderbuffer GLEW_GET_FUN(__glewNamedFramebufferRenderbuffer) -#define glNamedFramebufferTexture GLEW_GET_FUN(__glewNamedFramebufferTexture) -#define glNamedFramebufferTextureLayer GLEW_GET_FUN(__glewNamedFramebufferTextureLayer) -#define glNamedRenderbufferStorage GLEW_GET_FUN(__glewNamedRenderbufferStorage) -#define glNamedRenderbufferStorageMultisample GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisample) -#define glTextureBuffer GLEW_GET_FUN(__glewTextureBuffer) -#define glTextureBufferRange GLEW_GET_FUN(__glewTextureBufferRange) -#define glTextureParameterIiv GLEW_GET_FUN(__glewTextureParameterIiv) -#define glTextureParameterIuiv GLEW_GET_FUN(__glewTextureParameterIuiv) -#define glTextureParameterf GLEW_GET_FUN(__glewTextureParameterf) -#define glTextureParameterfv GLEW_GET_FUN(__glewTextureParameterfv) -#define glTextureParameteri GLEW_GET_FUN(__glewTextureParameteri) -#define glTextureParameteriv GLEW_GET_FUN(__glewTextureParameteriv) -#define glTextureStorage1D GLEW_GET_FUN(__glewTextureStorage1D) -#define glTextureStorage2D GLEW_GET_FUN(__glewTextureStorage2D) -#define glTextureStorage2DMultisample GLEW_GET_FUN(__glewTextureStorage2DMultisample) -#define glTextureStorage3D GLEW_GET_FUN(__glewTextureStorage3D) -#define glTextureStorage3DMultisample GLEW_GET_FUN(__glewTextureStorage3DMultisample) -#define glTextureSubImage1D GLEW_GET_FUN(__glewTextureSubImage1D) -#define glTextureSubImage2D GLEW_GET_FUN(__glewTextureSubImage2D) -#define glTextureSubImage3D GLEW_GET_FUN(__glewTextureSubImage3D) -#define glTransformFeedbackBufferBase GLEW_GET_FUN(__glewTransformFeedbackBufferBase) -#define glTransformFeedbackBufferRange GLEW_GET_FUN(__glewTransformFeedbackBufferRange) -#define glUnmapNamedBuffer GLEW_GET_FUN(__glewUnmapNamedBuffer) -#define glVertexArrayAttribBinding GLEW_GET_FUN(__glewVertexArrayAttribBinding) -#define glVertexArrayAttribFormat GLEW_GET_FUN(__glewVertexArrayAttribFormat) -#define glVertexArrayAttribIFormat GLEW_GET_FUN(__glewVertexArrayAttribIFormat) -#define glVertexArrayAttribLFormat GLEW_GET_FUN(__glewVertexArrayAttribLFormat) -#define glVertexArrayBindingDivisor GLEW_GET_FUN(__glewVertexArrayBindingDivisor) -#define glVertexArrayElementBuffer GLEW_GET_FUN(__glewVertexArrayElementBuffer) -#define glVertexArrayVertexBuffer GLEW_GET_FUN(__glewVertexArrayVertexBuffer) -#define glVertexArrayVertexBuffers GLEW_GET_FUN(__glewVertexArrayVertexBuffers) - -#define GLEW_ARB_direct_state_access GLEW_GET_VAR(__GLEW_ARB_direct_state_access) - -#endif /* GL_ARB_direct_state_access */ - -/* -------------------------- GL_ARB_draw_buffers -------------------------- */ - -#ifndef GL_ARB_draw_buffers -#define GL_ARB_draw_buffers 1 - -#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 -#define GL_DRAW_BUFFER0_ARB 0x8825 -#define GL_DRAW_BUFFER1_ARB 0x8826 -#define GL_DRAW_BUFFER2_ARB 0x8827 -#define GL_DRAW_BUFFER3_ARB 0x8828 -#define GL_DRAW_BUFFER4_ARB 0x8829 -#define GL_DRAW_BUFFER5_ARB 0x882A -#define GL_DRAW_BUFFER6_ARB 0x882B -#define GL_DRAW_BUFFER7_ARB 0x882C -#define GL_DRAW_BUFFER8_ARB 0x882D -#define GL_DRAW_BUFFER9_ARB 0x882E -#define GL_DRAW_BUFFER10_ARB 0x882F -#define GL_DRAW_BUFFER11_ARB 0x8830 -#define GL_DRAW_BUFFER12_ARB 0x8831 -#define GL_DRAW_BUFFER13_ARB 0x8832 -#define GL_DRAW_BUFFER14_ARB 0x8833 -#define GL_DRAW_BUFFER15_ARB 0x8834 - -typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum* bufs); - -#define glDrawBuffersARB GLEW_GET_FUN(__glewDrawBuffersARB) - -#define GLEW_ARB_draw_buffers GLEW_GET_VAR(__GLEW_ARB_draw_buffers) - -#endif /* GL_ARB_draw_buffers */ - -/* ----------------------- GL_ARB_draw_buffers_blend ----------------------- */ - -#ifndef GL_ARB_draw_buffers_blend -#define GL_ARB_draw_buffers_blend 1 - -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); - -#define glBlendEquationSeparateiARB GLEW_GET_FUN(__glewBlendEquationSeparateiARB) -#define glBlendEquationiARB GLEW_GET_FUN(__glewBlendEquationiARB) -#define glBlendFuncSeparateiARB GLEW_GET_FUN(__glewBlendFuncSeparateiARB) -#define glBlendFunciARB GLEW_GET_FUN(__glewBlendFunciARB) - -#define GLEW_ARB_draw_buffers_blend GLEW_GET_VAR(__GLEW_ARB_draw_buffers_blend) - -#endif /* GL_ARB_draw_buffers_blend */ - -/* -------------------- GL_ARB_draw_elements_base_vertex ------------------- */ - -#ifndef GL_ARB_draw_elements_base_vertex -#define GL_ARB_draw_elements_base_vertex 1 - -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLint basevertex); -typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei* count, GLenum type, const void *const *indices, GLsizei primcount, const GLint *basevertex); - -#define glDrawElementsBaseVertex GLEW_GET_FUN(__glewDrawElementsBaseVertex) -#define glDrawElementsInstancedBaseVertex GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertex) -#define glDrawRangeElementsBaseVertex GLEW_GET_FUN(__glewDrawRangeElementsBaseVertex) -#define glMultiDrawElementsBaseVertex GLEW_GET_FUN(__glewMultiDrawElementsBaseVertex) - -#define GLEW_ARB_draw_elements_base_vertex GLEW_GET_VAR(__GLEW_ARB_draw_elements_base_vertex) - -#endif /* GL_ARB_draw_elements_base_vertex */ - -/* -------------------------- GL_ARB_draw_indirect ------------------------- */ - -#ifndef GL_ARB_draw_indirect -#define GL_ARB_draw_indirect 1 - -#define GL_DRAW_INDIRECT_BUFFER 0x8F3F -#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 - -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); - -#define glDrawArraysIndirect GLEW_GET_FUN(__glewDrawArraysIndirect) -#define glDrawElementsIndirect GLEW_GET_FUN(__glewDrawElementsIndirect) - -#define GLEW_ARB_draw_indirect GLEW_GET_VAR(__GLEW_ARB_draw_indirect) - -#endif /* GL_ARB_draw_indirect */ - -/* ------------------------- GL_ARB_draw_instanced ------------------------- */ - -#ifndef GL_ARB_draw_instanced -#define GL_ARB_draw_instanced 1 - -#define GLEW_ARB_draw_instanced GLEW_GET_VAR(__GLEW_ARB_draw_instanced) - -#endif /* GL_ARB_draw_instanced */ - -/* ------------------------ GL_ARB_enhanced_layouts ------------------------ */ - -#ifndef GL_ARB_enhanced_layouts -#define GL_ARB_enhanced_layouts 1 - -#define GL_LOCATION_COMPONENT 0x934A -#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B -#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C - -#define GLEW_ARB_enhanced_layouts GLEW_GET_VAR(__GLEW_ARB_enhanced_layouts) - -#endif /* GL_ARB_enhanced_layouts */ - -/* -------------------- GL_ARB_explicit_attrib_location -------------------- */ - -#ifndef GL_ARB_explicit_attrib_location -#define GL_ARB_explicit_attrib_location 1 - -#define GLEW_ARB_explicit_attrib_location GLEW_GET_VAR(__GLEW_ARB_explicit_attrib_location) - -#endif /* GL_ARB_explicit_attrib_location */ - -/* -------------------- GL_ARB_explicit_uniform_location ------------------- */ - -#ifndef GL_ARB_explicit_uniform_location -#define GL_ARB_explicit_uniform_location 1 - -#define GL_MAX_UNIFORM_LOCATIONS 0x826E - -#define GLEW_ARB_explicit_uniform_location GLEW_GET_VAR(__GLEW_ARB_explicit_uniform_location) - -#endif /* GL_ARB_explicit_uniform_location */ - -/* ------------------- GL_ARB_fragment_coord_conventions ------------------- */ - -#ifndef GL_ARB_fragment_coord_conventions -#define GL_ARB_fragment_coord_conventions 1 - -#define GLEW_ARB_fragment_coord_conventions GLEW_GET_VAR(__GLEW_ARB_fragment_coord_conventions) - -#endif /* GL_ARB_fragment_coord_conventions */ - -/* --------------------- GL_ARB_fragment_layer_viewport -------------------- */ - -#ifndef GL_ARB_fragment_layer_viewport -#define GL_ARB_fragment_layer_viewport 1 - -#define GLEW_ARB_fragment_layer_viewport GLEW_GET_VAR(__GLEW_ARB_fragment_layer_viewport) - -#endif /* GL_ARB_fragment_layer_viewport */ - -/* ------------------------ GL_ARB_fragment_program ------------------------ */ - -#ifndef GL_ARB_fragment_program -#define GL_ARB_fragment_program 1 - -#define GL_FRAGMENT_PROGRAM_ARB 0x8804 -#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 -#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 -#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 -#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 -#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 -#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A -#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B -#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C -#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D -#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E -#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F -#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 -#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 - -#define GLEW_ARB_fragment_program GLEW_GET_VAR(__GLEW_ARB_fragment_program) - -#endif /* GL_ARB_fragment_program */ - -/* --------------------- GL_ARB_fragment_program_shadow -------------------- */ - -#ifndef GL_ARB_fragment_program_shadow -#define GL_ARB_fragment_program_shadow 1 - -#define GLEW_ARB_fragment_program_shadow GLEW_GET_VAR(__GLEW_ARB_fragment_program_shadow) - -#endif /* GL_ARB_fragment_program_shadow */ - -/* ------------------------- GL_ARB_fragment_shader ------------------------ */ - -#ifndef GL_ARB_fragment_shader -#define GL_ARB_fragment_shader 1 - -#define GL_FRAGMENT_SHADER_ARB 0x8B30 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B - -#define GLEW_ARB_fragment_shader GLEW_GET_VAR(__GLEW_ARB_fragment_shader) - -#endif /* GL_ARB_fragment_shader */ - -/* -------------------- GL_ARB_fragment_shader_interlock ------------------- */ - -#ifndef GL_ARB_fragment_shader_interlock -#define GL_ARB_fragment_shader_interlock 1 - -#define GLEW_ARB_fragment_shader_interlock GLEW_GET_VAR(__GLEW_ARB_fragment_shader_interlock) - -#endif /* GL_ARB_fragment_shader_interlock */ - -/* ------------------- GL_ARB_framebuffer_no_attachments ------------------- */ - -#ifndef GL_ARB_framebuffer_no_attachments -#define GL_ARB_framebuffer_no_attachments 1 - -#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 -#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 -#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 -#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 -#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 -#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 -#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 -#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 -#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param); - -#define glFramebufferParameteri GLEW_GET_FUN(__glewFramebufferParameteri) -#define glGetFramebufferParameteriv GLEW_GET_FUN(__glewGetFramebufferParameteriv) -#define glGetNamedFramebufferParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferParameterivEXT) -#define glNamedFramebufferParameteriEXT GLEW_GET_FUN(__glewNamedFramebufferParameteriEXT) - -#define GLEW_ARB_framebuffer_no_attachments GLEW_GET_VAR(__GLEW_ARB_framebuffer_no_attachments) - -#endif /* GL_ARB_framebuffer_no_attachments */ - -/* ----------------------- GL_ARB_framebuffer_object ----------------------- */ - -#ifndef GL_ARB_framebuffer_object -#define GL_ARB_framebuffer_object 1 - -#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 -#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 -#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 -#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 -#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 -#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 -#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 -#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 -#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 -#define GL_FRAMEBUFFER_DEFAULT 0x8218 -#define GL_FRAMEBUFFER_UNDEFINED 0x8219 -#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A -#define GL_INDEX 0x8222 -#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 -#define GL_DEPTH_STENCIL 0x84F9 -#define GL_UNSIGNED_INT_24_8 0x84FA -#define GL_DEPTH24_STENCIL8 0x88F0 -#define GL_TEXTURE_STENCIL_SIZE 0x88F1 -#define GL_UNSIGNED_NORMALIZED 0x8C17 -#define GL_SRGB 0x8C40 -#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_RENDERBUFFER_BINDING 0x8CA7 -#define GL_READ_FRAMEBUFFER 0x8CA8 -#define GL_DRAW_FRAMEBUFFER 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA -#define GL_RENDERBUFFER_SAMPLES 0x8CAB -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD -#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF -#define GL_COLOR_ATTACHMENT0 0x8CE0 -#define GL_COLOR_ATTACHMENT1 0x8CE1 -#define GL_COLOR_ATTACHMENT2 0x8CE2 -#define GL_COLOR_ATTACHMENT3 0x8CE3 -#define GL_COLOR_ATTACHMENT4 0x8CE4 -#define GL_COLOR_ATTACHMENT5 0x8CE5 -#define GL_COLOR_ATTACHMENT6 0x8CE6 -#define GL_COLOR_ATTACHMENT7 0x8CE7 -#define GL_COLOR_ATTACHMENT8 0x8CE8 -#define GL_COLOR_ATTACHMENT9 0x8CE9 -#define GL_COLOR_ATTACHMENT10 0x8CEA -#define GL_COLOR_ATTACHMENT11 0x8CEB -#define GL_COLOR_ATTACHMENT12 0x8CEC -#define GL_COLOR_ATTACHMENT13 0x8CED -#define GL_COLOR_ATTACHMENT14 0x8CEE -#define GL_COLOR_ATTACHMENT15 0x8CEF -#define GL_DEPTH_ATTACHMENT 0x8D00 -#define GL_STENCIL_ATTACHMENT 0x8D20 -#define GL_FRAMEBUFFER 0x8D40 -#define GL_RENDERBUFFER 0x8D41 -#define GL_RENDERBUFFER_WIDTH 0x8D42 -#define GL_RENDERBUFFER_HEIGHT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 -#define GL_STENCIL_INDEX1 0x8D46 -#define GL_STENCIL_INDEX4 0x8D47 -#define GL_STENCIL_INDEX8 0x8D48 -#define GL_STENCIL_INDEX16 0x8D49 -#define GL_RENDERBUFFER_RED_SIZE 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 -#define GL_MAX_SAMPLES 0x8D57 - -typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); -typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint* framebuffers); -typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint* renderbuffers); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint layer); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target,GLenum attachment, GLuint texture,GLint level,GLint layer); -typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers); -typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers); -typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); -typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - -#define glBindFramebuffer GLEW_GET_FUN(__glewBindFramebuffer) -#define glBindRenderbuffer GLEW_GET_FUN(__glewBindRenderbuffer) -#define glBlitFramebuffer GLEW_GET_FUN(__glewBlitFramebuffer) -#define glCheckFramebufferStatus GLEW_GET_FUN(__glewCheckFramebufferStatus) -#define glDeleteFramebuffers GLEW_GET_FUN(__glewDeleteFramebuffers) -#define glDeleteRenderbuffers GLEW_GET_FUN(__glewDeleteRenderbuffers) -#define glFramebufferRenderbuffer GLEW_GET_FUN(__glewFramebufferRenderbuffer) -#define glFramebufferTexture1D GLEW_GET_FUN(__glewFramebufferTexture1D) -#define glFramebufferTexture2D GLEW_GET_FUN(__glewFramebufferTexture2D) -#define glFramebufferTexture3D GLEW_GET_FUN(__glewFramebufferTexture3D) -#define glFramebufferTextureLayer GLEW_GET_FUN(__glewFramebufferTextureLayer) -#define glGenFramebuffers GLEW_GET_FUN(__glewGenFramebuffers) -#define glGenRenderbuffers GLEW_GET_FUN(__glewGenRenderbuffers) -#define glGenerateMipmap GLEW_GET_FUN(__glewGenerateMipmap) -#define glGetFramebufferAttachmentParameteriv GLEW_GET_FUN(__glewGetFramebufferAttachmentParameteriv) -#define glGetRenderbufferParameteriv GLEW_GET_FUN(__glewGetRenderbufferParameteriv) -#define glIsFramebuffer GLEW_GET_FUN(__glewIsFramebuffer) -#define glIsRenderbuffer GLEW_GET_FUN(__glewIsRenderbuffer) -#define glRenderbufferStorage GLEW_GET_FUN(__glewRenderbufferStorage) -#define glRenderbufferStorageMultisample GLEW_GET_FUN(__glewRenderbufferStorageMultisample) - -#define GLEW_ARB_framebuffer_object GLEW_GET_VAR(__GLEW_ARB_framebuffer_object) - -#endif /* GL_ARB_framebuffer_object */ - -/* ------------------------ GL_ARB_framebuffer_sRGB ------------------------ */ - -#ifndef GL_ARB_framebuffer_sRGB -#define GL_ARB_framebuffer_sRGB 1 - -#define GL_FRAMEBUFFER_SRGB 0x8DB9 - -#define GLEW_ARB_framebuffer_sRGB GLEW_GET_VAR(__GLEW_ARB_framebuffer_sRGB) - -#endif /* GL_ARB_framebuffer_sRGB */ - -/* ------------------------ GL_ARB_geometry_shader4 ------------------------ */ - -#ifndef GL_ARB_geometry_shader4 -#define GL_ARB_geometry_shader4 1 - -#define GL_LINES_ADJACENCY_ARB 0xA -#define GL_LINE_STRIP_ADJACENCY_ARB 0xB -#define GL_TRIANGLES_ADJACENCY_ARB 0xC -#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0xD -#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 -#define GL_GEOMETRY_SHADER_ARB 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA -#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB -#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC -#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD -#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); - -#define glFramebufferTextureARB GLEW_GET_FUN(__glewFramebufferTextureARB) -#define glFramebufferTextureFaceARB GLEW_GET_FUN(__glewFramebufferTextureFaceARB) -#define glFramebufferTextureLayerARB GLEW_GET_FUN(__glewFramebufferTextureLayerARB) -#define glProgramParameteriARB GLEW_GET_FUN(__glewProgramParameteriARB) - -#define GLEW_ARB_geometry_shader4 GLEW_GET_VAR(__GLEW_ARB_geometry_shader4) - -#endif /* GL_ARB_geometry_shader4 */ - -/* ----------------------- GL_ARB_get_program_binary ----------------------- */ - -#ifndef GL_ARB_get_program_binary -#define GL_ARB_get_program_binary 1 - -#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 -#define GL_PROGRAM_BINARY_LENGTH 0x8741 -#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE -#define GL_PROGRAM_BINARY_FORMATS 0x87FF - -typedef void (GLAPIENTRY * PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum *binaryFormat, void*binary); -typedef void (GLAPIENTRY * PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); - -#define glGetProgramBinary GLEW_GET_FUN(__glewGetProgramBinary) -#define glProgramBinary GLEW_GET_FUN(__glewProgramBinary) -#define glProgramParameteri GLEW_GET_FUN(__glewProgramParameteri) - -#define GLEW_ARB_get_program_binary GLEW_GET_VAR(__GLEW_ARB_get_program_binary) - -#endif /* GL_ARB_get_program_binary */ - -/* ---------------------- GL_ARB_get_texture_sub_image --------------------- */ - -#ifndef GL_ARB_get_texture_sub_image -#define GL_ARB_get_texture_sub_image 1 - -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); -typedef void (GLAPIENTRY * PFNGLGETTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); - -#define glGetCompressedTextureSubImage GLEW_GET_FUN(__glewGetCompressedTextureSubImage) -#define glGetTextureSubImage GLEW_GET_FUN(__glewGetTextureSubImage) - -#define GLEW_ARB_get_texture_sub_image GLEW_GET_VAR(__GLEW_ARB_get_texture_sub_image) - -#endif /* GL_ARB_get_texture_sub_image */ - -/* --------------------------- GL_ARB_gpu_shader5 -------------------------- */ - -#ifndef GL_ARB_gpu_shader5 -#define GL_ARB_gpu_shader5 1 - -#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F -#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A -#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B -#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C -#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D -#define GL_MAX_VERTEX_STREAMS 0x8E71 - -#define GLEW_ARB_gpu_shader5 GLEW_GET_VAR(__GLEW_ARB_gpu_shader5) - -#endif /* GL_ARB_gpu_shader5 */ - -/* ------------------------- GL_ARB_gpu_shader_fp64 ------------------------ */ - -#ifndef GL_ARB_gpu_shader_fp64 -#define GL_ARB_gpu_shader_fp64 1 - -#define GL_DOUBLE_MAT2 0x8F46 -#define GL_DOUBLE_MAT3 0x8F47 -#define GL_DOUBLE_MAT4 0x8F48 -#define GL_DOUBLE_MAT2x3 0x8F49 -#define GL_DOUBLE_MAT2x4 0x8F4A -#define GL_DOUBLE_MAT3x2 0x8F4B -#define GL_DOUBLE_MAT3x4 0x8F4C -#define GL_DOUBLE_MAT4x2 0x8F4D -#define GL_DOUBLE_MAT4x3 0x8F4E -#define GL_DOUBLE_VEC2 0x8FFC -#define GL_DOUBLE_VEC3 0x8FFD -#define GL_DOUBLE_VEC4 0x8FFE - -typedef void (GLAPIENTRY * PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); -typedef void (GLAPIENTRY * PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); - -#define glGetUniformdv GLEW_GET_FUN(__glewGetUniformdv) -#define glUniform1d GLEW_GET_FUN(__glewUniform1d) -#define glUniform1dv GLEW_GET_FUN(__glewUniform1dv) -#define glUniform2d GLEW_GET_FUN(__glewUniform2d) -#define glUniform2dv GLEW_GET_FUN(__glewUniform2dv) -#define glUniform3d GLEW_GET_FUN(__glewUniform3d) -#define glUniform3dv GLEW_GET_FUN(__glewUniform3dv) -#define glUniform4d GLEW_GET_FUN(__glewUniform4d) -#define glUniform4dv GLEW_GET_FUN(__glewUniform4dv) -#define glUniformMatrix2dv GLEW_GET_FUN(__glewUniformMatrix2dv) -#define glUniformMatrix2x3dv GLEW_GET_FUN(__glewUniformMatrix2x3dv) -#define glUniformMatrix2x4dv GLEW_GET_FUN(__glewUniformMatrix2x4dv) -#define glUniformMatrix3dv GLEW_GET_FUN(__glewUniformMatrix3dv) -#define glUniformMatrix3x2dv GLEW_GET_FUN(__glewUniformMatrix3x2dv) -#define glUniformMatrix3x4dv GLEW_GET_FUN(__glewUniformMatrix3x4dv) -#define glUniformMatrix4dv GLEW_GET_FUN(__glewUniformMatrix4dv) -#define glUniformMatrix4x2dv GLEW_GET_FUN(__glewUniformMatrix4x2dv) -#define glUniformMatrix4x3dv GLEW_GET_FUN(__glewUniformMatrix4x3dv) - -#define GLEW_ARB_gpu_shader_fp64 GLEW_GET_VAR(__GLEW_ARB_gpu_shader_fp64) - -#endif /* GL_ARB_gpu_shader_fp64 */ - -/* ------------------------ GL_ARB_gpu_shader_int64 ------------------------ */ - -#ifndef GL_ARB_gpu_shader_int64 -#define GL_ARB_gpu_shader_int64 1 - -#define GL_INT64_ARB 0x140E -#define GL_UNSIGNED_INT64_ARB 0x140F -#define GL_INT64_VEC2_ARB 0x8FE9 -#define GL_INT64_VEC3_ARB 0x8FEA -#define GL_INT64_VEC4_ARB 0x8FEB -#define GL_UNSIGNED_INT64_VEC2_ARB 0x8FF5 -#define GL_UNSIGNED_INT64_VEC3_ARB 0x8FF6 -#define GL_UNSIGNED_INT64_VEC4_ARB 0x8FF7 - -typedef void (GLAPIENTRY * PFNGLGETUNIFORMI64VARBPROC) (GLuint program, GLint location, GLint64* params); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLuint64* params); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint64* params); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint64* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64ARBPROC) (GLuint program, GLint location, GLint64 x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64ARBPROC) (GLuint program, GLint location, GLuint64 x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM1I64ARBPROC) (GLint location, GLint64 x); -typedef void (GLAPIENTRY * PFNGLUNIFORM1I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64ARBPROC) (GLint location, GLuint64 x); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2I64ARBPROC) (GLint location, GLint64 x, GLint64 y); -typedef void (GLAPIENTRY * PFNGLUNIFORM2I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z); -typedef void (GLAPIENTRY * PFNGLUNIFORM3I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); -typedef void (GLAPIENTRY * PFNGLUNIFORM4I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); - -#define glGetUniformi64vARB GLEW_GET_FUN(__glewGetUniformi64vARB) -#define glGetUniformui64vARB GLEW_GET_FUN(__glewGetUniformui64vARB) -#define glGetnUniformi64vARB GLEW_GET_FUN(__glewGetnUniformi64vARB) -#define glGetnUniformui64vARB GLEW_GET_FUN(__glewGetnUniformui64vARB) -#define glProgramUniform1i64ARB GLEW_GET_FUN(__glewProgramUniform1i64ARB) -#define glProgramUniform1i64vARB GLEW_GET_FUN(__glewProgramUniform1i64vARB) -#define glProgramUniform1ui64ARB GLEW_GET_FUN(__glewProgramUniform1ui64ARB) -#define glProgramUniform1ui64vARB GLEW_GET_FUN(__glewProgramUniform1ui64vARB) -#define glProgramUniform2i64ARB GLEW_GET_FUN(__glewProgramUniform2i64ARB) -#define glProgramUniform2i64vARB GLEW_GET_FUN(__glewProgramUniform2i64vARB) -#define glProgramUniform2ui64ARB GLEW_GET_FUN(__glewProgramUniform2ui64ARB) -#define glProgramUniform2ui64vARB GLEW_GET_FUN(__glewProgramUniform2ui64vARB) -#define glProgramUniform3i64ARB GLEW_GET_FUN(__glewProgramUniform3i64ARB) -#define glProgramUniform3i64vARB GLEW_GET_FUN(__glewProgramUniform3i64vARB) -#define glProgramUniform3ui64ARB GLEW_GET_FUN(__glewProgramUniform3ui64ARB) -#define glProgramUniform3ui64vARB GLEW_GET_FUN(__glewProgramUniform3ui64vARB) -#define glProgramUniform4i64ARB GLEW_GET_FUN(__glewProgramUniform4i64ARB) -#define glProgramUniform4i64vARB GLEW_GET_FUN(__glewProgramUniform4i64vARB) -#define glProgramUniform4ui64ARB GLEW_GET_FUN(__glewProgramUniform4ui64ARB) -#define glProgramUniform4ui64vARB GLEW_GET_FUN(__glewProgramUniform4ui64vARB) -#define glUniform1i64ARB GLEW_GET_FUN(__glewUniform1i64ARB) -#define glUniform1i64vARB GLEW_GET_FUN(__glewUniform1i64vARB) -#define glUniform1ui64ARB GLEW_GET_FUN(__glewUniform1ui64ARB) -#define glUniform1ui64vARB GLEW_GET_FUN(__glewUniform1ui64vARB) -#define glUniform2i64ARB GLEW_GET_FUN(__glewUniform2i64ARB) -#define glUniform2i64vARB GLEW_GET_FUN(__glewUniform2i64vARB) -#define glUniform2ui64ARB GLEW_GET_FUN(__glewUniform2ui64ARB) -#define glUniform2ui64vARB GLEW_GET_FUN(__glewUniform2ui64vARB) -#define glUniform3i64ARB GLEW_GET_FUN(__glewUniform3i64ARB) -#define glUniform3i64vARB GLEW_GET_FUN(__glewUniform3i64vARB) -#define glUniform3ui64ARB GLEW_GET_FUN(__glewUniform3ui64ARB) -#define glUniform3ui64vARB GLEW_GET_FUN(__glewUniform3ui64vARB) -#define glUniform4i64ARB GLEW_GET_FUN(__glewUniform4i64ARB) -#define glUniform4i64vARB GLEW_GET_FUN(__glewUniform4i64vARB) -#define glUniform4ui64ARB GLEW_GET_FUN(__glewUniform4ui64ARB) -#define glUniform4ui64vARB GLEW_GET_FUN(__glewUniform4ui64vARB) - -#define GLEW_ARB_gpu_shader_int64 GLEW_GET_VAR(__GLEW_ARB_gpu_shader_int64) - -#endif /* GL_ARB_gpu_shader_int64 */ - -/* ------------------------ GL_ARB_half_float_pixel ------------------------ */ - -#ifndef GL_ARB_half_float_pixel -#define GL_ARB_half_float_pixel 1 - -#define GL_HALF_FLOAT_ARB 0x140B - -#define GLEW_ARB_half_float_pixel GLEW_GET_VAR(__GLEW_ARB_half_float_pixel) - -#endif /* GL_ARB_half_float_pixel */ - -/* ------------------------ GL_ARB_half_float_vertex ----------------------- */ - -#ifndef GL_ARB_half_float_vertex -#define GL_ARB_half_float_vertex 1 - -#define GL_HALF_FLOAT 0x140B - -#define GLEW_ARB_half_float_vertex GLEW_GET_VAR(__GLEW_ARB_half_float_vertex) - -#endif /* GL_ARB_half_float_vertex */ - -/* ----------------------------- GL_ARB_imaging ---------------------------- */ - -#ifndef GL_ARB_imaging -#define GL_ARB_imaging 1 - -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_BLEND_COLOR 0x8005 -#define GL_FUNC_ADD 0x8006 -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -#define GL_BLEND_EQUATION 0x8009 -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_CONVOLUTION_1D 0x8010 -#define GL_CONVOLUTION_2D 0x8011 -#define GL_SEPARABLE_2D 0x8012 -#define GL_CONVOLUTION_BORDER_MODE 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS 0x8015 -#define GL_REDUCE 0x8016 -#define GL_CONVOLUTION_FORMAT 0x8017 -#define GL_CONVOLUTION_WIDTH 0x8018 -#define GL_CONVOLUTION_HEIGHT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 -#define GL_HISTOGRAM 0x8024 -#define GL_PROXY_HISTOGRAM 0x8025 -#define GL_HISTOGRAM_WIDTH 0x8026 -#define GL_HISTOGRAM_FORMAT 0x8027 -#define GL_HISTOGRAM_RED_SIZE 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C -#define GL_HISTOGRAM_SINK 0x802D -#define GL_MINMAX 0x802E -#define GL_MINMAX_FORMAT 0x802F -#define GL_MINMAX_SINK 0x8030 -#define GL_TABLE_TOO_LARGE 0x8031 -#define GL_COLOR_MATRIX 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB -#define GL_COLOR_TABLE 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 -#define GL_PROXY_COLOR_TABLE 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 -#define GL_COLOR_TABLE_SCALE 0x80D6 -#define GL_COLOR_TABLE_BIAS 0x80D7 -#define GL_COLOR_TABLE_FORMAT 0x80D8 -#define GL_COLOR_TABLE_WIDTH 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF -#define GL_IGNORE_BORDER 0x8150 -#define GL_CONSTANT_BORDER 0x8151 -#define GL_WRAP_BORDER 0x8152 -#define GL_REPLICATE_BORDER 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR 0x8154 - -typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); -typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, void *table); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, void *image); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum types, void *values); -typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); -typedef void (GLAPIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (GLAPIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLRESETMINMAXPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); - -#define glColorSubTable GLEW_GET_FUN(__glewColorSubTable) -#define glColorTable GLEW_GET_FUN(__glewColorTable) -#define glColorTableParameterfv GLEW_GET_FUN(__glewColorTableParameterfv) -#define glColorTableParameteriv GLEW_GET_FUN(__glewColorTableParameteriv) -#define glConvolutionFilter1D GLEW_GET_FUN(__glewConvolutionFilter1D) -#define glConvolutionFilter2D GLEW_GET_FUN(__glewConvolutionFilter2D) -#define glConvolutionParameterf GLEW_GET_FUN(__glewConvolutionParameterf) -#define glConvolutionParameterfv GLEW_GET_FUN(__glewConvolutionParameterfv) -#define glConvolutionParameteri GLEW_GET_FUN(__glewConvolutionParameteri) -#define glConvolutionParameteriv GLEW_GET_FUN(__glewConvolutionParameteriv) -#define glCopyColorSubTable GLEW_GET_FUN(__glewCopyColorSubTable) -#define glCopyColorTable GLEW_GET_FUN(__glewCopyColorTable) -#define glCopyConvolutionFilter1D GLEW_GET_FUN(__glewCopyConvolutionFilter1D) -#define glCopyConvolutionFilter2D GLEW_GET_FUN(__glewCopyConvolutionFilter2D) -#define glGetColorTable GLEW_GET_FUN(__glewGetColorTable) -#define glGetColorTableParameterfv GLEW_GET_FUN(__glewGetColorTableParameterfv) -#define glGetColorTableParameteriv GLEW_GET_FUN(__glewGetColorTableParameteriv) -#define glGetConvolutionFilter GLEW_GET_FUN(__glewGetConvolutionFilter) -#define glGetConvolutionParameterfv GLEW_GET_FUN(__glewGetConvolutionParameterfv) -#define glGetConvolutionParameteriv GLEW_GET_FUN(__glewGetConvolutionParameteriv) -#define glGetHistogram GLEW_GET_FUN(__glewGetHistogram) -#define glGetHistogramParameterfv GLEW_GET_FUN(__glewGetHistogramParameterfv) -#define glGetHistogramParameteriv GLEW_GET_FUN(__glewGetHistogramParameteriv) -#define glGetMinmax GLEW_GET_FUN(__glewGetMinmax) -#define glGetMinmaxParameterfv GLEW_GET_FUN(__glewGetMinmaxParameterfv) -#define glGetMinmaxParameteriv GLEW_GET_FUN(__glewGetMinmaxParameteriv) -#define glGetSeparableFilter GLEW_GET_FUN(__glewGetSeparableFilter) -#define glHistogram GLEW_GET_FUN(__glewHistogram) -#define glMinmax GLEW_GET_FUN(__glewMinmax) -#define glResetHistogram GLEW_GET_FUN(__glewResetHistogram) -#define glResetMinmax GLEW_GET_FUN(__glewResetMinmax) -#define glSeparableFilter2D GLEW_GET_FUN(__glewSeparableFilter2D) - -#define GLEW_ARB_imaging GLEW_GET_VAR(__GLEW_ARB_imaging) - -#endif /* GL_ARB_imaging */ - -/* ----------------------- GL_ARB_indirect_parameters ---------------------- */ - -#ifndef GL_ARB_indirect_parameters -#define GL_ARB_indirect_parameters 1 - -#define GL_PARAMETER_BUFFER_ARB 0x80EE -#define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF - -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); - -#define glMultiDrawArraysIndirectCountARB GLEW_GET_FUN(__glewMultiDrawArraysIndirectCountARB) -#define glMultiDrawElementsIndirectCountARB GLEW_GET_FUN(__glewMultiDrawElementsIndirectCountARB) - -#define GLEW_ARB_indirect_parameters GLEW_GET_VAR(__GLEW_ARB_indirect_parameters) - -#endif /* GL_ARB_indirect_parameters */ - -/* ------------------------ GL_ARB_instanced_arrays ------------------------ */ - -#ifndef GL_ARB_instanced_arrays -#define GL_ARB_instanced_arrays 1 - -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE - -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); - -#define glDrawArraysInstancedARB GLEW_GET_FUN(__glewDrawArraysInstancedARB) -#define glDrawElementsInstancedARB GLEW_GET_FUN(__glewDrawElementsInstancedARB) -#define glVertexAttribDivisorARB GLEW_GET_FUN(__glewVertexAttribDivisorARB) - -#define GLEW_ARB_instanced_arrays GLEW_GET_VAR(__GLEW_ARB_instanced_arrays) - -#endif /* GL_ARB_instanced_arrays */ - -/* ---------------------- GL_ARB_internalformat_query ---------------------- */ - -#ifndef GL_ARB_internalformat_query -#define GL_ARB_internalformat_query 1 - -#define GL_NUM_SAMPLE_COUNTS 0x9380 - -typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params); - -#define glGetInternalformativ GLEW_GET_FUN(__glewGetInternalformativ) - -#define GLEW_ARB_internalformat_query GLEW_GET_VAR(__GLEW_ARB_internalformat_query) - -#endif /* GL_ARB_internalformat_query */ - -/* ---------------------- GL_ARB_internalformat_query2 --------------------- */ - -#ifndef GL_ARB_internalformat_query2 -#define GL_ARB_internalformat_query2 1 - -#define GL_INTERNALFORMAT_SUPPORTED 0x826F -#define GL_INTERNALFORMAT_PREFERRED 0x8270 -#define GL_INTERNALFORMAT_RED_SIZE 0x8271 -#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 -#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 -#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 -#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 -#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 -#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 -#define GL_INTERNALFORMAT_RED_TYPE 0x8278 -#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 -#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A -#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B -#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C -#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D -#define GL_MAX_WIDTH 0x827E -#define GL_MAX_HEIGHT 0x827F -#define GL_MAX_DEPTH 0x8280 -#define GL_MAX_LAYERS 0x8281 -#define GL_MAX_COMBINED_DIMENSIONS 0x8282 -#define GL_COLOR_COMPONENTS 0x8283 -#define GL_DEPTH_COMPONENTS 0x8284 -#define GL_STENCIL_COMPONENTS 0x8285 -#define GL_COLOR_RENDERABLE 0x8286 -#define GL_DEPTH_RENDERABLE 0x8287 -#define GL_STENCIL_RENDERABLE 0x8288 -#define GL_FRAMEBUFFER_RENDERABLE 0x8289 -#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A -#define GL_FRAMEBUFFER_BLEND 0x828B -#define GL_READ_PIXELS 0x828C -#define GL_READ_PIXELS_FORMAT 0x828D -#define GL_READ_PIXELS_TYPE 0x828E -#define GL_TEXTURE_IMAGE_FORMAT 0x828F -#define GL_TEXTURE_IMAGE_TYPE 0x8290 -#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 -#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 -#define GL_MIPMAP 0x8293 -#define GL_MANUAL_GENERATE_MIPMAP 0x8294 -#define GL_AUTO_GENERATE_MIPMAP 0x8295 -#define GL_COLOR_ENCODING 0x8296 -#define GL_SRGB_READ 0x8297 -#define GL_SRGB_WRITE 0x8298 -#define GL_SRGB_DECODE_ARB 0x8299 -#define GL_FILTER 0x829A -#define GL_VERTEX_TEXTURE 0x829B -#define GL_TESS_CONTROL_TEXTURE 0x829C -#define GL_TESS_EVALUATION_TEXTURE 0x829D -#define GL_GEOMETRY_TEXTURE 0x829E -#define GL_FRAGMENT_TEXTURE 0x829F -#define GL_COMPUTE_TEXTURE 0x82A0 -#define GL_TEXTURE_SHADOW 0x82A1 -#define GL_TEXTURE_GATHER 0x82A2 -#define GL_TEXTURE_GATHER_SHADOW 0x82A3 -#define GL_SHADER_IMAGE_LOAD 0x82A4 -#define GL_SHADER_IMAGE_STORE 0x82A5 -#define GL_SHADER_IMAGE_ATOMIC 0x82A6 -#define GL_IMAGE_TEXEL_SIZE 0x82A7 -#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 -#define GL_IMAGE_PIXEL_FORMAT 0x82A9 -#define GL_IMAGE_PIXEL_TYPE 0x82AA -#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC -#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD -#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE -#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF -#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 -#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 -#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 -#define GL_CLEAR_BUFFER 0x82B4 -#define GL_TEXTURE_VIEW 0x82B5 -#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 -#define GL_FULL_SUPPORT 0x82B7 -#define GL_CAVEAT_SUPPORT 0x82B8 -#define GL_IMAGE_CLASS_4_X_32 0x82B9 -#define GL_IMAGE_CLASS_2_X_32 0x82BA -#define GL_IMAGE_CLASS_1_X_32 0x82BB -#define GL_IMAGE_CLASS_4_X_16 0x82BC -#define GL_IMAGE_CLASS_2_X_16 0x82BD -#define GL_IMAGE_CLASS_1_X_16 0x82BE -#define GL_IMAGE_CLASS_4_X_8 0x82BF -#define GL_IMAGE_CLASS_2_X_8 0x82C0 -#define GL_IMAGE_CLASS_1_X_8 0x82C1 -#define GL_IMAGE_CLASS_11_11_10 0x82C2 -#define GL_IMAGE_CLASS_10_10_10_2 0x82C3 -#define GL_VIEW_CLASS_128_BITS 0x82C4 -#define GL_VIEW_CLASS_96_BITS 0x82C5 -#define GL_VIEW_CLASS_64_BITS 0x82C6 -#define GL_VIEW_CLASS_48_BITS 0x82C7 -#define GL_VIEW_CLASS_32_BITS 0x82C8 -#define GL_VIEW_CLASS_24_BITS 0x82C9 -#define GL_VIEW_CLASS_16_BITS 0x82CA -#define GL_VIEW_CLASS_8_BITS 0x82CB -#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC -#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD -#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE -#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF -#define GL_VIEW_CLASS_RGTC1_RED 0x82D0 -#define GL_VIEW_CLASS_RGTC2_RG 0x82D1 -#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 -#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 - -typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64* params); - -#define glGetInternalformati64v GLEW_GET_FUN(__glewGetInternalformati64v) - -#define GLEW_ARB_internalformat_query2 GLEW_GET_VAR(__GLEW_ARB_internalformat_query2) - -#endif /* GL_ARB_internalformat_query2 */ - -/* ----------------------- GL_ARB_invalidate_subdata ----------------------- */ - -#ifndef GL_ARB_invalidate_subdata -#define GL_ARB_invalidate_subdata 1 - -typedef void (GLAPIENTRY * PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); -typedef void (GLAPIENTRY * PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments); -typedef void (GLAPIENTRY * PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); - -#define glInvalidateBufferData GLEW_GET_FUN(__glewInvalidateBufferData) -#define glInvalidateBufferSubData GLEW_GET_FUN(__glewInvalidateBufferSubData) -#define glInvalidateFramebuffer GLEW_GET_FUN(__glewInvalidateFramebuffer) -#define glInvalidateSubFramebuffer GLEW_GET_FUN(__glewInvalidateSubFramebuffer) -#define glInvalidateTexImage GLEW_GET_FUN(__glewInvalidateTexImage) -#define glInvalidateTexSubImage GLEW_GET_FUN(__glewInvalidateTexSubImage) - -#define GLEW_ARB_invalidate_subdata GLEW_GET_VAR(__GLEW_ARB_invalidate_subdata) - -#endif /* GL_ARB_invalidate_subdata */ - -/* ---------------------- GL_ARB_map_buffer_alignment ---------------------- */ - -#ifndef GL_ARB_map_buffer_alignment -#define GL_ARB_map_buffer_alignment 1 - -#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC - -#define GLEW_ARB_map_buffer_alignment GLEW_GET_VAR(__GLEW_ARB_map_buffer_alignment) - -#endif /* GL_ARB_map_buffer_alignment */ - -/* ------------------------ GL_ARB_map_buffer_range ------------------------ */ - -#ifndef GL_ARB_map_buffer_range -#define GL_ARB_map_buffer_range 1 - -#define GL_MAP_READ_BIT 0x0001 -#define GL_MAP_WRITE_BIT 0x0002 -#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 -#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 -#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 -#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 - -typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); -typedef void * (GLAPIENTRY * PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); - -#define glFlushMappedBufferRange GLEW_GET_FUN(__glewFlushMappedBufferRange) -#define glMapBufferRange GLEW_GET_FUN(__glewMapBufferRange) - -#define GLEW_ARB_map_buffer_range GLEW_GET_VAR(__GLEW_ARB_map_buffer_range) - -#endif /* GL_ARB_map_buffer_range */ - -/* ------------------------- GL_ARB_matrix_palette ------------------------- */ - -#ifndef GL_ARB_matrix_palette -#define GL_ARB_matrix_palette 1 - -#define GL_MATRIX_PALETTE_ARB 0x8840 -#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 -#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 -#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 -#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 -#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 -#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 -#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 -#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 -#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 - -typedef void (GLAPIENTRY * PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); -typedef void (GLAPIENTRY * PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); -typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUBVARBPROC) (GLint size, GLubyte *indices); -typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUIVARBPROC) (GLint size, GLuint *indices); -typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUSVARBPROC) (GLint size, GLushort *indices); - -#define glCurrentPaletteMatrixARB GLEW_GET_FUN(__glewCurrentPaletteMatrixARB) -#define glMatrixIndexPointerARB GLEW_GET_FUN(__glewMatrixIndexPointerARB) -#define glMatrixIndexubvARB GLEW_GET_FUN(__glewMatrixIndexubvARB) -#define glMatrixIndexuivARB GLEW_GET_FUN(__glewMatrixIndexuivARB) -#define glMatrixIndexusvARB GLEW_GET_FUN(__glewMatrixIndexusvARB) - -#define GLEW_ARB_matrix_palette GLEW_GET_VAR(__GLEW_ARB_matrix_palette) - -#endif /* GL_ARB_matrix_palette */ - -/* --------------------------- GL_ARB_multi_bind --------------------------- */ - -#ifndef GL_ARB_multi_bind -#define GL_ARB_multi_bind 1 - -typedef void (GLAPIENTRY * PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizeiptr *sizes); -typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures); -typedef void (GLAPIENTRY * PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint* samplers); -typedef void (GLAPIENTRY * PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures); -typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizei *strides); - -#define glBindBuffersBase GLEW_GET_FUN(__glewBindBuffersBase) -#define glBindBuffersRange GLEW_GET_FUN(__glewBindBuffersRange) -#define glBindImageTextures GLEW_GET_FUN(__glewBindImageTextures) -#define glBindSamplers GLEW_GET_FUN(__glewBindSamplers) -#define glBindTextures GLEW_GET_FUN(__glewBindTextures) -#define glBindVertexBuffers GLEW_GET_FUN(__glewBindVertexBuffers) - -#define GLEW_ARB_multi_bind GLEW_GET_VAR(__GLEW_ARB_multi_bind) - -#endif /* GL_ARB_multi_bind */ - -/* ----------------------- GL_ARB_multi_draw_indirect ---------------------- */ - -#ifndef GL_ARB_multi_draw_indirect -#define GL_ARB_multi_draw_indirect 1 - -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); - -#define glMultiDrawArraysIndirect GLEW_GET_FUN(__glewMultiDrawArraysIndirect) -#define glMultiDrawElementsIndirect GLEW_GET_FUN(__glewMultiDrawElementsIndirect) - -#define GLEW_ARB_multi_draw_indirect GLEW_GET_VAR(__GLEW_ARB_multi_draw_indirect) - -#endif /* GL_ARB_multi_draw_indirect */ - -/* --------------------------- GL_ARB_multisample -------------------------- */ - -#ifndef GL_ARB_multisample -#define GL_ARB_multisample 1 - -#define GL_MULTISAMPLE_ARB 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F -#define GL_SAMPLE_COVERAGE_ARB 0x80A0 -#define GL_SAMPLE_BUFFERS_ARB 0x80A8 -#define GL_SAMPLES_ARB 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB -#define GL_MULTISAMPLE_BIT_ARB 0x20000000 - -typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); - -#define glSampleCoverageARB GLEW_GET_FUN(__glewSampleCoverageARB) - -#define GLEW_ARB_multisample GLEW_GET_VAR(__GLEW_ARB_multisample) - -#endif /* GL_ARB_multisample */ - -/* -------------------------- GL_ARB_multitexture -------------------------- */ - -#ifndef GL_ARB_multitexture -#define GL_ARB_multitexture 1 - -#define GL_TEXTURE0_ARB 0x84C0 -#define GL_TEXTURE1_ARB 0x84C1 -#define GL_TEXTURE2_ARB 0x84C2 -#define GL_TEXTURE3_ARB 0x84C3 -#define GL_TEXTURE4_ARB 0x84C4 -#define GL_TEXTURE5_ARB 0x84C5 -#define GL_TEXTURE6_ARB 0x84C6 -#define GL_TEXTURE7_ARB 0x84C7 -#define GL_TEXTURE8_ARB 0x84C8 -#define GL_TEXTURE9_ARB 0x84C9 -#define GL_TEXTURE10_ARB 0x84CA -#define GL_TEXTURE11_ARB 0x84CB -#define GL_TEXTURE12_ARB 0x84CC -#define GL_TEXTURE13_ARB 0x84CD -#define GL_TEXTURE14_ARB 0x84CE -#define GL_TEXTURE15_ARB 0x84CF -#define GL_TEXTURE16_ARB 0x84D0 -#define GL_TEXTURE17_ARB 0x84D1 -#define GL_TEXTURE18_ARB 0x84D2 -#define GL_TEXTURE19_ARB 0x84D3 -#define GL_TEXTURE20_ARB 0x84D4 -#define GL_TEXTURE21_ARB 0x84D5 -#define GL_TEXTURE22_ARB 0x84D6 -#define GL_TEXTURE23_ARB 0x84D7 -#define GL_TEXTURE24_ARB 0x84D8 -#define GL_TEXTURE25_ARB 0x84D9 -#define GL_TEXTURE26_ARB 0x84DA -#define GL_TEXTURE27_ARB 0x84DB -#define GL_TEXTURE28_ARB 0x84DC -#define GL_TEXTURE29_ARB 0x84DD -#define GL_TEXTURE30_ARB 0x84DE -#define GL_TEXTURE31_ARB 0x84DF -#define GL_ACTIVE_TEXTURE_ARB 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 -#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 - -typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); - -#define glActiveTextureARB GLEW_GET_FUN(__glewActiveTextureARB) -#define glClientActiveTextureARB GLEW_GET_FUN(__glewClientActiveTextureARB) -#define glMultiTexCoord1dARB GLEW_GET_FUN(__glewMultiTexCoord1dARB) -#define glMultiTexCoord1dvARB GLEW_GET_FUN(__glewMultiTexCoord1dvARB) -#define glMultiTexCoord1fARB GLEW_GET_FUN(__glewMultiTexCoord1fARB) -#define glMultiTexCoord1fvARB GLEW_GET_FUN(__glewMultiTexCoord1fvARB) -#define glMultiTexCoord1iARB GLEW_GET_FUN(__glewMultiTexCoord1iARB) -#define glMultiTexCoord1ivARB GLEW_GET_FUN(__glewMultiTexCoord1ivARB) -#define glMultiTexCoord1sARB GLEW_GET_FUN(__glewMultiTexCoord1sARB) -#define glMultiTexCoord1svARB GLEW_GET_FUN(__glewMultiTexCoord1svARB) -#define glMultiTexCoord2dARB GLEW_GET_FUN(__glewMultiTexCoord2dARB) -#define glMultiTexCoord2dvARB GLEW_GET_FUN(__glewMultiTexCoord2dvARB) -#define glMultiTexCoord2fARB GLEW_GET_FUN(__glewMultiTexCoord2fARB) -#define glMultiTexCoord2fvARB GLEW_GET_FUN(__glewMultiTexCoord2fvARB) -#define glMultiTexCoord2iARB GLEW_GET_FUN(__glewMultiTexCoord2iARB) -#define glMultiTexCoord2ivARB GLEW_GET_FUN(__glewMultiTexCoord2ivARB) -#define glMultiTexCoord2sARB GLEW_GET_FUN(__glewMultiTexCoord2sARB) -#define glMultiTexCoord2svARB GLEW_GET_FUN(__glewMultiTexCoord2svARB) -#define glMultiTexCoord3dARB GLEW_GET_FUN(__glewMultiTexCoord3dARB) -#define glMultiTexCoord3dvARB GLEW_GET_FUN(__glewMultiTexCoord3dvARB) -#define glMultiTexCoord3fARB GLEW_GET_FUN(__glewMultiTexCoord3fARB) -#define glMultiTexCoord3fvARB GLEW_GET_FUN(__glewMultiTexCoord3fvARB) -#define glMultiTexCoord3iARB GLEW_GET_FUN(__glewMultiTexCoord3iARB) -#define glMultiTexCoord3ivARB GLEW_GET_FUN(__glewMultiTexCoord3ivARB) -#define glMultiTexCoord3sARB GLEW_GET_FUN(__glewMultiTexCoord3sARB) -#define glMultiTexCoord3svARB GLEW_GET_FUN(__glewMultiTexCoord3svARB) -#define glMultiTexCoord4dARB GLEW_GET_FUN(__glewMultiTexCoord4dARB) -#define glMultiTexCoord4dvARB GLEW_GET_FUN(__glewMultiTexCoord4dvARB) -#define glMultiTexCoord4fARB GLEW_GET_FUN(__glewMultiTexCoord4fARB) -#define glMultiTexCoord4fvARB GLEW_GET_FUN(__glewMultiTexCoord4fvARB) -#define glMultiTexCoord4iARB GLEW_GET_FUN(__glewMultiTexCoord4iARB) -#define glMultiTexCoord4ivARB GLEW_GET_FUN(__glewMultiTexCoord4ivARB) -#define glMultiTexCoord4sARB GLEW_GET_FUN(__glewMultiTexCoord4sARB) -#define glMultiTexCoord4svARB GLEW_GET_FUN(__glewMultiTexCoord4svARB) - -#define GLEW_ARB_multitexture GLEW_GET_VAR(__GLEW_ARB_multitexture) - -#endif /* GL_ARB_multitexture */ - -/* ------------------------- GL_ARB_occlusion_query ------------------------ */ - -#ifndef GL_ARB_occlusion_query -#define GL_ARB_occlusion_query 1 - -#define GL_QUERY_COUNTER_BITS_ARB 0x8864 -#define GL_CURRENT_QUERY_ARB 0x8865 -#define GL_QUERY_RESULT_ARB 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 -#define GL_SAMPLES_PASSED_ARB 0x8914 - -typedef void (GLAPIENTRY * PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLENDQUERYARBPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISQUERYARBPROC) (GLuint id); - -#define glBeginQueryARB GLEW_GET_FUN(__glewBeginQueryARB) -#define glDeleteQueriesARB GLEW_GET_FUN(__glewDeleteQueriesARB) -#define glEndQueryARB GLEW_GET_FUN(__glewEndQueryARB) -#define glGenQueriesARB GLEW_GET_FUN(__glewGenQueriesARB) -#define glGetQueryObjectivARB GLEW_GET_FUN(__glewGetQueryObjectivARB) -#define glGetQueryObjectuivARB GLEW_GET_FUN(__glewGetQueryObjectuivARB) -#define glGetQueryivARB GLEW_GET_FUN(__glewGetQueryivARB) -#define glIsQueryARB GLEW_GET_FUN(__glewIsQueryARB) - -#define GLEW_ARB_occlusion_query GLEW_GET_VAR(__GLEW_ARB_occlusion_query) - -#endif /* GL_ARB_occlusion_query */ - -/* ------------------------ GL_ARB_occlusion_query2 ------------------------ */ - -#ifndef GL_ARB_occlusion_query2 -#define GL_ARB_occlusion_query2 1 - -#define GL_ANY_SAMPLES_PASSED 0x8C2F - -#define GLEW_ARB_occlusion_query2 GLEW_GET_VAR(__GLEW_ARB_occlusion_query2) - -#endif /* GL_ARB_occlusion_query2 */ - -/* --------------------- GL_ARB_parallel_shader_compile -------------------- */ - -#ifndef GL_ARB_parallel_shader_compile -#define GL_ARB_parallel_shader_compile 1 - -#define GL_MAX_SHADER_COMPILER_THREADS_ARB 0x91B0 -#define GL_COMPLETION_STATUS_ARB 0x91B1 - -typedef void (GLAPIENTRY * PFNGLMAXSHADERCOMPILERTHREADSARBPROC) (GLuint count); - -#define glMaxShaderCompilerThreadsARB GLEW_GET_FUN(__glewMaxShaderCompilerThreadsARB) - -#define GLEW_ARB_parallel_shader_compile GLEW_GET_VAR(__GLEW_ARB_parallel_shader_compile) - -#endif /* GL_ARB_parallel_shader_compile */ - -/* -------------------- GL_ARB_pipeline_statistics_query ------------------- */ - -#ifndef GL_ARB_pipeline_statistics_query -#define GL_ARB_pipeline_statistics_query 1 - -#define GL_VERTICES_SUBMITTED_ARB 0x82EE -#define GL_PRIMITIVES_SUBMITTED_ARB 0x82EF -#define GL_VERTEX_SHADER_INVOCATIONS_ARB 0x82F0 -#define GL_TESS_CONTROL_SHADER_PATCHES_ARB 0x82F1 -#define GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB 0x82F2 -#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB 0x82F3 -#define GL_FRAGMENT_SHADER_INVOCATIONS_ARB 0x82F4 -#define GL_COMPUTE_SHADER_INVOCATIONS_ARB 0x82F5 -#define GL_CLIPPING_INPUT_PRIMITIVES_ARB 0x82F6 -#define GL_CLIPPING_OUTPUT_PRIMITIVES_ARB 0x82F7 -#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F - -#define GLEW_ARB_pipeline_statistics_query GLEW_GET_VAR(__GLEW_ARB_pipeline_statistics_query) - -#endif /* GL_ARB_pipeline_statistics_query */ - -/* ----------------------- GL_ARB_pixel_buffer_object ---------------------- */ - -#ifndef GL_ARB_pixel_buffer_object -#define GL_ARB_pixel_buffer_object 1 - -#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF - -#define GLEW_ARB_pixel_buffer_object GLEW_GET_VAR(__GLEW_ARB_pixel_buffer_object) - -#endif /* GL_ARB_pixel_buffer_object */ - -/* ------------------------ GL_ARB_point_parameters ------------------------ */ - -#ifndef GL_ARB_point_parameters -#define GL_ARB_point_parameters 1 - -#define GL_POINT_SIZE_MIN_ARB 0x8126 -#define GL_POINT_SIZE_MAX_ARB 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 - -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat* params); - -#define glPointParameterfARB GLEW_GET_FUN(__glewPointParameterfARB) -#define glPointParameterfvARB GLEW_GET_FUN(__glewPointParameterfvARB) - -#define GLEW_ARB_point_parameters GLEW_GET_VAR(__GLEW_ARB_point_parameters) - -#endif /* GL_ARB_point_parameters */ - -/* -------------------------- GL_ARB_point_sprite -------------------------- */ - -#ifndef GL_ARB_point_sprite -#define GL_ARB_point_sprite 1 - -#define GL_POINT_SPRITE_ARB 0x8861 -#define GL_COORD_REPLACE_ARB 0x8862 - -#define GLEW_ARB_point_sprite GLEW_GET_VAR(__GLEW_ARB_point_sprite) - -#endif /* GL_ARB_point_sprite */ - -/* ----------------------- GL_ARB_post_depth_coverage ---------------------- */ - -#ifndef GL_ARB_post_depth_coverage -#define GL_ARB_post_depth_coverage 1 - -#define GLEW_ARB_post_depth_coverage GLEW_GET_VAR(__GLEW_ARB_post_depth_coverage) - -#endif /* GL_ARB_post_depth_coverage */ - -/* --------------------- GL_ARB_program_interface_query -------------------- */ - -#ifndef GL_ARB_program_interface_query -#define GL_ARB_program_interface_query 1 - -#define GL_UNIFORM 0x92E1 -#define GL_UNIFORM_BLOCK 0x92E2 -#define GL_PROGRAM_INPUT 0x92E3 -#define GL_PROGRAM_OUTPUT 0x92E4 -#define GL_BUFFER_VARIABLE 0x92E5 -#define GL_SHADER_STORAGE_BLOCK 0x92E6 -#define GL_IS_PER_PATCH 0x92E7 -#define GL_VERTEX_SUBROUTINE 0x92E8 -#define GL_TESS_CONTROL_SUBROUTINE 0x92E9 -#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA -#define GL_GEOMETRY_SUBROUTINE 0x92EB -#define GL_FRAGMENT_SUBROUTINE 0x92EC -#define GL_COMPUTE_SUBROUTINE 0x92ED -#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE -#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF -#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 -#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 -#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 -#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 -#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 -#define GL_ACTIVE_RESOURCES 0x92F5 -#define GL_MAX_NAME_LENGTH 0x92F6 -#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 -#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 -#define GL_NAME_LENGTH 0x92F9 -#define GL_TYPE 0x92FA -#define GL_ARRAY_SIZE 0x92FB -#define GL_OFFSET 0x92FC -#define GL_BLOCK_INDEX 0x92FD -#define GL_ARRAY_STRIDE 0x92FE -#define GL_MATRIX_STRIDE 0x92FF -#define GL_IS_ROW_MAJOR 0x9300 -#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 -#define GL_BUFFER_BINDING 0x9302 -#define GL_BUFFER_DATA_SIZE 0x9303 -#define GL_NUM_ACTIVE_VARIABLES 0x9304 -#define GL_ACTIVE_VARIABLES 0x9305 -#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 -#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 -#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 -#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 -#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A -#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B -#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C -#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D -#define GL_LOCATION 0x930E -#define GL_LOCATION_INDEX 0x930F - -typedef void (GLAPIENTRY * PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint* params); -typedef GLuint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar* name); -typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar* name); -typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei* length, GLchar *name); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei *length, GLint *params); - -#define glGetProgramInterfaceiv GLEW_GET_FUN(__glewGetProgramInterfaceiv) -#define glGetProgramResourceIndex GLEW_GET_FUN(__glewGetProgramResourceIndex) -#define glGetProgramResourceLocation GLEW_GET_FUN(__glewGetProgramResourceLocation) -#define glGetProgramResourceLocationIndex GLEW_GET_FUN(__glewGetProgramResourceLocationIndex) -#define glGetProgramResourceName GLEW_GET_FUN(__glewGetProgramResourceName) -#define glGetProgramResourceiv GLEW_GET_FUN(__glewGetProgramResourceiv) - -#define GLEW_ARB_program_interface_query GLEW_GET_VAR(__GLEW_ARB_program_interface_query) - -#endif /* GL_ARB_program_interface_query */ - -/* ------------------------ GL_ARB_provoking_vertex ------------------------ */ - -#ifndef GL_ARB_provoking_vertex -#define GL_ARB_provoking_vertex 1 - -#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C -#define GL_FIRST_VERTEX_CONVENTION 0x8E4D -#define GL_LAST_VERTEX_CONVENTION 0x8E4E -#define GL_PROVOKING_VERTEX 0x8E4F - -typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXPROC) (GLenum mode); - -#define glProvokingVertex GLEW_GET_FUN(__glewProvokingVertex) - -#define GLEW_ARB_provoking_vertex GLEW_GET_VAR(__GLEW_ARB_provoking_vertex) - -#endif /* GL_ARB_provoking_vertex */ - -/* ----------------------- GL_ARB_query_buffer_object ---------------------- */ - -#ifndef GL_ARB_query_buffer_object -#define GL_ARB_query_buffer_object 1 - -#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 -#define GL_QUERY_BUFFER 0x9192 -#define GL_QUERY_BUFFER_BINDING 0x9193 -#define GL_QUERY_RESULT_NO_WAIT 0x9194 - -#define GLEW_ARB_query_buffer_object GLEW_GET_VAR(__GLEW_ARB_query_buffer_object) - -#endif /* GL_ARB_query_buffer_object */ - -/* ------------------ GL_ARB_robust_buffer_access_behavior ----------------- */ - -#ifndef GL_ARB_robust_buffer_access_behavior -#define GL_ARB_robust_buffer_access_behavior 1 - -#define GLEW_ARB_robust_buffer_access_behavior GLEW_GET_VAR(__GLEW_ARB_robust_buffer_access_behavior) - -#endif /* GL_ARB_robust_buffer_access_behavior */ - -/* --------------------------- GL_ARB_robustness --------------------------- */ - -#ifndef GL_ARB_robustness -#define GL_ARB_robustness 1 - -#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 -#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 -#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 -#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 -#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 -#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 -#define GL_NO_RESET_NOTIFICATION_ARB 0x8261 - -typedef GLenum (GLAPIENTRY * PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); -typedef void (GLAPIENTRY * PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* table); -typedef void (GLAPIENTRY * PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void* img); -typedef void (GLAPIENTRY * PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* image); -typedef void (GLAPIENTRY * PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values); -typedef void (GLAPIENTRY * PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble* v); -typedef void (GLAPIENTRY * PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat* v); -typedef void (GLAPIENTRY * PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint* v); -typedef void (GLAPIENTRY * PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values); -typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat* values); -typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint* values); -typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort* values); -typedef void (GLAPIENTRY * PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte* pattern); -typedef void (GLAPIENTRY * PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void* row, GLsizei columnBufSize, void*column, void*span); -typedef void (GLAPIENTRY * PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* img); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params); -typedef void (GLAPIENTRY * PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data); - -#define glGetGraphicsResetStatusARB GLEW_GET_FUN(__glewGetGraphicsResetStatusARB) -#define glGetnColorTableARB GLEW_GET_FUN(__glewGetnColorTableARB) -#define glGetnCompressedTexImageARB GLEW_GET_FUN(__glewGetnCompressedTexImageARB) -#define glGetnConvolutionFilterARB GLEW_GET_FUN(__glewGetnConvolutionFilterARB) -#define glGetnHistogramARB GLEW_GET_FUN(__glewGetnHistogramARB) -#define glGetnMapdvARB GLEW_GET_FUN(__glewGetnMapdvARB) -#define glGetnMapfvARB GLEW_GET_FUN(__glewGetnMapfvARB) -#define glGetnMapivARB GLEW_GET_FUN(__glewGetnMapivARB) -#define glGetnMinmaxARB GLEW_GET_FUN(__glewGetnMinmaxARB) -#define glGetnPixelMapfvARB GLEW_GET_FUN(__glewGetnPixelMapfvARB) -#define glGetnPixelMapuivARB GLEW_GET_FUN(__glewGetnPixelMapuivARB) -#define glGetnPixelMapusvARB GLEW_GET_FUN(__glewGetnPixelMapusvARB) -#define glGetnPolygonStippleARB GLEW_GET_FUN(__glewGetnPolygonStippleARB) -#define glGetnSeparableFilterARB GLEW_GET_FUN(__glewGetnSeparableFilterARB) -#define glGetnTexImageARB GLEW_GET_FUN(__glewGetnTexImageARB) -#define glGetnUniformdvARB GLEW_GET_FUN(__glewGetnUniformdvARB) -#define glGetnUniformfvARB GLEW_GET_FUN(__glewGetnUniformfvARB) -#define glGetnUniformivARB GLEW_GET_FUN(__glewGetnUniformivARB) -#define glGetnUniformuivARB GLEW_GET_FUN(__glewGetnUniformuivARB) -#define glReadnPixelsARB GLEW_GET_FUN(__glewReadnPixelsARB) - -#define GLEW_ARB_robustness GLEW_GET_VAR(__GLEW_ARB_robustness) - -#endif /* GL_ARB_robustness */ - -/* ---------------- GL_ARB_robustness_application_isolation ---------------- */ - -#ifndef GL_ARB_robustness_application_isolation -#define GL_ARB_robustness_application_isolation 1 - -#define GLEW_ARB_robustness_application_isolation GLEW_GET_VAR(__GLEW_ARB_robustness_application_isolation) - -#endif /* GL_ARB_robustness_application_isolation */ - -/* ---------------- GL_ARB_robustness_share_group_isolation ---------------- */ - -#ifndef GL_ARB_robustness_share_group_isolation -#define GL_ARB_robustness_share_group_isolation 1 - -#define GLEW_ARB_robustness_share_group_isolation GLEW_GET_VAR(__GLEW_ARB_robustness_share_group_isolation) - -#endif /* GL_ARB_robustness_share_group_isolation */ - -/* ------------------------ GL_ARB_sample_locations ------------------------ */ - -#ifndef GL_ARB_sample_locations -#define GL_ARB_sample_locations 1 - -#define GL_SAMPLE_LOCATION_ARB 0x8E50 -#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB 0x933D -#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB 0x933E -#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB 0x933F -#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB 0x9340 -#define GL_PROGRAMMABLE_SAMPLE_LOCATION_ARB 0x9341 -#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB 0x9342 -#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB 0x9343 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); - -#define glFramebufferSampleLocationsfvARB GLEW_GET_FUN(__glewFramebufferSampleLocationsfvARB) -#define glNamedFramebufferSampleLocationsfvARB GLEW_GET_FUN(__glewNamedFramebufferSampleLocationsfvARB) - -#define GLEW_ARB_sample_locations GLEW_GET_VAR(__GLEW_ARB_sample_locations) - -#endif /* GL_ARB_sample_locations */ - -/* ------------------------- GL_ARB_sample_shading ------------------------- */ - -#ifndef GL_ARB_sample_shading -#define GL_ARB_sample_shading 1 - -#define GL_SAMPLE_SHADING_ARB 0x8C36 -#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 - -typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGARBPROC) (GLclampf value); - -#define glMinSampleShadingARB GLEW_GET_FUN(__glewMinSampleShadingARB) - -#define GLEW_ARB_sample_shading GLEW_GET_VAR(__GLEW_ARB_sample_shading) - -#endif /* GL_ARB_sample_shading */ - -/* ------------------------- GL_ARB_sampler_objects ------------------------ */ - -#ifndef GL_ARB_sampler_objects -#define GL_ARB_sampler_objects 1 - -#define GL_SAMPLER_BINDING 0x8919 - -typedef void (GLAPIENTRY * PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); -typedef void (GLAPIENTRY * PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint * samplers); -typedef void (GLAPIENTRY * PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint* samplers); -typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISSAMPLERPROC) (GLuint sampler); -typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint* params); - -#define glBindSampler GLEW_GET_FUN(__glewBindSampler) -#define glDeleteSamplers GLEW_GET_FUN(__glewDeleteSamplers) -#define glGenSamplers GLEW_GET_FUN(__glewGenSamplers) -#define glGetSamplerParameterIiv GLEW_GET_FUN(__glewGetSamplerParameterIiv) -#define glGetSamplerParameterIuiv GLEW_GET_FUN(__glewGetSamplerParameterIuiv) -#define glGetSamplerParameterfv GLEW_GET_FUN(__glewGetSamplerParameterfv) -#define glGetSamplerParameteriv GLEW_GET_FUN(__glewGetSamplerParameteriv) -#define glIsSampler GLEW_GET_FUN(__glewIsSampler) -#define glSamplerParameterIiv GLEW_GET_FUN(__glewSamplerParameterIiv) -#define glSamplerParameterIuiv GLEW_GET_FUN(__glewSamplerParameterIuiv) -#define glSamplerParameterf GLEW_GET_FUN(__glewSamplerParameterf) -#define glSamplerParameterfv GLEW_GET_FUN(__glewSamplerParameterfv) -#define glSamplerParameteri GLEW_GET_FUN(__glewSamplerParameteri) -#define glSamplerParameteriv GLEW_GET_FUN(__glewSamplerParameteriv) - -#define GLEW_ARB_sampler_objects GLEW_GET_VAR(__GLEW_ARB_sampler_objects) - -#endif /* GL_ARB_sampler_objects */ - -/* ------------------------ GL_ARB_seamless_cube_map ----------------------- */ - -#ifndef GL_ARB_seamless_cube_map -#define GL_ARB_seamless_cube_map 1 - -#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F - -#define GLEW_ARB_seamless_cube_map GLEW_GET_VAR(__GLEW_ARB_seamless_cube_map) - -#endif /* GL_ARB_seamless_cube_map */ - -/* ------------------ GL_ARB_seamless_cubemap_per_texture ------------------ */ - -#ifndef GL_ARB_seamless_cubemap_per_texture -#define GL_ARB_seamless_cubemap_per_texture 1 - -#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F - -#define GLEW_ARB_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_ARB_seamless_cubemap_per_texture) - -#endif /* GL_ARB_seamless_cubemap_per_texture */ - -/* --------------------- GL_ARB_separate_shader_objects -------------------- */ - -#ifndef GL_ARB_separate_shader_objects -#define GL_ARB_separate_shader_objects 1 - -#define GL_VERTEX_SHADER_BIT 0x00000001 -#define GL_FRAGMENT_SHADER_BIT 0x00000002 -#define GL_GEOMETRY_SHADER_BIT 0x00000004 -#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 -#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 -#define GL_PROGRAM_SEPARABLE 0x8258 -#define GL_ACTIVE_PROGRAM 0x8259 -#define GL_PROGRAM_PIPELINE_BINDING 0x825A -#define GL_ALL_SHADER_BITS 0xFFFFFFFF - -typedef void (GLAPIENTRY * PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); -typedef void (GLAPIENTRY * PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar * const * strings); -typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint* pipelines); -typedef void (GLAPIENTRY * PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei* length, GLchar *infoLog); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint x, GLint y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint x, GLuint y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); -typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); - -#define glActiveShaderProgram GLEW_GET_FUN(__glewActiveShaderProgram) -#define glBindProgramPipeline GLEW_GET_FUN(__glewBindProgramPipeline) -#define glCreateShaderProgramv GLEW_GET_FUN(__glewCreateShaderProgramv) -#define glDeleteProgramPipelines GLEW_GET_FUN(__glewDeleteProgramPipelines) -#define glGenProgramPipelines GLEW_GET_FUN(__glewGenProgramPipelines) -#define glGetProgramPipelineInfoLog GLEW_GET_FUN(__glewGetProgramPipelineInfoLog) -#define glGetProgramPipelineiv GLEW_GET_FUN(__glewGetProgramPipelineiv) -#define glIsProgramPipeline GLEW_GET_FUN(__glewIsProgramPipeline) -#define glProgramUniform1d GLEW_GET_FUN(__glewProgramUniform1d) -#define glProgramUniform1dv GLEW_GET_FUN(__glewProgramUniform1dv) -#define glProgramUniform1f GLEW_GET_FUN(__glewProgramUniform1f) -#define glProgramUniform1fv GLEW_GET_FUN(__glewProgramUniform1fv) -#define glProgramUniform1i GLEW_GET_FUN(__glewProgramUniform1i) -#define glProgramUniform1iv GLEW_GET_FUN(__glewProgramUniform1iv) -#define glProgramUniform1ui GLEW_GET_FUN(__glewProgramUniform1ui) -#define glProgramUniform1uiv GLEW_GET_FUN(__glewProgramUniform1uiv) -#define glProgramUniform2d GLEW_GET_FUN(__glewProgramUniform2d) -#define glProgramUniform2dv GLEW_GET_FUN(__glewProgramUniform2dv) -#define glProgramUniform2f GLEW_GET_FUN(__glewProgramUniform2f) -#define glProgramUniform2fv GLEW_GET_FUN(__glewProgramUniform2fv) -#define glProgramUniform2i GLEW_GET_FUN(__glewProgramUniform2i) -#define glProgramUniform2iv GLEW_GET_FUN(__glewProgramUniform2iv) -#define glProgramUniform2ui GLEW_GET_FUN(__glewProgramUniform2ui) -#define glProgramUniform2uiv GLEW_GET_FUN(__glewProgramUniform2uiv) -#define glProgramUniform3d GLEW_GET_FUN(__glewProgramUniform3d) -#define glProgramUniform3dv GLEW_GET_FUN(__glewProgramUniform3dv) -#define glProgramUniform3f GLEW_GET_FUN(__glewProgramUniform3f) -#define glProgramUniform3fv GLEW_GET_FUN(__glewProgramUniform3fv) -#define glProgramUniform3i GLEW_GET_FUN(__glewProgramUniform3i) -#define glProgramUniform3iv GLEW_GET_FUN(__glewProgramUniform3iv) -#define glProgramUniform3ui GLEW_GET_FUN(__glewProgramUniform3ui) -#define glProgramUniform3uiv GLEW_GET_FUN(__glewProgramUniform3uiv) -#define glProgramUniform4d GLEW_GET_FUN(__glewProgramUniform4d) -#define glProgramUniform4dv GLEW_GET_FUN(__glewProgramUniform4dv) -#define glProgramUniform4f GLEW_GET_FUN(__glewProgramUniform4f) -#define glProgramUniform4fv GLEW_GET_FUN(__glewProgramUniform4fv) -#define glProgramUniform4i GLEW_GET_FUN(__glewProgramUniform4i) -#define glProgramUniform4iv GLEW_GET_FUN(__glewProgramUniform4iv) -#define glProgramUniform4ui GLEW_GET_FUN(__glewProgramUniform4ui) -#define glProgramUniform4uiv GLEW_GET_FUN(__glewProgramUniform4uiv) -#define glProgramUniformMatrix2dv GLEW_GET_FUN(__glewProgramUniformMatrix2dv) -#define glProgramUniformMatrix2fv GLEW_GET_FUN(__glewProgramUniformMatrix2fv) -#define glProgramUniformMatrix2x3dv GLEW_GET_FUN(__glewProgramUniformMatrix2x3dv) -#define glProgramUniformMatrix2x3fv GLEW_GET_FUN(__glewProgramUniformMatrix2x3fv) -#define glProgramUniformMatrix2x4dv GLEW_GET_FUN(__glewProgramUniformMatrix2x4dv) -#define glProgramUniformMatrix2x4fv GLEW_GET_FUN(__glewProgramUniformMatrix2x4fv) -#define glProgramUniformMatrix3dv GLEW_GET_FUN(__glewProgramUniformMatrix3dv) -#define glProgramUniformMatrix3fv GLEW_GET_FUN(__glewProgramUniformMatrix3fv) -#define glProgramUniformMatrix3x2dv GLEW_GET_FUN(__glewProgramUniformMatrix3x2dv) -#define glProgramUniformMatrix3x2fv GLEW_GET_FUN(__glewProgramUniformMatrix3x2fv) -#define glProgramUniformMatrix3x4dv GLEW_GET_FUN(__glewProgramUniformMatrix3x4dv) -#define glProgramUniformMatrix3x4fv GLEW_GET_FUN(__glewProgramUniformMatrix3x4fv) -#define glProgramUniformMatrix4dv GLEW_GET_FUN(__glewProgramUniformMatrix4dv) -#define glProgramUniformMatrix4fv GLEW_GET_FUN(__glewProgramUniformMatrix4fv) -#define glProgramUniformMatrix4x2dv GLEW_GET_FUN(__glewProgramUniformMatrix4x2dv) -#define glProgramUniformMatrix4x2fv GLEW_GET_FUN(__glewProgramUniformMatrix4x2fv) -#define glProgramUniformMatrix4x3dv GLEW_GET_FUN(__glewProgramUniformMatrix4x3dv) -#define glProgramUniformMatrix4x3fv GLEW_GET_FUN(__glewProgramUniformMatrix4x3fv) -#define glUseProgramStages GLEW_GET_FUN(__glewUseProgramStages) -#define glValidateProgramPipeline GLEW_GET_FUN(__glewValidateProgramPipeline) - -#define GLEW_ARB_separate_shader_objects GLEW_GET_VAR(__GLEW_ARB_separate_shader_objects) - -#endif /* GL_ARB_separate_shader_objects */ - -/* -------------------- GL_ARB_shader_atomic_counter_ops ------------------- */ - -#ifndef GL_ARB_shader_atomic_counter_ops -#define GL_ARB_shader_atomic_counter_ops 1 - -#define GLEW_ARB_shader_atomic_counter_ops GLEW_GET_VAR(__GLEW_ARB_shader_atomic_counter_ops) - -#endif /* GL_ARB_shader_atomic_counter_ops */ - -/* --------------------- GL_ARB_shader_atomic_counters --------------------- */ - -#ifndef GL_ARB_shader_atomic_counters -#define GL_ARB_shader_atomic_counters 1 - -#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 -#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 -#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 -#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 -#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 -#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 -#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB -#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE -#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF -#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 -#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 -#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 -#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 -#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 -#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 -#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 -#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 -#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA -#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB -#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC - -typedef void (GLAPIENTRY * PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint* params); - -#define glGetActiveAtomicCounterBufferiv GLEW_GET_FUN(__glewGetActiveAtomicCounterBufferiv) - -#define GLEW_ARB_shader_atomic_counters GLEW_GET_VAR(__GLEW_ARB_shader_atomic_counters) - -#endif /* GL_ARB_shader_atomic_counters */ - -/* -------------------------- GL_ARB_shader_ballot ------------------------- */ - -#ifndef GL_ARB_shader_ballot -#define GL_ARB_shader_ballot 1 - -#define GLEW_ARB_shader_ballot GLEW_GET_VAR(__GLEW_ARB_shader_ballot) - -#endif /* GL_ARB_shader_ballot */ - -/* ----------------------- GL_ARB_shader_bit_encoding ---------------------- */ - -#ifndef GL_ARB_shader_bit_encoding -#define GL_ARB_shader_bit_encoding 1 - -#define GLEW_ARB_shader_bit_encoding GLEW_GET_VAR(__GLEW_ARB_shader_bit_encoding) - -#endif /* GL_ARB_shader_bit_encoding */ - -/* -------------------------- GL_ARB_shader_clock -------------------------- */ - -#ifndef GL_ARB_shader_clock -#define GL_ARB_shader_clock 1 - -#define GLEW_ARB_shader_clock GLEW_GET_VAR(__GLEW_ARB_shader_clock) - -#endif /* GL_ARB_shader_clock */ - -/* --------------------- GL_ARB_shader_draw_parameters --------------------- */ - -#ifndef GL_ARB_shader_draw_parameters -#define GL_ARB_shader_draw_parameters 1 - -#define GLEW_ARB_shader_draw_parameters GLEW_GET_VAR(__GLEW_ARB_shader_draw_parameters) - -#endif /* GL_ARB_shader_draw_parameters */ - -/* ------------------------ GL_ARB_shader_group_vote ----------------------- */ - -#ifndef GL_ARB_shader_group_vote -#define GL_ARB_shader_group_vote 1 - -#define GLEW_ARB_shader_group_vote GLEW_GET_VAR(__GLEW_ARB_shader_group_vote) - -#endif /* GL_ARB_shader_group_vote */ - -/* --------------------- GL_ARB_shader_image_load_store -------------------- */ - -#ifndef GL_ARB_shader_image_load_store -#define GL_ARB_shader_image_load_store 1 - -#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 -#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 -#define GL_UNIFORM_BARRIER_BIT 0x00000004 -#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 -#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 -#define GL_COMMAND_BARRIER_BIT 0x00000040 -#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 -#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 -#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 -#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 -#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 -#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 -#define GL_MAX_IMAGE_UNITS 0x8F38 -#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 -#define GL_IMAGE_BINDING_NAME 0x8F3A -#define GL_IMAGE_BINDING_LEVEL 0x8F3B -#define GL_IMAGE_BINDING_LAYERED 0x8F3C -#define GL_IMAGE_BINDING_LAYER 0x8F3D -#define GL_IMAGE_BINDING_ACCESS 0x8F3E -#define GL_IMAGE_1D 0x904C -#define GL_IMAGE_2D 0x904D -#define GL_IMAGE_3D 0x904E -#define GL_IMAGE_2D_RECT 0x904F -#define GL_IMAGE_CUBE 0x9050 -#define GL_IMAGE_BUFFER 0x9051 -#define GL_IMAGE_1D_ARRAY 0x9052 -#define GL_IMAGE_2D_ARRAY 0x9053 -#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 -#define GL_IMAGE_2D_MULTISAMPLE 0x9055 -#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 -#define GL_INT_IMAGE_1D 0x9057 -#define GL_INT_IMAGE_2D 0x9058 -#define GL_INT_IMAGE_3D 0x9059 -#define GL_INT_IMAGE_2D_RECT 0x905A -#define GL_INT_IMAGE_CUBE 0x905B -#define GL_INT_IMAGE_BUFFER 0x905C -#define GL_INT_IMAGE_1D_ARRAY 0x905D -#define GL_INT_IMAGE_2D_ARRAY 0x905E -#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F -#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 -#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 -#define GL_UNSIGNED_INT_IMAGE_1D 0x9062 -#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 -#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 -#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 -#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 -#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 -#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 -#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 -#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C -#define GL_MAX_IMAGE_SAMPLES 0x906D -#define GL_IMAGE_BINDING_FORMAT 0x906E -#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 -#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 -#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 -#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA -#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB -#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC -#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD -#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE -#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF -#define GL_ALL_BARRIER_BITS 0xFFFFFFFF - -typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); -typedef void (GLAPIENTRY * PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); - -#define glBindImageTexture GLEW_GET_FUN(__glewBindImageTexture) -#define glMemoryBarrier GLEW_GET_FUN(__glewMemoryBarrier) - -#define GLEW_ARB_shader_image_load_store GLEW_GET_VAR(__GLEW_ARB_shader_image_load_store) - -#endif /* GL_ARB_shader_image_load_store */ - -/* ------------------------ GL_ARB_shader_image_size ----------------------- */ - -#ifndef GL_ARB_shader_image_size -#define GL_ARB_shader_image_size 1 - -#define GLEW_ARB_shader_image_size GLEW_GET_VAR(__GLEW_ARB_shader_image_size) - -#endif /* GL_ARB_shader_image_size */ - -/* ------------------------- GL_ARB_shader_objects ------------------------- */ - -#ifndef GL_ARB_shader_objects -#define GL_ARB_shader_objects 1 - -#define GL_PROGRAM_OBJECT_ARB 0x8B40 -#define GL_SHADER_OBJECT_ARB 0x8B48 -#define GL_OBJECT_TYPE_ARB 0x8B4E -#define GL_OBJECT_SUBTYPE_ARB 0x8B4F -#define GL_FLOAT_VEC2_ARB 0x8B50 -#define GL_FLOAT_VEC3_ARB 0x8B51 -#define GL_FLOAT_VEC4_ARB 0x8B52 -#define GL_INT_VEC2_ARB 0x8B53 -#define GL_INT_VEC3_ARB 0x8B54 -#define GL_INT_VEC4_ARB 0x8B55 -#define GL_BOOL_ARB 0x8B56 -#define GL_BOOL_VEC2_ARB 0x8B57 -#define GL_BOOL_VEC3_ARB 0x8B58 -#define GL_BOOL_VEC4_ARB 0x8B59 -#define GL_FLOAT_MAT2_ARB 0x8B5A -#define GL_FLOAT_MAT3_ARB 0x8B5B -#define GL_FLOAT_MAT4_ARB 0x8B5C -#define GL_SAMPLER_1D_ARB 0x8B5D -#define GL_SAMPLER_2D_ARB 0x8B5E -#define GL_SAMPLER_3D_ARB 0x8B5F -#define GL_SAMPLER_CUBE_ARB 0x8B60 -#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 -#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 -#define GL_SAMPLER_2D_RECT_ARB 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 -#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 -#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 -#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 -#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 -#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 -#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 -#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 -#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 -#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 - -typedef char GLcharARB; -typedef unsigned int GLhandleARB; - -typedef void (GLAPIENTRY * PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); -typedef void (GLAPIENTRY * PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); -typedef GLhandleARB (GLAPIENTRY * PFNGLCREATEPROGRAMOBJECTARBPROC) (void); -typedef GLhandleARB (GLAPIENTRY * PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); -typedef void (GLAPIENTRY * PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); -typedef void (GLAPIENTRY * PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); -typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); -typedef void (GLAPIENTRY * PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei* count, GLhandleARB *obj); -typedef GLhandleARB (GLAPIENTRY * PFNGLGETHANDLEARBPROC) (GLenum pname); -typedef void (GLAPIENTRY * PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *infoLog); -typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *source); -typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint* params); -typedef void (GLAPIENTRY * PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); -typedef void (GLAPIENTRY * PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint *length); -typedef void (GLAPIENTRY * PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); -typedef void (GLAPIENTRY * PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); -typedef void (GLAPIENTRY * PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (GLAPIENTRY * PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); -typedef void (GLAPIENTRY * PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (GLAPIENTRY * PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (GLAPIENTRY * PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (GLAPIENTRY * PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GLAPIENTRY * PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); -typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); - -#define glAttachObjectARB GLEW_GET_FUN(__glewAttachObjectARB) -#define glCompileShaderARB GLEW_GET_FUN(__glewCompileShaderARB) -#define glCreateProgramObjectARB GLEW_GET_FUN(__glewCreateProgramObjectARB) -#define glCreateShaderObjectARB GLEW_GET_FUN(__glewCreateShaderObjectARB) -#define glDeleteObjectARB GLEW_GET_FUN(__glewDeleteObjectARB) -#define glDetachObjectARB GLEW_GET_FUN(__glewDetachObjectARB) -#define glGetActiveUniformARB GLEW_GET_FUN(__glewGetActiveUniformARB) -#define glGetAttachedObjectsARB GLEW_GET_FUN(__glewGetAttachedObjectsARB) -#define glGetHandleARB GLEW_GET_FUN(__glewGetHandleARB) -#define glGetInfoLogARB GLEW_GET_FUN(__glewGetInfoLogARB) -#define glGetObjectParameterfvARB GLEW_GET_FUN(__glewGetObjectParameterfvARB) -#define glGetObjectParameterivARB GLEW_GET_FUN(__glewGetObjectParameterivARB) -#define glGetShaderSourceARB GLEW_GET_FUN(__glewGetShaderSourceARB) -#define glGetUniformLocationARB GLEW_GET_FUN(__glewGetUniformLocationARB) -#define glGetUniformfvARB GLEW_GET_FUN(__glewGetUniformfvARB) -#define glGetUniformivARB GLEW_GET_FUN(__glewGetUniformivARB) -#define glLinkProgramARB GLEW_GET_FUN(__glewLinkProgramARB) -#define glShaderSourceARB GLEW_GET_FUN(__glewShaderSourceARB) -#define glUniform1fARB GLEW_GET_FUN(__glewUniform1fARB) -#define glUniform1fvARB GLEW_GET_FUN(__glewUniform1fvARB) -#define glUniform1iARB GLEW_GET_FUN(__glewUniform1iARB) -#define glUniform1ivARB GLEW_GET_FUN(__glewUniform1ivARB) -#define glUniform2fARB GLEW_GET_FUN(__glewUniform2fARB) -#define glUniform2fvARB GLEW_GET_FUN(__glewUniform2fvARB) -#define glUniform2iARB GLEW_GET_FUN(__glewUniform2iARB) -#define glUniform2ivARB GLEW_GET_FUN(__glewUniform2ivARB) -#define glUniform3fARB GLEW_GET_FUN(__glewUniform3fARB) -#define glUniform3fvARB GLEW_GET_FUN(__glewUniform3fvARB) -#define glUniform3iARB GLEW_GET_FUN(__glewUniform3iARB) -#define glUniform3ivARB GLEW_GET_FUN(__glewUniform3ivARB) -#define glUniform4fARB GLEW_GET_FUN(__glewUniform4fARB) -#define glUniform4fvARB GLEW_GET_FUN(__glewUniform4fvARB) -#define glUniform4iARB GLEW_GET_FUN(__glewUniform4iARB) -#define glUniform4ivARB GLEW_GET_FUN(__glewUniform4ivARB) -#define glUniformMatrix2fvARB GLEW_GET_FUN(__glewUniformMatrix2fvARB) -#define glUniformMatrix3fvARB GLEW_GET_FUN(__glewUniformMatrix3fvARB) -#define glUniformMatrix4fvARB GLEW_GET_FUN(__glewUniformMatrix4fvARB) -#define glUseProgramObjectARB GLEW_GET_FUN(__glewUseProgramObjectARB) -#define glValidateProgramARB GLEW_GET_FUN(__glewValidateProgramARB) - -#define GLEW_ARB_shader_objects GLEW_GET_VAR(__GLEW_ARB_shader_objects) - -#endif /* GL_ARB_shader_objects */ - -/* ------------------------ GL_ARB_shader_precision ------------------------ */ - -#ifndef GL_ARB_shader_precision -#define GL_ARB_shader_precision 1 - -#define GLEW_ARB_shader_precision GLEW_GET_VAR(__GLEW_ARB_shader_precision) - -#endif /* GL_ARB_shader_precision */ - -/* ---------------------- GL_ARB_shader_stencil_export --------------------- */ - -#ifndef GL_ARB_shader_stencil_export -#define GL_ARB_shader_stencil_export 1 - -#define GLEW_ARB_shader_stencil_export GLEW_GET_VAR(__GLEW_ARB_shader_stencil_export) - -#endif /* GL_ARB_shader_stencil_export */ - -/* ------------------ GL_ARB_shader_storage_buffer_object ------------------ */ - -#ifndef GL_ARB_shader_storage_buffer_object -#define GL_ARB_shader_storage_buffer_object 1 - -#define GL_SHADER_STORAGE_BARRIER_BIT 0x2000 -#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 -#define GL_SHADER_STORAGE_BUFFER 0x90D2 -#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 -#define GL_SHADER_STORAGE_BUFFER_START 0x90D4 -#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 -#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 -#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 -#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 -#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 -#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA -#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB -#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC -#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD -#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE -#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF - -typedef void (GLAPIENTRY * PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); - -#define glShaderStorageBlockBinding GLEW_GET_FUN(__glewShaderStorageBlockBinding) - -#define GLEW_ARB_shader_storage_buffer_object GLEW_GET_VAR(__GLEW_ARB_shader_storage_buffer_object) - -#endif /* GL_ARB_shader_storage_buffer_object */ - -/* ------------------------ GL_ARB_shader_subroutine ----------------------- */ - -#ifndef GL_ARB_shader_subroutine -#define GL_ARB_shader_subroutine 1 - -#define GL_ACTIVE_SUBROUTINES 0x8DE5 -#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 -#define GL_MAX_SUBROUTINES 0x8DE7 -#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 -#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 -#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 -#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 -#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A -#define GL_COMPATIBLE_SUBROUTINES 0x8E4B - -typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar *name); -typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar *name); -typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint* values); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint* values); -typedef GLuint (GLAPIENTRY * PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar* name); -typedef GLint (GLAPIENTRY * PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint* params); -typedef void (GLAPIENTRY * PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint* indices); - -#define glGetActiveSubroutineName GLEW_GET_FUN(__glewGetActiveSubroutineName) -#define glGetActiveSubroutineUniformName GLEW_GET_FUN(__glewGetActiveSubroutineUniformName) -#define glGetActiveSubroutineUniformiv GLEW_GET_FUN(__glewGetActiveSubroutineUniformiv) -#define glGetProgramStageiv GLEW_GET_FUN(__glewGetProgramStageiv) -#define glGetSubroutineIndex GLEW_GET_FUN(__glewGetSubroutineIndex) -#define glGetSubroutineUniformLocation GLEW_GET_FUN(__glewGetSubroutineUniformLocation) -#define glGetUniformSubroutineuiv GLEW_GET_FUN(__glewGetUniformSubroutineuiv) -#define glUniformSubroutinesuiv GLEW_GET_FUN(__glewUniformSubroutinesuiv) - -#define GLEW_ARB_shader_subroutine GLEW_GET_VAR(__GLEW_ARB_shader_subroutine) - -#endif /* GL_ARB_shader_subroutine */ - -/* ------------------ GL_ARB_shader_texture_image_samples ------------------ */ - -#ifndef GL_ARB_shader_texture_image_samples -#define GL_ARB_shader_texture_image_samples 1 - -#define GLEW_ARB_shader_texture_image_samples GLEW_GET_VAR(__GLEW_ARB_shader_texture_image_samples) - -#endif /* GL_ARB_shader_texture_image_samples */ - -/* ----------------------- GL_ARB_shader_texture_lod ----------------------- */ - -#ifndef GL_ARB_shader_texture_lod -#define GL_ARB_shader_texture_lod 1 - -#define GLEW_ARB_shader_texture_lod GLEW_GET_VAR(__GLEW_ARB_shader_texture_lod) - -#endif /* GL_ARB_shader_texture_lod */ - -/* ------------------- GL_ARB_shader_viewport_layer_array ------------------ */ - -#ifndef GL_ARB_shader_viewport_layer_array -#define GL_ARB_shader_viewport_layer_array 1 - -#define GLEW_ARB_shader_viewport_layer_array GLEW_GET_VAR(__GLEW_ARB_shader_viewport_layer_array) - -#endif /* GL_ARB_shader_viewport_layer_array */ - -/* ---------------------- GL_ARB_shading_language_100 ---------------------- */ - -#ifndef GL_ARB_shading_language_100 -#define GL_ARB_shading_language_100 1 - -#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C - -#define GLEW_ARB_shading_language_100 GLEW_GET_VAR(__GLEW_ARB_shading_language_100) - -#endif /* GL_ARB_shading_language_100 */ - -/* -------------------- GL_ARB_shading_language_420pack -------------------- */ - -#ifndef GL_ARB_shading_language_420pack -#define GL_ARB_shading_language_420pack 1 - -#define GLEW_ARB_shading_language_420pack GLEW_GET_VAR(__GLEW_ARB_shading_language_420pack) - -#endif /* GL_ARB_shading_language_420pack */ - -/* -------------------- GL_ARB_shading_language_include -------------------- */ - -#ifndef GL_ARB_shading_language_include -#define GL_ARB_shading_language_include 1 - -#define GL_SHADER_INCLUDE_ARB 0x8DAE -#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 -#define GL_NAMED_STRING_TYPE_ARB 0x8DEA - -typedef void (GLAPIENTRY * PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar* const *path, const GLint *length); -typedef void (GLAPIENTRY * PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name, GLsizei bufSize, GLint *stringlen, GLchar *string); -typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar* name, GLenum pname, GLint *params); -typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar* name, GLint stringlen, const GLchar *string); - -#define glCompileShaderIncludeARB GLEW_GET_FUN(__glewCompileShaderIncludeARB) -#define glDeleteNamedStringARB GLEW_GET_FUN(__glewDeleteNamedStringARB) -#define glGetNamedStringARB GLEW_GET_FUN(__glewGetNamedStringARB) -#define glGetNamedStringivARB GLEW_GET_FUN(__glewGetNamedStringivARB) -#define glIsNamedStringARB GLEW_GET_FUN(__glewIsNamedStringARB) -#define glNamedStringARB GLEW_GET_FUN(__glewNamedStringARB) - -#define GLEW_ARB_shading_language_include GLEW_GET_VAR(__GLEW_ARB_shading_language_include) - -#endif /* GL_ARB_shading_language_include */ - -/* -------------------- GL_ARB_shading_language_packing -------------------- */ - -#ifndef GL_ARB_shading_language_packing -#define GL_ARB_shading_language_packing 1 - -#define GLEW_ARB_shading_language_packing GLEW_GET_VAR(__GLEW_ARB_shading_language_packing) - -#endif /* GL_ARB_shading_language_packing */ - -/* ----------------------------- GL_ARB_shadow ----------------------------- */ - -#ifndef GL_ARB_shadow -#define GL_ARB_shadow 1 - -#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C -#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D -#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E - -#define GLEW_ARB_shadow GLEW_GET_VAR(__GLEW_ARB_shadow) - -#endif /* GL_ARB_shadow */ - -/* ------------------------- GL_ARB_shadow_ambient ------------------------- */ - -#ifndef GL_ARB_shadow_ambient -#define GL_ARB_shadow_ambient 1 - -#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF - -#define GLEW_ARB_shadow_ambient GLEW_GET_VAR(__GLEW_ARB_shadow_ambient) - -#endif /* GL_ARB_shadow_ambient */ - -/* -------------------------- GL_ARB_sparse_buffer ------------------------- */ - -#ifndef GL_ARB_sparse_buffer -#define GL_ARB_sparse_buffer 1 - -#define GL_SPARSE_STORAGE_BIT_ARB 0x0400 -#define GL_SPARSE_BUFFER_PAGE_SIZE_ARB 0x82F8 - -typedef void (GLAPIENTRY * PFNGLBUFFERPAGECOMMITMENTARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); - -#define glBufferPageCommitmentARB GLEW_GET_FUN(__glewBufferPageCommitmentARB) - -#define GLEW_ARB_sparse_buffer GLEW_GET_VAR(__GLEW_ARB_sparse_buffer) - -#endif /* GL_ARB_sparse_buffer */ - -/* ------------------------- GL_ARB_sparse_texture ------------------------- */ - -#ifndef GL_ARB_sparse_texture -#define GL_ARB_sparse_texture 1 - -#define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195 -#define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196 -#define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197 -#define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198 -#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199 -#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A -#define GL_TEXTURE_SPARSE_ARB 0x91A6 -#define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 -#define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 -#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9 -#define GL_NUM_SPARSE_LEVELS_ARB 0x91AA - -typedef void (GLAPIENTRY * PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); -typedef void (GLAPIENTRY * PFNGLTEXTUREPAGECOMMITMENTEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); - -#define glTexPageCommitmentARB GLEW_GET_FUN(__glewTexPageCommitmentARB) -#define glTexturePageCommitmentEXT GLEW_GET_FUN(__glewTexturePageCommitmentEXT) - -#define GLEW_ARB_sparse_texture GLEW_GET_VAR(__GLEW_ARB_sparse_texture) - -#endif /* GL_ARB_sparse_texture */ - -/* ------------------------- GL_ARB_sparse_texture2 ------------------------ */ - -#ifndef GL_ARB_sparse_texture2 -#define GL_ARB_sparse_texture2 1 - -#define GLEW_ARB_sparse_texture2 GLEW_GET_VAR(__GLEW_ARB_sparse_texture2) - -#endif /* GL_ARB_sparse_texture2 */ - -/* ---------------------- GL_ARB_sparse_texture_clamp ---------------------- */ - -#ifndef GL_ARB_sparse_texture_clamp -#define GL_ARB_sparse_texture_clamp 1 - -#define GLEW_ARB_sparse_texture_clamp GLEW_GET_VAR(__GLEW_ARB_sparse_texture_clamp) - -#endif /* GL_ARB_sparse_texture_clamp */ - -/* ------------------------ GL_ARB_stencil_texturing ----------------------- */ - -#ifndef GL_ARB_stencil_texturing -#define GL_ARB_stencil_texturing 1 - -#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA - -#define GLEW_ARB_stencil_texturing GLEW_GET_VAR(__GLEW_ARB_stencil_texturing) - -#endif /* GL_ARB_stencil_texturing */ - -/* ------------------------------ GL_ARB_sync ------------------------------ */ - -#ifndef GL_ARB_sync -#define GL_ARB_sync 1 - -#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 -#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 -#define GL_OBJECT_TYPE 0x9112 -#define GL_SYNC_CONDITION 0x9113 -#define GL_SYNC_STATUS 0x9114 -#define GL_SYNC_FLAGS 0x9115 -#define GL_SYNC_FENCE 0x9116 -#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 -#define GL_UNSIGNALED 0x9118 -#define GL_SIGNALED 0x9119 -#define GL_ALREADY_SIGNALED 0x911A -#define GL_TIMEOUT_EXPIRED 0x911B -#define GL_CONDITION_SATISFIED 0x911C -#define GL_WAIT_FAILED 0x911D -#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF - -typedef GLenum (GLAPIENTRY * PFNGLCLIENTWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout); -typedef void (GLAPIENTRY * PFNGLDELETESYNCPROC) (GLsync GLsync); -typedef GLsync (GLAPIENTRY * PFNGLFENCESYNCPROC) (GLenum condition,GLbitfield flags); -typedef void (GLAPIENTRY * PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64* params); -typedef void (GLAPIENTRY * PFNGLGETSYNCIVPROC) (GLsync GLsync,GLenum pname,GLsizei bufSize,GLsizei* length, GLint *values); -typedef GLboolean (GLAPIENTRY * PFNGLISSYNCPROC) (GLsync GLsync); -typedef void (GLAPIENTRY * PFNGLWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout); - -#define glClientWaitSync GLEW_GET_FUN(__glewClientWaitSync) -#define glDeleteSync GLEW_GET_FUN(__glewDeleteSync) -#define glFenceSync GLEW_GET_FUN(__glewFenceSync) -#define glGetInteger64v GLEW_GET_FUN(__glewGetInteger64v) -#define glGetSynciv GLEW_GET_FUN(__glewGetSynciv) -#define glIsSync GLEW_GET_FUN(__glewIsSync) -#define glWaitSync GLEW_GET_FUN(__glewWaitSync) - -#define GLEW_ARB_sync GLEW_GET_VAR(__GLEW_ARB_sync) - -#endif /* GL_ARB_sync */ - -/* ----------------------- GL_ARB_tessellation_shader ---------------------- */ - -#ifndef GL_ARB_tessellation_shader -#define GL_ARB_tessellation_shader 1 - -#define GL_PATCHES 0xE -#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 -#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C -#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D -#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E -#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F -#define GL_PATCH_VERTICES 0x8E72 -#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 -#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 -#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 -#define GL_TESS_GEN_MODE 0x8E76 -#define GL_TESS_GEN_SPACING 0x8E77 -#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 -#define GL_TESS_GEN_POINT_MODE 0x8E79 -#define GL_ISOLINES 0x8E7A -#define GL_FRACTIONAL_ODD 0x8E7B -#define GL_FRACTIONAL_EVEN 0x8E7C -#define GL_MAX_PATCH_VERTICES 0x8E7D -#define GL_MAX_TESS_GEN_LEVEL 0x8E7E -#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F -#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 -#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 -#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 -#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 -#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 -#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 -#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 -#define GL_TESS_EVALUATION_SHADER 0x8E87 -#define GL_TESS_CONTROL_SHADER 0x8E88 -#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 -#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A - -typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat* values); -typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); - -#define glPatchParameterfv GLEW_GET_FUN(__glewPatchParameterfv) -#define glPatchParameteri GLEW_GET_FUN(__glewPatchParameteri) - -#define GLEW_ARB_tessellation_shader GLEW_GET_VAR(__GLEW_ARB_tessellation_shader) - -#endif /* GL_ARB_tessellation_shader */ - -/* ------------------------- GL_ARB_texture_barrier ------------------------ */ - -#ifndef GL_ARB_texture_barrier -#define GL_ARB_texture_barrier 1 - -typedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERPROC) (void); - -#define glTextureBarrier GLEW_GET_FUN(__glewTextureBarrier) - -#define GLEW_ARB_texture_barrier GLEW_GET_VAR(__GLEW_ARB_texture_barrier) - -#endif /* GL_ARB_texture_barrier */ - -/* ---------------------- GL_ARB_texture_border_clamp ---------------------- */ - -#ifndef GL_ARB_texture_border_clamp -#define GL_ARB_texture_border_clamp 1 - -#define GL_CLAMP_TO_BORDER_ARB 0x812D - -#define GLEW_ARB_texture_border_clamp GLEW_GET_VAR(__GLEW_ARB_texture_border_clamp) - -#endif /* GL_ARB_texture_border_clamp */ - -/* ---------------------- GL_ARB_texture_buffer_object --------------------- */ - -#ifndef GL_ARB_texture_buffer_object -#define GL_ARB_texture_buffer_object 1 - -#define GL_TEXTURE_BUFFER_ARB 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E - -typedef void (GLAPIENTRY * PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); - -#define glTexBufferARB GLEW_GET_FUN(__glewTexBufferARB) - -#define GLEW_ARB_texture_buffer_object GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object) - -#endif /* GL_ARB_texture_buffer_object */ - -/* ------------------- GL_ARB_texture_buffer_object_rgb32 ------------------ */ - -#ifndef GL_ARB_texture_buffer_object_rgb32 -#define GL_ARB_texture_buffer_object_rgb32 1 - -#define GLEW_ARB_texture_buffer_object_rgb32 GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object_rgb32) - -#endif /* GL_ARB_texture_buffer_object_rgb32 */ - -/* ---------------------- GL_ARB_texture_buffer_range ---------------------- */ - -#ifndef GL_ARB_texture_buffer_range -#define GL_ARB_texture_buffer_range 1 - -#define GL_TEXTURE_BUFFER_OFFSET 0x919D -#define GL_TEXTURE_BUFFER_SIZE 0x919E -#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F - -typedef void (GLAPIENTRY * PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); - -#define glTexBufferRange GLEW_GET_FUN(__glewTexBufferRange) -#define glTextureBufferRangeEXT GLEW_GET_FUN(__glewTextureBufferRangeEXT) - -#define GLEW_ARB_texture_buffer_range GLEW_GET_VAR(__GLEW_ARB_texture_buffer_range) - -#endif /* GL_ARB_texture_buffer_range */ - -/* ----------------------- GL_ARB_texture_compression ---------------------- */ - -#ifndef GL_ARB_texture_compression -#define GL_ARB_texture_compression 1 - -#define GL_COMPRESSED_ALPHA_ARB 0x84E9 -#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB -#define GL_COMPRESSED_INTENSITY_ARB 0x84EC -#define GL_COMPRESSED_RGB_ARB 0x84ED -#define GL_COMPRESSED_RGBA_ARB 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 -#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 - -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, void *img); - -#define glCompressedTexImage1DARB GLEW_GET_FUN(__glewCompressedTexImage1DARB) -#define glCompressedTexImage2DARB GLEW_GET_FUN(__glewCompressedTexImage2DARB) -#define glCompressedTexImage3DARB GLEW_GET_FUN(__glewCompressedTexImage3DARB) -#define glCompressedTexSubImage1DARB GLEW_GET_FUN(__glewCompressedTexSubImage1DARB) -#define glCompressedTexSubImage2DARB GLEW_GET_FUN(__glewCompressedTexSubImage2DARB) -#define glCompressedTexSubImage3DARB GLEW_GET_FUN(__glewCompressedTexSubImage3DARB) -#define glGetCompressedTexImageARB GLEW_GET_FUN(__glewGetCompressedTexImageARB) - -#define GLEW_ARB_texture_compression GLEW_GET_VAR(__GLEW_ARB_texture_compression) - -#endif /* GL_ARB_texture_compression */ - -/* -------------------- GL_ARB_texture_compression_bptc -------------------- */ - -#ifndef GL_ARB_texture_compression_bptc -#define GL_ARB_texture_compression_bptc 1 - -#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C -#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D -#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E -#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F - -#define GLEW_ARB_texture_compression_bptc GLEW_GET_VAR(__GLEW_ARB_texture_compression_bptc) - -#endif /* GL_ARB_texture_compression_bptc */ - -/* -------------------- GL_ARB_texture_compression_rgtc -------------------- */ - -#ifndef GL_ARB_texture_compression_rgtc -#define GL_ARB_texture_compression_rgtc 1 - -#define GL_COMPRESSED_RED_RGTC1 0x8DBB -#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC -#define GL_COMPRESSED_RG_RGTC2 0x8DBD -#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE - -#define GLEW_ARB_texture_compression_rgtc GLEW_GET_VAR(__GLEW_ARB_texture_compression_rgtc) - -#endif /* GL_ARB_texture_compression_rgtc */ - -/* ------------------------ GL_ARB_texture_cube_map ------------------------ */ - -#ifndef GL_ARB_texture_cube_map -#define GL_ARB_texture_cube_map 1 - -#define GL_NORMAL_MAP_ARB 0x8511 -#define GL_REFLECTION_MAP_ARB 0x8512 -#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C - -#define GLEW_ARB_texture_cube_map GLEW_GET_VAR(__GLEW_ARB_texture_cube_map) - -#endif /* GL_ARB_texture_cube_map */ - -/* --------------------- GL_ARB_texture_cube_map_array --------------------- */ - -#ifndef GL_ARB_texture_cube_map_array -#define GL_ARB_texture_cube_map_array 1 - -#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B -#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F - -#define GLEW_ARB_texture_cube_map_array GLEW_GET_VAR(__GLEW_ARB_texture_cube_map_array) - -#endif /* GL_ARB_texture_cube_map_array */ - -/* ------------------------- GL_ARB_texture_env_add ------------------------ */ - -#ifndef GL_ARB_texture_env_add -#define GL_ARB_texture_env_add 1 - -#define GLEW_ARB_texture_env_add GLEW_GET_VAR(__GLEW_ARB_texture_env_add) - -#endif /* GL_ARB_texture_env_add */ - -/* ----------------------- GL_ARB_texture_env_combine ---------------------- */ - -#ifndef GL_ARB_texture_env_combine -#define GL_ARB_texture_env_combine 1 - -#define GL_SUBTRACT_ARB 0x84E7 -#define GL_COMBINE_ARB 0x8570 -#define GL_COMBINE_RGB_ARB 0x8571 -#define GL_COMBINE_ALPHA_ARB 0x8572 -#define GL_RGB_SCALE_ARB 0x8573 -#define GL_ADD_SIGNED_ARB 0x8574 -#define GL_INTERPOLATE_ARB 0x8575 -#define GL_CONSTANT_ARB 0x8576 -#define GL_PRIMARY_COLOR_ARB 0x8577 -#define GL_PREVIOUS_ARB 0x8578 -#define GL_SOURCE0_RGB_ARB 0x8580 -#define GL_SOURCE1_RGB_ARB 0x8581 -#define GL_SOURCE2_RGB_ARB 0x8582 -#define GL_SOURCE0_ALPHA_ARB 0x8588 -#define GL_SOURCE1_ALPHA_ARB 0x8589 -#define GL_SOURCE2_ALPHA_ARB 0x858A -#define GL_OPERAND0_RGB_ARB 0x8590 -#define GL_OPERAND1_RGB_ARB 0x8591 -#define GL_OPERAND2_RGB_ARB 0x8592 -#define GL_OPERAND0_ALPHA_ARB 0x8598 -#define GL_OPERAND1_ALPHA_ARB 0x8599 -#define GL_OPERAND2_ALPHA_ARB 0x859A - -#define GLEW_ARB_texture_env_combine GLEW_GET_VAR(__GLEW_ARB_texture_env_combine) - -#endif /* GL_ARB_texture_env_combine */ - -/* ---------------------- GL_ARB_texture_env_crossbar ---------------------- */ - -#ifndef GL_ARB_texture_env_crossbar -#define GL_ARB_texture_env_crossbar 1 - -#define GLEW_ARB_texture_env_crossbar GLEW_GET_VAR(__GLEW_ARB_texture_env_crossbar) - -#endif /* GL_ARB_texture_env_crossbar */ - -/* ------------------------ GL_ARB_texture_env_dot3 ------------------------ */ - -#ifndef GL_ARB_texture_env_dot3 -#define GL_ARB_texture_env_dot3 1 - -#define GL_DOT3_RGB_ARB 0x86AE -#define GL_DOT3_RGBA_ARB 0x86AF - -#define GLEW_ARB_texture_env_dot3 GLEW_GET_VAR(__GLEW_ARB_texture_env_dot3) - -#endif /* GL_ARB_texture_env_dot3 */ - -/* ---------------------- GL_ARB_texture_filter_minmax --------------------- */ - -#ifndef GL_ARB_texture_filter_minmax -#define GL_ARB_texture_filter_minmax 1 - -#define GL_TEXTURE_REDUCTION_MODE_ARB 0x9366 -#define GL_WEIGHTED_AVERAGE_ARB 0x9367 - -#define GLEW_ARB_texture_filter_minmax GLEW_GET_VAR(__GLEW_ARB_texture_filter_minmax) - -#endif /* GL_ARB_texture_filter_minmax */ - -/* -------------------------- GL_ARB_texture_float ------------------------- */ - -#ifndef GL_ARB_texture_float -#define GL_ARB_texture_float 1 - -#define GL_RGBA32F_ARB 0x8814 -#define GL_RGB32F_ARB 0x8815 -#define GL_ALPHA32F_ARB 0x8816 -#define GL_INTENSITY32F_ARB 0x8817 -#define GL_LUMINANCE32F_ARB 0x8818 -#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 -#define GL_RGBA16F_ARB 0x881A -#define GL_RGB16F_ARB 0x881B -#define GL_ALPHA16F_ARB 0x881C -#define GL_INTENSITY16F_ARB 0x881D -#define GL_LUMINANCE16F_ARB 0x881E -#define GL_LUMINANCE_ALPHA16F_ARB 0x881F -#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 -#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 -#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 -#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 -#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 -#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 -#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 - -#define GLEW_ARB_texture_float GLEW_GET_VAR(__GLEW_ARB_texture_float) - -#endif /* GL_ARB_texture_float */ - -/* ------------------------- GL_ARB_texture_gather ------------------------- */ - -#ifndef GL_ARB_texture_gather -#define GL_ARB_texture_gather 1 - -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F -#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F - -#define GLEW_ARB_texture_gather GLEW_GET_VAR(__GLEW_ARB_texture_gather) - -#endif /* GL_ARB_texture_gather */ - -/* ------------------ GL_ARB_texture_mirror_clamp_to_edge ------------------ */ - -#ifndef GL_ARB_texture_mirror_clamp_to_edge -#define GL_ARB_texture_mirror_clamp_to_edge 1 - -#define GL_MIRROR_CLAMP_TO_EDGE 0x8743 - -#define GLEW_ARB_texture_mirror_clamp_to_edge GLEW_GET_VAR(__GLEW_ARB_texture_mirror_clamp_to_edge) - -#endif /* GL_ARB_texture_mirror_clamp_to_edge */ - -/* --------------------- GL_ARB_texture_mirrored_repeat -------------------- */ - -#ifndef GL_ARB_texture_mirrored_repeat -#define GL_ARB_texture_mirrored_repeat 1 - -#define GL_MIRRORED_REPEAT_ARB 0x8370 - -#define GLEW_ARB_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_ARB_texture_mirrored_repeat) - -#endif /* GL_ARB_texture_mirrored_repeat */ - -/* ----------------------- GL_ARB_texture_multisample ---------------------- */ - -#ifndef GL_ARB_texture_multisample -#define GL_ARB_texture_multisample 1 - -#define GL_SAMPLE_POSITION 0x8E50 -#define GL_SAMPLE_MASK 0x8E51 -#define GL_SAMPLE_MASK_VALUE 0x8E52 -#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 -#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 -#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 -#define GL_TEXTURE_SAMPLES 0x9106 -#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 -#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 -#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A -#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B -#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D -#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E -#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F -#define GL_MAX_INTEGER_SAMPLES 0x9110 - -typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat* val); -typedef void (GLAPIENTRY * PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask); -typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); - -#define glGetMultisamplefv GLEW_GET_FUN(__glewGetMultisamplefv) -#define glSampleMaski GLEW_GET_FUN(__glewSampleMaski) -#define glTexImage2DMultisample GLEW_GET_FUN(__glewTexImage2DMultisample) -#define glTexImage3DMultisample GLEW_GET_FUN(__glewTexImage3DMultisample) - -#define GLEW_ARB_texture_multisample GLEW_GET_VAR(__GLEW_ARB_texture_multisample) - -#endif /* GL_ARB_texture_multisample */ - -/* -------------------- GL_ARB_texture_non_power_of_two -------------------- */ - -#ifndef GL_ARB_texture_non_power_of_two -#define GL_ARB_texture_non_power_of_two 1 - -#define GLEW_ARB_texture_non_power_of_two GLEW_GET_VAR(__GLEW_ARB_texture_non_power_of_two) - -#endif /* GL_ARB_texture_non_power_of_two */ - -/* ---------------------- GL_ARB_texture_query_levels ---------------------- */ - -#ifndef GL_ARB_texture_query_levels -#define GL_ARB_texture_query_levels 1 - -#define GLEW_ARB_texture_query_levels GLEW_GET_VAR(__GLEW_ARB_texture_query_levels) - -#endif /* GL_ARB_texture_query_levels */ - -/* ------------------------ GL_ARB_texture_query_lod ----------------------- */ - -#ifndef GL_ARB_texture_query_lod -#define GL_ARB_texture_query_lod 1 - -#define GLEW_ARB_texture_query_lod GLEW_GET_VAR(__GLEW_ARB_texture_query_lod) - -#endif /* GL_ARB_texture_query_lod */ - -/* ------------------------ GL_ARB_texture_rectangle ----------------------- */ - -#ifndef GL_ARB_texture_rectangle -#define GL_ARB_texture_rectangle 1 - -#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 -#define GL_SAMPLER_2D_RECT_ARB 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 - -#define GLEW_ARB_texture_rectangle GLEW_GET_VAR(__GLEW_ARB_texture_rectangle) - -#endif /* GL_ARB_texture_rectangle */ - -/* --------------------------- GL_ARB_texture_rg --------------------------- */ - -#ifndef GL_ARB_texture_rg -#define GL_ARB_texture_rg 1 - -#define GL_COMPRESSED_RED 0x8225 -#define GL_COMPRESSED_RG 0x8226 -#define GL_RG 0x8227 -#define GL_RG_INTEGER 0x8228 -#define GL_R8 0x8229 -#define GL_R16 0x822A -#define GL_RG8 0x822B -#define GL_RG16 0x822C -#define GL_R16F 0x822D -#define GL_R32F 0x822E -#define GL_RG16F 0x822F -#define GL_RG32F 0x8230 -#define GL_R8I 0x8231 -#define GL_R8UI 0x8232 -#define GL_R16I 0x8233 -#define GL_R16UI 0x8234 -#define GL_R32I 0x8235 -#define GL_R32UI 0x8236 -#define GL_RG8I 0x8237 -#define GL_RG8UI 0x8238 -#define GL_RG16I 0x8239 -#define GL_RG16UI 0x823A -#define GL_RG32I 0x823B -#define GL_RG32UI 0x823C - -#define GLEW_ARB_texture_rg GLEW_GET_VAR(__GLEW_ARB_texture_rg) - -#endif /* GL_ARB_texture_rg */ - -/* ----------------------- GL_ARB_texture_rgb10_a2ui ----------------------- */ - -#ifndef GL_ARB_texture_rgb10_a2ui -#define GL_ARB_texture_rgb10_a2ui 1 - -#define GL_RGB10_A2UI 0x906F - -#define GLEW_ARB_texture_rgb10_a2ui GLEW_GET_VAR(__GLEW_ARB_texture_rgb10_a2ui) - -#endif /* GL_ARB_texture_rgb10_a2ui */ - -/* ------------------------ GL_ARB_texture_stencil8 ------------------------ */ - -#ifndef GL_ARB_texture_stencil8 -#define GL_ARB_texture_stencil8 1 - -#define GL_STENCIL_INDEX 0x1901 -#define GL_STENCIL_INDEX8 0x8D48 - -#define GLEW_ARB_texture_stencil8 GLEW_GET_VAR(__GLEW_ARB_texture_stencil8) - -#endif /* GL_ARB_texture_stencil8 */ - -/* ------------------------- GL_ARB_texture_storage ------------------------ */ - -#ifndef GL_ARB_texture_storage -#define GL_ARB_texture_storage 1 - -#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F - -typedef void (GLAPIENTRY * PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); - -#define glTexStorage1D GLEW_GET_FUN(__glewTexStorage1D) -#define glTexStorage2D GLEW_GET_FUN(__glewTexStorage2D) -#define glTexStorage3D GLEW_GET_FUN(__glewTexStorage3D) -#define glTextureStorage1DEXT GLEW_GET_FUN(__glewTextureStorage1DEXT) -#define glTextureStorage2DEXT GLEW_GET_FUN(__glewTextureStorage2DEXT) -#define glTextureStorage3DEXT GLEW_GET_FUN(__glewTextureStorage3DEXT) - -#define GLEW_ARB_texture_storage GLEW_GET_VAR(__GLEW_ARB_texture_storage) - -#endif /* GL_ARB_texture_storage */ - -/* ------------------- GL_ARB_texture_storage_multisample ------------------ */ - -#ifndef GL_ARB_texture_storage_multisample -#define GL_ARB_texture_storage_multisample 1 - -typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); - -#define glTexStorage2DMultisample GLEW_GET_FUN(__glewTexStorage2DMultisample) -#define glTexStorage3DMultisample GLEW_GET_FUN(__glewTexStorage3DMultisample) -#define glTextureStorage2DMultisampleEXT GLEW_GET_FUN(__glewTextureStorage2DMultisampleEXT) -#define glTextureStorage3DMultisampleEXT GLEW_GET_FUN(__glewTextureStorage3DMultisampleEXT) - -#define GLEW_ARB_texture_storage_multisample GLEW_GET_VAR(__GLEW_ARB_texture_storage_multisample) - -#endif /* GL_ARB_texture_storage_multisample */ - -/* ------------------------- GL_ARB_texture_swizzle ------------------------ */ - -#ifndef GL_ARB_texture_swizzle -#define GL_ARB_texture_swizzle 1 - -#define GL_TEXTURE_SWIZZLE_R 0x8E42 -#define GL_TEXTURE_SWIZZLE_G 0x8E43 -#define GL_TEXTURE_SWIZZLE_B 0x8E44 -#define GL_TEXTURE_SWIZZLE_A 0x8E45 -#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 - -#define GLEW_ARB_texture_swizzle GLEW_GET_VAR(__GLEW_ARB_texture_swizzle) - -#endif /* GL_ARB_texture_swizzle */ - -/* -------------------------- GL_ARB_texture_view -------------------------- */ - -#ifndef GL_ARB_texture_view -#define GL_ARB_texture_view 1 - -#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB -#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC -#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD -#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE -#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF - -typedef void (GLAPIENTRY * PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); - -#define glTextureView GLEW_GET_FUN(__glewTextureView) - -#define GLEW_ARB_texture_view GLEW_GET_VAR(__GLEW_ARB_texture_view) - -#endif /* GL_ARB_texture_view */ - -/* --------------------------- GL_ARB_timer_query -------------------------- */ - -#ifndef GL_ARB_timer_query -#define GL_ARB_timer_query 1 - -#define GL_TIME_ELAPSED 0x88BF -#define GL_TIMESTAMP 0x8E28 - -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64* params); -typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); - -#define glGetQueryObjecti64v GLEW_GET_FUN(__glewGetQueryObjecti64v) -#define glGetQueryObjectui64v GLEW_GET_FUN(__glewGetQueryObjectui64v) -#define glQueryCounter GLEW_GET_FUN(__glewQueryCounter) - -#define GLEW_ARB_timer_query GLEW_GET_VAR(__GLEW_ARB_timer_query) - -#endif /* GL_ARB_timer_query */ - -/* ----------------------- GL_ARB_transform_feedback2 ---------------------- */ - -#ifndef GL_ARB_transform_feedback2 -#define GL_ARB_transform_feedback2 1 - -#define GL_TRANSFORM_FEEDBACK 0x8E22 -#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 -#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 -#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 - -typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); -typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids); -typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); -typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); - -#define glBindTransformFeedback GLEW_GET_FUN(__glewBindTransformFeedback) -#define glDeleteTransformFeedbacks GLEW_GET_FUN(__glewDeleteTransformFeedbacks) -#define glDrawTransformFeedback GLEW_GET_FUN(__glewDrawTransformFeedback) -#define glGenTransformFeedbacks GLEW_GET_FUN(__glewGenTransformFeedbacks) -#define glIsTransformFeedback GLEW_GET_FUN(__glewIsTransformFeedback) -#define glPauseTransformFeedback GLEW_GET_FUN(__glewPauseTransformFeedback) -#define glResumeTransformFeedback GLEW_GET_FUN(__glewResumeTransformFeedback) - -#define GLEW_ARB_transform_feedback2 GLEW_GET_VAR(__GLEW_ARB_transform_feedback2) - -#endif /* GL_ARB_transform_feedback2 */ - -/* ----------------------- GL_ARB_transform_feedback3 ---------------------- */ - -#ifndef GL_ARB_transform_feedback3 -#define GL_ARB_transform_feedback3 1 - -#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 -#define GL_MAX_VERTEX_STREAMS 0x8E71 - -typedef void (GLAPIENTRY * PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); -typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); -typedef void (GLAPIENTRY * PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); -typedef void (GLAPIENTRY * PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); - -#define glBeginQueryIndexed GLEW_GET_FUN(__glewBeginQueryIndexed) -#define glDrawTransformFeedbackStream GLEW_GET_FUN(__glewDrawTransformFeedbackStream) -#define glEndQueryIndexed GLEW_GET_FUN(__glewEndQueryIndexed) -#define glGetQueryIndexediv GLEW_GET_FUN(__glewGetQueryIndexediv) - -#define GLEW_ARB_transform_feedback3 GLEW_GET_VAR(__GLEW_ARB_transform_feedback3) - -#endif /* GL_ARB_transform_feedback3 */ - -/* ------------------ GL_ARB_transform_feedback_instanced ------------------ */ - -#ifndef GL_ARB_transform_feedback_instanced -#define GL_ARB_transform_feedback_instanced 1 - -typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei primcount); - -#define glDrawTransformFeedbackInstanced GLEW_GET_FUN(__glewDrawTransformFeedbackInstanced) -#define glDrawTransformFeedbackStreamInstanced GLEW_GET_FUN(__glewDrawTransformFeedbackStreamInstanced) - -#define GLEW_ARB_transform_feedback_instanced GLEW_GET_VAR(__GLEW_ARB_transform_feedback_instanced) - -#endif /* GL_ARB_transform_feedback_instanced */ - -/* ---------------- GL_ARB_transform_feedback_overflow_query --------------- */ - -#ifndef GL_ARB_transform_feedback_overflow_query -#define GL_ARB_transform_feedback_overflow_query 1 - -#define GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB 0x82EC -#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB 0x82ED - -#define GLEW_ARB_transform_feedback_overflow_query GLEW_GET_VAR(__GLEW_ARB_transform_feedback_overflow_query) - -#endif /* GL_ARB_transform_feedback_overflow_query */ - -/* ------------------------ GL_ARB_transpose_matrix ------------------------ */ - -#ifndef GL_ARB_transpose_matrix -#define GL_ARB_transpose_matrix 1 - -#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 - -typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); -typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); -typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); -typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); - -#define glLoadTransposeMatrixdARB GLEW_GET_FUN(__glewLoadTransposeMatrixdARB) -#define glLoadTransposeMatrixfARB GLEW_GET_FUN(__glewLoadTransposeMatrixfARB) -#define glMultTransposeMatrixdARB GLEW_GET_FUN(__glewMultTransposeMatrixdARB) -#define glMultTransposeMatrixfARB GLEW_GET_FUN(__glewMultTransposeMatrixfARB) - -#define GLEW_ARB_transpose_matrix GLEW_GET_VAR(__GLEW_ARB_transpose_matrix) - -#endif /* GL_ARB_transpose_matrix */ - -/* ---------------------- GL_ARB_uniform_buffer_object --------------------- */ - -#ifndef GL_ARB_uniform_buffer_object -#define GL_ARB_uniform_buffer_object 1 - -#define GL_UNIFORM_BUFFER 0x8A11 -#define GL_UNIFORM_BUFFER_BINDING 0x8A28 -#define GL_UNIFORM_BUFFER_START 0x8A29 -#define GL_UNIFORM_BUFFER_SIZE 0x8A2A -#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B -#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C -#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D -#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E -#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F -#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 -#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 -#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 -#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 -#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 -#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 -#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 -#define GL_UNIFORM_TYPE 0x8A37 -#define GL_UNIFORM_SIZE 0x8A38 -#define GL_UNIFORM_NAME_LENGTH 0x8A39 -#define GL_UNIFORM_BLOCK_INDEX 0x8A3A -#define GL_UNIFORM_OFFSET 0x8A3B -#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C -#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D -#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E -#define GL_UNIFORM_BLOCK_BINDING 0x8A3F -#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 -#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 -#define GL_INVALID_INDEX 0xFFFFFFFF - -typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName); -typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformName); -typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint* data); -typedef GLuint (GLAPIENTRY * PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar* uniformBlockName); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar* const * uniformNames, GLuint* uniformIndices); -typedef void (GLAPIENTRY * PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); - -#define glBindBufferBase GLEW_GET_FUN(__glewBindBufferBase) -#define glBindBufferRange GLEW_GET_FUN(__glewBindBufferRange) -#define glGetActiveUniformBlockName GLEW_GET_FUN(__glewGetActiveUniformBlockName) -#define glGetActiveUniformBlockiv GLEW_GET_FUN(__glewGetActiveUniformBlockiv) -#define glGetActiveUniformName GLEW_GET_FUN(__glewGetActiveUniformName) -#define glGetActiveUniformsiv GLEW_GET_FUN(__glewGetActiveUniformsiv) -#define glGetIntegeri_v GLEW_GET_FUN(__glewGetIntegeri_v) -#define glGetUniformBlockIndex GLEW_GET_FUN(__glewGetUniformBlockIndex) -#define glGetUniformIndices GLEW_GET_FUN(__glewGetUniformIndices) -#define glUniformBlockBinding GLEW_GET_FUN(__glewUniformBlockBinding) - -#define GLEW_ARB_uniform_buffer_object GLEW_GET_VAR(__GLEW_ARB_uniform_buffer_object) - -#endif /* GL_ARB_uniform_buffer_object */ - -/* ------------------------ GL_ARB_vertex_array_bgra ----------------------- */ - -#ifndef GL_ARB_vertex_array_bgra -#define GL_ARB_vertex_array_bgra 1 - -#define GL_BGRA 0x80E1 - -#define GLEW_ARB_vertex_array_bgra GLEW_GET_VAR(__GLEW_ARB_vertex_array_bgra) - -#endif /* GL_ARB_vertex_array_bgra */ - -/* ----------------------- GL_ARB_vertex_array_object ---------------------- */ - -#ifndef GL_ARB_vertex_array_object -#define GL_ARB_vertex_array_object 1 - -#define GL_VERTEX_ARRAY_BINDING 0x85B5 - -typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYPROC) (GLuint array); -typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint* arrays); -typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays); -typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYPROC) (GLuint array); - -#define glBindVertexArray GLEW_GET_FUN(__glewBindVertexArray) -#define glDeleteVertexArrays GLEW_GET_FUN(__glewDeleteVertexArrays) -#define glGenVertexArrays GLEW_GET_FUN(__glewGenVertexArrays) -#define glIsVertexArray GLEW_GET_FUN(__glewIsVertexArray) - -#define GLEW_ARB_vertex_array_object GLEW_GET_VAR(__GLEW_ARB_vertex_array_object) - -#endif /* GL_ARB_vertex_array_object */ - -/* ----------------------- GL_ARB_vertex_attrib_64bit ---------------------- */ - -#ifndef GL_ARB_vertex_attrib_64bit -#define GL_ARB_vertex_attrib_64bit 1 - -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer); - -#define glGetVertexAttribLdv GLEW_GET_FUN(__glewGetVertexAttribLdv) -#define glVertexAttribL1d GLEW_GET_FUN(__glewVertexAttribL1d) -#define glVertexAttribL1dv GLEW_GET_FUN(__glewVertexAttribL1dv) -#define glVertexAttribL2d GLEW_GET_FUN(__glewVertexAttribL2d) -#define glVertexAttribL2dv GLEW_GET_FUN(__glewVertexAttribL2dv) -#define glVertexAttribL3d GLEW_GET_FUN(__glewVertexAttribL3d) -#define glVertexAttribL3dv GLEW_GET_FUN(__glewVertexAttribL3dv) -#define glVertexAttribL4d GLEW_GET_FUN(__glewVertexAttribL4d) -#define glVertexAttribL4dv GLEW_GET_FUN(__glewVertexAttribL4dv) -#define glVertexAttribLPointer GLEW_GET_FUN(__glewVertexAttribLPointer) - -#define GLEW_ARB_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_64bit) - -#endif /* GL_ARB_vertex_attrib_64bit */ - -/* ---------------------- GL_ARB_vertex_attrib_binding --------------------- */ - -#ifndef GL_ARB_vertex_attrib_binding -#define GL_ARB_vertex_attrib_binding 1 - -#define GL_VERTEX_ATTRIB_BINDING 0x82D4 -#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 -#define GL_VERTEX_BINDING_DIVISOR 0x82D6 -#define GL_VERTEX_BINDING_OFFSET 0x82D7 -#define GL_VERTEX_BINDING_STRIDE 0x82D8 -#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 -#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA -#define GL_VERTEX_BINDING_BUFFER 0x8F4F - -typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); - -#define glBindVertexBuffer GLEW_GET_FUN(__glewBindVertexBuffer) -#define glVertexArrayBindVertexBufferEXT GLEW_GET_FUN(__glewVertexArrayBindVertexBufferEXT) -#define glVertexArrayVertexAttribBindingEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribBindingEXT) -#define glVertexArrayVertexAttribFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribFormatEXT) -#define glVertexArrayVertexAttribIFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIFormatEXT) -#define glVertexArrayVertexAttribLFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLFormatEXT) -#define glVertexArrayVertexBindingDivisorEXT GLEW_GET_FUN(__glewVertexArrayVertexBindingDivisorEXT) -#define glVertexAttribBinding GLEW_GET_FUN(__glewVertexAttribBinding) -#define glVertexAttribFormat GLEW_GET_FUN(__glewVertexAttribFormat) -#define glVertexAttribIFormat GLEW_GET_FUN(__glewVertexAttribIFormat) -#define glVertexAttribLFormat GLEW_GET_FUN(__glewVertexAttribLFormat) -#define glVertexBindingDivisor GLEW_GET_FUN(__glewVertexBindingDivisor) - -#define GLEW_ARB_vertex_attrib_binding GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_binding) - -#endif /* GL_ARB_vertex_attrib_binding */ - -/* -------------------------- GL_ARB_vertex_blend -------------------------- */ - -#ifndef GL_ARB_vertex_blend -#define GL_ARB_vertex_blend 1 - -#define GL_MODELVIEW0_ARB 0x1700 -#define GL_MODELVIEW1_ARB 0x850A -#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 -#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 -#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 -#define GL_VERTEX_BLEND_ARB 0x86A7 -#define GL_CURRENT_WEIGHT_ARB 0x86A8 -#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 -#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA -#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB -#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC -#define GL_WEIGHT_ARRAY_ARB 0x86AD -#define GL_MODELVIEW2_ARB 0x8722 -#define GL_MODELVIEW3_ARB 0x8723 -#define GL_MODELVIEW4_ARB 0x8724 -#define GL_MODELVIEW5_ARB 0x8725 -#define GL_MODELVIEW6_ARB 0x8726 -#define GL_MODELVIEW7_ARB 0x8727 -#define GL_MODELVIEW8_ARB 0x8728 -#define GL_MODELVIEW9_ARB 0x8729 -#define GL_MODELVIEW10_ARB 0x872A -#define GL_MODELVIEW11_ARB 0x872B -#define GL_MODELVIEW12_ARB 0x872C -#define GL_MODELVIEW13_ARB 0x872D -#define GL_MODELVIEW14_ARB 0x872E -#define GL_MODELVIEW15_ARB 0x872F -#define GL_MODELVIEW16_ARB 0x8730 -#define GL_MODELVIEW17_ARB 0x8731 -#define GL_MODELVIEW18_ARB 0x8732 -#define GL_MODELVIEW19_ARB 0x8733 -#define GL_MODELVIEW20_ARB 0x8734 -#define GL_MODELVIEW21_ARB 0x8735 -#define GL_MODELVIEW22_ARB 0x8736 -#define GL_MODELVIEW23_ARB 0x8737 -#define GL_MODELVIEW24_ARB 0x8738 -#define GL_MODELVIEW25_ARB 0x8739 -#define GL_MODELVIEW26_ARB 0x873A -#define GL_MODELVIEW27_ARB 0x873B -#define GL_MODELVIEW28_ARB 0x873C -#define GL_MODELVIEW29_ARB 0x873D -#define GL_MODELVIEW30_ARB 0x873E -#define GL_MODELVIEW31_ARB 0x873F - -typedef void (GLAPIENTRY * PFNGLVERTEXBLENDARBPROC) (GLint count); -typedef void (GLAPIENTRY * PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); -typedef void (GLAPIENTRY * PFNGLWEIGHTBVARBPROC) (GLint size, GLbyte *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTDVARBPROC) (GLint size, GLdouble *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTFVARBPROC) (GLint size, GLfloat *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTIVARBPROC) (GLint size, GLint *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTSVARBPROC) (GLint size, GLshort *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTUBVARBPROC) (GLint size, GLubyte *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTUIVARBPROC) (GLint size, GLuint *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTUSVARBPROC) (GLint size, GLushort *weights); - -#define glVertexBlendARB GLEW_GET_FUN(__glewVertexBlendARB) -#define glWeightPointerARB GLEW_GET_FUN(__glewWeightPointerARB) -#define glWeightbvARB GLEW_GET_FUN(__glewWeightbvARB) -#define glWeightdvARB GLEW_GET_FUN(__glewWeightdvARB) -#define glWeightfvARB GLEW_GET_FUN(__glewWeightfvARB) -#define glWeightivARB GLEW_GET_FUN(__glewWeightivARB) -#define glWeightsvARB GLEW_GET_FUN(__glewWeightsvARB) -#define glWeightubvARB GLEW_GET_FUN(__glewWeightubvARB) -#define glWeightuivARB GLEW_GET_FUN(__glewWeightuivARB) -#define glWeightusvARB GLEW_GET_FUN(__glewWeightusvARB) - -#define GLEW_ARB_vertex_blend GLEW_GET_VAR(__GLEW_ARB_vertex_blend) - -#endif /* GL_ARB_vertex_blend */ - -/* ---------------------- GL_ARB_vertex_buffer_object ---------------------- */ - -#ifndef GL_ARB_vertex_buffer_object -#define GL_ARB_vertex_buffer_object 1 - -#define GL_BUFFER_SIZE_ARB 0x8764 -#define GL_BUFFER_USAGE_ARB 0x8765 -#define GL_ARRAY_BUFFER_ARB 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 -#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F -#define GL_READ_ONLY_ARB 0x88B8 -#define GL_WRITE_ONLY_ARB 0x88B9 -#define GL_READ_WRITE_ARB 0x88BA -#define GL_BUFFER_ACCESS_ARB 0x88BB -#define GL_BUFFER_MAPPED_ARB 0x88BC -#define GL_BUFFER_MAP_POINTER_ARB 0x88BD -#define GL_STREAM_DRAW_ARB 0x88E0 -#define GL_STREAM_READ_ARB 0x88E1 -#define GL_STREAM_COPY_ARB 0x88E2 -#define GL_STATIC_DRAW_ARB 0x88E4 -#define GL_STATIC_READ_ARB 0x88E5 -#define GL_STATIC_COPY_ARB 0x88E6 -#define GL_DYNAMIC_DRAW_ARB 0x88E8 -#define GL_DYNAMIC_READ_ARB 0x88E9 -#define GL_DYNAMIC_COPY_ARB 0x88EA - -typedef ptrdiff_t GLintptrARB; -typedef ptrdiff_t GLsizeiptrARB; - -typedef void (GLAPIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); -typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); -typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint* buffers); -typedef void (GLAPIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint* buffers); -typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, void** params); -typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); -typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERARBPROC) (GLuint buffer); -typedef void * (GLAPIENTRY * PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); -typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERARBPROC) (GLenum target); - -#define glBindBufferARB GLEW_GET_FUN(__glewBindBufferARB) -#define glBufferDataARB GLEW_GET_FUN(__glewBufferDataARB) -#define glBufferSubDataARB GLEW_GET_FUN(__glewBufferSubDataARB) -#define glDeleteBuffersARB GLEW_GET_FUN(__glewDeleteBuffersARB) -#define glGenBuffersARB GLEW_GET_FUN(__glewGenBuffersARB) -#define glGetBufferParameterivARB GLEW_GET_FUN(__glewGetBufferParameterivARB) -#define glGetBufferPointervARB GLEW_GET_FUN(__glewGetBufferPointervARB) -#define glGetBufferSubDataARB GLEW_GET_FUN(__glewGetBufferSubDataARB) -#define glIsBufferARB GLEW_GET_FUN(__glewIsBufferARB) -#define glMapBufferARB GLEW_GET_FUN(__glewMapBufferARB) -#define glUnmapBufferARB GLEW_GET_FUN(__glewUnmapBufferARB) - -#define GLEW_ARB_vertex_buffer_object GLEW_GET_VAR(__GLEW_ARB_vertex_buffer_object) - -#endif /* GL_ARB_vertex_buffer_object */ - -/* ------------------------- GL_ARB_vertex_program ------------------------- */ - -#ifndef GL_ARB_vertex_program -#define GL_ARB_vertex_program 1 - -#define GL_COLOR_SUM_ARB 0x8458 -#define GL_VERTEX_PROGRAM_ARB 0x8620 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 -#define GL_PROGRAM_LENGTH_ARB 0x8627 -#define GL_PROGRAM_STRING_ARB 0x8628 -#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E -#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F -#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 -#define GL_CURRENT_MATRIX_ARB 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 -#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B -#define GL_PROGRAM_BINDING_ARB 0x8677 -#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A -#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 -#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 -#define GL_PROGRAM_FORMAT_ARB 0x8876 -#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 -#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 -#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 -#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 -#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 -#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 -#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 -#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 -#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 -#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 -#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA -#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB -#define GL_PROGRAM_ATTRIBS_ARB 0x88AC -#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD -#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE -#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF -#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 -#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 -#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 -#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 -#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 -#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 -#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 -#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 -#define GL_MATRIX0_ARB 0x88C0 -#define GL_MATRIX1_ARB 0x88C1 -#define GL_MATRIX2_ARB 0x88C2 -#define GL_MATRIX3_ARB 0x88C3 -#define GL_MATRIX4_ARB 0x88C4 -#define GL_MATRIX5_ARB 0x88C5 -#define GL_MATRIX6_ARB 0x88C6 -#define GL_MATRIX7_ARB 0x88C7 -#define GL_MATRIX8_ARB 0x88C8 -#define GL_MATRIX9_ARB 0x88C9 -#define GL_MATRIX10_ARB 0x88CA -#define GL_MATRIX11_ARB 0x88CB -#define GL_MATRIX12_ARB 0x88CC -#define GL_MATRIX13_ARB 0x88CD -#define GL_MATRIX14_ARB 0x88CE -#define GL_MATRIX15_ARB 0x88CF -#define GL_MATRIX16_ARB 0x88D0 -#define GL_MATRIX17_ARB 0x88D1 -#define GL_MATRIX18_ARB 0x88D2 -#define GL_MATRIX19_ARB 0x88D3 -#define GL_MATRIX20_ARB 0x88D4 -#define GL_MATRIX21_ARB 0x88D5 -#define GL_MATRIX22_ARB 0x88D6 -#define GL_MATRIX23_ARB 0x88D7 -#define GL_MATRIX24_ARB 0x88D8 -#define GL_MATRIX25_ARB 0x88D9 -#define GL_MATRIX26_ARB 0x88DA -#define GL_MATRIX27_ARB 0x88DB -#define GL_MATRIX28_ARB 0x88DC -#define GL_MATRIX29_ARB 0x88DD -#define GL_MATRIX30_ARB 0x88DE -#define GL_MATRIX31_ARB 0x88DF - -typedef void (GLAPIENTRY * PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); -typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint* programs); -typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (GLAPIENTRY * PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint* programs); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void *string); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, void** pointer); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMARBPROC) (GLuint program); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void *string); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); - -#define glBindProgramARB GLEW_GET_FUN(__glewBindProgramARB) -#define glDeleteProgramsARB GLEW_GET_FUN(__glewDeleteProgramsARB) -#define glDisableVertexAttribArrayARB GLEW_GET_FUN(__glewDisableVertexAttribArrayARB) -#define glEnableVertexAttribArrayARB GLEW_GET_FUN(__glewEnableVertexAttribArrayARB) -#define glGenProgramsARB GLEW_GET_FUN(__glewGenProgramsARB) -#define glGetProgramEnvParameterdvARB GLEW_GET_FUN(__glewGetProgramEnvParameterdvARB) -#define glGetProgramEnvParameterfvARB GLEW_GET_FUN(__glewGetProgramEnvParameterfvARB) -#define glGetProgramLocalParameterdvARB GLEW_GET_FUN(__glewGetProgramLocalParameterdvARB) -#define glGetProgramLocalParameterfvARB GLEW_GET_FUN(__glewGetProgramLocalParameterfvARB) -#define glGetProgramStringARB GLEW_GET_FUN(__glewGetProgramStringARB) -#define glGetProgramivARB GLEW_GET_FUN(__glewGetProgramivARB) -#define glGetVertexAttribPointervARB GLEW_GET_FUN(__glewGetVertexAttribPointervARB) -#define glGetVertexAttribdvARB GLEW_GET_FUN(__glewGetVertexAttribdvARB) -#define glGetVertexAttribfvARB GLEW_GET_FUN(__glewGetVertexAttribfvARB) -#define glGetVertexAttribivARB GLEW_GET_FUN(__glewGetVertexAttribivARB) -#define glIsProgramARB GLEW_GET_FUN(__glewIsProgramARB) -#define glProgramEnvParameter4dARB GLEW_GET_FUN(__glewProgramEnvParameter4dARB) -#define glProgramEnvParameter4dvARB GLEW_GET_FUN(__glewProgramEnvParameter4dvARB) -#define glProgramEnvParameter4fARB GLEW_GET_FUN(__glewProgramEnvParameter4fARB) -#define glProgramEnvParameter4fvARB GLEW_GET_FUN(__glewProgramEnvParameter4fvARB) -#define glProgramLocalParameter4dARB GLEW_GET_FUN(__glewProgramLocalParameter4dARB) -#define glProgramLocalParameter4dvARB GLEW_GET_FUN(__glewProgramLocalParameter4dvARB) -#define glProgramLocalParameter4fARB GLEW_GET_FUN(__glewProgramLocalParameter4fARB) -#define glProgramLocalParameter4fvARB GLEW_GET_FUN(__glewProgramLocalParameter4fvARB) -#define glProgramStringARB GLEW_GET_FUN(__glewProgramStringARB) -#define glVertexAttrib1dARB GLEW_GET_FUN(__glewVertexAttrib1dARB) -#define glVertexAttrib1dvARB GLEW_GET_FUN(__glewVertexAttrib1dvARB) -#define glVertexAttrib1fARB GLEW_GET_FUN(__glewVertexAttrib1fARB) -#define glVertexAttrib1fvARB GLEW_GET_FUN(__glewVertexAttrib1fvARB) -#define glVertexAttrib1sARB GLEW_GET_FUN(__glewVertexAttrib1sARB) -#define glVertexAttrib1svARB GLEW_GET_FUN(__glewVertexAttrib1svARB) -#define glVertexAttrib2dARB GLEW_GET_FUN(__glewVertexAttrib2dARB) -#define glVertexAttrib2dvARB GLEW_GET_FUN(__glewVertexAttrib2dvARB) -#define glVertexAttrib2fARB GLEW_GET_FUN(__glewVertexAttrib2fARB) -#define glVertexAttrib2fvARB GLEW_GET_FUN(__glewVertexAttrib2fvARB) -#define glVertexAttrib2sARB GLEW_GET_FUN(__glewVertexAttrib2sARB) -#define glVertexAttrib2svARB GLEW_GET_FUN(__glewVertexAttrib2svARB) -#define glVertexAttrib3dARB GLEW_GET_FUN(__glewVertexAttrib3dARB) -#define glVertexAttrib3dvARB GLEW_GET_FUN(__glewVertexAttrib3dvARB) -#define glVertexAttrib3fARB GLEW_GET_FUN(__glewVertexAttrib3fARB) -#define glVertexAttrib3fvARB GLEW_GET_FUN(__glewVertexAttrib3fvARB) -#define glVertexAttrib3sARB GLEW_GET_FUN(__glewVertexAttrib3sARB) -#define glVertexAttrib3svARB GLEW_GET_FUN(__glewVertexAttrib3svARB) -#define glVertexAttrib4NbvARB GLEW_GET_FUN(__glewVertexAttrib4NbvARB) -#define glVertexAttrib4NivARB GLEW_GET_FUN(__glewVertexAttrib4NivARB) -#define glVertexAttrib4NsvARB GLEW_GET_FUN(__glewVertexAttrib4NsvARB) -#define glVertexAttrib4NubARB GLEW_GET_FUN(__glewVertexAttrib4NubARB) -#define glVertexAttrib4NubvARB GLEW_GET_FUN(__glewVertexAttrib4NubvARB) -#define glVertexAttrib4NuivARB GLEW_GET_FUN(__glewVertexAttrib4NuivARB) -#define glVertexAttrib4NusvARB GLEW_GET_FUN(__glewVertexAttrib4NusvARB) -#define glVertexAttrib4bvARB GLEW_GET_FUN(__glewVertexAttrib4bvARB) -#define glVertexAttrib4dARB GLEW_GET_FUN(__glewVertexAttrib4dARB) -#define glVertexAttrib4dvARB GLEW_GET_FUN(__glewVertexAttrib4dvARB) -#define glVertexAttrib4fARB GLEW_GET_FUN(__glewVertexAttrib4fARB) -#define glVertexAttrib4fvARB GLEW_GET_FUN(__glewVertexAttrib4fvARB) -#define glVertexAttrib4ivARB GLEW_GET_FUN(__glewVertexAttrib4ivARB) -#define glVertexAttrib4sARB GLEW_GET_FUN(__glewVertexAttrib4sARB) -#define glVertexAttrib4svARB GLEW_GET_FUN(__glewVertexAttrib4svARB) -#define glVertexAttrib4ubvARB GLEW_GET_FUN(__glewVertexAttrib4ubvARB) -#define glVertexAttrib4uivARB GLEW_GET_FUN(__glewVertexAttrib4uivARB) -#define glVertexAttrib4usvARB GLEW_GET_FUN(__glewVertexAttrib4usvARB) -#define glVertexAttribPointerARB GLEW_GET_FUN(__glewVertexAttribPointerARB) - -#define GLEW_ARB_vertex_program GLEW_GET_VAR(__GLEW_ARB_vertex_program) - -#endif /* GL_ARB_vertex_program */ - -/* -------------------------- GL_ARB_vertex_shader ------------------------- */ - -#ifndef GL_ARB_vertex_shader -#define GL_ARB_vertex_shader 1 - -#define GL_VERTEX_SHADER_ARB 0x8B31 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A -#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D -#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 -#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A - -typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB* name); -typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); -typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); - -#define glBindAttribLocationARB GLEW_GET_FUN(__glewBindAttribLocationARB) -#define glGetActiveAttribARB GLEW_GET_FUN(__glewGetActiveAttribARB) -#define glGetAttribLocationARB GLEW_GET_FUN(__glewGetAttribLocationARB) - -#define GLEW_ARB_vertex_shader GLEW_GET_VAR(__GLEW_ARB_vertex_shader) - -#endif /* GL_ARB_vertex_shader */ - -/* ------------------- GL_ARB_vertex_type_10f_11f_11f_rev ------------------ */ - -#ifndef GL_ARB_vertex_type_10f_11f_11f_rev -#define GL_ARB_vertex_type_10f_11f_11f_rev 1 - -#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B - -#define GLEW_ARB_vertex_type_10f_11f_11f_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_10f_11f_11f_rev) - -#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ - -/* ------------------- GL_ARB_vertex_type_2_10_10_10_rev ------------------- */ - -#ifndef GL_ARB_vertex_type_2_10_10_10_rev -#define GL_ARB_vertex_type_2_10_10_10_rev 1 - -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 -#define GL_INT_2_10_10_10_REV 0x8D9F - -typedef void (GLAPIENTRY * PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); -typedef void (GLAPIENTRY * PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint* color); -typedef void (GLAPIENTRY * PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); -typedef void (GLAPIENTRY * PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint* color); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint* color); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); -typedef void (GLAPIENTRY * PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); -typedef void (GLAPIENTRY * PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); -typedef void (GLAPIENTRY * PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint* value); - -#define glColorP3ui GLEW_GET_FUN(__glewColorP3ui) -#define glColorP3uiv GLEW_GET_FUN(__glewColorP3uiv) -#define glColorP4ui GLEW_GET_FUN(__glewColorP4ui) -#define glColorP4uiv GLEW_GET_FUN(__glewColorP4uiv) -#define glMultiTexCoordP1ui GLEW_GET_FUN(__glewMultiTexCoordP1ui) -#define glMultiTexCoordP1uiv GLEW_GET_FUN(__glewMultiTexCoordP1uiv) -#define glMultiTexCoordP2ui GLEW_GET_FUN(__glewMultiTexCoordP2ui) -#define glMultiTexCoordP2uiv GLEW_GET_FUN(__glewMultiTexCoordP2uiv) -#define glMultiTexCoordP3ui GLEW_GET_FUN(__glewMultiTexCoordP3ui) -#define glMultiTexCoordP3uiv GLEW_GET_FUN(__glewMultiTexCoordP3uiv) -#define glMultiTexCoordP4ui GLEW_GET_FUN(__glewMultiTexCoordP4ui) -#define glMultiTexCoordP4uiv GLEW_GET_FUN(__glewMultiTexCoordP4uiv) -#define glNormalP3ui GLEW_GET_FUN(__glewNormalP3ui) -#define glNormalP3uiv GLEW_GET_FUN(__glewNormalP3uiv) -#define glSecondaryColorP3ui GLEW_GET_FUN(__glewSecondaryColorP3ui) -#define glSecondaryColorP3uiv GLEW_GET_FUN(__glewSecondaryColorP3uiv) -#define glTexCoordP1ui GLEW_GET_FUN(__glewTexCoordP1ui) -#define glTexCoordP1uiv GLEW_GET_FUN(__glewTexCoordP1uiv) -#define glTexCoordP2ui GLEW_GET_FUN(__glewTexCoordP2ui) -#define glTexCoordP2uiv GLEW_GET_FUN(__glewTexCoordP2uiv) -#define glTexCoordP3ui GLEW_GET_FUN(__glewTexCoordP3ui) -#define glTexCoordP3uiv GLEW_GET_FUN(__glewTexCoordP3uiv) -#define glTexCoordP4ui GLEW_GET_FUN(__glewTexCoordP4ui) -#define glTexCoordP4uiv GLEW_GET_FUN(__glewTexCoordP4uiv) -#define glVertexAttribP1ui GLEW_GET_FUN(__glewVertexAttribP1ui) -#define glVertexAttribP1uiv GLEW_GET_FUN(__glewVertexAttribP1uiv) -#define glVertexAttribP2ui GLEW_GET_FUN(__glewVertexAttribP2ui) -#define glVertexAttribP2uiv GLEW_GET_FUN(__glewVertexAttribP2uiv) -#define glVertexAttribP3ui GLEW_GET_FUN(__glewVertexAttribP3ui) -#define glVertexAttribP3uiv GLEW_GET_FUN(__glewVertexAttribP3uiv) -#define glVertexAttribP4ui GLEW_GET_FUN(__glewVertexAttribP4ui) -#define glVertexAttribP4uiv GLEW_GET_FUN(__glewVertexAttribP4uiv) -#define glVertexP2ui GLEW_GET_FUN(__glewVertexP2ui) -#define glVertexP2uiv GLEW_GET_FUN(__glewVertexP2uiv) -#define glVertexP3ui GLEW_GET_FUN(__glewVertexP3ui) -#define glVertexP3uiv GLEW_GET_FUN(__glewVertexP3uiv) -#define glVertexP4ui GLEW_GET_FUN(__glewVertexP4ui) -#define glVertexP4uiv GLEW_GET_FUN(__glewVertexP4uiv) - -#define GLEW_ARB_vertex_type_2_10_10_10_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_2_10_10_10_rev) - -#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ - -/* ------------------------- GL_ARB_viewport_array ------------------------- */ - -#ifndef GL_ARB_viewport_array -#define GL_ARB_viewport_array 1 - -#define GL_DEPTH_RANGE 0x0B70 -#define GL_VIEWPORT 0x0BA2 -#define GL_SCISSOR_BOX 0x0C10 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_MAX_VIEWPORTS 0x825B -#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C -#define GL_VIEWPORT_BOUNDS_RANGE 0x825D -#define GL_LAYER_PROVOKING_VERTEX 0x825E -#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F -#define GL_UNDEFINED_VERTEX 0x8260 -#define GL_FIRST_VERTEX_CONVENTION 0x8E4D -#define GL_LAST_VERTEX_CONVENTION 0x8E4E -#define GL_PROVOKING_VERTEX 0x8E4F - -typedef void (GLAPIENTRY * PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLclampd * v); -typedef void (GLAPIENTRY * PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLclampd n, GLclampd f); -typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble* data); -typedef void (GLAPIENTRY * PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat* data); -typedef void (GLAPIENTRY * PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint * v); -typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint * v); -typedef void (GLAPIENTRY * PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat * v); -typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); -typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat * v); - -#define glDepthRangeArrayv GLEW_GET_FUN(__glewDepthRangeArrayv) -#define glDepthRangeIndexed GLEW_GET_FUN(__glewDepthRangeIndexed) -#define glGetDoublei_v GLEW_GET_FUN(__glewGetDoublei_v) -#define glGetFloati_v GLEW_GET_FUN(__glewGetFloati_v) -#define glScissorArrayv GLEW_GET_FUN(__glewScissorArrayv) -#define glScissorIndexed GLEW_GET_FUN(__glewScissorIndexed) -#define glScissorIndexedv GLEW_GET_FUN(__glewScissorIndexedv) -#define glViewportArrayv GLEW_GET_FUN(__glewViewportArrayv) -#define glViewportIndexedf GLEW_GET_FUN(__glewViewportIndexedf) -#define glViewportIndexedfv GLEW_GET_FUN(__glewViewportIndexedfv) - -#define GLEW_ARB_viewport_array GLEW_GET_VAR(__GLEW_ARB_viewport_array) - -#endif /* GL_ARB_viewport_array */ - -/* --------------------------- GL_ARB_window_pos --------------------------- */ - -#ifndef GL_ARB_window_pos -#define GL_ARB_window_pos 1 - -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVARBPROC) (const GLdouble* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVARBPROC) (const GLfloat* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVARBPROC) (const GLint* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVARBPROC) (const GLshort* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVARBPROC) (const GLdouble* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVARBPROC) (const GLfloat* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVARBPROC) (const GLint* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVARBPROC) (const GLshort* p); - -#define glWindowPos2dARB GLEW_GET_FUN(__glewWindowPos2dARB) -#define glWindowPos2dvARB GLEW_GET_FUN(__glewWindowPos2dvARB) -#define glWindowPos2fARB GLEW_GET_FUN(__glewWindowPos2fARB) -#define glWindowPos2fvARB GLEW_GET_FUN(__glewWindowPos2fvARB) -#define glWindowPos2iARB GLEW_GET_FUN(__glewWindowPos2iARB) -#define glWindowPos2ivARB GLEW_GET_FUN(__glewWindowPos2ivARB) -#define glWindowPos2sARB GLEW_GET_FUN(__glewWindowPos2sARB) -#define glWindowPos2svARB GLEW_GET_FUN(__glewWindowPos2svARB) -#define glWindowPos3dARB GLEW_GET_FUN(__glewWindowPos3dARB) -#define glWindowPos3dvARB GLEW_GET_FUN(__glewWindowPos3dvARB) -#define glWindowPos3fARB GLEW_GET_FUN(__glewWindowPos3fARB) -#define glWindowPos3fvARB GLEW_GET_FUN(__glewWindowPos3fvARB) -#define glWindowPos3iARB GLEW_GET_FUN(__glewWindowPos3iARB) -#define glWindowPos3ivARB GLEW_GET_FUN(__glewWindowPos3ivARB) -#define glWindowPos3sARB GLEW_GET_FUN(__glewWindowPos3sARB) -#define glWindowPos3svARB GLEW_GET_FUN(__glewWindowPos3svARB) - -#define GLEW_ARB_window_pos GLEW_GET_VAR(__GLEW_ARB_window_pos) - -#endif /* GL_ARB_window_pos */ - -/* ------------------------- GL_ATIX_point_sprites ------------------------- */ - -#ifndef GL_ATIX_point_sprites -#define GL_ATIX_point_sprites 1 - -#define GL_TEXTURE_POINT_MODE_ATIX 0x60B0 -#define GL_TEXTURE_POINT_ONE_COORD_ATIX 0x60B1 -#define GL_TEXTURE_POINT_SPRITE_ATIX 0x60B2 -#define GL_POINT_SPRITE_CULL_MODE_ATIX 0x60B3 -#define GL_POINT_SPRITE_CULL_CENTER_ATIX 0x60B4 -#define GL_POINT_SPRITE_CULL_CLIP_ATIX 0x60B5 - -#define GLEW_ATIX_point_sprites GLEW_GET_VAR(__GLEW_ATIX_point_sprites) - -#endif /* GL_ATIX_point_sprites */ - -/* ---------------------- GL_ATIX_texture_env_combine3 --------------------- */ - -#ifndef GL_ATIX_texture_env_combine3 -#define GL_ATIX_texture_env_combine3 1 - -#define GL_MODULATE_ADD_ATIX 0x8744 -#define GL_MODULATE_SIGNED_ADD_ATIX 0x8745 -#define GL_MODULATE_SUBTRACT_ATIX 0x8746 - -#define GLEW_ATIX_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATIX_texture_env_combine3) - -#endif /* GL_ATIX_texture_env_combine3 */ - -/* ----------------------- GL_ATIX_texture_env_route ----------------------- */ - -#ifndef GL_ATIX_texture_env_route -#define GL_ATIX_texture_env_route 1 - -#define GL_SECONDARY_COLOR_ATIX 0x8747 -#define GL_TEXTURE_OUTPUT_RGB_ATIX 0x8748 -#define GL_TEXTURE_OUTPUT_ALPHA_ATIX 0x8749 - -#define GLEW_ATIX_texture_env_route GLEW_GET_VAR(__GLEW_ATIX_texture_env_route) - -#endif /* GL_ATIX_texture_env_route */ - -/* ---------------- GL_ATIX_vertex_shader_output_point_size ---------------- */ - -#ifndef GL_ATIX_vertex_shader_output_point_size -#define GL_ATIX_vertex_shader_output_point_size 1 - -#define GL_OUTPUT_POINT_SIZE_ATIX 0x610E - -#define GLEW_ATIX_vertex_shader_output_point_size GLEW_GET_VAR(__GLEW_ATIX_vertex_shader_output_point_size) - -#endif /* GL_ATIX_vertex_shader_output_point_size */ - -/* -------------------------- GL_ATI_draw_buffers -------------------------- */ - -#ifndef GL_ATI_draw_buffers -#define GL_ATI_draw_buffers 1 - -#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 -#define GL_DRAW_BUFFER0_ATI 0x8825 -#define GL_DRAW_BUFFER1_ATI 0x8826 -#define GL_DRAW_BUFFER2_ATI 0x8827 -#define GL_DRAW_BUFFER3_ATI 0x8828 -#define GL_DRAW_BUFFER4_ATI 0x8829 -#define GL_DRAW_BUFFER5_ATI 0x882A -#define GL_DRAW_BUFFER6_ATI 0x882B -#define GL_DRAW_BUFFER7_ATI 0x882C -#define GL_DRAW_BUFFER8_ATI 0x882D -#define GL_DRAW_BUFFER9_ATI 0x882E -#define GL_DRAW_BUFFER10_ATI 0x882F -#define GL_DRAW_BUFFER11_ATI 0x8830 -#define GL_DRAW_BUFFER12_ATI 0x8831 -#define GL_DRAW_BUFFER13_ATI 0x8832 -#define GL_DRAW_BUFFER14_ATI 0x8833 -#define GL_DRAW_BUFFER15_ATI 0x8834 - -typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum* bufs); - -#define glDrawBuffersATI GLEW_GET_FUN(__glewDrawBuffersATI) - -#define GLEW_ATI_draw_buffers GLEW_GET_VAR(__GLEW_ATI_draw_buffers) - -#endif /* GL_ATI_draw_buffers */ - -/* -------------------------- GL_ATI_element_array ------------------------- */ - -#ifndef GL_ATI_element_array -#define GL_ATI_element_array 1 - -#define GL_ELEMENT_ARRAY_ATI 0x8768 -#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 -#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A - -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); -typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); -typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void *pointer); - -#define glDrawElementArrayATI GLEW_GET_FUN(__glewDrawElementArrayATI) -#define glDrawRangeElementArrayATI GLEW_GET_FUN(__glewDrawRangeElementArrayATI) -#define glElementPointerATI GLEW_GET_FUN(__glewElementPointerATI) - -#define GLEW_ATI_element_array GLEW_GET_VAR(__GLEW_ATI_element_array) - -#endif /* GL_ATI_element_array */ - -/* ------------------------- GL_ATI_envmap_bumpmap ------------------------- */ - -#ifndef GL_ATI_envmap_bumpmap -#define GL_ATI_envmap_bumpmap 1 - -#define GL_BUMP_ROT_MATRIX_ATI 0x8775 -#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 -#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 -#define GL_BUMP_TEX_UNITS_ATI 0x8778 -#define GL_DUDV_ATI 0x8779 -#define GL_DU8DV8_ATI 0x877A -#define GL_BUMP_ENVMAP_ATI 0x877B -#define GL_BUMP_TARGET_ATI 0x877C - -typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); -typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); -typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); -typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); - -#define glGetTexBumpParameterfvATI GLEW_GET_FUN(__glewGetTexBumpParameterfvATI) -#define glGetTexBumpParameterivATI GLEW_GET_FUN(__glewGetTexBumpParameterivATI) -#define glTexBumpParameterfvATI GLEW_GET_FUN(__glewTexBumpParameterfvATI) -#define glTexBumpParameterivATI GLEW_GET_FUN(__glewTexBumpParameterivATI) - -#define GLEW_ATI_envmap_bumpmap GLEW_GET_VAR(__GLEW_ATI_envmap_bumpmap) - -#endif /* GL_ATI_envmap_bumpmap */ - -/* ------------------------- GL_ATI_fragment_shader ------------------------ */ - -#ifndef GL_ATI_fragment_shader -#define GL_ATI_fragment_shader 1 - -#define GL_2X_BIT_ATI 0x00000001 -#define GL_RED_BIT_ATI 0x00000001 -#define GL_4X_BIT_ATI 0x00000002 -#define GL_COMP_BIT_ATI 0x00000002 -#define GL_GREEN_BIT_ATI 0x00000002 -#define GL_8X_BIT_ATI 0x00000004 -#define GL_BLUE_BIT_ATI 0x00000004 -#define GL_NEGATE_BIT_ATI 0x00000004 -#define GL_BIAS_BIT_ATI 0x00000008 -#define GL_HALF_BIT_ATI 0x00000008 -#define GL_QUARTER_BIT_ATI 0x00000010 -#define GL_EIGHTH_BIT_ATI 0x00000020 -#define GL_SATURATE_BIT_ATI 0x00000040 -#define GL_FRAGMENT_SHADER_ATI 0x8920 -#define GL_REG_0_ATI 0x8921 -#define GL_REG_1_ATI 0x8922 -#define GL_REG_2_ATI 0x8923 -#define GL_REG_3_ATI 0x8924 -#define GL_REG_4_ATI 0x8925 -#define GL_REG_5_ATI 0x8926 -#define GL_CON_0_ATI 0x8941 -#define GL_CON_1_ATI 0x8942 -#define GL_CON_2_ATI 0x8943 -#define GL_CON_3_ATI 0x8944 -#define GL_CON_4_ATI 0x8945 -#define GL_CON_5_ATI 0x8946 -#define GL_CON_6_ATI 0x8947 -#define GL_CON_7_ATI 0x8948 -#define GL_MOV_ATI 0x8961 -#define GL_ADD_ATI 0x8963 -#define GL_MUL_ATI 0x8964 -#define GL_SUB_ATI 0x8965 -#define GL_DOT3_ATI 0x8966 -#define GL_DOT4_ATI 0x8967 -#define GL_MAD_ATI 0x8968 -#define GL_LERP_ATI 0x8969 -#define GL_CND_ATI 0x896A -#define GL_CND0_ATI 0x896B -#define GL_DOT2_ADD_ATI 0x896C -#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D -#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E -#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F -#define GL_NUM_PASSES_ATI 0x8970 -#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 -#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 -#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 -#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 -#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 -#define GL_SWIZZLE_STR_ATI 0x8976 -#define GL_SWIZZLE_STQ_ATI 0x8977 -#define GL_SWIZZLE_STR_DR_ATI 0x8978 -#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 -#define GL_SWIZZLE_STRQ_ATI 0x897A -#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B - -typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -typedef void (GLAPIENTRY * PFNGLBEGINFRAGMENTSHADERATIPROC) (void); -typedef void (GLAPIENTRY * PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -typedef void (GLAPIENTRY * PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLENDFRAGMENTSHADERATIPROC) (void); -typedef GLuint (GLAPIENTRY * PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); -typedef void (GLAPIENTRY * PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); -typedef void (GLAPIENTRY * PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); -typedef void (GLAPIENTRY * PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat* value); - -#define glAlphaFragmentOp1ATI GLEW_GET_FUN(__glewAlphaFragmentOp1ATI) -#define glAlphaFragmentOp2ATI GLEW_GET_FUN(__glewAlphaFragmentOp2ATI) -#define glAlphaFragmentOp3ATI GLEW_GET_FUN(__glewAlphaFragmentOp3ATI) -#define glBeginFragmentShaderATI GLEW_GET_FUN(__glewBeginFragmentShaderATI) -#define glBindFragmentShaderATI GLEW_GET_FUN(__glewBindFragmentShaderATI) -#define glColorFragmentOp1ATI GLEW_GET_FUN(__glewColorFragmentOp1ATI) -#define glColorFragmentOp2ATI GLEW_GET_FUN(__glewColorFragmentOp2ATI) -#define glColorFragmentOp3ATI GLEW_GET_FUN(__glewColorFragmentOp3ATI) -#define glDeleteFragmentShaderATI GLEW_GET_FUN(__glewDeleteFragmentShaderATI) -#define glEndFragmentShaderATI GLEW_GET_FUN(__glewEndFragmentShaderATI) -#define glGenFragmentShadersATI GLEW_GET_FUN(__glewGenFragmentShadersATI) -#define glPassTexCoordATI GLEW_GET_FUN(__glewPassTexCoordATI) -#define glSampleMapATI GLEW_GET_FUN(__glewSampleMapATI) -#define glSetFragmentShaderConstantATI GLEW_GET_FUN(__glewSetFragmentShaderConstantATI) - -#define GLEW_ATI_fragment_shader GLEW_GET_VAR(__GLEW_ATI_fragment_shader) - -#endif /* GL_ATI_fragment_shader */ - -/* ------------------------ GL_ATI_map_object_buffer ----------------------- */ - -#ifndef GL_ATI_map_object_buffer -#define GL_ATI_map_object_buffer 1 - -typedef void * (GLAPIENTRY * PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); - -#define glMapObjectBufferATI GLEW_GET_FUN(__glewMapObjectBufferATI) -#define glUnmapObjectBufferATI GLEW_GET_FUN(__glewUnmapObjectBufferATI) - -#define GLEW_ATI_map_object_buffer GLEW_GET_VAR(__GLEW_ATI_map_object_buffer) - -#endif /* GL_ATI_map_object_buffer */ - -/* ----------------------------- GL_ATI_meminfo ---------------------------- */ - -#ifndef GL_ATI_meminfo -#define GL_ATI_meminfo 1 - -#define GL_VBO_FREE_MEMORY_ATI 0x87FB -#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC -#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD - -#define GLEW_ATI_meminfo GLEW_GET_VAR(__GLEW_ATI_meminfo) - -#endif /* GL_ATI_meminfo */ - -/* -------------------------- GL_ATI_pn_triangles -------------------------- */ - -#ifndef GL_ATI_pn_triangles -#define GL_ATI_pn_triangles 1 - -#define GL_PN_TRIANGLES_ATI 0x87F0 -#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 -#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 -#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 -#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 -#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 -#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 -#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 -#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 - -typedef void (GLAPIENTRY * PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); - -#define glPNTrianglesfATI GLEW_GET_FUN(__glewPNTrianglesfATI) -#define glPNTrianglesiATI GLEW_GET_FUN(__glewPNTrianglesiATI) - -#define GLEW_ATI_pn_triangles GLEW_GET_VAR(__GLEW_ATI_pn_triangles) - -#endif /* GL_ATI_pn_triangles */ - -/* ------------------------ GL_ATI_separate_stencil ------------------------ */ - -#ifndef GL_ATI_separate_stencil -#define GL_ATI_separate_stencil 1 - -#define GL_STENCIL_BACK_FUNC_ATI 0x8800 -#define GL_STENCIL_BACK_FAIL_ATI 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 - -typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); -typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); - -#define glStencilFuncSeparateATI GLEW_GET_FUN(__glewStencilFuncSeparateATI) -#define glStencilOpSeparateATI GLEW_GET_FUN(__glewStencilOpSeparateATI) - -#define GLEW_ATI_separate_stencil GLEW_GET_VAR(__GLEW_ATI_separate_stencil) - -#endif /* GL_ATI_separate_stencil */ - -/* ----------------------- GL_ATI_shader_texture_lod ----------------------- */ - -#ifndef GL_ATI_shader_texture_lod -#define GL_ATI_shader_texture_lod 1 - -#define GLEW_ATI_shader_texture_lod GLEW_GET_VAR(__GLEW_ATI_shader_texture_lod) - -#endif /* GL_ATI_shader_texture_lod */ - -/* ---------------------- GL_ATI_text_fragment_shader ---------------------- */ - -#ifndef GL_ATI_text_fragment_shader -#define GL_ATI_text_fragment_shader 1 - -#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 - -#define GLEW_ATI_text_fragment_shader GLEW_GET_VAR(__GLEW_ATI_text_fragment_shader) - -#endif /* GL_ATI_text_fragment_shader */ - -/* --------------------- GL_ATI_texture_compression_3dc -------------------- */ - -#ifndef GL_ATI_texture_compression_3dc -#define GL_ATI_texture_compression_3dc 1 - -#define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837 - -#define GLEW_ATI_texture_compression_3dc GLEW_GET_VAR(__GLEW_ATI_texture_compression_3dc) - -#endif /* GL_ATI_texture_compression_3dc */ - -/* ---------------------- GL_ATI_texture_env_combine3 ---------------------- */ - -#ifndef GL_ATI_texture_env_combine3 -#define GL_ATI_texture_env_combine3 1 - -#define GL_MODULATE_ADD_ATI 0x8744 -#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 -#define GL_MODULATE_SUBTRACT_ATI 0x8746 - -#define GLEW_ATI_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATI_texture_env_combine3) - -#endif /* GL_ATI_texture_env_combine3 */ - -/* -------------------------- GL_ATI_texture_float ------------------------- */ - -#ifndef GL_ATI_texture_float -#define GL_ATI_texture_float 1 - -#define GL_RGBA_FLOAT32_ATI 0x8814 -#define GL_RGB_FLOAT32_ATI 0x8815 -#define GL_ALPHA_FLOAT32_ATI 0x8816 -#define GL_INTENSITY_FLOAT32_ATI 0x8817 -#define GL_LUMINANCE_FLOAT32_ATI 0x8818 -#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 -#define GL_RGBA_FLOAT16_ATI 0x881A -#define GL_RGB_FLOAT16_ATI 0x881B -#define GL_ALPHA_FLOAT16_ATI 0x881C -#define GL_INTENSITY_FLOAT16_ATI 0x881D -#define GL_LUMINANCE_FLOAT16_ATI 0x881E -#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F - -#define GLEW_ATI_texture_float GLEW_GET_VAR(__GLEW_ATI_texture_float) - -#endif /* GL_ATI_texture_float */ - -/* ----------------------- GL_ATI_texture_mirror_once ---------------------- */ - -#ifndef GL_ATI_texture_mirror_once -#define GL_ATI_texture_mirror_once 1 - -#define GL_MIRROR_CLAMP_ATI 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 - -#define GLEW_ATI_texture_mirror_once GLEW_GET_VAR(__GLEW_ATI_texture_mirror_once) - -#endif /* GL_ATI_texture_mirror_once */ - -/* ----------------------- GL_ATI_vertex_array_object ---------------------- */ - -#ifndef GL_ATI_vertex_array_object -#define GL_ATI_vertex_array_object 1 - -#define GL_STATIC_ATI 0x8760 -#define GL_DYNAMIC_ATI 0x8761 -#define GL_PRESERVE_ATI 0x8762 -#define GL_DISCARD_ATI 0x8763 -#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 -#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 -#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 -#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 - -typedef void (GLAPIENTRY * PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (GLAPIENTRY * PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); -typedef GLuint (GLAPIENTRY * PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void *pointer, GLenum usage); -typedef void (GLAPIENTRY * PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); -typedef void (GLAPIENTRY * PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); - -#define glArrayObjectATI GLEW_GET_FUN(__glewArrayObjectATI) -#define glFreeObjectBufferATI GLEW_GET_FUN(__glewFreeObjectBufferATI) -#define glGetArrayObjectfvATI GLEW_GET_FUN(__glewGetArrayObjectfvATI) -#define glGetArrayObjectivATI GLEW_GET_FUN(__glewGetArrayObjectivATI) -#define glGetObjectBufferfvATI GLEW_GET_FUN(__glewGetObjectBufferfvATI) -#define glGetObjectBufferivATI GLEW_GET_FUN(__glewGetObjectBufferivATI) -#define glGetVariantArrayObjectfvATI GLEW_GET_FUN(__glewGetVariantArrayObjectfvATI) -#define glGetVariantArrayObjectivATI GLEW_GET_FUN(__glewGetVariantArrayObjectivATI) -#define glIsObjectBufferATI GLEW_GET_FUN(__glewIsObjectBufferATI) -#define glNewObjectBufferATI GLEW_GET_FUN(__glewNewObjectBufferATI) -#define glUpdateObjectBufferATI GLEW_GET_FUN(__glewUpdateObjectBufferATI) -#define glVariantArrayObjectATI GLEW_GET_FUN(__glewVariantArrayObjectATI) - -#define GLEW_ATI_vertex_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_array_object) - -#endif /* GL_ATI_vertex_array_object */ - -/* ------------------- GL_ATI_vertex_attrib_array_object ------------------- */ - -#ifndef GL_ATI_vertex_attrib_array_object -#define GL_ATI_vertex_attrib_array_object 1 - -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); - -#define glGetVertexAttribArrayObjectfvATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectfvATI) -#define glGetVertexAttribArrayObjectivATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectivATI) -#define glVertexAttribArrayObjectATI GLEW_GET_FUN(__glewVertexAttribArrayObjectATI) - -#define GLEW_ATI_vertex_attrib_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_attrib_array_object) - -#endif /* GL_ATI_vertex_attrib_array_object */ - -/* ------------------------- GL_ATI_vertex_streams ------------------------- */ - -#ifndef GL_ATI_vertex_streams -#define GL_ATI_vertex_streams 1 - -#define GL_MAX_VERTEX_STREAMS_ATI 0x876B -#define GL_VERTEX_SOURCE_ATI 0x876C -#define GL_VERTEX_STREAM0_ATI 0x876D -#define GL_VERTEX_STREAM1_ATI 0x876E -#define GL_VERTEX_STREAM2_ATI 0x876F -#define GL_VERTEX_STREAM3_ATI 0x8770 -#define GL_VERTEX_STREAM4_ATI 0x8771 -#define GL_VERTEX_STREAM5_ATI 0x8772 -#define GL_VERTEX_STREAM6_ATI 0x8773 -#define GL_VERTEX_STREAM7_ATI 0x8774 - -typedef void (GLAPIENTRY * PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte x, GLbyte y, GLbyte z); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); - -#define glClientActiveVertexStreamATI GLEW_GET_FUN(__glewClientActiveVertexStreamATI) -#define glNormalStream3bATI GLEW_GET_FUN(__glewNormalStream3bATI) -#define glNormalStream3bvATI GLEW_GET_FUN(__glewNormalStream3bvATI) -#define glNormalStream3dATI GLEW_GET_FUN(__glewNormalStream3dATI) -#define glNormalStream3dvATI GLEW_GET_FUN(__glewNormalStream3dvATI) -#define glNormalStream3fATI GLEW_GET_FUN(__glewNormalStream3fATI) -#define glNormalStream3fvATI GLEW_GET_FUN(__glewNormalStream3fvATI) -#define glNormalStream3iATI GLEW_GET_FUN(__glewNormalStream3iATI) -#define glNormalStream3ivATI GLEW_GET_FUN(__glewNormalStream3ivATI) -#define glNormalStream3sATI GLEW_GET_FUN(__glewNormalStream3sATI) -#define glNormalStream3svATI GLEW_GET_FUN(__glewNormalStream3svATI) -#define glVertexBlendEnvfATI GLEW_GET_FUN(__glewVertexBlendEnvfATI) -#define glVertexBlendEnviATI GLEW_GET_FUN(__glewVertexBlendEnviATI) -#define glVertexStream1dATI GLEW_GET_FUN(__glewVertexStream1dATI) -#define glVertexStream1dvATI GLEW_GET_FUN(__glewVertexStream1dvATI) -#define glVertexStream1fATI GLEW_GET_FUN(__glewVertexStream1fATI) -#define glVertexStream1fvATI GLEW_GET_FUN(__glewVertexStream1fvATI) -#define glVertexStream1iATI GLEW_GET_FUN(__glewVertexStream1iATI) -#define glVertexStream1ivATI GLEW_GET_FUN(__glewVertexStream1ivATI) -#define glVertexStream1sATI GLEW_GET_FUN(__glewVertexStream1sATI) -#define glVertexStream1svATI GLEW_GET_FUN(__glewVertexStream1svATI) -#define glVertexStream2dATI GLEW_GET_FUN(__glewVertexStream2dATI) -#define glVertexStream2dvATI GLEW_GET_FUN(__glewVertexStream2dvATI) -#define glVertexStream2fATI GLEW_GET_FUN(__glewVertexStream2fATI) -#define glVertexStream2fvATI GLEW_GET_FUN(__glewVertexStream2fvATI) -#define glVertexStream2iATI GLEW_GET_FUN(__glewVertexStream2iATI) -#define glVertexStream2ivATI GLEW_GET_FUN(__glewVertexStream2ivATI) -#define glVertexStream2sATI GLEW_GET_FUN(__glewVertexStream2sATI) -#define glVertexStream2svATI GLEW_GET_FUN(__glewVertexStream2svATI) -#define glVertexStream3dATI GLEW_GET_FUN(__glewVertexStream3dATI) -#define glVertexStream3dvATI GLEW_GET_FUN(__glewVertexStream3dvATI) -#define glVertexStream3fATI GLEW_GET_FUN(__glewVertexStream3fATI) -#define glVertexStream3fvATI GLEW_GET_FUN(__glewVertexStream3fvATI) -#define glVertexStream3iATI GLEW_GET_FUN(__glewVertexStream3iATI) -#define glVertexStream3ivATI GLEW_GET_FUN(__glewVertexStream3ivATI) -#define glVertexStream3sATI GLEW_GET_FUN(__glewVertexStream3sATI) -#define glVertexStream3svATI GLEW_GET_FUN(__glewVertexStream3svATI) -#define glVertexStream4dATI GLEW_GET_FUN(__glewVertexStream4dATI) -#define glVertexStream4dvATI GLEW_GET_FUN(__glewVertexStream4dvATI) -#define glVertexStream4fATI GLEW_GET_FUN(__glewVertexStream4fATI) -#define glVertexStream4fvATI GLEW_GET_FUN(__glewVertexStream4fvATI) -#define glVertexStream4iATI GLEW_GET_FUN(__glewVertexStream4iATI) -#define glVertexStream4ivATI GLEW_GET_FUN(__glewVertexStream4ivATI) -#define glVertexStream4sATI GLEW_GET_FUN(__glewVertexStream4sATI) -#define glVertexStream4svATI GLEW_GET_FUN(__glewVertexStream4svATI) - -#define GLEW_ATI_vertex_streams GLEW_GET_VAR(__GLEW_ATI_vertex_streams) - -#endif /* GL_ATI_vertex_streams */ - -/* --------------------------- GL_EXT_422_pixels --------------------------- */ - -#ifndef GL_EXT_422_pixels -#define GL_EXT_422_pixels 1 - -#define GL_422_EXT 0x80CC -#define GL_422_REV_EXT 0x80CD -#define GL_422_AVERAGE_EXT 0x80CE -#define GL_422_REV_AVERAGE_EXT 0x80CF - -#define GLEW_EXT_422_pixels GLEW_GET_VAR(__GLEW_EXT_422_pixels) - -#endif /* GL_EXT_422_pixels */ - -/* ---------------------------- GL_EXT_Cg_shader --------------------------- */ - -#ifndef GL_EXT_Cg_shader -#define GL_EXT_Cg_shader 1 - -#define GL_CG_VERTEX_SHADER_EXT 0x890E -#define GL_CG_FRAGMENT_SHADER_EXT 0x890F - -#define GLEW_EXT_Cg_shader GLEW_GET_VAR(__GLEW_EXT_Cg_shader) - -#endif /* GL_EXT_Cg_shader */ - -/* ------------------------------ GL_EXT_abgr ------------------------------ */ - -#ifndef GL_EXT_abgr -#define GL_EXT_abgr 1 - -#define GL_ABGR_EXT 0x8000 - -#define GLEW_EXT_abgr GLEW_GET_VAR(__GLEW_EXT_abgr) - -#endif /* GL_EXT_abgr */ - -/* ------------------------------ GL_EXT_bgra ------------------------------ */ - -#ifndef GL_EXT_bgra -#define GL_EXT_bgra 1 - -#define GL_BGR_EXT 0x80E0 -#define GL_BGRA_EXT 0x80E1 - -#define GLEW_EXT_bgra GLEW_GET_VAR(__GLEW_EXT_bgra) - -#endif /* GL_EXT_bgra */ - -/* ------------------------ GL_EXT_bindable_uniform ------------------------ */ - -#ifndef GL_EXT_bindable_uniform -#define GL_EXT_bindable_uniform 1 - -#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 -#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 -#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 -#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED -#define GL_UNIFORM_BUFFER_EXT 0x8DEE -#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF - -typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); -typedef GLintptr (GLAPIENTRY * PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); -typedef void (GLAPIENTRY * PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); - -#define glGetUniformBufferSizeEXT GLEW_GET_FUN(__glewGetUniformBufferSizeEXT) -#define glGetUniformOffsetEXT GLEW_GET_FUN(__glewGetUniformOffsetEXT) -#define glUniformBufferEXT GLEW_GET_FUN(__glewUniformBufferEXT) - -#define GLEW_EXT_bindable_uniform GLEW_GET_VAR(__GLEW_EXT_bindable_uniform) - -#endif /* GL_EXT_bindable_uniform */ - -/* --------------------------- GL_EXT_blend_color -------------------------- */ - -#ifndef GL_EXT_blend_color -#define GL_EXT_blend_color 1 - -#define GL_CONSTANT_COLOR_EXT 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 -#define GL_CONSTANT_ALPHA_EXT 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 -#define GL_BLEND_COLOR_EXT 0x8005 - -typedef void (GLAPIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); - -#define glBlendColorEXT GLEW_GET_FUN(__glewBlendColorEXT) - -#define GLEW_EXT_blend_color GLEW_GET_VAR(__GLEW_EXT_blend_color) - -#endif /* GL_EXT_blend_color */ - -/* --------------------- GL_EXT_blend_equation_separate -------------------- */ - -#ifndef GL_EXT_blend_equation_separate -#define GL_EXT_blend_equation_separate 1 - -#define GL_BLEND_EQUATION_RGB_EXT 0x8009 -#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D - -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); - -#define glBlendEquationSeparateEXT GLEW_GET_FUN(__glewBlendEquationSeparateEXT) - -#define GLEW_EXT_blend_equation_separate GLEW_GET_VAR(__GLEW_EXT_blend_equation_separate) - -#endif /* GL_EXT_blend_equation_separate */ - -/* ----------------------- GL_EXT_blend_func_separate ---------------------- */ - -#ifndef GL_EXT_blend_func_separate -#define GL_EXT_blend_func_separate 1 - -#define GL_BLEND_DST_RGB_EXT 0x80C8 -#define GL_BLEND_SRC_RGB_EXT 0x80C9 -#define GL_BLEND_DST_ALPHA_EXT 0x80CA -#define GL_BLEND_SRC_ALPHA_EXT 0x80CB - -typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); - -#define glBlendFuncSeparateEXT GLEW_GET_FUN(__glewBlendFuncSeparateEXT) - -#define GLEW_EXT_blend_func_separate GLEW_GET_VAR(__GLEW_EXT_blend_func_separate) - -#endif /* GL_EXT_blend_func_separate */ - -/* ------------------------- GL_EXT_blend_logic_op ------------------------- */ - -#ifndef GL_EXT_blend_logic_op -#define GL_EXT_blend_logic_op 1 - -#define GLEW_EXT_blend_logic_op GLEW_GET_VAR(__GLEW_EXT_blend_logic_op) - -#endif /* GL_EXT_blend_logic_op */ - -/* -------------------------- GL_EXT_blend_minmax -------------------------- */ - -#ifndef GL_EXT_blend_minmax -#define GL_EXT_blend_minmax 1 - -#define GL_FUNC_ADD_EXT 0x8006 -#define GL_MIN_EXT 0x8007 -#define GL_MAX_EXT 0x8008 -#define GL_BLEND_EQUATION_EXT 0x8009 - -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); - -#define glBlendEquationEXT GLEW_GET_FUN(__glewBlendEquationEXT) - -#define GLEW_EXT_blend_minmax GLEW_GET_VAR(__GLEW_EXT_blend_minmax) - -#endif /* GL_EXT_blend_minmax */ - -/* ------------------------- GL_EXT_blend_subtract ------------------------- */ - -#ifndef GL_EXT_blend_subtract -#define GL_EXT_blend_subtract 1 - -#define GL_FUNC_SUBTRACT_EXT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B - -#define GLEW_EXT_blend_subtract GLEW_GET_VAR(__GLEW_EXT_blend_subtract) - -#endif /* GL_EXT_blend_subtract */ - -/* ------------------------ GL_EXT_clip_volume_hint ------------------------ */ - -#ifndef GL_EXT_clip_volume_hint -#define GL_EXT_clip_volume_hint 1 - -#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 - -#define GLEW_EXT_clip_volume_hint GLEW_GET_VAR(__GLEW_EXT_clip_volume_hint) - -#endif /* GL_EXT_clip_volume_hint */ - -/* ------------------------------ GL_EXT_cmyka ----------------------------- */ - -#ifndef GL_EXT_cmyka -#define GL_EXT_cmyka 1 - -#define GL_CMYK_EXT 0x800C -#define GL_CMYKA_EXT 0x800D -#define GL_PACK_CMYK_HINT_EXT 0x800E -#define GL_UNPACK_CMYK_HINT_EXT 0x800F - -#define GLEW_EXT_cmyka GLEW_GET_VAR(__GLEW_EXT_cmyka) - -#endif /* GL_EXT_cmyka */ - -/* ------------------------- GL_EXT_color_subtable ------------------------- */ - -#ifndef GL_EXT_color_subtable -#define GL_EXT_color_subtable 1 - -typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); - -#define glColorSubTableEXT GLEW_GET_FUN(__glewColorSubTableEXT) -#define glCopyColorSubTableEXT GLEW_GET_FUN(__glewCopyColorSubTableEXT) - -#define GLEW_EXT_color_subtable GLEW_GET_VAR(__GLEW_EXT_color_subtable) - -#endif /* GL_EXT_color_subtable */ - -/* ---------------------- GL_EXT_compiled_vertex_array --------------------- */ - -#ifndef GL_EXT_compiled_vertex_array -#define GL_EXT_compiled_vertex_array 1 - -#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 -#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 - -typedef void (GLAPIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); -typedef void (GLAPIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void); - -#define glLockArraysEXT GLEW_GET_FUN(__glewLockArraysEXT) -#define glUnlockArraysEXT GLEW_GET_FUN(__glewUnlockArraysEXT) - -#define GLEW_EXT_compiled_vertex_array GLEW_GET_VAR(__GLEW_EXT_compiled_vertex_array) - -#endif /* GL_EXT_compiled_vertex_array */ - -/* --------------------------- GL_EXT_convolution -------------------------- */ - -#ifndef GL_EXT_convolution -#define GL_EXT_convolution 1 - -#define GL_CONVOLUTION_1D_EXT 0x8010 -#define GL_CONVOLUTION_2D_EXT 0x8011 -#define GL_SEPARABLE_2D_EXT 0x8012 -#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 -#define GL_REDUCE_EXT 0x8016 -#define GL_CONVOLUTION_FORMAT_EXT 0x8017 -#define GL_CONVOLUTION_WIDTH_EXT 0x8018 -#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 - -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *image); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); -typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); - -#define glConvolutionFilter1DEXT GLEW_GET_FUN(__glewConvolutionFilter1DEXT) -#define glConvolutionFilter2DEXT GLEW_GET_FUN(__glewConvolutionFilter2DEXT) -#define glConvolutionParameterfEXT GLEW_GET_FUN(__glewConvolutionParameterfEXT) -#define glConvolutionParameterfvEXT GLEW_GET_FUN(__glewConvolutionParameterfvEXT) -#define glConvolutionParameteriEXT GLEW_GET_FUN(__glewConvolutionParameteriEXT) -#define glConvolutionParameterivEXT GLEW_GET_FUN(__glewConvolutionParameterivEXT) -#define glCopyConvolutionFilter1DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter1DEXT) -#define glCopyConvolutionFilter2DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter2DEXT) -#define glGetConvolutionFilterEXT GLEW_GET_FUN(__glewGetConvolutionFilterEXT) -#define glGetConvolutionParameterfvEXT GLEW_GET_FUN(__glewGetConvolutionParameterfvEXT) -#define glGetConvolutionParameterivEXT GLEW_GET_FUN(__glewGetConvolutionParameterivEXT) -#define glGetSeparableFilterEXT GLEW_GET_FUN(__glewGetSeparableFilterEXT) -#define glSeparableFilter2DEXT GLEW_GET_FUN(__glewSeparableFilter2DEXT) - -#define GLEW_EXT_convolution GLEW_GET_VAR(__GLEW_EXT_convolution) - -#endif /* GL_EXT_convolution */ - -/* ------------------------ GL_EXT_coordinate_frame ------------------------ */ - -#ifndef GL_EXT_coordinate_frame -#define GL_EXT_coordinate_frame 1 - -#define GL_TANGENT_ARRAY_EXT 0x8439 -#define GL_BINORMAL_ARRAY_EXT 0x843A -#define GL_CURRENT_TANGENT_EXT 0x843B -#define GL_CURRENT_BINORMAL_EXT 0x843C -#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E -#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F -#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 -#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 -#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 -#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 -#define GL_MAP1_TANGENT_EXT 0x8444 -#define GL_MAP2_TANGENT_EXT 0x8445 -#define GL_MAP1_BINORMAL_EXT 0x8446 -#define GL_MAP2_BINORMAL_EXT 0x8447 - -typedef void (GLAPIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, void *pointer); -typedef void (GLAPIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, void *pointer); - -#define glBinormalPointerEXT GLEW_GET_FUN(__glewBinormalPointerEXT) -#define glTangentPointerEXT GLEW_GET_FUN(__glewTangentPointerEXT) - -#define GLEW_EXT_coordinate_frame GLEW_GET_VAR(__GLEW_EXT_coordinate_frame) - -#endif /* GL_EXT_coordinate_frame */ - -/* -------------------------- GL_EXT_copy_texture -------------------------- */ - -#ifndef GL_EXT_copy_texture -#define GL_EXT_copy_texture 1 - -typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); - -#define glCopyTexImage1DEXT GLEW_GET_FUN(__glewCopyTexImage1DEXT) -#define glCopyTexImage2DEXT GLEW_GET_FUN(__glewCopyTexImage2DEXT) -#define glCopyTexSubImage1DEXT GLEW_GET_FUN(__glewCopyTexSubImage1DEXT) -#define glCopyTexSubImage2DEXT GLEW_GET_FUN(__glewCopyTexSubImage2DEXT) -#define glCopyTexSubImage3DEXT GLEW_GET_FUN(__glewCopyTexSubImage3DEXT) - -#define GLEW_EXT_copy_texture GLEW_GET_VAR(__GLEW_EXT_copy_texture) - -#endif /* GL_EXT_copy_texture */ - -/* --------------------------- GL_EXT_cull_vertex -------------------------- */ - -#ifndef GL_EXT_cull_vertex -#define GL_EXT_cull_vertex 1 - -#define GL_CULL_VERTEX_EXT 0x81AA -#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB -#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC - -typedef void (GLAPIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params); - -#define glCullParameterdvEXT GLEW_GET_FUN(__glewCullParameterdvEXT) -#define glCullParameterfvEXT GLEW_GET_FUN(__glewCullParameterfvEXT) - -#define GLEW_EXT_cull_vertex GLEW_GET_VAR(__GLEW_EXT_cull_vertex) - -#endif /* GL_EXT_cull_vertex */ - -/* --------------------------- GL_EXT_debug_label -------------------------- */ - -#ifndef GL_EXT_debug_label -#define GL_EXT_debug_label 1 - -#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F -#define GL_PROGRAM_OBJECT_EXT 0x8B40 -#define GL_SHADER_OBJECT_EXT 0x8B48 -#define GL_BUFFER_OBJECT_EXT 0x9151 -#define GL_QUERY_OBJECT_EXT 0x9153 -#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 - -typedef void (GLAPIENTRY * PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei* length, GLchar *label); -typedef void (GLAPIENTRY * PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar* label); - -#define glGetObjectLabelEXT GLEW_GET_FUN(__glewGetObjectLabelEXT) -#define glLabelObjectEXT GLEW_GET_FUN(__glewLabelObjectEXT) - -#define GLEW_EXT_debug_label GLEW_GET_VAR(__GLEW_EXT_debug_label) - -#endif /* GL_EXT_debug_label */ - -/* -------------------------- GL_EXT_debug_marker -------------------------- */ - -#ifndef GL_EXT_debug_marker -#define GL_EXT_debug_marker 1 - -typedef void (GLAPIENTRY * PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar* marker); -typedef void (GLAPIENTRY * PFNGLPOPGROUPMARKEREXTPROC) (void); -typedef void (GLAPIENTRY * PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar* marker); - -#define glInsertEventMarkerEXT GLEW_GET_FUN(__glewInsertEventMarkerEXT) -#define glPopGroupMarkerEXT GLEW_GET_FUN(__glewPopGroupMarkerEXT) -#define glPushGroupMarkerEXT GLEW_GET_FUN(__glewPushGroupMarkerEXT) - -#define GLEW_EXT_debug_marker GLEW_GET_VAR(__GLEW_EXT_debug_marker) - -#endif /* GL_EXT_debug_marker */ - -/* ------------------------ GL_EXT_depth_bounds_test ----------------------- */ - -#ifndef GL_EXT_depth_bounds_test -#define GL_EXT_depth_bounds_test 1 - -#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 -#define GL_DEPTH_BOUNDS_EXT 0x8891 - -typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); - -#define glDepthBoundsEXT GLEW_GET_FUN(__glewDepthBoundsEXT) - -#define GLEW_EXT_depth_bounds_test GLEW_GET_VAR(__GLEW_EXT_depth_bounds_test) - -#endif /* GL_EXT_depth_bounds_test */ - -/* ----------------------- GL_EXT_direct_state_access ---------------------- */ - -#ifndef GL_EXT_direct_state_access -#define GL_EXT_direct_state_access 1 - -#define GL_PROGRAM_MATRIX_EXT 0x8E2D -#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E -#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F - -typedef void (GLAPIENTRY * PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); -typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); -typedef void (GLAPIENTRY * PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); -typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); -typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); -typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); -typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); -typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); -typedef void (GLAPIENTRY * PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); -typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, void *img); -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, void *img); -typedef void (GLAPIENTRY * PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void** params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); -typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void *string); -typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, void** params); -typedef void (GLAPIENTRY * PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void** params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); -typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void** param); -typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, void** param); -typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); -typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (GLAPIENTRY * PFNGLMATRIXFRUSTUMEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f); -typedef void (GLAPIENTRY * PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum matrixMode); -typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m); -typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXLOADDEXTPROC) (GLenum matrixMode, const GLdouble* m); -typedef void (GLAPIENTRY * PFNGLMATRIXLOADFEXTPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m); -typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXMULTDEXTPROC) (GLenum matrixMode, const GLdouble* m); -typedef void (GLAPIENTRY * PFNGLMATRIXMULTFEXTPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXORTHOEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f); -typedef void (GLAPIENTRY * PFNGLMATRIXPOPEXTPROC) (GLenum matrixMode); -typedef void (GLAPIENTRY * PFNGLMATRIXPUSHEXTPROC) (GLenum matrixMode); -typedef void (GLAPIENTRY * PFNGLMATRIXROTATEDEXTPROC) (GLenum matrixMode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLMATRIXROTATEFEXTPROC) (GLenum matrixMode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLMATRIXSCALEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLMATRIXSCALEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (GLAPIENTRY * PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); -typedef void (GLAPIENTRY * PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* param); -typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* param); -typedef void (GLAPIENTRY * PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); -typedef void (GLAPIENTRY * PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint* params); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint* params); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); -typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); -typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat* param); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* param); -typedef void (GLAPIENTRY * PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC) (GLuint vaobj, GLuint index, GLuint divisor); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); - -#define glBindMultiTextureEXT GLEW_GET_FUN(__glewBindMultiTextureEXT) -#define glCheckNamedFramebufferStatusEXT GLEW_GET_FUN(__glewCheckNamedFramebufferStatusEXT) -#define glClientAttribDefaultEXT GLEW_GET_FUN(__glewClientAttribDefaultEXT) -#define glCompressedMultiTexImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage1DEXT) -#define glCompressedMultiTexImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage2DEXT) -#define glCompressedMultiTexImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage3DEXT) -#define glCompressedMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage1DEXT) -#define glCompressedMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage2DEXT) -#define glCompressedMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage3DEXT) -#define glCompressedTextureImage1DEXT GLEW_GET_FUN(__glewCompressedTextureImage1DEXT) -#define glCompressedTextureImage2DEXT GLEW_GET_FUN(__glewCompressedTextureImage2DEXT) -#define glCompressedTextureImage3DEXT GLEW_GET_FUN(__glewCompressedTextureImage3DEXT) -#define glCompressedTextureSubImage1DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage1DEXT) -#define glCompressedTextureSubImage2DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage2DEXT) -#define glCompressedTextureSubImage3DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage3DEXT) -#define glCopyMultiTexImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexImage1DEXT) -#define glCopyMultiTexImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexImage2DEXT) -#define glCopyMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage1DEXT) -#define glCopyMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage2DEXT) -#define glCopyMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage3DEXT) -#define glCopyTextureImage1DEXT GLEW_GET_FUN(__glewCopyTextureImage1DEXT) -#define glCopyTextureImage2DEXT GLEW_GET_FUN(__glewCopyTextureImage2DEXT) -#define glCopyTextureSubImage1DEXT GLEW_GET_FUN(__glewCopyTextureSubImage1DEXT) -#define glCopyTextureSubImage2DEXT GLEW_GET_FUN(__glewCopyTextureSubImage2DEXT) -#define glCopyTextureSubImage3DEXT GLEW_GET_FUN(__glewCopyTextureSubImage3DEXT) -#define glDisableClientStateIndexedEXT GLEW_GET_FUN(__glewDisableClientStateIndexedEXT) -#define glDisableClientStateiEXT GLEW_GET_FUN(__glewDisableClientStateiEXT) -#define glDisableVertexArrayAttribEXT GLEW_GET_FUN(__glewDisableVertexArrayAttribEXT) -#define glDisableVertexArrayEXT GLEW_GET_FUN(__glewDisableVertexArrayEXT) -#define glEnableClientStateIndexedEXT GLEW_GET_FUN(__glewEnableClientStateIndexedEXT) -#define glEnableClientStateiEXT GLEW_GET_FUN(__glewEnableClientStateiEXT) -#define glEnableVertexArrayAttribEXT GLEW_GET_FUN(__glewEnableVertexArrayAttribEXT) -#define glEnableVertexArrayEXT GLEW_GET_FUN(__glewEnableVertexArrayEXT) -#define glFlushMappedNamedBufferRangeEXT GLEW_GET_FUN(__glewFlushMappedNamedBufferRangeEXT) -#define glFramebufferDrawBufferEXT GLEW_GET_FUN(__glewFramebufferDrawBufferEXT) -#define glFramebufferDrawBuffersEXT GLEW_GET_FUN(__glewFramebufferDrawBuffersEXT) -#define glFramebufferReadBufferEXT GLEW_GET_FUN(__glewFramebufferReadBufferEXT) -#define glGenerateMultiTexMipmapEXT GLEW_GET_FUN(__glewGenerateMultiTexMipmapEXT) -#define glGenerateTextureMipmapEXT GLEW_GET_FUN(__glewGenerateTextureMipmapEXT) -#define glGetCompressedMultiTexImageEXT GLEW_GET_FUN(__glewGetCompressedMultiTexImageEXT) -#define glGetCompressedTextureImageEXT GLEW_GET_FUN(__glewGetCompressedTextureImageEXT) -#define glGetDoubleIndexedvEXT GLEW_GET_FUN(__glewGetDoubleIndexedvEXT) -#define glGetDoublei_vEXT GLEW_GET_FUN(__glewGetDoublei_vEXT) -#define glGetFloatIndexedvEXT GLEW_GET_FUN(__glewGetFloatIndexedvEXT) -#define glGetFloati_vEXT GLEW_GET_FUN(__glewGetFloati_vEXT) -#define glGetFramebufferParameterivEXT GLEW_GET_FUN(__glewGetFramebufferParameterivEXT) -#define glGetMultiTexEnvfvEXT GLEW_GET_FUN(__glewGetMultiTexEnvfvEXT) -#define glGetMultiTexEnvivEXT GLEW_GET_FUN(__glewGetMultiTexEnvivEXT) -#define glGetMultiTexGendvEXT GLEW_GET_FUN(__glewGetMultiTexGendvEXT) -#define glGetMultiTexGenfvEXT GLEW_GET_FUN(__glewGetMultiTexGenfvEXT) -#define glGetMultiTexGenivEXT GLEW_GET_FUN(__glewGetMultiTexGenivEXT) -#define glGetMultiTexImageEXT GLEW_GET_FUN(__glewGetMultiTexImageEXT) -#define glGetMultiTexLevelParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterfvEXT) -#define glGetMultiTexLevelParameterivEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterivEXT) -#define glGetMultiTexParameterIivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIivEXT) -#define glGetMultiTexParameterIuivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIuivEXT) -#define glGetMultiTexParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexParameterfvEXT) -#define glGetMultiTexParameterivEXT GLEW_GET_FUN(__glewGetMultiTexParameterivEXT) -#define glGetNamedBufferParameterivEXT GLEW_GET_FUN(__glewGetNamedBufferParameterivEXT) -#define glGetNamedBufferPointervEXT GLEW_GET_FUN(__glewGetNamedBufferPointervEXT) -#define glGetNamedBufferSubDataEXT GLEW_GET_FUN(__glewGetNamedBufferSubDataEXT) -#define glGetNamedFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferAttachmentParameterivEXT) -#define glGetNamedProgramLocalParameterIivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIivEXT) -#define glGetNamedProgramLocalParameterIuivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIuivEXT) -#define glGetNamedProgramLocalParameterdvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterdvEXT) -#define glGetNamedProgramLocalParameterfvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterfvEXT) -#define glGetNamedProgramStringEXT GLEW_GET_FUN(__glewGetNamedProgramStringEXT) -#define glGetNamedProgramivEXT GLEW_GET_FUN(__glewGetNamedProgramivEXT) -#define glGetNamedRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetNamedRenderbufferParameterivEXT) -#define glGetPointerIndexedvEXT GLEW_GET_FUN(__glewGetPointerIndexedvEXT) -#define glGetPointeri_vEXT GLEW_GET_FUN(__glewGetPointeri_vEXT) -#define glGetTextureImageEXT GLEW_GET_FUN(__glewGetTextureImageEXT) -#define glGetTextureLevelParameterfvEXT GLEW_GET_FUN(__glewGetTextureLevelParameterfvEXT) -#define glGetTextureLevelParameterivEXT GLEW_GET_FUN(__glewGetTextureLevelParameterivEXT) -#define glGetTextureParameterIivEXT GLEW_GET_FUN(__glewGetTextureParameterIivEXT) -#define glGetTextureParameterIuivEXT GLEW_GET_FUN(__glewGetTextureParameterIuivEXT) -#define glGetTextureParameterfvEXT GLEW_GET_FUN(__glewGetTextureParameterfvEXT) -#define glGetTextureParameterivEXT GLEW_GET_FUN(__glewGetTextureParameterivEXT) -#define glGetVertexArrayIntegeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayIntegeri_vEXT) -#define glGetVertexArrayIntegervEXT GLEW_GET_FUN(__glewGetVertexArrayIntegervEXT) -#define glGetVertexArrayPointeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayPointeri_vEXT) -#define glGetVertexArrayPointervEXT GLEW_GET_FUN(__glewGetVertexArrayPointervEXT) -#define glMapNamedBufferEXT GLEW_GET_FUN(__glewMapNamedBufferEXT) -#define glMapNamedBufferRangeEXT GLEW_GET_FUN(__glewMapNamedBufferRangeEXT) -#define glMatrixFrustumEXT GLEW_GET_FUN(__glewMatrixFrustumEXT) -#define glMatrixLoadIdentityEXT GLEW_GET_FUN(__glewMatrixLoadIdentityEXT) -#define glMatrixLoadTransposedEXT GLEW_GET_FUN(__glewMatrixLoadTransposedEXT) -#define glMatrixLoadTransposefEXT GLEW_GET_FUN(__glewMatrixLoadTransposefEXT) -#define glMatrixLoaddEXT GLEW_GET_FUN(__glewMatrixLoaddEXT) -#define glMatrixLoadfEXT GLEW_GET_FUN(__glewMatrixLoadfEXT) -#define glMatrixMultTransposedEXT GLEW_GET_FUN(__glewMatrixMultTransposedEXT) -#define glMatrixMultTransposefEXT GLEW_GET_FUN(__glewMatrixMultTransposefEXT) -#define glMatrixMultdEXT GLEW_GET_FUN(__glewMatrixMultdEXT) -#define glMatrixMultfEXT GLEW_GET_FUN(__glewMatrixMultfEXT) -#define glMatrixOrthoEXT GLEW_GET_FUN(__glewMatrixOrthoEXT) -#define glMatrixPopEXT GLEW_GET_FUN(__glewMatrixPopEXT) -#define glMatrixPushEXT GLEW_GET_FUN(__glewMatrixPushEXT) -#define glMatrixRotatedEXT GLEW_GET_FUN(__glewMatrixRotatedEXT) -#define glMatrixRotatefEXT GLEW_GET_FUN(__glewMatrixRotatefEXT) -#define glMatrixScaledEXT GLEW_GET_FUN(__glewMatrixScaledEXT) -#define glMatrixScalefEXT GLEW_GET_FUN(__glewMatrixScalefEXT) -#define glMatrixTranslatedEXT GLEW_GET_FUN(__glewMatrixTranslatedEXT) -#define glMatrixTranslatefEXT GLEW_GET_FUN(__glewMatrixTranslatefEXT) -#define glMultiTexBufferEXT GLEW_GET_FUN(__glewMultiTexBufferEXT) -#define glMultiTexCoordPointerEXT GLEW_GET_FUN(__glewMultiTexCoordPointerEXT) -#define glMultiTexEnvfEXT GLEW_GET_FUN(__glewMultiTexEnvfEXT) -#define glMultiTexEnvfvEXT GLEW_GET_FUN(__glewMultiTexEnvfvEXT) -#define glMultiTexEnviEXT GLEW_GET_FUN(__glewMultiTexEnviEXT) -#define glMultiTexEnvivEXT GLEW_GET_FUN(__glewMultiTexEnvivEXT) -#define glMultiTexGendEXT GLEW_GET_FUN(__glewMultiTexGendEXT) -#define glMultiTexGendvEXT GLEW_GET_FUN(__glewMultiTexGendvEXT) -#define glMultiTexGenfEXT GLEW_GET_FUN(__glewMultiTexGenfEXT) -#define glMultiTexGenfvEXT GLEW_GET_FUN(__glewMultiTexGenfvEXT) -#define glMultiTexGeniEXT GLEW_GET_FUN(__glewMultiTexGeniEXT) -#define glMultiTexGenivEXT GLEW_GET_FUN(__glewMultiTexGenivEXT) -#define glMultiTexImage1DEXT GLEW_GET_FUN(__glewMultiTexImage1DEXT) -#define glMultiTexImage2DEXT GLEW_GET_FUN(__glewMultiTexImage2DEXT) -#define glMultiTexImage3DEXT GLEW_GET_FUN(__glewMultiTexImage3DEXT) -#define glMultiTexParameterIivEXT GLEW_GET_FUN(__glewMultiTexParameterIivEXT) -#define glMultiTexParameterIuivEXT GLEW_GET_FUN(__glewMultiTexParameterIuivEXT) -#define glMultiTexParameterfEXT GLEW_GET_FUN(__glewMultiTexParameterfEXT) -#define glMultiTexParameterfvEXT GLEW_GET_FUN(__glewMultiTexParameterfvEXT) -#define glMultiTexParameteriEXT GLEW_GET_FUN(__glewMultiTexParameteriEXT) -#define glMultiTexParameterivEXT GLEW_GET_FUN(__glewMultiTexParameterivEXT) -#define glMultiTexRenderbufferEXT GLEW_GET_FUN(__glewMultiTexRenderbufferEXT) -#define glMultiTexSubImage1DEXT GLEW_GET_FUN(__glewMultiTexSubImage1DEXT) -#define glMultiTexSubImage2DEXT GLEW_GET_FUN(__glewMultiTexSubImage2DEXT) -#define glMultiTexSubImage3DEXT GLEW_GET_FUN(__glewMultiTexSubImage3DEXT) -#define glNamedBufferDataEXT GLEW_GET_FUN(__glewNamedBufferDataEXT) -#define glNamedBufferSubDataEXT GLEW_GET_FUN(__glewNamedBufferSubDataEXT) -#define glNamedCopyBufferSubDataEXT GLEW_GET_FUN(__glewNamedCopyBufferSubDataEXT) -#define glNamedFramebufferRenderbufferEXT GLEW_GET_FUN(__glewNamedFramebufferRenderbufferEXT) -#define glNamedFramebufferTexture1DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture1DEXT) -#define glNamedFramebufferTexture2DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture2DEXT) -#define glNamedFramebufferTexture3DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture3DEXT) -#define glNamedFramebufferTextureEXT GLEW_GET_FUN(__glewNamedFramebufferTextureEXT) -#define glNamedFramebufferTextureFaceEXT GLEW_GET_FUN(__glewNamedFramebufferTextureFaceEXT) -#define glNamedFramebufferTextureLayerEXT GLEW_GET_FUN(__glewNamedFramebufferTextureLayerEXT) -#define glNamedProgramLocalParameter4dEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dEXT) -#define glNamedProgramLocalParameter4dvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dvEXT) -#define glNamedProgramLocalParameter4fEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fEXT) -#define glNamedProgramLocalParameter4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fvEXT) -#define glNamedProgramLocalParameterI4iEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4iEXT) -#define glNamedProgramLocalParameterI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4ivEXT) -#define glNamedProgramLocalParameterI4uiEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uiEXT) -#define glNamedProgramLocalParameterI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uivEXT) -#define glNamedProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameters4fvEXT) -#define glNamedProgramLocalParametersI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4ivEXT) -#define glNamedProgramLocalParametersI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4uivEXT) -#define glNamedProgramStringEXT GLEW_GET_FUN(__glewNamedProgramStringEXT) -#define glNamedRenderbufferStorageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageEXT) -#define glNamedRenderbufferStorageMultisampleCoverageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleCoverageEXT) -#define glNamedRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleEXT) -#define glProgramUniform1fEXT GLEW_GET_FUN(__glewProgramUniform1fEXT) -#define glProgramUniform1fvEXT GLEW_GET_FUN(__glewProgramUniform1fvEXT) -#define glProgramUniform1iEXT GLEW_GET_FUN(__glewProgramUniform1iEXT) -#define glProgramUniform1ivEXT GLEW_GET_FUN(__glewProgramUniform1ivEXT) -#define glProgramUniform1uiEXT GLEW_GET_FUN(__glewProgramUniform1uiEXT) -#define glProgramUniform1uivEXT GLEW_GET_FUN(__glewProgramUniform1uivEXT) -#define glProgramUniform2fEXT GLEW_GET_FUN(__glewProgramUniform2fEXT) -#define glProgramUniform2fvEXT GLEW_GET_FUN(__glewProgramUniform2fvEXT) -#define glProgramUniform2iEXT GLEW_GET_FUN(__glewProgramUniform2iEXT) -#define glProgramUniform2ivEXT GLEW_GET_FUN(__glewProgramUniform2ivEXT) -#define glProgramUniform2uiEXT GLEW_GET_FUN(__glewProgramUniform2uiEXT) -#define glProgramUniform2uivEXT GLEW_GET_FUN(__glewProgramUniform2uivEXT) -#define glProgramUniform3fEXT GLEW_GET_FUN(__glewProgramUniform3fEXT) -#define glProgramUniform3fvEXT GLEW_GET_FUN(__glewProgramUniform3fvEXT) -#define glProgramUniform3iEXT GLEW_GET_FUN(__glewProgramUniform3iEXT) -#define glProgramUniform3ivEXT GLEW_GET_FUN(__glewProgramUniform3ivEXT) -#define glProgramUniform3uiEXT GLEW_GET_FUN(__glewProgramUniform3uiEXT) -#define glProgramUniform3uivEXT GLEW_GET_FUN(__glewProgramUniform3uivEXT) -#define glProgramUniform4fEXT GLEW_GET_FUN(__glewProgramUniform4fEXT) -#define glProgramUniform4fvEXT GLEW_GET_FUN(__glewProgramUniform4fvEXT) -#define glProgramUniform4iEXT GLEW_GET_FUN(__glewProgramUniform4iEXT) -#define glProgramUniform4ivEXT GLEW_GET_FUN(__glewProgramUniform4ivEXT) -#define glProgramUniform4uiEXT GLEW_GET_FUN(__glewProgramUniform4uiEXT) -#define glProgramUniform4uivEXT GLEW_GET_FUN(__glewProgramUniform4uivEXT) -#define glProgramUniformMatrix2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2fvEXT) -#define glProgramUniformMatrix2x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x3fvEXT) -#define glProgramUniformMatrix2x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x4fvEXT) -#define glProgramUniformMatrix3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3fvEXT) -#define glProgramUniformMatrix3x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x2fvEXT) -#define glProgramUniformMatrix3x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x4fvEXT) -#define glProgramUniformMatrix4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4fvEXT) -#define glProgramUniformMatrix4x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x2fvEXT) -#define glProgramUniformMatrix4x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x3fvEXT) -#define glPushClientAttribDefaultEXT GLEW_GET_FUN(__glewPushClientAttribDefaultEXT) -#define glTextureBufferEXT GLEW_GET_FUN(__glewTextureBufferEXT) -#define glTextureImage1DEXT GLEW_GET_FUN(__glewTextureImage1DEXT) -#define glTextureImage2DEXT GLEW_GET_FUN(__glewTextureImage2DEXT) -#define glTextureImage3DEXT GLEW_GET_FUN(__glewTextureImage3DEXT) -#define glTextureParameterIivEXT GLEW_GET_FUN(__glewTextureParameterIivEXT) -#define glTextureParameterIuivEXT GLEW_GET_FUN(__glewTextureParameterIuivEXT) -#define glTextureParameterfEXT GLEW_GET_FUN(__glewTextureParameterfEXT) -#define glTextureParameterfvEXT GLEW_GET_FUN(__glewTextureParameterfvEXT) -#define glTextureParameteriEXT GLEW_GET_FUN(__glewTextureParameteriEXT) -#define glTextureParameterivEXT GLEW_GET_FUN(__glewTextureParameterivEXT) -#define glTextureRenderbufferEXT GLEW_GET_FUN(__glewTextureRenderbufferEXT) -#define glTextureSubImage1DEXT GLEW_GET_FUN(__glewTextureSubImage1DEXT) -#define glTextureSubImage2DEXT GLEW_GET_FUN(__glewTextureSubImage2DEXT) -#define glTextureSubImage3DEXT GLEW_GET_FUN(__glewTextureSubImage3DEXT) -#define glUnmapNamedBufferEXT GLEW_GET_FUN(__glewUnmapNamedBufferEXT) -#define glVertexArrayColorOffsetEXT GLEW_GET_FUN(__glewVertexArrayColorOffsetEXT) -#define glVertexArrayEdgeFlagOffsetEXT GLEW_GET_FUN(__glewVertexArrayEdgeFlagOffsetEXT) -#define glVertexArrayFogCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayFogCoordOffsetEXT) -#define glVertexArrayIndexOffsetEXT GLEW_GET_FUN(__glewVertexArrayIndexOffsetEXT) -#define glVertexArrayMultiTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayMultiTexCoordOffsetEXT) -#define glVertexArrayNormalOffsetEXT GLEW_GET_FUN(__glewVertexArrayNormalOffsetEXT) -#define glVertexArraySecondaryColorOffsetEXT GLEW_GET_FUN(__glewVertexArraySecondaryColorOffsetEXT) -#define glVertexArrayTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayTexCoordOffsetEXT) -#define glVertexArrayVertexAttribDivisorEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribDivisorEXT) -#define glVertexArrayVertexAttribIOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIOffsetEXT) -#define glVertexArrayVertexAttribOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribOffsetEXT) -#define glVertexArrayVertexOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexOffsetEXT) - -#define GLEW_EXT_direct_state_access GLEW_GET_VAR(__GLEW_EXT_direct_state_access) - -#endif /* GL_EXT_direct_state_access */ - -/* -------------------------- GL_EXT_draw_buffers2 ------------------------- */ - -#ifndef GL_EXT_draw_buffers2 -#define GL_EXT_draw_buffers2 1 - -typedef void (GLAPIENTRY * PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef void (GLAPIENTRY * PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); -typedef void (GLAPIENTRY * PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum value, GLuint index, GLboolean* data); -typedef void (GLAPIENTRY * PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum value, GLuint index, GLint* data); -typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); - -#define glColorMaskIndexedEXT GLEW_GET_FUN(__glewColorMaskIndexedEXT) -#define glDisableIndexedEXT GLEW_GET_FUN(__glewDisableIndexedEXT) -#define glEnableIndexedEXT GLEW_GET_FUN(__glewEnableIndexedEXT) -#define glGetBooleanIndexedvEXT GLEW_GET_FUN(__glewGetBooleanIndexedvEXT) -#define glGetIntegerIndexedvEXT GLEW_GET_FUN(__glewGetIntegerIndexedvEXT) -#define glIsEnabledIndexedEXT GLEW_GET_FUN(__glewIsEnabledIndexedEXT) - -#define GLEW_EXT_draw_buffers2 GLEW_GET_VAR(__GLEW_EXT_draw_buffers2) - -#endif /* GL_EXT_draw_buffers2 */ - -/* ------------------------- GL_EXT_draw_instanced ------------------------- */ - -#ifndef GL_EXT_draw_instanced -#define GL_EXT_draw_instanced 1 - -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); - -#define glDrawArraysInstancedEXT GLEW_GET_FUN(__glewDrawArraysInstancedEXT) -#define glDrawElementsInstancedEXT GLEW_GET_FUN(__glewDrawElementsInstancedEXT) - -#define GLEW_EXT_draw_instanced GLEW_GET_VAR(__GLEW_EXT_draw_instanced) - -#endif /* GL_EXT_draw_instanced */ - -/* ----------------------- GL_EXT_draw_range_elements ---------------------- */ - -#ifndef GL_EXT_draw_range_elements -#define GL_EXT_draw_range_elements 1 - -#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 -#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 - -typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); - -#define glDrawRangeElementsEXT GLEW_GET_FUN(__glewDrawRangeElementsEXT) - -#define GLEW_EXT_draw_range_elements GLEW_GET_VAR(__GLEW_EXT_draw_range_elements) - -#endif /* GL_EXT_draw_range_elements */ - -/* ---------------------------- GL_EXT_fog_coord --------------------------- */ - -#ifndef GL_EXT_fog_coord -#define GL_EXT_fog_coord 1 - -#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 -#define GL_FOG_COORDINATE_EXT 0x8451 -#define GL_FRAGMENT_DEPTH_EXT 0x8452 -#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 -#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 - -typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); -typedef void (GLAPIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); - -#define glFogCoordPointerEXT GLEW_GET_FUN(__glewFogCoordPointerEXT) -#define glFogCoorddEXT GLEW_GET_FUN(__glewFogCoorddEXT) -#define glFogCoorddvEXT GLEW_GET_FUN(__glewFogCoorddvEXT) -#define glFogCoordfEXT GLEW_GET_FUN(__glewFogCoordfEXT) -#define glFogCoordfvEXT GLEW_GET_FUN(__glewFogCoordfvEXT) - -#define GLEW_EXT_fog_coord GLEW_GET_VAR(__GLEW_EXT_fog_coord) - -#endif /* GL_EXT_fog_coord */ - -/* ------------------------ GL_EXT_fragment_lighting ----------------------- */ - -#ifndef GL_EXT_fragment_lighting -#define GL_EXT_fragment_lighting 1 - -#define GL_FRAGMENT_LIGHTING_EXT 0x8400 -#define GL_FRAGMENT_COLOR_MATERIAL_EXT 0x8401 -#define GL_FRAGMENT_COLOR_MATERIAL_FACE_EXT 0x8402 -#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_EXT 0x8403 -#define GL_MAX_FRAGMENT_LIGHTS_EXT 0x8404 -#define GL_MAX_ACTIVE_LIGHTS_EXT 0x8405 -#define GL_CURRENT_RASTER_NORMAL_EXT 0x8406 -#define GL_LIGHT_ENV_MODE_EXT 0x8407 -#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_EXT 0x8408 -#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_EXT 0x8409 -#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_EXT 0x840A -#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_EXT 0x840B -#define GL_FRAGMENT_LIGHT0_EXT 0x840C -#define GL_FRAGMENT_LIGHT7_EXT 0x8413 - -typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALEXTPROC) (GLenum face, GLenum mode); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFEXTPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVEXTPROC) (GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIEXTPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVEXTPROC) (GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFEXTPROC) (GLenum light, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIEXTPROC) (GLenum light, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFEXTPROC) (GLenum face, GLenum pname, const GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIEXTPROC) (GLenum face, GLenum pname, const GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLLIGHTENVIEXTPROC) (GLenum pname, GLint param); - -#define glFragmentColorMaterialEXT GLEW_GET_FUN(__glewFragmentColorMaterialEXT) -#define glFragmentLightModelfEXT GLEW_GET_FUN(__glewFragmentLightModelfEXT) -#define glFragmentLightModelfvEXT GLEW_GET_FUN(__glewFragmentLightModelfvEXT) -#define glFragmentLightModeliEXT GLEW_GET_FUN(__glewFragmentLightModeliEXT) -#define glFragmentLightModelivEXT GLEW_GET_FUN(__glewFragmentLightModelivEXT) -#define glFragmentLightfEXT GLEW_GET_FUN(__glewFragmentLightfEXT) -#define glFragmentLightfvEXT GLEW_GET_FUN(__glewFragmentLightfvEXT) -#define glFragmentLightiEXT GLEW_GET_FUN(__glewFragmentLightiEXT) -#define glFragmentLightivEXT GLEW_GET_FUN(__glewFragmentLightivEXT) -#define glFragmentMaterialfEXT GLEW_GET_FUN(__glewFragmentMaterialfEXT) -#define glFragmentMaterialfvEXT GLEW_GET_FUN(__glewFragmentMaterialfvEXT) -#define glFragmentMaterialiEXT GLEW_GET_FUN(__glewFragmentMaterialiEXT) -#define glFragmentMaterialivEXT GLEW_GET_FUN(__glewFragmentMaterialivEXT) -#define glGetFragmentLightfvEXT GLEW_GET_FUN(__glewGetFragmentLightfvEXT) -#define glGetFragmentLightivEXT GLEW_GET_FUN(__glewGetFragmentLightivEXT) -#define glGetFragmentMaterialfvEXT GLEW_GET_FUN(__glewGetFragmentMaterialfvEXT) -#define glGetFragmentMaterialivEXT GLEW_GET_FUN(__glewGetFragmentMaterialivEXT) -#define glLightEnviEXT GLEW_GET_FUN(__glewLightEnviEXT) - -#define GLEW_EXT_fragment_lighting GLEW_GET_VAR(__GLEW_EXT_fragment_lighting) - -#endif /* GL_EXT_fragment_lighting */ - -/* ------------------------ GL_EXT_framebuffer_blit ------------------------ */ - -#ifndef GL_EXT_framebuffer_blit -#define GL_EXT_framebuffer_blit 1 - -#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 -#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA - -typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); - -#define glBlitFramebufferEXT GLEW_GET_FUN(__glewBlitFramebufferEXT) - -#define GLEW_EXT_framebuffer_blit GLEW_GET_VAR(__GLEW_EXT_framebuffer_blit) - -#endif /* GL_EXT_framebuffer_blit */ - -/* --------------------- GL_EXT_framebuffer_multisample -------------------- */ - -#ifndef GL_EXT_framebuffer_multisample -#define GL_EXT_framebuffer_multisample 1 - -#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 -#define GL_MAX_SAMPLES_EXT 0x8D57 - -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - -#define glRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewRenderbufferStorageMultisampleEXT) - -#define GLEW_EXT_framebuffer_multisample GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample) - -#endif /* GL_EXT_framebuffer_multisample */ - -/* --------------- GL_EXT_framebuffer_multisample_blit_scaled -------------- */ - -#ifndef GL_EXT_framebuffer_multisample_blit_scaled -#define GL_EXT_framebuffer_multisample_blit_scaled 1 - -#define GL_SCALED_RESOLVE_FASTEST_EXT 0x90BA -#define GL_SCALED_RESOLVE_NICEST_EXT 0x90BB - -#define GLEW_EXT_framebuffer_multisample_blit_scaled GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample_blit_scaled) - -#endif /* GL_EXT_framebuffer_multisample_blit_scaled */ - -/* ----------------------- GL_EXT_framebuffer_object ----------------------- */ - -#ifndef GL_EXT_framebuffer_object -#define GL_EXT_framebuffer_object 1 - -#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 -#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 -#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 -#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 -#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD -#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF -#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 -#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 -#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 -#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 -#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 -#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 -#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 -#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 -#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 -#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 -#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA -#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB -#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC -#define GL_COLOR_ATTACHMENT13_EXT 0x8CED -#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE -#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF -#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 -#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 -#define GL_FRAMEBUFFER_EXT 0x8D40 -#define GL_RENDERBUFFER_EXT 0x8D41 -#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 -#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 -#define GL_STENCIL_INDEX1_EXT 0x8D46 -#define GL_STENCIL_INDEX4_EXT 0x8D47 -#define GL_STENCIL_INDEX8_EXT 0x8D48 -#define GL_STENCIL_INDEX16_EXT 0x8D49 -#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 - -typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); -typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); -typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint* framebuffers); -typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint* renderbuffers); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint* framebuffers); -typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint* renderbuffers); -typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); -typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); - -#define glBindFramebufferEXT GLEW_GET_FUN(__glewBindFramebufferEXT) -#define glBindRenderbufferEXT GLEW_GET_FUN(__glewBindRenderbufferEXT) -#define glCheckFramebufferStatusEXT GLEW_GET_FUN(__glewCheckFramebufferStatusEXT) -#define glDeleteFramebuffersEXT GLEW_GET_FUN(__glewDeleteFramebuffersEXT) -#define glDeleteRenderbuffersEXT GLEW_GET_FUN(__glewDeleteRenderbuffersEXT) -#define glFramebufferRenderbufferEXT GLEW_GET_FUN(__glewFramebufferRenderbufferEXT) -#define glFramebufferTexture1DEXT GLEW_GET_FUN(__glewFramebufferTexture1DEXT) -#define glFramebufferTexture2DEXT GLEW_GET_FUN(__glewFramebufferTexture2DEXT) -#define glFramebufferTexture3DEXT GLEW_GET_FUN(__glewFramebufferTexture3DEXT) -#define glGenFramebuffersEXT GLEW_GET_FUN(__glewGenFramebuffersEXT) -#define glGenRenderbuffersEXT GLEW_GET_FUN(__glewGenRenderbuffersEXT) -#define glGenerateMipmapEXT GLEW_GET_FUN(__glewGenerateMipmapEXT) -#define glGetFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetFramebufferAttachmentParameterivEXT) -#define glGetRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetRenderbufferParameterivEXT) -#define glIsFramebufferEXT GLEW_GET_FUN(__glewIsFramebufferEXT) -#define glIsRenderbufferEXT GLEW_GET_FUN(__glewIsRenderbufferEXT) -#define glRenderbufferStorageEXT GLEW_GET_FUN(__glewRenderbufferStorageEXT) - -#define GLEW_EXT_framebuffer_object GLEW_GET_VAR(__GLEW_EXT_framebuffer_object) - -#endif /* GL_EXT_framebuffer_object */ - -/* ------------------------ GL_EXT_framebuffer_sRGB ------------------------ */ - -#ifndef GL_EXT_framebuffer_sRGB -#define GL_EXT_framebuffer_sRGB 1 - -#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 -#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA - -#define GLEW_EXT_framebuffer_sRGB GLEW_GET_VAR(__GLEW_EXT_framebuffer_sRGB) - -#endif /* GL_EXT_framebuffer_sRGB */ - -/* ------------------------ GL_EXT_geometry_shader4 ------------------------ */ - -#ifndef GL_EXT_geometry_shader4 -#define GL_EXT_geometry_shader4 1 - -#define GL_LINES_ADJACENCY_EXT 0xA -#define GL_LINE_STRIP_ADJACENCY_EXT 0xB -#define GL_TRIANGLES_ADJACENCY_EXT 0xC -#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD -#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 -#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 -#define GL_GEOMETRY_SHADER_EXT 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA -#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB -#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC -#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD -#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); - -#define glFramebufferTextureEXT GLEW_GET_FUN(__glewFramebufferTextureEXT) -#define glFramebufferTextureFaceEXT GLEW_GET_FUN(__glewFramebufferTextureFaceEXT) -#define glProgramParameteriEXT GLEW_GET_FUN(__glewProgramParameteriEXT) - -#define GLEW_EXT_geometry_shader4 GLEW_GET_VAR(__GLEW_EXT_geometry_shader4) - -#endif /* GL_EXT_geometry_shader4 */ - -/* --------------------- GL_EXT_gpu_program_parameters --------------------- */ - -#ifndef GL_EXT_gpu_program_parameters -#define GL_EXT_gpu_program_parameters 1 - -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); - -#define glProgramEnvParameters4fvEXT GLEW_GET_FUN(__glewProgramEnvParameters4fvEXT) -#define glProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewProgramLocalParameters4fvEXT) - -#define GLEW_EXT_gpu_program_parameters GLEW_GET_VAR(__GLEW_EXT_gpu_program_parameters) - -#endif /* GL_EXT_gpu_program_parameters */ - -/* --------------------------- GL_EXT_gpu_shader4 -------------------------- */ - -#ifndef GL_EXT_gpu_shader4 -#define GL_EXT_gpu_shader4 1 - -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD -#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 -#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 -#define GL_SAMPLER_BUFFER_EXT 0x8DC2 -#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 -#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 -#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 -#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 -#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 -#define GL_INT_SAMPLER_1D_EXT 0x8DC9 -#define GL_INT_SAMPLER_2D_EXT 0x8DCA -#define GL_INT_SAMPLER_3D_EXT 0x8DCB -#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC -#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD -#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE -#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF -#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 -#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 -#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 - -typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); -typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); - -#define glBindFragDataLocationEXT GLEW_GET_FUN(__glewBindFragDataLocationEXT) -#define glGetFragDataLocationEXT GLEW_GET_FUN(__glewGetFragDataLocationEXT) -#define glGetUniformuivEXT GLEW_GET_FUN(__glewGetUniformuivEXT) -#define glGetVertexAttribIivEXT GLEW_GET_FUN(__glewGetVertexAttribIivEXT) -#define glGetVertexAttribIuivEXT GLEW_GET_FUN(__glewGetVertexAttribIuivEXT) -#define glUniform1uiEXT GLEW_GET_FUN(__glewUniform1uiEXT) -#define glUniform1uivEXT GLEW_GET_FUN(__glewUniform1uivEXT) -#define glUniform2uiEXT GLEW_GET_FUN(__glewUniform2uiEXT) -#define glUniform2uivEXT GLEW_GET_FUN(__glewUniform2uivEXT) -#define glUniform3uiEXT GLEW_GET_FUN(__glewUniform3uiEXT) -#define glUniform3uivEXT GLEW_GET_FUN(__glewUniform3uivEXT) -#define glUniform4uiEXT GLEW_GET_FUN(__glewUniform4uiEXT) -#define glUniform4uivEXT GLEW_GET_FUN(__glewUniform4uivEXT) -#define glVertexAttribI1iEXT GLEW_GET_FUN(__glewVertexAttribI1iEXT) -#define glVertexAttribI1ivEXT GLEW_GET_FUN(__glewVertexAttribI1ivEXT) -#define glVertexAttribI1uiEXT GLEW_GET_FUN(__glewVertexAttribI1uiEXT) -#define glVertexAttribI1uivEXT GLEW_GET_FUN(__glewVertexAttribI1uivEXT) -#define glVertexAttribI2iEXT GLEW_GET_FUN(__glewVertexAttribI2iEXT) -#define glVertexAttribI2ivEXT GLEW_GET_FUN(__glewVertexAttribI2ivEXT) -#define glVertexAttribI2uiEXT GLEW_GET_FUN(__glewVertexAttribI2uiEXT) -#define glVertexAttribI2uivEXT GLEW_GET_FUN(__glewVertexAttribI2uivEXT) -#define glVertexAttribI3iEXT GLEW_GET_FUN(__glewVertexAttribI3iEXT) -#define glVertexAttribI3ivEXT GLEW_GET_FUN(__glewVertexAttribI3ivEXT) -#define glVertexAttribI3uiEXT GLEW_GET_FUN(__glewVertexAttribI3uiEXT) -#define glVertexAttribI3uivEXT GLEW_GET_FUN(__glewVertexAttribI3uivEXT) -#define glVertexAttribI4bvEXT GLEW_GET_FUN(__glewVertexAttribI4bvEXT) -#define glVertexAttribI4iEXT GLEW_GET_FUN(__glewVertexAttribI4iEXT) -#define glVertexAttribI4ivEXT GLEW_GET_FUN(__glewVertexAttribI4ivEXT) -#define glVertexAttribI4svEXT GLEW_GET_FUN(__glewVertexAttribI4svEXT) -#define glVertexAttribI4ubvEXT GLEW_GET_FUN(__glewVertexAttribI4ubvEXT) -#define glVertexAttribI4uiEXT GLEW_GET_FUN(__glewVertexAttribI4uiEXT) -#define glVertexAttribI4uivEXT GLEW_GET_FUN(__glewVertexAttribI4uivEXT) -#define glVertexAttribI4usvEXT GLEW_GET_FUN(__glewVertexAttribI4usvEXT) -#define glVertexAttribIPointerEXT GLEW_GET_FUN(__glewVertexAttribIPointerEXT) - -#define GLEW_EXT_gpu_shader4 GLEW_GET_VAR(__GLEW_EXT_gpu_shader4) - -#endif /* GL_EXT_gpu_shader4 */ - -/* ---------------------------- GL_EXT_histogram --------------------------- */ - -#ifndef GL_EXT_histogram -#define GL_EXT_histogram 1 - -#define GL_HISTOGRAM_EXT 0x8024 -#define GL_PROXY_HISTOGRAM_EXT 0x8025 -#define GL_HISTOGRAM_WIDTH_EXT 0x8026 -#define GL_HISTOGRAM_FORMAT_EXT 0x8027 -#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C -#define GL_HISTOGRAM_SINK_EXT 0x802D -#define GL_MINMAX_EXT 0x802E -#define GL_MINMAX_FORMAT_EXT 0x802F -#define GL_MINMAX_SINK_EXT 0x8030 - -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); -typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (GLAPIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLRESETMINMAXEXTPROC) (GLenum target); - -#define glGetHistogramEXT GLEW_GET_FUN(__glewGetHistogramEXT) -#define glGetHistogramParameterfvEXT GLEW_GET_FUN(__glewGetHistogramParameterfvEXT) -#define glGetHistogramParameterivEXT GLEW_GET_FUN(__glewGetHistogramParameterivEXT) -#define glGetMinmaxEXT GLEW_GET_FUN(__glewGetMinmaxEXT) -#define glGetMinmaxParameterfvEXT GLEW_GET_FUN(__glewGetMinmaxParameterfvEXT) -#define glGetMinmaxParameterivEXT GLEW_GET_FUN(__glewGetMinmaxParameterivEXT) -#define glHistogramEXT GLEW_GET_FUN(__glewHistogramEXT) -#define glMinmaxEXT GLEW_GET_FUN(__glewMinmaxEXT) -#define glResetHistogramEXT GLEW_GET_FUN(__glewResetHistogramEXT) -#define glResetMinmaxEXT GLEW_GET_FUN(__glewResetMinmaxEXT) - -#define GLEW_EXT_histogram GLEW_GET_VAR(__GLEW_EXT_histogram) - -#endif /* GL_EXT_histogram */ - -/* ----------------------- GL_EXT_index_array_formats ---------------------- */ - -#ifndef GL_EXT_index_array_formats -#define GL_EXT_index_array_formats 1 - -#define GLEW_EXT_index_array_formats GLEW_GET_VAR(__GLEW_EXT_index_array_formats) - -#endif /* GL_EXT_index_array_formats */ - -/* --------------------------- GL_EXT_index_func --------------------------- */ - -#ifndef GL_EXT_index_func -#define GL_EXT_index_func 1 - -typedef void (GLAPIENTRY * PFNGLINDEXFUNCEXTPROC) (GLenum func, GLfloat ref); - -#define glIndexFuncEXT GLEW_GET_FUN(__glewIndexFuncEXT) - -#define GLEW_EXT_index_func GLEW_GET_VAR(__GLEW_EXT_index_func) - -#endif /* GL_EXT_index_func */ - -/* ------------------------- GL_EXT_index_material ------------------------- */ - -#ifndef GL_EXT_index_material -#define GL_EXT_index_material 1 - -typedef void (GLAPIENTRY * PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); - -#define glIndexMaterialEXT GLEW_GET_FUN(__glewIndexMaterialEXT) - -#define GLEW_EXT_index_material GLEW_GET_VAR(__GLEW_EXT_index_material) - -#endif /* GL_EXT_index_material */ - -/* -------------------------- GL_EXT_index_texture ------------------------- */ - -#ifndef GL_EXT_index_texture -#define GL_EXT_index_texture 1 - -#define GLEW_EXT_index_texture GLEW_GET_VAR(__GLEW_EXT_index_texture) - -#endif /* GL_EXT_index_texture */ - -/* -------------------------- GL_EXT_light_texture ------------------------- */ - -#ifndef GL_EXT_light_texture -#define GL_EXT_light_texture 1 - -#define GL_FRAGMENT_MATERIAL_EXT 0x8349 -#define GL_FRAGMENT_NORMAL_EXT 0x834A -#define GL_FRAGMENT_COLOR_EXT 0x834C -#define GL_ATTENUATION_EXT 0x834D -#define GL_SHADOW_ATTENUATION_EXT 0x834E -#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F -#define GL_TEXTURE_LIGHT_EXT 0x8350 -#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 -#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 - -typedef void (GLAPIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); -typedef void (GLAPIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); -typedef void (GLAPIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); - -#define glApplyTextureEXT GLEW_GET_FUN(__glewApplyTextureEXT) -#define glTextureLightEXT GLEW_GET_FUN(__glewTextureLightEXT) -#define glTextureMaterialEXT GLEW_GET_FUN(__glewTextureMaterialEXT) - -#define GLEW_EXT_light_texture GLEW_GET_VAR(__GLEW_EXT_light_texture) - -#endif /* GL_EXT_light_texture */ - -/* ------------------------- GL_EXT_misc_attribute ------------------------- */ - -#ifndef GL_EXT_misc_attribute -#define GL_EXT_misc_attribute 1 - -#define GLEW_EXT_misc_attribute GLEW_GET_VAR(__GLEW_EXT_misc_attribute) - -#endif /* GL_EXT_misc_attribute */ - -/* ------------------------ GL_EXT_multi_draw_arrays ----------------------- */ - -#ifndef GL_EXT_multi_draw_arrays -#define GL_EXT_multi_draw_arrays 1 - -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, GLsizei* count, GLenum type, const void *const *indices, GLsizei primcount); - -#define glMultiDrawArraysEXT GLEW_GET_FUN(__glewMultiDrawArraysEXT) -#define glMultiDrawElementsEXT GLEW_GET_FUN(__glewMultiDrawElementsEXT) - -#define GLEW_EXT_multi_draw_arrays GLEW_GET_VAR(__GLEW_EXT_multi_draw_arrays) - -#endif /* GL_EXT_multi_draw_arrays */ - -/* --------------------------- GL_EXT_multisample -------------------------- */ - -#ifndef GL_EXT_multisample -#define GL_EXT_multisample 1 - -#define GL_MULTISAMPLE_EXT 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F -#define GL_SAMPLE_MASK_EXT 0x80A0 -#define GL_1PASS_EXT 0x80A1 -#define GL_2PASS_0_EXT 0x80A2 -#define GL_2PASS_1_EXT 0x80A3 -#define GL_4PASS_0_EXT 0x80A4 -#define GL_4PASS_1_EXT 0x80A5 -#define GL_4PASS_2_EXT 0x80A6 -#define GL_4PASS_3_EXT 0x80A7 -#define GL_SAMPLE_BUFFERS_EXT 0x80A8 -#define GL_SAMPLES_EXT 0x80A9 -#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA -#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB -#define GL_SAMPLE_PATTERN_EXT 0x80AC -#define GL_MULTISAMPLE_BIT_EXT 0x20000000 - -typedef void (GLAPIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); -typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); - -#define glSampleMaskEXT GLEW_GET_FUN(__glewSampleMaskEXT) -#define glSamplePatternEXT GLEW_GET_FUN(__glewSamplePatternEXT) - -#define GLEW_EXT_multisample GLEW_GET_VAR(__GLEW_EXT_multisample) - -#endif /* GL_EXT_multisample */ - -/* ---------------------- GL_EXT_packed_depth_stencil ---------------------- */ - -#ifndef GL_EXT_packed_depth_stencil -#define GL_EXT_packed_depth_stencil 1 - -#define GL_DEPTH_STENCIL_EXT 0x84F9 -#define GL_UNSIGNED_INT_24_8_EXT 0x84FA -#define GL_DEPTH24_STENCIL8_EXT 0x88F0 -#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 - -#define GLEW_EXT_packed_depth_stencil GLEW_GET_VAR(__GLEW_EXT_packed_depth_stencil) - -#endif /* GL_EXT_packed_depth_stencil */ - -/* -------------------------- GL_EXT_packed_float -------------------------- */ - -#ifndef GL_EXT_packed_float -#define GL_EXT_packed_float 1 - -#define GL_R11F_G11F_B10F_EXT 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B -#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C - -#define GLEW_EXT_packed_float GLEW_GET_VAR(__GLEW_EXT_packed_float) - -#endif /* GL_EXT_packed_float */ - -/* -------------------------- GL_EXT_packed_pixels ------------------------- */ - -#ifndef GL_EXT_packed_pixels -#define GL_EXT_packed_pixels 1 - -#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 - -#define GLEW_EXT_packed_pixels GLEW_GET_VAR(__GLEW_EXT_packed_pixels) - -#endif /* GL_EXT_packed_pixels */ - -/* ------------------------ GL_EXT_paletted_texture ------------------------ */ - -#ifndef GL_EXT_paletted_texture -#define GL_EXT_paletted_texture 1 - -#define GL_TEXTURE_1D 0x0DE0 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_PROXY_TEXTURE_1D 0x8063 -#define GL_PROXY_TEXTURE_2D 0x8064 -#define GL_COLOR_TABLE_FORMAT_EXT 0x80D8 -#define GL_COLOR_TABLE_WIDTH_EXT 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE_EXT 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE_EXT 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE_EXT 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE_EXT 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE_EXT 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE_EXT 0x80DF -#define GL_COLOR_INDEX1_EXT 0x80E2 -#define GL_COLOR_INDEX2_EXT 0x80E3 -#define GL_COLOR_INDEX4_EXT 0x80E4 -#define GL_COLOR_INDEX8_EXT 0x80E5 -#define GL_COLOR_INDEX12_EXT 0x80E6 -#define GL_COLOR_INDEX16_EXT 0x80E7 -#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED -#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 -#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B - -typedef void (GLAPIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void *data); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); - -#define glColorTableEXT GLEW_GET_FUN(__glewColorTableEXT) -#define glGetColorTableEXT GLEW_GET_FUN(__glewGetColorTableEXT) -#define glGetColorTableParameterfvEXT GLEW_GET_FUN(__glewGetColorTableParameterfvEXT) -#define glGetColorTableParameterivEXT GLEW_GET_FUN(__glewGetColorTableParameterivEXT) - -#define GLEW_EXT_paletted_texture GLEW_GET_VAR(__GLEW_EXT_paletted_texture) - -#endif /* GL_EXT_paletted_texture */ - -/* ----------------------- GL_EXT_pixel_buffer_object ---------------------- */ - -#ifndef GL_EXT_pixel_buffer_object -#define GL_EXT_pixel_buffer_object 1 - -#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF - -#define GLEW_EXT_pixel_buffer_object GLEW_GET_VAR(__GLEW_EXT_pixel_buffer_object) - -#endif /* GL_EXT_pixel_buffer_object */ - -/* ------------------------- GL_EXT_pixel_transform ------------------------ */ - -#ifndef GL_EXT_pixel_transform -#define GL_EXT_pixel_transform 1 - -#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 -#define GL_PIXEL_MAG_FILTER_EXT 0x8331 -#define GL_PIXEL_MIN_FILTER_EXT 0x8332 -#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 -#define GL_CUBIC_EXT 0x8334 -#define GL_AVERAGE_EXT 0x8335 -#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 -#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 -#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 - -typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, const GLfloat param); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, const GLint param); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); - -#define glGetPixelTransformParameterfvEXT GLEW_GET_FUN(__glewGetPixelTransformParameterfvEXT) -#define glGetPixelTransformParameterivEXT GLEW_GET_FUN(__glewGetPixelTransformParameterivEXT) -#define glPixelTransformParameterfEXT GLEW_GET_FUN(__glewPixelTransformParameterfEXT) -#define glPixelTransformParameterfvEXT GLEW_GET_FUN(__glewPixelTransformParameterfvEXT) -#define glPixelTransformParameteriEXT GLEW_GET_FUN(__glewPixelTransformParameteriEXT) -#define glPixelTransformParameterivEXT GLEW_GET_FUN(__glewPixelTransformParameterivEXT) - -#define GLEW_EXT_pixel_transform GLEW_GET_VAR(__GLEW_EXT_pixel_transform) - -#endif /* GL_EXT_pixel_transform */ - -/* ------------------- GL_EXT_pixel_transform_color_table ------------------ */ - -#ifndef GL_EXT_pixel_transform_color_table -#define GL_EXT_pixel_transform_color_table 1 - -#define GLEW_EXT_pixel_transform_color_table GLEW_GET_VAR(__GLEW_EXT_pixel_transform_color_table) - -#endif /* GL_EXT_pixel_transform_color_table */ - -/* ------------------------ GL_EXT_point_parameters ------------------------ */ - -#ifndef GL_EXT_point_parameters -#define GL_EXT_point_parameters 1 - -#define GL_POINT_SIZE_MIN_EXT 0x8126 -#define GL_POINT_SIZE_MAX_EXT 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 -#define GL_DISTANCE_ATTENUATION_EXT 0x8129 - -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat* params); - -#define glPointParameterfEXT GLEW_GET_FUN(__glewPointParameterfEXT) -#define glPointParameterfvEXT GLEW_GET_FUN(__glewPointParameterfvEXT) - -#define GLEW_EXT_point_parameters GLEW_GET_VAR(__GLEW_EXT_point_parameters) - -#endif /* GL_EXT_point_parameters */ - -/* ------------------------- GL_EXT_polygon_offset ------------------------- */ - -#ifndef GL_EXT_polygon_offset -#define GL_EXT_polygon_offset 1 - -#define GL_POLYGON_OFFSET_EXT 0x8037 -#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 -#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 - -typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); - -#define glPolygonOffsetEXT GLEW_GET_FUN(__glewPolygonOffsetEXT) - -#define GLEW_EXT_polygon_offset GLEW_GET_VAR(__GLEW_EXT_polygon_offset) - -#endif /* GL_EXT_polygon_offset */ - -/* ---------------------- GL_EXT_polygon_offset_clamp ---------------------- */ - -#ifndef GL_EXT_polygon_offset_clamp -#define GL_EXT_polygon_offset_clamp 1 - -#define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B - -typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); - -#define glPolygonOffsetClampEXT GLEW_GET_FUN(__glewPolygonOffsetClampEXT) - -#define GLEW_EXT_polygon_offset_clamp GLEW_GET_VAR(__GLEW_EXT_polygon_offset_clamp) - -#endif /* GL_EXT_polygon_offset_clamp */ - -/* ----------------------- GL_EXT_post_depth_coverage ---------------------- */ - -#ifndef GL_EXT_post_depth_coverage -#define GL_EXT_post_depth_coverage 1 - -#define GLEW_EXT_post_depth_coverage GLEW_GET_VAR(__GLEW_EXT_post_depth_coverage) - -#endif /* GL_EXT_post_depth_coverage */ - -/* ------------------------ GL_EXT_provoking_vertex ------------------------ */ - -#ifndef GL_EXT_provoking_vertex -#define GL_EXT_provoking_vertex 1 - -#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C -#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D -#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E -#define GL_PROVOKING_VERTEX_EXT 0x8E4F - -typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode); - -#define glProvokingVertexEXT GLEW_GET_FUN(__glewProvokingVertexEXT) - -#define GLEW_EXT_provoking_vertex GLEW_GET_VAR(__GLEW_EXT_provoking_vertex) - -#endif /* GL_EXT_provoking_vertex */ - -/* ----------------------- GL_EXT_raster_multisample ----------------------- */ - -#ifndef GL_EXT_raster_multisample -#define GL_EXT_raster_multisample 1 - -#define GL_COLOR_SAMPLES_NV 0x8E20 -#define GL_RASTER_MULTISAMPLE_EXT 0x9327 -#define GL_RASTER_SAMPLES_EXT 0x9328 -#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 -#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A -#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B -#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C -#define GL_DEPTH_SAMPLES_NV 0x932D -#define GL_STENCIL_SAMPLES_NV 0x932E -#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F -#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 -#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 -#define GL_COVERAGE_MODULATION_NV 0x9332 -#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 - -typedef void (GLAPIENTRY * PFNGLCOVERAGEMODULATIONNVPROC) (GLenum components); -typedef void (GLAPIENTRY * PFNGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufsize, GLfloat* v); -typedef void (GLAPIENTRY * PFNGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); - -#define glCoverageModulationNV GLEW_GET_FUN(__glewCoverageModulationNV) -#define glCoverageModulationTableNV GLEW_GET_FUN(__glewCoverageModulationTableNV) -#define glGetCoverageModulationTableNV GLEW_GET_FUN(__glewGetCoverageModulationTableNV) -#define glRasterSamplesEXT GLEW_GET_FUN(__glewRasterSamplesEXT) - -#define GLEW_EXT_raster_multisample GLEW_GET_VAR(__GLEW_EXT_raster_multisample) - -#endif /* GL_EXT_raster_multisample */ - -/* ------------------------- GL_EXT_rescale_normal ------------------------- */ - -#ifndef GL_EXT_rescale_normal -#define GL_EXT_rescale_normal 1 - -#define GL_RESCALE_NORMAL_EXT 0x803A - -#define GLEW_EXT_rescale_normal GLEW_GET_VAR(__GLEW_EXT_rescale_normal) - -#endif /* GL_EXT_rescale_normal */ - -/* -------------------------- GL_EXT_scene_marker -------------------------- */ - -#ifndef GL_EXT_scene_marker -#define GL_EXT_scene_marker 1 - -typedef void (GLAPIENTRY * PFNGLBEGINSCENEEXTPROC) (void); -typedef void (GLAPIENTRY * PFNGLENDSCENEEXTPROC) (void); - -#define glBeginSceneEXT GLEW_GET_FUN(__glewBeginSceneEXT) -#define glEndSceneEXT GLEW_GET_FUN(__glewEndSceneEXT) - -#define GLEW_EXT_scene_marker GLEW_GET_VAR(__GLEW_EXT_scene_marker) - -#endif /* GL_EXT_scene_marker */ - -/* ------------------------- GL_EXT_secondary_color ------------------------ */ - -#ifndef GL_EXT_secondary_color -#define GL_EXT_secondary_color 1 - -#define GL_COLOR_SUM_EXT 0x8458 -#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D -#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E - -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); - -#define glSecondaryColor3bEXT GLEW_GET_FUN(__glewSecondaryColor3bEXT) -#define glSecondaryColor3bvEXT GLEW_GET_FUN(__glewSecondaryColor3bvEXT) -#define glSecondaryColor3dEXT GLEW_GET_FUN(__glewSecondaryColor3dEXT) -#define glSecondaryColor3dvEXT GLEW_GET_FUN(__glewSecondaryColor3dvEXT) -#define glSecondaryColor3fEXT GLEW_GET_FUN(__glewSecondaryColor3fEXT) -#define glSecondaryColor3fvEXT GLEW_GET_FUN(__glewSecondaryColor3fvEXT) -#define glSecondaryColor3iEXT GLEW_GET_FUN(__glewSecondaryColor3iEXT) -#define glSecondaryColor3ivEXT GLEW_GET_FUN(__glewSecondaryColor3ivEXT) -#define glSecondaryColor3sEXT GLEW_GET_FUN(__glewSecondaryColor3sEXT) -#define glSecondaryColor3svEXT GLEW_GET_FUN(__glewSecondaryColor3svEXT) -#define glSecondaryColor3ubEXT GLEW_GET_FUN(__glewSecondaryColor3ubEXT) -#define glSecondaryColor3ubvEXT GLEW_GET_FUN(__glewSecondaryColor3ubvEXT) -#define glSecondaryColor3uiEXT GLEW_GET_FUN(__glewSecondaryColor3uiEXT) -#define glSecondaryColor3uivEXT GLEW_GET_FUN(__glewSecondaryColor3uivEXT) -#define glSecondaryColor3usEXT GLEW_GET_FUN(__glewSecondaryColor3usEXT) -#define glSecondaryColor3usvEXT GLEW_GET_FUN(__glewSecondaryColor3usvEXT) -#define glSecondaryColorPointerEXT GLEW_GET_FUN(__glewSecondaryColorPointerEXT) - -#define GLEW_EXT_secondary_color GLEW_GET_VAR(__GLEW_EXT_secondary_color) - -#endif /* GL_EXT_secondary_color */ - -/* --------------------- GL_EXT_separate_shader_objects -------------------- */ - -#ifndef GL_EXT_separate_shader_objects -#define GL_EXT_separate_shader_objects 1 - -#define GL_ACTIVE_PROGRAM_EXT 0x8B8D - -typedef void (GLAPIENTRY * PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); -typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar* string); -typedef void (GLAPIENTRY * PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); - -#define glActiveProgramEXT GLEW_GET_FUN(__glewActiveProgramEXT) -#define glCreateShaderProgramEXT GLEW_GET_FUN(__glewCreateShaderProgramEXT) -#define glUseShaderProgramEXT GLEW_GET_FUN(__glewUseShaderProgramEXT) - -#define GLEW_EXT_separate_shader_objects GLEW_GET_VAR(__GLEW_EXT_separate_shader_objects) - -#endif /* GL_EXT_separate_shader_objects */ - -/* --------------------- GL_EXT_separate_specular_color -------------------- */ - -#ifndef GL_EXT_separate_specular_color -#define GL_EXT_separate_specular_color 1 - -#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 -#define GL_SINGLE_COLOR_EXT 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA - -#define GLEW_EXT_separate_specular_color GLEW_GET_VAR(__GLEW_EXT_separate_specular_color) - -#endif /* GL_EXT_separate_specular_color */ - -/* ------------------- GL_EXT_shader_image_load_formatted ------------------ */ - -#ifndef GL_EXT_shader_image_load_formatted -#define GL_EXT_shader_image_load_formatted 1 - -#define GLEW_EXT_shader_image_load_formatted GLEW_GET_VAR(__GLEW_EXT_shader_image_load_formatted) - -#endif /* GL_EXT_shader_image_load_formatted */ - -/* --------------------- GL_EXT_shader_image_load_store -------------------- */ - -#ifndef GL_EXT_shader_image_load_store -#define GL_EXT_shader_image_load_store 1 - -#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 -#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 -#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 -#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 -#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 -#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 -#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 -#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 -#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 -#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 -#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 -#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 -#define GL_MAX_IMAGE_UNITS_EXT 0x8F38 -#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 -#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A -#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B -#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C -#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D -#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E -#define GL_IMAGE_1D_EXT 0x904C -#define GL_IMAGE_2D_EXT 0x904D -#define GL_IMAGE_3D_EXT 0x904E -#define GL_IMAGE_2D_RECT_EXT 0x904F -#define GL_IMAGE_CUBE_EXT 0x9050 -#define GL_IMAGE_BUFFER_EXT 0x9051 -#define GL_IMAGE_1D_ARRAY_EXT 0x9052 -#define GL_IMAGE_2D_ARRAY_EXT 0x9053 -#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 -#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 -#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 -#define GL_INT_IMAGE_1D_EXT 0x9057 -#define GL_INT_IMAGE_2D_EXT 0x9058 -#define GL_INT_IMAGE_3D_EXT 0x9059 -#define GL_INT_IMAGE_2D_RECT_EXT 0x905A -#define GL_INT_IMAGE_CUBE_EXT 0x905B -#define GL_INT_IMAGE_BUFFER_EXT 0x905C -#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D -#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E -#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F -#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 -#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 -#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 -#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 -#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 -#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 -#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 -#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 -#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 -#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 -#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C -#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D -#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E -#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF - -typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); -typedef void (GLAPIENTRY * PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers); - -#define glBindImageTextureEXT GLEW_GET_FUN(__glewBindImageTextureEXT) -#define glMemoryBarrierEXT GLEW_GET_FUN(__glewMemoryBarrierEXT) - -#define GLEW_EXT_shader_image_load_store GLEW_GET_VAR(__GLEW_EXT_shader_image_load_store) - -#endif /* GL_EXT_shader_image_load_store */ - -/* ----------------------- GL_EXT_shader_integer_mix ----------------------- */ - -#ifndef GL_EXT_shader_integer_mix -#define GL_EXT_shader_integer_mix 1 - -#define GLEW_EXT_shader_integer_mix GLEW_GET_VAR(__GLEW_EXT_shader_integer_mix) - -#endif /* GL_EXT_shader_integer_mix */ - -/* -------------------------- GL_EXT_shadow_funcs -------------------------- */ - -#ifndef GL_EXT_shadow_funcs -#define GL_EXT_shadow_funcs 1 - -#define GLEW_EXT_shadow_funcs GLEW_GET_VAR(__GLEW_EXT_shadow_funcs) - -#endif /* GL_EXT_shadow_funcs */ - -/* --------------------- GL_EXT_shared_texture_palette --------------------- */ - -#ifndef GL_EXT_shared_texture_palette -#define GL_EXT_shared_texture_palette 1 - -#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB - -#define GLEW_EXT_shared_texture_palette GLEW_GET_VAR(__GLEW_EXT_shared_texture_palette) - -#endif /* GL_EXT_shared_texture_palette */ - -/* ------------------------- GL_EXT_sparse_texture2 ------------------------ */ - -#ifndef GL_EXT_sparse_texture2 -#define GL_EXT_sparse_texture2 1 - -#define GLEW_EXT_sparse_texture2 GLEW_GET_VAR(__GLEW_EXT_sparse_texture2) - -#endif /* GL_EXT_sparse_texture2 */ - -/* ------------------------ GL_EXT_stencil_clear_tag ----------------------- */ - -#ifndef GL_EXT_stencil_clear_tag -#define GL_EXT_stencil_clear_tag 1 - -#define GL_STENCIL_TAG_BITS_EXT 0x88F2 -#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 - -#define GLEW_EXT_stencil_clear_tag GLEW_GET_VAR(__GLEW_EXT_stencil_clear_tag) - -#endif /* GL_EXT_stencil_clear_tag */ - -/* ------------------------ GL_EXT_stencil_two_side ------------------------ */ - -#ifndef GL_EXT_stencil_two_side -#define GL_EXT_stencil_two_side 1 - -#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 -#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 - -typedef void (GLAPIENTRY * PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); - -#define glActiveStencilFaceEXT GLEW_GET_FUN(__glewActiveStencilFaceEXT) - -#define GLEW_EXT_stencil_two_side GLEW_GET_VAR(__GLEW_EXT_stencil_two_side) - -#endif /* GL_EXT_stencil_two_side */ - -/* -------------------------- GL_EXT_stencil_wrap -------------------------- */ - -#ifndef GL_EXT_stencil_wrap -#define GL_EXT_stencil_wrap 1 - -#define GL_INCR_WRAP_EXT 0x8507 -#define GL_DECR_WRAP_EXT 0x8508 - -#define GLEW_EXT_stencil_wrap GLEW_GET_VAR(__GLEW_EXT_stencil_wrap) - -#endif /* GL_EXT_stencil_wrap */ - -/* --------------------------- GL_EXT_subtexture --------------------------- */ - -#ifndef GL_EXT_subtexture -#define GL_EXT_subtexture 1 - -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); - -#define glTexSubImage1DEXT GLEW_GET_FUN(__glewTexSubImage1DEXT) -#define glTexSubImage2DEXT GLEW_GET_FUN(__glewTexSubImage2DEXT) -#define glTexSubImage3DEXT GLEW_GET_FUN(__glewTexSubImage3DEXT) - -#define GLEW_EXT_subtexture GLEW_GET_VAR(__GLEW_EXT_subtexture) - -#endif /* GL_EXT_subtexture */ - -/* ----------------------------- GL_EXT_texture ---------------------------- */ - -#ifndef GL_EXT_texture -#define GL_EXT_texture 1 - -#define GL_ALPHA4_EXT 0x803B -#define GL_ALPHA8_EXT 0x803C -#define GL_ALPHA12_EXT 0x803D -#define GL_ALPHA16_EXT 0x803E -#define GL_LUMINANCE4_EXT 0x803F -#define GL_LUMINANCE8_EXT 0x8040 -#define GL_LUMINANCE12_EXT 0x8041 -#define GL_LUMINANCE16_EXT 0x8042 -#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 -#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 -#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 -#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 -#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 -#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 -#define GL_INTENSITY_EXT 0x8049 -#define GL_INTENSITY4_EXT 0x804A -#define GL_INTENSITY8_EXT 0x804B -#define GL_INTENSITY12_EXT 0x804C -#define GL_INTENSITY16_EXT 0x804D -#define GL_RGB2_EXT 0x804E -#define GL_RGB4_EXT 0x804F -#define GL_RGB5_EXT 0x8050 -#define GL_RGB8_EXT 0x8051 -#define GL_RGB10_EXT 0x8052 -#define GL_RGB12_EXT 0x8053 -#define GL_RGB16_EXT 0x8054 -#define GL_RGBA2_EXT 0x8055 -#define GL_RGBA4_EXT 0x8056 -#define GL_RGB5_A1_EXT 0x8057 -#define GL_RGBA8_EXT 0x8058 -#define GL_RGB10_A2_EXT 0x8059 -#define GL_RGBA12_EXT 0x805A -#define GL_RGBA16_EXT 0x805B -#define GL_TEXTURE_RED_SIZE_EXT 0x805C -#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D -#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E -#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 -#define GL_REPLACE_EXT 0x8062 -#define GL_PROXY_TEXTURE_1D_EXT 0x8063 -#define GL_PROXY_TEXTURE_2D_EXT 0x8064 - -#define GLEW_EXT_texture GLEW_GET_VAR(__GLEW_EXT_texture) - -#endif /* GL_EXT_texture */ - -/* ---------------------------- GL_EXT_texture3D --------------------------- */ - -#ifndef GL_EXT_texture3D -#define GL_EXT_texture3D 1 - -#define GL_PACK_SKIP_IMAGES_EXT 0x806B -#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C -#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D -#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E -#define GL_TEXTURE_3D_EXT 0x806F -#define GL_PROXY_TEXTURE_3D_EXT 0x8070 -#define GL_TEXTURE_DEPTH_EXT 0x8071 -#define GL_TEXTURE_WRAP_R_EXT 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 - -typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); - -#define glTexImage3DEXT GLEW_GET_FUN(__glewTexImage3DEXT) - -#define GLEW_EXT_texture3D GLEW_GET_VAR(__GLEW_EXT_texture3D) - -#endif /* GL_EXT_texture3D */ - -/* -------------------------- GL_EXT_texture_array ------------------------- */ - -#ifndef GL_EXT_texture_array -#define GL_EXT_texture_array 1 - -#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E -#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF -#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 -#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 -#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A -#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B -#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C -#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); - -#define glFramebufferTextureLayerEXT GLEW_GET_FUN(__glewFramebufferTextureLayerEXT) - -#define GLEW_EXT_texture_array GLEW_GET_VAR(__GLEW_EXT_texture_array) - -#endif /* GL_EXT_texture_array */ - -/* ---------------------- GL_EXT_texture_buffer_object --------------------- */ - -#ifndef GL_EXT_texture_buffer_object -#define GL_EXT_texture_buffer_object 1 - -#define GL_TEXTURE_BUFFER_EXT 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E - -typedef void (GLAPIENTRY * PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); - -#define glTexBufferEXT GLEW_GET_FUN(__glewTexBufferEXT) - -#define GLEW_EXT_texture_buffer_object GLEW_GET_VAR(__GLEW_EXT_texture_buffer_object) - -#endif /* GL_EXT_texture_buffer_object */ - -/* -------------------- GL_EXT_texture_compression_dxt1 -------------------- */ - -#ifndef GL_EXT_texture_compression_dxt1 -#define GL_EXT_texture_compression_dxt1 1 - -#define GLEW_EXT_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_EXT_texture_compression_dxt1) - -#endif /* GL_EXT_texture_compression_dxt1 */ - -/* -------------------- GL_EXT_texture_compression_latc -------------------- */ - -#ifndef GL_EXT_texture_compression_latc -#define GL_EXT_texture_compression_latc 1 - -#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 -#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 -#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 -#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 - -#define GLEW_EXT_texture_compression_latc GLEW_GET_VAR(__GLEW_EXT_texture_compression_latc) - -#endif /* GL_EXT_texture_compression_latc */ - -/* -------------------- GL_EXT_texture_compression_rgtc -------------------- */ - -#ifndef GL_EXT_texture_compression_rgtc -#define GL_EXT_texture_compression_rgtc 1 - -#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB -#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC -#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD -#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE - -#define GLEW_EXT_texture_compression_rgtc GLEW_GET_VAR(__GLEW_EXT_texture_compression_rgtc) - -#endif /* GL_EXT_texture_compression_rgtc */ - -/* -------------------- GL_EXT_texture_compression_s3tc -------------------- */ - -#ifndef GL_EXT_texture_compression_s3tc -#define GL_EXT_texture_compression_s3tc 1 - -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 - -#define GLEW_EXT_texture_compression_s3tc GLEW_GET_VAR(__GLEW_EXT_texture_compression_s3tc) - -#endif /* GL_EXT_texture_compression_s3tc */ - -/* ------------------------ GL_EXT_texture_cube_map ------------------------ */ - -#ifndef GL_EXT_texture_cube_map -#define GL_EXT_texture_cube_map 1 - -#define GL_NORMAL_MAP_EXT 0x8511 -#define GL_REFLECTION_MAP_EXT 0x8512 -#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C - -#define GLEW_EXT_texture_cube_map GLEW_GET_VAR(__GLEW_EXT_texture_cube_map) - -#endif /* GL_EXT_texture_cube_map */ - -/* ----------------------- GL_EXT_texture_edge_clamp ----------------------- */ - -#ifndef GL_EXT_texture_edge_clamp -#define GL_EXT_texture_edge_clamp 1 - -#define GL_CLAMP_TO_EDGE_EXT 0x812F - -#define GLEW_EXT_texture_edge_clamp GLEW_GET_VAR(__GLEW_EXT_texture_edge_clamp) - -#endif /* GL_EXT_texture_edge_clamp */ - -/* --------------------------- GL_EXT_texture_env -------------------------- */ - -#ifndef GL_EXT_texture_env -#define GL_EXT_texture_env 1 - -#define GLEW_EXT_texture_env GLEW_GET_VAR(__GLEW_EXT_texture_env) - -#endif /* GL_EXT_texture_env */ - -/* ------------------------- GL_EXT_texture_env_add ------------------------ */ - -#ifndef GL_EXT_texture_env_add -#define GL_EXT_texture_env_add 1 - -#define GLEW_EXT_texture_env_add GLEW_GET_VAR(__GLEW_EXT_texture_env_add) - -#endif /* GL_EXT_texture_env_add */ - -/* ----------------------- GL_EXT_texture_env_combine ---------------------- */ - -#ifndef GL_EXT_texture_env_combine -#define GL_EXT_texture_env_combine 1 - -#define GL_COMBINE_EXT 0x8570 -#define GL_COMBINE_RGB_EXT 0x8571 -#define GL_COMBINE_ALPHA_EXT 0x8572 -#define GL_RGB_SCALE_EXT 0x8573 -#define GL_ADD_SIGNED_EXT 0x8574 -#define GL_INTERPOLATE_EXT 0x8575 -#define GL_CONSTANT_EXT 0x8576 -#define GL_PRIMARY_COLOR_EXT 0x8577 -#define GL_PREVIOUS_EXT 0x8578 -#define GL_SOURCE0_RGB_EXT 0x8580 -#define GL_SOURCE1_RGB_EXT 0x8581 -#define GL_SOURCE2_RGB_EXT 0x8582 -#define GL_SOURCE0_ALPHA_EXT 0x8588 -#define GL_SOURCE1_ALPHA_EXT 0x8589 -#define GL_SOURCE2_ALPHA_EXT 0x858A -#define GL_OPERAND0_RGB_EXT 0x8590 -#define GL_OPERAND1_RGB_EXT 0x8591 -#define GL_OPERAND2_RGB_EXT 0x8592 -#define GL_OPERAND0_ALPHA_EXT 0x8598 -#define GL_OPERAND1_ALPHA_EXT 0x8599 -#define GL_OPERAND2_ALPHA_EXT 0x859A - -#define GLEW_EXT_texture_env_combine GLEW_GET_VAR(__GLEW_EXT_texture_env_combine) - -#endif /* GL_EXT_texture_env_combine */ - -/* ------------------------ GL_EXT_texture_env_dot3 ------------------------ */ - -#ifndef GL_EXT_texture_env_dot3 -#define GL_EXT_texture_env_dot3 1 - -#define GL_DOT3_RGB_EXT 0x8740 -#define GL_DOT3_RGBA_EXT 0x8741 - -#define GLEW_EXT_texture_env_dot3 GLEW_GET_VAR(__GLEW_EXT_texture_env_dot3) - -#endif /* GL_EXT_texture_env_dot3 */ - -/* ------------------- GL_EXT_texture_filter_anisotropic ------------------- */ - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_EXT_texture_filter_anisotropic 1 - -#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF - -#define GLEW_EXT_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_EXT_texture_filter_anisotropic) - -#endif /* GL_EXT_texture_filter_anisotropic */ - -/* ---------------------- GL_EXT_texture_filter_minmax --------------------- */ - -#ifndef GL_EXT_texture_filter_minmax -#define GL_EXT_texture_filter_minmax 1 - -#define GL_TEXTURE_REDUCTION_MODE_EXT 0x9366 -#define GL_WEIGHTED_AVERAGE_EXT 0x9367 - -#define GLEW_EXT_texture_filter_minmax GLEW_GET_VAR(__GLEW_EXT_texture_filter_minmax) - -#endif /* GL_EXT_texture_filter_minmax */ - -/* ------------------------- GL_EXT_texture_integer ------------------------ */ - -#ifndef GL_EXT_texture_integer -#define GL_EXT_texture_integer 1 - -#define GL_RGBA32UI_EXT 0x8D70 -#define GL_RGB32UI_EXT 0x8D71 -#define GL_ALPHA32UI_EXT 0x8D72 -#define GL_INTENSITY32UI_EXT 0x8D73 -#define GL_LUMINANCE32UI_EXT 0x8D74 -#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 -#define GL_RGBA16UI_EXT 0x8D76 -#define GL_RGB16UI_EXT 0x8D77 -#define GL_ALPHA16UI_EXT 0x8D78 -#define GL_INTENSITY16UI_EXT 0x8D79 -#define GL_LUMINANCE16UI_EXT 0x8D7A -#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B -#define GL_RGBA8UI_EXT 0x8D7C -#define GL_RGB8UI_EXT 0x8D7D -#define GL_ALPHA8UI_EXT 0x8D7E -#define GL_INTENSITY8UI_EXT 0x8D7F -#define GL_LUMINANCE8UI_EXT 0x8D80 -#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 -#define GL_RGBA32I_EXT 0x8D82 -#define GL_RGB32I_EXT 0x8D83 -#define GL_ALPHA32I_EXT 0x8D84 -#define GL_INTENSITY32I_EXT 0x8D85 -#define GL_LUMINANCE32I_EXT 0x8D86 -#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 -#define GL_RGBA16I_EXT 0x8D88 -#define GL_RGB16I_EXT 0x8D89 -#define GL_ALPHA16I_EXT 0x8D8A -#define GL_INTENSITY16I_EXT 0x8D8B -#define GL_LUMINANCE16I_EXT 0x8D8C -#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D -#define GL_RGBA8I_EXT 0x8D8E -#define GL_RGB8I_EXT 0x8D8F -#define GL_ALPHA8I_EXT 0x8D90 -#define GL_INTENSITY8I_EXT 0x8D91 -#define GL_LUMINANCE8I_EXT 0x8D92 -#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 -#define GL_RED_INTEGER_EXT 0x8D94 -#define GL_GREEN_INTEGER_EXT 0x8D95 -#define GL_BLUE_INTEGER_EXT 0x8D96 -#define GL_ALPHA_INTEGER_EXT 0x8D97 -#define GL_RGB_INTEGER_EXT 0x8D98 -#define GL_RGBA_INTEGER_EXT 0x8D99 -#define GL_BGR_INTEGER_EXT 0x8D9A -#define GL_BGRA_INTEGER_EXT 0x8D9B -#define GL_LUMINANCE_INTEGER_EXT 0x8D9C -#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D -#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E - -typedef void (GLAPIENTRY * PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); -typedef void (GLAPIENTRY * PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); -typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); -typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); - -#define glClearColorIiEXT GLEW_GET_FUN(__glewClearColorIiEXT) -#define glClearColorIuiEXT GLEW_GET_FUN(__glewClearColorIuiEXT) -#define glGetTexParameterIivEXT GLEW_GET_FUN(__glewGetTexParameterIivEXT) -#define glGetTexParameterIuivEXT GLEW_GET_FUN(__glewGetTexParameterIuivEXT) -#define glTexParameterIivEXT GLEW_GET_FUN(__glewTexParameterIivEXT) -#define glTexParameterIuivEXT GLEW_GET_FUN(__glewTexParameterIuivEXT) - -#define GLEW_EXT_texture_integer GLEW_GET_VAR(__GLEW_EXT_texture_integer) - -#endif /* GL_EXT_texture_integer */ - -/* ------------------------ GL_EXT_texture_lod_bias ------------------------ */ - -#ifndef GL_EXT_texture_lod_bias -#define GL_EXT_texture_lod_bias 1 - -#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD -#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 -#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 - -#define GLEW_EXT_texture_lod_bias GLEW_GET_VAR(__GLEW_EXT_texture_lod_bias) - -#endif /* GL_EXT_texture_lod_bias */ - -/* ---------------------- GL_EXT_texture_mirror_clamp ---------------------- */ - -#ifndef GL_EXT_texture_mirror_clamp -#define GL_EXT_texture_mirror_clamp 1 - -#define GL_MIRROR_CLAMP_EXT 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 -#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 - -#define GLEW_EXT_texture_mirror_clamp GLEW_GET_VAR(__GLEW_EXT_texture_mirror_clamp) - -#endif /* GL_EXT_texture_mirror_clamp */ - -/* ------------------------- GL_EXT_texture_object ------------------------- */ - -#ifndef GL_EXT_texture_object -#define GL_EXT_texture_object 1 - -#define GL_TEXTURE_PRIORITY_EXT 0x8066 -#define GL_TEXTURE_RESIDENT_EXT 0x8067 -#define GL_TEXTURE_1D_BINDING_EXT 0x8068 -#define GL_TEXTURE_2D_BINDING_EXT 0x8069 -#define GL_TEXTURE_3D_BINDING_EXT 0x806A - -typedef GLboolean (GLAPIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint* textures, GLboolean* residences); -typedef void (GLAPIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); -typedef void (GLAPIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint* textures); -typedef void (GLAPIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint* textures); -typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture); -typedef void (GLAPIENTRY * PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint* textures, const GLclampf* priorities); - -#define glAreTexturesResidentEXT GLEW_GET_FUN(__glewAreTexturesResidentEXT) -#define glBindTextureEXT GLEW_GET_FUN(__glewBindTextureEXT) -#define glDeleteTexturesEXT GLEW_GET_FUN(__glewDeleteTexturesEXT) -#define glGenTexturesEXT GLEW_GET_FUN(__glewGenTexturesEXT) -#define glIsTextureEXT GLEW_GET_FUN(__glewIsTextureEXT) -#define glPrioritizeTexturesEXT GLEW_GET_FUN(__glewPrioritizeTexturesEXT) - -#define GLEW_EXT_texture_object GLEW_GET_VAR(__GLEW_EXT_texture_object) - -#endif /* GL_EXT_texture_object */ - -/* --------------------- GL_EXT_texture_perturb_normal --------------------- */ - -#ifndef GL_EXT_texture_perturb_normal -#define GL_EXT_texture_perturb_normal 1 - -#define GL_PERTURB_EXT 0x85AE -#define GL_TEXTURE_NORMAL_EXT 0x85AF - -typedef void (GLAPIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode); - -#define glTextureNormalEXT GLEW_GET_FUN(__glewTextureNormalEXT) - -#define GLEW_EXT_texture_perturb_normal GLEW_GET_VAR(__GLEW_EXT_texture_perturb_normal) - -#endif /* GL_EXT_texture_perturb_normal */ - -/* ------------------------ GL_EXT_texture_rectangle ----------------------- */ - -#ifndef GL_EXT_texture_rectangle -#define GL_EXT_texture_rectangle 1 - -#define GL_TEXTURE_RECTANGLE_EXT 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_EXT 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_EXT 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8 - -#define GLEW_EXT_texture_rectangle GLEW_GET_VAR(__GLEW_EXT_texture_rectangle) - -#endif /* GL_EXT_texture_rectangle */ - -/* -------------------------- GL_EXT_texture_sRGB -------------------------- */ - -#ifndef GL_EXT_texture_sRGB -#define GL_EXT_texture_sRGB 1 - -#define GL_SRGB_EXT 0x8C40 -#define GL_SRGB8_EXT 0x8C41 -#define GL_SRGB_ALPHA_EXT 0x8C42 -#define GL_SRGB8_ALPHA8_EXT 0x8C43 -#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 -#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 -#define GL_SLUMINANCE_EXT 0x8C46 -#define GL_SLUMINANCE8_EXT 0x8C47 -#define GL_COMPRESSED_SRGB_EXT 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 -#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A -#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B -#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F - -#define GLEW_EXT_texture_sRGB GLEW_GET_VAR(__GLEW_EXT_texture_sRGB) - -#endif /* GL_EXT_texture_sRGB */ - -/* ----------------------- GL_EXT_texture_sRGB_decode ---------------------- */ - -#ifndef GL_EXT_texture_sRGB_decode -#define GL_EXT_texture_sRGB_decode 1 - -#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 -#define GL_DECODE_EXT 0x8A49 -#define GL_SKIP_DECODE_EXT 0x8A4A - -#define GLEW_EXT_texture_sRGB_decode GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_decode) - -#endif /* GL_EXT_texture_sRGB_decode */ - -/* --------------------- GL_EXT_texture_shared_exponent -------------------- */ - -#ifndef GL_EXT_texture_shared_exponent -#define GL_EXT_texture_shared_exponent 1 - -#define GL_RGB9_E5_EXT 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E -#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F - -#define GLEW_EXT_texture_shared_exponent GLEW_GET_VAR(__GLEW_EXT_texture_shared_exponent) - -#endif /* GL_EXT_texture_shared_exponent */ - -/* -------------------------- GL_EXT_texture_snorm ------------------------- */ - -#ifndef GL_EXT_texture_snorm -#define GL_EXT_texture_snorm 1 - -#define GL_RED_SNORM 0x8F90 -#define GL_RG_SNORM 0x8F91 -#define GL_RGB_SNORM 0x8F92 -#define GL_RGBA_SNORM 0x8F93 -#define GL_R8_SNORM 0x8F94 -#define GL_RG8_SNORM 0x8F95 -#define GL_RGB8_SNORM 0x8F96 -#define GL_RGBA8_SNORM 0x8F97 -#define GL_R16_SNORM 0x8F98 -#define GL_RG16_SNORM 0x8F99 -#define GL_RGB16_SNORM 0x8F9A -#define GL_RGBA16_SNORM 0x8F9B -#define GL_SIGNED_NORMALIZED 0x8F9C -#define GL_ALPHA_SNORM 0x9010 -#define GL_LUMINANCE_SNORM 0x9011 -#define GL_LUMINANCE_ALPHA_SNORM 0x9012 -#define GL_INTENSITY_SNORM 0x9013 -#define GL_ALPHA8_SNORM 0x9014 -#define GL_LUMINANCE8_SNORM 0x9015 -#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 -#define GL_INTENSITY8_SNORM 0x9017 -#define GL_ALPHA16_SNORM 0x9018 -#define GL_LUMINANCE16_SNORM 0x9019 -#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A -#define GL_INTENSITY16_SNORM 0x901B - -#define GLEW_EXT_texture_snorm GLEW_GET_VAR(__GLEW_EXT_texture_snorm) - -#endif /* GL_EXT_texture_snorm */ - -/* ------------------------- GL_EXT_texture_swizzle ------------------------ */ - -#ifndef GL_EXT_texture_swizzle -#define GL_EXT_texture_swizzle 1 - -#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 -#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 -#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 -#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 -#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 - -#define GLEW_EXT_texture_swizzle GLEW_GET_VAR(__GLEW_EXT_texture_swizzle) - -#endif /* GL_EXT_texture_swizzle */ - -/* --------------------------- GL_EXT_timer_query -------------------------- */ - -#ifndef GL_EXT_timer_query -#define GL_EXT_timer_query 1 - -#define GL_TIME_ELAPSED_EXT 0x88BF - -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params); - -#define glGetQueryObjecti64vEXT GLEW_GET_FUN(__glewGetQueryObjecti64vEXT) -#define glGetQueryObjectui64vEXT GLEW_GET_FUN(__glewGetQueryObjectui64vEXT) - -#define GLEW_EXT_timer_query GLEW_GET_VAR(__GLEW_EXT_timer_query) - -#endif /* GL_EXT_timer_query */ - -/* ----------------------- GL_EXT_transform_feedback ----------------------- */ - -#ifndef GL_EXT_transform_feedback -#define GL_EXT_transform_feedback 1 - -#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 -#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 -#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 -#define GL_RASTERIZER_DISCARD_EXT 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B -#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C -#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F - -typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); -typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei *size, GLenum *type, GLchar *name); -typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar * const* varyings, GLenum bufferMode); - -#define glBeginTransformFeedbackEXT GLEW_GET_FUN(__glewBeginTransformFeedbackEXT) -#define glBindBufferBaseEXT GLEW_GET_FUN(__glewBindBufferBaseEXT) -#define glBindBufferOffsetEXT GLEW_GET_FUN(__glewBindBufferOffsetEXT) -#define glBindBufferRangeEXT GLEW_GET_FUN(__glewBindBufferRangeEXT) -#define glEndTransformFeedbackEXT GLEW_GET_FUN(__glewEndTransformFeedbackEXT) -#define glGetTransformFeedbackVaryingEXT GLEW_GET_FUN(__glewGetTransformFeedbackVaryingEXT) -#define glTransformFeedbackVaryingsEXT GLEW_GET_FUN(__glewTransformFeedbackVaryingsEXT) - -#define GLEW_EXT_transform_feedback GLEW_GET_VAR(__GLEW_EXT_transform_feedback) - -#endif /* GL_EXT_transform_feedback */ - -/* -------------------------- GL_EXT_vertex_array -------------------------- */ - -#ifndef GL_EXT_vertex_array -#define GL_EXT_vertex_array 1 - -#define GL_DOUBLE_EXT 0x140A -#define GL_VERTEX_ARRAY_EXT 0x8074 -#define GL_NORMAL_ARRAY_EXT 0x8075 -#define GL_COLOR_ARRAY_EXT 0x8076 -#define GL_INDEX_ARRAY_EXT 0x8077 -#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 -#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 -#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A -#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B -#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C -#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D -#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E -#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F -#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 -#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 -#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 -#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 -#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 -#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 -#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 -#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 -#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A -#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B -#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C -#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D -#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E -#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F -#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 -#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 -#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 -#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 - -typedef void (GLAPIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i); -typedef void (GLAPIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean* pointer); -typedef void (GLAPIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); -typedef void (GLAPIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); -typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); -typedef void (GLAPIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); - -#define glArrayElementEXT GLEW_GET_FUN(__glewArrayElementEXT) -#define glColorPointerEXT GLEW_GET_FUN(__glewColorPointerEXT) -#define glDrawArraysEXT GLEW_GET_FUN(__glewDrawArraysEXT) -#define glEdgeFlagPointerEXT GLEW_GET_FUN(__glewEdgeFlagPointerEXT) -#define glIndexPointerEXT GLEW_GET_FUN(__glewIndexPointerEXT) -#define glNormalPointerEXT GLEW_GET_FUN(__glewNormalPointerEXT) -#define glTexCoordPointerEXT GLEW_GET_FUN(__glewTexCoordPointerEXT) -#define glVertexPointerEXT GLEW_GET_FUN(__glewVertexPointerEXT) - -#define GLEW_EXT_vertex_array GLEW_GET_VAR(__GLEW_EXT_vertex_array) - -#endif /* GL_EXT_vertex_array */ - -/* ------------------------ GL_EXT_vertex_array_bgra ----------------------- */ - -#ifndef GL_EXT_vertex_array_bgra -#define GL_EXT_vertex_array_bgra 1 - -#define GL_BGRA 0x80E1 - -#define GLEW_EXT_vertex_array_bgra GLEW_GET_VAR(__GLEW_EXT_vertex_array_bgra) - -#endif /* GL_EXT_vertex_array_bgra */ - -/* ----------------------- GL_EXT_vertex_attrib_64bit ---------------------- */ - -#ifndef GL_EXT_vertex_attrib_64bit -#define GL_EXT_vertex_attrib_64bit 1 - -#define GL_DOUBLE_MAT2_EXT 0x8F46 -#define GL_DOUBLE_MAT3_EXT 0x8F47 -#define GL_DOUBLE_MAT4_EXT 0x8F48 -#define GL_DOUBLE_MAT2x3_EXT 0x8F49 -#define GL_DOUBLE_MAT2x4_EXT 0x8F4A -#define GL_DOUBLE_MAT3x2_EXT 0x8F4B -#define GL_DOUBLE_MAT3x4_EXT 0x8F4C -#define GL_DOUBLE_MAT4x2_EXT 0x8F4D -#define GL_DOUBLE_MAT4x3_EXT 0x8F4E -#define GL_DOUBLE_VEC2_EXT 0x8FFC -#define GL_DOUBLE_VEC3_EXT 0x8FFD -#define GL_DOUBLE_VEC4_EXT 0x8FFE - -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); - -#define glGetVertexAttribLdvEXT GLEW_GET_FUN(__glewGetVertexAttribLdvEXT) -#define glVertexArrayVertexAttribLOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLOffsetEXT) -#define glVertexAttribL1dEXT GLEW_GET_FUN(__glewVertexAttribL1dEXT) -#define glVertexAttribL1dvEXT GLEW_GET_FUN(__glewVertexAttribL1dvEXT) -#define glVertexAttribL2dEXT GLEW_GET_FUN(__glewVertexAttribL2dEXT) -#define glVertexAttribL2dvEXT GLEW_GET_FUN(__glewVertexAttribL2dvEXT) -#define glVertexAttribL3dEXT GLEW_GET_FUN(__glewVertexAttribL3dEXT) -#define glVertexAttribL3dvEXT GLEW_GET_FUN(__glewVertexAttribL3dvEXT) -#define glVertexAttribL4dEXT GLEW_GET_FUN(__glewVertexAttribL4dEXT) -#define glVertexAttribL4dvEXT GLEW_GET_FUN(__glewVertexAttribL4dvEXT) -#define glVertexAttribLPointerEXT GLEW_GET_FUN(__glewVertexAttribLPointerEXT) - -#define GLEW_EXT_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_EXT_vertex_attrib_64bit) - -#endif /* GL_EXT_vertex_attrib_64bit */ - -/* -------------------------- GL_EXT_vertex_shader ------------------------- */ - -#ifndef GL_EXT_vertex_shader -#define GL_EXT_vertex_shader 1 - -#define GL_VERTEX_SHADER_EXT 0x8780 -#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 -#define GL_OP_INDEX_EXT 0x8782 -#define GL_OP_NEGATE_EXT 0x8783 -#define GL_OP_DOT3_EXT 0x8784 -#define GL_OP_DOT4_EXT 0x8785 -#define GL_OP_MUL_EXT 0x8786 -#define GL_OP_ADD_EXT 0x8787 -#define GL_OP_MADD_EXT 0x8788 -#define GL_OP_FRAC_EXT 0x8789 -#define GL_OP_MAX_EXT 0x878A -#define GL_OP_MIN_EXT 0x878B -#define GL_OP_SET_GE_EXT 0x878C -#define GL_OP_SET_LT_EXT 0x878D -#define GL_OP_CLAMP_EXT 0x878E -#define GL_OP_FLOOR_EXT 0x878F -#define GL_OP_ROUND_EXT 0x8790 -#define GL_OP_EXP_BASE_2_EXT 0x8791 -#define GL_OP_LOG_BASE_2_EXT 0x8792 -#define GL_OP_POWER_EXT 0x8793 -#define GL_OP_RECIP_EXT 0x8794 -#define GL_OP_RECIP_SQRT_EXT 0x8795 -#define GL_OP_SUB_EXT 0x8796 -#define GL_OP_CROSS_PRODUCT_EXT 0x8797 -#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 -#define GL_OP_MOV_EXT 0x8799 -#define GL_OUTPUT_VERTEX_EXT 0x879A -#define GL_OUTPUT_COLOR0_EXT 0x879B -#define GL_OUTPUT_COLOR1_EXT 0x879C -#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D -#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E -#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F -#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 -#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 -#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 -#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 -#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 -#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 -#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 -#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 -#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 -#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 -#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA -#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB -#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC -#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD -#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE -#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF -#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 -#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 -#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 -#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 -#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 -#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 -#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 -#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 -#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 -#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 -#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA -#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB -#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC -#define GL_OUTPUT_FOG_EXT 0x87BD -#define GL_SCALAR_EXT 0x87BE -#define GL_VECTOR_EXT 0x87BF -#define GL_MATRIX_EXT 0x87C0 -#define GL_VARIANT_EXT 0x87C1 -#define GL_INVARIANT_EXT 0x87C2 -#define GL_LOCAL_CONSTANT_EXT 0x87C3 -#define GL_LOCAL_EXT 0x87C4 -#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 -#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 -#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 -#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 -#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CC -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CD -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE -#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF -#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 -#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 -#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 -#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 -#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 -#define GL_X_EXT 0x87D5 -#define GL_Y_EXT 0x87D6 -#define GL_Z_EXT 0x87D7 -#define GL_W_EXT 0x87D8 -#define GL_NEGATIVE_X_EXT 0x87D9 -#define GL_NEGATIVE_Y_EXT 0x87DA -#define GL_NEGATIVE_Z_EXT 0x87DB -#define GL_NEGATIVE_W_EXT 0x87DC -#define GL_ZERO_EXT 0x87DD -#define GL_ONE_EXT 0x87DE -#define GL_NEGATIVE_ONE_EXT 0x87DF -#define GL_NORMALIZED_RANGE_EXT 0x87E0 -#define GL_FULL_RANGE_EXT 0x87E1 -#define GL_CURRENT_VERTEX_EXT 0x87E2 -#define GL_MVP_MATRIX_EXT 0x87E3 -#define GL_VARIANT_VALUE_EXT 0x87E4 -#define GL_VARIANT_DATATYPE_EXT 0x87E5 -#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 -#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 -#define GL_VARIANT_ARRAY_EXT 0x87E8 -#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 -#define GL_INVARIANT_VALUE_EXT 0x87EA -#define GL_INVARIANT_DATATYPE_EXT 0x87EB -#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC -#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED - -typedef void (GLAPIENTRY * PFNGLBEGINVERTEXSHADEREXTPROC) (void); -typedef GLuint (GLAPIENTRY * PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); -typedef GLuint (GLAPIENTRY * PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); -typedef GLuint (GLAPIENTRY * PFNGLBINDPARAMETEREXTPROC) (GLenum value); -typedef GLuint (GLAPIENTRY * PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); -typedef GLuint (GLAPIENTRY * PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); -typedef void (GLAPIENTRY * PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLENDVERTEXSHADEREXTPROC) (void); -typedef void (GLAPIENTRY * PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); -typedef GLuint (GLAPIENTRY * PFNGLGENSYMBOLSEXTPROC) (GLenum dataType, GLenum storageType, GLenum range, GLuint components); -typedef GLuint (GLAPIENTRY * PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); -typedef void (GLAPIENTRY * PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (GLAPIENTRY * PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (GLAPIENTRY * PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (GLAPIENTRY * PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (GLAPIENTRY * PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (GLAPIENTRY * PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (GLAPIENTRY * PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, void **data); -typedef void (GLAPIENTRY * PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); -typedef GLboolean (GLAPIENTRY * PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); -typedef void (GLAPIENTRY * PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, void *addr); -typedef void (GLAPIENTRY * PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, void *addr); -typedef void (GLAPIENTRY * PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); -typedef void (GLAPIENTRY * PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); -typedef void (GLAPIENTRY * PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); -typedef void (GLAPIENTRY * PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -typedef void (GLAPIENTRY * PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, void *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTBVEXTPROC) (GLuint id, GLbyte *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTDVEXTPROC) (GLuint id, GLdouble *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTFVEXTPROC) (GLuint id, GLfloat *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTIVEXTPROC) (GLuint id, GLint *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTSVEXTPROC) (GLuint id, GLshort *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTUBVEXTPROC) (GLuint id, GLubyte *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTUIVEXTPROC) (GLuint id, GLuint *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTUSVEXTPROC) (GLuint id, GLushort *addr); -typedef void (GLAPIENTRY * PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); - -#define glBeginVertexShaderEXT GLEW_GET_FUN(__glewBeginVertexShaderEXT) -#define glBindLightParameterEXT GLEW_GET_FUN(__glewBindLightParameterEXT) -#define glBindMaterialParameterEXT GLEW_GET_FUN(__glewBindMaterialParameterEXT) -#define glBindParameterEXT GLEW_GET_FUN(__glewBindParameterEXT) -#define glBindTexGenParameterEXT GLEW_GET_FUN(__glewBindTexGenParameterEXT) -#define glBindTextureUnitParameterEXT GLEW_GET_FUN(__glewBindTextureUnitParameterEXT) -#define glBindVertexShaderEXT GLEW_GET_FUN(__glewBindVertexShaderEXT) -#define glDeleteVertexShaderEXT GLEW_GET_FUN(__glewDeleteVertexShaderEXT) -#define glDisableVariantClientStateEXT GLEW_GET_FUN(__glewDisableVariantClientStateEXT) -#define glEnableVariantClientStateEXT GLEW_GET_FUN(__glewEnableVariantClientStateEXT) -#define glEndVertexShaderEXT GLEW_GET_FUN(__glewEndVertexShaderEXT) -#define glExtractComponentEXT GLEW_GET_FUN(__glewExtractComponentEXT) -#define glGenSymbolsEXT GLEW_GET_FUN(__glewGenSymbolsEXT) -#define glGenVertexShadersEXT GLEW_GET_FUN(__glewGenVertexShadersEXT) -#define glGetInvariantBooleanvEXT GLEW_GET_FUN(__glewGetInvariantBooleanvEXT) -#define glGetInvariantFloatvEXT GLEW_GET_FUN(__glewGetInvariantFloatvEXT) -#define glGetInvariantIntegervEXT GLEW_GET_FUN(__glewGetInvariantIntegervEXT) -#define glGetLocalConstantBooleanvEXT GLEW_GET_FUN(__glewGetLocalConstantBooleanvEXT) -#define glGetLocalConstantFloatvEXT GLEW_GET_FUN(__glewGetLocalConstantFloatvEXT) -#define glGetLocalConstantIntegervEXT GLEW_GET_FUN(__glewGetLocalConstantIntegervEXT) -#define glGetVariantBooleanvEXT GLEW_GET_FUN(__glewGetVariantBooleanvEXT) -#define glGetVariantFloatvEXT GLEW_GET_FUN(__glewGetVariantFloatvEXT) -#define glGetVariantIntegervEXT GLEW_GET_FUN(__glewGetVariantIntegervEXT) -#define glGetVariantPointervEXT GLEW_GET_FUN(__glewGetVariantPointervEXT) -#define glInsertComponentEXT GLEW_GET_FUN(__glewInsertComponentEXT) -#define glIsVariantEnabledEXT GLEW_GET_FUN(__glewIsVariantEnabledEXT) -#define glSetInvariantEXT GLEW_GET_FUN(__glewSetInvariantEXT) -#define glSetLocalConstantEXT GLEW_GET_FUN(__glewSetLocalConstantEXT) -#define glShaderOp1EXT GLEW_GET_FUN(__glewShaderOp1EXT) -#define glShaderOp2EXT GLEW_GET_FUN(__glewShaderOp2EXT) -#define glShaderOp3EXT GLEW_GET_FUN(__glewShaderOp3EXT) -#define glSwizzleEXT GLEW_GET_FUN(__glewSwizzleEXT) -#define glVariantPointerEXT GLEW_GET_FUN(__glewVariantPointerEXT) -#define glVariantbvEXT GLEW_GET_FUN(__glewVariantbvEXT) -#define glVariantdvEXT GLEW_GET_FUN(__glewVariantdvEXT) -#define glVariantfvEXT GLEW_GET_FUN(__glewVariantfvEXT) -#define glVariantivEXT GLEW_GET_FUN(__glewVariantivEXT) -#define glVariantsvEXT GLEW_GET_FUN(__glewVariantsvEXT) -#define glVariantubvEXT GLEW_GET_FUN(__glewVariantubvEXT) -#define glVariantuivEXT GLEW_GET_FUN(__glewVariantuivEXT) -#define glVariantusvEXT GLEW_GET_FUN(__glewVariantusvEXT) -#define glWriteMaskEXT GLEW_GET_FUN(__glewWriteMaskEXT) - -#define GLEW_EXT_vertex_shader GLEW_GET_VAR(__GLEW_EXT_vertex_shader) - -#endif /* GL_EXT_vertex_shader */ - -/* ------------------------ GL_EXT_vertex_weighting ------------------------ */ - -#ifndef GL_EXT_vertex_weighting -#define GL_EXT_vertex_weighting 1 - -#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 -#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 -#define GL_MODELVIEW0_EXT 0x1700 -#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 -#define GL_MODELVIEW1_MATRIX_EXT 0x8506 -#define GL_VERTEX_WEIGHTING_EXT 0x8509 -#define GL_MODELVIEW1_EXT 0x850A -#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B -#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C -#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D -#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E -#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F -#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 - -typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); -typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); -typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (GLfloat* weight); - -#define glVertexWeightPointerEXT GLEW_GET_FUN(__glewVertexWeightPointerEXT) -#define glVertexWeightfEXT GLEW_GET_FUN(__glewVertexWeightfEXT) -#define glVertexWeightfvEXT GLEW_GET_FUN(__glewVertexWeightfvEXT) - -#define GLEW_EXT_vertex_weighting GLEW_GET_VAR(__GLEW_EXT_vertex_weighting) - -#endif /* GL_EXT_vertex_weighting */ - -/* ------------------------- GL_EXT_x11_sync_object ------------------------ */ - -#ifndef GL_EXT_x11_sync_object -#define GL_EXT_x11_sync_object 1 - -#define GL_SYNC_X11_FENCE_EXT 0x90E1 - -typedef GLsync (GLAPIENTRY * PFNGLIMPORTSYNCEXTPROC) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); - -#define glImportSyncEXT GLEW_GET_FUN(__glewImportSyncEXT) - -#define GLEW_EXT_x11_sync_object GLEW_GET_VAR(__GLEW_EXT_x11_sync_object) - -#endif /* GL_EXT_x11_sync_object */ - -/* ---------------------- GL_GREMEDY_frame_terminator ---------------------- */ - -#ifndef GL_GREMEDY_frame_terminator -#define GL_GREMEDY_frame_terminator 1 - -typedef void (GLAPIENTRY * PFNGLFRAMETERMINATORGREMEDYPROC) (void); - -#define glFrameTerminatorGREMEDY GLEW_GET_FUN(__glewFrameTerminatorGREMEDY) - -#define GLEW_GREMEDY_frame_terminator GLEW_GET_VAR(__GLEW_GREMEDY_frame_terminator) - -#endif /* GL_GREMEDY_frame_terminator */ - -/* ------------------------ GL_GREMEDY_string_marker ----------------------- */ - -#ifndef GL_GREMEDY_string_marker -#define GL_GREMEDY_string_marker 1 - -typedef void (GLAPIENTRY * PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void *string); - -#define glStringMarkerGREMEDY GLEW_GET_FUN(__glewStringMarkerGREMEDY) - -#define GLEW_GREMEDY_string_marker GLEW_GET_VAR(__GLEW_GREMEDY_string_marker) - -#endif /* GL_GREMEDY_string_marker */ - -/* --------------------- GL_HP_convolution_border_modes -------------------- */ - -#ifndef GL_HP_convolution_border_modes -#define GL_HP_convolution_border_modes 1 - -#define GLEW_HP_convolution_border_modes GLEW_GET_VAR(__GLEW_HP_convolution_border_modes) - -#endif /* GL_HP_convolution_border_modes */ - -/* ------------------------- GL_HP_image_transform ------------------------- */ - -#ifndef GL_HP_image_transform -#define GL_HP_image_transform 1 - -typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, const GLfloat param); -typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, const GLint param); -typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); - -#define glGetImageTransformParameterfvHP GLEW_GET_FUN(__glewGetImageTransformParameterfvHP) -#define glGetImageTransformParameterivHP GLEW_GET_FUN(__glewGetImageTransformParameterivHP) -#define glImageTransformParameterfHP GLEW_GET_FUN(__glewImageTransformParameterfHP) -#define glImageTransformParameterfvHP GLEW_GET_FUN(__glewImageTransformParameterfvHP) -#define glImageTransformParameteriHP GLEW_GET_FUN(__glewImageTransformParameteriHP) -#define glImageTransformParameterivHP GLEW_GET_FUN(__glewImageTransformParameterivHP) - -#define GLEW_HP_image_transform GLEW_GET_VAR(__GLEW_HP_image_transform) - -#endif /* GL_HP_image_transform */ - -/* -------------------------- GL_HP_occlusion_test ------------------------- */ - -#ifndef GL_HP_occlusion_test -#define GL_HP_occlusion_test 1 - -#define GLEW_HP_occlusion_test GLEW_GET_VAR(__GLEW_HP_occlusion_test) - -#endif /* GL_HP_occlusion_test */ - -/* ------------------------- GL_HP_texture_lighting ------------------------ */ - -#ifndef GL_HP_texture_lighting -#define GL_HP_texture_lighting 1 - -#define GLEW_HP_texture_lighting GLEW_GET_VAR(__GLEW_HP_texture_lighting) - -#endif /* GL_HP_texture_lighting */ - -/* --------------------------- GL_IBM_cull_vertex -------------------------- */ - -#ifndef GL_IBM_cull_vertex -#define GL_IBM_cull_vertex 1 - -#define GL_CULL_VERTEX_IBM 103050 - -#define GLEW_IBM_cull_vertex GLEW_GET_VAR(__GLEW_IBM_cull_vertex) - -#endif /* GL_IBM_cull_vertex */ - -/* ---------------------- GL_IBM_multimode_draw_arrays --------------------- */ - -#ifndef GL_IBM_multimode_draw_arrays -#define GL_IBM_multimode_draw_arrays 1 - -typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum* mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); -typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum* mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei primcount, GLint modestride); - -#define glMultiModeDrawArraysIBM GLEW_GET_FUN(__glewMultiModeDrawArraysIBM) -#define glMultiModeDrawElementsIBM GLEW_GET_FUN(__glewMultiModeDrawElementsIBM) - -#define GLEW_IBM_multimode_draw_arrays GLEW_GET_VAR(__GLEW_IBM_multimode_draw_arrays) - -#endif /* GL_IBM_multimode_draw_arrays */ - -/* ------------------------- GL_IBM_rasterpos_clip ------------------------- */ - -#ifndef GL_IBM_rasterpos_clip -#define GL_IBM_rasterpos_clip 1 - -#define GL_RASTER_POSITION_UNCLIPPED_IBM 103010 - -#define GLEW_IBM_rasterpos_clip GLEW_GET_VAR(__GLEW_IBM_rasterpos_clip) - -#endif /* GL_IBM_rasterpos_clip */ - -/* --------------------------- GL_IBM_static_data -------------------------- */ - -#ifndef GL_IBM_static_data -#define GL_IBM_static_data 1 - -#define GL_ALL_STATIC_DATA_IBM 103060 -#define GL_STATIC_VERTEX_ARRAY_IBM 103061 - -#define GLEW_IBM_static_data GLEW_GET_VAR(__GLEW_IBM_static_data) - -#endif /* GL_IBM_static_data */ - -/* --------------------- GL_IBM_texture_mirrored_repeat -------------------- */ - -#ifndef GL_IBM_texture_mirrored_repeat -#define GL_IBM_texture_mirrored_repeat 1 - -#define GL_MIRRORED_REPEAT_IBM 0x8370 - -#define GLEW_IBM_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_IBM_texture_mirrored_repeat) - -#endif /* GL_IBM_texture_mirrored_repeat */ - -/* ----------------------- GL_IBM_vertex_array_lists ----------------------- */ - -#ifndef GL_IBM_vertex_array_lists -#define GL_IBM_vertex_array_lists 1 - -#define GL_VERTEX_ARRAY_LIST_IBM 103070 -#define GL_NORMAL_ARRAY_LIST_IBM 103071 -#define GL_COLOR_ARRAY_LIST_IBM 103072 -#define GL_INDEX_ARRAY_LIST_IBM 103073 -#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 -#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 -#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 -#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 -#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 -#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 -#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 -#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 -#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 -#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 -#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 -#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 - -typedef void (GLAPIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean ** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); - -#define glColorPointerListIBM GLEW_GET_FUN(__glewColorPointerListIBM) -#define glEdgeFlagPointerListIBM GLEW_GET_FUN(__glewEdgeFlagPointerListIBM) -#define glFogCoordPointerListIBM GLEW_GET_FUN(__glewFogCoordPointerListIBM) -#define glIndexPointerListIBM GLEW_GET_FUN(__glewIndexPointerListIBM) -#define glNormalPointerListIBM GLEW_GET_FUN(__glewNormalPointerListIBM) -#define glSecondaryColorPointerListIBM GLEW_GET_FUN(__glewSecondaryColorPointerListIBM) -#define glTexCoordPointerListIBM GLEW_GET_FUN(__glewTexCoordPointerListIBM) -#define glVertexPointerListIBM GLEW_GET_FUN(__glewVertexPointerListIBM) - -#define GLEW_IBM_vertex_array_lists GLEW_GET_VAR(__GLEW_IBM_vertex_array_lists) - -#endif /* GL_IBM_vertex_array_lists */ - -/* -------------------------- GL_INGR_color_clamp -------------------------- */ - -#ifndef GL_INGR_color_clamp -#define GL_INGR_color_clamp 1 - -#define GL_RED_MIN_CLAMP_INGR 0x8560 -#define GL_GREEN_MIN_CLAMP_INGR 0x8561 -#define GL_BLUE_MIN_CLAMP_INGR 0x8562 -#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 -#define GL_RED_MAX_CLAMP_INGR 0x8564 -#define GL_GREEN_MAX_CLAMP_INGR 0x8565 -#define GL_BLUE_MAX_CLAMP_INGR 0x8566 -#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 - -#define GLEW_INGR_color_clamp GLEW_GET_VAR(__GLEW_INGR_color_clamp) - -#endif /* GL_INGR_color_clamp */ - -/* ------------------------- GL_INGR_interlace_read ------------------------ */ - -#ifndef GL_INGR_interlace_read -#define GL_INGR_interlace_read 1 - -#define GL_INTERLACE_READ_INGR 0x8568 - -#define GLEW_INGR_interlace_read GLEW_GET_VAR(__GLEW_INGR_interlace_read) - -#endif /* GL_INGR_interlace_read */ - -/* ------------------- GL_INTEL_fragment_shader_ordering ------------------- */ - -#ifndef GL_INTEL_fragment_shader_ordering -#define GL_INTEL_fragment_shader_ordering 1 - -#define GLEW_INTEL_fragment_shader_ordering GLEW_GET_VAR(__GLEW_INTEL_fragment_shader_ordering) - -#endif /* GL_INTEL_fragment_shader_ordering */ - -/* ----------------------- GL_INTEL_framebuffer_CMAA ----------------------- */ - -#ifndef GL_INTEL_framebuffer_CMAA -#define GL_INTEL_framebuffer_CMAA 1 - -#define GLEW_INTEL_framebuffer_CMAA GLEW_GET_VAR(__GLEW_INTEL_framebuffer_CMAA) - -#endif /* GL_INTEL_framebuffer_CMAA */ - -/* -------------------------- GL_INTEL_map_texture ------------------------- */ - -#ifndef GL_INTEL_map_texture -#define GL_INTEL_map_texture 1 - -#define GL_LAYOUT_DEFAULT_INTEL 0 -#define GL_LAYOUT_LINEAR_INTEL 1 -#define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2 -#define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF - -typedef void * (GLAPIENTRY * PFNGLMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, GLint* stride, GLenum *layout); -typedef void (GLAPIENTRY * PFNGLSYNCTEXTUREINTELPROC) (GLuint texture); -typedef void (GLAPIENTRY * PFNGLUNMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level); - -#define glMapTexture2DINTEL GLEW_GET_FUN(__glewMapTexture2DINTEL) -#define glSyncTextureINTEL GLEW_GET_FUN(__glewSyncTextureINTEL) -#define glUnmapTexture2DINTEL GLEW_GET_FUN(__glewUnmapTexture2DINTEL) - -#define GLEW_INTEL_map_texture GLEW_GET_VAR(__GLEW_INTEL_map_texture) - -#endif /* GL_INTEL_map_texture */ - -/* ------------------------ GL_INTEL_parallel_arrays ----------------------- */ - -#ifndef GL_INTEL_parallel_arrays -#define GL_INTEL_parallel_arrays 1 - -#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 -#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 -#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 -#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 -#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 - -typedef void (GLAPIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); -typedef void (GLAPIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void** pointer); -typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); -typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); - -#define glColorPointervINTEL GLEW_GET_FUN(__glewColorPointervINTEL) -#define glNormalPointervINTEL GLEW_GET_FUN(__glewNormalPointervINTEL) -#define glTexCoordPointervINTEL GLEW_GET_FUN(__glewTexCoordPointervINTEL) -#define glVertexPointervINTEL GLEW_GET_FUN(__glewVertexPointervINTEL) - -#define GLEW_INTEL_parallel_arrays GLEW_GET_VAR(__GLEW_INTEL_parallel_arrays) - -#endif /* GL_INTEL_parallel_arrays */ - -/* ----------------------- GL_INTEL_performance_query ---------------------- */ - -#ifndef GL_INTEL_performance_query -#define GL_INTEL_performance_query 1 - -#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x0000 -#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x0001 -#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 -#define GL_PERFQUERY_FLUSH_INTEL 0x83FA -#define GL_PERFQUERY_WAIT_INTEL 0x83FB -#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 -#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 -#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 -#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 -#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 -#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 -#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 -#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 -#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA -#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB -#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC -#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD -#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE -#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF -#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 - -typedef void (GLAPIENTRY * PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); -typedef void (GLAPIENTRY * PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint* queryHandle); -typedef void (GLAPIENTRY * PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); -typedef void (GLAPIENTRY * PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); -typedef void (GLAPIENTRY * PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint* queryId); -typedef void (GLAPIENTRY * PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint* nextQueryId); -typedef void (GLAPIENTRY * PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar* counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); -typedef void (GLAPIENTRY * PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); -typedef void (GLAPIENTRY * PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar* queryName, GLuint *queryId); -typedef void (GLAPIENTRY * PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar* queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); - -#define glBeginPerfQueryINTEL GLEW_GET_FUN(__glewBeginPerfQueryINTEL) -#define glCreatePerfQueryINTEL GLEW_GET_FUN(__glewCreatePerfQueryINTEL) -#define glDeletePerfQueryINTEL GLEW_GET_FUN(__glewDeletePerfQueryINTEL) -#define glEndPerfQueryINTEL GLEW_GET_FUN(__glewEndPerfQueryINTEL) -#define glGetFirstPerfQueryIdINTEL GLEW_GET_FUN(__glewGetFirstPerfQueryIdINTEL) -#define glGetNextPerfQueryIdINTEL GLEW_GET_FUN(__glewGetNextPerfQueryIdINTEL) -#define glGetPerfCounterInfoINTEL GLEW_GET_FUN(__glewGetPerfCounterInfoINTEL) -#define glGetPerfQueryDataINTEL GLEW_GET_FUN(__glewGetPerfQueryDataINTEL) -#define glGetPerfQueryIdByNameINTEL GLEW_GET_FUN(__glewGetPerfQueryIdByNameINTEL) -#define glGetPerfQueryInfoINTEL GLEW_GET_FUN(__glewGetPerfQueryInfoINTEL) - -#define GLEW_INTEL_performance_query GLEW_GET_VAR(__GLEW_INTEL_performance_query) - -#endif /* GL_INTEL_performance_query */ - -/* ------------------------ GL_INTEL_texture_scissor ----------------------- */ - -#ifndef GL_INTEL_texture_scissor -#define GL_INTEL_texture_scissor 1 - -typedef void (GLAPIENTRY * PFNGLTEXSCISSORFUNCINTELPROC) (GLenum target, GLenum lfunc, GLenum hfunc); -typedef void (GLAPIENTRY * PFNGLTEXSCISSORINTELPROC) (GLenum target, GLclampf tlow, GLclampf thigh); - -#define glTexScissorFuncINTEL GLEW_GET_FUN(__glewTexScissorFuncINTEL) -#define glTexScissorINTEL GLEW_GET_FUN(__glewTexScissorINTEL) - -#define GLEW_INTEL_texture_scissor GLEW_GET_VAR(__GLEW_INTEL_texture_scissor) - -#endif /* GL_INTEL_texture_scissor */ - -/* --------------------- GL_KHR_blend_equation_advanced -------------------- */ - -#ifndef GL_KHR_blend_equation_advanced -#define GL_KHR_blend_equation_advanced 1 - -#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 -#define GL_MULTIPLY_KHR 0x9294 -#define GL_SCREEN_KHR 0x9295 -#define GL_OVERLAY_KHR 0x9296 -#define GL_DARKEN_KHR 0x9297 -#define GL_LIGHTEN_KHR 0x9298 -#define GL_COLORDODGE_KHR 0x9299 -#define GL_COLORBURN_KHR 0x929A -#define GL_HARDLIGHT_KHR 0x929B -#define GL_SOFTLIGHT_KHR 0x929C -#define GL_DIFFERENCE_KHR 0x929E -#define GL_EXCLUSION_KHR 0x92A0 -#define GL_HSL_HUE_KHR 0x92AD -#define GL_HSL_SATURATION_KHR 0x92AE -#define GL_HSL_COLOR_KHR 0x92AF -#define GL_HSL_LUMINOSITY_KHR 0x92B0 - -typedef void (GLAPIENTRY * PFNGLBLENDBARRIERKHRPROC) (void); - -#define glBlendBarrierKHR GLEW_GET_FUN(__glewBlendBarrierKHR) - -#define GLEW_KHR_blend_equation_advanced GLEW_GET_VAR(__GLEW_KHR_blend_equation_advanced) - -#endif /* GL_KHR_blend_equation_advanced */ - -/* ---------------- GL_KHR_blend_equation_advanced_coherent ---------------- */ - -#ifndef GL_KHR_blend_equation_advanced_coherent -#define GL_KHR_blend_equation_advanced_coherent 1 - -#define GLEW_KHR_blend_equation_advanced_coherent GLEW_GET_VAR(__GLEW_KHR_blend_equation_advanced_coherent) - -#endif /* GL_KHR_blend_equation_advanced_coherent */ - -/* ---------------------- GL_KHR_context_flush_control --------------------- */ - -#ifndef GL_KHR_context_flush_control -#define GL_KHR_context_flush_control 1 - -#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB -#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC - -#define GLEW_KHR_context_flush_control GLEW_GET_VAR(__GLEW_KHR_context_flush_control) - -#endif /* GL_KHR_context_flush_control */ - -/* ------------------------------ GL_KHR_debug ----------------------------- */ - -#ifndef GL_KHR_debug -#define GL_KHR_debug 1 - -#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 -#define GL_STACK_OVERFLOW 0x0503 -#define GL_STACK_UNDERFLOW 0x0504 -#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 -#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 -#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 -#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 -#define GL_DEBUG_SOURCE_API 0x8246 -#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 -#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 -#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 -#define GL_DEBUG_SOURCE_APPLICATION 0x824A -#define GL_DEBUG_SOURCE_OTHER 0x824B -#define GL_DEBUG_TYPE_ERROR 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E -#define GL_DEBUG_TYPE_PORTABILITY 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 -#define GL_DEBUG_TYPE_OTHER 0x8251 -#define GL_DEBUG_TYPE_MARKER 0x8268 -#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 -#define GL_DEBUG_TYPE_POP_GROUP 0x826A -#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B -#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C -#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D -#define GL_BUFFER 0x82E0 -#define GL_SHADER 0x82E1 -#define GL_PROGRAM 0x82E2 -#define GL_QUERY 0x82E3 -#define GL_PROGRAM_PIPELINE 0x82E4 -#define GL_SAMPLER 0x82E6 -#define GL_DISPLAY_LIST 0x82E7 -#define GL_MAX_LABEL_LENGTH 0x82E8 -#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES 0x9145 -#define GL_DEBUG_SEVERITY_HIGH 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 -#define GL_DEBUG_SEVERITY_LOW 0x9148 -#define GL_DEBUG_OUTPUT 0x92E0 - -typedef void (GLAPIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam); - -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); -typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); -typedef void (GLAPIENTRY * PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei* length, GLchar *label); -typedef void (GLAPIENTRY * PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei* length, GLchar *label); -typedef void (GLAPIENTRY * PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar* label); -typedef void (GLAPIENTRY * PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar* label); -typedef void (GLAPIENTRY * PFNGLPOPDEBUGGROUPPROC) (void); -typedef void (GLAPIENTRY * PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar * message); - -#define glDebugMessageCallback GLEW_GET_FUN(__glewDebugMessageCallback) -#define glDebugMessageControl GLEW_GET_FUN(__glewDebugMessageControl) -#define glDebugMessageInsert GLEW_GET_FUN(__glewDebugMessageInsert) -#define glGetDebugMessageLog GLEW_GET_FUN(__glewGetDebugMessageLog) -#define glGetObjectLabel GLEW_GET_FUN(__glewGetObjectLabel) -#define glGetObjectPtrLabel GLEW_GET_FUN(__glewGetObjectPtrLabel) -#define glObjectLabel GLEW_GET_FUN(__glewObjectLabel) -#define glObjectPtrLabel GLEW_GET_FUN(__glewObjectPtrLabel) -#define glPopDebugGroup GLEW_GET_FUN(__glewPopDebugGroup) -#define glPushDebugGroup GLEW_GET_FUN(__glewPushDebugGroup) - -#define GLEW_KHR_debug GLEW_GET_VAR(__GLEW_KHR_debug) - -#endif /* GL_KHR_debug */ - -/* ---------------------------- GL_KHR_no_error ---------------------------- */ - -#ifndef GL_KHR_no_error -#define GL_KHR_no_error 1 - -#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008 - -#define GLEW_KHR_no_error GLEW_GET_VAR(__GLEW_KHR_no_error) - -#endif /* GL_KHR_no_error */ - -/* ------------------ GL_KHR_robust_buffer_access_behavior ----------------- */ - -#ifndef GL_KHR_robust_buffer_access_behavior -#define GL_KHR_robust_buffer_access_behavior 1 - -#define GLEW_KHR_robust_buffer_access_behavior GLEW_GET_VAR(__GLEW_KHR_robust_buffer_access_behavior) - -#endif /* GL_KHR_robust_buffer_access_behavior */ - -/* --------------------------- GL_KHR_robustness --------------------------- */ - -#ifndef GL_KHR_robustness -#define GL_KHR_robustness 1 - -#define GL_CONTEXT_LOST 0x0507 -#define GL_LOSE_CONTEXT_ON_RESET 0x8252 -#define GL_GUILTY_CONTEXT_RESET 0x8253 -#define GL_INNOCENT_CONTEXT_RESET 0x8254 -#define GL_UNKNOWN_CONTEXT_RESET 0x8255 -#define GL_RESET_NOTIFICATION_STRATEGY 0x8256 -#define GL_NO_RESET_NOTIFICATION 0x8261 -#define GL_CONTEXT_ROBUST_ACCESS 0x90F3 - -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params); -typedef void (GLAPIENTRY * PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); - -#define glGetnUniformfv GLEW_GET_FUN(__glewGetnUniformfv) -#define glGetnUniformiv GLEW_GET_FUN(__glewGetnUniformiv) -#define glGetnUniformuiv GLEW_GET_FUN(__glewGetnUniformuiv) -#define glReadnPixels GLEW_GET_FUN(__glewReadnPixels) - -#define GLEW_KHR_robustness GLEW_GET_VAR(__GLEW_KHR_robustness) - -#endif /* GL_KHR_robustness */ - -/* ------------------ GL_KHR_texture_compression_astc_hdr ------------------ */ - -#ifndef GL_KHR_texture_compression_astc_hdr -#define GL_KHR_texture_compression_astc_hdr 1 - -#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 -#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 -#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 -#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 -#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 -#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 -#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 -#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 -#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 -#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 -#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA -#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB -#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC -#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD - -#define GLEW_KHR_texture_compression_astc_hdr GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_hdr) - -#endif /* GL_KHR_texture_compression_astc_hdr */ - -/* ------------------ GL_KHR_texture_compression_astc_ldr ------------------ */ - -#ifndef GL_KHR_texture_compression_astc_ldr -#define GL_KHR_texture_compression_astc_ldr 1 - -#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 -#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 -#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 -#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 -#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 -#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 -#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 -#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 -#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 -#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 -#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA -#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB -#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC -#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD - -#define GLEW_KHR_texture_compression_astc_ldr GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_ldr) - -#endif /* GL_KHR_texture_compression_astc_ldr */ - -/* -------------------------- GL_KTX_buffer_region ------------------------- */ - -#ifndef GL_KTX_buffer_region -#define GL_KTX_buffer_region 1 - -#define GL_KTX_FRONT_REGION 0x0 -#define GL_KTX_BACK_REGION 0x1 -#define GL_KTX_Z_REGION 0x2 -#define GL_KTX_STENCIL_REGION 0x3 - -typedef GLuint (GLAPIENTRY * PFNGLBUFFERREGIONENABLEDPROC) (void); -typedef void (GLAPIENTRY * PFNGLDELETEBUFFERREGIONPROC) (GLenum region); -typedef void (GLAPIENTRY * PFNGLDRAWBUFFERREGIONPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height, GLint xDest, GLint yDest); -typedef GLuint (GLAPIENTRY * PFNGLNEWBUFFERREGIONPROC) (GLenum region); -typedef void (GLAPIENTRY * PFNGLREADBUFFERREGIONPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height); - -#define glBufferRegionEnabled GLEW_GET_FUN(__glewBufferRegionEnabled) -#define glDeleteBufferRegion GLEW_GET_FUN(__glewDeleteBufferRegion) -#define glDrawBufferRegion GLEW_GET_FUN(__glewDrawBufferRegion) -#define glNewBufferRegion GLEW_GET_FUN(__glewNewBufferRegion) -#define glReadBufferRegion GLEW_GET_FUN(__glewReadBufferRegion) - -#define GLEW_KTX_buffer_region GLEW_GET_VAR(__GLEW_KTX_buffer_region) - -#endif /* GL_KTX_buffer_region */ - -/* ------------------------- GL_MESAX_texture_stack ------------------------ */ - -#ifndef GL_MESAX_texture_stack -#define GL_MESAX_texture_stack 1 - -#define GL_TEXTURE_1D_STACK_MESAX 0x8759 -#define GL_TEXTURE_2D_STACK_MESAX 0x875A -#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B -#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C -#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D -#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E - -#define GLEW_MESAX_texture_stack GLEW_GET_VAR(__GLEW_MESAX_texture_stack) - -#endif /* GL_MESAX_texture_stack */ - -/* -------------------------- GL_MESA_pack_invert -------------------------- */ - -#ifndef GL_MESA_pack_invert -#define GL_MESA_pack_invert 1 - -#define GL_PACK_INVERT_MESA 0x8758 - -#define GLEW_MESA_pack_invert GLEW_GET_VAR(__GLEW_MESA_pack_invert) - -#endif /* GL_MESA_pack_invert */ - -/* ------------------------- GL_MESA_resize_buffers ------------------------ */ - -#ifndef GL_MESA_resize_buffers -#define GL_MESA_resize_buffers 1 - -typedef void (GLAPIENTRY * PFNGLRESIZEBUFFERSMESAPROC) (void); - -#define glResizeBuffersMESA GLEW_GET_FUN(__glewResizeBuffersMESA) - -#define GLEW_MESA_resize_buffers GLEW_GET_VAR(__GLEW_MESA_resize_buffers) - -#endif /* GL_MESA_resize_buffers */ - -/* --------------------------- GL_MESA_window_pos -------------------------- */ - -#ifndef GL_MESA_window_pos -#define GL_MESA_window_pos 1 - -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort* p); - -#define glWindowPos2dMESA GLEW_GET_FUN(__glewWindowPos2dMESA) -#define glWindowPos2dvMESA GLEW_GET_FUN(__glewWindowPos2dvMESA) -#define glWindowPos2fMESA GLEW_GET_FUN(__glewWindowPos2fMESA) -#define glWindowPos2fvMESA GLEW_GET_FUN(__glewWindowPos2fvMESA) -#define glWindowPos2iMESA GLEW_GET_FUN(__glewWindowPos2iMESA) -#define glWindowPos2ivMESA GLEW_GET_FUN(__glewWindowPos2ivMESA) -#define glWindowPos2sMESA GLEW_GET_FUN(__glewWindowPos2sMESA) -#define glWindowPos2svMESA GLEW_GET_FUN(__glewWindowPos2svMESA) -#define glWindowPos3dMESA GLEW_GET_FUN(__glewWindowPos3dMESA) -#define glWindowPos3dvMESA GLEW_GET_FUN(__glewWindowPos3dvMESA) -#define glWindowPos3fMESA GLEW_GET_FUN(__glewWindowPos3fMESA) -#define glWindowPos3fvMESA GLEW_GET_FUN(__glewWindowPos3fvMESA) -#define glWindowPos3iMESA GLEW_GET_FUN(__glewWindowPos3iMESA) -#define glWindowPos3ivMESA GLEW_GET_FUN(__glewWindowPos3ivMESA) -#define glWindowPos3sMESA GLEW_GET_FUN(__glewWindowPos3sMESA) -#define glWindowPos3svMESA GLEW_GET_FUN(__glewWindowPos3svMESA) -#define glWindowPos4dMESA GLEW_GET_FUN(__glewWindowPos4dMESA) -#define glWindowPos4dvMESA GLEW_GET_FUN(__glewWindowPos4dvMESA) -#define glWindowPos4fMESA GLEW_GET_FUN(__glewWindowPos4fMESA) -#define glWindowPos4fvMESA GLEW_GET_FUN(__glewWindowPos4fvMESA) -#define glWindowPos4iMESA GLEW_GET_FUN(__glewWindowPos4iMESA) -#define glWindowPos4ivMESA GLEW_GET_FUN(__glewWindowPos4ivMESA) -#define glWindowPos4sMESA GLEW_GET_FUN(__glewWindowPos4sMESA) -#define glWindowPos4svMESA GLEW_GET_FUN(__glewWindowPos4svMESA) - -#define GLEW_MESA_window_pos GLEW_GET_VAR(__GLEW_MESA_window_pos) - -#endif /* GL_MESA_window_pos */ - -/* ------------------------- GL_MESA_ycbcr_texture ------------------------- */ - -#ifndef GL_MESA_ycbcr_texture -#define GL_MESA_ycbcr_texture 1 - -#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB -#define GL_YCBCR_MESA 0x8757 - -#define GLEW_MESA_ycbcr_texture GLEW_GET_VAR(__GLEW_MESA_ycbcr_texture) - -#endif /* GL_MESA_ycbcr_texture */ - -/* ----------------------- GL_NVX_conditional_render ----------------------- */ - -#ifndef GL_NVX_conditional_render -#define GL_NVX_conditional_render 1 - -typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVXPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVXPROC) (void); - -#define glBeginConditionalRenderNVX GLEW_GET_FUN(__glewBeginConditionalRenderNVX) -#define glEndConditionalRenderNVX GLEW_GET_FUN(__glewEndConditionalRenderNVX) - -#define GLEW_NVX_conditional_render GLEW_GET_VAR(__GLEW_NVX_conditional_render) - -#endif /* GL_NVX_conditional_render */ - -/* ------------------------- GL_NVX_gpu_memory_info ------------------------ */ - -#ifndef GL_NVX_gpu_memory_info -#define GL_NVX_gpu_memory_info 1 - -#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047 -#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048 -#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049 -#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A -#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B - -#define GLEW_NVX_gpu_memory_info GLEW_GET_VAR(__GLEW_NVX_gpu_memory_info) - -#endif /* GL_NVX_gpu_memory_info */ - -/* ------------------- GL_NV_bindless_multi_draw_indirect ------------------ */ - -#ifndef GL_NV_bindless_multi_draw_indirect -#define GL_NV_bindless_multi_draw_indirect 1 - -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); - -#define glMultiDrawArraysIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawArraysIndirectBindlessNV) -#define glMultiDrawElementsIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawElementsIndirectBindlessNV) - -#define GLEW_NV_bindless_multi_draw_indirect GLEW_GET_VAR(__GLEW_NV_bindless_multi_draw_indirect) - -#endif /* GL_NV_bindless_multi_draw_indirect */ - -/* ---------------- GL_NV_bindless_multi_draw_indirect_count --------------- */ - -#ifndef GL_NV_bindless_multi_draw_indirect_count -#define GL_NV_bindless_multi_draw_indirect_count 1 - -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, const void *indirect, GLintptr drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); - -#define glMultiDrawArraysIndirectBindlessCountNV GLEW_GET_FUN(__glewMultiDrawArraysIndirectBindlessCountNV) -#define glMultiDrawElementsIndirectBindlessCountNV GLEW_GET_FUN(__glewMultiDrawElementsIndirectBindlessCountNV) - -#define GLEW_NV_bindless_multi_draw_indirect_count GLEW_GET_VAR(__GLEW_NV_bindless_multi_draw_indirect_count) - -#endif /* GL_NV_bindless_multi_draw_indirect_count */ - -/* ------------------------- GL_NV_bindless_texture ------------------------ */ - -#ifndef GL_NV_bindless_texture -#define GL_NV_bindless_texture 1 - -typedef GLuint64 (GLAPIENTRY * PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); -typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture); -typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); -typedef GLboolean (GLAPIENTRY * PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); -typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); -typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values); -typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); -typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64* value); - -#define glGetImageHandleNV GLEW_GET_FUN(__glewGetImageHandleNV) -#define glGetTextureHandleNV GLEW_GET_FUN(__glewGetTextureHandleNV) -#define glGetTextureSamplerHandleNV GLEW_GET_FUN(__glewGetTextureSamplerHandleNV) -#define glIsImageHandleResidentNV GLEW_GET_FUN(__glewIsImageHandleResidentNV) -#define glIsTextureHandleResidentNV GLEW_GET_FUN(__glewIsTextureHandleResidentNV) -#define glMakeImageHandleNonResidentNV GLEW_GET_FUN(__glewMakeImageHandleNonResidentNV) -#define glMakeImageHandleResidentNV GLEW_GET_FUN(__glewMakeImageHandleResidentNV) -#define glMakeTextureHandleNonResidentNV GLEW_GET_FUN(__glewMakeTextureHandleNonResidentNV) -#define glMakeTextureHandleResidentNV GLEW_GET_FUN(__glewMakeTextureHandleResidentNV) -#define glProgramUniformHandleui64NV GLEW_GET_FUN(__glewProgramUniformHandleui64NV) -#define glProgramUniformHandleui64vNV GLEW_GET_FUN(__glewProgramUniformHandleui64vNV) -#define glUniformHandleui64NV GLEW_GET_FUN(__glewUniformHandleui64NV) -#define glUniformHandleui64vNV GLEW_GET_FUN(__glewUniformHandleui64vNV) - -#define GLEW_NV_bindless_texture GLEW_GET_VAR(__GLEW_NV_bindless_texture) - -#endif /* GL_NV_bindless_texture */ - -/* --------------------- GL_NV_blend_equation_advanced --------------------- */ - -#ifndef GL_NV_blend_equation_advanced -#define GL_NV_blend_equation_advanced 1 - -#define GL_XOR_NV 0x1506 -#define GL_RED_NV 0x1903 -#define GL_GREEN_NV 0x1904 -#define GL_BLUE_NV 0x1905 -#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 -#define GL_BLEND_OVERLAP_NV 0x9281 -#define GL_UNCORRELATED_NV 0x9282 -#define GL_DISJOINT_NV 0x9283 -#define GL_CONJOINT_NV 0x9284 -#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 -#define GL_SRC_NV 0x9286 -#define GL_DST_NV 0x9287 -#define GL_SRC_OVER_NV 0x9288 -#define GL_DST_OVER_NV 0x9289 -#define GL_SRC_IN_NV 0x928A -#define GL_DST_IN_NV 0x928B -#define GL_SRC_OUT_NV 0x928C -#define GL_DST_OUT_NV 0x928D -#define GL_SRC_ATOP_NV 0x928E -#define GL_DST_ATOP_NV 0x928F -#define GL_PLUS_NV 0x9291 -#define GL_PLUS_DARKER_NV 0x9292 -#define GL_MULTIPLY_NV 0x9294 -#define GL_SCREEN_NV 0x9295 -#define GL_OVERLAY_NV 0x9296 -#define GL_DARKEN_NV 0x9297 -#define GL_LIGHTEN_NV 0x9298 -#define GL_COLORDODGE_NV 0x9299 -#define GL_COLORBURN_NV 0x929A -#define GL_HARDLIGHT_NV 0x929B -#define GL_SOFTLIGHT_NV 0x929C -#define GL_DIFFERENCE_NV 0x929E -#define GL_MINUS_NV 0x929F -#define GL_EXCLUSION_NV 0x92A0 -#define GL_CONTRAST_NV 0x92A1 -#define GL_INVERT_RGB_NV 0x92A3 -#define GL_LINEARDODGE_NV 0x92A4 -#define GL_LINEARBURN_NV 0x92A5 -#define GL_VIVIDLIGHT_NV 0x92A6 -#define GL_LINEARLIGHT_NV 0x92A7 -#define GL_PINLIGHT_NV 0x92A8 -#define GL_HARDMIX_NV 0x92A9 -#define GL_HSL_HUE_NV 0x92AD -#define GL_HSL_SATURATION_NV 0x92AE -#define GL_HSL_COLOR_NV 0x92AF -#define GL_HSL_LUMINOSITY_NV 0x92B0 -#define GL_PLUS_CLAMPED_NV 0x92B1 -#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 -#define GL_MINUS_CLAMPED_NV 0x92B3 -#define GL_INVERT_OVG_NV 0x92B4 - -typedef void (GLAPIENTRY * PFNGLBLENDBARRIERNVPROC) (void); -typedef void (GLAPIENTRY * PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); - -#define glBlendBarrierNV GLEW_GET_FUN(__glewBlendBarrierNV) -#define glBlendParameteriNV GLEW_GET_FUN(__glewBlendParameteriNV) - -#define GLEW_NV_blend_equation_advanced GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced) - -#endif /* GL_NV_blend_equation_advanced */ - -/* ----------------- GL_NV_blend_equation_advanced_coherent ---------------- */ - -#ifndef GL_NV_blend_equation_advanced_coherent -#define GL_NV_blend_equation_advanced_coherent 1 - -#define GLEW_NV_blend_equation_advanced_coherent GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced_coherent) - -#endif /* GL_NV_blend_equation_advanced_coherent */ - -/* --------------------------- GL_NV_blend_square -------------------------- */ - -#ifndef GL_NV_blend_square -#define GL_NV_blend_square 1 - -#define GLEW_NV_blend_square GLEW_GET_VAR(__GLEW_NV_blend_square) - -#endif /* GL_NV_blend_square */ - -/* ------------------------- GL_NV_compute_program5 ------------------------ */ - -#ifndef GL_NV_compute_program5 -#define GL_NV_compute_program5 1 - -#define GL_COMPUTE_PROGRAM_NV 0x90FB -#define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC - -#define GLEW_NV_compute_program5 GLEW_GET_VAR(__GLEW_NV_compute_program5) - -#endif /* GL_NV_compute_program5 */ - -/* ------------------------ GL_NV_conditional_render ----------------------- */ - -#ifndef GL_NV_conditional_render -#define GL_NV_conditional_render 1 - -#define GL_QUERY_WAIT_NV 0x8E13 -#define GL_QUERY_NO_WAIT_NV 0x8E14 -#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 -#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 - -typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); -typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVPROC) (void); - -#define glBeginConditionalRenderNV GLEW_GET_FUN(__glewBeginConditionalRenderNV) -#define glEndConditionalRenderNV GLEW_GET_FUN(__glewEndConditionalRenderNV) - -#define GLEW_NV_conditional_render GLEW_GET_VAR(__GLEW_NV_conditional_render) - -#endif /* GL_NV_conditional_render */ - -/* ----------------------- GL_NV_conservative_raster ----------------------- */ - -#ifndef GL_NV_conservative_raster -#define GL_NV_conservative_raster 1 - -#define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346 -#define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347 -#define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348 -#define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349 - -typedef void (GLAPIENTRY * PFNGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits); - -#define glSubpixelPrecisionBiasNV GLEW_GET_FUN(__glewSubpixelPrecisionBiasNV) - -#define GLEW_NV_conservative_raster GLEW_GET_VAR(__GLEW_NV_conservative_raster) - -#endif /* GL_NV_conservative_raster */ - -/* -------------------- GL_NV_conservative_raster_dilate ------------------- */ - -#ifndef GL_NV_conservative_raster_dilate -#define GL_NV_conservative_raster_dilate 1 - -#define GL_CONSERVATIVE_RASTER_DILATE_NV 0x9379 -#define GL_CONSERVATIVE_RASTER_DILATE_RANGE_NV 0x937A -#define GL_CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV 0x937B - -typedef void (GLAPIENTRY * PFNGLCONSERVATIVERASTERPARAMETERFNVPROC) (GLenum pname, GLfloat value); - -#define glConservativeRasterParameterfNV GLEW_GET_FUN(__glewConservativeRasterParameterfNV) - -#define GLEW_NV_conservative_raster_dilate GLEW_GET_VAR(__GLEW_NV_conservative_raster_dilate) - -#endif /* GL_NV_conservative_raster_dilate */ - -/* ----------------------- GL_NV_copy_depth_to_color ----------------------- */ - -#ifndef GL_NV_copy_depth_to_color -#define GL_NV_copy_depth_to_color 1 - -#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E -#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F - -#define GLEW_NV_copy_depth_to_color GLEW_GET_VAR(__GLEW_NV_copy_depth_to_color) - -#endif /* GL_NV_copy_depth_to_color */ - -/* ---------------------------- GL_NV_copy_image --------------------------- */ - -#ifndef GL_NV_copy_image -#define GL_NV_copy_image 1 - -typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); - -#define glCopyImageSubDataNV GLEW_GET_FUN(__glewCopyImageSubDataNV) - -#define GLEW_NV_copy_image GLEW_GET_VAR(__GLEW_NV_copy_image) - -#endif /* GL_NV_copy_image */ - -/* -------------------------- GL_NV_deep_texture3D ------------------------- */ - -#ifndef GL_NV_deep_texture3D -#define GL_NV_deep_texture3D 1 - -#define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0 -#define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV 0x90D1 - -#define GLEW_NV_deep_texture3D GLEW_GET_VAR(__GLEW_NV_deep_texture3D) - -#endif /* GL_NV_deep_texture3D */ - -/* ------------------------ GL_NV_depth_buffer_float ----------------------- */ - -#ifndef GL_NV_depth_buffer_float -#define GL_NV_depth_buffer_float 1 - -#define GL_DEPTH_COMPONENT32F_NV 0x8DAB -#define GL_DEPTH32F_STENCIL8_NV 0x8DAC -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD -#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF - -typedef void (GLAPIENTRY * PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); -typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); -typedef void (GLAPIENTRY * PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); - -#define glClearDepthdNV GLEW_GET_FUN(__glewClearDepthdNV) -#define glDepthBoundsdNV GLEW_GET_FUN(__glewDepthBoundsdNV) -#define glDepthRangedNV GLEW_GET_FUN(__glewDepthRangedNV) - -#define GLEW_NV_depth_buffer_float GLEW_GET_VAR(__GLEW_NV_depth_buffer_float) - -#endif /* GL_NV_depth_buffer_float */ - -/* --------------------------- GL_NV_depth_clamp --------------------------- */ - -#ifndef GL_NV_depth_clamp -#define GL_NV_depth_clamp 1 - -#define GL_DEPTH_CLAMP_NV 0x864F - -#define GLEW_NV_depth_clamp GLEW_GET_VAR(__GLEW_NV_depth_clamp) - -#endif /* GL_NV_depth_clamp */ - -/* ---------------------- GL_NV_depth_range_unclamped ---------------------- */ - -#ifndef GL_NV_depth_range_unclamped -#define GL_NV_depth_range_unclamped 1 - -#define GL_SAMPLE_COUNT_BITS_NV 0x8864 -#define GL_CURRENT_SAMPLE_COUNT_QUERY_NV 0x8865 -#define GL_QUERY_RESULT_NV 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_NV 0x8867 -#define GL_SAMPLE_COUNT_NV 0x8914 - -#define GLEW_NV_depth_range_unclamped GLEW_GET_VAR(__GLEW_NV_depth_range_unclamped) - -#endif /* GL_NV_depth_range_unclamped */ - -/* --------------------------- GL_NV_draw_texture -------------------------- */ - -#ifndef GL_NV_draw_texture -#define GL_NV_draw_texture 1 - -typedef void (GLAPIENTRY * PFNGLDRAWTEXTURENVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); - -#define glDrawTextureNV GLEW_GET_FUN(__glewDrawTextureNV) - -#define GLEW_NV_draw_texture GLEW_GET_VAR(__GLEW_NV_draw_texture) - -#endif /* GL_NV_draw_texture */ - -/* ---------------------------- GL_NV_evaluators --------------------------- */ - -#ifndef GL_NV_evaluators -#define GL_NV_evaluators 1 - -#define GL_EVAL_2D_NV 0x86C0 -#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 -#define GL_MAP_TESSELLATION_NV 0x86C2 -#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 -#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 -#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 -#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 -#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 -#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 -#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 -#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA -#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB -#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC -#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD -#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE -#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF -#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 -#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 -#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 -#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 -#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 -#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 -#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 -#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 - -typedef void (GLAPIENTRY * PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); -typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); -typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); -typedef void (GLAPIENTRY * PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint* params); - -#define glEvalMapsNV GLEW_GET_FUN(__glewEvalMapsNV) -#define glGetMapAttribParameterfvNV GLEW_GET_FUN(__glewGetMapAttribParameterfvNV) -#define glGetMapAttribParameterivNV GLEW_GET_FUN(__glewGetMapAttribParameterivNV) -#define glGetMapControlPointsNV GLEW_GET_FUN(__glewGetMapControlPointsNV) -#define glGetMapParameterfvNV GLEW_GET_FUN(__glewGetMapParameterfvNV) -#define glGetMapParameterivNV GLEW_GET_FUN(__glewGetMapParameterivNV) -#define glMapControlPointsNV GLEW_GET_FUN(__glewMapControlPointsNV) -#define glMapParameterfvNV GLEW_GET_FUN(__glewMapParameterfvNV) -#define glMapParameterivNV GLEW_GET_FUN(__glewMapParameterivNV) - -#define GLEW_NV_evaluators GLEW_GET_VAR(__GLEW_NV_evaluators) - -#endif /* GL_NV_evaluators */ - -/* ----------------------- GL_NV_explicit_multisample ---------------------- */ - -#ifndef GL_NV_explicit_multisample -#define GL_NV_explicit_multisample 1 - -#define GL_SAMPLE_POSITION_NV 0x8E50 -#define GL_SAMPLE_MASK_NV 0x8E51 -#define GL_SAMPLE_MASK_VALUE_NV 0x8E52 -#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 -#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 -#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 -#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 -#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 -#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 -#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 - -typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat* val); -typedef void (GLAPIENTRY * PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); -typedef void (GLAPIENTRY * PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); - -#define glGetMultisamplefvNV GLEW_GET_FUN(__glewGetMultisamplefvNV) -#define glSampleMaskIndexedNV GLEW_GET_FUN(__glewSampleMaskIndexedNV) -#define glTexRenderbufferNV GLEW_GET_FUN(__glewTexRenderbufferNV) - -#define GLEW_NV_explicit_multisample GLEW_GET_VAR(__GLEW_NV_explicit_multisample) - -#endif /* GL_NV_explicit_multisample */ - -/* ------------------------------ GL_NV_fence ------------------------------ */ - -#ifndef GL_NV_fence -#define GL_NV_fence 1 - -#define GL_ALL_COMPLETED_NV 0x84F2 -#define GL_FENCE_STATUS_NV 0x84F3 -#define GL_FENCE_CONDITION_NV 0x84F4 - -typedef void (GLAPIENTRY * PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint* fences); -typedef void (GLAPIENTRY * PFNGLFINISHFENCENVPROC) (GLuint fence); -typedef void (GLAPIENTRY * PFNGLGENFENCESNVPROC) (GLsizei n, GLuint* fences); -typedef void (GLAPIENTRY * PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISFENCENVPROC) (GLuint fence); -typedef void (GLAPIENTRY * PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); -typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCENVPROC) (GLuint fence); - -#define glDeleteFencesNV GLEW_GET_FUN(__glewDeleteFencesNV) -#define glFinishFenceNV GLEW_GET_FUN(__glewFinishFenceNV) -#define glGenFencesNV GLEW_GET_FUN(__glewGenFencesNV) -#define glGetFenceivNV GLEW_GET_FUN(__glewGetFenceivNV) -#define glIsFenceNV GLEW_GET_FUN(__glewIsFenceNV) -#define glSetFenceNV GLEW_GET_FUN(__glewSetFenceNV) -#define glTestFenceNV GLEW_GET_FUN(__glewTestFenceNV) - -#define GLEW_NV_fence GLEW_GET_VAR(__GLEW_NV_fence) - -#endif /* GL_NV_fence */ - -/* -------------------------- GL_NV_fill_rectangle ------------------------- */ - -#ifndef GL_NV_fill_rectangle -#define GL_NV_fill_rectangle 1 - -#define GL_FILL_RECTANGLE_NV 0x933C - -#define GLEW_NV_fill_rectangle GLEW_GET_VAR(__GLEW_NV_fill_rectangle) - -#endif /* GL_NV_fill_rectangle */ - -/* --------------------------- GL_NV_float_buffer -------------------------- */ - -#ifndef GL_NV_float_buffer -#define GL_NV_float_buffer 1 - -#define GL_FLOAT_R_NV 0x8880 -#define GL_FLOAT_RG_NV 0x8881 -#define GL_FLOAT_RGB_NV 0x8882 -#define GL_FLOAT_RGBA_NV 0x8883 -#define GL_FLOAT_R16_NV 0x8884 -#define GL_FLOAT_R32_NV 0x8885 -#define GL_FLOAT_RG16_NV 0x8886 -#define GL_FLOAT_RG32_NV 0x8887 -#define GL_FLOAT_RGB16_NV 0x8888 -#define GL_FLOAT_RGB32_NV 0x8889 -#define GL_FLOAT_RGBA16_NV 0x888A -#define GL_FLOAT_RGBA32_NV 0x888B -#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C -#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D -#define GL_FLOAT_RGBA_MODE_NV 0x888E - -#define GLEW_NV_float_buffer GLEW_GET_VAR(__GLEW_NV_float_buffer) - -#endif /* GL_NV_float_buffer */ - -/* --------------------------- GL_NV_fog_distance -------------------------- */ - -#ifndef GL_NV_fog_distance -#define GL_NV_fog_distance 1 - -#define GL_FOG_DISTANCE_MODE_NV 0x855A -#define GL_EYE_RADIAL_NV 0x855B -#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C - -#define GLEW_NV_fog_distance GLEW_GET_VAR(__GLEW_NV_fog_distance) - -#endif /* GL_NV_fog_distance */ - -/* -------------------- GL_NV_fragment_coverage_to_color ------------------- */ - -#ifndef GL_NV_fragment_coverage_to_color -#define GL_NV_fragment_coverage_to_color 1 - -#define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD -#define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE - -typedef void (GLAPIENTRY * PFNGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color); - -#define glFragmentCoverageColorNV GLEW_GET_FUN(__glewFragmentCoverageColorNV) - -#define GLEW_NV_fragment_coverage_to_color GLEW_GET_VAR(__GLEW_NV_fragment_coverage_to_color) - -#endif /* GL_NV_fragment_coverage_to_color */ - -/* ------------------------- GL_NV_fragment_program ------------------------ */ - -#ifndef GL_NV_fragment_program -#define GL_NV_fragment_program 1 - -#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 -#define GL_FRAGMENT_PROGRAM_NV 0x8870 -#define GL_MAX_TEXTURE_COORDS_NV 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 -#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 -#define GL_PROGRAM_ERROR_STRING_NV 0x8874 - -typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble *params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLdouble v[]); -typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLfloat v[]); - -#define glGetProgramNamedParameterdvNV GLEW_GET_FUN(__glewGetProgramNamedParameterdvNV) -#define glGetProgramNamedParameterfvNV GLEW_GET_FUN(__glewGetProgramNamedParameterfvNV) -#define glProgramNamedParameter4dNV GLEW_GET_FUN(__glewProgramNamedParameter4dNV) -#define glProgramNamedParameter4dvNV GLEW_GET_FUN(__glewProgramNamedParameter4dvNV) -#define glProgramNamedParameter4fNV GLEW_GET_FUN(__glewProgramNamedParameter4fNV) -#define glProgramNamedParameter4fvNV GLEW_GET_FUN(__glewProgramNamedParameter4fvNV) - -#define GLEW_NV_fragment_program GLEW_GET_VAR(__GLEW_NV_fragment_program) - -#endif /* GL_NV_fragment_program */ - -/* ------------------------ GL_NV_fragment_program2 ------------------------ */ - -#ifndef GL_NV_fragment_program2 -#define GL_NV_fragment_program2 1 - -#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 -#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 -#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 -#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 -#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 - -#define GLEW_NV_fragment_program2 GLEW_GET_VAR(__GLEW_NV_fragment_program2) - -#endif /* GL_NV_fragment_program2 */ - -/* ------------------------ GL_NV_fragment_program4 ------------------------ */ - -#ifndef GL_NV_fragment_program4 -#define GL_NV_fragment_program4 1 - -#define GLEW_NV_fragment_program4 GLEW_GET_VAR(__GLEW_NV_fragment_program4) - -#endif /* GL_NV_fragment_program4 */ - -/* --------------------- GL_NV_fragment_program_option --------------------- */ - -#ifndef GL_NV_fragment_program_option -#define GL_NV_fragment_program_option 1 - -#define GLEW_NV_fragment_program_option GLEW_GET_VAR(__GLEW_NV_fragment_program_option) - -#endif /* GL_NV_fragment_program_option */ - -/* -------------------- GL_NV_fragment_shader_interlock -------------------- */ - -#ifndef GL_NV_fragment_shader_interlock -#define GL_NV_fragment_shader_interlock 1 - -#define GLEW_NV_fragment_shader_interlock GLEW_GET_VAR(__GLEW_NV_fragment_shader_interlock) - -#endif /* GL_NV_fragment_shader_interlock */ - -/* -------------------- GL_NV_framebuffer_mixed_samples -------------------- */ - -#ifndef GL_NV_framebuffer_mixed_samples -#define GL_NV_framebuffer_mixed_samples 1 - -#define GL_COLOR_SAMPLES_NV 0x8E20 -#define GL_RASTER_MULTISAMPLE_EXT 0x9327 -#define GL_RASTER_SAMPLES_EXT 0x9328 -#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 -#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A -#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B -#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C -#define GL_DEPTH_SAMPLES_NV 0x932D -#define GL_STENCIL_SAMPLES_NV 0x932E -#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F -#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 -#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 -#define GL_COVERAGE_MODULATION_NV 0x9332 -#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 - -#define GLEW_NV_framebuffer_mixed_samples GLEW_GET_VAR(__GLEW_NV_framebuffer_mixed_samples) - -#endif /* GL_NV_framebuffer_mixed_samples */ - -/* ----------------- GL_NV_framebuffer_multisample_coverage ---------------- */ - -#ifndef GL_NV_framebuffer_multisample_coverage -#define GL_NV_framebuffer_multisample_coverage 1 - -#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB -#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 -#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 -#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 - -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); - -#define glRenderbufferStorageMultisampleCoverageNV GLEW_GET_FUN(__glewRenderbufferStorageMultisampleCoverageNV) - -#define GLEW_NV_framebuffer_multisample_coverage GLEW_GET_VAR(__GLEW_NV_framebuffer_multisample_coverage) - -#endif /* GL_NV_framebuffer_multisample_coverage */ - -/* ------------------------ GL_NV_geometry_program4 ------------------------ */ - -#ifndef GL_NV_geometry_program4 -#define GL_NV_geometry_program4 1 - -#define GL_GEOMETRY_PROGRAM_NV 0x8C26 -#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 -#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 - -typedef void (GLAPIENTRY * PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); - -#define glProgramVertexLimitNV GLEW_GET_FUN(__glewProgramVertexLimitNV) - -#define GLEW_NV_geometry_program4 GLEW_GET_VAR(__GLEW_NV_geometry_program4) - -#endif /* GL_NV_geometry_program4 */ - -/* ------------------------- GL_NV_geometry_shader4 ------------------------ */ - -#ifndef GL_NV_geometry_shader4 -#define GL_NV_geometry_shader4 1 - -#define GLEW_NV_geometry_shader4 GLEW_GET_VAR(__GLEW_NV_geometry_shader4) - -#endif /* GL_NV_geometry_shader4 */ - -/* ------------------- GL_NV_geometry_shader_passthrough ------------------- */ - -#ifndef GL_NV_geometry_shader_passthrough -#define GL_NV_geometry_shader_passthrough 1 - -#define GLEW_NV_geometry_shader_passthrough GLEW_GET_VAR(__GLEW_NV_geometry_shader_passthrough) - -#endif /* GL_NV_geometry_shader_passthrough */ - -/* --------------------------- GL_NV_gpu_program4 -------------------------- */ - -#ifndef GL_NV_gpu_program4 -#define GL_NV_gpu_program4 1 - -#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 -#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 -#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 -#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 -#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 -#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 -#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 -#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 - -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); - -#define glProgramEnvParameterI4iNV GLEW_GET_FUN(__glewProgramEnvParameterI4iNV) -#define glProgramEnvParameterI4ivNV GLEW_GET_FUN(__glewProgramEnvParameterI4ivNV) -#define glProgramEnvParameterI4uiNV GLEW_GET_FUN(__glewProgramEnvParameterI4uiNV) -#define glProgramEnvParameterI4uivNV GLEW_GET_FUN(__glewProgramEnvParameterI4uivNV) -#define glProgramEnvParametersI4ivNV GLEW_GET_FUN(__glewProgramEnvParametersI4ivNV) -#define glProgramEnvParametersI4uivNV GLEW_GET_FUN(__glewProgramEnvParametersI4uivNV) -#define glProgramLocalParameterI4iNV GLEW_GET_FUN(__glewProgramLocalParameterI4iNV) -#define glProgramLocalParameterI4ivNV GLEW_GET_FUN(__glewProgramLocalParameterI4ivNV) -#define glProgramLocalParameterI4uiNV GLEW_GET_FUN(__glewProgramLocalParameterI4uiNV) -#define glProgramLocalParameterI4uivNV GLEW_GET_FUN(__glewProgramLocalParameterI4uivNV) -#define glProgramLocalParametersI4ivNV GLEW_GET_FUN(__glewProgramLocalParametersI4ivNV) -#define glProgramLocalParametersI4uivNV GLEW_GET_FUN(__glewProgramLocalParametersI4uivNV) - -#define GLEW_NV_gpu_program4 GLEW_GET_VAR(__GLEW_NV_gpu_program4) - -#endif /* GL_NV_gpu_program4 */ - -/* --------------------------- GL_NV_gpu_program5 -------------------------- */ - -#ifndef GL_NV_gpu_program5 -#define GL_NV_gpu_program5 1 - -#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A -#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B -#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C -#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F - -#define GLEW_NV_gpu_program5 GLEW_GET_VAR(__GLEW_NV_gpu_program5) - -#endif /* GL_NV_gpu_program5 */ - -/* -------------------- GL_NV_gpu_program5_mem_extended -------------------- */ - -#ifndef GL_NV_gpu_program5_mem_extended -#define GL_NV_gpu_program5_mem_extended 1 - -#define GLEW_NV_gpu_program5_mem_extended GLEW_GET_VAR(__GLEW_NV_gpu_program5_mem_extended) - -#endif /* GL_NV_gpu_program5_mem_extended */ - -/* ------------------------- GL_NV_gpu_program_fp64 ------------------------ */ - -#ifndef GL_NV_gpu_program_fp64 -#define GL_NV_gpu_program_fp64 1 - -#define GLEW_NV_gpu_program_fp64 GLEW_GET_VAR(__GLEW_NV_gpu_program_fp64) - -#endif /* GL_NV_gpu_program_fp64 */ - -/* --------------------------- GL_NV_gpu_shader5 --------------------------- */ - -#ifndef GL_NV_gpu_shader5 -#define GL_NV_gpu_shader5 1 - -#define GL_INT64_NV 0x140E -#define GL_UNSIGNED_INT64_NV 0x140F -#define GL_INT8_NV 0x8FE0 -#define GL_INT8_VEC2_NV 0x8FE1 -#define GL_INT8_VEC3_NV 0x8FE2 -#define GL_INT8_VEC4_NV 0x8FE3 -#define GL_INT16_NV 0x8FE4 -#define GL_INT16_VEC2_NV 0x8FE5 -#define GL_INT16_VEC3_NV 0x8FE6 -#define GL_INT16_VEC4_NV 0x8FE7 -#define GL_INT64_VEC2_NV 0x8FE9 -#define GL_INT64_VEC3_NV 0x8FEA -#define GL_INT64_VEC4_NV 0x8FEB -#define GL_UNSIGNED_INT8_NV 0x8FEC -#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED -#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE -#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF -#define GL_UNSIGNED_INT16_NV 0x8FF0 -#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 -#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 -#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 -#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 -#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 -#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 -#define GL_FLOAT16_NV 0x8FF8 -#define GL_FLOAT16_VEC2_NV 0x8FF9 -#define GL_FLOAT16_VEC3_NV 0x8FFA -#define GL_FLOAT16_VEC4_NV 0x8FFB - -typedef void (GLAPIENTRY * PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT* params); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); -typedef void (GLAPIENTRY * PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); -typedef void (GLAPIENTRY * PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (GLAPIENTRY * PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (GLAPIENTRY * PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); - -#define glGetUniformi64vNV GLEW_GET_FUN(__glewGetUniformi64vNV) -#define glGetUniformui64vNV GLEW_GET_FUN(__glewGetUniformui64vNV) -#define glProgramUniform1i64NV GLEW_GET_FUN(__glewProgramUniform1i64NV) -#define glProgramUniform1i64vNV GLEW_GET_FUN(__glewProgramUniform1i64vNV) -#define glProgramUniform1ui64NV GLEW_GET_FUN(__glewProgramUniform1ui64NV) -#define glProgramUniform1ui64vNV GLEW_GET_FUN(__glewProgramUniform1ui64vNV) -#define glProgramUniform2i64NV GLEW_GET_FUN(__glewProgramUniform2i64NV) -#define glProgramUniform2i64vNV GLEW_GET_FUN(__glewProgramUniform2i64vNV) -#define glProgramUniform2ui64NV GLEW_GET_FUN(__glewProgramUniform2ui64NV) -#define glProgramUniform2ui64vNV GLEW_GET_FUN(__glewProgramUniform2ui64vNV) -#define glProgramUniform3i64NV GLEW_GET_FUN(__glewProgramUniform3i64NV) -#define glProgramUniform3i64vNV GLEW_GET_FUN(__glewProgramUniform3i64vNV) -#define glProgramUniform3ui64NV GLEW_GET_FUN(__glewProgramUniform3ui64NV) -#define glProgramUniform3ui64vNV GLEW_GET_FUN(__glewProgramUniform3ui64vNV) -#define glProgramUniform4i64NV GLEW_GET_FUN(__glewProgramUniform4i64NV) -#define glProgramUniform4i64vNV GLEW_GET_FUN(__glewProgramUniform4i64vNV) -#define glProgramUniform4ui64NV GLEW_GET_FUN(__glewProgramUniform4ui64NV) -#define glProgramUniform4ui64vNV GLEW_GET_FUN(__glewProgramUniform4ui64vNV) -#define glUniform1i64NV GLEW_GET_FUN(__glewUniform1i64NV) -#define glUniform1i64vNV GLEW_GET_FUN(__glewUniform1i64vNV) -#define glUniform1ui64NV GLEW_GET_FUN(__glewUniform1ui64NV) -#define glUniform1ui64vNV GLEW_GET_FUN(__glewUniform1ui64vNV) -#define glUniform2i64NV GLEW_GET_FUN(__glewUniform2i64NV) -#define glUniform2i64vNV GLEW_GET_FUN(__glewUniform2i64vNV) -#define glUniform2ui64NV GLEW_GET_FUN(__glewUniform2ui64NV) -#define glUniform2ui64vNV GLEW_GET_FUN(__glewUniform2ui64vNV) -#define glUniform3i64NV GLEW_GET_FUN(__glewUniform3i64NV) -#define glUniform3i64vNV GLEW_GET_FUN(__glewUniform3i64vNV) -#define glUniform3ui64NV GLEW_GET_FUN(__glewUniform3ui64NV) -#define glUniform3ui64vNV GLEW_GET_FUN(__glewUniform3ui64vNV) -#define glUniform4i64NV GLEW_GET_FUN(__glewUniform4i64NV) -#define glUniform4i64vNV GLEW_GET_FUN(__glewUniform4i64vNV) -#define glUniform4ui64NV GLEW_GET_FUN(__glewUniform4ui64NV) -#define glUniform4ui64vNV GLEW_GET_FUN(__glewUniform4ui64vNV) - -#define GLEW_NV_gpu_shader5 GLEW_GET_VAR(__GLEW_NV_gpu_shader5) - -#endif /* GL_NV_gpu_shader5 */ - -/* ---------------------------- GL_NV_half_float --------------------------- */ - -#ifndef GL_NV_half_float -#define GL_NV_half_float 1 - -#define GL_HALF_FLOAT_NV 0x140B - -typedef unsigned short GLhalf; - -typedef void (GLAPIENTRY * PFNGLCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); -typedef void (GLAPIENTRY * PFNGLCOLOR3HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLCOLOR4HNVPROC) (GLhalf red, GLhalf green, GLhalf blue, GLhalf alpha); -typedef void (GLAPIENTRY * PFNGLCOLOR4HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLFOGCOORDHNVPROC) (GLhalf fog); -typedef void (GLAPIENTRY * PFNGLFOGCOORDHVNVPROC) (const GLhalf* fog); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalf s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalf s, GLhalf t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r, GLhalf q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLNORMAL3HNVPROC) (GLhalf nx, GLhalf ny, GLhalf nz); -typedef void (GLAPIENTRY * PFNGLNORMAL3HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD1HNVPROC) (GLhalf s); -typedef void (GLAPIENTRY * PFNGLTEXCOORD1HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2HNVPROC) (GLhalf s, GLhalf t); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD3HNVPROC) (GLhalf s, GLhalf t, GLhalf r); -typedef void (GLAPIENTRY * PFNGLTEXCOORD3HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4HNVPROC) (GLhalf s, GLhalf t, GLhalf r, GLhalf q); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEX2HNVPROC) (GLhalf x, GLhalf y); -typedef void (GLAPIENTRY * PFNGLVERTEX2HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEX3HNVPROC) (GLhalf x, GLhalf y, GLhalf z); -typedef void (GLAPIENTRY * PFNGLVERTEX3HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEX4HNVPROC) (GLhalf x, GLhalf y, GLhalf z, GLhalf w); -typedef void (GLAPIENTRY * PFNGLVERTEX4HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalf x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalf x, GLhalf y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z, GLhalf w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHNVPROC) (GLhalf weight); -typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalf* weight); - -#define glColor3hNV GLEW_GET_FUN(__glewColor3hNV) -#define glColor3hvNV GLEW_GET_FUN(__glewColor3hvNV) -#define glColor4hNV GLEW_GET_FUN(__glewColor4hNV) -#define glColor4hvNV GLEW_GET_FUN(__glewColor4hvNV) -#define glFogCoordhNV GLEW_GET_FUN(__glewFogCoordhNV) -#define glFogCoordhvNV GLEW_GET_FUN(__glewFogCoordhvNV) -#define glMultiTexCoord1hNV GLEW_GET_FUN(__glewMultiTexCoord1hNV) -#define glMultiTexCoord1hvNV GLEW_GET_FUN(__glewMultiTexCoord1hvNV) -#define glMultiTexCoord2hNV GLEW_GET_FUN(__glewMultiTexCoord2hNV) -#define glMultiTexCoord2hvNV GLEW_GET_FUN(__glewMultiTexCoord2hvNV) -#define glMultiTexCoord3hNV GLEW_GET_FUN(__glewMultiTexCoord3hNV) -#define glMultiTexCoord3hvNV GLEW_GET_FUN(__glewMultiTexCoord3hvNV) -#define glMultiTexCoord4hNV GLEW_GET_FUN(__glewMultiTexCoord4hNV) -#define glMultiTexCoord4hvNV GLEW_GET_FUN(__glewMultiTexCoord4hvNV) -#define glNormal3hNV GLEW_GET_FUN(__glewNormal3hNV) -#define glNormal3hvNV GLEW_GET_FUN(__glewNormal3hvNV) -#define glSecondaryColor3hNV GLEW_GET_FUN(__glewSecondaryColor3hNV) -#define glSecondaryColor3hvNV GLEW_GET_FUN(__glewSecondaryColor3hvNV) -#define glTexCoord1hNV GLEW_GET_FUN(__glewTexCoord1hNV) -#define glTexCoord1hvNV GLEW_GET_FUN(__glewTexCoord1hvNV) -#define glTexCoord2hNV GLEW_GET_FUN(__glewTexCoord2hNV) -#define glTexCoord2hvNV GLEW_GET_FUN(__glewTexCoord2hvNV) -#define glTexCoord3hNV GLEW_GET_FUN(__glewTexCoord3hNV) -#define glTexCoord3hvNV GLEW_GET_FUN(__glewTexCoord3hvNV) -#define glTexCoord4hNV GLEW_GET_FUN(__glewTexCoord4hNV) -#define glTexCoord4hvNV GLEW_GET_FUN(__glewTexCoord4hvNV) -#define glVertex2hNV GLEW_GET_FUN(__glewVertex2hNV) -#define glVertex2hvNV GLEW_GET_FUN(__glewVertex2hvNV) -#define glVertex3hNV GLEW_GET_FUN(__glewVertex3hNV) -#define glVertex3hvNV GLEW_GET_FUN(__glewVertex3hvNV) -#define glVertex4hNV GLEW_GET_FUN(__glewVertex4hNV) -#define glVertex4hvNV GLEW_GET_FUN(__glewVertex4hvNV) -#define glVertexAttrib1hNV GLEW_GET_FUN(__glewVertexAttrib1hNV) -#define glVertexAttrib1hvNV GLEW_GET_FUN(__glewVertexAttrib1hvNV) -#define glVertexAttrib2hNV GLEW_GET_FUN(__glewVertexAttrib2hNV) -#define glVertexAttrib2hvNV GLEW_GET_FUN(__glewVertexAttrib2hvNV) -#define glVertexAttrib3hNV GLEW_GET_FUN(__glewVertexAttrib3hNV) -#define glVertexAttrib3hvNV GLEW_GET_FUN(__glewVertexAttrib3hvNV) -#define glVertexAttrib4hNV GLEW_GET_FUN(__glewVertexAttrib4hNV) -#define glVertexAttrib4hvNV GLEW_GET_FUN(__glewVertexAttrib4hvNV) -#define glVertexAttribs1hvNV GLEW_GET_FUN(__glewVertexAttribs1hvNV) -#define glVertexAttribs2hvNV GLEW_GET_FUN(__glewVertexAttribs2hvNV) -#define glVertexAttribs3hvNV GLEW_GET_FUN(__glewVertexAttribs3hvNV) -#define glVertexAttribs4hvNV GLEW_GET_FUN(__glewVertexAttribs4hvNV) -#define glVertexWeighthNV GLEW_GET_FUN(__glewVertexWeighthNV) -#define glVertexWeighthvNV GLEW_GET_FUN(__glewVertexWeighthvNV) - -#define GLEW_NV_half_float GLEW_GET_VAR(__GLEW_NV_half_float) - -#endif /* GL_NV_half_float */ - -/* ------------------- GL_NV_internalformat_sample_query ------------------- */ - -#ifndef GL_NV_internalformat_sample_query -#define GL_NV_internalformat_sample_query 1 - -#define GL_MULTISAMPLES_NV 0x9371 -#define GL_SUPERSAMPLE_SCALE_X_NV 0x9372 -#define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373 -#define GL_CONFORMANT_NV 0x9374 - -typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint* params); - -#define glGetInternalformatSampleivNV GLEW_GET_FUN(__glewGetInternalformatSampleivNV) - -#define GLEW_NV_internalformat_sample_query GLEW_GET_VAR(__GLEW_NV_internalformat_sample_query) - -#endif /* GL_NV_internalformat_sample_query */ - -/* ------------------------ GL_NV_light_max_exponent ----------------------- */ - -#ifndef GL_NV_light_max_exponent -#define GL_NV_light_max_exponent 1 - -#define GL_MAX_SHININESS_NV 0x8504 -#define GL_MAX_SPOT_EXPONENT_NV 0x8505 - -#define GLEW_NV_light_max_exponent GLEW_GET_VAR(__GLEW_NV_light_max_exponent) - -#endif /* GL_NV_light_max_exponent */ - -/* ----------------------- GL_NV_multisample_coverage ---------------------- */ - -#ifndef GL_NV_multisample_coverage -#define GL_NV_multisample_coverage 1 - -#define GL_COLOR_SAMPLES_NV 0x8E20 - -#define GLEW_NV_multisample_coverage GLEW_GET_VAR(__GLEW_NV_multisample_coverage) - -#endif /* GL_NV_multisample_coverage */ - -/* --------------------- GL_NV_multisample_filter_hint --------------------- */ - -#ifndef GL_NV_multisample_filter_hint -#define GL_NV_multisample_filter_hint 1 - -#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 - -#define GLEW_NV_multisample_filter_hint GLEW_GET_VAR(__GLEW_NV_multisample_filter_hint) - -#endif /* GL_NV_multisample_filter_hint */ - -/* ------------------------- GL_NV_occlusion_query ------------------------- */ - -#ifndef GL_NV_occlusion_query -#define GL_NV_occlusion_query 1 - -#define GL_PIXEL_COUNTER_BITS_NV 0x8864 -#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 -#define GL_PIXEL_COUNT_NV 0x8866 -#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 - -typedef void (GLAPIENTRY * PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLENDOCCLUSIONQUERYNVPROC) (void); -typedef void (GLAPIENTRY * PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); - -#define glBeginOcclusionQueryNV GLEW_GET_FUN(__glewBeginOcclusionQueryNV) -#define glDeleteOcclusionQueriesNV GLEW_GET_FUN(__glewDeleteOcclusionQueriesNV) -#define glEndOcclusionQueryNV GLEW_GET_FUN(__glewEndOcclusionQueryNV) -#define glGenOcclusionQueriesNV GLEW_GET_FUN(__glewGenOcclusionQueriesNV) -#define glGetOcclusionQueryivNV GLEW_GET_FUN(__glewGetOcclusionQueryivNV) -#define glGetOcclusionQueryuivNV GLEW_GET_FUN(__glewGetOcclusionQueryuivNV) -#define glIsOcclusionQueryNV GLEW_GET_FUN(__glewIsOcclusionQueryNV) - -#define GLEW_NV_occlusion_query GLEW_GET_VAR(__GLEW_NV_occlusion_query) - -#endif /* GL_NV_occlusion_query */ - -/* ----------------------- GL_NV_packed_depth_stencil ---------------------- */ - -#ifndef GL_NV_packed_depth_stencil -#define GL_NV_packed_depth_stencil 1 - -#define GL_DEPTH_STENCIL_NV 0x84F9 -#define GL_UNSIGNED_INT_24_8_NV 0x84FA - -#define GLEW_NV_packed_depth_stencil GLEW_GET_VAR(__GLEW_NV_packed_depth_stencil) - -#endif /* GL_NV_packed_depth_stencil */ - -/* --------------------- GL_NV_parameter_buffer_object --------------------- */ - -#ifndef GL_NV_parameter_buffer_object -#define GL_NV_parameter_buffer_object 1 - -#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 -#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 -#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 -#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 -#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 - -typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); - -#define glProgramBufferParametersIivNV GLEW_GET_FUN(__glewProgramBufferParametersIivNV) -#define glProgramBufferParametersIuivNV GLEW_GET_FUN(__glewProgramBufferParametersIuivNV) -#define glProgramBufferParametersfvNV GLEW_GET_FUN(__glewProgramBufferParametersfvNV) - -#define GLEW_NV_parameter_buffer_object GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object) - -#endif /* GL_NV_parameter_buffer_object */ - -/* --------------------- GL_NV_parameter_buffer_object2 -------------------- */ - -#ifndef GL_NV_parameter_buffer_object2 -#define GL_NV_parameter_buffer_object2 1 - -#define GLEW_NV_parameter_buffer_object2 GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object2) - -#endif /* GL_NV_parameter_buffer_object2 */ - -/* -------------------------- GL_NV_path_rendering ------------------------- */ - -#ifndef GL_NV_path_rendering -#define GL_NV_path_rendering 1 - -#define GL_CLOSE_PATH_NV 0x00 -#define GL_BOLD_BIT_NV 0x01 -#define GL_GLYPH_WIDTH_BIT_NV 0x01 -#define GL_GLYPH_HEIGHT_BIT_NV 0x02 -#define GL_ITALIC_BIT_NV 0x02 -#define GL_MOVE_TO_NV 0x02 -#define GL_RELATIVE_MOVE_TO_NV 0x03 -#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 -#define GL_LINE_TO_NV 0x04 -#define GL_RELATIVE_LINE_TO_NV 0x05 -#define GL_HORIZONTAL_LINE_TO_NV 0x06 -#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 -#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08 -#define GL_VERTICAL_LINE_TO_NV 0x08 -#define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09 -#define GL_QUADRATIC_CURVE_TO_NV 0x0A -#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B -#define GL_CUBIC_CURVE_TO_NV 0x0C -#define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D -#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E -#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F -#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10 -#define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10 -#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11 -#define GL_SMALL_CCW_ARC_TO_NV 0x12 -#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13 -#define GL_SMALL_CW_ARC_TO_NV 0x14 -#define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15 -#define GL_LARGE_CCW_ARC_TO_NV 0x16 -#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17 -#define GL_LARGE_CW_ARC_TO_NV 0x18 -#define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19 -#define GL_CONIC_CURVE_TO_NV 0x1A -#define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B -#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20 -#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40 -#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80 -#define GL_ROUNDED_RECT_NV 0xE8 -#define GL_RELATIVE_ROUNDED_RECT_NV 0xE9 -#define GL_ROUNDED_RECT2_NV 0xEA -#define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB -#define GL_ROUNDED_RECT4_NV 0xEC -#define GL_RELATIVE_ROUNDED_RECT4_NV 0xED -#define GL_ROUNDED_RECT8_NV 0xEE -#define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF -#define GL_RESTART_PATH_NV 0xF0 -#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2 -#define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4 -#define GL_RECT_NV 0xF6 -#define GL_RELATIVE_RECT_NV 0xF7 -#define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8 -#define GL_CIRCULAR_CW_ARC_TO_NV 0xFA -#define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC -#define GL_ARC_TO_NV 0xFE -#define GL_RELATIVE_ARC_TO_NV 0xFF -#define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 -#define GL_PRIMARY_COLOR_NV 0x852C -#define GL_SECONDARY_COLOR_NV 0x852D -#define GL_PRIMARY_COLOR 0x8577 -#define GL_PATH_FORMAT_SVG_NV 0x9070 -#define GL_PATH_FORMAT_PS_NV 0x9071 -#define GL_STANDARD_FONT_NAME_NV 0x9072 -#define GL_SYSTEM_FONT_NAME_NV 0x9073 -#define GL_FILE_NAME_NV 0x9074 -#define GL_PATH_STROKE_WIDTH_NV 0x9075 -#define GL_PATH_END_CAPS_NV 0x9076 -#define GL_PATH_INITIAL_END_CAP_NV 0x9077 -#define GL_PATH_TERMINAL_END_CAP_NV 0x9078 -#define GL_PATH_JOIN_STYLE_NV 0x9079 -#define GL_PATH_MITER_LIMIT_NV 0x907A -#define GL_PATH_DASH_CAPS_NV 0x907B -#define GL_PATH_INITIAL_DASH_CAP_NV 0x907C -#define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D -#define GL_PATH_DASH_OFFSET_NV 0x907E -#define GL_PATH_CLIENT_LENGTH_NV 0x907F -#define GL_PATH_FILL_MODE_NV 0x9080 -#define GL_PATH_FILL_MASK_NV 0x9081 -#define GL_PATH_FILL_COVER_MODE_NV 0x9082 -#define GL_PATH_STROKE_COVER_MODE_NV 0x9083 -#define GL_PATH_STROKE_MASK_NV 0x9084 -#define GL_PATH_STROKE_BOUND_NV 0x9086 -#define GL_COUNT_UP_NV 0x9088 -#define GL_COUNT_DOWN_NV 0x9089 -#define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A -#define GL_CONVEX_HULL_NV 0x908B -#define GL_BOUNDING_BOX_NV 0x908D -#define GL_TRANSLATE_X_NV 0x908E -#define GL_TRANSLATE_Y_NV 0x908F -#define GL_TRANSLATE_2D_NV 0x9090 -#define GL_TRANSLATE_3D_NV 0x9091 -#define GL_AFFINE_2D_NV 0x9092 -#define GL_AFFINE_3D_NV 0x9094 -#define GL_TRANSPOSE_AFFINE_2D_NV 0x9096 -#define GL_TRANSPOSE_AFFINE_3D_NV 0x9098 -#define GL_UTF8_NV 0x909A -#define GL_UTF16_NV 0x909B -#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C -#define GL_PATH_COMMAND_COUNT_NV 0x909D -#define GL_PATH_COORD_COUNT_NV 0x909E -#define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F -#define GL_PATH_COMPUTED_LENGTH_NV 0x90A0 -#define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1 -#define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2 -#define GL_SQUARE_NV 0x90A3 -#define GL_ROUND_NV 0x90A4 -#define GL_TRIANGULAR_NV 0x90A5 -#define GL_BEVEL_NV 0x90A6 -#define GL_MITER_REVERT_NV 0x90A7 -#define GL_MITER_TRUNCATE_NV 0x90A8 -#define GL_SKIP_MISSING_GLYPH_NV 0x90A9 -#define GL_USE_MISSING_GLYPH_NV 0x90AA -#define GL_PATH_ERROR_POSITION_NV 0x90AB -#define GL_PATH_FOG_GEN_MODE_NV 0x90AC -#define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD -#define GL_ADJACENT_PAIRS_NV 0x90AE -#define GL_FIRST_TO_REST_NV 0x90AF -#define GL_PATH_GEN_MODE_NV 0x90B0 -#define GL_PATH_GEN_COEFF_NV 0x90B1 -#define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2 -#define GL_PATH_GEN_COMPONENTS_NV 0x90B3 -#define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4 -#define GL_MOVE_TO_RESETS_NV 0x90B5 -#define GL_MOVE_TO_CONTINUES_NV 0x90B6 -#define GL_PATH_STENCIL_FUNC_NV 0x90B7 -#define GL_PATH_STENCIL_REF_NV 0x90B8 -#define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9 -#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD -#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE -#define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF -#define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368 -#define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369 -#define GL_FONT_UNAVAILABLE_NV 0x936A -#define GL_FONT_UNINTELLIGIBLE_NV 0x936B -#define GL_STANDARD_FONT_FORMAT_NV 0x936C -#define GL_FRAGMENT_INPUT_NV 0x936D -#define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000 -#define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000 -#define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000 -#define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000 -#define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000 -#define GL_FONT_ASCENDER_BIT_NV 0x00200000 -#define GL_FONT_DESCENDER_BIT_NV 0x00400000 -#define GL_FONT_HEIGHT_BIT_NV 0x00800000 -#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000 -#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000 -#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 -#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 -#define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 -#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000 - -typedef void (GLAPIENTRY * PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath); -typedef void (GLAPIENTRY * PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef void (GLAPIENTRY * PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode); -typedef void (GLAPIENTRY * PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef void (GLAPIENTRY * PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode); -typedef void (GLAPIENTRY * PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range); -typedef GLuint (GLAPIENTRY * PFNGLGENPATHSNVPROC) (GLsizei range); -typedef void (GLAPIENTRY * PFNGLGETPATHCOLORGENFVNVPROC) (GLenum color, GLenum pname, GLfloat* value); -typedef void (GLAPIENTRY * PFNGLGETPATHCOLORGENIVNVPROC) (GLenum color, GLenum pname, GLint* value); -typedef void (GLAPIENTRY * PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte* commands); -typedef void (GLAPIENTRY * PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat* coords); -typedef void (GLAPIENTRY * PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat* dashArray); -typedef GLfloat (GLAPIENTRY * PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); -typedef void (GLAPIENTRY * PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat* metrics); -typedef void (GLAPIENTRY * PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); -typedef void (GLAPIENTRY * PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat* value); -typedef void (GLAPIENTRY * PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint* value); -typedef void (GLAPIENTRY * PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); -typedef void (GLAPIENTRY * PFNGLGETPATHTEXGENFVNVPROC) (GLenum texCoordSet, GLenum pname, GLfloat* value); -typedef void (GLAPIENTRY * PFNGLGETPATHTEXGENIVNVPROC) (GLenum texCoordSet, GLenum pname, GLint* value); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei *length, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); -typedef GLboolean (GLAPIENTRY * PFNGLISPATHNVPROC) (GLuint path); -typedef GLboolean (GLAPIENTRY * PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); -typedef GLboolean (GLAPIENTRY * PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLPATHCOLORGENNVPROC) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat* coeffs); -typedef void (GLAPIENTRY * PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void*coords); -typedef void (GLAPIENTRY * PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); -typedef void (GLAPIENTRY * PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum zfunc); -typedef void (GLAPIENTRY * PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat* dashArray); -typedef void (GLAPIENTRY * PFNGLPATHFOGGENNVPROC) (GLenum genMode); -typedef GLenum (GLAPIENTRY * PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef GLenum (GLAPIENTRY * PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); -typedef void (GLAPIENTRY * PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef void (GLAPIENTRY * PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void*charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef GLenum (GLAPIENTRY * PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef void (GLAPIENTRY * PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value); -typedef void (GLAPIENTRY * PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value); -typedef void (GLAPIENTRY * PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units); -typedef void (GLAPIENTRY * PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask); -typedef void (GLAPIENTRY * PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString); -typedef void (GLAPIENTRY * PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void*coords); -typedef void (GLAPIENTRY * PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); -typedef void (GLAPIENTRY * PFNGLPATHTEXGENNVPROC) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat* coeffs); -typedef GLboolean (GLAPIENTRY * PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat* x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); -typedef void (GLAPIENTRY * PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat* coeffs); -typedef void (GLAPIENTRY * PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); -typedef void (GLAPIENTRY * PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask); -typedef void (GLAPIENTRY * PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); -typedef void (GLAPIENTRY * PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask); -typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); -typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode); -typedef void (GLAPIENTRY * PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat* transformValues); -typedef void (GLAPIENTRY * PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint paths[], const GLfloat weights[]); - -#define glCopyPathNV GLEW_GET_FUN(__glewCopyPathNV) -#define glCoverFillPathInstancedNV GLEW_GET_FUN(__glewCoverFillPathInstancedNV) -#define glCoverFillPathNV GLEW_GET_FUN(__glewCoverFillPathNV) -#define glCoverStrokePathInstancedNV GLEW_GET_FUN(__glewCoverStrokePathInstancedNV) -#define glCoverStrokePathNV GLEW_GET_FUN(__glewCoverStrokePathNV) -#define glDeletePathsNV GLEW_GET_FUN(__glewDeletePathsNV) -#define glGenPathsNV GLEW_GET_FUN(__glewGenPathsNV) -#define glGetPathColorGenfvNV GLEW_GET_FUN(__glewGetPathColorGenfvNV) -#define glGetPathColorGenivNV GLEW_GET_FUN(__glewGetPathColorGenivNV) -#define glGetPathCommandsNV GLEW_GET_FUN(__glewGetPathCommandsNV) -#define glGetPathCoordsNV GLEW_GET_FUN(__glewGetPathCoordsNV) -#define glGetPathDashArrayNV GLEW_GET_FUN(__glewGetPathDashArrayNV) -#define glGetPathLengthNV GLEW_GET_FUN(__glewGetPathLengthNV) -#define glGetPathMetricRangeNV GLEW_GET_FUN(__glewGetPathMetricRangeNV) -#define glGetPathMetricsNV GLEW_GET_FUN(__glewGetPathMetricsNV) -#define glGetPathParameterfvNV GLEW_GET_FUN(__glewGetPathParameterfvNV) -#define glGetPathParameterivNV GLEW_GET_FUN(__glewGetPathParameterivNV) -#define glGetPathSpacingNV GLEW_GET_FUN(__glewGetPathSpacingNV) -#define glGetPathTexGenfvNV GLEW_GET_FUN(__glewGetPathTexGenfvNV) -#define glGetPathTexGenivNV GLEW_GET_FUN(__glewGetPathTexGenivNV) -#define glGetProgramResourcefvNV GLEW_GET_FUN(__glewGetProgramResourcefvNV) -#define glInterpolatePathsNV GLEW_GET_FUN(__glewInterpolatePathsNV) -#define glIsPathNV GLEW_GET_FUN(__glewIsPathNV) -#define glIsPointInFillPathNV GLEW_GET_FUN(__glewIsPointInFillPathNV) -#define glIsPointInStrokePathNV GLEW_GET_FUN(__glewIsPointInStrokePathNV) -#define glMatrixLoad3x2fNV GLEW_GET_FUN(__glewMatrixLoad3x2fNV) -#define glMatrixLoad3x3fNV GLEW_GET_FUN(__glewMatrixLoad3x3fNV) -#define glMatrixLoadTranspose3x3fNV GLEW_GET_FUN(__glewMatrixLoadTranspose3x3fNV) -#define glMatrixMult3x2fNV GLEW_GET_FUN(__glewMatrixMult3x2fNV) -#define glMatrixMult3x3fNV GLEW_GET_FUN(__glewMatrixMult3x3fNV) -#define glMatrixMultTranspose3x3fNV GLEW_GET_FUN(__glewMatrixMultTranspose3x3fNV) -#define glPathColorGenNV GLEW_GET_FUN(__glewPathColorGenNV) -#define glPathCommandsNV GLEW_GET_FUN(__glewPathCommandsNV) -#define glPathCoordsNV GLEW_GET_FUN(__glewPathCoordsNV) -#define glPathCoverDepthFuncNV GLEW_GET_FUN(__glewPathCoverDepthFuncNV) -#define glPathDashArrayNV GLEW_GET_FUN(__glewPathDashArrayNV) -#define glPathFogGenNV GLEW_GET_FUN(__glewPathFogGenNV) -#define glPathGlyphIndexArrayNV GLEW_GET_FUN(__glewPathGlyphIndexArrayNV) -#define glPathGlyphIndexRangeNV GLEW_GET_FUN(__glewPathGlyphIndexRangeNV) -#define glPathGlyphRangeNV GLEW_GET_FUN(__glewPathGlyphRangeNV) -#define glPathGlyphsNV GLEW_GET_FUN(__glewPathGlyphsNV) -#define glPathMemoryGlyphIndexArrayNV GLEW_GET_FUN(__glewPathMemoryGlyphIndexArrayNV) -#define glPathParameterfNV GLEW_GET_FUN(__glewPathParameterfNV) -#define glPathParameterfvNV GLEW_GET_FUN(__glewPathParameterfvNV) -#define glPathParameteriNV GLEW_GET_FUN(__glewPathParameteriNV) -#define glPathParameterivNV GLEW_GET_FUN(__glewPathParameterivNV) -#define glPathStencilDepthOffsetNV GLEW_GET_FUN(__glewPathStencilDepthOffsetNV) -#define glPathStencilFuncNV GLEW_GET_FUN(__glewPathStencilFuncNV) -#define glPathStringNV GLEW_GET_FUN(__glewPathStringNV) -#define glPathSubCommandsNV GLEW_GET_FUN(__glewPathSubCommandsNV) -#define glPathSubCoordsNV GLEW_GET_FUN(__glewPathSubCoordsNV) -#define glPathTexGenNV GLEW_GET_FUN(__glewPathTexGenNV) -#define glPointAlongPathNV GLEW_GET_FUN(__glewPointAlongPathNV) -#define glProgramPathFragmentInputGenNV GLEW_GET_FUN(__glewProgramPathFragmentInputGenNV) -#define glStencilFillPathInstancedNV GLEW_GET_FUN(__glewStencilFillPathInstancedNV) -#define glStencilFillPathNV GLEW_GET_FUN(__glewStencilFillPathNV) -#define glStencilStrokePathInstancedNV GLEW_GET_FUN(__glewStencilStrokePathInstancedNV) -#define glStencilStrokePathNV GLEW_GET_FUN(__glewStencilStrokePathNV) -#define glStencilThenCoverFillPathInstancedNV GLEW_GET_FUN(__glewStencilThenCoverFillPathInstancedNV) -#define glStencilThenCoverFillPathNV GLEW_GET_FUN(__glewStencilThenCoverFillPathNV) -#define glStencilThenCoverStrokePathInstancedNV GLEW_GET_FUN(__glewStencilThenCoverStrokePathInstancedNV) -#define glStencilThenCoverStrokePathNV GLEW_GET_FUN(__glewStencilThenCoverStrokePathNV) -#define glTransformPathNV GLEW_GET_FUN(__glewTransformPathNV) -#define glWeightPathsNV GLEW_GET_FUN(__glewWeightPathsNV) - -#define GLEW_NV_path_rendering GLEW_GET_VAR(__GLEW_NV_path_rendering) - -#endif /* GL_NV_path_rendering */ - -/* -------------------- GL_NV_path_rendering_shared_edge ------------------- */ - -#ifndef GL_NV_path_rendering_shared_edge -#define GL_NV_path_rendering_shared_edge 1 - -#define GL_SHARED_EDGE_NV 0xC0 - -#define GLEW_NV_path_rendering_shared_edge GLEW_GET_VAR(__GLEW_NV_path_rendering_shared_edge) - -#endif /* GL_NV_path_rendering_shared_edge */ - -/* ------------------------- GL_NV_pixel_data_range ------------------------ */ - -#ifndef GL_NV_pixel_data_range -#define GL_NV_pixel_data_range 1 - -#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 -#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 -#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A -#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B -#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C -#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D - -typedef void (GLAPIENTRY * PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, void *pointer); - -#define glFlushPixelDataRangeNV GLEW_GET_FUN(__glewFlushPixelDataRangeNV) -#define glPixelDataRangeNV GLEW_GET_FUN(__glewPixelDataRangeNV) - -#define GLEW_NV_pixel_data_range GLEW_GET_VAR(__GLEW_NV_pixel_data_range) - -#endif /* GL_NV_pixel_data_range */ - -/* --------------------------- GL_NV_point_sprite -------------------------- */ - -#ifndef GL_NV_point_sprite -#define GL_NV_point_sprite 1 - -#define GL_POINT_SPRITE_NV 0x8861 -#define GL_COORD_REPLACE_NV 0x8862 -#define GL_POINT_SPRITE_R_MODE_NV 0x8863 - -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint* params); - -#define glPointParameteriNV GLEW_GET_FUN(__glewPointParameteriNV) -#define glPointParameterivNV GLEW_GET_FUN(__glewPointParameterivNV) - -#define GLEW_NV_point_sprite GLEW_GET_VAR(__GLEW_NV_point_sprite) - -#endif /* GL_NV_point_sprite */ - -/* -------------------------- GL_NV_present_video -------------------------- */ - -#ifndef GL_NV_present_video -#define GL_NV_present_video 1 - -#define GL_FRAME_NV 0x8E26 -#define GL_FIELDS_NV 0x8E27 -#define GL_CURRENT_TIME_NV 0x8E28 -#define GL_NUM_FILL_STREAMS_NV 0x8E29 -#define GL_PRESENT_TIME_NV 0x8E2A -#define GL_PRESENT_DURATION_NV 0x8E2B - -typedef void (GLAPIENTRY * PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT* params); -typedef void (GLAPIENTRY * PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT* params); -typedef void (GLAPIENTRY * PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); -typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); - -#define glGetVideoi64vNV GLEW_GET_FUN(__glewGetVideoi64vNV) -#define glGetVideoivNV GLEW_GET_FUN(__glewGetVideoivNV) -#define glGetVideoui64vNV GLEW_GET_FUN(__glewGetVideoui64vNV) -#define glGetVideouivNV GLEW_GET_FUN(__glewGetVideouivNV) -#define glPresentFrameDualFillNV GLEW_GET_FUN(__glewPresentFrameDualFillNV) -#define glPresentFrameKeyedNV GLEW_GET_FUN(__glewPresentFrameKeyedNV) - -#define GLEW_NV_present_video GLEW_GET_VAR(__GLEW_NV_present_video) - -#endif /* GL_NV_present_video */ - -/* ------------------------ GL_NV_primitive_restart ------------------------ */ - -#ifndef GL_NV_primitive_restart -#define GL_NV_primitive_restart 1 - -#define GL_PRIMITIVE_RESTART_NV 0x8558 -#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 - -typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); -typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTNVPROC) (void); - -#define glPrimitiveRestartIndexNV GLEW_GET_FUN(__glewPrimitiveRestartIndexNV) -#define glPrimitiveRestartNV GLEW_GET_FUN(__glewPrimitiveRestartNV) - -#define GLEW_NV_primitive_restart GLEW_GET_VAR(__GLEW_NV_primitive_restart) - -#endif /* GL_NV_primitive_restart */ - -/* ------------------------ GL_NV_register_combiners ----------------------- */ - -#ifndef GL_NV_register_combiners -#define GL_NV_register_combiners 1 - -#define GL_REGISTER_COMBINERS_NV 0x8522 -#define GL_VARIABLE_A_NV 0x8523 -#define GL_VARIABLE_B_NV 0x8524 -#define GL_VARIABLE_C_NV 0x8525 -#define GL_VARIABLE_D_NV 0x8526 -#define GL_VARIABLE_E_NV 0x8527 -#define GL_VARIABLE_F_NV 0x8528 -#define GL_VARIABLE_G_NV 0x8529 -#define GL_CONSTANT_COLOR0_NV 0x852A -#define GL_CONSTANT_COLOR1_NV 0x852B -#define GL_PRIMARY_COLOR_NV 0x852C -#define GL_SECONDARY_COLOR_NV 0x852D -#define GL_SPARE0_NV 0x852E -#define GL_SPARE1_NV 0x852F -#define GL_DISCARD_NV 0x8530 -#define GL_E_TIMES_F_NV 0x8531 -#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 -#define GL_UNSIGNED_IDENTITY_NV 0x8536 -#define GL_UNSIGNED_INVERT_NV 0x8537 -#define GL_EXPAND_NORMAL_NV 0x8538 -#define GL_EXPAND_NEGATE_NV 0x8539 -#define GL_HALF_BIAS_NORMAL_NV 0x853A -#define GL_HALF_BIAS_NEGATE_NV 0x853B -#define GL_SIGNED_IDENTITY_NV 0x853C -#define GL_SIGNED_NEGATE_NV 0x853D -#define GL_SCALE_BY_TWO_NV 0x853E -#define GL_SCALE_BY_FOUR_NV 0x853F -#define GL_SCALE_BY_ONE_HALF_NV 0x8540 -#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 -#define GL_COMBINER_INPUT_NV 0x8542 -#define GL_COMBINER_MAPPING_NV 0x8543 -#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 -#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 -#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 -#define GL_COMBINER_MUX_SUM_NV 0x8547 -#define GL_COMBINER_SCALE_NV 0x8548 -#define GL_COMBINER_BIAS_NV 0x8549 -#define GL_COMBINER_AB_OUTPUT_NV 0x854A -#define GL_COMBINER_CD_OUTPUT_NV 0x854B -#define GL_COMBINER_SUM_OUTPUT_NV 0x854C -#define GL_MAX_GENERAL_COMBINERS_NV 0x854D -#define GL_NUM_GENERAL_COMBINERS_NV 0x854E -#define GL_COLOR_SUM_CLAMP_NV 0x854F -#define GL_COMBINER0_NV 0x8550 -#define GL_COMBINER1_NV 0x8551 -#define GL_COMBINER2_NV 0x8552 -#define GL_COMBINER3_NV 0x8553 -#define GL_COMBINER4_NV 0x8554 -#define GL_COMBINER5_NV 0x8555 -#define GL_COMBINER6_NV 0x8556 -#define GL_COMBINER7_NV 0x8557 - -typedef void (GLAPIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (GLAPIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); -typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint* params); - -#define glCombinerInputNV GLEW_GET_FUN(__glewCombinerInputNV) -#define glCombinerOutputNV GLEW_GET_FUN(__glewCombinerOutputNV) -#define glCombinerParameterfNV GLEW_GET_FUN(__glewCombinerParameterfNV) -#define glCombinerParameterfvNV GLEW_GET_FUN(__glewCombinerParameterfvNV) -#define glCombinerParameteriNV GLEW_GET_FUN(__glewCombinerParameteriNV) -#define glCombinerParameterivNV GLEW_GET_FUN(__glewCombinerParameterivNV) -#define glFinalCombinerInputNV GLEW_GET_FUN(__glewFinalCombinerInputNV) -#define glGetCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetCombinerInputParameterfvNV) -#define glGetCombinerInputParameterivNV GLEW_GET_FUN(__glewGetCombinerInputParameterivNV) -#define glGetCombinerOutputParameterfvNV GLEW_GET_FUN(__glewGetCombinerOutputParameterfvNV) -#define glGetCombinerOutputParameterivNV GLEW_GET_FUN(__glewGetCombinerOutputParameterivNV) -#define glGetFinalCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterfvNV) -#define glGetFinalCombinerInputParameterivNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterivNV) - -#define GLEW_NV_register_combiners GLEW_GET_VAR(__GLEW_NV_register_combiners) - -#endif /* GL_NV_register_combiners */ - -/* ----------------------- GL_NV_register_combiners2 ----------------------- */ - -#ifndef GL_NV_register_combiners2 -#define GL_NV_register_combiners2 1 - -#define GL_PER_STAGE_CONSTANTS_NV 0x8535 - -typedef void (GLAPIENTRY * PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat* params); - -#define glCombinerStageParameterfvNV GLEW_GET_FUN(__glewCombinerStageParameterfvNV) -#define glGetCombinerStageParameterfvNV GLEW_GET_FUN(__glewGetCombinerStageParameterfvNV) - -#define GLEW_NV_register_combiners2 GLEW_GET_VAR(__GLEW_NV_register_combiners2) - -#endif /* GL_NV_register_combiners2 */ - -/* ------------------------- GL_NV_sample_locations ------------------------ */ - -#ifndef GL_NV_sample_locations -#define GL_NV_sample_locations 1 - -#define GL_SAMPLE_LOCATION_NV 0x8E50 -#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D -#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E -#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F -#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340 -#define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341 -#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342 -#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); - -#define glFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewFramebufferSampleLocationsfvNV) -#define glNamedFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewNamedFramebufferSampleLocationsfvNV) - -#define GLEW_NV_sample_locations GLEW_GET_VAR(__GLEW_NV_sample_locations) - -#endif /* GL_NV_sample_locations */ - -/* ------------------ GL_NV_sample_mask_override_coverage ------------------ */ - -#ifndef GL_NV_sample_mask_override_coverage -#define GL_NV_sample_mask_override_coverage 1 - -#define GLEW_NV_sample_mask_override_coverage GLEW_GET_VAR(__GLEW_NV_sample_mask_override_coverage) - -#endif /* GL_NV_sample_mask_override_coverage */ - -/* ---------------------- GL_NV_shader_atomic_counters --------------------- */ - -#ifndef GL_NV_shader_atomic_counters -#define GL_NV_shader_atomic_counters 1 - -#define GLEW_NV_shader_atomic_counters GLEW_GET_VAR(__GLEW_NV_shader_atomic_counters) - -#endif /* GL_NV_shader_atomic_counters */ - -/* ----------------------- GL_NV_shader_atomic_float ----------------------- */ - -#ifndef GL_NV_shader_atomic_float -#define GL_NV_shader_atomic_float 1 - -#define GLEW_NV_shader_atomic_float GLEW_GET_VAR(__GLEW_NV_shader_atomic_float) - -#endif /* GL_NV_shader_atomic_float */ - -/* -------------------- GL_NV_shader_atomic_fp16_vector -------------------- */ - -#ifndef GL_NV_shader_atomic_fp16_vector -#define GL_NV_shader_atomic_fp16_vector 1 - -#define GLEW_NV_shader_atomic_fp16_vector GLEW_GET_VAR(__GLEW_NV_shader_atomic_fp16_vector) - -#endif /* GL_NV_shader_atomic_fp16_vector */ - -/* ----------------------- GL_NV_shader_atomic_int64 ----------------------- */ - -#ifndef GL_NV_shader_atomic_int64 -#define GL_NV_shader_atomic_int64 1 - -#define GLEW_NV_shader_atomic_int64 GLEW_GET_VAR(__GLEW_NV_shader_atomic_int64) - -#endif /* GL_NV_shader_atomic_int64 */ - -/* ------------------------ GL_NV_shader_buffer_load ----------------------- */ - -#ifndef GL_NV_shader_buffer_load -#define GL_NV_shader_buffer_load 1 - -#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D -#define GL_GPU_ADDRESS_NV 0x8F34 -#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 - -typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT* params); -typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT* result); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT* params); -typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); -typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); -typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); -typedef void (GLAPIENTRY * PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); - -#define glGetBufferParameterui64vNV GLEW_GET_FUN(__glewGetBufferParameterui64vNV) -#define glGetIntegerui64vNV GLEW_GET_FUN(__glewGetIntegerui64vNV) -#define glGetNamedBufferParameterui64vNV GLEW_GET_FUN(__glewGetNamedBufferParameterui64vNV) -#define glIsBufferResidentNV GLEW_GET_FUN(__glewIsBufferResidentNV) -#define glIsNamedBufferResidentNV GLEW_GET_FUN(__glewIsNamedBufferResidentNV) -#define glMakeBufferNonResidentNV GLEW_GET_FUN(__glewMakeBufferNonResidentNV) -#define glMakeBufferResidentNV GLEW_GET_FUN(__glewMakeBufferResidentNV) -#define glMakeNamedBufferNonResidentNV GLEW_GET_FUN(__glewMakeNamedBufferNonResidentNV) -#define glMakeNamedBufferResidentNV GLEW_GET_FUN(__glewMakeNamedBufferResidentNV) -#define glProgramUniformui64NV GLEW_GET_FUN(__glewProgramUniformui64NV) -#define glProgramUniformui64vNV GLEW_GET_FUN(__glewProgramUniformui64vNV) -#define glUniformui64NV GLEW_GET_FUN(__glewUniformui64NV) -#define glUniformui64vNV GLEW_GET_FUN(__glewUniformui64vNV) - -#define GLEW_NV_shader_buffer_load GLEW_GET_VAR(__GLEW_NV_shader_buffer_load) - -#endif /* GL_NV_shader_buffer_load */ - -/* ------------------- GL_NV_shader_storage_buffer_object ------------------ */ - -#ifndef GL_NV_shader_storage_buffer_object -#define GL_NV_shader_storage_buffer_object 1 - -#define GLEW_NV_shader_storage_buffer_object GLEW_GET_VAR(__GLEW_NV_shader_storage_buffer_object) - -#endif /* GL_NV_shader_storage_buffer_object */ - -/* ----------------------- GL_NV_shader_thread_group ----------------------- */ - -#ifndef GL_NV_shader_thread_group -#define GL_NV_shader_thread_group 1 - -#define GL_WARP_SIZE_NV 0x9339 -#define GL_WARPS_PER_SM_NV 0x933A -#define GL_SM_COUNT_NV 0x933B - -#define GLEW_NV_shader_thread_group GLEW_GET_VAR(__GLEW_NV_shader_thread_group) - -#endif /* GL_NV_shader_thread_group */ - -/* ---------------------- GL_NV_shader_thread_shuffle ---------------------- */ - -#ifndef GL_NV_shader_thread_shuffle -#define GL_NV_shader_thread_shuffle 1 - -#define GLEW_NV_shader_thread_shuffle GLEW_GET_VAR(__GLEW_NV_shader_thread_shuffle) - -#endif /* GL_NV_shader_thread_shuffle */ - -/* ---------------------- GL_NV_tessellation_program5 ---------------------- */ - -#ifndef GL_NV_tessellation_program5 -#define GL_NV_tessellation_program5 1 - -#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 -#define GL_TESS_CONTROL_PROGRAM_NV 0x891E -#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F -#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 -#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 - -#define GLEW_NV_tessellation_program5 GLEW_GET_VAR(__GLEW_NV_tessellation_program5) - -#endif /* GL_NV_tessellation_program5 */ - -/* -------------------------- GL_NV_texgen_emboss -------------------------- */ - -#ifndef GL_NV_texgen_emboss -#define GL_NV_texgen_emboss 1 - -#define GL_EMBOSS_LIGHT_NV 0x855D -#define GL_EMBOSS_CONSTANT_NV 0x855E -#define GL_EMBOSS_MAP_NV 0x855F - -#define GLEW_NV_texgen_emboss GLEW_GET_VAR(__GLEW_NV_texgen_emboss) - -#endif /* GL_NV_texgen_emboss */ - -/* ------------------------ GL_NV_texgen_reflection ------------------------ */ - -#ifndef GL_NV_texgen_reflection -#define GL_NV_texgen_reflection 1 - -#define GL_NORMAL_MAP_NV 0x8511 -#define GL_REFLECTION_MAP_NV 0x8512 - -#define GLEW_NV_texgen_reflection GLEW_GET_VAR(__GLEW_NV_texgen_reflection) - -#endif /* GL_NV_texgen_reflection */ - -/* ------------------------- GL_NV_texture_barrier ------------------------- */ - -#ifndef GL_NV_texture_barrier -#define GL_NV_texture_barrier 1 - -typedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERNVPROC) (void); - -#define glTextureBarrierNV GLEW_GET_FUN(__glewTextureBarrierNV) - -#define GLEW_NV_texture_barrier GLEW_GET_VAR(__GLEW_NV_texture_barrier) - -#endif /* GL_NV_texture_barrier */ - -/* --------------------- GL_NV_texture_compression_vtc --------------------- */ - -#ifndef GL_NV_texture_compression_vtc -#define GL_NV_texture_compression_vtc 1 - -#define GLEW_NV_texture_compression_vtc GLEW_GET_VAR(__GLEW_NV_texture_compression_vtc) - -#endif /* GL_NV_texture_compression_vtc */ - -/* ----------------------- GL_NV_texture_env_combine4 ---------------------- */ - -#ifndef GL_NV_texture_env_combine4 -#define GL_NV_texture_env_combine4 1 - -#define GL_COMBINE4_NV 0x8503 -#define GL_SOURCE3_RGB_NV 0x8583 -#define GL_SOURCE3_ALPHA_NV 0x858B -#define GL_OPERAND3_RGB_NV 0x8593 -#define GL_OPERAND3_ALPHA_NV 0x859B - -#define GLEW_NV_texture_env_combine4 GLEW_GET_VAR(__GLEW_NV_texture_env_combine4) - -#endif /* GL_NV_texture_env_combine4 */ - -/* ---------------------- GL_NV_texture_expand_normal ---------------------- */ - -#ifndef GL_NV_texture_expand_normal -#define GL_NV_texture_expand_normal 1 - -#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F - -#define GLEW_NV_texture_expand_normal GLEW_GET_VAR(__GLEW_NV_texture_expand_normal) - -#endif /* GL_NV_texture_expand_normal */ - -/* ----------------------- GL_NV_texture_multisample ----------------------- */ - -#ifndef GL_NV_texture_multisample -#define GL_NV_texture_multisample 1 - -#define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045 -#define GL_TEXTURE_COLOR_SAMPLES_NV 0x9046 - -typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); -typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); - -#define glTexImage2DMultisampleCoverageNV GLEW_GET_FUN(__glewTexImage2DMultisampleCoverageNV) -#define glTexImage3DMultisampleCoverageNV GLEW_GET_FUN(__glewTexImage3DMultisampleCoverageNV) -#define glTextureImage2DMultisampleCoverageNV GLEW_GET_FUN(__glewTextureImage2DMultisampleCoverageNV) -#define glTextureImage2DMultisampleNV GLEW_GET_FUN(__glewTextureImage2DMultisampleNV) -#define glTextureImage3DMultisampleCoverageNV GLEW_GET_FUN(__glewTextureImage3DMultisampleCoverageNV) -#define glTextureImage3DMultisampleNV GLEW_GET_FUN(__glewTextureImage3DMultisampleNV) - -#define GLEW_NV_texture_multisample GLEW_GET_VAR(__GLEW_NV_texture_multisample) - -#endif /* GL_NV_texture_multisample */ - -/* ------------------------ GL_NV_texture_rectangle ------------------------ */ - -#ifndef GL_NV_texture_rectangle -#define GL_NV_texture_rectangle 1 - -#define GL_TEXTURE_RECTANGLE_NV 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 - -#define GLEW_NV_texture_rectangle GLEW_GET_VAR(__GLEW_NV_texture_rectangle) - -#endif /* GL_NV_texture_rectangle */ - -/* -------------------------- GL_NV_texture_shader ------------------------- */ - -#ifndef GL_NV_texture_shader -#define GL_NV_texture_shader 1 - -#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C -#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D -#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E -#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 -#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA -#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB -#define GL_DSDT_MAG_INTENSITY_NV 0x86DC -#define GL_SHADER_CONSISTENT_NV 0x86DD -#define GL_TEXTURE_SHADER_NV 0x86DE -#define GL_SHADER_OPERATION_NV 0x86DF -#define GL_CULL_MODES_NV 0x86E0 -#define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1 -#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 -#define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 -#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 -#define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 -#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 -#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 -#define GL_CONST_EYE_NV 0x86E5 -#define GL_PASS_THROUGH_NV 0x86E6 -#define GL_CULL_FRAGMENT_NV 0x86E7 -#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 -#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 -#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA -#define GL_DOT_PRODUCT_NV 0x86EC -#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED -#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE -#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 -#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 -#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 -#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 -#define GL_HILO_NV 0x86F4 -#define GL_DSDT_NV 0x86F5 -#define GL_DSDT_MAG_NV 0x86F6 -#define GL_DSDT_MAG_VIB_NV 0x86F7 -#define GL_HILO16_NV 0x86F8 -#define GL_SIGNED_HILO_NV 0x86F9 -#define GL_SIGNED_HILO16_NV 0x86FA -#define GL_SIGNED_RGBA_NV 0x86FB -#define GL_SIGNED_RGBA8_NV 0x86FC -#define GL_SIGNED_RGB_NV 0x86FE -#define GL_SIGNED_RGB8_NV 0x86FF -#define GL_SIGNED_LUMINANCE_NV 0x8701 -#define GL_SIGNED_LUMINANCE8_NV 0x8702 -#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 -#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 -#define GL_SIGNED_ALPHA_NV 0x8705 -#define GL_SIGNED_ALPHA8_NV 0x8706 -#define GL_SIGNED_INTENSITY_NV 0x8707 -#define GL_SIGNED_INTENSITY8_NV 0x8708 -#define GL_DSDT8_NV 0x8709 -#define GL_DSDT8_MAG8_NV 0x870A -#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B -#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C -#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D -#define GL_HI_SCALE_NV 0x870E -#define GL_LO_SCALE_NV 0x870F -#define GL_DS_SCALE_NV 0x8710 -#define GL_DT_SCALE_NV 0x8711 -#define GL_MAGNITUDE_SCALE_NV 0x8712 -#define GL_VIBRANCE_SCALE_NV 0x8713 -#define GL_HI_BIAS_NV 0x8714 -#define GL_LO_BIAS_NV 0x8715 -#define GL_DS_BIAS_NV 0x8716 -#define GL_DT_BIAS_NV 0x8717 -#define GL_MAGNITUDE_BIAS_NV 0x8718 -#define GL_VIBRANCE_BIAS_NV 0x8719 -#define GL_TEXTURE_BORDER_VALUES_NV 0x871A -#define GL_TEXTURE_HI_SIZE_NV 0x871B -#define GL_TEXTURE_LO_SIZE_NV 0x871C -#define GL_TEXTURE_DS_SIZE_NV 0x871D -#define GL_TEXTURE_DT_SIZE_NV 0x871E -#define GL_TEXTURE_MAG_SIZE_NV 0x871F - -#define GLEW_NV_texture_shader GLEW_GET_VAR(__GLEW_NV_texture_shader) - -#endif /* GL_NV_texture_shader */ - -/* ------------------------- GL_NV_texture_shader2 ------------------------- */ - -#ifndef GL_NV_texture_shader2 -#define GL_NV_texture_shader2 1 - -#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA -#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB -#define GL_DSDT_MAG_INTENSITY_NV 0x86DC -#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF -#define GL_HILO_NV 0x86F4 -#define GL_DSDT_NV 0x86F5 -#define GL_DSDT_MAG_NV 0x86F6 -#define GL_DSDT_MAG_VIB_NV 0x86F7 -#define GL_HILO16_NV 0x86F8 -#define GL_SIGNED_HILO_NV 0x86F9 -#define GL_SIGNED_HILO16_NV 0x86FA -#define GL_SIGNED_RGBA_NV 0x86FB -#define GL_SIGNED_RGBA8_NV 0x86FC -#define GL_SIGNED_RGB_NV 0x86FE -#define GL_SIGNED_RGB8_NV 0x86FF -#define GL_SIGNED_LUMINANCE_NV 0x8701 -#define GL_SIGNED_LUMINANCE8_NV 0x8702 -#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 -#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 -#define GL_SIGNED_ALPHA_NV 0x8705 -#define GL_SIGNED_ALPHA8_NV 0x8706 -#define GL_SIGNED_INTENSITY_NV 0x8707 -#define GL_SIGNED_INTENSITY8_NV 0x8708 -#define GL_DSDT8_NV 0x8709 -#define GL_DSDT8_MAG8_NV 0x870A -#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B -#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C -#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D - -#define GLEW_NV_texture_shader2 GLEW_GET_VAR(__GLEW_NV_texture_shader2) - -#endif /* GL_NV_texture_shader2 */ - -/* ------------------------- GL_NV_texture_shader3 ------------------------- */ - -#ifndef GL_NV_texture_shader3 -#define GL_NV_texture_shader3 1 - -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 -#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 -#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 -#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 -#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 -#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A -#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B -#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C -#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D -#define GL_HILO8_NV 0x885E -#define GL_SIGNED_HILO8_NV 0x885F -#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 - -#define GLEW_NV_texture_shader3 GLEW_GET_VAR(__GLEW_NV_texture_shader3) - -#endif /* GL_NV_texture_shader3 */ - -/* ------------------------ GL_NV_transform_feedback ----------------------- */ - -#ifndef GL_NV_transform_feedback -#define GL_NV_transform_feedback 1 - -#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 -#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 -#define GL_TEXTURE_COORD_NV 0x8C79 -#define GL_CLIP_DISTANCE_NV 0x8C7A -#define GL_VERTEX_ID_NV 0x8C7B -#define GL_PRIMITIVE_ID_NV 0x8C7C -#define GL_GENERIC_ATTRIB_NV 0x8C7D -#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 -#define GL_ACTIVE_VARYINGS_NV 0x8C81 -#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 -#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 -#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 -#define GL_PRIMITIVES_GENERATED_NV 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 -#define GL_RASTERIZER_DISCARD_NV 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B -#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C -#define GL_SEPARATE_ATTRIBS_NV 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F - -typedef void (GLAPIENTRY * PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); -typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); -typedef void (GLAPIENTRY * PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); -typedef GLint (GLAPIENTRY * PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); -typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode); -typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); - -#define glActiveVaryingNV GLEW_GET_FUN(__glewActiveVaryingNV) -#define glBeginTransformFeedbackNV GLEW_GET_FUN(__glewBeginTransformFeedbackNV) -#define glBindBufferBaseNV GLEW_GET_FUN(__glewBindBufferBaseNV) -#define glBindBufferOffsetNV GLEW_GET_FUN(__glewBindBufferOffsetNV) -#define glBindBufferRangeNV GLEW_GET_FUN(__glewBindBufferRangeNV) -#define glEndTransformFeedbackNV GLEW_GET_FUN(__glewEndTransformFeedbackNV) -#define glGetActiveVaryingNV GLEW_GET_FUN(__glewGetActiveVaryingNV) -#define glGetTransformFeedbackVaryingNV GLEW_GET_FUN(__glewGetTransformFeedbackVaryingNV) -#define glGetVaryingLocationNV GLEW_GET_FUN(__glewGetVaryingLocationNV) -#define glTransformFeedbackAttribsNV GLEW_GET_FUN(__glewTransformFeedbackAttribsNV) -#define glTransformFeedbackVaryingsNV GLEW_GET_FUN(__glewTransformFeedbackVaryingsNV) - -#define GLEW_NV_transform_feedback GLEW_GET_VAR(__GLEW_NV_transform_feedback) - -#endif /* GL_NV_transform_feedback */ - -/* ----------------------- GL_NV_transform_feedback2 ----------------------- */ - -#ifndef GL_NV_transform_feedback2 -#define GL_NV_transform_feedback2 1 - -#define GL_TRANSFORM_FEEDBACK_NV 0x8E22 -#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 -#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 -#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 - -typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); -typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint* ids); -typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void); -typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void); - -#define glBindTransformFeedbackNV GLEW_GET_FUN(__glewBindTransformFeedbackNV) -#define glDeleteTransformFeedbacksNV GLEW_GET_FUN(__glewDeleteTransformFeedbacksNV) -#define glDrawTransformFeedbackNV GLEW_GET_FUN(__glewDrawTransformFeedbackNV) -#define glGenTransformFeedbacksNV GLEW_GET_FUN(__glewGenTransformFeedbacksNV) -#define glIsTransformFeedbackNV GLEW_GET_FUN(__glewIsTransformFeedbackNV) -#define glPauseTransformFeedbackNV GLEW_GET_FUN(__glewPauseTransformFeedbackNV) -#define glResumeTransformFeedbackNV GLEW_GET_FUN(__glewResumeTransformFeedbackNV) - -#define GLEW_NV_transform_feedback2 GLEW_GET_VAR(__GLEW_NV_transform_feedback2) - -#endif /* GL_NV_transform_feedback2 */ - -/* ------------------ GL_NV_uniform_buffer_unified_memory ------------------ */ - -#ifndef GL_NV_uniform_buffer_unified_memory -#define GL_NV_uniform_buffer_unified_memory 1 - -#define GL_UNIFORM_BUFFER_UNIFIED_NV 0x936E -#define GL_UNIFORM_BUFFER_ADDRESS_NV 0x936F -#define GL_UNIFORM_BUFFER_LENGTH_NV 0x9370 - -#define GLEW_NV_uniform_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_uniform_buffer_unified_memory) - -#endif /* GL_NV_uniform_buffer_unified_memory */ - -/* -------------------------- GL_NV_vdpau_interop -------------------------- */ - -#ifndef GL_NV_vdpau_interop -#define GL_NV_vdpau_interop 1 - -#define GL_SURFACE_STATE_NV 0x86EB -#define GL_SURFACE_REGISTERED_NV 0x86FD -#define GL_SURFACE_MAPPED_NV 0x8700 -#define GL_WRITE_DISCARD_NV 0x88BE - -typedef GLintptr GLvdpauSurfaceNV; - -typedef void (GLAPIENTRY * PFNGLVDPAUFININVPROC) (void); -typedef void (GLAPIENTRY * PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei* length, GLint *values); -typedef void (GLAPIENTRY * PFNGLVDPAUINITNVPROC) (const void* vdpDevice, const void*getProcAddress); -typedef void (GLAPIENTRY * PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); -typedef void (GLAPIENTRY * PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV* surfaces); -typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); -typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); -typedef void (GLAPIENTRY * PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); -typedef void (GLAPIENTRY * PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV* surfaces); -typedef void (GLAPIENTRY * PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); - -#define glVDPAUFiniNV GLEW_GET_FUN(__glewVDPAUFiniNV) -#define glVDPAUGetSurfaceivNV GLEW_GET_FUN(__glewVDPAUGetSurfaceivNV) -#define glVDPAUInitNV GLEW_GET_FUN(__glewVDPAUInitNV) -#define glVDPAUIsSurfaceNV GLEW_GET_FUN(__glewVDPAUIsSurfaceNV) -#define glVDPAUMapSurfacesNV GLEW_GET_FUN(__glewVDPAUMapSurfacesNV) -#define glVDPAURegisterOutputSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterOutputSurfaceNV) -#define glVDPAURegisterVideoSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterVideoSurfaceNV) -#define glVDPAUSurfaceAccessNV GLEW_GET_FUN(__glewVDPAUSurfaceAccessNV) -#define glVDPAUUnmapSurfacesNV GLEW_GET_FUN(__glewVDPAUUnmapSurfacesNV) -#define glVDPAUUnregisterSurfaceNV GLEW_GET_FUN(__glewVDPAUUnregisterSurfaceNV) - -#define GLEW_NV_vdpau_interop GLEW_GET_VAR(__GLEW_NV_vdpau_interop) - -#endif /* GL_NV_vdpau_interop */ - -/* ------------------------ GL_NV_vertex_array_range ----------------------- */ - -#ifndef GL_NV_vertex_array_range -#define GL_NV_vertex_array_range 1 - -#define GL_VERTEX_ARRAY_RANGE_NV 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E -#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F -#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 -#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 - -typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, void *pointer); - -#define glFlushVertexArrayRangeNV GLEW_GET_FUN(__glewFlushVertexArrayRangeNV) -#define glVertexArrayRangeNV GLEW_GET_FUN(__glewVertexArrayRangeNV) - -#define GLEW_NV_vertex_array_range GLEW_GET_VAR(__GLEW_NV_vertex_array_range) - -#endif /* GL_NV_vertex_array_range */ - -/* ----------------------- GL_NV_vertex_array_range2 ----------------------- */ - -#ifndef GL_NV_vertex_array_range2 -#define GL_NV_vertex_array_range2 1 - -#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 - -#define GLEW_NV_vertex_array_range2 GLEW_GET_VAR(__GLEW_NV_vertex_array_range2) - -#endif /* GL_NV_vertex_array_range2 */ - -/* ------------------- GL_NV_vertex_attrib_integer_64bit ------------------- */ - -#ifndef GL_NV_vertex_attrib_integer_64bit -#define GL_NV_vertex_attrib_integer_64bit 1 - -#define GL_INT64_NV 0x140E -#define GL_UNSIGNED_INT64_NV 0x140F - -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT* params); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); - -#define glGetVertexAttribLi64vNV GLEW_GET_FUN(__glewGetVertexAttribLi64vNV) -#define glGetVertexAttribLui64vNV GLEW_GET_FUN(__glewGetVertexAttribLui64vNV) -#define glVertexAttribL1i64NV GLEW_GET_FUN(__glewVertexAttribL1i64NV) -#define glVertexAttribL1i64vNV GLEW_GET_FUN(__glewVertexAttribL1i64vNV) -#define glVertexAttribL1ui64NV GLEW_GET_FUN(__glewVertexAttribL1ui64NV) -#define glVertexAttribL1ui64vNV GLEW_GET_FUN(__glewVertexAttribL1ui64vNV) -#define glVertexAttribL2i64NV GLEW_GET_FUN(__glewVertexAttribL2i64NV) -#define glVertexAttribL2i64vNV GLEW_GET_FUN(__glewVertexAttribL2i64vNV) -#define glVertexAttribL2ui64NV GLEW_GET_FUN(__glewVertexAttribL2ui64NV) -#define glVertexAttribL2ui64vNV GLEW_GET_FUN(__glewVertexAttribL2ui64vNV) -#define glVertexAttribL3i64NV GLEW_GET_FUN(__glewVertexAttribL3i64NV) -#define glVertexAttribL3i64vNV GLEW_GET_FUN(__glewVertexAttribL3i64vNV) -#define glVertexAttribL3ui64NV GLEW_GET_FUN(__glewVertexAttribL3ui64NV) -#define glVertexAttribL3ui64vNV GLEW_GET_FUN(__glewVertexAttribL3ui64vNV) -#define glVertexAttribL4i64NV GLEW_GET_FUN(__glewVertexAttribL4i64NV) -#define glVertexAttribL4i64vNV GLEW_GET_FUN(__glewVertexAttribL4i64vNV) -#define glVertexAttribL4ui64NV GLEW_GET_FUN(__glewVertexAttribL4ui64NV) -#define glVertexAttribL4ui64vNV GLEW_GET_FUN(__glewVertexAttribL4ui64vNV) -#define glVertexAttribLFormatNV GLEW_GET_FUN(__glewVertexAttribLFormatNV) - -#define GLEW_NV_vertex_attrib_integer_64bit GLEW_GET_VAR(__GLEW_NV_vertex_attrib_integer_64bit) - -#endif /* GL_NV_vertex_attrib_integer_64bit */ - -/* ------------------- GL_NV_vertex_buffer_unified_memory ------------------ */ - -#ifndef GL_NV_vertex_buffer_unified_memory -#define GL_NV_vertex_buffer_unified_memory 1 - -#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E -#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F -#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 -#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 -#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 -#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 -#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 -#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 -#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 -#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 -#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 -#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 -#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A -#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B -#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C -#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D -#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E -#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F -#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 -#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 -#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 -#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 -#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 -#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 -#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 - -typedef void (GLAPIENTRY * PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); -typedef void (GLAPIENTRY * PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); -typedef void (GLAPIENTRY * PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT result[]); -typedef void (GLAPIENTRY * PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); - -#define glBufferAddressRangeNV GLEW_GET_FUN(__glewBufferAddressRangeNV) -#define glColorFormatNV GLEW_GET_FUN(__glewColorFormatNV) -#define glEdgeFlagFormatNV GLEW_GET_FUN(__glewEdgeFlagFormatNV) -#define glFogCoordFormatNV GLEW_GET_FUN(__glewFogCoordFormatNV) -#define glGetIntegerui64i_vNV GLEW_GET_FUN(__glewGetIntegerui64i_vNV) -#define glIndexFormatNV GLEW_GET_FUN(__glewIndexFormatNV) -#define glNormalFormatNV GLEW_GET_FUN(__glewNormalFormatNV) -#define glSecondaryColorFormatNV GLEW_GET_FUN(__glewSecondaryColorFormatNV) -#define glTexCoordFormatNV GLEW_GET_FUN(__glewTexCoordFormatNV) -#define glVertexAttribFormatNV GLEW_GET_FUN(__glewVertexAttribFormatNV) -#define glVertexAttribIFormatNV GLEW_GET_FUN(__glewVertexAttribIFormatNV) -#define glVertexFormatNV GLEW_GET_FUN(__glewVertexFormatNV) - -#define GLEW_NV_vertex_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_vertex_buffer_unified_memory) - -#endif /* GL_NV_vertex_buffer_unified_memory */ - -/* -------------------------- GL_NV_vertex_program ------------------------- */ - -#ifndef GL_NV_vertex_program -#define GL_NV_vertex_program 1 - -#define GL_VERTEX_PROGRAM_NV 0x8620 -#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 -#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 -#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 -#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 -#define GL_CURRENT_ATTRIB_NV 0x8626 -#define GL_PROGRAM_LENGTH_NV 0x8627 -#define GL_PROGRAM_STRING_NV 0x8628 -#define GL_MODELVIEW_PROJECTION_NV 0x8629 -#define GL_IDENTITY_NV 0x862A -#define GL_INVERSE_NV 0x862B -#define GL_TRANSPOSE_NV 0x862C -#define GL_INVERSE_TRANSPOSE_NV 0x862D -#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E -#define GL_MAX_TRACK_MATRICES_NV 0x862F -#define GL_MATRIX0_NV 0x8630 -#define GL_MATRIX1_NV 0x8631 -#define GL_MATRIX2_NV 0x8632 -#define GL_MATRIX3_NV 0x8633 -#define GL_MATRIX4_NV 0x8634 -#define GL_MATRIX5_NV 0x8635 -#define GL_MATRIX6_NV 0x8636 -#define GL_MATRIX7_NV 0x8637 -#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 -#define GL_CURRENT_MATRIX_NV 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 -#define GL_PROGRAM_PARAMETER_NV 0x8644 -#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 -#define GL_PROGRAM_TARGET_NV 0x8646 -#define GL_PROGRAM_RESIDENT_NV 0x8647 -#define GL_TRACK_MATRIX_NV 0x8648 -#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 -#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A -#define GL_PROGRAM_ERROR_POSITION_NV 0x864B -#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 -#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 -#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 -#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 -#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 -#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 -#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 -#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 -#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 -#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 -#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A -#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B -#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C -#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D -#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E -#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F -#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 -#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 -#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 -#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 -#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 -#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 -#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 -#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 -#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 -#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 -#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A -#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B -#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C -#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D -#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E -#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F -#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 -#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 -#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 -#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 -#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 -#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 -#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 -#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 -#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 -#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 -#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A -#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B -#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C -#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D -#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E -#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F - -typedef GLboolean (GLAPIENTRY * PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint* ids, GLboolean *residences); -typedef void (GLAPIENTRY * PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte* program); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, void** pointer); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMNVPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte* program); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei n, const GLubyte* v); - -#define glAreProgramsResidentNV GLEW_GET_FUN(__glewAreProgramsResidentNV) -#define glBindProgramNV GLEW_GET_FUN(__glewBindProgramNV) -#define glDeleteProgramsNV GLEW_GET_FUN(__glewDeleteProgramsNV) -#define glExecuteProgramNV GLEW_GET_FUN(__glewExecuteProgramNV) -#define glGenProgramsNV GLEW_GET_FUN(__glewGenProgramsNV) -#define glGetProgramParameterdvNV GLEW_GET_FUN(__glewGetProgramParameterdvNV) -#define glGetProgramParameterfvNV GLEW_GET_FUN(__glewGetProgramParameterfvNV) -#define glGetProgramStringNV GLEW_GET_FUN(__glewGetProgramStringNV) -#define glGetProgramivNV GLEW_GET_FUN(__glewGetProgramivNV) -#define glGetTrackMatrixivNV GLEW_GET_FUN(__glewGetTrackMatrixivNV) -#define glGetVertexAttribPointervNV GLEW_GET_FUN(__glewGetVertexAttribPointervNV) -#define glGetVertexAttribdvNV GLEW_GET_FUN(__glewGetVertexAttribdvNV) -#define glGetVertexAttribfvNV GLEW_GET_FUN(__glewGetVertexAttribfvNV) -#define glGetVertexAttribivNV GLEW_GET_FUN(__glewGetVertexAttribivNV) -#define glIsProgramNV GLEW_GET_FUN(__glewIsProgramNV) -#define glLoadProgramNV GLEW_GET_FUN(__glewLoadProgramNV) -#define glProgramParameter4dNV GLEW_GET_FUN(__glewProgramParameter4dNV) -#define glProgramParameter4dvNV GLEW_GET_FUN(__glewProgramParameter4dvNV) -#define glProgramParameter4fNV GLEW_GET_FUN(__glewProgramParameter4fNV) -#define glProgramParameter4fvNV GLEW_GET_FUN(__glewProgramParameter4fvNV) -#define glProgramParameters4dvNV GLEW_GET_FUN(__glewProgramParameters4dvNV) -#define glProgramParameters4fvNV GLEW_GET_FUN(__glewProgramParameters4fvNV) -#define glRequestResidentProgramsNV GLEW_GET_FUN(__glewRequestResidentProgramsNV) -#define glTrackMatrixNV GLEW_GET_FUN(__glewTrackMatrixNV) -#define glVertexAttrib1dNV GLEW_GET_FUN(__glewVertexAttrib1dNV) -#define glVertexAttrib1dvNV GLEW_GET_FUN(__glewVertexAttrib1dvNV) -#define glVertexAttrib1fNV GLEW_GET_FUN(__glewVertexAttrib1fNV) -#define glVertexAttrib1fvNV GLEW_GET_FUN(__glewVertexAttrib1fvNV) -#define glVertexAttrib1sNV GLEW_GET_FUN(__glewVertexAttrib1sNV) -#define glVertexAttrib1svNV GLEW_GET_FUN(__glewVertexAttrib1svNV) -#define glVertexAttrib2dNV GLEW_GET_FUN(__glewVertexAttrib2dNV) -#define glVertexAttrib2dvNV GLEW_GET_FUN(__glewVertexAttrib2dvNV) -#define glVertexAttrib2fNV GLEW_GET_FUN(__glewVertexAttrib2fNV) -#define glVertexAttrib2fvNV GLEW_GET_FUN(__glewVertexAttrib2fvNV) -#define glVertexAttrib2sNV GLEW_GET_FUN(__glewVertexAttrib2sNV) -#define glVertexAttrib2svNV GLEW_GET_FUN(__glewVertexAttrib2svNV) -#define glVertexAttrib3dNV GLEW_GET_FUN(__glewVertexAttrib3dNV) -#define glVertexAttrib3dvNV GLEW_GET_FUN(__glewVertexAttrib3dvNV) -#define glVertexAttrib3fNV GLEW_GET_FUN(__glewVertexAttrib3fNV) -#define glVertexAttrib3fvNV GLEW_GET_FUN(__glewVertexAttrib3fvNV) -#define glVertexAttrib3sNV GLEW_GET_FUN(__glewVertexAttrib3sNV) -#define glVertexAttrib3svNV GLEW_GET_FUN(__glewVertexAttrib3svNV) -#define glVertexAttrib4dNV GLEW_GET_FUN(__glewVertexAttrib4dNV) -#define glVertexAttrib4dvNV GLEW_GET_FUN(__glewVertexAttrib4dvNV) -#define glVertexAttrib4fNV GLEW_GET_FUN(__glewVertexAttrib4fNV) -#define glVertexAttrib4fvNV GLEW_GET_FUN(__glewVertexAttrib4fvNV) -#define glVertexAttrib4sNV GLEW_GET_FUN(__glewVertexAttrib4sNV) -#define glVertexAttrib4svNV GLEW_GET_FUN(__glewVertexAttrib4svNV) -#define glVertexAttrib4ubNV GLEW_GET_FUN(__glewVertexAttrib4ubNV) -#define glVertexAttrib4ubvNV GLEW_GET_FUN(__glewVertexAttrib4ubvNV) -#define glVertexAttribPointerNV GLEW_GET_FUN(__glewVertexAttribPointerNV) -#define glVertexAttribs1dvNV GLEW_GET_FUN(__glewVertexAttribs1dvNV) -#define glVertexAttribs1fvNV GLEW_GET_FUN(__glewVertexAttribs1fvNV) -#define glVertexAttribs1svNV GLEW_GET_FUN(__glewVertexAttribs1svNV) -#define glVertexAttribs2dvNV GLEW_GET_FUN(__glewVertexAttribs2dvNV) -#define glVertexAttribs2fvNV GLEW_GET_FUN(__glewVertexAttribs2fvNV) -#define glVertexAttribs2svNV GLEW_GET_FUN(__glewVertexAttribs2svNV) -#define glVertexAttribs3dvNV GLEW_GET_FUN(__glewVertexAttribs3dvNV) -#define glVertexAttribs3fvNV GLEW_GET_FUN(__glewVertexAttribs3fvNV) -#define glVertexAttribs3svNV GLEW_GET_FUN(__glewVertexAttribs3svNV) -#define glVertexAttribs4dvNV GLEW_GET_FUN(__glewVertexAttribs4dvNV) -#define glVertexAttribs4fvNV GLEW_GET_FUN(__glewVertexAttribs4fvNV) -#define glVertexAttribs4svNV GLEW_GET_FUN(__glewVertexAttribs4svNV) -#define glVertexAttribs4ubvNV GLEW_GET_FUN(__glewVertexAttribs4ubvNV) - -#define GLEW_NV_vertex_program GLEW_GET_VAR(__GLEW_NV_vertex_program) - -#endif /* GL_NV_vertex_program */ - -/* ------------------------ GL_NV_vertex_program1_1 ------------------------ */ - -#ifndef GL_NV_vertex_program1_1 -#define GL_NV_vertex_program1_1 1 - -#define GLEW_NV_vertex_program1_1 GLEW_GET_VAR(__GLEW_NV_vertex_program1_1) - -#endif /* GL_NV_vertex_program1_1 */ - -/* ------------------------- GL_NV_vertex_program2 ------------------------- */ - -#ifndef GL_NV_vertex_program2 -#define GL_NV_vertex_program2 1 - -#define GLEW_NV_vertex_program2 GLEW_GET_VAR(__GLEW_NV_vertex_program2) - -#endif /* GL_NV_vertex_program2 */ - -/* ---------------------- GL_NV_vertex_program2_option --------------------- */ - -#ifndef GL_NV_vertex_program2_option -#define GL_NV_vertex_program2_option 1 - -#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 -#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 - -#define GLEW_NV_vertex_program2_option GLEW_GET_VAR(__GLEW_NV_vertex_program2_option) - -#endif /* GL_NV_vertex_program2_option */ - -/* ------------------------- GL_NV_vertex_program3 ------------------------- */ - -#ifndef GL_NV_vertex_program3 -#define GL_NV_vertex_program3 1 - -#define MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C - -#define GLEW_NV_vertex_program3 GLEW_GET_VAR(__GLEW_NV_vertex_program3) - -#endif /* GL_NV_vertex_program3 */ - -/* ------------------------- GL_NV_vertex_program4 ------------------------- */ - -#ifndef GL_NV_vertex_program4 -#define GL_NV_vertex_program4 1 - -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD - -#define GLEW_NV_vertex_program4 GLEW_GET_VAR(__GLEW_NV_vertex_program4) - -#endif /* GL_NV_vertex_program4 */ - -/* -------------------------- GL_NV_video_capture -------------------------- */ - -#ifndef GL_NV_video_capture -#define GL_NV_video_capture 1 - -#define GL_VIDEO_BUFFER_NV 0x9020 -#define GL_VIDEO_BUFFER_BINDING_NV 0x9021 -#define GL_FIELD_UPPER_NV 0x9022 -#define GL_FIELD_LOWER_NV 0x9023 -#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 -#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 -#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 -#define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 -#define GL_VIDEO_BUFFER_PITCH_NV 0x9028 -#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 -#define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A -#define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B -#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C -#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D -#define GL_PARTIAL_SUCCESS_NV 0x902E -#define GL_SUCCESS_NV 0x902F -#define GL_FAILURE_NV 0x9030 -#define GL_YCBYCR8_422_NV 0x9031 -#define GL_YCBAYCR8A_4224_NV 0x9032 -#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 -#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 -#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 -#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 -#define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 -#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 -#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 -#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A -#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B -#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C - -typedef void (GLAPIENTRY * PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot); -typedef void (GLAPIENTRY * PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); -typedef void (GLAPIENTRY * PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); -typedef void (GLAPIENTRY * PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot); -typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint* params); -typedef GLenum (GLAPIENTRY * PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint* sequence_num, GLuint64EXT *capture_time); -typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint* params); - -#define glBeginVideoCaptureNV GLEW_GET_FUN(__glewBeginVideoCaptureNV) -#define glBindVideoCaptureStreamBufferNV GLEW_GET_FUN(__glewBindVideoCaptureStreamBufferNV) -#define glBindVideoCaptureStreamTextureNV GLEW_GET_FUN(__glewBindVideoCaptureStreamTextureNV) -#define glEndVideoCaptureNV GLEW_GET_FUN(__glewEndVideoCaptureNV) -#define glGetVideoCaptureStreamdvNV GLEW_GET_FUN(__glewGetVideoCaptureStreamdvNV) -#define glGetVideoCaptureStreamfvNV GLEW_GET_FUN(__glewGetVideoCaptureStreamfvNV) -#define glGetVideoCaptureStreamivNV GLEW_GET_FUN(__glewGetVideoCaptureStreamivNV) -#define glGetVideoCaptureivNV GLEW_GET_FUN(__glewGetVideoCaptureivNV) -#define glVideoCaptureNV GLEW_GET_FUN(__glewVideoCaptureNV) -#define glVideoCaptureStreamParameterdvNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterdvNV) -#define glVideoCaptureStreamParameterfvNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterfvNV) -#define glVideoCaptureStreamParameterivNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterivNV) - -#define GLEW_NV_video_capture GLEW_GET_VAR(__GLEW_NV_video_capture) - -#endif /* GL_NV_video_capture */ - -/* ------------------------- GL_NV_viewport_array2 ------------------------- */ - -#ifndef GL_NV_viewport_array2 -#define GL_NV_viewport_array2 1 - -#define GLEW_NV_viewport_array2 GLEW_GET_VAR(__GLEW_NV_viewport_array2) - -#endif /* GL_NV_viewport_array2 */ - -/* ------------------------ GL_OES_byte_coordinates ------------------------ */ - -#ifndef GL_OES_byte_coordinates -#define GL_OES_byte_coordinates 1 - -#define GLEW_OES_byte_coordinates GLEW_GET_VAR(__GLEW_OES_byte_coordinates) - -#endif /* GL_OES_byte_coordinates */ - -/* ------------------- GL_OES_compressed_paletted_texture ------------------ */ - -#ifndef GL_OES_compressed_paletted_texture -#define GL_OES_compressed_paletted_texture 1 - -#define GL_PALETTE4_RGB8_OES 0x8B90 -#define GL_PALETTE4_RGBA8_OES 0x8B91 -#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 -#define GL_PALETTE4_RGBA4_OES 0x8B93 -#define GL_PALETTE4_RGB5_A1_OES 0x8B94 -#define GL_PALETTE8_RGB8_OES 0x8B95 -#define GL_PALETTE8_RGBA8_OES 0x8B96 -#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 -#define GL_PALETTE8_RGBA4_OES 0x8B98 -#define GL_PALETTE8_RGB5_A1_OES 0x8B99 - -#define GLEW_OES_compressed_paletted_texture GLEW_GET_VAR(__GLEW_OES_compressed_paletted_texture) - -#endif /* GL_OES_compressed_paletted_texture */ - -/* --------------------------- GL_OES_read_format -------------------------- */ - -#ifndef GL_OES_read_format -#define GL_OES_read_format 1 - -#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B - -#define GLEW_OES_read_format GLEW_GET_VAR(__GLEW_OES_read_format) - -#endif /* GL_OES_read_format */ - -/* ------------------------ GL_OES_single_precision ------------------------ */ - -#ifndef GL_OES_single_precision -#define GL_OES_single_precision 1 - -typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFOESPROC) (GLclampf depth); -typedef void (GLAPIENTRY * PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat* equation); -typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); -typedef void (GLAPIENTRY * PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); -typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat* equation); -typedef void (GLAPIENTRY * PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); - -#define glClearDepthfOES GLEW_GET_FUN(__glewClearDepthfOES) -#define glClipPlanefOES GLEW_GET_FUN(__glewClipPlanefOES) -#define glDepthRangefOES GLEW_GET_FUN(__glewDepthRangefOES) -#define glFrustumfOES GLEW_GET_FUN(__glewFrustumfOES) -#define glGetClipPlanefOES GLEW_GET_FUN(__glewGetClipPlanefOES) -#define glOrthofOES GLEW_GET_FUN(__glewOrthofOES) - -#define GLEW_OES_single_precision GLEW_GET_VAR(__GLEW_OES_single_precision) - -#endif /* GL_OES_single_precision */ - -/* ---------------------------- GL_OML_interlace --------------------------- */ - -#ifndef GL_OML_interlace -#define GL_OML_interlace 1 - -#define GL_INTERLACE_OML 0x8980 -#define GL_INTERLACE_READ_OML 0x8981 - -#define GLEW_OML_interlace GLEW_GET_VAR(__GLEW_OML_interlace) - -#endif /* GL_OML_interlace */ - -/* ---------------------------- GL_OML_resample ---------------------------- */ - -#ifndef GL_OML_resample -#define GL_OML_resample 1 - -#define GL_PACK_RESAMPLE_OML 0x8984 -#define GL_UNPACK_RESAMPLE_OML 0x8985 -#define GL_RESAMPLE_REPLICATE_OML 0x8986 -#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 -#define GL_RESAMPLE_AVERAGE_OML 0x8988 -#define GL_RESAMPLE_DECIMATE_OML 0x8989 - -#define GLEW_OML_resample GLEW_GET_VAR(__GLEW_OML_resample) - -#endif /* GL_OML_resample */ - -/* ---------------------------- GL_OML_subsample --------------------------- */ - -#ifndef GL_OML_subsample -#define GL_OML_subsample 1 - -#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 -#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 - -#define GLEW_OML_subsample GLEW_GET_VAR(__GLEW_OML_subsample) - -#endif /* GL_OML_subsample */ - -/* ---------------------------- GL_OVR_multiview --------------------------- */ - -#ifndef GL_OVR_multiview -#define GL_OVR_multiview 1 - -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR 0x9630 -#define GL_MAX_VIEWS_OVR 0x9631 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR 0x9632 -#define GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR 0x9633 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); - -#define glFramebufferTextureMultiviewOVR GLEW_GET_FUN(__glewFramebufferTextureMultiviewOVR) - -#define GLEW_OVR_multiview GLEW_GET_VAR(__GLEW_OVR_multiview) - -#endif /* GL_OVR_multiview */ - -/* --------------------------- GL_OVR_multiview2 --------------------------- */ - -#ifndef GL_OVR_multiview2 -#define GL_OVR_multiview2 1 - -#define GLEW_OVR_multiview2 GLEW_GET_VAR(__GLEW_OVR_multiview2) - -#endif /* GL_OVR_multiview2 */ - -/* --------------------------- GL_PGI_misc_hints --------------------------- */ - -#ifndef GL_PGI_misc_hints -#define GL_PGI_misc_hints 1 - -#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 107000 -#define GL_CONSERVE_MEMORY_HINT_PGI 107005 -#define GL_RECLAIM_MEMORY_HINT_PGI 107006 -#define GL_NATIVE_GRAPHICS_HANDLE_PGI 107010 -#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 107011 -#define GL_NATIVE_GRAPHICS_END_HINT_PGI 107012 -#define GL_ALWAYS_FAST_HINT_PGI 107020 -#define GL_ALWAYS_SOFT_HINT_PGI 107021 -#define GL_ALLOW_DRAW_OBJ_HINT_PGI 107022 -#define GL_ALLOW_DRAW_WIN_HINT_PGI 107023 -#define GL_ALLOW_DRAW_FRG_HINT_PGI 107024 -#define GL_ALLOW_DRAW_MEM_HINT_PGI 107025 -#define GL_STRICT_DEPTHFUNC_HINT_PGI 107030 -#define GL_STRICT_LIGHTING_HINT_PGI 107031 -#define GL_STRICT_SCISSOR_HINT_PGI 107032 -#define GL_FULL_STIPPLE_HINT_PGI 107033 -#define GL_CLIP_NEAR_HINT_PGI 107040 -#define GL_CLIP_FAR_HINT_PGI 107041 -#define GL_WIDE_LINE_HINT_PGI 107042 -#define GL_BACK_NORMALS_HINT_PGI 107043 - -#define GLEW_PGI_misc_hints GLEW_GET_VAR(__GLEW_PGI_misc_hints) - -#endif /* GL_PGI_misc_hints */ - -/* -------------------------- GL_PGI_vertex_hints -------------------------- */ - -#ifndef GL_PGI_vertex_hints -#define GL_PGI_vertex_hints 1 - -#define GL_VERTEX23_BIT_PGI 0x00000004 -#define GL_VERTEX4_BIT_PGI 0x00000008 -#define GL_COLOR3_BIT_PGI 0x00010000 -#define GL_COLOR4_BIT_PGI 0x00020000 -#define GL_EDGEFLAG_BIT_PGI 0x00040000 -#define GL_INDEX_BIT_PGI 0x00080000 -#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 -#define GL_VERTEX_DATA_HINT_PGI 107050 -#define GL_VERTEX_CONSISTENT_HINT_PGI 107051 -#define GL_MATERIAL_SIDE_HINT_PGI 107052 -#define GL_MAX_VERTEX_HINT_PGI 107053 -#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 -#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 -#define GL_MAT_EMISSION_BIT_PGI 0x00800000 -#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 -#define GL_MAT_SHININESS_BIT_PGI 0x02000000 -#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 -#define GL_NORMAL_BIT_PGI 0x08000000 -#define GL_TEXCOORD1_BIT_PGI 0x10000000 -#define GL_TEXCOORD2_BIT_PGI 0x20000000 -#define GL_TEXCOORD3_BIT_PGI 0x40000000 -#define GL_TEXCOORD4_BIT_PGI 0x80000000 - -#define GLEW_PGI_vertex_hints GLEW_GET_VAR(__GLEW_PGI_vertex_hints) - -#endif /* GL_PGI_vertex_hints */ - -/* ---------------------- GL_REGAL_ES1_0_compatibility --------------------- */ - -#ifndef GL_REGAL_ES1_0_compatibility -#define GL_REGAL_ES1_0_compatibility 1 - -typedef int GLclampx; - -typedef void (GLAPIENTRY * PFNGLALPHAFUNCXPROC) (GLenum func, GLclampx ref); -typedef void (GLAPIENTRY * PFNGLCLEARCOLORXPROC) (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha); -typedef void (GLAPIENTRY * PFNGLCLEARDEPTHXPROC) (GLclampx depth); -typedef void (GLAPIENTRY * PFNGLCOLOR4XPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -typedef void (GLAPIENTRY * PFNGLDEPTHRANGEXPROC) (GLclampx zNear, GLclampx zFar); -typedef void (GLAPIENTRY * PFNGLFOGXPROC) (GLenum pname, GLfixed param); -typedef void (GLAPIENTRY * PFNGLFOGXVPROC) (GLenum pname, const GLfixed* params); -typedef void (GLAPIENTRY * PFNGLFRUSTUMFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); -typedef void (GLAPIENTRY * PFNGLFRUSTUMXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); -typedef void (GLAPIENTRY * PFNGLLIGHTMODELXPROC) (GLenum pname, GLfixed param); -typedef void (GLAPIENTRY * PFNGLLIGHTMODELXVPROC) (GLenum pname, const GLfixed* params); -typedef void (GLAPIENTRY * PFNGLLIGHTXPROC) (GLenum light, GLenum pname, GLfixed param); -typedef void (GLAPIENTRY * PFNGLLIGHTXVPROC) (GLenum light, GLenum pname, const GLfixed* params); -typedef void (GLAPIENTRY * PFNGLLINEWIDTHXPROC) (GLfixed width); -typedef void (GLAPIENTRY * PFNGLLOADMATRIXXPROC) (const GLfixed* m); -typedef void (GLAPIENTRY * PFNGLMATERIALXPROC) (GLenum face, GLenum pname, GLfixed param); -typedef void (GLAPIENTRY * PFNGLMATERIALXVPROC) (GLenum face, GLenum pname, const GLfixed* params); -typedef void (GLAPIENTRY * PFNGLMULTMATRIXXPROC) (const GLfixed* m); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4XPROC) (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q); -typedef void (GLAPIENTRY * PFNGLNORMAL3XPROC) (GLfixed nx, GLfixed ny, GLfixed nz); -typedef void (GLAPIENTRY * PFNGLORTHOFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); -typedef void (GLAPIENTRY * PFNGLORTHOXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); -typedef void (GLAPIENTRY * PFNGLPOINTSIZEXPROC) (GLfixed size); -typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETXPROC) (GLfixed factor, GLfixed units); -typedef void (GLAPIENTRY * PFNGLROTATEXPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); -typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEXPROC) (GLclampx value, GLboolean invert); -typedef void (GLAPIENTRY * PFNGLSCALEXPROC) (GLfixed x, GLfixed y, GLfixed z); -typedef void (GLAPIENTRY * PFNGLTEXENVXPROC) (GLenum target, GLenum pname, GLfixed param); -typedef void (GLAPIENTRY * PFNGLTEXENVXVPROC) (GLenum target, GLenum pname, const GLfixed* params); -typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXPROC) (GLenum target, GLenum pname, GLfixed param); -typedef void (GLAPIENTRY * PFNGLTRANSLATEXPROC) (GLfixed x, GLfixed y, GLfixed z); - -#define glAlphaFuncx GLEW_GET_FUN(__glewAlphaFuncx) -#define glClearColorx GLEW_GET_FUN(__glewClearColorx) -#define glClearDepthx GLEW_GET_FUN(__glewClearDepthx) -#define glColor4x GLEW_GET_FUN(__glewColor4x) -#define glDepthRangex GLEW_GET_FUN(__glewDepthRangex) -#define glFogx GLEW_GET_FUN(__glewFogx) -#define glFogxv GLEW_GET_FUN(__glewFogxv) -#define glFrustumf GLEW_GET_FUN(__glewFrustumf) -#define glFrustumx GLEW_GET_FUN(__glewFrustumx) -#define glLightModelx GLEW_GET_FUN(__glewLightModelx) -#define glLightModelxv GLEW_GET_FUN(__glewLightModelxv) -#define glLightx GLEW_GET_FUN(__glewLightx) -#define glLightxv GLEW_GET_FUN(__glewLightxv) -#define glLineWidthx GLEW_GET_FUN(__glewLineWidthx) -#define glLoadMatrixx GLEW_GET_FUN(__glewLoadMatrixx) -#define glMaterialx GLEW_GET_FUN(__glewMaterialx) -#define glMaterialxv GLEW_GET_FUN(__glewMaterialxv) -#define glMultMatrixx GLEW_GET_FUN(__glewMultMatrixx) -#define glMultiTexCoord4x GLEW_GET_FUN(__glewMultiTexCoord4x) -#define glNormal3x GLEW_GET_FUN(__glewNormal3x) -#define glOrthof GLEW_GET_FUN(__glewOrthof) -#define glOrthox GLEW_GET_FUN(__glewOrthox) -#define glPointSizex GLEW_GET_FUN(__glewPointSizex) -#define glPolygonOffsetx GLEW_GET_FUN(__glewPolygonOffsetx) -#define glRotatex GLEW_GET_FUN(__glewRotatex) -#define glSampleCoveragex GLEW_GET_FUN(__glewSampleCoveragex) -#define glScalex GLEW_GET_FUN(__glewScalex) -#define glTexEnvx GLEW_GET_FUN(__glewTexEnvx) -#define glTexEnvxv GLEW_GET_FUN(__glewTexEnvxv) -#define glTexParameterx GLEW_GET_FUN(__glewTexParameterx) -#define glTranslatex GLEW_GET_FUN(__glewTranslatex) - -#define GLEW_REGAL_ES1_0_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_0_compatibility) - -#endif /* GL_REGAL_ES1_0_compatibility */ - -/* ---------------------- GL_REGAL_ES1_1_compatibility --------------------- */ - -#ifndef GL_REGAL_ES1_1_compatibility -#define GL_REGAL_ES1_1_compatibility 1 - -typedef void (GLAPIENTRY * PFNGLCLIPPLANEFPROC) (GLenum plane, const GLfloat* equation); -typedef void (GLAPIENTRY * PFNGLCLIPPLANEXPROC) (GLenum plane, const GLfixed* equation); -typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFPROC) (GLenum pname, GLfloat eqn[4]); -typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEXPROC) (GLenum pname, GLfixed eqn[4]); -typedef void (GLAPIENTRY * PFNGLGETFIXEDVPROC) (GLenum pname, GLfixed* params); -typedef void (GLAPIENTRY * PFNGLGETLIGHTXVPROC) (GLenum light, GLenum pname, GLfixed* params); -typedef void (GLAPIENTRY * PFNGLGETMATERIALXVPROC) (GLenum face, GLenum pname, GLfixed* params); -typedef void (GLAPIENTRY * PFNGLGETTEXENVXVPROC) (GLenum env, GLenum pname, GLfixed* params); -typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERXVPROC) (GLenum target, GLenum pname, GLfixed* params); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXPROC) (GLenum pname, GLfixed param); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXVPROC) (GLenum pname, const GLfixed* params); -typedef void (GLAPIENTRY * PFNGLPOINTSIZEPOINTEROESPROC) (GLenum type, GLsizei stride, const void *pointer); -typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXVPROC) (GLenum target, GLenum pname, const GLfixed* params); - -#define glClipPlanef GLEW_GET_FUN(__glewClipPlanef) -#define glClipPlanex GLEW_GET_FUN(__glewClipPlanex) -#define glGetClipPlanef GLEW_GET_FUN(__glewGetClipPlanef) -#define glGetClipPlanex GLEW_GET_FUN(__glewGetClipPlanex) -#define glGetFixedv GLEW_GET_FUN(__glewGetFixedv) -#define glGetLightxv GLEW_GET_FUN(__glewGetLightxv) -#define glGetMaterialxv GLEW_GET_FUN(__glewGetMaterialxv) -#define glGetTexEnvxv GLEW_GET_FUN(__glewGetTexEnvxv) -#define glGetTexParameterxv GLEW_GET_FUN(__glewGetTexParameterxv) -#define glPointParameterx GLEW_GET_FUN(__glewPointParameterx) -#define glPointParameterxv GLEW_GET_FUN(__glewPointParameterxv) -#define glPointSizePointerOES GLEW_GET_FUN(__glewPointSizePointerOES) -#define glTexParameterxv GLEW_GET_FUN(__glewTexParameterxv) - -#define GLEW_REGAL_ES1_1_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_1_compatibility) - -#endif /* GL_REGAL_ES1_1_compatibility */ - -/* ---------------------------- GL_REGAL_enable ---------------------------- */ - -#ifndef GL_REGAL_enable -#define GL_REGAL_enable 1 - -#define GL_ERROR_REGAL 0x9322 -#define GL_DEBUG_REGAL 0x9323 -#define GL_LOG_REGAL 0x9324 -#define GL_EMULATION_REGAL 0x9325 -#define GL_DRIVER_REGAL 0x9326 -#define GL_MISSING_REGAL 0x9360 -#define GL_TRACE_REGAL 0x9361 -#define GL_CACHE_REGAL 0x9362 -#define GL_CODE_REGAL 0x9363 -#define GL_STATISTICS_REGAL 0x9364 - -#define GLEW_REGAL_enable GLEW_GET_VAR(__GLEW_REGAL_enable) - -#endif /* GL_REGAL_enable */ - -/* ------------------------- GL_REGAL_error_string ------------------------- */ - -#ifndef GL_REGAL_error_string -#define GL_REGAL_error_string 1 - -typedef const GLchar* (GLAPIENTRY * PFNGLERRORSTRINGREGALPROC) (GLenum error); - -#define glErrorStringREGAL GLEW_GET_FUN(__glewErrorStringREGAL) - -#define GLEW_REGAL_error_string GLEW_GET_VAR(__GLEW_REGAL_error_string) - -#endif /* GL_REGAL_error_string */ - -/* ------------------------ GL_REGAL_extension_query ----------------------- */ - -#ifndef GL_REGAL_extension_query -#define GL_REGAL_extension_query 1 - -typedef GLboolean (GLAPIENTRY * PFNGLGETEXTENSIONREGALPROC) (const GLchar* ext); -typedef GLboolean (GLAPIENTRY * PFNGLISSUPPORTEDREGALPROC) (const GLchar* ext); - -#define glGetExtensionREGAL GLEW_GET_FUN(__glewGetExtensionREGAL) -#define glIsSupportedREGAL GLEW_GET_FUN(__glewIsSupportedREGAL) - -#define GLEW_REGAL_extension_query GLEW_GET_VAR(__GLEW_REGAL_extension_query) - -#endif /* GL_REGAL_extension_query */ - -/* ------------------------------ GL_REGAL_log ----------------------------- */ - -#ifndef GL_REGAL_log -#define GL_REGAL_log 1 - -#define GL_LOG_ERROR_REGAL 0x9319 -#define GL_LOG_WARNING_REGAL 0x931A -#define GL_LOG_INFO_REGAL 0x931B -#define GL_LOG_APP_REGAL 0x931C -#define GL_LOG_DRIVER_REGAL 0x931D -#define GL_LOG_INTERNAL_REGAL 0x931E -#define GL_LOG_DEBUG_REGAL 0x931F -#define GL_LOG_STATUS_REGAL 0x9320 -#define GL_LOG_HTTP_REGAL 0x9321 - -typedef void (APIENTRY *GLLOGPROCREGAL)(GLenum stream, GLsizei length, const GLchar *message, void *context); - -typedef void (GLAPIENTRY * PFNGLLOGMESSAGECALLBACKREGALPROC) (GLLOGPROCREGAL callback); - -#define glLogMessageCallbackREGAL GLEW_GET_FUN(__glewLogMessageCallbackREGAL) - -#define GLEW_REGAL_log GLEW_GET_VAR(__GLEW_REGAL_log) - -#endif /* GL_REGAL_log */ - -/* ------------------------- GL_REGAL_proc_address ------------------------- */ - -#ifndef GL_REGAL_proc_address -#define GL_REGAL_proc_address 1 - -typedef void * (GLAPIENTRY * PFNGLGETPROCADDRESSREGALPROC) (const GLchar *name); - -#define glGetProcAddressREGAL GLEW_GET_FUN(__glewGetProcAddressREGAL) - -#define GLEW_REGAL_proc_address GLEW_GET_VAR(__GLEW_REGAL_proc_address) - -#endif /* GL_REGAL_proc_address */ - -/* ----------------------- GL_REND_screen_coordinates ---------------------- */ - -#ifndef GL_REND_screen_coordinates -#define GL_REND_screen_coordinates 1 - -#define GL_SCREEN_COORDINATES_REND 0x8490 -#define GL_INVERTED_SCREEN_W_REND 0x8491 - -#define GLEW_REND_screen_coordinates GLEW_GET_VAR(__GLEW_REND_screen_coordinates) - -#endif /* GL_REND_screen_coordinates */ - -/* ------------------------------- GL_S3_s3tc ------------------------------ */ - -#ifndef GL_S3_s3tc -#define GL_S3_s3tc 1 - -#define GL_RGB_S3TC 0x83A0 -#define GL_RGB4_S3TC 0x83A1 -#define GL_RGBA_S3TC 0x83A2 -#define GL_RGBA4_S3TC 0x83A3 -#define GL_RGBA_DXT5_S3TC 0x83A4 -#define GL_RGBA4_DXT5_S3TC 0x83A5 - -#define GLEW_S3_s3tc GLEW_GET_VAR(__GLEW_S3_s3tc) - -#endif /* GL_S3_s3tc */ - -/* -------------------------- GL_SGIS_color_range -------------------------- */ - -#ifndef GL_SGIS_color_range -#define GL_SGIS_color_range 1 - -#define GL_EXTENDED_RANGE_SGIS 0x85A5 -#define GL_MIN_RED_SGIS 0x85A6 -#define GL_MAX_RED_SGIS 0x85A7 -#define GL_MIN_GREEN_SGIS 0x85A8 -#define GL_MAX_GREEN_SGIS 0x85A9 -#define GL_MIN_BLUE_SGIS 0x85AA -#define GL_MAX_BLUE_SGIS 0x85AB -#define GL_MIN_ALPHA_SGIS 0x85AC -#define GL_MAX_ALPHA_SGIS 0x85AD - -#define GLEW_SGIS_color_range GLEW_GET_VAR(__GLEW_SGIS_color_range) - -#endif /* GL_SGIS_color_range */ - -/* ------------------------- GL_SGIS_detail_texture ------------------------ */ - -#ifndef GL_SGIS_detail_texture -#define GL_SGIS_detail_texture 1 - -typedef void (GLAPIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); -typedef void (GLAPIENTRY * PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat* points); - -#define glDetailTexFuncSGIS GLEW_GET_FUN(__glewDetailTexFuncSGIS) -#define glGetDetailTexFuncSGIS GLEW_GET_FUN(__glewGetDetailTexFuncSGIS) - -#define GLEW_SGIS_detail_texture GLEW_GET_VAR(__GLEW_SGIS_detail_texture) - -#endif /* GL_SGIS_detail_texture */ - -/* -------------------------- GL_SGIS_fog_function ------------------------- */ - -#ifndef GL_SGIS_fog_function -#define GL_SGIS_fog_function 1 - -typedef void (GLAPIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat* points); -typedef void (GLAPIENTRY * PFNGLGETFOGFUNCSGISPROC) (GLfloat* points); - -#define glFogFuncSGIS GLEW_GET_FUN(__glewFogFuncSGIS) -#define glGetFogFuncSGIS GLEW_GET_FUN(__glewGetFogFuncSGIS) - -#define GLEW_SGIS_fog_function GLEW_GET_VAR(__GLEW_SGIS_fog_function) - -#endif /* GL_SGIS_fog_function */ - -/* ------------------------ GL_SGIS_generate_mipmap ------------------------ */ - -#ifndef GL_SGIS_generate_mipmap -#define GL_SGIS_generate_mipmap 1 - -#define GL_GENERATE_MIPMAP_SGIS 0x8191 -#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 - -#define GLEW_SGIS_generate_mipmap GLEW_GET_VAR(__GLEW_SGIS_generate_mipmap) - -#endif /* GL_SGIS_generate_mipmap */ - -/* -------------------------- GL_SGIS_multisample -------------------------- */ - -#ifndef GL_SGIS_multisample -#define GL_SGIS_multisample 1 - -#define GL_MULTISAMPLE_SGIS 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F -#define GL_SAMPLE_MASK_SGIS 0x80A0 -#define GL_1PASS_SGIS 0x80A1 -#define GL_2PASS_0_SGIS 0x80A2 -#define GL_2PASS_1_SGIS 0x80A3 -#define GL_4PASS_0_SGIS 0x80A4 -#define GL_4PASS_1_SGIS 0x80A5 -#define GL_4PASS_2_SGIS 0x80A6 -#define GL_4PASS_3_SGIS 0x80A7 -#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 -#define GL_SAMPLES_SGIS 0x80A9 -#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA -#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB -#define GL_SAMPLE_PATTERN_SGIS 0x80AC - -typedef void (GLAPIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); -typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); - -#define glSampleMaskSGIS GLEW_GET_FUN(__glewSampleMaskSGIS) -#define glSamplePatternSGIS GLEW_GET_FUN(__glewSamplePatternSGIS) - -#define GLEW_SGIS_multisample GLEW_GET_VAR(__GLEW_SGIS_multisample) - -#endif /* GL_SGIS_multisample */ - -/* ------------------------- GL_SGIS_pixel_texture ------------------------- */ - -#ifndef GL_SGIS_pixel_texture -#define GL_SGIS_pixel_texture 1 - -#define GLEW_SGIS_pixel_texture GLEW_GET_VAR(__GLEW_SGIS_pixel_texture) - -#endif /* GL_SGIS_pixel_texture */ - -/* ----------------------- GL_SGIS_point_line_texgen ----------------------- */ - -#ifndef GL_SGIS_point_line_texgen -#define GL_SGIS_point_line_texgen 1 - -#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 -#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 -#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 -#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 -#define GL_EYE_POINT_SGIS 0x81F4 -#define GL_OBJECT_POINT_SGIS 0x81F5 -#define GL_EYE_LINE_SGIS 0x81F6 -#define GL_OBJECT_LINE_SGIS 0x81F7 - -#define GLEW_SGIS_point_line_texgen GLEW_GET_VAR(__GLEW_SGIS_point_line_texgen) - -#endif /* GL_SGIS_point_line_texgen */ - -/* ------------------------ GL_SGIS_sharpen_texture ------------------------ */ - -#ifndef GL_SGIS_sharpen_texture -#define GL_SGIS_sharpen_texture 1 - -typedef void (GLAPIENTRY * PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat* points); -typedef void (GLAPIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); - -#define glGetSharpenTexFuncSGIS GLEW_GET_FUN(__glewGetSharpenTexFuncSGIS) -#define glSharpenTexFuncSGIS GLEW_GET_FUN(__glewSharpenTexFuncSGIS) - -#define GLEW_SGIS_sharpen_texture GLEW_GET_VAR(__GLEW_SGIS_sharpen_texture) - -#endif /* GL_SGIS_sharpen_texture */ - -/* --------------------------- GL_SGIS_texture4D --------------------------- */ - -#ifndef GL_SGIS_texture4D -#define GL_SGIS_texture4D 1 - -typedef void (GLAPIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLenum format, GLenum type, const void *pixels); - -#define glTexImage4DSGIS GLEW_GET_FUN(__glewTexImage4DSGIS) -#define glTexSubImage4DSGIS GLEW_GET_FUN(__glewTexSubImage4DSGIS) - -#define GLEW_SGIS_texture4D GLEW_GET_VAR(__GLEW_SGIS_texture4D) - -#endif /* GL_SGIS_texture4D */ - -/* ---------------------- GL_SGIS_texture_border_clamp --------------------- */ - -#ifndef GL_SGIS_texture_border_clamp -#define GL_SGIS_texture_border_clamp 1 - -#define GL_CLAMP_TO_BORDER_SGIS 0x812D - -#define GLEW_SGIS_texture_border_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_border_clamp) - -#endif /* GL_SGIS_texture_border_clamp */ - -/* ----------------------- GL_SGIS_texture_edge_clamp ---------------------- */ - -#ifndef GL_SGIS_texture_edge_clamp -#define GL_SGIS_texture_edge_clamp 1 - -#define GL_CLAMP_TO_EDGE_SGIS 0x812F - -#define GLEW_SGIS_texture_edge_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_edge_clamp) - -#endif /* GL_SGIS_texture_edge_clamp */ - -/* ------------------------ GL_SGIS_texture_filter4 ------------------------ */ - -#ifndef GL_SGIS_texture_filter4 -#define GL_SGIS_texture_filter4 1 - -typedef void (GLAPIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat* weights); -typedef void (GLAPIENTRY * PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat* weights); - -#define glGetTexFilterFuncSGIS GLEW_GET_FUN(__glewGetTexFilterFuncSGIS) -#define glTexFilterFuncSGIS GLEW_GET_FUN(__glewTexFilterFuncSGIS) - -#define GLEW_SGIS_texture_filter4 GLEW_GET_VAR(__GLEW_SGIS_texture_filter4) - -#endif /* GL_SGIS_texture_filter4 */ - -/* -------------------------- GL_SGIS_texture_lod -------------------------- */ - -#ifndef GL_SGIS_texture_lod -#define GL_SGIS_texture_lod 1 - -#define GL_TEXTURE_MIN_LOD_SGIS 0x813A -#define GL_TEXTURE_MAX_LOD_SGIS 0x813B -#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C -#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D - -#define GLEW_SGIS_texture_lod GLEW_GET_VAR(__GLEW_SGIS_texture_lod) - -#endif /* GL_SGIS_texture_lod */ - -/* ------------------------- GL_SGIS_texture_select ------------------------ */ - -#ifndef GL_SGIS_texture_select -#define GL_SGIS_texture_select 1 - -#define GLEW_SGIS_texture_select GLEW_GET_VAR(__GLEW_SGIS_texture_select) - -#endif /* GL_SGIS_texture_select */ - -/* ----------------------------- GL_SGIX_async ----------------------------- */ - -#ifndef GL_SGIX_async -#define GL_SGIX_async 1 - -#define GL_ASYNC_MARKER_SGIX 0x8329 - -typedef void (GLAPIENTRY * PFNGLASYNCMARKERSGIXPROC) (GLuint marker); -typedef void (GLAPIENTRY * PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); -typedef GLint (GLAPIENTRY * PFNGLFINISHASYNCSGIXPROC) (GLuint* markerp); -typedef GLuint (GLAPIENTRY * PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); -typedef GLboolean (GLAPIENTRY * PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); -typedef GLint (GLAPIENTRY * PFNGLPOLLASYNCSGIXPROC) (GLuint* markerp); - -#define glAsyncMarkerSGIX GLEW_GET_FUN(__glewAsyncMarkerSGIX) -#define glDeleteAsyncMarkersSGIX GLEW_GET_FUN(__glewDeleteAsyncMarkersSGIX) -#define glFinishAsyncSGIX GLEW_GET_FUN(__glewFinishAsyncSGIX) -#define glGenAsyncMarkersSGIX GLEW_GET_FUN(__glewGenAsyncMarkersSGIX) -#define glIsAsyncMarkerSGIX GLEW_GET_FUN(__glewIsAsyncMarkerSGIX) -#define glPollAsyncSGIX GLEW_GET_FUN(__glewPollAsyncSGIX) - -#define GLEW_SGIX_async GLEW_GET_VAR(__GLEW_SGIX_async) - -#endif /* GL_SGIX_async */ - -/* ------------------------ GL_SGIX_async_histogram ------------------------ */ - -#ifndef GL_SGIX_async_histogram -#define GL_SGIX_async_histogram 1 - -#define GL_ASYNC_HISTOGRAM_SGIX 0x832C -#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D - -#define GLEW_SGIX_async_histogram GLEW_GET_VAR(__GLEW_SGIX_async_histogram) - -#endif /* GL_SGIX_async_histogram */ - -/* -------------------------- GL_SGIX_async_pixel -------------------------- */ - -#ifndef GL_SGIX_async_pixel -#define GL_SGIX_async_pixel 1 - -#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C -#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D -#define GL_ASYNC_READ_PIXELS_SGIX 0x835E -#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F -#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 -#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 - -#define GLEW_SGIX_async_pixel GLEW_GET_VAR(__GLEW_SGIX_async_pixel) - -#endif /* GL_SGIX_async_pixel */ - -/* ----------------------- GL_SGIX_blend_alpha_minmax ---------------------- */ - -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_SGIX_blend_alpha_minmax 1 - -#define GL_ALPHA_MIN_SGIX 0x8320 -#define GL_ALPHA_MAX_SGIX 0x8321 - -#define GLEW_SGIX_blend_alpha_minmax GLEW_GET_VAR(__GLEW_SGIX_blend_alpha_minmax) - -#endif /* GL_SGIX_blend_alpha_minmax */ - -/* ---------------------------- GL_SGIX_clipmap ---------------------------- */ - -#ifndef GL_SGIX_clipmap -#define GL_SGIX_clipmap 1 - -#define GLEW_SGIX_clipmap GLEW_GET_VAR(__GLEW_SGIX_clipmap) - -#endif /* GL_SGIX_clipmap */ - -/* ---------------------- GL_SGIX_convolution_accuracy --------------------- */ - -#ifndef GL_SGIX_convolution_accuracy -#define GL_SGIX_convolution_accuracy 1 - -#define GL_CONVOLUTION_HINT_SGIX 0x8316 - -#define GLEW_SGIX_convolution_accuracy GLEW_GET_VAR(__GLEW_SGIX_convolution_accuracy) - -#endif /* GL_SGIX_convolution_accuracy */ - -/* ------------------------- GL_SGIX_depth_texture ------------------------- */ - -#ifndef GL_SGIX_depth_texture -#define GL_SGIX_depth_texture 1 - -#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 -#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 -#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 - -#define GLEW_SGIX_depth_texture GLEW_GET_VAR(__GLEW_SGIX_depth_texture) - -#endif /* GL_SGIX_depth_texture */ - -/* -------------------------- GL_SGIX_flush_raster ------------------------- */ - -#ifndef GL_SGIX_flush_raster -#define GL_SGIX_flush_raster 1 - -typedef void (GLAPIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void); - -#define glFlushRasterSGIX GLEW_GET_FUN(__glewFlushRasterSGIX) - -#define GLEW_SGIX_flush_raster GLEW_GET_VAR(__GLEW_SGIX_flush_raster) - -#endif /* GL_SGIX_flush_raster */ - -/* --------------------------- GL_SGIX_fog_offset -------------------------- */ - -#ifndef GL_SGIX_fog_offset -#define GL_SGIX_fog_offset 1 - -#define GL_FOG_OFFSET_SGIX 0x8198 -#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 - -#define GLEW_SGIX_fog_offset GLEW_GET_VAR(__GLEW_SGIX_fog_offset) - -#endif /* GL_SGIX_fog_offset */ - -/* -------------------------- GL_SGIX_fog_texture -------------------------- */ - -#ifndef GL_SGIX_fog_texture -#define GL_SGIX_fog_texture 1 - -#define GL_FOG_PATCHY_FACTOR_SGIX 0 -#define GL_FRAGMENT_FOG_SGIX 0 -#define GL_TEXTURE_FOG_SGIX 0 - -typedef void (GLAPIENTRY * PFNGLTEXTUREFOGSGIXPROC) (GLenum pname); - -#define glTextureFogSGIX GLEW_GET_FUN(__glewTextureFogSGIX) - -#define GLEW_SGIX_fog_texture GLEW_GET_VAR(__GLEW_SGIX_fog_texture) - -#endif /* GL_SGIX_fog_texture */ - -/* ------------------- GL_SGIX_fragment_specular_lighting ------------------ */ - -#ifndef GL_SGIX_fragment_specular_lighting -#define GL_SGIX_fragment_specular_lighting 1 - -typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, const GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, const GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum value, GLfloat* data); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum value, GLint* data); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* data); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* data); - -#define glFragmentColorMaterialSGIX GLEW_GET_FUN(__glewFragmentColorMaterialSGIX) -#define glFragmentLightModelfSGIX GLEW_GET_FUN(__glewFragmentLightModelfSGIX) -#define glFragmentLightModelfvSGIX GLEW_GET_FUN(__glewFragmentLightModelfvSGIX) -#define glFragmentLightModeliSGIX GLEW_GET_FUN(__glewFragmentLightModeliSGIX) -#define glFragmentLightModelivSGIX GLEW_GET_FUN(__glewFragmentLightModelivSGIX) -#define glFragmentLightfSGIX GLEW_GET_FUN(__glewFragmentLightfSGIX) -#define glFragmentLightfvSGIX GLEW_GET_FUN(__glewFragmentLightfvSGIX) -#define glFragmentLightiSGIX GLEW_GET_FUN(__glewFragmentLightiSGIX) -#define glFragmentLightivSGIX GLEW_GET_FUN(__glewFragmentLightivSGIX) -#define glFragmentMaterialfSGIX GLEW_GET_FUN(__glewFragmentMaterialfSGIX) -#define glFragmentMaterialfvSGIX GLEW_GET_FUN(__glewFragmentMaterialfvSGIX) -#define glFragmentMaterialiSGIX GLEW_GET_FUN(__glewFragmentMaterialiSGIX) -#define glFragmentMaterialivSGIX GLEW_GET_FUN(__glewFragmentMaterialivSGIX) -#define glGetFragmentLightfvSGIX GLEW_GET_FUN(__glewGetFragmentLightfvSGIX) -#define glGetFragmentLightivSGIX GLEW_GET_FUN(__glewGetFragmentLightivSGIX) -#define glGetFragmentMaterialfvSGIX GLEW_GET_FUN(__glewGetFragmentMaterialfvSGIX) -#define glGetFragmentMaterialivSGIX GLEW_GET_FUN(__glewGetFragmentMaterialivSGIX) - -#define GLEW_SGIX_fragment_specular_lighting GLEW_GET_VAR(__GLEW_SGIX_fragment_specular_lighting) - -#endif /* GL_SGIX_fragment_specular_lighting */ - -/* --------------------------- GL_SGIX_framezoom --------------------------- */ - -#ifndef GL_SGIX_framezoom -#define GL_SGIX_framezoom 1 - -typedef void (GLAPIENTRY * PFNGLFRAMEZOOMSGIXPROC) (GLint factor); - -#define glFrameZoomSGIX GLEW_GET_FUN(__glewFrameZoomSGIX) - -#define GLEW_SGIX_framezoom GLEW_GET_VAR(__GLEW_SGIX_framezoom) - -#endif /* GL_SGIX_framezoom */ - -/* --------------------------- GL_SGIX_interlace --------------------------- */ - -#ifndef GL_SGIX_interlace -#define GL_SGIX_interlace 1 - -#define GL_INTERLACE_SGIX 0x8094 - -#define GLEW_SGIX_interlace GLEW_GET_VAR(__GLEW_SGIX_interlace) - -#endif /* GL_SGIX_interlace */ - -/* ------------------------- GL_SGIX_ir_instrument1 ------------------------ */ - -#ifndef GL_SGIX_ir_instrument1 -#define GL_SGIX_ir_instrument1 1 - -#define GLEW_SGIX_ir_instrument1 GLEW_GET_VAR(__GLEW_SGIX_ir_instrument1) - -#endif /* GL_SGIX_ir_instrument1 */ - -/* ------------------------- GL_SGIX_list_priority ------------------------- */ - -#ifndef GL_SGIX_list_priority -#define GL_SGIX_list_priority 1 - -#define GLEW_SGIX_list_priority GLEW_GET_VAR(__GLEW_SGIX_list_priority) - -#endif /* GL_SGIX_list_priority */ - -/* ------------------------- GL_SGIX_pixel_texture ------------------------- */ - -#ifndef GL_SGIX_pixel_texture -#define GL_SGIX_pixel_texture 1 - -typedef void (GLAPIENTRY * PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); - -#define glPixelTexGenSGIX GLEW_GET_FUN(__glewPixelTexGenSGIX) - -#define GLEW_SGIX_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_pixel_texture) - -#endif /* GL_SGIX_pixel_texture */ - -/* ----------------------- GL_SGIX_pixel_texture_bits ---------------------- */ - -#ifndef GL_SGIX_pixel_texture_bits -#define GL_SGIX_pixel_texture_bits 1 - -#define GLEW_SGIX_pixel_texture_bits GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_bits) - -#endif /* GL_SGIX_pixel_texture_bits */ - -/* ------------------------ GL_SGIX_reference_plane ------------------------ */ - -#ifndef GL_SGIX_reference_plane -#define GL_SGIX_reference_plane 1 - -typedef void (GLAPIENTRY * PFNGLREFERENCEPLANESGIXPROC) (const GLdouble* equation); - -#define glReferencePlaneSGIX GLEW_GET_FUN(__glewReferencePlaneSGIX) - -#define GLEW_SGIX_reference_plane GLEW_GET_VAR(__GLEW_SGIX_reference_plane) - -#endif /* GL_SGIX_reference_plane */ - -/* ---------------------------- GL_SGIX_resample --------------------------- */ - -#ifndef GL_SGIX_resample -#define GL_SGIX_resample 1 - -#define GL_PACK_RESAMPLE_SGIX 0x842E -#define GL_UNPACK_RESAMPLE_SGIX 0x842F -#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 -#define GL_RESAMPLE_REPLICATE_SGIX 0x8433 -#define GL_RESAMPLE_ZERO_FILL_SGIX 0x8434 - -#define GLEW_SGIX_resample GLEW_GET_VAR(__GLEW_SGIX_resample) - -#endif /* GL_SGIX_resample */ - -/* ----------------------------- GL_SGIX_shadow ---------------------------- */ - -#ifndef GL_SGIX_shadow -#define GL_SGIX_shadow 1 - -#define GL_TEXTURE_COMPARE_SGIX 0x819A -#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B -#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C -#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D - -#define GLEW_SGIX_shadow GLEW_GET_VAR(__GLEW_SGIX_shadow) - -#endif /* GL_SGIX_shadow */ - -/* ------------------------- GL_SGIX_shadow_ambient ------------------------ */ - -#ifndef GL_SGIX_shadow_ambient -#define GL_SGIX_shadow_ambient 1 - -#define GL_SHADOW_AMBIENT_SGIX 0x80BF - -#define GLEW_SGIX_shadow_ambient GLEW_GET_VAR(__GLEW_SGIX_shadow_ambient) - -#endif /* GL_SGIX_shadow_ambient */ - -/* ----------------------------- GL_SGIX_sprite ---------------------------- */ - -#ifndef GL_SGIX_sprite -#define GL_SGIX_sprite 1 - -typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, GLint* params); - -#define glSpriteParameterfSGIX GLEW_GET_FUN(__glewSpriteParameterfSGIX) -#define glSpriteParameterfvSGIX GLEW_GET_FUN(__glewSpriteParameterfvSGIX) -#define glSpriteParameteriSGIX GLEW_GET_FUN(__glewSpriteParameteriSGIX) -#define glSpriteParameterivSGIX GLEW_GET_FUN(__glewSpriteParameterivSGIX) - -#define GLEW_SGIX_sprite GLEW_GET_VAR(__GLEW_SGIX_sprite) - -#endif /* GL_SGIX_sprite */ - -/* ----------------------- GL_SGIX_tag_sample_buffer ----------------------- */ - -#ifndef GL_SGIX_tag_sample_buffer -#define GL_SGIX_tag_sample_buffer 1 - -typedef void (GLAPIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); - -#define glTagSampleBufferSGIX GLEW_GET_FUN(__glewTagSampleBufferSGIX) - -#define GLEW_SGIX_tag_sample_buffer GLEW_GET_VAR(__GLEW_SGIX_tag_sample_buffer) - -#endif /* GL_SGIX_tag_sample_buffer */ - -/* ------------------------ GL_SGIX_texture_add_env ------------------------ */ - -#ifndef GL_SGIX_texture_add_env -#define GL_SGIX_texture_add_env 1 - -#define GLEW_SGIX_texture_add_env GLEW_GET_VAR(__GLEW_SGIX_texture_add_env) - -#endif /* GL_SGIX_texture_add_env */ - -/* -------------------- GL_SGIX_texture_coordinate_clamp ------------------- */ - -#ifndef GL_SGIX_texture_coordinate_clamp -#define GL_SGIX_texture_coordinate_clamp 1 - -#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 -#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A -#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B - -#define GLEW_SGIX_texture_coordinate_clamp GLEW_GET_VAR(__GLEW_SGIX_texture_coordinate_clamp) - -#endif /* GL_SGIX_texture_coordinate_clamp */ - -/* ------------------------ GL_SGIX_texture_lod_bias ----------------------- */ - -#ifndef GL_SGIX_texture_lod_bias -#define GL_SGIX_texture_lod_bias 1 - -#define GLEW_SGIX_texture_lod_bias GLEW_GET_VAR(__GLEW_SGIX_texture_lod_bias) - -#endif /* GL_SGIX_texture_lod_bias */ - -/* ---------------------- GL_SGIX_texture_multi_buffer --------------------- */ - -#ifndef GL_SGIX_texture_multi_buffer -#define GL_SGIX_texture_multi_buffer 1 - -#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E - -#define GLEW_SGIX_texture_multi_buffer GLEW_GET_VAR(__GLEW_SGIX_texture_multi_buffer) - -#endif /* GL_SGIX_texture_multi_buffer */ - -/* ------------------------- GL_SGIX_texture_range ------------------------- */ - -#ifndef GL_SGIX_texture_range -#define GL_SGIX_texture_range 1 - -#define GL_RGB_SIGNED_SGIX 0x85E0 -#define GL_RGBA_SIGNED_SGIX 0x85E1 -#define GL_ALPHA_SIGNED_SGIX 0x85E2 -#define GL_LUMINANCE_SIGNED_SGIX 0x85E3 -#define GL_INTENSITY_SIGNED_SGIX 0x85E4 -#define GL_LUMINANCE_ALPHA_SIGNED_SGIX 0x85E5 -#define GL_RGB16_SIGNED_SGIX 0x85E6 -#define GL_RGBA16_SIGNED_SGIX 0x85E7 -#define GL_ALPHA16_SIGNED_SGIX 0x85E8 -#define GL_LUMINANCE16_SIGNED_SGIX 0x85E9 -#define GL_INTENSITY16_SIGNED_SGIX 0x85EA -#define GL_LUMINANCE16_ALPHA16_SIGNED_SGIX 0x85EB -#define GL_RGB_EXTENDED_RANGE_SGIX 0x85EC -#define GL_RGBA_EXTENDED_RANGE_SGIX 0x85ED -#define GL_ALPHA_EXTENDED_RANGE_SGIX 0x85EE -#define GL_LUMINANCE_EXTENDED_RANGE_SGIX 0x85EF -#define GL_INTENSITY_EXTENDED_RANGE_SGIX 0x85F0 -#define GL_LUMINANCE_ALPHA_EXTENDED_RANGE_SGIX 0x85F1 -#define GL_RGB16_EXTENDED_RANGE_SGIX 0x85F2 -#define GL_RGBA16_EXTENDED_RANGE_SGIX 0x85F3 -#define GL_ALPHA16_EXTENDED_RANGE_SGIX 0x85F4 -#define GL_LUMINANCE16_EXTENDED_RANGE_SGIX 0x85F5 -#define GL_INTENSITY16_EXTENDED_RANGE_SGIX 0x85F6 -#define GL_LUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX 0x85F7 -#define GL_MIN_LUMINANCE_SGIS 0x85F8 -#define GL_MAX_LUMINANCE_SGIS 0x85F9 -#define GL_MIN_INTENSITY_SGIS 0x85FA -#define GL_MAX_INTENSITY_SGIS 0x85FB - -#define GLEW_SGIX_texture_range GLEW_GET_VAR(__GLEW_SGIX_texture_range) - -#endif /* GL_SGIX_texture_range */ - -/* ----------------------- GL_SGIX_texture_scale_bias ---------------------- */ - -#ifndef GL_SGIX_texture_scale_bias -#define GL_SGIX_texture_scale_bias 1 - -#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 -#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A -#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B -#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C - -#define GLEW_SGIX_texture_scale_bias GLEW_GET_VAR(__GLEW_SGIX_texture_scale_bias) - -#endif /* GL_SGIX_texture_scale_bias */ - -/* ------------------------- GL_SGIX_vertex_preclip ------------------------ */ - -#ifndef GL_SGIX_vertex_preclip -#define GL_SGIX_vertex_preclip 1 - -#define GL_VERTEX_PRECLIP_SGIX 0x83EE -#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF - -#define GLEW_SGIX_vertex_preclip GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip) - -#endif /* GL_SGIX_vertex_preclip */ - -/* ---------------------- GL_SGIX_vertex_preclip_hint ---------------------- */ - -#ifndef GL_SGIX_vertex_preclip_hint -#define GL_SGIX_vertex_preclip_hint 1 - -#define GL_VERTEX_PRECLIP_SGIX 0x83EE -#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF - -#define GLEW_SGIX_vertex_preclip_hint GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip_hint) - -#endif /* GL_SGIX_vertex_preclip_hint */ - -/* ----------------------------- GL_SGIX_ycrcb ----------------------------- */ - -#ifndef GL_SGIX_ycrcb -#define GL_SGIX_ycrcb 1 - -#define GLEW_SGIX_ycrcb GLEW_GET_VAR(__GLEW_SGIX_ycrcb) - -#endif /* GL_SGIX_ycrcb */ - -/* -------------------------- GL_SGI_color_matrix -------------------------- */ - -#ifndef GL_SGI_color_matrix -#define GL_SGI_color_matrix 1 - -#define GL_COLOR_MATRIX_SGI 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB - -#define GLEW_SGI_color_matrix GLEW_GET_VAR(__GLEW_SGI_color_matrix) - -#endif /* GL_SGI_color_matrix */ - -/* --------------------------- GL_SGI_color_table -------------------------- */ - -#ifndef GL_SGI_color_table -#define GL_SGI_color_table 1 - -#define GL_COLOR_TABLE_SGI 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 -#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 -#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 -#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 -#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 -#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF - -typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); -typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void *table); - -#define glColorTableParameterfvSGI GLEW_GET_FUN(__glewColorTableParameterfvSGI) -#define glColorTableParameterivSGI GLEW_GET_FUN(__glewColorTableParameterivSGI) -#define glColorTableSGI GLEW_GET_FUN(__glewColorTableSGI) -#define glCopyColorTableSGI GLEW_GET_FUN(__glewCopyColorTableSGI) -#define glGetColorTableParameterfvSGI GLEW_GET_FUN(__glewGetColorTableParameterfvSGI) -#define glGetColorTableParameterivSGI GLEW_GET_FUN(__glewGetColorTableParameterivSGI) -#define glGetColorTableSGI GLEW_GET_FUN(__glewGetColorTableSGI) - -#define GLEW_SGI_color_table GLEW_GET_VAR(__GLEW_SGI_color_table) - -#endif /* GL_SGI_color_table */ - -/* ----------------------- GL_SGI_texture_color_table ---------------------- */ - -#ifndef GL_SGI_texture_color_table -#define GL_SGI_texture_color_table 1 - -#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC -#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD - -#define GLEW_SGI_texture_color_table GLEW_GET_VAR(__GLEW_SGI_texture_color_table) - -#endif /* GL_SGI_texture_color_table */ - -/* ------------------------- GL_SUNX_constant_data ------------------------- */ - -#ifndef GL_SUNX_constant_data -#define GL_SUNX_constant_data 1 - -#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 -#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 - -typedef void (GLAPIENTRY * PFNGLFINISHTEXTURESUNXPROC) (void); - -#define glFinishTextureSUNX GLEW_GET_FUN(__glewFinishTextureSUNX) - -#define GLEW_SUNX_constant_data GLEW_GET_VAR(__GLEW_SUNX_constant_data) - -#endif /* GL_SUNX_constant_data */ - -/* -------------------- GL_SUN_convolution_border_modes -------------------- */ - -#ifndef GL_SUN_convolution_border_modes -#define GL_SUN_convolution_border_modes 1 - -#define GL_WRAP_BORDER_SUN 0x81D4 - -#define GLEW_SUN_convolution_border_modes GLEW_GET_VAR(__GLEW_SUN_convolution_border_modes) - -#endif /* GL_SUN_convolution_border_modes */ - -/* -------------------------- GL_SUN_global_alpha -------------------------- */ - -#ifndef GL_SUN_global_alpha -#define GL_SUN_global_alpha 1 - -#define GL_GLOBAL_ALPHA_SUN 0x81D9 -#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA - -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); - -#define glGlobalAlphaFactorbSUN GLEW_GET_FUN(__glewGlobalAlphaFactorbSUN) -#define glGlobalAlphaFactordSUN GLEW_GET_FUN(__glewGlobalAlphaFactordSUN) -#define glGlobalAlphaFactorfSUN GLEW_GET_FUN(__glewGlobalAlphaFactorfSUN) -#define glGlobalAlphaFactoriSUN GLEW_GET_FUN(__glewGlobalAlphaFactoriSUN) -#define glGlobalAlphaFactorsSUN GLEW_GET_FUN(__glewGlobalAlphaFactorsSUN) -#define glGlobalAlphaFactorubSUN GLEW_GET_FUN(__glewGlobalAlphaFactorubSUN) -#define glGlobalAlphaFactoruiSUN GLEW_GET_FUN(__glewGlobalAlphaFactoruiSUN) -#define glGlobalAlphaFactorusSUN GLEW_GET_FUN(__glewGlobalAlphaFactorusSUN) - -#define GLEW_SUN_global_alpha GLEW_GET_VAR(__GLEW_SUN_global_alpha) - -#endif /* GL_SUN_global_alpha */ - -/* --------------------------- GL_SUN_mesh_array --------------------------- */ - -#ifndef GL_SUN_mesh_array -#define GL_SUN_mesh_array 1 - -#define GL_QUAD_MESH_SUN 0x8614 -#define GL_TRIANGLE_MESH_SUN 0x8615 - -#define GLEW_SUN_mesh_array GLEW_GET_VAR(__GLEW_SUN_mesh_array) - -#endif /* GL_SUN_mesh_array */ - -/* ------------------------ GL_SUN_read_video_pixels ----------------------- */ - -#ifndef GL_SUN_read_video_pixels -#define GL_SUN_read_video_pixels 1 - -typedef void (GLAPIENTRY * PFNGLREADVIDEOPIXELSSUNPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels); - -#define glReadVideoPixelsSUN GLEW_GET_FUN(__glewReadVideoPixelsSUN) - -#define GLEW_SUN_read_video_pixels GLEW_GET_VAR(__GLEW_SUN_read_video_pixels) - -#endif /* GL_SUN_read_video_pixels */ - -/* --------------------------- GL_SUN_slice_accum -------------------------- */ - -#ifndef GL_SUN_slice_accum -#define GL_SUN_slice_accum 1 - -#define GL_SLICE_ACCUM_SUN 0x85CC - -#define GLEW_SUN_slice_accum GLEW_GET_VAR(__GLEW_SUN_slice_accum) - -#endif /* GL_SUN_slice_accum */ - -/* -------------------------- GL_SUN_triangle_list ------------------------- */ - -#ifndef GL_SUN_triangle_list -#define GL_SUN_triangle_list 1 - -#define GL_RESTART_SUN 0x01 -#define GL_REPLACE_MIDDLE_SUN 0x02 -#define GL_REPLACE_OLDEST_SUN 0x03 -#define GL_TRIANGLE_LIST_SUN 0x81D7 -#define GL_REPLACEMENT_CODE_SUN 0x81D8 -#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 -#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 -#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 -#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 -#define GL_R1UI_V3F_SUN 0x85C4 -#define GL_R1UI_C4UB_V3F_SUN 0x85C5 -#define GL_R1UI_C3F_V3F_SUN 0x85C6 -#define GL_R1UI_N3F_V3F_SUN 0x85C7 -#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 -#define GL_R1UI_T2F_V3F_SUN 0x85C9 -#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA -#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB - -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void *pointer); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte* code); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint* code); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort* code); - -#define glReplacementCodePointerSUN GLEW_GET_FUN(__glewReplacementCodePointerSUN) -#define glReplacementCodeubSUN GLEW_GET_FUN(__glewReplacementCodeubSUN) -#define glReplacementCodeubvSUN GLEW_GET_FUN(__glewReplacementCodeubvSUN) -#define glReplacementCodeuiSUN GLEW_GET_FUN(__glewReplacementCodeuiSUN) -#define glReplacementCodeuivSUN GLEW_GET_FUN(__glewReplacementCodeuivSUN) -#define glReplacementCodeusSUN GLEW_GET_FUN(__glewReplacementCodeusSUN) -#define glReplacementCodeusvSUN GLEW_GET_FUN(__glewReplacementCodeusvSUN) - -#define GLEW_SUN_triangle_list GLEW_GET_VAR(__GLEW_SUN_triangle_list) - -#endif /* GL_SUN_triangle_list */ - -/* ----------------------------- GL_SUN_vertex ----------------------------- */ - -#ifndef GL_SUN_vertex -#define GL_SUN_vertex 1 - -typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte* c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte* c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint* rc, const GLubyte *c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat* tc, const GLubyte *c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *v); - -#define glColor3fVertex3fSUN GLEW_GET_FUN(__glewColor3fVertex3fSUN) -#define glColor3fVertex3fvSUN GLEW_GET_FUN(__glewColor3fVertex3fvSUN) -#define glColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fSUN) -#define glColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fvSUN) -#define glColor4ubVertex2fSUN GLEW_GET_FUN(__glewColor4ubVertex2fSUN) -#define glColor4ubVertex2fvSUN GLEW_GET_FUN(__glewColor4ubVertex2fvSUN) -#define glColor4ubVertex3fSUN GLEW_GET_FUN(__glewColor4ubVertex3fSUN) -#define glColor4ubVertex3fvSUN GLEW_GET_FUN(__glewColor4ubVertex3fvSUN) -#define glNormal3fVertex3fSUN GLEW_GET_FUN(__glewNormal3fVertex3fSUN) -#define glNormal3fVertex3fvSUN GLEW_GET_FUN(__glewNormal3fVertex3fvSUN) -#define glReplacementCodeuiColor3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fSUN) -#define glReplacementCodeuiColor3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fvSUN) -#define glReplacementCodeuiColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fSUN) -#define glReplacementCodeuiColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fvSUN) -#define glReplacementCodeuiColor4ubVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fSUN) -#define glReplacementCodeuiColor4ubVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fvSUN) -#define glReplacementCodeuiNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fSUN) -#define glReplacementCodeuiNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fvSUN) -#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN) -#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN) -#define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN) -#define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN) -#define glReplacementCodeuiTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fSUN) -#define glReplacementCodeuiTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fvSUN) -#define glReplacementCodeuiVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fSUN) -#define glReplacementCodeuiVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fvSUN) -#define glTexCoord2fColor3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fSUN) -#define glTexCoord2fColor3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fvSUN) -#define glTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fSUN) -#define glTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fvSUN) -#define glTexCoord2fColor4ubVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fSUN) -#define glTexCoord2fColor4ubVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fvSUN) -#define glTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fSUN) -#define glTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fvSUN) -#define glTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fSUN) -#define glTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fvSUN) -#define glTexCoord4fColor4fNormal3fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fSUN) -#define glTexCoord4fColor4fNormal3fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fvSUN) -#define glTexCoord4fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fSUN) -#define glTexCoord4fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fvSUN) - -#define GLEW_SUN_vertex GLEW_GET_VAR(__GLEW_SUN_vertex) - -#endif /* GL_SUN_vertex */ - -/* -------------------------- GL_WIN_phong_shading ------------------------- */ - -#ifndef GL_WIN_phong_shading -#define GL_WIN_phong_shading 1 - -#define GL_PHONG_WIN 0x80EA -#define GL_PHONG_HINT_WIN 0x80EB - -#define GLEW_WIN_phong_shading GLEW_GET_VAR(__GLEW_WIN_phong_shading) - -#endif /* GL_WIN_phong_shading */ - -/* -------------------------- GL_WIN_specular_fog -------------------------- */ - -#ifndef GL_WIN_specular_fog -#define GL_WIN_specular_fog 1 - -#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC - -#define GLEW_WIN_specular_fog GLEW_GET_VAR(__GLEW_WIN_specular_fog) - -#endif /* GL_WIN_specular_fog */ - -/* ---------------------------- GL_WIN_swap_hint --------------------------- */ - -#ifndef GL_WIN_swap_hint -#define GL_WIN_swap_hint 1 - -typedef void (GLAPIENTRY * PFNGLADDSWAPHINTRECTWINPROC) (GLint x, GLint y, GLsizei width, GLsizei height); - -#define glAddSwapHintRectWIN GLEW_GET_FUN(__glewAddSwapHintRectWIN) - -#define GLEW_WIN_swap_hint GLEW_GET_VAR(__GLEW_WIN_swap_hint) - -#endif /* GL_WIN_swap_hint */ - -/* ------------------------------------------------------------------------- */ - -#if defined(GLEW_MX) && defined(_WIN32) -#define GLEW_FUN_EXPORT -#else -#define GLEW_FUN_EXPORT GLEWAPI -#endif /* GLEW_MX */ - -#if defined(GLEW_MX) -#define GLEW_VAR_EXPORT -#else -#define GLEW_VAR_EXPORT GLEWAPI -#endif /* GLEW_MX */ - -#if defined(GLEW_MX) && defined(_WIN32) -struct GLEWContextStruct -{ -#endif /* GLEW_MX */ - -GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D; -GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements; -GLEW_FUN_EXPORT PFNGLTEXIMAGE3DPROC __glewTexImage3D; -GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D; - -GLEW_FUN_EXPORT PFNGLACTIVETEXTUREPROC __glewActiveTexture; -GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D; -GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage; -GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd; -GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf; -GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd; -GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv; -GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage; - -GLEW_FUN_EXPORT PFNGLBLENDCOLORPROC __glewBlendColor; -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONPROC __glewBlendEquation; -GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate; -GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer; -GLEW_FUN_EXPORT PFNGLFOGCOORDDPROC __glewFogCoordd; -GLEW_FUN_EXPORT PFNGLFOGCOORDDVPROC __glewFogCoorddv; -GLEW_FUN_EXPORT PFNGLFOGCOORDFPROC __glewFogCoordf; -GLEW_FUN_EXPORT PFNGLFOGCOORDFVPROC __glewFogCoordfv; -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFPROC __glewPointParameterf; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIPROC __glewPointParameteri; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DPROC __glewWindowPos2d; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FPROC __glewWindowPos2f; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IPROC __glewWindowPos2i; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SPROC __glewWindowPos2s; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DPROC __glewWindowPos3d; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FPROC __glewWindowPos3f; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IPROC __glewWindowPos3i; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SPROC __glewWindowPos3s; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv; - -GLEW_FUN_EXPORT PFNGLBEGINQUERYPROC __glewBeginQuery; -GLEW_FUN_EXPORT PFNGLBINDBUFFERPROC __glewBindBuffer; -GLEW_FUN_EXPORT PFNGLBUFFERDATAPROC __glewBufferData; -GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAPROC __glewBufferSubData; -GLEW_FUN_EXPORT PFNGLDELETEBUFFERSPROC __glewDeleteBuffers; -GLEW_FUN_EXPORT PFNGLDELETEQUERIESPROC __glewDeleteQueries; -GLEW_FUN_EXPORT PFNGLENDQUERYPROC __glewEndQuery; -GLEW_FUN_EXPORT PFNGLGENBUFFERSPROC __glewGenBuffers; -GLEW_FUN_EXPORT PFNGLGENQUERIESPROC __glewGenQueries; -GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv; -GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv; -GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv; -GLEW_FUN_EXPORT PFNGLGETQUERYIVPROC __glewGetQueryiv; -GLEW_FUN_EXPORT PFNGLISBUFFERPROC __glewIsBuffer; -GLEW_FUN_EXPORT PFNGLISQUERYPROC __glewIsQuery; -GLEW_FUN_EXPORT PFNGLMAPBUFFERPROC __glewMapBuffer; -GLEW_FUN_EXPORT PFNGLUNMAPBUFFERPROC __glewUnmapBuffer; - -GLEW_FUN_EXPORT PFNGLATTACHSHADERPROC __glewAttachShader; -GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation; -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate; -GLEW_FUN_EXPORT PFNGLCOMPILESHADERPROC __glewCompileShader; -GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPROC __glewCreateProgram; -GLEW_FUN_EXPORT PFNGLCREATESHADERPROC __glewCreateShader; -GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPROC __glewDeleteProgram; -GLEW_FUN_EXPORT PFNGLDELETESHADERPROC __glewDeleteShader; -GLEW_FUN_EXPORT PFNGLDETACHSHADERPROC __glewDetachShader; -GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray; -GLEW_FUN_EXPORT PFNGLDRAWBUFFERSPROC __glewDrawBuffers; -GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray; -GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib; -GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform; -GLEW_FUN_EXPORT PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders; -GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation; -GLEW_FUN_EXPORT PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog; -GLEW_FUN_EXPORT PFNGLGETPROGRAMIVPROC __glewGetProgramiv; -GLEW_FUN_EXPORT PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog; -GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEPROC __glewGetShaderSource; -GLEW_FUN_EXPORT PFNGLGETSHADERIVPROC __glewGetShaderiv; -GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation; -GLEW_FUN_EXPORT PFNGLGETUNIFORMFVPROC __glewGetUniformfv; -GLEW_FUN_EXPORT PFNGLGETUNIFORMIVPROC __glewGetUniformiv; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv; -GLEW_FUN_EXPORT PFNGLISPROGRAMPROC __glewIsProgram; -GLEW_FUN_EXPORT PFNGLISSHADERPROC __glewIsShader; -GLEW_FUN_EXPORT PFNGLLINKPROGRAMPROC __glewLinkProgram; -GLEW_FUN_EXPORT PFNGLSHADERSOURCEPROC __glewShaderSource; -GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate; -GLEW_FUN_EXPORT PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate; -GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate; -GLEW_FUN_EXPORT PFNGLUNIFORM1FPROC __glewUniform1f; -GLEW_FUN_EXPORT PFNGLUNIFORM1FVPROC __glewUniform1fv; -GLEW_FUN_EXPORT PFNGLUNIFORM1IPROC __glewUniform1i; -GLEW_FUN_EXPORT PFNGLUNIFORM1IVPROC __glewUniform1iv; -GLEW_FUN_EXPORT PFNGLUNIFORM2FPROC __glewUniform2f; -GLEW_FUN_EXPORT PFNGLUNIFORM2FVPROC __glewUniform2fv; -GLEW_FUN_EXPORT PFNGLUNIFORM2IPROC __glewUniform2i; -GLEW_FUN_EXPORT PFNGLUNIFORM2IVPROC __glewUniform2iv; -GLEW_FUN_EXPORT PFNGLUNIFORM3FPROC __glewUniform3f; -GLEW_FUN_EXPORT PFNGLUNIFORM3FVPROC __glewUniform3fv; -GLEW_FUN_EXPORT PFNGLUNIFORM3IPROC __glewUniform3i; -GLEW_FUN_EXPORT PFNGLUNIFORM3IVPROC __glewUniform3iv; -GLEW_FUN_EXPORT PFNGLUNIFORM4FPROC __glewUniform4f; -GLEW_FUN_EXPORT PFNGLUNIFORM4FVPROC __glewUniform4fv; -GLEW_FUN_EXPORT PFNGLUNIFORM4IPROC __glewUniform4i; -GLEW_FUN_EXPORT PFNGLUNIFORM4IVPROC __glewUniform4iv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv; -GLEW_FUN_EXPORT PFNGLUSEPROGRAMPROC __glewUseProgram; -GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPROC __glewValidateProgram; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer; - -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv; - -GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender; -GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback; -GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation; -GLEW_FUN_EXPORT PFNGLCLAMPCOLORPROC __glewClampColor; -GLEW_FUN_EXPORT PFNGLCLEARBUFFERFIPROC __glewClearBufferfi; -GLEW_FUN_EXPORT PFNGLCLEARBUFFERFVPROC __glewClearBufferfv; -GLEW_FUN_EXPORT PFNGLCLEARBUFFERIVPROC __glewClearBufferiv; -GLEW_FUN_EXPORT PFNGLCLEARBUFFERUIVPROC __glewClearBufferuiv; -GLEW_FUN_EXPORT PFNGLCOLORMASKIPROC __glewColorMaski; -GLEW_FUN_EXPORT PFNGLDISABLEIPROC __glewDisablei; -GLEW_FUN_EXPORT PFNGLENABLEIPROC __glewEnablei; -GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender; -GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback; -GLEW_FUN_EXPORT PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v; -GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation; -GLEW_FUN_EXPORT PFNGLGETSTRINGIPROC __glewGetStringi; -GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv; -GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv; -GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGPROC __glewGetTransformFeedbackVarying; -GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVPROC __glewGetUniformuiv; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVPROC __glewGetVertexAttribIiv; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVPROC __glewGetVertexAttribIuiv; -GLEW_FUN_EXPORT PFNGLISENABLEDIPROC __glewIsEnabledi; -GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVPROC __glewTexParameterIiv; -GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVPROC __glewTexParameterIuiv; -GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSPROC __glewTransformFeedbackVaryings; -GLEW_FUN_EXPORT PFNGLUNIFORM1UIPROC __glewUniform1ui; -GLEW_FUN_EXPORT PFNGLUNIFORM1UIVPROC __glewUniform1uiv; -GLEW_FUN_EXPORT PFNGLUNIFORM2UIPROC __glewUniform2ui; -GLEW_FUN_EXPORT PFNGLUNIFORM2UIVPROC __glewUniform2uiv; -GLEW_FUN_EXPORT PFNGLUNIFORM3UIPROC __glewUniform3ui; -GLEW_FUN_EXPORT PFNGLUNIFORM3UIVPROC __glewUniform3uiv; -GLEW_FUN_EXPORT PFNGLUNIFORM4UIPROC __glewUniform4ui; -GLEW_FUN_EXPORT PFNGLUNIFORM4UIVPROC __glewUniform4uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IPROC __glewVertexAttribI1i; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVPROC __glewVertexAttribI1iv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIPROC __glewVertexAttribI1ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVPROC __glewVertexAttribI1uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IPROC __glewVertexAttribI2i; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVPROC __glewVertexAttribI2iv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIPROC __glewVertexAttribI2ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVPROC __glewVertexAttribI2uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IPROC __glewVertexAttribI3i; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVPROC __glewVertexAttribI3iv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIPROC __glewVertexAttribI3ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVPROC __glewVertexAttribI3uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVPROC __glewVertexAttribI4bv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IPROC __glewVertexAttribI4i; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVPROC __glewVertexAttribI4iv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVPROC __glewVertexAttribI4sv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVPROC __glewVertexAttribI4ubv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIPROC __glewVertexAttribI4ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer; - -GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced; -GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex; -GLEW_FUN_EXPORT PFNGLTEXBUFFERPROC __glewTexBuffer; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture; -GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v; -GLEW_FUN_EXPORT PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v; - -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORPROC __glewVertexAttribDivisor; - -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIPROC __glewBlendEquationSeparatei; -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIPROC __glewBlendEquationi; -GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIPROC __glewBlendFuncSeparatei; -GLEW_FUN_EXPORT PFNGLBLENDFUNCIPROC __glewBlendFunci; -GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGPROC __glewMinSampleShading; - -GLEW_FUN_EXPORT PFNGLGETGRAPHICSRESETSTATUSPROC __glewGetGraphicsResetStatus; -GLEW_FUN_EXPORT PFNGLGETNCOMPRESSEDTEXIMAGEPROC __glewGetnCompressedTexImage; -GLEW_FUN_EXPORT PFNGLGETNTEXIMAGEPROC __glewGetnTexImage; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMDVPROC __glewGetnUniformdv; - -GLEW_FUN_EXPORT PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX; - -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKAMDPROC __glewDebugMessageCallbackAMD; -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEENABLEAMDPROC __glewDebugMessageEnableAMD; -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTAMDPROC __glewDebugMessageInsertAMD; -GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGAMDPROC __glewGetDebugMessageLogAMD; - -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD; -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD; -GLEW_FUN_EXPORT PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD; -GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD; - -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPARAMETERIAMDPROC __glewVertexAttribParameteriAMD; - -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD; - -GLEW_FUN_EXPORT PFNGLDELETENAMESAMDPROC __glewDeleteNamesAMD; -GLEW_FUN_EXPORT PFNGLGENNAMESAMDPROC __glewGenNamesAMD; -GLEW_FUN_EXPORT PFNGLISNAMEAMDPROC __glewIsNameAMD; - -GLEW_FUN_EXPORT PFNGLQUERYOBJECTPARAMETERUIAMDPROC __glewQueryObjectParameteruiAMD; - -GLEW_FUN_EXPORT PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD; -GLEW_FUN_EXPORT PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD; -GLEW_FUN_EXPORT PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD; -GLEW_FUN_EXPORT PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD; -GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD; -GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD; -GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD; -GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD; -GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD; -GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD; -GLEW_FUN_EXPORT PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD; - -GLEW_FUN_EXPORT PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD; - -GLEW_FUN_EXPORT PFNGLTEXSTORAGESPARSEAMDPROC __glewTexStorageSparseAMD; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGESPARSEAMDPROC __glewTextureStorageSparseAMD; - -GLEW_FUN_EXPORT PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD; - -GLEW_FUN_EXPORT PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD; -GLEW_FUN_EXPORT PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD; - -GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERANGLEPROC __glewBlitFramebufferANGLE; - -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC __glewRenderbufferStorageMultisampleANGLE; - -GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDANGLEPROC __glewDrawArraysInstancedANGLE; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDANGLEPROC __glewDrawElementsInstancedANGLE; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORANGLEPROC __glewVertexAttribDivisorANGLE; - -GLEW_FUN_EXPORT PFNGLBEGINQUERYANGLEPROC __glewBeginQueryANGLE; -GLEW_FUN_EXPORT PFNGLDELETEQUERIESANGLEPROC __glewDeleteQueriesANGLE; -GLEW_FUN_EXPORT PFNGLENDQUERYANGLEPROC __glewEndQueryANGLE; -GLEW_FUN_EXPORT PFNGLGENQUERIESANGLEPROC __glewGenQueriesANGLE; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VANGLEPROC __glewGetQueryObjecti64vANGLE; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVANGLEPROC __glewGetQueryObjectivANGLE; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VANGLEPROC __glewGetQueryObjectui64vANGLE; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVANGLEPROC __glewGetQueryObjectuivANGLE; -GLEW_FUN_EXPORT PFNGLGETQUERYIVANGLEPROC __glewGetQueryivANGLE; -GLEW_FUN_EXPORT PFNGLISQUERYANGLEPROC __glewIsQueryANGLE; -GLEW_FUN_EXPORT PFNGLQUERYCOUNTERANGLEPROC __glewQueryCounterANGLE; - -GLEW_FUN_EXPORT PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC __glewGetTranslatedShaderSourceANGLE; - -GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE; -GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE; -GLEW_FUN_EXPORT PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE; -GLEW_FUN_EXPORT PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE; - -GLEW_FUN_EXPORT PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE; -GLEW_FUN_EXPORT PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE; -GLEW_FUN_EXPORT PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE; -GLEW_FUN_EXPORT PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE; -GLEW_FUN_EXPORT PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE; -GLEW_FUN_EXPORT PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE; -GLEW_FUN_EXPORT PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE; -GLEW_FUN_EXPORT PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE; - -GLEW_FUN_EXPORT PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE; -GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE; - -GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE; -GLEW_FUN_EXPORT PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE; -GLEW_FUN_EXPORT PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE; - -GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE; -GLEW_FUN_EXPORT PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE; - -GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE; -GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE; -GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE; -GLEW_FUN_EXPORT PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE; - -GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE; - -GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE; -GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE; -GLEW_FUN_EXPORT PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE; -GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE; -GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE; -GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE; -GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE; - -GLEW_FUN_EXPORT PFNGLCLEARDEPTHFPROC __glewClearDepthf; -GLEW_FUN_EXPORT PFNGLDEPTHRANGEFPROC __glewDepthRangef; -GLEW_FUN_EXPORT PFNGLGETSHADERPRECISIONFORMATPROC __glewGetShaderPrecisionFormat; -GLEW_FUN_EXPORT PFNGLRELEASESHADERCOMPILERPROC __glewReleaseShaderCompiler; -GLEW_FUN_EXPORT PFNGLSHADERBINARYPROC __glewShaderBinary; - -GLEW_FUN_EXPORT PFNGLMEMORYBARRIERBYREGIONPROC __glewMemoryBarrierByRegion; - -GLEW_FUN_EXPORT PFNGLPRIMITIVEBOUNDINGBOXARBPROC __glewPrimitiveBoundingBoxARB; - -GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstancedBaseInstance; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance; - -GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLEARBPROC __glewGetImageHandleARB; -GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLEARBPROC __glewGetTextureHandleARB; -GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLEARBPROC __glewGetTextureSamplerHandleARB; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VARBPROC __glewGetVertexAttribLui64vARB; -GLEW_FUN_EXPORT PFNGLISIMAGEHANDLERESIDENTARBPROC __glewIsImageHandleResidentARB; -GLEW_FUN_EXPORT PFNGLISTEXTUREHANDLERESIDENTARBPROC __glewIsTextureHandleResidentARB; -GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC __glewMakeImageHandleNonResidentARB; -GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLERESIDENTARBPROC __glewMakeImageHandleResidentARB; -GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC __glewMakeTextureHandleNonResidentARB; -GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLERESIDENTARBPROC __glewMakeTextureHandleResidentARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC __glewProgramUniformHandleui64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC __glewProgramUniformHandleui64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64ARBPROC __glewUniformHandleui64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VARBPROC __glewUniformHandleui64vARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64ARBPROC __glewVertexAttribL1ui64ARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VARBPROC __glewVertexAttribL1ui64vARB; - -GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed; -GLEW_FUN_EXPORT PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex; - -GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEPROC __glewBufferStorage; -GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEEXTPROC __glewNamedBufferStorageEXT; - -GLEW_FUN_EXPORT PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB; - -GLEW_FUN_EXPORT PFNGLCLEARBUFFERDATAPROC __glewClearBufferData; -GLEW_FUN_EXPORT PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT; - -GLEW_FUN_EXPORT PFNGLCLEARTEXIMAGEPROC __glewClearTexImage; -GLEW_FUN_EXPORT PFNGLCLEARTEXSUBIMAGEPROC __glewClearTexSubImage; - -GLEW_FUN_EXPORT PFNGLCLIPCONTROLPROC __glewClipControl; - -GLEW_FUN_EXPORT PFNGLCLAMPCOLORARBPROC __glewClampColorARB; - -GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute; -GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect; - -GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC __glewDispatchComputeGroupSizeARB; - -GLEW_FUN_EXPORT PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData; - -GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData; - -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB; -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB; -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB; -GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB; - -GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPROC __glewBindTextureUnit; -GLEW_FUN_EXPORT PFNGLBLITNAMEDFRAMEBUFFERPROC __glewBlitNamedFramebuffer; -GLEW_FUN_EXPORT PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC __glewCheckNamedFramebufferStatus; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERDATAPROC __glewClearNamedBufferData; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERSUBDATAPROC __glewClearNamedBufferSubData; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERFIPROC __glewClearNamedFramebufferfi; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERFVPROC __glewClearNamedFramebufferfv; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERIVPROC __glewClearNamedFramebufferiv; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC __glewClearNamedFramebufferuiv; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC __glewCompressedTextureSubImage1D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC __glewCompressedTextureSubImage2D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC __glewCompressedTextureSubImage3D; -GLEW_FUN_EXPORT PFNGLCOPYNAMEDBUFFERSUBDATAPROC __glewCopyNamedBufferSubData; -GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DPROC __glewCopyTextureSubImage1D; -GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DPROC __glewCopyTextureSubImage2D; -GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DPROC __glewCopyTextureSubImage3D; -GLEW_FUN_EXPORT PFNGLCREATEBUFFERSPROC __glewCreateBuffers; -GLEW_FUN_EXPORT PFNGLCREATEFRAMEBUFFERSPROC __glewCreateFramebuffers; -GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPIPELINESPROC __glewCreateProgramPipelines; -GLEW_FUN_EXPORT PFNGLCREATEQUERIESPROC __glewCreateQueries; -GLEW_FUN_EXPORT PFNGLCREATERENDERBUFFERSPROC __glewCreateRenderbuffers; -GLEW_FUN_EXPORT PFNGLCREATESAMPLERSPROC __glewCreateSamplers; -GLEW_FUN_EXPORT PFNGLCREATETEXTURESPROC __glewCreateTextures; -GLEW_FUN_EXPORT PFNGLCREATETRANSFORMFEEDBACKSPROC __glewCreateTransformFeedbacks; -GLEW_FUN_EXPORT PFNGLCREATEVERTEXARRAYSPROC __glewCreateVertexArrays; -GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBPROC __glewDisableVertexArrayAttrib; -GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBPROC __glewEnableVertexArrayAttrib; -GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC __glewFlushMappedNamedBufferRange; -GLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPPROC __glewGenerateTextureMipmap; -GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC __glewGetCompressedTextureImage; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERI64VPROC __glewGetNamedBufferParameteri64v; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERIVPROC __glewGetNamedBufferParameteriv; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPOINTERVPROC __glewGetNamedBufferPointerv; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERSUBDATAPROC __glewGetNamedBufferSubData; -GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetNamedFramebufferAttachmentParameteriv; -GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC __glewGetNamedFramebufferParameteriv; -GLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC __glewGetNamedRenderbufferParameteriv; -GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTI64VPROC __glewGetQueryBufferObjecti64v; -GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTIVPROC __glewGetQueryBufferObjectiv; -GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTUI64VPROC __glewGetQueryBufferObjectui64v; -GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTUIVPROC __glewGetQueryBufferObjectuiv; -GLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEPROC __glewGetTextureImage; -GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVPROC __glewGetTextureLevelParameterfv; -GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVPROC __glewGetTextureLevelParameteriv; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVPROC __glewGetTextureParameterIiv; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVPROC __glewGetTextureParameterIuiv; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVPROC __glewGetTextureParameterfv; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVPROC __glewGetTextureParameteriv; -GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKI64_VPROC __glewGetTransformFeedbacki64_v; -GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKI_VPROC __glewGetTransformFeedbacki_v; -GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKIVPROC __glewGetTransformFeedbackiv; -GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINDEXED64IVPROC __glewGetVertexArrayIndexed64iv; -GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINDEXEDIVPROC __glewGetVertexArrayIndexediv; -GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYIVPROC __glewGetVertexArrayiv; -GLEW_FUN_EXPORT PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC __glewInvalidateNamedFramebufferData; -GLEW_FUN_EXPORT PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC __glewInvalidateNamedFramebufferSubData; -GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERPROC __glewMapNamedBuffer; -GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEPROC __glewMapNamedBufferRange; -GLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAPROC __glewNamedBufferData; -GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEPROC __glewNamedBufferStorage; -GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAPROC __glewNamedBufferSubData; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC __glewNamedFramebufferDrawBuffer; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC __glewNamedFramebufferDrawBuffers; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC __glewNamedFramebufferParameteri; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC __glewNamedFramebufferReadBuffer; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC __glewNamedFramebufferRenderbuffer; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREPROC __glewNamedFramebufferTexture; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC __glewNamedFramebufferTextureLayer; -GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEPROC __glewNamedRenderbufferStorage; -GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewNamedRenderbufferStorageMultisample; -GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERPROC __glewTextureBuffer; -GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERRANGEPROC __glewTextureBufferRange; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIIVPROC __glewTextureParameterIiv; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIUIVPROC __glewTextureParameterIuiv; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFPROC __glewTextureParameterf; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFVPROC __glewTextureParameterfv; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIPROC __glewTextureParameteri; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIVPROC __glewTextureParameteriv; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE1DPROC __glewTextureStorage1D; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DPROC __glewTextureStorage2D; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC __glewTextureStorage2DMultisample; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DPROC __glewTextureStorage3D; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC __glewTextureStorage3DMultisample; -GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DPROC __glewTextureSubImage1D; -GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DPROC __glewTextureSubImage2D; -GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DPROC __glewTextureSubImage3D; -GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC __glewTransformFeedbackBufferBase; -GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC __glewTransformFeedbackBufferRange; -GLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFERPROC __glewUnmapNamedBuffer; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBBINDINGPROC __glewVertexArrayAttribBinding; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBFORMATPROC __glewVertexArrayAttribFormat; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBIFORMATPROC __glewVertexArrayAttribIFormat; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBLFORMATPROC __glewVertexArrayAttribLFormat; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYBINDINGDIVISORPROC __glewVertexArrayBindingDivisor; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYELEMENTBUFFERPROC __glewVertexArrayElementBuffer; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBUFFERPROC __glewVertexArrayVertexBuffer; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBUFFERSPROC __glewVertexArrayVertexBuffers; - -GLEW_FUN_EXPORT PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB; - -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB; -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB; -GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB; -GLEW_FUN_EXPORT PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB; - -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex; -GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex; - -GLEW_FUN_EXPORT PFNGLDRAWARRAYSINDIRECTPROC __glewDrawArraysIndirect; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINDIRECTPROC __glewDrawElementsIndirect; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERPARAMETERIPROC __glewFramebufferParameteri; -GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVPROC __glewGetFramebufferParameteriv; -GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC __glewGetNamedFramebufferParameterivEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC __glewNamedFramebufferParameteriEXT; - -GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFERPROC __glewBindFramebuffer; -GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFERPROC __glewBindRenderbuffer; -GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERPROC __glewBlitFramebuffer; -GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus; -GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers; -GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer; -GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers; -GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers; -GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap; -GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetFramebufferAttachmentParameteriv; -GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVPROC __glewGetRenderbufferParameteriv; -GLEW_FUN_EXPORT PFNGLISFRAMEBUFFERPROC __glewIsFramebuffer; -GLEW_FUN_EXPORT PFNGLISRENDERBUFFERPROC __glewIsRenderbuffer; -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEPROC __glewRenderbufferStorage; -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewRenderbufferStorageMultisample; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREARBPROC __glewFramebufferTextureARB; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB; - -GLEW_FUN_EXPORT PFNGLGETPROGRAMBINARYPROC __glewGetProgramBinary; -GLEW_FUN_EXPORT PFNGLPROGRAMBINARYPROC __glewProgramBinary; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIPROC __glewProgramParameteri; - -GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC __glewGetCompressedTextureSubImage; -GLEW_FUN_EXPORT PFNGLGETTEXTURESUBIMAGEPROC __glewGetTextureSubImage; - -GLEW_FUN_EXPORT PFNGLGETUNIFORMDVPROC __glewGetUniformdv; -GLEW_FUN_EXPORT PFNGLUNIFORM1DPROC __glewUniform1d; -GLEW_FUN_EXPORT PFNGLUNIFORM1DVPROC __glewUniform1dv; -GLEW_FUN_EXPORT PFNGLUNIFORM2DPROC __glewUniform2d; -GLEW_FUN_EXPORT PFNGLUNIFORM2DVPROC __glewUniform2dv; -GLEW_FUN_EXPORT PFNGLUNIFORM3DPROC __glewUniform3d; -GLEW_FUN_EXPORT PFNGLUNIFORM3DVPROC __glewUniform3dv; -GLEW_FUN_EXPORT PFNGLUNIFORM4DPROC __glewUniform4d; -GLEW_FUN_EXPORT PFNGLUNIFORM4DVPROC __glewUniform4dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2DVPROC __glewUniformMatrix2dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3DVPROC __glewUniformMatrix2x3dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4DVPROC __glewUniformMatrix2x4dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3DVPROC __glewUniformMatrix3dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2DVPROC __glewUniformMatrix3x2dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4DVPROC __glewUniformMatrix3x4dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4DVPROC __glewUniformMatrix4dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2DVPROC __glewUniformMatrix4x2dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3DVPROC __glewUniformMatrix4x3dv; - -GLEW_FUN_EXPORT PFNGLGETUNIFORMI64VARBPROC __glewGetUniformi64vARB; -GLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VARBPROC __glewGetUniformui64vARB; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMI64VARBPROC __glewGetnUniformi64vARB; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMUI64VARBPROC __glewGetnUniformui64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64ARBPROC __glewProgramUniform1i64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64VARBPROC __glewProgramUniform1i64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64ARBPROC __glewProgramUniform1ui64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64VARBPROC __glewProgramUniform1ui64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64ARBPROC __glewProgramUniform2i64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64VARBPROC __glewProgramUniform2i64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64ARBPROC __glewProgramUniform2ui64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64VARBPROC __glewProgramUniform2ui64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64ARBPROC __glewProgramUniform3i64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64VARBPROC __glewProgramUniform3i64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64ARBPROC __glewProgramUniform3ui64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64VARBPROC __glewProgramUniform3ui64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64ARBPROC __glewProgramUniform4i64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64VARBPROC __glewProgramUniform4i64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64ARBPROC __glewProgramUniform4ui64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64VARBPROC __glewProgramUniform4ui64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1I64ARBPROC __glewUniform1i64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1I64VARBPROC __glewUniform1i64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1UI64ARBPROC __glewUniform1ui64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1UI64VARBPROC __glewUniform1ui64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2I64ARBPROC __glewUniform2i64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2I64VARBPROC __glewUniform2i64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2UI64ARBPROC __glewUniform2ui64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2UI64VARBPROC __glewUniform2ui64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3I64ARBPROC __glewUniform3i64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3I64VARBPROC __glewUniform3i64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3UI64ARBPROC __glewUniform3ui64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3UI64VARBPROC __glewUniform3ui64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4I64ARBPROC __glewUniform4i64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4I64VARBPROC __glewUniform4i64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4UI64ARBPROC __glewUniform4ui64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4UI64VARBPROC __glewUniform4ui64vARB; - -GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEPROC __glewColorSubTable; -GLEW_FUN_EXPORT PFNGLCOLORTABLEPROC __glewColorTable; -GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv; -GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv; -GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable; -GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable; -GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D; -GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPROC __glewGetColorTable; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv; -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPROC __glewGetHistogram; -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv; -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv; -GLEW_FUN_EXPORT PFNGLGETMINMAXPROC __glewGetMinmax; -GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv; -GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv; -GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter; -GLEW_FUN_EXPORT PFNGLHISTOGRAMPROC __glewHistogram; -GLEW_FUN_EXPORT PFNGLMINMAXPROC __glewMinmax; -GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMPROC __glewResetHistogram; -GLEW_FUN_EXPORT PFNGLRESETMINMAXPROC __glewResetMinmax; -GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D; - -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __glewMultiDrawArraysIndirectCountARB; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __glewMultiDrawElementsIndirectCountARB; - -GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB; - -GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATIVPROC __glewGetInternalformativ; - -GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATI64VPROC __glewGetInternalformati64v; - -GLEW_FUN_EXPORT PFNGLINVALIDATEBUFFERDATAPROC __glewInvalidateBufferData; -GLEW_FUN_EXPORT PFNGLINVALIDATEBUFFERSUBDATAPROC __glewInvalidateBufferSubData; -GLEW_FUN_EXPORT PFNGLINVALIDATEFRAMEBUFFERPROC __glewInvalidateFramebuffer; -GLEW_FUN_EXPORT PFNGLINVALIDATESUBFRAMEBUFFERPROC __glewInvalidateSubFramebuffer; -GLEW_FUN_EXPORT PFNGLINVALIDATETEXIMAGEPROC __glewInvalidateTexImage; -GLEW_FUN_EXPORT PFNGLINVALIDATETEXSUBIMAGEPROC __glewInvalidateTexSubImage; - -GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEPROC __glewFlushMappedBufferRange; -GLEW_FUN_EXPORT PFNGLMAPBUFFERRANGEPROC __glewMapBufferRange; - -GLEW_FUN_EXPORT PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB; -GLEW_FUN_EXPORT PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB; -GLEW_FUN_EXPORT PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB; -GLEW_FUN_EXPORT PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB; -GLEW_FUN_EXPORT PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB; - -GLEW_FUN_EXPORT PFNGLBINDBUFFERSBASEPROC __glewBindBuffersBase; -GLEW_FUN_EXPORT PFNGLBINDBUFFERSRANGEPROC __glewBindBuffersRange; -GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTURESPROC __glewBindImageTextures; -GLEW_FUN_EXPORT PFNGLBINDSAMPLERSPROC __glewBindSamplers; -GLEW_FUN_EXPORT PFNGLBINDTEXTURESPROC __glewBindTextures; -GLEW_FUN_EXPORT PFNGLBINDVERTEXBUFFERSPROC __glewBindVertexBuffers; - -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect; - -GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB; - -GLEW_FUN_EXPORT PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB; -GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB; - -GLEW_FUN_EXPORT PFNGLBEGINQUERYARBPROC __glewBeginQueryARB; -GLEW_FUN_EXPORT PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB; -GLEW_FUN_EXPORT PFNGLENDQUERYARBPROC __glewEndQueryARB; -GLEW_FUN_EXPORT PFNGLGENQUERIESARBPROC __glewGenQueriesARB; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB; -GLEW_FUN_EXPORT PFNGLGETQUERYIVARBPROC __glewGetQueryivARB; -GLEW_FUN_EXPORT PFNGLISQUERYARBPROC __glewIsQueryARB; - -GLEW_FUN_EXPORT PFNGLMAXSHADERCOMPILERTHREADSARBPROC __glewMaxShaderCompilerThreadsARB; - -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB; - -GLEW_FUN_EXPORT PFNGLGETPROGRAMINTERFACEIVPROC __glewGetProgramInterfaceiv; -GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEINDEXPROC __glewGetProgramResourceIndex; -GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONPROC __glewGetProgramResourceLocation; -GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC __glewGetProgramResourceLocationIndex; -GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCENAMEPROC __glewGetProgramResourceName; -GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEIVPROC __glewGetProgramResourceiv; - -GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex; - -GLEW_FUN_EXPORT PFNGLGETGRAPHICSRESETSTATUSARBPROC __glewGetGraphicsResetStatusARB; -GLEW_FUN_EXPORT PFNGLGETNCOLORTABLEARBPROC __glewGetnColorTableARB; -GLEW_FUN_EXPORT PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC __glewGetnCompressedTexImageARB; -GLEW_FUN_EXPORT PFNGLGETNCONVOLUTIONFILTERARBPROC __glewGetnConvolutionFilterARB; -GLEW_FUN_EXPORT PFNGLGETNHISTOGRAMARBPROC __glewGetnHistogramARB; -GLEW_FUN_EXPORT PFNGLGETNMAPDVARBPROC __glewGetnMapdvARB; -GLEW_FUN_EXPORT PFNGLGETNMAPFVARBPROC __glewGetnMapfvARB; -GLEW_FUN_EXPORT PFNGLGETNMAPIVARBPROC __glewGetnMapivARB; -GLEW_FUN_EXPORT PFNGLGETNMINMAXARBPROC __glewGetnMinmaxARB; -GLEW_FUN_EXPORT PFNGLGETNPIXELMAPFVARBPROC __glewGetnPixelMapfvARB; -GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUIVARBPROC __glewGetnPixelMapuivARB; -GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUSVARBPROC __glewGetnPixelMapusvARB; -GLEW_FUN_EXPORT PFNGLGETNPOLYGONSTIPPLEARBPROC __glewGetnPolygonStippleARB; -GLEW_FUN_EXPORT PFNGLGETNSEPARABLEFILTERARBPROC __glewGetnSeparableFilterARB; -GLEW_FUN_EXPORT PFNGLGETNTEXIMAGEARBPROC __glewGetnTexImageARB; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMDVARBPROC __glewGetnUniformdvARB; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVARBPROC __glewGetnUniformfvARB; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVARBPROC __glewGetnUniformivARB; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMUIVARBPROC __glewGetnUniformuivARB; -GLEW_FUN_EXPORT PFNGLREADNPIXELSARBPROC __glewReadnPixelsARB; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewFramebufferSampleLocationsfvARB; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewNamedFramebufferSampleLocationsfvARB; - -GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB; - -GLEW_FUN_EXPORT PFNGLBINDSAMPLERPROC __glewBindSampler; -GLEW_FUN_EXPORT PFNGLDELETESAMPLERSPROC __glewDeleteSamplers; -GLEW_FUN_EXPORT PFNGLGENSAMPLERSPROC __glewGenSamplers; -GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIIVPROC __glewGetSamplerParameterIiv; -GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIUIVPROC __glewGetSamplerParameterIuiv; -GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERFVPROC __glewGetSamplerParameterfv; -GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIVPROC __glewGetSamplerParameteriv; -GLEW_FUN_EXPORT PFNGLISSAMPLERPROC __glewIsSampler; -GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIIVPROC __glewSamplerParameterIiv; -GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIUIVPROC __glewSamplerParameterIuiv; -GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFPROC __glewSamplerParameterf; -GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFVPROC __glewSamplerParameterfv; -GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIPROC __glewSamplerParameteri; -GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIVPROC __glewSamplerParameteriv; - -GLEW_FUN_EXPORT PFNGLACTIVESHADERPROGRAMPROC __glewActiveShaderProgram; -GLEW_FUN_EXPORT PFNGLBINDPROGRAMPIPELINEPROC __glewBindProgramPipeline; -GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMVPROC __glewCreateShaderProgramv; -GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPIPELINESPROC __glewDeleteProgramPipelines; -GLEW_FUN_EXPORT PFNGLGENPROGRAMPIPELINESPROC __glewGenProgramPipelines; -GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEINFOLOGPROC __glewGetProgramPipelineInfoLog; -GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEIVPROC __glewGetProgramPipelineiv; -GLEW_FUN_EXPORT PFNGLISPROGRAMPIPELINEPROC __glewIsProgramPipeline; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DPROC __glewProgramUniform1d; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DVPROC __glewProgramUniform1dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FPROC __glewProgramUniform1f; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVPROC __glewProgramUniform1fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IPROC __glewProgramUniform1i; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVPROC __glewProgramUniform1iv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIPROC __glewProgramUniform1ui; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVPROC __glewProgramUniform1uiv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DPROC __glewProgramUniform2d; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DVPROC __glewProgramUniform2dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FPROC __glewProgramUniform2f; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVPROC __glewProgramUniform2fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IPROC __glewProgramUniform2i; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVPROC __glewProgramUniform2iv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIPROC __glewProgramUniform2ui; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVPROC __glewProgramUniform2uiv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DPROC __glewProgramUniform3d; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DVPROC __glewProgramUniform3dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FPROC __glewProgramUniform3f; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVPROC __glewProgramUniform3fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IPROC __glewProgramUniform3i; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVPROC __glewProgramUniform3iv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIPROC __glewProgramUniform3ui; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVPROC __glewProgramUniform3uiv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DPROC __glewProgramUniform4d; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DVPROC __glewProgramUniform4dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FPROC __glewProgramUniform4f; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVPROC __glewProgramUniform4fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IPROC __glewProgramUniform4i; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVPROC __glewProgramUniform4iv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIPROC __glewProgramUniform4ui; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVPROC __glewProgramUniform4uiv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2DVPROC __glewProgramUniformMatrix2dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVPROC __glewProgramUniformMatrix2fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC __glewProgramUniformMatrix2x3dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC __glewProgramUniformMatrix2x3fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC __glewProgramUniformMatrix2x4dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC __glewProgramUniformMatrix2x4fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3DVPROC __glewProgramUniformMatrix3dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVPROC __glewProgramUniformMatrix3fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC __glewProgramUniformMatrix3x2dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC __glewProgramUniformMatrix3x2fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC __glewProgramUniformMatrix3x4dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC __glewProgramUniformMatrix3x4fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4DVPROC __glewProgramUniformMatrix4dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVPROC __glewProgramUniformMatrix4fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC __glewProgramUniformMatrix4x2dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC __glewProgramUniformMatrix4x2fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC __glewProgramUniformMatrix4x3dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC __glewProgramUniformMatrix4x3fv; -GLEW_FUN_EXPORT PFNGLUSEPROGRAMSTAGESPROC __glewUseProgramStages; -GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPIPELINEPROC __glewValidateProgramPipeline; - -GLEW_FUN_EXPORT PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC __glewGetActiveAtomicCounterBufferiv; - -GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREPROC __glewBindImageTexture; -GLEW_FUN_EXPORT PFNGLMEMORYBARRIERPROC __glewMemoryBarrier; - -GLEW_FUN_EXPORT PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB; -GLEW_FUN_EXPORT PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB; -GLEW_FUN_EXPORT PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB; -GLEW_FUN_EXPORT PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB; -GLEW_FUN_EXPORT PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB; -GLEW_FUN_EXPORT PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB; -GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB; -GLEW_FUN_EXPORT PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB; -GLEW_FUN_EXPORT PFNGLGETHANDLEARBPROC __glewGetHandleARB; -GLEW_FUN_EXPORT PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB; -GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB; -GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB; -GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB; -GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB; -GLEW_FUN_EXPORT PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB; -GLEW_FUN_EXPORT PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB; -GLEW_FUN_EXPORT PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB; -GLEW_FUN_EXPORT PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1FARBPROC __glewUniform1fARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1IARBPROC __glewUniform1iARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2FARBPROC __glewUniform2fARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2IARBPROC __glewUniform2iARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3FARBPROC __glewUniform3fARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3IARBPROC __glewUniform3iARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4FARBPROC __glewUniform4fARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4IARBPROC __glewUniform4iARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB; -GLEW_FUN_EXPORT PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB; -GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB; - -GLEW_FUN_EXPORT PFNGLSHADERSTORAGEBLOCKBINDINGPROC __glewShaderStorageBlockBinding; - -GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINENAMEPROC __glewGetActiveSubroutineName; -GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __glewGetActiveSubroutineUniformName; -GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC __glewGetActiveSubroutineUniformiv; -GLEW_FUN_EXPORT PFNGLGETPROGRAMSTAGEIVPROC __glewGetProgramStageiv; -GLEW_FUN_EXPORT PFNGLGETSUBROUTINEINDEXPROC __glewGetSubroutineIndex; -GLEW_FUN_EXPORT PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC __glewGetSubroutineUniformLocation; -GLEW_FUN_EXPORT PFNGLGETUNIFORMSUBROUTINEUIVPROC __glewGetUniformSubroutineuiv; -GLEW_FUN_EXPORT PFNGLUNIFORMSUBROUTINESUIVPROC __glewUniformSubroutinesuiv; - -GLEW_FUN_EXPORT PFNGLCOMPILESHADERINCLUDEARBPROC __glewCompileShaderIncludeARB; -GLEW_FUN_EXPORT PFNGLDELETENAMEDSTRINGARBPROC __glewDeleteNamedStringARB; -GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGARBPROC __glewGetNamedStringARB; -GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB; -GLEW_FUN_EXPORT PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB; -GLEW_FUN_EXPORT PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB; - -GLEW_FUN_EXPORT PFNGLBUFFERPAGECOMMITMENTARBPROC __glewBufferPageCommitmentARB; - -GLEW_FUN_EXPORT PFNGLTEXPAGECOMMITMENTARBPROC __glewTexPageCommitmentARB; -GLEW_FUN_EXPORT PFNGLTEXTUREPAGECOMMITMENTEXTPROC __glewTexturePageCommitmentEXT; - -GLEW_FUN_EXPORT PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync; -GLEW_FUN_EXPORT PFNGLDELETESYNCPROC __glewDeleteSync; -GLEW_FUN_EXPORT PFNGLFENCESYNCPROC __glewFenceSync; -GLEW_FUN_EXPORT PFNGLGETINTEGER64VPROC __glewGetInteger64v; -GLEW_FUN_EXPORT PFNGLGETSYNCIVPROC __glewGetSynciv; -GLEW_FUN_EXPORT PFNGLISSYNCPROC __glewIsSync; -GLEW_FUN_EXPORT PFNGLWAITSYNCPROC __glewWaitSync; - -GLEW_FUN_EXPORT PFNGLPATCHPARAMETERFVPROC __glewPatchParameterfv; -GLEW_FUN_EXPORT PFNGLPATCHPARAMETERIPROC __glewPatchParameteri; - -GLEW_FUN_EXPORT PFNGLTEXTUREBARRIERPROC __glewTextureBarrier; - -GLEW_FUN_EXPORT PFNGLTEXBUFFERARBPROC __glewTexBufferARB; - -GLEW_FUN_EXPORT PFNGLTEXBUFFERRANGEPROC __glewTexBufferRange; -GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERRANGEEXTPROC __glewTextureBufferRangeEXT; - -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB; -GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB; - -GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv; -GLEW_FUN_EXPORT PFNGLSAMPLEMASKIPROC __glewSampleMaski; -GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample; -GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample; - -GLEW_FUN_EXPORT PFNGLTEXSTORAGE1DPROC __glewTexStorage1D; -GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DPROC __glewTexStorage2D; -GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DPROC __glewTexStorage3D; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE1DEXTPROC __glewTextureStorage1DEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DEXTPROC __glewTextureStorage2DEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DEXTPROC __glewTextureStorage3DEXT; - -GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DMULTISAMPLEPROC __glewTexStorage2DMultisample; -GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DMULTISAMPLEPROC __glewTexStorage3DMultisample; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC __glewTextureStorage2DMultisampleEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC __glewTextureStorage3DMultisampleEXT; - -GLEW_FUN_EXPORT PFNGLTEXTUREVIEWPROC __glewTextureView; - -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VPROC __glewGetQueryObjecti64v; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VPROC __glewGetQueryObjectui64v; -GLEW_FUN_EXPORT PFNGLQUERYCOUNTERPROC __glewQueryCounter; - -GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKPROC __glewBindTransformFeedback; -GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSPROC __glewDeleteTransformFeedbacks; -GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKPROC __glewDrawTransformFeedback; -GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSPROC __glewGenTransformFeedbacks; -GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKPROC __glewIsTransformFeedback; -GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKPROC __glewPauseTransformFeedback; -GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKPROC __glewResumeTransformFeedback; - -GLEW_FUN_EXPORT PFNGLBEGINQUERYINDEXEDPROC __glewBeginQueryIndexed; -GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC __glewDrawTransformFeedbackStream; -GLEW_FUN_EXPORT PFNGLENDQUERYINDEXEDPROC __glewEndQueryIndexed; -GLEW_FUN_EXPORT PFNGLGETQUERYINDEXEDIVPROC __glewGetQueryIndexediv; - -GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC __glewDrawTransformFeedbackInstanced; -GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC __glewDrawTransformFeedbackStreamInstanced; - -GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB; -GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB; -GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB; -GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB; - -GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEPROC __glewBindBufferBase; -GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange; -GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName; -GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv; -GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName; -GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv; -GLEW_FUN_EXPORT PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v; -GLEW_FUN_EXPORT PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex; -GLEW_FUN_EXPORT PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices; -GLEW_FUN_EXPORT PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding; - -GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray; -GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays; -GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays; -GLEW_FUN_EXPORT PFNGLISVERTEXARRAYPROC __glewIsVertexArray; - -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVPROC __glewGetVertexAttribLdv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DPROC __glewVertexAttribL1d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVPROC __glewVertexAttribL1dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DPROC __glewVertexAttribL2d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVPROC __glewVertexAttribL2dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DPROC __glewVertexAttribL3d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVPROC __glewVertexAttribL3dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DPROC __glewVertexAttribL4d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVPROC __glewVertexAttribL4dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTERPROC __glewVertexAttribLPointer; - -GLEW_FUN_EXPORT PFNGLBINDVERTEXBUFFERPROC __glewBindVertexBuffer; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC __glewVertexArrayBindVertexBufferEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC __glewVertexArrayVertexAttribBindingEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC __glewVertexArrayVertexAttribFormatEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC __glewVertexArrayVertexAttribIFormatEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC __glewVertexArrayVertexAttribLFormatEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC __glewVertexArrayVertexBindingDivisorEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBBINDINGPROC __glewVertexAttribBinding; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATPROC __glewVertexAttribFormat; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATPROC __glewVertexAttribIFormat; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATPROC __glewVertexAttribLFormat; -GLEW_FUN_EXPORT PFNGLVERTEXBINDINGDIVISORPROC __glewVertexBindingDivisor; - -GLEW_FUN_EXPORT PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB; -GLEW_FUN_EXPORT PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB; -GLEW_FUN_EXPORT PFNGLWEIGHTBVARBPROC __glewWeightbvARB; -GLEW_FUN_EXPORT PFNGLWEIGHTDVARBPROC __glewWeightdvARB; -GLEW_FUN_EXPORT PFNGLWEIGHTFVARBPROC __glewWeightfvARB; -GLEW_FUN_EXPORT PFNGLWEIGHTIVARBPROC __glewWeightivARB; -GLEW_FUN_EXPORT PFNGLWEIGHTSVARBPROC __glewWeightsvARB; -GLEW_FUN_EXPORT PFNGLWEIGHTUBVARBPROC __glewWeightubvARB; -GLEW_FUN_EXPORT PFNGLWEIGHTUIVARBPROC __glewWeightuivARB; -GLEW_FUN_EXPORT PFNGLWEIGHTUSVARBPROC __glewWeightusvARB; - -GLEW_FUN_EXPORT PFNGLBINDBUFFERARBPROC __glewBindBufferARB; -GLEW_FUN_EXPORT PFNGLBUFFERDATAARBPROC __glewBufferDataARB; -GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB; -GLEW_FUN_EXPORT PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB; -GLEW_FUN_EXPORT PFNGLGENBUFFERSARBPROC __glewGenBuffersARB; -GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB; -GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB; -GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB; -GLEW_FUN_EXPORT PFNGLISBUFFERARBPROC __glewIsBufferARB; -GLEW_FUN_EXPORT PFNGLMAPBUFFERARBPROC __glewMapBufferARB; -GLEW_FUN_EXPORT PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB; - -GLEW_FUN_EXPORT PFNGLBINDPROGRAMARBPROC __glewBindProgramARB; -GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB; -GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB; -GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB; -GLEW_FUN_EXPORT PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB; -GLEW_FUN_EXPORT PFNGLISPROGRAMARBPROC __glewIsProgramARB; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB; -GLEW_FUN_EXPORT PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB; - -GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB; -GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB; -GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB; - -GLEW_FUN_EXPORT PFNGLCOLORP3UIPROC __glewColorP3ui; -GLEW_FUN_EXPORT PFNGLCOLORP3UIVPROC __glewColorP3uiv; -GLEW_FUN_EXPORT PFNGLCOLORP4UIPROC __glewColorP4ui; -GLEW_FUN_EXPORT PFNGLCOLORP4UIVPROC __glewColorP4uiv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIPROC __glewMultiTexCoordP1ui; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIVPROC __glewMultiTexCoordP1uiv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIPROC __glewMultiTexCoordP2ui; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIVPROC __glewMultiTexCoordP2uiv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIPROC __glewMultiTexCoordP3ui; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIVPROC __glewMultiTexCoordP3uiv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIPROC __glewMultiTexCoordP4ui; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIVPROC __glewMultiTexCoordP4uiv; -GLEW_FUN_EXPORT PFNGLNORMALP3UIPROC __glewNormalP3ui; -GLEW_FUN_EXPORT PFNGLNORMALP3UIVPROC __glewNormalP3uiv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIPROC __glewSecondaryColorP3ui; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIVPROC __glewSecondaryColorP3uiv; -GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIPROC __glewTexCoordP1ui; -GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIVPROC __glewTexCoordP1uiv; -GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIPROC __glewTexCoordP2ui; -GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIVPROC __glewTexCoordP2uiv; -GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIPROC __glewTexCoordP3ui; -GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIVPROC __glewTexCoordP3uiv; -GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIPROC __glewTexCoordP4ui; -GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIVPROC __glewTexCoordP4uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIPROC __glewVertexAttribP1ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIVPROC __glewVertexAttribP1uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIPROC __glewVertexAttribP2ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIVPROC __glewVertexAttribP2uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIPROC __glewVertexAttribP3ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIVPROC __glewVertexAttribP3uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIPROC __glewVertexAttribP4ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIVPROC __glewVertexAttribP4uiv; -GLEW_FUN_EXPORT PFNGLVERTEXP2UIPROC __glewVertexP2ui; -GLEW_FUN_EXPORT PFNGLVERTEXP2UIVPROC __glewVertexP2uiv; -GLEW_FUN_EXPORT PFNGLVERTEXP3UIPROC __glewVertexP3ui; -GLEW_FUN_EXPORT PFNGLVERTEXP3UIVPROC __glewVertexP3uiv; -GLEW_FUN_EXPORT PFNGLVERTEXP4UIPROC __glewVertexP4ui; -GLEW_FUN_EXPORT PFNGLVERTEXP4UIVPROC __glewVertexP4uiv; - -GLEW_FUN_EXPORT PFNGLDEPTHRANGEARRAYVPROC __glewDepthRangeArrayv; -GLEW_FUN_EXPORT PFNGLDEPTHRANGEINDEXEDPROC __glewDepthRangeIndexed; -GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VPROC __glewGetDoublei_v; -GLEW_FUN_EXPORT PFNGLGETFLOATI_VPROC __glewGetFloati_v; -GLEW_FUN_EXPORT PFNGLSCISSORARRAYVPROC __glewScissorArrayv; -GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDPROC __glewScissorIndexed; -GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDVPROC __glewScissorIndexedv; -GLEW_FUN_EXPORT PFNGLVIEWPORTARRAYVPROC __glewViewportArrayv; -GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFPROC __glewViewportIndexedf; -GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFVPROC __glewViewportIndexedfv; - -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB; - -GLEW_FUN_EXPORT PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI; - -GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI; -GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI; -GLEW_FUN_EXPORT PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI; - -GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI; -GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI; -GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI; -GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI; - -GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI; -GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI; -GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI; -GLEW_FUN_EXPORT PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI; -GLEW_FUN_EXPORT PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI; -GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI; -GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI; -GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI; -GLEW_FUN_EXPORT PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI; -GLEW_FUN_EXPORT PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI; -GLEW_FUN_EXPORT PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI; -GLEW_FUN_EXPORT PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI; -GLEW_FUN_EXPORT PFNGLSAMPLEMAPATIPROC __glewSampleMapATI; -GLEW_FUN_EXPORT PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI; - -GLEW_FUN_EXPORT PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI; -GLEW_FUN_EXPORT PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI; - -GLEW_FUN_EXPORT PFNGLPNTRIANGLESFATIPROC __glewPNTrianglesfATI; -GLEW_FUN_EXPORT PFNGLPNTRIANGLESIATIPROC __glewPNTrianglesiATI; - -GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI; -GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI; - -GLEW_FUN_EXPORT PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI; -GLEW_FUN_EXPORT PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI; -GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI; -GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI; -GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI; -GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI; -GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI; -GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI; -GLEW_FUN_EXPORT PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI; -GLEW_FUN_EXPORT PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI; -GLEW_FUN_EXPORT PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI; -GLEW_FUN_EXPORT PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI; - -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI; - -GLEW_FUN_EXPORT PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI; -GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI; -GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1DATIPROC __glewVertexStream1dATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1DVATIPROC __glewVertexStream1dvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1FATIPROC __glewVertexStream1fATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1FVATIPROC __glewVertexStream1fvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1IATIPROC __glewVertexStream1iATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1IVATIPROC __glewVertexStream1ivATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1SATIPROC __glewVertexStream1sATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1SVATIPROC __glewVertexStream1svATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI; - -GLEW_FUN_EXPORT PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT; -GLEW_FUN_EXPORT PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT; -GLEW_FUN_EXPORT PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT; - -GLEW_FUN_EXPORT PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT; - -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT; - -GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT; - -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT; - -GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT; -GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT; - -GLEW_FUN_EXPORT PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT; -GLEW_FUN_EXPORT PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT; - -GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT; -GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT; -GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT; - -GLEW_FUN_EXPORT PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT; -GLEW_FUN_EXPORT PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT; - -GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT; - -GLEW_FUN_EXPORT PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT; -GLEW_FUN_EXPORT PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT; - -GLEW_FUN_EXPORT PFNGLGETOBJECTLABELEXTPROC __glewGetObjectLabelEXT; -GLEW_FUN_EXPORT PFNGLLABELOBJECTEXTPROC __glewLabelObjectEXT; - -GLEW_FUN_EXPORT PFNGLINSERTEVENTMARKEREXTPROC __glewInsertEventMarkerEXT; -GLEW_FUN_EXPORT PFNGLPOPGROUPMARKEREXTPROC __glewPopGroupMarkerEXT; -GLEW_FUN_EXPORT PFNGLPUSHGROUPMARKEREXTPROC __glewPushGroupMarkerEXT; - -GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT; - -GLEW_FUN_EXPORT PFNGLBINDMULTITEXTUREEXTPROC __glewBindMultiTextureEXT; -GLEW_FUN_EXPORT PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __glewCheckNamedFramebufferStatusEXT; -GLEW_FUN_EXPORT PFNGLCLIENTATTRIBDEFAULTEXTPROC __glewClientAttribDefaultEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __glewCompressedMultiTexImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __glewCompressedMultiTexImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __glewCompressedMultiTexImage3DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __glewCompressedMultiTexSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __glewCompressedMultiTexSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __glewCompressedMultiTexSubImage3DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __glewCompressedTextureImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __glewCompressedTextureImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __glewCompressedTextureImage3DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __glewCompressedTextureSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __glewCompressedTextureSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __glewCompressedTextureSubImage3DEXT; -GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE1DEXTPROC __glewCopyMultiTexImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE2DEXTPROC __glewCopyMultiTexImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC __glewCopyMultiTexSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC __glewCopyMultiTexSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC __glewCopyMultiTexSubImage3DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE1DEXTPROC __glewCopyTextureImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE2DEXTPROC __glewCopyTextureImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT; -GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT; -GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT; -GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT; -GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT; -GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT; -GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT; -GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT; -GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT; -GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT; -GLEW_FUN_EXPORT PFNGLGENERATEMULTITEXMIPMAPEXTPROC __glewGenerateMultiTexMipmapEXT; -GLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT; -GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT; -GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT; -GLEW_FUN_EXPORT PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT; -GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT; -GLEW_FUN_EXPORT PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT; -GLEW_FUN_EXPORT PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT; -GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXGENDVEXTPROC __glewGetMultiTexGendvEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXGENFVEXTPROC __glewGetMultiTexGenfvEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXGENIVEXTPROC __glewGetMultiTexGenivEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXIMAGEEXTPROC __glewGetMultiTexImageEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC __glewGetMultiTexLevelParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC __glewGetMultiTexLevelParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIIVEXTPROC __glewGetMultiTexParameterIivEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIUIVEXTPROC __glewGetMultiTexParameterIuivEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERFVEXTPROC __glewGetMultiTexParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIVEXTPROC __glewGetMultiTexParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC __glewGetNamedBufferParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPOINTERVEXTPROC __glewGetNamedBufferPointervEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERSUBDATAEXTPROC __glewGetNamedBufferSubDataEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetNamedFramebufferAttachmentParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __glewGetNamedProgramLocalParameterIivEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __glewGetNamedProgramLocalParameterIuivEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __glewGetNamedProgramLocalParameterdvEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __glewGetNamedProgramLocalParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT; -GLEW_FUN_EXPORT PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT; -GLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT; -GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT; -GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT; -GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT; -GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT; -GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT; -GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT; -GLEW_FUN_EXPORT PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT; -GLEW_FUN_EXPORT PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT; -GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT; -GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEFEXTPROC __glewMatrixLoadTransposefEXT; -GLEW_FUN_EXPORT PFNGLMATRIXLOADDEXTPROC __glewMatrixLoaddEXT; -GLEW_FUN_EXPORT PFNGLMATRIXLOADFEXTPROC __glewMatrixLoadfEXT; -GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEDEXTPROC __glewMatrixMultTransposedEXT; -GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEFEXTPROC __glewMatrixMultTransposefEXT; -GLEW_FUN_EXPORT PFNGLMATRIXMULTDEXTPROC __glewMatrixMultdEXT; -GLEW_FUN_EXPORT PFNGLMATRIXMULTFEXTPROC __glewMatrixMultfEXT; -GLEW_FUN_EXPORT PFNGLMATRIXORTHOEXTPROC __glewMatrixOrthoEXT; -GLEW_FUN_EXPORT PFNGLMATRIXPOPEXTPROC __glewMatrixPopEXT; -GLEW_FUN_EXPORT PFNGLMATRIXPUSHEXTPROC __glewMatrixPushEXT; -GLEW_FUN_EXPORT PFNGLMATRIXROTATEDEXTPROC __glewMatrixRotatedEXT; -GLEW_FUN_EXPORT PFNGLMATRIXROTATEFEXTPROC __glewMatrixRotatefEXT; -GLEW_FUN_EXPORT PFNGLMATRIXSCALEDEXTPROC __glewMatrixScaledEXT; -GLEW_FUN_EXPORT PFNGLMATRIXSCALEFEXTPROC __glewMatrixScalefEXT; -GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEDEXTPROC __glewMatrixTranslatedEXT; -GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEFEXTPROC __glewMatrixTranslatefEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXBUFFEREXTPROC __glewMultiTexBufferEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDPOINTEREXTPROC __glewMultiTexCoordPointerEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXENVFEXTPROC __glewMultiTexEnvfEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXENVFVEXTPROC __glewMultiTexEnvfvEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXENVIEXTPROC __glewMultiTexEnviEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXENVIVEXTPROC __glewMultiTexEnvivEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXGENDEXTPROC __glewMultiTexGendEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXGENDVEXTPROC __glewMultiTexGendvEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXGENFEXTPROC __glewMultiTexGenfEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXGENFVEXTPROC __glewMultiTexGenfvEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXGENIEXTPROC __glewMultiTexGeniEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXGENIVEXTPROC __glewMultiTexGenivEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE1DEXTPROC __glewMultiTexImage1DEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE2DEXTPROC __glewMultiTexImage2DEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE3DEXTPROC __glewMultiTexImage3DEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIIVEXTPROC __glewMultiTexParameterIivEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIUIVEXTPROC __glewMultiTexParameterIuivEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFEXTPROC __glewMultiTexParameterfEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFVEXTPROC __glewMultiTexParameterfvEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIEXTPROC __glewMultiTexParameteriEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIVEXTPROC __glewMultiTexParameterivEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXRENDERBUFFEREXTPROC __glewMultiTexRenderbufferEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE1DEXTPROC __glewMultiTexSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT; -GLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT; -GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT; -GLEW_FUN_EXPORT PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __glewNamedFramebufferTexture3DEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __glewNamedFramebufferTextureEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __glewNamedFramebufferTextureFaceEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __glewNamedFramebufferTextureLayerEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __glewNamedProgramLocalParameter4dEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __glewNamedProgramLocalParameter4dvEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __glewNamedProgramLocalParameter4fEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __glewNamedProgramLocalParameter4fvEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __glewNamedProgramLocalParameterI4iEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __glewNamedProgramLocalParameterI4ivEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __glewNamedProgramLocalParameterI4uiEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __glewNamedProgramLocalParameterI4uivEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __glewNamedProgramLocalParameters4fvEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __glewNamedProgramLocalParametersI4ivEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __glewNamedProgramLocalParametersI4uivEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT; -GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT; -GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT; -GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT; -GLEW_FUN_EXPORT PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE1DEXTPROC __glewTextureImage1DEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DEXTPROC __glewTextureImage2DEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DEXTPROC __glewTextureImage3DEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIIVEXTPROC __glewTextureParameterIivEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIUIVEXTPROC __glewTextureParameterIuivEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFEXTPROC __glewTextureParameterfEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFVEXTPROC __glewTextureParameterfvEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIEXTPROC __glewTextureParameteriEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIVEXTPROC __glewTextureParameterivEXT; -GLEW_FUN_EXPORT PFNGLTEXTURERENDERBUFFEREXTPROC __glewTextureRenderbufferEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT; -GLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC __glewVertexArrayVertexAttribDivisorEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT; - -GLEW_FUN_EXPORT PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT; -GLEW_FUN_EXPORT PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT; -GLEW_FUN_EXPORT PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT; -GLEW_FUN_EXPORT PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT; -GLEW_FUN_EXPORT PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT; -GLEW_FUN_EXPORT PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT; - -GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT; - -GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT; - -GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT; -GLEW_FUN_EXPORT PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT; -GLEW_FUN_EXPORT PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT; -GLEW_FUN_EXPORT PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT; -GLEW_FUN_EXPORT PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT; - -GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT; -GLEW_FUN_EXPORT PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT; - -GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT; - -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT; - -GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT; -GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT; -GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT; -GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT; -GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT; -GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT; -GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT; -GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT; -GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT; -GLEW_FUN_EXPORT PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT; -GLEW_FUN_EXPORT PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT; -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT; - -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT; - -GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT; -GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT; -GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT; - -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT; -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT; -GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT; -GLEW_FUN_EXPORT PFNGLHISTOGRAMEXTPROC __glewHistogramEXT; -GLEW_FUN_EXPORT PFNGLMINMAXEXTPROC __glewMinmaxEXT; -GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT; -GLEW_FUN_EXPORT PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT; - -GLEW_FUN_EXPORT PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT; - -GLEW_FUN_EXPORT PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT; - -GLEW_FUN_EXPORT PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT; -GLEW_FUN_EXPORT PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT; - -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT; - -GLEW_FUN_EXPORT PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT; -GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT; - -GLEW_FUN_EXPORT PFNGLCOLORTABLEEXTPROC __glewColorTableEXT; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT; - -GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT; - -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT; - -GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT; - -GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETCLAMPEXTPROC __glewPolygonOffsetClampEXT; - -GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT; - -GLEW_FUN_EXPORT PFNGLCOVERAGEMODULATIONNVPROC __glewCoverageModulationNV; -GLEW_FUN_EXPORT PFNGLCOVERAGEMODULATIONTABLENVPROC __glewCoverageModulationTableNV; -GLEW_FUN_EXPORT PFNGLGETCOVERAGEMODULATIONTABLENVPROC __glewGetCoverageModulationTableNV; -GLEW_FUN_EXPORT PFNGLRASTERSAMPLESEXTPROC __glewRasterSamplesEXT; - -GLEW_FUN_EXPORT PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT; -GLEW_FUN_EXPORT PFNGLENDSCENEEXTPROC __glewEndSceneEXT; - -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT; - -GLEW_FUN_EXPORT PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT; -GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT; -GLEW_FUN_EXPORT PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT; - -GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREEXTPROC __glewBindImageTextureEXT; -GLEW_FUN_EXPORT PFNGLMEMORYBARRIEREXTPROC __glewMemoryBarrierEXT; - -GLEW_FUN_EXPORT PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT; - -GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT; - -GLEW_FUN_EXPORT PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT; - -GLEW_FUN_EXPORT PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT; - -GLEW_FUN_EXPORT PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT; -GLEW_FUN_EXPORT PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT; -GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT; -GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT; -GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT; -GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT; - -GLEW_FUN_EXPORT PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT; -GLEW_FUN_EXPORT PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT; -GLEW_FUN_EXPORT PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT; -GLEW_FUN_EXPORT PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT; -GLEW_FUN_EXPORT PFNGLISTEXTUREEXTPROC __glewIsTextureEXT; -GLEW_FUN_EXPORT PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT; - -GLEW_FUN_EXPORT PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT; - -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT; - -GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKEXTPROC __glewBeginTransformFeedbackEXT; -GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEEXTPROC __glewBindBufferBaseEXT; -GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETEXTPROC __glewBindBufferOffsetEXT; -GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEEXTPROC __glewBindBufferRangeEXT; -GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKEXTPROC __glewEndTransformFeedbackEXT; -GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC __glewGetTransformFeedbackVaryingEXT; -GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC __glewTransformFeedbackVaryingsEXT; - -GLEW_FUN_EXPORT PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT; -GLEW_FUN_EXPORT PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT; -GLEW_FUN_EXPORT PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT; -GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT; -GLEW_FUN_EXPORT PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT; -GLEW_FUN_EXPORT PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT; -GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT; -GLEW_FUN_EXPORT PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT; - -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVEXTPROC __glewGetVertexAttribLdvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __glewVertexArrayVertexAttribLOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DEXTPROC __glewVertexAttribL1dEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVEXTPROC __glewVertexAttribL1dvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DEXTPROC __glewVertexAttribL2dEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVEXTPROC __glewVertexAttribL2dvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DEXTPROC __glewVertexAttribL3dEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVEXTPROC __glewVertexAttribL3dvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DEXTPROC __glewVertexAttribL4dEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVEXTPROC __glewVertexAttribL4dvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTEREXTPROC __glewVertexAttribLPointerEXT; - -GLEW_FUN_EXPORT PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT; -GLEW_FUN_EXPORT PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT; -GLEW_FUN_EXPORT PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT; -GLEW_FUN_EXPORT PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT; -GLEW_FUN_EXPORT PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT; -GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT; -GLEW_FUN_EXPORT PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT; -GLEW_FUN_EXPORT PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT; -GLEW_FUN_EXPORT PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT; -GLEW_FUN_EXPORT PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT; -GLEW_FUN_EXPORT PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT; -GLEW_FUN_EXPORT PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT; -GLEW_FUN_EXPORT PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT; -GLEW_FUN_EXPORT PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT; -GLEW_FUN_EXPORT PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT; -GLEW_FUN_EXPORT PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT; -GLEW_FUN_EXPORT PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT; -GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT; -GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT; -GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT; -GLEW_FUN_EXPORT PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT; -GLEW_FUN_EXPORT PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT; -GLEW_FUN_EXPORT PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT; -GLEW_FUN_EXPORT PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT; -GLEW_FUN_EXPORT PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT; -GLEW_FUN_EXPORT PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT; -GLEW_FUN_EXPORT PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT; -GLEW_FUN_EXPORT PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT; -GLEW_FUN_EXPORT PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT; -GLEW_FUN_EXPORT PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT; -GLEW_FUN_EXPORT PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT; -GLEW_FUN_EXPORT PFNGLSWIZZLEEXTPROC __glewSwizzleEXT; -GLEW_FUN_EXPORT PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT; -GLEW_FUN_EXPORT PFNGLVARIANTBVEXTPROC __glewVariantbvEXT; -GLEW_FUN_EXPORT PFNGLVARIANTDVEXTPROC __glewVariantdvEXT; -GLEW_FUN_EXPORT PFNGLVARIANTFVEXTPROC __glewVariantfvEXT; -GLEW_FUN_EXPORT PFNGLVARIANTIVEXTPROC __glewVariantivEXT; -GLEW_FUN_EXPORT PFNGLVARIANTSVEXTPROC __glewVariantsvEXT; -GLEW_FUN_EXPORT PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT; -GLEW_FUN_EXPORT PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT; -GLEW_FUN_EXPORT PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT; -GLEW_FUN_EXPORT PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT; - -GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT; -GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT; -GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT; - -GLEW_FUN_EXPORT PFNGLIMPORTSYNCEXTPROC __glewImportSyncEXT; - -GLEW_FUN_EXPORT PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY; - -GLEW_FUN_EXPORT PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY; - -GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP; -GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP; -GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP; -GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP; -GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP; -GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP; - -GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM; -GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM; - -GLEW_FUN_EXPORT PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM; -GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM; -GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM; -GLEW_FUN_EXPORT PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM; -GLEW_FUN_EXPORT PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM; -GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM; -GLEW_FUN_EXPORT PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM; - -GLEW_FUN_EXPORT PFNGLMAPTEXTURE2DINTELPROC __glewMapTexture2DINTEL; -GLEW_FUN_EXPORT PFNGLSYNCTEXTUREINTELPROC __glewSyncTextureINTEL; -GLEW_FUN_EXPORT PFNGLUNMAPTEXTURE2DINTELPROC __glewUnmapTexture2DINTEL; - -GLEW_FUN_EXPORT PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL; -GLEW_FUN_EXPORT PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL; -GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL; -GLEW_FUN_EXPORT PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL; - -GLEW_FUN_EXPORT PFNGLBEGINPERFQUERYINTELPROC __glewBeginPerfQueryINTEL; -GLEW_FUN_EXPORT PFNGLCREATEPERFQUERYINTELPROC __glewCreatePerfQueryINTEL; -GLEW_FUN_EXPORT PFNGLDELETEPERFQUERYINTELPROC __glewDeletePerfQueryINTEL; -GLEW_FUN_EXPORT PFNGLENDPERFQUERYINTELPROC __glewEndPerfQueryINTEL; -GLEW_FUN_EXPORT PFNGLGETFIRSTPERFQUERYIDINTELPROC __glewGetFirstPerfQueryIdINTEL; -GLEW_FUN_EXPORT PFNGLGETNEXTPERFQUERYIDINTELPROC __glewGetNextPerfQueryIdINTEL; -GLEW_FUN_EXPORT PFNGLGETPERFCOUNTERINFOINTELPROC __glewGetPerfCounterInfoINTEL; -GLEW_FUN_EXPORT PFNGLGETPERFQUERYDATAINTELPROC __glewGetPerfQueryDataINTEL; -GLEW_FUN_EXPORT PFNGLGETPERFQUERYIDBYNAMEINTELPROC __glewGetPerfQueryIdByNameINTEL; -GLEW_FUN_EXPORT PFNGLGETPERFQUERYINFOINTELPROC __glewGetPerfQueryInfoINTEL; - -GLEW_FUN_EXPORT PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL; -GLEW_FUN_EXPORT PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL; - -GLEW_FUN_EXPORT PFNGLBLENDBARRIERKHRPROC __glewBlendBarrierKHR; - -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKPROC __glewDebugMessageCallback; -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLPROC __glewDebugMessageControl; -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert; -GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog; -GLEW_FUN_EXPORT PFNGLGETOBJECTLABELPROC __glewGetObjectLabel; -GLEW_FUN_EXPORT PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel; -GLEW_FUN_EXPORT PFNGLOBJECTLABELPROC __glewObjectLabel; -GLEW_FUN_EXPORT PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel; -GLEW_FUN_EXPORT PFNGLPOPDEBUGGROUPPROC __glewPopDebugGroup; -GLEW_FUN_EXPORT PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup; - -GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVPROC __glewGetnUniformfv; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVPROC __glewGetnUniformiv; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMUIVPROC __glewGetnUniformuiv; -GLEW_FUN_EXPORT PFNGLREADNPIXELSPROC __glewReadnPixels; - -GLEW_FUN_EXPORT PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled; -GLEW_FUN_EXPORT PFNGLDELETEBUFFERREGIONPROC __glewDeleteBufferRegion; -GLEW_FUN_EXPORT PFNGLDRAWBUFFERREGIONPROC __glewDrawBufferRegion; -GLEW_FUN_EXPORT PFNGLNEWBUFFERREGIONPROC __glewNewBufferRegion; -GLEW_FUN_EXPORT PFNGLREADBUFFERREGIONPROC __glewReadBufferRegion; - -GLEW_FUN_EXPORT PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA; - -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA; - -GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVXPROC __glewBeginConditionalRenderNVX; -GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVXPROC __glewEndConditionalRenderNVX; - -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __glewMultiDrawArraysIndirectBindlessNV; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __glewMultiDrawElementsIndirectBindlessNV; - -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawArraysIndirectBindlessCountNV; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawElementsIndirectBindlessCountNV; - -GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV; -GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV; -GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV; -GLEW_FUN_EXPORT PFNGLISIMAGEHANDLERESIDENTNVPROC __glewIsImageHandleResidentNV; -GLEW_FUN_EXPORT PFNGLISTEXTUREHANDLERESIDENTNVPROC __glewIsTextureHandleResidentNV; -GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC __glewMakeImageHandleNonResidentNV; -GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLERESIDENTNVPROC __glewMakeImageHandleResidentNV; -GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC __glewMakeTextureHandleNonResidentNV; -GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLERESIDENTNVPROC __glewMakeTextureHandleResidentNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC __glewProgramUniformHandleui64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleui64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV; -GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV; - -GLEW_FUN_EXPORT PFNGLBLENDBARRIERNVPROC __glewBlendBarrierNV; -GLEW_FUN_EXPORT PFNGLBLENDPARAMETERINVPROC __glewBlendParameteriNV; - -GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV; -GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV; - -GLEW_FUN_EXPORT PFNGLSUBPIXELPRECISIONBIASNVPROC __glewSubpixelPrecisionBiasNV; - -GLEW_FUN_EXPORT PFNGLCONSERVATIVERASTERPARAMETERFNVPROC __glewConservativeRasterParameterfNV; - -GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV; - -GLEW_FUN_EXPORT PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV; -GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV; -GLEW_FUN_EXPORT PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV; - -GLEW_FUN_EXPORT PFNGLDRAWTEXTURENVPROC __glewDrawTextureNV; - -GLEW_FUN_EXPORT PFNGLEVALMAPSNVPROC __glewEvalMapsNV; -GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV; -GLEW_FUN_EXPORT PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV; -GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV; -GLEW_FUN_EXPORT PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV; -GLEW_FUN_EXPORT PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV; -GLEW_FUN_EXPORT PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV; - -GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVNVPROC __glewGetMultisamplefvNV; -GLEW_FUN_EXPORT PFNGLSAMPLEMASKINDEXEDNVPROC __glewSampleMaskIndexedNV; -GLEW_FUN_EXPORT PFNGLTEXRENDERBUFFERNVPROC __glewTexRenderbufferNV; - -GLEW_FUN_EXPORT PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV; -GLEW_FUN_EXPORT PFNGLFINISHFENCENVPROC __glewFinishFenceNV; -GLEW_FUN_EXPORT PFNGLGENFENCESNVPROC __glewGenFencesNV; -GLEW_FUN_EXPORT PFNGLGETFENCEIVNVPROC __glewGetFenceivNV; -GLEW_FUN_EXPORT PFNGLISFENCENVPROC __glewIsFenceNV; -GLEW_FUN_EXPORT PFNGLSETFENCENVPROC __glewSetFenceNV; -GLEW_FUN_EXPORT PFNGLTESTFENCENVPROC __glewTestFenceNV; - -GLEW_FUN_EXPORT PFNGLFRAGMENTCOVERAGECOLORNVPROC __glewFragmentCoverageColorNV; - -GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV; -GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV; -GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV; -GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV; -GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV; -GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV; - -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV; - -GLEW_FUN_EXPORT PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV; - -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV; - -GLEW_FUN_EXPORT PFNGLGETUNIFORMI64VNVPROC __glewGetUniformi64vNV; -GLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64NVPROC __glewProgramUniform1i64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64VNVPROC __glewProgramUniform1i64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64NVPROC __glewProgramUniform1ui64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64VNVPROC __glewProgramUniform1ui64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64NVPROC __glewProgramUniform2i64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64VNVPROC __glewProgramUniform2i64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64NVPROC __glewProgramUniform2ui64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64VNVPROC __glewProgramUniform2ui64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64NVPROC __glewProgramUniform3i64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64VNVPROC __glewProgramUniform3i64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64NVPROC __glewProgramUniform3ui64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64VNVPROC __glewProgramUniform3ui64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64NVPROC __glewProgramUniform4i64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64VNVPROC __glewProgramUniform4i64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64NVPROC __glewProgramUniform4ui64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64VNVPROC __glewProgramUniform4ui64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM1I64NVPROC __glewUniform1i64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM1I64VNVPROC __glewUniform1i64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM1UI64NVPROC __glewUniform1ui64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM1UI64VNVPROC __glewUniform1ui64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM2I64NVPROC __glewUniform2i64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM2I64VNVPROC __glewUniform2i64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM2UI64NVPROC __glewUniform2ui64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM2UI64VNVPROC __glewUniform2ui64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM3I64NVPROC __glewUniform3i64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM3I64VNVPROC __glewUniform3i64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM3UI64NVPROC __glewUniform3ui64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM3UI64VNVPROC __glewUniform3ui64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM4I64NVPROC __glewUniform4i64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM4I64VNVPROC __glewUniform4i64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM4UI64NVPROC __glewUniform4ui64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM4UI64VNVPROC __glewUniform4ui64vNV; - -GLEW_FUN_EXPORT PFNGLCOLOR3HNVPROC __glewColor3hNV; -GLEW_FUN_EXPORT PFNGLCOLOR3HVNVPROC __glewColor3hvNV; -GLEW_FUN_EXPORT PFNGLCOLOR4HNVPROC __glewColor4hNV; -GLEW_FUN_EXPORT PFNGLCOLOR4HVNVPROC __glewColor4hvNV; -GLEW_FUN_EXPORT PFNGLFOGCOORDHNVPROC __glewFogCoordhNV; -GLEW_FUN_EXPORT PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV; -GLEW_FUN_EXPORT PFNGLNORMAL3HNVPROC __glewNormal3hNV; -GLEW_FUN_EXPORT PFNGLNORMAL3HVNVPROC __glewNormal3hvNV; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV; -GLEW_FUN_EXPORT PFNGLVERTEX2HNVPROC __glewVertex2hNV; -GLEW_FUN_EXPORT PFNGLVERTEX2HVNVPROC __glewVertex2hvNV; -GLEW_FUN_EXPORT PFNGLVERTEX3HNVPROC __glewVertex3hNV; -GLEW_FUN_EXPORT PFNGLVERTEX3HVNVPROC __glewVertex3hvNV; -GLEW_FUN_EXPORT PFNGLVERTEX4HNVPROC __glewVertex4hNV; -GLEW_FUN_EXPORT PFNGLVERTEX4HVNVPROC __glewVertex4hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV; -GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV; - -GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATSAMPLEIVNVPROC __glewGetInternalformatSampleivNV; - -GLEW_FUN_EXPORT PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV; -GLEW_FUN_EXPORT PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV; -GLEW_FUN_EXPORT PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV; -GLEW_FUN_EXPORT PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV; -GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV; -GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV; -GLEW_FUN_EXPORT PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV; - -GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV; - -GLEW_FUN_EXPORT PFNGLCOPYPATHNVPROC __glewCopyPathNV; -GLEW_FUN_EXPORT PFNGLCOVERFILLPATHINSTANCEDNVPROC __glewCoverFillPathInstancedNV; -GLEW_FUN_EXPORT PFNGLCOVERFILLPATHNVPROC __glewCoverFillPathNV; -GLEW_FUN_EXPORT PFNGLCOVERSTROKEPATHINSTANCEDNVPROC __glewCoverStrokePathInstancedNV; -GLEW_FUN_EXPORT PFNGLCOVERSTROKEPATHNVPROC __glewCoverStrokePathNV; -GLEW_FUN_EXPORT PFNGLDELETEPATHSNVPROC __glewDeletePathsNV; -GLEW_FUN_EXPORT PFNGLGENPATHSNVPROC __glewGenPathsNV; -GLEW_FUN_EXPORT PFNGLGETPATHCOLORGENFVNVPROC __glewGetPathColorGenfvNV; -GLEW_FUN_EXPORT PFNGLGETPATHCOLORGENIVNVPROC __glewGetPathColorGenivNV; -GLEW_FUN_EXPORT PFNGLGETPATHCOMMANDSNVPROC __glewGetPathCommandsNV; -GLEW_FUN_EXPORT PFNGLGETPATHCOORDSNVPROC __glewGetPathCoordsNV; -GLEW_FUN_EXPORT PFNGLGETPATHDASHARRAYNVPROC __glewGetPathDashArrayNV; -GLEW_FUN_EXPORT PFNGLGETPATHLENGTHNVPROC __glewGetPathLengthNV; -GLEW_FUN_EXPORT PFNGLGETPATHMETRICRANGENVPROC __glewGetPathMetricRangeNV; -GLEW_FUN_EXPORT PFNGLGETPATHMETRICSNVPROC __glewGetPathMetricsNV; -GLEW_FUN_EXPORT PFNGLGETPATHPARAMETERFVNVPROC __glewGetPathParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETPATHPARAMETERIVNVPROC __glewGetPathParameterivNV; -GLEW_FUN_EXPORT PFNGLGETPATHSPACINGNVPROC __glewGetPathSpacingNV; -GLEW_FUN_EXPORT PFNGLGETPATHTEXGENFVNVPROC __glewGetPathTexGenfvNV; -GLEW_FUN_EXPORT PFNGLGETPATHTEXGENIVNVPROC __glewGetPathTexGenivNV; -GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEFVNVPROC __glewGetProgramResourcefvNV; -GLEW_FUN_EXPORT PFNGLINTERPOLATEPATHSNVPROC __glewInterpolatePathsNV; -GLEW_FUN_EXPORT PFNGLISPATHNVPROC __glewIsPathNV; -GLEW_FUN_EXPORT PFNGLISPOINTINFILLPATHNVPROC __glewIsPointInFillPathNV; -GLEW_FUN_EXPORT PFNGLISPOINTINSTROKEPATHNVPROC __glewIsPointInStrokePathNV; -GLEW_FUN_EXPORT PFNGLMATRIXLOAD3X2FNVPROC __glewMatrixLoad3x2fNV; -GLEW_FUN_EXPORT PFNGLMATRIXLOAD3X3FNVPROC __glewMatrixLoad3x3fNV; -GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC __glewMatrixLoadTranspose3x3fNV; -GLEW_FUN_EXPORT PFNGLMATRIXMULT3X2FNVPROC __glewMatrixMult3x2fNV; -GLEW_FUN_EXPORT PFNGLMATRIXMULT3X3FNVPROC __glewMatrixMult3x3fNV; -GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC __glewMatrixMultTranspose3x3fNV; -GLEW_FUN_EXPORT PFNGLPATHCOLORGENNVPROC __glewPathColorGenNV; -GLEW_FUN_EXPORT PFNGLPATHCOMMANDSNVPROC __glewPathCommandsNV; -GLEW_FUN_EXPORT PFNGLPATHCOORDSNVPROC __glewPathCoordsNV; -GLEW_FUN_EXPORT PFNGLPATHCOVERDEPTHFUNCNVPROC __glewPathCoverDepthFuncNV; -GLEW_FUN_EXPORT PFNGLPATHDASHARRAYNVPROC __glewPathDashArrayNV; -GLEW_FUN_EXPORT PFNGLPATHFOGGENNVPROC __glewPathFogGenNV; -GLEW_FUN_EXPORT PFNGLPATHGLYPHINDEXARRAYNVPROC __glewPathGlyphIndexArrayNV; -GLEW_FUN_EXPORT PFNGLPATHGLYPHINDEXRANGENVPROC __glewPathGlyphIndexRangeNV; -GLEW_FUN_EXPORT PFNGLPATHGLYPHRANGENVPROC __glewPathGlyphRangeNV; -GLEW_FUN_EXPORT PFNGLPATHGLYPHSNVPROC __glewPathGlyphsNV; -GLEW_FUN_EXPORT PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC __glewPathMemoryGlyphIndexArrayNV; -GLEW_FUN_EXPORT PFNGLPATHPARAMETERFNVPROC __glewPathParameterfNV; -GLEW_FUN_EXPORT PFNGLPATHPARAMETERFVNVPROC __glewPathParameterfvNV; -GLEW_FUN_EXPORT PFNGLPATHPARAMETERINVPROC __glewPathParameteriNV; -GLEW_FUN_EXPORT PFNGLPATHPARAMETERIVNVPROC __glewPathParameterivNV; -GLEW_FUN_EXPORT PFNGLPATHSTENCILDEPTHOFFSETNVPROC __glewPathStencilDepthOffsetNV; -GLEW_FUN_EXPORT PFNGLPATHSTENCILFUNCNVPROC __glewPathStencilFuncNV; -GLEW_FUN_EXPORT PFNGLPATHSTRINGNVPROC __glewPathStringNV; -GLEW_FUN_EXPORT PFNGLPATHSUBCOMMANDSNVPROC __glewPathSubCommandsNV; -GLEW_FUN_EXPORT PFNGLPATHSUBCOORDSNVPROC __glewPathSubCoordsNV; -GLEW_FUN_EXPORT PFNGLPATHTEXGENNVPROC __glewPathTexGenNV; -GLEW_FUN_EXPORT PFNGLPOINTALONGPATHNVPROC __glewPointAlongPathNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC __glewProgramPathFragmentInputGenNV; -GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHINSTANCEDNVPROC __glewStencilFillPathInstancedNV; -GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHNVPROC __glewStencilFillPathNV; -GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC __glewStencilStrokePathInstancedNV; -GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHNVPROC __glewStencilStrokePathNV; -GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC __glewStencilThenCoverFillPathInstancedNV; -GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERFILLPATHNVPROC __glewStencilThenCoverFillPathNV; -GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC __glewStencilThenCoverStrokePathInstancedNV; -GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC __glewStencilThenCoverStrokePathNV; -GLEW_FUN_EXPORT PFNGLTRANSFORMPATHNVPROC __glewTransformPathNV; -GLEW_FUN_EXPORT PFNGLWEIGHTPATHSNVPROC __glewWeightPathsNV; - -GLEW_FUN_EXPORT PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV; -GLEW_FUN_EXPORT PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV; - -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV; - -GLEW_FUN_EXPORT PFNGLGETVIDEOI64VNVPROC __glewGetVideoi64vNV; -GLEW_FUN_EXPORT PFNGLGETVIDEOIVNVPROC __glewGetVideoivNV; -GLEW_FUN_EXPORT PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV; -GLEW_FUN_EXPORT PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV; -GLEW_FUN_EXPORT PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV; -GLEW_FUN_EXPORT PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV; - -GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV; -GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV; - -GLEW_FUN_EXPORT PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV; -GLEW_FUN_EXPORT PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV; -GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV; -GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV; -GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV; -GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV; -GLEW_FUN_EXPORT PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV; -GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV; -GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV; -GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV; - -GLEW_FUN_EXPORT PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewFramebufferSampleLocationsfvNV; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewNamedFramebufferSampleLocationsfvNV; - -GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV; -GLEW_FUN_EXPORT PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV; -GLEW_FUN_EXPORT PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV; -GLEW_FUN_EXPORT PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV; -GLEW_FUN_EXPORT PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV; -GLEW_FUN_EXPORT PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV; -GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV; -GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORMUI64NVPROC __glewUniformui64NV; -GLEW_FUN_EXPORT PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV; - -GLEW_FUN_EXPORT PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV; - -GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTexImage2DMultisampleCoverageNV; -GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTexImage3DMultisampleCoverageNV; -GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTextureImage2DMultisampleCoverageNV; -GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC __glewTextureImage2DMultisampleNV; -GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTextureImage3DMultisampleCoverageNV; -GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC __glewTextureImage3DMultisampleNV; - -GLEW_FUN_EXPORT PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV; -GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV; -GLEW_FUN_EXPORT PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV; -GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV; -GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV; -GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV; -GLEW_FUN_EXPORT PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV; -GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV; -GLEW_FUN_EXPORT PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV; -GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV; -GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV; - -GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV; -GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV; -GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV; -GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV; -GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV; -GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV; -GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV; - -GLEW_FUN_EXPORT PFNGLVDPAUFININVPROC __glewVDPAUFiniNV; -GLEW_FUN_EXPORT PFNGLVDPAUGETSURFACEIVNVPROC __glewVDPAUGetSurfaceivNV; -GLEW_FUN_EXPORT PFNGLVDPAUINITNVPROC __glewVDPAUInitNV; -GLEW_FUN_EXPORT PFNGLVDPAUISSURFACENVPROC __glewVDPAUIsSurfaceNV; -GLEW_FUN_EXPORT PFNGLVDPAUMAPSURFACESNVPROC __glewVDPAUMapSurfacesNV; -GLEW_FUN_EXPORT PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC __glewVDPAURegisterOutputSurfaceNV; -GLEW_FUN_EXPORT PFNGLVDPAUREGISTERVIDEOSURFACENVPROC __glewVDPAURegisterVideoSurfaceNV; -GLEW_FUN_EXPORT PFNGLVDPAUSURFACEACCESSNVPROC __glewVDPAUSurfaceAccessNV; -GLEW_FUN_EXPORT PFNGLVDPAUUNMAPSURFACESNVPROC __glewVDPAUUnmapSurfacesNV; -GLEW_FUN_EXPORT PFNGLVDPAUUNREGISTERSURFACENVPROC __glewVDPAUUnregisterSurfaceNV; - -GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV; - -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLI64VNVPROC __glewGetVertexAttribLi64vNV; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VNVPROC __glewGetVertexAttribLui64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64NVPROC __glewVertexAttribL1i64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64VNVPROC __glewVertexAttribL1i64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64NVPROC __glewVertexAttribL1ui64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VNVPROC __glewVertexAttribL1ui64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64NVPROC __glewVertexAttribL2i64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64VNVPROC __glewVertexAttribL2i64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64NVPROC __glewVertexAttribL2ui64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64VNVPROC __glewVertexAttribL2ui64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64NVPROC __glewVertexAttribL3i64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64VNVPROC __glewVertexAttribL3i64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64NVPROC __glewVertexAttribL3ui64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64VNVPROC __glewVertexAttribL3ui64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64NVPROC __glewVertexAttribL4i64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64VNVPROC __glewVertexAttribL4i64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64NVPROC __glewVertexAttribL4ui64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64VNVPROC __glewVertexAttribL4ui64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATNVPROC __glewVertexAttribLFormatNV; - -GLEW_FUN_EXPORT PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV; -GLEW_FUN_EXPORT PFNGLCOLORFORMATNVPROC __glewColorFormatNV; -GLEW_FUN_EXPORT PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV; -GLEW_FUN_EXPORT PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV; -GLEW_FUN_EXPORT PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV; -GLEW_FUN_EXPORT PFNGLINDEXFORMATNVPROC __glewIndexFormatNV; -GLEW_FUN_EXPORT PFNGLNORMALFORMATNVPROC __glewNormalFormatNV; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV; -GLEW_FUN_EXPORT PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV; -GLEW_FUN_EXPORT PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV; - -GLEW_FUN_EXPORT PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV; -GLEW_FUN_EXPORT PFNGLBINDPROGRAMNVPROC __glewBindProgramNV; -GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV; -GLEW_FUN_EXPORT PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV; -GLEW_FUN_EXPORT PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV; -GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV; -GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV; -GLEW_FUN_EXPORT PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV; -GLEW_FUN_EXPORT PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV; -GLEW_FUN_EXPORT PFNGLISPROGRAMNVPROC __glewIsProgramNV; -GLEW_FUN_EXPORT PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV; -GLEW_FUN_EXPORT PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV; -GLEW_FUN_EXPORT PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV; - -GLEW_FUN_EXPORT PFNGLBEGINVIDEOCAPTURENVPROC __glewBeginVideoCaptureNV; -GLEW_FUN_EXPORT PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC __glewBindVideoCaptureStreamBufferNV; -GLEW_FUN_EXPORT PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC __glewBindVideoCaptureStreamTextureNV; -GLEW_FUN_EXPORT PFNGLENDVIDEOCAPTURENVPROC __glewEndVideoCaptureNV; -GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMDVNVPROC __glewGetVideoCaptureStreamdvNV; -GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMFVNVPROC __glewGetVideoCaptureStreamfvNV; -GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMIVNVPROC __glewGetVideoCaptureStreamivNV; -GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTUREIVNVPROC __glewGetVideoCaptureivNV; -GLEW_FUN_EXPORT PFNGLVIDEOCAPTURENVPROC __glewVideoCaptureNV; -GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC __glewVideoCaptureStreamParameterdvNV; -GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC __glewVideoCaptureStreamParameterfvNV; -GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC __glewVideoCaptureStreamParameterivNV; - -GLEW_FUN_EXPORT PFNGLCLEARDEPTHFOESPROC __glewClearDepthfOES; -GLEW_FUN_EXPORT PFNGLCLIPPLANEFOESPROC __glewClipPlanefOES; -GLEW_FUN_EXPORT PFNGLDEPTHRANGEFOESPROC __glewDepthRangefOES; -GLEW_FUN_EXPORT PFNGLFRUSTUMFOESPROC __glewFrustumfOES; -GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES; -GLEW_FUN_EXPORT PFNGLORTHOFOESPROC __glewOrthofOES; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __glewFramebufferTextureMultiviewOVR; - -GLEW_FUN_EXPORT PFNGLALPHAFUNCXPROC __glewAlphaFuncx; -GLEW_FUN_EXPORT PFNGLCLEARCOLORXPROC __glewClearColorx; -GLEW_FUN_EXPORT PFNGLCLEARDEPTHXPROC __glewClearDepthx; -GLEW_FUN_EXPORT PFNGLCOLOR4XPROC __glewColor4x; -GLEW_FUN_EXPORT PFNGLDEPTHRANGEXPROC __glewDepthRangex; -GLEW_FUN_EXPORT PFNGLFOGXPROC __glewFogx; -GLEW_FUN_EXPORT PFNGLFOGXVPROC __glewFogxv; -GLEW_FUN_EXPORT PFNGLFRUSTUMFPROC __glewFrustumf; -GLEW_FUN_EXPORT PFNGLFRUSTUMXPROC __glewFrustumx; -GLEW_FUN_EXPORT PFNGLLIGHTMODELXPROC __glewLightModelx; -GLEW_FUN_EXPORT PFNGLLIGHTMODELXVPROC __glewLightModelxv; -GLEW_FUN_EXPORT PFNGLLIGHTXPROC __glewLightx; -GLEW_FUN_EXPORT PFNGLLIGHTXVPROC __glewLightxv; -GLEW_FUN_EXPORT PFNGLLINEWIDTHXPROC __glewLineWidthx; -GLEW_FUN_EXPORT PFNGLLOADMATRIXXPROC __glewLoadMatrixx; -GLEW_FUN_EXPORT PFNGLMATERIALXPROC __glewMaterialx; -GLEW_FUN_EXPORT PFNGLMATERIALXVPROC __glewMaterialxv; -GLEW_FUN_EXPORT PFNGLMULTMATRIXXPROC __glewMultMatrixx; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4XPROC __glewMultiTexCoord4x; -GLEW_FUN_EXPORT PFNGLNORMAL3XPROC __glewNormal3x; -GLEW_FUN_EXPORT PFNGLORTHOFPROC __glewOrthof; -GLEW_FUN_EXPORT PFNGLORTHOXPROC __glewOrthox; -GLEW_FUN_EXPORT PFNGLPOINTSIZEXPROC __glewPointSizex; -GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETXPROC __glewPolygonOffsetx; -GLEW_FUN_EXPORT PFNGLROTATEXPROC __glewRotatex; -GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEXPROC __glewSampleCoveragex; -GLEW_FUN_EXPORT PFNGLSCALEXPROC __glewScalex; -GLEW_FUN_EXPORT PFNGLTEXENVXPROC __glewTexEnvx; -GLEW_FUN_EXPORT PFNGLTEXENVXVPROC __glewTexEnvxv; -GLEW_FUN_EXPORT PFNGLTEXPARAMETERXPROC __glewTexParameterx; -GLEW_FUN_EXPORT PFNGLTRANSLATEXPROC __glewTranslatex; - -GLEW_FUN_EXPORT PFNGLCLIPPLANEFPROC __glewClipPlanef; -GLEW_FUN_EXPORT PFNGLCLIPPLANEXPROC __glewClipPlanex; -GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFPROC __glewGetClipPlanef; -GLEW_FUN_EXPORT PFNGLGETCLIPPLANEXPROC __glewGetClipPlanex; -GLEW_FUN_EXPORT PFNGLGETFIXEDVPROC __glewGetFixedv; -GLEW_FUN_EXPORT PFNGLGETLIGHTXVPROC __glewGetLightxv; -GLEW_FUN_EXPORT PFNGLGETMATERIALXVPROC __glewGetMaterialxv; -GLEW_FUN_EXPORT PFNGLGETTEXENVXVPROC __glewGetTexEnvxv; -GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERXVPROC __glewGetTexParameterxv; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXPROC __glewPointParameterx; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXVPROC __glewPointParameterxv; -GLEW_FUN_EXPORT PFNGLPOINTSIZEPOINTEROESPROC __glewPointSizePointerOES; -GLEW_FUN_EXPORT PFNGLTEXPARAMETERXVPROC __glewTexParameterxv; - -GLEW_FUN_EXPORT PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL; - -GLEW_FUN_EXPORT PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL; -GLEW_FUN_EXPORT PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL; - -GLEW_FUN_EXPORT PFNGLLOGMESSAGECALLBACKREGALPROC __glewLogMessageCallbackREGAL; - -GLEW_FUN_EXPORT PFNGLGETPROCADDRESSREGALPROC __glewGetProcAddressREGAL; - -GLEW_FUN_EXPORT PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS; -GLEW_FUN_EXPORT PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS; - -GLEW_FUN_EXPORT PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS; -GLEW_FUN_EXPORT PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS; - -GLEW_FUN_EXPORT PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS; -GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS; - -GLEW_FUN_EXPORT PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS; -GLEW_FUN_EXPORT PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS; - -GLEW_FUN_EXPORT PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS; -GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS; - -GLEW_FUN_EXPORT PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS; -GLEW_FUN_EXPORT PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS; - -GLEW_FUN_EXPORT PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX; -GLEW_FUN_EXPORT PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX; -GLEW_FUN_EXPORT PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX; -GLEW_FUN_EXPORT PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX; -GLEW_FUN_EXPORT PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX; -GLEW_FUN_EXPORT PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX; - -GLEW_FUN_EXPORT PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX; - -GLEW_FUN_EXPORT PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX; - -GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX; - -GLEW_FUN_EXPORT PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX; - -GLEW_FUN_EXPORT PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX; - -GLEW_FUN_EXPORT PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX; - -GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX; -GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX; -GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX; -GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX; - -GLEW_FUN_EXPORT PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX; - -GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI; -GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI; -GLEW_FUN_EXPORT PFNGLCOLORTABLESGIPROC __glewColorTableSGI; -GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI; - -GLEW_FUN_EXPORT PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX; - -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN; - -GLEW_FUN_EXPORT PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN; - -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN; - -GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN; - -GLEW_FUN_EXPORT PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN; - -#if defined(GLEW_MX) && !defined(_WIN32) -struct GLEWContextStruct -{ -#endif /* GLEW_MX */ - -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_1; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2_1; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_3; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_4; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_5; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_0; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_1; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_0; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_1; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_2; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_3; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_0; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_1; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_2; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_3; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_4; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_5; -GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_tbuffer; -GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_texture_compression_FXT1; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_blend_minmax_factor; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_conservative_depth; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_debug_output; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_depth_clamp_separate; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_draw_buffers_blend; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gcn_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_int64; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_interleaved_elements; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_multi_draw_indirect; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_name_gen_delete; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_occlusion_query_event; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_performance_monitor; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_pinned_memory; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_query_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sample_positions; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_seamless_cubemap_per_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_atomic_counter_ops; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_export; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_value_export; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_trinary_minmax; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sparse_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_stencil_operation_extended; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_texture4; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback3_lines_triangles; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback4; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_layer; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_tessellator; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_viewport_index; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_depth_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_blit; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_instanced_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_pack_reverse_row_order; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_program_binary; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt1; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt3; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt5; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_usage; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_timer_query; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_translated_shader_source; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_aux_depth_stencil; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_client_storage; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_element_array; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_fence; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_float_pixels; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_flush_buffer_range; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_object_purgeable; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_pixel_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_rgb_422; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_row_bytes; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_specular_vector; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_range; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_transform_hint; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_object; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_range; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_program_evaluators; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_ycbcr_422; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES2_compatibility; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_1_compatibility; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_2_compatibility; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_compatibility; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_arrays_of_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_base_instance; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_bindless_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_blend_func_extended; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_buffer_storage; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cl_event; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clip_control; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_color_buffer_float; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compatibility; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compressed_texture_pixel_storage; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_variable_group_size; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conditional_render_inverted; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conservative_depth; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_image; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cull_distance; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_debug_output; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_buffer_float; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_derivative_control; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_direct_state_access; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers_blend; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_elements_base_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_indirect; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_instanced; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_enhanced_layouts; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_attrib_location; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_uniform_location; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_coord_conventions; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_layer_viewport; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program_shadow; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader_interlock; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_no_attachments; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_sRGB; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_geometry_shader4; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_get_program_binary; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_get_texture_sub_image; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader5; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_fp64; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_int64; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_pixel; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_imaging; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_indirect_parameters; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_instanced_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query2; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_invalidate_subdata; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_alignment; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_range; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_matrix_palette; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_bind; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_draw_indirect; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multitexture; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query2; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_parallel_shader_compile; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pipeline_statistics_query; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pixel_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_parameters; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_sprite; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_post_depth_coverage; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_program_interface_query; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_provoking_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_query_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robust_buffer_access_behavior; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_application_isolation; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_share_group_isolation; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_locations; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_shading; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sampler_objects; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cube_map; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cubemap_per_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_separate_shader_objects; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counter_ops; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counters; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_ballot; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_bit_encoding; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_clock; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_draw_parameters; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_group_vote; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_load_store; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_size; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_objects; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_precision; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_stencil_export; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_storage_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_subroutine; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_image_samples; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_lod; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_viewport_layer_array; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_100; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_420pack; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_include; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_packing; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow_ambient; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture2; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_stencil_texturing; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sync; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_tessellation_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_barrier; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_border_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object_rgb32; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_range; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_bptc; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_rgtc; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map_array; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_add; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_combine; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_crossbar; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_dot3; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_filter_minmax; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_float; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_gather; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirror_clamp_to_edge; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirrored_repeat; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_non_power_of_two; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_levels; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_lod; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rectangle; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rg; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rgb10_a2ui; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_stencil8; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_swizzle; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_view; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_timer_query; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback2; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback3; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback_instanced; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback_overflow_query; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transpose_matrix; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_uniform_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_bgra; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_attrib_64bit; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_attrib_binding; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_blend; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_program; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_10f_11f_11f_rev; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_viewport_array; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_window_pos; -GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_point_sprites; -GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_combine3; -GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_route; -GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_vertex_shader_output_point_size; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_draw_buffers; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_element_array; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_envmap_bumpmap; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_fragment_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_map_object_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_meminfo; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_pn_triangles; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_separate_stencil; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_shader_texture_lod; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_text_fragment_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_compression_3dc; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_env_combine3; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_float; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_mirror_once; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_array_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_attrib_array_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_streams; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_422_pixels; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_Cg_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_abgr; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bgra; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bindable_uniform; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_color; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_equation_separate; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_func_separate; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_logic_op; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_minmax; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_subtract; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_volume_hint; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cmyka; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_subtable; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compiled_vertex_array; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_convolution; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_coordinate_frame; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cull_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_debug_label; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_debug_marker; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_depth_bounds_test; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_direct_state_access; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers2; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_instanced; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_range_elements; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fog_coord; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fragment_lighting; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_blit; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample_blit_scaled; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_sRGB; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_shader4; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_program_parameters; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_shader4; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_histogram; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_array_formats; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_func; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_material; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_light_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_misc_attribute; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_depth_stencil; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_float; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_pixels; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_paletted_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform_color_table; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_point_parameters; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_post_depth_coverage; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_provoking_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_raster_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_rescale_normal; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_scene_marker; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_secondary_color; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_shader_objects; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_specular_color; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_formatted; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_store; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_integer_mix; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_funcs; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shared_texture_palette; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sparse_texture2; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_clear_tag; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_two_side; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_wrap; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_subtexture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture3D; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_array; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_dxt1; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_latc; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_rgtc; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_s3tc; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_cube_map; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_edge_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_add; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_combine; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_dot3; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_anisotropic; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_minmax; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_integer; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_lod_bias; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_mirror_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_object; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_perturb_normal; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rectangle; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_decode; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_shared_exponent; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_snorm; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_swizzle; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_timer_query; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_transform_feedback; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array_bgra; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_attrib_64bit; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_weighting; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_x11_sync_object; -GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_frame_terminator; -GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_string_marker; -GLEW_VAR_EXPORT GLboolean __GLEW_HP_convolution_border_modes; -GLEW_VAR_EXPORT GLboolean __GLEW_HP_image_transform; -GLEW_VAR_EXPORT GLboolean __GLEW_HP_occlusion_test; -GLEW_VAR_EXPORT GLboolean __GLEW_HP_texture_lighting; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_cull_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_multimode_draw_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_rasterpos_clip; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_static_data; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_texture_mirrored_repeat; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_vertex_array_lists; -GLEW_VAR_EXPORT GLboolean __GLEW_INGR_color_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_INGR_interlace_read; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_fragment_shader_ordering; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_framebuffer_CMAA; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_map_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_parallel_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_performance_query; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_texture_scissor; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_blend_equation_advanced; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_blend_equation_advanced_coherent; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_context_flush_control; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_debug; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_no_error; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_robust_buffer_access_behavior; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_robustness; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_hdr; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_ldr; -GLEW_VAR_EXPORT GLboolean __GLEW_KTX_buffer_region; -GLEW_VAR_EXPORT GLboolean __GLEW_MESAX_texture_stack; -GLEW_VAR_EXPORT GLboolean __GLEW_MESA_pack_invert; -GLEW_VAR_EXPORT GLboolean __GLEW_MESA_resize_buffers; -GLEW_VAR_EXPORT GLboolean __GLEW_MESA_window_pos; -GLEW_VAR_EXPORT GLboolean __GLEW_MESA_ycbcr_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_NVX_conditional_render; -GLEW_VAR_EXPORT GLboolean __GLEW_NVX_gpu_memory_info; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_multi_draw_indirect; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_multi_draw_indirect_count; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced_coherent; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_square; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_compute_program5; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_conditional_render; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster_dilate; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_depth_to_color; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_image; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_deep_texture3D; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_buffer_float; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_range_unclamped; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_evaluators; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_explicit_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fence; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fill_rectangle; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_float_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fog_distance; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_coverage_to_color; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program4; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program_option; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_shader_interlock; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_mixed_samples; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample_coverage; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_program4; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader4; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader_passthrough; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program4; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5_mem_extended; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program_fp64; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_shader5; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_half_float; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_internalformat_sample_query; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_light_max_exponent; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_coverage; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_filter_hint; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_occlusion_query; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_depth_stencil; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_path_rendering; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_path_rendering_shared_edge; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_data_range; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_point_sprite; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_present_video; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_primitive_restart; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_sample_locations; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_sample_mask_override_coverage; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_counters; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_float; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_fp16_vector; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_int64; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_buffer_load; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_storage_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_thread_group; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_thread_shuffle; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_tessellation_program5; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_emboss; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_reflection; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_barrier; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_vtc; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_env_combine4; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_expand_normal; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader3; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_uniform_buffer_unified_memory; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vdpau_interop; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_attrib_integer_64bit; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_buffer_unified_memory; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program1_1; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2_option; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program3; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program4; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_video_capture; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_viewport_array2; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_byte_coordinates; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_compressed_paletted_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_read_format; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_single_precision; -GLEW_VAR_EXPORT GLboolean __GLEW_OML_interlace; -GLEW_VAR_EXPORT GLboolean __GLEW_OML_resample; -GLEW_VAR_EXPORT GLboolean __GLEW_OML_subsample; -GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview; -GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview2; -GLEW_VAR_EXPORT GLboolean __GLEW_PGI_misc_hints; -GLEW_VAR_EXPORT GLboolean __GLEW_PGI_vertex_hints; -GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_ES1_0_compatibility; -GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_ES1_1_compatibility; -GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_enable; -GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_error_string; -GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_extension_query; -GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_log; -GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_proc_address; -GLEW_VAR_EXPORT GLboolean __GLEW_REND_screen_coordinates; -GLEW_VAR_EXPORT GLboolean __GLEW_S3_s3tc; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_color_range; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_detail_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_fog_function; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_generate_mipmap; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_pixel_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_point_line_texgen; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_sharpen_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture4D; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_border_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_edge_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_filter4; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_lod; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_select; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_histogram; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_pixel; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_alpha_minmax; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_clipmap; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_convolution_accuracy; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_flush_raster; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_offset; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_specular_lighting; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_framezoom; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_interlace; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ir_instrument1; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_list_priority; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_bits; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_reference_plane; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_resample; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow_ambient; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_sprite; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_tag_sample_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_add_env; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_coordinate_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_lod_bias; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_multi_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_range; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_scale_bias; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip_hint; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcb; -GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_matrix; -GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_table; -GLEW_VAR_EXPORT GLboolean __GLEW_SGI_texture_color_table; -GLEW_VAR_EXPORT GLboolean __GLEW_SUNX_constant_data; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_convolution_border_modes; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_global_alpha; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_mesh_array; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_read_video_pixels; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_slice_accum; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_triangle_list; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_WIN_phong_shading; -GLEW_VAR_EXPORT GLboolean __GLEW_WIN_specular_fog; -GLEW_VAR_EXPORT GLboolean __GLEW_WIN_swap_hint; - -#ifdef GLEW_MX -}; /* GLEWContextStruct */ -#endif /* GLEW_MX */ - -/* ------------------------------------------------------------------------- */ - -/* error codes */ -#define GLEW_OK 0 -#define GLEW_NO_ERROR 0 -#define GLEW_ERROR_NO_GL_VERSION 1 /* missing GL version */ -#define GLEW_ERROR_GL_VERSION_10_ONLY 2 /* Need at least OpenGL 1.1 */ -#define GLEW_ERROR_GLX_VERSION_11_ONLY 3 /* Need at least GLX 1.2 */ - -/* string codes */ -#define GLEW_VERSION 1 -#define GLEW_VERSION_MAJOR 2 -#define GLEW_VERSION_MINOR 3 -#define GLEW_VERSION_MICRO 4 - -/* ------------------------------------------------------------------------- */ - -/* GLEW version info */ - -/* -VERSION 1.13.0 -VERSION_MAJOR 1 -VERSION_MINOR 13 -VERSION_MICRO 0 -*/ - -/* API */ -#ifdef GLEW_MX - -typedef struct GLEWContextStruct GLEWContext; -GLEWAPI GLenum GLEWAPIENTRY glewContextInit (GLEWContext *ctx); -GLEWAPI GLboolean GLEWAPIENTRY glewContextIsSupported (const GLEWContext *ctx, const char *name); - -#define glewInit() glewContextInit(glewGetContext()) -#define glewIsSupported(x) glewContextIsSupported(glewGetContext(), x) -#define glewIsExtensionSupported(x) glewIsSupported(x) - -#define GLEW_GET_VAR(x) (*(const GLboolean*)&(glewGetContext()->x)) -#ifdef _WIN32 -# define GLEW_GET_FUN(x) glewGetContext()->x -#else -# define GLEW_GET_FUN(x) x -#endif - -#else /* GLEW_MX */ - -GLEWAPI GLenum GLEWAPIENTRY glewInit (void); -GLEWAPI GLboolean GLEWAPIENTRY glewIsSupported (const char *name); -#define glewIsExtensionSupported(x) glewIsSupported(x) - -#define GLEW_GET_VAR(x) (*(const GLboolean*)&x) -#define GLEW_GET_FUN(x) x - -#endif /* GLEW_MX */ - -GLEWAPI GLboolean glewExperimental; -GLEWAPI GLboolean GLEWAPIENTRY glewGetExtension (const char *name); -GLEWAPI const GLubyte * GLEWAPIENTRY glewGetErrorString (GLenum error); -GLEWAPI const GLubyte * GLEWAPIENTRY glewGetString (GLenum name); - -#ifdef __cplusplus -} -#endif - -#ifdef GLEW_APIENTRY_DEFINED -#undef GLEW_APIENTRY_DEFINED -#undef APIENTRY -#endif - -#ifdef GLEW_CALLBACK_DEFINED -#undef GLEW_CALLBACK_DEFINED -#undef CALLBACK -#endif - -#ifdef GLEW_WINGDIAPI_DEFINED -#undef GLEW_WINGDIAPI_DEFINED -#undef WINGDIAPI -#endif - -#undef GLAPI -/* #undef GLEWAPI */ - -#endif /* __glew_h__ */ diff --git a/deps/GLEW/glew/include/GL/glxew.h b/deps/GLEW/glew/include/GL/glxew.h deleted file mode 100644 index d803d260b37..00000000000 --- a/deps/GLEW/glew/include/GL/glxew.h +++ /dev/null @@ -1,1772 +0,0 @@ -/* -** The OpenGL Extension Wrangler Library -** Copyright (C) 2008-2015, Nigel Stewart -** Copyright (C) 2002-2008, Milan Ikits -** Copyright (C) 2002-2008, Marcelo E. Magallon -** Copyright (C) 2002, Lev Povalahev -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are met: -** -** * Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** * The name of the author may be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -** THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Mesa 3-D graphics library - * Version: 7.0 - * - * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* -** Copyright (c) 2007 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ - -#ifndef __glxew_h__ -#define __glxew_h__ -#define __GLXEW_H__ - -#ifdef __glxext_h_ -#error glxext.h included before glxew.h -#endif - -#if defined(GLX_H) || defined(__GLX_glx_h__) || defined(__glx_h__) -#error glx.h included before glxew.h -#endif - -#define __glxext_h_ - -#define GLX_H -#define __GLX_glx_h__ -#define __glx_h__ - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* ---------------------------- GLX_VERSION_1_0 --------------------------- */ - -#ifndef GLX_VERSION_1_0 -#define GLX_VERSION_1_0 1 - -#define GLX_USE_GL 1 -#define GLX_BUFFER_SIZE 2 -#define GLX_LEVEL 3 -#define GLX_RGBA 4 -#define GLX_DOUBLEBUFFER 5 -#define GLX_STEREO 6 -#define GLX_AUX_BUFFERS 7 -#define GLX_RED_SIZE 8 -#define GLX_GREEN_SIZE 9 -#define GLX_BLUE_SIZE 10 -#define GLX_ALPHA_SIZE 11 -#define GLX_DEPTH_SIZE 12 -#define GLX_STENCIL_SIZE 13 -#define GLX_ACCUM_RED_SIZE 14 -#define GLX_ACCUM_GREEN_SIZE 15 -#define GLX_ACCUM_BLUE_SIZE 16 -#define GLX_ACCUM_ALPHA_SIZE 17 -#define GLX_BAD_SCREEN 1 -#define GLX_BAD_ATTRIBUTE 2 -#define GLX_NO_EXTENSION 3 -#define GLX_BAD_VISUAL 4 -#define GLX_BAD_CONTEXT 5 -#define GLX_BAD_VALUE 6 -#define GLX_BAD_ENUM 7 - -typedef XID GLXDrawable; -typedef XID GLXPixmap; -#ifdef __sun -typedef struct __glXContextRec *GLXContext; -#else -typedef struct __GLXcontextRec *GLXContext; -#endif - -typedef unsigned int GLXVideoDeviceNV; - -extern Bool glXQueryExtension (Display *dpy, int *errorBase, int *eventBase); -extern Bool glXQueryVersion (Display *dpy, int *major, int *minor); -extern int glXGetConfig (Display *dpy, XVisualInfo *vis, int attrib, int *value); -extern XVisualInfo* glXChooseVisual (Display *dpy, int screen, int *attribList); -extern GLXPixmap glXCreateGLXPixmap (Display *dpy, XVisualInfo *vis, Pixmap pixmap); -extern void glXDestroyGLXPixmap (Display *dpy, GLXPixmap pix); -extern GLXContext glXCreateContext (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct); -extern void glXDestroyContext (Display *dpy, GLXContext ctx); -extern Bool glXIsDirect (Display *dpy, GLXContext ctx); -extern void glXCopyContext (Display *dpy, GLXContext src, GLXContext dst, GLulong mask); -extern Bool glXMakeCurrent (Display *dpy, GLXDrawable drawable, GLXContext ctx); -extern GLXContext glXGetCurrentContext (void); -extern GLXDrawable glXGetCurrentDrawable (void); -extern void glXWaitGL (void); -extern void glXWaitX (void); -extern void glXSwapBuffers (Display *dpy, GLXDrawable drawable); -extern void glXUseXFont (Font font, int first, int count, int listBase); - -#define GLXEW_VERSION_1_0 GLXEW_GET_VAR(__GLXEW_VERSION_1_0) - -#endif /* GLX_VERSION_1_0 */ - -/* ---------------------------- GLX_VERSION_1_1 --------------------------- */ - -#ifndef GLX_VERSION_1_1 -#define GLX_VERSION_1_1 - -#define GLX_VENDOR 0x1 -#define GLX_VERSION 0x2 -#define GLX_EXTENSIONS 0x3 - -extern const char* glXQueryExtensionsString (Display *dpy, int screen); -extern const char* glXGetClientString (Display *dpy, int name); -extern const char* glXQueryServerString (Display *dpy, int screen, int name); - -#define GLXEW_VERSION_1_1 GLXEW_GET_VAR(__GLXEW_VERSION_1_1) - -#endif /* GLX_VERSION_1_1 */ - -/* ---------------------------- GLX_VERSION_1_2 ---------------------------- */ - -#ifndef GLX_VERSION_1_2 -#define GLX_VERSION_1_2 1 - -typedef Display* ( * PFNGLXGETCURRENTDISPLAYPROC) (void); - -#define glXGetCurrentDisplay GLXEW_GET_FUN(__glewXGetCurrentDisplay) - -#define GLXEW_VERSION_1_2 GLXEW_GET_VAR(__GLXEW_VERSION_1_2) - -#endif /* GLX_VERSION_1_2 */ - -/* ---------------------------- GLX_VERSION_1_3 ---------------------------- */ - -#ifndef GLX_VERSION_1_3 -#define GLX_VERSION_1_3 1 - -#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 -#define GLX_RGBA_BIT 0x00000001 -#define GLX_WINDOW_BIT 0x00000001 -#define GLX_COLOR_INDEX_BIT 0x00000002 -#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 -#define GLX_PIXMAP_BIT 0x00000002 -#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 -#define GLX_PBUFFER_BIT 0x00000004 -#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 -#define GLX_AUX_BUFFERS_BIT 0x00000010 -#define GLX_CONFIG_CAVEAT 0x20 -#define GLX_DEPTH_BUFFER_BIT 0x00000020 -#define GLX_X_VISUAL_TYPE 0x22 -#define GLX_TRANSPARENT_TYPE 0x23 -#define GLX_TRANSPARENT_INDEX_VALUE 0x24 -#define GLX_TRANSPARENT_RED_VALUE 0x25 -#define GLX_TRANSPARENT_GREEN_VALUE 0x26 -#define GLX_TRANSPARENT_BLUE_VALUE 0x27 -#define GLX_TRANSPARENT_ALPHA_VALUE 0x28 -#define GLX_STENCIL_BUFFER_BIT 0x00000040 -#define GLX_ACCUM_BUFFER_BIT 0x00000080 -#define GLX_NONE 0x8000 -#define GLX_SLOW_CONFIG 0x8001 -#define GLX_TRUE_COLOR 0x8002 -#define GLX_DIRECT_COLOR 0x8003 -#define GLX_PSEUDO_COLOR 0x8004 -#define GLX_STATIC_COLOR 0x8005 -#define GLX_GRAY_SCALE 0x8006 -#define GLX_STATIC_GRAY 0x8007 -#define GLX_TRANSPARENT_RGB 0x8008 -#define GLX_TRANSPARENT_INDEX 0x8009 -#define GLX_VISUAL_ID 0x800B -#define GLX_SCREEN 0x800C -#define GLX_NON_CONFORMANT_CONFIG 0x800D -#define GLX_DRAWABLE_TYPE 0x8010 -#define GLX_RENDER_TYPE 0x8011 -#define GLX_X_RENDERABLE 0x8012 -#define GLX_FBCONFIG_ID 0x8013 -#define GLX_RGBA_TYPE 0x8014 -#define GLX_COLOR_INDEX_TYPE 0x8015 -#define GLX_MAX_PBUFFER_WIDTH 0x8016 -#define GLX_MAX_PBUFFER_HEIGHT 0x8017 -#define GLX_MAX_PBUFFER_PIXELS 0x8018 -#define GLX_PRESERVED_CONTENTS 0x801B -#define GLX_LARGEST_PBUFFER 0x801C -#define GLX_WIDTH 0x801D -#define GLX_HEIGHT 0x801E -#define GLX_EVENT_MASK 0x801F -#define GLX_DAMAGED 0x8020 -#define GLX_SAVED 0x8021 -#define GLX_WINDOW 0x8022 -#define GLX_PBUFFER 0x8023 -#define GLX_PBUFFER_HEIGHT 0x8040 -#define GLX_PBUFFER_WIDTH 0x8041 -#define GLX_PBUFFER_CLOBBER_MASK 0x08000000 -#define GLX_DONT_CARE 0xFFFFFFFF - -typedef XID GLXFBConfigID; -typedef XID GLXPbuffer; -typedef XID GLXWindow; -typedef struct __GLXFBConfigRec *GLXFBConfig; - -typedef struct { - int event_type; - int draw_type; - unsigned long serial; - Bool send_event; - Display *display; - GLXDrawable drawable; - unsigned int buffer_mask; - unsigned int aux_buffer; - int x, y; - int width, height; - int count; -} GLXPbufferClobberEvent; -typedef union __GLXEvent { - GLXPbufferClobberEvent glxpbufferclobber; - long pad[24]; -} GLXEvent; - -typedef GLXFBConfig* ( * PFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); -typedef GLXContext ( * PFNGLXCREATENEWCONTEXTPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); -typedef GLXPbuffer ( * PFNGLXCREATEPBUFFERPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list); -typedef GLXPixmap ( * PFNGLXCREATEPIXMAPPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list); -typedef GLXWindow ( * PFNGLXCREATEWINDOWPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list); -typedef void ( * PFNGLXDESTROYPBUFFERPROC) (Display *dpy, GLXPbuffer pbuf); -typedef void ( * PFNGLXDESTROYPIXMAPPROC) (Display *dpy, GLXPixmap pixmap); -typedef void ( * PFNGLXDESTROYWINDOWPROC) (Display *dpy, GLXWindow win); -typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLEPROC) (void); -typedef int ( * PFNGLXGETFBCONFIGATTRIBPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value); -typedef GLXFBConfig* ( * PFNGLXGETFBCONFIGSPROC) (Display *dpy, int screen, int *nelements); -typedef void ( * PFNGLXGETSELECTEDEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask); -typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGPROC) (Display *dpy, GLXFBConfig config); -typedef Bool ( * PFNGLXMAKECONTEXTCURRENTPROC) (Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx); -typedef int ( * PFNGLXQUERYCONTEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value); -typedef void ( * PFNGLXQUERYDRAWABLEPROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value); -typedef void ( * PFNGLXSELECTEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask); - -#define glXChooseFBConfig GLXEW_GET_FUN(__glewXChooseFBConfig) -#define glXCreateNewContext GLXEW_GET_FUN(__glewXCreateNewContext) -#define glXCreatePbuffer GLXEW_GET_FUN(__glewXCreatePbuffer) -#define glXCreatePixmap GLXEW_GET_FUN(__glewXCreatePixmap) -#define glXCreateWindow GLXEW_GET_FUN(__glewXCreateWindow) -#define glXDestroyPbuffer GLXEW_GET_FUN(__glewXDestroyPbuffer) -#define glXDestroyPixmap GLXEW_GET_FUN(__glewXDestroyPixmap) -#define glXDestroyWindow GLXEW_GET_FUN(__glewXDestroyWindow) -#define glXGetCurrentReadDrawable GLXEW_GET_FUN(__glewXGetCurrentReadDrawable) -#define glXGetFBConfigAttrib GLXEW_GET_FUN(__glewXGetFBConfigAttrib) -#define glXGetFBConfigs GLXEW_GET_FUN(__glewXGetFBConfigs) -#define glXGetSelectedEvent GLXEW_GET_FUN(__glewXGetSelectedEvent) -#define glXGetVisualFromFBConfig GLXEW_GET_FUN(__glewXGetVisualFromFBConfig) -#define glXMakeContextCurrent GLXEW_GET_FUN(__glewXMakeContextCurrent) -#define glXQueryContext GLXEW_GET_FUN(__glewXQueryContext) -#define glXQueryDrawable GLXEW_GET_FUN(__glewXQueryDrawable) -#define glXSelectEvent GLXEW_GET_FUN(__glewXSelectEvent) - -#define GLXEW_VERSION_1_3 GLXEW_GET_VAR(__GLXEW_VERSION_1_3) - -#endif /* GLX_VERSION_1_3 */ - -/* ---------------------------- GLX_VERSION_1_4 ---------------------------- */ - -#ifndef GLX_VERSION_1_4 -#define GLX_VERSION_1_4 1 - -#define GLX_SAMPLE_BUFFERS 100000 -#define GLX_SAMPLES 100001 - -extern void ( * glXGetProcAddress (const GLubyte *procName)) (void); - -#define GLXEW_VERSION_1_4 GLXEW_GET_VAR(__GLXEW_VERSION_1_4) - -#endif /* GLX_VERSION_1_4 */ - -/* -------------------------- GLX_3DFX_multisample ------------------------- */ - -#ifndef GLX_3DFX_multisample -#define GLX_3DFX_multisample 1 - -#define GLX_SAMPLE_BUFFERS_3DFX 0x8050 -#define GLX_SAMPLES_3DFX 0x8051 - -#define GLXEW_3DFX_multisample GLXEW_GET_VAR(__GLXEW_3DFX_multisample) - -#endif /* GLX_3DFX_multisample */ - -/* ------------------------ GLX_AMD_gpu_association ------------------------ */ - -#ifndef GLX_AMD_gpu_association -#define GLX_AMD_gpu_association 1 - -#define GLX_GPU_VENDOR_AMD 0x1F00 -#define GLX_GPU_RENDERER_STRING_AMD 0x1F01 -#define GLX_GPU_OPENGL_VERSION_STRING_AMD 0x1F02 -#define GLX_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2 -#define GLX_GPU_RAM_AMD 0x21A3 -#define GLX_GPU_CLOCK_AMD 0x21A4 -#define GLX_GPU_NUM_PIPES_AMD 0x21A5 -#define GLX_GPU_NUM_SIMD_AMD 0x21A6 -#define GLX_GPU_NUM_RB_AMD 0x21A7 -#define GLX_GPU_NUM_SPI_AMD 0x21A8 - -typedef void ( * PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC) (GLXContext dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef GLXContext ( * PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC) (unsigned int id, GLXContext share_list); -typedef GLXContext ( * PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (unsigned int id, GLXContext share_context, const int* attribList); -typedef Bool ( * PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC) (GLXContext ctx); -typedef unsigned int ( * PFNGLXGETCONTEXTGPUIDAMDPROC) (GLXContext ctx); -typedef GLXContext ( * PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void); -typedef unsigned int ( * PFNGLXGETGPUIDSAMDPROC) (unsigned int maxCount, unsigned int* ids); -typedef int ( * PFNGLXGETGPUINFOAMDPROC) (unsigned int id, int property, GLenum dataType, unsigned int size, void* data); -typedef Bool ( * PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (GLXContext ctx); - -#define glXBlitContextFramebufferAMD GLXEW_GET_FUN(__glewXBlitContextFramebufferAMD) -#define glXCreateAssociatedContextAMD GLXEW_GET_FUN(__glewXCreateAssociatedContextAMD) -#define glXCreateAssociatedContextAttribsAMD GLXEW_GET_FUN(__glewXCreateAssociatedContextAttribsAMD) -#define glXDeleteAssociatedContextAMD GLXEW_GET_FUN(__glewXDeleteAssociatedContextAMD) -#define glXGetContextGPUIDAMD GLXEW_GET_FUN(__glewXGetContextGPUIDAMD) -#define glXGetCurrentAssociatedContextAMD GLXEW_GET_FUN(__glewXGetCurrentAssociatedContextAMD) -#define glXGetGPUIDsAMD GLXEW_GET_FUN(__glewXGetGPUIDsAMD) -#define glXGetGPUInfoAMD GLXEW_GET_FUN(__glewXGetGPUInfoAMD) -#define glXMakeAssociatedContextCurrentAMD GLXEW_GET_FUN(__glewXMakeAssociatedContextCurrentAMD) - -#define GLXEW_AMD_gpu_association GLXEW_GET_VAR(__GLXEW_AMD_gpu_association) - -#endif /* GLX_AMD_gpu_association */ - -/* --------------------- GLX_ARB_context_flush_control --------------------- */ - -#ifndef GLX_ARB_context_flush_control -#define GLX_ARB_context_flush_control 1 - -#define GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB 0x0000 -#define GLX_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097 -#define GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB 0x2098 - -#define GLXEW_ARB_context_flush_control GLXEW_GET_VAR(__GLXEW_ARB_context_flush_control) - -#endif /* GLX_ARB_context_flush_control */ - -/* ------------------------- GLX_ARB_create_context ------------------------ */ - -#ifndef GLX_ARB_create_context -#define GLX_ARB_create_context 1 - -#define GLX_CONTEXT_DEBUG_BIT_ARB 0x0001 -#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 -#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 -#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 -#define GLX_CONTEXT_FLAGS_ARB 0x2094 - -typedef GLXContext ( * PFNGLXCREATECONTEXTATTRIBSARBPROC) (Display* dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list); - -#define glXCreateContextAttribsARB GLXEW_GET_FUN(__glewXCreateContextAttribsARB) - -#define GLXEW_ARB_create_context GLXEW_GET_VAR(__GLXEW_ARB_create_context) - -#endif /* GLX_ARB_create_context */ - -/* --------------------- GLX_ARB_create_context_profile -------------------- */ - -#ifndef GLX_ARB_create_context_profile -#define GLX_ARB_create_context_profile 1 - -#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 -#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 -#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126 - -#define GLXEW_ARB_create_context_profile GLXEW_GET_VAR(__GLXEW_ARB_create_context_profile) - -#endif /* GLX_ARB_create_context_profile */ - -/* ------------------- GLX_ARB_create_context_robustness ------------------- */ - -#ifndef GLX_ARB_create_context_robustness -#define GLX_ARB_create_context_robustness 1 - -#define GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 -#define GLX_LOSE_CONTEXT_ON_RESET_ARB 0x8252 -#define GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 -#define GLX_NO_RESET_NOTIFICATION_ARB 0x8261 - -#define GLXEW_ARB_create_context_robustness GLXEW_GET_VAR(__GLXEW_ARB_create_context_robustness) - -#endif /* GLX_ARB_create_context_robustness */ - -/* ------------------------- GLX_ARB_fbconfig_float ------------------------ */ - -#ifndef GLX_ARB_fbconfig_float -#define GLX_ARB_fbconfig_float 1 - -#define GLX_RGBA_FLOAT_BIT_ARB 0x00000004 -#define GLX_RGBA_FLOAT_TYPE_ARB 0x20B9 - -#define GLXEW_ARB_fbconfig_float GLXEW_GET_VAR(__GLXEW_ARB_fbconfig_float) - -#endif /* GLX_ARB_fbconfig_float */ - -/* ------------------------ GLX_ARB_framebuffer_sRGB ----------------------- */ - -#ifndef GLX_ARB_framebuffer_sRGB -#define GLX_ARB_framebuffer_sRGB 1 - -#define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2 - -#define GLXEW_ARB_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_ARB_framebuffer_sRGB) - -#endif /* GLX_ARB_framebuffer_sRGB */ - -/* ------------------------ GLX_ARB_get_proc_address ----------------------- */ - -#ifndef GLX_ARB_get_proc_address -#define GLX_ARB_get_proc_address 1 - -extern void ( * glXGetProcAddressARB (const GLubyte *procName)) (void); - -#define GLXEW_ARB_get_proc_address GLXEW_GET_VAR(__GLXEW_ARB_get_proc_address) - -#endif /* GLX_ARB_get_proc_address */ - -/* -------------------------- GLX_ARB_multisample -------------------------- */ - -#ifndef GLX_ARB_multisample -#define GLX_ARB_multisample 1 - -#define GLX_SAMPLE_BUFFERS_ARB 100000 -#define GLX_SAMPLES_ARB 100001 - -#define GLXEW_ARB_multisample GLXEW_GET_VAR(__GLXEW_ARB_multisample) - -#endif /* GLX_ARB_multisample */ - -/* ---------------- GLX_ARB_robustness_application_isolation --------------- */ - -#ifndef GLX_ARB_robustness_application_isolation -#define GLX_ARB_robustness_application_isolation 1 - -#define GLX_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 - -#define GLXEW_ARB_robustness_application_isolation GLXEW_GET_VAR(__GLXEW_ARB_robustness_application_isolation) - -#endif /* GLX_ARB_robustness_application_isolation */ - -/* ---------------- GLX_ARB_robustness_share_group_isolation --------------- */ - -#ifndef GLX_ARB_robustness_share_group_isolation -#define GLX_ARB_robustness_share_group_isolation 1 - -#define GLX_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 - -#define GLXEW_ARB_robustness_share_group_isolation GLXEW_GET_VAR(__GLXEW_ARB_robustness_share_group_isolation) - -#endif /* GLX_ARB_robustness_share_group_isolation */ - -/* ---------------------- GLX_ARB_vertex_buffer_object --------------------- */ - -#ifndef GLX_ARB_vertex_buffer_object -#define GLX_ARB_vertex_buffer_object 1 - -#define GLX_CONTEXT_ALLOW_BUFFER_BYTE_ORDER_MISMATCH_ARB 0x2095 - -#define GLXEW_ARB_vertex_buffer_object GLXEW_GET_VAR(__GLXEW_ARB_vertex_buffer_object) - -#endif /* GLX_ARB_vertex_buffer_object */ - -/* ----------------------- GLX_ATI_pixel_format_float ---------------------- */ - -#ifndef GLX_ATI_pixel_format_float -#define GLX_ATI_pixel_format_float 1 - -#define GLX_RGBA_FLOAT_ATI_BIT 0x00000100 - -#define GLXEW_ATI_pixel_format_float GLXEW_GET_VAR(__GLXEW_ATI_pixel_format_float) - -#endif /* GLX_ATI_pixel_format_float */ - -/* ------------------------- GLX_ATI_render_texture ------------------------ */ - -#ifndef GLX_ATI_render_texture -#define GLX_ATI_render_texture 1 - -#define GLX_BIND_TO_TEXTURE_RGB_ATI 0x9800 -#define GLX_BIND_TO_TEXTURE_RGBA_ATI 0x9801 -#define GLX_TEXTURE_FORMAT_ATI 0x9802 -#define GLX_TEXTURE_TARGET_ATI 0x9803 -#define GLX_MIPMAP_TEXTURE_ATI 0x9804 -#define GLX_TEXTURE_RGB_ATI 0x9805 -#define GLX_TEXTURE_RGBA_ATI 0x9806 -#define GLX_NO_TEXTURE_ATI 0x9807 -#define GLX_TEXTURE_CUBE_MAP_ATI 0x9808 -#define GLX_TEXTURE_1D_ATI 0x9809 -#define GLX_TEXTURE_2D_ATI 0x980A -#define GLX_MIPMAP_LEVEL_ATI 0x980B -#define GLX_CUBE_MAP_FACE_ATI 0x980C -#define GLX_TEXTURE_CUBE_MAP_POSITIVE_X_ATI 0x980D -#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_X_ATI 0x980E -#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Y_ATI 0x980F -#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Y_ATI 0x9810 -#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Z_ATI 0x9811 -#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Z_ATI 0x9812 -#define GLX_FRONT_LEFT_ATI 0x9813 -#define GLX_FRONT_RIGHT_ATI 0x9814 -#define GLX_BACK_LEFT_ATI 0x9815 -#define GLX_BACK_RIGHT_ATI 0x9816 -#define GLX_AUX0_ATI 0x9817 -#define GLX_AUX1_ATI 0x9818 -#define GLX_AUX2_ATI 0x9819 -#define GLX_AUX3_ATI 0x981A -#define GLX_AUX4_ATI 0x981B -#define GLX_AUX5_ATI 0x981C -#define GLX_AUX6_ATI 0x981D -#define GLX_AUX7_ATI 0x981E -#define GLX_AUX8_ATI 0x981F -#define GLX_AUX9_ATI 0x9820 -#define GLX_BIND_TO_TEXTURE_LUMINANCE_ATI 0x9821 -#define GLX_BIND_TO_TEXTURE_INTENSITY_ATI 0x9822 - -typedef void ( * PFNGLXBINDTEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); -typedef void ( * PFNGLXDRAWABLEATTRIBATIPROC) (Display *dpy, GLXDrawable draw, const int *attrib_list); -typedef void ( * PFNGLXRELEASETEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); - -#define glXBindTexImageATI GLXEW_GET_FUN(__glewXBindTexImageATI) -#define glXDrawableAttribATI GLXEW_GET_FUN(__glewXDrawableAttribATI) -#define glXReleaseTexImageATI GLXEW_GET_FUN(__glewXReleaseTexImageATI) - -#define GLXEW_ATI_render_texture GLXEW_GET_VAR(__GLXEW_ATI_render_texture) - -#endif /* GLX_ATI_render_texture */ - -/* --------------------------- GLX_EXT_buffer_age -------------------------- */ - -#ifndef GLX_EXT_buffer_age -#define GLX_EXT_buffer_age 1 - -#define GLX_BACK_BUFFER_AGE_EXT 0x20F4 - -#define GLXEW_EXT_buffer_age GLXEW_GET_VAR(__GLXEW_EXT_buffer_age) - -#endif /* GLX_EXT_buffer_age */ - -/* ------------------- GLX_EXT_create_context_es2_profile ------------------ */ - -#ifndef GLX_EXT_create_context_es2_profile -#define GLX_EXT_create_context_es2_profile 1 - -#define GLX_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 - -#define GLXEW_EXT_create_context_es2_profile GLXEW_GET_VAR(__GLXEW_EXT_create_context_es2_profile) - -#endif /* GLX_EXT_create_context_es2_profile */ - -/* ------------------- GLX_EXT_create_context_es_profile ------------------- */ - -#ifndef GLX_EXT_create_context_es_profile -#define GLX_EXT_create_context_es_profile 1 - -#define GLX_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004 - -#define GLXEW_EXT_create_context_es_profile GLXEW_GET_VAR(__GLXEW_EXT_create_context_es_profile) - -#endif /* GLX_EXT_create_context_es_profile */ - -/* --------------------- GLX_EXT_fbconfig_packed_float --------------------- */ - -#ifndef GLX_EXT_fbconfig_packed_float -#define GLX_EXT_fbconfig_packed_float 1 - -#define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008 -#define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1 - -#define GLXEW_EXT_fbconfig_packed_float GLXEW_GET_VAR(__GLXEW_EXT_fbconfig_packed_float) - -#endif /* GLX_EXT_fbconfig_packed_float */ - -/* ------------------------ GLX_EXT_framebuffer_sRGB ----------------------- */ - -#ifndef GLX_EXT_framebuffer_sRGB -#define GLX_EXT_framebuffer_sRGB 1 - -#define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2 - -#define GLXEW_EXT_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_EXT_framebuffer_sRGB) - -#endif /* GLX_EXT_framebuffer_sRGB */ - -/* ------------------------- GLX_EXT_import_context ------------------------ */ - -#ifndef GLX_EXT_import_context -#define GLX_EXT_import_context 1 - -#define GLX_SHARE_CONTEXT_EXT 0x800A -#define GLX_VISUAL_ID_EXT 0x800B -#define GLX_SCREEN_EXT 0x800C - -typedef XID GLXContextID; - -typedef void ( * PFNGLXFREECONTEXTEXTPROC) (Display* dpy, GLXContext context); -typedef GLXContextID ( * PFNGLXGETCONTEXTIDEXTPROC) (const GLXContext context); -typedef GLXContext ( * PFNGLXIMPORTCONTEXTEXTPROC) (Display* dpy, GLXContextID contextID); -typedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display* dpy, GLXContext context, int attribute,int *value); - -#define glXFreeContextEXT GLXEW_GET_FUN(__glewXFreeContextEXT) -#define glXGetContextIDEXT GLXEW_GET_FUN(__glewXGetContextIDEXT) -#define glXImportContextEXT GLXEW_GET_FUN(__glewXImportContextEXT) -#define glXQueryContextInfoEXT GLXEW_GET_FUN(__glewXQueryContextInfoEXT) - -#define GLXEW_EXT_import_context GLXEW_GET_VAR(__GLXEW_EXT_import_context) - -#endif /* GLX_EXT_import_context */ - -/* -------------------------- GLX_EXT_scene_marker ------------------------- */ - -#ifndef GLX_EXT_scene_marker -#define GLX_EXT_scene_marker 1 - -#define GLXEW_EXT_scene_marker GLXEW_GET_VAR(__GLXEW_EXT_scene_marker) - -#endif /* GLX_EXT_scene_marker */ - -/* -------------------------- GLX_EXT_stereo_tree -------------------------- */ - -#ifndef GLX_EXT_stereo_tree -#define GLX_EXT_stereo_tree 1 - -#define GLX_STEREO_NOTIFY_EXT 0x00000000 -#define GLX_STEREO_NOTIFY_MASK_EXT 0x00000001 -#define GLX_STEREO_TREE_EXT 0x20F5 - -#define GLXEW_EXT_stereo_tree GLXEW_GET_VAR(__GLXEW_EXT_stereo_tree) - -#endif /* GLX_EXT_stereo_tree */ - -/* -------------------------- GLX_EXT_swap_control ------------------------- */ - -#ifndef GLX_EXT_swap_control -#define GLX_EXT_swap_control 1 - -#define GLX_SWAP_INTERVAL_EXT 0x20F1 -#define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2 - -typedef void ( * PFNGLXSWAPINTERVALEXTPROC) (Display* dpy, GLXDrawable drawable, int interval); - -#define glXSwapIntervalEXT GLXEW_GET_FUN(__glewXSwapIntervalEXT) - -#define GLXEW_EXT_swap_control GLXEW_GET_VAR(__GLXEW_EXT_swap_control) - -#endif /* GLX_EXT_swap_control */ - -/* ----------------------- GLX_EXT_swap_control_tear ----------------------- */ - -#ifndef GLX_EXT_swap_control_tear -#define GLX_EXT_swap_control_tear 1 - -#define GLX_LATE_SWAPS_TEAR_EXT 0x20F3 - -#define GLXEW_EXT_swap_control_tear GLXEW_GET_VAR(__GLXEW_EXT_swap_control_tear) - -#endif /* GLX_EXT_swap_control_tear */ - -/* ---------------------- GLX_EXT_texture_from_pixmap ---------------------- */ - -#ifndef GLX_EXT_texture_from_pixmap -#define GLX_EXT_texture_from_pixmap 1 - -#define GLX_TEXTURE_1D_BIT_EXT 0x00000001 -#define GLX_TEXTURE_2D_BIT_EXT 0x00000002 -#define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004 -#define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0 -#define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1 -#define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2 -#define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3 -#define GLX_Y_INVERTED_EXT 0x20D4 -#define GLX_TEXTURE_FORMAT_EXT 0x20D5 -#define GLX_TEXTURE_TARGET_EXT 0x20D6 -#define GLX_MIPMAP_TEXTURE_EXT 0x20D7 -#define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8 -#define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9 -#define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA -#define GLX_TEXTURE_1D_EXT 0x20DB -#define GLX_TEXTURE_2D_EXT 0x20DC -#define GLX_TEXTURE_RECTANGLE_EXT 0x20DD -#define GLX_FRONT_LEFT_EXT 0x20DE -#define GLX_FRONT_RIGHT_EXT 0x20DF -#define GLX_BACK_LEFT_EXT 0x20E0 -#define GLX_BACK_RIGHT_EXT 0x20E1 -#define GLX_AUX0_EXT 0x20E2 -#define GLX_AUX1_EXT 0x20E3 -#define GLX_AUX2_EXT 0x20E4 -#define GLX_AUX3_EXT 0x20E5 -#define GLX_AUX4_EXT 0x20E6 -#define GLX_AUX5_EXT 0x20E7 -#define GLX_AUX6_EXT 0x20E8 -#define GLX_AUX7_EXT 0x20E9 -#define GLX_AUX8_EXT 0x20EA -#define GLX_AUX9_EXT 0x20EB - -typedef void ( * PFNGLXBINDTEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer, const int *attrib_list); -typedef void ( * PFNGLXRELEASETEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer); - -#define glXBindTexImageEXT GLXEW_GET_FUN(__glewXBindTexImageEXT) -#define glXReleaseTexImageEXT GLXEW_GET_FUN(__glewXReleaseTexImageEXT) - -#define GLXEW_EXT_texture_from_pixmap GLXEW_GET_VAR(__GLXEW_EXT_texture_from_pixmap) - -#endif /* GLX_EXT_texture_from_pixmap */ - -/* -------------------------- GLX_EXT_visual_info -------------------------- */ - -#ifndef GLX_EXT_visual_info -#define GLX_EXT_visual_info 1 - -#define GLX_X_VISUAL_TYPE_EXT 0x22 -#define GLX_TRANSPARENT_TYPE_EXT 0x23 -#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24 -#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25 -#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26 -#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27 -#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28 -#define GLX_NONE_EXT 0x8000 -#define GLX_TRUE_COLOR_EXT 0x8002 -#define GLX_DIRECT_COLOR_EXT 0x8003 -#define GLX_PSEUDO_COLOR_EXT 0x8004 -#define GLX_STATIC_COLOR_EXT 0x8005 -#define GLX_GRAY_SCALE_EXT 0x8006 -#define GLX_STATIC_GRAY_EXT 0x8007 -#define GLX_TRANSPARENT_RGB_EXT 0x8008 -#define GLX_TRANSPARENT_INDEX_EXT 0x8009 - -#define GLXEW_EXT_visual_info GLXEW_GET_VAR(__GLXEW_EXT_visual_info) - -#endif /* GLX_EXT_visual_info */ - -/* ------------------------- GLX_EXT_visual_rating ------------------------- */ - -#ifndef GLX_EXT_visual_rating -#define GLX_EXT_visual_rating 1 - -#define GLX_VISUAL_CAVEAT_EXT 0x20 -#define GLX_SLOW_VISUAL_EXT 0x8001 -#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D - -#define GLXEW_EXT_visual_rating GLXEW_GET_VAR(__GLXEW_EXT_visual_rating) - -#endif /* GLX_EXT_visual_rating */ - -/* -------------------------- GLX_INTEL_swap_event ------------------------- */ - -#ifndef GLX_INTEL_swap_event -#define GLX_INTEL_swap_event 1 - -#define GLX_EXCHANGE_COMPLETE_INTEL 0x8180 -#define GLX_COPY_COMPLETE_INTEL 0x8181 -#define GLX_FLIP_COMPLETE_INTEL 0x8182 -#define GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK 0x04000000 - -#define GLXEW_INTEL_swap_event GLXEW_GET_VAR(__GLXEW_INTEL_swap_event) - -#endif /* GLX_INTEL_swap_event */ - -/* -------------------------- GLX_MESA_agp_offset -------------------------- */ - -#ifndef GLX_MESA_agp_offset -#define GLX_MESA_agp_offset 1 - -typedef unsigned int ( * PFNGLXGETAGPOFFSETMESAPROC) (const void* pointer); - -#define glXGetAGPOffsetMESA GLXEW_GET_FUN(__glewXGetAGPOffsetMESA) - -#define GLXEW_MESA_agp_offset GLXEW_GET_VAR(__GLXEW_MESA_agp_offset) - -#endif /* GLX_MESA_agp_offset */ - -/* ------------------------ GLX_MESA_copy_sub_buffer ----------------------- */ - -#ifndef GLX_MESA_copy_sub_buffer -#define GLX_MESA_copy_sub_buffer 1 - -typedef void ( * PFNGLXCOPYSUBBUFFERMESAPROC) (Display* dpy, GLXDrawable drawable, int x, int y, int width, int height); - -#define glXCopySubBufferMESA GLXEW_GET_FUN(__glewXCopySubBufferMESA) - -#define GLXEW_MESA_copy_sub_buffer GLXEW_GET_VAR(__GLXEW_MESA_copy_sub_buffer) - -#endif /* GLX_MESA_copy_sub_buffer */ - -/* ------------------------ GLX_MESA_pixmap_colormap ----------------------- */ - -#ifndef GLX_MESA_pixmap_colormap -#define GLX_MESA_pixmap_colormap 1 - -typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPMESAPROC) (Display* dpy, XVisualInfo *visual, Pixmap pixmap, Colormap cmap); - -#define glXCreateGLXPixmapMESA GLXEW_GET_FUN(__glewXCreateGLXPixmapMESA) - -#define GLXEW_MESA_pixmap_colormap GLXEW_GET_VAR(__GLXEW_MESA_pixmap_colormap) - -#endif /* GLX_MESA_pixmap_colormap */ - -/* ------------------------ GLX_MESA_query_renderer ------------------------ */ - -#ifndef GLX_MESA_query_renderer -#define GLX_MESA_query_renderer 1 - -#define GLX_RENDERER_VENDOR_ID_MESA 0x8183 -#define GLX_RENDERER_DEVICE_ID_MESA 0x8184 -#define GLX_RENDERER_VERSION_MESA 0x8185 -#define GLX_RENDERER_ACCELERATED_MESA 0x8186 -#define GLX_RENDERER_VIDEO_MEMORY_MESA 0x8187 -#define GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA 0x8188 -#define GLX_RENDERER_PREFERRED_PROFILE_MESA 0x8189 -#define GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA 0x818A -#define GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA 0x818B -#define GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA 0x818C -#define GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA 0x818D -#define GLX_RENDERER_ID_MESA 0x818E - -typedef Bool ( * PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC) (int attribute, unsigned int* value); -typedef const char* ( * PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC) (int attribute); -typedef Bool ( * PFNGLXQUERYRENDERERINTEGERMESAPROC) (Display* dpy, int screen, int renderer, int attribute, unsigned int *value); -typedef const char* ( * PFNGLXQUERYRENDERERSTRINGMESAPROC) (Display *dpy, int screen, int renderer, int attribute); - -#define glXQueryCurrentRendererIntegerMESA GLXEW_GET_FUN(__glewXQueryCurrentRendererIntegerMESA) -#define glXQueryCurrentRendererStringMESA GLXEW_GET_FUN(__glewXQueryCurrentRendererStringMESA) -#define glXQueryRendererIntegerMESA GLXEW_GET_FUN(__glewXQueryRendererIntegerMESA) -#define glXQueryRendererStringMESA GLXEW_GET_FUN(__glewXQueryRendererStringMESA) - -#define GLXEW_MESA_query_renderer GLXEW_GET_VAR(__GLXEW_MESA_query_renderer) - -#endif /* GLX_MESA_query_renderer */ - -/* ------------------------ GLX_MESA_release_buffers ----------------------- */ - -#ifndef GLX_MESA_release_buffers -#define GLX_MESA_release_buffers 1 - -typedef Bool ( * PFNGLXRELEASEBUFFERSMESAPROC) (Display* dpy, GLXDrawable d); - -#define glXReleaseBuffersMESA GLXEW_GET_FUN(__glewXReleaseBuffersMESA) - -#define GLXEW_MESA_release_buffers GLXEW_GET_VAR(__GLXEW_MESA_release_buffers) - -#endif /* GLX_MESA_release_buffers */ - -/* ------------------------- GLX_MESA_set_3dfx_mode ------------------------ */ - -#ifndef GLX_MESA_set_3dfx_mode -#define GLX_MESA_set_3dfx_mode 1 - -#define GLX_3DFX_WINDOW_MODE_MESA 0x1 -#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2 - -typedef GLboolean ( * PFNGLXSET3DFXMODEMESAPROC) (GLint mode); - -#define glXSet3DfxModeMESA GLXEW_GET_FUN(__glewXSet3DfxModeMESA) - -#define GLXEW_MESA_set_3dfx_mode GLXEW_GET_VAR(__GLXEW_MESA_set_3dfx_mode) - -#endif /* GLX_MESA_set_3dfx_mode */ - -/* ------------------------- GLX_MESA_swap_control ------------------------- */ - -#ifndef GLX_MESA_swap_control -#define GLX_MESA_swap_control 1 - -typedef int ( * PFNGLXGETSWAPINTERVALMESAPROC) (void); -typedef int ( * PFNGLXSWAPINTERVALMESAPROC) (unsigned int interval); - -#define glXGetSwapIntervalMESA GLXEW_GET_FUN(__glewXGetSwapIntervalMESA) -#define glXSwapIntervalMESA GLXEW_GET_FUN(__glewXSwapIntervalMESA) - -#define GLXEW_MESA_swap_control GLXEW_GET_VAR(__GLXEW_MESA_swap_control) - -#endif /* GLX_MESA_swap_control */ - -/* --------------------------- GLX_NV_copy_buffer -------------------------- */ - -#ifndef GLX_NV_copy_buffer -#define GLX_NV_copy_buffer 1 - -typedef void ( * PFNGLXCOPYBUFFERSUBDATANVPROC) (Display* dpy, GLXContext readCtx, GLXContext writeCtx, GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void ( * PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC) (Display* dpy, GLXContext readCtx, GLXContext writeCtx, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); - -#define glXCopyBufferSubDataNV GLXEW_GET_FUN(__glewXCopyBufferSubDataNV) -#define glXNamedCopyBufferSubDataNV GLXEW_GET_FUN(__glewXNamedCopyBufferSubDataNV) - -#define GLXEW_NV_copy_buffer GLXEW_GET_VAR(__GLXEW_NV_copy_buffer) - -#endif /* GLX_NV_copy_buffer */ - -/* --------------------------- GLX_NV_copy_image --------------------------- */ - -#ifndef GLX_NV_copy_image -#define GLX_NV_copy_image 1 - -typedef void ( * PFNGLXCOPYIMAGESUBDATANVPROC) (Display *dpy, GLXContext srcCtx, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLXContext dstCtx, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); - -#define glXCopyImageSubDataNV GLXEW_GET_FUN(__glewXCopyImageSubDataNV) - -#define GLXEW_NV_copy_image GLXEW_GET_VAR(__GLXEW_NV_copy_image) - -#endif /* GLX_NV_copy_image */ - -/* ------------------------ GLX_NV_delay_before_swap ----------------------- */ - -#ifndef GLX_NV_delay_before_swap -#define GLX_NV_delay_before_swap 1 - -typedef Bool ( * PFNGLXDELAYBEFORESWAPNVPROC) (Display* dpy, GLXDrawable drawable, GLfloat seconds); - -#define glXDelayBeforeSwapNV GLXEW_GET_FUN(__glewXDelayBeforeSwapNV) - -#define GLXEW_NV_delay_before_swap GLXEW_GET_VAR(__GLXEW_NV_delay_before_swap) - -#endif /* GLX_NV_delay_before_swap */ - -/* -------------------------- GLX_NV_float_buffer -------------------------- */ - -#ifndef GLX_NV_float_buffer -#define GLX_NV_float_buffer 1 - -#define GLX_FLOAT_COMPONENTS_NV 0x20B0 - -#define GLXEW_NV_float_buffer GLXEW_GET_VAR(__GLXEW_NV_float_buffer) - -#endif /* GLX_NV_float_buffer */ - -/* ---------------------- GLX_NV_multisample_coverage ---------------------- */ - -#ifndef GLX_NV_multisample_coverage -#define GLX_NV_multisample_coverage 1 - -#define GLX_COLOR_SAMPLES_NV 0x20B3 -#define GLX_COVERAGE_SAMPLES_NV 100001 - -#define GLXEW_NV_multisample_coverage GLXEW_GET_VAR(__GLXEW_NV_multisample_coverage) - -#endif /* GLX_NV_multisample_coverage */ - -/* -------------------------- GLX_NV_present_video ------------------------- */ - -#ifndef GLX_NV_present_video -#define GLX_NV_present_video 1 - -#define GLX_NUM_VIDEO_SLOTS_NV 0x20F0 - -typedef int ( * PFNGLXBINDVIDEODEVICENVPROC) (Display* dpy, unsigned int video_slot, unsigned int video_device, const int *attrib_list); -typedef unsigned int* ( * PFNGLXENUMERATEVIDEODEVICESNVPROC) (Display *dpy, int screen, int *nelements); - -#define glXBindVideoDeviceNV GLXEW_GET_FUN(__glewXBindVideoDeviceNV) -#define glXEnumerateVideoDevicesNV GLXEW_GET_FUN(__glewXEnumerateVideoDevicesNV) - -#define GLXEW_NV_present_video GLXEW_GET_VAR(__GLXEW_NV_present_video) - -#endif /* GLX_NV_present_video */ - -/* --------------------------- GLX_NV_swap_group --------------------------- */ - -#ifndef GLX_NV_swap_group -#define GLX_NV_swap_group 1 - -typedef Bool ( * PFNGLXBINDSWAPBARRIERNVPROC) (Display* dpy, GLuint group, GLuint barrier); -typedef Bool ( * PFNGLXJOINSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint group); -typedef Bool ( * PFNGLXQUERYFRAMECOUNTNVPROC) (Display* dpy, int screen, GLuint *count); -typedef Bool ( * PFNGLXQUERYMAXSWAPGROUPSNVPROC) (Display* dpy, int screen, GLuint *maxGroups, GLuint *maxBarriers); -typedef Bool ( * PFNGLXQUERYSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint *group, GLuint *barrier); -typedef Bool ( * PFNGLXRESETFRAMECOUNTNVPROC) (Display* dpy, int screen); - -#define glXBindSwapBarrierNV GLXEW_GET_FUN(__glewXBindSwapBarrierNV) -#define glXJoinSwapGroupNV GLXEW_GET_FUN(__glewXJoinSwapGroupNV) -#define glXQueryFrameCountNV GLXEW_GET_FUN(__glewXQueryFrameCountNV) -#define glXQueryMaxSwapGroupsNV GLXEW_GET_FUN(__glewXQueryMaxSwapGroupsNV) -#define glXQuerySwapGroupNV GLXEW_GET_FUN(__glewXQuerySwapGroupNV) -#define glXResetFrameCountNV GLXEW_GET_FUN(__glewXResetFrameCountNV) - -#define GLXEW_NV_swap_group GLXEW_GET_VAR(__GLXEW_NV_swap_group) - -#endif /* GLX_NV_swap_group */ - -/* ----------------------- GLX_NV_vertex_array_range ----------------------- */ - -#ifndef GLX_NV_vertex_array_range -#define GLX_NV_vertex_array_range 1 - -typedef void * ( * PFNGLXALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); -typedef void ( * PFNGLXFREEMEMORYNVPROC) (void *pointer); - -#define glXAllocateMemoryNV GLXEW_GET_FUN(__glewXAllocateMemoryNV) -#define glXFreeMemoryNV GLXEW_GET_FUN(__glewXFreeMemoryNV) - -#define GLXEW_NV_vertex_array_range GLXEW_GET_VAR(__GLXEW_NV_vertex_array_range) - -#endif /* GLX_NV_vertex_array_range */ - -/* -------------------------- GLX_NV_video_capture ------------------------- */ - -#ifndef GLX_NV_video_capture -#define GLX_NV_video_capture 1 - -#define GLX_DEVICE_ID_NV 0x20CD -#define GLX_UNIQUE_ID_NV 0x20CE -#define GLX_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF - -typedef XID GLXVideoCaptureDeviceNV; - -typedef int ( * PFNGLXBINDVIDEOCAPTUREDEVICENVPROC) (Display* dpy, unsigned int video_capture_slot, GLXVideoCaptureDeviceNV device); -typedef GLXVideoCaptureDeviceNV * ( * PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC) (Display* dpy, int screen, int *nelements); -typedef void ( * PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device); -typedef int ( * PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device, int attribute, int *value); -typedef void ( * PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device); - -#define glXBindVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXBindVideoCaptureDeviceNV) -#define glXEnumerateVideoCaptureDevicesNV GLXEW_GET_FUN(__glewXEnumerateVideoCaptureDevicesNV) -#define glXLockVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXLockVideoCaptureDeviceNV) -#define glXQueryVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXQueryVideoCaptureDeviceNV) -#define glXReleaseVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXReleaseVideoCaptureDeviceNV) - -#define GLXEW_NV_video_capture GLXEW_GET_VAR(__GLXEW_NV_video_capture) - -#endif /* GLX_NV_video_capture */ - -/* ---------------------------- GLX_NV_video_out --------------------------- */ - -#ifndef GLX_NV_video_out -#define GLX_NV_video_out 1 - -#define GLX_VIDEO_OUT_COLOR_NV 0x20C3 -#define GLX_VIDEO_OUT_ALPHA_NV 0x20C4 -#define GLX_VIDEO_OUT_DEPTH_NV 0x20C5 -#define GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 -#define GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 -#define GLX_VIDEO_OUT_FRAME_NV 0x20C8 -#define GLX_VIDEO_OUT_FIELD_1_NV 0x20C9 -#define GLX_VIDEO_OUT_FIELD_2_NV 0x20CA -#define GLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV 0x20CB -#define GLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV 0x20CC - -typedef int ( * PFNGLXBINDVIDEOIMAGENVPROC) (Display* dpy, GLXVideoDeviceNV VideoDevice, GLXPbuffer pbuf, int iVideoBuffer); -typedef int ( * PFNGLXGETVIDEODEVICENVPROC) (Display* dpy, int screen, int numVideoDevices, GLXVideoDeviceNV *pVideoDevice); -typedef int ( * PFNGLXGETVIDEOINFONVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); -typedef int ( * PFNGLXRELEASEVIDEODEVICENVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice); -typedef int ( * PFNGLXRELEASEVIDEOIMAGENVPROC) (Display* dpy, GLXPbuffer pbuf); -typedef int ( * PFNGLXSENDPBUFFERTOVIDEONVPROC) (Display* dpy, GLXPbuffer pbuf, int iBufferType, unsigned long *pulCounterPbuffer, GLboolean bBlock); - -#define glXBindVideoImageNV GLXEW_GET_FUN(__glewXBindVideoImageNV) -#define glXGetVideoDeviceNV GLXEW_GET_FUN(__glewXGetVideoDeviceNV) -#define glXGetVideoInfoNV GLXEW_GET_FUN(__glewXGetVideoInfoNV) -#define glXReleaseVideoDeviceNV GLXEW_GET_FUN(__glewXReleaseVideoDeviceNV) -#define glXReleaseVideoImageNV GLXEW_GET_FUN(__glewXReleaseVideoImageNV) -#define glXSendPbufferToVideoNV GLXEW_GET_FUN(__glewXSendPbufferToVideoNV) - -#define GLXEW_NV_video_out GLXEW_GET_VAR(__GLXEW_NV_video_out) - -#endif /* GLX_NV_video_out */ - -/* -------------------------- GLX_OML_swap_method -------------------------- */ - -#ifndef GLX_OML_swap_method -#define GLX_OML_swap_method 1 - -#define GLX_SWAP_METHOD_OML 0x8060 -#define GLX_SWAP_EXCHANGE_OML 0x8061 -#define GLX_SWAP_COPY_OML 0x8062 -#define GLX_SWAP_UNDEFINED_OML 0x8063 - -#define GLXEW_OML_swap_method GLXEW_GET_VAR(__GLXEW_OML_swap_method) - -#endif /* GLX_OML_swap_method */ - -/* -------------------------- GLX_OML_sync_control ------------------------- */ - -#ifndef GLX_OML_sync_control -#define GLX_OML_sync_control 1 - -typedef Bool ( * PFNGLXGETMSCRATEOMLPROC) (Display* dpy, GLXDrawable drawable, int32_t* numerator, int32_t* denominator); -typedef Bool ( * PFNGLXGETSYNCVALUESOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t* ust, int64_t* msc, int64_t* sbc); -typedef int64_t ( * PFNGLXSWAPBUFFERSMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder); -typedef Bool ( * PFNGLXWAITFORMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t* ust, int64_t* msc, int64_t* sbc); -typedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_sbc, int64_t* ust, int64_t* msc, int64_t* sbc); - -#define glXGetMscRateOML GLXEW_GET_FUN(__glewXGetMscRateOML) -#define glXGetSyncValuesOML GLXEW_GET_FUN(__glewXGetSyncValuesOML) -#define glXSwapBuffersMscOML GLXEW_GET_FUN(__glewXSwapBuffersMscOML) -#define glXWaitForMscOML GLXEW_GET_FUN(__glewXWaitForMscOML) -#define glXWaitForSbcOML GLXEW_GET_FUN(__glewXWaitForSbcOML) - -#define GLXEW_OML_sync_control GLXEW_GET_VAR(__GLXEW_OML_sync_control) - -#endif /* GLX_OML_sync_control */ - -/* ------------------------ GLX_SGIS_blended_overlay ----------------------- */ - -#ifndef GLX_SGIS_blended_overlay -#define GLX_SGIS_blended_overlay 1 - -#define GLX_BLENDED_RGBA_SGIS 0x8025 - -#define GLXEW_SGIS_blended_overlay GLXEW_GET_VAR(__GLXEW_SGIS_blended_overlay) - -#endif /* GLX_SGIS_blended_overlay */ - -/* -------------------------- GLX_SGIS_color_range ------------------------- */ - -#ifndef GLX_SGIS_color_range -#define GLX_SGIS_color_range 1 - -#define GLXEW_SGIS_color_range GLXEW_GET_VAR(__GLXEW_SGIS_color_range) - -#endif /* GLX_SGIS_color_range */ - -/* -------------------------- GLX_SGIS_multisample ------------------------- */ - -#ifndef GLX_SGIS_multisample -#define GLX_SGIS_multisample 1 - -#define GLX_SAMPLE_BUFFERS_SGIS 100000 -#define GLX_SAMPLES_SGIS 100001 - -#define GLXEW_SGIS_multisample GLXEW_GET_VAR(__GLXEW_SGIS_multisample) - -#endif /* GLX_SGIS_multisample */ - -/* ---------------------- GLX_SGIS_shared_multisample ---------------------- */ - -#ifndef GLX_SGIS_shared_multisample -#define GLX_SGIS_shared_multisample 1 - -#define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026 -#define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027 - -#define GLXEW_SGIS_shared_multisample GLXEW_GET_VAR(__GLXEW_SGIS_shared_multisample) - -#endif /* GLX_SGIS_shared_multisample */ - -/* --------------------------- GLX_SGIX_fbconfig --------------------------- */ - -#ifndef GLX_SGIX_fbconfig -#define GLX_SGIX_fbconfig 1 - -#define GLX_RGBA_BIT_SGIX 0x00000001 -#define GLX_WINDOW_BIT_SGIX 0x00000001 -#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002 -#define GLX_PIXMAP_BIT_SGIX 0x00000002 -#define GLX_SCREEN_EXT 0x800C -#define GLX_DRAWABLE_TYPE_SGIX 0x8010 -#define GLX_RENDER_TYPE_SGIX 0x8011 -#define GLX_X_RENDERABLE_SGIX 0x8012 -#define GLX_FBCONFIG_ID_SGIX 0x8013 -#define GLX_RGBA_TYPE_SGIX 0x8014 -#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015 - -typedef XID GLXFBConfigIDSGIX; -typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; - -typedef GLXFBConfigSGIX* ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); -typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); -typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, Pixmap pixmap); -typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display* dpy, GLXFBConfigSGIX config, int attribute, int *value); -typedef GLXFBConfigSGIX ( * PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display* dpy, XVisualInfo *vis); -typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfig config); - -#define glXChooseFBConfigSGIX GLXEW_GET_FUN(__glewXChooseFBConfigSGIX) -#define glXCreateContextWithConfigSGIX GLXEW_GET_FUN(__glewXCreateContextWithConfigSGIX) -#define glXCreateGLXPixmapWithConfigSGIX GLXEW_GET_FUN(__glewXCreateGLXPixmapWithConfigSGIX) -#define glXGetFBConfigAttribSGIX GLXEW_GET_FUN(__glewXGetFBConfigAttribSGIX) -#define glXGetFBConfigFromVisualSGIX GLXEW_GET_FUN(__glewXGetFBConfigFromVisualSGIX) -#define glXGetVisualFromFBConfigSGIX GLXEW_GET_FUN(__glewXGetVisualFromFBConfigSGIX) - -#define GLXEW_SGIX_fbconfig GLXEW_GET_VAR(__GLXEW_SGIX_fbconfig) - -#endif /* GLX_SGIX_fbconfig */ - -/* --------------------------- GLX_SGIX_hyperpipe -------------------------- */ - -#ifndef GLX_SGIX_hyperpipe -#define GLX_SGIX_hyperpipe 1 - -#define GLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001 -#define GLX_PIPE_RECT_SGIX 0x00000001 -#define GLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002 -#define GLX_PIPE_RECT_LIMITS_SGIX 0x00000002 -#define GLX_HYPERPIPE_STEREO_SGIX 0x00000003 -#define GLX_HYPERPIPE_PIXEL_AVERAGE_SGIX 0x00000004 -#define GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80 -#define GLX_BAD_HYPERPIPE_CONFIG_SGIX 91 -#define GLX_BAD_HYPERPIPE_SGIX 92 -#define GLX_HYPERPIPE_ID_SGIX 0x8030 - -typedef struct { - char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; - int networkId; -} GLXHyperpipeNetworkSGIX; -typedef struct { - char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; - int XOrigin; - int YOrigin; - int maxHeight; - int maxWidth; -} GLXPipeRectLimits; -typedef struct { - char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; - int channel; - unsigned int participationType; - int timeSlice; -} GLXHyperpipeConfigSGIX; -typedef struct { - char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; - int srcXOrigin; - int srcYOrigin; - int srcWidth; - int srcHeight; - int destXOrigin; - int destYOrigin; - int destWidth; - int destHeight; -} GLXPipeRect; - -typedef int ( * PFNGLXBINDHYPERPIPESGIXPROC) (Display *dpy, int hpId); -typedef int ( * PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId); -typedef int ( * PFNGLXHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList); -typedef int ( * PFNGLXHYPERPIPECONFIGSGIXPROC) (Display *dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX *cfg, int *hpId); -typedef int ( * PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *returnAttribList); -typedef int ( * PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList, void *returnAttribList); -typedef GLXHyperpipeConfigSGIX * ( * PFNGLXQUERYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId, int *npipes); -typedef GLXHyperpipeNetworkSGIX * ( * PFNGLXQUERYHYPERPIPENETWORKSGIXPROC) (Display *dpy, int *npipes); - -#define glXBindHyperpipeSGIX GLXEW_GET_FUN(__glewXBindHyperpipeSGIX) -#define glXDestroyHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXDestroyHyperpipeConfigSGIX) -#define glXHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXHyperpipeAttribSGIX) -#define glXHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXHyperpipeConfigSGIX) -#define glXQueryHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeAttribSGIX) -#define glXQueryHyperpipeBestAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeBestAttribSGIX) -#define glXQueryHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeConfigSGIX) -#define glXQueryHyperpipeNetworkSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeNetworkSGIX) - -#define GLXEW_SGIX_hyperpipe GLXEW_GET_VAR(__GLXEW_SGIX_hyperpipe) - -#endif /* GLX_SGIX_hyperpipe */ - -/* ---------------------------- GLX_SGIX_pbuffer --------------------------- */ - -#ifndef GLX_SGIX_pbuffer -#define GLX_SGIX_pbuffer 1 - -#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001 -#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002 -#define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004 -#define GLX_PBUFFER_BIT_SGIX 0x00000004 -#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008 -#define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010 -#define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020 -#define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040 -#define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080 -#define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100 -#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016 -#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017 -#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018 -#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019 -#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A -#define GLX_PRESERVED_CONTENTS_SGIX 0x801B -#define GLX_LARGEST_PBUFFER_SGIX 0x801C -#define GLX_WIDTH_SGIX 0x801D -#define GLX_HEIGHT_SGIX 0x801E -#define GLX_EVENT_MASK_SGIX 0x801F -#define GLX_DAMAGED_SGIX 0x8020 -#define GLX_SAVED_SGIX 0x8021 -#define GLX_WINDOW_SGIX 0x8022 -#define GLX_PBUFFER_SGIX 0x8023 -#define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000 - -typedef XID GLXPbufferSGIX; -typedef struct { int type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; int event_type; int draw_type; unsigned int mask; int x, y; int width, height; int count; } GLXBufferClobberEventSGIX; - -typedef GLXPbuffer ( * PFNGLXCREATEGLXPBUFFERSGIXPROC) (Display* dpy, GLXFBConfig config, unsigned int width, unsigned int height, int *attrib_list); -typedef void ( * PFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf); -typedef void ( * PFNGLXGETSELECTEDEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long *mask); -typedef void ( * PFNGLXQUERYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf, int attribute, unsigned int *value); -typedef void ( * PFNGLXSELECTEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long mask); - -#define glXCreateGLXPbufferSGIX GLXEW_GET_FUN(__glewXCreateGLXPbufferSGIX) -#define glXDestroyGLXPbufferSGIX GLXEW_GET_FUN(__glewXDestroyGLXPbufferSGIX) -#define glXGetSelectedEventSGIX GLXEW_GET_FUN(__glewXGetSelectedEventSGIX) -#define glXQueryGLXPbufferSGIX GLXEW_GET_FUN(__glewXQueryGLXPbufferSGIX) -#define glXSelectEventSGIX GLXEW_GET_FUN(__glewXSelectEventSGIX) - -#define GLXEW_SGIX_pbuffer GLXEW_GET_VAR(__GLXEW_SGIX_pbuffer) - -#endif /* GLX_SGIX_pbuffer */ - -/* ------------------------- GLX_SGIX_swap_barrier ------------------------- */ - -#ifndef GLX_SGIX_swap_barrier -#define GLX_SGIX_swap_barrier 1 - -typedef void ( * PFNGLXBINDSWAPBARRIERSGIXPROC) (Display *dpy, GLXDrawable drawable, int barrier); -typedef Bool ( * PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display *dpy, int screen, int *max); - -#define glXBindSwapBarrierSGIX GLXEW_GET_FUN(__glewXBindSwapBarrierSGIX) -#define glXQueryMaxSwapBarriersSGIX GLXEW_GET_FUN(__glewXQueryMaxSwapBarriersSGIX) - -#define GLXEW_SGIX_swap_barrier GLXEW_GET_VAR(__GLXEW_SGIX_swap_barrier) - -#endif /* GLX_SGIX_swap_barrier */ - -/* -------------------------- GLX_SGIX_swap_group -------------------------- */ - -#ifndef GLX_SGIX_swap_group -#define GLX_SGIX_swap_group 1 - -typedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display *dpy, GLXDrawable drawable, GLXDrawable member); - -#define glXJoinSwapGroupSGIX GLXEW_GET_FUN(__glewXJoinSwapGroupSGIX) - -#define GLXEW_SGIX_swap_group GLXEW_GET_VAR(__GLXEW_SGIX_swap_group) - -#endif /* GLX_SGIX_swap_group */ - -/* ------------------------- GLX_SGIX_video_resize ------------------------- */ - -#ifndef GLX_SGIX_video_resize -#define GLX_SGIX_video_resize 1 - -#define GLX_SYNC_FRAME_SGIX 0x00000000 -#define GLX_SYNC_SWAP_SGIX 0x00000001 - -typedef int ( * PFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display* display, int screen, int channel, Window window); -typedef int ( * PFNGLXCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int x, int y, int w, int h); -typedef int ( * PFNGLXCHANNELRECTSYNCSGIXPROC) (Display* display, int screen, int channel, GLenum synctype); -typedef int ( * PFNGLXQUERYCHANNELDELTASSGIXPROC) (Display* display, int screen, int channel, int *x, int *y, int *w, int *h); -typedef int ( * PFNGLXQUERYCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int *dx, int *dy, int *dw, int *dh); - -#define glXBindChannelToWindowSGIX GLXEW_GET_FUN(__glewXBindChannelToWindowSGIX) -#define glXChannelRectSGIX GLXEW_GET_FUN(__glewXChannelRectSGIX) -#define glXChannelRectSyncSGIX GLXEW_GET_FUN(__glewXChannelRectSyncSGIX) -#define glXQueryChannelDeltasSGIX GLXEW_GET_FUN(__glewXQueryChannelDeltasSGIX) -#define glXQueryChannelRectSGIX GLXEW_GET_FUN(__glewXQueryChannelRectSGIX) - -#define GLXEW_SGIX_video_resize GLXEW_GET_VAR(__GLXEW_SGIX_video_resize) - -#endif /* GLX_SGIX_video_resize */ - -/* ---------------------- GLX_SGIX_visual_select_group --------------------- */ - -#ifndef GLX_SGIX_visual_select_group -#define GLX_SGIX_visual_select_group 1 - -#define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028 - -#define GLXEW_SGIX_visual_select_group GLXEW_GET_VAR(__GLXEW_SGIX_visual_select_group) - -#endif /* GLX_SGIX_visual_select_group */ - -/* ---------------------------- GLX_SGI_cushion ---------------------------- */ - -#ifndef GLX_SGI_cushion -#define GLX_SGI_cushion 1 - -typedef void ( * PFNGLXCUSHIONSGIPROC) (Display* dpy, Window window, float cushion); - -#define glXCushionSGI GLXEW_GET_FUN(__glewXCushionSGI) - -#define GLXEW_SGI_cushion GLXEW_GET_VAR(__GLXEW_SGI_cushion) - -#endif /* GLX_SGI_cushion */ - -/* ----------------------- GLX_SGI_make_current_read ----------------------- */ - -#ifndef GLX_SGI_make_current_read -#define GLX_SGI_make_current_read 1 - -typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLESGIPROC) (void); -typedef Bool ( * PFNGLXMAKECURRENTREADSGIPROC) (Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); - -#define glXGetCurrentReadDrawableSGI GLXEW_GET_FUN(__glewXGetCurrentReadDrawableSGI) -#define glXMakeCurrentReadSGI GLXEW_GET_FUN(__glewXMakeCurrentReadSGI) - -#define GLXEW_SGI_make_current_read GLXEW_GET_VAR(__GLXEW_SGI_make_current_read) - -#endif /* GLX_SGI_make_current_read */ - -/* -------------------------- GLX_SGI_swap_control ------------------------- */ - -#ifndef GLX_SGI_swap_control -#define GLX_SGI_swap_control 1 - -typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval); - -#define glXSwapIntervalSGI GLXEW_GET_FUN(__glewXSwapIntervalSGI) - -#define GLXEW_SGI_swap_control GLXEW_GET_VAR(__GLXEW_SGI_swap_control) - -#endif /* GLX_SGI_swap_control */ - -/* --------------------------- GLX_SGI_video_sync -------------------------- */ - -#ifndef GLX_SGI_video_sync -#define GLX_SGI_video_sync 1 - -typedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (unsigned int* count); -typedef int ( * PFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int* count); - -#define glXGetVideoSyncSGI GLXEW_GET_FUN(__glewXGetVideoSyncSGI) -#define glXWaitVideoSyncSGI GLXEW_GET_FUN(__glewXWaitVideoSyncSGI) - -#define GLXEW_SGI_video_sync GLXEW_GET_VAR(__GLXEW_SGI_video_sync) - -#endif /* GLX_SGI_video_sync */ - -/* --------------------- GLX_SUN_get_transparent_index --------------------- */ - -#ifndef GLX_SUN_get_transparent_index -#define GLX_SUN_get_transparent_index 1 - -typedef Status ( * PFNGLXGETTRANSPARENTINDEXSUNPROC) (Display* dpy, Window overlay, Window underlay, unsigned long *pTransparentIndex); - -#define glXGetTransparentIndexSUN GLXEW_GET_FUN(__glewXGetTransparentIndexSUN) - -#define GLXEW_SUN_get_transparent_index GLXEW_GET_VAR(__GLXEW_SUN_get_transparent_index) - -#endif /* GLX_SUN_get_transparent_index */ - -/* -------------------------- GLX_SUN_video_resize ------------------------- */ - -#ifndef GLX_SUN_video_resize -#define GLX_SUN_video_resize 1 - -#define GLX_VIDEO_RESIZE_SUN 0x8171 -#define GL_VIDEO_RESIZE_COMPENSATION_SUN 0x85CD - -typedef int ( * PFNGLXGETVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float* factor); -typedef int ( * PFNGLXVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float factor); - -#define glXGetVideoResizeSUN GLXEW_GET_FUN(__glewXGetVideoResizeSUN) -#define glXVideoResizeSUN GLXEW_GET_FUN(__glewXVideoResizeSUN) - -#define GLXEW_SUN_video_resize GLXEW_GET_VAR(__GLXEW_SUN_video_resize) - -#endif /* GLX_SUN_video_resize */ - -/* ------------------------------------------------------------------------- */ - -#ifdef GLEW_MX -#define GLXEW_FUN_EXPORT GLEW_FUN_EXPORT -#define GLXEW_VAR_EXPORT -#else -#define GLXEW_FUN_EXPORT GLEW_FUN_EXPORT -#define GLXEW_VAR_EXPORT GLEW_VAR_EXPORT -#endif /* GLEW_MX */ - -GLXEW_FUN_EXPORT PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay; - -GLXEW_FUN_EXPORT PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig; -GLXEW_FUN_EXPORT PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext; -GLXEW_FUN_EXPORT PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer; -GLXEW_FUN_EXPORT PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap; -GLXEW_FUN_EXPORT PFNGLXCREATEWINDOWPROC __glewXCreateWindow; -GLXEW_FUN_EXPORT PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer; -GLXEW_FUN_EXPORT PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap; -GLXEW_FUN_EXPORT PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow; -GLXEW_FUN_EXPORT PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable; -GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib; -GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs; -GLXEW_FUN_EXPORT PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent; -GLXEW_FUN_EXPORT PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig; -GLXEW_FUN_EXPORT PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent; -GLXEW_FUN_EXPORT PFNGLXQUERYCONTEXTPROC __glewXQueryContext; -GLXEW_FUN_EXPORT PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable; -GLXEW_FUN_EXPORT PFNGLXSELECTEVENTPROC __glewXSelectEvent; - -GLXEW_FUN_EXPORT PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC __glewXBlitContextFramebufferAMD; -GLXEW_FUN_EXPORT PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC __glewXCreateAssociatedContextAMD; -GLXEW_FUN_EXPORT PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __glewXCreateAssociatedContextAttribsAMD; -GLXEW_FUN_EXPORT PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC __glewXDeleteAssociatedContextAMD; -GLXEW_FUN_EXPORT PFNGLXGETCONTEXTGPUIDAMDPROC __glewXGetContextGPUIDAMD; -GLXEW_FUN_EXPORT PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC __glewXGetCurrentAssociatedContextAMD; -GLXEW_FUN_EXPORT PFNGLXGETGPUIDSAMDPROC __glewXGetGPUIDsAMD; -GLXEW_FUN_EXPORT PFNGLXGETGPUINFOAMDPROC __glewXGetGPUInfoAMD; -GLXEW_FUN_EXPORT PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __glewXMakeAssociatedContextCurrentAMD; - -GLXEW_FUN_EXPORT PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB; - -GLXEW_FUN_EXPORT PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI; -GLXEW_FUN_EXPORT PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI; -GLXEW_FUN_EXPORT PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI; - -GLXEW_FUN_EXPORT PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT; -GLXEW_FUN_EXPORT PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT; -GLXEW_FUN_EXPORT PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT; -GLXEW_FUN_EXPORT PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT; - -GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT; - -GLXEW_FUN_EXPORT PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT; -GLXEW_FUN_EXPORT PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT; - -GLXEW_FUN_EXPORT PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA; - -GLXEW_FUN_EXPORT PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA; - -GLXEW_FUN_EXPORT PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA; - -GLXEW_FUN_EXPORT PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC __glewXQueryCurrentRendererIntegerMESA; -GLXEW_FUN_EXPORT PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC __glewXQueryCurrentRendererStringMESA; -GLXEW_FUN_EXPORT PFNGLXQUERYRENDERERINTEGERMESAPROC __glewXQueryRendererIntegerMESA; -GLXEW_FUN_EXPORT PFNGLXQUERYRENDERERSTRINGMESAPROC __glewXQueryRendererStringMESA; - -GLXEW_FUN_EXPORT PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA; - -GLXEW_FUN_EXPORT PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA; - -GLXEW_FUN_EXPORT PFNGLXGETSWAPINTERVALMESAPROC __glewXGetSwapIntervalMESA; -GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALMESAPROC __glewXSwapIntervalMESA; - -GLXEW_FUN_EXPORT PFNGLXCOPYBUFFERSUBDATANVPROC __glewXCopyBufferSubDataNV; -GLXEW_FUN_EXPORT PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC __glewXNamedCopyBufferSubDataNV; - -GLXEW_FUN_EXPORT PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV; - -GLXEW_FUN_EXPORT PFNGLXDELAYBEFORESWAPNVPROC __glewXDelayBeforeSwapNV; - -GLXEW_FUN_EXPORT PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV; -GLXEW_FUN_EXPORT PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV; - -GLXEW_FUN_EXPORT PFNGLXBINDSWAPBARRIERNVPROC __glewXBindSwapBarrierNV; -GLXEW_FUN_EXPORT PFNGLXJOINSWAPGROUPNVPROC __glewXJoinSwapGroupNV; -GLXEW_FUN_EXPORT PFNGLXQUERYFRAMECOUNTNVPROC __glewXQueryFrameCountNV; -GLXEW_FUN_EXPORT PFNGLXQUERYMAXSWAPGROUPSNVPROC __glewXQueryMaxSwapGroupsNV; -GLXEW_FUN_EXPORT PFNGLXQUERYSWAPGROUPNVPROC __glewXQuerySwapGroupNV; -GLXEW_FUN_EXPORT PFNGLXRESETFRAMECOUNTNVPROC __glewXResetFrameCountNV; - -GLXEW_FUN_EXPORT PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV; -GLXEW_FUN_EXPORT PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV; - -GLXEW_FUN_EXPORT PFNGLXBINDVIDEOCAPTUREDEVICENVPROC __glewXBindVideoCaptureDeviceNV; -GLXEW_FUN_EXPORT PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC __glewXEnumerateVideoCaptureDevicesNV; -GLXEW_FUN_EXPORT PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC __glewXLockVideoCaptureDeviceNV; -GLXEW_FUN_EXPORT PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC __glewXQueryVideoCaptureDeviceNV; -GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC __glewXReleaseVideoCaptureDeviceNV; - -GLXEW_FUN_EXPORT PFNGLXBINDVIDEOIMAGENVPROC __glewXBindVideoImageNV; -GLXEW_FUN_EXPORT PFNGLXGETVIDEODEVICENVPROC __glewXGetVideoDeviceNV; -GLXEW_FUN_EXPORT PFNGLXGETVIDEOINFONVPROC __glewXGetVideoInfoNV; -GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEODEVICENVPROC __glewXReleaseVideoDeviceNV; -GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEOIMAGENVPROC __glewXReleaseVideoImageNV; -GLXEW_FUN_EXPORT PFNGLXSENDPBUFFERTOVIDEONVPROC __glewXSendPbufferToVideoNV; - -GLXEW_FUN_EXPORT PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML; -GLXEW_FUN_EXPORT PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML; -GLXEW_FUN_EXPORT PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML; -GLXEW_FUN_EXPORT PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML; -GLXEW_FUN_EXPORT PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML; - -GLXEW_FUN_EXPORT PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX; -GLXEW_FUN_EXPORT PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX; -GLXEW_FUN_EXPORT PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX; -GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX; -GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX; -GLXEW_FUN_EXPORT PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX; - -GLXEW_FUN_EXPORT PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX; -GLXEW_FUN_EXPORT PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX; -GLXEW_FUN_EXPORT PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX; -GLXEW_FUN_EXPORT PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX; - -GLXEW_FUN_EXPORT PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX; -GLXEW_FUN_EXPORT PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX; -GLXEW_FUN_EXPORT PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX; -GLXEW_FUN_EXPORT PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX; - -GLXEW_FUN_EXPORT PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX; - -GLXEW_FUN_EXPORT PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX; - -GLXEW_FUN_EXPORT PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX; -GLXEW_FUN_EXPORT PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX; -GLXEW_FUN_EXPORT PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX; - -GLXEW_FUN_EXPORT PFNGLXCUSHIONSGIPROC __glewXCushionSGI; - -GLXEW_FUN_EXPORT PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI; -GLXEW_FUN_EXPORT PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI; - -GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI; - -GLXEW_FUN_EXPORT PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI; -GLXEW_FUN_EXPORT PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI; - -GLXEW_FUN_EXPORT PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN; - -GLXEW_FUN_EXPORT PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN; -GLXEW_FUN_EXPORT PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN; - -#if defined(GLEW_MX) -struct GLXEWContextStruct -{ -#endif /* GLEW_MX */ - -GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_0; -GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_1; -GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_2; -GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_3; -GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_4; -GLXEW_VAR_EXPORT GLboolean __GLXEW_3DFX_multisample; -GLXEW_VAR_EXPORT GLboolean __GLXEW_AMD_gpu_association; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_context_flush_control; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_profile; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_robustness; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_fbconfig_float; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_framebuffer_sRGB; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_get_proc_address; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_multisample; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_robustness_application_isolation; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_robustness_share_group_isolation; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_vertex_buffer_object; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_pixel_format_float; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_render_texture; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_buffer_age; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es2_profile; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es_profile; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_fbconfig_packed_float; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_framebuffer_sRGB; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_import_context; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_scene_marker; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_stereo_tree; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_swap_control; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_swap_control_tear; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_texture_from_pixmap; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_visual_info; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_visual_rating; -GLXEW_VAR_EXPORT GLboolean __GLXEW_INTEL_swap_event; -GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_agp_offset; -GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_copy_sub_buffer; -GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_pixmap_colormap; -GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_query_renderer; -GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_release_buffers; -GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_set_3dfx_mode; -GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_swap_control; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_copy_buffer; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_copy_image; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_delay_before_swap; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_float_buffer; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_multisample_coverage; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_present_video; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_swap_group; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_vertex_array_range; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_capture; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_out; -GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_swap_method; -GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_sync_control; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_blended_overlay; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_color_range; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_multisample; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_shared_multisample; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_fbconfig; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_hyperpipe; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_pbuffer; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_swap_barrier; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_swap_group; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_video_resize; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_visual_select_group; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_cushion; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_make_current_read; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_swap_control; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_video_sync; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SUN_get_transparent_index; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SUN_video_resize; - -#ifdef GLEW_MX -}; /* GLXEWContextStruct */ -#endif /* GLEW_MX */ - -/* ------------------------------------------------------------------------ */ - -#ifdef GLEW_MX - -typedef struct GLXEWContextStruct GLXEWContext; -GLEWAPI GLenum GLEWAPIENTRY glxewContextInit (GLXEWContext *ctx); -GLEWAPI GLboolean GLEWAPIENTRY glxewContextIsSupported (const GLXEWContext *ctx, const char *name); - -#define glxewInit() glxewContextInit(glxewGetContext()) -#define glxewIsSupported(x) glxewContextIsSupported(glxewGetContext(), x) - -#define GLXEW_GET_VAR(x) (*(const GLboolean*)&(glxewGetContext()->x)) -#define GLXEW_GET_FUN(x) x - -#else /* GLEW_MX */ - -GLEWAPI GLenum GLEWAPIENTRY glxewInit (); -GLEWAPI GLboolean GLEWAPIENTRY glxewIsSupported (const char *name); - -#define GLXEW_GET_VAR(x) (*(const GLboolean*)&x) -#define GLXEW_GET_FUN(x) x - -#endif /* GLEW_MX */ - -GLEWAPI GLboolean GLEWAPIENTRY glxewGetExtension (const char *name); - -#ifdef __cplusplus -} -#endif - -#endif /* __glxew_h__ */ diff --git a/deps/GLEW/glew/include/GL/wglew.h b/deps/GLEW/glew/include/GL/wglew.h deleted file mode 100644 index c13c54a5ff0..00000000000 --- a/deps/GLEW/glew/include/GL/wglew.h +++ /dev/null @@ -1,1456 +0,0 @@ -/* -** The OpenGL Extension Wrangler Library -** Copyright (C) 2008-2015, Nigel Stewart -** Copyright (C) 2002-2008, Milan Ikits -** Copyright (C) 2002-2008, Marcelo E. Magallon -** Copyright (C) 2002, Lev Povalahev -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are met: -** -** * Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** * The name of the author may be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -** THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* -** Copyright (c) 2007 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ - -#ifndef __wglew_h__ -#define __wglew_h__ -#define __WGLEW_H__ - -#ifdef __wglext_h_ -#error wglext.h included before wglew.h -#endif - -#define __wglext_h_ - -#if !defined(WINAPI) -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN 1 -# endif -# ifdef NOGDI -# undef NOGDI -# endif -#include -# undef WIN32_LEAN_AND_MEAN -#endif - -/* - * GLEW_STATIC needs to be set when using the static version. - * GLEW_BUILD is set when building the DLL version. - */ -#ifdef GLEW_STATIC -# define GLEWAPI extern -#else -# ifdef GLEW_BUILD -# define GLEWAPI extern __declspec(dllexport) -# else -# define GLEWAPI extern __declspec(dllimport) -# endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* -------------------------- WGL_3DFX_multisample ------------------------- */ - -#ifndef WGL_3DFX_multisample -#define WGL_3DFX_multisample 1 - -#define WGL_SAMPLE_BUFFERS_3DFX 0x2060 -#define WGL_SAMPLES_3DFX 0x2061 - -#define WGLEW_3DFX_multisample WGLEW_GET_VAR(__WGLEW_3DFX_multisample) - -#endif /* WGL_3DFX_multisample */ - -/* ------------------------- WGL_3DL_stereo_control ------------------------ */ - -#ifndef WGL_3DL_stereo_control -#define WGL_3DL_stereo_control 1 - -#define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055 -#define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056 -#define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057 -#define WGL_STEREO_POLARITY_INVERT_3DL 0x2058 - -typedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState); - -#define wglSetStereoEmitterState3DL WGLEW_GET_FUN(__wglewSetStereoEmitterState3DL) - -#define WGLEW_3DL_stereo_control WGLEW_GET_VAR(__WGLEW_3DL_stereo_control) - -#endif /* WGL_3DL_stereo_control */ - -/* ------------------------ WGL_AMD_gpu_association ------------------------ */ - -#ifndef WGL_AMD_gpu_association -#define WGL_AMD_gpu_association 1 - -#define WGL_GPU_VENDOR_AMD 0x1F00 -#define WGL_GPU_RENDERER_STRING_AMD 0x1F01 -#define WGL_GPU_OPENGL_VERSION_STRING_AMD 0x1F02 -#define WGL_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2 -#define WGL_GPU_RAM_AMD 0x21A3 -#define WGL_GPU_CLOCK_AMD 0x21A4 -#define WGL_GPU_NUM_PIPES_AMD 0x21A5 -#define WGL_GPU_NUM_SIMD_AMD 0x21A6 -#define WGL_GPU_NUM_RB_AMD 0x21A7 -#define WGL_GPU_NUM_SPI_AMD 0x21A8 - -typedef VOID (WINAPI * PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC) (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC) (UINT id); -typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (UINT id, HGLRC hShareContext, const int* attribList); -typedef BOOL (WINAPI * PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC) (HGLRC hglrc); -typedef UINT (WINAPI * PFNWGLGETCONTEXTGPUIDAMDPROC) (HGLRC hglrc); -typedef HGLRC (WINAPI * PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void); -typedef UINT (WINAPI * PFNWGLGETGPUIDSAMDPROC) (UINT maxCount, UINT* ids); -typedef INT (WINAPI * PFNWGLGETGPUINFOAMDPROC) (UINT id, INT property, GLenum dataType, UINT size, void* data); -typedef BOOL (WINAPI * PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (HGLRC hglrc); - -#define wglBlitContextFramebufferAMD WGLEW_GET_FUN(__wglewBlitContextFramebufferAMD) -#define wglCreateAssociatedContextAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAMD) -#define wglCreateAssociatedContextAttribsAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAttribsAMD) -#define wglDeleteAssociatedContextAMD WGLEW_GET_FUN(__wglewDeleteAssociatedContextAMD) -#define wglGetContextGPUIDAMD WGLEW_GET_FUN(__wglewGetContextGPUIDAMD) -#define wglGetCurrentAssociatedContextAMD WGLEW_GET_FUN(__wglewGetCurrentAssociatedContextAMD) -#define wglGetGPUIDsAMD WGLEW_GET_FUN(__wglewGetGPUIDsAMD) -#define wglGetGPUInfoAMD WGLEW_GET_FUN(__wglewGetGPUInfoAMD) -#define wglMakeAssociatedContextCurrentAMD WGLEW_GET_FUN(__wglewMakeAssociatedContextCurrentAMD) - -#define WGLEW_AMD_gpu_association WGLEW_GET_VAR(__WGLEW_AMD_gpu_association) - -#endif /* WGL_AMD_gpu_association */ - -/* ------------------------- WGL_ARB_buffer_region ------------------------- */ - -#ifndef WGL_ARB_buffer_region -#define WGL_ARB_buffer_region 1 - -#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001 -#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002 -#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004 -#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008 - -typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType); -typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion); -typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); -typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height); - -#define wglCreateBufferRegionARB WGLEW_GET_FUN(__wglewCreateBufferRegionARB) -#define wglDeleteBufferRegionARB WGLEW_GET_FUN(__wglewDeleteBufferRegionARB) -#define wglRestoreBufferRegionARB WGLEW_GET_FUN(__wglewRestoreBufferRegionARB) -#define wglSaveBufferRegionARB WGLEW_GET_FUN(__wglewSaveBufferRegionARB) - -#define WGLEW_ARB_buffer_region WGLEW_GET_VAR(__WGLEW_ARB_buffer_region) - -#endif /* WGL_ARB_buffer_region */ - -/* --------------------- WGL_ARB_context_flush_control --------------------- */ - -#ifndef WGL_ARB_context_flush_control -#define WGL_ARB_context_flush_control 1 - -#define WGL_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB 0x0000 -#define WGL_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097 -#define WGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB 0x2098 - -#define WGLEW_ARB_context_flush_control WGLEW_GET_VAR(__WGLEW_ARB_context_flush_control) - -#endif /* WGL_ARB_context_flush_control */ - -/* ------------------------- WGL_ARB_create_context ------------------------ */ - -#ifndef WGL_ARB_create_context -#define WGL_ARB_create_context 1 - -#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 -#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 -#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 -#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 -#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 -#define WGL_CONTEXT_FLAGS_ARB 0x2094 -#define ERROR_INVALID_VERSION_ARB 0x2095 -#define ERROR_INVALID_PROFILE_ARB 0x2096 - -typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int* attribList); - -#define wglCreateContextAttribsARB WGLEW_GET_FUN(__wglewCreateContextAttribsARB) - -#define WGLEW_ARB_create_context WGLEW_GET_VAR(__WGLEW_ARB_create_context) - -#endif /* WGL_ARB_create_context */ - -/* --------------------- WGL_ARB_create_context_profile -------------------- */ - -#ifndef WGL_ARB_create_context_profile -#define WGL_ARB_create_context_profile 1 - -#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 -#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 -#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 - -#define WGLEW_ARB_create_context_profile WGLEW_GET_VAR(__WGLEW_ARB_create_context_profile) - -#endif /* WGL_ARB_create_context_profile */ - -/* ------------------- WGL_ARB_create_context_robustness ------------------- */ - -#ifndef WGL_ARB_create_context_robustness -#define WGL_ARB_create_context_robustness 1 - -#define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 -#define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 -#define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 -#define WGL_NO_RESET_NOTIFICATION_ARB 0x8261 - -#define WGLEW_ARB_create_context_robustness WGLEW_GET_VAR(__WGLEW_ARB_create_context_robustness) - -#endif /* WGL_ARB_create_context_robustness */ - -/* ----------------------- WGL_ARB_extensions_string ----------------------- */ - -#ifndef WGL_ARB_extensions_string -#define WGL_ARB_extensions_string 1 - -typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); - -#define wglGetExtensionsStringARB WGLEW_GET_FUN(__wglewGetExtensionsStringARB) - -#define WGLEW_ARB_extensions_string WGLEW_GET_VAR(__WGLEW_ARB_extensions_string) - -#endif /* WGL_ARB_extensions_string */ - -/* ------------------------ WGL_ARB_framebuffer_sRGB ----------------------- */ - -#ifndef WGL_ARB_framebuffer_sRGB -#define WGL_ARB_framebuffer_sRGB 1 - -#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9 - -#define WGLEW_ARB_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_ARB_framebuffer_sRGB) - -#endif /* WGL_ARB_framebuffer_sRGB */ - -/* ----------------------- WGL_ARB_make_current_read ----------------------- */ - -#ifndef WGL_ARB_make_current_read -#define WGL_ARB_make_current_read 1 - -#define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 -#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 - -typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (VOID); -typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); - -#define wglGetCurrentReadDCARB WGLEW_GET_FUN(__wglewGetCurrentReadDCARB) -#define wglMakeContextCurrentARB WGLEW_GET_FUN(__wglewMakeContextCurrentARB) - -#define WGLEW_ARB_make_current_read WGLEW_GET_VAR(__WGLEW_ARB_make_current_read) - -#endif /* WGL_ARB_make_current_read */ - -/* -------------------------- WGL_ARB_multisample -------------------------- */ - -#ifndef WGL_ARB_multisample -#define WGL_ARB_multisample 1 - -#define WGL_SAMPLE_BUFFERS_ARB 0x2041 -#define WGL_SAMPLES_ARB 0x2042 - -#define WGLEW_ARB_multisample WGLEW_GET_VAR(__WGLEW_ARB_multisample) - -#endif /* WGL_ARB_multisample */ - -/* ---------------------------- WGL_ARB_pbuffer ---------------------------- */ - -#ifndef WGL_ARB_pbuffer -#define WGL_ARB_pbuffer 1 - -#define WGL_DRAW_TO_PBUFFER_ARB 0x202D -#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E -#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F -#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 -#define WGL_PBUFFER_LARGEST_ARB 0x2033 -#define WGL_PBUFFER_WIDTH_ARB 0x2034 -#define WGL_PBUFFER_HEIGHT_ARB 0x2035 -#define WGL_PBUFFER_LOST_ARB 0x2036 - -DECLARE_HANDLE(HPBUFFERARB); - -typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); -typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); -typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); -typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int* piValue); -typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); - -#define wglCreatePbufferARB WGLEW_GET_FUN(__wglewCreatePbufferARB) -#define wglDestroyPbufferARB WGLEW_GET_FUN(__wglewDestroyPbufferARB) -#define wglGetPbufferDCARB WGLEW_GET_FUN(__wglewGetPbufferDCARB) -#define wglQueryPbufferARB WGLEW_GET_FUN(__wglewQueryPbufferARB) -#define wglReleasePbufferDCARB WGLEW_GET_FUN(__wglewReleasePbufferDCARB) - -#define WGLEW_ARB_pbuffer WGLEW_GET_VAR(__WGLEW_ARB_pbuffer) - -#endif /* WGL_ARB_pbuffer */ - -/* -------------------------- WGL_ARB_pixel_format ------------------------- */ - -#ifndef WGL_ARB_pixel_format -#define WGL_ARB_pixel_format 1 - -#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 -#define WGL_DRAW_TO_WINDOW_ARB 0x2001 -#define WGL_DRAW_TO_BITMAP_ARB 0x2002 -#define WGL_ACCELERATION_ARB 0x2003 -#define WGL_NEED_PALETTE_ARB 0x2004 -#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 -#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 -#define WGL_SWAP_METHOD_ARB 0x2007 -#define WGL_NUMBER_OVERLAYS_ARB 0x2008 -#define WGL_NUMBER_UNDERLAYS_ARB 0x2009 -#define WGL_TRANSPARENT_ARB 0x200A -#define WGL_SHARE_DEPTH_ARB 0x200C -#define WGL_SHARE_STENCIL_ARB 0x200D -#define WGL_SHARE_ACCUM_ARB 0x200E -#define WGL_SUPPORT_GDI_ARB 0x200F -#define WGL_SUPPORT_OPENGL_ARB 0x2010 -#define WGL_DOUBLE_BUFFER_ARB 0x2011 -#define WGL_STEREO_ARB 0x2012 -#define WGL_PIXEL_TYPE_ARB 0x2013 -#define WGL_COLOR_BITS_ARB 0x2014 -#define WGL_RED_BITS_ARB 0x2015 -#define WGL_RED_SHIFT_ARB 0x2016 -#define WGL_GREEN_BITS_ARB 0x2017 -#define WGL_GREEN_SHIFT_ARB 0x2018 -#define WGL_BLUE_BITS_ARB 0x2019 -#define WGL_BLUE_SHIFT_ARB 0x201A -#define WGL_ALPHA_BITS_ARB 0x201B -#define WGL_ALPHA_SHIFT_ARB 0x201C -#define WGL_ACCUM_BITS_ARB 0x201D -#define WGL_ACCUM_RED_BITS_ARB 0x201E -#define WGL_ACCUM_GREEN_BITS_ARB 0x201F -#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 -#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 -#define WGL_DEPTH_BITS_ARB 0x2022 -#define WGL_STENCIL_BITS_ARB 0x2023 -#define WGL_AUX_BUFFERS_ARB 0x2024 -#define WGL_NO_ACCELERATION_ARB 0x2025 -#define WGL_GENERIC_ACCELERATION_ARB 0x2026 -#define WGL_FULL_ACCELERATION_ARB 0x2027 -#define WGL_SWAP_EXCHANGE_ARB 0x2028 -#define WGL_SWAP_COPY_ARB 0x2029 -#define WGL_SWAP_UNDEFINED_ARB 0x202A -#define WGL_TYPE_RGBA_ARB 0x202B -#define WGL_TYPE_COLORINDEX_ARB 0x202C -#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 -#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 -#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 -#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A -#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B - -typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, FLOAT *pfValues); -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, int *piValues); - -#define wglChoosePixelFormatARB WGLEW_GET_FUN(__wglewChoosePixelFormatARB) -#define wglGetPixelFormatAttribfvARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvARB) -#define wglGetPixelFormatAttribivARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribivARB) - -#define WGLEW_ARB_pixel_format WGLEW_GET_VAR(__WGLEW_ARB_pixel_format) - -#endif /* WGL_ARB_pixel_format */ - -/* ----------------------- WGL_ARB_pixel_format_float ---------------------- */ - -#ifndef WGL_ARB_pixel_format_float -#define WGL_ARB_pixel_format_float 1 - -#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0 - -#define WGLEW_ARB_pixel_format_float WGLEW_GET_VAR(__WGLEW_ARB_pixel_format_float) - -#endif /* WGL_ARB_pixel_format_float */ - -/* ------------------------- WGL_ARB_render_texture ------------------------ */ - -#ifndef WGL_ARB_render_texture -#define WGL_ARB_render_texture 1 - -#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 -#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 -#define WGL_TEXTURE_FORMAT_ARB 0x2072 -#define WGL_TEXTURE_TARGET_ARB 0x2073 -#define WGL_MIPMAP_TEXTURE_ARB 0x2074 -#define WGL_TEXTURE_RGB_ARB 0x2075 -#define WGL_TEXTURE_RGBA_ARB 0x2076 -#define WGL_NO_TEXTURE_ARB 0x2077 -#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078 -#define WGL_TEXTURE_1D_ARB 0x2079 -#define WGL_TEXTURE_2D_ARB 0x207A -#define WGL_MIPMAP_LEVEL_ARB 0x207B -#define WGL_CUBE_MAP_FACE_ARB 0x207C -#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D -#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E -#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F -#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 -#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 -#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 -#define WGL_FRONT_LEFT_ARB 0x2083 -#define WGL_FRONT_RIGHT_ARB 0x2084 -#define WGL_BACK_LEFT_ARB 0x2085 -#define WGL_BACK_RIGHT_ARB 0x2086 -#define WGL_AUX0_ARB 0x2087 -#define WGL_AUX1_ARB 0x2088 -#define WGL_AUX2_ARB 0x2089 -#define WGL_AUX3_ARB 0x208A -#define WGL_AUX4_ARB 0x208B -#define WGL_AUX5_ARB 0x208C -#define WGL_AUX6_ARB 0x208D -#define WGL_AUX7_ARB 0x208E -#define WGL_AUX8_ARB 0x208F -#define WGL_AUX9_ARB 0x2090 - -typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); -typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); -typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int* piAttribList); - -#define wglBindTexImageARB WGLEW_GET_FUN(__wglewBindTexImageARB) -#define wglReleaseTexImageARB WGLEW_GET_FUN(__wglewReleaseTexImageARB) -#define wglSetPbufferAttribARB WGLEW_GET_FUN(__wglewSetPbufferAttribARB) - -#define WGLEW_ARB_render_texture WGLEW_GET_VAR(__WGLEW_ARB_render_texture) - -#endif /* WGL_ARB_render_texture */ - -/* ---------------- WGL_ARB_robustness_application_isolation --------------- */ - -#ifndef WGL_ARB_robustness_application_isolation -#define WGL_ARB_robustness_application_isolation 1 - -#define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 - -#define WGLEW_ARB_robustness_application_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_application_isolation) - -#endif /* WGL_ARB_robustness_application_isolation */ - -/* ---------------- WGL_ARB_robustness_share_group_isolation --------------- */ - -#ifndef WGL_ARB_robustness_share_group_isolation -#define WGL_ARB_robustness_share_group_isolation 1 - -#define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 - -#define WGLEW_ARB_robustness_share_group_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_share_group_isolation) - -#endif /* WGL_ARB_robustness_share_group_isolation */ - -/* ----------------------- WGL_ATI_pixel_format_float ---------------------- */ - -#ifndef WGL_ATI_pixel_format_float -#define WGL_ATI_pixel_format_float 1 - -#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0 -#define GL_RGBA_FLOAT_MODE_ATI 0x8820 -#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 - -#define WGLEW_ATI_pixel_format_float WGLEW_GET_VAR(__WGLEW_ATI_pixel_format_float) - -#endif /* WGL_ATI_pixel_format_float */ - -/* -------------------- WGL_ATI_render_texture_rectangle ------------------- */ - -#ifndef WGL_ATI_render_texture_rectangle -#define WGL_ATI_render_texture_rectangle 1 - -#define WGL_TEXTURE_RECTANGLE_ATI 0x21A5 - -#define WGLEW_ATI_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_ATI_render_texture_rectangle) - -#endif /* WGL_ATI_render_texture_rectangle */ - -/* ------------------- WGL_EXT_create_context_es2_profile ------------------ */ - -#ifndef WGL_EXT_create_context_es2_profile -#define WGL_EXT_create_context_es2_profile 1 - -#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 - -#define WGLEW_EXT_create_context_es2_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es2_profile) - -#endif /* WGL_EXT_create_context_es2_profile */ - -/* ------------------- WGL_EXT_create_context_es_profile ------------------- */ - -#ifndef WGL_EXT_create_context_es_profile -#define WGL_EXT_create_context_es_profile 1 - -#define WGL_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004 - -#define WGLEW_EXT_create_context_es_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es_profile) - -#endif /* WGL_EXT_create_context_es_profile */ - -/* -------------------------- WGL_EXT_depth_float -------------------------- */ - -#ifndef WGL_EXT_depth_float -#define WGL_EXT_depth_float 1 - -#define WGL_DEPTH_FLOAT_EXT 0x2040 - -#define WGLEW_EXT_depth_float WGLEW_GET_VAR(__WGLEW_EXT_depth_float) - -#endif /* WGL_EXT_depth_float */ - -/* ---------------------- WGL_EXT_display_color_table ---------------------- */ - -#ifndef WGL_EXT_display_color_table -#define WGL_EXT_display_color_table 1 - -typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id); -typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id); -typedef void (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id); -typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (GLushort* table, GLuint length); - -#define wglBindDisplayColorTableEXT WGLEW_GET_FUN(__wglewBindDisplayColorTableEXT) -#define wglCreateDisplayColorTableEXT WGLEW_GET_FUN(__wglewCreateDisplayColorTableEXT) -#define wglDestroyDisplayColorTableEXT WGLEW_GET_FUN(__wglewDestroyDisplayColorTableEXT) -#define wglLoadDisplayColorTableEXT WGLEW_GET_FUN(__wglewLoadDisplayColorTableEXT) - -#define WGLEW_EXT_display_color_table WGLEW_GET_VAR(__WGLEW_EXT_display_color_table) - -#endif /* WGL_EXT_display_color_table */ - -/* ----------------------- WGL_EXT_extensions_string ----------------------- */ - -#ifndef WGL_EXT_extensions_string -#define WGL_EXT_extensions_string 1 - -typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void); - -#define wglGetExtensionsStringEXT WGLEW_GET_FUN(__wglewGetExtensionsStringEXT) - -#define WGLEW_EXT_extensions_string WGLEW_GET_VAR(__WGLEW_EXT_extensions_string) - -#endif /* WGL_EXT_extensions_string */ - -/* ------------------------ WGL_EXT_framebuffer_sRGB ----------------------- */ - -#ifndef WGL_EXT_framebuffer_sRGB -#define WGL_EXT_framebuffer_sRGB 1 - -#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9 - -#define WGLEW_EXT_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_EXT_framebuffer_sRGB) - -#endif /* WGL_EXT_framebuffer_sRGB */ - -/* ----------------------- WGL_EXT_make_current_read ----------------------- */ - -#ifndef WGL_EXT_make_current_read -#define WGL_EXT_make_current_read 1 - -#define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043 - -typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (VOID); -typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); - -#define wglGetCurrentReadDCEXT WGLEW_GET_FUN(__wglewGetCurrentReadDCEXT) -#define wglMakeContextCurrentEXT WGLEW_GET_FUN(__wglewMakeContextCurrentEXT) - -#define WGLEW_EXT_make_current_read WGLEW_GET_VAR(__WGLEW_EXT_make_current_read) - -#endif /* WGL_EXT_make_current_read */ - -/* -------------------------- WGL_EXT_multisample -------------------------- */ - -#ifndef WGL_EXT_multisample -#define WGL_EXT_multisample 1 - -#define WGL_SAMPLE_BUFFERS_EXT 0x2041 -#define WGL_SAMPLES_EXT 0x2042 - -#define WGLEW_EXT_multisample WGLEW_GET_VAR(__WGLEW_EXT_multisample) - -#endif /* WGL_EXT_multisample */ - -/* ---------------------------- WGL_EXT_pbuffer ---------------------------- */ - -#ifndef WGL_EXT_pbuffer -#define WGL_EXT_pbuffer 1 - -#define WGL_DRAW_TO_PBUFFER_EXT 0x202D -#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E -#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F -#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030 -#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031 -#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032 -#define WGL_PBUFFER_LARGEST_EXT 0x2033 -#define WGL_PBUFFER_WIDTH_EXT 0x2034 -#define WGL_PBUFFER_HEIGHT_EXT 0x2035 - -DECLARE_HANDLE(HPBUFFEREXT); - -typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); -typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer); -typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer); -typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int* piValue); -typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC); - -#define wglCreatePbufferEXT WGLEW_GET_FUN(__wglewCreatePbufferEXT) -#define wglDestroyPbufferEXT WGLEW_GET_FUN(__wglewDestroyPbufferEXT) -#define wglGetPbufferDCEXT WGLEW_GET_FUN(__wglewGetPbufferDCEXT) -#define wglQueryPbufferEXT WGLEW_GET_FUN(__wglewQueryPbufferEXT) -#define wglReleasePbufferDCEXT WGLEW_GET_FUN(__wglewReleasePbufferDCEXT) - -#define WGLEW_EXT_pbuffer WGLEW_GET_VAR(__WGLEW_EXT_pbuffer) - -#endif /* WGL_EXT_pbuffer */ - -/* -------------------------- WGL_EXT_pixel_format ------------------------- */ - -#ifndef WGL_EXT_pixel_format -#define WGL_EXT_pixel_format 1 - -#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000 -#define WGL_DRAW_TO_WINDOW_EXT 0x2001 -#define WGL_DRAW_TO_BITMAP_EXT 0x2002 -#define WGL_ACCELERATION_EXT 0x2003 -#define WGL_NEED_PALETTE_EXT 0x2004 -#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005 -#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006 -#define WGL_SWAP_METHOD_EXT 0x2007 -#define WGL_NUMBER_OVERLAYS_EXT 0x2008 -#define WGL_NUMBER_UNDERLAYS_EXT 0x2009 -#define WGL_TRANSPARENT_EXT 0x200A -#define WGL_TRANSPARENT_VALUE_EXT 0x200B -#define WGL_SHARE_DEPTH_EXT 0x200C -#define WGL_SHARE_STENCIL_EXT 0x200D -#define WGL_SHARE_ACCUM_EXT 0x200E -#define WGL_SUPPORT_GDI_EXT 0x200F -#define WGL_SUPPORT_OPENGL_EXT 0x2010 -#define WGL_DOUBLE_BUFFER_EXT 0x2011 -#define WGL_STEREO_EXT 0x2012 -#define WGL_PIXEL_TYPE_EXT 0x2013 -#define WGL_COLOR_BITS_EXT 0x2014 -#define WGL_RED_BITS_EXT 0x2015 -#define WGL_RED_SHIFT_EXT 0x2016 -#define WGL_GREEN_BITS_EXT 0x2017 -#define WGL_GREEN_SHIFT_EXT 0x2018 -#define WGL_BLUE_BITS_EXT 0x2019 -#define WGL_BLUE_SHIFT_EXT 0x201A -#define WGL_ALPHA_BITS_EXT 0x201B -#define WGL_ALPHA_SHIFT_EXT 0x201C -#define WGL_ACCUM_BITS_EXT 0x201D -#define WGL_ACCUM_RED_BITS_EXT 0x201E -#define WGL_ACCUM_GREEN_BITS_EXT 0x201F -#define WGL_ACCUM_BLUE_BITS_EXT 0x2020 -#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021 -#define WGL_DEPTH_BITS_EXT 0x2022 -#define WGL_STENCIL_BITS_EXT 0x2023 -#define WGL_AUX_BUFFERS_EXT 0x2024 -#define WGL_NO_ACCELERATION_EXT 0x2025 -#define WGL_GENERIC_ACCELERATION_EXT 0x2026 -#define WGL_FULL_ACCELERATION_EXT 0x2027 -#define WGL_SWAP_EXCHANGE_EXT 0x2028 -#define WGL_SWAP_COPY_EXT 0x2029 -#define WGL_SWAP_UNDEFINED_EXT 0x202A -#define WGL_TYPE_RGBA_EXT 0x202B -#define WGL_TYPE_COLORINDEX_EXT 0x202C - -typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, FLOAT *pfValues); -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, int *piValues); - -#define wglChoosePixelFormatEXT WGLEW_GET_FUN(__wglewChoosePixelFormatEXT) -#define wglGetPixelFormatAttribfvEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvEXT) -#define wglGetPixelFormatAttribivEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribivEXT) - -#define WGLEW_EXT_pixel_format WGLEW_GET_VAR(__WGLEW_EXT_pixel_format) - -#endif /* WGL_EXT_pixel_format */ - -/* ------------------- WGL_EXT_pixel_format_packed_float ------------------- */ - -#ifndef WGL_EXT_pixel_format_packed_float -#define WGL_EXT_pixel_format_packed_float 1 - -#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8 - -#define WGLEW_EXT_pixel_format_packed_float WGLEW_GET_VAR(__WGLEW_EXT_pixel_format_packed_float) - -#endif /* WGL_EXT_pixel_format_packed_float */ - -/* -------------------------- WGL_EXT_swap_control ------------------------- */ - -#ifndef WGL_EXT_swap_control -#define WGL_EXT_swap_control 1 - -typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void); -typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); - -#define wglGetSwapIntervalEXT WGLEW_GET_FUN(__wglewGetSwapIntervalEXT) -#define wglSwapIntervalEXT WGLEW_GET_FUN(__wglewSwapIntervalEXT) - -#define WGLEW_EXT_swap_control WGLEW_GET_VAR(__WGLEW_EXT_swap_control) - -#endif /* WGL_EXT_swap_control */ - -/* ----------------------- WGL_EXT_swap_control_tear ----------------------- */ - -#ifndef WGL_EXT_swap_control_tear -#define WGL_EXT_swap_control_tear 1 - -#define WGLEW_EXT_swap_control_tear WGLEW_GET_VAR(__WGLEW_EXT_swap_control_tear) - -#endif /* WGL_EXT_swap_control_tear */ - -/* --------------------- WGL_I3D_digital_video_control --------------------- */ - -#ifndef WGL_I3D_digital_video_control -#define WGL_I3D_digital_video_control 1 - -#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050 -#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051 -#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052 -#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053 - -typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); -typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); - -#define wglGetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewGetDigitalVideoParametersI3D) -#define wglSetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewSetDigitalVideoParametersI3D) - -#define WGLEW_I3D_digital_video_control WGLEW_GET_VAR(__WGLEW_I3D_digital_video_control) - -#endif /* WGL_I3D_digital_video_control */ - -/* ----------------------------- WGL_I3D_gamma ----------------------------- */ - -#ifndef WGL_I3D_gamma -#define WGL_I3D_gamma 1 - -#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E -#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F - -typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT* puRed, USHORT *puGreen, USHORT *puBlue); -typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); -typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT* puRed, const USHORT *puGreen, const USHORT *puBlue); -typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); - -#define wglGetGammaTableI3D WGLEW_GET_FUN(__wglewGetGammaTableI3D) -#define wglGetGammaTableParametersI3D WGLEW_GET_FUN(__wglewGetGammaTableParametersI3D) -#define wglSetGammaTableI3D WGLEW_GET_FUN(__wglewSetGammaTableI3D) -#define wglSetGammaTableParametersI3D WGLEW_GET_FUN(__wglewSetGammaTableParametersI3D) - -#define WGLEW_I3D_gamma WGLEW_GET_VAR(__WGLEW_I3D_gamma) - -#endif /* WGL_I3D_gamma */ - -/* ---------------------------- WGL_I3D_genlock ---------------------------- */ - -#ifndef WGL_I3D_genlock -#define WGL_I3D_genlock 1 - -#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044 -#define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045 -#define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046 -#define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047 -#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048 -#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049 -#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A -#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B -#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C - -typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC); -typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC); -typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate); -typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay); -typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge); -typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource); -typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT* uRate); -typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT* uDelay); -typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT* uEdge); -typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT* uSource); -typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL* pFlag); -typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT* uMaxLineDelay, UINT *uMaxPixelDelay); - -#define wglDisableGenlockI3D WGLEW_GET_FUN(__wglewDisableGenlockI3D) -#define wglEnableGenlockI3D WGLEW_GET_FUN(__wglewEnableGenlockI3D) -#define wglGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGenlockSampleRateI3D) -#define wglGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGenlockSourceDelayI3D) -#define wglGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGenlockSourceEdgeI3D) -#define wglGenlockSourceI3D WGLEW_GET_FUN(__wglewGenlockSourceI3D) -#define wglGetGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGetGenlockSampleRateI3D) -#define wglGetGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGetGenlockSourceDelayI3D) -#define wglGetGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGetGenlockSourceEdgeI3D) -#define wglGetGenlockSourceI3D WGLEW_GET_FUN(__wglewGetGenlockSourceI3D) -#define wglIsEnabledGenlockI3D WGLEW_GET_FUN(__wglewIsEnabledGenlockI3D) -#define wglQueryGenlockMaxSourceDelayI3D WGLEW_GET_FUN(__wglewQueryGenlockMaxSourceDelayI3D) - -#define WGLEW_I3D_genlock WGLEW_GET_VAR(__WGLEW_I3D_genlock) - -#endif /* WGL_I3D_genlock */ - -/* -------------------------- WGL_I3D_image_buffer ------------------------- */ - -#ifndef WGL_I3D_image_buffer -#define WGL_I3D_image_buffer 1 - -#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001 -#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002 - -typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, HANDLE* pEvent, LPVOID *pAddress, DWORD *pSize, UINT count); -typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags); -typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress); -typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, LPVOID* pAddress, UINT count); - -#define wglAssociateImageBufferEventsI3D WGLEW_GET_FUN(__wglewAssociateImageBufferEventsI3D) -#define wglCreateImageBufferI3D WGLEW_GET_FUN(__wglewCreateImageBufferI3D) -#define wglDestroyImageBufferI3D WGLEW_GET_FUN(__wglewDestroyImageBufferI3D) -#define wglReleaseImageBufferEventsI3D WGLEW_GET_FUN(__wglewReleaseImageBufferEventsI3D) - -#define WGLEW_I3D_image_buffer WGLEW_GET_VAR(__WGLEW_I3D_image_buffer) - -#endif /* WGL_I3D_image_buffer */ - -/* ------------------------ WGL_I3D_swap_frame_lock ------------------------ */ - -#ifndef WGL_I3D_swap_frame_lock -#define WGL_I3D_swap_frame_lock 1 - -typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (VOID); -typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (VOID); -typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL* pFlag); -typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL* pFlag); - -#define wglDisableFrameLockI3D WGLEW_GET_FUN(__wglewDisableFrameLockI3D) -#define wglEnableFrameLockI3D WGLEW_GET_FUN(__wglewEnableFrameLockI3D) -#define wglIsEnabledFrameLockI3D WGLEW_GET_FUN(__wglewIsEnabledFrameLockI3D) -#define wglQueryFrameLockMasterI3D WGLEW_GET_FUN(__wglewQueryFrameLockMasterI3D) - -#define WGLEW_I3D_swap_frame_lock WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_lock) - -#endif /* WGL_I3D_swap_frame_lock */ - -/* ------------------------ WGL_I3D_swap_frame_usage ----------------------- */ - -#ifndef WGL_I3D_swap_frame_usage -#define WGL_I3D_swap_frame_usage 1 - -typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void); -typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void); -typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float* pUsage); -typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD* pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage); - -#define wglBeginFrameTrackingI3D WGLEW_GET_FUN(__wglewBeginFrameTrackingI3D) -#define wglEndFrameTrackingI3D WGLEW_GET_FUN(__wglewEndFrameTrackingI3D) -#define wglGetFrameUsageI3D WGLEW_GET_FUN(__wglewGetFrameUsageI3D) -#define wglQueryFrameTrackingI3D WGLEW_GET_FUN(__wglewQueryFrameTrackingI3D) - -#define WGLEW_I3D_swap_frame_usage WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_usage) - -#endif /* WGL_I3D_swap_frame_usage */ - -/* --------------------------- WGL_NV_DX_interop --------------------------- */ - -#ifndef WGL_NV_DX_interop -#define WGL_NV_DX_interop 1 - -#define WGL_ACCESS_READ_ONLY_NV 0x0000 -#define WGL_ACCESS_READ_WRITE_NV 0x0001 -#define WGL_ACCESS_WRITE_DISCARD_NV 0x0002 - -typedef BOOL (WINAPI * PFNWGLDXCLOSEDEVICENVPROC) (HANDLE hDevice); -typedef BOOL (WINAPI * PFNWGLDXLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects); -typedef BOOL (WINAPI * PFNWGLDXOBJECTACCESSNVPROC) (HANDLE hObject, GLenum access); -typedef HANDLE (WINAPI * PFNWGLDXOPENDEVICENVPROC) (void* dxDevice); -typedef HANDLE (WINAPI * PFNWGLDXREGISTEROBJECTNVPROC) (HANDLE hDevice, void* dxObject, GLuint name, GLenum type, GLenum access); -typedef BOOL (WINAPI * PFNWGLDXSETRESOURCESHAREHANDLENVPROC) (void* dxObject, HANDLE shareHandle); -typedef BOOL (WINAPI * PFNWGLDXUNLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects); -typedef BOOL (WINAPI * PFNWGLDXUNREGISTEROBJECTNVPROC) (HANDLE hDevice, HANDLE hObject); - -#define wglDXCloseDeviceNV WGLEW_GET_FUN(__wglewDXCloseDeviceNV) -#define wglDXLockObjectsNV WGLEW_GET_FUN(__wglewDXLockObjectsNV) -#define wglDXObjectAccessNV WGLEW_GET_FUN(__wglewDXObjectAccessNV) -#define wglDXOpenDeviceNV WGLEW_GET_FUN(__wglewDXOpenDeviceNV) -#define wglDXRegisterObjectNV WGLEW_GET_FUN(__wglewDXRegisterObjectNV) -#define wglDXSetResourceShareHandleNV WGLEW_GET_FUN(__wglewDXSetResourceShareHandleNV) -#define wglDXUnlockObjectsNV WGLEW_GET_FUN(__wglewDXUnlockObjectsNV) -#define wglDXUnregisterObjectNV WGLEW_GET_FUN(__wglewDXUnregisterObjectNV) - -#define WGLEW_NV_DX_interop WGLEW_GET_VAR(__WGLEW_NV_DX_interop) - -#endif /* WGL_NV_DX_interop */ - -/* --------------------------- WGL_NV_DX_interop2 -------------------------- */ - -#ifndef WGL_NV_DX_interop2 -#define WGL_NV_DX_interop2 1 - -#define WGLEW_NV_DX_interop2 WGLEW_GET_VAR(__WGLEW_NV_DX_interop2) - -#endif /* WGL_NV_DX_interop2 */ - -/* --------------------------- WGL_NV_copy_image --------------------------- */ - -#ifndef WGL_NV_copy_image -#define WGL_NV_copy_image 1 - -typedef BOOL (WINAPI * PFNWGLCOPYIMAGESUBDATANVPROC) (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); - -#define wglCopyImageSubDataNV WGLEW_GET_FUN(__wglewCopyImageSubDataNV) - -#define WGLEW_NV_copy_image WGLEW_GET_VAR(__WGLEW_NV_copy_image) - -#endif /* WGL_NV_copy_image */ - -/* ------------------------ WGL_NV_delay_before_swap ----------------------- */ - -#ifndef WGL_NV_delay_before_swap -#define WGL_NV_delay_before_swap 1 - -typedef BOOL (WINAPI * PFNWGLDELAYBEFORESWAPNVPROC) (HDC hDC, GLfloat seconds); - -#define wglDelayBeforeSwapNV WGLEW_GET_FUN(__wglewDelayBeforeSwapNV) - -#define WGLEW_NV_delay_before_swap WGLEW_GET_VAR(__WGLEW_NV_delay_before_swap) - -#endif /* WGL_NV_delay_before_swap */ - -/* -------------------------- WGL_NV_float_buffer -------------------------- */ - -#ifndef WGL_NV_float_buffer -#define WGL_NV_float_buffer 1 - -#define WGL_FLOAT_COMPONENTS_NV 0x20B0 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4 -#define WGL_TEXTURE_FLOAT_R_NV 0x20B5 -#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6 -#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7 -#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8 - -#define WGLEW_NV_float_buffer WGLEW_GET_VAR(__WGLEW_NV_float_buffer) - -#endif /* WGL_NV_float_buffer */ - -/* -------------------------- WGL_NV_gpu_affinity -------------------------- */ - -#ifndef WGL_NV_gpu_affinity -#define WGL_NV_gpu_affinity 1 - -#define WGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0 -#define WGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1 - -DECLARE_HANDLE(HGPUNV); -typedef struct _GPU_DEVICE { - DWORD cb; - CHAR DeviceName[32]; - CHAR DeviceString[128]; - DWORD Flags; - RECT rcVirtualScreen; -} GPU_DEVICE, *PGPU_DEVICE; - -typedef HDC (WINAPI * PFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV *phGpuList); -typedef BOOL (WINAPI * PFNWGLDELETEDCNVPROC) (HDC hdc); -typedef BOOL (WINAPI * PFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice); -typedef BOOL (WINAPI * PFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu); -typedef BOOL (WINAPI * PFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV *phGpu); - -#define wglCreateAffinityDCNV WGLEW_GET_FUN(__wglewCreateAffinityDCNV) -#define wglDeleteDCNV WGLEW_GET_FUN(__wglewDeleteDCNV) -#define wglEnumGpuDevicesNV WGLEW_GET_FUN(__wglewEnumGpuDevicesNV) -#define wglEnumGpusFromAffinityDCNV WGLEW_GET_FUN(__wglewEnumGpusFromAffinityDCNV) -#define wglEnumGpusNV WGLEW_GET_FUN(__wglewEnumGpusNV) - -#define WGLEW_NV_gpu_affinity WGLEW_GET_VAR(__WGLEW_NV_gpu_affinity) - -#endif /* WGL_NV_gpu_affinity */ - -/* ---------------------- WGL_NV_multisample_coverage ---------------------- */ - -#ifndef WGL_NV_multisample_coverage -#define WGL_NV_multisample_coverage 1 - -#define WGL_COVERAGE_SAMPLES_NV 0x2042 -#define WGL_COLOR_SAMPLES_NV 0x20B9 - -#define WGLEW_NV_multisample_coverage WGLEW_GET_VAR(__WGLEW_NV_multisample_coverage) - -#endif /* WGL_NV_multisample_coverage */ - -/* -------------------------- WGL_NV_present_video ------------------------- */ - -#ifndef WGL_NV_present_video -#define WGL_NV_present_video 1 - -#define WGL_NUM_VIDEO_SLOTS_NV 0x20F0 - -DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV); - -typedef BOOL (WINAPI * PFNWGLBINDVIDEODEVICENVPROC) (HDC hDc, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int* piAttribList); -typedef int (WINAPI * PFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDc, HVIDEOOUTPUTDEVICENV* phDeviceList); -typedef BOOL (WINAPI * PFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int* piValue); - -#define wglBindVideoDeviceNV WGLEW_GET_FUN(__wglewBindVideoDeviceNV) -#define wglEnumerateVideoDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoDevicesNV) -#define wglQueryCurrentContextNV WGLEW_GET_FUN(__wglewQueryCurrentContextNV) - -#define WGLEW_NV_present_video WGLEW_GET_VAR(__WGLEW_NV_present_video) - -#endif /* WGL_NV_present_video */ - -/* ---------------------- WGL_NV_render_depth_texture ---------------------- */ - -#ifndef WGL_NV_render_depth_texture -#define WGL_NV_render_depth_texture 1 - -#define WGL_NO_TEXTURE_ARB 0x2077 -#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 -#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 -#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 -#define WGL_DEPTH_COMPONENT_NV 0x20A7 - -#define WGLEW_NV_render_depth_texture WGLEW_GET_VAR(__WGLEW_NV_render_depth_texture) - -#endif /* WGL_NV_render_depth_texture */ - -/* -------------------- WGL_NV_render_texture_rectangle -------------------- */ - -#ifndef WGL_NV_render_texture_rectangle -#define WGL_NV_render_texture_rectangle 1 - -#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1 -#define WGL_TEXTURE_RECTANGLE_NV 0x20A2 - -#define WGLEW_NV_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_NV_render_texture_rectangle) - -#endif /* WGL_NV_render_texture_rectangle */ - -/* --------------------------- WGL_NV_swap_group --------------------------- */ - -#ifndef WGL_NV_swap_group -#define WGL_NV_swap_group 1 - -typedef BOOL (WINAPI * PFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier); -typedef BOOL (WINAPI * PFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group); -typedef BOOL (WINAPI * PFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint* count); -typedef BOOL (WINAPI * PFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint* maxGroups, GLuint *maxBarriers); -typedef BOOL (WINAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint* group, GLuint *barrier); -typedef BOOL (WINAPI * PFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC); - -#define wglBindSwapBarrierNV WGLEW_GET_FUN(__wglewBindSwapBarrierNV) -#define wglJoinSwapGroupNV WGLEW_GET_FUN(__wglewJoinSwapGroupNV) -#define wglQueryFrameCountNV WGLEW_GET_FUN(__wglewQueryFrameCountNV) -#define wglQueryMaxSwapGroupsNV WGLEW_GET_FUN(__wglewQueryMaxSwapGroupsNV) -#define wglQuerySwapGroupNV WGLEW_GET_FUN(__wglewQuerySwapGroupNV) -#define wglResetFrameCountNV WGLEW_GET_FUN(__wglewResetFrameCountNV) - -#define WGLEW_NV_swap_group WGLEW_GET_VAR(__WGLEW_NV_swap_group) - -#endif /* WGL_NV_swap_group */ - -/* ----------------------- WGL_NV_vertex_array_range ----------------------- */ - -#ifndef WGL_NV_vertex_array_range -#define WGL_NV_vertex_array_range 1 - -typedef void * (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); -typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer); - -#define wglAllocateMemoryNV WGLEW_GET_FUN(__wglewAllocateMemoryNV) -#define wglFreeMemoryNV WGLEW_GET_FUN(__wglewFreeMemoryNV) - -#define WGLEW_NV_vertex_array_range WGLEW_GET_VAR(__WGLEW_NV_vertex_array_range) - -#endif /* WGL_NV_vertex_array_range */ - -/* -------------------------- WGL_NV_video_capture ------------------------- */ - -#ifndef WGL_NV_video_capture -#define WGL_NV_video_capture 1 - -#define WGL_UNIQUE_ID_NV 0x20CE -#define WGL_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF - -DECLARE_HANDLE(HVIDEOINPUTDEVICENV); - -typedef BOOL (WINAPI * PFNWGLBINDVIDEOCAPTUREDEVICENVPROC) (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice); -typedef UINT (WINAPI * PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC) (HDC hDc, HVIDEOINPUTDEVICENV* phDeviceList); -typedef BOOL (WINAPI * PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); -typedef BOOL (WINAPI * PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int* piValue); -typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); - -#define wglBindVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewBindVideoCaptureDeviceNV) -#define wglEnumerateVideoCaptureDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoCaptureDevicesNV) -#define wglLockVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewLockVideoCaptureDeviceNV) -#define wglQueryVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewQueryVideoCaptureDeviceNV) -#define wglReleaseVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoCaptureDeviceNV) - -#define WGLEW_NV_video_capture WGLEW_GET_VAR(__WGLEW_NV_video_capture) - -#endif /* WGL_NV_video_capture */ - -/* -------------------------- WGL_NV_video_output -------------------------- */ - -#ifndef WGL_NV_video_output -#define WGL_NV_video_output 1 - -#define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0 -#define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1 -#define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2 -#define WGL_VIDEO_OUT_COLOR_NV 0x20C3 -#define WGL_VIDEO_OUT_ALPHA_NV 0x20C4 -#define WGL_VIDEO_OUT_DEPTH_NV 0x20C5 -#define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 -#define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 -#define WGL_VIDEO_OUT_FRAME 0x20C8 -#define WGL_VIDEO_OUT_FIELD_1 0x20C9 -#define WGL_VIDEO_OUT_FIELD_2 0x20CA -#define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB -#define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC - -DECLARE_HANDLE(HPVIDEODEV); - -typedef BOOL (WINAPI * PFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer); -typedef BOOL (WINAPI * PFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV* hVideoDevice); -typedef BOOL (WINAPI * PFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long* pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); -typedef BOOL (WINAPI * PFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice); -typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer); -typedef BOOL (WINAPI * PFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long* pulCounterPbuffer, BOOL bBlock); - -#define wglBindVideoImageNV WGLEW_GET_FUN(__wglewBindVideoImageNV) -#define wglGetVideoDeviceNV WGLEW_GET_FUN(__wglewGetVideoDeviceNV) -#define wglGetVideoInfoNV WGLEW_GET_FUN(__wglewGetVideoInfoNV) -#define wglReleaseVideoDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoDeviceNV) -#define wglReleaseVideoImageNV WGLEW_GET_FUN(__wglewReleaseVideoImageNV) -#define wglSendPbufferToVideoNV WGLEW_GET_FUN(__wglewSendPbufferToVideoNV) - -#define WGLEW_NV_video_output WGLEW_GET_VAR(__WGLEW_NV_video_output) - -#endif /* WGL_NV_video_output */ - -/* -------------------------- WGL_OML_sync_control ------------------------- */ - -#ifndef WGL_OML_sync_control -#define WGL_OML_sync_control 1 - -typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32* numerator, INT32 *denominator); -typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64* ust, INT64 *msc, INT64 *sbc); -typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); -typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); -typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64* ust, INT64 *msc, INT64 *sbc); -typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64* ust, INT64 *msc, INT64 *sbc); - -#define wglGetMscRateOML WGLEW_GET_FUN(__wglewGetMscRateOML) -#define wglGetSyncValuesOML WGLEW_GET_FUN(__wglewGetSyncValuesOML) -#define wglSwapBuffersMscOML WGLEW_GET_FUN(__wglewSwapBuffersMscOML) -#define wglSwapLayerBuffersMscOML WGLEW_GET_FUN(__wglewSwapLayerBuffersMscOML) -#define wglWaitForMscOML WGLEW_GET_FUN(__wglewWaitForMscOML) -#define wglWaitForSbcOML WGLEW_GET_FUN(__wglewWaitForSbcOML) - -#define WGLEW_OML_sync_control WGLEW_GET_VAR(__WGLEW_OML_sync_control) - -#endif /* WGL_OML_sync_control */ - -/* ------------------------------------------------------------------------- */ - -#ifdef GLEW_MX -#define WGLEW_FUN_EXPORT -#define WGLEW_VAR_EXPORT -#else -#define WGLEW_FUN_EXPORT GLEW_FUN_EXPORT -#define WGLEW_VAR_EXPORT GLEW_VAR_EXPORT -#endif /* GLEW_MX */ - -#ifdef GLEW_MX -struct WGLEWContextStruct -{ -#endif /* GLEW_MX */ - -WGLEW_FUN_EXPORT PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL; - -WGLEW_FUN_EXPORT PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD; -WGLEW_FUN_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD; -WGLEW_FUN_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD; -WGLEW_FUN_EXPORT PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD; -WGLEW_FUN_EXPORT PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD; -WGLEW_FUN_EXPORT PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD; -WGLEW_FUN_EXPORT PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD; -WGLEW_FUN_EXPORT PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD; -WGLEW_FUN_EXPORT PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD; - -WGLEW_FUN_EXPORT PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB; -WGLEW_FUN_EXPORT PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB; -WGLEW_FUN_EXPORT PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB; -WGLEW_FUN_EXPORT PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB; - -WGLEW_FUN_EXPORT PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB; - -WGLEW_FUN_EXPORT PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB; - -WGLEW_FUN_EXPORT PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB; -WGLEW_FUN_EXPORT PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB; - -WGLEW_FUN_EXPORT PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB; -WGLEW_FUN_EXPORT PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB; -WGLEW_FUN_EXPORT PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB; -WGLEW_FUN_EXPORT PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB; -WGLEW_FUN_EXPORT PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB; - -WGLEW_FUN_EXPORT PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB; -WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB; -WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB; - -WGLEW_FUN_EXPORT PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB; -WGLEW_FUN_EXPORT PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB; -WGLEW_FUN_EXPORT PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB; - -WGLEW_FUN_EXPORT PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT; -WGLEW_FUN_EXPORT PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT; -WGLEW_FUN_EXPORT PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT; -WGLEW_FUN_EXPORT PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT; - -WGLEW_FUN_EXPORT PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT; - -WGLEW_FUN_EXPORT PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT; -WGLEW_FUN_EXPORT PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT; - -WGLEW_FUN_EXPORT PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT; -WGLEW_FUN_EXPORT PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT; -WGLEW_FUN_EXPORT PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT; -WGLEW_FUN_EXPORT PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT; -WGLEW_FUN_EXPORT PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT; - -WGLEW_FUN_EXPORT PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT; -WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT; -WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT; - -WGLEW_FUN_EXPORT PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT; -WGLEW_FUN_EXPORT PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT; - -WGLEW_FUN_EXPORT PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D; -WGLEW_FUN_EXPORT PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D; - -WGLEW_FUN_EXPORT PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D; -WGLEW_FUN_EXPORT PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D; -WGLEW_FUN_EXPORT PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D; -WGLEW_FUN_EXPORT PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D; - -WGLEW_FUN_EXPORT PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D; -WGLEW_FUN_EXPORT PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D; -WGLEW_FUN_EXPORT PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D; -WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D; -WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D; -WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D; -WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D; -WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D; -WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D; -WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D; -WGLEW_FUN_EXPORT PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D; -WGLEW_FUN_EXPORT PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D; - -WGLEW_FUN_EXPORT PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D; -WGLEW_FUN_EXPORT PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D; -WGLEW_FUN_EXPORT PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D; -WGLEW_FUN_EXPORT PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D; - -WGLEW_FUN_EXPORT PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D; -WGLEW_FUN_EXPORT PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D; -WGLEW_FUN_EXPORT PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D; -WGLEW_FUN_EXPORT PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D; - -WGLEW_FUN_EXPORT PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D; -WGLEW_FUN_EXPORT PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D; -WGLEW_FUN_EXPORT PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D; -WGLEW_FUN_EXPORT PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D; - -WGLEW_FUN_EXPORT PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV; -WGLEW_FUN_EXPORT PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV; -WGLEW_FUN_EXPORT PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV; -WGLEW_FUN_EXPORT PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV; -WGLEW_FUN_EXPORT PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV; -WGLEW_FUN_EXPORT PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV; -WGLEW_FUN_EXPORT PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV; -WGLEW_FUN_EXPORT PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV; - -WGLEW_FUN_EXPORT PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV; - -WGLEW_FUN_EXPORT PFNWGLDELAYBEFORESWAPNVPROC __wglewDelayBeforeSwapNV; - -WGLEW_FUN_EXPORT PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV; -WGLEW_FUN_EXPORT PFNWGLDELETEDCNVPROC __wglewDeleteDCNV; -WGLEW_FUN_EXPORT PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV; -WGLEW_FUN_EXPORT PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV; -WGLEW_FUN_EXPORT PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV; - -WGLEW_FUN_EXPORT PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV; -WGLEW_FUN_EXPORT PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV; -WGLEW_FUN_EXPORT PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV; - -WGLEW_FUN_EXPORT PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV; -WGLEW_FUN_EXPORT PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV; -WGLEW_FUN_EXPORT PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV; -WGLEW_FUN_EXPORT PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV; -WGLEW_FUN_EXPORT PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV; -WGLEW_FUN_EXPORT PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV; - -WGLEW_FUN_EXPORT PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV; -WGLEW_FUN_EXPORT PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV; - -WGLEW_FUN_EXPORT PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV; -WGLEW_FUN_EXPORT PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV; -WGLEW_FUN_EXPORT PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV; -WGLEW_FUN_EXPORT PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV; -WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV; - -WGLEW_FUN_EXPORT PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV; -WGLEW_FUN_EXPORT PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV; -WGLEW_FUN_EXPORT PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV; -WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV; -WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV; -WGLEW_FUN_EXPORT PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV; - -WGLEW_FUN_EXPORT PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML; -WGLEW_FUN_EXPORT PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML; -WGLEW_FUN_EXPORT PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML; -WGLEW_FUN_EXPORT PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML; -WGLEW_FUN_EXPORT PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML; -WGLEW_FUN_EXPORT PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML; -WGLEW_VAR_EXPORT GLboolean __WGLEW_3DFX_multisample; -WGLEW_VAR_EXPORT GLboolean __WGLEW_3DL_stereo_control; -WGLEW_VAR_EXPORT GLboolean __WGLEW_AMD_gpu_association; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_buffer_region; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_context_flush_control; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_profile; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_robustness; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_extensions_string; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_framebuffer_sRGB; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_make_current_read; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_multisample; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pbuffer; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format_float; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_render_texture; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_application_isolation; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_share_group_isolation; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_pixel_format_float; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_render_texture_rectangle; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es2_profile; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es_profile; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_depth_float; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_display_color_table; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_extensions_string; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_framebuffer_sRGB; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_make_current_read; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_multisample; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pbuffer; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pixel_format; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pixel_format_packed_float; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_swap_control; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_swap_control_tear; -WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_digital_video_control; -WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_gamma; -WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_genlock; -WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_image_buffer; -WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_swap_frame_lock; -WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_swap_frame_usage; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_DX_interop; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_DX_interop2; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_copy_image; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_delay_before_swap; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_float_buffer; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_gpu_affinity; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_multisample_coverage; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_present_video; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_render_depth_texture; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_render_texture_rectangle; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_swap_group; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_vertex_array_range; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_video_capture; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_video_output; -WGLEW_VAR_EXPORT GLboolean __WGLEW_OML_sync_control; - -#ifdef GLEW_MX -}; /* WGLEWContextStruct */ -#endif /* GLEW_MX */ - -/* ------------------------------------------------------------------------- */ - -#ifdef GLEW_MX - -typedef struct WGLEWContextStruct WGLEWContext; -GLEWAPI GLenum GLEWAPIENTRY wglewContextInit (WGLEWContext *ctx); -GLEWAPI GLboolean GLEWAPIENTRY wglewContextIsSupported (const WGLEWContext *ctx, const char *name); - -#define wglewInit() wglewContextInit(wglewGetContext()) -#define wglewIsSupported(x) wglewContextIsSupported(wglewGetContext(), x) - -#define WGLEW_GET_VAR(x) (*(const GLboolean*)&(wglewGetContext()->x)) -#define WGLEW_GET_FUN(x) wglewGetContext()->x - -#else /* GLEW_MX */ - -GLEWAPI GLenum GLEWAPIENTRY wglewInit (); -GLEWAPI GLboolean GLEWAPIENTRY wglewIsSupported (const char *name); - -#define WGLEW_GET_VAR(x) (*(const GLboolean*)&x) -#define WGLEW_GET_FUN(x) x - -#endif /* GLEW_MX */ - -GLEWAPI GLboolean GLEWAPIENTRY wglewGetExtension (const char *name); - -#ifdef __cplusplus -} -#endif - -#undef GLEWAPI - -#endif /* __wglew_h__ */ diff --git a/deps/GLEW/glew/src/glew.c b/deps/GLEW/glew/src/glew.c deleted file mode 100644 index 2ed1c74a5de..00000000000 --- a/deps/GLEW/glew/src/glew.c +++ /dev/null @@ -1,18614 +0,0 @@ -/* -** The OpenGL Extension Wrangler Library -** Copyright (C) 2008-2015, Nigel Stewart -** Copyright (C) 2002-2008, Milan Ikits -** Copyright (C) 2002-2008, Marcelo E. Magallon -** Copyright (C) 2002, Lev Povalahev -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are met: -** -** * Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** * The name of the author may be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -** THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#if 1 -// #ifdef SLIC3R_GUI - -#include - -#if defined(_WIN32) -# include -#elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) -# include -#endif - -#include /* For size_t */ - -/* - * Define glewGetContext and related helper macros. - */ -#ifdef GLEW_MX -# define glewGetContext() ctx -# ifdef _WIN32 -# define GLEW_CONTEXT_ARG_DEF_INIT GLEWContext* ctx -# define GLEW_CONTEXT_ARG_VAR_INIT ctx -# define wglewGetContext() ctx -# define WGLEW_CONTEXT_ARG_DEF_INIT WGLEWContext* ctx -# define WGLEW_CONTEXT_ARG_DEF_LIST WGLEWContext* ctx -# else /* _WIN32 */ -# define GLEW_CONTEXT_ARG_DEF_INIT void -# define GLEW_CONTEXT_ARG_VAR_INIT -# define glxewGetContext() ctx -# define GLXEW_CONTEXT_ARG_DEF_INIT void -# define GLXEW_CONTEXT_ARG_DEF_LIST GLXEWContext* ctx -# endif /* _WIN32 */ -# define GLEW_CONTEXT_ARG_DEF_LIST GLEWContext* ctx -#else /* GLEW_MX */ -# define GLEW_CONTEXT_ARG_DEF_INIT void -# define GLEW_CONTEXT_ARG_VAR_INIT -# define GLEW_CONTEXT_ARG_DEF_LIST void -# define WGLEW_CONTEXT_ARG_DEF_INIT void -# define WGLEW_CONTEXT_ARG_DEF_LIST void -# define GLXEW_CONTEXT_ARG_DEF_INIT void -# define GLXEW_CONTEXT_ARG_DEF_LIST void -#endif /* GLEW_MX */ - -#if defined(GLEW_REGAL) - -/* In GLEW_REGAL mode we call direcly into the linked - libRegal.so glGetProcAddressREGAL for looking up - the GL function pointers. */ - -# undef glGetProcAddressREGAL -# ifdef WIN32 -extern void * __stdcall glGetProcAddressREGAL(const GLchar *name); -static void * (__stdcall * regalGetProcAddress) (const GLchar *) = glGetProcAddressREGAL; -# else -extern void * glGetProcAddressREGAL(const GLchar *name); -static void * (*regalGetProcAddress) (const GLchar *) = glGetProcAddressREGAL; -# endif -# define glGetProcAddressREGAL GLEW_GET_FUN(__glewGetProcAddressREGAL) - -#elif defined(__sgi) || defined (__sun) || defined(__HAIKU__) || defined(GLEW_APPLE_GLX) -#include -#include -#include - -void* dlGetProcAddress (const GLubyte* name) -{ - static void* h = NULL; - static void* gpa; - - if (h == NULL) - { - if ((h = dlopen(NULL, RTLD_LAZY | RTLD_LOCAL)) == NULL) return NULL; - gpa = dlsym(h, "glXGetProcAddress"); - } - - if (gpa != NULL) - return ((void*(*)(const GLubyte*))gpa)(name); - else - return dlsym(h, (const char*)name); -} -#endif /* __sgi || __sun || GLEW_APPLE_GLX */ - -#if defined(__APPLE__) -#include -#include -#include - -#ifdef MAC_OS_X_VERSION_10_3 - -#include - -void* NSGLGetProcAddress (const GLubyte *name) -{ - static void* image = NULL; - void* addr; - if (NULL == image) - { - image = dlopen("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", RTLD_LAZY); - } - if( !image ) return NULL; - addr = dlsym(image, (const char*)name); - if( addr ) return addr; -#ifdef GLEW_APPLE_GLX - return dlGetProcAddress( name ); // try next for glx symbols -#else - return NULL; -#endif -} -#else - -#include - -void* NSGLGetProcAddress (const GLubyte *name) -{ - static const struct mach_header* image = NULL; - NSSymbol symbol; - char* symbolName; - if (NULL == image) - { - image = NSAddImage("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", NSADDIMAGE_OPTION_RETURN_ON_ERROR); - } - /* prepend a '_' for the Unix C symbol mangling convention */ - symbolName = malloc(strlen((const char*)name) + 2); - strcpy(symbolName+1, (const char*)name); - symbolName[0] = '_'; - symbol = NULL; - /* if (NSIsSymbolNameDefined(symbolName)) - symbol = NSLookupAndBindSymbol(symbolName); */ - symbol = image ? NSLookupSymbolInImage(image, symbolName, NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR) : NULL; - free(symbolName); - if( symbol ) return NSAddressOfSymbol(symbol); -#ifdef GLEW_APPLE_GLX - return dlGetProcAddress( name ); // try next for glx symbols -#else - return NULL; -#endif -} -#endif /* MAC_OS_X_VERSION_10_3 */ -#endif /* __APPLE__ */ - -/* - * Define glewGetProcAddress. - */ -#if defined(GLEW_REGAL) -# define glewGetProcAddress(name) regalGetProcAddress((const GLchar *) name) -#elif defined(_WIN32) -# define glewGetProcAddress(name) wglGetProcAddress((LPCSTR)name) -#elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX) -# define glewGetProcAddress(name) NSGLGetProcAddress(name) -#elif defined(__sgi) || defined(__sun) || defined(__HAIKU__) -# define glewGetProcAddress(name) dlGetProcAddress(name) -#elif defined(__ANDROID__) -# define glewGetProcAddress(name) NULL /* TODO */ -#elif defined(__native_client__) -# define glewGetProcAddress(name) NULL /* TODO */ -#else /* __linux */ -# define glewGetProcAddress(name) (*glXGetProcAddressARB)(name) -#endif - -/* - * Redefine GLEW_GET_VAR etc without const cast - */ - -#undef GLEW_GET_VAR -#ifdef GLEW_MX -# define GLEW_GET_VAR(x) (glewGetContext()->x) -#else /* GLEW_MX */ -# define GLEW_GET_VAR(x) (x) -#endif /* GLEW_MX */ - -#ifdef WGLEW_GET_VAR -# undef WGLEW_GET_VAR -# ifdef GLEW_MX -# define WGLEW_GET_VAR(x) (wglewGetContext()->x) -# else /* GLEW_MX */ -# define WGLEW_GET_VAR(x) (x) -# endif /* GLEW_MX */ -#endif /* WGLEW_GET_VAR */ - -#ifdef GLXEW_GET_VAR -# undef GLXEW_GET_VAR -# ifdef GLEW_MX -# define GLXEW_GET_VAR(x) (glxewGetContext()->x) -# else /* GLEW_MX */ -# define GLXEW_GET_VAR(x) (x) -# endif /* GLEW_MX */ -#endif /* GLXEW_GET_VAR */ - -/* - * GLEW, just like OpenGL or GLU, does not rely on the standard C library. - * These functions implement the functionality required in this file. - */ -static GLuint _glewStrLen (const GLubyte* s) -{ - GLuint i=0; - if (s == NULL) return 0; - while (s[i] != '\0') i++; - return i; -} - -static GLuint _glewStrCLen (const GLubyte* s, GLubyte c) -{ - GLuint i=0; - if (s == NULL) return 0; - while (s[i] != '\0' && s[i] != c) i++; - return (s[i] == '\0' || s[i] == c) ? i : 0; -} - -static GLboolean _glewStrSame (const GLubyte* a, const GLubyte* b, GLuint n) -{ - GLuint i=0; - if(a == NULL || b == NULL) - return (a == NULL && b == NULL && n == 0) ? GL_TRUE : GL_FALSE; - while (i < n && a[i] != '\0' && b[i] != '\0' && a[i] == b[i]) i++; - return i == n ? GL_TRUE : GL_FALSE; -} - -static GLboolean _glewStrSame1 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) -{ - while (*na > 0 && (**a == ' ' || **a == '\n' || **a == '\r' || **a == '\t')) - { - (*a)++; - (*na)--; - } - if(*na >= nb) - { - GLuint i=0; - while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; - if(i == nb) - { - *a = *a + nb; - *na = *na - nb; - return GL_TRUE; - } - } - return GL_FALSE; -} - -static GLboolean _glewStrSame2 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) -{ - if(*na >= nb) - { - GLuint i=0; - while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; - if(i == nb) - { - *a = *a + nb; - *na = *na - nb; - return GL_TRUE; - } - } - return GL_FALSE; -} - -static GLboolean _glewStrSame3 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) -{ - if(*na >= nb) - { - GLuint i=0; - while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; - if (i == nb && (*na == nb || (*a)[i] == ' ' || (*a)[i] == '\n' || (*a)[i] == '\r' || (*a)[i] == '\t')) - { - *a = *a + nb; - *na = *na - nb; - return GL_TRUE; - } - } - return GL_FALSE; -} - -/* - * Search for name in the extensions string. Use of strstr() - * is not sufficient because extension names can be prefixes of - * other extension names. Could use strtok() but the constant - * string returned by glGetString might be in read-only memory. - */ -static GLboolean _glewSearchExtension (const char* name, const GLubyte *start, const GLubyte *end) -{ - const GLubyte* p; - GLuint len = _glewStrLen((const GLubyte*)name); - p = start; - while (p < end) - { - GLuint n = _glewStrCLen(p, ' '); - if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE; - p += n+1; - } - return GL_FALSE; -} - -#if !defined(_WIN32) || !defined(GLEW_MX) - -PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D = NULL; -PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements = NULL; -PFNGLTEXIMAGE3DPROC __glewTexImage3D = NULL; -PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D = NULL; - -PFNGLACTIVETEXTUREPROC __glewActiveTexture = NULL; -PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture = NULL; -PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D = NULL; -PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D = NULL; -PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D = NULL; -PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage = NULL; -PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd = NULL; -PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf = NULL; -PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd = NULL; -PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf = NULL; -PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d = NULL; -PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv = NULL; -PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f = NULL; -PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv = NULL; -PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i = NULL; -PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv = NULL; -PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s = NULL; -PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv = NULL; -PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d = NULL; -PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv = NULL; -PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f = NULL; -PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv = NULL; -PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i = NULL; -PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv = NULL; -PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s = NULL; -PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv = NULL; -PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d = NULL; -PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv = NULL; -PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f = NULL; -PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv = NULL; -PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i = NULL; -PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv = NULL; -PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s = NULL; -PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv = NULL; -PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d = NULL; -PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv = NULL; -PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f = NULL; -PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv = NULL; -PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i = NULL; -PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv = NULL; -PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s = NULL; -PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv = NULL; -PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage = NULL; - -PFNGLBLENDCOLORPROC __glewBlendColor = NULL; -PFNGLBLENDEQUATIONPROC __glewBlendEquation = NULL; -PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate = NULL; -PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer = NULL; -PFNGLFOGCOORDDPROC __glewFogCoordd = NULL; -PFNGLFOGCOORDDVPROC __glewFogCoorddv = NULL; -PFNGLFOGCOORDFPROC __glewFogCoordf = NULL; -PFNGLFOGCOORDFVPROC __glewFogCoordfv = NULL; -PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays = NULL; -PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements = NULL; -PFNGLPOINTPARAMETERFPROC __glewPointParameterf = NULL; -PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv = NULL; -PFNGLPOINTPARAMETERIPROC __glewPointParameteri = NULL; -PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv = NULL; -PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b = NULL; -PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv = NULL; -PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d = NULL; -PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv = NULL; -PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f = NULL; -PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv = NULL; -PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i = NULL; -PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv = NULL; -PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s = NULL; -PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv = NULL; -PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub = NULL; -PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv = NULL; -PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui = NULL; -PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv = NULL; -PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us = NULL; -PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv = NULL; -PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer = NULL; -PFNGLWINDOWPOS2DPROC __glewWindowPos2d = NULL; -PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv = NULL; -PFNGLWINDOWPOS2FPROC __glewWindowPos2f = NULL; -PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv = NULL; -PFNGLWINDOWPOS2IPROC __glewWindowPos2i = NULL; -PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv = NULL; -PFNGLWINDOWPOS2SPROC __glewWindowPos2s = NULL; -PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv = NULL; -PFNGLWINDOWPOS3DPROC __glewWindowPos3d = NULL; -PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv = NULL; -PFNGLWINDOWPOS3FPROC __glewWindowPos3f = NULL; -PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv = NULL; -PFNGLWINDOWPOS3IPROC __glewWindowPos3i = NULL; -PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv = NULL; -PFNGLWINDOWPOS3SPROC __glewWindowPos3s = NULL; -PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv = NULL; - -PFNGLBEGINQUERYPROC __glewBeginQuery = NULL; -PFNGLBINDBUFFERPROC __glewBindBuffer = NULL; -PFNGLBUFFERDATAPROC __glewBufferData = NULL; -PFNGLBUFFERSUBDATAPROC __glewBufferSubData = NULL; -PFNGLDELETEBUFFERSPROC __glewDeleteBuffers = NULL; -PFNGLDELETEQUERIESPROC __glewDeleteQueries = NULL; -PFNGLENDQUERYPROC __glewEndQuery = NULL; -PFNGLGENBUFFERSPROC __glewGenBuffers = NULL; -PFNGLGENQUERIESPROC __glewGenQueries = NULL; -PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv = NULL; -PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv = NULL; -PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData = NULL; -PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv = NULL; -PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv = NULL; -PFNGLGETQUERYIVPROC __glewGetQueryiv = NULL; -PFNGLISBUFFERPROC __glewIsBuffer = NULL; -PFNGLISQUERYPROC __glewIsQuery = NULL; -PFNGLMAPBUFFERPROC __glewMapBuffer = NULL; -PFNGLUNMAPBUFFERPROC __glewUnmapBuffer = NULL; - -PFNGLATTACHSHADERPROC __glewAttachShader = NULL; -PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation = NULL; -PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate = NULL; -PFNGLCOMPILESHADERPROC __glewCompileShader = NULL; -PFNGLCREATEPROGRAMPROC __glewCreateProgram = NULL; -PFNGLCREATESHADERPROC __glewCreateShader = NULL; -PFNGLDELETEPROGRAMPROC __glewDeleteProgram = NULL; -PFNGLDELETESHADERPROC __glewDeleteShader = NULL; -PFNGLDETACHSHADERPROC __glewDetachShader = NULL; -PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray = NULL; -PFNGLDRAWBUFFERSPROC __glewDrawBuffers = NULL; -PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray = NULL; -PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib = NULL; -PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform = NULL; -PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders = NULL; -PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation = NULL; -PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog = NULL; -PFNGLGETPROGRAMIVPROC __glewGetProgramiv = NULL; -PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog = NULL; -PFNGLGETSHADERSOURCEPROC __glewGetShaderSource = NULL; -PFNGLGETSHADERIVPROC __glewGetShaderiv = NULL; -PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation = NULL; -PFNGLGETUNIFORMFVPROC __glewGetUniformfv = NULL; -PFNGLGETUNIFORMIVPROC __glewGetUniformiv = NULL; -PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv = NULL; -PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv = NULL; -PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv = NULL; -PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv = NULL; -PFNGLISPROGRAMPROC __glewIsProgram = NULL; -PFNGLISSHADERPROC __glewIsShader = NULL; -PFNGLLINKPROGRAMPROC __glewLinkProgram = NULL; -PFNGLSHADERSOURCEPROC __glewShaderSource = NULL; -PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate = NULL; -PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate = NULL; -PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate = NULL; -PFNGLUNIFORM1FPROC __glewUniform1f = NULL; -PFNGLUNIFORM1FVPROC __glewUniform1fv = NULL; -PFNGLUNIFORM1IPROC __glewUniform1i = NULL; -PFNGLUNIFORM1IVPROC __glewUniform1iv = NULL; -PFNGLUNIFORM2FPROC __glewUniform2f = NULL; -PFNGLUNIFORM2FVPROC __glewUniform2fv = NULL; -PFNGLUNIFORM2IPROC __glewUniform2i = NULL; -PFNGLUNIFORM2IVPROC __glewUniform2iv = NULL; -PFNGLUNIFORM3FPROC __glewUniform3f = NULL; -PFNGLUNIFORM3FVPROC __glewUniform3fv = NULL; -PFNGLUNIFORM3IPROC __glewUniform3i = NULL; -PFNGLUNIFORM3IVPROC __glewUniform3iv = NULL; -PFNGLUNIFORM4FPROC __glewUniform4f = NULL; -PFNGLUNIFORM4FVPROC __glewUniform4fv = NULL; -PFNGLUNIFORM4IPROC __glewUniform4i = NULL; -PFNGLUNIFORM4IVPROC __glewUniform4iv = NULL; -PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv = NULL; -PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv = NULL; -PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv = NULL; -PFNGLUSEPROGRAMPROC __glewUseProgram = NULL; -PFNGLVALIDATEPROGRAMPROC __glewValidateProgram = NULL; -PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d = NULL; -PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv = NULL; -PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f = NULL; -PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv = NULL; -PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s = NULL; -PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv = NULL; -PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d = NULL; -PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv = NULL; -PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f = NULL; -PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv = NULL; -PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s = NULL; -PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv = NULL; -PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d = NULL; -PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv = NULL; -PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f = NULL; -PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv = NULL; -PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s = NULL; -PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv = NULL; -PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv = NULL; -PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv = NULL; -PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv = NULL; -PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub = NULL; -PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv = NULL; -PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv = NULL; -PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv = NULL; -PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv = NULL; -PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d = NULL; -PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv = NULL; -PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f = NULL; -PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv = NULL; -PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv = NULL; -PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s = NULL; -PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv = NULL; -PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv = NULL; -PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv = NULL; -PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv = NULL; -PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer = NULL; - -PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv = NULL; -PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv = NULL; -PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv = NULL; -PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv = NULL; -PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv = NULL; -PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv = NULL; - -PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender = NULL; -PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback = NULL; -PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation = NULL; -PFNGLCLAMPCOLORPROC __glewClampColor = NULL; -PFNGLCLEARBUFFERFIPROC __glewClearBufferfi = NULL; -PFNGLCLEARBUFFERFVPROC __glewClearBufferfv = NULL; -PFNGLCLEARBUFFERIVPROC __glewClearBufferiv = NULL; -PFNGLCLEARBUFFERUIVPROC __glewClearBufferuiv = NULL; -PFNGLCOLORMASKIPROC __glewColorMaski = NULL; -PFNGLDISABLEIPROC __glewDisablei = NULL; -PFNGLENABLEIPROC __glewEnablei = NULL; -PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender = NULL; -PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback = NULL; -PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v = NULL; -PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation = NULL; -PFNGLGETSTRINGIPROC __glewGetStringi = NULL; -PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv = NULL; -PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv = NULL; -PFNGLGETTRANSFORMFEEDBACKVARYINGPROC __glewGetTransformFeedbackVarying = NULL; -PFNGLGETUNIFORMUIVPROC __glewGetUniformuiv = NULL; -PFNGLGETVERTEXATTRIBIIVPROC __glewGetVertexAttribIiv = NULL; -PFNGLGETVERTEXATTRIBIUIVPROC __glewGetVertexAttribIuiv = NULL; -PFNGLISENABLEDIPROC __glewIsEnabledi = NULL; -PFNGLTEXPARAMETERIIVPROC __glewTexParameterIiv = NULL; -PFNGLTEXPARAMETERIUIVPROC __glewTexParameterIuiv = NULL; -PFNGLTRANSFORMFEEDBACKVARYINGSPROC __glewTransformFeedbackVaryings = NULL; -PFNGLUNIFORM1UIPROC __glewUniform1ui = NULL; -PFNGLUNIFORM1UIVPROC __glewUniform1uiv = NULL; -PFNGLUNIFORM2UIPROC __glewUniform2ui = NULL; -PFNGLUNIFORM2UIVPROC __glewUniform2uiv = NULL; -PFNGLUNIFORM3UIPROC __glewUniform3ui = NULL; -PFNGLUNIFORM3UIVPROC __glewUniform3uiv = NULL; -PFNGLUNIFORM4UIPROC __glewUniform4ui = NULL; -PFNGLUNIFORM4UIVPROC __glewUniform4uiv = NULL; -PFNGLVERTEXATTRIBI1IPROC __glewVertexAttribI1i = NULL; -PFNGLVERTEXATTRIBI1IVPROC __glewVertexAttribI1iv = NULL; -PFNGLVERTEXATTRIBI1UIPROC __glewVertexAttribI1ui = NULL; -PFNGLVERTEXATTRIBI1UIVPROC __glewVertexAttribI1uiv = NULL; -PFNGLVERTEXATTRIBI2IPROC __glewVertexAttribI2i = NULL; -PFNGLVERTEXATTRIBI2IVPROC __glewVertexAttribI2iv = NULL; -PFNGLVERTEXATTRIBI2UIPROC __glewVertexAttribI2ui = NULL; -PFNGLVERTEXATTRIBI2UIVPROC __glewVertexAttribI2uiv = NULL; -PFNGLVERTEXATTRIBI3IPROC __glewVertexAttribI3i = NULL; -PFNGLVERTEXATTRIBI3IVPROC __glewVertexAttribI3iv = NULL; -PFNGLVERTEXATTRIBI3UIPROC __glewVertexAttribI3ui = NULL; -PFNGLVERTEXATTRIBI3UIVPROC __glewVertexAttribI3uiv = NULL; -PFNGLVERTEXATTRIBI4BVPROC __glewVertexAttribI4bv = NULL; -PFNGLVERTEXATTRIBI4IPROC __glewVertexAttribI4i = NULL; -PFNGLVERTEXATTRIBI4IVPROC __glewVertexAttribI4iv = NULL; -PFNGLVERTEXATTRIBI4SVPROC __glewVertexAttribI4sv = NULL; -PFNGLVERTEXATTRIBI4UBVPROC __glewVertexAttribI4ubv = NULL; -PFNGLVERTEXATTRIBI4UIPROC __glewVertexAttribI4ui = NULL; -PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv = NULL; -PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv = NULL; -PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer = NULL; - -PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced = NULL; -PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced = NULL; -PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex = NULL; -PFNGLTEXBUFFERPROC __glewTexBuffer = NULL; - -PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture = NULL; -PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v = NULL; -PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v = NULL; - -PFNGLVERTEXATTRIBDIVISORPROC __glewVertexAttribDivisor = NULL; - -PFNGLBLENDEQUATIONSEPARATEIPROC __glewBlendEquationSeparatei = NULL; -PFNGLBLENDEQUATIONIPROC __glewBlendEquationi = NULL; -PFNGLBLENDFUNCSEPARATEIPROC __glewBlendFuncSeparatei = NULL; -PFNGLBLENDFUNCIPROC __glewBlendFunci = NULL; -PFNGLMINSAMPLESHADINGPROC __glewMinSampleShading = NULL; - -PFNGLGETGRAPHICSRESETSTATUSPROC __glewGetGraphicsResetStatus = NULL; -PFNGLGETNCOMPRESSEDTEXIMAGEPROC __glewGetnCompressedTexImage = NULL; -PFNGLGETNTEXIMAGEPROC __glewGetnTexImage = NULL; -PFNGLGETNUNIFORMDVPROC __glewGetnUniformdv = NULL; - -PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX = NULL; - -PFNGLDEBUGMESSAGECALLBACKAMDPROC __glewDebugMessageCallbackAMD = NULL; -PFNGLDEBUGMESSAGEENABLEAMDPROC __glewDebugMessageEnableAMD = NULL; -PFNGLDEBUGMESSAGEINSERTAMDPROC __glewDebugMessageInsertAMD = NULL; -PFNGLGETDEBUGMESSAGELOGAMDPROC __glewGetDebugMessageLogAMD = NULL; - -PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD = NULL; -PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD = NULL; -PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD = NULL; -PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD = NULL; - -PFNGLVERTEXATTRIBPARAMETERIAMDPROC __glewVertexAttribParameteriAMD = NULL; - -PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD = NULL; -PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD = NULL; - -PFNGLDELETENAMESAMDPROC __glewDeleteNamesAMD = NULL; -PFNGLGENNAMESAMDPROC __glewGenNamesAMD = NULL; -PFNGLISNAMEAMDPROC __glewIsNameAMD = NULL; - -PFNGLQUERYOBJECTPARAMETERUIAMDPROC __glewQueryObjectParameteruiAMD = NULL; - -PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD = NULL; -PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD = NULL; -PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD = NULL; -PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD = NULL; -PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD = NULL; -PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD = NULL; -PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD = NULL; -PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD = NULL; -PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD = NULL; -PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD = NULL; -PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD = NULL; - -PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD = NULL; - -PFNGLTEXSTORAGESPARSEAMDPROC __glewTexStorageSparseAMD = NULL; -PFNGLTEXTURESTORAGESPARSEAMDPROC __glewTextureStorageSparseAMD = NULL; - -PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD = NULL; - -PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD = NULL; -PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD = NULL; - -PFNGLBLITFRAMEBUFFERANGLEPROC __glewBlitFramebufferANGLE = NULL; - -PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC __glewRenderbufferStorageMultisampleANGLE = NULL; - -PFNGLDRAWARRAYSINSTANCEDANGLEPROC __glewDrawArraysInstancedANGLE = NULL; -PFNGLDRAWELEMENTSINSTANCEDANGLEPROC __glewDrawElementsInstancedANGLE = NULL; -PFNGLVERTEXATTRIBDIVISORANGLEPROC __glewVertexAttribDivisorANGLE = NULL; - -PFNGLBEGINQUERYANGLEPROC __glewBeginQueryANGLE = NULL; -PFNGLDELETEQUERIESANGLEPROC __glewDeleteQueriesANGLE = NULL; -PFNGLENDQUERYANGLEPROC __glewEndQueryANGLE = NULL; -PFNGLGENQUERIESANGLEPROC __glewGenQueriesANGLE = NULL; -PFNGLGETQUERYOBJECTI64VANGLEPROC __glewGetQueryObjecti64vANGLE = NULL; -PFNGLGETQUERYOBJECTIVANGLEPROC __glewGetQueryObjectivANGLE = NULL; -PFNGLGETQUERYOBJECTUI64VANGLEPROC __glewGetQueryObjectui64vANGLE = NULL; -PFNGLGETQUERYOBJECTUIVANGLEPROC __glewGetQueryObjectuivANGLE = NULL; -PFNGLGETQUERYIVANGLEPROC __glewGetQueryivANGLE = NULL; -PFNGLISQUERYANGLEPROC __glewIsQueryANGLE = NULL; -PFNGLQUERYCOUNTERANGLEPROC __glewQueryCounterANGLE = NULL; - -PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC __glewGetTranslatedShaderSourceANGLE = NULL; - -PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE = NULL; -PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE = NULL; -PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE = NULL; -PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE = NULL; -PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE = NULL; - -PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE = NULL; -PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE = NULL; -PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE = NULL; -PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE = NULL; -PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE = NULL; -PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE = NULL; -PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE = NULL; -PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE = NULL; - -PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE = NULL; -PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE = NULL; - -PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE = NULL; -PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE = NULL; -PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE = NULL; - -PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE = NULL; -PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE = NULL; - -PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE = NULL; -PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE = NULL; -PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE = NULL; -PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE = NULL; - -PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE = NULL; -PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE = NULL; -PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE = NULL; - -PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE = NULL; -PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE = NULL; -PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE = NULL; -PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE = NULL; -PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE = NULL; -PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE = NULL; -PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE = NULL; - -PFNGLCLEARDEPTHFPROC __glewClearDepthf = NULL; -PFNGLDEPTHRANGEFPROC __glewDepthRangef = NULL; -PFNGLGETSHADERPRECISIONFORMATPROC __glewGetShaderPrecisionFormat = NULL; -PFNGLRELEASESHADERCOMPILERPROC __glewReleaseShaderCompiler = NULL; -PFNGLSHADERBINARYPROC __glewShaderBinary = NULL; - -PFNGLMEMORYBARRIERBYREGIONPROC __glewMemoryBarrierByRegion = NULL; - -PFNGLPRIMITIVEBOUNDINGBOXARBPROC __glewPrimitiveBoundingBoxARB = NULL; - -PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstancedBaseInstance = NULL; -PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance = NULL; -PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance = NULL; - -PFNGLGETIMAGEHANDLEARBPROC __glewGetImageHandleARB = NULL; -PFNGLGETTEXTUREHANDLEARBPROC __glewGetTextureHandleARB = NULL; -PFNGLGETTEXTURESAMPLERHANDLEARBPROC __glewGetTextureSamplerHandleARB = NULL; -PFNGLGETVERTEXATTRIBLUI64VARBPROC __glewGetVertexAttribLui64vARB = NULL; -PFNGLISIMAGEHANDLERESIDENTARBPROC __glewIsImageHandleResidentARB = NULL; -PFNGLISTEXTUREHANDLERESIDENTARBPROC __glewIsTextureHandleResidentARB = NULL; -PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC __glewMakeImageHandleNonResidentARB = NULL; -PFNGLMAKEIMAGEHANDLERESIDENTARBPROC __glewMakeImageHandleResidentARB = NULL; -PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC __glewMakeTextureHandleNonResidentARB = NULL; -PFNGLMAKETEXTUREHANDLERESIDENTARBPROC __glewMakeTextureHandleResidentARB = NULL; -PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC __glewProgramUniformHandleui64ARB = NULL; -PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC __glewProgramUniformHandleui64vARB = NULL; -PFNGLUNIFORMHANDLEUI64ARBPROC __glewUniformHandleui64ARB = NULL; -PFNGLUNIFORMHANDLEUI64VARBPROC __glewUniformHandleui64vARB = NULL; -PFNGLVERTEXATTRIBL1UI64ARBPROC __glewVertexAttribL1ui64ARB = NULL; -PFNGLVERTEXATTRIBL1UI64VARBPROC __glewVertexAttribL1ui64vARB = NULL; - -PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed = NULL; -PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex = NULL; - -PFNGLBUFFERSTORAGEPROC __glewBufferStorage = NULL; -PFNGLNAMEDBUFFERSTORAGEEXTPROC __glewNamedBufferStorageEXT = NULL; - -PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB = NULL; - -PFNGLCLEARBUFFERDATAPROC __glewClearBufferData = NULL; -PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData = NULL; -PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT = NULL; -PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT = NULL; - -PFNGLCLEARTEXIMAGEPROC __glewClearTexImage = NULL; -PFNGLCLEARTEXSUBIMAGEPROC __glewClearTexSubImage = NULL; - -PFNGLCLIPCONTROLPROC __glewClipControl = NULL; - -PFNGLCLAMPCOLORARBPROC __glewClampColorARB = NULL; - -PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute = NULL; -PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect = NULL; - -PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC __glewDispatchComputeGroupSizeARB = NULL; - -PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData = NULL; - -PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData = NULL; - -PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB = NULL; -PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB = NULL; -PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB = NULL; -PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB = NULL; - -PFNGLBINDTEXTUREUNITPROC __glewBindTextureUnit = NULL; -PFNGLBLITNAMEDFRAMEBUFFERPROC __glewBlitNamedFramebuffer = NULL; -PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC __glewCheckNamedFramebufferStatus = NULL; -PFNGLCLEARNAMEDBUFFERDATAPROC __glewClearNamedBufferData = NULL; -PFNGLCLEARNAMEDBUFFERSUBDATAPROC __glewClearNamedBufferSubData = NULL; -PFNGLCLEARNAMEDFRAMEBUFFERFIPROC __glewClearNamedFramebufferfi = NULL; -PFNGLCLEARNAMEDFRAMEBUFFERFVPROC __glewClearNamedFramebufferfv = NULL; -PFNGLCLEARNAMEDFRAMEBUFFERIVPROC __glewClearNamedFramebufferiv = NULL; -PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC __glewClearNamedFramebufferuiv = NULL; -PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC __glewCompressedTextureSubImage1D = NULL; -PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC __glewCompressedTextureSubImage2D = NULL; -PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC __glewCompressedTextureSubImage3D = NULL; -PFNGLCOPYNAMEDBUFFERSUBDATAPROC __glewCopyNamedBufferSubData = NULL; -PFNGLCOPYTEXTURESUBIMAGE1DPROC __glewCopyTextureSubImage1D = NULL; -PFNGLCOPYTEXTURESUBIMAGE2DPROC __glewCopyTextureSubImage2D = NULL; -PFNGLCOPYTEXTURESUBIMAGE3DPROC __glewCopyTextureSubImage3D = NULL; -PFNGLCREATEBUFFERSPROC __glewCreateBuffers = NULL; -PFNGLCREATEFRAMEBUFFERSPROC __glewCreateFramebuffers = NULL; -PFNGLCREATEPROGRAMPIPELINESPROC __glewCreateProgramPipelines = NULL; -PFNGLCREATEQUERIESPROC __glewCreateQueries = NULL; -PFNGLCREATERENDERBUFFERSPROC __glewCreateRenderbuffers = NULL; -PFNGLCREATESAMPLERSPROC __glewCreateSamplers = NULL; -PFNGLCREATETEXTURESPROC __glewCreateTextures = NULL; -PFNGLCREATETRANSFORMFEEDBACKSPROC __glewCreateTransformFeedbacks = NULL; -PFNGLCREATEVERTEXARRAYSPROC __glewCreateVertexArrays = NULL; -PFNGLDISABLEVERTEXARRAYATTRIBPROC __glewDisableVertexArrayAttrib = NULL; -PFNGLENABLEVERTEXARRAYATTRIBPROC __glewEnableVertexArrayAttrib = NULL; -PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC __glewFlushMappedNamedBufferRange = NULL; -PFNGLGENERATETEXTUREMIPMAPPROC __glewGenerateTextureMipmap = NULL; -PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC __glewGetCompressedTextureImage = NULL; -PFNGLGETNAMEDBUFFERPARAMETERI64VPROC __glewGetNamedBufferParameteri64v = NULL; -PFNGLGETNAMEDBUFFERPARAMETERIVPROC __glewGetNamedBufferParameteriv = NULL; -PFNGLGETNAMEDBUFFERPOINTERVPROC __glewGetNamedBufferPointerv = NULL; -PFNGLGETNAMEDBUFFERSUBDATAPROC __glewGetNamedBufferSubData = NULL; -PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetNamedFramebufferAttachmentParameteriv = NULL; -PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC __glewGetNamedFramebufferParameteriv = NULL; -PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC __glewGetNamedRenderbufferParameteriv = NULL; -PFNGLGETQUERYBUFFEROBJECTI64VPROC __glewGetQueryBufferObjecti64v = NULL; -PFNGLGETQUERYBUFFEROBJECTIVPROC __glewGetQueryBufferObjectiv = NULL; -PFNGLGETQUERYBUFFEROBJECTUI64VPROC __glewGetQueryBufferObjectui64v = NULL; -PFNGLGETQUERYBUFFEROBJECTUIVPROC __glewGetQueryBufferObjectuiv = NULL; -PFNGLGETTEXTUREIMAGEPROC __glewGetTextureImage = NULL; -PFNGLGETTEXTURELEVELPARAMETERFVPROC __glewGetTextureLevelParameterfv = NULL; -PFNGLGETTEXTURELEVELPARAMETERIVPROC __glewGetTextureLevelParameteriv = NULL; -PFNGLGETTEXTUREPARAMETERIIVPROC __glewGetTextureParameterIiv = NULL; -PFNGLGETTEXTUREPARAMETERIUIVPROC __glewGetTextureParameterIuiv = NULL; -PFNGLGETTEXTUREPARAMETERFVPROC __glewGetTextureParameterfv = NULL; -PFNGLGETTEXTUREPARAMETERIVPROC __glewGetTextureParameteriv = NULL; -PFNGLGETTRANSFORMFEEDBACKI64_VPROC __glewGetTransformFeedbacki64_v = NULL; -PFNGLGETTRANSFORMFEEDBACKI_VPROC __glewGetTransformFeedbacki_v = NULL; -PFNGLGETTRANSFORMFEEDBACKIVPROC __glewGetTransformFeedbackiv = NULL; -PFNGLGETVERTEXARRAYINDEXED64IVPROC __glewGetVertexArrayIndexed64iv = NULL; -PFNGLGETVERTEXARRAYINDEXEDIVPROC __glewGetVertexArrayIndexediv = NULL; -PFNGLGETVERTEXARRAYIVPROC __glewGetVertexArrayiv = NULL; -PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC __glewInvalidateNamedFramebufferData = NULL; -PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC __glewInvalidateNamedFramebufferSubData = NULL; -PFNGLMAPNAMEDBUFFERPROC __glewMapNamedBuffer = NULL; -PFNGLMAPNAMEDBUFFERRANGEPROC __glewMapNamedBufferRange = NULL; -PFNGLNAMEDBUFFERDATAPROC __glewNamedBufferData = NULL; -PFNGLNAMEDBUFFERSTORAGEPROC __glewNamedBufferStorage = NULL; -PFNGLNAMEDBUFFERSUBDATAPROC __glewNamedBufferSubData = NULL; -PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC __glewNamedFramebufferDrawBuffer = NULL; -PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC __glewNamedFramebufferDrawBuffers = NULL; -PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC __glewNamedFramebufferParameteri = NULL; -PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC __glewNamedFramebufferReadBuffer = NULL; -PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC __glewNamedFramebufferRenderbuffer = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTUREPROC __glewNamedFramebufferTexture = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC __glewNamedFramebufferTextureLayer = NULL; -PFNGLNAMEDRENDERBUFFERSTORAGEPROC __glewNamedRenderbufferStorage = NULL; -PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewNamedRenderbufferStorageMultisample = NULL; -PFNGLTEXTUREBUFFERPROC __glewTextureBuffer = NULL; -PFNGLTEXTUREBUFFERRANGEPROC __glewTextureBufferRange = NULL; -PFNGLTEXTUREPARAMETERIIVPROC __glewTextureParameterIiv = NULL; -PFNGLTEXTUREPARAMETERIUIVPROC __glewTextureParameterIuiv = NULL; -PFNGLTEXTUREPARAMETERFPROC __glewTextureParameterf = NULL; -PFNGLTEXTUREPARAMETERFVPROC __glewTextureParameterfv = NULL; -PFNGLTEXTUREPARAMETERIPROC __glewTextureParameteri = NULL; -PFNGLTEXTUREPARAMETERIVPROC __glewTextureParameteriv = NULL; -PFNGLTEXTURESTORAGE1DPROC __glewTextureStorage1D = NULL; -PFNGLTEXTURESTORAGE2DPROC __glewTextureStorage2D = NULL; -PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC __glewTextureStorage2DMultisample = NULL; -PFNGLTEXTURESTORAGE3DPROC __glewTextureStorage3D = NULL; -PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC __glewTextureStorage3DMultisample = NULL; -PFNGLTEXTURESUBIMAGE1DPROC __glewTextureSubImage1D = NULL; -PFNGLTEXTURESUBIMAGE2DPROC __glewTextureSubImage2D = NULL; -PFNGLTEXTURESUBIMAGE3DPROC __glewTextureSubImage3D = NULL; -PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC __glewTransformFeedbackBufferBase = NULL; -PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC __glewTransformFeedbackBufferRange = NULL; -PFNGLUNMAPNAMEDBUFFERPROC __glewUnmapNamedBuffer = NULL; -PFNGLVERTEXARRAYATTRIBBINDINGPROC __glewVertexArrayAttribBinding = NULL; -PFNGLVERTEXARRAYATTRIBFORMATPROC __glewVertexArrayAttribFormat = NULL; -PFNGLVERTEXARRAYATTRIBIFORMATPROC __glewVertexArrayAttribIFormat = NULL; -PFNGLVERTEXARRAYATTRIBLFORMATPROC __glewVertexArrayAttribLFormat = NULL; -PFNGLVERTEXARRAYBINDINGDIVISORPROC __glewVertexArrayBindingDivisor = NULL; -PFNGLVERTEXARRAYELEMENTBUFFERPROC __glewVertexArrayElementBuffer = NULL; -PFNGLVERTEXARRAYVERTEXBUFFERPROC __glewVertexArrayVertexBuffer = NULL; -PFNGLVERTEXARRAYVERTEXBUFFERSPROC __glewVertexArrayVertexBuffers = NULL; - -PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB = NULL; - -PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB = NULL; -PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB = NULL; -PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB = NULL; -PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB = NULL; - -PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex = NULL; -PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex = NULL; -PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex = NULL; -PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex = NULL; - -PFNGLDRAWARRAYSINDIRECTPROC __glewDrawArraysIndirect = NULL; -PFNGLDRAWELEMENTSINDIRECTPROC __glewDrawElementsIndirect = NULL; - -PFNGLFRAMEBUFFERPARAMETERIPROC __glewFramebufferParameteri = NULL; -PFNGLGETFRAMEBUFFERPARAMETERIVPROC __glewGetFramebufferParameteriv = NULL; -PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC __glewGetNamedFramebufferParameterivEXT = NULL; -PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC __glewNamedFramebufferParameteriEXT = NULL; - -PFNGLBINDFRAMEBUFFERPROC __glewBindFramebuffer = NULL; -PFNGLBINDRENDERBUFFERPROC __glewBindRenderbuffer = NULL; -PFNGLBLITFRAMEBUFFERPROC __glewBlitFramebuffer = NULL; -PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus = NULL; -PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers = NULL; -PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers = NULL; -PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer = NULL; -PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D = NULL; -PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D = NULL; -PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D = NULL; -PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer = NULL; -PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers = NULL; -PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers = NULL; -PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap = NULL; -PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetFramebufferAttachmentParameteriv = NULL; -PFNGLGETRENDERBUFFERPARAMETERIVPROC __glewGetRenderbufferParameteriv = NULL; -PFNGLISFRAMEBUFFERPROC __glewIsFramebuffer = NULL; -PFNGLISRENDERBUFFERPROC __glewIsRenderbuffer = NULL; -PFNGLRENDERBUFFERSTORAGEPROC __glewRenderbufferStorage = NULL; -PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewRenderbufferStorageMultisample = NULL; - -PFNGLFRAMEBUFFERTEXTUREARBPROC __glewFramebufferTextureARB = NULL; -PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB = NULL; -PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB = NULL; -PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB = NULL; - -PFNGLGETPROGRAMBINARYPROC __glewGetProgramBinary = NULL; -PFNGLPROGRAMBINARYPROC __glewProgramBinary = NULL; -PFNGLPROGRAMPARAMETERIPROC __glewProgramParameteri = NULL; - -PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC __glewGetCompressedTextureSubImage = NULL; -PFNGLGETTEXTURESUBIMAGEPROC __glewGetTextureSubImage = NULL; - -PFNGLGETUNIFORMDVPROC __glewGetUniformdv = NULL; -PFNGLUNIFORM1DPROC __glewUniform1d = NULL; -PFNGLUNIFORM1DVPROC __glewUniform1dv = NULL; -PFNGLUNIFORM2DPROC __glewUniform2d = NULL; -PFNGLUNIFORM2DVPROC __glewUniform2dv = NULL; -PFNGLUNIFORM3DPROC __glewUniform3d = NULL; -PFNGLUNIFORM3DVPROC __glewUniform3dv = NULL; -PFNGLUNIFORM4DPROC __glewUniform4d = NULL; -PFNGLUNIFORM4DVPROC __glewUniform4dv = NULL; -PFNGLUNIFORMMATRIX2DVPROC __glewUniformMatrix2dv = NULL; -PFNGLUNIFORMMATRIX2X3DVPROC __glewUniformMatrix2x3dv = NULL; -PFNGLUNIFORMMATRIX2X4DVPROC __glewUniformMatrix2x4dv = NULL; -PFNGLUNIFORMMATRIX3DVPROC __glewUniformMatrix3dv = NULL; -PFNGLUNIFORMMATRIX3X2DVPROC __glewUniformMatrix3x2dv = NULL; -PFNGLUNIFORMMATRIX3X4DVPROC __glewUniformMatrix3x4dv = NULL; -PFNGLUNIFORMMATRIX4DVPROC __glewUniformMatrix4dv = NULL; -PFNGLUNIFORMMATRIX4X2DVPROC __glewUniformMatrix4x2dv = NULL; -PFNGLUNIFORMMATRIX4X3DVPROC __glewUniformMatrix4x3dv = NULL; - -PFNGLGETUNIFORMI64VARBPROC __glewGetUniformi64vARB = NULL; -PFNGLGETUNIFORMUI64VARBPROC __glewGetUniformui64vARB = NULL; -PFNGLGETNUNIFORMI64VARBPROC __glewGetnUniformi64vARB = NULL; -PFNGLGETNUNIFORMUI64VARBPROC __glewGetnUniformui64vARB = NULL; -PFNGLPROGRAMUNIFORM1I64ARBPROC __glewProgramUniform1i64ARB = NULL; -PFNGLPROGRAMUNIFORM1I64VARBPROC __glewProgramUniform1i64vARB = NULL; -PFNGLPROGRAMUNIFORM1UI64ARBPROC __glewProgramUniform1ui64ARB = NULL; -PFNGLPROGRAMUNIFORM1UI64VARBPROC __glewProgramUniform1ui64vARB = NULL; -PFNGLPROGRAMUNIFORM2I64ARBPROC __glewProgramUniform2i64ARB = NULL; -PFNGLPROGRAMUNIFORM2I64VARBPROC __glewProgramUniform2i64vARB = NULL; -PFNGLPROGRAMUNIFORM2UI64ARBPROC __glewProgramUniform2ui64ARB = NULL; -PFNGLPROGRAMUNIFORM2UI64VARBPROC __glewProgramUniform2ui64vARB = NULL; -PFNGLPROGRAMUNIFORM3I64ARBPROC __glewProgramUniform3i64ARB = NULL; -PFNGLPROGRAMUNIFORM3I64VARBPROC __glewProgramUniform3i64vARB = NULL; -PFNGLPROGRAMUNIFORM3UI64ARBPROC __glewProgramUniform3ui64ARB = NULL; -PFNGLPROGRAMUNIFORM3UI64VARBPROC __glewProgramUniform3ui64vARB = NULL; -PFNGLPROGRAMUNIFORM4I64ARBPROC __glewProgramUniform4i64ARB = NULL; -PFNGLPROGRAMUNIFORM4I64VARBPROC __glewProgramUniform4i64vARB = NULL; -PFNGLPROGRAMUNIFORM4UI64ARBPROC __glewProgramUniform4ui64ARB = NULL; -PFNGLPROGRAMUNIFORM4UI64VARBPROC __glewProgramUniform4ui64vARB = NULL; -PFNGLUNIFORM1I64ARBPROC __glewUniform1i64ARB = NULL; -PFNGLUNIFORM1I64VARBPROC __glewUniform1i64vARB = NULL; -PFNGLUNIFORM1UI64ARBPROC __glewUniform1ui64ARB = NULL; -PFNGLUNIFORM1UI64VARBPROC __glewUniform1ui64vARB = NULL; -PFNGLUNIFORM2I64ARBPROC __glewUniform2i64ARB = NULL; -PFNGLUNIFORM2I64VARBPROC __glewUniform2i64vARB = NULL; -PFNGLUNIFORM2UI64ARBPROC __glewUniform2ui64ARB = NULL; -PFNGLUNIFORM2UI64VARBPROC __glewUniform2ui64vARB = NULL; -PFNGLUNIFORM3I64ARBPROC __glewUniform3i64ARB = NULL; -PFNGLUNIFORM3I64VARBPROC __glewUniform3i64vARB = NULL; -PFNGLUNIFORM3UI64ARBPROC __glewUniform3ui64ARB = NULL; -PFNGLUNIFORM3UI64VARBPROC __glewUniform3ui64vARB = NULL; -PFNGLUNIFORM4I64ARBPROC __glewUniform4i64ARB = NULL; -PFNGLUNIFORM4I64VARBPROC __glewUniform4i64vARB = NULL; -PFNGLUNIFORM4UI64ARBPROC __glewUniform4ui64ARB = NULL; -PFNGLUNIFORM4UI64VARBPROC __glewUniform4ui64vARB = NULL; - -PFNGLCOLORSUBTABLEPROC __glewColorSubTable = NULL; -PFNGLCOLORTABLEPROC __glewColorTable = NULL; -PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv = NULL; -PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv = NULL; -PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D = NULL; -PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D = NULL; -PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf = NULL; -PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv = NULL; -PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri = NULL; -PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv = NULL; -PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable = NULL; -PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable = NULL; -PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D = NULL; -PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D = NULL; -PFNGLGETCOLORTABLEPROC __glewGetColorTable = NULL; -PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv = NULL; -PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv = NULL; -PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter = NULL; -PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv = NULL; -PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv = NULL; -PFNGLGETHISTOGRAMPROC __glewGetHistogram = NULL; -PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv = NULL; -PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv = NULL; -PFNGLGETMINMAXPROC __glewGetMinmax = NULL; -PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv = NULL; -PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv = NULL; -PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter = NULL; -PFNGLHISTOGRAMPROC __glewHistogram = NULL; -PFNGLMINMAXPROC __glewMinmax = NULL; -PFNGLRESETHISTOGRAMPROC __glewResetHistogram = NULL; -PFNGLRESETMINMAXPROC __glewResetMinmax = NULL; -PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D = NULL; - -PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __glewMultiDrawArraysIndirectCountARB = NULL; -PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __glewMultiDrawElementsIndirectCountARB = NULL; - -PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB = NULL; -PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB = NULL; -PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB = NULL; - -PFNGLGETINTERNALFORMATIVPROC __glewGetInternalformativ = NULL; - -PFNGLGETINTERNALFORMATI64VPROC __glewGetInternalformati64v = NULL; - -PFNGLINVALIDATEBUFFERDATAPROC __glewInvalidateBufferData = NULL; -PFNGLINVALIDATEBUFFERSUBDATAPROC __glewInvalidateBufferSubData = NULL; -PFNGLINVALIDATEFRAMEBUFFERPROC __glewInvalidateFramebuffer = NULL; -PFNGLINVALIDATESUBFRAMEBUFFERPROC __glewInvalidateSubFramebuffer = NULL; -PFNGLINVALIDATETEXIMAGEPROC __glewInvalidateTexImage = NULL; -PFNGLINVALIDATETEXSUBIMAGEPROC __glewInvalidateTexSubImage = NULL; - -PFNGLFLUSHMAPPEDBUFFERRANGEPROC __glewFlushMappedBufferRange = NULL; -PFNGLMAPBUFFERRANGEPROC __glewMapBufferRange = NULL; - -PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB = NULL; -PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB = NULL; -PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB = NULL; -PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB = NULL; -PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB = NULL; - -PFNGLBINDBUFFERSBASEPROC __glewBindBuffersBase = NULL; -PFNGLBINDBUFFERSRANGEPROC __glewBindBuffersRange = NULL; -PFNGLBINDIMAGETEXTURESPROC __glewBindImageTextures = NULL; -PFNGLBINDSAMPLERSPROC __glewBindSamplers = NULL; -PFNGLBINDTEXTURESPROC __glewBindTextures = NULL; -PFNGLBINDVERTEXBUFFERSPROC __glewBindVertexBuffers = NULL; - -PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect = NULL; -PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect = NULL; - -PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB = NULL; - -PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB = NULL; -PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB = NULL; -PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB = NULL; -PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB = NULL; -PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB = NULL; -PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB = NULL; -PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB = NULL; -PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB = NULL; -PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB = NULL; -PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB = NULL; -PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB = NULL; -PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB = NULL; -PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB = NULL; -PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB = NULL; -PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB = NULL; -PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB = NULL; -PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB = NULL; -PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB = NULL; -PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB = NULL; -PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB = NULL; -PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB = NULL; -PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB = NULL; -PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB = NULL; -PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB = NULL; -PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB = NULL; -PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB = NULL; -PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB = NULL; -PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB = NULL; -PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB = NULL; -PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB = NULL; -PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB = NULL; -PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB = NULL; -PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB = NULL; -PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB = NULL; - -PFNGLBEGINQUERYARBPROC __glewBeginQueryARB = NULL; -PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB = NULL; -PFNGLENDQUERYARBPROC __glewEndQueryARB = NULL; -PFNGLGENQUERIESARBPROC __glewGenQueriesARB = NULL; -PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB = NULL; -PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB = NULL; -PFNGLGETQUERYIVARBPROC __glewGetQueryivARB = NULL; -PFNGLISQUERYARBPROC __glewIsQueryARB = NULL; - -PFNGLMAXSHADERCOMPILERTHREADSARBPROC __glewMaxShaderCompilerThreadsARB = NULL; - -PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB = NULL; -PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB = NULL; - -PFNGLGETPROGRAMINTERFACEIVPROC __glewGetProgramInterfaceiv = NULL; -PFNGLGETPROGRAMRESOURCEINDEXPROC __glewGetProgramResourceIndex = NULL; -PFNGLGETPROGRAMRESOURCELOCATIONPROC __glewGetProgramResourceLocation = NULL; -PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC __glewGetProgramResourceLocationIndex = NULL; -PFNGLGETPROGRAMRESOURCENAMEPROC __glewGetProgramResourceName = NULL; -PFNGLGETPROGRAMRESOURCEIVPROC __glewGetProgramResourceiv = NULL; - -PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex = NULL; - -PFNGLGETGRAPHICSRESETSTATUSARBPROC __glewGetGraphicsResetStatusARB = NULL; -PFNGLGETNCOLORTABLEARBPROC __glewGetnColorTableARB = NULL; -PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC __glewGetnCompressedTexImageARB = NULL; -PFNGLGETNCONVOLUTIONFILTERARBPROC __glewGetnConvolutionFilterARB = NULL; -PFNGLGETNHISTOGRAMARBPROC __glewGetnHistogramARB = NULL; -PFNGLGETNMAPDVARBPROC __glewGetnMapdvARB = NULL; -PFNGLGETNMAPFVARBPROC __glewGetnMapfvARB = NULL; -PFNGLGETNMAPIVARBPROC __glewGetnMapivARB = NULL; -PFNGLGETNMINMAXARBPROC __glewGetnMinmaxARB = NULL; -PFNGLGETNPIXELMAPFVARBPROC __glewGetnPixelMapfvARB = NULL; -PFNGLGETNPIXELMAPUIVARBPROC __glewGetnPixelMapuivARB = NULL; -PFNGLGETNPIXELMAPUSVARBPROC __glewGetnPixelMapusvARB = NULL; -PFNGLGETNPOLYGONSTIPPLEARBPROC __glewGetnPolygonStippleARB = NULL; -PFNGLGETNSEPARABLEFILTERARBPROC __glewGetnSeparableFilterARB = NULL; -PFNGLGETNTEXIMAGEARBPROC __glewGetnTexImageARB = NULL; -PFNGLGETNUNIFORMDVARBPROC __glewGetnUniformdvARB = NULL; -PFNGLGETNUNIFORMFVARBPROC __glewGetnUniformfvARB = NULL; -PFNGLGETNUNIFORMIVARBPROC __glewGetnUniformivARB = NULL; -PFNGLGETNUNIFORMUIVARBPROC __glewGetnUniformuivARB = NULL; -PFNGLREADNPIXELSARBPROC __glewReadnPixelsARB = NULL; - -PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewFramebufferSampleLocationsfvARB = NULL; -PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewNamedFramebufferSampleLocationsfvARB = NULL; - -PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB = NULL; - -PFNGLBINDSAMPLERPROC __glewBindSampler = NULL; -PFNGLDELETESAMPLERSPROC __glewDeleteSamplers = NULL; -PFNGLGENSAMPLERSPROC __glewGenSamplers = NULL; -PFNGLGETSAMPLERPARAMETERIIVPROC __glewGetSamplerParameterIiv = NULL; -PFNGLGETSAMPLERPARAMETERIUIVPROC __glewGetSamplerParameterIuiv = NULL; -PFNGLGETSAMPLERPARAMETERFVPROC __glewGetSamplerParameterfv = NULL; -PFNGLGETSAMPLERPARAMETERIVPROC __glewGetSamplerParameteriv = NULL; -PFNGLISSAMPLERPROC __glewIsSampler = NULL; -PFNGLSAMPLERPARAMETERIIVPROC __glewSamplerParameterIiv = NULL; -PFNGLSAMPLERPARAMETERIUIVPROC __glewSamplerParameterIuiv = NULL; -PFNGLSAMPLERPARAMETERFPROC __glewSamplerParameterf = NULL; -PFNGLSAMPLERPARAMETERFVPROC __glewSamplerParameterfv = NULL; -PFNGLSAMPLERPARAMETERIPROC __glewSamplerParameteri = NULL; -PFNGLSAMPLERPARAMETERIVPROC __glewSamplerParameteriv = NULL; - -PFNGLACTIVESHADERPROGRAMPROC __glewActiveShaderProgram = NULL; -PFNGLBINDPROGRAMPIPELINEPROC __glewBindProgramPipeline = NULL; -PFNGLCREATESHADERPROGRAMVPROC __glewCreateShaderProgramv = NULL; -PFNGLDELETEPROGRAMPIPELINESPROC __glewDeleteProgramPipelines = NULL; -PFNGLGENPROGRAMPIPELINESPROC __glewGenProgramPipelines = NULL; -PFNGLGETPROGRAMPIPELINEINFOLOGPROC __glewGetProgramPipelineInfoLog = NULL; -PFNGLGETPROGRAMPIPELINEIVPROC __glewGetProgramPipelineiv = NULL; -PFNGLISPROGRAMPIPELINEPROC __glewIsProgramPipeline = NULL; -PFNGLPROGRAMUNIFORM1DPROC __glewProgramUniform1d = NULL; -PFNGLPROGRAMUNIFORM1DVPROC __glewProgramUniform1dv = NULL; -PFNGLPROGRAMUNIFORM1FPROC __glewProgramUniform1f = NULL; -PFNGLPROGRAMUNIFORM1FVPROC __glewProgramUniform1fv = NULL; -PFNGLPROGRAMUNIFORM1IPROC __glewProgramUniform1i = NULL; -PFNGLPROGRAMUNIFORM1IVPROC __glewProgramUniform1iv = NULL; -PFNGLPROGRAMUNIFORM1UIPROC __glewProgramUniform1ui = NULL; -PFNGLPROGRAMUNIFORM1UIVPROC __glewProgramUniform1uiv = NULL; -PFNGLPROGRAMUNIFORM2DPROC __glewProgramUniform2d = NULL; -PFNGLPROGRAMUNIFORM2DVPROC __glewProgramUniform2dv = NULL; -PFNGLPROGRAMUNIFORM2FPROC __glewProgramUniform2f = NULL; -PFNGLPROGRAMUNIFORM2FVPROC __glewProgramUniform2fv = NULL; -PFNGLPROGRAMUNIFORM2IPROC __glewProgramUniform2i = NULL; -PFNGLPROGRAMUNIFORM2IVPROC __glewProgramUniform2iv = NULL; -PFNGLPROGRAMUNIFORM2UIPROC __glewProgramUniform2ui = NULL; -PFNGLPROGRAMUNIFORM2UIVPROC __glewProgramUniform2uiv = NULL; -PFNGLPROGRAMUNIFORM3DPROC __glewProgramUniform3d = NULL; -PFNGLPROGRAMUNIFORM3DVPROC __glewProgramUniform3dv = NULL; -PFNGLPROGRAMUNIFORM3FPROC __glewProgramUniform3f = NULL; -PFNGLPROGRAMUNIFORM3FVPROC __glewProgramUniform3fv = NULL; -PFNGLPROGRAMUNIFORM3IPROC __glewProgramUniform3i = NULL; -PFNGLPROGRAMUNIFORM3IVPROC __glewProgramUniform3iv = NULL; -PFNGLPROGRAMUNIFORM3UIPROC __glewProgramUniform3ui = NULL; -PFNGLPROGRAMUNIFORM3UIVPROC __glewProgramUniform3uiv = NULL; -PFNGLPROGRAMUNIFORM4DPROC __glewProgramUniform4d = NULL; -PFNGLPROGRAMUNIFORM4DVPROC __glewProgramUniform4dv = NULL; -PFNGLPROGRAMUNIFORM4FPROC __glewProgramUniform4f = NULL; -PFNGLPROGRAMUNIFORM4FVPROC __glewProgramUniform4fv = NULL; -PFNGLPROGRAMUNIFORM4IPROC __glewProgramUniform4i = NULL; -PFNGLPROGRAMUNIFORM4IVPROC __glewProgramUniform4iv = NULL; -PFNGLPROGRAMUNIFORM4UIPROC __glewProgramUniform4ui = NULL; -PFNGLPROGRAMUNIFORM4UIVPROC __glewProgramUniform4uiv = NULL; -PFNGLPROGRAMUNIFORMMATRIX2DVPROC __glewProgramUniformMatrix2dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX2FVPROC __glewProgramUniformMatrix2fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC __glewProgramUniformMatrix2x3dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC __glewProgramUniformMatrix2x3fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC __glewProgramUniformMatrix2x4dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC __glewProgramUniformMatrix2x4fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX3DVPROC __glewProgramUniformMatrix3dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX3FVPROC __glewProgramUniformMatrix3fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC __glewProgramUniformMatrix3x2dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC __glewProgramUniformMatrix3x2fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC __glewProgramUniformMatrix3x4dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC __glewProgramUniformMatrix3x4fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX4DVPROC __glewProgramUniformMatrix4dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX4FVPROC __glewProgramUniformMatrix4fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC __glewProgramUniformMatrix4x2dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC __glewProgramUniformMatrix4x2fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC __glewProgramUniformMatrix4x3dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC __glewProgramUniformMatrix4x3fv = NULL; -PFNGLUSEPROGRAMSTAGESPROC __glewUseProgramStages = NULL; -PFNGLVALIDATEPROGRAMPIPELINEPROC __glewValidateProgramPipeline = NULL; - -PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC __glewGetActiveAtomicCounterBufferiv = NULL; - -PFNGLBINDIMAGETEXTUREPROC __glewBindImageTexture = NULL; -PFNGLMEMORYBARRIERPROC __glewMemoryBarrier = NULL; - -PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB = NULL; -PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB = NULL; -PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB = NULL; -PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB = NULL; -PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB = NULL; -PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB = NULL; -PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB = NULL; -PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB = NULL; -PFNGLGETHANDLEARBPROC __glewGetHandleARB = NULL; -PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB = NULL; -PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB = NULL; -PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB = NULL; -PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB = NULL; -PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB = NULL; -PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB = NULL; -PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB = NULL; -PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB = NULL; -PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB = NULL; -PFNGLUNIFORM1FARBPROC __glewUniform1fARB = NULL; -PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB = NULL; -PFNGLUNIFORM1IARBPROC __glewUniform1iARB = NULL; -PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB = NULL; -PFNGLUNIFORM2FARBPROC __glewUniform2fARB = NULL; -PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB = NULL; -PFNGLUNIFORM2IARBPROC __glewUniform2iARB = NULL; -PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB = NULL; -PFNGLUNIFORM3FARBPROC __glewUniform3fARB = NULL; -PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB = NULL; -PFNGLUNIFORM3IARBPROC __glewUniform3iARB = NULL; -PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB = NULL; -PFNGLUNIFORM4FARBPROC __glewUniform4fARB = NULL; -PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB = NULL; -PFNGLUNIFORM4IARBPROC __glewUniform4iARB = NULL; -PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB = NULL; -PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB = NULL; -PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB = NULL; -PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB = NULL; -PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB = NULL; -PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB = NULL; - -PFNGLSHADERSTORAGEBLOCKBINDINGPROC __glewShaderStorageBlockBinding = NULL; - -PFNGLGETACTIVESUBROUTINENAMEPROC __glewGetActiveSubroutineName = NULL; -PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __glewGetActiveSubroutineUniformName = NULL; -PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC __glewGetActiveSubroutineUniformiv = NULL; -PFNGLGETPROGRAMSTAGEIVPROC __glewGetProgramStageiv = NULL; -PFNGLGETSUBROUTINEINDEXPROC __glewGetSubroutineIndex = NULL; -PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC __glewGetSubroutineUniformLocation = NULL; -PFNGLGETUNIFORMSUBROUTINEUIVPROC __glewGetUniformSubroutineuiv = NULL; -PFNGLUNIFORMSUBROUTINESUIVPROC __glewUniformSubroutinesuiv = NULL; - -PFNGLCOMPILESHADERINCLUDEARBPROC __glewCompileShaderIncludeARB = NULL; -PFNGLDELETENAMEDSTRINGARBPROC __glewDeleteNamedStringARB = NULL; -PFNGLGETNAMEDSTRINGARBPROC __glewGetNamedStringARB = NULL; -PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB = NULL; -PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB = NULL; -PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB = NULL; - -PFNGLBUFFERPAGECOMMITMENTARBPROC __glewBufferPageCommitmentARB = NULL; - -PFNGLTEXPAGECOMMITMENTARBPROC __glewTexPageCommitmentARB = NULL; -PFNGLTEXTUREPAGECOMMITMENTEXTPROC __glewTexturePageCommitmentEXT = NULL; - -PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync = NULL; -PFNGLDELETESYNCPROC __glewDeleteSync = NULL; -PFNGLFENCESYNCPROC __glewFenceSync = NULL; -PFNGLGETINTEGER64VPROC __glewGetInteger64v = NULL; -PFNGLGETSYNCIVPROC __glewGetSynciv = NULL; -PFNGLISSYNCPROC __glewIsSync = NULL; -PFNGLWAITSYNCPROC __glewWaitSync = NULL; - -PFNGLPATCHPARAMETERFVPROC __glewPatchParameterfv = NULL; -PFNGLPATCHPARAMETERIPROC __glewPatchParameteri = NULL; - -PFNGLTEXTUREBARRIERPROC __glewTextureBarrier = NULL; - -PFNGLTEXBUFFERARBPROC __glewTexBufferARB = NULL; - -PFNGLTEXBUFFERRANGEPROC __glewTexBufferRange = NULL; -PFNGLTEXTUREBUFFERRANGEEXTPROC __glewTextureBufferRangeEXT = NULL; - -PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB = NULL; -PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB = NULL; -PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB = NULL; -PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB = NULL; - -PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv = NULL; -PFNGLSAMPLEMASKIPROC __glewSampleMaski = NULL; -PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample = NULL; -PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample = NULL; - -PFNGLTEXSTORAGE1DPROC __glewTexStorage1D = NULL; -PFNGLTEXSTORAGE2DPROC __glewTexStorage2D = NULL; -PFNGLTEXSTORAGE3DPROC __glewTexStorage3D = NULL; -PFNGLTEXTURESTORAGE1DEXTPROC __glewTextureStorage1DEXT = NULL; -PFNGLTEXTURESTORAGE2DEXTPROC __glewTextureStorage2DEXT = NULL; -PFNGLTEXTURESTORAGE3DEXTPROC __glewTextureStorage3DEXT = NULL; - -PFNGLTEXSTORAGE2DMULTISAMPLEPROC __glewTexStorage2DMultisample = NULL; -PFNGLTEXSTORAGE3DMULTISAMPLEPROC __glewTexStorage3DMultisample = NULL; -PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC __glewTextureStorage2DMultisampleEXT = NULL; -PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC __glewTextureStorage3DMultisampleEXT = NULL; - -PFNGLTEXTUREVIEWPROC __glewTextureView = NULL; - -PFNGLGETQUERYOBJECTI64VPROC __glewGetQueryObjecti64v = NULL; -PFNGLGETQUERYOBJECTUI64VPROC __glewGetQueryObjectui64v = NULL; -PFNGLQUERYCOUNTERPROC __glewQueryCounter = NULL; - -PFNGLBINDTRANSFORMFEEDBACKPROC __glewBindTransformFeedback = NULL; -PFNGLDELETETRANSFORMFEEDBACKSPROC __glewDeleteTransformFeedbacks = NULL; -PFNGLDRAWTRANSFORMFEEDBACKPROC __glewDrawTransformFeedback = NULL; -PFNGLGENTRANSFORMFEEDBACKSPROC __glewGenTransformFeedbacks = NULL; -PFNGLISTRANSFORMFEEDBACKPROC __glewIsTransformFeedback = NULL; -PFNGLPAUSETRANSFORMFEEDBACKPROC __glewPauseTransformFeedback = NULL; -PFNGLRESUMETRANSFORMFEEDBACKPROC __glewResumeTransformFeedback = NULL; - -PFNGLBEGINQUERYINDEXEDPROC __glewBeginQueryIndexed = NULL; -PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC __glewDrawTransformFeedbackStream = NULL; -PFNGLENDQUERYINDEXEDPROC __glewEndQueryIndexed = NULL; -PFNGLGETQUERYINDEXEDIVPROC __glewGetQueryIndexediv = NULL; - -PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC __glewDrawTransformFeedbackInstanced = NULL; -PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC __glewDrawTransformFeedbackStreamInstanced = NULL; - -PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB = NULL; -PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB = NULL; -PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB = NULL; -PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB = NULL; - -PFNGLBINDBUFFERBASEPROC __glewBindBufferBase = NULL; -PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange = NULL; -PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName = NULL; -PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv = NULL; -PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName = NULL; -PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv = NULL; -PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v = NULL; -PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex = NULL; -PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices = NULL; -PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding = NULL; - -PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray = NULL; -PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays = NULL; -PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays = NULL; -PFNGLISVERTEXARRAYPROC __glewIsVertexArray = NULL; - -PFNGLGETVERTEXATTRIBLDVPROC __glewGetVertexAttribLdv = NULL; -PFNGLVERTEXATTRIBL1DPROC __glewVertexAttribL1d = NULL; -PFNGLVERTEXATTRIBL1DVPROC __glewVertexAttribL1dv = NULL; -PFNGLVERTEXATTRIBL2DPROC __glewVertexAttribL2d = NULL; -PFNGLVERTEXATTRIBL2DVPROC __glewVertexAttribL2dv = NULL; -PFNGLVERTEXATTRIBL3DPROC __glewVertexAttribL3d = NULL; -PFNGLVERTEXATTRIBL3DVPROC __glewVertexAttribL3dv = NULL; -PFNGLVERTEXATTRIBL4DPROC __glewVertexAttribL4d = NULL; -PFNGLVERTEXATTRIBL4DVPROC __glewVertexAttribL4dv = NULL; -PFNGLVERTEXATTRIBLPOINTERPROC __glewVertexAttribLPointer = NULL; - -PFNGLBINDVERTEXBUFFERPROC __glewBindVertexBuffer = NULL; -PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC __glewVertexArrayBindVertexBufferEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC __glewVertexArrayVertexAttribBindingEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC __glewVertexArrayVertexAttribFormatEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC __glewVertexArrayVertexAttribIFormatEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC __glewVertexArrayVertexAttribLFormatEXT = NULL; -PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC __glewVertexArrayVertexBindingDivisorEXT = NULL; -PFNGLVERTEXATTRIBBINDINGPROC __glewVertexAttribBinding = NULL; -PFNGLVERTEXATTRIBFORMATPROC __glewVertexAttribFormat = NULL; -PFNGLVERTEXATTRIBIFORMATPROC __glewVertexAttribIFormat = NULL; -PFNGLVERTEXATTRIBLFORMATPROC __glewVertexAttribLFormat = NULL; -PFNGLVERTEXBINDINGDIVISORPROC __glewVertexBindingDivisor = NULL; - -PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB = NULL; -PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB = NULL; -PFNGLWEIGHTBVARBPROC __glewWeightbvARB = NULL; -PFNGLWEIGHTDVARBPROC __glewWeightdvARB = NULL; -PFNGLWEIGHTFVARBPROC __glewWeightfvARB = NULL; -PFNGLWEIGHTIVARBPROC __glewWeightivARB = NULL; -PFNGLWEIGHTSVARBPROC __glewWeightsvARB = NULL; -PFNGLWEIGHTUBVARBPROC __glewWeightubvARB = NULL; -PFNGLWEIGHTUIVARBPROC __glewWeightuivARB = NULL; -PFNGLWEIGHTUSVARBPROC __glewWeightusvARB = NULL; - -PFNGLBINDBUFFERARBPROC __glewBindBufferARB = NULL; -PFNGLBUFFERDATAARBPROC __glewBufferDataARB = NULL; -PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB = NULL; -PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB = NULL; -PFNGLGENBUFFERSARBPROC __glewGenBuffersARB = NULL; -PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB = NULL; -PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB = NULL; -PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB = NULL; -PFNGLISBUFFERARBPROC __glewIsBufferARB = NULL; -PFNGLMAPBUFFERARBPROC __glewMapBufferARB = NULL; -PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB = NULL; - -PFNGLBINDPROGRAMARBPROC __glewBindProgramARB = NULL; -PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB = NULL; -PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB = NULL; -PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB = NULL; -PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB = NULL; -PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB = NULL; -PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB = NULL; -PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB = NULL; -PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB = NULL; -PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB = NULL; -PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB = NULL; -PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB = NULL; -PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB = NULL; -PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB = NULL; -PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB = NULL; -PFNGLISPROGRAMARBPROC __glewIsProgramARB = NULL; -PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB = NULL; -PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB = NULL; -PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB = NULL; -PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB = NULL; -PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB = NULL; -PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB = NULL; -PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB = NULL; -PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB = NULL; -PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB = NULL; -PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB = NULL; -PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB = NULL; -PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB = NULL; -PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB = NULL; -PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB = NULL; -PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB = NULL; -PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB = NULL; -PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB = NULL; -PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB = NULL; -PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB = NULL; -PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB = NULL; -PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB = NULL; -PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB = NULL; -PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB = NULL; -PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB = NULL; -PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB = NULL; -PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB = NULL; -PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB = NULL; -PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB = NULL; -PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB = NULL; -PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB = NULL; -PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB = NULL; -PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB = NULL; -PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB = NULL; -PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB = NULL; -PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB = NULL; -PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB = NULL; -PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB = NULL; -PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB = NULL; -PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB = NULL; -PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB = NULL; -PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB = NULL; -PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB = NULL; - -PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB = NULL; -PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB = NULL; -PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB = NULL; - -PFNGLCOLORP3UIPROC __glewColorP3ui = NULL; -PFNGLCOLORP3UIVPROC __glewColorP3uiv = NULL; -PFNGLCOLORP4UIPROC __glewColorP4ui = NULL; -PFNGLCOLORP4UIVPROC __glewColorP4uiv = NULL; -PFNGLMULTITEXCOORDP1UIPROC __glewMultiTexCoordP1ui = NULL; -PFNGLMULTITEXCOORDP1UIVPROC __glewMultiTexCoordP1uiv = NULL; -PFNGLMULTITEXCOORDP2UIPROC __glewMultiTexCoordP2ui = NULL; -PFNGLMULTITEXCOORDP2UIVPROC __glewMultiTexCoordP2uiv = NULL; -PFNGLMULTITEXCOORDP3UIPROC __glewMultiTexCoordP3ui = NULL; -PFNGLMULTITEXCOORDP3UIVPROC __glewMultiTexCoordP3uiv = NULL; -PFNGLMULTITEXCOORDP4UIPROC __glewMultiTexCoordP4ui = NULL; -PFNGLMULTITEXCOORDP4UIVPROC __glewMultiTexCoordP4uiv = NULL; -PFNGLNORMALP3UIPROC __glewNormalP3ui = NULL; -PFNGLNORMALP3UIVPROC __glewNormalP3uiv = NULL; -PFNGLSECONDARYCOLORP3UIPROC __glewSecondaryColorP3ui = NULL; -PFNGLSECONDARYCOLORP3UIVPROC __glewSecondaryColorP3uiv = NULL; -PFNGLTEXCOORDP1UIPROC __glewTexCoordP1ui = NULL; -PFNGLTEXCOORDP1UIVPROC __glewTexCoordP1uiv = NULL; -PFNGLTEXCOORDP2UIPROC __glewTexCoordP2ui = NULL; -PFNGLTEXCOORDP2UIVPROC __glewTexCoordP2uiv = NULL; -PFNGLTEXCOORDP3UIPROC __glewTexCoordP3ui = NULL; -PFNGLTEXCOORDP3UIVPROC __glewTexCoordP3uiv = NULL; -PFNGLTEXCOORDP4UIPROC __glewTexCoordP4ui = NULL; -PFNGLTEXCOORDP4UIVPROC __glewTexCoordP4uiv = NULL; -PFNGLVERTEXATTRIBP1UIPROC __glewVertexAttribP1ui = NULL; -PFNGLVERTEXATTRIBP1UIVPROC __glewVertexAttribP1uiv = NULL; -PFNGLVERTEXATTRIBP2UIPROC __glewVertexAttribP2ui = NULL; -PFNGLVERTEXATTRIBP2UIVPROC __glewVertexAttribP2uiv = NULL; -PFNGLVERTEXATTRIBP3UIPROC __glewVertexAttribP3ui = NULL; -PFNGLVERTEXATTRIBP3UIVPROC __glewVertexAttribP3uiv = NULL; -PFNGLVERTEXATTRIBP4UIPROC __glewVertexAttribP4ui = NULL; -PFNGLVERTEXATTRIBP4UIVPROC __glewVertexAttribP4uiv = NULL; -PFNGLVERTEXP2UIPROC __glewVertexP2ui = NULL; -PFNGLVERTEXP2UIVPROC __glewVertexP2uiv = NULL; -PFNGLVERTEXP3UIPROC __glewVertexP3ui = NULL; -PFNGLVERTEXP3UIVPROC __glewVertexP3uiv = NULL; -PFNGLVERTEXP4UIPROC __glewVertexP4ui = NULL; -PFNGLVERTEXP4UIVPROC __glewVertexP4uiv = NULL; - -PFNGLDEPTHRANGEARRAYVPROC __glewDepthRangeArrayv = NULL; -PFNGLDEPTHRANGEINDEXEDPROC __glewDepthRangeIndexed = NULL; -PFNGLGETDOUBLEI_VPROC __glewGetDoublei_v = NULL; -PFNGLGETFLOATI_VPROC __glewGetFloati_v = NULL; -PFNGLSCISSORARRAYVPROC __glewScissorArrayv = NULL; -PFNGLSCISSORINDEXEDPROC __glewScissorIndexed = NULL; -PFNGLSCISSORINDEXEDVPROC __glewScissorIndexedv = NULL; -PFNGLVIEWPORTARRAYVPROC __glewViewportArrayv = NULL; -PFNGLVIEWPORTINDEXEDFPROC __glewViewportIndexedf = NULL; -PFNGLVIEWPORTINDEXEDFVPROC __glewViewportIndexedfv = NULL; - -PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB = NULL; -PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB = NULL; -PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB = NULL; -PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB = NULL; -PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB = NULL; -PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB = NULL; -PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB = NULL; -PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB = NULL; -PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB = NULL; -PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB = NULL; -PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB = NULL; -PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB = NULL; -PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB = NULL; -PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB = NULL; -PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB = NULL; -PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB = NULL; - -PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI = NULL; - -PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI = NULL; -PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI = NULL; -PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI = NULL; - -PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI = NULL; -PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI = NULL; -PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI = NULL; -PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI = NULL; - -PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI = NULL; -PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI = NULL; -PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI = NULL; -PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI = NULL; -PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI = NULL; -PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI = NULL; -PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI = NULL; -PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI = NULL; -PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI = NULL; -PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI = NULL; -PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI = NULL; -PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI = NULL; -PFNGLSAMPLEMAPATIPROC __glewSampleMapATI = NULL; -PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI = NULL; - -PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI = NULL; -PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI = NULL; - -PFNGLPNTRIANGLESFATIPROC __glewPNTrianglesfATI = NULL; -PFNGLPNTRIANGLESIATIPROC __glewPNTrianglesiATI = NULL; - -PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI = NULL; -PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI = NULL; - -PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI = NULL; -PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI = NULL; -PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI = NULL; -PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI = NULL; -PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI = NULL; -PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI = NULL; -PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI = NULL; -PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI = NULL; -PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI = NULL; -PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI = NULL; -PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI = NULL; -PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI = NULL; - -PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI = NULL; -PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI = NULL; -PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI = NULL; - -PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI = NULL; -PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI = NULL; -PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI = NULL; -PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI = NULL; -PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI = NULL; -PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI = NULL; -PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI = NULL; -PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI = NULL; -PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI = NULL; -PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI = NULL; -PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI = NULL; -PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI = NULL; -PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI = NULL; -PFNGLVERTEXSTREAM1DATIPROC __glewVertexStream1dATI = NULL; -PFNGLVERTEXSTREAM1DVATIPROC __glewVertexStream1dvATI = NULL; -PFNGLVERTEXSTREAM1FATIPROC __glewVertexStream1fATI = NULL; -PFNGLVERTEXSTREAM1FVATIPROC __glewVertexStream1fvATI = NULL; -PFNGLVERTEXSTREAM1IATIPROC __glewVertexStream1iATI = NULL; -PFNGLVERTEXSTREAM1IVATIPROC __glewVertexStream1ivATI = NULL; -PFNGLVERTEXSTREAM1SATIPROC __glewVertexStream1sATI = NULL; -PFNGLVERTEXSTREAM1SVATIPROC __glewVertexStream1svATI = NULL; -PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI = NULL; -PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI = NULL; -PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI = NULL; -PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI = NULL; -PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI = NULL; -PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI = NULL; -PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI = NULL; -PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI = NULL; -PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI = NULL; -PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI = NULL; -PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI = NULL; -PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI = NULL; -PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI = NULL; -PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI = NULL; -PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI = NULL; -PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI = NULL; -PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI = NULL; -PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI = NULL; -PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI = NULL; -PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI = NULL; -PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI = NULL; -PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI = NULL; -PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI = NULL; -PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI = NULL; - -PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT = NULL; -PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT = NULL; -PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT = NULL; - -PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT = NULL; - -PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT = NULL; - -PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT = NULL; - -PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT = NULL; - -PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT = NULL; -PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT = NULL; - -PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT = NULL; -PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT = NULL; - -PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT = NULL; -PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT = NULL; -PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT = NULL; -PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT = NULL; -PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT = NULL; -PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT = NULL; -PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT = NULL; -PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT = NULL; -PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT = NULL; -PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT = NULL; -PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT = NULL; -PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT = NULL; -PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT = NULL; - -PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT = NULL; -PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT = NULL; - -PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT = NULL; -PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT = NULL; -PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT = NULL; -PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT = NULL; -PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT = NULL; - -PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT = NULL; -PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT = NULL; - -PFNGLGETOBJECTLABELEXTPROC __glewGetObjectLabelEXT = NULL; -PFNGLLABELOBJECTEXTPROC __glewLabelObjectEXT = NULL; - -PFNGLINSERTEVENTMARKEREXTPROC __glewInsertEventMarkerEXT = NULL; -PFNGLPOPGROUPMARKEREXTPROC __glewPopGroupMarkerEXT = NULL; -PFNGLPUSHGROUPMARKEREXTPROC __glewPushGroupMarkerEXT = NULL; - -PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT = NULL; - -PFNGLBINDMULTITEXTUREEXTPROC __glewBindMultiTextureEXT = NULL; -PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __glewCheckNamedFramebufferStatusEXT = NULL; -PFNGLCLIENTATTRIBDEFAULTEXTPROC __glewClientAttribDefaultEXT = NULL; -PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __glewCompressedMultiTexImage1DEXT = NULL; -PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __glewCompressedMultiTexImage2DEXT = NULL; -PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __glewCompressedMultiTexImage3DEXT = NULL; -PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __glewCompressedMultiTexSubImage1DEXT = NULL; -PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __glewCompressedMultiTexSubImage2DEXT = NULL; -PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __glewCompressedMultiTexSubImage3DEXT = NULL; -PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __glewCompressedTextureImage1DEXT = NULL; -PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __glewCompressedTextureImage2DEXT = NULL; -PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __glewCompressedTextureImage3DEXT = NULL; -PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __glewCompressedTextureSubImage1DEXT = NULL; -PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __glewCompressedTextureSubImage2DEXT = NULL; -PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __glewCompressedTextureSubImage3DEXT = NULL; -PFNGLCOPYMULTITEXIMAGE1DEXTPROC __glewCopyMultiTexImage1DEXT = NULL; -PFNGLCOPYMULTITEXIMAGE2DEXTPROC __glewCopyMultiTexImage2DEXT = NULL; -PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC __glewCopyMultiTexSubImage1DEXT = NULL; -PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC __glewCopyMultiTexSubImage2DEXT = NULL; -PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC __glewCopyMultiTexSubImage3DEXT = NULL; -PFNGLCOPYTEXTUREIMAGE1DEXTPROC __glewCopyTextureImage1DEXT = NULL; -PFNGLCOPYTEXTUREIMAGE2DEXTPROC __glewCopyTextureImage2DEXT = NULL; -PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT = NULL; -PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT = NULL; -PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT = NULL; -PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT = NULL; -PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT = NULL; -PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT = NULL; -PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT = NULL; -PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT = NULL; -PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT = NULL; -PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT = NULL; -PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT = NULL; -PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT = NULL; -PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT = NULL; -PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT = NULL; -PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT = NULL; -PFNGLGENERATEMULTITEXMIPMAPEXTPROC __glewGenerateMultiTexMipmapEXT = NULL; -PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT = NULL; -PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT = NULL; -PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT = NULL; -PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT = NULL; -PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT = NULL; -PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT = NULL; -PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT = NULL; -PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT = NULL; -PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT = NULL; -PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT = NULL; -PFNGLGETMULTITEXGENDVEXTPROC __glewGetMultiTexGendvEXT = NULL; -PFNGLGETMULTITEXGENFVEXTPROC __glewGetMultiTexGenfvEXT = NULL; -PFNGLGETMULTITEXGENIVEXTPROC __glewGetMultiTexGenivEXT = NULL; -PFNGLGETMULTITEXIMAGEEXTPROC __glewGetMultiTexImageEXT = NULL; -PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC __glewGetMultiTexLevelParameterfvEXT = NULL; -PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC __glewGetMultiTexLevelParameterivEXT = NULL; -PFNGLGETMULTITEXPARAMETERIIVEXTPROC __glewGetMultiTexParameterIivEXT = NULL; -PFNGLGETMULTITEXPARAMETERIUIVEXTPROC __glewGetMultiTexParameterIuivEXT = NULL; -PFNGLGETMULTITEXPARAMETERFVEXTPROC __glewGetMultiTexParameterfvEXT = NULL; -PFNGLGETMULTITEXPARAMETERIVEXTPROC __glewGetMultiTexParameterivEXT = NULL; -PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC __glewGetNamedBufferParameterivEXT = NULL; -PFNGLGETNAMEDBUFFERPOINTERVEXTPROC __glewGetNamedBufferPointervEXT = NULL; -PFNGLGETNAMEDBUFFERSUBDATAEXTPROC __glewGetNamedBufferSubDataEXT = NULL; -PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetNamedFramebufferAttachmentParameterivEXT = NULL; -PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __glewGetNamedProgramLocalParameterIivEXT = NULL; -PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __glewGetNamedProgramLocalParameterIuivEXT = NULL; -PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __glewGetNamedProgramLocalParameterdvEXT = NULL; -PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __glewGetNamedProgramLocalParameterfvEXT = NULL; -PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT = NULL; -PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT = NULL; -PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT = NULL; -PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT = NULL; -PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT = NULL; -PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT = NULL; -PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT = NULL; -PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT = NULL; -PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT = NULL; -PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT = NULL; -PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT = NULL; -PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT = NULL; -PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT = NULL; -PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT = NULL; -PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT = NULL; -PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT = NULL; -PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT = NULL; -PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT = NULL; -PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT = NULL; -PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT = NULL; -PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT = NULL; -PFNGLMATRIXLOADTRANSPOSEFEXTPROC __glewMatrixLoadTransposefEXT = NULL; -PFNGLMATRIXLOADDEXTPROC __glewMatrixLoaddEXT = NULL; -PFNGLMATRIXLOADFEXTPROC __glewMatrixLoadfEXT = NULL; -PFNGLMATRIXMULTTRANSPOSEDEXTPROC __glewMatrixMultTransposedEXT = NULL; -PFNGLMATRIXMULTTRANSPOSEFEXTPROC __glewMatrixMultTransposefEXT = NULL; -PFNGLMATRIXMULTDEXTPROC __glewMatrixMultdEXT = NULL; -PFNGLMATRIXMULTFEXTPROC __glewMatrixMultfEXT = NULL; -PFNGLMATRIXORTHOEXTPROC __glewMatrixOrthoEXT = NULL; -PFNGLMATRIXPOPEXTPROC __glewMatrixPopEXT = NULL; -PFNGLMATRIXPUSHEXTPROC __glewMatrixPushEXT = NULL; -PFNGLMATRIXROTATEDEXTPROC __glewMatrixRotatedEXT = NULL; -PFNGLMATRIXROTATEFEXTPROC __glewMatrixRotatefEXT = NULL; -PFNGLMATRIXSCALEDEXTPROC __glewMatrixScaledEXT = NULL; -PFNGLMATRIXSCALEFEXTPROC __glewMatrixScalefEXT = NULL; -PFNGLMATRIXTRANSLATEDEXTPROC __glewMatrixTranslatedEXT = NULL; -PFNGLMATRIXTRANSLATEFEXTPROC __glewMatrixTranslatefEXT = NULL; -PFNGLMULTITEXBUFFEREXTPROC __glewMultiTexBufferEXT = NULL; -PFNGLMULTITEXCOORDPOINTEREXTPROC __glewMultiTexCoordPointerEXT = NULL; -PFNGLMULTITEXENVFEXTPROC __glewMultiTexEnvfEXT = NULL; -PFNGLMULTITEXENVFVEXTPROC __glewMultiTexEnvfvEXT = NULL; -PFNGLMULTITEXENVIEXTPROC __glewMultiTexEnviEXT = NULL; -PFNGLMULTITEXENVIVEXTPROC __glewMultiTexEnvivEXT = NULL; -PFNGLMULTITEXGENDEXTPROC __glewMultiTexGendEXT = NULL; -PFNGLMULTITEXGENDVEXTPROC __glewMultiTexGendvEXT = NULL; -PFNGLMULTITEXGENFEXTPROC __glewMultiTexGenfEXT = NULL; -PFNGLMULTITEXGENFVEXTPROC __glewMultiTexGenfvEXT = NULL; -PFNGLMULTITEXGENIEXTPROC __glewMultiTexGeniEXT = NULL; -PFNGLMULTITEXGENIVEXTPROC __glewMultiTexGenivEXT = NULL; -PFNGLMULTITEXIMAGE1DEXTPROC __glewMultiTexImage1DEXT = NULL; -PFNGLMULTITEXIMAGE2DEXTPROC __glewMultiTexImage2DEXT = NULL; -PFNGLMULTITEXIMAGE3DEXTPROC __glewMultiTexImage3DEXT = NULL; -PFNGLMULTITEXPARAMETERIIVEXTPROC __glewMultiTexParameterIivEXT = NULL; -PFNGLMULTITEXPARAMETERIUIVEXTPROC __glewMultiTexParameterIuivEXT = NULL; -PFNGLMULTITEXPARAMETERFEXTPROC __glewMultiTexParameterfEXT = NULL; -PFNGLMULTITEXPARAMETERFVEXTPROC __glewMultiTexParameterfvEXT = NULL; -PFNGLMULTITEXPARAMETERIEXTPROC __glewMultiTexParameteriEXT = NULL; -PFNGLMULTITEXPARAMETERIVEXTPROC __glewMultiTexParameterivEXT = NULL; -PFNGLMULTITEXRENDERBUFFEREXTPROC __glewMultiTexRenderbufferEXT = NULL; -PFNGLMULTITEXSUBIMAGE1DEXTPROC __glewMultiTexSubImage1DEXT = NULL; -PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT = NULL; -PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT = NULL; -PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT = NULL; -PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT = NULL; -PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT = NULL; -PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __glewNamedFramebufferTexture3DEXT = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __glewNamedFramebufferTextureEXT = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __glewNamedFramebufferTextureFaceEXT = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __glewNamedFramebufferTextureLayerEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __glewNamedProgramLocalParameter4dEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __glewNamedProgramLocalParameter4dvEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __glewNamedProgramLocalParameter4fEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __glewNamedProgramLocalParameter4fvEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __glewNamedProgramLocalParameterI4iEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __glewNamedProgramLocalParameterI4ivEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __glewNamedProgramLocalParameterI4uiEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __glewNamedProgramLocalParameterI4uivEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __glewNamedProgramLocalParameters4fvEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __glewNamedProgramLocalParametersI4ivEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __glewNamedProgramLocalParametersI4uivEXT = NULL; -PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT = NULL; -PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT = NULL; -PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT = NULL; -PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT = NULL; -PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT = NULL; -PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT = NULL; -PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT = NULL; -PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT = NULL; -PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT = NULL; -PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT = NULL; -PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT = NULL; -PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT = NULL; -PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT = NULL; -PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT = NULL; -PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT = NULL; -PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT = NULL; -PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT = NULL; -PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT = NULL; -PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT = NULL; -PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT = NULL; -PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT = NULL; -PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT = NULL; -PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT = NULL; -PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT = NULL; -PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT = NULL; -PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT = NULL; -PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT = NULL; -PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT = NULL; -PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT = NULL; -PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT = NULL; -PFNGLTEXTUREIMAGE1DEXTPROC __glewTextureImage1DEXT = NULL; -PFNGLTEXTUREIMAGE2DEXTPROC __glewTextureImage2DEXT = NULL; -PFNGLTEXTUREIMAGE3DEXTPROC __glewTextureImage3DEXT = NULL; -PFNGLTEXTUREPARAMETERIIVEXTPROC __glewTextureParameterIivEXT = NULL; -PFNGLTEXTUREPARAMETERIUIVEXTPROC __glewTextureParameterIuivEXT = NULL; -PFNGLTEXTUREPARAMETERFEXTPROC __glewTextureParameterfEXT = NULL; -PFNGLTEXTUREPARAMETERFVEXTPROC __glewTextureParameterfvEXT = NULL; -PFNGLTEXTUREPARAMETERIEXTPROC __glewTextureParameteriEXT = NULL; -PFNGLTEXTUREPARAMETERIVEXTPROC __glewTextureParameterivEXT = NULL; -PFNGLTEXTURERENDERBUFFEREXTPROC __glewTextureRenderbufferEXT = NULL; -PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT = NULL; -PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT = NULL; -PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT = NULL; -PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT = NULL; -PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT = NULL; -PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT = NULL; -PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT = NULL; -PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT = NULL; -PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT = NULL; -PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT = NULL; -PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT = NULL; -PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC __glewVertexArrayVertexAttribDivisorEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT = NULL; -PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT = NULL; - -PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT = NULL; -PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT = NULL; -PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT = NULL; -PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT = NULL; -PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT = NULL; -PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT = NULL; - -PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT = NULL; -PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT = NULL; - -PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT = NULL; - -PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT = NULL; -PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT = NULL; -PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT = NULL; -PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT = NULL; -PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT = NULL; - -PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT = NULL; -PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT = NULL; -PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT = NULL; -PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT = NULL; -PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT = NULL; -PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT = NULL; -PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT = NULL; -PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT = NULL; -PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT = NULL; -PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT = NULL; -PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT = NULL; -PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT = NULL; -PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT = NULL; -PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT = NULL; -PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT = NULL; -PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT = NULL; -PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT = NULL; -PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT = NULL; - -PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT = NULL; - -PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT = NULL; - -PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT = NULL; -PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT = NULL; -PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT = NULL; -PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT = NULL; -PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT = NULL; -PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT = NULL; -PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT = NULL; -PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT = NULL; -PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT = NULL; -PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT = NULL; -PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT = NULL; -PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT = NULL; -PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT = NULL; -PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT = NULL; -PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT = NULL; -PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT = NULL; -PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT = NULL; - -PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT = NULL; -PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT = NULL; -PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT = NULL; - -PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT = NULL; -PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT = NULL; - -PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT = NULL; -PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT = NULL; -PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT = NULL; -PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT = NULL; -PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT = NULL; -PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT = NULL; -PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT = NULL; -PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT = NULL; -PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT = NULL; -PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT = NULL; -PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT = NULL; -PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT = NULL; -PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT = NULL; -PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT = NULL; -PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT = NULL; -PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT = NULL; -PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT = NULL; -PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT = NULL; -PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT = NULL; -PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT = NULL; -PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT = NULL; -PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT = NULL; -PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT = NULL; -PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT = NULL; -PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT = NULL; -PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT = NULL; -PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT = NULL; -PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT = NULL; -PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT = NULL; -PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT = NULL; -PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT = NULL; -PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT = NULL; -PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT = NULL; -PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT = NULL; - -PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT = NULL; -PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT = NULL; -PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT = NULL; -PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT = NULL; -PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT = NULL; -PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT = NULL; -PFNGLHISTOGRAMEXTPROC __glewHistogramEXT = NULL; -PFNGLMINMAXEXTPROC __glewMinmaxEXT = NULL; -PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT = NULL; -PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT = NULL; - -PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT = NULL; - -PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT = NULL; - -PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT = NULL; -PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT = NULL; -PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT = NULL; - -PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT = NULL; -PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT = NULL; - -PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT = NULL; -PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT = NULL; - -PFNGLCOLORTABLEEXTPROC __glewColorTableEXT = NULL; -PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT = NULL; -PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT = NULL; -PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT = NULL; - -PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT = NULL; -PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT = NULL; -PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT = NULL; -PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT = NULL; -PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT = NULL; -PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT = NULL; - -PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT = NULL; -PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT = NULL; - -PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT = NULL; - -PFNGLPOLYGONOFFSETCLAMPEXTPROC __glewPolygonOffsetClampEXT = NULL; - -PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT = NULL; - -PFNGLCOVERAGEMODULATIONNVPROC __glewCoverageModulationNV = NULL; -PFNGLCOVERAGEMODULATIONTABLENVPROC __glewCoverageModulationTableNV = NULL; -PFNGLGETCOVERAGEMODULATIONTABLENVPROC __glewGetCoverageModulationTableNV = NULL; -PFNGLRASTERSAMPLESEXTPROC __glewRasterSamplesEXT = NULL; - -PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT = NULL; -PFNGLENDSCENEEXTPROC __glewEndSceneEXT = NULL; - -PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT = NULL; -PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT = NULL; -PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT = NULL; -PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT = NULL; -PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT = NULL; -PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT = NULL; -PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT = NULL; -PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT = NULL; -PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT = NULL; -PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT = NULL; -PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT = NULL; -PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT = NULL; -PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT = NULL; -PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT = NULL; -PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT = NULL; -PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT = NULL; -PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT = NULL; - -PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT = NULL; -PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT = NULL; -PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT = NULL; - -PFNGLBINDIMAGETEXTUREEXTPROC __glewBindImageTextureEXT = NULL; -PFNGLMEMORYBARRIEREXTPROC __glewMemoryBarrierEXT = NULL; - -PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT = NULL; - -PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT = NULL; -PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT = NULL; -PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT = NULL; - -PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT = NULL; - -PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT = NULL; - -PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT = NULL; - -PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT = NULL; -PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT = NULL; -PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT = NULL; -PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT = NULL; -PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT = NULL; -PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT = NULL; - -PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT = NULL; -PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT = NULL; -PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT = NULL; -PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT = NULL; -PFNGLISTEXTUREEXTPROC __glewIsTextureEXT = NULL; -PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT = NULL; - -PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT = NULL; - -PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT = NULL; -PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT = NULL; - -PFNGLBEGINTRANSFORMFEEDBACKEXTPROC __glewBeginTransformFeedbackEXT = NULL; -PFNGLBINDBUFFERBASEEXTPROC __glewBindBufferBaseEXT = NULL; -PFNGLBINDBUFFEROFFSETEXTPROC __glewBindBufferOffsetEXT = NULL; -PFNGLBINDBUFFERRANGEEXTPROC __glewBindBufferRangeEXT = NULL; -PFNGLENDTRANSFORMFEEDBACKEXTPROC __glewEndTransformFeedbackEXT = NULL; -PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC __glewGetTransformFeedbackVaryingEXT = NULL; -PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC __glewTransformFeedbackVaryingsEXT = NULL; - -PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT = NULL; -PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT = NULL; -PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT = NULL; -PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT = NULL; -PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT = NULL; -PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT = NULL; -PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT = NULL; -PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT = NULL; - -PFNGLGETVERTEXATTRIBLDVEXTPROC __glewGetVertexAttribLdvEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __glewVertexArrayVertexAttribLOffsetEXT = NULL; -PFNGLVERTEXATTRIBL1DEXTPROC __glewVertexAttribL1dEXT = NULL; -PFNGLVERTEXATTRIBL1DVEXTPROC __glewVertexAttribL1dvEXT = NULL; -PFNGLVERTEXATTRIBL2DEXTPROC __glewVertexAttribL2dEXT = NULL; -PFNGLVERTEXATTRIBL2DVEXTPROC __glewVertexAttribL2dvEXT = NULL; -PFNGLVERTEXATTRIBL3DEXTPROC __glewVertexAttribL3dEXT = NULL; -PFNGLVERTEXATTRIBL3DVEXTPROC __glewVertexAttribL3dvEXT = NULL; -PFNGLVERTEXATTRIBL4DEXTPROC __glewVertexAttribL4dEXT = NULL; -PFNGLVERTEXATTRIBL4DVEXTPROC __glewVertexAttribL4dvEXT = NULL; -PFNGLVERTEXATTRIBLPOINTEREXTPROC __glewVertexAttribLPointerEXT = NULL; - -PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT = NULL; -PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT = NULL; -PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT = NULL; -PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT = NULL; -PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT = NULL; -PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT = NULL; -PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT = NULL; -PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT = NULL; -PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT = NULL; -PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT = NULL; -PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT = NULL; -PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT = NULL; -PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT = NULL; -PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT = NULL; -PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT = NULL; -PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT = NULL; -PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT = NULL; -PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT = NULL; -PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT = NULL; -PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT = NULL; -PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT = NULL; -PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT = NULL; -PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT = NULL; -PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT = NULL; -PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT = NULL; -PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT = NULL; -PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT = NULL; -PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT = NULL; -PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT = NULL; -PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT = NULL; -PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT = NULL; -PFNGLSWIZZLEEXTPROC __glewSwizzleEXT = NULL; -PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT = NULL; -PFNGLVARIANTBVEXTPROC __glewVariantbvEXT = NULL; -PFNGLVARIANTDVEXTPROC __glewVariantdvEXT = NULL; -PFNGLVARIANTFVEXTPROC __glewVariantfvEXT = NULL; -PFNGLVARIANTIVEXTPROC __glewVariantivEXT = NULL; -PFNGLVARIANTSVEXTPROC __glewVariantsvEXT = NULL; -PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT = NULL; -PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT = NULL; -PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT = NULL; -PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT = NULL; - -PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT = NULL; -PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT = NULL; -PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT = NULL; - -PFNGLIMPORTSYNCEXTPROC __glewImportSyncEXT = NULL; - -PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY = NULL; - -PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY = NULL; - -PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP = NULL; -PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP = NULL; -PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP = NULL; -PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP = NULL; -PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP = NULL; -PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP = NULL; - -PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM = NULL; -PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM = NULL; - -PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM = NULL; -PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM = NULL; -PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM = NULL; -PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM = NULL; -PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM = NULL; -PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM = NULL; -PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM = NULL; -PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM = NULL; - -PFNGLMAPTEXTURE2DINTELPROC __glewMapTexture2DINTEL = NULL; -PFNGLSYNCTEXTUREINTELPROC __glewSyncTextureINTEL = NULL; -PFNGLUNMAPTEXTURE2DINTELPROC __glewUnmapTexture2DINTEL = NULL; - -PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL = NULL; -PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL = NULL; -PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL = NULL; -PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL = NULL; - -PFNGLBEGINPERFQUERYINTELPROC __glewBeginPerfQueryINTEL = NULL; -PFNGLCREATEPERFQUERYINTELPROC __glewCreatePerfQueryINTEL = NULL; -PFNGLDELETEPERFQUERYINTELPROC __glewDeletePerfQueryINTEL = NULL; -PFNGLENDPERFQUERYINTELPROC __glewEndPerfQueryINTEL = NULL; -PFNGLGETFIRSTPERFQUERYIDINTELPROC __glewGetFirstPerfQueryIdINTEL = NULL; -PFNGLGETNEXTPERFQUERYIDINTELPROC __glewGetNextPerfQueryIdINTEL = NULL; -PFNGLGETPERFCOUNTERINFOINTELPROC __glewGetPerfCounterInfoINTEL = NULL; -PFNGLGETPERFQUERYDATAINTELPROC __glewGetPerfQueryDataINTEL = NULL; -PFNGLGETPERFQUERYIDBYNAMEINTELPROC __glewGetPerfQueryIdByNameINTEL = NULL; -PFNGLGETPERFQUERYINFOINTELPROC __glewGetPerfQueryInfoINTEL = NULL; - -PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL = NULL; -PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL = NULL; - -PFNGLBLENDBARRIERKHRPROC __glewBlendBarrierKHR = NULL; - -PFNGLDEBUGMESSAGECALLBACKPROC __glewDebugMessageCallback = NULL; -PFNGLDEBUGMESSAGECONTROLPROC __glewDebugMessageControl = NULL; -PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert = NULL; -PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog = NULL; -PFNGLGETOBJECTLABELPROC __glewGetObjectLabel = NULL; -PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel = NULL; -PFNGLOBJECTLABELPROC __glewObjectLabel = NULL; -PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel = NULL; -PFNGLPOPDEBUGGROUPPROC __glewPopDebugGroup = NULL; -PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup = NULL; - -PFNGLGETNUNIFORMFVPROC __glewGetnUniformfv = NULL; -PFNGLGETNUNIFORMIVPROC __glewGetnUniformiv = NULL; -PFNGLGETNUNIFORMUIVPROC __glewGetnUniformuiv = NULL; -PFNGLREADNPIXELSPROC __glewReadnPixels = NULL; - -PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled = NULL; -PFNGLDELETEBUFFERREGIONPROC __glewDeleteBufferRegion = NULL; -PFNGLDRAWBUFFERREGIONPROC __glewDrawBufferRegion = NULL; -PFNGLNEWBUFFERREGIONPROC __glewNewBufferRegion = NULL; -PFNGLREADBUFFERREGIONPROC __glewReadBufferRegion = NULL; - -PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA = NULL; - -PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA = NULL; -PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA = NULL; -PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA = NULL; -PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA = NULL; -PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA = NULL; -PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA = NULL; -PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA = NULL; -PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA = NULL; -PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA = NULL; -PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA = NULL; -PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA = NULL; -PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA = NULL; -PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA = NULL; -PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA = NULL; -PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA = NULL; -PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA = NULL; -PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA = NULL; -PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA = NULL; -PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA = NULL; -PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA = NULL; -PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA = NULL; -PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA = NULL; -PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA = NULL; -PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA = NULL; - -PFNGLBEGINCONDITIONALRENDERNVXPROC __glewBeginConditionalRenderNVX = NULL; -PFNGLENDCONDITIONALRENDERNVXPROC __glewEndConditionalRenderNVX = NULL; - -PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __glewMultiDrawArraysIndirectBindlessNV = NULL; -PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __glewMultiDrawElementsIndirectBindlessNV = NULL; - -PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawArraysIndirectBindlessCountNV = NULL; -PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawElementsIndirectBindlessCountNV = NULL; - -PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV = NULL; -PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV = NULL; -PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV = NULL; -PFNGLISIMAGEHANDLERESIDENTNVPROC __glewIsImageHandleResidentNV = NULL; -PFNGLISTEXTUREHANDLERESIDENTNVPROC __glewIsTextureHandleResidentNV = NULL; -PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC __glewMakeImageHandleNonResidentNV = NULL; -PFNGLMAKEIMAGEHANDLERESIDENTNVPROC __glewMakeImageHandleResidentNV = NULL; -PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC __glewMakeTextureHandleNonResidentNV = NULL; -PFNGLMAKETEXTUREHANDLERESIDENTNVPROC __glewMakeTextureHandleResidentNV = NULL; -PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC __glewProgramUniformHandleui64NV = NULL; -PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleui64vNV = NULL; -PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV = NULL; -PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV = NULL; - -PFNGLBLENDBARRIERNVPROC __glewBlendBarrierNV = NULL; -PFNGLBLENDPARAMETERINVPROC __glewBlendParameteriNV = NULL; - -PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV = NULL; -PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV = NULL; - -PFNGLSUBPIXELPRECISIONBIASNVPROC __glewSubpixelPrecisionBiasNV = NULL; - -PFNGLCONSERVATIVERASTERPARAMETERFNVPROC __glewConservativeRasterParameterfNV = NULL; - -PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV = NULL; - -PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV = NULL; -PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV = NULL; -PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV = NULL; - -PFNGLDRAWTEXTURENVPROC __glewDrawTextureNV = NULL; - -PFNGLEVALMAPSNVPROC __glewEvalMapsNV = NULL; -PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV = NULL; -PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV = NULL; -PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV = NULL; -PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV = NULL; -PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV = NULL; -PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV = NULL; -PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV = NULL; -PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV = NULL; - -PFNGLGETMULTISAMPLEFVNVPROC __glewGetMultisamplefvNV = NULL; -PFNGLSAMPLEMASKINDEXEDNVPROC __glewSampleMaskIndexedNV = NULL; -PFNGLTEXRENDERBUFFERNVPROC __glewTexRenderbufferNV = NULL; - -PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV = NULL; -PFNGLFINISHFENCENVPROC __glewFinishFenceNV = NULL; -PFNGLGENFENCESNVPROC __glewGenFencesNV = NULL; -PFNGLGETFENCEIVNVPROC __glewGetFenceivNV = NULL; -PFNGLISFENCENVPROC __glewIsFenceNV = NULL; -PFNGLSETFENCENVPROC __glewSetFenceNV = NULL; -PFNGLTESTFENCENVPROC __glewTestFenceNV = NULL; - -PFNGLFRAGMENTCOVERAGECOLORNVPROC __glewFragmentCoverageColorNV = NULL; - -PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV = NULL; -PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV = NULL; -PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV = NULL; -PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV = NULL; -PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV = NULL; -PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV = NULL; - -PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV = NULL; - -PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV = NULL; - -PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV = NULL; -PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV = NULL; -PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV = NULL; -PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV = NULL; -PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV = NULL; -PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV = NULL; -PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV = NULL; -PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV = NULL; -PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV = NULL; -PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV = NULL; -PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV = NULL; -PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV = NULL; - -PFNGLGETUNIFORMI64VNVPROC __glewGetUniformi64vNV = NULL; -PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV = NULL; -PFNGLPROGRAMUNIFORM1I64NVPROC __glewProgramUniform1i64NV = NULL; -PFNGLPROGRAMUNIFORM1I64VNVPROC __glewProgramUniform1i64vNV = NULL; -PFNGLPROGRAMUNIFORM1UI64NVPROC __glewProgramUniform1ui64NV = NULL; -PFNGLPROGRAMUNIFORM1UI64VNVPROC __glewProgramUniform1ui64vNV = NULL; -PFNGLPROGRAMUNIFORM2I64NVPROC __glewProgramUniform2i64NV = NULL; -PFNGLPROGRAMUNIFORM2I64VNVPROC __glewProgramUniform2i64vNV = NULL; -PFNGLPROGRAMUNIFORM2UI64NVPROC __glewProgramUniform2ui64NV = NULL; -PFNGLPROGRAMUNIFORM2UI64VNVPROC __glewProgramUniform2ui64vNV = NULL; -PFNGLPROGRAMUNIFORM3I64NVPROC __glewProgramUniform3i64NV = NULL; -PFNGLPROGRAMUNIFORM3I64VNVPROC __glewProgramUniform3i64vNV = NULL; -PFNGLPROGRAMUNIFORM3UI64NVPROC __glewProgramUniform3ui64NV = NULL; -PFNGLPROGRAMUNIFORM3UI64VNVPROC __glewProgramUniform3ui64vNV = NULL; -PFNGLPROGRAMUNIFORM4I64NVPROC __glewProgramUniform4i64NV = NULL; -PFNGLPROGRAMUNIFORM4I64VNVPROC __glewProgramUniform4i64vNV = NULL; -PFNGLPROGRAMUNIFORM4UI64NVPROC __glewProgramUniform4ui64NV = NULL; -PFNGLPROGRAMUNIFORM4UI64VNVPROC __glewProgramUniform4ui64vNV = NULL; -PFNGLUNIFORM1I64NVPROC __glewUniform1i64NV = NULL; -PFNGLUNIFORM1I64VNVPROC __glewUniform1i64vNV = NULL; -PFNGLUNIFORM1UI64NVPROC __glewUniform1ui64NV = NULL; -PFNGLUNIFORM1UI64VNVPROC __glewUniform1ui64vNV = NULL; -PFNGLUNIFORM2I64NVPROC __glewUniform2i64NV = NULL; -PFNGLUNIFORM2I64VNVPROC __glewUniform2i64vNV = NULL; -PFNGLUNIFORM2UI64NVPROC __glewUniform2ui64NV = NULL; -PFNGLUNIFORM2UI64VNVPROC __glewUniform2ui64vNV = NULL; -PFNGLUNIFORM3I64NVPROC __glewUniform3i64NV = NULL; -PFNGLUNIFORM3I64VNVPROC __glewUniform3i64vNV = NULL; -PFNGLUNIFORM3UI64NVPROC __glewUniform3ui64NV = NULL; -PFNGLUNIFORM3UI64VNVPROC __glewUniform3ui64vNV = NULL; -PFNGLUNIFORM4I64NVPROC __glewUniform4i64NV = NULL; -PFNGLUNIFORM4I64VNVPROC __glewUniform4i64vNV = NULL; -PFNGLUNIFORM4UI64NVPROC __glewUniform4ui64NV = NULL; -PFNGLUNIFORM4UI64VNVPROC __glewUniform4ui64vNV = NULL; - -PFNGLCOLOR3HNVPROC __glewColor3hNV = NULL; -PFNGLCOLOR3HVNVPROC __glewColor3hvNV = NULL; -PFNGLCOLOR4HNVPROC __glewColor4hNV = NULL; -PFNGLCOLOR4HVNVPROC __glewColor4hvNV = NULL; -PFNGLFOGCOORDHNVPROC __glewFogCoordhNV = NULL; -PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV = NULL; -PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV = NULL; -PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV = NULL; -PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV = NULL; -PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV = NULL; -PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV = NULL; -PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV = NULL; -PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV = NULL; -PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV = NULL; -PFNGLNORMAL3HNVPROC __glewNormal3hNV = NULL; -PFNGLNORMAL3HVNVPROC __glewNormal3hvNV = NULL; -PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV = NULL; -PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV = NULL; -PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV = NULL; -PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV = NULL; -PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV = NULL; -PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV = NULL; -PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV = NULL; -PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV = NULL; -PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV = NULL; -PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV = NULL; -PFNGLVERTEX2HNVPROC __glewVertex2hNV = NULL; -PFNGLVERTEX2HVNVPROC __glewVertex2hvNV = NULL; -PFNGLVERTEX3HNVPROC __glewVertex3hNV = NULL; -PFNGLVERTEX3HVNVPROC __glewVertex3hvNV = NULL; -PFNGLVERTEX4HNVPROC __glewVertex4hNV = NULL; -PFNGLVERTEX4HVNVPROC __glewVertex4hvNV = NULL; -PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV = NULL; -PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV = NULL; -PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV = NULL; -PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV = NULL; -PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV = NULL; -PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV = NULL; -PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV = NULL; -PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV = NULL; -PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV = NULL; -PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV = NULL; -PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV = NULL; -PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV = NULL; -PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV = NULL; -PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV = NULL; - -PFNGLGETINTERNALFORMATSAMPLEIVNVPROC __glewGetInternalformatSampleivNV = NULL; - -PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV = NULL; -PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV = NULL; -PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV = NULL; -PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV = NULL; -PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV = NULL; -PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV = NULL; -PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV = NULL; - -PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV = NULL; -PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV = NULL; -PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV = NULL; - -PFNGLCOPYPATHNVPROC __glewCopyPathNV = NULL; -PFNGLCOVERFILLPATHINSTANCEDNVPROC __glewCoverFillPathInstancedNV = NULL; -PFNGLCOVERFILLPATHNVPROC __glewCoverFillPathNV = NULL; -PFNGLCOVERSTROKEPATHINSTANCEDNVPROC __glewCoverStrokePathInstancedNV = NULL; -PFNGLCOVERSTROKEPATHNVPROC __glewCoverStrokePathNV = NULL; -PFNGLDELETEPATHSNVPROC __glewDeletePathsNV = NULL; -PFNGLGENPATHSNVPROC __glewGenPathsNV = NULL; -PFNGLGETPATHCOLORGENFVNVPROC __glewGetPathColorGenfvNV = NULL; -PFNGLGETPATHCOLORGENIVNVPROC __glewGetPathColorGenivNV = NULL; -PFNGLGETPATHCOMMANDSNVPROC __glewGetPathCommandsNV = NULL; -PFNGLGETPATHCOORDSNVPROC __glewGetPathCoordsNV = NULL; -PFNGLGETPATHDASHARRAYNVPROC __glewGetPathDashArrayNV = NULL; -PFNGLGETPATHLENGTHNVPROC __glewGetPathLengthNV = NULL; -PFNGLGETPATHMETRICRANGENVPROC __glewGetPathMetricRangeNV = NULL; -PFNGLGETPATHMETRICSNVPROC __glewGetPathMetricsNV = NULL; -PFNGLGETPATHPARAMETERFVNVPROC __glewGetPathParameterfvNV = NULL; -PFNGLGETPATHPARAMETERIVNVPROC __glewGetPathParameterivNV = NULL; -PFNGLGETPATHSPACINGNVPROC __glewGetPathSpacingNV = NULL; -PFNGLGETPATHTEXGENFVNVPROC __glewGetPathTexGenfvNV = NULL; -PFNGLGETPATHTEXGENIVNVPROC __glewGetPathTexGenivNV = NULL; -PFNGLGETPROGRAMRESOURCEFVNVPROC __glewGetProgramResourcefvNV = NULL; -PFNGLINTERPOLATEPATHSNVPROC __glewInterpolatePathsNV = NULL; -PFNGLISPATHNVPROC __glewIsPathNV = NULL; -PFNGLISPOINTINFILLPATHNVPROC __glewIsPointInFillPathNV = NULL; -PFNGLISPOINTINSTROKEPATHNVPROC __glewIsPointInStrokePathNV = NULL; -PFNGLMATRIXLOAD3X2FNVPROC __glewMatrixLoad3x2fNV = NULL; -PFNGLMATRIXLOAD3X3FNVPROC __glewMatrixLoad3x3fNV = NULL; -PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC __glewMatrixLoadTranspose3x3fNV = NULL; -PFNGLMATRIXMULT3X2FNVPROC __glewMatrixMult3x2fNV = NULL; -PFNGLMATRIXMULT3X3FNVPROC __glewMatrixMult3x3fNV = NULL; -PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC __glewMatrixMultTranspose3x3fNV = NULL; -PFNGLPATHCOLORGENNVPROC __glewPathColorGenNV = NULL; -PFNGLPATHCOMMANDSNVPROC __glewPathCommandsNV = NULL; -PFNGLPATHCOORDSNVPROC __glewPathCoordsNV = NULL; -PFNGLPATHCOVERDEPTHFUNCNVPROC __glewPathCoverDepthFuncNV = NULL; -PFNGLPATHDASHARRAYNVPROC __glewPathDashArrayNV = NULL; -PFNGLPATHFOGGENNVPROC __glewPathFogGenNV = NULL; -PFNGLPATHGLYPHINDEXARRAYNVPROC __glewPathGlyphIndexArrayNV = NULL; -PFNGLPATHGLYPHINDEXRANGENVPROC __glewPathGlyphIndexRangeNV = NULL; -PFNGLPATHGLYPHRANGENVPROC __glewPathGlyphRangeNV = NULL; -PFNGLPATHGLYPHSNVPROC __glewPathGlyphsNV = NULL; -PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC __glewPathMemoryGlyphIndexArrayNV = NULL; -PFNGLPATHPARAMETERFNVPROC __glewPathParameterfNV = NULL; -PFNGLPATHPARAMETERFVNVPROC __glewPathParameterfvNV = NULL; -PFNGLPATHPARAMETERINVPROC __glewPathParameteriNV = NULL; -PFNGLPATHPARAMETERIVNVPROC __glewPathParameterivNV = NULL; -PFNGLPATHSTENCILDEPTHOFFSETNVPROC __glewPathStencilDepthOffsetNV = NULL; -PFNGLPATHSTENCILFUNCNVPROC __glewPathStencilFuncNV = NULL; -PFNGLPATHSTRINGNVPROC __glewPathStringNV = NULL; -PFNGLPATHSUBCOMMANDSNVPROC __glewPathSubCommandsNV = NULL; -PFNGLPATHSUBCOORDSNVPROC __glewPathSubCoordsNV = NULL; -PFNGLPATHTEXGENNVPROC __glewPathTexGenNV = NULL; -PFNGLPOINTALONGPATHNVPROC __glewPointAlongPathNV = NULL; -PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC __glewProgramPathFragmentInputGenNV = NULL; -PFNGLSTENCILFILLPATHINSTANCEDNVPROC __glewStencilFillPathInstancedNV = NULL; -PFNGLSTENCILFILLPATHNVPROC __glewStencilFillPathNV = NULL; -PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC __glewStencilStrokePathInstancedNV = NULL; -PFNGLSTENCILSTROKEPATHNVPROC __glewStencilStrokePathNV = NULL; -PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC __glewStencilThenCoverFillPathInstancedNV = NULL; -PFNGLSTENCILTHENCOVERFILLPATHNVPROC __glewStencilThenCoverFillPathNV = NULL; -PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC __glewStencilThenCoverStrokePathInstancedNV = NULL; -PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC __glewStencilThenCoverStrokePathNV = NULL; -PFNGLTRANSFORMPATHNVPROC __glewTransformPathNV = NULL; -PFNGLWEIGHTPATHSNVPROC __glewWeightPathsNV = NULL; - -PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV = NULL; -PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV = NULL; - -PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV = NULL; -PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV = NULL; - -PFNGLGETVIDEOI64VNVPROC __glewGetVideoi64vNV = NULL; -PFNGLGETVIDEOIVNVPROC __glewGetVideoivNV = NULL; -PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV = NULL; -PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV = NULL; -PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV = NULL; -PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV = NULL; - -PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV = NULL; -PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV = NULL; - -PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV = NULL; -PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV = NULL; -PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV = NULL; -PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV = NULL; -PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV = NULL; -PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV = NULL; -PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV = NULL; -PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV = NULL; -PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV = NULL; -PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV = NULL; -PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV = NULL; -PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV = NULL; -PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV = NULL; - -PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV = NULL; -PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV = NULL; - -PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewFramebufferSampleLocationsfvNV = NULL; -PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewNamedFramebufferSampleLocationsfvNV = NULL; - -PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV = NULL; -PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV = NULL; -PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV = NULL; -PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV = NULL; -PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV = NULL; -PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV = NULL; -PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV = NULL; -PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV = NULL; -PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV = NULL; -PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV = NULL; -PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV = NULL; -PFNGLUNIFORMUI64NVPROC __glewUniformui64NV = NULL; -PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV = NULL; - -PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV = NULL; - -PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTexImage2DMultisampleCoverageNV = NULL; -PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTexImage3DMultisampleCoverageNV = NULL; -PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTextureImage2DMultisampleCoverageNV = NULL; -PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC __glewTextureImage2DMultisampleNV = NULL; -PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTextureImage3DMultisampleCoverageNV = NULL; -PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC __glewTextureImage3DMultisampleNV = NULL; - -PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV = NULL; -PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV = NULL; -PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV = NULL; -PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV = NULL; -PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV = NULL; -PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV = NULL; -PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV = NULL; -PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV = NULL; -PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV = NULL; -PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV = NULL; -PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV = NULL; - -PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV = NULL; -PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV = NULL; -PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV = NULL; -PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV = NULL; -PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV = NULL; -PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV = NULL; -PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV = NULL; - -PFNGLVDPAUFININVPROC __glewVDPAUFiniNV = NULL; -PFNGLVDPAUGETSURFACEIVNVPROC __glewVDPAUGetSurfaceivNV = NULL; -PFNGLVDPAUINITNVPROC __glewVDPAUInitNV = NULL; -PFNGLVDPAUISSURFACENVPROC __glewVDPAUIsSurfaceNV = NULL; -PFNGLVDPAUMAPSURFACESNVPROC __glewVDPAUMapSurfacesNV = NULL; -PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC __glewVDPAURegisterOutputSurfaceNV = NULL; -PFNGLVDPAUREGISTERVIDEOSURFACENVPROC __glewVDPAURegisterVideoSurfaceNV = NULL; -PFNGLVDPAUSURFACEACCESSNVPROC __glewVDPAUSurfaceAccessNV = NULL; -PFNGLVDPAUUNMAPSURFACESNVPROC __glewVDPAUUnmapSurfacesNV = NULL; -PFNGLVDPAUUNREGISTERSURFACENVPROC __glewVDPAUUnregisterSurfaceNV = NULL; - -PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV = NULL; -PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV = NULL; - -PFNGLGETVERTEXATTRIBLI64VNVPROC __glewGetVertexAttribLi64vNV = NULL; -PFNGLGETVERTEXATTRIBLUI64VNVPROC __glewGetVertexAttribLui64vNV = NULL; -PFNGLVERTEXATTRIBL1I64NVPROC __glewVertexAttribL1i64NV = NULL; -PFNGLVERTEXATTRIBL1I64VNVPROC __glewVertexAttribL1i64vNV = NULL; -PFNGLVERTEXATTRIBL1UI64NVPROC __glewVertexAttribL1ui64NV = NULL; -PFNGLVERTEXATTRIBL1UI64VNVPROC __glewVertexAttribL1ui64vNV = NULL; -PFNGLVERTEXATTRIBL2I64NVPROC __glewVertexAttribL2i64NV = NULL; -PFNGLVERTEXATTRIBL2I64VNVPROC __glewVertexAttribL2i64vNV = NULL; -PFNGLVERTEXATTRIBL2UI64NVPROC __glewVertexAttribL2ui64NV = NULL; -PFNGLVERTEXATTRIBL2UI64VNVPROC __glewVertexAttribL2ui64vNV = NULL; -PFNGLVERTEXATTRIBL3I64NVPROC __glewVertexAttribL3i64NV = NULL; -PFNGLVERTEXATTRIBL3I64VNVPROC __glewVertexAttribL3i64vNV = NULL; -PFNGLVERTEXATTRIBL3UI64NVPROC __glewVertexAttribL3ui64NV = NULL; -PFNGLVERTEXATTRIBL3UI64VNVPROC __glewVertexAttribL3ui64vNV = NULL; -PFNGLVERTEXATTRIBL4I64NVPROC __glewVertexAttribL4i64NV = NULL; -PFNGLVERTEXATTRIBL4I64VNVPROC __glewVertexAttribL4i64vNV = NULL; -PFNGLVERTEXATTRIBL4UI64NVPROC __glewVertexAttribL4ui64NV = NULL; -PFNGLVERTEXATTRIBL4UI64VNVPROC __glewVertexAttribL4ui64vNV = NULL; -PFNGLVERTEXATTRIBLFORMATNVPROC __glewVertexAttribLFormatNV = NULL; - -PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV = NULL; -PFNGLCOLORFORMATNVPROC __glewColorFormatNV = NULL; -PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV = NULL; -PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV = NULL; -PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV = NULL; -PFNGLINDEXFORMATNVPROC __glewIndexFormatNV = NULL; -PFNGLNORMALFORMATNVPROC __glewNormalFormatNV = NULL; -PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV = NULL; -PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV = NULL; -PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV = NULL; -PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV = NULL; -PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV = NULL; - -PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV = NULL; -PFNGLBINDPROGRAMNVPROC __glewBindProgramNV = NULL; -PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV = NULL; -PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV = NULL; -PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV = NULL; -PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV = NULL; -PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV = NULL; -PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV = NULL; -PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV = NULL; -PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV = NULL; -PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV = NULL; -PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV = NULL; -PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV = NULL; -PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV = NULL; -PFNGLISPROGRAMNVPROC __glewIsProgramNV = NULL; -PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV = NULL; -PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV = NULL; -PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV = NULL; -PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV = NULL; -PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV = NULL; -PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV = NULL; -PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV = NULL; -PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV = NULL; -PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV = NULL; -PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV = NULL; -PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV = NULL; -PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV = NULL; -PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV = NULL; -PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV = NULL; -PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV = NULL; -PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV = NULL; -PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV = NULL; -PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV = NULL; -PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV = NULL; -PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV = NULL; -PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV = NULL; -PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV = NULL; -PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV = NULL; -PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV = NULL; -PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV = NULL; -PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV = NULL; -PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV = NULL; -PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV = NULL; -PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV = NULL; -PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV = NULL; -PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV = NULL; -PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV = NULL; -PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV = NULL; -PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV = NULL; -PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV = NULL; -PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV = NULL; -PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV = NULL; -PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV = NULL; -PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV = NULL; -PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV = NULL; -PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV = NULL; -PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV = NULL; -PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV = NULL; -PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV = NULL; -PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV = NULL; -PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV = NULL; -PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV = NULL; -PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV = NULL; -PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV = NULL; - -PFNGLBEGINVIDEOCAPTURENVPROC __glewBeginVideoCaptureNV = NULL; -PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC __glewBindVideoCaptureStreamBufferNV = NULL; -PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC __glewBindVideoCaptureStreamTextureNV = NULL; -PFNGLENDVIDEOCAPTURENVPROC __glewEndVideoCaptureNV = NULL; -PFNGLGETVIDEOCAPTURESTREAMDVNVPROC __glewGetVideoCaptureStreamdvNV = NULL; -PFNGLGETVIDEOCAPTURESTREAMFVNVPROC __glewGetVideoCaptureStreamfvNV = NULL; -PFNGLGETVIDEOCAPTURESTREAMIVNVPROC __glewGetVideoCaptureStreamivNV = NULL; -PFNGLGETVIDEOCAPTUREIVNVPROC __glewGetVideoCaptureivNV = NULL; -PFNGLVIDEOCAPTURENVPROC __glewVideoCaptureNV = NULL; -PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC __glewVideoCaptureStreamParameterdvNV = NULL; -PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC __glewVideoCaptureStreamParameterfvNV = NULL; -PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC __glewVideoCaptureStreamParameterivNV = NULL; - -PFNGLCLEARDEPTHFOESPROC __glewClearDepthfOES = NULL; -PFNGLCLIPPLANEFOESPROC __glewClipPlanefOES = NULL; -PFNGLDEPTHRANGEFOESPROC __glewDepthRangefOES = NULL; -PFNGLFRUSTUMFOESPROC __glewFrustumfOES = NULL; -PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES = NULL; -PFNGLORTHOFOESPROC __glewOrthofOES = NULL; - -PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __glewFramebufferTextureMultiviewOVR = NULL; - -PFNGLALPHAFUNCXPROC __glewAlphaFuncx = NULL; -PFNGLCLEARCOLORXPROC __glewClearColorx = NULL; -PFNGLCLEARDEPTHXPROC __glewClearDepthx = NULL; -PFNGLCOLOR4XPROC __glewColor4x = NULL; -PFNGLDEPTHRANGEXPROC __glewDepthRangex = NULL; -PFNGLFOGXPROC __glewFogx = NULL; -PFNGLFOGXVPROC __glewFogxv = NULL; -PFNGLFRUSTUMFPROC __glewFrustumf = NULL; -PFNGLFRUSTUMXPROC __glewFrustumx = NULL; -PFNGLLIGHTMODELXPROC __glewLightModelx = NULL; -PFNGLLIGHTMODELXVPROC __glewLightModelxv = NULL; -PFNGLLIGHTXPROC __glewLightx = NULL; -PFNGLLIGHTXVPROC __glewLightxv = NULL; -PFNGLLINEWIDTHXPROC __glewLineWidthx = NULL; -PFNGLLOADMATRIXXPROC __glewLoadMatrixx = NULL; -PFNGLMATERIALXPROC __glewMaterialx = NULL; -PFNGLMATERIALXVPROC __glewMaterialxv = NULL; -PFNGLMULTMATRIXXPROC __glewMultMatrixx = NULL; -PFNGLMULTITEXCOORD4XPROC __glewMultiTexCoord4x = NULL; -PFNGLNORMAL3XPROC __glewNormal3x = NULL; -PFNGLORTHOFPROC __glewOrthof = NULL; -PFNGLORTHOXPROC __glewOrthox = NULL; -PFNGLPOINTSIZEXPROC __glewPointSizex = NULL; -PFNGLPOLYGONOFFSETXPROC __glewPolygonOffsetx = NULL; -PFNGLROTATEXPROC __glewRotatex = NULL; -PFNGLSAMPLECOVERAGEXPROC __glewSampleCoveragex = NULL; -PFNGLSCALEXPROC __glewScalex = NULL; -PFNGLTEXENVXPROC __glewTexEnvx = NULL; -PFNGLTEXENVXVPROC __glewTexEnvxv = NULL; -PFNGLTEXPARAMETERXPROC __glewTexParameterx = NULL; -PFNGLTRANSLATEXPROC __glewTranslatex = NULL; - -PFNGLCLIPPLANEFPROC __glewClipPlanef = NULL; -PFNGLCLIPPLANEXPROC __glewClipPlanex = NULL; -PFNGLGETCLIPPLANEFPROC __glewGetClipPlanef = NULL; -PFNGLGETCLIPPLANEXPROC __glewGetClipPlanex = NULL; -PFNGLGETFIXEDVPROC __glewGetFixedv = NULL; -PFNGLGETLIGHTXVPROC __glewGetLightxv = NULL; -PFNGLGETMATERIALXVPROC __glewGetMaterialxv = NULL; -PFNGLGETTEXENVXVPROC __glewGetTexEnvxv = NULL; -PFNGLGETTEXPARAMETERXVPROC __glewGetTexParameterxv = NULL; -PFNGLPOINTPARAMETERXPROC __glewPointParameterx = NULL; -PFNGLPOINTPARAMETERXVPROC __glewPointParameterxv = NULL; -PFNGLPOINTSIZEPOINTEROESPROC __glewPointSizePointerOES = NULL; -PFNGLTEXPARAMETERXVPROC __glewTexParameterxv = NULL; - -PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL = NULL; - -PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL = NULL; -PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL = NULL; - -PFNGLLOGMESSAGECALLBACKREGALPROC __glewLogMessageCallbackREGAL = NULL; - -PFNGLGETPROCADDRESSREGALPROC __glewGetProcAddressREGAL = NULL; - -PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS = NULL; -PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS = NULL; - -PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS = NULL; -PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS = NULL; - -PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS = NULL; -PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS = NULL; - -PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS = NULL; -PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS = NULL; - -PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS = NULL; -PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS = NULL; - -PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS = NULL; -PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS = NULL; - -PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX = NULL; -PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX = NULL; -PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX = NULL; -PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX = NULL; -PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX = NULL; -PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX = NULL; - -PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX = NULL; - -PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX = NULL; - -PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX = NULL; -PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX = NULL; -PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX = NULL; -PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX = NULL; -PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX = NULL; -PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX = NULL; -PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX = NULL; -PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX = NULL; -PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX = NULL; -PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX = NULL; -PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX = NULL; -PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX = NULL; -PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX = NULL; -PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX = NULL; -PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX = NULL; -PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX = NULL; -PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX = NULL; - -PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX = NULL; - -PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX = NULL; - -PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX = NULL; - -PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX = NULL; -PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX = NULL; -PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX = NULL; -PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX = NULL; - -PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX = NULL; - -PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI = NULL; -PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI = NULL; -PFNGLCOLORTABLESGIPROC __glewColorTableSGI = NULL; -PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI = NULL; -PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI = NULL; -PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI = NULL; -PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI = NULL; - -PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX = NULL; - -PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN = NULL; -PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN = NULL; -PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN = NULL; -PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN = NULL; -PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN = NULL; -PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN = NULL; -PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN = NULL; -PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN = NULL; - -PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN = NULL; - -PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN = NULL; -PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN = NULL; -PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN = NULL; -PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN = NULL; -PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN = NULL; -PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN = NULL; -PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN = NULL; - -PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN = NULL; -PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN = NULL; -PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN = NULL; -PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN = NULL; -PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN = NULL; -PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN = NULL; -PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN = NULL; -PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN = NULL; -PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN = NULL; -PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN = NULL; -PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN = NULL; -PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN = NULL; -PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN = NULL; -PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN = NULL; -PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN = NULL; -PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN = NULL; -PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN = NULL; -PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN = NULL; -PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN = NULL; -PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN = NULL; -PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN = NULL; -PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN = NULL; -PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN = NULL; -PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN = NULL; - -PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN = NULL; - -#endif /* !WIN32 || !GLEW_MX */ - -#if !defined(GLEW_MX) - -GLboolean __GLEW_VERSION_1_1 = GL_FALSE; -GLboolean __GLEW_VERSION_1_2 = GL_FALSE; -GLboolean __GLEW_VERSION_1_2_1 = GL_FALSE; -GLboolean __GLEW_VERSION_1_3 = GL_FALSE; -GLboolean __GLEW_VERSION_1_4 = GL_FALSE; -GLboolean __GLEW_VERSION_1_5 = GL_FALSE; -GLboolean __GLEW_VERSION_2_0 = GL_FALSE; -GLboolean __GLEW_VERSION_2_1 = GL_FALSE; -GLboolean __GLEW_VERSION_3_0 = GL_FALSE; -GLboolean __GLEW_VERSION_3_1 = GL_FALSE; -GLboolean __GLEW_VERSION_3_2 = GL_FALSE; -GLboolean __GLEW_VERSION_3_3 = GL_FALSE; -GLboolean __GLEW_VERSION_4_0 = GL_FALSE; -GLboolean __GLEW_VERSION_4_1 = GL_FALSE; -GLboolean __GLEW_VERSION_4_2 = GL_FALSE; -GLboolean __GLEW_VERSION_4_3 = GL_FALSE; -GLboolean __GLEW_VERSION_4_4 = GL_FALSE; -GLboolean __GLEW_VERSION_4_5 = GL_FALSE; -GLboolean __GLEW_3DFX_multisample = GL_FALSE; -GLboolean __GLEW_3DFX_tbuffer = GL_FALSE; -GLboolean __GLEW_3DFX_texture_compression_FXT1 = GL_FALSE; -GLboolean __GLEW_AMD_blend_minmax_factor = GL_FALSE; -GLboolean __GLEW_AMD_conservative_depth = GL_FALSE; -GLboolean __GLEW_AMD_debug_output = GL_FALSE; -GLboolean __GLEW_AMD_depth_clamp_separate = GL_FALSE; -GLboolean __GLEW_AMD_draw_buffers_blend = GL_FALSE; -GLboolean __GLEW_AMD_gcn_shader = GL_FALSE; -GLboolean __GLEW_AMD_gpu_shader_int64 = GL_FALSE; -GLboolean __GLEW_AMD_interleaved_elements = GL_FALSE; -GLboolean __GLEW_AMD_multi_draw_indirect = GL_FALSE; -GLboolean __GLEW_AMD_name_gen_delete = GL_FALSE; -GLboolean __GLEW_AMD_occlusion_query_event = GL_FALSE; -GLboolean __GLEW_AMD_performance_monitor = GL_FALSE; -GLboolean __GLEW_AMD_pinned_memory = GL_FALSE; -GLboolean __GLEW_AMD_query_buffer_object = GL_FALSE; -GLboolean __GLEW_AMD_sample_positions = GL_FALSE; -GLboolean __GLEW_AMD_seamless_cubemap_per_texture = GL_FALSE; -GLboolean __GLEW_AMD_shader_atomic_counter_ops = GL_FALSE; -GLboolean __GLEW_AMD_shader_stencil_export = GL_FALSE; -GLboolean __GLEW_AMD_shader_stencil_value_export = GL_FALSE; -GLboolean __GLEW_AMD_shader_trinary_minmax = GL_FALSE; -GLboolean __GLEW_AMD_sparse_texture = GL_FALSE; -GLboolean __GLEW_AMD_stencil_operation_extended = GL_FALSE; -GLboolean __GLEW_AMD_texture_texture4 = GL_FALSE; -GLboolean __GLEW_AMD_transform_feedback3_lines_triangles = GL_FALSE; -GLboolean __GLEW_AMD_transform_feedback4 = GL_FALSE; -GLboolean __GLEW_AMD_vertex_shader_layer = GL_FALSE; -GLboolean __GLEW_AMD_vertex_shader_tessellator = GL_FALSE; -GLboolean __GLEW_AMD_vertex_shader_viewport_index = GL_FALSE; -GLboolean __GLEW_ANGLE_depth_texture = GL_FALSE; -GLboolean __GLEW_ANGLE_framebuffer_blit = GL_FALSE; -GLboolean __GLEW_ANGLE_framebuffer_multisample = GL_FALSE; -GLboolean __GLEW_ANGLE_instanced_arrays = GL_FALSE; -GLboolean __GLEW_ANGLE_pack_reverse_row_order = GL_FALSE; -GLboolean __GLEW_ANGLE_program_binary = GL_FALSE; -GLboolean __GLEW_ANGLE_texture_compression_dxt1 = GL_FALSE; -GLboolean __GLEW_ANGLE_texture_compression_dxt3 = GL_FALSE; -GLboolean __GLEW_ANGLE_texture_compression_dxt5 = GL_FALSE; -GLboolean __GLEW_ANGLE_texture_usage = GL_FALSE; -GLboolean __GLEW_ANGLE_timer_query = GL_FALSE; -GLboolean __GLEW_ANGLE_translated_shader_source = GL_FALSE; -GLboolean __GLEW_APPLE_aux_depth_stencil = GL_FALSE; -GLboolean __GLEW_APPLE_client_storage = GL_FALSE; -GLboolean __GLEW_APPLE_element_array = GL_FALSE; -GLboolean __GLEW_APPLE_fence = GL_FALSE; -GLboolean __GLEW_APPLE_float_pixels = GL_FALSE; -GLboolean __GLEW_APPLE_flush_buffer_range = GL_FALSE; -GLboolean __GLEW_APPLE_object_purgeable = GL_FALSE; -GLboolean __GLEW_APPLE_pixel_buffer = GL_FALSE; -GLboolean __GLEW_APPLE_rgb_422 = GL_FALSE; -GLboolean __GLEW_APPLE_row_bytes = GL_FALSE; -GLboolean __GLEW_APPLE_specular_vector = GL_FALSE; -GLboolean __GLEW_APPLE_texture_range = GL_FALSE; -GLboolean __GLEW_APPLE_transform_hint = GL_FALSE; -GLboolean __GLEW_APPLE_vertex_array_object = GL_FALSE; -GLboolean __GLEW_APPLE_vertex_array_range = GL_FALSE; -GLboolean __GLEW_APPLE_vertex_program_evaluators = GL_FALSE; -GLboolean __GLEW_APPLE_ycbcr_422 = GL_FALSE; -GLboolean __GLEW_ARB_ES2_compatibility = GL_FALSE; -GLboolean __GLEW_ARB_ES3_1_compatibility = GL_FALSE; -GLboolean __GLEW_ARB_ES3_2_compatibility = GL_FALSE; -GLboolean __GLEW_ARB_ES3_compatibility = GL_FALSE; -GLboolean __GLEW_ARB_arrays_of_arrays = GL_FALSE; -GLboolean __GLEW_ARB_base_instance = GL_FALSE; -GLboolean __GLEW_ARB_bindless_texture = GL_FALSE; -GLboolean __GLEW_ARB_blend_func_extended = GL_FALSE; -GLboolean __GLEW_ARB_buffer_storage = GL_FALSE; -GLboolean __GLEW_ARB_cl_event = GL_FALSE; -GLboolean __GLEW_ARB_clear_buffer_object = GL_FALSE; -GLboolean __GLEW_ARB_clear_texture = GL_FALSE; -GLboolean __GLEW_ARB_clip_control = GL_FALSE; -GLboolean __GLEW_ARB_color_buffer_float = GL_FALSE; -GLboolean __GLEW_ARB_compatibility = GL_FALSE; -GLboolean __GLEW_ARB_compressed_texture_pixel_storage = GL_FALSE; -GLboolean __GLEW_ARB_compute_shader = GL_FALSE; -GLboolean __GLEW_ARB_compute_variable_group_size = GL_FALSE; -GLboolean __GLEW_ARB_conditional_render_inverted = GL_FALSE; -GLboolean __GLEW_ARB_conservative_depth = GL_FALSE; -GLboolean __GLEW_ARB_copy_buffer = GL_FALSE; -GLboolean __GLEW_ARB_copy_image = GL_FALSE; -GLboolean __GLEW_ARB_cull_distance = GL_FALSE; -GLboolean __GLEW_ARB_debug_output = GL_FALSE; -GLboolean __GLEW_ARB_depth_buffer_float = GL_FALSE; -GLboolean __GLEW_ARB_depth_clamp = GL_FALSE; -GLboolean __GLEW_ARB_depth_texture = GL_FALSE; -GLboolean __GLEW_ARB_derivative_control = GL_FALSE; -GLboolean __GLEW_ARB_direct_state_access = GL_FALSE; -GLboolean __GLEW_ARB_draw_buffers = GL_FALSE; -GLboolean __GLEW_ARB_draw_buffers_blend = GL_FALSE; -GLboolean __GLEW_ARB_draw_elements_base_vertex = GL_FALSE; -GLboolean __GLEW_ARB_draw_indirect = GL_FALSE; -GLboolean __GLEW_ARB_draw_instanced = GL_FALSE; -GLboolean __GLEW_ARB_enhanced_layouts = GL_FALSE; -GLboolean __GLEW_ARB_explicit_attrib_location = GL_FALSE; -GLboolean __GLEW_ARB_explicit_uniform_location = GL_FALSE; -GLboolean __GLEW_ARB_fragment_coord_conventions = GL_FALSE; -GLboolean __GLEW_ARB_fragment_layer_viewport = GL_FALSE; -GLboolean __GLEW_ARB_fragment_program = GL_FALSE; -GLboolean __GLEW_ARB_fragment_program_shadow = GL_FALSE; -GLboolean __GLEW_ARB_fragment_shader = GL_FALSE; -GLboolean __GLEW_ARB_fragment_shader_interlock = GL_FALSE; -GLboolean __GLEW_ARB_framebuffer_no_attachments = GL_FALSE; -GLboolean __GLEW_ARB_framebuffer_object = GL_FALSE; -GLboolean __GLEW_ARB_framebuffer_sRGB = GL_FALSE; -GLboolean __GLEW_ARB_geometry_shader4 = GL_FALSE; -GLboolean __GLEW_ARB_get_program_binary = GL_FALSE; -GLboolean __GLEW_ARB_get_texture_sub_image = GL_FALSE; -GLboolean __GLEW_ARB_gpu_shader5 = GL_FALSE; -GLboolean __GLEW_ARB_gpu_shader_fp64 = GL_FALSE; -GLboolean __GLEW_ARB_gpu_shader_int64 = GL_FALSE; -GLboolean __GLEW_ARB_half_float_pixel = GL_FALSE; -GLboolean __GLEW_ARB_half_float_vertex = GL_FALSE; -GLboolean __GLEW_ARB_imaging = GL_FALSE; -GLboolean __GLEW_ARB_indirect_parameters = GL_FALSE; -GLboolean __GLEW_ARB_instanced_arrays = GL_FALSE; -GLboolean __GLEW_ARB_internalformat_query = GL_FALSE; -GLboolean __GLEW_ARB_internalformat_query2 = GL_FALSE; -GLboolean __GLEW_ARB_invalidate_subdata = GL_FALSE; -GLboolean __GLEW_ARB_map_buffer_alignment = GL_FALSE; -GLboolean __GLEW_ARB_map_buffer_range = GL_FALSE; -GLboolean __GLEW_ARB_matrix_palette = GL_FALSE; -GLboolean __GLEW_ARB_multi_bind = GL_FALSE; -GLboolean __GLEW_ARB_multi_draw_indirect = GL_FALSE; -GLboolean __GLEW_ARB_multisample = GL_FALSE; -GLboolean __GLEW_ARB_multitexture = GL_FALSE; -GLboolean __GLEW_ARB_occlusion_query = GL_FALSE; -GLboolean __GLEW_ARB_occlusion_query2 = GL_FALSE; -GLboolean __GLEW_ARB_parallel_shader_compile = GL_FALSE; -GLboolean __GLEW_ARB_pipeline_statistics_query = GL_FALSE; -GLboolean __GLEW_ARB_pixel_buffer_object = GL_FALSE; -GLboolean __GLEW_ARB_point_parameters = GL_FALSE; -GLboolean __GLEW_ARB_point_sprite = GL_FALSE; -GLboolean __GLEW_ARB_post_depth_coverage = GL_FALSE; -GLboolean __GLEW_ARB_program_interface_query = GL_FALSE; -GLboolean __GLEW_ARB_provoking_vertex = GL_FALSE; -GLboolean __GLEW_ARB_query_buffer_object = GL_FALSE; -GLboolean __GLEW_ARB_robust_buffer_access_behavior = GL_FALSE; -GLboolean __GLEW_ARB_robustness = GL_FALSE; -GLboolean __GLEW_ARB_robustness_application_isolation = GL_FALSE; -GLboolean __GLEW_ARB_robustness_share_group_isolation = GL_FALSE; -GLboolean __GLEW_ARB_sample_locations = GL_FALSE; -GLboolean __GLEW_ARB_sample_shading = GL_FALSE; -GLboolean __GLEW_ARB_sampler_objects = GL_FALSE; -GLboolean __GLEW_ARB_seamless_cube_map = GL_FALSE; -GLboolean __GLEW_ARB_seamless_cubemap_per_texture = GL_FALSE; -GLboolean __GLEW_ARB_separate_shader_objects = GL_FALSE; -GLboolean __GLEW_ARB_shader_atomic_counter_ops = GL_FALSE; -GLboolean __GLEW_ARB_shader_atomic_counters = GL_FALSE; -GLboolean __GLEW_ARB_shader_ballot = GL_FALSE; -GLboolean __GLEW_ARB_shader_bit_encoding = GL_FALSE; -GLboolean __GLEW_ARB_shader_clock = GL_FALSE; -GLboolean __GLEW_ARB_shader_draw_parameters = GL_FALSE; -GLboolean __GLEW_ARB_shader_group_vote = GL_FALSE; -GLboolean __GLEW_ARB_shader_image_load_store = GL_FALSE; -GLboolean __GLEW_ARB_shader_image_size = GL_FALSE; -GLboolean __GLEW_ARB_shader_objects = GL_FALSE; -GLboolean __GLEW_ARB_shader_precision = GL_FALSE; -GLboolean __GLEW_ARB_shader_stencil_export = GL_FALSE; -GLboolean __GLEW_ARB_shader_storage_buffer_object = GL_FALSE; -GLboolean __GLEW_ARB_shader_subroutine = GL_FALSE; -GLboolean __GLEW_ARB_shader_texture_image_samples = GL_FALSE; -GLboolean __GLEW_ARB_shader_texture_lod = GL_FALSE; -GLboolean __GLEW_ARB_shader_viewport_layer_array = GL_FALSE; -GLboolean __GLEW_ARB_shading_language_100 = GL_FALSE; -GLboolean __GLEW_ARB_shading_language_420pack = GL_FALSE; -GLboolean __GLEW_ARB_shading_language_include = GL_FALSE; -GLboolean __GLEW_ARB_shading_language_packing = GL_FALSE; -GLboolean __GLEW_ARB_shadow = GL_FALSE; -GLboolean __GLEW_ARB_shadow_ambient = GL_FALSE; -GLboolean __GLEW_ARB_sparse_buffer = GL_FALSE; -GLboolean __GLEW_ARB_sparse_texture = GL_FALSE; -GLboolean __GLEW_ARB_sparse_texture2 = GL_FALSE; -GLboolean __GLEW_ARB_sparse_texture_clamp = GL_FALSE; -GLboolean __GLEW_ARB_stencil_texturing = GL_FALSE; -GLboolean __GLEW_ARB_sync = GL_FALSE; -GLboolean __GLEW_ARB_tessellation_shader = GL_FALSE; -GLboolean __GLEW_ARB_texture_barrier = GL_FALSE; -GLboolean __GLEW_ARB_texture_border_clamp = GL_FALSE; -GLboolean __GLEW_ARB_texture_buffer_object = GL_FALSE; -GLboolean __GLEW_ARB_texture_buffer_object_rgb32 = GL_FALSE; -GLboolean __GLEW_ARB_texture_buffer_range = GL_FALSE; -GLboolean __GLEW_ARB_texture_compression = GL_FALSE; -GLboolean __GLEW_ARB_texture_compression_bptc = GL_FALSE; -GLboolean __GLEW_ARB_texture_compression_rgtc = GL_FALSE; -GLboolean __GLEW_ARB_texture_cube_map = GL_FALSE; -GLboolean __GLEW_ARB_texture_cube_map_array = GL_FALSE; -GLboolean __GLEW_ARB_texture_env_add = GL_FALSE; -GLboolean __GLEW_ARB_texture_env_combine = GL_FALSE; -GLboolean __GLEW_ARB_texture_env_crossbar = GL_FALSE; -GLboolean __GLEW_ARB_texture_env_dot3 = GL_FALSE; -GLboolean __GLEW_ARB_texture_filter_minmax = GL_FALSE; -GLboolean __GLEW_ARB_texture_float = GL_FALSE; -GLboolean __GLEW_ARB_texture_gather = GL_FALSE; -GLboolean __GLEW_ARB_texture_mirror_clamp_to_edge = GL_FALSE; -GLboolean __GLEW_ARB_texture_mirrored_repeat = GL_FALSE; -GLboolean __GLEW_ARB_texture_multisample = GL_FALSE; -GLboolean __GLEW_ARB_texture_non_power_of_two = GL_FALSE; -GLboolean __GLEW_ARB_texture_query_levels = GL_FALSE; -GLboolean __GLEW_ARB_texture_query_lod = GL_FALSE; -GLboolean __GLEW_ARB_texture_rectangle = GL_FALSE; -GLboolean __GLEW_ARB_texture_rg = GL_FALSE; -GLboolean __GLEW_ARB_texture_rgb10_a2ui = GL_FALSE; -GLboolean __GLEW_ARB_texture_stencil8 = GL_FALSE; -GLboolean __GLEW_ARB_texture_storage = GL_FALSE; -GLboolean __GLEW_ARB_texture_storage_multisample = GL_FALSE; -GLboolean __GLEW_ARB_texture_swizzle = GL_FALSE; -GLboolean __GLEW_ARB_texture_view = GL_FALSE; -GLboolean __GLEW_ARB_timer_query = GL_FALSE; -GLboolean __GLEW_ARB_transform_feedback2 = GL_FALSE; -GLboolean __GLEW_ARB_transform_feedback3 = GL_FALSE; -GLboolean __GLEW_ARB_transform_feedback_instanced = GL_FALSE; -GLboolean __GLEW_ARB_transform_feedback_overflow_query = GL_FALSE; -GLboolean __GLEW_ARB_transpose_matrix = GL_FALSE; -GLboolean __GLEW_ARB_uniform_buffer_object = GL_FALSE; -GLboolean __GLEW_ARB_vertex_array_bgra = GL_FALSE; -GLboolean __GLEW_ARB_vertex_array_object = GL_FALSE; -GLboolean __GLEW_ARB_vertex_attrib_64bit = GL_FALSE; -GLboolean __GLEW_ARB_vertex_attrib_binding = GL_FALSE; -GLboolean __GLEW_ARB_vertex_blend = GL_FALSE; -GLboolean __GLEW_ARB_vertex_buffer_object = GL_FALSE; -GLboolean __GLEW_ARB_vertex_program = GL_FALSE; -GLboolean __GLEW_ARB_vertex_shader = GL_FALSE; -GLboolean __GLEW_ARB_vertex_type_10f_11f_11f_rev = GL_FALSE; -GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev = GL_FALSE; -GLboolean __GLEW_ARB_viewport_array = GL_FALSE; -GLboolean __GLEW_ARB_window_pos = GL_FALSE; -GLboolean __GLEW_ATIX_point_sprites = GL_FALSE; -GLboolean __GLEW_ATIX_texture_env_combine3 = GL_FALSE; -GLboolean __GLEW_ATIX_texture_env_route = GL_FALSE; -GLboolean __GLEW_ATIX_vertex_shader_output_point_size = GL_FALSE; -GLboolean __GLEW_ATI_draw_buffers = GL_FALSE; -GLboolean __GLEW_ATI_element_array = GL_FALSE; -GLboolean __GLEW_ATI_envmap_bumpmap = GL_FALSE; -GLboolean __GLEW_ATI_fragment_shader = GL_FALSE; -GLboolean __GLEW_ATI_map_object_buffer = GL_FALSE; -GLboolean __GLEW_ATI_meminfo = GL_FALSE; -GLboolean __GLEW_ATI_pn_triangles = GL_FALSE; -GLboolean __GLEW_ATI_separate_stencil = GL_FALSE; -GLboolean __GLEW_ATI_shader_texture_lod = GL_FALSE; -GLboolean __GLEW_ATI_text_fragment_shader = GL_FALSE; -GLboolean __GLEW_ATI_texture_compression_3dc = GL_FALSE; -GLboolean __GLEW_ATI_texture_env_combine3 = GL_FALSE; -GLboolean __GLEW_ATI_texture_float = GL_FALSE; -GLboolean __GLEW_ATI_texture_mirror_once = GL_FALSE; -GLboolean __GLEW_ATI_vertex_array_object = GL_FALSE; -GLboolean __GLEW_ATI_vertex_attrib_array_object = GL_FALSE; -GLboolean __GLEW_ATI_vertex_streams = GL_FALSE; -GLboolean __GLEW_EXT_422_pixels = GL_FALSE; -GLboolean __GLEW_EXT_Cg_shader = GL_FALSE; -GLboolean __GLEW_EXT_abgr = GL_FALSE; -GLboolean __GLEW_EXT_bgra = GL_FALSE; -GLboolean __GLEW_EXT_bindable_uniform = GL_FALSE; -GLboolean __GLEW_EXT_blend_color = GL_FALSE; -GLboolean __GLEW_EXT_blend_equation_separate = GL_FALSE; -GLboolean __GLEW_EXT_blend_func_separate = GL_FALSE; -GLboolean __GLEW_EXT_blend_logic_op = GL_FALSE; -GLboolean __GLEW_EXT_blend_minmax = GL_FALSE; -GLboolean __GLEW_EXT_blend_subtract = GL_FALSE; -GLboolean __GLEW_EXT_clip_volume_hint = GL_FALSE; -GLboolean __GLEW_EXT_cmyka = GL_FALSE; -GLboolean __GLEW_EXT_color_subtable = GL_FALSE; -GLboolean __GLEW_EXT_compiled_vertex_array = GL_FALSE; -GLboolean __GLEW_EXT_convolution = GL_FALSE; -GLboolean __GLEW_EXT_coordinate_frame = GL_FALSE; -GLboolean __GLEW_EXT_copy_texture = GL_FALSE; -GLboolean __GLEW_EXT_cull_vertex = GL_FALSE; -GLboolean __GLEW_EXT_debug_label = GL_FALSE; -GLboolean __GLEW_EXT_debug_marker = GL_FALSE; -GLboolean __GLEW_EXT_depth_bounds_test = GL_FALSE; -GLboolean __GLEW_EXT_direct_state_access = GL_FALSE; -GLboolean __GLEW_EXT_draw_buffers2 = GL_FALSE; -GLboolean __GLEW_EXT_draw_instanced = GL_FALSE; -GLboolean __GLEW_EXT_draw_range_elements = GL_FALSE; -GLboolean __GLEW_EXT_fog_coord = GL_FALSE; -GLboolean __GLEW_EXT_fragment_lighting = GL_FALSE; -GLboolean __GLEW_EXT_framebuffer_blit = GL_FALSE; -GLboolean __GLEW_EXT_framebuffer_multisample = GL_FALSE; -GLboolean __GLEW_EXT_framebuffer_multisample_blit_scaled = GL_FALSE; -GLboolean __GLEW_EXT_framebuffer_object = GL_FALSE; -GLboolean __GLEW_EXT_framebuffer_sRGB = GL_FALSE; -GLboolean __GLEW_EXT_geometry_shader4 = GL_FALSE; -GLboolean __GLEW_EXT_gpu_program_parameters = GL_FALSE; -GLboolean __GLEW_EXT_gpu_shader4 = GL_FALSE; -GLboolean __GLEW_EXT_histogram = GL_FALSE; -GLboolean __GLEW_EXT_index_array_formats = GL_FALSE; -GLboolean __GLEW_EXT_index_func = GL_FALSE; -GLboolean __GLEW_EXT_index_material = GL_FALSE; -GLboolean __GLEW_EXT_index_texture = GL_FALSE; -GLboolean __GLEW_EXT_light_texture = GL_FALSE; -GLboolean __GLEW_EXT_misc_attribute = GL_FALSE; -GLboolean __GLEW_EXT_multi_draw_arrays = GL_FALSE; -GLboolean __GLEW_EXT_multisample = GL_FALSE; -GLboolean __GLEW_EXT_packed_depth_stencil = GL_FALSE; -GLboolean __GLEW_EXT_packed_float = GL_FALSE; -GLboolean __GLEW_EXT_packed_pixels = GL_FALSE; -GLboolean __GLEW_EXT_paletted_texture = GL_FALSE; -GLboolean __GLEW_EXT_pixel_buffer_object = GL_FALSE; -GLboolean __GLEW_EXT_pixel_transform = GL_FALSE; -GLboolean __GLEW_EXT_pixel_transform_color_table = GL_FALSE; -GLboolean __GLEW_EXT_point_parameters = GL_FALSE; -GLboolean __GLEW_EXT_polygon_offset = GL_FALSE; -GLboolean __GLEW_EXT_polygon_offset_clamp = GL_FALSE; -GLboolean __GLEW_EXT_post_depth_coverage = GL_FALSE; -GLboolean __GLEW_EXT_provoking_vertex = GL_FALSE; -GLboolean __GLEW_EXT_raster_multisample = GL_FALSE; -GLboolean __GLEW_EXT_rescale_normal = GL_FALSE; -GLboolean __GLEW_EXT_scene_marker = GL_FALSE; -GLboolean __GLEW_EXT_secondary_color = GL_FALSE; -GLboolean __GLEW_EXT_separate_shader_objects = GL_FALSE; -GLboolean __GLEW_EXT_separate_specular_color = GL_FALSE; -GLboolean __GLEW_EXT_shader_image_load_formatted = GL_FALSE; -GLboolean __GLEW_EXT_shader_image_load_store = GL_FALSE; -GLboolean __GLEW_EXT_shader_integer_mix = GL_FALSE; -GLboolean __GLEW_EXT_shadow_funcs = GL_FALSE; -GLboolean __GLEW_EXT_shared_texture_palette = GL_FALSE; -GLboolean __GLEW_EXT_sparse_texture2 = GL_FALSE; -GLboolean __GLEW_EXT_stencil_clear_tag = GL_FALSE; -GLboolean __GLEW_EXT_stencil_two_side = GL_FALSE; -GLboolean __GLEW_EXT_stencil_wrap = GL_FALSE; -GLboolean __GLEW_EXT_subtexture = GL_FALSE; -GLboolean __GLEW_EXT_texture = GL_FALSE; -GLboolean __GLEW_EXT_texture3D = GL_FALSE; -GLboolean __GLEW_EXT_texture_array = GL_FALSE; -GLboolean __GLEW_EXT_texture_buffer_object = GL_FALSE; -GLboolean __GLEW_EXT_texture_compression_dxt1 = GL_FALSE; -GLboolean __GLEW_EXT_texture_compression_latc = GL_FALSE; -GLboolean __GLEW_EXT_texture_compression_rgtc = GL_FALSE; -GLboolean __GLEW_EXT_texture_compression_s3tc = GL_FALSE; -GLboolean __GLEW_EXT_texture_cube_map = GL_FALSE; -GLboolean __GLEW_EXT_texture_edge_clamp = GL_FALSE; -GLboolean __GLEW_EXT_texture_env = GL_FALSE; -GLboolean __GLEW_EXT_texture_env_add = GL_FALSE; -GLboolean __GLEW_EXT_texture_env_combine = GL_FALSE; -GLboolean __GLEW_EXT_texture_env_dot3 = GL_FALSE; -GLboolean __GLEW_EXT_texture_filter_anisotropic = GL_FALSE; -GLboolean __GLEW_EXT_texture_filter_minmax = GL_FALSE; -GLboolean __GLEW_EXT_texture_integer = GL_FALSE; -GLboolean __GLEW_EXT_texture_lod_bias = GL_FALSE; -GLboolean __GLEW_EXT_texture_mirror_clamp = GL_FALSE; -GLboolean __GLEW_EXT_texture_object = GL_FALSE; -GLboolean __GLEW_EXT_texture_perturb_normal = GL_FALSE; -GLboolean __GLEW_EXT_texture_rectangle = GL_FALSE; -GLboolean __GLEW_EXT_texture_sRGB = GL_FALSE; -GLboolean __GLEW_EXT_texture_sRGB_decode = GL_FALSE; -GLboolean __GLEW_EXT_texture_shared_exponent = GL_FALSE; -GLboolean __GLEW_EXT_texture_snorm = GL_FALSE; -GLboolean __GLEW_EXT_texture_swizzle = GL_FALSE; -GLboolean __GLEW_EXT_timer_query = GL_FALSE; -GLboolean __GLEW_EXT_transform_feedback = GL_FALSE; -GLboolean __GLEW_EXT_vertex_array = GL_FALSE; -GLboolean __GLEW_EXT_vertex_array_bgra = GL_FALSE; -GLboolean __GLEW_EXT_vertex_attrib_64bit = GL_FALSE; -GLboolean __GLEW_EXT_vertex_shader = GL_FALSE; -GLboolean __GLEW_EXT_vertex_weighting = GL_FALSE; -GLboolean __GLEW_EXT_x11_sync_object = GL_FALSE; -GLboolean __GLEW_GREMEDY_frame_terminator = GL_FALSE; -GLboolean __GLEW_GREMEDY_string_marker = GL_FALSE; -GLboolean __GLEW_HP_convolution_border_modes = GL_FALSE; -GLboolean __GLEW_HP_image_transform = GL_FALSE; -GLboolean __GLEW_HP_occlusion_test = GL_FALSE; -GLboolean __GLEW_HP_texture_lighting = GL_FALSE; -GLboolean __GLEW_IBM_cull_vertex = GL_FALSE; -GLboolean __GLEW_IBM_multimode_draw_arrays = GL_FALSE; -GLboolean __GLEW_IBM_rasterpos_clip = GL_FALSE; -GLboolean __GLEW_IBM_static_data = GL_FALSE; -GLboolean __GLEW_IBM_texture_mirrored_repeat = GL_FALSE; -GLboolean __GLEW_IBM_vertex_array_lists = GL_FALSE; -GLboolean __GLEW_INGR_color_clamp = GL_FALSE; -GLboolean __GLEW_INGR_interlace_read = GL_FALSE; -GLboolean __GLEW_INTEL_fragment_shader_ordering = GL_FALSE; -GLboolean __GLEW_INTEL_framebuffer_CMAA = GL_FALSE; -GLboolean __GLEW_INTEL_map_texture = GL_FALSE; -GLboolean __GLEW_INTEL_parallel_arrays = GL_FALSE; -GLboolean __GLEW_INTEL_performance_query = GL_FALSE; -GLboolean __GLEW_INTEL_texture_scissor = GL_FALSE; -GLboolean __GLEW_KHR_blend_equation_advanced = GL_FALSE; -GLboolean __GLEW_KHR_blend_equation_advanced_coherent = GL_FALSE; -GLboolean __GLEW_KHR_context_flush_control = GL_FALSE; -GLboolean __GLEW_KHR_debug = GL_FALSE; -GLboolean __GLEW_KHR_no_error = GL_FALSE; -GLboolean __GLEW_KHR_robust_buffer_access_behavior = GL_FALSE; -GLboolean __GLEW_KHR_robustness = GL_FALSE; -GLboolean __GLEW_KHR_texture_compression_astc_hdr = GL_FALSE; -GLboolean __GLEW_KHR_texture_compression_astc_ldr = GL_FALSE; -GLboolean __GLEW_KTX_buffer_region = GL_FALSE; -GLboolean __GLEW_MESAX_texture_stack = GL_FALSE; -GLboolean __GLEW_MESA_pack_invert = GL_FALSE; -GLboolean __GLEW_MESA_resize_buffers = GL_FALSE; -GLboolean __GLEW_MESA_window_pos = GL_FALSE; -GLboolean __GLEW_MESA_ycbcr_texture = GL_FALSE; -GLboolean __GLEW_NVX_conditional_render = GL_FALSE; -GLboolean __GLEW_NVX_gpu_memory_info = GL_FALSE; -GLboolean __GLEW_NV_bindless_multi_draw_indirect = GL_FALSE; -GLboolean __GLEW_NV_bindless_multi_draw_indirect_count = GL_FALSE; -GLboolean __GLEW_NV_bindless_texture = GL_FALSE; -GLboolean __GLEW_NV_blend_equation_advanced = GL_FALSE; -GLboolean __GLEW_NV_blend_equation_advanced_coherent = GL_FALSE; -GLboolean __GLEW_NV_blend_square = GL_FALSE; -GLboolean __GLEW_NV_compute_program5 = GL_FALSE; -GLboolean __GLEW_NV_conditional_render = GL_FALSE; -GLboolean __GLEW_NV_conservative_raster = GL_FALSE; -GLboolean __GLEW_NV_conservative_raster_dilate = GL_FALSE; -GLboolean __GLEW_NV_copy_depth_to_color = GL_FALSE; -GLboolean __GLEW_NV_copy_image = GL_FALSE; -GLboolean __GLEW_NV_deep_texture3D = GL_FALSE; -GLboolean __GLEW_NV_depth_buffer_float = GL_FALSE; -GLboolean __GLEW_NV_depth_clamp = GL_FALSE; -GLboolean __GLEW_NV_depth_range_unclamped = GL_FALSE; -GLboolean __GLEW_NV_draw_texture = GL_FALSE; -GLboolean __GLEW_NV_evaluators = GL_FALSE; -GLboolean __GLEW_NV_explicit_multisample = GL_FALSE; -GLboolean __GLEW_NV_fence = GL_FALSE; -GLboolean __GLEW_NV_fill_rectangle = GL_FALSE; -GLboolean __GLEW_NV_float_buffer = GL_FALSE; -GLboolean __GLEW_NV_fog_distance = GL_FALSE; -GLboolean __GLEW_NV_fragment_coverage_to_color = GL_FALSE; -GLboolean __GLEW_NV_fragment_program = GL_FALSE; -GLboolean __GLEW_NV_fragment_program2 = GL_FALSE; -GLboolean __GLEW_NV_fragment_program4 = GL_FALSE; -GLboolean __GLEW_NV_fragment_program_option = GL_FALSE; -GLboolean __GLEW_NV_fragment_shader_interlock = GL_FALSE; -GLboolean __GLEW_NV_framebuffer_mixed_samples = GL_FALSE; -GLboolean __GLEW_NV_framebuffer_multisample_coverage = GL_FALSE; -GLboolean __GLEW_NV_geometry_program4 = GL_FALSE; -GLboolean __GLEW_NV_geometry_shader4 = GL_FALSE; -GLboolean __GLEW_NV_geometry_shader_passthrough = GL_FALSE; -GLboolean __GLEW_NV_gpu_program4 = GL_FALSE; -GLboolean __GLEW_NV_gpu_program5 = GL_FALSE; -GLboolean __GLEW_NV_gpu_program5_mem_extended = GL_FALSE; -GLboolean __GLEW_NV_gpu_program_fp64 = GL_FALSE; -GLboolean __GLEW_NV_gpu_shader5 = GL_FALSE; -GLboolean __GLEW_NV_half_float = GL_FALSE; -GLboolean __GLEW_NV_internalformat_sample_query = GL_FALSE; -GLboolean __GLEW_NV_light_max_exponent = GL_FALSE; -GLboolean __GLEW_NV_multisample_coverage = GL_FALSE; -GLboolean __GLEW_NV_multisample_filter_hint = GL_FALSE; -GLboolean __GLEW_NV_occlusion_query = GL_FALSE; -GLboolean __GLEW_NV_packed_depth_stencil = GL_FALSE; -GLboolean __GLEW_NV_parameter_buffer_object = GL_FALSE; -GLboolean __GLEW_NV_parameter_buffer_object2 = GL_FALSE; -GLboolean __GLEW_NV_path_rendering = GL_FALSE; -GLboolean __GLEW_NV_path_rendering_shared_edge = GL_FALSE; -GLboolean __GLEW_NV_pixel_data_range = GL_FALSE; -GLboolean __GLEW_NV_point_sprite = GL_FALSE; -GLboolean __GLEW_NV_present_video = GL_FALSE; -GLboolean __GLEW_NV_primitive_restart = GL_FALSE; -GLboolean __GLEW_NV_register_combiners = GL_FALSE; -GLboolean __GLEW_NV_register_combiners2 = GL_FALSE; -GLboolean __GLEW_NV_sample_locations = GL_FALSE; -GLboolean __GLEW_NV_sample_mask_override_coverage = GL_FALSE; -GLboolean __GLEW_NV_shader_atomic_counters = GL_FALSE; -GLboolean __GLEW_NV_shader_atomic_float = GL_FALSE; -GLboolean __GLEW_NV_shader_atomic_fp16_vector = GL_FALSE; -GLboolean __GLEW_NV_shader_atomic_int64 = GL_FALSE; -GLboolean __GLEW_NV_shader_buffer_load = GL_FALSE; -GLboolean __GLEW_NV_shader_storage_buffer_object = GL_FALSE; -GLboolean __GLEW_NV_shader_thread_group = GL_FALSE; -GLboolean __GLEW_NV_shader_thread_shuffle = GL_FALSE; -GLboolean __GLEW_NV_tessellation_program5 = GL_FALSE; -GLboolean __GLEW_NV_texgen_emboss = GL_FALSE; -GLboolean __GLEW_NV_texgen_reflection = GL_FALSE; -GLboolean __GLEW_NV_texture_barrier = GL_FALSE; -GLboolean __GLEW_NV_texture_compression_vtc = GL_FALSE; -GLboolean __GLEW_NV_texture_env_combine4 = GL_FALSE; -GLboolean __GLEW_NV_texture_expand_normal = GL_FALSE; -GLboolean __GLEW_NV_texture_multisample = GL_FALSE; -GLboolean __GLEW_NV_texture_rectangle = GL_FALSE; -GLboolean __GLEW_NV_texture_shader = GL_FALSE; -GLboolean __GLEW_NV_texture_shader2 = GL_FALSE; -GLboolean __GLEW_NV_texture_shader3 = GL_FALSE; -GLboolean __GLEW_NV_transform_feedback = GL_FALSE; -GLboolean __GLEW_NV_transform_feedback2 = GL_FALSE; -GLboolean __GLEW_NV_uniform_buffer_unified_memory = GL_FALSE; -GLboolean __GLEW_NV_vdpau_interop = GL_FALSE; -GLboolean __GLEW_NV_vertex_array_range = GL_FALSE; -GLboolean __GLEW_NV_vertex_array_range2 = GL_FALSE; -GLboolean __GLEW_NV_vertex_attrib_integer_64bit = GL_FALSE; -GLboolean __GLEW_NV_vertex_buffer_unified_memory = GL_FALSE; -GLboolean __GLEW_NV_vertex_program = GL_FALSE; -GLboolean __GLEW_NV_vertex_program1_1 = GL_FALSE; -GLboolean __GLEW_NV_vertex_program2 = GL_FALSE; -GLboolean __GLEW_NV_vertex_program2_option = GL_FALSE; -GLboolean __GLEW_NV_vertex_program3 = GL_FALSE; -GLboolean __GLEW_NV_vertex_program4 = GL_FALSE; -GLboolean __GLEW_NV_video_capture = GL_FALSE; -GLboolean __GLEW_NV_viewport_array2 = GL_FALSE; -GLboolean __GLEW_OES_byte_coordinates = GL_FALSE; -GLboolean __GLEW_OES_compressed_paletted_texture = GL_FALSE; -GLboolean __GLEW_OES_read_format = GL_FALSE; -GLboolean __GLEW_OES_single_precision = GL_FALSE; -GLboolean __GLEW_OML_interlace = GL_FALSE; -GLboolean __GLEW_OML_resample = GL_FALSE; -GLboolean __GLEW_OML_subsample = GL_FALSE; -GLboolean __GLEW_OVR_multiview = GL_FALSE; -GLboolean __GLEW_OVR_multiview2 = GL_FALSE; -GLboolean __GLEW_PGI_misc_hints = GL_FALSE; -GLboolean __GLEW_PGI_vertex_hints = GL_FALSE; -GLboolean __GLEW_REGAL_ES1_0_compatibility = GL_FALSE; -GLboolean __GLEW_REGAL_ES1_1_compatibility = GL_FALSE; -GLboolean __GLEW_REGAL_enable = GL_FALSE; -GLboolean __GLEW_REGAL_error_string = GL_FALSE; -GLboolean __GLEW_REGAL_extension_query = GL_FALSE; -GLboolean __GLEW_REGAL_log = GL_FALSE; -GLboolean __GLEW_REGAL_proc_address = GL_FALSE; -GLboolean __GLEW_REND_screen_coordinates = GL_FALSE; -GLboolean __GLEW_S3_s3tc = GL_FALSE; -GLboolean __GLEW_SGIS_color_range = GL_FALSE; -GLboolean __GLEW_SGIS_detail_texture = GL_FALSE; -GLboolean __GLEW_SGIS_fog_function = GL_FALSE; -GLboolean __GLEW_SGIS_generate_mipmap = GL_FALSE; -GLboolean __GLEW_SGIS_multisample = GL_FALSE; -GLboolean __GLEW_SGIS_pixel_texture = GL_FALSE; -GLboolean __GLEW_SGIS_point_line_texgen = GL_FALSE; -GLboolean __GLEW_SGIS_sharpen_texture = GL_FALSE; -GLboolean __GLEW_SGIS_texture4D = GL_FALSE; -GLboolean __GLEW_SGIS_texture_border_clamp = GL_FALSE; -GLboolean __GLEW_SGIS_texture_edge_clamp = GL_FALSE; -GLboolean __GLEW_SGIS_texture_filter4 = GL_FALSE; -GLboolean __GLEW_SGIS_texture_lod = GL_FALSE; -GLboolean __GLEW_SGIS_texture_select = GL_FALSE; -GLboolean __GLEW_SGIX_async = GL_FALSE; -GLboolean __GLEW_SGIX_async_histogram = GL_FALSE; -GLboolean __GLEW_SGIX_async_pixel = GL_FALSE; -GLboolean __GLEW_SGIX_blend_alpha_minmax = GL_FALSE; -GLboolean __GLEW_SGIX_clipmap = GL_FALSE; -GLboolean __GLEW_SGIX_convolution_accuracy = GL_FALSE; -GLboolean __GLEW_SGIX_depth_texture = GL_FALSE; -GLboolean __GLEW_SGIX_flush_raster = GL_FALSE; -GLboolean __GLEW_SGIX_fog_offset = GL_FALSE; -GLboolean __GLEW_SGIX_fog_texture = GL_FALSE; -GLboolean __GLEW_SGIX_fragment_specular_lighting = GL_FALSE; -GLboolean __GLEW_SGIX_framezoom = GL_FALSE; -GLboolean __GLEW_SGIX_interlace = GL_FALSE; -GLboolean __GLEW_SGIX_ir_instrument1 = GL_FALSE; -GLboolean __GLEW_SGIX_list_priority = GL_FALSE; -GLboolean __GLEW_SGIX_pixel_texture = GL_FALSE; -GLboolean __GLEW_SGIX_pixel_texture_bits = GL_FALSE; -GLboolean __GLEW_SGIX_reference_plane = GL_FALSE; -GLboolean __GLEW_SGIX_resample = GL_FALSE; -GLboolean __GLEW_SGIX_shadow = GL_FALSE; -GLboolean __GLEW_SGIX_shadow_ambient = GL_FALSE; -GLboolean __GLEW_SGIX_sprite = GL_FALSE; -GLboolean __GLEW_SGIX_tag_sample_buffer = GL_FALSE; -GLboolean __GLEW_SGIX_texture_add_env = GL_FALSE; -GLboolean __GLEW_SGIX_texture_coordinate_clamp = GL_FALSE; -GLboolean __GLEW_SGIX_texture_lod_bias = GL_FALSE; -GLboolean __GLEW_SGIX_texture_multi_buffer = GL_FALSE; -GLboolean __GLEW_SGIX_texture_range = GL_FALSE; -GLboolean __GLEW_SGIX_texture_scale_bias = GL_FALSE; -GLboolean __GLEW_SGIX_vertex_preclip = GL_FALSE; -GLboolean __GLEW_SGIX_vertex_preclip_hint = GL_FALSE; -GLboolean __GLEW_SGIX_ycrcb = GL_FALSE; -GLboolean __GLEW_SGI_color_matrix = GL_FALSE; -GLboolean __GLEW_SGI_color_table = GL_FALSE; -GLboolean __GLEW_SGI_texture_color_table = GL_FALSE; -GLboolean __GLEW_SUNX_constant_data = GL_FALSE; -GLboolean __GLEW_SUN_convolution_border_modes = GL_FALSE; -GLboolean __GLEW_SUN_global_alpha = GL_FALSE; -GLboolean __GLEW_SUN_mesh_array = GL_FALSE; -GLboolean __GLEW_SUN_read_video_pixels = GL_FALSE; -GLboolean __GLEW_SUN_slice_accum = GL_FALSE; -GLboolean __GLEW_SUN_triangle_list = GL_FALSE; -GLboolean __GLEW_SUN_vertex = GL_FALSE; -GLboolean __GLEW_WIN_phong_shading = GL_FALSE; -GLboolean __GLEW_WIN_specular_fog = GL_FALSE; -GLboolean __GLEW_WIN_swap_hint = GL_FALSE; - -#endif /* !GLEW_MX */ - -#ifdef GL_VERSION_1_2 - -static GLboolean _glewInit_GL_VERSION_1_2 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3D")) == NULL) || r; - r = ((glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElements")) == NULL) || r; - r = ((glTexImage3D = (PFNGLTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexImage3D")) == NULL) || r; - r = ((glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3D")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_1_2 */ - -#ifdef GL_VERSION_1_3 - -static GLboolean _glewInit_GL_VERSION_1_3 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glActiveTexture = (PFNGLACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glActiveTexture")) == NULL) || r; - r = ((glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glClientActiveTexture")) == NULL) || r; - r = ((glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage1D")) == NULL) || r; - r = ((glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage2D")) == NULL) || r; - r = ((glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3D")) == NULL) || r; - r = ((glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage1D")) == NULL) || r; - r = ((glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage2D")) == NULL) || r; - r = ((glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3D")) == NULL) || r; - r = ((glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTexImage")) == NULL) || r; - r = ((glLoadTransposeMatrixd = (PFNGLLOADTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixd")) == NULL) || r; - r = ((glLoadTransposeMatrixf = (PFNGLLOADTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixf")) == NULL) || r; - r = ((glMultTransposeMatrixd = (PFNGLMULTTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixd")) == NULL) || r; - r = ((glMultTransposeMatrixf = (PFNGLMULTTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixf")) == NULL) || r; - r = ((glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1d")) == NULL) || r; - r = ((glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dv")) == NULL) || r; - r = ((glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1f")) == NULL) || r; - r = ((glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fv")) == NULL) || r; - r = ((glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1i")) == NULL) || r; - r = ((glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1iv")) == NULL) || r; - r = ((glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1s")) == NULL) || r; - r = ((glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1sv")) == NULL) || r; - r = ((glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2d")) == NULL) || r; - r = ((glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dv")) == NULL) || r; - r = ((glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2f")) == NULL) || r; - r = ((glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fv")) == NULL) || r; - r = ((glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2i")) == NULL) || r; - r = ((glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2iv")) == NULL) || r; - r = ((glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2s")) == NULL) || r; - r = ((glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2sv")) == NULL) || r; - r = ((glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3d")) == NULL) || r; - r = ((glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dv")) == NULL) || r; - r = ((glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3f")) == NULL) || r; - r = ((glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fv")) == NULL) || r; - r = ((glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3i")) == NULL) || r; - r = ((glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3iv")) == NULL) || r; - r = ((glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3s")) == NULL) || r; - r = ((glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3sv")) == NULL) || r; - r = ((glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4d")) == NULL) || r; - r = ((glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dv")) == NULL) || r; - r = ((glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4f")) == NULL) || r; - r = ((glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fv")) == NULL) || r; - r = ((glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4i")) == NULL) || r; - r = ((glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4iv")) == NULL) || r; - r = ((glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4s")) == NULL) || r; - r = ((glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4sv")) == NULL) || r; - r = ((glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC)glewGetProcAddress((const GLubyte*)"glSampleCoverage")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_1_3 */ - -#ifdef GL_VERSION_1_4 - -static GLboolean _glewInit_GL_VERSION_1_4 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBlendColor = (PFNGLBLENDCOLORPROC)glewGetProcAddress((const GLubyte*)"glBlendColor")) == NULL) || r; - r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)"glBlendEquation")) == NULL) || r; - r = ((glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparate")) == NULL) || r; - r = ((glFogCoordPointer = (PFNGLFOGCOORDPOINTERPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointer")) == NULL) || r; - r = ((glFogCoordd = (PFNGLFOGCOORDDPROC)glewGetProcAddress((const GLubyte*)"glFogCoordd")) == NULL) || r; - r = ((glFogCoorddv = (PFNGLFOGCOORDDVPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddv")) == NULL) || r; - r = ((glFogCoordf = (PFNGLFOGCOORDFPROC)glewGetProcAddress((const GLubyte*)"glFogCoordf")) == NULL) || r; - r = ((glFogCoordfv = (PFNGLFOGCOORDFVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfv")) == NULL) || r; - r = ((glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArrays")) == NULL) || r; - r = ((glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElements")) == NULL) || r; - r = ((glPointParameterf = (PFNGLPOINTPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glPointParameterf")) == NULL) || r; - r = ((glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfv")) == NULL) || r; - r = ((glPointParameteri = (PFNGLPOINTPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glPointParameteri")) == NULL) || r; - r = ((glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glPointParameteriv")) == NULL) || r; - r = ((glSecondaryColor3b = (PFNGLSECONDARYCOLOR3BPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3b")) == NULL) || r; - r = ((glSecondaryColor3bv = (PFNGLSECONDARYCOLOR3BVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bv")) == NULL) || r; - r = ((glSecondaryColor3d = (PFNGLSECONDARYCOLOR3DPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3d")) == NULL) || r; - r = ((glSecondaryColor3dv = (PFNGLSECONDARYCOLOR3DVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dv")) == NULL) || r; - r = ((glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3f")) == NULL) || r; - r = ((glSecondaryColor3fv = (PFNGLSECONDARYCOLOR3FVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fv")) == NULL) || r; - r = ((glSecondaryColor3i = (PFNGLSECONDARYCOLOR3IPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3i")) == NULL) || r; - r = ((glSecondaryColor3iv = (PFNGLSECONDARYCOLOR3IVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3iv")) == NULL) || r; - r = ((glSecondaryColor3s = (PFNGLSECONDARYCOLOR3SPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3s")) == NULL) || r; - r = ((glSecondaryColor3sv = (PFNGLSECONDARYCOLOR3SVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3sv")) == NULL) || r; - r = ((glSecondaryColor3ub = (PFNGLSECONDARYCOLOR3UBPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ub")) == NULL) || r; - r = ((glSecondaryColor3ubv = (PFNGLSECONDARYCOLOR3UBVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubv")) == NULL) || r; - r = ((glSecondaryColor3ui = (PFNGLSECONDARYCOLOR3UIPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ui")) == NULL) || r; - r = ((glSecondaryColor3uiv = (PFNGLSECONDARYCOLOR3UIVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uiv")) == NULL) || r; - r = ((glSecondaryColor3us = (PFNGLSECONDARYCOLOR3USPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3us")) == NULL) || r; - r = ((glSecondaryColor3usv = (PFNGLSECONDARYCOLOR3USVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usv")) == NULL) || r; - r = ((glSecondaryColorPointer = (PFNGLSECONDARYCOLORPOINTERPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointer")) == NULL) || r; - r = ((glWindowPos2d = (PFNGLWINDOWPOS2DPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2d")) == NULL) || r; - r = ((glWindowPos2dv = (PFNGLWINDOWPOS2DVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dv")) == NULL) || r; - r = ((glWindowPos2f = (PFNGLWINDOWPOS2FPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2f")) == NULL) || r; - r = ((glWindowPos2fv = (PFNGLWINDOWPOS2FVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fv")) == NULL) || r; - r = ((glWindowPos2i = (PFNGLWINDOWPOS2IPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2i")) == NULL) || r; - r = ((glWindowPos2iv = (PFNGLWINDOWPOS2IVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iv")) == NULL) || r; - r = ((glWindowPos2s = (PFNGLWINDOWPOS2SPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2s")) == NULL) || r; - r = ((glWindowPos2sv = (PFNGLWINDOWPOS2SVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sv")) == NULL) || r; - r = ((glWindowPos3d = (PFNGLWINDOWPOS3DPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3d")) == NULL) || r; - r = ((glWindowPos3dv = (PFNGLWINDOWPOS3DVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dv")) == NULL) || r; - r = ((glWindowPos3f = (PFNGLWINDOWPOS3FPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3f")) == NULL) || r; - r = ((glWindowPos3fv = (PFNGLWINDOWPOS3FVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fv")) == NULL) || r; - r = ((glWindowPos3i = (PFNGLWINDOWPOS3IPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3i")) == NULL) || r; - r = ((glWindowPos3iv = (PFNGLWINDOWPOS3IVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iv")) == NULL) || r; - r = ((glWindowPos3s = (PFNGLWINDOWPOS3SPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3s")) == NULL) || r; - r = ((glWindowPos3sv = (PFNGLWINDOWPOS3SVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sv")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_1_4 */ - -#ifdef GL_VERSION_1_5 - -static GLboolean _glewInit_GL_VERSION_1_5 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBeginQuery = (PFNGLBEGINQUERYPROC)glewGetProcAddress((const GLubyte*)"glBeginQuery")) == NULL) || r; - r = ((glBindBuffer = (PFNGLBINDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindBuffer")) == NULL) || r; - r = ((glBufferData = (PFNGLBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glBufferData")) == NULL) || r; - r = ((glBufferSubData = (PFNGLBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glBufferSubData")) == NULL) || r; - r = ((glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteBuffers")) == NULL) || r; - r = ((glDeleteQueries = (PFNGLDELETEQUERIESPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueries")) == NULL) || r; - r = ((glEndQuery = (PFNGLENDQUERYPROC)glewGetProcAddress((const GLubyte*)"glEndQuery")) == NULL) || r; - r = ((glGenBuffers = (PFNGLGENBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenBuffers")) == NULL) || r; - r = ((glGenQueries = (PFNGLGENQUERIESPROC)glewGetProcAddress((const GLubyte*)"glGenQueries")) == NULL) || r; - r = ((glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameteriv")) == NULL) || r; - r = ((glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferPointerv")) == NULL) || r; - r = ((glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glGetBufferSubData")) == NULL) || r; - r = ((glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectiv")) == NULL) || r; - r = ((glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuiv")) == NULL) || r; - r = ((glGetQueryiv = (PFNGLGETQUERYIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryiv")) == NULL) || r; - r = ((glIsBuffer = (PFNGLISBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsBuffer")) == NULL) || r; - r = ((glIsQuery = (PFNGLISQUERYPROC)glewGetProcAddress((const GLubyte*)"glIsQuery")) == NULL) || r; - r = ((glMapBuffer = (PFNGLMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glMapBuffer")) == NULL) || r; - r = ((glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glUnmapBuffer")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_1_5 */ - -#ifdef GL_VERSION_2_0 - -static GLboolean _glewInit_GL_VERSION_2_0 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glAttachShader = (PFNGLATTACHSHADERPROC)glewGetProcAddress((const GLubyte*)"glAttachShader")) == NULL) || r; - r = ((glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glBindAttribLocation")) == NULL) || r; - r = ((glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparate")) == NULL) || r; - r = ((glCompileShader = (PFNGLCOMPILESHADERPROC)glewGetProcAddress((const GLubyte*)"glCompileShader")) == NULL) || r; - r = ((glCreateProgram = (PFNGLCREATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glCreateProgram")) == NULL) || r; - r = ((glCreateShader = (PFNGLCREATESHADERPROC)glewGetProcAddress((const GLubyte*)"glCreateShader")) == NULL) || r; - r = ((glDeleteProgram = (PFNGLDELETEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgram")) == NULL) || r; - r = ((glDeleteShader = (PFNGLDELETESHADERPROC)glewGetProcAddress((const GLubyte*)"glDeleteShader")) == NULL) || r; - r = ((glDetachShader = (PFNGLDETACHSHADERPROC)glewGetProcAddress((const GLubyte*)"glDetachShader")) == NULL) || r; - r = ((glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribArray")) == NULL) || r; - r = ((glDrawBuffers = (PFNGLDRAWBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffers")) == NULL) || r; - r = ((glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribArray")) == NULL) || r; - r = ((glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAttrib")) == NULL) || r; - r = ((glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniform")) == NULL) || r; - r = ((glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC)glewGetProcAddress((const GLubyte*)"glGetAttachedShaders")) == NULL) || r; - r = ((glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetAttribLocation")) == NULL) || r; - r = ((glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetProgramInfoLog")) == NULL) || r; - r = ((glGetProgramiv = (PFNGLGETPROGRAMIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramiv")) == NULL) || r; - r = ((glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetShaderInfoLog")) == NULL) || r; - r = ((glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)"glGetShaderSource")) == NULL) || r; - r = ((glGetShaderiv = (PFNGLGETSHADERIVPROC)glewGetProcAddress((const GLubyte*)"glGetShaderiv")) == NULL) || r; - r = ((glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetUniformLocation")) == NULL) || r; - r = ((glGetUniformfv = (PFNGLGETUNIFORMFVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformfv")) == NULL) || r; - r = ((glGetUniformiv = (PFNGLGETUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformiv")) == NULL) || r; - r = ((glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointerv")) == NULL) || r; - r = ((glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdv")) == NULL) || r; - r = ((glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfv")) == NULL) || r; - r = ((glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribiv")) == NULL) || r; - r = ((glIsProgram = (PFNGLISPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glIsProgram")) == NULL) || r; - r = ((glIsShader = (PFNGLISSHADERPROC)glewGetProcAddress((const GLubyte*)"glIsShader")) == NULL) || r; - r = ((glLinkProgram = (PFNGLLINKPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glLinkProgram")) == NULL) || r; - r = ((glShaderSource = (PFNGLSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)"glShaderSource")) == NULL) || r; - r = ((glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilFuncSeparate")) == NULL) || r; - r = ((glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilMaskSeparate")) == NULL) || r; - r = ((glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilOpSeparate")) == NULL) || r; - r = ((glUniform1f = (PFNGLUNIFORM1FPROC)glewGetProcAddress((const GLubyte*)"glUniform1f")) == NULL) || r; - r = ((glUniform1fv = (PFNGLUNIFORM1FVPROC)glewGetProcAddress((const GLubyte*)"glUniform1fv")) == NULL) || r; - r = ((glUniform1i = (PFNGLUNIFORM1IPROC)glewGetProcAddress((const GLubyte*)"glUniform1i")) == NULL) || r; - r = ((glUniform1iv = (PFNGLUNIFORM1IVPROC)glewGetProcAddress((const GLubyte*)"glUniform1iv")) == NULL) || r; - r = ((glUniform2f = (PFNGLUNIFORM2FPROC)glewGetProcAddress((const GLubyte*)"glUniform2f")) == NULL) || r; - r = ((glUniform2fv = (PFNGLUNIFORM2FVPROC)glewGetProcAddress((const GLubyte*)"glUniform2fv")) == NULL) || r; - r = ((glUniform2i = (PFNGLUNIFORM2IPROC)glewGetProcAddress((const GLubyte*)"glUniform2i")) == NULL) || r; - r = ((glUniform2iv = (PFNGLUNIFORM2IVPROC)glewGetProcAddress((const GLubyte*)"glUniform2iv")) == NULL) || r; - r = ((glUniform3f = (PFNGLUNIFORM3FPROC)glewGetProcAddress((const GLubyte*)"glUniform3f")) == NULL) || r; - r = ((glUniform3fv = (PFNGLUNIFORM3FVPROC)glewGetProcAddress((const GLubyte*)"glUniform3fv")) == NULL) || r; - r = ((glUniform3i = (PFNGLUNIFORM3IPROC)glewGetProcAddress((const GLubyte*)"glUniform3i")) == NULL) || r; - r = ((glUniform3iv = (PFNGLUNIFORM3IVPROC)glewGetProcAddress((const GLubyte*)"glUniform3iv")) == NULL) || r; - r = ((glUniform4f = (PFNGLUNIFORM4FPROC)glewGetProcAddress((const GLubyte*)"glUniform4f")) == NULL) || r; - r = ((glUniform4fv = (PFNGLUNIFORM4FVPROC)glewGetProcAddress((const GLubyte*)"glUniform4fv")) == NULL) || r; - r = ((glUniform4i = (PFNGLUNIFORM4IPROC)glewGetProcAddress((const GLubyte*)"glUniform4i")) == NULL) || r; - r = ((glUniform4iv = (PFNGLUNIFORM4IVPROC)glewGetProcAddress((const GLubyte*)"glUniform4iv")) == NULL) || r; - r = ((glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2fv")) == NULL) || r; - r = ((glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3fv")) == NULL) || r; - r = ((glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4fv")) == NULL) || r; - r = ((glUseProgram = (PFNGLUSEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glUseProgram")) == NULL) || r; - r = ((glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glValidateProgram")) == NULL) || r; - r = ((glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1d")) == NULL) || r; - r = ((glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dv")) == NULL) || r; - r = ((glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1f")) == NULL) || r; - r = ((glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fv")) == NULL) || r; - r = ((glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1s")) == NULL) || r; - r = ((glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sv")) == NULL) || r; - r = ((glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2d")) == NULL) || r; - r = ((glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dv")) == NULL) || r; - r = ((glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2f")) == NULL) || r; - r = ((glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fv")) == NULL) || r; - r = ((glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2s")) == NULL) || r; - r = ((glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sv")) == NULL) || r; - r = ((glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3d")) == NULL) || r; - r = ((glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dv")) == NULL) || r; - r = ((glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3f")) == NULL) || r; - r = ((glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fv")) == NULL) || r; - r = ((glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3s")) == NULL) || r; - r = ((glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sv")) == NULL) || r; - r = ((glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nbv")) == NULL) || r; - r = ((glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Niv")) == NULL) || r; - r = ((glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nsv")) == NULL) || r; - r = ((glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nub")) == NULL) || r; - r = ((glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nubv")) == NULL) || r; - r = ((glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nuiv")) == NULL) || r; - r = ((glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nusv")) == NULL) || r; - r = ((glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4bv")) == NULL) || r; - r = ((glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4d")) == NULL) || r; - r = ((glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dv")) == NULL) || r; - r = ((glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4f")) == NULL) || r; - r = ((glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fv")) == NULL) || r; - r = ((glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4iv")) == NULL) || r; - r = ((glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4s")) == NULL) || r; - r = ((glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sv")) == NULL) || r; - r = ((glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubv")) == NULL) || r; - r = ((glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4uiv")) == NULL) || r; - r = ((glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4usv")) == NULL) || r; - r = ((glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointer")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_2_0 */ - -#ifdef GL_VERSION_2_1 - -static GLboolean _glewInit_GL_VERSION_2_1 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3fv")) == NULL) || r; - r = ((glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4fv")) == NULL) || r; - r = ((glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2fv")) == NULL) || r; - r = ((glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4fv")) == NULL) || r; - r = ((glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2fv")) == NULL) || r; - r = ((glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3fv")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_2_1 */ - -#ifdef GL_VERSION_3_0 - -static GLboolean _glewInit_GL_VERSION_3_0 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRender")) == NULL) || r; - r = ((glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedback")) == NULL) || r; - r = ((glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocation")) == NULL) || r; - r = ((glClampColor = (PFNGLCLAMPCOLORPROC)glewGetProcAddress((const GLubyte*)"glClampColor")) == NULL) || r; - r = ((glClearBufferfi = (PFNGLCLEARBUFFERFIPROC)glewGetProcAddress((const GLubyte*)"glClearBufferfi")) == NULL) || r; - r = ((glClearBufferfv = (PFNGLCLEARBUFFERFVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferfv")) == NULL) || r; - r = ((glClearBufferiv = (PFNGLCLEARBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferiv")) == NULL) || r; - r = ((glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferuiv")) == NULL) || r; - r = ((glColorMaski = (PFNGLCOLORMASKIPROC)glewGetProcAddress((const GLubyte*)"glColorMaski")) == NULL) || r; - r = ((glDisablei = (PFNGLDISABLEIPROC)glewGetProcAddress((const GLubyte*)"glDisablei")) == NULL) || r; - r = ((glEnablei = (PFNGLENABLEIPROC)glewGetProcAddress((const GLubyte*)"glEnablei")) == NULL) || r; - r = ((glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRender")) == NULL) || r; - r = ((glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedback")) == NULL) || r; - r = ((glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC)glewGetProcAddress((const GLubyte*)"glGetBooleani_v")) == NULL) || r; - r = ((glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataLocation")) == NULL) || r; - r = ((glGetStringi = (PFNGLGETSTRINGIPROC)glewGetProcAddress((const GLubyte*)"glGetStringi")) == NULL) || r; - r = ((glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIiv")) == NULL) || r; - r = ((glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIuiv")) == NULL) || r; - r = ((glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVarying")) == NULL) || r; - r = ((glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformuiv")) == NULL) || r; - r = ((glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIiv")) == NULL) || r; - r = ((glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIuiv")) == NULL) || r; - r = ((glIsEnabledi = (PFNGLISENABLEDIPROC)glewGetProcAddress((const GLubyte*)"glIsEnabledi")) == NULL) || r; - r = ((glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIiv")) == NULL) || r; - r = ((glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIuiv")) == NULL) || r; - r = ((glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryings")) == NULL) || r; - r = ((glUniform1ui = (PFNGLUNIFORM1UIPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui")) == NULL) || r; - r = ((glUniform1uiv = (PFNGLUNIFORM1UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform1uiv")) == NULL) || r; - r = ((glUniform2ui = (PFNGLUNIFORM2UIPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui")) == NULL) || r; - r = ((glUniform2uiv = (PFNGLUNIFORM2UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform2uiv")) == NULL) || r; - r = ((glUniform3ui = (PFNGLUNIFORM3UIPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui")) == NULL) || r; - r = ((glUniform3uiv = (PFNGLUNIFORM3UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform3uiv")) == NULL) || r; - r = ((glUniform4ui = (PFNGLUNIFORM4UIPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui")) == NULL) || r; - r = ((glUniform4uiv = (PFNGLUNIFORM4UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform4uiv")) == NULL) || r; - r = ((glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1i")) == NULL) || r; - r = ((glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1iv")) == NULL) || r; - r = ((glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1ui")) == NULL) || r; - r = ((glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uiv")) == NULL) || r; - r = ((glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2i")) == NULL) || r; - r = ((glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2iv")) == NULL) || r; - r = ((glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2ui")) == NULL) || r; - r = ((glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uiv")) == NULL) || r; - r = ((glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3i")) == NULL) || r; - r = ((glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3iv")) == NULL) || r; - r = ((glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3ui")) == NULL) || r; - r = ((glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uiv")) == NULL) || r; - r = ((glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4bv")) == NULL) || r; - r = ((glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4i")) == NULL) || r; - r = ((glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4iv")) == NULL) || r; - r = ((glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4sv")) == NULL) || r; - r = ((glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ubv")) == NULL) || r; - r = ((glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ui")) == NULL) || r; - r = ((glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uiv")) == NULL) || r; - r = ((glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4usv")) == NULL) || r; - r = ((glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIPointer")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_3_0 */ - -#ifdef GL_VERSION_3_1 - -static GLboolean _glewInit_GL_VERSION_3_1 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstanced")) == NULL) || r; - r = ((glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstanced")) == NULL) || r; - r = ((glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartIndex")) == NULL) || r; - r = ((glTexBuffer = (PFNGLTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glTexBuffer")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_3_1 */ - -#ifdef GL_VERSION_3_2 - -static GLboolean _glewInit_GL_VERSION_3_2 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture")) == NULL) || r; - r = ((glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameteri64v")) == NULL) || r; - r = ((glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64i_v")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_3_2 */ - -#ifdef GL_VERSION_3_3 - -static GLboolean _glewInit_GL_VERSION_3_3 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisor")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_3_3 */ - -#ifdef GL_VERSION_4_0 - -static GLboolean _glewInit_GL_VERSION_4_0 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquationSeparatei = (PFNGLBLENDEQUATIONSEPARATEIPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparatei")) == NULL) || r; - r = ((glBlendEquationi = (PFNGLBLENDEQUATIONIPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationi")) == NULL) || r; - r = ((glBlendFuncSeparatei = (PFNGLBLENDFUNCSEPARATEIPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparatei")) == NULL) || r; - r = ((glBlendFunci = (PFNGLBLENDFUNCIPROC)glewGetProcAddress((const GLubyte*)"glBlendFunci")) == NULL) || r; - r = ((glMinSampleShading = (PFNGLMINSAMPLESHADINGPROC)glewGetProcAddress((const GLubyte*)"glMinSampleShading")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_4_0 */ - -#ifdef GL_VERSION_4_5 - -static GLboolean _glewInit_GL_VERSION_4_5 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetGraphicsResetStatus = (PFNGLGETGRAPHICSRESETSTATUSPROC)glewGetProcAddress((const GLubyte*)"glGetGraphicsResetStatus")) == NULL) || r; - r = ((glGetnCompressedTexImage = (PFNGLGETNCOMPRESSEDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetnCompressedTexImage")) == NULL) || r; - r = ((glGetnTexImage = (PFNGLGETNTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetnTexImage")) == NULL) || r; - r = ((glGetnUniformdv = (PFNGLGETNUNIFORMDVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformdv")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_4_5 */ - -#ifdef GL_3DFX_tbuffer - -static GLboolean _glewInit_GL_3DFX_tbuffer (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTbufferMask3DFX = (PFNGLTBUFFERMASK3DFXPROC)glewGetProcAddress((const GLubyte*)"glTbufferMask3DFX")) == NULL) || r; - - return r; -} - -#endif /* GL_3DFX_tbuffer */ - -#ifdef GL_AMD_debug_output - -static GLboolean _glewInit_GL_AMD_debug_output (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDebugMessageCallbackAMD = (PFNGLDEBUGMESSAGECALLBACKAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallbackAMD")) == NULL) || r; - r = ((glDebugMessageEnableAMD = (PFNGLDEBUGMESSAGEENABLEAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageEnableAMD")) == NULL) || r; - r = ((glDebugMessageInsertAMD = (PFNGLDEBUGMESSAGEINSERTAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsertAMD")) == NULL) || r; - r = ((glGetDebugMessageLogAMD = (PFNGLGETDEBUGMESSAGELOGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLogAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_debug_output */ - -#ifdef GL_AMD_draw_buffers_blend - -static GLboolean _glewInit_GL_AMD_draw_buffers_blend (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquationIndexedAMD = (PFNGLBLENDEQUATIONINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationIndexedAMD")) == NULL) || r; - r = ((glBlendEquationSeparateIndexedAMD = (PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateIndexedAMD")) == NULL) || r; - r = ((glBlendFuncIndexedAMD = (PFNGLBLENDFUNCINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncIndexedAMD")) == NULL) || r; - r = ((glBlendFuncSeparateIndexedAMD = (PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateIndexedAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_draw_buffers_blend */ - -#ifdef GL_AMD_interleaved_elements - -static GLboolean _glewInit_GL_AMD_interleaved_elements (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glVertexAttribParameteriAMD = (PFNGLVERTEXATTRIBPARAMETERIAMDPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribParameteriAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_interleaved_elements */ - -#ifdef GL_AMD_multi_draw_indirect - -static GLboolean _glewInit_GL_AMD_multi_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glMultiDrawArraysIndirectAMD = (PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectAMD")) == NULL) || r; - r = ((glMultiDrawElementsIndirectAMD = (PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_multi_draw_indirect */ - -#ifdef GL_AMD_name_gen_delete - -static GLboolean _glewInit_GL_AMD_name_gen_delete (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDeleteNamesAMD = (PFNGLDELETENAMESAMDPROC)glewGetProcAddress((const GLubyte*)"glDeleteNamesAMD")) == NULL) || r; - r = ((glGenNamesAMD = (PFNGLGENNAMESAMDPROC)glewGetProcAddress((const GLubyte*)"glGenNamesAMD")) == NULL) || r; - r = ((glIsNameAMD = (PFNGLISNAMEAMDPROC)glewGetProcAddress((const GLubyte*)"glIsNameAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_name_gen_delete */ - -#ifdef GL_AMD_occlusion_query_event - -static GLboolean _glewInit_GL_AMD_occlusion_query_event (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glQueryObjectParameteruiAMD = (PFNGLQUERYOBJECTPARAMETERUIAMDPROC)glewGetProcAddress((const GLubyte*)"glQueryObjectParameteruiAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_occlusion_query_event */ - -#ifdef GL_AMD_performance_monitor - -static GLboolean _glewInit_GL_AMD_performance_monitor (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBeginPerfMonitorAMD = (PFNGLBEGINPERFMONITORAMDPROC)glewGetProcAddress((const GLubyte*)"glBeginPerfMonitorAMD")) == NULL) || r; - r = ((glDeletePerfMonitorsAMD = (PFNGLDELETEPERFMONITORSAMDPROC)glewGetProcAddress((const GLubyte*)"glDeletePerfMonitorsAMD")) == NULL) || r; - r = ((glEndPerfMonitorAMD = (PFNGLENDPERFMONITORAMDPROC)glewGetProcAddress((const GLubyte*)"glEndPerfMonitorAMD")) == NULL) || r; - r = ((glGenPerfMonitorsAMD = (PFNGLGENPERFMONITORSAMDPROC)glewGetProcAddress((const GLubyte*)"glGenPerfMonitorsAMD")) == NULL) || r; - r = ((glGetPerfMonitorCounterDataAMD = (PFNGLGETPERFMONITORCOUNTERDATAAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterDataAMD")) == NULL) || r; - r = ((glGetPerfMonitorCounterInfoAMD = (PFNGLGETPERFMONITORCOUNTERINFOAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterInfoAMD")) == NULL) || r; - r = ((glGetPerfMonitorCounterStringAMD = (PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterStringAMD")) == NULL) || r; - r = ((glGetPerfMonitorCountersAMD = (PFNGLGETPERFMONITORCOUNTERSAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCountersAMD")) == NULL) || r; - r = ((glGetPerfMonitorGroupStringAMD = (PFNGLGETPERFMONITORGROUPSTRINGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorGroupStringAMD")) == NULL) || r; - r = ((glGetPerfMonitorGroupsAMD = (PFNGLGETPERFMONITORGROUPSAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorGroupsAMD")) == NULL) || r; - r = ((glSelectPerfMonitorCountersAMD = (PFNGLSELECTPERFMONITORCOUNTERSAMDPROC)glewGetProcAddress((const GLubyte*)"glSelectPerfMonitorCountersAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_performance_monitor */ - -#ifdef GL_AMD_sample_positions - -static GLboolean _glewInit_GL_AMD_sample_positions (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glSetMultisamplefvAMD = (PFNGLSETMULTISAMPLEFVAMDPROC)glewGetProcAddress((const GLubyte*)"glSetMultisamplefvAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_sample_positions */ - -#ifdef GL_AMD_sparse_texture - -static GLboolean _glewInit_GL_AMD_sparse_texture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTexStorageSparseAMD = (PFNGLTEXSTORAGESPARSEAMDPROC)glewGetProcAddress((const GLubyte*)"glTexStorageSparseAMD")) == NULL) || r; - r = ((glTextureStorageSparseAMD = (PFNGLTEXTURESTORAGESPARSEAMDPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageSparseAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_sparse_texture */ - -#ifdef GL_AMD_stencil_operation_extended - -static GLboolean _glewInit_GL_AMD_stencil_operation_extended (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glStencilOpValueAMD = (PFNGLSTENCILOPVALUEAMDPROC)glewGetProcAddress((const GLubyte*)"glStencilOpValueAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_stencil_operation_extended */ - -#ifdef GL_AMD_vertex_shader_tessellator - -static GLboolean _glewInit_GL_AMD_vertex_shader_tessellator (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTessellationFactorAMD = (PFNGLTESSELLATIONFACTORAMDPROC)glewGetProcAddress((const GLubyte*)"glTessellationFactorAMD")) == NULL) || r; - r = ((glTessellationModeAMD = (PFNGLTESSELLATIONMODEAMDPROC)glewGetProcAddress((const GLubyte*)"glTessellationModeAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_vertex_shader_tessellator */ - -#ifdef GL_ANGLE_framebuffer_blit - -static GLboolean _glewInit_GL_ANGLE_framebuffer_blit (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBlitFramebufferANGLE = (PFNGLBLITFRAMEBUFFERANGLEPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferANGLE")) == NULL) || r; - - return r; -} - -#endif /* GL_ANGLE_framebuffer_blit */ - -#ifdef GL_ANGLE_framebuffer_multisample - -static GLboolean _glewInit_GL_ANGLE_framebuffer_multisample (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glRenderbufferStorageMultisampleANGLE = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleANGLE")) == NULL) || r; - - return r; -} - -#endif /* GL_ANGLE_framebuffer_multisample */ - -#ifdef GL_ANGLE_instanced_arrays - -static GLboolean _glewInit_GL_ANGLE_instanced_arrays (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDrawArraysInstancedANGLE = (PFNGLDRAWARRAYSINSTANCEDANGLEPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedANGLE")) == NULL) || r; - r = ((glDrawElementsInstancedANGLE = (PFNGLDRAWELEMENTSINSTANCEDANGLEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedANGLE")) == NULL) || r; - r = ((glVertexAttribDivisorANGLE = (PFNGLVERTEXATTRIBDIVISORANGLEPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorANGLE")) == NULL) || r; - - return r; -} - -#endif /* GL_ANGLE_instanced_arrays */ - -#ifdef GL_ANGLE_timer_query - -static GLboolean _glewInit_GL_ANGLE_timer_query (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBeginQueryANGLE = (PFNGLBEGINQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryANGLE")) == NULL) || r; - r = ((glDeleteQueriesANGLE = (PFNGLDELETEQUERIESANGLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueriesANGLE")) == NULL) || r; - r = ((glEndQueryANGLE = (PFNGLENDQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glEndQueryANGLE")) == NULL) || r; - r = ((glGenQueriesANGLE = (PFNGLGENQUERIESANGLEPROC)glewGetProcAddress((const GLubyte*)"glGenQueriesANGLE")) == NULL) || r; - r = ((glGetQueryObjecti64vANGLE = (PFNGLGETQUERYOBJECTI64VANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64vANGLE")) == NULL) || r; - r = ((glGetQueryObjectivANGLE = (PFNGLGETQUERYOBJECTIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectivANGLE")) == NULL) || r; - r = ((glGetQueryObjectui64vANGLE = (PFNGLGETQUERYOBJECTUI64VANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64vANGLE")) == NULL) || r; - r = ((glGetQueryObjectuivANGLE = (PFNGLGETQUERYOBJECTUIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuivANGLE")) == NULL) || r; - r = ((glGetQueryivANGLE = (PFNGLGETQUERYIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryivANGLE")) == NULL) || r; - r = ((glIsQueryANGLE = (PFNGLISQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glIsQueryANGLE")) == NULL) || r; - r = ((glQueryCounterANGLE = (PFNGLQUERYCOUNTERANGLEPROC)glewGetProcAddress((const GLubyte*)"glQueryCounterANGLE")) == NULL) || r; - - return r; -} - -#endif /* GL_ANGLE_timer_query */ - -#ifdef GL_ANGLE_translated_shader_source - -static GLboolean _glewInit_GL_ANGLE_translated_shader_source (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetTranslatedShaderSourceANGLE = (PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetTranslatedShaderSourceANGLE")) == NULL) || r; - - return r; -} - -#endif /* GL_ANGLE_translated_shader_source */ - -#ifdef GL_APPLE_element_array - -static GLboolean _glewInit_GL_APPLE_element_array (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDrawElementArrayAPPLE = (PFNGLDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementArrayAPPLE")) == NULL) || r; - r = ((glDrawRangeElementArrayAPPLE = (PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementArrayAPPLE")) == NULL) || r; - r = ((glElementPointerAPPLE = (PFNGLELEMENTPOINTERAPPLEPROC)glewGetProcAddress((const GLubyte*)"glElementPointerAPPLE")) == NULL) || r; - r = ((glMultiDrawElementArrayAPPLE = (PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementArrayAPPLE")) == NULL) || r; - r = ((glMultiDrawRangeElementArrayAPPLE = (PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawRangeElementArrayAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_element_array */ - -#ifdef GL_APPLE_fence - -static GLboolean _glewInit_GL_APPLE_fence (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDeleteFencesAPPLE = (PFNGLDELETEFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteFencesAPPLE")) == NULL) || r; - r = ((glFinishFenceAPPLE = (PFNGLFINISHFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFinishFenceAPPLE")) == NULL) || r; - r = ((glFinishObjectAPPLE = (PFNGLFINISHOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFinishObjectAPPLE")) == NULL) || r; - r = ((glGenFencesAPPLE = (PFNGLGENFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGenFencesAPPLE")) == NULL) || r; - r = ((glIsFenceAPPLE = (PFNGLISFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsFenceAPPLE")) == NULL) || r; - r = ((glSetFenceAPPLE = (PFNGLSETFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glSetFenceAPPLE")) == NULL) || r; - r = ((glTestFenceAPPLE = (PFNGLTESTFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTestFenceAPPLE")) == NULL) || r; - r = ((glTestObjectAPPLE = (PFNGLTESTOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTestObjectAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_fence */ - -#ifdef GL_APPLE_flush_buffer_range - -static GLboolean _glewInit_GL_APPLE_flush_buffer_range (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBufferParameteriAPPLE = (PFNGLBUFFERPARAMETERIAPPLEPROC)glewGetProcAddress((const GLubyte*)"glBufferParameteriAPPLE")) == NULL) || r; - r = ((glFlushMappedBufferRangeAPPLE = (PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedBufferRangeAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_flush_buffer_range */ - -#ifdef GL_APPLE_object_purgeable - -static GLboolean _glewInit_GL_APPLE_object_purgeable (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetObjectParameterivAPPLE = (PFNGLGETOBJECTPARAMETERIVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterivAPPLE")) == NULL) || r; - r = ((glObjectPurgeableAPPLE = (PFNGLOBJECTPURGEABLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glObjectPurgeableAPPLE")) == NULL) || r; - r = ((glObjectUnpurgeableAPPLE = (PFNGLOBJECTUNPURGEABLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glObjectUnpurgeableAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_object_purgeable */ - -#ifdef GL_APPLE_texture_range - -static GLboolean _glewInit_GL_APPLE_texture_range (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetTexParameterPointervAPPLE = (PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterPointervAPPLE")) == NULL) || r; - r = ((glTextureRangeAPPLE = (PFNGLTEXTURERANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureRangeAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_texture_range */ - -#ifdef GL_APPLE_vertex_array_object - -static GLboolean _glewInit_GL_APPLE_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindVertexArrayAPPLE = (PFNGLBINDVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArrayAPPLE")) == NULL) || r; - r = ((glDeleteVertexArraysAPPLE = (PFNGLDELETEVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArraysAPPLE")) == NULL) || r; - r = ((glGenVertexArraysAPPLE = (PFNGLGENVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArraysAPPLE")) == NULL) || r; - r = ((glIsVertexArrayAPPLE = (PFNGLISVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArrayAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_vertex_array_object */ - -#ifdef GL_APPLE_vertex_array_range - -static GLboolean _glewInit_GL_APPLE_vertex_array_range (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFlushVertexArrayRangeAPPLE = (PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFlushVertexArrayRangeAPPLE")) == NULL) || r; - r = ((glVertexArrayParameteriAPPLE = (PFNGLVERTEXARRAYPARAMETERIAPPLEPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayParameteriAPPLE")) == NULL) || r; - r = ((glVertexArrayRangeAPPLE = (PFNGLVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayRangeAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_vertex_array_range */ - -#ifdef GL_APPLE_vertex_program_evaluators - -static GLboolean _glewInit_GL_APPLE_vertex_program_evaluators (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDisableVertexAttribAPPLE = (PFNGLDISABLEVERTEXATTRIBAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribAPPLE")) == NULL) || r; - r = ((glEnableVertexAttribAPPLE = (PFNGLENABLEVERTEXATTRIBAPPLEPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribAPPLE")) == NULL) || r; - r = ((glIsVertexAttribEnabledAPPLE = (PFNGLISVERTEXATTRIBENABLEDAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsVertexAttribEnabledAPPLE")) == NULL) || r; - r = ((glMapVertexAttrib1dAPPLE = (PFNGLMAPVERTEXATTRIB1DAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib1dAPPLE")) == NULL) || r; - r = ((glMapVertexAttrib1fAPPLE = (PFNGLMAPVERTEXATTRIB1FAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib1fAPPLE")) == NULL) || r; - r = ((glMapVertexAttrib2dAPPLE = (PFNGLMAPVERTEXATTRIB2DAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib2dAPPLE")) == NULL) || r; - r = ((glMapVertexAttrib2fAPPLE = (PFNGLMAPVERTEXATTRIB2FAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib2fAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_vertex_program_evaluators */ - -#ifdef GL_ARB_ES2_compatibility - -static GLboolean _glewInit_GL_ARB_ES2_compatibility (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glClearDepthf = (PFNGLCLEARDEPTHFPROC)glewGetProcAddress((const GLubyte*)"glClearDepthf")) == NULL) || r; - r = ((glDepthRangef = (PFNGLDEPTHRANGEFPROC)glewGetProcAddress((const GLubyte*)"glDepthRangef")) == NULL) || r; - r = ((glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC)glewGetProcAddress((const GLubyte*)"glGetShaderPrecisionFormat")) == NULL) || r; - r = ((glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC)glewGetProcAddress((const GLubyte*)"glReleaseShaderCompiler")) == NULL) || r; - r = ((glShaderBinary = (PFNGLSHADERBINARYPROC)glewGetProcAddress((const GLubyte*)"glShaderBinary")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_ES2_compatibility */ - -#ifdef GL_ARB_ES3_1_compatibility - -static GLboolean _glewInit_GL_ARB_ES3_1_compatibility (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glMemoryBarrierByRegion = (PFNGLMEMORYBARRIERBYREGIONPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrierByRegion")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_ES3_1_compatibility */ - -#ifdef GL_ARB_ES3_2_compatibility - -static GLboolean _glewInit_GL_ARB_ES3_2_compatibility (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glPrimitiveBoundingBoxARB = (PFNGLPRIMITIVEBOUNDINGBOXARBPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveBoundingBoxARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_ES3_2_compatibility */ - -#ifdef GL_ARB_base_instance - -static GLboolean _glewInit_GL_ARB_base_instance (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedBaseInstance")) == NULL) || r; - r = ((glDrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseInstance")) == NULL) || r; - r = ((glDrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertexBaseInstance")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_base_instance */ - -#ifdef GL_ARB_bindless_texture - -static GLboolean _glewInit_GL_ARB_bindless_texture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetImageHandleARB = (PFNGLGETIMAGEHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetImageHandleARB")) == NULL) || r; - r = ((glGetTextureHandleARB = (PFNGLGETTEXTUREHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetTextureHandleARB")) == NULL) || r; - r = ((glGetTextureSamplerHandleARB = (PFNGLGETTEXTURESAMPLERHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSamplerHandleARB")) == NULL) || r; - r = ((glGetVertexAttribLui64vARB = (PFNGLGETVERTEXATTRIBLUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLui64vARB")) == NULL) || r; - r = ((glIsImageHandleResidentARB = (PFNGLISIMAGEHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glIsImageHandleResidentARB")) == NULL) || r; - r = ((glIsTextureHandleResidentARB = (PFNGLISTEXTUREHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glIsTextureHandleResidentARB")) == NULL) || r; - r = ((glMakeImageHandleNonResidentARB = (PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleNonResidentARB")) == NULL) || r; - r = ((glMakeImageHandleResidentARB = (PFNGLMAKEIMAGEHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleResidentARB")) == NULL) || r; - r = ((glMakeTextureHandleNonResidentARB = (PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleNonResidentARB")) == NULL) || r; - r = ((glMakeTextureHandleResidentARB = (PFNGLMAKETEXTUREHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleResidentARB")) == NULL) || r; - r = ((glProgramUniformHandleui64ARB = (PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64ARB")) == NULL) || r; - r = ((glProgramUniformHandleui64vARB = (PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64vARB")) == NULL) || r; - r = ((glUniformHandleui64ARB = (PFNGLUNIFORMHANDLEUI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64ARB")) == NULL) || r; - r = ((glUniformHandleui64vARB = (PFNGLUNIFORMHANDLEUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64vARB")) == NULL) || r; - r = ((glVertexAttribL1ui64ARB = (PFNGLVERTEXATTRIBL1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64ARB")) == NULL) || r; - r = ((glVertexAttribL1ui64vARB = (PFNGLVERTEXATTRIBL1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64vARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_bindless_texture */ - -#ifdef GL_ARB_blend_func_extended - -static GLboolean _glewInit_GL_ARB_blend_func_extended (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationIndexed")) == NULL) || r; - r = ((glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataIndex")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_blend_func_extended */ - -#ifdef GL_ARB_buffer_storage - -static GLboolean _glewInit_GL_ARB_buffer_storage (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBufferStorage = (PFNGLBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glBufferStorage")) == NULL) || r; - r = ((glNamedBufferStorageEXT = (PFNGLNAMEDBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorageEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_buffer_storage */ - -#ifdef GL_ARB_cl_event - -static GLboolean _glewInit_GL_ARB_cl_event (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glCreateSyncFromCLeventARB = (PFNGLCREATESYNCFROMCLEVENTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateSyncFromCLeventARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_cl_event */ - -#ifdef GL_ARB_clear_buffer_object - -static GLboolean _glewInit_GL_ARB_clear_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glClearBufferData = (PFNGLCLEARBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glClearBufferData")) == NULL) || r; - r = ((glClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glClearBufferSubData")) == NULL) || r; - r = ((glClearNamedBufferDataEXT = (PFNGLCLEARNAMEDBUFFERDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferDataEXT")) == NULL) || r; - r = ((glClearNamedBufferSubDataEXT = (PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferSubDataEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_clear_buffer_object */ - -#ifdef GL_ARB_clear_texture - -static GLboolean _glewInit_GL_ARB_clear_texture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glClearTexImage = (PFNGLCLEARTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glClearTexImage")) == NULL) || r; - r = ((glClearTexSubImage = (PFNGLCLEARTEXSUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glClearTexSubImage")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_clear_texture */ - -#ifdef GL_ARB_clip_control - -static GLboolean _glewInit_GL_ARB_clip_control (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glClipControl = (PFNGLCLIPCONTROLPROC)glewGetProcAddress((const GLubyte*)"glClipControl")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_clip_control */ - -#ifdef GL_ARB_color_buffer_float - -static GLboolean _glewInit_GL_ARB_color_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glClampColorARB = (PFNGLCLAMPCOLORARBPROC)glewGetProcAddress((const GLubyte*)"glClampColorARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_color_buffer_float */ - -#ifdef GL_ARB_compute_shader - -static GLboolean _glewInit_GL_ARB_compute_shader (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC)glewGetProcAddress((const GLubyte*)"glDispatchCompute")) == NULL) || r; - r = ((glDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDispatchComputeIndirect")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_compute_shader */ - -#ifdef GL_ARB_compute_variable_group_size - -static GLboolean _glewInit_GL_ARB_compute_variable_group_size (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDispatchComputeGroupSizeARB = (PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC)glewGetProcAddress((const GLubyte*)"glDispatchComputeGroupSizeARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_compute_variable_group_size */ - -#ifdef GL_ARB_copy_buffer - -static GLboolean _glewInit_GL_ARB_copy_buffer (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyBufferSubData")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_copy_buffer */ - -#ifdef GL_ARB_copy_image - -static GLboolean _glewInit_GL_ARB_copy_image (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubData")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_copy_image */ - -#ifdef GL_ARB_debug_output - -static GLboolean _glewInit_GL_ARB_debug_output (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDebugMessageCallbackARB = (PFNGLDEBUGMESSAGECALLBACKARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallbackARB")) == NULL) || r; - r = ((glDebugMessageControlARB = (PFNGLDEBUGMESSAGECONTROLARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageControlARB")) == NULL) || r; - r = ((glDebugMessageInsertARB = (PFNGLDEBUGMESSAGEINSERTARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsertARB")) == NULL) || r; - r = ((glGetDebugMessageLogARB = (PFNGLGETDEBUGMESSAGELOGARBPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLogARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_debug_output */ - -#ifdef GL_ARB_direct_state_access - -static GLboolean _glewInit_GL_ARB_direct_state_access (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindTextureUnit = (PFNGLBINDTEXTUREUNITPROC)glewGetProcAddress((const GLubyte*)"glBindTextureUnit")) == NULL) || r; - r = ((glBlitNamedFramebuffer = (PFNGLBLITNAMEDFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBlitNamedFramebuffer")) == NULL) || r; - r = ((glCheckNamedFramebufferStatus = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC)glewGetProcAddress((const GLubyte*)"glCheckNamedFramebufferStatus")) == NULL) || r; - r = ((glClearNamedBufferData = (PFNGLCLEARNAMEDBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferData")) == NULL) || r; - r = ((glClearNamedBufferSubData = (PFNGLCLEARNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferSubData")) == NULL) || r; - r = ((glClearNamedFramebufferfi = (PFNGLCLEARNAMEDFRAMEBUFFERFIPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferfi")) == NULL) || r; - r = ((glClearNamedFramebufferfv = (PFNGLCLEARNAMEDFRAMEBUFFERFVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferfv")) == NULL) || r; - r = ((glClearNamedFramebufferiv = (PFNGLCLEARNAMEDFRAMEBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferiv")) == NULL) || r; - r = ((glClearNamedFramebufferuiv = (PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferuiv")) == NULL) || r; - r = ((glCompressedTextureSubImage1D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage1D")) == NULL) || r; - r = ((glCompressedTextureSubImage2D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage2D")) == NULL) || r; - r = ((glCompressedTextureSubImage3D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage3D")) == NULL) || r; - r = ((glCopyNamedBufferSubData = (PFNGLCOPYNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyNamedBufferSubData")) == NULL) || r; - r = ((glCopyTextureSubImage1D = (PFNGLCOPYTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage1D")) == NULL) || r; - r = ((glCopyTextureSubImage2D = (PFNGLCOPYTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage2D")) == NULL) || r; - r = ((glCopyTextureSubImage3D = (PFNGLCOPYTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage3D")) == NULL) || r; - r = ((glCreateBuffers = (PFNGLCREATEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateBuffers")) == NULL) || r; - r = ((glCreateFramebuffers = (PFNGLCREATEFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateFramebuffers")) == NULL) || r; - r = ((glCreateProgramPipelines = (PFNGLCREATEPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glCreateProgramPipelines")) == NULL) || r; - r = ((glCreateQueries = (PFNGLCREATEQUERIESPROC)glewGetProcAddress((const GLubyte*)"glCreateQueries")) == NULL) || r; - r = ((glCreateRenderbuffers = (PFNGLCREATERENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateRenderbuffers")) == NULL) || r; - r = ((glCreateSamplers = (PFNGLCREATESAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glCreateSamplers")) == NULL) || r; - r = ((glCreateTextures = (PFNGLCREATETEXTURESPROC)glewGetProcAddress((const GLubyte*)"glCreateTextures")) == NULL) || r; - r = ((glCreateTransformFeedbacks = (PFNGLCREATETRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glCreateTransformFeedbacks")) == NULL) || r; - r = ((glCreateVertexArrays = (PFNGLCREATEVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glCreateVertexArrays")) == NULL) || r; - r = ((glDisableVertexArrayAttrib = (PFNGLDISABLEVERTEXARRAYATTRIBPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayAttrib")) == NULL) || r; - r = ((glEnableVertexArrayAttrib = (PFNGLENABLEVERTEXARRAYATTRIBPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayAttrib")) == NULL) || r; - r = ((glFlushMappedNamedBufferRange = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedNamedBufferRange")) == NULL) || r; - r = ((glGenerateTextureMipmap = (PFNGLGENERATETEXTUREMIPMAPPROC)glewGetProcAddress((const GLubyte*)"glGenerateTextureMipmap")) == NULL) || r; - r = ((glGetCompressedTextureImage = (PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureImage")) == NULL) || r; - r = ((glGetNamedBufferParameteri64v = (PFNGLGETNAMEDBUFFERPARAMETERI64VPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameteri64v")) == NULL) || r; - r = ((glGetNamedBufferParameteriv = (PFNGLGETNAMEDBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameteriv")) == NULL) || r; - r = ((glGetNamedBufferPointerv = (PFNGLGETNAMEDBUFFERPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferPointerv")) == NULL) || r; - r = ((glGetNamedBufferSubData = (PFNGLGETNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferSubData")) == NULL) || r; - r = ((glGetNamedFramebufferAttachmentParameteriv = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferAttachmentParameteriv")) == NULL) || r; - r = ((glGetNamedFramebufferParameteriv = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferParameteriv")) == NULL) || r; - r = ((glGetNamedRenderbufferParameteriv = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedRenderbufferParameteriv")) == NULL) || r; - r = ((glGetQueryBufferObjecti64v = (PFNGLGETQUERYBUFFEROBJECTI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjecti64v")) == NULL) || r; - r = ((glGetQueryBufferObjectiv = (PFNGLGETQUERYBUFFEROBJECTIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectiv")) == NULL) || r; - r = ((glGetQueryBufferObjectui64v = (PFNGLGETQUERYBUFFEROBJECTUI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectui64v")) == NULL) || r; - r = ((glGetQueryBufferObjectuiv = (PFNGLGETQUERYBUFFEROBJECTUIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectuiv")) == NULL) || r; - r = ((glGetTextureImage = (PFNGLGETTEXTUREIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetTextureImage")) == NULL) || r; - r = ((glGetTextureLevelParameterfv = (PFNGLGETTEXTURELEVELPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterfv")) == NULL) || r; - r = ((glGetTextureLevelParameteriv = (PFNGLGETTEXTURELEVELPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameteriv")) == NULL) || r; - r = ((glGetTextureParameterIiv = (PFNGLGETTEXTUREPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIiv")) == NULL) || r; - r = ((glGetTextureParameterIuiv = (PFNGLGETTEXTUREPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIuiv")) == NULL) || r; - r = ((glGetTextureParameterfv = (PFNGLGETTEXTUREPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterfv")) == NULL) || r; - r = ((glGetTextureParameteriv = (PFNGLGETTEXTUREPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameteriv")) == NULL) || r; - r = ((glGetTransformFeedbacki64_v = (PFNGLGETTRANSFORMFEEDBACKI64_VPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbacki64_v")) == NULL) || r; - r = ((glGetTransformFeedbacki_v = (PFNGLGETTRANSFORMFEEDBACKI_VPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbacki_v")) == NULL) || r; - r = ((glGetTransformFeedbackiv = (PFNGLGETTRANSFORMFEEDBACKIVPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackiv")) == NULL) || r; - r = ((glGetVertexArrayIndexed64iv = (PFNGLGETVERTEXARRAYINDEXED64IVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIndexed64iv")) == NULL) || r; - r = ((glGetVertexArrayIndexediv = (PFNGLGETVERTEXARRAYINDEXEDIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIndexediv")) == NULL) || r; - r = ((glGetVertexArrayiv = (PFNGLGETVERTEXARRAYIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayiv")) == NULL) || r; - r = ((glInvalidateNamedFramebufferData = (PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateNamedFramebufferData")) == NULL) || r; - r = ((glInvalidateNamedFramebufferSubData = (PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateNamedFramebufferSubData")) == NULL) || r; - r = ((glMapNamedBuffer = (PFNGLMAPNAMEDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBuffer")) == NULL) || r; - r = ((glMapNamedBufferRange = (PFNGLMAPNAMEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferRange")) == NULL) || r; - r = ((glNamedBufferData = (PFNGLNAMEDBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferData")) == NULL) || r; - r = ((glNamedBufferStorage = (PFNGLNAMEDBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorage")) == NULL) || r; - r = ((glNamedBufferSubData = (PFNGLNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferSubData")) == NULL) || r; - r = ((glNamedFramebufferDrawBuffer = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferDrawBuffer")) == NULL) || r; - r = ((glNamedFramebufferDrawBuffers = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferDrawBuffers")) == NULL) || r; - r = ((glNamedFramebufferParameteri = (PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferParameteri")) == NULL) || r; - r = ((glNamedFramebufferReadBuffer = (PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferReadBuffer")) == NULL) || r; - r = ((glNamedFramebufferRenderbuffer = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferRenderbuffer")) == NULL) || r; - r = ((glNamedFramebufferTexture = (PFNGLNAMEDFRAMEBUFFERTEXTUREPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture")) == NULL) || r; - r = ((glNamedFramebufferTextureLayer = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureLayer")) == NULL) || r; - r = ((glNamedRenderbufferStorage = (PFNGLNAMEDRENDERBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorage")) == NULL) || r; - r = ((glNamedRenderbufferStorageMultisample = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisample")) == NULL) || r; - r = ((glTextureBuffer = (PFNGLTEXTUREBUFFERPROC)glewGetProcAddress((const GLubyte*)"glTextureBuffer")) == NULL) || r; - r = ((glTextureBufferRange = (PFNGLTEXTUREBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferRange")) == NULL) || r; - r = ((glTextureParameterIiv = (PFNGLTEXTUREPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIiv")) == NULL) || r; - r = ((glTextureParameterIuiv = (PFNGLTEXTUREPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIuiv")) == NULL) || r; - r = ((glTextureParameterf = (PFNGLTEXTUREPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterf")) == NULL) || r; - r = ((glTextureParameterfv = (PFNGLTEXTUREPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfv")) == NULL) || r; - r = ((glTextureParameteri = (PFNGLTEXTUREPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteri")) == NULL) || r; - r = ((glTextureParameteriv = (PFNGLTEXTUREPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteriv")) == NULL) || r; - r = ((glTextureStorage1D = (PFNGLTEXTURESTORAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage1D")) == NULL) || r; - r = ((glTextureStorage2D = (PFNGLTEXTURESTORAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2D")) == NULL) || r; - r = ((glTextureStorage2DMultisample = (PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DMultisample")) == NULL) || r; - r = ((glTextureStorage3D = (PFNGLTEXTURESTORAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3D")) == NULL) || r; - r = ((glTextureStorage3DMultisample = (PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DMultisample")) == NULL) || r; - r = ((glTextureSubImage1D = (PFNGLTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage1D")) == NULL) || r; - r = ((glTextureSubImage2D = (PFNGLTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage2D")) == NULL) || r; - r = ((glTextureSubImage3D = (PFNGLTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage3D")) == NULL) || r; - r = ((glTransformFeedbackBufferBase = (PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackBufferBase")) == NULL) || r; - r = ((glTransformFeedbackBufferRange = (PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackBufferRange")) == NULL) || r; - r = ((glUnmapNamedBuffer = (PFNGLUNMAPNAMEDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glUnmapNamedBuffer")) == NULL) || r; - r = ((glVertexArrayAttribBinding = (PFNGLVERTEXARRAYATTRIBBINDINGPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribBinding")) == NULL) || r; - r = ((glVertexArrayAttribFormat = (PFNGLVERTEXARRAYATTRIBFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribFormat")) == NULL) || r; - r = ((glVertexArrayAttribIFormat = (PFNGLVERTEXARRAYATTRIBIFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribIFormat")) == NULL) || r; - r = ((glVertexArrayAttribLFormat = (PFNGLVERTEXARRAYATTRIBLFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribLFormat")) == NULL) || r; - r = ((glVertexArrayBindingDivisor = (PFNGLVERTEXARRAYBINDINGDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayBindingDivisor")) == NULL) || r; - r = ((glVertexArrayElementBuffer = (PFNGLVERTEXARRAYELEMENTBUFFERPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayElementBuffer")) == NULL) || r; - r = ((glVertexArrayVertexBuffer = (PFNGLVERTEXARRAYVERTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBuffer")) == NULL) || r; - r = ((glVertexArrayVertexBuffers = (PFNGLVERTEXARRAYVERTEXBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBuffers")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_direct_state_access */ - -#ifdef GL_ARB_draw_buffers - -static GLboolean _glewInit_GL_ARB_draw_buffers (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDrawBuffersARB = (PFNGLDRAWBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_draw_buffers */ - -#ifdef GL_ARB_draw_buffers_blend - -static GLboolean _glewInit_GL_ARB_draw_buffers_blend (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquationSeparateiARB = (PFNGLBLENDEQUATIONSEPARATEIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateiARB")) == NULL) || r; - r = ((glBlendEquationiARB = (PFNGLBLENDEQUATIONIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationiARB")) == NULL) || r; - r = ((glBlendFuncSeparateiARB = (PFNGLBLENDFUNCSEPARATEIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateiARB")) == NULL) || r; - r = ((glBlendFunciARB = (PFNGLBLENDFUNCIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendFunciARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_draw_buffers_blend */ - -#ifdef GL_ARB_draw_elements_base_vertex - -static GLboolean _glewInit_GL_ARB_draw_elements_base_vertex (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsBaseVertex")) == NULL) || r; - r = ((glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertex")) == NULL) || r; - r = ((glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsBaseVertex")) == NULL) || r; - r = ((glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsBaseVertex")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_draw_elements_base_vertex */ - -#ifdef GL_ARB_draw_indirect - -static GLboolean _glewInit_GL_ARB_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysIndirect")) == NULL) || r; - r = ((glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsIndirect")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_draw_indirect */ - -#ifdef GL_ARB_framebuffer_no_attachments - -static GLboolean _glewInit_GL_ARB_framebuffer_no_attachments (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glFramebufferParameteri")) == NULL) || r; - r = ((glGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameteriv")) == NULL) || r; - r = ((glGetNamedFramebufferParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferParameterivEXT")) == NULL) || r; - r = ((glNamedFramebufferParameteriEXT = (PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferParameteriEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_framebuffer_no_attachments */ - -#ifdef GL_ARB_framebuffer_object - -static GLboolean _glewInit_GL_ARB_framebuffer_object (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindFramebuffer")) == NULL) || r; - r = ((glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindRenderbuffer")) == NULL) || r; - r = ((glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebuffer")) == NULL) || r; - r = ((glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)glewGetProcAddress((const GLubyte*)"glCheckFramebufferStatus")) == NULL) || r; - r = ((glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffers")) == NULL) || r; - r = ((glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffers")) == NULL) || r; - r = ((glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbuffer")) == NULL) || r; - r = ((glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture1D")) == NULL) || r; - r = ((glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2D")) == NULL) || r; - r = ((glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3D")) == NULL) || r; - r = ((glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayer")) == NULL) || r; - r = ((glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenFramebuffers")) == NULL) || r; - r = ((glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenRenderbuffers")) == NULL) || r; - r = ((glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)glewGetProcAddress((const GLubyte*)"glGenerateMipmap")) == NULL) || r; - r = ((glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferAttachmentParameteriv")) == NULL) || r; - r = ((glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetRenderbufferParameteriv")) == NULL) || r; - r = ((glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsFramebuffer")) == NULL) || r; - r = ((glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsRenderbuffer")) == NULL) || r; - r = ((glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorage")) == NULL) || r; - r = ((glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisample")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_framebuffer_object */ - -#ifdef GL_ARB_geometry_shader4 - -static GLboolean _glewInit_GL_ARB_geometry_shader4 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureARB")) == NULL) || r; - r = ((glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureFaceARB")) == NULL) || r; - r = ((glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerARB")) == NULL) || r; - r = ((glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteriARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_geometry_shader4 */ - -#ifdef GL_ARB_get_program_binary - -static GLboolean _glewInit_GL_ARB_get_program_binary (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC)glewGetProcAddress((const GLubyte*)"glGetProgramBinary")) == NULL) || r; - r = ((glProgramBinary = (PFNGLPROGRAMBINARYPROC)glewGetProcAddress((const GLubyte*)"glProgramBinary")) == NULL) || r; - r = ((glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteri")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_get_program_binary */ - -#ifdef GL_ARB_get_texture_sub_image - -static GLboolean _glewInit_GL_ARB_get_texture_sub_image (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetCompressedTextureSubImage = (PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureSubImage")) == NULL) || r; - r = ((glGetTextureSubImage = (PFNGLGETTEXTURESUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSubImage")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_get_texture_sub_image */ - -#ifdef GL_ARB_gpu_shader_fp64 - -static GLboolean _glewInit_GL_ARB_gpu_shader_fp64 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetUniformdv = (PFNGLGETUNIFORMDVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformdv")) == NULL) || r; - r = ((glUniform1d = (PFNGLUNIFORM1DPROC)glewGetProcAddress((const GLubyte*)"glUniform1d")) == NULL) || r; - r = ((glUniform1dv = (PFNGLUNIFORM1DVPROC)glewGetProcAddress((const GLubyte*)"glUniform1dv")) == NULL) || r; - r = ((glUniform2d = (PFNGLUNIFORM2DPROC)glewGetProcAddress((const GLubyte*)"glUniform2d")) == NULL) || r; - r = ((glUniform2dv = (PFNGLUNIFORM2DVPROC)glewGetProcAddress((const GLubyte*)"glUniform2dv")) == NULL) || r; - r = ((glUniform3d = (PFNGLUNIFORM3DPROC)glewGetProcAddress((const GLubyte*)"glUniform3d")) == NULL) || r; - r = ((glUniform3dv = (PFNGLUNIFORM3DVPROC)glewGetProcAddress((const GLubyte*)"glUniform3dv")) == NULL) || r; - r = ((glUniform4d = (PFNGLUNIFORM4DPROC)glewGetProcAddress((const GLubyte*)"glUniform4d")) == NULL) || r; - r = ((glUniform4dv = (PFNGLUNIFORM4DVPROC)glewGetProcAddress((const GLubyte*)"glUniform4dv")) == NULL) || r; - r = ((glUniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2dv")) == NULL) || r; - r = ((glUniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3dv")) == NULL) || r; - r = ((glUniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4dv")) == NULL) || r; - r = ((glUniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3dv")) == NULL) || r; - r = ((glUniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2dv")) == NULL) || r; - r = ((glUniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4dv")) == NULL) || r; - r = ((glUniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4dv")) == NULL) || r; - r = ((glUniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2dv")) == NULL) || r; - r = ((glUniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3dv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_gpu_shader_fp64 */ - -#ifdef GL_ARB_gpu_shader_int64 - -static GLboolean _glewInit_GL_ARB_gpu_shader_int64 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetUniformi64vARB = (PFNGLGETUNIFORMI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformi64vARB")) == NULL) || r; - r = ((glGetUniformui64vARB = (PFNGLGETUNIFORMUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformui64vARB")) == NULL) || r; - r = ((glGetnUniformi64vARB = (PFNGLGETNUNIFORMI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformi64vARB")) == NULL) || r; - r = ((glGetnUniformui64vARB = (PFNGLGETNUNIFORMUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformui64vARB")) == NULL) || r; - r = ((glProgramUniform1i64ARB = (PFNGLPROGRAMUNIFORM1I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64ARB")) == NULL) || r; - r = ((glProgramUniform1i64vARB = (PFNGLPROGRAMUNIFORM1I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64vARB")) == NULL) || r; - r = ((glProgramUniform1ui64ARB = (PFNGLPROGRAMUNIFORM1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64ARB")) == NULL) || r; - r = ((glProgramUniform1ui64vARB = (PFNGLPROGRAMUNIFORM1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64vARB")) == NULL) || r; - r = ((glProgramUniform2i64ARB = (PFNGLPROGRAMUNIFORM2I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64ARB")) == NULL) || r; - r = ((glProgramUniform2i64vARB = (PFNGLPROGRAMUNIFORM2I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64vARB")) == NULL) || r; - r = ((glProgramUniform2ui64ARB = (PFNGLPROGRAMUNIFORM2UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64ARB")) == NULL) || r; - r = ((glProgramUniform2ui64vARB = (PFNGLPROGRAMUNIFORM2UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64vARB")) == NULL) || r; - r = ((glProgramUniform3i64ARB = (PFNGLPROGRAMUNIFORM3I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64ARB")) == NULL) || r; - r = ((glProgramUniform3i64vARB = (PFNGLPROGRAMUNIFORM3I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64vARB")) == NULL) || r; - r = ((glProgramUniform3ui64ARB = (PFNGLPROGRAMUNIFORM3UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64ARB")) == NULL) || r; - r = ((glProgramUniform3ui64vARB = (PFNGLPROGRAMUNIFORM3UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64vARB")) == NULL) || r; - r = ((glProgramUniform4i64ARB = (PFNGLPROGRAMUNIFORM4I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64ARB")) == NULL) || r; - r = ((glProgramUniform4i64vARB = (PFNGLPROGRAMUNIFORM4I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64vARB")) == NULL) || r; - r = ((glProgramUniform4ui64ARB = (PFNGLPROGRAMUNIFORM4UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64ARB")) == NULL) || r; - r = ((glProgramUniform4ui64vARB = (PFNGLPROGRAMUNIFORM4UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64vARB")) == NULL) || r; - r = ((glUniform1i64ARB = (PFNGLUNIFORM1I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64ARB")) == NULL) || r; - r = ((glUniform1i64vARB = (PFNGLUNIFORM1I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64vARB")) == NULL) || r; - r = ((glUniform1ui64ARB = (PFNGLUNIFORM1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64ARB")) == NULL) || r; - r = ((glUniform1ui64vARB = (PFNGLUNIFORM1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64vARB")) == NULL) || r; - r = ((glUniform2i64ARB = (PFNGLUNIFORM2I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64ARB")) == NULL) || r; - r = ((glUniform2i64vARB = (PFNGLUNIFORM2I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64vARB")) == NULL) || r; - r = ((glUniform2ui64ARB = (PFNGLUNIFORM2UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64ARB")) == NULL) || r; - r = ((glUniform2ui64vARB = (PFNGLUNIFORM2UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64vARB")) == NULL) || r; - r = ((glUniform3i64ARB = (PFNGLUNIFORM3I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64ARB")) == NULL) || r; - r = ((glUniform3i64vARB = (PFNGLUNIFORM3I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64vARB")) == NULL) || r; - r = ((glUniform3ui64ARB = (PFNGLUNIFORM3UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64ARB")) == NULL) || r; - r = ((glUniform3ui64vARB = (PFNGLUNIFORM3UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64vARB")) == NULL) || r; - r = ((glUniform4i64ARB = (PFNGLUNIFORM4I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64ARB")) == NULL) || r; - r = ((glUniform4i64vARB = (PFNGLUNIFORM4I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64vARB")) == NULL) || r; - r = ((glUniform4ui64ARB = (PFNGLUNIFORM4UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64ARB")) == NULL) || r; - r = ((glUniform4ui64vARB = (PFNGLUNIFORM4UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64vARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_gpu_shader_int64 */ - -#ifdef GL_ARB_imaging - -static GLboolean _glewInit_GL_ARB_imaging (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)"glBlendEquation")) == NULL) || r; - r = ((glColorSubTable = (PFNGLCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)"glColorSubTable")) == NULL) || r; - r = ((glColorTable = (PFNGLCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glColorTable")) == NULL) || r; - r = ((glColorTableParameterfv = (PFNGLCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterfv")) == NULL) || r; - r = ((glColorTableParameteriv = (PFNGLCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameteriv")) == NULL) || r; - r = ((glConvolutionFilter1D = (PFNGLCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter1D")) == NULL) || r; - r = ((glConvolutionFilter2D = (PFNGLCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter2D")) == NULL) || r; - r = ((glConvolutionParameterf = (PFNGLCONVOLUTIONPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterf")) == NULL) || r; - r = ((glConvolutionParameterfv = (PFNGLCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfv")) == NULL) || r; - r = ((glConvolutionParameteri = (PFNGLCONVOLUTIONPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteri")) == NULL) || r; - r = ((glConvolutionParameteriv = (PFNGLCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteriv")) == NULL) || r; - r = ((glCopyColorSubTable = (PFNGLCOPYCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)"glCopyColorSubTable")) == NULL) || r; - r = ((glCopyColorTable = (PFNGLCOPYCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glCopyColorTable")) == NULL) || r; - r = ((glCopyConvolutionFilter1D = (PFNGLCOPYCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter1D")) == NULL) || r; - r = ((glCopyConvolutionFilter2D = (PFNGLCOPYCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter2D")) == NULL) || r; - r = ((glGetColorTable = (PFNGLGETCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glGetColorTable")) == NULL) || r; - r = ((glGetColorTableParameterfv = (PFNGLGETCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfv")) == NULL) || r; - r = ((glGetColorTableParameteriv = (PFNGLGETCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameteriv")) == NULL) || r; - r = ((glGetConvolutionFilter = (PFNGLGETCONVOLUTIONFILTERPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionFilter")) == NULL) || r; - r = ((glGetConvolutionParameterfv = (PFNGLGETCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterfv")) == NULL) || r; - r = ((glGetConvolutionParameteriv = (PFNGLGETCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameteriv")) == NULL) || r; - r = ((glGetHistogram = (PFNGLGETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glGetHistogram")) == NULL) || r; - r = ((glGetHistogramParameterfv = (PFNGLGETHISTOGRAMPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterfv")) == NULL) || r; - r = ((glGetHistogramParameteriv = (PFNGLGETHISTOGRAMPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameteriv")) == NULL) || r; - r = ((glGetMinmax = (PFNGLGETMINMAXPROC)glewGetProcAddress((const GLubyte*)"glGetMinmax")) == NULL) || r; - r = ((glGetMinmaxParameterfv = (PFNGLGETMINMAXPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterfv")) == NULL) || r; - r = ((glGetMinmaxParameteriv = (PFNGLGETMINMAXPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameteriv")) == NULL) || r; - r = ((glGetSeparableFilter = (PFNGLGETSEPARABLEFILTERPROC)glewGetProcAddress((const GLubyte*)"glGetSeparableFilter")) == NULL) || r; - r = ((glHistogram = (PFNGLHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glHistogram")) == NULL) || r; - r = ((glMinmax = (PFNGLMINMAXPROC)glewGetProcAddress((const GLubyte*)"glMinmax")) == NULL) || r; - r = ((glResetHistogram = (PFNGLRESETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glResetHistogram")) == NULL) || r; - r = ((glResetMinmax = (PFNGLRESETMINMAXPROC)glewGetProcAddress((const GLubyte*)"glResetMinmax")) == NULL) || r; - r = ((glSeparableFilter2D = (PFNGLSEPARABLEFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glSeparableFilter2D")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_imaging */ - -#ifdef GL_ARB_indirect_parameters - -static GLboolean _glewInit_GL_ARB_indirect_parameters (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glMultiDrawArraysIndirectCountARB = (PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectCountARB")) == NULL) || r; - r = ((glMultiDrawElementsIndirectCountARB = (PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectCountARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_indirect_parameters */ - -#ifdef GL_ARB_instanced_arrays - -static GLboolean _glewInit_GL_ARB_instanced_arrays (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDrawArraysInstancedARB = (PFNGLDRAWARRAYSINSTANCEDARBPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedARB")) == NULL) || r; - r = ((glDrawElementsInstancedARB = (PFNGLDRAWELEMENTSINSTANCEDARBPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedARB")) == NULL) || r; - r = ((glVertexAttribDivisorARB = (PFNGLVERTEXATTRIBDIVISORARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_instanced_arrays */ - -#ifdef GL_ARB_internalformat_query - -static GLboolean _glewInit_GL_ARB_internalformat_query (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformativ")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_internalformat_query */ - -#ifdef GL_ARB_internalformat_query2 - -static GLboolean _glewInit_GL_ARB_internalformat_query2 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetInternalformati64v = (PFNGLGETINTERNALFORMATI64VPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformati64v")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_internalformat_query2 */ - -#ifdef GL_ARB_invalidate_subdata - -static GLboolean _glewInit_GL_ARB_invalidate_subdata (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glInvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateBufferData")) == NULL) || r; - r = ((glInvalidateBufferSubData = (PFNGLINVALIDATEBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateBufferSubData")) == NULL) || r; - r = ((glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glInvalidateFramebuffer")) == NULL) || r; - r = ((glInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glInvalidateSubFramebuffer")) == NULL) || r; - r = ((glInvalidateTexImage = (PFNGLINVALIDATETEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glInvalidateTexImage")) == NULL) || r; - r = ((glInvalidateTexSubImage = (PFNGLINVALIDATETEXSUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glInvalidateTexSubImage")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_invalidate_subdata */ - -#ifdef GL_ARB_map_buffer_range - -static GLboolean _glewInit_GL_ARB_map_buffer_range (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedBufferRange")) == NULL) || r; - r = ((glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glMapBufferRange")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_map_buffer_range */ - -#ifdef GL_ARB_matrix_palette - -static GLboolean _glewInit_GL_ARB_matrix_palette (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glCurrentPaletteMatrixARB = (PFNGLCURRENTPALETTEMATRIXARBPROC)glewGetProcAddress((const GLubyte*)"glCurrentPaletteMatrixARB")) == NULL) || r; - r = ((glMatrixIndexPointerARB = (PFNGLMATRIXINDEXPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexPointerARB")) == NULL) || r; - r = ((glMatrixIndexubvARB = (PFNGLMATRIXINDEXUBVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexubvARB")) == NULL) || r; - r = ((glMatrixIndexuivARB = (PFNGLMATRIXINDEXUIVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexuivARB")) == NULL) || r; - r = ((glMatrixIndexusvARB = (PFNGLMATRIXINDEXUSVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexusvARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_matrix_palette */ - -#ifdef GL_ARB_multi_bind - -static GLboolean _glewInit_GL_ARB_multi_bind (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindBuffersBase = (PFNGLBINDBUFFERSBASEPROC)glewGetProcAddress((const GLubyte*)"glBindBuffersBase")) == NULL) || r; - r = ((glBindBuffersRange = (PFNGLBINDBUFFERSRANGEPROC)glewGetProcAddress((const GLubyte*)"glBindBuffersRange")) == NULL) || r; - r = ((glBindImageTextures = (PFNGLBINDIMAGETEXTURESPROC)glewGetProcAddress((const GLubyte*)"glBindImageTextures")) == NULL) || r; - r = ((glBindSamplers = (PFNGLBINDSAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glBindSamplers")) == NULL) || r; - r = ((glBindTextures = (PFNGLBINDTEXTURESPROC)glewGetProcAddress((const GLubyte*)"glBindTextures")) == NULL) || r; - r = ((glBindVertexBuffers = (PFNGLBINDVERTEXBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glBindVertexBuffers")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_multi_bind */ - -#ifdef GL_ARB_multi_draw_indirect - -static GLboolean _glewInit_GL_ARB_multi_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glMultiDrawArraysIndirect = (PFNGLMULTIDRAWARRAYSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirect")) == NULL) || r; - r = ((glMultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirect")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_multi_draw_indirect */ - -#ifdef GL_ARB_multisample - -static GLboolean _glewInit_GL_ARB_multisample (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glSampleCoverageARB = (PFNGLSAMPLECOVERAGEARBPROC)glewGetProcAddress((const GLubyte*)"glSampleCoverageARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_multisample */ - -#ifdef GL_ARB_multitexture - -static GLboolean _glewInit_GL_ARB_multitexture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glActiveTextureARB")) == NULL) || r; - r = ((glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glClientActiveTextureARB")) == NULL) || r; - r = ((glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dARB")) == NULL) || r; - r = ((glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dvARB")) == NULL) || r; - r = ((glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fARB")) == NULL) || r; - r = ((glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fvARB")) == NULL) || r; - r = ((glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1iARB")) == NULL) || r; - r = ((glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1ivARB")) == NULL) || r; - r = ((glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1sARB")) == NULL) || r; - r = ((glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1svARB")) == NULL) || r; - r = ((glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dARB")) == NULL) || r; - r = ((glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dvARB")) == NULL) || r; - r = ((glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fARB")) == NULL) || r; - r = ((glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fvARB")) == NULL) || r; - r = ((glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2iARB")) == NULL) || r; - r = ((glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2ivARB")) == NULL) || r; - r = ((glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2sARB")) == NULL) || r; - r = ((glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2svARB")) == NULL) || r; - r = ((glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dARB")) == NULL) || r; - r = ((glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dvARB")) == NULL) || r; - r = ((glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fARB")) == NULL) || r; - r = ((glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fvARB")) == NULL) || r; - r = ((glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3iARB")) == NULL) || r; - r = ((glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3ivARB")) == NULL) || r; - r = ((glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3sARB")) == NULL) || r; - r = ((glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3svARB")) == NULL) || r; - r = ((glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dARB")) == NULL) || r; - r = ((glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dvARB")) == NULL) || r; - r = ((glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fARB")) == NULL) || r; - r = ((glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fvARB")) == NULL) || r; - r = ((glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4iARB")) == NULL) || r; - r = ((glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4ivARB")) == NULL) || r; - r = ((glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4sARB")) == NULL) || r; - r = ((glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4svARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_multitexture */ - -#ifdef GL_ARB_occlusion_query - -static GLboolean _glewInit_GL_ARB_occlusion_query (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBeginQueryARB = (PFNGLBEGINQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryARB")) == NULL) || r; - r = ((glDeleteQueriesARB = (PFNGLDELETEQUERIESARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueriesARB")) == NULL) || r; - r = ((glEndQueryARB = (PFNGLENDQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glEndQueryARB")) == NULL) || r; - r = ((glGenQueriesARB = (PFNGLGENQUERIESARBPROC)glewGetProcAddress((const GLubyte*)"glGenQueriesARB")) == NULL) || r; - r = ((glGetQueryObjectivARB = (PFNGLGETQUERYOBJECTIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectivARB")) == NULL) || r; - r = ((glGetQueryObjectuivARB = (PFNGLGETQUERYOBJECTUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuivARB")) == NULL) || r; - r = ((glGetQueryivARB = (PFNGLGETQUERYIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryivARB")) == NULL) || r; - r = ((glIsQueryARB = (PFNGLISQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glIsQueryARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_occlusion_query */ - -#ifdef GL_ARB_parallel_shader_compile - -static GLboolean _glewInit_GL_ARB_parallel_shader_compile (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glMaxShaderCompilerThreadsARB = (PFNGLMAXSHADERCOMPILERTHREADSARBPROC)glewGetProcAddress((const GLubyte*)"glMaxShaderCompilerThreadsARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_parallel_shader_compile */ - -#ifdef GL_ARB_point_parameters - -static GLboolean _glewInit_GL_ARB_point_parameters (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfARB")) == NULL) || r; - r = ((glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfvARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_point_parameters */ - -#ifdef GL_ARB_program_interface_query - -static GLboolean _glewInit_GL_ARB_program_interface_query (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramInterfaceiv")) == NULL) || r; - r = ((glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceIndex")) == NULL) || r; - r = ((glGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceLocation")) == NULL) || r; - r = ((glGetProgramResourceLocationIndex = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceLocationIndex")) == NULL) || r; - r = ((glGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceName")) == NULL) || r; - r = ((glGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceiv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_program_interface_query */ - -#ifdef GL_ARB_provoking_vertex - -static GLboolean _glewInit_GL_ARB_provoking_vertex (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC)glewGetProcAddress((const GLubyte*)"glProvokingVertex")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_provoking_vertex */ - -#ifdef GL_ARB_robustness - -static GLboolean _glewInit_GL_ARB_robustness (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetGraphicsResetStatusARB = (PFNGLGETGRAPHICSRESETSTATUSARBPROC)glewGetProcAddress((const GLubyte*)"glGetGraphicsResetStatusARB")) == NULL) || r; - r = ((glGetnColorTableARB = (PFNGLGETNCOLORTABLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnColorTableARB")) == NULL) || r; - r = ((glGetnCompressedTexImageARB = (PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnCompressedTexImageARB")) == NULL) || r; - r = ((glGetnConvolutionFilterARB = (PFNGLGETNCONVOLUTIONFILTERARBPROC)glewGetProcAddress((const GLubyte*)"glGetnConvolutionFilterARB")) == NULL) || r; - r = ((glGetnHistogramARB = (PFNGLGETNHISTOGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glGetnHistogramARB")) == NULL) || r; - r = ((glGetnMapdvARB = (PFNGLGETNMAPDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapdvARB")) == NULL) || r; - r = ((glGetnMapfvARB = (PFNGLGETNMAPFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapfvARB")) == NULL) || r; - r = ((glGetnMapivARB = (PFNGLGETNMAPIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapivARB")) == NULL) || r; - r = ((glGetnMinmaxARB = (PFNGLGETNMINMAXARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMinmaxARB")) == NULL) || r; - r = ((glGetnPixelMapfvARB = (PFNGLGETNPIXELMAPFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapfvARB")) == NULL) || r; - r = ((glGetnPixelMapuivARB = (PFNGLGETNPIXELMAPUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapuivARB")) == NULL) || r; - r = ((glGetnPixelMapusvARB = (PFNGLGETNPIXELMAPUSVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapusvARB")) == NULL) || r; - r = ((glGetnPolygonStippleARB = (PFNGLGETNPOLYGONSTIPPLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPolygonStippleARB")) == NULL) || r; - r = ((glGetnSeparableFilterARB = (PFNGLGETNSEPARABLEFILTERARBPROC)glewGetProcAddress((const GLubyte*)"glGetnSeparableFilterARB")) == NULL) || r; - r = ((glGetnTexImageARB = (PFNGLGETNTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnTexImageARB")) == NULL) || r; - r = ((glGetnUniformdvARB = (PFNGLGETNUNIFORMDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformdvARB")) == NULL) || r; - r = ((glGetnUniformfvARB = (PFNGLGETNUNIFORMFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformfvARB")) == NULL) || r; - r = ((glGetnUniformivARB = (PFNGLGETNUNIFORMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformivARB")) == NULL) || r; - r = ((glGetnUniformuivARB = (PFNGLGETNUNIFORMUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformuivARB")) == NULL) || r; - r = ((glReadnPixelsARB = (PFNGLREADNPIXELSARBPROC)glewGetProcAddress((const GLubyte*)"glReadnPixelsARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_robustness */ - -#ifdef GL_ARB_sample_locations - -static GLboolean _glewInit_GL_ARB_sample_locations (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferSampleLocationsfvARB = (PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferSampleLocationsfvARB")) == NULL) || r; - r = ((glNamedFramebufferSampleLocationsfvARB = (PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferSampleLocationsfvARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_sample_locations */ - -#ifdef GL_ARB_sample_shading - -static GLboolean _glewInit_GL_ARB_sample_shading (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glMinSampleShadingARB = (PFNGLMINSAMPLESHADINGARBPROC)glewGetProcAddress((const GLubyte*)"glMinSampleShadingARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_sample_shading */ - -#ifdef GL_ARB_sampler_objects - -static GLboolean _glewInit_GL_ARB_sampler_objects (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindSampler = (PFNGLBINDSAMPLERPROC)glewGetProcAddress((const GLubyte*)"glBindSampler")) == NULL) || r; - r = ((glDeleteSamplers = (PFNGLDELETESAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteSamplers")) == NULL) || r; - r = ((glGenSamplers = (PFNGLGENSAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glGenSamplers")) == NULL) || r; - r = ((glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIiv")) == NULL) || r; - r = ((glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIuiv")) == NULL) || r; - r = ((glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterfv")) == NULL) || r; - r = ((glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameteriv")) == NULL) || r; - r = ((glIsSampler = (PFNGLISSAMPLERPROC)glewGetProcAddress((const GLubyte*)"glIsSampler")) == NULL) || r; - r = ((glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIiv")) == NULL) || r; - r = ((glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIuiv")) == NULL) || r; - r = ((glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterf")) == NULL) || r; - r = ((glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterfv")) == NULL) || r; - r = ((glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameteri")) == NULL) || r; - r = ((glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameteriv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_sampler_objects */ - -#ifdef GL_ARB_separate_shader_objects - -static GLboolean _glewInit_GL_ARB_separate_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glActiveShaderProgram")) == NULL) || r; - r = ((glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glBindProgramPipeline")) == NULL) || r; - r = ((glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderProgramv")) == NULL) || r; - r = ((glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramPipelines")) == NULL) || r; - r = ((glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glGenProgramPipelines")) == NULL) || r; - r = ((glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetProgramPipelineInfoLog")) == NULL) || r; - r = ((glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramPipelineiv")) == NULL) || r; - r = ((glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glIsProgramPipeline")) == NULL) || r; - r = ((glProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1d")) == NULL) || r; - r = ((glProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1dv")) == NULL) || r; - r = ((glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1f")) == NULL) || r; - r = ((glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fv")) == NULL) || r; - r = ((glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i")) == NULL) || r; - r = ((glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1iv")) == NULL) || r; - r = ((glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui")) == NULL) || r; - r = ((glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uiv")) == NULL) || r; - r = ((glProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2d")) == NULL) || r; - r = ((glProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2dv")) == NULL) || r; - r = ((glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2f")) == NULL) || r; - r = ((glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fv")) == NULL) || r; - r = ((glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i")) == NULL) || r; - r = ((glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2iv")) == NULL) || r; - r = ((glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui")) == NULL) || r; - r = ((glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uiv")) == NULL) || r; - r = ((glProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3d")) == NULL) || r; - r = ((glProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3dv")) == NULL) || r; - r = ((glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3f")) == NULL) || r; - r = ((glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fv")) == NULL) || r; - r = ((glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i")) == NULL) || r; - r = ((glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3iv")) == NULL) || r; - r = ((glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui")) == NULL) || r; - r = ((glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uiv")) == NULL) || r; - r = ((glProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4d")) == NULL) || r; - r = ((glProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4dv")) == NULL) || r; - r = ((glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4f")) == NULL) || r; - r = ((glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fv")) == NULL) || r; - r = ((glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i")) == NULL) || r; - r = ((glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4iv")) == NULL) || r; - r = ((glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui")) == NULL) || r; - r = ((glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uiv")) == NULL) || r; - r = ((glProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2dv")) == NULL) || r; - r = ((glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2fv")) == NULL) || r; - r = ((glProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3dv")) == NULL) || r; - r = ((glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3fv")) == NULL) || r; - r = ((glProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4dv")) == NULL) || r; - r = ((glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4fv")) == NULL) || r; - r = ((glProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3dv")) == NULL) || r; - r = ((glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3fv")) == NULL) || r; - r = ((glProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2dv")) == NULL) || r; - r = ((glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2fv")) == NULL) || r; - r = ((glProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4dv")) == NULL) || r; - r = ((glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4fv")) == NULL) || r; - r = ((glProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4dv")) == NULL) || r; - r = ((glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4fv")) == NULL) || r; - r = ((glProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2dv")) == NULL) || r; - r = ((glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2fv")) == NULL) || r; - r = ((glProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3dv")) == NULL) || r; - r = ((glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3fv")) == NULL) || r; - r = ((glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC)glewGetProcAddress((const GLubyte*)"glUseProgramStages")) == NULL) || r; - r = ((glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glValidateProgramPipeline")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_separate_shader_objects */ - -#ifdef GL_ARB_shader_atomic_counters - -static GLboolean _glewInit_GL_ARB_shader_atomic_counters (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAtomicCounterBufferiv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_shader_atomic_counters */ - -#ifdef GL_ARB_shader_image_load_store - -static GLboolean _glewInit_GL_ARB_shader_image_load_store (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glBindImageTexture")) == NULL) || r; - r = ((glMemoryBarrier = (PFNGLMEMORYBARRIERPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrier")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_shader_image_load_store */ - -#ifdef GL_ARB_shader_objects - -static GLboolean _glewInit_GL_ARB_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glAttachObjectARB")) == NULL) || r; - r = ((glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)glewGetProcAddress((const GLubyte*)"glCompileShaderARB")) == NULL) || r; - r = ((glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateProgramObjectARB")) == NULL) || r; - r = ((glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderObjectARB")) == NULL) || r; - r = ((glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteObjectARB")) == NULL) || r; - r = ((glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glDetachObjectARB")) == NULL) || r; - r = ((glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformARB")) == NULL) || r; - r = ((glGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC)glewGetProcAddress((const GLubyte*)"glGetAttachedObjectsARB")) == NULL) || r; - r = ((glGetHandleARB = (PFNGLGETHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetHandleARB")) == NULL) || r; - r = ((glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)glewGetProcAddress((const GLubyte*)"glGetInfoLogARB")) == NULL) || r; - r = ((glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterfvARB")) == NULL) || r; - r = ((glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterivARB")) == NULL) || r; - r = ((glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)"glGetShaderSourceARB")) == NULL) || r; - r = ((glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformLocationARB")) == NULL) || r; - r = ((glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformfvARB")) == NULL) || r; - r = ((glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformivARB")) == NULL) || r; - r = ((glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glLinkProgramARB")) == NULL) || r; - r = ((glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)"glShaderSourceARB")) == NULL) || r; - r = ((glUniform1fARB = (PFNGLUNIFORM1FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1fARB")) == NULL) || r; - r = ((glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1fvARB")) == NULL) || r; - r = ((glUniform1iARB = (PFNGLUNIFORM1IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1iARB")) == NULL) || r; - r = ((glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ivARB")) == NULL) || r; - r = ((glUniform2fARB = (PFNGLUNIFORM2FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2fARB")) == NULL) || r; - r = ((glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2fvARB")) == NULL) || r; - r = ((glUniform2iARB = (PFNGLUNIFORM2IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2iARB")) == NULL) || r; - r = ((glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ivARB")) == NULL) || r; - r = ((glUniform3fARB = (PFNGLUNIFORM3FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3fARB")) == NULL) || r; - r = ((glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3fvARB")) == NULL) || r; - r = ((glUniform3iARB = (PFNGLUNIFORM3IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3iARB")) == NULL) || r; - r = ((glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ivARB")) == NULL) || r; - r = ((glUniform4fARB = (PFNGLUNIFORM4FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4fARB")) == NULL) || r; - r = ((glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4fvARB")) == NULL) || r; - r = ((glUniform4iARB = (PFNGLUNIFORM4IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4iARB")) == NULL) || r; - r = ((glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ivARB")) == NULL) || r; - r = ((glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2fvARB")) == NULL) || r; - r = ((glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3fvARB")) == NULL) || r; - r = ((glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4fvARB")) == NULL) || r; - r = ((glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glUseProgramObjectARB")) == NULL) || r; - r = ((glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glValidateProgramARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_shader_objects */ - -#ifdef GL_ARB_shader_storage_buffer_object - -static GLboolean _glewInit_GL_ARB_shader_storage_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC)glewGetProcAddress((const GLubyte*)"glShaderStorageBlockBinding")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_shader_storage_buffer_object */ - -#ifdef GL_ARB_shader_subroutine - -static GLboolean _glewInit_GL_ARB_shader_subroutine (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineName")) == NULL) || r; - r = ((glGetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineUniformName")) == NULL) || r; - r = ((glGetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineUniformiv")) == NULL) || r; - r = ((glGetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStageiv")) == NULL) || r; - r = ((glGetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetSubroutineIndex")) == NULL) || r; - r = ((glGetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetSubroutineUniformLocation")) == NULL) || r; - r = ((glGetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformSubroutineuiv")) == NULL) || r; - r = ((glUniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC)glewGetProcAddress((const GLubyte*)"glUniformSubroutinesuiv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_shader_subroutine */ - -#ifdef GL_ARB_shading_language_include - -static GLboolean _glewInit_GL_ARB_shading_language_include (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glCompileShaderIncludeARB = (PFNGLCOMPILESHADERINCLUDEARBPROC)glewGetProcAddress((const GLubyte*)"glCompileShaderIncludeARB")) == NULL) || r; - r = ((glDeleteNamedStringARB = (PFNGLDELETENAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteNamedStringARB")) == NULL) || r; - r = ((glGetNamedStringARB = (PFNGLGETNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glGetNamedStringARB")) == NULL) || r; - r = ((glGetNamedStringivARB = (PFNGLGETNAMEDSTRINGIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetNamedStringivARB")) == NULL) || r; - r = ((glIsNamedStringARB = (PFNGLISNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glIsNamedStringARB")) == NULL) || r; - r = ((glNamedStringARB = (PFNGLNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glNamedStringARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_shading_language_include */ - -#ifdef GL_ARB_sparse_buffer - -static GLboolean _glewInit_GL_ARB_sparse_buffer (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBufferPageCommitmentARB = (PFNGLBUFFERPAGECOMMITMENTARBPROC)glewGetProcAddress((const GLubyte*)"glBufferPageCommitmentARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_sparse_buffer */ - -#ifdef GL_ARB_sparse_texture - -static GLboolean _glewInit_GL_ARB_sparse_texture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTexPageCommitmentARB = (PFNGLTEXPAGECOMMITMENTARBPROC)glewGetProcAddress((const GLubyte*)"glTexPageCommitmentARB")) == NULL) || r; - r = ((glTexturePageCommitmentEXT = (PFNGLTEXTUREPAGECOMMITMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glTexturePageCommitmentEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_sparse_texture */ - -#ifdef GL_ARB_sync - -static GLboolean _glewInit_GL_ARB_sync (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"glClientWaitSync")) == NULL) || r; - r = ((glDeleteSync = (PFNGLDELETESYNCPROC)glewGetProcAddress((const GLubyte*)"glDeleteSync")) == NULL) || r; - r = ((glFenceSync = (PFNGLFENCESYNCPROC)glewGetProcAddress((const GLubyte*)"glFenceSync")) == NULL) || r; - r = ((glGetInteger64v = (PFNGLGETINTEGER64VPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64v")) == NULL) || r; - r = ((glGetSynciv = (PFNGLGETSYNCIVPROC)glewGetProcAddress((const GLubyte*)"glGetSynciv")) == NULL) || r; - r = ((glIsSync = (PFNGLISSYNCPROC)glewGetProcAddress((const GLubyte*)"glIsSync")) == NULL) || r; - r = ((glWaitSync = (PFNGLWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"glWaitSync")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_sync */ - -#ifdef GL_ARB_tessellation_shader - -static GLboolean _glewInit_GL_ARB_tessellation_shader (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glPatchParameterfv = (PFNGLPATCHPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glPatchParameterfv")) == NULL) || r; - r = ((glPatchParameteri = (PFNGLPATCHPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glPatchParameteri")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_tessellation_shader */ - -#ifdef GL_ARB_texture_barrier - -static GLboolean _glewInit_GL_ARB_texture_barrier (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTextureBarrier = (PFNGLTEXTUREBARRIERPROC)glewGetProcAddress((const GLubyte*)"glTextureBarrier")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_barrier */ - -#ifdef GL_ARB_texture_buffer_object - -static GLboolean _glewInit_GL_ARB_texture_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTexBufferARB = (PFNGLTEXBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glTexBufferARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_buffer_object */ - -#ifdef GL_ARB_texture_buffer_range - -static GLboolean _glewInit_GL_ARB_texture_buffer_range (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTexBufferRange = (PFNGLTEXBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTexBufferRange")) == NULL) || r; - r = ((glTextureBufferRangeEXT = (PFNGLTEXTUREBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferRangeEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_buffer_range */ - -#ifdef GL_ARB_texture_compression - -static GLboolean _glewInit_GL_ARB_texture_compression (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glCompressedTexImage1DARB = (PFNGLCOMPRESSEDTEXIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage1DARB")) == NULL) || r; - r = ((glCompressedTexImage2DARB = (PFNGLCOMPRESSEDTEXIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage2DARB")) == NULL) || r; - r = ((glCompressedTexImage3DARB = (PFNGLCOMPRESSEDTEXIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3DARB")) == NULL) || r; - r = ((glCompressedTexSubImage1DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage1DARB")) == NULL) || r; - r = ((glCompressedTexSubImage2DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage2DARB")) == NULL) || r; - r = ((glCompressedTexSubImage3DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3DARB")) == NULL) || r; - r = ((glGetCompressedTexImageARB = (PFNGLGETCOMPRESSEDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTexImageARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_compression */ - -#ifdef GL_ARB_texture_multisample - -static GLboolean _glewInit_GL_ARB_texture_multisample (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC)glewGetProcAddress((const GLubyte*)"glGetMultisamplefv")) == NULL) || r; - r = ((glSampleMaski = (PFNGLSAMPLEMASKIPROC)glewGetProcAddress((const GLubyte*)"glSampleMaski")) == NULL) || r; - r = ((glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexImage2DMultisample")) == NULL) || r; - r = ((glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DMultisample")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_multisample */ - -#ifdef GL_ARB_texture_storage - -static GLboolean _glewInit_GL_ARB_texture_storage (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTexStorage1D = (PFNGLTEXSTORAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage1D")) == NULL) || r; - r = ((glTexStorage2D = (PFNGLTEXSTORAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage2D")) == NULL) || r; - r = ((glTexStorage3D = (PFNGLTEXSTORAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage3D")) == NULL) || r; - r = ((glTextureStorage1DEXT = (PFNGLTEXTURESTORAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage1DEXT")) == NULL) || r; - r = ((glTextureStorage2DEXT = (PFNGLTEXTURESTORAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DEXT")) == NULL) || r; - r = ((glTextureStorage3DEXT = (PFNGLTEXTURESTORAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_storage */ - -#ifdef GL_ARB_texture_storage_multisample - -static GLboolean _glewInit_GL_ARB_texture_storage_multisample (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexStorage2DMultisample")) == NULL) || r; - r = ((glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexStorage3DMultisample")) == NULL) || r; - r = ((glTextureStorage2DMultisampleEXT = (PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DMultisampleEXT")) == NULL) || r; - r = ((glTextureStorage3DMultisampleEXT = (PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DMultisampleEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_storage_multisample */ - -#ifdef GL_ARB_texture_view - -static GLboolean _glewInit_GL_ARB_texture_view (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTextureView = (PFNGLTEXTUREVIEWPROC)glewGetProcAddress((const GLubyte*)"glTextureView")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_view */ - -#ifdef GL_ARB_timer_query - -static GLboolean _glewInit_GL_ARB_timer_query (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64v")) == NULL) || r; - r = ((glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64v")) == NULL) || r; - r = ((glQueryCounter = (PFNGLQUERYCOUNTERPROC)glewGetProcAddress((const GLubyte*)"glQueryCounter")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_timer_query */ - -#ifdef GL_ARB_transform_feedback2 - -static GLboolean _glewInit_GL_ARB_transform_feedback2 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glBindTransformFeedback")) == NULL) || r; - r = ((glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glDeleteTransformFeedbacks")) == NULL) || r; - r = ((glDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedback")) == NULL) || r; - r = ((glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glGenTransformFeedbacks")) == NULL) || r; - r = ((glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glIsTransformFeedback")) == NULL) || r; - r = ((glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glPauseTransformFeedback")) == NULL) || r; - r = ((glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glResumeTransformFeedback")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_transform_feedback2 */ - -#ifdef GL_ARB_transform_feedback3 - -static GLboolean _glewInit_GL_ARB_transform_feedback3 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryIndexed")) == NULL) || r; - r = ((glDrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackStream")) == NULL) || r; - r = ((glEndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glEndQueryIndexed")) == NULL) || r; - r = ((glGetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryIndexediv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_transform_feedback3 */ - -#ifdef GL_ARB_transform_feedback_instanced - -static GLboolean _glewInit_GL_ARB_transform_feedback_instanced (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDrawTransformFeedbackInstanced = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackInstanced")) == NULL) || r; - r = ((glDrawTransformFeedbackStreamInstanced = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackStreamInstanced")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_transform_feedback_instanced */ - -#ifdef GL_ARB_transpose_matrix - -static GLboolean _glewInit_GL_ARB_transpose_matrix (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glLoadTransposeMatrixdARB = (PFNGLLOADTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixdARB")) == NULL) || r; - r = ((glLoadTransposeMatrixfARB = (PFNGLLOADTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixfARB")) == NULL) || r; - r = ((glMultTransposeMatrixdARB = (PFNGLMULTTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixdARB")) == NULL) || r; - r = ((glMultTransposeMatrixfARB = (PFNGLMULTTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixfARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_transpose_matrix */ - -#ifdef GL_ARB_uniform_buffer_object - -static GLboolean _glewInit_GL_ARB_uniform_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBase")) == NULL) || r; - r = ((glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRange")) == NULL) || r; - r = ((glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformBlockName")) == NULL) || r; - r = ((glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformBlockiv")) == NULL) || r; - r = ((glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformName")) == NULL) || r; - r = ((glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformsiv")) == NULL) || r; - r = ((glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)glewGetProcAddress((const GLubyte*)"glGetIntegeri_v")) == NULL) || r; - r = ((glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetUniformBlockIndex")) == NULL) || r; - r = ((glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC)glewGetProcAddress((const GLubyte*)"glGetUniformIndices")) == NULL) || r; - r = ((glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)glewGetProcAddress((const GLubyte*)"glUniformBlockBinding")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_uniform_buffer_object */ - -#ifdef GL_ARB_vertex_array_object - -static GLboolean _glewInit_GL_ARB_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArray")) == NULL) || r; - r = ((glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArrays")) == NULL) || r; - r = ((glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArrays")) == NULL) || r; - r = ((glIsVertexArray = (PFNGLISVERTEXARRAYPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArray")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_array_object */ - -#ifdef GL_ARB_vertex_attrib_64bit - -static GLboolean _glewInit_GL_ARB_vertex_attrib_64bit (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLdv")) == NULL) || r; - r = ((glVertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1d")) == NULL) || r; - r = ((glVertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dv")) == NULL) || r; - r = ((glVertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2d")) == NULL) || r; - r = ((glVertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dv")) == NULL) || r; - r = ((glVertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3d")) == NULL) || r; - r = ((glVertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dv")) == NULL) || r; - r = ((glVertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4d")) == NULL) || r; - r = ((glVertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dv")) == NULL) || r; - r = ((glVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLPointer")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_attrib_64bit */ - -#ifdef GL_ARB_vertex_attrib_binding - -static GLboolean _glewInit_GL_ARB_vertex_attrib_binding (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindVertexBuffer")) == NULL) || r; - r = ((glVertexArrayBindVertexBufferEXT = (PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayBindVertexBufferEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribBindingEXT = (PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribBindingEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribFormatEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribIFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribIFormatEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribLFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribLFormatEXT")) == NULL) || r; - r = ((glVertexArrayVertexBindingDivisorEXT = (PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBindingDivisorEXT")) == NULL) || r; - r = ((glVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribBinding")) == NULL) || r; - r = ((glVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribFormat")) == NULL) || r; - r = ((glVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIFormat")) == NULL) || r; - r = ((glVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLFormat")) == NULL) || r; - r = ((glVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexBindingDivisor")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_attrib_binding */ - -#ifdef GL_ARB_vertex_blend - -static GLboolean _glewInit_GL_ARB_vertex_blend (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glVertexBlendARB = (PFNGLVERTEXBLENDARBPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendARB")) == NULL) || r; - r = ((glWeightPointerARB = (PFNGLWEIGHTPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glWeightPointerARB")) == NULL) || r; - r = ((glWeightbvARB = (PFNGLWEIGHTBVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightbvARB")) == NULL) || r; - r = ((glWeightdvARB = (PFNGLWEIGHTDVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightdvARB")) == NULL) || r; - r = ((glWeightfvARB = (PFNGLWEIGHTFVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightfvARB")) == NULL) || r; - r = ((glWeightivARB = (PFNGLWEIGHTIVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightivARB")) == NULL) || r; - r = ((glWeightsvARB = (PFNGLWEIGHTSVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightsvARB")) == NULL) || r; - r = ((glWeightubvARB = (PFNGLWEIGHTUBVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightubvARB")) == NULL) || r; - r = ((glWeightuivARB = (PFNGLWEIGHTUIVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightuivARB")) == NULL) || r; - r = ((glWeightusvARB = (PFNGLWEIGHTUSVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightusvARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_blend */ - -#ifdef GL_ARB_vertex_buffer_object - -static GLboolean _glewInit_GL_ARB_vertex_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindBufferARB = (PFNGLBINDBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glBindBufferARB")) == NULL) || r; - r = ((glBufferDataARB = (PFNGLBUFFERDATAARBPROC)glewGetProcAddress((const GLubyte*)"glBufferDataARB")) == NULL) || r; - r = ((glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)"glBufferSubDataARB")) == NULL) || r; - r = ((glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteBuffersARB")) == NULL) || r; - r = ((glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glGenBuffersARB")) == NULL) || r; - r = ((glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameterivARB")) == NULL) || r; - r = ((glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferPointervARB")) == NULL) || r; - r = ((glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferSubDataARB")) == NULL) || r; - r = ((glIsBufferARB = (PFNGLISBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glIsBufferARB")) == NULL) || r; - r = ((glMapBufferARB = (PFNGLMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glMapBufferARB")) == NULL) || r; - r = ((glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glUnmapBufferARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_buffer_object */ - -#ifdef GL_ARB_vertex_program - -static GLboolean _glewInit_GL_ARB_vertex_program (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindProgramARB = (PFNGLBINDPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glBindProgramARB")) == NULL) || r; - r = ((glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramsARB")) == NULL) || r; - r = ((glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribArrayARB")) == NULL) || r; - r = ((glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribArrayARB")) == NULL) || r; - r = ((glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)"glGenProgramsARB")) == NULL) || r; - r = ((glGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramEnvParameterdvARB")) == NULL) || r; - r = ((glGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramEnvParameterfvARB")) == NULL) || r; - r = ((glGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramLocalParameterdvARB")) == NULL) || r; - r = ((glGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramLocalParameterfvARB")) == NULL) || r; - r = ((glGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStringARB")) == NULL) || r; - r = ((glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramivARB")) == NULL) || r; - r = ((glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointervARB")) == NULL) || r; - r = ((glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdvARB")) == NULL) || r; - r = ((glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfvARB")) == NULL) || r; - r = ((glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribivARB")) == NULL) || r; - r = ((glIsProgramARB = (PFNGLISPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glIsProgramARB")) == NULL) || r; - r = ((glProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4dARB")) == NULL) || r; - r = ((glProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4dvARB")) == NULL) || r; - r = ((glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4fARB")) == NULL) || r; - r = ((glProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4fvARB")) == NULL) || r; - r = ((glProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4dARB")) == NULL) || r; - r = ((glProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4dvARB")) == NULL) || r; - r = ((glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4fARB")) == NULL) || r; - r = ((glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4fvARB")) == NULL) || r; - r = ((glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glProgramStringARB")) == NULL) || r; - r = ((glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dARB")) == NULL) || r; - r = ((glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dvARB")) == NULL) || r; - r = ((glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fARB")) == NULL) || r; - r = ((glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fvARB")) == NULL) || r; - r = ((glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sARB")) == NULL) || r; - r = ((glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1svARB")) == NULL) || r; - r = ((glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dARB")) == NULL) || r; - r = ((glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dvARB")) == NULL) || r; - r = ((glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fARB")) == NULL) || r; - r = ((glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fvARB")) == NULL) || r; - r = ((glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sARB")) == NULL) || r; - r = ((glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2svARB")) == NULL) || r; - r = ((glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dARB")) == NULL) || r; - r = ((glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dvARB")) == NULL) || r; - r = ((glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fARB")) == NULL) || r; - r = ((glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fvARB")) == NULL) || r; - r = ((glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sARB")) == NULL) || r; - r = ((glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3svARB")) == NULL) || r; - r = ((glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NbvARB")) == NULL) || r; - r = ((glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NivARB")) == NULL) || r; - r = ((glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NsvARB")) == NULL) || r; - r = ((glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NubARB")) == NULL) || r; - r = ((glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NubvARB")) == NULL) || r; - r = ((glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NuivARB")) == NULL) || r; - r = ((glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NusvARB")) == NULL) || r; - r = ((glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4bvARB")) == NULL) || r; - r = ((glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dARB")) == NULL) || r; - r = ((glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dvARB")) == NULL) || r; - r = ((glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fARB")) == NULL) || r; - r = ((glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fvARB")) == NULL) || r; - r = ((glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ivARB")) == NULL) || r; - r = ((glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sARB")) == NULL) || r; - r = ((glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4svARB")) == NULL) || r; - r = ((glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubvARB")) == NULL) || r; - r = ((glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4uivARB")) == NULL) || r; - r = ((glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4usvARB")) == NULL) || r; - r = ((glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointerARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_program */ - -#ifdef GL_ARB_vertex_shader - -static GLboolean _glewInit_GL_ARB_vertex_shader (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glBindAttribLocationARB")) == NULL) || r; - r = ((glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAttribARB")) == NULL) || r; - r = ((glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glGetAttribLocationARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_shader */ - -#ifdef GL_ARB_vertex_type_2_10_10_10_rev - -static GLboolean _glewInit_GL_ARB_vertex_type_2_10_10_10_rev (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glColorP3ui = (PFNGLCOLORP3UIPROC)glewGetProcAddress((const GLubyte*)"glColorP3ui")) == NULL) || r; - r = ((glColorP3uiv = (PFNGLCOLORP3UIVPROC)glewGetProcAddress((const GLubyte*)"glColorP3uiv")) == NULL) || r; - r = ((glColorP4ui = (PFNGLCOLORP4UIPROC)glewGetProcAddress((const GLubyte*)"glColorP4ui")) == NULL) || r; - r = ((glColorP4uiv = (PFNGLCOLORP4UIVPROC)glewGetProcAddress((const GLubyte*)"glColorP4uiv")) == NULL) || r; - r = ((glMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP1ui")) == NULL) || r; - r = ((glMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP1uiv")) == NULL) || r; - r = ((glMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP2ui")) == NULL) || r; - r = ((glMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP2uiv")) == NULL) || r; - r = ((glMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP3ui")) == NULL) || r; - r = ((glMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP3uiv")) == NULL) || r; - r = ((glMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP4ui")) == NULL) || r; - r = ((glMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP4uiv")) == NULL) || r; - r = ((glNormalP3ui = (PFNGLNORMALP3UIPROC)glewGetProcAddress((const GLubyte*)"glNormalP3ui")) == NULL) || r; - r = ((glNormalP3uiv = (PFNGLNORMALP3UIVPROC)glewGetProcAddress((const GLubyte*)"glNormalP3uiv")) == NULL) || r; - r = ((glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorP3ui")) == NULL) || r; - r = ((glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorP3uiv")) == NULL) || r; - r = ((glTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP1ui")) == NULL) || r; - r = ((glTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP1uiv")) == NULL) || r; - r = ((glTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP2ui")) == NULL) || r; - r = ((glTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP2uiv")) == NULL) || r; - r = ((glTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP3ui")) == NULL) || r; - r = ((glTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP3uiv")) == NULL) || r; - r = ((glTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP4ui")) == NULL) || r; - r = ((glTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP4uiv")) == NULL) || r; - r = ((glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP1ui")) == NULL) || r; - r = ((glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP1uiv")) == NULL) || r; - r = ((glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP2ui")) == NULL) || r; - r = ((glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP2uiv")) == NULL) || r; - r = ((glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP3ui")) == NULL) || r; - r = ((glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP3uiv")) == NULL) || r; - r = ((glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP4ui")) == NULL) || r; - r = ((glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP4uiv")) == NULL) || r; - r = ((glVertexP2ui = (PFNGLVERTEXP2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP2ui")) == NULL) || r; - r = ((glVertexP2uiv = (PFNGLVERTEXP2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP2uiv")) == NULL) || r; - r = ((glVertexP3ui = (PFNGLVERTEXP3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP3ui")) == NULL) || r; - r = ((glVertexP3uiv = (PFNGLVERTEXP3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP3uiv")) == NULL) || r; - r = ((glVertexP4ui = (PFNGLVERTEXP4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP4ui")) == NULL) || r; - r = ((glVertexP4uiv = (PFNGLVERTEXP4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP4uiv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ - -#ifdef GL_ARB_viewport_array - -static GLboolean _glewInit_GL_ARB_viewport_array (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeArrayv")) == NULL) || r; - r = ((glDepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeIndexed")) == NULL) || r; - r = ((glGetDoublei_v = (PFNGLGETDOUBLEI_VPROC)glewGetProcAddress((const GLubyte*)"glGetDoublei_v")) == NULL) || r; - r = ((glGetFloati_v = (PFNGLGETFLOATI_VPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_v")) == NULL) || r; - r = ((glScissorArrayv = (PFNGLSCISSORARRAYVPROC)glewGetProcAddress((const GLubyte*)"glScissorArrayv")) == NULL) || r; - r = ((glScissorIndexed = (PFNGLSCISSORINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexed")) == NULL) || r; - r = ((glScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexedv")) == NULL) || r; - r = ((glViewportArrayv = (PFNGLVIEWPORTARRAYVPROC)glewGetProcAddress((const GLubyte*)"glViewportArrayv")) == NULL) || r; - r = ((glViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedf")) == NULL) || r; - r = ((glViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedfv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_viewport_array */ - -#ifdef GL_ARB_window_pos - -static GLboolean _glewInit_GL_ARB_window_pos (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glWindowPos2dARB = (PFNGLWINDOWPOS2DARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dARB")) == NULL) || r; - r = ((glWindowPos2dvARB = (PFNGLWINDOWPOS2DVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dvARB")) == NULL) || r; - r = ((glWindowPos2fARB = (PFNGLWINDOWPOS2FARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fARB")) == NULL) || r; - r = ((glWindowPos2fvARB = (PFNGLWINDOWPOS2FVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fvARB")) == NULL) || r; - r = ((glWindowPos2iARB = (PFNGLWINDOWPOS2IARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iARB")) == NULL) || r; - r = ((glWindowPos2ivARB = (PFNGLWINDOWPOS2IVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2ivARB")) == NULL) || r; - r = ((glWindowPos2sARB = (PFNGLWINDOWPOS2SARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sARB")) == NULL) || r; - r = ((glWindowPos2svARB = (PFNGLWINDOWPOS2SVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2svARB")) == NULL) || r; - r = ((glWindowPos3dARB = (PFNGLWINDOWPOS3DARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dARB")) == NULL) || r; - r = ((glWindowPos3dvARB = (PFNGLWINDOWPOS3DVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dvARB")) == NULL) || r; - r = ((glWindowPos3fARB = (PFNGLWINDOWPOS3FARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fARB")) == NULL) || r; - r = ((glWindowPos3fvARB = (PFNGLWINDOWPOS3FVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fvARB")) == NULL) || r; - r = ((glWindowPos3iARB = (PFNGLWINDOWPOS3IARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iARB")) == NULL) || r; - r = ((glWindowPos3ivARB = (PFNGLWINDOWPOS3IVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3ivARB")) == NULL) || r; - r = ((glWindowPos3sARB = (PFNGLWINDOWPOS3SARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sARB")) == NULL) || r; - r = ((glWindowPos3svARB = (PFNGLWINDOWPOS3SVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3svARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_window_pos */ - -#ifdef GL_ATI_draw_buffers - -static GLboolean _glewInit_GL_ATI_draw_buffers (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDrawBuffersATI = (PFNGLDRAWBUFFERSATIPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_draw_buffers */ - -#ifdef GL_ATI_element_array - -static GLboolean _glewInit_GL_ATI_element_array (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDrawElementArrayATI = (PFNGLDRAWELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)"glDrawElementArrayATI")) == NULL) || r; - r = ((glDrawRangeElementArrayATI = (PFNGLDRAWRANGEELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementArrayATI")) == NULL) || r; - r = ((glElementPointerATI = (PFNGLELEMENTPOINTERATIPROC)glewGetProcAddress((const GLubyte*)"glElementPointerATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_element_array */ - -#ifdef GL_ATI_envmap_bumpmap - -static GLboolean _glewInit_GL_ATI_envmap_bumpmap (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetTexBumpParameterfvATI = (PFNGLGETTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetTexBumpParameterfvATI")) == NULL) || r; - r = ((glGetTexBumpParameterivATI = (PFNGLGETTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetTexBumpParameterivATI")) == NULL) || r; - r = ((glTexBumpParameterfvATI = (PFNGLTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)"glTexBumpParameterfvATI")) == NULL) || r; - r = ((glTexBumpParameterivATI = (PFNGLTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)"glTexBumpParameterivATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_envmap_bumpmap */ - -#ifdef GL_ATI_fragment_shader - -static GLboolean _glewInit_GL_ATI_fragment_shader (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glAlphaFragmentOp1ATI = (PFNGLALPHAFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp1ATI")) == NULL) || r; - r = ((glAlphaFragmentOp2ATI = (PFNGLALPHAFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp2ATI")) == NULL) || r; - r = ((glAlphaFragmentOp3ATI = (PFNGLALPHAFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp3ATI")) == NULL) || r; - r = ((glBeginFragmentShaderATI = (PFNGLBEGINFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glBeginFragmentShaderATI")) == NULL) || r; - r = ((glBindFragmentShaderATI = (PFNGLBINDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glBindFragmentShaderATI")) == NULL) || r; - r = ((glColorFragmentOp1ATI = (PFNGLCOLORFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp1ATI")) == NULL) || r; - r = ((glColorFragmentOp2ATI = (PFNGLCOLORFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp2ATI")) == NULL) || r; - r = ((glColorFragmentOp3ATI = (PFNGLCOLORFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp3ATI")) == NULL) || r; - r = ((glDeleteFragmentShaderATI = (PFNGLDELETEFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glDeleteFragmentShaderATI")) == NULL) || r; - r = ((glEndFragmentShaderATI = (PFNGLENDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glEndFragmentShaderATI")) == NULL) || r; - r = ((glGenFragmentShadersATI = (PFNGLGENFRAGMENTSHADERSATIPROC)glewGetProcAddress((const GLubyte*)"glGenFragmentShadersATI")) == NULL) || r; - r = ((glPassTexCoordATI = (PFNGLPASSTEXCOORDATIPROC)glewGetProcAddress((const GLubyte*)"glPassTexCoordATI")) == NULL) || r; - r = ((glSampleMapATI = (PFNGLSAMPLEMAPATIPROC)glewGetProcAddress((const GLubyte*)"glSampleMapATI")) == NULL) || r; - r = ((glSetFragmentShaderConstantATI = (PFNGLSETFRAGMENTSHADERCONSTANTATIPROC)glewGetProcAddress((const GLubyte*)"glSetFragmentShaderConstantATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_fragment_shader */ - -#ifdef GL_ATI_map_object_buffer - -static GLboolean _glewInit_GL_ATI_map_object_buffer (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glMapObjectBufferATI = (PFNGLMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glMapObjectBufferATI")) == NULL) || r; - r = ((glUnmapObjectBufferATI = (PFNGLUNMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glUnmapObjectBufferATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_map_object_buffer */ - -#ifdef GL_ATI_pn_triangles - -static GLboolean _glewInit_GL_ATI_pn_triangles (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glPNTrianglesfATI = (PFNGLPNTRIANGLESFATIPROC)glewGetProcAddress((const GLubyte*)"glPNTrianglesfATI")) == NULL) || r; - r = ((glPNTrianglesiATI = (PFNGLPNTRIANGLESIATIPROC)glewGetProcAddress((const GLubyte*)"glPNTrianglesiATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_pn_triangles */ - -#ifdef GL_ATI_separate_stencil - -static GLboolean _glewInit_GL_ATI_separate_stencil (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glStencilFuncSeparateATI = (PFNGLSTENCILFUNCSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)"glStencilFuncSeparateATI")) == NULL) || r; - r = ((glStencilOpSeparateATI = (PFNGLSTENCILOPSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)"glStencilOpSeparateATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_separate_stencil */ - -#ifdef GL_ATI_vertex_array_object - -static GLboolean _glewInit_GL_ATI_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glArrayObjectATI = (PFNGLARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glArrayObjectATI")) == NULL) || r; - r = ((glFreeObjectBufferATI = (PFNGLFREEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glFreeObjectBufferATI")) == NULL) || r; - r = ((glGetArrayObjectfvATI = (PFNGLGETARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetArrayObjectfvATI")) == NULL) || r; - r = ((glGetArrayObjectivATI = (PFNGLGETARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetArrayObjectivATI")) == NULL) || r; - r = ((glGetObjectBufferfvATI = (PFNGLGETOBJECTBUFFERFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetObjectBufferfvATI")) == NULL) || r; - r = ((glGetObjectBufferivATI = (PFNGLGETOBJECTBUFFERIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetObjectBufferivATI")) == NULL) || r; - r = ((glGetVariantArrayObjectfvATI = (PFNGLGETVARIANTARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVariantArrayObjectfvATI")) == NULL) || r; - r = ((glGetVariantArrayObjectivATI = (PFNGLGETVARIANTARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVariantArrayObjectivATI")) == NULL) || r; - r = ((glIsObjectBufferATI = (PFNGLISOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glIsObjectBufferATI")) == NULL) || r; - r = ((glNewObjectBufferATI = (PFNGLNEWOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glNewObjectBufferATI")) == NULL) || r; - r = ((glUpdateObjectBufferATI = (PFNGLUPDATEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glUpdateObjectBufferATI")) == NULL) || r; - r = ((glVariantArrayObjectATI = (PFNGLVARIANTARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glVariantArrayObjectATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_vertex_array_object */ - -#ifdef GL_ATI_vertex_attrib_array_object - -static GLboolean _glewInit_GL_ATI_vertex_attrib_array_object (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetVertexAttribArrayObjectfvATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribArrayObjectfvATI")) == NULL) || r; - r = ((glGetVertexAttribArrayObjectivATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribArrayObjectivATI")) == NULL) || r; - r = ((glVertexAttribArrayObjectATI = (PFNGLVERTEXATTRIBARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribArrayObjectATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_vertex_attrib_array_object */ - -#ifdef GL_ATI_vertex_streams - -static GLboolean _glewInit_GL_ATI_vertex_streams (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glClientActiveVertexStreamATI = (PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC)glewGetProcAddress((const GLubyte*)"glClientActiveVertexStreamATI")) == NULL) || r; - r = ((glNormalStream3bATI = (PFNGLNORMALSTREAM3BATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3bATI")) == NULL) || r; - r = ((glNormalStream3bvATI = (PFNGLNORMALSTREAM3BVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3bvATI")) == NULL) || r; - r = ((glNormalStream3dATI = (PFNGLNORMALSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3dATI")) == NULL) || r; - r = ((glNormalStream3dvATI = (PFNGLNORMALSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3dvATI")) == NULL) || r; - r = ((glNormalStream3fATI = (PFNGLNORMALSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3fATI")) == NULL) || r; - r = ((glNormalStream3fvATI = (PFNGLNORMALSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3fvATI")) == NULL) || r; - r = ((glNormalStream3iATI = (PFNGLNORMALSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3iATI")) == NULL) || r; - r = ((glNormalStream3ivATI = (PFNGLNORMALSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3ivATI")) == NULL) || r; - r = ((glNormalStream3sATI = (PFNGLNORMALSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3sATI")) == NULL) || r; - r = ((glNormalStream3svATI = (PFNGLNORMALSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3svATI")) == NULL) || r; - r = ((glVertexBlendEnvfATI = (PFNGLVERTEXBLENDENVFATIPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendEnvfATI")) == NULL) || r; - r = ((glVertexBlendEnviATI = (PFNGLVERTEXBLENDENVIATIPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendEnviATI")) == NULL) || r; - r = ((glVertexStream1dATI = (PFNGLVERTEXSTREAM1DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1dATI")) == NULL) || r; - r = ((glVertexStream1dvATI = (PFNGLVERTEXSTREAM1DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1dvATI")) == NULL) || r; - r = ((glVertexStream1fATI = (PFNGLVERTEXSTREAM1FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1fATI")) == NULL) || r; - r = ((glVertexStream1fvATI = (PFNGLVERTEXSTREAM1FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1fvATI")) == NULL) || r; - r = ((glVertexStream1iATI = (PFNGLVERTEXSTREAM1IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1iATI")) == NULL) || r; - r = ((glVertexStream1ivATI = (PFNGLVERTEXSTREAM1IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1ivATI")) == NULL) || r; - r = ((glVertexStream1sATI = (PFNGLVERTEXSTREAM1SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1sATI")) == NULL) || r; - r = ((glVertexStream1svATI = (PFNGLVERTEXSTREAM1SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1svATI")) == NULL) || r; - r = ((glVertexStream2dATI = (PFNGLVERTEXSTREAM2DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2dATI")) == NULL) || r; - r = ((glVertexStream2dvATI = (PFNGLVERTEXSTREAM2DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2dvATI")) == NULL) || r; - r = ((glVertexStream2fATI = (PFNGLVERTEXSTREAM2FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2fATI")) == NULL) || r; - r = ((glVertexStream2fvATI = (PFNGLVERTEXSTREAM2FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2fvATI")) == NULL) || r; - r = ((glVertexStream2iATI = (PFNGLVERTEXSTREAM2IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2iATI")) == NULL) || r; - r = ((glVertexStream2ivATI = (PFNGLVERTEXSTREAM2IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2ivATI")) == NULL) || r; - r = ((glVertexStream2sATI = (PFNGLVERTEXSTREAM2SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2sATI")) == NULL) || r; - r = ((glVertexStream2svATI = (PFNGLVERTEXSTREAM2SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2svATI")) == NULL) || r; - r = ((glVertexStream3dATI = (PFNGLVERTEXSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3dATI")) == NULL) || r; - r = ((glVertexStream3dvATI = (PFNGLVERTEXSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3dvATI")) == NULL) || r; - r = ((glVertexStream3fATI = (PFNGLVERTEXSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3fATI")) == NULL) || r; - r = ((glVertexStream3fvATI = (PFNGLVERTEXSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3fvATI")) == NULL) || r; - r = ((glVertexStream3iATI = (PFNGLVERTEXSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3iATI")) == NULL) || r; - r = ((glVertexStream3ivATI = (PFNGLVERTEXSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3ivATI")) == NULL) || r; - r = ((glVertexStream3sATI = (PFNGLVERTEXSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3sATI")) == NULL) || r; - r = ((glVertexStream3svATI = (PFNGLVERTEXSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3svATI")) == NULL) || r; - r = ((glVertexStream4dATI = (PFNGLVERTEXSTREAM4DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4dATI")) == NULL) || r; - r = ((glVertexStream4dvATI = (PFNGLVERTEXSTREAM4DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4dvATI")) == NULL) || r; - r = ((glVertexStream4fATI = (PFNGLVERTEXSTREAM4FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4fATI")) == NULL) || r; - r = ((glVertexStream4fvATI = (PFNGLVERTEXSTREAM4FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4fvATI")) == NULL) || r; - r = ((glVertexStream4iATI = (PFNGLVERTEXSTREAM4IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4iATI")) == NULL) || r; - r = ((glVertexStream4ivATI = (PFNGLVERTEXSTREAM4IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4ivATI")) == NULL) || r; - r = ((glVertexStream4sATI = (PFNGLVERTEXSTREAM4SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4sATI")) == NULL) || r; - r = ((glVertexStream4svATI = (PFNGLVERTEXSTREAM4SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4svATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_vertex_streams */ - -#ifdef GL_EXT_bindable_uniform - -static GLboolean _glewInit_GL_EXT_bindable_uniform (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetUniformBufferSizeEXT = (PFNGLGETUNIFORMBUFFERSIZEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformBufferSizeEXT")) == NULL) || r; - r = ((glGetUniformOffsetEXT = (PFNGLGETUNIFORMOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformOffsetEXT")) == NULL) || r; - r = ((glUniformBufferEXT = (PFNGLUNIFORMBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glUniformBufferEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_bindable_uniform */ - -#ifdef GL_EXT_blend_color - -static GLboolean _glewInit_GL_EXT_blend_color (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBlendColorEXT = (PFNGLBLENDCOLOREXTPROC)glewGetProcAddress((const GLubyte*)"glBlendColorEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_blend_color */ - -#ifdef GL_EXT_blend_equation_separate - -static GLboolean _glewInit_GL_EXT_blend_equation_separate (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_blend_equation_separate */ - -#ifdef GL_EXT_blend_func_separate - -static GLboolean _glewInit_GL_EXT_blend_func_separate (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_blend_func_separate */ - -#ifdef GL_EXT_blend_minmax - -static GLboolean _glewInit_GL_EXT_blend_minmax (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_blend_minmax */ - -#ifdef GL_EXT_color_subtable - -static GLboolean _glewInit_GL_EXT_color_subtable (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glColorSubTableEXT = (PFNGLCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glColorSubTableEXT")) == NULL) || r; - r = ((glCopyColorSubTableEXT = (PFNGLCOPYCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyColorSubTableEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_color_subtable */ - -#ifdef GL_EXT_compiled_vertex_array - -static GLboolean _glewInit_GL_EXT_compiled_vertex_array (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glLockArraysEXT = (PFNGLLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glLockArraysEXT")) == NULL) || r; - r = ((glUnlockArraysEXT = (PFNGLUNLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glUnlockArraysEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_compiled_vertex_array */ - -#ifdef GL_EXT_convolution - -static GLboolean _glewInit_GL_EXT_convolution (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glConvolutionFilter1DEXT = (PFNGLCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter1DEXT")) == NULL) || r; - r = ((glConvolutionFilter2DEXT = (PFNGLCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter2DEXT")) == NULL) || r; - r = ((glConvolutionParameterfEXT = (PFNGLCONVOLUTIONPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfEXT")) == NULL) || r; - r = ((glConvolutionParameterfvEXT = (PFNGLCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfvEXT")) == NULL) || r; - r = ((glConvolutionParameteriEXT = (PFNGLCONVOLUTIONPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteriEXT")) == NULL) || r; - r = ((glConvolutionParameterivEXT = (PFNGLCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterivEXT")) == NULL) || r; - r = ((glCopyConvolutionFilter1DEXT = (PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter1DEXT")) == NULL) || r; - r = ((glCopyConvolutionFilter2DEXT = (PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter2DEXT")) == NULL) || r; - r = ((glGetConvolutionFilterEXT = (PFNGLGETCONVOLUTIONFILTEREXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionFilterEXT")) == NULL) || r; - r = ((glGetConvolutionParameterfvEXT = (PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterfvEXT")) == NULL) || r; - r = ((glGetConvolutionParameterivEXT = (PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterivEXT")) == NULL) || r; - r = ((glGetSeparableFilterEXT = (PFNGLGETSEPARABLEFILTEREXTPROC)glewGetProcAddress((const GLubyte*)"glGetSeparableFilterEXT")) == NULL) || r; - r = ((glSeparableFilter2DEXT = (PFNGLSEPARABLEFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glSeparableFilter2DEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_convolution */ - -#ifdef GL_EXT_coordinate_frame - -static GLboolean _glewInit_GL_EXT_coordinate_frame (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBinormalPointerEXT = (PFNGLBINORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glBinormalPointerEXT")) == NULL) || r; - r = ((glTangentPointerEXT = (PFNGLTANGENTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glTangentPointerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_coordinate_frame */ - -#ifdef GL_EXT_copy_texture - -static GLboolean _glewInit_GL_EXT_copy_texture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexImage1DEXT")) == NULL) || r; - r = ((glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexImage2DEXT")) == NULL) || r; - r = ((glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage1DEXT")) == NULL) || r; - r = ((glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage2DEXT")) == NULL) || r; - r = ((glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3DEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_copy_texture */ - -#ifdef GL_EXT_cull_vertex - -static GLboolean _glewInit_GL_EXT_cull_vertex (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glCullParameterdvEXT = (PFNGLCULLPARAMETERDVEXTPROC)glewGetProcAddress((const GLubyte*)"glCullParameterdvEXT")) == NULL) || r; - r = ((glCullParameterfvEXT = (PFNGLCULLPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glCullParameterfvEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_cull_vertex */ - -#ifdef GL_EXT_debug_label - -static GLboolean _glewInit_GL_EXT_debug_label (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetObjectLabelEXT = (PFNGLGETOBJECTLABELEXTPROC)glewGetProcAddress((const GLubyte*)"glGetObjectLabelEXT")) == NULL) || r; - r = ((glLabelObjectEXT = (PFNGLLABELOBJECTEXTPROC)glewGetProcAddress((const GLubyte*)"glLabelObjectEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_debug_label */ - -#ifdef GL_EXT_debug_marker - -static GLboolean _glewInit_GL_EXT_debug_marker (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glInsertEventMarkerEXT = (PFNGLINSERTEVENTMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glInsertEventMarkerEXT")) == NULL) || r; - r = ((glPopGroupMarkerEXT = (PFNGLPOPGROUPMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glPopGroupMarkerEXT")) == NULL) || r; - r = ((glPushGroupMarkerEXT = (PFNGLPUSHGROUPMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glPushGroupMarkerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_debug_marker */ - -#ifdef GL_EXT_depth_bounds_test - -static GLboolean _glewInit_GL_EXT_depth_bounds_test (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDepthBoundsEXT = (PFNGLDEPTHBOUNDSEXTPROC)glewGetProcAddress((const GLubyte*)"glDepthBoundsEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_depth_bounds_test */ - -#ifdef GL_EXT_direct_state_access - -static GLboolean _glewInit_GL_EXT_direct_state_access (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindMultiTextureEXT = (PFNGLBINDMULTITEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindMultiTextureEXT")) == NULL) || r; - r = ((glCheckNamedFramebufferStatusEXT = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC)glewGetProcAddress((const GLubyte*)"glCheckNamedFramebufferStatusEXT")) == NULL) || r; - r = ((glClientAttribDefaultEXT = (PFNGLCLIENTATTRIBDEFAULTEXTPROC)glewGetProcAddress((const GLubyte*)"glClientAttribDefaultEXT")) == NULL) || r; - r = ((glCompressedMultiTexImage1DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage1DEXT")) == NULL) || r; - r = ((glCompressedMultiTexImage2DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage2DEXT")) == NULL) || r; - r = ((glCompressedMultiTexImage3DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage3DEXT")) == NULL) || r; - r = ((glCompressedMultiTexSubImage1DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage1DEXT")) == NULL) || r; - r = ((glCompressedMultiTexSubImage2DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage2DEXT")) == NULL) || r; - r = ((glCompressedMultiTexSubImage3DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage3DEXT")) == NULL) || r; - r = ((glCompressedTextureImage1DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage1DEXT")) == NULL) || r; - r = ((glCompressedTextureImage2DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage2DEXT")) == NULL) || r; - r = ((glCompressedTextureImage3DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage3DEXT")) == NULL) || r; - r = ((glCompressedTextureSubImage1DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage1DEXT")) == NULL) || r; - r = ((glCompressedTextureSubImage2DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage2DEXT")) == NULL) || r; - r = ((glCompressedTextureSubImage3DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage3DEXT")) == NULL) || r; - r = ((glCopyMultiTexImage1DEXT = (PFNGLCOPYMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexImage1DEXT")) == NULL) || r; - r = ((glCopyMultiTexImage2DEXT = (PFNGLCOPYMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexImage2DEXT")) == NULL) || r; - r = ((glCopyMultiTexSubImage1DEXT = (PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage1DEXT")) == NULL) || r; - r = ((glCopyMultiTexSubImage2DEXT = (PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage2DEXT")) == NULL) || r; - r = ((glCopyMultiTexSubImage3DEXT = (PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage3DEXT")) == NULL) || r; - r = ((glCopyTextureImage1DEXT = (PFNGLCOPYTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureImage1DEXT")) == NULL) || r; - r = ((glCopyTextureImage2DEXT = (PFNGLCOPYTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureImage2DEXT")) == NULL) || r; - r = ((glCopyTextureSubImage1DEXT = (PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage1DEXT")) == NULL) || r; - r = ((glCopyTextureSubImage2DEXT = (PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage2DEXT")) == NULL) || r; - r = ((glCopyTextureSubImage3DEXT = (PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage3DEXT")) == NULL) || r; - r = ((glDisableClientStateIndexedEXT = (PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableClientStateIndexedEXT")) == NULL) || r; - r = ((glDisableClientStateiEXT = (PFNGLDISABLECLIENTSTATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableClientStateiEXT")) == NULL) || r; - r = ((glDisableVertexArrayAttribEXT = (PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayAttribEXT")) == NULL) || r; - r = ((glDisableVertexArrayEXT = (PFNGLDISABLEVERTEXARRAYEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayEXT")) == NULL) || r; - r = ((glEnableClientStateIndexedEXT = (PFNGLENABLECLIENTSTATEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableClientStateIndexedEXT")) == NULL) || r; - r = ((glEnableClientStateiEXT = (PFNGLENABLECLIENTSTATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableClientStateiEXT")) == NULL) || r; - r = ((glEnableVertexArrayAttribEXT = (PFNGLENABLEVERTEXARRAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayAttribEXT")) == NULL) || r; - r = ((glEnableVertexArrayEXT = (PFNGLENABLEVERTEXARRAYEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayEXT")) == NULL) || r; - r = ((glFlushMappedNamedBufferRangeEXT = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedNamedBufferRangeEXT")) == NULL) || r; - r = ((glFramebufferDrawBufferEXT = (PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferDrawBufferEXT")) == NULL) || r; - r = ((glFramebufferDrawBuffersEXT = (PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferDrawBuffersEXT")) == NULL) || r; - r = ((glFramebufferReadBufferEXT = (PFNGLFRAMEBUFFERREADBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferReadBufferEXT")) == NULL) || r; - r = ((glGenerateMultiTexMipmapEXT = (PFNGLGENERATEMULTITEXMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateMultiTexMipmapEXT")) == NULL) || r; - r = ((glGenerateTextureMipmapEXT = (PFNGLGENERATETEXTUREMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateTextureMipmapEXT")) == NULL) || r; - r = ((glGetCompressedMultiTexImageEXT = (PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedMultiTexImageEXT")) == NULL) || r; - r = ((glGetCompressedTextureImageEXT = (PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureImageEXT")) == NULL) || r; - r = ((glGetDoubleIndexedvEXT = (PFNGLGETDOUBLEINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetDoubleIndexedvEXT")) == NULL) || r; - r = ((glGetDoublei_vEXT = (PFNGLGETDOUBLEI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetDoublei_vEXT")) == NULL) || r; - r = ((glGetFloatIndexedvEXT = (PFNGLGETFLOATINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFloatIndexedvEXT")) == NULL) || r; - r = ((glGetFloati_vEXT = (PFNGLGETFLOATI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_vEXT")) == NULL) || r; - r = ((glGetFramebufferParameterivEXT = (PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameterivEXT")) == NULL) || r; - r = ((glGetMultiTexEnvfvEXT = (PFNGLGETMULTITEXENVFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexEnvfvEXT")) == NULL) || r; - r = ((glGetMultiTexEnvivEXT = (PFNGLGETMULTITEXENVIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexEnvivEXT")) == NULL) || r; - r = ((glGetMultiTexGendvEXT = (PFNGLGETMULTITEXGENDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGendvEXT")) == NULL) || r; - r = ((glGetMultiTexGenfvEXT = (PFNGLGETMULTITEXGENFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGenfvEXT")) == NULL) || r; - r = ((glGetMultiTexGenivEXT = (PFNGLGETMULTITEXGENIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGenivEXT")) == NULL) || r; - r = ((glGetMultiTexImageEXT = (PFNGLGETMULTITEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexImageEXT")) == NULL) || r; - r = ((glGetMultiTexLevelParameterfvEXT = (PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexLevelParameterfvEXT")) == NULL) || r; - r = ((glGetMultiTexLevelParameterivEXT = (PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexLevelParameterivEXT")) == NULL) || r; - r = ((glGetMultiTexParameterIivEXT = (PFNGLGETMULTITEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterIivEXT")) == NULL) || r; - r = ((glGetMultiTexParameterIuivEXT = (PFNGLGETMULTITEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterIuivEXT")) == NULL) || r; - r = ((glGetMultiTexParameterfvEXT = (PFNGLGETMULTITEXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterfvEXT")) == NULL) || r; - r = ((glGetMultiTexParameterivEXT = (PFNGLGETMULTITEXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterivEXT")) == NULL) || r; - r = ((glGetNamedBufferParameterivEXT = (PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameterivEXT")) == NULL) || r; - r = ((glGetNamedBufferPointervEXT = (PFNGLGETNAMEDBUFFERPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferPointervEXT")) == NULL) || r; - r = ((glGetNamedBufferSubDataEXT = (PFNGLGETNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferSubDataEXT")) == NULL) || r; - r = ((glGetNamedFramebufferAttachmentParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferAttachmentParameterivEXT")) == NULL) || r; - r = ((glGetNamedProgramLocalParameterIivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterIivEXT")) == NULL) || r; - r = ((glGetNamedProgramLocalParameterIuivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterIuivEXT")) == NULL) || r; - r = ((glGetNamedProgramLocalParameterdvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterdvEXT")) == NULL) || r; - r = ((glGetNamedProgramLocalParameterfvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterfvEXT")) == NULL) || r; - r = ((glGetNamedProgramStringEXT = (PFNGLGETNAMEDPROGRAMSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramStringEXT")) == NULL) || r; - r = ((glGetNamedProgramivEXT = (PFNGLGETNAMEDPROGRAMIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramivEXT")) == NULL) || r; - r = ((glGetNamedRenderbufferParameterivEXT = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedRenderbufferParameterivEXT")) == NULL) || r; - r = ((glGetPointerIndexedvEXT = (PFNGLGETPOINTERINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPointerIndexedvEXT")) == NULL) || r; - r = ((glGetPointeri_vEXT = (PFNGLGETPOINTERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPointeri_vEXT")) == NULL) || r; - r = ((glGetTextureImageEXT = (PFNGLGETTEXTUREIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureImageEXT")) == NULL) || r; - r = ((glGetTextureLevelParameterfvEXT = (PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterfvEXT")) == NULL) || r; - r = ((glGetTextureLevelParameterivEXT = (PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterivEXT")) == NULL) || r; - r = ((glGetTextureParameterIivEXT = (PFNGLGETTEXTUREPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIivEXT")) == NULL) || r; - r = ((glGetTextureParameterIuivEXT = (PFNGLGETTEXTUREPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIuivEXT")) == NULL) || r; - r = ((glGetTextureParameterfvEXT = (PFNGLGETTEXTUREPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterfvEXT")) == NULL) || r; - r = ((glGetTextureParameterivEXT = (PFNGLGETTEXTUREPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterivEXT")) == NULL) || r; - r = ((glGetVertexArrayIntegeri_vEXT = (PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIntegeri_vEXT")) == NULL) || r; - r = ((glGetVertexArrayIntegervEXT = (PFNGLGETVERTEXARRAYINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIntegervEXT")) == NULL) || r; - r = ((glGetVertexArrayPointeri_vEXT = (PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayPointeri_vEXT")) == NULL) || r; - r = ((glGetVertexArrayPointervEXT = (PFNGLGETVERTEXARRAYPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayPointervEXT")) == NULL) || r; - r = ((glMapNamedBufferEXT = (PFNGLMAPNAMEDBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferEXT")) == NULL) || r; - r = ((glMapNamedBufferRangeEXT = (PFNGLMAPNAMEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferRangeEXT")) == NULL) || r; - r = ((glMatrixFrustumEXT = (PFNGLMATRIXFRUSTUMEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixFrustumEXT")) == NULL) || r; - r = ((glMatrixLoadIdentityEXT = (PFNGLMATRIXLOADIDENTITYEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadIdentityEXT")) == NULL) || r; - r = ((glMatrixLoadTransposedEXT = (PFNGLMATRIXLOADTRANSPOSEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTransposedEXT")) == NULL) || r; - r = ((glMatrixLoadTransposefEXT = (PFNGLMATRIXLOADTRANSPOSEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTransposefEXT")) == NULL) || r; - r = ((glMatrixLoaddEXT = (PFNGLMATRIXLOADDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoaddEXT")) == NULL) || r; - r = ((glMatrixLoadfEXT = (PFNGLMATRIXLOADFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadfEXT")) == NULL) || r; - r = ((glMatrixMultTransposedEXT = (PFNGLMATRIXMULTTRANSPOSEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTransposedEXT")) == NULL) || r; - r = ((glMatrixMultTransposefEXT = (PFNGLMATRIXMULTTRANSPOSEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTransposefEXT")) == NULL) || r; - r = ((glMatrixMultdEXT = (PFNGLMATRIXMULTDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultdEXT")) == NULL) || r; - r = ((glMatrixMultfEXT = (PFNGLMATRIXMULTFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultfEXT")) == NULL) || r; - r = ((glMatrixOrthoEXT = (PFNGLMATRIXORTHOEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixOrthoEXT")) == NULL) || r; - r = ((glMatrixPopEXT = (PFNGLMATRIXPOPEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixPopEXT")) == NULL) || r; - r = ((glMatrixPushEXT = (PFNGLMATRIXPUSHEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixPushEXT")) == NULL) || r; - r = ((glMatrixRotatedEXT = (PFNGLMATRIXROTATEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixRotatedEXT")) == NULL) || r; - r = ((glMatrixRotatefEXT = (PFNGLMATRIXROTATEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixRotatefEXT")) == NULL) || r; - r = ((glMatrixScaledEXT = (PFNGLMATRIXSCALEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixScaledEXT")) == NULL) || r; - r = ((glMatrixScalefEXT = (PFNGLMATRIXSCALEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixScalefEXT")) == NULL) || r; - r = ((glMatrixTranslatedEXT = (PFNGLMATRIXTRANSLATEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixTranslatedEXT")) == NULL) || r; - r = ((glMatrixTranslatefEXT = (PFNGLMATRIXTRANSLATEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixTranslatefEXT")) == NULL) || r; - r = ((glMultiTexBufferEXT = (PFNGLMULTITEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexBufferEXT")) == NULL) || r; - r = ((glMultiTexCoordPointerEXT = (PFNGLMULTITEXCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordPointerEXT")) == NULL) || r; - r = ((glMultiTexEnvfEXT = (PFNGLMULTITEXENVFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvfEXT")) == NULL) || r; - r = ((glMultiTexEnvfvEXT = (PFNGLMULTITEXENVFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvfvEXT")) == NULL) || r; - r = ((glMultiTexEnviEXT = (PFNGLMULTITEXENVIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnviEXT")) == NULL) || r; - r = ((glMultiTexEnvivEXT = (PFNGLMULTITEXENVIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvivEXT")) == NULL) || r; - r = ((glMultiTexGendEXT = (PFNGLMULTITEXGENDEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGendEXT")) == NULL) || r; - r = ((glMultiTexGendvEXT = (PFNGLMULTITEXGENDVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGendvEXT")) == NULL) || r; - r = ((glMultiTexGenfEXT = (PFNGLMULTITEXGENFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenfEXT")) == NULL) || r; - r = ((glMultiTexGenfvEXT = (PFNGLMULTITEXGENFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenfvEXT")) == NULL) || r; - r = ((glMultiTexGeniEXT = (PFNGLMULTITEXGENIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGeniEXT")) == NULL) || r; - r = ((glMultiTexGenivEXT = (PFNGLMULTITEXGENIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenivEXT")) == NULL) || r; - r = ((glMultiTexImage1DEXT = (PFNGLMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage1DEXT")) == NULL) || r; - r = ((glMultiTexImage2DEXT = (PFNGLMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage2DEXT")) == NULL) || r; - r = ((glMultiTexImage3DEXT = (PFNGLMULTITEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage3DEXT")) == NULL) || r; - r = ((glMultiTexParameterIivEXT = (PFNGLMULTITEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterIivEXT")) == NULL) || r; - r = ((glMultiTexParameterIuivEXT = (PFNGLMULTITEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterIuivEXT")) == NULL) || r; - r = ((glMultiTexParameterfEXT = (PFNGLMULTITEXPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterfEXT")) == NULL) || r; - r = ((glMultiTexParameterfvEXT = (PFNGLMULTITEXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterfvEXT")) == NULL) || r; - r = ((glMultiTexParameteriEXT = (PFNGLMULTITEXPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameteriEXT")) == NULL) || r; - r = ((glMultiTexParameterivEXT = (PFNGLMULTITEXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterivEXT")) == NULL) || r; - r = ((glMultiTexRenderbufferEXT = (PFNGLMULTITEXRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexRenderbufferEXT")) == NULL) || r; - r = ((glMultiTexSubImage1DEXT = (PFNGLMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage1DEXT")) == NULL) || r; - r = ((glMultiTexSubImage2DEXT = (PFNGLMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage2DEXT")) == NULL) || r; - r = ((glMultiTexSubImage3DEXT = (PFNGLMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage3DEXT")) == NULL) || r; - r = ((glNamedBufferDataEXT = (PFNGLNAMEDBUFFERDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferDataEXT")) == NULL) || r; - r = ((glNamedBufferSubDataEXT = (PFNGLNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferSubDataEXT")) == NULL) || r; - r = ((glNamedCopyBufferSubDataEXT = (PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedCopyBufferSubDataEXT")) == NULL) || r; - r = ((glNamedFramebufferRenderbufferEXT = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferRenderbufferEXT")) == NULL) || r; - r = ((glNamedFramebufferTexture1DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture1DEXT")) == NULL) || r; - r = ((glNamedFramebufferTexture2DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture2DEXT")) == NULL) || r; - r = ((glNamedFramebufferTexture3DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture3DEXT")) == NULL) || r; - r = ((glNamedFramebufferTextureEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureEXT")) == NULL) || r; - r = ((glNamedFramebufferTextureFaceEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureFaceEXT")) == NULL) || r; - r = ((glNamedFramebufferTextureLayerEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureLayerEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameter4dEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4dEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameter4dvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4dvEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameter4fEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4fEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameter4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4fvEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameterI4iEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4iEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameterI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4ivEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameterI4uiEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4uiEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameterI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4uivEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameters4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameters4fvEXT")) == NULL) || r; - r = ((glNamedProgramLocalParametersI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParametersI4ivEXT")) == NULL) || r; - r = ((glNamedProgramLocalParametersI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParametersI4uivEXT")) == NULL) || r; - r = ((glNamedProgramStringEXT = (PFNGLNAMEDPROGRAMSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramStringEXT")) == NULL) || r; - r = ((glNamedRenderbufferStorageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageEXT")) == NULL) || r; - r = ((glNamedRenderbufferStorageMultisampleCoverageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisampleCoverageEXT")) == NULL) || r; - r = ((glNamedRenderbufferStorageMultisampleEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisampleEXT")) == NULL) || r; - r = ((glProgramUniform1fEXT = (PFNGLPROGRAMUNIFORM1FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fEXT")) == NULL) || r; - r = ((glProgramUniform1fvEXT = (PFNGLPROGRAMUNIFORM1FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fvEXT")) == NULL) || r; - r = ((glProgramUniform1iEXT = (PFNGLPROGRAMUNIFORM1IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1iEXT")) == NULL) || r; - r = ((glProgramUniform1ivEXT = (PFNGLPROGRAMUNIFORM1IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ivEXT")) == NULL) || r; - r = ((glProgramUniform1uiEXT = (PFNGLPROGRAMUNIFORM1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uiEXT")) == NULL) || r; - r = ((glProgramUniform1uivEXT = (PFNGLPROGRAMUNIFORM1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uivEXT")) == NULL) || r; - r = ((glProgramUniform2fEXT = (PFNGLPROGRAMUNIFORM2FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fEXT")) == NULL) || r; - r = ((glProgramUniform2fvEXT = (PFNGLPROGRAMUNIFORM2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fvEXT")) == NULL) || r; - r = ((glProgramUniform2iEXT = (PFNGLPROGRAMUNIFORM2IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2iEXT")) == NULL) || r; - r = ((glProgramUniform2ivEXT = (PFNGLPROGRAMUNIFORM2IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ivEXT")) == NULL) || r; - r = ((glProgramUniform2uiEXT = (PFNGLPROGRAMUNIFORM2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uiEXT")) == NULL) || r; - r = ((glProgramUniform2uivEXT = (PFNGLPROGRAMUNIFORM2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uivEXT")) == NULL) || r; - r = ((glProgramUniform3fEXT = (PFNGLPROGRAMUNIFORM3FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fEXT")) == NULL) || r; - r = ((glProgramUniform3fvEXT = (PFNGLPROGRAMUNIFORM3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fvEXT")) == NULL) || r; - r = ((glProgramUniform3iEXT = (PFNGLPROGRAMUNIFORM3IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3iEXT")) == NULL) || r; - r = ((glProgramUniform3ivEXT = (PFNGLPROGRAMUNIFORM3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ivEXT")) == NULL) || r; - r = ((glProgramUniform3uiEXT = (PFNGLPROGRAMUNIFORM3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uiEXT")) == NULL) || r; - r = ((glProgramUniform3uivEXT = (PFNGLPROGRAMUNIFORM3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uivEXT")) == NULL) || r; - r = ((glProgramUniform4fEXT = (PFNGLPROGRAMUNIFORM4FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fEXT")) == NULL) || r; - r = ((glProgramUniform4fvEXT = (PFNGLPROGRAMUNIFORM4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fvEXT")) == NULL) || r; - r = ((glProgramUniform4iEXT = (PFNGLPROGRAMUNIFORM4IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4iEXT")) == NULL) || r; - r = ((glProgramUniform4ivEXT = (PFNGLPROGRAMUNIFORM4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ivEXT")) == NULL) || r; - r = ((glProgramUniform4uiEXT = (PFNGLPROGRAMUNIFORM4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uiEXT")) == NULL) || r; - r = ((glProgramUniform4uivEXT = (PFNGLPROGRAMUNIFORM4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uivEXT")) == NULL) || r; - r = ((glProgramUniformMatrix2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix2x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix2x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix3x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix3x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix4x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix4x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3fvEXT")) == NULL) || r; - r = ((glPushClientAttribDefaultEXT = (PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC)glewGetProcAddress((const GLubyte*)"glPushClientAttribDefaultEXT")) == NULL) || r; - r = ((glTextureBufferEXT = (PFNGLTEXTUREBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferEXT")) == NULL) || r; - r = ((glTextureImage1DEXT = (PFNGLTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage1DEXT")) == NULL) || r; - r = ((glTextureImage2DEXT = (PFNGLTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DEXT")) == NULL) || r; - r = ((glTextureImage3DEXT = (PFNGLTEXTUREIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DEXT")) == NULL) || r; - r = ((glTextureParameterIivEXT = (PFNGLTEXTUREPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIivEXT")) == NULL) || r; - r = ((glTextureParameterIuivEXT = (PFNGLTEXTUREPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIuivEXT")) == NULL) || r; - r = ((glTextureParameterfEXT = (PFNGLTEXTUREPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfEXT")) == NULL) || r; - r = ((glTextureParameterfvEXT = (PFNGLTEXTUREPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfvEXT")) == NULL) || r; - r = ((glTextureParameteriEXT = (PFNGLTEXTUREPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteriEXT")) == NULL) || r; - r = ((glTextureParameterivEXT = (PFNGLTEXTUREPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterivEXT")) == NULL) || r; - r = ((glTextureRenderbufferEXT = (PFNGLTEXTURERENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTextureRenderbufferEXT")) == NULL) || r; - r = ((glTextureSubImage1DEXT = (PFNGLTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage1DEXT")) == NULL) || r; - r = ((glTextureSubImage2DEXT = (PFNGLTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage2DEXT")) == NULL) || r; - r = ((glTextureSubImage3DEXT = (PFNGLTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage3DEXT")) == NULL) || r; - r = ((glUnmapNamedBufferEXT = (PFNGLUNMAPNAMEDBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glUnmapNamedBufferEXT")) == NULL) || r; - r = ((glVertexArrayColorOffsetEXT = (PFNGLVERTEXARRAYCOLOROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayColorOffsetEXT")) == NULL) || r; - r = ((glVertexArrayEdgeFlagOffsetEXT = (PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayEdgeFlagOffsetEXT")) == NULL) || r; - r = ((glVertexArrayFogCoordOffsetEXT = (PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayFogCoordOffsetEXT")) == NULL) || r; - r = ((glVertexArrayIndexOffsetEXT = (PFNGLVERTEXARRAYINDEXOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayIndexOffsetEXT")) == NULL) || r; - r = ((glVertexArrayMultiTexCoordOffsetEXT = (PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayMultiTexCoordOffsetEXT")) == NULL) || r; - r = ((glVertexArrayNormalOffsetEXT = (PFNGLVERTEXARRAYNORMALOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayNormalOffsetEXT")) == NULL) || r; - r = ((glVertexArraySecondaryColorOffsetEXT = (PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArraySecondaryColorOffsetEXT")) == NULL) || r; - r = ((glVertexArrayTexCoordOffsetEXT = (PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayTexCoordOffsetEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribDivisorEXT = (PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribDivisorEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribIOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribIOffsetEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribOffsetEXT")) == NULL) || r; - r = ((glVertexArrayVertexOffsetEXT = (PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexOffsetEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_direct_state_access */ - -#ifdef GL_EXT_draw_buffers2 - -static GLboolean _glewInit_GL_EXT_draw_buffers2 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glColorMaskIndexedEXT = (PFNGLCOLORMASKINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glColorMaskIndexedEXT")) == NULL) || r; - r = ((glDisableIndexedEXT = (PFNGLDISABLEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableIndexedEXT")) == NULL) || r; - r = ((glEnableIndexedEXT = (PFNGLENABLEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableIndexedEXT")) == NULL) || r; - r = ((glGetBooleanIndexedvEXT = (PFNGLGETBOOLEANINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetBooleanIndexedvEXT")) == NULL) || r; - r = ((glGetIntegerIndexedvEXT = (PFNGLGETINTEGERINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerIndexedvEXT")) == NULL) || r; - r = ((glIsEnabledIndexedEXT = (PFNGLISENABLEDINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glIsEnabledIndexedEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_draw_buffers2 */ - -#ifdef GL_EXT_draw_instanced - -static GLboolean _glewInit_GL_EXT_draw_instanced (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDrawArraysInstancedEXT = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedEXT")) == NULL) || r; - r = ((glDrawElementsInstancedEXT = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_draw_instanced */ - -#ifdef GL_EXT_draw_range_elements - -static GLboolean _glewInit_GL_EXT_draw_range_elements (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDrawRangeElementsEXT = (PFNGLDRAWRANGEELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_draw_range_elements */ - -#ifdef GL_EXT_fog_coord - -static GLboolean _glewInit_GL_EXT_fog_coord (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFogCoordPointerEXT = (PFNGLFOGCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointerEXT")) == NULL) || r; - r = ((glFogCoorddEXT = (PFNGLFOGCOORDDEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddEXT")) == NULL) || r; - r = ((glFogCoorddvEXT = (PFNGLFOGCOORDDVEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddvEXT")) == NULL) || r; - r = ((glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfEXT")) == NULL) || r; - r = ((glFogCoordfvEXT = (PFNGLFOGCOORDFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfvEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_fog_coord */ - -#ifdef GL_EXT_fragment_lighting - -static GLboolean _glewInit_GL_EXT_fragment_lighting (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFragmentColorMaterialEXT = (PFNGLFRAGMENTCOLORMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentColorMaterialEXT")) == NULL) || r; - r = ((glFragmentLightModelfEXT = (PFNGLFRAGMENTLIGHTMODELFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfEXT")) == NULL) || r; - r = ((glFragmentLightModelfvEXT = (PFNGLFRAGMENTLIGHTMODELFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfvEXT")) == NULL) || r; - r = ((glFragmentLightModeliEXT = (PFNGLFRAGMENTLIGHTMODELIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModeliEXT")) == NULL) || r; - r = ((glFragmentLightModelivEXT = (PFNGLFRAGMENTLIGHTMODELIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelivEXT")) == NULL) || r; - r = ((glFragmentLightfEXT = (PFNGLFRAGMENTLIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfEXT")) == NULL) || r; - r = ((glFragmentLightfvEXT = (PFNGLFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfvEXT")) == NULL) || r; - r = ((glFragmentLightiEXT = (PFNGLFRAGMENTLIGHTIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightiEXT")) == NULL) || r; - r = ((glFragmentLightivEXT = (PFNGLFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightivEXT")) == NULL) || r; - r = ((glFragmentMaterialfEXT = (PFNGLFRAGMENTMATERIALFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfEXT")) == NULL) || r; - r = ((glFragmentMaterialfvEXT = (PFNGLFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfvEXT")) == NULL) || r; - r = ((glFragmentMaterialiEXT = (PFNGLFRAGMENTMATERIALIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialiEXT")) == NULL) || r; - r = ((glFragmentMaterialivEXT = (PFNGLFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialivEXT")) == NULL) || r; - r = ((glGetFragmentLightfvEXT = (PFNGLGETFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightfvEXT")) == NULL) || r; - r = ((glGetFragmentLightivEXT = (PFNGLGETFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightivEXT")) == NULL) || r; - r = ((glGetFragmentMaterialfvEXT = (PFNGLGETFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialfvEXT")) == NULL) || r; - r = ((glGetFragmentMaterialivEXT = (PFNGLGETFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialivEXT")) == NULL) || r; - r = ((glLightEnviEXT = (PFNGLLIGHTENVIEXTPROC)glewGetProcAddress((const GLubyte*)"glLightEnviEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_fragment_lighting */ - -#ifdef GL_EXT_framebuffer_blit - -static GLboolean _glewInit_GL_EXT_framebuffer_blit (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_framebuffer_blit */ - -#ifdef GL_EXT_framebuffer_multisample - -static GLboolean _glewInit_GL_EXT_framebuffer_multisample (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_framebuffer_multisample */ - -#ifdef GL_EXT_framebuffer_object - -static GLboolean _glewInit_GL_EXT_framebuffer_object (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindFramebufferEXT")) == NULL) || r; - r = ((glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindRenderbufferEXT")) == NULL) || r; - r = ((glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)glewGetProcAddress((const GLubyte*)"glCheckFramebufferStatusEXT")) == NULL) || r; - r = ((glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffersEXT")) == NULL) || r; - r = ((glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffersEXT")) == NULL) || r; - r = ((glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbufferEXT")) == NULL) || r; - r = ((glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture1DEXT")) == NULL) || r; - r = ((glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2DEXT")) == NULL) || r; - r = ((glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3DEXT")) == NULL) || r; - r = ((glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenFramebuffersEXT")) == NULL) || r; - r = ((glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenRenderbuffersEXT")) == NULL) || r; - r = ((glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateMipmapEXT")) == NULL) || r; - r = ((glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferAttachmentParameterivEXT")) == NULL) || r; - r = ((glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetRenderbufferParameterivEXT")) == NULL) || r; - r = ((glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glIsFramebufferEXT")) == NULL) || r; - r = ((glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glIsRenderbufferEXT")) == NULL) || r; - r = ((glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_framebuffer_object */ - -#ifdef GL_EXT_geometry_shader4 - -static GLboolean _glewInit_GL_EXT_geometry_shader4 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureEXT")) == NULL) || r; - r = ((glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureFaceEXT")) == NULL) || r; - r = ((glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteriEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_geometry_shader4 */ - -#ifdef GL_EXT_gpu_program_parameters - -static GLboolean _glewInit_GL_EXT_gpu_program_parameters (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glProgramEnvParameters4fvEXT = (PFNGLPROGRAMENVPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameters4fvEXT")) == NULL) || r; - r = ((glProgramLocalParameters4fvEXT = (PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameters4fvEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_gpu_program_parameters */ - -#ifdef GL_EXT_gpu_shader4 - -static GLboolean _glewInit_GL_EXT_gpu_shader4 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindFragDataLocationEXT = (PFNGLBINDFRAGDATALOCATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationEXT")) == NULL) || r; - r = ((glGetFragDataLocationEXT = (PFNGLGETFRAGDATALOCATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataLocationEXT")) == NULL) || r; - r = ((glGetUniformuivEXT = (PFNGLGETUNIFORMUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformuivEXT")) == NULL) || r; - r = ((glGetVertexAttribIivEXT = (PFNGLGETVERTEXATTRIBIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIivEXT")) == NULL) || r; - r = ((glGetVertexAttribIuivEXT = (PFNGLGETVERTEXATTRIBIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIuivEXT")) == NULL) || r; - r = ((glUniform1uiEXT = (PFNGLUNIFORM1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform1uiEXT")) == NULL) || r; - r = ((glUniform1uivEXT = (PFNGLUNIFORM1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform1uivEXT")) == NULL) || r; - r = ((glUniform2uiEXT = (PFNGLUNIFORM2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform2uiEXT")) == NULL) || r; - r = ((glUniform2uivEXT = (PFNGLUNIFORM2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform2uivEXT")) == NULL) || r; - r = ((glUniform3uiEXT = (PFNGLUNIFORM3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform3uiEXT")) == NULL) || r; - r = ((glUniform3uivEXT = (PFNGLUNIFORM3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform3uivEXT")) == NULL) || r; - r = ((glUniform4uiEXT = (PFNGLUNIFORM4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform4uiEXT")) == NULL) || r; - r = ((glUniform4uivEXT = (PFNGLUNIFORM4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform4uivEXT")) == NULL) || r; - r = ((glVertexAttribI1iEXT = (PFNGLVERTEXATTRIBI1IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1iEXT")) == NULL) || r; - r = ((glVertexAttribI1ivEXT = (PFNGLVERTEXATTRIBI1IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1ivEXT")) == NULL) || r; - r = ((glVertexAttribI1uiEXT = (PFNGLVERTEXATTRIBI1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uiEXT")) == NULL) || r; - r = ((glVertexAttribI1uivEXT = (PFNGLVERTEXATTRIBI1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uivEXT")) == NULL) || r; - r = ((glVertexAttribI2iEXT = (PFNGLVERTEXATTRIBI2IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2iEXT")) == NULL) || r; - r = ((glVertexAttribI2ivEXT = (PFNGLVERTEXATTRIBI2IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2ivEXT")) == NULL) || r; - r = ((glVertexAttribI2uiEXT = (PFNGLVERTEXATTRIBI2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uiEXT")) == NULL) || r; - r = ((glVertexAttribI2uivEXT = (PFNGLVERTEXATTRIBI2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uivEXT")) == NULL) || r; - r = ((glVertexAttribI3iEXT = (PFNGLVERTEXATTRIBI3IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3iEXT")) == NULL) || r; - r = ((glVertexAttribI3ivEXT = (PFNGLVERTEXATTRIBI3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3ivEXT")) == NULL) || r; - r = ((glVertexAttribI3uiEXT = (PFNGLVERTEXATTRIBI3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uiEXT")) == NULL) || r; - r = ((glVertexAttribI3uivEXT = (PFNGLVERTEXATTRIBI3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uivEXT")) == NULL) || r; - r = ((glVertexAttribI4bvEXT = (PFNGLVERTEXATTRIBI4BVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4bvEXT")) == NULL) || r; - r = ((glVertexAttribI4iEXT = (PFNGLVERTEXATTRIBI4IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4iEXT")) == NULL) || r; - r = ((glVertexAttribI4ivEXT = (PFNGLVERTEXATTRIBI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ivEXT")) == NULL) || r; - r = ((glVertexAttribI4svEXT = (PFNGLVERTEXATTRIBI4SVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4svEXT")) == NULL) || r; - r = ((glVertexAttribI4ubvEXT = (PFNGLVERTEXATTRIBI4UBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ubvEXT")) == NULL) || r; - r = ((glVertexAttribI4uiEXT = (PFNGLVERTEXATTRIBI4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uiEXT")) == NULL) || r; - r = ((glVertexAttribI4uivEXT = (PFNGLVERTEXATTRIBI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uivEXT")) == NULL) || r; - r = ((glVertexAttribI4usvEXT = (PFNGLVERTEXATTRIBI4USVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4usvEXT")) == NULL) || r; - r = ((glVertexAttribIPointerEXT = (PFNGLVERTEXATTRIBIPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIPointerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_gpu_shader4 */ - -#ifdef GL_EXT_histogram - -static GLboolean _glewInit_GL_EXT_histogram (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetHistogramEXT = (PFNGLGETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramEXT")) == NULL) || r; - r = ((glGetHistogramParameterfvEXT = (PFNGLGETHISTOGRAMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterfvEXT")) == NULL) || r; - r = ((glGetHistogramParameterivEXT = (PFNGLGETHISTOGRAMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterivEXT")) == NULL) || r; - r = ((glGetMinmaxEXT = (PFNGLGETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxEXT")) == NULL) || r; - r = ((glGetMinmaxParameterfvEXT = (PFNGLGETMINMAXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterfvEXT")) == NULL) || r; - r = ((glGetMinmaxParameterivEXT = (PFNGLGETMINMAXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterivEXT")) == NULL) || r; - r = ((glHistogramEXT = (PFNGLHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glHistogramEXT")) == NULL) || r; - r = ((glMinmaxEXT = (PFNGLMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glMinmaxEXT")) == NULL) || r; - r = ((glResetHistogramEXT = (PFNGLRESETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glResetHistogramEXT")) == NULL) || r; - r = ((glResetMinmaxEXT = (PFNGLRESETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glResetMinmaxEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_histogram */ - -#ifdef GL_EXT_index_func - -static GLboolean _glewInit_GL_EXT_index_func (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glIndexFuncEXT = (PFNGLINDEXFUNCEXTPROC)glewGetProcAddress((const GLubyte*)"glIndexFuncEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_index_func */ - -#ifdef GL_EXT_index_material - -static GLboolean _glewInit_GL_EXT_index_material (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glIndexMaterialEXT = (PFNGLINDEXMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glIndexMaterialEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_index_material */ - -#ifdef GL_EXT_light_texture - -static GLboolean _glewInit_GL_EXT_light_texture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glApplyTextureEXT = (PFNGLAPPLYTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glApplyTextureEXT")) == NULL) || r; - r = ((glTextureLightEXT = (PFNGLTEXTURELIGHTEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureLightEXT")) == NULL) || r; - r = ((glTextureMaterialEXT = (PFNGLTEXTUREMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureMaterialEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_light_texture */ - -#ifdef GL_EXT_multi_draw_arrays - -static GLboolean _glewInit_GL_EXT_multi_draw_arrays (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glMultiDrawArraysEXT = (PFNGLMULTIDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysEXT")) == NULL) || r; - r = ((glMultiDrawElementsEXT = (PFNGLMULTIDRAWELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_multi_draw_arrays */ - -#ifdef GL_EXT_multisample - -static GLboolean _glewInit_GL_EXT_multisample (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glSampleMaskEXT = (PFNGLSAMPLEMASKEXTPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskEXT")) == NULL) || r; - r = ((glSamplePatternEXT = (PFNGLSAMPLEPATTERNEXTPROC)glewGetProcAddress((const GLubyte*)"glSamplePatternEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_multisample */ - -#ifdef GL_EXT_paletted_texture - -static GLboolean _glewInit_GL_EXT_paletted_texture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glColorTableEXT = (PFNGLCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glColorTableEXT")) == NULL) || r; - r = ((glGetColorTableEXT = (PFNGLGETCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableEXT")) == NULL) || r; - r = ((glGetColorTableParameterfvEXT = (PFNGLGETCOLORTABLEPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfvEXT")) == NULL) || r; - r = ((glGetColorTableParameterivEXT = (PFNGLGETCOLORTABLEPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterivEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_paletted_texture */ - -#ifdef GL_EXT_pixel_transform - -static GLboolean _glewInit_GL_EXT_pixel_transform (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetPixelTransformParameterfvEXT = (PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterfvEXT")) == NULL) || r; - r = ((glGetPixelTransformParameterivEXT = (PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterivEXT")) == NULL) || r; - r = ((glPixelTransformParameterfEXT = (PFNGLPIXELTRANSFORMPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfEXT")) == NULL) || r; - r = ((glPixelTransformParameterfvEXT = (PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfvEXT")) == NULL) || r; - r = ((glPixelTransformParameteriEXT = (PFNGLPIXELTRANSFORMPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameteriEXT")) == NULL) || r; - r = ((glPixelTransformParameterivEXT = (PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterivEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_pixel_transform */ - -#ifdef GL_EXT_point_parameters - -static GLboolean _glewInit_GL_EXT_point_parameters (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glPointParameterfEXT = (PFNGLPOINTPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfEXT")) == NULL) || r; - r = ((glPointParameterfvEXT = (PFNGLPOINTPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfvEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_point_parameters */ - -#ifdef GL_EXT_polygon_offset - -static GLboolean _glewInit_GL_EXT_polygon_offset (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glPolygonOffsetEXT = (PFNGLPOLYGONOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_polygon_offset */ - -#ifdef GL_EXT_polygon_offset_clamp - -static GLboolean _glewInit_GL_EXT_polygon_offset_clamp (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glPolygonOffsetClampEXT = (PFNGLPOLYGONOFFSETCLAMPEXTPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetClampEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_polygon_offset_clamp */ - -#ifdef GL_EXT_provoking_vertex - -static GLboolean _glewInit_GL_EXT_provoking_vertex (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glProvokingVertexEXT = (PFNGLPROVOKINGVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glProvokingVertexEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_provoking_vertex */ - -#ifdef GL_EXT_raster_multisample - -static GLboolean _glewInit_GL_EXT_raster_multisample (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glCoverageModulationNV = (PFNGLCOVERAGEMODULATIONNVPROC)glewGetProcAddress((const GLubyte*)"glCoverageModulationNV")) == NULL) || r; - r = ((glCoverageModulationTableNV = (PFNGLCOVERAGEMODULATIONTABLENVPROC)glewGetProcAddress((const GLubyte*)"glCoverageModulationTableNV")) == NULL) || r; - r = ((glGetCoverageModulationTableNV = (PFNGLGETCOVERAGEMODULATIONTABLENVPROC)glewGetProcAddress((const GLubyte*)"glGetCoverageModulationTableNV")) == NULL) || r; - r = ((glRasterSamplesEXT = (PFNGLRASTERSAMPLESEXTPROC)glewGetProcAddress((const GLubyte*)"glRasterSamplesEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_raster_multisample */ - -#ifdef GL_EXT_scene_marker - -static GLboolean _glewInit_GL_EXT_scene_marker (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBeginSceneEXT = (PFNGLBEGINSCENEEXTPROC)glewGetProcAddress((const GLubyte*)"glBeginSceneEXT")) == NULL) || r; - r = ((glEndSceneEXT = (PFNGLENDSCENEEXTPROC)glewGetProcAddress((const GLubyte*)"glEndSceneEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_scene_marker */ - -#ifdef GL_EXT_secondary_color - -static GLboolean _glewInit_GL_EXT_secondary_color (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glSecondaryColor3bEXT = (PFNGLSECONDARYCOLOR3BEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bEXT")) == NULL) || r; - r = ((glSecondaryColor3bvEXT = (PFNGLSECONDARYCOLOR3BVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bvEXT")) == NULL) || r; - r = ((glSecondaryColor3dEXT = (PFNGLSECONDARYCOLOR3DEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dEXT")) == NULL) || r; - r = ((glSecondaryColor3dvEXT = (PFNGLSECONDARYCOLOR3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dvEXT")) == NULL) || r; - r = ((glSecondaryColor3fEXT = (PFNGLSECONDARYCOLOR3FEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fEXT")) == NULL) || r; - r = ((glSecondaryColor3fvEXT = (PFNGLSECONDARYCOLOR3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fvEXT")) == NULL) || r; - r = ((glSecondaryColor3iEXT = (PFNGLSECONDARYCOLOR3IEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3iEXT")) == NULL) || r; - r = ((glSecondaryColor3ivEXT = (PFNGLSECONDARYCOLOR3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ivEXT")) == NULL) || r; - r = ((glSecondaryColor3sEXT = (PFNGLSECONDARYCOLOR3SEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3sEXT")) == NULL) || r; - r = ((glSecondaryColor3svEXT = (PFNGLSECONDARYCOLOR3SVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3svEXT")) == NULL) || r; - r = ((glSecondaryColor3ubEXT = (PFNGLSECONDARYCOLOR3UBEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubEXT")) == NULL) || r; - r = ((glSecondaryColor3ubvEXT = (PFNGLSECONDARYCOLOR3UBVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubvEXT")) == NULL) || r; - r = ((glSecondaryColor3uiEXT = (PFNGLSECONDARYCOLOR3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uiEXT")) == NULL) || r; - r = ((glSecondaryColor3uivEXT = (PFNGLSECONDARYCOLOR3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uivEXT")) == NULL) || r; - r = ((glSecondaryColor3usEXT = (PFNGLSECONDARYCOLOR3USEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usEXT")) == NULL) || r; - r = ((glSecondaryColor3usvEXT = (PFNGLSECONDARYCOLOR3USVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usvEXT")) == NULL) || r; - r = ((glSecondaryColorPointerEXT = (PFNGLSECONDARYCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_secondary_color */ - -#ifdef GL_EXT_separate_shader_objects - -static GLboolean _glewInit_GL_EXT_separate_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glActiveProgramEXT = (PFNGLACTIVEPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glActiveProgramEXT")) == NULL) || r; - r = ((glCreateShaderProgramEXT = (PFNGLCREATESHADERPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderProgramEXT")) == NULL) || r; - r = ((glUseShaderProgramEXT = (PFNGLUSESHADERPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glUseShaderProgramEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_separate_shader_objects */ - -#ifdef GL_EXT_shader_image_load_store - -static GLboolean _glewInit_GL_EXT_shader_image_load_store (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindImageTextureEXT = (PFNGLBINDIMAGETEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindImageTextureEXT")) == NULL) || r; - r = ((glMemoryBarrierEXT = (PFNGLMEMORYBARRIEREXTPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrierEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_shader_image_load_store */ - -#ifdef GL_EXT_stencil_two_side - -static GLboolean _glewInit_GL_EXT_stencil_two_side (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glActiveStencilFaceEXT = (PFNGLACTIVESTENCILFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glActiveStencilFaceEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_stencil_two_side */ - -#ifdef GL_EXT_subtexture - -static GLboolean _glewInit_GL_EXT_subtexture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage1DEXT")) == NULL) || r; - r = ((glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage2DEXT")) == NULL) || r; - r = ((glTexSubImage3DEXT = (PFNGLTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3DEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_subtexture */ - -#ifdef GL_EXT_texture3D - -static GLboolean _glewInit_GL_EXT_texture3D (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTexImage3DEXT = (PFNGLTEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture3D */ - -#ifdef GL_EXT_texture_array - -static GLboolean _glewInit_GL_EXT_texture_array (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture_array */ - -#ifdef GL_EXT_texture_buffer_object - -static GLboolean _glewInit_GL_EXT_texture_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTexBufferEXT = (PFNGLTEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTexBufferEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture_buffer_object */ - -#ifdef GL_EXT_texture_integer - -static GLboolean _glewInit_GL_EXT_texture_integer (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glClearColorIiEXT = (PFNGLCLEARCOLORIIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearColorIiEXT")) == NULL) || r; - r = ((glClearColorIuiEXT = (PFNGLCLEARCOLORIUIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearColorIuiEXT")) == NULL) || r; - r = ((glGetTexParameterIivEXT = (PFNGLGETTEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIivEXT")) == NULL) || r; - r = ((glGetTexParameterIuivEXT = (PFNGLGETTEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIuivEXT")) == NULL) || r; - r = ((glTexParameterIivEXT = (PFNGLTEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIivEXT")) == NULL) || r; - r = ((glTexParameterIuivEXT = (PFNGLTEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIuivEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture_integer */ - -#ifdef GL_EXT_texture_object - -static GLboolean _glewInit_GL_EXT_texture_object (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glAreTexturesResidentEXT = (PFNGLARETEXTURESRESIDENTEXTPROC)glewGetProcAddress((const GLubyte*)"glAreTexturesResidentEXT")) == NULL) || r; - r = ((glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindTextureEXT")) == NULL) || r; - r = ((glDeleteTexturesEXT = (PFNGLDELETETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteTexturesEXT")) == NULL) || r; - r = ((glGenTexturesEXT = (PFNGLGENTEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glGenTexturesEXT")) == NULL) || r; - r = ((glIsTextureEXT = (PFNGLISTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glIsTextureEXT")) == NULL) || r; - r = ((glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glPrioritizeTexturesEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture_object */ - -#ifdef GL_EXT_texture_perturb_normal - -static GLboolean _glewInit_GL_EXT_texture_perturb_normal (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTextureNormalEXT = (PFNGLTEXTURENORMALEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureNormalEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture_perturb_normal */ - -#ifdef GL_EXT_timer_query - -static GLboolean _glewInit_GL_EXT_timer_query (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetQueryObjecti64vEXT = (PFNGLGETQUERYOBJECTI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64vEXT")) == NULL) || r; - r = ((glGetQueryObjectui64vEXT = (PFNGLGETQUERYOBJECTUI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64vEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_timer_query */ - -#ifdef GL_EXT_transform_feedback - -static GLboolean _glewInit_GL_EXT_transform_feedback (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBeginTransformFeedbackEXT = (PFNGLBEGINTRANSFORMFEEDBACKEXTPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedbackEXT")) == NULL) || r; - r = ((glBindBufferBaseEXT = (PFNGLBINDBUFFERBASEEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBaseEXT")) == NULL) || r; - r = ((glBindBufferOffsetEXT = (PFNGLBINDBUFFEROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferOffsetEXT")) == NULL) || r; - r = ((glBindBufferRangeEXT = (PFNGLBINDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRangeEXT")) == NULL) || r; - r = ((glEndTransformFeedbackEXT = (PFNGLENDTRANSFORMFEEDBACKEXTPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedbackEXT")) == NULL) || r; - r = ((glGetTransformFeedbackVaryingEXT = (PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVaryingEXT")) == NULL) || r; - r = ((glTransformFeedbackVaryingsEXT = (PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryingsEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_transform_feedback */ - -#ifdef GL_EXT_vertex_array - -static GLboolean _glewInit_GL_EXT_vertex_array (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glArrayElementEXT")) == NULL) || r; - r = ((glColorPointerEXT = (PFNGLCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glColorPointerEXT")) == NULL) || r; - r = ((glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysEXT")) == NULL) || r; - r = ((glEdgeFlagPointerEXT = (PFNGLEDGEFLAGPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagPointerEXT")) == NULL) || r; - r = ((glIndexPointerEXT = (PFNGLINDEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glIndexPointerEXT")) == NULL) || r; - r = ((glNormalPointerEXT = (PFNGLNORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glNormalPointerEXT")) == NULL) || r; - r = ((glTexCoordPointerEXT = (PFNGLTEXCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointerEXT")) == NULL) || r; - r = ((glVertexPointerEXT = (PFNGLVERTEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexPointerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_vertex_array */ - -#ifdef GL_EXT_vertex_attrib_64bit - -static GLboolean _glewInit_GL_EXT_vertex_attrib_64bit (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetVertexAttribLdvEXT = (PFNGLGETVERTEXATTRIBLDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLdvEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribLOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribLOffsetEXT")) == NULL) || r; - r = ((glVertexAttribL1dEXT = (PFNGLVERTEXATTRIBL1DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dEXT")) == NULL) || r; - r = ((glVertexAttribL1dvEXT = (PFNGLVERTEXATTRIBL1DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dvEXT")) == NULL) || r; - r = ((glVertexAttribL2dEXT = (PFNGLVERTEXATTRIBL2DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dEXT")) == NULL) || r; - r = ((glVertexAttribL2dvEXT = (PFNGLVERTEXATTRIBL2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dvEXT")) == NULL) || r; - r = ((glVertexAttribL3dEXT = (PFNGLVERTEXATTRIBL3DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dEXT")) == NULL) || r; - r = ((glVertexAttribL3dvEXT = (PFNGLVERTEXATTRIBL3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dvEXT")) == NULL) || r; - r = ((glVertexAttribL4dEXT = (PFNGLVERTEXATTRIBL4DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dEXT")) == NULL) || r; - r = ((glVertexAttribL4dvEXT = (PFNGLVERTEXATTRIBL4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dvEXT")) == NULL) || r; - r = ((glVertexAttribLPointerEXT = (PFNGLVERTEXATTRIBLPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLPointerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_vertex_attrib_64bit */ - -#ifdef GL_EXT_vertex_shader - -static GLboolean _glewInit_GL_EXT_vertex_shader (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBeginVertexShaderEXT = (PFNGLBEGINVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glBeginVertexShaderEXT")) == NULL) || r; - r = ((glBindLightParameterEXT = (PFNGLBINDLIGHTPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindLightParameterEXT")) == NULL) || r; - r = ((glBindMaterialParameterEXT = (PFNGLBINDMATERIALPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindMaterialParameterEXT")) == NULL) || r; - r = ((glBindParameterEXT = (PFNGLBINDPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindParameterEXT")) == NULL) || r; - r = ((glBindTexGenParameterEXT = (PFNGLBINDTEXGENPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindTexGenParameterEXT")) == NULL) || r; - r = ((glBindTextureUnitParameterEXT = (PFNGLBINDTEXTUREUNITPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindTextureUnitParameterEXT")) == NULL) || r; - r = ((glBindVertexShaderEXT = (PFNGLBINDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindVertexShaderEXT")) == NULL) || r; - r = ((glDeleteVertexShaderEXT = (PFNGLDELETEVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexShaderEXT")) == NULL) || r; - r = ((glDisableVariantClientStateEXT = (PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVariantClientStateEXT")) == NULL) || r; - r = ((glEnableVariantClientStateEXT = (PFNGLENABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVariantClientStateEXT")) == NULL) || r; - r = ((glEndVertexShaderEXT = (PFNGLENDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glEndVertexShaderEXT")) == NULL) || r; - r = ((glExtractComponentEXT = (PFNGLEXTRACTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)"glExtractComponentEXT")) == NULL) || r; - r = ((glGenSymbolsEXT = (PFNGLGENSYMBOLSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenSymbolsEXT")) == NULL) || r; - r = ((glGenVertexShadersEXT = (PFNGLGENVERTEXSHADERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenVertexShadersEXT")) == NULL) || r; - r = ((glGetInvariantBooleanvEXT = (PFNGLGETINVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantBooleanvEXT")) == NULL) || r; - r = ((glGetInvariantFloatvEXT = (PFNGLGETINVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantFloatvEXT")) == NULL) || r; - r = ((glGetInvariantIntegervEXT = (PFNGLGETINVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantIntegervEXT")) == NULL) || r; - r = ((glGetLocalConstantBooleanvEXT = (PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantBooleanvEXT")) == NULL) || r; - r = ((glGetLocalConstantFloatvEXT = (PFNGLGETLOCALCONSTANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantFloatvEXT")) == NULL) || r; - r = ((glGetLocalConstantIntegervEXT = (PFNGLGETLOCALCONSTANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantIntegervEXT")) == NULL) || r; - r = ((glGetVariantBooleanvEXT = (PFNGLGETVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantBooleanvEXT")) == NULL) || r; - r = ((glGetVariantFloatvEXT = (PFNGLGETVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantFloatvEXT")) == NULL) || r; - r = ((glGetVariantIntegervEXT = (PFNGLGETVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantIntegervEXT")) == NULL) || r; - r = ((glGetVariantPointervEXT = (PFNGLGETVARIANTPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantPointervEXT")) == NULL) || r; - r = ((glInsertComponentEXT = (PFNGLINSERTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)"glInsertComponentEXT")) == NULL) || r; - r = ((glIsVariantEnabledEXT = (PFNGLISVARIANTENABLEDEXTPROC)glewGetProcAddress((const GLubyte*)"glIsVariantEnabledEXT")) == NULL) || r; - r = ((glSetInvariantEXT = (PFNGLSETINVARIANTEXTPROC)glewGetProcAddress((const GLubyte*)"glSetInvariantEXT")) == NULL) || r; - r = ((glSetLocalConstantEXT = (PFNGLSETLOCALCONSTANTEXTPROC)glewGetProcAddress((const GLubyte*)"glSetLocalConstantEXT")) == NULL) || r; - r = ((glShaderOp1EXT = (PFNGLSHADEROP1EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp1EXT")) == NULL) || r; - r = ((glShaderOp2EXT = (PFNGLSHADEROP2EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp2EXT")) == NULL) || r; - r = ((glShaderOp3EXT = (PFNGLSHADEROP3EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp3EXT")) == NULL) || r; - r = ((glSwizzleEXT = (PFNGLSWIZZLEEXTPROC)glewGetProcAddress((const GLubyte*)"glSwizzleEXT")) == NULL) || r; - r = ((glVariantPointerEXT = (PFNGLVARIANTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVariantPointerEXT")) == NULL) || r; - r = ((glVariantbvEXT = (PFNGLVARIANTBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantbvEXT")) == NULL) || r; - r = ((glVariantdvEXT = (PFNGLVARIANTDVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantdvEXT")) == NULL) || r; - r = ((glVariantfvEXT = (PFNGLVARIANTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantfvEXT")) == NULL) || r; - r = ((glVariantivEXT = (PFNGLVARIANTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantivEXT")) == NULL) || r; - r = ((glVariantsvEXT = (PFNGLVARIANTSVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantsvEXT")) == NULL) || r; - r = ((glVariantubvEXT = (PFNGLVARIANTUBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantubvEXT")) == NULL) || r; - r = ((glVariantuivEXT = (PFNGLVARIANTUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantuivEXT")) == NULL) || r; - r = ((glVariantusvEXT = (PFNGLVARIANTUSVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantusvEXT")) == NULL) || r; - r = ((glWriteMaskEXT = (PFNGLWRITEMASKEXTPROC)glewGetProcAddress((const GLubyte*)"glWriteMaskEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_vertex_shader */ - -#ifdef GL_EXT_vertex_weighting - -static GLboolean _glewInit_GL_EXT_vertex_weighting (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glVertexWeightPointerEXT = (PFNGLVERTEXWEIGHTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightPointerEXT")) == NULL) || r; - r = ((glVertexWeightfEXT = (PFNGLVERTEXWEIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightfEXT")) == NULL) || r; - r = ((glVertexWeightfvEXT = (PFNGLVERTEXWEIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightfvEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_vertex_weighting */ - -#ifdef GL_EXT_x11_sync_object - -static GLboolean _glewInit_GL_EXT_x11_sync_object (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glImportSyncEXT = (PFNGLIMPORTSYNCEXTPROC)glewGetProcAddress((const GLubyte*)"glImportSyncEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_x11_sync_object */ - -#ifdef GL_GREMEDY_frame_terminator - -static GLboolean _glewInit_GL_GREMEDY_frame_terminator (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFrameTerminatorGREMEDY = (PFNGLFRAMETERMINATORGREMEDYPROC)glewGetProcAddress((const GLubyte*)"glFrameTerminatorGREMEDY")) == NULL) || r; - - return r; -} - -#endif /* GL_GREMEDY_frame_terminator */ - -#ifdef GL_GREMEDY_string_marker - -static GLboolean _glewInit_GL_GREMEDY_string_marker (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glStringMarkerGREMEDY = (PFNGLSTRINGMARKERGREMEDYPROC)glewGetProcAddress((const GLubyte*)"glStringMarkerGREMEDY")) == NULL) || r; - - return r; -} - -#endif /* GL_GREMEDY_string_marker */ - -#ifdef GL_HP_image_transform - -static GLboolean _glewInit_GL_HP_image_transform (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetImageTransformParameterfvHP = (PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)"glGetImageTransformParameterfvHP")) == NULL) || r; - r = ((glGetImageTransformParameterivHP = (PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)"glGetImageTransformParameterivHP")) == NULL) || r; - r = ((glImageTransformParameterfHP = (PFNGLIMAGETRANSFORMPARAMETERFHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterfHP")) == NULL) || r; - r = ((glImageTransformParameterfvHP = (PFNGLIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterfvHP")) == NULL) || r; - r = ((glImageTransformParameteriHP = (PFNGLIMAGETRANSFORMPARAMETERIHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameteriHP")) == NULL) || r; - r = ((glImageTransformParameterivHP = (PFNGLIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterivHP")) == NULL) || r; - - return r; -} - -#endif /* GL_HP_image_transform */ - -#ifdef GL_IBM_multimode_draw_arrays - -static GLboolean _glewInit_GL_IBM_multimode_draw_arrays (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glMultiModeDrawArraysIBM = (PFNGLMULTIMODEDRAWARRAYSIBMPROC)glewGetProcAddress((const GLubyte*)"glMultiModeDrawArraysIBM")) == NULL) || r; - r = ((glMultiModeDrawElementsIBM = (PFNGLMULTIMODEDRAWELEMENTSIBMPROC)glewGetProcAddress((const GLubyte*)"glMultiModeDrawElementsIBM")) == NULL) || r; - - return r; -} - -#endif /* GL_IBM_multimode_draw_arrays */ - -#ifdef GL_IBM_vertex_array_lists - -static GLboolean _glewInit_GL_IBM_vertex_array_lists (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glColorPointerListIBM = (PFNGLCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glColorPointerListIBM")) == NULL) || r; - r = ((glEdgeFlagPointerListIBM = (PFNGLEDGEFLAGPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagPointerListIBM")) == NULL) || r; - r = ((glFogCoordPointerListIBM = (PFNGLFOGCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointerListIBM")) == NULL) || r; - r = ((glIndexPointerListIBM = (PFNGLINDEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glIndexPointerListIBM")) == NULL) || r; - r = ((glNormalPointerListIBM = (PFNGLNORMALPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glNormalPointerListIBM")) == NULL) || r; - r = ((glSecondaryColorPointerListIBM = (PFNGLSECONDARYCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointerListIBM")) == NULL) || r; - r = ((glTexCoordPointerListIBM = (PFNGLTEXCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointerListIBM")) == NULL) || r; - r = ((glVertexPointerListIBM = (PFNGLVERTEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glVertexPointerListIBM")) == NULL) || r; - - return r; -} - -#endif /* GL_IBM_vertex_array_lists */ - -#ifdef GL_INTEL_map_texture - -static GLboolean _glewInit_GL_INTEL_map_texture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glMapTexture2DINTEL = (PFNGLMAPTEXTURE2DINTELPROC)glewGetProcAddress((const GLubyte*)"glMapTexture2DINTEL")) == NULL) || r; - r = ((glSyncTextureINTEL = (PFNGLSYNCTEXTUREINTELPROC)glewGetProcAddress((const GLubyte*)"glSyncTextureINTEL")) == NULL) || r; - r = ((glUnmapTexture2DINTEL = (PFNGLUNMAPTEXTURE2DINTELPROC)glewGetProcAddress((const GLubyte*)"glUnmapTexture2DINTEL")) == NULL) || r; - - return r; -} - -#endif /* GL_INTEL_map_texture */ - -#ifdef GL_INTEL_parallel_arrays - -static GLboolean _glewInit_GL_INTEL_parallel_arrays (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glColorPointervINTEL = (PFNGLCOLORPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glColorPointervINTEL")) == NULL) || r; - r = ((glNormalPointervINTEL = (PFNGLNORMALPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glNormalPointervINTEL")) == NULL) || r; - r = ((glTexCoordPointervINTEL = (PFNGLTEXCOORDPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointervINTEL")) == NULL) || r; - r = ((glVertexPointervINTEL = (PFNGLVERTEXPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glVertexPointervINTEL")) == NULL) || r; - - return r; -} - -#endif /* GL_INTEL_parallel_arrays */ - -#ifdef GL_INTEL_performance_query - -static GLboolean _glewInit_GL_INTEL_performance_query (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBeginPerfQueryINTEL = (PFNGLBEGINPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glBeginPerfQueryINTEL")) == NULL) || r; - r = ((glCreatePerfQueryINTEL = (PFNGLCREATEPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glCreatePerfQueryINTEL")) == NULL) || r; - r = ((glDeletePerfQueryINTEL = (PFNGLDELETEPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glDeletePerfQueryINTEL")) == NULL) || r; - r = ((glEndPerfQueryINTEL = (PFNGLENDPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glEndPerfQueryINTEL")) == NULL) || r; - r = ((glGetFirstPerfQueryIdINTEL = (PFNGLGETFIRSTPERFQUERYIDINTELPROC)glewGetProcAddress((const GLubyte*)"glGetFirstPerfQueryIdINTEL")) == NULL) || r; - r = ((glGetNextPerfQueryIdINTEL = (PFNGLGETNEXTPERFQUERYIDINTELPROC)glewGetProcAddress((const GLubyte*)"glGetNextPerfQueryIdINTEL")) == NULL) || r; - r = ((glGetPerfCounterInfoINTEL = (PFNGLGETPERFCOUNTERINFOINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfCounterInfoINTEL")) == NULL) || r; - r = ((glGetPerfQueryDataINTEL = (PFNGLGETPERFQUERYDATAINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryDataINTEL")) == NULL) || r; - r = ((glGetPerfQueryIdByNameINTEL = (PFNGLGETPERFQUERYIDBYNAMEINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryIdByNameINTEL")) == NULL) || r; - r = ((glGetPerfQueryInfoINTEL = (PFNGLGETPERFQUERYINFOINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryInfoINTEL")) == NULL) || r; - - return r; -} - -#endif /* GL_INTEL_performance_query */ - -#ifdef GL_INTEL_texture_scissor - -static GLboolean _glewInit_GL_INTEL_texture_scissor (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTexScissorFuncINTEL = (PFNGLTEXSCISSORFUNCINTELPROC)glewGetProcAddress((const GLubyte*)"glTexScissorFuncINTEL")) == NULL) || r; - r = ((glTexScissorINTEL = (PFNGLTEXSCISSORINTELPROC)glewGetProcAddress((const GLubyte*)"glTexScissorINTEL")) == NULL) || r; - - return r; -} - -#endif /* GL_INTEL_texture_scissor */ - -#ifdef GL_KHR_blend_equation_advanced - -static GLboolean _glewInit_GL_KHR_blend_equation_advanced (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBlendBarrierKHR = (PFNGLBLENDBARRIERKHRPROC)glewGetProcAddress((const GLubyte*)"glBlendBarrierKHR")) == NULL) || r; - - return r; -} - -#endif /* GL_KHR_blend_equation_advanced */ - -#ifdef GL_KHR_debug - -static GLboolean _glewInit_GL_KHR_debug (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallback")) == NULL) || r; - r = ((glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageControl")) == NULL) || r; - r = ((glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsert")) == NULL) || r; - r = ((glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLog")) == NULL) || r; - r = ((glGetObjectLabel = (PFNGLGETOBJECTLABELPROC)glewGetProcAddress((const GLubyte*)"glGetObjectLabel")) == NULL) || r; - r = ((glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC)glewGetProcAddress((const GLubyte*)"glGetObjectPtrLabel")) == NULL) || r; - r = ((glObjectLabel = (PFNGLOBJECTLABELPROC)glewGetProcAddress((const GLubyte*)"glObjectLabel")) == NULL) || r; - r = ((glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC)glewGetProcAddress((const GLubyte*)"glObjectPtrLabel")) == NULL) || r; - r = ((glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC)glewGetProcAddress((const GLubyte*)"glPopDebugGroup")) == NULL) || r; - r = ((glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC)glewGetProcAddress((const GLubyte*)"glPushDebugGroup")) == NULL) || r; - - return r; -} - -#endif /* GL_KHR_debug */ - -#ifdef GL_KHR_robustness - -static GLboolean _glewInit_GL_KHR_robustness (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetnUniformfv = (PFNGLGETNUNIFORMFVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformfv")) == NULL) || r; - r = ((glGetnUniformiv = (PFNGLGETNUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformiv")) == NULL) || r; - r = ((glGetnUniformuiv = (PFNGLGETNUNIFORMUIVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformuiv")) == NULL) || r; - r = ((glReadnPixels = (PFNGLREADNPIXELSPROC)glewGetProcAddress((const GLubyte*)"glReadnPixels")) == NULL) || r; - - return r; -} - -#endif /* GL_KHR_robustness */ - -#ifdef GL_KTX_buffer_region - -static GLboolean _glewInit_GL_KTX_buffer_region (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBufferRegionEnabled = (PFNGLBUFFERREGIONENABLEDPROC)glewGetProcAddress((const GLubyte*)"glBufferRegionEnabled")) == NULL) || r; - r = ((glDeleteBufferRegion = (PFNGLDELETEBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glDeleteBufferRegion")) == NULL) || r; - r = ((glDrawBufferRegion = (PFNGLDRAWBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glDrawBufferRegion")) == NULL) || r; - r = ((glNewBufferRegion = (PFNGLNEWBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glNewBufferRegion")) == NULL) || r; - r = ((glReadBufferRegion = (PFNGLREADBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glReadBufferRegion")) == NULL) || r; - - return r; -} - -#endif /* GL_KTX_buffer_region */ - -#ifdef GL_MESA_resize_buffers - -static GLboolean _glewInit_GL_MESA_resize_buffers (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glResizeBuffersMESA = (PFNGLRESIZEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)"glResizeBuffersMESA")) == NULL) || r; - - return r; -} - -#endif /* GL_MESA_resize_buffers */ - -#ifdef GL_MESA_window_pos - -static GLboolean _glewInit_GL_MESA_window_pos (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glWindowPos2dMESA = (PFNGLWINDOWPOS2DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dMESA")) == NULL) || r; - r = ((glWindowPos2dvMESA = (PFNGLWINDOWPOS2DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dvMESA")) == NULL) || r; - r = ((glWindowPos2fMESA = (PFNGLWINDOWPOS2FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fMESA")) == NULL) || r; - r = ((glWindowPos2fvMESA = (PFNGLWINDOWPOS2FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fvMESA")) == NULL) || r; - r = ((glWindowPos2iMESA = (PFNGLWINDOWPOS2IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iMESA")) == NULL) || r; - r = ((glWindowPos2ivMESA = (PFNGLWINDOWPOS2IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2ivMESA")) == NULL) || r; - r = ((glWindowPos2sMESA = (PFNGLWINDOWPOS2SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sMESA")) == NULL) || r; - r = ((glWindowPos2svMESA = (PFNGLWINDOWPOS2SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2svMESA")) == NULL) || r; - r = ((glWindowPos3dMESA = (PFNGLWINDOWPOS3DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dMESA")) == NULL) || r; - r = ((glWindowPos3dvMESA = (PFNGLWINDOWPOS3DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dvMESA")) == NULL) || r; - r = ((glWindowPos3fMESA = (PFNGLWINDOWPOS3FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fMESA")) == NULL) || r; - r = ((glWindowPos3fvMESA = (PFNGLWINDOWPOS3FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fvMESA")) == NULL) || r; - r = ((glWindowPos3iMESA = (PFNGLWINDOWPOS3IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iMESA")) == NULL) || r; - r = ((glWindowPos3ivMESA = (PFNGLWINDOWPOS3IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3ivMESA")) == NULL) || r; - r = ((glWindowPos3sMESA = (PFNGLWINDOWPOS3SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sMESA")) == NULL) || r; - r = ((glWindowPos3svMESA = (PFNGLWINDOWPOS3SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3svMESA")) == NULL) || r; - r = ((glWindowPos4dMESA = (PFNGLWINDOWPOS4DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4dMESA")) == NULL) || r; - r = ((glWindowPos4dvMESA = (PFNGLWINDOWPOS4DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4dvMESA")) == NULL) || r; - r = ((glWindowPos4fMESA = (PFNGLWINDOWPOS4FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4fMESA")) == NULL) || r; - r = ((glWindowPos4fvMESA = (PFNGLWINDOWPOS4FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4fvMESA")) == NULL) || r; - r = ((glWindowPos4iMESA = (PFNGLWINDOWPOS4IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4iMESA")) == NULL) || r; - r = ((glWindowPos4ivMESA = (PFNGLWINDOWPOS4IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4ivMESA")) == NULL) || r; - r = ((glWindowPos4sMESA = (PFNGLWINDOWPOS4SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4sMESA")) == NULL) || r; - r = ((glWindowPos4svMESA = (PFNGLWINDOWPOS4SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4svMESA")) == NULL) || r; - - return r; -} - -#endif /* GL_MESA_window_pos */ - -#ifdef GL_NVX_conditional_render - -static GLboolean _glewInit_GL_NVX_conditional_render (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBeginConditionalRenderNVX = (PFNGLBEGINCONDITIONALRENDERNVXPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRenderNVX")) == NULL) || r; - r = ((glEndConditionalRenderNVX = (PFNGLENDCONDITIONALRENDERNVXPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRenderNVX")) == NULL) || r; - - return r; -} - -#endif /* GL_NVX_conditional_render */ - -#ifdef GL_NV_bindless_multi_draw_indirect - -static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glMultiDrawArraysIndirectBindlessNV = (PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectBindlessNV")) == NULL) || r; - r = ((glMultiDrawElementsIndirectBindlessNV = (PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectBindlessNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_bindless_multi_draw_indirect */ - -#ifdef GL_NV_bindless_multi_draw_indirect_count - -static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect_count (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glMultiDrawArraysIndirectBindlessCountNV = (PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectBindlessCountNV")) == NULL) || r; - r = ((glMultiDrawElementsIndirectBindlessCountNV = (PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectBindlessCountNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_bindless_multi_draw_indirect_count */ - -#ifdef GL_NV_bindless_texture - -static GLboolean _glewInit_GL_NV_bindless_texture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetImageHandleNV = (PFNGLGETIMAGEHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetImageHandleNV")) == NULL) || r; - r = ((glGetTextureHandleNV = (PFNGLGETTEXTUREHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureHandleNV")) == NULL) || r; - r = ((glGetTextureSamplerHandleNV = (PFNGLGETTEXTURESAMPLERHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSamplerHandleNV")) == NULL) || r; - r = ((glIsImageHandleResidentNV = (PFNGLISIMAGEHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsImageHandleResidentNV")) == NULL) || r; - r = ((glIsTextureHandleResidentNV = (PFNGLISTEXTUREHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsTextureHandleResidentNV")) == NULL) || r; - r = ((glMakeImageHandleNonResidentNV = (PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleNonResidentNV")) == NULL) || r; - r = ((glMakeImageHandleResidentNV = (PFNGLMAKEIMAGEHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleResidentNV")) == NULL) || r; - r = ((glMakeTextureHandleNonResidentNV = (PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleNonResidentNV")) == NULL) || r; - r = ((glMakeTextureHandleResidentNV = (PFNGLMAKETEXTUREHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleResidentNV")) == NULL) || r; - r = ((glProgramUniformHandleui64NV = (PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64NV")) == NULL) || r; - r = ((glProgramUniformHandleui64vNV = (PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64vNV")) == NULL) || r; - r = ((glUniformHandleui64NV = (PFNGLUNIFORMHANDLEUI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64NV")) == NULL) || r; - r = ((glUniformHandleui64vNV = (PFNGLUNIFORMHANDLEUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64vNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_bindless_texture */ - -#ifdef GL_NV_blend_equation_advanced - -static GLboolean _glewInit_GL_NV_blend_equation_advanced (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBlendBarrierNV = (PFNGLBLENDBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glBlendBarrierNV")) == NULL) || r; - r = ((glBlendParameteriNV = (PFNGLBLENDPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glBlendParameteriNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_blend_equation_advanced */ - -#ifdef GL_NV_conditional_render - -static GLboolean _glewInit_GL_NV_conditional_render (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBeginConditionalRenderNV = (PFNGLBEGINCONDITIONALRENDERNVPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRenderNV")) == NULL) || r; - r = ((glEndConditionalRenderNV = (PFNGLENDCONDITIONALRENDERNVPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRenderNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_conditional_render */ - -#ifdef GL_NV_conservative_raster - -static GLboolean _glewInit_GL_NV_conservative_raster (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glSubpixelPrecisionBiasNV = (PFNGLSUBPIXELPRECISIONBIASNVPROC)glewGetProcAddress((const GLubyte*)"glSubpixelPrecisionBiasNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_conservative_raster */ - -#ifdef GL_NV_conservative_raster_dilate - -static GLboolean _glewInit_GL_NV_conservative_raster_dilate (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glConservativeRasterParameterfNV = (PFNGLCONSERVATIVERASTERPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glConservativeRasterParameterfNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_conservative_raster_dilate */ - -#ifdef GL_NV_copy_image - -static GLboolean _glewInit_GL_NV_copy_image (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glCopyImageSubDataNV = (PFNGLCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubDataNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_copy_image */ - -#ifdef GL_NV_depth_buffer_float - -static GLboolean _glewInit_GL_NV_depth_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glClearDepthdNV = (PFNGLCLEARDEPTHDNVPROC)glewGetProcAddress((const GLubyte*)"glClearDepthdNV")) == NULL) || r; - r = ((glDepthBoundsdNV = (PFNGLDEPTHBOUNDSDNVPROC)glewGetProcAddress((const GLubyte*)"glDepthBoundsdNV")) == NULL) || r; - r = ((glDepthRangedNV = (PFNGLDEPTHRANGEDNVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangedNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_depth_buffer_float */ - -#ifdef GL_NV_draw_texture - -static GLboolean _glewInit_GL_NV_draw_texture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDrawTextureNV = (PFNGLDRAWTEXTURENVPROC)glewGetProcAddress((const GLubyte*)"glDrawTextureNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_draw_texture */ - -#ifdef GL_NV_evaluators - -static GLboolean _glewInit_GL_NV_evaluators (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glEvalMapsNV = (PFNGLEVALMAPSNVPROC)glewGetProcAddress((const GLubyte*)"glEvalMapsNV")) == NULL) || r; - r = ((glGetMapAttribParameterfvNV = (PFNGLGETMAPATTRIBPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapAttribParameterfvNV")) == NULL) || r; - r = ((glGetMapAttribParameterivNV = (PFNGLGETMAPATTRIBPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapAttribParameterivNV")) == NULL) || r; - r = ((glGetMapControlPointsNV = (PFNGLGETMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapControlPointsNV")) == NULL) || r; - r = ((glGetMapParameterfvNV = (PFNGLGETMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapParameterfvNV")) == NULL) || r; - r = ((glGetMapParameterivNV = (PFNGLGETMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapParameterivNV")) == NULL) || r; - r = ((glMapControlPointsNV = (PFNGLMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)"glMapControlPointsNV")) == NULL) || r; - r = ((glMapParameterfvNV = (PFNGLMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glMapParameterfvNV")) == NULL) || r; - r = ((glMapParameterivNV = (PFNGLMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glMapParameterivNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_evaluators */ - -#ifdef GL_NV_explicit_multisample - -static GLboolean _glewInit_GL_NV_explicit_multisample (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetMultisamplefvNV = (PFNGLGETMULTISAMPLEFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMultisamplefvNV")) == NULL) || r; - r = ((glSampleMaskIndexedNV = (PFNGLSAMPLEMASKINDEXEDNVPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskIndexedNV")) == NULL) || r; - r = ((glTexRenderbufferNV = (PFNGLTEXRENDERBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glTexRenderbufferNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_explicit_multisample */ - -#ifdef GL_NV_fence - -static GLboolean _glewInit_GL_NV_fence (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDeleteFencesNV = (PFNGLDELETEFENCESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteFencesNV")) == NULL) || r; - r = ((glFinishFenceNV = (PFNGLFINISHFENCENVPROC)glewGetProcAddress((const GLubyte*)"glFinishFenceNV")) == NULL) || r; - r = ((glGenFencesNV = (PFNGLGENFENCESNVPROC)glewGetProcAddress((const GLubyte*)"glGenFencesNV")) == NULL) || r; - r = ((glGetFenceivNV = (PFNGLGETFENCEIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFenceivNV")) == NULL) || r; - r = ((glIsFenceNV = (PFNGLISFENCENVPROC)glewGetProcAddress((const GLubyte*)"glIsFenceNV")) == NULL) || r; - r = ((glSetFenceNV = (PFNGLSETFENCENVPROC)glewGetProcAddress((const GLubyte*)"glSetFenceNV")) == NULL) || r; - r = ((glTestFenceNV = (PFNGLTESTFENCENVPROC)glewGetProcAddress((const GLubyte*)"glTestFenceNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_fence */ - -#ifdef GL_NV_fragment_coverage_to_color - -static GLboolean _glewInit_GL_NV_fragment_coverage_to_color (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFragmentCoverageColorNV = (PFNGLFRAGMENTCOVERAGECOLORNVPROC)glewGetProcAddress((const GLubyte*)"glFragmentCoverageColorNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_fragment_coverage_to_color */ - -#ifdef GL_NV_fragment_program - -static GLboolean _glewInit_GL_NV_fragment_program (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetProgramNamedParameterdvNV = (PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramNamedParameterdvNV")) == NULL) || r; - r = ((glGetProgramNamedParameterfvNV = (PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramNamedParameterfvNV")) == NULL) || r; - r = ((glProgramNamedParameter4dNV = (PFNGLPROGRAMNAMEDPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4dNV")) == NULL) || r; - r = ((glProgramNamedParameter4dvNV = (PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4dvNV")) == NULL) || r; - r = ((glProgramNamedParameter4fNV = (PFNGLPROGRAMNAMEDPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4fNV")) == NULL) || r; - r = ((glProgramNamedParameter4fvNV = (PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4fvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_fragment_program */ - -#ifdef GL_NV_framebuffer_multisample_coverage - -static GLboolean _glewInit_GL_NV_framebuffer_multisample_coverage (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glRenderbufferStorageMultisampleCoverageNV = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleCoverageNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_framebuffer_multisample_coverage */ - -#ifdef GL_NV_geometry_program4 - -static GLboolean _glewInit_GL_NV_geometry_program4 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glProgramVertexLimitNV = (PFNGLPROGRAMVERTEXLIMITNVPROC)glewGetProcAddress((const GLubyte*)"glProgramVertexLimitNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_geometry_program4 */ - -#ifdef GL_NV_gpu_program4 - -static GLboolean _glewInit_GL_NV_gpu_program4 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glProgramEnvParameterI4iNV = (PFNGLPROGRAMENVPARAMETERI4INVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4iNV")) == NULL) || r; - r = ((glProgramEnvParameterI4ivNV = (PFNGLPROGRAMENVPARAMETERI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4ivNV")) == NULL) || r; - r = ((glProgramEnvParameterI4uiNV = (PFNGLPROGRAMENVPARAMETERI4UINVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4uiNV")) == NULL) || r; - r = ((glProgramEnvParameterI4uivNV = (PFNGLPROGRAMENVPARAMETERI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4uivNV")) == NULL) || r; - r = ((glProgramEnvParametersI4ivNV = (PFNGLPROGRAMENVPARAMETERSI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParametersI4ivNV")) == NULL) || r; - r = ((glProgramEnvParametersI4uivNV = (PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParametersI4uivNV")) == NULL) || r; - r = ((glProgramLocalParameterI4iNV = (PFNGLPROGRAMLOCALPARAMETERI4INVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4iNV")) == NULL) || r; - r = ((glProgramLocalParameterI4ivNV = (PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4ivNV")) == NULL) || r; - r = ((glProgramLocalParameterI4uiNV = (PFNGLPROGRAMLOCALPARAMETERI4UINVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4uiNV")) == NULL) || r; - r = ((glProgramLocalParameterI4uivNV = (PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4uivNV")) == NULL) || r; - r = ((glProgramLocalParametersI4ivNV = (PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParametersI4ivNV")) == NULL) || r; - r = ((glProgramLocalParametersI4uivNV = (PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParametersI4uivNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_gpu_program4 */ - -#ifdef GL_NV_gpu_shader5 - -static GLboolean _glewInit_GL_NV_gpu_shader5 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetUniformi64vNV = (PFNGLGETUNIFORMI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformi64vNV")) == NULL) || r; - r = ((glGetUniformui64vNV = (PFNGLGETUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformui64vNV")) == NULL) || r; - r = ((glProgramUniform1i64NV = (PFNGLPROGRAMUNIFORM1I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64NV")) == NULL) || r; - r = ((glProgramUniform1i64vNV = (PFNGLPROGRAMUNIFORM1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64vNV")) == NULL) || r; - r = ((glProgramUniform1ui64NV = (PFNGLPROGRAMUNIFORM1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64NV")) == NULL) || r; - r = ((glProgramUniform1ui64vNV = (PFNGLPROGRAMUNIFORM1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64vNV")) == NULL) || r; - r = ((glProgramUniform2i64NV = (PFNGLPROGRAMUNIFORM2I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64NV")) == NULL) || r; - r = ((glProgramUniform2i64vNV = (PFNGLPROGRAMUNIFORM2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64vNV")) == NULL) || r; - r = ((glProgramUniform2ui64NV = (PFNGLPROGRAMUNIFORM2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64NV")) == NULL) || r; - r = ((glProgramUniform2ui64vNV = (PFNGLPROGRAMUNIFORM2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64vNV")) == NULL) || r; - r = ((glProgramUniform3i64NV = (PFNGLPROGRAMUNIFORM3I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64NV")) == NULL) || r; - r = ((glProgramUniform3i64vNV = (PFNGLPROGRAMUNIFORM3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64vNV")) == NULL) || r; - r = ((glProgramUniform3ui64NV = (PFNGLPROGRAMUNIFORM3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64NV")) == NULL) || r; - r = ((glProgramUniform3ui64vNV = (PFNGLPROGRAMUNIFORM3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64vNV")) == NULL) || r; - r = ((glProgramUniform4i64NV = (PFNGLPROGRAMUNIFORM4I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64NV")) == NULL) || r; - r = ((glProgramUniform4i64vNV = (PFNGLPROGRAMUNIFORM4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64vNV")) == NULL) || r; - r = ((glProgramUniform4ui64NV = (PFNGLPROGRAMUNIFORM4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64NV")) == NULL) || r; - r = ((glProgramUniform4ui64vNV = (PFNGLPROGRAMUNIFORM4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64vNV")) == NULL) || r; - r = ((glUniform1i64NV = (PFNGLUNIFORM1I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64NV")) == NULL) || r; - r = ((glUniform1i64vNV = (PFNGLUNIFORM1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64vNV")) == NULL) || r; - r = ((glUniform1ui64NV = (PFNGLUNIFORM1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64NV")) == NULL) || r; - r = ((glUniform1ui64vNV = (PFNGLUNIFORM1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64vNV")) == NULL) || r; - r = ((glUniform2i64NV = (PFNGLUNIFORM2I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64NV")) == NULL) || r; - r = ((glUniform2i64vNV = (PFNGLUNIFORM2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64vNV")) == NULL) || r; - r = ((glUniform2ui64NV = (PFNGLUNIFORM2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64NV")) == NULL) || r; - r = ((glUniform2ui64vNV = (PFNGLUNIFORM2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64vNV")) == NULL) || r; - r = ((glUniform3i64NV = (PFNGLUNIFORM3I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64NV")) == NULL) || r; - r = ((glUniform3i64vNV = (PFNGLUNIFORM3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64vNV")) == NULL) || r; - r = ((glUniform3ui64NV = (PFNGLUNIFORM3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64NV")) == NULL) || r; - r = ((glUniform3ui64vNV = (PFNGLUNIFORM3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64vNV")) == NULL) || r; - r = ((glUniform4i64NV = (PFNGLUNIFORM4I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64NV")) == NULL) || r; - r = ((glUniform4i64vNV = (PFNGLUNIFORM4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64vNV")) == NULL) || r; - r = ((glUniform4ui64NV = (PFNGLUNIFORM4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64NV")) == NULL) || r; - r = ((glUniform4ui64vNV = (PFNGLUNIFORM4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64vNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_gpu_shader5 */ - -#ifdef GL_NV_half_float - -static GLboolean _glewInit_GL_NV_half_float (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glColor3hNV = (PFNGLCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)"glColor3hNV")) == NULL) || r; - r = ((glColor3hvNV = (PFNGLCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)"glColor3hvNV")) == NULL) || r; - r = ((glColor4hNV = (PFNGLCOLOR4HNVPROC)glewGetProcAddress((const GLubyte*)"glColor4hNV")) == NULL) || r; - r = ((glColor4hvNV = (PFNGLCOLOR4HVNVPROC)glewGetProcAddress((const GLubyte*)"glColor4hvNV")) == NULL) || r; - r = ((glFogCoordhNV = (PFNGLFOGCOORDHNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordhNV")) == NULL) || r; - r = ((glFogCoordhvNV = (PFNGLFOGCOORDHVNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordhvNV")) == NULL) || r; - r = ((glMultiTexCoord1hNV = (PFNGLMULTITEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1hNV")) == NULL) || r; - r = ((glMultiTexCoord1hvNV = (PFNGLMULTITEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1hvNV")) == NULL) || r; - r = ((glMultiTexCoord2hNV = (PFNGLMULTITEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2hNV")) == NULL) || r; - r = ((glMultiTexCoord2hvNV = (PFNGLMULTITEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2hvNV")) == NULL) || r; - r = ((glMultiTexCoord3hNV = (PFNGLMULTITEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3hNV")) == NULL) || r; - r = ((glMultiTexCoord3hvNV = (PFNGLMULTITEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3hvNV")) == NULL) || r; - r = ((glMultiTexCoord4hNV = (PFNGLMULTITEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4hNV")) == NULL) || r; - r = ((glMultiTexCoord4hvNV = (PFNGLMULTITEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4hvNV")) == NULL) || r; - r = ((glNormal3hNV = (PFNGLNORMAL3HNVPROC)glewGetProcAddress((const GLubyte*)"glNormal3hNV")) == NULL) || r; - r = ((glNormal3hvNV = (PFNGLNORMAL3HVNVPROC)glewGetProcAddress((const GLubyte*)"glNormal3hvNV")) == NULL) || r; - r = ((glSecondaryColor3hNV = (PFNGLSECONDARYCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3hNV")) == NULL) || r; - r = ((glSecondaryColor3hvNV = (PFNGLSECONDARYCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3hvNV")) == NULL) || r; - r = ((glTexCoord1hNV = (PFNGLTEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord1hNV")) == NULL) || r; - r = ((glTexCoord1hvNV = (PFNGLTEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord1hvNV")) == NULL) || r; - r = ((glTexCoord2hNV = (PFNGLTEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2hNV")) == NULL) || r; - r = ((glTexCoord2hvNV = (PFNGLTEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2hvNV")) == NULL) || r; - r = ((glTexCoord3hNV = (PFNGLTEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord3hNV")) == NULL) || r; - r = ((glTexCoord3hvNV = (PFNGLTEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord3hvNV")) == NULL) || r; - r = ((glTexCoord4hNV = (PFNGLTEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4hNV")) == NULL) || r; - r = ((glTexCoord4hvNV = (PFNGLTEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4hvNV")) == NULL) || r; - r = ((glVertex2hNV = (PFNGLVERTEX2HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex2hNV")) == NULL) || r; - r = ((glVertex2hvNV = (PFNGLVERTEX2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex2hvNV")) == NULL) || r; - r = ((glVertex3hNV = (PFNGLVERTEX3HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex3hNV")) == NULL) || r; - r = ((glVertex3hvNV = (PFNGLVERTEX3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex3hvNV")) == NULL) || r; - r = ((glVertex4hNV = (PFNGLVERTEX4HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex4hNV")) == NULL) || r; - r = ((glVertex4hvNV = (PFNGLVERTEX4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex4hvNV")) == NULL) || r; - r = ((glVertexAttrib1hNV = (PFNGLVERTEXATTRIB1HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1hNV")) == NULL) || r; - r = ((glVertexAttrib1hvNV = (PFNGLVERTEXATTRIB1HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1hvNV")) == NULL) || r; - r = ((glVertexAttrib2hNV = (PFNGLVERTEXATTRIB2HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2hNV")) == NULL) || r; - r = ((glVertexAttrib2hvNV = (PFNGLVERTEXATTRIB2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2hvNV")) == NULL) || r; - r = ((glVertexAttrib3hNV = (PFNGLVERTEXATTRIB3HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3hNV")) == NULL) || r; - r = ((glVertexAttrib3hvNV = (PFNGLVERTEXATTRIB3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3hvNV")) == NULL) || r; - r = ((glVertexAttrib4hNV = (PFNGLVERTEXATTRIB4HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4hNV")) == NULL) || r; - r = ((glVertexAttrib4hvNV = (PFNGLVERTEXATTRIB4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4hvNV")) == NULL) || r; - r = ((glVertexAttribs1hvNV = (PFNGLVERTEXATTRIBS1HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1hvNV")) == NULL) || r; - r = ((glVertexAttribs2hvNV = (PFNGLVERTEXATTRIBS2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2hvNV")) == NULL) || r; - r = ((glVertexAttribs3hvNV = (PFNGLVERTEXATTRIBS3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3hvNV")) == NULL) || r; - r = ((glVertexAttribs4hvNV = (PFNGLVERTEXATTRIBS4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4hvNV")) == NULL) || r; - r = ((glVertexWeighthNV = (PFNGLVERTEXWEIGHTHNVPROC)glewGetProcAddress((const GLubyte*)"glVertexWeighthNV")) == NULL) || r; - r = ((glVertexWeighthvNV = (PFNGLVERTEXWEIGHTHVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexWeighthvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_half_float */ - -#ifdef GL_NV_internalformat_sample_query - -static GLboolean _glewInit_GL_NV_internalformat_sample_query (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetInternalformatSampleivNV = (PFNGLGETINTERNALFORMATSAMPLEIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformatSampleivNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_internalformat_sample_query */ - -#ifdef GL_NV_occlusion_query - -static GLboolean _glewInit_GL_NV_occlusion_query (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBeginOcclusionQueryNV = (PFNGLBEGINOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glBeginOcclusionQueryNV")) == NULL) || r; - r = ((glDeleteOcclusionQueriesNV = (PFNGLDELETEOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteOcclusionQueriesNV")) == NULL) || r; - r = ((glEndOcclusionQueryNV = (PFNGLENDOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glEndOcclusionQueryNV")) == NULL) || r; - r = ((glGenOcclusionQueriesNV = (PFNGLGENOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)"glGenOcclusionQueriesNV")) == NULL) || r; - r = ((glGetOcclusionQueryivNV = (PFNGLGETOCCLUSIONQUERYIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetOcclusionQueryivNV")) == NULL) || r; - r = ((glGetOcclusionQueryuivNV = (PFNGLGETOCCLUSIONQUERYUIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetOcclusionQueryuivNV")) == NULL) || r; - r = ((glIsOcclusionQueryNV = (PFNGLISOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glIsOcclusionQueryNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_occlusion_query */ - -#ifdef GL_NV_parameter_buffer_object - -static GLboolean _glewInit_GL_NV_parameter_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glProgramBufferParametersIivNV = (PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersIivNV")) == NULL) || r; - r = ((glProgramBufferParametersIuivNV = (PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersIuivNV")) == NULL) || r; - r = ((glProgramBufferParametersfvNV = (PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersfvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_parameter_buffer_object */ - -#ifdef GL_NV_path_rendering - -static GLboolean _glewInit_GL_NV_path_rendering (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glCopyPathNV = (PFNGLCOPYPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCopyPathNV")) == NULL) || r; - r = ((glCoverFillPathInstancedNV = (PFNGLCOVERFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glCoverFillPathInstancedNV")) == NULL) || r; - r = ((glCoverFillPathNV = (PFNGLCOVERFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCoverFillPathNV")) == NULL) || r; - r = ((glCoverStrokePathInstancedNV = (PFNGLCOVERSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glCoverStrokePathInstancedNV")) == NULL) || r; - r = ((glCoverStrokePathNV = (PFNGLCOVERSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCoverStrokePathNV")) == NULL) || r; - r = ((glDeletePathsNV = (PFNGLDELETEPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glDeletePathsNV")) == NULL) || r; - r = ((glGenPathsNV = (PFNGLGENPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glGenPathsNV")) == NULL) || r; - r = ((glGetPathColorGenfvNV = (PFNGLGETPATHCOLORGENFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathColorGenfvNV")) == NULL) || r; - r = ((glGetPathColorGenivNV = (PFNGLGETPATHCOLORGENIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathColorGenivNV")) == NULL) || r; - r = ((glGetPathCommandsNV = (PFNGLGETPATHCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathCommandsNV")) == NULL) || r; - r = ((glGetPathCoordsNV = (PFNGLGETPATHCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathCoordsNV")) == NULL) || r; - r = ((glGetPathDashArrayNV = (PFNGLGETPATHDASHARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathDashArrayNV")) == NULL) || r; - r = ((glGetPathLengthNV = (PFNGLGETPATHLENGTHNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathLengthNV")) == NULL) || r; - r = ((glGetPathMetricRangeNV = (PFNGLGETPATHMETRICRANGENVPROC)glewGetProcAddress((const GLubyte*)"glGetPathMetricRangeNV")) == NULL) || r; - r = ((glGetPathMetricsNV = (PFNGLGETPATHMETRICSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathMetricsNV")) == NULL) || r; - r = ((glGetPathParameterfvNV = (PFNGLGETPATHPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathParameterfvNV")) == NULL) || r; - r = ((glGetPathParameterivNV = (PFNGLGETPATHPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathParameterivNV")) == NULL) || r; - r = ((glGetPathSpacingNV = (PFNGLGETPATHSPACINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathSpacingNV")) == NULL) || r; - r = ((glGetPathTexGenfvNV = (PFNGLGETPATHTEXGENFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathTexGenfvNV")) == NULL) || r; - r = ((glGetPathTexGenivNV = (PFNGLGETPATHTEXGENIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathTexGenivNV")) == NULL) || r; - r = ((glGetProgramResourcefvNV = (PFNGLGETPROGRAMRESOURCEFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourcefvNV")) == NULL) || r; - r = ((glInterpolatePathsNV = (PFNGLINTERPOLATEPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glInterpolatePathsNV")) == NULL) || r; - r = ((glIsPathNV = (PFNGLISPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPathNV")) == NULL) || r; - r = ((glIsPointInFillPathNV = (PFNGLISPOINTINFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPointInFillPathNV")) == NULL) || r; - r = ((glIsPointInStrokePathNV = (PFNGLISPOINTINSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPointInStrokePathNV")) == NULL) || r; - r = ((glMatrixLoad3x2fNV = (PFNGLMATRIXLOAD3X2FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoad3x2fNV")) == NULL) || r; - r = ((glMatrixLoad3x3fNV = (PFNGLMATRIXLOAD3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoad3x3fNV")) == NULL) || r; - r = ((glMatrixLoadTranspose3x3fNV = (PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTranspose3x3fNV")) == NULL) || r; - r = ((glMatrixMult3x2fNV = (PFNGLMATRIXMULT3X2FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMult3x2fNV")) == NULL) || r; - r = ((glMatrixMult3x3fNV = (PFNGLMATRIXMULT3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMult3x3fNV")) == NULL) || r; - r = ((glMatrixMultTranspose3x3fNV = (PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTranspose3x3fNV")) == NULL) || r; - r = ((glPathColorGenNV = (PFNGLPATHCOLORGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathColorGenNV")) == NULL) || r; - r = ((glPathCommandsNV = (PFNGLPATHCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathCommandsNV")) == NULL) || r; - r = ((glPathCoordsNV = (PFNGLPATHCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathCoordsNV")) == NULL) || r; - r = ((glPathCoverDepthFuncNV = (PFNGLPATHCOVERDEPTHFUNCNVPROC)glewGetProcAddress((const GLubyte*)"glPathCoverDepthFuncNV")) == NULL) || r; - r = ((glPathDashArrayNV = (PFNGLPATHDASHARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathDashArrayNV")) == NULL) || r; - r = ((glPathFogGenNV = (PFNGLPATHFOGGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathFogGenNV")) == NULL) || r; - r = ((glPathGlyphIndexArrayNV = (PFNGLPATHGLYPHINDEXARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphIndexArrayNV")) == NULL) || r; - r = ((glPathGlyphIndexRangeNV = (PFNGLPATHGLYPHINDEXRANGENVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphIndexRangeNV")) == NULL) || r; - r = ((glPathGlyphRangeNV = (PFNGLPATHGLYPHRANGENVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphRangeNV")) == NULL) || r; - r = ((glPathGlyphsNV = (PFNGLPATHGLYPHSNVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphsNV")) == NULL) || r; - r = ((glPathMemoryGlyphIndexArrayNV = (PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathMemoryGlyphIndexArrayNV")) == NULL) || r; - r = ((glPathParameterfNV = (PFNGLPATHPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterfNV")) == NULL) || r; - r = ((glPathParameterfvNV = (PFNGLPATHPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterfvNV")) == NULL) || r; - r = ((glPathParameteriNV = (PFNGLPATHPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glPathParameteriNV")) == NULL) || r; - r = ((glPathParameterivNV = (PFNGLPATHPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterivNV")) == NULL) || r; - r = ((glPathStencilDepthOffsetNV = (PFNGLPATHSTENCILDEPTHOFFSETNVPROC)glewGetProcAddress((const GLubyte*)"glPathStencilDepthOffsetNV")) == NULL) || r; - r = ((glPathStencilFuncNV = (PFNGLPATHSTENCILFUNCNVPROC)glewGetProcAddress((const GLubyte*)"glPathStencilFuncNV")) == NULL) || r; - r = ((glPathStringNV = (PFNGLPATHSTRINGNVPROC)glewGetProcAddress((const GLubyte*)"glPathStringNV")) == NULL) || r; - r = ((glPathSubCommandsNV = (PFNGLPATHSUBCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathSubCommandsNV")) == NULL) || r; - r = ((glPathSubCoordsNV = (PFNGLPATHSUBCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathSubCoordsNV")) == NULL) || r; - r = ((glPathTexGenNV = (PFNGLPATHTEXGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathTexGenNV")) == NULL) || r; - r = ((glPointAlongPathNV = (PFNGLPOINTALONGPATHNVPROC)glewGetProcAddress((const GLubyte*)"glPointAlongPathNV")) == NULL) || r; - r = ((glProgramPathFragmentInputGenNV = (PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC)glewGetProcAddress((const GLubyte*)"glProgramPathFragmentInputGenNV")) == NULL) || r; - r = ((glStencilFillPathInstancedNV = (PFNGLSTENCILFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilFillPathInstancedNV")) == NULL) || r; - r = ((glStencilFillPathNV = (PFNGLSTENCILFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilFillPathNV")) == NULL) || r; - r = ((glStencilStrokePathInstancedNV = (PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilStrokePathInstancedNV")) == NULL) || r; - r = ((glStencilStrokePathNV = (PFNGLSTENCILSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilStrokePathNV")) == NULL) || r; - r = ((glStencilThenCoverFillPathInstancedNV = (PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverFillPathInstancedNV")) == NULL) || r; - r = ((glStencilThenCoverFillPathNV = (PFNGLSTENCILTHENCOVERFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverFillPathNV")) == NULL) || r; - r = ((glStencilThenCoverStrokePathInstancedNV = (PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverStrokePathInstancedNV")) == NULL) || r; - r = ((glStencilThenCoverStrokePathNV = (PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverStrokePathNV")) == NULL) || r; - r = ((glTransformPathNV = (PFNGLTRANSFORMPATHNVPROC)glewGetProcAddress((const GLubyte*)"glTransformPathNV")) == NULL) || r; - r = ((glWeightPathsNV = (PFNGLWEIGHTPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glWeightPathsNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_path_rendering */ - -#ifdef GL_NV_pixel_data_range - -static GLboolean _glewInit_GL_NV_pixel_data_range (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFlushPixelDataRangeNV = (PFNGLFLUSHPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)"glFlushPixelDataRangeNV")) == NULL) || r; - r = ((glPixelDataRangeNV = (PFNGLPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)"glPixelDataRangeNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_pixel_data_range */ - -#ifdef GL_NV_point_sprite - -static GLboolean _glewInit_GL_NV_point_sprite (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glPointParameteriNV = (PFNGLPOINTPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glPointParameteriNV")) == NULL) || r; - r = ((glPointParameterivNV = (PFNGLPOINTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterivNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_point_sprite */ - -#ifdef GL_NV_present_video - -static GLboolean _glewInit_GL_NV_present_video (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetVideoi64vNV = (PFNGLGETVIDEOI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoi64vNV")) == NULL) || r; - r = ((glGetVideoivNV = (PFNGLGETVIDEOIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoivNV")) == NULL) || r; - r = ((glGetVideoui64vNV = (PFNGLGETVIDEOUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoui64vNV")) == NULL) || r; - r = ((glGetVideouivNV = (PFNGLGETVIDEOUIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideouivNV")) == NULL) || r; - r = ((glPresentFrameDualFillNV = (PFNGLPRESENTFRAMEDUALFILLNVPROC)glewGetProcAddress((const GLubyte*)"glPresentFrameDualFillNV")) == NULL) || r; - r = ((glPresentFrameKeyedNV = (PFNGLPRESENTFRAMEKEYEDNVPROC)glewGetProcAddress((const GLubyte*)"glPresentFrameKeyedNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_present_video */ - -#ifdef GL_NV_primitive_restart - -static GLboolean _glewInit_GL_NV_primitive_restart (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glPrimitiveRestartIndexNV = (PFNGLPRIMITIVERESTARTINDEXNVPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartIndexNV")) == NULL) || r; - r = ((glPrimitiveRestartNV = (PFNGLPRIMITIVERESTARTNVPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_primitive_restart */ - -#ifdef GL_NV_register_combiners - -static GLboolean _glewInit_GL_NV_register_combiners (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glCombinerInputNV = (PFNGLCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerInputNV")) == NULL) || r; - r = ((glCombinerOutputNV = (PFNGLCOMBINEROUTPUTNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerOutputNV")) == NULL) || r; - r = ((glCombinerParameterfNV = (PFNGLCOMBINERPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterfNV")) == NULL) || r; - r = ((glCombinerParameterfvNV = (PFNGLCOMBINERPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterfvNV")) == NULL) || r; - r = ((glCombinerParameteriNV = (PFNGLCOMBINERPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameteriNV")) == NULL) || r; - r = ((glCombinerParameterivNV = (PFNGLCOMBINERPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterivNV")) == NULL) || r; - r = ((glFinalCombinerInputNV = (PFNGLFINALCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)"glFinalCombinerInputNV")) == NULL) || r; - r = ((glGetCombinerInputParameterfvNV = (PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerInputParameterfvNV")) == NULL) || r; - r = ((glGetCombinerInputParameterivNV = (PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerInputParameterivNV")) == NULL) || r; - r = ((glGetCombinerOutputParameterfvNV = (PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerOutputParameterfvNV")) == NULL) || r; - r = ((glGetCombinerOutputParameterivNV = (PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerOutputParameterivNV")) == NULL) || r; - r = ((glGetFinalCombinerInputParameterfvNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFinalCombinerInputParameterfvNV")) == NULL) || r; - r = ((glGetFinalCombinerInputParameterivNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFinalCombinerInputParameterivNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_register_combiners */ - -#ifdef GL_NV_register_combiners2 - -static GLboolean _glewInit_GL_NV_register_combiners2 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glCombinerStageParameterfvNV = (PFNGLCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerStageParameterfvNV")) == NULL) || r; - r = ((glGetCombinerStageParameterfvNV = (PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerStageParameterfvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_register_combiners2 */ - -#ifdef GL_NV_sample_locations - -static GLboolean _glewInit_GL_NV_sample_locations (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferSampleLocationsfvNV = (PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)glewGetProcAddress((const GLubyte*)"glFramebufferSampleLocationsfvNV")) == NULL) || r; - r = ((glNamedFramebufferSampleLocationsfvNV = (PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferSampleLocationsfvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_sample_locations */ - -#ifdef GL_NV_shader_buffer_load - -static GLboolean _glewInit_GL_NV_shader_buffer_load (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetBufferParameterui64vNV = (PFNGLGETBUFFERPARAMETERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameterui64vNV")) == NULL) || r; - r = ((glGetIntegerui64vNV = (PFNGLGETINTEGERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerui64vNV")) == NULL) || r; - r = ((glGetNamedBufferParameterui64vNV = (PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameterui64vNV")) == NULL) || r; - r = ((glIsBufferResidentNV = (PFNGLISBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsBufferResidentNV")) == NULL) || r; - r = ((glIsNamedBufferResidentNV = (PFNGLISNAMEDBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsNamedBufferResidentNV")) == NULL) || r; - r = ((glMakeBufferNonResidentNV = (PFNGLMAKEBUFFERNONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeBufferNonResidentNV")) == NULL) || r; - r = ((glMakeBufferResidentNV = (PFNGLMAKEBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeBufferResidentNV")) == NULL) || r; - r = ((glMakeNamedBufferNonResidentNV = (PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeNamedBufferNonResidentNV")) == NULL) || r; - r = ((glMakeNamedBufferResidentNV = (PFNGLMAKENAMEDBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeNamedBufferResidentNV")) == NULL) || r; - r = ((glProgramUniformui64NV = (PFNGLPROGRAMUNIFORMUI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformui64NV")) == NULL) || r; - r = ((glProgramUniformui64vNV = (PFNGLPROGRAMUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformui64vNV")) == NULL) || r; - r = ((glUniformui64NV = (PFNGLUNIFORMUI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniformui64NV")) == NULL) || r; - r = ((glUniformui64vNV = (PFNGLUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniformui64vNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_shader_buffer_load */ - -#ifdef GL_NV_texture_barrier - -static GLboolean _glewInit_GL_NV_texture_barrier (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTextureBarrierNV = (PFNGLTEXTUREBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glTextureBarrierNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_texture_barrier */ - -#ifdef GL_NV_texture_multisample - -static GLboolean _glewInit_GL_NV_texture_multisample (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTexImage2DMultisampleCoverageNV = (PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTexImage2DMultisampleCoverageNV")) == NULL) || r; - r = ((glTexImage3DMultisampleCoverageNV = (PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DMultisampleCoverageNV")) == NULL) || r; - r = ((glTextureImage2DMultisampleCoverageNV = (PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DMultisampleCoverageNV")) == NULL) || r; - r = ((glTextureImage2DMultisampleNV = (PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DMultisampleNV")) == NULL) || r; - r = ((glTextureImage3DMultisampleCoverageNV = (PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DMultisampleCoverageNV")) == NULL) || r; - r = ((glTextureImage3DMultisampleNV = (PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DMultisampleNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_texture_multisample */ - -#ifdef GL_NV_transform_feedback - -static GLboolean _glewInit_GL_NV_transform_feedback (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glActiveVaryingNV = (PFNGLACTIVEVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glActiveVaryingNV")) == NULL) || r; - r = ((glBeginTransformFeedbackNV = (PFNGLBEGINTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedbackNV")) == NULL) || r; - r = ((glBindBufferBaseNV = (PFNGLBINDBUFFERBASENVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBaseNV")) == NULL) || r; - r = ((glBindBufferOffsetNV = (PFNGLBINDBUFFEROFFSETNVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferOffsetNV")) == NULL) || r; - r = ((glBindBufferRangeNV = (PFNGLBINDBUFFERRANGENVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRangeNV")) == NULL) || r; - r = ((glEndTransformFeedbackNV = (PFNGLENDTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedbackNV")) == NULL) || r; - r = ((glGetActiveVaryingNV = (PFNGLGETACTIVEVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveVaryingNV")) == NULL) || r; - r = ((glGetTransformFeedbackVaryingNV = (PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVaryingNV")) == NULL) || r; - r = ((glGetVaryingLocationNV = (PFNGLGETVARYINGLOCATIONNVPROC)glewGetProcAddress((const GLubyte*)"glGetVaryingLocationNV")) == NULL) || r; - r = ((glTransformFeedbackAttribsNV = (PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackAttribsNV")) == NULL) || r; - r = ((glTransformFeedbackVaryingsNV = (PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryingsNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_transform_feedback */ - -#ifdef GL_NV_transform_feedback2 - -static GLboolean _glewInit_GL_NV_transform_feedback2 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindTransformFeedbackNV = (PFNGLBINDTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glBindTransformFeedbackNV")) == NULL) || r; - r = ((glDeleteTransformFeedbacksNV = (PFNGLDELETETRANSFORMFEEDBACKSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteTransformFeedbacksNV")) == NULL) || r; - r = ((glDrawTransformFeedbackNV = (PFNGLDRAWTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackNV")) == NULL) || r; - r = ((glGenTransformFeedbacksNV = (PFNGLGENTRANSFORMFEEDBACKSNVPROC)glewGetProcAddress((const GLubyte*)"glGenTransformFeedbacksNV")) == NULL) || r; - r = ((glIsTransformFeedbackNV = (PFNGLISTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glIsTransformFeedbackNV")) == NULL) || r; - r = ((glPauseTransformFeedbackNV = (PFNGLPAUSETRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glPauseTransformFeedbackNV")) == NULL) || r; - r = ((glResumeTransformFeedbackNV = (PFNGLRESUMETRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glResumeTransformFeedbackNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_transform_feedback2 */ - -#ifdef GL_NV_vdpau_interop - -static GLboolean _glewInit_GL_NV_vdpau_interop (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glVDPAUFiniNV = (PFNGLVDPAUFININVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUFiniNV")) == NULL) || r; - r = ((glVDPAUGetSurfaceivNV = (PFNGLVDPAUGETSURFACEIVNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUGetSurfaceivNV")) == NULL) || r; - r = ((glVDPAUInitNV = (PFNGLVDPAUINITNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUInitNV")) == NULL) || r; - r = ((glVDPAUIsSurfaceNV = (PFNGLVDPAUISSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUIsSurfaceNV")) == NULL) || r; - r = ((glVDPAUMapSurfacesNV = (PFNGLVDPAUMAPSURFACESNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUMapSurfacesNV")) == NULL) || r; - r = ((glVDPAURegisterOutputSurfaceNV = (PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAURegisterOutputSurfaceNV")) == NULL) || r; - r = ((glVDPAURegisterVideoSurfaceNV = (PFNGLVDPAUREGISTERVIDEOSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAURegisterVideoSurfaceNV")) == NULL) || r; - r = ((glVDPAUSurfaceAccessNV = (PFNGLVDPAUSURFACEACCESSNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUSurfaceAccessNV")) == NULL) || r; - r = ((glVDPAUUnmapSurfacesNV = (PFNGLVDPAUUNMAPSURFACESNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUUnmapSurfacesNV")) == NULL) || r; - r = ((glVDPAUUnregisterSurfaceNV = (PFNGLVDPAUUNREGISTERSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUUnregisterSurfaceNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_vdpau_interop */ - -#ifdef GL_NV_vertex_array_range - -static GLboolean _glewInit_GL_NV_vertex_array_range (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFlushVertexArrayRangeNV = (PFNGLFLUSHVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)"glFlushVertexArrayRangeNV")) == NULL) || r; - r = ((glVertexArrayRangeNV = (PFNGLVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayRangeNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_vertex_array_range */ - -#ifdef GL_NV_vertex_attrib_integer_64bit - -static GLboolean _glewInit_GL_NV_vertex_attrib_integer_64bit (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetVertexAttribLi64vNV = (PFNGLGETVERTEXATTRIBLI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLi64vNV")) == NULL) || r; - r = ((glGetVertexAttribLui64vNV = (PFNGLGETVERTEXATTRIBLUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLui64vNV")) == NULL) || r; - r = ((glVertexAttribL1i64NV = (PFNGLVERTEXATTRIBL1I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1i64NV")) == NULL) || r; - r = ((glVertexAttribL1i64vNV = (PFNGLVERTEXATTRIBL1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1i64vNV")) == NULL) || r; - r = ((glVertexAttribL1ui64NV = (PFNGLVERTEXATTRIBL1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64NV")) == NULL) || r; - r = ((glVertexAttribL1ui64vNV = (PFNGLVERTEXATTRIBL1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64vNV")) == NULL) || r; - r = ((glVertexAttribL2i64NV = (PFNGLVERTEXATTRIBL2I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2i64NV")) == NULL) || r; - r = ((glVertexAttribL2i64vNV = (PFNGLVERTEXATTRIBL2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2i64vNV")) == NULL) || r; - r = ((glVertexAttribL2ui64NV = (PFNGLVERTEXATTRIBL2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2ui64NV")) == NULL) || r; - r = ((glVertexAttribL2ui64vNV = (PFNGLVERTEXATTRIBL2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2ui64vNV")) == NULL) || r; - r = ((glVertexAttribL3i64NV = (PFNGLVERTEXATTRIBL3I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3i64NV")) == NULL) || r; - r = ((glVertexAttribL3i64vNV = (PFNGLVERTEXATTRIBL3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3i64vNV")) == NULL) || r; - r = ((glVertexAttribL3ui64NV = (PFNGLVERTEXATTRIBL3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3ui64NV")) == NULL) || r; - r = ((glVertexAttribL3ui64vNV = (PFNGLVERTEXATTRIBL3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3ui64vNV")) == NULL) || r; - r = ((glVertexAttribL4i64NV = (PFNGLVERTEXATTRIBL4I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4i64NV")) == NULL) || r; - r = ((glVertexAttribL4i64vNV = (PFNGLVERTEXATTRIBL4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4i64vNV")) == NULL) || r; - r = ((glVertexAttribL4ui64NV = (PFNGLVERTEXATTRIBL4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4ui64NV")) == NULL) || r; - r = ((glVertexAttribL4ui64vNV = (PFNGLVERTEXATTRIBL4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4ui64vNV")) == NULL) || r; - r = ((glVertexAttribLFormatNV = (PFNGLVERTEXATTRIBLFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLFormatNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_vertex_attrib_integer_64bit */ - -#ifdef GL_NV_vertex_buffer_unified_memory - -static GLboolean _glewInit_GL_NV_vertex_buffer_unified_memory (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBufferAddressRangeNV = (PFNGLBUFFERADDRESSRANGENVPROC)glewGetProcAddress((const GLubyte*)"glBufferAddressRangeNV")) == NULL) || r; - r = ((glColorFormatNV = (PFNGLCOLORFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glColorFormatNV")) == NULL) || r; - r = ((glEdgeFlagFormatNV = (PFNGLEDGEFLAGFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagFormatNV")) == NULL) || r; - r = ((glFogCoordFormatNV = (PFNGLFOGCOORDFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordFormatNV")) == NULL) || r; - r = ((glGetIntegerui64i_vNV = (PFNGLGETINTEGERUI64I_VNVPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerui64i_vNV")) == NULL) || r; - r = ((glIndexFormatNV = (PFNGLINDEXFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glIndexFormatNV")) == NULL) || r; - r = ((glNormalFormatNV = (PFNGLNORMALFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glNormalFormatNV")) == NULL) || r; - r = ((glSecondaryColorFormatNV = (PFNGLSECONDARYCOLORFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorFormatNV")) == NULL) || r; - r = ((glTexCoordFormatNV = (PFNGLTEXCOORDFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordFormatNV")) == NULL) || r; - r = ((glVertexAttribFormatNV = (PFNGLVERTEXATTRIBFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribFormatNV")) == NULL) || r; - r = ((glVertexAttribIFormatNV = (PFNGLVERTEXATTRIBIFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIFormatNV")) == NULL) || r; - r = ((glVertexFormatNV = (PFNGLVERTEXFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexFormatNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_vertex_buffer_unified_memory */ - -#ifdef GL_NV_vertex_program - -static GLboolean _glewInit_GL_NV_vertex_program (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glAreProgramsResidentNV = (PFNGLAREPROGRAMSRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glAreProgramsResidentNV")) == NULL) || r; - r = ((glBindProgramNV = (PFNGLBINDPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glBindProgramNV")) == NULL) || r; - r = ((glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramsNV")) == NULL) || r; - r = ((glExecuteProgramNV = (PFNGLEXECUTEPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glExecuteProgramNV")) == NULL) || r; - r = ((glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glGenProgramsNV")) == NULL) || r; - r = ((glGetProgramParameterdvNV = (PFNGLGETPROGRAMPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramParameterdvNV")) == NULL) || r; - r = ((glGetProgramParameterfvNV = (PFNGLGETPROGRAMPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramParameterfvNV")) == NULL) || r; - r = ((glGetProgramStringNV = (PFNGLGETPROGRAMSTRINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStringNV")) == NULL) || r; - r = ((glGetProgramivNV = (PFNGLGETPROGRAMIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramivNV")) == NULL) || r; - r = ((glGetTrackMatrixivNV = (PFNGLGETTRACKMATRIXIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetTrackMatrixivNV")) == NULL) || r; - r = ((glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointervNV")) == NULL) || r; - r = ((glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdvNV")) == NULL) || r; - r = ((glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfvNV")) == NULL) || r; - r = ((glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribivNV")) == NULL) || r; - r = ((glIsProgramNV = (PFNGLISPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glIsProgramNV")) == NULL) || r; - r = ((glLoadProgramNV = (PFNGLLOADPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glLoadProgramNV")) == NULL) || r; - r = ((glProgramParameter4dNV = (PFNGLPROGRAMPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4dNV")) == NULL) || r; - r = ((glProgramParameter4dvNV = (PFNGLPROGRAMPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4dvNV")) == NULL) || r; - r = ((glProgramParameter4fNV = (PFNGLPROGRAMPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4fNV")) == NULL) || r; - r = ((glProgramParameter4fvNV = (PFNGLPROGRAMPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4fvNV")) == NULL) || r; - r = ((glProgramParameters4dvNV = (PFNGLPROGRAMPARAMETERS4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameters4dvNV")) == NULL) || r; - r = ((glProgramParameters4fvNV = (PFNGLPROGRAMPARAMETERS4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameters4fvNV")) == NULL) || r; - r = ((glRequestResidentProgramsNV = (PFNGLREQUESTRESIDENTPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glRequestResidentProgramsNV")) == NULL) || r; - r = ((glTrackMatrixNV = (PFNGLTRACKMATRIXNVPROC)glewGetProcAddress((const GLubyte*)"glTrackMatrixNV")) == NULL) || r; - r = ((glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dNV")) == NULL) || r; - r = ((glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dvNV")) == NULL) || r; - r = ((glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fNV")) == NULL) || r; - r = ((glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fvNV")) == NULL) || r; - r = ((glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sNV")) == NULL) || r; - r = ((glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1svNV")) == NULL) || r; - r = ((glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dNV")) == NULL) || r; - r = ((glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dvNV")) == NULL) || r; - r = ((glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fNV")) == NULL) || r; - r = ((glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fvNV")) == NULL) || r; - r = ((glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sNV")) == NULL) || r; - r = ((glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2svNV")) == NULL) || r; - r = ((glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dNV")) == NULL) || r; - r = ((glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dvNV")) == NULL) || r; - r = ((glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fNV")) == NULL) || r; - r = ((glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fvNV")) == NULL) || r; - r = ((glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sNV")) == NULL) || r; - r = ((glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3svNV")) == NULL) || r; - r = ((glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dNV")) == NULL) || r; - r = ((glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dvNV")) == NULL) || r; - r = ((glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fNV")) == NULL) || r; - r = ((glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fvNV")) == NULL) || r; - r = ((glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sNV")) == NULL) || r; - r = ((glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4svNV")) == NULL) || r; - r = ((glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubNV")) == NULL) || r; - r = ((glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubvNV")) == NULL) || r; - r = ((glVertexAttribPointerNV = (PFNGLVERTEXATTRIBPOINTERNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointerNV")) == NULL) || r; - r = ((glVertexAttribs1dvNV = (PFNGLVERTEXATTRIBS1DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1dvNV")) == NULL) || r; - r = ((glVertexAttribs1fvNV = (PFNGLVERTEXATTRIBS1FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1fvNV")) == NULL) || r; - r = ((glVertexAttribs1svNV = (PFNGLVERTEXATTRIBS1SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1svNV")) == NULL) || r; - r = ((glVertexAttribs2dvNV = (PFNGLVERTEXATTRIBS2DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2dvNV")) == NULL) || r; - r = ((glVertexAttribs2fvNV = (PFNGLVERTEXATTRIBS2FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2fvNV")) == NULL) || r; - r = ((glVertexAttribs2svNV = (PFNGLVERTEXATTRIBS2SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2svNV")) == NULL) || r; - r = ((glVertexAttribs3dvNV = (PFNGLVERTEXATTRIBS3DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3dvNV")) == NULL) || r; - r = ((glVertexAttribs3fvNV = (PFNGLVERTEXATTRIBS3FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3fvNV")) == NULL) || r; - r = ((glVertexAttribs3svNV = (PFNGLVERTEXATTRIBS3SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3svNV")) == NULL) || r; - r = ((glVertexAttribs4dvNV = (PFNGLVERTEXATTRIBS4DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4dvNV")) == NULL) || r; - r = ((glVertexAttribs4fvNV = (PFNGLVERTEXATTRIBS4FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4fvNV")) == NULL) || r; - r = ((glVertexAttribs4svNV = (PFNGLVERTEXATTRIBS4SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4svNV")) == NULL) || r; - r = ((glVertexAttribs4ubvNV = (PFNGLVERTEXATTRIBS4UBVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4ubvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_vertex_program */ - -#ifdef GL_NV_video_capture - -static GLboolean _glewInit_GL_NV_video_capture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBeginVideoCaptureNV = (PFNGLBEGINVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glBeginVideoCaptureNV")) == NULL) || r; - r = ((glBindVideoCaptureStreamBufferNV = (PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glBindVideoCaptureStreamBufferNV")) == NULL) || r; - r = ((glBindVideoCaptureStreamTextureNV = (PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC)glewGetProcAddress((const GLubyte*)"glBindVideoCaptureStreamTextureNV")) == NULL) || r; - r = ((glEndVideoCaptureNV = (PFNGLENDVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glEndVideoCaptureNV")) == NULL) || r; - r = ((glGetVideoCaptureStreamdvNV = (PFNGLGETVIDEOCAPTURESTREAMDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamdvNV")) == NULL) || r; - r = ((glGetVideoCaptureStreamfvNV = (PFNGLGETVIDEOCAPTURESTREAMFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamfvNV")) == NULL) || r; - r = ((glGetVideoCaptureStreamivNV = (PFNGLGETVIDEOCAPTURESTREAMIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamivNV")) == NULL) || r; - r = ((glGetVideoCaptureivNV = (PFNGLGETVIDEOCAPTUREIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureivNV")) == NULL) || r; - r = ((glVideoCaptureNV = (PFNGLVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureNV")) == NULL) || r; - r = ((glVideoCaptureStreamParameterdvNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterdvNV")) == NULL) || r; - r = ((glVideoCaptureStreamParameterfvNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterfvNV")) == NULL) || r; - r = ((glVideoCaptureStreamParameterivNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterivNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_video_capture */ - -#ifdef GL_OES_single_precision - -static GLboolean _glewInit_GL_OES_single_precision (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glClearDepthfOES = (PFNGLCLEARDEPTHFOESPROC)glewGetProcAddress((const GLubyte*)"glClearDepthfOES")) == NULL) || r; - r = ((glClipPlanefOES = (PFNGLCLIPPLANEFOESPROC)glewGetProcAddress((const GLubyte*)"glClipPlanefOES")) == NULL) || r; - r = ((glDepthRangefOES = (PFNGLDEPTHRANGEFOESPROC)glewGetProcAddress((const GLubyte*)"glDepthRangefOES")) == NULL) || r; - r = ((glFrustumfOES = (PFNGLFRUSTUMFOESPROC)glewGetProcAddress((const GLubyte*)"glFrustumfOES")) == NULL) || r; - r = ((glGetClipPlanefOES = (PFNGLGETCLIPPLANEFOESPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanefOES")) == NULL) || r; - r = ((glOrthofOES = (PFNGLORTHOFOESPROC)glewGetProcAddress((const GLubyte*)"glOrthofOES")) == NULL) || r; - - return r; -} - -#endif /* GL_OES_single_precision */ - -#ifdef GL_OVR_multiview - -static GLboolean _glewInit_GL_OVR_multiview (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferTextureMultiviewOVR = (PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureMultiviewOVR")) == NULL) || r; - - return r; -} - -#endif /* GL_OVR_multiview */ - -#ifdef GL_REGAL_ES1_0_compatibility - -static GLboolean _glewInit_GL_REGAL_ES1_0_compatibility (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glAlphaFuncx = (PFNGLALPHAFUNCXPROC)glewGetProcAddress((const GLubyte*)"glAlphaFuncx")) == NULL) || r; - r = ((glClearColorx = (PFNGLCLEARCOLORXPROC)glewGetProcAddress((const GLubyte*)"glClearColorx")) == NULL) || r; - r = ((glClearDepthx = (PFNGLCLEARDEPTHXPROC)glewGetProcAddress((const GLubyte*)"glClearDepthx")) == NULL) || r; - r = ((glColor4x = (PFNGLCOLOR4XPROC)glewGetProcAddress((const GLubyte*)"glColor4x")) == NULL) || r; - r = ((glDepthRangex = (PFNGLDEPTHRANGEXPROC)glewGetProcAddress((const GLubyte*)"glDepthRangex")) == NULL) || r; - r = ((glFogx = (PFNGLFOGXPROC)glewGetProcAddress((const GLubyte*)"glFogx")) == NULL) || r; - r = ((glFogxv = (PFNGLFOGXVPROC)glewGetProcAddress((const GLubyte*)"glFogxv")) == NULL) || r; - r = ((glFrustumf = (PFNGLFRUSTUMFPROC)glewGetProcAddress((const GLubyte*)"glFrustumf")) == NULL) || r; - r = ((glFrustumx = (PFNGLFRUSTUMXPROC)glewGetProcAddress((const GLubyte*)"glFrustumx")) == NULL) || r; - r = ((glLightModelx = (PFNGLLIGHTMODELXPROC)glewGetProcAddress((const GLubyte*)"glLightModelx")) == NULL) || r; - r = ((glLightModelxv = (PFNGLLIGHTMODELXVPROC)glewGetProcAddress((const GLubyte*)"glLightModelxv")) == NULL) || r; - r = ((glLightx = (PFNGLLIGHTXPROC)glewGetProcAddress((const GLubyte*)"glLightx")) == NULL) || r; - r = ((glLightxv = (PFNGLLIGHTXVPROC)glewGetProcAddress((const GLubyte*)"glLightxv")) == NULL) || r; - r = ((glLineWidthx = (PFNGLLINEWIDTHXPROC)glewGetProcAddress((const GLubyte*)"glLineWidthx")) == NULL) || r; - r = ((glLoadMatrixx = (PFNGLLOADMATRIXXPROC)glewGetProcAddress((const GLubyte*)"glLoadMatrixx")) == NULL) || r; - r = ((glMaterialx = (PFNGLMATERIALXPROC)glewGetProcAddress((const GLubyte*)"glMaterialx")) == NULL) || r; - r = ((glMaterialxv = (PFNGLMATERIALXVPROC)glewGetProcAddress((const GLubyte*)"glMaterialxv")) == NULL) || r; - r = ((glMultMatrixx = (PFNGLMULTMATRIXXPROC)glewGetProcAddress((const GLubyte*)"glMultMatrixx")) == NULL) || r; - r = ((glMultiTexCoord4x = (PFNGLMULTITEXCOORD4XPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4x")) == NULL) || r; - r = ((glNormal3x = (PFNGLNORMAL3XPROC)glewGetProcAddress((const GLubyte*)"glNormal3x")) == NULL) || r; - r = ((glOrthof = (PFNGLORTHOFPROC)glewGetProcAddress((const GLubyte*)"glOrthof")) == NULL) || r; - r = ((glOrthox = (PFNGLORTHOXPROC)glewGetProcAddress((const GLubyte*)"glOrthox")) == NULL) || r; - r = ((glPointSizex = (PFNGLPOINTSIZEXPROC)glewGetProcAddress((const GLubyte*)"glPointSizex")) == NULL) || r; - r = ((glPolygonOffsetx = (PFNGLPOLYGONOFFSETXPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetx")) == NULL) || r; - r = ((glRotatex = (PFNGLROTATEXPROC)glewGetProcAddress((const GLubyte*)"glRotatex")) == NULL) || r; - r = ((glSampleCoveragex = (PFNGLSAMPLECOVERAGEXPROC)glewGetProcAddress((const GLubyte*)"glSampleCoveragex")) == NULL) || r; - r = ((glScalex = (PFNGLSCALEXPROC)glewGetProcAddress((const GLubyte*)"glScalex")) == NULL) || r; - r = ((glTexEnvx = (PFNGLTEXENVXPROC)glewGetProcAddress((const GLubyte*)"glTexEnvx")) == NULL) || r; - r = ((glTexEnvxv = (PFNGLTEXENVXVPROC)glewGetProcAddress((const GLubyte*)"glTexEnvxv")) == NULL) || r; - r = ((glTexParameterx = (PFNGLTEXPARAMETERXPROC)glewGetProcAddress((const GLubyte*)"glTexParameterx")) == NULL) || r; - r = ((glTranslatex = (PFNGLTRANSLATEXPROC)glewGetProcAddress((const GLubyte*)"glTranslatex")) == NULL) || r; - - return r; -} - -#endif /* GL_REGAL_ES1_0_compatibility */ - -#ifdef GL_REGAL_ES1_1_compatibility - -static GLboolean _glewInit_GL_REGAL_ES1_1_compatibility (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glClipPlanef = (PFNGLCLIPPLANEFPROC)glewGetProcAddress((const GLubyte*)"glClipPlanef")) == NULL) || r; - r = ((glClipPlanex = (PFNGLCLIPPLANEXPROC)glewGetProcAddress((const GLubyte*)"glClipPlanex")) == NULL) || r; - r = ((glGetClipPlanef = (PFNGLGETCLIPPLANEFPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanef")) == NULL) || r; - r = ((glGetClipPlanex = (PFNGLGETCLIPPLANEXPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanex")) == NULL) || r; - r = ((glGetFixedv = (PFNGLGETFIXEDVPROC)glewGetProcAddress((const GLubyte*)"glGetFixedv")) == NULL) || r; - r = ((glGetLightxv = (PFNGLGETLIGHTXVPROC)glewGetProcAddress((const GLubyte*)"glGetLightxv")) == NULL) || r; - r = ((glGetMaterialxv = (PFNGLGETMATERIALXVPROC)glewGetProcAddress((const GLubyte*)"glGetMaterialxv")) == NULL) || r; - r = ((glGetTexEnvxv = (PFNGLGETTEXENVXVPROC)glewGetProcAddress((const GLubyte*)"glGetTexEnvxv")) == NULL) || r; - r = ((glGetTexParameterxv = (PFNGLGETTEXPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterxv")) == NULL) || r; - r = ((glPointParameterx = (PFNGLPOINTPARAMETERXPROC)glewGetProcAddress((const GLubyte*)"glPointParameterx")) == NULL) || r; - r = ((glPointParameterxv = (PFNGLPOINTPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterxv")) == NULL) || r; - r = ((glPointSizePointerOES = (PFNGLPOINTSIZEPOINTEROESPROC)glewGetProcAddress((const GLubyte*)"glPointSizePointerOES")) == NULL) || r; - r = ((glTexParameterxv = (PFNGLTEXPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterxv")) == NULL) || r; - - return r; -} - -#endif /* GL_REGAL_ES1_1_compatibility */ - -#ifdef GL_REGAL_error_string - -static GLboolean _glewInit_GL_REGAL_error_string (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glErrorStringREGAL = (PFNGLERRORSTRINGREGALPROC)glewGetProcAddress((const GLubyte*)"glErrorStringREGAL")) == NULL) || r; - - return r; -} - -#endif /* GL_REGAL_error_string */ - -#ifdef GL_REGAL_extension_query - -static GLboolean _glewInit_GL_REGAL_extension_query (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetExtensionREGAL = (PFNGLGETEXTENSIONREGALPROC)glewGetProcAddress((const GLubyte*)"glGetExtensionREGAL")) == NULL) || r; - r = ((glIsSupportedREGAL = (PFNGLISSUPPORTEDREGALPROC)glewGetProcAddress((const GLubyte*)"glIsSupportedREGAL")) == NULL) || r; - - return r; -} - -#endif /* GL_REGAL_extension_query */ - -#ifdef GL_REGAL_log - -static GLboolean _glewInit_GL_REGAL_log (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glLogMessageCallbackREGAL = (PFNGLLOGMESSAGECALLBACKREGALPROC)glewGetProcAddress((const GLubyte*)"glLogMessageCallbackREGAL")) == NULL) || r; - - return r; -} - -#endif /* GL_REGAL_log */ - -#ifdef GL_REGAL_proc_address - -static GLboolean _glewInit_GL_REGAL_proc_address (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetProcAddressREGAL = (PFNGLGETPROCADDRESSREGALPROC)glewGetProcAddress((const GLubyte*)"glGetProcAddressREGAL")) == NULL) || r; - - return r; -} - -#endif /* GL_REGAL_proc_address */ - -#ifdef GL_SGIS_detail_texture - -static GLboolean _glewInit_GL_SGIS_detail_texture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDetailTexFuncSGIS = (PFNGLDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glDetailTexFuncSGIS")) == NULL) || r; - r = ((glGetDetailTexFuncSGIS = (PFNGLGETDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetDetailTexFuncSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_detail_texture */ - -#ifdef GL_SGIS_fog_function - -static GLboolean _glewInit_GL_SGIS_fog_function (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFogFuncSGIS = (PFNGLFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glFogFuncSGIS")) == NULL) || r; - r = ((glGetFogFuncSGIS = (PFNGLGETFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetFogFuncSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_fog_function */ - -#ifdef GL_SGIS_multisample - -static GLboolean _glewInit_GL_SGIS_multisample (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glSampleMaskSGIS = (PFNGLSAMPLEMASKSGISPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskSGIS")) == NULL) || r; - r = ((glSamplePatternSGIS = (PFNGLSAMPLEPATTERNSGISPROC)glewGetProcAddress((const GLubyte*)"glSamplePatternSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_multisample */ - -#ifdef GL_SGIS_sharpen_texture - -static GLboolean _glewInit_GL_SGIS_sharpen_texture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetSharpenTexFuncSGIS = (PFNGLGETSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetSharpenTexFuncSGIS")) == NULL) || r; - r = ((glSharpenTexFuncSGIS = (PFNGLSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glSharpenTexFuncSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_sharpen_texture */ - -#ifdef GL_SGIS_texture4D - -static GLboolean _glewInit_GL_SGIS_texture4D (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTexImage4DSGIS = (PFNGLTEXIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)"glTexImage4DSGIS")) == NULL) || r; - r = ((glTexSubImage4DSGIS = (PFNGLTEXSUBIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage4DSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_texture4D */ - -#ifdef GL_SGIS_texture_filter4 - -static GLboolean _glewInit_GL_SGIS_texture_filter4 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetTexFilterFuncSGIS = (PFNGLGETTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetTexFilterFuncSGIS")) == NULL) || r; - r = ((glTexFilterFuncSGIS = (PFNGLTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glTexFilterFuncSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_texture_filter4 */ - -#ifdef GL_SGIX_async - -static GLboolean _glewInit_GL_SGIX_async (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glAsyncMarkerSGIX = (PFNGLASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)"glAsyncMarkerSGIX")) == NULL) || r; - r = ((glDeleteAsyncMarkersSGIX = (PFNGLDELETEASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glDeleteAsyncMarkersSGIX")) == NULL) || r; - r = ((glFinishAsyncSGIX = (PFNGLFINISHASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glFinishAsyncSGIX")) == NULL) || r; - r = ((glGenAsyncMarkersSGIX = (PFNGLGENASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glGenAsyncMarkersSGIX")) == NULL) || r; - r = ((glIsAsyncMarkerSGIX = (PFNGLISASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)"glIsAsyncMarkerSGIX")) == NULL) || r; - r = ((glPollAsyncSGIX = (PFNGLPOLLASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glPollAsyncSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_async */ - -#ifdef GL_SGIX_flush_raster - -static GLboolean _glewInit_GL_SGIX_flush_raster (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFlushRasterSGIX = (PFNGLFLUSHRASTERSGIXPROC)glewGetProcAddress((const GLubyte*)"glFlushRasterSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_flush_raster */ - -#ifdef GL_SGIX_fog_texture - -static GLboolean _glewInit_GL_SGIX_fog_texture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTextureFogSGIX = (PFNGLTEXTUREFOGSGIXPROC)glewGetProcAddress((const GLubyte*)"glTextureFogSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_fog_texture */ - -#ifdef GL_SGIX_fragment_specular_lighting - -static GLboolean _glewInit_GL_SGIX_fragment_specular_lighting (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFragmentColorMaterialSGIX = (PFNGLFRAGMENTCOLORMATERIALSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentColorMaterialSGIX")) == NULL) || r; - r = ((glFragmentLightModelfSGIX = (PFNGLFRAGMENTLIGHTMODELFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfSGIX")) == NULL) || r; - r = ((glFragmentLightModelfvSGIX = (PFNGLFRAGMENTLIGHTMODELFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfvSGIX")) == NULL) || r; - r = ((glFragmentLightModeliSGIX = (PFNGLFRAGMENTLIGHTMODELISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModeliSGIX")) == NULL) || r; - r = ((glFragmentLightModelivSGIX = (PFNGLFRAGMENTLIGHTMODELIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelivSGIX")) == NULL) || r; - r = ((glFragmentLightfSGIX = (PFNGLFRAGMENTLIGHTFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfSGIX")) == NULL) || r; - r = ((glFragmentLightfvSGIX = (PFNGLFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfvSGIX")) == NULL) || r; - r = ((glFragmentLightiSGIX = (PFNGLFRAGMENTLIGHTISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightiSGIX")) == NULL) || r; - r = ((glFragmentLightivSGIX = (PFNGLFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightivSGIX")) == NULL) || r; - r = ((glFragmentMaterialfSGIX = (PFNGLFRAGMENTMATERIALFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfSGIX")) == NULL) || r; - r = ((glFragmentMaterialfvSGIX = (PFNGLFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfvSGIX")) == NULL) || r; - r = ((glFragmentMaterialiSGIX = (PFNGLFRAGMENTMATERIALISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialiSGIX")) == NULL) || r; - r = ((glFragmentMaterialivSGIX = (PFNGLFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialivSGIX")) == NULL) || r; - r = ((glGetFragmentLightfvSGIX = (PFNGLGETFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightfvSGIX")) == NULL) || r; - r = ((glGetFragmentLightivSGIX = (PFNGLGETFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightivSGIX")) == NULL) || r; - r = ((glGetFragmentMaterialfvSGIX = (PFNGLGETFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialfvSGIX")) == NULL) || r; - r = ((glGetFragmentMaterialivSGIX = (PFNGLGETFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialivSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_fragment_specular_lighting */ - -#ifdef GL_SGIX_framezoom - -static GLboolean _glewInit_GL_SGIX_framezoom (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFrameZoomSGIX = (PFNGLFRAMEZOOMSGIXPROC)glewGetProcAddress((const GLubyte*)"glFrameZoomSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_framezoom */ - -#ifdef GL_SGIX_pixel_texture - -static GLboolean _glewInit_GL_SGIX_pixel_texture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glPixelTexGenSGIX = (PFNGLPIXELTEXGENSGIXPROC)glewGetProcAddress((const GLubyte*)"glPixelTexGenSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_pixel_texture */ - -#ifdef GL_SGIX_reference_plane - -static GLboolean _glewInit_GL_SGIX_reference_plane (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glReferencePlaneSGIX = (PFNGLREFERENCEPLANESGIXPROC)glewGetProcAddress((const GLubyte*)"glReferencePlaneSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_reference_plane */ - -#ifdef GL_SGIX_sprite - -static GLboolean _glewInit_GL_SGIX_sprite (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glSpriteParameterfSGIX = (PFNGLSPRITEPARAMETERFSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterfSGIX")) == NULL) || r; - r = ((glSpriteParameterfvSGIX = (PFNGLSPRITEPARAMETERFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterfvSGIX")) == NULL) || r; - r = ((glSpriteParameteriSGIX = (PFNGLSPRITEPARAMETERISGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameteriSGIX")) == NULL) || r; - r = ((glSpriteParameterivSGIX = (PFNGLSPRITEPARAMETERIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterivSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_sprite */ - -#ifdef GL_SGIX_tag_sample_buffer - -static GLboolean _glewInit_GL_SGIX_tag_sample_buffer (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTagSampleBufferSGIX = (PFNGLTAGSAMPLEBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glTagSampleBufferSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_tag_sample_buffer */ - -#ifdef GL_SGI_color_table - -static GLboolean _glewInit_GL_SGI_color_table (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glColorTableParameterfvSGI = (PFNGLCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterfvSGI")) == NULL) || r; - r = ((glColorTableParameterivSGI = (PFNGLCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterivSGI")) == NULL) || r; - r = ((glColorTableSGI = (PFNGLCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableSGI")) == NULL) || r; - r = ((glCopyColorTableSGI = (PFNGLCOPYCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glCopyColorTableSGI")) == NULL) || r; - r = ((glGetColorTableParameterfvSGI = (PFNGLGETCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfvSGI")) == NULL) || r; - r = ((glGetColorTableParameterivSGI = (PFNGLGETCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterivSGI")) == NULL) || r; - r = ((glGetColorTableSGI = (PFNGLGETCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableSGI")) == NULL) || r; - - return r; -} - -#endif /* GL_SGI_color_table */ - -#ifdef GL_SUNX_constant_data - -static GLboolean _glewInit_GL_SUNX_constant_data (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFinishTextureSUNX = (PFNGLFINISHTEXTURESUNXPROC)glewGetProcAddress((const GLubyte*)"glFinishTextureSUNX")) == NULL) || r; - - return r; -} - -#endif /* GL_SUNX_constant_data */ - -#ifdef GL_SUN_global_alpha - -static GLboolean _glewInit_GL_SUN_global_alpha (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGlobalAlphaFactorbSUN = (PFNGLGLOBALALPHAFACTORBSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorbSUN")) == NULL) || r; - r = ((glGlobalAlphaFactordSUN = (PFNGLGLOBALALPHAFACTORDSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactordSUN")) == NULL) || r; - r = ((glGlobalAlphaFactorfSUN = (PFNGLGLOBALALPHAFACTORFSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorfSUN")) == NULL) || r; - r = ((glGlobalAlphaFactoriSUN = (PFNGLGLOBALALPHAFACTORISUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactoriSUN")) == NULL) || r; - r = ((glGlobalAlphaFactorsSUN = (PFNGLGLOBALALPHAFACTORSSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorsSUN")) == NULL) || r; - r = ((glGlobalAlphaFactorubSUN = (PFNGLGLOBALALPHAFACTORUBSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorubSUN")) == NULL) || r; - r = ((glGlobalAlphaFactoruiSUN = (PFNGLGLOBALALPHAFACTORUISUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactoruiSUN")) == NULL) || r; - r = ((glGlobalAlphaFactorusSUN = (PFNGLGLOBALALPHAFACTORUSSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorusSUN")) == NULL) || r; - - return r; -} - -#endif /* GL_SUN_global_alpha */ - -#ifdef GL_SUN_read_video_pixels - -static GLboolean _glewInit_GL_SUN_read_video_pixels (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glReadVideoPixelsSUN = (PFNGLREADVIDEOPIXELSSUNPROC)glewGetProcAddress((const GLubyte*)"glReadVideoPixelsSUN")) == NULL) || r; - - return r; -} - -#endif /* GL_SUN_read_video_pixels */ - -#ifdef GL_SUN_triangle_list - -static GLboolean _glewInit_GL_SUN_triangle_list (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glReplacementCodePointerSUN = (PFNGLREPLACEMENTCODEPOINTERSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodePointerSUN")) == NULL) || r; - r = ((glReplacementCodeubSUN = (PFNGLREPLACEMENTCODEUBSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeubSUN")) == NULL) || r; - r = ((glReplacementCodeubvSUN = (PFNGLREPLACEMENTCODEUBVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeubvSUN")) == NULL) || r; - r = ((glReplacementCodeuiSUN = (PFNGLREPLACEMENTCODEUISUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiSUN")) == NULL) || r; - r = ((glReplacementCodeuivSUN = (PFNGLREPLACEMENTCODEUIVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuivSUN")) == NULL) || r; - r = ((glReplacementCodeusSUN = (PFNGLREPLACEMENTCODEUSSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeusSUN")) == NULL) || r; - r = ((glReplacementCodeusvSUN = (PFNGLREPLACEMENTCODEUSVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeusvSUN")) == NULL) || r; - - return r; -} - -#endif /* GL_SUN_triangle_list */ - -#ifdef GL_SUN_vertex - -static GLboolean _glewInit_GL_SUN_vertex (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glColor3fVertex3fSUN = (PFNGLCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor3fVertex3fSUN")) == NULL) || r; - r = ((glColor3fVertex3fvSUN = (PFNGLCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor3fVertex3fvSUN")) == NULL) || r; - r = ((glColor4fNormal3fVertex3fSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glColor4fNormal3fVertex3fvSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glColor4ubVertex2fSUN = (PFNGLCOLOR4UBVERTEX2FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex2fSUN")) == NULL) || r; - r = ((glColor4ubVertex2fvSUN = (PFNGLCOLOR4UBVERTEX2FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex2fvSUN")) == NULL) || r; - r = ((glColor4ubVertex3fSUN = (PFNGLCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex3fSUN")) == NULL) || r; - r = ((glColor4ubVertex3fvSUN = (PFNGLCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex3fvSUN")) == NULL) || r; - r = ((glNormal3fVertex3fSUN = (PFNGLNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glNormal3fVertex3fSUN")) == NULL) || r; - r = ((glNormal3fVertex3fvSUN = (PFNGLNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor3fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor4ubVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4ubVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor4ubVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4ubVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiNormal3fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiVertex3fSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiVertex3fvSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord2fColor3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor3fVertex3fSUN")) == NULL) || r; - r = ((glTexCoord2fColor3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor3fVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord2fColor4ubVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4ubVertex3fSUN")) == NULL) || r; - r = ((glTexCoord2fColor4ubVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4ubVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord2fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glTexCoord2fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord2fVertex3fSUN = (PFNGLTEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fVertex3fSUN")) == NULL) || r; - r = ((glTexCoord2fVertex3fvSUN = (PFNGLTEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord4fColor4fNormal3fVertex4fSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fColor4fNormal3fVertex4fSUN")) == NULL) || r; - r = ((glTexCoord4fColor4fNormal3fVertex4fvSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fColor4fNormal3fVertex4fvSUN")) == NULL) || r; - r = ((glTexCoord4fVertex4fSUN = (PFNGLTEXCOORD4FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fVertex4fSUN")) == NULL) || r; - r = ((glTexCoord4fVertex4fvSUN = (PFNGLTEXCOORD4FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fVertex4fvSUN")) == NULL) || r; - - return r; -} - -#endif /* GL_SUN_vertex */ - -#ifdef GL_WIN_swap_hint - -static GLboolean _glewInit_GL_WIN_swap_hint (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glAddSwapHintRectWIN = (PFNGLADDSWAPHINTRECTWINPROC)glewGetProcAddress((const GLubyte*)"glAddSwapHintRectWIN")) == NULL) || r; - - return r; -} - -#endif /* GL_WIN_swap_hint */ - -/* ------------------------------------------------------------------------- */ - -GLboolean GLEWAPIENTRY glewGetExtension (const char* name) -{ - const GLubyte* start; - const GLubyte* end; - start = (const GLubyte*)glGetString(GL_EXTENSIONS); - if (start == 0) - return GL_FALSE; - end = start + _glewStrLen(start); - return _glewSearchExtension(name, start, end); -} - -/* ------------------------------------------------------------------------- */ - -#ifndef GLEW_MX -static -#endif -GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) -{ - const GLubyte* s; - GLuint dot; - GLint major, minor; - const GLubyte* extStart; - const GLubyte* extEnd; - /* query opengl version */ - s = glGetString(GL_VERSION); - dot = _glewStrCLen(s, '.'); - if (dot == 0) - return GLEW_ERROR_NO_GL_VERSION; - - major = s[dot-1]-'0'; - minor = s[dot+1]-'0'; - - if (minor < 0 || minor > 9) - minor = 0; - if (major<0 || major>9) - return GLEW_ERROR_NO_GL_VERSION; - - - if (major == 1 && minor == 0) - { - return GLEW_ERROR_GL_VERSION_10_ONLY; - } - else - { - GLEW_VERSION_4_5 = ( major > 4 ) || ( major == 4 && minor >= 5 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_4_4 = GLEW_VERSION_4_5 == GL_TRUE || ( major == 4 && minor >= 4 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_4_3 = GLEW_VERSION_4_4 == GL_TRUE || ( major == 4 && minor >= 3 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_4_2 = GLEW_VERSION_4_3 == GL_TRUE || ( major == 4 && minor >= 2 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_4_1 = GLEW_VERSION_4_2 == GL_TRUE || ( major == 4 && minor >= 1 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_4_0 = GLEW_VERSION_4_1 == GL_TRUE || ( major == 4 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_3_3 = GLEW_VERSION_4_0 == GL_TRUE || ( major == 3 && minor >= 3 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_3_2 = GLEW_VERSION_3_3 == GL_TRUE || ( major == 3 && minor >= 2 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_3_1 = GLEW_VERSION_3_2 == GL_TRUE || ( major == 3 && minor >= 1 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_3_0 = GLEW_VERSION_3_1 == GL_TRUE || ( major == 3 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_2_1 = GLEW_VERSION_3_0 == GL_TRUE || ( major == 2 && minor >= 1 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_2_0 = GLEW_VERSION_2_1 == GL_TRUE || ( major == 2 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_1_5 = GLEW_VERSION_2_0 == GL_TRUE || ( major == 1 && minor >= 5 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_1_4 = GLEW_VERSION_1_5 == GL_TRUE || ( major == 1 && minor >= 4 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_1_3 = GLEW_VERSION_1_4 == GL_TRUE || ( major == 1 && minor >= 3 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_1_2_1 = GLEW_VERSION_1_3 == GL_TRUE ? GL_TRUE : GL_FALSE; - GLEW_VERSION_1_2 = GLEW_VERSION_1_2_1 == GL_TRUE || ( major == 1 && minor >= 2 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_1_1 = GLEW_VERSION_1_2 == GL_TRUE || ( major == 1 && minor >= 1 ) ? GL_TRUE : GL_FALSE; - } - - /* query opengl extensions string */ - extStart = glGetString(GL_EXTENSIONS); - if (extStart == 0) - extStart = (const GLubyte*)""; - extEnd = extStart + _glewStrLen(extStart); - - /* initialize extensions */ -#ifdef GL_VERSION_1_2 - if (glewExperimental || GLEW_VERSION_1_2) GLEW_VERSION_1_2 = !_glewInit_GL_VERSION_1_2(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_VERSION_1_2 */ -#ifdef GL_VERSION_1_2_1 -#endif /* GL_VERSION_1_2_1 */ -#ifdef GL_VERSION_1_3 - if (glewExperimental || GLEW_VERSION_1_3) GLEW_VERSION_1_3 = !_glewInit_GL_VERSION_1_3(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_VERSION_1_3 */ -#ifdef GL_VERSION_1_4 - if (glewExperimental || GLEW_VERSION_1_4) GLEW_VERSION_1_4 = !_glewInit_GL_VERSION_1_4(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_VERSION_1_4 */ -#ifdef GL_VERSION_1_5 - if (glewExperimental || GLEW_VERSION_1_5) GLEW_VERSION_1_5 = !_glewInit_GL_VERSION_1_5(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_VERSION_1_5 */ -#ifdef GL_VERSION_2_0 - if (glewExperimental || GLEW_VERSION_2_0) GLEW_VERSION_2_0 = !_glewInit_GL_VERSION_2_0(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_VERSION_2_0 */ -#ifdef GL_VERSION_2_1 - if (glewExperimental || GLEW_VERSION_2_1) GLEW_VERSION_2_1 = !_glewInit_GL_VERSION_2_1(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_VERSION_2_1 */ -#ifdef GL_VERSION_3_0 - if (glewExperimental || GLEW_VERSION_3_0) GLEW_VERSION_3_0 = !_glewInit_GL_VERSION_3_0(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_VERSION_3_0 */ -#ifdef GL_VERSION_3_1 - if (glewExperimental || GLEW_VERSION_3_1) GLEW_VERSION_3_1 = !_glewInit_GL_VERSION_3_1(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_VERSION_3_1 */ -#ifdef GL_VERSION_3_2 - if (glewExperimental || GLEW_VERSION_3_2) GLEW_VERSION_3_2 = !_glewInit_GL_VERSION_3_2(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_VERSION_3_2 */ -#ifdef GL_VERSION_3_3 - if (glewExperimental || GLEW_VERSION_3_3) GLEW_VERSION_3_3 = !_glewInit_GL_VERSION_3_3(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_VERSION_3_3 */ -#ifdef GL_VERSION_4_0 - if (glewExperimental || GLEW_VERSION_4_0) GLEW_VERSION_4_0 = !_glewInit_GL_VERSION_4_0(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_VERSION_4_0 */ -#ifdef GL_VERSION_4_1 -#endif /* GL_VERSION_4_1 */ -#ifdef GL_VERSION_4_2 -#endif /* GL_VERSION_4_2 */ -#ifdef GL_VERSION_4_3 -#endif /* GL_VERSION_4_3 */ -#ifdef GL_VERSION_4_4 -#endif /* GL_VERSION_4_4 */ -#ifdef GL_VERSION_4_5 - if (glewExperimental || GLEW_VERSION_4_5) GLEW_VERSION_4_5 = !_glewInit_GL_VERSION_4_5(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_VERSION_4_5 */ -#ifdef GL_3DFX_multisample - GLEW_3DFX_multisample = _glewSearchExtension("GL_3DFX_multisample", extStart, extEnd); -#endif /* GL_3DFX_multisample */ -#ifdef GL_3DFX_tbuffer - GLEW_3DFX_tbuffer = _glewSearchExtension("GL_3DFX_tbuffer", extStart, extEnd); - if (glewExperimental || GLEW_3DFX_tbuffer) GLEW_3DFX_tbuffer = !_glewInit_GL_3DFX_tbuffer(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_3DFX_tbuffer */ -#ifdef GL_3DFX_texture_compression_FXT1 - GLEW_3DFX_texture_compression_FXT1 = _glewSearchExtension("GL_3DFX_texture_compression_FXT1", extStart, extEnd); -#endif /* GL_3DFX_texture_compression_FXT1 */ -#ifdef GL_AMD_blend_minmax_factor - GLEW_AMD_blend_minmax_factor = _glewSearchExtension("GL_AMD_blend_minmax_factor", extStart, extEnd); -#endif /* GL_AMD_blend_minmax_factor */ -#ifdef GL_AMD_conservative_depth - GLEW_AMD_conservative_depth = _glewSearchExtension("GL_AMD_conservative_depth", extStart, extEnd); -#endif /* GL_AMD_conservative_depth */ -#ifdef GL_AMD_debug_output - GLEW_AMD_debug_output = _glewSearchExtension("GL_AMD_debug_output", extStart, extEnd); - if (glewExperimental || GLEW_AMD_debug_output) GLEW_AMD_debug_output = !_glewInit_GL_AMD_debug_output(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_AMD_debug_output */ -#ifdef GL_AMD_depth_clamp_separate - GLEW_AMD_depth_clamp_separate = _glewSearchExtension("GL_AMD_depth_clamp_separate", extStart, extEnd); -#endif /* GL_AMD_depth_clamp_separate */ -#ifdef GL_AMD_draw_buffers_blend - GLEW_AMD_draw_buffers_blend = _glewSearchExtension("GL_AMD_draw_buffers_blend", extStart, extEnd); - if (glewExperimental || GLEW_AMD_draw_buffers_blend) GLEW_AMD_draw_buffers_blend = !_glewInit_GL_AMD_draw_buffers_blend(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_AMD_draw_buffers_blend */ -#ifdef GL_AMD_gcn_shader - GLEW_AMD_gcn_shader = _glewSearchExtension("GL_AMD_gcn_shader", extStart, extEnd); -#endif /* GL_AMD_gcn_shader */ -#ifdef GL_AMD_gpu_shader_int64 - GLEW_AMD_gpu_shader_int64 = _glewSearchExtension("GL_AMD_gpu_shader_int64", extStart, extEnd); -#endif /* GL_AMD_gpu_shader_int64 */ -#ifdef GL_AMD_interleaved_elements - GLEW_AMD_interleaved_elements = _glewSearchExtension("GL_AMD_interleaved_elements", extStart, extEnd); - if (glewExperimental || GLEW_AMD_interleaved_elements) GLEW_AMD_interleaved_elements = !_glewInit_GL_AMD_interleaved_elements(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_AMD_interleaved_elements */ -#ifdef GL_AMD_multi_draw_indirect - GLEW_AMD_multi_draw_indirect = _glewSearchExtension("GL_AMD_multi_draw_indirect", extStart, extEnd); - if (glewExperimental || GLEW_AMD_multi_draw_indirect) GLEW_AMD_multi_draw_indirect = !_glewInit_GL_AMD_multi_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_AMD_multi_draw_indirect */ -#ifdef GL_AMD_name_gen_delete - GLEW_AMD_name_gen_delete = _glewSearchExtension("GL_AMD_name_gen_delete", extStart, extEnd); - if (glewExperimental || GLEW_AMD_name_gen_delete) GLEW_AMD_name_gen_delete = !_glewInit_GL_AMD_name_gen_delete(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_AMD_name_gen_delete */ -#ifdef GL_AMD_occlusion_query_event - GLEW_AMD_occlusion_query_event = _glewSearchExtension("GL_AMD_occlusion_query_event", extStart, extEnd); - if (glewExperimental || GLEW_AMD_occlusion_query_event) GLEW_AMD_occlusion_query_event = !_glewInit_GL_AMD_occlusion_query_event(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_AMD_occlusion_query_event */ -#ifdef GL_AMD_performance_monitor - GLEW_AMD_performance_monitor = _glewSearchExtension("GL_AMD_performance_monitor", extStart, extEnd); - if (glewExperimental || GLEW_AMD_performance_monitor) GLEW_AMD_performance_monitor = !_glewInit_GL_AMD_performance_monitor(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_AMD_performance_monitor */ -#ifdef GL_AMD_pinned_memory - GLEW_AMD_pinned_memory = _glewSearchExtension("GL_AMD_pinned_memory", extStart, extEnd); -#endif /* GL_AMD_pinned_memory */ -#ifdef GL_AMD_query_buffer_object - GLEW_AMD_query_buffer_object = _glewSearchExtension("GL_AMD_query_buffer_object", extStart, extEnd); -#endif /* GL_AMD_query_buffer_object */ -#ifdef GL_AMD_sample_positions - GLEW_AMD_sample_positions = _glewSearchExtension("GL_AMD_sample_positions", extStart, extEnd); - if (glewExperimental || GLEW_AMD_sample_positions) GLEW_AMD_sample_positions = !_glewInit_GL_AMD_sample_positions(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_AMD_sample_positions */ -#ifdef GL_AMD_seamless_cubemap_per_texture - GLEW_AMD_seamless_cubemap_per_texture = _glewSearchExtension("GL_AMD_seamless_cubemap_per_texture", extStart, extEnd); -#endif /* GL_AMD_seamless_cubemap_per_texture */ -#ifdef GL_AMD_shader_atomic_counter_ops - GLEW_AMD_shader_atomic_counter_ops = _glewSearchExtension("GL_AMD_shader_atomic_counter_ops", extStart, extEnd); -#endif /* GL_AMD_shader_atomic_counter_ops */ -#ifdef GL_AMD_shader_stencil_export - GLEW_AMD_shader_stencil_export = _glewSearchExtension("GL_AMD_shader_stencil_export", extStart, extEnd); -#endif /* GL_AMD_shader_stencil_export */ -#ifdef GL_AMD_shader_stencil_value_export - GLEW_AMD_shader_stencil_value_export = _glewSearchExtension("GL_AMD_shader_stencil_value_export", extStart, extEnd); -#endif /* GL_AMD_shader_stencil_value_export */ -#ifdef GL_AMD_shader_trinary_minmax - GLEW_AMD_shader_trinary_minmax = _glewSearchExtension("GL_AMD_shader_trinary_minmax", extStart, extEnd); -#endif /* GL_AMD_shader_trinary_minmax */ -#ifdef GL_AMD_sparse_texture - GLEW_AMD_sparse_texture = _glewSearchExtension("GL_AMD_sparse_texture", extStart, extEnd); - if (glewExperimental || GLEW_AMD_sparse_texture) GLEW_AMD_sparse_texture = !_glewInit_GL_AMD_sparse_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_AMD_sparse_texture */ -#ifdef GL_AMD_stencil_operation_extended - GLEW_AMD_stencil_operation_extended = _glewSearchExtension("GL_AMD_stencil_operation_extended", extStart, extEnd); - if (glewExperimental || GLEW_AMD_stencil_operation_extended) GLEW_AMD_stencil_operation_extended = !_glewInit_GL_AMD_stencil_operation_extended(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_AMD_stencil_operation_extended */ -#ifdef GL_AMD_texture_texture4 - GLEW_AMD_texture_texture4 = _glewSearchExtension("GL_AMD_texture_texture4", extStart, extEnd); -#endif /* GL_AMD_texture_texture4 */ -#ifdef GL_AMD_transform_feedback3_lines_triangles - GLEW_AMD_transform_feedback3_lines_triangles = _glewSearchExtension("GL_AMD_transform_feedback3_lines_triangles", extStart, extEnd); -#endif /* GL_AMD_transform_feedback3_lines_triangles */ -#ifdef GL_AMD_transform_feedback4 - GLEW_AMD_transform_feedback4 = _glewSearchExtension("GL_AMD_transform_feedback4", extStart, extEnd); -#endif /* GL_AMD_transform_feedback4 */ -#ifdef GL_AMD_vertex_shader_layer - GLEW_AMD_vertex_shader_layer = _glewSearchExtension("GL_AMD_vertex_shader_layer", extStart, extEnd); -#endif /* GL_AMD_vertex_shader_layer */ -#ifdef GL_AMD_vertex_shader_tessellator - GLEW_AMD_vertex_shader_tessellator = _glewSearchExtension("GL_AMD_vertex_shader_tessellator", extStart, extEnd); - if (glewExperimental || GLEW_AMD_vertex_shader_tessellator) GLEW_AMD_vertex_shader_tessellator = !_glewInit_GL_AMD_vertex_shader_tessellator(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_AMD_vertex_shader_tessellator */ -#ifdef GL_AMD_vertex_shader_viewport_index - GLEW_AMD_vertex_shader_viewport_index = _glewSearchExtension("GL_AMD_vertex_shader_viewport_index", extStart, extEnd); -#endif /* GL_AMD_vertex_shader_viewport_index */ -#ifdef GL_ANGLE_depth_texture - GLEW_ANGLE_depth_texture = _glewSearchExtension("GL_ANGLE_depth_texture", extStart, extEnd); -#endif /* GL_ANGLE_depth_texture */ -#ifdef GL_ANGLE_framebuffer_blit - GLEW_ANGLE_framebuffer_blit = _glewSearchExtension("GL_ANGLE_framebuffer_blit", extStart, extEnd); - if (glewExperimental || GLEW_ANGLE_framebuffer_blit) GLEW_ANGLE_framebuffer_blit = !_glewInit_GL_ANGLE_framebuffer_blit(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ANGLE_framebuffer_blit */ -#ifdef GL_ANGLE_framebuffer_multisample - GLEW_ANGLE_framebuffer_multisample = _glewSearchExtension("GL_ANGLE_framebuffer_multisample", extStart, extEnd); - if (glewExperimental || GLEW_ANGLE_framebuffer_multisample) GLEW_ANGLE_framebuffer_multisample = !_glewInit_GL_ANGLE_framebuffer_multisample(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ANGLE_framebuffer_multisample */ -#ifdef GL_ANGLE_instanced_arrays - GLEW_ANGLE_instanced_arrays = _glewSearchExtension("GL_ANGLE_instanced_arrays", extStart, extEnd); - if (glewExperimental || GLEW_ANGLE_instanced_arrays) GLEW_ANGLE_instanced_arrays = !_glewInit_GL_ANGLE_instanced_arrays(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ANGLE_instanced_arrays */ -#ifdef GL_ANGLE_pack_reverse_row_order - GLEW_ANGLE_pack_reverse_row_order = _glewSearchExtension("GL_ANGLE_pack_reverse_row_order", extStart, extEnd); -#endif /* GL_ANGLE_pack_reverse_row_order */ -#ifdef GL_ANGLE_program_binary - GLEW_ANGLE_program_binary = _glewSearchExtension("GL_ANGLE_program_binary", extStart, extEnd); -#endif /* GL_ANGLE_program_binary */ -#ifdef GL_ANGLE_texture_compression_dxt1 - GLEW_ANGLE_texture_compression_dxt1 = _glewSearchExtension("GL_ANGLE_texture_compression_dxt1", extStart, extEnd); -#endif /* GL_ANGLE_texture_compression_dxt1 */ -#ifdef GL_ANGLE_texture_compression_dxt3 - GLEW_ANGLE_texture_compression_dxt3 = _glewSearchExtension("GL_ANGLE_texture_compression_dxt3", extStart, extEnd); -#endif /* GL_ANGLE_texture_compression_dxt3 */ -#ifdef GL_ANGLE_texture_compression_dxt5 - GLEW_ANGLE_texture_compression_dxt5 = _glewSearchExtension("GL_ANGLE_texture_compression_dxt5", extStart, extEnd); -#endif /* GL_ANGLE_texture_compression_dxt5 */ -#ifdef GL_ANGLE_texture_usage - GLEW_ANGLE_texture_usage = _glewSearchExtension("GL_ANGLE_texture_usage", extStart, extEnd); -#endif /* GL_ANGLE_texture_usage */ -#ifdef GL_ANGLE_timer_query - GLEW_ANGLE_timer_query = _glewSearchExtension("GL_ANGLE_timer_query", extStart, extEnd); - if (glewExperimental || GLEW_ANGLE_timer_query) GLEW_ANGLE_timer_query = !_glewInit_GL_ANGLE_timer_query(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ANGLE_timer_query */ -#ifdef GL_ANGLE_translated_shader_source - GLEW_ANGLE_translated_shader_source = _glewSearchExtension("GL_ANGLE_translated_shader_source", extStart, extEnd); - if (glewExperimental || GLEW_ANGLE_translated_shader_source) GLEW_ANGLE_translated_shader_source = !_glewInit_GL_ANGLE_translated_shader_source(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ANGLE_translated_shader_source */ -#ifdef GL_APPLE_aux_depth_stencil - GLEW_APPLE_aux_depth_stencil = _glewSearchExtension("GL_APPLE_aux_depth_stencil", extStart, extEnd); -#endif /* GL_APPLE_aux_depth_stencil */ -#ifdef GL_APPLE_client_storage - GLEW_APPLE_client_storage = _glewSearchExtension("GL_APPLE_client_storage", extStart, extEnd); -#endif /* GL_APPLE_client_storage */ -#ifdef GL_APPLE_element_array - GLEW_APPLE_element_array = _glewSearchExtension("GL_APPLE_element_array", extStart, extEnd); - if (glewExperimental || GLEW_APPLE_element_array) GLEW_APPLE_element_array = !_glewInit_GL_APPLE_element_array(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_APPLE_element_array */ -#ifdef GL_APPLE_fence - GLEW_APPLE_fence = _glewSearchExtension("GL_APPLE_fence", extStart, extEnd); - if (glewExperimental || GLEW_APPLE_fence) GLEW_APPLE_fence = !_glewInit_GL_APPLE_fence(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_APPLE_fence */ -#ifdef GL_APPLE_float_pixels - GLEW_APPLE_float_pixels = _glewSearchExtension("GL_APPLE_float_pixels", extStart, extEnd); -#endif /* GL_APPLE_float_pixels */ -#ifdef GL_APPLE_flush_buffer_range - GLEW_APPLE_flush_buffer_range = _glewSearchExtension("GL_APPLE_flush_buffer_range", extStart, extEnd); - if (glewExperimental || GLEW_APPLE_flush_buffer_range) GLEW_APPLE_flush_buffer_range = !_glewInit_GL_APPLE_flush_buffer_range(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_APPLE_flush_buffer_range */ -#ifdef GL_APPLE_object_purgeable - GLEW_APPLE_object_purgeable = _glewSearchExtension("GL_APPLE_object_purgeable", extStart, extEnd); - if (glewExperimental || GLEW_APPLE_object_purgeable) GLEW_APPLE_object_purgeable = !_glewInit_GL_APPLE_object_purgeable(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_APPLE_object_purgeable */ -#ifdef GL_APPLE_pixel_buffer - GLEW_APPLE_pixel_buffer = _glewSearchExtension("GL_APPLE_pixel_buffer", extStart, extEnd); -#endif /* GL_APPLE_pixel_buffer */ -#ifdef GL_APPLE_rgb_422 - GLEW_APPLE_rgb_422 = _glewSearchExtension("GL_APPLE_rgb_422", extStart, extEnd); -#endif /* GL_APPLE_rgb_422 */ -#ifdef GL_APPLE_row_bytes - GLEW_APPLE_row_bytes = _glewSearchExtension("GL_APPLE_row_bytes", extStart, extEnd); -#endif /* GL_APPLE_row_bytes */ -#ifdef GL_APPLE_specular_vector - GLEW_APPLE_specular_vector = _glewSearchExtension("GL_APPLE_specular_vector", extStart, extEnd); -#endif /* GL_APPLE_specular_vector */ -#ifdef GL_APPLE_texture_range - GLEW_APPLE_texture_range = _glewSearchExtension("GL_APPLE_texture_range", extStart, extEnd); - if (glewExperimental || GLEW_APPLE_texture_range) GLEW_APPLE_texture_range = !_glewInit_GL_APPLE_texture_range(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_APPLE_texture_range */ -#ifdef GL_APPLE_transform_hint - GLEW_APPLE_transform_hint = _glewSearchExtension("GL_APPLE_transform_hint", extStart, extEnd); -#endif /* GL_APPLE_transform_hint */ -#ifdef GL_APPLE_vertex_array_object - GLEW_APPLE_vertex_array_object = _glewSearchExtension("GL_APPLE_vertex_array_object", extStart, extEnd); - if (glewExperimental || GLEW_APPLE_vertex_array_object) GLEW_APPLE_vertex_array_object = !_glewInit_GL_APPLE_vertex_array_object(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_APPLE_vertex_array_object */ -#ifdef GL_APPLE_vertex_array_range - GLEW_APPLE_vertex_array_range = _glewSearchExtension("GL_APPLE_vertex_array_range", extStart, extEnd); - if (glewExperimental || GLEW_APPLE_vertex_array_range) GLEW_APPLE_vertex_array_range = !_glewInit_GL_APPLE_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_APPLE_vertex_array_range */ -#ifdef GL_APPLE_vertex_program_evaluators - GLEW_APPLE_vertex_program_evaluators = _glewSearchExtension("GL_APPLE_vertex_program_evaluators", extStart, extEnd); - if (glewExperimental || GLEW_APPLE_vertex_program_evaluators) GLEW_APPLE_vertex_program_evaluators = !_glewInit_GL_APPLE_vertex_program_evaluators(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_APPLE_vertex_program_evaluators */ -#ifdef GL_APPLE_ycbcr_422 - GLEW_APPLE_ycbcr_422 = _glewSearchExtension("GL_APPLE_ycbcr_422", extStart, extEnd); -#endif /* GL_APPLE_ycbcr_422 */ -#ifdef GL_ARB_ES2_compatibility - GLEW_ARB_ES2_compatibility = _glewSearchExtension("GL_ARB_ES2_compatibility", extStart, extEnd); - if (glewExperimental || GLEW_ARB_ES2_compatibility) GLEW_ARB_ES2_compatibility = !_glewInit_GL_ARB_ES2_compatibility(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_ES2_compatibility */ -#ifdef GL_ARB_ES3_1_compatibility - GLEW_ARB_ES3_1_compatibility = _glewSearchExtension("GL_ARB_ES3_1_compatibility", extStart, extEnd); - if (glewExperimental || GLEW_ARB_ES3_1_compatibility) GLEW_ARB_ES3_1_compatibility = !_glewInit_GL_ARB_ES3_1_compatibility(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_ES3_1_compatibility */ -#ifdef GL_ARB_ES3_2_compatibility - GLEW_ARB_ES3_2_compatibility = _glewSearchExtension("GL_ARB_ES3_2_compatibility", extStart, extEnd); - if (glewExperimental || GLEW_ARB_ES3_2_compatibility) GLEW_ARB_ES3_2_compatibility = !_glewInit_GL_ARB_ES3_2_compatibility(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_ES3_2_compatibility */ -#ifdef GL_ARB_ES3_compatibility - GLEW_ARB_ES3_compatibility = _glewSearchExtension("GL_ARB_ES3_compatibility", extStart, extEnd); -#endif /* GL_ARB_ES3_compatibility */ -#ifdef GL_ARB_arrays_of_arrays - GLEW_ARB_arrays_of_arrays = _glewSearchExtension("GL_ARB_arrays_of_arrays", extStart, extEnd); -#endif /* GL_ARB_arrays_of_arrays */ -#ifdef GL_ARB_base_instance - GLEW_ARB_base_instance = _glewSearchExtension("GL_ARB_base_instance", extStart, extEnd); - if (glewExperimental || GLEW_ARB_base_instance) GLEW_ARB_base_instance = !_glewInit_GL_ARB_base_instance(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_base_instance */ -#ifdef GL_ARB_bindless_texture - GLEW_ARB_bindless_texture = _glewSearchExtension("GL_ARB_bindless_texture", extStart, extEnd); - if (glewExperimental || GLEW_ARB_bindless_texture) GLEW_ARB_bindless_texture = !_glewInit_GL_ARB_bindless_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_bindless_texture */ -#ifdef GL_ARB_blend_func_extended - GLEW_ARB_blend_func_extended = _glewSearchExtension("GL_ARB_blend_func_extended", extStart, extEnd); - if (glewExperimental || GLEW_ARB_blend_func_extended) GLEW_ARB_blend_func_extended = !_glewInit_GL_ARB_blend_func_extended(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_blend_func_extended */ -#ifdef GL_ARB_buffer_storage - GLEW_ARB_buffer_storage = _glewSearchExtension("GL_ARB_buffer_storage", extStart, extEnd); - if (glewExperimental || GLEW_ARB_buffer_storage) GLEW_ARB_buffer_storage = !_glewInit_GL_ARB_buffer_storage(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_buffer_storage */ -#ifdef GL_ARB_cl_event - GLEW_ARB_cl_event = _glewSearchExtension("GL_ARB_cl_event", extStart, extEnd); - if (glewExperimental || GLEW_ARB_cl_event) GLEW_ARB_cl_event = !_glewInit_GL_ARB_cl_event(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_cl_event */ -#ifdef GL_ARB_clear_buffer_object - GLEW_ARB_clear_buffer_object = _glewSearchExtension("GL_ARB_clear_buffer_object", extStart, extEnd); - if (glewExperimental || GLEW_ARB_clear_buffer_object) GLEW_ARB_clear_buffer_object = !_glewInit_GL_ARB_clear_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_clear_buffer_object */ -#ifdef GL_ARB_clear_texture - GLEW_ARB_clear_texture = _glewSearchExtension("GL_ARB_clear_texture", extStart, extEnd); - if (glewExperimental || GLEW_ARB_clear_texture) GLEW_ARB_clear_texture = !_glewInit_GL_ARB_clear_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_clear_texture */ -#ifdef GL_ARB_clip_control - GLEW_ARB_clip_control = _glewSearchExtension("GL_ARB_clip_control", extStart, extEnd); - if (glewExperimental || GLEW_ARB_clip_control) GLEW_ARB_clip_control = !_glewInit_GL_ARB_clip_control(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_clip_control */ -#ifdef GL_ARB_color_buffer_float - GLEW_ARB_color_buffer_float = _glewSearchExtension("GL_ARB_color_buffer_float", extStart, extEnd); - if (glewExperimental || GLEW_ARB_color_buffer_float) GLEW_ARB_color_buffer_float = !_glewInit_GL_ARB_color_buffer_float(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_color_buffer_float */ -#ifdef GL_ARB_compatibility - GLEW_ARB_compatibility = _glewSearchExtension("GL_ARB_compatibility", extStart, extEnd); -#endif /* GL_ARB_compatibility */ -#ifdef GL_ARB_compressed_texture_pixel_storage - GLEW_ARB_compressed_texture_pixel_storage = _glewSearchExtension("GL_ARB_compressed_texture_pixel_storage", extStart, extEnd); -#endif /* GL_ARB_compressed_texture_pixel_storage */ -#ifdef GL_ARB_compute_shader - GLEW_ARB_compute_shader = _glewSearchExtension("GL_ARB_compute_shader", extStart, extEnd); - if (glewExperimental || GLEW_ARB_compute_shader) GLEW_ARB_compute_shader = !_glewInit_GL_ARB_compute_shader(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_compute_shader */ -#ifdef GL_ARB_compute_variable_group_size - GLEW_ARB_compute_variable_group_size = _glewSearchExtension("GL_ARB_compute_variable_group_size", extStart, extEnd); - if (glewExperimental || GLEW_ARB_compute_variable_group_size) GLEW_ARB_compute_variable_group_size = !_glewInit_GL_ARB_compute_variable_group_size(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_compute_variable_group_size */ -#ifdef GL_ARB_conditional_render_inverted - GLEW_ARB_conditional_render_inverted = _glewSearchExtension("GL_ARB_conditional_render_inverted", extStart, extEnd); -#endif /* GL_ARB_conditional_render_inverted */ -#ifdef GL_ARB_conservative_depth - GLEW_ARB_conservative_depth = _glewSearchExtension("GL_ARB_conservative_depth", extStart, extEnd); -#endif /* GL_ARB_conservative_depth */ -#ifdef GL_ARB_copy_buffer - GLEW_ARB_copy_buffer = _glewSearchExtension("GL_ARB_copy_buffer", extStart, extEnd); - if (glewExperimental || GLEW_ARB_copy_buffer) GLEW_ARB_copy_buffer = !_glewInit_GL_ARB_copy_buffer(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_copy_buffer */ -#ifdef GL_ARB_copy_image - GLEW_ARB_copy_image = _glewSearchExtension("GL_ARB_copy_image", extStart, extEnd); - if (glewExperimental || GLEW_ARB_copy_image) GLEW_ARB_copy_image = !_glewInit_GL_ARB_copy_image(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_copy_image */ -#ifdef GL_ARB_cull_distance - GLEW_ARB_cull_distance = _glewSearchExtension("GL_ARB_cull_distance", extStart, extEnd); -#endif /* GL_ARB_cull_distance */ -#ifdef GL_ARB_debug_output - GLEW_ARB_debug_output = _glewSearchExtension("GL_ARB_debug_output", extStart, extEnd); - if (glewExperimental || GLEW_ARB_debug_output) GLEW_ARB_debug_output = !_glewInit_GL_ARB_debug_output(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_debug_output */ -#ifdef GL_ARB_depth_buffer_float - GLEW_ARB_depth_buffer_float = _glewSearchExtension("GL_ARB_depth_buffer_float", extStart, extEnd); -#endif /* GL_ARB_depth_buffer_float */ -#ifdef GL_ARB_depth_clamp - GLEW_ARB_depth_clamp = _glewSearchExtension("GL_ARB_depth_clamp", extStart, extEnd); -#endif /* GL_ARB_depth_clamp */ -#ifdef GL_ARB_depth_texture - GLEW_ARB_depth_texture = _glewSearchExtension("GL_ARB_depth_texture", extStart, extEnd); -#endif /* GL_ARB_depth_texture */ -#ifdef GL_ARB_derivative_control - GLEW_ARB_derivative_control = _glewSearchExtension("GL_ARB_derivative_control", extStart, extEnd); -#endif /* GL_ARB_derivative_control */ -#ifdef GL_ARB_direct_state_access - GLEW_ARB_direct_state_access = _glewSearchExtension("GL_ARB_direct_state_access", extStart, extEnd); - if (glewExperimental || GLEW_ARB_direct_state_access) GLEW_ARB_direct_state_access = !_glewInit_GL_ARB_direct_state_access(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_direct_state_access */ -#ifdef GL_ARB_draw_buffers - GLEW_ARB_draw_buffers = _glewSearchExtension("GL_ARB_draw_buffers", extStart, extEnd); - if (glewExperimental || GLEW_ARB_draw_buffers) GLEW_ARB_draw_buffers = !_glewInit_GL_ARB_draw_buffers(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_draw_buffers */ -#ifdef GL_ARB_draw_buffers_blend - GLEW_ARB_draw_buffers_blend = _glewSearchExtension("GL_ARB_draw_buffers_blend", extStart, extEnd); - if (glewExperimental || GLEW_ARB_draw_buffers_blend) GLEW_ARB_draw_buffers_blend = !_glewInit_GL_ARB_draw_buffers_blend(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_draw_buffers_blend */ -#ifdef GL_ARB_draw_elements_base_vertex - GLEW_ARB_draw_elements_base_vertex = _glewSearchExtension("GL_ARB_draw_elements_base_vertex", extStart, extEnd); - if (glewExperimental || GLEW_ARB_draw_elements_base_vertex) GLEW_ARB_draw_elements_base_vertex = !_glewInit_GL_ARB_draw_elements_base_vertex(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_draw_elements_base_vertex */ -#ifdef GL_ARB_draw_indirect - GLEW_ARB_draw_indirect = _glewSearchExtension("GL_ARB_draw_indirect", extStart, extEnd); - if (glewExperimental || GLEW_ARB_draw_indirect) GLEW_ARB_draw_indirect = !_glewInit_GL_ARB_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_draw_indirect */ -#ifdef GL_ARB_draw_instanced - GLEW_ARB_draw_instanced = _glewSearchExtension("GL_ARB_draw_instanced", extStart, extEnd); -#endif /* GL_ARB_draw_instanced */ -#ifdef GL_ARB_enhanced_layouts - GLEW_ARB_enhanced_layouts = _glewSearchExtension("GL_ARB_enhanced_layouts", extStart, extEnd); -#endif /* GL_ARB_enhanced_layouts */ -#ifdef GL_ARB_explicit_attrib_location - GLEW_ARB_explicit_attrib_location = _glewSearchExtension("GL_ARB_explicit_attrib_location", extStart, extEnd); -#endif /* GL_ARB_explicit_attrib_location */ -#ifdef GL_ARB_explicit_uniform_location - GLEW_ARB_explicit_uniform_location = _glewSearchExtension("GL_ARB_explicit_uniform_location", extStart, extEnd); -#endif /* GL_ARB_explicit_uniform_location */ -#ifdef GL_ARB_fragment_coord_conventions - GLEW_ARB_fragment_coord_conventions = _glewSearchExtension("GL_ARB_fragment_coord_conventions", extStart, extEnd); -#endif /* GL_ARB_fragment_coord_conventions */ -#ifdef GL_ARB_fragment_layer_viewport - GLEW_ARB_fragment_layer_viewport = _glewSearchExtension("GL_ARB_fragment_layer_viewport", extStart, extEnd); -#endif /* GL_ARB_fragment_layer_viewport */ -#ifdef GL_ARB_fragment_program - GLEW_ARB_fragment_program = _glewSearchExtension("GL_ARB_fragment_program", extStart, extEnd); -#endif /* GL_ARB_fragment_program */ -#ifdef GL_ARB_fragment_program_shadow - GLEW_ARB_fragment_program_shadow = _glewSearchExtension("GL_ARB_fragment_program_shadow", extStart, extEnd); -#endif /* GL_ARB_fragment_program_shadow */ -#ifdef GL_ARB_fragment_shader - GLEW_ARB_fragment_shader = _glewSearchExtension("GL_ARB_fragment_shader", extStart, extEnd); -#endif /* GL_ARB_fragment_shader */ -#ifdef GL_ARB_fragment_shader_interlock - GLEW_ARB_fragment_shader_interlock = _glewSearchExtension("GL_ARB_fragment_shader_interlock", extStart, extEnd); -#endif /* GL_ARB_fragment_shader_interlock */ -#ifdef GL_ARB_framebuffer_no_attachments - GLEW_ARB_framebuffer_no_attachments = _glewSearchExtension("GL_ARB_framebuffer_no_attachments", extStart, extEnd); - if (glewExperimental || GLEW_ARB_framebuffer_no_attachments) GLEW_ARB_framebuffer_no_attachments = !_glewInit_GL_ARB_framebuffer_no_attachments(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_framebuffer_no_attachments */ -#ifdef GL_ARB_framebuffer_object - GLEW_ARB_framebuffer_object = _glewSearchExtension("GL_ARB_framebuffer_object", extStart, extEnd); - if (glewExperimental || GLEW_ARB_framebuffer_object) GLEW_ARB_framebuffer_object = !_glewInit_GL_ARB_framebuffer_object(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_framebuffer_object */ -#ifdef GL_ARB_framebuffer_sRGB - GLEW_ARB_framebuffer_sRGB = _glewSearchExtension("GL_ARB_framebuffer_sRGB", extStart, extEnd); -#endif /* GL_ARB_framebuffer_sRGB */ -#ifdef GL_ARB_geometry_shader4 - GLEW_ARB_geometry_shader4 = _glewSearchExtension("GL_ARB_geometry_shader4", extStart, extEnd); - if (glewExperimental || GLEW_ARB_geometry_shader4) GLEW_ARB_geometry_shader4 = !_glewInit_GL_ARB_geometry_shader4(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_geometry_shader4 */ -#ifdef GL_ARB_get_program_binary - GLEW_ARB_get_program_binary = _glewSearchExtension("GL_ARB_get_program_binary", extStart, extEnd); - if (glewExperimental || GLEW_ARB_get_program_binary) GLEW_ARB_get_program_binary = !_glewInit_GL_ARB_get_program_binary(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_get_program_binary */ -#ifdef GL_ARB_get_texture_sub_image - GLEW_ARB_get_texture_sub_image = _glewSearchExtension("GL_ARB_get_texture_sub_image", extStart, extEnd); - if (glewExperimental || GLEW_ARB_get_texture_sub_image) GLEW_ARB_get_texture_sub_image = !_glewInit_GL_ARB_get_texture_sub_image(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_get_texture_sub_image */ -#ifdef GL_ARB_gpu_shader5 - GLEW_ARB_gpu_shader5 = _glewSearchExtension("GL_ARB_gpu_shader5", extStart, extEnd); -#endif /* GL_ARB_gpu_shader5 */ -#ifdef GL_ARB_gpu_shader_fp64 - GLEW_ARB_gpu_shader_fp64 = _glewSearchExtension("GL_ARB_gpu_shader_fp64", extStart, extEnd); - if (glewExperimental || GLEW_ARB_gpu_shader_fp64) GLEW_ARB_gpu_shader_fp64 = !_glewInit_GL_ARB_gpu_shader_fp64(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_gpu_shader_fp64 */ -#ifdef GL_ARB_gpu_shader_int64 - GLEW_ARB_gpu_shader_int64 = _glewSearchExtension("GL_ARB_gpu_shader_int64", extStart, extEnd); - if (glewExperimental || GLEW_ARB_gpu_shader_int64) GLEW_ARB_gpu_shader_int64 = !_glewInit_GL_ARB_gpu_shader_int64(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_gpu_shader_int64 */ -#ifdef GL_ARB_half_float_pixel - GLEW_ARB_half_float_pixel = _glewSearchExtension("GL_ARB_half_float_pixel", extStart, extEnd); -#endif /* GL_ARB_half_float_pixel */ -#ifdef GL_ARB_half_float_vertex - GLEW_ARB_half_float_vertex = _glewSearchExtension("GL_ARB_half_float_vertex", extStart, extEnd); -#endif /* GL_ARB_half_float_vertex */ -#ifdef GL_ARB_imaging - GLEW_ARB_imaging = _glewSearchExtension("GL_ARB_imaging", extStart, extEnd); - if (glewExperimental || GLEW_ARB_imaging) GLEW_ARB_imaging = !_glewInit_GL_ARB_imaging(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_imaging */ -#ifdef GL_ARB_indirect_parameters - GLEW_ARB_indirect_parameters = _glewSearchExtension("GL_ARB_indirect_parameters", extStart, extEnd); - if (glewExperimental || GLEW_ARB_indirect_parameters) GLEW_ARB_indirect_parameters = !_glewInit_GL_ARB_indirect_parameters(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_indirect_parameters */ -#ifdef GL_ARB_instanced_arrays - GLEW_ARB_instanced_arrays = _glewSearchExtension("GL_ARB_instanced_arrays", extStart, extEnd); - if (glewExperimental || GLEW_ARB_instanced_arrays) GLEW_ARB_instanced_arrays = !_glewInit_GL_ARB_instanced_arrays(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_instanced_arrays */ -#ifdef GL_ARB_internalformat_query - GLEW_ARB_internalformat_query = _glewSearchExtension("GL_ARB_internalformat_query", extStart, extEnd); - if (glewExperimental || GLEW_ARB_internalformat_query) GLEW_ARB_internalformat_query = !_glewInit_GL_ARB_internalformat_query(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_internalformat_query */ -#ifdef GL_ARB_internalformat_query2 - GLEW_ARB_internalformat_query2 = _glewSearchExtension("GL_ARB_internalformat_query2", extStart, extEnd); - if (glewExperimental || GLEW_ARB_internalformat_query2) GLEW_ARB_internalformat_query2 = !_glewInit_GL_ARB_internalformat_query2(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_internalformat_query2 */ -#ifdef GL_ARB_invalidate_subdata - GLEW_ARB_invalidate_subdata = _glewSearchExtension("GL_ARB_invalidate_subdata", extStart, extEnd); - if (glewExperimental || GLEW_ARB_invalidate_subdata) GLEW_ARB_invalidate_subdata = !_glewInit_GL_ARB_invalidate_subdata(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_invalidate_subdata */ -#ifdef GL_ARB_map_buffer_alignment - GLEW_ARB_map_buffer_alignment = _glewSearchExtension("GL_ARB_map_buffer_alignment", extStart, extEnd); -#endif /* GL_ARB_map_buffer_alignment */ -#ifdef GL_ARB_map_buffer_range - GLEW_ARB_map_buffer_range = _glewSearchExtension("GL_ARB_map_buffer_range", extStart, extEnd); - if (glewExperimental || GLEW_ARB_map_buffer_range) GLEW_ARB_map_buffer_range = !_glewInit_GL_ARB_map_buffer_range(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_map_buffer_range */ -#ifdef GL_ARB_matrix_palette - GLEW_ARB_matrix_palette = _glewSearchExtension("GL_ARB_matrix_palette", extStart, extEnd); - if (glewExperimental || GLEW_ARB_matrix_palette) GLEW_ARB_matrix_palette = !_glewInit_GL_ARB_matrix_palette(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_matrix_palette */ -#ifdef GL_ARB_multi_bind - GLEW_ARB_multi_bind = _glewSearchExtension("GL_ARB_multi_bind", extStart, extEnd); - if (glewExperimental || GLEW_ARB_multi_bind) GLEW_ARB_multi_bind = !_glewInit_GL_ARB_multi_bind(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_multi_bind */ -#ifdef GL_ARB_multi_draw_indirect - GLEW_ARB_multi_draw_indirect = _glewSearchExtension("GL_ARB_multi_draw_indirect", extStart, extEnd); - if (glewExperimental || GLEW_ARB_multi_draw_indirect) GLEW_ARB_multi_draw_indirect = !_glewInit_GL_ARB_multi_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_multi_draw_indirect */ -#ifdef GL_ARB_multisample - GLEW_ARB_multisample = _glewSearchExtension("GL_ARB_multisample", extStart, extEnd); - if (glewExperimental || GLEW_ARB_multisample) GLEW_ARB_multisample = !_glewInit_GL_ARB_multisample(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_multisample */ -#ifdef GL_ARB_multitexture - GLEW_ARB_multitexture = _glewSearchExtension("GL_ARB_multitexture", extStart, extEnd); - if (glewExperimental || GLEW_ARB_multitexture) GLEW_ARB_multitexture = !_glewInit_GL_ARB_multitexture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_multitexture */ -#ifdef GL_ARB_occlusion_query - GLEW_ARB_occlusion_query = _glewSearchExtension("GL_ARB_occlusion_query", extStart, extEnd); - if (glewExperimental || GLEW_ARB_occlusion_query) GLEW_ARB_occlusion_query = !_glewInit_GL_ARB_occlusion_query(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_occlusion_query */ -#ifdef GL_ARB_occlusion_query2 - GLEW_ARB_occlusion_query2 = _glewSearchExtension("GL_ARB_occlusion_query2", extStart, extEnd); -#endif /* GL_ARB_occlusion_query2 */ -#ifdef GL_ARB_parallel_shader_compile - GLEW_ARB_parallel_shader_compile = _glewSearchExtension("GL_ARB_parallel_shader_compile", extStart, extEnd); - if (glewExperimental || GLEW_ARB_parallel_shader_compile) GLEW_ARB_parallel_shader_compile = !_glewInit_GL_ARB_parallel_shader_compile(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_parallel_shader_compile */ -#ifdef GL_ARB_pipeline_statistics_query - GLEW_ARB_pipeline_statistics_query = _glewSearchExtension("GL_ARB_pipeline_statistics_query", extStart, extEnd); -#endif /* GL_ARB_pipeline_statistics_query */ -#ifdef GL_ARB_pixel_buffer_object - GLEW_ARB_pixel_buffer_object = _glewSearchExtension("GL_ARB_pixel_buffer_object", extStart, extEnd); -#endif /* GL_ARB_pixel_buffer_object */ -#ifdef GL_ARB_point_parameters - GLEW_ARB_point_parameters = _glewSearchExtension("GL_ARB_point_parameters", extStart, extEnd); - if (glewExperimental || GLEW_ARB_point_parameters) GLEW_ARB_point_parameters = !_glewInit_GL_ARB_point_parameters(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_point_parameters */ -#ifdef GL_ARB_point_sprite - GLEW_ARB_point_sprite = _glewSearchExtension("GL_ARB_point_sprite", extStart, extEnd); -#endif /* GL_ARB_point_sprite */ -#ifdef GL_ARB_post_depth_coverage - GLEW_ARB_post_depth_coverage = _glewSearchExtension("GL_ARB_post_depth_coverage", extStart, extEnd); -#endif /* GL_ARB_post_depth_coverage */ -#ifdef GL_ARB_program_interface_query - GLEW_ARB_program_interface_query = _glewSearchExtension("GL_ARB_program_interface_query", extStart, extEnd); - if (glewExperimental || GLEW_ARB_program_interface_query) GLEW_ARB_program_interface_query = !_glewInit_GL_ARB_program_interface_query(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_program_interface_query */ -#ifdef GL_ARB_provoking_vertex - GLEW_ARB_provoking_vertex = _glewSearchExtension("GL_ARB_provoking_vertex", extStart, extEnd); - if (glewExperimental || GLEW_ARB_provoking_vertex) GLEW_ARB_provoking_vertex = !_glewInit_GL_ARB_provoking_vertex(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_provoking_vertex */ -#ifdef GL_ARB_query_buffer_object - GLEW_ARB_query_buffer_object = _glewSearchExtension("GL_ARB_query_buffer_object", extStart, extEnd); -#endif /* GL_ARB_query_buffer_object */ -#ifdef GL_ARB_robust_buffer_access_behavior - GLEW_ARB_robust_buffer_access_behavior = _glewSearchExtension("GL_ARB_robust_buffer_access_behavior", extStart, extEnd); -#endif /* GL_ARB_robust_buffer_access_behavior */ -#ifdef GL_ARB_robustness - GLEW_ARB_robustness = _glewSearchExtension("GL_ARB_robustness", extStart, extEnd); - if (glewExperimental || GLEW_ARB_robustness) GLEW_ARB_robustness = !_glewInit_GL_ARB_robustness(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_robustness */ -#ifdef GL_ARB_robustness_application_isolation - GLEW_ARB_robustness_application_isolation = _glewSearchExtension("GL_ARB_robustness_application_isolation", extStart, extEnd); -#endif /* GL_ARB_robustness_application_isolation */ -#ifdef GL_ARB_robustness_share_group_isolation - GLEW_ARB_robustness_share_group_isolation = _glewSearchExtension("GL_ARB_robustness_share_group_isolation", extStart, extEnd); -#endif /* GL_ARB_robustness_share_group_isolation */ -#ifdef GL_ARB_sample_locations - GLEW_ARB_sample_locations = _glewSearchExtension("GL_ARB_sample_locations", extStart, extEnd); - if (glewExperimental || GLEW_ARB_sample_locations) GLEW_ARB_sample_locations = !_glewInit_GL_ARB_sample_locations(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_sample_locations */ -#ifdef GL_ARB_sample_shading - GLEW_ARB_sample_shading = _glewSearchExtension("GL_ARB_sample_shading", extStart, extEnd); - if (glewExperimental || GLEW_ARB_sample_shading) GLEW_ARB_sample_shading = !_glewInit_GL_ARB_sample_shading(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_sample_shading */ -#ifdef GL_ARB_sampler_objects - GLEW_ARB_sampler_objects = _glewSearchExtension("GL_ARB_sampler_objects", extStart, extEnd); - if (glewExperimental || GLEW_ARB_sampler_objects) GLEW_ARB_sampler_objects = !_glewInit_GL_ARB_sampler_objects(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_sampler_objects */ -#ifdef GL_ARB_seamless_cube_map - GLEW_ARB_seamless_cube_map = _glewSearchExtension("GL_ARB_seamless_cube_map", extStart, extEnd); -#endif /* GL_ARB_seamless_cube_map */ -#ifdef GL_ARB_seamless_cubemap_per_texture - GLEW_ARB_seamless_cubemap_per_texture = _glewSearchExtension("GL_ARB_seamless_cubemap_per_texture", extStart, extEnd); -#endif /* GL_ARB_seamless_cubemap_per_texture */ -#ifdef GL_ARB_separate_shader_objects - GLEW_ARB_separate_shader_objects = _glewSearchExtension("GL_ARB_separate_shader_objects", extStart, extEnd); - if (glewExperimental || GLEW_ARB_separate_shader_objects) GLEW_ARB_separate_shader_objects = !_glewInit_GL_ARB_separate_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_separate_shader_objects */ -#ifdef GL_ARB_shader_atomic_counter_ops - GLEW_ARB_shader_atomic_counter_ops = _glewSearchExtension("GL_ARB_shader_atomic_counter_ops", extStart, extEnd); -#endif /* GL_ARB_shader_atomic_counter_ops */ -#ifdef GL_ARB_shader_atomic_counters - GLEW_ARB_shader_atomic_counters = _glewSearchExtension("GL_ARB_shader_atomic_counters", extStart, extEnd); - if (glewExperimental || GLEW_ARB_shader_atomic_counters) GLEW_ARB_shader_atomic_counters = !_glewInit_GL_ARB_shader_atomic_counters(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_shader_atomic_counters */ -#ifdef GL_ARB_shader_ballot - GLEW_ARB_shader_ballot = _glewSearchExtension("GL_ARB_shader_ballot", extStart, extEnd); -#endif /* GL_ARB_shader_ballot */ -#ifdef GL_ARB_shader_bit_encoding - GLEW_ARB_shader_bit_encoding = _glewSearchExtension("GL_ARB_shader_bit_encoding", extStart, extEnd); -#endif /* GL_ARB_shader_bit_encoding */ -#ifdef GL_ARB_shader_clock - GLEW_ARB_shader_clock = _glewSearchExtension("GL_ARB_shader_clock", extStart, extEnd); -#endif /* GL_ARB_shader_clock */ -#ifdef GL_ARB_shader_draw_parameters - GLEW_ARB_shader_draw_parameters = _glewSearchExtension("GL_ARB_shader_draw_parameters", extStart, extEnd); -#endif /* GL_ARB_shader_draw_parameters */ -#ifdef GL_ARB_shader_group_vote - GLEW_ARB_shader_group_vote = _glewSearchExtension("GL_ARB_shader_group_vote", extStart, extEnd); -#endif /* GL_ARB_shader_group_vote */ -#ifdef GL_ARB_shader_image_load_store - GLEW_ARB_shader_image_load_store = _glewSearchExtension("GL_ARB_shader_image_load_store", extStart, extEnd); - if (glewExperimental || GLEW_ARB_shader_image_load_store) GLEW_ARB_shader_image_load_store = !_glewInit_GL_ARB_shader_image_load_store(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_shader_image_load_store */ -#ifdef GL_ARB_shader_image_size - GLEW_ARB_shader_image_size = _glewSearchExtension("GL_ARB_shader_image_size", extStart, extEnd); -#endif /* GL_ARB_shader_image_size */ -#ifdef GL_ARB_shader_objects - GLEW_ARB_shader_objects = _glewSearchExtension("GL_ARB_shader_objects", extStart, extEnd); - if (glewExperimental || GLEW_ARB_shader_objects) GLEW_ARB_shader_objects = !_glewInit_GL_ARB_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_shader_objects */ -#ifdef GL_ARB_shader_precision - GLEW_ARB_shader_precision = _glewSearchExtension("GL_ARB_shader_precision", extStart, extEnd); -#endif /* GL_ARB_shader_precision */ -#ifdef GL_ARB_shader_stencil_export - GLEW_ARB_shader_stencil_export = _glewSearchExtension("GL_ARB_shader_stencil_export", extStart, extEnd); -#endif /* GL_ARB_shader_stencil_export */ -#ifdef GL_ARB_shader_storage_buffer_object - GLEW_ARB_shader_storage_buffer_object = _glewSearchExtension("GL_ARB_shader_storage_buffer_object", extStart, extEnd); - if (glewExperimental || GLEW_ARB_shader_storage_buffer_object) GLEW_ARB_shader_storage_buffer_object = !_glewInit_GL_ARB_shader_storage_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_shader_storage_buffer_object */ -#ifdef GL_ARB_shader_subroutine - GLEW_ARB_shader_subroutine = _glewSearchExtension("GL_ARB_shader_subroutine", extStart, extEnd); - if (glewExperimental || GLEW_ARB_shader_subroutine) GLEW_ARB_shader_subroutine = !_glewInit_GL_ARB_shader_subroutine(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_shader_subroutine */ -#ifdef GL_ARB_shader_texture_image_samples - GLEW_ARB_shader_texture_image_samples = _glewSearchExtension("GL_ARB_shader_texture_image_samples", extStart, extEnd); -#endif /* GL_ARB_shader_texture_image_samples */ -#ifdef GL_ARB_shader_texture_lod - GLEW_ARB_shader_texture_lod = _glewSearchExtension("GL_ARB_shader_texture_lod", extStart, extEnd); -#endif /* GL_ARB_shader_texture_lod */ -#ifdef GL_ARB_shader_viewport_layer_array - GLEW_ARB_shader_viewport_layer_array = _glewSearchExtension("GL_ARB_shader_viewport_layer_array", extStart, extEnd); -#endif /* GL_ARB_shader_viewport_layer_array */ -#ifdef GL_ARB_shading_language_100 - GLEW_ARB_shading_language_100 = _glewSearchExtension("GL_ARB_shading_language_100", extStart, extEnd); -#endif /* GL_ARB_shading_language_100 */ -#ifdef GL_ARB_shading_language_420pack - GLEW_ARB_shading_language_420pack = _glewSearchExtension("GL_ARB_shading_language_420pack", extStart, extEnd); -#endif /* GL_ARB_shading_language_420pack */ -#ifdef GL_ARB_shading_language_include - GLEW_ARB_shading_language_include = _glewSearchExtension("GL_ARB_shading_language_include", extStart, extEnd); - if (glewExperimental || GLEW_ARB_shading_language_include) GLEW_ARB_shading_language_include = !_glewInit_GL_ARB_shading_language_include(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_shading_language_include */ -#ifdef GL_ARB_shading_language_packing - GLEW_ARB_shading_language_packing = _glewSearchExtension("GL_ARB_shading_language_packing", extStart, extEnd); -#endif /* GL_ARB_shading_language_packing */ -#ifdef GL_ARB_shadow - GLEW_ARB_shadow = _glewSearchExtension("GL_ARB_shadow", extStart, extEnd); -#endif /* GL_ARB_shadow */ -#ifdef GL_ARB_shadow_ambient - GLEW_ARB_shadow_ambient = _glewSearchExtension("GL_ARB_shadow_ambient", extStart, extEnd); -#endif /* GL_ARB_shadow_ambient */ -#ifdef GL_ARB_sparse_buffer - GLEW_ARB_sparse_buffer = _glewSearchExtension("GL_ARB_sparse_buffer", extStart, extEnd); - if (glewExperimental || GLEW_ARB_sparse_buffer) GLEW_ARB_sparse_buffer = !_glewInit_GL_ARB_sparse_buffer(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_sparse_buffer */ -#ifdef GL_ARB_sparse_texture - GLEW_ARB_sparse_texture = _glewSearchExtension("GL_ARB_sparse_texture", extStart, extEnd); - if (glewExperimental || GLEW_ARB_sparse_texture) GLEW_ARB_sparse_texture = !_glewInit_GL_ARB_sparse_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_sparse_texture */ -#ifdef GL_ARB_sparse_texture2 - GLEW_ARB_sparse_texture2 = _glewSearchExtension("GL_ARB_sparse_texture2", extStart, extEnd); -#endif /* GL_ARB_sparse_texture2 */ -#ifdef GL_ARB_sparse_texture_clamp - GLEW_ARB_sparse_texture_clamp = _glewSearchExtension("GL_ARB_sparse_texture_clamp", extStart, extEnd); -#endif /* GL_ARB_sparse_texture_clamp */ -#ifdef GL_ARB_stencil_texturing - GLEW_ARB_stencil_texturing = _glewSearchExtension("GL_ARB_stencil_texturing", extStart, extEnd); -#endif /* GL_ARB_stencil_texturing */ -#ifdef GL_ARB_sync - GLEW_ARB_sync = _glewSearchExtension("GL_ARB_sync", extStart, extEnd); - if (glewExperimental || GLEW_ARB_sync) GLEW_ARB_sync = !_glewInit_GL_ARB_sync(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_sync */ -#ifdef GL_ARB_tessellation_shader - GLEW_ARB_tessellation_shader = _glewSearchExtension("GL_ARB_tessellation_shader", extStart, extEnd); - if (glewExperimental || GLEW_ARB_tessellation_shader) GLEW_ARB_tessellation_shader = !_glewInit_GL_ARB_tessellation_shader(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_tessellation_shader */ -#ifdef GL_ARB_texture_barrier - GLEW_ARB_texture_barrier = _glewSearchExtension("GL_ARB_texture_barrier", extStart, extEnd); - if (glewExperimental || GLEW_ARB_texture_barrier) GLEW_ARB_texture_barrier = !_glewInit_GL_ARB_texture_barrier(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_texture_barrier */ -#ifdef GL_ARB_texture_border_clamp - GLEW_ARB_texture_border_clamp = _glewSearchExtension("GL_ARB_texture_border_clamp", extStart, extEnd); -#endif /* GL_ARB_texture_border_clamp */ -#ifdef GL_ARB_texture_buffer_object - GLEW_ARB_texture_buffer_object = _glewSearchExtension("GL_ARB_texture_buffer_object", extStart, extEnd); - if (glewExperimental || GLEW_ARB_texture_buffer_object) GLEW_ARB_texture_buffer_object = !_glewInit_GL_ARB_texture_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_texture_buffer_object */ -#ifdef GL_ARB_texture_buffer_object_rgb32 - GLEW_ARB_texture_buffer_object_rgb32 = _glewSearchExtension("GL_ARB_texture_buffer_object_rgb32", extStart, extEnd); -#endif /* GL_ARB_texture_buffer_object_rgb32 */ -#ifdef GL_ARB_texture_buffer_range - GLEW_ARB_texture_buffer_range = _glewSearchExtension("GL_ARB_texture_buffer_range", extStart, extEnd); - if (glewExperimental || GLEW_ARB_texture_buffer_range) GLEW_ARB_texture_buffer_range = !_glewInit_GL_ARB_texture_buffer_range(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_texture_buffer_range */ -#ifdef GL_ARB_texture_compression - GLEW_ARB_texture_compression = _glewSearchExtension("GL_ARB_texture_compression", extStart, extEnd); - if (glewExperimental || GLEW_ARB_texture_compression) GLEW_ARB_texture_compression = !_glewInit_GL_ARB_texture_compression(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_texture_compression */ -#ifdef GL_ARB_texture_compression_bptc - GLEW_ARB_texture_compression_bptc = _glewSearchExtension("GL_ARB_texture_compression_bptc", extStart, extEnd); -#endif /* GL_ARB_texture_compression_bptc */ -#ifdef GL_ARB_texture_compression_rgtc - GLEW_ARB_texture_compression_rgtc = _glewSearchExtension("GL_ARB_texture_compression_rgtc", extStart, extEnd); -#endif /* GL_ARB_texture_compression_rgtc */ -#ifdef GL_ARB_texture_cube_map - GLEW_ARB_texture_cube_map = _glewSearchExtension("GL_ARB_texture_cube_map", extStart, extEnd); -#endif /* GL_ARB_texture_cube_map */ -#ifdef GL_ARB_texture_cube_map_array - GLEW_ARB_texture_cube_map_array = _glewSearchExtension("GL_ARB_texture_cube_map_array", extStart, extEnd); -#endif /* GL_ARB_texture_cube_map_array */ -#ifdef GL_ARB_texture_env_add - GLEW_ARB_texture_env_add = _glewSearchExtension("GL_ARB_texture_env_add", extStart, extEnd); -#endif /* GL_ARB_texture_env_add */ -#ifdef GL_ARB_texture_env_combine - GLEW_ARB_texture_env_combine = _glewSearchExtension("GL_ARB_texture_env_combine", extStart, extEnd); -#endif /* GL_ARB_texture_env_combine */ -#ifdef GL_ARB_texture_env_crossbar - GLEW_ARB_texture_env_crossbar = _glewSearchExtension("GL_ARB_texture_env_crossbar", extStart, extEnd); -#endif /* GL_ARB_texture_env_crossbar */ -#ifdef GL_ARB_texture_env_dot3 - GLEW_ARB_texture_env_dot3 = _glewSearchExtension("GL_ARB_texture_env_dot3", extStart, extEnd); -#endif /* GL_ARB_texture_env_dot3 */ -#ifdef GL_ARB_texture_filter_minmax - GLEW_ARB_texture_filter_minmax = _glewSearchExtension("GL_ARB_texture_filter_minmax", extStart, extEnd); -#endif /* GL_ARB_texture_filter_minmax */ -#ifdef GL_ARB_texture_float - GLEW_ARB_texture_float = _glewSearchExtension("GL_ARB_texture_float", extStart, extEnd); -#endif /* GL_ARB_texture_float */ -#ifdef GL_ARB_texture_gather - GLEW_ARB_texture_gather = _glewSearchExtension("GL_ARB_texture_gather", extStart, extEnd); -#endif /* GL_ARB_texture_gather */ -#ifdef GL_ARB_texture_mirror_clamp_to_edge - GLEW_ARB_texture_mirror_clamp_to_edge = _glewSearchExtension("GL_ARB_texture_mirror_clamp_to_edge", extStart, extEnd); -#endif /* GL_ARB_texture_mirror_clamp_to_edge */ -#ifdef GL_ARB_texture_mirrored_repeat - GLEW_ARB_texture_mirrored_repeat = _glewSearchExtension("GL_ARB_texture_mirrored_repeat", extStart, extEnd); -#endif /* GL_ARB_texture_mirrored_repeat */ -#ifdef GL_ARB_texture_multisample - GLEW_ARB_texture_multisample = _glewSearchExtension("GL_ARB_texture_multisample", extStart, extEnd); - if (glewExperimental || GLEW_ARB_texture_multisample) GLEW_ARB_texture_multisample = !_glewInit_GL_ARB_texture_multisample(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_texture_multisample */ -#ifdef GL_ARB_texture_non_power_of_two - GLEW_ARB_texture_non_power_of_two = _glewSearchExtension("GL_ARB_texture_non_power_of_two", extStart, extEnd); -#endif /* GL_ARB_texture_non_power_of_two */ -#ifdef GL_ARB_texture_query_levels - GLEW_ARB_texture_query_levels = _glewSearchExtension("GL_ARB_texture_query_levels", extStart, extEnd); -#endif /* GL_ARB_texture_query_levels */ -#ifdef GL_ARB_texture_query_lod - GLEW_ARB_texture_query_lod = _glewSearchExtension("GL_ARB_texture_query_lod", extStart, extEnd); -#endif /* GL_ARB_texture_query_lod */ -#ifdef GL_ARB_texture_rectangle - GLEW_ARB_texture_rectangle = _glewSearchExtension("GL_ARB_texture_rectangle", extStart, extEnd); -#endif /* GL_ARB_texture_rectangle */ -#ifdef GL_ARB_texture_rg - GLEW_ARB_texture_rg = _glewSearchExtension("GL_ARB_texture_rg", extStart, extEnd); -#endif /* GL_ARB_texture_rg */ -#ifdef GL_ARB_texture_rgb10_a2ui - GLEW_ARB_texture_rgb10_a2ui = _glewSearchExtension("GL_ARB_texture_rgb10_a2ui", extStart, extEnd); -#endif /* GL_ARB_texture_rgb10_a2ui */ -#ifdef GL_ARB_texture_stencil8 - GLEW_ARB_texture_stencil8 = _glewSearchExtension("GL_ARB_texture_stencil8", extStart, extEnd); -#endif /* GL_ARB_texture_stencil8 */ -#ifdef GL_ARB_texture_storage - GLEW_ARB_texture_storage = _glewSearchExtension("GL_ARB_texture_storage", extStart, extEnd); - if (glewExperimental || GLEW_ARB_texture_storage) GLEW_ARB_texture_storage = !_glewInit_GL_ARB_texture_storage(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_texture_storage */ -#ifdef GL_ARB_texture_storage_multisample - GLEW_ARB_texture_storage_multisample = _glewSearchExtension("GL_ARB_texture_storage_multisample", extStart, extEnd); - if (glewExperimental || GLEW_ARB_texture_storage_multisample) GLEW_ARB_texture_storage_multisample = !_glewInit_GL_ARB_texture_storage_multisample(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_texture_storage_multisample */ -#ifdef GL_ARB_texture_swizzle - GLEW_ARB_texture_swizzle = _glewSearchExtension("GL_ARB_texture_swizzle", extStart, extEnd); -#endif /* GL_ARB_texture_swizzle */ -#ifdef GL_ARB_texture_view - GLEW_ARB_texture_view = _glewSearchExtension("GL_ARB_texture_view", extStart, extEnd); - if (glewExperimental || GLEW_ARB_texture_view) GLEW_ARB_texture_view = !_glewInit_GL_ARB_texture_view(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_texture_view */ -#ifdef GL_ARB_timer_query - GLEW_ARB_timer_query = _glewSearchExtension("GL_ARB_timer_query", extStart, extEnd); - if (glewExperimental || GLEW_ARB_timer_query) GLEW_ARB_timer_query = !_glewInit_GL_ARB_timer_query(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_timer_query */ -#ifdef GL_ARB_transform_feedback2 - GLEW_ARB_transform_feedback2 = _glewSearchExtension("GL_ARB_transform_feedback2", extStart, extEnd); - if (glewExperimental || GLEW_ARB_transform_feedback2) GLEW_ARB_transform_feedback2 = !_glewInit_GL_ARB_transform_feedback2(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_transform_feedback2 */ -#ifdef GL_ARB_transform_feedback3 - GLEW_ARB_transform_feedback3 = _glewSearchExtension("GL_ARB_transform_feedback3", extStart, extEnd); - if (glewExperimental || GLEW_ARB_transform_feedback3) GLEW_ARB_transform_feedback3 = !_glewInit_GL_ARB_transform_feedback3(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_transform_feedback3 */ -#ifdef GL_ARB_transform_feedback_instanced - GLEW_ARB_transform_feedback_instanced = _glewSearchExtension("GL_ARB_transform_feedback_instanced", extStart, extEnd); - if (glewExperimental || GLEW_ARB_transform_feedback_instanced) GLEW_ARB_transform_feedback_instanced = !_glewInit_GL_ARB_transform_feedback_instanced(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_transform_feedback_instanced */ -#ifdef GL_ARB_transform_feedback_overflow_query - GLEW_ARB_transform_feedback_overflow_query = _glewSearchExtension("GL_ARB_transform_feedback_overflow_query", extStart, extEnd); -#endif /* GL_ARB_transform_feedback_overflow_query */ -#ifdef GL_ARB_transpose_matrix - GLEW_ARB_transpose_matrix = _glewSearchExtension("GL_ARB_transpose_matrix", extStart, extEnd); - if (glewExperimental || GLEW_ARB_transpose_matrix) GLEW_ARB_transpose_matrix = !_glewInit_GL_ARB_transpose_matrix(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_transpose_matrix */ -#ifdef GL_ARB_uniform_buffer_object - GLEW_ARB_uniform_buffer_object = _glewSearchExtension("GL_ARB_uniform_buffer_object", extStart, extEnd); - if (glewExperimental || GLEW_ARB_uniform_buffer_object) GLEW_ARB_uniform_buffer_object = !_glewInit_GL_ARB_uniform_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_uniform_buffer_object */ -#ifdef GL_ARB_vertex_array_bgra - GLEW_ARB_vertex_array_bgra = _glewSearchExtension("GL_ARB_vertex_array_bgra", extStart, extEnd); -#endif /* GL_ARB_vertex_array_bgra */ -#ifdef GL_ARB_vertex_array_object - GLEW_ARB_vertex_array_object = _glewSearchExtension("GL_ARB_vertex_array_object", extStart, extEnd); - if (glewExperimental || GLEW_ARB_vertex_array_object) GLEW_ARB_vertex_array_object = !_glewInit_GL_ARB_vertex_array_object(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_vertex_array_object */ -#ifdef GL_ARB_vertex_attrib_64bit - GLEW_ARB_vertex_attrib_64bit = _glewSearchExtension("GL_ARB_vertex_attrib_64bit", extStart, extEnd); - if (glewExperimental || GLEW_ARB_vertex_attrib_64bit) GLEW_ARB_vertex_attrib_64bit = !_glewInit_GL_ARB_vertex_attrib_64bit(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_vertex_attrib_64bit */ -#ifdef GL_ARB_vertex_attrib_binding - GLEW_ARB_vertex_attrib_binding = _glewSearchExtension("GL_ARB_vertex_attrib_binding", extStart, extEnd); - if (glewExperimental || GLEW_ARB_vertex_attrib_binding) GLEW_ARB_vertex_attrib_binding = !_glewInit_GL_ARB_vertex_attrib_binding(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_vertex_attrib_binding */ -#ifdef GL_ARB_vertex_blend - GLEW_ARB_vertex_blend = _glewSearchExtension("GL_ARB_vertex_blend", extStart, extEnd); - if (glewExperimental || GLEW_ARB_vertex_blend) GLEW_ARB_vertex_blend = !_glewInit_GL_ARB_vertex_blend(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_vertex_blend */ -#ifdef GL_ARB_vertex_buffer_object - GLEW_ARB_vertex_buffer_object = _glewSearchExtension("GL_ARB_vertex_buffer_object", extStart, extEnd); - if (glewExperimental || GLEW_ARB_vertex_buffer_object) GLEW_ARB_vertex_buffer_object = !_glewInit_GL_ARB_vertex_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_vertex_buffer_object */ -#ifdef GL_ARB_vertex_program - GLEW_ARB_vertex_program = _glewSearchExtension("GL_ARB_vertex_program", extStart, extEnd); - if (glewExperimental || GLEW_ARB_vertex_program) GLEW_ARB_vertex_program = !_glewInit_GL_ARB_vertex_program(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_vertex_program */ -#ifdef GL_ARB_vertex_shader - GLEW_ARB_vertex_shader = _glewSearchExtension("GL_ARB_vertex_shader", extStart, extEnd); - if (glewExperimental || GLEW_ARB_vertex_shader) { GLEW_ARB_vertex_shader = !_glewInit_GL_ARB_vertex_shader(GLEW_CONTEXT_ARG_VAR_INIT); _glewInit_GL_ARB_vertex_program(GLEW_CONTEXT_ARG_VAR_INIT); } -#endif /* GL_ARB_vertex_shader */ -#ifdef GL_ARB_vertex_type_10f_11f_11f_rev - GLEW_ARB_vertex_type_10f_11f_11f_rev = _glewSearchExtension("GL_ARB_vertex_type_10f_11f_11f_rev", extStart, extEnd); -#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ -#ifdef GL_ARB_vertex_type_2_10_10_10_rev - GLEW_ARB_vertex_type_2_10_10_10_rev = _glewSearchExtension("GL_ARB_vertex_type_2_10_10_10_rev", extStart, extEnd); - if (glewExperimental || GLEW_ARB_vertex_type_2_10_10_10_rev) GLEW_ARB_vertex_type_2_10_10_10_rev = !_glewInit_GL_ARB_vertex_type_2_10_10_10_rev(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ -#ifdef GL_ARB_viewport_array - GLEW_ARB_viewport_array = _glewSearchExtension("GL_ARB_viewport_array", extStart, extEnd); - if (glewExperimental || GLEW_ARB_viewport_array) GLEW_ARB_viewport_array = !_glewInit_GL_ARB_viewport_array(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_viewport_array */ -#ifdef GL_ARB_window_pos - GLEW_ARB_window_pos = _glewSearchExtension("GL_ARB_window_pos", extStart, extEnd); - if (glewExperimental || GLEW_ARB_window_pos) GLEW_ARB_window_pos = !_glewInit_GL_ARB_window_pos(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_window_pos */ -#ifdef GL_ATIX_point_sprites - GLEW_ATIX_point_sprites = _glewSearchExtension("GL_ATIX_point_sprites", extStart, extEnd); -#endif /* GL_ATIX_point_sprites */ -#ifdef GL_ATIX_texture_env_combine3 - GLEW_ATIX_texture_env_combine3 = _glewSearchExtension("GL_ATIX_texture_env_combine3", extStart, extEnd); -#endif /* GL_ATIX_texture_env_combine3 */ -#ifdef GL_ATIX_texture_env_route - GLEW_ATIX_texture_env_route = _glewSearchExtension("GL_ATIX_texture_env_route", extStart, extEnd); -#endif /* GL_ATIX_texture_env_route */ -#ifdef GL_ATIX_vertex_shader_output_point_size - GLEW_ATIX_vertex_shader_output_point_size = _glewSearchExtension("GL_ATIX_vertex_shader_output_point_size", extStart, extEnd); -#endif /* GL_ATIX_vertex_shader_output_point_size */ -#ifdef GL_ATI_draw_buffers - GLEW_ATI_draw_buffers = _glewSearchExtension("GL_ATI_draw_buffers", extStart, extEnd); - if (glewExperimental || GLEW_ATI_draw_buffers) GLEW_ATI_draw_buffers = !_glewInit_GL_ATI_draw_buffers(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ATI_draw_buffers */ -#ifdef GL_ATI_element_array - GLEW_ATI_element_array = _glewSearchExtension("GL_ATI_element_array", extStart, extEnd); - if (glewExperimental || GLEW_ATI_element_array) GLEW_ATI_element_array = !_glewInit_GL_ATI_element_array(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ATI_element_array */ -#ifdef GL_ATI_envmap_bumpmap - GLEW_ATI_envmap_bumpmap = _glewSearchExtension("GL_ATI_envmap_bumpmap", extStart, extEnd); - if (glewExperimental || GLEW_ATI_envmap_bumpmap) GLEW_ATI_envmap_bumpmap = !_glewInit_GL_ATI_envmap_bumpmap(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ATI_envmap_bumpmap */ -#ifdef GL_ATI_fragment_shader - GLEW_ATI_fragment_shader = _glewSearchExtension("GL_ATI_fragment_shader", extStart, extEnd); - if (glewExperimental || GLEW_ATI_fragment_shader) GLEW_ATI_fragment_shader = !_glewInit_GL_ATI_fragment_shader(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ATI_fragment_shader */ -#ifdef GL_ATI_map_object_buffer - GLEW_ATI_map_object_buffer = _glewSearchExtension("GL_ATI_map_object_buffer", extStart, extEnd); - if (glewExperimental || GLEW_ATI_map_object_buffer) GLEW_ATI_map_object_buffer = !_glewInit_GL_ATI_map_object_buffer(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ATI_map_object_buffer */ -#ifdef GL_ATI_meminfo - GLEW_ATI_meminfo = _glewSearchExtension("GL_ATI_meminfo", extStart, extEnd); -#endif /* GL_ATI_meminfo */ -#ifdef GL_ATI_pn_triangles - GLEW_ATI_pn_triangles = _glewSearchExtension("GL_ATI_pn_triangles", extStart, extEnd); - if (glewExperimental || GLEW_ATI_pn_triangles) GLEW_ATI_pn_triangles = !_glewInit_GL_ATI_pn_triangles(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ATI_pn_triangles */ -#ifdef GL_ATI_separate_stencil - GLEW_ATI_separate_stencil = _glewSearchExtension("GL_ATI_separate_stencil", extStart, extEnd); - if (glewExperimental || GLEW_ATI_separate_stencil) GLEW_ATI_separate_stencil = !_glewInit_GL_ATI_separate_stencil(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ATI_separate_stencil */ -#ifdef GL_ATI_shader_texture_lod - GLEW_ATI_shader_texture_lod = _glewSearchExtension("GL_ATI_shader_texture_lod", extStart, extEnd); -#endif /* GL_ATI_shader_texture_lod */ -#ifdef GL_ATI_text_fragment_shader - GLEW_ATI_text_fragment_shader = _glewSearchExtension("GL_ATI_text_fragment_shader", extStart, extEnd); -#endif /* GL_ATI_text_fragment_shader */ -#ifdef GL_ATI_texture_compression_3dc - GLEW_ATI_texture_compression_3dc = _glewSearchExtension("GL_ATI_texture_compression_3dc", extStart, extEnd); -#endif /* GL_ATI_texture_compression_3dc */ -#ifdef GL_ATI_texture_env_combine3 - GLEW_ATI_texture_env_combine3 = _glewSearchExtension("GL_ATI_texture_env_combine3", extStart, extEnd); -#endif /* GL_ATI_texture_env_combine3 */ -#ifdef GL_ATI_texture_float - GLEW_ATI_texture_float = _glewSearchExtension("GL_ATI_texture_float", extStart, extEnd); -#endif /* GL_ATI_texture_float */ -#ifdef GL_ATI_texture_mirror_once - GLEW_ATI_texture_mirror_once = _glewSearchExtension("GL_ATI_texture_mirror_once", extStart, extEnd); -#endif /* GL_ATI_texture_mirror_once */ -#ifdef GL_ATI_vertex_array_object - GLEW_ATI_vertex_array_object = _glewSearchExtension("GL_ATI_vertex_array_object", extStart, extEnd); - if (glewExperimental || GLEW_ATI_vertex_array_object) GLEW_ATI_vertex_array_object = !_glewInit_GL_ATI_vertex_array_object(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ATI_vertex_array_object */ -#ifdef GL_ATI_vertex_attrib_array_object - GLEW_ATI_vertex_attrib_array_object = _glewSearchExtension("GL_ATI_vertex_attrib_array_object", extStart, extEnd); - if (glewExperimental || GLEW_ATI_vertex_attrib_array_object) GLEW_ATI_vertex_attrib_array_object = !_glewInit_GL_ATI_vertex_attrib_array_object(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ATI_vertex_attrib_array_object */ -#ifdef GL_ATI_vertex_streams - GLEW_ATI_vertex_streams = _glewSearchExtension("GL_ATI_vertex_streams", extStart, extEnd); - if (glewExperimental || GLEW_ATI_vertex_streams) GLEW_ATI_vertex_streams = !_glewInit_GL_ATI_vertex_streams(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ATI_vertex_streams */ -#ifdef GL_EXT_422_pixels - GLEW_EXT_422_pixels = _glewSearchExtension("GL_EXT_422_pixels", extStart, extEnd); -#endif /* GL_EXT_422_pixels */ -#ifdef GL_EXT_Cg_shader - GLEW_EXT_Cg_shader = _glewSearchExtension("GL_EXT_Cg_shader", extStart, extEnd); -#endif /* GL_EXT_Cg_shader */ -#ifdef GL_EXT_abgr - GLEW_EXT_abgr = _glewSearchExtension("GL_EXT_abgr", extStart, extEnd); -#endif /* GL_EXT_abgr */ -#ifdef GL_EXT_bgra - GLEW_EXT_bgra = _glewSearchExtension("GL_EXT_bgra", extStart, extEnd); -#endif /* GL_EXT_bgra */ -#ifdef GL_EXT_bindable_uniform - GLEW_EXT_bindable_uniform = _glewSearchExtension("GL_EXT_bindable_uniform", extStart, extEnd); - if (glewExperimental || GLEW_EXT_bindable_uniform) GLEW_EXT_bindable_uniform = !_glewInit_GL_EXT_bindable_uniform(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_bindable_uniform */ -#ifdef GL_EXT_blend_color - GLEW_EXT_blend_color = _glewSearchExtension("GL_EXT_blend_color", extStart, extEnd); - if (glewExperimental || GLEW_EXT_blend_color) GLEW_EXT_blend_color = !_glewInit_GL_EXT_blend_color(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_blend_color */ -#ifdef GL_EXT_blend_equation_separate - GLEW_EXT_blend_equation_separate = _glewSearchExtension("GL_EXT_blend_equation_separate", extStart, extEnd); - if (glewExperimental || GLEW_EXT_blend_equation_separate) GLEW_EXT_blend_equation_separate = !_glewInit_GL_EXT_blend_equation_separate(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_blend_equation_separate */ -#ifdef GL_EXT_blend_func_separate - GLEW_EXT_blend_func_separate = _glewSearchExtension("GL_EXT_blend_func_separate", extStart, extEnd); - if (glewExperimental || GLEW_EXT_blend_func_separate) GLEW_EXT_blend_func_separate = !_glewInit_GL_EXT_blend_func_separate(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_blend_func_separate */ -#ifdef GL_EXT_blend_logic_op - GLEW_EXT_blend_logic_op = _glewSearchExtension("GL_EXT_blend_logic_op", extStart, extEnd); -#endif /* GL_EXT_blend_logic_op */ -#ifdef GL_EXT_blend_minmax - GLEW_EXT_blend_minmax = _glewSearchExtension("GL_EXT_blend_minmax", extStart, extEnd); - if (glewExperimental || GLEW_EXT_blend_minmax) GLEW_EXT_blend_minmax = !_glewInit_GL_EXT_blend_minmax(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_blend_minmax */ -#ifdef GL_EXT_blend_subtract - GLEW_EXT_blend_subtract = _glewSearchExtension("GL_EXT_blend_subtract", extStart, extEnd); -#endif /* GL_EXT_blend_subtract */ -#ifdef GL_EXT_clip_volume_hint - GLEW_EXT_clip_volume_hint = _glewSearchExtension("GL_EXT_clip_volume_hint", extStart, extEnd); -#endif /* GL_EXT_clip_volume_hint */ -#ifdef GL_EXT_cmyka - GLEW_EXT_cmyka = _glewSearchExtension("GL_EXT_cmyka", extStart, extEnd); -#endif /* GL_EXT_cmyka */ -#ifdef GL_EXT_color_subtable - GLEW_EXT_color_subtable = _glewSearchExtension("GL_EXT_color_subtable", extStart, extEnd); - if (glewExperimental || GLEW_EXT_color_subtable) GLEW_EXT_color_subtable = !_glewInit_GL_EXT_color_subtable(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_color_subtable */ -#ifdef GL_EXT_compiled_vertex_array - GLEW_EXT_compiled_vertex_array = _glewSearchExtension("GL_EXT_compiled_vertex_array", extStart, extEnd); - if (glewExperimental || GLEW_EXT_compiled_vertex_array) GLEW_EXT_compiled_vertex_array = !_glewInit_GL_EXT_compiled_vertex_array(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_compiled_vertex_array */ -#ifdef GL_EXT_convolution - GLEW_EXT_convolution = _glewSearchExtension("GL_EXT_convolution", extStart, extEnd); - if (glewExperimental || GLEW_EXT_convolution) GLEW_EXT_convolution = !_glewInit_GL_EXT_convolution(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_convolution */ -#ifdef GL_EXT_coordinate_frame - GLEW_EXT_coordinate_frame = _glewSearchExtension("GL_EXT_coordinate_frame", extStart, extEnd); - if (glewExperimental || GLEW_EXT_coordinate_frame) GLEW_EXT_coordinate_frame = !_glewInit_GL_EXT_coordinate_frame(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_coordinate_frame */ -#ifdef GL_EXT_copy_texture - GLEW_EXT_copy_texture = _glewSearchExtension("GL_EXT_copy_texture", extStart, extEnd); - if (glewExperimental || GLEW_EXT_copy_texture) GLEW_EXT_copy_texture = !_glewInit_GL_EXT_copy_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_copy_texture */ -#ifdef GL_EXT_cull_vertex - GLEW_EXT_cull_vertex = _glewSearchExtension("GL_EXT_cull_vertex", extStart, extEnd); - if (glewExperimental || GLEW_EXT_cull_vertex) GLEW_EXT_cull_vertex = !_glewInit_GL_EXT_cull_vertex(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_cull_vertex */ -#ifdef GL_EXT_debug_label - GLEW_EXT_debug_label = _glewSearchExtension("GL_EXT_debug_label", extStart, extEnd); - if (glewExperimental || GLEW_EXT_debug_label) GLEW_EXT_debug_label = !_glewInit_GL_EXT_debug_label(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_debug_label */ -#ifdef GL_EXT_debug_marker - GLEW_EXT_debug_marker = _glewSearchExtension("GL_EXT_debug_marker", extStart, extEnd); - if (glewExperimental || GLEW_EXT_debug_marker) GLEW_EXT_debug_marker = !_glewInit_GL_EXT_debug_marker(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_debug_marker */ -#ifdef GL_EXT_depth_bounds_test - GLEW_EXT_depth_bounds_test = _glewSearchExtension("GL_EXT_depth_bounds_test", extStart, extEnd); - if (glewExperimental || GLEW_EXT_depth_bounds_test) GLEW_EXT_depth_bounds_test = !_glewInit_GL_EXT_depth_bounds_test(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_depth_bounds_test */ -#ifdef GL_EXT_direct_state_access - GLEW_EXT_direct_state_access = _glewSearchExtension("GL_EXT_direct_state_access", extStart, extEnd); - if (glewExperimental || GLEW_EXT_direct_state_access) GLEW_EXT_direct_state_access = !_glewInit_GL_EXT_direct_state_access(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_direct_state_access */ -#ifdef GL_EXT_draw_buffers2 - GLEW_EXT_draw_buffers2 = _glewSearchExtension("GL_EXT_draw_buffers2", extStart, extEnd); - if (glewExperimental || GLEW_EXT_draw_buffers2) GLEW_EXT_draw_buffers2 = !_glewInit_GL_EXT_draw_buffers2(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_draw_buffers2 */ -#ifdef GL_EXT_draw_instanced - GLEW_EXT_draw_instanced = _glewSearchExtension("GL_EXT_draw_instanced", extStart, extEnd); - if (glewExperimental || GLEW_EXT_draw_instanced) GLEW_EXT_draw_instanced = !_glewInit_GL_EXT_draw_instanced(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_draw_instanced */ -#ifdef GL_EXT_draw_range_elements - GLEW_EXT_draw_range_elements = _glewSearchExtension("GL_EXT_draw_range_elements", extStart, extEnd); - if (glewExperimental || GLEW_EXT_draw_range_elements) GLEW_EXT_draw_range_elements = !_glewInit_GL_EXT_draw_range_elements(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_draw_range_elements */ -#ifdef GL_EXT_fog_coord - GLEW_EXT_fog_coord = _glewSearchExtension("GL_EXT_fog_coord", extStart, extEnd); - if (glewExperimental || GLEW_EXT_fog_coord) GLEW_EXT_fog_coord = !_glewInit_GL_EXT_fog_coord(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_fog_coord */ -#ifdef GL_EXT_fragment_lighting - GLEW_EXT_fragment_lighting = _glewSearchExtension("GL_EXT_fragment_lighting", extStart, extEnd); - if (glewExperimental || GLEW_EXT_fragment_lighting) GLEW_EXT_fragment_lighting = !_glewInit_GL_EXT_fragment_lighting(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_fragment_lighting */ -#ifdef GL_EXT_framebuffer_blit - GLEW_EXT_framebuffer_blit = _glewSearchExtension("GL_EXT_framebuffer_blit", extStart, extEnd); - if (glewExperimental || GLEW_EXT_framebuffer_blit) GLEW_EXT_framebuffer_blit = !_glewInit_GL_EXT_framebuffer_blit(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_framebuffer_blit */ -#ifdef GL_EXT_framebuffer_multisample - GLEW_EXT_framebuffer_multisample = _glewSearchExtension("GL_EXT_framebuffer_multisample", extStart, extEnd); - if (glewExperimental || GLEW_EXT_framebuffer_multisample) GLEW_EXT_framebuffer_multisample = !_glewInit_GL_EXT_framebuffer_multisample(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_framebuffer_multisample */ -#ifdef GL_EXT_framebuffer_multisample_blit_scaled - GLEW_EXT_framebuffer_multisample_blit_scaled = _glewSearchExtension("GL_EXT_framebuffer_multisample_blit_scaled", extStart, extEnd); -#endif /* GL_EXT_framebuffer_multisample_blit_scaled */ -#ifdef GL_EXT_framebuffer_object - GLEW_EXT_framebuffer_object = _glewSearchExtension("GL_EXT_framebuffer_object", extStart, extEnd); - if (glewExperimental || GLEW_EXT_framebuffer_object) GLEW_EXT_framebuffer_object = !_glewInit_GL_EXT_framebuffer_object(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_framebuffer_object */ -#ifdef GL_EXT_framebuffer_sRGB - GLEW_EXT_framebuffer_sRGB = _glewSearchExtension("GL_EXT_framebuffer_sRGB", extStart, extEnd); -#endif /* GL_EXT_framebuffer_sRGB */ -#ifdef GL_EXT_geometry_shader4 - GLEW_EXT_geometry_shader4 = _glewSearchExtension("GL_EXT_geometry_shader4", extStart, extEnd); - if (glewExperimental || GLEW_EXT_geometry_shader4) GLEW_EXT_geometry_shader4 = !_glewInit_GL_EXT_geometry_shader4(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_geometry_shader4 */ -#ifdef GL_EXT_gpu_program_parameters - GLEW_EXT_gpu_program_parameters = _glewSearchExtension("GL_EXT_gpu_program_parameters", extStart, extEnd); - if (glewExperimental || GLEW_EXT_gpu_program_parameters) GLEW_EXT_gpu_program_parameters = !_glewInit_GL_EXT_gpu_program_parameters(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_gpu_program_parameters */ -#ifdef GL_EXT_gpu_shader4 - GLEW_EXT_gpu_shader4 = _glewSearchExtension("GL_EXT_gpu_shader4", extStart, extEnd); - if (glewExperimental || GLEW_EXT_gpu_shader4) GLEW_EXT_gpu_shader4 = !_glewInit_GL_EXT_gpu_shader4(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_gpu_shader4 */ -#ifdef GL_EXT_histogram - GLEW_EXT_histogram = _glewSearchExtension("GL_EXT_histogram", extStart, extEnd); - if (glewExperimental || GLEW_EXT_histogram) GLEW_EXT_histogram = !_glewInit_GL_EXT_histogram(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_histogram */ -#ifdef GL_EXT_index_array_formats - GLEW_EXT_index_array_formats = _glewSearchExtension("GL_EXT_index_array_formats", extStart, extEnd); -#endif /* GL_EXT_index_array_formats */ -#ifdef GL_EXT_index_func - GLEW_EXT_index_func = _glewSearchExtension("GL_EXT_index_func", extStart, extEnd); - if (glewExperimental || GLEW_EXT_index_func) GLEW_EXT_index_func = !_glewInit_GL_EXT_index_func(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_index_func */ -#ifdef GL_EXT_index_material - GLEW_EXT_index_material = _glewSearchExtension("GL_EXT_index_material", extStart, extEnd); - if (glewExperimental || GLEW_EXT_index_material) GLEW_EXT_index_material = !_glewInit_GL_EXT_index_material(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_index_material */ -#ifdef GL_EXT_index_texture - GLEW_EXT_index_texture = _glewSearchExtension("GL_EXT_index_texture", extStart, extEnd); -#endif /* GL_EXT_index_texture */ -#ifdef GL_EXT_light_texture - GLEW_EXT_light_texture = _glewSearchExtension("GL_EXT_light_texture", extStart, extEnd); - if (glewExperimental || GLEW_EXT_light_texture) GLEW_EXT_light_texture = !_glewInit_GL_EXT_light_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_light_texture */ -#ifdef GL_EXT_misc_attribute - GLEW_EXT_misc_attribute = _glewSearchExtension("GL_EXT_misc_attribute", extStart, extEnd); -#endif /* GL_EXT_misc_attribute */ -#ifdef GL_EXT_multi_draw_arrays - GLEW_EXT_multi_draw_arrays = _glewSearchExtension("GL_EXT_multi_draw_arrays", extStart, extEnd); - if (glewExperimental || GLEW_EXT_multi_draw_arrays) GLEW_EXT_multi_draw_arrays = !_glewInit_GL_EXT_multi_draw_arrays(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_multi_draw_arrays */ -#ifdef GL_EXT_multisample - GLEW_EXT_multisample = _glewSearchExtension("GL_EXT_multisample", extStart, extEnd); - if (glewExperimental || GLEW_EXT_multisample) GLEW_EXT_multisample = !_glewInit_GL_EXT_multisample(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_multisample */ -#ifdef GL_EXT_packed_depth_stencil - GLEW_EXT_packed_depth_stencil = _glewSearchExtension("GL_EXT_packed_depth_stencil", extStart, extEnd); -#endif /* GL_EXT_packed_depth_stencil */ -#ifdef GL_EXT_packed_float - GLEW_EXT_packed_float = _glewSearchExtension("GL_EXT_packed_float", extStart, extEnd); -#endif /* GL_EXT_packed_float */ -#ifdef GL_EXT_packed_pixels - GLEW_EXT_packed_pixels = _glewSearchExtension("GL_EXT_packed_pixels", extStart, extEnd); -#endif /* GL_EXT_packed_pixels */ -#ifdef GL_EXT_paletted_texture - GLEW_EXT_paletted_texture = _glewSearchExtension("GL_EXT_paletted_texture", extStart, extEnd); - if (glewExperimental || GLEW_EXT_paletted_texture) GLEW_EXT_paletted_texture = !_glewInit_GL_EXT_paletted_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_paletted_texture */ -#ifdef GL_EXT_pixel_buffer_object - GLEW_EXT_pixel_buffer_object = _glewSearchExtension("GL_EXT_pixel_buffer_object", extStart, extEnd); -#endif /* GL_EXT_pixel_buffer_object */ -#ifdef GL_EXT_pixel_transform - GLEW_EXT_pixel_transform = _glewSearchExtension("GL_EXT_pixel_transform", extStart, extEnd); - if (glewExperimental || GLEW_EXT_pixel_transform) GLEW_EXT_pixel_transform = !_glewInit_GL_EXT_pixel_transform(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_pixel_transform */ -#ifdef GL_EXT_pixel_transform_color_table - GLEW_EXT_pixel_transform_color_table = _glewSearchExtension("GL_EXT_pixel_transform_color_table", extStart, extEnd); -#endif /* GL_EXT_pixel_transform_color_table */ -#ifdef GL_EXT_point_parameters - GLEW_EXT_point_parameters = _glewSearchExtension("GL_EXT_point_parameters", extStart, extEnd); - if (glewExperimental || GLEW_EXT_point_parameters) GLEW_EXT_point_parameters = !_glewInit_GL_EXT_point_parameters(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_point_parameters */ -#ifdef GL_EXT_polygon_offset - GLEW_EXT_polygon_offset = _glewSearchExtension("GL_EXT_polygon_offset", extStart, extEnd); - if (glewExperimental || GLEW_EXT_polygon_offset) GLEW_EXT_polygon_offset = !_glewInit_GL_EXT_polygon_offset(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_polygon_offset */ -#ifdef GL_EXT_polygon_offset_clamp - GLEW_EXT_polygon_offset_clamp = _glewSearchExtension("GL_EXT_polygon_offset_clamp", extStart, extEnd); - if (glewExperimental || GLEW_EXT_polygon_offset_clamp) GLEW_EXT_polygon_offset_clamp = !_glewInit_GL_EXT_polygon_offset_clamp(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_polygon_offset_clamp */ -#ifdef GL_EXT_post_depth_coverage - GLEW_EXT_post_depth_coverage = _glewSearchExtension("GL_EXT_post_depth_coverage", extStart, extEnd); -#endif /* GL_EXT_post_depth_coverage */ -#ifdef GL_EXT_provoking_vertex - GLEW_EXT_provoking_vertex = _glewSearchExtension("GL_EXT_provoking_vertex", extStart, extEnd); - if (glewExperimental || GLEW_EXT_provoking_vertex) GLEW_EXT_provoking_vertex = !_glewInit_GL_EXT_provoking_vertex(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_provoking_vertex */ -#ifdef GL_EXT_raster_multisample - GLEW_EXT_raster_multisample = _glewSearchExtension("GL_EXT_raster_multisample", extStart, extEnd); - if (glewExperimental || GLEW_EXT_raster_multisample) GLEW_EXT_raster_multisample = !_glewInit_GL_EXT_raster_multisample(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_raster_multisample */ -#ifdef GL_EXT_rescale_normal - GLEW_EXT_rescale_normal = _glewSearchExtension("GL_EXT_rescale_normal", extStart, extEnd); -#endif /* GL_EXT_rescale_normal */ -#ifdef GL_EXT_scene_marker - GLEW_EXT_scene_marker = _glewSearchExtension("GL_EXT_scene_marker", extStart, extEnd); - if (glewExperimental || GLEW_EXT_scene_marker) GLEW_EXT_scene_marker = !_glewInit_GL_EXT_scene_marker(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_scene_marker */ -#ifdef GL_EXT_secondary_color - GLEW_EXT_secondary_color = _glewSearchExtension("GL_EXT_secondary_color", extStart, extEnd); - if (glewExperimental || GLEW_EXT_secondary_color) GLEW_EXT_secondary_color = !_glewInit_GL_EXT_secondary_color(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_secondary_color */ -#ifdef GL_EXT_separate_shader_objects - GLEW_EXT_separate_shader_objects = _glewSearchExtension("GL_EXT_separate_shader_objects", extStart, extEnd); - if (glewExperimental || GLEW_EXT_separate_shader_objects) GLEW_EXT_separate_shader_objects = !_glewInit_GL_EXT_separate_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_separate_shader_objects */ -#ifdef GL_EXT_separate_specular_color - GLEW_EXT_separate_specular_color = _glewSearchExtension("GL_EXT_separate_specular_color", extStart, extEnd); -#endif /* GL_EXT_separate_specular_color */ -#ifdef GL_EXT_shader_image_load_formatted - GLEW_EXT_shader_image_load_formatted = _glewSearchExtension("GL_EXT_shader_image_load_formatted", extStart, extEnd); -#endif /* GL_EXT_shader_image_load_formatted */ -#ifdef GL_EXT_shader_image_load_store - GLEW_EXT_shader_image_load_store = _glewSearchExtension("GL_EXT_shader_image_load_store", extStart, extEnd); - if (glewExperimental || GLEW_EXT_shader_image_load_store) GLEW_EXT_shader_image_load_store = !_glewInit_GL_EXT_shader_image_load_store(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_shader_image_load_store */ -#ifdef GL_EXT_shader_integer_mix - GLEW_EXT_shader_integer_mix = _glewSearchExtension("GL_EXT_shader_integer_mix", extStart, extEnd); -#endif /* GL_EXT_shader_integer_mix */ -#ifdef GL_EXT_shadow_funcs - GLEW_EXT_shadow_funcs = _glewSearchExtension("GL_EXT_shadow_funcs", extStart, extEnd); -#endif /* GL_EXT_shadow_funcs */ -#ifdef GL_EXT_shared_texture_palette - GLEW_EXT_shared_texture_palette = _glewSearchExtension("GL_EXT_shared_texture_palette", extStart, extEnd); -#endif /* GL_EXT_shared_texture_palette */ -#ifdef GL_EXT_sparse_texture2 - GLEW_EXT_sparse_texture2 = _glewSearchExtension("GL_EXT_sparse_texture2", extStart, extEnd); -#endif /* GL_EXT_sparse_texture2 */ -#ifdef GL_EXT_stencil_clear_tag - GLEW_EXT_stencil_clear_tag = _glewSearchExtension("GL_EXT_stencil_clear_tag", extStart, extEnd); -#endif /* GL_EXT_stencil_clear_tag */ -#ifdef GL_EXT_stencil_two_side - GLEW_EXT_stencil_two_side = _glewSearchExtension("GL_EXT_stencil_two_side", extStart, extEnd); - if (glewExperimental || GLEW_EXT_stencil_two_side) GLEW_EXT_stencil_two_side = !_glewInit_GL_EXT_stencil_two_side(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_stencil_two_side */ -#ifdef GL_EXT_stencil_wrap - GLEW_EXT_stencil_wrap = _glewSearchExtension("GL_EXT_stencil_wrap", extStart, extEnd); -#endif /* GL_EXT_stencil_wrap */ -#ifdef GL_EXT_subtexture - GLEW_EXT_subtexture = _glewSearchExtension("GL_EXT_subtexture", extStart, extEnd); - if (glewExperimental || GLEW_EXT_subtexture) GLEW_EXT_subtexture = !_glewInit_GL_EXT_subtexture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_subtexture */ -#ifdef GL_EXT_texture - GLEW_EXT_texture = _glewSearchExtension("GL_EXT_texture", extStart, extEnd); -#endif /* GL_EXT_texture */ -#ifdef GL_EXT_texture3D - GLEW_EXT_texture3D = _glewSearchExtension("GL_EXT_texture3D", extStart, extEnd); - if (glewExperimental || GLEW_EXT_texture3D) GLEW_EXT_texture3D = !_glewInit_GL_EXT_texture3D(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_texture3D */ -#ifdef GL_EXT_texture_array - GLEW_EXT_texture_array = _glewSearchExtension("GL_EXT_texture_array", extStart, extEnd); - if (glewExperimental || GLEW_EXT_texture_array) GLEW_EXT_texture_array = !_glewInit_GL_EXT_texture_array(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_texture_array */ -#ifdef GL_EXT_texture_buffer_object - GLEW_EXT_texture_buffer_object = _glewSearchExtension("GL_EXT_texture_buffer_object", extStart, extEnd); - if (glewExperimental || GLEW_EXT_texture_buffer_object) GLEW_EXT_texture_buffer_object = !_glewInit_GL_EXT_texture_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_texture_buffer_object */ -#ifdef GL_EXT_texture_compression_dxt1 - GLEW_EXT_texture_compression_dxt1 = _glewSearchExtension("GL_EXT_texture_compression_dxt1", extStart, extEnd); -#endif /* GL_EXT_texture_compression_dxt1 */ -#ifdef GL_EXT_texture_compression_latc - GLEW_EXT_texture_compression_latc = _glewSearchExtension("GL_EXT_texture_compression_latc", extStart, extEnd); -#endif /* GL_EXT_texture_compression_latc */ -#ifdef GL_EXT_texture_compression_rgtc - GLEW_EXT_texture_compression_rgtc = _glewSearchExtension("GL_EXT_texture_compression_rgtc", extStart, extEnd); -#endif /* GL_EXT_texture_compression_rgtc */ -#ifdef GL_EXT_texture_compression_s3tc - GLEW_EXT_texture_compression_s3tc = _glewSearchExtension("GL_EXT_texture_compression_s3tc", extStart, extEnd); -#endif /* GL_EXT_texture_compression_s3tc */ -#ifdef GL_EXT_texture_cube_map - GLEW_EXT_texture_cube_map = _glewSearchExtension("GL_EXT_texture_cube_map", extStart, extEnd); -#endif /* GL_EXT_texture_cube_map */ -#ifdef GL_EXT_texture_edge_clamp - GLEW_EXT_texture_edge_clamp = _glewSearchExtension("GL_EXT_texture_edge_clamp", extStart, extEnd); -#endif /* GL_EXT_texture_edge_clamp */ -#ifdef GL_EXT_texture_env - GLEW_EXT_texture_env = _glewSearchExtension("GL_EXT_texture_env", extStart, extEnd); -#endif /* GL_EXT_texture_env */ -#ifdef GL_EXT_texture_env_add - GLEW_EXT_texture_env_add = _glewSearchExtension("GL_EXT_texture_env_add", extStart, extEnd); -#endif /* GL_EXT_texture_env_add */ -#ifdef GL_EXT_texture_env_combine - GLEW_EXT_texture_env_combine = _glewSearchExtension("GL_EXT_texture_env_combine", extStart, extEnd); -#endif /* GL_EXT_texture_env_combine */ -#ifdef GL_EXT_texture_env_dot3 - GLEW_EXT_texture_env_dot3 = _glewSearchExtension("GL_EXT_texture_env_dot3", extStart, extEnd); -#endif /* GL_EXT_texture_env_dot3 */ -#ifdef GL_EXT_texture_filter_anisotropic - GLEW_EXT_texture_filter_anisotropic = _glewSearchExtension("GL_EXT_texture_filter_anisotropic", extStart, extEnd); -#endif /* GL_EXT_texture_filter_anisotropic */ -#ifdef GL_EXT_texture_filter_minmax - GLEW_EXT_texture_filter_minmax = _glewSearchExtension("GL_EXT_texture_filter_minmax", extStart, extEnd); -#endif /* GL_EXT_texture_filter_minmax */ -#ifdef GL_EXT_texture_integer - GLEW_EXT_texture_integer = _glewSearchExtension("GL_EXT_texture_integer", extStart, extEnd); - if (glewExperimental || GLEW_EXT_texture_integer) GLEW_EXT_texture_integer = !_glewInit_GL_EXT_texture_integer(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_texture_integer */ -#ifdef GL_EXT_texture_lod_bias - GLEW_EXT_texture_lod_bias = _glewSearchExtension("GL_EXT_texture_lod_bias", extStart, extEnd); -#endif /* GL_EXT_texture_lod_bias */ -#ifdef GL_EXT_texture_mirror_clamp - GLEW_EXT_texture_mirror_clamp = _glewSearchExtension("GL_EXT_texture_mirror_clamp", extStart, extEnd); -#endif /* GL_EXT_texture_mirror_clamp */ -#ifdef GL_EXT_texture_object - GLEW_EXT_texture_object = _glewSearchExtension("GL_EXT_texture_object", extStart, extEnd); - if (glewExperimental || GLEW_EXT_texture_object) GLEW_EXT_texture_object = !_glewInit_GL_EXT_texture_object(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_texture_object */ -#ifdef GL_EXT_texture_perturb_normal - GLEW_EXT_texture_perturb_normal = _glewSearchExtension("GL_EXT_texture_perturb_normal", extStart, extEnd); - if (glewExperimental || GLEW_EXT_texture_perturb_normal) GLEW_EXT_texture_perturb_normal = !_glewInit_GL_EXT_texture_perturb_normal(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_texture_perturb_normal */ -#ifdef GL_EXT_texture_rectangle - GLEW_EXT_texture_rectangle = _glewSearchExtension("GL_EXT_texture_rectangle", extStart, extEnd); -#endif /* GL_EXT_texture_rectangle */ -#ifdef GL_EXT_texture_sRGB - GLEW_EXT_texture_sRGB = _glewSearchExtension("GL_EXT_texture_sRGB", extStart, extEnd); -#endif /* GL_EXT_texture_sRGB */ -#ifdef GL_EXT_texture_sRGB_decode - GLEW_EXT_texture_sRGB_decode = _glewSearchExtension("GL_EXT_texture_sRGB_decode", extStart, extEnd); -#endif /* GL_EXT_texture_sRGB_decode */ -#ifdef GL_EXT_texture_shared_exponent - GLEW_EXT_texture_shared_exponent = _glewSearchExtension("GL_EXT_texture_shared_exponent", extStart, extEnd); -#endif /* GL_EXT_texture_shared_exponent */ -#ifdef GL_EXT_texture_snorm - GLEW_EXT_texture_snorm = _glewSearchExtension("GL_EXT_texture_snorm", extStart, extEnd); -#endif /* GL_EXT_texture_snorm */ -#ifdef GL_EXT_texture_swizzle - GLEW_EXT_texture_swizzle = _glewSearchExtension("GL_EXT_texture_swizzle", extStart, extEnd); -#endif /* GL_EXT_texture_swizzle */ -#ifdef GL_EXT_timer_query - GLEW_EXT_timer_query = _glewSearchExtension("GL_EXT_timer_query", extStart, extEnd); - if (glewExperimental || GLEW_EXT_timer_query) GLEW_EXT_timer_query = !_glewInit_GL_EXT_timer_query(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_timer_query */ -#ifdef GL_EXT_transform_feedback - GLEW_EXT_transform_feedback = _glewSearchExtension("GL_EXT_transform_feedback", extStart, extEnd); - if (glewExperimental || GLEW_EXT_transform_feedback) GLEW_EXT_transform_feedback = !_glewInit_GL_EXT_transform_feedback(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_transform_feedback */ -#ifdef GL_EXT_vertex_array - GLEW_EXT_vertex_array = _glewSearchExtension("GL_EXT_vertex_array", extStart, extEnd); - if (glewExperimental || GLEW_EXT_vertex_array) GLEW_EXT_vertex_array = !_glewInit_GL_EXT_vertex_array(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_vertex_array */ -#ifdef GL_EXT_vertex_array_bgra - GLEW_EXT_vertex_array_bgra = _glewSearchExtension("GL_EXT_vertex_array_bgra", extStart, extEnd); -#endif /* GL_EXT_vertex_array_bgra */ -#ifdef GL_EXT_vertex_attrib_64bit - GLEW_EXT_vertex_attrib_64bit = _glewSearchExtension("GL_EXT_vertex_attrib_64bit", extStart, extEnd); - if (glewExperimental || GLEW_EXT_vertex_attrib_64bit) GLEW_EXT_vertex_attrib_64bit = !_glewInit_GL_EXT_vertex_attrib_64bit(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_vertex_attrib_64bit */ -#ifdef GL_EXT_vertex_shader - GLEW_EXT_vertex_shader = _glewSearchExtension("GL_EXT_vertex_shader", extStart, extEnd); - if (glewExperimental || GLEW_EXT_vertex_shader) GLEW_EXT_vertex_shader = !_glewInit_GL_EXT_vertex_shader(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_vertex_shader */ -#ifdef GL_EXT_vertex_weighting - GLEW_EXT_vertex_weighting = _glewSearchExtension("GL_EXT_vertex_weighting", extStart, extEnd); - if (glewExperimental || GLEW_EXT_vertex_weighting) GLEW_EXT_vertex_weighting = !_glewInit_GL_EXT_vertex_weighting(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_vertex_weighting */ -#ifdef GL_EXT_x11_sync_object - GLEW_EXT_x11_sync_object = _glewSearchExtension("GL_EXT_x11_sync_object", extStart, extEnd); - if (glewExperimental || GLEW_EXT_x11_sync_object) GLEW_EXT_x11_sync_object = !_glewInit_GL_EXT_x11_sync_object(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_x11_sync_object */ -#ifdef GL_GREMEDY_frame_terminator - GLEW_GREMEDY_frame_terminator = _glewSearchExtension("GL_GREMEDY_frame_terminator", extStart, extEnd); - if (glewExperimental || GLEW_GREMEDY_frame_terminator) GLEW_GREMEDY_frame_terminator = !_glewInit_GL_GREMEDY_frame_terminator(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_GREMEDY_frame_terminator */ -#ifdef GL_GREMEDY_string_marker - GLEW_GREMEDY_string_marker = _glewSearchExtension("GL_GREMEDY_string_marker", extStart, extEnd); - if (glewExperimental || GLEW_GREMEDY_string_marker) GLEW_GREMEDY_string_marker = !_glewInit_GL_GREMEDY_string_marker(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_GREMEDY_string_marker */ -#ifdef GL_HP_convolution_border_modes - GLEW_HP_convolution_border_modes = _glewSearchExtension("GL_HP_convolution_border_modes", extStart, extEnd); -#endif /* GL_HP_convolution_border_modes */ -#ifdef GL_HP_image_transform - GLEW_HP_image_transform = _glewSearchExtension("GL_HP_image_transform", extStart, extEnd); - if (glewExperimental || GLEW_HP_image_transform) GLEW_HP_image_transform = !_glewInit_GL_HP_image_transform(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_HP_image_transform */ -#ifdef GL_HP_occlusion_test - GLEW_HP_occlusion_test = _glewSearchExtension("GL_HP_occlusion_test", extStart, extEnd); -#endif /* GL_HP_occlusion_test */ -#ifdef GL_HP_texture_lighting - GLEW_HP_texture_lighting = _glewSearchExtension("GL_HP_texture_lighting", extStart, extEnd); -#endif /* GL_HP_texture_lighting */ -#ifdef GL_IBM_cull_vertex - GLEW_IBM_cull_vertex = _glewSearchExtension("GL_IBM_cull_vertex", extStart, extEnd); -#endif /* GL_IBM_cull_vertex */ -#ifdef GL_IBM_multimode_draw_arrays - GLEW_IBM_multimode_draw_arrays = _glewSearchExtension("GL_IBM_multimode_draw_arrays", extStart, extEnd); - if (glewExperimental || GLEW_IBM_multimode_draw_arrays) GLEW_IBM_multimode_draw_arrays = !_glewInit_GL_IBM_multimode_draw_arrays(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_IBM_multimode_draw_arrays */ -#ifdef GL_IBM_rasterpos_clip - GLEW_IBM_rasterpos_clip = _glewSearchExtension("GL_IBM_rasterpos_clip", extStart, extEnd); -#endif /* GL_IBM_rasterpos_clip */ -#ifdef GL_IBM_static_data - GLEW_IBM_static_data = _glewSearchExtension("GL_IBM_static_data", extStart, extEnd); -#endif /* GL_IBM_static_data */ -#ifdef GL_IBM_texture_mirrored_repeat - GLEW_IBM_texture_mirrored_repeat = _glewSearchExtension("GL_IBM_texture_mirrored_repeat", extStart, extEnd); -#endif /* GL_IBM_texture_mirrored_repeat */ -#ifdef GL_IBM_vertex_array_lists - GLEW_IBM_vertex_array_lists = _glewSearchExtension("GL_IBM_vertex_array_lists", extStart, extEnd); - if (glewExperimental || GLEW_IBM_vertex_array_lists) GLEW_IBM_vertex_array_lists = !_glewInit_GL_IBM_vertex_array_lists(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_IBM_vertex_array_lists */ -#ifdef GL_INGR_color_clamp - GLEW_INGR_color_clamp = _glewSearchExtension("GL_INGR_color_clamp", extStart, extEnd); -#endif /* GL_INGR_color_clamp */ -#ifdef GL_INGR_interlace_read - GLEW_INGR_interlace_read = _glewSearchExtension("GL_INGR_interlace_read", extStart, extEnd); -#endif /* GL_INGR_interlace_read */ -#ifdef GL_INTEL_fragment_shader_ordering - GLEW_INTEL_fragment_shader_ordering = _glewSearchExtension("GL_INTEL_fragment_shader_ordering", extStart, extEnd); -#endif /* GL_INTEL_fragment_shader_ordering */ -#ifdef GL_INTEL_framebuffer_CMAA - GLEW_INTEL_framebuffer_CMAA = _glewSearchExtension("GL_INTEL_framebuffer_CMAA", extStart, extEnd); -#endif /* GL_INTEL_framebuffer_CMAA */ -#ifdef GL_INTEL_map_texture - GLEW_INTEL_map_texture = _glewSearchExtension("GL_INTEL_map_texture", extStart, extEnd); - if (glewExperimental || GLEW_INTEL_map_texture) GLEW_INTEL_map_texture = !_glewInit_GL_INTEL_map_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_INTEL_map_texture */ -#ifdef GL_INTEL_parallel_arrays - GLEW_INTEL_parallel_arrays = _glewSearchExtension("GL_INTEL_parallel_arrays", extStart, extEnd); - if (glewExperimental || GLEW_INTEL_parallel_arrays) GLEW_INTEL_parallel_arrays = !_glewInit_GL_INTEL_parallel_arrays(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_INTEL_parallel_arrays */ -#ifdef GL_INTEL_performance_query - GLEW_INTEL_performance_query = _glewSearchExtension("GL_INTEL_performance_query", extStart, extEnd); - if (glewExperimental || GLEW_INTEL_performance_query) GLEW_INTEL_performance_query = !_glewInit_GL_INTEL_performance_query(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_INTEL_performance_query */ -#ifdef GL_INTEL_texture_scissor - GLEW_INTEL_texture_scissor = _glewSearchExtension("GL_INTEL_texture_scissor", extStart, extEnd); - if (glewExperimental || GLEW_INTEL_texture_scissor) GLEW_INTEL_texture_scissor = !_glewInit_GL_INTEL_texture_scissor(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_INTEL_texture_scissor */ -#ifdef GL_KHR_blend_equation_advanced - GLEW_KHR_blend_equation_advanced = _glewSearchExtension("GL_KHR_blend_equation_advanced", extStart, extEnd); - if (glewExperimental || GLEW_KHR_blend_equation_advanced) GLEW_KHR_blend_equation_advanced = !_glewInit_GL_KHR_blend_equation_advanced(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_KHR_blend_equation_advanced */ -#ifdef GL_KHR_blend_equation_advanced_coherent - GLEW_KHR_blend_equation_advanced_coherent = _glewSearchExtension("GL_KHR_blend_equation_advanced_coherent", extStart, extEnd); -#endif /* GL_KHR_blend_equation_advanced_coherent */ -#ifdef GL_KHR_context_flush_control - GLEW_KHR_context_flush_control = _glewSearchExtension("GL_KHR_context_flush_control", extStart, extEnd); -#endif /* GL_KHR_context_flush_control */ -#ifdef GL_KHR_debug - GLEW_KHR_debug = _glewSearchExtension("GL_KHR_debug", extStart, extEnd); - if (glewExperimental || GLEW_KHR_debug) GLEW_KHR_debug = !_glewInit_GL_KHR_debug(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_KHR_debug */ -#ifdef GL_KHR_no_error - GLEW_KHR_no_error = _glewSearchExtension("GL_KHR_no_error", extStart, extEnd); -#endif /* GL_KHR_no_error */ -#ifdef GL_KHR_robust_buffer_access_behavior - GLEW_KHR_robust_buffer_access_behavior = _glewSearchExtension("GL_KHR_robust_buffer_access_behavior", extStart, extEnd); -#endif /* GL_KHR_robust_buffer_access_behavior */ -#ifdef GL_KHR_robustness - GLEW_KHR_robustness = _glewSearchExtension("GL_KHR_robustness", extStart, extEnd); - if (glewExperimental || GLEW_KHR_robustness) GLEW_KHR_robustness = !_glewInit_GL_KHR_robustness(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_KHR_robustness */ -#ifdef GL_KHR_texture_compression_astc_hdr - GLEW_KHR_texture_compression_astc_hdr = _glewSearchExtension("GL_KHR_texture_compression_astc_hdr", extStart, extEnd); -#endif /* GL_KHR_texture_compression_astc_hdr */ -#ifdef GL_KHR_texture_compression_astc_ldr - GLEW_KHR_texture_compression_astc_ldr = _glewSearchExtension("GL_KHR_texture_compression_astc_ldr", extStart, extEnd); -#endif /* GL_KHR_texture_compression_astc_ldr */ -#ifdef GL_KTX_buffer_region - GLEW_KTX_buffer_region = _glewSearchExtension("GL_KTX_buffer_region", extStart, extEnd); - if (glewExperimental || GLEW_KTX_buffer_region) GLEW_KTX_buffer_region = !_glewInit_GL_KTX_buffer_region(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_KTX_buffer_region */ -#ifdef GL_MESAX_texture_stack - GLEW_MESAX_texture_stack = _glewSearchExtension("GL_MESAX_texture_stack", extStart, extEnd); -#endif /* GL_MESAX_texture_stack */ -#ifdef GL_MESA_pack_invert - GLEW_MESA_pack_invert = _glewSearchExtension("GL_MESA_pack_invert", extStart, extEnd); -#endif /* GL_MESA_pack_invert */ -#ifdef GL_MESA_resize_buffers - GLEW_MESA_resize_buffers = _glewSearchExtension("GL_MESA_resize_buffers", extStart, extEnd); - if (glewExperimental || GLEW_MESA_resize_buffers) GLEW_MESA_resize_buffers = !_glewInit_GL_MESA_resize_buffers(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_MESA_resize_buffers */ -#ifdef GL_MESA_window_pos - GLEW_MESA_window_pos = _glewSearchExtension("GL_MESA_window_pos", extStart, extEnd); - if (glewExperimental || GLEW_MESA_window_pos) GLEW_MESA_window_pos = !_glewInit_GL_MESA_window_pos(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_MESA_window_pos */ -#ifdef GL_MESA_ycbcr_texture - GLEW_MESA_ycbcr_texture = _glewSearchExtension("GL_MESA_ycbcr_texture", extStart, extEnd); -#endif /* GL_MESA_ycbcr_texture */ -#ifdef GL_NVX_conditional_render - GLEW_NVX_conditional_render = _glewSearchExtension("GL_NVX_conditional_render", extStart, extEnd); - if (glewExperimental || GLEW_NVX_conditional_render) GLEW_NVX_conditional_render = !_glewInit_GL_NVX_conditional_render(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NVX_conditional_render */ -#ifdef GL_NVX_gpu_memory_info - GLEW_NVX_gpu_memory_info = _glewSearchExtension("GL_NVX_gpu_memory_info", extStart, extEnd); -#endif /* GL_NVX_gpu_memory_info */ -#ifdef GL_NV_bindless_multi_draw_indirect - GLEW_NV_bindless_multi_draw_indirect = _glewSearchExtension("GL_NV_bindless_multi_draw_indirect", extStart, extEnd); - if (glewExperimental || GLEW_NV_bindless_multi_draw_indirect) GLEW_NV_bindless_multi_draw_indirect = !_glewInit_GL_NV_bindless_multi_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_bindless_multi_draw_indirect */ -#ifdef GL_NV_bindless_multi_draw_indirect_count - GLEW_NV_bindless_multi_draw_indirect_count = _glewSearchExtension("GL_NV_bindless_multi_draw_indirect_count", extStart, extEnd); - if (glewExperimental || GLEW_NV_bindless_multi_draw_indirect_count) GLEW_NV_bindless_multi_draw_indirect_count = !_glewInit_GL_NV_bindless_multi_draw_indirect_count(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_bindless_multi_draw_indirect_count */ -#ifdef GL_NV_bindless_texture - GLEW_NV_bindless_texture = _glewSearchExtension("GL_NV_bindless_texture", extStart, extEnd); - if (glewExperimental || GLEW_NV_bindless_texture) GLEW_NV_bindless_texture = !_glewInit_GL_NV_bindless_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_bindless_texture */ -#ifdef GL_NV_blend_equation_advanced - GLEW_NV_blend_equation_advanced = _glewSearchExtension("GL_NV_blend_equation_advanced", extStart, extEnd); - if (glewExperimental || GLEW_NV_blend_equation_advanced) GLEW_NV_blend_equation_advanced = !_glewInit_GL_NV_blend_equation_advanced(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_blend_equation_advanced */ -#ifdef GL_NV_blend_equation_advanced_coherent - GLEW_NV_blend_equation_advanced_coherent = _glewSearchExtension("GL_NV_blend_equation_advanced_coherent", extStart, extEnd); -#endif /* GL_NV_blend_equation_advanced_coherent */ -#ifdef GL_NV_blend_square - GLEW_NV_blend_square = _glewSearchExtension("GL_NV_blend_square", extStart, extEnd); -#endif /* GL_NV_blend_square */ -#ifdef GL_NV_compute_program5 - GLEW_NV_compute_program5 = _glewSearchExtension("GL_NV_compute_program5", extStart, extEnd); -#endif /* GL_NV_compute_program5 */ -#ifdef GL_NV_conditional_render - GLEW_NV_conditional_render = _glewSearchExtension("GL_NV_conditional_render", extStart, extEnd); - if (glewExperimental || GLEW_NV_conditional_render) GLEW_NV_conditional_render = !_glewInit_GL_NV_conditional_render(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_conditional_render */ -#ifdef GL_NV_conservative_raster - GLEW_NV_conservative_raster = _glewSearchExtension("GL_NV_conservative_raster", extStart, extEnd); - if (glewExperimental || GLEW_NV_conservative_raster) GLEW_NV_conservative_raster = !_glewInit_GL_NV_conservative_raster(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_conservative_raster */ -#ifdef GL_NV_conservative_raster_dilate - GLEW_NV_conservative_raster_dilate = _glewSearchExtension("GL_NV_conservative_raster_dilate", extStart, extEnd); - if (glewExperimental || GLEW_NV_conservative_raster_dilate) GLEW_NV_conservative_raster_dilate = !_glewInit_GL_NV_conservative_raster_dilate(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_conservative_raster_dilate */ -#ifdef GL_NV_copy_depth_to_color - GLEW_NV_copy_depth_to_color = _glewSearchExtension("GL_NV_copy_depth_to_color", extStart, extEnd); -#endif /* GL_NV_copy_depth_to_color */ -#ifdef GL_NV_copy_image - GLEW_NV_copy_image = _glewSearchExtension("GL_NV_copy_image", extStart, extEnd); - if (glewExperimental || GLEW_NV_copy_image) GLEW_NV_copy_image = !_glewInit_GL_NV_copy_image(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_copy_image */ -#ifdef GL_NV_deep_texture3D - GLEW_NV_deep_texture3D = _glewSearchExtension("GL_NV_deep_texture3D", extStart, extEnd); -#endif /* GL_NV_deep_texture3D */ -#ifdef GL_NV_depth_buffer_float - GLEW_NV_depth_buffer_float = _glewSearchExtension("GL_NV_depth_buffer_float", extStart, extEnd); - if (glewExperimental || GLEW_NV_depth_buffer_float) GLEW_NV_depth_buffer_float = !_glewInit_GL_NV_depth_buffer_float(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_depth_buffer_float */ -#ifdef GL_NV_depth_clamp - GLEW_NV_depth_clamp = _glewSearchExtension("GL_NV_depth_clamp", extStart, extEnd); -#endif /* GL_NV_depth_clamp */ -#ifdef GL_NV_depth_range_unclamped - GLEW_NV_depth_range_unclamped = _glewSearchExtension("GL_NV_depth_range_unclamped", extStart, extEnd); -#endif /* GL_NV_depth_range_unclamped */ -#ifdef GL_NV_draw_texture - GLEW_NV_draw_texture = _glewSearchExtension("GL_NV_draw_texture", extStart, extEnd); - if (glewExperimental || GLEW_NV_draw_texture) GLEW_NV_draw_texture = !_glewInit_GL_NV_draw_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_draw_texture */ -#ifdef GL_NV_evaluators - GLEW_NV_evaluators = _glewSearchExtension("GL_NV_evaluators", extStart, extEnd); - if (glewExperimental || GLEW_NV_evaluators) GLEW_NV_evaluators = !_glewInit_GL_NV_evaluators(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_evaluators */ -#ifdef GL_NV_explicit_multisample - GLEW_NV_explicit_multisample = _glewSearchExtension("GL_NV_explicit_multisample", extStart, extEnd); - if (glewExperimental || GLEW_NV_explicit_multisample) GLEW_NV_explicit_multisample = !_glewInit_GL_NV_explicit_multisample(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_explicit_multisample */ -#ifdef GL_NV_fence - GLEW_NV_fence = _glewSearchExtension("GL_NV_fence", extStart, extEnd); - if (glewExperimental || GLEW_NV_fence) GLEW_NV_fence = !_glewInit_GL_NV_fence(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_fence */ -#ifdef GL_NV_fill_rectangle - GLEW_NV_fill_rectangle = _glewSearchExtension("GL_NV_fill_rectangle", extStart, extEnd); -#endif /* GL_NV_fill_rectangle */ -#ifdef GL_NV_float_buffer - GLEW_NV_float_buffer = _glewSearchExtension("GL_NV_float_buffer", extStart, extEnd); -#endif /* GL_NV_float_buffer */ -#ifdef GL_NV_fog_distance - GLEW_NV_fog_distance = _glewSearchExtension("GL_NV_fog_distance", extStart, extEnd); -#endif /* GL_NV_fog_distance */ -#ifdef GL_NV_fragment_coverage_to_color - GLEW_NV_fragment_coverage_to_color = _glewSearchExtension("GL_NV_fragment_coverage_to_color", extStart, extEnd); - if (glewExperimental || GLEW_NV_fragment_coverage_to_color) GLEW_NV_fragment_coverage_to_color = !_glewInit_GL_NV_fragment_coverage_to_color(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_fragment_coverage_to_color */ -#ifdef GL_NV_fragment_program - GLEW_NV_fragment_program = _glewSearchExtension("GL_NV_fragment_program", extStart, extEnd); - if (glewExperimental || GLEW_NV_fragment_program) GLEW_NV_fragment_program = !_glewInit_GL_NV_fragment_program(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_fragment_program */ -#ifdef GL_NV_fragment_program2 - GLEW_NV_fragment_program2 = _glewSearchExtension("GL_NV_fragment_program2", extStart, extEnd); -#endif /* GL_NV_fragment_program2 */ -#ifdef GL_NV_fragment_program4 - GLEW_NV_fragment_program4 = _glewSearchExtension("GL_NV_gpu_program4", extStart, extEnd); -#endif /* GL_NV_fragment_program4 */ -#ifdef GL_NV_fragment_program_option - GLEW_NV_fragment_program_option = _glewSearchExtension("GL_NV_fragment_program_option", extStart, extEnd); -#endif /* GL_NV_fragment_program_option */ -#ifdef GL_NV_fragment_shader_interlock - GLEW_NV_fragment_shader_interlock = _glewSearchExtension("GL_NV_fragment_shader_interlock", extStart, extEnd); -#endif /* GL_NV_fragment_shader_interlock */ -#ifdef GL_NV_framebuffer_mixed_samples - GLEW_NV_framebuffer_mixed_samples = _glewSearchExtension("GL_NV_framebuffer_mixed_samples", extStart, extEnd); -#endif /* GL_NV_framebuffer_mixed_samples */ -#ifdef GL_NV_framebuffer_multisample_coverage - GLEW_NV_framebuffer_multisample_coverage = _glewSearchExtension("GL_NV_framebuffer_multisample_coverage", extStart, extEnd); - if (glewExperimental || GLEW_NV_framebuffer_multisample_coverage) GLEW_NV_framebuffer_multisample_coverage = !_glewInit_GL_NV_framebuffer_multisample_coverage(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_framebuffer_multisample_coverage */ -#ifdef GL_NV_geometry_program4 - GLEW_NV_geometry_program4 = _glewSearchExtension("GL_NV_gpu_program4", extStart, extEnd); - if (glewExperimental || GLEW_NV_geometry_program4) GLEW_NV_geometry_program4 = !_glewInit_GL_NV_geometry_program4(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_geometry_program4 */ -#ifdef GL_NV_geometry_shader4 - GLEW_NV_geometry_shader4 = _glewSearchExtension("GL_NV_geometry_shader4", extStart, extEnd); -#endif /* GL_NV_geometry_shader4 */ -#ifdef GL_NV_geometry_shader_passthrough - GLEW_NV_geometry_shader_passthrough = _glewSearchExtension("GL_NV_geometry_shader_passthrough", extStart, extEnd); -#endif /* GL_NV_geometry_shader_passthrough */ -#ifdef GL_NV_gpu_program4 - GLEW_NV_gpu_program4 = _glewSearchExtension("GL_NV_gpu_program4", extStart, extEnd); - if (glewExperimental || GLEW_NV_gpu_program4) GLEW_NV_gpu_program4 = !_glewInit_GL_NV_gpu_program4(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_gpu_program4 */ -#ifdef GL_NV_gpu_program5 - GLEW_NV_gpu_program5 = _glewSearchExtension("GL_NV_gpu_program5", extStart, extEnd); -#endif /* GL_NV_gpu_program5 */ -#ifdef GL_NV_gpu_program5_mem_extended - GLEW_NV_gpu_program5_mem_extended = _glewSearchExtension("GL_NV_gpu_program5_mem_extended", extStart, extEnd); -#endif /* GL_NV_gpu_program5_mem_extended */ -#ifdef GL_NV_gpu_program_fp64 - GLEW_NV_gpu_program_fp64 = _glewSearchExtension("GL_NV_gpu_program_fp64", extStart, extEnd); -#endif /* GL_NV_gpu_program_fp64 */ -#ifdef GL_NV_gpu_shader5 - GLEW_NV_gpu_shader5 = _glewSearchExtension("GL_NV_gpu_shader5", extStart, extEnd); - if (glewExperimental || GLEW_NV_gpu_shader5) GLEW_NV_gpu_shader5 = !_glewInit_GL_NV_gpu_shader5(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_gpu_shader5 */ -#ifdef GL_NV_half_float - GLEW_NV_half_float = _glewSearchExtension("GL_NV_half_float", extStart, extEnd); - if (glewExperimental || GLEW_NV_half_float) GLEW_NV_half_float = !_glewInit_GL_NV_half_float(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_half_float */ -#ifdef GL_NV_internalformat_sample_query - GLEW_NV_internalformat_sample_query = _glewSearchExtension("GL_NV_internalformat_sample_query", extStart, extEnd); - if (glewExperimental || GLEW_NV_internalformat_sample_query) GLEW_NV_internalformat_sample_query = !_glewInit_GL_NV_internalformat_sample_query(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_internalformat_sample_query */ -#ifdef GL_NV_light_max_exponent - GLEW_NV_light_max_exponent = _glewSearchExtension("GL_NV_light_max_exponent", extStart, extEnd); -#endif /* GL_NV_light_max_exponent */ -#ifdef GL_NV_multisample_coverage - GLEW_NV_multisample_coverage = _glewSearchExtension("GL_NV_multisample_coverage", extStart, extEnd); -#endif /* GL_NV_multisample_coverage */ -#ifdef GL_NV_multisample_filter_hint - GLEW_NV_multisample_filter_hint = _glewSearchExtension("GL_NV_multisample_filter_hint", extStart, extEnd); -#endif /* GL_NV_multisample_filter_hint */ -#ifdef GL_NV_occlusion_query - GLEW_NV_occlusion_query = _glewSearchExtension("GL_NV_occlusion_query", extStart, extEnd); - if (glewExperimental || GLEW_NV_occlusion_query) GLEW_NV_occlusion_query = !_glewInit_GL_NV_occlusion_query(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_occlusion_query */ -#ifdef GL_NV_packed_depth_stencil - GLEW_NV_packed_depth_stencil = _glewSearchExtension("GL_NV_packed_depth_stencil", extStart, extEnd); -#endif /* GL_NV_packed_depth_stencil */ -#ifdef GL_NV_parameter_buffer_object - GLEW_NV_parameter_buffer_object = _glewSearchExtension("GL_NV_parameter_buffer_object", extStart, extEnd); - if (glewExperimental || GLEW_NV_parameter_buffer_object) GLEW_NV_parameter_buffer_object = !_glewInit_GL_NV_parameter_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_parameter_buffer_object */ -#ifdef GL_NV_parameter_buffer_object2 - GLEW_NV_parameter_buffer_object2 = _glewSearchExtension("GL_NV_parameter_buffer_object2", extStart, extEnd); -#endif /* GL_NV_parameter_buffer_object2 */ -#ifdef GL_NV_path_rendering - GLEW_NV_path_rendering = _glewSearchExtension("GL_NV_path_rendering", extStart, extEnd); - if (glewExperimental || GLEW_NV_path_rendering) GLEW_NV_path_rendering = !_glewInit_GL_NV_path_rendering(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_path_rendering */ -#ifdef GL_NV_path_rendering_shared_edge - GLEW_NV_path_rendering_shared_edge = _glewSearchExtension("GL_NV_path_rendering_shared_edge", extStart, extEnd); -#endif /* GL_NV_path_rendering_shared_edge */ -#ifdef GL_NV_pixel_data_range - GLEW_NV_pixel_data_range = _glewSearchExtension("GL_NV_pixel_data_range", extStart, extEnd); - if (glewExperimental || GLEW_NV_pixel_data_range) GLEW_NV_pixel_data_range = !_glewInit_GL_NV_pixel_data_range(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_pixel_data_range */ -#ifdef GL_NV_point_sprite - GLEW_NV_point_sprite = _glewSearchExtension("GL_NV_point_sprite", extStart, extEnd); - if (glewExperimental || GLEW_NV_point_sprite) GLEW_NV_point_sprite = !_glewInit_GL_NV_point_sprite(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_point_sprite */ -#ifdef GL_NV_present_video - GLEW_NV_present_video = _glewSearchExtension("GL_NV_present_video", extStart, extEnd); - if (glewExperimental || GLEW_NV_present_video) GLEW_NV_present_video = !_glewInit_GL_NV_present_video(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_present_video */ -#ifdef GL_NV_primitive_restart - GLEW_NV_primitive_restart = _glewSearchExtension("GL_NV_primitive_restart", extStart, extEnd); - if (glewExperimental || GLEW_NV_primitive_restart) GLEW_NV_primitive_restart = !_glewInit_GL_NV_primitive_restart(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_primitive_restart */ -#ifdef GL_NV_register_combiners - GLEW_NV_register_combiners = _glewSearchExtension("GL_NV_register_combiners", extStart, extEnd); - if (glewExperimental || GLEW_NV_register_combiners) GLEW_NV_register_combiners = !_glewInit_GL_NV_register_combiners(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_register_combiners */ -#ifdef GL_NV_register_combiners2 - GLEW_NV_register_combiners2 = _glewSearchExtension("GL_NV_register_combiners2", extStart, extEnd); - if (glewExperimental || GLEW_NV_register_combiners2) GLEW_NV_register_combiners2 = !_glewInit_GL_NV_register_combiners2(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_register_combiners2 */ -#ifdef GL_NV_sample_locations - GLEW_NV_sample_locations = _glewSearchExtension("GL_NV_sample_locations", extStart, extEnd); - if (glewExperimental || GLEW_NV_sample_locations) GLEW_NV_sample_locations = !_glewInit_GL_NV_sample_locations(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_sample_locations */ -#ifdef GL_NV_sample_mask_override_coverage - GLEW_NV_sample_mask_override_coverage = _glewSearchExtension("GL_NV_sample_mask_override_coverage", extStart, extEnd); -#endif /* GL_NV_sample_mask_override_coverage */ -#ifdef GL_NV_shader_atomic_counters - GLEW_NV_shader_atomic_counters = _glewSearchExtension("GL_NV_shader_atomic_counters", extStart, extEnd); -#endif /* GL_NV_shader_atomic_counters */ -#ifdef GL_NV_shader_atomic_float - GLEW_NV_shader_atomic_float = _glewSearchExtension("GL_NV_shader_atomic_float", extStart, extEnd); -#endif /* GL_NV_shader_atomic_float */ -#ifdef GL_NV_shader_atomic_fp16_vector - GLEW_NV_shader_atomic_fp16_vector = _glewSearchExtension("GL_NV_shader_atomic_fp16_vector", extStart, extEnd); -#endif /* GL_NV_shader_atomic_fp16_vector */ -#ifdef GL_NV_shader_atomic_int64 - GLEW_NV_shader_atomic_int64 = _glewSearchExtension("GL_NV_shader_atomic_int64", extStart, extEnd); -#endif /* GL_NV_shader_atomic_int64 */ -#ifdef GL_NV_shader_buffer_load - GLEW_NV_shader_buffer_load = _glewSearchExtension("GL_NV_shader_buffer_load", extStart, extEnd); - if (glewExperimental || GLEW_NV_shader_buffer_load) GLEW_NV_shader_buffer_load = !_glewInit_GL_NV_shader_buffer_load(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_shader_buffer_load */ -#ifdef GL_NV_shader_storage_buffer_object - GLEW_NV_shader_storage_buffer_object = _glewSearchExtension("GL_NV_shader_storage_buffer_object", extStart, extEnd); -#endif /* GL_NV_shader_storage_buffer_object */ -#ifdef GL_NV_shader_thread_group - GLEW_NV_shader_thread_group = _glewSearchExtension("GL_NV_shader_thread_group", extStart, extEnd); -#endif /* GL_NV_shader_thread_group */ -#ifdef GL_NV_shader_thread_shuffle - GLEW_NV_shader_thread_shuffle = _glewSearchExtension("GL_NV_shader_thread_shuffle", extStart, extEnd); -#endif /* GL_NV_shader_thread_shuffle */ -#ifdef GL_NV_tessellation_program5 - GLEW_NV_tessellation_program5 = _glewSearchExtension("GL_NV_gpu_program5", extStart, extEnd); -#endif /* GL_NV_tessellation_program5 */ -#ifdef GL_NV_texgen_emboss - GLEW_NV_texgen_emboss = _glewSearchExtension("GL_NV_texgen_emboss", extStart, extEnd); -#endif /* GL_NV_texgen_emboss */ -#ifdef GL_NV_texgen_reflection - GLEW_NV_texgen_reflection = _glewSearchExtension("GL_NV_texgen_reflection", extStart, extEnd); -#endif /* GL_NV_texgen_reflection */ -#ifdef GL_NV_texture_barrier - GLEW_NV_texture_barrier = _glewSearchExtension("GL_NV_texture_barrier", extStart, extEnd); - if (glewExperimental || GLEW_NV_texture_barrier) GLEW_NV_texture_barrier = !_glewInit_GL_NV_texture_barrier(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_texture_barrier */ -#ifdef GL_NV_texture_compression_vtc - GLEW_NV_texture_compression_vtc = _glewSearchExtension("GL_NV_texture_compression_vtc", extStart, extEnd); -#endif /* GL_NV_texture_compression_vtc */ -#ifdef GL_NV_texture_env_combine4 - GLEW_NV_texture_env_combine4 = _glewSearchExtension("GL_NV_texture_env_combine4", extStart, extEnd); -#endif /* GL_NV_texture_env_combine4 */ -#ifdef GL_NV_texture_expand_normal - GLEW_NV_texture_expand_normal = _glewSearchExtension("GL_NV_texture_expand_normal", extStart, extEnd); -#endif /* GL_NV_texture_expand_normal */ -#ifdef GL_NV_texture_multisample - GLEW_NV_texture_multisample = _glewSearchExtension("GL_NV_texture_multisample", extStart, extEnd); - if (glewExperimental || GLEW_NV_texture_multisample) GLEW_NV_texture_multisample = !_glewInit_GL_NV_texture_multisample(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_texture_multisample */ -#ifdef GL_NV_texture_rectangle - GLEW_NV_texture_rectangle = _glewSearchExtension("GL_NV_texture_rectangle", extStart, extEnd); -#endif /* GL_NV_texture_rectangle */ -#ifdef GL_NV_texture_shader - GLEW_NV_texture_shader = _glewSearchExtension("GL_NV_texture_shader", extStart, extEnd); -#endif /* GL_NV_texture_shader */ -#ifdef GL_NV_texture_shader2 - GLEW_NV_texture_shader2 = _glewSearchExtension("GL_NV_texture_shader2", extStart, extEnd); -#endif /* GL_NV_texture_shader2 */ -#ifdef GL_NV_texture_shader3 - GLEW_NV_texture_shader3 = _glewSearchExtension("GL_NV_texture_shader3", extStart, extEnd); -#endif /* GL_NV_texture_shader3 */ -#ifdef GL_NV_transform_feedback - GLEW_NV_transform_feedback = _glewSearchExtension("GL_NV_transform_feedback", extStart, extEnd); - if (glewExperimental || GLEW_NV_transform_feedback) GLEW_NV_transform_feedback = !_glewInit_GL_NV_transform_feedback(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_transform_feedback */ -#ifdef GL_NV_transform_feedback2 - GLEW_NV_transform_feedback2 = _glewSearchExtension("GL_NV_transform_feedback2", extStart, extEnd); - if (glewExperimental || GLEW_NV_transform_feedback2) GLEW_NV_transform_feedback2 = !_glewInit_GL_NV_transform_feedback2(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_transform_feedback2 */ -#ifdef GL_NV_uniform_buffer_unified_memory - GLEW_NV_uniform_buffer_unified_memory = _glewSearchExtension("GL_NV_uniform_buffer_unified_memory", extStart, extEnd); -#endif /* GL_NV_uniform_buffer_unified_memory */ -#ifdef GL_NV_vdpau_interop - GLEW_NV_vdpau_interop = _glewSearchExtension("GL_NV_vdpau_interop", extStart, extEnd); - if (glewExperimental || GLEW_NV_vdpau_interop) GLEW_NV_vdpau_interop = !_glewInit_GL_NV_vdpau_interop(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_vdpau_interop */ -#ifdef GL_NV_vertex_array_range - GLEW_NV_vertex_array_range = _glewSearchExtension("GL_NV_vertex_array_range", extStart, extEnd); - if (glewExperimental || GLEW_NV_vertex_array_range) GLEW_NV_vertex_array_range = !_glewInit_GL_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_vertex_array_range */ -#ifdef GL_NV_vertex_array_range2 - GLEW_NV_vertex_array_range2 = _glewSearchExtension("GL_NV_vertex_array_range2", extStart, extEnd); -#endif /* GL_NV_vertex_array_range2 */ -#ifdef GL_NV_vertex_attrib_integer_64bit - GLEW_NV_vertex_attrib_integer_64bit = _glewSearchExtension("GL_NV_vertex_attrib_integer_64bit", extStart, extEnd); - if (glewExperimental || GLEW_NV_vertex_attrib_integer_64bit) GLEW_NV_vertex_attrib_integer_64bit = !_glewInit_GL_NV_vertex_attrib_integer_64bit(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_vertex_attrib_integer_64bit */ -#ifdef GL_NV_vertex_buffer_unified_memory - GLEW_NV_vertex_buffer_unified_memory = _glewSearchExtension("GL_NV_vertex_buffer_unified_memory", extStart, extEnd); - if (glewExperimental || GLEW_NV_vertex_buffer_unified_memory) GLEW_NV_vertex_buffer_unified_memory = !_glewInit_GL_NV_vertex_buffer_unified_memory(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_vertex_buffer_unified_memory */ -#ifdef GL_NV_vertex_program - GLEW_NV_vertex_program = _glewSearchExtension("GL_NV_vertex_program", extStart, extEnd); - if (glewExperimental || GLEW_NV_vertex_program) GLEW_NV_vertex_program = !_glewInit_GL_NV_vertex_program(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_vertex_program */ -#ifdef GL_NV_vertex_program1_1 - GLEW_NV_vertex_program1_1 = _glewSearchExtension("GL_NV_vertex_program1_1", extStart, extEnd); -#endif /* GL_NV_vertex_program1_1 */ -#ifdef GL_NV_vertex_program2 - GLEW_NV_vertex_program2 = _glewSearchExtension("GL_NV_vertex_program2", extStart, extEnd); -#endif /* GL_NV_vertex_program2 */ -#ifdef GL_NV_vertex_program2_option - GLEW_NV_vertex_program2_option = _glewSearchExtension("GL_NV_vertex_program2_option", extStart, extEnd); -#endif /* GL_NV_vertex_program2_option */ -#ifdef GL_NV_vertex_program3 - GLEW_NV_vertex_program3 = _glewSearchExtension("GL_NV_vertex_program3", extStart, extEnd); -#endif /* GL_NV_vertex_program3 */ -#ifdef GL_NV_vertex_program4 - GLEW_NV_vertex_program4 = _glewSearchExtension("GL_NV_gpu_program4", extStart, extEnd); -#endif /* GL_NV_vertex_program4 */ -#ifdef GL_NV_video_capture - GLEW_NV_video_capture = _glewSearchExtension("GL_NV_video_capture", extStart, extEnd); - if (glewExperimental || GLEW_NV_video_capture) GLEW_NV_video_capture = !_glewInit_GL_NV_video_capture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_video_capture */ -#ifdef GL_NV_viewport_array2 - GLEW_NV_viewport_array2 = _glewSearchExtension("GL_NV_viewport_array2", extStart, extEnd); -#endif /* GL_NV_viewport_array2 */ -#ifdef GL_OES_byte_coordinates - GLEW_OES_byte_coordinates = _glewSearchExtension("GL_OES_byte_coordinates", extStart, extEnd); -#endif /* GL_OES_byte_coordinates */ -#ifdef GL_OES_compressed_paletted_texture - GLEW_OES_compressed_paletted_texture = _glewSearchExtension("GL_OES_compressed_paletted_texture", extStart, extEnd); -#endif /* GL_OES_compressed_paletted_texture */ -#ifdef GL_OES_read_format - GLEW_OES_read_format = _glewSearchExtension("GL_OES_read_format", extStart, extEnd); -#endif /* GL_OES_read_format */ -#ifdef GL_OES_single_precision - GLEW_OES_single_precision = _glewSearchExtension("GL_OES_single_precision", extStart, extEnd); - if (glewExperimental || GLEW_OES_single_precision) GLEW_OES_single_precision = !_glewInit_GL_OES_single_precision(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_OES_single_precision */ -#ifdef GL_OML_interlace - GLEW_OML_interlace = _glewSearchExtension("GL_OML_interlace", extStart, extEnd); -#endif /* GL_OML_interlace */ -#ifdef GL_OML_resample - GLEW_OML_resample = _glewSearchExtension("GL_OML_resample", extStart, extEnd); -#endif /* GL_OML_resample */ -#ifdef GL_OML_subsample - GLEW_OML_subsample = _glewSearchExtension("GL_OML_subsample", extStart, extEnd); -#endif /* GL_OML_subsample */ -#ifdef GL_OVR_multiview - GLEW_OVR_multiview = _glewSearchExtension("GL_OVR_multiview", extStart, extEnd); - if (glewExperimental || GLEW_OVR_multiview) GLEW_OVR_multiview = !_glewInit_GL_OVR_multiview(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_OVR_multiview */ -#ifdef GL_OVR_multiview2 - GLEW_OVR_multiview2 = _glewSearchExtension("GL_OVR_multiview2", extStart, extEnd); -#endif /* GL_OVR_multiview2 */ -#ifdef GL_PGI_misc_hints - GLEW_PGI_misc_hints = _glewSearchExtension("GL_PGI_misc_hints", extStart, extEnd); -#endif /* GL_PGI_misc_hints */ -#ifdef GL_PGI_vertex_hints - GLEW_PGI_vertex_hints = _glewSearchExtension("GL_PGI_vertex_hints", extStart, extEnd); -#endif /* GL_PGI_vertex_hints */ -#ifdef GL_REGAL_ES1_0_compatibility - GLEW_REGAL_ES1_0_compatibility = _glewSearchExtension("GL_REGAL_ES1_0_compatibility", extStart, extEnd); - if (glewExperimental || GLEW_REGAL_ES1_0_compatibility) GLEW_REGAL_ES1_0_compatibility = !_glewInit_GL_REGAL_ES1_0_compatibility(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_REGAL_ES1_0_compatibility */ -#ifdef GL_REGAL_ES1_1_compatibility - GLEW_REGAL_ES1_1_compatibility = _glewSearchExtension("GL_REGAL_ES1_1_compatibility", extStart, extEnd); - if (glewExperimental || GLEW_REGAL_ES1_1_compatibility) GLEW_REGAL_ES1_1_compatibility = !_glewInit_GL_REGAL_ES1_1_compatibility(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_REGAL_ES1_1_compatibility */ -#ifdef GL_REGAL_enable - GLEW_REGAL_enable = _glewSearchExtension("GL_REGAL_enable", extStart, extEnd); -#endif /* GL_REGAL_enable */ -#ifdef GL_REGAL_error_string - GLEW_REGAL_error_string = _glewSearchExtension("GL_REGAL_error_string", extStart, extEnd); - if (glewExperimental || GLEW_REGAL_error_string) GLEW_REGAL_error_string = !_glewInit_GL_REGAL_error_string(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_REGAL_error_string */ -#ifdef GL_REGAL_extension_query - GLEW_REGAL_extension_query = _glewSearchExtension("GL_REGAL_extension_query", extStart, extEnd); - if (glewExperimental || GLEW_REGAL_extension_query) GLEW_REGAL_extension_query = !_glewInit_GL_REGAL_extension_query(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_REGAL_extension_query */ -#ifdef GL_REGAL_log - GLEW_REGAL_log = _glewSearchExtension("GL_REGAL_log", extStart, extEnd); - if (glewExperimental || GLEW_REGAL_log) GLEW_REGAL_log = !_glewInit_GL_REGAL_log(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_REGAL_log */ -#ifdef GL_REGAL_proc_address - GLEW_REGAL_proc_address = _glewSearchExtension("GL_REGAL_proc_address", extStart, extEnd); - if (glewExperimental || GLEW_REGAL_proc_address) GLEW_REGAL_proc_address = !_glewInit_GL_REGAL_proc_address(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_REGAL_proc_address */ -#ifdef GL_REND_screen_coordinates - GLEW_REND_screen_coordinates = _glewSearchExtension("GL_REND_screen_coordinates", extStart, extEnd); -#endif /* GL_REND_screen_coordinates */ -#ifdef GL_S3_s3tc - GLEW_S3_s3tc = _glewSearchExtension("GL_S3_s3tc", extStart, extEnd); -#endif /* GL_S3_s3tc */ -#ifdef GL_SGIS_color_range - GLEW_SGIS_color_range = _glewSearchExtension("GL_SGIS_color_range", extStart, extEnd); -#endif /* GL_SGIS_color_range */ -#ifdef GL_SGIS_detail_texture - GLEW_SGIS_detail_texture = _glewSearchExtension("GL_SGIS_detail_texture", extStart, extEnd); - if (glewExperimental || GLEW_SGIS_detail_texture) GLEW_SGIS_detail_texture = !_glewInit_GL_SGIS_detail_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIS_detail_texture */ -#ifdef GL_SGIS_fog_function - GLEW_SGIS_fog_function = _glewSearchExtension("GL_SGIS_fog_function", extStart, extEnd); - if (glewExperimental || GLEW_SGIS_fog_function) GLEW_SGIS_fog_function = !_glewInit_GL_SGIS_fog_function(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIS_fog_function */ -#ifdef GL_SGIS_generate_mipmap - GLEW_SGIS_generate_mipmap = _glewSearchExtension("GL_SGIS_generate_mipmap", extStart, extEnd); -#endif /* GL_SGIS_generate_mipmap */ -#ifdef GL_SGIS_multisample - GLEW_SGIS_multisample = _glewSearchExtension("GL_SGIS_multisample", extStart, extEnd); - if (glewExperimental || GLEW_SGIS_multisample) GLEW_SGIS_multisample = !_glewInit_GL_SGIS_multisample(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIS_multisample */ -#ifdef GL_SGIS_pixel_texture - GLEW_SGIS_pixel_texture = _glewSearchExtension("GL_SGIS_pixel_texture", extStart, extEnd); -#endif /* GL_SGIS_pixel_texture */ -#ifdef GL_SGIS_point_line_texgen - GLEW_SGIS_point_line_texgen = _glewSearchExtension("GL_SGIS_point_line_texgen", extStart, extEnd); -#endif /* GL_SGIS_point_line_texgen */ -#ifdef GL_SGIS_sharpen_texture - GLEW_SGIS_sharpen_texture = _glewSearchExtension("GL_SGIS_sharpen_texture", extStart, extEnd); - if (glewExperimental || GLEW_SGIS_sharpen_texture) GLEW_SGIS_sharpen_texture = !_glewInit_GL_SGIS_sharpen_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIS_sharpen_texture */ -#ifdef GL_SGIS_texture4D - GLEW_SGIS_texture4D = _glewSearchExtension("GL_SGIS_texture4D", extStart, extEnd); - if (glewExperimental || GLEW_SGIS_texture4D) GLEW_SGIS_texture4D = !_glewInit_GL_SGIS_texture4D(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIS_texture4D */ -#ifdef GL_SGIS_texture_border_clamp - GLEW_SGIS_texture_border_clamp = _glewSearchExtension("GL_SGIS_texture_border_clamp", extStart, extEnd); -#endif /* GL_SGIS_texture_border_clamp */ -#ifdef GL_SGIS_texture_edge_clamp - GLEW_SGIS_texture_edge_clamp = _glewSearchExtension("GL_SGIS_texture_edge_clamp", extStart, extEnd); -#endif /* GL_SGIS_texture_edge_clamp */ -#ifdef GL_SGIS_texture_filter4 - GLEW_SGIS_texture_filter4 = _glewSearchExtension("GL_SGIS_texture_filter4", extStart, extEnd); - if (glewExperimental || GLEW_SGIS_texture_filter4) GLEW_SGIS_texture_filter4 = !_glewInit_GL_SGIS_texture_filter4(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIS_texture_filter4 */ -#ifdef GL_SGIS_texture_lod - GLEW_SGIS_texture_lod = _glewSearchExtension("GL_SGIS_texture_lod", extStart, extEnd); -#endif /* GL_SGIS_texture_lod */ -#ifdef GL_SGIS_texture_select - GLEW_SGIS_texture_select = _glewSearchExtension("GL_SGIS_texture_select", extStart, extEnd); -#endif /* GL_SGIS_texture_select */ -#ifdef GL_SGIX_async - GLEW_SGIX_async = _glewSearchExtension("GL_SGIX_async", extStart, extEnd); - if (glewExperimental || GLEW_SGIX_async) GLEW_SGIX_async = !_glewInit_GL_SGIX_async(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIX_async */ -#ifdef GL_SGIX_async_histogram - GLEW_SGIX_async_histogram = _glewSearchExtension("GL_SGIX_async_histogram", extStart, extEnd); -#endif /* GL_SGIX_async_histogram */ -#ifdef GL_SGIX_async_pixel - GLEW_SGIX_async_pixel = _glewSearchExtension("GL_SGIX_async_pixel", extStart, extEnd); -#endif /* GL_SGIX_async_pixel */ -#ifdef GL_SGIX_blend_alpha_minmax - GLEW_SGIX_blend_alpha_minmax = _glewSearchExtension("GL_SGIX_blend_alpha_minmax", extStart, extEnd); -#endif /* GL_SGIX_blend_alpha_minmax */ -#ifdef GL_SGIX_clipmap - GLEW_SGIX_clipmap = _glewSearchExtension("GL_SGIX_clipmap", extStart, extEnd); -#endif /* GL_SGIX_clipmap */ -#ifdef GL_SGIX_convolution_accuracy - GLEW_SGIX_convolution_accuracy = _glewSearchExtension("GL_SGIX_convolution_accuracy", extStart, extEnd); -#endif /* GL_SGIX_convolution_accuracy */ -#ifdef GL_SGIX_depth_texture - GLEW_SGIX_depth_texture = _glewSearchExtension("GL_SGIX_depth_texture", extStart, extEnd); -#endif /* GL_SGIX_depth_texture */ -#ifdef GL_SGIX_flush_raster - GLEW_SGIX_flush_raster = _glewSearchExtension("GL_SGIX_flush_raster", extStart, extEnd); - if (glewExperimental || GLEW_SGIX_flush_raster) GLEW_SGIX_flush_raster = !_glewInit_GL_SGIX_flush_raster(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIX_flush_raster */ -#ifdef GL_SGIX_fog_offset - GLEW_SGIX_fog_offset = _glewSearchExtension("GL_SGIX_fog_offset", extStart, extEnd); -#endif /* GL_SGIX_fog_offset */ -#ifdef GL_SGIX_fog_texture - GLEW_SGIX_fog_texture = _glewSearchExtension("GL_SGIX_fog_texture", extStart, extEnd); - if (glewExperimental || GLEW_SGIX_fog_texture) GLEW_SGIX_fog_texture = !_glewInit_GL_SGIX_fog_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIX_fog_texture */ -#ifdef GL_SGIX_fragment_specular_lighting - GLEW_SGIX_fragment_specular_lighting = _glewSearchExtension("GL_SGIX_fragment_specular_lighting", extStart, extEnd); - if (glewExperimental || GLEW_SGIX_fragment_specular_lighting) GLEW_SGIX_fragment_specular_lighting = !_glewInit_GL_SGIX_fragment_specular_lighting(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIX_fragment_specular_lighting */ -#ifdef GL_SGIX_framezoom - GLEW_SGIX_framezoom = _glewSearchExtension("GL_SGIX_framezoom", extStart, extEnd); - if (glewExperimental || GLEW_SGIX_framezoom) GLEW_SGIX_framezoom = !_glewInit_GL_SGIX_framezoom(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIX_framezoom */ -#ifdef GL_SGIX_interlace - GLEW_SGIX_interlace = _glewSearchExtension("GL_SGIX_interlace", extStart, extEnd); -#endif /* GL_SGIX_interlace */ -#ifdef GL_SGIX_ir_instrument1 - GLEW_SGIX_ir_instrument1 = _glewSearchExtension("GL_SGIX_ir_instrument1", extStart, extEnd); -#endif /* GL_SGIX_ir_instrument1 */ -#ifdef GL_SGIX_list_priority - GLEW_SGIX_list_priority = _glewSearchExtension("GL_SGIX_list_priority", extStart, extEnd); -#endif /* GL_SGIX_list_priority */ -#ifdef GL_SGIX_pixel_texture - GLEW_SGIX_pixel_texture = _glewSearchExtension("GL_SGIX_pixel_texture", extStart, extEnd); - if (glewExperimental || GLEW_SGIX_pixel_texture) GLEW_SGIX_pixel_texture = !_glewInit_GL_SGIX_pixel_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIX_pixel_texture */ -#ifdef GL_SGIX_pixel_texture_bits - GLEW_SGIX_pixel_texture_bits = _glewSearchExtension("GL_SGIX_pixel_texture_bits", extStart, extEnd); -#endif /* GL_SGIX_pixel_texture_bits */ -#ifdef GL_SGIX_reference_plane - GLEW_SGIX_reference_plane = _glewSearchExtension("GL_SGIX_reference_plane", extStart, extEnd); - if (glewExperimental || GLEW_SGIX_reference_plane) GLEW_SGIX_reference_plane = !_glewInit_GL_SGIX_reference_plane(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIX_reference_plane */ -#ifdef GL_SGIX_resample - GLEW_SGIX_resample = _glewSearchExtension("GL_SGIX_resample", extStart, extEnd); -#endif /* GL_SGIX_resample */ -#ifdef GL_SGIX_shadow - GLEW_SGIX_shadow = _glewSearchExtension("GL_SGIX_shadow", extStart, extEnd); -#endif /* GL_SGIX_shadow */ -#ifdef GL_SGIX_shadow_ambient - GLEW_SGIX_shadow_ambient = _glewSearchExtension("GL_SGIX_shadow_ambient", extStart, extEnd); -#endif /* GL_SGIX_shadow_ambient */ -#ifdef GL_SGIX_sprite - GLEW_SGIX_sprite = _glewSearchExtension("GL_SGIX_sprite", extStart, extEnd); - if (glewExperimental || GLEW_SGIX_sprite) GLEW_SGIX_sprite = !_glewInit_GL_SGIX_sprite(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIX_sprite */ -#ifdef GL_SGIX_tag_sample_buffer - GLEW_SGIX_tag_sample_buffer = _glewSearchExtension("GL_SGIX_tag_sample_buffer", extStart, extEnd); - if (glewExperimental || GLEW_SGIX_tag_sample_buffer) GLEW_SGIX_tag_sample_buffer = !_glewInit_GL_SGIX_tag_sample_buffer(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIX_tag_sample_buffer */ -#ifdef GL_SGIX_texture_add_env - GLEW_SGIX_texture_add_env = _glewSearchExtension("GL_SGIX_texture_add_env", extStart, extEnd); -#endif /* GL_SGIX_texture_add_env */ -#ifdef GL_SGIX_texture_coordinate_clamp - GLEW_SGIX_texture_coordinate_clamp = _glewSearchExtension("GL_SGIX_texture_coordinate_clamp", extStart, extEnd); -#endif /* GL_SGIX_texture_coordinate_clamp */ -#ifdef GL_SGIX_texture_lod_bias - GLEW_SGIX_texture_lod_bias = _glewSearchExtension("GL_SGIX_texture_lod_bias", extStart, extEnd); -#endif /* GL_SGIX_texture_lod_bias */ -#ifdef GL_SGIX_texture_multi_buffer - GLEW_SGIX_texture_multi_buffer = _glewSearchExtension("GL_SGIX_texture_multi_buffer", extStart, extEnd); -#endif /* GL_SGIX_texture_multi_buffer */ -#ifdef GL_SGIX_texture_range - GLEW_SGIX_texture_range = _glewSearchExtension("GL_SGIX_texture_range", extStart, extEnd); -#endif /* GL_SGIX_texture_range */ -#ifdef GL_SGIX_texture_scale_bias - GLEW_SGIX_texture_scale_bias = _glewSearchExtension("GL_SGIX_texture_scale_bias", extStart, extEnd); -#endif /* GL_SGIX_texture_scale_bias */ -#ifdef GL_SGIX_vertex_preclip - GLEW_SGIX_vertex_preclip = _glewSearchExtension("GL_SGIX_vertex_preclip", extStart, extEnd); -#endif /* GL_SGIX_vertex_preclip */ -#ifdef GL_SGIX_vertex_preclip_hint - GLEW_SGIX_vertex_preclip_hint = _glewSearchExtension("GL_SGIX_vertex_preclip_hint", extStart, extEnd); -#endif /* GL_SGIX_vertex_preclip_hint */ -#ifdef GL_SGIX_ycrcb - GLEW_SGIX_ycrcb = _glewSearchExtension("GL_SGIX_ycrcb", extStart, extEnd); -#endif /* GL_SGIX_ycrcb */ -#ifdef GL_SGI_color_matrix - GLEW_SGI_color_matrix = _glewSearchExtension("GL_SGI_color_matrix", extStart, extEnd); -#endif /* GL_SGI_color_matrix */ -#ifdef GL_SGI_color_table - GLEW_SGI_color_table = _glewSearchExtension("GL_SGI_color_table", extStart, extEnd); - if (glewExperimental || GLEW_SGI_color_table) GLEW_SGI_color_table = !_glewInit_GL_SGI_color_table(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGI_color_table */ -#ifdef GL_SGI_texture_color_table - GLEW_SGI_texture_color_table = _glewSearchExtension("GL_SGI_texture_color_table", extStart, extEnd); -#endif /* GL_SGI_texture_color_table */ -#ifdef GL_SUNX_constant_data - GLEW_SUNX_constant_data = _glewSearchExtension("GL_SUNX_constant_data", extStart, extEnd); - if (glewExperimental || GLEW_SUNX_constant_data) GLEW_SUNX_constant_data = !_glewInit_GL_SUNX_constant_data(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SUNX_constant_data */ -#ifdef GL_SUN_convolution_border_modes - GLEW_SUN_convolution_border_modes = _glewSearchExtension("GL_SUN_convolution_border_modes", extStart, extEnd); -#endif /* GL_SUN_convolution_border_modes */ -#ifdef GL_SUN_global_alpha - GLEW_SUN_global_alpha = _glewSearchExtension("GL_SUN_global_alpha", extStart, extEnd); - if (glewExperimental || GLEW_SUN_global_alpha) GLEW_SUN_global_alpha = !_glewInit_GL_SUN_global_alpha(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SUN_global_alpha */ -#ifdef GL_SUN_mesh_array - GLEW_SUN_mesh_array = _glewSearchExtension("GL_SUN_mesh_array", extStart, extEnd); -#endif /* GL_SUN_mesh_array */ -#ifdef GL_SUN_read_video_pixels - GLEW_SUN_read_video_pixels = _glewSearchExtension("GL_SUN_read_video_pixels", extStart, extEnd); - if (glewExperimental || GLEW_SUN_read_video_pixels) GLEW_SUN_read_video_pixels = !_glewInit_GL_SUN_read_video_pixels(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SUN_read_video_pixels */ -#ifdef GL_SUN_slice_accum - GLEW_SUN_slice_accum = _glewSearchExtension("GL_SUN_slice_accum", extStart, extEnd); -#endif /* GL_SUN_slice_accum */ -#ifdef GL_SUN_triangle_list - GLEW_SUN_triangle_list = _glewSearchExtension("GL_SUN_triangle_list", extStart, extEnd); - if (glewExperimental || GLEW_SUN_triangle_list) GLEW_SUN_triangle_list = !_glewInit_GL_SUN_triangle_list(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SUN_triangle_list */ -#ifdef GL_SUN_vertex - GLEW_SUN_vertex = _glewSearchExtension("GL_SUN_vertex", extStart, extEnd); - if (glewExperimental || GLEW_SUN_vertex) GLEW_SUN_vertex = !_glewInit_GL_SUN_vertex(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SUN_vertex */ -#ifdef GL_WIN_phong_shading - GLEW_WIN_phong_shading = _glewSearchExtension("GL_WIN_phong_shading", extStart, extEnd); -#endif /* GL_WIN_phong_shading */ -#ifdef GL_WIN_specular_fog - GLEW_WIN_specular_fog = _glewSearchExtension("GL_WIN_specular_fog", extStart, extEnd); -#endif /* GL_WIN_specular_fog */ -#ifdef GL_WIN_swap_hint - GLEW_WIN_swap_hint = _glewSearchExtension("GL_WIN_swap_hint", extStart, extEnd); - if (glewExperimental || GLEW_WIN_swap_hint) GLEW_WIN_swap_hint = !_glewInit_GL_WIN_swap_hint(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_WIN_swap_hint */ - - return GLEW_OK; -} - - -#if defined(_WIN32) - -#if !defined(GLEW_MX) - -PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL = NULL; - -PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD = NULL; -PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD = NULL; -PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD = NULL; -PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD = NULL; -PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD = NULL; -PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD = NULL; -PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD = NULL; -PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD = NULL; -PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD = NULL; - -PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB = NULL; -PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB = NULL; -PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB = NULL; -PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB = NULL; - -PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB = NULL; - -PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB = NULL; - -PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB = NULL; -PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB = NULL; - -PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB = NULL; -PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB = NULL; -PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB = NULL; -PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB = NULL; -PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB = NULL; - -PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB = NULL; -PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB = NULL; -PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB = NULL; - -PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB = NULL; -PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB = NULL; -PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB = NULL; - -PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT = NULL; -PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT = NULL; -PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT = NULL; -PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT = NULL; - -PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT = NULL; - -PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT = NULL; -PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT = NULL; - -PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT = NULL; -PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT = NULL; -PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT = NULL; -PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT = NULL; -PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT = NULL; - -PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT = NULL; -PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT = NULL; -PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT = NULL; - -PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT = NULL; -PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT = NULL; - -PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D = NULL; -PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D = NULL; - -PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D = NULL; -PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D = NULL; -PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D = NULL; -PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D = NULL; - -PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D = NULL; -PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D = NULL; -PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D = NULL; -PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D = NULL; -PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D = NULL; -PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D = NULL; -PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D = NULL; -PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D = NULL; -PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D = NULL; -PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D = NULL; -PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D = NULL; -PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D = NULL; - -PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D = NULL; -PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D = NULL; -PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D = NULL; -PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D = NULL; - -PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D = NULL; -PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D = NULL; -PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D = NULL; -PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D = NULL; - -PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D = NULL; -PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D = NULL; -PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D = NULL; -PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D = NULL; - -PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV = NULL; -PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV = NULL; -PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV = NULL; -PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV = NULL; -PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV = NULL; -PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV = NULL; -PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV = NULL; -PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV = NULL; - -PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV = NULL; - -PFNWGLDELAYBEFORESWAPNVPROC __wglewDelayBeforeSwapNV = NULL; - -PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV = NULL; -PFNWGLDELETEDCNVPROC __wglewDeleteDCNV = NULL; -PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV = NULL; -PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV = NULL; -PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV = NULL; - -PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV = NULL; -PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV = NULL; -PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV = NULL; - -PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV = NULL; -PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV = NULL; -PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV = NULL; -PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV = NULL; -PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV = NULL; -PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV = NULL; - -PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV = NULL; -PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV = NULL; - -PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV = NULL; -PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV = NULL; -PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV = NULL; -PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV = NULL; -PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV = NULL; - -PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV = NULL; -PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV = NULL; -PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV = NULL; -PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV = NULL; -PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV = NULL; -PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV = NULL; - -PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML = NULL; -PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML = NULL; -PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML = NULL; -PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML = NULL; -PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML = NULL; -PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML = NULL; -GLboolean __WGLEW_3DFX_multisample = GL_FALSE; -GLboolean __WGLEW_3DL_stereo_control = GL_FALSE; -GLboolean __WGLEW_AMD_gpu_association = GL_FALSE; -GLboolean __WGLEW_ARB_buffer_region = GL_FALSE; -GLboolean __WGLEW_ARB_context_flush_control = GL_FALSE; -GLboolean __WGLEW_ARB_create_context = GL_FALSE; -GLboolean __WGLEW_ARB_create_context_profile = GL_FALSE; -GLboolean __WGLEW_ARB_create_context_robustness = GL_FALSE; -GLboolean __WGLEW_ARB_extensions_string = GL_FALSE; -GLboolean __WGLEW_ARB_framebuffer_sRGB = GL_FALSE; -GLboolean __WGLEW_ARB_make_current_read = GL_FALSE; -GLboolean __WGLEW_ARB_multisample = GL_FALSE; -GLboolean __WGLEW_ARB_pbuffer = GL_FALSE; -GLboolean __WGLEW_ARB_pixel_format = GL_FALSE; -GLboolean __WGLEW_ARB_pixel_format_float = GL_FALSE; -GLboolean __WGLEW_ARB_render_texture = GL_FALSE; -GLboolean __WGLEW_ARB_robustness_application_isolation = GL_FALSE; -GLboolean __WGLEW_ARB_robustness_share_group_isolation = GL_FALSE; -GLboolean __WGLEW_ATI_pixel_format_float = GL_FALSE; -GLboolean __WGLEW_ATI_render_texture_rectangle = GL_FALSE; -GLboolean __WGLEW_EXT_create_context_es2_profile = GL_FALSE; -GLboolean __WGLEW_EXT_create_context_es_profile = GL_FALSE; -GLboolean __WGLEW_EXT_depth_float = GL_FALSE; -GLboolean __WGLEW_EXT_display_color_table = GL_FALSE; -GLboolean __WGLEW_EXT_extensions_string = GL_FALSE; -GLboolean __WGLEW_EXT_framebuffer_sRGB = GL_FALSE; -GLboolean __WGLEW_EXT_make_current_read = GL_FALSE; -GLboolean __WGLEW_EXT_multisample = GL_FALSE; -GLboolean __WGLEW_EXT_pbuffer = GL_FALSE; -GLboolean __WGLEW_EXT_pixel_format = GL_FALSE; -GLboolean __WGLEW_EXT_pixel_format_packed_float = GL_FALSE; -GLboolean __WGLEW_EXT_swap_control = GL_FALSE; -GLboolean __WGLEW_EXT_swap_control_tear = GL_FALSE; -GLboolean __WGLEW_I3D_digital_video_control = GL_FALSE; -GLboolean __WGLEW_I3D_gamma = GL_FALSE; -GLboolean __WGLEW_I3D_genlock = GL_FALSE; -GLboolean __WGLEW_I3D_image_buffer = GL_FALSE; -GLboolean __WGLEW_I3D_swap_frame_lock = GL_FALSE; -GLboolean __WGLEW_I3D_swap_frame_usage = GL_FALSE; -GLboolean __WGLEW_NV_DX_interop = GL_FALSE; -GLboolean __WGLEW_NV_DX_interop2 = GL_FALSE; -GLboolean __WGLEW_NV_copy_image = GL_FALSE; -GLboolean __WGLEW_NV_delay_before_swap = GL_FALSE; -GLboolean __WGLEW_NV_float_buffer = GL_FALSE; -GLboolean __WGLEW_NV_gpu_affinity = GL_FALSE; -GLboolean __WGLEW_NV_multisample_coverage = GL_FALSE; -GLboolean __WGLEW_NV_present_video = GL_FALSE; -GLboolean __WGLEW_NV_render_depth_texture = GL_FALSE; -GLboolean __WGLEW_NV_render_texture_rectangle = GL_FALSE; -GLboolean __WGLEW_NV_swap_group = GL_FALSE; -GLboolean __WGLEW_NV_vertex_array_range = GL_FALSE; -GLboolean __WGLEW_NV_video_capture = GL_FALSE; -GLboolean __WGLEW_NV_video_output = GL_FALSE; -GLboolean __WGLEW_OML_sync_control = GL_FALSE; - -#endif /* !GLEW_MX */ - -#ifdef WGL_3DL_stereo_control - -static GLboolean _glewInit_WGL_3DL_stereo_control (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglSetStereoEmitterState3DL = (PFNWGLSETSTEREOEMITTERSTATE3DLPROC)glewGetProcAddress((const GLubyte*)"wglSetStereoEmitterState3DL")) == NULL) || r; - - return r; -} - -#endif /* WGL_3DL_stereo_control */ - -#ifdef WGL_AMD_gpu_association - -static GLboolean _glewInit_WGL_AMD_gpu_association (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglBlitContextFramebufferAMD = (PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC)glewGetProcAddress((const GLubyte*)"wglBlitContextFramebufferAMD")) == NULL) || r; - r = ((wglCreateAssociatedContextAMD = (PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglCreateAssociatedContextAMD")) == NULL) || r; - r = ((wglCreateAssociatedContextAttribsAMD = (PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)glewGetProcAddress((const GLubyte*)"wglCreateAssociatedContextAttribsAMD")) == NULL) || r; - r = ((wglDeleteAssociatedContextAMD = (PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglDeleteAssociatedContextAMD")) == NULL) || r; - r = ((wglGetContextGPUIDAMD = (PFNWGLGETCONTEXTGPUIDAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetContextGPUIDAMD")) == NULL) || r; - r = ((wglGetCurrentAssociatedContextAMD = (PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentAssociatedContextAMD")) == NULL) || r; - r = ((wglGetGPUIDsAMD = (PFNWGLGETGPUIDSAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetGPUIDsAMD")) == NULL) || r; - r = ((wglGetGPUInfoAMD = (PFNWGLGETGPUINFOAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetGPUInfoAMD")) == NULL) || r; - r = ((wglMakeAssociatedContextCurrentAMD = (PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)glewGetProcAddress((const GLubyte*)"wglMakeAssociatedContextCurrentAMD")) == NULL) || r; - - return r; -} - -#endif /* WGL_AMD_gpu_association */ - -#ifdef WGL_ARB_buffer_region - -static GLboolean _glewInit_WGL_ARB_buffer_region (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglCreateBufferRegionARB = (PFNWGLCREATEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglCreateBufferRegionARB")) == NULL) || r; - r = ((wglDeleteBufferRegionARB = (PFNWGLDELETEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglDeleteBufferRegionARB")) == NULL) || r; - r = ((wglRestoreBufferRegionARB = (PFNWGLRESTOREBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglRestoreBufferRegionARB")) == NULL) || r; - r = ((wglSaveBufferRegionARB = (PFNWGLSAVEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglSaveBufferRegionARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_buffer_region */ - -#ifdef WGL_ARB_create_context - -static GLboolean _glewInit_WGL_ARB_create_context (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)glewGetProcAddress((const GLubyte*)"wglCreateContextAttribsARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_create_context */ - -#ifdef WGL_ARB_extensions_string - -static GLboolean _glewInit_WGL_ARB_extensions_string (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_extensions_string */ - -#ifdef WGL_ARB_make_current_read - -static GLboolean _glewInit_WGL_ARB_make_current_read (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglGetCurrentReadDCARB = (PFNWGLGETCURRENTREADDCARBPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentReadDCARB")) == NULL) || r; - r = ((wglMakeContextCurrentARB = (PFNWGLMAKECONTEXTCURRENTARBPROC)glewGetProcAddress((const GLubyte*)"wglMakeContextCurrentARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_make_current_read */ - -#ifdef WGL_ARB_pbuffer - -static GLboolean _glewInit_WGL_ARB_pbuffer (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglCreatePbufferARB = (PFNWGLCREATEPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglCreatePbufferARB")) == NULL) || r; - r = ((wglDestroyPbufferARB = (PFNWGLDESTROYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglDestroyPbufferARB")) == NULL) || r; - r = ((wglGetPbufferDCARB = (PFNWGLGETPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPbufferDCARB")) == NULL) || r; - r = ((wglQueryPbufferARB = (PFNWGLQUERYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglQueryPbufferARB")) == NULL) || r; - r = ((wglReleasePbufferDCARB = (PFNWGLRELEASEPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)"wglReleasePbufferDCARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_pbuffer */ - -#ifdef WGL_ARB_pixel_format - -static GLboolean _glewInit_WGL_ARB_pixel_format (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)glewGetProcAddress((const GLubyte*)"wglChoosePixelFormatARB")) == NULL) || r; - r = ((wglGetPixelFormatAttribfvARB = (PFNWGLGETPIXELFORMATATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribfvARB")) == NULL) || r; - r = ((wglGetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribivARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_pixel_format */ - -#ifdef WGL_ARB_render_texture - -static GLboolean _glewInit_WGL_ARB_render_texture (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglBindTexImageARB = (PFNWGLBINDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"wglBindTexImageARB")) == NULL) || r; - r = ((wglReleaseTexImageARB = (PFNWGLRELEASETEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"wglReleaseTexImageARB")) == NULL) || r; - r = ((wglSetPbufferAttribARB = (PFNWGLSETPBUFFERATTRIBARBPROC)glewGetProcAddress((const GLubyte*)"wglSetPbufferAttribARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_render_texture */ - -#ifdef WGL_EXT_display_color_table - -static GLboolean _glewInit_WGL_EXT_display_color_table (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglBindDisplayColorTableEXT = (PFNWGLBINDDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglBindDisplayColorTableEXT")) == NULL) || r; - r = ((wglCreateDisplayColorTableEXT = (PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglCreateDisplayColorTableEXT")) == NULL) || r; - r = ((wglDestroyDisplayColorTableEXT = (PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglDestroyDisplayColorTableEXT")) == NULL) || r; - r = ((wglLoadDisplayColorTableEXT = (PFNWGLLOADDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglLoadDisplayColorTableEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_display_color_table */ - -#ifdef WGL_EXT_extensions_string - -static GLboolean _glewInit_WGL_EXT_extensions_string (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_extensions_string */ - -#ifdef WGL_EXT_make_current_read - -static GLboolean _glewInit_WGL_EXT_make_current_read (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglGetCurrentReadDCEXT = (PFNWGLGETCURRENTREADDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentReadDCEXT")) == NULL) || r; - r = ((wglMakeContextCurrentEXT = (PFNWGLMAKECONTEXTCURRENTEXTPROC)glewGetProcAddress((const GLubyte*)"wglMakeContextCurrentEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_make_current_read */ - -#ifdef WGL_EXT_pbuffer - -static GLboolean _glewInit_WGL_EXT_pbuffer (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglCreatePbufferEXT = (PFNWGLCREATEPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglCreatePbufferEXT")) == NULL) || r; - r = ((wglDestroyPbufferEXT = (PFNWGLDESTROYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglDestroyPbufferEXT")) == NULL) || r; - r = ((wglGetPbufferDCEXT = (PFNWGLGETPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPbufferDCEXT")) == NULL) || r; - r = ((wglQueryPbufferEXT = (PFNWGLQUERYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglQueryPbufferEXT")) == NULL) || r; - r = ((wglReleasePbufferDCEXT = (PFNWGLRELEASEPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglReleasePbufferDCEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_pbuffer */ - -#ifdef WGL_EXT_pixel_format - -static GLboolean _glewInit_WGL_EXT_pixel_format (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglChoosePixelFormatEXT = (PFNWGLCHOOSEPIXELFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"wglChoosePixelFormatEXT")) == NULL) || r; - r = ((wglGetPixelFormatAttribfvEXT = (PFNWGLGETPIXELFORMATATTRIBFVEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribfvEXT")) == NULL) || r; - r = ((wglGetPixelFormatAttribivEXT = (PFNWGLGETPIXELFORMATATTRIBIVEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribivEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_pixel_format */ - -#ifdef WGL_EXT_swap_control - -static GLboolean _glewInit_WGL_EXT_swap_control (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetSwapIntervalEXT")) == NULL) || r; - r = ((wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"wglSwapIntervalEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_swap_control */ - -#ifdef WGL_I3D_digital_video_control - -static GLboolean _glewInit_WGL_I3D_digital_video_control (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglGetDigitalVideoParametersI3D = (PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetDigitalVideoParametersI3D")) == NULL) || r; - r = ((wglSetDigitalVideoParametersI3D = (PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetDigitalVideoParametersI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_digital_video_control */ - -#ifdef WGL_I3D_gamma - -static GLboolean _glewInit_WGL_I3D_gamma (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglGetGammaTableI3D = (PFNWGLGETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGammaTableI3D")) == NULL) || r; - r = ((wglGetGammaTableParametersI3D = (PFNWGLGETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGammaTableParametersI3D")) == NULL) || r; - r = ((wglSetGammaTableI3D = (PFNWGLSETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetGammaTableI3D")) == NULL) || r; - r = ((wglSetGammaTableParametersI3D = (PFNWGLSETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetGammaTableParametersI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_gamma */ - -#ifdef WGL_I3D_genlock - -static GLboolean _glewInit_WGL_I3D_genlock (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglDisableGenlockI3D = (PFNWGLDISABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglDisableGenlockI3D")) == NULL) || r; - r = ((wglEnableGenlockI3D = (PFNWGLENABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglEnableGenlockI3D")) == NULL) || r; - r = ((wglGenlockSampleRateI3D = (PFNWGLGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSampleRateI3D")) == NULL) || r; - r = ((wglGenlockSourceDelayI3D = (PFNWGLGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceDelayI3D")) == NULL) || r; - r = ((wglGenlockSourceEdgeI3D = (PFNWGLGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceEdgeI3D")) == NULL) || r; - r = ((wglGenlockSourceI3D = (PFNWGLGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceI3D")) == NULL) || r; - r = ((wglGetGenlockSampleRateI3D = (PFNWGLGETGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSampleRateI3D")) == NULL) || r; - r = ((wglGetGenlockSourceDelayI3D = (PFNWGLGETGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceDelayI3D")) == NULL) || r; - r = ((wglGetGenlockSourceEdgeI3D = (PFNWGLGETGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceEdgeI3D")) == NULL) || r; - r = ((wglGetGenlockSourceI3D = (PFNWGLGETGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceI3D")) == NULL) || r; - r = ((wglIsEnabledGenlockI3D = (PFNWGLISENABLEDGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglIsEnabledGenlockI3D")) == NULL) || r; - r = ((wglQueryGenlockMaxSourceDelayI3D = (PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryGenlockMaxSourceDelayI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_genlock */ - -#ifdef WGL_I3D_image_buffer - -static GLboolean _glewInit_WGL_I3D_image_buffer (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglAssociateImageBufferEventsI3D = (PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)"wglAssociateImageBufferEventsI3D")) == NULL) || r; - r = ((wglCreateImageBufferI3D = (PFNWGLCREATEIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)"wglCreateImageBufferI3D")) == NULL) || r; - r = ((wglDestroyImageBufferI3D = (PFNWGLDESTROYIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)"wglDestroyImageBufferI3D")) == NULL) || r; - r = ((wglReleaseImageBufferEventsI3D = (PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)"wglReleaseImageBufferEventsI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_image_buffer */ - -#ifdef WGL_I3D_swap_frame_lock - -static GLboolean _glewInit_WGL_I3D_swap_frame_lock (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglDisableFrameLockI3D = (PFNWGLDISABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglDisableFrameLockI3D")) == NULL) || r; - r = ((wglEnableFrameLockI3D = (PFNWGLENABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglEnableFrameLockI3D")) == NULL) || r; - r = ((wglIsEnabledFrameLockI3D = (PFNWGLISENABLEDFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglIsEnabledFrameLockI3D")) == NULL) || r; - r = ((wglQueryFrameLockMasterI3D = (PFNWGLQUERYFRAMELOCKMASTERI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameLockMasterI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_swap_frame_lock */ - -#ifdef WGL_I3D_swap_frame_usage - -static GLboolean _glewInit_WGL_I3D_swap_frame_usage (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglBeginFrameTrackingI3D = (PFNWGLBEGINFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglBeginFrameTrackingI3D")) == NULL) || r; - r = ((wglEndFrameTrackingI3D = (PFNWGLENDFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglEndFrameTrackingI3D")) == NULL) || r; - r = ((wglGetFrameUsageI3D = (PFNWGLGETFRAMEUSAGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetFrameUsageI3D")) == NULL) || r; - r = ((wglQueryFrameTrackingI3D = (PFNWGLQUERYFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameTrackingI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_swap_frame_usage */ - -#ifdef WGL_NV_DX_interop - -static GLboolean _glewInit_WGL_NV_DX_interop (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglDXCloseDeviceNV = (PFNWGLDXCLOSEDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglDXCloseDeviceNV")) == NULL) || r; - r = ((wglDXLockObjectsNV = (PFNWGLDXLOCKOBJECTSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXLockObjectsNV")) == NULL) || r; - r = ((wglDXObjectAccessNV = (PFNWGLDXOBJECTACCESSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXObjectAccessNV")) == NULL) || r; - r = ((wglDXOpenDeviceNV = (PFNWGLDXOPENDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglDXOpenDeviceNV")) == NULL) || r; - r = ((wglDXRegisterObjectNV = (PFNWGLDXREGISTEROBJECTNVPROC)glewGetProcAddress((const GLubyte*)"wglDXRegisterObjectNV")) == NULL) || r; - r = ((wglDXSetResourceShareHandleNV = (PFNWGLDXSETRESOURCESHAREHANDLENVPROC)glewGetProcAddress((const GLubyte*)"wglDXSetResourceShareHandleNV")) == NULL) || r; - r = ((wglDXUnlockObjectsNV = (PFNWGLDXUNLOCKOBJECTSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXUnlockObjectsNV")) == NULL) || r; - r = ((wglDXUnregisterObjectNV = (PFNWGLDXUNREGISTEROBJECTNVPROC)glewGetProcAddress((const GLubyte*)"wglDXUnregisterObjectNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_DX_interop */ - -#ifdef WGL_NV_copy_image - -static GLboolean _glewInit_WGL_NV_copy_image (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglCopyImageSubDataNV = (PFNWGLCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"wglCopyImageSubDataNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_copy_image */ - -#ifdef WGL_NV_delay_before_swap - -static GLboolean _glewInit_WGL_NV_delay_before_swap (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglDelayBeforeSwapNV = (PFNWGLDELAYBEFORESWAPNVPROC)glewGetProcAddress((const GLubyte*)"wglDelayBeforeSwapNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_delay_before_swap */ - -#ifdef WGL_NV_gpu_affinity - -static GLboolean _glewInit_WGL_NV_gpu_affinity (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglCreateAffinityDCNV = (PFNWGLCREATEAFFINITYDCNVPROC)glewGetProcAddress((const GLubyte*)"wglCreateAffinityDCNV")) == NULL) || r; - r = ((wglDeleteDCNV = (PFNWGLDELETEDCNVPROC)glewGetProcAddress((const GLubyte*)"wglDeleteDCNV")) == NULL) || r; - r = ((wglEnumGpuDevicesNV = (PFNWGLENUMGPUDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpuDevicesNV")) == NULL) || r; - r = ((wglEnumGpusFromAffinityDCNV = (PFNWGLENUMGPUSFROMAFFINITYDCNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpusFromAffinityDCNV")) == NULL) || r; - r = ((wglEnumGpusNV = (PFNWGLENUMGPUSNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpusNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_gpu_affinity */ - -#ifdef WGL_NV_present_video - -static GLboolean _glewInit_WGL_NV_present_video (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglBindVideoDeviceNV = (PFNWGLBINDVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoDeviceNV")) == NULL) || r; - r = ((wglEnumerateVideoDevicesNV = (PFNWGLENUMERATEVIDEODEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumerateVideoDevicesNV")) == NULL) || r; - r = ((wglQueryCurrentContextNV = (PFNWGLQUERYCURRENTCONTEXTNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryCurrentContextNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_present_video */ - -#ifdef WGL_NV_swap_group - -static GLboolean _glewInit_WGL_NV_swap_group (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglBindSwapBarrierNV = (PFNWGLBINDSWAPBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"wglBindSwapBarrierNV")) == NULL) || r; - r = ((wglJoinSwapGroupNV = (PFNWGLJOINSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"wglJoinSwapGroupNV")) == NULL) || r; - r = ((wglQueryFrameCountNV = (PFNWGLQUERYFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameCountNV")) == NULL) || r; - r = ((wglQueryMaxSwapGroupsNV = (PFNWGLQUERYMAXSWAPGROUPSNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryMaxSwapGroupsNV")) == NULL) || r; - r = ((wglQuerySwapGroupNV = (PFNWGLQUERYSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"wglQuerySwapGroupNV")) == NULL) || r; - r = ((wglResetFrameCountNV = (PFNWGLRESETFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"wglResetFrameCountNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_swap_group */ - -#ifdef WGL_NV_vertex_array_range - -static GLboolean _glewInit_WGL_NV_vertex_array_range (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglAllocateMemoryNV = (PFNWGLALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"wglAllocateMemoryNV")) == NULL) || r; - r = ((wglFreeMemoryNV = (PFNWGLFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"wglFreeMemoryNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_vertex_array_range */ - -#ifdef WGL_NV_video_capture - -static GLboolean _glewInit_WGL_NV_video_capture (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglBindVideoCaptureDeviceNV = (PFNWGLBINDVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoCaptureDeviceNV")) == NULL) || r; - r = ((wglEnumerateVideoCaptureDevicesNV = (PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumerateVideoCaptureDevicesNV")) == NULL) || r; - r = ((wglLockVideoCaptureDeviceNV = (PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglLockVideoCaptureDeviceNV")) == NULL) || r; - r = ((wglQueryVideoCaptureDeviceNV = (PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglQueryVideoCaptureDeviceNV")) == NULL) || r; - r = ((wglReleaseVideoCaptureDeviceNV = (PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoCaptureDeviceNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_video_capture */ - -#ifdef WGL_NV_video_output - -static GLboolean _glewInit_WGL_NV_video_output (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglBindVideoImageNV = (PFNWGLBINDVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoImageNV")) == NULL) || r; - r = ((wglGetVideoDeviceNV = (PFNWGLGETVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglGetVideoDeviceNV")) == NULL) || r; - r = ((wglGetVideoInfoNV = (PFNWGLGETVIDEOINFONVPROC)glewGetProcAddress((const GLubyte*)"wglGetVideoInfoNV")) == NULL) || r; - r = ((wglReleaseVideoDeviceNV = (PFNWGLRELEASEVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoDeviceNV")) == NULL) || r; - r = ((wglReleaseVideoImageNV = (PFNWGLRELEASEVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoImageNV")) == NULL) || r; - r = ((wglSendPbufferToVideoNV = (PFNWGLSENDPBUFFERTOVIDEONVPROC)glewGetProcAddress((const GLubyte*)"wglSendPbufferToVideoNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_video_output */ - -#ifdef WGL_OML_sync_control - -static GLboolean _glewInit_WGL_OML_sync_control (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglGetMscRateOML = (PFNWGLGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)"wglGetMscRateOML")) == NULL) || r; - r = ((wglGetSyncValuesOML = (PFNWGLGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)"wglGetSyncValuesOML")) == NULL) || r; - r = ((wglSwapBuffersMscOML = (PFNWGLSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglSwapBuffersMscOML")) == NULL) || r; - r = ((wglSwapLayerBuffersMscOML = (PFNWGLSWAPLAYERBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglSwapLayerBuffersMscOML")) == NULL) || r; - r = ((wglWaitForMscOML = (PFNWGLWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglWaitForMscOML")) == NULL) || r; - r = ((wglWaitForSbcOML = (PFNWGLWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)"wglWaitForSbcOML")) == NULL) || r; - - return r; -} - -#endif /* WGL_OML_sync_control */ - -/* ------------------------------------------------------------------------- */ - -static PFNWGLGETEXTENSIONSSTRINGARBPROC _wglewGetExtensionsStringARB = NULL; -static PFNWGLGETEXTENSIONSSTRINGEXTPROC _wglewGetExtensionsStringEXT = NULL; - -GLboolean GLEWAPIENTRY wglewGetExtension (const char* name) -{ - const GLubyte* start; - const GLubyte* end; - if (_wglewGetExtensionsStringARB == NULL) - if (_wglewGetExtensionsStringEXT == NULL) - return GL_FALSE; - else - start = (const GLubyte*)_wglewGetExtensionsStringEXT(); - else - start = (const GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC()); - if (start == 0) - return GL_FALSE; - end = start + _glewStrLen(start); - return _glewSearchExtension(name, start, end); -} - -#ifdef GLEW_MX -GLenum GLEWAPIENTRY wglewContextInit (WGLEW_CONTEXT_ARG_DEF_LIST) -#else -GLenum GLEWAPIENTRY wglewInit (WGLEW_CONTEXT_ARG_DEF_LIST) -#endif -{ - GLboolean crippled; - const GLubyte* extStart; - const GLubyte* extEnd; - /* find wgl extension string query functions */ - _wglewGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB"); - _wglewGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT"); - /* query wgl extension string */ - if (_wglewGetExtensionsStringARB == NULL) - if (_wglewGetExtensionsStringEXT == NULL) - extStart = (const GLubyte*)""; - else - extStart = (const GLubyte*)_wglewGetExtensionsStringEXT(); - else { - HDC dc = wglGetCurrentDC(); - extStart = (const GLubyte*)_wglewGetExtensionsStringARB(dc); - } - extEnd = extStart + _glewStrLen(extStart); - /* initialize extensions */ - crippled = _wglewGetExtensionsStringARB == NULL && _wglewGetExtensionsStringEXT == NULL; -#ifdef WGL_3DFX_multisample - WGLEW_3DFX_multisample = _glewSearchExtension("WGL_3DFX_multisample", extStart, extEnd); -#endif /* WGL_3DFX_multisample */ -#ifdef WGL_3DL_stereo_control - WGLEW_3DL_stereo_control = _glewSearchExtension("WGL_3DL_stereo_control", extStart, extEnd); - if (glewExperimental || WGLEW_3DL_stereo_control|| crippled) WGLEW_3DL_stereo_control= !_glewInit_WGL_3DL_stereo_control(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_3DL_stereo_control */ -#ifdef WGL_AMD_gpu_association - WGLEW_AMD_gpu_association = _glewSearchExtension("WGL_AMD_gpu_association", extStart, extEnd); - if (glewExperimental || WGLEW_AMD_gpu_association|| crippled) WGLEW_AMD_gpu_association= !_glewInit_WGL_AMD_gpu_association(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_AMD_gpu_association */ -#ifdef WGL_ARB_buffer_region - WGLEW_ARB_buffer_region = _glewSearchExtension("WGL_ARB_buffer_region", extStart, extEnd); - if (glewExperimental || WGLEW_ARB_buffer_region|| crippled) WGLEW_ARB_buffer_region= !_glewInit_WGL_ARB_buffer_region(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_ARB_buffer_region */ -#ifdef WGL_ARB_context_flush_control - WGLEW_ARB_context_flush_control = _glewSearchExtension("WGL_ARB_context_flush_control", extStart, extEnd); -#endif /* WGL_ARB_context_flush_control */ -#ifdef WGL_ARB_create_context - WGLEW_ARB_create_context = _glewSearchExtension("WGL_ARB_create_context", extStart, extEnd); - if (glewExperimental || WGLEW_ARB_create_context|| crippled) WGLEW_ARB_create_context= !_glewInit_WGL_ARB_create_context(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_ARB_create_context */ -#ifdef WGL_ARB_create_context_profile - WGLEW_ARB_create_context_profile = _glewSearchExtension("WGL_ARB_create_context_profile", extStart, extEnd); -#endif /* WGL_ARB_create_context_profile */ -#ifdef WGL_ARB_create_context_robustness - WGLEW_ARB_create_context_robustness = _glewSearchExtension("WGL_ARB_create_context_robustness", extStart, extEnd); -#endif /* WGL_ARB_create_context_robustness */ -#ifdef WGL_ARB_extensions_string - WGLEW_ARB_extensions_string = _glewSearchExtension("WGL_ARB_extensions_string", extStart, extEnd); - if (glewExperimental || WGLEW_ARB_extensions_string|| crippled) WGLEW_ARB_extensions_string= !_glewInit_WGL_ARB_extensions_string(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_ARB_extensions_string */ -#ifdef WGL_ARB_framebuffer_sRGB - WGLEW_ARB_framebuffer_sRGB = _glewSearchExtension("WGL_ARB_framebuffer_sRGB", extStart, extEnd); -#endif /* WGL_ARB_framebuffer_sRGB */ -#ifdef WGL_ARB_make_current_read - WGLEW_ARB_make_current_read = _glewSearchExtension("WGL_ARB_make_current_read", extStart, extEnd); - if (glewExperimental || WGLEW_ARB_make_current_read|| crippled) WGLEW_ARB_make_current_read= !_glewInit_WGL_ARB_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_ARB_make_current_read */ -#ifdef WGL_ARB_multisample - WGLEW_ARB_multisample = _glewSearchExtension("WGL_ARB_multisample", extStart, extEnd); -#endif /* WGL_ARB_multisample */ -#ifdef WGL_ARB_pbuffer - WGLEW_ARB_pbuffer = _glewSearchExtension("WGL_ARB_pbuffer", extStart, extEnd); - if (glewExperimental || WGLEW_ARB_pbuffer|| crippled) WGLEW_ARB_pbuffer= !_glewInit_WGL_ARB_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_ARB_pbuffer */ -#ifdef WGL_ARB_pixel_format - WGLEW_ARB_pixel_format = _glewSearchExtension("WGL_ARB_pixel_format", extStart, extEnd); - if (glewExperimental || WGLEW_ARB_pixel_format|| crippled) WGLEW_ARB_pixel_format= !_glewInit_WGL_ARB_pixel_format(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_ARB_pixel_format */ -#ifdef WGL_ARB_pixel_format_float - WGLEW_ARB_pixel_format_float = _glewSearchExtension("WGL_ARB_pixel_format_float", extStart, extEnd); -#endif /* WGL_ARB_pixel_format_float */ -#ifdef WGL_ARB_render_texture - WGLEW_ARB_render_texture = _glewSearchExtension("WGL_ARB_render_texture", extStart, extEnd); - if (glewExperimental || WGLEW_ARB_render_texture|| crippled) WGLEW_ARB_render_texture= !_glewInit_WGL_ARB_render_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_ARB_render_texture */ -#ifdef WGL_ARB_robustness_application_isolation - WGLEW_ARB_robustness_application_isolation = _glewSearchExtension("WGL_ARB_robustness_application_isolation", extStart, extEnd); -#endif /* WGL_ARB_robustness_application_isolation */ -#ifdef WGL_ARB_robustness_share_group_isolation - WGLEW_ARB_robustness_share_group_isolation = _glewSearchExtension("WGL_ARB_robustness_share_group_isolation", extStart, extEnd); -#endif /* WGL_ARB_robustness_share_group_isolation */ -#ifdef WGL_ATI_pixel_format_float - WGLEW_ATI_pixel_format_float = _glewSearchExtension("WGL_ATI_pixel_format_float", extStart, extEnd); -#endif /* WGL_ATI_pixel_format_float */ -#ifdef WGL_ATI_render_texture_rectangle - WGLEW_ATI_render_texture_rectangle = _glewSearchExtension("WGL_ATI_render_texture_rectangle", extStart, extEnd); -#endif /* WGL_ATI_render_texture_rectangle */ -#ifdef WGL_EXT_create_context_es2_profile - WGLEW_EXT_create_context_es2_profile = _glewSearchExtension("WGL_EXT_create_context_es2_profile", extStart, extEnd); -#endif /* WGL_EXT_create_context_es2_profile */ -#ifdef WGL_EXT_create_context_es_profile - WGLEW_EXT_create_context_es_profile = _glewSearchExtension("WGL_EXT_create_context_es_profile", extStart, extEnd); -#endif /* WGL_EXT_create_context_es_profile */ -#ifdef WGL_EXT_depth_float - WGLEW_EXT_depth_float = _glewSearchExtension("WGL_EXT_depth_float", extStart, extEnd); -#endif /* WGL_EXT_depth_float */ -#ifdef WGL_EXT_display_color_table - WGLEW_EXT_display_color_table = _glewSearchExtension("WGL_EXT_display_color_table", extStart, extEnd); - if (glewExperimental || WGLEW_EXT_display_color_table|| crippled) WGLEW_EXT_display_color_table= !_glewInit_WGL_EXT_display_color_table(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_EXT_display_color_table */ -#ifdef WGL_EXT_extensions_string - WGLEW_EXT_extensions_string = _glewSearchExtension("WGL_EXT_extensions_string", extStart, extEnd); - if (glewExperimental || WGLEW_EXT_extensions_string|| crippled) WGLEW_EXT_extensions_string= !_glewInit_WGL_EXT_extensions_string(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_EXT_extensions_string */ -#ifdef WGL_EXT_framebuffer_sRGB - WGLEW_EXT_framebuffer_sRGB = _glewSearchExtension("WGL_EXT_framebuffer_sRGB", extStart, extEnd); -#endif /* WGL_EXT_framebuffer_sRGB */ -#ifdef WGL_EXT_make_current_read - WGLEW_EXT_make_current_read = _glewSearchExtension("WGL_EXT_make_current_read", extStart, extEnd); - if (glewExperimental || WGLEW_EXT_make_current_read|| crippled) WGLEW_EXT_make_current_read= !_glewInit_WGL_EXT_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_EXT_make_current_read */ -#ifdef WGL_EXT_multisample - WGLEW_EXT_multisample = _glewSearchExtension("WGL_EXT_multisample", extStart, extEnd); -#endif /* WGL_EXT_multisample */ -#ifdef WGL_EXT_pbuffer - WGLEW_EXT_pbuffer = _glewSearchExtension("WGL_EXT_pbuffer", extStart, extEnd); - if (glewExperimental || WGLEW_EXT_pbuffer|| crippled) WGLEW_EXT_pbuffer= !_glewInit_WGL_EXT_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_EXT_pbuffer */ -#ifdef WGL_EXT_pixel_format - WGLEW_EXT_pixel_format = _glewSearchExtension("WGL_EXT_pixel_format", extStart, extEnd); - if (glewExperimental || WGLEW_EXT_pixel_format|| crippled) WGLEW_EXT_pixel_format= !_glewInit_WGL_EXT_pixel_format(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_EXT_pixel_format */ -#ifdef WGL_EXT_pixel_format_packed_float - WGLEW_EXT_pixel_format_packed_float = _glewSearchExtension("WGL_EXT_pixel_format_packed_float", extStart, extEnd); -#endif /* WGL_EXT_pixel_format_packed_float */ -#ifdef WGL_EXT_swap_control - WGLEW_EXT_swap_control = _glewSearchExtension("WGL_EXT_swap_control", extStart, extEnd); - if (glewExperimental || WGLEW_EXT_swap_control|| crippled) WGLEW_EXT_swap_control= !_glewInit_WGL_EXT_swap_control(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_EXT_swap_control */ -#ifdef WGL_EXT_swap_control_tear - WGLEW_EXT_swap_control_tear = _glewSearchExtension("WGL_EXT_swap_control_tear", extStart, extEnd); -#endif /* WGL_EXT_swap_control_tear */ -#ifdef WGL_I3D_digital_video_control - WGLEW_I3D_digital_video_control = _glewSearchExtension("WGL_I3D_digital_video_control", extStart, extEnd); - if (glewExperimental || WGLEW_I3D_digital_video_control|| crippled) WGLEW_I3D_digital_video_control= !_glewInit_WGL_I3D_digital_video_control(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_I3D_digital_video_control */ -#ifdef WGL_I3D_gamma - WGLEW_I3D_gamma = _glewSearchExtension("WGL_I3D_gamma", extStart, extEnd); - if (glewExperimental || WGLEW_I3D_gamma|| crippled) WGLEW_I3D_gamma= !_glewInit_WGL_I3D_gamma(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_I3D_gamma */ -#ifdef WGL_I3D_genlock - WGLEW_I3D_genlock = _glewSearchExtension("WGL_I3D_genlock", extStart, extEnd); - if (glewExperimental || WGLEW_I3D_genlock|| crippled) WGLEW_I3D_genlock= !_glewInit_WGL_I3D_genlock(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_I3D_genlock */ -#ifdef WGL_I3D_image_buffer - WGLEW_I3D_image_buffer = _glewSearchExtension("WGL_I3D_image_buffer", extStart, extEnd); - if (glewExperimental || WGLEW_I3D_image_buffer|| crippled) WGLEW_I3D_image_buffer= !_glewInit_WGL_I3D_image_buffer(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_I3D_image_buffer */ -#ifdef WGL_I3D_swap_frame_lock - WGLEW_I3D_swap_frame_lock = _glewSearchExtension("WGL_I3D_swap_frame_lock", extStart, extEnd); - if (glewExperimental || WGLEW_I3D_swap_frame_lock|| crippled) WGLEW_I3D_swap_frame_lock= !_glewInit_WGL_I3D_swap_frame_lock(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_I3D_swap_frame_lock */ -#ifdef WGL_I3D_swap_frame_usage - WGLEW_I3D_swap_frame_usage = _glewSearchExtension("WGL_I3D_swap_frame_usage", extStart, extEnd); - if (glewExperimental || WGLEW_I3D_swap_frame_usage|| crippled) WGLEW_I3D_swap_frame_usage= !_glewInit_WGL_I3D_swap_frame_usage(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_I3D_swap_frame_usage */ -#ifdef WGL_NV_DX_interop - WGLEW_NV_DX_interop = _glewSearchExtension("WGL_NV_DX_interop", extStart, extEnd); - if (glewExperimental || WGLEW_NV_DX_interop|| crippled) WGLEW_NV_DX_interop= !_glewInit_WGL_NV_DX_interop(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_NV_DX_interop */ -#ifdef WGL_NV_DX_interop2 - WGLEW_NV_DX_interop2 = _glewSearchExtension("WGL_NV_DX_interop2", extStart, extEnd); -#endif /* WGL_NV_DX_interop2 */ -#ifdef WGL_NV_copy_image - WGLEW_NV_copy_image = _glewSearchExtension("WGL_NV_copy_image", extStart, extEnd); - if (glewExperimental || WGLEW_NV_copy_image|| crippled) WGLEW_NV_copy_image= !_glewInit_WGL_NV_copy_image(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_NV_copy_image */ -#ifdef WGL_NV_delay_before_swap - WGLEW_NV_delay_before_swap = _glewSearchExtension("WGL_NV_delay_before_swap", extStart, extEnd); - if (glewExperimental || WGLEW_NV_delay_before_swap|| crippled) WGLEW_NV_delay_before_swap= !_glewInit_WGL_NV_delay_before_swap(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_NV_delay_before_swap */ -#ifdef WGL_NV_float_buffer - WGLEW_NV_float_buffer = _glewSearchExtension("WGL_NV_float_buffer", extStart, extEnd); -#endif /* WGL_NV_float_buffer */ -#ifdef WGL_NV_gpu_affinity - WGLEW_NV_gpu_affinity = _glewSearchExtension("WGL_NV_gpu_affinity", extStart, extEnd); - if (glewExperimental || WGLEW_NV_gpu_affinity|| crippled) WGLEW_NV_gpu_affinity= !_glewInit_WGL_NV_gpu_affinity(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_NV_gpu_affinity */ -#ifdef WGL_NV_multisample_coverage - WGLEW_NV_multisample_coverage = _glewSearchExtension("WGL_NV_multisample_coverage", extStart, extEnd); -#endif /* WGL_NV_multisample_coverage */ -#ifdef WGL_NV_present_video - WGLEW_NV_present_video = _glewSearchExtension("WGL_NV_present_video", extStart, extEnd); - if (glewExperimental || WGLEW_NV_present_video|| crippled) WGLEW_NV_present_video= !_glewInit_WGL_NV_present_video(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_NV_present_video */ -#ifdef WGL_NV_render_depth_texture - WGLEW_NV_render_depth_texture = _glewSearchExtension("WGL_NV_render_depth_texture", extStart, extEnd); -#endif /* WGL_NV_render_depth_texture */ -#ifdef WGL_NV_render_texture_rectangle - WGLEW_NV_render_texture_rectangle = _glewSearchExtension("WGL_NV_render_texture_rectangle", extStart, extEnd); -#endif /* WGL_NV_render_texture_rectangle */ -#ifdef WGL_NV_swap_group - WGLEW_NV_swap_group = _glewSearchExtension("WGL_NV_swap_group", extStart, extEnd); - if (glewExperimental || WGLEW_NV_swap_group|| crippled) WGLEW_NV_swap_group= !_glewInit_WGL_NV_swap_group(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_NV_swap_group */ -#ifdef WGL_NV_vertex_array_range - WGLEW_NV_vertex_array_range = _glewSearchExtension("WGL_NV_vertex_array_range", extStart, extEnd); - if (glewExperimental || WGLEW_NV_vertex_array_range|| crippled) WGLEW_NV_vertex_array_range= !_glewInit_WGL_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_NV_vertex_array_range */ -#ifdef WGL_NV_video_capture - WGLEW_NV_video_capture = _glewSearchExtension("WGL_NV_video_capture", extStart, extEnd); - if (glewExperimental || WGLEW_NV_video_capture|| crippled) WGLEW_NV_video_capture= !_glewInit_WGL_NV_video_capture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_NV_video_capture */ -#ifdef WGL_NV_video_output - WGLEW_NV_video_output = _glewSearchExtension("WGL_NV_video_output", extStart, extEnd); - if (glewExperimental || WGLEW_NV_video_output|| crippled) WGLEW_NV_video_output= !_glewInit_WGL_NV_video_output(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_NV_video_output */ -#ifdef WGL_OML_sync_control - WGLEW_OML_sync_control = _glewSearchExtension("WGL_OML_sync_control", extStart, extEnd); - if (glewExperimental || WGLEW_OML_sync_control|| crippled) WGLEW_OML_sync_control= !_glewInit_WGL_OML_sync_control(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_OML_sync_control */ - - return GLEW_OK; -} - -#elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) - -PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay = NULL; - -PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig = NULL; -PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext = NULL; -PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer = NULL; -PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap = NULL; -PFNGLXCREATEWINDOWPROC __glewXCreateWindow = NULL; -PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer = NULL; -PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap = NULL; -PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow = NULL; -PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable = NULL; -PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib = NULL; -PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs = NULL; -PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent = NULL; -PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig = NULL; -PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent = NULL; -PFNGLXQUERYCONTEXTPROC __glewXQueryContext = NULL; -PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable = NULL; -PFNGLXSELECTEVENTPROC __glewXSelectEvent = NULL; - -PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC __glewXBlitContextFramebufferAMD = NULL; -PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC __glewXCreateAssociatedContextAMD = NULL; -PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __glewXCreateAssociatedContextAttribsAMD = NULL; -PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC __glewXDeleteAssociatedContextAMD = NULL; -PFNGLXGETCONTEXTGPUIDAMDPROC __glewXGetContextGPUIDAMD = NULL; -PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC __glewXGetCurrentAssociatedContextAMD = NULL; -PFNGLXGETGPUIDSAMDPROC __glewXGetGPUIDsAMD = NULL; -PFNGLXGETGPUINFOAMDPROC __glewXGetGPUInfoAMD = NULL; -PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __glewXMakeAssociatedContextCurrentAMD = NULL; - -PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB = NULL; - -PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI = NULL; -PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI = NULL; -PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI = NULL; - -PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT = NULL; -PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT = NULL; -PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT = NULL; -PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT = NULL; - -PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT = NULL; - -PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT = NULL; -PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT = NULL; - -PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA = NULL; - -PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA = NULL; - -PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA = NULL; - -PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC __glewXQueryCurrentRendererIntegerMESA = NULL; -PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC __glewXQueryCurrentRendererStringMESA = NULL; -PFNGLXQUERYRENDERERINTEGERMESAPROC __glewXQueryRendererIntegerMESA = NULL; -PFNGLXQUERYRENDERERSTRINGMESAPROC __glewXQueryRendererStringMESA = NULL; - -PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA = NULL; - -PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA = NULL; - -PFNGLXGETSWAPINTERVALMESAPROC __glewXGetSwapIntervalMESA = NULL; -PFNGLXSWAPINTERVALMESAPROC __glewXSwapIntervalMESA = NULL; - -PFNGLXCOPYBUFFERSUBDATANVPROC __glewXCopyBufferSubDataNV = NULL; -PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC __glewXNamedCopyBufferSubDataNV = NULL; - -PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV = NULL; - -PFNGLXDELAYBEFORESWAPNVPROC __glewXDelayBeforeSwapNV = NULL; - -PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV = NULL; -PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV = NULL; - -PFNGLXBINDSWAPBARRIERNVPROC __glewXBindSwapBarrierNV = NULL; -PFNGLXJOINSWAPGROUPNVPROC __glewXJoinSwapGroupNV = NULL; -PFNGLXQUERYFRAMECOUNTNVPROC __glewXQueryFrameCountNV = NULL; -PFNGLXQUERYMAXSWAPGROUPSNVPROC __glewXQueryMaxSwapGroupsNV = NULL; -PFNGLXQUERYSWAPGROUPNVPROC __glewXQuerySwapGroupNV = NULL; -PFNGLXRESETFRAMECOUNTNVPROC __glewXResetFrameCountNV = NULL; - -PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV = NULL; -PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV = NULL; - -PFNGLXBINDVIDEOCAPTUREDEVICENVPROC __glewXBindVideoCaptureDeviceNV = NULL; -PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC __glewXEnumerateVideoCaptureDevicesNV = NULL; -PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC __glewXLockVideoCaptureDeviceNV = NULL; -PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC __glewXQueryVideoCaptureDeviceNV = NULL; -PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC __glewXReleaseVideoCaptureDeviceNV = NULL; - -PFNGLXBINDVIDEOIMAGENVPROC __glewXBindVideoImageNV = NULL; -PFNGLXGETVIDEODEVICENVPROC __glewXGetVideoDeviceNV = NULL; -PFNGLXGETVIDEOINFONVPROC __glewXGetVideoInfoNV = NULL; -PFNGLXRELEASEVIDEODEVICENVPROC __glewXReleaseVideoDeviceNV = NULL; -PFNGLXRELEASEVIDEOIMAGENVPROC __glewXReleaseVideoImageNV = NULL; -PFNGLXSENDPBUFFERTOVIDEONVPROC __glewXSendPbufferToVideoNV = NULL; - -PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML = NULL; -PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML = NULL; -PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML = NULL; -PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML = NULL; -PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML = NULL; - -PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX = NULL; -PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX = NULL; -PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX = NULL; -PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX = NULL; -PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX = NULL; -PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX = NULL; - -PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX = NULL; -PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX = NULL; -PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX = NULL; -PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX = NULL; -PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX = NULL; -PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX = NULL; -PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX = NULL; -PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX = NULL; - -PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX = NULL; -PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX = NULL; -PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX = NULL; -PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX = NULL; -PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX = NULL; - -PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX = NULL; -PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX = NULL; - -PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX = NULL; - -PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX = NULL; -PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX = NULL; -PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX = NULL; -PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX = NULL; -PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX = NULL; - -PFNGLXCUSHIONSGIPROC __glewXCushionSGI = NULL; - -PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI = NULL; -PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI = NULL; - -PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI = NULL; - -PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI = NULL; -PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI = NULL; - -PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN = NULL; - -PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN = NULL; -PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN = NULL; - -#if !defined(GLEW_MX) - -GLboolean __GLXEW_VERSION_1_0 = GL_FALSE; -GLboolean __GLXEW_VERSION_1_1 = GL_FALSE; -GLboolean __GLXEW_VERSION_1_2 = GL_FALSE; -GLboolean __GLXEW_VERSION_1_3 = GL_FALSE; -GLboolean __GLXEW_VERSION_1_4 = GL_FALSE; -GLboolean __GLXEW_3DFX_multisample = GL_FALSE; -GLboolean __GLXEW_AMD_gpu_association = GL_FALSE; -GLboolean __GLXEW_ARB_context_flush_control = GL_FALSE; -GLboolean __GLXEW_ARB_create_context = GL_FALSE; -GLboolean __GLXEW_ARB_create_context_profile = GL_FALSE; -GLboolean __GLXEW_ARB_create_context_robustness = GL_FALSE; -GLboolean __GLXEW_ARB_fbconfig_float = GL_FALSE; -GLboolean __GLXEW_ARB_framebuffer_sRGB = GL_FALSE; -GLboolean __GLXEW_ARB_get_proc_address = GL_FALSE; -GLboolean __GLXEW_ARB_multisample = GL_FALSE; -GLboolean __GLXEW_ARB_robustness_application_isolation = GL_FALSE; -GLboolean __GLXEW_ARB_robustness_share_group_isolation = GL_FALSE; -GLboolean __GLXEW_ARB_vertex_buffer_object = GL_FALSE; -GLboolean __GLXEW_ATI_pixel_format_float = GL_FALSE; -GLboolean __GLXEW_ATI_render_texture = GL_FALSE; -GLboolean __GLXEW_EXT_buffer_age = GL_FALSE; -GLboolean __GLXEW_EXT_create_context_es2_profile = GL_FALSE; -GLboolean __GLXEW_EXT_create_context_es_profile = GL_FALSE; -GLboolean __GLXEW_EXT_fbconfig_packed_float = GL_FALSE; -GLboolean __GLXEW_EXT_framebuffer_sRGB = GL_FALSE; -GLboolean __GLXEW_EXT_import_context = GL_FALSE; -GLboolean __GLXEW_EXT_scene_marker = GL_FALSE; -GLboolean __GLXEW_EXT_stereo_tree = GL_FALSE; -GLboolean __GLXEW_EXT_swap_control = GL_FALSE; -GLboolean __GLXEW_EXT_swap_control_tear = GL_FALSE; -GLboolean __GLXEW_EXT_texture_from_pixmap = GL_FALSE; -GLboolean __GLXEW_EXT_visual_info = GL_FALSE; -GLboolean __GLXEW_EXT_visual_rating = GL_FALSE; -GLboolean __GLXEW_INTEL_swap_event = GL_FALSE; -GLboolean __GLXEW_MESA_agp_offset = GL_FALSE; -GLboolean __GLXEW_MESA_copy_sub_buffer = GL_FALSE; -GLboolean __GLXEW_MESA_pixmap_colormap = GL_FALSE; -GLboolean __GLXEW_MESA_query_renderer = GL_FALSE; -GLboolean __GLXEW_MESA_release_buffers = GL_FALSE; -GLboolean __GLXEW_MESA_set_3dfx_mode = GL_FALSE; -GLboolean __GLXEW_MESA_swap_control = GL_FALSE; -GLboolean __GLXEW_NV_copy_buffer = GL_FALSE; -GLboolean __GLXEW_NV_copy_image = GL_FALSE; -GLboolean __GLXEW_NV_delay_before_swap = GL_FALSE; -GLboolean __GLXEW_NV_float_buffer = GL_FALSE; -GLboolean __GLXEW_NV_multisample_coverage = GL_FALSE; -GLboolean __GLXEW_NV_present_video = GL_FALSE; -GLboolean __GLXEW_NV_swap_group = GL_FALSE; -GLboolean __GLXEW_NV_vertex_array_range = GL_FALSE; -GLboolean __GLXEW_NV_video_capture = GL_FALSE; -GLboolean __GLXEW_NV_video_out = GL_FALSE; -GLboolean __GLXEW_OML_swap_method = GL_FALSE; -GLboolean __GLXEW_OML_sync_control = GL_FALSE; -GLboolean __GLXEW_SGIS_blended_overlay = GL_FALSE; -GLboolean __GLXEW_SGIS_color_range = GL_FALSE; -GLboolean __GLXEW_SGIS_multisample = GL_FALSE; -GLboolean __GLXEW_SGIS_shared_multisample = GL_FALSE; -GLboolean __GLXEW_SGIX_fbconfig = GL_FALSE; -GLboolean __GLXEW_SGIX_hyperpipe = GL_FALSE; -GLboolean __GLXEW_SGIX_pbuffer = GL_FALSE; -GLboolean __GLXEW_SGIX_swap_barrier = GL_FALSE; -GLboolean __GLXEW_SGIX_swap_group = GL_FALSE; -GLboolean __GLXEW_SGIX_video_resize = GL_FALSE; -GLboolean __GLXEW_SGIX_visual_select_group = GL_FALSE; -GLboolean __GLXEW_SGI_cushion = GL_FALSE; -GLboolean __GLXEW_SGI_make_current_read = GL_FALSE; -GLboolean __GLXEW_SGI_swap_control = GL_FALSE; -GLboolean __GLXEW_SGI_video_sync = GL_FALSE; -GLboolean __GLXEW_SUN_get_transparent_index = GL_FALSE; -GLboolean __GLXEW_SUN_video_resize = GL_FALSE; - -#endif /* !GLEW_MX */ - -#ifdef GLX_VERSION_1_2 - -static GLboolean _glewInit_GLX_VERSION_1_2 (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXGetCurrentDisplay = (PFNGLXGETCURRENTDISPLAYPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentDisplay")) == NULL) || r; - - return r; -} - -#endif /* GLX_VERSION_1_2 */ - -#ifdef GLX_VERSION_1_3 - -static GLboolean _glewInit_GLX_VERSION_1_3 (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXChooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC)glewGetProcAddress((const GLubyte*)"glXChooseFBConfig")) == NULL) || r; - r = ((glXCreateNewContext = (PFNGLXCREATENEWCONTEXTPROC)glewGetProcAddress((const GLubyte*)"glXCreateNewContext")) == NULL) || r; - r = ((glXCreatePbuffer = (PFNGLXCREATEPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glXCreatePbuffer")) == NULL) || r; - r = ((glXCreatePixmap = (PFNGLXCREATEPIXMAPPROC)glewGetProcAddress((const GLubyte*)"glXCreatePixmap")) == NULL) || r; - r = ((glXCreateWindow = (PFNGLXCREATEWINDOWPROC)glewGetProcAddress((const GLubyte*)"glXCreateWindow")) == NULL) || r; - r = ((glXDestroyPbuffer = (PFNGLXDESTROYPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glXDestroyPbuffer")) == NULL) || r; - r = ((glXDestroyPixmap = (PFNGLXDESTROYPIXMAPPROC)glewGetProcAddress((const GLubyte*)"glXDestroyPixmap")) == NULL) || r; - r = ((glXDestroyWindow = (PFNGLXDESTROYWINDOWPROC)glewGetProcAddress((const GLubyte*)"glXDestroyWindow")) == NULL) || r; - r = ((glXGetCurrentReadDrawable = (PFNGLXGETCURRENTREADDRAWABLEPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentReadDrawable")) == NULL) || r; - r = ((glXGetFBConfigAttrib = (PFNGLXGETFBCONFIGATTRIBPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigAttrib")) == NULL) || r; - r = ((glXGetFBConfigs = (PFNGLXGETFBCONFIGSPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigs")) == NULL) || r; - r = ((glXGetSelectedEvent = (PFNGLXGETSELECTEDEVENTPROC)glewGetProcAddress((const GLubyte*)"glXGetSelectedEvent")) == NULL) || r; - r = ((glXGetVisualFromFBConfig = (PFNGLXGETVISUALFROMFBCONFIGPROC)glewGetProcAddress((const GLubyte*)"glXGetVisualFromFBConfig")) == NULL) || r; - r = ((glXMakeContextCurrent = (PFNGLXMAKECONTEXTCURRENTPROC)glewGetProcAddress((const GLubyte*)"glXMakeContextCurrent")) == NULL) || r; - r = ((glXQueryContext = (PFNGLXQUERYCONTEXTPROC)glewGetProcAddress((const GLubyte*)"glXQueryContext")) == NULL) || r; - r = ((glXQueryDrawable = (PFNGLXQUERYDRAWABLEPROC)glewGetProcAddress((const GLubyte*)"glXQueryDrawable")) == NULL) || r; - r = ((glXSelectEvent = (PFNGLXSELECTEVENTPROC)glewGetProcAddress((const GLubyte*)"glXSelectEvent")) == NULL) || r; - - return r; -} - -#endif /* GLX_VERSION_1_3 */ - -#ifdef GLX_AMD_gpu_association - -static GLboolean _glewInit_GLX_AMD_gpu_association (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXBlitContextFramebufferAMD = (PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC)glewGetProcAddress((const GLubyte*)"glXBlitContextFramebufferAMD")) == NULL) || r; - r = ((glXCreateAssociatedContextAMD = (PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXCreateAssociatedContextAMD")) == NULL) || r; - r = ((glXCreateAssociatedContextAttribsAMD = (PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)glewGetProcAddress((const GLubyte*)"glXCreateAssociatedContextAttribsAMD")) == NULL) || r; - r = ((glXDeleteAssociatedContextAMD = (PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXDeleteAssociatedContextAMD")) == NULL) || r; - r = ((glXGetContextGPUIDAMD = (PFNGLXGETCONTEXTGPUIDAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetContextGPUIDAMD")) == NULL) || r; - r = ((glXGetCurrentAssociatedContextAMD = (PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentAssociatedContextAMD")) == NULL) || r; - r = ((glXGetGPUIDsAMD = (PFNGLXGETGPUIDSAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetGPUIDsAMD")) == NULL) || r; - r = ((glXGetGPUInfoAMD = (PFNGLXGETGPUINFOAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetGPUInfoAMD")) == NULL) || r; - r = ((glXMakeAssociatedContextCurrentAMD = (PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)glewGetProcAddress((const GLubyte*)"glXMakeAssociatedContextCurrentAMD")) == NULL) || r; - - return r; -} - -#endif /* GLX_AMD_gpu_association */ - -#ifdef GLX_ARB_create_context - -static GLboolean _glewInit_GLX_ARB_create_context (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)glewGetProcAddress((const GLubyte*)"glXCreateContextAttribsARB")) == NULL) || r; - - return r; -} - -#endif /* GLX_ARB_create_context */ - -#ifdef GLX_ATI_render_texture - -static GLboolean _glewInit_GLX_ATI_render_texture (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXBindTexImageATI = (PFNGLXBINDTEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)"glXBindTexImageATI")) == NULL) || r; - r = ((glXDrawableAttribATI = (PFNGLXDRAWABLEATTRIBATIPROC)glewGetProcAddress((const GLubyte*)"glXDrawableAttribATI")) == NULL) || r; - r = ((glXReleaseTexImageATI = (PFNGLXRELEASETEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)"glXReleaseTexImageATI")) == NULL) || r; - - return r; -} - -#endif /* GLX_ATI_render_texture */ - -#ifdef GLX_EXT_import_context - -static GLboolean _glewInit_GLX_EXT_import_context (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXFreeContextEXT = (PFNGLXFREECONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)"glXFreeContextEXT")) == NULL) || r; - r = ((glXGetContextIDEXT = (PFNGLXGETCONTEXTIDEXTPROC)glewGetProcAddress((const GLubyte*)"glXGetContextIDEXT")) == NULL) || r; - r = ((glXImportContextEXT = (PFNGLXIMPORTCONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)"glXImportContextEXT")) == NULL) || r; - r = ((glXQueryContextInfoEXT = (PFNGLXQUERYCONTEXTINFOEXTPROC)glewGetProcAddress((const GLubyte*)"glXQueryContextInfoEXT")) == NULL) || r; - - return r; -} - -#endif /* GLX_EXT_import_context */ - -#ifdef GLX_EXT_swap_control - -static GLboolean _glewInit_GLX_EXT_swap_control (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalEXT")) == NULL) || r; - - return r; -} - -#endif /* GLX_EXT_swap_control */ - -#ifdef GLX_EXT_texture_from_pixmap - -static GLboolean _glewInit_GLX_EXT_texture_from_pixmap (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXBindTexImageEXT = (PFNGLXBINDTEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glXBindTexImageEXT")) == NULL) || r; - r = ((glXReleaseTexImageEXT = (PFNGLXRELEASETEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glXReleaseTexImageEXT")) == NULL) || r; - - return r; -} - -#endif /* GLX_EXT_texture_from_pixmap */ - -#ifdef GLX_MESA_agp_offset - -static GLboolean _glewInit_GLX_MESA_agp_offset (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXGetAGPOffsetMESA = (PFNGLXGETAGPOFFSETMESAPROC)glewGetProcAddress((const GLubyte*)"glXGetAGPOffsetMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_agp_offset */ - -#ifdef GLX_MESA_copy_sub_buffer - -static GLboolean _glewInit_GLX_MESA_copy_sub_buffer (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXCopySubBufferMESA = (PFNGLXCOPYSUBBUFFERMESAPROC)glewGetProcAddress((const GLubyte*)"glXCopySubBufferMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_copy_sub_buffer */ - -#ifdef GLX_MESA_pixmap_colormap - -static GLboolean _glewInit_GLX_MESA_pixmap_colormap (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXCreateGLXPixmapMESA = (PFNGLXCREATEGLXPIXMAPMESAPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPixmapMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_pixmap_colormap */ - -#ifdef GLX_MESA_query_renderer - -static GLboolean _glewInit_GLX_MESA_query_renderer (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXQueryCurrentRendererIntegerMESA = (PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryCurrentRendererIntegerMESA")) == NULL) || r; - r = ((glXQueryCurrentRendererStringMESA = (PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryCurrentRendererStringMESA")) == NULL) || r; - r = ((glXQueryRendererIntegerMESA = (PFNGLXQUERYRENDERERINTEGERMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryRendererIntegerMESA")) == NULL) || r; - r = ((glXQueryRendererStringMESA = (PFNGLXQUERYRENDERERSTRINGMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryRendererStringMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_query_renderer */ - -#ifdef GLX_MESA_release_buffers - -static GLboolean _glewInit_GLX_MESA_release_buffers (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXReleaseBuffersMESA = (PFNGLXRELEASEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)"glXReleaseBuffersMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_release_buffers */ - -#ifdef GLX_MESA_set_3dfx_mode - -static GLboolean _glewInit_GLX_MESA_set_3dfx_mode (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXSet3DfxModeMESA = (PFNGLXSET3DFXMODEMESAPROC)glewGetProcAddress((const GLubyte*)"glXSet3DfxModeMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_set_3dfx_mode */ - -#ifdef GLX_MESA_swap_control - -static GLboolean _glewInit_GLX_MESA_swap_control (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXGetSwapIntervalMESA = (PFNGLXGETSWAPINTERVALMESAPROC)glewGetProcAddress((const GLubyte*)"glXGetSwapIntervalMESA")) == NULL) || r; - r = ((glXSwapIntervalMESA = (PFNGLXSWAPINTERVALMESAPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_swap_control */ - -#ifdef GLX_NV_copy_buffer - -static GLboolean _glewInit_GLX_NV_copy_buffer (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXCopyBufferSubDataNV = (PFNGLXCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXCopyBufferSubDataNV")) == NULL) || r; - r = ((glXNamedCopyBufferSubDataNV = (PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXNamedCopyBufferSubDataNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_copy_buffer */ - -#ifdef GLX_NV_copy_image - -static GLboolean _glewInit_GLX_NV_copy_image (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXCopyImageSubDataNV = (PFNGLXCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXCopyImageSubDataNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_copy_image */ - -#ifdef GLX_NV_delay_before_swap - -static GLboolean _glewInit_GLX_NV_delay_before_swap (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXDelayBeforeSwapNV = (PFNGLXDELAYBEFORESWAPNVPROC)glewGetProcAddress((const GLubyte*)"glXDelayBeforeSwapNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_delay_before_swap */ - -#ifdef GLX_NV_present_video - -static GLboolean _glewInit_GLX_NV_present_video (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXBindVideoDeviceNV = (PFNGLXBINDVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoDeviceNV")) == NULL) || r; - r = ((glXEnumerateVideoDevicesNV = (PFNGLXENUMERATEVIDEODEVICESNVPROC)glewGetProcAddress((const GLubyte*)"glXEnumerateVideoDevicesNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_present_video */ - -#ifdef GLX_NV_swap_group - -static GLboolean _glewInit_GLX_NV_swap_group (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXBindSwapBarrierNV = (PFNGLXBINDSWAPBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glXBindSwapBarrierNV")) == NULL) || r; - r = ((glXJoinSwapGroupNV = (PFNGLXJOINSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"glXJoinSwapGroupNV")) == NULL) || r; - r = ((glXQueryFrameCountNV = (PFNGLXQUERYFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glXQueryFrameCountNV")) == NULL) || r; - r = ((glXQueryMaxSwapGroupsNV = (PFNGLXQUERYMAXSWAPGROUPSNVPROC)glewGetProcAddress((const GLubyte*)"glXQueryMaxSwapGroupsNV")) == NULL) || r; - r = ((glXQuerySwapGroupNV = (PFNGLXQUERYSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"glXQuerySwapGroupNV")) == NULL) || r; - r = ((glXResetFrameCountNV = (PFNGLXRESETFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glXResetFrameCountNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_swap_group */ - -#ifdef GLX_NV_vertex_array_range - -static GLboolean _glewInit_GLX_NV_vertex_array_range (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXAllocateMemoryNV = (PFNGLXALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glXAllocateMemoryNV")) == NULL) || r; - r = ((glXFreeMemoryNV = (PFNGLXFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glXFreeMemoryNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_vertex_array_range */ - -#ifdef GLX_NV_video_capture - -static GLboolean _glewInit_GLX_NV_video_capture (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXBindVideoCaptureDeviceNV = (PFNGLXBINDVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoCaptureDeviceNV")) == NULL) || r; - r = ((glXEnumerateVideoCaptureDevicesNV = (PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"glXEnumerateVideoCaptureDevicesNV")) == NULL) || r; - r = ((glXLockVideoCaptureDeviceNV = (PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXLockVideoCaptureDeviceNV")) == NULL) || r; - r = ((glXQueryVideoCaptureDeviceNV = (PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXQueryVideoCaptureDeviceNV")) == NULL) || r; - r = ((glXReleaseVideoCaptureDeviceNV = (PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoCaptureDeviceNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_video_capture */ - -#ifdef GLX_NV_video_out - -static GLboolean _glewInit_GLX_NV_video_out (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXBindVideoImageNV = (PFNGLXBINDVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoImageNV")) == NULL) || r; - r = ((glXGetVideoDeviceNV = (PFNGLXGETVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoDeviceNV")) == NULL) || r; - r = ((glXGetVideoInfoNV = (PFNGLXGETVIDEOINFONVPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoInfoNV")) == NULL) || r; - r = ((glXReleaseVideoDeviceNV = (PFNGLXRELEASEVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoDeviceNV")) == NULL) || r; - r = ((glXReleaseVideoImageNV = (PFNGLXRELEASEVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoImageNV")) == NULL) || r; - r = ((glXSendPbufferToVideoNV = (PFNGLXSENDPBUFFERTOVIDEONVPROC)glewGetProcAddress((const GLubyte*)"glXSendPbufferToVideoNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_video_out */ - -#ifdef GLX_OML_sync_control - -static GLboolean _glewInit_GLX_OML_sync_control (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXGetMscRateOML = (PFNGLXGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)"glXGetMscRateOML")) == NULL) || r; - r = ((glXGetSyncValuesOML = (PFNGLXGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)"glXGetSyncValuesOML")) == NULL) || r; - r = ((glXSwapBuffersMscOML = (PFNGLXSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"glXSwapBuffersMscOML")) == NULL) || r; - r = ((glXWaitForMscOML = (PFNGLXWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)"glXWaitForMscOML")) == NULL) || r; - r = ((glXWaitForSbcOML = (PFNGLXWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)"glXWaitForSbcOML")) == NULL) || r; - - return r; -} - -#endif /* GLX_OML_sync_control */ - -#ifdef GLX_SGIX_fbconfig - -static GLboolean _glewInit_GLX_SGIX_fbconfig (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXChooseFBConfigSGIX = (PFNGLXCHOOSEFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChooseFBConfigSGIX")) == NULL) || r; - r = ((glXCreateContextWithConfigSGIX = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateContextWithConfigSGIX")) == NULL) || r; - r = ((glXCreateGLXPixmapWithConfigSGIX = (PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPixmapWithConfigSGIX")) == NULL) || r; - r = ((glXGetFBConfigAttribSGIX = (PFNGLXGETFBCONFIGATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigAttribSGIX")) == NULL) || r; - r = ((glXGetFBConfigFromVisualSGIX = (PFNGLXGETFBCONFIGFROMVISUALSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigFromVisualSGIX")) == NULL) || r; - r = ((glXGetVisualFromFBConfigSGIX = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetVisualFromFBConfigSGIX")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGIX_fbconfig */ - -#ifdef GLX_SGIX_hyperpipe - -static GLboolean _glewInit_GLX_SGIX_hyperpipe (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXBindHyperpipeSGIX = (PFNGLXBINDHYPERPIPESGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindHyperpipeSGIX")) == NULL) || r; - r = ((glXDestroyHyperpipeConfigSGIX = (PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXDestroyHyperpipeConfigSGIX")) == NULL) || r; - r = ((glXHyperpipeAttribSGIX = (PFNGLXHYPERPIPEATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXHyperpipeAttribSGIX")) == NULL) || r; - r = ((glXHyperpipeConfigSGIX = (PFNGLXHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXHyperpipeConfigSGIX")) == NULL) || r; - r = ((glXQueryHyperpipeAttribSGIX = (PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeAttribSGIX")) == NULL) || r; - r = ((glXQueryHyperpipeBestAttribSGIX = (PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeBestAttribSGIX")) == NULL) || r; - r = ((glXQueryHyperpipeConfigSGIX = (PFNGLXQUERYHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeConfigSGIX")) == NULL) || r; - r = ((glXQueryHyperpipeNetworkSGIX = (PFNGLXQUERYHYPERPIPENETWORKSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeNetworkSGIX")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGIX_hyperpipe */ - -#ifdef GLX_SGIX_pbuffer - -static GLboolean _glewInit_GLX_SGIX_pbuffer (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXCreateGLXPbufferSGIX = (PFNGLXCREATEGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPbufferSGIX")) == NULL) || r; - r = ((glXDestroyGLXPbufferSGIX = (PFNGLXDESTROYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXDestroyGLXPbufferSGIX")) == NULL) || r; - r = ((glXGetSelectedEventSGIX = (PFNGLXGETSELECTEDEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetSelectedEventSGIX")) == NULL) || r; - r = ((glXQueryGLXPbufferSGIX = (PFNGLXQUERYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryGLXPbufferSGIX")) == NULL) || r; - r = ((glXSelectEventSGIX = (PFNGLXSELECTEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXSelectEventSGIX")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGIX_pbuffer */ - -#ifdef GLX_SGIX_swap_barrier - -static GLboolean _glewInit_GLX_SGIX_swap_barrier (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXBindSwapBarrierSGIX = (PFNGLXBINDSWAPBARRIERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindSwapBarrierSGIX")) == NULL) || r; - r = ((glXQueryMaxSwapBarriersSGIX = (PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryMaxSwapBarriersSGIX")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGIX_swap_barrier */ - -#ifdef GLX_SGIX_swap_group - -static GLboolean _glewInit_GLX_SGIX_swap_group (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXJoinSwapGroupSGIX = (PFNGLXJOINSWAPGROUPSGIXPROC)glewGetProcAddress((const GLubyte*)"glXJoinSwapGroupSGIX")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGIX_swap_group */ - -#ifdef GLX_SGIX_video_resize - -static GLboolean _glewInit_GLX_SGIX_video_resize (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXBindChannelToWindowSGIX = (PFNGLXBINDCHANNELTOWINDOWSGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindChannelToWindowSGIX")) == NULL) || r; - r = ((glXChannelRectSGIX = (PFNGLXCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChannelRectSGIX")) == NULL) || r; - r = ((glXChannelRectSyncSGIX = (PFNGLXCHANNELRECTSYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChannelRectSyncSGIX")) == NULL) || r; - r = ((glXQueryChannelDeltasSGIX = (PFNGLXQUERYCHANNELDELTASSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryChannelDeltasSGIX")) == NULL) || r; - r = ((glXQueryChannelRectSGIX = (PFNGLXQUERYCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryChannelRectSGIX")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGIX_video_resize */ - -#ifdef GLX_SGI_cushion - -static GLboolean _glewInit_GLX_SGI_cushion (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXCushionSGI = (PFNGLXCUSHIONSGIPROC)glewGetProcAddress((const GLubyte*)"glXCushionSGI")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGI_cushion */ - -#ifdef GLX_SGI_make_current_read - -static GLboolean _glewInit_GLX_SGI_make_current_read (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXGetCurrentReadDrawableSGI = (PFNGLXGETCURRENTREADDRAWABLESGIPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentReadDrawableSGI")) == NULL) || r; - r = ((glXMakeCurrentReadSGI = (PFNGLXMAKECURRENTREADSGIPROC)glewGetProcAddress((const GLubyte*)"glXMakeCurrentReadSGI")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGI_make_current_read */ - -#ifdef GLX_SGI_swap_control - -static GLboolean _glewInit_GLX_SGI_swap_control (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXSwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalSGI")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGI_swap_control */ - -#ifdef GLX_SGI_video_sync - -static GLboolean _glewInit_GLX_SGI_video_sync (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXGetVideoSyncSGI = (PFNGLXGETVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoSyncSGI")) == NULL) || r; - r = ((glXWaitVideoSyncSGI = (PFNGLXWAITVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)"glXWaitVideoSyncSGI")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGI_video_sync */ - -#ifdef GLX_SUN_get_transparent_index - -static GLboolean _glewInit_GLX_SUN_get_transparent_index (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXGetTransparentIndexSUN = (PFNGLXGETTRANSPARENTINDEXSUNPROC)glewGetProcAddress((const GLubyte*)"glXGetTransparentIndexSUN")) == NULL) || r; - - return r; -} - -#endif /* GLX_SUN_get_transparent_index */ - -#ifdef GLX_SUN_video_resize - -static GLboolean _glewInit_GLX_SUN_video_resize (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXGetVideoResizeSUN = (PFNGLXGETVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoResizeSUN")) == NULL) || r; - r = ((glXVideoResizeSUN = (PFNGLXVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)"glXVideoResizeSUN")) == NULL) || r; - - return r; -} - -#endif /* GLX_SUN_video_resize */ - -/* ------------------------------------------------------------------------ */ - -GLboolean glxewGetExtension (const char* name) -{ - const GLubyte* start; - const GLubyte* end; - - if (glXGetCurrentDisplay == NULL) return GL_FALSE; - start = (const GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS); - if (0 == start) return GL_FALSE; - end = start + _glewStrLen(start); - return _glewSearchExtension(name, start, end); -} - -#ifdef GLEW_MX -GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST) -#else -GLenum glxewInit (GLXEW_CONTEXT_ARG_DEF_LIST) -#endif -{ - int major, minor; - const GLubyte* extStart; - const GLubyte* extEnd; - /* initialize core GLX 1.2 */ - if (_glewInit_GLX_VERSION_1_2(GLEW_CONTEXT_ARG_VAR_INIT)) return GLEW_ERROR_GLX_VERSION_11_ONLY; - /* initialize flags */ - GLXEW_VERSION_1_0 = GL_TRUE; - GLXEW_VERSION_1_1 = GL_TRUE; - GLXEW_VERSION_1_2 = GL_TRUE; - GLXEW_VERSION_1_3 = GL_TRUE; - GLXEW_VERSION_1_4 = GL_TRUE; - /* query GLX version */ - glXQueryVersion(glXGetCurrentDisplay(), &major, &minor); - if (major == 1 && minor <= 3) - { - switch (minor) - { - case 3: - GLXEW_VERSION_1_4 = GL_FALSE; - break; - case 2: - GLXEW_VERSION_1_4 = GL_FALSE; - GLXEW_VERSION_1_3 = GL_FALSE; - break; - default: - return GLEW_ERROR_GLX_VERSION_11_ONLY; - break; - } - } - /* query GLX extension string */ - extStart = 0; - if (glXGetCurrentDisplay != NULL) - extStart = (const GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS); - if (extStart == 0) - extStart = (const GLubyte *)""; - extEnd = extStart + _glewStrLen(extStart); - /* initialize extensions */ -#ifdef GLX_VERSION_1_3 - if (glewExperimental || GLXEW_VERSION_1_3) GLXEW_VERSION_1_3 = !_glewInit_GLX_VERSION_1_3(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_VERSION_1_3 */ -#ifdef GLX_3DFX_multisample - GLXEW_3DFX_multisample = _glewSearchExtension("GLX_3DFX_multisample", extStart, extEnd); -#endif /* GLX_3DFX_multisample */ -#ifdef GLX_AMD_gpu_association - GLXEW_AMD_gpu_association = _glewSearchExtension("GLX_AMD_gpu_association", extStart, extEnd); - if (glewExperimental || GLXEW_AMD_gpu_association) GLXEW_AMD_gpu_association = !_glewInit_GLX_AMD_gpu_association(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_AMD_gpu_association */ -#ifdef GLX_ARB_context_flush_control - GLXEW_ARB_context_flush_control = _glewSearchExtension("GLX_ARB_context_flush_control", extStart, extEnd); -#endif /* GLX_ARB_context_flush_control */ -#ifdef GLX_ARB_create_context - GLXEW_ARB_create_context = _glewSearchExtension("GLX_ARB_create_context", extStart, extEnd); - if (glewExperimental || GLXEW_ARB_create_context) GLXEW_ARB_create_context = !_glewInit_GLX_ARB_create_context(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_ARB_create_context */ -#ifdef GLX_ARB_create_context_profile - GLXEW_ARB_create_context_profile = _glewSearchExtension("GLX_ARB_create_context_profile", extStart, extEnd); -#endif /* GLX_ARB_create_context_profile */ -#ifdef GLX_ARB_create_context_robustness - GLXEW_ARB_create_context_robustness = _glewSearchExtension("GLX_ARB_create_context_robustness", extStart, extEnd); -#endif /* GLX_ARB_create_context_robustness */ -#ifdef GLX_ARB_fbconfig_float - GLXEW_ARB_fbconfig_float = _glewSearchExtension("GLX_ARB_fbconfig_float", extStart, extEnd); -#endif /* GLX_ARB_fbconfig_float */ -#ifdef GLX_ARB_framebuffer_sRGB - GLXEW_ARB_framebuffer_sRGB = _glewSearchExtension("GLX_ARB_framebuffer_sRGB", extStart, extEnd); -#endif /* GLX_ARB_framebuffer_sRGB */ -#ifdef GLX_ARB_get_proc_address - GLXEW_ARB_get_proc_address = _glewSearchExtension("GLX_ARB_get_proc_address", extStart, extEnd); -#endif /* GLX_ARB_get_proc_address */ -#ifdef GLX_ARB_multisample - GLXEW_ARB_multisample = _glewSearchExtension("GLX_ARB_multisample", extStart, extEnd); -#endif /* GLX_ARB_multisample */ -#ifdef GLX_ARB_robustness_application_isolation - GLXEW_ARB_robustness_application_isolation = _glewSearchExtension("GLX_ARB_robustness_application_isolation", extStart, extEnd); -#endif /* GLX_ARB_robustness_application_isolation */ -#ifdef GLX_ARB_robustness_share_group_isolation - GLXEW_ARB_robustness_share_group_isolation = _glewSearchExtension("GLX_ARB_robustness_share_group_isolation", extStart, extEnd); -#endif /* GLX_ARB_robustness_share_group_isolation */ -#ifdef GLX_ARB_vertex_buffer_object - GLXEW_ARB_vertex_buffer_object = _glewSearchExtension("GLX_ARB_vertex_buffer_object", extStart, extEnd); -#endif /* GLX_ARB_vertex_buffer_object */ -#ifdef GLX_ATI_pixel_format_float - GLXEW_ATI_pixel_format_float = _glewSearchExtension("GLX_ATI_pixel_format_float", extStart, extEnd); -#endif /* GLX_ATI_pixel_format_float */ -#ifdef GLX_ATI_render_texture - GLXEW_ATI_render_texture = _glewSearchExtension("GLX_ATI_render_texture", extStart, extEnd); - if (glewExperimental || GLXEW_ATI_render_texture) GLXEW_ATI_render_texture = !_glewInit_GLX_ATI_render_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_ATI_render_texture */ -#ifdef GLX_EXT_buffer_age - GLXEW_EXT_buffer_age = _glewSearchExtension("GLX_EXT_buffer_age", extStart, extEnd); -#endif /* GLX_EXT_buffer_age */ -#ifdef GLX_EXT_create_context_es2_profile - GLXEW_EXT_create_context_es2_profile = _glewSearchExtension("GLX_EXT_create_context_es2_profile", extStart, extEnd); -#endif /* GLX_EXT_create_context_es2_profile */ -#ifdef GLX_EXT_create_context_es_profile - GLXEW_EXT_create_context_es_profile = _glewSearchExtension("GLX_EXT_create_context_es_profile", extStart, extEnd); -#endif /* GLX_EXT_create_context_es_profile */ -#ifdef GLX_EXT_fbconfig_packed_float - GLXEW_EXT_fbconfig_packed_float = _glewSearchExtension("GLX_EXT_fbconfig_packed_float", extStart, extEnd); -#endif /* GLX_EXT_fbconfig_packed_float */ -#ifdef GLX_EXT_framebuffer_sRGB - GLXEW_EXT_framebuffer_sRGB = _glewSearchExtension("GLX_EXT_framebuffer_sRGB", extStart, extEnd); -#endif /* GLX_EXT_framebuffer_sRGB */ -#ifdef GLX_EXT_import_context - GLXEW_EXT_import_context = _glewSearchExtension("GLX_EXT_import_context", extStart, extEnd); - if (glewExperimental || GLXEW_EXT_import_context) GLXEW_EXT_import_context = !_glewInit_GLX_EXT_import_context(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_EXT_import_context */ -#ifdef GLX_EXT_scene_marker - GLXEW_EXT_scene_marker = _glewSearchExtension("GLX_EXT_scene_marker", extStart, extEnd); -#endif /* GLX_EXT_scene_marker */ -#ifdef GLX_EXT_stereo_tree - GLXEW_EXT_stereo_tree = _glewSearchExtension("GLX_EXT_stereo_tree", extStart, extEnd); -#endif /* GLX_EXT_stereo_tree */ -#ifdef GLX_EXT_swap_control - GLXEW_EXT_swap_control = _glewSearchExtension("GLX_EXT_swap_control", extStart, extEnd); - if (glewExperimental || GLXEW_EXT_swap_control) GLXEW_EXT_swap_control = !_glewInit_GLX_EXT_swap_control(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_EXT_swap_control */ -#ifdef GLX_EXT_swap_control_tear - GLXEW_EXT_swap_control_tear = _glewSearchExtension("GLX_EXT_swap_control_tear", extStart, extEnd); -#endif /* GLX_EXT_swap_control_tear */ -#ifdef GLX_EXT_texture_from_pixmap - GLXEW_EXT_texture_from_pixmap = _glewSearchExtension("GLX_EXT_texture_from_pixmap", extStart, extEnd); - if (glewExperimental || GLXEW_EXT_texture_from_pixmap) GLXEW_EXT_texture_from_pixmap = !_glewInit_GLX_EXT_texture_from_pixmap(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_EXT_texture_from_pixmap */ -#ifdef GLX_EXT_visual_info - GLXEW_EXT_visual_info = _glewSearchExtension("GLX_EXT_visual_info", extStart, extEnd); -#endif /* GLX_EXT_visual_info */ -#ifdef GLX_EXT_visual_rating - GLXEW_EXT_visual_rating = _glewSearchExtension("GLX_EXT_visual_rating", extStart, extEnd); -#endif /* GLX_EXT_visual_rating */ -#ifdef GLX_INTEL_swap_event - GLXEW_INTEL_swap_event = _glewSearchExtension("GLX_INTEL_swap_event", extStart, extEnd); -#endif /* GLX_INTEL_swap_event */ -#ifdef GLX_MESA_agp_offset - GLXEW_MESA_agp_offset = _glewSearchExtension("GLX_MESA_agp_offset", extStart, extEnd); - if (glewExperimental || GLXEW_MESA_agp_offset) GLXEW_MESA_agp_offset = !_glewInit_GLX_MESA_agp_offset(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_MESA_agp_offset */ -#ifdef GLX_MESA_copy_sub_buffer - GLXEW_MESA_copy_sub_buffer = _glewSearchExtension("GLX_MESA_copy_sub_buffer", extStart, extEnd); - if (glewExperimental || GLXEW_MESA_copy_sub_buffer) GLXEW_MESA_copy_sub_buffer = !_glewInit_GLX_MESA_copy_sub_buffer(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_MESA_copy_sub_buffer */ -#ifdef GLX_MESA_pixmap_colormap - GLXEW_MESA_pixmap_colormap = _glewSearchExtension("GLX_MESA_pixmap_colormap", extStart, extEnd); - if (glewExperimental || GLXEW_MESA_pixmap_colormap) GLXEW_MESA_pixmap_colormap = !_glewInit_GLX_MESA_pixmap_colormap(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_MESA_pixmap_colormap */ -#ifdef GLX_MESA_query_renderer - GLXEW_MESA_query_renderer = _glewSearchExtension("GLX_MESA_query_renderer", extStart, extEnd); - if (glewExperimental || GLXEW_MESA_query_renderer) GLXEW_MESA_query_renderer = !_glewInit_GLX_MESA_query_renderer(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_MESA_query_renderer */ -#ifdef GLX_MESA_release_buffers - GLXEW_MESA_release_buffers = _glewSearchExtension("GLX_MESA_release_buffers", extStart, extEnd); - if (glewExperimental || GLXEW_MESA_release_buffers) GLXEW_MESA_release_buffers = !_glewInit_GLX_MESA_release_buffers(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_MESA_release_buffers */ -#ifdef GLX_MESA_set_3dfx_mode - GLXEW_MESA_set_3dfx_mode = _glewSearchExtension("GLX_MESA_set_3dfx_mode", extStart, extEnd); - if (glewExperimental || GLXEW_MESA_set_3dfx_mode) GLXEW_MESA_set_3dfx_mode = !_glewInit_GLX_MESA_set_3dfx_mode(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_MESA_set_3dfx_mode */ -#ifdef GLX_MESA_swap_control - GLXEW_MESA_swap_control = _glewSearchExtension("GLX_MESA_swap_control", extStart, extEnd); - if (glewExperimental || GLXEW_MESA_swap_control) GLXEW_MESA_swap_control = !_glewInit_GLX_MESA_swap_control(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_MESA_swap_control */ -#ifdef GLX_NV_copy_buffer - GLXEW_NV_copy_buffer = _glewSearchExtension("GLX_NV_copy_buffer", extStart, extEnd); - if (glewExperimental || GLXEW_NV_copy_buffer) GLXEW_NV_copy_buffer = !_glewInit_GLX_NV_copy_buffer(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_NV_copy_buffer */ -#ifdef GLX_NV_copy_image - GLXEW_NV_copy_image = _glewSearchExtension("GLX_NV_copy_image", extStart, extEnd); - if (glewExperimental || GLXEW_NV_copy_image) GLXEW_NV_copy_image = !_glewInit_GLX_NV_copy_image(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_NV_copy_image */ -#ifdef GLX_NV_delay_before_swap - GLXEW_NV_delay_before_swap = _glewSearchExtension("GLX_NV_delay_before_swap", extStart, extEnd); - if (glewExperimental || GLXEW_NV_delay_before_swap) GLXEW_NV_delay_before_swap = !_glewInit_GLX_NV_delay_before_swap(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_NV_delay_before_swap */ -#ifdef GLX_NV_float_buffer - GLXEW_NV_float_buffer = _glewSearchExtension("GLX_NV_float_buffer", extStart, extEnd); -#endif /* GLX_NV_float_buffer */ -#ifdef GLX_NV_multisample_coverage - GLXEW_NV_multisample_coverage = _glewSearchExtension("GLX_NV_multisample_coverage", extStart, extEnd); -#endif /* GLX_NV_multisample_coverage */ -#ifdef GLX_NV_present_video - GLXEW_NV_present_video = _glewSearchExtension("GLX_NV_present_video", extStart, extEnd); - if (glewExperimental || GLXEW_NV_present_video) GLXEW_NV_present_video = !_glewInit_GLX_NV_present_video(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_NV_present_video */ -#ifdef GLX_NV_swap_group - GLXEW_NV_swap_group = _glewSearchExtension("GLX_NV_swap_group", extStart, extEnd); - if (glewExperimental || GLXEW_NV_swap_group) GLXEW_NV_swap_group = !_glewInit_GLX_NV_swap_group(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_NV_swap_group */ -#ifdef GLX_NV_vertex_array_range - GLXEW_NV_vertex_array_range = _glewSearchExtension("GLX_NV_vertex_array_range", extStart, extEnd); - if (glewExperimental || GLXEW_NV_vertex_array_range) GLXEW_NV_vertex_array_range = !_glewInit_GLX_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_NV_vertex_array_range */ -#ifdef GLX_NV_video_capture - GLXEW_NV_video_capture = _glewSearchExtension("GLX_NV_video_capture", extStart, extEnd); - if (glewExperimental || GLXEW_NV_video_capture) GLXEW_NV_video_capture = !_glewInit_GLX_NV_video_capture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_NV_video_capture */ -#ifdef GLX_NV_video_out - GLXEW_NV_video_out = _glewSearchExtension("GLX_NV_video_out", extStart, extEnd); - if (glewExperimental || GLXEW_NV_video_out) GLXEW_NV_video_out = !_glewInit_GLX_NV_video_out(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_NV_video_out */ -#ifdef GLX_OML_swap_method - GLXEW_OML_swap_method = _glewSearchExtension("GLX_OML_swap_method", extStart, extEnd); -#endif /* GLX_OML_swap_method */ -#ifdef GLX_OML_sync_control - GLXEW_OML_sync_control = _glewSearchExtension("GLX_OML_sync_control", extStart, extEnd); - if (glewExperimental || GLXEW_OML_sync_control) GLXEW_OML_sync_control = !_glewInit_GLX_OML_sync_control(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_OML_sync_control */ -#ifdef GLX_SGIS_blended_overlay - GLXEW_SGIS_blended_overlay = _glewSearchExtension("GLX_SGIS_blended_overlay", extStart, extEnd); -#endif /* GLX_SGIS_blended_overlay */ -#ifdef GLX_SGIS_color_range - GLXEW_SGIS_color_range = _glewSearchExtension("GLX_SGIS_color_range", extStart, extEnd); -#endif /* GLX_SGIS_color_range */ -#ifdef GLX_SGIS_multisample - GLXEW_SGIS_multisample = _glewSearchExtension("GLX_SGIS_multisample", extStart, extEnd); -#endif /* GLX_SGIS_multisample */ -#ifdef GLX_SGIS_shared_multisample - GLXEW_SGIS_shared_multisample = _glewSearchExtension("GLX_SGIS_shared_multisample", extStart, extEnd); -#endif /* GLX_SGIS_shared_multisample */ -#ifdef GLX_SGIX_fbconfig - GLXEW_SGIX_fbconfig = _glewSearchExtension("GLX_SGIX_fbconfig", extStart, extEnd); - if (glewExperimental || GLXEW_SGIX_fbconfig) GLXEW_SGIX_fbconfig = !_glewInit_GLX_SGIX_fbconfig(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_SGIX_fbconfig */ -#ifdef GLX_SGIX_hyperpipe - GLXEW_SGIX_hyperpipe = _glewSearchExtension("GLX_SGIX_hyperpipe", extStart, extEnd); - if (glewExperimental || GLXEW_SGIX_hyperpipe) GLXEW_SGIX_hyperpipe = !_glewInit_GLX_SGIX_hyperpipe(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_SGIX_hyperpipe */ -#ifdef GLX_SGIX_pbuffer - GLXEW_SGIX_pbuffer = _glewSearchExtension("GLX_SGIX_pbuffer", extStart, extEnd); - if (glewExperimental || GLXEW_SGIX_pbuffer) GLXEW_SGIX_pbuffer = !_glewInit_GLX_SGIX_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_SGIX_pbuffer */ -#ifdef GLX_SGIX_swap_barrier - GLXEW_SGIX_swap_barrier = _glewSearchExtension("GLX_SGIX_swap_barrier", extStart, extEnd); - if (glewExperimental || GLXEW_SGIX_swap_barrier) GLXEW_SGIX_swap_barrier = !_glewInit_GLX_SGIX_swap_barrier(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_SGIX_swap_barrier */ -#ifdef GLX_SGIX_swap_group - GLXEW_SGIX_swap_group = _glewSearchExtension("GLX_SGIX_swap_group", extStart, extEnd); - if (glewExperimental || GLXEW_SGIX_swap_group) GLXEW_SGIX_swap_group = !_glewInit_GLX_SGIX_swap_group(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_SGIX_swap_group */ -#ifdef GLX_SGIX_video_resize - GLXEW_SGIX_video_resize = _glewSearchExtension("GLX_SGIX_video_resize", extStart, extEnd); - if (glewExperimental || GLXEW_SGIX_video_resize) GLXEW_SGIX_video_resize = !_glewInit_GLX_SGIX_video_resize(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_SGIX_video_resize */ -#ifdef GLX_SGIX_visual_select_group - GLXEW_SGIX_visual_select_group = _glewSearchExtension("GLX_SGIX_visual_select_group", extStart, extEnd); -#endif /* GLX_SGIX_visual_select_group */ -#ifdef GLX_SGI_cushion - GLXEW_SGI_cushion = _glewSearchExtension("GLX_SGI_cushion", extStart, extEnd); - if (glewExperimental || GLXEW_SGI_cushion) GLXEW_SGI_cushion = !_glewInit_GLX_SGI_cushion(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_SGI_cushion */ -#ifdef GLX_SGI_make_current_read - GLXEW_SGI_make_current_read = _glewSearchExtension("GLX_SGI_make_current_read", extStart, extEnd); - if (glewExperimental || GLXEW_SGI_make_current_read) GLXEW_SGI_make_current_read = !_glewInit_GLX_SGI_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_SGI_make_current_read */ -#ifdef GLX_SGI_swap_control - GLXEW_SGI_swap_control = _glewSearchExtension("GLX_SGI_swap_control", extStart, extEnd); - if (glewExperimental || GLXEW_SGI_swap_control) GLXEW_SGI_swap_control = !_glewInit_GLX_SGI_swap_control(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_SGI_swap_control */ -#ifdef GLX_SGI_video_sync - GLXEW_SGI_video_sync = _glewSearchExtension("GLX_SGI_video_sync", extStart, extEnd); - if (glewExperimental || GLXEW_SGI_video_sync) GLXEW_SGI_video_sync = !_glewInit_GLX_SGI_video_sync(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_SGI_video_sync */ -#ifdef GLX_SUN_get_transparent_index - GLXEW_SUN_get_transparent_index = _glewSearchExtension("GLX_SUN_get_transparent_index", extStart, extEnd); - if (glewExperimental || GLXEW_SUN_get_transparent_index) GLXEW_SUN_get_transparent_index = !_glewInit_GLX_SUN_get_transparent_index(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_SUN_get_transparent_index */ -#ifdef GLX_SUN_video_resize - GLXEW_SUN_video_resize = _glewSearchExtension("GLX_SUN_video_resize", extStart, extEnd); - if (glewExperimental || GLXEW_SUN_video_resize) GLXEW_SUN_video_resize = !_glewInit_GLX_SUN_video_resize(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_SUN_video_resize */ - - return GLEW_OK; -} - -#endif /* !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) */ - -/* ------------------------------------------------------------------------ */ - -const GLubyte * GLEWAPIENTRY glewGetErrorString (GLenum error) -{ - static const GLubyte* _glewErrorString[] = - { - (const GLubyte*)"No error", - (const GLubyte*)"Missing GL version", - (const GLubyte*)"GL 1.1 and up are not supported", - (const GLubyte*)"GLX 1.2 and up are not supported", - (const GLubyte*)"Unknown error" - }; - const size_t max_error = sizeof(_glewErrorString)/sizeof(*_glewErrorString) - 1; - return _glewErrorString[(size_t)error > max_error ? max_error : (size_t)error]; -} - -const GLubyte * GLEWAPIENTRY glewGetString (GLenum name) -{ - static const GLubyte* _glewString[] = - { - (const GLubyte*)NULL, - (const GLubyte*)"1.13.0", - (const GLubyte*)"1", - (const GLubyte*)"13", - (const GLubyte*)"0" - }; - const size_t max_string = sizeof(_glewString)/sizeof(*_glewString) - 1; - return _glewString[(size_t)name > max_string ? 0 : (size_t)name]; -} - -/* ------------------------------------------------------------------------ */ - -GLboolean glewExperimental = GL_FALSE; - -#if !defined(GLEW_MX) - -GLenum GLEWAPIENTRY glewInit (void) -{ - GLenum r; - r = glewContextInit(); - if ( r != 0 ) return r; -#if defined(_WIN32) - return wglewInit(); -#elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) /* _UNIX */ - return glxewInit(); -#else - return r; -#endif /* _WIN32 */ -} - -#endif /* !GLEW_MX */ -#ifdef GLEW_MX -GLboolean GLEWAPIENTRY glewContextIsSupported (const GLEWContext* ctx, const char* name) -#else -GLboolean GLEWAPIENTRY glewIsSupported (const char* name) -#endif -{ - const GLubyte* pos = (const GLubyte*)name; - GLuint len = _glewStrLen(pos); - GLboolean ret = GL_TRUE; - while (ret && len > 0) - { - if (_glewStrSame1(&pos, &len, (const GLubyte*)"GL_", 3)) - { - if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) - { -#ifdef GL_VERSION_1_2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) - { - ret = GLEW_VERSION_1_2; - continue; - } -#endif -#ifdef GL_VERSION_1_2_1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2_1", 5)) - { - ret = GLEW_VERSION_1_2_1; - continue; - } -#endif -#ifdef GL_VERSION_1_3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) - { - ret = GLEW_VERSION_1_3; - continue; - } -#endif -#ifdef GL_VERSION_1_4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) - { - ret = GLEW_VERSION_1_4; - continue; - } -#endif -#ifdef GL_VERSION_1_5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_5", 3)) - { - ret = GLEW_VERSION_1_5; - continue; - } -#endif -#ifdef GL_VERSION_2_0 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"2_0", 3)) - { - ret = GLEW_VERSION_2_0; - continue; - } -#endif -#ifdef GL_VERSION_2_1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"2_1", 3)) - { - ret = GLEW_VERSION_2_1; - continue; - } -#endif -#ifdef GL_VERSION_3_0 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_0", 3)) - { - ret = GLEW_VERSION_3_0; - continue; - } -#endif -#ifdef GL_VERSION_3_1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_1", 3)) - { - ret = GLEW_VERSION_3_1; - continue; - } -#endif -#ifdef GL_VERSION_3_2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_2", 3)) - { - ret = GLEW_VERSION_3_2; - continue; - } -#endif -#ifdef GL_VERSION_3_3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_3", 3)) - { - ret = GLEW_VERSION_3_3; - continue; - } -#endif -#ifdef GL_VERSION_4_0 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_0", 3)) - { - ret = GLEW_VERSION_4_0; - continue; - } -#endif -#ifdef GL_VERSION_4_1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_1", 3)) - { - ret = GLEW_VERSION_4_1; - continue; - } -#endif -#ifdef GL_VERSION_4_2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_2", 3)) - { - ret = GLEW_VERSION_4_2; - continue; - } -#endif -#ifdef GL_VERSION_4_3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_3", 3)) - { - ret = GLEW_VERSION_4_3; - continue; - } -#endif -#ifdef GL_VERSION_4_4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_4", 3)) - { - ret = GLEW_VERSION_4_4; - continue; - } -#endif -#ifdef GL_VERSION_4_5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_5", 3)) - { - ret = GLEW_VERSION_4_5; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) - { -#ifdef GL_3DFX_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLEW_3DFX_multisample; - continue; - } -#endif -#ifdef GL_3DFX_tbuffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"tbuffer", 7)) - { - ret = GLEW_3DFX_tbuffer; - continue; - } -#endif -#ifdef GL_3DFX_texture_compression_FXT1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_FXT1", 24)) - { - ret = GLEW_3DFX_texture_compression_FXT1; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) - { -#ifdef GL_AMD_blend_minmax_factor - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax_factor", 19)) - { - ret = GLEW_AMD_blend_minmax_factor; - continue; - } -#endif -#ifdef GL_AMD_conservative_depth - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18)) - { - ret = GLEW_AMD_conservative_depth; - continue; - } -#endif -#ifdef GL_AMD_debug_output - if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_output", 12)) - { - ret = GLEW_AMD_debug_output; - continue; - } -#endif -#ifdef GL_AMD_depth_clamp_separate - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp_separate", 20)) - { - ret = GLEW_AMD_depth_clamp_separate; - continue; - } -#endif -#ifdef GL_AMD_draw_buffers_blend - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_blend", 18)) - { - ret = GLEW_AMD_draw_buffers_blend; - continue; - } -#endif -#ifdef GL_AMD_gcn_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gcn_shader", 10)) - { - ret = GLEW_AMD_gcn_shader; - continue; - } -#endif -#ifdef GL_AMD_gpu_shader_int64 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_int64", 16)) - { - ret = GLEW_AMD_gpu_shader_int64; - continue; - } -#endif -#ifdef GL_AMD_interleaved_elements - if (_glewStrSame3(&pos, &len, (const GLubyte*)"interleaved_elements", 20)) - { - ret = GLEW_AMD_interleaved_elements; - continue; - } -#endif -#ifdef GL_AMD_multi_draw_indirect - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) - { - ret = GLEW_AMD_multi_draw_indirect; - continue; - } -#endif -#ifdef GL_AMD_name_gen_delete - if (_glewStrSame3(&pos, &len, (const GLubyte*)"name_gen_delete", 15)) - { - ret = GLEW_AMD_name_gen_delete; - continue; - } -#endif -#ifdef GL_AMD_occlusion_query_event - if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query_event", 21)) - { - ret = GLEW_AMD_occlusion_query_event; - continue; - } -#endif -#ifdef GL_AMD_performance_monitor - if (_glewStrSame3(&pos, &len, (const GLubyte*)"performance_monitor", 19)) - { - ret = GLEW_AMD_performance_monitor; - continue; - } -#endif -#ifdef GL_AMD_pinned_memory - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pinned_memory", 13)) - { - ret = GLEW_AMD_pinned_memory; - continue; - } -#endif -#ifdef GL_AMD_query_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_buffer_object", 19)) - { - ret = GLEW_AMD_query_buffer_object; - continue; - } -#endif -#ifdef GL_AMD_sample_positions - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_positions", 16)) - { - ret = GLEW_AMD_sample_positions; - continue; - } -#endif -#ifdef GL_AMD_seamless_cubemap_per_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cubemap_per_texture", 28)) - { - ret = GLEW_AMD_seamless_cubemap_per_texture; - continue; - } -#endif -#ifdef GL_AMD_shader_atomic_counter_ops - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counter_ops", 25)) - { - ret = GLEW_AMD_shader_atomic_counter_ops; - continue; - } -#endif -#ifdef GL_AMD_shader_stencil_export - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_export", 21)) - { - ret = GLEW_AMD_shader_stencil_export; - continue; - } -#endif -#ifdef GL_AMD_shader_stencil_value_export - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_value_export", 27)) - { - ret = GLEW_AMD_shader_stencil_value_export; - continue; - } -#endif -#ifdef GL_AMD_shader_trinary_minmax - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_trinary_minmax", 21)) - { - ret = GLEW_AMD_shader_trinary_minmax; - continue; - } -#endif -#ifdef GL_AMD_sparse_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14)) - { - ret = GLEW_AMD_sparse_texture; - continue; - } -#endif -#ifdef GL_AMD_stencil_operation_extended - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_operation_extended", 26)) - { - ret = GLEW_AMD_stencil_operation_extended; - continue; - } -#endif -#ifdef GL_AMD_texture_texture4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_texture4", 16)) - { - ret = GLEW_AMD_texture_texture4; - continue; - } -#endif -#ifdef GL_AMD_transform_feedback3_lines_triangles - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback3_lines_triangles", 35)) - { - ret = GLEW_AMD_transform_feedback3_lines_triangles; - continue; - } -#endif -#ifdef GL_AMD_transform_feedback4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback4", 19)) - { - ret = GLEW_AMD_transform_feedback4; - continue; - } -#endif -#ifdef GL_AMD_vertex_shader_layer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_layer", 19)) - { - ret = GLEW_AMD_vertex_shader_layer; - continue; - } -#endif -#ifdef GL_AMD_vertex_shader_tessellator - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_tessellator", 25)) - { - ret = GLEW_AMD_vertex_shader_tessellator; - continue; - } -#endif -#ifdef GL_AMD_vertex_shader_viewport_index - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_viewport_index", 28)) - { - ret = GLEW_AMD_vertex_shader_viewport_index; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ANGLE_", 6)) - { -#ifdef GL_ANGLE_depth_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) - { - ret = GLEW_ANGLE_depth_texture; - continue; - } -#endif -#ifdef GL_ANGLE_framebuffer_blit - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16)) - { - ret = GLEW_ANGLE_framebuffer_blit; - continue; - } -#endif -#ifdef GL_ANGLE_framebuffer_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) - { - ret = GLEW_ANGLE_framebuffer_multisample; - continue; - } -#endif -#ifdef GL_ANGLE_instanced_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) - { - ret = GLEW_ANGLE_instanced_arrays; - continue; - } -#endif -#ifdef GL_ANGLE_pack_reverse_row_order - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_reverse_row_order", 22)) - { - ret = GLEW_ANGLE_pack_reverse_row_order; - continue; - } -#endif -#ifdef GL_ANGLE_program_binary - if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_binary", 14)) - { - ret = GLEW_ANGLE_program_binary; - continue; - } -#endif -#ifdef GL_ANGLE_texture_compression_dxt1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt1", 24)) - { - ret = GLEW_ANGLE_texture_compression_dxt1; - continue; - } -#endif -#ifdef GL_ANGLE_texture_compression_dxt3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt3", 24)) - { - ret = GLEW_ANGLE_texture_compression_dxt3; - continue; - } -#endif -#ifdef GL_ANGLE_texture_compression_dxt5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt5", 24)) - { - ret = GLEW_ANGLE_texture_compression_dxt5; - continue; - } -#endif -#ifdef GL_ANGLE_texture_usage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_usage", 13)) - { - ret = GLEW_ANGLE_texture_usage; - continue; - } -#endif -#ifdef GL_ANGLE_timer_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) - { - ret = GLEW_ANGLE_timer_query; - continue; - } -#endif -#ifdef GL_ANGLE_translated_shader_source - if (_glewStrSame3(&pos, &len, (const GLubyte*)"translated_shader_source", 24)) - { - ret = GLEW_ANGLE_translated_shader_source; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"APPLE_", 6)) - { -#ifdef GL_APPLE_aux_depth_stencil - if (_glewStrSame3(&pos, &len, (const GLubyte*)"aux_depth_stencil", 17)) - { - ret = GLEW_APPLE_aux_depth_stencil; - continue; - } -#endif -#ifdef GL_APPLE_client_storage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"client_storage", 14)) - { - ret = GLEW_APPLE_client_storage; - continue; - } -#endif -#ifdef GL_APPLE_element_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"element_array", 13)) - { - ret = GLEW_APPLE_element_array; - continue; - } -#endif -#ifdef GL_APPLE_fence - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence", 5)) - { - ret = GLEW_APPLE_fence; - continue; - } -#endif -#ifdef GL_APPLE_float_pixels - if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_pixels", 12)) - { - ret = GLEW_APPLE_float_pixels; - continue; - } -#endif -#ifdef GL_APPLE_flush_buffer_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"flush_buffer_range", 18)) - { - ret = GLEW_APPLE_flush_buffer_range; - continue; - } -#endif -#ifdef GL_APPLE_object_purgeable - if (_glewStrSame3(&pos, &len, (const GLubyte*)"object_purgeable", 16)) - { - ret = GLEW_APPLE_object_purgeable; - continue; - } -#endif -#ifdef GL_APPLE_pixel_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer", 12)) - { - ret = GLEW_APPLE_pixel_buffer; - continue; - } -#endif -#ifdef GL_APPLE_rgb_422 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"rgb_422", 7)) - { - ret = GLEW_APPLE_rgb_422; - continue; - } -#endif -#ifdef GL_APPLE_row_bytes - if (_glewStrSame3(&pos, &len, (const GLubyte*)"row_bytes", 9)) - { - ret = GLEW_APPLE_row_bytes; - continue; - } -#endif -#ifdef GL_APPLE_specular_vector - if (_glewStrSame3(&pos, &len, (const GLubyte*)"specular_vector", 15)) - { - ret = GLEW_APPLE_specular_vector; - continue; - } -#endif -#ifdef GL_APPLE_texture_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_range", 13)) - { - ret = GLEW_APPLE_texture_range; - continue; - } -#endif -#ifdef GL_APPLE_transform_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_hint", 14)) - { - ret = GLEW_APPLE_transform_hint; - continue; - } -#endif -#ifdef GL_APPLE_vertex_array_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) - { - ret = GLEW_APPLE_vertex_array_object; - continue; - } -#endif -#ifdef GL_APPLE_vertex_array_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) - { - ret = GLEW_APPLE_vertex_array_range; - continue; - } -#endif -#ifdef GL_APPLE_vertex_program_evaluators - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program_evaluators", 25)) - { - ret = GLEW_APPLE_vertex_program_evaluators; - continue; - } -#endif -#ifdef GL_APPLE_ycbcr_422 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycbcr_422", 9)) - { - ret = GLEW_APPLE_ycbcr_422; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) - { -#ifdef GL_ARB_ES2_compatibility - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES2_compatibility", 17)) - { - ret = GLEW_ARB_ES2_compatibility; - continue; - } -#endif -#ifdef GL_ARB_ES3_1_compatibility - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_1_compatibility", 19)) - { - ret = GLEW_ARB_ES3_1_compatibility; - continue; - } -#endif -#ifdef GL_ARB_ES3_2_compatibility - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_2_compatibility", 19)) - { - ret = GLEW_ARB_ES3_2_compatibility; - continue; - } -#endif -#ifdef GL_ARB_ES3_compatibility - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_compatibility", 17)) - { - ret = GLEW_ARB_ES3_compatibility; - continue; - } -#endif -#ifdef GL_ARB_arrays_of_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"arrays_of_arrays", 16)) - { - ret = GLEW_ARB_arrays_of_arrays; - continue; - } -#endif -#ifdef GL_ARB_base_instance - if (_glewStrSame3(&pos, &len, (const GLubyte*)"base_instance", 13)) - { - ret = GLEW_ARB_base_instance; - continue; - } -#endif -#ifdef GL_ARB_bindless_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_texture", 16)) - { - ret = GLEW_ARB_bindless_texture; - continue; - } -#endif -#ifdef GL_ARB_blend_func_extended - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_extended", 19)) - { - ret = GLEW_ARB_blend_func_extended; - continue; - } -#endif -#ifdef GL_ARB_buffer_storage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_storage", 14)) - { - ret = GLEW_ARB_buffer_storage; - continue; - } -#endif -#ifdef GL_ARB_cl_event - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cl_event", 8)) - { - ret = GLEW_ARB_cl_event; - continue; - } -#endif -#ifdef GL_ARB_clear_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clear_buffer_object", 19)) - { - ret = GLEW_ARB_clear_buffer_object; - continue; - } -#endif -#ifdef GL_ARB_clear_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clear_texture", 13)) - { - ret = GLEW_ARB_clear_texture; - continue; - } -#endif -#ifdef GL_ARB_clip_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_control", 12)) - { - ret = GLEW_ARB_clip_control; - continue; - } -#endif -#ifdef GL_ARB_color_buffer_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_float", 18)) - { - ret = GLEW_ARB_color_buffer_float; - continue; - } -#endif -#ifdef GL_ARB_compatibility - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compatibility", 13)) - { - ret = GLEW_ARB_compatibility; - continue; - } -#endif -#ifdef GL_ARB_compressed_texture_pixel_storage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_texture_pixel_storage", 32)) - { - ret = GLEW_ARB_compressed_texture_pixel_storage; - continue; - } -#endif -#ifdef GL_ARB_compute_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_shader", 14)) - { - ret = GLEW_ARB_compute_shader; - continue; - } -#endif -#ifdef GL_ARB_compute_variable_group_size - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_variable_group_size", 27)) - { - ret = GLEW_ARB_compute_variable_group_size; - continue; - } -#endif -#ifdef GL_ARB_conditional_render_inverted - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render_inverted", 27)) - { - ret = GLEW_ARB_conditional_render_inverted; - continue; - } -#endif -#ifdef GL_ARB_conservative_depth - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18)) - { - ret = GLEW_ARB_conservative_depth; - continue; - } -#endif -#ifdef GL_ARB_copy_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_buffer", 11)) - { - ret = GLEW_ARB_copy_buffer; - continue; - } -#endif -#ifdef GL_ARB_copy_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) - { - ret = GLEW_ARB_copy_image; - continue; - } -#endif -#ifdef GL_ARB_cull_distance - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_distance", 13)) - { - ret = GLEW_ARB_cull_distance; - continue; - } -#endif -#ifdef GL_ARB_debug_output - if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_output", 12)) - { - ret = GLEW_ARB_debug_output; - continue; - } -#endif -#ifdef GL_ARB_depth_buffer_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_buffer_float", 18)) - { - ret = GLEW_ARB_depth_buffer_float; - continue; - } -#endif -#ifdef GL_ARB_depth_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp", 11)) - { - ret = GLEW_ARB_depth_clamp; - continue; - } -#endif -#ifdef GL_ARB_depth_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) - { - ret = GLEW_ARB_depth_texture; - continue; - } -#endif -#ifdef GL_ARB_derivative_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"derivative_control", 18)) - { - ret = GLEW_ARB_derivative_control; - continue; - } -#endif -#ifdef GL_ARB_direct_state_access - if (_glewStrSame3(&pos, &len, (const GLubyte*)"direct_state_access", 19)) - { - ret = GLEW_ARB_direct_state_access; - continue; - } -#endif -#ifdef GL_ARB_draw_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) - { - ret = GLEW_ARB_draw_buffers; - continue; - } -#endif -#ifdef GL_ARB_draw_buffers_blend - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_blend", 18)) - { - ret = GLEW_ARB_draw_buffers_blend; - continue; - } -#endif -#ifdef GL_ARB_draw_elements_base_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_elements_base_vertex", 25)) - { - ret = GLEW_ARB_draw_elements_base_vertex; - continue; - } -#endif -#ifdef GL_ARB_draw_indirect - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_indirect", 13)) - { - ret = GLEW_ARB_draw_indirect; - continue; - } -#endif -#ifdef GL_ARB_draw_instanced - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14)) - { - ret = GLEW_ARB_draw_instanced; - continue; - } -#endif -#ifdef GL_ARB_enhanced_layouts - if (_glewStrSame3(&pos, &len, (const GLubyte*)"enhanced_layouts", 16)) - { - ret = GLEW_ARB_enhanced_layouts; - continue; - } -#endif -#ifdef GL_ARB_explicit_attrib_location - if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_attrib_location", 24)) - { - ret = GLEW_ARB_explicit_attrib_location; - continue; - } -#endif -#ifdef GL_ARB_explicit_uniform_location - if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_uniform_location", 25)) - { - ret = GLEW_ARB_explicit_uniform_location; - continue; - } -#endif -#ifdef GL_ARB_fragment_coord_conventions - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_coord_conventions", 26)) - { - ret = GLEW_ARB_fragment_coord_conventions; - continue; - } -#endif -#ifdef GL_ARB_fragment_layer_viewport - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_layer_viewport", 23)) - { - ret = GLEW_ARB_fragment_layer_viewport; - continue; - } -#endif -#ifdef GL_ARB_fragment_program - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program", 16)) - { - ret = GLEW_ARB_fragment_program; - continue; - } -#endif -#ifdef GL_ARB_fragment_program_shadow - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program_shadow", 23)) - { - ret = GLEW_ARB_fragment_program_shadow; - continue; - } -#endif -#ifdef GL_ARB_fragment_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader", 15)) - { - ret = GLEW_ARB_fragment_shader; - continue; - } -#endif -#ifdef GL_ARB_fragment_shader_interlock - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_interlock", 25)) - { - ret = GLEW_ARB_fragment_shader_interlock; - continue; - } -#endif -#ifdef GL_ARB_framebuffer_no_attachments - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_no_attachments", 26)) - { - ret = GLEW_ARB_framebuffer_no_attachments; - continue; - } -#endif -#ifdef GL_ARB_framebuffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_object", 18)) - { - ret = GLEW_ARB_framebuffer_object; - continue; - } -#endif -#ifdef GL_ARB_framebuffer_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) - { - ret = GLEW_ARB_framebuffer_sRGB; - continue; - } -#endif -#ifdef GL_ARB_geometry_shader4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) - { - ret = GLEW_ARB_geometry_shader4; - continue; - } -#endif -#ifdef GL_ARB_get_program_binary - if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_program_binary", 18)) - { - ret = GLEW_ARB_get_program_binary; - continue; - } -#endif -#ifdef GL_ARB_get_texture_sub_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_texture_sub_image", 21)) - { - ret = GLEW_ARB_get_texture_sub_image; - continue; - } -#endif -#ifdef GL_ARB_gpu_shader5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11)) - { - ret = GLEW_ARB_gpu_shader5; - continue; - } -#endif -#ifdef GL_ARB_gpu_shader_fp64 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_fp64", 15)) - { - ret = GLEW_ARB_gpu_shader_fp64; - continue; - } -#endif -#ifdef GL_ARB_gpu_shader_int64 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_int64", 16)) - { - ret = GLEW_ARB_gpu_shader_int64; - continue; - } -#endif -#ifdef GL_ARB_half_float_pixel - if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float_pixel", 16)) - { - ret = GLEW_ARB_half_float_pixel; - continue; - } -#endif -#ifdef GL_ARB_half_float_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float_vertex", 17)) - { - ret = GLEW_ARB_half_float_vertex; - continue; - } -#endif -#ifdef GL_ARB_imaging - if (_glewStrSame3(&pos, &len, (const GLubyte*)"imaging", 7)) - { - ret = GLEW_ARB_imaging; - continue; - } -#endif -#ifdef GL_ARB_indirect_parameters - if (_glewStrSame3(&pos, &len, (const GLubyte*)"indirect_parameters", 19)) - { - ret = GLEW_ARB_indirect_parameters; - continue; - } -#endif -#ifdef GL_ARB_instanced_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) - { - ret = GLEW_ARB_instanced_arrays; - continue; - } -#endif -#ifdef GL_ARB_internalformat_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_query", 20)) - { - ret = GLEW_ARB_internalformat_query; - continue; - } -#endif -#ifdef GL_ARB_internalformat_query2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_query2", 21)) - { - ret = GLEW_ARB_internalformat_query2; - continue; - } -#endif -#ifdef GL_ARB_invalidate_subdata - if (_glewStrSame3(&pos, &len, (const GLubyte*)"invalidate_subdata", 18)) - { - ret = GLEW_ARB_invalidate_subdata; - continue; - } -#endif -#ifdef GL_ARB_map_buffer_alignment - if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_buffer_alignment", 20)) - { - ret = GLEW_ARB_map_buffer_alignment; - continue; - } -#endif -#ifdef GL_ARB_map_buffer_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_buffer_range", 16)) - { - ret = GLEW_ARB_map_buffer_range; - continue; - } -#endif -#ifdef GL_ARB_matrix_palette - if (_glewStrSame3(&pos, &len, (const GLubyte*)"matrix_palette", 14)) - { - ret = GLEW_ARB_matrix_palette; - continue; - } -#endif -#ifdef GL_ARB_multi_bind - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_bind", 10)) - { - ret = GLEW_ARB_multi_bind; - continue; - } -#endif -#ifdef GL_ARB_multi_draw_indirect - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) - { - ret = GLEW_ARB_multi_draw_indirect; - continue; - } -#endif -#ifdef GL_ARB_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLEW_ARB_multisample; - continue; - } -#endif -#ifdef GL_ARB_multitexture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multitexture", 12)) - { - ret = GLEW_ARB_multitexture; - continue; - } -#endif -#ifdef GL_ARB_occlusion_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query", 15)) - { - ret = GLEW_ARB_occlusion_query; - continue; - } -#endif -#ifdef GL_ARB_occlusion_query2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query2", 16)) - { - ret = GLEW_ARB_occlusion_query2; - continue; - } -#endif -#ifdef GL_ARB_parallel_shader_compile - if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_shader_compile", 23)) - { - ret = GLEW_ARB_parallel_shader_compile; - continue; - } -#endif -#ifdef GL_ARB_pipeline_statistics_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pipeline_statistics_query", 25)) - { - ret = GLEW_ARB_pipeline_statistics_query; - continue; - } -#endif -#ifdef GL_ARB_pixel_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) - { - ret = GLEW_ARB_pixel_buffer_object; - continue; - } -#endif -#ifdef GL_ARB_point_parameters - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_parameters", 16)) - { - ret = GLEW_ARB_point_parameters; - continue; - } -#endif -#ifdef GL_ARB_point_sprite - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprite", 12)) - { - ret = GLEW_ARB_point_sprite; - continue; - } -#endif -#ifdef GL_ARB_post_depth_coverage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_depth_coverage", 19)) - { - ret = GLEW_ARB_post_depth_coverage; - continue; - } -#endif -#ifdef GL_ARB_program_interface_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_interface_query", 23)) - { - ret = GLEW_ARB_program_interface_query; - continue; - } -#endif -#ifdef GL_ARB_provoking_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"provoking_vertex", 16)) - { - ret = GLEW_ARB_provoking_vertex; - continue; - } -#endif -#ifdef GL_ARB_query_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_buffer_object", 19)) - { - ret = GLEW_ARB_query_buffer_object; - continue; - } -#endif -#ifdef GL_ARB_robust_buffer_access_behavior - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robust_buffer_access_behavior", 29)) - { - ret = GLEW_ARB_robust_buffer_access_behavior; - continue; - } -#endif -#ifdef GL_ARB_robustness - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness", 10)) - { - ret = GLEW_ARB_robustness; - continue; - } -#endif -#ifdef GL_ARB_robustness_application_isolation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) - { - ret = GLEW_ARB_robustness_application_isolation; - continue; - } -#endif -#ifdef GL_ARB_robustness_share_group_isolation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) - { - ret = GLEW_ARB_robustness_share_group_isolation; - continue; - } -#endif -#ifdef GL_ARB_sample_locations - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_locations", 16)) - { - ret = GLEW_ARB_sample_locations; - continue; - } -#endif -#ifdef GL_ARB_sample_shading - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_shading", 14)) - { - ret = GLEW_ARB_sample_shading; - continue; - } -#endif -#ifdef GL_ARB_sampler_objects - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sampler_objects", 15)) - { - ret = GLEW_ARB_sampler_objects; - continue; - } -#endif -#ifdef GL_ARB_seamless_cube_map - if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cube_map", 17)) - { - ret = GLEW_ARB_seamless_cube_map; - continue; - } -#endif -#ifdef GL_ARB_seamless_cubemap_per_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cubemap_per_texture", 28)) - { - ret = GLEW_ARB_seamless_cubemap_per_texture; - continue; - } -#endif -#ifdef GL_ARB_separate_shader_objects - if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_shader_objects", 23)) - { - ret = GLEW_ARB_separate_shader_objects; - continue; - } -#endif -#ifdef GL_ARB_shader_atomic_counter_ops - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counter_ops", 25)) - { - ret = GLEW_ARB_shader_atomic_counter_ops; - continue; - } -#endif -#ifdef GL_ARB_shader_atomic_counters - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counters", 22)) - { - ret = GLEW_ARB_shader_atomic_counters; - continue; - } -#endif -#ifdef GL_ARB_shader_ballot - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_ballot", 13)) - { - ret = GLEW_ARB_shader_ballot; - continue; - } -#endif -#ifdef GL_ARB_shader_bit_encoding - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_bit_encoding", 19)) - { - ret = GLEW_ARB_shader_bit_encoding; - continue; - } -#endif -#ifdef GL_ARB_shader_clock - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_clock", 12)) - { - ret = GLEW_ARB_shader_clock; - continue; - } -#endif -#ifdef GL_ARB_shader_draw_parameters - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_draw_parameters", 22)) - { - ret = GLEW_ARB_shader_draw_parameters; - continue; - } -#endif -#ifdef GL_ARB_shader_group_vote - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_group_vote", 17)) - { - ret = GLEW_ARB_shader_group_vote; - continue; - } -#endif -#ifdef GL_ARB_shader_image_load_store - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_store", 23)) - { - ret = GLEW_ARB_shader_image_load_store; - continue; - } -#endif -#ifdef GL_ARB_shader_image_size - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_size", 17)) - { - ret = GLEW_ARB_shader_image_size; - continue; - } -#endif -#ifdef GL_ARB_shader_objects - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_objects", 14)) - { - ret = GLEW_ARB_shader_objects; - continue; - } -#endif -#ifdef GL_ARB_shader_precision - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_precision", 16)) - { - ret = GLEW_ARB_shader_precision; - continue; - } -#endif -#ifdef GL_ARB_shader_stencil_export - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_export", 21)) - { - ret = GLEW_ARB_shader_stencil_export; - continue; - } -#endif -#ifdef GL_ARB_shader_storage_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_storage_buffer_object", 28)) - { - ret = GLEW_ARB_shader_storage_buffer_object; - continue; - } -#endif -#ifdef GL_ARB_shader_subroutine - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_subroutine", 17)) - { - ret = GLEW_ARB_shader_subroutine; - continue; - } -#endif -#ifdef GL_ARB_shader_texture_image_samples - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_image_samples", 28)) - { - ret = GLEW_ARB_shader_texture_image_samples; - continue; - } -#endif -#ifdef GL_ARB_shader_texture_lod - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18)) - { - ret = GLEW_ARB_shader_texture_lod; - continue; - } -#endif -#ifdef GL_ARB_shader_viewport_layer_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_viewport_layer_array", 27)) - { - ret = GLEW_ARB_shader_viewport_layer_array; - continue; - } -#endif -#ifdef GL_ARB_shading_language_100 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_100", 20)) - { - ret = GLEW_ARB_shading_language_100; - continue; - } -#endif -#ifdef GL_ARB_shading_language_420pack - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_420pack", 24)) - { - ret = GLEW_ARB_shading_language_420pack; - continue; - } -#endif -#ifdef GL_ARB_shading_language_include - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_include", 24)) - { - ret = GLEW_ARB_shading_language_include; - continue; - } -#endif -#ifdef GL_ARB_shading_language_packing - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_packing", 24)) - { - ret = GLEW_ARB_shading_language_packing; - continue; - } -#endif -#ifdef GL_ARB_shadow - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow", 6)) - { - ret = GLEW_ARB_shadow; - continue; - } -#endif -#ifdef GL_ARB_shadow_ambient - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_ambient", 14)) - { - ret = GLEW_ARB_shadow_ambient; - continue; - } -#endif -#ifdef GL_ARB_sparse_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_buffer", 13)) - { - ret = GLEW_ARB_sparse_buffer; - continue; - } -#endif -#ifdef GL_ARB_sparse_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14)) - { - ret = GLEW_ARB_sparse_texture; - continue; - } -#endif -#ifdef GL_ARB_sparse_texture2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture2", 15)) - { - ret = GLEW_ARB_sparse_texture2; - continue; - } -#endif -#ifdef GL_ARB_sparse_texture_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture_clamp", 20)) - { - ret = GLEW_ARB_sparse_texture_clamp; - continue; - } -#endif -#ifdef GL_ARB_stencil_texturing - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_texturing", 17)) - { - ret = GLEW_ARB_stencil_texturing; - continue; - } -#endif -#ifdef GL_ARB_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync", 4)) - { - ret = GLEW_ARB_sync; - continue; - } -#endif -#ifdef GL_ARB_tessellation_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_shader", 19)) - { - ret = GLEW_ARB_tessellation_shader; - continue; - } -#endif -#ifdef GL_ARB_texture_barrier - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_barrier", 15)) - { - ret = GLEW_ARB_texture_barrier; - continue; - } -#endif -#ifdef GL_ARB_texture_border_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) - { - ret = GLEW_ARB_texture_border_clamp; - continue; - } -#endif -#ifdef GL_ARB_texture_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object", 21)) - { - ret = GLEW_ARB_texture_buffer_object; - continue; - } -#endif -#ifdef GL_ARB_texture_buffer_object_rgb32 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object_rgb32", 27)) - { - ret = GLEW_ARB_texture_buffer_object_rgb32; - continue; - } -#endif -#ifdef GL_ARB_texture_buffer_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_range", 20)) - { - ret = GLEW_ARB_texture_buffer_range; - continue; - } -#endif -#ifdef GL_ARB_texture_compression - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression", 19)) - { - ret = GLEW_ARB_texture_compression; - continue; - } -#endif -#ifdef GL_ARB_texture_compression_bptc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_bptc", 24)) - { - ret = GLEW_ARB_texture_compression_bptc; - continue; - } -#endif -#ifdef GL_ARB_texture_compression_rgtc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_rgtc", 24)) - { - ret = GLEW_ARB_texture_compression_rgtc; - continue; - } -#endif -#ifdef GL_ARB_texture_cube_map - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map", 16)) - { - ret = GLEW_ARB_texture_cube_map; - continue; - } -#endif -#ifdef GL_ARB_texture_cube_map_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map_array", 22)) - { - ret = GLEW_ARB_texture_cube_map_array; - continue; - } -#endif -#ifdef GL_ARB_texture_env_add - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_add", 15)) - { - ret = GLEW_ARB_texture_env_add; - continue; - } -#endif -#ifdef GL_ARB_texture_env_combine - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine", 19)) - { - ret = GLEW_ARB_texture_env_combine; - continue; - } -#endif -#ifdef GL_ARB_texture_env_crossbar - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_crossbar", 20)) - { - ret = GLEW_ARB_texture_env_crossbar; - continue; - } -#endif -#ifdef GL_ARB_texture_env_dot3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_dot3", 16)) - { - ret = GLEW_ARB_texture_env_dot3; - continue; - } -#endif -#ifdef GL_ARB_texture_filter_minmax - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_minmax", 21)) - { - ret = GLEW_ARB_texture_filter_minmax; - continue; - } -#endif -#ifdef GL_ARB_texture_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_float", 13)) - { - ret = GLEW_ARB_texture_float; - continue; - } -#endif -#ifdef GL_ARB_texture_gather - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_gather", 14)) - { - ret = GLEW_ARB_texture_gather; - continue; - } -#endif -#ifdef GL_ARB_texture_mirror_clamp_to_edge - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_clamp_to_edge", 28)) - { - ret = GLEW_ARB_texture_mirror_clamp_to_edge; - continue; - } -#endif -#ifdef GL_ARB_texture_mirrored_repeat - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23)) - { - ret = GLEW_ARB_texture_mirrored_repeat; - continue; - } -#endif -#ifdef GL_ARB_texture_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multisample", 19)) - { - ret = GLEW_ARB_texture_multisample; - continue; - } -#endif -#ifdef GL_ARB_texture_non_power_of_two - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_non_power_of_two", 24)) - { - ret = GLEW_ARB_texture_non_power_of_two; - continue; - } -#endif -#ifdef GL_ARB_texture_query_levels - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_query_levels", 20)) - { - ret = GLEW_ARB_texture_query_levels; - continue; - } -#endif -#ifdef GL_ARB_texture_query_lod - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_query_lod", 17)) - { - ret = GLEW_ARB_texture_query_lod; - continue; - } -#endif -#ifdef GL_ARB_texture_rectangle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) - { - ret = GLEW_ARB_texture_rectangle; - continue; - } -#endif -#ifdef GL_ARB_texture_rg - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rg", 10)) - { - ret = GLEW_ARB_texture_rg; - continue; - } -#endif -#ifdef GL_ARB_texture_rgb10_a2ui - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rgb10_a2ui", 18)) - { - ret = GLEW_ARB_texture_rgb10_a2ui; - continue; - } -#endif -#ifdef GL_ARB_texture_stencil8 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_stencil8", 16)) - { - ret = GLEW_ARB_texture_stencil8; - continue; - } -#endif -#ifdef GL_ARB_texture_storage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage", 15)) - { - ret = GLEW_ARB_texture_storage; - continue; - } -#endif -#ifdef GL_ARB_texture_storage_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage_multisample", 27)) - { - ret = GLEW_ARB_texture_storage_multisample; - continue; - } -#endif -#ifdef GL_ARB_texture_swizzle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_swizzle", 15)) - { - ret = GLEW_ARB_texture_swizzle; - continue; - } -#endif -#ifdef GL_ARB_texture_view - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_view", 12)) - { - ret = GLEW_ARB_texture_view; - continue; - } -#endif -#ifdef GL_ARB_timer_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) - { - ret = GLEW_ARB_timer_query; - continue; - } -#endif -#ifdef GL_ARB_transform_feedback2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback2", 19)) - { - ret = GLEW_ARB_transform_feedback2; - continue; - } -#endif -#ifdef GL_ARB_transform_feedback3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback3", 19)) - { - ret = GLEW_ARB_transform_feedback3; - continue; - } -#endif -#ifdef GL_ARB_transform_feedback_instanced - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback_instanced", 28)) - { - ret = GLEW_ARB_transform_feedback_instanced; - continue; - } -#endif -#ifdef GL_ARB_transform_feedback_overflow_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback_overflow_query", 33)) - { - ret = GLEW_ARB_transform_feedback_overflow_query; - continue; - } -#endif -#ifdef GL_ARB_transpose_matrix - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transpose_matrix", 16)) - { - ret = GLEW_ARB_transpose_matrix; - continue; - } -#endif -#ifdef GL_ARB_uniform_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"uniform_buffer_object", 21)) - { - ret = GLEW_ARB_uniform_buffer_object; - continue; - } -#endif -#ifdef GL_ARB_vertex_array_bgra - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_bgra", 17)) - { - ret = GLEW_ARB_vertex_array_bgra; - continue; - } -#endif -#ifdef GL_ARB_vertex_array_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) - { - ret = GLEW_ARB_vertex_array_object; - continue; - } -#endif -#ifdef GL_ARB_vertex_attrib_64bit - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_64bit", 19)) - { - ret = GLEW_ARB_vertex_attrib_64bit; - continue; - } -#endif -#ifdef GL_ARB_vertex_attrib_binding - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_binding", 21)) - { - ret = GLEW_ARB_vertex_attrib_binding; - continue; - } -#endif -#ifdef GL_ARB_vertex_blend - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_blend", 12)) - { - ret = GLEW_ARB_vertex_blend; - continue; - } -#endif -#ifdef GL_ARB_vertex_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_object", 20)) - { - ret = GLEW_ARB_vertex_buffer_object; - continue; - } -#endif -#ifdef GL_ARB_vertex_program - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program", 14)) - { - ret = GLEW_ARB_vertex_program; - continue; - } -#endif -#ifdef GL_ARB_vertex_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader", 13)) - { - ret = GLEW_ARB_vertex_shader; - continue; - } -#endif -#ifdef GL_ARB_vertex_type_10f_11f_11f_rev - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_type_10f_11f_11f_rev", 27)) - { - ret = GLEW_ARB_vertex_type_10f_11f_11f_rev; - continue; - } -#endif -#ifdef GL_ARB_vertex_type_2_10_10_10_rev - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_type_2_10_10_10_rev", 26)) - { - ret = GLEW_ARB_vertex_type_2_10_10_10_rev; - continue; - } -#endif -#ifdef GL_ARB_viewport_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_array", 14)) - { - ret = GLEW_ARB_viewport_array; - continue; - } -#endif -#ifdef GL_ARB_window_pos - if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_pos", 10)) - { - ret = GLEW_ARB_window_pos; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATIX_", 5)) - { -#ifdef GL_ATIX_point_sprites - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprites", 13)) - { - ret = GLEW_ATIX_point_sprites; - continue; - } -#endif -#ifdef GL_ATIX_texture_env_combine3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine3", 20)) - { - ret = GLEW_ATIX_texture_env_combine3; - continue; - } -#endif -#ifdef GL_ATIX_texture_env_route - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_route", 17)) - { - ret = GLEW_ATIX_texture_env_route; - continue; - } -#endif -#ifdef GL_ATIX_vertex_shader_output_point_size - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_output_point_size", 31)) - { - ret = GLEW_ATIX_vertex_shader_output_point_size; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) - { -#ifdef GL_ATI_draw_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) - { - ret = GLEW_ATI_draw_buffers; - continue; - } -#endif -#ifdef GL_ATI_element_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"element_array", 13)) - { - ret = GLEW_ATI_element_array; - continue; - } -#endif -#ifdef GL_ATI_envmap_bumpmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"envmap_bumpmap", 14)) - { - ret = GLEW_ATI_envmap_bumpmap; - continue; - } -#endif -#ifdef GL_ATI_fragment_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader", 15)) - { - ret = GLEW_ATI_fragment_shader; - continue; - } -#endif -#ifdef GL_ATI_map_object_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_object_buffer", 17)) - { - ret = GLEW_ATI_map_object_buffer; - continue; - } -#endif -#ifdef GL_ATI_meminfo - if (_glewStrSame3(&pos, &len, (const GLubyte*)"meminfo", 7)) - { - ret = GLEW_ATI_meminfo; - continue; - } -#endif -#ifdef GL_ATI_pn_triangles - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pn_triangles", 12)) - { - ret = GLEW_ATI_pn_triangles; - continue; - } -#endif -#ifdef GL_ATI_separate_stencil - if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_stencil", 16)) - { - ret = GLEW_ATI_separate_stencil; - continue; - } -#endif -#ifdef GL_ATI_shader_texture_lod - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18)) - { - ret = GLEW_ATI_shader_texture_lod; - continue; - } -#endif -#ifdef GL_ATI_text_fragment_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"text_fragment_shader", 20)) - { - ret = GLEW_ATI_text_fragment_shader; - continue; - } -#endif -#ifdef GL_ATI_texture_compression_3dc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_3dc", 23)) - { - ret = GLEW_ATI_texture_compression_3dc; - continue; - } -#endif -#ifdef GL_ATI_texture_env_combine3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine3", 20)) - { - ret = GLEW_ATI_texture_env_combine3; - continue; - } -#endif -#ifdef GL_ATI_texture_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_float", 13)) - { - ret = GLEW_ATI_texture_float; - continue; - } -#endif -#ifdef GL_ATI_texture_mirror_once - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_once", 19)) - { - ret = GLEW_ATI_texture_mirror_once; - continue; - } -#endif -#ifdef GL_ATI_vertex_array_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) - { - ret = GLEW_ATI_vertex_array_object; - continue; - } -#endif -#ifdef GL_ATI_vertex_attrib_array_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_array_object", 26)) - { - ret = GLEW_ATI_vertex_attrib_array_object; - continue; - } -#endif -#ifdef GL_ATI_vertex_streams - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_streams", 14)) - { - ret = GLEW_ATI_vertex_streams; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) - { -#ifdef GL_EXT_422_pixels - if (_glewStrSame3(&pos, &len, (const GLubyte*)"422_pixels", 10)) - { - ret = GLEW_EXT_422_pixels; - continue; - } -#endif -#ifdef GL_EXT_Cg_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"Cg_shader", 9)) - { - ret = GLEW_EXT_Cg_shader; - continue; - } -#endif -#ifdef GL_EXT_abgr - if (_glewStrSame3(&pos, &len, (const GLubyte*)"abgr", 4)) - { - ret = GLEW_EXT_abgr; - continue; - } -#endif -#ifdef GL_EXT_bgra - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bgra", 4)) - { - ret = GLEW_EXT_bgra; - continue; - } -#endif -#ifdef GL_EXT_bindable_uniform - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindable_uniform", 16)) - { - ret = GLEW_EXT_bindable_uniform; - continue; - } -#endif -#ifdef GL_EXT_blend_color - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_color", 11)) - { - ret = GLEW_EXT_blend_color; - continue; - } -#endif -#ifdef GL_EXT_blend_equation_separate - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_separate", 23)) - { - ret = GLEW_EXT_blend_equation_separate; - continue; - } -#endif -#ifdef GL_EXT_blend_func_separate - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_separate", 19)) - { - ret = GLEW_EXT_blend_func_separate; - continue; - } -#endif -#ifdef GL_EXT_blend_logic_op - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_logic_op", 14)) - { - ret = GLEW_EXT_blend_logic_op; - continue; - } -#endif -#ifdef GL_EXT_blend_minmax - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax", 12)) - { - ret = GLEW_EXT_blend_minmax; - continue; - } -#endif -#ifdef GL_EXT_blend_subtract - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_subtract", 14)) - { - ret = GLEW_EXT_blend_subtract; - continue; - } -#endif -#ifdef GL_EXT_clip_volume_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_volume_hint", 16)) - { - ret = GLEW_EXT_clip_volume_hint; - continue; - } -#endif -#ifdef GL_EXT_cmyka - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cmyka", 5)) - { - ret = GLEW_EXT_cmyka; - continue; - } -#endif -#ifdef GL_EXT_color_subtable - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_subtable", 14)) - { - ret = GLEW_EXT_color_subtable; - continue; - } -#endif -#ifdef GL_EXT_compiled_vertex_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compiled_vertex_array", 21)) - { - ret = GLEW_EXT_compiled_vertex_array; - continue; - } -#endif -#ifdef GL_EXT_convolution - if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution", 11)) - { - ret = GLEW_EXT_convolution; - continue; - } -#endif -#ifdef GL_EXT_coordinate_frame - if (_glewStrSame3(&pos, &len, (const GLubyte*)"coordinate_frame", 16)) - { - ret = GLEW_EXT_coordinate_frame; - continue; - } -#endif -#ifdef GL_EXT_copy_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_texture", 12)) - { - ret = GLEW_EXT_copy_texture; - continue; - } -#endif -#ifdef GL_EXT_cull_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_vertex", 11)) - { - ret = GLEW_EXT_cull_vertex; - continue; - } -#endif -#ifdef GL_EXT_debug_label - if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_label", 11)) - { - ret = GLEW_EXT_debug_label; - continue; - } -#endif -#ifdef GL_EXT_debug_marker - if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_marker", 12)) - { - ret = GLEW_EXT_debug_marker; - continue; - } -#endif -#ifdef GL_EXT_depth_bounds_test - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_bounds_test", 17)) - { - ret = GLEW_EXT_depth_bounds_test; - continue; - } -#endif -#ifdef GL_EXT_direct_state_access - if (_glewStrSame3(&pos, &len, (const GLubyte*)"direct_state_access", 19)) - { - ret = GLEW_EXT_direct_state_access; - continue; - } -#endif -#ifdef GL_EXT_draw_buffers2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers2", 13)) - { - ret = GLEW_EXT_draw_buffers2; - continue; - } -#endif -#ifdef GL_EXT_draw_instanced - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14)) - { - ret = GLEW_EXT_draw_instanced; - continue; - } -#endif -#ifdef GL_EXT_draw_range_elements - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_range_elements", 19)) - { - ret = GLEW_EXT_draw_range_elements; - continue; - } -#endif -#ifdef GL_EXT_fog_coord - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_coord", 9)) - { - ret = GLEW_EXT_fog_coord; - continue; - } -#endif -#ifdef GL_EXT_fragment_lighting - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_lighting", 17)) - { - ret = GLEW_EXT_fragment_lighting; - continue; - } -#endif -#ifdef GL_EXT_framebuffer_blit - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16)) - { - ret = GLEW_EXT_framebuffer_blit; - continue; - } -#endif -#ifdef GL_EXT_framebuffer_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) - { - ret = GLEW_EXT_framebuffer_multisample; - continue; - } -#endif -#ifdef GL_EXT_framebuffer_multisample_blit_scaled - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample_blit_scaled", 35)) - { - ret = GLEW_EXT_framebuffer_multisample_blit_scaled; - continue; - } -#endif -#ifdef GL_EXT_framebuffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_object", 18)) - { - ret = GLEW_EXT_framebuffer_object; - continue; - } -#endif -#ifdef GL_EXT_framebuffer_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) - { - ret = GLEW_EXT_framebuffer_sRGB; - continue; - } -#endif -#ifdef GL_EXT_geometry_shader4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) - { - ret = GLEW_EXT_geometry_shader4; - continue; - } -#endif -#ifdef GL_EXT_gpu_program_parameters - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program_parameters", 22)) - { - ret = GLEW_EXT_gpu_program_parameters; - continue; - } -#endif -#ifdef GL_EXT_gpu_shader4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader4", 11)) - { - ret = GLEW_EXT_gpu_shader4; - continue; - } -#endif -#ifdef GL_EXT_histogram - if (_glewStrSame3(&pos, &len, (const GLubyte*)"histogram", 9)) - { - ret = GLEW_EXT_histogram; - continue; - } -#endif -#ifdef GL_EXT_index_array_formats - if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_array_formats", 19)) - { - ret = GLEW_EXT_index_array_formats; - continue; - } -#endif -#ifdef GL_EXT_index_func - if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_func", 10)) - { - ret = GLEW_EXT_index_func; - continue; - } -#endif -#ifdef GL_EXT_index_material - if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_material", 14)) - { - ret = GLEW_EXT_index_material; - continue; - } -#endif -#ifdef GL_EXT_index_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_texture", 13)) - { - ret = GLEW_EXT_index_texture; - continue; - } -#endif -#ifdef GL_EXT_light_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"light_texture", 13)) - { - ret = GLEW_EXT_light_texture; - continue; - } -#endif -#ifdef GL_EXT_misc_attribute - if (_glewStrSame3(&pos, &len, (const GLubyte*)"misc_attribute", 14)) - { - ret = GLEW_EXT_misc_attribute; - continue; - } -#endif -#ifdef GL_EXT_multi_draw_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_arrays", 17)) - { - ret = GLEW_EXT_multi_draw_arrays; - continue; - } -#endif -#ifdef GL_EXT_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLEW_EXT_multisample; - continue; - } -#endif -#ifdef GL_EXT_packed_depth_stencil - if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_depth_stencil", 20)) - { - ret = GLEW_EXT_packed_depth_stencil; - continue; - } -#endif -#ifdef GL_EXT_packed_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_float", 12)) - { - ret = GLEW_EXT_packed_float; - continue; - } -#endif -#ifdef GL_EXT_packed_pixels - if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_pixels", 13)) - { - ret = GLEW_EXT_packed_pixels; - continue; - } -#endif -#ifdef GL_EXT_paletted_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"paletted_texture", 16)) - { - ret = GLEW_EXT_paletted_texture; - continue; - } -#endif -#ifdef GL_EXT_pixel_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) - { - ret = GLEW_EXT_pixel_buffer_object; - continue; - } -#endif -#ifdef GL_EXT_pixel_transform - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_transform", 15)) - { - ret = GLEW_EXT_pixel_transform; - continue; - } -#endif -#ifdef GL_EXT_pixel_transform_color_table - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_transform_color_table", 27)) - { - ret = GLEW_EXT_pixel_transform_color_table; - continue; - } -#endif -#ifdef GL_EXT_point_parameters - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_parameters", 16)) - { - ret = GLEW_EXT_point_parameters; - continue; - } -#endif -#ifdef GL_EXT_polygon_offset - if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_offset", 14)) - { - ret = GLEW_EXT_polygon_offset; - continue; - } -#endif -#ifdef GL_EXT_polygon_offset_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_offset_clamp", 20)) - { - ret = GLEW_EXT_polygon_offset_clamp; - continue; - } -#endif -#ifdef GL_EXT_post_depth_coverage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_depth_coverage", 19)) - { - ret = GLEW_EXT_post_depth_coverage; - continue; - } -#endif -#ifdef GL_EXT_provoking_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"provoking_vertex", 16)) - { - ret = GLEW_EXT_provoking_vertex; - continue; - } -#endif -#ifdef GL_EXT_raster_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"raster_multisample", 18)) - { - ret = GLEW_EXT_raster_multisample; - continue; - } -#endif -#ifdef GL_EXT_rescale_normal - if (_glewStrSame3(&pos, &len, (const GLubyte*)"rescale_normal", 14)) - { - ret = GLEW_EXT_rescale_normal; - continue; - } -#endif -#ifdef GL_EXT_scene_marker - if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_marker", 12)) - { - ret = GLEW_EXT_scene_marker; - continue; - } -#endif -#ifdef GL_EXT_secondary_color - if (_glewStrSame3(&pos, &len, (const GLubyte*)"secondary_color", 15)) - { - ret = GLEW_EXT_secondary_color; - continue; - } -#endif -#ifdef GL_EXT_separate_shader_objects - if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_shader_objects", 23)) - { - ret = GLEW_EXT_separate_shader_objects; - continue; - } -#endif -#ifdef GL_EXT_separate_specular_color - if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_specular_color", 23)) - { - ret = GLEW_EXT_separate_specular_color; - continue; - } -#endif -#ifdef GL_EXT_shader_image_load_formatted - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_formatted", 27)) - { - ret = GLEW_EXT_shader_image_load_formatted; - continue; - } -#endif -#ifdef GL_EXT_shader_image_load_store - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_store", 23)) - { - ret = GLEW_EXT_shader_image_load_store; - continue; - } -#endif -#ifdef GL_EXT_shader_integer_mix - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_integer_mix", 18)) - { - ret = GLEW_EXT_shader_integer_mix; - continue; - } -#endif -#ifdef GL_EXT_shadow_funcs - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_funcs", 12)) - { - ret = GLEW_EXT_shadow_funcs; - continue; - } -#endif -#ifdef GL_EXT_shared_texture_palette - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_texture_palette", 22)) - { - ret = GLEW_EXT_shared_texture_palette; - continue; - } -#endif -#ifdef GL_EXT_sparse_texture2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture2", 15)) - { - ret = GLEW_EXT_sparse_texture2; - continue; - } -#endif -#ifdef GL_EXT_stencil_clear_tag - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_clear_tag", 17)) - { - ret = GLEW_EXT_stencil_clear_tag; - continue; - } -#endif -#ifdef GL_EXT_stencil_two_side - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_two_side", 16)) - { - ret = GLEW_EXT_stencil_two_side; - continue; - } -#endif -#ifdef GL_EXT_stencil_wrap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_wrap", 12)) - { - ret = GLEW_EXT_stencil_wrap; - continue; - } -#endif -#ifdef GL_EXT_subtexture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"subtexture", 10)) - { - ret = GLEW_EXT_subtexture; - continue; - } -#endif -#ifdef GL_EXT_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture", 7)) - { - ret = GLEW_EXT_texture; - continue; - } -#endif -#ifdef GL_EXT_texture3D - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture3D", 9)) - { - ret = GLEW_EXT_texture3D; - continue; - } -#endif -#ifdef GL_EXT_texture_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_array", 13)) - { - ret = GLEW_EXT_texture_array; - continue; - } -#endif -#ifdef GL_EXT_texture_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object", 21)) - { - ret = GLEW_EXT_texture_buffer_object; - continue; - } -#endif -#ifdef GL_EXT_texture_compression_dxt1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt1", 24)) - { - ret = GLEW_EXT_texture_compression_dxt1; - continue; - } -#endif -#ifdef GL_EXT_texture_compression_latc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_latc", 24)) - { - ret = GLEW_EXT_texture_compression_latc; - continue; - } -#endif -#ifdef GL_EXT_texture_compression_rgtc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_rgtc", 24)) - { - ret = GLEW_EXT_texture_compression_rgtc; - continue; - } -#endif -#ifdef GL_EXT_texture_compression_s3tc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_s3tc", 24)) - { - ret = GLEW_EXT_texture_compression_s3tc; - continue; - } -#endif -#ifdef GL_EXT_texture_cube_map - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map", 16)) - { - ret = GLEW_EXT_texture_cube_map; - continue; - } -#endif -#ifdef GL_EXT_texture_edge_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_edge_clamp", 18)) - { - ret = GLEW_EXT_texture_edge_clamp; - continue; - } -#endif -#ifdef GL_EXT_texture_env - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env", 11)) - { - ret = GLEW_EXT_texture_env; - continue; - } -#endif -#ifdef GL_EXT_texture_env_add - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_add", 15)) - { - ret = GLEW_EXT_texture_env_add; - continue; - } -#endif -#ifdef GL_EXT_texture_env_combine - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine", 19)) - { - ret = GLEW_EXT_texture_env_combine; - continue; - } -#endif -#ifdef GL_EXT_texture_env_dot3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_dot3", 16)) - { - ret = GLEW_EXT_texture_env_dot3; - continue; - } -#endif -#ifdef GL_EXT_texture_filter_anisotropic - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_anisotropic", 26)) - { - ret = GLEW_EXT_texture_filter_anisotropic; - continue; - } -#endif -#ifdef GL_EXT_texture_filter_minmax - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_minmax", 21)) - { - ret = GLEW_EXT_texture_filter_minmax; - continue; - } -#endif -#ifdef GL_EXT_texture_integer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_integer", 15)) - { - ret = GLEW_EXT_texture_integer; - continue; - } -#endif -#ifdef GL_EXT_texture_lod_bias - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod_bias", 16)) - { - ret = GLEW_EXT_texture_lod_bias; - continue; - } -#endif -#ifdef GL_EXT_texture_mirror_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_clamp", 20)) - { - ret = GLEW_EXT_texture_mirror_clamp; - continue; - } -#endif -#ifdef GL_EXT_texture_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_object", 14)) - { - ret = GLEW_EXT_texture_object; - continue; - } -#endif -#ifdef GL_EXT_texture_perturb_normal - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_perturb_normal", 22)) - { - ret = GLEW_EXT_texture_perturb_normal; - continue; - } -#endif -#ifdef GL_EXT_texture_rectangle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) - { - ret = GLEW_EXT_texture_rectangle; - continue; - } -#endif -#ifdef GL_EXT_texture_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB", 12)) - { - ret = GLEW_EXT_texture_sRGB; - continue; - } -#endif -#ifdef GL_EXT_texture_sRGB_decode - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB_decode", 19)) - { - ret = GLEW_EXT_texture_sRGB_decode; - continue; - } -#endif -#ifdef GL_EXT_texture_shared_exponent - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shared_exponent", 23)) - { - ret = GLEW_EXT_texture_shared_exponent; - continue; - } -#endif -#ifdef GL_EXT_texture_snorm - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_snorm", 13)) - { - ret = GLEW_EXT_texture_snorm; - continue; - } -#endif -#ifdef GL_EXT_texture_swizzle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_swizzle", 15)) - { - ret = GLEW_EXT_texture_swizzle; - continue; - } -#endif -#ifdef GL_EXT_timer_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) - { - ret = GLEW_EXT_timer_query; - continue; - } -#endif -#ifdef GL_EXT_transform_feedback - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback", 18)) - { - ret = GLEW_EXT_transform_feedback; - continue; - } -#endif -#ifdef GL_EXT_vertex_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array", 12)) - { - ret = GLEW_EXT_vertex_array; - continue; - } -#endif -#ifdef GL_EXT_vertex_array_bgra - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_bgra", 17)) - { - ret = GLEW_EXT_vertex_array_bgra; - continue; - } -#endif -#ifdef GL_EXT_vertex_attrib_64bit - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_64bit", 19)) - { - ret = GLEW_EXT_vertex_attrib_64bit; - continue; - } -#endif -#ifdef GL_EXT_vertex_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader", 13)) - { - ret = GLEW_EXT_vertex_shader; - continue; - } -#endif -#ifdef GL_EXT_vertex_weighting - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_weighting", 16)) - { - ret = GLEW_EXT_vertex_weighting; - continue; - } -#endif -#ifdef GL_EXT_x11_sync_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"x11_sync_object", 15)) - { - ret = GLEW_EXT_x11_sync_object; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"GREMEDY_", 8)) - { -#ifdef GL_GREMEDY_frame_terminator - if (_glewStrSame3(&pos, &len, (const GLubyte*)"frame_terminator", 16)) - { - ret = GLEW_GREMEDY_frame_terminator; - continue; - } -#endif -#ifdef GL_GREMEDY_string_marker - if (_glewStrSame3(&pos, &len, (const GLubyte*)"string_marker", 13)) - { - ret = GLEW_GREMEDY_string_marker; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"HP_", 3)) - { -#ifdef GL_HP_convolution_border_modes - if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_border_modes", 24)) - { - ret = GLEW_HP_convolution_border_modes; - continue; - } -#endif -#ifdef GL_HP_image_transform - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_transform", 15)) - { - ret = GLEW_HP_image_transform; - continue; - } -#endif -#ifdef GL_HP_occlusion_test - if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_test", 14)) - { - ret = GLEW_HP_occlusion_test; - continue; - } -#endif -#ifdef GL_HP_texture_lighting - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lighting", 16)) - { - ret = GLEW_HP_texture_lighting; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"IBM_", 4)) - { -#ifdef GL_IBM_cull_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_vertex", 11)) - { - ret = GLEW_IBM_cull_vertex; - continue; - } -#endif -#ifdef GL_IBM_multimode_draw_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multimode_draw_arrays", 21)) - { - ret = GLEW_IBM_multimode_draw_arrays; - continue; - } -#endif -#ifdef GL_IBM_rasterpos_clip - if (_glewStrSame3(&pos, &len, (const GLubyte*)"rasterpos_clip", 14)) - { - ret = GLEW_IBM_rasterpos_clip; - continue; - } -#endif -#ifdef GL_IBM_static_data - if (_glewStrSame3(&pos, &len, (const GLubyte*)"static_data", 11)) - { - ret = GLEW_IBM_static_data; - continue; - } -#endif -#ifdef GL_IBM_texture_mirrored_repeat - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23)) - { - ret = GLEW_IBM_texture_mirrored_repeat; - continue; - } -#endif -#ifdef GL_IBM_vertex_array_lists - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_lists", 18)) - { - ret = GLEW_IBM_vertex_array_lists; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"INGR_", 5)) - { -#ifdef GL_INGR_color_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_clamp", 11)) - { - ret = GLEW_INGR_color_clamp; - continue; - } -#endif -#ifdef GL_INGR_interlace_read - if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace_read", 14)) - { - ret = GLEW_INGR_interlace_read; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"INTEL_", 6)) - { -#ifdef GL_INTEL_fragment_shader_ordering - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_ordering", 24)) - { - ret = GLEW_INTEL_fragment_shader_ordering; - continue; - } -#endif -#ifdef GL_INTEL_framebuffer_CMAA - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_CMAA", 16)) - { - ret = GLEW_INTEL_framebuffer_CMAA; - continue; - } -#endif -#ifdef GL_INTEL_map_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_texture", 11)) - { - ret = GLEW_INTEL_map_texture; - continue; - } -#endif -#ifdef GL_INTEL_parallel_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_arrays", 15)) - { - ret = GLEW_INTEL_parallel_arrays; - continue; - } -#endif -#ifdef GL_INTEL_performance_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"performance_query", 17)) - { - ret = GLEW_INTEL_performance_query; - continue; - } -#endif -#ifdef GL_INTEL_texture_scissor - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_scissor", 15)) - { - ret = GLEW_INTEL_texture_scissor; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"KHR_", 4)) - { -#ifdef GL_KHR_blend_equation_advanced - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced", 23)) - { - ret = GLEW_KHR_blend_equation_advanced; - continue; - } -#endif -#ifdef GL_KHR_blend_equation_advanced_coherent - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced_coherent", 32)) - { - ret = GLEW_KHR_blend_equation_advanced_coherent; - continue; - } -#endif -#ifdef GL_KHR_context_flush_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) - { - ret = GLEW_KHR_context_flush_control; - continue; - } -#endif -#ifdef GL_KHR_debug - if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug", 5)) - { - ret = GLEW_KHR_debug; - continue; - } -#endif -#ifdef GL_KHR_no_error - if (_glewStrSame3(&pos, &len, (const GLubyte*)"no_error", 8)) - { - ret = GLEW_KHR_no_error; - continue; - } -#endif -#ifdef GL_KHR_robust_buffer_access_behavior - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robust_buffer_access_behavior", 29)) - { - ret = GLEW_KHR_robust_buffer_access_behavior; - continue; - } -#endif -#ifdef GL_KHR_robustness - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness", 10)) - { - ret = GLEW_KHR_robustness; - continue; - } -#endif -#ifdef GL_KHR_texture_compression_astc_hdr - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_hdr", 28)) - { - ret = GLEW_KHR_texture_compression_astc_hdr; - continue; - } -#endif -#ifdef GL_KHR_texture_compression_astc_ldr - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_ldr", 28)) - { - ret = GLEW_KHR_texture_compression_astc_ldr; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"KTX_", 4)) - { -#ifdef GL_KTX_buffer_region - if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_region", 13)) - { - ret = GLEW_KTX_buffer_region; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESAX_", 6)) - { -#ifdef GL_MESAX_texture_stack - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_stack", 13)) - { - ret = GLEW_MESAX_texture_stack; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) - { -#ifdef GL_MESA_pack_invert - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_invert", 11)) - { - ret = GLEW_MESA_pack_invert; - continue; - } -#endif -#ifdef GL_MESA_resize_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"resize_buffers", 14)) - { - ret = GLEW_MESA_resize_buffers; - continue; - } -#endif -#ifdef GL_MESA_window_pos - if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_pos", 10)) - { - ret = GLEW_MESA_window_pos; - continue; - } -#endif -#ifdef GL_MESA_ycbcr_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycbcr_texture", 13)) - { - ret = GLEW_MESA_ycbcr_texture; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"NVX_", 4)) - { -#ifdef GL_NVX_conditional_render - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render", 18)) - { - ret = GLEW_NVX_conditional_render; - continue; - } -#endif -#ifdef GL_NVX_gpu_memory_info - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_memory_info", 15)) - { - ret = GLEW_NVX_gpu_memory_info; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) - { -#ifdef GL_NV_bindless_multi_draw_indirect - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_multi_draw_indirect", 28)) - { - ret = GLEW_NV_bindless_multi_draw_indirect; - continue; - } -#endif -#ifdef GL_NV_bindless_multi_draw_indirect_count - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_multi_draw_indirect_count", 34)) - { - ret = GLEW_NV_bindless_multi_draw_indirect_count; - continue; - } -#endif -#ifdef GL_NV_bindless_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_texture", 16)) - { - ret = GLEW_NV_bindless_texture; - continue; - } -#endif -#ifdef GL_NV_blend_equation_advanced - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced", 23)) - { - ret = GLEW_NV_blend_equation_advanced; - continue; - } -#endif -#ifdef GL_NV_blend_equation_advanced_coherent - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced_coherent", 32)) - { - ret = GLEW_NV_blend_equation_advanced_coherent; - continue; - } -#endif -#ifdef GL_NV_blend_square - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_square", 12)) - { - ret = GLEW_NV_blend_square; - continue; - } -#endif -#ifdef GL_NV_compute_program5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_program5", 16)) - { - ret = GLEW_NV_compute_program5; - continue; - } -#endif -#ifdef GL_NV_conditional_render - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render", 18)) - { - ret = GLEW_NV_conditional_render; - continue; - } -#endif -#ifdef GL_NV_conservative_raster - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_raster", 19)) - { - ret = GLEW_NV_conservative_raster; - continue; - } -#endif -#ifdef GL_NV_conservative_raster_dilate - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_raster_dilate", 26)) - { - ret = GLEW_NV_conservative_raster_dilate; - continue; - } -#endif -#ifdef GL_NV_copy_depth_to_color - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_depth_to_color", 19)) - { - ret = GLEW_NV_copy_depth_to_color; - continue; - } -#endif -#ifdef GL_NV_copy_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) - { - ret = GLEW_NV_copy_image; - continue; - } -#endif -#ifdef GL_NV_deep_texture3D - if (_glewStrSame3(&pos, &len, (const GLubyte*)"deep_texture3D", 14)) - { - ret = GLEW_NV_deep_texture3D; - continue; - } -#endif -#ifdef GL_NV_depth_buffer_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_buffer_float", 18)) - { - ret = GLEW_NV_depth_buffer_float; - continue; - } -#endif -#ifdef GL_NV_depth_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp", 11)) - { - ret = GLEW_NV_depth_clamp; - continue; - } -#endif -#ifdef GL_NV_depth_range_unclamped - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_range_unclamped", 21)) - { - ret = GLEW_NV_depth_range_unclamped; - continue; - } -#endif -#ifdef GL_NV_draw_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_texture", 12)) - { - ret = GLEW_NV_draw_texture; - continue; - } -#endif -#ifdef GL_NV_evaluators - if (_glewStrSame3(&pos, &len, (const GLubyte*)"evaluators", 10)) - { - ret = GLEW_NV_evaluators; - continue; - } -#endif -#ifdef GL_NV_explicit_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_multisample", 20)) - { - ret = GLEW_NV_explicit_multisample; - continue; - } -#endif -#ifdef GL_NV_fence - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence", 5)) - { - ret = GLEW_NV_fence; - continue; - } -#endif -#ifdef GL_NV_fill_rectangle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fill_rectangle", 14)) - { - ret = GLEW_NV_fill_rectangle; - continue; - } -#endif -#ifdef GL_NV_float_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) - { - ret = GLEW_NV_float_buffer; - continue; - } -#endif -#ifdef GL_NV_fog_distance - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_distance", 12)) - { - ret = GLEW_NV_fog_distance; - continue; - } -#endif -#ifdef GL_NV_fragment_coverage_to_color - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_coverage_to_color", 26)) - { - ret = GLEW_NV_fragment_coverage_to_color; - continue; - } -#endif -#ifdef GL_NV_fragment_program - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program", 16)) - { - ret = GLEW_NV_fragment_program; - continue; - } -#endif -#ifdef GL_NV_fragment_program2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program2", 17)) - { - ret = GLEW_NV_fragment_program2; - continue; - } -#endif -#ifdef GL_NV_fragment_program4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program4", 17)) - { - ret = GLEW_NV_fragment_program4; - continue; - } -#endif -#ifdef GL_NV_fragment_program_option - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program_option", 23)) - { - ret = GLEW_NV_fragment_program_option; - continue; - } -#endif -#ifdef GL_NV_fragment_shader_interlock - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_interlock", 25)) - { - ret = GLEW_NV_fragment_shader_interlock; - continue; - } -#endif -#ifdef GL_NV_framebuffer_mixed_samples - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_mixed_samples", 25)) - { - ret = GLEW_NV_framebuffer_mixed_samples; - continue; - } -#endif -#ifdef GL_NV_framebuffer_multisample_coverage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample_coverage", 32)) - { - ret = GLEW_NV_framebuffer_multisample_coverage; - continue; - } -#endif -#ifdef GL_NV_geometry_program4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_program4", 17)) - { - ret = GLEW_NV_geometry_program4; - continue; - } -#endif -#ifdef GL_NV_geometry_shader4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) - { - ret = GLEW_NV_geometry_shader4; - continue; - } -#endif -#ifdef GL_NV_geometry_shader_passthrough - if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader_passthrough", 27)) - { - ret = GLEW_NV_geometry_shader_passthrough; - continue; - } -#endif -#ifdef GL_NV_gpu_program4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program4", 12)) - { - ret = GLEW_NV_gpu_program4; - continue; - } -#endif -#ifdef GL_NV_gpu_program5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program5", 12)) - { - ret = GLEW_NV_gpu_program5; - continue; - } -#endif -#ifdef GL_NV_gpu_program5_mem_extended - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program5_mem_extended", 25)) - { - ret = GLEW_NV_gpu_program5_mem_extended; - continue; - } -#endif -#ifdef GL_NV_gpu_program_fp64 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program_fp64", 16)) - { - ret = GLEW_NV_gpu_program_fp64; - continue; - } -#endif -#ifdef GL_NV_gpu_shader5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11)) - { - ret = GLEW_NV_gpu_shader5; - continue; - } -#endif -#ifdef GL_NV_half_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float", 10)) - { - ret = GLEW_NV_half_float; - continue; - } -#endif -#ifdef GL_NV_internalformat_sample_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_sample_query", 27)) - { - ret = GLEW_NV_internalformat_sample_query; - continue; - } -#endif -#ifdef GL_NV_light_max_exponent - if (_glewStrSame3(&pos, &len, (const GLubyte*)"light_max_exponent", 18)) - { - ret = GLEW_NV_light_max_exponent; - continue; - } -#endif -#ifdef GL_NV_multisample_coverage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) - { - ret = GLEW_NV_multisample_coverage; - continue; - } -#endif -#ifdef GL_NV_multisample_filter_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_filter_hint", 23)) - { - ret = GLEW_NV_multisample_filter_hint; - continue; - } -#endif -#ifdef GL_NV_occlusion_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query", 15)) - { - ret = GLEW_NV_occlusion_query; - continue; - } -#endif -#ifdef GL_NV_packed_depth_stencil - if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_depth_stencil", 20)) - { - ret = GLEW_NV_packed_depth_stencil; - continue; - } -#endif -#ifdef GL_NV_parameter_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"parameter_buffer_object", 23)) - { - ret = GLEW_NV_parameter_buffer_object; - continue; - } -#endif -#ifdef GL_NV_parameter_buffer_object2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"parameter_buffer_object2", 24)) - { - ret = GLEW_NV_parameter_buffer_object2; - continue; - } -#endif -#ifdef GL_NV_path_rendering - if (_glewStrSame3(&pos, &len, (const GLubyte*)"path_rendering", 14)) - { - ret = GLEW_NV_path_rendering; - continue; - } -#endif -#ifdef GL_NV_path_rendering_shared_edge - if (_glewStrSame3(&pos, &len, (const GLubyte*)"path_rendering_shared_edge", 26)) - { - ret = GLEW_NV_path_rendering_shared_edge; - continue; - } -#endif -#ifdef GL_NV_pixel_data_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_data_range", 16)) - { - ret = GLEW_NV_pixel_data_range; - continue; - } -#endif -#ifdef GL_NV_point_sprite - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprite", 12)) - { - ret = GLEW_NV_point_sprite; - continue; - } -#endif -#ifdef GL_NV_present_video - if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) - { - ret = GLEW_NV_present_video; - continue; - } -#endif -#ifdef GL_NV_primitive_restart - if (_glewStrSame3(&pos, &len, (const GLubyte*)"primitive_restart", 17)) - { - ret = GLEW_NV_primitive_restart; - continue; - } -#endif -#ifdef GL_NV_register_combiners - if (_glewStrSame3(&pos, &len, (const GLubyte*)"register_combiners", 18)) - { - ret = GLEW_NV_register_combiners; - continue; - } -#endif -#ifdef GL_NV_register_combiners2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"register_combiners2", 19)) - { - ret = GLEW_NV_register_combiners2; - continue; - } -#endif -#ifdef GL_NV_sample_locations - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_locations", 16)) - { - ret = GLEW_NV_sample_locations; - continue; - } -#endif -#ifdef GL_NV_sample_mask_override_coverage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_mask_override_coverage", 29)) - { - ret = GLEW_NV_sample_mask_override_coverage; - continue; - } -#endif -#ifdef GL_NV_shader_atomic_counters - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counters", 22)) - { - ret = GLEW_NV_shader_atomic_counters; - continue; - } -#endif -#ifdef GL_NV_shader_atomic_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_float", 19)) - { - ret = GLEW_NV_shader_atomic_float; - continue; - } -#endif -#ifdef GL_NV_shader_atomic_fp16_vector - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_fp16_vector", 25)) - { - ret = GLEW_NV_shader_atomic_fp16_vector; - continue; - } -#endif -#ifdef GL_NV_shader_atomic_int64 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_int64", 19)) - { - ret = GLEW_NV_shader_atomic_int64; - continue; - } -#endif -#ifdef GL_NV_shader_buffer_load - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_buffer_load", 18)) - { - ret = GLEW_NV_shader_buffer_load; - continue; - } -#endif -#ifdef GL_NV_shader_storage_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_storage_buffer_object", 28)) - { - ret = GLEW_NV_shader_storage_buffer_object; - continue; - } -#endif -#ifdef GL_NV_shader_thread_group - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_thread_group", 19)) - { - ret = GLEW_NV_shader_thread_group; - continue; - } -#endif -#ifdef GL_NV_shader_thread_shuffle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_thread_shuffle", 21)) - { - ret = GLEW_NV_shader_thread_shuffle; - continue; - } -#endif -#ifdef GL_NV_tessellation_program5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_program5", 21)) - { - ret = GLEW_NV_tessellation_program5; - continue; - } -#endif -#ifdef GL_NV_texgen_emboss - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texgen_emboss", 13)) - { - ret = GLEW_NV_texgen_emboss; - continue; - } -#endif -#ifdef GL_NV_texgen_reflection - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texgen_reflection", 17)) - { - ret = GLEW_NV_texgen_reflection; - continue; - } -#endif -#ifdef GL_NV_texture_barrier - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_barrier", 15)) - { - ret = GLEW_NV_texture_barrier; - continue; - } -#endif -#ifdef GL_NV_texture_compression_vtc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_vtc", 23)) - { - ret = GLEW_NV_texture_compression_vtc; - continue; - } -#endif -#ifdef GL_NV_texture_env_combine4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine4", 20)) - { - ret = GLEW_NV_texture_env_combine4; - continue; - } -#endif -#ifdef GL_NV_texture_expand_normal - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_expand_normal", 21)) - { - ret = GLEW_NV_texture_expand_normal; - continue; - } -#endif -#ifdef GL_NV_texture_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multisample", 19)) - { - ret = GLEW_NV_texture_multisample; - continue; - } -#endif -#ifdef GL_NV_texture_rectangle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) - { - ret = GLEW_NV_texture_rectangle; - continue; - } -#endif -#ifdef GL_NV_texture_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader", 14)) - { - ret = GLEW_NV_texture_shader; - continue; - } -#endif -#ifdef GL_NV_texture_shader2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader2", 15)) - { - ret = GLEW_NV_texture_shader2; - continue; - } -#endif -#ifdef GL_NV_texture_shader3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader3", 15)) - { - ret = GLEW_NV_texture_shader3; - continue; - } -#endif -#ifdef GL_NV_transform_feedback - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback", 18)) - { - ret = GLEW_NV_transform_feedback; - continue; - } -#endif -#ifdef GL_NV_transform_feedback2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback2", 19)) - { - ret = GLEW_NV_transform_feedback2; - continue; - } -#endif -#ifdef GL_NV_uniform_buffer_unified_memory - if (_glewStrSame3(&pos, &len, (const GLubyte*)"uniform_buffer_unified_memory", 29)) - { - ret = GLEW_NV_uniform_buffer_unified_memory; - continue; - } -#endif -#ifdef GL_NV_vdpau_interop - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vdpau_interop", 13)) - { - ret = GLEW_NV_vdpau_interop; - continue; - } -#endif -#ifdef GL_NV_vertex_array_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) - { - ret = GLEW_NV_vertex_array_range; - continue; - } -#endif -#ifdef GL_NV_vertex_array_range2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range2", 19)) - { - ret = GLEW_NV_vertex_array_range2; - continue; - } -#endif -#ifdef GL_NV_vertex_attrib_integer_64bit - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_integer_64bit", 27)) - { - ret = GLEW_NV_vertex_attrib_integer_64bit; - continue; - } -#endif -#ifdef GL_NV_vertex_buffer_unified_memory - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_unified_memory", 28)) - { - ret = GLEW_NV_vertex_buffer_unified_memory; - continue; - } -#endif -#ifdef GL_NV_vertex_program - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program", 14)) - { - ret = GLEW_NV_vertex_program; - continue; - } -#endif -#ifdef GL_NV_vertex_program1_1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program1_1", 17)) - { - ret = GLEW_NV_vertex_program1_1; - continue; - } -#endif -#ifdef GL_NV_vertex_program2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program2", 15)) - { - ret = GLEW_NV_vertex_program2; - continue; - } -#endif -#ifdef GL_NV_vertex_program2_option - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program2_option", 22)) - { - ret = GLEW_NV_vertex_program2_option; - continue; - } -#endif -#ifdef GL_NV_vertex_program3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program3", 15)) - { - ret = GLEW_NV_vertex_program3; - continue; - } -#endif -#ifdef GL_NV_vertex_program4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program4", 15)) - { - ret = GLEW_NV_vertex_program4; - continue; - } -#endif -#ifdef GL_NV_video_capture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) - { - ret = GLEW_NV_video_capture; - continue; - } -#endif -#ifdef GL_NV_viewport_array2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_array2", 15)) - { - ret = GLEW_NV_viewport_array2; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"OES_", 4)) - { -#ifdef GL_OES_byte_coordinates - if (_glewStrSame3(&pos, &len, (const GLubyte*)"byte_coordinates", 16)) - { - ret = GLEW_OES_byte_coordinates; - continue; - } -#endif -#ifdef GL_OES_compressed_paletted_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_paletted_texture", 27)) - { - ret = GLEW_OES_compressed_paletted_texture; - continue; - } -#endif -#ifdef GL_OES_read_format - if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_format", 11)) - { - ret = GLEW_OES_read_format; - continue; - } -#endif -#ifdef GL_OES_single_precision - if (_glewStrSame3(&pos, &len, (const GLubyte*)"single_precision", 16)) - { - ret = GLEW_OES_single_precision; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) - { -#ifdef GL_OML_interlace - if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace", 9)) - { - ret = GLEW_OML_interlace; - continue; - } -#endif -#ifdef GL_OML_resample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"resample", 8)) - { - ret = GLEW_OML_resample; - continue; - } -#endif -#ifdef GL_OML_subsample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"subsample", 9)) - { - ret = GLEW_OML_subsample; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"OVR_", 4)) - { -#ifdef GL_OVR_multiview - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview", 9)) - { - ret = GLEW_OVR_multiview; - continue; - } -#endif -#ifdef GL_OVR_multiview2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview2", 10)) - { - ret = GLEW_OVR_multiview2; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"PGI_", 4)) - { -#ifdef GL_PGI_misc_hints - if (_glewStrSame3(&pos, &len, (const GLubyte*)"misc_hints", 10)) - { - ret = GLEW_PGI_misc_hints; - continue; - } -#endif -#ifdef GL_PGI_vertex_hints - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_hints", 12)) - { - ret = GLEW_PGI_vertex_hints; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"REGAL_", 6)) - { -#ifdef GL_REGAL_ES1_0_compatibility - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES1_0_compatibility", 19)) - { - ret = GLEW_REGAL_ES1_0_compatibility; - continue; - } -#endif -#ifdef GL_REGAL_ES1_1_compatibility - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES1_1_compatibility", 19)) - { - ret = GLEW_REGAL_ES1_1_compatibility; - continue; - } -#endif -#ifdef GL_REGAL_enable - if (_glewStrSame3(&pos, &len, (const GLubyte*)"enable", 6)) - { - ret = GLEW_REGAL_enable; - continue; - } -#endif -#ifdef GL_REGAL_error_string - if (_glewStrSame3(&pos, &len, (const GLubyte*)"error_string", 12)) - { - ret = GLEW_REGAL_error_string; - continue; - } -#endif -#ifdef GL_REGAL_extension_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"extension_query", 15)) - { - ret = GLEW_REGAL_extension_query; - continue; - } -#endif -#ifdef GL_REGAL_log - if (_glewStrSame3(&pos, &len, (const GLubyte*)"log", 3)) - { - ret = GLEW_REGAL_log; - continue; - } -#endif -#ifdef GL_REGAL_proc_address - if (_glewStrSame3(&pos, &len, (const GLubyte*)"proc_address", 12)) - { - ret = GLEW_REGAL_proc_address; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"REND_", 5)) - { -#ifdef GL_REND_screen_coordinates - if (_glewStrSame3(&pos, &len, (const GLubyte*)"screen_coordinates", 18)) - { - ret = GLEW_REND_screen_coordinates; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"S3_", 3)) - { -#ifdef GL_S3_s3tc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"s3tc", 4)) - { - ret = GLEW_S3_s3tc; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIS_", 5)) - { -#ifdef GL_SGIS_color_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_range", 11)) - { - ret = GLEW_SGIS_color_range; - continue; - } -#endif -#ifdef GL_SGIS_detail_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"detail_texture", 14)) - { - ret = GLEW_SGIS_detail_texture; - continue; - } -#endif -#ifdef GL_SGIS_fog_function - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_function", 12)) - { - ret = GLEW_SGIS_fog_function; - continue; - } -#endif -#ifdef GL_SGIS_generate_mipmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"generate_mipmap", 15)) - { - ret = GLEW_SGIS_generate_mipmap; - continue; - } -#endif -#ifdef GL_SGIS_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLEW_SGIS_multisample; - continue; - } -#endif -#ifdef GL_SGIS_pixel_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture", 13)) - { - ret = GLEW_SGIS_pixel_texture; - continue; - } -#endif -#ifdef GL_SGIS_point_line_texgen - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_line_texgen", 17)) - { - ret = GLEW_SGIS_point_line_texgen; - continue; - } -#endif -#ifdef GL_SGIS_sharpen_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sharpen_texture", 15)) - { - ret = GLEW_SGIS_sharpen_texture; - continue; - } -#endif -#ifdef GL_SGIS_texture4D - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture4D", 9)) - { - ret = GLEW_SGIS_texture4D; - continue; - } -#endif -#ifdef GL_SGIS_texture_border_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) - { - ret = GLEW_SGIS_texture_border_clamp; - continue; - } -#endif -#ifdef GL_SGIS_texture_edge_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_edge_clamp", 18)) - { - ret = GLEW_SGIS_texture_edge_clamp; - continue; - } -#endif -#ifdef GL_SGIS_texture_filter4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter4", 15)) - { - ret = GLEW_SGIS_texture_filter4; - continue; - } -#endif -#ifdef GL_SGIS_texture_lod - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod", 11)) - { - ret = GLEW_SGIS_texture_lod; - continue; - } -#endif -#ifdef GL_SGIS_texture_select - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_select", 14)) - { - ret = GLEW_SGIS_texture_select; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIX_", 5)) - { -#ifdef GL_SGIX_async - if (_glewStrSame3(&pos, &len, (const GLubyte*)"async", 5)) - { - ret = GLEW_SGIX_async; - continue; - } -#endif -#ifdef GL_SGIX_async_histogram - if (_glewStrSame3(&pos, &len, (const GLubyte*)"async_histogram", 15)) - { - ret = GLEW_SGIX_async_histogram; - continue; - } -#endif -#ifdef GL_SGIX_async_pixel - if (_glewStrSame3(&pos, &len, (const GLubyte*)"async_pixel", 11)) - { - ret = GLEW_SGIX_async_pixel; - continue; - } -#endif -#ifdef GL_SGIX_blend_alpha_minmax - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_alpha_minmax", 18)) - { - ret = GLEW_SGIX_blend_alpha_minmax; - continue; - } -#endif -#ifdef GL_SGIX_clipmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clipmap", 7)) - { - ret = GLEW_SGIX_clipmap; - continue; - } -#endif -#ifdef GL_SGIX_convolution_accuracy - if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_accuracy", 20)) - { - ret = GLEW_SGIX_convolution_accuracy; - continue; - } -#endif -#ifdef GL_SGIX_depth_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) - { - ret = GLEW_SGIX_depth_texture; - continue; - } -#endif -#ifdef GL_SGIX_flush_raster - if (_glewStrSame3(&pos, &len, (const GLubyte*)"flush_raster", 12)) - { - ret = GLEW_SGIX_flush_raster; - continue; - } -#endif -#ifdef GL_SGIX_fog_offset - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_offset", 10)) - { - ret = GLEW_SGIX_fog_offset; - continue; - } -#endif -#ifdef GL_SGIX_fog_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_texture", 11)) - { - ret = GLEW_SGIX_fog_texture; - continue; - } -#endif -#ifdef GL_SGIX_fragment_specular_lighting - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_specular_lighting", 26)) - { - ret = GLEW_SGIX_fragment_specular_lighting; - continue; - } -#endif -#ifdef GL_SGIX_framezoom - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framezoom", 9)) - { - ret = GLEW_SGIX_framezoom; - continue; - } -#endif -#ifdef GL_SGIX_interlace - if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace", 9)) - { - ret = GLEW_SGIX_interlace; - continue; - } -#endif -#ifdef GL_SGIX_ir_instrument1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ir_instrument1", 14)) - { - ret = GLEW_SGIX_ir_instrument1; - continue; - } -#endif -#ifdef GL_SGIX_list_priority - if (_glewStrSame3(&pos, &len, (const GLubyte*)"list_priority", 13)) - { - ret = GLEW_SGIX_list_priority; - continue; - } -#endif -#ifdef GL_SGIX_pixel_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture", 13)) - { - ret = GLEW_SGIX_pixel_texture; - continue; - } -#endif -#ifdef GL_SGIX_pixel_texture_bits - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture_bits", 18)) - { - ret = GLEW_SGIX_pixel_texture_bits; - continue; - } -#endif -#ifdef GL_SGIX_reference_plane - if (_glewStrSame3(&pos, &len, (const GLubyte*)"reference_plane", 15)) - { - ret = GLEW_SGIX_reference_plane; - continue; - } -#endif -#ifdef GL_SGIX_resample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"resample", 8)) - { - ret = GLEW_SGIX_resample; - continue; - } -#endif -#ifdef GL_SGIX_shadow - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow", 6)) - { - ret = GLEW_SGIX_shadow; - continue; - } -#endif -#ifdef GL_SGIX_shadow_ambient - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_ambient", 14)) - { - ret = GLEW_SGIX_shadow_ambient; - continue; - } -#endif -#ifdef GL_SGIX_sprite - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sprite", 6)) - { - ret = GLEW_SGIX_sprite; - continue; - } -#endif -#ifdef GL_SGIX_tag_sample_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"tag_sample_buffer", 17)) - { - ret = GLEW_SGIX_tag_sample_buffer; - continue; - } -#endif -#ifdef GL_SGIX_texture_add_env - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_add_env", 15)) - { - ret = GLEW_SGIX_texture_add_env; - continue; - } -#endif -#ifdef GL_SGIX_texture_coordinate_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_coordinate_clamp", 24)) - { - ret = GLEW_SGIX_texture_coordinate_clamp; - continue; - } -#endif -#ifdef GL_SGIX_texture_lod_bias - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod_bias", 16)) - { - ret = GLEW_SGIX_texture_lod_bias; - continue; - } -#endif -#ifdef GL_SGIX_texture_multi_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multi_buffer", 20)) - { - ret = GLEW_SGIX_texture_multi_buffer; - continue; - } -#endif -#ifdef GL_SGIX_texture_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_range", 13)) - { - ret = GLEW_SGIX_texture_range; - continue; - } -#endif -#ifdef GL_SGIX_texture_scale_bias - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_scale_bias", 18)) - { - ret = GLEW_SGIX_texture_scale_bias; - continue; - } -#endif -#ifdef GL_SGIX_vertex_preclip - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_preclip", 14)) - { - ret = GLEW_SGIX_vertex_preclip; - continue; - } -#endif -#ifdef GL_SGIX_vertex_preclip_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_preclip_hint", 19)) - { - ret = GLEW_SGIX_vertex_preclip_hint; - continue; - } -#endif -#ifdef GL_SGIX_ycrcb - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycrcb", 5)) - { - ret = GLEW_SGIX_ycrcb; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGI_", 4)) - { -#ifdef GL_SGI_color_matrix - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_matrix", 12)) - { - ret = GLEW_SGI_color_matrix; - continue; - } -#endif -#ifdef GL_SGI_color_table - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_table", 11)) - { - ret = GLEW_SGI_color_table; - continue; - } -#endif -#ifdef GL_SGI_texture_color_table - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_color_table", 19)) - { - ret = GLEW_SGI_texture_color_table; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUNX_", 5)) - { -#ifdef GL_SUNX_constant_data - if (_glewStrSame3(&pos, &len, (const GLubyte*)"constant_data", 13)) - { - ret = GLEW_SUNX_constant_data; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUN_", 4)) - { -#ifdef GL_SUN_convolution_border_modes - if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_border_modes", 24)) - { - ret = GLEW_SUN_convolution_border_modes; - continue; - } -#endif -#ifdef GL_SUN_global_alpha - if (_glewStrSame3(&pos, &len, (const GLubyte*)"global_alpha", 12)) - { - ret = GLEW_SUN_global_alpha; - continue; - } -#endif -#ifdef GL_SUN_mesh_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"mesh_array", 10)) - { - ret = GLEW_SUN_mesh_array; - continue; - } -#endif -#ifdef GL_SUN_read_video_pixels - if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_video_pixels", 17)) - { - ret = GLEW_SUN_read_video_pixels; - continue; - } -#endif -#ifdef GL_SUN_slice_accum - if (_glewStrSame3(&pos, &len, (const GLubyte*)"slice_accum", 11)) - { - ret = GLEW_SUN_slice_accum; - continue; - } -#endif -#ifdef GL_SUN_triangle_list - if (_glewStrSame3(&pos, &len, (const GLubyte*)"triangle_list", 13)) - { - ret = GLEW_SUN_triangle_list; - continue; - } -#endif -#ifdef GL_SUN_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex", 6)) - { - ret = GLEW_SUN_vertex; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"WIN_", 4)) - { -#ifdef GL_WIN_phong_shading - if (_glewStrSame3(&pos, &len, (const GLubyte*)"phong_shading", 13)) - { - ret = GLEW_WIN_phong_shading; - continue; - } -#endif -#ifdef GL_WIN_specular_fog - if (_glewStrSame3(&pos, &len, (const GLubyte*)"specular_fog", 12)) - { - ret = GLEW_WIN_specular_fog; - continue; - } -#endif -#ifdef GL_WIN_swap_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_hint", 9)) - { - ret = GLEW_WIN_swap_hint; - continue; - } -#endif - } - } - ret = (len == 0); - } - return ret; -} - -#if defined(_WIN32) - -#if defined(GLEW_MX) -GLboolean GLEWAPIENTRY wglewContextIsSupported (const WGLEWContext* ctx, const char* name) -#else -GLboolean GLEWAPIENTRY wglewIsSupported (const char* name) -#endif -{ - const GLubyte* pos = (const GLubyte*)name; - GLuint len = _glewStrLen(pos); - GLboolean ret = GL_TRUE; - while (ret && len > 0) - { - if (_glewStrSame1(&pos, &len, (const GLubyte*)"WGL_", 4)) - { - if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) - { -#ifdef WGL_3DFX_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = WGLEW_3DFX_multisample; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DL_", 4)) - { -#ifdef WGL_3DL_stereo_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stereo_control", 14)) - { - ret = WGLEW_3DL_stereo_control; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) - { -#ifdef WGL_AMD_gpu_association - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_association", 15)) - { - ret = WGLEW_AMD_gpu_association; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) - { -#ifdef WGL_ARB_buffer_region - if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_region", 13)) - { - ret = WGLEW_ARB_buffer_region; - continue; - } -#endif -#ifdef WGL_ARB_context_flush_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) - { - ret = WGLEW_ARB_context_flush_control; - continue; - } -#endif -#ifdef WGL_ARB_create_context - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context", 14)) - { - ret = WGLEW_ARB_create_context; - continue; - } -#endif -#ifdef WGL_ARB_create_context_profile - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_profile", 22)) - { - ret = WGLEW_ARB_create_context_profile; - continue; - } -#endif -#ifdef WGL_ARB_create_context_robustness - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25)) - { - ret = WGLEW_ARB_create_context_robustness; - continue; - } -#endif -#ifdef WGL_ARB_extensions_string - if (_glewStrSame3(&pos, &len, (const GLubyte*)"extensions_string", 17)) - { - ret = WGLEW_ARB_extensions_string; - continue; - } -#endif -#ifdef WGL_ARB_framebuffer_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) - { - ret = WGLEW_ARB_framebuffer_sRGB; - continue; - } -#endif -#ifdef WGL_ARB_make_current_read - if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) - { - ret = WGLEW_ARB_make_current_read; - continue; - } -#endif -#ifdef WGL_ARB_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = WGLEW_ARB_multisample; - continue; - } -#endif -#ifdef WGL_ARB_pbuffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) - { - ret = WGLEW_ARB_pbuffer; - continue; - } -#endif -#ifdef WGL_ARB_pixel_format - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format", 12)) - { - ret = WGLEW_ARB_pixel_format; - continue; - } -#endif -#ifdef WGL_ARB_pixel_format_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) - { - ret = WGLEW_ARB_pixel_format_float; - continue; - } -#endif -#ifdef WGL_ARB_render_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture", 14)) - { - ret = WGLEW_ARB_render_texture; - continue; - } -#endif -#ifdef WGL_ARB_robustness_application_isolation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) - { - ret = WGLEW_ARB_robustness_application_isolation; - continue; - } -#endif -#ifdef WGL_ARB_robustness_share_group_isolation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) - { - ret = WGLEW_ARB_robustness_share_group_isolation; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) - { -#ifdef WGL_ATI_pixel_format_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) - { - ret = WGLEW_ATI_pixel_format_float; - continue; - } -#endif -#ifdef WGL_ATI_render_texture_rectangle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture_rectangle", 24)) - { - ret = WGLEW_ATI_render_texture_rectangle; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) - { -#ifdef WGL_EXT_create_context_es2_profile - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es2_profile", 26)) - { - ret = WGLEW_EXT_create_context_es2_profile; - continue; - } -#endif -#ifdef WGL_EXT_create_context_es_profile - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es_profile", 25)) - { - ret = WGLEW_EXT_create_context_es_profile; - continue; - } -#endif -#ifdef WGL_EXT_depth_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_float", 11)) - { - ret = WGLEW_EXT_depth_float; - continue; - } -#endif -#ifdef WGL_EXT_display_color_table - if (_glewStrSame3(&pos, &len, (const GLubyte*)"display_color_table", 19)) - { - ret = WGLEW_EXT_display_color_table; - continue; - } -#endif -#ifdef WGL_EXT_extensions_string - if (_glewStrSame3(&pos, &len, (const GLubyte*)"extensions_string", 17)) - { - ret = WGLEW_EXT_extensions_string; - continue; - } -#endif -#ifdef WGL_EXT_framebuffer_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) - { - ret = WGLEW_EXT_framebuffer_sRGB; - continue; - } -#endif -#ifdef WGL_EXT_make_current_read - if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) - { - ret = WGLEW_EXT_make_current_read; - continue; - } -#endif -#ifdef WGL_EXT_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = WGLEW_EXT_multisample; - continue; - } -#endif -#ifdef WGL_EXT_pbuffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) - { - ret = WGLEW_EXT_pbuffer; - continue; - } -#endif -#ifdef WGL_EXT_pixel_format - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format", 12)) - { - ret = WGLEW_EXT_pixel_format; - continue; - } -#endif -#ifdef WGL_EXT_pixel_format_packed_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_packed_float", 25)) - { - ret = WGLEW_EXT_pixel_format_packed_float; - continue; - } -#endif -#ifdef WGL_EXT_swap_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) - { - ret = WGLEW_EXT_swap_control; - continue; - } -#endif -#ifdef WGL_EXT_swap_control_tear - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control_tear", 17)) - { - ret = WGLEW_EXT_swap_control_tear; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"I3D_", 4)) - { -#ifdef WGL_I3D_digital_video_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"digital_video_control", 21)) - { - ret = WGLEW_I3D_digital_video_control; - continue; - } -#endif -#ifdef WGL_I3D_gamma - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gamma", 5)) - { - ret = WGLEW_I3D_gamma; - continue; - } -#endif -#ifdef WGL_I3D_genlock - if (_glewStrSame3(&pos, &len, (const GLubyte*)"genlock", 7)) - { - ret = WGLEW_I3D_genlock; - continue; - } -#endif -#ifdef WGL_I3D_image_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_buffer", 12)) - { - ret = WGLEW_I3D_image_buffer; - continue; - } -#endif -#ifdef WGL_I3D_swap_frame_lock - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_frame_lock", 15)) - { - ret = WGLEW_I3D_swap_frame_lock; - continue; - } -#endif -#ifdef WGL_I3D_swap_frame_usage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_frame_usage", 16)) - { - ret = WGLEW_I3D_swap_frame_usage; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) - { -#ifdef WGL_NV_DX_interop - if (_glewStrSame3(&pos, &len, (const GLubyte*)"DX_interop", 10)) - { - ret = WGLEW_NV_DX_interop; - continue; - } -#endif -#ifdef WGL_NV_DX_interop2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"DX_interop2", 11)) - { - ret = WGLEW_NV_DX_interop2; - continue; - } -#endif -#ifdef WGL_NV_copy_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) - { - ret = WGLEW_NV_copy_image; - continue; - } -#endif -#ifdef WGL_NV_delay_before_swap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"delay_before_swap", 17)) - { - ret = WGLEW_NV_delay_before_swap; - continue; - } -#endif -#ifdef WGL_NV_float_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) - { - ret = WGLEW_NV_float_buffer; - continue; - } -#endif -#ifdef WGL_NV_gpu_affinity - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_affinity", 12)) - { - ret = WGLEW_NV_gpu_affinity; - continue; - } -#endif -#ifdef WGL_NV_multisample_coverage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) - { - ret = WGLEW_NV_multisample_coverage; - continue; - } -#endif -#ifdef WGL_NV_present_video - if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) - { - ret = WGLEW_NV_present_video; - continue; - } -#endif -#ifdef WGL_NV_render_depth_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_depth_texture", 20)) - { - ret = WGLEW_NV_render_depth_texture; - continue; - } -#endif -#ifdef WGL_NV_render_texture_rectangle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture_rectangle", 24)) - { - ret = WGLEW_NV_render_texture_rectangle; - continue; - } -#endif -#ifdef WGL_NV_swap_group - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) - { - ret = WGLEW_NV_swap_group; - continue; - } -#endif -#ifdef WGL_NV_vertex_array_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) - { - ret = WGLEW_NV_vertex_array_range; - continue; - } -#endif -#ifdef WGL_NV_video_capture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) - { - ret = WGLEW_NV_video_capture; - continue; - } -#endif -#ifdef WGL_NV_video_output - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_output", 12)) - { - ret = WGLEW_NV_video_output; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) - { -#ifdef WGL_OML_sync_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync_control", 12)) - { - ret = WGLEW_OML_sync_control; - continue; - } -#endif - } - } - ret = (len == 0); - } - return ret; -} - -#elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) - -#if defined(GLEW_MX) -GLboolean glxewContextIsSupported (const GLXEWContext* ctx, const char* name) -#else -GLboolean glxewIsSupported (const char* name) -#endif -{ - const GLubyte* pos = (const GLubyte*)name; - GLuint len = _glewStrLen(pos); - GLboolean ret = GL_TRUE; - while (ret && len > 0) - { - if(_glewStrSame1(&pos, &len, (const GLubyte*)"GLX_", 4)) - { - if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) - { -#ifdef GLX_VERSION_1_2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) - { - ret = GLXEW_VERSION_1_2; - continue; - } -#endif -#ifdef GLX_VERSION_1_3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) - { - ret = GLXEW_VERSION_1_3; - continue; - } -#endif -#ifdef GLX_VERSION_1_4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) - { - ret = GLXEW_VERSION_1_4; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) - { -#ifdef GLX_3DFX_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLXEW_3DFX_multisample; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) - { -#ifdef GLX_AMD_gpu_association - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_association", 15)) - { - ret = GLXEW_AMD_gpu_association; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) - { -#ifdef GLX_ARB_context_flush_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) - { - ret = GLXEW_ARB_context_flush_control; - continue; - } -#endif -#ifdef GLX_ARB_create_context - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context", 14)) - { - ret = GLXEW_ARB_create_context; - continue; - } -#endif -#ifdef GLX_ARB_create_context_profile - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_profile", 22)) - { - ret = GLXEW_ARB_create_context_profile; - continue; - } -#endif -#ifdef GLX_ARB_create_context_robustness - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25)) - { - ret = GLXEW_ARB_create_context_robustness; - continue; - } -#endif -#ifdef GLX_ARB_fbconfig_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig_float", 14)) - { - ret = GLXEW_ARB_fbconfig_float; - continue; - } -#endif -#ifdef GLX_ARB_framebuffer_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) - { - ret = GLXEW_ARB_framebuffer_sRGB; - continue; - } -#endif -#ifdef GLX_ARB_get_proc_address - if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_proc_address", 16)) - { - ret = GLXEW_ARB_get_proc_address; - continue; - } -#endif -#ifdef GLX_ARB_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLXEW_ARB_multisample; - continue; - } -#endif -#ifdef GLX_ARB_robustness_application_isolation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) - { - ret = GLXEW_ARB_robustness_application_isolation; - continue; - } -#endif -#ifdef GLX_ARB_robustness_share_group_isolation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) - { - ret = GLXEW_ARB_robustness_share_group_isolation; - continue; - } -#endif -#ifdef GLX_ARB_vertex_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_object", 20)) - { - ret = GLXEW_ARB_vertex_buffer_object; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) - { -#ifdef GLX_ATI_pixel_format_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) - { - ret = GLXEW_ATI_pixel_format_float; - continue; - } -#endif -#ifdef GLX_ATI_render_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture", 14)) - { - ret = GLXEW_ATI_render_texture; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) - { -#ifdef GLX_EXT_buffer_age - if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_age", 10)) - { - ret = GLXEW_EXT_buffer_age; - continue; - } -#endif -#ifdef GLX_EXT_create_context_es2_profile - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es2_profile", 26)) - { - ret = GLXEW_EXT_create_context_es2_profile; - continue; - } -#endif -#ifdef GLX_EXT_create_context_es_profile - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es_profile", 25)) - { - ret = GLXEW_EXT_create_context_es_profile; - continue; - } -#endif -#ifdef GLX_EXT_fbconfig_packed_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig_packed_float", 21)) - { - ret = GLXEW_EXT_fbconfig_packed_float; - continue; - } -#endif -#ifdef GLX_EXT_framebuffer_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) - { - ret = GLXEW_EXT_framebuffer_sRGB; - continue; - } -#endif -#ifdef GLX_EXT_import_context - if (_glewStrSame3(&pos, &len, (const GLubyte*)"import_context", 14)) - { - ret = GLXEW_EXT_import_context; - continue; - } -#endif -#ifdef GLX_EXT_scene_marker - if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_marker", 12)) - { - ret = GLXEW_EXT_scene_marker; - continue; - } -#endif -#ifdef GLX_EXT_stereo_tree - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stereo_tree", 11)) - { - ret = GLXEW_EXT_stereo_tree; - continue; - } -#endif -#ifdef GLX_EXT_swap_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) - { - ret = GLXEW_EXT_swap_control; - continue; - } -#endif -#ifdef GLX_EXT_swap_control_tear - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control_tear", 17)) - { - ret = GLXEW_EXT_swap_control_tear; - continue; - } -#endif -#ifdef GLX_EXT_texture_from_pixmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_from_pixmap", 19)) - { - ret = GLXEW_EXT_texture_from_pixmap; - continue; - } -#endif -#ifdef GLX_EXT_visual_info - if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_info", 11)) - { - ret = GLXEW_EXT_visual_info; - continue; - } -#endif -#ifdef GLX_EXT_visual_rating - if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_rating", 13)) - { - ret = GLXEW_EXT_visual_rating; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"INTEL_", 6)) - { -#ifdef GLX_INTEL_swap_event - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_event", 10)) - { - ret = GLXEW_INTEL_swap_event; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) - { -#ifdef GLX_MESA_agp_offset - if (_glewStrSame3(&pos, &len, (const GLubyte*)"agp_offset", 10)) - { - ret = GLXEW_MESA_agp_offset; - continue; - } -#endif -#ifdef GLX_MESA_copy_sub_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_sub_buffer", 15)) - { - ret = GLXEW_MESA_copy_sub_buffer; - continue; - } -#endif -#ifdef GLX_MESA_pixmap_colormap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixmap_colormap", 15)) - { - ret = GLXEW_MESA_pixmap_colormap; - continue; - } -#endif -#ifdef GLX_MESA_query_renderer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_renderer", 14)) - { - ret = GLXEW_MESA_query_renderer; - continue; - } -#endif -#ifdef GLX_MESA_release_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"release_buffers", 15)) - { - ret = GLXEW_MESA_release_buffers; - continue; - } -#endif -#ifdef GLX_MESA_set_3dfx_mode - if (_glewStrSame3(&pos, &len, (const GLubyte*)"set_3dfx_mode", 13)) - { - ret = GLXEW_MESA_set_3dfx_mode; - continue; - } -#endif -#ifdef GLX_MESA_swap_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) - { - ret = GLXEW_MESA_swap_control; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) - { -#ifdef GLX_NV_copy_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_buffer", 11)) - { - ret = GLXEW_NV_copy_buffer; - continue; - } -#endif -#ifdef GLX_NV_copy_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) - { - ret = GLXEW_NV_copy_image; - continue; - } -#endif -#ifdef GLX_NV_delay_before_swap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"delay_before_swap", 17)) - { - ret = GLXEW_NV_delay_before_swap; - continue; - } -#endif -#ifdef GLX_NV_float_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) - { - ret = GLXEW_NV_float_buffer; - continue; - } -#endif -#ifdef GLX_NV_multisample_coverage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) - { - ret = GLXEW_NV_multisample_coverage; - continue; - } -#endif -#ifdef GLX_NV_present_video - if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) - { - ret = GLXEW_NV_present_video; - continue; - } -#endif -#ifdef GLX_NV_swap_group - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) - { - ret = GLXEW_NV_swap_group; - continue; - } -#endif -#ifdef GLX_NV_vertex_array_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) - { - ret = GLXEW_NV_vertex_array_range; - continue; - } -#endif -#ifdef GLX_NV_video_capture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) - { - ret = GLXEW_NV_video_capture; - continue; - } -#endif -#ifdef GLX_NV_video_out - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_out", 9)) - { - ret = GLXEW_NV_video_out; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) - { -#ifdef GLX_OML_swap_method - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_method", 11)) - { - ret = GLXEW_OML_swap_method; - continue; - } -#endif -#ifdef GLX_OML_sync_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync_control", 12)) - { - ret = GLXEW_OML_sync_control; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIS_", 5)) - { -#ifdef GLX_SGIS_blended_overlay - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blended_overlay", 15)) - { - ret = GLXEW_SGIS_blended_overlay; - continue; - } -#endif -#ifdef GLX_SGIS_color_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_range", 11)) - { - ret = GLXEW_SGIS_color_range; - continue; - } -#endif -#ifdef GLX_SGIS_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLXEW_SGIS_multisample; - continue; - } -#endif -#ifdef GLX_SGIS_shared_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_multisample", 18)) - { - ret = GLXEW_SGIS_shared_multisample; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIX_", 5)) - { -#ifdef GLX_SGIX_fbconfig - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig", 8)) - { - ret = GLXEW_SGIX_fbconfig; - continue; - } -#endif -#ifdef GLX_SGIX_hyperpipe - if (_glewStrSame3(&pos, &len, (const GLubyte*)"hyperpipe", 9)) - { - ret = GLXEW_SGIX_hyperpipe; - continue; - } -#endif -#ifdef GLX_SGIX_pbuffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) - { - ret = GLXEW_SGIX_pbuffer; - continue; - } -#endif -#ifdef GLX_SGIX_swap_barrier - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_barrier", 12)) - { - ret = GLXEW_SGIX_swap_barrier; - continue; - } -#endif -#ifdef GLX_SGIX_swap_group - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) - { - ret = GLXEW_SGIX_swap_group; - continue; - } -#endif -#ifdef GLX_SGIX_video_resize - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_resize", 12)) - { - ret = GLXEW_SGIX_video_resize; - continue; - } -#endif -#ifdef GLX_SGIX_visual_select_group - if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_select_group", 19)) - { - ret = GLXEW_SGIX_visual_select_group; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGI_", 4)) - { -#ifdef GLX_SGI_cushion - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cushion", 7)) - { - ret = GLXEW_SGI_cushion; - continue; - } -#endif -#ifdef GLX_SGI_make_current_read - if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) - { - ret = GLXEW_SGI_make_current_read; - continue; - } -#endif -#ifdef GLX_SGI_swap_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) - { - ret = GLXEW_SGI_swap_control; - continue; - } -#endif -#ifdef GLX_SGI_video_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_sync", 10)) - { - ret = GLXEW_SGI_video_sync; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUN_", 4)) - { -#ifdef GLX_SUN_get_transparent_index - if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_transparent_index", 21)) - { - ret = GLXEW_SUN_get_transparent_index; - continue; - } -#endif -#ifdef GLX_SUN_video_resize - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_resize", 12)) - { - ret = GLXEW_SUN_video_resize; - continue; - } -#endif - } - } - ret = (len == 0); - } - return ret; -} - -#endif /* _WIN32 */ - -#endif /* SLIC3R_GUI */ diff --git a/deps/NanoSVG/NanoSVG.cmake b/deps/NanoSVG/NanoSVG.cmake new file mode 100644 index 00000000000..1b0fb9960f1 --- /dev/null +++ b/deps/NanoSVG/NanoSVG.cmake @@ -0,0 +1,9 @@ +# In PrusaSlicer 2.6.0 we switched from https://github.com/memononen/nanosvg to its fork https://github.com/fltk/nanosvg +# because this last implements the new function nsvgRasterizeXY() which we now use in GLTexture::load_from_svg() +# for rasterizing svg files from their original size to a squared power of two texture on Windows systems using +# AMD Radeon graphics cards + +prusaslicer_add_cmake_project(NanoSVG + URL https://github.com/fltk/nanosvg/archive/abcd277ea45e9098bed752cf9c6875b533c0892f.zip + URL_HASH SHA256=e859938fbaee4b351bd8a8b3d3c7a75b40c36885ce00b73faa1ce0b98aa0ad34 +) \ No newline at end of file diff --git a/deps/OCCT/OCCT.cmake b/deps/OCCT/OCCT.cmake index 9981ac15ee9..efb529a5aa2 100644 --- a/deps/OCCT/OCCT.cmake +++ b/deps/OCCT/OCCT.cmake @@ -3,6 +3,7 @@ prusaslicer_add_cmake_project(OCCT URL https://github.com/Open-Cascade-SAS/OCCT/archive/refs/tags/V7_6_2.zip URL_HASH SHA256=c696b923593e8c18d059709717dbf155b3e72fdd283c8522047a790ec3a432c5 + PATCH_COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/occt_toolkit.cmake ./adm/cmake/ CMAKE_ARGS -DINSTALL_DIR_LAYOUT=Unix # LMBBS -DBUILD_LIBRARY_TYPE=Static @@ -20,3 +21,7 @@ prusaslicer_add_cmake_project(OCCT -DBUILD_MODULE_ModelingData=OFF -DBUILD_MODULE_Visualization=OFF ) + +if (MSVC) + add_debug_dep(dep_OCCT) +endif () diff --git a/deps/OCCT/occt_toolkit.cmake b/deps/OCCT/occt_toolkit.cmake new file mode 100644 index 00000000000..1b77eb1b290 --- /dev/null +++ b/deps/OCCT/occt_toolkit.cmake @@ -0,0 +1,453 @@ +# script for each OCCT toolkit + +# filling some variables by default values(src) or using custom(tools, samples) +set (RELATIVE_SOURCES_DIR "${RELATIVE_DIR}") +if ("${RELATIVE_SOURCES_DIR}" STREQUAL "") + #if it is not defined, use default directory + set (RELATIVE_SOURCES_DIR "src") +endif() + +set (OCC_MODULES_LIST "${MODULES_LIST}") +if ("${OCC_MODULES_LIST}" STREQUAL "") + set (OCC_MODULES_LIST ${OCCT_MODULES}) +endif() + +set (OCC_TARGET_FOLDER "${TARGET_FOLDER}") +if ("${OCC_TARGET_FOLDER}" STREQUAL "") + set (OCC_TARGET_FOLDER "Modules") +endif() + +set (OCCT_TOOLKITS_NAME_SUFFIX "${TOOLKITS_NAME_SUFFIX}") +if ("${OCCT_TOOLKITS_NAME_SUFFIX}" STREQUAL "") + set (OCCT_TOOLKITS_NAME_SUFFIX "TOOLKITS") +endif() + +# parse PACKAGES file +FILE_TO_LIST ("${RELATIVE_SOURCES_DIR}/${PROJECT_NAME}/PACKAGES" USED_PACKAGES) +if ("${USED_PACKAGES}" STREQUAL "") + set (USED_PACKAGES ${PROJECT_NAME}) +endif() + +if (USE_QT) + # Qt dependencies + OCCT_INCLUDE_CMAKE_FILE (adm/cmake/qt_macro) + FIND_QT_PACKAGE(PROJECT_LIBRARIES_DEBUG PROJECT_LIBRARIES_RELEASE PROJECT_INCLUDES) + include_directories("${PROJECT_INCLUDES}") +endif(USE_QT) + +set (PRECOMPILED_DEFS) + +if (NOT BUILD_SHARED_LIBS) + list (APPEND PRECOMPILED_DEFS "-DOCCT_NO_PLUGINS") + if (WIN32 AND NOT EXECUTABLE_PROJECT) + list (APPEND PRECOMPILED_DEFS "-DOCCT_STATIC_BUILD") + endif() +endif() + +# Get all used packages from toolkit +UNSET(RESOURCE_FILES) +foreach (OCCT_PACKAGE ${USED_PACKAGES}) + + #remove part after "/" in the OCCT_PACKAGE variable if exists + string (FIND "${OCCT_PACKAGE}" "/" _index) + if (_index GREATER -1) + math (EXPR _index "${_index}") + string (SUBSTRING "${OCCT_PACKAGE}" 0 ${_index} OCCT_PACKAGE_NAME) + else() + set (OCCT_PACKAGE_NAME "${OCCT_PACKAGE}") + endif() + + if (WIN32) + list (APPEND PRECOMPILED_DEFS "-D__${OCCT_PACKAGE_NAME}_DLL") + endif() + + set (SOURCE_FILES) + set (HEADER_FILES) + + # Generate Flex and Bison files + if (${BUILD_YACCLEX}) + # flex files + OCCT_ORIGIN_AND_PATCHED_FILES ("${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}" "*[.]lex" SOURCE_FILES_FLEX) + list (LENGTH SOURCE_FILES_FLEX SOURCE_FILES_FLEX_LEN) + + # bison files + OCCT_ORIGIN_AND_PATCHED_FILES ("${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}" "*[.]yacc" SOURCE_FILES_BISON) + list (LENGTH SOURCE_FILES_BISON SOURCE_FILES_BISON_LEN) + + if (${SOURCE_FILES_FLEX_LEN} EQUAL ${SOURCE_FILES_BISON_LEN} AND NOT ${SOURCE_FILES_FLEX_LEN} EQUAL 0) + + list (SORT SOURCE_FILES_FLEX) + list (SORT SOURCE_FILES_BISON) + + math (EXPR SOURCE_FILES_FLEX_LEN "${SOURCE_FILES_FLEX_LEN} - 1") + foreach (FLEX_FILE_INDEX RANGE ${SOURCE_FILES_FLEX_LEN}) + + list (GET SOURCE_FILES_FLEX ${FLEX_FILE_INDEX} CURRENT_FLEX_FILE) + get_filename_component (CURRENT_FLEX_FILE_NAME ${CURRENT_FLEX_FILE} NAME_WE) + + list (GET SOURCE_FILES_BISON ${FLEX_FILE_INDEX} CURRENT_BISON_FILE) + get_filename_component (CURRENT_BISON_FILE_NAME ${CURRENT_BISON_FILE} NAME_WE) + + string (COMPARE EQUAL ${CURRENT_FLEX_FILE_NAME} ${CURRENT_BISON_FILE_NAME} ARE_FILES_EQUAL) + + if (EXISTS "${CURRENT_FLEX_FILE}" AND EXISTS "${CURRENT_BISON_FILE}" AND ${ARE_FILES_EQUAL}) + + # Note: files are generated in original source directory (not in patch!) + set (FLEX_BISON_TARGET_DIR "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}") + + # choose appropriate extension for generated files: "cxx" if source file contains + # instruction to generate C++ code, "c" otherwise + set (BISON_OUTPUT_FILE_EXT "c") + set (FLEX_OUTPUT_FILE_EXT "c") + file (STRINGS "${CURRENT_BISON_FILE}" FILE_BISON_CONTENT) + foreach (FILE_BISON_CONTENT_LINE ${FILE_BISON_CONTENT}) + string (REGEX MATCH "%language \"C\\+\\+\"" CXX_BISON_LANGUAGE_FOUND ${FILE_BISON_CONTENT_LINE}) + if (CXX_BISON_LANGUAGE_FOUND) + set (BISON_OUTPUT_FILE_EXT "cxx") + endif() + endforeach() + file (STRINGS "${CURRENT_FLEX_FILE}" FILE_FLEX_CONTENT) + foreach (FILE_FLEX_CONTENT_LINE ${FILE_FLEX_CONTENT}) + string (REGEX MATCH "%option c\\+\\+" CXX_FLEX_LANGUAGE_FOUND ${FILE_FLEX_CONTENT_LINE}) + if (CXX_FLEX_LANGUAGE_FOUND) + set (FLEX_OUTPUT_FILE_EXT "cxx") + + # install copy of FlexLexer.h locally to allow further building without flex + if (FLEX_INCLUDE_DIR AND EXISTS "${FLEX_INCLUDE_DIR}/FlexLexer.h") + configure_file("${FLEX_INCLUDE_DIR}/FlexLexer.h" "${FLEX_BISON_TARGET_DIR}/FlexLexer.h" @ONLY NEWLINE_STYLE LF) + endif() + endif() + endforeach() + set (BISON_OUTPUT_FILE ${CURRENT_BISON_FILE_NAME}.tab.${BISON_OUTPUT_FILE_EXT}) + set (FLEX_OUTPUT_FILE lex.${CURRENT_FLEX_FILE_NAME}.${FLEX_OUTPUT_FILE_EXT}) + + BISON_TARGET (Parser_${CURRENT_BISON_FILE_NAME} ${CURRENT_BISON_FILE} "${FLEX_BISON_TARGET_DIR}/${BISON_OUTPUT_FILE}" + COMPILE_FLAGS "-p ${CURRENT_BISON_FILE_NAME} -l -M ${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/=") + FLEX_TARGET (Scanner_${CURRENT_FLEX_FILE_NAME} ${CURRENT_FLEX_FILE} "${FLEX_BISON_TARGET_DIR}/${FLEX_OUTPUT_FILE}" + COMPILE_FLAGS "-P${CURRENT_FLEX_FILE_NAME} -L") + ADD_FLEX_BISON_DEPENDENCY (Scanner_${CURRENT_FLEX_FILE_NAME} Parser_${CURRENT_BISON_FILE_NAME}) + + list (APPEND SOURCE_FILES ${BISON_OUTPUT_FILE} ${FLEX_OUTPUT_FILE}) + endif() + endforeach() + endif() + endif() + + # header files + if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES") + file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_M REGEX ".+[.]h") + file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_LXX REGEX ".+[.]lxx") + file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_GXX REGEX ".+[.]gxx") + + file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_C REGEX ".+[.]c") + if(APPLE) + file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_M REGEX ".+[.]mm") + endif() + else() + file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_M REGEX ".+[.]h") + file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_LXX REGEX ".+[.]lxx") + file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_GXX REGEX ".+[.]gxx") + + file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_C REGEX ".+[.]c") + if(APPLE) + file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_M REGEX ".+[.]mm") + endif() + endif() + + list (APPEND HEADER_FILES ${HEADER_FILES_M} ${HEADER_FILES_LXX} ${SOURCE_FILES_GXX}) + list (APPEND SOURCE_FILES ${SOURCE_FILES_C}) + if(APPLE) + list (APPEND SOURCE_FILES ${SOURCE_FILES_M}) + endif() + + foreach(HEADER_FILE ${HEADER_FILES}) + if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") + message (STATUS "Info: consider patched file: ${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") + list (APPEND USED_INCFILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") + SOURCE_GROUP ("Header Files\\${OCCT_PACKAGE_NAME}" FILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") + else() + list (APPEND USED_INCFILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") + SOURCE_GROUP ("Header Files\\${OCCT_PACKAGE_NAME}" FILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") + endif() + endforeach() + + foreach(SOURCE_FILE ${SOURCE_FILES}) + if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") + message (STATUS "Info: consider patched file: ${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") + list (APPEND USED_SRCFILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") + SOURCE_GROUP ("Source Files\\${OCCT_PACKAGE_NAME}" FILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") + else() + list (APPEND USED_SRCFILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") + SOURCE_GROUP ("Source Files\\${OCCT_PACKAGE_NAME}" FILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") + endif() + endforeach() + + if (USE_QT) + FIND_AND_INSTALL_QT_RESOURCES (${OCCT_PACKAGE} RESOURCE_FILES) + #message("Qt Resource files are: ${QT_RESOURCE_FILES} in ${OCCT_PACKAGE}") + endif(USE_QT) + + #message("Resource files are: ${RESOURCE_FILES} in ${OCCT_PACKAGE}") + foreach(RESOURCE_FILE ${RESOURCE_FILES}) + SOURCE_GROUP ("Resource Files\\${OCCT_PACKAGE_NAME}" FILES "${RESOURCE_FILE}") + endforeach() +endforeach() +string (REGEX REPLACE ";" " " PRECOMPILED_DEFS "${PRECOMPILED_DEFS}") + +set (USED_RCFILE "") +if (MSVC) + set (USED_RCFILE "${CMAKE_BINARY_DIR}/resources/${PROJECT_NAME}.rc") + + if (APPLY_OCCT_PATCH_DIR AND EXISTS "${APPLY_OCCT_PATCH_DIR}/adm/templates/occt_toolkit.rc.in") + configure_file("${APPLY_OCCT_PATCH_DIR}/adm/templates/occt_toolkit.rc.in" "${USED_RCFILE}" @ONLY) + else() + configure_file("${CMAKE_SOURCE_DIR}/adm/templates/occt_toolkit.rc.in" "${USED_RCFILE}" @ONLY) + endif() +endif() + +set (CURRENT_MODULE) +foreach (OCCT_MODULE ${OCC_MODULES_LIST}) + list (FIND ${OCCT_MODULE}_${OCCT_TOOLKITS_NAME_SUFFIX} ${PROJECT_NAME} CURRENT_PROJECT_IS_BUILT) + + if (NOT ${CURRENT_PROJECT_IS_BUILT} EQUAL -1) + set (CURRENT_MODULE ${OCCT_MODULE}) + endif() +endforeach() + +if (MSVC) + OCCT_INSERT_CODE_FOR_TARGET () +endif() + +if (USE_QT) + FIND_AND_WRAP_MOC_FILES("${USED_INCFILES}" "${PROJECT_NAME}_MOC_FILES") + #message("MOC files: ${${PROJECT_NAME}_MOC_FILES}") +endif (USE_QT) + +if (EXECUTABLE_PROJECT) + add_executable (${PROJECT_NAME} ${USED_SRCFILES} ${USED_INCFILES} ${USED_RCFILE} ${RESOURCE_FILES} ${${PROJECT_NAME}_MOC_FILES}) + + install (TARGETS ${PROJECT_NAME} + DESTINATION "${INSTALL_DIR_BIN}\${OCCT_INSTALL_BIN_LETTER}") + + if (EMSCRIPTEN) + install(FILES ${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/bin\${OCCT_INSTALL_BIN_LETTER}/${PROJECT_NAME}.wasm DESTINATION "${INSTALL_DIR_BIN}/${OCCT_INSTALL_BIN_LETTER}") + endif() +else() + add_library (${PROJECT_NAME} ${USED_SRCFILES} ${USED_INCFILES} ${USED_RCFILE} ${RESOURCE_FILES} ${${PROJECT_NAME}_MOC_FILES}) + + if (MSVC) + if (BUILD_FORCE_RelWithDebInfo) + set (aReleasePdbConf "Release") + else() + set (aReleasePdbConf) + endif() + # install (FILES ${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/bin\${OCCT_INSTALL_BIN_LETTER}/${PROJECT_NAME}.pdb + # CONFIGURATIONS Debug ${aReleasePdbConf} RelWithDebInfo + # DESTINATION "${INSTALL_DIR_BIN}\${OCCT_INSTALL_BIN_LETTER}") + endif() + + if (BUILD_SHARED_LIBS AND NOT "${BUILD_SHARED_LIBRARY_NAME_POSTFIX}" STREQUAL "") + set (CMAKE_SHARED_LIBRARY_SUFFIX_DEFAULT ${CMAKE_SHARED_LIBRARY_SUFFIX}) + set (CMAKE_SHARED_LIBRARY_SUFFIX "${BUILD_SHARED_LIBRARY_NAME_POSTFIX}${CMAKE_SHARED_LIBRARY_SUFFIX}") + endif() + + install (TARGETS ${PROJECT_NAME} + EXPORT OpenCASCADE${CURRENT_MODULE}Targets + RUNTIME DESTINATION "${INSTALL_DIR_BIN}\${OCCT_INSTALL_BIN_LETTER}" + ARCHIVE DESTINATION "${INSTALL_DIR_LIB}\${OCCT_INSTALL_BIN_LETTER}" + LIBRARY DESTINATION "${INSTALL_DIR_LIB}\${OCCT_INSTALL_BIN_LETTER}") + + if (NOT WIN32) + if (BUILD_SHARED_LIBS AND NOT "${BUILD_SHARED_LIBRARY_NAME_POSTFIX}" STREQUAL "") + set (LINK_NAME "${INSTALL_DIR}/${INSTALL_DIR_LIB}\${OCCT_INSTALL_BIN_LETTER}/lib${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX_DEFAULT}") + set (LIBRARY_NAME "${INSTALL_DIR}/${INSTALL_DIR_LIB}\${OCCT_INSTALL_BIN_LETTER}/lib${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}") + OCCT_CREATE_SYMLINK_TO_FILE (${LIBRARY_NAME} ${LINK_NAME}) + endif() + endif() +endif() + +if (CURRENT_MODULE) + set_target_properties (${PROJECT_NAME} PROPERTIES FOLDER "${OCC_TARGET_FOLDER}/${CURRENT_MODULE}") + set_target_properties (${PROJECT_NAME} PROPERTIES MODULE "${CURRENT_MODULE}") + if (APPLE) + if (NOT "${INSTALL_NAME_DIR}" STREQUAL "") + set_target_properties (${PROJECT_NAME} PROPERTIES BUILD_WITH_INSTALL_RPATH 1 INSTALL_NAME_DIR "${INSTALL_NAME_DIR}") + endif() + endif() +endif() + +get_property (OCC_VERSION_MAJOR GLOBAL PROPERTY OCC_VERSION_MAJOR) +get_property (OCC_VERSION_MINOR GLOBAL PROPERTY OCC_VERSION_MINOR) +get_property (OCC_VERSION_MAINTENANCE GLOBAL PROPERTY OCC_VERSION_MAINTENANCE) + +if (ANDROID) + # do not append version to the filename + set_target_properties (${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "${PRECOMPILED_DEFS}") +else() + set_target_properties (${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "${PRECOMPILED_DEFS}" + SOVERSION "${OCC_VERSION_MAJOR}" + VERSION "${OCC_VERSION_MAJOR}.${OCC_VERSION_MINOR}.${OCC_VERSION_MAINTENANCE}") +endif() + +set (USED_TOOLKITS_BY_CURRENT_PROJECT) +set (USED_EXTERNAL_LIBS_BY_CURRENT_PROJECT) + +# parse EXTERNLIB file +if (CUSTOM_EXTERNLIB) + set (USED_EXTERNLIB_AND_TOOLKITS ${CUSTOM_EXTERNLIB}) +else() + FILE_TO_LIST ("${RELATIVE_SOURCES_DIR}/${PROJECT_NAME}/EXTERNLIB" USED_EXTERNLIB_AND_TOOLKITS) +endif() +foreach (USED_ITEM ${USED_EXTERNLIB_AND_TOOLKITS}) + string (REGEX MATCH "^ *#" COMMENT_FOUND ${USED_ITEM}) + if (NOT COMMENT_FOUND) + string (REGEX MATCH "^TK" TK_FOUND ${USED_ITEM}) + string (REGEX MATCH "^vtk" VTK_FOUND ${USED_ITEM}) + + if (NOT "${TK_FOUND}" STREQUAL "" OR NOT "${VTK_FOUND}" STREQUAL "") + list (APPEND USED_TOOLKITS_BY_CURRENT_PROJECT ${USED_ITEM}) + if (NOT "${VTK_FOUND}" STREQUAL "" AND BUILD_SHARED_LIBS AND INSTALL_VTK AND COMMAND OCCT_INSTALL_VTK) + OCCT_INSTALL_VTK(${USED_ITEM}) + endif() + else() + string (REGEX MATCH "^CSF_" CSF_FOUND ${USED_ITEM}) + if ("${CSF_FOUND}" STREQUAL "") + message (STATUS "Info: ${USED_ITEM} from ${PROJECT_NAME} skipped due to it is empty") + else() # get CSF_ value + set (CURRENT_CSF ${${USED_ITEM}}) + if (NOT "x${CURRENT_CSF}" STREQUAL "x") + if ("${CURRENT_CSF}" STREQUAL "CSF_OpenGlLibs") + add_definitions (-DHAVE_OPENGL) + endif() + if ("${CURRENT_CSF}" STREQUAL "CSF_OpenGlesLibs") + add_definitions (-DHAVE_GLES2) + endif() + + set (LIBRARY_FROM_CACHE 0) + separate_arguments (CURRENT_CSF) + foreach (CSF_LIBRARY ${CURRENT_CSF}) + string (TOLOWER "${CSF_LIBRARY}" CSF_LIBRARY) + string (REPLACE "+" "[+]" CSF_LIBRARY "${CSF_LIBRARY}") + string (REPLACE "." "" CSF_LIBRARY "${CSF_LIBRARY}") + get_cmake_property(ALL_CACHE_VARIABLES CACHE_VARIABLES) + string (REGEX MATCHALL "(^|;)3RDPARTY_[^;]+_LIBRARY[^;]*" ALL_CACHE_VARIABLES "${ALL_CACHE_VARIABLES}") + foreach (CACHE_VARIABLE ${ALL_CACHE_VARIABLES}) + set (CURRENT_CACHE_LIBRARY ${${CACHE_VARIABLE}}) + string (TOLOWER "${CACHE_VARIABLE}" CACHE_VARIABLE) + + if (EXISTS "${CURRENT_CACHE_LIBRARY}" AND NOT IS_DIRECTORY "${CURRENT_CACHE_LIBRARY}") + string (REGEX MATCH "_${CSF_LIBRARY}$" IS_ENDING "${CACHE_VARIABLE}") + string (REGEX MATCH "^([a-z]+)" CSF_WO_VERSION "${CSF_LIBRARY}") + string (REGEX MATCH "_${CSF_WO_VERSION}$" IS_ENDING_WO_VERSION "${CACHE_VARIABLE}") + if ("3rdparty_${CSF_LIBRARY}_library" STREQUAL "${CACHE_VARIABLE}" OR + "3rdparty_${CSF_WO_VERSION}_library" STREQUAL "${CACHE_VARIABLE}" OR + NOT "x${IS_ENDING}" STREQUAL "x" OR + NOT "x${IS_ENDING_WO_VERSION}" STREQUAL "x") + list (APPEND USED_EXTERNAL_LIBS_BY_CURRENT_PROJECT "${CURRENT_CACHE_LIBRARY}") + set (LIBRARY_FROM_CACHE 1) + endif() + endif() + endforeach() + endforeach() + + if (NOT ${LIBRARY_FROM_CACHE}) + # prepare a list from a string with whitespaces + separate_arguments (CURRENT_CSF) + list (APPEND USED_EXTERNAL_LIBS_BY_CURRENT_PROJECT ${CURRENT_CSF}) + endif() + endif() + endif() + endif() + endif() +endforeach() + +if (APPLE) + list (FIND USED_EXTERNAL_LIBS_BY_CURRENT_PROJECT X11 IS_X11_FOUND) + if (NOT ${IS_X11_FOUND} EQUAL -1) + find_package (X11 COMPONENTS X11) + if (NOT X11_FOUND) + message (STATUS "Warning: X11 is not found. It's required to install The XQuartz project: http://www.xquartz.org") + endif() + endif() +endif() + +# Update list of used VTK libraries if OpenGL2 Rendering BackEnd is used. +# Add VTK_OPENGL2_BACKEND definition. +if("${VTK_RENDERING_BACKEND}" STREQUAL "OpenGL2" OR IS_VTK_9XX) + add_definitions(-DVTK_OPENGL2_BACKEND) + foreach (VTK_EXCLUDE_LIBRARY vtkRenderingOpenGL vtkRenderingFreeTypeOpenGL) + list (FIND USED_TOOLKITS_BY_CURRENT_PROJECT "${VTK_EXCLUDE_LIBRARY}" IS_VTK_OPENGL_FOUND) + if (NOT ${IS_VTK_OPENGL_FOUND} EQUAL -1) + list (REMOVE_ITEM USED_TOOLKITS_BY_CURRENT_PROJECT ${VTK_EXCLUDE_LIBRARY}) + if (${VTK_EXCLUDE_LIBRARY} STREQUAL vtkRenderingOpenGL) + list (APPEND USED_TOOLKITS_BY_CURRENT_PROJECT vtkRenderingOpenGL2) + if(VTK_MAJOR_VERSION GREATER 6) + list (APPEND USED_TOOLKITS_BY_CURRENT_PROJECT vtkRenderingGL2PSOpenGL2) + endif() + endif() + endif() + endforeach() +else() + if(VTK_MAJOR_VERSION EQUAL 6 AND VTK_MINOR_VERSION GREATER 2 OR VTK_MAJOR_VERSION GREATER 6) + list (FIND USED_TOOLKITS_BY_CURRENT_PROJECT "vtkRenderingFreeTypeOpenGL" IS_VTK_RENDER_FREETYPE_FOUND) + if (NOT ${IS_VTK_RENDER_FREETYPE_FOUND} EQUAL -1) + list (REMOVE_ITEM USED_TOOLKITS_BY_CURRENT_PROJECT "vtkRenderingFreeTypeOpenGL") + endif() + endif() +endif() + +if (BUILD_SHARED_LIBS OR EXECUTABLE_PROJECT) + if(IS_VTK_9XX) + string (REGEX REPLACE "vtk" "VTK::" USED_TOOLKITS_BY_CURRENT_PROJECT "${USED_TOOLKITS_BY_CURRENT_PROJECT}") + endif() + target_link_libraries (${PROJECT_NAME} ${USED_TOOLKITS_BY_CURRENT_PROJECT} ${USED_EXTERNAL_LIBS_BY_CURRENT_PROJECT}) +endif() + +if (USE_QT) + foreach (PROJECT_LIBRARY_DEBUG ${PROJECT_LIBRARIES_DEBUG}) + target_link_libraries (${PROJECT_NAME} debug ${PROJECT_LIBRARY_DEBUG}) + endforeach() + foreach (PROJECT_LIBRARY_RELEASE ${PROJECT_LIBRARIES_RELEASE}) + target_link_libraries (${PROJECT_NAME} optimized ${PROJECT_LIBRARY_RELEASE}) + endforeach() +endif() + +# suppress deprecation warnings inside OCCT itself for old gcc versions with unavailable Standard_DISABLE_DEPRECATION_WARNINGS +if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.6.0) + add_definitions("-DOCCT_NO_DEPRECATED") + message (STATUS "Warning: internal deprecation warnings by Standard_DEPRECATED have been disabled due to old gcc version being used") + endif() +endif() + +# use Cotire to accelerate build via usage of precompiled headers +if (BUILD_USE_PCH) + if (WIN32) + # prevent definition of min and max macros through inclusion of Windows.h + # (for cotire builds) + add_definitions("-DNOMINMAX") + # avoid warnings on deprecated names from standard C library (see strsafe.h) + add_definitions("-DSTRSAFE_NO_DEPRECATE") + # avoid "std::Equal1" warning in QANCollection_Stl.cxx in debug mode + # suggesting using msvc "Checked Iterators" + add_definitions("-D_SCL_SECURE_NO_WARNINGS") + endif() + + # Exclude system-provided glext.h. + # These macros are already defined within OpenGl_GlFunctions.hxx, + # however we have to duplicate them here for building TKOpenGl with PCH. + add_definitions("-DGL_GLEXT_LEGACY") + add_definitions("-DGLX_GLXEXT_LEGACY") + + # workaround for old gcc + if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) + add_definitions("-D__STDC_CONSTANT_MACROS") + add_definitions("-D__STDC_FORMAT_MACROS") + endif() + + # unity builds are not used since they do not add speed but cause conflicts + # in TKV3d + set_target_properties(${PROJECT_NAME} PROPERTIES COTIRE_ADD_UNITY_BUILD FALSE) + + cotire(${PROJECT_NAME}) +endif() diff --git a/deps/OpenCSG/CMakeLists.txt.in b/deps/OpenCSG/CMakeLists.txt.in index 37da0f789b6..c4627adceea 100644 --- a/deps/OpenCSG/CMakeLists.txt.in +++ b/deps/OpenCSG/CMakeLists.txt.in @@ -11,7 +11,7 @@ endif() find_package(OpenGL REQUIRED) set(GLEW_VERBOSE ON) -find_package(GLEW 1.13.0 REQUIRED) +find_package(GLEW REQUIRED) set(_srcfiles src/area.cpp diff --git a/deps/deps-windows.cmake b/deps/deps-windows.cmake index 7288cfe6fae..aba6fcab499 100644 --- a/deps/deps-windows.cmake +++ b/deps/deps-windows.cmake @@ -15,6 +15,10 @@ elseif (MSVC_VERSION LESS 1930) # 1920-1929 = VS 16.0 (v142 toolset) set(DEP_VS_VER "16") set(DEP_BOOST_TOOLSET "msvc-14.2") +elseif (MSVC_VERSION LESS 1940) +# 1930-1939 = VS 17.0 (v143 toolset) + set(DEP_VS_VER "17") + set(DEP_BOOST_TOOLSET "msvc-14.3") else () message(FATAL_ERROR "Unsupported MSVC version") endif () diff --git a/deps/wxWidgets/wxWidgets.cmake b/deps/wxWidgets/wxWidgets.cmake index 1ca6735cc37..661ea766c76 100644 --- a/deps/wxWidgets/wxWidgets.cmake +++ b/deps/wxWidgets/wxWidgets.cmake @@ -1,5 +1,3 @@ -set(_wx_git_tag v3.1.4-patched) - set(_wx_toolkit "") if(CMAKE_SYSTEM_NAME STREQUAL "Linux") set(_gtk_ver 2) @@ -9,12 +7,15 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux") set(_wx_toolkit "-DwxBUILD_TOOLKIT=gtk${_gtk_ver}") endif() +set(_unicode_utf8 OFF) +if (UNIX AND NOT APPLE) # wxWidgets will not use char as the underlying type for wxString unless its forced to. + set (_unicode_utf8 ON) +endif() + prusaslicer_add_cmake_project(wxWidgets - # GIT_REPOSITORY "https://github.com/prusa3d/wxWidgets" - # GIT_TAG tm_cross_compile #${_wx_git_tag} - URL https://github.com/prusa3d/wxWidgets/archive/489f6118256853cf5b299d595868641938566cdb.zip - URL_HASH SHA256=5b22d465377cedd8044bba69bea958b248953fd3628c1de4913a84d4e6f6175b - DEPENDS ${PNG_PKG} ${ZLIB_PKG} ${EXPAT_PKG} dep_TIFF dep_JPEG + URL https://github.com/prusa3d/wxWidgets/archive/0b49beaacce17d90f0c370ecd73221abd089667a.zip + URL_HASH SHA256=8fa978a76d6bd811b30eecc5124186b9ad54290b820f3a354e85bfa9dae6a5ce + DEPENDS ${PNG_PKG} ${ZLIB_PKG} ${EXPAT_PKG} dep_TIFF dep_JPEG dep_NanoSVG CMAKE_ARGS -DwxBUILD_PRECOMP=ON ${_wx_toolkit} @@ -23,16 +24,21 @@ prusaslicer_add_cmake_project(wxWidgets -DwxUSE_MEDIACTRL=OFF -DwxUSE_DETECT_SM=OFF -DwxUSE_UNICODE=ON + -DwxUSE_UNICODE_UTF8=${_unicode_utf8} -DwxUSE_OPENGL=ON -DwxUSE_LIBPNG=sys -DwxUSE_ZLIB=sys - -DwxUSE_REGEX=builtin + -DwxUSE_NANOSVG=sys + -DwxUSE_NANOSVG_EXTERNAL=ON + -DwxUSE_REGEX=OFF -DwxUSE_LIBXPM=builtin -DwxUSE_LIBJPEG=sys -DwxUSE_LIBTIFF=sys -DwxUSE_EXPAT=sys -DwxUSE_LIBSDL=OFF -DwxUSE_XTEST=OFF + -DwxUSE_GLCANVAS_EGL=OFF + -DwxUSE_WEBREQUEST=OFF ) if (MSVC) diff --git a/doc/Dependencies.md b/doc/Dependencies.md index f37f4546689..d8ced6318a4 100644 --- a/doc/Dependencies.md +++ b/doc/Dependencies.md @@ -24,7 +24,6 @@ * miniz: No packages, author suggests using in the source tree * qhull: libqhull-dev does not contain libqhullcpp => link errors. Until it is fixed, we will use the builtin version. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=925540 * semver: One module C library, author expects to use clib for installation. No packages. -* Shiny: no packages ## Header only * igl diff --git a/doc/How to build - Mac OS.md b/doc/How to build - Mac OS.md index 5c2019454e6..113c5cec0fa 100644 --- a/doc/How to build - Mac OS.md +++ b/doc/How to build - Mac OS.md @@ -71,7 +71,7 @@ is currently unsupported because some of the dependencies don't support this, mo Please note that the `CMAKE_OSX_DEPLOYMENT_TARGET` and `CMAKE_OSX_SYSROOT` options need to be set the same on both the dependencies bundle as well as PrusaSlicer itself. -Official Mac PrusaSlicer builds are currently built against SDK 10.9 to ensure compatibility with older Macs. +Official macOS PrusaSlicer builds are currently (as of PrusaSlicer 2.5) built against SDK 10.12 to ensure compatibility with older Macs. _Warning:_ XCode may be set such that it rejects SDKs bellow some version (silently, more or less). This is set in the property list file diff --git a/doc/seam_placement/corner_penalty_function.png b/doc/seam_placement/corner_penalty_function.png new file mode 100644 index 0000000000000000000000000000000000000000..bf445d671b5255ec1b667b5ebaa933366b114f24 GIT binary patch literal 35247 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 z z{^msnMsIT$)F2VK{ii=hOUt7}^E(GB>ir+$t)2&gdrBq(G)GKKEGQ_5fPf(IF%-s( zbmmVJ^W6Ch&>>j9Az`HSP=UOFe@4>S_&8RqN&W8X5^$<+1l&hB*I=Efa*us*`)&O> z)hzQIzOwpklV4<$zaG%M*EgOuT7Q{R;-h#`0RAQ$i+VABqKDe@PJsi@)y00F#O1+2 zVd1BNRhE`a=>1raJJTw^XmDNxS7jk2sxP(9wMEZ|x2t5Hp1ybZmbPr0lZlzcD~?4* z1Eh5D8_MQtHa0*t**CF3w3cCqKtK(UgfxU&eGKTFtIvg~wVk`B>l&n9WaLzi8)RWlPjNWc z!!0+zbKI6cMJUa0eXOH8Vd%>90Aa-g%kTQ}4Oc_sCJ?&N1=k%An2ZZ~3qA6$u|Ea8 zsT(boXpB6pf0;6BW?yVg{}16oQ`}d%J7+OHB4G$1$SHK6+)szGw#7Wg)5pfqdjg-( z)iBSmTLgZZ4=5}sb6U@uK2mRnw09d6Jx~>Z62|Z^IuQS}b>(yKAsEYqfp5jF!RmGg zUrg))OM@OzLjKYTd5Ge$!B+8)hWdg z&crMJ1RB`m39jXeq_&$K-ck95Ys)rCL!2bHTGvbE?iG+NHyN*KhoODHya*rL#Ws@< zP`{n1vL@e++p@&R8QzuM?LJ7~*@JIZp7GTcmGNi7PQWE4Ff?Shq)6Jg&1tu!q00e? z;ltoapA7>oe0MMxAU{)UBvU^ z3{~D$k6y~pTI?FU`zvE5oO#Gjiqk}{f6D@lQLv_kncS@;5zvvva>2?@$ww}FZxoG> zO-(1LFI)?r?oIn&ZmX-P%2lk9E6q??-{pn=LqbG5kEsHZUmk#{L2?!tF|iRp@?4N~ zkSdE-;cgBA_TjEGPij0qO}MWMznlAIogkUu+&8i7L1Yk^sSi)T~qHEGaP6lAkk-!vAx1dzgO6tK9mnx2X) z!&hb}!a+PoGj?u2RMR(VmbFyT?B*C5=3t@?5L!y4$cQfMPkcIEe{|1Ib|2u8YK9)V z&bvqWV3)yy(AOoBQh&aS>*r*Dil$fZivm&fDv07qTDQWKMP(=0b|^X@F)9slaBUps z9YmKTE`j$5px)dM(U&zKi+X^p+lY5TvSlQAYhnr@{?;HZqAM?^638XGylz9hFkepRQ*rEl~ir#Y;eQ>=`GuAKy9CfW%*F7>E!p5|o- zOw=#kOPuY+S}vj-s!Y-eLY@ZyUzWG-c>j4=X_}l7!G2owKMD@5S(BOF4I&7_&XerU z8RvRbrNz$PCRXoWgj_W#sYzTL2lebi1}KnbhgYTtk75$C+G2IAmJld3w*SE(`4&1h zrc?PkEYzo+?CarwGDwzsaJkz6qFD+8P3vaH`CI|BA7G!hJR_R?EBch(=^^`8KB0Dc zr-v7eQ@|9VrDaJYBi+_ilbXJdVxl-GuuCW=#Dw!A5HiR+=vH(6R6z&TLJ?Y|pg45r zj|YXdMeu+lN2>(B&L9CF824O!OqqzsVE_ulxbrZIb}9V79r~ zdmohZANfUAKlpd2YE4}H3AX(*0QdwBW_BC8lpWEo^`U#3J@QWBbf>rNLpe* zP~|8V`KYMUzixofj@;wUPP$pM#GPWy` zJ200-o`@CrL55zB_?SI6bJWREs81RlMgblPTE=`_P;Pk4j@Eeo2DYR^z{_wYdoCx( zxR?X_A|RjyolfD1pY=vPKR<~;^M~iTj^q1OrUI!8^8@aCBamHPciJ(@^H)31Ti^iY z$`VhD!Kdw)HJ+BK$PhV)>iDm{IE&=HHK}TP7hIEul!h zMaU4<^_d7iu5w-FL}$Hg3AP1ghhwCABxGU#1h}2_NJq#4uw=*7_C1B)765v0^a#CZ zCl6i(6RF2kri_Rf(4oZFVt;7mC>ho~$Nn0q+uKpIzUJcf(({p)pe1|}M6;WiPM&xEe;9s2(2E_d7`Me_XZD5YlpbLcb#0mgH1SB3&ej3*vP;8zr$q(yQ{{!RC*S||dQaK^U>XmW= zs1jf^{9Hg?D+j2TmI?4%i3~{ujnJ8{HSNvrbG$f)ZgA4CCD?S{9B%Bzk>x<87an!m05p_ z%aT%c-M?mj)svZu7Ixg*M3GKP3ma!6))ZLNr$*$^X)|=%=Wl5E-$_0}G@r5g zGvpfdN;5x}@+K((cf~q7z#PGvgjC;RKi+NDW+jriP1jN88M^G{kgGY~ao#c<;Bb6? z?emm;<6b6w)Rsci*21<%hG)*>B+vI``tiS|f&M}M={cfM>W`6Y9QE?wt>jqKLqZx- zJQQ5=^|8`;$G9!eZ|kk(=p=N-_Iefgt)VGZ=)u9V>MbA(z}tOnR6`@3)G|2;>!@o1 z%s;wv0>T*JWv6UQ)LyYs)jVZg-K)Z|Pu1agNOXAG-te(7^l!sBEDsh|_~0E^hl*;S z6A;CdA4=`Wg3of=>_p*t1Q6Gm16>ql1LVcRX;OuD&oR?vlr_S9)KL(m?=0dv4}z#K z9%m>T?%oFEfK9WsyQRws@r2XVq{J3v2270w(=N*dF5n_*8nMHk)Kf%ZcS4y-9|oJy zG$C&RA?YouY$9I9BaEKPpinvJIe37aw*2j&36X~M9!@@0CJZ` zZeo0y_`>A|`WZ8jIv9hYR_s*uXHNFihS@HD12J;BCgs1@hKfR0uFkh5oEKySAARbp z-`d@EQdci3EQGGqjN4O?ljBP%PX{jFsO+3ru%J~~^Ai9KYf&xtQczPf(Uz2z78a_gtA|^WQ&8yY=m-l7 zLsx$0zI1Z~DMtM=m1P2O6%{`UlSFB3jQiMe4RUjmV_u-NC={*)WRHFHSNHVXHNM$R#u?|EUF6SN{9R=nj+xym|BYRoT%hNYO z$TWiA>|aI%%Y3M7BbrFsjQCvJob&2toh-ty3pP7+%;<%A<_CqFz1%%KB(6^8$K?06 zwzeWE1i+t*3R4yH%Algx7yHxKSI4RagYg|Su;&k3tpebd=RLfs5t$o8qkMyh%gw6S z$JbX4fBSXU`^VD`5+1L@0sC~8+pj$&v)bMffi zU_!|h04E%*&QFK~g&)t(zK*}h*VlK#jOR6;-HY<5sHnum#P)V+TAe0uH$%heFJIo2 z9`;H$29gLRimmeSNEg+}8AGy3H#`ySlpk&W{wZISm?5-jf*o zxN5YY6joQ?=jyEJ=0=<;J-B1Zp8{Cc^YT~pWUou@Pt!01cD`cT5q$jxq8kDZmq;+a z8tdvAVk1B>Ql2y0qZ~Yf-+@%p=j=p4XojwwyvOM~%3_3p;eawU)GR!bM8eOf9E3A6 zc`|z}@*?t7ej%;hPd&4y=LOQbsVq;U%ESxAmN+_1#?KqDGkl_<5N&d$$QQA{AG8!2 zoUSOvOW7$p7*#3hK8rN31xc@$U?eQLX|C%{bEp!UcX{%pq|eJej`r9Au;cG`ce=C| zQZ>31(l8cqebgcyhnFz;%GTA<}X?M_Wtw)_7yVw z(nqN!6}hMteD1zJY|EGwtE!%$zN$86n|hWNy1OJaKTo>3U1Q*oNu}#0A9*j((Ps!& zq2WKB0&h2=YYqLle01$j)8ZNPSqArA|BlteZI_DDKbD$iUj_@0@6YrQpvX4=*rI3< z+DES^rc0TkB8H42Vu5X>+&4+?T?H+e#b^HB!y z4B0XokTXK0Vj-mUIY$D@F2{j2Ej;SOUi6*%VaE5&PJ8W3Zp+G!%6o{y;lvT^YYek0 znw5VVMreSVgLs1CCkOF{RTl}_Tv0%(bOpLQTdF2r%=A3h8qwfiP@qeuHua3ro`T4o zSWC?*P*kQH54li!6F%glM-It(7{Gw8=s4Bnt?afyX54j_);Brg&%r>+dE;8M<&Bp(T5{#cIki7kyl%7GsoKs6@ z8rvNY0);D{3i#2-VDk;8C|LAb7>-w6wJxTKPyaa2SguN&l4Thc7zKJShSQf(#RLi#R!`4NB0X6)|tk2mysWLfdwh3_sYIDH; z3=Vl=DiowntD0KY7jX9<3TJ1#smJ3R3 zs4dAr^ygec_w)Tfxgy@b&bOT#<*}38ZkgJd-V5^^Awcst9uv-<1w2 zuO`L7(8ClT2I^EgzPa)^h7jSyE%B3Ou)ExERv`dZ;$~9{?)}eHogMcdGGZ$Tm6FaxgH4TFvh{ zsG%@xZHYY#gDicI^x7ZohYFDbeRc8~_$uZa(Xq;HU*Ex4r?qxV45sHiB>Y8K7|x`{ zz3dm@MLIg$2DMSPp$EE;;8_B*%|E5&f8M4bRlTAQm+-yQ$W-5W@`EH_5{ zUjF}+i#cf#%kU*dOO=2%PX-nS;9UVj8Mwk6c&8`UF2g1tR2Tf~@g&Ye-JpJdxdXQ-??0285MRhJkz`H#V@ee0MxPAV4#eXD( zjX141;5B^5$PNS2$VlA&3`T`($MhQ$1Z_S zme_Fn*Zw*D`q0_)4Wrmb(Srbwc!x3sUAwqUJQmA^QSb~bFCY7%zey>H_(Gub&mVa&6N{0b*R)W ze9@YLgAoC4YGk^+b)G#scP_NbNWFLq#M72AF_^W{(vdrOdDK>`o&e#9j@XSP}&g%GLM8`&GmsHyPgZ^8|gjbG3no< z%)BrSXA6zkBc`fBCF-F!N+t8Ov&S99#cgMavxIF&{)SOAY2-txNRJ)+1`+mmbkE;a zjtZ2WATc%VMIF7T5k>-d8MU4u4^!{fn#wgaRghmQ!-Fp??fF7GVLW__0^_e76r^}F z%2T%pSRNk`x3|i+{JRTz0BS8S#N!Yk6tVm2m0QF^NP%|?-1c<+Rwyvu&X=bfM5nkq z=VnWfOvPRdvm1DfeC12;0g)clg4!D2$2Fh8Gr{{+=Cg!?a`)55CNG@AR%}h9y8`om zpI;g185eM7vFXC=??~!N#U(7ZgM%vWwsb*f@`xc3Nk?p-w8T%zH#1KGN0*ST0;Dix(0NeEgvQb6fi;wCQm0 zc7&3^-$yRiWd)sF1v20cc zkXXbLGS|ASgW`oNe;@R~by%QKRpDWeV9GsE8KDFg@!g0c$_-K6h=-O$buKe%%U=pE zbZj7mL?(>=dW)sb<7ImGJyw!zu&h7+gKPKN3GG+>k>+etH|$KHY*#12WX#2o41ZKS z&?>y&Bo)_3vBk>2KY%oJtoh2gw&I2@npB=YDhgV!eqB!I;J? z%d)wD0b)624d=R}Oy5HwRCFTq?gf7S>_1z*k znfhw+O?Q52F+xy^Ajn5A+PYVE z>gjIv$!Z$%-m{qL76TfAqzCxW@8|~@e?d?%@6Brf7+V1ls!H?$ zsd~dkWJ&dechYM?c4TndtlfCc=5)*TIpERYbRb*9r1&Y;URkMD`CM+2fljUCM}yoz zr&>XHxXZaGLyRIlp#1mQ+g@+NlVy(|cpOF_+QjvRuFN?e0|X2}m-;?m&rnaebrQc< zS|~G1Zk)1BI4z z18vl*E{{HJP6?<+;H=%oINSjQy<1KYT;LQZ3oTDt48JS+|839dgf^!t>4=&gZYv}%{ zp{An+yiWGdv$FPleUB50m1Btk)e>asl!144`196F%+Zv(H76m!br@;9(*3Fi} z!l>xzspygnQ8Z;_yiKEJ#&?TGR_ zEHV`HJ=v*uTL)hfdz{dwiM_m=7r&bjFwpI=fBd?i_tWxwC8S-+9lhs|~ z<~t*}6CXV62x*Tqt%$9gYp?|g5$&GJ#UakD5pBOiV-Cj39+S#cvSE`-ZEd|(a73X0 z|5b{7Y{n8K=Z??;^2@sI!R!5yfC-Qw2g20l)b>?92!xk@ECnC4-+zdTkKgv)-`Lvn zzu4^nzp5o1CThzY8g$jwQKy1YH-6l5eW}LkhA7gc1G3jgtzP~q(Y!R;xE@GcKXMi+ z)+WZ}qiCH}c+_&_g6Yw8+;X*yyuMhthAT9rmz_)pTrM6Nwwxl9qAq9xB5kgb)OnV* zmPVr7#MI%8*{kyPZ!EK+oR(>Bd z%KLB*Ztw16U;Uv!*zl9~uO5yOi-hRt=rnmoj<4JiN7n4bFLPD2o;|duG&Qa|U4}fh zrZ5*Qddyh$qIO^P$L(h_76f$tM%P*a*IIw-21i0oRMd2X6$V!9N_PiOPRQXU-HXn6 zF)-FR>bp#|+THQXtb)Pwq{G(6pEGGOz6_zcH%^!QxXe5U~T{ki_AT>K9@* z$V<-N5|3P|wpqs=(dqvFa?jm4a1sC<;3%!Ah!yvVC@L?HSw02wBG|D_7kfw!4vxsk zNbjTv`!{UNy_gKQiXX$`Oc?pz++Gb zfbZM*g!UI5i|O(Za2U|9!6l3M+Sz3tzU2*ter7p-@awla2V~pvX1|6SLjks<+daGG6BL&LgkYq}+1;FAIf2|WrKz`DI;lyR!?Rk}TpxRT@ayOX7|5KZ zx@)l~>O~r$`@~pr6F!WD1f4Ga2$fm?(&tai>=N&j-q^QURul%aNQ-YC3VoOJ z;fdcBX%Vj+#rBLhaPoV;khRN<{#s@ZVhONT99qou<=hC zR6{>Y{*wQ%L_J?bQ3X2~AvY|7CYNR=8;>lNi5axz%wtWY2WiLbb}mT3p~_|>L%lHY zCbP>w@bABe&K1ar60K64LUhBj#Mj$wMEM%qR4wLh)|BMBDeD}G^>4AH_ zyXJ(&BD+O+vO-=Cy?w;ZFO6vM3x$HSZ3trNKjsCso%u%E>_?dkuH!V zYGUJ%TXh}V%rtrK4}KhgPTq+=IEe3=nRQu@0do3LvsKGqFej2I*eGIC;^|+;vcGmQ z@TF=QSR2kd8=vRA6h;_Ry=v4Bx-^qgPDr9iQ&VsDBVZbW|G4qL(@}~%2Jo*+`JcW-Hp zc+;lp{V1%{idh(6K?=ZJ@SYAv8xO+UCdaOa>UXW1gDai*GRe~t2Cx|{C9?xK{`FC$nApF=j6 zr!QB2-rLN$M)s5(bNDjcR*aNhI#TJ;rn-^jm^GF?ulh5^N>XRt?wq6tfeY-e3@ zd;*WQay)NXVa~woyvfalNjG1~E8V$*6)Ur+j0hg>RUlP$b()srZ8E5K7Z3 zZ%?o}=01;>Ni49u@XK&`GG@sA+tpaZzhGC3NUBVLg2PM$tFD5N_|tlY7 z`R@)tfUwabr%Q+loh-wuqwrp3mjYv4kc&S^6QUqAz#c=I{M^Kh#NlL)clT%V-q3Ul z0sy^qiR*dxwJ5AGA}T}+Gp(~Lr8v1)W~^lzgq?Xpm?Yx#vK17zsqZDT6Oyje!PvIK zz%j(o1wp*q*^;L-3n^=mZz7_N;B>EeQlBCSh%Zx9j@%72s?iQ*mdu)>>HAJbi_a67 z-ffMy>E%p&=8E4ynAF45@%gl2@wDNx{ep#*745W>2I8q0N}%0P2J1bYMPLPj6H5IS z2|lN(Ok1O${5~LpCNLZ+Q6=QE)7vLuV;%Q%QIB8VIJnx(MQF9MV18`y0D$O4=aRhh zy=i>XO*&W`b<^~(U-@qHaU-_K0gJ-r#RjKHe)9~due}7a0urBfGs{pioqJjwbna_{zOaJz;Emts7ycpyY7OSso1956yK^K~tR(S?R3cUe#^=k`*fYZnGCU3{$u>^;hHyNpm97H82~ZW6 zh9gVV6Ra2)%<7Oxe6&f8wczo%5# zTv^yY<@8w=!5lD?J5U2Io*1NF6dqW^y#dt+3DYX2B7ns!yKX--D&Y_C;&5NM^Cr-U z{Q;P;r9VIYsU;{sDK!=z}%9x{@XtK7(CuL^Gns!onWwy>RO=rk^xAm?^*z1d{r_-G_y*{hJ1T3uVI@ow{tuGl|26Z2=g zYS{Vhs@)|QdXJ9I%1v!jRRUHc6WfRDB`Ie!eyPi>6OC;pC${MbnUzvL!Q-_HbN?Q7 zcvQRjWcA*_LD*;d@J|Xh=6?_>1kPaHCVb;s;<)_K76{CC#;j+843l_*;16<~cN6Peh%o)bpP(9_K+}txip02=Z z+XhNDZ%dmx-J|CpKa5nevo$X%?I9Xl)knWNyT^xhCn-}>zS#=O2V{^R_hl~P)Hhh6 zQPgEML*SDl&v{g9jKuX$o|c9eE&dBBdyF?DTG?~uj_J@lxe6k8>`PPIrQeMH^88E= zg&O;O62^P~{(IEhjB>3AE6pC`a0D%KE~TdzUs+pqU?ar&RQgJIJkR(}LxwJ*uY$(r z&`pO*qDp3QrkIOJtT#}WHyhadRWg}1A{MPAmx{i`dsw5tqT0(y4DH8L?NFd={- ze5UzPIA(h!OyS>|n0R%1AffG*e7^0qFi(A^tU0sEqR)3)Ih6|^U zDW6?tN>qb>*}*!guwbWBylmz;6iD*OeASJOSiwF+VxSk9%nf0d&Qg$cJ6oQ ztSNY^Of!{_t;6jjK0)b24(W46km2?5zp~ztmU1`={IZI8CY{+(;W+v_;4Rj89>%Ll ztoKBlJy$vDW!i#oaCUv6F5UvOiA_tC9bxBi`nUJ+N&->KIV^ERvt`(Fy>xvZ5@(yv zM3XCizB9k^tfyJSD=7{97#3`;&Y_|Fn1~Th(bi!#C3<{zrwr(Ww)_=VJoR{Osd5e0q_m|cmrjU!}{@&P1u1n zvo-u|{@}-`bfnx!uE5OVL}8W25N94&%0~>m1ir&x+W~tWqsOD4aO`|$2&jD_3ts^X zW5_*2+^A!QkK`PB*EsDTJSP`Wl8`BzM~?oGR~QPFdHh!Ut6nnnIi5IqlaO$pn%Pm1 z#t@%m_`N4@Z@G=;YZfIGN<+d_C_*2~NkVdN#mmrt^{@FQvS&;jIU*pd93LU-0FUQ$ z6PHL*%nJz#;mGF0FIpGwaDv2Z?t7gM3mND3QXGxFCaB~h;&};w;Rk+-&|dQG=Tdh{lh5(+I0a*yuDeZFJ*AX#px$GBOH0!cZK1R#KOy*gc?%=Q z9SZ?Fw8UN;uoD|I2e^g{W%%udZEvq~Hg0Z8?GOgga-p$O?9S+h=fw zdp3w?&HWTLa`?6;!e!ARtH(kc`mepx7umgQOJt}_x)z(y_s2S>JQdwU8m3Ks$DyL z``f!<7Vkm$BL?M3T;6rH&)989Ira11yTs|SQ_Nj|e$t*!L>O&WMorjNec;f+1-Jk< z-AEZ5Xl28XWRt7=J)6+DzNL-63WEcQbkYDP??o%mZF`KnRlXii@wJ2d>y%t~tpz66 zH}?r_A@kB6homa)zuoKO-L~WMr33^jK=u9lv+7-mV@&T*No$W(sw0_bP?>pRJWE0G_HEtD1pvCC(L&hPGoT#&n<8qLe)0?`(;)Sk`n7x;?QkK}rhceLX>*G_|4Z3bW zLyO^V$@*rV9l!PMG7;-;ugoirr7C{;6K9^X`h81iJPgCvp__GddSLu9qp^pz+Atm4 z#xX0}nC#qVv=?dKacU6rKCKx#xDDOtp>WstsTnC~3>)G6&h#B%X#0;<2D4pltL>7s z!;%}VPk*G6`kc%@ofH$c53Ya5i>Pk|yaqZ`w?U*aYydV4%UCwkZx;Yd-q^jzK6ebJ{_?pPrCTjOuJVx z4)2EH2YJvrATnmpo*#``jW`UX>DK?pOT8+{zwNp8VB@ysaAZ0yN-PevO|I?3&&JzAJFT7Ru(1F|imGt+$U+Ia*2 z+AT6%6_=BFc3fg14Y@K*{8vRq*WT^`(cbAViQQJ@FXErXBfDh6R?k5tD0mdp`-UPM@Y<_hYH0cPt=sLj~@e5Id z6{w~1=|J{qv&6Y;^<+qQko5DRPYhGfrO9uFbvX0Q@E*Vm(llN7yPjvu zukYJ0EUyI!I;Q!)>s;EnX=^wLO9U4LYZ1<(pZ;%}1y*S1DQPf5!GD7?#8>)sIz3fV z2d%|apa)~;(y`I zc;U4RQig?vb;t?@h#Tl1VKC;~#_1LYH#NR5{PN92y{I^lH?DMI=YOj`in|T(1TPb4 zgC7vcPPM*zWa??pScG&bl8NE08wmJfaZsDgV*j_>2^#dv?J$Q27q`@2xwwT_R5bCv zMI|r}cCwzwr!}*6KN5-(WHLY@sqk(~*R~JKtxaYosn5Rxj#IvW1e8|5b8~!+v(YDV zMm^SJ$vZ;ir@M{D4X$6gt1W2AH>v3k_elLhJEmJ7mhz&7$!KePjW_jOf$V}iF9ic= zw#B$~XEXcchQWi)U!%>ZOANjr5)&uUcl?T$n{8;+L)LK;#m!9?w5i2w4j={gO~qzIFhze?IE9P*bs zPcJ;tD6CN%%cB6~fxvb~;`A;cqq2?ErquI*3(^tVuP#p-w;&jwNftx~)#io4k@uD$ zH|FA5UQDsF(YdyDbNj48i-$~|ox)5pZu>U2?|@3?Bz1Z_?sJ|W>dRwm+W#l9Kn0r8 z5OxGqrdX}V#&V}O=p)fx(=US=!bvsaXaZ+0er!w7U7W7s`KVo`WZLwRVlVq87o{d= z@8Npv!Qu3^`-i!|PA4Ec?x5q6s~7zbflT)5N@;@}dfd(HuS{yd+ThU=))}Ir8_&9a zGPt_T@sHddcYD~BM`r;1HPLiX6gDg>I}2kr>bG!T{gb^LSBC4vuf)t|ZT&#NjHRDzZ6l&)&Tk#t*UZc$;2r3in6`Ceo(gr+uvtFO**tCfI(CG#nR4+8M{OifKqOj_t+s!B?R_3oQ3uPnBUlCk{%pM%ES& zZZpx)(OH})=X~g~*iiq~*49>7(sa}>FccmYrR7SQBm_T}Dy91Bw@)6iaq z8ap*nc@W<5Irv|lsG^>79j<4PgTkC=Ij)I37K45I!&BDQb`#i3<~?!@#}JCEte>+! zE5dAee#C4}*F=SfH=G_!FDxv8Rv_{$H%3QCadg|}od_p;Ou41IyE_07hi!g>7A{c4 zkNMWeK_rrZMG1NsZXfQgXlo-yrR>H%>1KLe! zYeSSr-A+G;+yp%)15IaDgpwh&!v#Qx$FixSn7|com(>5h|Fak4zN7iWAhDhu>=3uL zP@}`)9R}F@M(3?5(Sz-Qz2>7%zq2FbJ7;}l*9YfZ0(c?#6%!Y#(5<|sa5KxrDSJ;VB$i@YI5BN43FJ1Op5{fHtBW@%Z43_r_d{DYeW|@nz^7$&_oA5Zr)nBFU;bxjkZHst*%zsl*)Xcsb$J8?}%8+2vozt?Wthnp=YPHYJ$wQz`yYVG-;0YmYX)iz# zqLJ^RB~wyT($Q{W^U3$ZlJcuFDpmTH?enXm9z+2*aQJSe&ii-E8)n92%l~5xe9|KA1&<* zmk_Ur^y2$CKWSH`r1bTOa>k|v;|yreI_SuiUdhG8K(9pXx4V!|qk>H-xI=V#A$ro} zr5sQ1)jHt^p_!i-i0K|q><13J)ftimwa?bz8n@!5U6@2V(+`V^@v_>S2Azn5>!D zx2;}p)N{_iYw&B%f1Ib9GYS_r+===etwa*s%@-bcpphS^#40`m$Y-D~;znff^?)~~ z)Tm;@H)PiXfO#{R2|(^>YL?V%aX=*03J;c(X?S=S6Dkc*usC=1ny``LRd@9%Zk(lX zai6ky|3saevads1wMq%^+sJ@5bNwCj=(tTak=`ERf=9@9PyQ#%*emb$aBi3JC70c=S~^Sp73EMLB;Z+{ zM3Y>HrP?IjGiAE2wwbJen`FGw=tm$hn5>WHX#YkQ^jIEx9e9027~t1J%DD^g zd9xnE4BWSG`djg%9KD*?7Qh9gAd)tW-mzUl&2(HVVFnWn$2wkS);) ziwASq`B|5Xju8J%Rx}eQF_q%PI*XqXvqqbmZ6rXk5u@&iZ$?va=sexzKcT+Yg~z>J5woE^I`*?5%%V74DRnY<4)x@lG>2W@?*cHjPfGFacvzZK!T86CTVn1nMVXVtzg`1L$I%LY-)bgvY+W(AZDO?x~`# zRzs^sR#c*oZhVrze|xzdXf#Hk+re06!HH|rE7_?E3_@R}LT;KVwUOV=(xsZuz<5V- zvAsS}n(u+&gX+yRt)JCLMrF=i90~xpB*hA~{*l60Dmakr3*>uOr6LeoP^(j2DJUQ< zDJkvadFEndR32q}b2w)#A-XlXzGjO)E)X;+uv~fE!1CnV*WdOp-MvBItY4tA7K~Rk zI0Gl95X--5Z)^L#*8(Nd$F!Lwtt6KpoiQApL4IuSP%Wmf75=$xC-`o_AzuYSUiBj5 z#l3j2*C1`3VL}~Py#D6yTN%beBjLiIFwGL$?8Vc&jpPbFB^M%2``uj~Wu91}5xo?e zX;*Go_kp4KUoBehywv-xf4qa!Qxu+*bDGAy`*rhFy!zMnOxhIxO!J4^`wCUM_jeh2 zI65_CTprR80b$qF<4w$;F-n|Xt#TTw_Q2^=D2?z?vEqWufxjS+wY1zn7wK}s6HCGD z^ifYgsmsS)el#yK7>d%9-A>9&7J5j&H$MHZn?FKR58UnYoP^$8!}~s;5dOjJ42XbzyHL;c#VJKwnMV+rKwvmW#0bjXApD4v~*wI(=G32iR8gSbdjVAl!;+hR0Jhj z<+<`@bu|ap-@R;mGrId)nVbZNTnzQSOhcZacYmblClgK%akk$@Rvj`f_0ge~l3sPi zDt9GEPtrjz;hucCyGir`=v@y z*=m~IWFXT!b{T4fIBW%UB|**bHA0QIqy~K%*jkZ#TNBNo`k6G~7U&Zw%Tk@# z|8EMu0{9BA_5-V0YBlcPk1sc+xoyd)***EoRDL0GG;uV5mblN0A1G!bwxFQcb}pxs z0QA8fsLEABQ~BV8j&e-|fDplGd4dmI-o^->alyv60#9yBs>7Hs&cg6(m6(m9TUHZX zub)7H=a4cpL$y{9Kb~A3TP`Kb7bRi%CTm3D$Em#US0uo3d}Y+eM_iR@v2-uqk=xfw9nC3m4VtABhv1Qv^tjJvJ&M7s(NblHX|!LO zdRl?xo0iG}ZYlGd?%mFDXU|fmrDH!h=I=zNKJnKIMvk@Zy*uymoHC1Rny(f zO9Uizl3tZ1B_+uNpnwAJl{bjtTbikJT6-;@A&{AcT(A^fE&JJowSmBLYpT%!fzA+{ zu6a3*sjjw-N49xQXCO+Bd;8NUveSw9imrO2Y6nu9De6Ph=ReEuE zd+6tE1QnE$^8Nk8wE7~5UdICl>-QC*NQbDhy?~cKT1rq) zQEzS!OCj;(!GUE3z1&O;lx6p;a?jU~H&EMY$22^zpVUNIRq%-?_T5{Eglpm9O+8Fl zGUWLMI_}&U{uCu8CMDHWTFS@AM@EDnVl&qSYPvSfy{Bs2D?niYh<~qvCn5;oQq?+0 zE=#IWm!t^u33G0~wAcz!QE>rj7z50pG<+v6Zc0?p&N4jxk9mYMNPQ-xqoT~ZOvOMm zX~8gnkM{z~8q1j3+WP3A**56|z}8JZ0*GWo6qK)tiE+qBSO?%9_i^Q_A?PnUAUqci zWy)mVm0$qgee2z1E30z`yi&?uls<$Q`^D|?C^1X`kt?YfpIOx7+EJMqub_WlGYRgZ z8xp0^AV_gXCEz$yM)0<+1bH0c+si6f@nycgV|O-t<*a_`izqm`Lh8YT-GgZ-z<**8 zbzzB?Q&Ls++X*v1=@f1%v+PUQTN!#*I1a+~U;F#AOwr(Dg|Y|MZ2~X~d0{9m*UG2# zo{Nh;vDj4rX@DtRY6~FL)YN=dVgxfZ1f5mDc>qZ{>qj9s*@)Wth}s)c?S2w8Adh>J#cG*{y*HoxW0yCsf(K*)0suB=#BR0w=n%U{=ADF*FkH)n?Zq*CRdUwa~M`KD>UO-B?Efwv`F2Nkj^PkZbg^h@S$Ytx>fUAqk?oJoOki~b8#6F8~_f$ob^zeWUfl;17*$8%D^s0rW({2PU~rT5JlCd0EEq&@n4G!0MfiL z&<$lO$T9@z&T+mth5XEQeQi!)OI`eXCXZY!50$Q7W8y8R zriF)J`r-;@iY|G%#2G|##|xbCq1)*ApYeX0l+Tg1^f3nTFfoHg7Q$#8yoQG+2u8Jb z1}p`^wL$0s?Cu^WkT3*%Fg(N1n;3s+)+p%KNvM@oMu`++t3<0Tw>oFiPo6QT%4+7@ zY$jQQqZP+m6&&J+6uZIE`Ul|IF*Y)g^ zm~xx+zyTYP+ulH32Fr*Cx|8Gzg}r=%80CSF-d+eleZ~|TO3w4yl~Jm-8m^EivHvcpsmEfD=s$8QyOjInl6GAMb_K#}_6^ zE?SM3x@Ko%IuJTA4!E6|xB*%VPLTU;65xWLv);zvb40qMogWA>eCr^SCS#a?!x(+D zU517Fs=k5ilVYhwe7qtyqEA9mf$ALbG&z+x7#GYnF&+7>>sQ+O5HPCCj1&NUVAS~p z6spiF2-uWbDyijcgbgnNwr_+{-W-2pFv17f2##X|k}?W{Fa&aBYR^pLf8 zeAllGr;>@jy08)2ANC~`$+@ao*pbc5|8%Y|_H+os6&4x%ZRdp`O+1S{+2zQEqCAin zEs1)Z!kScV=dq)P#f6*eIfMtV;Y__cl!ci&TD>&`^(15g-9%SD%S|SEA#vsy{OMck zd;Lx{IaQnUyP+fch*>Wodt{*M^QQmgxLp;m)VsJC-~zV2oKzrp5^)~@IbU`D8&}^# zjVNUPX86X!4{Bi11G%MM0NJRFte^ik=leg#r#SZoag$R2X0)Mta4@%Rg1P`P8;qc@ zrjE0Z$ms@5+%izWohb6{VfXTwl}1uOW#R`+&%_|@+&vFsZf7AJtBdj>gvm&1*v;Y9 zFFZ`Z94bJ=o+Tb^VGWvdtKNxlqB}G`Grz3urV=J~$e%OTgu6~%c%wjQ@uAq3D@3De z91o0_C*M`+AXl{`f)y+~?n~BtdB5hN)XxP9EFeW++r_0i`!!rAHOw)pI5pIS*QoJU z+0%}z`x(FHWlUbZwa&`%iv5mL|+pI zT;`!8!Y5$9Bu?NiXI5!-o)Q`G`Jdmw16;Bhklqefu0;1j1=CZ9*7cY;;%^;0c4(B{ z$P>B40v=*#S(VvuWgTL}DuA@r&u5y@La|n7>B-u?c$f4VUR|J<5=HuxSZHRB9#&BX zr-ZT9zTo&!kUuO7Wuhu3{o}lYB_SkpbE2?&W5;>z#Ote9`{8)D%l#H%_D_&>RbKYn zoW)i*k>jCW<~#cB{C2rza4GglYr~2!Vz-o^vo?Qgsq!%uU{cuWfiex7Y)o}CqW&ON zc!8BM^6FK^d9X{pLzF!@HT~Mu2xip0D4*7m?IE;;!^y z^Dk~rJ7wq|Ml`$N#_)K@ZKiSs1L6C2Fr*GV{Bh3!qrjJRYNaPJ&`KW@Hu5sF32>lL z^YK>wy1^&*nn3hDMy0+>6VG|l7H=8`uRK0Mo)QC;CdU?JH{q%#B_g_1**GMe#=1Us zgf@d|^?TGPNJ0s#PT>9-N|We%adCl^=S?)SdK0if#sgzK*YE&3yY_>E2PW4X_u-j>?(v z1Tqz<=_4j4osFYVge8D$h!45~TlGC~K1Gdw$*Cf>i zHPL{&eDZd>zwdVT(=c zyTEu;Fa*`pHh+Tw%U>HCERYNyly%9Wzvh_YaQyH#edHc!i?RYI~X5L+Lb=_c! z-GD$|-?#6+G&KL&ns}uo&f%zg`8&UJZIjX!@RnthVApjWfJ~V^frop6fEPWMByDSC)JH;_kA^rLe^K#PbGY{!=Ywz0 zHtze`q;CwEnZmfG7s zs~^u`pwstK<|25mWB_il{RjEKuYM zt;Wv_kxN(_T@zl9`XYg<=CCh28i%r6?ijda5X^o{IXlw_ou)j}>~tsMX02Lq!d?sW z>mO?8WaQ&ov%SyjEa-+oIo8D}y51GcPfg^zHgvwZ`eik0_K-1o7~5l2^|~P6ew@EN zbJfg<&`u|WOP@a4Jv8%K?6Pv-y?o4&<}+4VbrvR0OmeW*a_)5Z&*D~^PxML-X5?-U zl9UvDpkoaU37QDlO)b~fcikb-MZsn<>#OYbxQGrn;Gg-w^TaFcyl9A3F5~O5=*YgU z^Tea+ed0ijqvE2Y6eW!77U%0;I||H4FdNlqM&`^9{etASNji{1*E-CRw4o1$Lu;EY zQ#qQAnaT4Jw$WRd+(E^Ggs?{8rKs#MWNi-ZVwqz_@|nQKv*UsOAf8jqS;XP^pQq!^ z--+Bu5eB@GoE;TZ*4A$4(=UMKXf0~wXK7iOX?{u!3J#GIu9V?t&_mreEiWJ0SXmEP z_p5zb+&WBgPs2_PF=h1iLv&(==e?4IK2!Dnp1KqlfdTQ7#a)Hsf_28oKF-6F-Bm%r z@oV-u)jHit<n%2jm-1$}$mFA_INm-Vq_Z$}PvXnp^@t7R}5W}_v1{POVRqaYND z^DJgU^KQw0eM}dYe(CkQ?l36D^~;{G!*++~cVAS=2CrOse3$8g+$e%+Bu_8iEl@h_ z0s_~PA%k$h5@%mQH~=pG*N~87nvvW^cHVGMD!OxN#_b~GH+wa)!n|<{L>r`#OBoO4 zu3k~n2rD3K5EZlI9#Dn`C}eQh+5f<(lxd7z_Bmv)CT4u_`1Snmh}p;{JREb$m-CZB z^wPt7Ed@#fMP)W=Dbm;KF`48^_-NA*nZqwWLl?tf=c{@nxkYW-wY>UeOt-e)cMUKR7Q70=RBpPzesme zo>sf6r&I^_{-faVifBccG&ne(|0O^%KVTOOr)(;?we-DB30kME)n9+G?vuzT%%9{~uXihhwJCAr?c{1Eom z4$U44@+TGmk5nCzI?J}U^`p-z24_+1adzpMwG?Mg69q`?V@Gn7G zq7pW4FBiTgmNEz@*)%hs2Utj^q)Ft}uk2J#)VD4aBLN`&B|jb3vEbetG7j%Vk|L&0|n|!o@Z8#j@QZ5 zy-XeX>)D-abk46|micO;d$+Y*?qnc1N&8*o)vCge0hgtExrbf~+0zm|5Y*IkqP#Ua z_U5$YM9*qK8n_*K*gtN^pRJteN(G3mf712;BgbYrc=eKjG+Bg#2K3t%Db^0pNYcxH zXJbbEJ*4HJ2L;&0l)==S`o(v#7MdlK|AO>4Q1jORz3cwThW^9s{Kw1hA0$_Y21763 zXHs}`SJxJ_YW!#DG6&=MbALt&F5mdicyYml`tzZM69;AgGmI`+PJcf92q&cCLDXOS zum5W~Vv&RX|ABI9cs$fEGQZEO#qT$gIHo}td!JAJzS%7Lk2~je$8hikYoR9TF*|8 zX{W@$STZO)Wr_wV?%`HIt-I<)zOxJ_jxi_~n{i`@O6a1?R)^S(Z*Cj$FK1B`$g%ReU2DoHb zV(9q{sqYW}B<0Xd3D9x+^~1YlS8*4inU&a?W!<@lfE1&&1&A+;1HZ}|HPg>eR@TKK z{QRxepgz_^*UQfCJ2-3b>gB(2jka`kSF;4kcO;}C5I4Xk0cgzNs(XLy@ zW91174=p4$$S-GPs1eZh%cJlo?%2!1w(0C;*GT4CBk3i-@4Hsry-KXDgD9PDDxURP z=Vlra1ZQplxbm$}w%*B)AnBQAKLDkcb5$5iekY=3H~F4pYxUqZnwmFFFWJKm%vJ}L zaY{-`oaNzE6?|j3PGE$PkkD^W*l%yZ$#+z6fGz#y?vJnScVeyb3XXRBc)@Y2k!xTM zkB*LLdOZ`B_@$)I+6Z~arX}4r27f9pa3_a3p*m1rc^)`1GJg1 z?Lk_RxV73Y;$=$T3S=G#J5fM(~F+U;AD^HdRdqB zHeFE&V!#=-PO_ZUSA1XfPQQGTtm~a7e^An#D(S70V7Z+JS`(fe?txiv@P7`~VyBSF zP-D5_xtbAlwy1jcHW(itA25i7B_&UPw1b1AK+5vUBN4SQQOS#|qnegn3h0*jg z1RxM@TY_rZ_5@K(vi&#DG)UaiwqC>`*o!&r3fUTZOV5+0L9uJBigw|+vq(yh1t_DQ zpEqH-fdTY6a4?ecC|6=%LWLKj19c#KXl!gO`nHMpRQB{JOkH0+PK})ccZS;WS5m+C zax8&CK_Ph>`MOSXjjQFhNe<$=w8~&Z=GY1)8uaaakfbIGY&V5Xr28CTKreyD-`~QZ z7Sw^6>^R2Ed@5KoO4(sI0)uQpa?eGR0k>y}<0`oc=FrR>+x-Z2?fBHU5c;{P&r-cg ztfLbXHK4qt&^Y~QEO#>1LY4tu(l_9yJZd=HDiNcjJ;w)fA##2z*!zJ&-&l zmHK^`T=Ho36WH8<_Zk9~QKuLcgrBj1?!?0Z<6v^6=tw4ntxQcBqvhmcEY97loj_$> zXeM>wuu*K%`mRL!&;`g2M{>UyiqVk(6kmzeJZX7;{w_K0*k`AP9sIpLh{D7)X6+Q$+7cY7 z>~lOlr;a#6y2S`FhUFK5Jh@I@{#MR!k5PD-D& zOY`*sEzN7xAO~G?(bFEUQY^|V|8^&wIrD`CJxS1Ji2)@gB`Yf{z0c3#hj-OtK}Cwy zU9wtG3=O1Wk`?awYSf~dHFk!^Q4I8wO!b)6o1MNhv8a zphsX8d;**b%W(B_+t*S_@iyi)Fm$=x0jCh`GX@dod7x=8UAp9M`wRikLPog&h0!H_ zwj(ek;d-#4XH_$Vx0BZwE<{(Py{4GRvpG{Yn$J(Xf~v$?rmZyZBb~^}6(3#0_aC+y zn;Ot0fb(pk{EMA%b zk3#k~HMNPsv!7+v^)rSZvIKiFQwksUwn)$o6X7~eW}%sv{ack-A44~WEu5X-EqM|X z5ecR^ucA-qY-2UeE%b_SfB2A=Mt|o{JWI%e$U%}Hx3ZnfjT<4C$+@|>8jijf4oU10 z)fb6G#8L0V=|lR#4&LUvVTzbqpPpuW%O`t$qt z_Vye_bqhz5a@=NHgXJdNA{SDm^r)O1iR#s)(tiOHBNy8RbPwlMnL?7~gv#P|*mFLx z4{;)C@Hn(l&_n%=Pv1nLMFnP=1Z@&`4!puGU`)Vl%{F?k*WmyC8W45C81g&YQ-Q&l zNhN>2+usAWhJb(|m1dNlc*vw(1x!+@Enf_a&&D`3{4z=hCfbyUr;o zJ@QAmRw7`P+v)#C%PGQgB1I-IkxG0i<=^K$nKIvp-*@Y5O>rJ>)sH`zYEAm`7lEsO z=!on_V_I68V|i}9RJ9juccfJ(?qCr7$wB*s`^Z~A_>i5QT|Kobr4lhLIB>Q;Ha6zb zw3lj~?t?~pda0n$xz6A?cj@B_Y4h!vnGX4>UU}cO>_lDP<;13+_dNCllKp;0%Pj(Z z@4FBo43yy=kC`2CGDZEq_PA`ypiu*$L8uXCpsTec$8ZUE`OBKGIU;44&zl+6HxBWr_;?2 zwWvv|rXK;%j6AcKH+^YKy(1vabCD3?Q;H690*W9u{baFXNUHB-5wOIqhRSEZqH{5C$0Y_mznUnUJcBnz z)m1gLg~EUgq-0^fz*p{U0K181TaSj`CHpuH%kyQ30&dL|9QTH^U=a{Cbm76e*H1xm z+i&#?BQNEq`JDJZ$3cx8@ttsU+RWj+eVRaikd&Q*m-Lj|*Dy$W{p^lrmOeimnmB7w z=!>EOs;VpU4!ns?aWU4iZnMTrSt|+g9k85n`D%AgNb`784I4-$A9d0?6+JiItoA+y z&Wo<%!;5JETipO9TAf?}4XvX$+-kRocA17n&`vB=`9oUa1n@V&g-LP5wi>p|+t}HG zF4SeypW^#09ANcPRk`axolP!5#B`@e#uB3R)P>2*#?0VCzKRa+Q zhq7_I@%SZ`R0QT6Bn)u^UPS%|DBE-~x85|mm4Khi1IZYjbyp8rN5}~1n{zjFG*@+d zsw!+C)C-&|+Ps&#-QVB;yR<=F`g zLS#J&I;PSC%xk2m?rCULv3Vjr9i5@RKCn-f%T$6$MR^foA)K4C*G4nAb zbk2L+b@MKfEVFD@`HQZ(&Km-ew;^ltKvINrxiIGER{eH41D9-$Hd4nxY|w6lSlrSL zMCKDl-Vxxahu z)yZSf8mn|b(f^S1VQ591*}=i`6hhR_jlGqvnkv?zvY#gD4QTz?829pZ)EU^bdRvW2 zJeAxIR6rgvo5a~jWI~i}(sFTS>=w-(d+w1tz%7v0t9eN&doZOT}x=hKpsxtf$vVmd###dF&D6D1W?3f)2dQS)`!~ zIH$P;kJx6sLhZC`h_BUTVO>gj6iR;6*u)>#vv0ngh+0!#MaNnfrn^vO!z8A$DCzp+ z8_0VzE~PrpkK*dtv5!e|*1Z%_3I5ok3E-I*uSd(hy~h9yb4N!9I8f*6<;l`oQ)({p zHa;TG)JEWw6ROqemLvze)TLC-O5Q|jae%fDrr6Z#zLINiOn7@WxG2rbbOC8Uv!7e{ zm)_1ahz(-IsQ(SrwwL&e4@%PiqS7W~RnY zrydi&?npZDD{uE%Rj6byHxy0`sA)su6)?1))=})C*%~2|)R!H3BboXhK$2XC?P8Nw z6=FW0e2`3VrpvX}&(?UpUhcqyw51u^qwBiz_g|xe5M|Jn-DT;ug{&=X!ZXd<02}XK zZj3^#fwuP_ZIeJ7ucn!hu(`JWLHfP-?@XzIlIxpQLuEwOc~_?*Cbmo*6g~P|buaz> z`eD9Sd1T4DnD|PuoURPo0rSSQd;;u}DRB^#cn59uAl&3X407@xgW1E?k6ZforUR2{)x&IZ?Aa~U#Y+O*3A8Q%VMoN1d-7(o)5tvW4@w%aF$c`L?fBNW43y=6&;#G3 l|0$RIQ=k1mR2c9dpOYff`acfjn_Y15 0.000001; $Slic3r::loglevel = (defined($ENV{'SLIC3R_LOGLEVEL'}) && $ENV{'SLIC3R_LOGLEVEL'} =~ /^[1-9]/) ? $ENV{'SLIC3R_LOGLEVEL'} : 0; set_logging_level($Slic3r::loglevel); -# Let the palceholder parser evaluate one expression to initialize its local static macro_processor -# class instance in a thread safe manner. -Slic3r::GCode::PlaceholderParser->new->evaluate_boolean_expression('1==1'); - -# Open a file by converting $filename to local file system locales. -sub open { - my ($fh, $mode, $filename) = @_; - return CORE::open $$fh, $mode, encode_path($filename); -} - -sub tags { - my ($format) = @_; - $format //= ''; - my %tags; - # End of line - $tags{eol} = ($format eq 'html') ? '
' : "\n"; - # Heading - $tags{h2start} = ($format eq 'html') ? '' : ''; - $tags{h2end} = ($format eq 'html') ? '' : ''; - # Bold font - $tags{bstart} = ($format eq 'html') ? '' : ''; - $tags{bend} = ($format eq 'html') ? '' : ''; - # Verbatim - $tags{vstart} = ($format eq 'html') ? '
'  : '';
-    $tags{vend}    = ($format eq 'html') ? '
' : ''; - return %tags; -} - -sub slic3r_info -{ - my (%params) = @_; - my %tag = Slic3r::tags($params{format}); - my $out = ''; - $out .= "$tag{bstart}$Slic3r::FORK_NAME$tag{bend}$tag{eol}"; - $out .= "$tag{bstart}Version: $tag{bend}$Slic3r::VERSION$tag{eol}"; - $out .= "$tag{bstart}Build: $tag{bend}$Slic3r::BUILD$tag{eol}"; - return $out; -} - -sub copyright_info -{ - my (%params) = @_; - my %tag = Slic3r::tags($params{format}); - my $out = - 'Copyright © 2016 Vojtech Bubnik, Prusa Research.
' . - 'Copyright © 2011-2016 Alessandro Ranellucci.
' . - 'Slic3r is licensed under the ' . - 'GNU Affero General Public License, version 3.' . - '


' . - 'Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Y. Sapir, Mike Sheldrake and numerous others. ' . - 'Manual by Gary Hodgson. Inspired by the RepRap community.
' . - 'Slic3r logo designed by Corey Daniels, Silk Icon Set designed by Mark James. '; - return $out; -} - -sub system_info -{ - my (%params) = @_; - my %tag = Slic3r::tags($params{format}); - - my $out = ''; - $out .= "$tag{bstart}Operating System: $tag{bend}$Config{osname}$tag{eol}"; - $out .= "$tag{bstart}System Architecture: $tag{bend}$Config{archname}$tag{eol}"; - if ($^O eq 'MSWin32') { - $out .= "$tag{bstart}Windows Version: $tag{bend}" . `ver` . $tag{eol}; - } else { - # Hopefully some kind of unix / linux. - $out .= "$tag{bstart}System Version: $tag{bend}" . `uname -a` . $tag{eol}; - } - $out .= $tag{vstart} . Config::myconfig . $tag{vend}; - $out .= " $tag{bstart}\@INC:$tag{bend}$tag{eol}$tag{vstart}"; - foreach my $i (@INC) { - $out .= " $i\n"; - } - $out .= "$tag{vend}"; - return $out; -} - 1; diff --git a/lib/Slic3r/Config.pm b/lib/Slic3r/Config.pm index a9c822b96aa..dadf76a0abd 100644 --- a/lib/Slic3r/Config.pm +++ b/lib/Slic3r/Config.pm @@ -23,54 +23,10 @@ our $Options = print_config_def(); } } -# From command line parameters, used by slic3r.pl -sub new_from_cli { - my $class = shift; - my %args = @_; - - # Delete hash keys with undefined value. - delete $args{$_} for grep !defined $args{$_}, keys %args; - - # Replace the start_gcode, end_gcode ... hash values - # with the content of the files they reference. - for (qw(start end layer toolchange)) { - my $opt_key = "${_}_gcode"; - if ($args{$opt_key}) { - if (-e $args{$opt_key}) { - Slic3r::open(\my $fh, "<", $args{$opt_key}) - or die "Failed to open $args{$opt_key}\n"; - binmode $fh, ':utf8'; - $args{$opt_key} = do { local $/; <$fh> }; - close $fh; - } - } - } - - my $self = $class->new; - foreach my $opt_key (keys %args) { - my $opt_def = $Options->{$opt_key}; - - # we use set_deserialize() for bool options since GetOpt::Long doesn't handle - # arrays of boolean values - if ($opt_key =~ /^(?:bed_shape|duplicate_grid|extruder_offset)$/ || $opt_def->{type} eq 'bool') { - $self->set_deserialize($opt_key, $args{$opt_key}); - } elsif (my $shortcut = $opt_def->{shortcut}) { - $self->set($_, $args{$opt_key}) for @$shortcut; - } else { - $self->set($opt_key, $args{$opt_key}); - } - } - - return $self; -} - package Slic3r::Config::Static; use parent 'Slic3r::Config'; sub Slic3r::Config::GCode::new { Slic3r::Config::Static::new_GCodeConfig } sub Slic3r::Config::Print::new { Slic3r::Config::Static::new_PrintConfig } -sub Slic3r::Config::PrintObject::new { Slic3r::Config::Static::new_PrintObjectConfig } -sub Slic3r::Config::PrintRegion::new { Slic3r::Config::Static::new_PrintRegionConfig } -sub Slic3r::Config::Full::new { Slic3r::Config::Static::new_FullPrintConfig } 1; diff --git a/lib/Slic3r/ExPolygon.pm b/lib/Slic3r/ExPolygon.pm deleted file mode 100644 index 6adb650c212..00000000000 --- a/lib/Slic3r/ExPolygon.pm +++ /dev/null @@ -1,39 +0,0 @@ -package Slic3r::ExPolygon; -use strict; -use warnings; - -# an ExPolygon is a polygon with holes - -use List::Util qw(first); -use Slic3r::Geometry::Clipper qw(union_ex diff_pl); - -sub offset { - my $self = shift; - return Slic3r::Geometry::Clipper::offset(\@$self, @_); -} - -sub offset_ex { - my $self = shift; - return Slic3r::Geometry::Clipper::offset_ex(\@$self, @_); -} - -sub noncollapsing_offset_ex { - my $self = shift; - my ($distance, @params) = @_; - - return $self->offset_ex($distance + 1, @params); -} - -sub bounding_box { - my $self = shift; - return $self->contour->bounding_box; -} - -package Slic3r::ExPolygon::Collection; - -sub size { - my $self = shift; - return [ Slic3r::Geometry::size_2D([ map @$_, map @$_, @$self ]) ]; -} - -1; diff --git a/lib/Slic3r/ExtrusionLoop.pm b/lib/Slic3r/ExtrusionLoop.pm deleted file mode 100644 index f0a85778589..00000000000 --- a/lib/Slic3r/ExtrusionLoop.pm +++ /dev/null @@ -1,12 +0,0 @@ -package Slic3r::ExtrusionLoop; -use strict; -use warnings; - -use parent qw(Exporter); - -our @EXPORT_OK = qw(EXTRL_ROLE_DEFAULT - EXTRL_ROLE_CONTOUR_INTERNAL_PERIMETER EXTRL_ROLE_SKIRT); -our %EXPORT_TAGS = (roles => \@EXPORT_OK); - - -1; diff --git a/lib/Slic3r/ExtrusionPath.pm b/lib/Slic3r/ExtrusionPath.pm deleted file mode 100644 index 3e9e6b8c72c..00000000000 --- a/lib/Slic3r/ExtrusionPath.pm +++ /dev/null @@ -1,13 +0,0 @@ -package Slic3r::ExtrusionPath; -use strict; -use warnings; - -use parent qw(Exporter); - -our @EXPORT_OK = qw(EXTR_ROLE_PERIMETER EXTR_ROLE_EXTERNAL_PERIMETER EXTR_ROLE_OVERHANG_PERIMETER - EXTR_ROLE_FILL EXTR_ROLE_SOLIDFILL EXTR_ROLE_TOPSOLIDFILL EXTR_ROLE_GAPFILL EXTR_ROLE_BRIDGE - EXTR_ROLE_SKIRT EXTR_ROLE_SUPPORTMATERIAL EXTR_ROLE_SUPPORTMATERIAL_INTERFACE - EXTR_ROLE_NONE); -our %EXPORT_TAGS = (roles => \@EXPORT_OK); - -1; diff --git a/lib/Slic3r/Flow.pm b/lib/Slic3r/Flow.pm deleted file mode 100644 index fed894e9706..00000000000 --- a/lib/Slic3r/Flow.pm +++ /dev/null @@ -1,13 +0,0 @@ -package Slic3r::Flow; -use strict; -use warnings; - -use parent qw(Exporter); - -our @EXPORT_OK = qw(FLOW_ROLE_EXTERNAL_PERIMETER FLOW_ROLE_PERIMETER FLOW_ROLE_INFILL - FLOW_ROLE_SOLID_INFILL - FLOW_ROLE_TOP_SOLID_INFILL FLOW_ROLE_SUPPORT_MATERIAL - FLOW_ROLE_SUPPORT_MATERIAL_INTERFACE); -our %EXPORT_TAGS = (roles => \@EXPORT_OK); - -1; diff --git a/lib/Slic3r/Geometry.pm b/lib/Slic3r/Geometry.pm index 286a73e2ded..6a2161d2884 100644 --- a/lib/Slic3r/Geometry.pm +++ b/lib/Slic3r/Geometry.pm @@ -9,26 +9,15 @@ our @ISA = qw(Exporter); our @EXPORT_OK = qw( PI epsilon - angle3points - collinear - dot - line_intersection - normalize - point_in_segment - polyline_lines - polygon_is_convex - polygon_segment_having_point scale unscale scaled_epsilon - size_2D X Y Z convex_hull chained_path_from deg2rad rad2deg - rad2deg_dir ); use constant PI => 4 * atan2(1, 1); @@ -45,227 +34,4 @@ sub scaled_epsilon () { epsilon / &Slic3r::SCALING_FACTOR } sub scale ($) { $_[0] / &Slic3r::SCALING_FACTOR } sub unscale ($) { $_[0] * &Slic3r::SCALING_FACTOR } -# used by geometry.t, polygon_segment_having_point -sub point_in_segment { - my ($point, $line) = @_; - - my ($x, $y) = @$point; - my $line_p = $line->pp; - my @line_x = sort { $a <=> $b } $line_p->[A][X], $line_p->[B][X]; - my @line_y = sort { $a <=> $b } $line_p->[A][Y], $line_p->[B][Y]; - - # check whether the point is in the segment bounding box - return 0 unless $x >= ($line_x[0] - epsilon) && $x <= ($line_x[1] + epsilon) - && $y >= ($line_y[0] - epsilon) && $y <= ($line_y[1] + epsilon); - - # if line is vertical, check whether point's X is the same as the line - if ($line_p->[A][X] == $line_p->[B][X]) { - return abs($x - $line_p->[A][X]) < epsilon ? 1 : 0; - } - - # calculate the Y in line at X of the point - my $y3 = $line_p->[A][Y] + ($line_p->[B][Y] - $line_p->[A][Y]) - * ($x - $line_p->[A][X]) / ($line_p->[B][X] - $line_p->[A][X]); - return abs($y3 - $y) < epsilon ? 1 : 0; -} - -# used by geometry.t -sub polyline_lines { - my ($polyline) = @_; - my @points = @$polyline; - return map Slic3r::Line->new(@points[$_, $_+1]), 0 .. $#points-1; -} - -# given a $polygon, return the (first) segment having $point -# used by geometry.t -sub polygon_segment_having_point { - my ($polygon, $point) = @_; - - foreach my $line (@{ $polygon->lines }) { - return $line if point_in_segment($point, $line); - } - return undef; -} - -# polygon must be simple (non complex) and ccw -sub polygon_is_convex { - my ($points) = @_; - for (my $i = 0; $i <= $#$points; $i++) { - my $angle = angle3points($points->[$i-1], $points->[$i-2], $points->[$i]); - return 0 if $angle < PI; - } - return 1; -} - -sub normalize { - my ($line) = @_; - - my $len = sqrt( ($line->[X]**2) + ($line->[Y]**2) + ($line->[Z]**2) ) - or return [0, 0, 0]; # to avoid illegal division by zero - return [ map $_ / $len, @$line ]; -} - -# 2D dot product -# used by 3DScene.pm -sub dot { - my ($u, $v) = @_; - return $u->[X] * $v->[X] + $u->[Y] * $v->[Y]; -} - -sub line_intersection { - my ($line1, $line2, $require_crossing) = @_; - $require_crossing ||= 0; - - my $intersection = _line_intersection(map @$_, @$line1, @$line2); - return (ref $intersection && $intersection->[1] == $require_crossing) - ? $intersection->[0] - : undef; -} - -# Used by test cases. -sub collinear { - my ($line1, $line2, $require_overlapping) = @_; - my $intersection = _line_intersection(map @$_, @$line1, @$line2); - return 0 unless !ref($intersection) - && ($intersection eq 'parallel collinear' - || ($intersection eq 'parallel vertical' && abs($line1->[A][X] - $line2->[A][X]) < epsilon)); - - if ($require_overlapping) { - my @box_a = bounding_box([ $line1->[0], $line1->[1] ]); - my @box_b = bounding_box([ $line2->[0], $line2->[1] ]); - return 0 unless bounding_box_intersect( 2, @box_a, @box_b ); - } - - return 1; -} - -sub _line_intersection { - my ( $x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3 ) = @_; - - my ($x, $y); # The as-yet-undetermined intersection point. - - my $dy10 = $y1 - $y0; # dyPQ, dxPQ are the coordinate differences - my $dx10 = $x1 - $x0; # between the points P and Q. - my $dy32 = $y3 - $y2; - my $dx32 = $x3 - $x2; - - my $dy10z = abs( $dy10 ) < epsilon; # Is the difference $dy10 "zero"? - my $dx10z = abs( $dx10 ) < epsilon; - my $dy32z = abs( $dy32 ) < epsilon; - my $dx32z = abs( $dx32 ) < epsilon; - - my $dyx10; # The slopes. - my $dyx32; - - $dyx10 = $dy10 / $dx10 unless $dx10z; - $dyx32 = $dy32 / $dx32 unless $dx32z; - - # Now we know all differences and the slopes; - # we can detect horizontal/vertical special cases. - # E.g., slope = 0 means a horizontal line. - - unless ( defined $dyx10 or defined $dyx32 ) { - return "parallel vertical"; - } - elsif ( $dy10z and not $dy32z ) { # First line horizontal. - $y = $y0; - $x = $x2 + ( $y - $y2 ) * $dx32 / $dy32; - } - elsif ( not $dy10z and $dy32z ) { # Second line horizontal. - $y = $y2; - $x = $x0 + ( $y - $y0 ) * $dx10 / $dy10; - } - elsif ( $dx10z and not $dx32z ) { # First line vertical. - $x = $x0; - $y = $y2 + $dyx32 * ( $x - $x2 ); - } - elsif ( not $dx10z and $dx32z ) { # Second line vertical. - $x = $x2; - $y = $y0 + $dyx10 * ( $x - $x0 ); - } - elsif ( abs( $dyx10 - $dyx32 ) < epsilon ) { - # The slopes are suspiciously close to each other. - # Either we have parallel collinear or just parallel lines. - - # The bounding box checks have already weeded the cases - # "parallel horizontal" and "parallel vertical" away. - - my $ya = $y0 - $dyx10 * $x0; - my $yb = $y2 - $dyx32 * $x2; - - return "parallel collinear" if abs( $ya - $yb ) < epsilon; - return "parallel"; - } - else { - # None of the special cases matched. - # We have a "honest" line intersection. - - $x = ($y2 - $y0 + $dyx10*$x0 - $dyx32*$x2)/($dyx10 - $dyx32); - $y = $y0 + $dyx10 * ($x - $x0); - } - - my $h10 = $dx10 ? ($x - $x0) / $dx10 : ($dy10 ? ($y - $y0) / $dy10 : 1); - my $h32 = $dx32 ? ($x - $x2) / $dx32 : ($dy32 ? ($y - $y2) / $dy32 : 1); - - return [Slic3r::Point->new($x, $y), $h10 >= 0 && $h10 <= 1 && $h32 >= 0 && $h32 <= 1]; -} - -# 2D -sub bounding_box { - my ($points) = @_; - - my @x = map $_->x, @$points; - my @y = map $_->y, @$points; #,, - my @bb = (undef, undef, undef, undef); - for (0..$#x) { - $bb[X1] = $x[$_] if !defined $bb[X1] || $x[$_] < $bb[X1]; - $bb[X2] = $x[$_] if !defined $bb[X2] || $x[$_] > $bb[X2]; - $bb[Y1] = $y[$_] if !defined $bb[Y1] || $y[$_] < $bb[Y1]; - $bb[Y2] = $y[$_] if !defined $bb[Y2] || $y[$_] > $bb[Y2]; - } - - return @bb[X1,Y1,X2,Y2]; -} - -# used by ExPolygon::size -sub size_2D { - my @bounding_box = bounding_box(@_); - return ( - ($bounding_box[X2] - $bounding_box[X1]), - ($bounding_box[Y2] - $bounding_box[Y1]), - ); -} - -# Used by sub collinear, which is used by test cases. -# bounding_box_intersect($d, @a, @b) -# Return true if the given bounding boxes @a and @b intersect -# in $d dimensions. Used by sub collinear. -sub bounding_box_intersect { - my ( $d, @bb ) = @_; # Number of dimensions and box coordinates. - my @aa = splice( @bb, 0, 2 * $d ); # The first box. - # (@bb is the second one.) - - # Must intersect in all dimensions. - for ( my $i_min = 0; $i_min < $d; $i_min++ ) { - my $i_max = $i_min + $d; # The index for the maximum. - return 0 if ( $aa[ $i_max ] + epsilon ) < $bb[ $i_min ]; - return 0 if ( $bb[ $i_max ] + epsilon ) < $aa[ $i_min ]; - } - - return 1; -} - -# Used by test cases. -# this assumes a CCW rotation from $p2 to $p3 around $p1 -sub angle3points { - my ($p1, $p2, $p3) = @_; - # p1 is the center - - my $angle = atan2($p2->[X] - $p1->[X], $p2->[Y] - $p1->[Y]) - - atan2($p3->[X] - $p1->[X], $p3->[Y] - $p1->[Y]); - - # we only want to return only positive angles - return $angle <= 0 ? $angle + 2*PI() : $angle; -} - 1; diff --git a/lib/Slic3r/Geometry/Clipper.pm b/lib/Slic3r/Geometry/Clipper.pm deleted file mode 100644 index b7a7da77275..00000000000 --- a/lib/Slic3r/Geometry/Clipper.pm +++ /dev/null @@ -1,14 +0,0 @@ -package Slic3r::Geometry::Clipper; -use strict; -use warnings; - -require Exporter; -our @ISA = qw(Exporter); -our @EXPORT_OK = qw( - offset - offset_ex offset2_ex - diff_ex diff union_ex intersection_ex - JT_ROUND JT_MITER JT_SQUARE - intersection intersection_pl diff_pl union); - -1; diff --git a/lib/Slic3r/Layer.pm b/lib/Slic3r/Layer.pm deleted file mode 100644 index 4bff9b61fb9..00000000000 --- a/lib/Slic3r/Layer.pm +++ /dev/null @@ -1,37 +0,0 @@ -# Extends the C++ class Slic3r::Layer. - -package Slic3r::Layer; -use strict; -use warnings; - -# the following two were previously generated by Moo -sub print { - my $self = shift; - return $self->object->print; -} - -sub config { - my $self = shift; - return $self->object->config; -} - -sub region { - my $self = shift; - my ($region_id) = @_; - - while ($self->region_count <= $region_id) { - $self->add_region($self->object->print->get_region($self->region_count)); - } - - return $self->get_region($region_id); -} - -sub regions { - my ($self) = @_; - return [ map $self->get_region($_), 0..($self->region_count-1) ]; -} - -package Slic3r::Layer::Support; -our @ISA = qw(Slic3r::Layer); - -1; diff --git a/lib/Slic3r/Line.pm b/lib/Slic3r/Line.pm index bf53520d2d5..16b609c95ee 100644 --- a/lib/Slic3r/Line.pm +++ b/lib/Slic3r/Line.pm @@ -5,15 +5,4 @@ use warnings; # a line is a two-points line use parent 'Slic3r::Polyline'; -sub intersection { - my $self = shift; - my ($line, $require_crossing) = @_; - return Slic3r::Geometry::line_intersection($self, $line, $require_crossing); -} - -sub grow { - my $self = shift; - return Slic3r::Polyline->new(@$self)->grow(@_); -} - 1; diff --git a/lib/Slic3r/Model.pm b/lib/Slic3r/Model.pm index ec31f6c8a1c..d44e9878dd7 100644 --- a/lib/Slic3r/Model.pm +++ b/lib/Slic3r/Model.pm @@ -133,11 +133,4 @@ sub add_instance { } } -sub mesh_stats { - my $self = shift; - - # TODO: sum values from all volumes - return $self->volumes->[0]->mesh->stats; -} - 1; diff --git a/lib/Slic3r/Polygon.pm b/lib/Slic3r/Polygon.pm index 16222141a82..d5445047d94 100644 --- a/lib/Slic3r/Polygon.pm +++ b/lib/Slic3r/Polygon.pm @@ -5,9 +5,4 @@ use warnings; # a polygon is a closed polyline. use parent 'Slic3r::Polyline'; -sub grow { - my $self = shift; - return $self->split_at_first_point->grow(@_); -} - -1; \ No newline at end of file +1; diff --git a/lib/Slic3r/Print/Object.pm b/lib/Slic3r/Print/Object.pm deleted file mode 100644 index 0385f88b88b..00000000000 --- a/lib/Slic3r/Print/Object.pm +++ /dev/null @@ -1,24 +0,0 @@ -package Slic3r::Print::Object; -# extends c++ class Slic3r::PrintObject (Print.xsp) -use strict; -use warnings; - -use List::Util qw(min max sum first); -use Slic3r::Flow ':roles'; -use Slic3r::Geometry qw(scale epsilon); -use Slic3r::Geometry::Clipper qw(diff diff_ex intersection intersection_ex union union_ex - offset offset_ex offset2_ex JT_MITER); -use Slic3r::Print::State ':steps'; -use Slic3r::Surface ':types'; - -sub layers { - my $self = shift; - return [ map $self->get_layer($_), 0..($self->layer_count - 1) ]; -} - -sub support_layers { - my $self = shift; - return [ map $self->get_support_layer($_), 0..($self->support_layer_count - 1) ]; -} - -1; diff --git a/lib/Slic3r/Print/State.pm b/lib/Slic3r/Print/State.pm deleted file mode 100644 index 17c614f1be7..00000000000 --- a/lib/Slic3r/Print/State.pm +++ /dev/null @@ -1,12 +0,0 @@ -# Wraps C++ enums Slic3r::PrintStep and Slic3r::PrintObjectStep -package Slic3r::Print::State; -use strict; -use warnings; - -require Exporter; -our @ISA = qw(Exporter); -our @EXPORT_OK = qw(STEP_SLICE STEP_PERIMETERS STEP_PREPARE_INFILL - STEP_INFILL STEP_SUPPORTMATERIAL STEP_SKIRT STEP_BRIM STEP_WIPE_TOWER); -our %EXPORT_TAGS = (steps => \@EXPORT_OK); - -1; diff --git a/lib/Slic3r/Surface.pm b/lib/Slic3r/Surface.pm deleted file mode 100644 index 0c5bb5d233e..00000000000 --- a/lib/Slic3r/Surface.pm +++ /dev/null @@ -1,15 +0,0 @@ -package Slic3r::Surface; -use strict; -use warnings; - -require Exporter; -our @ISA = qw(Exporter); -our @EXPORT_OK = qw(S_TYPE_TOP S_TYPE_BOTTOM S_TYPE_BOTTOMBRIDGE S_TYPE_INTERNAL S_TYPE_INTERNALSOLID S_TYPE_INTERNALBRIDGE S_TYPE_INTERNALVOID); -our %EXPORT_TAGS = (types => \@EXPORT_OK); - -sub p { - my $self = shift; - return @{$self->polygons}; -} - -1; diff --git a/resources/data/embossed_text.obj b/resources/data/embossed_text.obj new file mode 100644 index 00000000000..8f6f09f41ee --- /dev/null +++ b/resources/data/embossed_text.obj @@ -0,0 +1,2555 @@ +v -18.02 2 -1 +v -17.5 -0.13 -1 +v -18.02 -1.94 -1 +v 5.62 0.93 -1 +v 5.93 0.58 -1 +v 5.65 0.49 -1 +v -17.5 0.33 -1 +v -15.07 -1.94 -1 +v -17.5 -1.47 -1 +v -15.31 -0.13 -1 +v -15.31 0.33 -1 +v -17.5 1.54 -1 +v -11.91 0.85 -1 +v -11.73 0.54 -1 +v -12.12 0.7 -1 +v -15.16 1.54 -1 +v -15.16 2 -1 +v -15.07 -1.47 -1 +v 6.78 -1.58 -1 +v 6.62 -1.76 -1 +v 6.37 -1.52 -1 +v 6.69 -1.14 -1 +v 6.56 -1.35 -1 +v -9.33 0.59 -1 +v -9.81 2 -1 +v -9.33 2 -1 +v 6.78 -1.94 -1 +v 7.23 -1.94 -1 +v 6.74 2 -1 +v 7.23 2 -1 +v 6.74 0.59 -1 +v 5.95 0.98 -1 +v 2.05 -1.62 -1 +v 2.5 -1.41 -1 +v 2.25 -1.79 -1 +v 5.33 0.1 -1 +v 5.24 -0.34 -1 +v 4.78 -0.1 -1 +v -6.35 -1.79 -1 +v -6.25 -1 -1 +v -6 -1.5 -1 +v 4.74 -0.51 -1 +v 5.27 -0.88 -1 +v -4.84 -1.11 -1 +v -4.74 -0.66 -1 +v -4.26 -0.84 -1 +v 6.2 0.95 -1 +v 6.5 0.83 -1 +v 6.16 0.56 -1 +v 5.09 -1.59 -1 +v 4.9 -1.29 -1 +v 5.41 -1 -1 +v 5.34 -1.82 -1 +v 5.65 -1.5 -1 +v 5.87 -1.59 -1 +v 5.65 -1.96 -1 +v 3.96 -1.69 -1 +v 3.68 -1.28 -1 +v 4.2 -1.37 -1 +v 5.98 -2 -1 +v 3.81 -1.02 -1 +v 6.44 -1.9 -1 +v 4.78 -0.92 -1 +v 4.89 0.26 -1 +v 5 0.49 -1 +v 5.46 0.31 -1 +v 5.25 0.75 -1 +v 6.38 0.47 -1 +v 6.62 0.22 -1 +v 6.76 -0.15 -1 +v 10.39 -1.52 -1 +v 10.65 -1.93 -1 +v 10.36 -1.98 -1 +v 6.78 -0.72 -1 +v 6.09 -1.61 -1 +v 6.22 -1.98 -1 +v -8.06 -1.33 -1 +v -7.92 -1.11 -1 +v -7.69 -1.6 -1 +v 3.54 0.88 -1 +v 3.45 0.47 -1 +v 3.15 0.98 -1 +v 2.49 -1.91 -1 +v 2.78 -1.57 -1 +v -9.02 -1.9 -1 +v -9.2 -1.77 -1 +v -8.9 -1.55 -1 +v -7.85 -0.13 -1 +v -7.33 -0.27 -1 +v -7.83 -0.68 -1 +v 2.35 -1.21 -1 +v -7.83 0.74 -1 +v -8.22 0.47 -1 +v -8.04 0.87 -1 +v -8.94 0.49 -1 +v -9.19 0.24 -1 +v -8.29 0.95 -1 +v -8.49 0.58 -1 +v -8.69 0.98 -1 +v 2.23 -0.95 -1 +v 1.69 -0.75 -1 +v 2.19 -0.63 -1 +v 2.21 -0.23 -1 +v -4.33 -1.16 -1 +v -4.43 -1.4 -1 +v -7.98 0.23 -1 +v 4.12 0.37 -1 +v 3.77 0 -1 +v 3.67 0.25 -1 +v -12.82 0.95 -1 +v -13.02 0.53 -1 +v -13.11 0.98 -1 +v -9.33 -0.09 -1 +v -8.54 -1.61 -1 +v -8.81 -1.98 -1 +v -13.91 -0.15 -1 +v -13.98 0.51 -1 +v -13.85 0.14 -1 +v -9.32 -1.02 -1 +v -9.18 -1.31 -1 +v -9.36 -1.58 -1 +v -9.81 -1.94 -1 +v -9.36 -1.94 -1 +v -8.42 -2 -1 +v -8.26 -1.51 -1 +v -7.42 -1.12 -1 +v -12.3 0.48 -1 +v -11.97 0.41 -1 +v -9.09 0.83 -1 +v -8.74 0.56 -1 +v -7.66 0.57 -1 +v -7.47 0.27 -1 +v -7.35 -0.81 -1 +v -7.53 -1.38 -1 +v -7.97 -1.84 -1 +v 10.58 -1.51 -1 +v 17.42 -1.96 -1 +v 17.58 -1.5 -1 +v 17.73 -1.98 -1 +v 17.47 -1.37 -1 +v 17.02 -1.64 -1 +v 16.98 -1.27 -1 +v 10.22 -1.5 -1 +v 9.62 -1.27 -1 +v 10.11 -1.37 -1 +v 9.65 -1.64 -1 +v 9.26 0.91 -1 +v 9.61 0.54 -1 +v 9.26 0.54 -1 +v -9.37 -0.58 -1 +v 9.61 1.62 -1 +v 10.1 0.91 -1 +v 9.61 0.91 -1 +v 10.58 0.91 -1 +v 10.58 0.54 -1 +v 10.1 0.54 -1 +v 10.1 1.92 -1 +v 9.82 -1.86 -1 +v 10.05 -1.96 -1 +v 12.64 -1.97 -1 +v 12.11 -2 -1 +v 12.26 -1.61 -1 +v 17.76 -1.52 -1 +v 17.95 -1.51 -1 +v 18.02 -1.93 -1 +v 16.98 0.54 -1 +v 16.63 0.91 -1 +v 16.98 0.91 -1 +v 17.46 0.54 -1 +v 17.46 0.91 -1 +v 12.51 -1.57 -1 +v 16.98 1.62 -1 +v 17.95 0.91 -1 +v 17.95 0.54 -1 +v 17.46 1.92 -1 +v 16.63 0.54 -1 +v 12.89 -1.28 -1 +v 13.41 -1.37 -1 +v 13.17 -1.69 -1 +v 13.02 -1.02 -1 +v 17.19 -1.86 -1 +v 15.13 -0.06 -1 +v 15.83 0.91 -1 +v 16.41 0.91 -1 +v 15.42 -0.42 -1 +v 12.72 -1.46 -1 +v 15.15 -0.81 -1 +v 14.39 -1.94 -1 +v 14.85 -0.45 -1 +v 13.52 -1.08 -1 +v 12.91 -1.87 -1 +v 11.46 -1.79 -1 +v 11.71 -1.41 -1 +v 11.7 -1.91 -1 +v 11.43 -0.23 -1 +v 11.4 -0.63 -1 +v 10.9 -0.75 -1 +v 11.99 -1.57 -1 +v 11.26 -1.62 -1 +v 11.56 -1.21 -1 +v 11.1 -1.4 -1 +v 11.44 -0.95 -1 +v 10.99 -1.15 -1 +v 14.49 0.91 -1 +v 13.89 0.91 -1 +v -14.41 0.91 -1 +v 11.48 0.04 -1 +v 10.92 -0.19 -1 +v 10.99 0.1 -1 +v 13.02 -0.23 -1 +v 11.11 0.36 -1 +v 11.58 0.24 -1 +v 11.27 0.58 -1 +v 11.74 0.42 -1 +v 11.47 0.75 -1 +v 12.01 0.55 -1 +v 11.7 0.88 -1 +v 11.95 0.95 -1 +v 12.36 0.58 -1 +v 12.36 0.98 -1 +v 12.66 0.47 -1 +v 12.76 0.88 -1 +v 12.98 0.76 -1 +v 12.88 0.25 -1 +v 13.17 0.59 -1 +v 13.33 0.37 -1 +v 12.99 0 -1 +v 13.48 0.02 -1 +v 13.54 -0.63 -1 +v -13.75 0.32 -1 +v -13.6 0.45 -1 +v -13.32 0.56 -1 +v -13.62 0.85 -1 +v -13.38 0.95 -1 +v -12.85 0.43 -1 +v -12.75 0.25 -1 +v -12.41 0.69 -1 +v -12.14 0.2 -1 +v -12.22 -0.1 -1 +v -12.71 0.02 -1 +v -10.83 0.81 -1 +v -11.23 0.48 -1 +v -11.13 0.95 -1 +v -11.67 0.95 -1 +v -12.71 -1.94 -1 +v -12.22 -1.94 -1 +v -11.02 0.06 -1 +v -11.08 0.33 -1 +v -10.54 0.21 -1 +v -11.41 0.98 -1 +v -11.41 0.55 -1 +v -10.53 -1.94 -1 +v -11.01 -1.94 -1 +v -10.63 0.56 -1 +v -14.41 -1.94 -1 +v -12.59 0.85 -1 +v -13.82 0.7 -1 +v -13.98 0.91 -1 +v 3.81 -0.23 -1 +v 4.33 -0.63 -1 +v -13.93 -1.94 -1 +v 3.51 -1.46 -1 +v 4.31 -1.08 -1 +v 3.43 -1.97 -1 +v 3.7 -1.87 -1 +v 3.3 -1.57 -1 +v 3.05 -1.61 -1 +v 1.89 -1.4 -1 +v 1.71 -0.19 -1 +v 2.26 0.04 -1 +v 3.96 0.59 -1 +v 3.77 0.76 -1 +v 2.74 0.95 -1 +v 2.8 0.55 -1 +v -4.97 -1.33 -1 +v 2.48 0.88 -1 +v 2.53 0.42 -1 +v 2.06 0.58 -1 +v 2.36 0.24 -1 +v 1.89 0.36 -1 +v 1.78 0.1 -1 +v -5.73 0.98 -1 +v -5.47 0.57 -1 +v -5.75 0.56 -1 +v -2.89 -1.58 -1 +v -2.57 -1.61 -1 +v -2.41 -2 -1 +v 0.62 0.31 -1 +v 0.84 0.77 -1 +v 0.99 0.62 -1 +v 1.78 -1.15 -1 +v 1.1 0.43 -1 +v -5.86 -1.98 -1 +v -6.12 -1.91 -1 +v 0.62 -0.88 -1 +v 0.4 -0.8 -1 +v 0.73 -0.38 -1 +v 2.9 -2 -1 +v 16.49 -1.94 -1 +v 15.89 -1.94 -1 +v 2.26 0.75 -1 +v 3.14 0.58 -1 +v 4.27 0.02 -1 +v -0.56 -1.87 -1 +v -0.37 -1.47 -1 +v -0.25 -1.98 -1 +v -4.24 -0.23 -1 +v -0.47 0.01 -1 +v -0.78 -0.38 -1 +v -0.91 -0.22 -1 +v -5.04 0.88 -1 +v -5.16 0.47 -1 +v -5.29 0.96 -1 +v 0.95 -1.75 -1 +v 0.72 -1.89 -1 +v 0.61 -1.47 -1 +v -0.5 -0.54 -1 +v -0.28 -0.09 -1 +v -5.97 0.48 -1 +v 1.13 -1.56 -1 +v 0.73 -1.32 -1 +v -6.67 0.44 -1 +v -6.18 0.31 -1 +v -6.32 0.09 -1 +v 0.77 -1.15 -1 +v 1.23 -1.33 -1 +v 0.5 0.46 -1 +v 0.26 0.57 -1 +v 0.62 0.88 -1 +v -0.55 0.18 -1 +v -1.01 0.03 -1 +v -4.45 0.38 -1 +v -4.33 0.13 -1 +v -4.9 0.21 -1 +v -4.76 -0.13 -1 +v -6.71 -1.4 -1 +v -6.55 -1.62 -1 +v -5.69 -1.6 -1 +v -5.58 -2 -1 +v -4.65 -1.67 -1 +v -5.19 -1.51 -1 +v -5.22 -1.96 -1 +v -5.4 -1.59 -1 +v -6.39 -0.88 -1 +v -6.83 -1.15 -1 +v -6.92 -0.72 -1 +v -6.42 -0.34 -1 +v -6.89 -0.14 -1 +v -6.81 0.18 -1 +v -6.48 0.66 -1 +v -6.2 0.85 -1 +v -4.81 0.76 -1 +v -4.61 0.59 -1 +v -4.89 -1.83 -1 +v 1.16 0.18 -1 +v 0.69 0.11 -1 +v -0.98 0.41 -1 +v -1.52 -1.33 -1 +v -1.63 -1.56 -1 +v -2.02 -1.32 -1 +v -1.51 -0.87 -1 +v -1.98 -1.15 -1 +v -2.02 -1 -1 +v -0.5 0.88 -1 +v -0.37 0.5 -1 +v -0.78 0.71 -1 +v -0.15 0.57 -1 +v -0.09 0.98 -1 +v 0.34 0.96 -1 +v -2.92 0.57 -1 +v -3.27 0.88 -1 +v -2.86 0.98 -1 +v -2.49 0.57 -1 +v -3.54 0.71 -1 +v -3.13 0.5 -1 +v -3.28 0.35 -1 +v -0.51 0.35 -1 +v -3.26 -0.54 -1 +v -3.05 -0.09 -1 +v -2.35 -0.8 -1 +v -1.8 -1.75 -1 +v -2.03 -1.89 -1 +v -2.14 -1.47 -1 +v -0.78 -1.73 -1 +v -0.54 -1.26 -1 +v -1 -1.42 -1 +v 0.18 -1.61 -1 +v 0.46 -1.56 -1 +v 0.34 -2 -1 +v 1.24 -0.87 -1 +v 1.27 -1.1 -1 +v 1.02 -0.54 -1 +v 0.73 -1 -1 +v 1.15 -0.68 -1 +v -3.13 -1.47 -1 +v -3.01 -1.98 -1 +v -3.33 -1.87 -1 +v -0.62 -1.01 -1 +v -2.29 -1.56 -1 +v -1.1 -1.08 -1 +v -2.02 -0.38 -1 +v -2.13 -0.88 -1 +v -0.13 -1.58 -1 +v -1.74 -0.54 -1 +v -2.13 0.31 -1 +v -1.65 0.43 -1 +v -2.06 0.11 -1 +v -3.23 0.01 -1 +v -3.54 -0.38 -1 +v -3.38 -1.01 -1 +v -3.3 -1.26 -1 +v -3.76 -1.42 -1 +v -3.67 -0.22 -1 +v -3.78 0.03 -1 +v -3.74 0.41 -1 +v -3.31 0.18 -1 +v -2.41 0.96 -1 +v -2.13 0.88 -1 +v -2.25 0.46 -1 +v -1.91 0.77 -1 +v -1.76 0.62 -1 +v -1.59 0.18 -1 +v -1.48 -1.1 -1 +v -1.6 -0.68 -1 +v -3.55 -1.73 -1 +v -3.86 -1.08 -1 +v 13.81 -1.94 -1 +v -18.02 2 1 +v -18.02 -1.94 1 +v -17.5 -0.13 1 +v 5.62 0.93 1 +v 5.63 0.47 1 +v 5.9 0.58 1 +v -17.5 0.33 1 +v -15.07 -1.94 1 +v -17.5 -1.47 1 +v -15.31 -0.13 1 +v -15.31 0.33 1 +v -17.5 1.54 1 +v -11.91 0.85 1 +v -12.12 0.7 1 +v -11.75 0.53 1 +v -15.16 1.54 1 +v -15.16 2 1 +v -15.07 -1.47 1 +v 6.78 -1.58 1 +v 6.39 -1.5 1 +v 6.62 -1.76 1 +v -9.33 0.59 1 +v -9.33 2 1 +v -9.81 2 1 +v 6.78 -1.94 1 +v 7.23 -1.94 1 +v 6.74 2 1 +v 6.74 0.59 1 +v 7.23 2 1 +v 5.95 0.98 1 +v 2.05 -1.62 1 +v 2.25 -1.79 1 +v 2.52 -1.43 1 +v -7.33 -0.33 1 +v -7.92 0.1 1 +v -7.83 -0.33 1 +v 5.4 0.23 1 +v 4.89 0.26 1 +v 5.27 -0.13 1 +v 4.74 -0.51 1 +v 5.24 -0.68 1 +v -6.35 -1.79 1 +v -5.97 -1.51 1 +v -6.18 -1.33 1 +v 4.78 -0.92 1 +v 5.34 -1.12 1 +v 6.2 0.95 1 +v 6.16 0.56 1 +v 6.53 0.81 1 +v 5.09 -1.59 1 +v 4.9 -1.29 1 +v 5.34 -1.82 1 +v 5.67 -1.51 1 +v 5.47 -1.33 1 +v 5.87 -1.59 1 +v 5.65 -1.96 1 +v 3.93 -1.71 1 +v 4.18 -1.4 1 +v 3.68 -1.28 1 +v 5.98 -2 1 +v 3.81 -1.02 1 +v 6.44 -1.9 1 +v 4.78 -0.1 1 +v 5.02 0.51 1 +v 5.27 0.77 1 +v 6.36 0.48 1 +v 6.61 0.24 1 +v 6.75 -0.11 1 +v 10.4 -1.52 1 +v 10.34 -1.98 1 +v 10.65 -1.93 1 +v 6.73 -1.02 1 +v 6.78 -0.68 1 +v 6.63 -1.26 1 +v 6.11 -1.6 1 +v 6.22 -1.98 1 +v 3.54 0.88 1 +v 3.2 0.98 1 +v 3.42 0.48 1 +v -7.99 -1.24 1 +v -7.53 -1.38 1 +v -7.85 -0.88 1 +v 2.49 -1.91 1 +v 2.81 -1.58 1 +v -9.02 -1.9 1 +v -9.02 -1.48 1 +v -9.2 -1.77 1 +v 2.35 -1.21 1 +v -7.83 0.74 1 +v -8.04 0.87 1 +v -8.24 0.49 1 +v -9.21 0.21 1 +v -8.96 0.47 1 +v -8.29 0.95 1 +v -8.65 0.98 1 +v -8.52 0.58 1 +v 2.24 -0.98 1 +v 2.19 -0.63 1 +v 1.71 -0.86 1 +v 2.21 -0.23 1 +v 1.69 -0.31 1 +v -4.33 -1.16 1 +v -4.76 -0.87 1 +v -4.45 -1.43 1 +v -8.05 0.31 1 +v 4.12 0.37 1 +v 3.66 0.26 1 +v 3.77 0.03 1 +v -12.82 0.95 1 +v -13.11 0.98 1 +v -13.04 0.54 1 +v -9.37 -0.35 1 +v -8.52 -1.6 1 +v -8.79 -1.58 1 +v -8.81 -1.98 1 +v -9.31 -0.02 1 +v -13.92 -0.18 1 +v -13.85 0.14 1 +v -13.98 0.51 1 +v -9.81 -1.94 1 +v -9.36 -1.94 1 +v -9.36 -1.58 1 +v -8.57 -2 1 +v -8.23 -1.5 1 +v -8.32 -1.98 1 +v -7.39 -1.02 1 +v -9.25 -1.19 1 +v -9.35 -0.87 1 +v -12.3 0.48 1 +v -11.99 0.39 1 +v -9.06 0.85 1 +v -8.74 0.56 1 +v -7.66 0.57 1 +v -7.45 0.23 1 +v -7.69 -1.6 1 +v -8.01 -1.87 1 +v 10.58 -1.51 1 +v 17.42 -1.96 1 +v 17.7 -1.98 1 +v 17.59 -1.5 1 +v 17.48 -1.38 1 +v 16.98 -1 1 +v 17.02 -1.62 1 +v 10.23 -1.5 1 +v 9.61 -1 1 +v 9.65 -1.62 1 +v 10.11 -1.38 1 +v 9.26 0.91 1 +v 9.26 0.54 1 +v 9.61 0.54 1 +v 9.61 1.62 1 +v 9.61 0.91 1 +v 10.1 0.91 1 +v 10.58 0.54 1 +v 10.58 0.91 1 +v 10.1 0.54 1 +v 10.1 1.92 1 +v 9.8 -1.84 1 +v 10.05 -1.96 1 +v 12.6 -1.98 1 +v 12.26 -1.61 1 +v 12.06 -2 1 +v 17.77 -1.52 1 +v 18.02 -1.93 1 +v 17.95 -1.51 1 +v 16.98 0.54 1 +v 16.98 0.91 1 +v 16.63 0.91 1 +v 17.46 0.54 1 +v 17.46 0.91 1 +v 12.51 -1.57 1 +v 16.98 1.62 1 +v 17.95 0.54 1 +v 17.95 0.91 1 +v 17.46 1.92 1 +v 16.63 0.54 1 +v 12.89 -1.28 1 +v 13.15 -1.71 1 +v 13.4 -1.4 1 +v 13.02 -1.02 1 +v 17.16 -1.84 1 +v 15.13 -0.06 1 +v 16.41 0.91 1 +v 15.83 0.91 1 +v 15.42 -0.42 1 +v 12.72 -1.46 1 +v 15.15 -0.81 1 +v 14.85 -0.45 1 +v 14.39 -1.94 1 +v 13.52 -1.08 1 +v 12.91 -1.87 1 +v 11.46 -1.79 1 +v 11.7 -1.91 1 +v 11.74 -1.43 1 +v 11.43 -0.23 1 +v 10.9 -0.31 1 +v 11.4 -0.63 1 +v 12.02 -1.58 1 +v 11.26 -1.62 1 +v 11.56 -1.21 1 +v 11.1 -1.4 1 +v 11.45 -0.98 1 +v 10.99 -1.15 1 +v 10.92 -0.86 1 +v 14.49 0.91 1 +v 13.89 0.91 1 +v -14.41 0.91 1 +v 11.47 0.01 1 +v 10.99 0.1 1 +v 13.02 -0.23 1 +v 11.11 0.36 1 +v 11.58 0.24 1 +v 11.27 0.58 1 +v 11.72 0.4 1 +v 11.47 0.75 1 +v 11.99 0.55 1 +v 11.7 0.88 1 +v 11.95 0.95 1 +v 12.32 0.58 1 +v 12.41 0.98 1 +v 12.64 0.48 1 +v 12.76 0.88 1 +v 12.98 0.76 1 +v 12.87 0.26 1 +v 13.17 0.59 1 +v 13.33 0.37 1 +v 12.98 0.03 1 +v 13.45 0.12 1 +v 13.51 -0.17 1 +v 13.54 -0.63 1 +v -13.75 0.32 1 +v -13.6 0.45 1 +v -13.35 0.55 1 +v -13.62 0.85 1 +v -13.38 0.95 1 +v -12.87 0.45 1 +v -12.41 0.69 1 +v -12.76 0.27 1 +v -12.15 0.17 1 +v -12.71 0.04 1 +v -12.22 -0.12 1 +v -10.8 0.79 1 +v -11.1 0.94 1 +v -11.23 0.48 1 +v -11.67 0.95 1 +v -12.71 -1.94 1 +v -12.22 -1.94 1 +v -11.02 0.08 1 +v -10.54 0.18 1 +v -11.1 0.35 1 +v -11.44 0.56 1 +v -11.41 0.98 1 +v -10.53 -1.94 1 +v -11.01 -1.94 1 +v -10.61 0.53 1 +v -14.41 -1.94 1 +v -12.59 0.85 1 +v -13.82 0.7 1 +v -13.98 0.91 1 +v 4.33 -0.63 1 +v 3.81 -0.23 1 +v -13.93 -1.94 1 +v 3.51 -1.46 1 +v 4.31 -1.08 1 +v 3.39 -1.98 1 +v 3.7 -1.87 1 +v 3.3 -1.57 1 +v 3.05 -1.61 1 +v 1.89 -1.4 1 +v 2.25 0.01 1 +v 3.96 0.59 1 +v 3.77 0.76 1 +v 2.74 0.95 1 +v 2.77 0.55 1 +v 2.48 0.88 1 +v 2.51 0.4 1 +v 2.06 0.58 1 +v 2.36 0.24 1 +v -4.61 0.59 1 +v -4.98 0.3 1 +v -4.84 0.09 1 +v 1.89 0.36 1 +v 1.78 0.1 1 +v -6.92 -0.66 1 +v -6.32 -1.12 1 +v -6.42 -0.68 1 +v -2.86 -1.59 1 +v -2.64 -2 1 +v -2.54 -1.6 1 +v 0.62 0.31 1 +v 0.99 0.62 1 +v 0.84 0.77 1 +v 1.78 -1.15 1 +v 1.1 0.43 1 +v -6.03 -1.95 1 +v 0.61 -0.88 1 +v 0.76 -0.39 1 +v 0.38 -0.79 1 +v 2.85 -2 1 +v 16.49 -1.94 1 +v 15.89 -1.94 1 +v 2.26 0.75 1 +v 3.11 0.58 1 +v 4.23 0.12 1 +v 4.3 -0.17 1 +v -4.9 -1.24 1 +v -0.56 -1.87 1 +v -0.29 -1.97 1 +v -0.36 -1.49 1 +v -4.24 -0.28 1 +v -4.74 -0.32 1 +v -4.26 -0.88 1 +v -0.52 0.07 1 +v -0.91 -0.22 1 +v -0.78 -0.38 1 +v -6.39 -0.14 1 +v 0.95 -1.75 1 +v 0.61 -1.47 1 +v 0.72 -1.89 1 +v -5.69 0.98 1 +v -6 0.47 1 +v -5.68 0.58 1 +v 1.13 -1.56 1 +v 0.73 -1.32 1 +v 1.23 -1.33 1 +v 0.77 -1.15 1 +v 0.5 0.46 1 +v 0.62 0.88 1 +v 0.31 0.55 1 +v -0.34 -0.07 1 +v -0.53 -0.53 1 +v -4.45 0.38 1 +v -4.33 0.13 1 +v -6.71 -1.4 1 +v -6.55 -1.62 1 +v -5.58 -2 1 +v -5.75 -1.59 1 +v -4.68 -1.69 1 +v -5.16 -1.49 1 +v -5.22 -1.96 1 +v -5.47 -1.6 1 +v -6.83 -1.15 1 +v -6.89 -0.14 1 +v -6.81 0.18 1 +v -6.25 0.22 1 +v -6.67 0.44 1 +v -6.48 0.66 1 +v -6.16 0.87 1 +v -5.4 0.56 1 +v -5.13 0.92 1 +v -5.19 0.48 1 +v -4.81 0.76 1 +v -4.89 -1.83 1 +v 0.21 -1.6 1 +v 0.12 -2 1 +v 0.43 -1.98 1 +v 1.16 0.18 1 +v 0.69 0.11 1 +v -0.99 -0.04 1 +v -1.02 0.15 1 +v -0.55 0.21 1 +v -0.97 0.44 1 +v -1.52 -1.33 1 +v -2.02 -1.32 1 +v -1.63 -1.56 1 +v -1.51 -0.87 1 +v -2.02 -1 1 +v -1.98 -1.15 1 +v -0.48 0.89 1 +v -0.76 0.73 1 +v -0.39 0.49 1 +v -0.18 0.56 1 +v -0.05 0.98 1 +v 0.06 0.58 1 +v 0.34 0.96 1 +v -2.94 0.56 1 +v -2.82 0.98 1 +v -3.24 0.89 1 +v -2.69 0.58 1 +v -3.52 0.73 1 +v -3.28 0.35 1 +v -3.15 0.49 1 +v -3.31 0.21 1 +v -3.78 0.15 1 +v -3.28 0.07 1 +v -0.51 0.35 1 +v -3.29 -0.53 1 +v -2.37 -0.79 1 +v -3.1 -0.07 1 +v -1.8 -1.75 1 +v -2.14 -1.47 1 +v -2.03 -1.89 1 +v -0.54 -1.26 1 +v -0.81 -1.71 1 +v -1.02 -1.39 1 +v 0.48 -1.55 1 +v 1.24 -0.87 1 +v 1.27 -1.1 1 +v 0.73 -1 1 +v 1.02 -0.54 1 +v 1.15 -0.68 1 +v -3.12 -1.49 1 +v -3.33 -1.87 1 +v -3.05 -1.97 1 +v -0.62 -1.01 1 +v -2.32 -1.98 1 +v -2.27 -1.55 1 +v -1.1 -1.08 1 +v -1.99 -0.39 1 +v -2.14 -0.88 1 +v -0.1 -1.59 1 +v -1.74 -0.54 1 +v -2.13 0.31 1 +v -2.06 0.11 1 +v -1.65 0.43 1 +v -3.54 -0.38 1 +v -3.38 -1.01 1 +v -3.78 -1.39 1 +v -3.3 -1.26 1 +v -3.67 -0.22 1 +v -3.75 -0.04 1 +v -3.73 0.44 1 +v -2.44 0.55 1 +v -2.41 0.96 1 +v -2.13 0.88 1 +v -2.25 0.46 1 +v -1.91 0.77 1 +v -1.76 0.62 1 +v -1.59 0.18 1 +v -1.48 -1.1 1 +v -1.6 -0.68 1 +v -3.57 -1.71 1 +v -3.86 -1.08 1 +v 13.81 -1.94 1 +f 1 2 3 +f 4 5 6 +f 7 2 1 +f 8 3 9 +f 10 7 11 +f 10 2 7 +f 12 7 1 +f 13 14 15 +f 16 12 17 +f 17 12 1 +f 2 9 3 +f 9 18 8 +f 19 20 21 +f 22 19 23 +f 24 25 26 +f 27 19 28 +f 29 30 31 +f 4 32 5 +f 33 34 35 +f 36 37 38 +f 39 40 41 +f 42 37 43 +f 44 45 46 +f 47 48 49 +f 50 51 52 +f 53 52 54 +f 55 56 54 +f 57 58 59 +f 55 60 56 +f 58 61 59 +f 62 21 20 +f 54 56 53 +f 53 50 52 +f 52 51 43 +f 63 43 51 +f 42 43 63 +f 37 42 38 +f 36 38 64 +f 36 64 65 +f 66 65 67 +f 36 65 66 +f 66 67 6 +f 4 6 67 +f 49 5 47 +f 5 32 47 +f 49 48 68 +f 31 68 48 +f 31 69 68 +f 31 70 69 +f 71 72 73 +f 22 74 28 +f 19 22 28 +f 21 23 19 +f 75 21 62 +f 76 75 62 +f 60 55 75 +f 60 75 76 +f 77 78 79 +f 80 81 82 +f 83 34 84 +f 85 86 87 +f 88 89 90 +f 33 91 34 +f 92 93 94 +f 24 95 96 +f 97 98 99 +f 100 101 102 +f 102 101 103 +f 94 93 97 +f 104 105 44 +f 92 106 93 +f 107 108 109 +f 110 111 112 +f 25 24 113 +f 114 115 87 +f 116 117 118 +f 119 120 121 +f 122 121 123 +f 124 115 114 +f 87 115 85 +f 125 124 114 +f 78 90 126 +f 120 87 86 +f 121 120 86 +f 122 119 121 +f 127 15 128 +f 24 96 113 +f 24 129 95 +f 130 129 99 +f 95 129 130 +f 98 130 99 +f 93 98 97 +f 92 131 106 +f 106 131 132 +f 88 106 132 +f 89 88 132 +f 133 90 89 +f 126 90 133 +f 134 78 126 +f 79 78 134 +f 135 77 79 +f 135 125 77 +f 135 124 125 +f 71 136 72 +f 137 138 139 +f 140 141 142 +f 71 73 143 +f 144 145 146 +f 147 148 149 +f 113 150 122 +f 151 152 153 +f 152 154 155 +f 153 152 156 +f 156 152 155 +f 152 151 157 +f 150 119 122 +f 156 144 148 +f 153 156 148 +f 153 148 147 +f 156 145 144 +f 25 113 122 +f 158 146 145 +f 143 158 145 +f 159 158 143 +f 143 73 159 +f 160 161 162 +f 163 164 165 +f 165 139 163 +f 166 167 168 +f 139 138 163 +f 166 169 142 +f 169 140 142 +f 170 169 168 +f 162 171 160 +f 172 170 168 +f 170 173 174 +f 172 175 170 +f 169 170 174 +f 176 167 166 +f 177 178 179 +f 178 177 180 +f 169 166 168 +f 140 181 141 +f 182 183 184 +f 140 138 181 +f 185 182 184 +f 138 137 181 +f 186 177 179 +f 187 188 189 +f 190 178 180 +f 191 160 186 +f 192 193 194 +f 191 186 179 +f 195 196 197 +f 171 186 160 +f 198 194 193 +f 199 200 193 +f 201 202 200 +f 203 197 202 +f 204 182 205 +f 206 117 116 +f 207 208 209 +f 207 195 208 +f 197 208 195 +f 197 196 202 +f 203 202 201 +f 199 201 200 +f 192 199 193 +f 194 198 161 +f 162 161 198 +f 210 196 195 +f 209 211 207 +f 212 211 213 +f 207 211 212 +f 214 213 215 +f 212 213 214 +f 216 214 217 +f 214 215 217 +f 216 217 218 +f 219 216 220 +f 216 218 220 +f 221 220 222 +f 219 220 221 +f 222 223 221 +f 224 223 225 +f 221 223 224 +f 225 226 224 +f 224 226 227 +f 227 226 228 +f 210 227 228 +f 229 210 228 +f 230 117 231 +f 232 231 233 +f 234 232 233 +f 111 110 235 +f 127 236 237 +f 238 239 240 +f 241 242 243 +f 244 14 13 +f 239 245 240 +f 196 210 229 +f 246 245 239 +f 247 248 249 +f 236 238 240 +f 127 238 236 +f 14 128 15 +f 244 250 251 +f 14 244 251 +f 242 251 243 +f 252 247 249 +f 247 252 253 +f 248 254 249 +f 206 116 255 +f 248 241 254 +f 242 241 248 +f 250 243 251 +f 256 237 235 +f 237 236 235 +f 235 110 256 +f 128 238 127 +f 232 112 111 +f 232 234 112 +f 233 231 257 +f 258 117 206 +f 231 117 257 +f 230 118 117 +f 102 259 260 +f 261 255 116 +f 57 262 58 +f 61 263 59 +f 264 262 265 +f 262 57 265 +f 264 266 262 +f 266 264 267 +f 100 91 268 +f 103 269 270 +f 103 101 269 +f 107 109 271 +f 271 109 272 +f 272 81 80 +f 273 82 274 +f 275 44 105 +f 276 274 277 +f 278 277 279 +f 280 270 281 +f 282 283 284 +f 281 270 269 +f 285 286 287 +f 288 289 290 +f 291 101 100 +f 292 288 290 +f 293 294 41 +f 291 100 268 +f 268 91 33 +f 294 39 41 +f 83 35 34 +f 295 296 297 +f 298 83 84 +f 267 298 84 +f 264 298 267 +f 299 300 187 +f 280 279 270 +f 102 103 259 +f 280 278 279 +f 278 301 277 +f 276 277 301 +f 274 276 273 +f 274 82 302 +f 81 302 82 +f 109 81 272 +f 107 303 108 +f 108 303 259 +f 259 303 260 +f 299 187 185 +f 304 305 306 +f 307 46 45 +f 308 309 310 +f 311 312 313 +f 314 315 316 +f 317 308 318 +f 282 284 319 +f 320 314 321 +f 322 323 324 +f 321 325 326 +f 327 328 329 +f 318 296 317 +f 308 317 309 +f 330 308 331 +f 332 333 334 +f 333 307 335 +f 336 40 337 +f 293 338 339 +f 293 41 338 +f 340 341 275 +f 342 343 341 +f 39 337 40 +f 344 40 345 +f 40 336 345 +f 346 344 345 +f 347 344 346 +f 346 348 347 +f 324 348 349 +f 347 348 324 +f 324 349 322 +f 322 350 323 +f 319 350 351 +f 323 350 319 +f 282 319 351 +f 283 282 313 +f 312 283 313 +f 312 311 352 +f 334 352 353 +f 312 352 334 +f 353 332 334 +f 334 333 335 +f 335 307 45 +f 46 104 44 +f 105 340 275 +f 341 340 354 +f 342 341 354 +f 339 343 342 +f 339 338 343 +f 355 356 292 +f 331 308 310 +f 289 327 329 +f 330 331 357 +f 358 359 360 +f 361 362 363 +f 364 365 366 +f 365 364 367 +f 367 364 368 +f 328 368 369 +f 288 292 356 +f 327 289 288 +f 328 367 368 +f 329 328 369 +f 370 371 372 +f 370 372 373 +f 374 375 376 +f 365 377 366 +f 378 379 380 +f 377 357 366 +f 357 377 330 +f 381 382 383 +f 305 384 385 +f 384 386 385 +f 387 388 389 +f 297 296 318 +f 390 391 325 +f 295 392 393 +f 297 392 295 +f 392 394 393 +f 325 393 390 +f 393 394 390 +f 325 391 326 +f 320 321 326 +f 314 316 321 +f 315 388 316 +f 389 388 315 +f 395 396 397 +f 398 385 386 +f 286 399 287 +f 386 400 398 +f 401 402 380 +f 384 305 304 +f 306 305 403 +f 389 306 403 +f 387 389 403 +f 363 402 404 +f 360 362 358 +f 405 406 407 +f 379 378 408 +f 408 378 409 +f 410 411 412 +f 413 408 409 +f 408 413 414 +f 415 376 416 +f 371 375 374 +f 371 370 375 +f 373 417 418 +f 373 372 417 +f 419 418 420 +f 420 421 405 +f 407 406 422 +f 421 406 405 +f 420 405 419 +f 373 418 419 +f 376 415 374 +f 414 415 416 +f 416 408 414 +f 401 380 379 +f 361 423 362 +f 402 401 404 +f 383 382 399 +f 363 404 424 +f 361 363 424 +f 362 423 358 +f 360 359 381 +f 381 383 360 +f 287 399 382 +f 395 397 425 +f 412 411 425 +f 412 426 410 +f 425 411 395 +f 395 285 396 +f 396 285 287 +f 182 185 189 +f 205 182 189 +f 189 188 427 +f 187 189 185 +f 28 74 70 +f 28 70 30 +f 70 31 30 +f 428 429 430 +f 431 432 433 +f 434 428 430 +f 435 436 429 +f 437 438 434 +f 437 434 430 +f 439 428 434 +f 440 441 442 +f 443 444 439 +f 444 428 439 +f 430 429 436 +f 436 435 445 +f 446 447 448 +f 449 450 451 +f 452 453 446 +f 454 455 456 +f 431 433 457 +f 458 459 460 +f 461 462 463 +f 464 465 466 +f 466 467 468 +f 469 470 471 +f 472 473 468 +f 474 475 476 +f 477 473 478 +f 479 480 481 +f 482 480 483 +f 484 485 486 +f 482 483 487 +f 486 485 488 +f 489 448 447 +f 480 479 483 +f 479 481 477 +f 481 473 477 +f 472 478 473 +f 467 472 468 +f 466 490 467 +f 466 465 490 +f 464 491 465 +f 464 492 491 +f 464 432 492 +f 431 492 432 +f 475 474 433 +f 433 474 457 +f 475 493 476 +f 455 476 493 +f 455 493 494 +f 455 494 495 +f 496 497 498 +f 499 453 500 +f 446 453 499 +f 446 499 501 +f 447 446 501 +f 502 489 447 +f 503 489 502 +f 487 502 482 +f 487 503 502 +f 504 505 506 +f 507 508 509 +f 510 511 460 +f 512 513 514 +f 458 460 515 +f 516 517 518 +f 449 519 520 +f 521 522 523 +f 524 525 526 +f 525 527 528 +f 517 521 518 +f 529 530 531 +f 516 518 532 +f 533 534 535 +f 536 537 538 +f 451 539 449 +f 540 541 542 +f 449 539 543 +f 544 545 546 +f 547 548 549 +f 550 540 542 +f 541 512 542 +f 541 513 512 +f 551 540 552 +f 463 509 553 +f 549 514 513 +f 549 513 554 +f 547 549 554 +f 547 554 555 +f 556 557 441 +f 449 543 519 +f 449 520 558 +f 559 522 558 +f 520 559 558 +f 523 522 559 +f 518 521 523 +f 516 532 560 +f 462 561 560 +f 532 462 560 +f 461 561 462 +f 553 461 463 +f 508 553 509 +f 562 508 507 +f 563 562 507 +f 563 507 551 +f 563 551 552 +f 552 540 550 +f 496 498 564 +f 565 566 567 +f 568 569 570 +f 496 571 497 +f 572 573 574 +f 575 576 577 +f 578 579 580 +f 580 581 582 +f 579 583 580 +f 583 581 580 +f 580 584 578 +f 539 547 555 +f 583 577 572 +f 579 577 583 +f 579 575 577 +f 583 572 574 +f 451 547 539 +f 585 574 573 +f 571 574 585 +f 586 571 585 +f 571 586 497 +f 587 588 589 +f 590 591 592 +f 591 590 566 +f 593 594 595 +f 566 590 567 +f 593 569 596 +f 596 569 568 +f 597 594 596 +f 588 587 598 +f 599 594 597 +f 597 600 601 +f 599 597 602 +f 596 600 597 +f 603 593 595 +f 604 605 606 +f 606 607 604 +f 596 594 593 +f 568 570 608 +f 609 610 611 +f 568 608 567 +f 612 610 609 +f 567 608 565 +f 613 605 604 +f 614 615 616 +f 617 607 606 +f 618 613 587 +f 619 620 621 +f 618 605 613 +f 622 623 624 +f 598 587 613 +f 625 621 620 +f 626 621 627 +f 628 627 629 +f 630 629 631 +f 623 631 624 +f 632 633 609 +f 634 544 546 +f 635 636 623 +f 635 623 622 +f 631 629 624 +f 630 628 629 +f 626 627 628 +f 619 621 626 +f 620 589 625 +f 588 625 589 +f 637 622 624 +f 636 635 638 +f 639 640 638 +f 635 639 638 +f 641 642 640 +f 639 641 640 +f 643 644 641 +f 641 644 642 +f 643 645 644 +f 646 647 643 +f 643 647 645 +f 648 649 647 +f 646 648 647 +f 649 648 650 +f 651 652 650 +f 648 651 650 +f 652 651 653 +f 651 654 653 +f 654 655 653 +f 654 656 655 +f 637 656 654 +f 657 656 637 +f 658 659 546 +f 660 661 659 +f 662 661 660 +f 538 663 536 +f 556 664 665 +f 666 667 668 +f 669 670 671 +f 672 440 442 +f 668 667 673 +f 624 657 637 +f 674 668 673 +f 675 676 677 +f 665 667 666 +f 556 665 666 +f 442 441 557 +f 672 678 679 +f 442 678 672 +f 671 670 678 +f 680 676 675 +f 675 681 680 +f 677 676 682 +f 634 683 544 +f 677 682 669 +f 671 677 669 +f 679 678 670 +f 684 663 664 +f 664 663 665 +f 663 684 536 +f 557 556 666 +f 660 538 537 +f 660 537 662 +f 661 685 659 +f 686 634 546 +f 659 685 546 +f 658 546 545 +f 525 687 688 +f 689 544 683 +f 484 486 690 +f 488 485 691 +f 692 693 690 +f 690 693 484 +f 692 690 694 +f 694 695 692 +f 524 696 515 +f 527 697 528 +f 533 698 534 +f 698 699 534 +f 699 504 506 +f 700 701 505 +f 702 703 701 +f 704 705 703 +f 706 707 708 +f 709 710 697 +f 711 712 713 +f 710 528 697 +f 714 715 716 +f 526 525 528 +f 717 718 719 +f 720 524 526 +f 721 718 717 +f 720 696 524 +f 696 458 515 +f 722 470 469 +f 510 460 459 +f 723 724 725 +f 726 511 510 +f 695 511 726 +f 692 695 726 +f 727 614 728 +f 709 697 705 +f 525 688 527 +f 709 705 704 +f 704 703 729 +f 702 729 703 +f 701 700 702 +f 701 730 505 +f 506 505 730 +f 534 699 506 +f 533 535 731 +f 731 535 732 +f 535 688 732 +f 688 687 732 +f 727 612 614 +f 531 530 733 +f 734 735 736 +f 737 738 739 +f 740 741 742 +f 713 743 711 +f 744 745 746 +f 747 748 749 +f 750 751 744 +f 751 752 753 +f 754 755 756 +f 757 758 725 +f 757 742 758 +f 759 708 760 +f 760 708 737 +f 761 762 712 +f 722 763 764 +f 722 764 470 +f 765 733 766 +f 767 766 768 +f 469 471 762 +f 712 762 471 +f 712 769 761 +f 711 769 712 +f 711 743 770 +f 743 771 770 +f 772 773 771 +f 743 772 771 +f 773 772 774 +f 748 775 774 +f 772 748 774 +f 747 775 748 +f 776 777 747 +f 749 776 747 +f 778 777 776 +f 778 779 777 +f 707 706 779 +f 778 707 779 +f 706 708 759 +f 708 738 737 +f 738 530 739 +f 739 530 529 +f 531 733 765 +f 766 780 765 +f 767 780 766 +f 763 767 768 +f 763 768 764 +f 781 782 783 +f 784 721 785 +f 786 741 740 +f 787 786 740 +f 719 755 754 +f 788 789 787 +f 790 791 792 +f 793 794 795 +f 796 797 798 +f 798 799 796 +f 799 800 796 +f 801 802 800 +f 756 802 801 +f 717 785 721 +f 754 717 719 +f 801 800 799 +f 755 802 756 +f 803 804 805 +f 803 806 804 +f 807 808 809 +f 810 811 812 +f 798 797 813 +f 814 815 816 +f 813 797 789 +f 789 788 813 +f 740 788 787 +f 817 818 819 +f 757 740 742 +f 736 820 821 +f 821 820 822 +f 781 783 823 +f 724 757 725 +f 824 753 825 +f 723 826 827 +f 724 723 827 +f 827 826 828 +f 753 824 826 +f 826 824 828 +f 753 752 825 +f 750 752 751 +f 744 751 745 +f 746 745 823 +f 783 746 823 +f 829 830 831 +f 832 822 820 +f 716 833 834 +f 822 832 835 +f 836 815 837 +f 821 734 736 +f 735 838 736 +f 782 838 735 +f 781 838 782 +f 794 839 837 +f 791 790 795 +f 840 841 842 +f 816 843 814 +f 844 845 846 +f 847 843 812 +f 812 848 847 +f 849 810 808 +f 805 807 809 +f 805 809 803 +f 806 850 851 +f 850 852 851 +f 806 851 804 +f 853 854 852 +f 854 840 855 +f 841 856 842 +f 855 840 842 +f 854 853 840 +f 850 853 852 +f 808 807 849 +f 811 810 849 +f 848 812 811 +f 843 816 812 +f 836 816 815 +f 793 795 857 +f 837 839 836 +f 818 834 819 +f 794 858 839 +f 793 858 794 +f 795 790 857 +f 791 817 792 +f 817 791 818 +f 833 819 834 +f 829 859 830 +f 845 859 846 +f 845 844 860 +f 859 829 846 +f 829 831 714 +f 831 715 714 +f 715 833 716 +f 609 615 612 +f 633 615 609 +f 615 861 616 +f 614 612 615 +f 453 495 500 +f 453 456 495 +f 495 456 455 +f 18 445 8 +f 435 8 445 +f 9 436 18 +f 445 18 436 +f 2 430 9 +f 436 9 430 +f 10 437 2 +f 430 2 437 +f 11 438 10 +f 437 10 438 +f 7 434 11 +f 438 11 434 +f 12 439 7 +f 434 7 439 +f 16 443 12 +f 439 12 443 +f 17 444 16 +f 443 16 444 +f 1 428 17 +f 444 17 428 +f 3 429 1 +f 428 1 429 +f 8 435 3 +f 429 3 435 +f 76 503 60 +f 487 60 503 +f 62 489 76 +f 503 76 489 +f 20 448 62 +f 489 62 448 +f 19 446 20 +f 448 20 446 +f 27 452 19 +f 446 19 452 +f 28 453 27 +f 452 27 453 +f 30 456 28 +f 453 28 456 +f 29 454 30 +f 456 30 454 +f 31 455 29 +f 454 29 455 +f 48 476 31 +f 455 31 476 +f 47 474 48 +f 476 48 474 +f 32 457 47 +f 474 47 457 +f 4 431 32 +f 457 32 431 +f 67 492 4 +f 431 4 492 +f 65 491 67 +f 492 67 491 +f 64 465 65 +f 491 65 465 +f 38 490 64 +f 465 64 490 +f 42 467 38 +f 490 38 467 +f 63 472 42 +f 467 42 472 +f 51 478 63 +f 472 63 478 +f 50 477 51 +f 478 51 477 +f 53 479 50 +f 477 50 479 +f 56 483 53 +f 479 53 483 +f 60 487 56 +f 483 56 487 +f 55 482 75 +f 502 75 482 +f 54 480 55 +f 482 55 480 +f 52 481 54 +f 480 54 481 +f 481 52 473 +f 43 473 52 +f 473 43 468 +f 37 468 43 +f 468 37 466 +f 36 466 37 +f 466 36 464 +f 66 464 36 +f 6 432 66 +f 464 66 432 +f 5 433 6 +f 432 6 433 +f 49 475 5 +f 433 5 475 +f 68 493 49 +f 475 49 493 +f 69 494 68 +f 493 68 494 +f 70 495 69 +f 494 69 495 +f 74 500 70 +f 495 70 500 +f 22 499 74 +f 500 74 499 +f 499 22 501 +f 23 501 22 +f 21 447 23 +f 501 23 447 +f 75 502 21 +f 447 21 502 +f 550 124 552 +f 135 563 124 +f 552 124 563 +f 79 562 135 +f 563 135 562 +f 134 508 79 +f 562 79 508 +f 126 553 134 +f 508 134 553 +f 133 553 126 +f 89 461 133 +f 553 133 461 +f 132 561 89 +f 461 89 561 +f 131 560 132 +f 561 132 560 +f 92 516 131 +f 560 131 516 +f 94 517 92 +f 516 92 517 +f 97 521 94 +f 517 94 521 +f 99 522 97 +f 521 97 522 +f 129 558 99 +f 522 99 558 +f 24 449 129 +f 558 129 449 +f 26 450 24 +f 449 24 450 +f 25 451 26 +f 450 26 451 +f 122 547 25 +f 451 25 547 +f 123 548 122 +f 547 122 548 +f 121 549 123 +f 548 123 549 +f 86 514 121 +f 549 121 514 +f 85 512 86 +f 514 86 512 +f 115 542 85 +f 512 85 542 +f 124 550 115 +f 542 115 550 +f 87 541 114 +f 540 114 541 +f 541 87 513 +f 120 513 87 +f 513 120 554 +f 119 554 120 +f 554 119 555 +f 150 555 119 +f 555 150 539 +f 113 539 150 +f 539 113 543 +f 96 519 113 +f 543 113 519 +f 95 520 96 +f 519 96 520 +f 130 559 95 +f 520 95 559 +f 98 523 130 +f 559 130 523 +f 93 518 98 +f 523 98 518 +f 106 532 93 +f 518 93 532 +f 532 106 462 +f 88 462 106 +f 462 88 463 +f 90 463 88 +f 463 90 509 +f 78 509 90 +f 509 78 507 +f 77 507 78 +f 125 551 77 +f 507 77 551 +f 114 540 125 +f 551 125 540 +f 72 498 73 +f 497 73 498 +f 136 564 72 +f 498 72 564 +f 71 496 136 +f 564 136 496 +f 143 571 71 +f 496 71 571 +f 145 574 143 +f 571 143 574 +f 156 583 145 +f 574 145 583 +f 155 581 156 +f 583 156 581 +f 154 582 155 +f 581 155 582 +f 152 580 154 +f 582 154 580 +f 157 584 152 +f 580 152 584 +f 151 578 157 +f 584 157 578 +f 153 579 151 +f 578 151 579 +f 147 575 153 +f 579 153 575 +f 149 576 147 +f 575 147 576 +f 148 577 149 +f 576 149 577 +f 144 572 148 +f 577 148 572 +f 146 573 144 +f 572 144 573 +f 158 585 146 +f 573 146 585 +f 159 586 158 +f 585 158 586 +f 73 497 159 +f 586 159 497 +f 165 591 139 +f 566 139 591 +f 164 592 165 +f 591 165 592 +f 163 590 164 +f 592 164 590 +f 138 567 163 +f 590 163 567 +f 140 568 138 +f 567 138 568 +f 169 596 140 +f 568 140 596 +f 174 600 169 +f 596 169 600 +f 173 601 174 +f 600 174 601 +f 170 597 173 +f 601 173 597 +f 175 602 170 +f 597 170 602 +f 172 599 175 +f 602 175 599 +f 168 594 172 +f 599 172 594 +f 167 595 168 +f 594 168 595 +f 176 603 167 +f 595 167 603 +f 166 593 176 +f 603 176 593 +f 142 569 166 +f 593 166 569 +f 141 570 142 +f 569 142 570 +f 181 608 141 +f 570 141 608 +f 137 565 181 +f 608 181 565 +f 139 566 137 +f 565 137 566 +f 160 587 161 +f 589 161 587 +f 191 618 160 +f 587 160 618 +f 179 605 191 +f 618 191 605 +f 178 606 179 +f 605 179 606 +f 190 617 178 +f 606 178 617 +f 180 607 190 +f 617 190 607 +f 177 604 180 +f 607 180 604 +f 186 613 177 +f 604 177 613 +f 171 598 186 +f 613 186 598 +f 162 588 171 +f 598 171 588 +f 198 625 162 +f 588 162 625 +f 193 621 198 +f 625 198 621 +f 200 627 193 +f 621 193 627 +f 202 629 200 +f 627 200 629 +f 196 624 202 +f 629 202 624 +f 229 657 196 +f 624 196 657 +f 228 656 229 +f 657 229 656 +f 656 228 655 +f 226 653 228 +f 655 228 653 +f 225 652 226 +f 653 226 652 +f 223 650 225 +f 652 225 650 +f 222 649 223 +f 650 223 649 +f 220 647 222 +f 649 222 647 +f 218 645 220 +f 647 220 645 +f 217 644 218 +f 645 218 644 +f 215 642 217 +f 644 217 642 +f 213 640 215 +f 642 215 640 +f 211 638 213 +f 640 213 638 +f 209 636 211 +f 638 211 636 +f 208 623 209 +f 636 209 623 +f 197 623 208 +f 623 197 631 +f 203 630 197 +f 631 197 630 +f 201 628 203 +f 630 203 628 +f 199 626 201 +f 628 201 626 +f 192 619 199 +f 626 199 619 +f 194 620 192 +f 619 192 620 +f 161 589 194 +f 620 194 589 +f 195 622 210 +f 637 210 622 +f 207 635 195 +f 622 195 635 +f 212 639 207 +f 635 207 639 +f 214 641 212 +f 639 212 641 +f 216 643 214 +f 641 214 643 +f 219 646 216 +f 643 216 646 +f 221 648 219 +f 646 219 648 +f 224 651 221 +f 648 221 651 +f 227 654 224 +f 651 224 654 +f 210 637 227 +f 654 227 637 +f 116 544 261 +f 689 261 544 +f 118 545 116 +f 544 116 545 +f 230 658 118 +f 545 118 658 +f 231 659 230 +f 658 230 659 +f 232 660 231 +f 659 231 660 +f 111 538 232 +f 660 232 538 +f 235 663 111 +f 538 111 663 +f 236 665 235 +f 663 235 665 +f 240 667 236 +f 665 236 667 +f 245 673 240 +f 667 240 673 +f 246 674 245 +f 673 245 674 +f 239 668 246 +f 674 246 668 +f 238 666 239 +f 668 239 666 +f 128 557 238 +f 666 238 557 +f 14 442 128 +f 557 128 442 +f 251 678 14 +f 442 14 678 +f 242 671 251 +f 678 251 671 +f 248 677 242 +f 671 242 677 +f 247 675 248 +f 677 248 675 +f 253 681 247 +f 675 247 681 +f 252 680 253 +f 681 253 680 +f 249 676 252 +f 680 252 676 +f 254 682 249 +f 676 249 682 +f 241 669 254 +f 682 254 669 +f 243 670 241 +f 669 241 670 +f 250 679 243 +f 670 243 679 +f 244 672 250 +f 679 250 672 +f 13 440 244 +f 672 244 440 +f 15 441 13 +f 440 13 441 +f 127 556 15 +f 441 15 556 +f 237 664 127 +f 556 127 664 +f 256 684 237 +f 664 237 684 +f 110 536 256 +f 684 256 536 +f 112 537 110 +f 536 110 537 +f 234 662 112 +f 537 112 662 +f 233 661 234 +f 662 234 661 +f 257 685 233 +f 661 233 685 +f 117 546 257 +f 685 257 546 +f 258 686 117 +f 546 117 686 +f 206 634 258 +f 686 258 634 +f 255 683 206 +f 634 206 683 +f 261 689 255 +f 683 255 689 +f 264 692 298 +f 726 298 692 +f 265 693 264 +f 692 264 693 +f 57 484 265 +f 693 265 484 +f 59 485 57 +f 484 57 485 +f 263 691 59 +f 485 59 691 +f 61 488 263 +f 691 263 488 +f 58 486 61 +f 488 61 486 +f 262 690 58 +f 486 58 690 +f 266 694 262 +f 690 262 694 +f 267 695 266 +f 694 266 695 +f 84 511 267 +f 695 267 511 +f 34 460 84 +f 511 84 460 +f 91 515 34 +f 460 34 515 +f 100 524 91 +f 515 91 524 +f 102 525 100 +f 524 100 525 +f 260 687 102 +f 525 102 687 +f 303 732 260 +f 687 260 732 +f 732 303 731 +f 107 533 303 +f 731 303 533 +f 271 698 107 +f 533 107 698 +f 272 699 271 +f 698 271 699 +f 80 504 272 +f 699 272 504 +f 82 505 80 +f 504 80 505 +f 273 700 82 +f 505 82 700 +f 276 702 273 +f 700 273 702 +f 301 729 276 +f 702 276 729 +f 278 704 301 +f 729 301 704 +f 280 709 278 +f 704 278 709 +f 281 710 280 +f 709 280 710 +f 269 528 281 +f 710 281 528 +f 101 528 269 +f 528 101 526 +f 291 720 101 +f 526 101 720 +f 268 696 291 +f 720 291 696 +f 33 458 268 +f 696 268 458 +f 35 459 33 +f 458 33 459 +f 83 510 35 +f 459 35 510 +f 298 726 83 +f 510 83 726 +f 103 527 259 +f 688 259 527 +f 270 697 103 +f 527 103 697 +f 279 705 270 +f 697 270 705 +f 277 703 279 +f 705 279 703 +f 274 701 277 +f 703 277 701 +f 302 730 274 +f 701 274 730 +f 81 506 302 +f 730 302 506 +f 109 534 81 +f 506 81 534 +f 108 535 109 +f 534 109 535 +f 259 688 108 +f 535 108 688 +f 342 767 339 +f 763 339 767 +f 354 780 342 +f 767 342 780 +f 340 765 354 +f 780 354 765 +f 105 531 340 +f 765 340 531 +f 104 529 105 +f 531 105 529 +f 46 739 104 +f 529 104 739 +f 307 737 46 +f 739 46 737 +f 333 760 307 +f 737 307 760 +f 332 759 333 +f 760 333 759 +f 353 706 332 +f 759 332 706 +f 352 779 353 +f 706 353 779 +f 311 777 352 +f 779 352 777 +f 313 777 311 +f 282 747 313 +f 777 313 747 +f 351 775 282 +f 747 282 775 +f 350 774 351 +f 775 351 774 +f 322 773 350 +f 774 350 773 +f 349 771 322 +f 773 322 771 +f 348 770 349 +f 771 349 770 +f 346 711 348 +f 770 348 711 +f 345 769 346 +f 711 346 769 +f 336 761 345 +f 769 345 761 +f 337 762 336 +f 761 336 762 +f 39 469 337 +f 762 337 469 +f 294 722 39 +f 469 39 722 +f 293 722 294 +f 339 763 293 +f 722 293 763 +f 768 338 764 +f 41 470 338 +f 764 338 470 +f 40 471 41 +f 470 41 471 +f 471 40 712 +f 344 712 40 +f 712 344 713 +f 347 713 344 +f 713 347 743 +f 324 743 347 +f 743 324 772 +f 323 772 324 +f 319 748 323 +f 772 323 748 +f 284 749 319 +f 748 319 749 +f 283 749 284 +f 749 283 776 +f 312 778 283 +f 776 283 778 +f 334 707 312 +f 778 312 707 +f 707 334 708 +f 335 708 334 +f 708 335 738 +f 45 738 335 +f 738 45 530 +f 44 530 45 +f 530 44 733 +f 275 733 44 +f 341 766 275 +f 733 275 766 +f 343 768 341 +f 766 341 768 +f 338 768 343 +f 782 389 783 +f 315 746 389 +f 783 389 746 +f 314 744 315 +f 746 315 744 +f 320 750 314 +f 744 314 750 +f 326 752 320 +f 750 320 752 +f 391 825 326 +f 752 326 825 +f 390 824 391 +f 825 391 824 +f 394 828 390 +f 824 390 828 +f 392 827 394 +f 828 394 827 +f 297 724 392 +f 827 392 724 +f 318 757 297 +f 724 297 757 +f 308 757 318 +f 757 308 740 +f 330 740 308 +f 740 330 788 +f 377 813 330 +f 788 330 813 +f 365 798 377 +f 813 377 798 +f 367 799 365 +f 798 365 799 +f 328 801 367 +f 799 367 801 +f 801 328 756 +f 327 754 328 +f 756 328 754 +f 288 717 327 +f 754 327 717 +f 356 785 288 +f 717 288 785 +f 355 784 356 +f 785 356 784 +f 292 721 355 +f 784 355 721 +f 290 718 292 +f 721 292 718 +f 289 719 290 +f 718 290 719 +f 329 755 289 +f 719 289 755 +f 369 802 329 +f 755 329 802 +f 368 800 369 +f 802 369 800 +f 364 796 368 +f 800 368 796 +f 366 797 364 +f 796 364 797 +f 357 789 366 +f 797 366 789 +f 331 787 357 +f 789 357 787 +f 787 331 786 +f 310 741 331 +f 786 331 741 +f 309 742 310 +f 741 310 742 +f 317 758 309 +f 742 309 758 +f 296 725 317 +f 758 317 725 +f 295 723 296 +f 725 296 723 +f 393 826 295 +f 723 295 826 +f 325 753 393 +f 826 393 753 +f 321 751 325 +f 753 325 751 +f 316 745 321 +f 751 321 745 +f 388 823 316 +f 745 316 823 +f 387 781 388 +f 823 388 781 +f 403 838 387 +f 781 387 838 +f 305 736 403 +f 838 403 736 +f 385 820 305 +f 736 305 820 +f 398 832 385 +f 820 385 832 +f 400 835 398 +f 832 398 835 +f 386 822 400 +f 835 400 822 +f 384 821 386 +f 822 386 821 +f 304 734 384 +f 821 384 734 +f 306 735 304 +f 734 304 735 +f 389 782 306 +f 735 306 782 +f 715 287 833 +f 382 819 287 +f 833 287 819 +f 381 817 382 +f 819 382 817 +f 359 792 381 +f 817 381 792 +f 358 790 359 +f 792 359 790 +f 423 857 358 +f 790 358 857 +f 361 793 423 +f 857 423 793 +f 424 858 361 +f 793 361 858 +f 404 839 424 +f 858 424 839 +f 401 836 404 +f 839 404 836 +f 379 816 401 +f 836 401 816 +f 408 816 379 +f 816 408 812 +f 416 812 408 +f 812 416 810 +f 376 808 416 +f 810 416 808 +f 375 809 376 +f 808 376 809 +f 370 803 375 +f 809 375 803 +f 373 806 370 +f 803 370 806 +f 806 373 850 +f 419 853 373 +f 850 373 853 +f 405 840 419 +f 853 419 840 +f 407 841 405 +f 840 405 841 +f 422 856 407 +f 841 407 856 +f 406 842 422 +f 856 422 842 +f 421 855 406 +f 842 406 855 +f 420 854 421 +f 855 421 854 +f 418 852 420 +f 854 420 852 +f 417 851 418 +f 852 418 851 +f 372 804 417 +f 851 417 804 +f 371 805 372 +f 804 372 805 +f 374 807 371 +f 805 371 807 +f 415 849 374 +f 807 374 849 +f 414 811 415 +f 849 415 811 +f 811 414 848 +f 413 847 414 +f 848 414 847 +f 409 843 413 +f 847 413 843 +f 378 814 409 +f 843 409 814 +f 380 815 378 +f 814 378 815 +f 402 837 380 +f 815 380 837 +f 363 794 402 +f 837 402 794 +f 362 795 363 +f 794 363 795 +f 360 791 362 +f 795 362 791 +f 383 818 360 +f 791 360 818 +f 399 834 383 +f 818 383 834 +f 286 716 399 +f 834 399 716 +f 285 714 286 +f 716 286 714 +f 395 829 285 +f 714 285 829 +f 411 846 395 +f 829 395 846 +f 410 844 411 +f 846 411 844 +f 426 860 410 +f 844 410 860 +f 412 845 426 +f 860 426 845 +f 425 859 412 +f 845 412 859 +f 397 830 425 +f 859 425 830 +f 396 831 397 +f 830 397 831 +f 287 715 396 +f 831 396 715 +f 187 614 188 +f 616 188 614 +f 300 728 187 +f 614 187 728 +f 299 727 300 +f 728 300 727 +f 185 612 299 +f 727 299 612 +f 184 610 185 +f 612 185 610 +f 183 611 184 +f 610 184 611 +f 182 609 183 +f 611 183 609 +f 204 632 182 +f 609 182 632 +f 205 633 204 +f 632 204 633 +f 189 615 205 +f 633 205 615 +f 427 861 189 +f 615 189 861 +f 188 616 427 +f 861 427 616 diff --git a/resources/data/hints.ini b/resources/data/hints.ini index b0bced57b98..af0e476e193 100644 --- a/resources/data/hints.ini +++ b/resources/data/hints.ini @@ -34,7 +34,7 @@ # # Open preferences (might add item to highlight) # hypertext_type = preferences -# hypertext_preferences_page = 2 (values 0-2 according to prefernces tab to be opened) +# hypertext_preferences_page = name of the prefernces tab # hypertext_preferences_item = show_collapse_button (name of variable saved in prusaslicer.ini connected to the setting in preferences) # # Open gallery (no aditional var) @@ -97,7 +97,7 @@ documentation_link = https://help.prusa3d.com/en/article/reload-from-disk_120427 [hint:Hiding sidebar] text = Hiding sidebar\nDid you know that you can hide the right sidebar using the shortcut Shift+Tab? You can also enable the icon for this from thePreferences. hypertext_type = preferences -hypertext_preferences_page = 2 +hypertext_preferences_page = GUI hypertext_preferences_item = show_collapse_button [hint:Perspective camera] @@ -214,7 +214,7 @@ disabled_tags = SLA [hint:Settings in non-modal window] text = Settings in non-modal window\nDid you know that you can open the Settings in a new non-modal window? This means you can have settings open on one screen and the G-code Preview on the other. Go to thePreferencesand select Settings in non-modal window. hypertext_type = preferences -hypertext_preferences_page = 2 +hypertext_preferences_page = GUI hypertext_preferences_item = dlg_settings_layout_mode [hint:Adaptive infills] @@ -231,6 +231,30 @@ disabled_tags = SLA text = Fullscreen mode\nDid you know that you can switch PrusaSlicer to fullscreen mode? Use the F11 hotkey. enabled_tags = Windows +[hint:Printables integration] +text = Printables.com integration\nDid you know that when you are browsing Printables.com, you can send 3D model files to PrusaSlicer with a single click? Learn more in the documentation. +documentation_link = https://help.prusa3d.com/article/prusaslicer-printables-com-integration_399198 +weight = 3 + +[hint:Cut tool] +text = Cut tool\nDid you know that you can cut a model at any angle and even create aligning pins with the updated Cut tool? Learn more in the documentation. +documentation_link = https://help.prusa3d.com/article/cut-tool_1779 +hypertext_type = gizmo +hypertext_gizmo_item = cut +weight = 3 + +[hint:Measurement tool] +text = Measurement tool\nDid you know that you can measure the distances between points, edges and planes, the radius of a hole or the angle between edges or planes? Learn more in the documentation. +documentation_link = https://help.prusa3d.com/article/measurement-tool_399451 +hypertext_type = gizmo +hypertext_gizmo_item = measure +weight = 3 + +[hint:Text tool] +text = Text tool\nDid you know that you can add custom text labels to your models or even use the text as a modifier? Learn more in the documentation. +documentation_link = https://help.prusa3d.com/article/text-tool_399460 +weight = 3 + #[hint:] #text = #hypertext = diff --git a/resources/icons/add_text_modifier.svg b/resources/icons/add_text_modifier.svg new file mode 100644 index 00000000000..0a8376741f6 --- /dev/null +++ b/resources/icons/add_text_modifier.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/add_text_negative.svg b/resources/icons/add_text_negative.svg new file mode 100644 index 00000000000..866dd076e07 --- /dev/null +++ b/resources/icons/add_text_negative.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/add_text_part.svg b/resources/icons/add_text_part.svg new file mode 100644 index 00000000000..4a75a5d8337 --- /dev/null +++ b/resources/icons/add_text_part.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/collapse_btn.svg b/resources/icons/collapse_btn.svg new file mode 100644 index 00000000000..32d7f995953 --- /dev/null +++ b/resources/icons/collapse_btn.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/resources/icons/cut_.svg b/resources/icons/cut_.svg new file mode 100644 index 00000000000..0919e395226 --- /dev/null +++ b/resources/icons/cut_.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + diff --git a/resources/icons/cut_connectors.svg b/resources/icons/cut_connectors.svg new file mode 100644 index 00000000000..504df0a4195 --- /dev/null +++ b/resources/icons/cut_connectors.svg @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/resources/icons/dowel.svg b/resources/icons/dowel.svg new file mode 100644 index 00000000000..4e2fcfb5899 --- /dev/null +++ b/resources/icons/dowel.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/resources/icons/edit.svg b/resources/icons/edit.svg new file mode 100644 index 00000000000..3cc959b1ee8 --- /dev/null +++ b/resources/icons/edit.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/edit_button_pressed.svg b/resources/icons/edit_button_pressed.svg new file mode 100644 index 00000000000..6e4058d10f7 --- /dev/null +++ b/resources/icons/edit_button_pressed.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/icons/expand_btn.svg b/resources/icons/expand_btn.svg new file mode 100644 index 00000000000..4ee221a44a5 --- /dev/null +++ b/resources/icons/expand_btn.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/icons/legend_cog.svg b/resources/icons/legend_cog.svg new file mode 100644 index 00000000000..9a55fb7f5c1 --- /dev/null +++ b/resources/icons/legend_cog.svg @@ -0,0 +1,50 @@ + + + + + Svg Vector Icons : http://www.onlinewebfonts.com/icon + + diff --git a/resources/icons/legend_colorchanges.svg b/resources/icons/legend_colorchanges.svg new file mode 100644 index 00000000000..cb95ef46761 --- /dev/null +++ b/resources/icons/legend_colorchanges.svg @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/icons/legend_customgcodes.svg b/resources/icons/legend_customgcodes.svg new file mode 100644 index 00000000000..96e0be69e3f --- /dev/null +++ b/resources/icons/legend_customgcodes.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/resources/icons/legend_deretract.svg b/resources/icons/legend_deretract.svg new file mode 100644 index 00000000000..4b636df9ded --- /dev/null +++ b/resources/icons/legend_deretract.svg @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/icons/legend_pauseprints.svg b/resources/icons/legend_pauseprints.svg new file mode 100644 index 00000000000..954bc00e97a --- /dev/null +++ b/resources/icons/legend_pauseprints.svg @@ -0,0 +1,76 @@ + + diff --git a/resources/icons/legend_retract.svg b/resources/icons/legend_retract.svg new file mode 100644 index 00000000000..494e2f72862 --- /dev/null +++ b/resources/icons/legend_retract.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/icons/legend_seams.svg b/resources/icons/legend_seams.svg new file mode 100644 index 00000000000..724414119d0 --- /dev/null +++ b/resources/icons/legend_seams.svg @@ -0,0 +1,45 @@ + + + + + + + diff --git a/resources/icons/legend_shells.svg b/resources/icons/legend_shells.svg new file mode 100644 index 00000000000..b0a93effb26 --- /dev/null +++ b/resources/icons/legend_shells.svg @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + diff --git a/resources/icons/legend_toolchanges.svg b/resources/icons/legend_toolchanges.svg new file mode 100644 index 00000000000..85b6218a9ba --- /dev/null +++ b/resources/icons/legend_toolchanges.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/resources/icons/legend_toolmarker.svg b/resources/icons/legend_toolmarker.svg new file mode 100644 index 00000000000..3cd5cf8d96a --- /dev/null +++ b/resources/icons/legend_toolmarker.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/legend_travel.svg b/resources/icons/legend_travel.svg new file mode 100644 index 00000000000..553e90a7432 --- /dev/null +++ b/resources/icons/legend_travel.svg @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/icons/legend_wipe.svg b/resources/icons/legend_wipe.svg new file mode 100644 index 00000000000..decfcd6011e --- /dev/null +++ b/resources/icons/legend_wipe.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + diff --git a/resources/icons/make_bold.svg b/resources/icons/make_bold.svg new file mode 100644 index 00000000000..7d8eb226c17 --- /dev/null +++ b/resources/icons/make_bold.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/make_italic.svg b/resources/icons/make_italic.svg new file mode 100644 index 00000000000..c91ee041a7a --- /dev/null +++ b/resources/icons/make_italic.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/make_unbold.svg b/resources/icons/make_unbold.svg new file mode 100644 index 00000000000..41f92d1561e --- /dev/null +++ b/resources/icons/make_unbold.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/make_unitalic.svg b/resources/icons/make_unitalic.svg new file mode 100644 index 00000000000..9cefaa63833 --- /dev/null +++ b/resources/icons/make_unitalic.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/measure.svg b/resources/icons/measure.svg new file mode 100644 index 00000000000..3ea137a1ed9 --- /dev/null +++ b/resources/icons/measure.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + diff --git a/resources/icons/mode.svg b/resources/icons/mode.svg new file mode 100644 index 00000000000..613e99b0d85 --- /dev/null +++ b/resources/icons/mode.svg @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/resources/icons/notification_open.svg b/resources/icons/notification_open.svg new file mode 100644 index 00000000000..a83138a887a --- /dev/null +++ b/resources/icons/notification_open.svg @@ -0,0 +1,63 @@ + +image/svg+xml + + + + + + diff --git a/resources/icons/notification_open_hover.svg b/resources/icons/notification_open_hover.svg new file mode 100644 index 00000000000..77472808864 --- /dev/null +++ b/resources/icons/notification_open_hover.svg @@ -0,0 +1,64 @@ + +image/svg+xml + + + + + + diff --git a/resources/icons/notification_pause.svg b/resources/icons/notification_pause.svg new file mode 100644 index 00000000000..dc0d6131161 --- /dev/null +++ b/resources/icons/notification_pause.svg @@ -0,0 +1,75 @@ + +image/svg+xml + + + + + + + diff --git a/resources/icons/notification_pause_hover.svg b/resources/icons/notification_pause_hover.svg new file mode 100644 index 00000000000..6654f3775e5 --- /dev/null +++ b/resources/icons/notification_pause_hover.svg @@ -0,0 +1,75 @@ + +image/svg+xml + + + + + + + diff --git a/resources/icons/notification_play.svg b/resources/icons/notification_play.svg new file mode 100644 index 00000000000..5aa80cd94f5 --- /dev/null +++ b/resources/icons/notification_play.svg @@ -0,0 +1,75 @@ + +image/svg+xml + + + + + + + diff --git a/resources/icons/notification_play_hover.svg b/resources/icons/notification_play_hover.svg new file mode 100644 index 00000000000..f0d07fc1231 --- /dev/null +++ b/resources/icons/notification_play_hover.svg @@ -0,0 +1,75 @@ + +image/svg+xml + + + + + + + diff --git a/resources/icons/open_browser.svg b/resources/icons/open_browser.svg new file mode 100644 index 00000000000..a19f6226873 --- /dev/null +++ b/resources/icons/open_browser.svg @@ -0,0 +1,61 @@ + +image/svg+xml + + + + diff --git a/resources/icons/plug.svg b/resources/icons/plug.svg new file mode 100644 index 00000000000..561095207c5 --- /dev/null +++ b/resources/icons/plug.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/resources/icons/search.svg b/resources/icons/search.svg index 6421c7e055b..c6cdd007e42 100644 --- a/resources/icons/search.svg +++ b/resources/icons/search.svg @@ -1,4 +1,4 @@ - - \ No newline at end of file + + diff --git a/resources/icons/splashscreen-gcodepreview.jpg b/resources/icons/splashscreen-gcodepreview.jpg index bf30739be3fefb767321b72ba43d0616e22d0178..473b11b2eecfa84ade2a66e59a0e304cbe1d136c 100644 GIT binary patch delta 68973 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 z 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%0AkW=Q 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ૅ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[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

#Uc-*5|qV^!AHij(a4{ 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 M?*_-t{BP+00RNZoF8}}l literal 318372 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≈sA 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

t?D+(SFo>fs!~H1yLW&G|bm53S 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

UBYNfjDd31(Hu$9*{WAz4*HX913p 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 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/localization/PrusaSlicer.pot b/resources/localization/PrusaSlicer.pot index 8362a7549e0..d6c3ae00c61 100644 --- a/resources/localization/PrusaSlicer.pot +++ b/resources/localization/PrusaSlicer.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-01 16:30+0100\n" +"POT-Creation-Date: 2023-03-03 14:25+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,54 +18,54 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 +#: src/slic3r/GUI/AboutDialog.cpp:46 src/slic3r/GUI/AboutDialog.cpp:306 msgid "Portions copyright" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 +#: src/slic3r/GUI/AboutDialog.cpp:143 src/slic3r/GUI/AboutDialog.cpp:270 msgid "Copyright" msgstr "" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:143 +#: src/slic3r/GUI/AboutDialog.cpp:145 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:212 +#: src/slic3r/GUI/AboutDialog.cpp:214 #, possible-c-format, possible-boost-format msgid "About %s" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 -#: src/slic3r/GUI/GUI_App.cpp:262 +#: src/slic3r/GUI/AboutDialog.cpp:245 src/slic3r/GUI/AboutDialog.cpp:370 +#: src/slic3r/GUI/GUI_App.cpp:271 msgid "Version" msgstr "" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:277 msgid "is licensed under the" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:273 src/slic3r/GUI/GUI_App.cpp:277 msgid "GNU Affero General Public License, version 3" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:273 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:274 +#: src/slic3r/GUI/AboutDialog.cpp:275 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " "numerous others." msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:310 +#: src/slic3r/GUI/AboutDialog.cpp:311 msgid "Copy Version Info" msgstr "" @@ -89,54 +89,54 @@ msgid "" msgstr "" #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:162 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:204 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:188 msgid "Slicing complete" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:199 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183 #, possible-boost-format msgid "Masked SLA file exported to %1%" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:286 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:279 msgid "Access violation" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:288 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:281 msgid "Illegal instruction" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:283 msgid "Divide by zero" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:292 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:285 msgid "Overflow" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:294 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:287 msgid "Underflow" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:297 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 msgid "Floating reserved operand" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:300 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:293 msgid "Stack overflow" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:659 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:726 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:652 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:719 msgid "Running post-processing scripts" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:690 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:710 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:683 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:703 msgid "Unknown error occured during exporting G-code." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:695 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:688 #, possible-boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. Maybe the SD " @@ -144,7 +144,7 @@ msgid "" "Error message: %1%" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:698 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:691 #, possible-boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. There might be " @@ -152,44 +152,45 @@ msgid "" "device. The corrupted output G-code is at %1%.tmp." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:701 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:694 #, possible-boost-format msgid "" "Renaming of the G-code after copying to the selected destination folder has " "failed. Current path is %1%.tmp. Please try exporting again." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:704 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:697 #, possible-boost-format msgid "" "Copying of the temporary G-code has finished but the original code at %1% " "couldn't be opened during copy check. The output G-code is at %2%.tmp." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:707 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:700 #, possible-boost-format msgid "" "Copying of the temporary G-code has finished but the exported code couldn't " "be opened during copy check. The output G-code is at %1%.tmp." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:715 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:708 #, possible-boost-format msgid "G-code file exported to %1%" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:729 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:722 msgid "Copying of the temporary G-code to the output G-code failed" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:751 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:738 #, possible-boost-format msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:31 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2765 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1576 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:241 src/slic3r/GUI/Plater.cpp:220 +#: src/slic3r/GUI/Tab.cpp:2697 msgid "Size" msgstr "" @@ -197,7 +198,9 @@ msgstr "" msgid "Origin" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:33 src/libslic3r/PrintConfig.cpp:1020 +#: src/slic3r/GUI/BedShapeDialog.cpp:33 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1994 +#: src/libslic3r/PrintConfig.cpp:1109 msgid "Diameter" msgstr "" @@ -211,54 +214,62 @@ msgid "" "rectangle." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:262 -#: src/slic3r/GUI/ConfigWizard.cpp:1476 src/slic3r/GUI/ConfigWizard.cpp:1490 +#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:291 +#: src/slic3r/GUI/ConfigWizard.cpp:1796 src/slic3r/GUI/ConfigWizard.cpp:1832 +#: src/slic3r/GUI/ConfigWizard.cpp:1846 #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:100 -#: src/slic3r/GUI/GCodeViewer.cpp:3181 src/slic3r/GUI/GCodeViewer.cpp:3187 -#: src/slic3r/GUI/GCodeViewer.cpp:3195 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 src/slic3r/GUI/GCodeViewer.cpp:3455 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 #: src/slic3r/GUI/GUI_ObjectLayers.cpp:145 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 src/libslic3r/PrintConfig.cpp:263 -#: src/libslic3r/PrintConfig.cpp:290 src/libslic3r/PrintConfig.cpp:297 -#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:520 -#: src/libslic3r/PrintConfig.cpp:546 src/libslic3r/PrintConfig.cpp:621 -#: src/libslic3r/PrintConfig.cpp:629 src/libslic3r/PrintConfig.cpp:679 -#: src/libslic3r/PrintConfig.cpp:813 src/libslic3r/PrintConfig.cpp:824 -#: src/libslic3r/PrintConfig.cpp:842 src/libslic3r/PrintConfig.cpp:1023 -#: src/libslic3r/PrintConfig.cpp:1235 src/libslic3r/PrintConfig.cpp:1302 -#: src/libslic3r/PrintConfig.cpp:1312 src/libslic3r/PrintConfig.cpp:1611 -#: src/libslic3r/PrintConfig.cpp:1805 src/libslic3r/PrintConfig.cpp:1866 -#: src/libslic3r/PrintConfig.cpp:1884 src/libslic3r/PrintConfig.cpp:1902 -#: src/libslic3r/PrintConfig.cpp:1965 src/libslic3r/PrintConfig.cpp:1975 -#: src/libslic3r/PrintConfig.cpp:2097 src/libslic3r/PrintConfig.cpp:2106 -#: src/libslic3r/PrintConfig.cpp:2125 src/libslic3r/PrintConfig.cpp:2146 -#: src/libslic3r/PrintConfig.cpp:2158 src/libslic3r/PrintConfig.cpp:2166 -#: src/libslic3r/PrintConfig.cpp:2207 src/libslic3r/PrintConfig.cpp:2215 -#: src/libslic3r/PrintConfig.cpp:2225 src/libslic3r/PrintConfig.cpp:2233 -#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2303 -#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2603 -#: src/libslic3r/PrintConfig.cpp:2620 src/libslic3r/PrintConfig.cpp:2721 -#: src/libslic3r/PrintConfig.cpp:2730 src/libslic3r/PrintConfig.cpp:2780 -#: src/libslic3r/PrintConfig.cpp:2932 src/libslic3r/PrintConfig.cpp:3020 -#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3034 -#: src/libslic3r/PrintConfig.cpp:3048 src/libslic3r/PrintConfig.cpp:3072 -#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3092 -#: src/libslic3r/PrintConfig.cpp:3372 src/libslic3r/PrintConfig.cpp:3413 -#: src/libslic3r/PrintConfig.cpp:3573 src/libslic3r/PrintConfig.cpp:3582 -#: src/libslic3r/PrintConfig.cpp:3591 src/libslic3r/PrintConfig.cpp:3601 -#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3676 -#: src/libslic3r/PrintConfig.cpp:3688 src/libslic3r/PrintConfig.cpp:3708 -#: src/libslic3r/PrintConfig.cpp:3718 src/libslic3r/PrintConfig.cpp:3728 -#: src/libslic3r/PrintConfig.cpp:3746 src/libslic3r/PrintConfig.cpp:3761 -#: src/libslic3r/PrintConfig.cpp:3775 src/libslic3r/PrintConfig.cpp:3786 -#: src/libslic3r/PrintConfig.cpp:3799 src/libslic3r/PrintConfig.cpp:3844 -#: src/libslic3r/PrintConfig.cpp:3854 src/libslic3r/PrintConfig.cpp:3863 -#: src/libslic3r/PrintConfig.cpp:3873 src/libslic3r/PrintConfig.cpp:3889 -#: src/libslic3r/PrintConfig.cpp:3913 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 src/libslic3r/PrintConfig.cpp:279 +#: src/libslic3r/PrintConfig.cpp:303 src/libslic3r/PrintConfig.cpp:310 +#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:657 src/libslic3r/PrintConfig.cpp:724 +#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:782 +#: src/libslic3r/PrintConfig.cpp:902 src/libslic3r/PrintConfig.cpp:913 +#: src/libslic3r/PrintConfig.cpp:931 src/libslic3r/PrintConfig.cpp:1112 +#: src/libslic3r/PrintConfig.cpp:1295 src/libslic3r/PrintConfig.cpp:1359 +#: src/libslic3r/PrintConfig.cpp:1369 src/libslic3r/PrintConfig.cpp:1650 +#: src/libslic3r/PrintConfig.cpp:1842 src/libslic3r/PrintConfig.cpp:1903 +#: src/libslic3r/PrintConfig.cpp:1921 src/libslic3r/PrintConfig.cpp:1939 +#: src/libslic3r/PrintConfig.cpp:1995 src/libslic3r/PrintConfig.cpp:2005 +#: src/libslic3r/PrintConfig.cpp:2127 src/libslic3r/PrintConfig.cpp:2136 +#: src/libslic3r/PrintConfig.cpp:2155 src/libslic3r/PrintConfig.cpp:2176 +#: src/libslic3r/PrintConfig.cpp:2188 src/libslic3r/PrintConfig.cpp:2196 +#: src/libslic3r/PrintConfig.cpp:2237 src/libslic3r/PrintConfig.cpp:2245 +#: src/libslic3r/PrintConfig.cpp:2255 src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2271 src/libslic3r/PrintConfig.cpp:2336 +#: src/libslic3r/PrintConfig.cpp:2565 src/libslic3r/PrintConfig.cpp:2632 +#: src/libslic3r/PrintConfig.cpp:2647 src/libslic3r/PrintConfig.cpp:2746 +#: src/libslic3r/PrintConfig.cpp:2755 src/libslic3r/PrintConfig.cpp:2801 +#: src/libslic3r/PrintConfig.cpp:2886 src/libslic3r/PrintConfig.cpp:2896 +#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3108 +#: src/libslic3r/PrintConfig.cpp:3115 src/libslic3r/PrintConfig.cpp:3122 +#: src/libslic3r/PrintConfig.cpp:3136 src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3170 src/libslic3r/PrintConfig.cpp:3180 +#: src/libslic3r/PrintConfig.cpp:3330 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3391 src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3444 src/libslic3r/PrintConfig.cpp:3456 +#: src/libslic3r/PrintConfig.cpp:3476 src/libslic3r/PrintConfig.cpp:3491 +#: src/libslic3r/PrintConfig.cpp:3501 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3681 src/libslic3r/PrintConfig.cpp:3878 +#: src/libslic3r/PrintConfig.cpp:3893 src/libslic3r/PrintConfig.cpp:3907 +#: src/libslic3r/PrintConfig.cpp:3918 src/libslic3r/PrintConfig.cpp:3931 +#: src/libslic3r/PrintConfig.cpp:3976 src/libslic3r/PrintConfig.cpp:3986 +#: src/libslic3r/PrintConfig.cpp:3995 src/libslic3r/PrintConfig.cpp:4005 +#: src/libslic3r/PrintConfig.cpp:4021 src/libslic3r/PrintConfig.cpp:4045 +#: src/libslic3r/PrintConfig.cpp:4072 msgid "mm" msgstr "" @@ -276,13 +287,13 @@ msgstr "" msgid "Circular" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:81 src/slic3r/GUI/GUI_Preview.cpp:252 -#: src/libslic3r/ExtrusionEntity.cpp:343 src/libslic3r/ExtrusionEntity.cpp:378 +#: src/slic3r/GUI/BedShapeDialog.cpp:81 msgid "Custom" msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:104 src/slic3r/GUI/BedShapeDialog.cpp:179 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1701 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1565 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1798 msgid "Shape" msgstr "" @@ -290,8 +301,8 @@ msgstr "" msgid "Load shape from STL..." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2147 +#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3914 +#: src/slic3r/GUI/MainFrame.cpp:2240 msgid "Settings" msgstr "" @@ -304,7 +315,7 @@ msgid "Load..." msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/Tab.cpp:3973 msgid "Remove" msgstr "" @@ -316,107 +327,174 @@ msgstr "" msgid "Model" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:508 +#: src/slic3r/GUI/BedShapeDialog.cpp:506 msgid "Choose an STL file to import bed shape from:" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:514 src/slic3r/GUI/BedShapeDialog.cpp:562 -#: src/slic3r/GUI/BedShapeDialog.cpp:584 +#: src/slic3r/GUI/BedShapeDialog.cpp:512 src/slic3r/GUI/BedShapeDialog.cpp:560 +#: src/slic3r/GUI/BedShapeDialog.cpp:582 msgid "Invalid file format." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:525 +#: src/slic3r/GUI/BedShapeDialog.cpp:523 msgid "Error! Invalid model" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:533 +#: src/slic3r/GUI/BedShapeDialog.cpp:531 msgid "The selected file contains no geometry." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:537 +#: src/slic3r/GUI/BedShapeDialog.cpp:535 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:552 +#: src/slic3r/GUI/BedShapeDialog.cpp:550 msgid "Choose a file to import bed texture from (PNG/SVG):" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:574 +#: src/slic3r/GUI/BedShapeDialog.cpp:572 msgid "Choose an STL file to import bed model from:" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.hpp:95 src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/BedShapeDialog.hpp:96 src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape" msgstr "" -#: src/slic3r/GUI/BonjourDialog.cpp:55 +#: src/slic3r/GUI/BonjourDialog.cpp:58 msgid "Network lookup" msgstr "" -#: src/slic3r/GUI/BonjourDialog.cpp:72 +#: src/slic3r/GUI/BonjourDialog.cpp:75 src/slic3r/GUI/BonjourDialog.cpp:253 msgid "Address" msgstr "" -#: src/slic3r/GUI/BonjourDialog.cpp:73 +#: src/slic3r/GUI/BonjourDialog.cpp:76 msgid "Hostname" msgstr "" -#: src/slic3r/GUI/BonjourDialog.cpp:74 +#: src/slic3r/GUI/BonjourDialog.cpp:77 msgid "Service name" msgstr "" -#: src/slic3r/GUI/BonjourDialog.cpp:76 +#: src/slic3r/GUI/BonjourDialog.cpp:79 msgid "OctoPrint version" msgstr "" -#: src/slic3r/GUI/BonjourDialog.cpp:224 +#: src/slic3r/GUI/BonjourDialog.cpp:227 msgid "Searching for devices" msgstr "" -#: src/slic3r/GUI/BonjourDialog.cpp:231 +#: src/slic3r/GUI/BonjourDialog.cpp:234 msgid "Finished" msgstr "" -#: src/slic3r/GUI/ButtonsDescription.cpp:42 +#: src/slic3r/GUI/BonjourDialog.cpp:240 +msgid "Multiple resolved IP addresses" +msgstr "" + +#: src/slic3r/GUI/BonjourDialog.cpp:249 +#, possible-boost-format +msgid "" +"There are several IP addresses resolving to hostname %1%.\n" +"Please select one that should be used." +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:21 +msgid "Palette 1 (default)" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:22 +msgid "Palette 2" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:23 +msgid "Palette 3" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:24 +msgid "Palette 4" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:25 +msgid "Palette 5" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:26 +msgid "Palette 6" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:27 +msgid "Palette 7" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:28 +msgid "Palette 8" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:112 msgid "Revert color to default" msgstr "" -#: src/slic3r/GUI/ButtonsDescription.cpp:57 +#: src/slic3r/GUI/ButtonsDescription.cpp:127 msgid "Value is the same as the system value" msgstr "" -#: src/slic3r/GUI/ButtonsDescription.cpp:58 +#: src/slic3r/GUI/ButtonsDescription.cpp:128 msgid "" "Value was changed and is not equal to the system value or the last saved " "preset" msgstr "" -#: src/slic3r/GUI/ButtonsDescription.cpp:62 +#: src/slic3r/GUI/ButtonsDescription.cpp:155 +msgid "Default palette for mode markers" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2422 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Simple" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2424 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgctxt "Mode" +msgid "Advanced" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2425 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Expert" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:182 +msgid "Revert color" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:200 msgid "Buttons And Text Colors Description" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/ConfigManipulation.cpp:50 msgid "" "Layer height is not valid.\n" "\n" "The layer height will be reset to 0.01." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:50 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1449 -#: src/libslic3r/PrintConfig.cpp:286 +#: src/slic3r/GUI/ConfigManipulation.cpp:51 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1394 +#: src/libslic3r/PrintConfig.cpp:299 msgid "Layer height" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:61 +#: src/slic3r/GUI/ConfigManipulation.cpp:62 msgid "" "First layer height is not valid.\n" "\n" "The first layer height will be reset to 0.01." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:62 src/libslic3r/PrintConfig.cpp:1231 +#: src/slic3r/GUI/ConfigManipulation.cpp:63 src/libslic3r/PrintConfig.cpp:1291 msgid "First layer height" msgstr "" @@ -427,334 +505,365 @@ msgid "" "- no top solid layers\n" "- 0% fill density\n" "- no support material\n" -"- Ensure vertical shell thickness enabled\n" "- Detect thin walls disabled" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:90 +#: src/slic3r/GUI/ConfigManipulation.cpp:89 msgid "Shall I adjust those settings in order to enable Spiral Vase?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:91 +#: src/slic3r/GUI/ConfigManipulation.cpp:90 msgid "Spiral Vase" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:121 +#: src/slic3r/GUI/ConfigManipulation.cpp:123 msgid "" -"The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool " -"change.\n" -"(both support_material_extruder and support_material_interface_extruder need " -"to be set to 0)." +"For the Wipe Tower to work with the soluble supports, the support layers\n" +"need to be synchronized with the object layers." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:125 -msgid "Shall I adjust those settings in order to enable the Wipe Tower?" +#: src/slic3r/GUI/ConfigManipulation.cpp:126 +msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:126 -#: src/slic3r/GUI/ConfigManipulation.cpp:146 +#: src/slic3r/GUI/ConfigManipulation.cpp:127 +#: src/slic3r/GUI/ConfigManipulation.cpp:145 msgid "Wipe Tower" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:142 +#: src/slic3r/GUI/ConfigManipulation.cpp:140 src/libslic3r/Print.cpp:672 msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers\n" -"need to be synchronized with the object layers." +"The Wipe Tower currently supports the non-soluble supports only if they are " +"printed with the current extruder without triggering a tool change. (both " +"support_material_extruder and support_material_interface_extruder need to be " +"set to 0)." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:145 -msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" +#: src/slic3r/GUI/ConfigManipulation.cpp:144 +msgid "Shall I adjust those settings in order to enable the Wipe Tower?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:164 +#: src/slic3r/GUI/ConfigManipulation.cpp:166 msgid "" "Supports work better, if the following feature is enabled:\n" "- Detect bridging perimeters" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:167 +#: src/slic3r/GUI/ConfigManipulation.cpp:169 msgid "Shall I adjust those settings for supports?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:168 +#: src/slic3r/GUI/ConfigManipulation.cpp:170 msgid "Support Generator" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:195 +#: src/slic3r/GUI/ConfigManipulation.cpp:194 #, possible-boost-format msgid "The %1% infill pattern is not supposed to work at 100%% density." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:198 +#: src/slic3r/GUI/ConfigManipulation.cpp:196 msgid "Shall I switch to rectilinear fill pattern?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:199 +#: src/slic3r/GUI/ConfigManipulation.cpp:197 #: src/slic3r/GUI/GUI_Factories.cpp:55 src/slic3r/GUI/GUI_Factories.cpp:128 -#: src/slic3r/GUI/Plater.cpp:460 src/slic3r/GUI/Tab.cpp:1503 -#: src/slic3r/GUI/Tab.cpp:1505 src/libslic3r/PrintConfig.cpp:475 -#: src/libslic3r/PrintConfig.cpp:716 src/libslic3r/PrintConfig.cpp:743 -#: src/libslic3r/PrintConfig.cpp:1098 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1149 src/libslic3r/PrintConfig.cpp:1398 -#: src/libslic3r/PrintConfig.cpp:1427 src/libslic3r/PrintConfig.cpp:1496 -#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1535 -#: src/libslic3r/PrintConfig.cpp:2364 src/libslic3r/PrintConfig.cpp:2381 +#: src/slic3r/GUI/Plater.cpp:468 src/slic3r/GUI/Tab.cpp:1450 +#: src/slic3r/GUI/Tab.cpp:1452 src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:811 src/libslic3r/PrintConfig.cpp:831 +#: src/libslic3r/PrintConfig.cpp:1187 src/libslic3r/PrintConfig.cpp:1200 +#: src/libslic3r/PrintConfig.cpp:1225 src/libslic3r/PrintConfig.cpp:1444 +#: src/libslic3r/PrintConfig.cpp:1473 src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1557 src/libslic3r/PrintConfig.cpp:1576 +#: src/libslic3r/PrintConfig.cpp:2395 src/libslic3r/PrintConfig.cpp:2412 msgid "Infill" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:337 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Head penetration should not be greater than the head width." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:339 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid Head penetration" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:350 +#: src/slic3r/GUI/ConfigManipulation.cpp:362 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:352 +#: src/slic3r/GUI/ConfigManipulation.cpp:364 msgid "Invalid pinhead diameter" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20 msgid "Upgrade" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22 msgid "Downgrade" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 msgid "Before roll back" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:340 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:26 src/libslic3r/PrintConfig.cpp:353 msgid "User" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:329 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:29 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1135 msgid "Unknown" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 msgid "Active" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 msgid "PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 src/libslic3r/Preset.cpp:1341 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 src/libslic3r/Preset.cpp:1480 msgid "print" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:65 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 msgid "filaments" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 src/libslic3r/Preset.cpp:1343 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:67 src/libslic3r/Preset.cpp:1482 msgid "SLA print" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69 -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/slic3r/GUI/GUI.cpp:340 -#: src/slic3r/GUI/Plater.cpp:821 src/libslic3r/Preset.cpp:1344 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/slic3r/GUI/GUI.cpp:331 +#: src/slic3r/GUI/Plater.cpp:851 src/libslic3r/Preset.cpp:1483 msgid "SLA material" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:71 src/libslic3r/Preset.cpp:1345 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 src/libslic3r/Preset.cpp:1484 msgid "printer" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 src/slic3r/GUI/Tab.cpp:1366 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 src/slic3r/GUI/Tab.cpp:1311 msgid "vendor" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 msgid "version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:76 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 msgid "min PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:77 msgid "max PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "model" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "variants" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:93 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:92 #, possible-c-format, possible-boost-format msgid "Incompatible with this %s" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:96 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:95 msgid "Activate" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:123 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:122 msgid "Configuration Snapshots" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:262 +#: src/slic3r/GUI/ConfigWizard.cpp:291 msgid "nozzle" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:266 +#: src/slic3r/GUI/ConfigWizard.cpp:295 msgid "Alternate nozzles:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "All standard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "Standard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3833 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 +#: src/slic3r/GUI/ConfigWizard.cpp:360 src/slic3r/GUI/ConfigWizard.cpp:681 +#: src/slic3r/GUI/FileArchiveDialog.cpp:261 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 src/slic3r/GUI/Preferences.cpp:550 +#: src/slic3r/GUI/Tab.cpp:4058 src/slic3r/GUI/UnsavedChangesDialog.cpp:1161 msgid "All" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:332 src/slic3r/GUI/ConfigWizard.cpp:652 -#: src/slic3r/GUI/DoubleSlider.cpp:2030 src/slic3r/GUI/Plater.cpp:432 -#: src/slic3r/GUI/Plater.cpp:579 src/slic3r/GUI/Preferences.cpp:436 -#: src/libslic3r/PrintConfig.cpp:1291 +#: src/slic3r/GUI/ConfigWizard.cpp:361 src/slic3r/GUI/ConfigWizard.cpp:682 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 +#: src/slic3r/GUI/FileArchiveDialog.cpp:265 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1984 src/slic3r/GUI/Plater.cpp:439 +#: src/slic3r/GUI/Plater.cpp:594 src/slic3r/GUI/Preferences.cpp:552 +#: src/libslic3r/PrintConfig.cpp:1347 msgid "None" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:484 +#: src/slic3r/GUI/ConfigWizard.cpp:513 #, possible-c-format, possible-boost-format msgid "Welcome to the %s Configuration Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:486 +#: src/slic3r/GUI/ConfigWizard.cpp:515 #, possible-c-format, possible-boost-format msgid "Welcome to the %s Configuration Wizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:488 +#: src/slic3r/GUI/ConfigWizard.cpp:517 msgid "Welcome" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:519 #, possible-c-format, possible-boost-format msgid "" "Hello, welcome to %s! This %s helps you with the initial configuration; just " "a few settings and you will be ready to print." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:495 +#: src/slic3r/GUI/ConfigWizard.cpp:524 msgid "Remove user profiles (a snapshot will be taken beforehand)" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:498 +#: src/slic3r/GUI/ConfigWizard.cpp:527 msgid "" "Perform desktop integration (Sets this binary to be searchable by the " "system)." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:550 +#: src/slic3r/GUI/ConfigWizard.cpp:579 #, possible-c-format, possible-boost-format msgid "%s Family" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:640 +#: src/slic3r/GUI/ConfigWizard.cpp:670 msgid "Printer:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:642 +#: src/slic3r/GUI/ConfigWizard.cpp:672 msgid "Vendor:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:643 +#: src/slic3r/GUI/ConfigWizard.cpp:673 msgid "Profile:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:720 src/slic3r/GUI/ConfigWizard.cpp:892 -#: src/slic3r/GUI/ConfigWizard.cpp:952 src/slic3r/GUI/ConfigWizard.cpp:1088 +#: src/slic3r/GUI/ConfigWizard.cpp:750 src/slic3r/GUI/ConfigWizard.cpp:938 +#: src/slic3r/GUI/ConfigWizard.cpp:1024 src/slic3r/GUI/ConfigWizard.cpp:1163 msgid "(All)" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:754 src/slic3r/GUI/ConfigWizard.cpp:1165 +msgid "(Templates)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:789 #, possible-boost-format msgid "" -"%1% marked with * are not compatible with some installed " -"printers." +"%1% visible for (\"Template\") printer are universal profiles " +"available for all printers. These might not be compatible with your printer." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:752 src/slic3r/GUI/ConfigWizard.cpp:2043 -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filaments" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 msgid "SLA materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:755 +#: src/slic3r/GUI/ConfigWizard.cpp:791 +#, possible-boost-format +msgid "" +"%1% marked with * are not compatible with some installed " +"printers." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:794 #, possible-boost-format msgid "All installed printers are compatible with the selected %1%." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/libslic3r/Preset.cpp:1342 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/libslic3r/Preset.cpp:1481 msgid "filament" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:778 +#: src/slic3r/GUI/ConfigWizard.cpp:818 msgid "" "Only the following installed printers are compatible with the selected " "filaments" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:779 +#: src/slic3r/GUI/ConfigWizard.cpp:819 msgid "" "Only the following installed printers are compatible with the selected SLA " "materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1213 +msgid "" +"You have selected template filament. Please note that these filaments are " +"available for all printers but are NOT certain to be compatible with your " +"printer. Do you still wish to have this filament selected?\n" +"(This message won't be displayed again.)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1214 src/slic3r/GUI/ConfigWizard.cpp:2720 +#: src/slic3r/GUI/ConfigWizard.cpp:2860 src/slic3r/GUI/DoubleSlider.cpp:2591 +#: src/slic3r/GUI/DoubleSlider.cpp:2612 src/slic3r/GUI/GUI.cpp:245 +#: src/slic3r/GUI/GUI_App.cpp:3458 src/slic3r/GUI/UpdateDialogs.cpp:204 +#: src/slic3r/GUI/UpdateDialogs.cpp:212 src/slic3r/GUI/UpdateDialogs.cpp:217 +#: src/slic3r/GUI/UpdateDialogs.cpp:222 src/slic3r/GUI/UpdateDialogs.cpp:229 +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +msgid "Notice" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer Setup" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1177 +#: src/slic3r/GUI/ConfigWizard.cpp:1264 msgid "Define a custom printer profile" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1179 +#: src/slic3r/GUI/ConfigWizard.cpp:1265 msgid "Custom profile name:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Automatic updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1214 +#: src/slic3r/GUI/ConfigWizard.cpp:1290 msgid "Check for application updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1218 +#: src/slic3r/GUI/ConfigWizard.cpp:1294 #, possible-c-format, possible-boost-format msgid "" "If enabled, %s checks for new application versions online. When a new " @@ -763,11 +872,11 @@ msgid "" "notification mechanisms, no automatic installation is done." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1224 src/slic3r/GUI/Preferences.cpp:175 +#: src/slic3r/GUI/ConfigWizard.cpp:1300 src/slic3r/GUI/Preferences.cpp:306 msgid "Update built-in Presets automatically" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1228 +#: src/slic3r/GUI/ConfigWizard.cpp:1304 #, possible-c-format, possible-boost-format msgid "" "If enabled, %s downloads updates of built-in system presets in the " @@ -776,29 +885,73 @@ msgid "" "startup." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1231 +#: src/slic3r/GUI/ConfigWizard.cpp:1307 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1236 +#: src/slic3r/GUI/ConfigWizard.cpp:1312 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1243 src/slic3r/GUI/GUI_Factories.cpp:726 -#: src/slic3r/GUI/Plater.cpp:3582 +#: src/slic3r/GUI/ConfigWizard.cpp:1361 src/slic3r/GUI/Preferences.cpp:1076 +msgid "Download path" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1366 src/slic3r/GUI/FirmwareDialog.cpp:815 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:300 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +msgid "Browse" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1371 +msgid "Choose folder:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads from URL" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1417 +msgid "Allow built-in downloader" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1424 +#, possible-c-format, possible-boost-format +msgid "" +"If enabled, %s registers to start on custom URL on www.printables.com. You " +"will be able to use button with %s logo to open models in this %s. The model " +"will be downloaded into folder you choose bellow." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1431 +msgid "" +"On Linux systems the process of registration also creates desktop " +"integration files for this version of application." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1458 +msgid "Chosen directory for downloads does not Exists." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1545 src/slic3r/GUI/GUI_Factories.cpp:810 +#: src/slic3r/GUI/Plater.cpp:3732 msgid "Reload from disk" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1246 +#: src/slic3r/GUI/ConfigWizard.cpp:1548 msgid "" "Export full pathnames of models and parts sources into 3mf and amf files" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1250 +#: src/slic3r/GUI/ConfigWizard.cpp:1552 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked.\n" @@ -806,23 +959,23 @@ msgid "" "using an open file dialog." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1259 +#: src/slic3r/GUI/ConfigWizard.cpp:1561 msgid "Files association" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1261 src/slic3r/GUI/Preferences.cpp:157 +#: src/slic3r/GUI/ConfigWizard.cpp:1563 src/slic3r/GUI/Preferences.cpp:292 msgid "Associate .3mf files to PrusaSlicer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1262 src/slic3r/GUI/Preferences.cpp:164 +#: src/slic3r/GUI/ConfigWizard.cpp:1564 src/slic3r/GUI/Preferences.cpp:297 msgid "Associate .stl files to PrusaSlicer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1272 +#: src/slic3r/GUI/ConfigWizard.cpp:1574 msgid "View mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1274 +#: src/slic3r/GUI/ConfigWizard.cpp:1576 msgid "" "PrusaSlicer's user interfaces comes in three variants:\n" "Simple, Advanced, and Expert.\n" @@ -831,288 +984,302 @@ msgid "" "fine-tuning, they are suitable for advanced and expert users, respectively." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1279 +#: src/slic3r/GUI/ConfigWizard.cpp:1581 msgid "Simple mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1280 +#: src/slic3r/GUI/ConfigWizard.cpp:1582 msgid "Advanced mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1281 +#: src/slic3r/GUI/ConfigWizard.cpp:1583 msgid "Expert mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1287 +#: src/slic3r/GUI/ConfigWizard.cpp:1596 msgid "The size of the object can be specified in inches" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1288 +#: src/slic3r/GUI/ConfigWizard.cpp:1597 msgid "Use inches" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1322 +#: src/slic3r/GUI/ConfigWizard.cpp:1617 msgid "Other Vendors" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1326 +#: src/slic3r/GUI/ConfigWizard.cpp:1621 #, possible-c-format, possible-boost-format msgid "Pick another vendor supported by %s" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 msgid "Firmware Type" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2366 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 src/slic3r/GUI/Tab.cpp:2354 msgid "Firmware" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1361 +#: src/slic3r/GUI/ConfigWizard.cpp:1658 msgid "Choose the type of firmware used by your printer." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/ConfigWizard.cpp:1707 src/slic3r/GUI/ConfigWizard.cpp:1778 +#: src/slic3r/GUI/ConfigWizard.cpp:1783 src/slic3r/GUI/ConfigWizard.cpp:1788 +#: src/slic3r/GUI/Field.cpp:258 src/slic3r/GUI/Field.cpp:328 +#: src/slic3r/GUI/Field.cpp:1585 src/slic3r/GUI/GUI_ObjectLayers.cpp:435 +msgid "Invalid numeric input." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape and Size" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1399 +#: src/slic3r/GUI/ConfigWizard.cpp:1735 msgid "Set the shape of your printer's bed." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1433 src/slic3r/GUI/Field.cpp:255 -#: src/slic3r/GUI/Field.cpp:324 src/slic3r/GUI/Field.cpp:1561 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:435 -msgid "Invalid numeric input." +#: src/slic3r/GUI/ConfigWizard.cpp:1755 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1610 +msgid "Build Volume" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1758 +msgid "Set vertical size of your printer." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1795 +msgid "Max print height:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Filament and Nozzle Diameters" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Print Diameters" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1472 +#: src/slic3r/GUI/ConfigWizard.cpp:1828 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1475 +#: src/slic3r/GUI/ConfigWizard.cpp:1831 msgid "Nozzle Diameter:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1485 +#: src/slic3r/GUI/ConfigWizard.cpp:1841 msgid "Enter the diameter of your filament." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1486 +#: src/slic3r/GUI/ConfigWizard.cpp:1842 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1489 +#: src/slic3r/GUI/ConfigWizard.cpp:1845 msgid "Filament Diameter:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Nozzle and Bed Temperatures" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Temperatures" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1563 +#: src/slic3r/GUI/ConfigWizard.cpp:1919 msgid "Enter the temperature needed for extruding your filament." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1564 +#: src/slic3r/GUI/ConfigWizard.cpp:1920 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1567 +#: src/slic3r/GUI/ConfigWizard.cpp:1923 msgid "Extrusion Temperature:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1568 src/slic3r/GUI/ConfigWizard.cpp:1582 -#: src/libslic3r/PrintConfig.cpp:418 src/libslic3r/PrintConfig.cpp:1211 -#: src/libslic3r/PrintConfig.cpp:1266 src/libslic3r/PrintConfig.cpp:2842 +#: src/slic3r/GUI/ConfigWizard.cpp:1924 src/slic3r/GUI/ConfigWizard.cpp:1938 +#: src/libslic3r/PrintConfig.cpp:437 src/libslic3r/PrintConfig.cpp:1271 +#: src/libslic3r/PrintConfig.cpp:1326 src/libslic3r/PrintConfig.cpp:2930 +#: src/libslic3r/PrintConfig.cpp:3689 msgid "°C" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1577 +#: src/slic3r/GUI/ConfigWizard.cpp:1933 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1578 +#: src/slic3r/GUI/ConfigWizard.cpp:1934 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1581 +#: src/slic3r/GUI/ConfigWizard.cpp:1937 msgid "Bed Temperature:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2043 src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2097 +#: src/slic3r/GUI/ConfigWizard.cpp:2464 msgid "FFF Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2102 +#: src/slic3r/GUI/ConfigWizard.cpp:2469 msgid "SLA Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2338 +#: src/slic3r/GUI/ConfigWizard.cpp:2718 #, possible-boost-format msgid "" "Following printer profiles has no default filament: %1%Please select one " "manually." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2339 +#: src/slic3r/GUI/ConfigWizard.cpp:2719 #, possible-boost-format msgid "" "Following printer profiles has no default material: %1%Please select one " "manually." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2340 src/slic3r/GUI/ConfigWizard.cpp:2438 -#: src/slic3r/GUI/DoubleSlider.cpp:2522 src/slic3r/GUI/DoubleSlider.cpp:2543 -#: src/slic3r/GUI/GUI.cpp:232 -msgid "Notice" -msgstr "" - -#: src/slic3r/GUI/ConfigWizard.cpp:2459 +#: src/slic3r/GUI/ConfigWizard.cpp:2883 msgid "The following FFF printer models have no filament selected:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2463 +#: src/slic3r/GUI/ConfigWizard.cpp:2887 msgid "Do you want to select default filaments for these FFF printer models?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2477 +#: src/slic3r/GUI/ConfigWizard.cpp:2901 msgid "The following SLA printer models have no materials selected:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2481 +#: src/slic3r/GUI/ConfigWizard.cpp:2905 msgid "Do you want to select default SLA materials for these printer models?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2523 +#: src/slic3r/GUI/ConfigWizard.cpp:2947 msgid "Configuration is edited in ConfigWizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2566 +#: src/slic3r/GUI/ConfigWizard.cpp:3000 msgid "All user presets will be deleted." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2596 +#: src/slic3r/GUI/ConfigWizard.cpp:3037 msgid "A new vendor was installed and one of its printers will be activated" msgid_plural "" "New vendors were installed and one of theirs printers will be activated" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/ConfigWizard.cpp:2625 +#: src/slic3r/GUI/ConfigWizard.cpp:3069 msgid "Do you want to continue changing the configuration?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2691 +#: src/slic3r/GUI/ConfigWizard.cpp:3136 msgid "A new Printer was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2696 +#: src/slic3r/GUI/ConfigWizard.cpp:3141 msgid "Some Printers were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2717 +#: src/slic3r/GUI/ConfigWizard.cpp:3162 msgid "A new filament was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2718 +#: src/slic3r/GUI/ConfigWizard.cpp:3163 msgid "A new SLA material was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some filaments were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some SLA materials were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2773 +#: src/slic3r/GUI/ConfigWizard.cpp:3218 msgid "Custom printer was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2858 +#: src/slic3r/GUI/ConfigWizard.cpp:3306 msgid "Select all standard printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2861 +#: src/slic3r/GUI/ConfigWizard.cpp:3309 msgid "< &Back" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2862 +#: src/slic3r/GUI/ConfigWizard.cpp:3310 msgid "&Next >" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2863 +#: src/slic3r/GUI/ConfigWizard.cpp:3311 msgid "&Finish" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2864 -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:3312 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:657 +#: src/slic3r/GUI/FileArchiveDialog.cpp:274 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 #: src/slic3r/GUI/FirmwareDialog.cpp:153 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1593 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1365 #: src/slic3r/GUI/ProgressStatusBar.cpp:26 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:93 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:879 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:96 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:907 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1606 msgid "Cancel" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2884 +#: src/slic3r/GUI/ConfigWizard.cpp:3332 msgid "Prusa FFF Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2892 +#: src/slic3r/GUI/ConfigWizard.cpp:3340 msgid "Prusa MSLA Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filament Profiles Selection" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 src/slic3r/GUI/ConfigWizard.cpp:2915 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 src/slic3r/GUI/ConfigWizard.cpp:3363 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Type:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Material Profiles Selection" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:3036 +#: src/slic3r/GUI/ConfigWizard.cpp:3486 msgid "Configuration Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:3037 +#: src/slic3r/GUI/ConfigWizard.cpp:3487 msgid "Configuration &Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:3039 +#: src/slic3r/GUI/ConfigWizard.cpp:3489 msgid "Configuration Wizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:3040 +#: src/slic3r/GUI/ConfigWizard.cpp:3490 msgid "Configuration &Wizard" msgstr "" @@ -1126,37 +1293,54 @@ msgstr "" msgid "Performing desktop integration failed - Could not find executable." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:378 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:383 msgid "" "Performing desktop integration failed because the application directory was " "not found." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:419 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:423 msgid "" "Performing desktop integration failed - could not create Gcodeviewer desktop " "file. PrusaSlicer desktop file was probably created successfully." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:459 -#: src/slic3r/GUI/GUI_App.cpp:2245 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:472 +msgid "" +"Performing downloader desktop integration failed - boost::filesystem::" +"canonical did not return appimage path." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:484 +msgid "" +"Performing downloader desktop integration failed - Could not find executable." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:602 +msgid "" +"Performing downloader desktop integration failed because the application " +"directory was not found." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:626 +#: src/slic3r/GUI/GUI_App.cpp:2407 msgid "Desktop Integration" msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:466 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:633 msgid "" "Desktop Integration sets this binary to be searchable by the system.\n" "\n" "Press \"Perform\" to proceed." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:480 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:647 msgid "Perform" msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1342 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:653 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/KBShortcutsDialog.cpp:106 +#: src/slic3r/GUI/MainFrame.cpp:1426 msgid "Undo" msgstr "" @@ -1164,19 +1348,19 @@ msgstr "" msgid "Place bearings in slots and resume printing" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1379 +#: src/slic3r/GUI/DoubleSlider.cpp:1448 msgid "One layer mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1381 +#: src/slic3r/GUI/DoubleSlider.cpp:1450 msgid "Discard all custom changes" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1385 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:1454 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to move" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1388 +#: src/slic3r/GUI/DoubleSlider.cpp:1457 #, possible-c-format, possible-boost-format msgid "" "Jump to height %s\n" @@ -1184,58 +1368,58 @@ msgid "" "or Set extruder sequence for the entire print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1391 +#: src/slic3r/GUI/DoubleSlider.cpp:1460 #, possible-c-format, possible-boost-format msgid "" "Jump to height %s\n" "or Set ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1396 +#: src/slic3r/GUI/DoubleSlider.cpp:1465 msgid "Edit current color - Right click the colored slider segment" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1398 +#: src/slic3r/GUI/DoubleSlider.cpp:1467 msgid "This is wipe tower layer" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1408 +#: src/slic3r/GUI/DoubleSlider.cpp:1477 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing sequentually." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1412 +#: src/slic3r/GUI/DoubleSlider.cpp:1481 msgid "Print mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1426 +#: src/slic3r/GUI/DoubleSlider.cpp:1495 msgid "Add extruder change - Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1428 +#: src/slic3r/GUI/DoubleSlider.cpp:1497 msgid "" "Add color change - Left click for predefined color or Shift + Left click for " "custom color selection" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1430 +#: src/slic3r/GUI/DoubleSlider.cpp:1499 msgid "Add color change - Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1431 +#: src/slic3r/GUI/DoubleSlider.cpp:1500 msgid "or press \"+\" key" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1433 +#: src/slic3r/GUI/DoubleSlider.cpp:1502 msgid "Add another code - Ctrl + Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1434 +#: src/slic3r/GUI/DoubleSlider.cpp:1503 msgid "Add another code - Right click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1440 +#: src/slic3r/GUI/DoubleSlider.cpp:1509 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing " @@ -1243,289 +1427,305 @@ msgid "" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1458 +#: src/slic3r/GUI/DoubleSlider.cpp:1527 msgid "continue" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1466 +#: src/slic3r/GUI/DoubleSlider.cpp:1535 #, possible-boost-format msgid "Color change (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1467 +#: src/slic3r/GUI/DoubleSlider.cpp:1536 #, possible-boost-format msgid "Color change (\"%1%\") for Extruder %2%" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1469 +#: src/slic3r/GUI/DoubleSlider.cpp:1538 #, possible-boost-format msgid "Pause print (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1471 +#: src/slic3r/GUI/DoubleSlider.cpp:1540 #, possible-boost-format msgid "Custom template (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1473 +#: src/slic3r/GUI/DoubleSlider.cpp:1542 #, possible-boost-format msgid "Extruder (tool) is changed to Extruder \"%1%\"" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1480 +#: src/slic3r/GUI/DoubleSlider.cpp:1549 msgid "Note" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1482 +#: src/slic3r/GUI/DoubleSlider.cpp:1551 msgid "" "G-code associated to this tick mark is in a conflict with print mode.\n" "Editing it will cause changes of Slider data." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1485 +#: src/slic3r/GUI/DoubleSlider.cpp:1554 msgid "" "There is a color change for extruder that won't be used till the end of " "print job.\n" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1488 +#: src/slic3r/GUI/DoubleSlider.cpp:1557 msgid "" "There is an extruder change set to the same extruder.\n" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1491 +#: src/slic3r/GUI/DoubleSlider.cpp:1560 msgid "" "There is a color change for extruder that has not been used before.\n" "Check your settings to avoid redundant color changes." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1496 +#: src/slic3r/GUI/DoubleSlider.cpp:1565 msgid "Delete tick mark - Left click or press \"-\" key" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1498 +#: src/slic3r/GUI/DoubleSlider.cpp:1567 msgid "Edit tick mark - Ctrl + Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1499 +#: src/slic3r/GUI/DoubleSlider.cpp:1568 msgid "Edit tick mark - Right click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1602 src/slic3r/GUI/DoubleSlider.cpp:1633 -#: src/slic3r/GUI/GUI_Factories.cpp:778 +#: src/slic3r/GUI/DoubleSlider.cpp:1671 src/slic3r/GUI/DoubleSlider.cpp:1702 +#: src/slic3r/GUI/GUI_Factories.cpp:862 #, possible-c-format, possible-boost-format msgid "Extruder %d" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1603 src/slic3r/GUI/GUI_Factories.cpp:779 +#: src/slic3r/GUI/DoubleSlider.cpp:1672 src/slic3r/GUI/GUI_Factories.cpp:863 msgid "active" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 msgid "Switch code to Change extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Change extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1613 +#: src/slic3r/GUI/DoubleSlider.cpp:1682 msgid "Change extruder (N/A)" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1615 src/slic3r/GUI/GUI_Factories.cpp:787 +#: src/slic3r/GUI/DoubleSlider.cpp:1684 src/slic3r/GUI/GUI_Factories.cpp:871 msgid "Use another extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1634 +#: src/slic3r/GUI/DoubleSlider.cpp:1703 msgid "used" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1642 +#: src/slic3r/GUI/DoubleSlider.cpp:1711 #, possible-boost-format msgid "Switch code to Color change (%1%) for:" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1643 +#: src/slic3r/GUI/DoubleSlider.cpp:1712 #, possible-boost-format msgid "Add color change (%1%) for:" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1968 +#: src/slic3r/GUI/DoubleSlider.cpp:2037 msgid "Add color change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1979 +#: src/slic3r/GUI/DoubleSlider.cpp:2048 msgid "Add pause print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1983 +#: src/slic3r/GUI/DoubleSlider.cpp:2052 msgid "Add custom template" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1986 +#: src/slic3r/GUI/DoubleSlider.cpp:2055 msgid "Add custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2004 +#: src/slic3r/GUI/DoubleSlider.cpp:2073 msgid "Edit color" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2005 +#: src/slic3r/GUI/DoubleSlider.cpp:2074 msgid "Edit pause print message" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2006 +#: src/slic3r/GUI/DoubleSlider.cpp:2075 msgid "Edit custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2012 +#: src/slic3r/GUI/DoubleSlider.cpp:2081 msgid "Delete color change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2013 +#: src/slic3r/GUI/DoubleSlider.cpp:2082 msgid "Delete tool change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2014 +#: src/slic3r/GUI/DoubleSlider.cpp:2083 msgid "Delete pause print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2015 +#: src/slic3r/GUI/DoubleSlider.cpp:2084 msgid "Delete custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2025 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:2094 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to height" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2030 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 msgid "Hide ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height on the ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time on the ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Set ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2047 +#: src/slic3r/GUI/DoubleSlider.cpp:2116 msgid "Set extruder sequence for the entire print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2051 +#: src/slic3r/GUI/DoubleSlider.cpp:2120 msgid "Set auto color changes" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2086 +#: src/slic3r/GUI/DoubleSlider.cpp:2155 msgid "This action will cause deletion of all ticks on vertical slider." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2087 src/slic3r/GUI/Tab.cpp:1318 +#: src/slic3r/GUI/DoubleSlider.cpp:2156 src/slic3r/GUI/Tab.cpp:1263 msgid "" "This action is not revertible.\n" "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2088 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1133 src/slic3r/GUI/GUI.cpp:245 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:649 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:679 -#: src/slic3r/GUI/WipeTowerDialog.cpp:58 src/slic3r/GUI/WipeTowerDialog.cpp:443 +#: src/slic3r/GUI/DoubleSlider.cpp:2157 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:537 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1119 src/slic3r/GUI/GUI.cpp:258 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:721 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:751 +#: src/slic3r/GUI/WipeTowerDialog.cpp:60 src/slic3r/GUI/WipeTowerDialog.cpp:445 msgid "Warning" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2216 +#: src/slic3r/GUI/DoubleSlider.cpp:2285 msgid "Enter custom G-code used on current layer" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2217 +#: src/slic3r/GUI/DoubleSlider.cpp:2286 #, possible-boost-format msgid "Custom G-code on current layer (%1% mm)." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2238 +#: src/slic3r/GUI/DoubleSlider.cpp:2307 msgid "Enter short message shown on Printer display when a print is paused" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2239 +#: src/slic3r/GUI/DoubleSlider.cpp:2308 #, possible-boost-format msgid "Message for pause print on current layer (%1% mm)." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the move you want to jump to" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the height you want to jump to" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2515 +#: src/slic3r/GUI/DoubleSlider.cpp:2584 msgid "The last color change data was saved for a single extruder printing." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2516 src/slic3r/GUI/DoubleSlider.cpp:2532 +#: src/slic3r/GUI/DoubleSlider.cpp:2585 src/slic3r/GUI/DoubleSlider.cpp:2601 msgid "The last color change data was saved for a multi extruder printing." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2518 +#: src/slic3r/GUI/DoubleSlider.cpp:2587 msgid "Your current changes will delete all saved color changes." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2519 src/slic3r/GUI/DoubleSlider.cpp:2540 +#: src/slic3r/GUI/DoubleSlider.cpp:2588 src/slic3r/GUI/DoubleSlider.cpp:2609 msgid "Are you sure you want to continue?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2533 +#: src/slic3r/GUI/DoubleSlider.cpp:2602 msgid "" "Select YES if you want to delete all saved tool changes, \n" "NO if you want all tool changes switch to color changes, \n" "or CANCEL to leave it unchanged." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2536 +#: src/slic3r/GUI/DoubleSlider.cpp:2605 msgid "Do you want to delete all saved tool changes?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2538 +#: src/slic3r/GUI/DoubleSlider.cpp:2607 msgid "" "The last color change data was saved for a multi extruder printing with tool " "changes for whole print." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2539 +#: src/slic3r/GUI/DoubleSlider.cpp:2608 msgid "Your current changes will delete all saved extruder (tool) changes." msgstr "" -#: src/slic3r/GUI/ExtraRenderers.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:538 -#: src/slic3r/GUI/GUI_ObjectList.cpp:550 src/slic3r/GUI/GUI_ObjectList.cpp:979 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4291 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:250 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:352 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:376 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:607 src/libslic3r/PrintConfig.cpp:800 +#: src/slic3r/GUI/Downloader.cpp:150 +#, possible-boost-format +msgid "" +"Download won't start. Download URL doesn't point to https://files.printables." +"com : %1%" +msgstr "" + +#: src/slic3r/GUI/Downloader.cpp:181 +msgid "The download has failed:" +msgstr "" + +#: src/slic3r/GUI/DownloaderFileGet.cpp:193 +#, possible-boost-format +msgid "Can't create file at %1%." +msgstr "" + +#: src/slic3r/GUI/ExtraRenderers.cpp:323 src/slic3r/GUI/GUI_ObjectList.cpp:571 +#: src/slic3r/GUI/GUI_ObjectList.cpp:583 src/slic3r/GUI/GUI_ObjectList.cpp:1043 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2125 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3013 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4884 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:259 src/libslic3r/PrintConfig.cpp:894 msgid "default" msgstr "" @@ -1538,10 +1738,10 @@ msgid "Set extruder change for every" msgstr "" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:60 -#: src/libslic3r/PrintConfig.cpp:662 src/libslic3r/PrintConfig.cpp:1430 -#: src/libslic3r/PrintConfig.cpp:2135 src/libslic3r/PrintConfig.cpp:2310 -#: src/libslic3r/PrintConfig.cpp:2386 src/libslic3r/PrintConfig.cpp:2639 -#: src/libslic3r/PrintConfig.cpp:2687 src/libslic3r/PrintConfig.cpp:2706 +#: src/libslic3r/PrintConfig.cpp:765 src/libslic3r/PrintConfig.cpp:1476 +#: src/libslic3r/PrintConfig.cpp:2165 src/libslic3r/PrintConfig.cpp:2343 +#: src/libslic3r/PrintConfig.cpp:2417 src/libslic3r/PrintConfig.cpp:2665 +#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2728 msgid "layers" msgstr "" @@ -1573,42 +1773,42 @@ msgstr "" msgid "Add extruder to sequence" msgstr "" -#: src/slic3r/GUI/Field.cpp:190 +#: src/slic3r/GUI/Field.cpp:188 msgid "default value" msgstr "" -#: src/slic3r/GUI/Field.cpp:193 +#: src/slic3r/GUI/Field.cpp:191 msgid "parameter name" msgstr "" -#: src/slic3r/GUI/Field.cpp:204 src/slic3r/GUI/OptionsGroup.cpp:827 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1067 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1079 +#: src/slic3r/GUI/Field.cpp:206 src/slic3r/GUI/OptionsGroup.cpp:852 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1074 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1086 msgid "N/A" msgstr "" -#: src/slic3r/GUI/Field.cpp:226 src/slic3r/GUI/Field.cpp:298 +#: src/slic3r/GUI/Field.cpp:229 src/slic3r/GUI/Field.cpp:302 #, possible-c-format, possible-boost-format msgid "%s doesn't support percentage" msgstr "" -#: src/slic3r/GUI/Field.cpp:266 +#: src/slic3r/GUI/Field.cpp:269 #, possible-c-format, possible-boost-format msgid "" "Input value is out of range\n" "Are you sure that %s is a correct value and that you want to continue?" msgstr "" -#: src/slic3r/GUI/Field.cpp:269 src/slic3r/GUI/Field.cpp:343 +#: src/slic3r/GUI/Field.cpp:272 src/slic3r/GUI/Field.cpp:347 msgid "Parameter validation" msgstr "" -#: src/slic3r/GUI/Field.cpp:282 src/slic3r/GUI/Field.cpp:390 -#: src/slic3r/GUI/Field.cpp:1573 +#: src/slic3r/GUI/Field.cpp:285 src/slic3r/GUI/Field.cpp:394 +#: src/slic3r/GUI/Field.cpp:1597 msgid "Input value is out of range" msgstr "" -#: src/slic3r/GUI/Field.cpp:340 +#: src/slic3r/GUI/Field.cpp:344 #, possible-c-format, possible-boost-format msgid "" "Do you mean %s%% instead of %s %s?\n" @@ -1616,13 +1816,22 @@ msgid "" "or NO if you are sure that %s %s is a correct value." msgstr "" -#: src/slic3r/GUI/Field.cpp:397 +#: src/slic3r/GUI/Field.cpp:401 #, possible-boost-format msgid "" "Invalid input format. Expected vector of dimensions in the following format: " "\"%1%\"" msgstr "" +#: src/slic3r/GUI/FileArchiveDialog.cpp:170 +msgid "Archive preview" +msgstr "" + +#: src/slic3r/GUI/FileArchiveDialog.cpp:270 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +msgid "Open" +msgstr "" + #: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flash!" msgstr "" @@ -1699,12 +1908,6 @@ msgstr "" msgid "Select a file" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:815 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:297 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:372 -msgid "Browse" -msgstr "" - #: src/slic3r/GUI/FirmwareDialog.cpp:817 msgid "Serial port:" msgstr "" @@ -1734,10 +1937,10 @@ msgid "Advanced: Output log" msgstr "" #: src/slic3r/GUI/FirmwareDialog.cpp:862 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:310 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:358 #: src/slic3r/GUI/Mouse3DController.cpp:543 -#: src/slic3r/GUI/PrintHostDialogs.cpp:261 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:122 +#: src/slic3r/GUI/PrintHostDialogs.cpp:313 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:125 msgid "Close" msgstr "" @@ -1755,7 +1958,7 @@ msgstr "" msgid "Cancelling..." msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1488 msgid "Shape Gallery" msgstr "" @@ -1763,904 +1966,1908 @@ msgstr "" msgid "Select shape from the gallery" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:100 -msgid "Add to bed" -msgstr "" - -#: src/slic3r/GUI/GalleryDialog.cpp:101 -msgid "Add selected shape(s) to the bed" -msgstr "" - -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4152 +#: src/slic3r/GUI/GalleryDialog.cpp:114 src/slic3r/GUI/Tab.cpp:4377 msgid "Add" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:117 +#: src/slic3r/GUI/GalleryDialog.cpp:114 msgid "Add one or more custom shapes" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:506 -#: src/slic3r/GUI/GLCanvas3D.cpp:4547 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/GalleryDialog.cpp:115 src/slic3r/GUI/GalleryDialog.cpp:528 +#: src/slic3r/GUI/GLCanvas3D.cpp:4638 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/GUI_Factories.cpp:460 src/slic3r/GUI/Tab.cpp:3973 msgid "Delete" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:118 +#: src/slic3r/GUI/GalleryDialog.cpp:115 msgid "Delete one or more custom shape. You can't delete system shapes" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:400 +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "Add to bed" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "OK" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:143 +msgid "Add selected shape(s) to the bed" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:422 msgid "Choose one or more files (STL, OBJ):" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:440 +#: src/slic3r/GUI/GalleryDialog.cpp:462 #, possible-boost-format msgid "" "It looks like selected %1%-file has an error or is destructed.\n" "We can't load this file" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:451 +#: src/slic3r/GUI/GalleryDialog.cpp:473 msgid "Choose one PNG file:" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:464 +#: src/slic3r/GUI/GalleryDialog.cpp:486 msgid "Replacing of the PNG" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:508 +#: src/slic3r/GUI/GalleryDialog.cpp:530 msgid "Change thumbnail" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:549 src/slic3r/GUI/GalleryDialog.cpp:554 +#: src/slic3r/GUI/GalleryDialog.cpp:571 src/slic3r/GUI/GalleryDialog.cpp:576 #, possible-boost-format msgid "Loading of the \"%1%\"" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:274 +#: src/slic3r/GUI/GCodeViewer.cpp:343 msgid "Tool position" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1457 +#: src/slic3r/GUI/GCodeViewer.cpp:1547 msgid "Generating toolpaths" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1517 +#: src/slic3r/GUI/GCodeViewer.cpp:1619 msgid "Generating vertex buffer" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1857 +#: src/slic3r/GUI/GCodeViewer.cpp:1979 msgid "Generating index buffers" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to hide" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to show" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3181 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 msgid "up to" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3187 +#: src/slic3r/GUI/GCodeViewer.cpp:3455 msgid "above" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "from" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "to" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3245 src/slic3r/GUI/GCodeViewer.cpp:3246 -#: src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3513 src/slic3r/GUI/GCodeViewer.cpp:3514 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 msgid "Percentage" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3570 msgid "Feature type" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3592 #: src/slic3r/GUI/RammingChart.cpp:90 msgid "Time" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3295 src/slic3r/GUI/GCodeViewer.cpp:3306 -#: src/slic3r/GUI/GCodeViewer.cpp:3566 -msgid "Used filament" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3298 +#: src/slic3r/GUI/GCodeViewer.cpp:3571 msgid "Height (mm)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3299 +#: src/slic3r/GUI/GCodeViewer.cpp:3572 msgid "Width (mm)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3300 +#: src/slic3r/GUI/GCodeViewer.cpp:3573 msgid "Speed (mm/s)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3301 -msgid "Fan Speed (%)" +#: src/slic3r/GUI/GCodeViewer.cpp:3574 +msgid "Fan speed (%)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3302 +#: src/slic3r/GUI/GCodeViewer.cpp:3575 msgid "Temperature (°C)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3303 +#: src/slic3r/GUI/GCodeViewer.cpp:3576 msgid "Volumetric flow rate (mm³/s)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3306 src/slic3r/GUI/GUI_Preview.cpp:224 -#: src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3577 +msgid "Layer time (linear)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3578 +msgid "Layer time (logarithmic)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3579 msgid "Tool" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3309 src/slic3r/GUI/GUI_Preview.cpp:225 -#: src/slic3r/GUI/GUI_Preview.cpp:957 +#: src/slic3r/GUI/GCodeViewer.cpp:3580 msgid "Color Print" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3347 src/slic3r/GUI/GCodeViewer.cpp:3393 -#: src/slic3r/GUI/GCodeViewer.cpp:3398 src/slic3r/GUI/GUI_ObjectList.cpp:312 -#: src/slic3r/GUI/wxExtensions.cpp:536 src/libslic3r/PrintConfig.cpp:795 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 src/slic3r/GUI/GCodeViewer.cpp:3594 +#: src/slic3r/GUI/GCodeViewer.cpp:3860 +msgid "Used filament" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3623 src/slic3r/GUI/GCodeViewer.cpp:4067 +#: src/libslic3r/PrintConfig.cpp:3025 +msgid "Travel" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3640 src/slic3r/GUI/GCodeViewer.cpp:3685 +#: src/slic3r/GUI/GCodeViewer.cpp:3689 src/slic3r/GUI/GUI_ObjectList.cpp:338 +#: src/slic3r/GUI/wxExtensions.cpp:547 src/libslic3r/PrintConfig.cpp:888 msgid "Extruder" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3370 +#: src/slic3r/GUI/GCodeViewer.cpp:3662 msgid "Default color" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3393 +#: src/slic3r/GUI/GCodeViewer.cpp:3685 msgid "default color" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3491 src/slic3r/GUI/GCodeViewer.cpp:3547 +#: src/slic3r/GUI/GCodeViewer.cpp:3785 src/slic3r/GUI/GCodeViewer.cpp:3841 msgid "Color change" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3510 src/slic3r/GUI/GCodeViewer.cpp:3545 +#: src/slic3r/GUI/GCodeViewer.cpp:3804 src/slic3r/GUI/GCodeViewer.cpp:3839 msgid "Print" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3546 src/slic3r/GUI/GCodeViewer.cpp:3580 +#: src/slic3r/GUI/GCodeViewer.cpp:3840 src/slic3r/GUI/GCodeViewer.cpp:3874 msgid "Pause" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Event" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Remaining time" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Duration" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3609 src/slic3r/GUI/GUI_Preview.cpp:1049 -#: src/libslic3r/PrintConfig.cpp:2937 -msgid "Travel" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3612 -msgid "Movement" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3613 -msgid "Extrusion" +#: src/slic3r/GUI/GCodeViewer.cpp:3928 src/slic3r/GUI/GUI.cpp:332 +#: src/slic3r/GUI/Plater.cpp:852 src/libslic3r/PrintConfig.cpp:335 +msgid "Printer" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1870 -#: src/slic3r/GUI/Tab.cpp:2812 -msgid "Retraction" +#: src/slic3r/GUI/GCodeViewer.cpp:3931 src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/Plater.cpp:848 +msgid "Print settings" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3631 src/slic3r/GUI/GCodeViewer.cpp:3634 -#: src/slic3r/GUI/GUI_Preview.cpp:1050 -msgid "Wipe" +#: src/slic3r/GUI/GCodeViewer.cpp:3936 src/slic3r/GUI/GUI.cpp:330 +#: src/slic3r/GUI/Plater.cpp:849 src/slic3r/GUI/Tab.cpp:1930 +#: src/slic3r/GUI/Tab.cpp:1931 +msgid "Filament" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3666 src/slic3r/GUI/GUI_Preview.cpp:257 -#: src/slic3r/GUI/GUI_Preview.cpp:272 -msgid "Options" +#: src/slic3r/GUI/GCodeViewer.cpp:3950 +msgid "Estimated printing times" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3669 src/slic3r/GUI/GUI_Preview.cpp:1051 -msgid "Retractions" +#: src/slic3r/GUI/GCodeViewer.cpp:3969 +msgid "Normal mode" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3670 src/slic3r/GUI/GUI_Preview.cpp:1052 -msgid "Deretractions" +#: src/slic3r/GUI/GCodeViewer.cpp:3970 +msgid "Stealth mode" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3671 src/slic3r/GUI/GUI_Preview.cpp:1053 -msgid "Seams" +#: src/slic3r/GUI/GCodeViewer.cpp:3979 src/libslic3r/PrintConfig.cpp:1249 +#: src/libslic3r/PrintConfig.cpp:1267 src/libslic3r/PrintConfig.cpp:1277 +#: src/libslic3r/PrintConfig.cpp:1322 +msgid "First layer" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3672 src/slic3r/GUI/GUI_Preview.cpp:1054 -msgid "Tool changes" +#: src/slic3r/GUI/GCodeViewer.cpp:3983 +msgid "Total" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3673 src/slic3r/GUI/GUI_Preview.cpp:1055 -msgid "Color changes" +#: src/slic3r/GUI/GCodeViewer.cpp:4002 +msgid "Show stealth mode" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3674 src/slic3r/GUI/GUI_Preview.cpp:1056 -msgid "Print pauses" +#: src/slic3r/GUI/GCodeViewer.cpp:4006 +msgid "Show normal mode" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3675 src/slic3r/GUI/GUI_Preview.cpp:1057 -msgid "Custom G-codes" +#: src/slic3r/GUI/GCodeViewer.cpp:4071 +msgid "Wipe" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3695 src/slic3r/GUI/GCodeViewer.cpp:3714 -#: src/slic3r/GUI/GUI.cpp:341 src/slic3r/GUI/Plater.cpp:822 -#: src/libslic3r/PrintConfig.cpp:322 -msgid "Printer" +#: src/slic3r/GUI/GCodeViewer.cpp:4075 +msgid "Retractions" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3697 src/slic3r/GUI/GCodeViewer.cpp:3719 -#: src/slic3r/GUI/GUI.cpp:337 src/slic3r/GUI/Plater.cpp:818 -msgid "Print settings" +#: src/slic3r/GUI/GCodeViewer.cpp:4079 +msgid "Deretractions" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 -#: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1970 src/slic3r/GUI/Tab.cpp:1971 -msgid "Filament" +#: src/slic3r/GUI/GCodeViewer.cpp:4083 +msgid "Seams" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3739 -msgid "Estimated printing times" +#: src/slic3r/GUI/GCodeViewer.cpp:4087 +msgid "Tool changes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3758 -msgid "Normal mode" +#: src/slic3r/GUI/GCodeViewer.cpp:4091 +msgid "Color changes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3759 -msgid "Stealth mode" +#: src/slic3r/GUI/GCodeViewer.cpp:4095 +msgid "Print pauses" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3766 src/libslic3r/PrintConfig.cpp:1189 -#: src/libslic3r/PrintConfig.cpp:1207 src/libslic3r/PrintConfig.cpp:1217 -#: src/libslic3r/PrintConfig.cpp:1262 -msgid "First layer" +#: src/slic3r/GUI/GCodeViewer.cpp:4099 +msgid "Custom G-codes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3767 -msgid "Total" +#: src/slic3r/GUI/GCodeViewer.cpp:4103 +msgid "Center of gravity" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3796 -msgid "Show stealth mode" +#: src/slic3r/GUI/GCodeViewer.cpp:4108 +msgid "Shells" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3800 -msgid "Show normal mode" +#: src/slic3r/GUI/GCodeViewer.cpp:4113 +msgid "Tool marker" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:225 src/slic3r/GUI/GLCanvas3D.cpp:4694 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:53 +#: src/slic3r/GUI/GLCanvas3D.cpp:185 src/slic3r/GUI/GLCanvas3D.cpp:4784 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:71 msgid "Variable layer height" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:227 +#: src/slic3r/GUI/GLCanvas3D.cpp:187 msgid "Left mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:229 +#: src/slic3r/GUI/GLCanvas3D.cpp:189 msgid "Add detail" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:231 +#: src/slic3r/GUI/GLCanvas3D.cpp:191 msgid "Right mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:233 +#: src/slic3r/GUI/GLCanvas3D.cpp:193 msgid "Remove detail" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:235 +#: src/slic3r/GUI/GLCanvas3D.cpp:195 msgid "Shift + Left mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:237 +#: src/slic3r/GUI/GLCanvas3D.cpp:197 msgid "Reset to base" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:239 +#: src/slic3r/GUI/GLCanvas3D.cpp:199 msgid "Shift + Right mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:241 +#: src/slic3r/GUI/GLCanvas3D.cpp:201 msgid "Smoothing" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:243 +#: src/slic3r/GUI/GLCanvas3D.cpp:203 msgid "Mouse wheel:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:245 +#: src/slic3r/GUI/GLCanvas3D.cpp:205 msgid "Increase/decrease edit area" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:248 +#: src/slic3r/GUI/GLCanvas3D.cpp:208 msgid "Adaptive" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:254 +#: src/slic3r/GUI/GLCanvas3D.cpp:214 msgid "Quality / Speed" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:257 +#: src/slic3r/GUI/GLCanvas3D.cpp:217 msgid "Higher print quality versus higher print speed." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:268 +#: src/slic3r/GUI/GLCanvas3D.cpp:228 msgid "Smooth" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:274 src/libslic3r/PrintConfig.cpp:819 +#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/libslic3r/PrintConfig.cpp:908 msgid "Radius" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:286 +#: src/slic3r/GUI/GLCanvas3D.cpp:246 msgid "Keep min" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:295 src/slic3r/GUI/GLCanvas3D.cpp:4123 +#: src/slic3r/GUI/GLCanvas3D.cpp:255 src/slic3r/GUI/GLCanvas3D.cpp:4217 msgid "Reset" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:561 +#: src/slic3r/GUI/GLCanvas3D.cpp:602 msgid "Variable layer height - Manual edit" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:676 +#: src/slic3r/GUI/GLCanvas3D.cpp:717 msgid "Seq." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1310 +#: src/slic3r/GUI/GLCanvas3D.cpp:1319 msgid "Variable layer height - Reset" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1318 +#: src/slic3r/GUI/GLCanvas3D.cpp:1327 msgid "Variable layer height - Adaptive" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1326 +#: src/slic3r/GUI/GLCanvas3D.cpp:1335 msgid "Variable layer height - Smooth all" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1733 +#: src/slic3r/GUI/GLCanvas3D.cpp:1778 msgid "Mirror Object" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:2612 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:560 +#: src/slic3r/GUI/GLCanvas3D.cpp:2542 src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:117 msgid "Gizmo-Move" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:2695 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562 +#: src/slic3r/GUI/GLCanvas3D.cpp:2638 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:661 msgid "Gizmo-Rotate" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3300 +#: src/slic3r/GUI/GLCanvas3D.cpp:3263 msgid "Move Object" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3821 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3513 +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:40 +msgid "Gizmo-Place on Face" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3904 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Switch to Settings" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3822 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3905 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Print Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Filament Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Material Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3824 src/slic3r/GUI/GLCanvas3D.cpp:4657 +#: src/slic3r/GUI/GLCanvas3D.cpp:3907 src/slic3r/GUI/GLCanvas3D.cpp:4746 msgid "Printer Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Undo History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Redo History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, possible-c-format, possible-boost-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, possible-c-format, possible-boost-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4011 src/slic3r/GUI/GLCanvas3D.cpp:4673 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 src/slic3r/GUI/Search.cpp:426 +#: src/slic3r/GUI/GLCanvas3D.cpp:4106 src/slic3r/GUI/GLCanvas3D.cpp:4762 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/Search.cpp:482 msgid "Search" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4025 src/slic3r/GUI/GLCanvas3D.cpp:4033 -#: src/slic3r/GUI/Search.cpp:432 +#: src/slic3r/GUI/GLCanvas3D.cpp:4120 src/slic3r/GUI/GLCanvas3D.cpp:4128 +#: src/slic3r/GUI/Search.cpp:488 msgid "Enter a search term" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4064 +#: src/slic3r/GUI/GLCanvas3D.cpp:4160 msgid "Arrange options" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4097 +#: src/slic3r/GUI/GLCanvas3D.cpp:4193 #, possible-boost-format msgid "Press %1%left mouse button to enter the exact value" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4099 +#: src/slic3r/GUI/GLCanvas3D.cpp:4195 msgid "Spacing" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4106 -msgid "Enable rotations (slow)" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Alignment" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:4500 -msgid "Center" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear left" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front left" +#: src/slic3r/GUI/GLCanvas3D.cpp:4202 +msgid "Spacing from bed" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front right" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear right" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:2271 -msgid "Random" +#: src/slic3r/GUI/GLCanvas3D.cpp:4209 +msgid "Enable rotations (slow)" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4133 src/slic3r/GUI/GLCanvas3D.cpp:4565 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Plater.cpp:1664 +#: src/slic3r/GUI/GLCanvas3D.cpp:4228 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 src/slic3r/GUI/Plater.cpp:7118 msgid "Arrange" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4539 +#: src/slic3r/GUI/GLCanvas3D.cpp:4630 msgid "Add..." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4556 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5509 src/slic3r/GUI/Tab.cpp:4158 +#: src/slic3r/GUI/GLCanvas3D.cpp:4647 src/slic3r/GUI/KBShortcutsDialog.cpp:105 +#: src/slic3r/GUI/Plater.cpp:6047 src/slic3r/GUI/Tab.cpp:4383 msgid "Delete all" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 src/slic3r/GUI/KBShortcutsDialog.cpp:133 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 src/slic3r/GUI/KBShortcutsDialog.cpp:142 msgid "Arrange selection" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 msgid "Click right mouse button to show arrangement options" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4587 +#: src/slic3r/GUI/GLCanvas3D.cpp:4676 msgid "Copy" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4596 +#: src/slic3r/GUI/GLCanvas3D.cpp:4685 msgid "Paste" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4608 src/slic3r/GUI/GUI_Factories.cpp:1084 -#: src/slic3r/GUI/GUI_Factories.cpp:1108 src/slic3r/GUI/GUI_Factories.cpp:1119 +#: src/slic3r/GUI/GLCanvas3D.cpp:4697 src/slic3r/GUI/GUI_Factories.cpp:1237 +#: src/slic3r/GUI/GUI_Factories.cpp:1261 src/slic3r/GUI/GUI_Factories.cpp:1272 msgid "Add instance" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4619 src/slic3r/GUI/GUI_Factories.cpp:1087 +#: src/slic3r/GUI/GLCanvas3D.cpp:4708 src/slic3r/GUI/GUI_Factories.cpp:1240 msgid "Remove instance" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4632 +#: src/slic3r/GUI/GLCanvas3D.cpp:4721 msgid "Split to objects" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4642 +#: src/slic3r/GUI/GLCanvas3D.cpp:4731 msgid "Split to parts" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/GLCanvas3D.cpp:4795 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/GLCanvas3D.cpp:4874 msgid "Click right mouse button to open/close History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4779 +#: src/slic3r/GUI/GLCanvas3D.cpp:4859 #, possible-boost-format msgid "Next Undo action: %1%" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4795 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/GLCanvas3D.cpp:4874 src/slic3r/GUI/KBShortcutsDialog.cpp:107 +#: src/slic3r/GUI/MainFrame.cpp:1429 msgid "Redo" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4817 +#: src/slic3r/GUI/GLCanvas3D.cpp:4895 #, possible-boost-format msgid "Next Redo action: %1%" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6434 +#: src/slic3r/GUI/GLCanvas3D.cpp:6784 msgid "An object outside the print area was detected." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6435 +#: src/slic3r/GUI/GLCanvas3D.cpp:6785 msgid "A toolpath outside the print area was detected." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6436 +#: src/slic3r/GUI/GLCanvas3D.cpp:6786 msgid "SLA supports outside the print area were detected." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6437 +#: src/slic3r/GUI/GLCanvas3D.cpp:6787 msgid "Some objects are not visible during editing." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6439 +#: src/slic3r/GUI/GLCanvas3D.cpp:6789 msgid "" "An object outside the print area was detected.\n" "Resolve the current problem to continue slicing." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6513 +#: src/slic3r/GUI/GLCanvas3D.cpp:6864 msgid "Selection-Add from rectangle" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6528 +#: src/slic3r/GUI/GLCanvas3D.cpp:6879 msgid "Selection-Remove from rectangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4478 -msgid "Cut" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:206 +msgid "Planar" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -msgid "in" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Auto" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 -msgid "Keep upper part" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Manual" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 -msgid "Keep lower part" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:213 +msgid "Plug" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:196 -msgid "Rotate lower part upwards" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:214 +msgid "Dowel" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:201 -msgid "Perform cut" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Prism" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:49 -msgid "Paint-on supports" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Frustum" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 -msgid "Clipping of view" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Triangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Square" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Hexagon" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:59 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 +msgid "Circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:233 +msgid "Keep orientation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:234 +msgid "Place on cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:235 +msgid "Flip upside down" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +msgid "inch" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 +msgid "Part" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 src/libslic3r/Print.cpp:1236 +msgid "Object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:264 +msgid "" +"Click to flip the cut plane\n" +"Drag to move the cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:269 src/libslic3r/PrintConfig.cpp:498 +#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2325 src/libslic3r/PrintConfig.cpp:2613 +#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2876 src/libslic3r/PrintConfig.cpp:2907 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3231 +#: src/libslic3r/PrintConfig.cpp:3466 src/libslic3r/PrintConfig.cpp:3951 +msgid "°" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:367 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:571 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1232 +msgid "Move cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +msgid "in" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:544 +msgid "Value" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:549 +msgid "Tolerance" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 +msgid "Left click" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2348 +msgid "Add connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 +msgid "Right click" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +msgid "Remove connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 +msgid "Drag" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1216 +msgid "Move connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +msgid "Add connector to selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +msgid "Remove connector from selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:870 +msgid "Select all connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:894 src/libslic3r/PrintConfig.cpp:4644 +msgid "Cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1227 +msgid "Rotate cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1448 +msgid "Render cut plane as circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1537 +msgid "Connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1541 +msgid "Remove connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1550 +msgid "Type" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1561 src/libslic3r/PrintConfig.cpp:2816 +msgid "Style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1568 +msgid "Depth ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1586 +msgid "Confirm connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1652 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1666 +msgid "Flip cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1710 +msgid "Hold SHIFT key to draw a cut line" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1716 +msgid "Cut position: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1725 +msgid "Reset cutting plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Edit connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Add connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1744 +msgid "Reset cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1745 +msgid "Reset cutting plane and remove connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1800 +msgid "After cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1820 +msgid "Cut to" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1823 +msgid "Objects" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1826 +msgid "Parts" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1840 +msgid "Perform cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1930 +msgid "Invalid connectors detected" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1932 +#, possible-c-format, possible-boost-format +msgid "%1$d connector is out of cut contour" +msgid_plural "%1$d connectors are out of cut contour" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1935 +#, possible-c-format, possible-boost-format +msgid "%1$d connector is out of object" +msgid_plural "%1$d connectors are out of object" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1938 +msgid "Some connectors are overlapped" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1942 +msgid "" +"Invalid state. \n" +"No one part is selected for keep after cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1944 +msgid "" +"Warning state. \n" +"Cut plane is placed out of object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2153 +msgid "Connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2183 +msgid "Cut by Plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2323 +msgid "Cut by line" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2373 +msgid "Delete connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:252 +msgid "Entering Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:253 +msgid "Leaving Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:254 +msgid "Cut gizmo editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:601 +msgid "Emboss" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:866 +msgid "ERROR: Wait until ends or Cancel process." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:921 +msgid "Text-Rotate" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:953 +msgid "Font" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:954 +#: src/libslic3r/PrintConfig.cpp:897 +msgid "Height" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:955 +msgid "Depth" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:963 +msgid "Use surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:964 +msgid "Char gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:965 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Line gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:966 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:967 +msgid "Skew ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:968 +msgid "Z-move" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:969 +msgid "Z-rot" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:970 +msgid "Collection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1047 +msgid "NORMAL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1048 +msgid "SMALL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1049 +msgid "ITALIC" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1050 +msgid "SWISS" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1051 +msgid "MODERN" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1088 +msgid "First font" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1093 +msgid "Default font" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1098 +msgid "Embossed text" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1513 +msgid "Warning: No font is selected. Select correct one." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1531 +#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1437 +#: src/slic3r/GUI/Tab.cpp:1472 src/slic3r/GUI/Tab.cpp:1607 +#: src/slic3r/GUI/Tab.cpp:1611 src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:2390 src/slic3r/GUI/Tab.cpp:4985 +#: src/libslic3r/PrintConfig.cpp:276 src/libslic3r/PrintConfig.cpp:514 +#: src/libslic3r/PrintConfig.cpp:1484 src/libslic3r/PrintConfig.cpp:1566 +#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:2562 +#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:3166 +#: src/libslic3r/PrintConfig.cpp:3200 src/libslic3r/PrintConfig.cpp:3211 +#: src/libslic3r/PrintConfig.cpp:3226 src/libslic3r/PrintConfig.cpp:3239 +#: src/libslic3r/PrintConfig.cpp:3248 src/libslic3r/PrintConfig.cpp:3260 +#: src/libslic3r/PrintConfig.cpp:3642 +msgid "Advanced" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1631 +msgid "Can't write text by selected font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1632 +msgid "Try to choose another font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Empty" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Embossed text can NOT contain only white spaces." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Bad symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Text contain character glyph (represented by '?') unknown by font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:535 +msgid "Skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +msgid "Unsupported visualization of font skew for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Unsupported visualization of font boldness for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Unsupported visualization of gap between lines inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Too tall" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Diminished font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Too small" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Enlarged font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1660 +#, possible-boost-format +msgid "%1% is NOT shown." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1964 +msgid " No symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1965 +msgid " ... Loading" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2015 +msgid " ... In queue" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2132 +#, possible-boost-format +msgid "Font face \"%1%\" can't be selected." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2180 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:754 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:367 +msgid "Apply" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2192 +msgid "add file with font(.ttf, .ttc)" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2202 +msgid "Open dialog for choose from fonts." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2210 +msgid "Text is to object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2224 +msgid "Added" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2227 +msgid "Click to change text into object part." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2230 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4321 +msgid "You can't change a type of the last solid part of the object." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2231 +msgid "Subtracted" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2237 +msgid "Click to change part type into negative volume." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2243 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4338 +msgid "Modifier" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2249 +msgid "Click to change part type into modifier." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2256 +msgid "Change Text Type" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2287 +#, possible-boost-format +msgid "Rename style(%1%) for embossing text: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2299 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2384 +msgid "Name can't be empty." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2301 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2386 +msgid "Name has to be unique." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2310 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2397 +msgid "ok" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2312 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2401 +msgid "cancel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2337 +msgid "Rename style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2344 +msgid "Rename current style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2345 +msgid "Can't rename temporary style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2362 +msgid "First Add style to list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2364 +#, possible-boost-format +msgid "Save %1% style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2366 +msgid "No changes to save." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2373 +msgid "New name of style: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2422 +msgid "Save as new style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2434 +msgid "Only valid font can be added to style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2436 +msgid "Add style to my list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2438 +msgid "Add as new named style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2454 +msgid "Remove style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2485 +#, possible-boost-format +msgid "Delete \"%1%\" style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2486 +#, possible-boost-format +msgid "Can't delete \"%1%\". It is last style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2487 +#, possible-boost-format +msgid "Can't delete temporary style \"%1%\"." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2494 +#, possible-boost-format +msgid "" +"Are you sure,\n" +"that you want permanently and unrecoverable \n" +"remove style \"%1%\"?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2496 +msgid "Yes" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2505 +msgid "No" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2555 +msgid "Presets" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2564 src/slic3r/GUI/GUI_App.cpp:2324 +msgid "modified" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2617 +#, possible-boost-format +msgid "Modified style \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2618 +#, possible-boost-format +msgid "Current style is \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2625 +msgid "Style modification will be lost." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2627 +#, possible-boost-format +msgid "" +"Changing style to '%1%' will discard current style modification.\n" +"\n" +" Would you like to continue anyway?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2643 +msgid "Not valid style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2644 +#, possible-boost-format +msgid "Style '%1%' can't be used and will be removed from list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2691 +msgid "Unset italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2708 +msgid "Set italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2738 +msgid "Unset bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2756 +msgid "Set bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2922 +msgid "WxFont is not loaded properly." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2957 +msgid "Revert font changes." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2991 +msgid "wx Make bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3002 +msgid "Revert text size." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3029 +msgid "Revert embossed depth." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3178 +msgid "" +"Advanced font options could be changed only for correct font.\n" +"Start with select correct font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3219 +msgid "Revert using of model surface." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3232 +msgid "font points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3241 +msgid "Revert gap between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3242 +msgid "Distance between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3257 +msgid "Revert gap between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3258 +msgid "Distance between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3272 +msgid "Undo boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3273 +msgid "Tiny / Wide glyphs" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3283 +msgid "Undo letter's skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3284 +msgid "Italic strength ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3304 +msgid "Undo translation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3305 +msgid "Distance of the center of text from model surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3350 +msgid "Undo rotation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3352 +msgid "Rotate text Clock-wise." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3386 +msgid "Select from True Type Collection." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3395 +msgid "Set text to face camera" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3402 +msgid "Use camera direction for text orientation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3486 +#, possible-boost-format +msgid "Font '%1%' can't be used. Please select another." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3488 +msgid "Selected font is NOT True-type." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3512 +msgid "Choose one or more files (TTF, TTC):" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3539 +msgid "Choose SVG file:" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3600 +#, possible-boost-format +msgid "" +"Can't load exactly same font(\"%1%\"), Aplication selected a similar " +"one(\"%2%\"). You have to specify font for enable edit text." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:81 +msgid "Enter emboss gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:82 +msgid "Leave emboss gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:83 +msgid "Embossing actions" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:37 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:66 +msgid "Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 +msgid "Automatic painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 +msgid "painting..." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:107 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +msgid "Clipping of view" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:106 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 msgid "Reset direction" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:108 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 msgid "Brush size" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:109 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 msgid "Brush shape" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1816 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:110 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 msgid "Left mouse button" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 msgid "Enforce supports" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 msgid "Right mouse button" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:434 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:573 msgid "Block supports" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 msgid "Shift + Left mouse button" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:429 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:568 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:247 msgid "Remove selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 msgid "Remove all selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 +#: src/slic3r/GUI/GUI_Factories.cpp:481 +msgid "Sphere" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:106 +#: src/libslic3r/PrintConfig.cpp:1231 +msgid "Triangles" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 +msgid "Highlight overhang by angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:63 +msgid "Enforce" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +msgid "Tool type" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 #: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 -msgid "Circle" +msgid "Brush" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:68 #: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 -#: src/slic3r/GUI/GUI_Factories.cpp:461 -msgid "Sphere" +msgid "Smart fill" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:68 -#: src/libslic3r/PrintConfig.cpp:1172 -msgid "Triangles" +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 +msgid "Smart fill angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:72 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 +msgid "Split triangles" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:73 +msgid "On overhangs only" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:187 +#, possible-boost-format +msgid "" +"Preselects faces by overhang angle. It is possible to restrict paintable " +"facets to only preselected faces when the option \"%1%\" is enabled." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:230 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:371 +msgid "Paints facets according to the chosen painting brush." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:238 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:384 +msgid "" +"Paints neighboring facets whose relative angle is less or equal to set angle." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242 +#, possible-boost-format +msgid "Allows painting only on facets selected by: \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:257 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:412 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141 +msgid "Paints all facets inside, regardless of their orientation." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:266 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:421 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:149 +msgid "Ignores facets facing away from the camera." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:430 +msgid "Paints only one facet." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:298 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:438 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:455 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:129 +msgid "Alt + Mouse wheel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:288 +msgid "Splits bigger facets into smaller ones while the object is painted." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:321 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:476 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:167 +msgid "Ctrl + Mouse wheel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:326 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:481 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:172 +msgid "Reset selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:382 +msgid "Block supports by angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:383 +msgid "Add supports by angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +msgid "Automatic painting requires valid print setup." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:535 +msgid "Automatic painting will erase all currently painted areas." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:536 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1118 +msgid "Are you sure you want to do it?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:540 +msgid "Automatic painting support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:571 +msgid "Add supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:22 +msgid "Entering Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:23 +msgid "Leaving Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:24 +msgid "Paint-on supports editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:88 +msgid "Place on face" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:29 +msgid "Hollow this object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 +msgid "Preview hollowed and drilled model" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 +msgid "Offset" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 +msgid "Quality" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 +#: src/libslic3r/PrintConfig.cpp:4037 +msgid "Closing distance" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 +msgid "Hole diameter" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 +msgid "Hole depth" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 +msgid "Remove selected holes" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 +msgid "Remove all holes" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 +msgid "Show supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:242 +msgid "Add drainage hole" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:361 +msgid "Delete drainage hole" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 -msgid "Highlight overhang by angle" +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:655 +msgid "Hollowing parameter change" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 -msgid "Enforce" +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:739 +msgid "Change drainage hole diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 -msgid "Tool type" +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:827 +msgid "Hollow and drill" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 -msgid "Brush" +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:869 +msgid "Move drainage hole" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:128 -msgid "Smart fill" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:64 +msgid "No feature" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:131 -msgid "Smart fill angle" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:65 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:76 +msgid "Vertex" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:132 -msgid "Split triangles" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:66 +msgid "Edge" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 -msgid "On overhangs only" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:68 +msgid "Plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:174 -#, possible-boost-format -msgid "" -"Preselects faces by overhang angle. It is possible to restrict paintable " -"facets to only preselected faces when the option \"%1%\" is enabled." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:77 +msgid "Point on edge" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:217 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:378 -msgid "Paints facets according to the chosen painting brush." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:78 +msgid "Point on circle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:391 -msgid "" -"Paints neighboring facets whose relative angle is less or equal to set angle." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:79 +msgid "Point on plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:229 -#, possible-boost-format -msgid "Allows painting only on facets selected by: \"%1%\"" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:89 +msgid "Center of edge" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:244 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:419 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:144 -msgid "Paints all facets inside, regardless of their orientation." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:90 +msgid "Center of circle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:253 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:428 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:152 -msgid "Ignores facets facing away from the camera." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:554 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2029 +msgid "Measure" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:262 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:437 -msgid "Paints only one facet." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1236 +msgid "Edit to scale" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:270 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:285 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:445 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:462 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:132 -msgid "Alt + Mouse wheel" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1258 +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:161 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:236 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:776 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:794 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:817 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:831 +#: src/libslic3r/PrintConfig.cpp:4713 +msgid "Scale" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 -msgid "Splits bigger facets into smaller ones while the object is painted." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1362 +msgctxt "Verb" +msgid "Scale" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:308 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:483 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:170 -msgid "Ctrl + Mouse wheel" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1541 +msgid "##angle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:313 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:488 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:175 -msgid "Reset selection" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1740 +msgid "Measure tool debug" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:364 -msgid "Block supports by angle" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1824 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1851 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1857 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1886 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1893 +msgid "Unselect feature" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:365 -msgid "Add supports by angle" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1830 +msgid "Unselect center" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:432 -msgid "Add supports" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1835 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1862 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1898 +msgid "Select center" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:41 -msgid "Place on face" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1840 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1867 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1903 +msgid "Unselect point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 -msgid "Hollow this object" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1846 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1873 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1910 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select feature" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 -msgid "Preview hollowed and drilled model" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 -msgid "Offset" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Shift" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:57 -msgid "Quality" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Enable point selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3905 -msgid "Closing distance" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2007 +msgid "Restart selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 -msgid "Hole diameter" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1952 +msgid "Esc" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 -msgid "Hole depth" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1955 +msgid "Unselect" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 -msgid "Remove selected holes" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1999 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2001 +msgid "Selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 -msgid "Remove all holes" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2021 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +msgid "Copy to clipboard" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 -msgid "Show supports" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2038 +msgid "Angle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:287 -msgid "Add drainage hole" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Perpendicular distance" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:403 -msgid "Delete drainage hole" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Distance" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:590 -msgid "Hollowing parameter change" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2062 +msgid "Direct distance" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:667 -msgid "Change drainage hole diameter" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2072 +msgid "Distance XYZ" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:761 -msgid "Hollow and drill" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:163 +msgid "Entering Measure gizmo" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:811 -msgid "Move drainage hole" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:164 +msgid "Leaving Measure gizmo" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:27 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:165 +msgid "Measure gizmo editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:28 #, possible-boost-format msgid "" "Your printer has more extruders than the multi-material painting gizmo " @@ -2668,81 +3875,85 @@ msgid "" "used for painting." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:45 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:46 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 msgid "Multimaterial painting" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 msgid "First color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 msgid "Second color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:120 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:671 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:642 msgid "Remove painted color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 msgid "Clear all" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:129 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 msgid "Bucket fill" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:404 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:397 msgid "Paints neighboring facets that have the same color." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:450 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:443 msgid "Split bigger facets into smaller ones while the object is painted." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:674 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:645 #, possible-boost-format msgid "Painted using: Extruder %1%" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:118 +msgid "Entering Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:119 +msgid "Leaving Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:120 +msgid "Multimaterial painting editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:76 msgid "Move" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:466 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4532 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:643 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:745 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:775 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:813 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:830 +#: src/libslic3r/PrintConfig.cpp:4698 msgid "Rotate" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:505 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:707 msgid "Optimize orientation" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:552 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:319 -msgid "Apply" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:79 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4547 -msgid "Scale" +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:194 +msgid "Gizmo-Scale" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 msgid "Enforce seam" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:38 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:255 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:252 msgid "Block seam" msgstr "" @@ -2750,338 +3961,342 @@ msgstr "" msgid "Seam painting" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:23 +msgid "Entering Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:24 +msgid "Leaving Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:25 +msgid "Paint-on seam editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:105 msgid "Mesh name" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:69 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:107 msgid "Detail level" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:108 msgid "Decimate ratio" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:113 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:147 #, possible-boost-format msgid "" "Processing model '%1%' with more than 1M triangles could be slow. It is " -"highly recommend to reduce amount of triangles." +"highly recommended to reduce amount of triangles." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:116 -#: src/slic3r/GUI/GUI_Factories.cpp:705 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:150 +#: src/slic3r/GUI/GUI_Factories.cpp:789 msgid "Simplify model" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:143 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:177 msgid "Simplify" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:156 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:190 msgid "Simplification is currently only allowed when a single part is selected" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 -#: src/slic3r/GUI/PrintHostDialogs.cpp:373 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:191 +#: src/slic3r/GUI/MainFrame.cpp:1246 src/slic3r/GUI/MainFrame.cpp:1716 +#: src/slic3r/GUI/PrintHostDialogs.cpp:425 msgid "Error" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:250 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:294 msgid "Extra high" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:251 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:295 msgid "High" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:252 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:296 msgid "Medium" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:297 msgid "Low" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:254 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:298 msgid "Extra low" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:304 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#, possible-boost-format +msgid "" +"Multipart object can be simplified only by %1%. If you want specify %2% " +"process it separately." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:352 #, possible-c-format, possible-boost-format msgid "%d triangles" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:307 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:355 msgid "Show wireframe" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:313 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:361 msgid "Operation already cancelling. Please wait few seconds." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:370 msgid "Can't apply when proccess preview." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:329 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:377 #, possible-boost-format msgid "Process %1% / 100" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:479 -#, possible-boost-format -msgid "Simplify %1%" +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:542 +msgid "Simplify " msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:543 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"simplifying the mesh." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:67 +msgid "Entering SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:68 +msgid "Leaving SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:35 msgid "Head diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:36 msgid "Lock supports under new islands" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:37 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268 msgid "Remove selected points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:38 msgid "Remove all points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1226 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1271 msgid "Apply changes" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1227 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1272 msgid "Discard changes" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 msgid "Minimal points distance" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3735 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/libslic3r/PrintConfig.cpp:3867 msgid "Support points density" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1229 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1274 msgid "Auto-generate points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 msgid "Manual editing" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:372 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:307 msgid "Add support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:522 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:460 msgid "Delete support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:702 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:626 msgid "Change point head diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:770 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:696 msgid "Support parameter change" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:876 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:806 msgid "SLA Support Points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:814 msgid "Do you want to save your manually edited support points?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:898 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:815 msgid "Save support points?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:958 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:880 msgid "Move support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1051 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:987 msgid "Support points edit" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1131 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1117 msgid "Autogeneration will erase all manually edited points." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1132 -msgid "Are you sure you want to do it?" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1138 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1124 msgid "Autogenerate support points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1186 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 msgid "SLA gizmo keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1197 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1242 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 -msgid "Left click" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 msgid "Add point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 -msgid "Right click" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 msgid "Remove point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 -msgid "Drag" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 msgid "Move point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 msgid "Add point to selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 msgid "Remove point from selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 msgid "Select by rectangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 msgid "Deselect by rectangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1267 msgid "Select all points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Mouse wheel" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Move clipping plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1225 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1270 msgid "Reset clipping plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1228 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273 msgid "Switch to editing mode" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:196 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:204 msgid "" "ERROR: Please close all manipulators available from the left toolbar first" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:561 -msgid "Gizmo-Scale" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:673 -msgid "Gizmo-Place on Face" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:1270 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:998 msgid "" "You are currently editing SLA support points. Please, apply or discard your " "changes first." msgstr "" -#: src/slic3r/GUI/GUI.cpp:292 +#: src/slic3r/GUI/GUI.cpp:287 msgid "Undefined" msgstr "" -#: src/slic3r/GUI/GUI.cpp:317 +#: src/slic3r/GUI/GUI.cpp:308 #, possible-boost-format msgid "%1% was substituted with %2%" msgstr "" -#: src/slic3r/GUI/GUI.cpp:326 +#: src/slic3r/GUI/GUI.cpp:317 msgid "" "Most likely the configuration was produced by a newer version of PrusaSlicer " "or by some PrusaSlicer fork." msgstr "" -#: src/slic3r/GUI/GUI.cpp:327 +#: src/slic3r/GUI/GUI.cpp:318 msgid "The following values were substituted:" msgstr "" -#: src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/GUI.cpp:319 msgid "Review the substitutions and adjust them if needed." msgstr "" -#: src/slic3r/GUI/GUI.cpp:338 src/slic3r/GUI/Plater.cpp:820 +#: src/slic3r/GUI/GUI.cpp:329 src/slic3r/GUI/Plater.cpp:850 msgid "SLA print settings" msgstr "" -#: src/slic3r/GUI/GUI.cpp:342 src/slic3r/GUI/PhysicalPrinterDialog.cpp:157 +#: src/slic3r/GUI/GUI.cpp:333 src/slic3r/GUI/PhysicalPrinterDialog.cpp:158 msgid "Physical Printer" msgstr "" -#: src/slic3r/GUI/GUI.cpp:355 +#: src/slic3r/GUI/GUI.cpp:346 msgid "" "Configuration bundle was loaded, however some configuration values were not " "recognized." msgstr "" -#: src/slic3r/GUI/GUI.cpp:365 +#: src/slic3r/GUI/GUI.cpp:356 #, possible-boost-format msgid "" "Configuration file \"%1%\" was loaded, however some configuration values " "were not recognized." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:266 +#: src/slic3r/GUI/GUI_App.cpp:275 msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:267 +#: src/slic3r/GUI/GUI_App.cpp:276 msgid "Developed by Prusa Research." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:269 +#: src/slic3r/GUI/GUI_App.cpp:278 msgid "" "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:270 -msgid "Artwork model by Leslie Ing" +#: src/slic3r/GUI/GUI_App.cpp:279 +msgid "Artwork model by Creative Tools" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:411 +#: src/slic3r/GUI/GUI_App.cpp:420 #, possible-boost-format msgid "" "Starting with %1% 2.3, configuration directory on Linux has changed " @@ -3101,20 +4316,20 @@ msgid "" "What do you want to do now?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:419 +#: src/slic3r/GUI/GUI_App.cpp:428 #, possible-c-format, possible-boost-format msgid "%s - BREAKING CHANGE" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Quit, I will move my data now" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Start the application" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:699 +#: src/slic3r/GUI/GUI_App.cpp:725 #, possible-c-format, possible-boost-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -3124,11 +4339,11 @@ msgid "" "The application will now terminate." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:702 +#: src/slic3r/GUI/GUI_App.cpp:728 msgid "Fatal error" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:706 +#: src/slic3r/GUI/GUI_App.cpp:732 msgid "" "PrusaSlicer has encountered a localization error. Please report to " "PrusaSlicer team, what language was active and in which scenario this issue " @@ -3137,34 +4352,34 @@ msgid "" "The application will now terminate." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:709 +#: src/slic3r/GUI/GUI_App.cpp:735 msgid "Critical error" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:714 +#: src/slic3r/GUI/GUI_App.cpp:740 #, possible-boost-format msgid "Internal error: %1%" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:909 src/slic3r/GUI/GUI_App.cpp:1007 +#: src/slic3r/GUI/GUI_App.cpp:954 src/slic3r/GUI/GUI_App.cpp:1051 msgid "" "Error parsing PrusaSlicer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error. Your user profiles will " "not be affected." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:915 src/slic3r/GUI/GUI_App.cpp:1013 +#: src/slic3r/GUI/GUI_App.cpp:960 src/slic3r/GUI/GUI_App.cpp:1057 msgid "" "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:962 +#: src/slic3r/GUI/GUI_App.cpp:1006 #, possible-boost-format msgid "You are opening %1% version %2%." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:965 +#: src/slic3r/GUI/GUI_App.cpp:1009 #, possible-boost-format msgid "" "The active configuration was created by %1% %2%,\n" @@ -3176,7 +4391,7 @@ msgid "" "configuration." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:973 +#: src/slic3r/GUI/GUI_App.cpp:1017 #, possible-boost-format msgid "" "An existing configuration was found in %3%\n" @@ -3185,19 +4400,19 @@ msgid "" "Shall this configuration be imported?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:981 +#: src/slic3r/GUI/GUI_App.cpp:1025 msgid "Import" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:982 +#: src/slic3r/GUI/GUI_App.cpp:1026 msgid "Don't import" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:990 +#: src/slic3r/GUI/GUI_App.cpp:1034 msgid "Continue and import newer configuration?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1051 +#: src/slic3r/GUI/GUI_App.cpp:1095 msgid "" "You are running a 32 bit build of PrusaSlicer on 64-bit Windows.\n" "32 bit build of PrusaSlicer will likely not be able to utilize all the RAM " @@ -3207,53 +4422,44 @@ msgid "" "Do you wish to continue?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1134 +#: src/slic3r/GUI/GUI_App.cpp:1182 #, possible-c-format, possible-boost-format msgid "" "%s\n" "Do you want to continue?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1136 src/slic3r/GUI/GUI_App.cpp:3101 -#: src/slic3r/GUI/Plater.cpp:1726 src/slic3r/GUI/UnsavedChangesDialog.cpp:889 +#: src/slic3r/GUI/GUI_App.cpp:1184 src/slic3r/GUI/GUI_App.cpp:3302 +#: src/slic3r/GUI/Plater.cpp:1736 src/slic3r/GUI/UnsavedChangesDialog.cpp:917 msgid "Remember my choice" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1178 +#: src/slic3r/GUI/GUI_App.cpp:1226 msgid "Loading configuration" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1209 -#, possible-boost-format -msgid "New release version %1% is available." -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:1210 -msgid "See Download page." -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:1224 +#: src/slic3r/GUI/GUI_App.cpp:1257 #, possible-boost-format msgid "New prerelease version %1% is available." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1225 +#: src/slic3r/GUI/GUI_App.cpp:1258 msgid "See Releases page." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1262 +#: src/slic3r/GUI/GUI_App.cpp:1313 msgid "Preparing settings tabs" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1336 src/slic3r/GUI/Preferences.cpp:287 +#: src/slic3r/GUI/GUI_App.cpp:1393 src/slic3r/GUI/Preferences.cpp:405 msgid "Restore window position on start" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1338 +#: src/slic3r/GUI/GUI_App.cpp:1395 msgid "PrusaSlicer started after a crash" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1339 +#: src/slic3r/GUI/GUI_App.cpp:1396 #, possible-boost-format msgid "" "PrusaSlicer crashed last time when attempting to set window position.\n" @@ -3266,340 +4472,374 @@ msgid "" "Otherwise, the application will most likely crash again next time." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1351 +#: src/slic3r/GUI/GUI_App.cpp:1408 #, possible-boost-format msgid "Disable \"%1%\"" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1352 +#: src/slic3r/GUI/GUI_App.cpp:1409 #, possible-boost-format msgid "Leave \"%1%\" enabled" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1679 +#: src/slic3r/GUI/GUI_App.cpp:1780 msgid "" "You have the following presets with saved options for \"Print Host upload\"" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1683 +#: src/slic3r/GUI/GUI_App.cpp:1784 msgid "" "But since this version of PrusaSlicer we don't show this information in " "Printer Settings anymore.\n" "Settings will be available in physical printers settings." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1685 +#: src/slic3r/GUI/GUI_App.cpp:1786 msgid "" "By default new Printer devices will be named as \"Printer N\" during its " "creation.\n" "Note: This name can be changed later from the physical printers settings" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1689 src/slic3r/GUI/PhysicalPrinterDialog.cpp:726 +#: src/slic3r/GUI/GUI_App.cpp:1790 src/slic3r/GUI/PhysicalPrinterDialog.cpp:798 msgid "Information" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1702 src/slic3r/GUI/GUI_App.cpp:1713 +#: src/slic3r/GUI/GUI_App.cpp:1803 src/slic3r/GUI/GUI_App.cpp:1814 msgid "Recreating" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1716 +#: src/slic3r/GUI/GUI_App.cpp:1817 msgid "Loading of current presets" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1721 +#: src/slic3r/GUI/GUI_App.cpp:1822 msgid "Loading of a mode view" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1859 +#: src/slic3r/GUI/GUI_App.cpp:1961 msgid "Choose one file (3MF/AMF):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1871 +#: src/slic3r/GUI/GUI_App.cpp:1973 msgid "Choose one or more files (STL/3MF/STEP/OBJ/AMF/PRUSA):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1883 +#: src/slic3r/GUI/GUI_App.cpp:1984 +msgid "Choose ZIP file:" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1996 msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1894 +#: src/slic3r/GUI/GUI_App.cpp:2007 msgid "Changing of an application language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Select the language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2182 -msgid "modified" +#: src/slic3r/GUI/GUI_App.cpp:2363 +msgid "" +"Simple mode supports manipulation with single-part object(s)\n" +"or object(s) with support modifiers only." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2365 +msgid "Please check your object list before mode changing." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2236 +#: src/slic3r/GUI/GUI_App.cpp:2366 +msgid "Change application mode" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2397 #, possible-c-format, possible-boost-format msgid "Run %s" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "&Configuration Snapshots" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "Inspect / activate configuration snapshots" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Take Configuration &Snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Capture a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for Configuration Updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for configuration updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2249 -msgid "&Preferences" +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for Application Updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2255 -msgid "Application preferences" +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for new version of application" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2260 src/slic3r/GUI/wxExtensions.cpp:708 -msgid "Simple" +#: src/slic3r/GUI/GUI_App.cpp:2411 +msgid "&Preferences" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2260 -msgid "Simple View Mode" +#: src/slic3r/GUI/GUI_App.cpp:2417 +msgid "Application preferences" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2262 src/slic3r/GUI/wxExtensions.cpp:710 -msgctxt "Mode" -msgid "Advanced" +#: src/slic3r/GUI/GUI_App.cpp:2422 +msgid "Simple View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2262 +#: src/slic3r/GUI/GUI_App.cpp:2424 msgid "Advanced View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2263 src/slic3r/GUI/wxExtensions.cpp:711 -msgid "Expert" -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:2263 +#: src/slic3r/GUI/GUI_App.cpp:2425 msgid "Expert View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 msgid "Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 #, possible-c-format, possible-boost-format msgid "%s View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2271 +#: src/slic3r/GUI/GUI_App.cpp:2433 msgid "&Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Flash Printer &Firmware" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Upload a firmware image into an Arduino based printer" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2294 +#: src/slic3r/GUI/GUI_App.cpp:2459 msgid "Taking a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2295 +#: src/slic3r/GUI/GUI_App.cpp:2460 msgid "" "Some presets are modified and the unsaved changes will not be captured by " "the configuration snapshot." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2296 +#: src/slic3r/GUI/GUI_App.cpp:2461 msgid "Snapshot name" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2312 +#: src/slic3r/GUI/GUI_App.cpp:2477 msgid "Loading a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2321 +#: src/slic3r/GUI/GUI_App.cpp:2486 #, possible-boost-format msgid "Continue to activate a configuration snapshot %1%?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2335 +#: src/slic3r/GUI/GUI_App.cpp:2500 msgid "Failed to activate configuration snapshot." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2354 -msgid "Restart application" -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:2388 +#: src/slic3r/GUI/GUI_App.cpp:2520 msgid "Language selection" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2391 +#: src/slic3r/GUI/GUI_App.cpp:2523 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2393 src/slic3r/GUI/Preferences.cpp:582 +#: src/slic3r/GUI/GUI_App.cpp:2525 src/slic3r/GUI/Preferences.cpp:730 +#: src/slic3r/GUI/Selection.cpp:1695 msgid "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2420 +#: src/slic3r/GUI/GUI_App.cpp:2552 msgid "&Configuration" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2534 src/slic3r/GUI/GUI_App.cpp:2595 -msgid "The preset modifications are successfully saved" -msgid_plural "The presets modifications are successfully saved" -msgstr[0] "" -msgstr[1] "" +#: src/slic3r/GUI/GUI_App.cpp:2560 +msgid "Restart application" +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2598 +#: src/slic3r/GUI/GUI_App.cpp:2726 msgid "For new project all modifications will be reseted" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2636 +#: src/slic3r/GUI/GUI_App.cpp:2764 msgid "Loading a new project while the current project is modified." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Project is loading" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Opening new project while some presets are unsaved." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "The uploads are still ongoing" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "Stop them and continue anyway?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2662 +#: src/slic3r/GUI/GUI_App.cpp:2790 msgid "Ongoing uploads" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2876 -msgid "It's impossible to print multi-part object(s) with SLA technology." +#: src/slic3r/GUI/GUI_App.cpp:3026 +msgid "" +"It's impossible to print object(s) which contains parameter modifiers with " +"SLA technology." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2877 src/slic3r/GUI/Jobs/SLAImportJob.cpp:235 -#: src/slic3r/GUI/Plater.cpp:2459 +#: src/slic3r/GUI/GUI_App.cpp:3027 src/slic3r/GUI/Jobs/SLAImportJob.cpp:149 +#: src/slic3r/GUI/Plater.cpp:2536 msgid "Please check your object list before preset changing." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2901 +#: src/slic3r/GUI/GUI_App.cpp:3070 msgid "Configuration is editing from ConfigWizard" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2926 +#: src/slic3r/GUI/GUI_App.cpp:3088 +#, possible-boost-format +msgid "Welcome to %1% version %2%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3090 +#, possible-boost-format +msgid "" +"Do you wish to register downloads from Printables.com\n" +"for this %1% %2% executable?\n" +"\n" +"Downloads can be registered for only 1 executable at time." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3118 msgid "Select a gcode file:" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "Open hyperlink in default browser?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "PrusaSlicer: Open hyperlink" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3105 src/slic3r/GUI/Preferences.cpp:382 +#: src/slic3r/GUI/GUI_App.cpp:3306 src/slic3r/GUI/Preferences.cpp:593 msgid "Suppress to open hyperlink in browser" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3107 src/slic3r/GUI/Plater.cpp:1732 +#: src/slic3r/GUI/GUI_App.cpp:3308 src/slic3r/GUI/Plater.cpp:1742 msgid "PrusaSlicer will remember your choice." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3108 +#: src/slic3r/GUI/GUI_App.cpp:3309 msgid "You will not be asked about it again on hyperlinks hovering." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3109 src/slic3r/GUI/Plater.cpp:1736 +#: src/slic3r/GUI/GUI_App.cpp:3310 src/slic3r/GUI/Plater.cpp:1746 #, possible-boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" "to changes your choice." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3111 src/slic3r/GUI/Plater.cpp:1738 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:906 +#: src/slic3r/GUI/GUI_App.cpp:3312 src/slic3r/GUI/Plater.cpp:1748 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:934 msgid "PrusaSlicer: Don't ask me again" msgstr "" -#: src/slic3r/GUI/GUI_Init.cpp:57 src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_App.cpp:3386 +msgid "Check for application update has failed." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3387 +#, possible-boost-format +msgid "No new version is available. Latest release version is %1%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3458 +msgid "Download of new version is already ongoing. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/GUI_Init.cpp:64 src/slic3r/GUI/GUI_Init.cpp:67 msgid "PrusaSlicer GUI initialization failed" msgstr "" -#: src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_Init.cpp:67 #, possible-boost-format msgid "Fatal error, exception catched: %1%" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:54 src/slic3r/GUI/GUI_Factories.cpp:127 -#: src/libslic3r/PrintConfig.cpp:287 src/libslic3r/PrintConfig.cpp:404 -#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:456 -#: src/libslic3r/PrintConfig.cpp:708 src/libslic3r/PrintConfig.cpp:778 -#: src/libslic3r/PrintConfig.cpp:786 src/libslic3r/PrintConfig.cpp:1232 -#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1563 -#: src/libslic3r/PrintConfig.cpp:1955 src/libslic3r/PrintConfig.cpp:2030 -#: src/libslic3r/PrintConfig.cpp:2264 src/libslic3r/PrintConfig.cpp:2850 -#: src/libslic3r/PrintConfig.cpp:2858 src/libslic3r/PrintConfig.cpp:2918 -#: src/libslic3r/PrintConfig.cpp:2927 src/libslic3r/PrintConfig.cpp:3098 +#: src/libslic3r/PrintConfig.cpp:300 src/libslic3r/PrintConfig.cpp:423 +#: src/libslic3r/PrintConfig.cpp:466 src/libslic3r/PrintConfig.cpp:475 +#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:872 +#: src/libslic3r/PrintConfig.cpp:881 src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1376 src/libslic3r/PrintConfig.cpp:1604 +#: src/libslic3r/PrintConfig.cpp:1985 src/libslic3r/PrintConfig.cpp:2060 +#: src/libslic3r/PrintConfig.cpp:2294 src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:2946 src/libslic3r/PrintConfig.cpp:3006 +#: src/libslic3r/PrintConfig.cpp:3015 src/libslic3r/PrintConfig.cpp:3186 msgid "Layers and Perimeters" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:56 src/slic3r/GUI/GUI_Factories.cpp:131 -#: src/slic3r/GUI/GUI_Preview.cpp:249 src/slic3r/GUI/Tab.cpp:1547 -#: src/slic3r/GUI/Tab.cpp:1549 src/libslic3r/ExtrusionEntity.cpp:340 -#: src/libslic3r/ExtrusionEntity.cpp:372 src/libslic3r/PrintConfig.cpp:670 -#: src/libslic3r/PrintConfig.cpp:2095 src/libslic3r/PrintConfig.cpp:2104 -#: src/libslic3r/PrintConfig.cpp:2113 src/libslic3r/PrintConfig.cpp:2123 -#: src/libslic3r/PrintConfig.cpp:2132 src/libslic3r/PrintConfig.cpp:2554 -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2568 -#: src/libslic3r/PrintConfig.cpp:2581 src/libslic3r/PrintConfig.cpp:2591 -#: src/libslic3r/PrintConfig.cpp:2599 src/libslic3r/PrintConfig.cpp:2617 -#: src/libslic3r/PrintConfig.cpp:2634 src/libslic3r/PrintConfig.cpp:2655 -#: src/libslic3r/PrintConfig.cpp:2668 src/libslic3r/PrintConfig.cpp:2685 -#: src/libslic3r/PrintConfig.cpp:2703 src/libslic3r/PrintConfig.cpp:2718 -#: src/libslic3r/PrintConfig.cpp:2728 src/libslic3r/PrintConfig.cpp:2737 -#: src/libslic3r/PrintConfig.cpp:2748 src/libslic3r/PrintConfig.cpp:2762 -#: src/libslic3r/PrintConfig.cpp:2778 src/libslic3r/PrintConfig.cpp:2786 -#: src/libslic3r/PrintConfig.cpp:2787 src/libslic3r/PrintConfig.cpp:2796 -#: src/libslic3r/PrintConfig.cpp:2810 src/libslic3r/PrintConfig.cpp:2818 -#: src/libslic3r/PrintConfig.cpp:2832 +#: src/slic3r/GUI/Tab.cpp:1494 src/slic3r/GUI/Tab.cpp:1496 +#: src/libslic3r/PrintConfig.cpp:773 src/libslic3r/PrintConfig.cpp:2125 +#: src/libslic3r/PrintConfig.cpp:2134 src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2153 src/libslic3r/PrintConfig.cpp:2162 +#: src/libslic3r/PrintConfig.cpp:2584 src/libslic3r/PrintConfig.cpp:2590 +#: src/libslic3r/PrintConfig.cpp:2598 src/libslic3r/PrintConfig.cpp:2611 +#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2628 +#: src/libslic3r/PrintConfig.cpp:2644 src/libslic3r/PrintConfig.cpp:2660 +#: src/libslic3r/PrintConfig.cpp:2681 src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2725 +#: src/libslic3r/PrintConfig.cpp:2743 src/libslic3r/PrintConfig.cpp:2753 +#: src/libslic3r/PrintConfig.cpp:2762 src/libslic3r/PrintConfig.cpp:2773 +#: src/libslic3r/PrintConfig.cpp:2785 src/libslic3r/PrintConfig.cpp:2799 +#: src/libslic3r/PrintConfig.cpp:2807 src/libslic3r/PrintConfig.cpp:2808 +#: src/libslic3r/PrintConfig.cpp:2817 src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2840 src/libslic3r/PrintConfig.cpp:2854 +#: src/libslic3r/PrintConfig.cpp:2862 src/libslic3r/PrintConfig.cpp:2873 +#: src/libslic3r/PrintConfig.cpp:2884 src/libslic3r/PrintConfig.cpp:2893 +#: src/libslic3r/PrintConfig.cpp:2903 src/libslic3r/PrintConfig.cpp:2915 msgid "Support material" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:59 src/slic3r/GUI/GUI_Factories.cpp:135 -#: src/libslic3r/PrintConfig.cpp:3054 src/libslic3r/PrintConfig.cpp:3062 +#: src/libslic3r/PrintConfig.cpp:3142 src/libslic3r/PrintConfig.cpp:3150 msgid "Wipe options" msgstr "" @@ -3607,330 +4847,351 @@ msgstr "" msgid "Pad and Support" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/GUI_Preview.cpp:245 -#: src/slic3r/GUI/Tab.cpp:1513 src/libslic3r/ExtrusionEntity.cpp:336 -#: src/libslic3r/ExtrusionEntity.cpp:364 src/libslic3r/PrintConfig.cpp:1579 -#: src/libslic3r/PrintConfig.cpp:1585 src/libslic3r/PrintConfig.cpp:1599 -#: src/libslic3r/PrintConfig.cpp:1609 src/libslic3r/PrintConfig.cpp:1617 -#: src/libslic3r/PrintConfig.cpp:1619 +#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/Tab.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1620 src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1638 src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1656 src/libslic3r/PrintConfig.cpp:1658 msgid "Ironing" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1283 -#: src/libslic3r/PrintConfig.cpp:1284 src/libslic3r/PrintConfig.cpp:1299 -#: src/libslic3r/PrintConfig.cpp:1309 +#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1344 src/libslic3r/PrintConfig.cpp:1356 +#: src/libslic3r/PrintConfig.cpp:1366 msgid "Fuzzy Skin" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/GUI_Preview.cpp:220 -#: src/slic3r/GUI/Tab.cpp:1581 src/libslic3r/PrintConfig.cpp:507 -#: src/libslic3r/PrintConfig.cpp:766 src/libslic3r/PrintConfig.cpp:1326 -#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1618 -#: src/libslic3r/PrintConfig.cpp:2020 src/libslic3r/PrintConfig.cpp:2352 -#: src/libslic3r/PrintConfig.cpp:2405 src/libslic3r/PrintConfig.cpp:2903 +#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/Tab.cpp:1536 +#: src/libslic3r/PrintConfig.cpp:526 src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:548 src/libslic3r/PrintConfig.cpp:557 +#: src/libslic3r/PrintConfig.cpp:566 src/libslic3r/PrintConfig.cpp:575 +#: src/libslic3r/PrintConfig.cpp:852 src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1657 +#: src/libslic3r/PrintConfig.cpp:2050 src/libslic3r/PrintConfig.cpp:2383 +#: src/libslic3r/PrintConfig.cpp:2436 src/libslic3r/PrintConfig.cpp:2991 msgid "Speed" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1623 -#: src/slic3r/GUI/Tab.cpp:2304 src/libslic3r/PrintConfig.cpp:796 -#: src/libslic3r/PrintConfig.cpp:1489 src/libslic3r/PrintConfig.cpp:1997 -#: src/libslic3r/PrintConfig.cpp:2373 src/libslic3r/PrintConfig.cpp:2647 -#: src/libslic3r/PrintConfig.cpp:2675 +#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1585 +#: src/slic3r/GUI/Tab.cpp:2288 src/libslic3r/PrintConfig.cpp:889 +#: src/libslic3r/PrintConfig.cpp:1530 src/libslic3r/PrintConfig.cpp:2027 +#: src/libslic3r/PrintConfig.cpp:2404 src/libslic3r/PrintConfig.cpp:2673 +#: src/libslic3r/PrintConfig.cpp:2701 msgid "Extruders" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:754 -#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:1218 -#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:2006 -#: src/libslic3r/PrintConfig.cpp:2393 src/libslic3r/PrintConfig.cpp:2656 -#: src/libslic3r/PrintConfig.cpp:2890 +#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:840 +#: src/libslic3r/PrintConfig.cpp:953 src/libslic3r/PrintConfig.cpp:1278 +#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:2036 +#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2682 +#: src/libslic3r/PrintConfig.cpp:2978 msgid "Extrusion Width" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1533 -#: src/libslic3r/PrintConfig.cpp:517 src/libslic3r/PrintConfig.cpp:528 -#: src/libslic3r/PrintConfig.cpp:544 +#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:631 src/libslic3r/PrintConfig.cpp:642 +#: src/libslic3r/PrintConfig.cpp:655 msgid "Skirt and brim" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 -#: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1645 -#: src/slic3r/GUI/Tab.cpp:1649 src/slic3r/GUI/Tab.cpp:2031 -#: src/slic3r/GUI/Tab.cpp:2402 src/slic3r/GUI/Tab.cpp:4729 -#: src/libslic3r/PrintConfig.cpp:260 src/libslic3r/PrintConfig.cpp:495 -#: src/libslic3r/PrintConfig.cpp:1438 src/libslic3r/PrintConfig.cpp:1525 -#: src/libslic3r/PrintConfig.cpp:1572 src/libslic3r/PrintConfig.cpp:2530 -#: src/libslic3r/PrintConfig.cpp:2540 src/libslic3r/PrintConfig.cpp:3078 -#: src/libslic3r/PrintConfig.cpp:3113 src/libslic3r/PrintConfig.cpp:3124 -#: src/libslic3r/PrintConfig.cpp:3139 src/libslic3r/PrintConfig.cpp:3152 -#: src/libslic3r/PrintConfig.cpp:3161 src/libslic3r/PrintConfig.cpp:3173 -#: src/libslic3r/PrintConfig.cpp:3370 -msgid "Advanced" -msgstr "" - -#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4663 src/slic3r/GUI/Tab.cpp:4664 -#: src/libslic3r/PrintConfig.cpp:3564 src/libslic3r/PrintConfig.cpp:3571 -#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3589 -#: src/libslic3r/PrintConfig.cpp:3599 src/libslic3r/PrintConfig.cpp:3609 -#: src/libslic3r/PrintConfig.cpp:3646 src/libslic3r/PrintConfig.cpp:3653 -#: src/libslic3r/PrintConfig.cpp:3664 src/libslic3r/PrintConfig.cpp:3674 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3696 -#: src/libslic3r/PrintConfig.cpp:3706 src/libslic3r/PrintConfig.cpp:3715 -#: src/libslic3r/PrintConfig.cpp:3725 src/libslic3r/PrintConfig.cpp:3736 -#: src/libslic3r/PrintConfig.cpp:3744 +#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Tab.cpp:4946 src/slic3r/GUI/Tab.cpp:4948 +#: src/libslic3r/PrintConfig.cpp:3328 src/libslic3r/PrintConfig.cpp:3337 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3356 +#: src/libslic3r/PrintConfig.cpp:3366 src/libslic3r/PrintConfig.cpp:3387 +#: src/libslic3r/PrintConfig.cpp:3410 src/libslic3r/PrintConfig.cpp:3417 +#: src/libslic3r/PrintConfig.cpp:3432 src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3464 +#: src/libslic3r/PrintConfig.cpp:3474 src/libslic3r/PrintConfig.cpp:3488 +#: src/libslic3r/PrintConfig.cpp:3498 src/libslic3r/PrintConfig.cpp:3841 +#: src/libslic3r/PrintConfig.cpp:3861 src/libslic3r/PrintConfig.cpp:3868 +#: src/libslic3r/PrintConfig.cpp:3876 msgid "Supports" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4704 src/slic3r/GUI/Tab.cpp:4705 -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3752 -#: src/libslic3r/PrintConfig.cpp:3759 src/libslic3r/PrintConfig.cpp:3773 -#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3794 -#: src/libslic3r/PrintConfig.cpp:3816 src/libslic3r/PrintConfig.cpp:3827 -#: src/libslic3r/PrintConfig.cpp:3834 src/libslic3r/PrintConfig.cpp:3841 -#: src/libslic3r/PrintConfig.cpp:3852 src/libslic3r/PrintConfig.cpp:3861 -#: src/libslic3r/PrintConfig.cpp:3870 +#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:590 +#: src/slic3r/GUI/Tab.cpp:4960 src/slic3r/GUI/Tab.cpp:4961 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3884 +#: src/libslic3r/PrintConfig.cpp:3891 src/libslic3r/PrintConfig.cpp:3905 +#: src/libslic3r/PrintConfig.cpp:3916 src/libslic3r/PrintConfig.cpp:3926 +#: src/libslic3r/PrintConfig.cpp:3948 src/libslic3r/PrintConfig.cpp:3959 +#: src/libslic3r/PrintConfig.cpp:3966 src/libslic3r/PrintConfig.cpp:3973 +#: src/libslic3r/PrintConfig.cpp:3984 src/libslic3r/PrintConfig.cpp:3993 +#: src/libslic3r/PrintConfig.cpp:4002 msgid "Pad" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4722 -#: src/slic3r/GUI/Tab.cpp:4723 src/libslic3r/SLA/Hollowing.cpp:73 -#: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3880 -#: src/libslic3r/PrintConfig.cpp:3887 src/libslic3r/PrintConfig.cpp:3897 -#: src/libslic3r/PrintConfig.cpp:3906 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4978 +#: src/slic3r/GUI/Tab.cpp:4979 src/libslic3r/SLA/Hollowing.cpp:86 +#: src/libslic3r/SLA/Hollowing.cpp:91 src/libslic3r/SLA/Hollowing.cpp:106 +#: src/libslic3r/SLA/Hollowing.cpp:115 src/libslic3r/PrintConfig.cpp:4012 +#: src/libslic3r/PrintConfig.cpp:4019 src/libslic3r/PrintConfig.cpp:4029 +#: src/libslic3r/PrintConfig.cpp:4038 msgid "Hollowing" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:160 +#: src/slic3r/GUI/GUI_Factories.cpp:159 msgid "Add part" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:161 +#: src/slic3r/GUI/GUI_Factories.cpp:160 msgid "Add negative volume" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:162 +#: src/slic3r/GUI/GUI_Factories.cpp:161 msgid "Add modifier" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:163 +#: src/slic3r/GUI/GUI_Factories.cpp:162 msgid "Add support blocker" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:164 +#: src/slic3r/GUI/GUI_Factories.cpp:163 msgid "Add support enforcer" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:300 +#: src/slic3r/GUI/GUI_Factories.cpp:169 +msgid "Add text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:170 +msgid "Add negative text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:171 +msgid "Add text modifier" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:307 msgid "Select showing settings" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:407 src/slic3r/GUI/GUI_Factories.cpp:412 -#: src/slic3r/GUI/GUI_Factories.cpp:556 src/slic3r/GUI/GUI_Factories.cpp:562 +#: src/slic3r/GUI/GUI_Factories.cpp:414 src/slic3r/GUI/GUI_Factories.cpp:419 +#: src/slic3r/GUI/GUI_Factories.cpp:625 src/slic3r/GUI/GUI_Factories.cpp:631 #, possible-c-format, possible-boost-format msgid "Quick Add Settings (%s)" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:444 +#: src/slic3r/GUI/GUI_Factories.cpp:460 msgid "Remove the selected object" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:456 +#: src/slic3r/GUI/GUI_Factories.cpp:475 msgid "Load" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:461 src/slic3r/GUI/GUI_Factories.cpp:501 -#: src/slic3r/GUI/GUI_Factories.cpp:505 +#: src/slic3r/GUI/GUI_Factories.cpp:481 src/slic3r/GUI/GUI_Factories.cpp:566 +#: src/slic3r/GUI/GUI_Factories.cpp:570 msgid "Box" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Cylinder" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Slab" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:471 +#: src/slic3r/GUI/GUI_Factories.cpp:493 msgid "Gallery" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:488 src/slic3r/GUI/GUI_Factories.cpp:526 +#: src/slic3r/GUI/GUI_Factories.cpp:529 src/slic3r/GUI/GUI_Factories.cpp:549 +#: src/slic3r/GUI/GUI_ObjectList.cpp:660 +msgid "Text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:555 src/slic3r/GUI/GUI_Factories.cpp:558 +#: src/slic3r/GUI/GUI_Factories.cpp:595 msgid "Height range Modifier" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:535 +#: src/slic3r/GUI/GUI_Factories.cpp:604 msgid "Add settings" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:626 +#: src/slic3r/GUI/GUI_Factories.cpp:695 msgid "Change type" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:636 src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:705 src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Object" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Objects" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:658 +#: src/slic3r/GUI/GUI_Factories.cpp:727 msgid "Printable" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:686 +#: src/slic3r/GUI/GUI_Factories.cpp:755 src/slic3r/GUI/GUI_ObjectList.cpp:2070 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2582 +msgid "Invalidate cut info" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:770 msgid "Rename" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:696 +#: src/slic3r/GUI/GUI_Factories.cpp:780 msgid "Fix through the Netfabb" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:715 -msgid "Export as STL" +#: src/slic3r/GUI/GUI_Factories.cpp:799 +msgid "Export as STL/OBJ" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:726 +#: src/slic3r/GUI/GUI_Factories.cpp:810 msgid "Reload the selected volumes from disk" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:733 src/slic3r/GUI/Plater.cpp:3568 +#: src/slic3r/GUI/GUI_Factories.cpp:817 src/slic3r/GUI/Plater.cpp:3602 msgid "Replace with STL" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:733 +#: src/slic3r/GUI/GUI_Factories.cpp:817 msgid "Replace the selected volume with new STL" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Set extruder for selected items" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:778 src/slic3r/Utils/Repetier.cpp:126 -#: src/slic3r/Utils/Repetier.cpp:209 src/libslic3r/PrintConfig.cpp:635 -#: src/libslic3r/PrintConfig.cpp:2770 +#: src/slic3r/GUI/GUI_Factories.cpp:862 src/slic3r/Utils/Repetier.cpp:145 +#: src/slic3r/Utils/Repetier.cpp:226 src/libslic3r/PrintConfig.cpp:738 +#: src/libslic3r/PrintConfig.cpp:2790 src/libslic3r/PrintConfig.cpp:3851 msgid "Default" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale to print volume" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale the selected object to fit the print volume" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:835 src/slic3r/GUI/Plater.cpp:5655 +#: src/slic3r/GUI/GUI_Factories.cpp:921 src/slic3r/GUI/Plater.cpp:6213 msgid "Convert from imperial units" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:836 src/slic3r/GUI/Plater.cpp:5656 +#: src/slic3r/GUI/GUI_Factories.cpp:922 src/slic3r/GUI/Plater.cpp:6214 msgid "Revert conversion from imperial units" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:837 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:923 src/slic3r/GUI/Plater.cpp:6215 msgid "Convert from meters" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:838 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:924 src/slic3r/GUI/Plater.cpp:6215 msgid "Revert conversion from meters" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2135 -#: src/libslic3r/PrintConfig.cpp:4523 +#: src/slic3r/GUI/GUI_Factories.cpp:945 src/slic3r/GUI/GUI_ObjectList.cpp:2290 +#: src/libslic3r/PrintConfig.cpp:4689 msgid "Merge" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:859 +#: src/slic3r/GUI/GUI_Factories.cpp:945 msgid "Merge objects to the one multipart object" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Along X axis" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Mirror the selected object along the X axis" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Along Y axis" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Mirror the selected object along the Y axis" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Along Z axis" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Mirror the selected object along the Z axis" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror the selected object" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:901 src/slic3r/GUI/GUI_ObjectList.cpp:1696 +#: src/slic3r/GUI/GUI_Factories.cpp:977 +msgid "Edit text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:999 +msgid "Ability to change text, font, size, ..." +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1021 src/slic3r/GUI/GUI_ObjectList.cpp:1793 msgid "Add Shape" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:937 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "To objects" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:937 src/slic3r/GUI/GUI_Factories.cpp:954 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "Split the selected object into individual objects" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:940 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 msgid "To parts" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:940 src/slic3r/GUI/GUI_Factories.cpp:975 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 src/slic3r/GUI/GUI_Factories.cpp:1097 msgid "Split the selected object into individual parts" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4552 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 src/slic3r/GUI/GUI_Factories.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:4718 msgid "Split" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:944 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 msgid "Split the selected object" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:1084 -msgid "Add one more instance of the selected object" +#: src/slic3r/GUI/GUI_Factories.cpp:1225 src/slic3r/GUI/GUI_Factories.cpp:1243 +msgid "Set number of instances" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:1087 -msgid "Remove one instance of the selected object" +#: src/slic3r/GUI/GUI_Factories.cpp:1225 +msgid "Change the number of instances of the selected objects" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:1090 -msgid "Set number of instances" +#: src/slic3r/GUI/GUI_Factories.cpp:1237 +msgid "Add one more instance of the selected object" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:1090 +#: src/slic3r/GUI/GUI_Factories.cpp:1240 +msgid "Remove one instance of the selected object" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1243 msgid "Change the number of instances of the selected object" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill bed with instances" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill the remaining area of bed with instances of the selected object" msgstr "" @@ -3950,304 +5211,352 @@ msgstr "" msgid "Add layer range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:297 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:323 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 msgid "Name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:480 +#: src/slic3r/GUI/GUI_ObjectList.cpp:342 src/slic3r/GUI/GUI_ObjectList.cpp:513 msgid "Editing" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:400 +#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +msgid "Wrong volume index " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:433 msgid "No errors detected" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:409 +#: src/slic3r/GUI/GUI_ObjectList.cpp:442 #, possible-c-format, possible-boost-format msgid "Auto-repaired %1$d error" msgid_plural "Auto-repaired %1$d errors" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:415 +#: src/slic3r/GUI/GUI_ObjectList.cpp:448 #, possible-c-format, possible-boost-format msgid "%1$d degenerate facet" msgid_plural "%1$d degenerate facets" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:450 #, possible-c-format, possible-boost-format msgid "%1$d edge fixed" msgid_plural "%1$d edges fixed" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:452 #, possible-c-format, possible-boost-format msgid "%1$d facet removed" msgid_plural "%1$d facets removed" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:421 +#: src/slic3r/GUI/GUI_ObjectList.cpp:454 #, possible-c-format, possible-boost-format msgid "%1$d facet reversed" msgid_plural "%1$d facets reversed" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +#: src/slic3r/GUI/GUI_ObjectList.cpp:456 #, possible-c-format, possible-boost-format msgid "%1$d backward edge" msgid_plural "%1$d backward edges" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:426 src/slic3r/GUI/GUI_ObjectList.cpp:429 +#: src/slic3r/GUI/GUI_ObjectList.cpp:459 src/slic3r/GUI/GUI_ObjectList.cpp:462 #, possible-c-format, possible-boost-format msgid "%1$d open edge" msgid_plural "%1$d open edges" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:428 +#: src/slic3r/GUI/GUI_ObjectList.cpp:461 msgid "Remaining errors" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:436 +#: src/slic3r/GUI/GUI_ObjectList.cpp:469 msgid "Right button click the icon to fix STL through Netfabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:482 +#: src/slic3r/GUI/GUI_ObjectList.cpp:515 msgid "Right button click the icon to change the object settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:484 +#: src/slic3r/GUI/GUI_ObjectList.cpp:517 msgid "Click the icon to change the object settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:488 +#: src/slic3r/GUI/GUI_ObjectList.cpp:521 msgid "Right button click the icon to change the object printable property" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:523 msgid "Click the icon to change the object printable property" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:616 +#: src/slic3r/GUI/GUI_ObjectList.cpp:649 msgid "Change Extruder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1242 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4006 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1307 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4589 msgid "Instances to Separated Objects" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Volumes in Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1298 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1363 msgid "Add Settings for Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1299 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1364 msgid "Add Settings for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1300 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1365 msgid "Add Settings for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1339 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1404 msgid "Add Settings Bundle for Height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1340 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1405 msgid "Add Settings Bundle for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1341 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1406 msgid "Add Settings Bundle for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1509 src/slic3r/GUI/Plater.cpp:2380 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1582 src/slic3r/GUI/Plater.cpp:2453 msgid "Loading" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1540 src/slic3r/GUI/Plater.cpp:2417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1617 src/slic3r/GUI/Plater.cpp:2494 msgid "Loading file" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1548 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1625 msgid "Error!" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1638 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1721 msgid "Add Generic Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1663 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1761 msgid "Generic" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shape from Gallery" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shapes from Gallery" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1830 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1945 msgid "Remove paint-on supports" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1837 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 msgid "Remove paint-on seam" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1844 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 msgid "Remove Multi Material painting" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1850 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1972 msgid "Shift objects to bed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1856 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1978 msgid "Remove variable layer height" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1877 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1999 msgid "Delete Settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1901 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2023 msgid "Delete All Instances from Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1917 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2039 msgid "Delete Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1949 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2057 +msgid "Delete connector from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2058 +msgid "Delete solid part from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2059 +msgid "Delete negative volume from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2061 +msgid "" +"To save cut information you can delete all connectors from all related " +"objects." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2064 +msgid "" +"This action will break a cut information.\n" +"After that PrusaSlicer can't guarantee model consistency.\n" +"\n" +"To manipulate with solid parts or negative volumes you have to invalidate " +"cut infornation first." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2072 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2612 +msgid "Delete all connectors" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2103 msgid "From Object List You can't delete the last solid part from object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1953 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2112 msgid "Delete Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1976 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2138 msgid "Last instance of an object cannot be deleted." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1980 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +msgid "Instance cannot be deleted from cut object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2146 msgid "Delete Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2004 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2170 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2008 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2174 msgid "Split to Parts" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2177 src/slic3r/GUI/Plater.cpp:3133 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"splitting the object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2297 msgid "Merged" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2237 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2392 msgid "Merge all parts to the one single object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2269 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2424 msgid "Add Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2438 -msgid "Group manipulation" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2695 +msgid "Cut Connectors information" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2453 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2705 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2768 msgid "Object manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2486 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2714 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1472 +msgid "Group manipulation" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2802 msgid "Object Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2806 msgid "Part Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2495 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2811 msgid "Layer range Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2501 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2817 msgid "Part manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2825 msgid "Instance manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Height ranges" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Settings for height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2750 -msgid "Delete Selected Item" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2943 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3363 msgid "Delete Selected" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3019 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3047 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3067 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3441 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3469 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3489 msgid "Add Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3113 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3535 msgid "" "Cannot insert a new layer range after the current layer range.\n" "The next layer range is too thin to be split to two\n" "without violating the minimum layer height." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3117 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3539 msgid "" "Cannot insert a new layer range between the current and the next layer " "range.\n" @@ -4255,240 +5564,289 @@ msgid "" "is thinner than the minimum layer height allowed." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3122 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3544 msgid "" "Cannot insert a new layer range after the current layer range.\n" "Current layer range overlaps with the next layer range." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3603 msgid "Edit Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3500 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3989 msgid "Selection-Remove from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4001 msgid "Selection-Add from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3649 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4138 msgid "Object or Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Part" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 msgid "Layer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3652 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4141 msgid "Unsupported selection" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3653 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 #, possible-c-format, possible-boost-format msgid "You started your selection with %s Item." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3654 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4143 #, possible-c-format, possible-boost-format msgid "In this mode you can select only other %s Items%s" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3657 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4146 msgid "of a current Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3662 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3737 src/slic3r/GUI/Plater.cpp:181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4151 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4226 src/slic3r/GUI/Plater.cpp:197 msgid "Info" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3784 -msgid "You can't change a type of the last solid part of the object." -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 msgid "Negative Volume" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Modifier" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Blocker" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Enforcer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Select type of part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3795 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4359 msgid "Change Part Type" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Enter new name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Renaming" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4091 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4681 msgid "Repairing model" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4120 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4691 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"repairing the mesh." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4711 msgid "Fix through NetFabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4123 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4714 msgid "Fixing through NetFabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4153 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4744 msgid "The following model was repaired successfully" msgid_plural "The following models were repaired successfully" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4159 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4750 msgid "Folowing model repair failed" msgid_plural "Folowing models repair failed" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4164 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4755 msgid "Repairing was canceled" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4276 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4869 msgid "Change Extruders" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Printable group" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Unprintable group" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Printable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Unprintable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Printable Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Unprintable Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:55 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:84 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:61 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:96 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1132 msgid "World coordinates" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:56 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:85 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:97 msgid "Local coordinates" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:60 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:67 msgid "Select coordinate space, in which the transformation will be performed." msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:141 src/libslic3r/GCode.cpp:540 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:157 src/libslic3r/GCode.cpp:491 msgid "Object name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:201 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:521 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:221 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:710 msgid "Position" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:202 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:522 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:222 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:711 #: src/slic3r/GUI/Mouse3DController.cpp:478 #: src/slic3r/GUI/Mouse3DController.cpp:499 msgid "Rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:250 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:239 +msgid "Size [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "Mirror along" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +#, possible-c-format, possible-boost-format +msgid " %c " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "axis" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:279 #, possible-c-format, possible-boost-format msgid "Toggle %c axis mirroring" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:284 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:329 msgid "Set Mirror" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:324 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:336 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:348 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:374 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:387 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:393 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:401 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:428 msgid "Drop to bed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:445 msgid "Reset rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 msgid "Reset Rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:398 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:400 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:490 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:519 msgid "Reset scale" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:539 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546 +msgid "Reset skew" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:553 msgid "Inches" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:523 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:712 msgid "Scale factors" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:577 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:740 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:752 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:793 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:801 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +msgid "Rotate (relative)" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:751 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:800 +msgid "Translate (relative) [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:829 msgid "Translate" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:640 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:905 msgid "" "You cannot use non-uniform scaling mode for multiple objects/parts selection" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:820 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +msgid "Left handed" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1133 +msgid "Object coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1134 +msgid "Part coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1176 msgid "Set Position" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:852 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1220 msgid "Set Orientation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:931 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1351 msgid "Set Scale" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1368 +msgid "Set Size" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1427 msgid "" "The currently manipulated object is tilted (rotation angles are not " "multiples of 90°).\n" @@ -4497,7 +5855,7 @@ msgid "" "once the rotation is embedded into the object coordinates." msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:983 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1430 msgid "" "This operation is irreversible.\n" "Do you want to proceed?" @@ -4521,168 +5879,67 @@ msgstr "" msgid "Change Option %s" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:211 -msgid "View" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/libslic3r/PrintConfig.cpp:808 -msgid "Height" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:219 src/libslic3r/PrintConfig.cpp:3032 -msgid "Width" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2016 -msgid "Fan speed" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1991 -msgid "Temperature" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:223 -msgid "Volumetric flow rate" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:228 -msgid "Show" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/GUI_Preview.cpp:254 -msgid "Feature types" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:330 -#: src/libslic3r/ExtrusionEntity.cpp:352 -msgid "Perimeter" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:331 -#: src/libslic3r/ExtrusionEntity.cpp:354 -msgid "External perimeter" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:332 -#: src/libslic3r/ExtrusionEntity.cpp:356 -msgid "Overhang perimeter" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:333 -#: src/libslic3r/ExtrusionEntity.cpp:358 -msgid "Internal infill" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:334 -#: src/libslic3r/ExtrusionEntity.cpp:360 src/libslic3r/PrintConfig.cpp:1407 -#: src/libslic3r/PrintConfig.cpp:2392 src/libslic3r/PrintConfig.cpp:2404 -msgid "Solid infill" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:335 -#: src/libslic3r/ExtrusionEntity.cpp:362 src/libslic3r/PrintConfig.cpp:1416 -#: src/libslic3r/PrintConfig.cpp:2889 src/libslic3r/PrintConfig.cpp:2902 -msgid "Top solid infill" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:337 -#: src/libslic3r/ExtrusionEntity.cpp:366 -msgid "Bridge infill" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:338 -#: src/libslic3r/ExtrusionEntity.cpp:368 src/libslic3r/PrintConfig.cpp:1325 -msgid "Gap fill" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:248 src/libslic3r/ExtrusionEntity.cpp:339 -#: src/libslic3r/ExtrusionEntity.cpp:370 -msgid "Skirt/Brim" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:250 src/libslic3r/ExtrusionEntity.cpp:341 -#: src/libslic3r/ExtrusionEntity.cpp:374 src/libslic3r/PrintConfig.cpp:2736 -msgid "Support material interface" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:251 src/slic3r/GUI/Tab.cpp:1634 -#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/ExtrusionEntity.cpp:376 -msgid "Wipe tower" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:728 +#: src/slic3r/GUI/GUI_Preview.cpp:581 msgid "NOTE:" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:729 +#: src/slic3r/GUI/GUI_Preview.cpp:582 #, possible-boost-format msgid "Sliced object \"%1%\" looks like a logo or a sign" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:730 +#: src/slic3r/GUI/GUI_Preview.cpp:583 msgid "Apply color change automatically" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:1058 -msgid "Shells" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:1059 -msgid "Tool marker" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:1060 -msgid "Legend/Estimated printing time" -msgstr "" - -#: src/slic3r/GUI/HintNotification.cpp:771 -#: src/slic3r/GUI/HintNotification.cpp:797 -#: src/slic3r/GUI/NotificationManager.cpp:374 -#: src/slic3r/GUI/NotificationManager.cpp:391 +#: src/slic3r/GUI/HintNotification.cpp:773 +#: src/slic3r/GUI/HintNotification.cpp:799 +#: src/slic3r/GUI/NotificationManager.cpp:457 +#: src/slic3r/GUI/NotificationManager.cpp:474 msgid "More" msgstr "" -#: src/slic3r/GUI/HintNotification.cpp:912 +#: src/slic3r/GUI/HintNotification.cpp:914 msgid "Open Preferences." msgstr "" -#: src/slic3r/GUI/HintNotification.cpp:1004 +#: src/slic3r/GUI/HintNotification.cpp:1006 msgid "Open Documentation in web browser." msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:527 +#: src/slic3r/GUI/ImGuiWrapper.cpp:666 msgid "Edit" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:960 src/slic3r/GUI/Search.cpp:470 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1166 src/slic3r/GUI/Search.cpp:531 msgid "Use for search" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:961 src/slic3r/GUI/Search.cpp:463 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1167 src/slic3r/GUI/Search.cpp:524 msgid "Category" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:963 src/slic3r/GUI/Search.cpp:465 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1169 src/slic3r/GUI/Search.cpp:526 msgid "Search in English" msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:174 -msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "" - -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:183 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:168 msgid "Arranging" msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:207 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:204 msgid "Arranging canceled." msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:208 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:205 msgid "Arranging done." msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:253 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:225 +msgid "Could not arrange model objects! Some geometries may be invalid." +msgstr "" + +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:265 #, possible-c-format, possible-boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -4690,1377 +5947,1438 @@ msgid "" "%s" msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:119 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:108 msgid "Filling bed" msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:130 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:140 msgid "Bed filling canceled." msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:131 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:141 msgid "Bed filling done." msgstr "" -#: src/slic3r/GUI/Jobs/Job.cpp:111 -msgid "ERROR: not enough resources to execute a new job." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:148 src/slic3r/GUI/Jobs/EmbossJob.cpp:596 +msgid "Can't create empty volume." msgstr "" -#: src/slic3r/GUI/Jobs/PlaterJob.cpp:13 -msgid "An unexpected error occured" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:201 +msgid "Can't create empty object." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:21 -msgid "Best surface quality" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:208 +msgid "Add Emboss text object" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:23 -msgid "Optimize object rotation for best surface quality." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:247 +msgid "Created text volume is empty. Change text or font." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 -msgid "Reduced overhang slopes" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:465 +msgid "" +"It is used default volume for embossed text, try to change text or font to " +"fix it." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:26 -msgid "" -"Optimize object rotation to have minimum amount of overhangs needing support " -"structures.\n" -"Note that this method will try to find the best surface of the object for " -"touching the print bed if no elevation is set." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:549 +#, possible-boost-format +msgid "Text: %1%" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:30 -msgid "Lowest Z height" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:593 +msgid "Bad object to create volume." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:32 -msgid "Rotate the model to have the lowest z height for faster print time." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:598 +msgid "Add Emboss text Volume" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:59 -msgid "Searching for optimal orientation" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:698 +msgid "Font doesn't have any shape for given text." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:77 -msgid "Orientation search canceled." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:738 +msgid "There is no volume in projection direction." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:78 -msgid "Orientation found." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:787 +msgid "There is no valid surface for text projection." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:36 -msgid "Choose SLA archive:" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:823 +msgid "Issue during embossing the text." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:40 -msgid "Import file" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:22 +msgid "Best surface quality" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47 -msgid "Import model and profile" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 +msgid "Optimize object rotation for best surface quality." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48 -msgid "Import profile only" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:25 +msgid "Reduced overhang slopes" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:49 -msgid "Import model only" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:27 +msgid "" +"Optimize object rotation to have minimum amount of overhangs needing support " +"structures.\n" +"Note that this method will try to find the best surface of the object for " +"touching the print bed if no elevation is set." +msgstr "" + +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:31 +msgid "Lowest Z height" +msgstr "" + +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:33 +msgid "Rotate the model to have the lowest z height for faster print time." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60 -msgid "Accurate" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:53 +msgid "Searching for optimal orientation" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61 -msgid "Balanced" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:83 +msgid "Orientation search canceled." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:62 -msgid "Quick" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:84 +msgid "Orientation found." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:140 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:49 msgid "Importing SLA archive" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:158 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:77 msgid "" "The SLA archive doesn't contain any presets. Please activate some SLA " "printer preset first before importing that SLA archive." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:164 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:81 +msgid "Import is unavailable for this archive format." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:86 msgid "Importing canceled." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:165 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:87 msgid "Importing done." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:187 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:108 msgid "The file does not exist." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:221 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135 msgid "" "The imported SLA archive did not contain any presets. The current SLA " "presets were used as fallback." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:234 src/slic3r/GUI/Plater.cpp:2458 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:148 src/slic3r/GUI/Plater.cpp:2535 msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:236 src/slic3r/GUI/Plater.cpp:2460 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:150 src/slic3r/GUI/Plater.cpp:2537 msgid "Attention!" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:166 +msgid "The profile in the imported archive is corrupt and will not be loaded." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:178 +msgid "" +"No object could be retrieved from the archive. The slices might be corrupted " +"or missing." +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1184 msgid "Keyboard Shortcuts" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:77 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:86 msgid "New project, clear plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:78 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 msgid "Open project AMF/3MF with config, clear plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 msgid "Save project (3mf)" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 msgid "Save project as (3mf)" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:81 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 msgid "(Re)slice" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:83 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:92 msgid "Import STL/3MF/STEP/OBJ/AMF without config, keep plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:84 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 msgid "Import Config from ini/amf/3mf/gcode" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:85 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6543 src/libslic3r/PrintConfig.cpp:4423 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:96 src/slic3r/GUI/Plater.cpp:948 +#: src/slic3r/GUI/Plater.cpp:7161 src/libslic3r/PrintConfig.cpp:4575 msgid "Export G-code" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:97 src/slic3r/GUI/Plater.cpp:7162 msgid "Send G-code" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 msgid "Export config" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 src/slic3r/GUI/Plater.cpp:896 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 src/slic3r/GUI/Plater.cpp:931 msgid "Export to SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:91 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 msgid "Eject SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 msgid "Select all objects" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 msgid "Deselect all" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:95 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 msgid "Delete selected" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 -msgid "Copy to clipboard" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 msgid "Paste from clipboard" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Reload plater from disk" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 msgid "Select Plater Tab" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 msgid "Select Print Settings Tab" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 msgid "Select Filament Settings Tab" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 msgid "Select Printer Settings Tab" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 msgid "Switch to 3D" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 msgid "Switch to Preview" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 -#: src/slic3r/GUI/PrintHostDialogs.cpp:217 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +#: src/slic3r/GUI/PrintHostDialogs.cpp:267 msgid "Print host upload queue" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/MainFrame.cpp:75 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 src/slic3r/GUI/MainFrame.cpp:77 msgid "Open new instance" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 msgid "Camera view" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 msgid "Show/Hide object/instance labels" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Preferences.cpp:46 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Preferences.cpp:57 +#: src/slic3r/GUI/Preferences.cpp:165 src/slic3r/GUI/Preferences.cpp:188 +#: src/slic3r/GUI/Preferences.cpp:207 src/slic3r/GUI/Preferences.cpp:215 msgid "Preferences" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 msgid "Show keyboard shortcuts list" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 msgid "Commands" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 msgid "Add Instance of the selected object" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Remove Instance of the selected object" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 msgid "" "Press to select multiple objects\n" "or move multiple objects with mouse" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 msgid "Press to activate selection rectangle" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 msgid "Press to activate deselection rectangle" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Arrow Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 msgid "Move selection 10 mm in positive Y direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Arrow Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 msgid "Move selection 10 mm in negative Y direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Arrow Left" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 msgid "Move selection 10 mm in negative X direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Arrow Right" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 msgid "Move selection 10 mm in positive X direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Any arrow" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 msgid "Movement step set to 1 mm" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Movement in camera space" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Page Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Rotate selection 45 degrees CCW" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Page Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Rotate selection 45 degrees CW" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 msgid "Gizmo move" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 msgid "Gizmo scale" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Gizmo rotate" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Gizmo cut" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 msgid "Gizmo Place face on bed" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 msgid "Gizmo SLA hollow" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 msgid "Gizmo SLA support points" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 msgid "Gizmo FDM paint-on supports" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 msgid "Gizmo FDM paint-on seam" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 msgid "Gizmo Multi Material painting" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +msgid "Gizmo Text emboss / engrave" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 msgid "Unselect gizmo or clear selection" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 msgid "Change camera type (perspective, orthographic)" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 msgid "Zoom to Bed" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 msgid "" "Zoom to selected object\n" "or all objects in scene, if none selected" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 msgid "Zoom in" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Zoom out" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Switch between Editor/Preview" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Collapse/Expand the sidebar" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 msgid "Minimize application" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 src/slic3r/GUI/MainFrame.cpp:284 -#: src/slic3r/GUI/MainFrame.cpp:333 src/slic3r/GUI/MainFrame.cpp:445 -#: src/slic3r/GUI/MainFrame.cpp:448 src/slic3r/GUI/MainFrame.cpp:470 -#: src/slic3r/GUI/MainFrame.cpp:473 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 src/slic3r/GUI/MainFrame.cpp:329 +#: src/slic3r/GUI/MainFrame.cpp:378 src/slic3r/GUI/MainFrame.cpp:490 +#: src/slic3r/GUI/MainFrame.cpp:493 src/slic3r/GUI/MainFrame.cpp:515 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 msgid "Gizmo move: Press to snap by 1mm" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 msgid "Gizmo scale: Press to snap by 5%" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 msgid "Gizmo scale: Scale selection to fit print volume" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 msgid "Gizmo scale: Press to activate one direction scaling" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 msgid "Gizmo scale: Press to scale selected objects around their own center" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 msgid "Gizmo rotate: Press to rotate selected objects around their own center" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "Gizmos" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "" "The following shortcuts are applicable when the specified gizmo is active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 msgid "Set selected items as Printable/Unprintable" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:203 msgid "Set default extruder for the selected items" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 msgid "Set extruder number for the selected items" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 msgid "Objects List" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/MainFrame.cpp:1611 msgid "Open a G-code file" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 -#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 -#: src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 src/slic3r/GUI/MainFrame.cpp:1443 +#: src/slic3r/GUI/MainFrame.cpp:1447 src/slic3r/GUI/MainFrame.cpp:1616 +#: src/slic3r/GUI/MainFrame.cpp:1620 msgid "Reload the plater from disk" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 msgid "Vertical slider - Move active thumb Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:228 msgid "Vertical slider - Move active thumb Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 msgid "Horizontal slider - Move active thumb Left" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 msgid "Horizontal slider - Move active thumb Right" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:231 msgid "On/Off one layer mode of the vertical slider" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 -msgid "Show/Hide Legend and Estimated printing time" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:232 +msgid "Show/Hide legend" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 msgid "Show/Hide G-code window" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4480 -#: src/slic3r/GUI/Tab.cpp:2832 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 src/slic3r/GUI/Plater.cpp:4562 +#: src/slic3r/GUI/Tab.cpp:2736 msgid "Preview" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 msgid "Move active thumb Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 msgid "Move active thumb Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 msgid "Set upper thumb as active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 msgid "Set lower thumb as active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 msgid "Add color change marker for current layer" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:238 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:244 msgid "Delete color change marker for current layer" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:250 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:251 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:245 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:256 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:257 msgid "" "Press to speed up 5 times while moving thumb\n" "with arrow keys or mouse wheel" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "Vertical Slider" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "" "The following shortcuts are applicable in G-code preview when the vertical " "slider is active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Move active thumb Left" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Move active thumb Right" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Set left thumb as active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Set right thumb as active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "Horizontal Slider" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "" "The following shortcuts are applicable in G-code preview when the horizontal " "slider is active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:278 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:284 msgid "Keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:77 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open a new PrusaSlicer instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:93 msgid "G-code preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:1388 msgid "Open G-code viewer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:91 src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open PrusaSlicer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:93 msgid "Open new G-code viewer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:225 +#: src/slic3r/GUI/MainFrame.cpp:227 msgid "Closing PrusaSlicer. Current project is modified." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "PrusaSlicer is closing" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "Closing PrusaSlicer while some presets are modified." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:285 src/slic3r/GUI/MainFrame.cpp:335 -#: src/slic3r/GUI/Tab.hpp:427 src/slic3r/GUI/Tab.hpp:550 +#: src/slic3r/GUI/MainFrame.cpp:330 src/slic3r/GUI/MainFrame.cpp:380 +#: src/slic3r/GUI/Tab.hpp:413 src/slic3r/GUI/Tab.hpp:539 msgid "Print Settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:535 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:384 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:520 msgid "Material Settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:461 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:382 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:448 msgid "Filament Settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:287 src/slic3r/GUI/MainFrame.cpp:341 -#: src/slic3r/GUI/Tab.hpp:503 +#: src/slic3r/GUI/MainFrame.cpp:332 src/slic3r/GUI/MainFrame.cpp:386 +#: src/slic3r/GUI/Tab.hpp:488 msgid "Printer Settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:632 src/slic3r/GUI/Plater.cpp:1719 -#: src/slic3r/GUI/Plater.cpp:2850 +#: src/slic3r/GUI/MainFrame.cpp:685 src/slic3r/GUI/Plater.cpp:1728 +#: src/slic3r/GUI/Plater.cpp:2879 msgid "Untitled" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:655 +#: src/slic3r/GUI/MainFrame.cpp:710 msgid "based on Slic3r" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Prusa 3D &Drivers" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Open the Prusa3D drivers download page in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Software &Releases" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open the software releases page in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1081 +#: src/slic3r/GUI/MainFrame.cpp:1158 #, possible-c-format, possible-boost-format msgid "%s &Website" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1082 +#: src/slic3r/GUI/MainFrame.cpp:1159 #, possible-c-format, possible-boost-format msgid "Open the %s website in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "System &Info" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "Show system information" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show &Configuration Folder" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show user configuration folder (datadir)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "Report an I&ssue" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 #, possible-c-format, possible-boost-format msgid "Report an issue on %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 #, possible-c-format, possible-boost-format msgid "&About %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 msgid "Show about dialog" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1177 msgid "Show Tip of the Day" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1104 +#: src/slic3r/GUI/MainFrame.cpp:1181 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/MainFrame.cpp:1184 msgid "Show the list of the keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso View" msgstr "" #. TRN To be shown in the main menu View->Top #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2917 -#: src/libslic3r/PrintConfig.cpp:2926 +#: src/slic3r/GUI/MainFrame.cpp:1202 src/libslic3r/PrintConfig.cpp:3005 +#: src/libslic3r/PrintConfig.cpp:3014 msgid "Top" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1125 +#: src/slic3r/GUI/MainFrame.cpp:1202 msgid "Top View" msgstr "" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:446 -#: src/libslic3r/PrintConfig.cpp:455 +#: src/slic3r/GUI/MainFrame.cpp:1205 src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:474 msgid "Bottom" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1205 msgid "Bottom View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2274 +#: src/slic3r/GUI/MainFrame.cpp:1209 src/libslic3r/PrintConfig.cpp:2300 msgid "Rear" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1209 msgid "Rear View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "&New Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "Start a new project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "&Open Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "Open a project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1157 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Recent projects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1169 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Save Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "Save current project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save Project &as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save current project file as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Import STL/3MF/STEP/OBJ/AM&F" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Load a model" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Import STL (Imperial Units)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Load an model saved with imperial units" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Import SL1 / SL1S Archive" +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Import SLA Archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Load an SLA archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Import ZIP Achive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Load an SL1 / Sl1S archive" +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Load a zip achive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Import &Config" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Load exported configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Import Config from &Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Load configuration from project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Import Config &Bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Load presets from a bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1231 +#: src/slic3r/GUI/MainFrame.cpp:1311 msgid "&Import" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1314 src/slic3r/GUI/MainFrame.cpp:1676 msgid "Export &G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1314 msgid "Export current plate as G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1318 src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1318 msgid "Send to print current plate as G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export G-code to SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export Plate as &STL" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export Plate as &STL/OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export current plate as STL" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export current plate as STL/OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export Plate as STL &Including Supports" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export Plate as STL/OBJ &Including Supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export current plate as STL including supports" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export current plate as STL/OBJ including supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export &Toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export &Config" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export current configuration to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export Config &Bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export all presets to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export Config Bundle With Physical Printers" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export all presets including physical printers to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1270 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "&Export" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Ejec&t SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Quick Slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Slice a file into a G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Quick Slice and Save As" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Slice a file into a G-code, save as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat Last Quick Slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat last quick slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "(Re)Slice No&w" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "Start new slicing process" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "&Repair STL file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "Automatically repair an STL file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:1388 msgid "&G-code Preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1392 +msgid "E&xit" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1392 src/slic3r/GUI/UpdateDialogs.cpp:376 +#: src/slic3r/GUI/UpdateDialogs.cpp:423 +#, possible-c-format, possible-boost-format +msgid "Exit %s" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 msgid "&Quit" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 #, possible-c-format, possible-boost-format msgid "Quit %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1410 msgid "&Select All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1327 +#: src/slic3r/GUI/MainFrame.cpp:1411 msgid "Selects all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1413 msgid "D&eselect All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1414 msgid "Deselects all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1417 msgid "&Delete Selected" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1334 +#: src/slic3r/GUI/MainFrame.cpp:1418 msgid "Deletes the current selection" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1336 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Delete &All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1421 msgid "Deletes all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1425 msgid "&Undo" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1344 +#: src/slic3r/GUI/MainFrame.cpp:1428 msgid "&Redo" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1433 msgid "&Copy" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1350 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Copy selection to clipboard" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1352 +#: src/slic3r/GUI/MainFrame.cpp:1436 msgid "&Paste" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1353 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "Paste clipboard" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 -#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 +#: src/slic3r/GUI/MainFrame.cpp:1442 src/slic3r/GUI/MainFrame.cpp:1446 +#: src/slic3r/GUI/MainFrame.cpp:1615 src/slic3r/GUI/MainFrame.cpp:1619 msgid "Re&load from Disk" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1368 +#: src/slic3r/GUI/MainFrame.cpp:1452 msgid "Searc&h" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1369 +#: src/slic3r/GUI/MainFrame.cpp:1453 msgid "Search in settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "&Plater Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "Show the plater" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "P&rint Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "Show the print settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1469 src/slic3r/GUI/MainFrame.cpp:1679 msgid "&Filament Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1469 msgid "Show the filament settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Print&er Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Show the printer settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "3&D" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "Show the 3D editing view" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Pre&view" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Show the 3D slices preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/MainFrame.cpp:1488 msgid "Open the dialog to modify shape gallery" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Print &Host Upload Queue" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Display the Print Host Upload Queue window" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open New Instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1424 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 +#: src/slic3r/GUI/MainFrame.cpp:1507 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1727 msgid "Compare Presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/MainFrame.cpp:1507 msgid "Compare presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show &Labels" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show object/instance labels in 3D scene" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1437 +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show Legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show legend in preview" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1523 msgid "&Collapse Sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1523 src/slic3r/GUI/Plater.cpp:2347 msgid "Collapse sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "&Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1543 src/slic3r/GUI/MainFrame.cpp:1650 msgid "&File" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1458 +#: src/slic3r/GUI/MainFrame.cpp:1544 msgid "&Edit" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1459 +#: src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Window" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 +#: src/slic3r/GUI/MainFrame.cpp:1546 src/slic3r/GUI/MainFrame.cpp:1651 msgid "&View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 +#: src/slic3r/GUI/MainFrame.cpp:1549 src/slic3r/GUI/MainFrame.cpp:1654 msgid "&Help" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/MainFrame.cpp:1611 msgid "&Open G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open &PrusaSlicer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legend" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1676 msgid "E&xport" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end to print" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1679 msgid "Mate&rial Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1613 +#: src/slic3r/GUI/MainFrame.cpp:1703 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1625 +#: src/slic3r/GUI/MainFrame.cpp:1715 msgid "No previously sliced file." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid "Previously sliced file (" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid ") not found." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1633 +#: src/slic3r/GUI/MainFrame.cpp:1723 msgid "File Not Found" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 #, possible-c-format, possible-boost-format msgid "Save %s file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "SVG" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1680 +#: src/slic3r/GUI/MainFrame.cpp:1770 msgid "Save zip file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6064 src/slic3r/GUI/Tab.cpp:1666 -#: src/slic3r/GUI/Tab.cpp:4730 +#: src/slic3r/GUI/MainFrame.cpp:1779 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6654 src/slic3r/GUI/Tab.cpp:1628 +#: src/slic3r/GUI/Tab.cpp:4986 msgid "Slicing" msgstr "" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1691 +#: src/slic3r/GUI/MainFrame.cpp:1781 #, possible-c-format, possible-boost-format msgid "Processing %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1714 +#: src/slic3r/GUI/MainFrame.cpp:1804 #, possible-boost-format msgid "%1% was successfully sliced." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1717 +#: src/slic3r/GUI/MainFrame.cpp:1807 msgid "Slicing Done!" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1733 +#: src/slic3r/GUI/MainFrame.cpp:1823 msgid "Select the STL file to repair:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1743 +#: src/slic3r/GUI/MainFrame.cpp:1833 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1754 +#: src/slic3r/GUI/MainFrame.cpp:1844 msgid "Your file was repaired." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4528 +#: src/slic3r/GUI/MainFrame.cpp:1844 src/libslic3r/PrintConfig.cpp:4694 msgid "Repair" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1768 +#: src/slic3r/GUI/MainFrame.cpp:1858 msgid "Save configuration as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1785 +#: src/slic3r/GUI/MainFrame.cpp:1875 msgid "Loading of a configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 +#: src/slic3r/GUI/MainFrame.cpp:1877 src/slic3r/GUI/MainFrame.cpp:1944 msgid "Select configuration to load:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1816 +#: src/slic3r/GUI/MainFrame.cpp:1908 msgid "Exporting configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1817 +#: src/slic3r/GUI/MainFrame.cpp:1909 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1826 +#: src/slic3r/GUI/MainFrame.cpp:1918 msgid "Save presets bundle as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1849 +#: src/slic3r/GUI/MainFrame.cpp:1941 msgid "Loading of a configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1879 +#: src/slic3r/GUI/MainFrame.cpp:1971 #, possible-c-format, possible-boost-format msgid "%d presets successfully imported." msgstr "" @@ -6129,206 +7447,253 @@ msgstr "" msgid "%s information" msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:752 +#: src/slic3r/GUI/NotificationManager.hpp:899 msgid "3D Mouse disconnected." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "Configuration update is available." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "See more." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:761 +#: src/slic3r/GUI/NotificationManager.hpp:908 msgid "" "You have just added a G-code for color change, but its value is empty.\n" "To export the G-code correctly, check the \"Color Change G-code\" in " "\"Printer Settings > Custom G-code\"" msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:764 +#: src/slic3r/GUI/NotificationManager.hpp:911 msgid "" "No color change event was added to the print. The print does not look like a " "sign." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:766 +#: src/slic3r/GUI/NotificationManager.hpp:913 msgid "Desktop integration was successful." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:768 +#: src/slic3r/GUI/NotificationManager.hpp:915 msgid "Desktop integration failed." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:770 +#: src/slic3r/GUI/NotificationManager.hpp:917 msgid "Undo desktop integration was successful." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:772 +#: src/slic3r/GUI/NotificationManager.hpp:919 msgid "Undo desktop integration failed." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:773 +#: src/slic3r/GUI/NotificationManager.hpp:920 msgid "Exporting." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:664 +#: src/slic3r/GUI/NotificationManager.hpp:924 +msgid "" +"PrusaSlicer recieved a download request from Printables.com, but it's not " +"allowed. You can allow it" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:925 +msgid "here." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:773 msgid "Open Folder." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:701 +#: src/slic3r/GUI/NotificationManager.cpp:811 msgid "Eject drive" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:885 +#: src/slic3r/GUI/NotificationManager.cpp:1054 +#: src/slic3r/GUI/NotificationManager.cpp:1267 +#: src/slic3r/GUI/NotificationManager.cpp:1472 msgid "ERROR" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:890 -msgid "CANCELED" +#: src/slic3r/GUI/NotificationManager.cpp:1269 +#: src/slic3r/GUI/NotificationManager.cpp:1377 +msgid "COMPLETED" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:895 -msgid "COMPLETED" +#: src/slic3r/GUI/NotificationManager.cpp:1467 +msgid "RESOLVING ADDRESS" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:1477 +msgid "CANCELED" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:937 +#: src/slic3r/GUI/NotificationManager.cpp:1539 msgid "Cancel upload" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:996 +#: src/slic3r/GUI/NotificationManager.cpp:1648 #, possible-c-format, possible-boost-format msgid "%1$d object was loaded with custom supports." msgid_plural "%1$d objects were loaded with custom supports." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/NotificationManager.cpp:997 +#: src/slic3r/GUI/NotificationManager.cpp:1649 #, possible-c-format, possible-boost-format msgid "%1$d object was loaded with custom seam." msgid_plural "%1$d objects were loaded with custom seam." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/NotificationManager.cpp:998 +#: src/slic3r/GUI/NotificationManager.cpp:1650 #, possible-c-format, possible-boost-format msgid "%1$d object was loaded with multimaterial painting." msgid_plural "%1$d objects were loaded with multimaterial painting." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/NotificationManager.cpp:999 +#: src/slic3r/GUI/NotificationManager.cpp:1651 #, possible-c-format, possible-boost-format msgid "%1$d object was loaded with variable layer height." msgid_plural "%1$d objects were loaded with variable layer height." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/NotificationManager.cpp:1000 +#: src/slic3r/GUI/NotificationManager.cpp:1652 #, possible-c-format, possible-boost-format msgid "%1$d object was loaded with partial sinking." msgid_plural "%1$d objects were loaded with partial sinking." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1653 +#, possible-c-format, possible-boost-format +msgid "%1$d object was loaded as a part of cut object." +msgid_plural "%1$d objects were loaded as parts of cut object" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Slicing finished." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export G-Code." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1447 -#: src/slic3r/GUI/NotificationManager.cpp:1454 -#: src/slic3r/GUI/NotificationManager.cpp:1470 -#: src/slic3r/GUI/NotificationManager.cpp:1476 -#: src/slic3r/GUI/NotificationManager.cpp:1547 +#: src/slic3r/GUI/NotificationManager.cpp:2101 +#: src/slic3r/GUI/NotificationManager.cpp:2108 +#: src/slic3r/GUI/NotificationManager.cpp:2124 +#: src/slic3r/GUI/NotificationManager.cpp:2130 +#: src/slic3r/GUI/NotificationManager.cpp:2201 msgid "ERROR:" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1459 -#: src/slic3r/GUI/NotificationManager.cpp:1486 -#: src/slic3r/GUI/NotificationManager.cpp:1494 -#: src/slic3r/GUI/NotificationManager.cpp:1505 src/slic3r/GUI/Plater.cpp:3197 +#: src/slic3r/GUI/NotificationManager.cpp:2113 +#: src/slic3r/GUI/NotificationManager.cpp:2140 +#: src/slic3r/GUI/NotificationManager.cpp:2148 +#: src/slic3r/GUI/NotificationManager.cpp:2159 src/slic3r/GUI/Plater.cpp:3220 msgid "WARNING:" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1598 +#: src/slic3r/GUI/NotificationManager.cpp:2275 msgid "Exporting finished." msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:50 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 msgid "Paint-on seam" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:52 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:68 +msgid "Cut connectors" +msgstr "" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:70 msgid "Sinking" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:110 msgid "Instances" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:98 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:266 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:114 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:275 #, possible-c-format, possible-boost-format msgid "Instance %d" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4568 -#: src/slic3r/GUI/Tab.cpp:4659 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:121 src/slic3r/GUI/Tab.cpp:4805 +#: src/slic3r/GUI/Tab.cpp:4942 msgid "Layers" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 msgid "Range" msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:258 +#: src/slic3r/GUI/OpenGLManager.cpp:376 +#, possible-c-format, possible-boost-format +msgid "" +"PrusaSlicer requires OpenGL ES 2.0 capable graphics driver to run " +"correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:379 +#, possible-c-format, possible-boost-format +msgid "" +"PrusaSlicer requires OpenGL %s capable graphics driver to run correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:382 #, possible-c-format, possible-boost-format msgid "" "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" "while OpenGL version %s, render %s, vendor %s was detected." msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:261 +#: src/slic3r/GUI/OpenGLManager.cpp:386 msgid "You may need to update your graphics card driver." msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:264 +#: src/slic3r/GUI/OpenGLManager.cpp:389 msgid "" "As a workaround, you may run PrusaSlicer with a software rendered 3D " "graphics by running prusa-slicer.exe with the --sw-renderer parameter." msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:266 +#: src/slic3r/GUI/OpenGLManager.cpp:391 msgid "Unsupported OpenGL version" msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:274 +#: src/slic3r/GUI/OpenGLManager.cpp:399 #, possible-c-format, possible-boost-format msgid "" "Unable to load the following shaders:\n" "%s" msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:275 +#: src/slic3r/GUI/OpenGLManager.cpp:400 msgid "Error loading shaders" msgstr "" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:126 +msgid "Unavailable for this method." +msgstr "" + +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Top" msgstr "" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Bottom" msgstr "" @@ -6337,7 +7702,7 @@ msgstr "" msgid "Delete this preset from this printer device" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:83 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:84 msgid "This printer will be shown in the presets list as" msgstr "" @@ -6353,80 +7718,80 @@ msgstr "" msgid "Add preset for this printer device" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2255 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2239 msgid "Print Host upload" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:268 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:271 msgid "Connection to printers connected via the print host failed." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:310 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:313 msgid "Test" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:315 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:318 msgid "Could not get a valid Printer Host reference" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:330 msgid "Success!" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:337 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:340 msgid "Refresh Printers" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:367 msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:374 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:377 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:378 msgid "Open CA certificate file" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:404 -#: src/libslic3r/PrintConfig.cpp:330 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:407 +#: src/libslic3r/PrintConfig.cpp:343 msgid "HTTPS CA File" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:405 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:408 #, possible-c-format, possible-boost-format msgid "" "On this system, %s uses HTTPS certificates from the system Certificate Store " "or Keychain." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:406 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:409 msgid "" "To use a custom CA file, please import your CA file into Certificate Store / " "Keychain." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:634 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:706 msgid "The supplied name is empty. It can't be saved." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:638 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:710 msgid "You have to enter a printer name." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:646 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:718 #, possible-boost-format msgid "Printer with name \"%1%\" already exists." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:647 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:719 msgid "Replace?" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:674 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:746 #, possible-boost-format msgid "" "Following printer preset is duplicated:%1%The above preset for printer \"%2%" @@ -6437,229 +7802,226 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:724 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:796 msgid "It's not possible to delete the last related preset for the printer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:141 +#: src/slic3r/GUI/Plater.cpp:158 msgid "The provided name is not valid;" msgstr "" -#: src/slic3r/GUI/Plater.cpp:142 src/slic3r/GUI/SavePresetDialog.cpp:102 +#: src/slic3r/GUI/Plater.cpp:159 src/slic3r/GUI/SavePresetDialog.cpp:166 msgid "the following characters are not allowed:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:207 +#: src/slic3r/GUI/Plater.cpp:223 msgid "" "For a multipart object, this value isn't accurate.\n" "It doesn't take account of intersections and negative volumes." msgstr "" -#: src/slic3r/GUI/Plater.cpp:211 +#: src/slic3r/GUI/Plater.cpp:227 msgid "Volume" msgstr "" -#: src/slic3r/GUI/Plater.cpp:213 +#: src/slic3r/GUI/Plater.cpp:229 msgid "Facets" msgstr "" -#: src/slic3r/GUI/Plater.cpp:276 +#: src/slic3r/GUI/Plater.cpp:286 msgid "Sliced Info" msgstr "" -#: src/slic3r/GUI/Plater.cpp:296 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:306 src/slic3r/GUI/Plater.cpp:1414 msgid "Used Filament (g)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:297 src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:307 src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (m)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:298 src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:308 src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (mm³)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:299 +#: src/slic3r/GUI/Plater.cpp:309 msgid "Used Material (unit)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:300 +#: src/slic3r/GUI/Plater.cpp:310 msgid "Cost (money)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:301 src/slic3r/GUI/Plater.cpp:1340 -#: src/slic3r/GUI/Plater.cpp:1427 +#: src/slic3r/GUI/Plater.cpp:311 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:1464 msgid "Estimated printing time" msgstr "" -#: src/slic3r/GUI/Plater.cpp:302 +#: src/slic3r/GUI/Plater.cpp:312 msgid "Number of tool changes" msgstr "" -#: src/slic3r/GUI/Plater.cpp:431 +#: src/slic3r/GUI/Plater.cpp:437 msgid "Select what kind of support do you need" msgstr "" -#: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2590 -#: src/libslic3r/PrintConfig.cpp:3645 +#: src/slic3r/GUI/Plater.cpp:440 src/libslic3r/PrintConfig.cpp:2620 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "Support on build plate only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:434 src/slic3r/GUI/Plater.cpp:564 +#: src/slic3r/GUI/Plater.cpp:441 msgid "For support enforcers only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Plater.cpp:442 msgid "Everywhere" msgstr "" -#: src/slic3r/GUI/Plater.cpp:467 src/slic3r/GUI/Tab.cpp:1542 +#: src/slic3r/GUI/Plater.cpp:475 src/slic3r/GUI/Tab.cpp:1489 msgid "Brim" msgstr "" -#: src/slic3r/GUI/Plater.cpp:469 +#: src/slic3r/GUI/Plater.cpp:477 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:477 +#: src/slic3r/GUI/Plater.cpp:485 msgid "Purging volumes" msgstr "" -#: src/slic3r/GUI/Plater.cpp:578 +#: src/slic3r/GUI/Plater.cpp:592 msgid "Select what kind of pad do you need" msgstr "" -#: src/slic3r/GUI/Plater.cpp:580 +#: src/slic3r/GUI/Plater.cpp:595 msgid "Below object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:581 +#: src/slic3r/GUI/Plater.cpp:596 msgid "Around object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:894 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/Plater.cpp:929 src/slic3r/GUI/Plater.cpp:7162 msgid "Send to printer" msgstr "" -#: src/slic3r/GUI/Plater.cpp:914 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6067 +#: src/slic3r/GUI/Plater.cpp:949 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6657 msgid "Slice now" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1087 +#: src/slic3r/GUI/Plater.cpp:1127 msgid "Hold Shift to Slice & Export G-code" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1287 +#: src/slic3r/GUI/Plater.cpp:1324 #, possible-boost-format msgid "%1% (%2$d shell)" msgid_plural "%1% (%2$d shells)" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:1315 +#: src/slic3r/GUI/Plater.cpp:1352 msgid "Used Material (ml)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "object" msgid_plural "objects" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "supports and pad" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (in)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "wipe tower" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (in³)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1396 +#: src/slic3r/GUI/Plater.cpp:1433 #, possible-boost-format msgid "Filament at extruder %1%" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1402 +#: src/slic3r/GUI/Plater.cpp:1439 msgid "(including spool)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1072 -#: src/libslic3r/PrintConfig.cpp:3439 src/libslic3r/PrintConfig.cpp:3440 +#: src/slic3r/GUI/Plater.cpp:1448 src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:3716 src/libslic3r/PrintConfig.cpp:3717 msgid "Cost" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1429 +#: src/slic3r/GUI/Plater.cpp:1466 msgid "normal mode" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1436 +#: src/slic3r/GUI/Plater.cpp:1473 msgid "stealth mode" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1670 -msgid "Fill bed" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1676 -msgid "Optimize Rotation" +#: src/slic3r/GUI/Plater.cpp:1734 +#, possible-boost-format +msgid "Do you want to save the changes to \"%1%\"?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1682 -msgid "Import SLA archive" +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:905 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1599 +msgid "Save" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1725 -#, possible-boost-format -msgid "Do you want to save the changes to \"%1%\"?" +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +msgid "Discard" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1730 src/slic3r/GUI/Preferences.cpp:222 +#: src/slic3r/GUI/Plater.cpp:1740 src/slic3r/GUI/Preferences.cpp:354 msgid "Ask for unsaved changes in project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1733 +#: src/slic3r/GUI/Plater.cpp:1743 msgid "" "You will not be asked about it again, when: \n" "- Closing PrusaSlicer,\n" "- Loading or creating a new project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2198 +#: src/slic3r/GUI/Plater.cpp:2214 #, possible-c-format, possible-boost-format msgid "" "Successfully unmounted. The device %s(%s) can now be safely removed from the " "computer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2203 +#: src/slic3r/GUI/Plater.cpp:2220 #, possible-c-format, possible-boost-format msgid "Ejecting of device %s(%s) has failed." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2222 src/slic3r/GUI/Plater.cpp:5108 +#: src/slic3r/GUI/Plater.cpp:2239 src/slic3r/GUI/Plater.cpp:5199 msgid "New Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2319 +#: src/slic3r/GUI/Plater.cpp:2346 msgid "Expand sidebar" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2518 +#: src/slic3r/GUI/Plater.cpp:2428 msgid "" "The preset below was temporarily installed on the active instance of " "PrusaSlicer" @@ -6669,12 +8031,12 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:2548 +#: src/slic3r/GUI/Plater.cpp:2583 #, possible-boost-format msgid "Failed loading file \"%1%\" due to an invalid configuration." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2568 +#: src/slic3r/GUI/Plater.cpp:2603 #, possible-c-format, possible-boost-format msgid "" "Object size from file %s appears to be zero.\n" @@ -6685,11 +8047,11 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:2572 +#: src/slic3r/GUI/Plater.cpp:2607 msgid "The size of the object is zero" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2585 +#: src/slic3r/GUI/Plater.cpp:2620 #, possible-c-format, possible-boost-format msgid "" "The dimensions of the object from file %s seem to be defined in meters.\n" @@ -6702,15 +8064,15 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:2589 src/slic3r/GUI/Plater.cpp:2611 +#: src/slic3r/GUI/Plater.cpp:2624 src/slic3r/GUI/Plater.cpp:2646 msgid "The object is too small" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2590 src/slic3r/GUI/Plater.cpp:2612 +#: src/slic3r/GUI/Plater.cpp:2625 src/slic3r/GUI/Plater.cpp:2647 msgid "Apply to all the remaining small objects being loaded." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2607 +#: src/slic3r/GUI/Plater.cpp:2642 #, possible-c-format, possible-boost-format msgid "" "The dimensions of the object from file %s seem to be defined in inches.\n" @@ -6723,180 +8085,189 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:2625 +#: src/slic3r/GUI/Plater.cpp:2659 msgid "" "This file contains several objects positioned at multiple heights.\n" "Instead of considering them as multiple objects, should \n" "the file be loaded as a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2628 src/slic3r/GUI/Plater.cpp:2683 +#: src/slic3r/GUI/Plater.cpp:2662 src/slic3r/GUI/Plater.cpp:2711 msgid "Multi-part object detected" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2636 +#: src/slic3r/GUI/Plater.cpp:2669 msgid "" "This file cannot be loaded in a simple mode. Do you want to switch to an " "advanced mode?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2637 +#: src/slic3r/GUI/Plater.cpp:2670 msgid "Detected advanced data" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2657 -#, possible-c-format, possible-boost-format -msgid "" -"You can't to add the object(s) from %s because of one or some of them " -"is(are) multi-part" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2680 +#: src/slic3r/GUI/Plater.cpp:2708 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" "these files to represent a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2799 +#: src/slic3r/GUI/Plater.cpp:2827 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2800 +#: src/slic3r/GUI/Plater.cpp:2828 msgid "Object too large?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2878 +#: src/slic3r/GUI/Plater.cpp:2908 msgid "Export STL file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2885 +#: src/slic3r/GUI/Plater.cpp:2915 msgid "Export AMF file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2891 +#: src/slic3r/GUI/Plater.cpp:2921 msgid "Save file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2897 +#: src/slic3r/GUI/Plater.cpp:2927 msgid "Export OBJ file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2995 +#: src/slic3r/GUI/Plater.cpp:3030 +msgid "Delete object which is a part of cut object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3031 +msgid "" +"You try to delete an object which is a part of a cut object.\n" +"This action will break a cut correspondence.\n" +"After that PrusaSlicer can't guarantee model consistency" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3035 +msgid "Delete object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3040 msgid "Delete Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3007 +#: src/slic3r/GUI/Plater.cpp:3057 msgid "Delete All Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3035 +#: src/slic3r/GUI/Plater.cpp:3086 msgid "Reset Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3118 +#: src/slic3r/GUI/Plater.cpp:3141 msgid "" "The selected object couldn't be split because it contains only one solid " "part." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3125 +#: src/slic3r/GUI/Plater.cpp:3148 msgid "All non-solid parts (modifiers) were deleted" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3127 +#: src/slic3r/GUI/Plater.cpp:3150 msgid "Split to Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3179 +#: src/slic3r/GUI/Plater.cpp:3202 msgid "" "An object has custom support enforcers which will not be used because " "supports are disabled." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3181 +#: src/slic3r/GUI/Plater.cpp:3204 msgid "Enable supports for enforcers only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3310 src/slic3r/GUI/Plater.cpp:4176 +#: src/slic3r/GUI/Plater.cpp:3339 src/slic3r/GUI/Plater.cpp:4238 msgid "Invalid data" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3380 +#: src/slic3r/GUI/Plater.cpp:3410 msgid "Another export job is currently running." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3466 +#: src/slic3r/GUI/Plater.cpp:3496 msgid "Replace from:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3484 +#: src/slic3r/GUI/Plater.cpp:3514 msgid "Unable to replace with more than one volume" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3484 src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3514 src/slic3r/GUI/Plater.cpp:3597 msgid "Error during replace" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3555 +#: src/slic3r/GUI/Plater.cpp:3589 msgid "Select the new file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3597 msgid "File for the replace wasn't selected" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3654 +#: src/slic3r/GUI/Plater.cpp:3684 msgid "Please select the file to reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3685 src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:3715 src/slic3r/GUI/Plater.cpp:5355 +#: src/slic3r/GUI/Plater.cpp:5365 msgid "The selected file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "differs from the original file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "Do you want to replace it" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3703 src/slic3r/GUI/Plater.cpp:3709 +#: src/slic3r/GUI/Plater.cpp:3736 src/slic3r/GUI/Plater.cpp:3742 msgid "Reload from:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3812 +#: src/slic3r/GUI/Plater.cpp:3864 msgid "Unable to reload:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3817 +#: src/slic3r/GUI/Plater.cpp:3869 msgid "Error during reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3835 +#: src/slic3r/GUI/Plater.cpp:3887 msgid "Reload all from disk" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4130 +#: src/slic3r/GUI/Plater.cpp:4191 msgid "There are active warnings concerning sliced models:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4141 +#: src/slic3r/GUI/Plater.cpp:4202 msgid "generated warnings" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4472 +#: src/slic3r/GUI/Plater.cpp:4554 msgid "3D editor view" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4893 +#: src/slic3r/GUI/Plater.cpp:4980 msgid "Undo / Redo is processing" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4895 +#: src/slic3r/GUI/Plater.cpp:4982 #, possible-boost-format msgid "" "Switching the printer technology from %1% to %2%.\n" @@ -6904,223 +8275,284 @@ msgid "" "printer technology." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5092 +#: src/slic3r/GUI/Plater.cpp:5184 msgid "Creating a new project while the current project is modified." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5095 +#: src/slic3r/GUI/Plater.cpp:5187 msgid "Creating a new project while some presets are modified." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5096 +#: src/slic3r/GUI/Plater.cpp:5188 msgid "You can keep presets modifications to the new project or discard them" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5097 +#: src/slic3r/GUI/Plater.cpp:5189 msgid "" "You can keep presets modifications to the new project, discard them or save " "changes as new presets.\n" "Note, if changes will be saved then new project wouldn't keep them" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5103 +#: src/slic3r/GUI/Plater.cpp:5194 msgid "Creating a new project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5137 +#: src/slic3r/GUI/Plater.cpp:5228 msgid "Load Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5167 src/slic3r/GUI/Plater.cpp:5432 +#: src/slic3r/GUI/Plater.cpp:5258 msgid "Import Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5171 +#: src/slic3r/GUI/Plater.cpp:5262 msgid "Import Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:5291 +msgid "Import SLA archive" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5355 src/slic3r/GUI/Plater.cpp:5365 msgid "does not contain valid gcode." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5244 +#: src/slic3r/GUI/Plater.cpp:5356 src/slic3r/GUI/Plater.cpp:5366 msgid "Error while loading .gcode file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5297 +#: src/slic3r/GUI/Plater.cpp:5433 +#, possible-c-format, possible-boost-format +msgid "%s - Multiple projects file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 +msgid "There are several files being loaded, including Project files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 src/slic3r/GUI/Plater.cpp:5446 +msgid "Select an action to apply to all files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5446 +msgid "There are several files being loaded." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5448 src/slic3r/GUI/Plater.cpp:5842 +msgid "Action" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5469 +msgid "Import geometry" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5482 src/slic3r/GUI/Plater.cpp:5834 +msgid "Start new PrusaSlicer instance" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5496 +msgid "Select one to load as project" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5507 +msgid "Select one to load config only" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5609 +#, possible-boost-format +msgid "Failed to unzip file to %1%: %2% " +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5618 +#, possible-boost-format +msgid "Failed to find unzipped file at %1%. Unzipping of file has failed." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5821 #, possible-c-format, possible-boost-format -msgid "%s - Drop project file" +msgid "%s - Load project file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5304 +#: src/slic3r/GUI/Plater.cpp:5830 msgid "Open as project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5305 +#: src/slic3r/GUI/Plater.cpp:5831 msgid "Import geometry only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5306 +#: src/slic3r/GUI/Plater.cpp:5832 msgid "Import config only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5309 +#: src/slic3r/GUI/Plater.cpp:5837 msgid "Select an action to apply to the file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5314 -msgid "Action" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:5330 +#: src/slic3r/GUI/Plater.cpp:5858 msgid "Don't show again" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5371 +#: src/slic3r/GUI/Plater.cpp:5899 msgid "You can open only one .gcode file at a time." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5372 +#: src/slic3r/GUI/Plater.cpp:5900 msgid "Drag and drop G-code file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5454 +#: src/slic3r/GUI/Plater.cpp:5992 msgid "Load File" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5459 +#: src/slic3r/GUI/Plater.cpp:5997 msgid "Load Files" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5509 +#: src/slic3r/GUI/Plater.cpp:6047 msgid "All objects will be removed, continue?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5520 +#: src/slic3r/GUI/Plater.cpp:6058 msgid "Delete Selected Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5529 +#: src/slic3r/GUI/Plater.cpp:6067 msgid "Increase Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5563 +#: src/slic3r/GUI/Plater.cpp:6109 msgid "Decrease Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5614 +#: src/slic3r/GUI/Plater.cpp:6167 msgid "Enter the number of copies:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5615 +#: src/slic3r/GUI/Plater.cpp:6168 msgid "Copies of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5619 +#: src/slic3r/GUI/Plater.cpp:6171 #, possible-c-format, possible-boost-format msgid "Set numbers of copies to %d" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5697 -msgid "Cut by Plane" +#: src/slic3r/GUI/Plater.cpp:6187 +msgid "Fill bed" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save G-code file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save SL1 / SL1S file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5766 +#: src/slic3r/GUI/Plater.cpp:6336 msgid "The provided file name is not valid." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5767 +#: src/slic3r/GUI/Plater.cpp:6337 msgid "The following characters are not allowed by a FAT file system:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "" "The plater is empty.\n" "Do you want to save the project?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "Save project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:6543 -msgid "Export" +#: src/slic3r/GUI/Plater.cpp:6766 +msgid "Is the printer ready? Is the print sheet in place, empty and clean?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:6575 -msgid "" -"Custom supports, seams and multimaterial painting were removed after " -"repairing the mesh." +#: src/slic3r/GUI/Plater.cpp:6766 src/slic3r/GUI/PrintHostDialogs.cpp:132 +msgid "Upload and Print" msgstr "" -#: src/slic3r/GUI/Plater.cpp:6689 +#: src/slic3r/GUI/Plater.cpp:7161 +msgid "Export" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:7306 msgid "Paste From Clipboard" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2290 -#: src/slic3r/GUI/Tab.cpp:2517 src/slic3r/GUI/Tab.cpp:2624 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Preferences.cpp:240 src/slic3r/GUI/Tab.cpp:2274 +#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2617 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "General" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:121 +#: src/slic3r/GUI/Preferences.cpp:258 msgid "Remember output directory" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:123 +#: src/slic3r/GUI/Preferences.cpp:259 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:129 +#: src/slic3r/GUI/Preferences.cpp:263 msgid "Auto-center parts" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:131 +#: src/slic3r/GUI/Preferences.cpp:264 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:137 +#: src/slic3r/GUI/Preferences.cpp:268 msgid "Background processing" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:139 +#: src/slic3r/GUI/Preferences.cpp:269 msgid "" "If this is enabled, Slic3r will pre-process objects as soon as they're " "loaded in order to save time when exporting G-code." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:148 +#: src/slic3r/GUI/Preferences.cpp:274 +msgid "Alert when supports needed" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:275 +msgid "" +"If this is enabled, Slic3r will raise alerts when it detects issues in the " +"sliced object, that can be resolved with supports (and brim). Examples of " +"such issues are floating object parts, unsupported extrusions and low bed " +"adhesion." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:285 msgid "Export sources full pathnames to 3mf and amf" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:150 +#: src/slic3r/GUI/Preferences.cpp:286 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:159 +#: src/slic3r/GUI/Preferences.cpp:293 msgid "If enabled, sets PrusaSlicer as default application to open .3mf files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:166 +#: src/slic3r/GUI/Preferences.cpp:298 msgid "If enabled, sets PrusaSlicer as default application to open .stl files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:177 +#: src/slic3r/GUI/Preferences.cpp:307 msgid "" "If enabled, Slic3r downloads updates of built-in system presets in the " "background. These updates are downloaded into a separate temporary location. " @@ -7128,216 +8560,233 @@ msgid "" "startup." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:182 +#: src/slic3r/GUI/Preferences.cpp:312 msgid "Suppress \" - default - \" presets" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:184 +#: src/slic3r/GUI/Preferences.cpp:313 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:190 +#: src/slic3r/GUI/Preferences.cpp:317 +msgid "Suppress \" Template \" filament presets" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:318 +msgid "" +"Suppress \" Template \" filament presets in configuration wizard and sidebar " +"visibility." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:322 msgid "Show incompatible print and filament presets" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:323 msgid "" "When checked, the print and filament presets are shown in the preset editor " "even if they are marked as incompatible with the active printer" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:200 +#: src/slic3r/GUI/Preferences.cpp:331 +msgid "Show load project dialog" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:332 +msgid "" +"When checked, whenever dragging and dropping a project file on the " +"application or open it from a browser, shows a dialog asking to select the " +"action to take on the file to load." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:335 msgid "Show drop project dialog" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:202 +#: src/slic3r/GUI/Preferences.cpp:336 msgid "" "When checked, whenever dragging and dropping a project file on the " "application, shows a dialog asking to select the action to take on the file " "to load." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:208 src/slic3r/GUI/Preferences.cpp:212 +#: src/slic3r/GUI/Preferences.cpp:342 src/slic3r/GUI/Preferences.cpp:346 msgid "Allow just a single PrusaSlicer instance" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:210 +#: src/slic3r/GUI/Preferences.cpp:343 msgid "" "On OSX there is always only one instance of app running by default. However " "it is allowed to run multiple instances of same app from the command line. " "In such case this settings will allow only one instance." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:214 +#: src/slic3r/GUI/Preferences.cpp:347 msgid "" "If this is enabled, when starting PrusaSlicer and another instance of the " "same PrusaSlicer is already running, that instance will be reactivated " "instead." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:224 +#: src/slic3r/GUI/Preferences.cpp:355 msgid "" "Always ask for unsaved changes in project, when: \n" "- Closing PrusaSlicer,\n" "- Loading or creating a new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:233 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:897 +#: src/slic3r/GUI/Preferences.cpp:363 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:925 msgid "" "Ask to save unsaved changes in presets when closing the application or when " "loading a new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:235 +#: src/slic3r/GUI/Preferences.cpp:364 msgid "" "Always ask for unsaved changes in presets, when: \n" "- Closing PrusaSlicer while some presets are modified,\n" "- Loading a new project while some presets are modified" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:242 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:896 +#: src/slic3r/GUI/Preferences.cpp:370 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:924 msgid "Ask for unsaved changes in presets when selecting new preset" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:244 +#: src/slic3r/GUI/Preferences.cpp:371 msgid "" "Always ask for unsaved changes in presets when selecting new preset or " "resetting a preset" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:249 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 +#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:923 msgid "Ask for unsaved changes in presets when creating new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:251 +#: src/slic3r/GUI/Preferences.cpp:376 msgid "Always ask for unsaved changes in presets when creating new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:258 +#: src/slic3r/GUI/Preferences.cpp:382 msgid "Associate .gcode files to PrusaSlicer G-code Viewer" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:260 +#: src/slic3r/GUI/Preferences.cpp:383 msgid "" "If enabled, sets PrusaSlicer G-code Viewer as default application to open ." "gcode files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:268 +#: src/slic3r/GUI/Preferences.cpp:390 msgid "Use Retina resolution for the 3D scene" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:270 +#: src/slic3r/GUI/Preferences.cpp:391 msgid "" "If enabled, the 3D scene will be rendered in Retina resolution. If you are " "experiencing 3D performance problems, disabling this option may help." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:280 src/slic3r/GUI/Preferences.cpp:282 +#: src/slic3r/GUI/Preferences.cpp:400 src/slic3r/GUI/Preferences.cpp:401 msgid "Show splash screen" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:289 +#: src/slic3r/GUI/Preferences.cpp:406 msgid "If enabled, PrusaSlicer will be open at the position it was closed" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:295 +#: src/slic3r/GUI/Preferences.cpp:411 msgid "Clear Undo / Redo stack on new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:297 +#: src/slic3r/GUI/Preferences.cpp:412 msgid "" "Clear Undo / Redo stack on new project or when an existing project is loaded." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:303 +#: src/slic3r/GUI/Preferences.cpp:417 msgid "Enable support for legacy 3DConnexion devices" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:305 +#: src/slic3r/GUI/Preferences.cpp:418 msgid "" "If enabled, the legacy 3DConnexion devices settings dialog is available by " "pressing CTRL+M" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:314 +#: src/slic3r/GUI/Preferences.cpp:425 msgid "Camera" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:319 +#: src/slic3r/GUI/Preferences.cpp:435 msgid "Use perspective camera" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:321 +#: src/slic3r/GUI/Preferences.cpp:436 msgid "" "If enabled, use perspective camera. If not enabled, use orthographic camera." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:326 +#: src/slic3r/GUI/Preferences.cpp:440 msgid "Use free camera" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:328 +#: src/slic3r/GUI/Preferences.cpp:441 msgid "If enabled, use free camera. If not enabled, use constrained camera." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:333 +#: src/slic3r/GUI/Preferences.cpp:445 msgid "Reverse direction of zoom with mouse wheel" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:335 +#: src/slic3r/GUI/Preferences.cpp:446 msgid "If enabled, reverses the direction of zoom with mouse wheel" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:343 +#: src/slic3r/GUI/Preferences.cpp:452 msgid "GUI" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:366 +#: src/slic3r/GUI/Preferences.cpp:492 msgid "Sequential slider applied only to top layer" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:368 +#: src/slic3r/GUI/Preferences.cpp:493 msgid "" "If enabled, changes made using the sequential slider, in preview, apply only " -"to gcode top layer. If disabled, changes made using the sequential slider, " -"in preview, apply to the whole gcode." +"to gcode top layer.If disabled, changes made using the sequential slider, in " +"preview, apply to the whole gcode." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/Preferences.cpp:499 msgid "Show sidebar collapse/expand button" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:377 +#: src/slic3r/GUI/Preferences.cpp:500 msgid "" "If enabled, the button for the collapse sidebar will be appeared in top " "right corner of the 3D Scene" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:384 -msgid "If enabled, PrusaSlicer will not open hyperlinks in your browser." -msgstr "" - -#: src/slic3r/GUI/Preferences.cpp:391 +#: src/slic3r/GUI/Preferences.cpp:511 msgid "Use colors for axes values in Manipulation panel" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:393 +#: src/slic3r/GUI/Preferences.cpp:512 msgid "" "If enabled, the axes names and axes values will be colorized according to " "the axes colors. If disabled, old UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:399 +#: src/slic3r/GUI/Preferences.cpp:517 msgid "Order object volumes by types" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:401 +#: src/slic3r/GUI/Preferences.cpp:518 msgid "" "If enabled, volumes will be always ordered inside the object. Correct order " "is Model Part, Negative Volume, Modifier, Support Blocker and Support " @@ -7345,193 +8794,240 @@ msgid "" "Modifiers. But one of the model parts have to be on the first place." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:408 +#: src/slic3r/GUI/Preferences.cpp:523 +msgid "Show non-manifold edges" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:524 +msgid "If enabled, shows non-manifold edges." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:528 +msgid "Allow automatically color change" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:529 +msgid "" +"If enabled, related notification will be shown, when sliced object looks " +"like a logo or a sign." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:534 msgid "Set settings tabs as menu items (experimental)" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:410 +#: src/slic3r/GUI/Preferences.cpp:535 msgid "" "If enabled, Settings Tabs will be placed as menu items. If disabled, old UI " "will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:419 +#: src/slic3r/GUI/Preferences.cpp:542 msgid "Show \"Tip of the day\" notification after start" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:421 +#: src/slic3r/GUI/Preferences.cpp:543 msgid "If enabled, useful hints are displayed at startup." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:427 +#: src/slic3r/GUI/Preferences.cpp:547 msgid "Notify about new releases" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:429 +#: src/slic3r/GUI/Preferences.cpp:548 msgid "" "You will be notified about new release after startup acordingly: All = " "Regular release and alpha / beta releases. Release only = regular release." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:435 +#: src/slic3r/GUI/Preferences.cpp:551 msgid "Release only" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:444 +#: src/slic3r/GUI/Preferences.cpp:558 msgid "Use custom size for toolbar icons" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:446 +#: src/slic3r/GUI/Preferences.cpp:559 msgid "If enabled, you can change size of toolbar icons manually." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:471 +#: src/slic3r/GUI/Preferences.cpp:577 src/slic3r/GUI/Tab.cpp:1659 +msgid "Other" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:594 +msgid "If enabled, PrusaSlicer will not open a hyperlinks in your browser." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:600 +msgid "Allow downloads from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:601 +msgid "If enabled, PrusaSlicer will be allowed to download from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:610 msgid "Render" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:476 +#: src/slic3r/GUI/Preferences.cpp:620 msgid "Use environment map" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:478 +#: src/slic3r/GUI/Preferences.cpp:621 msgid "If enabled, renders object using the environment map." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:491 +#: src/slic3r/GUI/Preferences.cpp:629 msgid "Dark mode (experimental)" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:496 +#: src/slic3r/GUI/Preferences.cpp:639 msgid "Enable dark mode" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:498 +#: src/slic3r/GUI/Preferences.cpp:640 msgid "" "If enabled, UI will use Dark mode colors. If disabled, old UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:507 +#: src/slic3r/GUI/Preferences.cpp:647 msgid "Use system menu for application" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:509 +#: src/slic3r/GUI/Preferences.cpp:648 msgid "" "If enabled, application will use the standard Windows system menu,\n" -"but on some combination of display scales it can looks ugly. If disabled, " -"old UI will be used." +"but on some combination od display scales it can look ugly. If disabled, old " +"UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:578 +#: src/slic3r/GUI/Preferences.cpp:726 msgid "Changes for the critical options" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:580 +#: src/slic3r/GUI/Preferences.cpp:728 msgid "" "Changing some options will trigger application restart.\n" "You will lose the content of the plater." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:694 +#: src/slic3r/GUI/Preferences.cpp:921 msgid "Icon size in a respect to the default size" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:709 +#: src/slic3r/GUI/Preferences.cpp:936 msgid "Select toolbar icon size in respect to the default one." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:743 src/slic3r/GUI/Preferences.cpp:754 +#: src/slic3r/GUI/Preferences.cpp:972 +msgid "Layout Options" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:981 msgid "Old regular layout with the tab bar" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:744 +#: src/slic3r/GUI/Preferences.cpp:982 msgid "New layout, access via settings button in the top menu" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:745 src/slic3r/GUI/Preferences.cpp:755 +#: src/slic3r/GUI/Preferences.cpp:983 msgid "Settings in non-modal window" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:763 -msgid "Layout Options" +#: src/slic3r/GUI/Preferences.cpp:1025 +msgid "Text colors" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:806 -msgid "Text colors" +#: src/slic3r/GUI/Preferences.cpp:1049 +msgid "Mode markers" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:249 -#: src/slic3r/GUI/PresetComboBoxes.cpp:287 -#: src/slic3r/GUI/PresetComboBoxes.cpp:794 -#: src/slic3r/GUI/PresetComboBoxes.cpp:849 -#: src/slic3r/GUI/PresetComboBoxes.cpp:989 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1033 +#: src/slic3r/GUI/PresetComboBoxes.cpp:254 +#: src/slic3r/GUI/PresetComboBoxes.cpp:306 +#: src/slic3r/GUI/PresetComboBoxes.cpp:846 +#: src/slic3r/GUI/PresetComboBoxes.cpp:909 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1073 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1125 msgid "System presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:291 -#: src/slic3r/GUI/PresetComboBoxes.cpp:853 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1037 +#: src/slic3r/GUI/PresetComboBoxes.cpp:310 +#: src/slic3r/GUI/PresetComboBoxes.cpp:915 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1130 msgid "User presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:302 +#: src/slic3r/GUI/PresetComboBoxes.cpp:321 msgid "Incompatible presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:337 +#: src/slic3r/GUI/PresetComboBoxes.cpp:364 #, possible-boost-format msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:340 +#: src/slic3r/GUI/PresetComboBoxes.cpp:366 msgid "Delete Physical Printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:581 +#: src/slic3r/GUI/PresetComboBoxes.cpp:612 msgid "Click to edit preset" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:697 -#: src/slic3r/GUI/PresetComboBoxes.cpp:737 +#: src/slic3r/GUI/PresetComboBoxes.cpp:740 +#: src/slic3r/GUI/PresetComboBoxes.cpp:788 msgid "Add/Remove presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:745 +#: src/slic3r/GUI/PresetComboBoxes.cpp:793 src/slic3r/GUI/Tab.cpp:3312 msgid "Add physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:716 +#: src/slic3r/GUI/PresetComboBoxes.cpp:759 msgid "Edit preset" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:722 +#: src/slic3r/GUI/PresetComboBoxes.cpp:765 msgid "Change extruder color" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:773 src/slic3r/GUI/Tab.cpp:3312 msgid "Edit physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:733 +#: src/slic3r/GUI/PresetComboBoxes.cpp:779 +msgid "Open physical printer URL" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:784 msgid "Delete physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:864 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1051 +#: src/slic3r/GUI/PresetComboBoxes.cpp:924 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1142 +msgid "Template presets" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:935 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1156 msgid "Physical printers" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:888 +#: src/slic3r/GUI/PresetComboBoxes.cpp:959 msgid "Add/Remove filaments" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:890 +#: src/slic3r/GUI/PresetComboBoxes.cpp:961 msgid "Add/Remove materials" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:892 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1075 +#: src/slic3r/GUI/PresetComboBoxes.cpp:963 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1180 msgid "Add/Remove printers" msgstr "" @@ -7705,98 +9201,106 @@ msgstr "" msgid "Bottom is open." msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Send G-Code to printer host" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Upload to Printer Host with the following filename:" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:51 +#: src/slic3r/GUI/PrintHostDialogs.cpp:55 msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:60 +#: src/slic3r/GUI/PrintHostDialogs.cpp:64 msgid "Group" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:84 +#: src/slic3r/GUI/PrintHostDialogs.cpp:74 +msgid "Upload to storage:" +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:83 +msgid "Upload to storage: " +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:105 #, possible-c-format, possible-boost-format msgid "Upload filename doesn't end with \"%s\". Do you wish to continue?" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:91 +#: src/slic3r/GUI/PrintHostDialogs.cpp:112 msgid "Upload" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:101 -msgid "Upload and Print" +#: src/slic3r/GUI/PrintHostDialogs.cpp:122 +msgid "Upload to Queue" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:112 +#: src/slic3r/GUI/PrintHostDialogs.cpp:143 msgid "Upload and Simulate" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:247 +#: src/slic3r/GUI/PrintHostDialogs.cpp:298 msgid "ID" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:248 +#: src/slic3r/GUI/PrintHostDialogs.cpp:299 msgid "Progress" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:249 +#: src/slic3r/GUI/PrintHostDialogs.cpp:300 msgid "Status" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:250 +#: src/slic3r/GUI/PrintHostDialogs.cpp:301 msgid "Host" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:251 +#: src/slic3r/GUI/PrintHostDialogs.cpp:302 msgctxt "OfFile" msgid "Size" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:252 +#: src/slic3r/GUI/PrintHostDialogs.cpp:303 msgid "Filename" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:253 -msgid "Error Message" +#: src/slic3r/GUI/PrintHostDialogs.cpp:304 +msgid "Message" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:256 +#: src/slic3r/GUI/PrintHostDialogs.cpp:308 msgid "Cancel selected" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:258 +#: src/slic3r/GUI/PrintHostDialogs.cpp:310 msgid "Show error message" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:316 -#: src/slic3r/GUI/PrintHostDialogs.cpp:371 +#: src/slic3r/GUI/PrintHostDialogs.cpp:368 +#: src/slic3r/GUI/PrintHostDialogs.cpp:423 msgid "Enqueued" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:372 +#: src/slic3r/GUI/PrintHostDialogs.cpp:424 msgid "Uploading" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:374 +#: src/slic3r/GUI/PrintHostDialogs.cpp:426 msgid "Cancelling" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:375 +#: src/slic3r/GUI/PrintHostDialogs.cpp:427 msgid "Cancelled" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:376 +#: src/slic3r/GUI/PrintHostDialogs.cpp:428 msgid "Completed" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:424 +#: src/slic3r/GUI/PrintHostDialogs.cpp:476 msgid "Error uploading to print host:" msgstr "" @@ -7804,13 +9308,13 @@ msgstr "" msgid "NO RAMMING AT ALL" msgstr "" -#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 -#: src/libslic3r/PrintConfig.cpp:955 src/libslic3r/PrintConfig.cpp:999 -#: src/libslic3r/PrintConfig.cpp:1014 src/libslic3r/PrintConfig.cpp:3297 -#: src/libslic3r/PrintConfig.cpp:3306 src/libslic3r/PrintConfig.cpp:3315 -#: src/libslic3r/PrintConfig.cpp:3456 src/libslic3r/PrintConfig.cpp:3464 -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3479 -#: src/libslic3r/PrintConfig.cpp:3487 src/libslic3r/PrintConfig.cpp:3495 +#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/libslic3r/PrintConfig.cpp:1044 src/libslic3r/PrintConfig.cpp:1088 +#: src/libslic3r/PrintConfig.cpp:1103 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3578 src/libslic3r/PrintConfig.cpp:3587 +#: src/libslic3r/PrintConfig.cpp:3733 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3749 src/libslic3r/PrintConfig.cpp:3756 +#: src/libslic3r/PrintConfig.cpp:3764 src/libslic3r/PrintConfig.cpp:3772 msgid "s" msgstr "" @@ -7818,162 +9322,210 @@ msgstr "" msgid "Volumetric speed" msgstr "" -#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:912 -#: src/libslic3r/PrintConfig.cpp:1824 +#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:1001 +#: src/libslic3r/PrintConfig.cpp:1861 msgid "mm³/s" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:57 +#: src/slic3r/GUI/SavePresetDialog.cpp:90 +#, possible-c-format, possible-boost-format +msgid "Rename %s to:" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:90 #, possible-c-format, possible-boost-format msgid "Save %s as:" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:101 -#: src/slic3r/GUI/SavePresetDialog.cpp:109 +#: src/slic3r/GUI/SavePresetDialog.cpp:165 +#: src/slic3r/GUI/SavePresetDialog.cpp:173 msgid "The supplied name is not valid;" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:110 +#: src/slic3r/GUI/SavePresetDialog.cpp:174 msgid "the following suffix is not allowed:" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:116 +#: src/slic3r/GUI/SavePresetDialog.cpp:180 msgid "The supplied name is not available." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:122 +#: src/slic3r/GUI/SavePresetDialog.cpp:186 +msgid "The supplied name is used for a system profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:187 msgid "Cannot overwrite a system profile." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:127 +#: src/slic3r/GUI/SavePresetDialog.cpp:192 +msgid "The supplied name is used for a external profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:193 msgid "Cannot overwrite an external profile." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:134 +#: src/slic3r/GUI/SavePresetDialog.cpp:203 +msgid "Save preset modifications to existing user profile" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:205 +msgid "Nothing changed" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:210 #, possible-boost-format msgid "Preset with name \"%1%\" already exists." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:136 +#: src/slic3r/GUI/SavePresetDialog.cpp:212 #, possible-boost-format msgid "" "Preset with name \"%1%\" already exists and is incompatible with selected " "printer." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:137 +#: src/slic3r/GUI/SavePresetDialog.cpp:213 msgid "Note: This preset will be replaced after saving" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:142 +#: src/slic3r/GUI/SavePresetDialog.cpp:219 msgid "The name cannot be empty." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:147 +#: src/slic3r/GUI/SavePresetDialog.cpp:230 +msgid "The name is too long." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:235 msgid "The name cannot start with space character." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:152 +#: src/slic3r/GUI/SavePresetDialog.cpp:240 msgid "The name cannot end with space character." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:157 +#: src/slic3r/GUI/SavePresetDialog.cpp:245 msgid "The name cannot be the same as a preset alias name." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:191 -#: src/slic3r/GUI/SavePresetDialog.cpp:197 +#: src/slic3r/GUI/SavePresetDialog.cpp:289 msgid "Save preset" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:221 +#: src/slic3r/GUI/SavePresetDialog.cpp:295 +msgid "Save presets" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:302 +msgid "Rename preset" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:327 msgctxt "PresetName" msgid "Copy" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:283 +#: src/slic3r/GUI/SavePresetDialog.cpp:347 +msgid "Save as profile derived from current printer only." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:407 #, possible-boost-format msgid "" "You have selected physical printer \"%1%\" \n" "with related printer preset \"%2%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:322 +#: src/slic3r/GUI/SavePresetDialog.cpp:446 #, possible-boost-format msgid "What would you like to do with \"%1%\" preset after saving?" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:325 +#: src/slic3r/GUI/SavePresetDialog.cpp:449 #, possible-boost-format msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:326 +#: src/slic3r/GUI/SavePresetDialog.cpp:450 #, possible-boost-format msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:327 +#: src/slic3r/GUI/SavePresetDialog.cpp:451 #, possible-boost-format msgid "Just switch to \"%1%\" preset" msgstr "" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2652 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2645 msgid "Stealth" msgstr "" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2646 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2639 msgid "Normal" msgstr "" -#: src/slic3r/GUI/Selection.cpp:168 +#: src/slic3r/GUI/Selection.cpp:180 msgid "Selection-Add" msgstr "" -#: src/slic3r/GUI/Selection.cpp:209 +#: src/slic3r/GUI/Selection.cpp:221 msgid "Selection-Remove" msgstr "" -#: src/slic3r/GUI/Selection.cpp:241 +#: src/slic3r/GUI/Selection.cpp:253 msgid "Selection-Add Object" msgstr "" -#: src/slic3r/GUI/Selection.cpp:260 +#: src/slic3r/GUI/Selection.cpp:272 msgid "Selection-Remove Object" msgstr "" -#: src/slic3r/GUI/Selection.cpp:278 +#: src/slic3r/GUI/Selection.cpp:290 msgid "Selection-Add Instance" msgstr "" -#: src/slic3r/GUI/Selection.cpp:297 +#: src/slic3r/GUI/Selection.cpp:309 msgid "Selection-Remove Instance" msgstr "" -#: src/slic3r/GUI/Selection.cpp:394 +#: src/slic3r/GUI/Selection.cpp:406 msgid "Selection-Add All" msgstr "" -#: src/slic3r/GUI/Selection.cpp:419 +#: src/slic3r/GUI/Selection.cpp:431 msgid "Selection-Remove All" msgstr "" -#: src/slic3r/GUI/Selection.cpp:950 +#: src/slic3r/GUI/Selection.cpp:1309 msgid "Scale To Fit" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:114 +#: src/slic3r/GUI/Selection.cpp:1691 +msgid "" +"The currently manipulated object is tilted or contains tilted parts " +"(rotation angles are not multiples of 90°). Non-uniform scaling of tilted " +"objects is only possible in non-local coordinate systems, once the rotation " +"is embedded into the object coordinates." +msgstr "" + +#: src/slic3r/GUI/Selection.cpp:1694 +msgid "This operation is irreversible." +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:117 msgid "Data to send" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:550 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:618 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:557 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:624 msgid "Send system info" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:581 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:587 #, possible-boost-format msgid "" "This is the first time you are running %1%. We would like to ask you to send " @@ -7982,18 +9534,18 @@ msgid "" "version)." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:585 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:591 msgid "" "If we know your hardware, operating system, etc., it will greatly help us in " "development and prioritization, because we will be able to focus our effort " "more efficiently and spend time on features that are needed the most." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:588 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:594 msgid "Is it safe?" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:590 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:596 #, possible-boost-format msgid "" "We do not send any personal information nor anything that would allow us to " @@ -8004,317 +9556,330 @@ msgid "" "inspect the code actually performing the communication, see %1%." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:614 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:620 msgid "Show verbatim data that will be sent" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:616 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:622 msgid "Ask me next time" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:617 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:623 msgid "Do not send anything" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:703 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:709 msgid "System info sent successfully. Thank you." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:706 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:712 msgid "Sending system info failed!" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:713 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:719 msgid "Sending system info was cancelled." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:720 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:726 msgid "Sending system info..." msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:84 +#: src/slic3r/GUI/SysInfoDialog.cpp:92 msgid "System Information" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:150 +#: src/slic3r/GUI/SysInfoDialog.cpp:160 msgid "Blacklisted libraries loaded into PrusaSlicer process:" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:162 +#: src/slic3r/GUI/SysInfoDialog.cpp:172 msgid "Eigen vectorization supported:" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:169 +#: src/slic3r/GUI/SysInfoDialog.cpp:179 msgid "Copy to Clipboard" msgstr "" -#: src/slic3r/GUI/Tab.cpp:114 src/libslic3r/PrintConfig.cpp:565 +#: src/slic3r/GUI/Tab.cpp:68 src/libslic3r/PrintConfig.cpp:668 msgid "Compatible printers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:115 +#: src/slic3r/GUI/Tab.cpp:69 msgid "Select the printers this profile is compatible with." msgstr "" -#: src/slic3r/GUI/Tab.cpp:120 src/libslic3r/PrintConfig.cpp:580 +#: src/slic3r/GUI/Tab.cpp:74 src/libslic3r/PrintConfig.cpp:683 msgid "Compatible print profiles" msgstr "" -#: src/slic3r/GUI/Tab.cpp:121 +#: src/slic3r/GUI/Tab.cpp:75 msgid "Select the print profiles this profile is compatible with." msgstr "" -#: src/slic3r/GUI/Tab.cpp:216 +#: src/slic3r/GUI/Tab.cpp:165 msgid "Compare this preset with some another" msgstr "" #. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:218 +#: src/slic3r/GUI/Tab.cpp:167 #, possible-c-format, possible-boost-format msgid "Save current %s" msgstr "" -#: src/slic3r/GUI/Tab.cpp:219 +#: src/slic3r/GUI/Tab.cpp:168 +#, possible-c-format, possible-boost-format +msgid "Rename current %s" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:170 msgid "Delete this preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:223 +#: src/slic3r/GUI/Tab.cpp:174 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." msgstr "" -#: src/slic3r/GUI/Tab.cpp:227 +#: src/slic3r/GUI/Tab.cpp:178 #, possible-boost-format msgid "Search in settings [%1%]" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1298 +#: src/slic3r/GUI/Tab.cpp:1243 msgid "Detach from system preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1311 +#: src/slic3r/GUI/Tab.cpp:1256 msgid "" "A copy of the current system preset will be created, which will be detached " "from the system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1312 +#: src/slic3r/GUI/Tab.cpp:1257 msgid "" "The current custom preset will be detached from the parent system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1315 +#: src/slic3r/GUI/Tab.cpp:1260 msgid "Modifications to the current profile will be saved." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1321 +#: src/slic3r/GUI/Tab.cpp:1266 msgid "Detach preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1347 +#: src/slic3r/GUI/Tab.cpp:1292 msgid "This is a default preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1349 +#: src/slic3r/GUI/Tab.cpp:1294 msgid "This is a system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1351 +#: src/slic3r/GUI/Tab.cpp:1296 msgid "Current preset is inherited from the default preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1355 +#: src/slic3r/GUI/Tab.cpp:1300 msgid "Current preset is inherited from" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1359 +#: src/slic3r/GUI/Tab.cpp:1304 msgid "It can't be deleted or modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1360 +#: src/slic3r/GUI/Tab.cpp:1305 msgid "" "Any modifications should be saved as a new preset inherited from this one." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1361 +#: src/slic3r/GUI/Tab.cpp:1306 msgid "To do that please specify a new name for the preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1365 +#: src/slic3r/GUI/Tab.cpp:1310 msgid "Additional information:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1371 +#: src/slic3r/GUI/Tab.cpp:1316 msgid "printer model" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1379 +#: src/slic3r/GUI/Tab.cpp:1324 msgid "default print profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1382 +#: src/slic3r/GUI/Tab.cpp:1327 msgid "default filament profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1396 +#: src/slic3r/GUI/Tab.cpp:1341 msgid "default SLA material profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1400 +#: src/slic3r/GUI/Tab.cpp:1345 msgid "default SLA print profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1408 +#: src/slic3r/GUI/Tab.cpp:1353 msgid "full profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1409 +#: src/slic3r/GUI/Tab.cpp:1354 msgid "symbolic profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4657 +#: src/slic3r/GUI/Tab.cpp:1392 src/slic3r/GUI/Tab.cpp:4940 msgid "Layers and perimeters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1453 +#: src/slic3r/GUI/Tab.cpp:1398 msgid "Vertical shells" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1465 +#: src/slic3r/GUI/Tab.cpp:1410 msgid "Horizontal shells" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1466 src/libslic3r/PrintConfig.cpp:2417 +#: src/slic3r/GUI/Tab.cpp:1411 src/libslic3r/PrintConfig.cpp:2448 msgid "Solid layers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1471 +#: src/slic3r/GUI/Tab.cpp:1416 msgid "Minimum shell thickness" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1482 +#: src/slic3r/GUI/Tab.cpp:1427 msgid "Quality (slower slicing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1497 +#: src/slic3r/GUI/Tab.cpp:1444 msgid "Fuzzy skin (experimental)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1520 +#: src/slic3r/GUI/Tab.cpp:1467 msgid "Reducing printing time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1535 src/libslic3r/ExtrusionEntity.cpp:370 +#: src/slic3r/GUI/Tab.cpp:1482 msgid "Skirt" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1504 msgid "Raft" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1562 +#: src/slic3r/GUI/Tab.cpp:1509 msgid "Options for support material and raft" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1582 +#: src/slic3r/GUI/Tab.cpp:1528 +msgid "Organic supports" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1537 msgid "Speed for print moves" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1595 +#: src/slic3r/GUI/Tab.cpp:1550 +msgid "Dynamic overhang speed" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1557 msgid "Speed for non-print moves" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1599 +#: src/slic3r/GUI/Tab.cpp:1561 msgid "Modifiers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1603 +#: src/slic3r/GUI/Tab.cpp:1565 msgid "Acceleration control (advanced)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1614 +#: src/slic3r/GUI/Tab.cpp:1576 msgid "Autospeed (advanced)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1618 +#: src/slic3r/GUI/Tab.cpp:1580 msgid "Pressure equalizer (experimental)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1622 +#: src/slic3r/GUI/Tab.cpp:1584 msgid "Multiple Extruders" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1630 +#: src/slic3r/GUI/Tab.cpp:1592 msgid "Ooze prevention" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1650 +#: src/slic3r/GUI/Tab.cpp:1596 +msgid "Wipe tower" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1612 msgid "Extrusion width" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1660 +#: src/slic3r/GUI/Tab.cpp:1622 msgid "Overlap" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1663 +#: src/slic3r/GUI/Tab.cpp:1625 msgid "Flow" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1674 src/slic3r/GUI/Tab.cpp:1700 -msgid "Other" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:1636 msgid "Arachne perimeter generator" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1685 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1644 src/slic3r/GUI/Tab.cpp:4990 msgid "Output options" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1686 +#: src/slic3r/GUI/Tab.cpp:1645 msgid "Sequential printing" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1688 +#: src/slic3r/GUI/Tab.cpp:1647 msgid "Extruder clearance" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:4735 +#: src/slic3r/GUI/Tab.cpp:1652 src/slic3r/GUI/Tab.cpp:4991 msgid "Output file" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1712 src/libslic3r/PrintConfig.cpp:2042 +#: src/slic3r/GUI/Tab.cpp:1671 src/libslic3r/PrintConfig.cpp:2072 msgid "Post-processing scripts" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1724 src/slic3r/GUI/Tab.cpp:1725 -#: src/slic3r/GUI/Tab.cpp:2110 src/slic3r/GUI/Tab.cpp:2111 -#: src/slic3r/GUI/Tab.cpp:2498 src/slic3r/GUI/Tab.cpp:2499 -#: src/slic3r/GUI/Tab.cpp:2571 src/slic3r/GUI/Tab.cpp:2572 -#: src/slic3r/GUI/Tab.cpp:3957 src/slic3r/GUI/Tab.cpp:4585 -#: src/slic3r/GUI/Tab.cpp:4586 +#: src/slic3r/GUI/Tab.cpp:1683 src/slic3r/GUI/Tab.cpp:1684 +#: src/slic3r/GUI/Tab.cpp:2080 src/slic3r/GUI/Tab.cpp:2081 +#: src/slic3r/GUI/Tab.cpp:2486 src/slic3r/GUI/Tab.cpp:2487 +#: src/slic3r/GUI/Tab.cpp:2564 src/slic3r/GUI/Tab.cpp:2565 +#: src/slic3r/GUI/Tab.cpp:4182 src/slic3r/GUI/Tab.cpp:4822 +#: src/slic3r/GUI/Tab.cpp:4823 msgid "Notes" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:2088 +#: src/slic3r/GUI/Tab.cpp:2493 src/slic3r/GUI/Tab.cpp:2571 +#: src/slic3r/GUI/Tab.cpp:4830 src/slic3r/GUI/Tab.cpp:4996 msgid "Dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1732 src/slic3r/GUI/Tab.cpp:2119 -#: src/slic3r/GUI/Tab.cpp:2506 src/slic3r/GUI/Tab.cpp:2579 -#: src/slic3r/GUI/Tab.cpp:4594 src/slic3r/GUI/Tab.cpp:4741 +#: src/slic3r/GUI/Tab.cpp:1691 src/slic3r/GUI/Tab.cpp:2089 +#: src/slic3r/GUI/Tab.cpp:2494 src/slic3r/GUI/Tab.cpp:2572 +#: src/slic3r/GUI/Tab.cpp:4831 src/slic3r/GUI/Tab.cpp:4997 msgid "Profile dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1771 +#: src/slic3r/GUI/Tab.cpp:1723 msgid "Post processing scripts shall modify G-code file in place." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1850 +#: src/slic3r/GUI/Tab.cpp:1802 #, possible-c-format, possible-boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8327,7 +9892,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:1855 +#: src/slic3r/GUI/Tab.cpp:1807 msgid "Found reserved keywords in" msgstr "" @@ -8335,74 +9900,90 @@ msgstr "" msgid "Filament Overrides" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1992 +#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2827 +msgid "Retraction" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1951 +msgid "Temperature" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1955 msgid "Nozzle" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1997 +#: src/slic3r/GUI/Tab.cpp:1960 msgid "Bed" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2002 +#: src/slic3r/GUI/Tab.cpp:1965 msgid "Cooling" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2004 src/libslic3r/PrintConfig.cpp:1936 -#: src/libslic3r/PrintConfig.cpp:2994 +#: src/slic3r/GUI/Tab.cpp:1967 src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "Enable" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/Tab.cpp:1978 msgid "Fan settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2026 +#: src/slic3r/GUI/Tab.cpp:1979 +msgid "Fan speed" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1989 +msgid "Dynamic fan speeds" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1996 msgid "Cooling thresholds" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2032 +#: src/slic3r/GUI/Tab.cpp:2002 msgid "Filament properties" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2039 +#: src/slic3r/GUI/Tab.cpp:2009 msgid "Print speed override" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2049 +#: src/slic3r/GUI/Tab.cpp:2019 msgid "Wipe tower parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2052 +#: src/slic3r/GUI/Tab.cpp:2022 msgid "Toolchange parameters with single extruder MM printers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2065 +#: src/slic3r/GUI/Tab.cpp:2035 msgid "Ramming settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 -#: src/slic3r/GUI/Tab.cpp:4264 src/libslic3r/GCode.cpp:733 -#: src/libslic3r/PrintConfig.cpp:2500 +#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:2398 +#: src/slic3r/GUI/Tab.cpp:4493 src/libslic3r/GCode.cpp:684 +#: src/libslic3r/PrintConfig.cpp:2532 msgid "Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2090 src/slic3r/GUI/Tab.cpp:2411 -#: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2450 -#: src/libslic3r/PrintConfig.cpp:2465 +#: src/slic3r/GUI/Tab.cpp:2060 src/slic3r/GUI/Tab.cpp:2399 +#: src/libslic3r/GCode.cpp:658 src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2497 msgid "Start G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:2421 -#: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:685 -#: src/libslic3r/PrintConfig.cpp:695 +#: src/slic3r/GUI/Tab.cpp:2070 src/slic3r/GUI/Tab.cpp:2409 +#: src/libslic3r/GCode.cpp:659 src/libslic3r/PrintConfig.cpp:788 +#: src/libslic3r/PrintConfig.cpp:798 msgid "End G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2153 +#: src/slic3r/GUI/Tab.cpp:2115 msgid "Volumetric flow hints not available" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2257 +#: src/slic3r/GUI/Tab.cpp:2241 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -8415,20 +9996,20 @@ msgid "" "physical_printer directory." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2291 src/slic3r/GUI/Tab.cpp:2518 +#: src/slic3r/GUI/Tab.cpp:2275 src/slic3r/GUI/Tab.cpp:2506 msgid "Size and coordinates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2300 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:2284 src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "Capabilities" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2305 +#: src/slic3r/GUI/Tab.cpp:2289 msgid "Number of extruders of the printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2334 +#: src/slic3r/GUI/Tab.cpp:2322 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -8436,171 +10017,194 @@ msgid "" "nozzle diameter value?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2338 src/slic3r/GUI/Tab.cpp:2782 -#: src/libslic3r/PrintConfig.cpp:1900 +#: src/slic3r/GUI/Tab.cpp:2326 src/slic3r/GUI/Tab.cpp:2714 +#: src/libslic3r/PrintConfig.cpp:1937 msgid "Nozzle diameter" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2431 src/libslic3r/GCode.cpp:709 -#: src/libslic3r/PrintConfig.cpp:425 +#: src/slic3r/GUI/Tab.cpp:2419 src/libslic3r/GCode.cpp:660 +#: src/libslic3r/PrintConfig.cpp:444 msgid "Before layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2441 src/libslic3r/GCode.cpp:710 -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/slic3r/GUI/Tab.cpp:2429 src/libslic3r/GCode.cpp:661 +#: src/libslic3r/PrintConfig.cpp:1665 msgid "After layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2451 src/libslic3r/GCode.cpp:711 -#: src/libslic3r/PrintConfig.cpp:2877 +#: src/slic3r/GUI/Tab.cpp:2439 src/libslic3r/GCode.cpp:662 +#: src/libslic3r/PrintConfig.cpp:2965 msgid "Tool change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2461 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2449 src/libslic3r/GCode.cpp:663 msgid "Between objects G-code (for sequential printing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2471 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2459 src/libslic3r/GCode.cpp:664 msgid "Color Change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2480 src/libslic3r/GCode.cpp:714 -#: src/libslic3r/PrintConfig.cpp:2491 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:665 +#: src/libslic3r/PrintConfig.cpp:2523 msgid "Pause Print G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2489 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:666 msgid "Template Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2525 +#: src/slic3r/GUI/Tab.cpp:2513 msgid "Display" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2528 msgid "Tilt" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2541 +#: src/slic3r/GUI/Tab.cpp:2529 msgid "Tilt time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2548 src/slic3r/GUI/Tab.cpp:4575 +#: src/slic3r/GUI/Tab.cpp:2536 src/slic3r/GUI/Tab.cpp:4812 msgid "Corrections" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2561 src/slic3r/GUI/Tab.cpp:4571 +#: src/slic3r/GUI/Tab.cpp:2549 src/slic3r/GUI/Tab.cpp:4808 msgid "Exposure" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2622 src/slic3r/GUI/Tab.cpp:2709 -#: src/libslic3r/PrintConfig.cpp:1655 src/libslic3r/PrintConfig.cpp:1690 -#: src/libslic3r/PrintConfig.cpp:1707 src/libslic3r/PrintConfig.cpp:1724 -#: src/libslic3r/PrintConfig.cpp:1740 src/libslic3r/PrintConfig.cpp:1750 -#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1773 -#: src/libslic3r/PrintConfig.cpp:1783 +#: src/slic3r/GUI/Tab.cpp:2556 +msgid "Output" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2615 src/slic3r/GUI/Tab.cpp:2875 +#: src/libslic3r/PrintConfig.cpp:1694 src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1744 src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1777 src/libslic3r/PrintConfig.cpp:1787 +#: src/libslic3r/PrintConfig.cpp:1797 src/libslic3r/PrintConfig.cpp:1810 +#: src/libslic3r/PrintConfig.cpp:1820 msgid "Machine limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2638 msgid "Values in this column are for Normal mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2644 msgid "Values in this column are for Stealth mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2660 +#: src/slic3r/GUI/Tab.cpp:2653 msgid "Maximum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2665 +#: src/slic3r/GUI/Tab.cpp:2658 msgid "Maximum accelerations" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2674 +#: src/slic3r/GUI/Tab.cpp:2667 msgid "Jerk limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2680 +#: src/slic3r/GUI/Tab.cpp:2673 msgid "Minimum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2734 src/slic3r/GUI/Tab.cpp:2743 -msgid "Single extruder MM setup" +#: src/slic3r/GUI/Tab.cpp:2711 +msgid "" +"This is a single extruder multimaterial printer, diameters of all extruders " +"will be set to the new value. Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2744 -msgid "Single extruder multimaterial parameters" +#: src/slic3r/GUI/Tab.cpp:2739 +msgid "Reset to Filament Color" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2779 -msgid "" -"This is a single extruder multimaterial printer, diameters of all extruders " -"will be set to the new value. Do you want to proceed?" +#: src/slic3r/GUI/Tab.cpp:2775 +msgid "Apply below setting to other extruders" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2804 +#: src/slic3r/GUI/Tab.cpp:2820 msgid "Layer height limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2809 +#: src/slic3r/GUI/Tab.cpp:2824 msgid "Position (for multi-extruder printers)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2815 +#: src/slic3r/GUI/Tab.cpp:2830 msgid "Only lift Z" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2828 +#: src/slic3r/GUI/Tab.cpp:2843 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2835 -msgid "Reset to Filament Color" +#: src/slic3r/GUI/Tab.cpp:2900 src/slic3r/GUI/Tab.cpp:2909 +msgid "Single extruder MM setup" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2910 +msgid "Single extruder multimaterial parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3012 +#: src/slic3r/GUI/Tab.cpp:3074 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" "Shall I disable it in order to enable Firmware Retraction?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3014 +#: src/slic3r/GUI/Tab.cpp:3076 msgid "Firmware Retraction" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3319 +#: src/slic3r/GUI/Tab.cpp:3384 msgid "New printer preset selected" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3625 +#: src/slic3r/GUI/Tab.cpp:3758 msgid "Detached" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3857 +msgid "" +"The physical printer below is based on the preset, you are going to rename." +msgid_plural "" +"The physical printers below are based on the preset, you are going to rename." +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Tab.cpp:3862 +msgid "Note, that the selected preset will be renamed in this printer too." +msgid_plural "" +"Note, that the selected preset will be renamed in these printers too." +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Tab.cpp:3924 msgid "remove" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3924 msgid "delete" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3711 +#: src/slic3r/GUI/Tab.cpp:3933 msgid "It's a last preset for this physical printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3716 +#: src/slic3r/GUI/Tab.cpp:3938 #, possible-boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " "\"%2%\"?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3728 +#: src/slic3r/GUI/Tab.cpp:3950 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -8608,14 +10212,14 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3733 +#: src/slic3r/GUI/Tab.cpp:3955 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3738 +#: src/slic3r/GUI/Tab.cpp:3960 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -8625,7 +10229,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3743 +#: src/slic3r/GUI/Tab.cpp:3965 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -8633,84 +10237,84 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3748 +#: src/slic3r/GUI/Tab.cpp:3970 #, possible-boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3753 +#: src/slic3r/GUI/Tab.cpp:3975 #, possible-boost-format msgid "%1% Preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3836 src/slic3r/GUI/Tab.cpp:4198 +#: src/slic3r/GUI/Tab.cpp:4061 src/slic3r/GUI/Tab.cpp:4423 msgid "Set" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:4180 msgid "Find" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3956 +#: src/slic3r/GUI/Tab.cpp:4181 msgid "Replace with" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4045 +#: src/slic3r/GUI/Tab.cpp:4270 msgid "Regular expression" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4049 +#: src/slic3r/GUI/Tab.cpp:4274 msgid "Case insensitive" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4053 +#: src/slic3r/GUI/Tab.cpp:4278 msgid "Whole word" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4057 +#: src/slic3r/GUI/Tab.cpp:4282 msgid "Match single line" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4160 +#: src/slic3r/GUI/Tab.cpp:4385 msgid "Are you sure you want to delete all substitutions?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4292 +#: src/slic3r/GUI/Tab.cpp:4521 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4295 +#: src/slic3r/GUI/Tab.cpp:4524 msgid "" "Machine limits will NOT be emitted to G-code, however they will be used to " "estimate print time, which may therefore not be accurate as the printer may " "apply a different set of machine limits." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4299 +#: src/slic3r/GUI/Tab.cpp:4528 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4321 +#: src/slic3r/GUI/Tab.cpp:4550 msgid "LOCKED LOCK" msgstr "" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4323 +#: src/slic3r/GUI/Tab.cpp:4552 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4325 +#: src/slic3r/GUI/Tab.cpp:4554 msgid "UNLOCKED LOCK" msgstr "" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4327 +#: src/slic3r/GUI/Tab.cpp:4556 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -8718,23 +10322,23 @@ msgid "" "to the system (or default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4332 +#: src/slic3r/GUI/Tab.cpp:4561 msgid "WHITE BULLET" msgstr "" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4334 +#: src/slic3r/GUI/Tab.cpp:4563 msgid "" "for the left button: indicates a non-system (or non-default) preset,\n" "for the right button: indicates that the settings hasn't been modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4337 +#: src/slic3r/GUI/Tab.cpp:4566 msgid "BACK ARROW" msgstr "" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4339 +#: src/slic3r/GUI/Tab.cpp:4568 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -8742,13 +10346,13 @@ msgid "" "to the last saved preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4349 +#: src/slic3r/GUI/Tab.cpp:4578 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4351 +#: src/slic3r/GUI/Tab.cpp:4580 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " "equal to the system (or default) values for the current option group.\n" @@ -8756,17 +10360,17 @@ msgid "" "default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4354 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4357 +#: src/slic3r/GUI/Tab.cpp:4586 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4359 +#: src/slic3r/GUI/Tab.cpp:4588 msgid "" "BACK ARROW icon indicates that the settings were changed and are not equal " "to the last saved preset for the current option group.\n" @@ -8774,131 +10378,129 @@ msgid "" "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4594 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4366 +#: src/slic3r/GUI/Tab.cpp:4595 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" "Click to reset current value to the system (or default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4601 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4373 +#: src/slic3r/GUI/Tab.cpp:4602 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" "Click to reset current value to the last saved preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4527 src/slic3r/GUI/Tab.cpp:4529 +#: src/slic3r/GUI/Tab.cpp:4764 src/slic3r/GUI/Tab.cpp:4766 msgid "Material" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4614 src/slic3r/GUI/Tab.cpp:4615 +#: src/slic3r/GUI/Tab.cpp:4851 src/slic3r/GUI/Tab.cpp:4852 msgid "Material printing profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4667 +#: src/slic3r/GUI/Tab.cpp:4901 msgid "Support head" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4672 +#: src/slic3r/GUI/Tab.cpp:4906 msgid "Support pillar" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4695 +#: src/slic3r/GUI/Tab.cpp:4929 msgid "Connection of the support sticks and junctions" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4700 +#: src/slic3r/GUI/Tab.cpp:4956 msgid "Automatic generation" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4775 +#: src/slic3r/GUI/Tab.cpp:5024 #, possible-boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" "To enable \"%1%\", please switch off \"%2%\"" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3724 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3497 msgid "Object elevation" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3826 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3958 msgid "Pad around object" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:153 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:162 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1047 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1100 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1115 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1130 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1145 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:147 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:156 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:165 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1107 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1122 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1137 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1152 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1197 msgid "Undef" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:772 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:792 msgid "Unsaved Changes" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:790 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:810 msgid "Switching Presets: Unsaved Changes" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:832 -msgid "Old Value" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:858 +msgid "Original Value" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:859 +msgid "Modified Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:833 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:861 msgid "New Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:867 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 msgid "Keep" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1569 msgid "Transfer" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 msgid "Don't save" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 -msgid "Discard" -msgstr "" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:877 -msgid "Save" -msgstr "" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:898 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:926 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "create new project" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:927 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "switch a preset" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:900 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:928 msgid "" "You will not be asked about the unsaved changes in presets the next time " "you: \n" @@ -8906,179 +10508,282 @@ msgid "" "- Loading a new project while some presets are modified" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:903 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:931 msgid "PrusaSlicer will remember your action." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:904 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:932 #, possible-boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" "to be asked about unsaved changes again." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:964 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1772 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will not be saved" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will be discarded." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:941 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:969 msgid "Save the selected options." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:942 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:970 msgid "Keep the selected settings." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:943 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:971 msgid "Transfer the selected settings to the newly selected preset." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:947 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:975 #, possible-boost-format msgid "Save the selected options to preset \"%1%\"." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:948 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:976 #, possible-boost-format msgid "Transfer the selected options to the newly selected preset \"%1%\"." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1224 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1237 msgid "The following preset was modified" msgid_plural "The following presets were modified" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1230 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1243 #, possible-boost-format msgid "Preset \"%1%\" has the following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1234 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1247 #, possible-boost-format msgid "" "Preset \"%1%\" is not compatible with the new printer profile and it has the " "following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1235 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1248 #, possible-boost-format msgid "" "Preset \"%1%\" is not compatible with the new print profile and it has the " "following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1297 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1850 msgid "Extruders count" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 -msgid "Select presets to compare" -msgstr "" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1326 +msgid "The preset modifications are successfully saved" +msgid_plural "The presets modifications are successfully saved" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1515 msgid "Show all presets (including incompatible)" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1533 +msgid "Select presets to compare" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1545 msgid "Left Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1546 msgid "Right Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1595 +msgid "" +"Transfer the selected options from left preset to the right.\n" +"Note: New modified presets will be selected in settings tabs after close " +"this dialog." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1603 +msgid "Save the selected options from left preset to the right." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1621 +msgid "Transfer values from left to right" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1622 +msgid "" +"If enabled, this dialog can be used for transver selected values from left " +"to right preset." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1807 msgid "One of the presets doesn't found" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1818 msgid "Compared presets has different printer technology" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1832 msgid "Presets are the same" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1840 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef category" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef group" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:2016 +msgid "Modified" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:41 msgid "Update available" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UpdateDialogs.cpp:41 #, possible-c-format, possible-boost-format msgid "New version of %s is available" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:42 +#: src/slic3r/GUI/UpdateDialogs.cpp:46 src/slic3r/GUI/UpdateDialogs.cpp:101 msgid "Current version:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:44 +#: src/slic3r/GUI/UpdateDialogs.cpp:48 src/slic3r/GUI/UpdateDialogs.cpp:103 +#: src/slic3r/GUI/UpdateDialogs.cpp:141 msgid "New version:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:52 +#: src/slic3r/GUI/UpdateDialogs.cpp:56 msgid "Changelog & Download" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:59 src/slic3r/GUI/UpdateDialogs.cpp:133 -#: src/slic3r/GUI/UpdateDialogs.cpp:191 +#: src/slic3r/GUI/UpdateDialogs.cpp:63 src/slic3r/GUI/UpdateDialogs.cpp:309 +#: src/slic3r/GUI/UpdateDialogs.cpp:367 msgid "Open changelog page" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:65 +#: src/slic3r/GUI/UpdateDialogs.cpp:69 msgid "Open download page" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:72 +#: src/slic3r/GUI/UpdateDialogs.cpp:76 src/slic3r/GUI/UpdateDialogs.cpp:109 msgid "Don't notify about new releases any more" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +msgid "App Update available" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +#, possible-c-format, possible-boost-format +msgid "" +"New version of %s is available.\n" +"Do you wish to download it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:120 +msgid "Next" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +msgid "App Update download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +#, possible-c-format, possible-boost-format +msgid "New version of %s is available." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:146 +msgid "Run installer after download. (Otherwise file explorer will be opened)" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:151 +msgid "Target directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:158 +msgid "Select directory" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:176 +msgid "Select directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:193 +msgid "Download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:204 +msgid "Directory path is empty." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:212 +msgid "Directory path is incorrect." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:217 +#, possible-boost-format +msgid "Directory %1% doesn't exists. Do you wish to create it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:222 +msgid "Failed to create directory." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:229 +#, possible-boost-format +msgid "File %1% already exists. Do you wish to overwrite it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +#, possible-boost-format +msgid "Download path is %1%. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:270 msgid "Opening Configuration Wizard" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 src/slic3r/GUI/UpdateDialogs.cpp:261 +#: src/slic3r/GUI/UpdateDialogs.cpp:270 src/slic3r/GUI/UpdateDialogs.cpp:437 msgid "Configuration update" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:95 +#: src/slic3r/GUI/UpdateDialogs.cpp:271 msgid "" "PrusaSlicer is not using the newest configuration available.\n" "Configuration Wizard may not offer the latest printers, filaments and SLA " "materials to be installed." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:97 +#: src/slic3r/GUI/UpdateDialogs.cpp:273 msgid "Configuration update is available" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:100 +#: src/slic3r/GUI/UpdateDialogs.cpp:276 msgid "" "Would you like to install it?\n" "\n" @@ -9088,28 +10793,28 @@ msgid "" "Updated configuration bundles:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:121 src/slic3r/GUI/UpdateDialogs.cpp:181 +#: src/slic3r/GUI/UpdateDialogs.cpp:297 src/slic3r/GUI/UpdateDialogs.cpp:357 msgid "Comment:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:142 +#: src/slic3r/GUI/UpdateDialogs.cpp:318 msgid "Install" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:144 +#: src/slic3r/GUI/UpdateDialogs.cpp:320 msgid "Don't install" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 src/slic3r/GUI/UpdateDialogs.cpp:212 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 src/slic3r/GUI/UpdateDialogs.cpp:388 #, possible-c-format, possible-boost-format msgid "%s incompatibility" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 msgid "You must install a configuration update." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:160 +#: src/slic3r/GUI/UpdateDialogs.cpp:336 #, possible-c-format, possible-boost-format msgid "" "%s will now start updates. Otherwise it won't be able to start.\n" @@ -9120,17 +10825,12 @@ msgid "" "Updated configuration bundles:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:200 src/slic3r/GUI/UpdateDialogs.cpp:247 -#, possible-c-format, possible-boost-format -msgid "Exit %s" -msgstr "" - -#: src/slic3r/GUI/UpdateDialogs.cpp:213 +#: src/slic3r/GUI/UpdateDialogs.cpp:389 #, possible-c-format, possible-boost-format msgid "%s configuration is incompatible" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:216 +#: src/slic3r/GUI/UpdateDialogs.cpp:392 #, possible-c-format, possible-boost-format msgid "" "This version of %s is not compatible with currently installed configuration " @@ -9143,20 +10843,20 @@ msgid "" "existing configuration before installing files compatible with this %s." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#: src/slic3r/GUI/UpdateDialogs.cpp:401 #, possible-c-format, possible-boost-format msgid "This %s version: %s" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:230 +#: src/slic3r/GUI/UpdateDialogs.cpp:406 msgid "Incompatible bundles:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:246 +#: src/slic3r/GUI/UpdateDialogs.cpp:422 msgid "Re-configure" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:265 +#: src/slic3r/GUI/UpdateDialogs.cpp:441 #, possible-c-format, possible-boost-format msgid "" "%s now uses an updated configuration structure.\n" @@ -9172,28 +10872,37 @@ msgid "" "choose whether to enable automatic preset updates." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:282 +#: src/slic3r/GUI/UpdateDialogs.cpp:458 msgid "For more information please visit our wiki page:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 msgid "Configuration updates" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 src/slic3r/GUI/UpdateDialogs.cpp:495 msgid "No updates available" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:304 +#: src/slic3r/GUI/UpdateDialogs.cpp:480 #, possible-c-format, possible-boost-format msgid "%s has no configuration updates available." msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:21 +#: src/slic3r/GUI/UpdateDialogs.cpp:495 +msgid "App update" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:500 +#, possible-c-format, possible-boost-format +msgid "%s has no version updates available." +msgstr "" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:23 msgid "Ramming customization" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:54 +#: src/slic3r/GUI/WipeTowerDialog.cpp:56 msgid "" "Ramming denotes the rapid extrusion just before a tool change in a single-" "extruder MM printer. Its purpose is to properly shape the end of the " @@ -9206,63 +10915,63 @@ msgid "" "jams, extruder wheel grinding into filament etc." msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:114 +#: src/slic3r/GUI/WipeTowerDialog.cpp:116 msgid "Total ramming time" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 msgid "Total rammed volume" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:120 +#: src/slic3r/GUI/WipeTowerDialog.cpp:122 msgid "Ramming line width" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:122 +#: src/slic3r/GUI/WipeTowerDialog.cpp:124 msgid "Ramming line spacing" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:173 +#: src/slic3r/GUI/WipeTowerDialog.cpp:175 msgid "Wipe tower - Purging volume adjustment" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:299 +#: src/slic3r/GUI/WipeTowerDialog.cpp:301 msgid "" "Here you can adjust required purging volume (mm³) for any given pair of " "tools." msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:300 +#: src/slic3r/GUI/WipeTowerDialog.cpp:302 msgid "Extruder changed to" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:308 +#: src/slic3r/GUI/WipeTowerDialog.cpp:310 msgid "unloaded" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:309 +#: src/slic3r/GUI/WipeTowerDialog.cpp:311 msgid "loaded" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:352 +#: src/slic3r/GUI/WipeTowerDialog.cpp:354 msgid "Tool #" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:361 +#: src/slic3r/GUI/WipeTowerDialog.cpp:363 msgid "" "Total purging volume is calculated by summing two values below, depending on " "which tools are loaded/unloaded." msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:362 +#: src/slic3r/GUI/WipeTowerDialog.cpp:364 msgid "Volume to purge (mm³) when the filament is being" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:376 +#: src/slic3r/GUI/WipeTowerDialog.cpp:378 msgid "From" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:442 +#: src/slic3r/GUI/WipeTowerDialog.cpp:444 msgid "" "Switching to simple settings will discard changes done in the advanced " "mode!\n" @@ -9270,26 +10979,28 @@ msgid "" "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show simplified settings" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show advanced settings" msgstr "" -#: src/slic3r/GUI/wxExtensions.cpp:644 +#: src/slic3r/GUI/wxExtensions.cpp:672 #, possible-c-format, possible-boost-format msgid "Switch to the %s mode" msgstr "" -#: src/slic3r/GUI/wxExtensions.cpp:645 +#: src/slic3r/GUI/wxExtensions.cpp:673 #, possible-c-format, possible-boost-format msgid "Current mode is %s" msgstr "" -#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:141 -#: src/slic3r/Utils/Repetier.cpp:69 +#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:206 +#: src/slic3r/Utils/OctoPrint.cpp:255 src/slic3r/Utils/OctoPrint.cpp:666 +#: src/slic3r/Utils/OctoPrint.cpp:824 src/slic3r/Utils/OctoPrint.cpp:897 +#: src/slic3r/Utils/Repetier.cpp:88 #, possible-c-format, possible-boost-format msgid "Mismatched type of print host: %s" msgstr "" @@ -9406,69 +11117,100 @@ msgid "" "is required." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:164 +#: src/slic3r/Utils/OctoPrint.cpp:278 msgid "Connection to OctoPrint works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:170 +#: src/slic3r/Utils/OctoPrint.cpp:284 msgid "Could not connect to OctoPrint" msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:172 +#: src/slic3r/Utils/OctoPrint.cpp:286 msgid "Note: OctoPrint version at least 1.1.0 is required." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:292 +#: src/slic3r/Utils/OctoPrint.cpp:528 msgid "Connection to Prusa SL1 / SL1S works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:298 +#: src/slic3r/Utils/OctoPrint.cpp:534 msgid "Could not connect to Prusa SLA" msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:336 +#: src/slic3r/Utils/OctoPrint.cpp:573 msgid "Connection to PrusaLink works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:342 +#: src/slic3r/Utils/OctoPrint.cpp:579 msgid "Could not connect to PrusaLink" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:61 +#: src/slic3r/Utils/OctoPrint.cpp:776 +msgid "Storages found:" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "read only" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "no free space" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:781 +#, possible-boost-format +msgid "Upload has failed. There is no suitable storage found at %1%.%2%" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:64 #, possible-boost-format msgid "Copying of file %1% to %2% failed: %3%" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:645 -#: src/slic3r/Utils/PresetUpdater.cpp:662 +#: src/slic3r/Utils/PresetUpdater.cpp:998 +#: src/slic3r/Utils/PresetUpdater.cpp:1015 msgid "Continue and install configuration updates?" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:777 +#: src/slic3r/Utils/PresetUpdater.cpp:1021 +msgid "Installing profiles" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1071 +#, possible-boost-format +msgid "Downloading resources for %1%." +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1171 msgid "" -"Configuration Updates causes a lost of preset modification.\n" +"Configuration Update will cause the preset modification to be lost.\n" "So, check unsaved changes and save them if necessary." msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:779 +#: src/slic3r/Utils/PresetUpdater.cpp:1173 msgid "Updating" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:808 +#: src/slic3r/Utils/PresetUpdater.cpp:1202 #, possible-c-format, possible-boost-format msgid "requires min. %s and max. %s" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:812 +#: src/slic3r/Utils/PresetUpdater.cpp:1206 #, possible-c-format, possible-boost-format msgid "requires min. %s" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:815 +#: src/slic3r/Utils/PresetUpdater.cpp:1209 #, possible-c-format, possible-boost-format msgid "requires max. %s" msgstr "" +#: src/slic3r/Utils/PresetUpdater.cpp:1362 +#, possible-boost-format +msgid "Couldn't locate idx file %1% when performing updates." +msgstr "" + #: src/slic3r/Utils/Http.cpp:73 msgid "" "Could not detect system SSL certificate store. PrusaSlicer will be unable to " @@ -9493,30 +11235,30 @@ msgid "" "connections. See logs for additional details." msgstr "" -#: src/slic3r/Utils/Process.cpp:157 +#: src/slic3r/Utils/Process.cpp:164 msgid "Open G-code file:" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:84 +#: src/slic3r/Utils/Repetier.cpp:103 msgid "Connection to Repetier works correctly." msgstr "" -#: src/slic3r/Utils/Repetier.cpp:90 +#: src/slic3r/Utils/Repetier.cpp:109 msgid "Could not connect to Repetier" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:92 +#: src/slic3r/Utils/Repetier.cpp:111 msgid "Note: Repetier version at least 0.90.0 is required." msgstr "" -#: src/slic3r/Utils/Repetier.cpp:246 +#: src/slic3r/Utils/Repetier.cpp:263 #, possible-boost-format msgid "" "HTTP status: %1%\n" "Message body: \"%2%\"" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:253 +#: src/slic3r/Utils/Repetier.cpp:270 #, possible-boost-format msgid "" "Parsing of host response failed.\n" @@ -9524,7 +11266,7 @@ msgid "" "Error: \"%2%\"" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:266 +#: src/slic3r/Utils/Repetier.cpp:283 #, possible-boost-format msgid "" "Enumeration of host printers failed.\n" @@ -9553,94 +11295,90 @@ msgstr "" msgid "Abort" msgstr "" -#: src/libslic3r/GCode.cpp:539 +#: src/libslic3r/GCode.cpp:490 msgid "There is an object with no extrusions in the first layer." msgstr "" -#: src/libslic3r/GCode.cpp:570 +#: src/libslic3r/GCode.cpp:521 #, possible-boost-format msgid "Empty layer between %1% and %2%." msgstr "" -#: src/libslic3r/GCode.cpp:573 +#: src/libslic3r/GCode.cpp:524 msgid "(Some lines not shown)" msgstr "" -#: src/libslic3r/GCode.cpp:575 +#: src/libslic3r/GCode.cpp:526 #, possible-boost-format msgid "Object name: %1%" msgstr "" -#: src/libslic3r/GCode.cpp:576 +#: src/libslic3r/GCode.cpp:527 msgid "" "Make sure the object is printable. This is usually caused by negligibly " "small extrusions or by a faulty model. Try to repair the model or change its " "orientation on the bed." msgstr "" -#: src/libslic3r/GCode.cpp:718 +#: src/libslic3r/GCode.cpp:669 msgid "Filament Start G-code" msgstr "" -#: src/libslic3r/GCode.cpp:725 +#: src/libslic3r/GCode.cpp:676 msgid "Filament End G-code" msgstr "" -#: src/libslic3r/GCode.cpp:764 +#: src/libslic3r/GCode.cpp:717 msgid "In the custom G-code were found reserved keywords:" msgstr "" -#: src/libslic3r/GCode.cpp:766 +#: src/libslic3r/GCode.cpp:719 msgid "" "This may cause problems in g-code visualization and printing time estimation." msgstr "" -#: src/libslic3r/GCode.cpp:1200 src/libslic3r/GCode.cpp:1211 +#: src/libslic3r/GCode.cpp:1124 src/libslic3r/GCode.cpp:1135 msgid "No extrusions were generated for objects." msgstr "" -#: src/libslic3r/GCode.cpp:1406 +#: src/libslic3r/GCode.cpp:1328 msgid "" "Your print is very close to the priming regions. Make sure there is no " "collision." msgstr "" -#: src/libslic3r/ExtrusionEntity.cpp:344 src/libslic3r/ExtrusionEntity.cpp:380 -msgid "Mixed" -msgstr "" - #: src/libslic3r/Flow.cpp:61 #, possible-boost-format msgid "" "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1735 +#: src/libslic3r/Format/3mf.cpp:1880 #, possible-boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1746 +#: src/libslic3r/Format/3mf.cpp:1891 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1750 +#: src/libslic3r/Format/3mf.cpp:1895 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1754 +#: src/libslic3r/Format/3mf.cpp:1899 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/AMF.cpp:993 +#: src/libslic3r/Format/AMF.cpp:1000 #, possible-boost-format msgid "" "The selected amf file has been saved with a newer version of %1% and is not " @@ -9783,115 +11521,133 @@ msgstr "" msgid "write calledback failed" msgstr "" -#: src/libslic3r/Print.cpp:454 +#: src/libslic3r/Print.cpp:473 msgid "All objects are outside of the print volume." msgstr "" -#: src/libslic3r/Print.cpp:457 +#: src/libslic3r/Print.cpp:476 msgid "The supplied settings will cause an empty print." msgstr "" -#: src/libslic3r/Print.cpp:461 +#: src/libslic3r/Print.cpp:480 msgid "Some objects are too close; your extruder will collide with them." msgstr "" -#: src/libslic3r/Print.cpp:463 +#: src/libslic3r/Print.cpp:482 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." msgstr "" -#: src/libslic3r/Print.cpp:472 +#: src/libslic3r/Print.cpp:486 +msgid "" +"Avoid crossing perimeters option and avoid crossing curled overhangs option " +"cannot be both enabled together." +msgstr "" + +#: src/libslic3r/Print.cpp:495 msgid "" "Only a single object may be printed at a time in Spiral Vase mode. Either " "remove all but the last object, or enable sequential mode by " "\"complete_objects\"." msgstr "" -#: src/libslic3r/Print.cpp:476 +#: src/libslic3r/Print.cpp:499 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." msgstr "" -#: src/libslic3r/Print.cpp:489 +#: src/libslic3r/Print.cpp:523 +msgid "" +"The print is taller than the maximum allowed height. You might want to " +"reduce the size of your model or change current print settings and retry." +msgstr "" + +#: src/libslic3r/Print.cpp:540 +msgid "Variable layer height is not supported with Organic supports." +msgstr "" + +#: src/libslic3r/Print.cpp:553 msgid "" "The wipe tower is only supported if all extruders have the same nozzle " "diameter and use filaments of the same diameter." msgstr "" -#: src/libslic3r/Print.cpp:495 +#: src/libslic3r/Print.cpp:559 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, " "RepRapFirmware and Repetier G-code flavors." msgstr "" -#: src/libslic3r/Print.cpp:497 +#: src/libslic3r/Print.cpp:561 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." msgstr "" -#: src/libslic3r/Print.cpp:499 -msgid "Ooze prevention is currently not supported with the wipe tower enabled." +#: src/libslic3r/Print.cpp:563 +msgid "" +"Ooze prevention is only supported with the wipe tower when " +"'single_extruder_multi_material' is off." msgstr "" -#: src/libslic3r/Print.cpp:501 +#: src/libslic3r/Print.cpp:565 msgid "" "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." msgstr "" -#: src/libslic3r/Print.cpp:503 +#: src/libslic3r/Print.cpp:567 msgid "" "The Wipe Tower is currently not supported for multimaterial sequential " "prints." msgstr "" -#: src/libslic3r/Print.cpp:524 +#: src/libslic3r/Print.cpp:577 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " "layer heights" msgstr "" -#: src/libslic3r/Print.cpp:526 +#: src/libslic3r/Print.cpp:579 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "over an equal number of raft layers" msgstr "" -#: src/libslic3r/Print.cpp:529 +#: src/libslic3r/Print.cpp:582 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "with the same support_material_contact_distance" msgstr "" -#: src/libslic3r/Print.cpp:531 +#: src/libslic3r/Print.cpp:584 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." msgstr "" -#: src/libslic3r/Print.cpp:555 +#: src/libslic3r/Print.cpp:609 msgid "" "The Wipe tower is only supported if all objects have the same variable layer " "height" msgstr "" -#: src/libslic3r/Print.cpp:579 +#: src/libslic3r/Print.cpp:633 msgid "" "One or more object were assigned an extruder that the printer does not have." msgstr "" -#: src/libslic3r/Print.cpp:592 +#: src/libslic3r/Print.cpp:646 #, possible-boost-format msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" msgstr "" -#: src/libslic3r/Print.cpp:595 +#: src/libslic3r/Print.cpp:649 #, possible-boost-format msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" msgstr "" -#: src/libslic3r/Print.cpp:606 +#: src/libslic3r/Print.cpp:660 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " @@ -9899,172 +11655,223 @@ msgid "" "same diameter." msgstr "" -#: src/libslic3r/Print.cpp:614 +#: src/libslic3r/Print.cpp:668 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers " -"need to be synchronized with the object layers." -msgstr "" - -#: src/libslic3r/Print.cpp:618 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only if they are " -"printed with the current extruder without triggering a tool change. (both " -"support_material_extruder and support_material_interface_extruder need to be " -"set to 0)." +"need to be synchronized with the object layers." msgstr "" -#: src/libslic3r/Print.cpp:654 +#: src/libslic3r/Print.cpp:708 msgid "First layer height can't be greater than nozzle diameter" msgstr "" -#: src/libslic3r/Print.cpp:659 +#: src/libslic3r/Print.cpp:713 msgid "Layer height can't be greater than nozzle diameter" msgstr "" -#: src/libslic3r/Print.cpp:680 +#: src/libslic3r/Print.cpp:734 msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " "layer_gcode." msgstr "" -#: src/libslic3r/Print.cpp:682 +#: src/libslic3r/Print.cpp:736 msgid "" "\"G92 E0\" was found in before_layer_gcode, which is incompatible with " "absolute extruder addressing." msgstr "" -#: src/libslic3r/Print.cpp:684 +#: src/libslic3r/Print.cpp:738 msgid "" "\"G92 E0\" was found in layer_gcode, which is incompatible with absolute " "extruder addressing." msgstr "" -#: src/libslic3r/Print.cpp:826 +#: src/libslic3r/Print.cpp:880 msgid "Infilling layers" msgstr "" -#: src/libslic3r/Print.cpp:848 +#: src/libslic3r/Print.cpp:908 msgid "Generating skirt and brim" msgstr "" -#: src/libslic3r/Print.cpp:896 +#: src/libslic3r/Print.cpp:956 msgid "Exporting G-code" msgstr "" -#: src/libslic3r/Print.cpp:900 +#: src/libslic3r/Print.cpp:960 msgid "Generating G-code" msgstr "" +#: src/libslic3r/Print.cpp:1169 +msgid "Alert if supports needed" +msgstr "" + +#: src/libslic3r/Print.cpp:1174 +msgid "long bridging extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1175 +msgid "floating bridge anchors" +msgstr "" + +#: src/libslic3r/Print.cpp:1178 +msgid "collapsing overhang" +msgstr "" + +#: src/libslic3r/Print.cpp:1180 +msgid "loose extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1183 +msgid "low bed adhesion" +msgstr "" + +#: src/libslic3r/Print.cpp:1184 +msgid "floating object part" +msgstr "" + +#: src/libslic3r/Print.cpp:1185 +msgid "thin fragile section" +msgstr "" + +#: src/libslic3r/Print.cpp:1221 +msgid "Detected print stability issues" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "or" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "and" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "brim" +msgstr "" + +#: src/libslic3r/Print.cpp:1248 +msgid "Consider enabling supports" +msgstr "" + #: src/libslic3r/SLA/Pad.cpp:533 msgid "Pad brim size is too small for the current configuration." msgstr "" -#: src/libslic3r/SLAPrint.cpp:628 +#: src/libslic3r/SLAPrint.cpp:546 msgid "" "Cannot proceed without support points! Add support points or disable support " "generation." msgstr "" -#: src/libslic3r/SLAPrint.cpp:640 +#: src/libslic3r/SLAPrint.cpp:558 msgid "" "Elevation is too low for object. Use the \"Pad around object\" feature to " "print the object without elevation." msgstr "" -#: src/libslic3r/SLAPrint.cpp:646 +#: src/libslic3r/SLAPrint.cpp:564 msgid "" "The endings of the support pillars will be deployed on the gap between the " "object and the pad. 'Support base safety distance' has to be greater than " "the 'Pad object gap' parameter to avoid this." msgstr "" -#: src/libslic3r/SLAPrint.cpp:661 +#: src/libslic3r/SLAPrint.cpp:579 msgid "Exposition time is out of printer profile bounds." msgstr "" -#: src/libslic3r/SLAPrint.cpp:668 +#: src/libslic3r/SLAPrint.cpp:586 msgid "Initial exposition time is out of printer profile bounds." msgstr "" -#: src/libslic3r/SLAPrint.cpp:784 +#: src/libslic3r/SLAPrint.cpp:693 msgid "Slicing done" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:47 +#: src/libslic3r/SLAPrintSteps.cpp:57 +msgid "Assembling model from parts" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:58 msgid "Hollowing model" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:48 +#: src/libslic3r/SLAPrintSteps.cpp:59 msgid "Drilling holes into model." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:49 +#: src/libslic3r/SLAPrintSteps.cpp:60 msgid "Slicing model" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:50 src/libslic3r/SLAPrintSteps.cpp:639 +#: src/libslic3r/SLAPrintSteps.cpp:61 src/libslic3r/SLAPrintSteps.cpp:691 msgid "Generating support points" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:51 +#: src/libslic3r/SLAPrintSteps.cpp:62 msgid "Generating support tree" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:52 +#: src/libslic3r/SLAPrintSteps.cpp:63 msgid "Generating pad" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:53 +#: src/libslic3r/SLAPrintSteps.cpp:64 msgid "Slicing supports" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:68 +#: src/libslic3r/SLAPrintSteps.cpp:79 msgid "Merging slices and calculating statistics" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:69 +#: src/libslic3r/SLAPrintSteps.cpp:80 msgid "Rasterizing layers" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:435 -msgid "Too many overlapping holes." -msgstr "" - -#: src/libslic3r/SLAPrintSteps.cpp:442 +#: src/libslic3r/SLAPrintSteps.cpp:255 msgid "" "Mesh to be hollowed is not suitable for hollowing (does not bound a volume)." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:450 +#: src/libslic3r/SLAPrintSteps.cpp:262 msgid "Unable to drill the current configuration of holes into the model." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:470 +#: src/libslic3r/SLAPrintSteps.cpp:271 msgid "" "Drilling holes into the mesh failed. This is usually caused by broken model. " "Try to fix it first." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:476 +#: src/libslic3r/SLAPrintSteps.cpp:279 msgid "Failed to drill some holes into the model" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:520 +#: src/libslic3r/SLAPrintSteps.cpp:289 +msgid "" +"Can't perform full mesh booleans! Some parts of the print will be previewed " +"with approximated meshes. This does not affect the quality of slices or the " +"physical print in any way." +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:510 msgid "" "Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:691 src/libslic3r/SLAPrintSteps.cpp:700 -#: src/libslic3r/SLAPrintSteps.cpp:738 +#: src/libslic3r/SLAPrintSteps.cpp:740 src/libslic3r/SLAPrintSteps.cpp:749 +#: src/libslic3r/SLAPrintSteps.cpp:787 msgid "Visualizing supports" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:730 +#: src/libslic3r/SLAPrintSteps.cpp:779 msgid "No pad can be generated for this model with the current configuration" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:854 +#: src/libslic3r/SLAPrintSteps.cpp:908 msgid "" "There are unprintable objects. Try to adjust support settings to make the " "objects printable." @@ -10074,73 +11881,73 @@ msgstr "" msgid "Failed processing of the output_filename_format template." msgstr "" -#: src/libslic3r/PrintConfig.cpp:236 src/libslic3r/PrintConfig.cpp:237 +#: src/libslic3r/PrintConfig.cpp:254 src/libslic3r/PrintConfig.cpp:255 msgid "Printer technology" msgstr "" -#: src/libslic3r/PrintConfig.cpp:244 +#: src/libslic3r/PrintConfig.cpp:260 msgid "Bed shape" msgstr "" -#: src/libslic3r/PrintConfig.cpp:249 +#: src/libslic3r/PrintConfig.cpp:265 msgid "Bed custom texture" msgstr "" -#: src/libslic3r/PrintConfig.cpp:254 +#: src/libslic3r/PrintConfig.cpp:270 msgid "Bed custom model" msgstr "" -#: src/libslic3r/PrintConfig.cpp:259 +#: src/libslic3r/PrintConfig.cpp:275 msgid "Elephant foot compensation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:261 +#: src/libslic3r/PrintConfig.cpp:277 msgid "" "The first layer will be shrunk in the XY plane by the configured value to " "compensate for the 1st layer squish aka an Elephant Foot effect." msgstr "" -#: src/libslic3r/PrintConfig.cpp:269 +#: src/libslic3r/PrintConfig.cpp:285 msgid "G-code thumbnails" msgstr "" -#: src/libslic3r/PrintConfig.cpp:270 +#: src/libslic3r/PrintConfig.cpp:286 msgid "" "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " "following format: \"XxY, XxY, ...\"" msgstr "" -#: src/libslic3r/PrintConfig.cpp:276 +#: src/libslic3r/PrintConfig.cpp:292 msgid "Format of G-code thumbnails" msgstr "" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:293 msgid "" "Format of G-code thumbnails: PNG for best quality, JPG for smallest size, " "QOI for low memory firmware" msgstr "" -#: src/libslic3r/PrintConfig.cpp:288 +#: src/libslic3r/PrintConfig.cpp:301 msgid "" "This setting controls the height (and thus the total number) of the slices/" "layers. Thinner layers give better accuracy but take more time to print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:295 +#: src/libslic3r/PrintConfig.cpp:308 msgid "Max print height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:296 +#: src/libslic3r/PrintConfig.cpp:309 msgid "" "Set this to the maximum height that can be reached by your extruder while " "printing." msgstr "" -#: src/libslic3r/PrintConfig.cpp:304 +#: src/libslic3r/PrintConfig.cpp:317 msgid "Hostname, IP or URL" msgstr "" -#: src/libslic3r/PrintConfig.cpp:305 +#: src/libslic3r/PrintConfig.cpp:318 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the hostname, IP address or URL of the printer host instance. Print host " @@ -10149,78 +11956,90 @@ msgid "" "password@your-octopi-address/" msgstr "" -#: src/libslic3r/PrintConfig.cpp:314 +#: src/libslic3r/PrintConfig.cpp:327 msgid "API Key / Password" msgstr "" -#: src/libslic3r/PrintConfig.cpp:315 +#: src/libslic3r/PrintConfig.cpp:328 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the API Key or the password required for authentication." msgstr "" -#: src/libslic3r/PrintConfig.cpp:323 +#: src/libslic3r/PrintConfig.cpp:336 msgid "Name of the printer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:331 +#: src/libslic3r/PrintConfig.cpp:344 msgid "" "Custom CA certificate file can be specified for HTTPS OctoPrint connections, " "in crt/pem format. If left blank, the default OS CA certificate repository " "is used." msgstr "" -#: src/libslic3r/PrintConfig.cpp:347 +#: src/libslic3r/PrintConfig.cpp:360 msgid "Password" msgstr "" -#: src/libslic3r/PrintConfig.cpp:355 +#: src/libslic3r/PrintConfig.cpp:368 msgid "Ignore HTTPS certificate revocation checks" msgstr "" -#: src/libslic3r/PrintConfig.cpp:356 +#: src/libslic3r/PrintConfig.cpp:369 msgid "" "Ignore HTTPS certificate revocation checks in case of missing or offline " "distribution points. One may want to enable this option for self signed " "certificates if connection fails." msgstr "" -#: src/libslic3r/PrintConfig.cpp:363 +#: src/libslic3r/PrintConfig.cpp:376 msgid "Printer preset names" msgstr "" -#: src/libslic3r/PrintConfig.cpp:364 +#: src/libslic3r/PrintConfig.cpp:377 msgid "Names of presets related to the physical printer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:369 +#: src/libslic3r/PrintConfig.cpp:382 msgid "Authorization Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:374 +#: src/libslic3r/PrintConfig.cpp:385 msgid "API key" msgstr "" -#: src/libslic3r/PrintConfig.cpp:375 +#: src/libslic3r/PrintConfig.cpp:386 msgid "HTTP digest" msgstr "" -#: src/libslic3r/PrintConfig.cpp:395 +#: src/libslic3r/PrintConfig.cpp:406 +msgid "Avoid crossing curled overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:407 +msgid "" +"Plan travel moves such that the extruder avoids areas where the filament may " +"be curled up. This is mostly happening on steeper rounded overhangs and may " +"cause a crash with the nozzle. This feature slows down both the print and " +"the G-code generation." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:414 msgid "Avoid crossing perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:396 +#: src/libslic3r/PrintConfig.cpp:415 msgid "" "Optimize travel moves in order to minimize the crossing of perimeters. This " "is mostly useful with Bowden extruders which suffer from oozing. This " "feature slows down both the print and the G-code generation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:403 +#: src/libslic3r/PrintConfig.cpp:422 msgid "Avoid crossing perimeters - Max detour length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:405 +#: src/libslic3r/PrintConfig.cpp:424 msgid "" "The maximum detour length for avoid crossing perimeters. If the detour is " "longer than this value, avoid crossing perimeters is not applied for this " @@ -10228,36 +12047,36 @@ msgid "" "as percentage (for example 50%) of a direct travel path." msgstr "" -#: src/libslic3r/PrintConfig.cpp:408 +#: src/libslic3r/PrintConfig.cpp:427 msgid "mm or % (zero to disable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:2839 +#: src/libslic3r/PrintConfig.cpp:434 src/libslic3r/PrintConfig.cpp:2927 msgid "Other layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:416 +#: src/libslic3r/PrintConfig.cpp:435 msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." msgstr "" -#: src/libslic3r/PrintConfig.cpp:419 +#: src/libslic3r/PrintConfig.cpp:438 msgid "Bed temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:426 +#: src/libslic3r/PrintConfig.cpp:445 msgid "" "This custom code is inserted at every layer change, right before the Z move. " "Note that you can use placeholder variables for all Slic3r settings as well " "as [layer_num] and [layer_z]." msgstr "" -#: src/libslic3r/PrintConfig.cpp:436 +#: src/libslic3r/PrintConfig.cpp:455 msgid "Between objects G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:456 msgid "" "This code is inserted between objects when using sequential printing. By " "default extruder and bed temperature are reset using non-wait command; " @@ -10267,84 +12086,79 @@ msgid "" "S[first_layer_temperature]\" command wherever you want." msgstr "" -#: src/libslic3r/PrintConfig.cpp:448 +#: src/libslic3r/PrintConfig.cpp:467 msgid "Number of solid layers to generate on bottom surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:449 +#: src/libslic3r/PrintConfig.cpp:468 msgid "Bottom solid layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:457 +#: src/libslic3r/PrintConfig.cpp:476 msgid "" "The number of bottom solid layers is increased above bottom_solid_layers if " "necessary to satisfy minimum thickness of bottom shell." msgstr "" -#: src/libslic3r/PrintConfig.cpp:459 +#: src/libslic3r/PrintConfig.cpp:478 msgid "Minimum bottom shell thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:484 msgid "Bridge" msgstr "" -#: src/libslic3r/PrintConfig.cpp:466 +#: src/libslic3r/PrintConfig.cpp:485 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." msgstr "" -#: src/libslic3r/PrintConfig.cpp:468 src/libslic3r/PrintConfig.cpp:639 -#: src/libslic3r/PrintConfig.cpp:1192 src/libslic3r/PrintConfig.cpp:1201 -#: src/libslic3r/PrintConfig.cpp:1401 src/libslic3r/PrintConfig.cpp:1410 -#: src/libslic3r/PrintConfig.cpp:1419 src/libslic3r/PrintConfig.cpp:1713 -#: src/libslic3r/PrintConfig.cpp:1764 src/libslic3r/PrintConfig.cpp:1775 -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1983 -#: src/libslic3r/PrintConfig.cpp:1991 +#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:1252 src/libslic3r/PrintConfig.cpp:1261 +#: src/libslic3r/PrintConfig.cpp:1447 src/libslic3r/PrintConfig.cpp:1456 +#: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1750 +#: src/libslic3r/PrintConfig.cpp:1801 src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1822 src/libslic3r/PrintConfig.cpp:2013 +#: src/libslic3r/PrintConfig.cpp:2021 msgid "mm/s²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:474 +#: src/libslic3r/PrintConfig.cpp:493 msgid "Bridging angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:476 +#: src/libslic3r/PrintConfig.cpp:495 msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for all " "bridges. Use 180° for zero angle." msgstr "" -#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:1102 -#: src/libslic3r/PrintConfig.cpp:2282 src/libslic3r/PrintConfig.cpp:2292 -#: src/libslic3r/PrintConfig.cpp:2583 src/libslic3r/PrintConfig.cpp:2824 -#: src/libslic3r/PrintConfig.cpp:3041 src/libslic3r/PrintConfig.cpp:3144 -#: src/libslic3r/PrintConfig.cpp:3698 src/libslic3r/PrintConfig.cpp:3819 -msgid "°" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:485 +#: src/libslic3r/PrintConfig.cpp:504 msgid "Bridges fan speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:486 +#: src/libslic3r/PrintConfig.cpp:505 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "" -#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:1114 -#: src/libslic3r/PrintConfig.cpp:1601 src/libslic3r/PrintConfig.cpp:1793 -#: src/libslic3r/PrintConfig.cpp:1856 src/libslic3r/PrintConfig.cpp:2115 -#: src/libslic3r/PrintConfig.cpp:2174 src/libslic3r/PrintConfig.cpp:3323 -#: src/libslic3r/PrintConfig.cpp:3612 src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:596 +#: src/libslic3r/PrintConfig.cpp:605 src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:623 src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1893 src/libslic3r/PrintConfig.cpp:2145 +#: src/libslic3r/PrintConfig.cpp:2204 src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3369 src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3870 msgid "%" msgstr "" -#: src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:513 msgid "Bridge flow ratio" msgstr "" -#: src/libslic3r/PrintConfig.cpp:496 +#: src/libslic3r/PrintConfig.cpp:515 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -10352,121 +12166,168 @@ msgid "" "before tweaking this." msgstr "" -#: src/libslic3r/PrintConfig.cpp:506 +#: src/libslic3r/PrintConfig.cpp:525 msgid "Bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:508 +#: src/libslic3r/PrintConfig.cpp:527 msgid "Speed for printing bridges." msgstr "" -#: src/libslic3r/PrintConfig.cpp:509 src/libslic3r/PrintConfig.cpp:920 -#: src/libslic3r/PrintConfig.cpp:928 src/libslic3r/PrintConfig.cpp:937 -#: src/libslic3r/PrintConfig.cpp:945 src/libslic3r/PrintConfig.cpp:972 -#: src/libslic3r/PrintConfig.cpp:991 src/libslic3r/PrintConfig.cpp:1329 -#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1620 -#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1730 -#: src/libslic3r/PrintConfig.cpp:1742 src/libslic3r/PrintConfig.cpp:1752 -#: src/libslic3r/PrintConfig.cpp:1815 src/libslic3r/PrintConfig.cpp:1874 -#: src/libslic3r/PrintConfig.cpp:2022 src/libslic3r/PrintConfig.cpp:2249 -#: src/libslic3r/PrintConfig.cpp:2258 src/libslic3r/PrintConfig.cpp:2789 -#: src/libslic3r/PrintConfig.cpp:2939 src/libslic3r/PrintConfig.cpp:2949 +#: src/libslic3r/PrintConfig.cpp:528 src/libslic3r/PrintConfig.cpp:1009 +#: src/libslic3r/PrintConfig.cpp:1017 src/libslic3r/PrintConfig.cpp:1026 +#: src/libslic3r/PrintConfig.cpp:1034 src/libslic3r/PrintConfig.cpp:1061 +#: src/libslic3r/PrintConfig.cpp:1080 src/libslic3r/PrintConfig.cpp:1386 +#: src/libslic3r/PrintConfig.cpp:1579 src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1733 src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1779 src/libslic3r/PrintConfig.cpp:1789 +#: src/libslic3r/PrintConfig.cpp:1852 src/libslic3r/PrintConfig.cpp:1911 +#: src/libslic3r/PrintConfig.cpp:2052 src/libslic3r/PrintConfig.cpp:2279 +#: src/libslic3r/PrintConfig.cpp:2288 src/libslic3r/PrintConfig.cpp:2810 +#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3037 msgid "mm/s" msgstr "" -#: src/libslic3r/PrintConfig.cpp:516 +#: src/libslic3r/PrintConfig.cpp:535 +msgid "Enable dynamic overhang speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:537 +msgid "This setting enables dynamic speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:541 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Speeds for overhang " +"sizes in between are calculated via linear interpolation. If set as " +"percentage, the speed is calculated over the external perimeter speed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:547 src/libslic3r/PrintConfig.cpp:594 +msgid "speed for 0% overlap (bridge)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:550 src/libslic3r/PrintConfig.cpp:559 +#: src/libslic3r/PrintConfig.cpp:568 src/libslic3r/PrintConfig.cpp:577 +#: src/libslic3r/PrintConfig.cpp:856 src/libslic3r/PrintConfig.cpp:1305 +#: src/libslic3r/PrintConfig.cpp:1316 src/libslic3r/PrintConfig.cpp:2387 +#: src/libslic3r/PrintConfig.cpp:2440 src/libslic3r/PrintConfig.cpp:2765 +#: src/libslic3r/PrintConfig.cpp:2997 +msgid "mm/s or %" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:556 src/libslic3r/PrintConfig.cpp:603 +msgid "speed for 25% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:612 +msgid "speed for 50% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:574 src/libslic3r/PrintConfig.cpp:621 +msgid "speed for 75% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:583 +msgid "Enable dynamic fan speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:584 +msgid "This setting enables dynamic fan speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:589 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Fan speeds for " +"overhang sizes in between are calculated via linear interpolation. " +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:630 msgid "Brim width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:518 +#: src/libslic3r/PrintConfig.cpp:632 msgid "" "The horizontal width of the brim that will be printed around each object on " "the first layer. When raft is used, no brim is generated (use " "raft_first_layer_expansion)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:527 +#: src/libslic3r/PrintConfig.cpp:641 msgid "Brim type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:529 +#: src/libslic3r/PrintConfig.cpp:643 msgid "" "The places where the brim will be printed around each object on the first " "layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:535 +#: src/libslic3r/PrintConfig.cpp:645 msgid "No brim" msgstr "" -#: src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:646 msgid "Outer brim only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:537 +#: src/libslic3r/PrintConfig.cpp:647 msgid "Inner brim only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:538 +#: src/libslic3r/PrintConfig.cpp:648 msgid "Outer and inner brim" msgstr "" -#: src/libslic3r/PrintConfig.cpp:543 +#: src/libslic3r/PrintConfig.cpp:654 msgid "Brim separation gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:545 +#: src/libslic3r/PrintConfig.cpp:656 msgid "" "Offset of brim from the printed object. The offset is applied after the " "elephant foot compensation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:552 -msgid "Clip multi-part objects" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:553 -msgid "" -"When printing multi-material objects, this settings will make Slic3r to clip " -"the overlapping object parts one by the other (2nd part will be clipped by " -"the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:560 +#: src/libslic3r/PrintConfig.cpp:663 msgid "Colorprint height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:561 +#: src/libslic3r/PrintConfig.cpp:664 msgid "Heights at which a filament change is to occur." msgstr "" -#: src/libslic3r/PrintConfig.cpp:571 +#: src/libslic3r/PrintConfig.cpp:674 msgid "Compatible printers condition" msgstr "" -#: src/libslic3r/PrintConfig.cpp:572 +#: src/libslic3r/PrintConfig.cpp:675 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " "compatible with the active printer profile." msgstr "" -#: src/libslic3r/PrintConfig.cpp:586 +#: src/libslic3r/PrintConfig.cpp:689 msgid "Compatible print profiles condition" msgstr "" -#: src/libslic3r/PrintConfig.cpp:587 +#: src/libslic3r/PrintConfig.cpp:690 msgid "" "A boolean expression using the configuration values of an active print " "profile. If this expression evaluates to true, this profile is considered " "compatible with the active print profile." msgstr "" -#: src/libslic3r/PrintConfig.cpp:604 +#: src/libslic3r/PrintConfig.cpp:707 msgid "Complete individual objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:605 +#: src/libslic3r/PrintConfig.cpp:708 msgid "" "When printing multiple objects or copies, this feature will complete each " "object before moving onto next one (and starting it from its bottom layer). " @@ -10474,97 +12335,97 @@ msgid "" "warn and prevent you from extruder collisions, but beware." msgstr "" -#: src/libslic3r/PrintConfig.cpp:613 +#: src/libslic3r/PrintConfig.cpp:716 msgid "Enable auto cooling" msgstr "" -#: src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:717 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." msgstr "" -#: src/libslic3r/PrintConfig.cpp:619 +#: src/libslic3r/PrintConfig.cpp:722 msgid "Cooling tube position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:620 +#: src/libslic3r/PrintConfig.cpp:723 msgid "Distance of the center-point of the cooling tube from the extruder tip." msgstr "" -#: src/libslic3r/PrintConfig.cpp:627 +#: src/libslic3r/PrintConfig.cpp:730 msgid "Cooling tube length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:628 +#: src/libslic3r/PrintConfig.cpp:731 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "" -#: src/libslic3r/PrintConfig.cpp:636 +#: src/libslic3r/PrintConfig.cpp:739 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " "prevent resetting acceleration at all." msgstr "" -#: src/libslic3r/PrintConfig.cpp:645 +#: src/libslic3r/PrintConfig.cpp:748 msgid "Default filament profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:646 +#: src/libslic3r/PrintConfig.cpp:749 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " "activated." msgstr "" -#: src/libslic3r/PrintConfig.cpp:652 +#: src/libslic3r/PrintConfig.cpp:755 msgid "Default print profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:653 src/libslic3r/PrintConfig.cpp:3542 -#: src/libslic3r/PrintConfig.cpp:3553 +#: src/libslic3r/PrintConfig.cpp:756 src/libslic3r/PrintConfig.cpp:3819 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " "activated." msgstr "" -#: src/libslic3r/PrintConfig.cpp:659 +#: src/libslic3r/PrintConfig.cpp:762 msgid "Disable fan for the first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:660 +#: src/libslic3r/PrintConfig.cpp:763 msgid "" "You can set this to a positive value to disable fan at all during the first " "layers, so that it does not make adhesion worse." msgstr "" -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:772 msgid "Don't support bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:671 +#: src/libslic3r/PrintConfig.cpp:774 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." msgstr "" -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:780 msgid "Distance between copies" msgstr "" -#: src/libslic3r/PrintConfig.cpp:678 +#: src/libslic3r/PrintConfig.cpp:781 msgid "Distance used for the auto-arrange feature of the plater." msgstr "" -#: src/libslic3r/PrintConfig.cpp:686 +#: src/libslic3r/PrintConfig.cpp:789 msgid "" "This end procedure is inserted at the end of the output file. Note that you " "can use placeholder variables for all PrusaSlicer settings." msgstr "" -#: src/libslic3r/PrintConfig.cpp:696 +#: src/libslic3r/PrintConfig.cpp:799 msgid "" "This end procedure is inserted at the end of the output file, before the " "printer end gcode (and before any toolchange from this filament in case of " @@ -10573,76 +12434,66 @@ msgid "" "in extruder order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:707 -msgid "Ensure vertical shell thickness" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:709 -msgid "" -"Add solid infill near sloping surfaces to guarantee the vertical shell " -"thickness (top+bottom solid layers)." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:715 +#: src/libslic3r/PrintConfig.cpp:810 msgid "Top fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:717 +#: src/libslic3r/PrintConfig.cpp:812 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." msgstr "" -#: src/libslic3r/PrintConfig.cpp:728 src/libslic3r/PrintConfig.cpp:1169 -#: src/libslic3r/PrintConfig.cpp:2754 src/libslic3r/PrintConfig.cpp:2771 +#: src/libslic3r/PrintConfig.cpp:815 src/libslic3r/PrintConfig.cpp:1228 +#: src/libslic3r/PrintConfig.cpp:2776 src/libslic3r/PrintConfig.cpp:2791 msgid "Rectilinear" msgstr "" -#: src/libslic3r/PrintConfig.cpp:729 +#: src/libslic3r/PrintConfig.cpp:816 msgid "Monotonic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:730 +#: src/libslic3r/PrintConfig.cpp:817 msgid "Monotonic Lines" msgstr "" -#: src/libslic3r/PrintConfig.cpp:731 src/libslic3r/PrintConfig.cpp:1170 +#: src/libslic3r/PrintConfig.cpp:818 src/libslic3r/PrintConfig.cpp:1229 msgid "Aligned Rectilinear" msgstr "" -#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:1176 -#: src/libslic3r/PrintConfig.cpp:2772 +#: src/libslic3r/PrintConfig.cpp:819 src/libslic3r/PrintConfig.cpp:1235 +#: src/libslic3r/PrintConfig.cpp:2792 msgid "Concentric" msgstr "" -#: src/libslic3r/PrintConfig.cpp:733 src/libslic3r/PrintConfig.cpp:1180 +#: src/libslic3r/PrintConfig.cpp:820 src/libslic3r/PrintConfig.cpp:1239 msgid "Hilbert Curve" msgstr "" -#: src/libslic3r/PrintConfig.cpp:734 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:821 src/libslic3r/PrintConfig.cpp:1240 msgid "Archimedean Chords" msgstr "" -#: src/libslic3r/PrintConfig.cpp:735 src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:822 src/libslic3r/PrintConfig.cpp:1241 msgid "Octagram Spiral" msgstr "" -#: src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:830 msgid "Bottom fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:832 msgid "" "Fill pattern for bottom infill. This only affects the bottom external " "visible layer, and not its adjacent solid shells." msgstr "" -#: src/libslic3r/PrintConfig.cpp:753 src/libslic3r/PrintConfig.cpp:765 -#: src/libslic3r/PrintConfig.cpp:1988 +#: src/libslic3r/PrintConfig.cpp:839 src/libslic3r/PrintConfig.cpp:851 +#: src/libslic3r/PrintConfig.cpp:2018 msgid "External perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:755 +#: src/libslic3r/PrintConfig.cpp:841 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " "perimeters. If left zero, default extrusion width will be used if set, " @@ -10650,60 +12501,64 @@ msgid "" "(for example 200%), it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:758 src/libslic3r/PrintConfig.cpp:869 -#: src/libslic3r/PrintConfig.cpp:1223 src/libslic3r/PrintConfig.cpp:1445 -#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1529 -#: src/libslic3r/PrintConfig.cpp:2011 src/libslic3r/PrintConfig.cpp:2397 -#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2660 -#: src/libslic3r/PrintConfig.cpp:2895 src/libslic3r/PrintConfig.cpp:3117 -#: src/libslic3r/PrintConfig.cpp:3132 src/libslic3r/PrintConfig.cpp:3166 -#: src/libslic3r/PrintConfig.cpp:3178 +#: src/libslic3r/PrintConfig.cpp:844 src/libslic3r/PrintConfig.cpp:958 +#: src/libslic3r/PrintConfig.cpp:1283 src/libslic3r/PrintConfig.cpp:1491 +#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1570 +#: src/libslic3r/PrintConfig.cpp:2041 src/libslic3r/PrintConfig.cpp:2428 +#: src/libslic3r/PrintConfig.cpp:2601 src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2983 src/libslic3r/PrintConfig.cpp:3204 +#: src/libslic3r/PrintConfig.cpp:3219 src/libslic3r/PrintConfig.cpp:3253 +#: src/libslic3r/PrintConfig.cpp:3265 msgid "mm or %" msgstr "" -#: src/libslic3r/PrintConfig.cpp:767 +#: src/libslic3r/PrintConfig.cpp:853 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " "calculated on the perimeters speed setting above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:770 src/libslic3r/PrintConfig.cpp:1245 -#: src/libslic3r/PrintConfig.cpp:1256 src/libslic3r/PrintConfig.cpp:2356 -#: src/libslic3r/PrintConfig.cpp:2409 src/libslic3r/PrintConfig.cpp:2740 -#: src/libslic3r/PrintConfig.cpp:2909 -msgid "mm/s or %" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:777 +#: src/libslic3r/PrintConfig.cpp:863 msgid "External perimeters first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:779 +#: src/libslic3r/PrintConfig.cpp:865 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:785 +#: src/libslic3r/PrintConfig.cpp:871 msgid "Extra perimeters if needed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:787 +#: src/libslic3r/PrintConfig.cpp:873 msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " "keeps adding perimeters, until more than 70% of the loop immediately above " "is supported." msgstr "" -#: src/libslic3r/PrintConfig.cpp:797 +#: src/libslic3r/PrintConfig.cpp:880 +msgid "Extra perimeters on overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:882 +msgid "" +"Detect overhang areas where bridges cannot be anchored, and fill them with " +"extra perimeter paths. These paths are anchored to the nearby non-overhang " +"area when possible." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:890 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " "extruders." msgstr "" -#: src/libslic3r/PrintConfig.cpp:809 +#: src/libslic3r/PrintConfig.cpp:898 msgid "" "Set this to the vertical distance between your nozzle tip and (usually) the " "X carriage rods. In other words, this is the height of the clearance " @@ -10711,27 +12566,27 @@ msgid "" "extruder can peek before colliding with other printed objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:820 +#: src/libslic3r/PrintConfig.cpp:909 msgid "" "Set this to the clearance radius around your extruder. If the extruder is " "not centered, choose the largest value for safety. This setting is used to " "check for collisions and to display the graphical preview in the plater." msgstr "" -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:919 msgid "Extruder Color" msgstr "" -#: src/libslic3r/PrintConfig.cpp:831 src/libslic3r/PrintConfig.cpp:894 -#: src/libslic3r/PrintConfig.cpp:3394 +#: src/libslic3r/PrintConfig.cpp:920 src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:3666 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" -#: src/libslic3r/PrintConfig.cpp:837 +#: src/libslic3r/PrintConfig.cpp:926 msgid "Extruder offset" msgstr "" -#: src/libslic3r/PrintConfig.cpp:838 +#: src/libslic3r/PrintConfig.cpp:927 msgid "" "If your firmware doesn't handle the extruder displacement you need the G-" "code to take it into account. This option lets you specify the displacement " @@ -10739,21 +12594,21 @@ msgid "" "coordinates (they will be subtracted from the XY coordinate)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:847 +#: src/libslic3r/PrintConfig.cpp:936 msgid "Extrusion axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:848 +#: src/libslic3r/PrintConfig.cpp:937 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:853 +#: src/libslic3r/PrintConfig.cpp:942 msgid "Extrusion multiplier" msgstr "" -#: src/libslic3r/PrintConfig.cpp:854 +#: src/libslic3r/PrintConfig.cpp:943 msgid "" "This factor changes the amount of flow proportionally. You may need to tweak " "this setting to get nice surface finish and correct single wall widths. " @@ -10761,11 +12616,11 @@ msgid "" "more, check filament diameter and your firmware E steps." msgstr "" -#: src/libslic3r/PrintConfig.cpp:863 +#: src/libslic3r/PrintConfig.cpp:952 msgid "Default extrusion width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:865 +#: src/libslic3r/PrintConfig.cpp:954 msgid "" "Set this to a non-zero value to allow a manual extrusion width. If left to " "zero, Slic3r derives extrusion widths from the nozzle diameter (see the " @@ -10774,123 +12629,123 @@ msgid "" "height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:877 +#: src/libslic3r/PrintConfig.cpp:966 msgid "Keep fan always on" msgstr "" -#: src/libslic3r/PrintConfig.cpp:878 +#: src/libslic3r/PrintConfig.cpp:967 msgid "" "If this is enabled, fan will never be disabled and will be kept running at " "least at its minimum speed. Useful for PLA, harmful for ABS." msgstr "" -#: src/libslic3r/PrintConfig.cpp:883 +#: src/libslic3r/PrintConfig.cpp:972 msgid "Enable fan if layer print time is below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:884 +#: src/libslic3r/PrintConfig.cpp:973 msgid "" "If layer print time is estimated below this number of seconds, fan will be " "enabled and its speed will be calculated by interpolating the minimum and " "maximum speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:886 src/libslic3r/PrintConfig.cpp:2344 +#: src/libslic3r/PrintConfig.cpp:975 src/libslic3r/PrintConfig.cpp:2375 msgid "approximate seconds" msgstr "" -#: src/libslic3r/PrintConfig.cpp:893 src/libslic3r/PrintConfig.cpp:3393 +#: src/libslic3r/PrintConfig.cpp:982 src/libslic3r/PrintConfig.cpp:3665 msgid "Color" msgstr "" -#: src/libslic3r/PrintConfig.cpp:899 +#: src/libslic3r/PrintConfig.cpp:988 msgid "Filament notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:900 +#: src/libslic3r/PrintConfig.cpp:989 msgid "You can put your notes regarding the filament here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:908 src/libslic3r/PrintConfig.cpp:1821 +#: src/libslic3r/PrintConfig.cpp:997 src/libslic3r/PrintConfig.cpp:1858 msgid "Max volumetric speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:909 +#: src/libslic3r/PrintConfig.cpp:998 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " "speed. Set to zero for no limit." msgstr "" -#: src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:1007 msgid "Loading speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:919 +#: src/libslic3r/PrintConfig.cpp:1008 msgid "Speed used for loading the filament on the wipe tower." msgstr "" -#: src/libslic3r/PrintConfig.cpp:926 +#: src/libslic3r/PrintConfig.cpp:1015 msgid "Loading speed at the start" msgstr "" -#: src/libslic3r/PrintConfig.cpp:927 +#: src/libslic3r/PrintConfig.cpp:1016 msgid "Speed used at the very beginning of loading phase." msgstr "" -#: src/libslic3r/PrintConfig.cpp:934 +#: src/libslic3r/PrintConfig.cpp:1023 msgid "Unloading speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:935 +#: src/libslic3r/PrintConfig.cpp:1024 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:943 +#: src/libslic3r/PrintConfig.cpp:1032 msgid "Unloading speed at the start" msgstr "" -#: src/libslic3r/PrintConfig.cpp:944 +#: src/libslic3r/PrintConfig.cpp:1033 msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "" -#: src/libslic3r/PrintConfig.cpp:951 +#: src/libslic3r/PrintConfig.cpp:1040 msgid "Delay after unloading" msgstr "" -#: src/libslic3r/PrintConfig.cpp:952 +#: src/libslic3r/PrintConfig.cpp:1041 msgid "" "Time to wait after the filament is unloaded. May help to get reliable " "toolchanges with flexible materials that may need more time to shrink to " "original dimensions." msgstr "" -#: src/libslic3r/PrintConfig.cpp:961 +#: src/libslic3r/PrintConfig.cpp:1050 msgid "Number of cooling moves" msgstr "" -#: src/libslic3r/PrintConfig.cpp:962 +#: src/libslic3r/PrintConfig.cpp:1051 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " "Specify desired number of these moves." msgstr "" -#: src/libslic3r/PrintConfig.cpp:970 +#: src/libslic3r/PrintConfig.cpp:1059 msgid "Speed of the first cooling move" msgstr "" -#: src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:1060 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:978 +#: src/libslic3r/PrintConfig.cpp:1067 msgid "Minimal purge on wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:979 +#: src/libslic3r/PrintConfig.cpp:1068 msgid "" "After a tool change, the exact position of the newly loaded filament inside " "the nozzle may not be known, and the filament pressure is likely not yet " @@ -10899,63 +12754,63 @@ msgid "" "to produce successive infill or sacrificial object extrusions reliably." msgstr "" -#: src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:1072 msgid "mm³" msgstr "" -#: src/libslic3r/PrintConfig.cpp:989 +#: src/libslic3r/PrintConfig.cpp:1078 msgid "Speed of the last cooling move" msgstr "" -#: src/libslic3r/PrintConfig.cpp:990 +#: src/libslic3r/PrintConfig.cpp:1079 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:997 +#: src/libslic3r/PrintConfig.cpp:1086 msgid "Filament load time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:998 +#: src/libslic3r/PrintConfig.cpp:1087 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " "filament during a tool change (when executing the T code). This time is " "added to the total print time by the G-code time estimator." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1005 +#: src/libslic3r/PrintConfig.cpp:1094 msgid "Ramming parameters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1006 +#: src/libslic3r/PrintConfig.cpp:1095 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1012 +#: src/libslic3r/PrintConfig.cpp:1101 msgid "Filament unload time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1013 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " "filament during a tool change (when executing the T code). This time is " "added to the total print time by the G-code time estimator." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1021 +#: src/libslic3r/PrintConfig.cpp:1110 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " "average." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1028 src/libslic3r/PrintConfig.cpp:3432 -#: src/libslic3r/PrintConfig.cpp:3433 +#: src/libslic3r/PrintConfig.cpp:1117 src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3710 msgid "Density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1029 +#: src/libslic3r/PrintConfig.cpp:1118 msgid "" "Enter your filament density here. This is only for statistical information. " "A decent way is to weigh a known length of filament and compute the ratio of " @@ -10963,41 +12818,41 @@ msgid "" "displacement." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1032 +#: src/libslic3r/PrintConfig.cpp:1121 msgid "g/cm³" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1037 +#: src/libslic3r/PrintConfig.cpp:1126 msgid "Filament type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1038 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "The filament material type for use in custom G-codes." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1066 +#: src/libslic3r/PrintConfig.cpp:1155 msgid "Soluble material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1067 +#: src/libslic3r/PrintConfig.cpp:1156 msgid "Soluble material is most likely used for a soluble support." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1073 +#: src/libslic3r/PrintConfig.cpp:1162 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1074 +#: src/libslic3r/PrintConfig.cpp:1163 msgid "money/kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1168 msgid "Spool weight" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1080 +#: src/libslic3r/PrintConfig.cpp:1169 msgid "" "Enter weight of the empty filament spool. One may weigh a partially consumed " "filament spool before printing and one may compare the measured weight with " @@ -11005,109 +12860,109 @@ msgid "" "amount of filament on the spool is sufficient to finish the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1084 +#: src/libslic3r/PrintConfig.cpp:1173 msgid "g" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1093 src/libslic3r/PrintConfig.cpp:3537 +#: src/libslic3r/PrintConfig.cpp:1182 src/libslic3r/PrintConfig.cpp:3814 msgid "(Unknown)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:1186 msgid "Fill angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1099 +#: src/libslic3r/PrintConfig.cpp:1188 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " "so this setting does not affect them." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1199 msgid "Fill density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1113 +#: src/libslic3r/PrintConfig.cpp:1201 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1148 +#: src/libslic3r/PrintConfig.cpp:1224 msgid "Fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1150 +#: src/libslic3r/PrintConfig.cpp:1226 msgid "Fill pattern for general low-density infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1171 src/libslic3r/PrintConfig.cpp:2803 +#: src/libslic3r/PrintConfig.cpp:1230 src/libslic3r/PrintConfig.cpp:2822 msgid "Grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1173 +#: src/libslic3r/PrintConfig.cpp:1232 msgid "Stars" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1174 +#: src/libslic3r/PrintConfig.cpp:1233 msgid "Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1175 +#: src/libslic3r/PrintConfig.cpp:1234 msgid "Line" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1177 src/libslic3r/PrintConfig.cpp:2756 +#: src/libslic3r/PrintConfig.cpp:1236 src/libslic3r/PrintConfig.cpp:2778 msgid "Honeycomb" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1178 +#: src/libslic3r/PrintConfig.cpp:1237 msgid "3D Honeycomb" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1179 +#: src/libslic3r/PrintConfig.cpp:1238 msgid "Gyroid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1183 +#: src/libslic3r/PrintConfig.cpp:1242 msgid "Adaptive Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1184 +#: src/libslic3r/PrintConfig.cpp:1243 msgid "Support Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1185 +#: src/libslic3r/PrintConfig.cpp:1244 msgid "Lightning" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1190 +#: src/libslic3r/PrintConfig.cpp:1250 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1198 +#: src/libslic3r/PrintConfig.cpp:1258 msgid "First object layer over raft interface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1199 +#: src/libslic3r/PrintConfig.cpp:1259 msgid "" "This is the acceleration your printer will use for first layer of object " "above raft interface. Set zero to disable acceleration control for first " "layer of object above raft interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "First layer bed temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1209 +#: src/libslic3r/PrintConfig.cpp:1269 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1219 +#: src/libslic3r/PrintConfig.cpp:1279 msgid "" "Set this to a non-zero value to set a manual extrusion width for first " "layer. You can use this to force fatter extrudates for better adhesion. If " @@ -11115,29 +12970,29 @@ msgid "" "layer height. If set to zero, it will use the default extrusion width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1293 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " "plates." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1301 msgid "First layer speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1242 +#: src/libslic3r/PrintConfig.cpp:1302 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " "as a percentage (for example: 40%) it will scale the default speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1252 +#: src/libslic3r/PrintConfig.cpp:1312 msgid "Speed of object first layer over raft interface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1253 +#: src/libslic3r/PrintConfig.cpp:1313 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first object layer above raft interface, regardless " @@ -11145,22 +13000,22 @@ msgid "" "the default speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1263 +#: src/libslic3r/PrintConfig.cpp:1323 msgid "First layer nozzle temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1264 +#: src/libslic3r/PrintConfig.cpp:1324 msgid "" "Nozzle temperature for the first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " "commands in the output G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1272 +#: src/libslic3r/PrintConfig.cpp:1332 msgid "Full fan speed at layer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1273 +#: src/libslic3r/PrintConfig.cpp:1333 msgid "" "Fan speed will be ramped up linearly from zero at layer " "\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". " @@ -11169,72 +13024,76 @@ msgid "" "maximum allowed speed at layer \"disable_fan_first_layers\" + 1." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1285 +#: src/libslic3r/PrintConfig.cpp:1345 msgid "Fuzzy skin type." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1348 msgid "Outside walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1293 +#: src/libslic3r/PrintConfig.cpp:1349 msgid "All walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1298 +#: src/libslic3r/PrintConfig.cpp:1355 msgid "Fuzzy skin thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1300 +#: src/libslic3r/PrintConfig.cpp:1357 msgid "" "The maximum distance that each skin point can be offset (both ways), " "measured perpendicular to the perimeter wall." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1308 +#: src/libslic3r/PrintConfig.cpp:1365 msgid "Fuzzy skin point distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1310 +#: src/libslic3r/PrintConfig.cpp:1367 msgid "" "Perimeters will be split into multiple segments by inserting Fuzzy skin " "points. Lowering the Fuzzy skin point distance will increase the number of " "randomly offset points on the perimeter wall." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1318 +#: src/libslic3r/PrintConfig.cpp:1375 msgid "Fill gaps" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1320 +#: src/libslic3r/PrintConfig.cpp:1377 msgid "" "Enables filling of gaps between perimeters and between the inner most " "perimeters and infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1327 +#: src/libslic3r/PrintConfig.cpp:1382 +msgid "Gap fill" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1384 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " "filling." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1335 +#: src/libslic3r/PrintConfig.cpp:1392 msgid "Verbose G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1336 +#: src/libslic3r/PrintConfig.cpp:1393 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " "file could make your firmware slow down." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1400 msgid "G-code flavor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1344 +#: src/libslic3r/PrintConfig.cpp:1401 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " @@ -11242,15 +13101,15 @@ msgid "" "extrusion value at all." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1416 msgid "No extrusion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1376 +#: src/libslic3r/PrintConfig.cpp:1422 msgid "Label objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1377 +#: src/libslic3r/PrintConfig.cpp:1423 msgid "" "Enable this to add comments into the G-Code labeling print moves with what " "object they belong to, which is useful for the Octoprint CancelObject " @@ -11258,62 +13117,72 @@ msgid "" "setup and Wipe into Object / Wipe into Infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1384 +#: src/libslic3r/PrintConfig.cpp:1430 msgid "G-code substitutions" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1385 +#: src/libslic3r/PrintConfig.cpp:1431 msgid "Find / replace patterns in G-code lines and substitute them." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1390 +#: src/libslic3r/PrintConfig.cpp:1436 msgid "High extruder current on filament swap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1391 +#: src/libslic3r/PrintConfig.cpp:1437 msgid "" "It may be beneficial to increase the extruder motor current during the " "filament exchange sequence to allow for rapid ramming feed rates and to " "overcome resistance when loading a filament with an ugly shaped tip." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1399 +#: src/libslic3r/PrintConfig.cpp:1445 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1408 +#: src/libslic3r/PrintConfig.cpp:1453 src/libslic3r/PrintConfig.cpp:2423 +#: src/libslic3r/PrintConfig.cpp:2435 +msgid "Solid infill" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1454 msgid "" "This is the acceleration your printer will use for solid infill. Set zero to " "use the value for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:2977 +#: src/libslic3r/PrintConfig.cpp:2990 +msgid "Top solid infill" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1463 msgid "" "This is the acceleration your printer will use for top solid infill. Set " "zero to use the value for solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1426 +#: src/libslic3r/PrintConfig.cpp:1472 msgid "Combine infill every" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1428 +#: src/libslic3r/PrintConfig.cpp:1474 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1431 +#: src/libslic3r/PrintConfig.cpp:1477 msgid "Combine infill every n layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1437 +#: src/libslic3r/PrintConfig.cpp:1483 msgid "Length of the infill anchor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1439 +#: src/libslic3r/PrintConfig.cpp:1485 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -11326,35 +13195,35 @@ msgid "" "perimeters connected to a single infill line." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1455 +#: src/libslic3r/PrintConfig.cpp:1495 msgid "0 (no open anchors)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1456 src/libslic3r/PrintConfig.cpp:1479 +#: src/libslic3r/PrintConfig.cpp:1496 src/libslic3r/PrintConfig.cpp:1519 msgid "1 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1457 src/libslic3r/PrintConfig.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:1520 msgid "2 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1458 src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1498 src/libslic3r/PrintConfig.cpp:1521 msgid "5 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1459 src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1499 src/libslic3r/PrintConfig.cpp:1522 msgid "10 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1460 src/libslic3r/PrintConfig.cpp:1483 +#: src/libslic3r/PrintConfig.cpp:1500 src/libslic3r/PrintConfig.cpp:1523 msgid "1000 (unlimited)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1465 +#: src/libslic3r/PrintConfig.cpp:1506 msgid "Maximum length of the infill anchor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1508 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -11366,19 +13235,19 @@ msgid "" "parameter. Set this parameter to zero to disable anchoring." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1478 +#: src/libslic3r/PrintConfig.cpp:1518 msgid "0 (not anchored)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1488 +#: src/libslic3r/PrintConfig.cpp:1529 msgid "Infill extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1490 +#: src/libslic3r/PrintConfig.cpp:1531 msgid "The extruder to use when printing infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:1539 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill. If " "left zero, default extrusion width will be used if set, otherwise 1.125 x " @@ -11387,32 +13256,32 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1550 msgid "Infill before perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1510 +#: src/libslic3r/PrintConfig.cpp:1551 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1515 +#: src/libslic3r/PrintConfig.cpp:1556 msgid "Only infill where needed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1517 +#: src/libslic3r/PrintConfig.cpp:1558 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " "the G-code generation due to the multiple checks involved." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1524 +#: src/libslic3r/PrintConfig.cpp:1565 msgid "Infill/perimeters overlap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1526 +#: src/libslic3r/PrintConfig.cpp:1567 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -11420,84 +13289,84 @@ msgid "" "perimeter extrusion width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1545 +#: src/libslic3r/PrintConfig.cpp:1586 msgid "Inherits profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1546 +#: src/libslic3r/PrintConfig.cpp:1587 msgid "Name of the profile, from which this profile inherits." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1600 msgid "Interface shells" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1560 +#: src/libslic3r/PrintConfig.cpp:1601 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " "soluble support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1568 +#: src/libslic3r/PrintConfig.cpp:1609 msgid "Maximum width of a segmented region" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1569 +#: src/libslic3r/PrintConfig.cpp:1610 msgid "Maximum width of a segmented region. Zero disables this feature." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1570 src/libslic3r/PrintConfig.cpp:2189 -#: src/libslic3r/PrintConfig.cpp:2198 +#: src/libslic3r/PrintConfig.cpp:1611 src/libslic3r/PrintConfig.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2228 msgid "mm (zero to disable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1577 +#: src/libslic3r/PrintConfig.cpp:1618 msgid "Enable ironing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1578 +#: src/libslic3r/PrintConfig.cpp:1619 msgid "" "Enable ironing of the top layers with the hot print head for smooth surface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1584 src/libslic3r/PrintConfig.cpp:1586 +#: src/libslic3r/PrintConfig.cpp:1625 src/libslic3r/PrintConfig.cpp:1627 msgid "Ironing Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1591 +#: src/libslic3r/PrintConfig.cpp:1629 msgid "All top surfaces" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Topmost surface only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1593 +#: src/libslic3r/PrintConfig.cpp:1631 msgid "All solid surfaces" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1598 +#: src/libslic3r/PrintConfig.cpp:1637 msgid "Flow rate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Percent of a flow rate relative to object's normal layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1608 +#: src/libslic3r/PrintConfig.cpp:1647 msgid "Spacing between ironing passes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1649 msgid "Distance between ironing lines" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1627 +#: src/libslic3r/PrintConfig.cpp:1666 msgid "" "This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can " @@ -11505,11 +13374,11 @@ msgid "" "[layer_z]." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1638 +#: src/libslic3r/PrintConfig.cpp:1677 msgid "Supports remaining times" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1639 +#: src/libslic3r/PrintConfig.cpp:1678 msgid "" "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " "intervals into the G-code to let the firmware show accurate remaining time. " @@ -11517,155 +13386,155 @@ msgid "" "firmware supports M73 Qxx Sxx for the silent mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1647 +#: src/libslic3r/PrintConfig.cpp:1686 msgid "Supports stealth mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1687 msgid "The firmware supports stealth mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1653 +#: src/libslic3r/PrintConfig.cpp:1692 msgid "How to apply limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1654 +#: src/libslic3r/PrintConfig.cpp:1693 msgid "Purpose of Machine Limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1656 +#: src/libslic3r/PrintConfig.cpp:1695 msgid "How to apply the Machine Limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1661 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "Emit to G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1662 +#: src/libslic3r/PrintConfig.cpp:1698 msgid "Use for time estimate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1663 +#: src/libslic3r/PrintConfig.cpp:1699 msgid "Ignore" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1686 +#: src/libslic3r/PrintConfig.cpp:1723 msgid "Maximum feedrate X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1687 +#: src/libslic3r/PrintConfig.cpp:1724 msgid "Maximum feedrate Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1688 +#: src/libslic3r/PrintConfig.cpp:1725 msgid "Maximum feedrate Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1689 +#: src/libslic3r/PrintConfig.cpp:1726 msgid "Maximum feedrate E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1692 +#: src/libslic3r/PrintConfig.cpp:1729 msgid "Maximum feedrate of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1693 +#: src/libslic3r/PrintConfig.cpp:1730 msgid "Maximum feedrate of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1694 +#: src/libslic3r/PrintConfig.cpp:1731 msgid "Maximum feedrate of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1695 +#: src/libslic3r/PrintConfig.cpp:1732 msgid "Maximum feedrate of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1703 +#: src/libslic3r/PrintConfig.cpp:1740 msgid "Maximum acceleration X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1704 +#: src/libslic3r/PrintConfig.cpp:1741 msgid "Maximum acceleration Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1705 +#: src/libslic3r/PrintConfig.cpp:1742 msgid "Maximum acceleration Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1706 +#: src/libslic3r/PrintConfig.cpp:1743 msgid "Maximum acceleration E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1709 +#: src/libslic3r/PrintConfig.cpp:1746 msgid "Maximum acceleration of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1710 +#: src/libslic3r/PrintConfig.cpp:1747 msgid "Maximum acceleration of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1711 +#: src/libslic3r/PrintConfig.cpp:1748 msgid "Maximum acceleration of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1712 +#: src/libslic3r/PrintConfig.cpp:1749 msgid "Maximum acceleration of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1720 +#: src/libslic3r/PrintConfig.cpp:1757 msgid "Maximum jerk X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1721 +#: src/libslic3r/PrintConfig.cpp:1758 msgid "Maximum jerk Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1722 +#: src/libslic3r/PrintConfig.cpp:1759 msgid "Maximum jerk Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1723 +#: src/libslic3r/PrintConfig.cpp:1760 msgid "Maximum jerk E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:1763 msgid "Maximum jerk of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1764 msgid "Maximum jerk of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1728 +#: src/libslic3r/PrintConfig.cpp:1765 msgid "Maximum jerk of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1729 +#: src/libslic3r/PrintConfig.cpp:1766 msgid "Maximum jerk of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1739 +#: src/libslic3r/PrintConfig.cpp:1776 msgid "Minimum feedrate when extruding" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1741 +#: src/libslic3r/PrintConfig.cpp:1778 msgid "Minimum feedrate when extruding (M205 S)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1749 +#: src/libslic3r/PrintConfig.cpp:1786 msgid "Minimum travel feedrate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:1788 msgid "Minimum travel feedrate (M205 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1759 +#: src/libslic3r/PrintConfig.cpp:1796 msgid "Maximum acceleration when extruding" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1798 msgid "" "Maximum acceleration when extruding (M204 P)\n" "\n" @@ -11673,31 +13542,31 @@ msgid "" "(M204 T)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1772 +#: src/libslic3r/PrintConfig.cpp:1809 msgid "Maximum acceleration when retracting" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1774 +#: src/libslic3r/PrintConfig.cpp:1811 msgid "Maximum acceleration when retracting (M204 R)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1782 +#: src/libslic3r/PrintConfig.cpp:1819 msgid "Maximum acceleration for travel moves" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1784 +#: src/libslic3r/PrintConfig.cpp:1821 msgid "Maximum acceleration for travel moves (M204 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1791 src/libslic3r/PrintConfig.cpp:1800 +#: src/libslic3r/PrintConfig.cpp:1828 src/libslic3r/PrintConfig.cpp:1837 msgid "Max" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1792 +#: src/libslic3r/PrintConfig.cpp:1829 msgid "This setting represents the maximum speed of your fan." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1801 +#: src/libslic3r/PrintConfig.cpp:1838 msgid "" "This is the highest printable layer height for this extruder, used to cap " "the variable layer height and support layer height. Maximum recommended " @@ -11705,28 +13574,28 @@ msgid "" "adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1811 +#: src/libslic3r/PrintConfig.cpp:1848 msgid "Max print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1849 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " "is used to set the highest print speed you want to allow." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1822 +#: src/libslic3r/PrintConfig.cpp:1859 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1867 msgid "Max volumetric slope positive" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1831 +#: src/libslic3r/PrintConfig.cpp:1868 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from lower speed to higher speed. A value of 1.8 mm³/" @@ -11735,15 +13604,15 @@ msgid "" "(feedrate 60 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1836 src/libslic3r/PrintConfig.cpp:1848 +#: src/libslic3r/PrintConfig.cpp:1873 src/libslic3r/PrintConfig.cpp:1885 msgid "mm³/s²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1842 +#: src/libslic3r/PrintConfig.cpp:1879 msgid "Max volumetric slope negative" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1843 +#: src/libslic3r/PrintConfig.cpp:1880 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from higher speed to lower speed. A value of 1.8 mm³/" @@ -11752,87 +13621,86 @@ msgid "" "(feedrate 20 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1854 src/libslic3r/PrintConfig.cpp:1863 +#: src/libslic3r/PrintConfig.cpp:1891 src/libslic3r/PrintConfig.cpp:1900 msgid "Min" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1855 +#: src/libslic3r/PrintConfig.cpp:1892 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1864 +#: src/libslic3r/PrintConfig.cpp:1901 msgid "" "This is the lowest printable layer height for this extruder and limits the " "resolution for variable layer height. Typical values are between 0.05 mm and " "0.1 mm." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1872 +#: src/libslic3r/PrintConfig.cpp:1909 msgid "Min print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1873 +#: src/libslic3r/PrintConfig.cpp:1910 msgid "Slic3r will not scale speed down below this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1880 +#: src/libslic3r/PrintConfig.cpp:1917 msgid "Minimal filament extrusion length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1881 +#: src/libslic3r/PrintConfig.cpp:1918 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " "machines, this minimum applies to each extruder." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1890 +#: src/libslic3r/PrintConfig.cpp:1927 msgid "Configuration notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1891 +#: src/libslic3r/PrintConfig.cpp:1928 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:1938 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1906 +#: src/libslic3r/PrintConfig.cpp:1943 msgid "Host Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1907 +#: src/libslic3r/PrintConfig.cpp:1944 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:1961 msgid "Only retract when crossing perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1930 +#: src/libslic3r/PrintConfig.cpp:1962 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1937 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "" "This option will drop the temperature of the inactive extruders to prevent " -"oozing. It will enable a tall skirt automatically and move extruders outside " -"such skirt when changing temperatures." +"oozing. " msgstr "" -#: src/libslic3r/PrintConfig.cpp:1944 +#: src/libslic3r/PrintConfig.cpp:1974 msgid "Output filename format" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1945 +#: src/libslic3r/PrintConfig.cpp:1975 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -11840,31 +13708,31 @@ msgid "" "[input_filename], [input_filename_base]." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1954 +#: src/libslic3r/PrintConfig.cpp:1984 msgid "Detect bridging perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:1986 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1962 +#: src/libslic3r/PrintConfig.cpp:1992 msgid "Filament parking position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1963 +#: src/libslic3r/PrintConfig.cpp:1993 msgid "" "Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1971 +#: src/libslic3r/PrintConfig.cpp:2001 msgid "Extra loading distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:2002 msgid "" "When set to zero, the distance the filament is moved from parking position " "during load is exactly the same as it was moved back during unload. When " @@ -11872,33 +13740,33 @@ msgid "" "than unloading." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1980 src/libslic3r/PrintConfig.cpp:2005 -#: src/libslic3r/PrintConfig.cpp:2019 src/libslic3r/PrintConfig.cpp:2029 +#: src/libslic3r/PrintConfig.cpp:2010 src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2049 src/libslic3r/PrintConfig.cpp:2059 msgid "Perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1981 +#: src/libslic3r/PrintConfig.cpp:2011 msgid "" "This is the acceleration your printer will use for perimeters. Set zero to " "disable acceleration control for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1989 +#: src/libslic3r/PrintConfig.cpp:2019 msgid "" "This is the acceleration your printer will use for external perimeters. Set " "zero to use the value for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1996 +#: src/libslic3r/PrintConfig.cpp:2026 msgid "Perimeter extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1998 +#: src/libslic3r/PrintConfig.cpp:2028 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2007 +#: src/libslic3r/PrintConfig.cpp:2037 msgid "" "Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. If " @@ -11907,12 +13775,12 @@ msgid "" "it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2021 +#: src/libslic3r/PrintConfig.cpp:2051 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2031 +#: src/libslic3r/PrintConfig.cpp:2061 msgid "" "This option sets the number of perimeters to generate for each layer. Note " "that Slic3r may increase this number automatically when it detects sloping " @@ -11920,11 +13788,11 @@ msgid "" "Perimeters option is enabled." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2065 msgid "(minimum)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "" "If you want to process the output G-code through custom scripts, just list " "their absolute paths here. Separate multiple scripts with a semicolon. " @@ -11933,90 +13801,90 @@ msgid "" "environment variables." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2055 +#: src/libslic3r/PrintConfig.cpp:2085 msgid "Printer type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2056 +#: src/libslic3r/PrintConfig.cpp:2086 msgid "Type of the printer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2061 +#: src/libslic3r/PrintConfig.cpp:2091 msgid "Printer notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2062 +#: src/libslic3r/PrintConfig.cpp:2092 msgid "You can put your notes regarding the printer here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2070 +#: src/libslic3r/PrintConfig.cpp:2100 msgid "Printer vendor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2071 +#: src/libslic3r/PrintConfig.cpp:2101 msgid "Name of the printer vendor." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2076 +#: src/libslic3r/PrintConfig.cpp:2106 msgid "Printer variant" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2077 +#: src/libslic3r/PrintConfig.cpp:2107 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2094 +#: src/libslic3r/PrintConfig.cpp:2124 msgid "Raft contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2096 +#: src/libslic3r/PrintConfig.cpp:2126 msgid "" "The vertical distance between object and raft. Ignored for soluble interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2103 +#: src/libslic3r/PrintConfig.cpp:2133 msgid "Raft expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2105 +#: src/libslic3r/PrintConfig.cpp:2135 msgid "Expansion of the raft in XY plane for better stability." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:2142 msgid "First layer density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2114 +#: src/libslic3r/PrintConfig.cpp:2144 msgid "Density of the first raft or support layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2122 +#: src/libslic3r/PrintConfig.cpp:2152 msgid "First layer expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2124 +#: src/libslic3r/PrintConfig.cpp:2154 msgid "" "Expansion of the first raft or support layer to improve adhesion to print " "bed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2131 +#: src/libslic3r/PrintConfig.cpp:2161 msgid "Raft layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2133 +#: src/libslic3r/PrintConfig.cpp:2163 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2141 +#: src/libslic3r/PrintConfig.cpp:2171 msgid "Slice resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2142 +#: src/libslic3r/PrintConfig.cpp:2172 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -12024,11 +13892,11 @@ msgid "" "simplification and use full resolution from input." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:2182 msgid "G-code resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2153 +#: src/libslic3r/PrintConfig.cpp:2183 msgid "" "Maximum deviation of exported G-code paths from their full resolution " "counterparts. Very high resolution G-code requires huge amount of RAM to " @@ -12039,197 +13907,211 @@ msgid "" "produced." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2164 +#: src/libslic3r/PrintConfig.cpp:2194 msgid "Minimum travel after retraction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2165 +#: src/libslic3r/PrintConfig.cpp:2195 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2171 +#: src/libslic3r/PrintConfig.cpp:2201 msgid "Retract amount before wipe" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2172 +#: src/libslic3r/PrintConfig.cpp:2202 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2179 +#: src/libslic3r/PrintConfig.cpp:2209 msgid "Retract on layer change" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2180 +#: src/libslic3r/PrintConfig.cpp:2210 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2185 src/libslic3r/PrintConfig.cpp:2193 +#: src/libslic3r/PrintConfig.cpp:2215 src/libslic3r/PrintConfig.cpp:2223 msgid "Length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2186 +#: src/libslic3r/PrintConfig.cpp:2216 msgid "Retraction Length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2187 +#: src/libslic3r/PrintConfig.cpp:2217 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " "extruder)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2194 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Retraction Length (Toolchange)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2195 +#: src/libslic3r/PrintConfig.cpp:2225 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " "enters the extruder)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2203 +#: src/libslic3r/PrintConfig.cpp:2233 msgid "Lift Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2204 +#: src/libslic3r/PrintConfig.cpp:2234 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " "the first extruder will be considered." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2211 +#: src/libslic3r/PrintConfig.cpp:2241 msgid "Above Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2212 +#: src/libslic3r/PrintConfig.cpp:2242 msgid "Only lift Z above" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2213 +#: src/libslic3r/PrintConfig.cpp:2243 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " "first layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2220 +#: src/libslic3r/PrintConfig.cpp:2250 msgid "Below Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2221 +#: src/libslic3r/PrintConfig.cpp:2251 msgid "Only lift Z below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2252 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " "first layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2238 +#: src/libslic3r/PrintConfig.cpp:2260 src/libslic3r/PrintConfig.cpp:2268 msgid "Extra length on restart" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2231 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2239 +#: src/libslic3r/PrintConfig.cpp:2269 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2246 src/libslic3r/PrintConfig.cpp:2247 +#: src/libslic3r/PrintConfig.cpp:2276 src/libslic3r/PrintConfig.cpp:2277 msgid "Retraction Speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2248 +#: src/libslic3r/PrintConfig.cpp:2278 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2254 src/libslic3r/PrintConfig.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:2284 src/libslic3r/PrintConfig.cpp:2285 msgid "Deretraction Speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2256 +#: src/libslic3r/PrintConfig.cpp:2286 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " "used." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2293 msgid "Seam position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2265 +#: src/libslic3r/PrintConfig.cpp:2295 msgid "Position of perimeters starting points." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2272 +#: src/libslic3r/PrintConfig.cpp:2297 +msgid "Random" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2298 msgid "Nearest" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2273 +#: src/libslic3r/PrintConfig.cpp:2299 msgid "Aligned" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2281 +#: src/libslic3r/PrintConfig.cpp:2306 +msgid "Staggered inner seams" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2307 +msgid "" +"This option causes the inner seams to be shifted backwards based on their " +"depth, forming a zigzag pattern." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2314 msgid "Direction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2283 +#: src/libslic3r/PrintConfig.cpp:2316 msgid "Preferred direction of the seam" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2284 +#: src/libslic3r/PrintConfig.cpp:2317 msgid "Seam preferred direction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2291 +#: src/libslic3r/PrintConfig.cpp:2324 msgid "Jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2293 +#: src/libslic3r/PrintConfig.cpp:2326 msgid "Seam preferred direction jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2294 +#: src/libslic3r/PrintConfig.cpp:2327 msgid "Preferred direction of the seam - jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2301 +#: src/libslic3r/PrintConfig.cpp:2334 msgid "Distance from brim/object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2335 msgid "" "Distance between skirt and brim (when draft shield is not used) or objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2308 +#: src/libslic3r/PrintConfig.cpp:2341 msgid "Skirt height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2309 +#: src/libslic3r/PrintConfig.cpp:2342 msgid "Height of skirt expressed in layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2348 msgid "Draft shield" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2316 +#: src/libslic3r/PrintConfig.cpp:2349 msgid "" "With draft shield active, the skirt will be printed skirt_distance from the " "object, possibly intersecting brim.\n" @@ -12239,81 +14121,81 @@ msgid "" "from print bed due to wind draft." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2324 +#: src/libslic3r/PrintConfig.cpp:2354 msgid "Disabled" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2325 +#: src/libslic3r/PrintConfig.cpp:2355 msgid "Limited" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2326 +#: src/libslic3r/PrintConfig.cpp:2356 msgid "Enabled" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2331 +#: src/libslic3r/PrintConfig.cpp:2362 msgid "Loops (minimum)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2332 +#: src/libslic3r/PrintConfig.cpp:2363 msgid "Skirt Loops" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2364 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " "this to zero to disable skirt completely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2341 +#: src/libslic3r/PrintConfig.cpp:2372 msgid "Slow down if layer print time is below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2342 +#: src/libslic3r/PrintConfig.cpp:2373 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2351 +#: src/libslic3r/PrintConfig.cpp:2382 msgid "Small perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2353 +#: src/libslic3r/PrintConfig.cpp:2384 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " "be calculated on the perimeters speed setting above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2363 +#: src/libslic3r/PrintConfig.cpp:2394 msgid "Solid infill threshold area" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2365 +#: src/libslic3r/PrintConfig.cpp:2396 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2366 +#: src/libslic3r/PrintConfig.cpp:2397 msgid "mm²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2372 +#: src/libslic3r/PrintConfig.cpp:2403 msgid "Solid infill extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2374 +#: src/libslic3r/PrintConfig.cpp:2405 msgid "The extruder to use when printing solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2380 +#: src/libslic3r/PrintConfig.cpp:2411 msgid "Solid infill every" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2382 +#: src/libslic3r/PrintConfig.cpp:2413 msgid "" "This feature allows to force a solid layer every given number of layers. " "Zero to disable. You can set this to any value (for example 9999); Slic3r " @@ -12321,7 +14203,7 @@ msgid "" "according to nozzle diameter and layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2394 +#: src/libslic3r/PrintConfig.cpp:2425 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "solid surfaces. If left zero, default extrusion width will be used if set, " @@ -12329,26 +14211,26 @@ msgid "" "(for example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2406 +#: src/libslic3r/PrintConfig.cpp:2437 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " "infill speed above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2418 +#: src/libslic3r/PrintConfig.cpp:2449 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2455 src/libslic3r/PrintConfig.cpp:2456 msgid "Minimum thickness of a top / bottom shell" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2431 +#: src/libslic3r/PrintConfig.cpp:2462 msgid "Spiral vase" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2463 msgid "" "This feature will raise Z gradually while printing a single-walled object in " "order to remove any visible seam. This option requires a single perimeter, " @@ -12357,18 +14239,17 @@ msgid "" "when printing more than one single object." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2440 +#: src/libslic3r/PrintConfig.cpp:2471 msgid "Temperature variation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:2472 msgid "" -"Temperature difference to be applied when an extruder is not active. Enables " -"a full-height \"sacrificial\" skirt on which the nozzles are periodically " -"wiped." +"Temperature difference to be applied when an extruder is not active. The " +"value is not used when 'idle_temperature' in filament settings is defined." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2483 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -12379,7 +14260,7 @@ msgid "" "put a \"M109 S[first_layer_temperature]\" command wherever you want." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2466 +#: src/libslic3r/PrintConfig.cpp:2498 msgid "" "This start procedure is inserted at the beginning, after any printer start " "gcode (and after any toolchange to this filament in case of multi-material " @@ -12392,45 +14273,45 @@ msgid "" "extruders, the gcode is processed in extruder order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2514 msgid "Color change G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2483 +#: src/libslic3r/PrintConfig.cpp:2515 msgid "This G-code will be used as a code for the color change" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2492 +#: src/libslic3r/PrintConfig.cpp:2524 msgid "This G-code will be used as a code for the pause print" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2501 +#: src/libslic3r/PrintConfig.cpp:2533 msgid "This G-code will be used as a custom code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2509 +#: src/libslic3r/PrintConfig.cpp:2541 msgid "Single Extruder Multi Material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2510 +#: src/libslic3r/PrintConfig.cpp:2542 msgid "The printer multiplexes filaments into a single hot end." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2515 +#: src/libslic3r/PrintConfig.cpp:2547 msgid "Prime all printing extruders" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2516 +#: src/libslic3r/PrintConfig.cpp:2548 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2521 +#: src/libslic3r/PrintConfig.cpp:2553 msgid "No sparse layers (EXPERIMENTAL)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2554 msgid "" "If enabled, the wipe tower will not be printed on layers with no " "toolchanges. On layers with a toolchange, extruder will travel downward to " @@ -12438,129 +14319,127 @@ msgid "" "with the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2529 +#: src/libslic3r/PrintConfig.cpp:2561 msgid "Slice gap closing radius" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2531 +#: src/libslic3r/PrintConfig.cpp:2563 msgid "" "Cracks smaller than 2x gap closing radius are being filled during the " "triangle mesh slicing. The gap closing operation may reduce the final print " "resolution, therefore it is advisable to keep the value reasonably low." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2539 +#: src/libslic3r/PrintConfig.cpp:2571 msgid "Slicing Mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2541 +#: src/libslic3r/PrintConfig.cpp:2573 msgid "" "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " "close all holes in the model." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2575 msgid "Regular" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2547 +#: src/libslic3r/PrintConfig.cpp:2576 msgid "Even-odd" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2548 +#: src/libslic3r/PrintConfig.cpp:2577 msgid "Close holes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2553 +#: src/libslic3r/PrintConfig.cpp:2583 msgid "Generate support material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2555 +#: src/libslic3r/PrintConfig.cpp:2585 msgid "Enable support material generation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2559 +#: src/libslic3r/PrintConfig.cpp:2589 msgid "Auto generated supports" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2561 +#: src/libslic3r/PrintConfig.cpp:2591 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " "\"Support Enforcer\" volumes only." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2567 +#: src/libslic3r/PrintConfig.cpp:2597 msgid "XY separation between an object and its support" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2599 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2580 +#: src/libslic3r/PrintConfig.cpp:2610 msgid "Pattern angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2582 +#: src/libslic3r/PrintConfig.cpp:2612 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2592 src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:2622 src/libslic3r/PrintConfig.cpp:3411 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2598 +#: src/libslic3r/PrintConfig.cpp:2627 msgid "Top contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2600 +#: src/libslic3r/PrintConfig.cpp:2629 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " "first object layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2608 +#: src/libslic3r/PrintConfig.cpp:2635 msgid "0 (soluble)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2609 +#: src/libslic3r/PrintConfig.cpp:2636 msgid "0.1 (detachable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2610 +#: src/libslic3r/PrintConfig.cpp:2637 msgid "0.2 (detachable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2616 +#: src/libslic3r/PrintConfig.cpp:2643 msgid "Bottom contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2618 +#: src/libslic3r/PrintConfig.cpp:2645 msgid "" "The vertical distance between the object top surface and the support " "material interface. If set to zero, support_material_contact_distance will " "be used for both top and bottom contact Z distances." msgstr "" -#. TRN To be shown in Print Settings "Bottom contact Z distance". Have to be as short as possible -#. TRN To be shown in Print Settings "Bottom interface layers". Have to be as short as possible -#: src/libslic3r/PrintConfig.cpp:2626 src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2651 src/libslic3r/PrintConfig.cpp:2732 msgid "Same as top" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2633 +#: src/libslic3r/PrintConfig.cpp:2659 msgid "Enforce support for the first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2635 +#: src/libslic3r/PrintConfig.cpp:2661 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -12568,21 +14447,21 @@ msgid "" "of objects having a very thin or poor footprint on the build plate." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2640 +#: src/libslic3r/PrintConfig.cpp:2666 msgid "Enforce support for the first n layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2646 +#: src/libslic3r/PrintConfig.cpp:2672 msgid "Support material/raft/skirt extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2648 +#: src/libslic3r/PrintConfig.cpp:2674 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2657 +#: src/libslic3r/PrintConfig.cpp:2683 msgid "" "Set this to a non-zero value to set a manual extrusion width for support " "material. If left zero, default extrusion width will be used if set, " @@ -12590,151 +14469,156 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2667 +#: src/libslic3r/PrintConfig.cpp:2693 msgid "Interface loops" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2669 +#: src/libslic3r/PrintConfig.cpp:2695 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2674 +#: src/libslic3r/PrintConfig.cpp:2700 msgid "Support material/raft interface extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2676 +#: src/libslic3r/PrintConfig.cpp:2702 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2684 +#: src/libslic3r/PrintConfig.cpp:2709 msgid "Top interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2711 msgid "" "Number of interface layers to insert between the object(s) and support " "material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2693 +#: src/libslic3r/PrintConfig.cpp:2715 src/libslic3r/PrintConfig.cpp:2733 msgid "0 (off)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2716 src/libslic3r/PrintConfig.cpp:2734 msgid "1 (light)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2695 +#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2735 msgid "2 (default)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2696 +#: src/libslic3r/PrintConfig.cpp:2718 src/libslic3r/PrintConfig.cpp:2736 msgid "3 (heavy)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:2724 msgid "Bottom interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2704 +#: src/libslic3r/PrintConfig.cpp:2726 msgid "" "Number of interface layers to insert between the object(s) and support " "material. Set to -1 to use support_material_interface_layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2717 +#: src/libslic3r/PrintConfig.cpp:2742 msgid "Closing radius" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2719 +#: src/libslic3r/PrintConfig.cpp:2744 msgid "" "For snug supports, the support regions will be merged using morphological " "closing operation. Gaps smaller than the closing radius will be filled in." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2727 +#: src/libslic3r/PrintConfig.cpp:2752 msgid "Interface pattern spacing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2729 +#: src/libslic3r/PrintConfig.cpp:2754 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2738 +#: src/libslic3r/PrintConfig.cpp:2761 +msgid "Support material interface" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2763 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " "speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2747 +#: src/libslic3r/PrintConfig.cpp:2772 msgid "Pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2749 +#: src/libslic3r/PrintConfig.cpp:2774 msgid "Pattern used to generate support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2755 +#: src/libslic3r/PrintConfig.cpp:2777 msgid "Rectilinear grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2761 +#: src/libslic3r/PrintConfig.cpp:2784 msgid "Interface pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2763 +#: src/libslic3r/PrintConfig.cpp:2786 msgid "" "Pattern used to generate support material interface. Default pattern for non-" "soluble support interface is Rectilinear, while default pattern for soluble " "support interface is Concentric." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2777 +#: src/libslic3r/PrintConfig.cpp:2798 msgid "Pattern spacing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2779 +#: src/libslic3r/PrintConfig.cpp:2800 msgid "Spacing between support material lines." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2788 +#: src/libslic3r/PrintConfig.cpp:2809 msgid "Speed for printing support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2795 -msgid "Style" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:2797 +#: src/libslic3r/PrintConfig.cpp:2818 msgid "" "Style and shape of the support towers. Projecting the supports into a " "regular grid will create more stable supports, while snug support towers " "will save material and reduce object scarring." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2804 +#: src/libslic3r/PrintConfig.cpp:2823 msgid "Snug" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2809 +#: src/libslic3r/PrintConfig.cpp:2824 +msgid "Organic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2830 msgid "Synchronize with object layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2811 +#: src/libslic3r/PrintConfig.cpp:2832 msgid "" "Synchronize support layers with the object print layers. This is useful with " -"multi-material printers, where the extruder switch is expensive." +"multi-material printers, where the extruder switch is expensive. This option " +"is only available when top contact Z distance is set to zero." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2817 +#: src/libslic3r/PrintConfig.cpp:2839 msgid "Overhang threshold" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2819 +#: src/libslic3r/PrintConfig.cpp:2841 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -12743,58 +14627,123 @@ msgid "" "detection (recommended)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2853 msgid "With sheath around the support" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2833 +#: src/libslic3r/PrintConfig.cpp:2855 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2840 +#: src/libslic3r/PrintConfig.cpp:2861 +msgid "Maximum Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2863 +msgid "" +"The maximum angle of the branches, when the branches have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle to be able to have more reach." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2872 +msgid "Preferred Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2874 +msgid "" +"The preferred angle of the branches, when they do not have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle for branches to merge faster." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2883 +msgid "Tip Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2885 +msgid "The diameter of the top of the tip of the branches of organic support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2892 +msgid "Branch Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2894 +msgid "" +"The diameter of the thinnest branches of organic support. Thicker branches " +"are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2902 +msgid "Branch Diameter Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2904 +msgid "" +"The angle of the branches' diameter as they gradually become thicker towards " +"the bottom. An angle of 0 will cause the branches to have uniform thickness " +"over their length. A bit of an angle can increase stability of the organic " +"support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2914 +msgid "Branch Density" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2916 +msgid "" +"Adjusts the density of the support structure used to generate the tips of " +"the branches. A higher value results in better overhangs but the supports " +"are harder to remove, thus it is recommended to enable top support " +"interfaces instead of a high branch density value if dense interfaces are " +"needed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2928 msgid "" "Nozzle temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2843 +#: src/libslic3r/PrintConfig.cpp:2931 msgid "Nozzle temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2849 +#: src/libslic3r/PrintConfig.cpp:2937 msgid "Thick bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2851 +#: src/libslic3r/PrintConfig.cpp:2939 msgid "" "If enabled, bridges are more reliable, can bridge longer distances, but may " "look worse. If disabled, bridges look better but are reliable just for " "shorter bridged distances." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2857 +#: src/libslic3r/PrintConfig.cpp:2945 msgid "Detect thin walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2859 +#: src/libslic3r/PrintConfig.cpp:2947 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2953 msgid "Threads" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2866 +#: src/libslic3r/PrintConfig.cpp:2954 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2878 +#: src/libslic3r/PrintConfig.cpp:2966 msgid "" "This custom code is inserted before every toolchange. Placeholder variables " "for all PrusaSlicer settings as well as {toolchange_z}, {previous_extruder} " @@ -12804,7 +14753,7 @@ msgid "" "behaviour both before and after the toolchange." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2891 +#: src/libslic3r/PrintConfig.cpp:2979 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "top surfaces. You may want to use thinner extrudates to fill all narrow " @@ -12813,7 +14762,7 @@ msgid "" "percentage (for example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2904 +#: src/libslic3r/PrintConfig.cpp:2992 msgid "" "Speed for printing top solid layers (it only applies to the uppermost " "external layers and not to their internal solid layers). You may want to " @@ -12822,65 +14771,65 @@ msgid "" "for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2919 +#: src/libslic3r/PrintConfig.cpp:3007 msgid "Number of solid layers to generate on top surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3008 msgid "Top solid layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2928 +#: src/libslic3r/PrintConfig.cpp:3016 msgid "" "The number of top solid layers is increased above top_solid_layers if " "necessary to satisfy minimum thickness of top shell. This is useful to " "prevent pillowing effect when printing with variable layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2931 +#: src/libslic3r/PrintConfig.cpp:3019 msgid "Minimum top shell thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:3026 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2946 +#: src/libslic3r/PrintConfig.cpp:3034 msgid "Z travel" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2947 +#: src/libslic3r/PrintConfig.cpp:3035 msgid "" "Speed for movements along the Z axis.\n" "When set to zero, the value is ignored and regular travel speed is used " "instead." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2955 +#: src/libslic3r/PrintConfig.cpp:3043 msgid "Use firmware retraction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2956 +#: src/libslic3r/PrintConfig.cpp:3044 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2962 +#: src/libslic3r/PrintConfig.cpp:3050 msgid "Use relative E distances" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2963 +#: src/libslic3r/PrintConfig.cpp:3051 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2969 +#: src/libslic3r/PrintConfig.cpp:3057 msgid "Use volumetric E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2970 +#: src/libslic3r/PrintConfig.cpp:3058 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -12890,131 +14839,135 @@ msgid "" "only supported in recent Marlin." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2980 +#: src/libslic3r/PrintConfig.cpp:3068 msgid "Enable variable layer height feature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2981 +#: src/libslic3r/PrintConfig.cpp:3069 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2987 +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Wipe while retracting" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2988 +#: src/libslic3r/PrintConfig.cpp:3076 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2995 +#: src/libslic3r/PrintConfig.cpp:3083 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3001 +#: src/libslic3r/PrintConfig.cpp:3089 msgid "Purging volumes - load/unload volumes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3002 +#: src/libslic3r/PrintConfig.cpp:3090 msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " "volumes below." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3008 +#: src/libslic3r/PrintConfig.cpp:3096 msgid "Purging volumes - matrix" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3009 +#: src/libslic3r/PrintConfig.cpp:3097 msgid "" "This matrix describes volumes (in cubic milimetres) required to purge the " "new filament on the wipe tower for any given pair of tools." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3018 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Position X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3019 +#: src/libslic3r/PrintConfig.cpp:3107 msgid "X coordinate of the left front corner of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3025 +#: src/libslic3r/PrintConfig.cpp:3113 msgid "Position Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3026 +#: src/libslic3r/PrintConfig.cpp:3114 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3033 +#: src/libslic3r/PrintConfig.cpp:3120 +msgid "Width" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3121 msgid "Width of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3039 +#: src/libslic3r/PrintConfig.cpp:3127 msgid "Wipe tower rotation angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3040 +#: src/libslic3r/PrintConfig.cpp:3128 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3046 src/libslic3r/PrintConfig.cpp:3047 +#: src/libslic3r/PrintConfig.cpp:3134 src/libslic3r/PrintConfig.cpp:3135 msgid "Wipe tower brim width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3055 +#: src/libslic3r/PrintConfig.cpp:3143 msgid "Wipe into this object's infill" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3056 +#: src/libslic3r/PrintConfig.cpp:3144 msgid "" "Purging after toolchange will be done inside this object's infills. This " "lowers the amount of waste but may result in longer print time due to " "additional travel moves." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3063 +#: src/libslic3r/PrintConfig.cpp:3151 msgid "Wipe into this object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3064 +#: src/libslic3r/PrintConfig.cpp:3152 msgid "" "Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " "Colours of the objects will be mixed as a result." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3070 +#: src/libslic3r/PrintConfig.cpp:3158 msgid "Maximal bridging distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3071 +#: src/libslic3r/PrintConfig.cpp:3159 msgid "Maximal distance between supports on sparse infill sections." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3077 +#: src/libslic3r/PrintConfig.cpp:3165 msgid "XY Size Compensation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3167 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" "tuning hole sizes." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3087 +#: src/libslic3r/PrintConfig.cpp:3175 msgid "Z offset" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3088 +#: src/libslic3r/PrintConfig.cpp:3176 msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " "output G-code. It is used to compensate for bad Z endstop position: for " @@ -13022,560 +14975,602 @@ msgid "" "print bed, set this to -0.3 (or fix your endstop)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3097 -msgid "Perimeter generator" +#: src/libslic3r/PrintConfig.cpp:3185 +msgid "Perimeter generator" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3187 +msgid "" +"Classic perimeter generator produces perimeters with constant extrusion " +"width and for very thin areas is used gap-fill. Arachne engine produces " +"perimeters with variable extrusion width. This setting also affects the " +"Concentric infill." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3192 +msgid "Classic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3193 +msgid "Arachne" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3199 +msgid "Perimeter transition length" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3201 +msgid "" +"When transitioning between different numbers of perimeters as the part " +"becomes thinner, a certain amount of space is allotted to split or join the " +"perimeter segments. If expressed as a percentage (for example 100%), it will " +"be computed based on the nozzle diameter." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3210 +msgid "Perimeter transitioning filter margin" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3212 +msgid "" +"Prevent transitioning back and forth between one extra perimeter and one " +"less. This margin extends the range of extrusion widths which follow to " +"[Minimum perimeter width - margin, 2 * Minimum perimeter width + margin]. " +"Increasing this margin reduces the number of transitions, which reduces the " +"number of extrusion starts/stops and travel time. However, large extrusion " +"width variation can lead to under- or overextrusion problems. If expressed " +"as a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3225 +msgid "Perimeter transitioning threshold angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3227 +msgid "" +"When to create transitions between even and odd numbers of perimeters. A " +"wedge shape with an angle greater than this setting will not have " +"transitions and no perimeters will be printed in the center to fill the " +"remaining space. Reducing this setting reduces the number and length of " +"these center perimeters, but may leave gaps or overextrude." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3238 +msgid "Perimeter distribution count" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3240 +msgid "" +"The number of perimeters, counted from the center, over which the variation " +"needs to be spread. Lower values mean that the outer perimeters don't change " +"in width." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3247 +msgid "Minimum feature size" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3249 +msgid "" +"Minimum thickness of thin features. Model features that are thinner than " +"this value will not be printed, while features thicker than the Minimum " +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3259 +msgid "Minimum perimeter width" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3261 +msgid "" +"Width of the perimeter that will replace thin features (according to the " +"Minimum feature size) of the model. If the Minimum perimeter width is " +"thinner than the thickness of the feature, the perimeter will become as " +"thick as the feature itself. If expressed as a percentage (for example 85%), " +"it will be computed based on the nozzle diameter." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3327 +msgid "Pinhead front diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3329 +msgid "Diameter of the pointing side of the head" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3336 +msgid "Head penetration" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3338 +msgid "How much the pinhead has to penetrate the model surface" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3345 +msgid "Pinhead width" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3347 +msgid "Width from the back sphere center to the front sphere center" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3355 +msgid "Pillar diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3357 +msgid "Diameter in mm of the support pillars" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3365 +msgid "Small pillar diameter percent" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3367 +msgid "" +"The percentage of smaller pillars compared to the normal pillar diameter " +"which are used in problematic areas where a normal pilla cannot fit." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3376 +msgid "Max bridges on a pillar" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3378 +msgid "" +"Maximum number of bridges that can be placed on a pillar. Bridges hold " +"support point pinheads and connect to pillars as small branches." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3386 +msgid "Max weight on model" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3389 +msgid "" +"Maximum weight of sub-trees that terminate on the model instead of the print " +"bed. The weight is the sum of the lenghts of all branches emanating from the " +"endpoint." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3397 +msgid "Pillar connection mode" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3398 +msgid "" +"Controls the bridge type between two neighboring pillars. Can be zig-zag, " +"cross (double zig-zag) or dynamic which will automatically switch between " +"the first two depending on the distance of the two pillars." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Zig-Zag" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Cross" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Dynamic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3416 +msgid "Pillar widening factor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3099 +#: src/libslic3r/PrintConfig.cpp:3420 msgid "" -"Classic perimeter generator produces perimeters with constant extrusion " -"width and for very thin areas is used gap-fill. Arachne engine produces " -"perimeters with variable extrusion width. This setting also affects the " -"Concentric infill." +"Merging bridges or pillars into another pillars can increase the radius. " +"Zero means no increase, one means full increase. The exact amount of " +"increase is unspecified and can change in the future." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 -msgid "Classic" +#: src/libslic3r/PrintConfig.cpp:3431 +msgid "Support base diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3107 -msgid "Arachne" +#: src/libslic3r/PrintConfig.cpp:3433 +msgid "Diameter in mm of the pillar base" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3112 -msgid "Perimeter transition length" +#: src/libslic3r/PrintConfig.cpp:3441 +msgid "Support base height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3114 -msgid "" -"When transitioning between different numbers of perimeters as the part " -"becomes thinner, a certain amount of space is allotted to split or join the " -"perimeter segments. If expressed as a percentage (for example 100%), it will " -"be computed based on the nozzle diameter." +#: src/libslic3r/PrintConfig.cpp:3443 +msgid "The height of the pillar base cone" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3123 -msgid "Perimeter transitioning filter margin" +#: src/libslic3r/PrintConfig.cpp:3450 +msgid "Support base safety distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3125 +#: src/libslic3r/PrintConfig.cpp:3453 msgid "" -"Prevent transitioning back and forth between one extra perimeter and one " -"less. This margin extends the range of extrusion widths which follow to " -"[Minimum perimeter width - margin, 2 * Minimum perimeter width + margin]. " -"Increasing this margin reduces the number of transitions, which reduces the " -"number of extrusion starts/stops and travel time. However, large extrusion " -"width variation can lead to under- or overextrusion problems. If expressed " -"as a percentage (for example 25%), it will be computed based on the nozzle " -"diameter." +"The minimum distance of the pillar base from the model in mm. Makes sense in " +"zero elevation mode where a gap according to this parameter is inserted " +"between the model and the pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3138 -msgid "Perimeter transitioning threshold angle" +#: src/libslic3r/PrintConfig.cpp:3463 +msgid "Critical angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3140 -msgid "" -"When to create transitions between even and odd numbers of perimeters. A " -"wedge shape with an angle greater than this setting will not have " -"transitions and no perimeters will be printed in the center to fill the " -"remaining space. Reducing this setting reduces the number and length of " -"these center perimeters, but may leave gaps or overextrude." +#: src/libslic3r/PrintConfig.cpp:3465 +msgid "The default angle for connecting support sticks and junctions." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3151 -msgid "Perimeter distribution count" +#: src/libslic3r/PrintConfig.cpp:3473 +msgid "Max bridge length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3153 -msgid "" -"The number of perimeters, counted from the center, over which the variation " -"needs to be spread. Lower values mean that the outer perimeters don't change " -"in width." +#: src/libslic3r/PrintConfig.cpp:3475 +msgid "The max length of a bridge" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3160 -msgid "Minimum feature size" +#: src/libslic3r/PrintConfig.cpp:3487 +msgid "Max pillar linking distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3162 +#: src/libslic3r/PrintConfig.cpp:3489 msgid "" -"Minimum thickness of thin features. Model features that are thinner than " -"this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width. If expressed as " -"a percentage (for example 25%), it will be computed based on the nozzle " -"diameter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3172 -msgid "Minimum perimeter width" +"The max distance of two pillars to get linked with each other. A zero value " +"will prohibit pillar cascading." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3174 +#: src/libslic3r/PrintConfig.cpp:3499 msgid "" -"Width of the perimeter that will replace thin features (according to the " -"Minimum feature size) of the model. If the Minimum perimeter width is " -"thinner than the thickness of the feature, the perimeter will become as " -"thick as the feature itself. If expressed as a percentage (for example 85%), " -"it will be computed based on the nozzle diameter." +"How much the supports should lift up the supported object. If \"Pad around " +"object\" is enabled, this value is ignored." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3242 +#: src/libslic3r/PrintConfig.cpp:3515 msgid "Display width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3516 msgid "Width of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3248 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "Display height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3522 msgid "Height of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3254 +#: src/libslic3r/PrintConfig.cpp:3527 msgid "Number of pixels in" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3256 +#: src/libslic3r/PrintConfig.cpp:3529 msgid "Number of pixels in X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3535 msgid "Number of pixels in Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3267 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Display horizontal mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3268 +#: src/libslic3r/PrintConfig.cpp:3541 msgid "Mirror horizontally" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3542 msgid "Enable horizontal mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3274 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Display vertical mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3275 +#: src/libslic3r/PrintConfig.cpp:3548 msgid "Mirror vertically" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "Enable vertical mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3281 +#: src/libslic3r/PrintConfig.cpp:3554 msgid "Display orientation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3282 +#: src/libslic3r/PrintConfig.cpp:3555 msgid "" "Set the actual LCD display orientation inside the SLA printer. Portrait mode " "will flip the meaning of display width and height parameters and the output " "images will be rotated by 90 degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3288 +#: src/libslic3r/PrintConfig.cpp:3559 msgid "Landscape" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3289 +#: src/libslic3r/PrintConfig.cpp:3560 msgid "Portrait" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3294 src/libslic3r/PrintConfig.cpp:3929 +#: src/libslic3r/PrintConfig.cpp:3566 src/libslic3r/PrintConfig.cpp:4058 msgid "Fast" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3295 +#: src/libslic3r/PrintConfig.cpp:3567 msgid "Fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3296 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Time of the fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3303 src/libslic3r/PrintConfig.cpp:3928 +#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:4057 msgid "Slow" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3304 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3305 +#: src/libslic3r/PrintConfig.cpp:3577 msgid "Time of the slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3312 src/libslic3r/PrintConfig.cpp:3930 +#: src/libslic3r/PrintConfig.cpp:3584 src/libslic3r/PrintConfig.cpp:4059 msgid "High viscosity" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3313 +#: src/libslic3r/PrintConfig.cpp:3585 msgid "Tilt for high viscosity resin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3314 +#: src/libslic3r/PrintConfig.cpp:3586 msgid "Time of the super slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3321 +#: src/libslic3r/PrintConfig.cpp:3593 msgid "Area fill" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3322 +#: src/libslic3r/PrintConfig.cpp:3594 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" "then a slow tilt will be used, otherwise - a fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 -#: src/libslic3r/PrintConfig.cpp:3331 +#: src/libslic3r/PrintConfig.cpp:3601 src/libslic3r/PrintConfig.cpp:3602 +#: src/libslic3r/PrintConfig.cpp:3603 msgid "Printer scaling correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3337 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3609 src/libslic3r/PrintConfig.cpp:3611 msgid "Printer scaling correction in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3338 +#: src/libslic3r/PrintConfig.cpp:3610 msgid "Printer scaling X axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3345 src/libslic3r/PrintConfig.cpp:3347 +#: src/libslic3r/PrintConfig.cpp:3617 src/libslic3r/PrintConfig.cpp:3619 msgid "Printer scaling correction in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3346 +#: src/libslic3r/PrintConfig.cpp:3618 msgid "Printer scaling Y axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3353 src/libslic3r/PrintConfig.cpp:3355 +#: src/libslic3r/PrintConfig.cpp:3625 src/libslic3r/PrintConfig.cpp:3627 msgid "Printer scaling correction in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3354 +#: src/libslic3r/PrintConfig.cpp:3626 msgid "Printer scaling Z axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3361 src/libslic3r/PrintConfig.cpp:3362 +#: src/libslic3r/PrintConfig.cpp:3633 src/libslic3r/PrintConfig.cpp:3634 msgid "Printer absolute correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3363 +#: src/libslic3r/PrintConfig.cpp:3635 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3369 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Elephant foot minimum width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3371 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3378 src/libslic3r/PrintConfig.cpp:3379 +#: src/libslic3r/PrintConfig.cpp:3650 src/libslic3r/PrintConfig.cpp:3651 msgid "Printer gamma correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3380 +#: src/libslic3r/PrintConfig.cpp:3652 msgid "" "This will apply a gamma correction to the rasterized 2D polygons. A gamma " "value of zero means thresholding with the threshold in the middle. This " "behaviour eliminates antialiasing without losing holes in polygons." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3399 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3671 src/libslic3r/PrintConfig.cpp:3672 msgid "SLA material type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3411 src/libslic3r/PrintConfig.cpp:3412 +#: src/libslic3r/PrintConfig.cpp:3679 src/libslic3r/PrintConfig.cpp:3680 msgid "Initial layer height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3418 src/libslic3r/PrintConfig.cpp:3419 +#: src/libslic3r/PrintConfig.cpp:3686 +msgid "Idle temperature" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3687 +msgid "" +"Nozzle temperature when the tool is currently not used in multi-tool setups." +"This is only used when 'Ooze prevention' is active in Print Settings." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3695 src/libslic3r/PrintConfig.cpp:3696 msgid "Bottle volume" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3420 +#: src/libslic3r/PrintConfig.cpp:3697 msgid "ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3425 src/libslic3r/PrintConfig.cpp:3426 +#: src/libslic3r/PrintConfig.cpp:3702 src/libslic3r/PrintConfig.cpp:3703 msgid "Bottle weight" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3427 +#: src/libslic3r/PrintConfig.cpp:3704 msgid "kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "g/ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3718 msgid "money/bottle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3446 +#: src/libslic3r/PrintConfig.cpp:3723 msgid "Faded layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3724 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3454 src/libslic3r/PrintConfig.cpp:3455 +#: src/libslic3r/PrintConfig.cpp:3731 src/libslic3r/PrintConfig.cpp:3732 msgid "Minimum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3462 src/libslic3r/PrintConfig.cpp:3463 +#: src/libslic3r/PrintConfig.cpp:3739 src/libslic3r/PrintConfig.cpp:3740 msgid "Maximum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3470 src/libslic3r/PrintConfig.cpp:3471 +#: src/libslic3r/PrintConfig.cpp:3747 src/libslic3r/PrintConfig.cpp:3748 msgid "Exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3477 src/libslic3r/PrintConfig.cpp:3478 +#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3755 msgid "Minimum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3485 src/libslic3r/PrintConfig.cpp:3486 +#: src/libslic3r/PrintConfig.cpp:3762 src/libslic3r/PrintConfig.cpp:3763 msgid "Maximum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3493 src/libslic3r/PrintConfig.cpp:3494 +#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3771 msgid "Initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3500 src/libslic3r/PrintConfig.cpp:3501 +#: src/libslic3r/PrintConfig.cpp:3777 src/libslic3r/PrintConfig.cpp:3778 msgid "Correction for expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3507 src/libslic3r/PrintConfig.cpp:3508 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3785 msgid "Correction for expansion in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3514 src/libslic3r/PrintConfig.cpp:3515 +#: src/libslic3r/PrintConfig.cpp:3791 src/libslic3r/PrintConfig.cpp:3792 msgid "Correction for expansion in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3521 src/libslic3r/PrintConfig.cpp:3522 +#: src/libslic3r/PrintConfig.cpp:3798 src/libslic3r/PrintConfig.cpp:3799 msgid "Correction for expansion in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3528 +#: src/libslic3r/PrintConfig.cpp:3805 msgid "SLA print material notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3529 +#: src/libslic3r/PrintConfig.cpp:3806 msgid "You can put your notes regarding the SLA print material here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3552 +#: src/libslic3r/PrintConfig.cpp:3818 src/libslic3r/PrintConfig.cpp:3829 msgid "Default SLA material profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3563 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "Generate supports" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3842 msgid "Generate supports for the models" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3570 -msgid "Pinhead front diameter" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3572 -msgid "Diameter of the pointing side of the head" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3579 -msgid "Head penetration" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3581 -msgid "How much the pinhead has to penetrate the model surface" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3588 -msgid "Pinhead width" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3590 -msgid "Width from the back sphere center to the front sphere center" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3598 -msgid "Pillar diameter" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3600 -msgid "Diameter in mm of the support pillars" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3608 -msgid "Small pillar diameter percent" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3610 -msgid "" -"The percentage of smaller pillars compared to the normal pillar diameter " -"which are used in problematic areas where a normal pilla cannot fit." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3619 -msgid "Max bridges on a pillar" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3621 -msgid "" -"Maximum number of bridges that can be placed on a pillar. Bridges hold " -"support point pinheads and connect to pillars as small branches." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3629 -msgid "Pillar connection mode" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3630 -msgid "" -"Controls the bridge type between two neighboring pillars. Can be zig-zag, " -"cross (double zig-zag) or dynamic which will automatically switch between " -"the first two depending on the distance of the two pillars." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3638 -msgid "Zig-Zag" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3639 -msgid "Cross" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3640 -msgid "Dynamic" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3652 -msgid "Pillar widening factor" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3654 -msgid "" -"Merging bridges or pillars into another pillars can increase the radius. " -"Zero means no increase, one means full increase." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3663 -msgid "Support base diameter" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3665 -msgid "Diameter in mm of the pillar base" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3673 -msgid "Support base height" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3675 -msgid "The height of the pillar base cone" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3682 -msgid "Support base safety distance" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3685 -msgid "" -"The minimum distance of the pillar base from the model in mm. Makes sense in " -"zero elevation mode where a gap according to this parameter is inserted " -"between the model and the pad." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3695 -msgid "Critical angle" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3697 -msgid "The default angle for connecting support sticks and junctions." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3705 -msgid "Max bridge length" +#: src/libslic3r/PrintConfig.cpp:3847 +msgid "Support tree type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3707 -msgid "The max length of a bridge" +#: src/libslic3r/PrintConfig.cpp:3848 +msgid "Support tree building strategy" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3714 -msgid "Max pillar linking distance" +#: src/libslic3r/PrintConfig.cpp:3851 +msgid "Branching (experimental)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3716 -msgid "" -"The max distance of two pillars to get linked with each other. A zero value " -"will prohibit pillar cascading." +#: src/libslic3r/PrintConfig.cpp:3860 +msgid "Support only in enforced regions" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3726 -msgid "" -"How much the supports should lift up the supported object. If \"Pad around " -"object\" is enabled, this value is ignored." +#: src/libslic3r/PrintConfig.cpp:3862 +msgid "Only create support if it lies in a support enforcer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3737 +#: src/libslic3r/PrintConfig.cpp:3869 msgid "This is a relative measure of support points density." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3743 +#: src/libslic3r/PrintConfig.cpp:3875 msgid "Minimal distance of the support points" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3745 +#: src/libslic3r/PrintConfig.cpp:3877 msgid "No support points will be placed closer than this threshold." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3751 +#: src/libslic3r/PrintConfig.cpp:3883 msgid "Use pad" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3885 msgid "Add a pad underneath the supported model" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3758 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "Pad wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3760 +#: src/libslic3r/PrintConfig.cpp:3892 msgid "The thickness of the pad and its optional cavity walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3768 +#: src/libslic3r/PrintConfig.cpp:3900 msgid "Pad wall height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3769 +#: src/libslic3r/PrintConfig.cpp:3901 msgid "" "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " "when enabling this feature, as some resins may produce an extreme suction " @@ -13583,111 +15578,111 @@ msgid "" "difficult." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3782 +#: src/libslic3r/PrintConfig.cpp:3914 msgid "Pad brim size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3783 +#: src/libslic3r/PrintConfig.cpp:3915 msgid "How far should the pad extend around the contained geometry" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3793 +#: src/libslic3r/PrintConfig.cpp:3925 msgid "Max merge distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3927 msgid "" "Some objects can get along with a few smaller pads instead of a single big " "one. This parameter defines how far the center of two smaller pads should " "be. If theyare closer, they will get merged into one pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3815 +#: src/libslic3r/PrintConfig.cpp:3947 msgid "Pad wall slope" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3817 +#: src/libslic3r/PrintConfig.cpp:3949 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3960 msgid "Create pad around object and ignore the support elevation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3833 +#: src/libslic3r/PrintConfig.cpp:3965 msgid "Pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3967 msgid "Force pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3840 +#: src/libslic3r/PrintConfig.cpp:3972 msgid "Pad object gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3842 +#: src/libslic3r/PrintConfig.cpp:3974 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3851 +#: src/libslic3r/PrintConfig.cpp:3983 msgid "Pad object connector stride" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3853 +#: src/libslic3r/PrintConfig.cpp:3985 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3860 +#: src/libslic3r/PrintConfig.cpp:3992 msgid "Pad object connector width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3862 +#: src/libslic3r/PrintConfig.cpp:3994 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3869 +#: src/libslic3r/PrintConfig.cpp:4001 msgid "Pad object connector penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3872 +#: src/libslic3r/PrintConfig.cpp:4004 msgid "How much should the tiny connectors penetrate into the model body." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3879 +#: src/libslic3r/PrintConfig.cpp:4011 msgid "Enable hollowing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:4013 msgid "Hollow out a model to have an empty interior" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3886 +#: src/libslic3r/PrintConfig.cpp:4018 msgid "Wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3888 +#: src/libslic3r/PrintConfig.cpp:4020 msgid "Minimum wall thickness of a hollowed model." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3896 +#: src/libslic3r/PrintConfig.cpp:4028 msgid "Accuracy" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3898 +#: src/libslic3r/PrintConfig.cpp:4030 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:4040 msgid "" "Hollowing is done in two steps: first, an imaginary interior is calculated " "deeper (offset plus the closing distance) in the object and then it's " @@ -13696,236 +15691,276 @@ msgid "" "most." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3920 +#: src/libslic3r/PrintConfig.cpp:4052 msgid "Print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3922 +#: src/libslic3r/PrintConfig.cpp:4054 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " "movement and adds a delay before exposure." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4390 +#: src/libslic3r/PrintConfig.cpp:4065 +msgid "Format of the output SLA archive" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4070 +msgid "SLA output precision" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4071 +msgid "Minimum resolution in nanometers" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4542 msgid "Export OBJ" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4391 +#: src/libslic3r/PrintConfig.cpp:4543 msgid "Export the model(s) as OBJ." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4554 msgid "Export SLA" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4403 +#: src/libslic3r/PrintConfig.cpp:4555 msgid "Slice the model and export SLA printing layers as PNG." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4408 +#: src/libslic3r/PrintConfig.cpp:4560 msgid "Export 3MF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4409 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Export the model(s) as 3MF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4413 +#: src/libslic3r/PrintConfig.cpp:4565 msgid "Export AMF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4414 +#: src/libslic3r/PrintConfig.cpp:4566 msgid "Export the model(s) as AMF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4418 +#: src/libslic3r/PrintConfig.cpp:4570 msgid "Export STL" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4419 +#: src/libslic3r/PrintConfig.cpp:4571 msgid "Export the model(s) as STL." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4424 +#: src/libslic3r/PrintConfig.cpp:4576 msgid "Slice the model and export toolpaths as G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4581 msgid "G-code viewer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4430 +#: src/libslic3r/PrintConfig.cpp:4582 msgid "Visualize an already sliced and saved G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4588 +msgid "OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4589 +msgid "Select the specified OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4594 +msgid "OpenGL debug output" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4595 +msgid "Activate OpenGL debug output on graphic cards which support it" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4601 msgid "Slice" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4436 +#: src/libslic3r/PrintConfig.cpp:4602 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4607 msgid "Help" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4442 +#: src/libslic3r/PrintConfig.cpp:4608 msgid "Show this help." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4447 +#: src/libslic3r/PrintConfig.cpp:4613 msgid "Help (FFF options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4448 +#: src/libslic3r/PrintConfig.cpp:4614 msgid "Show the full list of print/G-code configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4452 +#: src/libslic3r/PrintConfig.cpp:4618 msgid "Help (SLA options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4453 +#: src/libslic3r/PrintConfig.cpp:4619 msgid "Show the full list of SLA print configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4457 +#: src/libslic3r/PrintConfig.cpp:4623 msgid "Output Model Info" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4458 +#: src/libslic3r/PrintConfig.cpp:4624 msgid "Write information about the model to the console." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4462 +#: src/libslic3r/PrintConfig.cpp:4628 msgid "Save config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4463 +#: src/libslic3r/PrintConfig.cpp:4629 msgid "Save configuration to the specified file." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4473 +#: src/libslic3r/PrintConfig.cpp:4639 msgid "Align XY" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4474 +#: src/libslic3r/PrintConfig.cpp:4640 msgid "Align the model to the given point." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4479 +#: src/libslic3r/PrintConfig.cpp:4645 msgid "Cut model at the given Z." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4501 +#: src/libslic3r/PrintConfig.cpp:4666 +msgid "Center" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4667 msgid "Center the print around the given center." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4505 +#: src/libslic3r/PrintConfig.cpp:4671 msgid "Don't arrange" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4506 +#: src/libslic3r/PrintConfig.cpp:4672 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4509 +#: src/libslic3r/PrintConfig.cpp:4675 msgid "Ensure on bed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4510 +#: src/libslic3r/PrintConfig.cpp:4676 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4514 +#: src/libslic3r/PrintConfig.cpp:4680 msgid "Duplicate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4515 +#: src/libslic3r/PrintConfig.cpp:4681 msgid "Multiply copies by this factor." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4519 +#: src/libslic3r/PrintConfig.cpp:4685 msgid "Duplicate by grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4520 +#: src/libslic3r/PrintConfig.cpp:4686 msgid "Multiply copies by creating a grid." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4524 +#: src/libslic3r/PrintConfig.cpp:4690 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4529 +#: src/libslic3r/PrintConfig.cpp:4695 msgid "" "Try to repair any non-manifold meshes (this option is implicitly added " "whenever we need to slice the model to perform the requested action)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4533 +#: src/libslic3r/PrintConfig.cpp:4699 msgid "Rotation angle around the Z axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4537 +#: src/libslic3r/PrintConfig.cpp:4703 msgid "Rotate around X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4538 +#: src/libslic3r/PrintConfig.cpp:4704 msgid "Rotation angle around the X axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4542 +#: src/libslic3r/PrintConfig.cpp:4708 msgid "Rotate around Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4543 +#: src/libslic3r/PrintConfig.cpp:4709 msgid "Rotation angle around the Y axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4548 +#: src/libslic3r/PrintConfig.cpp:4714 msgid "Scaling factor or percentage." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4553 +#: src/libslic3r/PrintConfig.cpp:4719 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4556 +#: src/libslic3r/PrintConfig.cpp:4722 msgid "Scale to Fit" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4557 +#: src/libslic3r/PrintConfig.cpp:4723 msgid "Scale to fit the given volume." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4566 +#: src/libslic3r/PrintConfig.cpp:4727 +msgid "Delete files after loading" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4728 +msgid "Delete files after loading." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4736 msgid "Ignore non-existent config files" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4567 +#: src/libslic3r/PrintConfig.cpp:4737 msgid "Do not fail if a file supplied to --load does not exist." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4570 +#: src/libslic3r/PrintConfig.cpp:4740 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4741 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -13933,80 +15968,80 @@ msgid "" "substitute an unknown value with a default silently or verbosely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4745 msgid "Bail out on unknown configuration values" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4579 +#: src/libslic3r/PrintConfig.cpp:4746 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4580 +#: src/libslic3r/PrintConfig.cpp:4747 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4584 +#: src/libslic3r/PrintConfig.cpp:4752 msgid "Load config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4585 +#: src/libslic3r/PrintConfig.cpp:4753 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4588 +#: src/libslic3r/PrintConfig.cpp:4756 msgid "Output File" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4589 +#: src/libslic3r/PrintConfig.cpp:4757 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4593 +#: src/libslic3r/PrintConfig.cpp:4761 msgid "Single instance mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4594 +#: src/libslic3r/PrintConfig.cpp:4762 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " "the \"single_instance\" configuration value from application preferences." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4605 +#: src/libslic3r/PrintConfig.cpp:4767 msgid "Data directory" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4606 +#: src/libslic3r/PrintConfig.cpp:4768 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " "storage." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4771 msgid "Logging level" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4772 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" "For example. loglevel=2 logs fatal, error and warning level messages." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4616 +#: src/libslic3r/PrintConfig.cpp:4778 msgid "Render with a software renderer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4617 +#: src/libslic3r/PrintConfig.cpp:4779 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -14016,18 +16051,30 @@ msgstr "" msgid "Error with zip archive" msgstr "" -#: src/libslic3r/PrintObject.cpp:126 +#: src/libslic3r/PrintObject.cpp:152 msgid "Generating perimeters" msgstr "" -#: src/libslic3r/PrintObject.cpp:229 +#: src/libslic3r/PrintObject.cpp:257 msgid "Preparing infill" msgstr "" -#: src/libslic3r/PrintObject.cpp:403 +#: src/libslic3r/PrintObject.cpp:402 +msgid "making infill" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:449 +msgid "Searching support spots" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:474 msgid "Generating support material" msgstr "" +#: src/libslic3r/PrintObject.cpp:495 +msgid "Estimating curled extrusions" +msgstr "" + #: resources/data/hints.ini: [hint:Fuzzy skin] msgid "Fuzzy skin\nDid you know that you can create rough fibre-like texture on the sides of your models using theFuzzy skinfeature? You can also use modifiers to apply fuzzy-skin only to a portion of your model." msgstr "" @@ -14163,3 +16210,19 @@ msgstr "" #: resources/data/hints.ini: [hint:Fullscreen mode] msgid "Fullscreen mode\nDid you know that you can switch PrusaSlicer to fullscreen mode? Use the F11 hotkey." msgstr "" + +#: resources/data/hints.ini: [hint:Printables integration] +msgid "Printables.com integration\nDid you know that when you are browsing Printables.com, you can send 3D model files to PrusaSlicer with a single click? Learn more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Cut tool] +msgid "Cut tool\nDid you know that you can cut a model at any angle and even create aligning pins with the updated Cut tool? Learn more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Measurement tool] +msgid "Measurement tool\nDid you know that you can measure the distances between points, edges and planes, the radius of a hole or the angle between edges or planes? Learn more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Text tool] +msgid "Text tool\nDid you know that you can add custom text labels to your models or even use the text as a modifier? Learn more in the documentation." +msgstr "" diff --git a/resources/localization/ca/PrusaSlicer.mo b/resources/localization/ca/PrusaSlicer.mo index 03f66d051bfc64fdc9ae47798263f496aa81becb..d44c3d77f5f58f1b53ea280ddba85119713a8fb8 100644 GIT binary patch delta 102223 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 delta 108923 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

=Cr*adI8{Hn?AzOLvee-wJZ|9=t(>iJSsg$GbQ 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

-x^`79;uDOUE{KGf>DgbJ=ls1f>t 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 diff --git a/resources/localization/ca/PrusaSlicer_ca.po b/resources/localization/ca/PrusaSlicer_ca.po index 92971fdb68e..8fd86e6d156 100644 --- a/resources/localization/ca/PrusaSlicer_ca.po +++ b/resources/localization/ca/PrusaSlicer_ca.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-01 16:30+0100\n" +"POT-Creation-Date: 2023-03-03 14:25+0100\n" "PO-Revision-Date: 2022-08-31 19:19+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -18,16 +18,16 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.1.1\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 +#: src/slic3r/GUI/AboutDialog.cpp:46 src/slic3r/GUI/AboutDialog.cpp:306 msgid "Portions copyright" msgstr "Porcions del copyright" -#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 +#: src/slic3r/GUI/AboutDialog.cpp:143 src/slic3r/GUI/AboutDialog.cpp:270 msgid "Copyright" msgstr "Copyright" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:143 +#: src/slic3r/GUI/AboutDialog.cpp:145 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -35,26 +35,26 @@ msgstr "" "Els acords de llicència de tots els programes (biblioteques) següents formen " "part de l'acord de llicència de l'aplicació" -#: src/slic3r/GUI/AboutDialog.cpp:212 +#: src/slic3r/GUI/AboutDialog.cpp:214 #, c-format, boost-format msgid "About %s" msgstr "Sobre %s" -#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 -#: src/slic3r/GUI/GUI_App.cpp:262 +#: src/slic3r/GUI/AboutDialog.cpp:245 src/slic3r/GUI/AboutDialog.cpp:370 +#: src/slic3r/GUI/GUI_App.cpp:271 msgid "Version" msgstr "Versió" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:277 msgid "is licensed under the" msgstr "està llicenciat sota el/els" -#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:273 src/slic3r/GUI/GUI_App.cpp:277 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero General Public License, versió 3" -#: src/slic3r/GUI/AboutDialog.cpp:273 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -62,7 +62,7 @@ msgstr "" "PrusaSlicer està basat en Slic3r d'Alessandro Ranellucci i la comunitat " "RepRap." -#: src/slic3r/GUI/AboutDialog.cpp:274 +#: src/slic3r/GUI/AboutDialog.cpp:275 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -72,7 +72,7 @@ msgstr "" "Petr Ledvina, Joseph Lenox, I. Sapir, Mike Sheldrake, Vojtech Bubnik i molts " "d'altres." -#: src/slic3r/GUI/AboutDialog.cpp:310 +#: src/slic3r/GUI/AboutDialog.cpp:311 msgid "Copy Version Info" msgstr "Copiar Informació de Versió" @@ -101,54 +101,54 @@ msgstr "" "reportessis el problema." #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:162 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:204 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:188 msgid "Slicing complete" msgstr "Laminat completat" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:199 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183 #, boost-format msgid "Masked SLA file exported to %1%" msgstr "Fitxer SLA emmascarat exportat a %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:286 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:279 msgid "Access violation" msgstr "Violació d'accés" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:288 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:281 msgid "Illegal instruction" msgstr "Instrucció il·legal" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:283 msgid "Divide by zero" msgstr "Divisió per zero" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:292 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:285 msgid "Overflow" msgstr "Debordament( Overflow )" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:294 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:287 msgid "Underflow" msgstr "Debordament inferior( Underflow )" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:297 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 msgid "Floating reserved operand" msgstr "Operand reservat flotant" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:300 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:293 msgid "Stack overflow" msgstr "Desbordament de pila( Stack overflow )" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:659 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:726 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:652 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:719 msgid "Running post-processing scripts" msgstr "Executant scripts de postprocessament" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:690 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:710 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:683 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:703 msgid "Unknown error occured during exporting G-code." msgstr "S'ha produït un error desconegut durant l'exportació del codi G." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:695 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:688 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. Maybe the SD " @@ -159,7 +159,7 @@ msgstr "" "SD està bloquejada contra escriptura?\n" "Missatge d'error: %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:698 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:691 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. There might be " @@ -170,7 +170,7 @@ msgstr "" "problema amb el dispositiu de destinació, intenteu exportar novament o " "utilitzeu un dispositiu diferent. El codi G de sortida malmès és a %1%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:701 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:694 #, boost-format msgid "" "Renaming of the G-code after copying to the selected destination folder has " @@ -179,7 +179,7 @@ msgstr "" "El canvi de nom del codi G després de copiar a la carpeta de destinació " "seleccionada ha fallat. La ruta actual és %1%.tmp. Intenta exportar de nou." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:704 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:697 #, boost-format msgid "" "Copying of the temporary G-code has finished but the original code at %1% " @@ -189,7 +189,7 @@ msgstr "" "s'ha pogut obrir durant la verificació de còpia. El codi G de sortida és a " "%2%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:707 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:700 #, boost-format msgid "" "Copying of the temporary G-code has finished but the exported code couldn't " @@ -199,16 +199,16 @@ msgstr "" "pogut obrir durant la verificació de la còpia. El codi G de sortida és a %1%." "tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:715 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:708 #, boost-format msgid "G-code file exported to %1%" msgstr "Fitxer de codi G exportat a %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:729 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:722 msgid "Copying of the temporary G-code to the output G-code failed" msgstr "Error en copiar el codi G temporal al codi G de sortida" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:751 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:738 #, boost-format msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" @@ -216,8 +216,9 @@ msgstr "" "d'impressió" #: src/slic3r/GUI/BedShapeDialog.cpp:31 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2765 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1576 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:241 src/slic3r/GUI/Plater.cpp:220 +#: src/slic3r/GUI/Tab.cpp:2697 msgid "Size" msgstr "Mida" @@ -225,7 +226,9 @@ msgstr "Mida" msgid "Origin" msgstr "Origen" -#: src/slic3r/GUI/BedShapeDialog.cpp:33 src/libslic3r/PrintConfig.cpp:1020 +#: src/slic3r/GUI/BedShapeDialog.cpp:33 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1994 +#: src/libslic3r/PrintConfig.cpp:1109 msgid "Diameter" msgstr "Diàmetre" @@ -241,54 +244,62 @@ msgstr "" "Distància de la coordenada del codi G de 0,0 de l'aresta frontal esquerra " "del rectangle." -#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:262 -#: src/slic3r/GUI/ConfigWizard.cpp:1476 src/slic3r/GUI/ConfigWizard.cpp:1490 +#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:291 +#: src/slic3r/GUI/ConfigWizard.cpp:1796 src/slic3r/GUI/ConfigWizard.cpp:1832 +#: src/slic3r/GUI/ConfigWizard.cpp:1846 #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:100 -#: src/slic3r/GUI/GCodeViewer.cpp:3181 src/slic3r/GUI/GCodeViewer.cpp:3187 -#: src/slic3r/GUI/GCodeViewer.cpp:3195 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 src/slic3r/GUI/GCodeViewer.cpp:3455 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 #: src/slic3r/GUI/GUI_ObjectLayers.cpp:145 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 src/libslic3r/PrintConfig.cpp:263 -#: src/libslic3r/PrintConfig.cpp:290 src/libslic3r/PrintConfig.cpp:297 -#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:520 -#: src/libslic3r/PrintConfig.cpp:546 src/libslic3r/PrintConfig.cpp:621 -#: src/libslic3r/PrintConfig.cpp:629 src/libslic3r/PrintConfig.cpp:679 -#: src/libslic3r/PrintConfig.cpp:813 src/libslic3r/PrintConfig.cpp:824 -#: src/libslic3r/PrintConfig.cpp:842 src/libslic3r/PrintConfig.cpp:1023 -#: src/libslic3r/PrintConfig.cpp:1235 src/libslic3r/PrintConfig.cpp:1302 -#: src/libslic3r/PrintConfig.cpp:1312 src/libslic3r/PrintConfig.cpp:1611 -#: src/libslic3r/PrintConfig.cpp:1805 src/libslic3r/PrintConfig.cpp:1866 -#: src/libslic3r/PrintConfig.cpp:1884 src/libslic3r/PrintConfig.cpp:1902 -#: src/libslic3r/PrintConfig.cpp:1965 src/libslic3r/PrintConfig.cpp:1975 -#: src/libslic3r/PrintConfig.cpp:2097 src/libslic3r/PrintConfig.cpp:2106 -#: src/libslic3r/PrintConfig.cpp:2125 src/libslic3r/PrintConfig.cpp:2146 -#: src/libslic3r/PrintConfig.cpp:2158 src/libslic3r/PrintConfig.cpp:2166 -#: src/libslic3r/PrintConfig.cpp:2207 src/libslic3r/PrintConfig.cpp:2215 -#: src/libslic3r/PrintConfig.cpp:2225 src/libslic3r/PrintConfig.cpp:2233 -#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2303 -#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2603 -#: src/libslic3r/PrintConfig.cpp:2620 src/libslic3r/PrintConfig.cpp:2721 -#: src/libslic3r/PrintConfig.cpp:2730 src/libslic3r/PrintConfig.cpp:2780 -#: src/libslic3r/PrintConfig.cpp:2932 src/libslic3r/PrintConfig.cpp:3020 -#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3034 -#: src/libslic3r/PrintConfig.cpp:3048 src/libslic3r/PrintConfig.cpp:3072 -#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3092 -#: src/libslic3r/PrintConfig.cpp:3372 src/libslic3r/PrintConfig.cpp:3413 -#: src/libslic3r/PrintConfig.cpp:3573 src/libslic3r/PrintConfig.cpp:3582 -#: src/libslic3r/PrintConfig.cpp:3591 src/libslic3r/PrintConfig.cpp:3601 -#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3676 -#: src/libslic3r/PrintConfig.cpp:3688 src/libslic3r/PrintConfig.cpp:3708 -#: src/libslic3r/PrintConfig.cpp:3718 src/libslic3r/PrintConfig.cpp:3728 -#: src/libslic3r/PrintConfig.cpp:3746 src/libslic3r/PrintConfig.cpp:3761 -#: src/libslic3r/PrintConfig.cpp:3775 src/libslic3r/PrintConfig.cpp:3786 -#: src/libslic3r/PrintConfig.cpp:3799 src/libslic3r/PrintConfig.cpp:3844 -#: src/libslic3r/PrintConfig.cpp:3854 src/libslic3r/PrintConfig.cpp:3863 -#: src/libslic3r/PrintConfig.cpp:3873 src/libslic3r/PrintConfig.cpp:3889 -#: src/libslic3r/PrintConfig.cpp:3913 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 src/libslic3r/PrintConfig.cpp:279 +#: src/libslic3r/PrintConfig.cpp:303 src/libslic3r/PrintConfig.cpp:310 +#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:657 src/libslic3r/PrintConfig.cpp:724 +#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:782 +#: src/libslic3r/PrintConfig.cpp:902 src/libslic3r/PrintConfig.cpp:913 +#: src/libslic3r/PrintConfig.cpp:931 src/libslic3r/PrintConfig.cpp:1112 +#: src/libslic3r/PrintConfig.cpp:1295 src/libslic3r/PrintConfig.cpp:1359 +#: src/libslic3r/PrintConfig.cpp:1369 src/libslic3r/PrintConfig.cpp:1650 +#: src/libslic3r/PrintConfig.cpp:1842 src/libslic3r/PrintConfig.cpp:1903 +#: src/libslic3r/PrintConfig.cpp:1921 src/libslic3r/PrintConfig.cpp:1939 +#: src/libslic3r/PrintConfig.cpp:1995 src/libslic3r/PrintConfig.cpp:2005 +#: src/libslic3r/PrintConfig.cpp:2127 src/libslic3r/PrintConfig.cpp:2136 +#: src/libslic3r/PrintConfig.cpp:2155 src/libslic3r/PrintConfig.cpp:2176 +#: src/libslic3r/PrintConfig.cpp:2188 src/libslic3r/PrintConfig.cpp:2196 +#: src/libslic3r/PrintConfig.cpp:2237 src/libslic3r/PrintConfig.cpp:2245 +#: src/libslic3r/PrintConfig.cpp:2255 src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2271 src/libslic3r/PrintConfig.cpp:2336 +#: src/libslic3r/PrintConfig.cpp:2565 src/libslic3r/PrintConfig.cpp:2632 +#: src/libslic3r/PrintConfig.cpp:2647 src/libslic3r/PrintConfig.cpp:2746 +#: src/libslic3r/PrintConfig.cpp:2755 src/libslic3r/PrintConfig.cpp:2801 +#: src/libslic3r/PrintConfig.cpp:2886 src/libslic3r/PrintConfig.cpp:2896 +#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3108 +#: src/libslic3r/PrintConfig.cpp:3115 src/libslic3r/PrintConfig.cpp:3122 +#: src/libslic3r/PrintConfig.cpp:3136 src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3170 src/libslic3r/PrintConfig.cpp:3180 +#: src/libslic3r/PrintConfig.cpp:3330 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3391 src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3444 src/libslic3r/PrintConfig.cpp:3456 +#: src/libslic3r/PrintConfig.cpp:3476 src/libslic3r/PrintConfig.cpp:3491 +#: src/libslic3r/PrintConfig.cpp:3501 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3681 src/libslic3r/PrintConfig.cpp:3878 +#: src/libslic3r/PrintConfig.cpp:3893 src/libslic3r/PrintConfig.cpp:3907 +#: src/libslic3r/PrintConfig.cpp:3918 src/libslic3r/PrintConfig.cpp:3931 +#: src/libslic3r/PrintConfig.cpp:3976 src/libslic3r/PrintConfig.cpp:3986 +#: src/libslic3r/PrintConfig.cpp:3995 src/libslic3r/PrintConfig.cpp:4005 +#: src/libslic3r/PrintConfig.cpp:4021 src/libslic3r/PrintConfig.cpp:4045 +#: src/libslic3r/PrintConfig.cpp:4072 msgid "mm" msgstr "mm" @@ -308,13 +319,13 @@ msgstr "Rectangular" msgid "Circular" msgstr "Circular" -#: src/slic3r/GUI/BedShapeDialog.cpp:81 src/slic3r/GUI/GUI_Preview.cpp:252 -#: src/libslic3r/ExtrusionEntity.cpp:343 src/libslic3r/ExtrusionEntity.cpp:378 +#: src/slic3r/GUI/BedShapeDialog.cpp:81 msgid "Custom" msgstr "Personalitzat" #: src/slic3r/GUI/BedShapeDialog.cpp:104 src/slic3r/GUI/BedShapeDialog.cpp:179 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1701 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1565 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1798 msgid "Shape" msgstr "Forma" @@ -322,8 +333,8 @@ msgstr "Forma" msgid "Load shape from STL..." msgstr "Carregar forma des de l'STL..." -#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2147 +#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3914 +#: src/slic3r/GUI/MainFrame.cpp:2240 msgid "Settings" msgstr "Configuració" @@ -336,7 +347,7 @@ msgid "Load..." msgstr "Carregar..." #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/Tab.cpp:3973 msgid "Remove" msgstr "Eliminar" @@ -348,79 +359,122 @@ msgstr "No trobat:" msgid "Model" msgstr "Model" -#: src/slic3r/GUI/BedShapeDialog.cpp:508 +#: src/slic3r/GUI/BedShapeDialog.cpp:506 msgid "Choose an STL file to import bed shape from:" msgstr "Escolliu un fitxer STL per importar la forma de la base:" -#: src/slic3r/GUI/BedShapeDialog.cpp:514 src/slic3r/GUI/BedShapeDialog.cpp:562 -#: src/slic3r/GUI/BedShapeDialog.cpp:584 +#: src/slic3r/GUI/BedShapeDialog.cpp:512 src/slic3r/GUI/BedShapeDialog.cpp:560 +#: src/slic3r/GUI/BedShapeDialog.cpp:582 msgid "Invalid file format." msgstr "Format de fitxer invàlid." -#: src/slic3r/GUI/BedShapeDialog.cpp:525 +#: src/slic3r/GUI/BedShapeDialog.cpp:523 msgid "Error! Invalid model" msgstr "Error! Model invàlid" -#: src/slic3r/GUI/BedShapeDialog.cpp:533 +#: src/slic3r/GUI/BedShapeDialog.cpp:531 msgid "The selected file contains no geometry." msgstr "El fitxer seleccionat no conté geometria." -#: src/slic3r/GUI/BedShapeDialog.cpp:537 +#: src/slic3r/GUI/BedShapeDialog.cpp:535 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "" "El fitxer seleccionat conté diverses àrees disjuntes. Això no està suportat." -#: src/slic3r/GUI/BedShapeDialog.cpp:552 +#: src/slic3r/GUI/BedShapeDialog.cpp:550 msgid "Choose a file to import bed texture from (PNG/SVG):" msgstr "" "Escolliu un fitxer per importar la textura de la base d'impressió (PNG/SVG):" -#: src/slic3r/GUI/BedShapeDialog.cpp:574 +#: src/slic3r/GUI/BedShapeDialog.cpp:572 msgid "Choose an STL file to import bed model from:" msgstr "Escolliu un fitxer STL per importar el model de la base d'impressió:" -#: src/slic3r/GUI/BedShapeDialog.hpp:95 src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/BedShapeDialog.hpp:96 src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape" msgstr "Forma de la base d'impressió" -#: src/slic3r/GUI/BonjourDialog.cpp:55 +#: src/slic3r/GUI/BonjourDialog.cpp:58 msgid "Network lookup" msgstr "Cerca a la xarxa" -#: src/slic3r/GUI/BonjourDialog.cpp:72 +#: src/slic3r/GUI/BonjourDialog.cpp:75 src/slic3r/GUI/BonjourDialog.cpp:253 msgid "Address" msgstr "Adreça" -#: src/slic3r/GUI/BonjourDialog.cpp:73 +#: src/slic3r/GUI/BonjourDialog.cpp:76 msgid "Hostname" msgstr "Nom de host" -#: src/slic3r/GUI/BonjourDialog.cpp:74 +#: src/slic3r/GUI/BonjourDialog.cpp:77 msgid "Service name" msgstr "Nom del servei" -#: src/slic3r/GUI/BonjourDialog.cpp:76 +#: src/slic3r/GUI/BonjourDialog.cpp:79 msgid "OctoPrint version" msgstr "Versió d'Octoprint" -#: src/slic3r/GUI/BonjourDialog.cpp:224 +#: src/slic3r/GUI/BonjourDialog.cpp:227 msgid "Searching for devices" msgstr "Cercant dispositius" -#: src/slic3r/GUI/BonjourDialog.cpp:231 +#: src/slic3r/GUI/BonjourDialog.cpp:234 msgid "Finished" msgstr "Acabat" -#: src/slic3r/GUI/ButtonsDescription.cpp:42 +#: src/slic3r/GUI/BonjourDialog.cpp:240 +msgid "Multiple resolved IP addresses" +msgstr "" + +#: src/slic3r/GUI/BonjourDialog.cpp:249 +#, boost-format +msgid "" +"There are several IP addresses resolving to hostname %1%.\n" +"Please select one that should be used." +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:21 +msgid "Palette 1 (default)" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:22 +msgid "Palette 2" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:23 +msgid "Palette 3" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:24 +msgid "Palette 4" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:25 +msgid "Palette 5" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:26 +msgid "Palette 6" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:27 +msgid "Palette 7" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:28 +msgid "Palette 8" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:112 msgid "Revert color to default" msgstr "Revertir el color per defecte" -#: src/slic3r/GUI/ButtonsDescription.cpp:57 +#: src/slic3r/GUI/ButtonsDescription.cpp:127 msgid "Value is the same as the system value" msgstr "El valor és el mateix que el del sistema" -#: src/slic3r/GUI/ButtonsDescription.cpp:58 +#: src/slic3r/GUI/ButtonsDescription.cpp:128 msgid "" "Value was changed and is not equal to the system value or the last saved " "preset" @@ -428,11 +482,35 @@ msgstr "" "El valor ha canviat i ja no és igual al valor del sistema o al darrer valor " "desat" -#: src/slic3r/GUI/ButtonsDescription.cpp:62 +#: src/slic3r/GUI/ButtonsDescription.cpp:155 +msgid "Default palette for mode markers" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2422 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Simple" +msgstr "Simple" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2424 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgctxt "Mode" +msgid "Advanced" +msgstr "Mode Avançat" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2425 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Expert" +msgstr "Expert" + +#: src/slic3r/GUI/ButtonsDescription.cpp:182 +msgid "Revert color" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:200 msgid "Buttons And Text Colors Description" msgstr "Descripció dels botons i dels colors del text" -#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/ConfigManipulation.cpp:50 msgid "" "Layer height is not valid.\n" "\n" @@ -442,13 +520,13 @@ msgstr "" "\n" "L'alçada de capa es restablirà a 0,01." -#: src/slic3r/GUI/ConfigManipulation.cpp:50 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1449 -#: src/libslic3r/PrintConfig.cpp:286 +#: src/slic3r/GUI/ConfigManipulation.cpp:51 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1394 +#: src/libslic3r/PrintConfig.cpp:299 msgid "Layer height" msgstr "Alçada de capa" -#: src/slic3r/GUI/ConfigManipulation.cpp:61 +#: src/slic3r/GUI/ConfigManipulation.cpp:62 msgid "" "First layer height is not valid.\n" "\n" @@ -458,7 +536,7 @@ msgstr "" "\n" "L'alçada de la primera capa es restablirà a 0,01." -#: src/slic3r/GUI/ConfigManipulation.cpp:62 src/libslic3r/PrintConfig.cpp:1231 +#: src/slic3r/GUI/ConfigManipulation.cpp:63 src/libslic3r/PrintConfig.cpp:1291 msgid "First layer height" msgstr "Alçada de la primera capa" @@ -469,7 +547,6 @@ msgid "" "- no top solid layers\n" "- 0% fill density\n" "- no support material\n" -"- Ensure vertical shell thickness enabled\n" "- Detect thin walls disabled" msgstr "" "El mode Vas Espiral necessita:\n" @@ -477,55 +554,53 @@ msgstr "" "-Zero capes de tapa superior\n" "-0% densitat de farciment\n" "-Sense suports\n" -"-Comproveu que el gruix de paret vertical està activat\n" "-Desactiva la detecció de parets fines" -#: src/slic3r/GUI/ConfigManipulation.cpp:90 +#: src/slic3r/GUI/ConfigManipulation.cpp:89 msgid "Shall I adjust those settings in order to enable Spiral Vase?" msgstr "He d'ajustar aquesta configuració per habilitar el mode Gerro Espiral?" -#: src/slic3r/GUI/ConfigManipulation.cpp:91 +#: src/slic3r/GUI/ConfigManipulation.cpp:90 msgid "Spiral Vase" msgstr "Gerro espiral" -#: src/slic3r/GUI/ConfigManipulation.cpp:121 +#: src/slic3r/GUI/ConfigManipulation.cpp:123 msgid "" -"The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool " -"change.\n" -"(both support_material_extruder and support_material_interface_extruder need " -"to be set to 0)." +"For the Wipe Tower to work with the soluble supports, the support layers\n" +"need to be synchronized with the object layers." msgstr "" -"Actualment, la Torre de Neteja només admet els suports no solubles\n" -"si s'imprimeixen amb l'extrusora actual sense provocar un canvi d'eina.\n" -"(tant support_material_extruder com support_material_interface_extruder " -"s'han de posar a 0)." +"Per a que la Torre de Neteja funcioni amb els suports solubles, les capes de " +"suport\n" +"han de sincronizar-se amb les capes d'objectes." -#: src/slic3r/GUI/ConfigManipulation.cpp:125 -msgid "Shall I adjust those settings in order to enable the Wipe Tower?" +#: src/slic3r/GUI/ConfigManipulation.cpp:126 +msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" msgstr "" -"He d'ajustar aquesta configuració per habilitar el mode Torre de Neteja?" +"He de sincronitzar les capes de suport per habilitar la Torre de Neteja?" -#: src/slic3r/GUI/ConfigManipulation.cpp:126 -#: src/slic3r/GUI/ConfigManipulation.cpp:146 +#: src/slic3r/GUI/ConfigManipulation.cpp:127 +#: src/slic3r/GUI/ConfigManipulation.cpp:145 msgid "Wipe Tower" msgstr "Torre de Neteja" -#: src/slic3r/GUI/ConfigManipulation.cpp:142 +#: src/slic3r/GUI/ConfigManipulation.cpp:140 src/libslic3r/Print.cpp:672 msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers\n" -"need to be synchronized with the object layers." +"The Wipe Tower currently supports the non-soluble supports only if they are " +"printed with the current extruder without triggering a tool change. (both " +"support_material_extruder and support_material_interface_extruder need to be " +"set to 0)." msgstr "" -"Per a que la Torre de Neteja funcioni amb els suports solubles, les capes de " -"suport\n" -"han de sincronizar-se amb les capes d'objectes." +"La Torre de Neteja actualment admet els suports no solubles només si estan " +"impresos amb l'extrusor actual sense activar un canvi d'eina. (Tant " +"support_material_extruder com support_material_interface_extruder s'han de " +"configurar a 0)." -#: src/slic3r/GUI/ConfigManipulation.cpp:145 -msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" +#: src/slic3r/GUI/ConfigManipulation.cpp:144 +msgid "Shall I adjust those settings in order to enable the Wipe Tower?" msgstr "" -"He de sincronitzar les capes de suport per habilitar la Torre de Neteja?" +"He d'ajustar aquesta configuració per habilitar el mode Torre de Neteja?" -#: src/slic3r/GUI/ConfigManipulation.cpp:164 +#: src/slic3r/GUI/ConfigManipulation.cpp:166 msgid "" "Supports work better, if the following feature is enabled:\n" "- Detect bridging perimeters" @@ -533,187 +608,191 @@ msgstr "" "Els suports funcionen millor si la característica següent està habilitada:\n" "- Detectar perímetres amb pont" -#: src/slic3r/GUI/ConfigManipulation.cpp:167 +#: src/slic3r/GUI/ConfigManipulation.cpp:169 msgid "Shall I adjust those settings for supports?" msgstr "He d'ajustar aquesta configuració per als suports?" -#: src/slic3r/GUI/ConfigManipulation.cpp:168 +#: src/slic3r/GUI/ConfigManipulation.cpp:170 msgid "Support Generator" msgstr "Generador de Suports" -#: src/slic3r/GUI/ConfigManipulation.cpp:195 +#: src/slic3r/GUI/ConfigManipulation.cpp:194 #, boost-format msgid "The %1% infill pattern is not supposed to work at 100%% density." msgstr "" "Se suposa que el patró de farciment %1% no funciona a una densitat del 100%%." -#: src/slic3r/GUI/ConfigManipulation.cpp:198 +#: src/slic3r/GUI/ConfigManipulation.cpp:196 msgid "Shall I switch to rectilinear fill pattern?" msgstr "He de canviar al patró de farciment rectilini?" -#: src/slic3r/GUI/ConfigManipulation.cpp:199 +#: src/slic3r/GUI/ConfigManipulation.cpp:197 #: src/slic3r/GUI/GUI_Factories.cpp:55 src/slic3r/GUI/GUI_Factories.cpp:128 -#: src/slic3r/GUI/Plater.cpp:460 src/slic3r/GUI/Tab.cpp:1503 -#: src/slic3r/GUI/Tab.cpp:1505 src/libslic3r/PrintConfig.cpp:475 -#: src/libslic3r/PrintConfig.cpp:716 src/libslic3r/PrintConfig.cpp:743 -#: src/libslic3r/PrintConfig.cpp:1098 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1149 src/libslic3r/PrintConfig.cpp:1398 -#: src/libslic3r/PrintConfig.cpp:1427 src/libslic3r/PrintConfig.cpp:1496 -#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1535 -#: src/libslic3r/PrintConfig.cpp:2364 src/libslic3r/PrintConfig.cpp:2381 +#: src/slic3r/GUI/Plater.cpp:468 src/slic3r/GUI/Tab.cpp:1450 +#: src/slic3r/GUI/Tab.cpp:1452 src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:811 src/libslic3r/PrintConfig.cpp:831 +#: src/libslic3r/PrintConfig.cpp:1187 src/libslic3r/PrintConfig.cpp:1200 +#: src/libslic3r/PrintConfig.cpp:1225 src/libslic3r/PrintConfig.cpp:1444 +#: src/libslic3r/PrintConfig.cpp:1473 src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1557 src/libslic3r/PrintConfig.cpp:1576 +#: src/libslic3r/PrintConfig.cpp:2395 src/libslic3r/PrintConfig.cpp:2412 msgid "Infill" msgstr "Farciment" -#: src/slic3r/GUI/ConfigManipulation.cpp:337 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Head penetration should not be greater than the head width." msgstr "" "La penetració del capçal no hauria de ser més gran que l'amplada del capçal." -#: src/slic3r/GUI/ConfigManipulation.cpp:339 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid Head penetration" msgstr "Penetració del capçal invàlida" -#: src/slic3r/GUI/ConfigManipulation.cpp:350 +#: src/slic3r/GUI/ConfigManipulation.cpp:362 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "" "El diàmetre del cap d'agulla ha de ser més petit que el diàmetre del pilar." -#: src/slic3r/GUI/ConfigManipulation.cpp:352 +#: src/slic3r/GUI/ConfigManipulation.cpp:364 msgid "Invalid pinhead diameter" msgstr "Diàmetre del cap d'agulla invàlid" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20 msgid "Upgrade" msgstr "Actualització" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22 msgid "Downgrade" msgstr "Tornar a una versió anterior" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 msgid "Before roll back" msgstr "Abans de tornar enrere" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:340 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:26 src/libslic3r/PrintConfig.cpp:353 msgid "User" msgstr "Usuari" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:329 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:29 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1135 msgid "Unknown" msgstr "Desconegut" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 msgid "Active" msgstr "Actiu" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 msgid "PrusaSlicer version" msgstr "Versió de PrusaSlicer" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 src/libslic3r/Preset.cpp:1341 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 src/libslic3r/Preset.cpp:1480 msgid "print" msgstr "imprimir" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:65 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 msgid "filaments" msgstr "filaments" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 src/libslic3r/Preset.cpp:1343 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:67 src/libslic3r/Preset.cpp:1482 msgid "SLA print" msgstr "Impressió SLA" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69 -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/slic3r/GUI/GUI.cpp:340 -#: src/slic3r/GUI/Plater.cpp:821 src/libslic3r/Preset.cpp:1344 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/slic3r/GUI/GUI.cpp:331 +#: src/slic3r/GUI/Plater.cpp:851 src/libslic3r/Preset.cpp:1483 msgid "SLA material" msgstr "Material SLA" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:71 src/libslic3r/Preset.cpp:1345 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 src/libslic3r/Preset.cpp:1484 msgid "printer" msgstr "impressora" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 src/slic3r/GUI/Tab.cpp:1366 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 src/slic3r/GUI/Tab.cpp:1311 msgid "vendor" msgstr "fabricant" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 msgid "version" msgstr "versió" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:76 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 msgid "min PrusaSlicer version" msgstr "versió de PrusaSlicer mínima" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:77 msgid "max PrusaSlicer version" msgstr "versió de PrusaSlicer màxima" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "model" msgstr "model" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "variants" msgstr "variants" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:93 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:92 #, c-format, boost-format msgid "Incompatible with this %s" msgstr "Incompatible amb aquest %s" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:96 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:95 msgid "Activate" msgstr "Activar" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:123 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:122 msgid "Configuration Snapshots" msgstr "Instantànies de Configuració" -#: src/slic3r/GUI/ConfigWizard.cpp:262 +#: src/slic3r/GUI/ConfigWizard.cpp:291 msgid "nozzle" msgstr "broquet( nozzle )" -#: src/slic3r/GUI/ConfigWizard.cpp:266 +#: src/slic3r/GUI/ConfigWizard.cpp:295 msgid "Alternate nozzles:" msgstr "Alternar nozzles:" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "All standard" msgstr "Tot estàndard" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "Standard" msgstr "Estàndard" -#: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3833 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 +#: src/slic3r/GUI/ConfigWizard.cpp:360 src/slic3r/GUI/ConfigWizard.cpp:681 +#: src/slic3r/GUI/FileArchiveDialog.cpp:261 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 src/slic3r/GUI/Preferences.cpp:550 +#: src/slic3r/GUI/Tab.cpp:4058 src/slic3r/GUI/UnsavedChangesDialog.cpp:1161 msgid "All" msgstr "Tots" -#: src/slic3r/GUI/ConfigWizard.cpp:332 src/slic3r/GUI/ConfigWizard.cpp:652 -#: src/slic3r/GUI/DoubleSlider.cpp:2030 src/slic3r/GUI/Plater.cpp:432 -#: src/slic3r/GUI/Plater.cpp:579 src/slic3r/GUI/Preferences.cpp:436 -#: src/libslic3r/PrintConfig.cpp:1291 +#: src/slic3r/GUI/ConfigWizard.cpp:361 src/slic3r/GUI/ConfigWizard.cpp:682 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 +#: src/slic3r/GUI/FileArchiveDialog.cpp:265 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1984 src/slic3r/GUI/Plater.cpp:439 +#: src/slic3r/GUI/Plater.cpp:594 src/slic3r/GUI/Preferences.cpp:552 +#: src/libslic3r/PrintConfig.cpp:1347 msgid "None" msgstr "Cap" -#: src/slic3r/GUI/ConfigWizard.cpp:484 +#: src/slic3r/GUI/ConfigWizard.cpp:513 #, c-format, boost-format msgid "Welcome to the %s Configuration Assistant" msgstr "Benvingut al %s Assistent de Configuració" -#: src/slic3r/GUI/ConfigWizard.cpp:486 +#: src/slic3r/GUI/ConfigWizard.cpp:515 #, c-format, boost-format msgid "Welcome to the %s Configuration Wizard" msgstr "Benvingut al %s Ajudant de Configuració" -#: src/slic3r/GUI/ConfigWizard.cpp:488 +#: src/slic3r/GUI/ConfigWizard.cpp:517 msgid "Welcome" msgstr "Benvingut" -#: src/slic3r/GUI/ConfigWizard.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:519 #, c-format, boost-format msgid "" "Hello, welcome to %s! This %s helps you with the initial configuration; just " @@ -722,11 +801,11 @@ msgstr "" "Hola, benvingut a %s! Aquest %s us ajudarà amb la configuració inicial; amb " "uns pocs paràmetres de configuració estaràs preparat per imprimir." -#: src/slic3r/GUI/ConfigWizard.cpp:495 +#: src/slic3r/GUI/ConfigWizard.cpp:524 msgid "Remove user profiles (a snapshot will be taken beforehand)" msgstr "Eliminar perfils d'usuari (es prendrà una instantània prèviament)" -#: src/slic3r/GUI/ConfigWizard.cpp:498 +#: src/slic3r/GUI/ConfigWizard.cpp:527 msgid "" "Perform desktop integration (Sets this binary to be searchable by the " "system)." @@ -734,57 +813,68 @@ msgstr "" "Realitza la integració de l'escriptori (Estableix aquest binari perquè pugui " "ser buscat pel sistema)." -#: src/slic3r/GUI/ConfigWizard.cpp:550 +#: src/slic3r/GUI/ConfigWizard.cpp:579 #, c-format, boost-format msgid "%s Family" msgstr "%s Família" -#: src/slic3r/GUI/ConfigWizard.cpp:640 +#: src/slic3r/GUI/ConfigWizard.cpp:670 msgid "Printer:" msgstr "Impressora:" -#: src/slic3r/GUI/ConfigWizard.cpp:642 +#: src/slic3r/GUI/ConfigWizard.cpp:672 msgid "Vendor:" msgstr "Proveïdor:" -#: src/slic3r/GUI/ConfigWizard.cpp:643 +#: src/slic3r/GUI/ConfigWizard.cpp:673 msgid "Profile:" msgstr "Perfil:" -#: src/slic3r/GUI/ConfigWizard.cpp:720 src/slic3r/GUI/ConfigWizard.cpp:892 -#: src/slic3r/GUI/ConfigWizard.cpp:952 src/slic3r/GUI/ConfigWizard.cpp:1088 +#: src/slic3r/GUI/ConfigWizard.cpp:750 src/slic3r/GUI/ConfigWizard.cpp:938 +#: src/slic3r/GUI/ConfigWizard.cpp:1024 src/slic3r/GUI/ConfigWizard.cpp:1163 msgid "(All)" msgstr "(Tot)" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:754 src/slic3r/GUI/ConfigWizard.cpp:1165 +msgid "(Templates)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:789 #, boost-format msgid "" -"%1% marked with * are not compatible with some installed " -"printers." +"%1% visible for (\"Template\") printer are universal profiles " +"available for all printers. These might not be compatible with your printer." msgstr "" -"%1% marcats amb un * no són compatibles amb algunes de les " -"impressores instal·lades." -#: src/slic3r/GUI/ConfigWizard.cpp:752 src/slic3r/GUI/ConfigWizard.cpp:2043 -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filaments" msgstr "Filaments" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 msgid "SLA materials" msgstr "Materials SLA" -#: src/slic3r/GUI/ConfigWizard.cpp:755 +#: src/slic3r/GUI/ConfigWizard.cpp:791 +#, boost-format +msgid "" +"%1% marked with * are not compatible with some installed " +"printers." +msgstr "" +"%1% marcats amb un * no són compatibles amb algunes de les " +"impressores instal·lades." + +#: src/slic3r/GUI/ConfigWizard.cpp:794 #, boost-format msgid "All installed printers are compatible with the selected %1%." msgstr "" "Totes les impressores instal·lades són compatibles amb el %1% seleccionat." -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/libslic3r/Preset.cpp:1342 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/libslic3r/Preset.cpp:1481 msgid "filament" msgstr "filament" -#: src/slic3r/GUI/ConfigWizard.cpp:778 +#: src/slic3r/GUI/ConfigWizard.cpp:818 msgid "" "Only the following installed printers are compatible with the selected " "filaments" @@ -792,7 +882,7 @@ msgstr "" "Només les següents impressores instal·lades són compatibles amb els " "filaments seleccionats" -#: src/slic3r/GUI/ConfigWizard.cpp:779 +#: src/slic3r/GUI/ConfigWizard.cpp:819 msgid "" "Only the following installed printers are compatible with the selected SLA " "materials" @@ -800,35 +890,53 @@ msgstr "" "Només les següents impressores instal·lades són compatibles amb els " "materials SLA seleccionats" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1213 +msgid "" +"You have selected template filament. Please note that these filaments are " +"available for all printers but are NOT certain to be compatible with your " +"printer. Do you still wish to have this filament selected?\n" +"(This message won't be displayed again.)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1214 src/slic3r/GUI/ConfigWizard.cpp:2720 +#: src/slic3r/GUI/ConfigWizard.cpp:2860 src/slic3r/GUI/DoubleSlider.cpp:2591 +#: src/slic3r/GUI/DoubleSlider.cpp:2612 src/slic3r/GUI/GUI.cpp:245 +#: src/slic3r/GUI/GUI_App.cpp:3458 src/slic3r/GUI/UpdateDialogs.cpp:204 +#: src/slic3r/GUI/UpdateDialogs.cpp:212 src/slic3r/GUI/UpdateDialogs.cpp:217 +#: src/slic3r/GUI/UpdateDialogs.cpp:222 src/slic3r/GUI/UpdateDialogs.cpp:229 +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +msgid "Notice" +msgstr "Fixa't" + +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer Setup" msgstr "Configuració Personalitzada d'Impressora" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer" msgstr "Impressora Personalitzada" -#: src/slic3r/GUI/ConfigWizard.cpp:1177 +#: src/slic3r/GUI/ConfigWizard.cpp:1264 msgid "Define a custom printer profile" msgstr "Definir un perfil d'impressora personalitzat" -#: src/slic3r/GUI/ConfigWizard.cpp:1179 +#: src/slic3r/GUI/ConfigWizard.cpp:1265 msgid "Custom profile name:" msgstr "Nom d'impressora personalitzada:" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Automatic updates" msgstr "Actualitzacions automàtiques" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Updates" msgstr "Actualitzacions" -#: src/slic3r/GUI/ConfigWizard.cpp:1214 +#: src/slic3r/GUI/ConfigWizard.cpp:1290 msgid "Check for application updates" msgstr "Comprovar si hi ha actualitzacions de l'aplicació" -#: src/slic3r/GUI/ConfigWizard.cpp:1218 +#: src/slic3r/GUI/ConfigWizard.cpp:1294 #, c-format, boost-format msgid "" "If enabled, %s checks for new application versions online. When a new " @@ -841,11 +949,11 @@ msgstr "" "iniciar l'aplicació (mai durant l'ús del programa). Això és només un " "mecanisme de notificació, sense que es produeixi una instal·lació automàtica." -#: src/slic3r/GUI/ConfigWizard.cpp:1224 src/slic3r/GUI/Preferences.cpp:175 +#: src/slic3r/GUI/ConfigWizard.cpp:1300 src/slic3r/GUI/Preferences.cpp:306 msgid "Update built-in Presets automatically" msgstr "Actualitza els paràmetres de fàbrica automàticament" -#: src/slic3r/GUI/ConfigWizard.cpp:1228 +#: src/slic3r/GUI/ConfigWizard.cpp:1304 #, c-format, boost-format msgid "" "If enabled, %s downloads updates of built-in system presets in the " @@ -858,7 +966,7 @@ msgstr "" "localització temporal. Quan hi hagi un nou ajustament disponible, aquest es " "podrà incorporar per fer-la servir quan l'aplicació es torni a iniciar." -#: src/slic3r/GUI/ConfigWizard.cpp:1231 +#: src/slic3r/GUI/ConfigWizard.cpp:1307 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." @@ -866,7 +974,7 @@ msgstr "" "Les actualitzacions mai no es fan sense el consentiment de l'usuari i mai no " "sobreescriuen ajustaments personalitzats de l'usuari." -#: src/slic3r/GUI/ConfigWizard.cpp:1236 +#: src/slic3r/GUI/ConfigWizard.cpp:1312 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." @@ -874,19 +982,63 @@ msgstr "" "A més, es realitzarà una còpia de tota la configuració abans d'aplicar una " "actualització." -#: src/slic3r/GUI/ConfigWizard.cpp:1243 src/slic3r/GUI/GUI_Factories.cpp:726 -#: src/slic3r/GUI/Plater.cpp:3582 +#: src/slic3r/GUI/ConfigWizard.cpp:1361 src/slic3r/GUI/Preferences.cpp:1076 +msgid "Download path" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1366 src/slic3r/GUI/FirmwareDialog.cpp:815 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:300 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +msgid "Browse" +msgstr "Navega" + +#: src/slic3r/GUI/ConfigWizard.cpp:1371 +msgid "Choose folder:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads from URL" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1417 +msgid "Allow built-in downloader" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1424 +#, c-format, boost-format +msgid "" +"If enabled, %s registers to start on custom URL on www.printables.com. You " +"will be able to use button with %s logo to open models in this %s. The model " +"will be downloaded into folder you choose bellow." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1431 +msgid "" +"On Linux systems the process of registration also creates desktop " +"integration files for this version of application." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1458 +msgid "Chosen directory for downloads does not Exists." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1545 src/slic3r/GUI/GUI_Factories.cpp:810 +#: src/slic3r/GUI/Plater.cpp:3732 msgid "Reload from disk" msgstr "Recarregar des del disc" -#: src/slic3r/GUI/ConfigWizard.cpp:1246 +#: src/slic3r/GUI/ConfigWizard.cpp:1548 msgid "" "Export full pathnames of models and parts sources into 3mf and amf files" msgstr "" "Exportar noms de ruta complets de les fonts dels models i de peces a fitxers " "3mf i amf" -#: src/slic3r/GUI/ConfigWizard.cpp:1250 +#: src/slic3r/GUI/ConfigWizard.cpp:1552 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked.\n" @@ -898,23 +1050,23 @@ msgstr "" "Si no està activat, l'ordre de Recàrrega des del disc us demanarà que " "seleccioneu cada fitxer en un quadre d'obrir fitxer." -#: src/slic3r/GUI/ConfigWizard.cpp:1259 +#: src/slic3r/GUI/ConfigWizard.cpp:1561 msgid "Files association" msgstr "Associació d'arxius" -#: src/slic3r/GUI/ConfigWizard.cpp:1261 src/slic3r/GUI/Preferences.cpp:157 +#: src/slic3r/GUI/ConfigWizard.cpp:1563 src/slic3r/GUI/Preferences.cpp:292 msgid "Associate .3mf files to PrusaSlicer" msgstr "Associar archivos .3mf a PrusaSlicer" -#: src/slic3r/GUI/ConfigWizard.cpp:1262 src/slic3r/GUI/Preferences.cpp:164 +#: src/slic3r/GUI/ConfigWizard.cpp:1564 src/slic3r/GUI/Preferences.cpp:297 msgid "Associate .stl files to PrusaSlicer" msgstr "Associar archivos .stl a PrusaSlicer" -#: src/slic3r/GUI/ConfigWizard.cpp:1272 +#: src/slic3r/GUI/ConfigWizard.cpp:1574 msgid "View mode" msgstr "Mode de vista" -#: src/slic3r/GUI/ConfigWizard.cpp:1274 +#: src/slic3r/GUI/ConfigWizard.cpp:1576 msgid "" "PrusaSlicer's user interfaces comes in three variants:\n" "Simple, Advanced, and Expert.\n" @@ -929,85 +1081,99 @@ msgstr "" "més sofisticats que són adequats per a usuaris avançats i experts, " "respectivament." -#: src/slic3r/GUI/ConfigWizard.cpp:1279 +#: src/slic3r/GUI/ConfigWizard.cpp:1581 msgid "Simple mode" msgstr "Mode Simple" -#: src/slic3r/GUI/ConfigWizard.cpp:1280 +#: src/slic3r/GUI/ConfigWizard.cpp:1582 msgid "Advanced mode" msgstr "Mode Avançat" -#: src/slic3r/GUI/ConfigWizard.cpp:1281 +#: src/slic3r/GUI/ConfigWizard.cpp:1583 msgid "Expert mode" msgstr "Mode Expert" -#: src/slic3r/GUI/ConfigWizard.cpp:1287 +#: src/slic3r/GUI/ConfigWizard.cpp:1596 msgid "The size of the object can be specified in inches" msgstr "La mida de l'objecte es pot especificar en polzades" -#: src/slic3r/GUI/ConfigWizard.cpp:1288 +#: src/slic3r/GUI/ConfigWizard.cpp:1597 msgid "Use inches" msgstr "Usar polzades" -#: src/slic3r/GUI/ConfigWizard.cpp:1322 +#: src/slic3r/GUI/ConfigWizard.cpp:1617 msgid "Other Vendors" msgstr "Altres Fabricants" -#: src/slic3r/GUI/ConfigWizard.cpp:1326 +#: src/slic3r/GUI/ConfigWizard.cpp:1621 #, c-format, boost-format msgid "Pick another vendor supported by %s" msgstr "Trieu un altre fabricant compatible amb %s" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 msgid "Firmware Type" msgstr "Tipus de Microprogramari(Firmware)" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2366 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 src/slic3r/GUI/Tab.cpp:2354 msgid "Firmware" msgstr "Microprogramari(Firmware)" -#: src/slic3r/GUI/ConfigWizard.cpp:1361 +#: src/slic3r/GUI/ConfigWizard.cpp:1658 msgid "Choose the type of firmware used by your printer." msgstr "" "Seleccioneu el tipus de microprogramari(firmware) que utilitza la vostra " "impressora." -#: src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/ConfigWizard.cpp:1707 src/slic3r/GUI/ConfigWizard.cpp:1778 +#: src/slic3r/GUI/ConfigWizard.cpp:1783 src/slic3r/GUI/ConfigWizard.cpp:1788 +#: src/slic3r/GUI/Field.cpp:258 src/slic3r/GUI/Field.cpp:328 +#: src/slic3r/GUI/Field.cpp:1585 src/slic3r/GUI/GUI_ObjectLayers.cpp:435 +msgid "Invalid numeric input." +msgstr "Entrada numèrica no vàlida." + +#: src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape and Size" msgstr "Mida i forma de la base" -#: src/slic3r/GUI/ConfigWizard.cpp:1399 +#: src/slic3r/GUI/ConfigWizard.cpp:1735 msgid "Set the shape of your printer's bed." msgstr "Defineix la forma de la base d'impressió de la vostra impressora." -#: src/slic3r/GUI/ConfigWizard.cpp:1433 src/slic3r/GUI/Field.cpp:255 -#: src/slic3r/GUI/Field.cpp:324 src/slic3r/GUI/Field.cpp:1561 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:435 -msgid "Invalid numeric input." -msgstr "Entrada numèrica no vàlida." +#: src/slic3r/GUI/ConfigWizard.cpp:1755 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1610 +msgid "Build Volume" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1758 +msgid "Set vertical size of your printer." +msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1795 +msgid "Max print height:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Filament and Nozzle Diameters" msgstr "Diàmetres de filament i broquet(nozzle)" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Print Diameters" msgstr "Diàmetres d'impressió" -#: src/slic3r/GUI/ConfigWizard.cpp:1472 +#: src/slic3r/GUI/ConfigWizard.cpp:1828 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "" "Introdueix el diàmetre del broquet(nozzle) del fusor de la teva impressora." -#: src/slic3r/GUI/ConfigWizard.cpp:1475 +#: src/slic3r/GUI/ConfigWizard.cpp:1831 msgid "Nozzle Diameter:" msgstr "Diàmetre del broquet(nozzle):" -#: src/slic3r/GUI/ConfigWizard.cpp:1485 +#: src/slic3r/GUI/ConfigWizard.cpp:1841 msgid "Enter the diameter of your filament." msgstr "Introdueix el diàmetre del filament." -#: src/slic3r/GUI/ConfigWizard.cpp:1486 +#: src/slic3r/GUI/ConfigWizard.cpp:1842 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." @@ -1015,39 +1181,40 @@ msgstr "" "Es necessita bona precisió, així que utilitza un calibre i realitza diverses " "mesures al llarg del filament i després calcula la mitjana." -#: src/slic3r/GUI/ConfigWizard.cpp:1489 +#: src/slic3r/GUI/ConfigWizard.cpp:1845 msgid "Filament Diameter:" msgstr "Diàmetre de Filament:" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Nozzle and Bed Temperatures" msgstr "Temperatures del broquet(nozzle) i la base" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Temperatures" msgstr "Temperatures" -#: src/slic3r/GUI/ConfigWizard.cpp:1563 +#: src/slic3r/GUI/ConfigWizard.cpp:1919 msgid "Enter the temperature needed for extruding your filament." msgstr "Introdueix la temperatura necessària per extruir el filament." -#: src/slic3r/GUI/ConfigWizard.cpp:1564 +#: src/slic3r/GUI/ConfigWizard.cpp:1920 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "" "Una bona aproximació és de 160 a 230 °C per a PLA i de 215 a 250 °C per a " "ABS." -#: src/slic3r/GUI/ConfigWizard.cpp:1567 +#: src/slic3r/GUI/ConfigWizard.cpp:1923 msgid "Extrusion Temperature:" msgstr "Temperatura d'extrusió:" -#: src/slic3r/GUI/ConfigWizard.cpp:1568 src/slic3r/GUI/ConfigWizard.cpp:1582 -#: src/libslic3r/PrintConfig.cpp:418 src/libslic3r/PrintConfig.cpp:1211 -#: src/libslic3r/PrintConfig.cpp:1266 src/libslic3r/PrintConfig.cpp:2842 +#: src/slic3r/GUI/ConfigWizard.cpp:1924 src/slic3r/GUI/ConfigWizard.cpp:1938 +#: src/libslic3r/PrintConfig.cpp:437 src/libslic3r/PrintConfig.cpp:1271 +#: src/libslic3r/PrintConfig.cpp:1326 src/libslic3r/PrintConfig.cpp:2930 +#: src/libslic3r/PrintConfig.cpp:3689 msgid "°C" msgstr "°C" -#: src/slic3r/GUI/ConfigWizard.cpp:1577 +#: src/slic3r/GUI/ConfigWizard.cpp:1933 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." @@ -1055,7 +1222,7 @@ msgstr "" "Introdueix la temperatura de la base necessària perquè s'adhereixi el " "filament a la base calefactable." -#: src/slic3r/GUI/ConfigWizard.cpp:1578 +#: src/slic3r/GUI/ConfigWizard.cpp:1934 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." @@ -1063,23 +1230,23 @@ msgstr "" "Una bona aproximació són uns 60°C per a PLA i 110°C per a ABS. Deixa el " "valor a zero si no tens base calefactable." -#: src/slic3r/GUI/ConfigWizard.cpp:1581 +#: src/slic3r/GUI/ConfigWizard.cpp:1937 msgid "Bed Temperature:" msgstr "Temperatura de la Base:" -#: src/slic3r/GUI/ConfigWizard.cpp:2043 src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Materials" msgstr "Materials SLA" -#: src/slic3r/GUI/ConfigWizard.cpp:2097 +#: src/slic3r/GUI/ConfigWizard.cpp:2464 msgid "FFF Technology Printers" msgstr "Impressores de Tecnologia FFF" -#: src/slic3r/GUI/ConfigWizard.cpp:2102 +#: src/slic3r/GUI/ConfigWizard.cpp:2469 msgid "SLA Technology Printers" msgstr "Impressores de Tecnologia SLA" -#: src/slic3r/GUI/ConfigWizard.cpp:2338 +#: src/slic3r/GUI/ConfigWizard.cpp:2718 #, boost-format msgid "" "Following printer profiles has no default filament: %1%Please select one " @@ -1088,7 +1255,7 @@ msgstr "" "Els perfils d'impressora següents no tenen filament per defecte: %1%Si us " "plau, seleccioneu-ne un manualment." -#: src/slic3r/GUI/ConfigWizard.cpp:2339 +#: src/slic3r/GUI/ConfigWizard.cpp:2719 #, boost-format msgid "" "Following printer profiles has no default material: %1%Please select one " @@ -1097,41 +1264,35 @@ msgstr "" "Els perfils d'impressora següents no tenen material per defecte: %1%Si us " "plau, seleccioneu-ne un manualment." -#: src/slic3r/GUI/ConfigWizard.cpp:2340 src/slic3r/GUI/ConfigWizard.cpp:2438 -#: src/slic3r/GUI/DoubleSlider.cpp:2522 src/slic3r/GUI/DoubleSlider.cpp:2543 -#: src/slic3r/GUI/GUI.cpp:232 -msgid "Notice" -msgstr "Fixa't" - -#: src/slic3r/GUI/ConfigWizard.cpp:2459 +#: src/slic3r/GUI/ConfigWizard.cpp:2883 msgid "The following FFF printer models have no filament selected:" msgstr "Els models d'impressores FFF següents no tenen filament seleccionat:" -#: src/slic3r/GUI/ConfigWizard.cpp:2463 +#: src/slic3r/GUI/ConfigWizard.cpp:2887 msgid "Do you want to select default filaments for these FFF printer models?" msgstr "" "Voleu seleccionar filaments per defecte per a aquests models d'impressores " "FFF?" -#: src/slic3r/GUI/ConfigWizard.cpp:2477 +#: src/slic3r/GUI/ConfigWizard.cpp:2901 msgid "The following SLA printer models have no materials selected:" msgstr "Els models d'impressores SLA següents no tenen filament seleccionat:" -#: src/slic3r/GUI/ConfigWizard.cpp:2481 +#: src/slic3r/GUI/ConfigWizard.cpp:2905 msgid "Do you want to select default SLA materials for these printer models?" msgstr "" "Voleu seleccionar materials SLA per defecte per a aquests models " "d'impressora?" -#: src/slic3r/GUI/ConfigWizard.cpp:2523 +#: src/slic3r/GUI/ConfigWizard.cpp:2947 msgid "Configuration is edited in ConfigWizard" msgstr "La configuració s'edita a ConfigWizard" -#: src/slic3r/GUI/ConfigWizard.cpp:2566 +#: src/slic3r/GUI/ConfigWizard.cpp:3000 msgid "All user presets will be deleted." msgstr "S'esborraran tots els paràmetres de l'usuari." -#: src/slic3r/GUI/ConfigWizard.cpp:2596 +#: src/slic3r/GUI/ConfigWizard.cpp:3037 msgid "A new vendor was installed and one of its printers will be activated" msgid_plural "" "New vendors were installed and one of theirs printers will be activated" @@ -1140,98 +1301,103 @@ msgstr[0] "" msgstr[1] "" "Nous fabricants s'han instal·lat i s'activarà una de les impressores" -#: src/slic3r/GUI/ConfigWizard.cpp:2625 +#: src/slic3r/GUI/ConfigWizard.cpp:3069 msgid "Do you want to continue changing the configuration?" msgstr "Voleu continuar modificant la configuració?" -#: src/slic3r/GUI/ConfigWizard.cpp:2691 +#: src/slic3r/GUI/ConfigWizard.cpp:3136 msgid "A new Printer was installed and it will be activated." msgstr "Una nova Impressora s'ha instal·lat i s'activarà." -#: src/slic3r/GUI/ConfigWizard.cpp:2696 +#: src/slic3r/GUI/ConfigWizard.cpp:3141 msgid "Some Printers were uninstalled." msgstr "S'han desintal·lat algunes impressores." -#: src/slic3r/GUI/ConfigWizard.cpp:2717 +#: src/slic3r/GUI/ConfigWizard.cpp:3162 msgid "A new filament was installed and it will be activated." msgstr "Un nou filament s'ha instal·lat i serà activat." -#: src/slic3r/GUI/ConfigWizard.cpp:2718 +#: src/slic3r/GUI/ConfigWizard.cpp:3163 msgid "A new SLA material was installed and it will be activated." msgstr "Un nou material SLA s'ha instal·lat i serà activat." -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some filaments were uninstalled." msgstr "S'han desintal·lat alguns filaments." -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some SLA materials were uninstalled." msgstr "S'han desintal·lat alguns materials SLA." -#: src/slic3r/GUI/ConfigWizard.cpp:2773 +#: src/slic3r/GUI/ConfigWizard.cpp:3218 msgid "Custom printer was installed and it will be activated." msgstr "Una nova impressora personalitzada s'ha instal·lat i s'activarà." -#: src/slic3r/GUI/ConfigWizard.cpp:2858 +#: src/slic3r/GUI/ConfigWizard.cpp:3306 msgid "Select all standard printers" msgstr "Selecciona totes les impressores estàndard" -#: src/slic3r/GUI/ConfigWizard.cpp:2861 +#: src/slic3r/GUI/ConfigWizard.cpp:3309 msgid "< &Back" msgstr "< &Anterior" -#: src/slic3r/GUI/ConfigWizard.cpp:2862 +#: src/slic3r/GUI/ConfigWizard.cpp:3310 msgid "&Next >" msgstr "&Següent >" -#: src/slic3r/GUI/ConfigWizard.cpp:2863 +#: src/slic3r/GUI/ConfigWizard.cpp:3311 msgid "&Finish" msgstr "&Acabar" -#: src/slic3r/GUI/ConfigWizard.cpp:2864 -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:3312 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:657 +#: src/slic3r/GUI/FileArchiveDialog.cpp:274 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 #: src/slic3r/GUI/FirmwareDialog.cpp:153 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1593 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1365 #: src/slic3r/GUI/ProgressStatusBar.cpp:26 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:93 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:879 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:96 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:907 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1606 msgid "Cancel" msgstr "Cancel·lar" -#: src/slic3r/GUI/ConfigWizard.cpp:2884 +#: src/slic3r/GUI/ConfigWizard.cpp:3332 msgid "Prusa FFF Technology Printers" msgstr "Impressores Prusa de tecnologia FFF" -#: src/slic3r/GUI/ConfigWizard.cpp:2892 +#: src/slic3r/GUI/ConfigWizard.cpp:3340 msgid "Prusa MSLA Technology Printers" msgstr "Impressores Prussa de tecnologia MSLA" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filament Profiles Selection" msgstr "Selecció Perfils de Filament" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 src/slic3r/GUI/ConfigWizard.cpp:2915 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 src/slic3r/GUI/ConfigWizard.cpp:3363 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Type:" msgstr "Tipus:" -#: src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Material Profiles Selection" msgstr "Selecció Perfils de Material SLA" -#: src/slic3r/GUI/ConfigWizard.cpp:3036 +#: src/slic3r/GUI/ConfigWizard.cpp:3486 msgid "Configuration Assistant" msgstr "Assistent de Configuració" -#: src/slic3r/GUI/ConfigWizard.cpp:3037 +#: src/slic3r/GUI/ConfigWizard.cpp:3487 msgid "Configuration &Assistant" msgstr "&Assistent de configuració" -#: src/slic3r/GUI/ConfigWizard.cpp:3039 +#: src/slic3r/GUI/ConfigWizard.cpp:3489 msgid "Configuration Wizard" msgstr "Ajudant de configuració" -#: src/slic3r/GUI/ConfigWizard.cpp:3040 +#: src/slic3r/GUI/ConfigWizard.cpp:3490 msgid "Configuration &Wizard" msgstr "&Ajudant de configuració" @@ -1248,7 +1414,7 @@ msgid "Performing desktop integration failed - Could not find executable." msgstr "" "Ha fallat la integració de l'escriptori - No s'ha pogut trobar l'executable." -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:378 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:383 msgid "" "Performing desktop integration failed because the application directory was " "not found." @@ -1256,7 +1422,7 @@ msgstr "" "La integració de l'escriptori ha fallat perquè el directori de l'aplicació " "no s'ha trobat." -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:419 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:423 msgid "" "Performing desktop integration failed - could not create Gcodeviewer desktop " "file. PrusaSlicer desktop file was probably created successfully." @@ -1264,12 +1430,29 @@ msgstr "" "No s'ha pogut crear el fitxer d'escriptori de Gcodeviewer. El fitxer " "d'escriptori de PrusaSlicer probablement s'ha pogut crear amb èxit." -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:459 -#: src/slic3r/GUI/GUI_App.cpp:2245 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:472 +msgid "" +"Performing downloader desktop integration failed - boost::filesystem::" +"canonical did not return appimage path." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:484 +msgid "" +"Performing downloader desktop integration failed - Could not find executable." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:602 +msgid "" +"Performing downloader desktop integration failed because the application " +"directory was not found." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:626 +#: src/slic3r/GUI/GUI_App.cpp:2407 msgid "Desktop Integration" msgstr "Integració a l'escriptori" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:466 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:633 msgid "" "Desktop Integration sets this binary to be searchable by the system.\n" "\n" @@ -1280,13 +1463,13 @@ msgstr "" "\n" "Feu clic a \"Realitzar\" per continuar." -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:480 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:647 msgid "Perform" msgstr "Realitzar" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1342 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:653 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/KBShortcutsDialog.cpp:106 +#: src/slic3r/GUI/MainFrame.cpp:1426 msgid "Undo" msgstr "Desfer" @@ -1294,19 +1477,19 @@ msgstr "Desfer" msgid "Place bearings in slots and resume printing" msgstr "Col·loca els rodaments a les ranures i segueix imprimint" -#: src/slic3r/GUI/DoubleSlider.cpp:1379 +#: src/slic3r/GUI/DoubleSlider.cpp:1448 msgid "One layer mode" msgstr "Mode de capa única" -#: src/slic3r/GUI/DoubleSlider.cpp:1381 +#: src/slic3r/GUI/DoubleSlider.cpp:1450 msgid "Discard all custom changes" msgstr "Descartar tots els canvis personalitzats" -#: src/slic3r/GUI/DoubleSlider.cpp:1385 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:1454 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to move" msgstr "Saltar al moviment" -#: src/slic3r/GUI/DoubleSlider.cpp:1388 +#: src/slic3r/GUI/DoubleSlider.cpp:1457 #, c-format, boost-format msgid "" "Jump to height %s\n" @@ -1317,7 +1500,7 @@ msgstr "" "Fixa el mode regla\n" "o Fixa la seqüència de l'extrusor per a tota la impressió" -#: src/slic3r/GUI/DoubleSlider.cpp:1391 +#: src/slic3r/GUI/DoubleSlider.cpp:1460 #, c-format, boost-format msgid "" "Jump to height %s\n" @@ -1326,15 +1509,15 @@ msgstr "" "Salta a l'alçada %s\n" "o Fixa el mode regla" -#: src/slic3r/GUI/DoubleSlider.cpp:1396 +#: src/slic3r/GUI/DoubleSlider.cpp:1465 msgid "Edit current color - Right click the colored slider segment" msgstr "Edita color actual - Clic dret al segment de color lliscant" -#: src/slic3r/GUI/DoubleSlider.cpp:1398 +#: src/slic3r/GUI/DoubleSlider.cpp:1467 msgid "This is wipe tower layer" msgstr "Aquesta és la capa de la torre de neteja" -#: src/slic3r/GUI/DoubleSlider.cpp:1408 +#: src/slic3r/GUI/DoubleSlider.cpp:1477 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing sequentually." @@ -1343,15 +1526,15 @@ msgstr "" "És impossible aplicar qualsevol codi G personalitzat per als objectes que " "s'imprimeixen seqüencialment." -#: src/slic3r/GUI/DoubleSlider.cpp:1412 +#: src/slic3r/GUI/DoubleSlider.cpp:1481 msgid "Print mode" msgstr "Mode d'impressió" -#: src/slic3r/GUI/DoubleSlider.cpp:1426 +#: src/slic3r/GUI/DoubleSlider.cpp:1495 msgid "Add extruder change - Left click" msgstr "Afegir canvi d'extrusor - Clic esquerre" -#: src/slic3r/GUI/DoubleSlider.cpp:1428 +#: src/slic3r/GUI/DoubleSlider.cpp:1497 msgid "" "Add color change - Left click for predefined color or Shift + Left click for " "custom color selection" @@ -1359,23 +1542,23 @@ msgstr "" "Afegir canvi de color - Clic esquerre per a color predefinit o Mayus + Clic " "esquerre per a selecció de color personalitzada" -#: src/slic3r/GUI/DoubleSlider.cpp:1430 +#: src/slic3r/GUI/DoubleSlider.cpp:1499 msgid "Add color change - Left click" msgstr "Afegir canvi de color - Clic esquerre" -#: src/slic3r/GUI/DoubleSlider.cpp:1431 +#: src/slic3r/GUI/DoubleSlider.cpp:1500 msgid "or press \"+\" key" msgstr "o premeu la tecla \"+\"" -#: src/slic3r/GUI/DoubleSlider.cpp:1433 +#: src/slic3r/GUI/DoubleSlider.cpp:1502 msgid "Add another code - Ctrl + Left click" msgstr "Afegir un altre codi - Ctrl + Clic esquerre" -#: src/slic3r/GUI/DoubleSlider.cpp:1434 +#: src/slic3r/GUI/DoubleSlider.cpp:1503 msgid "Add another code - Right click" msgstr "Afegir un altre codi - Clic dret" -#: src/slic3r/GUI/DoubleSlider.cpp:1440 +#: src/slic3r/GUI/DoubleSlider.cpp:1509 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing " @@ -1387,40 +1570,40 @@ msgstr "" "seqüencialment.\n" "Aquest codi no es processarà durant la generació del G-code." -#: src/slic3r/GUI/DoubleSlider.cpp:1458 +#: src/slic3r/GUI/DoubleSlider.cpp:1527 msgid "continue" msgstr "continuar" -#: src/slic3r/GUI/DoubleSlider.cpp:1466 +#: src/slic3r/GUI/DoubleSlider.cpp:1535 #, boost-format msgid "Color change (\"%1%\")" msgstr "Canvi de color (\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1467 +#: src/slic3r/GUI/DoubleSlider.cpp:1536 #, boost-format msgid "Color change (\"%1%\") for Extruder %2%" msgstr "Canvi de color (\"%1%\") per a l'extrusor %2%" -#: src/slic3r/GUI/DoubleSlider.cpp:1469 +#: src/slic3r/GUI/DoubleSlider.cpp:1538 #, boost-format msgid "Pause print (\"%1%\")" msgstr "Pausar impressió (\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1471 +#: src/slic3r/GUI/DoubleSlider.cpp:1540 #, boost-format msgid "Custom template (\"%1%\")" msgstr "Plantilla personalitzada (\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1473 +#: src/slic3r/GUI/DoubleSlider.cpp:1542 #, boost-format msgid "Extruder (tool) is changed to Extruder \"%1%\"" msgstr "L'extrusor (eina) es canvia a l'extrusor \"%1%\"" -#: src/slic3r/GUI/DoubleSlider.cpp:1480 +#: src/slic3r/GUI/DoubleSlider.cpp:1549 msgid "Note" msgstr "Nota" -#: src/slic3r/GUI/DoubleSlider.cpp:1482 +#: src/slic3r/GUI/DoubleSlider.cpp:1551 msgid "" "G-code associated to this tick mark is in a conflict with print mode.\n" "Editing it will cause changes of Slider data." @@ -1429,7 +1612,7 @@ msgstr "" "mode d'impressió.\n" "La seva edició provocarà canvis a les dades de l'Slider." -#: src/slic3r/GUI/DoubleSlider.cpp:1485 +#: src/slic3r/GUI/DoubleSlider.cpp:1554 msgid "" "There is a color change for extruder that won't be used till the end of " "print job.\n" @@ -1439,7 +1622,7 @@ msgstr "" "del treball d'impressió. Aquest codi no serà processat durant la generació " "del G-code." -#: src/slic3r/GUI/DoubleSlider.cpp:1488 +#: src/slic3r/GUI/DoubleSlider.cpp:1557 msgid "" "There is an extruder change set to the same extruder.\n" "This code won't be processed during G-code generation." @@ -1447,7 +1630,7 @@ msgstr "" "Hi ha un canvi d'extrusor establert al mateix extrusor.\n" "Aquest codi no es processarà durant la generació del codi G." -#: src/slic3r/GUI/DoubleSlider.cpp:1491 +#: src/slic3r/GUI/DoubleSlider.cpp:1560 msgid "" "There is a color change for extruder that has not been used before.\n" "Check your settings to avoid redundant color changes." @@ -1455,149 +1638,149 @@ msgstr "" "Hi ha un canvi de color per a l'extrusor que no s'ha fet servir abans.\n" "Comproveu els paràmetres per evitar canvis de color innecessaris." -#: src/slic3r/GUI/DoubleSlider.cpp:1496 +#: src/slic3r/GUI/DoubleSlider.cpp:1565 msgid "Delete tick mark - Left click or press \"-\" key" msgstr "Eliminar marca de verificació - Clic esquerre o prem tecla \"-\"" -#: src/slic3r/GUI/DoubleSlider.cpp:1498 +#: src/slic3r/GUI/DoubleSlider.cpp:1567 msgid "Edit tick mark - Ctrl + Left click" msgstr "Edita la marca - Ctrl+ Clic esquerre" -#: src/slic3r/GUI/DoubleSlider.cpp:1499 +#: src/slic3r/GUI/DoubleSlider.cpp:1568 msgid "Edit tick mark - Right click" msgstr "Editar marca de verificació - Clic dret" -#: src/slic3r/GUI/DoubleSlider.cpp:1602 src/slic3r/GUI/DoubleSlider.cpp:1633 -#: src/slic3r/GUI/GUI_Factories.cpp:778 +#: src/slic3r/GUI/DoubleSlider.cpp:1671 src/slic3r/GUI/DoubleSlider.cpp:1702 +#: src/slic3r/GUI/GUI_Factories.cpp:862 #, c-format, boost-format msgid "Extruder %d" msgstr "Extrusor %d" -#: src/slic3r/GUI/DoubleSlider.cpp:1603 src/slic3r/GUI/GUI_Factories.cpp:779 +#: src/slic3r/GUI/DoubleSlider.cpp:1672 src/slic3r/GUI/GUI_Factories.cpp:863 msgid "active" msgstr "actiu" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 msgid "Switch code to Change extruder" msgstr "Canviar codi per canviar extrusor" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Change extruder" msgstr "Canviar extrusor" -#: src/slic3r/GUI/DoubleSlider.cpp:1613 +#: src/slic3r/GUI/DoubleSlider.cpp:1682 msgid "Change extruder (N/A)" msgstr "Canviar extrusor (N/A)" -#: src/slic3r/GUI/DoubleSlider.cpp:1615 src/slic3r/GUI/GUI_Factories.cpp:787 +#: src/slic3r/GUI/DoubleSlider.cpp:1684 src/slic3r/GUI/GUI_Factories.cpp:871 msgid "Use another extruder" msgstr "Usa un altre extrusor" -#: src/slic3r/GUI/DoubleSlider.cpp:1634 +#: src/slic3r/GUI/DoubleSlider.cpp:1703 msgid "used" msgstr "usat" -#: src/slic3r/GUI/DoubleSlider.cpp:1642 +#: src/slic3r/GUI/DoubleSlider.cpp:1711 #, boost-format msgid "Switch code to Color change (%1%) for:" msgstr "Codi per canviar de color (%1%) per a:" -#: src/slic3r/GUI/DoubleSlider.cpp:1643 +#: src/slic3r/GUI/DoubleSlider.cpp:1712 #, boost-format msgid "Add color change (%1%) for:" msgstr "Afegir canvi de color (%1%) per a:" -#: src/slic3r/GUI/DoubleSlider.cpp:1968 +#: src/slic3r/GUI/DoubleSlider.cpp:2037 msgid "Add color change" msgstr "Afegir canvi de color" -#: src/slic3r/GUI/DoubleSlider.cpp:1979 +#: src/slic3r/GUI/DoubleSlider.cpp:2048 msgid "Add pause print" msgstr "Afegir pausa d'impressió" -#: src/slic3r/GUI/DoubleSlider.cpp:1983 +#: src/slic3r/GUI/DoubleSlider.cpp:2052 msgid "Add custom template" msgstr "Afegir plantilla personalitzada" -#: src/slic3r/GUI/DoubleSlider.cpp:1986 +#: src/slic3r/GUI/DoubleSlider.cpp:2055 msgid "Add custom G-code" msgstr "Afegir codi G personalitzat" -#: src/slic3r/GUI/DoubleSlider.cpp:2004 +#: src/slic3r/GUI/DoubleSlider.cpp:2073 msgid "Edit color" msgstr "Editar color" -#: src/slic3r/GUI/DoubleSlider.cpp:2005 +#: src/slic3r/GUI/DoubleSlider.cpp:2074 msgid "Edit pause print message" msgstr "Editar missatge de pausa d'impressió" -#: src/slic3r/GUI/DoubleSlider.cpp:2006 +#: src/slic3r/GUI/DoubleSlider.cpp:2075 msgid "Edit custom G-code" msgstr "Editar codi G personalitzat" -#: src/slic3r/GUI/DoubleSlider.cpp:2012 +#: src/slic3r/GUI/DoubleSlider.cpp:2081 msgid "Delete color change" msgstr "Eliminar canvi de color" -#: src/slic3r/GUI/DoubleSlider.cpp:2013 +#: src/slic3r/GUI/DoubleSlider.cpp:2082 msgid "Delete tool change" msgstr "Eliminar canvi d'eina" -#: src/slic3r/GUI/DoubleSlider.cpp:2014 +#: src/slic3r/GUI/DoubleSlider.cpp:2083 msgid "Delete pause print" msgstr "Eliminar pausa d'impressió" -#: src/slic3r/GUI/DoubleSlider.cpp:2015 +#: src/slic3r/GUI/DoubleSlider.cpp:2084 msgid "Delete custom G-code" msgstr "Eliminar codi G personalitzat" -#: src/slic3r/GUI/DoubleSlider.cpp:2025 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:2094 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to height" msgstr "Salta a l'alçada" -#: src/slic3r/GUI/DoubleSlider.cpp:2030 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 msgid "Hide ruler" msgstr "Amagar regla" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height" msgstr "Mostra alçada de l'objecte" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height on the ruler" msgstr "Mostra alçada de l'objecte a la regla" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time" msgstr "Mostra temps d'impressió estimat" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time on the ruler" msgstr "Mostra temps d'impressió estimat a la regla" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Ruler mode" msgstr "Mode regla" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Set ruler mode" msgstr "Establir mode de regla" -#: src/slic3r/GUI/DoubleSlider.cpp:2047 +#: src/slic3r/GUI/DoubleSlider.cpp:2116 msgid "Set extruder sequence for the entire print" msgstr "Fixa la seqüència de l'extrusor per a tota la impressió" -#: src/slic3r/GUI/DoubleSlider.cpp:2051 +#: src/slic3r/GUI/DoubleSlider.cpp:2120 msgid "Set auto color changes" msgstr "Establir canvis de color automàtics" -#: src/slic3r/GUI/DoubleSlider.cpp:2086 +#: src/slic3r/GUI/DoubleSlider.cpp:2155 msgid "This action will cause deletion of all ticks on vertical slider." msgstr "" "Aquesta acció farà que s'esborrin totes les marques del botó lliscant " "vertical." -#: src/slic3r/GUI/DoubleSlider.cpp:2087 src/slic3r/GUI/Tab.cpp:1318 +#: src/slic3r/GUI/DoubleSlider.cpp:2156 src/slic3r/GUI/Tab.cpp:1263 msgid "" "This action is not revertible.\n" "Do you want to proceed?" @@ -1605,63 +1788,65 @@ msgstr "" "Aquesta acció no és reversible.\n" "Vols continuar?" -#: src/slic3r/GUI/DoubleSlider.cpp:2088 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1133 src/slic3r/GUI/GUI.cpp:245 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:649 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:679 -#: src/slic3r/GUI/WipeTowerDialog.cpp:58 src/slic3r/GUI/WipeTowerDialog.cpp:443 +#: src/slic3r/GUI/DoubleSlider.cpp:2157 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:537 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1119 src/slic3r/GUI/GUI.cpp:258 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:721 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:751 +#: src/slic3r/GUI/WipeTowerDialog.cpp:60 src/slic3r/GUI/WipeTowerDialog.cpp:445 msgid "Warning" msgstr "Advertència" -#: src/slic3r/GUI/DoubleSlider.cpp:2216 +#: src/slic3r/GUI/DoubleSlider.cpp:2285 msgid "Enter custom G-code used on current layer" msgstr "Introdueix el codi G personalitzat utilitzat a la capa actual" -#: src/slic3r/GUI/DoubleSlider.cpp:2217 +#: src/slic3r/GUI/DoubleSlider.cpp:2286 #, boost-format msgid "Custom G-code on current layer (%1% mm)." msgstr "Codi G personalitzat a la capa actual (%1% mm)." -#: src/slic3r/GUI/DoubleSlider.cpp:2238 +#: src/slic3r/GUI/DoubleSlider.cpp:2307 msgid "Enter short message shown on Printer display when a print is paused" msgstr "" "Introdueix un missatge curt per mostrar a la pantalla de la impressora quan " "la impressió es posi en pausa" -#: src/slic3r/GUI/DoubleSlider.cpp:2239 +#: src/slic3r/GUI/DoubleSlider.cpp:2308 #, boost-format msgid "Message for pause print on current layer (%1% mm)." msgstr "Missatge per a pausa d'impressió a la capa actual (%1% mm)." -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the move you want to jump to" msgstr "Introdueix el moviment al qual voleu saltar" -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the height you want to jump to" msgstr "Introdueix l'alçada a la que vols saltar" -#: src/slic3r/GUI/DoubleSlider.cpp:2515 +#: src/slic3r/GUI/DoubleSlider.cpp:2584 msgid "The last color change data was saved for a single extruder printing." msgstr "" "La informació del darrer canvi de color s'ha desat per a impressió amb un " "sol extrusor." -#: src/slic3r/GUI/DoubleSlider.cpp:2516 src/slic3r/GUI/DoubleSlider.cpp:2532 +#: src/slic3r/GUI/DoubleSlider.cpp:2585 src/slic3r/GUI/DoubleSlider.cpp:2601 msgid "The last color change data was saved for a multi extruder printing." msgstr "" "La informació del darrer canvi de color es va guardar per a la impressió " "multiextrusor." -#: src/slic3r/GUI/DoubleSlider.cpp:2518 +#: src/slic3r/GUI/DoubleSlider.cpp:2587 msgid "Your current changes will delete all saved color changes." msgstr "Els canvis nous esborraran tots els canvis de color." -#: src/slic3r/GUI/DoubleSlider.cpp:2519 src/slic3r/GUI/DoubleSlider.cpp:2540 +#: src/slic3r/GUI/DoubleSlider.cpp:2588 src/slic3r/GUI/DoubleSlider.cpp:2609 msgid "Are you sure you want to continue?" msgstr "Estàs segur que vols continuar?" -#: src/slic3r/GUI/DoubleSlider.cpp:2533 +#: src/slic3r/GUI/DoubleSlider.cpp:2602 msgid "" "Select YES if you want to delete all saved tool changes, \n" "NO if you want all tool changes switch to color changes, \n" @@ -1671,11 +1856,11 @@ msgstr "" "NO si voleu que els canvis d'eina siguin canvis de color,\n" "o CANCEL·LAR per no fer canvis." -#: src/slic3r/GUI/DoubleSlider.cpp:2536 +#: src/slic3r/GUI/DoubleSlider.cpp:2605 msgid "Do you want to delete all saved tool changes?" msgstr "Voleu suprimir tots els canvis d'eina desats?" -#: src/slic3r/GUI/DoubleSlider.cpp:2538 +#: src/slic3r/GUI/DoubleSlider.cpp:2607 msgid "" "The last color change data was saved for a multi extruder printing with tool " "changes for whole print." @@ -1683,19 +1868,33 @@ msgstr "" "La informació del darrer canvi de color s'ha desat per a impressió amb " "múltiples extrusors mitjançant canvis d'eina per a tota la impressió." -#: src/slic3r/GUI/DoubleSlider.cpp:2539 +#: src/slic3r/GUI/DoubleSlider.cpp:2608 msgid "Your current changes will delete all saved extruder (tool) changes." msgstr "" "Els canvis actuals eliminaran tots els canvis desats de l'extrusor (eina)." -#: src/slic3r/GUI/ExtraRenderers.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:538 -#: src/slic3r/GUI/GUI_ObjectList.cpp:550 src/slic3r/GUI/GUI_ObjectList.cpp:979 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4291 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:250 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:352 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:376 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:607 src/libslic3r/PrintConfig.cpp:800 +#: src/slic3r/GUI/Downloader.cpp:150 +#, boost-format +msgid "" +"Download won't start. Download URL doesn't point to https://files.printables." +"com : %1%" +msgstr "" + +#: src/slic3r/GUI/Downloader.cpp:181 +msgid "The download has failed:" +msgstr "" + +#: src/slic3r/GUI/DownloaderFileGet.cpp:193 +#, boost-format +msgid "Can't create file at %1%." +msgstr "" + +#: src/slic3r/GUI/ExtraRenderers.cpp:323 src/slic3r/GUI/GUI_ObjectList.cpp:571 +#: src/slic3r/GUI/GUI_ObjectList.cpp:583 src/slic3r/GUI/GUI_ObjectList.cpp:1043 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2125 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3013 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4884 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:259 src/libslic3r/PrintConfig.cpp:894 msgid "default" msgstr "per defecte" @@ -1708,10 +1907,10 @@ msgid "Set extruder change for every" msgstr "Establir canvi d'extrusor per a cada" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:60 -#: src/libslic3r/PrintConfig.cpp:662 src/libslic3r/PrintConfig.cpp:1430 -#: src/libslic3r/PrintConfig.cpp:2135 src/libslic3r/PrintConfig.cpp:2310 -#: src/libslic3r/PrintConfig.cpp:2386 src/libslic3r/PrintConfig.cpp:2639 -#: src/libslic3r/PrintConfig.cpp:2687 src/libslic3r/PrintConfig.cpp:2706 +#: src/libslic3r/PrintConfig.cpp:765 src/libslic3r/PrintConfig.cpp:1476 +#: src/libslic3r/PrintConfig.cpp:2165 src/libslic3r/PrintConfig.cpp:2343 +#: src/libslic3r/PrintConfig.cpp:2417 src/libslic3r/PrintConfig.cpp:2665 +#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2728 msgid "layers" msgstr "capes" @@ -1745,26 +1944,26 @@ msgstr "Retirar extrusor de la seqüència" msgid "Add extruder to sequence" msgstr "Afegir extrusor a la seqüència" -#: src/slic3r/GUI/Field.cpp:190 +#: src/slic3r/GUI/Field.cpp:188 msgid "default value" msgstr "valor per defecte" -#: src/slic3r/GUI/Field.cpp:193 +#: src/slic3r/GUI/Field.cpp:191 msgid "parameter name" msgstr "nom del paràmetre" -#: src/slic3r/GUI/Field.cpp:204 src/slic3r/GUI/OptionsGroup.cpp:827 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1067 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1079 +#: src/slic3r/GUI/Field.cpp:206 src/slic3r/GUI/OptionsGroup.cpp:852 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1074 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1086 msgid "N/A" msgstr "N/A" -#: src/slic3r/GUI/Field.cpp:226 src/slic3r/GUI/Field.cpp:298 +#: src/slic3r/GUI/Field.cpp:229 src/slic3r/GUI/Field.cpp:302 #, c-format, boost-format msgid "%s doesn't support percentage" msgstr "%s no permet percentatges" -#: src/slic3r/GUI/Field.cpp:266 +#: src/slic3r/GUI/Field.cpp:269 #, c-format, boost-format msgid "" "Input value is out of range\n" @@ -1773,16 +1972,16 @@ msgstr "" "El valor introduït és fora de rang\n" "Esteu segur que %s és un valor correcte i voleu continuar?" -#: src/slic3r/GUI/Field.cpp:269 src/slic3r/GUI/Field.cpp:343 +#: src/slic3r/GUI/Field.cpp:272 src/slic3r/GUI/Field.cpp:347 msgid "Parameter validation" msgstr "Validació de paràmetres" -#: src/slic3r/GUI/Field.cpp:282 src/slic3r/GUI/Field.cpp:390 -#: src/slic3r/GUI/Field.cpp:1573 +#: src/slic3r/GUI/Field.cpp:285 src/slic3r/GUI/Field.cpp:394 +#: src/slic3r/GUI/Field.cpp:1597 msgid "Input value is out of range" msgstr "El valor introduït és fora de rang" -#: src/slic3r/GUI/Field.cpp:340 +#: src/slic3r/GUI/Field.cpp:344 #, c-format, boost-format msgid "" "Do you mean %s%% instead of %s %s?\n" @@ -1793,7 +1992,7 @@ msgstr "" "Escolliu SI si voleu canviar aquest valor a %s%%,\n" "o NO si sabeu que %s %s és el valor correcte." -#: src/slic3r/GUI/Field.cpp:397 +#: src/slic3r/GUI/Field.cpp:401 #, boost-format msgid "" "Invalid input format. Expected vector of dimensions in the following format: " @@ -1802,6 +2001,15 @@ msgstr "" "Format d'entrada invàlid. Vector esperat de dimensions en el format següent: " "\"%1%\"" +#: src/slic3r/GUI/FileArchiveDialog.cpp:170 +msgid "Archive preview" +msgstr "" + +#: src/slic3r/GUI/FileArchiveDialog.cpp:270 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +msgid "Open" +msgstr "" + #: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flash!" msgstr "Flash!" @@ -1889,12 +2097,6 @@ msgstr "Imatge del firmware:" msgid "Select a file" msgstr "Seleccioneu un fitxer" -#: src/slic3r/GUI/FirmwareDialog.cpp:815 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:297 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:372 -msgid "Browse" -msgstr "Navega" - #: src/slic3r/GUI/FirmwareDialog.cpp:817 msgid "Serial port:" msgstr "Port Sèrie:" @@ -1924,10 +2126,10 @@ msgid "Advanced: Output log" msgstr "Avançat: Registre de sortida" #: src/slic3r/GUI/FirmwareDialog.cpp:862 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:310 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:358 #: src/slic3r/GUI/Mouse3DController.cpp:543 -#: src/slic3r/GUI/PrintHostDialogs.cpp:261 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:122 +#: src/slic3r/GUI/PrintHostDialogs.cpp:313 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:125 msgid "Close" msgstr "Tancar" @@ -1947,7 +2149,7 @@ msgstr "Confirmació" msgid "Cancelling..." msgstr "Cancel·lant..." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1488 msgid "Shape Gallery" msgstr "Galeria de Formes" @@ -1955,39 +2157,44 @@ msgstr "Galeria de Formes" msgid "Select shape from the gallery" msgstr "Seleccionar la forma a la galeria" -#: src/slic3r/GUI/GalleryDialog.cpp:100 -msgid "Add to bed" -msgstr "Afegir a la base" - -#: src/slic3r/GUI/GalleryDialog.cpp:101 -msgid "Add selected shape(s) to the bed" -msgstr "Afegir la(es) forma(es) seleccionada(es) a la base" - -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4152 +#: src/slic3r/GUI/GalleryDialog.cpp:114 src/slic3r/GUI/Tab.cpp:4377 msgid "Add" msgstr "Afegir" -#: src/slic3r/GUI/GalleryDialog.cpp:117 +#: src/slic3r/GUI/GalleryDialog.cpp:114 msgid "Add one or more custom shapes" msgstr "Afegir una o més formes personalitzades" -#: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:506 -#: src/slic3r/GUI/GLCanvas3D.cpp:4547 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/GalleryDialog.cpp:115 src/slic3r/GUI/GalleryDialog.cpp:528 +#: src/slic3r/GUI/GLCanvas3D.cpp:4638 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/GUI_Factories.cpp:460 src/slic3r/GUI/Tab.cpp:3973 msgid "Delete" msgstr "Esborrar" -#: src/slic3r/GUI/GalleryDialog.cpp:118 +#: src/slic3r/GUI/GalleryDialog.cpp:115 msgid "Delete one or more custom shape. You can't delete system shapes" msgstr "" "Eliminar una o diverses formes personalitzades. No es poden eliminar les " "formes del sistema" -#: src/slic3r/GUI/GalleryDialog.cpp:400 +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "Add to bed" +msgstr "Afegir a la base" + +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "OK" +msgstr "D'acord" + +#: src/slic3r/GUI/GalleryDialog.cpp:143 +msgid "Add selected shape(s) to the bed" +msgstr "Afegir la(es) forma(es) seleccionada(es) a la base" + +#: src/slic3r/GUI/GalleryDialog.cpp:422 msgid "Choose one or more files (STL, OBJ):" msgstr "Trieu un o més fitxers (STL, OBJ):" -#: src/slic3r/GUI/GalleryDialog.cpp:440 +#: src/slic3r/GUI/GalleryDialog.cpp:462 #, boost-format msgid "" "It looks like selected %1%-file has an error or is destructed.\n" @@ -1996,549 +2203,526 @@ msgstr "" "Sembla que el fitxer %1% seleccionat té un error o està destruït.\n" "No podem carregar aquest fitxer" -#: src/slic3r/GUI/GalleryDialog.cpp:451 +#: src/slic3r/GUI/GalleryDialog.cpp:473 msgid "Choose one PNG file:" msgstr "Trieu un fitxer PNG:" -#: src/slic3r/GUI/GalleryDialog.cpp:464 +#: src/slic3r/GUI/GalleryDialog.cpp:486 msgid "Replacing of the PNG" msgstr "Substitució del PNG" -#: src/slic3r/GUI/GalleryDialog.cpp:508 +#: src/slic3r/GUI/GalleryDialog.cpp:530 msgid "Change thumbnail" msgstr "Canviar la miniatura" -#: src/slic3r/GUI/GalleryDialog.cpp:549 src/slic3r/GUI/GalleryDialog.cpp:554 +#: src/slic3r/GUI/GalleryDialog.cpp:571 src/slic3r/GUI/GalleryDialog.cpp:576 #, boost-format msgid "Loading of the \"%1%\"" msgstr "Carregant de la \"%1%\"" -#: src/slic3r/GUI/GCodeViewer.cpp:274 +#: src/slic3r/GUI/GCodeViewer.cpp:343 msgid "Tool position" msgstr "Posició d'eina" -#: src/slic3r/GUI/GCodeViewer.cpp:1457 +#: src/slic3r/GUI/GCodeViewer.cpp:1547 msgid "Generating toolpaths" msgstr "Generant trajectòries" -#: src/slic3r/GUI/GCodeViewer.cpp:1517 +#: src/slic3r/GUI/GCodeViewer.cpp:1619 msgid "Generating vertex buffer" msgstr "Generant buffer de vèrtex" -#: src/slic3r/GUI/GCodeViewer.cpp:1857 +#: src/slic3r/GUI/GCodeViewer.cpp:1979 msgid "Generating index buffers" msgstr "Generant buffers d'índex" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to hide" msgstr "Clic per amagar" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to show" msgstr "Clic per mostrar" -#: src/slic3r/GUI/GCodeViewer.cpp:3181 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 msgid "up to" msgstr "fins a" -#: src/slic3r/GUI/GCodeViewer.cpp:3187 +#: src/slic3r/GUI/GCodeViewer.cpp:3455 msgid "above" msgstr "sobre" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "from" msgstr "desde" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "to" msgstr "a" -#: src/slic3r/GUI/GCodeViewer.cpp:3245 src/slic3r/GUI/GCodeViewer.cpp:3246 -#: src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3513 src/slic3r/GUI/GCodeViewer.cpp:3514 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 msgid "Percentage" msgstr "Percentatge" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3570 msgid "Feature type" msgstr "Tipus de funció" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3592 #: src/slic3r/GUI/RammingChart.cpp:90 msgid "Time" msgstr "Temps" -#: src/slic3r/GUI/GCodeViewer.cpp:3295 src/slic3r/GUI/GCodeViewer.cpp:3306 -#: src/slic3r/GUI/GCodeViewer.cpp:3566 -msgid "Used filament" -msgstr "Filament usat" - -#: src/slic3r/GUI/GCodeViewer.cpp:3298 +#: src/slic3r/GUI/GCodeViewer.cpp:3571 msgid "Height (mm)" msgstr "Alçada (mm)" -#: src/slic3r/GUI/GCodeViewer.cpp:3299 +#: src/slic3r/GUI/GCodeViewer.cpp:3572 msgid "Width (mm)" msgstr "Amplada (mm)" -#: src/slic3r/GUI/GCodeViewer.cpp:3300 +#: src/slic3r/GUI/GCodeViewer.cpp:3573 msgid "Speed (mm/s)" msgstr "Velocitat (mm/s)" -#: src/slic3r/GUI/GCodeViewer.cpp:3301 -msgid "Fan Speed (%)" -msgstr "Velocitat Ventilador (%)" +#: src/slic3r/GUI/GCodeViewer.cpp:3574 +msgid "Fan speed (%)" +msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3302 +#: src/slic3r/GUI/GCodeViewer.cpp:3575 msgid "Temperature (°C)" msgstr "Temperatura (°C)" -#: src/slic3r/GUI/GCodeViewer.cpp:3303 +#: src/slic3r/GUI/GCodeViewer.cpp:3576 msgid "Volumetric flow rate (mm³/s)" msgstr "Taxa de flux volumètric (mm³/seg)" -#: src/slic3r/GUI/GCodeViewer.cpp:3306 src/slic3r/GUI/GUI_Preview.cpp:224 -#: src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3577 +msgid "Layer time (linear)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3578 +msgid "Layer time (logarithmic)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3579 msgid "Tool" msgstr "Eina" -#: src/slic3r/GUI/GCodeViewer.cpp:3309 src/slic3r/GUI/GUI_Preview.cpp:225 -#: src/slic3r/GUI/GUI_Preview.cpp:957 +#: src/slic3r/GUI/GCodeViewer.cpp:3580 msgid "Color Print" msgstr "Color Print" -#: src/slic3r/GUI/GCodeViewer.cpp:3347 src/slic3r/GUI/GCodeViewer.cpp:3393 -#: src/slic3r/GUI/GCodeViewer.cpp:3398 src/slic3r/GUI/GUI_ObjectList.cpp:312 -#: src/slic3r/GUI/wxExtensions.cpp:536 src/libslic3r/PrintConfig.cpp:795 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 src/slic3r/GUI/GCodeViewer.cpp:3594 +#: src/slic3r/GUI/GCodeViewer.cpp:3860 +msgid "Used filament" +msgstr "Filament usat" + +#: src/slic3r/GUI/GCodeViewer.cpp:3623 src/slic3r/GUI/GCodeViewer.cpp:4067 +#: src/libslic3r/PrintConfig.cpp:3025 +msgid "Travel" +msgstr "Recorregut" + +#: src/slic3r/GUI/GCodeViewer.cpp:3640 src/slic3r/GUI/GCodeViewer.cpp:3685 +#: src/slic3r/GUI/GCodeViewer.cpp:3689 src/slic3r/GUI/GUI_ObjectList.cpp:338 +#: src/slic3r/GUI/wxExtensions.cpp:547 src/libslic3r/PrintConfig.cpp:888 msgid "Extruder" msgstr "Extrusor" -#: src/slic3r/GUI/GCodeViewer.cpp:3370 +#: src/slic3r/GUI/GCodeViewer.cpp:3662 msgid "Default color" msgstr "Color predeterminado" -#: src/slic3r/GUI/GCodeViewer.cpp:3393 +#: src/slic3r/GUI/GCodeViewer.cpp:3685 msgid "default color" msgstr "color predeterminado" -#: src/slic3r/GUI/GCodeViewer.cpp:3491 src/slic3r/GUI/GCodeViewer.cpp:3547 +#: src/slic3r/GUI/GCodeViewer.cpp:3785 src/slic3r/GUI/GCodeViewer.cpp:3841 msgid "Color change" msgstr "Canvi de color" -#: src/slic3r/GUI/GCodeViewer.cpp:3510 src/slic3r/GUI/GCodeViewer.cpp:3545 +#: src/slic3r/GUI/GCodeViewer.cpp:3804 src/slic3r/GUI/GCodeViewer.cpp:3839 msgid "Print" msgstr "Imprimir" -#: src/slic3r/GUI/GCodeViewer.cpp:3546 src/slic3r/GUI/GCodeViewer.cpp:3580 +#: src/slic3r/GUI/GCodeViewer.cpp:3840 src/slic3r/GUI/GCodeViewer.cpp:3874 msgid "Pause" msgstr "Pausa" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Event" msgstr "Esdeveniment" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Remaining time" msgstr "Temps restant" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Duration" msgstr "Duració" -#: src/slic3r/GUI/GCodeViewer.cpp:3609 src/slic3r/GUI/GUI_Preview.cpp:1049 -#: src/libslic3r/PrintConfig.cpp:2937 -msgid "Travel" -msgstr "Recorregut" - -#: src/slic3r/GUI/GCodeViewer.cpp:3612 -msgid "Movement" -msgstr "Moviment" - -#: src/slic3r/GUI/GCodeViewer.cpp:3613 -msgid "Extrusion" -msgstr "Extrusió" - -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1870 -#: src/slic3r/GUI/Tab.cpp:2812 -msgid "Retraction" -msgstr "Retracció" - -#: src/slic3r/GUI/GCodeViewer.cpp:3631 src/slic3r/GUI/GCodeViewer.cpp:3634 -#: src/slic3r/GUI/GUI_Preview.cpp:1050 -msgid "Wipe" -msgstr "Netejar" - -#: src/slic3r/GUI/GCodeViewer.cpp:3666 src/slic3r/GUI/GUI_Preview.cpp:257 -#: src/slic3r/GUI/GUI_Preview.cpp:272 -msgid "Options" -msgstr "Opcions" - -#: src/slic3r/GUI/GCodeViewer.cpp:3669 src/slic3r/GUI/GUI_Preview.cpp:1051 -msgid "Retractions" -msgstr "Retraccions" - -#: src/slic3r/GUI/GCodeViewer.cpp:3670 src/slic3r/GUI/GUI_Preview.cpp:1052 -msgid "Deretractions" -msgstr "Derretraccions" - -#: src/slic3r/GUI/GCodeViewer.cpp:3671 src/slic3r/GUI/GUI_Preview.cpp:1053 -msgid "Seams" -msgstr "Costures" - -#: src/slic3r/GUI/GCodeViewer.cpp:3672 src/slic3r/GUI/GUI_Preview.cpp:1054 -msgid "Tool changes" -msgstr "Canvis d'eina" - -#: src/slic3r/GUI/GCodeViewer.cpp:3673 src/slic3r/GUI/GUI_Preview.cpp:1055 -msgid "Color changes" -msgstr "Canvis de color" - -#: src/slic3r/GUI/GCodeViewer.cpp:3674 src/slic3r/GUI/GUI_Preview.cpp:1056 -msgid "Print pauses" -msgstr "Pauses d'impressió" - -#: src/slic3r/GUI/GCodeViewer.cpp:3675 src/slic3r/GUI/GUI_Preview.cpp:1057 -msgid "Custom G-codes" -msgstr "Codis G personalitzats" - -#: src/slic3r/GUI/GCodeViewer.cpp:3695 src/slic3r/GUI/GCodeViewer.cpp:3714 -#: src/slic3r/GUI/GUI.cpp:341 src/slic3r/GUI/Plater.cpp:822 -#: src/libslic3r/PrintConfig.cpp:322 +#: src/slic3r/GUI/GCodeViewer.cpp:3928 src/slic3r/GUI/GUI.cpp:332 +#: src/slic3r/GUI/Plater.cpp:852 src/libslic3r/PrintConfig.cpp:335 msgid "Printer" msgstr "Impressora" -#: src/slic3r/GUI/GCodeViewer.cpp:3697 src/slic3r/GUI/GCodeViewer.cpp:3719 -#: src/slic3r/GUI/GUI.cpp:337 src/slic3r/GUI/Plater.cpp:818 +#: src/slic3r/GUI/GCodeViewer.cpp:3931 src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/Plater.cpp:848 msgid "Print settings" msgstr "Configuració d'impressio" -#: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 -#: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1970 src/slic3r/GUI/Tab.cpp:1971 +#: src/slic3r/GUI/GCodeViewer.cpp:3936 src/slic3r/GUI/GUI.cpp:330 +#: src/slic3r/GUI/Plater.cpp:849 src/slic3r/GUI/Tab.cpp:1930 +#: src/slic3r/GUI/Tab.cpp:1931 msgid "Filament" msgstr "Filament" -#: src/slic3r/GUI/GCodeViewer.cpp:3739 +#: src/slic3r/GUI/GCodeViewer.cpp:3950 msgid "Estimated printing times" msgstr "Temps estimats d'impressió" -#: src/slic3r/GUI/GCodeViewer.cpp:3758 +#: src/slic3r/GUI/GCodeViewer.cpp:3969 msgid "Normal mode" msgstr "Mode Normal" -#: src/slic3r/GUI/GCodeViewer.cpp:3759 +#: src/slic3r/GUI/GCodeViewer.cpp:3970 msgid "Stealth mode" msgstr "Mode Silenciós" -#: src/slic3r/GUI/GCodeViewer.cpp:3766 src/libslic3r/PrintConfig.cpp:1189 -#: src/libslic3r/PrintConfig.cpp:1207 src/libslic3r/PrintConfig.cpp:1217 -#: src/libslic3r/PrintConfig.cpp:1262 +#: src/slic3r/GUI/GCodeViewer.cpp:3979 src/libslic3r/PrintConfig.cpp:1249 +#: src/libslic3r/PrintConfig.cpp:1267 src/libslic3r/PrintConfig.cpp:1277 +#: src/libslic3r/PrintConfig.cpp:1322 msgid "First layer" msgstr "Primera capa" -#: src/slic3r/GUI/GCodeViewer.cpp:3767 +#: src/slic3r/GUI/GCodeViewer.cpp:3983 msgid "Total" msgstr "Total" -#: src/slic3r/GUI/GCodeViewer.cpp:3796 +#: src/slic3r/GUI/GCodeViewer.cpp:4002 msgid "Show stealth mode" msgstr "Mostrar mode silenciós" -#: src/slic3r/GUI/GCodeViewer.cpp:3800 +#: src/slic3r/GUI/GCodeViewer.cpp:4006 msgid "Show normal mode" msgstr "Mostrar mode normal" -#: src/slic3r/GUI/GLCanvas3D.cpp:225 src/slic3r/GUI/GLCanvas3D.cpp:4694 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:53 -msgid "Variable layer height" -msgstr "Alçada de capa variable" +#: src/slic3r/GUI/GCodeViewer.cpp:4071 +msgid "Wipe" +msgstr "Netejar" -#: src/slic3r/GUI/GLCanvas3D.cpp:227 -msgid "Left mouse button:" -msgstr "Botó esquerre del ratolí:" +#: src/slic3r/GUI/GCodeViewer.cpp:4075 +msgid "Retractions" +msgstr "Retraccions" -#: src/slic3r/GUI/GLCanvas3D.cpp:229 -msgid "Add detail" -msgstr "Afegir detall" +#: src/slic3r/GUI/GCodeViewer.cpp:4079 +msgid "Deretractions" +msgstr "Derretraccions" -#: src/slic3r/GUI/GLCanvas3D.cpp:231 -msgid "Right mouse button:" -msgstr "Botó dret del ratolí:" +#: src/slic3r/GUI/GCodeViewer.cpp:4083 +msgid "Seams" +msgstr "Costures" -#: src/slic3r/GUI/GLCanvas3D.cpp:233 +#: src/slic3r/GUI/GCodeViewer.cpp:4087 +msgid "Tool changes" +msgstr "Canvis d'eina" + +#: src/slic3r/GUI/GCodeViewer.cpp:4091 +msgid "Color changes" +msgstr "Canvis de color" + +#: src/slic3r/GUI/GCodeViewer.cpp:4095 +msgid "Print pauses" +msgstr "Pauses d'impressió" + +#: src/slic3r/GUI/GCodeViewer.cpp:4099 +msgid "Custom G-codes" +msgstr "Codis G personalitzats" + +#: src/slic3r/GUI/GCodeViewer.cpp:4103 +msgid "Center of gravity" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:4108 +msgid "Shells" +msgstr "Carcasses" + +#: src/slic3r/GUI/GCodeViewer.cpp:4113 +msgid "Tool marker" +msgstr "Marcador d'eina" + +#: src/slic3r/GUI/GLCanvas3D.cpp:185 src/slic3r/GUI/GLCanvas3D.cpp:4784 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:71 +msgid "Variable layer height" +msgstr "Alçada de capa variable" + +#: src/slic3r/GUI/GLCanvas3D.cpp:187 +msgid "Left mouse button:" +msgstr "Botó esquerre del ratolí:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:189 +msgid "Add detail" +msgstr "Afegir detall" + +#: src/slic3r/GUI/GLCanvas3D.cpp:191 +msgid "Right mouse button:" +msgstr "Botó dret del ratolí:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:193 msgid "Remove detail" msgstr "Retirar detall" -#: src/slic3r/GUI/GLCanvas3D.cpp:235 +#: src/slic3r/GUI/GLCanvas3D.cpp:195 msgid "Shift + Left mouse button:" msgstr "Maj + botó esquerre del ratolí:" -#: src/slic3r/GUI/GLCanvas3D.cpp:237 +#: src/slic3r/GUI/GLCanvas3D.cpp:197 msgid "Reset to base" msgstr "Reiniciar a la base" -#: src/slic3r/GUI/GLCanvas3D.cpp:239 +#: src/slic3r/GUI/GLCanvas3D.cpp:199 msgid "Shift + Right mouse button:" msgstr "Maj + botó dret del ratolí:" -#: src/slic3r/GUI/GLCanvas3D.cpp:241 +#: src/slic3r/GUI/GLCanvas3D.cpp:201 msgid "Smoothing" msgstr "Suavitzat" -#: src/slic3r/GUI/GLCanvas3D.cpp:243 +#: src/slic3r/GUI/GLCanvas3D.cpp:203 msgid "Mouse wheel:" msgstr "Roda del ratolí:" -#: src/slic3r/GUI/GLCanvas3D.cpp:245 +#: src/slic3r/GUI/GLCanvas3D.cpp:205 msgid "Increase/decrease edit area" msgstr "Incrementar/reduir àrea edició" -#: src/slic3r/GUI/GLCanvas3D.cpp:248 +#: src/slic3r/GUI/GLCanvas3D.cpp:208 msgid "Adaptive" msgstr "Adaptativa" -#: src/slic3r/GUI/GLCanvas3D.cpp:254 +#: src/slic3r/GUI/GLCanvas3D.cpp:214 msgid "Quality / Speed" msgstr "Qualitat / Velocitat" -#: src/slic3r/GUI/GLCanvas3D.cpp:257 +#: src/slic3r/GUI/GLCanvas3D.cpp:217 msgid "Higher print quality versus higher print speed." msgstr "Major qualitat d'impressió versus més velocitat d'impressió." -#: src/slic3r/GUI/GLCanvas3D.cpp:268 +#: src/slic3r/GUI/GLCanvas3D.cpp:228 msgid "Smooth" msgstr "Suau" -#: src/slic3r/GUI/GLCanvas3D.cpp:274 src/libslic3r/PrintConfig.cpp:819 +#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/libslic3r/PrintConfig.cpp:908 msgid "Radius" msgstr "Radi" -#: src/slic3r/GUI/GLCanvas3D.cpp:286 +#: src/slic3r/GUI/GLCanvas3D.cpp:246 msgid "Keep min" msgstr "Mantenir mínim" -#: src/slic3r/GUI/GLCanvas3D.cpp:295 src/slic3r/GUI/GLCanvas3D.cpp:4123 +#: src/slic3r/GUI/GLCanvas3D.cpp:255 src/slic3r/GUI/GLCanvas3D.cpp:4217 msgid "Reset" msgstr "Restablir" -#: src/slic3r/GUI/GLCanvas3D.cpp:561 +#: src/slic3r/GUI/GLCanvas3D.cpp:602 msgid "Variable layer height - Manual edit" msgstr "Alçada de capa variable - Edició manual" -#: src/slic3r/GUI/GLCanvas3D.cpp:676 +#: src/slic3r/GUI/GLCanvas3D.cpp:717 msgid "Seq." msgstr "Seq." -#: src/slic3r/GUI/GLCanvas3D.cpp:1310 +#: src/slic3r/GUI/GLCanvas3D.cpp:1319 msgid "Variable layer height - Reset" msgstr "Alçada de capa variable - Reiniciar" -#: src/slic3r/GUI/GLCanvas3D.cpp:1318 +#: src/slic3r/GUI/GLCanvas3D.cpp:1327 msgid "Variable layer height - Adaptive" msgstr "Alçada de capa variable - Adaptativa" -#: src/slic3r/GUI/GLCanvas3D.cpp:1326 +#: src/slic3r/GUI/GLCanvas3D.cpp:1335 msgid "Variable layer height - Smooth all" msgstr "Alçada de capa variable - Suavitzar-ho tot" -#: src/slic3r/GUI/GLCanvas3D.cpp:1733 +#: src/slic3r/GUI/GLCanvas3D.cpp:1778 msgid "Mirror Object" msgstr "Reflectir objecte" -#: src/slic3r/GUI/GLCanvas3D.cpp:2612 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:560 +#: src/slic3r/GUI/GLCanvas3D.cpp:2542 src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:117 msgid "Gizmo-Move" msgstr "Gizmo-Moure" -#: src/slic3r/GUI/GLCanvas3D.cpp:2695 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562 +#: src/slic3r/GUI/GLCanvas3D.cpp:2638 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:661 msgid "Gizmo-Rotate" msgstr "Gizmo-Rotar" -#: src/slic3r/GUI/GLCanvas3D.cpp:3300 +#: src/slic3r/GUI/GLCanvas3D.cpp:3263 msgid "Move Object" msgstr "Moure objecte" -#: src/slic3r/GUI/GLCanvas3D.cpp:3821 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3513 +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:40 +msgid "Gizmo-Place on Face" +msgstr "Gizmo-Col·locar a Cara" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3904 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Switch to Settings" msgstr "Canviar a Configuració" -#: src/slic3r/GUI/GLCanvas3D.cpp:3822 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3905 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Print Settings Tab" msgstr "Pestanya Configuració Impressió" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Filament Settings Tab" msgstr "Pestanya Configuració Filament" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Material Settings Tab" msgstr "Pestanya Configuració de Material" -#: src/slic3r/GUI/GLCanvas3D.cpp:3824 src/slic3r/GUI/GLCanvas3D.cpp:4657 +#: src/slic3r/GUI/GLCanvas3D.cpp:3907 src/slic3r/GUI/GLCanvas3D.cpp:4746 msgid "Printer Settings Tab" msgstr "Pestanya Configuració Impressora" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Undo History" msgstr "Desfer Historial" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Redo History" msgstr "Refer Historial" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" msgstr[0] "Desfer %1$d Acció" msgstr[1] "Desfer %1$d Accions" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" msgstr[0] "Refer %1$d Acció" msgstr[1] "Refer %1$d Accions" -#: src/slic3r/GUI/GLCanvas3D.cpp:4011 src/slic3r/GUI/GLCanvas3D.cpp:4673 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 src/slic3r/GUI/Search.cpp:426 +#: src/slic3r/GUI/GLCanvas3D.cpp:4106 src/slic3r/GUI/GLCanvas3D.cpp:4762 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/Search.cpp:482 msgid "Search" msgstr "Cercar" -#: src/slic3r/GUI/GLCanvas3D.cpp:4025 src/slic3r/GUI/GLCanvas3D.cpp:4033 -#: src/slic3r/GUI/Search.cpp:432 +#: src/slic3r/GUI/GLCanvas3D.cpp:4120 src/slic3r/GUI/GLCanvas3D.cpp:4128 +#: src/slic3r/GUI/Search.cpp:488 msgid "Enter a search term" msgstr "Tecleja una paraula de cerca" -#: src/slic3r/GUI/GLCanvas3D.cpp:4064 +#: src/slic3r/GUI/GLCanvas3D.cpp:4160 msgid "Arrange options" msgstr "Opcions d'ordenació" -#: src/slic3r/GUI/GLCanvas3D.cpp:4097 +#: src/slic3r/GUI/GLCanvas3D.cpp:4193 #, boost-format msgid "Press %1%left mouse button to enter the exact value" msgstr "Premeu %1% botó esquerre del ratolí per introduir el valor exacte" -#: src/slic3r/GUI/GLCanvas3D.cpp:4099 +#: src/slic3r/GUI/GLCanvas3D.cpp:4195 msgid "Spacing" msgstr "Espaiat" -#: src/slic3r/GUI/GLCanvas3D.cpp:4106 -msgid "Enable rotations (slow)" -msgstr "Permetre rotacions (lent)" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Alignment" -msgstr "Alineació" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:4500 -msgid "Center" -msgstr "Centre" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear left" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front left" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front right" +#: src/slic3r/GUI/GLCanvas3D.cpp:4202 +msgid "Spacing from bed" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear right" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:2271 -msgid "Random" -msgstr "Aleatori" +#: src/slic3r/GUI/GLCanvas3D.cpp:4209 +msgid "Enable rotations (slow)" +msgstr "Permetre rotacions (lent)" -#: src/slic3r/GUI/GLCanvas3D.cpp:4133 src/slic3r/GUI/GLCanvas3D.cpp:4565 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Plater.cpp:1664 +#: src/slic3r/GUI/GLCanvas3D.cpp:4228 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 src/slic3r/GUI/Plater.cpp:7118 msgid "Arrange" msgstr "Organitza" -#: src/slic3r/GUI/GLCanvas3D.cpp:4539 +#: src/slic3r/GUI/GLCanvas3D.cpp:4630 msgid "Add..." msgstr "Afegir..." -#: src/slic3r/GUI/GLCanvas3D.cpp:4556 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5509 src/slic3r/GUI/Tab.cpp:4158 +#: src/slic3r/GUI/GLCanvas3D.cpp:4647 src/slic3r/GUI/KBShortcutsDialog.cpp:105 +#: src/slic3r/GUI/Plater.cpp:6047 src/slic3r/GUI/Tab.cpp:4383 msgid "Delete all" msgstr "Eliminar tot" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 src/slic3r/GUI/KBShortcutsDialog.cpp:133 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 src/slic3r/GUI/KBShortcutsDialog.cpp:142 msgid "Arrange selection" msgstr "Ordenar selecció" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 msgid "Click right mouse button to show arrangement options" msgstr "Clic dret del ratolí per mostrar opcions d'ordenació" -#: src/slic3r/GUI/GLCanvas3D.cpp:4587 +#: src/slic3r/GUI/GLCanvas3D.cpp:4676 msgid "Copy" msgstr "Copiar" -#: src/slic3r/GUI/GLCanvas3D.cpp:4596 +#: src/slic3r/GUI/GLCanvas3D.cpp:4685 msgid "Paste" msgstr "Enganxar" -#: src/slic3r/GUI/GLCanvas3D.cpp:4608 src/slic3r/GUI/GUI_Factories.cpp:1084 -#: src/slic3r/GUI/GUI_Factories.cpp:1108 src/slic3r/GUI/GUI_Factories.cpp:1119 +#: src/slic3r/GUI/GLCanvas3D.cpp:4697 src/slic3r/GUI/GUI_Factories.cpp:1237 +#: src/slic3r/GUI/GUI_Factories.cpp:1261 src/slic3r/GUI/GUI_Factories.cpp:1272 msgid "Add instance" msgstr "Afegeix una instància" -#: src/slic3r/GUI/GLCanvas3D.cpp:4619 src/slic3r/GUI/GUI_Factories.cpp:1087 +#: src/slic3r/GUI/GLCanvas3D.cpp:4708 src/slic3r/GUI/GUI_Factories.cpp:1240 msgid "Remove instance" msgstr "Retirar una còpia" -#: src/slic3r/GUI/GLCanvas3D.cpp:4632 +#: src/slic3r/GUI/GLCanvas3D.cpp:4721 msgid "Split to objects" msgstr "Partir en diverses peces" -#: src/slic3r/GUI/GLCanvas3D.cpp:4642 +#: src/slic3r/GUI/GLCanvas3D.cpp:4731 msgid "Split to parts" msgstr "Separar en peces" -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/GLCanvas3D.cpp:4795 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/GLCanvas3D.cpp:4874 msgid "Click right mouse button to open/close History" msgstr "Clic amb botó dret del ratolí per obrir/tancar Historial" -#: src/slic3r/GUI/GLCanvas3D.cpp:4779 +#: src/slic3r/GUI/GLCanvas3D.cpp:4859 #, boost-format msgid "Next Undo action: %1%" msgstr "Següent acció de Desfer: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:4795 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/GLCanvas3D.cpp:4874 src/slic3r/GUI/KBShortcutsDialog.cpp:107 +#: src/slic3r/GUI/MainFrame.cpp:1429 msgid "Redo" msgstr "Refer" -#: src/slic3r/GUI/GLCanvas3D.cpp:4817 +#: src/slic3r/GUI/GLCanvas3D.cpp:4895 #, boost-format msgid "Next Redo action: %1%" msgstr "Següent acció de Refer: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:6434 +#: src/slic3r/GUI/GLCanvas3D.cpp:6784 msgid "An object outside the print area was detected." msgstr "S'ha detectat un objecte fora de l'àrea d'impressió." -#: src/slic3r/GUI/GLCanvas3D.cpp:6435 +#: src/slic3r/GUI/GLCanvas3D.cpp:6785 msgid "A toolpath outside the print area was detected." msgstr "S'ha detectat una trajectòria fora de l'àrea d'impressió." -#: src/slic3r/GUI/GLCanvas3D.cpp:6436 +#: src/slic3r/GUI/GLCanvas3D.cpp:6786 msgid "SLA supports outside the print area were detected." msgstr "S'han detectat suports SLA fora de l'àrea d'impressió." -#: src/slic3r/GUI/GLCanvas3D.cpp:6437 +#: src/slic3r/GUI/GLCanvas3D.cpp:6787 msgid "Some objects are not visible during editing." msgstr "Alguns objectes no són visibles durant l'edició." -#: src/slic3r/GUI/GLCanvas3D.cpp:6439 +#: src/slic3r/GUI/GLCanvas3D.cpp:6789 msgid "" "An object outside the print area was detected.\n" "Resolve the current problem to continue slicing." @@ -2546,327 +2730,1349 @@ msgstr "" "S'ha detectat un objecte fora de l'àrea d'impressió.\n" "Resol el problema actual per continuar laminant." -#: src/slic3r/GUI/GLCanvas3D.cpp:6513 +#: src/slic3r/GUI/GLCanvas3D.cpp:6864 msgid "Selection-Add from rectangle" msgstr "Selecció-Afegir del rectangle" -#: src/slic3r/GUI/GLCanvas3D.cpp:6528 +#: src/slic3r/GUI/GLCanvas3D.cpp:6879 msgid "Selection-Remove from rectangle" msgstr "Selecció-Retirar del rectangle" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4478 -msgid "Cut" -msgstr "Retalla" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:206 +msgid "Planar" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -msgid "in" -msgstr "a" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Auto" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 -msgid "Keep upper part" -msgstr "Mantenir la part superior" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Manual" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 -msgid "Keep lower part" -msgstr "Mantenir la part inferior" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:213 +msgid "Plug" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:196 -msgid "Rotate lower part upwards" -msgstr "Donar la volta a les peces" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:214 +msgid "Dowel" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:201 -msgid "Perform cut" -msgstr "Realitzar tall" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Prism" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:49 -msgid "Paint-on supports" -msgstr "Suports pintables" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Frustum" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 -msgid "Clipping of view" -msgstr "Retall de la vista" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Triangle" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 -msgid "Reset direction" -msgstr "Restablir direcció" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Square" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 -msgid "Brush size" -msgstr "Mida del pinzell" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Hexagon" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 -msgid "Brush shape" -msgstr "Forma del pinzell" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:59 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 +msgid "Circle" +msgstr "Cercle" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 -msgid "Left mouse button" -msgstr "Botó esquerre del ratolí" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:233 +msgid "Keep orientation" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 -msgid "Enforce supports" -msgstr "Imposar suports" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:234 +msgid "Place on cut" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 -msgid "Right mouse button" -msgstr "Botó dret del ratolí" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:235 +msgid "Flip upside down" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:434 -msgid "Block supports" -msgstr "Blocar suports" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +msgid "inch" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 -msgid "Shift + Left mouse button" -msgstr "Maj + botó esquerre del ratolí" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 +msgid "Part" +msgstr "Peça" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:429 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 -msgid "Remove selection" -msgstr "Eliminar selecció" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 src/libslic3r/Print.cpp:1236 +msgid "Object" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 -msgid "Remove all selection" -msgstr "Eliminar tota la selecció" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:264 +msgid "" +"Click to flip the cut plane\n" +"Drag to move the cut plane" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 -msgid "Circle" -msgstr "Cercle" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:269 src/libslic3r/PrintConfig.cpp:498 +#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2325 src/libslic3r/PrintConfig.cpp:2613 +#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2876 src/libslic3r/PrintConfig.cpp:2907 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3231 +#: src/libslic3r/PrintConfig.cpp:3466 src/libslic3r/PrintConfig.cpp:3951 +msgid "°" +msgstr "°" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 -#: src/slic3r/GUI/GUI_Factories.cpp:461 -msgid "Sphere" -msgstr "Esfera" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:367 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:571 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1232 +msgid "Move cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +msgid "in" +msgstr "a" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:68 -#: src/libslic3r/PrintConfig.cpp:1172 -msgid "Triangles" -msgstr "Triangles" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:544 +msgid "Value" +msgstr "Valor" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 -msgid "Highlight overhang by angle" -msgstr "Ressaltar el voladís segons l'angle" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:549 +msgid "Tolerance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 -msgid "Enforce" -msgstr "Imposar" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 +msgid "Left click" +msgstr "Clic esquerre" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 -msgid "Tool type" -msgstr "Tipus d'eina" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2348 +msgid "Add connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 -msgid "Brush" -msgstr "Pinzell" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 +msgid "Right click" +msgstr "Clic dret" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:128 -msgid "Smart fill" -msgstr "Farciment intel·ligent" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +msgid "Remove connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:131 -msgid "Smart fill angle" -msgstr "Angle de farciment intel·ligent" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 +msgid "Drag" +msgstr "Arrossegar" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:132 -msgid "Split triangles" -msgstr "Dividir triangles" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1216 +msgid "Move connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 -msgid "On overhangs only" -msgstr "Només als voladissos" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +msgid "Add connector to selection" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:174 -#, boost-format -msgid "" -"Preselects faces by overhang angle. It is possible to restrict paintable " -"facets to only preselected faces when the option \"%1%\" is enabled." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +msgid "Remove connector from selection" msgstr "" -"Preselecciona les facetes segons l'angle del voladís. Les facetes pintables " -"només es poden restringir a les cares preseleccionades quan l'opció \"%1%\" " -"està activada." -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:217 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:378 -msgid "Paints facets according to the chosen painting brush." -msgstr "Pinta les facetes segons el pinzell triat." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:870 +msgid "Select all connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:391 -msgid "" -"Paints neighboring facets whose relative angle is less or equal to set angle." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:894 src/libslic3r/PrintConfig.cpp:4644 +msgid "Cut" +msgstr "Retalla" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1227 +msgid "Rotate cut plane" msgstr "" -"Pinta les facetes veïnes l'angle relatiu de les quals és menor o igual a " -"l'angle establert." -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:229 -#, boost-format -msgid "Allows painting only on facets selected by: \"%1%\"" -msgstr "Permet pintar només a les facetes seleccionades per: \"%1%\"" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1448 +msgid "Render cut plane as circle" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:244 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:419 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:144 -msgid "Paints all facets inside, regardless of their orientation." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1537 +msgid "Connectors" msgstr "" -"Pinta totes les facetes de l´interior, independentment de la seva orientació." -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:253 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:428 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:152 -msgid "Ignores facets facing away from the camera." -msgstr "Ignora les facetes que no estan mirant cap a la càmera." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1541 +msgid "Remove connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:262 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:437 -msgid "Paints only one facet." -msgstr "Pinta només una faceta." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1550 +msgid "Type" +msgstr "Tipus" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:270 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:285 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:445 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:462 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:132 -msgid "Alt + Mouse wheel" -msgstr "Alt + Roda del ratolí" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1561 src/libslic3r/PrintConfig.cpp:2816 +msgid "Style" +msgstr "Estil" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 -msgid "Splits bigger facets into smaller ones while the object is painted." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1568 +msgid "Depth ratio" msgstr "" -"Dividiu les facetes més grans en altres de més petites mentre es pinta " -"l'objecte." -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:308 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:483 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:170 -msgid "Ctrl + Mouse wheel" -msgstr "Ctrl + Roda del ratolí" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1586 +msgid "Confirm connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:313 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:488 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:175 -msgid "Reset selection" -msgstr "Reiniciar selecció" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1652 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1666 +msgid "Flip cut plane" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:364 -msgid "Block supports by angle" -msgstr "Bloquejar suports segons angle" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1710 +msgid "Hold SHIFT key to draw a cut line" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:365 -msgid "Add supports by angle" -msgstr "Afegir suports segons angle" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1716 +msgid "Cut position: " +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:432 -msgid "Add supports" -msgstr "Afegir suports" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1725 +msgid "Reset cutting plane" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:41 -msgid "Place on face" -msgstr "Colocar en la cara" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Edit connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 -msgid "Hollow this object" -msgstr "Buida aquest objecte" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Add connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 -msgid "Preview hollowed and drilled model" -msgstr "Vista prèvia del model buit i perforat" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1744 +msgid "Reset cut" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1745 +msgid "Reset cutting plane and remove connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1800 +msgid "After cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1820 +msgid "Cut to" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1823 +msgid "Objects" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1826 +msgid "Parts" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1840 +msgid "Perform cut" +msgstr "Realitzar tall" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1930 +msgid "Invalid connectors detected" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1932 +#, c-format, boost-format +msgid "%1$d connector is out of cut contour" +msgid_plural "%1$d connectors are out of cut contour" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1935 +#, c-format, boost-format +msgid "%1$d connector is out of object" +msgid_plural "%1$d connectors are out of object" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1938 +msgid "Some connectors are overlapped" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1942 +msgid "" +"Invalid state. \n" +"No one part is selected for keep after cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1944 +msgid "" +"Warning state. \n" +"Cut plane is placed out of object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2153 +msgid "Connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2183 +msgid "Cut by Plane" +msgstr "Tallar pel Plànol" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2323 +msgid "Cut by line" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2373 +msgid "Delete connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:252 +msgid "Entering Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:253 +msgid "Leaving Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:254 +msgid "Cut gizmo editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:601 +msgid "Emboss" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:866 +msgid "ERROR: Wait until ends or Cancel process." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:921 +msgid "Text-Rotate" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:953 +msgid "Font" +msgstr "Tipus de lletra" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:954 +#: src/libslic3r/PrintConfig.cpp:897 +msgid "Height" +msgstr "Alçada" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:955 +msgid "Depth" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:963 +msgid "Use surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:964 +msgid "Char gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:965 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Line gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:966 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:967 +msgid "Skew ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:968 +msgid "Z-move" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:969 +msgid "Z-rot" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:970 +msgid "Collection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1047 +msgid "NORMAL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1048 +msgid "SMALL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1049 +msgid "ITALIC" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1050 +msgid "SWISS" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1051 +msgid "MODERN" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1088 +msgid "First font" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1093 +msgid "Default font" +msgstr "Tipus de lletra per defecte" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1098 +msgid "Embossed text" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1513 +msgid "Warning: No font is selected. Select correct one." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1531 +#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1437 +#: src/slic3r/GUI/Tab.cpp:1472 src/slic3r/GUI/Tab.cpp:1607 +#: src/slic3r/GUI/Tab.cpp:1611 src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:2390 src/slic3r/GUI/Tab.cpp:4985 +#: src/libslic3r/PrintConfig.cpp:276 src/libslic3r/PrintConfig.cpp:514 +#: src/libslic3r/PrintConfig.cpp:1484 src/libslic3r/PrintConfig.cpp:1566 +#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:2562 +#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:3166 +#: src/libslic3r/PrintConfig.cpp:3200 src/libslic3r/PrintConfig.cpp:3211 +#: src/libslic3r/PrintConfig.cpp:3226 src/libslic3r/PrintConfig.cpp:3239 +#: src/libslic3r/PrintConfig.cpp:3248 src/libslic3r/PrintConfig.cpp:3260 +#: src/libslic3r/PrintConfig.cpp:3642 +msgid "Advanced" +msgstr "Avançat" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1631 +msgid "Can't write text by selected font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1632 +msgid "Try to choose another font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Empty" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Embossed text can NOT contain only white spaces." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Bad symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Text contain character glyph (represented by '?') unknown by font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:535 +msgid "Skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +msgid "Unsupported visualization of font skew for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Unsupported visualization of font boldness for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Unsupported visualization of gap between lines inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Too tall" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Diminished font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Too small" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Enlarged font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1660 +#, boost-format +msgid "%1% is NOT shown." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1964 +msgid " No symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1965 +msgid " ... Loading" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2015 +msgid " ... In queue" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2132 +#, boost-format +msgid "Font face \"%1%\" can't be selected." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2180 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:754 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:367 +msgid "Apply" +msgstr "Aplicar" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2192 +msgid "add file with font(.ttf, .ttc)" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2202 +msgid "Open dialog for choose from fonts." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2210 +msgid "Text is to object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2224 +msgid "Added" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2227 +msgid "Click to change text into object part." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2230 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4321 +msgid "You can't change a type of the last solid part of the object." +msgstr "No podeu canviar un tipus de l'última part sòlida de l'objecte." + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2231 +msgid "Subtracted" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2237 +msgid "Click to change part type into negative volume." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2243 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4338 +msgid "Modifier" +msgstr "Modificador" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2249 +msgid "Click to change part type into modifier." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2256 +msgid "Change Text Type" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2287 +#, boost-format +msgid "Rename style(%1%) for embossing text: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2299 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2384 +msgid "Name can't be empty." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2301 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2386 +msgid "Name has to be unique." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2310 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2397 +msgid "ok" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2312 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2401 +msgid "cancel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2337 +msgid "Rename style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2344 +msgid "Rename current style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2345 +msgid "Can't rename temporary style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2362 +msgid "First Add style to list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2364 +#, boost-format +msgid "Save %1% style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2366 +msgid "No changes to save." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2373 +msgid "New name of style: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2422 +msgid "Save as new style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2434 +msgid "Only valid font can be added to style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2436 +msgid "Add style to my list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2438 +msgid "Add as new named style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2454 +msgid "Remove style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2485 +#, boost-format +msgid "Delete \"%1%\" style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2486 +#, boost-format +msgid "Can't delete \"%1%\". It is last style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2487 +#, boost-format +msgid "Can't delete temporary style \"%1%\"." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2494 +#, boost-format +msgid "" +"Are you sure,\n" +"that you want permanently and unrecoverable \n" +"remove style \"%1%\"?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2496 +msgid "Yes" +msgstr "Sí" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2505 +msgid "No" +msgstr "No" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2555 +msgid "Presets" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2564 src/slic3r/GUI/GUI_App.cpp:2324 +msgid "modified" +msgstr "modificat" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2617 +#, boost-format +msgid "Modified style \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2618 +#, boost-format +msgid "Current style is \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2625 +msgid "Style modification will be lost." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2627 +#, boost-format +msgid "" +"Changing style to '%1%' will discard current style modification.\n" +"\n" +" Would you like to continue anyway?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2643 +msgid "Not valid style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2644 +#, boost-format +msgid "Style '%1%' can't be used and will be removed from list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2691 +msgid "Unset italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2708 +msgid "Set italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2738 +msgid "Unset bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2756 +msgid "Set bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2922 +msgid "WxFont is not loaded properly." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2957 +msgid "Revert font changes." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2991 +msgid "wx Make bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3002 +msgid "Revert text size." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3029 +msgid "Revert embossed depth." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3178 +msgid "" +"Advanced font options could be changed only for correct font.\n" +"Start with select correct font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3219 +msgid "Revert using of model surface." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3232 +msgid "font points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3241 +msgid "Revert gap between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3242 +msgid "Distance between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3257 +msgid "Revert gap between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3258 +msgid "Distance between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3272 +msgid "Undo boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3273 +msgid "Tiny / Wide glyphs" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3283 +msgid "Undo letter's skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3284 +msgid "Italic strength ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3304 +msgid "Undo translation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3305 +msgid "Distance of the center of text from model surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3350 +msgid "Undo rotation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3352 +msgid "Rotate text Clock-wise." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3386 +msgid "Select from True Type Collection." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3395 +msgid "Set text to face camera" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3402 +msgid "Use camera direction for text orientation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3486 +#, boost-format +msgid "Font '%1%' can't be used. Please select another." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3488 +msgid "Selected font is NOT True-type." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3512 +msgid "Choose one or more files (TTF, TTC):" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3539 +msgid "Choose SVG file:" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3600 +#, boost-format +msgid "" +"Can't load exactly same font(\"%1%\"), Aplication selected a similar " +"one(\"%2%\"). You have to specify font for enable edit text." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:81 +msgid "Enter emboss gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:82 +msgid "Leave emboss gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:83 +msgid "Embossing actions" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:37 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:66 +msgid "Paint-on supports" +msgstr "Suports pintables" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 +msgid "Automatic painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 +msgid "painting..." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:107 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +msgid "Clipping of view" +msgstr "Retall de la vista" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:106 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 +msgid "Reset direction" +msgstr "Restablir direcció" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:108 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 +msgid "Brush size" +msgstr "Mida del pinzell" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:109 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 +msgid "Brush shape" +msgstr "Forma del pinzell" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1816 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:110 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 +msgid "Left mouse button" +msgstr "Botó esquerre del ratolí" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 +msgid "Enforce supports" +msgstr "Imposar suports" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 +msgid "Right mouse button" +msgstr "Botó dret del ratolí" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:573 +msgid "Block supports" +msgstr "Blocar suports" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 +msgid "Shift + Left mouse button" +msgstr "Maj + botó esquerre del ratolí" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:568 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:247 +msgid "Remove selection" +msgstr "Eliminar selecció" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 +msgid "Remove all selection" +msgstr "Eliminar tota la selecció" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 +#: src/slic3r/GUI/GUI_Factories.cpp:481 +msgid "Sphere" +msgstr "Esfera" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:106 +#: src/libslic3r/PrintConfig.cpp:1231 +msgid "Triangles" +msgstr "Triangles" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 +msgid "Highlight overhang by angle" +msgstr "Ressaltar el voladís segons l'angle" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:63 +msgid "Enforce" +msgstr "Imposar" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +msgid "Tool type" +msgstr "Tipus d'eina" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 +msgid "Brush" +msgstr "Pinzell" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:68 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 +msgid "Smart fill" +msgstr "Farciment intel·ligent" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 +msgid "Smart fill angle" +msgstr "Angle de farciment intel·ligent" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:72 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 +msgid "Split triangles" +msgstr "Dividir triangles" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:73 +msgid "On overhangs only" +msgstr "Només als voladissos" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:187 +#, boost-format +msgid "" +"Preselects faces by overhang angle. It is possible to restrict paintable " +"facets to only preselected faces when the option \"%1%\" is enabled." +msgstr "" +"Preselecciona les facetes segons l'angle del voladís. Les facetes pintables " +"només es poden restringir a les cares preseleccionades quan l'opció \"%1%\" " +"està activada." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:230 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:371 +msgid "Paints facets according to the chosen painting brush." +msgstr "Pinta les facetes segons el pinzell triat." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:238 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:384 +msgid "" +"Paints neighboring facets whose relative angle is less or equal to set angle." +msgstr "" +"Pinta les facetes veïnes l'angle relatiu de les quals és menor o igual a " +"l'angle establert." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242 +#, boost-format +msgid "Allows painting only on facets selected by: \"%1%\"" +msgstr "Permet pintar només a les facetes seleccionades per: \"%1%\"" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:257 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:412 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141 +msgid "Paints all facets inside, regardless of their orientation." +msgstr "" +"Pinta totes les facetes de l´interior, independentment de la seva orientació." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:266 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:421 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:149 +msgid "Ignores facets facing away from the camera." +msgstr "Ignora les facetes que no estan mirant cap a la càmera." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:430 +msgid "Paints only one facet." +msgstr "Pinta només una faceta." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:298 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:438 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:455 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:129 +msgid "Alt + Mouse wheel" +msgstr "Alt + Roda del ratolí" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:288 +msgid "Splits bigger facets into smaller ones while the object is painted." +msgstr "" +"Dividiu les facetes més grans en altres de més petites mentre es pinta " +"l'objecte." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:321 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:476 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:167 +msgid "Ctrl + Mouse wheel" +msgstr "Ctrl + Roda del ratolí" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:326 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:481 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:172 +msgid "Reset selection" +msgstr "Reiniciar selecció" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:382 +msgid "Block supports by angle" +msgstr "Bloquejar suports segons angle" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:383 +msgid "Add supports by angle" +msgstr "Afegir suports segons angle" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +msgid "Automatic painting requires valid print setup." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:535 +msgid "Automatic painting will erase all currently painted areas." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:536 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1118 +msgid "Are you sure you want to do it?" +msgstr "Esteu segur que voleu fer-ho?" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:540 +msgid "Automatic painting support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:571 +msgid "Add supports" +msgstr "Afegir suports" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:22 +msgid "Entering Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:23 +msgid "Leaving Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:24 +msgid "Paint-on supports editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:88 +msgid "Place on face" +msgstr "Colocar en la cara" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:29 +msgid "Hollow this object" +msgstr "Buida aquest objecte" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 +msgid "Preview hollowed and drilled model" +msgstr "Vista prèvia del model buit i perforat" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 msgid "Offset" msgstr "Desplaçament" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 msgid "Quality" msgstr "Qualitat" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3905 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 +#: src/libslic3r/PrintConfig.cpp:4037 msgid "Closing distance" msgstr "Distància de tancament" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 -msgid "Hole diameter" -msgstr "Diàmetre del forat" +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 +msgid "Hole diameter" +msgstr "Diàmetre del forat" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 +msgid "Hole depth" +msgstr "Profunditat del forat" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 +msgid "Remove selected holes" +msgstr "Elimina els forats seleccionats" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 +msgid "Remove all holes" +msgstr "Elimina tots els forats" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 +msgid "Show supports" +msgstr "Mostra els suports" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:242 +msgid "Add drainage hole" +msgstr "Afegeix un forat de drenatge" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:361 +msgid "Delete drainage hole" +msgstr "Suprimeix el forat de drenatge" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:655 +msgid "Hollowing parameter change" +msgstr "Canvi de paràmetre de buidat" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:739 +msgid "Change drainage hole diameter" +msgstr "Canvia el diàmetre del forat de drenatge" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:827 +msgid "Hollow and drill" +msgstr "Buidat i perforat" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:869 +msgid "Move drainage hole" +msgstr "Mou el forat de drenatge" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:64 +msgid "No feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:65 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:76 +msgid "Vertex" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:66 +msgid "Edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:68 +msgid "Plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:77 +msgid "Point on edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:78 +msgid "Point on circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:79 +msgid "Point on plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:89 +msgid "Center of edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:90 +msgid "Center of circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:554 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2029 +msgid "Measure" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1236 +msgid "Edit to scale" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1258 +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:161 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:236 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:776 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:794 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:817 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:831 +#: src/libslic3r/PrintConfig.cpp:4713 +msgid "Scale" +msgstr "Escala" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1362 +msgctxt "Verb" +msgid "Scale" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1541 +msgid "##angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1740 +msgid "Measure tool debug" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1824 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1851 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1857 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1886 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1893 +msgid "Unselect feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1830 +msgid "Unselect center" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1835 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1862 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1898 +msgid "Select center" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1840 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1867 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1903 +msgid "Unselect point" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1846 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1873 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1910 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select point" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Shift" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Enable point selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2007 +msgid "Restart selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1952 +msgid "Esc" +msgstr "Esc" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1955 +msgid "Unselect" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 -msgid "Hole depth" -msgstr "Profunditat del forat" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1999 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2001 +msgid "Selection" +msgstr "Selecció" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 -msgid "Remove selected holes" -msgstr "Elimina els forats seleccionats" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2021 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +msgid "Copy to clipboard" +msgstr "Copieu al porta-retalls" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 -msgid "Remove all holes" -msgstr "Elimina tots els forats" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2038 +msgid "Angle" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 -msgid "Show supports" -msgstr "Mostra els suports" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Perpendicular distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:287 -msgid "Add drainage hole" -msgstr "Afegeix un forat de drenatge" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:403 -msgid "Delete drainage hole" -msgstr "Suprimeix el forat de drenatge" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2062 +msgid "Direct distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:590 -msgid "Hollowing parameter change" -msgstr "Canvi de paràmetre de buidat" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2072 +msgid "Distance XYZ" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:667 -msgid "Change drainage hole diameter" -msgstr "Canvia el diàmetre del forat de drenatge" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:163 +msgid "Entering Measure gizmo" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:761 -msgid "Hollow and drill" -msgstr "Buidat i perforat" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:164 +msgid "Leaving Measure gizmo" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:811 -msgid "Move drainage hole" -msgstr "Mou el forat de drenatge" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:165 +msgid "Measure gizmo editing" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:27 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:28 #, boost-format msgid "" "Your printer has more extruders than the multi-material painting gizmo " @@ -2877,83 +4083,87 @@ msgstr "" "suports multimaterial. Per això, només els primers %1% extrusors podran ser " "utilitzats per pintar." -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:45 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:46 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 msgid "Multimaterial painting" msgstr "Pintura multimaterial" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 msgid "First color" msgstr "Primer color" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 msgid "Second color" msgstr "Segon color" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:120 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:671 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:642 msgid "Remove painted color" msgstr "Elimina el color pintat" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 msgid "Clear all" msgstr "Esborrar tot" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:129 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 msgid "Bucket fill" msgstr "Farciment de cubs" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:404 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:397 msgid "Paints neighboring facets that have the same color." msgstr "Pinta facetes veïnes que tenen el mateix color." -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:450 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:443 msgid "Split bigger facets into smaller ones while the object is painted." msgstr "" "Divideix les facetes més grans en altres més petites mentre es pinta " "l'objecte." -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:674 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:645 #, boost-format msgid "Painted using: Extruder %1%" msgstr "Pintat usant: Extrusor %1%" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:118 +msgid "Entering Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:119 +msgid "Leaving Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:120 +msgid "Multimaterial painting editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:76 msgid "Move" msgstr "Moure" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:466 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4532 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:643 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:745 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:775 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:813 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:830 +#: src/libslic3r/PrintConfig.cpp:4698 msgid "Rotate" msgstr "Girar" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:505 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:707 msgid "Optimize orientation" msgstr "Optimitzar l'orientació" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:552 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:319 -msgid "Apply" -msgstr "Aplicar" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:79 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4547 -msgid "Scale" -msgstr "Escala" +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:194 +msgid "Gizmo-Scale" +msgstr "Escala de Gizmo" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 msgid "Enforce seam" msgstr "Força la costura" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:38 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:255 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:252 msgid "Block seam" msgstr "Bloqueja la costura" @@ -2961,275 +4171,277 @@ msgstr "Bloqueja la costura" msgid "Seam painting" msgstr "Pintat de costures" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:23 +msgid "Entering Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:24 +msgid "Leaving Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:25 +msgid "Paint-on seam editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:105 msgid "Mesh name" msgstr "Nom de la malla" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:69 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:107 msgid "Detail level" msgstr "Nivell de detall" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:108 msgid "Decimate ratio" msgstr "Relació de decimació" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:113 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:147 #, boost-format msgid "" "Processing model '%1%' with more than 1M triangles could be slow. It is " -"highly recommend to reduce amount of triangles." +"highly recommended to reduce amount of triangles." msgstr "" -"El processament del model '%1%' amb més de 1M de triangles podria ser lent. " -"És molt recomanable reduir la quantitat de triangles." -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:116 -#: src/slic3r/GUI/GUI_Factories.cpp:705 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:150 +#: src/slic3r/GUI/GUI_Factories.cpp:789 msgid "Simplify model" msgstr "Simplificar el model" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:143 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:177 msgid "Simplify" msgstr "Simplificar" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:156 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:190 msgid "Simplification is currently only allowed when a single part is selected" msgstr "" "La simplificació de moment només es permet quan se selecciona una sola peça" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 -#: src/slic3r/GUI/PrintHostDialogs.cpp:373 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:191 +#: src/slic3r/GUI/MainFrame.cpp:1246 src/slic3r/GUI/MainFrame.cpp:1716 +#: src/slic3r/GUI/PrintHostDialogs.cpp:425 msgid "Error" msgstr "Error" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:250 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:294 msgid "Extra high" msgstr "Extra alt" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:251 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:295 msgid "High" msgstr "Alto" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:252 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:296 msgid "Medium" msgstr "Mig" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:297 msgid "Low" msgstr "Baix" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:254 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:298 msgid "Extra low" msgstr "Extra baix" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:304 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#, boost-format +msgid "" +"Multipart object can be simplified only by %1%. If you want specify %2% " +"process it separately." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:352 #, c-format, boost-format msgid "%d triangles" msgstr "%d triangles" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:307 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:355 msgid "Show wireframe" msgstr "Mostra estructura de xarxa" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:313 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:361 msgid "Operation already cancelling. Please wait few seconds." msgstr "Operació ja cancel·lada. Si us plau, espereu uns segons." -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:370 msgid "Can't apply when proccess preview." msgstr "No es pot aplicar quan la visualització prèvia del procés." -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:329 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:377 #, boost-format msgid "Process %1% / 100" msgstr "Procés %1% / 100" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:479 -#, boost-format -msgid "Simplify %1%" -msgstr "Simplificar %1%" +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:542 +msgid "Simplify " +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:543 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"simplifying the mesh." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:67 +msgid "Entering SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:68 +msgid "Leaving SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:35 msgid "Head diameter" msgstr "Diàmetre del capçal" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:36 msgid "Lock supports under new islands" msgstr "Bloquejar suports sota noves illes" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:37 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268 msgid "Remove selected points" msgstr "Suprimeix els punts seleccionats" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:38 msgid "Remove all points" msgstr "Suprimeix tots els punts" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1226 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1271 msgid "Apply changes" msgstr "Aplica els canvis" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1227 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1272 msgid "Discard changes" msgstr "Descarta els canvis" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 msgid "Minimal points distance" msgstr "Distància mínima de punts" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3735 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/libslic3r/PrintConfig.cpp:3867 msgid "Support points density" msgstr "Densitat de punts de suport" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1229 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1274 msgid "Auto-generate points" msgstr "Generació automàtica de punts" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 msgid "Manual editing" msgstr "Edició manual" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:372 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:307 msgid "Add support point" msgstr "Afegir punt de suport" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:522 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:460 msgid "Delete support point" msgstr "Esborra punt de suport" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:702 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:626 msgid "Change point head diameter" msgstr "Canviar diàmetre del cap de punta" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:770 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:696 msgid "Support parameter change" msgstr "Canvi de paràmetres de suport" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:876 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:806 msgid "SLA Support Points" msgstr "Punts de suport SLA" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:814 msgid "Do you want to save your manually edited support points?" msgstr "Voleu desar els punts de suport editats manualment?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:898 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:815 msgid "Save support points?" msgstr "Desar punts de suport?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:958 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:880 msgid "Move support point" msgstr "Mou el punt de suport" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1051 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:987 msgid "Support points edit" msgstr "Edició de punts de suport" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1131 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1117 msgid "Autogeneration will erase all manually edited points." msgstr "La generació automàtica esborrarà tots els punts editats manualment." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1132 -msgid "Are you sure you want to do it?" -msgstr "Esteu segur que voleu fer-ho?" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1138 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1124 msgid "Autogenerate support points" msgstr "Autogenera els punts de suport" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1186 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 msgid "SLA gizmo keyboard shortcuts" msgstr "Eina de dreceres de teclat SLA" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1197 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1242 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "Nota: algunes dreceres només funcionen en mode de (no)edició." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 -msgid "Left click" -msgstr "Clic esquerre" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 msgid "Add point" msgstr "Afegeix un punt" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 -msgid "Right click" -msgstr "Clic dret" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 msgid "Remove point" msgstr "Suprimeix el punt" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 -msgid "Drag" -msgstr "Arrossegar" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 msgid "Move point" msgstr "Moure punt" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 msgid "Add point to selection" msgstr "Afegeix un punt a la selecció" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 msgid "Remove point from selection" msgstr "Suprimeix el punt de la selecció" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 msgid "Select by rectangle" msgstr "Selecciona per rectangle" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 msgid "Deselect by rectangle" msgstr "Desmarca per rectangle" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1267 msgid "Select all points" msgstr "Selecciona tots els punts" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Mouse wheel" msgstr "Roda del ratolí" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Move clipping plane" msgstr "Moure plànol de retall" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1225 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1270 msgid "Reset clipping plane" msgstr "Restablir pla de retall" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1228 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273 msgid "Switch to editing mode" msgstr "Canvia al mode d'edició" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:196 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:204 msgid "" "ERROR: Please close all manipulators available from the left toolbar first" msgstr "" "ERROR: Si us plau, tanqueu primer tots els modificadors disponibles a la " "barra d'eines de l'esquerra" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:561 -msgid "Gizmo-Scale" -msgstr "Escala de Gizmo" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:673 -msgid "Gizmo-Place on Face" -msgstr "Gizmo-Col·locar a Cara" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:1270 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:998 msgid "" "You are currently editing SLA support points. Please, apply or discard your " "changes first." @@ -3237,16 +4449,16 @@ msgstr "" "Estàs editant els punts de suport del SLA. Si us plau, aplica o descarta els " "teus canvis primer." -#: src/slic3r/GUI/GUI.cpp:292 +#: src/slic3r/GUI/GUI.cpp:287 msgid "Undefined" msgstr "Indefinit" -#: src/slic3r/GUI/GUI.cpp:317 +#: src/slic3r/GUI/GUI.cpp:308 #, boost-format msgid "%1% was substituted with %2%" msgstr "%1% ha estat substituït amb %2%" -#: src/slic3r/GUI/GUI.cpp:326 +#: src/slic3r/GUI/GUI.cpp:317 msgid "" "Most likely the configuration was produced by a newer version of PrusaSlicer " "or by some PrusaSlicer fork." @@ -3254,23 +4466,23 @@ msgstr "" "El més probable és que la configuració hagi estat produïda per una versió " "més recent de PrusaSlicer o algun fork de PrusaSlicer." -#: src/slic3r/GUI/GUI.cpp:327 +#: src/slic3r/GUI/GUI.cpp:318 msgid "The following values were substituted:" msgstr "S'han substituït els valors següents:" -#: src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/GUI.cpp:319 msgid "Review the substitutions and adjust them if needed." msgstr "Revisa les substitucions i ajusta-les si cal." -#: src/slic3r/GUI/GUI.cpp:338 src/slic3r/GUI/Plater.cpp:820 +#: src/slic3r/GUI/GUI.cpp:329 src/slic3r/GUI/Plater.cpp:850 msgid "SLA print settings" msgstr "Configuració impressió SLA" -#: src/slic3r/GUI/GUI.cpp:342 src/slic3r/GUI/PhysicalPrinterDialog.cpp:157 +#: src/slic3r/GUI/GUI.cpp:333 src/slic3r/GUI/PhysicalPrinterDialog.cpp:158 msgid "Physical Printer" msgstr "Impressora física" -#: src/slic3r/GUI/GUI.cpp:355 +#: src/slic3r/GUI/GUI.cpp:346 msgid "" "Configuration bundle was loaded, however some configuration values were not " "recognized." @@ -3278,7 +4490,7 @@ msgstr "" "El paquet de configuració s'ha carregat, però s'han reconegut alguns valors " "de configuració." -#: src/slic3r/GUI/GUI.cpp:365 +#: src/slic3r/GUI/GUI.cpp:356 #, boost-format msgid "" "Configuration file \"%1%\" was loaded, however some configuration values " @@ -3287,15 +4499,15 @@ msgstr "" "El fitxer de configuració \"%1%\" s'ha carregat, però no s'han reconegut " "alguns valors de configuració." -#: src/slic3r/GUI/GUI_App.cpp:266 +#: src/slic3r/GUI/GUI_App.cpp:275 msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." msgstr "està basat en Slic3r d'Alessandro Ranellucci i la comunitat RepRap." -#: src/slic3r/GUI/GUI_App.cpp:267 +#: src/slic3r/GUI/GUI_App.cpp:276 msgid "Developed by Prusa Research." msgstr "Desenvolupat per Prusa Research." -#: src/slic3r/GUI/GUI_App.cpp:269 +#: src/slic3r/GUI/GUI_App.cpp:278 msgid "" "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." @@ -3303,11 +4515,11 @@ msgstr "" "Contribucions de Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik i molts altres." -#: src/slic3r/GUI/GUI_App.cpp:270 -msgid "Artwork model by Leslie Ing" -msgstr "Model artístic Leslie Ing" +#: src/slic3r/GUI/GUI_App.cpp:279 +msgid "Artwork model by Creative Tools" +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:411 +#: src/slic3r/GUI/GUI_App.cpp:420 #, boost-format msgid "" "Starting with %1% 2.3, configuration directory on Linux has changed " @@ -3342,20 +4554,20 @@ msgstr "" "\n" "Què vols fer ara?" -#: src/slic3r/GUI/GUI_App.cpp:419 +#: src/slic3r/GUI/GUI_App.cpp:428 #, c-format, boost-format msgid "%s - BREAKING CHANGE" msgstr "%s - CANVI IMPORTANT" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Quit, I will move my data now" msgstr "Surt, mouré les meves dades ara" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Start the application" msgstr "Inicia l'aplicació" -#: src/slic3r/GUI/GUI_App.cpp:699 +#: src/slic3r/GUI/GUI_App.cpp:725 #, c-format, boost-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -3370,11 +4582,11 @@ msgstr "" "\n" "L'aplicació es tancarà." -#: src/slic3r/GUI/GUI_App.cpp:702 +#: src/slic3r/GUI/GUI_App.cpp:728 msgid "Fatal error" msgstr "Error fatal" -#: src/slic3r/GUI/GUI_App.cpp:706 +#: src/slic3r/GUI/GUI_App.cpp:732 msgid "" "PrusaSlicer has encountered a localization error. Please report to " "PrusaSlicer team, what language was active and in which scenario this issue " @@ -3388,16 +4600,16 @@ msgstr "" "\n" "L'aplicació es tancarà ara." -#: src/slic3r/GUI/GUI_App.cpp:709 +#: src/slic3r/GUI/GUI_App.cpp:735 msgid "Critical error" msgstr "Error crític" -#: src/slic3r/GUI/GUI_App.cpp:714 +#: src/slic3r/GUI/GUI_App.cpp:740 #, boost-format msgid "Internal error: %1%" msgstr "Error intern: %1%" -#: src/slic3r/GUI/GUI_App.cpp:909 src/slic3r/GUI/GUI_App.cpp:1007 +#: src/slic3r/GUI/GUI_App.cpp:954 src/slic3r/GUI/GUI_App.cpp:1051 msgid "" "Error parsing PrusaSlicer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error. Your user profiles will " @@ -3407,7 +4619,7 @@ msgstr "" "està danyat. Intenta eliminar manualment el fitxer per recuperar-se de " "l'error. Els vostres perfils d'usuari no es veuran afectats." -#: src/slic3r/GUI/GUI_App.cpp:915 src/slic3r/GUI/GUI_App.cpp:1013 +#: src/slic3r/GUI/GUI_App.cpp:960 src/slic3r/GUI/GUI_App.cpp:1057 msgid "" "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error." @@ -3416,12 +4628,12 @@ msgstr "" "probablement estigui danyat. Intenta eliminar manualment el fitxer per " "recuperar-se de l'error." -#: src/slic3r/GUI/GUI_App.cpp:962 +#: src/slic3r/GUI/GUI_App.cpp:1006 #, boost-format msgid "You are opening %1% version %2%." msgstr "Estàs obrint %1% versió %2%." -#: src/slic3r/GUI/GUI_App.cpp:965 +#: src/slic3r/GUI/GUI_App.cpp:1009 #, boost-format msgid "" "The active configuration was created by %1% %2%,\n" @@ -3440,7 +4652,7 @@ msgstr "" "Si és així, es farà una còpia de seguretat de la configuració activa abans " "d'importar la nova configuració." -#: src/slic3r/GUI/GUI_App.cpp:973 +#: src/slic3r/GUI/GUI_App.cpp:1017 #, boost-format msgid "" "An existing configuration was found in %3%\n" @@ -3453,19 +4665,19 @@ msgstr "" "\n" "S'ha d'importar aquesta configuració?" -#: src/slic3r/GUI/GUI_App.cpp:981 +#: src/slic3r/GUI/GUI_App.cpp:1025 msgid "Import" msgstr "Importar" -#: src/slic3r/GUI/GUI_App.cpp:982 +#: src/slic3r/GUI/GUI_App.cpp:1026 msgid "Don't import" msgstr "No importar" -#: src/slic3r/GUI/GUI_App.cpp:990 +#: src/slic3r/GUI/GUI_App.cpp:1034 msgid "Continue and import newer configuration?" msgstr "Voleu continuar i instal·lar les actualitzacions de configuració?" -#: src/slic3r/GUI/GUI_App.cpp:1051 +#: src/slic3r/GUI/GUI_App.cpp:1095 msgid "" "You are running a 32 bit build of PrusaSlicer on 64-bit Windows.\n" "32 bit build of PrusaSlicer will likely not be able to utilize all the RAM " @@ -3481,7 +4693,7 @@ msgstr "" "de https://www.prusa3d.cz/prusaslicer/.\n" "Voleu continuar?" -#: src/slic3r/GUI/GUI_App.cpp:1134 +#: src/slic3r/GUI/GUI_App.cpp:1182 #, c-format, boost-format msgid "" "%s\n" @@ -3490,46 +4702,37 @@ msgstr "" "%s\n" "Voleu continuar?" -#: src/slic3r/GUI/GUI_App.cpp:1136 src/slic3r/GUI/GUI_App.cpp:3101 -#: src/slic3r/GUI/Plater.cpp:1726 src/slic3r/GUI/UnsavedChangesDialog.cpp:889 +#: src/slic3r/GUI/GUI_App.cpp:1184 src/slic3r/GUI/GUI_App.cpp:3302 +#: src/slic3r/GUI/Plater.cpp:1736 src/slic3r/GUI/UnsavedChangesDialog.cpp:917 msgid "Remember my choice" msgstr "Recorda la meva elecció" -#: src/slic3r/GUI/GUI_App.cpp:1178 +#: src/slic3r/GUI/GUI_App.cpp:1226 msgid "Loading configuration" msgstr "S'està carregant la configuració" -#: src/slic3r/GUI/GUI_App.cpp:1209 -#, boost-format -msgid "New release version %1% is available." -msgstr "Hi ha disponible una nova versió %1%." - -#: src/slic3r/GUI/GUI_App.cpp:1210 -msgid "See Download page." -msgstr "Veure pàgina de Descàrregues." - -#: src/slic3r/GUI/GUI_App.cpp:1224 +#: src/slic3r/GUI/GUI_App.cpp:1257 #, boost-format msgid "New prerelease version %1% is available." msgstr "La nova versió prellançament %1% està disponible." -#: src/slic3r/GUI/GUI_App.cpp:1225 +#: src/slic3r/GUI/GUI_App.cpp:1258 msgid "See Releases page." msgstr "Consulteu pàgina de llançaments." -#: src/slic3r/GUI/GUI_App.cpp:1262 +#: src/slic3r/GUI/GUI_App.cpp:1313 msgid "Preparing settings tabs" msgstr "Preparant pestanyes de configuració" -#: src/slic3r/GUI/GUI_App.cpp:1336 src/slic3r/GUI/Preferences.cpp:287 +#: src/slic3r/GUI/GUI_App.cpp:1393 src/slic3r/GUI/Preferences.cpp:405 msgid "Restore window position on start" msgstr "Restaura la posició de la finestra a l'inici" -#: src/slic3r/GUI/GUI_App.cpp:1338 +#: src/slic3r/GUI/GUI_App.cpp:1395 msgid "PrusaSlicer started after a crash" msgstr "PrusaSlicer s'ha reiniciat després d'una fallada" -#: src/slic3r/GUI/GUI_App.cpp:1339 +#: src/slic3r/GUI/GUI_App.cpp:1396 #, boost-format msgid "" "PrusaSlicer crashed last time when attempting to set window position.\n" @@ -3553,24 +4756,24 @@ msgstr "" "\". En cas contrari, és probable que l'aplicació es torni a crashejar la " "propera vegada." -#: src/slic3r/GUI/GUI_App.cpp:1351 +#: src/slic3r/GUI/GUI_App.cpp:1408 #, boost-format msgid "Disable \"%1%\"" msgstr "Deshabilitar \"%1%\"" -#: src/slic3r/GUI/GUI_App.cpp:1352 +#: src/slic3r/GUI/GUI_App.cpp:1409 #, boost-format msgid "Leave \"%1%\" enabled" msgstr "Deixa \"%1%\" habilitat" -#: src/slic3r/GUI/GUI_App.cpp:1679 +#: src/slic3r/GUI/GUI_App.cpp:1780 msgid "" "You have the following presets with saved options for \"Print Host upload\"" msgstr "" "Teniu els paràmetres preestablerts següents amb opcions desades per a " "\"Pujada del host d'impressió\"" -#: src/slic3r/GUI/GUI_App.cpp:1683 +#: src/slic3r/GUI/GUI_App.cpp:1784 msgid "" "But since this version of PrusaSlicer we don't show this information in " "Printer Settings anymore.\n" @@ -3580,7 +4783,7 @@ msgstr "" "informació als paràmetres d'impressora.\n" "Els paràmetres es mostraran a la configuració d'impressora física." -#: src/slic3r/GUI/GUI_App.cpp:1685 +#: src/slic3r/GUI/GUI_App.cpp:1786 msgid "" "By default new Printer devices will be named as \"Printer N\" during its " "creation.\n" @@ -3591,139 +4794,148 @@ msgstr "" "Nota: Aquest nom es pot canviar posteriorment als paràmetres d'impressora " "física" -#: src/slic3r/GUI/GUI_App.cpp:1689 src/slic3r/GUI/PhysicalPrinterDialog.cpp:726 +#: src/slic3r/GUI/GUI_App.cpp:1790 src/slic3r/GUI/PhysicalPrinterDialog.cpp:798 msgid "Information" msgstr "Informació" -#: src/slic3r/GUI/GUI_App.cpp:1702 src/slic3r/GUI/GUI_App.cpp:1713 +#: src/slic3r/GUI/GUI_App.cpp:1803 src/slic3r/GUI/GUI_App.cpp:1814 msgid "Recreating" msgstr "Recreant" -#: src/slic3r/GUI/GUI_App.cpp:1716 +#: src/slic3r/GUI/GUI_App.cpp:1817 msgid "Loading of current presets" msgstr "Carregant els paràmetres actuals" -#: src/slic3r/GUI/GUI_App.cpp:1721 +#: src/slic3r/GUI/GUI_App.cpp:1822 msgid "Loading of a mode view" msgstr "S'està carregant mode visualització" -#: src/slic3r/GUI/GUI_App.cpp:1859 +#: src/slic3r/GUI/GUI_App.cpp:1961 msgid "Choose one file (3MF/AMF):" msgstr "Trieu un fitxer (3MF/AMF):" -#: src/slic3r/GUI/GUI_App.cpp:1871 +#: src/slic3r/GUI/GUI_App.cpp:1973 msgid "Choose one or more files (STL/3MF/STEP/OBJ/AMF/PRUSA):" msgstr "Trieu un o més fitxers (STL / 3MF / STEP / OBJ / AMF / PRUSA):" -#: src/slic3r/GUI/GUI_App.cpp:1883 +#: src/slic3r/GUI/GUI_App.cpp:1984 +msgid "Choose ZIP file:" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1996 msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" msgstr "Trieu un fitxer (GCODE/. GCO/. G/.ngc/NGC):" -#: src/slic3r/GUI/GUI_App.cpp:1894 +#: src/slic3r/GUI/GUI_App.cpp:2007 msgid "Changing of an application language" msgstr "Canvi d'idioma d'una aplicació" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Select the language" msgstr "Seleccioneu l'idioma" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Language" msgstr "Idioma" -#: src/slic3r/GUI/GUI_App.cpp:2182 -msgid "modified" -msgstr "modificat" +#: src/slic3r/GUI/GUI_App.cpp:2363 +msgid "" +"Simple mode supports manipulation with single-part object(s)\n" +"or object(s) with support modifiers only." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2365 +msgid "Please check your object list before mode changing." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2366 +msgid "Change application mode" +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2236 +#: src/slic3r/GUI/GUI_App.cpp:2397 #, c-format, boost-format msgid "Run %s" msgstr "Executar %s" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "&Configuration Snapshots" msgstr "Instantànies de &Configuració" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "Inspect / activate configuration snapshots" msgstr "Inspeccionar / activar instantànies de configuració" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Take Configuration &Snapshot" msgstr "&Prendre una Instanània de Configuració" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Capture a configuration snapshot" msgstr "Captura una instantània de configuració" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for Configuration Updates" msgstr "Comprova si hi ha actualitzacions de configuració" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for configuration updates" msgstr "Comprova si hi ha actualitzacions de configuració" -#: src/slic3r/GUI/GUI_App.cpp:2249 +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for Application Updates" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for new version of application" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2411 msgid "&Preferences" msgstr "&Preferències" -#: src/slic3r/GUI/GUI_App.cpp:2255 +#: src/slic3r/GUI/GUI_App.cpp:2417 msgid "Application preferences" msgstr "Preferències de l'aplicació" -#: src/slic3r/GUI/GUI_App.cpp:2260 src/slic3r/GUI/wxExtensions.cpp:708 -msgid "Simple" -msgstr "Simple" - -#: src/slic3r/GUI/GUI_App.cpp:2260 +#: src/slic3r/GUI/GUI_App.cpp:2422 msgid "Simple View Mode" msgstr "Mode de visualització simple" -#: src/slic3r/GUI/GUI_App.cpp:2262 src/slic3r/GUI/wxExtensions.cpp:710 -msgctxt "Mode" -msgid "Advanced" -msgstr "Mode Avançat" - -#: src/slic3r/GUI/GUI_App.cpp:2262 +#: src/slic3r/GUI/GUI_App.cpp:2424 msgid "Advanced View Mode" msgstr "Mode de visualització avançada" -#: src/slic3r/GUI/GUI_App.cpp:2263 src/slic3r/GUI/wxExtensions.cpp:711 -msgid "Expert" -msgstr "Expert" - -#: src/slic3r/GUI/GUI_App.cpp:2263 +#: src/slic3r/GUI/GUI_App.cpp:2425 msgid "Expert View Mode" msgstr "Mode de visualització expert" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 msgid "Mode" msgstr "Mode" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 #, c-format, boost-format msgid "%s View Mode" msgstr "%s Tipus de vista" -#: src/slic3r/GUI/GUI_App.cpp:2271 +#: src/slic3r/GUI/GUI_App.cpp:2433 msgid "&Language" msgstr "&Idioma" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Flash Printer &Firmware" msgstr "Grava el &firmware a la impressora" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Upload a firmware image into an Arduino based printer" msgstr "" "Carregar una imatge de microprogramari a una impressora basada en Arduino" -#: src/slic3r/GUI/GUI_App.cpp:2294 +#: src/slic3r/GUI/GUI_App.cpp:2459 msgid "Taking a configuration snapshot" msgstr "Prenent una instantània de la configuració" -#: src/slic3r/GUI/GUI_App.cpp:2295 +#: src/slic3r/GUI/GUI_App.cpp:2460 msgid "" "Some presets are modified and the unsaved changes will not be captured by " "the configuration snapshot." @@ -3731,32 +4943,28 @@ msgstr "" "Alguns paràmetres estan modificats i els canvis no desats no seran capturats " "per la instantània de configuració." -#: src/slic3r/GUI/GUI_App.cpp:2296 +#: src/slic3r/GUI/GUI_App.cpp:2461 msgid "Snapshot name" msgstr "Nom de la instantània" -#: src/slic3r/GUI/GUI_App.cpp:2312 +#: src/slic3r/GUI/GUI_App.cpp:2477 msgid "Loading a configuration snapshot" msgstr "S'està carregant una instantània de configuració" -#: src/slic3r/GUI/GUI_App.cpp:2321 +#: src/slic3r/GUI/GUI_App.cpp:2486 #, boost-format msgid "Continue to activate a configuration snapshot %1%?" msgstr "Continuar activant una instantània de configuració %1%?" -#: src/slic3r/GUI/GUI_App.cpp:2335 +#: src/slic3r/GUI/GUI_App.cpp:2500 msgid "Failed to activate configuration snapshot." msgstr "No s'ha pogut activar la instantània de configuració." -#: src/slic3r/GUI/GUI_App.cpp:2354 -msgid "Restart application" -msgstr "Reiniciar l'aplicació" - -#: src/slic3r/GUI/GUI_App.cpp:2388 +#: src/slic3r/GUI/GUI_App.cpp:2520 msgid "Language selection" msgstr "Selecció d'idiomes" -#: src/slic3r/GUI/GUI_App.cpp:2391 +#: src/slic3r/GUI/GUI_App.cpp:2523 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." @@ -3764,89 +4972,104 @@ msgstr "" "Canviar l'idioma requereix reiniciar l'aplicació.\n" "Perdràs tot el contingut situat a la base." -#: src/slic3r/GUI/GUI_App.cpp:2393 src/slic3r/GUI/Preferences.cpp:582 +#: src/slic3r/GUI/GUI_App.cpp:2525 src/slic3r/GUI/Preferences.cpp:730 +#: src/slic3r/GUI/Selection.cpp:1695 msgid "Do you want to proceed?" msgstr "Voleu continuar?" -#: src/slic3r/GUI/GUI_App.cpp:2420 +#: src/slic3r/GUI/GUI_App.cpp:2552 msgid "&Configuration" msgstr "&Configuració" -#: src/slic3r/GUI/GUI_App.cpp:2534 src/slic3r/GUI/GUI_App.cpp:2595 -msgid "The preset modifications are successfully saved" -msgid_plural "The presets modifications are successfully saved" -msgstr[0] "Les modificacions del paràmetre s'han desat correctament" -msgstr[1] "Les modificacions dels paràmetres s'han desat correctament" +#: src/slic3r/GUI/GUI_App.cpp:2560 +msgid "Restart application" +msgstr "Reiniciar l'aplicació" -#: src/slic3r/GUI/GUI_App.cpp:2598 +#: src/slic3r/GUI/GUI_App.cpp:2726 msgid "For new project all modifications will be reseted" msgstr "En cas d'un nou projecte, totes les modificacions es restabliran" -#: src/slic3r/GUI/GUI_App.cpp:2636 +#: src/slic3r/GUI/GUI_App.cpp:2764 msgid "Loading a new project while the current project is modified." msgstr "" "S'està carregant un projecte nou mentre es modifica el projecte actual." -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Project is loading" msgstr "El projecte s'està carregant" -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Opening new project while some presets are unsaved." msgstr "Obre un nou projecte mentre alguns paràmetres estan sense desar." -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "The uploads are still ongoing" msgstr "Les pujades encara estan en curs" -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "Stop them and continue anyway?" msgstr "Aturar-les i continuar igualment?" -#: src/slic3r/GUI/GUI_App.cpp:2662 +#: src/slic3r/GUI/GUI_App.cpp:2790 msgid "Ongoing uploads" msgstr "Càrregues en curs" -#: src/slic3r/GUI/GUI_App.cpp:2876 -msgid "It's impossible to print multi-part object(s) with SLA technology." -msgstr "És impossible imprimir objectes de diverses peces amb tecnologia SLA." +#: src/slic3r/GUI/GUI_App.cpp:3026 +msgid "" +"It's impossible to print object(s) which contains parameter modifiers with " +"SLA technology." +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2877 src/slic3r/GUI/Jobs/SLAImportJob.cpp:235 -#: src/slic3r/GUI/Plater.cpp:2459 +#: src/slic3r/GUI/GUI_App.cpp:3027 src/slic3r/GUI/Jobs/SLAImportJob.cpp:149 +#: src/slic3r/GUI/Plater.cpp:2536 msgid "Please check your object list before preset changing." msgstr "" "Comproveu la llista d'objectes abans de canviar els paràmetres inicials." -#: src/slic3r/GUI/GUI_App.cpp:2901 +#: src/slic3r/GUI/GUI_App.cpp:3070 msgid "Configuration is editing from ConfigWizard" msgstr "La configuració s'edita des de ConfigWizard" -#: src/slic3r/GUI/GUI_App.cpp:2926 +#: src/slic3r/GUI/GUI_App.cpp:3088 +#, boost-format +msgid "Welcome to %1% version %2%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3090 +#, boost-format +msgid "" +"Do you wish to register downloads from Printables.com\n" +"for this %1% %2% executable?\n" +"\n" +"Downloads can be registered for only 1 executable at time." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3118 msgid "Select a gcode file:" msgstr "Seleccioneu un fitxer gcode:" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "Open hyperlink in default browser?" msgstr "Obrir l'hiperenllaç al navegador per defecte?" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "PrusaSlicer: Open hyperlink" msgstr "PrusaSlicer: Obrir hipervincle" -#: src/slic3r/GUI/GUI_App.cpp:3105 src/slic3r/GUI/Preferences.cpp:382 +#: src/slic3r/GUI/GUI_App.cpp:3306 src/slic3r/GUI/Preferences.cpp:593 msgid "Suppress to open hyperlink in browser" msgstr "Suprimir per obrir hiperenllaç al navegador" -#: src/slic3r/GUI/GUI_App.cpp:3107 src/slic3r/GUI/Plater.cpp:1732 +#: src/slic3r/GUI/GUI_App.cpp:3308 src/slic3r/GUI/Plater.cpp:1742 msgid "PrusaSlicer will remember your choice." msgstr "PrusaSlicer recordarà la vostra elecció." -#: src/slic3r/GUI/GUI_App.cpp:3108 +#: src/slic3r/GUI/GUI_App.cpp:3309 msgid "You will not be asked about it again on hyperlinks hovering." msgstr "" "No se us tornarà a preguntar al respecte quan passis per sobre de l'enllaç." -#: src/slic3r/GUI/GUI_App.cpp:3109 src/slic3r/GUI/Plater.cpp:1736 +#: src/slic3r/GUI/GUI_App.cpp:3310 src/slic3r/GUI/Plater.cpp:1746 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" @@ -3855,57 +5078,71 @@ msgstr "" "Visiteu \"Preferències\" i comproveu \"%1%\"\n" "per canviar la teva elecció." -#: src/slic3r/GUI/GUI_App.cpp:3111 src/slic3r/GUI/Plater.cpp:1738 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:906 +#: src/slic3r/GUI/GUI_App.cpp:3312 src/slic3r/GUI/Plater.cpp:1748 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:934 msgid "PrusaSlicer: Don't ask me again" msgstr "PrusaSlicer: No em tornis a preguntar" -#: src/slic3r/GUI/GUI_Init.cpp:57 src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_App.cpp:3386 +msgid "Check for application update has failed." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3387 +#, boost-format +msgid "No new version is available. Latest release version is %1%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3458 +msgid "Download of new version is already ongoing. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/GUI_Init.cpp:64 src/slic3r/GUI/GUI_Init.cpp:67 msgid "PrusaSlicer GUI initialization failed" msgstr "Hi ha hagut un error en obrir el GUI de PrusaSlicer" -#: src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_Init.cpp:67 #, boost-format msgid "Fatal error, exception catched: %1%" msgstr "Error fatal, excepció detectada: %1%" #: src/slic3r/GUI/GUI_Factories.cpp:54 src/slic3r/GUI/GUI_Factories.cpp:127 -#: src/libslic3r/PrintConfig.cpp:287 src/libslic3r/PrintConfig.cpp:404 -#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:456 -#: src/libslic3r/PrintConfig.cpp:708 src/libslic3r/PrintConfig.cpp:778 -#: src/libslic3r/PrintConfig.cpp:786 src/libslic3r/PrintConfig.cpp:1232 -#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1563 -#: src/libslic3r/PrintConfig.cpp:1955 src/libslic3r/PrintConfig.cpp:2030 -#: src/libslic3r/PrintConfig.cpp:2264 src/libslic3r/PrintConfig.cpp:2850 -#: src/libslic3r/PrintConfig.cpp:2858 src/libslic3r/PrintConfig.cpp:2918 -#: src/libslic3r/PrintConfig.cpp:2927 src/libslic3r/PrintConfig.cpp:3098 +#: src/libslic3r/PrintConfig.cpp:300 src/libslic3r/PrintConfig.cpp:423 +#: src/libslic3r/PrintConfig.cpp:466 src/libslic3r/PrintConfig.cpp:475 +#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:872 +#: src/libslic3r/PrintConfig.cpp:881 src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1376 src/libslic3r/PrintConfig.cpp:1604 +#: src/libslic3r/PrintConfig.cpp:1985 src/libslic3r/PrintConfig.cpp:2060 +#: src/libslic3r/PrintConfig.cpp:2294 src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:2946 src/libslic3r/PrintConfig.cpp:3006 +#: src/libslic3r/PrintConfig.cpp:3015 src/libslic3r/PrintConfig.cpp:3186 msgid "Layers and Perimeters" msgstr "Capes i Perímetres" #: src/slic3r/GUI/GUI_Factories.cpp:56 src/slic3r/GUI/GUI_Factories.cpp:131 -#: src/slic3r/GUI/GUI_Preview.cpp:249 src/slic3r/GUI/Tab.cpp:1547 -#: src/slic3r/GUI/Tab.cpp:1549 src/libslic3r/ExtrusionEntity.cpp:340 -#: src/libslic3r/ExtrusionEntity.cpp:372 src/libslic3r/PrintConfig.cpp:670 -#: src/libslic3r/PrintConfig.cpp:2095 src/libslic3r/PrintConfig.cpp:2104 -#: src/libslic3r/PrintConfig.cpp:2113 src/libslic3r/PrintConfig.cpp:2123 -#: src/libslic3r/PrintConfig.cpp:2132 src/libslic3r/PrintConfig.cpp:2554 -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2568 -#: src/libslic3r/PrintConfig.cpp:2581 src/libslic3r/PrintConfig.cpp:2591 -#: src/libslic3r/PrintConfig.cpp:2599 src/libslic3r/PrintConfig.cpp:2617 -#: src/libslic3r/PrintConfig.cpp:2634 src/libslic3r/PrintConfig.cpp:2655 -#: src/libslic3r/PrintConfig.cpp:2668 src/libslic3r/PrintConfig.cpp:2685 -#: src/libslic3r/PrintConfig.cpp:2703 src/libslic3r/PrintConfig.cpp:2718 -#: src/libslic3r/PrintConfig.cpp:2728 src/libslic3r/PrintConfig.cpp:2737 -#: src/libslic3r/PrintConfig.cpp:2748 src/libslic3r/PrintConfig.cpp:2762 -#: src/libslic3r/PrintConfig.cpp:2778 src/libslic3r/PrintConfig.cpp:2786 -#: src/libslic3r/PrintConfig.cpp:2787 src/libslic3r/PrintConfig.cpp:2796 -#: src/libslic3r/PrintConfig.cpp:2810 src/libslic3r/PrintConfig.cpp:2818 -#: src/libslic3r/PrintConfig.cpp:2832 +#: src/slic3r/GUI/Tab.cpp:1494 src/slic3r/GUI/Tab.cpp:1496 +#: src/libslic3r/PrintConfig.cpp:773 src/libslic3r/PrintConfig.cpp:2125 +#: src/libslic3r/PrintConfig.cpp:2134 src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2153 src/libslic3r/PrintConfig.cpp:2162 +#: src/libslic3r/PrintConfig.cpp:2584 src/libslic3r/PrintConfig.cpp:2590 +#: src/libslic3r/PrintConfig.cpp:2598 src/libslic3r/PrintConfig.cpp:2611 +#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2628 +#: src/libslic3r/PrintConfig.cpp:2644 src/libslic3r/PrintConfig.cpp:2660 +#: src/libslic3r/PrintConfig.cpp:2681 src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2725 +#: src/libslic3r/PrintConfig.cpp:2743 src/libslic3r/PrintConfig.cpp:2753 +#: src/libslic3r/PrintConfig.cpp:2762 src/libslic3r/PrintConfig.cpp:2773 +#: src/libslic3r/PrintConfig.cpp:2785 src/libslic3r/PrintConfig.cpp:2799 +#: src/libslic3r/PrintConfig.cpp:2807 src/libslic3r/PrintConfig.cpp:2808 +#: src/libslic3r/PrintConfig.cpp:2817 src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2840 src/libslic3r/PrintConfig.cpp:2854 +#: src/libslic3r/PrintConfig.cpp:2862 src/libslic3r/PrintConfig.cpp:2873 +#: src/libslic3r/PrintConfig.cpp:2884 src/libslic3r/PrintConfig.cpp:2893 +#: src/libslic3r/PrintConfig.cpp:2903 src/libslic3r/PrintConfig.cpp:2915 msgid "Support material" msgstr "Material de suport" #: src/slic3r/GUI/GUI_Factories.cpp:59 src/slic3r/GUI/GUI_Factories.cpp:135 -#: src/libslic3r/PrintConfig.cpp:3054 src/libslic3r/PrintConfig.cpp:3062 +#: src/libslic3r/PrintConfig.cpp:3142 src/libslic3r/PrintConfig.cpp:3150 msgid "Wipe options" msgstr "Opcions de neteja" @@ -3913,330 +5150,351 @@ msgstr "Opcions de neteja" msgid "Pad and Support" msgstr "Pad i suports" -#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/GUI_Preview.cpp:245 -#: src/slic3r/GUI/Tab.cpp:1513 src/libslic3r/ExtrusionEntity.cpp:336 -#: src/libslic3r/ExtrusionEntity.cpp:364 src/libslic3r/PrintConfig.cpp:1579 -#: src/libslic3r/PrintConfig.cpp:1585 src/libslic3r/PrintConfig.cpp:1599 -#: src/libslic3r/PrintConfig.cpp:1609 src/libslic3r/PrintConfig.cpp:1617 -#: src/libslic3r/PrintConfig.cpp:1619 +#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/Tab.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1620 src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1638 src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1656 src/libslic3r/PrintConfig.cpp:1658 msgid "Ironing" msgstr "Planxat" -#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1283 -#: src/libslic3r/PrintConfig.cpp:1284 src/libslic3r/PrintConfig.cpp:1299 -#: src/libslic3r/PrintConfig.cpp:1309 +#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1344 src/libslic3r/PrintConfig.cpp:1356 +#: src/libslic3r/PrintConfig.cpp:1366 msgid "Fuzzy Skin" msgstr "Pell difusa" -#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/GUI_Preview.cpp:220 -#: src/slic3r/GUI/Tab.cpp:1581 src/libslic3r/PrintConfig.cpp:507 -#: src/libslic3r/PrintConfig.cpp:766 src/libslic3r/PrintConfig.cpp:1326 -#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1618 -#: src/libslic3r/PrintConfig.cpp:2020 src/libslic3r/PrintConfig.cpp:2352 -#: src/libslic3r/PrintConfig.cpp:2405 src/libslic3r/PrintConfig.cpp:2903 +#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/Tab.cpp:1536 +#: src/libslic3r/PrintConfig.cpp:526 src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:548 src/libslic3r/PrintConfig.cpp:557 +#: src/libslic3r/PrintConfig.cpp:566 src/libslic3r/PrintConfig.cpp:575 +#: src/libslic3r/PrintConfig.cpp:852 src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1657 +#: src/libslic3r/PrintConfig.cpp:2050 src/libslic3r/PrintConfig.cpp:2383 +#: src/libslic3r/PrintConfig.cpp:2436 src/libslic3r/PrintConfig.cpp:2991 msgid "Speed" msgstr "Velocitat" -#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1623 -#: src/slic3r/GUI/Tab.cpp:2304 src/libslic3r/PrintConfig.cpp:796 -#: src/libslic3r/PrintConfig.cpp:1489 src/libslic3r/PrintConfig.cpp:1997 -#: src/libslic3r/PrintConfig.cpp:2373 src/libslic3r/PrintConfig.cpp:2647 -#: src/libslic3r/PrintConfig.cpp:2675 +#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1585 +#: src/slic3r/GUI/Tab.cpp:2288 src/libslic3r/PrintConfig.cpp:889 +#: src/libslic3r/PrintConfig.cpp:1530 src/libslic3r/PrintConfig.cpp:2027 +#: src/libslic3r/PrintConfig.cpp:2404 src/libslic3r/PrintConfig.cpp:2673 +#: src/libslic3r/PrintConfig.cpp:2701 msgid "Extruders" msgstr "Extrusors" -#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:754 -#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:1218 -#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:2006 -#: src/libslic3r/PrintConfig.cpp:2393 src/libslic3r/PrintConfig.cpp:2656 -#: src/libslic3r/PrintConfig.cpp:2890 +#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:840 +#: src/libslic3r/PrintConfig.cpp:953 src/libslic3r/PrintConfig.cpp:1278 +#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:2036 +#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2682 +#: src/libslic3r/PrintConfig.cpp:2978 msgid "Extrusion Width" msgstr "Amplada de l'extrusió" -#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1533 -#: src/libslic3r/PrintConfig.cpp:517 src/libslic3r/PrintConfig.cpp:528 -#: src/libslic3r/PrintConfig.cpp:544 +#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:631 src/libslic3r/PrintConfig.cpp:642 +#: src/libslic3r/PrintConfig.cpp:655 msgid "Skirt and brim" msgstr "Faldilla i bassa" -#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 -#: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1645 -#: src/slic3r/GUI/Tab.cpp:1649 src/slic3r/GUI/Tab.cpp:2031 -#: src/slic3r/GUI/Tab.cpp:2402 src/slic3r/GUI/Tab.cpp:4729 -#: src/libslic3r/PrintConfig.cpp:260 src/libslic3r/PrintConfig.cpp:495 -#: src/libslic3r/PrintConfig.cpp:1438 src/libslic3r/PrintConfig.cpp:1525 -#: src/libslic3r/PrintConfig.cpp:1572 src/libslic3r/PrintConfig.cpp:2530 -#: src/libslic3r/PrintConfig.cpp:2540 src/libslic3r/PrintConfig.cpp:3078 -#: src/libslic3r/PrintConfig.cpp:3113 src/libslic3r/PrintConfig.cpp:3124 -#: src/libslic3r/PrintConfig.cpp:3139 src/libslic3r/PrintConfig.cpp:3152 -#: src/libslic3r/PrintConfig.cpp:3161 src/libslic3r/PrintConfig.cpp:3173 -#: src/libslic3r/PrintConfig.cpp:3370 -msgid "Advanced" -msgstr "Avançat" - -#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4663 src/slic3r/GUI/Tab.cpp:4664 -#: src/libslic3r/PrintConfig.cpp:3564 src/libslic3r/PrintConfig.cpp:3571 -#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3589 -#: src/libslic3r/PrintConfig.cpp:3599 src/libslic3r/PrintConfig.cpp:3609 -#: src/libslic3r/PrintConfig.cpp:3646 src/libslic3r/PrintConfig.cpp:3653 -#: src/libslic3r/PrintConfig.cpp:3664 src/libslic3r/PrintConfig.cpp:3674 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3696 -#: src/libslic3r/PrintConfig.cpp:3706 src/libslic3r/PrintConfig.cpp:3715 -#: src/libslic3r/PrintConfig.cpp:3725 src/libslic3r/PrintConfig.cpp:3736 -#: src/libslic3r/PrintConfig.cpp:3744 +#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Tab.cpp:4946 src/slic3r/GUI/Tab.cpp:4948 +#: src/libslic3r/PrintConfig.cpp:3328 src/libslic3r/PrintConfig.cpp:3337 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3356 +#: src/libslic3r/PrintConfig.cpp:3366 src/libslic3r/PrintConfig.cpp:3387 +#: src/libslic3r/PrintConfig.cpp:3410 src/libslic3r/PrintConfig.cpp:3417 +#: src/libslic3r/PrintConfig.cpp:3432 src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3464 +#: src/libslic3r/PrintConfig.cpp:3474 src/libslic3r/PrintConfig.cpp:3488 +#: src/libslic3r/PrintConfig.cpp:3498 src/libslic3r/PrintConfig.cpp:3841 +#: src/libslic3r/PrintConfig.cpp:3861 src/libslic3r/PrintConfig.cpp:3868 +#: src/libslic3r/PrintConfig.cpp:3876 msgid "Supports" msgstr "Suports" -#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4704 src/slic3r/GUI/Tab.cpp:4705 -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3752 -#: src/libslic3r/PrintConfig.cpp:3759 src/libslic3r/PrintConfig.cpp:3773 -#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3794 -#: src/libslic3r/PrintConfig.cpp:3816 src/libslic3r/PrintConfig.cpp:3827 -#: src/libslic3r/PrintConfig.cpp:3834 src/libslic3r/PrintConfig.cpp:3841 -#: src/libslic3r/PrintConfig.cpp:3852 src/libslic3r/PrintConfig.cpp:3861 -#: src/libslic3r/PrintConfig.cpp:3870 +#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:590 +#: src/slic3r/GUI/Tab.cpp:4960 src/slic3r/GUI/Tab.cpp:4961 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3884 +#: src/libslic3r/PrintConfig.cpp:3891 src/libslic3r/PrintConfig.cpp:3905 +#: src/libslic3r/PrintConfig.cpp:3916 src/libslic3r/PrintConfig.cpp:3926 +#: src/libslic3r/PrintConfig.cpp:3948 src/libslic3r/PrintConfig.cpp:3959 +#: src/libslic3r/PrintConfig.cpp:3966 src/libslic3r/PrintConfig.cpp:3973 +#: src/libslic3r/PrintConfig.cpp:3984 src/libslic3r/PrintConfig.cpp:3993 +#: src/libslic3r/PrintConfig.cpp:4002 msgid "Pad" msgstr "Pad" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4722 -#: src/slic3r/GUI/Tab.cpp:4723 src/libslic3r/SLA/Hollowing.cpp:73 -#: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3880 -#: src/libslic3r/PrintConfig.cpp:3887 src/libslic3r/PrintConfig.cpp:3897 -#: src/libslic3r/PrintConfig.cpp:3906 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4978 +#: src/slic3r/GUI/Tab.cpp:4979 src/libslic3r/SLA/Hollowing.cpp:86 +#: src/libslic3r/SLA/Hollowing.cpp:91 src/libslic3r/SLA/Hollowing.cpp:106 +#: src/libslic3r/SLA/Hollowing.cpp:115 src/libslic3r/PrintConfig.cpp:4012 +#: src/libslic3r/PrintConfig.cpp:4019 src/libslic3r/PrintConfig.cpp:4029 +#: src/libslic3r/PrintConfig.cpp:4038 msgid "Hollowing" msgstr "Buidant l'interior" -#: src/slic3r/GUI/GUI_Factories.cpp:160 +#: src/slic3r/GUI/GUI_Factories.cpp:159 msgid "Add part" msgstr "Afegir peça" -#: src/slic3r/GUI/GUI_Factories.cpp:161 +#: src/slic3r/GUI/GUI_Factories.cpp:160 msgid "Add negative volume" msgstr "Afegeix un volum negatiu" -#: src/slic3r/GUI/GUI_Factories.cpp:162 +#: src/slic3r/GUI/GUI_Factories.cpp:161 msgid "Add modifier" msgstr "Afegeix modificador" -#: src/slic3r/GUI/GUI_Factories.cpp:163 +#: src/slic3r/GUI/GUI_Factories.cpp:162 msgid "Add support blocker" msgstr "Afegir bloqueig de suports" -#: src/slic3r/GUI/GUI_Factories.cpp:164 +#: src/slic3r/GUI/GUI_Factories.cpp:163 msgid "Add support enforcer" msgstr "Afegir forçat de suports" -#: src/slic3r/GUI/GUI_Factories.cpp:300 +#: src/slic3r/GUI/GUI_Factories.cpp:169 +msgid "Add text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:170 +msgid "Add negative text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:171 +msgid "Add text modifier" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:307 msgid "Select showing settings" msgstr "Seleccionar els paràmetres mostrats" -#: src/slic3r/GUI/GUI_Factories.cpp:407 src/slic3r/GUI/GUI_Factories.cpp:412 -#: src/slic3r/GUI/GUI_Factories.cpp:556 src/slic3r/GUI/GUI_Factories.cpp:562 +#: src/slic3r/GUI/GUI_Factories.cpp:414 src/slic3r/GUI/GUI_Factories.cpp:419 +#: src/slic3r/GUI/GUI_Factories.cpp:625 src/slic3r/GUI/GUI_Factories.cpp:631 #, c-format, boost-format msgid "Quick Add Settings (%s)" msgstr "Afegir paràmetres ràpids (%s)" -#: src/slic3r/GUI/GUI_Factories.cpp:444 +#: src/slic3r/GUI/GUI_Factories.cpp:460 msgid "Remove the selected object" msgstr "Suprimeix l'objecte seleccionat" -#: src/slic3r/GUI/GUI_Factories.cpp:456 +#: src/slic3r/GUI/GUI_Factories.cpp:475 msgid "Load" msgstr "Carregar" -#: src/slic3r/GUI/GUI_Factories.cpp:461 src/slic3r/GUI/GUI_Factories.cpp:501 -#: src/slic3r/GUI/GUI_Factories.cpp:505 +#: src/slic3r/GUI/GUI_Factories.cpp:481 src/slic3r/GUI/GUI_Factories.cpp:566 +#: src/slic3r/GUI/GUI_Factories.cpp:570 msgid "Box" msgstr "Caixa" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Cylinder" msgstr "Cilindre" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Slab" msgstr "Llosa" -#: src/slic3r/GUI/GUI_Factories.cpp:471 +#: src/slic3r/GUI/GUI_Factories.cpp:493 msgid "Gallery" msgstr "Galeria" -#: src/slic3r/GUI/GUI_Factories.cpp:488 src/slic3r/GUI/GUI_Factories.cpp:526 +#: src/slic3r/GUI/GUI_Factories.cpp:529 src/slic3r/GUI/GUI_Factories.cpp:549 +#: src/slic3r/GUI/GUI_ObjectList.cpp:660 +msgid "Text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:555 src/slic3r/GUI/GUI_Factories.cpp:558 +#: src/slic3r/GUI/GUI_Factories.cpp:595 msgid "Height range Modifier" msgstr "Modificador Rang d'Altures" -#: src/slic3r/GUI/GUI_Factories.cpp:535 +#: src/slic3r/GUI/GUI_Factories.cpp:604 msgid "Add settings" msgstr "Afegeix una configuració" -#: src/slic3r/GUI/GUI_Factories.cpp:626 +#: src/slic3r/GUI/GUI_Factories.cpp:695 msgid "Change type" msgstr "Canvia el tipus" -#: src/slic3r/GUI/GUI_Factories.cpp:636 src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:705 src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Object" msgstr "Establir com a Objecte Separat" -#: src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Objects" msgstr "Establir com a Objectes Separats" -#: src/slic3r/GUI/GUI_Factories.cpp:658 +#: src/slic3r/GUI/GUI_Factories.cpp:727 msgid "Printable" msgstr "Imprimible" -#: src/slic3r/GUI/GUI_Factories.cpp:686 +#: src/slic3r/GUI/GUI_Factories.cpp:755 src/slic3r/GUI/GUI_ObjectList.cpp:2070 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2582 +msgid "Invalidate cut info" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:770 msgid "Rename" msgstr "Renombrar" -#: src/slic3r/GUI/GUI_Factories.cpp:696 +#: src/slic3r/GUI/GUI_Factories.cpp:780 msgid "Fix through the Netfabb" msgstr "Reparar mitjançant Netfabb" -#: src/slic3r/GUI/GUI_Factories.cpp:715 -msgid "Export as STL" -msgstr "Exporta com a STL" +#: src/slic3r/GUI/GUI_Factories.cpp:799 +msgid "Export as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:726 +#: src/slic3r/GUI/GUI_Factories.cpp:810 msgid "Reload the selected volumes from disk" msgstr "Torna a carregar els volums seleccionats des del disc" -#: src/slic3r/GUI/GUI_Factories.cpp:733 src/slic3r/GUI/Plater.cpp:3568 +#: src/slic3r/GUI/GUI_Factories.cpp:817 src/slic3r/GUI/Plater.cpp:3602 msgid "Replace with STL" msgstr "Substitueix per STL" -#: src/slic3r/GUI/GUI_Factories.cpp:733 +#: src/slic3r/GUI/GUI_Factories.cpp:817 msgid "Replace the selected volume with new STL" msgstr "Substitueix el volum seleccionat per un STL nou" -#: src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Set extruder for selected items" msgstr "Estableix l'extrusora per als elements seleccionats" -#: src/slic3r/GUI/GUI_Factories.cpp:778 src/slic3r/Utils/Repetier.cpp:126 -#: src/slic3r/Utils/Repetier.cpp:209 src/libslic3r/PrintConfig.cpp:635 -#: src/libslic3r/PrintConfig.cpp:2770 +#: src/slic3r/GUI/GUI_Factories.cpp:862 src/slic3r/Utils/Repetier.cpp:145 +#: src/slic3r/Utils/Repetier.cpp:226 src/libslic3r/PrintConfig.cpp:738 +#: src/libslic3r/PrintConfig.cpp:2790 src/libslic3r/PrintConfig.cpp:3851 msgid "Default" msgstr "Per defecte" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale to print volume" msgstr "Escalar al volum d'impressió" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale the selected object to fit the print volume" msgstr "Escala els objectes seleccionats per ajustar-se al volum d'impressió" -#: src/slic3r/GUI/GUI_Factories.cpp:835 src/slic3r/GUI/Plater.cpp:5655 +#: src/slic3r/GUI/GUI_Factories.cpp:921 src/slic3r/GUI/Plater.cpp:6213 msgid "Convert from imperial units" msgstr "Convertir des d'unitats imperials" -#: src/slic3r/GUI/GUI_Factories.cpp:836 src/slic3r/GUI/Plater.cpp:5656 +#: src/slic3r/GUI/GUI_Factories.cpp:922 src/slic3r/GUI/Plater.cpp:6214 msgid "Revert conversion from imperial units" msgstr "Reverteix la conversió des de les unitats imperials" -#: src/slic3r/GUI/GUI_Factories.cpp:837 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:923 src/slic3r/GUI/Plater.cpp:6215 msgid "Convert from meters" msgstr "Converteix des de metres" -#: src/slic3r/GUI/GUI_Factories.cpp:838 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:924 src/slic3r/GUI/Plater.cpp:6215 msgid "Revert conversion from meters" msgstr "Reverteix la conversió des de metres" -#: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2135 -#: src/libslic3r/PrintConfig.cpp:4523 +#: src/slic3r/GUI/GUI_Factories.cpp:945 src/slic3r/GUI/GUI_ObjectList.cpp:2290 +#: src/libslic3r/PrintConfig.cpp:4689 msgid "Merge" msgstr "Combinar" -#: src/slic3r/GUI/GUI_Factories.cpp:859 +#: src/slic3r/GUI/GUI_Factories.cpp:945 msgid "Merge objects to the one multipart object" msgstr "Ajuntar objecte en un objecte multipeça" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Along X axis" msgstr "Al llarg de l'eix X" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Mirror the selected object along the X axis" msgstr "Duplicar l'objecte seleccionat al llarg de l'eix X" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Along Y axis" msgstr "Al llarg de l'eix Y" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Mirror the selected object along the Y axis" msgstr "Duplicar l'objecte seleccionat al llarg de l'eix Y" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Along Z axis" msgstr "Al llarg de l'eix Z" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Mirror the selected object along the Z axis" msgstr "Duplicar lobjecte seleccionat al llarg de leix Z" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror" msgstr "Reflectir" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror the selected object" msgstr "Duplicar l'objecte seleccionat" -#: src/slic3r/GUI/GUI_Factories.cpp:901 src/slic3r/GUI/GUI_ObjectList.cpp:1696 +#: src/slic3r/GUI/GUI_Factories.cpp:977 +msgid "Edit text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:999 +msgid "Ability to change text, font, size, ..." +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1021 src/slic3r/GUI/GUI_ObjectList.cpp:1793 msgid "Add Shape" msgstr "Afegir forma" -#: src/slic3r/GUI/GUI_Factories.cpp:937 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "To objects" msgstr "Als objectes" -#: src/slic3r/GUI/GUI_Factories.cpp:937 src/slic3r/GUI/GUI_Factories.cpp:954 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "Split the selected object into individual objects" msgstr "Dividir l'objecte seleccionat en objectes individuals" -#: src/slic3r/GUI/GUI_Factories.cpp:940 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 msgid "To parts" msgstr "A les peces" -#: src/slic3r/GUI/GUI_Factories.cpp:940 src/slic3r/GUI/GUI_Factories.cpp:975 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 src/slic3r/GUI/GUI_Factories.cpp:1097 msgid "Split the selected object into individual parts" msgstr "Dividir l'objecte seleccionat en parts individuals" -#: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4552 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 src/slic3r/GUI/GUI_Factories.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:4718 msgid "Split" msgstr "Dividir" -#: src/slic3r/GUI/GUI_Factories.cpp:944 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 msgid "Split the selected object" msgstr "Dividir l'objecte seleccionat" -#: src/slic3r/GUI/GUI_Factories.cpp:1084 +#: src/slic3r/GUI/GUI_Factories.cpp:1225 src/slic3r/GUI/GUI_Factories.cpp:1243 +msgid "Set number of instances" +msgstr "Estableix el nombre d'instàncies" + +#: src/slic3r/GUI/GUI_Factories.cpp:1225 +msgid "Change the number of instances of the selected objects" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1237 msgid "Add one more instance of the selected object" msgstr "Afegir una instància més de l'objecte seleccionat" -#: src/slic3r/GUI/GUI_Factories.cpp:1087 +#: src/slic3r/GUI/GUI_Factories.cpp:1240 msgid "Remove one instance of the selected object" msgstr "Suprimeix una instància de l'objecte seleccionat" -#: src/slic3r/GUI/GUI_Factories.cpp:1090 -msgid "Set number of instances" -msgstr "Estableix el nombre d'instàncies" - -#: src/slic3r/GUI/GUI_Factories.cpp:1090 +#: src/slic3r/GUI/GUI_Factories.cpp:1243 msgid "Change the number of instances of the selected object" msgstr "Canvia el nombre d'instàncies de l'objecte seleccionat" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill bed with instances" msgstr "Omplir el llit amb instàncies" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill the remaining area of bed with instances of the selected object" msgstr "Omple l'àrea restant del llit amb instàncies de l'objecte seleccionat" @@ -4256,305 +5514,353 @@ msgstr "Retirar rang de capes" msgid "Add layer range" msgstr "Afegir rang de capes" -#: src/slic3r/GUI/GUI_ObjectList.cpp:297 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:323 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 msgid "Name" msgstr "Nom" -#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:480 +#: src/slic3r/GUI/GUI_ObjectList.cpp:342 src/slic3r/GUI/GUI_ObjectList.cpp:513 msgid "Editing" msgstr "Edició" -#: src/slic3r/GUI/GUI_ObjectList.cpp:400 +#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +msgid "Wrong volume index " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:433 msgid "No errors detected" msgstr "No s'han detectat errors" -#: src/slic3r/GUI/GUI_ObjectList.cpp:409 +#: src/slic3r/GUI/GUI_ObjectList.cpp:442 #, c-format, boost-format msgid "Auto-repaired %1$d error" msgid_plural "Auto-repaired %1$d errors" msgstr[0] "%1$d error auto-reparació" msgstr[1] "%1$d error auto-reparacions" -#: src/slic3r/GUI/GUI_ObjectList.cpp:415 +#: src/slic3r/GUI/GUI_ObjectList.cpp:448 #, c-format, boost-format msgid "%1$d degenerate facet" msgid_plural "%1$d degenerate facets" msgstr[0] "%1$d faceta degenerada" msgstr[1] "%1$d facetes degenerades" -#: src/slic3r/GUI/GUI_ObjectList.cpp:417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:450 #, c-format, boost-format msgid "%1$d edge fixed" msgid_plural "%1$d edges fixed" msgstr[0] "%1$d vora arreglat" msgstr[1] "%1$d vores arreglats" -#: src/slic3r/GUI/GUI_ObjectList.cpp:419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:452 #, c-format, boost-format msgid "%1$d facet removed" msgid_plural "%1$d facets removed" msgstr[0] "%1$d faceta eliminada" msgstr[1] "%1$d facetes eliminades" -#: src/slic3r/GUI/GUI_ObjectList.cpp:421 +#: src/slic3r/GUI/GUI_ObjectList.cpp:454 #, c-format, boost-format msgid "%1$d facet reversed" msgid_plural "%1$d facets reversed" msgstr[0] "%1$d faceta invertida" msgstr[1] "%1$d facetes invertides" -#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +#: src/slic3r/GUI/GUI_ObjectList.cpp:456 #, c-format, boost-format msgid "%1$d backward edge" msgid_plural "%1$d backward edges" msgstr[0] "%1$d vora de retrocés" msgstr[1] "%1$d vores de retrocessos" -#: src/slic3r/GUI/GUI_ObjectList.cpp:426 src/slic3r/GUI/GUI_ObjectList.cpp:429 +#: src/slic3r/GUI/GUI_ObjectList.cpp:459 src/slic3r/GUI/GUI_ObjectList.cpp:462 #, c-format, boost-format msgid "%1$d open edge" msgid_plural "%1$d open edges" msgstr[0] "%1$d cantonada oberta" msgstr[1] "%1$d cantonades obertes" -#: src/slic3r/GUI/GUI_ObjectList.cpp:428 +#: src/slic3r/GUI/GUI_ObjectList.cpp:461 msgid "Remaining errors" msgstr "Errors restants" -#: src/slic3r/GUI/GUI_ObjectList.cpp:436 +#: src/slic3r/GUI/GUI_ObjectList.cpp:469 msgid "Right button click the icon to fix STL through Netfabb" msgstr "" "Feu clic amb el botó dret sobre la icona per corregir STL a través de Netfabb" -#: src/slic3r/GUI/GUI_ObjectList.cpp:482 +#: src/slic3r/GUI/GUI_ObjectList.cpp:515 msgid "Right button click the icon to change the object settings" msgstr "" "Feu clic amb el botó dret sobre la icona per canviar la configuració de " "l'objecte" -#: src/slic3r/GUI/GUI_ObjectList.cpp:484 +#: src/slic3r/GUI/GUI_ObjectList.cpp:517 msgid "Click the icon to change the object settings" msgstr "Feu clic a la icona per canviar la configuració de l'objecte" -#: src/slic3r/GUI/GUI_ObjectList.cpp:488 +#: src/slic3r/GUI/GUI_ObjectList.cpp:521 msgid "Right button click the icon to change the object printable property" msgstr "" "Feu clic amb el botó dret sobre la icona per canviar la propietat d'objecte " "imprimible" -#: src/slic3r/GUI/GUI_ObjectList.cpp:490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:523 msgid "Click the icon to change the object printable property" msgstr "Feu clic sobre la icona per canviar la propietat d'objecte imprimible" -#: src/slic3r/GUI/GUI_ObjectList.cpp:616 +#: src/slic3r/GUI/GUI_ObjectList.cpp:649 msgid "Change Extruder" msgstr "Canviar extrusor" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Object" msgstr "Canvia el nom de l'objecte" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Sub-object" msgstr "Canvia el nom del Sub-objecte" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1242 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4006 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1307 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4589 msgid "Instances to Separated Objects" msgstr "Instàncies per Separar Objectes" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Volumes in Object reordered" msgstr "Volums d'Objecte reordenats" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Object reordered" msgstr "Objecte reordenat" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1298 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1363 msgid "Add Settings for Layers" msgstr "Afegir Configuració per a Capes" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1299 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1364 msgid "Add Settings for Sub-object" msgstr "Afegir Configuració per al Sub-objecte" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1300 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1365 msgid "Add Settings for Object" msgstr "Afegir Configuració per a l'Objecte" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1339 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1404 msgid "Add Settings Bundle for Height range" msgstr "Afegir Conjunt d'Ajustos per a Rang d'Altures" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1340 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1405 msgid "Add Settings Bundle for Sub-object" msgstr "Afegir Conjunt d'Ajustos per a Sub-objecte" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1341 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1406 msgid "Add Settings Bundle for Object" msgstr "Afegir Conjunt d'Ajustos per a l'Objecte" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Part" msgstr "Carregar peça" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Modifier" msgstr "Carregar Modificador" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1509 src/slic3r/GUI/Plater.cpp:2380 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1582 src/slic3r/GUI/Plater.cpp:2453 msgid "Loading" msgstr "Carregant" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1540 src/slic3r/GUI/Plater.cpp:2417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1617 src/slic3r/GUI/Plater.cpp:2494 msgid "Loading file" msgstr "S'està carregant el fitxer" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1548 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1625 msgid "Error!" msgstr "Error!" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1638 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1721 msgid "Add Generic Subobject" msgstr "Afegir Sub-objecte Genèric" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1663 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1761 msgid "Generic" msgstr "Genèric" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shape from Gallery" msgstr "Afegeix una Forma des de la galeria" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shapes from Gallery" msgstr "Afegeix Formes des de la galeria" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1830 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1945 msgid "Remove paint-on supports" msgstr "Eliminar suports pintables" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1837 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 msgid "Remove paint-on seam" msgstr "Eliminar pintat de costures" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1844 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 msgid "Remove Multi Material painting" msgstr "Eliminar el pintat Multimaterial" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1850 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1972 msgid "Shift objects to bed" msgstr "Desplaçar els objectes al llit" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1856 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1978 msgid "Remove variable layer height" msgstr "Elimina alçada de capa variable" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1877 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1999 msgid "Delete Settings" msgstr "Suprimeix Configuració" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1901 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2023 msgid "Delete All Instances from Object" msgstr "Suprimeix totes les còpies de l'objecte" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1917 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2039 msgid "Delete Height Range" msgstr "Eliminar Rang d'Altures" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1949 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2057 +msgid "Delete connector from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2058 +msgid "Delete solid part from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2059 +msgid "Delete negative volume from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2061 +msgid "" +"To save cut information you can delete all connectors from all related " +"objects." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2064 +msgid "" +"This action will break a cut information.\n" +"After that PrusaSlicer can't guarantee model consistency.\n" +"\n" +"To manipulate with solid parts or negative volumes you have to invalidate " +"cut infornation first." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2072 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2612 +msgid "Delete all connectors" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2103 msgid "From Object List You can't delete the last solid part from object." msgstr "" "Des de la Llista d'objectes no podeu suprimir l'última part sòlida de " "l'objecte." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1953 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2112 msgid "Delete Subobject" msgstr "Eliminar Sub-objecte" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1976 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2138 msgid "Last instance of an object cannot be deleted." msgstr "No es pot suprimir l'última instància d'un objecte." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1980 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +msgid "Instance cannot be deleted from cut object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2146 msgid "Delete Instance" msgstr "Suprimeix la instància" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2004 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2170 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" "No s'ha pogut dividir l'objecte seleccionat perquè només conté una part." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2008 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2174 msgid "Split to Parts" msgstr "Separar en Peces" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2177 src/slic3r/GUI/Plater.cpp:3133 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"splitting the object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2297 msgid "Merged" msgstr "Fusionat" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2237 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2392 msgid "Merge all parts to the one single object" msgstr "Fusiona totes les parts en un sol objecte" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2269 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2424 msgid "Add Layers" msgstr "Afegeix Capes" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2438 -msgid "Group manipulation" -msgstr "Manipulació de grups" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2695 +msgid "Cut Connectors information" +msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2453 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2705 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2768 msgid "Object manipulation" msgstr "Manipulació d'objectes" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2486 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2714 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1472 +msgid "Group manipulation" +msgstr "Manipulació de grups" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2802 msgid "Object Settings to modify" msgstr "Configuracions d'objectes per modificar" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2806 msgid "Part Settings to modify" msgstr "Configuracions de peces per modificar" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2495 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2811 msgid "Layer range Settings to modify" msgstr "Ajustaments del Rang de capes a modificar" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2501 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2817 msgid "Part manipulation" msgstr "Manipulació de peces" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2825 msgid "Instance manipulation" msgstr "Manipulació d'instàncies" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Height ranges" msgstr "Intervals d'alçada" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Settings for height range" msgstr "Configuració de l'interval d'alçada" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2750 -msgid "Delete Selected Item" -msgstr "Suprimeix l'element Seleccionat" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2943 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3363 msgid "Delete Selected" msgstr "Eliminar Selecció" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3019 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3047 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3067 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3441 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3469 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3489 msgid "Add Height Range" msgstr "Afegeix un interval d'alçada" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3113 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3535 msgid "" "Cannot insert a new layer range after the current layer range.\n" "The next layer range is too thin to be split to two\n" @@ -4564,7 +5870,7 @@ msgstr "" "El següent rang de capa és massa prim per dividir-se en dos\n" "sense violar l'alçada mínima de la capa." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3117 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3539 msgid "" "Cannot insert a new layer range between the current and the next layer " "range.\n" @@ -4576,7 +5882,7 @@ msgstr "" "La bretxa entre el rang de capa actual i el següent rang de capa\n" "és més prima que l'alçada mínima de capa permesa." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3122 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3544 msgid "" "Cannot insert a new layer range after the current layer range.\n" "Current layer range overlaps with the next layer range." @@ -4584,238 +5890,289 @@ msgstr "" "No es pot inserir un rang de capes nou després del rang de capa actual.\n" "El rang de capa actual se superposa amb el rang de capa següent." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3603 msgid "Edit Height Range" msgstr "Edita l'interval d'alçada" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3500 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3989 msgid "Selection-Remove from list" msgstr "Selecció-Retirar de la llista" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4001 msgid "Selection-Add from list" msgstr "Selecció-Afegir de la llista" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3649 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4138 msgid "Object or Instance" msgstr "Objecte o instància" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Part" -msgstr "Peça" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 msgid "Layer" msgstr "Capa" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3652 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4141 msgid "Unsupported selection" msgstr "Selecció no admesa" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3653 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 #, c-format, boost-format msgid "You started your selection with %s Item." msgstr "Heu començat la selecció amb %s element." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3654 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4143 #, c-format, boost-format msgid "In this mode you can select only other %s Items%s" msgstr "En aquest mode, només podeu seleccionar altres %s elements %s" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3657 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4146 msgid "of a current Object" msgstr "d'un objecte actual" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3662 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3737 src/slic3r/GUI/Plater.cpp:181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4151 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4226 src/slic3r/GUI/Plater.cpp:197 msgid "Info" msgstr "Informació" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3784 -msgid "You can't change a type of the last solid part of the object." -msgstr "No podeu canviar un tipus de l'última part sòlida de l'objecte." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 msgid "Negative Volume" msgstr "Volum Negatiu" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Modifier" -msgstr "Modificador" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Blocker" msgstr "Bloqueig de suport" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Enforcer" msgstr "Forçat de Suport" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Select type of part" msgstr "Selecciona el tipus de peça" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3795 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4359 msgid "Change Part Type" msgstr "Canvia el tipus de peça" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Enter new name" msgstr "Introduïu un nom nou" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Renaming" msgstr "Reanomenar" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4091 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4681 msgid "Repairing model" msgstr "Reparant model" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4120 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4691 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"repairing the mesh." +msgstr "" +"Els suports personalitzats, les costures i la pintura multimaterial s'han " +"retirat després de reparar la malla." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4711 msgid "Fix through NetFabb" msgstr "Reparar mitjançant Netfabb" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4123 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4714 msgid "Fixing through NetFabb" msgstr "S'està corregint a través de NetFabb" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4153 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4744 msgid "The following model was repaired successfully" msgid_plural "The following models were repaired successfully" msgstr[0] "El model següent s'ha reparat correctament" msgstr[1] "Els models següents s'han reparat correctament" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4159 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4750 msgid "Folowing model repair failed" msgid_plural "Folowing models repair failed" msgstr[0] "Ha fallat la reparació del següent model" msgstr[1] "Ha fallat la reparació dels següents models" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4164 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4755 msgid "Repairing was canceled" msgstr "S'ha cancel·lat la reparació" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4276 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4869 msgid "Change Extruders" msgstr "Canviar Extrusors" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Printable group" msgstr "Establir Grup Imprimible" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Unprintable group" msgstr "Establir Grup No Imprimible" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Printable" msgstr "Establir Imprimible" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Unprintable" msgstr "Establir No Imprimible" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Printable Instance" msgstr "Establir Instància Imprimible" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Unprintable Instance" msgstr "Establir Instància No Imprimible" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:55 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:84 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:61 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:96 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1132 msgid "World coordinates" msgstr "Coordenades mundials" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:56 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:85 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:97 msgid "Local coordinates" msgstr "Coordenades locals" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:60 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:67 msgid "Select coordinate space, in which the transformation will be performed." msgstr "" "Seleccioneu l'espai de coordenades, en el qual es realitzarà la " "transformació." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:141 src/libslic3r/GCode.cpp:540 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:157 src/libslic3r/GCode.cpp:491 msgid "Object name" msgstr "Nom de l'objecte" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:201 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:521 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:221 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:710 msgid "Position" msgstr "Posició" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:202 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:522 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:222 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:711 #: src/slic3r/GUI/Mouse3DController.cpp:478 #: src/slic3r/GUI/Mouse3DController.cpp:499 msgid "Rotation" msgstr "Rotació" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:250 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:239 +msgid "Size [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "Mirror along" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +#, c-format, boost-format +msgid " %c " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "axis" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:279 #, c-format, boost-format msgid "Toggle %c axis mirroring" msgstr "Activar reflex de l'eix %c" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:284 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:329 msgid "Set Mirror" msgstr "Establir reflex" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:324 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:336 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:348 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:374 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:387 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:393 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:401 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:428 msgid "Drop to bed" msgstr "Col·locar al Llit" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:445 msgid "Reset rotation" msgstr "Reinicialitza la rotació" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 msgid "Reset Rotation" msgstr "Reinicialitza la Rotació" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:398 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:400 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:490 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:519 msgid "Reset scale" msgstr "Reinicialitza l'escala" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:539 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546 +msgid "Reset skew" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:553 msgid "Inches" msgstr "Polzades" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:523 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:712 msgid "Scale factors" msgstr "Factors d'escala" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:577 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:740 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:752 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:793 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:801 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +msgid "Rotate (relative)" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:751 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:800 +msgid "Translate (relative) [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:829 msgid "Translate" msgstr "Traduir" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:640 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:905 msgid "" "You cannot use non-uniform scaling mode for multiple objects/parts selection" msgstr "" "No podeu utilitzar el mode d'escala no uniforme per a la selecció de " "múltiples objectes/parts" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:820 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +msgid "Left handed" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1133 +msgid "Object coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1134 +msgid "Part coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1176 msgid "Set Position" msgstr "Establir Posició" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:852 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1220 msgid "Set Orientation" msgstr "Establir Orientació" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:931 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1351 msgid "Set Scale" msgstr "Establir Escala" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1368 +msgid "Set Size" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1427 msgid "" "The currently manipulated object is tilted (rotation angles are not " "multiples of 90°).\n" @@ -4829,7 +6186,7 @@ msgstr "" "coordenades Mundials,\n" "una vegada la rotació s'ha aplicat a les coordenades de l'objecte." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:983 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1430 msgid "" "This operation is irreversible.\n" "Do you want to proceed?" @@ -4855,170 +6212,69 @@ msgstr "Suprimeix l'opció %s" msgid "Change Option %s" msgstr "Canvia l'opció %s" -#: src/slic3r/GUI/GUI_Preview.cpp:211 -msgid "View" -msgstr "Vista" - -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/libslic3r/PrintConfig.cpp:808 -msgid "Height" -msgstr "Alçada" - -#: src/slic3r/GUI/GUI_Preview.cpp:219 src/libslic3r/PrintConfig.cpp:3032 -msgid "Width" -msgstr "Amplada" - -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2016 -msgid "Fan speed" -msgstr "Velocitat del ventilador" - -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1991 -msgid "Temperature" -msgstr "Temperatura" - -#: src/slic3r/GUI/GUI_Preview.cpp:223 -msgid "Volumetric flow rate" -msgstr "Taxa de flux volumètric" - -#: src/slic3r/GUI/GUI_Preview.cpp:228 -msgid "Show" -msgstr "Mostrar" - -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/GUI_Preview.cpp:254 -msgid "Feature types" -msgstr "Tipus de funcions" - -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:330 -#: src/libslic3r/ExtrusionEntity.cpp:352 -msgid "Perimeter" -msgstr "Perímetre" - -#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:331 -#: src/libslic3r/ExtrusionEntity.cpp:354 -msgid "External perimeter" -msgstr "Perímetre extern" - -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:332 -#: src/libslic3r/ExtrusionEntity.cpp:356 -msgid "Overhang perimeter" -msgstr "Perímetre de voladís" - -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:333 -#: src/libslic3r/ExtrusionEntity.cpp:358 -msgid "Internal infill" -msgstr "Farciment intern" - -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:334 -#: src/libslic3r/ExtrusionEntity.cpp:360 src/libslic3r/PrintConfig.cpp:1407 -#: src/libslic3r/PrintConfig.cpp:2392 src/libslic3r/PrintConfig.cpp:2404 -msgid "Solid infill" -msgstr "Farciment sòlid" - -#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:335 -#: src/libslic3r/ExtrusionEntity.cpp:362 src/libslic3r/PrintConfig.cpp:1416 -#: src/libslic3r/PrintConfig.cpp:2889 src/libslic3r/PrintConfig.cpp:2902 -msgid "Top solid infill" -msgstr "Farciment sòlid superior" - -#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:337 -#: src/libslic3r/ExtrusionEntity.cpp:366 -msgid "Bridge infill" -msgstr "Farciment del pont" - -#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:338 -#: src/libslic3r/ExtrusionEntity.cpp:368 src/libslic3r/PrintConfig.cpp:1325 -msgid "Gap fill" -msgstr "Farciment del buit" - -#: src/slic3r/GUI/GUI_Preview.cpp:248 src/libslic3r/ExtrusionEntity.cpp:339 -#: src/libslic3r/ExtrusionEntity.cpp:370 -msgid "Skirt/Brim" -msgstr "Faldilla/Bassa" - -#: src/slic3r/GUI/GUI_Preview.cpp:250 src/libslic3r/ExtrusionEntity.cpp:341 -#: src/libslic3r/ExtrusionEntity.cpp:374 src/libslic3r/PrintConfig.cpp:2736 -msgid "Support material interface" -msgstr "Interfície de material de suport" - -#: src/slic3r/GUI/GUI_Preview.cpp:251 src/slic3r/GUI/Tab.cpp:1634 -#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/ExtrusionEntity.cpp:376 -msgid "Wipe tower" -msgstr "Torre de Neteja" - -#: src/slic3r/GUI/GUI_Preview.cpp:728 +#: src/slic3r/GUI/GUI_Preview.cpp:581 msgid "NOTE:" msgstr "NOTA:" -#: src/slic3r/GUI/GUI_Preview.cpp:729 +#: src/slic3r/GUI/GUI_Preview.cpp:582 #, boost-format msgid "Sliced object \"%1%\" looks like a logo or a sign" msgstr "L'objecte laminat \"%1%\" sembla un logotip o un cartell" -#: src/slic3r/GUI/GUI_Preview.cpp:730 +#: src/slic3r/GUI/GUI_Preview.cpp:583 msgid "Apply color change automatically" msgstr "Aplica el canvi de color automàticament" -#: src/slic3r/GUI/GUI_Preview.cpp:1058 -msgid "Shells" -msgstr "Carcasses" - -#: src/slic3r/GUI/GUI_Preview.cpp:1059 -msgid "Tool marker" -msgstr "Marcador d'eina" - -#: src/slic3r/GUI/GUI_Preview.cpp:1060 -msgid "Legend/Estimated printing time" -msgstr "Llegenda/Temps d'impressió estimat" - -#: src/slic3r/GUI/HintNotification.cpp:771 -#: src/slic3r/GUI/HintNotification.cpp:797 -#: src/slic3r/GUI/NotificationManager.cpp:374 -#: src/slic3r/GUI/NotificationManager.cpp:391 +#: src/slic3r/GUI/HintNotification.cpp:773 +#: src/slic3r/GUI/HintNotification.cpp:799 +#: src/slic3r/GUI/NotificationManager.cpp:457 +#: src/slic3r/GUI/NotificationManager.cpp:474 msgid "More" msgstr "Més" -#: src/slic3r/GUI/HintNotification.cpp:912 +#: src/slic3r/GUI/HintNotification.cpp:914 msgid "Open Preferences." msgstr "Obrir preferències." -#: src/slic3r/GUI/HintNotification.cpp:1004 +#: src/slic3r/GUI/HintNotification.cpp:1006 msgid "Open Documentation in web browser." msgstr "Obre la Documentació al navegador web." -#: src/slic3r/GUI/ImGuiWrapper.cpp:527 +#: src/slic3r/GUI/ImGuiWrapper.cpp:666 msgid "Edit" msgstr "Editar" -#: src/slic3r/GUI/ImGuiWrapper.cpp:960 src/slic3r/GUI/Search.cpp:470 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1166 src/slic3r/GUI/Search.cpp:531 msgid "Use for search" msgstr "Usar per cercar" -#: src/slic3r/GUI/ImGuiWrapper.cpp:961 src/slic3r/GUI/Search.cpp:463 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1167 src/slic3r/GUI/Search.cpp:524 msgid "Category" msgstr "Categoria" -#: src/slic3r/GUI/ImGuiWrapper.cpp:963 src/slic3r/GUI/Search.cpp:465 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1169 src/slic3r/GUI/Search.cpp:526 msgid "Search in English" msgstr "Cerca en anglès" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:174 -msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "" -"¡No es van poder organitzar els objectes model! Algunes geometries poden ser " -"invàlides." - -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:183 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:168 msgid "Arranging" msgstr "Organitzant" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:207 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:204 msgid "Arranging canceled." msgstr "S'ha cancel·lat l'organització." -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:208 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:205 msgid "Arranging done." msgstr "S'ha fet l'arranjament." -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:253 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:225 +msgid "Could not arrange model objects! Some geometries may be invalid." +msgstr "" +"¡No es van poder organitzar els objectes model! Algunes geometries poden ser " +"invàlides." + +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:265 #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -5029,40 +6285,83 @@ msgstr "" "llit:\n" "%s" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:119 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:108 msgid "Filling bed" msgstr "Omplint base" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:130 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:140 msgid "Bed filling canceled." msgstr "S'ha cancel·lat l'ompliment del llit." -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:131 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:141 msgid "Bed filling done." msgstr "Ompliment de Base fet." -#: src/slic3r/GUI/Jobs/Job.cpp:111 -msgid "ERROR: not enough resources to execute a new job." -msgstr "ERROR: no hi ha prou recursos per executar una feina nova." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:148 src/slic3r/GUI/Jobs/EmbossJob.cpp:596 +msgid "Can't create empty volume." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:201 +msgid "Can't create empty object." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:208 +msgid "Add Emboss text object" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:247 +msgid "Created text volume is empty. Change text or font." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:465 +msgid "" +"It is used default volume for embossed text, try to change text or font to " +"fix it." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:549 +#, boost-format +msgid "Text: %1%" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:593 +msgid "Bad object to create volume." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:598 +msgid "Add Emboss text Volume" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:698 +msgid "Font doesn't have any shape for given text." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:738 +msgid "There is no volume in projection direction." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:787 +msgid "There is no valid surface for text projection." +msgstr "" -#: src/slic3r/GUI/Jobs/PlaterJob.cpp:13 -msgid "An unexpected error occured" -msgstr "S'ha produït un error inesperat" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:823 +msgid "Issue during embossing the text." +msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:21 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:22 msgid "Best surface quality" msgstr "Màxima qualitat de superfície" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:23 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 msgid "Optimize object rotation for best surface quality." msgstr "" "Optimitzar la rotació de l'objecte per a la màxima qualitat de superfície." -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:25 msgid "Reduced overhang slopes" msgstr "Pendents de voladís reduïts" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:26 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:27 msgid "" "Optimize object rotation to have minimum amount of overhangs needing support " "structures.\n" @@ -5074,65 +6373,33 @@ msgstr "" "Tingueu en compte que aquest mètode intentarà trobar la millor superfície de " "l'objecte per tocar el llit d'impressió si no s'estableix cap elevació." -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:30 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:31 msgid "Lowest Z height" msgstr "Mínima alçada Z" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:32 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:33 msgid "Rotate the model to have the lowest z height for faster print time." msgstr "" "Rota el model per tenir l'alçada z més baixa i un temps d'impressió més " "ràpid." -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:59 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:53 msgid "Searching for optimal orientation" msgstr "Buscant una orientació òptima" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:77 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:83 msgid "Orientation search canceled." msgstr "S'ha cancel·lat la cerca d'orientació." -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:78 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:84 msgid "Orientation found." msgstr "S'ha trobat l'orientació." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:36 -msgid "Choose SLA archive:" -msgstr "Escollir fitxer SLA:" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:40 -msgid "Import file" -msgstr "Importa el fitxer" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47 -msgid "Import model and profile" -msgstr "Importa el model i el perfil" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48 -msgid "Import profile only" -msgstr "Importa només el perfil" - #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:49 -msgid "Import model only" -msgstr "Importa només el model" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60 -msgid "Accurate" -msgstr "Acurat" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61 -msgid "Balanced" -msgstr "Equilibrat" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:62 -msgid "Quick" -msgstr "Ràpid" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:140 msgid "Importing SLA archive" msgstr "S'està important l'arxiu SLA" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:158 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:77 msgid "" "The SLA archive doesn't contain any presets. Please activate some SLA " "printer preset first before importing that SLA archive." @@ -5140,19 +6407,23 @@ msgstr "" "El fitxer SLA no conté cap configuració. Si us plau, primer activeu algun " "preajustament de la impressora SLA abans d'importar aquest fitxer SLA." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:164 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:81 +msgid "Import is unavailable for this archive format." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:86 msgid "Importing canceled." msgstr "S'ha cancel·lat la importació." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:165 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:87 msgid "Importing done." msgstr "S'ha fet la importació." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:187 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:108 msgid "The file does not exist." msgstr "El fitxer no existeix." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:221 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135 msgid "" "The imported SLA archive did not contain any presets. The current SLA " "presets were used as fallback." @@ -5160,161 +6431,169 @@ msgstr "" "El fitxer SLA importat no contenia cap preajustament. Els preajustaments " "actuals de SLA s'han utilitzat com a reserva." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:234 src/slic3r/GUI/Plater.cpp:2458 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:148 src/slic3r/GUI/Plater.cpp:2535 msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "No pots carregar un projecte SLA amb diverses peces a la base" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:236 src/slic3r/GUI/Plater.cpp:2460 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:150 src/slic3r/GUI/Plater.cpp:2537 msgid "Attention!" msgstr "Atenció!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:166 +msgid "The profile in the imported archive is corrupt and will not be loaded." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:178 +msgid "" +"No object could be retrieved from the archive. The slices might be corrupted " +"or missing." +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1184 msgid "Keyboard Shortcuts" msgstr "Dreceres de teclat" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:77 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:86 msgid "New project, clear plater" msgstr "Nou projecte, netejar plataforma" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:78 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 msgid "Open project AMF/3MF with config, clear plater" msgstr "Obrir projecte AMF/3MF amb configuració, netejar plataforma" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 msgid "Save project (3mf)" msgstr "Desar projecte (3mf)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 msgid "Save project as (3mf)" msgstr "Desa el projecte com a (3mf)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:81 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 msgid "(Re)slice" msgstr "(Re)laminar" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:83 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:92 msgid "Import STL/3MF/STEP/OBJ/AMF without config, keep plater" msgstr "Importar STL/3MF/STEP/OBJ/AMF sense configuració, mantenir la base" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:84 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 msgid "Import Config from ini/amf/3mf/gcode" msgstr "Importar Configuració des de ini/amf/3mf/gcode" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:85 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "Carregar Configuració des de ini/amf/3mf/gcode i combina" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6543 src/libslic3r/PrintConfig.cpp:4423 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:96 src/slic3r/GUI/Plater.cpp:948 +#: src/slic3r/GUI/Plater.cpp:7161 src/libslic3r/PrintConfig.cpp:4575 msgid "Export G-code" msgstr "Exportar el codi G" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:97 src/slic3r/GUI/Plater.cpp:7162 msgid "Send G-code" msgstr "Envia el codi G" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 msgid "Export config" msgstr "Exporta la configuració" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 src/slic3r/GUI/Plater.cpp:896 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 src/slic3r/GUI/Plater.cpp:931 msgid "Export to SD card / Flash drive" msgstr "Exporta a la targeta SD / Unitat flash" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:91 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 msgid "Eject SD card / Flash drive" msgstr "Expulsar la targeta SD / La unitat flaix" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 msgid "Select all objects" msgstr "Selecciona tots els objectes" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 msgid "Deselect all" msgstr "Deseleccionar-ho tot" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:95 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 msgid "Delete selected" msgstr "Esborra la selecció" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 -msgid "Copy to clipboard" -msgstr "Copieu al porta-retalls" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 msgid "Paste from clipboard" msgstr "Enganxa des del porta-retalls" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Reload plater from disk" msgstr "Recarregar la base des del disc" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 msgid "Select Plater Tab" msgstr "Seleccionar pestanya de la Base d'impressió" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 msgid "Select Print Settings Tab" msgstr "Selecciona la pestanya Configuració d'impressió" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 msgid "Select Filament Settings Tab" msgstr "Selecciona la pestanya Configuració del filament" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 msgid "Select Printer Settings Tab" msgstr "Selecciona la pestanya Configuració de la impressora" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 msgid "Switch to 3D" msgstr "Canvia a 3D" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 msgid "Switch to Preview" msgstr "Canvia a visualització prèvia" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 -#: src/slic3r/GUI/PrintHostDialogs.cpp:217 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +#: src/slic3r/GUI/PrintHostDialogs.cpp:267 msgid "Print host upload queue" msgstr "Cua de pujada al host d'impressió" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/MainFrame.cpp:75 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 src/slic3r/GUI/MainFrame.cpp:77 msgid "Open new instance" msgstr "Obre una instància nova" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 msgid "Camera view" msgstr "Vista de càmera" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 msgid "Show/Hide object/instance labels" msgstr "Mostra/Oculta etiquetes de peça/repetició" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Preferences.cpp:46 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Preferences.cpp:57 +#: src/slic3r/GUI/Preferences.cpp:165 src/slic3r/GUI/Preferences.cpp:188 +#: src/slic3r/GUI/Preferences.cpp:207 src/slic3r/GUI/Preferences.cpp:215 msgid "Preferences" msgstr "Preferències" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 msgid "Show keyboard shortcuts list" msgstr "Mostra la llista de dreceres de teclat" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 msgid "Commands" msgstr "Comandes" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 msgid "Add Instance of the selected object" msgstr "Afegeix una instància de l'objecte seleccionat" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Remove Instance of the selected object" msgstr "Suprimeix la instància de l'objecte seleccionat" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 msgid "" "Press to select multiple objects\n" "or move multiple objects with mouse" @@ -5322,140 +6601,144 @@ msgstr "" "Prem per seleccionar objectes múltiples\n" "o moure objectes múltiples amb el ratolí" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 msgid "Press to activate selection rectangle" msgstr "Pressionar per activar el rectangle de selecció" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 msgid "Press to activate deselection rectangle" msgstr "Pressionar per activar el rectangle de deselecció" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Arrow Up" msgstr "Fletxa cap amunt" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 msgid "Move selection 10 mm in positive Y direction" msgstr "Moure la selecció 10 mm en direcció Y positiva" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Arrow Down" msgstr "Fletxa cap avall" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 msgid "Move selection 10 mm in negative Y direction" msgstr "Moure la selecció 10 mm en direcció Y negativa" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Arrow Left" msgstr "Fletxa cap a l’esquerra" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 msgid "Move selection 10 mm in negative X direction" msgstr "Moure la selecció 10 mm en direcció X negativa" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Arrow Right" msgstr "Fletxa cap a la dreta" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 msgid "Move selection 10 mm in positive X direction" msgstr "Moure la selecció 10 mm en direcció X positiva" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Any arrow" msgstr "Qualsevol fletxa" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 msgid "Movement step set to 1 mm" msgstr "Pas de moviment configurat a 1 mm" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Movement in camera space" msgstr "Moviment a l'espai de la càmera" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Page Up" msgstr "Pàgina amunt" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Rotate selection 45 degrees CCW" msgstr "Gira la selecció 45 graus en sentit antihorari" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Page Down" msgstr "Pàgina avall" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Rotate selection 45 degrees CW" msgstr "Gireu la selecció 45 graus en sentit horari" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 msgid "Gizmo move" msgstr "Eina de Moviment" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 msgid "Gizmo scale" msgstr "Eina d'Escala" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Gizmo rotate" msgstr "Eina de Rotació" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Gizmo cut" msgstr "Eina de Tall" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 msgid "Gizmo Place face on bed" msgstr "Eina Colocar cara a la base" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 msgid "Gizmo SLA hollow" msgstr "Eina de buidatge SLA" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 msgid "Gizmo SLA support points" msgstr "Eina de punts de suport SLA" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 msgid "Gizmo FDM paint-on supports" msgstr "Eina de Suports pintables FDM" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 msgid "Gizmo FDM paint-on seam" msgstr "Eina de FDM pintat de costures" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 msgid "Gizmo Multi Material painting" msgstr "Eina Pintura multimaterial" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +msgid "Gizmo Text emboss / engrave" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 msgid "Unselect gizmo or clear selection" msgstr "Desseleccionar gizmo o esborrar selecció" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 msgid "Change camera type (perspective, orthographic)" msgstr "Canviar tipus de càmera (perspectiva, ortogràfica)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 msgid "Zoom to Bed" msgstr "Zoom al Llit" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 msgid "" "Zoom to selected object\n" "or all objects in scene, if none selected" @@ -5463,178 +6746,178 @@ msgstr "" "Zoom a objectes seleccionats\n" "o a tots els objectes en escena, si no n'hi ha cap de seleccionat" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 msgid "Zoom in" msgstr "Augmentar zoom" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Zoom out" msgstr "Reduir zoom" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Switch between Editor/Preview" msgstr "Canviar entre Editor/Previsualització" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Collapse/Expand the sidebar" msgstr "Amagar/Expandir barra lateral" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled" msgstr "" "Mostra/Oculta el quadre de diàleg de configuració de dispositius " "3Dconnexion, si està habilitat" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "Mostrar/Amagar quadre de configuració dispositius 3Dconnexion" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 msgid "Minimize application" msgstr "Minimitzar aplicació" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 src/slic3r/GUI/MainFrame.cpp:284 -#: src/slic3r/GUI/MainFrame.cpp:333 src/slic3r/GUI/MainFrame.cpp:445 -#: src/slic3r/GUI/MainFrame.cpp:448 src/slic3r/GUI/MainFrame.cpp:470 -#: src/slic3r/GUI/MainFrame.cpp:473 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 src/slic3r/GUI/MainFrame.cpp:329 +#: src/slic3r/GUI/MainFrame.cpp:378 src/slic3r/GUI/MainFrame.cpp:490 +#: src/slic3r/GUI/MainFrame.cpp:493 src/slic3r/GUI/MainFrame.cpp:515 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Plater" msgstr "Plataforma" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button" msgstr "" "Tots els moviments: Rotar - botó esquerre ratolí; Girar- botó dret ratolí" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 msgid "Gizmo move: Press to snap by 1mm" msgstr "Eina de moure: Clicka per ajustar en passos d'1 mm" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 msgid "Gizmo scale: Press to snap by 5%" msgstr "Eina d'Escala: prem per ajustar un 5%" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 msgid "Gizmo scale: Scale selection to fit print volume" msgstr "" "Eina d'escala: escala les peces seleccionades per ajustar-se al volum " "d'impressió" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 msgid "Gizmo scale: Press to activate one direction scaling" msgstr "Eina d'escala: Clica per activar una adreça d'escalat" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 msgid "Gizmo scale: Press to scale selected objects around their own center" msgstr "" "Eina d'escala: Clica per escalar la peça seleccionada al voltant del seu " "propi centre" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 msgid "Gizmo rotate: Press to rotate selected objects around their own center" msgstr "Eina de rotació: Clica per girar la peça sobre el seu propi centre" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "Gizmos" msgstr "Gizmos" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "" "The following shortcuts are applicable when the specified gizmo is active" msgstr "" "Les dreceres següents són aplicables quan el gizmo especificat està actiu" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 msgid "Set selected items as Printable/Unprintable" msgstr "Establir els elements seleccionats com a Imprimibles/No imprimibles" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:203 msgid "Set default extruder for the selected items" msgstr "Establir l'extrusor per defecte per als elements seleccionats" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 msgid "Set extruder number for the selected items" msgstr "Establir el número d'extrusor per als elements seleccionats" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 msgid "Objects List" msgstr "Llista d'objectes" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/MainFrame.cpp:1611 msgid "Open a G-code file" msgstr "Obrir un fitxer de codi G" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 -#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 -#: src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 src/slic3r/GUI/MainFrame.cpp:1443 +#: src/slic3r/GUI/MainFrame.cpp:1447 src/slic3r/GUI/MainFrame.cpp:1616 +#: src/slic3r/GUI/MainFrame.cpp:1620 msgid "Reload the plater from disk" msgstr "Carregar la base des del disc" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 msgid "Vertical slider - Move active thumb Up" msgstr "Control lliscant vertical - Moure el polze actiu cap a dalt" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:228 msgid "Vertical slider - Move active thumb Down" msgstr "Control lliscant vertical - Moure el polze actiu cap a baix" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 msgid "Horizontal slider - Move active thumb Left" msgstr "Control lliscant horitzontal - Moure el polze actiu cap a l'Esquerra" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 msgid "Horizontal slider - Move active thumb Right" msgstr "Control lliscant horitzontal - Moure el polze actiu cap a la Dreta" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:231 msgid "On/Off one layer mode of the vertical slider" msgstr "Activa/Desactiva el mode d'una capa del control lliscant vertical" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 -msgid "Show/Hide Legend and Estimated printing time" -msgstr "Mostrar/Ocultar Llegenda i Temps d'impressió estimat" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:232 +msgid "Show/Hide legend" +msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 msgid "Show/Hide G-code window" msgstr "Mostrar/Ocultar finestra de codi G" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4480 -#: src/slic3r/GUI/Tab.cpp:2832 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 src/slic3r/GUI/Plater.cpp:4562 +#: src/slic3r/GUI/Tab.cpp:2736 msgid "Preview" msgstr "Previsualització" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 msgid "Move active thumb Up" msgstr "Moure el polze actiu cap a dalt" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 msgid "Move active thumb Down" msgstr "Moure el polze actiu cap a baix" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 msgid "Set upper thumb as active" msgstr "Establir el polze superior com a actiu" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 msgid "Set lower thumb as active" msgstr "Establir el polze inferior com a actiu" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 msgid "Add color change marker for current layer" msgstr "Afegir marcador de canvi de color per a la capa actual" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:238 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:244 msgid "Delete color change marker for current layer" msgstr "Eliminar marcador de canvi de color per a la capa actual" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:250 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:251 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:245 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:256 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:257 msgid "" "Press to speed up 5 times while moving thumb\n" "with arrow keys or mouse wheel" @@ -5642,11 +6925,11 @@ msgstr "" "Prem per accelerar 5 vegades mentre mous el polze\n" "amb tecles de fletxa o roda del ratolí" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "Vertical Slider" msgstr "Control Lliscant Vertical" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "" "The following shortcuts are applicable in G-code preview when the vertical " "slider is active" @@ -5654,27 +6937,27 @@ msgstr "" "Les dreceres següents són aplicables a la vista prèvia del codi G quan el " "control lliscant vertical està actiu" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Move active thumb Left" msgstr "Moure el polze actiu cap a l'Esquerra" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Move active thumb Right" msgstr "Moure el polze actiu cap a la Dreta" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Set left thumb as active" msgstr "Establir el polze esquerre com a actiu" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Set right thumb as active" msgstr "Establir el polze dret com a actiu" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "Horizontal Slider" msgstr "Control Lliscant Horitzontal" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "" "The following shortcuts are applicable in G-code preview when the horizontal " "slider is active" @@ -5682,139 +6965,139 @@ msgstr "" "Les dreceres següents són aplicables a la vista prèvia del codi G quan el " "control lliscant horitzontal està actiu" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:278 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:284 msgid "Keyboard shortcuts" msgstr "Dreceres de teclat" -#: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:77 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open a new PrusaSlicer instance" msgstr "Obrir instància nova de PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:93 msgid "G-code preview" msgstr "Previsualització codi G" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:1388 msgid "Open G-code viewer" msgstr "Obrir visor codi G" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:91 src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open PrusaSlicer" msgstr "Obrir PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:93 msgid "Open new G-code viewer" msgstr "Obrir visor codi G nou" -#: src/slic3r/GUI/MainFrame.cpp:225 +#: src/slic3r/GUI/MainFrame.cpp:227 msgid "Closing PrusaSlicer. Current project is modified." msgstr "Sortint de PrusaSlicer. S'ha modificat el projecte actual." -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "PrusaSlicer is closing" msgstr "PrusaSlicer s'està tancant" -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "Closing PrusaSlicer while some presets are modified." msgstr "Tancant PrusaSlicer mentre es modifiquen alguns paràmetres." -#: src/slic3r/GUI/MainFrame.cpp:285 src/slic3r/GUI/MainFrame.cpp:335 -#: src/slic3r/GUI/Tab.hpp:427 src/slic3r/GUI/Tab.hpp:550 +#: src/slic3r/GUI/MainFrame.cpp:330 src/slic3r/GUI/MainFrame.cpp:380 +#: src/slic3r/GUI/Tab.hpp:413 src/slic3r/GUI/Tab.hpp:539 msgid "Print Settings" msgstr "Configuració d'Impressió" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:535 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:384 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:520 msgid "Material Settings" msgstr "Configuració del Material" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:461 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:382 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:448 msgid "Filament Settings" msgstr "Configuració del Filament" -#: src/slic3r/GUI/MainFrame.cpp:287 src/slic3r/GUI/MainFrame.cpp:341 -#: src/slic3r/GUI/Tab.hpp:503 +#: src/slic3r/GUI/MainFrame.cpp:332 src/slic3r/GUI/MainFrame.cpp:386 +#: src/slic3r/GUI/Tab.hpp:488 msgid "Printer Settings" msgstr "Configuració de la Impressora" -#: src/slic3r/GUI/MainFrame.cpp:632 src/slic3r/GUI/Plater.cpp:1719 -#: src/slic3r/GUI/Plater.cpp:2850 +#: src/slic3r/GUI/MainFrame.cpp:685 src/slic3r/GUI/Plater.cpp:1728 +#: src/slic3r/GUI/Plater.cpp:2879 msgid "Untitled" msgstr "Sense títol" -#: src/slic3r/GUI/MainFrame.cpp:655 +#: src/slic3r/GUI/MainFrame.cpp:710 msgid "based on Slic3r" msgstr "basat en Slic3r" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Prusa 3D &Drivers" msgstr "Controladors de Prusa 3&D" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Open the Prusa3D drivers download page in your browser" msgstr "Obrir la pàgina de descàrrega dels controladors Prusa3D al navegador" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Software &Releases" msgstr "Llançaments de &Software" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open the software releases page in your browser" msgstr "Obre la pàgina de llançaments de programari al teu navegador" -#: src/slic3r/GUI/MainFrame.cpp:1081 +#: src/slic3r/GUI/MainFrame.cpp:1158 #, c-format, boost-format msgid "%s &Website" msgstr "Lloc &Web de %s" -#: src/slic3r/GUI/MainFrame.cpp:1082 +#: src/slic3r/GUI/MainFrame.cpp:1159 #, c-format, boost-format msgid "Open the %s website in your browser" msgstr "Obriu el lloc web de %s al vostre navegador" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "System &Info" msgstr "&Informació del Sistema" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "Show system information" msgstr "Mostrar la informació del sistema" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show &Configuration Folder" msgstr "Mostra la carpeta &Configuració" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show user configuration folder (datadir)" msgstr "Mostrar carpeta de configuració d'usuari (datadir)" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "Report an I&ssue" msgstr "Informar d'un &problema" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 #, c-format, boost-format msgid "Report an issue on %s" msgstr "Reportar un problema a %s" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 #, c-format, boost-format msgid "&About %s" msgstr "&Sobre %s" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 msgid "Show about dialog" msgstr "Mostrar Sobre" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1177 msgid "Show Tip of the Day" msgstr "Mostra Consell del dia" -#: src/slic3r/GUI/MainFrame.cpp:1104 +#: src/slic3r/GUI/MainFrame.cpp:1181 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." @@ -5822,94 +7105,94 @@ msgstr "" "Obre la notificació del Consell del dia a la part inferior dreta o mostra un " "altre consell si ja està obert." -#: src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/MainFrame.cpp:1184 msgid "Show the list of the keyboard shortcuts" msgstr "Mostrar la llista de les dreceres de teclat" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso" msgstr "Iso" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso View" msgstr "Vista Iso" #. TRN To be shown in the main menu View->Top #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2917 -#: src/libslic3r/PrintConfig.cpp:2926 +#: src/slic3r/GUI/MainFrame.cpp:1202 src/libslic3r/PrintConfig.cpp:3005 +#: src/libslic3r/PrintConfig.cpp:3014 msgid "Top" msgstr "Superior" -#: src/slic3r/GUI/MainFrame.cpp:1125 +#: src/slic3r/GUI/MainFrame.cpp:1202 msgid "Top View" msgstr "Vista superior" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:446 -#: src/libslic3r/PrintConfig.cpp:455 +#: src/slic3r/GUI/MainFrame.cpp:1205 src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:474 msgid "Bottom" msgstr "Inferior" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1205 msgid "Bottom View" msgstr "Vista inferior" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front" msgstr "Frontal" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front View" msgstr "Vista frontal" -#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2274 +#: src/slic3r/GUI/MainFrame.cpp:1209 src/libslic3r/PrintConfig.cpp:2300 msgid "Rear" msgstr "Al darrere" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1209 msgid "Rear View" msgstr "Vista del darrere" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left" msgstr "Esquerra" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left View" msgstr "Vista esquerra" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right" msgstr "Dreta" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right View" msgstr "Vista dreta" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "&New Project" msgstr "&Nou projecte" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "Start a new project" msgstr "Començar un nou projecte" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "&Open Project" msgstr "&Obrir Projecte" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "Open a project file" msgstr "Obrir un fitxer de projecte" -#: src/slic3r/GUI/MainFrame.cpp:1157 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Recent projects" msgstr "Projectes recents" -#: src/slic3r/GUI/MainFrame.cpp:1169 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -5917,511 +7200,545 @@ msgstr "" "El projecte seleccionat no està disponible.\n" "Voleu suprimir-lo de la llista de projectes recents?" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Save Project" msgstr "&Desar Projecte" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "Save current project file" msgstr "Desar el projecte actual com" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save Project &as" msgstr "Desar Projecte &com" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save current project file as" msgstr "Desar fitxer de projecte actual com" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Import STL/3MF/STEP/OBJ/AM&F" msgstr "Importar STL/3MF/STEP/OBJ/AM&F" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Load a model" msgstr "Carregar un model" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Import STL (Imperial Units)" msgstr "Importar STL (unitats imperials)" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Load an model saved with imperial units" msgstr "Carregar un model guardat en unitats imperials" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Import SL1 / SL1S Archive" -msgstr "Importar fitxer SL1 / SL1S" +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Import SLA Archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Load an SLA archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Import ZIP Achive" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Load an SL1 / Sl1S archive" -msgstr "Carregar un fitxer SL1 / SL1S" +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Load a zip achive" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Import &Config" msgstr "Importar &Configuració" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Load exported configuration file" msgstr "Carregar fitxer de configuració exportat" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Import Config from &Project" msgstr "Importar Configuració des d'un &Projecte" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Load configuration from project file" msgstr "Carregar configuració des del fitxer de projecte" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Import Config &Bundle" msgstr "Importar &Conjunt de Configuració" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Load presets from a bundle" msgstr "Carregar ajustaments d'un paquet" -#: src/slic3r/GUI/MainFrame.cpp:1231 +#: src/slic3r/GUI/MainFrame.cpp:1311 msgid "&Import" msgstr "&Importar" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1314 src/slic3r/GUI/MainFrame.cpp:1676 msgid "Export &G-code" msgstr "Exportar el codi &G" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1314 msgid "Export current plate as G-code" msgstr "Exportar plataforma actual com a codi G" -#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1318 src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end G-code" msgstr "&Enviar codi G" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1318 msgid "Send to print current plate as G-code" msgstr "Enviar per imprimir la plataforma actual com a codi G" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export G-code to SD Card / Flash Drive" msgstr "Exportar G-code a la targeta SD/disc USB" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "Exporta a G-code a la targeta SD / disc USB" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export Plate as &STL" -msgstr "Exportar plataforma com a &ST" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export Plate as &STL/OBJ" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export current plate as STL" -msgstr "Exportar plataforma actual com a STL" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export current plate as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export Plate as STL &Including Supports" -msgstr "Exportar plataforma com a STL &incloent suports" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export Plate as STL/OBJ &Including Supports" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export current plate as STL including supports" -msgstr "Exportar la plataforma actual com a STL incloent suports" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export current plate as STL/OBJ including supports" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export &Toolpaths as OBJ" msgstr "Exportar &trajectòries d'eines com OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export toolpaths as OBJ" msgstr "Exportar trajectòries d'eines com a OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export &Config" msgstr "Exportar &Configuració" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export current configuration to file" msgstr "Exportar la configuració actual al fitxer" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export Config &Bundle" msgstr "Exportar Conjunt d'&Ajustos" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export all presets to file" msgstr "Exportar todos los ajustes al archivo" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export Config Bundle With Physical Printers" msgstr "Exportar Paquet de Configuració Amb Impressores Físiques" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export all presets including physical printers to file" msgstr "" "Exportar tots els paràmetres preestablerts, incloses les impressores " "físiques, a l'arxiu" -#: src/slic3r/GUI/MainFrame.cpp:1270 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "&Export" msgstr "&Exportar" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Ejec&t SD Card / Flash Drive" msgstr "Expulsar targeta &SD / disc USB" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "" "Expulsar la targeta SD / disc USB després que s'hi hagi exportat codi G." -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Quick Slice" msgstr "Laminat ràpid" -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Slice a file into a G-code" msgstr "Laminar un fitxer en un codi G" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Quick Slice and Save As" msgstr "Laminat ràpid i Desa Com" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Slice a file into a G-code, save as" msgstr "Laminar un fitxer en un codi G, guardar com" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat Last Quick Slice" msgstr "Repetir el darrer laminat Ràpid" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat last quick slice" msgstr "Repetir el darrer laminat ràpid" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "(Re)Slice No&w" msgstr "(Re)Laminar &Ara" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "Start new slicing process" msgstr "Començar un nou procés de laminat" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "&Repair STL file" msgstr "&Reparar fitxer STL" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "Automatically repair an STL file" msgstr "Repara automàticament un fitxer STL" -#: src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:1388 msgid "&G-code Preview" msgstr "Previsualització codi &G" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1392 +msgid "E&xit" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1392 src/slic3r/GUI/UpdateDialogs.cpp:376 +#: src/slic3r/GUI/UpdateDialogs.cpp:423 +#, c-format, boost-format +msgid "Exit %s" +msgstr "Sortir %s" + +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 msgid "&Quit" msgstr "&Sortir" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 #, c-format, boost-format msgid "Quit %s" msgstr "Tanca %s" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1410 msgid "&Select All" msgstr "&Seleccionar-ho tot" -#: src/slic3r/GUI/MainFrame.cpp:1327 +#: src/slic3r/GUI/MainFrame.cpp:1411 msgid "Selects all objects" msgstr "Selecciona tots els objectes" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1413 msgid "D&eselect All" msgstr "&Deseleccionar-ho tot" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1414 msgid "Deselects all objects" msgstr "Desmarca tots els objectes" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1417 msgid "&Delete Selected" msgstr "Eliminar Selecció" -#: src/slic3r/GUI/MainFrame.cpp:1334 +#: src/slic3r/GUI/MainFrame.cpp:1418 msgid "Deletes the current selection" msgstr "Suprimeix la selecció actual" -#: src/slic3r/GUI/MainFrame.cpp:1336 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Delete &All" msgstr "Eliminar &tot" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1421 msgid "Deletes all objects" msgstr "Suprimeix tots els objectes" -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1425 msgid "&Undo" msgstr "&Desfer" -#: src/slic3r/GUI/MainFrame.cpp:1344 +#: src/slic3r/GUI/MainFrame.cpp:1428 msgid "&Redo" msgstr "&Refer" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1433 msgid "&Copy" msgstr "&Copia" -#: src/slic3r/GUI/MainFrame.cpp:1350 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Copy selection to clipboard" msgstr "Copia la selecció al porta-retalls" -#: src/slic3r/GUI/MainFrame.cpp:1352 +#: src/slic3r/GUI/MainFrame.cpp:1436 msgid "&Paste" msgstr "&Enganxa" -#: src/slic3r/GUI/MainFrame.cpp:1353 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "Paste clipboard" msgstr "Enganxa el porta-retalls" -#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 -#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 +#: src/slic3r/GUI/MainFrame.cpp:1442 src/slic3r/GUI/MainFrame.cpp:1446 +#: src/slic3r/GUI/MainFrame.cpp:1615 src/slic3r/GUI/MainFrame.cpp:1619 msgid "Re&load from Disk" msgstr "&Recarregar des del disc" -#: src/slic3r/GUI/MainFrame.cpp:1368 +#: src/slic3r/GUI/MainFrame.cpp:1452 msgid "Searc&h" msgstr "&Cercar" -#: src/slic3r/GUI/MainFrame.cpp:1369 +#: src/slic3r/GUI/MainFrame.cpp:1453 msgid "Search in settings" msgstr "Cerca a la configuració" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "&Plater Tab" msgstr "&Pestanya Base d'impressió" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "Show the plater" msgstr "Mostrar la base" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "P&rint Settings Tab" msgstr "Configuració d'&Impressió" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "Show the print settings" msgstr "Mostra la configuració d'impressió" -#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1469 src/slic3r/GUI/MainFrame.cpp:1679 msgid "&Filament Settings Tab" msgstr "Pestanya Configuració &Filament" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1469 msgid "Show the filament settings" msgstr "Mostra la configuració del filament" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Print&er Settings Tab" msgstr "Pestanya Configuració &Impressora" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Show the printer settings" msgstr "Mostra la configuració de la impressora" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "3&D" msgstr "&3D" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "Show the 3D editing view" msgstr "Mostra la visualització d'edició 3D" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Pre&view" msgstr "&Previsualització" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Show the 3D slices preview" msgstr "Mostra la vista 3D preliminar del laminat" -#: src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/MainFrame.cpp:1488 msgid "Open the dialog to modify shape gallery" msgstr "Obre el diàleg per modificar la galeria de formes" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Print &Host Upload Queue" msgstr "Cua de pujada al &host d'impressió" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Display the Print Host Upload Queue window" msgstr "Mostra la finestra de la cua de càrrega de l'amfitrió" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open New Instance" msgstr "Obre una instància nova" -#: src/slic3r/GUI/MainFrame.cpp:1424 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 +#: src/slic3r/GUI/MainFrame.cpp:1507 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1727 msgid "Compare Presets" msgstr "Compara els predefinits" -#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/MainFrame.cpp:1507 msgid "Compare presets" msgstr "Compara els predefinits" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show &Labels" msgstr "Mostra les &etiquetes" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show object/instance labels in 3D scene" msgstr "Mostra les etiquetes d'objecte/instància a l'escena 3D" -#: src/slic3r/GUI/MainFrame.cpp:1437 +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show Legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show legend in preview" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1523 msgid "&Collapse Sidebar" msgstr "Barra lateral ocultable (&C)" -#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1523 src/slic3r/GUI/Plater.cpp:2347 msgid "Collapse sidebar" msgstr "Amagar barra lateral" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "&Fullscreen" msgstr "&Pantalla completa" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "Fullscreen" msgstr "Pantalla completa" -#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1543 src/slic3r/GUI/MainFrame.cpp:1650 msgid "&File" msgstr "&Arxiu" -#: src/slic3r/GUI/MainFrame.cpp:1458 +#: src/slic3r/GUI/MainFrame.cpp:1544 msgid "&Edit" msgstr "&Editar" -#: src/slic3r/GUI/MainFrame.cpp:1459 +#: src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Window" msgstr "&Finestra" -#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 +#: src/slic3r/GUI/MainFrame.cpp:1546 src/slic3r/GUI/MainFrame.cpp:1651 msgid "&View" msgstr "&Vista" -#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 +#: src/slic3r/GUI/MainFrame.cpp:1549 src/slic3r/GUI/MainFrame.cpp:1654 msgid "&Help" msgstr "&Ajuda" -#: src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/MainFrame.cpp:1611 msgid "&Open G-code" msgstr "&Obrir codi G" -#: src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open &PrusaSlicer" msgstr "Obre &PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legend" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1676 msgid "E&xport" msgstr "&Exportar" -#: src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end to print" msgstr "&Enviar per imprimir" -#: src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1679 msgid "Mate&rial Settings Tab" msgstr "Pestanya Configuració del &material" -#: src/slic3r/GUI/MainFrame.cpp:1613 +#: src/slic3r/GUI/MainFrame.cpp:1703 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Trieu un fitxer per laminar (STL/OBJ/AMF/3MF/PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1625 +#: src/slic3r/GUI/MainFrame.cpp:1715 msgid "No previously sliced file." msgstr "Cap fitxer prèviament laminat." -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid "Previously sliced file (" msgstr "Arxiu anterior laminat (" -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid ") not found." msgstr ") no trobat." -#: src/slic3r/GUI/MainFrame.cpp:1633 +#: src/slic3r/GUI/MainFrame.cpp:1723 msgid "File Not Found" msgstr "Arxiu no trobat" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 #, c-format, boost-format msgid "Save %s file as:" msgstr "Desa %s fitxer com a:" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "G-code" msgstr "Codi G" -#: src/slic3r/GUI/MainFrame.cpp:1680 +#: src/slic3r/GUI/MainFrame.cpp:1770 msgid "Save zip file as:" msgstr "Desa el fitxer zip com a:" -#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6064 src/slic3r/GUI/Tab.cpp:1666 -#: src/slic3r/GUI/Tab.cpp:4730 +#: src/slic3r/GUI/MainFrame.cpp:1779 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6654 src/slic3r/GUI/Tab.cpp:1628 +#: src/slic3r/GUI/Tab.cpp:4986 msgid "Slicing" msgstr "Laminant" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1691 +#: src/slic3r/GUI/MainFrame.cpp:1781 #, c-format, boost-format msgid "Processing %s" msgstr "Processant %s" -#: src/slic3r/GUI/MainFrame.cpp:1714 +#: src/slic3r/GUI/MainFrame.cpp:1804 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% ha estat laminat amb èxit." -#: src/slic3r/GUI/MainFrame.cpp:1717 +#: src/slic3r/GUI/MainFrame.cpp:1807 msgid "Slicing Done!" msgstr "Laminat realitzat!" -#: src/slic3r/GUI/MainFrame.cpp:1733 +#: src/slic3r/GUI/MainFrame.cpp:1823 msgid "Select the STL file to repair:" msgstr "Seleccioneu el fitxer STL que voleu reparar:" -#: src/slic3r/GUI/MainFrame.cpp:1743 +#: src/slic3r/GUI/MainFrame.cpp:1833 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "Desar fitxer OBJ (menys propens a errors de coordinació que STL) com:" -#: src/slic3r/GUI/MainFrame.cpp:1754 +#: src/slic3r/GUI/MainFrame.cpp:1844 msgid "Your file was repaired." msgstr "S'ha reparat el fitxer." -#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4528 +#: src/slic3r/GUI/MainFrame.cpp:1844 src/libslic3r/PrintConfig.cpp:4694 msgid "Repair" msgstr "Reparar" -#: src/slic3r/GUI/MainFrame.cpp:1768 +#: src/slic3r/GUI/MainFrame.cpp:1858 msgid "Save configuration as:" msgstr "Desa la configuració com a:" -#: src/slic3r/GUI/MainFrame.cpp:1785 +#: src/slic3r/GUI/MainFrame.cpp:1875 msgid "Loading of a configuration file" msgstr "S'està carregant un fitxer de configuració" -#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 +#: src/slic3r/GUI/MainFrame.cpp:1877 src/slic3r/GUI/MainFrame.cpp:1944 msgid "Select configuration to load:" msgstr "Seleccioneu la configuració que voleu carregar:" -#: src/slic3r/GUI/MainFrame.cpp:1816 +#: src/slic3r/GUI/MainFrame.cpp:1908 msgid "Exporting configuration bundle" msgstr "S'està exportant el paquet de configuració" -#: src/slic3r/GUI/MainFrame.cpp:1817 +#: src/slic3r/GUI/MainFrame.cpp:1909 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." @@ -6429,15 +7746,15 @@ msgstr "" "Alguns paràmetres estan modificats i els canvis no desats no s'exportaran al " "paquet de configuració." -#: src/slic3r/GUI/MainFrame.cpp:1826 +#: src/slic3r/GUI/MainFrame.cpp:1918 msgid "Save presets bundle as:" msgstr "Desa el paquet predefinit com a:" -#: src/slic3r/GUI/MainFrame.cpp:1849 +#: src/slic3r/GUI/MainFrame.cpp:1941 msgid "Loading of a configuration bundle" msgstr "Carregant un paquet de configuració" -#: src/slic3r/GUI/MainFrame.cpp:1879 +#: src/slic3r/GUI/MainFrame.cpp:1971 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d paràmetres inicials importats amb èxit." @@ -6506,19 +7823,19 @@ msgstr "%s informació" msgid "%s information" msgstr "%s informació" -#: src/slic3r/GUI/NotificationManager.hpp:752 +#: src/slic3r/GUI/NotificationManager.hpp:899 msgid "3D Mouse disconnected." msgstr "S'ha desconnectat el ratolí 3D." -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "Configuration update is available." msgstr "Disponible actualització de configuració." -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "See more." msgstr "Veure més." -#: src/slic3r/GUI/NotificationManager.hpp:761 +#: src/slic3r/GUI/NotificationManager.hpp:908 msgid "" "You have just added a G-code for color change, but its value is empty.\n" "To export the G-code correctly, check the \"Color Change G-code\" in " @@ -6528,7 +7845,7 @@ msgstr "" "Per exportar correctament el codi G, marqueu \"Codi G Canvi de Color\" a " "\"Configuració de la Impressora > Codi G Personalitzat\"" -#: src/slic3r/GUI/NotificationManager.hpp:764 +#: src/slic3r/GUI/NotificationManager.hpp:911 msgid "" "No color change event was added to the print. The print does not look like a " "sign." @@ -6536,144 +7853,187 @@ msgstr "" "No s'ha afegit cap esdeveniment de canvi de color a la impressió. La " "impressió no sembla un cartell." -#: src/slic3r/GUI/NotificationManager.hpp:766 +#: src/slic3r/GUI/NotificationManager.hpp:913 msgid "Desktop integration was successful." msgstr "La integració de l'escriptori s'ha realitzat correctament." -#: src/slic3r/GUI/NotificationManager.hpp:768 +#: src/slic3r/GUI/NotificationManager.hpp:915 msgid "Desktop integration failed." msgstr "La integració de l'escriptori ha fallat." -#: src/slic3r/GUI/NotificationManager.hpp:770 +#: src/slic3r/GUI/NotificationManager.hpp:917 msgid "Undo desktop integration was successful." msgstr "Desfer la integració a l'escriptori ha estat un èxit." -#: src/slic3r/GUI/NotificationManager.hpp:772 +#: src/slic3r/GUI/NotificationManager.hpp:919 msgid "Undo desktop integration failed." msgstr "No s'ha pogut desfer la integració de l'escriptori." -#: src/slic3r/GUI/NotificationManager.hpp:773 +#: src/slic3r/GUI/NotificationManager.hpp:920 msgid "Exporting." msgstr "Exportant." -#: src/slic3r/GUI/NotificationManager.cpp:664 +#: src/slic3r/GUI/NotificationManager.hpp:924 +msgid "" +"PrusaSlicer recieved a download request from Printables.com, but it's not " +"allowed. You can allow it" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:925 +msgid "here." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:773 msgid "Open Folder." msgstr "Obre la carpeta." -#: src/slic3r/GUI/NotificationManager.cpp:701 +#: src/slic3r/GUI/NotificationManager.cpp:811 msgid "Eject drive" msgstr "Expulsar la unitat" -#: src/slic3r/GUI/NotificationManager.cpp:885 +#: src/slic3r/GUI/NotificationManager.cpp:1054 +#: src/slic3r/GUI/NotificationManager.cpp:1267 +#: src/slic3r/GUI/NotificationManager.cpp:1472 msgid "ERROR" msgstr "ERROR" -#: src/slic3r/GUI/NotificationManager.cpp:890 -msgid "CANCELED" -msgstr "CANCEL·LAT" - -#: src/slic3r/GUI/NotificationManager.cpp:895 +#: src/slic3r/GUI/NotificationManager.cpp:1269 +#: src/slic3r/GUI/NotificationManager.cpp:1377 msgid "COMPLETED" msgstr "COMPLETAT" -#: src/slic3r/GUI/NotificationManager.cpp:937 +#: src/slic3r/GUI/NotificationManager.cpp:1467 +msgid "RESOLVING ADDRESS" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:1477 +msgid "CANCELED" +msgstr "CANCEL·LAT" + +#: src/slic3r/GUI/NotificationManager.cpp:1539 msgid "Cancel upload" msgstr "Cancel·la carrega" -#: src/slic3r/GUI/NotificationManager.cpp:996 +#: src/slic3r/GUI/NotificationManager.cpp:1648 #, c-format, boost-format msgid "%1$d object was loaded with custom supports." msgid_plural "%1$d objects were loaded with custom supports." msgstr[0] "%1$d S'ha carregat l'objecte amb suports personalitzats." msgstr[1] "%1$d S'han carregat els objectes amb suports personalitzats." -#: src/slic3r/GUI/NotificationManager.cpp:997 +#: src/slic3r/GUI/NotificationManager.cpp:1649 #, c-format, boost-format msgid "%1$d object was loaded with custom seam." msgid_plural "%1$d objects were loaded with custom seam." msgstr[0] "%1$d L'objecte s'ha carregat amb costura personalitzada." msgstr[1] "%1$d S'han carregat els objectes amb costura personalitzada." -#: src/slic3r/GUI/NotificationManager.cpp:998 +#: src/slic3r/GUI/NotificationManager.cpp:1650 #, c-format, boost-format msgid "%1$d object was loaded with multimaterial painting." msgid_plural "%1$d objects were loaded with multimaterial painting." msgstr[0] "%1$d L'objecte es va carregar amb pintura multimaterial." msgstr[1] "%1$d S'han carregat els objectes amb pintura multimaterial." -#: src/slic3r/GUI/NotificationManager.cpp:999 +#: src/slic3r/GUI/NotificationManager.cpp:1651 #, c-format, boost-format msgid "%1$d object was loaded with variable layer height." msgid_plural "%1$d objects were loaded with variable layer height." msgstr[0] "%1$d L'objecte s'ha carregat amb alçada de capa variable." msgstr[1] "%1$d S'han carregat els objectes amb alçada de capa variable." -#: src/slic3r/GUI/NotificationManager.cpp:1000 +#: src/slic3r/GUI/NotificationManager.cpp:1652 #, c-format, boost-format msgid "%1$d object was loaded with partial sinking." msgid_plural "%1$d objects were loaded with partial sinking." msgstr[0] "%1$d L'objecte s'ha carregat amb un enfonsament parcial." msgstr[1] "%1$d S'han carregat els objectes amb un enfonsament parcial." -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1653 +#, c-format, boost-format +msgid "%1$d object was loaded as a part of cut object." +msgid_plural "%1$d objects were loaded as parts of cut object" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Slicing finished." msgstr "Laminat finalitzat." -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export G-Code." msgstr "Exportar el codi G." -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export." msgstr "Exportar." -#: src/slic3r/GUI/NotificationManager.cpp:1447 -#: src/slic3r/GUI/NotificationManager.cpp:1454 -#: src/slic3r/GUI/NotificationManager.cpp:1470 -#: src/slic3r/GUI/NotificationManager.cpp:1476 -#: src/slic3r/GUI/NotificationManager.cpp:1547 +#: src/slic3r/GUI/NotificationManager.cpp:2101 +#: src/slic3r/GUI/NotificationManager.cpp:2108 +#: src/slic3r/GUI/NotificationManager.cpp:2124 +#: src/slic3r/GUI/NotificationManager.cpp:2130 +#: src/slic3r/GUI/NotificationManager.cpp:2201 msgid "ERROR:" msgstr "ERROR:" -#: src/slic3r/GUI/NotificationManager.cpp:1459 -#: src/slic3r/GUI/NotificationManager.cpp:1486 -#: src/slic3r/GUI/NotificationManager.cpp:1494 -#: src/slic3r/GUI/NotificationManager.cpp:1505 src/slic3r/GUI/Plater.cpp:3197 +#: src/slic3r/GUI/NotificationManager.cpp:2113 +#: src/slic3r/GUI/NotificationManager.cpp:2140 +#: src/slic3r/GUI/NotificationManager.cpp:2148 +#: src/slic3r/GUI/NotificationManager.cpp:2159 src/slic3r/GUI/Plater.cpp:3220 msgid "WARNING:" msgstr "AVÍS:" -#: src/slic3r/GUI/NotificationManager.cpp:1598 +#: src/slic3r/GUI/NotificationManager.cpp:2275 msgid "Exporting finished." msgstr "S'ha acabat l'exportació." -#: src/slic3r/GUI/ObjectDataViewModel.cpp:50 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 msgid "Paint-on seam" msgstr "Pintat de costures" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:52 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:68 +msgid "Cut connectors" +msgstr "" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:70 msgid "Sinking" msgstr "Enfonsament" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:110 msgid "Instances" msgstr "Instàncies" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:98 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:266 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:114 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:275 #, c-format, boost-format msgid "Instance %d" msgstr "Instància %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4568 -#: src/slic3r/GUI/Tab.cpp:4659 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:121 src/slic3r/GUI/Tab.cpp:4805 +#: src/slic3r/GUI/Tab.cpp:4942 msgid "Layers" msgstr "Capes" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 msgid "Range" msgstr "Rang" -#: src/slic3r/GUI/OpenGLManager.cpp:258 +#: src/slic3r/GUI/OpenGLManager.cpp:376 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL ES 2.0 capable graphics driver to run " +"correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:379 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL %s capable graphics driver to run correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:382 #, c-format, boost-format msgid "" "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" @@ -6684,11 +8044,11 @@ msgstr "" "mentre que la versió %s OpenGL, renderitzat %s, el venedor %s va ser " "detectada." -#: src/slic3r/GUI/OpenGLManager.cpp:261 +#: src/slic3r/GUI/OpenGLManager.cpp:386 msgid "You may need to update your graphics card driver." msgstr "Potser necessiteu actualitzar la vostra targeta gràfica." -#: src/slic3r/GUI/OpenGLManager.cpp:264 +#: src/slic3r/GUI/OpenGLManager.cpp:389 msgid "" "As a workaround, you may run PrusaSlicer with a software rendered 3D " "graphics by running prusa-slicer.exe with the --sw-renderer parameter." @@ -6696,11 +8056,11 @@ msgstr "" "Com a solució, podeu executar PrusaSlicer amb gràfics 3D renderitzats per " "programari executant prusa-slicer.exe amb el paràmetre --sw-renderer." -#: src/slic3r/GUI/OpenGLManager.cpp:266 +#: src/slic3r/GUI/OpenGLManager.cpp:391 msgid "Unsupported OpenGL version" msgstr "Versió OpenGL no admesa" -#: src/slic3r/GUI/OpenGLManager.cpp:274 +#: src/slic3r/GUI/OpenGLManager.cpp:399 #, c-format, boost-format msgid "" "Unable to load the following shaders:\n" @@ -6709,16 +8069,20 @@ msgstr "" "No es poden carregar les ombres següents:\n" "%s" -#: src/slic3r/GUI/OpenGLManager.cpp:275 +#: src/slic3r/GUI/OpenGLManager.cpp:400 msgid "Error loading shaders" msgstr "Error en carregar ombres" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:126 +msgid "Unavailable for this method." +msgstr "" + +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Top" msgstr "Superior" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Bottom" msgstr "Inferior" @@ -6727,7 +8091,7 @@ msgstr "Inferior" msgid "Delete this preset from this printer device" msgstr "Suprimeix aquest valor predefinit d'aquesta impressora" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:83 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:84 msgid "This printer will be shown in the presets list as" msgstr "" "Aquesta impressora es mostrarà a la llista de paràmetres preestablerts com" @@ -6744,33 +8108,33 @@ msgstr "Nom descriptiu de la impressora" msgid "Add preset for this printer device" msgstr "Afegir ajustament preestablert per a aquest dispositiu d'impressió" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2255 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2239 msgid "Print Host upload" msgstr "Cua de pujada al host d'impressió" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:268 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:271 msgid "Connection to printers connected via the print host failed." msgstr "" "No s'ha pogut connectar a les impressores connectades mitjançant l'amfitrió " "d'impressió." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:310 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:313 msgid "Test" msgstr "Test" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:315 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:318 msgid "Could not get a valid Printer Host reference" msgstr "No he pogut aconseguir una referència vàlida del gestor d'impressora" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:330 msgid "Success!" msgstr "Èxit!" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:337 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:340 msgid "Refresh Printers" msgstr "Actualitzar llista d'impressores" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:367 msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." @@ -6778,20 +8142,20 @@ msgstr "" "El fitxer HTTPS CA és opcional. Només es necessita si utilitzaràs HTTPS amb " "un certificat autosignat." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:374 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:377 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "Fitxers de certificats (*.crt, *.pem)|*.crt;*.pem|Tots|*.*" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:378 msgid "Open CA certificate file" msgstr "Obrir fitxer de certificat CA" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:404 -#: src/libslic3r/PrintConfig.cpp:330 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:407 +#: src/libslic3r/PrintConfig.cpp:343 msgid "HTTPS CA File" msgstr "Arxiu HTTPS CA" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:405 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:408 #, c-format, boost-format msgid "" "On this system, %s uses HTTPS certificates from the system Certificate Store " @@ -6800,7 +8164,7 @@ msgstr "" "En aquest sistema, %s utilitza certificats HTTPS del magatzem de certificats " "o clauer." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:406 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:409 msgid "" "To use a custom CA file, please import your CA file into Certificate Store / " "Keychain." @@ -6808,24 +8172,24 @@ msgstr "" "Per utilitzar un fitxer CA personalitzat, importa el teu fitxer CA al " "Magatzem de Certificats/Clauer." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:634 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:706 msgid "The supplied name is empty. It can't be saved." msgstr "El nom proporcionat és buit. No es pot desar." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:638 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:710 msgid "You have to enter a printer name." msgstr "Heu d'introduir un nom d'impressora." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:646 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:718 #, boost-format msgid "Printer with name \"%1%\" already exists." msgstr "La impressora amb nom \"%1%\" ja existeix." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:647 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:719 msgid "Replace?" msgstr "Reemplaçar?" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:674 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:746 #, boost-format msgid "" "Following printer preset is duplicated:%1%The above preset for printer \"%2%" @@ -6840,21 +8204,21 @@ msgstr[1] "" "Els paràmetres següents de la impressora estan duplicats: %1%Els paràmetres " "anteriors per a la impressora \"%2%\" s'utilitzaran només una vegada." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:724 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:796 msgid "It's not possible to delete the last related preset for the printer." msgstr "" "No es pot suprimir el darrer paràmetre preestablert relacionat amb la " "impressora." -#: src/slic3r/GUI/Plater.cpp:141 +#: src/slic3r/GUI/Plater.cpp:158 msgid "The provided name is not valid;" msgstr "El nom proporcionat no és vàlid;" -#: src/slic3r/GUI/Plater.cpp:142 src/slic3r/GUI/SavePresetDialog.cpp:102 +#: src/slic3r/GUI/Plater.cpp:159 src/slic3r/GUI/SavePresetDialog.cpp:166 msgid "the following characters are not allowed:" msgstr "no es permeten els caràcters següents:" -#: src/slic3r/GUI/Plater.cpp:207 +#: src/slic3r/GUI/Plater.cpp:223 msgid "" "For a multipart object, this value isn't accurate.\n" "It doesn't take account of intersections and negative volumes." @@ -6862,69 +8226,69 @@ msgstr "" "Per a un objecte de diverses parts, aquest valor no cal.\n" "No té en compte les interseccions i els volums negatius." -#: src/slic3r/GUI/Plater.cpp:211 +#: src/slic3r/GUI/Plater.cpp:227 msgid "Volume" msgstr "Volum" -#: src/slic3r/GUI/Plater.cpp:213 +#: src/slic3r/GUI/Plater.cpp:229 msgid "Facets" msgstr "Facetes" -#: src/slic3r/GUI/Plater.cpp:276 +#: src/slic3r/GUI/Plater.cpp:286 msgid "Sliced Info" msgstr "Informació del laminat" -#: src/slic3r/GUI/Plater.cpp:296 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:306 src/slic3r/GUI/Plater.cpp:1414 msgid "Used Filament (g)" msgstr "Filament Usat (g)" -#: src/slic3r/GUI/Plater.cpp:297 src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:307 src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (m)" msgstr "Filament Usat (m)" -#: src/slic3r/GUI/Plater.cpp:298 src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:308 src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (mm³)" msgstr "Filament Usat (mm³)" -#: src/slic3r/GUI/Plater.cpp:299 +#: src/slic3r/GUI/Plater.cpp:309 msgid "Used Material (unit)" msgstr "Material usat (unitats)" -#: src/slic3r/GUI/Plater.cpp:300 +#: src/slic3r/GUI/Plater.cpp:310 msgid "Cost (money)" msgstr "Cost (diners)" -#: src/slic3r/GUI/Plater.cpp:301 src/slic3r/GUI/Plater.cpp:1340 -#: src/slic3r/GUI/Plater.cpp:1427 +#: src/slic3r/GUI/Plater.cpp:311 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:1464 msgid "Estimated printing time" msgstr "Temps d'impressió estimat" -#: src/slic3r/GUI/Plater.cpp:302 +#: src/slic3r/GUI/Plater.cpp:312 msgid "Number of tool changes" msgstr "Nombre de canvis d'eina" -#: src/slic3r/GUI/Plater.cpp:431 +#: src/slic3r/GUI/Plater.cpp:437 msgid "Select what kind of support do you need" msgstr "Selecciona quin tipus de suport necessites" -#: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2590 -#: src/libslic3r/PrintConfig.cpp:3645 +#: src/slic3r/GUI/Plater.cpp:440 src/libslic3r/PrintConfig.cpp:2620 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "Support on build plate only" msgstr "Suport a la base només" -#: src/slic3r/GUI/Plater.cpp:434 src/slic3r/GUI/Plater.cpp:564 +#: src/slic3r/GUI/Plater.cpp:441 msgid "For support enforcers only" msgstr "Només per a forçat de suports" -#: src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Plater.cpp:442 msgid "Everywhere" msgstr "A tot arreu" -#: src/slic3r/GUI/Plater.cpp:467 src/slic3r/GUI/Tab.cpp:1542 +#: src/slic3r/GUI/Plater.cpp:475 src/slic3r/GUI/Tab.cpp:1489 msgid "Brim" msgstr "Bassa" -#: src/slic3r/GUI/Plater.cpp:469 +#: src/slic3r/GUI/Plater.cpp:477 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." @@ -6932,116 +8296,113 @@ msgstr "" "Aquesta opció activa la bassa que s'imprimirà al voltant de l'objecte a la " "primera capa." -#: src/slic3r/GUI/Plater.cpp:477 +#: src/slic3r/GUI/Plater.cpp:485 msgid "Purging volumes" msgstr "Volums de purga" -#: src/slic3r/GUI/Plater.cpp:578 +#: src/slic3r/GUI/Plater.cpp:592 msgid "Select what kind of pad do you need" msgstr "Selecciona quin tipus de pad necessites" -#: src/slic3r/GUI/Plater.cpp:580 +#: src/slic3r/GUI/Plater.cpp:595 msgid "Below object" msgstr "A sota de l'objecte" -#: src/slic3r/GUI/Plater.cpp:581 +#: src/slic3r/GUI/Plater.cpp:596 msgid "Around object" msgstr "Al voltant de l'objecte" -#: src/slic3r/GUI/Plater.cpp:894 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/Plater.cpp:929 src/slic3r/GUI/Plater.cpp:7162 msgid "Send to printer" msgstr "Enviar a la impressora" -#: src/slic3r/GUI/Plater.cpp:914 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6067 +#: src/slic3r/GUI/Plater.cpp:949 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6657 msgid "Slice now" msgstr "Laminar ara" -#: src/slic3r/GUI/Plater.cpp:1087 +#: src/slic3r/GUI/Plater.cpp:1127 msgid "Hold Shift to Slice & Export G-code" msgstr "Mantingueu pressionada la tecla Shift per laminar i exportar el codi G" -#: src/slic3r/GUI/Plater.cpp:1287 +#: src/slic3r/GUI/Plater.cpp:1324 #, boost-format msgid "%1% (%2$d shell)" msgid_plural "%1% (%2$d shells)" msgstr[0] "%1% (%2$d carcassa)" msgstr[1] "%1% (%2$d carcasses)" -#: src/slic3r/GUI/Plater.cpp:1315 +#: src/slic3r/GUI/Plater.cpp:1352 msgid "Used Material (ml)" msgstr "Material utilitzat (ml)" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "object" msgid_plural "objects" msgstr[0] "objecte" msgstr[1] "objectes" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "supports and pad" msgstr "suports i pad" -#: src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (in)" msgstr "Filament usat (in)" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "objects" msgstr "objectes" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "wipe tower" msgstr "torre de Neteja" -#: src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (in³)" msgstr "Filament usat (in³)" -#: src/slic3r/GUI/Plater.cpp:1396 +#: src/slic3r/GUI/Plater.cpp:1433 #, boost-format msgid "Filament at extruder %1%" msgstr "Filament en extrusor %1%" -#: src/slic3r/GUI/Plater.cpp:1402 +#: src/slic3r/GUI/Plater.cpp:1439 msgid "(including spool)" msgstr "(inclosa la bobina)" -#: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1072 -#: src/libslic3r/PrintConfig.cpp:3439 src/libslic3r/PrintConfig.cpp:3440 +#: src/slic3r/GUI/Plater.cpp:1448 src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:3716 src/libslic3r/PrintConfig.cpp:3717 msgid "Cost" msgstr "Cost" -#: src/slic3r/GUI/Plater.cpp:1429 +#: src/slic3r/GUI/Plater.cpp:1466 msgid "normal mode" msgstr "mode normal" -#: src/slic3r/GUI/Plater.cpp:1436 +#: src/slic3r/GUI/Plater.cpp:1473 msgid "stealth mode" msgstr "mode silenciós" -#: src/slic3r/GUI/Plater.cpp:1670 -msgid "Fill bed" -msgstr "Omplir la base" - -#: src/slic3r/GUI/Plater.cpp:1676 -msgid "Optimize Rotation" -msgstr "Optimitza la rotació" - -#: src/slic3r/GUI/Plater.cpp:1682 -msgid "Import SLA archive" -msgstr "Importar fitxer SLA" - -#: src/slic3r/GUI/Plater.cpp:1725 +#: src/slic3r/GUI/Plater.cpp:1734 #, boost-format msgid "Do you want to save the changes to \"%1%\"?" msgstr "Voleu desar els canvis a \"%1%\"?" -#: src/slic3r/GUI/Plater.cpp:1730 src/slic3r/GUI/Preferences.cpp:222 +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:905 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1599 +msgid "Save" +msgstr "Desar" + +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +msgid "Discard" +msgstr "Descartar" + +#: src/slic3r/GUI/Plater.cpp:1740 src/slic3r/GUI/Preferences.cpp:354 msgid "Ask for unsaved changes in project" msgstr "Preguntar pels canvis no desats al projecte" -#: src/slic3r/GUI/Plater.cpp:1733 +#: src/slic3r/GUI/Plater.cpp:1743 msgid "" "You will not be asked about it again, when: \n" "- Closing PrusaSlicer,\n" @@ -7051,7 +8412,7 @@ msgstr "" "- Tanquis PrusaSlicer,\n" "- Carreguis o creis un nou projecte" -#: src/slic3r/GUI/Plater.cpp:2198 +#: src/slic3r/GUI/Plater.cpp:2214 #, c-format, boost-format msgid "" "Successfully unmounted. The device %s(%s) can now be safely removed from the " @@ -7060,20 +8421,20 @@ msgstr "" "Desmuntat amb èxit. El dispositiu %s (%s) ara es pot retirar de manera " "segura de l'ordinador." -#: src/slic3r/GUI/Plater.cpp:2203 +#: src/slic3r/GUI/Plater.cpp:2220 #, c-format, boost-format msgid "Ejecting of device %s(%s) has failed." msgstr "L'expulsió del dispositiu %s(%s) ha fallat." -#: src/slic3r/GUI/Plater.cpp:2222 src/slic3r/GUI/Plater.cpp:5108 +#: src/slic3r/GUI/Plater.cpp:2239 src/slic3r/GUI/Plater.cpp:5199 msgid "New Project" msgstr "Nou Projecte" -#: src/slic3r/GUI/Plater.cpp:2319 +#: src/slic3r/GUI/Plater.cpp:2346 msgid "Expand sidebar" msgstr "Expandeix la barra lateral" -#: src/slic3r/GUI/Plater.cpp:2518 +#: src/slic3r/GUI/Plater.cpp:2428 msgid "" "The preset below was temporarily installed on the active instance of " "PrusaSlicer" @@ -7087,13 +8448,13 @@ msgstr[1] "" "Els paràmetres de sota han estat instal·lats temporalment a la instància " "activa de PrusaSlicer" -#: src/slic3r/GUI/Plater.cpp:2548 +#: src/slic3r/GUI/Plater.cpp:2583 #, boost-format msgid "Failed loading file \"%1%\" due to an invalid configuration." msgstr "" "Error en carregar el fitxer \"%1%\" a causa d'una configuració no vàlida." -#: src/slic3r/GUI/Plater.cpp:2568 +#: src/slic3r/GUI/Plater.cpp:2603 #, c-format, boost-format msgid "" "Object size from file %s appears to be zero.\n" @@ -7108,11 +8469,11 @@ msgstr[1] "" "La mida dels objectes del fitxer %s sembla ser zero.\n" "Aquests objectes han estat eliminats del model" -#: src/slic3r/GUI/Plater.cpp:2572 +#: src/slic3r/GUI/Plater.cpp:2607 msgid "The size of the object is zero" msgstr "La mida de l'objecte és zero" -#: src/slic3r/GUI/Plater.cpp:2585 +#: src/slic3r/GUI/Plater.cpp:2620 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in meters.\n" @@ -7131,15 +8492,15 @@ msgstr[1] "" "La unitat interna de PrusaSlicer és el mil·límetre. Voleu recalcular les " "dimensions d'aquests objectes?" -#: src/slic3r/GUI/Plater.cpp:2589 src/slic3r/GUI/Plater.cpp:2611 +#: src/slic3r/GUI/Plater.cpp:2624 src/slic3r/GUI/Plater.cpp:2646 msgid "The object is too small" msgstr "L'objecte és massa petit" -#: src/slic3r/GUI/Plater.cpp:2590 src/slic3r/GUI/Plater.cpp:2612 +#: src/slic3r/GUI/Plater.cpp:2625 src/slic3r/GUI/Plater.cpp:2647 msgid "Apply to all the remaining small objects being loaded." msgstr "Aplica-ho a tots els objectes petits restants que s'estan carregant." -#: src/slic3r/GUI/Plater.cpp:2607 +#: src/slic3r/GUI/Plater.cpp:2642 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in inches.\n" @@ -7158,7 +8519,7 @@ msgstr[1] "" "polzades. La unitat interna de PrusaSlicer és el mil·límetre. Voleu " "recalcular les dimensions d'aquests objectes?" -#: src/slic3r/GUI/Plater.cpp:2625 +#: src/slic3r/GUI/Plater.cpp:2659 msgid "" "This file contains several objects positioned at multiple heights.\n" "Instead of considering them as multiple objects, should \n" @@ -7168,31 +8529,22 @@ msgstr "" "En lloc de considerar-los com a objectes múltiples, s'hauria de carregar\n" "el fitxer com un sol objecte amb múltiples parts?" -#: src/slic3r/GUI/Plater.cpp:2628 src/slic3r/GUI/Plater.cpp:2683 +#: src/slic3r/GUI/Plater.cpp:2662 src/slic3r/GUI/Plater.cpp:2711 msgid "Multi-part object detected" msgstr "Objecte de peces múltiples detectat" -#: src/slic3r/GUI/Plater.cpp:2636 +#: src/slic3r/GUI/Plater.cpp:2669 msgid "" "This file cannot be loaded in a simple mode. Do you want to switch to an " "advanced mode?" msgstr "" "Aquest fitxer no es pot carregar en mode simple. Vols canviar al mode expert?" -#: src/slic3r/GUI/Plater.cpp:2637 +#: src/slic3r/GUI/Plater.cpp:2670 msgid "Detected advanced data" msgstr "Dades avançades detectades" -#: src/slic3r/GUI/Plater.cpp:2657 -#, c-format, boost-format -msgid "" -"You can't to add the object(s) from %s because of one or some of them " -"is(are) multi-part" -msgstr "" -"No podeu afegir l'objecte(s) des de % s perquè un o alguns d'ells són de " -"diverses peces" - -#: src/slic3r/GUI/Plater.cpp:2680 +#: src/slic3r/GUI/Plater.cpp:2708 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" @@ -7203,7 +8555,7 @@ msgstr "" "En lloc de considerar-los com a objectes múltiples, hauria de considerar\n" "aquests fitxers per formar un sol objecte que té diverses parts?" -#: src/slic3r/GUI/Plater.cpp:2799 +#: src/slic3r/GUI/Plater.cpp:2827 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." @@ -7211,39 +8563,54 @@ msgstr "" "La teva peça sembla massa gran, així que s'ha escalat automàticament perquè " "pugui cabre a la base d'impressió." -#: src/slic3r/GUI/Plater.cpp:2800 +#: src/slic3r/GUI/Plater.cpp:2828 msgid "Object too large?" msgstr "Objecte massa gran?" -#: src/slic3r/GUI/Plater.cpp:2878 +#: src/slic3r/GUI/Plater.cpp:2908 msgid "Export STL file:" msgstr "Exporta el fitxer STL:" -#: src/slic3r/GUI/Plater.cpp:2885 +#: src/slic3r/GUI/Plater.cpp:2915 msgid "Export AMF file:" msgstr "Exporta el fitxer AMF:" -#: src/slic3r/GUI/Plater.cpp:2891 +#: src/slic3r/GUI/Plater.cpp:2921 msgid "Save file as:" msgstr "Desa el fitxer com a:" -#: src/slic3r/GUI/Plater.cpp:2897 +#: src/slic3r/GUI/Plater.cpp:2927 msgid "Export OBJ file:" msgstr "Exporta el fitxer OBJ:" -#: src/slic3r/GUI/Plater.cpp:2995 +#: src/slic3r/GUI/Plater.cpp:3030 +msgid "Delete object which is a part of cut object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3031 +msgid "" +"You try to delete an object which is a part of a cut object.\n" +"This action will break a cut correspondence.\n" +"After that PrusaSlicer can't guarantee model consistency" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3035 +msgid "Delete object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3040 msgid "Delete Object" msgstr "Suprimeix l'objecte" -#: src/slic3r/GUI/Plater.cpp:3007 +#: src/slic3r/GUI/Plater.cpp:3057 msgid "Delete All Objects" msgstr "Suprimeix tots els objectes" -#: src/slic3r/GUI/Plater.cpp:3035 +#: src/slic3r/GUI/Plater.cpp:3086 msgid "Reset Project" msgstr "Reinicialitza el projecte" -#: src/slic3r/GUI/Plater.cpp:3118 +#: src/slic3r/GUI/Plater.cpp:3141 msgid "" "The selected object couldn't be split because it contains only one solid " "part." @@ -7251,15 +8618,15 @@ msgstr "" "L'objecte seleccionat no s'ha pogut dividir perquè només conté una part " "sòlida." -#: src/slic3r/GUI/Plater.cpp:3125 +#: src/slic3r/GUI/Plater.cpp:3148 msgid "All non-solid parts (modifiers) were deleted" msgstr "S'han eliminat totes les parts no sòlides (modificadors)" -#: src/slic3r/GUI/Plater.cpp:3127 +#: src/slic3r/GUI/Plater.cpp:3150 msgid "Split to Objects" msgstr "Partir en diverses peces" -#: src/slic3r/GUI/Plater.cpp:3179 +#: src/slic3r/GUI/Plater.cpp:3202 msgid "" "An object has custom support enforcers which will not be used because " "supports are disabled." @@ -7267,87 +8634,88 @@ msgstr "" "Un objecte té reforçadors de suport personalitzats que no es faran servir " "perquè els suports estan desactivats." -#: src/slic3r/GUI/Plater.cpp:3181 +#: src/slic3r/GUI/Plater.cpp:3204 msgid "Enable supports for enforcers only" msgstr "Habilitar suports només per als reforçadors" -#: src/slic3r/GUI/Plater.cpp:3310 src/slic3r/GUI/Plater.cpp:4176 +#: src/slic3r/GUI/Plater.cpp:3339 src/slic3r/GUI/Plater.cpp:4238 msgid "Invalid data" msgstr "Les dades no són vàlides" -#: src/slic3r/GUI/Plater.cpp:3380 +#: src/slic3r/GUI/Plater.cpp:3410 msgid "Another export job is currently running." msgstr "Actualment s'està executant una altra feina d'exportació." -#: src/slic3r/GUI/Plater.cpp:3466 +#: src/slic3r/GUI/Plater.cpp:3496 msgid "Replace from:" msgstr "Reemplaçar des de:" -#: src/slic3r/GUI/Plater.cpp:3484 +#: src/slic3r/GUI/Plater.cpp:3514 msgid "Unable to replace with more than one volume" msgstr "No es pot substituir per més d'un volum" -#: src/slic3r/GUI/Plater.cpp:3484 src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3514 src/slic3r/GUI/Plater.cpp:3597 msgid "Error during replace" msgstr "S'ha produït un error durant la substitució" -#: src/slic3r/GUI/Plater.cpp:3555 +#: src/slic3r/GUI/Plater.cpp:3589 msgid "Select the new file" msgstr "Seleccioneu el fitxer nou" -#: src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3597 msgid "File for the replace wasn't selected" msgstr "No s'ha seleccionat el fitxer per a la substitució" -#: src/slic3r/GUI/Plater.cpp:3654 +#: src/slic3r/GUI/Plater.cpp:3684 msgid "Please select the file to reload" msgstr "Seleccioneu el fitxer que voleu tornar a carregar" -#: src/slic3r/GUI/Plater.cpp:3685 src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:3715 src/slic3r/GUI/Plater.cpp:5355 +#: src/slic3r/GUI/Plater.cpp:5365 msgid "The selected file" msgstr "El fitxer seleccionat" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "differs from the original file" msgstr "difereix del fitxer original" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "Do you want to replace it" msgstr "Voleu substituir-lo" -#: src/slic3r/GUI/Plater.cpp:3703 src/slic3r/GUI/Plater.cpp:3709 +#: src/slic3r/GUI/Plater.cpp:3736 src/slic3r/GUI/Plater.cpp:3742 msgid "Reload from:" msgstr "Torna a carregar des de:" -#: src/slic3r/GUI/Plater.cpp:3812 +#: src/slic3r/GUI/Plater.cpp:3864 msgid "Unable to reload:" msgstr "No es pot tornar a carregar:" -#: src/slic3r/GUI/Plater.cpp:3817 +#: src/slic3r/GUI/Plater.cpp:3869 msgid "Error during reload" msgstr "S'ha produït un error durant la recàrrega" -#: src/slic3r/GUI/Plater.cpp:3835 +#: src/slic3r/GUI/Plater.cpp:3887 msgid "Reload all from disk" msgstr "Torna a carregar-ho tot des del disc" -#: src/slic3r/GUI/Plater.cpp:4130 +#: src/slic3r/GUI/Plater.cpp:4191 msgid "There are active warnings concerning sliced models:" msgstr "Hi ha advertiments actius sobre els models laminats:" -#: src/slic3r/GUI/Plater.cpp:4141 +#: src/slic3r/GUI/Plater.cpp:4202 msgid "generated warnings" msgstr "advertiments generats" -#: src/slic3r/GUI/Plater.cpp:4472 +#: src/slic3r/GUI/Plater.cpp:4554 msgid "3D editor view" msgstr "Vista editor 3D" -#: src/slic3r/GUI/Plater.cpp:4893 +#: src/slic3r/GUI/Plater.cpp:4980 msgid "Undo / Redo is processing" msgstr "Desfer / Refer s'està processant" -#: src/slic3r/GUI/Plater.cpp:4895 +#: src/slic3r/GUI/Plater.cpp:4982 #, boost-format msgid "" "Switching the printer technology from %1% to %2%.\n" @@ -7358,21 +8726,21 @@ msgstr "" "S'han modificat alguns paràmetres de %1%, que es perdran després de canviar " "la tecnologia de la impressora." -#: src/slic3r/GUI/Plater.cpp:5092 +#: src/slic3r/GUI/Plater.cpp:5184 msgid "Creating a new project while the current project is modified." msgstr "Creant un projecte nou mentre es modifica el projecte actual." -#: src/slic3r/GUI/Plater.cpp:5095 +#: src/slic3r/GUI/Plater.cpp:5187 msgid "Creating a new project while some presets are modified." msgstr "Creant un nou projecte mentre es modifiquen alguns paràmetres." -#: src/slic3r/GUI/Plater.cpp:5096 +#: src/slic3r/GUI/Plater.cpp:5188 msgid "You can keep presets modifications to the new project or discard them" msgstr "" "Pots mantenir les modificacions dels preajustaments al nou projecte o " "descartar-los" -#: src/slic3r/GUI/Plater.cpp:5097 +#: src/slic3r/GUI/Plater.cpp:5189 msgid "" "You can keep presets modifications to the new project, discard them or save " "changes as new presets.\n" @@ -7383,125 +8751,172 @@ msgstr "" "Tingueu en compte que si es desen els canvis, el projecte nou no els " "conservarà" -#: src/slic3r/GUI/Plater.cpp:5103 +#: src/slic3r/GUI/Plater.cpp:5194 msgid "Creating a new project" msgstr "Creant un nou projecte" -#: src/slic3r/GUI/Plater.cpp:5137 +#: src/slic3r/GUI/Plater.cpp:5228 msgid "Load Project" msgstr "Carregar Projecte" -#: src/slic3r/GUI/Plater.cpp:5167 src/slic3r/GUI/Plater.cpp:5432 +#: src/slic3r/GUI/Plater.cpp:5258 msgid "Import Object" msgstr "Importar Objecte" -#: src/slic3r/GUI/Plater.cpp:5171 +#: src/slic3r/GUI/Plater.cpp:5262 msgid "Import Objects" msgstr "Importar Objetes" -#: src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:5291 +msgid "Import SLA archive" +msgstr "Importar fitxer SLA" + +#: src/slic3r/GUI/Plater.cpp:5355 src/slic3r/GUI/Plater.cpp:5365 msgid "does not contain valid gcode." msgstr "no conté codi gcode vàlid." -#: src/slic3r/GUI/Plater.cpp:5244 +#: src/slic3r/GUI/Plater.cpp:5356 src/slic3r/GUI/Plater.cpp:5366 msgid "Error while loading .gcode file" msgstr "S'ha produït un error en carregar el fitxer .gcode" -#: src/slic3r/GUI/Plater.cpp:5297 +#: src/slic3r/GUI/Plater.cpp:5433 +#, c-format, boost-format +msgid "%s - Multiple projects file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 +msgid "There are several files being loaded, including Project files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 src/slic3r/GUI/Plater.cpp:5446 +msgid "Select an action to apply to all files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5446 +msgid "There are several files being loaded." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5448 src/slic3r/GUI/Plater.cpp:5842 +msgid "Action" +msgstr "Acció" + +#: src/slic3r/GUI/Plater.cpp:5469 +msgid "Import geometry" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5482 src/slic3r/GUI/Plater.cpp:5834 +msgid "Start new PrusaSlicer instance" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5496 +msgid "Select one to load as project" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5507 +msgid "Select one to load config only" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5609 +#, boost-format +msgid "Failed to unzip file to %1%: %2% " +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5618 +#, boost-format +msgid "Failed to find unzipped file at %1%. Unzipping of file has failed." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5821 #, c-format, boost-format -msgid "%s - Drop project file" -msgstr "%s - Deixar anar fitxer de projecte" +msgid "%s - Load project file" +msgstr "" -#: src/slic3r/GUI/Plater.cpp:5304 +#: src/slic3r/GUI/Plater.cpp:5830 msgid "Open as project" msgstr "Obre com a projecte" -#: src/slic3r/GUI/Plater.cpp:5305 +#: src/slic3r/GUI/Plater.cpp:5831 msgid "Import geometry only" msgstr "Importa només la geometria" -#: src/slic3r/GUI/Plater.cpp:5306 +#: src/slic3r/GUI/Plater.cpp:5832 msgid "Import config only" msgstr "Importa només la configuració" -#: src/slic3r/GUI/Plater.cpp:5309 +#: src/slic3r/GUI/Plater.cpp:5837 msgid "Select an action to apply to the file" msgstr "Seleccioneu una acció que s'aplicarà al fitxer" -#: src/slic3r/GUI/Plater.cpp:5314 -msgid "Action" -msgstr "Acció" - -#: src/slic3r/GUI/Plater.cpp:5330 +#: src/slic3r/GUI/Plater.cpp:5858 msgid "Don't show again" msgstr "No tornis a mostrar" -#: src/slic3r/GUI/Plater.cpp:5371 +#: src/slic3r/GUI/Plater.cpp:5899 msgid "You can open only one .gcode file at a time." msgstr "Només podeu obrir un fitxer .gcode alhora." -#: src/slic3r/GUI/Plater.cpp:5372 +#: src/slic3r/GUI/Plater.cpp:5900 msgid "Drag and drop G-code file" msgstr "Arrossegar i deixar anar el fitxer de codi G" -#: src/slic3r/GUI/Plater.cpp:5454 +#: src/slic3r/GUI/Plater.cpp:5992 msgid "Load File" msgstr "Carregar Arxiu" -#: src/slic3r/GUI/Plater.cpp:5459 +#: src/slic3r/GUI/Plater.cpp:5997 msgid "Load Files" msgstr "Carregar Arxius" -#: src/slic3r/GUI/Plater.cpp:5509 +#: src/slic3r/GUI/Plater.cpp:6047 msgid "All objects will be removed, continue?" msgstr "Tots els objectes seran eliminats, vols continuar?" -#: src/slic3r/GUI/Plater.cpp:5520 +#: src/slic3r/GUI/Plater.cpp:6058 msgid "Delete Selected Objects" msgstr "Suprimeix els objectes seleccionats" -#: src/slic3r/GUI/Plater.cpp:5529 +#: src/slic3r/GUI/Plater.cpp:6067 msgid "Increase Instances" msgstr "Augmenta les instàncies" -#: src/slic3r/GUI/Plater.cpp:5563 +#: src/slic3r/GUI/Plater.cpp:6109 msgid "Decrease Instances" msgstr "Disminueix les instàncies" -#: src/slic3r/GUI/Plater.cpp:5614 +#: src/slic3r/GUI/Plater.cpp:6167 msgid "Enter the number of copies:" msgstr "Introduïu el nombre de còpies:" -#: src/slic3r/GUI/Plater.cpp:5615 +#: src/slic3r/GUI/Plater.cpp:6168 msgid "Copies of the selected object" msgstr "Còpies de l'objecte seleccionat" -#: src/slic3r/GUI/Plater.cpp:5619 +#: src/slic3r/GUI/Plater.cpp:6171 #, c-format, boost-format msgid "Set numbers of copies to %d" msgstr "Estableix el nombre de còpies a %d" -#: src/slic3r/GUI/Plater.cpp:5697 -msgid "Cut by Plane" -msgstr "Tallar pel Plànol" +#: src/slic3r/GUI/Plater.cpp:6187 +msgid "Fill bed" +msgstr "Omplir la base" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save G-code file as:" msgstr "Desa el fitxer de codi G com a:" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save SL1 / SL1S file as:" msgstr "Desa el fitxer SL1 / SL1S com a:" -#: src/slic3r/GUI/Plater.cpp:5766 +#: src/slic3r/GUI/Plater.cpp:6336 msgid "The provided file name is not valid." msgstr "El nom del fitxer proporcionat no és vàlid." -#: src/slic3r/GUI/Plater.cpp:5767 +#: src/slic3r/GUI/Plater.cpp:6337 msgid "The following characters are not allowed by a FAT file system:" msgstr "Un sistema de fitxers FAT no permet els caràcters següents:" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "" "The plater is empty.\n" "Do you want to save the project?" @@ -7509,38 +8924,38 @@ msgstr "" "La plataforma és buida.\n" "Vols desar el projecte?" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "Save project" msgstr "Desar projecte" -#: src/slic3r/GUI/Plater.cpp:6543 +#: src/slic3r/GUI/Plater.cpp:6766 +msgid "Is the printer ready? Is the print sheet in place, empty and clean?" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:6766 src/slic3r/GUI/PrintHostDialogs.cpp:132 +msgid "Upload and Print" +msgstr "Enviar i imprimir" + +#: src/slic3r/GUI/Plater.cpp:7161 msgid "Export" msgstr "Exportar" -#: src/slic3r/GUI/Plater.cpp:6575 -msgid "" -"Custom supports, seams and multimaterial painting were removed after " -"repairing the mesh." -msgstr "" -"Els suports personalitzats, les costures i la pintura multimaterial s'han " -"retirat després de reparar la malla." - -#: src/slic3r/GUI/Plater.cpp:6689 +#: src/slic3r/GUI/Plater.cpp:7306 msgid "Paste From Clipboard" msgstr "Enganxa des del porta-retalls" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2290 -#: src/slic3r/GUI/Tab.cpp:2517 src/slic3r/GUI/Tab.cpp:2624 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Preferences.cpp:240 src/slic3r/GUI/Tab.cpp:2274 +#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2617 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "General" msgstr "General" -#: src/slic3r/GUI/Preferences.cpp:121 +#: src/slic3r/GUI/Preferences.cpp:258 msgid "Remember output directory" msgstr "Recorda el directori de sortida" -#: src/slic3r/GUI/Preferences.cpp:123 +#: src/slic3r/GUI/Preferences.cpp:259 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." @@ -7548,11 +8963,11 @@ msgstr "" "Si això està habilitat, Slic3r sol·licitarà el darrer directori de sortida " "en comptes del que conté els fitxers d'entrada." -#: src/slic3r/GUI/Preferences.cpp:129 +#: src/slic3r/GUI/Preferences.cpp:263 msgid "Auto-center parts" msgstr "Peces autocentrades" -#: src/slic3r/GUI/Preferences.cpp:131 +#: src/slic3r/GUI/Preferences.cpp:264 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." @@ -7560,11 +8975,11 @@ msgstr "" "Si això està habilitat, Slic3r centrarà automàticament els objectes al " "voltant del centre de la base d'impressió." -#: src/slic3r/GUI/Preferences.cpp:137 +#: src/slic3r/GUI/Preferences.cpp:268 msgid "Background processing" msgstr "Processament en segon pla" -#: src/slic3r/GUI/Preferences.cpp:139 +#: src/slic3r/GUI/Preferences.cpp:269 msgid "" "If this is enabled, Slic3r will pre-process objects as soon as they're " "loaded in order to save time when exporting G-code." @@ -7572,11 +8987,23 @@ msgstr "" "Si això està habilitat, Slic3r preprocessarà objectes tan aviat com es " "carreguin per estalviar temps en exportar el codi G." -#: src/slic3r/GUI/Preferences.cpp:148 +#: src/slic3r/GUI/Preferences.cpp:274 +msgid "Alert when supports needed" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:275 +msgid "" +"If this is enabled, Slic3r will raise alerts when it detects issues in the " +"sliced object, that can be resolved with supports (and brim). Examples of " +"such issues are floating object parts, unsupported extrusions and low bed " +"adhesion." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:285 msgid "Export sources full pathnames to 3mf and amf" msgstr "Exportar noms de ruta complets de les fonts a 3mf i amf" -#: src/slic3r/GUI/Preferences.cpp:150 +#: src/slic3r/GUI/Preferences.cpp:286 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked." @@ -7584,19 +9011,19 @@ msgstr "" "Si està activat, permet que l'ordre de Recàrrega des del disc busqui i " "carregui els fitxers quan s'invoqui." -#: src/slic3r/GUI/Preferences.cpp:159 +#: src/slic3r/GUI/Preferences.cpp:293 msgid "If enabled, sets PrusaSlicer as default application to open .3mf files." msgstr "" "Si està habilitat, estableix PrusaSlicer com a aplicació per defecte per " "obrir fitxers .3mf." -#: src/slic3r/GUI/Preferences.cpp:166 +#: src/slic3r/GUI/Preferences.cpp:298 msgid "If enabled, sets PrusaSlicer as default application to open .stl files." msgstr "" "Si està habilitat, estableix PrusaSlicer com a aplicació per defecte per " "obrir fitxers .stl." -#: src/slic3r/GUI/Preferences.cpp:177 +#: src/slic3r/GUI/Preferences.cpp:307 msgid "" "If enabled, Slic3r downloads updates of built-in system presets in the " "background. These updates are downloaded into a separate temporary location. " @@ -7608,11 +9035,11 @@ msgstr "" "ubicació temporal. Quan hi ha un nou ajustament disponible, aquest es podrà " "incorporar i fer servir quan l'aplicació es torni a iniciar." -#: src/slic3r/GUI/Preferences.cpp:182 +#: src/slic3r/GUI/Preferences.cpp:312 msgid "Suppress \" - default - \" presets" msgstr "Suprimeix els paràmetres inicials \"- per defecte -\"" -#: src/slic3r/GUI/Preferences.cpp:184 +#: src/slic3r/GUI/Preferences.cpp:313 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." @@ -7621,11 +9048,21 @@ msgstr "" "Imprimeix / Filament / Impressora una vegada que hi hagi altres paràmetres " "preestablerts disponibles." -#: src/slic3r/GUI/Preferences.cpp:190 +#: src/slic3r/GUI/Preferences.cpp:317 +msgid "Suppress \" Template \" filament presets" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:318 +msgid "" +"Suppress \" Template \" filament presets in configuration wizard and sidebar " +"visibility." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:322 msgid "Show incompatible print and filament presets" msgstr "Mostrar impressions incompatibles i ajustaments inicials de filaments" -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:323 msgid "" "When checked, the print and filament presets are shown in the preset editor " "even if they are marked as incompatible with the active printer" @@ -7634,11 +9071,22 @@ msgstr "" "mostren a l'editor de paràmetres preestablerts, fins i tot si estan marcats " "com a incompatibles amb la impressora activa" -#: src/slic3r/GUI/Preferences.cpp:200 +#: src/slic3r/GUI/Preferences.cpp:331 +msgid "Show load project dialog" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:332 +msgid "" +"When checked, whenever dragging and dropping a project file on the " +"application or open it from a browser, shows a dialog asking to select the " +"action to take on the file to load." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:335 msgid "Show drop project dialog" msgstr "Mostra quadre de diàleg en deixar anar projecte" -#: src/slic3r/GUI/Preferences.cpp:202 +#: src/slic3r/GUI/Preferences.cpp:336 msgid "" "When checked, whenever dragging and dropping a project file on the " "application, shows a dialog asking to select the action to take on the file " @@ -7648,11 +9096,11 @@ msgstr "" "projecte a l'aplicació, mostra un quadre de diàleg que demana seleccionar " "l'acció a realitzar al fitxer a carregar." -#: src/slic3r/GUI/Preferences.cpp:208 src/slic3r/GUI/Preferences.cpp:212 +#: src/slic3r/GUI/Preferences.cpp:342 src/slic3r/GUI/Preferences.cpp:346 msgid "Allow just a single PrusaSlicer instance" msgstr "Permet només una sola instància de PrusaSlicer" -#: src/slic3r/GUI/Preferences.cpp:210 +#: src/slic3r/GUI/Preferences.cpp:343 msgid "" "On OSX there is always only one instance of app running by default. However " "it is allowed to run multiple instances of same app from the command line. " @@ -7663,7 +9111,7 @@ msgstr "" "aplicació des de la línia d'ordres. En aquest cas, aquesta configuració " "permetrà només una instància." -#: src/slic3r/GUI/Preferences.cpp:214 +#: src/slic3r/GUI/Preferences.cpp:347 msgid "" "If this is enabled, when starting PrusaSlicer and another instance of the " "same PrusaSlicer is already running, that instance will be reactivated " @@ -7673,7 +9121,7 @@ msgstr "" "instància del mateix PrusaSlicer, aquesta instància es reactivarà al seu " "lloc." -#: src/slic3r/GUI/Preferences.cpp:224 +#: src/slic3r/GUI/Preferences.cpp:355 msgid "" "Always ask for unsaved changes in project, when: \n" "- Closing PrusaSlicer,\n" @@ -7683,8 +9131,8 @@ msgstr "" "- Tancament PrusaSlicer,\n" "- Càrrega o creació d'un nou projecte" -#: src/slic3r/GUI/Preferences.cpp:233 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:897 +#: src/slic3r/GUI/Preferences.cpp:363 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:925 msgid "" "Ask to save unsaved changes in presets when closing the application or when " "loading a new project" @@ -7692,7 +9140,7 @@ msgstr "" "Demana desar els canvis no desats en els predefinits en tancar l'aplicació o " "en carregar un projecte nou" -#: src/slic3r/GUI/Preferences.cpp:235 +#: src/slic3r/GUI/Preferences.cpp:364 msgid "" "Always ask for unsaved changes in presets, when: \n" "- Closing PrusaSlicer while some presets are modified,\n" @@ -7702,14 +9150,14 @@ msgstr "" "- En tancar PrusaSlicer mentre es modifiquen alguns ajustaments,\n" "- En carregar un nou projecte mentre es modifiquen alguns ajustaments" -#: src/slic3r/GUI/Preferences.cpp:242 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:896 +#: src/slic3r/GUI/Preferences.cpp:370 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:924 msgid "Ask for unsaved changes in presets when selecting new preset" msgstr "" "Preguntar sempre pels canvis no guardats en predefinits en seleccionar un " "nou predefinit" -#: src/slic3r/GUI/Preferences.cpp:244 +#: src/slic3r/GUI/Preferences.cpp:371 msgid "" "Always ask for unsaved changes in presets when selecting new preset or " "resetting a preset" @@ -7717,23 +9165,23 @@ msgstr "" "Preguntar sempre pels canvis no guardats en predefinits en seleccionar un " "nou ajustament o en restablir un ajustament" -#: src/slic3r/GUI/Preferences.cpp:249 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 +#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:923 msgid "Ask for unsaved changes in presets when creating new project" msgstr "" "Preguntar pels canvis no desats en predefinits en crear un nou projecte" -#: src/slic3r/GUI/Preferences.cpp:251 +#: src/slic3r/GUI/Preferences.cpp:376 msgid "Always ask for unsaved changes in presets when creating new project" msgstr "" "Preguntar sempre pels canvis no guardats en predefinits en crear un nou " "projecte" -#: src/slic3r/GUI/Preferences.cpp:258 +#: src/slic3r/GUI/Preferences.cpp:382 msgid "Associate .gcode files to PrusaSlicer G-code Viewer" msgstr "Associar fitxers .gcode al Visor de CodiG de PrusaSlicer" -#: src/slic3r/GUI/Preferences.cpp:260 +#: src/slic3r/GUI/Preferences.cpp:383 msgid "" "If enabled, sets PrusaSlicer G-code Viewer as default application to open ." "gcode files." @@ -7741,11 +9189,11 @@ msgstr "" "Si està habilitat, estableix el Visor de CodiG de PrusaSlicer com a " "aplicació predeterminada per obrir fitxers .gcode." -#: src/slic3r/GUI/Preferences.cpp:268 +#: src/slic3r/GUI/Preferences.cpp:390 msgid "Use Retina resolution for the 3D scene" msgstr "Fes servir la resolució de Retina per a l'escena 3D" -#: src/slic3r/GUI/Preferences.cpp:270 +#: src/slic3r/GUI/Preferences.cpp:391 msgid "" "If enabled, the 3D scene will be rendered in Retina resolution. If you are " "experiencing 3D performance problems, disabling this option may help." @@ -7753,31 +9201,31 @@ msgstr "" "Si està activat, l'escena 3D es mostrarà en resolució Retina. Si teniu " "problemes de prestacions 3D, desactivar aquesta opció us pot ajudar." -#: src/slic3r/GUI/Preferences.cpp:280 src/slic3r/GUI/Preferences.cpp:282 +#: src/slic3r/GUI/Preferences.cpp:400 src/slic3r/GUI/Preferences.cpp:401 msgid "Show splash screen" msgstr "Mostra la pantalla de presentació" -#: src/slic3r/GUI/Preferences.cpp:289 +#: src/slic3r/GUI/Preferences.cpp:406 msgid "If enabled, PrusaSlicer will be open at the position it was closed" msgstr "" "Si està habilitat, PrusaSlicer s'obrirà en la posició en què s'ha tancat" -#: src/slic3r/GUI/Preferences.cpp:295 +#: src/slic3r/GUI/Preferences.cpp:411 msgid "Clear Undo / Redo stack on new project" msgstr "Esborrar la pila de Desfer / Refer al nou projecte" -#: src/slic3r/GUI/Preferences.cpp:297 +#: src/slic3r/GUI/Preferences.cpp:412 msgid "" "Clear Undo / Redo stack on new project or when an existing project is loaded." msgstr "" "Esborrar la pila de Desfer / Refer en un nou projecte o quan es carrega un " "projecte existent." -#: src/slic3r/GUI/Preferences.cpp:303 +#: src/slic3r/GUI/Preferences.cpp:417 msgid "Enable support for legacy 3DConnexion devices" msgstr "Habilitar la compatibilitat amb dispositius antics 3DConnexion" -#: src/slic3r/GUI/Preferences.cpp:305 +#: src/slic3r/GUI/Preferences.cpp:418 msgid "" "If enabled, the legacy 3DConnexion devices settings dialog is available by " "pressing CTRL+M" @@ -7785,64 +9233,60 @@ msgstr "" "Si està habilitat, el quadre de diàleg de configuració de dispositius " "3DConnexion antics està disponible prement CTRL + M" -#: src/slic3r/GUI/Preferences.cpp:314 +#: src/slic3r/GUI/Preferences.cpp:425 msgid "Camera" msgstr "Càmera" -#: src/slic3r/GUI/Preferences.cpp:319 +#: src/slic3r/GUI/Preferences.cpp:435 msgid "Use perspective camera" msgstr "Utilitza la càmera de perspectiva" -#: src/slic3r/GUI/Preferences.cpp:321 +#: src/slic3r/GUI/Preferences.cpp:436 msgid "" "If enabled, use perspective camera. If not enabled, use orthographic camera." msgstr "" "Si està habilitat, s'usarà la càmera de perspectiva. Si no està habilitat, " "usarà la càmera ortogràfica." -#: src/slic3r/GUI/Preferences.cpp:326 +#: src/slic3r/GUI/Preferences.cpp:440 msgid "Use free camera" msgstr "Usar la càmera lliure" -#: src/slic3r/GUI/Preferences.cpp:328 +#: src/slic3r/GUI/Preferences.cpp:441 msgid "If enabled, use free camera. If not enabled, use constrained camera." msgstr "" "Si està activat, fa servir la càmera lliure. Si no està activat, fa servir " "la càmera restringida." -#: src/slic3r/GUI/Preferences.cpp:333 +#: src/slic3r/GUI/Preferences.cpp:445 msgid "Reverse direction of zoom with mouse wheel" msgstr "Revertir zoom amb la roda del ratolí" -#: src/slic3r/GUI/Preferences.cpp:335 +#: src/slic3r/GUI/Preferences.cpp:446 msgid "If enabled, reverses the direction of zoom with mouse wheel" msgstr "" "Si està habilitat, inverteix la direcció del zoom amb la roda del ratolí" -#: src/slic3r/GUI/Preferences.cpp:343 +#: src/slic3r/GUI/Preferences.cpp:452 msgid "GUI" msgstr "IU" -#: src/slic3r/GUI/Preferences.cpp:366 +#: src/slic3r/GUI/Preferences.cpp:492 msgid "Sequential slider applied only to top layer" msgstr "Control lliscant seqüencial aplicat només a la capa superior" -#: src/slic3r/GUI/Preferences.cpp:368 +#: src/slic3r/GUI/Preferences.cpp:493 msgid "" "If enabled, changes made using the sequential slider, in preview, apply only " -"to gcode top layer. If disabled, changes made using the sequential slider, " -"in preview, apply to the whole gcode." +"to gcode top layer.If disabled, changes made using the sequential slider, in " +"preview, apply to the whole gcode." msgstr "" -"Si s'activa, els canvis realitzats amb el lliscador seqüencial, a la vista " -"prèvia, s'apliquen només a la capa superior del codi G.Si es desactiva, els " -"canvis realitzats amb el lliscador seqüencial, a la vista prèvia, s'apliquen " -"a tot el codi G." -#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/Preferences.cpp:499 msgid "Show sidebar collapse/expand button" msgstr "Mostrar botó amagar/expandir barra lateral" -#: src/slic3r/GUI/Preferences.cpp:377 +#: src/slic3r/GUI/Preferences.cpp:500 msgid "" "If enabled, the button for the collapse sidebar will be appeared in top " "right corner of the 3D Scene" @@ -7850,15 +9294,11 @@ msgstr "" "Si està habilitat, el botó de la barra lateral ocultable apareixerà a la " "part superior dreta de l'escena 3D" -#: src/slic3r/GUI/Preferences.cpp:384 -msgid "If enabled, PrusaSlicer will not open hyperlinks in your browser." -msgstr "Si està habilitat, PrusaSlicer no obrirà hipervincles al navegador." - -#: src/slic3r/GUI/Preferences.cpp:391 +#: src/slic3r/GUI/Preferences.cpp:511 msgid "Use colors for axes values in Manipulation panel" msgstr "Utilitzar colors per als valors dels eixos al panell de manipulació" -#: src/slic3r/GUI/Preferences.cpp:393 +#: src/slic3r/GUI/Preferences.cpp:512 msgid "" "If enabled, the axes names and axes values will be colorized according to " "the axes colors. If disabled, old UI will be used." @@ -7867,11 +9307,11 @@ msgstr "" "amb els colors dels eixos. Si es desactiva, es farà servir l'antiga " "interfície d'usuari." -#: src/slic3r/GUI/Preferences.cpp:399 +#: src/slic3r/GUI/Preferences.cpp:517 msgid "Order object volumes by types" msgstr "Ordena els volums dels objectes per tipus" -#: src/slic3r/GUI/Preferences.cpp:401 +#: src/slic3r/GUI/Preferences.cpp:518 msgid "" "If enabled, volumes will be always ordered inside the object. Correct order " "is Model Part, Negative Volume, Modifier, Support Blocker and Support " @@ -7884,12 +9324,30 @@ msgstr "" "del model, els volums negatius i els modificadors. Però una de les parts del " "model ha d'estar en primer lloc." -#: src/slic3r/GUI/Preferences.cpp:408 +#: src/slic3r/GUI/Preferences.cpp:523 +msgid "Show non-manifold edges" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:524 +msgid "If enabled, shows non-manifold edges." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:528 +msgid "Allow automatically color change" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:529 +msgid "" +"If enabled, related notification will be shown, when sliced object looks " +"like a logo or a sign." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:534 msgid "Set settings tabs as menu items (experimental)" msgstr "" "Defineix les pestanyes de configuració com a elements de menú (experimental)" -#: src/slic3r/GUI/Preferences.cpp:410 +#: src/slic3r/GUI/Preferences.cpp:535 msgid "" "If enabled, Settings Tabs will be placed as menu items. If disabled, old UI " "will be used." @@ -7897,19 +9355,19 @@ msgstr "" "Si s'activa, les Pestanyes de Configuració es col·locaran com a elements de " "menú. Si es desactiva, es farà servir l'antiga interfície d'usuari." -#: src/slic3r/GUI/Preferences.cpp:419 +#: src/slic3r/GUI/Preferences.cpp:542 msgid "Show \"Tip of the day\" notification after start" msgstr "Mostra la notificació de \"Consell del dia\" després de l'inici" -#: src/slic3r/GUI/Preferences.cpp:421 +#: src/slic3r/GUI/Preferences.cpp:543 msgid "If enabled, useful hints are displayed at startup." msgstr "Si s'activa, es mostren consells útils a l'inici." -#: src/slic3r/GUI/Preferences.cpp:427 +#: src/slic3r/GUI/Preferences.cpp:547 msgid "Notify about new releases" msgstr "Notificar sobre nous llançaments" -#: src/slic3r/GUI/Preferences.cpp:429 +#: src/slic3r/GUI/Preferences.cpp:548 msgid "" "You will be notified about new release after startup acordingly: All = " "Regular release and alpha / beta releases. Release only = regular release." @@ -7918,65 +9376,77 @@ msgstr "" "conseqüència: Tots = Llançament regular i llançaments alfa/beta. Només " "llançament = versió regular." -#: src/slic3r/GUI/Preferences.cpp:435 +#: src/slic3r/GUI/Preferences.cpp:551 msgid "Release only" msgstr "Només llançament" -#: src/slic3r/GUI/Preferences.cpp:444 +#: src/slic3r/GUI/Preferences.cpp:558 msgid "Use custom size for toolbar icons" msgstr "Utilitza mida personalitzada per a les icones de la barra d'eines" -#: src/slic3r/GUI/Preferences.cpp:446 -msgid "If enabled, you can change size of toolbar icons manually." -msgstr "Si està activat, podeu canviar la mida de la barra d'eines manualment." +#: src/slic3r/GUI/Preferences.cpp:559 +msgid "If enabled, you can change size of toolbar icons manually." +msgstr "Si està activat, podeu canviar la mida de la barra d'eines manualment." + +#: src/slic3r/GUI/Preferences.cpp:577 src/slic3r/GUI/Tab.cpp:1659 +msgid "Other" +msgstr "Altre" + +#: src/slic3r/GUI/Preferences.cpp:594 +msgid "If enabled, PrusaSlicer will not open a hyperlinks in your browser." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:600 +msgid "Allow downloads from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:601 +msgid "If enabled, PrusaSlicer will be allowed to download from Printables.com" +msgstr "" -#: src/slic3r/GUI/Preferences.cpp:471 +#: src/slic3r/GUI/Preferences.cpp:610 msgid "Render" msgstr "Renderitzar" -#: src/slic3r/GUI/Preferences.cpp:476 +#: src/slic3r/GUI/Preferences.cpp:620 msgid "Use environment map" msgstr "Usar mapa ambiental" -#: src/slic3r/GUI/Preferences.cpp:478 +#: src/slic3r/GUI/Preferences.cpp:621 msgid "If enabled, renders object using the environment map." msgstr "Si està activat, renderitza l'objecte usant el mapa de l'entorn." -#: src/slic3r/GUI/Preferences.cpp:491 +#: src/slic3r/GUI/Preferences.cpp:629 msgid "Dark mode (experimental)" msgstr "Mode fosc (experimental)" -#: src/slic3r/GUI/Preferences.cpp:496 +#: src/slic3r/GUI/Preferences.cpp:639 msgid "Enable dark mode" msgstr "Habilita el mode fosc" -#: src/slic3r/GUI/Preferences.cpp:498 +#: src/slic3r/GUI/Preferences.cpp:640 msgid "" "If enabled, UI will use Dark mode colors. If disabled, old UI will be used." msgstr "" "Si s'activa, la interfície d'usuari utilitzarà els colors del mode fosc. Si " "es desactiva, es farà servir l'antiga interfície d'usuari." -#: src/slic3r/GUI/Preferences.cpp:507 +#: src/slic3r/GUI/Preferences.cpp:647 msgid "Use system menu for application" msgstr "Utilitza el menú del sistema per a l'aplicació" -#: src/slic3r/GUI/Preferences.cpp:509 +#: src/slic3r/GUI/Preferences.cpp:648 msgid "" "If enabled, application will use the standard Windows system menu,\n" -"but on some combination of display scales it can looks ugly. If disabled, " -"old UI will be used." +"but on some combination od display scales it can look ugly. If disabled, old " +"UI will be used." msgstr "" -"Si s'activa, l'aplicació utilitzarà el menú de sistema estàndard de " -"Windows,\n" -"però en algunes combinacions d'escales de pantalla pot semblar lleig. Si es " -"desactiva, es farà servir l'antiga interfície d'usuari." -#: src/slic3r/GUI/Preferences.cpp:578 +#: src/slic3r/GUI/Preferences.cpp:726 msgid "Changes for the critical options" msgstr "Canvis per a les opcions crítiques" -#: src/slic3r/GUI/Preferences.cpp:580 +#: src/slic3r/GUI/Preferences.cpp:728 msgid "" "Changing some options will trigger application restart.\n" "You will lose the content of the plater." @@ -7984,110 +9454,123 @@ msgstr "" "El canvi d'algunes opcions farà que l'aplicació es reiniciï.\n" "Es perdrà el contingut de la plataforma." -#: src/slic3r/GUI/Preferences.cpp:694 +#: src/slic3r/GUI/Preferences.cpp:921 msgid "Icon size in a respect to the default size" msgstr "Mida de la icona respecte a la mida original" -#: src/slic3r/GUI/Preferences.cpp:709 +#: src/slic3r/GUI/Preferences.cpp:936 msgid "Select toolbar icon size in respect to the default one." msgstr "" "Seleccioneu la mida de la icona de la barra d'eines pel que fa al " "predeterminat." -#: src/slic3r/GUI/Preferences.cpp:743 src/slic3r/GUI/Preferences.cpp:754 +#: src/slic3r/GUI/Preferences.cpp:972 +msgid "Layout Options" +msgstr "Opcions de presentació" + +#: src/slic3r/GUI/Preferences.cpp:981 msgid "Old regular layout with the tab bar" msgstr "Disseny normal antic amb la barra de pestanyes" -#: src/slic3r/GUI/Preferences.cpp:744 +#: src/slic3r/GUI/Preferences.cpp:982 msgid "New layout, access via settings button in the top menu" msgstr "" "Disposició nova, accés mitjançant botó de configuració al menú superior" -#: src/slic3r/GUI/Preferences.cpp:745 src/slic3r/GUI/Preferences.cpp:755 +#: src/slic3r/GUI/Preferences.cpp:983 msgid "Settings in non-modal window" msgstr "Configuració en una finestra no modal" -#: src/slic3r/GUI/Preferences.cpp:763 -msgid "Layout Options" -msgstr "Opcions de presentació" - -#: src/slic3r/GUI/Preferences.cpp:806 +#: src/slic3r/GUI/Preferences.cpp:1025 msgid "Text colors" msgstr "Colors del text" -#: src/slic3r/GUI/PresetComboBoxes.cpp:249 -#: src/slic3r/GUI/PresetComboBoxes.cpp:287 -#: src/slic3r/GUI/PresetComboBoxes.cpp:794 -#: src/slic3r/GUI/PresetComboBoxes.cpp:849 -#: src/slic3r/GUI/PresetComboBoxes.cpp:989 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1033 +#: src/slic3r/GUI/Preferences.cpp:1049 +msgid "Mode markers" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:254 +#: src/slic3r/GUI/PresetComboBoxes.cpp:306 +#: src/slic3r/GUI/PresetComboBoxes.cpp:846 +#: src/slic3r/GUI/PresetComboBoxes.cpp:909 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1073 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1125 msgid "System presets" msgstr "Predefinits del sistema" -#: src/slic3r/GUI/PresetComboBoxes.cpp:291 -#: src/slic3r/GUI/PresetComboBoxes.cpp:853 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1037 +#: src/slic3r/GUI/PresetComboBoxes.cpp:310 +#: src/slic3r/GUI/PresetComboBoxes.cpp:915 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1130 msgid "User presets" msgstr "Predefinits de l'usuari" -#: src/slic3r/GUI/PresetComboBoxes.cpp:302 +#: src/slic3r/GUI/PresetComboBoxes.cpp:321 msgid "Incompatible presets" msgstr "Predefinits incompatibles" -#: src/slic3r/GUI/PresetComboBoxes.cpp:337 +#: src/slic3r/GUI/PresetComboBoxes.cpp:364 #, boost-format msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "Esteu segur que voleu suprimir la impressora \"%1%\"?" -#: src/slic3r/GUI/PresetComboBoxes.cpp:340 +#: src/slic3r/GUI/PresetComboBoxes.cpp:366 msgid "Delete Physical Printer" msgstr "Suprimeix la impressora física" -#: src/slic3r/GUI/PresetComboBoxes.cpp:581 +#: src/slic3r/GUI/PresetComboBoxes.cpp:612 msgid "Click to edit preset" msgstr "Feu clic per editar el predefinit" -#: src/slic3r/GUI/PresetComboBoxes.cpp:697 -#: src/slic3r/GUI/PresetComboBoxes.cpp:737 +#: src/slic3r/GUI/PresetComboBoxes.cpp:740 +#: src/slic3r/GUI/PresetComboBoxes.cpp:788 msgid "Add/Remove presets" msgstr "Afegeix o suprimeix els predefinits" -#: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:745 +#: src/slic3r/GUI/PresetComboBoxes.cpp:793 src/slic3r/GUI/Tab.cpp:3312 msgid "Add physical printer" msgstr "Afegeix una impressora física" -#: src/slic3r/GUI/PresetComboBoxes.cpp:716 +#: src/slic3r/GUI/PresetComboBoxes.cpp:759 msgid "Edit preset" msgstr "Edita el predefinit" -#: src/slic3r/GUI/PresetComboBoxes.cpp:722 +#: src/slic3r/GUI/PresetComboBoxes.cpp:765 msgid "Change extruder color" msgstr "Canvia el color de l'extrusora" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:773 src/slic3r/GUI/Tab.cpp:3312 msgid "Edit physical printer" msgstr "Edita la impressora física" -#: src/slic3r/GUI/PresetComboBoxes.cpp:733 +#: src/slic3r/GUI/PresetComboBoxes.cpp:779 +msgid "Open physical printer URL" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:784 msgid "Delete physical printer" msgstr "Suprimeix la impressora física" -#: src/slic3r/GUI/PresetComboBoxes.cpp:864 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1051 +#: src/slic3r/GUI/PresetComboBoxes.cpp:924 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1142 +msgid "Template presets" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:935 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1156 msgid "Physical printers" msgstr "Impressores físiques" -#: src/slic3r/GUI/PresetComboBoxes.cpp:888 +#: src/slic3r/GUI/PresetComboBoxes.cpp:959 msgid "Add/Remove filaments" msgstr "Afegeix o suprimeix filaments" -#: src/slic3r/GUI/PresetComboBoxes.cpp:890 +#: src/slic3r/GUI/PresetComboBoxes.cpp:961 msgid "Add/Remove materials" msgstr "Afegir o eliminar materials" -#: src/slic3r/GUI/PresetComboBoxes.cpp:892 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1075 +#: src/slic3r/GUI/PresetComboBoxes.cpp:963 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1180 msgid "Add/Remove printers" msgstr "Afegeix o suprimeix impressores" @@ -8281,100 +9764,108 @@ msgstr "El gruix mínim de la carcassa inferior és %1% mm." msgid "Bottom is open." msgstr "La part inferior està oberta." -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Send G-Code to printer host" msgstr "Enviar el codi G al host d'impressió" -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Upload to Printer Host with the following filename:" msgstr "Carregar el host amb el següent nom de fitxer:" -#: src/slic3r/GUI/PrintHostDialogs.cpp:51 +#: src/slic3r/GUI/PrintHostDialogs.cpp:55 msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "" "Use barras diagonales ( / ) como separadores de directorios si fuese " "necesario." -#: src/slic3r/GUI/PrintHostDialogs.cpp:60 +#: src/slic3r/GUI/PrintHostDialogs.cpp:64 msgid "Group" msgstr "Agrupar" -#: src/slic3r/GUI/PrintHostDialogs.cpp:84 +#: src/slic3r/GUI/PrintHostDialogs.cpp:74 +msgid "Upload to storage:" +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:83 +msgid "Upload to storage: " +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:105 #, c-format, boost-format msgid "Upload filename doesn't end with \"%s\". Do you wish to continue?" msgstr "El nom del fitxer enviat no s'acaba amb \"%s\". Voleu continuar?" -#: src/slic3r/GUI/PrintHostDialogs.cpp:91 +#: src/slic3r/GUI/PrintHostDialogs.cpp:112 msgid "Upload" msgstr "Pujar" -#: src/slic3r/GUI/PrintHostDialogs.cpp:101 -msgid "Upload and Print" -msgstr "Enviar i imprimir" +#: src/slic3r/GUI/PrintHostDialogs.cpp:122 +msgid "Upload to Queue" +msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:112 +#: src/slic3r/GUI/PrintHostDialogs.cpp:143 msgid "Upload and Simulate" msgstr "Enviar i simular" -#: src/slic3r/GUI/PrintHostDialogs.cpp:247 +#: src/slic3r/GUI/PrintHostDialogs.cpp:298 msgid "ID" msgstr "ID" -#: src/slic3r/GUI/PrintHostDialogs.cpp:248 +#: src/slic3r/GUI/PrintHostDialogs.cpp:299 msgid "Progress" msgstr "Progrés" -#: src/slic3r/GUI/PrintHostDialogs.cpp:249 +#: src/slic3r/GUI/PrintHostDialogs.cpp:300 msgid "Status" msgstr "Estat" -#: src/slic3r/GUI/PrintHostDialogs.cpp:250 +#: src/slic3r/GUI/PrintHostDialogs.cpp:301 msgid "Host" msgstr "Host" -#: src/slic3r/GUI/PrintHostDialogs.cpp:251 +#: src/slic3r/GUI/PrintHostDialogs.cpp:302 msgctxt "OfFile" msgid "Size" msgstr "OfFile||Mida" -#: src/slic3r/GUI/PrintHostDialogs.cpp:252 +#: src/slic3r/GUI/PrintHostDialogs.cpp:303 msgid "Filename" msgstr "Nom del fitxer" -#: src/slic3r/GUI/PrintHostDialogs.cpp:253 -msgid "Error Message" -msgstr "Missatge d'error" +#: src/slic3r/GUI/PrintHostDialogs.cpp:304 +msgid "Message" +msgstr "Missatge" -#: src/slic3r/GUI/PrintHostDialogs.cpp:256 +#: src/slic3r/GUI/PrintHostDialogs.cpp:308 msgid "Cancel selected" msgstr "Cancel·lar selecció" -#: src/slic3r/GUI/PrintHostDialogs.cpp:258 +#: src/slic3r/GUI/PrintHostDialogs.cpp:310 msgid "Show error message" msgstr "Mostra el missatge d'error" -#: src/slic3r/GUI/PrintHostDialogs.cpp:316 -#: src/slic3r/GUI/PrintHostDialogs.cpp:371 +#: src/slic3r/GUI/PrintHostDialogs.cpp:368 +#: src/slic3r/GUI/PrintHostDialogs.cpp:423 msgid "Enqueued" msgstr "A la cua" -#: src/slic3r/GUI/PrintHostDialogs.cpp:372 +#: src/slic3r/GUI/PrintHostDialogs.cpp:424 msgid "Uploading" msgstr "Pujant" -#: src/slic3r/GUI/PrintHostDialogs.cpp:374 +#: src/slic3r/GUI/PrintHostDialogs.cpp:426 msgid "Cancelling" msgstr "Cancel·lant" -#: src/slic3r/GUI/PrintHostDialogs.cpp:375 +#: src/slic3r/GUI/PrintHostDialogs.cpp:427 msgid "Cancelled" msgstr "Cancel·lat" -#: src/slic3r/GUI/PrintHostDialogs.cpp:376 +#: src/slic3r/GUI/PrintHostDialogs.cpp:428 msgid "Completed" msgstr "Completat" -#: src/slic3r/GUI/PrintHostDialogs.cpp:424 +#: src/slic3r/GUI/PrintHostDialogs.cpp:476 msgid "Error uploading to print host:" msgstr "Error en carregar a la impressora:" @@ -8382,13 +9873,13 @@ msgstr "Error en carregar a la impressora:" msgid "NO RAMMING AT ALL" msgstr "NO EMPENAR EN ABSOLUT" -#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 -#: src/libslic3r/PrintConfig.cpp:955 src/libslic3r/PrintConfig.cpp:999 -#: src/libslic3r/PrintConfig.cpp:1014 src/libslic3r/PrintConfig.cpp:3297 -#: src/libslic3r/PrintConfig.cpp:3306 src/libslic3r/PrintConfig.cpp:3315 -#: src/libslic3r/PrintConfig.cpp:3456 src/libslic3r/PrintConfig.cpp:3464 -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3479 -#: src/libslic3r/PrintConfig.cpp:3487 src/libslic3r/PrintConfig.cpp:3495 +#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/libslic3r/PrintConfig.cpp:1044 src/libslic3r/PrintConfig.cpp:1088 +#: src/libslic3r/PrintConfig.cpp:1103 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3578 src/libslic3r/PrintConfig.cpp:3587 +#: src/libslic3r/PrintConfig.cpp:3733 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3749 src/libslic3r/PrintConfig.cpp:3756 +#: src/libslic3r/PrintConfig.cpp:3764 src/libslic3r/PrintConfig.cpp:3772 msgid "s" msgstr "s" @@ -8396,43 +9887,64 @@ msgstr "s" msgid "Volumetric speed" msgstr "Velocitat volumètrica" -#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:912 -#: src/libslic3r/PrintConfig.cpp:1824 +#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:1001 +#: src/libslic3r/PrintConfig.cpp:1861 msgid "mm³/s" msgstr "mm³/s" -#: src/slic3r/GUI/SavePresetDialog.cpp:57 +#: src/slic3r/GUI/SavePresetDialog.cpp:90 +#, c-format, boost-format +msgid "Rename %s to:" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:90 #, c-format, boost-format msgid "Save %s as:" msgstr "Desa %s com a:" -#: src/slic3r/GUI/SavePresetDialog.cpp:101 -#: src/slic3r/GUI/SavePresetDialog.cpp:109 +#: src/slic3r/GUI/SavePresetDialog.cpp:165 +#: src/slic3r/GUI/SavePresetDialog.cpp:173 msgid "The supplied name is not valid;" msgstr "El nom proporcionat no és vàlid;" -#: src/slic3r/GUI/SavePresetDialog.cpp:110 +#: src/slic3r/GUI/SavePresetDialog.cpp:174 msgid "the following suffix is not allowed:" msgstr "no es permet el sufix següent:" -#: src/slic3r/GUI/SavePresetDialog.cpp:116 +#: src/slic3r/GUI/SavePresetDialog.cpp:180 msgid "The supplied name is not available." msgstr "El nom proporcionat no està disponible." -#: src/slic3r/GUI/SavePresetDialog.cpp:122 +#: src/slic3r/GUI/SavePresetDialog.cpp:186 +msgid "The supplied name is used for a system profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:187 msgid "Cannot overwrite a system profile." msgstr "No es pot sobreescriure un perfil del sistema." -#: src/slic3r/GUI/SavePresetDialog.cpp:127 +#: src/slic3r/GUI/SavePresetDialog.cpp:192 +msgid "The supplied name is used for a external profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:193 msgid "Cannot overwrite an external profile." msgstr "No es pot sobreescriure un perfil extern." -#: src/slic3r/GUI/SavePresetDialog.cpp:134 +#: src/slic3r/GUI/SavePresetDialog.cpp:203 +msgid "Save preset modifications to existing user profile" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:205 +msgid "Nothing changed" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:210 #, boost-format msgid "Preset with name \"%1%\" already exists." msgstr "Ja hi ha un preset amb el nom \"%1%\"." -#: src/slic3r/GUI/SavePresetDialog.cpp:136 +#: src/slic3r/GUI/SavePresetDialog.cpp:212 #, boost-format msgid "" "Preset with name \"%1%\" already exists and is incompatible with selected " @@ -8441,37 +9953,52 @@ msgstr "" "La configuració predeterminada amb el nom \"%1%\" ja existeix i és " "incompatible amb la impressora seleccionada." -#: src/slic3r/GUI/SavePresetDialog.cpp:137 +#: src/slic3r/GUI/SavePresetDialog.cpp:213 msgid "Note: This preset will be replaced after saving" msgstr "Nota: Aquest predefinit se substituirà després de desar" -#: src/slic3r/GUI/SavePresetDialog.cpp:142 +#: src/slic3r/GUI/SavePresetDialog.cpp:219 msgid "The name cannot be empty." msgstr "El nom no pot estar buit." -#: src/slic3r/GUI/SavePresetDialog.cpp:147 +#: src/slic3r/GUI/SavePresetDialog.cpp:230 +msgid "The name is too long." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:235 msgid "The name cannot start with space character." msgstr "El nom no pot començar amb el caràcter d'espai." -#: src/slic3r/GUI/SavePresetDialog.cpp:152 +#: src/slic3r/GUI/SavePresetDialog.cpp:240 msgid "The name cannot end with space character." msgstr "El nom no pot acabar amb caràcter d'espai." -#: src/slic3r/GUI/SavePresetDialog.cpp:157 +#: src/slic3r/GUI/SavePresetDialog.cpp:245 msgid "The name cannot be the same as a preset alias name." msgstr "El nom no pot ser el mateix que un nom d'àlies predefinit." -#: src/slic3r/GUI/SavePresetDialog.cpp:191 -#: src/slic3r/GUI/SavePresetDialog.cpp:197 +#: src/slic3r/GUI/SavePresetDialog.cpp:289 msgid "Save preset" msgstr "Desa el predefinit" -#: src/slic3r/GUI/SavePresetDialog.cpp:221 +#: src/slic3r/GUI/SavePresetDialog.cpp:295 +msgid "Save presets" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:302 +msgid "Rename preset" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:327 msgctxt "PresetName" msgid "Copy" msgstr "Copiar" -#: src/slic3r/GUI/SavePresetDialog.cpp:283 +#: src/slic3r/GUI/SavePresetDialog.cpp:347 +msgid "Save as profile derived from current printer only." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:407 #, boost-format msgid "" "You have selected physical printer \"%1%\" \n" @@ -8480,86 +10007,98 @@ msgstr "" "Heu seleccionat una impressora física \"%1%\"\n" "amb la configuració d'impressora relacionada \"%2%\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:322 +#: src/slic3r/GUI/SavePresetDialog.cpp:446 #, boost-format msgid "What would you like to do with \"%1%\" preset after saving?" msgstr "" "Què t'agradaria fer amb la configuració preestablerta \"%1%\" després de " "desar?" -#: src/slic3r/GUI/SavePresetDialog.cpp:325 +#: src/slic3r/GUI/SavePresetDialog.cpp:449 #, boost-format msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" msgstr "Canvia \"%1%\" a \"%2%\" per a aquesta impressora física \"%3%\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:326 +#: src/slic3r/GUI/SavePresetDialog.cpp:450 #, boost-format msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" msgstr "" "Afegeix \"%1%\" com a ajustament preestablert per a la impressora física " "\"%2%\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:327 +#: src/slic3r/GUI/SavePresetDialog.cpp:451 #, boost-format msgid "Just switch to \"%1%\" preset" msgstr "Simplement canvieu a la configuració predeterminada \"%1%\"" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2652 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2645 msgid "Stealth" msgstr "Silenciós" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2646 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2639 msgid "Normal" msgstr "Normal" -#: src/slic3r/GUI/Selection.cpp:168 +#: src/slic3r/GUI/Selection.cpp:180 msgid "Selection-Add" msgstr "Selecció-Afegeix" -#: src/slic3r/GUI/Selection.cpp:209 +#: src/slic3r/GUI/Selection.cpp:221 msgid "Selection-Remove" msgstr "Selecció-Suprimeix" -#: src/slic3r/GUI/Selection.cpp:241 +#: src/slic3r/GUI/Selection.cpp:253 msgid "Selection-Add Object" msgstr "Selecció-Afegeix un objecte" -#: src/slic3r/GUI/Selection.cpp:260 +#: src/slic3r/GUI/Selection.cpp:272 msgid "Selection-Remove Object" msgstr "Selecció-Suprimeix l'objecte" -#: src/slic3r/GUI/Selection.cpp:278 +#: src/slic3r/GUI/Selection.cpp:290 msgid "Selection-Add Instance" msgstr "Selecció-Afegeix una instància" -#: src/slic3r/GUI/Selection.cpp:297 +#: src/slic3r/GUI/Selection.cpp:309 msgid "Selection-Remove Instance" msgstr "Selecció-Suprimeix una instància" -#: src/slic3r/GUI/Selection.cpp:394 +#: src/slic3r/GUI/Selection.cpp:406 msgid "Selection-Add All" msgstr "Selecció-Afegeix-ho tot" -#: src/slic3r/GUI/Selection.cpp:419 +#: src/slic3r/GUI/Selection.cpp:431 msgid "Selection-Remove All" msgstr "Selecció-Suprimeix-ho tot" -#: src/slic3r/GUI/Selection.cpp:950 +#: src/slic3r/GUI/Selection.cpp:1309 msgid "Scale To Fit" msgstr "Escalar per Adaptar-se" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:114 +#: src/slic3r/GUI/Selection.cpp:1691 +msgid "" +"The currently manipulated object is tilted or contains tilted parts " +"(rotation angles are not multiples of 90°). Non-uniform scaling of tilted " +"objects is only possible in non-local coordinate systems, once the rotation " +"is embedded into the object coordinates." +msgstr "" + +#: src/slic3r/GUI/Selection.cpp:1694 +msgid "This operation is irreversible." +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:117 msgid "Data to send" msgstr "Dades a enviar" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:550 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:618 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:557 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:624 msgid "Send system info" msgstr "Envia informació del sistema" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:581 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:587 #, boost-format msgid "" "This is the first time you are running %1%. We would like to ask you to send " @@ -8572,7 +10111,7 @@ msgstr "" "i no et demanarem que ho facis novament (només després d'actualitzar a la " "següent versió)." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:585 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:591 msgid "" "If we know your hardware, operating system, etc., it will greatly help us in " "development and prioritization, because we will be able to focus our effort " @@ -8583,11 +10122,11 @@ msgstr "" "manera més eficient i dedicar temps a les característiques que més es " "necessiten." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:588 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:594 msgid "Is it safe?" msgstr "És segur?" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:590 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:596 #, boost-format msgid "" "We do not send any personal information nor anything that would allow us to " @@ -8605,82 +10144,87 @@ msgstr "" "obert, si voleu inspeccionar el codi que realment realitza la comunicació, " "vegeu %1%." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:614 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:620 msgid "Show verbatim data that will be sent" msgstr "Mostra les dades literals que s'enviaran" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:616 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:622 msgid "Ask me next time" msgstr "Pregunta'm la propera vegada" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:617 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:623 msgid "Do not send anything" msgstr "No enviïs res" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:703 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:709 msgid "System info sent successfully. Thank you." msgstr "La informació del sistema s'ha enviat correctament. Gràcies." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:706 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:712 msgid "Sending system info failed!" msgstr "No s'ha pogut enviar la informació del sistema!" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:713 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:719 msgid "Sending system info was cancelled." msgstr "S'ha cancel·lat l'enviament de la informació del sistema." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:720 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:726 msgid "Sending system info..." msgstr "S'està enviant la informació del sistema..." -#: src/slic3r/GUI/SysInfoDialog.cpp:84 +#: src/slic3r/GUI/SysInfoDialog.cpp:92 msgid "System Information" msgstr "Informació del sistema" -#: src/slic3r/GUI/SysInfoDialog.cpp:150 +#: src/slic3r/GUI/SysInfoDialog.cpp:160 msgid "Blacklisted libraries loaded into PrusaSlicer process:" msgstr "Biblioteques de la llista negra carregades al procés de PrusaSlicer:" -#: src/slic3r/GUI/SysInfoDialog.cpp:162 +#: src/slic3r/GUI/SysInfoDialog.cpp:172 msgid "Eigen vectorization supported:" msgstr "S'admet la vectorització pròpia:" -#: src/slic3r/GUI/SysInfoDialog.cpp:169 +#: src/slic3r/GUI/SysInfoDialog.cpp:179 msgid "Copy to Clipboard" msgstr "Copieu al porta-retalls" -#: src/slic3r/GUI/Tab.cpp:114 src/libslic3r/PrintConfig.cpp:565 +#: src/slic3r/GUI/Tab.cpp:68 src/libslic3r/PrintConfig.cpp:668 msgid "Compatible printers" msgstr "Impressores compatibles" -#: src/slic3r/GUI/Tab.cpp:115 +#: src/slic3r/GUI/Tab.cpp:69 msgid "Select the printers this profile is compatible with." msgstr "Seleccioneu les impressores amb les que aquest perfil és compatible." -#: src/slic3r/GUI/Tab.cpp:120 src/libslic3r/PrintConfig.cpp:580 +#: src/slic3r/GUI/Tab.cpp:74 src/libslic3r/PrintConfig.cpp:683 msgid "Compatible print profiles" msgstr "Perfils d'impressió compatibles" -#: src/slic3r/GUI/Tab.cpp:121 +#: src/slic3r/GUI/Tab.cpp:75 msgid "Select the print profiles this profile is compatible with." msgstr "" "Seleccioneu els perfils d'impressió amb els que aquest perfil és compatible." -#: src/slic3r/GUI/Tab.cpp:216 +#: src/slic3r/GUI/Tab.cpp:165 msgid "Compare this preset with some another" msgstr "Compara aquest predefinit amb un altre" #. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:218 +#: src/slic3r/GUI/Tab.cpp:167 #, c-format, boost-format msgid "Save current %s" msgstr "Desa l'actual %s" -#: src/slic3r/GUI/Tab.cpp:219 +#: src/slic3r/GUI/Tab.cpp:168 +#, c-format, boost-format +msgid "Rename current %s" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:170 msgid "Delete this preset" msgstr "Suprimeix aquest predefinit" -#: src/slic3r/GUI/Tab.cpp:223 +#: src/slic3r/GUI/Tab.cpp:174 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." @@ -8688,16 +10232,16 @@ msgstr "" "Passeu el cursor per sobre dels botons per obtenir més informació \n" "o feu clic en aquest botó." -#: src/slic3r/GUI/Tab.cpp:227 +#: src/slic3r/GUI/Tab.cpp:178 #, boost-format msgid "Search in settings [%1%]" msgstr "Cerca a la configuració [%1%]" -#: src/slic3r/GUI/Tab.cpp:1298 +#: src/slic3r/GUI/Tab.cpp:1243 msgid "Detach from system preset" msgstr "Separar del predefinit del sistema" -#: src/slic3r/GUI/Tab.cpp:1311 +#: src/slic3r/GUI/Tab.cpp:1256 msgid "" "A copy of the current system preset will be created, which will be detached " "from the system preset." @@ -8705,226 +10249,234 @@ msgstr "" "Es crearà una còpia del preajustament del sistema actual, que se separarà " "del preajustament del sistema." -#: src/slic3r/GUI/Tab.cpp:1312 +#: src/slic3r/GUI/Tab.cpp:1257 msgid "" "The current custom preset will be detached from the parent system preset." msgstr "" "La configuració personalitzada actual se separarà de la configuració del " "sistema principal." -#: src/slic3r/GUI/Tab.cpp:1315 +#: src/slic3r/GUI/Tab.cpp:1260 msgid "Modifications to the current profile will be saved." msgstr "Es desaran les modificacions al perfil actual." -#: src/slic3r/GUI/Tab.cpp:1321 +#: src/slic3r/GUI/Tab.cpp:1266 msgid "Detach preset" msgstr "Separa el predefinit" -#: src/slic3r/GUI/Tab.cpp:1347 +#: src/slic3r/GUI/Tab.cpp:1292 msgid "This is a default preset." msgstr "Aquest és un predefinit per defecte." -#: src/slic3r/GUI/Tab.cpp:1349 +#: src/slic3r/GUI/Tab.cpp:1294 msgid "This is a system preset." msgstr "Aquest és un predefinit del sistema." -#: src/slic3r/GUI/Tab.cpp:1351 +#: src/slic3r/GUI/Tab.cpp:1296 msgid "Current preset is inherited from the default preset." msgstr "El predefinit actual s'hereta del predefinit per defecte." -#: src/slic3r/GUI/Tab.cpp:1355 +#: src/slic3r/GUI/Tab.cpp:1300 msgid "Current preset is inherited from" msgstr "El predefinit actual s'hereta de" -#: src/slic3r/GUI/Tab.cpp:1359 +#: src/slic3r/GUI/Tab.cpp:1304 msgid "It can't be deleted or modified." msgstr "No es pot suprimir ni modificar." -#: src/slic3r/GUI/Tab.cpp:1360 +#: src/slic3r/GUI/Tab.cpp:1305 msgid "" "Any modifications should be saved as a new preset inherited from this one." msgstr "" "Qualsevol modificació s'ha de desar com a nou predefinit heretat d'aquest." -#: src/slic3r/GUI/Tab.cpp:1361 +#: src/slic3r/GUI/Tab.cpp:1306 msgid "To do that please specify a new name for the preset." msgstr "Per fer-ho, especifiqueu un nom nou per al predefinit." -#: src/slic3r/GUI/Tab.cpp:1365 +#: src/slic3r/GUI/Tab.cpp:1310 msgid "Additional information:" msgstr "Informació addicional:" -#: src/slic3r/GUI/Tab.cpp:1371 +#: src/slic3r/GUI/Tab.cpp:1316 msgid "printer model" msgstr "model d'impressora" -#: src/slic3r/GUI/Tab.cpp:1379 +#: src/slic3r/GUI/Tab.cpp:1324 msgid "default print profile" msgstr "perfil d'impressió per defecte" -#: src/slic3r/GUI/Tab.cpp:1382 +#: src/slic3r/GUI/Tab.cpp:1327 msgid "default filament profile" msgstr "perfil de filament per defecte" -#: src/slic3r/GUI/Tab.cpp:1396 +#: src/slic3r/GUI/Tab.cpp:1341 msgid "default SLA material profile" msgstr "perfil de material de l'SLA per defecte" -#: src/slic3r/GUI/Tab.cpp:1400 +#: src/slic3r/GUI/Tab.cpp:1345 msgid "default SLA print profile" msgstr "perfil d'impressió de l'SLA per defecte" -#: src/slic3r/GUI/Tab.cpp:1408 +#: src/slic3r/GUI/Tab.cpp:1353 msgid "full profile name" msgstr "nom complet del perfil" -#: src/slic3r/GUI/Tab.cpp:1409 +#: src/slic3r/GUI/Tab.cpp:1354 msgid "symbolic profile name" msgstr "nom simbòlic del perfil" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4657 +#: src/slic3r/GUI/Tab.cpp:1392 src/slic3r/GUI/Tab.cpp:4940 msgid "Layers and perimeters" msgstr "Capes i Perímetres" -#: src/slic3r/GUI/Tab.cpp:1453 +#: src/slic3r/GUI/Tab.cpp:1398 msgid "Vertical shells" msgstr "Carcasses Verticals" -#: src/slic3r/GUI/Tab.cpp:1465 +#: src/slic3r/GUI/Tab.cpp:1410 msgid "Horizontal shells" msgstr "Carcasses Horitzontals" -#: src/slic3r/GUI/Tab.cpp:1466 src/libslic3r/PrintConfig.cpp:2417 +#: src/slic3r/GUI/Tab.cpp:1411 src/libslic3r/PrintConfig.cpp:2448 msgid "Solid layers" msgstr "Capes sòlides" -#: src/slic3r/GUI/Tab.cpp:1471 +#: src/slic3r/GUI/Tab.cpp:1416 msgid "Minimum shell thickness" msgstr "Gruix mínim de la carcassa" -#: src/slic3r/GUI/Tab.cpp:1482 +#: src/slic3r/GUI/Tab.cpp:1427 msgid "Quality (slower slicing)" msgstr "Qualitat (laminat més lent)" -#: src/slic3r/GUI/Tab.cpp:1497 +#: src/slic3r/GUI/Tab.cpp:1444 msgid "Fuzzy skin (experimental)" msgstr "Pell difusa (experimental)" -#: src/slic3r/GUI/Tab.cpp:1520 +#: src/slic3r/GUI/Tab.cpp:1467 msgid "Reducing printing time" msgstr "Reduint el temps d'impressió" -#: src/slic3r/GUI/Tab.cpp:1535 src/libslic3r/ExtrusionEntity.cpp:370 +#: src/slic3r/GUI/Tab.cpp:1482 msgid "Skirt" msgstr "Faldilla" -#: src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1504 msgid "Raft" msgstr "Bassa" -#: src/slic3r/GUI/Tab.cpp:1562 +#: src/slic3r/GUI/Tab.cpp:1509 msgid "Options for support material and raft" msgstr "Opcions de material de suport i bassa" -#: src/slic3r/GUI/Tab.cpp:1582 +#: src/slic3r/GUI/Tab.cpp:1528 +msgid "Organic supports" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1537 msgid "Speed for print moves" msgstr "Velocitat per als moviments d'impressió" -#: src/slic3r/GUI/Tab.cpp:1595 +#: src/slic3r/GUI/Tab.cpp:1550 +msgid "Dynamic overhang speed" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1557 msgid "Speed for non-print moves" msgstr "Velocitat per als moviments que no son d'impressió" -#: src/slic3r/GUI/Tab.cpp:1599 +#: src/slic3r/GUI/Tab.cpp:1561 msgid "Modifiers" msgstr "Modificadors" -#: src/slic3r/GUI/Tab.cpp:1603 +#: src/slic3r/GUI/Tab.cpp:1565 msgid "Acceleration control (advanced)" msgstr "Control d'acceleració (avançat)" -#: src/slic3r/GUI/Tab.cpp:1614 +#: src/slic3r/GUI/Tab.cpp:1576 msgid "Autospeed (advanced)" msgstr "Velocitat automàtica (avançat)" -#: src/slic3r/GUI/Tab.cpp:1618 +#: src/slic3r/GUI/Tab.cpp:1580 msgid "Pressure equalizer (experimental)" msgstr "Equalitzador de pressió (experimental)" -#: src/slic3r/GUI/Tab.cpp:1622 +#: src/slic3r/GUI/Tab.cpp:1584 msgid "Multiple Extruders" msgstr "Múltiples Extrusors" -#: src/slic3r/GUI/Tab.cpp:1630 +#: src/slic3r/GUI/Tab.cpp:1592 msgid "Ooze prevention" msgstr "Prevenció de degoteig" -#: src/slic3r/GUI/Tab.cpp:1650 +#: src/slic3r/GUI/Tab.cpp:1596 +msgid "Wipe tower" +msgstr "Torre de Neteja" + +#: src/slic3r/GUI/Tab.cpp:1612 msgid "Extrusion width" msgstr "Amplada de l'extrusió" -#: src/slic3r/GUI/Tab.cpp:1660 +#: src/slic3r/GUI/Tab.cpp:1622 msgid "Overlap" msgstr "Superposició" -#: src/slic3r/GUI/Tab.cpp:1663 +#: src/slic3r/GUI/Tab.cpp:1625 msgid "Flow" msgstr "Fluxe" -#: src/slic3r/GUI/Tab.cpp:1674 src/slic3r/GUI/Tab.cpp:1700 -msgid "Other" -msgstr "Altre" - -#: src/slic3r/GUI/Tab.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:1636 msgid "Arachne perimeter generator" msgstr "Generador perimetral d'aracne" -#: src/slic3r/GUI/Tab.cpp:1685 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1644 src/slic3r/GUI/Tab.cpp:4990 msgid "Output options" msgstr "Opcions de sortida" -#: src/slic3r/GUI/Tab.cpp:1686 +#: src/slic3r/GUI/Tab.cpp:1645 msgid "Sequential printing" msgstr "Impressió seqüencial" -#: src/slic3r/GUI/Tab.cpp:1688 +#: src/slic3r/GUI/Tab.cpp:1647 msgid "Extruder clearance" msgstr "Separació de l'extrusor" -#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:4735 +#: src/slic3r/GUI/Tab.cpp:1652 src/slic3r/GUI/Tab.cpp:4991 msgid "Output file" msgstr "Fitxer de sortida" -#: src/slic3r/GUI/Tab.cpp:1712 src/libslic3r/PrintConfig.cpp:2042 +#: src/slic3r/GUI/Tab.cpp:1671 src/libslic3r/PrintConfig.cpp:2072 msgid "Post-processing scripts" msgstr "Scripts de postprocessament" -#: src/slic3r/GUI/Tab.cpp:1724 src/slic3r/GUI/Tab.cpp:1725 -#: src/slic3r/GUI/Tab.cpp:2110 src/slic3r/GUI/Tab.cpp:2111 -#: src/slic3r/GUI/Tab.cpp:2498 src/slic3r/GUI/Tab.cpp:2499 -#: src/slic3r/GUI/Tab.cpp:2571 src/slic3r/GUI/Tab.cpp:2572 -#: src/slic3r/GUI/Tab.cpp:3957 src/slic3r/GUI/Tab.cpp:4585 -#: src/slic3r/GUI/Tab.cpp:4586 +#: src/slic3r/GUI/Tab.cpp:1683 src/slic3r/GUI/Tab.cpp:1684 +#: src/slic3r/GUI/Tab.cpp:2080 src/slic3r/GUI/Tab.cpp:2081 +#: src/slic3r/GUI/Tab.cpp:2486 src/slic3r/GUI/Tab.cpp:2487 +#: src/slic3r/GUI/Tab.cpp:2564 src/slic3r/GUI/Tab.cpp:2565 +#: src/slic3r/GUI/Tab.cpp:4182 src/slic3r/GUI/Tab.cpp:4822 +#: src/slic3r/GUI/Tab.cpp:4823 msgid "Notes" msgstr "Notes" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:2088 +#: src/slic3r/GUI/Tab.cpp:2493 src/slic3r/GUI/Tab.cpp:2571 +#: src/slic3r/GUI/Tab.cpp:4830 src/slic3r/GUI/Tab.cpp:4996 msgid "Dependencies" msgstr "Dependències" -#: src/slic3r/GUI/Tab.cpp:1732 src/slic3r/GUI/Tab.cpp:2119 -#: src/slic3r/GUI/Tab.cpp:2506 src/slic3r/GUI/Tab.cpp:2579 -#: src/slic3r/GUI/Tab.cpp:4594 src/slic3r/GUI/Tab.cpp:4741 +#: src/slic3r/GUI/Tab.cpp:1691 src/slic3r/GUI/Tab.cpp:2089 +#: src/slic3r/GUI/Tab.cpp:2494 src/slic3r/GUI/Tab.cpp:2572 +#: src/slic3r/GUI/Tab.cpp:4831 src/slic3r/GUI/Tab.cpp:4997 msgid "Profile dependencies" msgstr "Dependències del perfil" -#: src/slic3r/GUI/Tab.cpp:1771 +#: src/slic3r/GUI/Tab.cpp:1723 msgid "Post processing scripts shall modify G-code file in place." msgstr "" "Els scripts de postprocessament modificaran el fitxer de codi G al seu lloc." -#: src/slic3r/GUI/Tab.cpp:1850 +#: src/slic3r/GUI/Tab.cpp:1802 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8945,7 +10497,7 @@ msgstr[1] "" "del codi G i\n" "l'estimació del temps d'impressió." -#: src/slic3r/GUI/Tab.cpp:1855 +#: src/slic3r/GUI/Tab.cpp:1807 msgid "Found reserved keywords in" msgstr "Trobades paraules clau reservades a" @@ -8953,74 +10505,90 @@ msgstr "Trobades paraules clau reservades a" msgid "Filament Overrides" msgstr "Anul·lacions de filaments" -#: src/slic3r/GUI/Tab.cpp:1992 +#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2827 +msgid "Retraction" +msgstr "Retracció" + +#: src/slic3r/GUI/Tab.cpp:1951 +msgid "Temperature" +msgstr "Temperatura" + +#: src/slic3r/GUI/Tab.cpp:1955 msgid "Nozzle" msgstr "Broquet( nozzle )" -#: src/slic3r/GUI/Tab.cpp:1997 +#: src/slic3r/GUI/Tab.cpp:1960 msgid "Bed" msgstr "Llit" -#: src/slic3r/GUI/Tab.cpp:2002 +#: src/slic3r/GUI/Tab.cpp:1965 msgid "Cooling" msgstr "Refredament" -#: src/slic3r/GUI/Tab.cpp:2004 src/libslic3r/PrintConfig.cpp:1936 -#: src/libslic3r/PrintConfig.cpp:2994 +#: src/slic3r/GUI/Tab.cpp:1967 src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "Enable" msgstr "Activar" -#: src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/Tab.cpp:1978 msgid "Fan settings" msgstr "Configuració del ventilador" -#: src/slic3r/GUI/Tab.cpp:2026 +#: src/slic3r/GUI/Tab.cpp:1979 +msgid "Fan speed" +msgstr "Velocitat del ventilador" + +#: src/slic3r/GUI/Tab.cpp:1989 +msgid "Dynamic fan speeds" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1996 msgid "Cooling thresholds" msgstr "Llindars de refrigeració" -#: src/slic3r/GUI/Tab.cpp:2032 +#: src/slic3r/GUI/Tab.cpp:2002 msgid "Filament properties" msgstr "Propietats del filament" -#: src/slic3r/GUI/Tab.cpp:2039 +#: src/slic3r/GUI/Tab.cpp:2009 msgid "Print speed override" msgstr "Substitució de velocitat d'impressió" -#: src/slic3r/GUI/Tab.cpp:2049 +#: src/slic3r/GUI/Tab.cpp:2019 msgid "Wipe tower parameters" msgstr "Paràmetres de la torre de neteja" -#: src/slic3r/GUI/Tab.cpp:2052 +#: src/slic3r/GUI/Tab.cpp:2022 msgid "Toolchange parameters with single extruder MM printers" msgstr "Paràmetres del canvi d'eina per a impressores d'un únic extrusor MM" -#: src/slic3r/GUI/Tab.cpp:2065 +#: src/slic3r/GUI/Tab.cpp:2035 msgid "Ramming settings" msgstr "Configuració d'empenyiment" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 -#: src/slic3r/GUI/Tab.cpp:4264 src/libslic3r/GCode.cpp:733 -#: src/libslic3r/PrintConfig.cpp:2500 +#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:2398 +#: src/slic3r/GUI/Tab.cpp:4493 src/libslic3r/GCode.cpp:684 +#: src/libslic3r/PrintConfig.cpp:2532 msgid "Custom G-code" msgstr "Codi G personalitzat" -#: src/slic3r/GUI/Tab.cpp:2090 src/slic3r/GUI/Tab.cpp:2411 -#: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2450 -#: src/libslic3r/PrintConfig.cpp:2465 +#: src/slic3r/GUI/Tab.cpp:2060 src/slic3r/GUI/Tab.cpp:2399 +#: src/libslic3r/GCode.cpp:658 src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2497 msgid "Start G-code" msgstr "Codi G inicial" -#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:2421 -#: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:685 -#: src/libslic3r/PrintConfig.cpp:695 +#: src/slic3r/GUI/Tab.cpp:2070 src/slic3r/GUI/Tab.cpp:2409 +#: src/libslic3r/GCode.cpp:659 src/libslic3r/PrintConfig.cpp:788 +#: src/libslic3r/PrintConfig.cpp:798 msgid "End G-code" msgstr "Codi G final" -#: src/slic3r/GUI/Tab.cpp:2153 +#: src/slic3r/GUI/Tab.cpp:2115 msgid "Volumetric flow hints not available" msgstr "Els consells de flux volumètric no estan disponibles" -#: src/slic3r/GUI/Tab.cpp:2257 +#: src/slic3r/GUI/Tab.cpp:2241 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -9042,20 +10610,20 @@ msgstr "" "\"engranatge\" a la pestanya Configuració d'impressora. Els perfils de la " "impressora física s'emmagatzemen al directori PrusaSlicer/physical_printer." -#: src/slic3r/GUI/Tab.cpp:2291 src/slic3r/GUI/Tab.cpp:2518 +#: src/slic3r/GUI/Tab.cpp:2275 src/slic3r/GUI/Tab.cpp:2506 msgid "Size and coordinates" msgstr "Mida i coordenades" -#: src/slic3r/GUI/Tab.cpp:2300 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:2284 src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "Capabilities" msgstr "Capacitats" -#: src/slic3r/GUI/Tab.cpp:2305 +#: src/slic3r/GUI/Tab.cpp:2289 msgid "Number of extruders of the printer." msgstr "Nombre d'extrusores de la impressora." -#: src/slic3r/GUI/Tab.cpp:2334 +#: src/slic3r/GUI/Tab.cpp:2322 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -9067,105 +10635,101 @@ msgstr "" "Voleu canviar el diàmetre de tots els extrusors al valor del diàmetre del " "nozzle del primer extrusor?" -#: src/slic3r/GUI/Tab.cpp:2338 src/slic3r/GUI/Tab.cpp:2782 -#: src/libslic3r/PrintConfig.cpp:1900 +#: src/slic3r/GUI/Tab.cpp:2326 src/slic3r/GUI/Tab.cpp:2714 +#: src/libslic3r/PrintConfig.cpp:1937 msgid "Nozzle diameter" msgstr "Diàmetre del broquet(nozzle)" -#: src/slic3r/GUI/Tab.cpp:2431 src/libslic3r/GCode.cpp:709 -#: src/libslic3r/PrintConfig.cpp:425 +#: src/slic3r/GUI/Tab.cpp:2419 src/libslic3r/GCode.cpp:660 +#: src/libslic3r/PrintConfig.cpp:444 msgid "Before layer change G-code" msgstr "Codi G per abans d'un canvi de capa" -#: src/slic3r/GUI/Tab.cpp:2441 src/libslic3r/GCode.cpp:710 -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/slic3r/GUI/Tab.cpp:2429 src/libslic3r/GCode.cpp:661 +#: src/libslic3r/PrintConfig.cpp:1665 msgid "After layer change G-code" msgstr "Codi G per després d'un canvi de capa" -#: src/slic3r/GUI/Tab.cpp:2451 src/libslic3r/GCode.cpp:711 -#: src/libslic3r/PrintConfig.cpp:2877 +#: src/slic3r/GUI/Tab.cpp:2439 src/libslic3r/GCode.cpp:662 +#: src/libslic3r/PrintConfig.cpp:2965 msgid "Tool change G-code" msgstr "Codi G de canvi d'eina" -#: src/slic3r/GUI/Tab.cpp:2461 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2449 src/libslic3r/GCode.cpp:663 msgid "Between objects G-code (for sequential printing)" msgstr "Codi G per a entre objectes (per a impressió seqüencial)" -#: src/slic3r/GUI/Tab.cpp:2471 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2459 src/libslic3r/GCode.cpp:664 msgid "Color Change G-code" msgstr "Codi G Canvi Color" -#: src/slic3r/GUI/Tab.cpp:2480 src/libslic3r/GCode.cpp:714 -#: src/libslic3r/PrintConfig.cpp:2491 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:665 +#: src/libslic3r/PrintConfig.cpp:2523 msgid "Pause Print G-code" msgstr "Codi G per a Pausa d'Impressió" -#: src/slic3r/GUI/Tab.cpp:2489 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:666 msgid "Template Custom G-code" msgstr "Plantilla Codi G Personalitzat" -#: src/slic3r/GUI/Tab.cpp:2525 +#: src/slic3r/GUI/Tab.cpp:2513 msgid "Display" msgstr "Pantalla" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2528 msgid "Tilt" msgstr "Inclinació" -#: src/slic3r/GUI/Tab.cpp:2541 +#: src/slic3r/GUI/Tab.cpp:2529 msgid "Tilt time" msgstr "Temps d'inclinació" -#: src/slic3r/GUI/Tab.cpp:2548 src/slic3r/GUI/Tab.cpp:4575 +#: src/slic3r/GUI/Tab.cpp:2536 src/slic3r/GUI/Tab.cpp:4812 msgid "Corrections" msgstr "Correccions" -#: src/slic3r/GUI/Tab.cpp:2561 src/slic3r/GUI/Tab.cpp:4571 +#: src/slic3r/GUI/Tab.cpp:2549 src/slic3r/GUI/Tab.cpp:4808 msgid "Exposure" msgstr "Exposició" -#: src/slic3r/GUI/Tab.cpp:2622 src/slic3r/GUI/Tab.cpp:2709 -#: src/libslic3r/PrintConfig.cpp:1655 src/libslic3r/PrintConfig.cpp:1690 -#: src/libslic3r/PrintConfig.cpp:1707 src/libslic3r/PrintConfig.cpp:1724 -#: src/libslic3r/PrintConfig.cpp:1740 src/libslic3r/PrintConfig.cpp:1750 -#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1773 -#: src/libslic3r/PrintConfig.cpp:1783 +#: src/slic3r/GUI/Tab.cpp:2556 +msgid "Output" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2615 src/slic3r/GUI/Tab.cpp:2875 +#: src/libslic3r/PrintConfig.cpp:1694 src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1744 src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1777 src/libslic3r/PrintConfig.cpp:1787 +#: src/libslic3r/PrintConfig.cpp:1797 src/libslic3r/PrintConfig.cpp:1810 +#: src/libslic3r/PrintConfig.cpp:1820 msgid "Machine limits" msgstr "Límits de la màquina" -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2638 msgid "Values in this column are for Normal mode" msgstr "Els valors d'aquesta columna són per al mode Normal" -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2644 msgid "Values in this column are for Stealth mode" msgstr "Els valors d'aquesta columna són per al mode Silenciós" -#: src/slic3r/GUI/Tab.cpp:2660 +#: src/slic3r/GUI/Tab.cpp:2653 msgid "Maximum feedrates" msgstr "Velocitats d'alimentació màximes" -#: src/slic3r/GUI/Tab.cpp:2665 +#: src/slic3r/GUI/Tab.cpp:2658 msgid "Maximum accelerations" msgstr "Acceleracions màximes" -#: src/slic3r/GUI/Tab.cpp:2674 +#: src/slic3r/GUI/Tab.cpp:2667 msgid "Jerk limits" msgstr "Límits de jerk" -#: src/slic3r/GUI/Tab.cpp:2680 +#: src/slic3r/GUI/Tab.cpp:2673 msgid "Minimum feedrates" msgstr "Velocitats d'alimentació mínimes" -#: src/slic3r/GUI/Tab.cpp:2734 src/slic3r/GUI/Tab.cpp:2743 -msgid "Single extruder MM setup" -msgstr "Ajust per a MM amb un sol extrusor" - -#: src/slic3r/GUI/Tab.cpp:2744 -msgid "Single extruder multimaterial parameters" -msgstr "Paràmetres multimaterial per a un sol extrusor" - -#: src/slic3r/GUI/Tab.cpp:2779 +#: src/slic3r/GUI/Tab.cpp:2711 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -9173,19 +10737,27 @@ msgstr "" "Aquesta és una impressora multimaterial d'extrusor únic, els diàmetres de " "tots els extrusors s'establiran segons el valor nou. Vols procedir-hi?" -#: src/slic3r/GUI/Tab.cpp:2804 +#: src/slic3r/GUI/Tab.cpp:2739 +msgid "Reset to Filament Color" +msgstr "Reinicialitza el color del filament" + +#: src/slic3r/GUI/Tab.cpp:2775 +msgid "Apply below setting to other extruders" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2820 msgid "Layer height limits" msgstr "Límits d'alçada de la capa" -#: src/slic3r/GUI/Tab.cpp:2809 +#: src/slic3r/GUI/Tab.cpp:2824 msgid "Position (for multi-extruder printers)" msgstr "Posició (per a impressores multi-extrusora)" -#: src/slic3r/GUI/Tab.cpp:2815 +#: src/slic3r/GUI/Tab.cpp:2830 msgid "Only lift Z" msgstr "Només aixecar Z" -#: src/slic3r/GUI/Tab.cpp:2828 +#: src/slic3r/GUI/Tab.cpp:2843 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -9193,11 +10765,15 @@ msgstr "" "Retracció quan l'eina està desactivada (configuracions avançades per a " "configuracions d'extrusors múltiples)" -#: src/slic3r/GUI/Tab.cpp:2835 -msgid "Reset to Filament Color" -msgstr "Reinicialitza el color del filament" +#: src/slic3r/GUI/Tab.cpp:2900 src/slic3r/GUI/Tab.cpp:2909 +msgid "Single extruder MM setup" +msgstr "Ajust per a MM amb un sol extrusor" -#: src/slic3r/GUI/Tab.cpp:3012 +#: src/slic3r/GUI/Tab.cpp:2910 +msgid "Single extruder multimaterial parameters" +msgstr "Paràmetres multimaterial per a un sol extrusor" + +#: src/slic3r/GUI/Tab.cpp:3074 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -9206,31 +10782,46 @@ msgstr "" "L'opció Netejar no està disponible quan utilitzeu el mode Retracció de " "firmware. L'inhabilito per habilitar la Retracció de firmware?" -#: src/slic3r/GUI/Tab.cpp:3014 +#: src/slic3r/GUI/Tab.cpp:3076 msgid "Firmware Retraction" msgstr "Retracció del microprogramari( fimware )" -#: src/slic3r/GUI/Tab.cpp:3319 +#: src/slic3r/GUI/Tab.cpp:3384 msgid "New printer preset selected" msgstr "S'ha seleccionat una configuració nova de la impressora" -#: src/slic3r/GUI/Tab.cpp:3625 +#: src/slic3r/GUI/Tab.cpp:3758 msgid "Detached" msgstr "Separat" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3857 +msgid "" +"The physical printer below is based on the preset, you are going to rename." +msgid_plural "" +"The physical printers below are based on the preset, you are going to rename." +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Tab.cpp:3862 +msgid "Note, that the selected preset will be renamed in this printer too." +msgid_plural "" +"Note, that the selected preset will be renamed in these printers too." +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Tab.cpp:3924 msgid "remove" msgstr "eliminar" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3924 msgid "delete" msgstr "esborrar" -#: src/slic3r/GUI/Tab.cpp:3711 +#: src/slic3r/GUI/Tab.cpp:3933 msgid "It's a last preset for this physical printer." msgstr "És un últim valor per defecte per a aquesta impressora." -#: src/slic3r/GUI/Tab.cpp:3716 +#: src/slic3r/GUI/Tab.cpp:3938 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " @@ -9239,7 +10830,7 @@ msgstr "" "Esteu segur que voleu suprimir la configuració preestablerta \"%1%\" de la " "impressora física \"%2%\"?" -#: src/slic3r/GUI/Tab.cpp:3728 +#: src/slic3r/GUI/Tab.cpp:3950 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -9251,7 +10842,7 @@ msgstr[1] "" "Les impressores físiques que es mostren a continuació es basen en la " "configuració predefinida, la qual s'eliminarà." -#: src/slic3r/GUI/Tab.cpp:3733 +#: src/slic3r/GUI/Tab.cpp:3955 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." @@ -9262,7 +10853,7 @@ msgstr[1] "" "Tingueu en compte que la configuració predefinida seleccionada també " "s'eliminarà d'aquestes impressores." -#: src/slic3r/GUI/Tab.cpp:3738 +#: src/slic3r/GUI/Tab.cpp:3960 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -9276,7 +10867,7 @@ msgstr[1] "" "Les impressores físiques que es mostren a continuació es basen únicament en " "la configuració predefinida, la qual s'eliminarà." -#: src/slic3r/GUI/Tab.cpp:3743 +#: src/slic3r/GUI/Tab.cpp:3965 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -9288,57 +10879,57 @@ msgstr[1] "" "Tingueu en compte que aquestes impressores s'esborraran després d'esborrar " "la configuració predefinida seleccionada." -#: src/slic3r/GUI/Tab.cpp:3748 +#: src/slic3r/GUI/Tab.cpp:3970 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "Segur que desitges %1% el predefinit seleccionat?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3753 +#: src/slic3r/GUI/Tab.cpp:3975 #, boost-format msgid "%1% Preset" msgstr "%1% Predefinit" -#: src/slic3r/GUI/Tab.cpp:3836 src/slic3r/GUI/Tab.cpp:4198 +#: src/slic3r/GUI/Tab.cpp:4061 src/slic3r/GUI/Tab.cpp:4423 msgid "Set" msgstr "Ajust" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:4180 msgid "Find" msgstr "Cercar" -#: src/slic3r/GUI/Tab.cpp:3956 +#: src/slic3r/GUI/Tab.cpp:4181 msgid "Replace with" msgstr "Substitueix-ho per" -#: src/slic3r/GUI/Tab.cpp:4045 +#: src/slic3r/GUI/Tab.cpp:4270 msgid "Regular expression" msgstr "Expressió normal" -#: src/slic3r/GUI/Tab.cpp:4049 +#: src/slic3r/GUI/Tab.cpp:4274 msgid "Case insensitive" msgstr "No distingeix minúscules/majúscules" -#: src/slic3r/GUI/Tab.cpp:4053 +#: src/slic3r/GUI/Tab.cpp:4278 msgid "Whole word" msgstr "Paraula sencera" -#: src/slic3r/GUI/Tab.cpp:4057 +#: src/slic3r/GUI/Tab.cpp:4282 msgid "Match single line" msgstr "Coincideix amb una sola línia" -#: src/slic3r/GUI/Tab.cpp:4160 +#: src/slic3r/GUI/Tab.cpp:4385 msgid "Are you sure you want to delete all substitutions?" msgstr "Esteu segur que voleu suprimir totes les substitucions?" -#: src/slic3r/GUI/Tab.cpp:4292 +#: src/slic3r/GUI/Tab.cpp:4521 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" "Els límits de la màquina s'incorporaran al codi G i es faran servir per " "calcular el temps d'impressió." -#: src/slic3r/GUI/Tab.cpp:4295 +#: src/slic3r/GUI/Tab.cpp:4524 msgid "" "Machine limits will NOT be emitted to G-code, however they will be used to " "estimate print time, which may therefore not be accurate as the printer may " @@ -9348,7 +10939,7 @@ msgstr "" "estimar el temps d'impressió, que per tant pot no ser exacte ja que la " "impressora pot aplicar un conjunt diferent de límits de la màquina." -#: src/slic3r/GUI/Tab.cpp:4299 +#: src/slic3r/GUI/Tab.cpp:4528 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." @@ -9356,12 +10947,12 @@ msgstr "" "Els límits de la màquina no estan establerts, per tant, el temps d'impressió " "estimat pot no ser exacte." -#: src/slic3r/GUI/Tab.cpp:4321 +#: src/slic3r/GUI/Tab.cpp:4550 msgid "LOCKED LOCK" msgstr "PANY BLOQUEJAT" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4323 +#: src/slic3r/GUI/Tab.cpp:4552 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" @@ -9369,12 +10960,12 @@ msgstr "" "indica que els paràmetres són els mateixos que els valors del sistema (o per " "defecte) per al grup d'opcions actual" -#: src/slic3r/GUI/Tab.cpp:4325 +#: src/slic3r/GUI/Tab.cpp:4554 msgid "UNLOCKED LOCK" msgstr "PANY DESBLOQUEJAT" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4327 +#: src/slic3r/GUI/Tab.cpp:4556 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -9386,12 +10977,12 @@ msgstr "" "Feu clic a la icona PANY DESBLOQUEJAT per restablir tots els paràmetres del " "grup d'opcions actuals als valors del sistema (o per defecte)." -#: src/slic3r/GUI/Tab.cpp:4332 +#: src/slic3r/GUI/Tab.cpp:4561 msgid "WHITE BULLET" msgstr "VINYETA BLANCA" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4334 +#: src/slic3r/GUI/Tab.cpp:4563 msgid "" "for the left button: indicates a non-system (or non-default) preset,\n" "for the right button: indicates that the settings hasn't been modified." @@ -9400,12 +10991,12 @@ msgstr "" "predeterminat),\n" "per al botó dret: indica que la configuració no s'ha modificat." -#: src/slic3r/GUI/Tab.cpp:4337 +#: src/slic3r/GUI/Tab.cpp:4566 msgid "BACK ARROW" msgstr "FLETXA ENRERE" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4339 +#: src/slic3r/GUI/Tab.cpp:4568 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -9417,7 +11008,7 @@ msgstr "" "Feu clic al símbol FLETXA ENRERE per resetejar tots els paràmetres del grup " "d'opcions actuals als gravats anteriorment." -#: src/slic3r/GUI/Tab.cpp:4349 +#: src/slic3r/GUI/Tab.cpp:4578 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -9425,7 +11016,7 @@ msgstr "" "La icona de PANY BLOQUEJAT indica que els paràmetres són els mateixos que " "els valors del sistema (per defecte) per al grup d'opcions actual" -#: src/slic3r/GUI/Tab.cpp:4351 +#: src/slic3r/GUI/Tab.cpp:4580 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " "equal to the system (or default) values for the current option group.\n" @@ -9438,13 +11029,13 @@ msgstr "" "Feu clic per restablir totes les configuracions per al grup d'opcions " "actuals als valors del sistema (o per defecte)." -#: src/slic3r/GUI/Tab.cpp:4354 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" "La icona de VINYETA BLANCA indica un predifinit no del sistema (o no per " "defecte)" -#: src/slic3r/GUI/Tab.cpp:4357 +#: src/slic3r/GUI/Tab.cpp:4586 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -9453,7 +11044,7 @@ msgstr "" "els de la darrera vegada que heu salvat els paràmetres per al grup d'opcions " "actual." -#: src/slic3r/GUI/Tab.cpp:4359 +#: src/slic3r/GUI/Tab.cpp:4588 msgid "" "BACK ARROW icon indicates that the settings were changed and are not equal " "to the last saved preset for the current option group.\n" @@ -9464,7 +11055,7 @@ msgstr "" "són iguals als que es van desar per al grup d'opcions actual.\n" "Feu clic per tornar aquests valors als darrers desats." -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4594 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." @@ -9472,7 +11063,7 @@ msgstr "" "La icona de PANY BLOQUEJAT indica que el valor és el mateix que el del " "sistema (per defecte)" -#: src/slic3r/GUI/Tab.cpp:4366 +#: src/slic3r/GUI/Tab.cpp:4595 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -9482,7 +11073,7 @@ msgstr "" "configuracions i no són iguals als valors del sistema (o predeterminats).\n" "Feu clic per reiniciar el valor actual als del sistema (o predeterminats)" -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4601 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -9490,7 +11081,7 @@ msgstr "" "El símbol de VINYETA BLANCA indica que els valors són els mateixos que els " "dels paràmetres desats la darrera vegada." -#: src/slic3r/GUI/Tab.cpp:4373 +#: src/slic3r/GUI/Tab.cpp:4602 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -9500,31 +11091,31 @@ msgstr "" "desat la darrera vegada.\n" "Feu clic per restaurar el valor al darrer paràmetre desat." -#: src/slic3r/GUI/Tab.cpp:4527 src/slic3r/GUI/Tab.cpp:4529 +#: src/slic3r/GUI/Tab.cpp:4764 src/slic3r/GUI/Tab.cpp:4766 msgid "Material" msgstr "Material" -#: src/slic3r/GUI/Tab.cpp:4614 src/slic3r/GUI/Tab.cpp:4615 +#: src/slic3r/GUI/Tab.cpp:4851 src/slic3r/GUI/Tab.cpp:4852 msgid "Material printing profile" msgstr "Perfil d'impressió de material" -#: src/slic3r/GUI/Tab.cpp:4667 +#: src/slic3r/GUI/Tab.cpp:4901 msgid "Support head" msgstr "Cap del suport" -#: src/slic3r/GUI/Tab.cpp:4672 +#: src/slic3r/GUI/Tab.cpp:4906 msgid "Support pillar" msgstr "Pilar de suport" -#: src/slic3r/GUI/Tab.cpp:4695 +#: src/slic3r/GUI/Tab.cpp:4929 msgid "Connection of the support sticks and junctions" msgstr "Connexió de les varetes de suport i unions" -#: src/slic3r/GUI/Tab.cpp:4700 +#: src/slic3r/GUI/Tab.cpp:4956 msgid "Automatic generation" msgstr "Generació automàtica" -#: src/slic3r/GUI/Tab.cpp:4775 +#: src/slic3r/GUI/Tab.cpp:5024 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -9533,62 +11124,60 @@ msgstr "" "\"%1%\" està desactivat perquè \"%2%\" és a la categoria \"%3%\".\n" "Per activar \"%1%\", si us plau desactiva \"%2%\"" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3724 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3497 msgid "Object elevation" msgstr "Elevació de l'objecte" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3826 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3958 msgid "Pad around object" msgstr "Pad al voltant de l'objecte" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:153 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:162 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1047 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1100 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1115 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1130 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1145 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:147 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:156 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:165 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1107 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1122 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1137 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1152 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1197 msgid "Undef" msgstr "Undef" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:772 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:792 msgid "Unsaved Changes" msgstr "Canvis no desats" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:790 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:810 msgid "Switching Presets: Unsaved Changes" msgstr "S'estan canviant els predefinits: canvis no desats" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:832 -msgid "Old Value" -msgstr "Valor antic" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:858 +msgid "Original Value" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:859 +msgid "Modified Value" +msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:833 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:861 msgid "New Value" msgstr "Valor nou" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:867 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 msgid "Keep" msgstr "Mantenir" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1569 msgid "Transfer" msgstr "Transferir" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 msgid "Don't save" msgstr "No desar" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 -msgid "Discard" -msgstr "Descartar" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:877 -msgid "Save" -msgstr "Desar" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:898 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:926 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "create new project" @@ -9596,7 +11185,7 @@ msgstr "" "No et preguntarà pels canvis no guardats en predefinits la propera vegada " "que creis un nou projecte" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:927 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "switch a preset" @@ -9604,7 +11193,7 @@ msgstr "" "No et preguntarà pels canvis no guardats en predefinits la propera vegada " "que canvíis d'ajust" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:900 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:928 msgid "" "You will not be asked about the unsaved changes in presets the next time " "you: \n" @@ -9616,11 +11205,11 @@ msgstr "" "- Tanquis PrusaSlicer mentre es modifiquen alguns ajustaments,\n" "- Carreguis un nou projecte mentre es modifiquen alguns ajustaments" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:903 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:931 msgid "PrusaSlicer will remember your action." msgstr "PrusaSlicer recordarà la vostra acció." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:904 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:932 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" @@ -9629,59 +11218,59 @@ msgstr "" "Visita \"Preferències\" i marca\"%1%\"\n" "per a què pregunti sobre els canvis no guardats novament." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:964 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1772 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" "Alguns camps són massa llargs per cabre. El clic dret del ratolí mostra el " "text complet." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will not be saved" msgstr "No es desaran tots els canvis de configuració" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will be discarded." msgstr "Tots els canvis dels ajustaments seran descartats." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:941 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:969 msgid "Save the selected options." msgstr "Desa les opcions seleccionades." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:942 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:970 msgid "Keep the selected settings." msgstr "Conserva la configuració seleccionada." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:943 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:971 msgid "Transfer the selected settings to the newly selected preset." msgstr "" "Transfereix la configuració seleccionada al predefinit seleccionat " "recentment." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:947 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:975 #, boost-format msgid "Save the selected options to preset \"%1%\"." msgstr "Desar les opcions seleccionades a la configuració predefinida \"%1%\"." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:948 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:976 #, boost-format msgid "Transfer the selected options to the newly selected preset \"%1%\"." msgstr "" "Transferir les opcions seleccionades al nou predifnit seleccionat \"%1%\"." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1224 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1237 msgid "The following preset was modified" msgid_plural "The following presets were modified" msgstr[0] "S'ha modificat el predefinit següent" msgstr[1] "S'han modificat els predefinits següents" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1230 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1243 #, boost-format msgid "Preset \"%1%\" has the following unsaved changes:" msgstr "Predefinit \"%1%\" té els següents canvis no desats:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1234 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1247 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new printer profile and it has the " @@ -9690,7 +11279,7 @@ msgstr "" "El predefinit \"%1%\" no és compatible amb el perfil d'impressora nou i té " "els canvis següents no desats:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1235 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1248 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new print profile and it has the " @@ -9699,40 +11288,67 @@ msgstr "" "El predefinit \"%1%\" no és compatible amb el nou perfil d'impressió i té " "els canvis següents:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1297 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1850 msgid "Extruders count" msgstr "Comptador d'extrusors" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 -msgid "Select presets to compare" -msgstr "Seleccioneu els predefinits per comparar" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1326 +msgid "The preset modifications are successfully saved" +msgid_plural "The presets modifications are successfully saved" +msgstr[0] "Les modificacions del paràmetre s'han desat correctament" +msgstr[1] "Les modificacions dels paràmetres s'han desat correctament" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1515 msgid "Show all presets (including incompatible)" msgstr "Mostra tots els predefinits (inclosos els incompatibles)" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1533 +msgid "Select presets to compare" +msgstr "Seleccioneu els predefinits per comparar" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1545 msgid "Left Preset Value" msgstr "Valor predefinit esquerre" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1546 msgid "Right Preset Value" msgstr "Valor predefinit dret" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1595 +msgid "" +"Transfer the selected options from left preset to the right.\n" +"Note: New modified presets will be selected in settings tabs after close " +"this dialog." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1603 +msgid "Save the selected options from left preset to the right." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1621 +msgid "Transfer values from left to right" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1622 +msgid "" +"If enabled, this dialog can be used for transver selected values from left " +"to right preset." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1807 msgid "One of the presets doesn't found" msgstr "No s'ha trobat un dels predefinits" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1818 msgid "Compared presets has different printer technology" msgstr "Els predefinits comparats tenen una tecnologia d'impressora diferent" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1832 msgid "Presets are the same" msgstr "Els predefinits són els mateixos" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1840 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." @@ -9741,57 +11357,133 @@ msgstr "" "Feu clic en aquest botó per seleccionar el mateix predefinit per al " "predefinit dret i esquerre." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef category" msgstr "Categoria sense definir" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef group" msgstr "Grup sense definir" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:2016 +msgid "Modified" +msgstr "Modificat" + +#: src/slic3r/GUI/UpdateDialogs.cpp:41 msgid "Update available" msgstr "Actualització disponible" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UpdateDialogs.cpp:41 #, c-format, boost-format msgid "New version of %s is available" msgstr "Ja està disponible una nova versió de %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:42 +#: src/slic3r/GUI/UpdateDialogs.cpp:46 src/slic3r/GUI/UpdateDialogs.cpp:101 msgid "Current version:" msgstr "Versió actual:" -#: src/slic3r/GUI/UpdateDialogs.cpp:44 +#: src/slic3r/GUI/UpdateDialogs.cpp:48 src/slic3r/GUI/UpdateDialogs.cpp:103 +#: src/slic3r/GUI/UpdateDialogs.cpp:141 msgid "New version:" msgstr "Nova versió:" -#: src/slic3r/GUI/UpdateDialogs.cpp:52 +#: src/slic3r/GUI/UpdateDialogs.cpp:56 msgid "Changelog & Download" msgstr "Registre de canvis & Descarregar" -#: src/slic3r/GUI/UpdateDialogs.cpp:59 src/slic3r/GUI/UpdateDialogs.cpp:133 -#: src/slic3r/GUI/UpdateDialogs.cpp:191 +#: src/slic3r/GUI/UpdateDialogs.cpp:63 src/slic3r/GUI/UpdateDialogs.cpp:309 +#: src/slic3r/GUI/UpdateDialogs.cpp:367 msgid "Open changelog page" msgstr "Obre la pàgina del registre de canvis" -#: src/slic3r/GUI/UpdateDialogs.cpp:65 +#: src/slic3r/GUI/UpdateDialogs.cpp:69 msgid "Open download page" msgstr "Obre la pàgina de baixada" -#: src/slic3r/GUI/UpdateDialogs.cpp:72 +#: src/slic3r/GUI/UpdateDialogs.cpp:76 src/slic3r/GUI/UpdateDialogs.cpp:109 msgid "Don't notify about new releases any more" msgstr "No notifiquis més les noves versions" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +msgid "App Update available" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +#, c-format, boost-format +msgid "" +"New version of %s is available.\n" +"Do you wish to download it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:120 +msgid "Next" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +msgid "App Update download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +#, c-format, boost-format +msgid "New version of %s is available." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:146 +msgid "Run installer after download. (Otherwise file explorer will be opened)" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:151 +msgid "Target directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:158 +msgid "Select directory" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:176 +msgid "Select directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:193 +msgid "Download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:204 +msgid "Directory path is empty." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:212 +msgid "Directory path is incorrect." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:217 +#, boost-format +msgid "Directory %1% doesn't exists. Do you wish to create it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:222 +msgid "Failed to create directory." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:229 +#, boost-format +msgid "File %1% already exists. Do you wish to overwrite it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +#, boost-format +msgid "Download path is %1%. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:270 msgid "Opening Configuration Wizard" msgstr "Obrint Assistent de Configuració" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 src/slic3r/GUI/UpdateDialogs.cpp:261 +#: src/slic3r/GUI/UpdateDialogs.cpp:270 src/slic3r/GUI/UpdateDialogs.cpp:437 msgid "Configuration update" msgstr "Actualització de la configuració" -#: src/slic3r/GUI/UpdateDialogs.cpp:95 +#: src/slic3r/GUI/UpdateDialogs.cpp:271 msgid "" "PrusaSlicer is not using the newest configuration available.\n" "Configuration Wizard may not offer the latest printers, filaments and SLA " @@ -9801,11 +11493,11 @@ msgstr "" "És possible que l'Auxiliar de configuració no ofereixi les impressores, " "filaments i materials SLA més recents que s'instal·laran." -#: src/slic3r/GUI/UpdateDialogs.cpp:97 +#: src/slic3r/GUI/UpdateDialogs.cpp:273 msgid "Configuration update is available" msgstr "Disponible actualització de configuració" -#: src/slic3r/GUI/UpdateDialogs.cpp:100 +#: src/slic3r/GUI/UpdateDialogs.cpp:276 msgid "" "Would you like to install it?\n" "\n" @@ -9822,28 +11514,28 @@ msgstr "" "\n" "Paquets de configuració actualitzats:" -#: src/slic3r/GUI/UpdateDialogs.cpp:121 src/slic3r/GUI/UpdateDialogs.cpp:181 +#: src/slic3r/GUI/UpdateDialogs.cpp:297 src/slic3r/GUI/UpdateDialogs.cpp:357 msgid "Comment:" msgstr "Comentari:" -#: src/slic3r/GUI/UpdateDialogs.cpp:142 +#: src/slic3r/GUI/UpdateDialogs.cpp:318 msgid "Install" msgstr "Instal·lar" -#: src/slic3r/GUI/UpdateDialogs.cpp:144 +#: src/slic3r/GUI/UpdateDialogs.cpp:320 msgid "Don't install" msgstr "No instal·lar" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 src/slic3r/GUI/UpdateDialogs.cpp:212 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 src/slic3r/GUI/UpdateDialogs.cpp:388 #, c-format, boost-format msgid "%s incompatibility" msgstr "%s incompatibilitat" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 msgid "You must install a configuration update." msgstr "Heu d'instal·lar una actualització de configuració." -#: src/slic3r/GUI/UpdateDialogs.cpp:160 +#: src/slic3r/GUI/UpdateDialogs.cpp:336 #, c-format, boost-format msgid "" "%s will now start updates. Otherwise it won't be able to start.\n" @@ -9860,17 +11552,12 @@ msgstr "" "\n" "Configuracions actualitzades:" -#: src/slic3r/GUI/UpdateDialogs.cpp:200 src/slic3r/GUI/UpdateDialogs.cpp:247 -#, c-format, boost-format -msgid "Exit %s" -msgstr "Sortir %s" - -#: src/slic3r/GUI/UpdateDialogs.cpp:213 +#: src/slic3r/GUI/UpdateDialogs.cpp:389 #, c-format, boost-format msgid "%s configuration is incompatible" msgstr "%s la configuració és incompatible" -#: src/slic3r/GUI/UpdateDialogs.cpp:216 +#: src/slic3r/GUI/UpdateDialogs.cpp:392 #, c-format, boost-format msgid "" "This version of %s is not compatible with currently installed configuration " @@ -9891,20 +11578,20 @@ msgstr "" "seguretat de la configuració existent abans d'instal·lar la nova compatible " "amb aquesta versió de %s." -#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#: src/slic3r/GUI/UpdateDialogs.cpp:401 #, c-format, boost-format msgid "This %s version: %s" msgstr "Aquesta %s versió: %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:230 +#: src/slic3r/GUI/UpdateDialogs.cpp:406 msgid "Incompatible bundles:" msgstr "Paquets incompatibles:" -#: src/slic3r/GUI/UpdateDialogs.cpp:246 +#: src/slic3r/GUI/UpdateDialogs.cpp:422 msgid "Re-configure" msgstr "Torna a configurar" -#: src/slic3r/GUI/UpdateDialogs.cpp:265 +#: src/slic3r/GUI/UpdateDialogs.cpp:441 #, c-format, boost-format msgid "" "%s now uses an updated configuration structure.\n" @@ -9933,28 +11620,37 @@ msgstr "" "predefinits i per triar si voleu activar les actualitzacions automàtiques de " "valors predefinits." -#: src/slic3r/GUI/UpdateDialogs.cpp:282 +#: src/slic3r/GUI/UpdateDialogs.cpp:458 msgid "For more information please visit our wiki page:" msgstr "Per a més informació, visiteu la pàgina de la nostra wiki:" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 msgid "Configuration updates" msgstr "Actualitzacions de configuració" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 src/slic3r/GUI/UpdateDialogs.cpp:495 msgid "No updates available" msgstr "No hi ha actualitzacions disponibles" -#: src/slic3r/GUI/UpdateDialogs.cpp:304 +#: src/slic3r/GUI/UpdateDialogs.cpp:480 #, c-format, boost-format msgid "%s has no configuration updates available." msgstr "%s no té actualitzacions de configuració disponibles." -#: src/slic3r/GUI/WipeTowerDialog.cpp:21 +#: src/slic3r/GUI/UpdateDialogs.cpp:495 +msgid "App update" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:500 +#, c-format, boost-format +msgid "%s has no version updates available." +msgstr "" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:23 msgid "Ramming customization" msgstr "Configuració d'empenta" -#: src/slic3r/GUI/WipeTowerDialog.cpp:54 +#: src/slic3r/GUI/WipeTowerDialog.cpp:56 msgid "" "Ramming denotes the rapid extrusion just before a tool change in a single-" "extruder MM printer. Its purpose is to properly shape the end of the " @@ -9977,27 +11673,27 @@ msgstr "" "Aquest és un ajustament per a experts, ajustar-lo incorrectament podrà " "produir embussos, que la roda de l'extrusor esgarrapi el filament, etc." -#: src/slic3r/GUI/WipeTowerDialog.cpp:114 +#: src/slic3r/GUI/WipeTowerDialog.cpp:116 msgid "Total ramming time" msgstr "Temps d'empenta total" -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 msgid "Total rammed volume" msgstr "Volum total empès" -#: src/slic3r/GUI/WipeTowerDialog.cpp:120 +#: src/slic3r/GUI/WipeTowerDialog.cpp:122 msgid "Ramming line width" msgstr "Ample de la línia d'empenyiment" -#: src/slic3r/GUI/WipeTowerDialog.cpp:122 +#: src/slic3r/GUI/WipeTowerDialog.cpp:124 msgid "Ramming line spacing" msgstr "Separació de la línia d'empenyiment" -#: src/slic3r/GUI/WipeTowerDialog.cpp:173 +#: src/slic3r/GUI/WipeTowerDialog.cpp:175 msgid "Wipe tower - Purging volume adjustment" msgstr "Torre de neteja - Ajust del volum de purga" -#: src/slic3r/GUI/WipeTowerDialog.cpp:299 +#: src/slic3r/GUI/WipeTowerDialog.cpp:301 msgid "" "Here you can adjust required purging volume (mm³) for any given pair of " "tools." @@ -10005,23 +11701,23 @@ msgstr "" "Aquí podeu ajustar el volum de purga requerida (mm³) per a qualsevol parell " "d'eines." -#: src/slic3r/GUI/WipeTowerDialog.cpp:300 +#: src/slic3r/GUI/WipeTowerDialog.cpp:302 msgid "Extruder changed to" msgstr "L'extrusor canvia a" -#: src/slic3r/GUI/WipeTowerDialog.cpp:308 +#: src/slic3r/GUI/WipeTowerDialog.cpp:310 msgid "unloaded" msgstr "descarregat" -#: src/slic3r/GUI/WipeTowerDialog.cpp:309 +#: src/slic3r/GUI/WipeTowerDialog.cpp:311 msgid "loaded" msgstr "carregat" -#: src/slic3r/GUI/WipeTowerDialog.cpp:352 +#: src/slic3r/GUI/WipeTowerDialog.cpp:354 msgid "Tool #" msgstr "Eina #" -#: src/slic3r/GUI/WipeTowerDialog.cpp:361 +#: src/slic3r/GUI/WipeTowerDialog.cpp:363 msgid "" "Total purging volume is calculated by summing two values below, depending on " "which tools are loaded/unloaded." @@ -10029,15 +11725,15 @@ msgstr "" "El volum total de purga es calcula sumant dos valors més avall, depenent de " "quins filaments es carreguin/descarreguin." -#: src/slic3r/GUI/WipeTowerDialog.cpp:362 +#: src/slic3r/GUI/WipeTowerDialog.cpp:364 msgid "Volume to purge (mm³) when the filament is being" msgstr "Volum a purgar (mm³) quan el filament està sent" -#: src/slic3r/GUI/WipeTowerDialog.cpp:376 +#: src/slic3r/GUI/WipeTowerDialog.cpp:378 msgid "From" msgstr "Des de" -#: src/slic3r/GUI/WipeTowerDialog.cpp:442 +#: src/slic3r/GUI/WipeTowerDialog.cpp:444 msgid "" "Switching to simple settings will discard changes done in the advanced " "mode!\n" @@ -10049,26 +11745,28 @@ msgstr "" "\n" "Voleu continuar?" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show simplified settings" msgstr "Mostra els paràmetres simplificats" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show advanced settings" msgstr "Mostra ajustaments avançats" -#: src/slic3r/GUI/wxExtensions.cpp:644 +#: src/slic3r/GUI/wxExtensions.cpp:672 #, c-format, boost-format msgid "Switch to the %s mode" msgstr "Canvia al mode %s" -#: src/slic3r/GUI/wxExtensions.cpp:645 +#: src/slic3r/GUI/wxExtensions.cpp:673 #, c-format, boost-format msgid "Current mode is %s" msgstr "El mode actual és %s" -#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:141 -#: src/slic3r/Utils/Repetier.cpp:69 +#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:206 +#: src/slic3r/Utils/OctoPrint.cpp:255 src/slic3r/Utils/OctoPrint.cpp:666 +#: src/slic3r/Utils/OctoPrint.cpp:824 src/slic3r/Utils/OctoPrint.cpp:897 +#: src/slic3r/Utils/Repetier.cpp:88 #, c-format, boost-format msgid "Mismatched type of print host: %s" msgstr "Tipus de host d'impressió no coincident: %s" @@ -10188,72 +11886,103 @@ msgstr "" "Nota: Requereix FlashAir amb firmware 2.00.02 o posterior i la funció de " "pujada activada." -#: src/slic3r/Utils/OctoPrint.cpp:164 +#: src/slic3r/Utils/OctoPrint.cpp:278 msgid "Connection to OctoPrint works correctly." msgstr "La connexió amb OctoPrint funciona correctament." -#: src/slic3r/Utils/OctoPrint.cpp:170 +#: src/slic3r/Utils/OctoPrint.cpp:284 msgid "Could not connect to OctoPrint" msgstr "No s'ha pogut connectar a OctoPrint" -#: src/slic3r/Utils/OctoPrint.cpp:172 +#: src/slic3r/Utils/OctoPrint.cpp:286 msgid "Note: OctoPrint version at least 1.1.0 is required." msgstr "Nota: Es requereix com a mínim la versió OctoPrint 1.1.0." -#: src/slic3r/Utils/OctoPrint.cpp:292 +#: src/slic3r/Utils/OctoPrint.cpp:528 msgid "Connection to Prusa SL1 / SL1S works correctly." msgstr "La connexió a Prusa SL1 / SL1S funciona correctament." -#: src/slic3r/Utils/OctoPrint.cpp:298 +#: src/slic3r/Utils/OctoPrint.cpp:534 msgid "Could not connect to Prusa SLA" msgstr "No s'ha pogut connectar amb Prusa SLA" -#: src/slic3r/Utils/OctoPrint.cpp:336 +#: src/slic3r/Utils/OctoPrint.cpp:573 msgid "Connection to PrusaLink works correctly." msgstr "La connexió amb PrusaLink funciona correctament." -#: src/slic3r/Utils/OctoPrint.cpp:342 +#: src/slic3r/Utils/OctoPrint.cpp:579 msgid "Could not connect to PrusaLink" msgstr "No s'ha pogut connectar a PrusaLink" -#: src/slic3r/Utils/PresetUpdater.cpp:61 +#: src/slic3r/Utils/OctoPrint.cpp:776 +msgid "Storages found:" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "read only" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "no free space" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:781 +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%.%2%" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:64 #, boost-format msgid "Copying of file %1% to %2% failed: %3%" msgstr "La còpia del fitxer %1% a %2% ha fallat: %3%" -#: src/slic3r/Utils/PresetUpdater.cpp:645 -#: src/slic3r/Utils/PresetUpdater.cpp:662 +#: src/slic3r/Utils/PresetUpdater.cpp:998 +#: src/slic3r/Utils/PresetUpdater.cpp:1015 msgid "Continue and install configuration updates?" msgstr "Voleu continuar i instal·lar les actualitzacions de configuració?" -#: src/slic3r/Utils/PresetUpdater.cpp:777 +#: src/slic3r/Utils/PresetUpdater.cpp:1021 +msgid "Installing profiles" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1071 +#, boost-format +msgid "Downloading resources for %1%." +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1171 msgid "" -"Configuration Updates causes a lost of preset modification.\n" +"Configuration Update will cause the preset modification to be lost.\n" "So, check unsaved changes and save them if necessary." msgstr "" "L'actualització de la configuració fa que es perdi la modificació de la " "configuració.\n" "Per tant, comprova els canvis no guardats i guarda'ls si cal." -#: src/slic3r/Utils/PresetUpdater.cpp:779 +#: src/slic3r/Utils/PresetUpdater.cpp:1173 msgid "Updating" msgstr "Actualitzant" -#: src/slic3r/Utils/PresetUpdater.cpp:808 +#: src/slic3r/Utils/PresetUpdater.cpp:1202 #, c-format, boost-format msgid "requires min. %s and max. %s" msgstr "requereix un min. %s i un màx. %s" -#: src/slic3r/Utils/PresetUpdater.cpp:812 +#: src/slic3r/Utils/PresetUpdater.cpp:1206 #, c-format, boost-format msgid "requires min. %s" msgstr "requereix min. %s" -#: src/slic3r/Utils/PresetUpdater.cpp:815 +#: src/slic3r/Utils/PresetUpdater.cpp:1209 #, c-format, boost-format msgid "requires max. %s" msgstr "requereix màx. %s" +#: src/slic3r/Utils/PresetUpdater.cpp:1362 +#, boost-format +msgid "Couldn't locate idx file %1% when performing updates." +msgstr "" + #: src/slic3r/Utils/Http.cpp:73 msgid "" "Could not detect system SSL certificate store. PrusaSlicer will be unable to " @@ -10285,23 +12014,23 @@ msgstr "" "CURL init ha fallat. PrusaSlicer no pot establir connexions de xarxa. " "Consulta els registres per obtenir detalls addicionals." -#: src/slic3r/Utils/Process.cpp:157 +#: src/slic3r/Utils/Process.cpp:164 msgid "Open G-code file:" msgstr "Obre el fitxer de codi G:" -#: src/slic3r/Utils/Repetier.cpp:84 +#: src/slic3r/Utils/Repetier.cpp:103 msgid "Connection to Repetier works correctly." msgstr "La connexió amb Repetier funciona correctament." -#: src/slic3r/Utils/Repetier.cpp:90 +#: src/slic3r/Utils/Repetier.cpp:109 msgid "Could not connect to Repetier" msgstr "No s'ha pogut connectar amb Repetier" -#: src/slic3r/Utils/Repetier.cpp:92 +#: src/slic3r/Utils/Repetier.cpp:111 msgid "Note: Repetier version at least 0.90.0 is required." msgstr "Nota: Cal la versió 0.90.0 de Repetier com a mínim." -#: src/slic3r/Utils/Repetier.cpp:246 +#: src/slic3r/Utils/Repetier.cpp:263 #, boost-format msgid "" "HTTP status: %1%\n" @@ -10310,7 +12039,7 @@ msgstr "" "Estat HTTP: %1%\n" "Cos del missatge: \"%2%\"" -#: src/slic3r/Utils/Repetier.cpp:253 +#: src/slic3r/Utils/Repetier.cpp:270 #, boost-format msgid "" "Parsing of host response failed.\n" @@ -10321,7 +12050,7 @@ msgstr "" "Cos del missatge: \"%1%\"\n" "Error: \"%2%\"" -#: src/slic3r/Utils/Repetier.cpp:266 +#: src/slic3r/Utils/Repetier.cpp:283 #, boost-format msgid "" "Enumeration of host printers failed.\n" @@ -10355,25 +12084,25 @@ msgstr "Continuar" msgid "Abort" msgstr "Avortar" -#: src/libslic3r/GCode.cpp:539 +#: src/libslic3r/GCode.cpp:490 msgid "There is an object with no extrusions in the first layer." msgstr "Hi ha un objecte sense extrusions a la primera capa." -#: src/libslic3r/GCode.cpp:570 +#: src/libslic3r/GCode.cpp:521 #, boost-format msgid "Empty layer between %1% and %2%." msgstr "Capa buida entre %1% i %2%." -#: src/libslic3r/GCode.cpp:573 +#: src/libslic3r/GCode.cpp:524 msgid "(Some lines not shown)" msgstr "(Algunes línies no es mostren)" -#: src/libslic3r/GCode.cpp:575 +#: src/libslic3r/GCode.cpp:526 #, boost-format msgid "Object name: %1%" msgstr "Nom de l'objecte: %1%" -#: src/libslic3r/GCode.cpp:576 +#: src/libslic3r/GCode.cpp:527 msgid "" "Make sure the object is printable. This is usually caused by negligibly " "small extrusions or by a faulty model. Try to repair the model or change its " @@ -10383,30 +12112,30 @@ msgstr "" "extrusions insignificantment petites o per un model defectuós. Intenta " "reparar el model o canviar la seva orientació sobre el llit." -#: src/libslic3r/GCode.cpp:718 +#: src/libslic3r/GCode.cpp:669 msgid "Filament Start G-code" msgstr "Codi G Inicial del Filament" -#: src/libslic3r/GCode.cpp:725 +#: src/libslic3r/GCode.cpp:676 msgid "Filament End G-code" msgstr "Codi G Final del Filament" -#: src/libslic3r/GCode.cpp:764 +#: src/libslic3r/GCode.cpp:717 msgid "In the custom G-code were found reserved keywords:" msgstr "Al codi G personalitzat s'han trobat paraules clau reservades:" -#: src/libslic3r/GCode.cpp:766 +#: src/libslic3r/GCode.cpp:719 msgid "" "This may cause problems in g-code visualization and printing time estimation." msgstr "" "Això pot causar problemes en la visualització de codi g i l'estimació del " "temps d'impressió." -#: src/libslic3r/GCode.cpp:1200 src/libslic3r/GCode.cpp:1211 +#: src/libslic3r/GCode.cpp:1124 src/libslic3r/GCode.cpp:1135 msgid "No extrusions were generated for objects." msgstr "No s'han generat extrusions per als objectes." -#: src/libslic3r/GCode.cpp:1406 +#: src/libslic3r/GCode.cpp:1328 msgid "" "Your print is very close to the priming regions. Make sure there is no " "collision." @@ -10414,10 +12143,6 @@ msgstr "" "La teva impressió és molt a prop de les regions de purga. Assegureu-vos que " "no hi ha col·lisions." -#: src/libslic3r/ExtrusionEntity.cpp:344 src/libslic3r/ExtrusionEntity.cpp:380 -msgid "Mixed" -msgstr "Barrejat" - #: src/libslic3r/Flow.cpp:61 #, boost-format msgid "" @@ -10426,7 +12151,7 @@ msgstr "" "No es pot calcular l'amplada d'extrusió per a %1%: Variable \"%2%\" no " "accessible." -#: src/libslic3r/Format/3mf.cpp:1735 +#: src/libslic3r/Format/3mf.cpp:1880 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " @@ -10435,7 +12160,7 @@ msgstr "" "El fitxer 3mf seleccionat s'ha desat amb una versió més recent de %1% i no " "és compatible." -#: src/libslic3r/Format/3mf.cpp:1746 +#: src/libslic3r/Format/3mf.cpp:1891 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." @@ -10443,7 +12168,7 @@ msgstr "" "El 3MF seleccionat conté L'objecte pintat amb una versió més recent del " "PrusaSlicer i no és compatible." -#: src/libslic3r/Format/3mf.cpp:1750 +#: src/libslic3r/Format/3mf.cpp:1895 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." @@ -10451,7 +12176,7 @@ msgstr "" "El 3MF seleccionat conté un objecte pintat amb costura utilitzant una versió " "més recent del PrusaSlicer i no és compatible." -#: src/libslic3r/Format/3mf.cpp:1754 +#: src/libslic3r/Format/3mf.cpp:1899 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -10459,7 +12184,7 @@ msgstr "" "El 3MF seleccionat conté un objecte pintat multi-material utilitzant una " "versió més recent del PrusaSlicer i no és compatible." -#: src/libslic3r/Format/AMF.cpp:993 +#: src/libslic3r/Format/AMF.cpp:1000 #, boost-format msgid "" "The selected amf file has been saved with a newer version of %1% and is not " @@ -10612,26 +12337,32 @@ msgstr "ha fallat la validació" msgid "write calledback failed" msgstr "ha fallat write calledback" -#: src/libslic3r/Print.cpp:454 +#: src/libslic3r/Print.cpp:473 msgid "All objects are outside of the print volume." msgstr "Tots els objectes són fora del volum d'impressió." -#: src/libslic3r/Print.cpp:457 +#: src/libslic3r/Print.cpp:476 msgid "The supplied settings will cause an empty print." msgstr "La configuració subministrada provocarà una impressió buida." -#: src/libslic3r/Print.cpp:461 +#: src/libslic3r/Print.cpp:480 msgid "Some objects are too close; your extruder will collide with them." msgstr "Alguns objectes estan massa a prop; L'extrusor xocarà amb ells." -#: src/libslic3r/Print.cpp:463 +#: src/libslic3r/Print.cpp:482 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." msgstr "" "Alguns objectes són massa alts i no es poden imprimir sense col·lisions " "d'extrusora." -#: src/libslic3r/Print.cpp:472 +#: src/libslic3r/Print.cpp:486 +msgid "" +"Avoid crossing perimeters option and avoid crossing curled overhangs option " +"cannot be both enabled together." +msgstr "" + +#: src/libslic3r/Print.cpp:495 msgid "" "Only a single object may be printed at a time in Spiral Vase mode. Either " "remove all but the last object, or enable sequential mode by " @@ -10641,7 +12372,7 @@ msgstr "" "tots menys l'últim objecte o habiliteu el mode seqüencial per " "\"complete_objects\"." -#: src/libslic3r/Print.cpp:476 +#: src/libslic3r/Print.cpp:499 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." @@ -10649,7 +12380,17 @@ msgstr "" "L'opció gaso en espiral sols pot ser usada per imprimir objectes d'un sol " "material." -#: src/libslic3r/Print.cpp:489 +#: src/libslic3r/Print.cpp:523 +msgid "" +"The print is taller than the maximum allowed height. You might want to " +"reduce the size of your model or change current print settings and retry." +msgstr "" + +#: src/libslic3r/Print.cpp:540 +msgid "Variable layer height is not supported with Organic supports." +msgstr "" + +#: src/libslic3r/Print.cpp:553 msgid "" "The wipe tower is only supported if all extruders have the same nozzle " "diameter and use filaments of the same diameter." @@ -10657,7 +12398,7 @@ msgstr "" "La torre de neteja només és compatible si tots els extrusors tenen el mateix " "diàmetre de nozzle i usen filament del mateix diàmetre." -#: src/libslic3r/Print.cpp:495 +#: src/libslic3r/Print.cpp:559 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, " "RepRapFirmware and Repetier G-code flavors." @@ -10665,7 +12406,7 @@ msgstr "" "La Torre de Neteja només és compatible amb les variants de codi G usades per " "Marlin, RepRap/Sprinter, RepRapFirmware i Repetier." -#: src/libslic3r/Print.cpp:497 +#: src/libslic3r/Print.cpp:561 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." @@ -10673,20 +12414,20 @@ msgstr "" "Actualment,Torre de Neteja només és compatible amb l'encaminament relatiu de " "l'extrusor (use_relative_e_distances=1)." -#: src/libslic3r/Print.cpp:499 -msgid "Ooze prevention is currently not supported with the wipe tower enabled." +#: src/libslic3r/Print.cpp:563 +msgid "" +"Ooze prevention is only supported with the wipe tower when " +"'single_extruder_multi_material' is off." msgstr "" -"La prevenció de degoteig actualment no és compatible amb la torre de neteja " -"activa." -#: src/libslic3r/Print.cpp:501 +#: src/libslic3r/Print.cpp:565 msgid "" "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." msgstr "" "La Torre de Neteja actualment no és compatible amb E volumètric " "(use_volumetric_e=0)." -#: src/libslic3r/Print.cpp:503 +#: src/libslic3r/Print.cpp:567 msgid "" "The Wipe Tower is currently not supported for multimaterial sequential " "prints." @@ -10694,7 +12435,7 @@ msgstr "" "La Torre de Neteja no es permet ara per a impressions seqüencials " "multimaterial." -#: src/libslic3r/Print.cpp:524 +#: src/libslic3r/Print.cpp:577 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " "layer heights" @@ -10702,7 +12443,7 @@ msgstr "" "La torre de neteja només és compatible amb diversos objectes si tenen " "alçades de capes iguals" -#: src/libslic3r/Print.cpp:526 +#: src/libslic3r/Print.cpp:579 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "over an equal number of raft layers" @@ -10710,7 +12451,7 @@ msgstr "" "La torre de neteja només es permet per a diversos objectes si s'imprimeixen " "sobre un nombre igual de capes de bassa" -#: src/libslic3r/Print.cpp:529 +#: src/libslic3r/Print.cpp:582 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "with the same support_material_contact_distance" @@ -10718,7 +12459,7 @@ msgstr "" "La torre de neteja només és compatible amb diversos objectes si " "s'imprimeixen amb la mateixa support_material_contact_distance" -#: src/libslic3r/Print.cpp:531 +#: src/libslic3r/Print.cpp:584 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." @@ -10726,7 +12467,7 @@ msgstr "" "La torre de neteja només és compatible amb diversos objectes si es tallen " "igual." -#: src/libslic3r/Print.cpp:555 +#: src/libslic3r/Print.cpp:609 msgid "" "The Wipe tower is only supported if all objects have the same variable layer " "height" @@ -10734,23 +12475,23 @@ msgstr "" "La Torre de Neteja només és compatible si tots els objectes tenen la mateixa " "alçada de capa variable" -#: src/libslic3r/Print.cpp:579 +#: src/libslic3r/Print.cpp:633 msgid "" "One or more object were assigned an extruder that the printer does not have." msgstr "Un o més objectes han estat assignats a un extrusor inexistent." -#: src/libslic3r/Print.cpp:592 +#: src/libslic3r/Print.cpp:646 #, boost-format msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" msgstr "%1%=%2% mm és massa baix per ser imprès a una alçada de capa de %3% mm" -#: src/libslic3r/Print.cpp:595 +#: src/libslic3r/Print.cpp:649 #, boost-format msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" msgstr "" "%1%=%2% mm excessius per ser imprimible amb un nozzle de diàmetre de %3% mm" -#: src/libslic3r/Print.cpp:606 +#: src/libslic3r/Print.cpp:660 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " @@ -10761,37 +12502,25 @@ msgstr "" "suport s'ha d'imprimir amb l'extrusor actual (support_material_extruder == 0 " "o support_material_interface_extruder == 0), tots els nozzles han de ser del " "mateix diàmetre." - -#: src/libslic3r/Print.cpp:614 -msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers " -"need to be synchronized with the object layers." -msgstr "" -"Perquè la torre de neteja funcioni amb suports solubles, les capes de " -"suports necessiten estar sincronitzades amb les capes de l'objecte." - -#: src/libslic3r/Print.cpp:618 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only if they are " -"printed with the current extruder without triggering a tool change. (both " -"support_material_extruder and support_material_interface_extruder need to be " -"set to 0)." + +#: src/libslic3r/Print.cpp:668 +msgid "" +"For the Wipe Tower to work with the soluble supports, the support layers " +"need to be synchronized with the object layers." msgstr "" -"La Torre de Neteja actualment admet els suports no solubles només si estan " -"impresos amb l'extrusor actual sense activar un canvi d'eina. (Tant " -"support_material_extruder com support_material_interface_extruder s'han de " -"configurar a 0)." +"Perquè la torre de neteja funcioni amb suports solubles, les capes de " +"suports necessiten estar sincronitzades amb les capes de l'objecte." -#: src/libslic3r/Print.cpp:654 +#: src/libslic3r/Print.cpp:708 msgid "First layer height can't be greater than nozzle diameter" msgstr "" "L'alçada de primera capa no pot ser més gran que el diàmetre del nozzle" -#: src/libslic3r/Print.cpp:659 +#: src/libslic3r/Print.cpp:713 msgid "Layer height can't be greater than nozzle diameter" msgstr "L'alçada de la capa no pot ser més gran que diàmetre del nozzle" -#: src/libslic3r/Print.cpp:680 +#: src/libslic3r/Print.cpp:734 msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " @@ -10801,7 +12530,7 @@ msgstr "" "l'extrusor a cada capa per evitar la pèrdua de precisió de coma flotant. " "Afegiu \"G92 E0\" a layer_gcode." -#: src/libslic3r/Print.cpp:682 +#: src/libslic3r/Print.cpp:736 msgid "" "\"G92 E0\" was found in before_layer_gcode, which is incompatible with " "absolute extruder addressing." @@ -10809,7 +12538,7 @@ msgstr "" "\"G92 E0\" s'ha trobat a before_layer_gcode, el qual és incompatible amb " "l'adreçament absolut d'extrusor." -#: src/libslic3r/Print.cpp:684 +#: src/libslic3r/Print.cpp:738 msgid "" "\"G92 E0\" was found in layer_gcode, which is incompatible with absolute " "extruder addressing." @@ -10817,28 +12546,80 @@ msgstr "" "\"G92 E0\" s'ha trobat a layer_gcode, el qual és incompatible amb " "l'adreçament absolut d'extrusor." -#: src/libslic3r/Print.cpp:826 +#: src/libslic3r/Print.cpp:880 msgid "Infilling layers" msgstr "Omplint capes" -#: src/libslic3r/Print.cpp:848 +#: src/libslic3r/Print.cpp:908 msgid "Generating skirt and brim" msgstr "Generant faldilla i bassa" -#: src/libslic3r/Print.cpp:896 +#: src/libslic3r/Print.cpp:956 msgid "Exporting G-code" msgstr "S'està exportant el codi G" -#: src/libslic3r/Print.cpp:900 +#: src/libslic3r/Print.cpp:960 msgid "Generating G-code" msgstr "S'està generant el codi G" +#: src/libslic3r/Print.cpp:1169 +msgid "Alert if supports needed" +msgstr "" + +#: src/libslic3r/Print.cpp:1174 +msgid "long bridging extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1175 +msgid "floating bridge anchors" +msgstr "" + +#: src/libslic3r/Print.cpp:1178 +msgid "collapsing overhang" +msgstr "" + +#: src/libslic3r/Print.cpp:1180 +msgid "loose extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1183 +msgid "low bed adhesion" +msgstr "" + +#: src/libslic3r/Print.cpp:1184 +msgid "floating object part" +msgstr "" + +#: src/libslic3r/Print.cpp:1185 +msgid "thin fragile section" +msgstr "" + +#: src/libslic3r/Print.cpp:1221 +msgid "Detected print stability issues" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "or" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "and" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "brim" +msgstr "" + +#: src/libslic3r/Print.cpp:1248 +msgid "Consider enabling supports" +msgstr "" + #: src/libslic3r/SLA/Pad.cpp:533 msgid "Pad brim size is too small for the current configuration." msgstr "" "La mida de la vora del pad és massa petita per a la configuració actual." -#: src/libslic3r/SLAPrint.cpp:628 +#: src/libslic3r/SLAPrint.cpp:546 msgid "" "Cannot proceed without support points! Add support points or disable support " "generation." @@ -10846,7 +12627,7 @@ msgstr "" "No es pot fer sense punts de suport! Afegeix punts de suport o desactiva la " "generació de suports." -#: src/libslic3r/SLAPrint.cpp:640 +#: src/libslic3r/SLAPrint.cpp:558 msgid "" "Elevation is too low for object. Use the \"Pad around object\" feature to " "print the object without elevation." @@ -10854,7 +12635,7 @@ msgstr "" "Elevació massa baixa per a l'objecte. Utilitzeu la funció \"Pad al voltant " "de l'objecte\" per imprimir l'objecte sense elevació." -#: src/libslic3r/SLAPrint.cpp:646 +#: src/libslic3r/SLAPrint.cpp:564 msgid "" "The endings of the support pillars will be deployed on the gap between the " "object and the pad. 'Support base safety distance' has to be greater than " @@ -10865,71 +12646,71 @@ msgstr "" "ser més gran que el paràmetre 'Distància entre objectes de farciment' per " "evitar això." -#: src/libslic3r/SLAPrint.cpp:661 +#: src/libslic3r/SLAPrint.cpp:579 msgid "Exposition time is out of printer profile bounds." msgstr "Temps d'exposició inicial fora dels límits del perfil d'impressió." -#: src/libslic3r/SLAPrint.cpp:668 +#: src/libslic3r/SLAPrint.cpp:586 msgid "Initial exposition time is out of printer profile bounds." msgstr "" "El temps inicial d'exposició està fora dels límits del perfil de la " "impressora." -#: src/libslic3r/SLAPrint.cpp:784 +#: src/libslic3r/SLAPrint.cpp:693 msgid "Slicing done" msgstr "Laminat realitzat" -#: src/libslic3r/SLAPrintSteps.cpp:47 +#: src/libslic3r/SLAPrintSteps.cpp:57 +msgid "Assembling model from parts" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:58 msgid "Hollowing model" msgstr "Buidant l'interior" -#: src/libslic3r/SLAPrintSteps.cpp:48 +#: src/libslic3r/SLAPrintSteps.cpp:59 msgid "Drilling holes into model." msgstr "Trepant forats al model." -#: src/libslic3r/SLAPrintSteps.cpp:49 +#: src/libslic3r/SLAPrintSteps.cpp:60 msgid "Slicing model" msgstr "Laminant model" -#: src/libslic3r/SLAPrintSteps.cpp:50 src/libslic3r/SLAPrintSteps.cpp:639 +#: src/libslic3r/SLAPrintSteps.cpp:61 src/libslic3r/SLAPrintSteps.cpp:691 msgid "Generating support points" msgstr "S'estan generant punts de suport" -#: src/libslic3r/SLAPrintSteps.cpp:51 +#: src/libslic3r/SLAPrintSteps.cpp:62 msgid "Generating support tree" msgstr "S'està generant l'arbre de suport" -#: src/libslic3r/SLAPrintSteps.cpp:52 +#: src/libslic3r/SLAPrintSteps.cpp:63 msgid "Generating pad" msgstr "S'està generant el pad" -#: src/libslic3r/SLAPrintSteps.cpp:53 +#: src/libslic3r/SLAPrintSteps.cpp:64 msgid "Slicing supports" msgstr "Suports per al laminat" -#: src/libslic3r/SLAPrintSteps.cpp:68 +#: src/libslic3r/SLAPrintSteps.cpp:79 msgid "Merging slices and calculating statistics" msgstr "Barrejant laminats i calculant estadístiques" -#: src/libslic3r/SLAPrintSteps.cpp:69 +#: src/libslic3r/SLAPrintSteps.cpp:80 msgid "Rasterizing layers" msgstr "Rasteritzant capes" -#: src/libslic3r/SLAPrintSteps.cpp:435 -msgid "Too many overlapping holes." -msgstr "Hi ha massa forats superposats." - -#: src/libslic3r/SLAPrintSteps.cpp:442 +#: src/libslic3r/SLAPrintSteps.cpp:255 msgid "" "Mesh to be hollowed is not suitable for hollowing (does not bound a volume)." msgstr "" "La malla que es buidarà no és apta per al buidatge (no delimita un volum)." -#: src/libslic3r/SLAPrintSteps.cpp:450 +#: src/libslic3r/SLAPrintSteps.cpp:262 msgid "Unable to drill the current configuration of holes into the model." msgstr "No es pot perforar la configuració actual de forats al model." -#: src/libslic3r/SLAPrintSteps.cpp:470 +#: src/libslic3r/SLAPrintSteps.cpp:271 msgid "" "Drilling holes into the mesh failed. This is usually caused by broken model. " "Try to fix it first." @@ -10937,27 +12718,34 @@ msgstr "" "Perforació de forats a la malla fallida. Això generalment és causat per un " "model trencat. Intenta arreglar-ho primer." -#: src/libslic3r/SLAPrintSteps.cpp:476 +#: src/libslic3r/SLAPrintSteps.cpp:279 msgid "Failed to drill some holes into the model" msgstr "Fallada en la perforació d'alguns forats al model" -#: src/libslic3r/SLAPrintSteps.cpp:520 +#: src/libslic3r/SLAPrintSteps.cpp:289 +msgid "" +"Can't perform full mesh booleans! Some parts of the print will be previewed " +"with approximated meshes. This does not affect the quality of slices or the " +"physical print in any way." +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:510 msgid "" "Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "" "El laminat s'ha hagut de parar degut a un error intern: Índex de laminat " "inconsistent." -#: src/libslic3r/SLAPrintSteps.cpp:691 src/libslic3r/SLAPrintSteps.cpp:700 -#: src/libslic3r/SLAPrintSteps.cpp:738 +#: src/libslic3r/SLAPrintSteps.cpp:740 src/libslic3r/SLAPrintSteps.cpp:749 +#: src/libslic3r/SLAPrintSteps.cpp:787 msgid "Visualizing supports" msgstr "Visualitzar suports" -#: src/libslic3r/SLAPrintSteps.cpp:730 +#: src/libslic3r/SLAPrintSteps.cpp:779 msgid "No pad can be generated for this model with the current configuration" msgstr "No es pot generar el pad per a aquest model amb la configuració actual" -#: src/libslic3r/SLAPrintSteps.cpp:854 +#: src/libslic3r/SLAPrintSteps.cpp:908 msgid "" "There are unprintable objects. Try to adjust support settings to make the " "objects printable." @@ -10969,27 +12757,27 @@ msgstr "" msgid "Failed processing of the output_filename_format template." msgstr "Error en processar la plantilla output_filename_format." -#: src/libslic3r/PrintConfig.cpp:236 src/libslic3r/PrintConfig.cpp:237 +#: src/libslic3r/PrintConfig.cpp:254 src/libslic3r/PrintConfig.cpp:255 msgid "Printer technology" msgstr "Tecnologia d'impressora" -#: src/libslic3r/PrintConfig.cpp:244 +#: src/libslic3r/PrintConfig.cpp:260 msgid "Bed shape" msgstr "Forma de la base d'impressió" -#: src/libslic3r/PrintConfig.cpp:249 +#: src/libslic3r/PrintConfig.cpp:265 msgid "Bed custom texture" msgstr "Textura personalitzada de la base" -#: src/libslic3r/PrintConfig.cpp:254 +#: src/libslic3r/PrintConfig.cpp:270 msgid "Bed custom model" msgstr "Model personalitzat de la base" -#: src/libslic3r/PrintConfig.cpp:259 +#: src/libslic3r/PrintConfig.cpp:275 msgid "Elephant foot compensation" msgstr "Compensació de peu d'elefant" -#: src/libslic3r/PrintConfig.cpp:261 +#: src/libslic3r/PrintConfig.cpp:277 msgid "" "The first layer will be shrunk in the XY plane by the configured value to " "compensate for the 1st layer squish aka an Elephant Foot effect." @@ -10997,11 +12785,11 @@ msgstr "" "La primera capa es contraurà al pla XY pel valor configurat per compensar " "l'aplatament de la 1a capa, també conegut com a efecte Peu d'Elefant." -#: src/libslic3r/PrintConfig.cpp:269 +#: src/libslic3r/PrintConfig.cpp:285 msgid "G-code thumbnails" msgstr "Miniatures de codi G" -#: src/libslic3r/PrintConfig.cpp:270 +#: src/libslic3r/PrintConfig.cpp:286 msgid "" "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " "following format: \"XxY, XxY, ...\"" @@ -11009,11 +12797,11 @@ msgstr "" "Mides d'imatge que s'emmagatzemaran en fitxers .gcode i .sl1 / .sl1s, en el " "format següent: \"XxY, XxY, ...\"" -#: src/libslic3r/PrintConfig.cpp:276 +#: src/libslic3r/PrintConfig.cpp:292 msgid "Format of G-code thumbnails" msgstr "Format de les miniatures del codi G" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:293 msgid "" "Format of G-code thumbnails: PNG for best quality, JPG for smallest size, " "QOI for low memory firmware" @@ -11021,7 +12809,7 @@ msgstr "" "Format de les miniatures del codi G: PNG per a la millor qualitat, JPG per a " "la mida més petita, QOI per al firmware de memòria baixa" -#: src/libslic3r/PrintConfig.cpp:288 +#: src/libslic3r/PrintConfig.cpp:301 msgid "" "This setting controls the height (and thus the total number) of the slices/" "layers. Thinner layers give better accuracy but take more time to print." @@ -11030,11 +12818,11 @@ msgstr "" "làmines/capes. Les capes més primes tenen més precisió però requereixen més " "temps per imprimir." -#: src/libslic3r/PrintConfig.cpp:295 +#: src/libslic3r/PrintConfig.cpp:308 msgid "Max print height" msgstr "Alçada màxima d'impressió" -#: src/libslic3r/PrintConfig.cpp:296 +#: src/libslic3r/PrintConfig.cpp:309 msgid "" "Set this to the maximum height that can be reached by your extruder while " "printing." @@ -11042,11 +12830,11 @@ msgstr "" "Ajusta aquest valor a l'alçada màxima que pot assolir l'extrusor mentre " "imprimeix." -#: src/libslic3r/PrintConfig.cpp:304 +#: src/libslic3r/PrintConfig.cpp:317 msgid "Hostname, IP or URL" msgstr "Nom d'equip, IP o URL" -#: src/libslic3r/PrintConfig.cpp:305 +#: src/libslic3r/PrintConfig.cpp:318 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the hostname, IP address or URL of the printer host instance. Print host " @@ -11061,11 +12849,11 @@ msgstr "" "a la URL en el format següent: https://nomdeusuari:contrasenya@la vostra-" "adreça-de-octopi /" -#: src/libslic3r/PrintConfig.cpp:314 +#: src/libslic3r/PrintConfig.cpp:327 msgid "API Key / Password" msgstr "Clau API / Contrasenya" -#: src/libslic3r/PrintConfig.cpp:315 +#: src/libslic3r/PrintConfig.cpp:328 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the API Key or the password required for authentication." @@ -11073,11 +12861,11 @@ msgstr "" "Slic3r pot pujar fitxers de codi G a un host d'impressió. Aquest camp ha de " "contenir la clau API o la contrasenya requerida per a l'autenticació." -#: src/libslic3r/PrintConfig.cpp:323 +#: src/libslic3r/PrintConfig.cpp:336 msgid "Name of the printer" msgstr "Nom de la impressora" -#: src/libslic3r/PrintConfig.cpp:331 +#: src/libslic3r/PrintConfig.cpp:344 msgid "" "Custom CA certificate file can be specified for HTTPS OctoPrint connections, " "in crt/pem format. If left blank, the default OS CA certificate repository " @@ -11087,15 +12875,15 @@ msgstr "" "connexions HTTPS OctoPrint, en format crt/pem. Si es deixa en blanc, el " "repositori de certificats OS CA serà usat." -#: src/libslic3r/PrintConfig.cpp:347 +#: src/libslic3r/PrintConfig.cpp:360 msgid "Password" msgstr "Contrasenya" -#: src/libslic3r/PrintConfig.cpp:355 +#: src/libslic3r/PrintConfig.cpp:368 msgid "Ignore HTTPS certificate revocation checks" msgstr "Ignorar les comprovacions de revocació de certificats HTTPS" -#: src/libslic3r/PrintConfig.cpp:356 +#: src/libslic3r/PrintConfig.cpp:369 msgid "" "Ignore HTTPS certificate revocation checks in case of missing or offline " "distribution points. One may want to enable this option for self signed " @@ -11105,31 +12893,43 @@ msgstr "" "faltin punts de distribució o estiguin desconnectats. Hom pot voler " "habilitar aquesta opció per als certificats autosignats si la connexió falla." -#: src/libslic3r/PrintConfig.cpp:363 +#: src/libslic3r/PrintConfig.cpp:376 msgid "Printer preset names" msgstr "Noms predefinits de la impressora" -#: src/libslic3r/PrintConfig.cpp:364 +#: src/libslic3r/PrintConfig.cpp:377 msgid "Names of presets related to the physical printer" msgstr "Noms dels predefinits relacionats amb la impressora física" -#: src/libslic3r/PrintConfig.cpp:369 +#: src/libslic3r/PrintConfig.cpp:382 msgid "Authorization Type" msgstr "Tipus d'autorització" -#: src/libslic3r/PrintConfig.cpp:374 +#: src/libslic3r/PrintConfig.cpp:385 msgid "API key" msgstr "Codi API" -#: src/libslic3r/PrintConfig.cpp:375 +#: src/libslic3r/PrintConfig.cpp:386 msgid "HTTP digest" msgstr "HTTP digest" -#: src/libslic3r/PrintConfig.cpp:395 +#: src/libslic3r/PrintConfig.cpp:406 +msgid "Avoid crossing curled overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:407 +msgid "" +"Plan travel moves such that the extruder avoids areas where the filament may " +"be curled up. This is mostly happening on steeper rounded overhangs and may " +"cause a crash with the nozzle. This feature slows down both the print and " +"the G-code generation." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:414 msgid "Avoid crossing perimeters" msgstr "Evita travessar perímetres" -#: src/libslic3r/PrintConfig.cpp:396 +#: src/libslic3r/PrintConfig.cpp:415 msgid "" "Optimize travel moves in order to minimize the crossing of perimeters. This " "is mostly useful with Bowden extruders which suffer from oozing. This " @@ -11140,11 +12940,11 @@ msgstr "" "degoteig. Aquesta característica ralenteix tant la impressió com la " "generació de codi G." -#: src/libslic3r/PrintConfig.cpp:403 +#: src/libslic3r/PrintConfig.cpp:422 msgid "Avoid crossing perimeters - Max detour length" msgstr "Evitar travessar perímetres - Longitud màxima del desviament" -#: src/libslic3r/PrintConfig.cpp:405 +#: src/libslic3r/PrintConfig.cpp:424 msgid "" "The maximum detour length for avoid crossing perimeters. If the detour is " "longer than this value, avoid crossing perimeters is not applied for this " @@ -11157,15 +12957,15 @@ msgstr "" "especificar com a valor absolut o com a percentatge (per exemple, 50%) d'un " "desplaçament directe." -#: src/libslic3r/PrintConfig.cpp:408 +#: src/libslic3r/PrintConfig.cpp:427 msgid "mm or % (zero to disable)" msgstr "mm o % (zero per inhabilitar)" -#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:2839 +#: src/libslic3r/PrintConfig.cpp:434 src/libslic3r/PrintConfig.cpp:2927 msgid "Other layers" msgstr "Altres capes" -#: src/libslic3r/PrintConfig.cpp:416 +#: src/libslic3r/PrintConfig.cpp:435 msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." @@ -11174,11 +12974,11 @@ msgstr "" "Ajusta això a zero per deshabilitar les ordres de control de temperatura de " "la base calefactable a la sortida." -#: src/libslic3r/PrintConfig.cpp:419 +#: src/libslic3r/PrintConfig.cpp:438 msgid "Bed temperature" msgstr "Temperatura de la Base" -#: src/libslic3r/PrintConfig.cpp:426 +#: src/libslic3r/PrintConfig.cpp:445 msgid "" "This custom code is inserted at every layer change, right before the Z move. " "Note that you can use placeholder variables for all Slic3r settings as well " @@ -11189,11 +12989,11 @@ msgstr "" "posició per a tots els ajustaments de Slic3r, així com [layer_num] i " "[layer_z]." -#: src/libslic3r/PrintConfig.cpp:436 +#: src/libslic3r/PrintConfig.cpp:455 msgid "Between objects G-code" msgstr "Codi G per a entre objectes" -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:456 msgid "" "This code is inserted between objects when using sequential printing. By " "default extruder and bed temperature are reset using non-wait command; " @@ -11210,15 +13010,15 @@ msgstr "" "posició per a totes les configuracions de Slic3r, per la qual cosa podeu " "posar una ordre \"M109 S [first_layer_temperature]\" on vulgueu." -#: src/libslic3r/PrintConfig.cpp:448 +#: src/libslic3r/PrintConfig.cpp:467 msgid "Number of solid layers to generate on bottom surfaces." msgstr "Nombre de capes sòlides a generar a les superfícies inferiors." -#: src/libslic3r/PrintConfig.cpp:449 +#: src/libslic3r/PrintConfig.cpp:468 msgid "Bottom solid layers" msgstr "Capes sòlides inferiors" -#: src/libslic3r/PrintConfig.cpp:457 +#: src/libslic3r/PrintConfig.cpp:476 msgid "" "The number of bottom solid layers is increased above bottom_solid_layers if " "necessary to satisfy minimum thickness of bottom shell." @@ -11227,15 +13027,15 @@ msgstr "" "bottom_solid_layers si és necessari per assegurar un gruix mínim a la paret " "d'inferior." -#: src/libslic3r/PrintConfig.cpp:459 +#: src/libslic3r/PrintConfig.cpp:478 msgid "Minimum bottom shell thickness" msgstr "Gruix mínim de la tapa inferior" -#: src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:484 msgid "Bridge" msgstr "Pont" -#: src/libslic3r/PrintConfig.cpp:466 +#: src/libslic3r/PrintConfig.cpp:485 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." @@ -11243,21 +13043,21 @@ msgstr "" "Aquesta és l'acceleració que la impressora utilitzarà per als ponts. " "Establiu valor zero per deshabilitar el control d'acceleració per a ponts." -#: src/libslic3r/PrintConfig.cpp:468 src/libslic3r/PrintConfig.cpp:639 -#: src/libslic3r/PrintConfig.cpp:1192 src/libslic3r/PrintConfig.cpp:1201 -#: src/libslic3r/PrintConfig.cpp:1401 src/libslic3r/PrintConfig.cpp:1410 -#: src/libslic3r/PrintConfig.cpp:1419 src/libslic3r/PrintConfig.cpp:1713 -#: src/libslic3r/PrintConfig.cpp:1764 src/libslic3r/PrintConfig.cpp:1775 -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1983 -#: src/libslic3r/PrintConfig.cpp:1991 +#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:1252 src/libslic3r/PrintConfig.cpp:1261 +#: src/libslic3r/PrintConfig.cpp:1447 src/libslic3r/PrintConfig.cpp:1456 +#: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1750 +#: src/libslic3r/PrintConfig.cpp:1801 src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1822 src/libslic3r/PrintConfig.cpp:2013 +#: src/libslic3r/PrintConfig.cpp:2021 msgid "mm/s²" msgstr "mm/s²" -#: src/libslic3r/PrintConfig.cpp:474 +#: src/libslic3r/PrintConfig.cpp:493 msgid "Bridging angle" msgstr "Angle de pont" -#: src/libslic3r/PrintConfig.cpp:476 +#: src/libslic3r/PrintConfig.cpp:495 msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for all " @@ -11267,37 +13067,32 @@ msgstr "" "automàticament. En cas contrari, l'angle proporcionat es farà servir per a " "tots els ponts. Usa 180° per angle amb zero graus." -#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:1102 -#: src/libslic3r/PrintConfig.cpp:2282 src/libslic3r/PrintConfig.cpp:2292 -#: src/libslic3r/PrintConfig.cpp:2583 src/libslic3r/PrintConfig.cpp:2824 -#: src/libslic3r/PrintConfig.cpp:3041 src/libslic3r/PrintConfig.cpp:3144 -#: src/libslic3r/PrintConfig.cpp:3698 src/libslic3r/PrintConfig.cpp:3819 -msgid "°" -msgstr "°" - -#: src/libslic3r/PrintConfig.cpp:485 +#: src/libslic3r/PrintConfig.cpp:504 msgid "Bridges fan speed" msgstr "Velocitat del ventilador per a ponts" -#: src/libslic3r/PrintConfig.cpp:486 +#: src/libslic3r/PrintConfig.cpp:505 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "" "La velocitat d'aquest ventilador s'aplica durant tots els ponts i els " "voladissos." -#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:1114 -#: src/libslic3r/PrintConfig.cpp:1601 src/libslic3r/PrintConfig.cpp:1793 -#: src/libslic3r/PrintConfig.cpp:1856 src/libslic3r/PrintConfig.cpp:2115 -#: src/libslic3r/PrintConfig.cpp:2174 src/libslic3r/PrintConfig.cpp:3323 -#: src/libslic3r/PrintConfig.cpp:3612 src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:596 +#: src/libslic3r/PrintConfig.cpp:605 src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:623 src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1893 src/libslic3r/PrintConfig.cpp:2145 +#: src/libslic3r/PrintConfig.cpp:2204 src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3369 src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3870 msgid "%" msgstr "%" -#: src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:513 msgid "Bridge flow ratio" msgstr "Relació de flux del pont" -#: src/libslic3r/PrintConfig.cpp:496 +#: src/libslic3r/PrintConfig.cpp:515 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -11309,33 +13104,91 @@ msgstr "" "encara que la configuració predeterminada sol ser bona i ha d'experimentar " "amb la refrigeració (usar un ventilador) abans d'ajustar-ho." -#: src/libslic3r/PrintConfig.cpp:506 +#: src/libslic3r/PrintConfig.cpp:525 msgid "Bridges" msgstr "Ponts" -#: src/libslic3r/PrintConfig.cpp:508 +#: src/libslic3r/PrintConfig.cpp:527 msgid "Speed for printing bridges." msgstr "Velocitat per imprimir ponts." -#: src/libslic3r/PrintConfig.cpp:509 src/libslic3r/PrintConfig.cpp:920 -#: src/libslic3r/PrintConfig.cpp:928 src/libslic3r/PrintConfig.cpp:937 -#: src/libslic3r/PrintConfig.cpp:945 src/libslic3r/PrintConfig.cpp:972 -#: src/libslic3r/PrintConfig.cpp:991 src/libslic3r/PrintConfig.cpp:1329 -#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1620 -#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1730 -#: src/libslic3r/PrintConfig.cpp:1742 src/libslic3r/PrintConfig.cpp:1752 -#: src/libslic3r/PrintConfig.cpp:1815 src/libslic3r/PrintConfig.cpp:1874 -#: src/libslic3r/PrintConfig.cpp:2022 src/libslic3r/PrintConfig.cpp:2249 -#: src/libslic3r/PrintConfig.cpp:2258 src/libslic3r/PrintConfig.cpp:2789 -#: src/libslic3r/PrintConfig.cpp:2939 src/libslic3r/PrintConfig.cpp:2949 +#: src/libslic3r/PrintConfig.cpp:528 src/libslic3r/PrintConfig.cpp:1009 +#: src/libslic3r/PrintConfig.cpp:1017 src/libslic3r/PrintConfig.cpp:1026 +#: src/libslic3r/PrintConfig.cpp:1034 src/libslic3r/PrintConfig.cpp:1061 +#: src/libslic3r/PrintConfig.cpp:1080 src/libslic3r/PrintConfig.cpp:1386 +#: src/libslic3r/PrintConfig.cpp:1579 src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1733 src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1779 src/libslic3r/PrintConfig.cpp:1789 +#: src/libslic3r/PrintConfig.cpp:1852 src/libslic3r/PrintConfig.cpp:1911 +#: src/libslic3r/PrintConfig.cpp:2052 src/libslic3r/PrintConfig.cpp:2279 +#: src/libslic3r/PrintConfig.cpp:2288 src/libslic3r/PrintConfig.cpp:2810 +#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3037 msgid "mm/s" msgstr "mm/s" -#: src/libslic3r/PrintConfig.cpp:516 +#: src/libslic3r/PrintConfig.cpp:535 +msgid "Enable dynamic overhang speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:537 +msgid "This setting enables dynamic speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:541 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Speeds for overhang " +"sizes in between are calculated via linear interpolation. If set as " +"percentage, the speed is calculated over the external perimeter speed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:547 src/libslic3r/PrintConfig.cpp:594 +msgid "speed for 0% overlap (bridge)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:550 src/libslic3r/PrintConfig.cpp:559 +#: src/libslic3r/PrintConfig.cpp:568 src/libslic3r/PrintConfig.cpp:577 +#: src/libslic3r/PrintConfig.cpp:856 src/libslic3r/PrintConfig.cpp:1305 +#: src/libslic3r/PrintConfig.cpp:1316 src/libslic3r/PrintConfig.cpp:2387 +#: src/libslic3r/PrintConfig.cpp:2440 src/libslic3r/PrintConfig.cpp:2765 +#: src/libslic3r/PrintConfig.cpp:2997 +msgid "mm/s or %" +msgstr "mm/s o %" + +#: src/libslic3r/PrintConfig.cpp:556 src/libslic3r/PrintConfig.cpp:603 +msgid "speed for 25% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:612 +msgid "speed for 50% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:574 src/libslic3r/PrintConfig.cpp:621 +msgid "speed for 75% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:583 +msgid "Enable dynamic fan speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:584 +msgid "This setting enables dynamic fan speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:589 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Fan speeds for " +"overhang sizes in between are calculated via linear interpolation. " +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:630 msgid "Brim width" msgstr "Ample de la bassa" -#: src/libslic3r/PrintConfig.cpp:518 +#: src/libslic3r/PrintConfig.cpp:632 msgid "" "The horizontal width of the brim that will be printed around each object on " "the first layer. When raft is used, no brim is generated (use " @@ -11345,11 +13198,11 @@ msgstr "" "a la primera capa. Quan es fa servir la bassa, no es genera cap vora " "(utilitza raft_first_layer_expansion)." -#: src/libslic3r/PrintConfig.cpp:527 +#: src/libslic3r/PrintConfig.cpp:641 msgid "Brim type" msgstr "Tipus de bassa" -#: src/libslic3r/PrintConfig.cpp:529 +#: src/libslic3r/PrintConfig.cpp:643 msgid "" "The places where the brim will be printed around each object on the first " "layer." @@ -11357,27 +13210,27 @@ msgstr "" "Els llocs on s'imprimeix la vora al voltant de cada objecte a la primera " "capa." -#: src/libslic3r/PrintConfig.cpp:535 +#: src/libslic3r/PrintConfig.cpp:645 msgid "No brim" msgstr "Sense vora" -#: src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:646 msgid "Outer brim only" msgstr "Només la vora exterior" -#: src/libslic3r/PrintConfig.cpp:537 +#: src/libslic3r/PrintConfig.cpp:647 msgid "Inner brim only" msgstr "Només la vora interior" -#: src/libslic3r/PrintConfig.cpp:538 +#: src/libslic3r/PrintConfig.cpp:648 msgid "Outer and inner brim" msgstr "Vora interior i exterior" -#: src/libslic3r/PrintConfig.cpp:543 +#: src/libslic3r/PrintConfig.cpp:654 msgid "Brim separation gap" msgstr "Forat de separació de la vora" -#: src/libslic3r/PrintConfig.cpp:545 +#: src/libslic3r/PrintConfig.cpp:656 msgid "" "Offset of brim from the printed object. The offset is applied after the " "elephant foot compensation." @@ -11385,33 +13238,19 @@ msgstr "" "Desplaçament de la vora respecte a l'objecte imprès. El desplaçament " "s'aplica després de la compensació de peu d'elefant." -#: src/libslic3r/PrintConfig.cpp:552 -msgid "Clip multi-part objects" -msgstr "Enllaçar objectes de diverses parts" - -#: src/libslic3r/PrintConfig.cpp:553 -msgid "" -"When printing multi-material objects, this settings will make Slic3r to clip " -"the overlapping object parts one by the other (2nd part will be clipped by " -"the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -msgstr "" -"En imprimir objectes multimaterial, aquesta configuració farà que slic3r " -"retalli les parts de l'objecte superposades una per l'altra (la 2a part serà " -"retallada per la 1ra, la 3a part serà retallada per la 1ra i 2da, etc.)." - -#: src/libslic3r/PrintConfig.cpp:560 +#: src/libslic3r/PrintConfig.cpp:663 msgid "Colorprint height" msgstr "Alçada de Colorprint" -#: src/libslic3r/PrintConfig.cpp:561 +#: src/libslic3r/PrintConfig.cpp:664 msgid "Heights at which a filament change is to occur." msgstr "Alçades a les què es produirà un canvi de filament." -#: src/libslic3r/PrintConfig.cpp:571 +#: src/libslic3r/PrintConfig.cpp:674 msgid "Compatible printers condition" msgstr "Condició d'impressores compatibles" -#: src/libslic3r/PrintConfig.cpp:572 +#: src/libslic3r/PrintConfig.cpp:675 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " @@ -11421,11 +13260,11 @@ msgstr "" "existent. Si aquesta expressió és certa, el perfil es considera compatible " "amb el perfil d'impressió actiu." -#: src/libslic3r/PrintConfig.cpp:586 +#: src/libslic3r/PrintConfig.cpp:689 msgid "Compatible print profiles condition" msgstr "Condició de perfils d'impressió compatibles" -#: src/libslic3r/PrintConfig.cpp:587 +#: src/libslic3r/PrintConfig.cpp:690 msgid "" "A boolean expression using the configuration values of an active print " "profile. If this expression evaluates to true, this profile is considered " @@ -11435,11 +13274,11 @@ msgstr "" "perfil d'impressió actiu. Si aquesta expressió s'avalua com a certa, aquest " "perfil es considera compatible amb el perfil d'impressió actiu." -#: src/libslic3r/PrintConfig.cpp:604 +#: src/libslic3r/PrintConfig.cpp:707 msgid "Complete individual objects" msgstr "Completar objectes individuals" -#: src/libslic3r/PrintConfig.cpp:605 +#: src/libslic3r/PrintConfig.cpp:708 msgid "" "When printing multiple objects or copies, this feature will complete each " "object before moving onto next one (and starting it from its bottom layer). " @@ -11452,11 +13291,11 @@ msgstr "" "Slic3r t'hauria d'advertir i evitar les col·lisions de l'extrusor, però vés " "amb compte." -#: src/libslic3r/PrintConfig.cpp:613 +#: src/libslic3r/PrintConfig.cpp:716 msgid "Enable auto cooling" msgstr "Habilitar el refredament automàtic" -#: src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:717 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." @@ -11465,26 +13304,26 @@ msgstr "" "velocitat i la velocitat del ventilador segons el temps d'impressió de la " "capa." -#: src/libslic3r/PrintConfig.cpp:619 +#: src/libslic3r/PrintConfig.cpp:722 msgid "Cooling tube position" msgstr "Posició del tub de refrigeració" -#: src/libslic3r/PrintConfig.cpp:620 +#: src/libslic3r/PrintConfig.cpp:723 msgid "Distance of the center-point of the cooling tube from the extruder tip." msgstr "" "Distància des del centre del tub de refredament a la punta de l'extrusor." -#: src/libslic3r/PrintConfig.cpp:627 +#: src/libslic3r/PrintConfig.cpp:730 msgid "Cooling tube length" msgstr "Longitud del tub de refredament" -#: src/libslic3r/PrintConfig.cpp:628 +#: src/libslic3r/PrintConfig.cpp:731 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "" "Longitud del tub de refredament per limitar l'espai per a moviments de " "refredament dins del mateix." -#: src/libslic3r/PrintConfig.cpp:636 +#: src/libslic3r/PrintConfig.cpp:739 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " @@ -11494,11 +13333,11 @@ msgstr "" "específics de cada funció (perímetre/farciment). Establiu zero per evitar " "restablir l'acceleració." -#: src/libslic3r/PrintConfig.cpp:645 +#: src/libslic3r/PrintConfig.cpp:748 msgid "Default filament profile" msgstr "Perfil de filament per defecte" -#: src/libslic3r/PrintConfig.cpp:646 +#: src/libslic3r/PrintConfig.cpp:749 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " @@ -11508,12 +13347,12 @@ msgstr "" "En seleccionar el perfil de la impressora actual, s'activarà aquest perfil " "de filament." -#: src/libslic3r/PrintConfig.cpp:652 +#: src/libslic3r/PrintConfig.cpp:755 msgid "Default print profile" msgstr "Perfil d'impressió per defecte" -#: src/libslic3r/PrintConfig.cpp:653 src/libslic3r/PrintConfig.cpp:3542 -#: src/libslic3r/PrintConfig.cpp:3553 +#: src/libslic3r/PrintConfig.cpp:756 src/libslic3r/PrintConfig.cpp:3819 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -11523,11 +13362,11 @@ msgstr "" "En seleccionar el perfil d'impressora actual, aquest perfil d'impressió " "s'activarà." -#: src/libslic3r/PrintConfig.cpp:659 +#: src/libslic3r/PrintConfig.cpp:762 msgid "Disable fan for the first" msgstr "Desactivar ventilador per a la/les primera/es" -#: src/libslic3r/PrintConfig.cpp:660 +#: src/libslic3r/PrintConfig.cpp:763 msgid "" "You can set this to a positive value to disable fan at all during the first " "layers, so that it does not make adhesion worse." @@ -11535,11 +13374,11 @@ msgstr "" "Podeu establir un valor positiu per desactivar el ventilador durant les " "primeres capes, de manera que no empitjori l'adhesió." -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:772 msgid "Don't support bridges" msgstr "No suportar ponts" -#: src/libslic3r/PrintConfig.cpp:671 +#: src/libslic3r/PrintConfig.cpp:774 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." @@ -11547,16 +13386,16 @@ msgstr "" "Opció experimental per evitar que es generi material de suport sota les " "àrees amb pont." -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:780 msgid "Distance between copies" msgstr "Distància entre còpies" -#: src/libslic3r/PrintConfig.cpp:678 +#: src/libslic3r/PrintConfig.cpp:781 msgid "Distance used for the auto-arrange feature of the plater." msgstr "" "Distància utilitzada per a la funció d'ordenació automàtica de la base." -#: src/libslic3r/PrintConfig.cpp:686 +#: src/libslic3r/PrintConfig.cpp:789 msgid "" "This end procedure is inserted at the end of the output file. Note that you " "can use placeholder variables for all PrusaSlicer settings." @@ -11565,7 +13404,7 @@ msgstr "" "en compte que podeu utilitzar variables de marcador de posició per a totes " "les configuracions de PrusaSlicer." -#: src/libslic3r/PrintConfig.cpp:696 +#: src/libslic3r/PrintConfig.cpp:799 msgid "" "This end procedure is inserted at the end of the output file, before the " "printer end gcode (and before any toolchange from this filament in case of " @@ -11580,23 +13419,11 @@ msgstr "" "configuracions de PrusaSlicer. Si teniu diversos extrusors, el codi G es " "processa en ordre d'extrusor." -#: src/libslic3r/PrintConfig.cpp:707 -msgid "Ensure vertical shell thickness" -msgstr "Assegurar el gruix de la carcassa vertical" - -#: src/libslic3r/PrintConfig.cpp:709 -msgid "" -"Add solid infill near sloping surfaces to guarantee the vertical shell " -"thickness (top+bottom solid layers)." -msgstr "" -"Afegeix un farciment complet a prop de les superfícies inclinades per " -"garantir l'amplada vertical sol·licitada (capes sòlides a dalt+a baix)." - -#: src/libslic3r/PrintConfig.cpp:715 +#: src/libslic3r/PrintConfig.cpp:810 msgid "Top fill pattern" msgstr "Patró de farciment superior" -#: src/libslic3r/PrintConfig.cpp:717 +#: src/libslic3r/PrintConfig.cpp:812 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." @@ -11604,45 +13431,45 @@ msgstr "" "Patró de farciment per al farciment superior. Això només afecta la capa " "superior visible, i no les capes sòlides adjacents." -#: src/libslic3r/PrintConfig.cpp:728 src/libslic3r/PrintConfig.cpp:1169 -#: src/libslic3r/PrintConfig.cpp:2754 src/libslic3r/PrintConfig.cpp:2771 +#: src/libslic3r/PrintConfig.cpp:815 src/libslic3r/PrintConfig.cpp:1228 +#: src/libslic3r/PrintConfig.cpp:2776 src/libslic3r/PrintConfig.cpp:2791 msgid "Rectilinear" msgstr "Rectilini" -#: src/libslic3r/PrintConfig.cpp:729 +#: src/libslic3r/PrintConfig.cpp:816 msgid "Monotonic" msgstr "Monotònic" -#: src/libslic3r/PrintConfig.cpp:730 +#: src/libslic3r/PrintConfig.cpp:817 msgid "Monotonic Lines" msgstr "" -#: src/libslic3r/PrintConfig.cpp:731 src/libslic3r/PrintConfig.cpp:1170 +#: src/libslic3r/PrintConfig.cpp:818 src/libslic3r/PrintConfig.cpp:1229 msgid "Aligned Rectilinear" msgstr "Rectilini alineat" -#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:1176 -#: src/libslic3r/PrintConfig.cpp:2772 +#: src/libslic3r/PrintConfig.cpp:819 src/libslic3r/PrintConfig.cpp:1235 +#: src/libslic3r/PrintConfig.cpp:2792 msgid "Concentric" msgstr "Concèntric" -#: src/libslic3r/PrintConfig.cpp:733 src/libslic3r/PrintConfig.cpp:1180 +#: src/libslic3r/PrintConfig.cpp:820 src/libslic3r/PrintConfig.cpp:1239 msgid "Hilbert Curve" msgstr "Corba de Hilbert" -#: src/libslic3r/PrintConfig.cpp:734 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:821 src/libslic3r/PrintConfig.cpp:1240 msgid "Archimedean Chords" msgstr "Acords d'Arquimedes" -#: src/libslic3r/PrintConfig.cpp:735 src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:822 src/libslic3r/PrintConfig.cpp:1241 msgid "Octagram Spiral" msgstr "Espiral d'octagrama" -#: src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:830 msgid "Bottom fill pattern" msgstr "Patró de farciment inferior" -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:832 msgid "" "Fill pattern for bottom infill. This only affects the bottom external " "visible layer, and not its adjacent solid shells." @@ -11650,12 +13477,12 @@ msgstr "" "Patró de farciment per a la tapa inferior. Això només afecta la capa " "inferior externa visible, i no les parets adjacents." -#: src/libslic3r/PrintConfig.cpp:753 src/libslic3r/PrintConfig.cpp:765 -#: src/libslic3r/PrintConfig.cpp:1988 +#: src/libslic3r/PrintConfig.cpp:839 src/libslic3r/PrintConfig.cpp:851 +#: src/libslic3r/PrintConfig.cpp:2018 msgid "External perimeters" msgstr "Perímetres externs" -#: src/libslic3r/PrintConfig.cpp:755 +#: src/libslic3r/PrintConfig.cpp:841 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " "perimeters. If left zero, default extrusion width will be used if set, " @@ -11668,18 +13495,18 @@ msgstr "" "del filtre. Si s'expressa com a percentatge (per exemple, 200%), es " "computarà sobre l'alçada de la capa." -#: src/libslic3r/PrintConfig.cpp:758 src/libslic3r/PrintConfig.cpp:869 -#: src/libslic3r/PrintConfig.cpp:1223 src/libslic3r/PrintConfig.cpp:1445 -#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1529 -#: src/libslic3r/PrintConfig.cpp:2011 src/libslic3r/PrintConfig.cpp:2397 -#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2660 -#: src/libslic3r/PrintConfig.cpp:2895 src/libslic3r/PrintConfig.cpp:3117 -#: src/libslic3r/PrintConfig.cpp:3132 src/libslic3r/PrintConfig.cpp:3166 -#: src/libslic3r/PrintConfig.cpp:3178 +#: src/libslic3r/PrintConfig.cpp:844 src/libslic3r/PrintConfig.cpp:958 +#: src/libslic3r/PrintConfig.cpp:1283 src/libslic3r/PrintConfig.cpp:1491 +#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1570 +#: src/libslic3r/PrintConfig.cpp:2041 src/libslic3r/PrintConfig.cpp:2428 +#: src/libslic3r/PrintConfig.cpp:2601 src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2983 src/libslic3r/PrintConfig.cpp:3204 +#: src/libslic3r/PrintConfig.cpp:3219 src/libslic3r/PrintConfig.cpp:3253 +#: src/libslic3r/PrintConfig.cpp:3265 msgid "mm or %" msgstr "mm o %" -#: src/libslic3r/PrintConfig.cpp:767 +#: src/libslic3r/PrintConfig.cpp:853 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " @@ -11690,18 +13517,11 @@ msgstr "" "es calcularà a la configuració de velocitat de perímetres anterior. Establir " "zero per a automàtic." -#: src/libslic3r/PrintConfig.cpp:770 src/libslic3r/PrintConfig.cpp:1245 -#: src/libslic3r/PrintConfig.cpp:1256 src/libslic3r/PrintConfig.cpp:2356 -#: src/libslic3r/PrintConfig.cpp:2409 src/libslic3r/PrintConfig.cpp:2740 -#: src/libslic3r/PrintConfig.cpp:2909 -msgid "mm/s or %" -msgstr "mm/s o %" - -#: src/libslic3r/PrintConfig.cpp:777 +#: src/libslic3r/PrintConfig.cpp:863 msgid "External perimeters first" msgstr "Primer els perímetres externs" -#: src/libslic3r/PrintConfig.cpp:779 +#: src/libslic3r/PrintConfig.cpp:865 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." @@ -11709,11 +13529,12 @@ msgstr "" "Imprimeix els perímetres de contorn des del més extern fins al més interior " "en lloc de l'ordre invers predeterminat." -#: src/libslic3r/PrintConfig.cpp:785 +#: src/libslic3r/PrintConfig.cpp:871 msgid "Extra perimeters if needed" msgstr "Perímetres addicionals si és necessari" -#: src/libslic3r/PrintConfig.cpp:787 +#: src/libslic3r/PrintConfig.cpp:873 +#, fuzzy, c-format, boost-format msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " "keeps adding perimeters, until more than 70% of the loop immediately above " @@ -11723,7 +13544,18 @@ msgstr "" "inclinades. Slic3r segueix afegint perímetres fins que més del 70% del " "perímetre superior sigui suportat." -#: src/libslic3r/PrintConfig.cpp:797 +#: src/libslic3r/PrintConfig.cpp:880 +msgid "Extra perimeters on overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:882 +msgid "" +"Detect overhang areas where bridges cannot be anchored, and fill them with " +"extra perimeter paths. These paths are anchored to the nearby non-overhang " +"area when possible." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:890 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " @@ -11733,7 +13565,7 @@ msgstr "" "d'extrusió més específiques). Aquest valor anul·la els extrusors de " "perímetre i farciment, però no els extrusors de suport." -#: src/libslic3r/PrintConfig.cpp:809 +#: src/libslic3r/PrintConfig.cpp:898 msgid "" "Set this to the vertical distance between your nozzle tip and (usually) the " "X carriage rods. In other words, this is the height of the clearance " @@ -11746,7 +13578,7 @@ msgstr "" "la profunditat màxima que l'extrusor pot treure abans de col·lidir amb " "altres objectes impresos." -#: src/libslic3r/PrintConfig.cpp:820 +#: src/libslic3r/PrintConfig.cpp:909 msgid "" "Set this to the clearance radius around your extruder. If the extruder is " "not centered, choose the largest value for safety. This setting is used to " @@ -11757,20 +13589,20 @@ msgstr "" "seguretat. Aquesta configuració es fa servir per verificar col·lisions i " "mostrar la vista prèvia gràfica a la safata." -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:919 msgid "Extruder Color" msgstr "Color de l'extrusor" -#: src/libslic3r/PrintConfig.cpp:831 src/libslic3r/PrintConfig.cpp:894 -#: src/libslic3r/PrintConfig.cpp:3394 +#: src/libslic3r/PrintConfig.cpp:920 src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:3666 msgid "This is only used in the Slic3r interface as a visual help." msgstr "Això només s'utilitza a la interfície Slic3r com a ajuda visual." -#: src/libslic3r/PrintConfig.cpp:837 +#: src/libslic3r/PrintConfig.cpp:926 msgid "Extruder offset" msgstr "Desplaçament de l'extrusor" -#: src/libslic3r/PrintConfig.cpp:838 +#: src/libslic3r/PrintConfig.cpp:927 msgid "" "If your firmware doesn't handle the extruder displacement you need the G-" "code to take it into account. This option lets you specify the displacement " @@ -11782,11 +13614,11 @@ msgstr "" "desplaçament de cada extrusora respecte a la primera. S'esperen coordenades " "positives (es restaran de la coordenada XY)." -#: src/libslic3r/PrintConfig.cpp:847 +#: src/libslic3r/PrintConfig.cpp:936 msgid "Extrusion axis" msgstr "Eix d'extrusió" -#: src/libslic3r/PrintConfig.cpp:848 +#: src/libslic3r/PrintConfig.cpp:937 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." @@ -11794,11 +13626,11 @@ msgstr "" "Fes servir aquesta opció per ajustar la lletra associada a l'extrusor de la " "teva impressora (normalment s'usa E però d'altres utilitzen A)." -#: src/libslic3r/PrintConfig.cpp:853 +#: src/libslic3r/PrintConfig.cpp:942 msgid "Extrusion multiplier" msgstr "Multiplicador d'extrusió" -#: src/libslic3r/PrintConfig.cpp:854 +#: src/libslic3r/PrintConfig.cpp:943 msgid "" "This factor changes the amount of flow proportionally. You may need to tweak " "this setting to get nice surface finish and correct single wall widths. " @@ -11811,11 +13643,11 @@ msgstr "" "entre 0.9 i 1.1. Si creieu que heu de canviar això més, verifiqueu el " "diàmetre del filament i els passos de l'E al firmware." -#: src/libslic3r/PrintConfig.cpp:863 +#: src/libslic3r/PrintConfig.cpp:952 msgid "Default extrusion width" msgstr "Amplada d'extrusió per defecte" -#: src/libslic3r/PrintConfig.cpp:865 +#: src/libslic3r/PrintConfig.cpp:954 msgid "" "Set this to a non-zero value to allow a manual extrusion width. If left to " "zero, Slic3r derives extrusion widths from the nozzle diameter (see the " @@ -11829,11 +13661,11 @@ msgstr "" "d'extrusió, l'amplada d'extrusió de rebliment, etc.). Si s'expressa com a " "percentatge (per exemple: 230%), es computarà sobre l'alçada de la capa." -#: src/libslic3r/PrintConfig.cpp:877 +#: src/libslic3r/PrintConfig.cpp:966 msgid "Keep fan always on" msgstr "Mantenir el ventilador sempre encès" -#: src/libslic3r/PrintConfig.cpp:878 +#: src/libslic3r/PrintConfig.cpp:967 msgid "" "If this is enabled, fan will never be disabled and will be kept running at " "least at its minimum speed. Useful for PLA, harmful for ABS." @@ -11842,11 +13674,11 @@ msgstr "" "funcionant almenys a la seva velocitat mínima. Útil per a PLA, no recomanat " "per a ABS." -#: src/libslic3r/PrintConfig.cpp:883 +#: src/libslic3r/PrintConfig.cpp:972 msgid "Enable fan if layer print time is below" msgstr "Habilita ventilador si el temps d'impressió de la capa està per sota" -#: src/libslic3r/PrintConfig.cpp:884 +#: src/libslic3r/PrintConfig.cpp:973 msgid "" "If layer print time is estimated below this number of seconds, fan will be " "enabled and its speed will be calculated by interpolating the minimum and " @@ -11856,27 +13688,27 @@ msgstr "" "el ventilador s'habilitarà i la velocitat es calcularà en interpolar les " "velocitats mínima i màxima." -#: src/libslic3r/PrintConfig.cpp:886 src/libslic3r/PrintConfig.cpp:2344 +#: src/libslic3r/PrintConfig.cpp:975 src/libslic3r/PrintConfig.cpp:2375 msgid "approximate seconds" msgstr "segons aproximats" -#: src/libslic3r/PrintConfig.cpp:893 src/libslic3r/PrintConfig.cpp:3393 +#: src/libslic3r/PrintConfig.cpp:982 src/libslic3r/PrintConfig.cpp:3665 msgid "Color" msgstr "Color" -#: src/libslic3r/PrintConfig.cpp:899 +#: src/libslic3r/PrintConfig.cpp:988 msgid "Filament notes" msgstr "Notes de filament" -#: src/libslic3r/PrintConfig.cpp:900 +#: src/libslic3r/PrintConfig.cpp:989 msgid "You can put your notes regarding the filament here." msgstr "Podeu posar les vostres notes sobre el filament aquí." -#: src/libslic3r/PrintConfig.cpp:908 src/libslic3r/PrintConfig.cpp:1821 +#: src/libslic3r/PrintConfig.cpp:997 src/libslic3r/PrintConfig.cpp:1858 msgid "Max volumetric speed" msgstr "Velocitat volumètrica màxima" -#: src/libslic3r/PrintConfig.cpp:909 +#: src/libslic3r/PrintConfig.cpp:998 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " @@ -11887,27 +13719,27 @@ msgstr "" "volumètrica d'impressió i filament. Establir en zero per utilitzar sense " "límit." -#: src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:1007 msgid "Loading speed" msgstr "Velocitat de càrrega" -#: src/libslic3r/PrintConfig.cpp:919 +#: src/libslic3r/PrintConfig.cpp:1008 msgid "Speed used for loading the filament on the wipe tower." msgstr "Velocitat emprada per carregar el filament a la torre de neteja." -#: src/libslic3r/PrintConfig.cpp:926 +#: src/libslic3r/PrintConfig.cpp:1015 msgid "Loading speed at the start" msgstr "Velocitat de càrrega a l'inici" -#: src/libslic3r/PrintConfig.cpp:927 +#: src/libslic3r/PrintConfig.cpp:1016 msgid "Speed used at the very beginning of loading phase." msgstr "Velocitat utilitzada a linici de la fase de càrrega." -#: src/libslic3r/PrintConfig.cpp:934 +#: src/libslic3r/PrintConfig.cpp:1023 msgid "Unloading speed" msgstr "Velocitat de descàrrega" -#: src/libslic3r/PrintConfig.cpp:935 +#: src/libslic3r/PrintConfig.cpp:1024 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." @@ -11915,22 +13747,22 @@ msgstr "" "Velocitat emprada per descarregar el filament a la torre de neteja (no " "afecta la fase inicial de la descàrrega, només després d'empènyer)." -#: src/libslic3r/PrintConfig.cpp:943 +#: src/libslic3r/PrintConfig.cpp:1032 msgid "Unloading speed at the start" msgstr "Velocitat de descàrrega a l'inici" -#: src/libslic3r/PrintConfig.cpp:944 +#: src/libslic3r/PrintConfig.cpp:1033 msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "" "Velocitat utilitzada per descarregar la punta del filament immediatament " "després d'empènyer." -#: src/libslic3r/PrintConfig.cpp:951 +#: src/libslic3r/PrintConfig.cpp:1040 msgid "Delay after unloading" msgstr "Retard després de la descàrrega" -#: src/libslic3r/PrintConfig.cpp:952 +#: src/libslic3r/PrintConfig.cpp:1041 msgid "" "Time to wait after the filament is unloaded. May help to get reliable " "toolchanges with flexible materials that may need more time to shrink to " @@ -11940,11 +13772,11 @@ msgstr "" "aconseguir canvis d'eina fiables amb materials flexibles que poden " "necessitar més temps per encongir-se a la seva mida original." -#: src/libslic3r/PrintConfig.cpp:961 +#: src/libslic3r/PrintConfig.cpp:1050 msgid "Number of cooling moves" msgstr "Nombre de moviments de refredament" -#: src/libslic3r/PrintConfig.cpp:962 +#: src/libslic3r/PrintConfig.cpp:1051 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " "Specify desired number of these moves." @@ -11952,21 +13784,21 @@ msgstr "" "El filament es refreda en ser mogut cap endavant i cap enrere als tubs de " "refredament. Especifica el nombre que vulgueu d'aquests moviments." -#: src/libslic3r/PrintConfig.cpp:970 +#: src/libslic3r/PrintConfig.cpp:1059 msgid "Speed of the first cooling move" msgstr "Velocitat del primer moviment de refredament" -#: src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:1060 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "" "Els moviments de refredament s'estan accelerant gradualment començant a " "aquesta velocitat." -#: src/libslic3r/PrintConfig.cpp:978 +#: src/libslic3r/PrintConfig.cpp:1067 msgid "Minimal purge on wipe tower" msgstr "Purga mínima a la torre de neteja" -#: src/libslic3r/PrintConfig.cpp:979 +#: src/libslic3r/PrintConfig.cpp:1068 msgid "" "After a tool change, the exact position of the newly loaded filament inside " "the nozzle may not be known, and the filament pressure is likely not yet " @@ -11981,25 +13813,25 @@ msgstr "" "quantitat de material a la torre de neteja per produir de manera fiable " "successius farcitments o objectes de sacrifici." -#: src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:1072 msgid "mm³" msgstr "mm³" -#: src/libslic3r/PrintConfig.cpp:989 +#: src/libslic3r/PrintConfig.cpp:1078 msgid "Speed of the last cooling move" msgstr "Velocitat de l'últim moviment de refredament" -#: src/libslic3r/PrintConfig.cpp:990 +#: src/libslic3r/PrintConfig.cpp:1079 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "" "Els moviments de refredament s'estan accelerant gradualment cap a aquesta " "velocitat." -#: src/libslic3r/PrintConfig.cpp:997 +#: src/libslic3r/PrintConfig.cpp:1086 msgid "Filament load time" msgstr "Temps de càrrega del filament" -#: src/libslic3r/PrintConfig.cpp:998 +#: src/libslic3r/PrintConfig.cpp:1087 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " "filament during a tool change (when executing the T code). This time is " @@ -12010,11 +13842,11 @@ msgstr "" "temps s'afegeix al temps d'impressió total mitjançant l'estimador de temps " "del codi G." -#: src/libslic3r/PrintConfig.cpp:1005 +#: src/libslic3r/PrintConfig.cpp:1094 msgid "Ramming parameters" msgstr "Paràmetres d'empenyiment" -#: src/libslic3r/PrintConfig.cpp:1006 +#: src/libslic3r/PrintConfig.cpp:1095 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." @@ -12022,11 +13854,11 @@ msgstr "" "Aquesta cadena es modifica amb el qudre de diàleg d'empenyiment i conté " "paràmetres específics d'empenyiment." -#: src/libslic3r/PrintConfig.cpp:1012 +#: src/libslic3r/PrintConfig.cpp:1101 msgid "Filament unload time" msgstr "Temps de descàrrega del filament" -#: src/libslic3r/PrintConfig.cpp:1013 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " "filament during a tool change (when executing the T code). This time is " @@ -12037,7 +13869,7 @@ msgstr "" "Aquest temps s'afegeix al temps d'impressió total mitjançant l'estimador de " "temps del codi G." -#: src/libslic3r/PrintConfig.cpp:1021 +#: src/libslic3r/PrintConfig.cpp:1110 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " @@ -12047,12 +13879,12 @@ msgstr "" "tant, utilitzeu un calibre i realitzeu múltiples mesuraments al llarg del " "filament, després calculeu la mitjana." -#: src/libslic3r/PrintConfig.cpp:1028 src/libslic3r/PrintConfig.cpp:3432 -#: src/libslic3r/PrintConfig.cpp:3433 +#: src/libslic3r/PrintConfig.cpp:1117 src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3710 msgid "Density" msgstr "Densitat" -#: src/libslic3r/PrintConfig.cpp:1029 +#: src/libslic3r/PrintConfig.cpp:1118 msgid "" "Enter your filament density here. This is only for statistical information. " "A decent way is to weigh a known length of filament and compute the ratio of " @@ -12064,29 +13896,29 @@ msgstr "" "la relació de la longitud al volum. Millor és calcular el volum directament " "a través del desplaçament." -#: src/libslic3r/PrintConfig.cpp:1032 +#: src/libslic3r/PrintConfig.cpp:1121 msgid "g/cm³" msgstr "g/cm³" -#: src/libslic3r/PrintConfig.cpp:1037 +#: src/libslic3r/PrintConfig.cpp:1126 msgid "Filament type" msgstr "Tipus de filament" -#: src/libslic3r/PrintConfig.cpp:1038 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "The filament material type for use in custom G-codes." msgstr "" "El tipus de material de filament per al seu ús en codis G personalitzats." -#: src/libslic3r/PrintConfig.cpp:1066 +#: src/libslic3r/PrintConfig.cpp:1155 msgid "Soluble material" msgstr "Material soluble" -#: src/libslic3r/PrintConfig.cpp:1067 +#: src/libslic3r/PrintConfig.cpp:1156 msgid "Soluble material is most likely used for a soluble support." msgstr "" "El material soluble es fa servir molt probablement per a un suport soluble." -#: src/libslic3r/PrintConfig.cpp:1073 +#: src/libslic3r/PrintConfig.cpp:1162 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." @@ -12094,15 +13926,15 @@ msgstr "" "Introdueix aquí el teu cost de filament per kg. Només per informació " "estadística." -#: src/libslic3r/PrintConfig.cpp:1074 +#: src/libslic3r/PrintConfig.cpp:1163 msgid "money/kg" msgstr "diners/kg" -#: src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1168 msgid "Spool weight" msgstr "Pes de la bobina" -#: src/libslic3r/PrintConfig.cpp:1080 +#: src/libslic3r/PrintConfig.cpp:1169 msgid "" "Enter weight of the empty filament spool. One may weigh a partially consumed " "filament spool before printing and one may compare the measured weight with " @@ -12114,19 +13946,19 @@ msgstr "" "mesurat amb el pes calculat del filament amb la bobina per esbrinar si la " "quantitat de filament a la bobina és suficient per acabar la impressió." -#: src/libslic3r/PrintConfig.cpp:1084 +#: src/libslic3r/PrintConfig.cpp:1173 msgid "g" msgstr "g" -#: src/libslic3r/PrintConfig.cpp:1093 src/libslic3r/PrintConfig.cpp:3537 +#: src/libslic3r/PrintConfig.cpp:1182 src/libslic3r/PrintConfig.cpp:3814 msgid "(Unknown)" msgstr "(Desconegut)" -#: src/libslic3r/PrintConfig.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:1186 msgid "Fill angle" msgstr "Angle de farciment" -#: src/libslic3r/PrintConfig.cpp:1099 +#: src/libslic3r/PrintConfig.cpp:1188 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " @@ -12136,63 +13968,63 @@ msgstr "" "creuat a això. Els ponts s'emplenaran utilitzant la millor direcció que " "Slic3r pugui detectar, per la qual cosa aquesta configuració no els afecta." -#: src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1199 msgid "Fill density" msgstr "Densitat de farciment" -#: src/libslic3r/PrintConfig.cpp:1113 +#: src/libslic3r/PrintConfig.cpp:1201 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "Densitat del farciment intern, expressat en el rang 0% - 100%." -#: src/libslic3r/PrintConfig.cpp:1148 +#: src/libslic3r/PrintConfig.cpp:1224 msgid "Fill pattern" msgstr "Patró de farciment" -#: src/libslic3r/PrintConfig.cpp:1150 +#: src/libslic3r/PrintConfig.cpp:1226 msgid "Fill pattern for general low-density infill." msgstr "Patró de farciment per al farciment general de baixa densitat." -#: src/libslic3r/PrintConfig.cpp:1171 src/libslic3r/PrintConfig.cpp:2803 +#: src/libslic3r/PrintConfig.cpp:1230 src/libslic3r/PrintConfig.cpp:2822 msgid "Grid" msgstr "Graella" -#: src/libslic3r/PrintConfig.cpp:1173 +#: src/libslic3r/PrintConfig.cpp:1232 msgid "Stars" msgstr "Estrelles" -#: src/libslic3r/PrintConfig.cpp:1174 +#: src/libslic3r/PrintConfig.cpp:1233 msgid "Cubic" msgstr "Cúbic" -#: src/libslic3r/PrintConfig.cpp:1175 +#: src/libslic3r/PrintConfig.cpp:1234 msgid "Line" msgstr "Lineal" -#: src/libslic3r/PrintConfig.cpp:1177 src/libslic3r/PrintConfig.cpp:2756 +#: src/libslic3r/PrintConfig.cpp:1236 src/libslic3r/PrintConfig.cpp:2778 msgid "Honeycomb" msgstr "Panal d'abella" -#: src/libslic3r/PrintConfig.cpp:1178 +#: src/libslic3r/PrintConfig.cpp:1237 msgid "3D Honeycomb" msgstr "Panal d'abella 3D" -#: src/libslic3r/PrintConfig.cpp:1179 +#: src/libslic3r/PrintConfig.cpp:1238 msgid "Gyroid" msgstr "Giroide" -#: src/libslic3r/PrintConfig.cpp:1183 +#: src/libslic3r/PrintConfig.cpp:1242 msgid "Adaptive Cubic" msgstr "Cúbic adaptatiu" -#: src/libslic3r/PrintConfig.cpp:1184 +#: src/libslic3r/PrintConfig.cpp:1243 msgid "Support Cubic" msgstr "Suport Cúbic" -#: src/libslic3r/PrintConfig.cpp:1185 +#: src/libslic3r/PrintConfig.cpp:1244 msgid "Lightning" msgstr "Llampec" -#: src/libslic3r/PrintConfig.cpp:1190 +#: src/libslic3r/PrintConfig.cpp:1250 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." @@ -12201,11 +14033,11 @@ msgstr "" "Definiu el valor zero per desactivar el control d'acceleració per a la " "primera capa." -#: src/libslic3r/PrintConfig.cpp:1198 +#: src/libslic3r/PrintConfig.cpp:1258 msgid "First object layer over raft interface" msgstr "Primera capa d'objectes sobre la interfície de la bassa" -#: src/libslic3r/PrintConfig.cpp:1199 +#: src/libslic3r/PrintConfig.cpp:1259 msgid "" "This is the acceleration your printer will use for first layer of object " "above raft interface. Set zero to disable acceleration control for first " @@ -12216,11 +14048,11 @@ msgstr "" "zero per desactivar el control de l'acceleració per a la primera capa de " "l'objecte per sobre de la interfície de la bassa." -#: src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "First layer bed temperature" msgstr "Temperatura de la base calefactable per a la primera capa" -#: src/libslic3r/PrintConfig.cpp:1209 +#: src/libslic3r/PrintConfig.cpp:1269 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." @@ -12228,7 +14060,7 @@ msgstr "" "Temperatura de base calefactable per a la primera capa. Ajusta això a zero " "per deshabilitar les ordres de control de temperatura del llit a la sortida." -#: src/libslic3r/PrintConfig.cpp:1219 +#: src/libslic3r/PrintConfig.cpp:1279 msgid "" "Set this to a non-zero value to set a manual extrusion width for first " "layer. You can use this to force fatter extrudates for better adhesion. If " @@ -12241,7 +14073,7 @@ msgstr "" "exemple, 120%), es calcula sobre l'alçada de la primera capa. Si s'estableix " "a zero, utilitzareu l'amplada d'extrusió per defecte." -#: src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1293 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " @@ -12251,11 +14083,11 @@ msgstr "" "imprimir una capa inferior més gruixuda per millorar l'adherència i la " "tolerància de les bases d'impressió no perfectes." -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1301 msgid "First layer speed" msgstr "Velocitat de la primera capa" -#: src/libslic3r/PrintConfig.cpp:1242 +#: src/libslic3r/PrintConfig.cpp:1302 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " @@ -12266,12 +14098,12 @@ msgstr "" "tipus. Si s'expressa com a percentatge (per exemple: 40%), escalarà les " "velocitats predeterminades." -#: src/libslic3r/PrintConfig.cpp:1252 +#: src/libslic3r/PrintConfig.cpp:1312 msgid "Speed of object first layer over raft interface" msgstr "" "Velocitat de la primera capa de l'objecte sobre la interfície de la bassa" -#: src/libslic3r/PrintConfig.cpp:1253 +#: src/libslic3r/PrintConfig.cpp:1313 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first object layer above raft interface, regardless " @@ -12283,11 +14115,11 @@ msgstr "" "interfície de la bassa, independentment del tipus. Si s'expressa com a " "percentatge (per exemple: 40%), escalarà les velocitats per defecte." -#: src/libslic3r/PrintConfig.cpp:1263 +#: src/libslic3r/PrintConfig.cpp:1323 msgid "First layer nozzle temperature" msgstr "Temperatura del nozzle per a la primera capa" -#: src/libslic3r/PrintConfig.cpp:1264 +#: src/libslic3r/PrintConfig.cpp:1324 msgid "" "Nozzle temperature for the first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " @@ -12297,11 +14129,11 @@ msgstr "" "temperatura manualment durant la impressió, configureu-lo a zero per " "deshabilitar les ordres de control de temperatura al codi G de sortida." -#: src/libslic3r/PrintConfig.cpp:1272 +#: src/libslic3r/PrintConfig.cpp:1332 msgid "Full fan speed at layer" msgstr "Velocitat màxima del ventilador a la capa" -#: src/libslic3r/PrintConfig.cpp:1273 +#: src/libslic3r/PrintConfig.cpp:1333 msgid "" "Fan speed will be ramped up linearly from zero at layer " "\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". " @@ -12315,23 +14147,23 @@ msgstr "" "\"disable_fan_first_layers\", en aquest cas el ventilador funcionarà a la " "velocitat màxima permesa a la capa \"disable_fan_first_layers\" + 1." -#: src/libslic3r/PrintConfig.cpp:1285 +#: src/libslic3r/PrintConfig.cpp:1345 msgid "Fuzzy skin type." msgstr "Tipus de pell difusa." -#: src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1348 msgid "Outside walls" msgstr "Parets exteriors" -#: src/libslic3r/PrintConfig.cpp:1293 +#: src/libslic3r/PrintConfig.cpp:1349 msgid "All walls" msgstr "Totes les parets" -#: src/libslic3r/PrintConfig.cpp:1298 +#: src/libslic3r/PrintConfig.cpp:1355 msgid "Fuzzy skin thickness" msgstr "Gruix de la pell difusa" -#: src/libslic3r/PrintConfig.cpp:1300 +#: src/libslic3r/PrintConfig.cpp:1357 msgid "" "The maximum distance that each skin point can be offset (both ways), " "measured perpendicular to the perimeter wall." @@ -12339,11 +14171,11 @@ msgstr "" "La distància màxima a què es pot desplaçar cada punt de pell (en ambdós " "sentits), mesurada perpendicularment al mur perimetral." -#: src/libslic3r/PrintConfig.cpp:1308 +#: src/libslic3r/PrintConfig.cpp:1365 msgid "Fuzzy skin point distance" msgstr "Distància del punt de la pell difusa" -#: src/libslic3r/PrintConfig.cpp:1310 +#: src/libslic3r/PrintConfig.cpp:1367 msgid "" "Perimeters will be split into multiple segments by inserting Fuzzy skin " "points. Lowering the Fuzzy skin point distance will increase the number of " @@ -12353,11 +14185,11 @@ msgstr "" "punts de pell difusa. La reducció de la distància del punt de la pell difusa " "augmentarà el nombre de punts de desplaçament aleatori a la paret perimetral." -#: src/libslic3r/PrintConfig.cpp:1318 +#: src/libslic3r/PrintConfig.cpp:1375 msgid "Fill gaps" msgstr "Emplena els buits" -#: src/libslic3r/PrintConfig.cpp:1320 +#: src/libslic3r/PrintConfig.cpp:1377 msgid "" "Enables filling of gaps between perimeters and between the inner most " "perimeters and infill." @@ -12365,7 +14197,11 @@ msgstr "" "Permet emplenar els buits entre els perímetres i entre els perímetres més " "interns i el farciment." -#: src/libslic3r/PrintConfig.cpp:1327 +#: src/libslic3r/PrintConfig.cpp:1382 +msgid "Gap fill" +msgstr "Farciment del buit" + +#: src/libslic3r/PrintConfig.cpp:1384 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " @@ -12375,11 +14211,11 @@ msgstr "" "Mantingueu això raonablement baix per evitar massa problemes de vibració i " "sacsejades. Establiu zero per desactivar l'ompliment de buits." -#: src/libslic3r/PrintConfig.cpp:1335 +#: src/libslic3r/PrintConfig.cpp:1392 msgid "Verbose G-code" msgstr "Codi G detallat" -#: src/libslic3r/PrintConfig.cpp:1336 +#: src/libslic3r/PrintConfig.cpp:1393 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " @@ -12389,11 +14225,11 @@ msgstr "" "explicada per un text descriptiu. Si imprimiu des d'una targeta SD, el pes " "addicional del fitxer podria alentir el vostre firmware." -#: src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1400 msgid "G-code flavor" msgstr "Tipus de codi G" -#: src/libslic3r/PrintConfig.cpp:1344 +#: src/libslic3r/PrintConfig.cpp:1401 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " @@ -12405,15 +14241,15 @@ msgstr "" "impressora per obtenir una sortida compatible. El tipus \"Sense extrusió\" " "evita que PrusaSlicer exporti cap valor d'extrusió." -#: src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1416 msgid "No extrusion" msgstr "Sense extrusió" -#: src/libslic3r/PrintConfig.cpp:1376 +#: src/libslic3r/PrintConfig.cpp:1422 msgid "Label objects" msgstr "Etiquetar objectes" -#: src/libslic3r/PrintConfig.cpp:1377 +#: src/libslic3r/PrintConfig.cpp:1423 msgid "" "Enable this to add comments into the G-Code labeling print moves with what " "object they belong to, which is useful for the Octoprint CancelObject " @@ -12426,19 +14262,19 @@ msgstr "" "configuració de Extrusor Únic Multi Material i Netejar en Objecte / Netejar " "en Farciment." -#: src/libslic3r/PrintConfig.cpp:1384 +#: src/libslic3r/PrintConfig.cpp:1430 msgid "G-code substitutions" msgstr "Substitucions de codi G" -#: src/libslic3r/PrintConfig.cpp:1385 +#: src/libslic3r/PrintConfig.cpp:1431 msgid "Find / replace patterns in G-code lines and substitute them." msgstr "Cerca / substitueix patrons en línies de codi G i els substitueix." -#: src/libslic3r/PrintConfig.cpp:1390 +#: src/libslic3r/PrintConfig.cpp:1436 msgid "High extruder current on filament swap" msgstr "Alta intensitat a l'extrusor durant el canvi de filament" -#: src/libslic3r/PrintConfig.cpp:1391 +#: src/libslic3r/PrintConfig.cpp:1437 msgid "" "It may be beneficial to increase the extruder motor current during the " "filament exchange sequence to allow for rapid ramming feed rates and to " @@ -12449,7 +14285,7 @@ msgstr "" "rampa ràpides i superar la resistència quan es carrega un filament amb una " "punta de forma lletja." -#: src/libslic3r/PrintConfig.cpp:1399 +#: src/libslic3r/PrintConfig.cpp:1445 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." @@ -12458,23 +14294,33 @@ msgstr "" "Establiu amb el valor zero per deshabilitar el control d'acceleració per al " "farciment." -#: src/libslic3r/PrintConfig.cpp:1408 +#: src/libslic3r/PrintConfig.cpp:1453 src/libslic3r/PrintConfig.cpp:2423 +#: src/libslic3r/PrintConfig.cpp:2435 +msgid "Solid infill" +msgstr "Farciment sòlid" + +#: src/libslic3r/PrintConfig.cpp:1454 msgid "" "This is the acceleration your printer will use for solid infill. Set zero to " "use the value for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:2977 +#: src/libslic3r/PrintConfig.cpp:2990 +msgid "Top solid infill" +msgstr "Farciment sòlid superior" + +#: src/libslic3r/PrintConfig.cpp:1463 msgid "" "This is the acceleration your printer will use for top solid infill. Set " "zero to use the value for solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1426 +#: src/libslic3r/PrintConfig.cpp:1472 msgid "Combine infill every" msgstr "Combinar el farciment cada" -#: src/libslic3r/PrintConfig.cpp:1428 +#: src/libslic3r/PrintConfig.cpp:1474 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." @@ -12483,15 +14329,15 @@ msgstr "" "mitjançant l'extrusió de capes de farciment més gruixudes alhora que es " "preserven els fins perímetres i, per tant, la precisió." -#: src/libslic3r/PrintConfig.cpp:1431 +#: src/libslic3r/PrintConfig.cpp:1477 msgid "Combine infill every n layers" msgstr "Combinar el farciment cada n capes" -#: src/libslic3r/PrintConfig.cpp:1437 +#: src/libslic3r/PrintConfig.cpp:1483 msgid "Length of the infill anchor" msgstr "Longitud del farciment de l'ancoratge" -#: src/libslic3r/PrintConfig.cpp:1439 +#: src/libslic3r/PrintConfig.cpp:1485 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -12514,35 +14360,35 @@ msgstr "" "aquest paràmetre a zero per deshabilitar els perímetres d'ancoratge " "connectats a una sola línia de farciment." -#: src/libslic3r/PrintConfig.cpp:1455 +#: src/libslic3r/PrintConfig.cpp:1495 msgid "0 (no open anchors)" msgstr "0 (sense ancoratges oberts)" -#: src/libslic3r/PrintConfig.cpp:1456 src/libslic3r/PrintConfig.cpp:1479 +#: src/libslic3r/PrintConfig.cpp:1496 src/libslic3r/PrintConfig.cpp:1519 msgid "1 mm" msgstr "1 mm" -#: src/libslic3r/PrintConfig.cpp:1457 src/libslic3r/PrintConfig.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:1520 msgid "2 mm" msgstr "2 mm" -#: src/libslic3r/PrintConfig.cpp:1458 src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1498 src/libslic3r/PrintConfig.cpp:1521 msgid "5 mm" msgstr "5 mm" -#: src/libslic3r/PrintConfig.cpp:1459 src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1499 src/libslic3r/PrintConfig.cpp:1522 msgid "10 mm" msgstr "10 mm" -#: src/libslic3r/PrintConfig.cpp:1460 src/libslic3r/PrintConfig.cpp:1483 +#: src/libslic3r/PrintConfig.cpp:1500 src/libslic3r/PrintConfig.cpp:1523 msgid "1000 (unlimited)" msgstr "1000 (il·limitat)" -#: src/libslic3r/PrintConfig.cpp:1465 +#: src/libslic3r/PrintConfig.cpp:1506 msgid "Maximum length of the infill anchor" msgstr "Màxima longitud del farciment de l'ancoratge" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1508 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -12563,19 +14409,19 @@ msgstr "" "infill_amplada, però no més llarga que aquest paràmetre. Definiu aquest " "paràmetre a zero per desactivar l'ancoratge." -#: src/libslic3r/PrintConfig.cpp:1478 +#: src/libslic3r/PrintConfig.cpp:1518 msgid "0 (not anchored)" msgstr "0 (no ancorat)" -#: src/libslic3r/PrintConfig.cpp:1488 +#: src/libslic3r/PrintConfig.cpp:1529 msgid "Infill extruder" msgstr "Extrusor per al farciment" -#: src/libslic3r/PrintConfig.cpp:1490 +#: src/libslic3r/PrintConfig.cpp:1531 msgid "The extruder to use when printing infill." msgstr "L'extrusor que es fa servir quan s'imprimeix farciment." -#: src/libslic3r/PrintConfig.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:1539 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill. If " "left zero, default extrusion width will be used if set, otherwise 1.125 x " @@ -12590,11 +14436,11 @@ msgstr "" "enfortir les seves parts. Si s'expressa com a percentatge (per exemple, " "90%), es calcula sobre l'alçada de la capa." -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1550 msgid "Infill before perimeters" msgstr "Omplir abans que els perímetres" -#: src/libslic3r/PrintConfig.cpp:1510 +#: src/libslic3r/PrintConfig.cpp:1551 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." @@ -12602,11 +14448,11 @@ msgstr "" "Aquesta opció canviarà l'ordre d'impressió dels perímetres i el farciment, " "fent que el darrer sigui el primer." -#: src/libslic3r/PrintConfig.cpp:1515 +#: src/libslic3r/PrintConfig.cpp:1556 msgid "Only infill where needed" msgstr "Només emplenar quan sigui necessari" -#: src/libslic3r/PrintConfig.cpp:1517 +#: src/libslic3r/PrintConfig.cpp:1558 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " @@ -12617,11 +14463,11 @@ msgstr "" "habilitat, ralenteix la generació del codi G degut a les múltiples " "comprovacions involucrades." -#: src/libslic3r/PrintConfig.cpp:1524 +#: src/libslic3r/PrintConfig.cpp:1565 msgid "Infill/perimeters overlap" msgstr "Superposició de farciment/perímetres" -#: src/libslic3r/PrintConfig.cpp:1526 +#: src/libslic3r/PrintConfig.cpp:1567 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -12633,24 +14479,24 @@ msgstr "" "necessari, però la reacció pot causar buits. Si s'expressa com a percentatge " "(exemple: 15%), es calcula sobre l'amplada d'extrusió del perímetre." -#: src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "" "Velocitat per imprimir el farciment intern. Establir a zero per a auto." -#: src/libslic3r/PrintConfig.cpp:1545 +#: src/libslic3r/PrintConfig.cpp:1586 msgid "Inherits profile" msgstr "Hereta el perfil" -#: src/libslic3r/PrintConfig.cpp:1546 +#: src/libslic3r/PrintConfig.cpp:1587 msgid "Name of the profile, from which this profile inherits." msgstr "Nom del perfil des del qual aquest hereta." -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1600 msgid "Interface shells" msgstr "Carcasses d'interfície" -#: src/libslic3r/PrintConfig.cpp:1560 +#: src/libslic3r/PrintConfig.cpp:1601 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " @@ -12660,64 +14506,64 @@ msgstr "" "Útil per a impressions de múltiples extrusores amb materials translúcids o " "material de suport soluble manual." -#: src/libslic3r/PrintConfig.cpp:1568 +#: src/libslic3r/PrintConfig.cpp:1609 msgid "Maximum width of a segmented region" msgstr "Amplada màxima d'una regió segmentada" -#: src/libslic3r/PrintConfig.cpp:1569 +#: src/libslic3r/PrintConfig.cpp:1610 msgid "Maximum width of a segmented region. Zero disables this feature." msgstr "" "Amplada màxima d'una regió segmentada. El zero desactiva aquesta funció." -#: src/libslic3r/PrintConfig.cpp:1570 src/libslic3r/PrintConfig.cpp:2189 -#: src/libslic3r/PrintConfig.cpp:2198 +#: src/libslic3r/PrintConfig.cpp:1611 src/libslic3r/PrintConfig.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2228 msgid "mm (zero to disable)" msgstr "mm (zero per inhabilitar)" -#: src/libslic3r/PrintConfig.cpp:1577 +#: src/libslic3r/PrintConfig.cpp:1618 msgid "Enable ironing" msgstr "Activar allisat" -#: src/libslic3r/PrintConfig.cpp:1578 +#: src/libslic3r/PrintConfig.cpp:1619 msgid "" "Enable ironing of the top layers with the hot print head for smooth surface" msgstr "" "Habilitar l'allisat de les capes superiors amb el capçal d'impressió calent " "per obtenir una superfície llisa" -#: src/libslic3r/PrintConfig.cpp:1584 src/libslic3r/PrintConfig.cpp:1586 +#: src/libslic3r/PrintConfig.cpp:1625 src/libslic3r/PrintConfig.cpp:1627 msgid "Ironing Type" msgstr "Tipus d'allisat" -#: src/libslic3r/PrintConfig.cpp:1591 +#: src/libslic3r/PrintConfig.cpp:1629 msgid "All top surfaces" msgstr "Totes les superfícies superiors" -#: src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Topmost surface only" msgstr "Només la superfície superior" -#: src/libslic3r/PrintConfig.cpp:1593 +#: src/libslic3r/PrintConfig.cpp:1631 msgid "All solid surfaces" msgstr "Totes les superfícies sòlides" -#: src/libslic3r/PrintConfig.cpp:1598 +#: src/libslic3r/PrintConfig.cpp:1637 msgid "Flow rate" msgstr "Taxa de flux" -#: src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Percent of a flow rate relative to object's normal layer height." msgstr "Percentatge de flux relatiu a l'alçada normal de la capa de l'objecte." -#: src/libslic3r/PrintConfig.cpp:1608 +#: src/libslic3r/PrintConfig.cpp:1647 msgid "Spacing between ironing passes" msgstr "Separació entre passades d'allisat" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1649 msgid "Distance between ironing lines" msgstr "Distància entre les línies allisades" -#: src/libslic3r/PrintConfig.cpp:1627 +#: src/libslic3r/PrintConfig.cpp:1666 msgid "" "This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can " @@ -12729,11 +14575,11 @@ msgstr "" "en compte que podeu utilitzar variables de marcador de posició per a tots " "els paràmetres de Slic3r, així com [layer_num] i [layer_z]." -#: src/libslic3r/PrintConfig.cpp:1638 +#: src/libslic3r/PrintConfig.cpp:1677 msgid "Supports remaining times" msgstr "Compatible amb temps restants" -#: src/libslic3r/PrintConfig.cpp:1639 +#: src/libslic3r/PrintConfig.cpp:1678 msgid "" "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " "intervals into the G-code to let the firmware show accurate remaining time. " @@ -12745,155 +14591,155 @@ msgstr "" "A partir d'ara només el firmware Prusa i3 MK3 reconeix M73. També el " "firmware i3 MK3 és compatible amb M73 Qxx Sxx per a la manera silenciosa." -#: src/libslic3r/PrintConfig.cpp:1647 +#: src/libslic3r/PrintConfig.cpp:1686 msgid "Supports stealth mode" msgstr "Suporta mode silenciós" -#: src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1687 msgid "The firmware supports stealth mode" msgstr "El firmware suporta el mode silenciós" -#: src/libslic3r/PrintConfig.cpp:1653 +#: src/libslic3r/PrintConfig.cpp:1692 msgid "How to apply limits" msgstr "Com aplicar els límits" -#: src/libslic3r/PrintConfig.cpp:1654 +#: src/libslic3r/PrintConfig.cpp:1693 msgid "Purpose of Machine Limits" msgstr "Propòsit dels Límits Màquina" -#: src/libslic3r/PrintConfig.cpp:1656 +#: src/libslic3r/PrintConfig.cpp:1695 msgid "How to apply the Machine Limits" msgstr "Com aplicar els Límits Màquina" -#: src/libslic3r/PrintConfig.cpp:1661 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "Emit to G-code" msgstr "Emetre a codi G" -#: src/libslic3r/PrintConfig.cpp:1662 +#: src/libslic3r/PrintConfig.cpp:1698 msgid "Use for time estimate" msgstr "Usar per a l'estimació de temps" -#: src/libslic3r/PrintConfig.cpp:1663 +#: src/libslic3r/PrintConfig.cpp:1699 msgid "Ignore" msgstr "Ignorar" -#: src/libslic3r/PrintConfig.cpp:1686 +#: src/libslic3r/PrintConfig.cpp:1723 msgid "Maximum feedrate X" msgstr "Màxima velocitat a X" -#: src/libslic3r/PrintConfig.cpp:1687 +#: src/libslic3r/PrintConfig.cpp:1724 msgid "Maximum feedrate Y" msgstr "Màxima velocitat a Y" -#: src/libslic3r/PrintConfig.cpp:1688 +#: src/libslic3r/PrintConfig.cpp:1725 msgid "Maximum feedrate Z" msgstr "Màxima velocitat a Z" -#: src/libslic3r/PrintConfig.cpp:1689 +#: src/libslic3r/PrintConfig.cpp:1726 msgid "Maximum feedrate E" msgstr "Màxima velocitat a E" -#: src/libslic3r/PrintConfig.cpp:1692 +#: src/libslic3r/PrintConfig.cpp:1729 msgid "Maximum feedrate of the X axis" msgstr "Màxima velocitat a l'eix X" -#: src/libslic3r/PrintConfig.cpp:1693 +#: src/libslic3r/PrintConfig.cpp:1730 msgid "Maximum feedrate of the Y axis" msgstr "Màxima velocitat a l'eix Y" -#: src/libslic3r/PrintConfig.cpp:1694 +#: src/libslic3r/PrintConfig.cpp:1731 msgid "Maximum feedrate of the Z axis" msgstr "Màxima velocitat a l'eix Z" -#: src/libslic3r/PrintConfig.cpp:1695 +#: src/libslic3r/PrintConfig.cpp:1732 msgid "Maximum feedrate of the E axis" msgstr "Màxima velocitat a l'eix E" -#: src/libslic3r/PrintConfig.cpp:1703 +#: src/libslic3r/PrintConfig.cpp:1740 msgid "Maximum acceleration X" msgstr "Màxima acceleració X" -#: src/libslic3r/PrintConfig.cpp:1704 +#: src/libslic3r/PrintConfig.cpp:1741 msgid "Maximum acceleration Y" msgstr "Màxima acceleració Y" -#: src/libslic3r/PrintConfig.cpp:1705 +#: src/libslic3r/PrintConfig.cpp:1742 msgid "Maximum acceleration Z" msgstr "Màxima acceleració Z" -#: src/libslic3r/PrintConfig.cpp:1706 +#: src/libslic3r/PrintConfig.cpp:1743 msgid "Maximum acceleration E" msgstr "Màxima acceleració E" -#: src/libslic3r/PrintConfig.cpp:1709 +#: src/libslic3r/PrintConfig.cpp:1746 msgid "Maximum acceleration of the X axis" msgstr "Màxima acceleració a l'eix X" -#: src/libslic3r/PrintConfig.cpp:1710 +#: src/libslic3r/PrintConfig.cpp:1747 msgid "Maximum acceleration of the Y axis" msgstr "Màxima acceleració a l'eix Y" -#: src/libslic3r/PrintConfig.cpp:1711 +#: src/libslic3r/PrintConfig.cpp:1748 msgid "Maximum acceleration of the Z axis" msgstr "Màxima acceleració a l'eix Z" -#: src/libslic3r/PrintConfig.cpp:1712 +#: src/libslic3r/PrintConfig.cpp:1749 msgid "Maximum acceleration of the E axis" msgstr "Màxima acceleració a l'eix E" -#: src/libslic3r/PrintConfig.cpp:1720 +#: src/libslic3r/PrintConfig.cpp:1757 msgid "Maximum jerk X" msgstr "Màxim jerk X" -#: src/libslic3r/PrintConfig.cpp:1721 +#: src/libslic3r/PrintConfig.cpp:1758 msgid "Maximum jerk Y" msgstr "Màxim jerk Y" -#: src/libslic3r/PrintConfig.cpp:1722 +#: src/libslic3r/PrintConfig.cpp:1759 msgid "Maximum jerk Z" msgstr "Màxim jerk Z" -#: src/libslic3r/PrintConfig.cpp:1723 +#: src/libslic3r/PrintConfig.cpp:1760 msgid "Maximum jerk E" msgstr "Màxim jerk E" -#: src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:1763 msgid "Maximum jerk of the X axis" msgstr "Màxim jerk a l'eix X" -#: src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1764 msgid "Maximum jerk of the Y axis" msgstr "Màxim jerk a l'eix Y" -#: src/libslic3r/PrintConfig.cpp:1728 +#: src/libslic3r/PrintConfig.cpp:1765 msgid "Maximum jerk of the Z axis" msgstr "Màxim jerk a l'eix Z" -#: src/libslic3r/PrintConfig.cpp:1729 +#: src/libslic3r/PrintConfig.cpp:1766 msgid "Maximum jerk of the E axis" msgstr "Màxim jerk a l'eix E" -#: src/libslic3r/PrintConfig.cpp:1739 +#: src/libslic3r/PrintConfig.cpp:1776 msgid "Minimum feedrate when extruding" msgstr "Mínima velocitat en extruir" -#: src/libslic3r/PrintConfig.cpp:1741 +#: src/libslic3r/PrintConfig.cpp:1778 msgid "Minimum feedrate when extruding (M205 S)" msgstr "Mínima velocitat en extruir (M205 S)" -#: src/libslic3r/PrintConfig.cpp:1749 +#: src/libslic3r/PrintConfig.cpp:1786 msgid "Minimum travel feedrate" msgstr "Mínima velocitat de desplaçament" -#: src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:1788 msgid "Minimum travel feedrate (M205 T)" msgstr "Mínima velocitat de desplaçament (M205 T)" -#: src/libslic3r/PrintConfig.cpp:1759 +#: src/libslic3r/PrintConfig.cpp:1796 msgid "Maximum acceleration when extruding" msgstr "Màxima acceleració en extruir" -#: src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1798 msgid "" "Maximum acceleration when extruding (M204 P)\n" "\n" @@ -12905,31 +14751,31 @@ msgstr "" "El tipus de firmware de Marlin (heredat) també s'utilitzarà com a " "acceleració de desplaçament (M204 T)." -#: src/libslic3r/PrintConfig.cpp:1772 +#: src/libslic3r/PrintConfig.cpp:1809 msgid "Maximum acceleration when retracting" msgstr "Maàima acceleracio en retracció" -#: src/libslic3r/PrintConfig.cpp:1774 +#: src/libslic3r/PrintConfig.cpp:1811 msgid "Maximum acceleration when retracting (M204 R)" msgstr "Maàima acceleracio en retracció (M204 R)" -#: src/libslic3r/PrintConfig.cpp:1782 +#: src/libslic3r/PrintConfig.cpp:1819 msgid "Maximum acceleration for travel moves" msgstr "Maàima acceleracio en desplaçaments" -#: src/libslic3r/PrintConfig.cpp:1784 +#: src/libslic3r/PrintConfig.cpp:1821 msgid "Maximum acceleration for travel moves (M204 T)" msgstr "Maàima acceleracio en desplaçaments (M204 T)" -#: src/libslic3r/PrintConfig.cpp:1791 src/libslic3r/PrintConfig.cpp:1800 +#: src/libslic3r/PrintConfig.cpp:1828 src/libslic3r/PrintConfig.cpp:1837 msgid "Max" msgstr "Màx" -#: src/libslic3r/PrintConfig.cpp:1792 +#: src/libslic3r/PrintConfig.cpp:1829 msgid "This setting represents the maximum speed of your fan." msgstr "Esta configuració representa la velocitat màxima del ventilador." -#: src/libslic3r/PrintConfig.cpp:1801 +#: src/libslic3r/PrintConfig.cpp:1838 msgid "" "This is the highest printable layer height for this extruder, used to cap " "the variable layer height and support layer height. Maximum recommended " @@ -12942,11 +14788,11 @@ msgstr "" "d'extrusió per aconseguir una adhesió raonable entre capes. Si s'estableix " "en 0, l'alçada de la capa es limita al 75% del diàmetre del filtre." -#: src/libslic3r/PrintConfig.cpp:1811 +#: src/libslic3r/PrintConfig.cpp:1848 msgid "Max print speed" msgstr "Velocitat màxima d'impressió" -#: src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1849 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " @@ -12957,7 +14803,7 @@ msgstr "" "l'extrusor. Aquesta configuració experimental s'utilitza per establir la " "velocitat d'impressió més alta que voleu permetre." -#: src/libslic3r/PrintConfig.cpp:1822 +#: src/libslic3r/PrintConfig.cpp:1859 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." @@ -12965,11 +14811,11 @@ msgstr "" "Aquesta configuració experimental es fa servir per establir la velocitat " "volumètrica màxima que admet l'extrusor." -#: src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1867 msgid "Max volumetric slope positive" msgstr "Màx. Pendent volumètrica positiva" -#: src/libslic3r/PrintConfig.cpp:1831 +#: src/libslic3r/PrintConfig.cpp:1868 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from lower speed to higher speed. A value of 1.8 mm³/" @@ -12984,15 +14830,15 @@ msgstr "" "d'extrusió de 0,2 mm, taxa d'alimentació de 20 mm/s) a 5,4 mm³/s (taxa " "d'alimentació 60 mm/s) trigarà almenys 2 segons." -#: src/libslic3r/PrintConfig.cpp:1836 src/libslic3r/PrintConfig.cpp:1848 +#: src/libslic3r/PrintConfig.cpp:1873 src/libslic3r/PrintConfig.cpp:1885 msgid "mm³/s²" msgstr "mm³/s²" -#: src/libslic3r/PrintConfig.cpp:1842 +#: src/libslic3r/PrintConfig.cpp:1879 msgid "Max volumetric slope negative" msgstr "Màx. Pendent volumètrica negativa" -#: src/libslic3r/PrintConfig.cpp:1843 +#: src/libslic3r/PrintConfig.cpp:1880 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from higher speed to lower speed. A value of 1.8 mm³/" @@ -13007,17 +14853,17 @@ msgstr "" "d'extrusió de 0,2 mm, taxa d'alimentació de 60 mm/s) a 1,8 mm³/s (taxa " "d'alimentació 20 mm/s) trigarà almenys 2 segons." -#: src/libslic3r/PrintConfig.cpp:1854 src/libslic3r/PrintConfig.cpp:1863 +#: src/libslic3r/PrintConfig.cpp:1891 src/libslic3r/PrintConfig.cpp:1900 msgid "Min" msgstr "Mín" -#: src/libslic3r/PrintConfig.cpp:1855 +#: src/libslic3r/PrintConfig.cpp:1892 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "" "Aquest ajustament representa el PWM mínim que el ventilador necessita per " "funcionar." -#: src/libslic3r/PrintConfig.cpp:1864 +#: src/libslic3r/PrintConfig.cpp:1901 msgid "" "This is the lowest printable layer height for this extruder and limits the " "resolution for variable layer height. Typical values are between 0.05 mm and " @@ -13027,19 +14873,19 @@ msgstr "" "limita la resolució per a l'alçada de la capa variable. Els valors típics " "són entre 0.05 mm i 0.1 mm." -#: src/libslic3r/PrintConfig.cpp:1872 +#: src/libslic3r/PrintConfig.cpp:1909 msgid "Min print speed" msgstr "Velocitat d'impressió mínima" -#: src/libslic3r/PrintConfig.cpp:1873 +#: src/libslic3r/PrintConfig.cpp:1910 msgid "Slic3r will not scale speed down below this speed." msgstr "Slic3r no escalarà la velocitat per sota d'aquesta velocitat." -#: src/libslic3r/PrintConfig.cpp:1880 +#: src/libslic3r/PrintConfig.cpp:1917 msgid "Minimal filament extrusion length" msgstr "Longitud mínima de filament extruït" -#: src/libslic3r/PrintConfig.cpp:1881 +#: src/libslic3r/PrintConfig.cpp:1918 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " @@ -13049,11 +14895,11 @@ msgstr "" "la quantitat especificada de filament a la capa inferior. Per a màquines " "multiextrusores, aquest mínim s'aplica a cada extrusora." -#: src/libslic3r/PrintConfig.cpp:1890 +#: src/libslic3r/PrintConfig.cpp:1927 msgid "Configuration notes" msgstr "Notes de configuració" -#: src/libslic3r/PrintConfig.cpp:1891 +#: src/libslic3r/PrintConfig.cpp:1928 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." @@ -13061,18 +14907,18 @@ msgstr "" "Podeu posar les vostres notes personals aquí. Aquest text s'afegirà al codi " "G com a comentaris." -#: src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:1938 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "" "Aquest és el diàmetre del nozzle del teu extrusor (per exemple: 0.5, 0.35, " "etc.)" -#: src/libslic3r/PrintConfig.cpp:1906 +#: src/libslic3r/PrintConfig.cpp:1943 msgid "Host Type" msgstr "Tipus de host" -#: src/libslic3r/PrintConfig.cpp:1907 +#: src/libslic3r/PrintConfig.cpp:1944 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." @@ -13080,11 +14926,11 @@ msgstr "" "Slic3r pot pujar fitxers de codi G a un host d'impressió. Aquest camp ha de " "contenir el tipus de host." -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:1961 msgid "Only retract when crossing perimeters" msgstr "Només retraure en travessar perímetres" -#: src/libslic3r/PrintConfig.cpp:1930 +#: src/libslic3r/PrintConfig.cpp:1962 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." @@ -13093,21 +14939,17 @@ msgstr "" "perímetres de la capa superior (i, per tant, qualsevol degoteig probablement " "serà invisible)." -#: src/libslic3r/PrintConfig.cpp:1937 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "" "This option will drop the temperature of the inactive extruders to prevent " -"oozing. It will enable a tall skirt automatically and move extruders outside " -"such skirt when changing temperatures." +"oozing. " msgstr "" -"Aquesta opció reduirà la temperatura de les extrusores inactives per evitar " -"el degoteig. Permetrà una faldilla alta automàticament i mourà els extrusors " -"fora de la faldilla quan canviï la temperatura." -#: src/libslic3r/PrintConfig.cpp:1944 +#: src/libslic3r/PrintConfig.cpp:1974 msgid "Output filename format" msgstr "Format del nom del fitxer de sortida" -#: src/libslic3r/PrintConfig.cpp:1945 +#: src/libslic3r/PrintConfig.cpp:1975 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -13118,11 +14960,11 @@ msgstr "" "d'aquesta mostra. Per exemple, [layer_height], [fill_density] etc. " "[input_filename_base]." -#: src/libslic3r/PrintConfig.cpp:1954 +#: src/libslic3r/PrintConfig.cpp:1984 msgid "Detect bridging perimeters" msgstr "Detectar perímetres amb ponts" -#: src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:1986 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." @@ -13130,11 +14972,11 @@ msgstr "" "Opció experimental per ajustar el flux per a sortints (s'usarà el flux del " "pont), per aplicar la velocitat del pont a ells i habilitar el ventilador." -#: src/libslic3r/PrintConfig.cpp:1962 +#: src/libslic3r/PrintConfig.cpp:1992 msgid "Filament parking position" msgstr "Posició d'aparcar el filament" -#: src/libslic3r/PrintConfig.cpp:1963 +#: src/libslic3r/PrintConfig.cpp:1993 msgid "" "Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware." @@ -13143,11 +14985,11 @@ msgstr "" "col·locat quan es descarrega. Això hauria de coincidir amb el valor al " "firmware de la impressora." -#: src/libslic3r/PrintConfig.cpp:1971 +#: src/libslic3r/PrintConfig.cpp:2001 msgid "Extra loading distance" msgstr "Distància de càrrega addicional" -#: src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:2002 msgid "" "When set to zero, the distance the filament is moved from parking position " "during load is exactly the same as it was moved back during unload. When " @@ -13159,12 +15001,12 @@ msgstr "" "fer servir durant la descàrrega. Quan és positiu, es carrega més lluny, si " "és negatiu, el moviment de càrrega és més curt que el de baixada." -#: src/libslic3r/PrintConfig.cpp:1980 src/libslic3r/PrintConfig.cpp:2005 -#: src/libslic3r/PrintConfig.cpp:2019 src/libslic3r/PrintConfig.cpp:2029 +#: src/libslic3r/PrintConfig.cpp:2010 src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2049 src/libslic3r/PrintConfig.cpp:2059 msgid "Perimeters" msgstr "Perímetres" -#: src/libslic3r/PrintConfig.cpp:1981 +#: src/libslic3r/PrintConfig.cpp:2011 msgid "" "This is the acceleration your printer will use for perimeters. Set zero to " "disable acceleration control for perimeters." @@ -13172,24 +15014,24 @@ msgstr "" "Aquesta és l'acceleració que utilitzarà la impressora per als perímetres. " "Estableix zero per inhabilitar el control d'acceleració per als perímetres." -#: src/libslic3r/PrintConfig.cpp:1989 +#: src/libslic3r/PrintConfig.cpp:2019 msgid "" "This is the acceleration your printer will use for external perimeters. Set " "zero to use the value for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1996 +#: src/libslic3r/PrintConfig.cpp:2026 msgid "Perimeter extruder" msgstr "Extrusor per a perímetres" -#: src/libslic3r/PrintConfig.cpp:1998 +#: src/libslic3r/PrintConfig.cpp:2028 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" "L'extrusor que s'utilitza en imprimir perímetres i vora. El primer extrusor " "és 1." -#: src/libslic3r/PrintConfig.cpp:2007 +#: src/libslic3r/PrintConfig.cpp:2037 msgid "" "Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. If " @@ -13204,14 +15046,14 @@ msgstr "" "diàmetre del nozzle. Si s'expressa com a percentatge (per exemple, 200%), es " "calcula sobre l'alçada de la capa." -#: src/libslic3r/PrintConfig.cpp:2021 +#: src/libslic3r/PrintConfig.cpp:2051 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "" "Velocitat per a perímetres (contorns, també coneguts com a carcasses " "verticals). Establir a zero per a automàtic." -#: src/libslic3r/PrintConfig.cpp:2031 +#: src/libslic3r/PrintConfig.cpp:2061 msgid "" "This option sets the number of perimeters to generate for each layer. Note " "that Slic3r may increase this number automatically when it detects sloping " @@ -13224,11 +15066,11 @@ msgstr "" "nombre més gran de perímetres si l'opció Perímetres addicionals està " "habilitada." -#: src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2065 msgid "(minimum)" msgstr "(mínim)" -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "" "If you want to process the output G-code through custom scripts, just list " "their absolute paths here. Separate multiple scripts with a semicolon. " @@ -13242,35 +15084,35 @@ msgstr "" "absoluta al fitxer de codi G com a primer argument, i poden accedir a la " "configuració de configuració de Slic3r llegint les variables d'entorn." -#: src/libslic3r/PrintConfig.cpp:2055 +#: src/libslic3r/PrintConfig.cpp:2085 msgid "Printer type" msgstr "Tipus d'impressora" -#: src/libslic3r/PrintConfig.cpp:2056 +#: src/libslic3r/PrintConfig.cpp:2086 msgid "Type of the printer." msgstr "Tipus d'impressora." -#: src/libslic3r/PrintConfig.cpp:2061 +#: src/libslic3r/PrintConfig.cpp:2091 msgid "Printer notes" msgstr "Notes de la impressora" -#: src/libslic3r/PrintConfig.cpp:2062 +#: src/libslic3r/PrintConfig.cpp:2092 msgid "You can put your notes regarding the printer here." msgstr "Podeu posar les vostres notes sobre la impressora aquí." -#: src/libslic3r/PrintConfig.cpp:2070 +#: src/libslic3r/PrintConfig.cpp:2100 msgid "Printer vendor" msgstr "Fabricant de la impressora" -#: src/libslic3r/PrintConfig.cpp:2071 +#: src/libslic3r/PrintConfig.cpp:2101 msgid "Name of the printer vendor." msgstr "Nom del fabricant de la impressora." -#: src/libslic3r/PrintConfig.cpp:2076 +#: src/libslic3r/PrintConfig.cpp:2106 msgid "Printer variant" msgstr "Model d'impressora" -#: src/libslic3r/PrintConfig.cpp:2077 +#: src/libslic3r/PrintConfig.cpp:2107 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." @@ -13278,38 +15120,38 @@ msgstr "" "Nom del model d'impressora. Per exemple, les variants poden distingir " "diferents diàmetres de nozzle." -#: src/libslic3r/PrintConfig.cpp:2094 +#: src/libslic3r/PrintConfig.cpp:2124 msgid "Raft contact Z distance" msgstr "Distància Z de contacte de la bassa" -#: src/libslic3r/PrintConfig.cpp:2096 +#: src/libslic3r/PrintConfig.cpp:2126 msgid "" "The vertical distance between object and raft. Ignored for soluble interface." msgstr "" "La distància vertical entre l'objecte i la bassa. S'ignora per a la " "interfície soluble." -#: src/libslic3r/PrintConfig.cpp:2103 +#: src/libslic3r/PrintConfig.cpp:2133 msgid "Raft expansion" msgstr "Expansió de la bassa" -#: src/libslic3r/PrintConfig.cpp:2105 +#: src/libslic3r/PrintConfig.cpp:2135 msgid "Expansion of the raft in XY plane for better stability." msgstr "Expansió de la bassa al pla XY per millorar l'estabilitat." -#: src/libslic3r/PrintConfig.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:2142 msgid "First layer density" msgstr "Densitat de la primera capa" -#: src/libslic3r/PrintConfig.cpp:2114 +#: src/libslic3r/PrintConfig.cpp:2144 msgid "Density of the first raft or support layer." msgstr "Densitat de la primera bassa o capa de suport." -#: src/libslic3r/PrintConfig.cpp:2122 +#: src/libslic3r/PrintConfig.cpp:2152 msgid "First layer expansion" msgstr "Expansió de la primera capa" -#: src/libslic3r/PrintConfig.cpp:2124 +#: src/libslic3r/PrintConfig.cpp:2154 msgid "" "Expansion of the first raft or support layer to improve adhesion to print " "bed." @@ -13317,11 +15159,11 @@ msgstr "" "Expansió de la primera bassa o capa de suport per millorar l'adhesió al llit " "d'impressió." -#: src/libslic3r/PrintConfig.cpp:2131 +#: src/libslic3r/PrintConfig.cpp:2161 msgid "Raft layers" msgstr "Capes de bassa" -#: src/libslic3r/PrintConfig.cpp:2133 +#: src/libslic3r/PrintConfig.cpp:2163 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." @@ -13329,11 +15171,11 @@ msgstr "" "L'objecte serà elevat per aquest nombre de capes i es generarà material de " "suport a sota." -#: src/libslic3r/PrintConfig.cpp:2141 +#: src/libslic3r/PrintConfig.cpp:2171 msgid "Slice resolution" msgstr "Resolució de laminat" -#: src/libslic3r/PrintConfig.cpp:2142 +#: src/libslic3r/PrintConfig.cpp:2172 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -13346,11 +15188,11 @@ msgstr "" "renderitzar. Establiu a zero per desactivar qualsevol simplificació i " "utilitzar la resolució completa de l'entrada." -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:2182 msgid "G-code resolution" msgstr "Resolució del codi G" -#: src/libslic3r/PrintConfig.cpp:2153 +#: src/libslic3r/PrintConfig.cpp:2183 msgid "" "Maximum deviation of exported G-code paths from their full resolution " "counterparts. Very high resolution G-code requires huge amount of RAM to " @@ -13368,22 +15210,22 @@ msgstr "" "efecte low poly i com que la reducció del codi G es realitza a cada capa de " "manera independent, es poden produir artefactes visibles." -#: src/libslic3r/PrintConfig.cpp:2164 +#: src/libslic3r/PrintConfig.cpp:2194 msgid "Minimum travel after retraction" msgstr "Distància mínima després de la retracció" -#: src/libslic3r/PrintConfig.cpp:2165 +#: src/libslic3r/PrintConfig.cpp:2195 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "" "La retracció no és activa quan els moviments de desplaçament són més curts " "que aquesta longitud." -#: src/libslic3r/PrintConfig.cpp:2171 +#: src/libslic3r/PrintConfig.cpp:2201 msgid "Retract amount before wipe" msgstr "Quantitat de retracció abans de netejar" -#: src/libslic3r/PrintConfig.cpp:2172 +#: src/libslic3r/PrintConfig.cpp:2202 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." @@ -13391,24 +15233,24 @@ msgstr "" "Amb extrusors bowden, pot ser recomanable fer una retracció ràpida abans de " "realitzar el moviment de neteja." -#: src/libslic3r/PrintConfig.cpp:2179 +#: src/libslic3r/PrintConfig.cpp:2209 msgid "Retract on layer change" msgstr "Retracció en el canvi de capa" -#: src/libslic3r/PrintConfig.cpp:2180 +#: src/libslic3r/PrintConfig.cpp:2210 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "" "Aquest indicador imposa una retracció cada cop que es realitza un moviment Z." -#: src/libslic3r/PrintConfig.cpp:2185 src/libslic3r/PrintConfig.cpp:2193 +#: src/libslic3r/PrintConfig.cpp:2215 src/libslic3r/PrintConfig.cpp:2223 msgid "Length" msgstr "Longitut" -#: src/libslic3r/PrintConfig.cpp:2186 +#: src/libslic3r/PrintConfig.cpp:2216 msgid "Retraction Length" msgstr "Longitud de retracció" -#: src/libslic3r/PrintConfig.cpp:2187 +#: src/libslic3r/PrintConfig.cpp:2217 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " @@ -13418,11 +15260,11 @@ msgstr "" "especificada (la longitud es mesura al filament sense processar, abans que " "entri a l'extrusor)." -#: src/libslic3r/PrintConfig.cpp:2194 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Retraction Length (Toolchange)" msgstr "Longitud de retracció (canvi d'eina)" -#: src/libslic3r/PrintConfig.cpp:2195 +#: src/libslic3r/PrintConfig.cpp:2225 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " @@ -13432,11 +15274,11 @@ msgstr "" "retira en la quantitat especificada (la longitud es mesura al filament sense " "processar, abans que entri a l'extrusor)." -#: src/libslic3r/PrintConfig.cpp:2203 +#: src/libslic3r/PrintConfig.cpp:2233 msgid "Lift Z" msgstr "Aixecar Z" -#: src/libslic3r/PrintConfig.cpp:2204 +#: src/libslic3r/PrintConfig.cpp:2234 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " @@ -13446,15 +15288,15 @@ msgstr "" "una retracció. Quan es fan servir múltiples extrusors , només es considerarà " "la configuració del primer extrusor." -#: src/libslic3r/PrintConfig.cpp:2211 +#: src/libslic3r/PrintConfig.cpp:2241 msgid "Above Z" msgstr "Per sobre de Z" -#: src/libslic3r/PrintConfig.cpp:2212 +#: src/libslic3r/PrintConfig.cpp:2242 msgid "Only lift Z above" msgstr "Només aixecar Z més gran que" -#: src/libslic3r/PrintConfig.cpp:2213 +#: src/libslic3r/PrintConfig.cpp:2243 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " @@ -13464,15 +15306,15 @@ msgstr "" "la Z absoluta especificada. Podeu ajustar aquesta configuració per ometre " "l'aixecament a les primeres capes." -#: src/libslic3r/PrintConfig.cpp:2220 +#: src/libslic3r/PrintConfig.cpp:2250 msgid "Below Z" msgstr "Per sota de Z" -#: src/libslic3r/PrintConfig.cpp:2221 +#: src/libslic3r/PrintConfig.cpp:2251 msgid "Only lift Z below" msgstr "Només aixecar Z menor que" -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2252 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " @@ -13482,11 +15324,11 @@ msgstr "" "la Z absoluta especificada. Podeu ajustar aquesta configuració per limitar " "l'aixecament a les primeres capes." -#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2238 +#: src/libslic3r/PrintConfig.cpp:2260 src/libslic3r/PrintConfig.cpp:2268 msgid "Extra length on restart" msgstr "Longitud addicional en reiniciar" -#: src/libslic3r/PrintConfig.cpp:2231 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." @@ -13494,7 +15336,7 @@ msgstr "" "Quan la retracció es compensa després d'un moviment, l'extrusor necessita " "introduir més filament. Aquest ajustament rarament es necessita." -#: src/libslic3r/PrintConfig.cpp:2239 +#: src/libslic3r/PrintConfig.cpp:2269 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." @@ -13502,20 +15344,20 @@ msgstr "" "Quan la retracció es compensa després de canviar l'eina, l'extrusor " "empenyerà aquesta quantitat addicional de filament." -#: src/libslic3r/PrintConfig.cpp:2246 src/libslic3r/PrintConfig.cpp:2247 +#: src/libslic3r/PrintConfig.cpp:2276 src/libslic3r/PrintConfig.cpp:2277 msgid "Retraction Speed" msgstr "Velocitat de retracció" -#: src/libslic3r/PrintConfig.cpp:2248 +#: src/libslic3r/PrintConfig.cpp:2278 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "" "La velocitat per a les retraccions (només s'aplica al motor de l'extrusor)." -#: src/libslic3r/PrintConfig.cpp:2254 src/libslic3r/PrintConfig.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:2284 src/libslic3r/PrintConfig.cpp:2285 msgid "Deretraction Speed" msgstr "Velocitat de detracció" -#: src/libslic3r/PrintConfig.cpp:2256 +#: src/libslic3r/PrintConfig.cpp:2286 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " @@ -13525,70 +15367,84 @@ msgstr "" "(només s'aplica al motor de l'extrusor). Si es deixa a zero, es fa servir la " "velocitat de retracció." -#: src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2293 msgid "Seam position" msgstr "Posició de costura" -#: src/libslic3r/PrintConfig.cpp:2265 +#: src/libslic3r/PrintConfig.cpp:2295 msgid "Position of perimeters starting points." msgstr "Posició dels punts d'inici del perímetre." -#: src/libslic3r/PrintConfig.cpp:2272 +#: src/libslic3r/PrintConfig.cpp:2297 +msgid "Random" +msgstr "Aleatori" + +#: src/libslic3r/PrintConfig.cpp:2298 msgid "Nearest" msgstr "Més proper" -#: src/libslic3r/PrintConfig.cpp:2273 +#: src/libslic3r/PrintConfig.cpp:2299 msgid "Aligned" msgstr "Alineat" -#: src/libslic3r/PrintConfig.cpp:2281 +#: src/libslic3r/PrintConfig.cpp:2306 +msgid "Staggered inner seams" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2307 +msgid "" +"This option causes the inner seams to be shifted backwards based on their " +"depth, forming a zigzag pattern." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2314 msgid "Direction" msgstr "Direcció" -#: src/libslic3r/PrintConfig.cpp:2283 +#: src/libslic3r/PrintConfig.cpp:2316 msgid "Preferred direction of the seam" msgstr "Direcció preferida de la costura" -#: src/libslic3r/PrintConfig.cpp:2284 +#: src/libslic3r/PrintConfig.cpp:2317 msgid "Seam preferred direction" msgstr "Direcció preferida de la costura" -#: src/libslic3r/PrintConfig.cpp:2291 +#: src/libslic3r/PrintConfig.cpp:2324 msgid "Jitter" msgstr "Jitter" -#: src/libslic3r/PrintConfig.cpp:2293 +#: src/libslic3r/PrintConfig.cpp:2326 msgid "Seam preferred direction jitter" msgstr "Direcció preferida d'unió jitter" -#: src/libslic3r/PrintConfig.cpp:2294 +#: src/libslic3r/PrintConfig.cpp:2327 msgid "Preferred direction of the seam - jitter" msgstr "Direcció preferida de la unió - jitter" -#: src/libslic3r/PrintConfig.cpp:2301 +#: src/libslic3r/PrintConfig.cpp:2334 msgid "Distance from brim/object" msgstr "Distància de la vora/objecte" -#: src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2335 msgid "" "Distance between skirt and brim (when draft shield is not used) or objects." msgstr "" "Distància entre la faldilla i la vora (quan no es fa servir el protector " "contra corrents d'aire) o objectes." -#: src/libslic3r/PrintConfig.cpp:2308 +#: src/libslic3r/PrintConfig.cpp:2341 msgid "Skirt height" msgstr "Alçada de la faldilla" -#: src/libslic3r/PrintConfig.cpp:2309 +#: src/libslic3r/PrintConfig.cpp:2342 msgid "Height of skirt expressed in layers." msgstr "Alçada de la faldilla expressada en capes." -#: src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2348 msgid "Draft shield" msgstr "Escut de protecció" -#: src/libslic3r/PrintConfig.cpp:2316 +#: src/libslic3r/PrintConfig.cpp:2349 msgid "" "With draft shield active, the skirt will be printed skirt_distance from the " "object, possibly intersecting brim.\n" @@ -13604,27 +15460,27 @@ msgstr "" "Això és útil per protegir una impressió ABS o ASA perquè no es deformi i es " "desprengui del llit d'impressió a causa dels corrents d'aire." -#: src/libslic3r/PrintConfig.cpp:2324 +#: src/libslic3r/PrintConfig.cpp:2354 msgid "Disabled" msgstr "Deshabilitat" -#: src/libslic3r/PrintConfig.cpp:2325 +#: src/libslic3r/PrintConfig.cpp:2355 msgid "Limited" msgstr "Limitat" -#: src/libslic3r/PrintConfig.cpp:2326 +#: src/libslic3r/PrintConfig.cpp:2356 msgid "Enabled" msgstr "Habilitat" -#: src/libslic3r/PrintConfig.cpp:2331 +#: src/libslic3r/PrintConfig.cpp:2362 msgid "Loops (minimum)" msgstr "Bucles (mínim)" -#: src/libslic3r/PrintConfig.cpp:2332 +#: src/libslic3r/PrintConfig.cpp:2363 msgid "Skirt Loops" msgstr "Voltes de la faldilla" -#: src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2364 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " @@ -13634,12 +15490,12 @@ msgstr "" "d'Extrusió, el nombre de bucles pot ser més gran que el configurat aquí. " "Ajusteu això a zero per deshabilitar la faldilla del tot." -#: src/libslic3r/PrintConfig.cpp:2341 +#: src/libslic3r/PrintConfig.cpp:2372 msgid "Slow down if layer print time is below" msgstr "" "Disminuir la velocitat si el temps d'impressió de la capa està per sota" -#: src/libslic3r/PrintConfig.cpp:2342 +#: src/libslic3r/PrintConfig.cpp:2373 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." @@ -13648,11 +15504,11 @@ msgstr "" "segons, la velocitat dels moviments d'impressió s'ha de reduir per estendre " "la durada a aquest valor." -#: src/libslic3r/PrintConfig.cpp:2351 +#: src/libslic3r/PrintConfig.cpp:2382 msgid "Small perimeters" msgstr "Petits perímetres" -#: src/libslic3r/PrintConfig.cpp:2353 +#: src/libslic3r/PrintConfig.cpp:2384 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " @@ -13663,11 +15519,11 @@ msgstr "" "exemple: 80%), es calcularà a la configuració de velocitat de perímetres " "anterior. Establir a zero per a automàtic." -#: src/libslic3r/PrintConfig.cpp:2363 +#: src/libslic3r/PrintConfig.cpp:2394 msgid "Solid infill threshold area" msgstr "Àrea del llindar de farciment sòlid" -#: src/libslic3r/PrintConfig.cpp:2365 +#: src/libslic3r/PrintConfig.cpp:2396 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." @@ -13675,23 +15531,23 @@ msgstr "" "Forçar el farciment sòlid per a les regions que tenen una àrea més petita " "que el llindar especificat." -#: src/libslic3r/PrintConfig.cpp:2366 +#: src/libslic3r/PrintConfig.cpp:2397 msgid "mm²" msgstr "mm²" -#: src/libslic3r/PrintConfig.cpp:2372 +#: src/libslic3r/PrintConfig.cpp:2403 msgid "Solid infill extruder" msgstr "Extrusora de farciment sòlid" -#: src/libslic3r/PrintConfig.cpp:2374 +#: src/libslic3r/PrintConfig.cpp:2405 msgid "The extruder to use when printing solid infill." msgstr "L'extrusora que s'utilitzarà quan s'imprimeixi el farciment sòlid." -#: src/libslic3r/PrintConfig.cpp:2380 +#: src/libslic3r/PrintConfig.cpp:2411 msgid "Solid infill every" msgstr "Farciment sòlid cada" -#: src/libslic3r/PrintConfig.cpp:2382 +#: src/libslic3r/PrintConfig.cpp:2413 msgid "" "This feature allows to force a solid layer every given number of layers. " "Zero to disable. You can set this to any value (for example 9999); Slic3r " @@ -13704,7 +15560,7 @@ msgstr "" "possible de capes per combinar segons el diàmetre del filtre i l'alçada de " "la capa." -#: src/libslic3r/PrintConfig.cpp:2394 +#: src/libslic3r/PrintConfig.cpp:2425 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "solid surfaces. If left zero, default extrusion width will be used if set, " @@ -13717,7 +15573,7 @@ msgstr "" "diàmetre del nozzle. Si s'expressa com a percentatge (per exemple, 90%), es " "calcula sobre l'alçada de la capa." -#: src/libslic3r/PrintConfig.cpp:2406 +#: src/libslic3r/PrintConfig.cpp:2437 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " @@ -13728,20 +15584,20 @@ msgstr "" "exemple: 80%) sobre la velocitat de farciment anterior. Establir a zero per " "a automàtic." -#: src/libslic3r/PrintConfig.cpp:2418 +#: src/libslic3r/PrintConfig.cpp:2449 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "" "Nombre de capes sòlides per generar a les superfícies superior i inferior." -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2455 src/libslic3r/PrintConfig.cpp:2456 msgid "Minimum thickness of a top / bottom shell" msgstr "Gruix mínim d'una carcassa superior / inferior" -#: src/libslic3r/PrintConfig.cpp:2431 +#: src/libslic3r/PrintConfig.cpp:2462 msgid "Spiral vase" msgstr "Gerro espiral" -#: src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2463 msgid "" "This feature will raise Z gradually while printing a single-walled object in " "order to remove any visible seam. This option requires a single perimeter, " @@ -13756,21 +15612,17 @@ msgstr "" "inferiors, així com els bucles de faldilla/bassa. No funcionarà quan " "imprimiu més d'un objecte." -#: src/libslic3r/PrintConfig.cpp:2440 +#: src/libslic3r/PrintConfig.cpp:2471 msgid "Temperature variation" msgstr "Variació de temperatura" -#: src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:2472 msgid "" -"Temperature difference to be applied when an extruder is not active. Enables " -"a full-height \"sacrificial\" skirt on which the nozzles are periodically " -"wiped." +"Temperature difference to be applied when an extruder is not active. The " +"value is not used when 'idle_temperature' in filament settings is defined." msgstr "" -"Diferència de temperatura que s'aplica quan un extrusor no estigui actiu. " -"Activa una faldilla \"de sacrifici\" d'alçada completa en què els filtres es " -"netegen periòdicament." -#: src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2483 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -13790,7 +15642,7 @@ msgstr "" "configuracions de PrusaSlicer, per la qual cosa pots col·locar una comanda " "\"M109 S [first_layer_temperature]\" on vulguis." -#: src/libslic3r/PrintConfig.cpp:2466 +#: src/libslic3r/PrintConfig.cpp:2498 msgid "" "This start procedure is inserted at the beginning, after any printer start " "gcode (and after any toolchange to this filament in case of multi-material " @@ -13814,35 +15666,35 @@ msgstr "" "comanda \"M109 S [first_layer_temperature]\" on vulguis. Si teniu diverses " "extrusors, el codi G es processa per ordre d'extrusor." -#: src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2514 msgid "Color change G-code" msgstr "Codi G Canvi color" -#: src/libslic3r/PrintConfig.cpp:2483 +#: src/libslic3r/PrintConfig.cpp:2515 msgid "This G-code will be used as a code for the color change" msgstr "Aquest codi G s'utilitzarà com a codi per al canvi de color" -#: src/libslic3r/PrintConfig.cpp:2492 +#: src/libslic3r/PrintConfig.cpp:2524 msgid "This G-code will be used as a code for the pause print" msgstr "Aquest codi G s'utilitzarà com a codi per a la pausa d'impressió" -#: src/libslic3r/PrintConfig.cpp:2501 +#: src/libslic3r/PrintConfig.cpp:2533 msgid "This G-code will be used as a custom code" msgstr "Aquest codi G s'utilitzarà com a codi personalitzat" -#: src/libslic3r/PrintConfig.cpp:2509 +#: src/libslic3r/PrintConfig.cpp:2541 msgid "Single Extruder Multi Material" msgstr "Extrusor únic de múltiples materials" -#: src/libslic3r/PrintConfig.cpp:2510 +#: src/libslic3r/PrintConfig.cpp:2542 msgid "The printer multiplexes filaments into a single hot end." msgstr "La impressora multiplexa els filaments en un sol fusor." -#: src/libslic3r/PrintConfig.cpp:2515 +#: src/libslic3r/PrintConfig.cpp:2547 msgid "Prime all printing extruders" msgstr "Cebar tots els extrusors d'impressió" -#: src/libslic3r/PrintConfig.cpp:2516 +#: src/libslic3r/PrintConfig.cpp:2548 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." @@ -13850,11 +15702,11 @@ msgstr "" "Si està habilitat, tots els extrusors d'impressió estaran cebats a la vora " "frontal del llit d'impressió al començament de la impressió." -#: src/libslic3r/PrintConfig.cpp:2521 +#: src/libslic3r/PrintConfig.cpp:2553 msgid "No sparse layers (EXPERIMENTAL)" msgstr "Sense capes disperses (EXPERIMENTAL)" -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2554 msgid "" "If enabled, the wipe tower will not be printed on layers with no " "toolchanges. On layers with a toolchange, extruder will travel downward to " @@ -13866,11 +15718,11 @@ msgstr "" "imprimir la torre de neteja. L'usuari és responsable de garantir que no hi " "hagi col·lisió amb la impressió." -#: src/libslic3r/PrintConfig.cpp:2529 +#: src/libslic3r/PrintConfig.cpp:2561 msgid "Slice gap closing radius" msgstr "Radi de tancament dels buits en laminar" -#: src/libslic3r/PrintConfig.cpp:2531 +#: src/libslic3r/PrintConfig.cpp:2563 msgid "" "Cracks smaller than 2x gap closing radius are being filled during the " "triangle mesh slicing. The gap closing operation may reduce the final print " @@ -13881,11 +15733,11 @@ msgstr "" "pot reduir la resolució de la impressió, per tant, és aconsellable mantenir " "aquest valor raonablement baix." -#: src/libslic3r/PrintConfig.cpp:2539 +#: src/libslic3r/PrintConfig.cpp:2571 msgid "Slicing Mode" msgstr "Mode de laminat" -#: src/libslic3r/PrintConfig.cpp:2541 +#: src/libslic3r/PrintConfig.cpp:2573 msgid "" "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " "close all holes in the model." @@ -13893,31 +15745,31 @@ msgstr "" "Utilitzeu \"Parell-imparell\" per als models d'avió 3DLabPrint. Utilitzeu " "\"Tancar forats\" per tancar tots els forats del model." -#: src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2575 msgid "Regular" msgstr "Normal" -#: src/libslic3r/PrintConfig.cpp:2547 +#: src/libslic3r/PrintConfig.cpp:2576 msgid "Even-odd" msgstr "Parell-imparell" -#: src/libslic3r/PrintConfig.cpp:2548 +#: src/libslic3r/PrintConfig.cpp:2577 msgid "Close holes" msgstr "Tanca els forats" -#: src/libslic3r/PrintConfig.cpp:2553 +#: src/libslic3r/PrintConfig.cpp:2583 msgid "Generate support material" msgstr "Generar material de suport" -#: src/libslic3r/PrintConfig.cpp:2555 +#: src/libslic3r/PrintConfig.cpp:2585 msgid "Enable support material generation." msgstr "Habilita la generació de material de suport." -#: src/libslic3r/PrintConfig.cpp:2559 +#: src/libslic3r/PrintConfig.cpp:2589 msgid "Auto generated supports" msgstr "Suports generats automàticament" -#: src/libslic3r/PrintConfig.cpp:2561 +#: src/libslic3r/PrintConfig.cpp:2591 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " @@ -13927,11 +15779,11 @@ msgstr "" "llindar de voladís. Si no se selecciona, els suports es generaran només dins " "dels volums \"Forçat de Suports\"." -#: src/libslic3r/PrintConfig.cpp:2567 +#: src/libslic3r/PrintConfig.cpp:2597 msgid "XY separation between an object and its support" msgstr "Separació XY entre un objecte i el seu suport" -#: src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2599 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." @@ -13939,11 +15791,11 @@ msgstr "" "Separació XY entre un objecte i el suport. Si s'expressa com a percentatge " "(per exemple 50%), es calcula sobre l'amplada del perímetre extern." -#: src/libslic3r/PrintConfig.cpp:2580 +#: src/libslic3r/PrintConfig.cpp:2610 msgid "Pattern angle" msgstr "Angle del patró" -#: src/libslic3r/PrintConfig.cpp:2582 +#: src/libslic3r/PrintConfig.cpp:2612 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." @@ -13951,7 +15803,7 @@ msgstr "" "Utilitzeu aquesta opció per girar el patró de material de suport en el pla " "horitzontal." -#: src/libslic3r/PrintConfig.cpp:2592 src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:2622 src/libslic3r/PrintConfig.cpp:3411 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -13959,11 +15811,11 @@ msgstr "" "Només crear suports si està en contacte amb la plataforma. No crea suport a " "la impressió." -#: src/libslic3r/PrintConfig.cpp:2598 +#: src/libslic3r/PrintConfig.cpp:2627 msgid "Top contact Z distance" msgstr "Distància Z de contacte superior" -#: src/libslic3r/PrintConfig.cpp:2600 +#: src/libslic3r/PrintConfig.cpp:2629 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " @@ -13973,23 +15825,23 @@ msgstr "" "suport. Establir això a 0 també evitarà que Slic3r utilitzi el flux i la " "velocitat del pont per a la primera capa dels objectes." -#: src/libslic3r/PrintConfig.cpp:2608 +#: src/libslic3r/PrintConfig.cpp:2635 msgid "0 (soluble)" msgstr "0 (soluble)" -#: src/libslic3r/PrintConfig.cpp:2609 +#: src/libslic3r/PrintConfig.cpp:2636 msgid "0.1 (detachable)" msgstr "0.1 (desmuntable)" -#: src/libslic3r/PrintConfig.cpp:2610 +#: src/libslic3r/PrintConfig.cpp:2637 msgid "0.2 (detachable)" msgstr "0.2 (desmuntable)" -#: src/libslic3r/PrintConfig.cpp:2616 +#: src/libslic3r/PrintConfig.cpp:2643 msgid "Bottom contact Z distance" msgstr "Distància Z del contacte inferior" -#: src/libslic3r/PrintConfig.cpp:2618 +#: src/libslic3r/PrintConfig.cpp:2645 msgid "" "The vertical distance between the object top surface and the support " "material interface. If set to zero, support_material_contact_distance will " @@ -13999,17 +15851,15 @@ msgstr "" "suport. Establir això a 0 també evitarà que Slic3r utilitzi el flux i la " "velocitat del pont per a la primera capa dels objectes." -#. TRN To be shown in Print Settings "Bottom contact Z distance". Have to be as short as possible -#. TRN To be shown in Print Settings "Bottom interface layers". Have to be as short as possible -#: src/libslic3r/PrintConfig.cpp:2626 src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2651 src/libslic3r/PrintConfig.cpp:2732 msgid "Same as top" msgstr "Igual que la part superior" -#: src/libslic3r/PrintConfig.cpp:2633 +#: src/libslic3r/PrintConfig.cpp:2659 msgid "Enforce support for the first" msgstr "Forçar suports per a la/les primera/es" -#: src/libslic3r/PrintConfig.cpp:2635 +#: src/libslic3r/PrintConfig.cpp:2661 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -14022,15 +15872,15 @@ msgstr "" "obtenir una major adhesió dels objectes que tenen una superfície molt prima " "o complicada a la plataforma." -#: src/libslic3r/PrintConfig.cpp:2640 +#: src/libslic3r/PrintConfig.cpp:2666 msgid "Enforce support for the first n layers" msgstr "Força suports per a les primeres n capes" -#: src/libslic3r/PrintConfig.cpp:2646 +#: src/libslic3r/PrintConfig.cpp:2672 msgid "Support material/raft/skirt extruder" msgstr "Extrusor per al material de suport/faldilla/bassa" -#: src/libslic3r/PrintConfig.cpp:2648 +#: src/libslic3r/PrintConfig.cpp:2674 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." @@ -14038,7 +15888,7 @@ msgstr "" "L'extrusor que s'utilitza per imprimir material de suport, bassa i faldilla " "(1+, 0 per utilitzar l'extrusora actual per minimitzar els canvis d'eines)." -#: src/libslic3r/PrintConfig.cpp:2657 +#: src/libslic3r/PrintConfig.cpp:2683 msgid "" "Set this to a non-zero value to set a manual extrusion width for support " "material. If left zero, default extrusion width will be used if set, " @@ -14051,22 +15901,22 @@ msgstr "" "filtre. Si s'expressa com a percentatge (per exemple, 90%), es calcula sobre " "l'alçada de la capa." -#: src/libslic3r/PrintConfig.cpp:2667 +#: src/libslic3r/PrintConfig.cpp:2693 msgid "Interface loops" msgstr "Bucles d'interfície" -#: src/libslic3r/PrintConfig.cpp:2669 +#: src/libslic3r/PrintConfig.cpp:2695 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" "Cobrir la capa de contacte superior dels suports amb bucles. Desactivat per " "defecte." -#: src/libslic3r/PrintConfig.cpp:2674 +#: src/libslic3r/PrintConfig.cpp:2700 msgid "Support material/raft interface extruder" msgstr "Extrusor per al material de suport o bassa" -#: src/libslic3r/PrintConfig.cpp:2676 +#: src/libslic3r/PrintConfig.cpp:2702 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." @@ -14075,11 +15925,11 @@ msgstr "" "(1+, 0 per utilitzar l'extrusora actual per minimitzar els canvis d'eines). " "Això també afecta la bassa." -#: src/libslic3r/PrintConfig.cpp:2684 +#: src/libslic3r/PrintConfig.cpp:2709 msgid "Top interface layers" msgstr "Capes superiors de la interfície" -#: src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2711 msgid "" "Number of interface layers to insert between the object(s) and support " "material." @@ -14087,27 +15937,27 @@ msgstr "" "Nombre de capes d'interfície a inserir entre els objectes i el material de " "suport." -#: src/libslic3r/PrintConfig.cpp:2693 +#: src/libslic3r/PrintConfig.cpp:2715 src/libslic3r/PrintConfig.cpp:2733 msgid "0 (off)" msgstr "0 (desactivat)" -#: src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2716 src/libslic3r/PrintConfig.cpp:2734 msgid "1 (light)" msgstr "1 (lleuger)" -#: src/libslic3r/PrintConfig.cpp:2695 +#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2735 msgid "2 (default)" msgstr "2 (per defecte)" -#: src/libslic3r/PrintConfig.cpp:2696 +#: src/libslic3r/PrintConfig.cpp:2718 src/libslic3r/PrintConfig.cpp:2736 msgid "3 (heavy)" msgstr "3 (pesat)" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:2724 msgid "Bottom interface layers" msgstr "Capes de la interfície inferior" -#: src/libslic3r/PrintConfig.cpp:2704 +#: src/libslic3r/PrintConfig.cpp:2726 msgid "" "Number of interface layers to insert between the object(s) and support " "material. Set to -1 to use support_material_interface_layers" @@ -14115,11 +15965,11 @@ msgstr "" "Nombre de capes d'interfície a inserir entre els objectes i el material de " "suport. Estableix a -1 per utilitzar support_material_interface_layers" -#: src/libslic3r/PrintConfig.cpp:2717 +#: src/libslic3r/PrintConfig.cpp:2742 msgid "Closing radius" msgstr "Radi de tancament" -#: src/libslic3r/PrintConfig.cpp:2719 +#: src/libslic3r/PrintConfig.cpp:2744 msgid "" "For snug supports, the support regions will be merged using morphological " "closing operation. Gaps smaller than the closing radius will be filled in." @@ -14128,17 +15978,21 @@ msgstr "" "mitjançant l'operació de tancament morfològic. Els buits menors que el radi " "de tancament s'han d'emplenar." -#: src/libslic3r/PrintConfig.cpp:2727 +#: src/libslic3r/PrintConfig.cpp:2752 msgid "Interface pattern spacing" msgstr "Separació de patró d'interfície" -#: src/libslic3r/PrintConfig.cpp:2729 +#: src/libslic3r/PrintConfig.cpp:2754 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" "Separació entre línies interfície. Establiu zero per obtenir una interfície " "sòlida." -#: src/libslic3r/PrintConfig.cpp:2738 +#: src/libslic3r/PrintConfig.cpp:2761 +msgid "Support material interface" +msgstr "Interfície de material de suport" + +#: src/libslic3r/PrintConfig.cpp:2763 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " @@ -14148,23 +16002,23 @@ msgstr "" "s'expressa com a percentatge (per exemple, 50%), es calcula sobre la " "velocitat del material de suport." -#: src/libslic3r/PrintConfig.cpp:2747 +#: src/libslic3r/PrintConfig.cpp:2772 msgid "Pattern" msgstr "Patró" -#: src/libslic3r/PrintConfig.cpp:2749 +#: src/libslic3r/PrintConfig.cpp:2774 msgid "Pattern used to generate support material." msgstr "Patró utilitzat per generar material de suport." -#: src/libslic3r/PrintConfig.cpp:2755 +#: src/libslic3r/PrintConfig.cpp:2777 msgid "Rectilinear grid" msgstr "Quadrícula rectilínia" -#: src/libslic3r/PrintConfig.cpp:2761 +#: src/libslic3r/PrintConfig.cpp:2784 msgid "Interface pattern" msgstr "Patró de la interfície" -#: src/libslic3r/PrintConfig.cpp:2763 +#: src/libslic3r/PrintConfig.cpp:2786 msgid "" "Pattern used to generate support material interface. Default pattern for non-" "soluble support interface is Rectilinear, while default pattern for soluble " @@ -14174,23 +16028,19 @@ msgstr "" "per defecte per a la interfície de suport no soluble és Rectilini, mentre " "que el patró per defecte per a la interfície de suport soluble és Concèntric." -#: src/libslic3r/PrintConfig.cpp:2777 +#: src/libslic3r/PrintConfig.cpp:2798 msgid "Pattern spacing" msgstr "Espaiat de patrons" -#: src/libslic3r/PrintConfig.cpp:2779 +#: src/libslic3r/PrintConfig.cpp:2800 msgid "Spacing between support material lines." msgstr "Espaiat entre línies de material de suport." -#: src/libslic3r/PrintConfig.cpp:2788 +#: src/libslic3r/PrintConfig.cpp:2809 msgid "Speed for printing support material." msgstr "Velocitat per imprimir material de suport." -#: src/libslic3r/PrintConfig.cpp:2795 -msgid "Style" -msgstr "Estil" - -#: src/libslic3r/PrintConfig.cpp:2797 +#: src/libslic3r/PrintConfig.cpp:2818 msgid "" "Style and shape of the support towers. Projecting the supports into a " "regular grid will create more stable supports, while snug support towers " @@ -14200,28 +16050,30 @@ msgstr "" "quadrícula normal crearà suports més estables, mentre que les torres de " "suport ajustades estalviaran material i reduiran les cicatrius de l'objecte." -#: src/libslic3r/PrintConfig.cpp:2804 +#: src/libslic3r/PrintConfig.cpp:2823 msgid "Snug" msgstr "Ajustat" -#: src/libslic3r/PrintConfig.cpp:2809 +#: src/libslic3r/PrintConfig.cpp:2824 +msgid "Organic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2830 msgid "Synchronize with object layers" msgstr "Sincronitzar amb les capes de l'objecte" -#: src/libslic3r/PrintConfig.cpp:2811 +#: src/libslic3r/PrintConfig.cpp:2832 msgid "" "Synchronize support layers with the object print layers. This is useful with " -"multi-material printers, where the extruder switch is expensive." +"multi-material printers, where the extruder switch is expensive. This option " +"is only available when top contact Z distance is set to zero." msgstr "" -"Sincronitzar les capes de suport amb les capes d'impressió de l'objecte. " -"Això és útil amb impressores de múltiples materials, on el canvi de " -"l'extrusor és costós." -#: src/libslic3r/PrintConfig.cpp:2817 +#: src/libslic3r/PrintConfig.cpp:2839 msgid "Overhang threshold" msgstr "Llindar de voladura" -#: src/libslic3r/PrintConfig.cpp:2819 +#: src/libslic3r/PrintConfig.cpp:2841 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -14235,11 +16087,11 @@ msgstr "" "del pla horitzontal) que podeu imprimir sense material de suport. Establir a " "zero per a la detecció automàtica (recomanat)." -#: src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2853 msgid "With sheath around the support" msgstr "Amb protecció al voltant del suport" -#: src/libslic3r/PrintConfig.cpp:2833 +#: src/libslic3r/PrintConfig.cpp:2855 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." @@ -14247,7 +16099,72 @@ msgstr "" "Afegir una funda (una sola línia de perímetre) al voltant de la base del " "suport. Això fa el suport més fiable, però també més difícil de retirar." -#: src/libslic3r/PrintConfig.cpp:2840 +#: src/libslic3r/PrintConfig.cpp:2861 +msgid "Maximum Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2863 +msgid "" +"The maximum angle of the branches, when the branches have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle to be able to have more reach." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2872 +msgid "Preferred Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2874 +msgid "" +"The preferred angle of the branches, when they do not have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle for branches to merge faster." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2883 +msgid "Tip Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2885 +msgid "The diameter of the top of the tip of the branches of organic support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2892 +msgid "Branch Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2894 +msgid "" +"The diameter of the thinnest branches of organic support. Thicker branches " +"are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2902 +msgid "Branch Diameter Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2904 +msgid "" +"The angle of the branches' diameter as they gradually become thicker towards " +"the bottom. An angle of 0 will cause the branches to have uniform thickness " +"over their length. A bit of an angle can increase stability of the organic " +"support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2914 +msgid "Branch Density" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2916 +msgid "" +"Adjusts the density of the support structure used to generate the tips of " +"the branches. A higher value results in better overhangs but the supports " +"are harder to remove, thus it is recommended to enable top support " +"interfaces instead of a high branch density value if dense interfaces are " +"needed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2928 msgid "" "Nozzle temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output G-code." @@ -14256,15 +16173,15 @@ msgstr "" "a zero per deshabilitar les comandes de control de temperatura al codi G de " "sortida." -#: src/libslic3r/PrintConfig.cpp:2843 +#: src/libslic3r/PrintConfig.cpp:2931 msgid "Nozzle temperature" msgstr "Temperatura del broquet( nozzle )" -#: src/libslic3r/PrintConfig.cpp:2849 +#: src/libslic3r/PrintConfig.cpp:2937 msgid "Thick bridges" msgstr "Ponts gruixuts" -#: src/libslic3r/PrintConfig.cpp:2851 +#: src/libslic3r/PrintConfig.cpp:2939 msgid "" "If enabled, bridges are more reliable, can bridge longer distances, but may " "look worse. If disabled, bridges look better but are reliable just for " @@ -14274,11 +16191,11 @@ msgstr "" "llargues però poden tenir pitjor aspecte. Si es desactiva, els ponts es " "veuran millor però són fiables només per a distàncies de pont més curtes." -#: src/libslic3r/PrintConfig.cpp:2857 +#: src/libslic3r/PrintConfig.cpp:2945 msgid "Detect thin walls" msgstr "Detecta parets primes" -#: src/libslic3r/PrintConfig.cpp:2859 +#: src/libslic3r/PrintConfig.cpp:2947 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." @@ -14286,11 +16203,11 @@ msgstr "" "Detecta parets d'amplada única (parts on dues extrusions no s'ajusten i les " "hem de col·lapsar en un sol rastre)." -#: src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2953 msgid "Threads" msgstr "Nuclis" -#: src/libslic3r/PrintConfig.cpp:2866 +#: src/libslic3r/PrintConfig.cpp:2954 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." @@ -14298,7 +16215,7 @@ msgstr "" "Els Nuclis son usats per a tasques multirecurs. El nombre òptim de nuclis " "esta lleugerament per sobre el nombre de nuclis/processadors disponibles." -#: src/libslic3r/PrintConfig.cpp:2878 +#: src/libslic3r/PrintConfig.cpp:2966 msgid "" "This custom code is inserted before every toolchange. Placeholder variables " "for all PrusaSlicer settings as well as {toolchange_z}, {previous_extruder} " @@ -14315,7 +16232,7 @@ msgstr "" "tipus. Per tant, és possible programar un comportament personalitzat abans i " "després del canvi d'eina." -#: src/libslic3r/PrintConfig.cpp:2891 +#: src/libslic3r/PrintConfig.cpp:2979 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "top surfaces. You may want to use thinner extrudates to fill all narrow " @@ -14331,7 +16248,7 @@ msgstr "" "s'expressa com a percentatge (per exemple, 90%), es calcula sobre l'alçada " "de la capa." -#: src/libslic3r/PrintConfig.cpp:2904 +#: src/libslic3r/PrintConfig.cpp:2992 msgid "" "Speed for printing top solid layers (it only applies to the uppermost " "external layers and not to their internal solid layers). You may want to " @@ -14345,15 +16262,15 @@ msgstr "" "agradable. Això es pot expressar com un percentatge (per exemple: 80%) sobre " "la velocitat de rebliment sòlid anterior. Establir a zero per a automàtic." -#: src/libslic3r/PrintConfig.cpp:2919 +#: src/libslic3r/PrintConfig.cpp:3007 msgid "Number of solid layers to generate on top surfaces." msgstr "Nombre de capes sòlides a generar a les superfícies superiors." -#: src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3008 msgid "Top solid layers" msgstr "Capes sòlides superiors" -#: src/libslic3r/PrintConfig.cpp:2928 +#: src/libslic3r/PrintConfig.cpp:3016 msgid "" "The number of top solid layers is increased above top_solid_layers if " "necessary to satisfy minimum thickness of top shell. This is useful to " @@ -14364,21 +16281,21 @@ msgstr "" "Això és útil per evitar l'efecte d'aplanament quan s'imprimeix amb alçada de " "capa variable." -#: src/libslic3r/PrintConfig.cpp:2931 +#: src/libslic3r/PrintConfig.cpp:3019 msgid "Minimum top shell thickness" msgstr "Gruix mínim de la carcassa superior" -#: src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:3026 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "" "Velocitat per als moviments de viatge (salts entre punts d'extrusió " "distants)." -#: src/libslic3r/PrintConfig.cpp:2946 +#: src/libslic3r/PrintConfig.cpp:3034 msgid "Z travel" msgstr "Recorregut en Z" -#: src/libslic3r/PrintConfig.cpp:2947 +#: src/libslic3r/PrintConfig.cpp:3035 msgid "" "Speed for movements along the Z axis.\n" "When set to zero, the value is ignored and regular travel speed is used " @@ -14388,11 +16305,11 @@ msgstr "" "Quan s'estableix a zero, el valor s'ignora i s'utilitza la velocitat de " "desplaçament normal al seu lloc." -#: src/libslic3r/PrintConfig.cpp:2955 +#: src/libslic3r/PrintConfig.cpp:3043 msgid "Use firmware retraction" msgstr "Utilitza la retracció del firmware" -#: src/libslic3r/PrintConfig.cpp:2956 +#: src/libslic3r/PrintConfig.cpp:3044 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." @@ -14400,11 +16317,11 @@ msgstr "" "Aquesta configuració experimental utilitza comandes G10 i G11 perquè el " "firmware gestioni la retracció. Això només té suport en els últims Marlin." -#: src/libslic3r/PrintConfig.cpp:2962 +#: src/libslic3r/PrintConfig.cpp:3050 msgid "Use relative E distances" msgstr "Utilitza distàncies E relatives" -#: src/libslic3r/PrintConfig.cpp:2963 +#: src/libslic3r/PrintConfig.cpp:3051 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." @@ -14412,11 +16329,11 @@ msgstr "" "Si el vostre firmware requereix valors E relatius, comproveu-ho, deixeu-lo " "sense marcar. La majoria dels firmwares utilitzen valors absoluts." -#: src/libslic3r/PrintConfig.cpp:2969 +#: src/libslic3r/PrintConfig.cpp:3057 msgid "Use volumetric E" msgstr "Usar E volumètric" -#: src/libslic3r/PrintConfig.cpp:2970 +#: src/libslic3r/PrintConfig.cpp:3058 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -14432,11 +16349,11 @@ msgstr "" "mode volumètric i usar el diàmetre del filament associat al filament " "seleccionat. a Slic3r. Això només s'admet a Marlin recent." -#: src/libslic3r/PrintConfig.cpp:2980 +#: src/libslic3r/PrintConfig.cpp:3068 msgid "Enable variable layer height feature" msgstr "Habilita la característica d'alçada de capa variable" -#: src/libslic3r/PrintConfig.cpp:2981 +#: src/libslic3r/PrintConfig.cpp:3069 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." @@ -14444,11 +16361,11 @@ msgstr "" "Algunes impressores o configuracions d'impressora poden tenir dificultats " "per imprimir amb una alçada de capa variable. Habilitat per defecte." -#: src/libslic3r/PrintConfig.cpp:2987 +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Wipe while retracting" msgstr "Netejar durant retracció" -#: src/libslic3r/PrintConfig.cpp:2988 +#: src/libslic3r/PrintConfig.cpp:3076 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." @@ -14456,7 +16373,7 @@ msgstr "" "Aquest indicador mourà el nozzle durant la retracció per minimitzar " "possibles taques en extrusors amb fugues." -#: src/libslic3r/PrintConfig.cpp:2995 +#: src/libslic3r/PrintConfig.cpp:3083 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." @@ -14465,11 +16382,11 @@ msgstr "" "extrusors en els canvis d'eines. Extrueix l'excés de material a la torre de " "netaja." -#: src/libslic3r/PrintConfig.cpp:3001 +#: src/libslic3r/PrintConfig.cpp:3089 msgid "Purging volumes - load/unload volumes" msgstr "Volum de purga - volum de càrrega/descàrrega" -#: src/libslic3r/PrintConfig.cpp:3002 +#: src/libslic3r/PrintConfig.cpp:3090 msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " @@ -14479,11 +16396,11 @@ msgstr "" "utilitzada a la torre de neteja. Aquests valors es fan servir per " "simplificar la creació dels volums totals de purga més avall." -#: src/libslic3r/PrintConfig.cpp:3008 +#: src/libslic3r/PrintConfig.cpp:3096 msgid "Purging volumes - matrix" msgstr "Volums de purga - matriu" -#: src/libslic3r/PrintConfig.cpp:3009 +#: src/libslic3r/PrintConfig.cpp:3097 msgid "" "This matrix describes volumes (in cubic milimetres) required to purge the " "new filament on the wipe tower for any given pair of tools." @@ -14492,43 +16409,47 @@ msgstr "" "purgar el nou filament de la torre de neteja per a qualsevol parell d'eines " "donades." -#: src/libslic3r/PrintConfig.cpp:3018 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Position X" msgstr "Posició X" -#: src/libslic3r/PrintConfig.cpp:3019 +#: src/libslic3r/PrintConfig.cpp:3107 msgid "X coordinate of the left front corner of a wipe tower" msgstr "Coordenada X de la cantonada frontal esquerra d'una torre de neteja" -#: src/libslic3r/PrintConfig.cpp:3025 +#: src/libslic3r/PrintConfig.cpp:3113 msgid "Position Y" msgstr "Posició Y" -#: src/libslic3r/PrintConfig.cpp:3026 +#: src/libslic3r/PrintConfig.cpp:3114 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "Coordenada Y de la cantonada frontal esquerra d'una torre de neteja" -#: src/libslic3r/PrintConfig.cpp:3033 +#: src/libslic3r/PrintConfig.cpp:3120 +msgid "Width" +msgstr "Amplada" + +#: src/libslic3r/PrintConfig.cpp:3121 msgid "Width of a wipe tower" msgstr "Amplada d'una torre de neteja" -#: src/libslic3r/PrintConfig.cpp:3039 +#: src/libslic3r/PrintConfig.cpp:3127 msgid "Wipe tower rotation angle" msgstr "Angle de rotació de la torre de neteja" -#: src/libslic3r/PrintConfig.cpp:3040 +#: src/libslic3r/PrintConfig.cpp:3128 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "Angle de rotació de la torre de neteja pel que fa a l'eix X." -#: src/libslic3r/PrintConfig.cpp:3046 src/libslic3r/PrintConfig.cpp:3047 +#: src/libslic3r/PrintConfig.cpp:3134 src/libslic3r/PrintConfig.cpp:3135 msgid "Wipe tower brim width" msgstr "Amplada de la bassa de la torre de neteja" -#: src/libslic3r/PrintConfig.cpp:3055 +#: src/libslic3r/PrintConfig.cpp:3143 msgid "Wipe into this object's infill" msgstr "Netejar dins el farciment de l'objecte" -#: src/libslic3r/PrintConfig.cpp:3056 +#: src/libslic3r/PrintConfig.cpp:3144 msgid "" "Purging after toolchange will be done inside this object's infills. This " "lowers the amount of waste but may result in longer print time due to " @@ -14538,11 +16459,11 @@ msgstr "" "objecte. Això redueix la quantitat de residus, però pot donar lloc a més " "temps d'impressió a causa dels moviments de desplaçament addicionals." -#: src/libslic3r/PrintConfig.cpp:3063 +#: src/libslic3r/PrintConfig.cpp:3151 msgid "Wipe into this object" msgstr "Netejar dins l'objecte" -#: src/libslic3r/PrintConfig.cpp:3064 +#: src/libslic3r/PrintConfig.cpp:3152 msgid "" "Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " @@ -14553,19 +16474,19 @@ msgstr "" "disminuir el temps d'impressió. Els colors dels objectes es barrejaran com a " "resultat." -#: src/libslic3r/PrintConfig.cpp:3070 +#: src/libslic3r/PrintConfig.cpp:3158 msgid "Maximal bridging distance" msgstr "Distància màxima de ponts" -#: src/libslic3r/PrintConfig.cpp:3071 +#: src/libslic3r/PrintConfig.cpp:3159 msgid "Maximal distance between supports on sparse infill sections." msgstr "Distància màxima entre suports a les seccions amb farciment lleuger." -#: src/libslic3r/PrintConfig.cpp:3077 +#: src/libslic3r/PrintConfig.cpp:3165 msgid "XY Size Compensation" msgstr "Compensació de mida XY" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3167 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" @@ -14575,11 +16496,11 @@ msgstr "" "cap a dins, positiu = cap a fora). Això podria ser útil per ajustar la mida " "dels orificis." -#: src/libslic3r/PrintConfig.cpp:3087 +#: src/libslic3r/PrintConfig.cpp:3175 msgid "Z offset" msgstr "Desplaçament Z" -#: src/libslic3r/PrintConfig.cpp:3088 +#: src/libslic3r/PrintConfig.cpp:3176 msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " "output G-code. It is used to compensate for bad Z endstop position: for " @@ -14591,11 +16512,11 @@ msgstr "" "exemple, si el teu final de carrera deixa el nozzle a 0.3mm de la base " "d'impressió, ajusta'l a -0.3 (o repara el final de carrera)." -#: src/libslic3r/PrintConfig.cpp:3097 +#: src/libslic3r/PrintConfig.cpp:3185 msgid "Perimeter generator" msgstr "Generador de perímetres" -#: src/libslic3r/PrintConfig.cpp:3099 +#: src/libslic3r/PrintConfig.cpp:3187 msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " @@ -14607,19 +16528,19 @@ msgstr "" "aracne produeix perímetres amb una amplada d'extrusió variable. Aquesta " "configuració també afecta el farciment concèntric." -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3192 msgid "Classic" msgstr "Clàssic" -#: src/libslic3r/PrintConfig.cpp:3107 +#: src/libslic3r/PrintConfig.cpp:3193 msgid "Arachne" msgstr "Aràcne" -#: src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3199 msgid "Perimeter transition length" msgstr "Longitud de transició perimetral" -#: src/libslic3r/PrintConfig.cpp:3114 +#: src/libslic3r/PrintConfig.cpp:3201 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " @@ -14631,11 +16552,11 @@ msgstr "" "unir els segments perimetrals. Si s'expressa en percentatge (per exemple " "100%), es calcularà en funció del diàmetre de la boquilla( nozzle )." -#: src/libslic3r/PrintConfig.cpp:3123 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Perimeter transitioning filter margin" msgstr "Marge de filtre de transició perimetral" -#: src/libslic3r/PrintConfig.cpp:3125 +#: src/libslic3r/PrintConfig.cpp:3212 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -14655,11 +16576,11 @@ msgstr "" "subextrusió o sobreesxtrusió. Si s'expressa en percentatge (per exemple " "25%), es calcularà en funció del diàmetre de la boquilla( nozzle )." -#: src/libslic3r/PrintConfig.cpp:3138 +#: src/libslic3r/PrintConfig.cpp:3225 msgid "Perimeter transitioning threshold angle" msgstr "Angle llindar de transició perimetral" -#: src/libslic3r/PrintConfig.cpp:3140 +#: src/libslic3r/PrintConfig.cpp:3227 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -14673,11 +16594,11 @@ msgstr "" "restant. La reducció d'aquesta configuració redueix el nombre i la longitud " "d'aquests perímetres centrals, però pot deixar buits o sobreesforços." -#: src/libslic3r/PrintConfig.cpp:3151 +#: src/libslic3r/PrintConfig.cpp:3238 msgid "Perimeter distribution count" msgstr "Recompte de distribució perimetral" -#: src/libslic3r/PrintConfig.cpp:3153 +#: src/libslic3r/PrintConfig.cpp:3240 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " @@ -14687,11 +16608,11 @@ msgstr "" "repartir la variació. Els valors més baixos signifiquen que els perímetres " "exteriors no canvien d'amplada." -#: src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3247 msgid "Minimum feature size" msgstr "Mida mínima de la característica" -#: src/libslic3r/PrintConfig.cpp:3162 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " @@ -14705,11 +16626,11 @@ msgstr "" "l'amplada mínima del perímetre. Si s'expressa en percentatge (per exemple " "25%), es calcularà en funció del diàmetre de la boquilla." -#: src/libslic3r/PrintConfig.cpp:3172 +#: src/libslic3r/PrintConfig.cpp:3259 msgid "Minimum perimeter width" msgstr "Amplada perimetral mínima" -#: src/libslic3r/PrintConfig.cpp:3174 +#: src/libslic3r/PrintConfig.cpp:3261 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -14717,69 +16638,241 @@ msgid "" "thick as the feature itself. If expressed as a percentage (for example 85%), " "it will be computed based on the nozzle diameter." msgstr "" -"Amplada del perímetre que substituirà les característiques primes (segons la " -"mida mínima de la característica) del model. Si l'amplada perimetral mínima " -"és més fina que el gruix de la característica, el perímetre es farà tan " -"gruixut com la característica mateixa. Si s'expressa en percentatge (per " -"exemple 85%), es calcularà en funció del diàmetre de la boquilla." +"Amplada del perímetre que substituirà les característiques primes (segons la " +"mida mínima de la característica) del model. Si l'amplada perimetral mínima " +"és més fina que el gruix de la característica, el perímetre es farà tan " +"gruixut com la característica mateixa. Si s'expressa en percentatge (per " +"exemple 85%), es calcularà en funció del diàmetre de la boquilla." + +#: src/libslic3r/PrintConfig.cpp:3327 +msgid "Pinhead front diameter" +msgstr "Diàmetre frontal del cap" + +#: src/libslic3r/PrintConfig.cpp:3329 +msgid "Diameter of the pointing side of the head" +msgstr "Diàmetre de la part en punta del cap" + +#: src/libslic3r/PrintConfig.cpp:3336 +msgid "Head penetration" +msgstr "Penetració del cap" + +#: src/libslic3r/PrintConfig.cpp:3338 +msgid "How much the pinhead has to penetrate the model surface" +msgstr "Quant ha de penetrar el cap del pin a la superfície del model" + +#: src/libslic3r/PrintConfig.cpp:3345 +msgid "Pinhead width" +msgstr "Amplada del cap" + +#: src/libslic3r/PrintConfig.cpp:3347 +msgid "Width from the back sphere center to the front sphere center" +msgstr "" +"Amplada des del centre de l'esfera posterior fins al centre de l'esfera " +"frontal" + +#: src/libslic3r/PrintConfig.cpp:3355 +msgid "Pillar diameter" +msgstr "Diàmetre del pilar" + +#: src/libslic3r/PrintConfig.cpp:3357 +msgid "Diameter in mm of the support pillars" +msgstr "Diàmetre en mm dels pilars de suport" + +#: src/libslic3r/PrintConfig.cpp:3365 +msgid "Small pillar diameter percent" +msgstr "Percentatge de diàmetre de pilar petit" + +#: src/libslic3r/PrintConfig.cpp:3367 +msgid "" +"The percentage of smaller pillars compared to the normal pillar diameter " +"which are used in problematic areas where a normal pilla cannot fit." +msgstr "" +"El percentatge de pilars més petits en comparació del diàmetre de pilar " +"normal que s'utilitzen en àrees problemàtiques on no hi ha cap pilar normal." + +#: src/libslic3r/PrintConfig.cpp:3376 +msgid "Max bridges on a pillar" +msgstr "Ponts màxims en un pilar" + +#: src/libslic3r/PrintConfig.cpp:3378 +msgid "" +"Maximum number of bridges that can be placed on a pillar. Bridges hold " +"support point pinheads and connect to pillars as small branches." +msgstr "" +"Nombre màxim de ponts que es poden col·locar sobre un pilar. Els ponts " +"mantenen els punts de suport i es connecten als pilars com branques petites." + +#: src/libslic3r/PrintConfig.cpp:3386 +msgid "Max weight on model" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3389 +msgid "" +"Maximum weight of sub-trees that terminate on the model instead of the print " +"bed. The weight is the sum of the lenghts of all branches emanating from the " +"endpoint." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3397 +msgid "Pillar connection mode" +msgstr "Mode de connexió del pilar" + +#: src/libslic3r/PrintConfig.cpp:3398 +msgid "" +"Controls the bridge type between two neighboring pillars. Can be zig-zag, " +"cross (double zig-zag) or dynamic which will automatically switch between " +"the first two depending on the distance of the two pillars." +msgstr "" +"Controla el tipus de pont entre dos pilars veïns. Pot ser ziga-zaga, creu " +"(doble ziga-zaga) o dinàmica que canviarà automàticament entre els dos " +"primers en funció de la distància dels dos pilars." + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Zig-Zag" +msgstr "Ziga-Zaga" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Cross" +msgstr "Creu" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Dynamic" +msgstr "Dinàmic" + +#: src/libslic3r/PrintConfig.cpp:3416 +msgid "Pillar widening factor" +msgstr "Factor d'eixamplament del pilar" + +#: src/libslic3r/PrintConfig.cpp:3420 +msgid "" +"Merging bridges or pillars into another pillars can increase the radius. " +"Zero means no increase, one means full increase. The exact amount of " +"increase is unspecified and can change in the future." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3431 +msgid "Support base diameter" +msgstr "Diàmetre de la base de suport" + +#: src/libslic3r/PrintConfig.cpp:3433 +msgid "Diameter in mm of the pillar base" +msgstr "Diàmetre en mm de la base del pilar" + +#: src/libslic3r/PrintConfig.cpp:3441 +msgid "Support base height" +msgstr "Alçada de la base de suport" + +#: src/libslic3r/PrintConfig.cpp:3443 +msgid "The height of the pillar base cone" +msgstr "L'alçada del con de la base d'un pilar" + +#: src/libslic3r/PrintConfig.cpp:3450 +msgid "Support base safety distance" +msgstr "Distància de seguretat de la base de suports" + +#: src/libslic3r/PrintConfig.cpp:3453 +msgid "" +"The minimum distance of the pillar base from the model in mm. Makes sense in " +"zero elevation mode where a gap according to this parameter is inserted " +"between the model and the pad." +msgstr "" +"La distància mínima del model a la base de pilars en mm. Té sentit en el " +"mode de zero elevació on hi ha un buit d'acord quan aquest paràmetre " +"s'introdueix entre el model i el pad." + +#: src/libslic3r/PrintConfig.cpp:3463 +msgid "Critical angle" +msgstr "Angle crític" + +#: src/libslic3r/PrintConfig.cpp:3465 +msgid "The default angle for connecting support sticks and junctions." +msgstr "L'angle per defecte per connectar pals de suport i unions." + +#: src/libslic3r/PrintConfig.cpp:3473 +msgid "Max bridge length" +msgstr "Longitud màxima del pont" + +#: src/libslic3r/PrintConfig.cpp:3475 +msgid "The max length of a bridge" +msgstr "La longitud màxima d'un pont" + +#: src/libslic3r/PrintConfig.cpp:3487 +msgid "Max pillar linking distance" +msgstr "Distància màxima d'enllaç del pilar" + +#: src/libslic3r/PrintConfig.cpp:3489 +msgid "" +"The max distance of two pillars to get linked with each other. A zero value " +"will prohibit pillar cascading." +msgstr "" +"La distància màxima entre dos pilars perquè s'uneixin entre si. Un valor " +"zero prohibirà l'encadenament de pilars." + +#: src/libslic3r/PrintConfig.cpp:3499 +msgid "" +"How much the supports should lift up the supported object. If \"Pad around " +"object\" is enabled, this value is ignored." +msgstr "" +"Quant els suports haurien d'aixecar l'objecte suportat. Si \"Pad al voltant " +"de l'objecte\" està activat, aquest valor serà ignorat." -#: src/libslic3r/PrintConfig.cpp:3242 +#: src/libslic3r/PrintConfig.cpp:3515 msgid "Display width" msgstr "Amplada de la pantalla" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3516 msgid "Width of the display" msgstr "Amplada de la pantalla" -#: src/libslic3r/PrintConfig.cpp:3248 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "Display height" msgstr "Alçada de la pantalla" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3522 msgid "Height of the display" msgstr "Alçada de la pantalla" -#: src/libslic3r/PrintConfig.cpp:3254 +#: src/libslic3r/PrintConfig.cpp:3527 msgid "Number of pixels in" msgstr "Nombre de píxels a" -#: src/libslic3r/PrintConfig.cpp:3256 +#: src/libslic3r/PrintConfig.cpp:3529 msgid "Number of pixels in X" msgstr "Nombre de píxels en X" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3535 msgid "Number of pixels in Y" msgstr "Nombre de píxels en Y" -#: src/libslic3r/PrintConfig.cpp:3267 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Display horizontal mirroring" msgstr "Mirall horitzontal de la pantalla" -#: src/libslic3r/PrintConfig.cpp:3268 +#: src/libslic3r/PrintConfig.cpp:3541 msgid "Mirror horizontally" msgstr "Reflectir horitzontalment" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3542 msgid "Enable horizontal mirroring of output images" msgstr "Activar mirall horitzontal de sortida d'imatges" -#: src/libslic3r/PrintConfig.cpp:3274 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Display vertical mirroring" msgstr "Mirall vertical de la pantalla" -#: src/libslic3r/PrintConfig.cpp:3275 +#: src/libslic3r/PrintConfig.cpp:3548 msgid "Mirror vertically" msgstr "Reflectir verticalment" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "Enable vertical mirroring of output images" msgstr "Activar mirall vertical de sortida d'imatges" -#: src/libslic3r/PrintConfig.cpp:3281 +#: src/libslic3r/PrintConfig.cpp:3554 msgid "Display orientation" msgstr "Orientació de la pantalla" -#: src/libslic3r/PrintConfig.cpp:3282 +#: src/libslic3r/PrintConfig.cpp:3555 msgid "" "Set the actual LCD display orientation inside the SLA printer. Portrait mode " "will flip the meaning of display width and height parameters and the output " @@ -14789,55 +16882,55 @@ msgstr "" "mode retrat canviarà el significat dels paràmetres d'ample i alt de la " "pantalla i les imatges de sortida giraran 90 graus." -#: src/libslic3r/PrintConfig.cpp:3288 +#: src/libslic3r/PrintConfig.cpp:3559 msgid "Landscape" msgstr "Paisatge" -#: src/libslic3r/PrintConfig.cpp:3289 +#: src/libslic3r/PrintConfig.cpp:3560 msgid "Portrait" msgstr "Retrat" -#: src/libslic3r/PrintConfig.cpp:3294 src/libslic3r/PrintConfig.cpp:3929 +#: src/libslic3r/PrintConfig.cpp:3566 src/libslic3r/PrintConfig.cpp:4058 msgid "Fast" msgstr "Ràpida" -#: src/libslic3r/PrintConfig.cpp:3295 +#: src/libslic3r/PrintConfig.cpp:3567 msgid "Fast tilt" msgstr "Inclinació ràpida" -#: src/libslic3r/PrintConfig.cpp:3296 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Time of the fast tilt" msgstr "Tiempo de la inclinación rápida" -#: src/libslic3r/PrintConfig.cpp:3303 src/libslic3r/PrintConfig.cpp:3928 +#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:4057 msgid "Slow" msgstr "Lenta" -#: src/libslic3r/PrintConfig.cpp:3304 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Slow tilt" msgstr "Inclinació lenta" -#: src/libslic3r/PrintConfig.cpp:3305 +#: src/libslic3r/PrintConfig.cpp:3577 msgid "Time of the slow tilt" msgstr "Temps de la inclinació lenta" -#: src/libslic3r/PrintConfig.cpp:3312 src/libslic3r/PrintConfig.cpp:3930 +#: src/libslic3r/PrintConfig.cpp:3584 src/libslic3r/PrintConfig.cpp:4059 msgid "High viscosity" msgstr "Alta viscositat" -#: src/libslic3r/PrintConfig.cpp:3313 +#: src/libslic3r/PrintConfig.cpp:3585 msgid "Tilt for high viscosity resin" msgstr "Inclinació per resina d'alta viscositat" -#: src/libslic3r/PrintConfig.cpp:3314 +#: src/libslic3r/PrintConfig.cpp:3586 msgid "Time of the super slow tilt" msgstr "Temps de la inclinació súper lenta" -#: src/libslic3r/PrintConfig.cpp:3321 +#: src/libslic3r/PrintConfig.cpp:3593 msgid "Area fill" msgstr "Àrea de farciment" -#: src/libslic3r/PrintConfig.cpp:3322 +#: src/libslic3r/PrintConfig.cpp:3594 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -14848,40 +16941,40 @@ msgstr "" "llavors s'utilitzarà una inclinació lenta, en cas contrari - una inclinació " "ràpida" -#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 -#: src/libslic3r/PrintConfig.cpp:3331 +#: src/libslic3r/PrintConfig.cpp:3601 src/libslic3r/PrintConfig.cpp:3602 +#: src/libslic3r/PrintConfig.cpp:3603 msgid "Printer scaling correction" msgstr "Correcció d'escala de la impressora" -#: src/libslic3r/PrintConfig.cpp:3337 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3609 src/libslic3r/PrintConfig.cpp:3611 msgid "Printer scaling correction in X axis" msgstr "Correcció d'escalat de la impressora a l'eix X" -#: src/libslic3r/PrintConfig.cpp:3338 +#: src/libslic3r/PrintConfig.cpp:3610 msgid "Printer scaling X axis correction" msgstr "Correcció de l'eix X d'escalat de la impressora" -#: src/libslic3r/PrintConfig.cpp:3345 src/libslic3r/PrintConfig.cpp:3347 +#: src/libslic3r/PrintConfig.cpp:3617 src/libslic3r/PrintConfig.cpp:3619 msgid "Printer scaling correction in Y axis" msgstr "Correcció d'escalat de la impressora a l'eix Y" -#: src/libslic3r/PrintConfig.cpp:3346 +#: src/libslic3r/PrintConfig.cpp:3618 msgid "Printer scaling Y axis correction" msgstr "Correcció de l'eix X d'escalat de la impressora" -#: src/libslic3r/PrintConfig.cpp:3353 src/libslic3r/PrintConfig.cpp:3355 +#: src/libslic3r/PrintConfig.cpp:3625 src/libslic3r/PrintConfig.cpp:3627 msgid "Printer scaling correction in Z axis" msgstr "Correcció d'escalat de la impressora a l'eix Z" -#: src/libslic3r/PrintConfig.cpp:3354 +#: src/libslic3r/PrintConfig.cpp:3626 msgid "Printer scaling Z axis correction" msgstr "Correcció de l'eix X d'escalat de la impressora" -#: src/libslic3r/PrintConfig.cpp:3361 src/libslic3r/PrintConfig.cpp:3362 +#: src/libslic3r/PrintConfig.cpp:3633 src/libslic3r/PrintConfig.cpp:3634 msgid "Printer absolute correction" msgstr "Correcció absoluta de la impressora" -#: src/libslic3r/PrintConfig.cpp:3363 +#: src/libslic3r/PrintConfig.cpp:3635 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." @@ -14889,22 +16982,22 @@ msgstr "" "Augmentarà o reduirà el nombre de polígons 2D laminats d'acord amb el signe " "de la correcció." -#: src/libslic3r/PrintConfig.cpp:3369 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Elephant foot minimum width" msgstr "Amplada mínima del peu d'elefant" -#: src/libslic3r/PrintConfig.cpp:3371 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" "Amplada mínima de les característiques a mantenir quan es fa una compensació " "del peu d'elefant." -#: src/libslic3r/PrintConfig.cpp:3378 src/libslic3r/PrintConfig.cpp:3379 +#: src/libslic3r/PrintConfig.cpp:3650 src/libslic3r/PrintConfig.cpp:3651 msgid "Printer gamma correction" msgstr "Correcció gamma de la impressora" -#: src/libslic3r/PrintConfig.cpp:3380 +#: src/libslic3r/PrintConfig.cpp:3652 msgid "" "This will apply a gamma correction to the rasterized 2D polygons. A gamma " "value of zero means thresholding with the threshold in the middle. This " @@ -14914,43 +17007,53 @@ msgstr "" "gamma de zero significa que el llindar es troba al mig. Aquest comportament " "elimina l'antialiasing sense perdre forats als polígons." -#: src/libslic3r/PrintConfig.cpp:3399 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3671 src/libslic3r/PrintConfig.cpp:3672 msgid "SLA material type" msgstr "Tipus de material SLA" -#: src/libslic3r/PrintConfig.cpp:3411 src/libslic3r/PrintConfig.cpp:3412 +#: src/libslic3r/PrintConfig.cpp:3679 src/libslic3r/PrintConfig.cpp:3680 msgid "Initial layer height" msgstr "Alçada de la capa inicial" -#: src/libslic3r/PrintConfig.cpp:3418 src/libslic3r/PrintConfig.cpp:3419 +#: src/libslic3r/PrintConfig.cpp:3686 +msgid "Idle temperature" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3687 +msgid "" +"Nozzle temperature when the tool is currently not used in multi-tool setups." +"This is only used when 'Ooze prevention' is active in Print Settings." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3695 src/libslic3r/PrintConfig.cpp:3696 msgid "Bottle volume" msgstr "Volum de l'ampolla" -#: src/libslic3r/PrintConfig.cpp:3420 +#: src/libslic3r/PrintConfig.cpp:3697 msgid "ml" msgstr "ml" -#: src/libslic3r/PrintConfig.cpp:3425 src/libslic3r/PrintConfig.cpp:3426 +#: src/libslic3r/PrintConfig.cpp:3702 src/libslic3r/PrintConfig.cpp:3703 msgid "Bottle weight" msgstr "Pes de l'ampolla" -#: src/libslic3r/PrintConfig.cpp:3427 +#: src/libslic3r/PrintConfig.cpp:3704 msgid "kg" msgstr "kg" -#: src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "g/ml" msgstr "g/ml" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3718 msgid "money/bottle" msgstr "diners/ampolla" -#: src/libslic3r/PrintConfig.cpp:3446 +#: src/libslic3r/PrintConfig.cpp:3723 msgid "Faded layers" msgstr "Capes esvaïdes" -#: src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3724 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" @@ -14958,262 +17061,120 @@ msgstr "" "El nombre de capes necessàries per al temps d'exposició s'esvaeix des del " "temps d'exposició inicial fins al temps d'exposició" -#: src/libslic3r/PrintConfig.cpp:3454 src/libslic3r/PrintConfig.cpp:3455 +#: src/libslic3r/PrintConfig.cpp:3731 src/libslic3r/PrintConfig.cpp:3732 msgid "Minimum exposure time" msgstr "Temps mínim d'exposició" -#: src/libslic3r/PrintConfig.cpp:3462 src/libslic3r/PrintConfig.cpp:3463 +#: src/libslic3r/PrintConfig.cpp:3739 src/libslic3r/PrintConfig.cpp:3740 msgid "Maximum exposure time" msgstr "Temps màxim d'exposició" -#: src/libslic3r/PrintConfig.cpp:3470 src/libslic3r/PrintConfig.cpp:3471 +#: src/libslic3r/PrintConfig.cpp:3747 src/libslic3r/PrintConfig.cpp:3748 msgid "Exposure time" msgstr "Temps d'exposició" -#: src/libslic3r/PrintConfig.cpp:3477 src/libslic3r/PrintConfig.cpp:3478 +#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3755 msgid "Minimum initial exposure time" msgstr "Temps mínim d'exposició inicial" -#: src/libslic3r/PrintConfig.cpp:3485 src/libslic3r/PrintConfig.cpp:3486 +#: src/libslic3r/PrintConfig.cpp:3762 src/libslic3r/PrintConfig.cpp:3763 msgid "Maximum initial exposure time" msgstr "Temps màxim d'exposició inicial" -#: src/libslic3r/PrintConfig.cpp:3493 src/libslic3r/PrintConfig.cpp:3494 +#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3771 msgid "Initial exposure time" msgstr "Temps d'exposició inicial" -#: src/libslic3r/PrintConfig.cpp:3500 src/libslic3r/PrintConfig.cpp:3501 +#: src/libslic3r/PrintConfig.cpp:3777 src/libslic3r/PrintConfig.cpp:3778 msgid "Correction for expansion" msgstr "Correcció per a l'expansió" -#: src/libslic3r/PrintConfig.cpp:3507 src/libslic3r/PrintConfig.cpp:3508 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3785 msgid "Correction for expansion in X axis" msgstr "Correcció per a l'expansió en l'eix X" -#: src/libslic3r/PrintConfig.cpp:3514 src/libslic3r/PrintConfig.cpp:3515 +#: src/libslic3r/PrintConfig.cpp:3791 src/libslic3r/PrintConfig.cpp:3792 msgid "Correction for expansion in Y axis" msgstr "Correcció per a l'expansió en l'eix Y" -#: src/libslic3r/PrintConfig.cpp:3521 src/libslic3r/PrintConfig.cpp:3522 +#: src/libslic3r/PrintConfig.cpp:3798 src/libslic3r/PrintConfig.cpp:3799 msgid "Correction for expansion in Z axis" msgstr "Correcció per a l'expansió en l'eix Z" -#: src/libslic3r/PrintConfig.cpp:3528 +#: src/libslic3r/PrintConfig.cpp:3805 msgid "SLA print material notes" msgstr "Notes de material d'impressió de l'SLA" -#: src/libslic3r/PrintConfig.cpp:3529 +#: src/libslic3r/PrintConfig.cpp:3806 msgid "You can put your notes regarding the SLA print material here." msgstr "" "Podeu posar les vostres notes sobre el material d'impressió de l'SLA aquí." -#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3552 +#: src/libslic3r/PrintConfig.cpp:3818 src/libslic3r/PrintConfig.cpp:3829 msgid "Default SLA material profile" msgstr "Perfil de material de l'SLA per defecte" -#: src/libslic3r/PrintConfig.cpp:3563 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "Generate supports" msgstr "Generar suports" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3842 msgid "Generate supports for the models" msgstr "Generar suports per als models" -#: src/libslic3r/PrintConfig.cpp:3570 -msgid "Pinhead front diameter" -msgstr "Diàmetre frontal del cap" - -#: src/libslic3r/PrintConfig.cpp:3572 -msgid "Diameter of the pointing side of the head" -msgstr "Diàmetre de la part en punta del cap" - -#: src/libslic3r/PrintConfig.cpp:3579 -msgid "Head penetration" -msgstr "Penetració del cap" - -#: src/libslic3r/PrintConfig.cpp:3581 -msgid "How much the pinhead has to penetrate the model surface" -msgstr "Quant ha de penetrar el cap del pin a la superfície del model" - -#: src/libslic3r/PrintConfig.cpp:3588 -msgid "Pinhead width" -msgstr "Amplada del cap" - -#: src/libslic3r/PrintConfig.cpp:3590 -msgid "Width from the back sphere center to the front sphere center" -msgstr "" -"Amplada des del centre de l'esfera posterior fins al centre de l'esfera " -"frontal" - -#: src/libslic3r/PrintConfig.cpp:3598 -msgid "Pillar diameter" -msgstr "Diàmetre del pilar" - -#: src/libslic3r/PrintConfig.cpp:3600 -msgid "Diameter in mm of the support pillars" -msgstr "Diàmetre en mm dels pilars de suport" - -#: src/libslic3r/PrintConfig.cpp:3608 -msgid "Small pillar diameter percent" -msgstr "Percentatge de diàmetre de pilar petit" - -#: src/libslic3r/PrintConfig.cpp:3610 -msgid "" -"The percentage of smaller pillars compared to the normal pillar diameter " -"which are used in problematic areas where a normal pilla cannot fit." -msgstr "" -"El percentatge de pilars més petits en comparació del diàmetre de pilar " -"normal que s'utilitzen en àrees problemàtiques on no hi ha cap pilar normal." - -#: src/libslic3r/PrintConfig.cpp:3619 -msgid "Max bridges on a pillar" -msgstr "Ponts màxims en un pilar" - -#: src/libslic3r/PrintConfig.cpp:3621 -msgid "" -"Maximum number of bridges that can be placed on a pillar. Bridges hold " -"support point pinheads and connect to pillars as small branches." -msgstr "" -"Nombre màxim de ponts que es poden col·locar sobre un pilar. Els ponts " -"mantenen els punts de suport i es connecten als pilars com branques petites." - -#: src/libslic3r/PrintConfig.cpp:3629 -msgid "Pillar connection mode" -msgstr "Mode de connexió del pilar" - -#: src/libslic3r/PrintConfig.cpp:3630 -msgid "" -"Controls the bridge type between two neighboring pillars. Can be zig-zag, " -"cross (double zig-zag) or dynamic which will automatically switch between " -"the first two depending on the distance of the two pillars." +#: src/libslic3r/PrintConfig.cpp:3847 +msgid "Support tree type" msgstr "" -"Controla el tipus de pont entre dos pilars veïns. Pot ser ziga-zaga, creu " -"(doble ziga-zaga) o dinàmica que canviarà automàticament entre els dos " -"primers en funció de la distància dels dos pilars." - -#: src/libslic3r/PrintConfig.cpp:3638 -msgid "Zig-Zag" -msgstr "Ziga-Zaga" - -#: src/libslic3r/PrintConfig.cpp:3639 -msgid "Cross" -msgstr "Creu" - -#: src/libslic3r/PrintConfig.cpp:3640 -msgid "Dynamic" -msgstr "Dinàmic" - -#: src/libslic3r/PrintConfig.cpp:3652 -msgid "Pillar widening factor" -msgstr "Factor d'eixamplament del pilar" -#: src/libslic3r/PrintConfig.cpp:3654 -msgid "" -"Merging bridges or pillars into another pillars can increase the radius. " -"Zero means no increase, one means full increase." +#: src/libslic3r/PrintConfig.cpp:3848 +msgid "Support tree building strategy" msgstr "" -"La fusió de ponts o pilars a altres pilars pot augmentar el radi. Zero vol " -"dir que no hi ha augment, un significa augment total." - -#: src/libslic3r/PrintConfig.cpp:3663 -msgid "Support base diameter" -msgstr "Diàmetre de la base de suport" - -#: src/libslic3r/PrintConfig.cpp:3665 -msgid "Diameter in mm of the pillar base" -msgstr "Diàmetre en mm de la base del pilar" - -#: src/libslic3r/PrintConfig.cpp:3673 -msgid "Support base height" -msgstr "Alçada de la base de suport" - -#: src/libslic3r/PrintConfig.cpp:3675 -msgid "The height of the pillar base cone" -msgstr "L'alçada del con de la base d'un pilar" - -#: src/libslic3r/PrintConfig.cpp:3682 -msgid "Support base safety distance" -msgstr "Distància de seguretat de la base de suports" -#: src/libslic3r/PrintConfig.cpp:3685 -msgid "" -"The minimum distance of the pillar base from the model in mm. Makes sense in " -"zero elevation mode where a gap according to this parameter is inserted " -"between the model and the pad." +#: src/libslic3r/PrintConfig.cpp:3851 +msgid "Branching (experimental)" msgstr "" -"La distància mínima del model a la base de pilars en mm. Té sentit en el " -"mode de zero elevació on hi ha un buit d'acord quan aquest paràmetre " -"s'introdueix entre el model i el pad." - -#: src/libslic3r/PrintConfig.cpp:3695 -msgid "Critical angle" -msgstr "Angle crític" - -#: src/libslic3r/PrintConfig.cpp:3697 -msgid "The default angle for connecting support sticks and junctions." -msgstr "L'angle per defecte per connectar pals de suport i unions." - -#: src/libslic3r/PrintConfig.cpp:3705 -msgid "Max bridge length" -msgstr "Longitud màxima del pont" - -#: src/libslic3r/PrintConfig.cpp:3707 -msgid "The max length of a bridge" -msgstr "La longitud màxima d'un pont" - -#: src/libslic3r/PrintConfig.cpp:3714 -msgid "Max pillar linking distance" -msgstr "Distància màxima d'enllaç del pilar" -#: src/libslic3r/PrintConfig.cpp:3716 -msgid "" -"The max distance of two pillars to get linked with each other. A zero value " -"will prohibit pillar cascading." +#: src/libslic3r/PrintConfig.cpp:3860 +msgid "Support only in enforced regions" msgstr "" -"La distància màxima entre dos pilars perquè s'uneixin entre si. Un valor " -"zero prohibirà l'encadenament de pilars." -#: src/libslic3r/PrintConfig.cpp:3726 -msgid "" -"How much the supports should lift up the supported object. If \"Pad around " -"object\" is enabled, this value is ignored." +#: src/libslic3r/PrintConfig.cpp:3862 +msgid "Only create support if it lies in a support enforcer." msgstr "" -"Quant els suports haurien d'aixecar l'objecte suportat. Si \"Pad al voltant " -"de l'objecte\" està activat, aquest valor serà ignorat." -#: src/libslic3r/PrintConfig.cpp:3737 +#: src/libslic3r/PrintConfig.cpp:3869 msgid "This is a relative measure of support points density." msgstr "Aquesta és una mesura relativa de la densitat de punts de suport." -#: src/libslic3r/PrintConfig.cpp:3743 +#: src/libslic3r/PrintConfig.cpp:3875 msgid "Minimal distance of the support points" msgstr "Distància mínima dels punts de suport" -#: src/libslic3r/PrintConfig.cpp:3745 +#: src/libslic3r/PrintConfig.cpp:3877 msgid "No support points will be placed closer than this threshold." msgstr "No es col·locaran punts de suport més a prop d'aquest llindar." -#: src/libslic3r/PrintConfig.cpp:3751 +#: src/libslic3r/PrintConfig.cpp:3883 msgid "Use pad" msgstr "Utilitza el pad" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3885 msgid "Add a pad underneath the supported model" msgstr "Afegeix un pad sota el model compatible" -#: src/libslic3r/PrintConfig.cpp:3758 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "Pad wall thickness" msgstr "Gruix de la paret del pad" -#: src/libslic3r/PrintConfig.cpp:3760 +#: src/libslic3r/PrintConfig.cpp:3892 msgid "The thickness of the pad and its optional cavity walls." msgstr "El gruix dels pads i les parets de cavitat opcionals." -#: src/libslic3r/PrintConfig.cpp:3768 +#: src/libslic3r/PrintConfig.cpp:3900 msgid "Pad wall height" msgstr "Alçada de la paret del pad" -#: src/libslic3r/PrintConfig.cpp:3769 +#: src/libslic3r/PrintConfig.cpp:3901 msgid "" "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " "when enabling this feature, as some resins may produce an extreme suction " @@ -15225,19 +17186,19 @@ msgstr "" "algunes resines poden produir un efecte de succió extrem dins de la cavitat, " "cosa que dificulta l'enlairament de la impressió de la làmina de la cuba." -#: src/libslic3r/PrintConfig.cpp:3782 +#: src/libslic3r/PrintConfig.cpp:3914 msgid "Pad brim size" msgstr "Grandària de la vora del pad" -#: src/libslic3r/PrintConfig.cpp:3783 +#: src/libslic3r/PrintConfig.cpp:3915 msgid "How far should the pad extend around the contained geometry" msgstr "Fins on cal estendre el pad al voltant de la geometria continguda" -#: src/libslic3r/PrintConfig.cpp:3793 +#: src/libslic3r/PrintConfig.cpp:3925 msgid "Max merge distance" msgstr "Distància màxima de combinació" -#: src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3927 msgid "" "Some objects can get along with a few smaller pads instead of a single big " "one. This parameter defines how far the center of two smaller pads should " @@ -15248,11 +17209,11 @@ msgstr "" "centre de dos pads més petits. Si són més a prop, es fusionaran en un sol " "pad." -#: src/libslic3r/PrintConfig.cpp:3815 +#: src/libslic3r/PrintConfig.cpp:3947 msgid "Pad wall slope" msgstr "Pendent de paret del pad" -#: src/libslic3r/PrintConfig.cpp:3817 +#: src/libslic3r/PrintConfig.cpp:3949 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." @@ -15260,23 +17221,23 @@ msgstr "" "El pendent de la paret del pad en relació amb el pla del llit. 90 graus " "significa parets rectes." -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3960 msgid "Create pad around object and ignore the support elevation" msgstr "Crea un pad al voltant de l'objecte i ignora l'elevació de suport" -#: src/libslic3r/PrintConfig.cpp:3833 +#: src/libslic3r/PrintConfig.cpp:3965 msgid "Pad around object everywhere" msgstr "Pad al voltant de l'objecte a tot arreu" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3967 msgid "Force pad around object everywhere" msgstr "Força el pad al voltant de l'objecte a tot arreu" -#: src/libslic3r/PrintConfig.cpp:3840 +#: src/libslic3r/PrintConfig.cpp:3972 msgid "Pad object gap" msgstr "Espai del pad amb l'objecte" -#: src/libslic3r/PrintConfig.cpp:3842 +#: src/libslic3r/PrintConfig.cpp:3974 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." @@ -15284,54 +17245,54 @@ msgstr "" "L'espai entre la part de sota l'objecte i el pad generat en mode de zero " "elevació." -#: src/libslic3r/PrintConfig.cpp:3851 +#: src/libslic3r/PrintConfig.cpp:3983 msgid "Pad object connector stride" msgstr "Pas del connector de l'objecte al Pad" -#: src/libslic3r/PrintConfig.cpp:3853 +#: src/libslic3r/PrintConfig.cpp:3985 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "Distància entre dos palets de suport entre la peça i la base generada." -#: src/libslic3r/PrintConfig.cpp:3860 +#: src/libslic3r/PrintConfig.cpp:3992 msgid "Pad object connector width" msgstr "Amplada del connector del pad amb l'objecte" -#: src/libslic3r/PrintConfig.cpp:3862 +#: src/libslic3r/PrintConfig.cpp:3994 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "Ample dels palets de suport que connecten la peça i la base generada." -#: src/libslic3r/PrintConfig.cpp:3869 +#: src/libslic3r/PrintConfig.cpp:4001 msgid "Pad object connector penetration" msgstr "Penetració del connector de l'objecte al Pad" -#: src/libslic3r/PrintConfig.cpp:3872 +#: src/libslic3r/PrintConfig.cpp:4004 msgid "How much should the tiny connectors penetrate into the model body." msgstr "Com haurien de penetrar els connectors petits al model del cos." -#: src/libslic3r/PrintConfig.cpp:3879 +#: src/libslic3r/PrintConfig.cpp:4011 msgid "Enable hollowing" msgstr "Habilitar buidatge" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:4013 msgid "Hollow out a model to have an empty interior" msgstr "Buidar un model per tenir un interior buit" -#: src/libslic3r/PrintConfig.cpp:3886 +#: src/libslic3r/PrintConfig.cpp:4018 msgid "Wall thickness" msgstr "Gruix de la paret" -#: src/libslic3r/PrintConfig.cpp:3888 +#: src/libslic3r/PrintConfig.cpp:4020 msgid "Minimum wall thickness of a hollowed model." msgstr "Gruix mínim de paret d'un model buit." -#: src/libslic3r/PrintConfig.cpp:3896 +#: src/libslic3r/PrintConfig.cpp:4028 msgid "Accuracy" msgstr "Precisió" -#: src/libslic3r/PrintConfig.cpp:3898 +#: src/libslic3r/PrintConfig.cpp:4030 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." @@ -15339,7 +17300,7 @@ msgstr "" "Rendiment vs precisió de càlcul. Els valors més baixos poden produir " "artefactes no desitjats." -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:4040 msgid "" "Hollowing is done in two steps: first, an imaginary interior is calculated " "deeper (offset plus the closing distance) in the object and then it's " @@ -15353,11 +17314,11 @@ msgstr "" "de tancament més gran fa que interior sigui més arrodonit. Si és zero, " "l'interior sembla molt a l'exterior." -#: src/libslic3r/PrintConfig.cpp:3920 +#: src/libslic3r/PrintConfig.cpp:4052 msgid "Print speed" msgstr "Velocitat d'impressió" -#: src/libslic3r/PrintConfig.cpp:3922 +#: src/libslic3r/PrintConfig.cpp:4054 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " @@ -15367,63 +17328,91 @@ msgstr "" "amb més viscositat o amb algunes peces buides. Alenteix el moviment " "d'inclinació i afegeix un retard abans de l'exposició." -#: src/libslic3r/PrintConfig.cpp:4390 +#: src/libslic3r/PrintConfig.cpp:4065 +msgid "Format of the output SLA archive" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4070 +msgid "SLA output precision" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4071 +msgid "Minimum resolution in nanometers" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4542 msgid "Export OBJ" msgstr "Exporta OBJ" -#: src/libslic3r/PrintConfig.cpp:4391 +#: src/libslic3r/PrintConfig.cpp:4543 msgid "Export the model(s) as OBJ." msgstr "Exporta el/s model/s com a OBJ." -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4554 msgid "Export SLA" msgstr "Exporta SLA" -#: src/libslic3r/PrintConfig.cpp:4403 +#: src/libslic3r/PrintConfig.cpp:4555 msgid "Slice the model and export SLA printing layers as PNG." msgstr "Laminar el model i exportar les capes d'impressió d'SLA com a PNG." -#: src/libslic3r/PrintConfig.cpp:4408 +#: src/libslic3r/PrintConfig.cpp:4560 msgid "Export 3MF" msgstr "Exporta 3MF" -#: src/libslic3r/PrintConfig.cpp:4409 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Export the model(s) as 3MF." msgstr "Exporta el/s model/s com a 3MF." -#: src/libslic3r/PrintConfig.cpp:4413 +#: src/libslic3r/PrintConfig.cpp:4565 msgid "Export AMF" msgstr "Exporta AMF" -#: src/libslic3r/PrintConfig.cpp:4414 +#: src/libslic3r/PrintConfig.cpp:4566 msgid "Export the model(s) as AMF." msgstr "Exporta el/s model/s com a AMF." -#: src/libslic3r/PrintConfig.cpp:4418 +#: src/libslic3r/PrintConfig.cpp:4570 msgid "Export STL" msgstr "Exporta STL" -#: src/libslic3r/PrintConfig.cpp:4419 +#: src/libslic3r/PrintConfig.cpp:4571 msgid "Export the model(s) as STL." msgstr "Exporta el/s model/s com a STL." -#: src/libslic3r/PrintConfig.cpp:4424 +#: src/libslic3r/PrintConfig.cpp:4576 msgid "Slice the model and export toolpaths as G-code." msgstr "Laminar el model i exportar les trajectòries com a codi G." -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4581 msgid "G-code viewer" msgstr "Visualitzador de codi G" -#: src/libslic3r/PrintConfig.cpp:4430 +#: src/libslic3r/PrintConfig.cpp:4582 msgid "Visualize an already sliced and saved G-code" msgstr "Visualitzar un codi G ja laminat i desat" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4588 +msgid "OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4589 +msgid "Select the specified OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4594 +msgid "OpenGL debug output" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4595 +msgid "Activate OpenGL debug output on graphic cards which support it" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4601 msgid "Slice" msgstr "Laminar" -#: src/libslic3r/PrintConfig.cpp:4436 +#: src/libslic3r/PrintConfig.cpp:4602 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." @@ -15431,69 +17420,73 @@ msgstr "" "Laminar el model com FFF o SLA basat en el valor de configuració de " "printer_technology." -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4607 msgid "Help" msgstr "Ajuda" -#: src/libslic3r/PrintConfig.cpp:4442 +#: src/libslic3r/PrintConfig.cpp:4608 msgid "Show this help." msgstr "Mostra aquesta ajuda." -#: src/libslic3r/PrintConfig.cpp:4447 +#: src/libslic3r/PrintConfig.cpp:4613 msgid "Help (FFF options)" msgstr "Ajuda (opcions FFF)" -#: src/libslic3r/PrintConfig.cpp:4448 +#: src/libslic3r/PrintConfig.cpp:4614 msgid "Show the full list of print/G-code configuration options." msgstr "" "Mostra la llista completa d'opcions de configuració d'impressió/G-code." -#: src/libslic3r/PrintConfig.cpp:4452 +#: src/libslic3r/PrintConfig.cpp:4618 msgid "Help (SLA options)" msgstr "Ajuda (opcions de l'SLA)" -#: src/libslic3r/PrintConfig.cpp:4453 +#: src/libslic3r/PrintConfig.cpp:4619 msgid "Show the full list of SLA print configuration options." msgstr "" "Mostra la llista completa d'opcions de configuració d'impressió de l'SLA." -#: src/libslic3r/PrintConfig.cpp:4457 +#: src/libslic3r/PrintConfig.cpp:4623 msgid "Output Model Info" msgstr "Informació del model de sortida" -#: src/libslic3r/PrintConfig.cpp:4458 +#: src/libslic3r/PrintConfig.cpp:4624 msgid "Write information about the model to the console." msgstr "Escriure informació sobre el model a la consola." -#: src/libslic3r/PrintConfig.cpp:4462 +#: src/libslic3r/PrintConfig.cpp:4628 msgid "Save config file" msgstr "Desa el fitxer de configuració" -#: src/libslic3r/PrintConfig.cpp:4463 +#: src/libslic3r/PrintConfig.cpp:4629 msgid "Save configuration to the specified file." msgstr "Desa la configuració al fitxer especificat." -#: src/libslic3r/PrintConfig.cpp:4473 +#: src/libslic3r/PrintConfig.cpp:4639 msgid "Align XY" msgstr "Alinear xy" -#: src/libslic3r/PrintConfig.cpp:4474 +#: src/libslic3r/PrintConfig.cpp:4640 msgid "Align the model to the given point." msgstr "Alinear el model amb el punt donat." -#: src/libslic3r/PrintConfig.cpp:4479 +#: src/libslic3r/PrintConfig.cpp:4645 msgid "Cut model at the given Z." msgstr "Tallar model a una Z donada." -#: src/libslic3r/PrintConfig.cpp:4501 +#: src/libslic3r/PrintConfig.cpp:4666 +msgid "Center" +msgstr "Centre" + +#: src/libslic3r/PrintConfig.cpp:4667 msgid "Center the print around the given center." msgstr "Centrar la impressió al voltant del centre donat." -#: src/libslic3r/PrintConfig.cpp:4505 +#: src/libslic3r/PrintConfig.cpp:4671 msgid "Don't arrange" msgstr "No organitzar" -#: src/libslic3r/PrintConfig.cpp:4506 +#: src/libslic3r/PrintConfig.cpp:4672 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." @@ -15501,11 +17494,11 @@ msgstr "" "No reordeneu els models donats abans de fusionar-los i mantingueu les " "coordenades XY originals." -#: src/libslic3r/PrintConfig.cpp:4509 +#: src/libslic3r/PrintConfig.cpp:4675 msgid "Ensure on bed" msgstr "Assegurar a la base" -#: src/libslic3r/PrintConfig.cpp:4510 +#: src/libslic3r/PrintConfig.cpp:4676 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." @@ -15513,23 +17506,23 @@ msgstr "" "Eleva l'objecte per sobre del llit quan està parcialment a sota. Activat per " "defecte, utilitza --no-ensure-on-bed per desactivar-lo." -#: src/libslic3r/PrintConfig.cpp:4514 +#: src/libslic3r/PrintConfig.cpp:4680 msgid "Duplicate" msgstr "Duplicar" -#: src/libslic3r/PrintConfig.cpp:4515 +#: src/libslic3r/PrintConfig.cpp:4681 msgid "Multiply copies by this factor." msgstr "Multiplica les còpies per aquest factor." -#: src/libslic3r/PrintConfig.cpp:4519 +#: src/libslic3r/PrintConfig.cpp:4685 msgid "Duplicate by grid" msgstr "Duplicar per quadrícula" -#: src/libslic3r/PrintConfig.cpp:4520 +#: src/libslic3r/PrintConfig.cpp:4686 msgid "Multiply copies by creating a grid." msgstr "Multiplica les còpies creant una quadrícula." -#: src/libslic3r/PrintConfig.cpp:4524 +#: src/libslic3r/PrintConfig.cpp:4690 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." @@ -15537,7 +17530,7 @@ msgstr "" "Organitzar els models subministrats en una base i combinar-los en un sol " "model per fer accions una vegada." -#: src/libslic3r/PrintConfig.cpp:4529 +#: src/libslic3r/PrintConfig.cpp:4695 msgid "" "Try to repair any non-manifold meshes (this option is implicitly added " "whenever we need to slice the model to perform the requested action)." @@ -15546,31 +17539,31 @@ msgstr "" "implícitament cada vegada que necessitem laminar el model per fer l'acció " "sol·licitada)." -#: src/libslic3r/PrintConfig.cpp:4533 +#: src/libslic3r/PrintConfig.cpp:4699 msgid "Rotation angle around the Z axis in degrees." msgstr "Angle de rotació al voltant de l'eix Z en graus." -#: src/libslic3r/PrintConfig.cpp:4537 +#: src/libslic3r/PrintConfig.cpp:4703 msgid "Rotate around X" msgstr "Rotar al voltant de l'eix X" -#: src/libslic3r/PrintConfig.cpp:4538 +#: src/libslic3r/PrintConfig.cpp:4704 msgid "Rotation angle around the X axis in degrees." msgstr "Angle de rotació al voltant de l'eix X en graus." -#: src/libslic3r/PrintConfig.cpp:4542 +#: src/libslic3r/PrintConfig.cpp:4708 msgid "Rotate around Y" msgstr "Rotar al voltant de l'eix Y" -#: src/libslic3r/PrintConfig.cpp:4543 +#: src/libslic3r/PrintConfig.cpp:4709 msgid "Rotation angle around the Y axis in degrees." msgstr "Angle de rotació al voltant de l'eix Y en graus." -#: src/libslic3r/PrintConfig.cpp:4548 +#: src/libslic3r/PrintConfig.cpp:4714 msgid "Scaling factor or percentage." msgstr "Factor d'escalat o percentatge." -#: src/libslic3r/PrintConfig.cpp:4553 +#: src/libslic3r/PrintConfig.cpp:4719 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." @@ -15578,23 +17571,31 @@ msgstr "" "Detecta parts no connectades en els models indicats i els divideix en " "objectes separats." -#: src/libslic3r/PrintConfig.cpp:4556 +#: src/libslic3r/PrintConfig.cpp:4722 msgid "Scale to Fit" msgstr "Escalar per Adaptar-se" -#: src/libslic3r/PrintConfig.cpp:4557 +#: src/libslic3r/PrintConfig.cpp:4723 msgid "Scale to fit the given volume." msgstr "Escala per ajustar-se al volum donat." -#: src/libslic3r/PrintConfig.cpp:4566 +#: src/libslic3r/PrintConfig.cpp:4727 +msgid "Delete files after loading" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4728 +msgid "Delete files after loading." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4736 msgid "Ignore non-existent config files" msgstr "Ignora els fitxers de configuració inexistents" -#: src/libslic3r/PrintConfig.cpp:4567 +#: src/libslic3r/PrintConfig.cpp:4737 msgid "Do not fail if a file supplied to --load does not exist." msgstr "No fallar si el fitxer subministrat per a --load no existeix." -#: src/libslic3r/PrintConfig.cpp:4570 +#: src/libslic3r/PrintConfig.cpp:4740 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." @@ -15602,7 +17603,7 @@ msgstr "" "Regla de compatibilitat en carregar configuracions des de fitxers de " "configuració i fitxers de projecte (3MF, AMF)." -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4741 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -15615,11 +17616,11 @@ msgstr "" "abandonar o substituir un valor desconegut amb un valor per defecte " "silenciosament o verbosament." -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4745 msgid "Bail out on unknown configuration values" msgstr "Sortir en cas de valors de configuració desconeguts" -#: src/libslic3r/PrintConfig.cpp:4579 +#: src/libslic3r/PrintConfig.cpp:4746 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." @@ -15627,7 +17628,7 @@ msgstr "" "Permet la lectura de valors de configuració desconeguts substituint-los " "verbosament pels predeterminats." -#: src/libslic3r/PrintConfig.cpp:4580 +#: src/libslic3r/PrintConfig.cpp:4747 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." @@ -15635,11 +17636,11 @@ msgstr "" "Permet llegir valors de configuració desconeguts substituint-los " "silenciosament pels predeterminats." -#: src/libslic3r/PrintConfig.cpp:4584 +#: src/libslic3r/PrintConfig.cpp:4752 msgid "Load config file" msgstr "Carrega el fitxer de configuració" -#: src/libslic3r/PrintConfig.cpp:4585 +#: src/libslic3r/PrintConfig.cpp:4753 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -15647,11 +17648,11 @@ msgstr "" "Carrega la configuració des del fitxer especificat. Es pot utilitzar més " "d'una vegada per carregar les opcions des de diversos fitxers." -#: src/libslic3r/PrintConfig.cpp:4588 +#: src/libslic3r/PrintConfig.cpp:4756 msgid "Output File" msgstr "Fitxer de sortida" -#: src/libslic3r/PrintConfig.cpp:4589 +#: src/libslic3r/PrintConfig.cpp:4757 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." @@ -15659,11 +17660,11 @@ msgstr "" "El fitxer on s'escriurà la sortida (si no s'especifica, es basarà en el " "fitxer d'entrada)." -#: src/libslic3r/PrintConfig.cpp:4593 +#: src/libslic3r/PrintConfig.cpp:4761 msgid "Single instance mode" msgstr "Mode d'instància única" -#: src/libslic3r/PrintConfig.cpp:4594 +#: src/libslic3r/PrintConfig.cpp:4762 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -15674,11 +17675,11 @@ msgstr "" "una finestra del PrusaSlicer existent. Substitueix el valor de configuració " "\"single_instance\" de les preferències de l'aplicació." -#: src/libslic3r/PrintConfig.cpp:4605 +#: src/libslic3r/PrintConfig.cpp:4767 msgid "Data directory" msgstr "Directori de dades" -#: src/libslic3r/PrintConfig.cpp:4606 +#: src/libslic3r/PrintConfig.cpp:4768 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -15688,11 +17689,11 @@ msgstr "" "mantenir diferents perfils o incloure configuracions des d'un emmagatzematge " "de xarxa." -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4771 msgid "Logging level" msgstr "Nivell de registre" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4772 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -15702,11 +17703,11 @@ msgstr "" "depuració, 5:traça\n" "Per exemple. loglevel=2 registrarà missatges de fallada, error i perill." -#: src/libslic3r/PrintConfig.cpp:4616 +#: src/libslic3r/PrintConfig.cpp:4778 msgid "Render with a software renderer" msgstr "Renderitzar amb un programari renderitzador" -#: src/libslic3r/PrintConfig.cpp:4617 +#: src/libslic3r/PrintConfig.cpp:4779 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -15718,18 +17719,30 @@ msgstr "" msgid "Error with zip archive" msgstr "Error amb el fitxer ZIP" -#: src/libslic3r/PrintObject.cpp:126 +#: src/libslic3r/PrintObject.cpp:152 msgid "Generating perimeters" msgstr "Generant perímetres" -#: src/libslic3r/PrintObject.cpp:229 +#: src/libslic3r/PrintObject.cpp:257 msgid "Preparing infill" msgstr "Preparant farciment" -#: src/libslic3r/PrintObject.cpp:403 +#: src/libslic3r/PrintObject.cpp:402 +msgid "making infill" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:449 +msgid "Searching support spots" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:474 msgid "Generating support material" msgstr "Generant material de suport" +#: src/libslic3r/PrintObject.cpp:495 +msgid "Estimating curled extrusions" +msgstr "" + #: resources/data/hints.ini: [hint:Fuzzy skin] msgid "" "Fuzzy skin\n" @@ -16144,6 +18157,36 @@ msgstr "" "Sabies que pots posar el PrusaSlicer en mode de pantalla completa? Utilitzeu " "la tecla d'accés ràpid F11." +#: resources/data/hints.ini: [hint:Printables integration] +msgid "" +"Printables.com integration\n" +"Did you know that when you are browsing Printables.com, you can send 3D " +"model files to PrusaSlicer with a single click? Learn more in the " +"documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Cut tool] +msgid "" +"Cut tool\n" +"Did you know that you can cut a model at any angle and even create aligning " +"pins with the updated Cut tool? Learn more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Measurement tool] +msgid "" +"Measurement tool\n" +"Did you know that you can measure the distances between points, edges " +"and planes, the radius of a hole or the angle between edges or planes? Learn " +"more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Text tool] +msgid "" +"Text tool\n" +"Did you know that you can add custom text labels to your models or even use " +"the text as a modifier? Learn more in the documentation." +msgstr "" + #: ../src/common/debugrpt.cpp:586 msgid "" "\n" @@ -17298,6 +19341,10 @@ msgstr "Alinea a l'esquerra" msgid "Align Right" msgstr "Alinea a la dreta" +#: ../src/richtext/richtextsizepage.cpp:266 +msgid "Alignment" +msgstr "Alineació" + #: ../src/generic/filectrlg.cpp:1197 ../src/common/fldlgcmn.cpp:107 #, c-format msgid "All files (%s)|%s" @@ -18600,10 +20647,6 @@ msgstr "Decoratiu" msgid "Default encoding" msgstr "Codificació per defecte" -#: ../src/dfb/fontmgr.cpp:180 -msgid "Default font" -msgstr "Tipus de lletra per defecte" - #: ../src/generic/prntdlgg.cpp:510 msgid "Default printer" msgstr "Impressora per defecte" @@ -18966,11 +21009,6 @@ msgstr "S'ha produït un error en imprimir: " msgid "Error: " msgstr "Error: " -#. TRANSLATORS: Name of keyboard key -#: ../src/common/accelcmn.cpp:69 -msgid "Esc" -msgstr "Esc" - #. TRANSLATORS: Name of keyboard key #: ../src/common/accelcmn.cpp:70 msgid "Escape" @@ -19727,11 +21765,6 @@ msgstr "Disquet" msgid "Folio, 8 1/2 x 13 in" msgstr "Foli, 8 1/2 x 13 polz." -#: ../src/richtext/richtextformatdlg.cpp:344 ../src/osx/carbon/fontdlg.cpp:287 -#: ../src/common/stockitem.cpp:194 -msgid "Font" -msgstr "Tipus de lletra" - #: ../src/richtext/richtextfontpage.cpp:221 msgid "Font &weight:" msgstr "&Pes de la lletra:" @@ -20851,10 +22884,6 @@ msgstr "El VFS en memòria ja conté el fitxer '%s'!" msgid "Menu" msgstr "Menú" -#: ../src/common/msgout.cpp:124 -msgid "Message" -msgstr "Missatge" - #: ../src/univ/themes/metal.cpp:168 msgid "Metal theme" msgstr "Tema metàl·lic" @@ -20888,10 +22917,6 @@ msgstr "Manca un paràmetre necessari." msgid "Modern" msgstr "Modern" -#: ../src/generic/filectrlg.cpp:427 -msgid "Modified" -msgstr "Modificat" - #: ../src/common/module.cpp:133 #, c-format msgid "Module \"%s\" initialization failed" @@ -20982,11 +23007,6 @@ msgstr "Nom nou" msgid "Next page" msgstr "Pàgina següent" -#: ../include/wx/msgdlg.h:277 ../src/common/stockitem.cpp:177 -#: ../src/motif/msgdlg.cpp:196 -msgid "No" -msgstr "No" - #. TRANSLATORS: System cursor name #: ../src/propgrid/advprops.cpp:1764 msgid "No Entry" @@ -21225,12 +23245,6 @@ msgstr "Bloq Núm" msgid "Numbered outline" msgstr "Esquema numerat" -#: ../include/wx/msgdlg.h:278 ../src/richtext/richtextstyledlg.cpp:297 -#: ../src/common/stockitem.cpp:178 ../src/msw/msgdlg.cpp:454 -#: ../src/msw/msgdlg.cpp:747 ../src/gtk1/fontdlg.cpp:138 -msgid "OK" -msgstr "D'acord" - #: ../src/msw/ole/automtn.cpp:692 #, c-format msgid "OLE Automation error in %s: %s" @@ -21301,6 +23315,10 @@ msgstr "L'opció '%s' requereix un valor." msgid "Option '%s': '%s' cannot be converted to a date." msgstr "Opció '%s': '%s' no es pot convertir a data." +#: ../src/generic/prntdlgg.cpp:618 +msgid "Options" +msgstr "Opcions" + #: ../src/propgrid/advprops.cpp:1606 msgid "Orange" msgstr "Carabassa" @@ -22090,10 +24108,6 @@ msgstr "Selecciona l'estil normal o cursiva." msgid "Select underlining or no underlining." msgstr "Selecciona subratllat o sense subratllat." -#: ../src/motif/filedlg.cpp:220 -msgid "Selection" -msgstr "Selecció" - #: ../src/richtext/richtextliststylepage.cpp:187 #: ../src/richtext/richtextliststylepage.cpp:189 msgid "Selects the list level to edit." @@ -22989,10 +25003,6 @@ msgstr "" msgid "Turkish (ISO-8859-9)" msgstr "Turc (ISO-8859-9)" -#: ../src/generic/filectrlg.cpp:426 -msgid "Type" -msgstr "Tipus" - #: ../src/richtext/richtextfontpage.cpp:151 #: ../src/richtext/richtextfontpage.cpp:153 msgid "Type a font name." @@ -23480,10 +25490,6 @@ msgstr "Utilitza la configuració d'alineació actual." msgid "Validation conflict" msgstr "Conflicte de validació" -#: ../src/propgrid/manager.cpp:238 -msgid "Value" -msgstr "Valor" - #: ../src/propgrid/props.cpp:386 ../src/propgrid/props.cpp:500 #, c-format msgid "Value must be %s or higher." @@ -23713,11 +25719,6 @@ msgstr "XPM: dades de la imatge truncades a la línia %d!" msgid "Yellow" msgstr "Groc" -#: ../include/wx/msgdlg.h:276 ../src/common/stockitem.cpp:206 -#: ../src/motif/msgdlg.cpp:196 -msgid "Yes" -msgstr "Sí" - #: ../src/osx/carbon/overlay.cpp:155 msgid "You cannot Clear an overlay that is not inited" msgstr "No podeu netejar una superposició que no s'ha inicialitzat" diff --git a/resources/localization/en/PrusaSlicer.mo b/resources/localization/en/PrusaSlicer.mo index d641d462d584a7744b3af553b825fe3a623e3a18..d45d45a0abdc6d21fe711575cf1a7a0807693fa1 100644 GIT binary patch delta 691 zcmX}qODM!q6vy%3jPZVq#|+~+o*_l4QAQrKu`(%H*@&G5RvtTPB9tQ8Ov)6plErK! zY_O0bti5*QRqQN%?|(92{KQ-2bulO_%ypUbt!^k%OxPL`H)6&AH$mZ6FmZ8hi79 delta 1346 zcmc(dOGp+`6vvP6Ow01s%kox~pJ+--21S_EGD8Xp+QfXHSDl=1W|+BO>gpq~AR&k% z+Vq0jR|pwVLiE^`P}|blL`08uEu!DdSgR0%paV0%d+y`hbN=T(=zVi2KUZCRQLsk7 z2EN(?k!Dy~$Pc>>@54KA20BF|Be11d#DbUL4)_h$!uAr86>vY?4Ey08I1W>A8kTU! zTR1P0m-nS2A6R%+Ch`Q{S|V})nsSj1@DXf_4!{@qRTUy*a1QQb{z#?Bb^PmJjko0$W1An4gqzk5MMC#x%*u(vjWAKuRY4{mVQbq-V#@H2AK2e`k-n~jB zi~j?rp|d&(I18hIrE5qIHo&OzR@e>uU=utCi-~&=zQcdGR^%i1%e8ePPvIo`_rkvQ zNjt8>b`H$IS?0eW$0(d>6xq#umr5!RHc|cE2*}^z#9YV!#DpDmf zTK?PUM)Y1f1QlW{;*StQ;zB2cb_#DQHlB#kep$*_H+8n~WWkUMJ;xqUwmWD$j&ijX zsL=6z+hrve3|bi-D&wi4oE2EE(OQ{dtxo8`*cr=F;jreE8MZSct`0+$GM?X(_Kfke z3xOSLTnAzERC#ezRo)M5*F>SSImg)BvX;?-O&BkITxU$!8bu0Ks7|;xjQvq^SIFd_Zq4e^+y%2)bIT7Djr-!pubkJEt2u; EPiLw#H~;_u diff --git a/resources/localization/en/PrusaSlicer_en.po b/resources/localization/en/PrusaSlicer_en.po index 0d9b818fd09..7b90e04bd92 100644 --- a/resources/localization/en/PrusaSlicer_en.po +++ b/resources/localization/en/PrusaSlicer_en.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-01 16:30+0100\n" +"POT-Creation-Date: 2023-03-03 14:25+0100\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -13,54 +13,54 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.3\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 +#: src/slic3r/GUI/AboutDialog.cpp:46 src/slic3r/GUI/AboutDialog.cpp:306 msgid "Portions copyright" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 +#: src/slic3r/GUI/AboutDialog.cpp:143 src/slic3r/GUI/AboutDialog.cpp:270 msgid "Copyright" msgstr "" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:143 +#: src/slic3r/GUI/AboutDialog.cpp:145 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:212 +#: src/slic3r/GUI/AboutDialog.cpp:214 #, c-format, boost-format msgid "About %s" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 -#: src/slic3r/GUI/GUI_App.cpp:262 +#: src/slic3r/GUI/AboutDialog.cpp:245 src/slic3r/GUI/AboutDialog.cpp:370 +#: src/slic3r/GUI/GUI_App.cpp:271 msgid "Version" msgstr "" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:277 msgid "is licensed under the" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:273 src/slic3r/GUI/GUI_App.cpp:277 msgid "GNU Affero General Public License, version 3" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:273 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:274 +#: src/slic3r/GUI/AboutDialog.cpp:275 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " "numerous others." msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:310 +#: src/slic3r/GUI/AboutDialog.cpp:311 msgid "Copy Version Info" msgstr "" @@ -84,54 +84,54 @@ msgid "" msgstr "" #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:162 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:204 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:188 msgid "Slicing complete" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:199 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183 #, boost-format msgid "Masked SLA file exported to %1%" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:286 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:279 msgid "Access violation" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:288 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:281 msgid "Illegal instruction" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:283 msgid "Divide by zero" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:292 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:285 msgid "Overflow" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:294 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:287 msgid "Underflow" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:297 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 msgid "Floating reserved operand" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:300 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:293 msgid "Stack overflow" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:659 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:726 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:652 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:719 msgid "Running post-processing scripts" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:690 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:710 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:683 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:703 msgid "Unknown error occured during exporting G-code." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:695 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:688 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. Maybe the SD " @@ -139,7 +139,7 @@ msgid "" "Error message: %1%" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:698 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:691 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. There might be " @@ -147,44 +147,45 @@ msgid "" "device. The corrupted output G-code is at %1%.tmp." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:701 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:694 #, boost-format msgid "" "Renaming of the G-code after copying to the selected destination folder has " "failed. Current path is %1%.tmp. Please try exporting again." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:704 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:697 #, boost-format msgid "" "Copying of the temporary G-code has finished but the original code at %1% " "couldn't be opened during copy check. The output G-code is at %2%.tmp." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:707 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:700 #, boost-format msgid "" "Copying of the temporary G-code has finished but the exported code couldn't " "be opened during copy check. The output G-code is at %1%.tmp." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:715 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:708 #, boost-format msgid "G-code file exported to %1%" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:729 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:722 msgid "Copying of the temporary G-code to the output G-code failed" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:751 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:738 #, boost-format msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:31 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2765 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1576 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:241 src/slic3r/GUI/Plater.cpp:220 +#: src/slic3r/GUI/Tab.cpp:2697 msgid "Size" msgstr "" @@ -192,7 +193,9 @@ msgstr "" msgid "Origin" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:33 src/libslic3r/PrintConfig.cpp:1020 +#: src/slic3r/GUI/BedShapeDialog.cpp:33 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1994 +#: src/libslic3r/PrintConfig.cpp:1109 msgid "Diameter" msgstr "" @@ -206,54 +209,62 @@ msgid "" "rectangle." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:262 -#: src/slic3r/GUI/ConfigWizard.cpp:1476 src/slic3r/GUI/ConfigWizard.cpp:1490 +#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:291 +#: src/slic3r/GUI/ConfigWizard.cpp:1796 src/slic3r/GUI/ConfigWizard.cpp:1832 +#: src/slic3r/GUI/ConfigWizard.cpp:1846 #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:100 -#: src/slic3r/GUI/GCodeViewer.cpp:3181 src/slic3r/GUI/GCodeViewer.cpp:3187 -#: src/slic3r/GUI/GCodeViewer.cpp:3195 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 src/slic3r/GUI/GCodeViewer.cpp:3455 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 #: src/slic3r/GUI/GUI_ObjectLayers.cpp:145 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 src/libslic3r/PrintConfig.cpp:263 -#: src/libslic3r/PrintConfig.cpp:290 src/libslic3r/PrintConfig.cpp:297 -#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:520 -#: src/libslic3r/PrintConfig.cpp:546 src/libslic3r/PrintConfig.cpp:621 -#: src/libslic3r/PrintConfig.cpp:629 src/libslic3r/PrintConfig.cpp:679 -#: src/libslic3r/PrintConfig.cpp:813 src/libslic3r/PrintConfig.cpp:824 -#: src/libslic3r/PrintConfig.cpp:842 src/libslic3r/PrintConfig.cpp:1023 -#: src/libslic3r/PrintConfig.cpp:1235 src/libslic3r/PrintConfig.cpp:1302 -#: src/libslic3r/PrintConfig.cpp:1312 src/libslic3r/PrintConfig.cpp:1611 -#: src/libslic3r/PrintConfig.cpp:1805 src/libslic3r/PrintConfig.cpp:1866 -#: src/libslic3r/PrintConfig.cpp:1884 src/libslic3r/PrintConfig.cpp:1902 -#: src/libslic3r/PrintConfig.cpp:1965 src/libslic3r/PrintConfig.cpp:1975 -#: src/libslic3r/PrintConfig.cpp:2097 src/libslic3r/PrintConfig.cpp:2106 -#: src/libslic3r/PrintConfig.cpp:2125 src/libslic3r/PrintConfig.cpp:2146 -#: src/libslic3r/PrintConfig.cpp:2158 src/libslic3r/PrintConfig.cpp:2166 -#: src/libslic3r/PrintConfig.cpp:2207 src/libslic3r/PrintConfig.cpp:2215 -#: src/libslic3r/PrintConfig.cpp:2225 src/libslic3r/PrintConfig.cpp:2233 -#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2303 -#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2603 -#: src/libslic3r/PrintConfig.cpp:2620 src/libslic3r/PrintConfig.cpp:2721 -#: src/libslic3r/PrintConfig.cpp:2730 src/libslic3r/PrintConfig.cpp:2780 -#: src/libslic3r/PrintConfig.cpp:2932 src/libslic3r/PrintConfig.cpp:3020 -#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3034 -#: src/libslic3r/PrintConfig.cpp:3048 src/libslic3r/PrintConfig.cpp:3072 -#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3092 -#: src/libslic3r/PrintConfig.cpp:3372 src/libslic3r/PrintConfig.cpp:3413 -#: src/libslic3r/PrintConfig.cpp:3573 src/libslic3r/PrintConfig.cpp:3582 -#: src/libslic3r/PrintConfig.cpp:3591 src/libslic3r/PrintConfig.cpp:3601 -#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3676 -#: src/libslic3r/PrintConfig.cpp:3688 src/libslic3r/PrintConfig.cpp:3708 -#: src/libslic3r/PrintConfig.cpp:3718 src/libslic3r/PrintConfig.cpp:3728 -#: src/libslic3r/PrintConfig.cpp:3746 src/libslic3r/PrintConfig.cpp:3761 -#: src/libslic3r/PrintConfig.cpp:3775 src/libslic3r/PrintConfig.cpp:3786 -#: src/libslic3r/PrintConfig.cpp:3799 src/libslic3r/PrintConfig.cpp:3844 -#: src/libslic3r/PrintConfig.cpp:3854 src/libslic3r/PrintConfig.cpp:3863 -#: src/libslic3r/PrintConfig.cpp:3873 src/libslic3r/PrintConfig.cpp:3889 -#: src/libslic3r/PrintConfig.cpp:3913 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 src/libslic3r/PrintConfig.cpp:279 +#: src/libslic3r/PrintConfig.cpp:303 src/libslic3r/PrintConfig.cpp:310 +#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:657 src/libslic3r/PrintConfig.cpp:724 +#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:782 +#: src/libslic3r/PrintConfig.cpp:902 src/libslic3r/PrintConfig.cpp:913 +#: src/libslic3r/PrintConfig.cpp:931 src/libslic3r/PrintConfig.cpp:1112 +#: src/libslic3r/PrintConfig.cpp:1295 src/libslic3r/PrintConfig.cpp:1359 +#: src/libslic3r/PrintConfig.cpp:1369 src/libslic3r/PrintConfig.cpp:1650 +#: src/libslic3r/PrintConfig.cpp:1842 src/libslic3r/PrintConfig.cpp:1903 +#: src/libslic3r/PrintConfig.cpp:1921 src/libslic3r/PrintConfig.cpp:1939 +#: src/libslic3r/PrintConfig.cpp:1995 src/libslic3r/PrintConfig.cpp:2005 +#: src/libslic3r/PrintConfig.cpp:2127 src/libslic3r/PrintConfig.cpp:2136 +#: src/libslic3r/PrintConfig.cpp:2155 src/libslic3r/PrintConfig.cpp:2176 +#: src/libslic3r/PrintConfig.cpp:2188 src/libslic3r/PrintConfig.cpp:2196 +#: src/libslic3r/PrintConfig.cpp:2237 src/libslic3r/PrintConfig.cpp:2245 +#: src/libslic3r/PrintConfig.cpp:2255 src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2271 src/libslic3r/PrintConfig.cpp:2336 +#: src/libslic3r/PrintConfig.cpp:2565 src/libslic3r/PrintConfig.cpp:2632 +#: src/libslic3r/PrintConfig.cpp:2647 src/libslic3r/PrintConfig.cpp:2746 +#: src/libslic3r/PrintConfig.cpp:2755 src/libslic3r/PrintConfig.cpp:2801 +#: src/libslic3r/PrintConfig.cpp:2886 src/libslic3r/PrintConfig.cpp:2896 +#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3108 +#: src/libslic3r/PrintConfig.cpp:3115 src/libslic3r/PrintConfig.cpp:3122 +#: src/libslic3r/PrintConfig.cpp:3136 src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3170 src/libslic3r/PrintConfig.cpp:3180 +#: src/libslic3r/PrintConfig.cpp:3330 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3391 src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3444 src/libslic3r/PrintConfig.cpp:3456 +#: src/libslic3r/PrintConfig.cpp:3476 src/libslic3r/PrintConfig.cpp:3491 +#: src/libslic3r/PrintConfig.cpp:3501 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3681 src/libslic3r/PrintConfig.cpp:3878 +#: src/libslic3r/PrintConfig.cpp:3893 src/libslic3r/PrintConfig.cpp:3907 +#: src/libslic3r/PrintConfig.cpp:3918 src/libslic3r/PrintConfig.cpp:3931 +#: src/libslic3r/PrintConfig.cpp:3976 src/libslic3r/PrintConfig.cpp:3986 +#: src/libslic3r/PrintConfig.cpp:3995 src/libslic3r/PrintConfig.cpp:4005 +#: src/libslic3r/PrintConfig.cpp:4021 src/libslic3r/PrintConfig.cpp:4045 +#: src/libslic3r/PrintConfig.cpp:4072 msgid "mm" msgstr "" @@ -271,13 +282,13 @@ msgstr "" msgid "Circular" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:81 src/slic3r/GUI/GUI_Preview.cpp:252 -#: src/libslic3r/ExtrusionEntity.cpp:343 src/libslic3r/ExtrusionEntity.cpp:378 +#: src/slic3r/GUI/BedShapeDialog.cpp:81 msgid "Custom" msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:104 src/slic3r/GUI/BedShapeDialog.cpp:179 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1701 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1565 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1798 msgid "Shape" msgstr "" @@ -285,8 +296,8 @@ msgstr "" msgid "Load shape from STL..." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2147 +#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3914 +#: src/slic3r/GUI/MainFrame.cpp:2240 msgid "Settings" msgstr "" @@ -299,7 +310,7 @@ msgid "Load..." msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/Tab.cpp:3973 msgid "Remove" msgstr "" @@ -311,107 +322,174 @@ msgstr "" msgid "Model" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:508 +#: src/slic3r/GUI/BedShapeDialog.cpp:506 msgid "Choose an STL file to import bed shape from:" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:514 src/slic3r/GUI/BedShapeDialog.cpp:562 -#: src/slic3r/GUI/BedShapeDialog.cpp:584 +#: src/slic3r/GUI/BedShapeDialog.cpp:512 src/slic3r/GUI/BedShapeDialog.cpp:560 +#: src/slic3r/GUI/BedShapeDialog.cpp:582 msgid "Invalid file format." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:525 +#: src/slic3r/GUI/BedShapeDialog.cpp:523 msgid "Error! Invalid model" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:533 +#: src/slic3r/GUI/BedShapeDialog.cpp:531 msgid "The selected file contains no geometry." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:537 +#: src/slic3r/GUI/BedShapeDialog.cpp:535 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:552 +#: src/slic3r/GUI/BedShapeDialog.cpp:550 msgid "Choose a file to import bed texture from (PNG/SVG):" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:574 +#: src/slic3r/GUI/BedShapeDialog.cpp:572 msgid "Choose an STL file to import bed model from:" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.hpp:95 src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/BedShapeDialog.hpp:96 src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape" msgstr "" -#: src/slic3r/GUI/BonjourDialog.cpp:55 +#: src/slic3r/GUI/BonjourDialog.cpp:58 msgid "Network lookup" msgstr "" -#: src/slic3r/GUI/BonjourDialog.cpp:72 +#: src/slic3r/GUI/BonjourDialog.cpp:75 src/slic3r/GUI/BonjourDialog.cpp:253 msgid "Address" msgstr "" -#: src/slic3r/GUI/BonjourDialog.cpp:73 +#: src/slic3r/GUI/BonjourDialog.cpp:76 msgid "Hostname" msgstr "" -#: src/slic3r/GUI/BonjourDialog.cpp:74 +#: src/slic3r/GUI/BonjourDialog.cpp:77 msgid "Service name" msgstr "" -#: src/slic3r/GUI/BonjourDialog.cpp:76 +#: src/slic3r/GUI/BonjourDialog.cpp:79 msgid "OctoPrint version" msgstr "" -#: src/slic3r/GUI/BonjourDialog.cpp:224 +#: src/slic3r/GUI/BonjourDialog.cpp:227 msgid "Searching for devices" msgstr "" -#: src/slic3r/GUI/BonjourDialog.cpp:231 +#: src/slic3r/GUI/BonjourDialog.cpp:234 msgid "Finished" msgstr "" -#: src/slic3r/GUI/ButtonsDescription.cpp:42 +#: src/slic3r/GUI/BonjourDialog.cpp:240 +msgid "Multiple resolved IP addresses" +msgstr "" + +#: src/slic3r/GUI/BonjourDialog.cpp:249 +#, boost-format +msgid "" +"There are several IP addresses resolving to hostname %1%.\n" +"Please select one that should be used." +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:21 +msgid "Palette 1 (default)" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:22 +msgid "Palette 2" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:23 +msgid "Palette 3" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:24 +msgid "Palette 4" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:25 +msgid "Palette 5" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:26 +msgid "Palette 6" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:27 +msgid "Palette 7" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:28 +msgid "Palette 8" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:112 msgid "Revert color to default" msgstr "" -#: src/slic3r/GUI/ButtonsDescription.cpp:57 +#: src/slic3r/GUI/ButtonsDescription.cpp:127 msgid "Value is the same as the system value" msgstr "" -#: src/slic3r/GUI/ButtonsDescription.cpp:58 +#: src/slic3r/GUI/ButtonsDescription.cpp:128 msgid "" "Value was changed and is not equal to the system value or the last saved " "preset" msgstr "" -#: src/slic3r/GUI/ButtonsDescription.cpp:62 +#: src/slic3r/GUI/ButtonsDescription.cpp:155 +msgid "Default palette for mode markers" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2422 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Simple" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2424 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgctxt "Mode" +msgid "Advanced" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2425 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Expert" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:182 +msgid "Revert color" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:200 msgid "Buttons And Text Colors Description" msgstr "Buttons and Text Colors Description" -#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/ConfigManipulation.cpp:50 msgid "" "Layer height is not valid.\n" "\n" "The layer height will be reset to 0.01." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:50 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1449 -#: src/libslic3r/PrintConfig.cpp:286 +#: src/slic3r/GUI/ConfigManipulation.cpp:51 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1394 +#: src/libslic3r/PrintConfig.cpp:299 msgid "Layer height" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:61 +#: src/slic3r/GUI/ConfigManipulation.cpp:62 msgid "" "First layer height is not valid.\n" "\n" "The first layer height will be reset to 0.01." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:62 src/libslic3r/PrintConfig.cpp:1231 +#: src/slic3r/GUI/ConfigManipulation.cpp:63 src/libslic3r/PrintConfig.cpp:1291 msgid "First layer height" msgstr "" @@ -422,334 +500,365 @@ msgid "" "- no top solid layers\n" "- 0% fill density\n" "- no support material\n" -"- Ensure vertical shell thickness enabled\n" "- Detect thin walls disabled" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:90 +#: src/slic3r/GUI/ConfigManipulation.cpp:89 msgid "Shall I adjust those settings in order to enable Spiral Vase?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:91 +#: src/slic3r/GUI/ConfigManipulation.cpp:90 msgid "Spiral Vase" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:121 +#: src/slic3r/GUI/ConfigManipulation.cpp:123 msgid "" -"The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool " -"change.\n" -"(both support_material_extruder and support_material_interface_extruder need " -"to be set to 0)." +"For the Wipe Tower to work with the soluble supports, the support layers\n" +"need to be synchronized with the object layers." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:125 -msgid "Shall I adjust those settings in order to enable the Wipe Tower?" +#: src/slic3r/GUI/ConfigManipulation.cpp:126 +msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:126 -#: src/slic3r/GUI/ConfigManipulation.cpp:146 +#: src/slic3r/GUI/ConfigManipulation.cpp:127 +#: src/slic3r/GUI/ConfigManipulation.cpp:145 msgid "Wipe Tower" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:142 +#: src/slic3r/GUI/ConfigManipulation.cpp:140 src/libslic3r/Print.cpp:672 msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers\n" -"need to be synchronized with the object layers." +"The Wipe Tower currently supports the non-soluble supports only if they are " +"printed with the current extruder without triggering a tool change. (both " +"support_material_extruder and support_material_interface_extruder need to be " +"set to 0)." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:145 -msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" +#: src/slic3r/GUI/ConfigManipulation.cpp:144 +msgid "Shall I adjust those settings in order to enable the Wipe Tower?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:164 +#: src/slic3r/GUI/ConfigManipulation.cpp:166 msgid "" "Supports work better, if the following feature is enabled:\n" "- Detect bridging perimeters" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:167 +#: src/slic3r/GUI/ConfigManipulation.cpp:169 msgid "Shall I adjust those settings for supports?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:168 +#: src/slic3r/GUI/ConfigManipulation.cpp:170 msgid "Support Generator" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:195 +#: src/slic3r/GUI/ConfigManipulation.cpp:194 #, boost-format msgid "The %1% infill pattern is not supposed to work at 100%% density." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:198 +#: src/slic3r/GUI/ConfigManipulation.cpp:196 msgid "Shall I switch to rectilinear fill pattern?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:199 +#: src/slic3r/GUI/ConfigManipulation.cpp:197 #: src/slic3r/GUI/GUI_Factories.cpp:55 src/slic3r/GUI/GUI_Factories.cpp:128 -#: src/slic3r/GUI/Plater.cpp:460 src/slic3r/GUI/Tab.cpp:1503 -#: src/slic3r/GUI/Tab.cpp:1505 src/libslic3r/PrintConfig.cpp:475 -#: src/libslic3r/PrintConfig.cpp:716 src/libslic3r/PrintConfig.cpp:743 -#: src/libslic3r/PrintConfig.cpp:1098 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1149 src/libslic3r/PrintConfig.cpp:1398 -#: src/libslic3r/PrintConfig.cpp:1427 src/libslic3r/PrintConfig.cpp:1496 -#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1535 -#: src/libslic3r/PrintConfig.cpp:2364 src/libslic3r/PrintConfig.cpp:2381 +#: src/slic3r/GUI/Plater.cpp:468 src/slic3r/GUI/Tab.cpp:1450 +#: src/slic3r/GUI/Tab.cpp:1452 src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:811 src/libslic3r/PrintConfig.cpp:831 +#: src/libslic3r/PrintConfig.cpp:1187 src/libslic3r/PrintConfig.cpp:1200 +#: src/libslic3r/PrintConfig.cpp:1225 src/libslic3r/PrintConfig.cpp:1444 +#: src/libslic3r/PrintConfig.cpp:1473 src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1557 src/libslic3r/PrintConfig.cpp:1576 +#: src/libslic3r/PrintConfig.cpp:2395 src/libslic3r/PrintConfig.cpp:2412 msgid "Infill" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:337 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Head penetration should not be greater than the head width." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:339 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid Head penetration" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:350 +#: src/slic3r/GUI/ConfigManipulation.cpp:362 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:352 +#: src/slic3r/GUI/ConfigManipulation.cpp:364 msgid "Invalid pinhead diameter" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20 msgid "Upgrade" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22 msgid "Downgrade" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 msgid "Before roll back" msgstr "Before rollback" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:340 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:26 src/libslic3r/PrintConfig.cpp:353 msgid "User" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:329 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:29 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1135 msgid "Unknown" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 msgid "Active" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 msgid "PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 src/libslic3r/Preset.cpp:1341 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 src/libslic3r/Preset.cpp:1480 msgid "print" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:65 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 msgid "filaments" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 src/libslic3r/Preset.cpp:1343 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:67 src/libslic3r/Preset.cpp:1482 msgid "SLA print" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69 -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/slic3r/GUI/GUI.cpp:340 -#: src/slic3r/GUI/Plater.cpp:821 src/libslic3r/Preset.cpp:1344 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/slic3r/GUI/GUI.cpp:331 +#: src/slic3r/GUI/Plater.cpp:851 src/libslic3r/Preset.cpp:1483 msgid "SLA material" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:71 src/libslic3r/Preset.cpp:1345 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 src/libslic3r/Preset.cpp:1484 msgid "printer" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 src/slic3r/GUI/Tab.cpp:1366 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 src/slic3r/GUI/Tab.cpp:1311 msgid "vendor" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 msgid "version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:76 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 msgid "min PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:77 msgid "max PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "model" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "variants" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:93 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:92 #, c-format, boost-format msgid "Incompatible with this %s" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:96 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:95 msgid "Activate" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:123 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:122 msgid "Configuration Snapshots" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:262 +#: src/slic3r/GUI/ConfigWizard.cpp:291 msgid "nozzle" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:266 +#: src/slic3r/GUI/ConfigWizard.cpp:295 msgid "Alternate nozzles:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "All standard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "Standard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3833 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 +#: src/slic3r/GUI/ConfigWizard.cpp:360 src/slic3r/GUI/ConfigWizard.cpp:681 +#: src/slic3r/GUI/FileArchiveDialog.cpp:261 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 src/slic3r/GUI/Preferences.cpp:550 +#: src/slic3r/GUI/Tab.cpp:4058 src/slic3r/GUI/UnsavedChangesDialog.cpp:1161 msgid "All" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:332 src/slic3r/GUI/ConfigWizard.cpp:652 -#: src/slic3r/GUI/DoubleSlider.cpp:2030 src/slic3r/GUI/Plater.cpp:432 -#: src/slic3r/GUI/Plater.cpp:579 src/slic3r/GUI/Preferences.cpp:436 -#: src/libslic3r/PrintConfig.cpp:1291 +#: src/slic3r/GUI/ConfigWizard.cpp:361 src/slic3r/GUI/ConfigWizard.cpp:682 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 +#: src/slic3r/GUI/FileArchiveDialog.cpp:265 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1984 src/slic3r/GUI/Plater.cpp:439 +#: src/slic3r/GUI/Plater.cpp:594 src/slic3r/GUI/Preferences.cpp:552 +#: src/libslic3r/PrintConfig.cpp:1347 msgid "None" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:484 +#: src/slic3r/GUI/ConfigWizard.cpp:513 #, c-format, boost-format msgid "Welcome to the %s Configuration Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:486 +#: src/slic3r/GUI/ConfigWizard.cpp:515 #, c-format, boost-format msgid "Welcome to the %s Configuration Wizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:488 +#: src/slic3r/GUI/ConfigWizard.cpp:517 msgid "Welcome" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:519 #, c-format, boost-format msgid "" "Hello, welcome to %s! This %s helps you with the initial configuration; just " "a few settings and you will be ready to print." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:495 +#: src/slic3r/GUI/ConfigWizard.cpp:524 msgid "Remove user profiles (a snapshot will be taken beforehand)" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:498 +#: src/slic3r/GUI/ConfigWizard.cpp:527 msgid "" "Perform desktop integration (Sets this binary to be searchable by the " "system)." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:550 +#: src/slic3r/GUI/ConfigWizard.cpp:579 #, c-format, boost-format msgid "%s Family" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:640 +#: src/slic3r/GUI/ConfigWizard.cpp:670 msgid "Printer:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:642 +#: src/slic3r/GUI/ConfigWizard.cpp:672 msgid "Vendor:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:643 +#: src/slic3r/GUI/ConfigWizard.cpp:673 msgid "Profile:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:720 src/slic3r/GUI/ConfigWizard.cpp:892 -#: src/slic3r/GUI/ConfigWizard.cpp:952 src/slic3r/GUI/ConfigWizard.cpp:1088 +#: src/slic3r/GUI/ConfigWizard.cpp:750 src/slic3r/GUI/ConfigWizard.cpp:938 +#: src/slic3r/GUI/ConfigWizard.cpp:1024 src/slic3r/GUI/ConfigWizard.cpp:1163 msgid "(All)" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:754 src/slic3r/GUI/ConfigWizard.cpp:1165 +msgid "(Templates)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:789 #, boost-format msgid "" -"%1% marked with * are not compatible with some installed " -"printers." +"%1% visible for (\"Template\") printer are universal profiles " +"available for all printers. These might not be compatible with your printer." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:752 src/slic3r/GUI/ConfigWizard.cpp:2043 -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filaments" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 msgid "SLA materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:755 +#: src/slic3r/GUI/ConfigWizard.cpp:791 +#, boost-format +msgid "" +"%1% marked with * are not compatible with some installed " +"printers." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:794 #, boost-format msgid "All installed printers are compatible with the selected %1%." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/libslic3r/Preset.cpp:1342 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/libslic3r/Preset.cpp:1481 msgid "filament" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:778 +#: src/slic3r/GUI/ConfigWizard.cpp:818 msgid "" "Only the following installed printers are compatible with the selected " "filaments" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:779 +#: src/slic3r/GUI/ConfigWizard.cpp:819 msgid "" "Only the following installed printers are compatible with the selected SLA " "materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1213 +msgid "" +"You have selected template filament. Please note that these filaments are " +"available for all printers but are NOT certain to be compatible with your " +"printer. Do you still wish to have this filament selected?\n" +"(This message won't be displayed again.)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1214 src/slic3r/GUI/ConfigWizard.cpp:2720 +#: src/slic3r/GUI/ConfigWizard.cpp:2860 src/slic3r/GUI/DoubleSlider.cpp:2591 +#: src/slic3r/GUI/DoubleSlider.cpp:2612 src/slic3r/GUI/GUI.cpp:245 +#: src/slic3r/GUI/GUI_App.cpp:3458 src/slic3r/GUI/UpdateDialogs.cpp:204 +#: src/slic3r/GUI/UpdateDialogs.cpp:212 src/slic3r/GUI/UpdateDialogs.cpp:217 +#: src/slic3r/GUI/UpdateDialogs.cpp:222 src/slic3r/GUI/UpdateDialogs.cpp:229 +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +msgid "Notice" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer Setup" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1177 +#: src/slic3r/GUI/ConfigWizard.cpp:1264 msgid "Define a custom printer profile" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1179 +#: src/slic3r/GUI/ConfigWizard.cpp:1265 msgid "Custom profile name:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Automatic updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1214 +#: src/slic3r/GUI/ConfigWizard.cpp:1290 msgid "Check for application updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1218 +#: src/slic3r/GUI/ConfigWizard.cpp:1294 #, c-format, boost-format msgid "" "If enabled, %s checks for new application versions online. When a new " @@ -762,11 +871,11 @@ msgstr "" "application startup (never during program usage). This is only a " "notification mechanism, no automatic installation is done." -#: src/slic3r/GUI/ConfigWizard.cpp:1224 src/slic3r/GUI/Preferences.cpp:175 +#: src/slic3r/GUI/ConfigWizard.cpp:1300 src/slic3r/GUI/Preferences.cpp:306 msgid "Update built-in Presets automatically" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1228 +#: src/slic3r/GUI/ConfigWizard.cpp:1304 #, c-format, boost-format msgid "" "If enabled, %s downloads updates of built-in system presets in the " @@ -779,13 +888,13 @@ msgstr "" "When a new preset version becomes available it is offered at application " "startup." -#: src/slic3r/GUI/ConfigWizard.cpp:1231 +#: src/slic3r/GUI/ConfigWizard.cpp:1307 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1236 +#: src/slic3r/GUI/ConfigWizard.cpp:1312 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." @@ -793,17 +902,61 @@ msgstr "" "Additionally, a backup snapshot of the whole configuration is created before " "an update is applied." -#: src/slic3r/GUI/ConfigWizard.cpp:1243 src/slic3r/GUI/GUI_Factories.cpp:726 -#: src/slic3r/GUI/Plater.cpp:3582 +#: src/slic3r/GUI/ConfigWizard.cpp:1361 src/slic3r/GUI/Preferences.cpp:1076 +msgid "Download path" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1366 src/slic3r/GUI/FirmwareDialog.cpp:815 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:300 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +msgid "Browse" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1371 +msgid "Choose folder:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads from URL" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1417 +msgid "Allow built-in downloader" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1424 +#, c-format, boost-format +msgid "" +"If enabled, %s registers to start on custom URL on www.printables.com. You " +"will be able to use button with %s logo to open models in this %s. The model " +"will be downloaded into folder you choose bellow." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1431 +msgid "" +"On Linux systems the process of registration also creates desktop " +"integration files for this version of application." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1458 +msgid "Chosen directory for downloads does not Exists." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1545 src/slic3r/GUI/GUI_Factories.cpp:810 +#: src/slic3r/GUI/Plater.cpp:3732 msgid "Reload from disk" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1246 +#: src/slic3r/GUI/ConfigWizard.cpp:1548 msgid "" "Export full pathnames of models and parts sources into 3mf and amf files" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1250 +#: src/slic3r/GUI/ConfigWizard.cpp:1552 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked.\n" @@ -811,23 +964,23 @@ msgid "" "using an open file dialog." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1259 +#: src/slic3r/GUI/ConfigWizard.cpp:1561 msgid "Files association" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1261 src/slic3r/GUI/Preferences.cpp:157 +#: src/slic3r/GUI/ConfigWizard.cpp:1563 src/slic3r/GUI/Preferences.cpp:292 msgid "Associate .3mf files to PrusaSlicer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1262 src/slic3r/GUI/Preferences.cpp:164 +#: src/slic3r/GUI/ConfigWizard.cpp:1564 src/slic3r/GUI/Preferences.cpp:297 msgid "Associate .stl files to PrusaSlicer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1272 +#: src/slic3r/GUI/ConfigWizard.cpp:1574 msgid "View mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1274 +#: src/slic3r/GUI/ConfigWizard.cpp:1576 msgid "" "PrusaSlicer's user interfaces comes in three variants:\n" "Simple, Advanced, and Expert.\n" @@ -836,288 +989,302 @@ msgid "" "fine-tuning, they are suitable for advanced and expert users, respectively." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1279 +#: src/slic3r/GUI/ConfigWizard.cpp:1581 msgid "Simple mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1280 +#: src/slic3r/GUI/ConfigWizard.cpp:1582 msgid "Advanced mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1281 +#: src/slic3r/GUI/ConfigWizard.cpp:1583 msgid "Expert mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1287 +#: src/slic3r/GUI/ConfigWizard.cpp:1596 msgid "The size of the object can be specified in inches" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1288 +#: src/slic3r/GUI/ConfigWizard.cpp:1597 msgid "Use inches" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1322 +#: src/slic3r/GUI/ConfigWizard.cpp:1617 msgid "Other Vendors" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1326 +#: src/slic3r/GUI/ConfigWizard.cpp:1621 #, c-format, boost-format msgid "Pick another vendor supported by %s" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 msgid "Firmware Type" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2366 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 src/slic3r/GUI/Tab.cpp:2354 msgid "Firmware" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1361 +#: src/slic3r/GUI/ConfigWizard.cpp:1658 msgid "Choose the type of firmware used by your printer." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/ConfigWizard.cpp:1707 src/slic3r/GUI/ConfigWizard.cpp:1778 +#: src/slic3r/GUI/ConfigWizard.cpp:1783 src/slic3r/GUI/ConfigWizard.cpp:1788 +#: src/slic3r/GUI/Field.cpp:258 src/slic3r/GUI/Field.cpp:328 +#: src/slic3r/GUI/Field.cpp:1585 src/slic3r/GUI/GUI_ObjectLayers.cpp:435 +msgid "Invalid numeric input." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape and Size" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1399 +#: src/slic3r/GUI/ConfigWizard.cpp:1735 msgid "Set the shape of your printer's bed." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1433 src/slic3r/GUI/Field.cpp:255 -#: src/slic3r/GUI/Field.cpp:324 src/slic3r/GUI/Field.cpp:1561 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:435 -msgid "Invalid numeric input." +#: src/slic3r/GUI/ConfigWizard.cpp:1755 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1610 +msgid "Build Volume" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1758 +msgid "Set vertical size of your printer." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1795 +msgid "Max print height:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Filament and Nozzle Diameters" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Print Diameters" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1472 +#: src/slic3r/GUI/ConfigWizard.cpp:1828 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1475 +#: src/slic3r/GUI/ConfigWizard.cpp:1831 msgid "Nozzle Diameter:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1485 +#: src/slic3r/GUI/ConfigWizard.cpp:1841 msgid "Enter the diameter of your filament." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1486 +#: src/slic3r/GUI/ConfigWizard.cpp:1842 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1489 +#: src/slic3r/GUI/ConfigWizard.cpp:1845 msgid "Filament Diameter:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Nozzle and Bed Temperatures" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Temperatures" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1563 +#: src/slic3r/GUI/ConfigWizard.cpp:1919 msgid "Enter the temperature needed for extruding your filament." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1564 +#: src/slic3r/GUI/ConfigWizard.cpp:1920 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1567 +#: src/slic3r/GUI/ConfigWizard.cpp:1923 msgid "Extrusion Temperature:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1568 src/slic3r/GUI/ConfigWizard.cpp:1582 -#: src/libslic3r/PrintConfig.cpp:418 src/libslic3r/PrintConfig.cpp:1211 -#: src/libslic3r/PrintConfig.cpp:1266 src/libslic3r/PrintConfig.cpp:2842 +#: src/slic3r/GUI/ConfigWizard.cpp:1924 src/slic3r/GUI/ConfigWizard.cpp:1938 +#: src/libslic3r/PrintConfig.cpp:437 src/libslic3r/PrintConfig.cpp:1271 +#: src/libslic3r/PrintConfig.cpp:1326 src/libslic3r/PrintConfig.cpp:2930 +#: src/libslic3r/PrintConfig.cpp:3689 msgid "°C" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1577 +#: src/slic3r/GUI/ConfigWizard.cpp:1933 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1578 +#: src/slic3r/GUI/ConfigWizard.cpp:1934 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1581 +#: src/slic3r/GUI/ConfigWizard.cpp:1937 msgid "Bed Temperature:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2043 src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2097 +#: src/slic3r/GUI/ConfigWizard.cpp:2464 msgid "FFF Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2102 +#: src/slic3r/GUI/ConfigWizard.cpp:2469 msgid "SLA Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2338 +#: src/slic3r/GUI/ConfigWizard.cpp:2718 #, boost-format msgid "" "Following printer profiles has no default filament: %1%Please select one " "manually." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2339 +#: src/slic3r/GUI/ConfigWizard.cpp:2719 #, boost-format msgid "" "Following printer profiles has no default material: %1%Please select one " "manually." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2340 src/slic3r/GUI/ConfigWizard.cpp:2438 -#: src/slic3r/GUI/DoubleSlider.cpp:2522 src/slic3r/GUI/DoubleSlider.cpp:2543 -#: src/slic3r/GUI/GUI.cpp:232 -msgid "Notice" -msgstr "" - -#: src/slic3r/GUI/ConfigWizard.cpp:2459 +#: src/slic3r/GUI/ConfigWizard.cpp:2883 msgid "The following FFF printer models have no filament selected:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2463 +#: src/slic3r/GUI/ConfigWizard.cpp:2887 msgid "Do you want to select default filaments for these FFF printer models?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2477 +#: src/slic3r/GUI/ConfigWizard.cpp:2901 msgid "The following SLA printer models have no materials selected:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2481 +#: src/slic3r/GUI/ConfigWizard.cpp:2905 msgid "Do you want to select default SLA materials for these printer models?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2523 +#: src/slic3r/GUI/ConfigWizard.cpp:2947 msgid "Configuration is edited in ConfigWizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2566 +#: src/slic3r/GUI/ConfigWizard.cpp:3000 msgid "All user presets will be deleted." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2596 +#: src/slic3r/GUI/ConfigWizard.cpp:3037 msgid "A new vendor was installed and one of its printers will be activated" msgid_plural "" "New vendors were installed and one of theirs printers will be activated" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/ConfigWizard.cpp:2625 +#: src/slic3r/GUI/ConfigWizard.cpp:3069 msgid "Do you want to continue changing the configuration?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2691 +#: src/slic3r/GUI/ConfigWizard.cpp:3136 msgid "A new Printer was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2696 +#: src/slic3r/GUI/ConfigWizard.cpp:3141 msgid "Some Printers were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2717 +#: src/slic3r/GUI/ConfigWizard.cpp:3162 msgid "A new filament was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2718 +#: src/slic3r/GUI/ConfigWizard.cpp:3163 msgid "A new SLA material was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some filaments were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some SLA materials were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2773 +#: src/slic3r/GUI/ConfigWizard.cpp:3218 msgid "Custom printer was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2858 +#: src/slic3r/GUI/ConfigWizard.cpp:3306 msgid "Select all standard printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2861 +#: src/slic3r/GUI/ConfigWizard.cpp:3309 msgid "< &Back" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2862 +#: src/slic3r/GUI/ConfigWizard.cpp:3310 msgid "&Next >" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2863 +#: src/slic3r/GUI/ConfigWizard.cpp:3311 msgid "&Finish" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2864 -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:3312 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:657 +#: src/slic3r/GUI/FileArchiveDialog.cpp:274 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 #: src/slic3r/GUI/FirmwareDialog.cpp:153 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1593 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1365 #: src/slic3r/GUI/ProgressStatusBar.cpp:26 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:93 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:879 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:96 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:907 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1606 msgid "Cancel" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2884 +#: src/slic3r/GUI/ConfigWizard.cpp:3332 msgid "Prusa FFF Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2892 +#: src/slic3r/GUI/ConfigWizard.cpp:3340 msgid "Prusa MSLA Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filament Profiles Selection" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 src/slic3r/GUI/ConfigWizard.cpp:2915 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 src/slic3r/GUI/ConfigWizard.cpp:3363 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Type:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Material Profiles Selection" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:3036 +#: src/slic3r/GUI/ConfigWizard.cpp:3486 msgid "Configuration Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:3037 +#: src/slic3r/GUI/ConfigWizard.cpp:3487 msgid "Configuration &Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:3039 +#: src/slic3r/GUI/ConfigWizard.cpp:3489 msgid "Configuration Wizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:3040 +#: src/slic3r/GUI/ConfigWizard.cpp:3490 msgid "Configuration &Wizard" msgstr "" @@ -1131,37 +1298,54 @@ msgstr "" msgid "Performing desktop integration failed - Could not find executable." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:378 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:383 msgid "" "Performing desktop integration failed because the application directory was " "not found." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:419 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:423 msgid "" "Performing desktop integration failed - could not create Gcodeviewer desktop " "file. PrusaSlicer desktop file was probably created successfully." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:459 -#: src/slic3r/GUI/GUI_App.cpp:2245 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:472 +msgid "" +"Performing downloader desktop integration failed - boost::filesystem::" +"canonical did not return appimage path." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:484 +msgid "" +"Performing downloader desktop integration failed - Could not find executable." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:602 +msgid "" +"Performing downloader desktop integration failed because the application " +"directory was not found." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:626 +#: src/slic3r/GUI/GUI_App.cpp:2407 msgid "Desktop Integration" msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:466 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:633 msgid "" "Desktop Integration sets this binary to be searchable by the system.\n" "\n" "Press \"Perform\" to proceed." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:480 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:647 msgid "Perform" msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1342 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:653 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/KBShortcutsDialog.cpp:106 +#: src/slic3r/GUI/MainFrame.cpp:1426 msgid "Undo" msgstr "" @@ -1169,19 +1353,19 @@ msgstr "" msgid "Place bearings in slots and resume printing" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1379 +#: src/slic3r/GUI/DoubleSlider.cpp:1448 msgid "One layer mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1381 +#: src/slic3r/GUI/DoubleSlider.cpp:1450 msgid "Discard all custom changes" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1385 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:1454 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to move" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1388 +#: src/slic3r/GUI/DoubleSlider.cpp:1457 #, c-format, boost-format msgid "" "Jump to height %s\n" @@ -1189,58 +1373,58 @@ msgid "" "or Set extruder sequence for the entire print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1391 +#: src/slic3r/GUI/DoubleSlider.cpp:1460 #, c-format, boost-format msgid "" "Jump to height %s\n" "or Set ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1396 +#: src/slic3r/GUI/DoubleSlider.cpp:1465 msgid "Edit current color - Right click the colored slider segment" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1398 +#: src/slic3r/GUI/DoubleSlider.cpp:1467 msgid "This is wipe tower layer" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1408 +#: src/slic3r/GUI/DoubleSlider.cpp:1477 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing sequentually." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1412 +#: src/slic3r/GUI/DoubleSlider.cpp:1481 msgid "Print mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1426 +#: src/slic3r/GUI/DoubleSlider.cpp:1495 msgid "Add extruder change - Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1428 +#: src/slic3r/GUI/DoubleSlider.cpp:1497 msgid "" "Add color change - Left click for predefined color or Shift + Left click for " "custom color selection" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1430 +#: src/slic3r/GUI/DoubleSlider.cpp:1499 msgid "Add color change - Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1431 +#: src/slic3r/GUI/DoubleSlider.cpp:1500 msgid "or press \"+\" key" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1433 +#: src/slic3r/GUI/DoubleSlider.cpp:1502 msgid "Add another code - Ctrl + Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1434 +#: src/slic3r/GUI/DoubleSlider.cpp:1503 msgid "Add another code - Right click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1440 +#: src/slic3r/GUI/DoubleSlider.cpp:1509 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing " @@ -1252,289 +1436,305 @@ msgstr "" "sequentially.\n" "This code won't be processed during G-code generation." -#: src/slic3r/GUI/DoubleSlider.cpp:1458 +#: src/slic3r/GUI/DoubleSlider.cpp:1527 msgid "continue" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1466 +#: src/slic3r/GUI/DoubleSlider.cpp:1535 #, boost-format msgid "Color change (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1467 +#: src/slic3r/GUI/DoubleSlider.cpp:1536 #, boost-format msgid "Color change (\"%1%\") for Extruder %2%" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1469 +#: src/slic3r/GUI/DoubleSlider.cpp:1538 #, boost-format msgid "Pause print (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1471 +#: src/slic3r/GUI/DoubleSlider.cpp:1540 #, boost-format msgid "Custom template (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1473 +#: src/slic3r/GUI/DoubleSlider.cpp:1542 #, boost-format msgid "Extruder (tool) is changed to Extruder \"%1%\"" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1480 +#: src/slic3r/GUI/DoubleSlider.cpp:1549 msgid "Note" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1482 +#: src/slic3r/GUI/DoubleSlider.cpp:1551 msgid "" "G-code associated to this tick mark is in a conflict with print mode.\n" "Editing it will cause changes of Slider data." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1485 +#: src/slic3r/GUI/DoubleSlider.cpp:1554 msgid "" "There is a color change for extruder that won't be used till the end of " "print job.\n" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1488 +#: src/slic3r/GUI/DoubleSlider.cpp:1557 msgid "" "There is an extruder change set to the same extruder.\n" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1491 +#: src/slic3r/GUI/DoubleSlider.cpp:1560 msgid "" "There is a color change for extruder that has not been used before.\n" "Check your settings to avoid redundant color changes." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1496 +#: src/slic3r/GUI/DoubleSlider.cpp:1565 msgid "Delete tick mark - Left click or press \"-\" key" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1498 +#: src/slic3r/GUI/DoubleSlider.cpp:1567 msgid "Edit tick mark - Ctrl + Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1499 +#: src/slic3r/GUI/DoubleSlider.cpp:1568 msgid "Edit tick mark - Right click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1602 src/slic3r/GUI/DoubleSlider.cpp:1633 -#: src/slic3r/GUI/GUI_Factories.cpp:778 +#: src/slic3r/GUI/DoubleSlider.cpp:1671 src/slic3r/GUI/DoubleSlider.cpp:1702 +#: src/slic3r/GUI/GUI_Factories.cpp:862 #, c-format, boost-format msgid "Extruder %d" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1603 src/slic3r/GUI/GUI_Factories.cpp:779 +#: src/slic3r/GUI/DoubleSlider.cpp:1672 src/slic3r/GUI/GUI_Factories.cpp:863 msgid "active" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 msgid "Switch code to Change extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Change extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1613 +#: src/slic3r/GUI/DoubleSlider.cpp:1682 msgid "Change extruder (N/A)" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1615 src/slic3r/GUI/GUI_Factories.cpp:787 +#: src/slic3r/GUI/DoubleSlider.cpp:1684 src/slic3r/GUI/GUI_Factories.cpp:871 msgid "Use another extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1634 +#: src/slic3r/GUI/DoubleSlider.cpp:1703 msgid "used" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1642 +#: src/slic3r/GUI/DoubleSlider.cpp:1711 #, boost-format msgid "Switch code to Color change (%1%) for:" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1643 +#: src/slic3r/GUI/DoubleSlider.cpp:1712 #, boost-format msgid "Add color change (%1%) for:" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1968 +#: src/slic3r/GUI/DoubleSlider.cpp:2037 msgid "Add color change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1979 +#: src/slic3r/GUI/DoubleSlider.cpp:2048 msgid "Add pause print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1983 +#: src/slic3r/GUI/DoubleSlider.cpp:2052 msgid "Add custom template" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1986 +#: src/slic3r/GUI/DoubleSlider.cpp:2055 msgid "Add custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2004 +#: src/slic3r/GUI/DoubleSlider.cpp:2073 msgid "Edit color" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2005 +#: src/slic3r/GUI/DoubleSlider.cpp:2074 msgid "Edit pause print message" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2006 +#: src/slic3r/GUI/DoubleSlider.cpp:2075 msgid "Edit custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2012 +#: src/slic3r/GUI/DoubleSlider.cpp:2081 msgid "Delete color change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2013 +#: src/slic3r/GUI/DoubleSlider.cpp:2082 msgid "Delete tool change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2014 +#: src/slic3r/GUI/DoubleSlider.cpp:2083 msgid "Delete pause print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2015 +#: src/slic3r/GUI/DoubleSlider.cpp:2084 msgid "Delete custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2025 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:2094 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to height" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2030 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 msgid "Hide ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height on the ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time on the ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Set ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2047 +#: src/slic3r/GUI/DoubleSlider.cpp:2116 msgid "Set extruder sequence for the entire print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2051 +#: src/slic3r/GUI/DoubleSlider.cpp:2120 msgid "Set auto color changes" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2086 +#: src/slic3r/GUI/DoubleSlider.cpp:2155 msgid "This action will cause deletion of all ticks on vertical slider." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2087 src/slic3r/GUI/Tab.cpp:1318 +#: src/slic3r/GUI/DoubleSlider.cpp:2156 src/slic3r/GUI/Tab.cpp:1263 msgid "" "This action is not revertible.\n" "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2088 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1133 src/slic3r/GUI/GUI.cpp:245 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:649 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:679 -#: src/slic3r/GUI/WipeTowerDialog.cpp:58 src/slic3r/GUI/WipeTowerDialog.cpp:443 +#: src/slic3r/GUI/DoubleSlider.cpp:2157 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:537 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1119 src/slic3r/GUI/GUI.cpp:258 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:721 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:751 +#: src/slic3r/GUI/WipeTowerDialog.cpp:60 src/slic3r/GUI/WipeTowerDialog.cpp:445 msgid "Warning" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2216 +#: src/slic3r/GUI/DoubleSlider.cpp:2285 msgid "Enter custom G-code used on current layer" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2217 +#: src/slic3r/GUI/DoubleSlider.cpp:2286 #, boost-format msgid "Custom G-code on current layer (%1% mm)." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2238 +#: src/slic3r/GUI/DoubleSlider.cpp:2307 msgid "Enter short message shown on Printer display when a print is paused" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2239 +#: src/slic3r/GUI/DoubleSlider.cpp:2308 #, boost-format msgid "Message for pause print on current layer (%1% mm)." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the move you want to jump to" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the height you want to jump to" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2515 +#: src/slic3r/GUI/DoubleSlider.cpp:2584 msgid "The last color change data was saved for a single extruder printing." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2516 src/slic3r/GUI/DoubleSlider.cpp:2532 +#: src/slic3r/GUI/DoubleSlider.cpp:2585 src/slic3r/GUI/DoubleSlider.cpp:2601 msgid "The last color change data was saved for a multi extruder printing." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2518 +#: src/slic3r/GUI/DoubleSlider.cpp:2587 msgid "Your current changes will delete all saved color changes." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2519 src/slic3r/GUI/DoubleSlider.cpp:2540 +#: src/slic3r/GUI/DoubleSlider.cpp:2588 src/slic3r/GUI/DoubleSlider.cpp:2609 msgid "Are you sure you want to continue?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2533 +#: src/slic3r/GUI/DoubleSlider.cpp:2602 msgid "" "Select YES if you want to delete all saved tool changes, \n" "NO if you want all tool changes switch to color changes, \n" "or CANCEL to leave it unchanged." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2536 +#: src/slic3r/GUI/DoubleSlider.cpp:2605 msgid "Do you want to delete all saved tool changes?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2538 +#: src/slic3r/GUI/DoubleSlider.cpp:2607 msgid "" "The last color change data was saved for a multi extruder printing with tool " "changes for whole print." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2539 +#: src/slic3r/GUI/DoubleSlider.cpp:2608 msgid "Your current changes will delete all saved extruder (tool) changes." msgstr "" -#: src/slic3r/GUI/ExtraRenderers.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:538 -#: src/slic3r/GUI/GUI_ObjectList.cpp:550 src/slic3r/GUI/GUI_ObjectList.cpp:979 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4291 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:250 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:352 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:376 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:607 src/libslic3r/PrintConfig.cpp:800 +#: src/slic3r/GUI/Downloader.cpp:150 +#, boost-format +msgid "" +"Download won't start. Download URL doesn't point to https://files.printables." +"com : %1%" +msgstr "" + +#: src/slic3r/GUI/Downloader.cpp:181 +msgid "The download has failed:" +msgstr "" + +#: src/slic3r/GUI/DownloaderFileGet.cpp:193 +#, boost-format +msgid "Can't create file at %1%." +msgstr "" + +#: src/slic3r/GUI/ExtraRenderers.cpp:323 src/slic3r/GUI/GUI_ObjectList.cpp:571 +#: src/slic3r/GUI/GUI_ObjectList.cpp:583 src/slic3r/GUI/GUI_ObjectList.cpp:1043 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2125 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3013 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4884 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:259 src/libslic3r/PrintConfig.cpp:894 msgid "default" msgstr "" @@ -1547,10 +1747,10 @@ msgid "Set extruder change for every" msgstr "" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:60 -#: src/libslic3r/PrintConfig.cpp:662 src/libslic3r/PrintConfig.cpp:1430 -#: src/libslic3r/PrintConfig.cpp:2135 src/libslic3r/PrintConfig.cpp:2310 -#: src/libslic3r/PrintConfig.cpp:2386 src/libslic3r/PrintConfig.cpp:2639 -#: src/libslic3r/PrintConfig.cpp:2687 src/libslic3r/PrintConfig.cpp:2706 +#: src/libslic3r/PrintConfig.cpp:765 src/libslic3r/PrintConfig.cpp:1476 +#: src/libslic3r/PrintConfig.cpp:2165 src/libslic3r/PrintConfig.cpp:2343 +#: src/libslic3r/PrintConfig.cpp:2417 src/libslic3r/PrintConfig.cpp:2665 +#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2728 msgid "layers" msgstr "" @@ -1582,42 +1782,42 @@ msgstr "" msgid "Add extruder to sequence" msgstr "" -#: src/slic3r/GUI/Field.cpp:190 +#: src/slic3r/GUI/Field.cpp:188 msgid "default value" msgstr "" -#: src/slic3r/GUI/Field.cpp:193 +#: src/slic3r/GUI/Field.cpp:191 msgid "parameter name" msgstr "" -#: src/slic3r/GUI/Field.cpp:204 src/slic3r/GUI/OptionsGroup.cpp:827 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1067 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1079 +#: src/slic3r/GUI/Field.cpp:206 src/slic3r/GUI/OptionsGroup.cpp:852 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1074 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1086 msgid "N/A" msgstr "" -#: src/slic3r/GUI/Field.cpp:226 src/slic3r/GUI/Field.cpp:298 +#: src/slic3r/GUI/Field.cpp:229 src/slic3r/GUI/Field.cpp:302 #, c-format, boost-format msgid "%s doesn't support percentage" msgstr "" -#: src/slic3r/GUI/Field.cpp:266 +#: src/slic3r/GUI/Field.cpp:269 #, c-format, boost-format msgid "" "Input value is out of range\n" "Are you sure that %s is a correct value and that you want to continue?" msgstr "" -#: src/slic3r/GUI/Field.cpp:269 src/slic3r/GUI/Field.cpp:343 +#: src/slic3r/GUI/Field.cpp:272 src/slic3r/GUI/Field.cpp:347 msgid "Parameter validation" msgstr "" -#: src/slic3r/GUI/Field.cpp:282 src/slic3r/GUI/Field.cpp:390 -#: src/slic3r/GUI/Field.cpp:1573 +#: src/slic3r/GUI/Field.cpp:285 src/slic3r/GUI/Field.cpp:394 +#: src/slic3r/GUI/Field.cpp:1597 msgid "Input value is out of range" msgstr "" -#: src/slic3r/GUI/Field.cpp:340 +#: src/slic3r/GUI/Field.cpp:344 #, c-format, boost-format msgid "" "Do you mean %s%% instead of %s %s?\n" @@ -1625,13 +1825,22 @@ msgid "" "or NO if you are sure that %s %s is a correct value." msgstr "" -#: src/slic3r/GUI/Field.cpp:397 +#: src/slic3r/GUI/Field.cpp:401 #, boost-format msgid "" "Invalid input format. Expected vector of dimensions in the following format: " "\"%1%\"" msgstr "" +#: src/slic3r/GUI/FileArchiveDialog.cpp:170 +msgid "Archive preview" +msgstr "" + +#: src/slic3r/GUI/FileArchiveDialog.cpp:270 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +msgid "Open" +msgstr "" + #: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flash!" msgstr "" @@ -1708,12 +1917,6 @@ msgstr "" msgid "Select a file" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:815 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:297 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:372 -msgid "Browse" -msgstr "" - #: src/slic3r/GUI/FirmwareDialog.cpp:817 msgid "Serial port:" msgstr "" @@ -1743,10 +1946,10 @@ msgid "Advanced: Output log" msgstr "" #: src/slic3r/GUI/FirmwareDialog.cpp:862 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:310 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:358 #: src/slic3r/GUI/Mouse3DController.cpp:543 -#: src/slic3r/GUI/PrintHostDialogs.cpp:261 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:122 +#: src/slic3r/GUI/PrintHostDialogs.cpp:313 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:125 msgid "Close" msgstr "" @@ -1764,7 +1967,7 @@ msgstr "" msgid "Cancelling..." msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1488 msgid "Shape Gallery" msgstr "" @@ -1772,904 +1975,1908 @@ msgstr "" msgid "Select shape from the gallery" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:100 -msgid "Add to bed" -msgstr "" - -#: src/slic3r/GUI/GalleryDialog.cpp:101 -msgid "Add selected shape(s) to the bed" -msgstr "" - -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4152 +#: src/slic3r/GUI/GalleryDialog.cpp:114 src/slic3r/GUI/Tab.cpp:4377 msgid "Add" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:117 +#: src/slic3r/GUI/GalleryDialog.cpp:114 msgid "Add one or more custom shapes" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:506 -#: src/slic3r/GUI/GLCanvas3D.cpp:4547 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/GalleryDialog.cpp:115 src/slic3r/GUI/GalleryDialog.cpp:528 +#: src/slic3r/GUI/GLCanvas3D.cpp:4638 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/GUI_Factories.cpp:460 src/slic3r/GUI/Tab.cpp:3973 msgid "Delete" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:118 +#: src/slic3r/GUI/GalleryDialog.cpp:115 msgid "Delete one or more custom shape. You can't delete system shapes" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:400 +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "Add to bed" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "OK" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:143 +msgid "Add selected shape(s) to the bed" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:422 msgid "Choose one or more files (STL, OBJ):" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:440 +#: src/slic3r/GUI/GalleryDialog.cpp:462 #, boost-format msgid "" "It looks like selected %1%-file has an error or is destructed.\n" "We can't load this file" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:451 +#: src/slic3r/GUI/GalleryDialog.cpp:473 msgid "Choose one PNG file:" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:464 +#: src/slic3r/GUI/GalleryDialog.cpp:486 msgid "Replacing of the PNG" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:508 +#: src/slic3r/GUI/GalleryDialog.cpp:530 msgid "Change thumbnail" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:549 src/slic3r/GUI/GalleryDialog.cpp:554 +#: src/slic3r/GUI/GalleryDialog.cpp:571 src/slic3r/GUI/GalleryDialog.cpp:576 #, boost-format msgid "Loading of the \"%1%\"" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:274 +#: src/slic3r/GUI/GCodeViewer.cpp:343 msgid "Tool position" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1457 +#: src/slic3r/GUI/GCodeViewer.cpp:1547 msgid "Generating toolpaths" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1517 +#: src/slic3r/GUI/GCodeViewer.cpp:1619 msgid "Generating vertex buffer" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1857 +#: src/slic3r/GUI/GCodeViewer.cpp:1979 msgid "Generating index buffers" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to hide" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to show" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3181 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 msgid "up to" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3187 +#: src/slic3r/GUI/GCodeViewer.cpp:3455 msgid "above" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "from" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "to" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3245 src/slic3r/GUI/GCodeViewer.cpp:3246 -#: src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3513 src/slic3r/GUI/GCodeViewer.cpp:3514 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 msgid "Percentage" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3570 msgid "Feature type" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3592 #: src/slic3r/GUI/RammingChart.cpp:90 msgid "Time" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3295 src/slic3r/GUI/GCodeViewer.cpp:3306 -#: src/slic3r/GUI/GCodeViewer.cpp:3566 -msgid "Used filament" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3298 +#: src/slic3r/GUI/GCodeViewer.cpp:3571 msgid "Height (mm)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3299 +#: src/slic3r/GUI/GCodeViewer.cpp:3572 msgid "Width (mm)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3300 +#: src/slic3r/GUI/GCodeViewer.cpp:3573 msgid "Speed (mm/s)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3301 -msgid "Fan Speed (%)" +#: src/slic3r/GUI/GCodeViewer.cpp:3574 +msgid "Fan speed (%)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3302 +#: src/slic3r/GUI/GCodeViewer.cpp:3575 msgid "Temperature (°C)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3303 +#: src/slic3r/GUI/GCodeViewer.cpp:3576 msgid "Volumetric flow rate (mm³/s)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3306 src/slic3r/GUI/GUI_Preview.cpp:224 -#: src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3577 +msgid "Layer time (linear)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3578 +msgid "Layer time (logarithmic)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3579 msgid "Tool" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3309 src/slic3r/GUI/GUI_Preview.cpp:225 -#: src/slic3r/GUI/GUI_Preview.cpp:957 +#: src/slic3r/GUI/GCodeViewer.cpp:3580 msgid "Color Print" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3347 src/slic3r/GUI/GCodeViewer.cpp:3393 -#: src/slic3r/GUI/GCodeViewer.cpp:3398 src/slic3r/GUI/GUI_ObjectList.cpp:312 -#: src/slic3r/GUI/wxExtensions.cpp:536 src/libslic3r/PrintConfig.cpp:795 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 src/slic3r/GUI/GCodeViewer.cpp:3594 +#: src/slic3r/GUI/GCodeViewer.cpp:3860 +msgid "Used filament" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3623 src/slic3r/GUI/GCodeViewer.cpp:4067 +#: src/libslic3r/PrintConfig.cpp:3025 +msgid "Travel" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3640 src/slic3r/GUI/GCodeViewer.cpp:3685 +#: src/slic3r/GUI/GCodeViewer.cpp:3689 src/slic3r/GUI/GUI_ObjectList.cpp:338 +#: src/slic3r/GUI/wxExtensions.cpp:547 src/libslic3r/PrintConfig.cpp:888 msgid "Extruder" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3370 +#: src/slic3r/GUI/GCodeViewer.cpp:3662 msgid "Default color" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3393 +#: src/slic3r/GUI/GCodeViewer.cpp:3685 msgid "default color" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3491 src/slic3r/GUI/GCodeViewer.cpp:3547 +#: src/slic3r/GUI/GCodeViewer.cpp:3785 src/slic3r/GUI/GCodeViewer.cpp:3841 msgid "Color change" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3510 src/slic3r/GUI/GCodeViewer.cpp:3545 +#: src/slic3r/GUI/GCodeViewer.cpp:3804 src/slic3r/GUI/GCodeViewer.cpp:3839 msgid "Print" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3546 src/slic3r/GUI/GCodeViewer.cpp:3580 +#: src/slic3r/GUI/GCodeViewer.cpp:3840 src/slic3r/GUI/GCodeViewer.cpp:3874 msgid "Pause" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Event" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Remaining time" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Duration" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3609 src/slic3r/GUI/GUI_Preview.cpp:1049 -#: src/libslic3r/PrintConfig.cpp:2937 -msgid "Travel" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3612 -msgid "Movement" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3613 -msgid "Extrusion" +#: src/slic3r/GUI/GCodeViewer.cpp:3928 src/slic3r/GUI/GUI.cpp:332 +#: src/slic3r/GUI/Plater.cpp:852 src/libslic3r/PrintConfig.cpp:335 +msgid "Printer" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1870 -#: src/slic3r/GUI/Tab.cpp:2812 -msgid "Retraction" +#: src/slic3r/GUI/GCodeViewer.cpp:3931 src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/Plater.cpp:848 +msgid "Print settings" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3631 src/slic3r/GUI/GCodeViewer.cpp:3634 -#: src/slic3r/GUI/GUI_Preview.cpp:1050 -msgid "Wipe" +#: src/slic3r/GUI/GCodeViewer.cpp:3936 src/slic3r/GUI/GUI.cpp:330 +#: src/slic3r/GUI/Plater.cpp:849 src/slic3r/GUI/Tab.cpp:1930 +#: src/slic3r/GUI/Tab.cpp:1931 +msgid "Filament" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3666 src/slic3r/GUI/GUI_Preview.cpp:257 -#: src/slic3r/GUI/GUI_Preview.cpp:272 -msgid "Options" +#: src/slic3r/GUI/GCodeViewer.cpp:3950 +msgid "Estimated printing times" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3669 src/slic3r/GUI/GUI_Preview.cpp:1051 -msgid "Retractions" +#: src/slic3r/GUI/GCodeViewer.cpp:3969 +msgid "Normal mode" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3670 src/slic3r/GUI/GUI_Preview.cpp:1052 -msgid "Deretractions" +#: src/slic3r/GUI/GCodeViewer.cpp:3970 +msgid "Stealth mode" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3671 src/slic3r/GUI/GUI_Preview.cpp:1053 -msgid "Seams" +#: src/slic3r/GUI/GCodeViewer.cpp:3979 src/libslic3r/PrintConfig.cpp:1249 +#: src/libslic3r/PrintConfig.cpp:1267 src/libslic3r/PrintConfig.cpp:1277 +#: src/libslic3r/PrintConfig.cpp:1322 +msgid "First layer" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3672 src/slic3r/GUI/GUI_Preview.cpp:1054 -msgid "Tool changes" +#: src/slic3r/GUI/GCodeViewer.cpp:3983 +msgid "Total" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3673 src/slic3r/GUI/GUI_Preview.cpp:1055 -msgid "Color changes" +#: src/slic3r/GUI/GCodeViewer.cpp:4002 +msgid "Show stealth mode" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3674 src/slic3r/GUI/GUI_Preview.cpp:1056 -msgid "Print pauses" +#: src/slic3r/GUI/GCodeViewer.cpp:4006 +msgid "Show normal mode" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3675 src/slic3r/GUI/GUI_Preview.cpp:1057 -msgid "Custom G-codes" +#: src/slic3r/GUI/GCodeViewer.cpp:4071 +msgid "Wipe" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3695 src/slic3r/GUI/GCodeViewer.cpp:3714 -#: src/slic3r/GUI/GUI.cpp:341 src/slic3r/GUI/Plater.cpp:822 -#: src/libslic3r/PrintConfig.cpp:322 -msgid "Printer" +#: src/slic3r/GUI/GCodeViewer.cpp:4075 +msgid "Retractions" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3697 src/slic3r/GUI/GCodeViewer.cpp:3719 -#: src/slic3r/GUI/GUI.cpp:337 src/slic3r/GUI/Plater.cpp:818 -msgid "Print settings" +#: src/slic3r/GUI/GCodeViewer.cpp:4079 +msgid "Deretractions" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 -#: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1970 src/slic3r/GUI/Tab.cpp:1971 -msgid "Filament" +#: src/slic3r/GUI/GCodeViewer.cpp:4083 +msgid "Seams" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3739 -msgid "Estimated printing times" +#: src/slic3r/GUI/GCodeViewer.cpp:4087 +msgid "Tool changes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3758 -msgid "Normal mode" +#: src/slic3r/GUI/GCodeViewer.cpp:4091 +msgid "Color changes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3759 -msgid "Stealth mode" +#: src/slic3r/GUI/GCodeViewer.cpp:4095 +msgid "Print pauses" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3766 src/libslic3r/PrintConfig.cpp:1189 -#: src/libslic3r/PrintConfig.cpp:1207 src/libslic3r/PrintConfig.cpp:1217 -#: src/libslic3r/PrintConfig.cpp:1262 -msgid "First layer" +#: src/slic3r/GUI/GCodeViewer.cpp:4099 +msgid "Custom G-codes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3767 -msgid "Total" +#: src/slic3r/GUI/GCodeViewer.cpp:4103 +msgid "Center of gravity" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3796 -msgid "Show stealth mode" +#: src/slic3r/GUI/GCodeViewer.cpp:4108 +msgid "Shells" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3800 -msgid "Show normal mode" +#: src/slic3r/GUI/GCodeViewer.cpp:4113 +msgid "Tool marker" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:225 src/slic3r/GUI/GLCanvas3D.cpp:4694 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:53 +#: src/slic3r/GUI/GLCanvas3D.cpp:185 src/slic3r/GUI/GLCanvas3D.cpp:4784 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:71 msgid "Variable layer height" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:227 +#: src/slic3r/GUI/GLCanvas3D.cpp:187 msgid "Left mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:229 +#: src/slic3r/GUI/GLCanvas3D.cpp:189 msgid "Add detail" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:231 +#: src/slic3r/GUI/GLCanvas3D.cpp:191 msgid "Right mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:233 +#: src/slic3r/GUI/GLCanvas3D.cpp:193 msgid "Remove detail" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:235 +#: src/slic3r/GUI/GLCanvas3D.cpp:195 msgid "Shift + Left mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:237 +#: src/slic3r/GUI/GLCanvas3D.cpp:197 msgid "Reset to base" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:239 +#: src/slic3r/GUI/GLCanvas3D.cpp:199 msgid "Shift + Right mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:241 +#: src/slic3r/GUI/GLCanvas3D.cpp:201 msgid "Smoothing" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:243 +#: src/slic3r/GUI/GLCanvas3D.cpp:203 msgid "Mouse wheel:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:245 +#: src/slic3r/GUI/GLCanvas3D.cpp:205 msgid "Increase/decrease edit area" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:248 +#: src/slic3r/GUI/GLCanvas3D.cpp:208 msgid "Adaptive" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:254 +#: src/slic3r/GUI/GLCanvas3D.cpp:214 msgid "Quality / Speed" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:257 +#: src/slic3r/GUI/GLCanvas3D.cpp:217 msgid "Higher print quality versus higher print speed." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:268 +#: src/slic3r/GUI/GLCanvas3D.cpp:228 msgid "Smooth" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:274 src/libslic3r/PrintConfig.cpp:819 +#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/libslic3r/PrintConfig.cpp:908 msgid "Radius" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:286 +#: src/slic3r/GUI/GLCanvas3D.cpp:246 msgid "Keep min" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:295 src/slic3r/GUI/GLCanvas3D.cpp:4123 +#: src/slic3r/GUI/GLCanvas3D.cpp:255 src/slic3r/GUI/GLCanvas3D.cpp:4217 msgid "Reset" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:561 +#: src/slic3r/GUI/GLCanvas3D.cpp:602 msgid "Variable layer height - Manual edit" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:676 +#: src/slic3r/GUI/GLCanvas3D.cpp:717 msgid "Seq." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1310 +#: src/slic3r/GUI/GLCanvas3D.cpp:1319 msgid "Variable layer height - Reset" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1318 +#: src/slic3r/GUI/GLCanvas3D.cpp:1327 msgid "Variable layer height - Adaptive" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1326 +#: src/slic3r/GUI/GLCanvas3D.cpp:1335 msgid "Variable layer height - Smooth all" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1733 +#: src/slic3r/GUI/GLCanvas3D.cpp:1778 msgid "Mirror Object" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:2612 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:560 +#: src/slic3r/GUI/GLCanvas3D.cpp:2542 src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:117 msgid "Gizmo-Move" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:2695 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562 +#: src/slic3r/GUI/GLCanvas3D.cpp:2638 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:661 msgid "Gizmo-Rotate" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3300 +#: src/slic3r/GUI/GLCanvas3D.cpp:3263 msgid "Move Object" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3821 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3513 +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:40 +msgid "Gizmo-Place on Face" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3904 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Switch to Settings" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3822 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3905 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Print Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Filament Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Material Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3824 src/slic3r/GUI/GLCanvas3D.cpp:4657 +#: src/slic3r/GUI/GLCanvas3D.cpp:3907 src/slic3r/GUI/GLCanvas3D.cpp:4746 msgid "Printer Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Undo History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Redo History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4011 src/slic3r/GUI/GLCanvas3D.cpp:4673 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 src/slic3r/GUI/Search.cpp:426 +#: src/slic3r/GUI/GLCanvas3D.cpp:4106 src/slic3r/GUI/GLCanvas3D.cpp:4762 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/Search.cpp:482 msgid "Search" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4025 src/slic3r/GUI/GLCanvas3D.cpp:4033 -#: src/slic3r/GUI/Search.cpp:432 +#: src/slic3r/GUI/GLCanvas3D.cpp:4120 src/slic3r/GUI/GLCanvas3D.cpp:4128 +#: src/slic3r/GUI/Search.cpp:488 msgid "Enter a search term" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4064 +#: src/slic3r/GUI/GLCanvas3D.cpp:4160 msgid "Arrange options" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4097 +#: src/slic3r/GUI/GLCanvas3D.cpp:4193 #, boost-format msgid "Press %1%left mouse button to enter the exact value" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4099 +#: src/slic3r/GUI/GLCanvas3D.cpp:4195 msgid "Spacing" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4106 -msgid "Enable rotations (slow)" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Alignment" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:4500 -msgid "Center" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear left" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front left" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front right" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear right" +#: src/slic3r/GUI/GLCanvas3D.cpp:4202 +msgid "Spacing from bed" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:2271 -msgid "Random" +#: src/slic3r/GUI/GLCanvas3D.cpp:4209 +msgid "Enable rotations (slow)" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4133 src/slic3r/GUI/GLCanvas3D.cpp:4565 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Plater.cpp:1664 +#: src/slic3r/GUI/GLCanvas3D.cpp:4228 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 src/slic3r/GUI/Plater.cpp:7118 msgid "Arrange" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4539 +#: src/slic3r/GUI/GLCanvas3D.cpp:4630 msgid "Add..." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4556 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5509 src/slic3r/GUI/Tab.cpp:4158 +#: src/slic3r/GUI/GLCanvas3D.cpp:4647 src/slic3r/GUI/KBShortcutsDialog.cpp:105 +#: src/slic3r/GUI/Plater.cpp:6047 src/slic3r/GUI/Tab.cpp:4383 msgid "Delete all" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 src/slic3r/GUI/KBShortcutsDialog.cpp:133 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 src/slic3r/GUI/KBShortcutsDialog.cpp:142 msgid "Arrange selection" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 msgid "Click right mouse button to show arrangement options" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4587 +#: src/slic3r/GUI/GLCanvas3D.cpp:4676 msgid "Copy" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4596 +#: src/slic3r/GUI/GLCanvas3D.cpp:4685 msgid "Paste" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4608 src/slic3r/GUI/GUI_Factories.cpp:1084 -#: src/slic3r/GUI/GUI_Factories.cpp:1108 src/slic3r/GUI/GUI_Factories.cpp:1119 +#: src/slic3r/GUI/GLCanvas3D.cpp:4697 src/slic3r/GUI/GUI_Factories.cpp:1237 +#: src/slic3r/GUI/GUI_Factories.cpp:1261 src/slic3r/GUI/GUI_Factories.cpp:1272 msgid "Add instance" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4619 src/slic3r/GUI/GUI_Factories.cpp:1087 +#: src/slic3r/GUI/GLCanvas3D.cpp:4708 src/slic3r/GUI/GUI_Factories.cpp:1240 msgid "Remove instance" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4632 +#: src/slic3r/GUI/GLCanvas3D.cpp:4721 msgid "Split to objects" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4642 +#: src/slic3r/GUI/GLCanvas3D.cpp:4731 msgid "Split to parts" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/GLCanvas3D.cpp:4795 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/GLCanvas3D.cpp:4874 msgid "Click right mouse button to open/close History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4779 +#: src/slic3r/GUI/GLCanvas3D.cpp:4859 #, boost-format msgid "Next Undo action: %1%" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4795 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/GLCanvas3D.cpp:4874 src/slic3r/GUI/KBShortcutsDialog.cpp:107 +#: src/slic3r/GUI/MainFrame.cpp:1429 msgid "Redo" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4817 +#: src/slic3r/GUI/GLCanvas3D.cpp:4895 #, boost-format msgid "Next Redo action: %1%" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6434 +#: src/slic3r/GUI/GLCanvas3D.cpp:6784 msgid "An object outside the print area was detected." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6435 +#: src/slic3r/GUI/GLCanvas3D.cpp:6785 msgid "A toolpath outside the print area was detected." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6436 +#: src/slic3r/GUI/GLCanvas3D.cpp:6786 msgid "SLA supports outside the print area were detected." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6437 +#: src/slic3r/GUI/GLCanvas3D.cpp:6787 msgid "Some objects are not visible during editing." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6439 +#: src/slic3r/GUI/GLCanvas3D.cpp:6789 msgid "" "An object outside the print area was detected.\n" "Resolve the current problem to continue slicing." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6513 +#: src/slic3r/GUI/GLCanvas3D.cpp:6864 msgid "Selection-Add from rectangle" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6528 +#: src/slic3r/GUI/GLCanvas3D.cpp:6879 msgid "Selection-Remove from rectangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4478 -msgid "Cut" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:206 +msgid "Planar" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -msgid "in" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Auto" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 -msgid "Keep upper part" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Manual" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 -msgid "Keep lower part" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:213 +msgid "Plug" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:196 -msgid "Rotate lower part upwards" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:214 +msgid "Dowel" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:201 -msgid "Perform cut" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Prism" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:49 -msgid "Paint-on supports" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Frustum" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Triangle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Square" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Hexagon" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:59 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 +msgid "Circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:233 +msgid "Keep orientation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:234 +msgid "Place on cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:235 +msgid "Flip upside down" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +msgid "inch" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 +msgid "Part" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 src/libslic3r/Print.cpp:1236 +msgid "Object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:264 +msgid "" +"Click to flip the cut plane\n" +"Drag to move the cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:269 src/libslic3r/PrintConfig.cpp:498 +#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2325 src/libslic3r/PrintConfig.cpp:2613 +#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2876 src/libslic3r/PrintConfig.cpp:2907 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3231 +#: src/libslic3r/PrintConfig.cpp:3466 src/libslic3r/PrintConfig.cpp:3951 +msgid "°" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:367 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:571 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1232 +msgid "Move cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +msgid "in" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:544 +msgid "Value" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:549 +msgid "Tolerance" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 +msgid "Left click" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2348 +msgid "Add connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 +msgid "Right click" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +msgid "Remove connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 +msgid "Drag" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1216 +msgid "Move connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +msgid "Add connector to selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +msgid "Remove connector from selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:870 +msgid "Select all connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:894 src/libslic3r/PrintConfig.cpp:4644 +msgid "Cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1227 +msgid "Rotate cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1448 +msgid "Render cut plane as circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1537 +msgid "Connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1541 +msgid "Remove connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1550 +msgid "Type" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1561 src/libslic3r/PrintConfig.cpp:2816 +msgid "Style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1568 +msgid "Depth ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1586 +msgid "Confirm connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1652 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1666 +msgid "Flip cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1710 +msgid "Hold SHIFT key to draw a cut line" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1716 +msgid "Cut position: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1725 +msgid "Reset cutting plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Edit connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Add connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1744 +msgid "Reset cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1745 +msgid "Reset cutting plane and remove connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1800 +msgid "After cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1820 +msgid "Cut to" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1823 +msgid "Objects" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1826 +msgid "Parts" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1840 +msgid "Perform cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1930 +msgid "Invalid connectors detected" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1932 +#, c-format, boost-format +msgid "%1$d connector is out of cut contour" +msgid_plural "%1$d connectors are out of cut contour" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1935 +#, c-format, boost-format +msgid "%1$d connector is out of object" +msgid_plural "%1$d connectors are out of object" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1938 +msgid "Some connectors are overlapped" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1942 +msgid "" +"Invalid state. \n" +"No one part is selected for keep after cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1944 +msgid "" +"Warning state. \n" +"Cut plane is placed out of object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2153 +msgid "Connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2183 +msgid "Cut by Plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2323 +msgid "Cut by line" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2373 +msgid "Delete connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:252 +msgid "Entering Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:253 +msgid "Leaving Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:254 +msgid "Cut gizmo editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:601 +msgid "Emboss" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:866 +msgid "ERROR: Wait until ends or Cancel process." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:921 +msgid "Text-Rotate" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:953 +msgid "Font" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:954 +#: src/libslic3r/PrintConfig.cpp:897 +msgid "Height" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:955 +msgid "Depth" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:963 +msgid "Use surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:964 +msgid "Char gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:965 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Line gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:966 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:967 +msgid "Skew ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:968 +msgid "Z-move" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:969 +msgid "Z-rot" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:970 +msgid "Collection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1047 +msgid "NORMAL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1048 +msgid "SMALL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1049 +msgid "ITALIC" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1050 +msgid "SWISS" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1051 +msgid "MODERN" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1088 +msgid "First font" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1093 +msgid "Default font" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1098 +msgid "Embossed text" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1513 +msgid "Warning: No font is selected. Select correct one." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1531 +#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1437 +#: src/slic3r/GUI/Tab.cpp:1472 src/slic3r/GUI/Tab.cpp:1607 +#: src/slic3r/GUI/Tab.cpp:1611 src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:2390 src/slic3r/GUI/Tab.cpp:4985 +#: src/libslic3r/PrintConfig.cpp:276 src/libslic3r/PrintConfig.cpp:514 +#: src/libslic3r/PrintConfig.cpp:1484 src/libslic3r/PrintConfig.cpp:1566 +#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:2562 +#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:3166 +#: src/libslic3r/PrintConfig.cpp:3200 src/libslic3r/PrintConfig.cpp:3211 +#: src/libslic3r/PrintConfig.cpp:3226 src/libslic3r/PrintConfig.cpp:3239 +#: src/libslic3r/PrintConfig.cpp:3248 src/libslic3r/PrintConfig.cpp:3260 +#: src/libslic3r/PrintConfig.cpp:3642 +msgid "Advanced" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1631 +msgid "Can't write text by selected font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1632 +msgid "Try to choose another font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Empty" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Embossed text can NOT contain only white spaces." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Bad symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Text contain character glyph (represented by '?') unknown by font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:535 +msgid "Skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +msgid "Unsupported visualization of font skew for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Unsupported visualization of font boldness for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Unsupported visualization of gap between lines inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Too tall" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Diminished font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Too small" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Enlarged font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1660 +#, boost-format +msgid "%1% is NOT shown." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1964 +msgid " No symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1965 +msgid " ... Loading" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2015 +msgid " ... In queue" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2132 +#, boost-format +msgid "Font face \"%1%\" can't be selected." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2180 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:754 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:367 +msgid "Apply" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2192 +msgid "add file with font(.ttf, .ttc)" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2202 +msgid "Open dialog for choose from fonts." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2210 +msgid "Text is to object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2224 +msgid "Added" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2227 +msgid "Click to change text into object part." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2230 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4321 +msgid "You can't change a type of the last solid part of the object." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2231 +msgid "Subtracted" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2237 +msgid "Click to change part type into negative volume." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2243 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4338 +msgid "Modifier" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2249 +msgid "Click to change part type into modifier." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2256 +msgid "Change Text Type" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2287 +#, boost-format +msgid "Rename style(%1%) for embossing text: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2299 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2384 +msgid "Name can't be empty." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2301 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2386 +msgid "Name has to be unique." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2310 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2397 +msgid "ok" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2312 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2401 +msgid "cancel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2337 +msgid "Rename style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2344 +msgid "Rename current style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2345 +msgid "Can't rename temporary style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2362 +msgid "First Add style to list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2364 +#, boost-format +msgid "Save %1% style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2366 +msgid "No changes to save." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2373 +msgid "New name of style: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2422 +msgid "Save as new style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2434 +msgid "Only valid font can be added to style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2436 +msgid "Add style to my list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2438 +msgid "Add as new named style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2454 +msgid "Remove style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2485 +#, boost-format +msgid "Delete \"%1%\" style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2486 +#, boost-format +msgid "Can't delete \"%1%\". It is last style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2487 +#, boost-format +msgid "Can't delete temporary style \"%1%\"." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2494 +#, boost-format +msgid "" +"Are you sure,\n" +"that you want permanently and unrecoverable \n" +"remove style \"%1%\"?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2496 +msgid "Yes" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2505 +msgid "No" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2555 +msgid "Presets" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2564 src/slic3r/GUI/GUI_App.cpp:2324 +msgid "modified" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2617 +#, boost-format +msgid "Modified style \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2618 +#, boost-format +msgid "Current style is \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2625 +msgid "Style modification will be lost." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2627 +#, boost-format +msgid "" +"Changing style to '%1%' will discard current style modification.\n" +"\n" +" Would you like to continue anyway?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2643 +msgid "Not valid style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2644 +#, boost-format +msgid "Style '%1%' can't be used and will be removed from list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2691 +msgid "Unset italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2708 +msgid "Set italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2738 +msgid "Unset bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2756 +msgid "Set bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2922 +msgid "WxFont is not loaded properly." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2957 +msgid "Revert font changes." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2991 +msgid "wx Make bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3002 +msgid "Revert text size." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3029 +msgid "Revert embossed depth." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3178 +msgid "" +"Advanced font options could be changed only for correct font.\n" +"Start with select correct font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3219 +msgid "Revert using of model surface." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3232 +msgid "font points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3241 +msgid "Revert gap between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3242 +msgid "Distance between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3257 +msgid "Revert gap between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3258 +msgid "Distance between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3272 +msgid "Undo boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3273 +msgid "Tiny / Wide glyphs" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3283 +msgid "Undo letter's skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3284 +msgid "Italic strength ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3304 +msgid "Undo translation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3305 +msgid "Distance of the center of text from model surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3350 +msgid "Undo rotation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3352 +msgid "Rotate text Clock-wise." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3386 +msgid "Select from True Type Collection." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3395 +msgid "Set text to face camera" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3402 +msgid "Use camera direction for text orientation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3486 +#, boost-format +msgid "Font '%1%' can't be used. Please select another." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3488 +msgid "Selected font is NOT True-type." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3512 +msgid "Choose one or more files (TTF, TTC):" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3539 +msgid "Choose SVG file:" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3600 +#, boost-format +msgid "" +"Can't load exactly same font(\"%1%\"), Aplication selected a similar " +"one(\"%2%\"). You have to specify font for enable edit text." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:81 +msgid "Enter emboss gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:82 +msgid "Leave emboss gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:83 +msgid "Embossing actions" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:37 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:66 +msgid "Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 +msgid "Automatic painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 +msgid "painting..." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:107 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 msgid "Clipping of view" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:106 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 msgid "Reset direction" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:108 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 msgid "Brush size" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:109 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 msgid "Brush shape" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1816 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:110 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 msgid "Left mouse button" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 msgid "Enforce supports" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 msgid "Right mouse button" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:434 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:573 msgid "Block supports" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 msgid "Shift + Left mouse button" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:429 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:568 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:247 msgid "Remove selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 msgid "Remove all selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 -msgid "Circle" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Sphere" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:68 -#: src/libslic3r/PrintConfig.cpp:1172 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:106 +#: src/libslic3r/PrintConfig.cpp:1231 msgid "Triangles" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 msgid "Highlight overhang by angle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:63 msgid "Enforce" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 -msgid "Tool type" +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +msgid "Tool type" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 +msgid "Brush" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:68 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 +msgid "Smart fill" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 +msgid "Smart fill angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:72 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 +msgid "Split triangles" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:73 +msgid "On overhangs only" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:187 +#, boost-format +msgid "" +"Preselects faces by overhang angle. It is possible to restrict paintable " +"facets to only preselected faces when the option \"%1%\" is enabled." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:230 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:371 +msgid "Paints facets according to the chosen painting brush." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:238 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:384 +msgid "" +"Paints neighboring facets whose relative angle is less or equal to set angle." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242 +#, boost-format +msgid "Allows painting only on facets selected by: \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:257 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:412 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141 +msgid "Paints all facets inside, regardless of their orientation." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:266 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:421 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:149 +msgid "Ignores facets facing away from the camera." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:430 +msgid "Paints only one facet." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:298 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:438 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:455 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:129 +msgid "Alt + Mouse wheel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:288 +msgid "Splits bigger facets into smaller ones while the object is painted." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:321 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:476 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:167 +msgid "Ctrl + Mouse wheel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:326 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:481 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:172 +msgid "Reset selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:382 +msgid "Block supports by angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:383 +msgid "Add supports by angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +msgid "Automatic painting requires valid print setup." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:535 +msgid "Automatic painting will erase all currently painted areas." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:536 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1118 +msgid "Are you sure you want to do it?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:540 +msgid "Automatic painting support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:571 +msgid "Add supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:22 +msgid "Entering Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:23 +msgid "Leaving Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:24 +msgid "Paint-on supports editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:88 +msgid "Place on face" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:29 +msgid "Hollow this object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 +msgid "Preview hollowed and drilled model" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 +msgid "Offset" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 +msgid "Quality" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 +#: src/libslic3r/PrintConfig.cpp:4037 +msgid "Closing distance" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 +msgid "Hole diameter" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 +msgid "Hole depth" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 +msgid "Remove selected holes" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 +msgid "Remove all holes" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 +msgid "Show supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:242 +msgid "Add drainage hole" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:361 +msgid "Delete drainage hole" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:655 +msgid "Hollowing parameter change" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:739 +msgid "Change drainage hole diameter" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:827 +msgid "Hollow and drill" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:869 +msgid "Move drainage hole" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 -msgid "Brush" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:64 +msgid "No feature" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:128 -msgid "Smart fill" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:65 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:76 +msgid "Vertex" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:131 -msgid "Smart fill angle" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:66 +msgid "Edge" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:132 -msgid "Split triangles" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:68 +msgid "Plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 -msgid "On overhangs only" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:77 +msgid "Point on edge" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:174 -#, boost-format -msgid "" -"Preselects faces by overhang angle. It is possible to restrict paintable " -"facets to only preselected faces when the option \"%1%\" is enabled." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:78 +msgid "Point on circle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:217 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:378 -msgid "Paints facets according to the chosen painting brush." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:79 +msgid "Point on plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:391 -msgid "" -"Paints neighboring facets whose relative angle is less or equal to set angle." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:89 +msgid "Center of edge" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:229 -#, boost-format -msgid "Allows painting only on facets selected by: \"%1%\"" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:90 +msgid "Center of circle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:244 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:419 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:144 -msgid "Paints all facets inside, regardless of their orientation." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:554 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2029 +msgid "Measure" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:253 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:428 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:152 -msgid "Ignores facets facing away from the camera." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1236 +msgid "Edit to scale" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:262 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:437 -msgid "Paints only one facet." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1258 +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:161 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:236 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:776 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:794 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:817 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:831 +#: src/libslic3r/PrintConfig.cpp:4713 +msgid "Scale" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:270 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:285 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:445 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:462 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:132 -msgid "Alt + Mouse wheel" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1362 +msgctxt "Verb" +msgid "Scale" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 -msgid "Splits bigger facets into smaller ones while the object is painted." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1541 +msgid "##angle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:308 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:483 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:170 -msgid "Ctrl + Mouse wheel" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1740 +msgid "Measure tool debug" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:313 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:488 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:175 -msgid "Reset selection" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1824 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1851 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1857 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1886 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1893 +msgid "Unselect feature" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:364 -msgid "Block supports by angle" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1830 +msgid "Unselect center" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:365 -msgid "Add supports by angle" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1835 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1862 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1898 +msgid "Select center" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:432 -msgid "Add supports" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1840 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1867 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1903 +msgid "Unselect point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:41 -msgid "Place on face" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1846 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1873 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1910 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select feature" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 -msgid "Hollow this object" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 -msgid "Preview hollowed and drilled model" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Shift" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 -msgid "Offset" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Enable point selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:57 -msgid "Quality" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2007 +msgid "Restart selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3905 -msgid "Closing distance" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1952 +msgid "Esc" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 -msgid "Hole diameter" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1955 +msgid "Unselect" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 -msgid "Hole depth" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1999 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2001 +msgid "Selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 -msgid "Remove selected holes" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2021 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +msgid "Copy to clipboard" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 -msgid "Remove all holes" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2038 +msgid "Angle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 -msgid "Show supports" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Perpendicular distance" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:287 -msgid "Add drainage hole" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Distance" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:403 -msgid "Delete drainage hole" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2062 +msgid "Direct distance" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:590 -msgid "Hollowing parameter change" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2072 +msgid "Distance XYZ" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:667 -msgid "Change drainage hole diameter" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:163 +msgid "Entering Measure gizmo" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:761 -msgid "Hollow and drill" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:164 +msgid "Leaving Measure gizmo" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:811 -msgid "Move drainage hole" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:165 +msgid "Measure gizmo editing" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:27 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:28 #, boost-format msgid "" "Your printer has more extruders than the multi-material painting gizmo " @@ -2677,81 +3884,85 @@ msgid "" "used for painting." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:45 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:46 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 msgid "Multimaterial painting" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 msgid "First color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 msgid "Second color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:120 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:671 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:642 msgid "Remove painted color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 msgid "Clear all" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:129 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 msgid "Bucket fill" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:404 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:397 msgid "Paints neighboring facets that have the same color." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:450 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:443 msgid "Split bigger facets into smaller ones while the object is painted." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:674 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:645 #, boost-format msgid "Painted using: Extruder %1%" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:118 +msgid "Entering Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:119 +msgid "Leaving Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:120 +msgid "Multimaterial painting editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:76 msgid "Move" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:466 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4532 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:643 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:745 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:775 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:813 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:830 +#: src/libslic3r/PrintConfig.cpp:4698 msgid "Rotate" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:505 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:707 msgid "Optimize orientation" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:552 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:319 -msgid "Apply" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:79 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4547 -msgid "Scale" +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:194 +msgid "Gizmo-Scale" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 msgid "Enforce seam" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:38 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:255 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:252 msgid "Block seam" msgstr "" @@ -2759,338 +3970,342 @@ msgstr "" msgid "Seam painting" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:23 +msgid "Entering Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:24 +msgid "Leaving Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:25 +msgid "Paint-on seam editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:105 msgid "Mesh name" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:69 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:107 msgid "Detail level" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:108 msgid "Decimate ratio" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:113 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:147 #, boost-format msgid "" "Processing model '%1%' with more than 1M triangles could be slow. It is " -"highly recommend to reduce amount of triangles." +"highly recommended to reduce amount of triangles." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:116 -#: src/slic3r/GUI/GUI_Factories.cpp:705 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:150 +#: src/slic3r/GUI/GUI_Factories.cpp:789 msgid "Simplify model" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:143 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:177 msgid "Simplify" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:156 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:190 msgid "Simplification is currently only allowed when a single part is selected" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 -#: src/slic3r/GUI/PrintHostDialogs.cpp:373 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:191 +#: src/slic3r/GUI/MainFrame.cpp:1246 src/slic3r/GUI/MainFrame.cpp:1716 +#: src/slic3r/GUI/PrintHostDialogs.cpp:425 msgid "Error" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:250 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:294 msgid "Extra high" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:251 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:295 msgid "High" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:252 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:296 msgid "Medium" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:297 msgid "Low" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:254 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:298 msgid "Extra low" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:304 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#, boost-format +msgid "" +"Multipart object can be simplified only by %1%. If you want specify %2% " +"process it separately." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:352 #, c-format, boost-format msgid "%d triangles" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:307 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:355 msgid "Show wireframe" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:313 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:361 msgid "Operation already cancelling. Please wait few seconds." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:370 msgid "Can't apply when proccess preview." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:329 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:377 #, boost-format msgid "Process %1% / 100" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:479 -#, boost-format -msgid "Simplify %1%" +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:542 +msgid "Simplify " msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:543 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"simplifying the mesh." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:67 +msgid "Entering SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:68 +msgid "Leaving SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:35 msgid "Head diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:36 msgid "Lock supports under new islands" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:37 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268 msgid "Remove selected points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:38 msgid "Remove all points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1226 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1271 msgid "Apply changes" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1227 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1272 msgid "Discard changes" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 msgid "Minimal points distance" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3735 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/libslic3r/PrintConfig.cpp:3867 msgid "Support points density" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1229 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1274 msgid "Auto-generate points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 msgid "Manual editing" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:372 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:307 msgid "Add support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:522 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:460 msgid "Delete support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:702 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:626 msgid "Change point head diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:770 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:696 msgid "Support parameter change" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:876 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:806 msgid "SLA Support Points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:814 msgid "Do you want to save your manually edited support points?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:898 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:815 msgid "Save support points?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:958 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:880 msgid "Move support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1051 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:987 msgid "Support points edit" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1131 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1117 msgid "Autogeneration will erase all manually edited points." msgstr "Auto Generation will erase all manually edited points." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1132 -msgid "Are you sure you want to do it?" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1138 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1124 msgid "Autogenerate support points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1186 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 msgid "SLA gizmo keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1197 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1242 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 -msgid "Left click" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 msgid "Add point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 -msgid "Right click" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 msgid "Remove point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 -msgid "Drag" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 msgid "Move point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 msgid "Add point to selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 msgid "Remove point from selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 msgid "Select by rectangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 msgid "Deselect by rectangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1267 msgid "Select all points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Mouse wheel" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Move clipping plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1225 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1270 msgid "Reset clipping plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1228 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273 msgid "Switch to editing mode" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:196 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:204 msgid "" "ERROR: Please close all manipulators available from the left toolbar first" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:561 -msgid "Gizmo-Scale" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:673 -msgid "Gizmo-Place on Face" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:1270 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:998 msgid "" "You are currently editing SLA support points. Please, apply or discard your " "changes first." msgstr "" -#: src/slic3r/GUI/GUI.cpp:292 +#: src/slic3r/GUI/GUI.cpp:287 msgid "Undefined" msgstr "" -#: src/slic3r/GUI/GUI.cpp:317 +#: src/slic3r/GUI/GUI.cpp:308 #, boost-format msgid "%1% was substituted with %2%" msgstr "" -#: src/slic3r/GUI/GUI.cpp:326 +#: src/slic3r/GUI/GUI.cpp:317 msgid "" "Most likely the configuration was produced by a newer version of PrusaSlicer " "or by some PrusaSlicer fork." msgstr "" -#: src/slic3r/GUI/GUI.cpp:327 +#: src/slic3r/GUI/GUI.cpp:318 msgid "The following values were substituted:" msgstr "" -#: src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/GUI.cpp:319 msgid "Review the substitutions and adjust them if needed." msgstr "" -#: src/slic3r/GUI/GUI.cpp:338 src/slic3r/GUI/Plater.cpp:820 +#: src/slic3r/GUI/GUI.cpp:329 src/slic3r/GUI/Plater.cpp:850 msgid "SLA print settings" msgstr "" -#: src/slic3r/GUI/GUI.cpp:342 src/slic3r/GUI/PhysicalPrinterDialog.cpp:157 +#: src/slic3r/GUI/GUI.cpp:333 src/slic3r/GUI/PhysicalPrinterDialog.cpp:158 msgid "Physical Printer" msgstr "" -#: src/slic3r/GUI/GUI.cpp:355 +#: src/slic3r/GUI/GUI.cpp:346 msgid "" "Configuration bundle was loaded, however some configuration values were not " "recognized." msgstr "" -#: src/slic3r/GUI/GUI.cpp:365 +#: src/slic3r/GUI/GUI.cpp:356 #, boost-format msgid "" "Configuration file \"%1%\" was loaded, however some configuration values " "were not recognized." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:266 +#: src/slic3r/GUI/GUI_App.cpp:275 msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:267 +#: src/slic3r/GUI/GUI_App.cpp:276 msgid "Developed by Prusa Research." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:269 +#: src/slic3r/GUI/GUI_App.cpp:278 msgid "" "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:270 -msgid "Artwork model by Leslie Ing" +#: src/slic3r/GUI/GUI_App.cpp:279 +msgid "Artwork model by Creative Tools" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:411 +#: src/slic3r/GUI/GUI_App.cpp:420 #, boost-format msgid "" "Starting with %1% 2.3, configuration directory on Linux has changed " @@ -3110,20 +4325,20 @@ msgid "" "What do you want to do now?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:419 +#: src/slic3r/GUI/GUI_App.cpp:428 #, c-format, boost-format msgid "%s - BREAKING CHANGE" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Quit, I will move my data now" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Start the application" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:699 +#: src/slic3r/GUI/GUI_App.cpp:725 #, c-format, boost-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -3133,11 +4348,11 @@ msgid "" "The application will now terminate." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:702 +#: src/slic3r/GUI/GUI_App.cpp:728 msgid "Fatal error" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:706 +#: src/slic3r/GUI/GUI_App.cpp:732 msgid "" "PrusaSlicer has encountered a localization error. Please report to " "PrusaSlicer team, what language was active and in which scenario this issue " @@ -3146,34 +4361,34 @@ msgid "" "The application will now terminate." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:709 +#: src/slic3r/GUI/GUI_App.cpp:735 msgid "Critical error" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:714 +#: src/slic3r/GUI/GUI_App.cpp:740 #, boost-format msgid "Internal error: %1%" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:909 src/slic3r/GUI/GUI_App.cpp:1007 +#: src/slic3r/GUI/GUI_App.cpp:954 src/slic3r/GUI/GUI_App.cpp:1051 msgid "" "Error parsing PrusaSlicer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error. Your user profiles will " "not be affected." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:915 src/slic3r/GUI/GUI_App.cpp:1013 +#: src/slic3r/GUI/GUI_App.cpp:960 src/slic3r/GUI/GUI_App.cpp:1057 msgid "" "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:962 +#: src/slic3r/GUI/GUI_App.cpp:1006 #, boost-format msgid "You are opening %1% version %2%." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:965 +#: src/slic3r/GUI/GUI_App.cpp:1009 #, boost-format msgid "" "The active configuration was created by %1% %2%,\n" @@ -3185,7 +4400,7 @@ msgid "" "configuration." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:973 +#: src/slic3r/GUI/GUI_App.cpp:1017 #, boost-format msgid "" "An existing configuration was found in %3%\n" @@ -3194,19 +4409,19 @@ msgid "" "Shall this configuration be imported?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:981 +#: src/slic3r/GUI/GUI_App.cpp:1025 msgid "Import" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:982 +#: src/slic3r/GUI/GUI_App.cpp:1026 msgid "Don't import" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:990 +#: src/slic3r/GUI/GUI_App.cpp:1034 msgid "Continue and import newer configuration?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1051 +#: src/slic3r/GUI/GUI_App.cpp:1095 msgid "" "You are running a 32 bit build of PrusaSlicer on 64-bit Windows.\n" "32 bit build of PrusaSlicer will likely not be able to utilize all the RAM " @@ -3216,53 +4431,44 @@ msgid "" "Do you wish to continue?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1134 +#: src/slic3r/GUI/GUI_App.cpp:1182 #, c-format, boost-format msgid "" "%s\n" "Do you want to continue?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1136 src/slic3r/GUI/GUI_App.cpp:3101 -#: src/slic3r/GUI/Plater.cpp:1726 src/slic3r/GUI/UnsavedChangesDialog.cpp:889 +#: src/slic3r/GUI/GUI_App.cpp:1184 src/slic3r/GUI/GUI_App.cpp:3302 +#: src/slic3r/GUI/Plater.cpp:1736 src/slic3r/GUI/UnsavedChangesDialog.cpp:917 msgid "Remember my choice" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1178 +#: src/slic3r/GUI/GUI_App.cpp:1226 msgid "Loading configuration" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1209 -#, boost-format -msgid "New release version %1% is available." -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:1210 -msgid "See Download page." -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:1224 +#: src/slic3r/GUI/GUI_App.cpp:1257 #, boost-format msgid "New prerelease version %1% is available." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1225 +#: src/slic3r/GUI/GUI_App.cpp:1258 msgid "See Releases page." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1262 +#: src/slic3r/GUI/GUI_App.cpp:1313 msgid "Preparing settings tabs" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1336 src/slic3r/GUI/Preferences.cpp:287 +#: src/slic3r/GUI/GUI_App.cpp:1393 src/slic3r/GUI/Preferences.cpp:405 msgid "Restore window position on start" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1338 +#: src/slic3r/GUI/GUI_App.cpp:1395 msgid "PrusaSlicer started after a crash" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1339 +#: src/slic3r/GUI/GUI_App.cpp:1396 #, boost-format msgid "" "PrusaSlicer crashed last time when attempting to set window position.\n" @@ -3275,340 +4481,374 @@ msgid "" "Otherwise, the application will most likely crash again next time." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1351 +#: src/slic3r/GUI/GUI_App.cpp:1408 #, boost-format msgid "Disable \"%1%\"" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1352 +#: src/slic3r/GUI/GUI_App.cpp:1409 #, boost-format msgid "Leave \"%1%\" enabled" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1679 +#: src/slic3r/GUI/GUI_App.cpp:1780 msgid "" "You have the following presets with saved options for \"Print Host upload\"" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1683 +#: src/slic3r/GUI/GUI_App.cpp:1784 msgid "" "But since this version of PrusaSlicer we don't show this information in " "Printer Settings anymore.\n" "Settings will be available in physical printers settings." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1685 +#: src/slic3r/GUI/GUI_App.cpp:1786 msgid "" "By default new Printer devices will be named as \"Printer N\" during its " "creation.\n" "Note: This name can be changed later from the physical printers settings" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1689 src/slic3r/GUI/PhysicalPrinterDialog.cpp:726 +#: src/slic3r/GUI/GUI_App.cpp:1790 src/slic3r/GUI/PhysicalPrinterDialog.cpp:798 msgid "Information" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1702 src/slic3r/GUI/GUI_App.cpp:1713 +#: src/slic3r/GUI/GUI_App.cpp:1803 src/slic3r/GUI/GUI_App.cpp:1814 msgid "Recreating" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1716 +#: src/slic3r/GUI/GUI_App.cpp:1817 msgid "Loading of current presets" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1721 +#: src/slic3r/GUI/GUI_App.cpp:1822 msgid "Loading of a mode view" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1859 +#: src/slic3r/GUI/GUI_App.cpp:1961 msgid "Choose one file (3MF/AMF):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1871 +#: src/slic3r/GUI/GUI_App.cpp:1973 msgid "Choose one or more files (STL/3MF/STEP/OBJ/AMF/PRUSA):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1883 +#: src/slic3r/GUI/GUI_App.cpp:1984 +msgid "Choose ZIP file:" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1996 msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1894 +#: src/slic3r/GUI/GUI_App.cpp:2007 msgid "Changing of an application language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Select the language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2182 -msgid "modified" +#: src/slic3r/GUI/GUI_App.cpp:2363 +msgid "" +"Simple mode supports manipulation with single-part object(s)\n" +"or object(s) with support modifiers only." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2236 +#: src/slic3r/GUI/GUI_App.cpp:2365 +msgid "Please check your object list before mode changing." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2366 +msgid "Change application mode" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2397 #, c-format, boost-format msgid "Run %s" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "&Configuration Snapshots" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "Inspect / activate configuration snapshots" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Take Configuration &Snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Capture a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for Configuration Updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for configuration updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2249 -msgid "&Preferences" +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for Application Updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2255 -msgid "Application preferences" +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for new version of application" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2260 src/slic3r/GUI/wxExtensions.cpp:708 -msgid "Simple" +#: src/slic3r/GUI/GUI_App.cpp:2411 +msgid "&Preferences" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2260 -msgid "Simple View Mode" +#: src/slic3r/GUI/GUI_App.cpp:2417 +msgid "Application preferences" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2262 src/slic3r/GUI/wxExtensions.cpp:710 -msgctxt "Mode" -msgid "Advanced" +#: src/slic3r/GUI/GUI_App.cpp:2422 +msgid "Simple View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2262 +#: src/slic3r/GUI/GUI_App.cpp:2424 msgid "Advanced View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2263 src/slic3r/GUI/wxExtensions.cpp:711 -msgid "Expert" -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:2263 +#: src/slic3r/GUI/GUI_App.cpp:2425 msgid "Expert View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 msgid "Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 #, c-format, boost-format msgid "%s View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2271 +#: src/slic3r/GUI/GUI_App.cpp:2433 msgid "&Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Flash Printer &Firmware" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Upload a firmware image into an Arduino based printer" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2294 +#: src/slic3r/GUI/GUI_App.cpp:2459 msgid "Taking a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2295 +#: src/slic3r/GUI/GUI_App.cpp:2460 msgid "" "Some presets are modified and the unsaved changes will not be captured by " "the configuration snapshot." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2296 +#: src/slic3r/GUI/GUI_App.cpp:2461 msgid "Snapshot name" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2312 +#: src/slic3r/GUI/GUI_App.cpp:2477 msgid "Loading a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2321 +#: src/slic3r/GUI/GUI_App.cpp:2486 #, boost-format msgid "Continue to activate a configuration snapshot %1%?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2335 +#: src/slic3r/GUI/GUI_App.cpp:2500 msgid "Failed to activate configuration snapshot." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2354 -msgid "Restart application" -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:2388 +#: src/slic3r/GUI/GUI_App.cpp:2520 msgid "Language selection" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2391 +#: src/slic3r/GUI/GUI_App.cpp:2523 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2393 src/slic3r/GUI/Preferences.cpp:582 +#: src/slic3r/GUI/GUI_App.cpp:2525 src/slic3r/GUI/Preferences.cpp:730 +#: src/slic3r/GUI/Selection.cpp:1695 msgid "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2420 +#: src/slic3r/GUI/GUI_App.cpp:2552 msgid "&Configuration" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2534 src/slic3r/GUI/GUI_App.cpp:2595 -msgid "The preset modifications are successfully saved" -msgid_plural "The presets modifications are successfully saved" -msgstr[0] "" -msgstr[1] "" +#: src/slic3r/GUI/GUI_App.cpp:2560 +msgid "Restart application" +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2598 +#: src/slic3r/GUI/GUI_App.cpp:2726 msgid "For new project all modifications will be reseted" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2636 +#: src/slic3r/GUI/GUI_App.cpp:2764 msgid "Loading a new project while the current project is modified." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Project is loading" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Opening new project while some presets are unsaved." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "The uploads are still ongoing" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "Stop them and continue anyway?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2662 +#: src/slic3r/GUI/GUI_App.cpp:2790 msgid "Ongoing uploads" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2876 -msgid "It's impossible to print multi-part object(s) with SLA technology." +#: src/slic3r/GUI/GUI_App.cpp:3026 +msgid "" +"It's impossible to print object(s) which contains parameter modifiers with " +"SLA technology." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2877 src/slic3r/GUI/Jobs/SLAImportJob.cpp:235 -#: src/slic3r/GUI/Plater.cpp:2459 +#: src/slic3r/GUI/GUI_App.cpp:3027 src/slic3r/GUI/Jobs/SLAImportJob.cpp:149 +#: src/slic3r/GUI/Plater.cpp:2536 msgid "Please check your object list before preset changing." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2901 +#: src/slic3r/GUI/GUI_App.cpp:3070 msgid "Configuration is editing from ConfigWizard" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2926 +#: src/slic3r/GUI/GUI_App.cpp:3088 +#, boost-format +msgid "Welcome to %1% version %2%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3090 +#, boost-format +msgid "" +"Do you wish to register downloads from Printables.com\n" +"for this %1% %2% executable?\n" +"\n" +"Downloads can be registered for only 1 executable at time." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3118 msgid "Select a gcode file:" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "Open hyperlink in default browser?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "PrusaSlicer: Open hyperlink" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3105 src/slic3r/GUI/Preferences.cpp:382 +#: src/slic3r/GUI/GUI_App.cpp:3306 src/slic3r/GUI/Preferences.cpp:593 msgid "Suppress to open hyperlink in browser" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3107 src/slic3r/GUI/Plater.cpp:1732 +#: src/slic3r/GUI/GUI_App.cpp:3308 src/slic3r/GUI/Plater.cpp:1742 msgid "PrusaSlicer will remember your choice." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3108 +#: src/slic3r/GUI/GUI_App.cpp:3309 msgid "You will not be asked about it again on hyperlinks hovering." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3109 src/slic3r/GUI/Plater.cpp:1736 +#: src/slic3r/GUI/GUI_App.cpp:3310 src/slic3r/GUI/Plater.cpp:1746 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" "to changes your choice." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3111 src/slic3r/GUI/Plater.cpp:1738 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:906 +#: src/slic3r/GUI/GUI_App.cpp:3312 src/slic3r/GUI/Plater.cpp:1748 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:934 msgid "PrusaSlicer: Don't ask me again" msgstr "" -#: src/slic3r/GUI/GUI_Init.cpp:57 src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_App.cpp:3386 +msgid "Check for application update has failed." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3387 +#, boost-format +msgid "No new version is available. Latest release version is %1%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3458 +msgid "Download of new version is already ongoing. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/GUI_Init.cpp:64 src/slic3r/GUI/GUI_Init.cpp:67 msgid "PrusaSlicer GUI initialization failed" msgstr "" -#: src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_Init.cpp:67 #, boost-format msgid "Fatal error, exception catched: %1%" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:54 src/slic3r/GUI/GUI_Factories.cpp:127 -#: src/libslic3r/PrintConfig.cpp:287 src/libslic3r/PrintConfig.cpp:404 -#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:456 -#: src/libslic3r/PrintConfig.cpp:708 src/libslic3r/PrintConfig.cpp:778 -#: src/libslic3r/PrintConfig.cpp:786 src/libslic3r/PrintConfig.cpp:1232 -#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1563 -#: src/libslic3r/PrintConfig.cpp:1955 src/libslic3r/PrintConfig.cpp:2030 -#: src/libslic3r/PrintConfig.cpp:2264 src/libslic3r/PrintConfig.cpp:2850 -#: src/libslic3r/PrintConfig.cpp:2858 src/libslic3r/PrintConfig.cpp:2918 -#: src/libslic3r/PrintConfig.cpp:2927 src/libslic3r/PrintConfig.cpp:3098 +#: src/libslic3r/PrintConfig.cpp:300 src/libslic3r/PrintConfig.cpp:423 +#: src/libslic3r/PrintConfig.cpp:466 src/libslic3r/PrintConfig.cpp:475 +#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:872 +#: src/libslic3r/PrintConfig.cpp:881 src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1376 src/libslic3r/PrintConfig.cpp:1604 +#: src/libslic3r/PrintConfig.cpp:1985 src/libslic3r/PrintConfig.cpp:2060 +#: src/libslic3r/PrintConfig.cpp:2294 src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:2946 src/libslic3r/PrintConfig.cpp:3006 +#: src/libslic3r/PrintConfig.cpp:3015 src/libslic3r/PrintConfig.cpp:3186 msgid "Layers and Perimeters" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:56 src/slic3r/GUI/GUI_Factories.cpp:131 -#: src/slic3r/GUI/GUI_Preview.cpp:249 src/slic3r/GUI/Tab.cpp:1547 -#: src/slic3r/GUI/Tab.cpp:1549 src/libslic3r/ExtrusionEntity.cpp:340 -#: src/libslic3r/ExtrusionEntity.cpp:372 src/libslic3r/PrintConfig.cpp:670 -#: src/libslic3r/PrintConfig.cpp:2095 src/libslic3r/PrintConfig.cpp:2104 -#: src/libslic3r/PrintConfig.cpp:2113 src/libslic3r/PrintConfig.cpp:2123 -#: src/libslic3r/PrintConfig.cpp:2132 src/libslic3r/PrintConfig.cpp:2554 -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2568 -#: src/libslic3r/PrintConfig.cpp:2581 src/libslic3r/PrintConfig.cpp:2591 -#: src/libslic3r/PrintConfig.cpp:2599 src/libslic3r/PrintConfig.cpp:2617 -#: src/libslic3r/PrintConfig.cpp:2634 src/libslic3r/PrintConfig.cpp:2655 -#: src/libslic3r/PrintConfig.cpp:2668 src/libslic3r/PrintConfig.cpp:2685 -#: src/libslic3r/PrintConfig.cpp:2703 src/libslic3r/PrintConfig.cpp:2718 -#: src/libslic3r/PrintConfig.cpp:2728 src/libslic3r/PrintConfig.cpp:2737 -#: src/libslic3r/PrintConfig.cpp:2748 src/libslic3r/PrintConfig.cpp:2762 -#: src/libslic3r/PrintConfig.cpp:2778 src/libslic3r/PrintConfig.cpp:2786 -#: src/libslic3r/PrintConfig.cpp:2787 src/libslic3r/PrintConfig.cpp:2796 -#: src/libslic3r/PrintConfig.cpp:2810 src/libslic3r/PrintConfig.cpp:2818 -#: src/libslic3r/PrintConfig.cpp:2832 +#: src/slic3r/GUI/Tab.cpp:1494 src/slic3r/GUI/Tab.cpp:1496 +#: src/libslic3r/PrintConfig.cpp:773 src/libslic3r/PrintConfig.cpp:2125 +#: src/libslic3r/PrintConfig.cpp:2134 src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2153 src/libslic3r/PrintConfig.cpp:2162 +#: src/libslic3r/PrintConfig.cpp:2584 src/libslic3r/PrintConfig.cpp:2590 +#: src/libslic3r/PrintConfig.cpp:2598 src/libslic3r/PrintConfig.cpp:2611 +#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2628 +#: src/libslic3r/PrintConfig.cpp:2644 src/libslic3r/PrintConfig.cpp:2660 +#: src/libslic3r/PrintConfig.cpp:2681 src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2725 +#: src/libslic3r/PrintConfig.cpp:2743 src/libslic3r/PrintConfig.cpp:2753 +#: src/libslic3r/PrintConfig.cpp:2762 src/libslic3r/PrintConfig.cpp:2773 +#: src/libslic3r/PrintConfig.cpp:2785 src/libslic3r/PrintConfig.cpp:2799 +#: src/libslic3r/PrintConfig.cpp:2807 src/libslic3r/PrintConfig.cpp:2808 +#: src/libslic3r/PrintConfig.cpp:2817 src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2840 src/libslic3r/PrintConfig.cpp:2854 +#: src/libslic3r/PrintConfig.cpp:2862 src/libslic3r/PrintConfig.cpp:2873 +#: src/libslic3r/PrintConfig.cpp:2884 src/libslic3r/PrintConfig.cpp:2893 +#: src/libslic3r/PrintConfig.cpp:2903 src/libslic3r/PrintConfig.cpp:2915 msgid "Support material" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:59 src/slic3r/GUI/GUI_Factories.cpp:135 -#: src/libslic3r/PrintConfig.cpp:3054 src/libslic3r/PrintConfig.cpp:3062 +#: src/libslic3r/PrintConfig.cpp:3142 src/libslic3r/PrintConfig.cpp:3150 msgid "Wipe options" msgstr "" @@ -3616,330 +4856,351 @@ msgstr "" msgid "Pad and Support" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/GUI_Preview.cpp:245 -#: src/slic3r/GUI/Tab.cpp:1513 src/libslic3r/ExtrusionEntity.cpp:336 -#: src/libslic3r/ExtrusionEntity.cpp:364 src/libslic3r/PrintConfig.cpp:1579 -#: src/libslic3r/PrintConfig.cpp:1585 src/libslic3r/PrintConfig.cpp:1599 -#: src/libslic3r/PrintConfig.cpp:1609 src/libslic3r/PrintConfig.cpp:1617 -#: src/libslic3r/PrintConfig.cpp:1619 +#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/Tab.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1620 src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1638 src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1656 src/libslic3r/PrintConfig.cpp:1658 msgid "Ironing" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1283 -#: src/libslic3r/PrintConfig.cpp:1284 src/libslic3r/PrintConfig.cpp:1299 -#: src/libslic3r/PrintConfig.cpp:1309 +#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1344 src/libslic3r/PrintConfig.cpp:1356 +#: src/libslic3r/PrintConfig.cpp:1366 msgid "Fuzzy Skin" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/GUI_Preview.cpp:220 -#: src/slic3r/GUI/Tab.cpp:1581 src/libslic3r/PrintConfig.cpp:507 -#: src/libslic3r/PrintConfig.cpp:766 src/libslic3r/PrintConfig.cpp:1326 -#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1618 -#: src/libslic3r/PrintConfig.cpp:2020 src/libslic3r/PrintConfig.cpp:2352 -#: src/libslic3r/PrintConfig.cpp:2405 src/libslic3r/PrintConfig.cpp:2903 +#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/Tab.cpp:1536 +#: src/libslic3r/PrintConfig.cpp:526 src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:548 src/libslic3r/PrintConfig.cpp:557 +#: src/libslic3r/PrintConfig.cpp:566 src/libslic3r/PrintConfig.cpp:575 +#: src/libslic3r/PrintConfig.cpp:852 src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1657 +#: src/libslic3r/PrintConfig.cpp:2050 src/libslic3r/PrintConfig.cpp:2383 +#: src/libslic3r/PrintConfig.cpp:2436 src/libslic3r/PrintConfig.cpp:2991 msgid "Speed" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1623 -#: src/slic3r/GUI/Tab.cpp:2304 src/libslic3r/PrintConfig.cpp:796 -#: src/libslic3r/PrintConfig.cpp:1489 src/libslic3r/PrintConfig.cpp:1997 -#: src/libslic3r/PrintConfig.cpp:2373 src/libslic3r/PrintConfig.cpp:2647 -#: src/libslic3r/PrintConfig.cpp:2675 +#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1585 +#: src/slic3r/GUI/Tab.cpp:2288 src/libslic3r/PrintConfig.cpp:889 +#: src/libslic3r/PrintConfig.cpp:1530 src/libslic3r/PrintConfig.cpp:2027 +#: src/libslic3r/PrintConfig.cpp:2404 src/libslic3r/PrintConfig.cpp:2673 +#: src/libslic3r/PrintConfig.cpp:2701 msgid "Extruders" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:754 -#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:1218 -#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:2006 -#: src/libslic3r/PrintConfig.cpp:2393 src/libslic3r/PrintConfig.cpp:2656 -#: src/libslic3r/PrintConfig.cpp:2890 +#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:840 +#: src/libslic3r/PrintConfig.cpp:953 src/libslic3r/PrintConfig.cpp:1278 +#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:2036 +#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2682 +#: src/libslic3r/PrintConfig.cpp:2978 msgid "Extrusion Width" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1533 -#: src/libslic3r/PrintConfig.cpp:517 src/libslic3r/PrintConfig.cpp:528 -#: src/libslic3r/PrintConfig.cpp:544 +#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:631 src/libslic3r/PrintConfig.cpp:642 +#: src/libslic3r/PrintConfig.cpp:655 msgid "Skirt and brim" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 -#: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1645 -#: src/slic3r/GUI/Tab.cpp:1649 src/slic3r/GUI/Tab.cpp:2031 -#: src/slic3r/GUI/Tab.cpp:2402 src/slic3r/GUI/Tab.cpp:4729 -#: src/libslic3r/PrintConfig.cpp:260 src/libslic3r/PrintConfig.cpp:495 -#: src/libslic3r/PrintConfig.cpp:1438 src/libslic3r/PrintConfig.cpp:1525 -#: src/libslic3r/PrintConfig.cpp:1572 src/libslic3r/PrintConfig.cpp:2530 -#: src/libslic3r/PrintConfig.cpp:2540 src/libslic3r/PrintConfig.cpp:3078 -#: src/libslic3r/PrintConfig.cpp:3113 src/libslic3r/PrintConfig.cpp:3124 -#: src/libslic3r/PrintConfig.cpp:3139 src/libslic3r/PrintConfig.cpp:3152 -#: src/libslic3r/PrintConfig.cpp:3161 src/libslic3r/PrintConfig.cpp:3173 -#: src/libslic3r/PrintConfig.cpp:3370 -msgid "Advanced" -msgstr "" - -#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4663 src/slic3r/GUI/Tab.cpp:4664 -#: src/libslic3r/PrintConfig.cpp:3564 src/libslic3r/PrintConfig.cpp:3571 -#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3589 -#: src/libslic3r/PrintConfig.cpp:3599 src/libslic3r/PrintConfig.cpp:3609 -#: src/libslic3r/PrintConfig.cpp:3646 src/libslic3r/PrintConfig.cpp:3653 -#: src/libslic3r/PrintConfig.cpp:3664 src/libslic3r/PrintConfig.cpp:3674 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3696 -#: src/libslic3r/PrintConfig.cpp:3706 src/libslic3r/PrintConfig.cpp:3715 -#: src/libslic3r/PrintConfig.cpp:3725 src/libslic3r/PrintConfig.cpp:3736 -#: src/libslic3r/PrintConfig.cpp:3744 +#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Tab.cpp:4946 src/slic3r/GUI/Tab.cpp:4948 +#: src/libslic3r/PrintConfig.cpp:3328 src/libslic3r/PrintConfig.cpp:3337 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3356 +#: src/libslic3r/PrintConfig.cpp:3366 src/libslic3r/PrintConfig.cpp:3387 +#: src/libslic3r/PrintConfig.cpp:3410 src/libslic3r/PrintConfig.cpp:3417 +#: src/libslic3r/PrintConfig.cpp:3432 src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3464 +#: src/libslic3r/PrintConfig.cpp:3474 src/libslic3r/PrintConfig.cpp:3488 +#: src/libslic3r/PrintConfig.cpp:3498 src/libslic3r/PrintConfig.cpp:3841 +#: src/libslic3r/PrintConfig.cpp:3861 src/libslic3r/PrintConfig.cpp:3868 +#: src/libslic3r/PrintConfig.cpp:3876 msgid "Supports" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4704 src/slic3r/GUI/Tab.cpp:4705 -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3752 -#: src/libslic3r/PrintConfig.cpp:3759 src/libslic3r/PrintConfig.cpp:3773 -#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3794 -#: src/libslic3r/PrintConfig.cpp:3816 src/libslic3r/PrintConfig.cpp:3827 -#: src/libslic3r/PrintConfig.cpp:3834 src/libslic3r/PrintConfig.cpp:3841 -#: src/libslic3r/PrintConfig.cpp:3852 src/libslic3r/PrintConfig.cpp:3861 -#: src/libslic3r/PrintConfig.cpp:3870 +#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:590 +#: src/slic3r/GUI/Tab.cpp:4960 src/slic3r/GUI/Tab.cpp:4961 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3884 +#: src/libslic3r/PrintConfig.cpp:3891 src/libslic3r/PrintConfig.cpp:3905 +#: src/libslic3r/PrintConfig.cpp:3916 src/libslic3r/PrintConfig.cpp:3926 +#: src/libslic3r/PrintConfig.cpp:3948 src/libslic3r/PrintConfig.cpp:3959 +#: src/libslic3r/PrintConfig.cpp:3966 src/libslic3r/PrintConfig.cpp:3973 +#: src/libslic3r/PrintConfig.cpp:3984 src/libslic3r/PrintConfig.cpp:3993 +#: src/libslic3r/PrintConfig.cpp:4002 msgid "Pad" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4722 -#: src/slic3r/GUI/Tab.cpp:4723 src/libslic3r/SLA/Hollowing.cpp:73 -#: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3880 -#: src/libslic3r/PrintConfig.cpp:3887 src/libslic3r/PrintConfig.cpp:3897 -#: src/libslic3r/PrintConfig.cpp:3906 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4978 +#: src/slic3r/GUI/Tab.cpp:4979 src/libslic3r/SLA/Hollowing.cpp:86 +#: src/libslic3r/SLA/Hollowing.cpp:91 src/libslic3r/SLA/Hollowing.cpp:106 +#: src/libslic3r/SLA/Hollowing.cpp:115 src/libslic3r/PrintConfig.cpp:4012 +#: src/libslic3r/PrintConfig.cpp:4019 src/libslic3r/PrintConfig.cpp:4029 +#: src/libslic3r/PrintConfig.cpp:4038 msgid "Hollowing" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:160 +#: src/slic3r/GUI/GUI_Factories.cpp:159 msgid "Add part" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:161 +#: src/slic3r/GUI/GUI_Factories.cpp:160 msgid "Add negative volume" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:162 +#: src/slic3r/GUI/GUI_Factories.cpp:161 msgid "Add modifier" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:163 +#: src/slic3r/GUI/GUI_Factories.cpp:162 msgid "Add support blocker" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:164 +#: src/slic3r/GUI/GUI_Factories.cpp:163 msgid "Add support enforcer" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:300 +#: src/slic3r/GUI/GUI_Factories.cpp:169 +msgid "Add text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:170 +msgid "Add negative text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:171 +msgid "Add text modifier" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:307 msgid "Select showing settings" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:407 src/slic3r/GUI/GUI_Factories.cpp:412 -#: src/slic3r/GUI/GUI_Factories.cpp:556 src/slic3r/GUI/GUI_Factories.cpp:562 +#: src/slic3r/GUI/GUI_Factories.cpp:414 src/slic3r/GUI/GUI_Factories.cpp:419 +#: src/slic3r/GUI/GUI_Factories.cpp:625 src/slic3r/GUI/GUI_Factories.cpp:631 #, c-format, boost-format msgid "Quick Add Settings (%s)" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:444 +#: src/slic3r/GUI/GUI_Factories.cpp:460 msgid "Remove the selected object" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:456 +#: src/slic3r/GUI/GUI_Factories.cpp:475 msgid "Load" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:461 src/slic3r/GUI/GUI_Factories.cpp:501 -#: src/slic3r/GUI/GUI_Factories.cpp:505 +#: src/slic3r/GUI/GUI_Factories.cpp:481 src/slic3r/GUI/GUI_Factories.cpp:566 +#: src/slic3r/GUI/GUI_Factories.cpp:570 msgid "Box" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Cylinder" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Slab" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:471 +#: src/slic3r/GUI/GUI_Factories.cpp:493 msgid "Gallery" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:488 src/slic3r/GUI/GUI_Factories.cpp:526 +#: src/slic3r/GUI/GUI_Factories.cpp:529 src/slic3r/GUI/GUI_Factories.cpp:549 +#: src/slic3r/GUI/GUI_ObjectList.cpp:660 +msgid "Text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:555 src/slic3r/GUI/GUI_Factories.cpp:558 +#: src/slic3r/GUI/GUI_Factories.cpp:595 msgid "Height range Modifier" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:535 +#: src/slic3r/GUI/GUI_Factories.cpp:604 msgid "Add settings" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:626 +#: src/slic3r/GUI/GUI_Factories.cpp:695 msgid "Change type" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:636 src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:705 src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Object" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Objects" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:658 +#: src/slic3r/GUI/GUI_Factories.cpp:727 msgid "Printable" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:686 +#: src/slic3r/GUI/GUI_Factories.cpp:755 src/slic3r/GUI/GUI_ObjectList.cpp:2070 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2582 +msgid "Invalidate cut info" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:770 msgid "Rename" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:696 +#: src/slic3r/GUI/GUI_Factories.cpp:780 msgid "Fix through the Netfabb" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:715 -msgid "Export as STL" +#: src/slic3r/GUI/GUI_Factories.cpp:799 +msgid "Export as STL/OBJ" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:726 +#: src/slic3r/GUI/GUI_Factories.cpp:810 msgid "Reload the selected volumes from disk" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:733 src/slic3r/GUI/Plater.cpp:3568 +#: src/slic3r/GUI/GUI_Factories.cpp:817 src/slic3r/GUI/Plater.cpp:3602 msgid "Replace with STL" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:733 +#: src/slic3r/GUI/GUI_Factories.cpp:817 msgid "Replace the selected volume with new STL" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Set extruder for selected items" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:778 src/slic3r/Utils/Repetier.cpp:126 -#: src/slic3r/Utils/Repetier.cpp:209 src/libslic3r/PrintConfig.cpp:635 -#: src/libslic3r/PrintConfig.cpp:2770 +#: src/slic3r/GUI/GUI_Factories.cpp:862 src/slic3r/Utils/Repetier.cpp:145 +#: src/slic3r/Utils/Repetier.cpp:226 src/libslic3r/PrintConfig.cpp:738 +#: src/libslic3r/PrintConfig.cpp:2790 src/libslic3r/PrintConfig.cpp:3851 msgid "Default" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale to print volume" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale the selected object to fit the print volume" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:835 src/slic3r/GUI/Plater.cpp:5655 +#: src/slic3r/GUI/GUI_Factories.cpp:921 src/slic3r/GUI/Plater.cpp:6213 msgid "Convert from imperial units" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:836 src/slic3r/GUI/Plater.cpp:5656 +#: src/slic3r/GUI/GUI_Factories.cpp:922 src/slic3r/GUI/Plater.cpp:6214 msgid "Revert conversion from imperial units" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:837 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:923 src/slic3r/GUI/Plater.cpp:6215 msgid "Convert from meters" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:838 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:924 src/slic3r/GUI/Plater.cpp:6215 msgid "Revert conversion from meters" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2135 -#: src/libslic3r/PrintConfig.cpp:4523 +#: src/slic3r/GUI/GUI_Factories.cpp:945 src/slic3r/GUI/GUI_ObjectList.cpp:2290 +#: src/libslic3r/PrintConfig.cpp:4689 msgid "Merge" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:859 +#: src/slic3r/GUI/GUI_Factories.cpp:945 msgid "Merge objects to the one multipart object" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Along X axis" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Mirror the selected object along the X axis" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Along Y axis" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Mirror the selected object along the Y axis" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Along Z axis" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Mirror the selected object along the Z axis" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror the selected object" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:901 src/slic3r/GUI/GUI_ObjectList.cpp:1696 +#: src/slic3r/GUI/GUI_Factories.cpp:977 +msgid "Edit text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:999 +msgid "Ability to change text, font, size, ..." +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1021 src/slic3r/GUI/GUI_ObjectList.cpp:1793 msgid "Add Shape" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:937 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "To objects" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:937 src/slic3r/GUI/GUI_Factories.cpp:954 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "Split the selected object into individual objects" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:940 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 msgid "To parts" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:940 src/slic3r/GUI/GUI_Factories.cpp:975 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 src/slic3r/GUI/GUI_Factories.cpp:1097 msgid "Split the selected object into individual parts" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4552 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 src/slic3r/GUI/GUI_Factories.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:4718 msgid "Split" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:944 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 msgid "Split the selected object" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:1084 -msgid "Add one more instance of the selected object" +#: src/slic3r/GUI/GUI_Factories.cpp:1225 src/slic3r/GUI/GUI_Factories.cpp:1243 +msgid "Set number of instances" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:1087 -msgid "Remove one instance of the selected object" +#: src/slic3r/GUI/GUI_Factories.cpp:1225 +msgid "Change the number of instances of the selected objects" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:1090 -msgid "Set number of instances" +#: src/slic3r/GUI/GUI_Factories.cpp:1237 +msgid "Add one more instance of the selected object" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1240 +msgid "Remove one instance of the selected object" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:1090 +#: src/slic3r/GUI/GUI_Factories.cpp:1243 msgid "Change the number of instances of the selected object" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill bed with instances" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill the remaining area of bed with instances of the selected object" msgstr "" @@ -3959,304 +5220,352 @@ msgstr "" msgid "Add layer range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:297 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:323 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 msgid "Name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:480 +#: src/slic3r/GUI/GUI_ObjectList.cpp:342 src/slic3r/GUI/GUI_ObjectList.cpp:513 msgid "Editing" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:400 +#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +msgid "Wrong volume index " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:433 msgid "No errors detected" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:409 +#: src/slic3r/GUI/GUI_ObjectList.cpp:442 #, c-format, boost-format msgid "Auto-repaired %1$d error" msgid_plural "Auto-repaired %1$d errors" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:415 +#: src/slic3r/GUI/GUI_ObjectList.cpp:448 #, c-format, boost-format msgid "%1$d degenerate facet" msgid_plural "%1$d degenerate facets" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:450 #, c-format, boost-format msgid "%1$d edge fixed" msgid_plural "%1$d edges fixed" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:452 #, c-format, boost-format msgid "%1$d facet removed" msgid_plural "%1$d facets removed" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:421 +#: src/slic3r/GUI/GUI_ObjectList.cpp:454 #, c-format, boost-format msgid "%1$d facet reversed" msgid_plural "%1$d facets reversed" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +#: src/slic3r/GUI/GUI_ObjectList.cpp:456 #, c-format, boost-format msgid "%1$d backward edge" msgid_plural "%1$d backward edges" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:426 src/slic3r/GUI/GUI_ObjectList.cpp:429 +#: src/slic3r/GUI/GUI_ObjectList.cpp:459 src/slic3r/GUI/GUI_ObjectList.cpp:462 #, c-format, boost-format msgid "%1$d open edge" msgid_plural "%1$d open edges" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:428 +#: src/slic3r/GUI/GUI_ObjectList.cpp:461 msgid "Remaining errors" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:436 +#: src/slic3r/GUI/GUI_ObjectList.cpp:469 msgid "Right button click the icon to fix STL through Netfabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:482 +#: src/slic3r/GUI/GUI_ObjectList.cpp:515 msgid "Right button click the icon to change the object settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:484 +#: src/slic3r/GUI/GUI_ObjectList.cpp:517 msgid "Click the icon to change the object settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:488 +#: src/slic3r/GUI/GUI_ObjectList.cpp:521 msgid "Right button click the icon to change the object printable property" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:523 msgid "Click the icon to change the object printable property" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:616 +#: src/slic3r/GUI/GUI_ObjectList.cpp:649 msgid "Change Extruder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1242 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4006 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1307 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4589 msgid "Instances to Separated Objects" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Volumes in Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1298 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1363 msgid "Add Settings for Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1299 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1364 msgid "Add Settings for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1300 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1365 msgid "Add Settings for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1339 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1404 msgid "Add Settings Bundle for Height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1340 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1405 msgid "Add Settings Bundle for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1341 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1406 msgid "Add Settings Bundle for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1509 src/slic3r/GUI/Plater.cpp:2380 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1582 src/slic3r/GUI/Plater.cpp:2453 msgid "Loading" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1540 src/slic3r/GUI/Plater.cpp:2417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1617 src/slic3r/GUI/Plater.cpp:2494 msgid "Loading file" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1548 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1625 msgid "Error!" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1638 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1721 msgid "Add Generic Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1663 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1761 msgid "Generic" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shape from Gallery" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shapes from Gallery" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1830 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1945 msgid "Remove paint-on supports" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1837 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 msgid "Remove paint-on seam" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1844 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 msgid "Remove Multi Material painting" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1850 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1972 msgid "Shift objects to bed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1856 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1978 msgid "Remove variable layer height" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1877 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1999 msgid "Delete Settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1901 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2023 msgid "Delete All Instances from Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1917 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2039 msgid "Delete Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1949 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2057 +msgid "Delete connector from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2058 +msgid "Delete solid part from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2059 +msgid "Delete negative volume from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2061 +msgid "" +"To save cut information you can delete all connectors from all related " +"objects." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2064 +msgid "" +"This action will break a cut information.\n" +"After that PrusaSlicer can't guarantee model consistency.\n" +"\n" +"To manipulate with solid parts or negative volumes you have to invalidate " +"cut infornation first." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2072 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2612 +msgid "Delete all connectors" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2103 msgid "From Object List You can't delete the last solid part from object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1953 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2112 msgid "Delete Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1976 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2138 msgid "Last instance of an object cannot be deleted." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1980 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +msgid "Instance cannot be deleted from cut object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2146 msgid "Delete Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2004 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2170 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2008 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2174 msgid "Split to Parts" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2177 src/slic3r/GUI/Plater.cpp:3133 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"splitting the object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2297 msgid "Merged" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2237 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2392 msgid "Merge all parts to the one single object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2269 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2424 msgid "Add Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2438 -msgid "Group manipulation" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2695 +msgid "Cut Connectors information" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2453 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2705 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2768 msgid "Object manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2486 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2714 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1472 +msgid "Group manipulation" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2802 msgid "Object Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2806 msgid "Part Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2495 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2811 msgid "Layer range Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2501 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2817 msgid "Part manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2825 msgid "Instance manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Height ranges" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Settings for height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2750 -msgid "Delete Selected Item" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2943 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3363 msgid "Delete Selected" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3019 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3047 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3067 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3441 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3469 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3489 msgid "Add Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3113 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3535 msgid "" "Cannot insert a new layer range after the current layer range.\n" "The next layer range is too thin to be split to two\n" "without violating the minimum layer height." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3117 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3539 msgid "" "Cannot insert a new layer range between the current and the next layer " "range.\n" @@ -4264,240 +5573,289 @@ msgid "" "is thinner than the minimum layer height allowed." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3122 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3544 msgid "" "Cannot insert a new layer range after the current layer range.\n" "Current layer range overlaps with the next layer range." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3603 msgid "Edit Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3500 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3989 msgid "Selection-Remove from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4001 msgid "Selection-Add from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3649 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4138 msgid "Object or Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Part" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 msgid "Layer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3652 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4141 msgid "Unsupported selection" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3653 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 #, c-format, boost-format msgid "You started your selection with %s Item." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3654 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4143 #, c-format, boost-format msgid "In this mode you can select only other %s Items%s" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3657 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4146 msgid "of a current Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3662 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3737 src/slic3r/GUI/Plater.cpp:181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4151 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4226 src/slic3r/GUI/Plater.cpp:197 msgid "Info" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3784 -msgid "You can't change a type of the last solid part of the object." -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 msgid "Negative Volume" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Modifier" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Blocker" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Enforcer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Select type of part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3795 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4359 msgid "Change Part Type" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Enter new name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Renaming" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4091 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4681 msgid "Repairing model" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4120 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4691 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"repairing the mesh." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4711 msgid "Fix through NetFabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4123 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4714 msgid "Fixing through NetFabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4153 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4744 msgid "The following model was repaired successfully" msgid_plural "The following models were repaired successfully" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4159 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4750 msgid "Folowing model repair failed" msgid_plural "Folowing models repair failed" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4164 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4755 msgid "Repairing was canceled" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4276 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4869 msgid "Change Extruders" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Printable group" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Unprintable group" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Printable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Unprintable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Printable Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Unprintable Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:55 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:84 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:61 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:96 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1132 msgid "World coordinates" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:56 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:85 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:97 msgid "Local coordinates" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:60 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:67 msgid "Select coordinate space, in which the transformation will be performed." msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:141 src/libslic3r/GCode.cpp:540 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:157 src/libslic3r/GCode.cpp:491 msgid "Object name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:201 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:521 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:221 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:710 msgid "Position" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:202 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:522 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:222 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:711 #: src/slic3r/GUI/Mouse3DController.cpp:478 #: src/slic3r/GUI/Mouse3DController.cpp:499 msgid "Rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:250 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:239 +msgid "Size [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "Mirror along" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +#, c-format, boost-format +msgid " %c " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "axis" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:279 #, c-format, boost-format msgid "Toggle %c axis mirroring" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:284 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:329 msgid "Set Mirror" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:324 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:336 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:348 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:374 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:387 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:393 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:401 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:428 msgid "Drop to bed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:445 msgid "Reset rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 msgid "Reset Rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:398 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:400 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:490 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:519 msgid "Reset scale" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:539 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546 +msgid "Reset skew" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:553 msgid "Inches" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:523 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:712 msgid "Scale factors" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:577 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:740 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:752 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:793 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:801 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +msgid "Rotate (relative)" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:751 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:800 +msgid "Translate (relative) [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:829 msgid "Translate" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:640 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:905 msgid "" "You cannot use non-uniform scaling mode for multiple objects/parts selection" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:820 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +msgid "Left handed" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1133 +msgid "Object coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1134 +msgid "Part coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1176 msgid "Set Position" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:852 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1220 msgid "Set Orientation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:931 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1351 msgid "Set Scale" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1368 +msgid "Set Size" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1427 msgid "" "The currently manipulated object is tilted (rotation angles are not " "multiples of 90°).\n" @@ -4506,7 +5864,7 @@ msgid "" "once the rotation is embedded into the object coordinates." msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:983 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1430 msgid "" "This operation is irreversible.\n" "Do you want to proceed?" @@ -4530,168 +5888,67 @@ msgstr "" msgid "Change Option %s" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:211 -msgid "View" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/libslic3r/PrintConfig.cpp:808 -msgid "Height" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:219 src/libslic3r/PrintConfig.cpp:3032 -msgid "Width" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2016 -msgid "Fan speed" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1991 -msgid "Temperature" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:223 -msgid "Volumetric flow rate" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:228 -msgid "Show" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/GUI_Preview.cpp:254 -msgid "Feature types" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:330 -#: src/libslic3r/ExtrusionEntity.cpp:352 -msgid "Perimeter" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:331 -#: src/libslic3r/ExtrusionEntity.cpp:354 -msgid "External perimeter" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:332 -#: src/libslic3r/ExtrusionEntity.cpp:356 -msgid "Overhang perimeter" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:333 -#: src/libslic3r/ExtrusionEntity.cpp:358 -msgid "Internal infill" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:334 -#: src/libslic3r/ExtrusionEntity.cpp:360 src/libslic3r/PrintConfig.cpp:1407 -#: src/libslic3r/PrintConfig.cpp:2392 src/libslic3r/PrintConfig.cpp:2404 -msgid "Solid infill" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:335 -#: src/libslic3r/ExtrusionEntity.cpp:362 src/libslic3r/PrintConfig.cpp:1416 -#: src/libslic3r/PrintConfig.cpp:2889 src/libslic3r/PrintConfig.cpp:2902 -msgid "Top solid infill" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:337 -#: src/libslic3r/ExtrusionEntity.cpp:366 -msgid "Bridge infill" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:338 -#: src/libslic3r/ExtrusionEntity.cpp:368 src/libslic3r/PrintConfig.cpp:1325 -msgid "Gap fill" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:248 src/libslic3r/ExtrusionEntity.cpp:339 -#: src/libslic3r/ExtrusionEntity.cpp:370 -msgid "Skirt/Brim" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:250 src/libslic3r/ExtrusionEntity.cpp:341 -#: src/libslic3r/ExtrusionEntity.cpp:374 src/libslic3r/PrintConfig.cpp:2736 -msgid "Support material interface" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:251 src/slic3r/GUI/Tab.cpp:1634 -#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/ExtrusionEntity.cpp:376 -msgid "Wipe tower" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:728 +#: src/slic3r/GUI/GUI_Preview.cpp:581 msgid "NOTE:" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:729 +#: src/slic3r/GUI/GUI_Preview.cpp:582 #, boost-format msgid "Sliced object \"%1%\" looks like a logo or a sign" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:730 +#: src/slic3r/GUI/GUI_Preview.cpp:583 msgid "Apply color change automatically" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:1058 -msgid "Shells" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:1059 -msgid "Tool marker" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:1060 -msgid "Legend/Estimated printing time" -msgstr "" - -#: src/slic3r/GUI/HintNotification.cpp:771 -#: src/slic3r/GUI/HintNotification.cpp:797 -#: src/slic3r/GUI/NotificationManager.cpp:374 -#: src/slic3r/GUI/NotificationManager.cpp:391 +#: src/slic3r/GUI/HintNotification.cpp:773 +#: src/slic3r/GUI/HintNotification.cpp:799 +#: src/slic3r/GUI/NotificationManager.cpp:457 +#: src/slic3r/GUI/NotificationManager.cpp:474 msgid "More" msgstr "" -#: src/slic3r/GUI/HintNotification.cpp:912 +#: src/slic3r/GUI/HintNotification.cpp:914 msgid "Open Preferences." msgstr "" -#: src/slic3r/GUI/HintNotification.cpp:1004 +#: src/slic3r/GUI/HintNotification.cpp:1006 msgid "Open Documentation in web browser." msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:527 +#: src/slic3r/GUI/ImGuiWrapper.cpp:666 msgid "Edit" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:960 src/slic3r/GUI/Search.cpp:470 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1166 src/slic3r/GUI/Search.cpp:531 msgid "Use for search" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:961 src/slic3r/GUI/Search.cpp:463 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1167 src/slic3r/GUI/Search.cpp:524 msgid "Category" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:963 src/slic3r/GUI/Search.cpp:465 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1169 src/slic3r/GUI/Search.cpp:526 msgid "Search in English" msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:174 -msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "" - -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:183 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:168 msgid "Arranging" msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:207 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:204 msgid "Arranging canceled." msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:208 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:205 msgid "Arranging done." msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:253 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:225 +msgid "Could not arrange model objects! Some geometries may be invalid." +msgstr "" + +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:265 #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -4699,1377 +5956,1438 @@ msgid "" "%s" msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:119 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:108 msgid "Filling bed" msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:130 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:140 msgid "Bed filling canceled." msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:131 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:141 msgid "Bed filling done." msgstr "" -#: src/slic3r/GUI/Jobs/Job.cpp:111 -msgid "ERROR: not enough resources to execute a new job." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:148 src/slic3r/GUI/Jobs/EmbossJob.cpp:596 +msgid "Can't create empty volume." msgstr "" -#: src/slic3r/GUI/Jobs/PlaterJob.cpp:13 -msgid "An unexpected error occured" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:201 +msgid "Can't create empty object." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:21 -msgid "Best surface quality" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:208 +msgid "Add Emboss text object" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:23 -msgid "Optimize object rotation for best surface quality." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:247 +msgid "Created text volume is empty. Change text or font." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 -msgid "Reduced overhang slopes" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:465 +msgid "" +"It is used default volume for embossed text, try to change text or font to " +"fix it." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:26 -msgid "" -"Optimize object rotation to have minimum amount of overhangs needing support " -"structures.\n" -"Note that this method will try to find the best surface of the object for " -"touching the print bed if no elevation is set." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:549 +#, boost-format +msgid "Text: %1%" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:30 -msgid "Lowest Z height" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:593 +msgid "Bad object to create volume." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:32 -msgid "Rotate the model to have the lowest z height for faster print time." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:598 +msgid "Add Emboss text Volume" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:59 -msgid "Searching for optimal orientation" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:698 +msgid "Font doesn't have any shape for given text." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:77 -msgid "Orientation search canceled." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:738 +msgid "There is no volume in projection direction." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:78 -msgid "Orientation found." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:787 +msgid "There is no valid surface for text projection." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:823 +msgid "Issue during embossing the text." +msgstr "" + +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:22 +msgid "Best surface quality" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:36 -msgid "Choose SLA archive:" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 +msgid "Optimize object rotation for best surface quality." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:40 -msgid "Import file" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:25 +msgid "Reduced overhang slopes" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47 -msgid "Import model and profile" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:27 +msgid "" +"Optimize object rotation to have minimum amount of overhangs needing support " +"structures.\n" +"Note that this method will try to find the best surface of the object for " +"touching the print bed if no elevation is set." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48 -msgid "Import profile only" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:31 +msgid "Lowest Z height" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:49 -msgid "Import model only" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:33 +msgid "Rotate the model to have the lowest z height for faster print time." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60 -msgid "Accurate" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:53 +msgid "Searching for optimal orientation" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61 -msgid "Balanced" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:83 +msgid "Orientation search canceled." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:62 -msgid "Quick" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:84 +msgid "Orientation found." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:140 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:49 msgid "Importing SLA archive" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:158 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:77 msgid "" "The SLA archive doesn't contain any presets. Please activate some SLA " "printer preset first before importing that SLA archive." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:164 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:81 +msgid "Import is unavailable for this archive format." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:86 msgid "Importing canceled." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:165 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:87 msgid "Importing done." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:187 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:108 msgid "The file does not exist." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:221 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135 msgid "" "The imported SLA archive did not contain any presets. The current SLA " "presets were used as fallback." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:234 src/slic3r/GUI/Plater.cpp:2458 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:148 src/slic3r/GUI/Plater.cpp:2535 msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:236 src/slic3r/GUI/Plater.cpp:2460 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:150 src/slic3r/GUI/Plater.cpp:2537 msgid "Attention!" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:166 +msgid "The profile in the imported archive is corrupt and will not be loaded." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:178 +msgid "" +"No object could be retrieved from the archive. The slices might be corrupted " +"or missing." +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1184 msgid "Keyboard Shortcuts" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:77 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:86 msgid "New project, clear plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:78 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 msgid "Open project AMF/3MF with config, clear plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 msgid "Save project (3mf)" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 msgid "Save project as (3mf)" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:81 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 msgid "(Re)slice" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:83 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:92 msgid "Import STL/3MF/STEP/OBJ/AMF without config, keep plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:84 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 msgid "Import Config from ini/amf/3mf/gcode" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:85 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6543 src/libslic3r/PrintConfig.cpp:4423 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:96 src/slic3r/GUI/Plater.cpp:948 +#: src/slic3r/GUI/Plater.cpp:7161 src/libslic3r/PrintConfig.cpp:4575 msgid "Export G-code" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:97 src/slic3r/GUI/Plater.cpp:7162 msgid "Send G-code" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 msgid "Export config" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 src/slic3r/GUI/Plater.cpp:896 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 src/slic3r/GUI/Plater.cpp:931 msgid "Export to SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:91 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 msgid "Eject SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 msgid "Select all objects" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 msgid "Deselect all" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:95 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 msgid "Delete selected" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 -msgid "Copy to clipboard" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 msgid "Paste from clipboard" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Reload plater from disk" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 msgid "Select Plater Tab" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 msgid "Select Print Settings Tab" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 msgid "Select Filament Settings Tab" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 msgid "Select Printer Settings Tab" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 msgid "Switch to 3D" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 msgid "Switch to Preview" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 -#: src/slic3r/GUI/PrintHostDialogs.cpp:217 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +#: src/slic3r/GUI/PrintHostDialogs.cpp:267 msgid "Print host upload queue" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/MainFrame.cpp:75 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 src/slic3r/GUI/MainFrame.cpp:77 msgid "Open new instance" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 msgid "Camera view" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 msgid "Show/Hide object/instance labels" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Preferences.cpp:46 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Preferences.cpp:57 +#: src/slic3r/GUI/Preferences.cpp:165 src/slic3r/GUI/Preferences.cpp:188 +#: src/slic3r/GUI/Preferences.cpp:207 src/slic3r/GUI/Preferences.cpp:215 msgid "Preferences" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 msgid "Show keyboard shortcuts list" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 msgid "Commands" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 msgid "Add Instance of the selected object" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Remove Instance of the selected object" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 msgid "" "Press to select multiple objects\n" "or move multiple objects with mouse" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 msgid "Press to activate selection rectangle" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 msgid "Press to activate deselection rectangle" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Arrow Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 msgid "Move selection 10 mm in positive Y direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Arrow Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 msgid "Move selection 10 mm in negative Y direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Arrow Left" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 msgid "Move selection 10 mm in negative X direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Arrow Right" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 msgid "Move selection 10 mm in positive X direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Any arrow" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 msgid "Movement step set to 1 mm" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Movement in camera space" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Page Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Rotate selection 45 degrees CCW" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Page Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Rotate selection 45 degrees CW" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 msgid "Gizmo move" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 msgid "Gizmo scale" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Gizmo rotate" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Gizmo cut" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 msgid "Gizmo Place face on bed" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 msgid "Gizmo SLA hollow" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 msgid "Gizmo SLA support points" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 msgid "Gizmo FDM paint-on supports" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 msgid "Gizmo FDM paint-on seam" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 msgid "Gizmo Multi Material painting" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +msgid "Gizmo Text emboss / engrave" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 msgid "Unselect gizmo or clear selection" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 msgid "Change camera type (perspective, orthographic)" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 msgid "Zoom to Bed" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 msgid "" "Zoom to selected object\n" "or all objects in scene, if none selected" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 msgid "Zoom in" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Zoom out" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Switch between Editor/Preview" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Collapse/Expand the sidebar" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 msgid "Minimize application" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 src/slic3r/GUI/MainFrame.cpp:284 -#: src/slic3r/GUI/MainFrame.cpp:333 src/slic3r/GUI/MainFrame.cpp:445 -#: src/slic3r/GUI/MainFrame.cpp:448 src/slic3r/GUI/MainFrame.cpp:470 -#: src/slic3r/GUI/MainFrame.cpp:473 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 src/slic3r/GUI/MainFrame.cpp:329 +#: src/slic3r/GUI/MainFrame.cpp:378 src/slic3r/GUI/MainFrame.cpp:490 +#: src/slic3r/GUI/MainFrame.cpp:493 src/slic3r/GUI/MainFrame.cpp:515 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 msgid "Gizmo move: Press to snap by 1mm" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 msgid "Gizmo scale: Press to snap by 5%" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 msgid "Gizmo scale: Scale selection to fit print volume" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 msgid "Gizmo scale: Press to activate one direction scaling" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 msgid "Gizmo scale: Press to scale selected objects around their own center" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 msgid "Gizmo rotate: Press to rotate selected objects around their own center" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "Gizmos" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "" "The following shortcuts are applicable when the specified gizmo is active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 msgid "Set selected items as Printable/Unprintable" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:203 msgid "Set default extruder for the selected items" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 msgid "Set extruder number for the selected items" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 msgid "Objects List" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/MainFrame.cpp:1611 msgid "Open a G-code file" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 -#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 -#: src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 src/slic3r/GUI/MainFrame.cpp:1443 +#: src/slic3r/GUI/MainFrame.cpp:1447 src/slic3r/GUI/MainFrame.cpp:1616 +#: src/slic3r/GUI/MainFrame.cpp:1620 msgid "Reload the plater from disk" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 msgid "Vertical slider - Move active thumb Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:228 msgid "Vertical slider - Move active thumb Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 msgid "Horizontal slider - Move active thumb Left" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 msgid "Horizontal slider - Move active thumb Right" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:231 msgid "On/Off one layer mode of the vertical slider" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 -msgid "Show/Hide Legend and Estimated printing time" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:232 +msgid "Show/Hide legend" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 msgid "Show/Hide G-code window" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4480 -#: src/slic3r/GUI/Tab.cpp:2832 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 src/slic3r/GUI/Plater.cpp:4562 +#: src/slic3r/GUI/Tab.cpp:2736 msgid "Preview" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 msgid "Move active thumb Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 msgid "Move active thumb Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 msgid "Set upper thumb as active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 msgid "Set lower thumb as active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 msgid "Add color change marker for current layer" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:238 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:244 msgid "Delete color change marker for current layer" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:250 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:251 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:245 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:256 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:257 msgid "" "Press to speed up 5 times while moving thumb\n" "with arrow keys or mouse wheel" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "Vertical Slider" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "" "The following shortcuts are applicable in G-code preview when the vertical " "slider is active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Move active thumb Left" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Move active thumb Right" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Set left thumb as active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Set right thumb as active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "Horizontal Slider" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "" "The following shortcuts are applicable in G-code preview when the horizontal " "slider is active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:278 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:284 msgid "Keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:77 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open a new PrusaSlicer instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:93 msgid "G-code preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:1388 msgid "Open G-code viewer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:91 src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open PrusaSlicer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:93 msgid "Open new G-code viewer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:225 +#: src/slic3r/GUI/MainFrame.cpp:227 msgid "Closing PrusaSlicer. Current project is modified." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "PrusaSlicer is closing" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "Closing PrusaSlicer while some presets are modified." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:285 src/slic3r/GUI/MainFrame.cpp:335 -#: src/slic3r/GUI/Tab.hpp:427 src/slic3r/GUI/Tab.hpp:550 +#: src/slic3r/GUI/MainFrame.cpp:330 src/slic3r/GUI/MainFrame.cpp:380 +#: src/slic3r/GUI/Tab.hpp:413 src/slic3r/GUI/Tab.hpp:539 msgid "Print Settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:535 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:384 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:520 msgid "Material Settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:461 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:382 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:448 msgid "Filament Settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:287 src/slic3r/GUI/MainFrame.cpp:341 -#: src/slic3r/GUI/Tab.hpp:503 +#: src/slic3r/GUI/MainFrame.cpp:332 src/slic3r/GUI/MainFrame.cpp:386 +#: src/slic3r/GUI/Tab.hpp:488 msgid "Printer Settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:632 src/slic3r/GUI/Plater.cpp:1719 -#: src/slic3r/GUI/Plater.cpp:2850 +#: src/slic3r/GUI/MainFrame.cpp:685 src/slic3r/GUI/Plater.cpp:1728 +#: src/slic3r/GUI/Plater.cpp:2879 msgid "Untitled" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:655 +#: src/slic3r/GUI/MainFrame.cpp:710 msgid "based on Slic3r" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Prusa 3D &Drivers" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Open the Prusa3D drivers download page in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Software &Releases" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open the software releases page in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1081 +#: src/slic3r/GUI/MainFrame.cpp:1158 #, c-format, boost-format msgid "%s &Website" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1082 +#: src/slic3r/GUI/MainFrame.cpp:1159 #, c-format, boost-format msgid "Open the %s website in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "System &Info" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "Show system information" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show &Configuration Folder" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show user configuration folder (datadir)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "Report an I&ssue" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 #, c-format, boost-format msgid "Report an issue on %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 #, c-format, boost-format msgid "&About %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 msgid "Show about dialog" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1177 msgid "Show Tip of the Day" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1104 +#: src/slic3r/GUI/MainFrame.cpp:1181 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/MainFrame.cpp:1184 msgid "Show the list of the keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso View" msgstr "" #. TRN To be shown in the main menu View->Top #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2917 -#: src/libslic3r/PrintConfig.cpp:2926 +#: src/slic3r/GUI/MainFrame.cpp:1202 src/libslic3r/PrintConfig.cpp:3005 +#: src/libslic3r/PrintConfig.cpp:3014 msgid "Top" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1125 +#: src/slic3r/GUI/MainFrame.cpp:1202 msgid "Top View" msgstr "" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:446 -#: src/libslic3r/PrintConfig.cpp:455 +#: src/slic3r/GUI/MainFrame.cpp:1205 src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:474 msgid "Bottom" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1205 msgid "Bottom View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2274 +#: src/slic3r/GUI/MainFrame.cpp:1209 src/libslic3r/PrintConfig.cpp:2300 msgid "Rear" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1209 msgid "Rear View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "&New Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "Start a new project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "&Open Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "Open a project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1157 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Recent projects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1169 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Save Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "Save current project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save Project &as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save current project file as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Import STL/3MF/STEP/OBJ/AM&F" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Load a model" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Import STL (Imperial Units)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Load an model saved with imperial units" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Import SL1 / SL1S Archive" +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Import SLA Archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Load an SLA archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Import ZIP Achive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Load an SL1 / Sl1S archive" +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Load a zip achive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Import &Config" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Load exported configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Import Config from &Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Load configuration from project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Import Config &Bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Load presets from a bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1231 +#: src/slic3r/GUI/MainFrame.cpp:1311 msgid "&Import" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1314 src/slic3r/GUI/MainFrame.cpp:1676 msgid "Export &G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1314 msgid "Export current plate as G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1318 src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1318 msgid "Send to print current plate as G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export G-code to SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export Plate as &STL" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export Plate as &STL/OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export current plate as STL" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export current plate as STL/OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export Plate as STL &Including Supports" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export Plate as STL/OBJ &Including Supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export current plate as STL including supports" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export current plate as STL/OBJ including supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export &Toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export &Config" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export current configuration to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export Config &Bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export all presets to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export Config Bundle With Physical Printers" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export all presets including physical printers to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1270 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "&Export" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Ejec&t SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Quick Slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Slice a file into a G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Quick Slice and Save As" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Slice a file into a G-code, save as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat Last Quick Slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat last quick slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "(Re)Slice No&w" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "Start new slicing process" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "&Repair STL file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "Automatically repair an STL file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:1388 msgid "&G-code Preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1392 +msgid "E&xit" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1392 src/slic3r/GUI/UpdateDialogs.cpp:376 +#: src/slic3r/GUI/UpdateDialogs.cpp:423 +#, c-format, boost-format +msgid "Exit %s" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 msgid "&Quit" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 #, c-format, boost-format msgid "Quit %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1410 msgid "&Select All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1327 +#: src/slic3r/GUI/MainFrame.cpp:1411 msgid "Selects all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1413 msgid "D&eselect All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1414 msgid "Deselects all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1417 msgid "&Delete Selected" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1334 +#: src/slic3r/GUI/MainFrame.cpp:1418 msgid "Deletes the current selection" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1336 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Delete &All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1421 msgid "Deletes all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1425 msgid "&Undo" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1344 +#: src/slic3r/GUI/MainFrame.cpp:1428 msgid "&Redo" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1433 msgid "&Copy" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1350 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Copy selection to clipboard" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1352 +#: src/slic3r/GUI/MainFrame.cpp:1436 msgid "&Paste" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1353 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "Paste clipboard" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 -#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 +#: src/slic3r/GUI/MainFrame.cpp:1442 src/slic3r/GUI/MainFrame.cpp:1446 +#: src/slic3r/GUI/MainFrame.cpp:1615 src/slic3r/GUI/MainFrame.cpp:1619 msgid "Re&load from Disk" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1368 +#: src/slic3r/GUI/MainFrame.cpp:1452 msgid "Searc&h" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1369 +#: src/slic3r/GUI/MainFrame.cpp:1453 msgid "Search in settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "&Plater Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "Show the plater" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "P&rint Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "Show the print settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1469 src/slic3r/GUI/MainFrame.cpp:1679 msgid "&Filament Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1469 msgid "Show the filament settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Print&er Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Show the printer settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "3&D" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "Show the 3D editing view" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Pre&view" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Show the 3D slices preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/MainFrame.cpp:1488 msgid "Open the dialog to modify shape gallery" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Print &Host Upload Queue" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Display the Print Host Upload Queue window" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open New Instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1424 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 +#: src/slic3r/GUI/MainFrame.cpp:1507 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1727 msgid "Compare Presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/MainFrame.cpp:1507 msgid "Compare presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show &Labels" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show object/instance labels in 3D scene" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1437 +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show Legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show legend in preview" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1523 msgid "&Collapse Sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1523 src/slic3r/GUI/Plater.cpp:2347 msgid "Collapse sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "&Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1543 src/slic3r/GUI/MainFrame.cpp:1650 msgid "&File" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1458 +#: src/slic3r/GUI/MainFrame.cpp:1544 msgid "&Edit" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1459 +#: src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Window" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 +#: src/slic3r/GUI/MainFrame.cpp:1546 src/slic3r/GUI/MainFrame.cpp:1651 msgid "&View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 +#: src/slic3r/GUI/MainFrame.cpp:1549 src/slic3r/GUI/MainFrame.cpp:1654 msgid "&Help" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/MainFrame.cpp:1611 msgid "&Open G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open &PrusaSlicer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legend" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1676 msgid "E&xport" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end to print" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1679 msgid "Mate&rial Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1613 +#: src/slic3r/GUI/MainFrame.cpp:1703 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1625 +#: src/slic3r/GUI/MainFrame.cpp:1715 msgid "No previously sliced file." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid "Previously sliced file (" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid ") not found." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1633 +#: src/slic3r/GUI/MainFrame.cpp:1723 msgid "File Not Found" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 #, c-format, boost-format msgid "Save %s file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "SVG" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1680 +#: src/slic3r/GUI/MainFrame.cpp:1770 msgid "Save zip file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6064 src/slic3r/GUI/Tab.cpp:1666 -#: src/slic3r/GUI/Tab.cpp:4730 +#: src/slic3r/GUI/MainFrame.cpp:1779 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6654 src/slic3r/GUI/Tab.cpp:1628 +#: src/slic3r/GUI/Tab.cpp:4986 msgid "Slicing" msgstr "" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1691 +#: src/slic3r/GUI/MainFrame.cpp:1781 #, c-format, boost-format msgid "Processing %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1714 +#: src/slic3r/GUI/MainFrame.cpp:1804 #, boost-format msgid "%1% was successfully sliced." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1717 +#: src/slic3r/GUI/MainFrame.cpp:1807 msgid "Slicing Done!" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1733 +#: src/slic3r/GUI/MainFrame.cpp:1823 msgid "Select the STL file to repair:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1743 +#: src/slic3r/GUI/MainFrame.cpp:1833 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1754 +#: src/slic3r/GUI/MainFrame.cpp:1844 msgid "Your file was repaired." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4528 +#: src/slic3r/GUI/MainFrame.cpp:1844 src/libslic3r/PrintConfig.cpp:4694 msgid "Repair" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1768 +#: src/slic3r/GUI/MainFrame.cpp:1858 msgid "Save configuration as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1785 +#: src/slic3r/GUI/MainFrame.cpp:1875 msgid "Loading of a configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 +#: src/slic3r/GUI/MainFrame.cpp:1877 src/slic3r/GUI/MainFrame.cpp:1944 msgid "Select configuration to load:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1816 +#: src/slic3r/GUI/MainFrame.cpp:1908 msgid "Exporting configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1817 +#: src/slic3r/GUI/MainFrame.cpp:1909 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1826 +#: src/slic3r/GUI/MainFrame.cpp:1918 msgid "Save presets bundle as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1849 +#: src/slic3r/GUI/MainFrame.cpp:1941 msgid "Loading of a configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1879 +#: src/slic3r/GUI/MainFrame.cpp:1971 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "" @@ -6138,206 +7456,253 @@ msgstr "" msgid "%s information" msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:752 +#: src/slic3r/GUI/NotificationManager.hpp:899 msgid "3D Mouse disconnected." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "Configuration update is available." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "See more." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:761 +#: src/slic3r/GUI/NotificationManager.hpp:908 msgid "" "You have just added a G-code for color change, but its value is empty.\n" "To export the G-code correctly, check the \"Color Change G-code\" in " "\"Printer Settings > Custom G-code\"" msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:764 +#: src/slic3r/GUI/NotificationManager.hpp:911 msgid "" "No color change event was added to the print. The print does not look like a " "sign." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:766 +#: src/slic3r/GUI/NotificationManager.hpp:913 msgid "Desktop integration was successful." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:768 +#: src/slic3r/GUI/NotificationManager.hpp:915 msgid "Desktop integration failed." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:770 +#: src/slic3r/GUI/NotificationManager.hpp:917 msgid "Undo desktop integration was successful." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:772 +#: src/slic3r/GUI/NotificationManager.hpp:919 msgid "Undo desktop integration failed." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:773 +#: src/slic3r/GUI/NotificationManager.hpp:920 msgid "Exporting." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:664 +#: src/slic3r/GUI/NotificationManager.hpp:924 +msgid "" +"PrusaSlicer recieved a download request from Printables.com, but it's not " +"allowed. You can allow it" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:925 +msgid "here." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:773 msgid "Open Folder." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:701 +#: src/slic3r/GUI/NotificationManager.cpp:811 msgid "Eject drive" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:885 +#: src/slic3r/GUI/NotificationManager.cpp:1054 +#: src/slic3r/GUI/NotificationManager.cpp:1267 +#: src/slic3r/GUI/NotificationManager.cpp:1472 msgid "ERROR" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:890 -msgid "CANCELED" +#: src/slic3r/GUI/NotificationManager.cpp:1269 +#: src/slic3r/GUI/NotificationManager.cpp:1377 +msgid "COMPLETED" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:895 -msgid "COMPLETED" +#: src/slic3r/GUI/NotificationManager.cpp:1467 +msgid "RESOLVING ADDRESS" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:937 +#: src/slic3r/GUI/NotificationManager.cpp:1477 +msgid "CANCELED" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:1539 msgid "Cancel upload" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:996 +#: src/slic3r/GUI/NotificationManager.cpp:1648 #, c-format, boost-format msgid "%1$d object was loaded with custom supports." msgid_plural "%1$d objects were loaded with custom supports." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/NotificationManager.cpp:997 +#: src/slic3r/GUI/NotificationManager.cpp:1649 #, c-format, boost-format msgid "%1$d object was loaded with custom seam." msgid_plural "%1$d objects were loaded with custom seam." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/NotificationManager.cpp:998 +#: src/slic3r/GUI/NotificationManager.cpp:1650 #, c-format, boost-format msgid "%1$d object was loaded with multimaterial painting." msgid_plural "%1$d objects were loaded with multimaterial painting." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/NotificationManager.cpp:999 +#: src/slic3r/GUI/NotificationManager.cpp:1651 #, c-format, boost-format msgid "%1$d object was loaded with variable layer height." msgid_plural "%1$d objects were loaded with variable layer height." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/NotificationManager.cpp:1000 +#: src/slic3r/GUI/NotificationManager.cpp:1652 #, c-format, boost-format msgid "%1$d object was loaded with partial sinking." msgid_plural "%1$d objects were loaded with partial sinking." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1653 +#, c-format, boost-format +msgid "%1$d object was loaded as a part of cut object." +msgid_plural "%1$d objects were loaded as parts of cut object" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Slicing finished." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export G-Code." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1447 -#: src/slic3r/GUI/NotificationManager.cpp:1454 -#: src/slic3r/GUI/NotificationManager.cpp:1470 -#: src/slic3r/GUI/NotificationManager.cpp:1476 -#: src/slic3r/GUI/NotificationManager.cpp:1547 +#: src/slic3r/GUI/NotificationManager.cpp:2101 +#: src/slic3r/GUI/NotificationManager.cpp:2108 +#: src/slic3r/GUI/NotificationManager.cpp:2124 +#: src/slic3r/GUI/NotificationManager.cpp:2130 +#: src/slic3r/GUI/NotificationManager.cpp:2201 msgid "ERROR:" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1459 -#: src/slic3r/GUI/NotificationManager.cpp:1486 -#: src/slic3r/GUI/NotificationManager.cpp:1494 -#: src/slic3r/GUI/NotificationManager.cpp:1505 src/slic3r/GUI/Plater.cpp:3197 +#: src/slic3r/GUI/NotificationManager.cpp:2113 +#: src/slic3r/GUI/NotificationManager.cpp:2140 +#: src/slic3r/GUI/NotificationManager.cpp:2148 +#: src/slic3r/GUI/NotificationManager.cpp:2159 src/slic3r/GUI/Plater.cpp:3220 msgid "WARNING:" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1598 +#: src/slic3r/GUI/NotificationManager.cpp:2275 msgid "Exporting finished." msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:50 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 msgid "Paint-on seam" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:52 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:68 +msgid "Cut connectors" +msgstr "" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:70 msgid "Sinking" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:110 msgid "Instances" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:98 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:266 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:114 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:275 #, c-format, boost-format msgid "Instance %d" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4568 -#: src/slic3r/GUI/Tab.cpp:4659 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:121 src/slic3r/GUI/Tab.cpp:4805 +#: src/slic3r/GUI/Tab.cpp:4942 msgid "Layers" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 msgid "Range" msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:258 +#: src/slic3r/GUI/OpenGLManager.cpp:376 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL ES 2.0 capable graphics driver to run " +"correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:379 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL %s capable graphics driver to run correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:382 #, c-format, boost-format msgid "" "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" "while OpenGL version %s, render %s, vendor %s was detected." msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:261 +#: src/slic3r/GUI/OpenGLManager.cpp:386 msgid "You may need to update your graphics card driver." msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:264 +#: src/slic3r/GUI/OpenGLManager.cpp:389 msgid "" "As a workaround, you may run PrusaSlicer with a software rendered 3D " "graphics by running prusa-slicer.exe with the --sw-renderer parameter." msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:266 +#: src/slic3r/GUI/OpenGLManager.cpp:391 msgid "Unsupported OpenGL version" msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:274 +#: src/slic3r/GUI/OpenGLManager.cpp:399 #, c-format, boost-format msgid "" "Unable to load the following shaders:\n" "%s" msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:275 +#: src/slic3r/GUI/OpenGLManager.cpp:400 msgid "Error loading shaders" msgstr "" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:126 +msgid "Unavailable for this method." +msgstr "" + +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Top" msgstr "" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Bottom" msgstr "" @@ -6346,7 +7711,7 @@ msgstr "" msgid "Delete this preset from this printer device" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:83 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:84 msgid "This printer will be shown in the presets list as" msgstr "" @@ -6362,80 +7727,80 @@ msgstr "" msgid "Add preset for this printer device" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2255 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2239 msgid "Print Host upload" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:268 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:271 msgid "Connection to printers connected via the print host failed." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:310 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:313 msgid "Test" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:315 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:318 msgid "Could not get a valid Printer Host reference" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:330 msgid "Success!" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:337 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:340 msgid "Refresh Printers" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:367 msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:374 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:377 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:378 msgid "Open CA certificate file" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:404 -#: src/libslic3r/PrintConfig.cpp:330 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:407 +#: src/libslic3r/PrintConfig.cpp:343 msgid "HTTPS CA File" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:405 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:408 #, c-format, boost-format msgid "" "On this system, %s uses HTTPS certificates from the system Certificate Store " "or Keychain." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:406 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:409 msgid "" "To use a custom CA file, please import your CA file into Certificate Store / " "Keychain." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:634 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:706 msgid "The supplied name is empty. It can't be saved." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:638 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:710 msgid "You have to enter a printer name." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:646 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:718 #, boost-format msgid "Printer with name \"%1%\" already exists." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:647 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:719 msgid "Replace?" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:674 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:746 #, boost-format msgid "" "Following printer preset is duplicated:%1%The above preset for printer \"%2%" @@ -6446,229 +7811,226 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:724 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:796 msgid "It's not possible to delete the last related preset for the printer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:141 +#: src/slic3r/GUI/Plater.cpp:158 msgid "The provided name is not valid;" msgstr "" -#: src/slic3r/GUI/Plater.cpp:142 src/slic3r/GUI/SavePresetDialog.cpp:102 +#: src/slic3r/GUI/Plater.cpp:159 src/slic3r/GUI/SavePresetDialog.cpp:166 msgid "the following characters are not allowed:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:207 +#: src/slic3r/GUI/Plater.cpp:223 msgid "" "For a multipart object, this value isn't accurate.\n" "It doesn't take account of intersections and negative volumes." msgstr "" -#: src/slic3r/GUI/Plater.cpp:211 +#: src/slic3r/GUI/Plater.cpp:227 msgid "Volume" msgstr "" -#: src/slic3r/GUI/Plater.cpp:213 +#: src/slic3r/GUI/Plater.cpp:229 msgid "Facets" msgstr "" -#: src/slic3r/GUI/Plater.cpp:276 +#: src/slic3r/GUI/Plater.cpp:286 msgid "Sliced Info" msgstr "" -#: src/slic3r/GUI/Plater.cpp:296 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:306 src/slic3r/GUI/Plater.cpp:1414 msgid "Used Filament (g)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:297 src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:307 src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (m)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:298 src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:308 src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (mm³)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:299 +#: src/slic3r/GUI/Plater.cpp:309 msgid "Used Material (unit)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:300 +#: src/slic3r/GUI/Plater.cpp:310 msgid "Cost (money)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:301 src/slic3r/GUI/Plater.cpp:1340 -#: src/slic3r/GUI/Plater.cpp:1427 +#: src/slic3r/GUI/Plater.cpp:311 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:1464 msgid "Estimated printing time" msgstr "" -#: src/slic3r/GUI/Plater.cpp:302 +#: src/slic3r/GUI/Plater.cpp:312 msgid "Number of tool changes" msgstr "" -#: src/slic3r/GUI/Plater.cpp:431 +#: src/slic3r/GUI/Plater.cpp:437 msgid "Select what kind of support do you need" msgstr "" -#: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2590 -#: src/libslic3r/PrintConfig.cpp:3645 +#: src/slic3r/GUI/Plater.cpp:440 src/libslic3r/PrintConfig.cpp:2620 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "Support on build plate only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:434 src/slic3r/GUI/Plater.cpp:564 +#: src/slic3r/GUI/Plater.cpp:441 msgid "For support enforcers only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Plater.cpp:442 msgid "Everywhere" msgstr "" -#: src/slic3r/GUI/Plater.cpp:467 src/slic3r/GUI/Tab.cpp:1542 +#: src/slic3r/GUI/Plater.cpp:475 src/slic3r/GUI/Tab.cpp:1489 msgid "Brim" msgstr "" -#: src/slic3r/GUI/Plater.cpp:469 +#: src/slic3r/GUI/Plater.cpp:477 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:477 +#: src/slic3r/GUI/Plater.cpp:485 msgid "Purging volumes" msgstr "" -#: src/slic3r/GUI/Plater.cpp:578 +#: src/slic3r/GUI/Plater.cpp:592 msgid "Select what kind of pad do you need" msgstr "" -#: src/slic3r/GUI/Plater.cpp:580 +#: src/slic3r/GUI/Plater.cpp:595 msgid "Below object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:581 +#: src/slic3r/GUI/Plater.cpp:596 msgid "Around object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:894 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/Plater.cpp:929 src/slic3r/GUI/Plater.cpp:7162 msgid "Send to printer" msgstr "" -#: src/slic3r/GUI/Plater.cpp:914 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6067 +#: src/slic3r/GUI/Plater.cpp:949 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6657 msgid "Slice now" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1087 +#: src/slic3r/GUI/Plater.cpp:1127 msgid "Hold Shift to Slice & Export G-code" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1287 +#: src/slic3r/GUI/Plater.cpp:1324 #, boost-format msgid "%1% (%2$d shell)" msgid_plural "%1% (%2$d shells)" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:1315 +#: src/slic3r/GUI/Plater.cpp:1352 msgid "Used Material (ml)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "object" msgid_plural "objects" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "supports and pad" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (in)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "wipe tower" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (in³)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1396 +#: src/slic3r/GUI/Plater.cpp:1433 #, boost-format msgid "Filament at extruder %1%" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1402 +#: src/slic3r/GUI/Plater.cpp:1439 msgid "(including spool)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1072 -#: src/libslic3r/PrintConfig.cpp:3439 src/libslic3r/PrintConfig.cpp:3440 +#: src/slic3r/GUI/Plater.cpp:1448 src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:3716 src/libslic3r/PrintConfig.cpp:3717 msgid "Cost" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1429 +#: src/slic3r/GUI/Plater.cpp:1466 msgid "normal mode" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1436 +#: src/slic3r/GUI/Plater.cpp:1473 msgid "stealth mode" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1670 -msgid "Fill bed" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1676 -msgid "Optimize Rotation" +#: src/slic3r/GUI/Plater.cpp:1734 +#, boost-format +msgid "Do you want to save the changes to \"%1%\"?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1682 -msgid "Import SLA archive" +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:905 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1599 +msgid "Save" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1725 -#, boost-format -msgid "Do you want to save the changes to \"%1%\"?" +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +msgid "Discard" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1730 src/slic3r/GUI/Preferences.cpp:222 +#: src/slic3r/GUI/Plater.cpp:1740 src/slic3r/GUI/Preferences.cpp:354 msgid "Ask for unsaved changes in project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1733 +#: src/slic3r/GUI/Plater.cpp:1743 msgid "" "You will not be asked about it again, when: \n" "- Closing PrusaSlicer,\n" "- Loading or creating a new project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2198 +#: src/slic3r/GUI/Plater.cpp:2214 #, c-format, boost-format msgid "" "Successfully unmounted. The device %s(%s) can now be safely removed from the " "computer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2203 +#: src/slic3r/GUI/Plater.cpp:2220 #, c-format, boost-format msgid "Ejecting of device %s(%s) has failed." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2222 src/slic3r/GUI/Plater.cpp:5108 +#: src/slic3r/GUI/Plater.cpp:2239 src/slic3r/GUI/Plater.cpp:5199 msgid "New Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2319 +#: src/slic3r/GUI/Plater.cpp:2346 msgid "Expand sidebar" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2518 +#: src/slic3r/GUI/Plater.cpp:2428 msgid "" "The preset below was temporarily installed on the active instance of " "PrusaSlicer" @@ -6678,12 +8040,12 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:2548 +#: src/slic3r/GUI/Plater.cpp:2583 #, boost-format msgid "Failed loading file \"%1%\" due to an invalid configuration." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2568 +#: src/slic3r/GUI/Plater.cpp:2603 #, c-format, boost-format msgid "" "Object size from file %s appears to be zero.\n" @@ -6694,11 +8056,11 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:2572 +#: src/slic3r/GUI/Plater.cpp:2607 msgid "The size of the object is zero" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2585 +#: src/slic3r/GUI/Plater.cpp:2620 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in meters.\n" @@ -6711,15 +8073,15 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:2589 src/slic3r/GUI/Plater.cpp:2611 +#: src/slic3r/GUI/Plater.cpp:2624 src/slic3r/GUI/Plater.cpp:2646 msgid "The object is too small" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2590 src/slic3r/GUI/Plater.cpp:2612 +#: src/slic3r/GUI/Plater.cpp:2625 src/slic3r/GUI/Plater.cpp:2647 msgid "Apply to all the remaining small objects being loaded." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2607 +#: src/slic3r/GUI/Plater.cpp:2642 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in inches.\n" @@ -6732,180 +8094,189 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:2625 +#: src/slic3r/GUI/Plater.cpp:2659 msgid "" "This file contains several objects positioned at multiple heights.\n" "Instead of considering them as multiple objects, should \n" "the file be loaded as a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2628 src/slic3r/GUI/Plater.cpp:2683 +#: src/slic3r/GUI/Plater.cpp:2662 src/slic3r/GUI/Plater.cpp:2711 msgid "Multi-part object detected" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2636 +#: src/slic3r/GUI/Plater.cpp:2669 msgid "" "This file cannot be loaded in a simple mode. Do you want to switch to an " "advanced mode?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2637 +#: src/slic3r/GUI/Plater.cpp:2670 msgid "Detected advanced data" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2657 -#, c-format, boost-format -msgid "" -"You can't to add the object(s) from %s because of one or some of them " -"is(are) multi-part" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2680 +#: src/slic3r/GUI/Plater.cpp:2708 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" "these files to represent a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2799 +#: src/slic3r/GUI/Plater.cpp:2827 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2800 +#: src/slic3r/GUI/Plater.cpp:2828 msgid "Object too large?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2878 +#: src/slic3r/GUI/Plater.cpp:2908 msgid "Export STL file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2885 +#: src/slic3r/GUI/Plater.cpp:2915 msgid "Export AMF file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2891 +#: src/slic3r/GUI/Plater.cpp:2921 msgid "Save file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2897 +#: src/slic3r/GUI/Plater.cpp:2927 msgid "Export OBJ file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2995 +#: src/slic3r/GUI/Plater.cpp:3030 +msgid "Delete object which is a part of cut object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3031 +msgid "" +"You try to delete an object which is a part of a cut object.\n" +"This action will break a cut correspondence.\n" +"After that PrusaSlicer can't guarantee model consistency" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3035 +msgid "Delete object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3040 msgid "Delete Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3007 +#: src/slic3r/GUI/Plater.cpp:3057 msgid "Delete All Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3035 +#: src/slic3r/GUI/Plater.cpp:3086 msgid "Reset Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3118 +#: src/slic3r/GUI/Plater.cpp:3141 msgid "" "The selected object couldn't be split because it contains only one solid " "part." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3125 +#: src/slic3r/GUI/Plater.cpp:3148 msgid "All non-solid parts (modifiers) were deleted" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3127 +#: src/slic3r/GUI/Plater.cpp:3150 msgid "Split to Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3179 +#: src/slic3r/GUI/Plater.cpp:3202 msgid "" "An object has custom support enforcers which will not be used because " "supports are disabled." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3181 +#: src/slic3r/GUI/Plater.cpp:3204 msgid "Enable supports for enforcers only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3310 src/slic3r/GUI/Plater.cpp:4176 +#: src/slic3r/GUI/Plater.cpp:3339 src/slic3r/GUI/Plater.cpp:4238 msgid "Invalid data" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3380 +#: src/slic3r/GUI/Plater.cpp:3410 msgid "Another export job is currently running." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3466 +#: src/slic3r/GUI/Plater.cpp:3496 msgid "Replace from:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3484 +#: src/slic3r/GUI/Plater.cpp:3514 msgid "Unable to replace with more than one volume" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3484 src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3514 src/slic3r/GUI/Plater.cpp:3597 msgid "Error during replace" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3555 +#: src/slic3r/GUI/Plater.cpp:3589 msgid "Select the new file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3597 msgid "File for the replace wasn't selected" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3654 +#: src/slic3r/GUI/Plater.cpp:3684 msgid "Please select the file to reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3685 src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:3715 src/slic3r/GUI/Plater.cpp:5355 +#: src/slic3r/GUI/Plater.cpp:5365 msgid "The selected file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "differs from the original file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "Do you want to replace it" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3703 src/slic3r/GUI/Plater.cpp:3709 +#: src/slic3r/GUI/Plater.cpp:3736 src/slic3r/GUI/Plater.cpp:3742 msgid "Reload from:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3812 +#: src/slic3r/GUI/Plater.cpp:3864 msgid "Unable to reload:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3817 +#: src/slic3r/GUI/Plater.cpp:3869 msgid "Error during reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3835 +#: src/slic3r/GUI/Plater.cpp:3887 msgid "Reload all from disk" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4130 +#: src/slic3r/GUI/Plater.cpp:4191 msgid "There are active warnings concerning sliced models:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4141 +#: src/slic3r/GUI/Plater.cpp:4202 msgid "generated warnings" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4472 +#: src/slic3r/GUI/Plater.cpp:4554 msgid "3D editor view" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4893 +#: src/slic3r/GUI/Plater.cpp:4980 msgid "Undo / Redo is processing" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4895 +#: src/slic3r/GUI/Plater.cpp:4982 #, boost-format msgid "" "Switching the printer technology from %1% to %2%.\n" @@ -6913,223 +8284,284 @@ msgid "" "printer technology." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5092 +#: src/slic3r/GUI/Plater.cpp:5184 msgid "Creating a new project while the current project is modified." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5095 +#: src/slic3r/GUI/Plater.cpp:5187 msgid "Creating a new project while some presets are modified." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5096 +#: src/slic3r/GUI/Plater.cpp:5188 msgid "You can keep presets modifications to the new project or discard them" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5097 +#: src/slic3r/GUI/Plater.cpp:5189 msgid "" "You can keep presets modifications to the new project, discard them or save " "changes as new presets.\n" "Note, if changes will be saved then new project wouldn't keep them" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5103 +#: src/slic3r/GUI/Plater.cpp:5194 msgid "Creating a new project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5137 +#: src/slic3r/GUI/Plater.cpp:5228 msgid "Load Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5167 src/slic3r/GUI/Plater.cpp:5432 +#: src/slic3r/GUI/Plater.cpp:5258 msgid "Import Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5171 +#: src/slic3r/GUI/Plater.cpp:5262 msgid "Import Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:5291 +msgid "Import SLA archive" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5355 src/slic3r/GUI/Plater.cpp:5365 msgid "does not contain valid gcode." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5244 +#: src/slic3r/GUI/Plater.cpp:5356 src/slic3r/GUI/Plater.cpp:5366 msgid "Error while loading .gcode file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5297 +#: src/slic3r/GUI/Plater.cpp:5433 +#, c-format, boost-format +msgid "%s - Multiple projects file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 +msgid "There are several files being loaded, including Project files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 src/slic3r/GUI/Plater.cpp:5446 +msgid "Select an action to apply to all files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5446 +msgid "There are several files being loaded." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5448 src/slic3r/GUI/Plater.cpp:5842 +msgid "Action" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5469 +msgid "Import geometry" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5482 src/slic3r/GUI/Plater.cpp:5834 +msgid "Start new PrusaSlicer instance" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5496 +msgid "Select one to load as project" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5507 +msgid "Select one to load config only" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5609 +#, boost-format +msgid "Failed to unzip file to %1%: %2% " +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5618 +#, boost-format +msgid "Failed to find unzipped file at %1%. Unzipping of file has failed." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5821 #, c-format, boost-format -msgid "%s - Drop project file" +msgid "%s - Load project file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5304 +#: src/slic3r/GUI/Plater.cpp:5830 msgid "Open as project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5305 +#: src/slic3r/GUI/Plater.cpp:5831 msgid "Import geometry only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5306 +#: src/slic3r/GUI/Plater.cpp:5832 msgid "Import config only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5309 +#: src/slic3r/GUI/Plater.cpp:5837 msgid "Select an action to apply to the file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5314 -msgid "Action" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:5330 +#: src/slic3r/GUI/Plater.cpp:5858 msgid "Don't show again" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5371 +#: src/slic3r/GUI/Plater.cpp:5899 msgid "You can open only one .gcode file at a time." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5372 +#: src/slic3r/GUI/Plater.cpp:5900 msgid "Drag and drop G-code file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5454 +#: src/slic3r/GUI/Plater.cpp:5992 msgid "Load File" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5459 +#: src/slic3r/GUI/Plater.cpp:5997 msgid "Load Files" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5509 +#: src/slic3r/GUI/Plater.cpp:6047 msgid "All objects will be removed, continue?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5520 +#: src/slic3r/GUI/Plater.cpp:6058 msgid "Delete Selected Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5529 +#: src/slic3r/GUI/Plater.cpp:6067 msgid "Increase Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5563 +#: src/slic3r/GUI/Plater.cpp:6109 msgid "Decrease Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5614 +#: src/slic3r/GUI/Plater.cpp:6167 msgid "Enter the number of copies:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5615 +#: src/slic3r/GUI/Plater.cpp:6168 msgid "Copies of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5619 +#: src/slic3r/GUI/Plater.cpp:6171 #, c-format, boost-format msgid "Set numbers of copies to %d" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5697 -msgid "Cut by Plane" +#: src/slic3r/GUI/Plater.cpp:6187 +msgid "Fill bed" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save G-code file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save SL1 / SL1S file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5766 +#: src/slic3r/GUI/Plater.cpp:6336 msgid "The provided file name is not valid." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5767 +#: src/slic3r/GUI/Plater.cpp:6337 msgid "The following characters are not allowed by a FAT file system:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "" "The plater is empty.\n" "Do you want to save the project?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "Save project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:6543 -msgid "Export" +#: src/slic3r/GUI/Plater.cpp:6766 +msgid "Is the printer ready? Is the print sheet in place, empty and clean?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:6575 -msgid "" -"Custom supports, seams and multimaterial painting were removed after " -"repairing the mesh." +#: src/slic3r/GUI/Plater.cpp:6766 src/slic3r/GUI/PrintHostDialogs.cpp:132 +msgid "Upload and Print" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:7161 +msgid "Export" msgstr "" -#: src/slic3r/GUI/Plater.cpp:6689 +#: src/slic3r/GUI/Plater.cpp:7306 msgid "Paste From Clipboard" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2290 -#: src/slic3r/GUI/Tab.cpp:2517 src/slic3r/GUI/Tab.cpp:2624 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Preferences.cpp:240 src/slic3r/GUI/Tab.cpp:2274 +#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2617 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "General" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:121 +#: src/slic3r/GUI/Preferences.cpp:258 msgid "Remember output directory" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:123 +#: src/slic3r/GUI/Preferences.cpp:259 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:129 +#: src/slic3r/GUI/Preferences.cpp:263 msgid "Auto-center parts" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:131 +#: src/slic3r/GUI/Preferences.cpp:264 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:137 +#: src/slic3r/GUI/Preferences.cpp:268 msgid "Background processing" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:139 +#: src/slic3r/GUI/Preferences.cpp:269 msgid "" "If this is enabled, Slic3r will pre-process objects as soon as they're " "loaded in order to save time when exporting G-code." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:148 +#: src/slic3r/GUI/Preferences.cpp:274 +msgid "Alert when supports needed" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:275 +msgid "" +"If this is enabled, Slic3r will raise alerts when it detects issues in the " +"sliced object, that can be resolved with supports (and brim). Examples of " +"such issues are floating object parts, unsupported extrusions and low bed " +"adhesion." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:285 msgid "Export sources full pathnames to 3mf and amf" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:150 +#: src/slic3r/GUI/Preferences.cpp:286 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:159 +#: src/slic3r/GUI/Preferences.cpp:293 msgid "If enabled, sets PrusaSlicer as default application to open .3mf files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:166 +#: src/slic3r/GUI/Preferences.cpp:298 msgid "If enabled, sets PrusaSlicer as default application to open .stl files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:177 +#: src/slic3r/GUI/Preferences.cpp:307 msgid "" "If enabled, Slic3r downloads updates of built-in system presets in the " "background. These updates are downloaded into a separate temporary location. " @@ -7137,216 +8569,233 @@ msgid "" "startup." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:182 +#: src/slic3r/GUI/Preferences.cpp:312 msgid "Suppress \" - default - \" presets" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:184 +#: src/slic3r/GUI/Preferences.cpp:313 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:190 +#: src/slic3r/GUI/Preferences.cpp:317 +msgid "Suppress \" Template \" filament presets" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:318 +msgid "" +"Suppress \" Template \" filament presets in configuration wizard and sidebar " +"visibility." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:322 msgid "Show incompatible print and filament presets" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:323 msgid "" "When checked, the print and filament presets are shown in the preset editor " "even if they are marked as incompatible with the active printer" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:200 +#: src/slic3r/GUI/Preferences.cpp:331 +msgid "Show load project dialog" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:332 +msgid "" +"When checked, whenever dragging and dropping a project file on the " +"application or open it from a browser, shows a dialog asking to select the " +"action to take on the file to load." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:335 msgid "Show drop project dialog" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:202 +#: src/slic3r/GUI/Preferences.cpp:336 msgid "" "When checked, whenever dragging and dropping a project file on the " "application, shows a dialog asking to select the action to take on the file " "to load." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:208 src/slic3r/GUI/Preferences.cpp:212 +#: src/slic3r/GUI/Preferences.cpp:342 src/slic3r/GUI/Preferences.cpp:346 msgid "Allow just a single PrusaSlicer instance" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:210 +#: src/slic3r/GUI/Preferences.cpp:343 msgid "" "On OSX there is always only one instance of app running by default. However " "it is allowed to run multiple instances of same app from the command line. " "In such case this settings will allow only one instance." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:214 +#: src/slic3r/GUI/Preferences.cpp:347 msgid "" "If this is enabled, when starting PrusaSlicer and another instance of the " "same PrusaSlicer is already running, that instance will be reactivated " "instead." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:224 +#: src/slic3r/GUI/Preferences.cpp:355 msgid "" "Always ask for unsaved changes in project, when: \n" "- Closing PrusaSlicer,\n" "- Loading or creating a new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:233 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:897 +#: src/slic3r/GUI/Preferences.cpp:363 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:925 msgid "" "Ask to save unsaved changes in presets when closing the application or when " "loading a new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:235 +#: src/slic3r/GUI/Preferences.cpp:364 msgid "" "Always ask for unsaved changes in presets, when: \n" "- Closing PrusaSlicer while some presets are modified,\n" "- Loading a new project while some presets are modified" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:242 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:896 +#: src/slic3r/GUI/Preferences.cpp:370 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:924 msgid "Ask for unsaved changes in presets when selecting new preset" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:244 +#: src/slic3r/GUI/Preferences.cpp:371 msgid "" "Always ask for unsaved changes in presets when selecting new preset or " "resetting a preset" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:249 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 +#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:923 msgid "Ask for unsaved changes in presets when creating new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:251 +#: src/slic3r/GUI/Preferences.cpp:376 msgid "Always ask for unsaved changes in presets when creating new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:258 +#: src/slic3r/GUI/Preferences.cpp:382 msgid "Associate .gcode files to PrusaSlicer G-code Viewer" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:260 +#: src/slic3r/GUI/Preferences.cpp:383 msgid "" "If enabled, sets PrusaSlicer G-code Viewer as default application to open ." "gcode files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:268 +#: src/slic3r/GUI/Preferences.cpp:390 msgid "Use Retina resolution for the 3D scene" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:270 +#: src/slic3r/GUI/Preferences.cpp:391 msgid "" "If enabled, the 3D scene will be rendered in Retina resolution. If you are " "experiencing 3D performance problems, disabling this option may help." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:280 src/slic3r/GUI/Preferences.cpp:282 +#: src/slic3r/GUI/Preferences.cpp:400 src/slic3r/GUI/Preferences.cpp:401 msgid "Show splash screen" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:289 +#: src/slic3r/GUI/Preferences.cpp:406 msgid "If enabled, PrusaSlicer will be open at the position it was closed" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:295 +#: src/slic3r/GUI/Preferences.cpp:411 msgid "Clear Undo / Redo stack on new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:297 +#: src/slic3r/GUI/Preferences.cpp:412 msgid "" "Clear Undo / Redo stack on new project or when an existing project is loaded." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:303 +#: src/slic3r/GUI/Preferences.cpp:417 msgid "Enable support for legacy 3DConnexion devices" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:305 +#: src/slic3r/GUI/Preferences.cpp:418 msgid "" "If enabled, the legacy 3DConnexion devices settings dialog is available by " "pressing CTRL+M" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:314 +#: src/slic3r/GUI/Preferences.cpp:425 msgid "Camera" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:319 +#: src/slic3r/GUI/Preferences.cpp:435 msgid "Use perspective camera" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:321 +#: src/slic3r/GUI/Preferences.cpp:436 msgid "" "If enabled, use perspective camera. If not enabled, use orthographic camera." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:326 +#: src/slic3r/GUI/Preferences.cpp:440 msgid "Use free camera" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:328 +#: src/slic3r/GUI/Preferences.cpp:441 msgid "If enabled, use free camera. If not enabled, use constrained camera." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:333 +#: src/slic3r/GUI/Preferences.cpp:445 msgid "Reverse direction of zoom with mouse wheel" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:335 +#: src/slic3r/GUI/Preferences.cpp:446 msgid "If enabled, reverses the direction of zoom with mouse wheel" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:343 +#: src/slic3r/GUI/Preferences.cpp:452 msgid "GUI" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:366 +#: src/slic3r/GUI/Preferences.cpp:492 msgid "Sequential slider applied only to top layer" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:368 +#: src/slic3r/GUI/Preferences.cpp:493 msgid "" "If enabled, changes made using the sequential slider, in preview, apply only " -"to gcode top layer. If disabled, changes made using the sequential slider, " -"in preview, apply to the whole gcode." +"to gcode top layer.If disabled, changes made using the sequential slider, in " +"preview, apply to the whole gcode." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/Preferences.cpp:499 msgid "Show sidebar collapse/expand button" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:377 +#: src/slic3r/GUI/Preferences.cpp:500 msgid "" "If enabled, the button for the collapse sidebar will be appeared in top " "right corner of the 3D Scene" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:384 -msgid "If enabled, PrusaSlicer will not open hyperlinks in your browser." -msgstr "" - -#: src/slic3r/GUI/Preferences.cpp:391 +#: src/slic3r/GUI/Preferences.cpp:511 msgid "Use colors for axes values in Manipulation panel" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:393 +#: src/slic3r/GUI/Preferences.cpp:512 msgid "" "If enabled, the axes names and axes values will be colorized according to " "the axes colors. If disabled, old UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:399 +#: src/slic3r/GUI/Preferences.cpp:517 msgid "Order object volumes by types" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:401 +#: src/slic3r/GUI/Preferences.cpp:518 msgid "" "If enabled, volumes will be always ordered inside the object. Correct order " "is Model Part, Negative Volume, Modifier, Support Blocker and Support " @@ -7354,193 +8803,240 @@ msgid "" "Modifiers. But one of the model parts have to be on the first place." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:408 +#: src/slic3r/GUI/Preferences.cpp:523 +msgid "Show non-manifold edges" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:524 +msgid "If enabled, shows non-manifold edges." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:528 +msgid "Allow automatically color change" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:529 +msgid "" +"If enabled, related notification will be shown, when sliced object looks " +"like a logo or a sign." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:534 msgid "Set settings tabs as menu items (experimental)" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:410 +#: src/slic3r/GUI/Preferences.cpp:535 msgid "" "If enabled, Settings Tabs will be placed as menu items. If disabled, old UI " "will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:419 +#: src/slic3r/GUI/Preferences.cpp:542 msgid "Show \"Tip of the day\" notification after start" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:421 +#: src/slic3r/GUI/Preferences.cpp:543 msgid "If enabled, useful hints are displayed at startup." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:427 +#: src/slic3r/GUI/Preferences.cpp:547 msgid "Notify about new releases" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:429 +#: src/slic3r/GUI/Preferences.cpp:548 msgid "" "You will be notified about new release after startup acordingly: All = " "Regular release and alpha / beta releases. Release only = regular release." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:435 +#: src/slic3r/GUI/Preferences.cpp:551 msgid "Release only" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:444 +#: src/slic3r/GUI/Preferences.cpp:558 msgid "Use custom size for toolbar icons" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:446 +#: src/slic3r/GUI/Preferences.cpp:559 msgid "If enabled, you can change size of toolbar icons manually." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:471 +#: src/slic3r/GUI/Preferences.cpp:577 src/slic3r/GUI/Tab.cpp:1659 +msgid "Other" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:594 +msgid "If enabled, PrusaSlicer will not open a hyperlinks in your browser." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:600 +msgid "Allow downloads from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:601 +msgid "If enabled, PrusaSlicer will be allowed to download from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:610 msgid "Render" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:476 +#: src/slic3r/GUI/Preferences.cpp:620 msgid "Use environment map" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:478 +#: src/slic3r/GUI/Preferences.cpp:621 msgid "If enabled, renders object using the environment map." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:491 +#: src/slic3r/GUI/Preferences.cpp:629 msgid "Dark mode (experimental)" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:496 +#: src/slic3r/GUI/Preferences.cpp:639 msgid "Enable dark mode" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:498 +#: src/slic3r/GUI/Preferences.cpp:640 msgid "" "If enabled, UI will use Dark mode colors. If disabled, old UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:507 +#: src/slic3r/GUI/Preferences.cpp:647 msgid "Use system menu for application" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:509 +#: src/slic3r/GUI/Preferences.cpp:648 msgid "" "If enabled, application will use the standard Windows system menu,\n" -"but on some combination of display scales it can looks ugly. If disabled, " -"old UI will be used." +"but on some combination od display scales it can look ugly. If disabled, old " +"UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:578 +#: src/slic3r/GUI/Preferences.cpp:726 msgid "Changes for the critical options" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:580 +#: src/slic3r/GUI/Preferences.cpp:728 msgid "" "Changing some options will trigger application restart.\n" "You will lose the content of the plater." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:694 +#: src/slic3r/GUI/Preferences.cpp:921 msgid "Icon size in a respect to the default size" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:709 +#: src/slic3r/GUI/Preferences.cpp:936 msgid "Select toolbar icon size in respect to the default one." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:743 src/slic3r/GUI/Preferences.cpp:754 +#: src/slic3r/GUI/Preferences.cpp:972 +msgid "Layout Options" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:981 msgid "Old regular layout with the tab bar" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:744 +#: src/slic3r/GUI/Preferences.cpp:982 msgid "New layout, access via settings button in the top menu" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:745 src/slic3r/GUI/Preferences.cpp:755 +#: src/slic3r/GUI/Preferences.cpp:983 msgid "Settings in non-modal window" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:763 -msgid "Layout Options" +#: src/slic3r/GUI/Preferences.cpp:1025 +msgid "Text colors" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:806 -msgid "Text colors" +#: src/slic3r/GUI/Preferences.cpp:1049 +msgid "Mode markers" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:249 -#: src/slic3r/GUI/PresetComboBoxes.cpp:287 -#: src/slic3r/GUI/PresetComboBoxes.cpp:794 -#: src/slic3r/GUI/PresetComboBoxes.cpp:849 -#: src/slic3r/GUI/PresetComboBoxes.cpp:989 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1033 +#: src/slic3r/GUI/PresetComboBoxes.cpp:254 +#: src/slic3r/GUI/PresetComboBoxes.cpp:306 +#: src/slic3r/GUI/PresetComboBoxes.cpp:846 +#: src/slic3r/GUI/PresetComboBoxes.cpp:909 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1073 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1125 msgid "System presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:291 -#: src/slic3r/GUI/PresetComboBoxes.cpp:853 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1037 +#: src/slic3r/GUI/PresetComboBoxes.cpp:310 +#: src/slic3r/GUI/PresetComboBoxes.cpp:915 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1130 msgid "User presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:302 +#: src/slic3r/GUI/PresetComboBoxes.cpp:321 msgid "Incompatible presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:337 +#: src/slic3r/GUI/PresetComboBoxes.cpp:364 #, boost-format msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:340 +#: src/slic3r/GUI/PresetComboBoxes.cpp:366 msgid "Delete Physical Printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:581 +#: src/slic3r/GUI/PresetComboBoxes.cpp:612 msgid "Click to edit preset" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:697 -#: src/slic3r/GUI/PresetComboBoxes.cpp:737 +#: src/slic3r/GUI/PresetComboBoxes.cpp:740 +#: src/slic3r/GUI/PresetComboBoxes.cpp:788 msgid "Add/Remove presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:745 +#: src/slic3r/GUI/PresetComboBoxes.cpp:793 src/slic3r/GUI/Tab.cpp:3312 msgid "Add physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:716 +#: src/slic3r/GUI/PresetComboBoxes.cpp:759 msgid "Edit preset" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:722 +#: src/slic3r/GUI/PresetComboBoxes.cpp:765 msgid "Change extruder color" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:773 src/slic3r/GUI/Tab.cpp:3312 msgid "Edit physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:733 +#: src/slic3r/GUI/PresetComboBoxes.cpp:779 +msgid "Open physical printer URL" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:784 msgid "Delete physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:864 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1051 +#: src/slic3r/GUI/PresetComboBoxes.cpp:924 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1142 +msgid "Template presets" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:935 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1156 msgid "Physical printers" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:888 +#: src/slic3r/GUI/PresetComboBoxes.cpp:959 msgid "Add/Remove filaments" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:890 +#: src/slic3r/GUI/PresetComboBoxes.cpp:961 msgid "Add/Remove materials" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:892 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1075 +#: src/slic3r/GUI/PresetComboBoxes.cpp:963 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1180 msgid "Add/Remove printers" msgstr "" @@ -7714,98 +9210,106 @@ msgstr "" msgid "Bottom is open." msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Send G-Code to printer host" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Upload to Printer Host with the following filename:" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:51 +#: src/slic3r/GUI/PrintHostDialogs.cpp:55 msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:60 +#: src/slic3r/GUI/PrintHostDialogs.cpp:64 msgid "Group" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:84 +#: src/slic3r/GUI/PrintHostDialogs.cpp:74 +msgid "Upload to storage:" +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:83 +msgid "Upload to storage: " +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:105 #, c-format, boost-format msgid "Upload filename doesn't end with \"%s\". Do you wish to continue?" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:91 +#: src/slic3r/GUI/PrintHostDialogs.cpp:112 msgid "Upload" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:101 -msgid "Upload and Print" +#: src/slic3r/GUI/PrintHostDialogs.cpp:122 +msgid "Upload to Queue" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:112 +#: src/slic3r/GUI/PrintHostDialogs.cpp:143 msgid "Upload and Simulate" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:247 +#: src/slic3r/GUI/PrintHostDialogs.cpp:298 msgid "ID" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:248 +#: src/slic3r/GUI/PrintHostDialogs.cpp:299 msgid "Progress" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:249 +#: src/slic3r/GUI/PrintHostDialogs.cpp:300 msgid "Status" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:250 +#: src/slic3r/GUI/PrintHostDialogs.cpp:301 msgid "Host" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:251 +#: src/slic3r/GUI/PrintHostDialogs.cpp:302 msgctxt "OfFile" msgid "Size" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:252 +#: src/slic3r/GUI/PrintHostDialogs.cpp:303 msgid "Filename" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:253 -msgid "Error Message" +#: src/slic3r/GUI/PrintHostDialogs.cpp:304 +msgid "Message" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:256 +#: src/slic3r/GUI/PrintHostDialogs.cpp:308 msgid "Cancel selected" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:258 +#: src/slic3r/GUI/PrintHostDialogs.cpp:310 msgid "Show error message" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:316 -#: src/slic3r/GUI/PrintHostDialogs.cpp:371 +#: src/slic3r/GUI/PrintHostDialogs.cpp:368 +#: src/slic3r/GUI/PrintHostDialogs.cpp:423 msgid "Enqueued" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:372 +#: src/slic3r/GUI/PrintHostDialogs.cpp:424 msgid "Uploading" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:374 +#: src/slic3r/GUI/PrintHostDialogs.cpp:426 msgid "Cancelling" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:375 +#: src/slic3r/GUI/PrintHostDialogs.cpp:427 msgid "Cancelled" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:376 +#: src/slic3r/GUI/PrintHostDialogs.cpp:428 msgid "Completed" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:424 +#: src/slic3r/GUI/PrintHostDialogs.cpp:476 msgid "Error uploading to print host:" msgstr "" @@ -7813,13 +9317,13 @@ msgstr "" msgid "NO RAMMING AT ALL" msgstr "" -#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 -#: src/libslic3r/PrintConfig.cpp:955 src/libslic3r/PrintConfig.cpp:999 -#: src/libslic3r/PrintConfig.cpp:1014 src/libslic3r/PrintConfig.cpp:3297 -#: src/libslic3r/PrintConfig.cpp:3306 src/libslic3r/PrintConfig.cpp:3315 -#: src/libslic3r/PrintConfig.cpp:3456 src/libslic3r/PrintConfig.cpp:3464 -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3479 -#: src/libslic3r/PrintConfig.cpp:3487 src/libslic3r/PrintConfig.cpp:3495 +#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/libslic3r/PrintConfig.cpp:1044 src/libslic3r/PrintConfig.cpp:1088 +#: src/libslic3r/PrintConfig.cpp:1103 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3578 src/libslic3r/PrintConfig.cpp:3587 +#: src/libslic3r/PrintConfig.cpp:3733 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3749 src/libslic3r/PrintConfig.cpp:3756 +#: src/libslic3r/PrintConfig.cpp:3764 src/libslic3r/PrintConfig.cpp:3772 msgid "s" msgstr "" @@ -7827,162 +9331,210 @@ msgstr "" msgid "Volumetric speed" msgstr "" -#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:912 -#: src/libslic3r/PrintConfig.cpp:1824 +#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:1001 +#: src/libslic3r/PrintConfig.cpp:1861 msgid "mm³/s" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:57 +#: src/slic3r/GUI/SavePresetDialog.cpp:90 +#, c-format, boost-format +msgid "Rename %s to:" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:90 #, c-format, boost-format msgid "Save %s as:" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:101 -#: src/slic3r/GUI/SavePresetDialog.cpp:109 +#: src/slic3r/GUI/SavePresetDialog.cpp:165 +#: src/slic3r/GUI/SavePresetDialog.cpp:173 msgid "The supplied name is not valid;" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:110 +#: src/slic3r/GUI/SavePresetDialog.cpp:174 msgid "the following suffix is not allowed:" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:116 +#: src/slic3r/GUI/SavePresetDialog.cpp:180 msgid "The supplied name is not available." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:122 +#: src/slic3r/GUI/SavePresetDialog.cpp:186 +msgid "The supplied name is used for a system profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:187 msgid "Cannot overwrite a system profile." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:127 +#: src/slic3r/GUI/SavePresetDialog.cpp:192 +msgid "The supplied name is used for a external profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:193 msgid "Cannot overwrite an external profile." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:134 +#: src/slic3r/GUI/SavePresetDialog.cpp:203 +msgid "Save preset modifications to existing user profile" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:205 +msgid "Nothing changed" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:210 #, boost-format msgid "Preset with name \"%1%\" already exists." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:136 +#: src/slic3r/GUI/SavePresetDialog.cpp:212 #, boost-format msgid "" "Preset with name \"%1%\" already exists and is incompatible with selected " "printer." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:137 +#: src/slic3r/GUI/SavePresetDialog.cpp:213 msgid "Note: This preset will be replaced after saving" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:142 +#: src/slic3r/GUI/SavePresetDialog.cpp:219 msgid "The name cannot be empty." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:147 +#: src/slic3r/GUI/SavePresetDialog.cpp:230 +msgid "The name is too long." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:235 msgid "The name cannot start with space character." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:152 +#: src/slic3r/GUI/SavePresetDialog.cpp:240 msgid "The name cannot end with space character." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:157 +#: src/slic3r/GUI/SavePresetDialog.cpp:245 msgid "The name cannot be the same as a preset alias name." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:191 -#: src/slic3r/GUI/SavePresetDialog.cpp:197 +#: src/slic3r/GUI/SavePresetDialog.cpp:289 msgid "Save preset" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:221 +#: src/slic3r/GUI/SavePresetDialog.cpp:295 +msgid "Save presets" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:302 +msgid "Rename preset" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:327 msgctxt "PresetName" msgid "Copy" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:283 +#: src/slic3r/GUI/SavePresetDialog.cpp:347 +msgid "Save as profile derived from current printer only." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:407 #, boost-format msgid "" "You have selected physical printer \"%1%\" \n" "with related printer preset \"%2%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:322 +#: src/slic3r/GUI/SavePresetDialog.cpp:446 #, boost-format msgid "What would you like to do with \"%1%\" preset after saving?" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:325 +#: src/slic3r/GUI/SavePresetDialog.cpp:449 #, boost-format msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:326 +#: src/slic3r/GUI/SavePresetDialog.cpp:450 #, boost-format msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:327 +#: src/slic3r/GUI/SavePresetDialog.cpp:451 #, boost-format msgid "Just switch to \"%1%\" preset" msgstr "" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2652 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2645 msgid "Stealth" msgstr "" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2646 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2639 msgid "Normal" msgstr "" -#: src/slic3r/GUI/Selection.cpp:168 +#: src/slic3r/GUI/Selection.cpp:180 msgid "Selection-Add" msgstr "" -#: src/slic3r/GUI/Selection.cpp:209 +#: src/slic3r/GUI/Selection.cpp:221 msgid "Selection-Remove" msgstr "" -#: src/slic3r/GUI/Selection.cpp:241 +#: src/slic3r/GUI/Selection.cpp:253 msgid "Selection-Add Object" msgstr "" -#: src/slic3r/GUI/Selection.cpp:260 +#: src/slic3r/GUI/Selection.cpp:272 msgid "Selection-Remove Object" msgstr "" -#: src/slic3r/GUI/Selection.cpp:278 +#: src/slic3r/GUI/Selection.cpp:290 msgid "Selection-Add Instance" msgstr "" -#: src/slic3r/GUI/Selection.cpp:297 +#: src/slic3r/GUI/Selection.cpp:309 msgid "Selection-Remove Instance" msgstr "" -#: src/slic3r/GUI/Selection.cpp:394 +#: src/slic3r/GUI/Selection.cpp:406 msgid "Selection-Add All" msgstr "" -#: src/slic3r/GUI/Selection.cpp:419 +#: src/slic3r/GUI/Selection.cpp:431 msgid "Selection-Remove All" msgstr "" -#: src/slic3r/GUI/Selection.cpp:950 +#: src/slic3r/GUI/Selection.cpp:1309 msgid "Scale To Fit" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:114 +#: src/slic3r/GUI/Selection.cpp:1691 +msgid "" +"The currently manipulated object is tilted or contains tilted parts " +"(rotation angles are not multiples of 90°). Non-uniform scaling of tilted " +"objects is only possible in non-local coordinate systems, once the rotation " +"is embedded into the object coordinates." +msgstr "" + +#: src/slic3r/GUI/Selection.cpp:1694 +msgid "This operation is irreversible." +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:117 msgid "Data to send" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:550 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:618 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:557 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:624 msgid "Send system info" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:581 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:587 #, boost-format msgid "" "This is the first time you are running %1%. We would like to ask you to send " @@ -7991,18 +9543,18 @@ msgid "" "version)." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:585 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:591 msgid "" "If we know your hardware, operating system, etc., it will greatly help us in " "development and prioritization, because we will be able to focus our effort " "more efficiently and spend time on features that are needed the most." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:588 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:594 msgid "Is it safe?" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:590 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:596 #, boost-format msgid "" "We do not send any personal information nor anything that would allow us to " @@ -8013,317 +9565,330 @@ msgid "" "inspect the code actually performing the communication, see %1%." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:614 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:620 msgid "Show verbatim data that will be sent" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:616 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:622 msgid "Ask me next time" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:617 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:623 msgid "Do not send anything" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:703 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:709 msgid "System info sent successfully. Thank you." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:706 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:712 msgid "Sending system info failed!" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:713 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:719 msgid "Sending system info was cancelled." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:720 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:726 msgid "Sending system info..." msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:84 +#: src/slic3r/GUI/SysInfoDialog.cpp:92 msgid "System Information" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:150 +#: src/slic3r/GUI/SysInfoDialog.cpp:160 msgid "Blacklisted libraries loaded into PrusaSlicer process:" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:162 +#: src/slic3r/GUI/SysInfoDialog.cpp:172 msgid "Eigen vectorization supported:" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:169 +#: src/slic3r/GUI/SysInfoDialog.cpp:179 msgid "Copy to Clipboard" msgstr "" -#: src/slic3r/GUI/Tab.cpp:114 src/libslic3r/PrintConfig.cpp:565 +#: src/slic3r/GUI/Tab.cpp:68 src/libslic3r/PrintConfig.cpp:668 msgid "Compatible printers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:115 +#: src/slic3r/GUI/Tab.cpp:69 msgid "Select the printers this profile is compatible with." msgstr "" -#: src/slic3r/GUI/Tab.cpp:120 src/libslic3r/PrintConfig.cpp:580 +#: src/slic3r/GUI/Tab.cpp:74 src/libslic3r/PrintConfig.cpp:683 msgid "Compatible print profiles" msgstr "" -#: src/slic3r/GUI/Tab.cpp:121 +#: src/slic3r/GUI/Tab.cpp:75 msgid "Select the print profiles this profile is compatible with." msgstr "" -#: src/slic3r/GUI/Tab.cpp:216 +#: src/slic3r/GUI/Tab.cpp:165 msgid "Compare this preset with some another" msgstr "" #. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:218 +#: src/slic3r/GUI/Tab.cpp:167 #, c-format, boost-format msgid "Save current %s" msgstr "" -#: src/slic3r/GUI/Tab.cpp:219 +#: src/slic3r/GUI/Tab.cpp:168 +#, c-format, boost-format +msgid "Rename current %s" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:170 msgid "Delete this preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:223 +#: src/slic3r/GUI/Tab.cpp:174 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." msgstr "" -#: src/slic3r/GUI/Tab.cpp:227 +#: src/slic3r/GUI/Tab.cpp:178 #, boost-format msgid "Search in settings [%1%]" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1298 +#: src/slic3r/GUI/Tab.cpp:1243 msgid "Detach from system preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1311 +#: src/slic3r/GUI/Tab.cpp:1256 msgid "" "A copy of the current system preset will be created, which will be detached " "from the system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1312 +#: src/slic3r/GUI/Tab.cpp:1257 msgid "" "The current custom preset will be detached from the parent system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1315 +#: src/slic3r/GUI/Tab.cpp:1260 msgid "Modifications to the current profile will be saved." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1321 +#: src/slic3r/GUI/Tab.cpp:1266 msgid "Detach preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1347 +#: src/slic3r/GUI/Tab.cpp:1292 msgid "This is a default preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1349 +#: src/slic3r/GUI/Tab.cpp:1294 msgid "This is a system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1351 +#: src/slic3r/GUI/Tab.cpp:1296 msgid "Current preset is inherited from the default preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1355 +#: src/slic3r/GUI/Tab.cpp:1300 msgid "Current preset is inherited from" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1359 +#: src/slic3r/GUI/Tab.cpp:1304 msgid "It can't be deleted or modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1360 +#: src/slic3r/GUI/Tab.cpp:1305 msgid "" "Any modifications should be saved as a new preset inherited from this one." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1361 +#: src/slic3r/GUI/Tab.cpp:1306 msgid "To do that please specify a new name for the preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1365 +#: src/slic3r/GUI/Tab.cpp:1310 msgid "Additional information:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1371 +#: src/slic3r/GUI/Tab.cpp:1316 msgid "printer model" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1379 +#: src/slic3r/GUI/Tab.cpp:1324 msgid "default print profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1382 +#: src/slic3r/GUI/Tab.cpp:1327 msgid "default filament profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1396 +#: src/slic3r/GUI/Tab.cpp:1341 msgid "default SLA material profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1400 +#: src/slic3r/GUI/Tab.cpp:1345 msgid "default SLA print profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1408 +#: src/slic3r/GUI/Tab.cpp:1353 msgid "full profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1409 +#: src/slic3r/GUI/Tab.cpp:1354 msgid "symbolic profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4657 +#: src/slic3r/GUI/Tab.cpp:1392 src/slic3r/GUI/Tab.cpp:4940 msgid "Layers and perimeters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1453 +#: src/slic3r/GUI/Tab.cpp:1398 msgid "Vertical shells" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1465 +#: src/slic3r/GUI/Tab.cpp:1410 msgid "Horizontal shells" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1466 src/libslic3r/PrintConfig.cpp:2417 +#: src/slic3r/GUI/Tab.cpp:1411 src/libslic3r/PrintConfig.cpp:2448 msgid "Solid layers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1471 +#: src/slic3r/GUI/Tab.cpp:1416 msgid "Minimum shell thickness" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1482 +#: src/slic3r/GUI/Tab.cpp:1427 msgid "Quality (slower slicing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1497 +#: src/slic3r/GUI/Tab.cpp:1444 msgid "Fuzzy skin (experimental)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1520 +#: src/slic3r/GUI/Tab.cpp:1467 msgid "Reducing printing time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1535 src/libslic3r/ExtrusionEntity.cpp:370 +#: src/slic3r/GUI/Tab.cpp:1482 msgid "Skirt" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1504 msgid "Raft" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1562 +#: src/slic3r/GUI/Tab.cpp:1509 msgid "Options for support material and raft" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1582 +#: src/slic3r/GUI/Tab.cpp:1528 +msgid "Organic supports" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1537 msgid "Speed for print moves" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1595 +#: src/slic3r/GUI/Tab.cpp:1550 +msgid "Dynamic overhang speed" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1557 msgid "Speed for non-print moves" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1599 +#: src/slic3r/GUI/Tab.cpp:1561 msgid "Modifiers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1603 +#: src/slic3r/GUI/Tab.cpp:1565 msgid "Acceleration control (advanced)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1614 +#: src/slic3r/GUI/Tab.cpp:1576 msgid "Autospeed (advanced)" msgstr "Auto Speed (advanced)" -#: src/slic3r/GUI/Tab.cpp:1618 +#: src/slic3r/GUI/Tab.cpp:1580 msgid "Pressure equalizer (experimental)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1622 +#: src/slic3r/GUI/Tab.cpp:1584 msgid "Multiple Extruders" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1630 +#: src/slic3r/GUI/Tab.cpp:1592 msgid "Ooze prevention" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1650 +#: src/slic3r/GUI/Tab.cpp:1596 +msgid "Wipe tower" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1612 msgid "Extrusion width" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1660 +#: src/slic3r/GUI/Tab.cpp:1622 msgid "Overlap" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1663 +#: src/slic3r/GUI/Tab.cpp:1625 msgid "Flow" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1674 src/slic3r/GUI/Tab.cpp:1700 -msgid "Other" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:1636 msgid "Arachne perimeter generator" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1685 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1644 src/slic3r/GUI/Tab.cpp:4990 msgid "Output options" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1686 +#: src/slic3r/GUI/Tab.cpp:1645 msgid "Sequential printing" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1688 +#: src/slic3r/GUI/Tab.cpp:1647 msgid "Extruder clearance" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:4735 +#: src/slic3r/GUI/Tab.cpp:1652 src/slic3r/GUI/Tab.cpp:4991 msgid "Output file" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1712 src/libslic3r/PrintConfig.cpp:2042 +#: src/slic3r/GUI/Tab.cpp:1671 src/libslic3r/PrintConfig.cpp:2072 msgid "Post-processing scripts" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1724 src/slic3r/GUI/Tab.cpp:1725 -#: src/slic3r/GUI/Tab.cpp:2110 src/slic3r/GUI/Tab.cpp:2111 -#: src/slic3r/GUI/Tab.cpp:2498 src/slic3r/GUI/Tab.cpp:2499 -#: src/slic3r/GUI/Tab.cpp:2571 src/slic3r/GUI/Tab.cpp:2572 -#: src/slic3r/GUI/Tab.cpp:3957 src/slic3r/GUI/Tab.cpp:4585 -#: src/slic3r/GUI/Tab.cpp:4586 +#: src/slic3r/GUI/Tab.cpp:1683 src/slic3r/GUI/Tab.cpp:1684 +#: src/slic3r/GUI/Tab.cpp:2080 src/slic3r/GUI/Tab.cpp:2081 +#: src/slic3r/GUI/Tab.cpp:2486 src/slic3r/GUI/Tab.cpp:2487 +#: src/slic3r/GUI/Tab.cpp:2564 src/slic3r/GUI/Tab.cpp:2565 +#: src/slic3r/GUI/Tab.cpp:4182 src/slic3r/GUI/Tab.cpp:4822 +#: src/slic3r/GUI/Tab.cpp:4823 msgid "Notes" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:2088 +#: src/slic3r/GUI/Tab.cpp:2493 src/slic3r/GUI/Tab.cpp:2571 +#: src/slic3r/GUI/Tab.cpp:4830 src/slic3r/GUI/Tab.cpp:4996 msgid "Dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1732 src/slic3r/GUI/Tab.cpp:2119 -#: src/slic3r/GUI/Tab.cpp:2506 src/slic3r/GUI/Tab.cpp:2579 -#: src/slic3r/GUI/Tab.cpp:4594 src/slic3r/GUI/Tab.cpp:4741 +#: src/slic3r/GUI/Tab.cpp:1691 src/slic3r/GUI/Tab.cpp:2089 +#: src/slic3r/GUI/Tab.cpp:2494 src/slic3r/GUI/Tab.cpp:2572 +#: src/slic3r/GUI/Tab.cpp:4831 src/slic3r/GUI/Tab.cpp:4997 msgid "Profile dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1771 +#: src/slic3r/GUI/Tab.cpp:1723 msgid "Post processing scripts shall modify G-code file in place." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1850 +#: src/slic3r/GUI/Tab.cpp:1802 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8336,7 +9901,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:1855 +#: src/slic3r/GUI/Tab.cpp:1807 msgid "Found reserved keywords in" msgstr "" @@ -8344,74 +9909,90 @@ msgstr "" msgid "Filament Overrides" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1992 +#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2827 +msgid "Retraction" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1951 +msgid "Temperature" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1955 msgid "Nozzle" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1997 +#: src/slic3r/GUI/Tab.cpp:1960 msgid "Bed" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2002 +#: src/slic3r/GUI/Tab.cpp:1965 msgid "Cooling" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2004 src/libslic3r/PrintConfig.cpp:1936 -#: src/libslic3r/PrintConfig.cpp:2994 +#: src/slic3r/GUI/Tab.cpp:1967 src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "Enable" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/Tab.cpp:1978 msgid "Fan settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2026 +#: src/slic3r/GUI/Tab.cpp:1979 +msgid "Fan speed" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1989 +msgid "Dynamic fan speeds" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1996 msgid "Cooling thresholds" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2032 +#: src/slic3r/GUI/Tab.cpp:2002 msgid "Filament properties" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2039 +#: src/slic3r/GUI/Tab.cpp:2009 msgid "Print speed override" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2049 +#: src/slic3r/GUI/Tab.cpp:2019 msgid "Wipe tower parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2052 +#: src/slic3r/GUI/Tab.cpp:2022 msgid "Toolchange parameters with single extruder MM printers" msgstr "Toolchange parameters with single extruder MM printers" -#: src/slic3r/GUI/Tab.cpp:2065 +#: src/slic3r/GUI/Tab.cpp:2035 msgid "Ramming settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 -#: src/slic3r/GUI/Tab.cpp:4264 src/libslic3r/GCode.cpp:733 -#: src/libslic3r/PrintConfig.cpp:2500 +#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:2398 +#: src/slic3r/GUI/Tab.cpp:4493 src/libslic3r/GCode.cpp:684 +#: src/libslic3r/PrintConfig.cpp:2532 msgid "Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2090 src/slic3r/GUI/Tab.cpp:2411 -#: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2450 -#: src/libslic3r/PrintConfig.cpp:2465 +#: src/slic3r/GUI/Tab.cpp:2060 src/slic3r/GUI/Tab.cpp:2399 +#: src/libslic3r/GCode.cpp:658 src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2497 msgid "Start G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:2421 -#: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:685 -#: src/libslic3r/PrintConfig.cpp:695 +#: src/slic3r/GUI/Tab.cpp:2070 src/slic3r/GUI/Tab.cpp:2409 +#: src/libslic3r/GCode.cpp:659 src/libslic3r/PrintConfig.cpp:788 +#: src/libslic3r/PrintConfig.cpp:798 msgid "End G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2153 +#: src/slic3r/GUI/Tab.cpp:2115 msgid "Volumetric flow hints not available" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2257 +#: src/slic3r/GUI/Tab.cpp:2241 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -8424,20 +10005,20 @@ msgid "" "physical_printer directory." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2291 src/slic3r/GUI/Tab.cpp:2518 +#: src/slic3r/GUI/Tab.cpp:2275 src/slic3r/GUI/Tab.cpp:2506 msgid "Size and coordinates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2300 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:2284 src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "Capabilities" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2305 +#: src/slic3r/GUI/Tab.cpp:2289 msgid "Number of extruders of the printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2334 +#: src/slic3r/GUI/Tab.cpp:2322 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -8445,171 +10026,194 @@ msgid "" "nozzle diameter value?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2338 src/slic3r/GUI/Tab.cpp:2782 -#: src/libslic3r/PrintConfig.cpp:1900 +#: src/slic3r/GUI/Tab.cpp:2326 src/slic3r/GUI/Tab.cpp:2714 +#: src/libslic3r/PrintConfig.cpp:1937 msgid "Nozzle diameter" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2431 src/libslic3r/GCode.cpp:709 -#: src/libslic3r/PrintConfig.cpp:425 +#: src/slic3r/GUI/Tab.cpp:2419 src/libslic3r/GCode.cpp:660 +#: src/libslic3r/PrintConfig.cpp:444 msgid "Before layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2441 src/libslic3r/GCode.cpp:710 -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/slic3r/GUI/Tab.cpp:2429 src/libslic3r/GCode.cpp:661 +#: src/libslic3r/PrintConfig.cpp:1665 msgid "After layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2451 src/libslic3r/GCode.cpp:711 -#: src/libslic3r/PrintConfig.cpp:2877 +#: src/slic3r/GUI/Tab.cpp:2439 src/libslic3r/GCode.cpp:662 +#: src/libslic3r/PrintConfig.cpp:2965 msgid "Tool change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2461 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2449 src/libslic3r/GCode.cpp:663 msgid "Between objects G-code (for sequential printing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2471 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2459 src/libslic3r/GCode.cpp:664 msgid "Color Change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2480 src/libslic3r/GCode.cpp:714 -#: src/libslic3r/PrintConfig.cpp:2491 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:665 +#: src/libslic3r/PrintConfig.cpp:2523 msgid "Pause Print G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2489 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:666 msgid "Template Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2525 +#: src/slic3r/GUI/Tab.cpp:2513 msgid "Display" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2528 msgid "Tilt" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2541 +#: src/slic3r/GUI/Tab.cpp:2529 msgid "Tilt time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2548 src/slic3r/GUI/Tab.cpp:4575 +#: src/slic3r/GUI/Tab.cpp:2536 src/slic3r/GUI/Tab.cpp:4812 msgid "Corrections" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2561 src/slic3r/GUI/Tab.cpp:4571 +#: src/slic3r/GUI/Tab.cpp:2549 src/slic3r/GUI/Tab.cpp:4808 msgid "Exposure" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2622 src/slic3r/GUI/Tab.cpp:2709 -#: src/libslic3r/PrintConfig.cpp:1655 src/libslic3r/PrintConfig.cpp:1690 -#: src/libslic3r/PrintConfig.cpp:1707 src/libslic3r/PrintConfig.cpp:1724 -#: src/libslic3r/PrintConfig.cpp:1740 src/libslic3r/PrintConfig.cpp:1750 -#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1773 -#: src/libslic3r/PrintConfig.cpp:1783 +#: src/slic3r/GUI/Tab.cpp:2556 +msgid "Output" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2615 src/slic3r/GUI/Tab.cpp:2875 +#: src/libslic3r/PrintConfig.cpp:1694 src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1744 src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1777 src/libslic3r/PrintConfig.cpp:1787 +#: src/libslic3r/PrintConfig.cpp:1797 src/libslic3r/PrintConfig.cpp:1810 +#: src/libslic3r/PrintConfig.cpp:1820 msgid "Machine limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2638 msgid "Values in this column are for Normal mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2644 msgid "Values in this column are for Stealth mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2660 +#: src/slic3r/GUI/Tab.cpp:2653 msgid "Maximum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2665 +#: src/slic3r/GUI/Tab.cpp:2658 msgid "Maximum accelerations" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2674 +#: src/slic3r/GUI/Tab.cpp:2667 msgid "Jerk limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2680 +#: src/slic3r/GUI/Tab.cpp:2673 msgid "Minimum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2734 src/slic3r/GUI/Tab.cpp:2743 -msgid "Single extruder MM setup" +#: src/slic3r/GUI/Tab.cpp:2711 +msgid "" +"This is a single extruder multimaterial printer, diameters of all extruders " +"will be set to the new value. Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2744 -msgid "Single extruder multimaterial parameters" +#: src/slic3r/GUI/Tab.cpp:2739 +msgid "Reset to Filament Color" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2779 -msgid "" -"This is a single extruder multimaterial printer, diameters of all extruders " -"will be set to the new value. Do you want to proceed?" +#: src/slic3r/GUI/Tab.cpp:2775 +msgid "Apply below setting to other extruders" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2804 +#: src/slic3r/GUI/Tab.cpp:2820 msgid "Layer height limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2809 +#: src/slic3r/GUI/Tab.cpp:2824 msgid "Position (for multi-extruder printers)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2815 +#: src/slic3r/GUI/Tab.cpp:2830 msgid "Only lift Z" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2828 +#: src/slic3r/GUI/Tab.cpp:2843 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2835 -msgid "Reset to Filament Color" +#: src/slic3r/GUI/Tab.cpp:2900 src/slic3r/GUI/Tab.cpp:2909 +msgid "Single extruder MM setup" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2910 +msgid "Single extruder multimaterial parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3012 +#: src/slic3r/GUI/Tab.cpp:3074 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" "Shall I disable it in order to enable Firmware Retraction?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3014 +#: src/slic3r/GUI/Tab.cpp:3076 msgid "Firmware Retraction" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3319 +#: src/slic3r/GUI/Tab.cpp:3384 msgid "New printer preset selected" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3625 +#: src/slic3r/GUI/Tab.cpp:3758 msgid "Detached" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3857 +msgid "" +"The physical printer below is based on the preset, you are going to rename." +msgid_plural "" +"The physical printers below are based on the preset, you are going to rename." +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Tab.cpp:3862 +msgid "Note, that the selected preset will be renamed in this printer too." +msgid_plural "" +"Note, that the selected preset will be renamed in these printers too." +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Tab.cpp:3924 msgid "remove" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3924 msgid "delete" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3711 +#: src/slic3r/GUI/Tab.cpp:3933 msgid "It's a last preset for this physical printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3716 +#: src/slic3r/GUI/Tab.cpp:3938 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " "\"%2%\"?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3728 +#: src/slic3r/GUI/Tab.cpp:3950 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -8617,14 +10221,14 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3733 +#: src/slic3r/GUI/Tab.cpp:3955 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3738 +#: src/slic3r/GUI/Tab.cpp:3960 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -8634,7 +10238,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3743 +#: src/slic3r/GUI/Tab.cpp:3965 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -8642,84 +10246,84 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3748 +#: src/slic3r/GUI/Tab.cpp:3970 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3753 +#: src/slic3r/GUI/Tab.cpp:3975 #, boost-format msgid "%1% Preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3836 src/slic3r/GUI/Tab.cpp:4198 +#: src/slic3r/GUI/Tab.cpp:4061 src/slic3r/GUI/Tab.cpp:4423 msgid "Set" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:4180 msgid "Find" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3956 +#: src/slic3r/GUI/Tab.cpp:4181 msgid "Replace with" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4045 +#: src/slic3r/GUI/Tab.cpp:4270 msgid "Regular expression" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4049 +#: src/slic3r/GUI/Tab.cpp:4274 msgid "Case insensitive" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4053 +#: src/slic3r/GUI/Tab.cpp:4278 msgid "Whole word" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4057 +#: src/slic3r/GUI/Tab.cpp:4282 msgid "Match single line" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4160 +#: src/slic3r/GUI/Tab.cpp:4385 msgid "Are you sure you want to delete all substitutions?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4292 +#: src/slic3r/GUI/Tab.cpp:4521 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4295 +#: src/slic3r/GUI/Tab.cpp:4524 msgid "" "Machine limits will NOT be emitted to G-code, however they will be used to " "estimate print time, which may therefore not be accurate as the printer may " "apply a different set of machine limits." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4299 +#: src/slic3r/GUI/Tab.cpp:4528 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4321 +#: src/slic3r/GUI/Tab.cpp:4550 msgid "LOCKED LOCK" msgstr "" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4323 +#: src/slic3r/GUI/Tab.cpp:4552 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4325 +#: src/slic3r/GUI/Tab.cpp:4554 msgid "UNLOCKED LOCK" msgstr "" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4327 +#: src/slic3r/GUI/Tab.cpp:4556 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -8727,23 +10331,23 @@ msgid "" "to the system (or default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4332 +#: src/slic3r/GUI/Tab.cpp:4561 msgid "WHITE BULLET" msgstr "" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4334 +#: src/slic3r/GUI/Tab.cpp:4563 msgid "" "for the left button: indicates a non-system (or non-default) preset,\n" "for the right button: indicates that the settings hasn't been modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4337 +#: src/slic3r/GUI/Tab.cpp:4566 msgid "BACK ARROW" msgstr "" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4339 +#: src/slic3r/GUI/Tab.cpp:4568 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -8751,13 +10355,13 @@ msgid "" "to the last saved preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4349 +#: src/slic3r/GUI/Tab.cpp:4578 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4351 +#: src/slic3r/GUI/Tab.cpp:4580 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " "equal to the system (or default) values for the current option group.\n" @@ -8765,17 +10369,17 @@ msgid "" "default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4354 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "WHITE BULLET icon indicates a non-system (or non-default) preset." -#: src/slic3r/GUI/Tab.cpp:4357 +#: src/slic3r/GUI/Tab.cpp:4586 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4359 +#: src/slic3r/GUI/Tab.cpp:4588 msgid "" "BACK ARROW icon indicates that the settings were changed and are not equal " "to the last saved preset for the current option group.\n" @@ -8783,131 +10387,129 @@ msgid "" "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4594 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4366 +#: src/slic3r/GUI/Tab.cpp:4595 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" "Click to reset current value to the system (or default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4601 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4373 +#: src/slic3r/GUI/Tab.cpp:4602 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" "Click to reset current value to the last saved preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4527 src/slic3r/GUI/Tab.cpp:4529 +#: src/slic3r/GUI/Tab.cpp:4764 src/slic3r/GUI/Tab.cpp:4766 msgid "Material" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4614 src/slic3r/GUI/Tab.cpp:4615 +#: src/slic3r/GUI/Tab.cpp:4851 src/slic3r/GUI/Tab.cpp:4852 msgid "Material printing profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4667 +#: src/slic3r/GUI/Tab.cpp:4901 msgid "Support head" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4672 +#: src/slic3r/GUI/Tab.cpp:4906 msgid "Support pillar" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4695 +#: src/slic3r/GUI/Tab.cpp:4929 msgid "Connection of the support sticks and junctions" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4700 +#: src/slic3r/GUI/Tab.cpp:4956 msgid "Automatic generation" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4775 +#: src/slic3r/GUI/Tab.cpp:5024 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" "To enable \"%1%\", please switch off \"%2%\"" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3724 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3497 msgid "Object elevation" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3826 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3958 msgid "Pad around object" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:153 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:162 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1047 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1100 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1115 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1130 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1145 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:147 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:156 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:165 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1107 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1122 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1137 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1152 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1197 msgid "Undef" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:772 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:792 msgid "Unsaved Changes" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:790 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:810 msgid "Switching Presets: Unsaved Changes" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:832 -msgid "Old Value" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:858 +msgid "Original Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:833 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:859 +msgid "Modified Value" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:861 msgid "New Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:867 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 msgid "Keep" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1569 msgid "Transfer" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 msgid "Don't save" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 -msgid "Discard" -msgstr "" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:877 -msgid "Save" -msgstr "" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:898 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:926 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "create new project" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:927 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "switch a preset" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:900 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:928 msgid "" "You will not be asked about the unsaved changes in presets the next time " "you: \n" @@ -8915,179 +10517,282 @@ msgid "" "- Loading a new project while some presets are modified" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:903 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:931 msgid "PrusaSlicer will remember your action." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:904 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:932 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" "to be asked about unsaved changes again." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:964 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1772 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will not be saved" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will be discarded." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:941 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:969 msgid "Save the selected options." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:942 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:970 msgid "Keep the selected settings." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:943 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:971 msgid "Transfer the selected settings to the newly selected preset." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:947 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:975 #, boost-format msgid "Save the selected options to preset \"%1%\"." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:948 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:976 #, boost-format msgid "Transfer the selected options to the newly selected preset \"%1%\"." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1224 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1237 msgid "The following preset was modified" msgid_plural "The following presets were modified" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1230 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1243 #, boost-format msgid "Preset \"%1%\" has the following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1234 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1247 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new printer profile and it has the " "following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1235 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1248 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new print profile and it has the " "following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1297 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1850 msgid "Extruders count" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 -msgid "Select presets to compare" -msgstr "" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1326 +msgid "The preset modifications are successfully saved" +msgid_plural "The presets modifications are successfully saved" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1515 msgid "Show all presets (including incompatible)" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1533 +msgid "Select presets to compare" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1545 msgid "Left Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1546 msgid "Right Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1595 +msgid "" +"Transfer the selected options from left preset to the right.\n" +"Note: New modified presets will be selected in settings tabs after close " +"this dialog." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1603 +msgid "Save the selected options from left preset to the right." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1621 +msgid "Transfer values from left to right" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1622 +msgid "" +"If enabled, this dialog can be used for transver selected values from left " +"to right preset." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1807 msgid "One of the presets doesn't found" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1818 msgid "Compared presets has different printer technology" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1832 msgid "Presets are the same" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1840 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef category" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef group" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:2016 +msgid "Modified" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:41 msgid "Update available" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UpdateDialogs.cpp:41 #, c-format, boost-format msgid "New version of %s is available" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:42 +#: src/slic3r/GUI/UpdateDialogs.cpp:46 src/slic3r/GUI/UpdateDialogs.cpp:101 msgid "Current version:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:44 +#: src/slic3r/GUI/UpdateDialogs.cpp:48 src/slic3r/GUI/UpdateDialogs.cpp:103 +#: src/slic3r/GUI/UpdateDialogs.cpp:141 msgid "New version:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:52 +#: src/slic3r/GUI/UpdateDialogs.cpp:56 msgid "Changelog & Download" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:59 src/slic3r/GUI/UpdateDialogs.cpp:133 -#: src/slic3r/GUI/UpdateDialogs.cpp:191 +#: src/slic3r/GUI/UpdateDialogs.cpp:63 src/slic3r/GUI/UpdateDialogs.cpp:309 +#: src/slic3r/GUI/UpdateDialogs.cpp:367 msgid "Open changelog page" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:65 +#: src/slic3r/GUI/UpdateDialogs.cpp:69 msgid "Open download page" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:72 +#: src/slic3r/GUI/UpdateDialogs.cpp:76 src/slic3r/GUI/UpdateDialogs.cpp:109 msgid "Don't notify about new releases any more" msgstr "Don't notify about new releases anymore" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +msgid "App Update available" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +#, c-format, boost-format +msgid "" +"New version of %s is available.\n" +"Do you wish to download it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:120 +msgid "Next" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +msgid "App Update download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +#, c-format, boost-format +msgid "New version of %s is available." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:146 +msgid "Run installer after download. (Otherwise file explorer will be opened)" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:151 +msgid "Target directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:158 +msgid "Select directory" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:176 +msgid "Select directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:193 +msgid "Download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:204 +msgid "Directory path is empty." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:212 +msgid "Directory path is incorrect." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:217 +#, boost-format +msgid "Directory %1% doesn't exists. Do you wish to create it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:222 +msgid "Failed to create directory." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:229 +#, boost-format +msgid "File %1% already exists. Do you wish to overwrite it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +#, boost-format +msgid "Download path is %1%. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:270 msgid "Opening Configuration Wizard" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 src/slic3r/GUI/UpdateDialogs.cpp:261 +#: src/slic3r/GUI/UpdateDialogs.cpp:270 src/slic3r/GUI/UpdateDialogs.cpp:437 msgid "Configuration update" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:95 +#: src/slic3r/GUI/UpdateDialogs.cpp:271 msgid "" "PrusaSlicer is not using the newest configuration available.\n" "Configuration Wizard may not offer the latest printers, filaments and SLA " "materials to be installed." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:97 +#: src/slic3r/GUI/UpdateDialogs.cpp:273 msgid "Configuration update is available" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:100 +#: src/slic3r/GUI/UpdateDialogs.cpp:276 msgid "" "Would you like to install it?\n" "\n" @@ -9097,28 +10802,28 @@ msgid "" "Updated configuration bundles:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:121 src/slic3r/GUI/UpdateDialogs.cpp:181 +#: src/slic3r/GUI/UpdateDialogs.cpp:297 src/slic3r/GUI/UpdateDialogs.cpp:357 msgid "Comment:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:142 +#: src/slic3r/GUI/UpdateDialogs.cpp:318 msgid "Install" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:144 +#: src/slic3r/GUI/UpdateDialogs.cpp:320 msgid "Don't install" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 src/slic3r/GUI/UpdateDialogs.cpp:212 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 src/slic3r/GUI/UpdateDialogs.cpp:388 #, c-format, boost-format msgid "%s incompatibility" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 msgid "You must install a configuration update." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:160 +#: src/slic3r/GUI/UpdateDialogs.cpp:336 #, c-format, boost-format msgid "" "%s will now start updates. Otherwise it won't be able to start.\n" @@ -9129,17 +10834,12 @@ msgid "" "Updated configuration bundles:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:200 src/slic3r/GUI/UpdateDialogs.cpp:247 -#, c-format, boost-format -msgid "Exit %s" -msgstr "" - -#: src/slic3r/GUI/UpdateDialogs.cpp:213 +#: src/slic3r/GUI/UpdateDialogs.cpp:389 #, c-format, boost-format msgid "%s configuration is incompatible" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:216 +#: src/slic3r/GUI/UpdateDialogs.cpp:392 #, c-format, boost-format msgid "" "This version of %s is not compatible with currently installed configuration " @@ -9152,20 +10852,20 @@ msgid "" "existing configuration before installing files compatible with this %s." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#: src/slic3r/GUI/UpdateDialogs.cpp:401 #, c-format, boost-format msgid "This %s version: %s" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:230 +#: src/slic3r/GUI/UpdateDialogs.cpp:406 msgid "Incompatible bundles:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:246 +#: src/slic3r/GUI/UpdateDialogs.cpp:422 msgid "Re-configure" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:265 +#: src/slic3r/GUI/UpdateDialogs.cpp:441 #, c-format, boost-format msgid "" "%s now uses an updated configuration structure.\n" @@ -9181,28 +10881,37 @@ msgid "" "choose whether to enable automatic preset updates." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:282 +#: src/slic3r/GUI/UpdateDialogs.cpp:458 msgid "For more information please visit our wiki page:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 msgid "Configuration updates" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 src/slic3r/GUI/UpdateDialogs.cpp:495 msgid "No updates available" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:304 +#: src/slic3r/GUI/UpdateDialogs.cpp:480 #, c-format, boost-format msgid "%s has no configuration updates available." msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:21 +#: src/slic3r/GUI/UpdateDialogs.cpp:495 +msgid "App update" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:500 +#, c-format, boost-format +msgid "%s has no version updates available." +msgstr "" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:23 msgid "Ramming customization" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:54 +#: src/slic3r/GUI/WipeTowerDialog.cpp:56 msgid "" "Ramming denotes the rapid extrusion just before a tool change in a single-" "extruder MM printer. Its purpose is to properly shape the end of the " @@ -9215,63 +10924,63 @@ msgid "" "jams, extruder wheel grinding into filament etc." msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:114 +#: src/slic3r/GUI/WipeTowerDialog.cpp:116 msgid "Total ramming time" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 msgid "Total rammed volume" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:120 +#: src/slic3r/GUI/WipeTowerDialog.cpp:122 msgid "Ramming line width" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:122 +#: src/slic3r/GUI/WipeTowerDialog.cpp:124 msgid "Ramming line spacing" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:173 +#: src/slic3r/GUI/WipeTowerDialog.cpp:175 msgid "Wipe tower - Purging volume adjustment" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:299 +#: src/slic3r/GUI/WipeTowerDialog.cpp:301 msgid "" "Here you can adjust required purging volume (mm³) for any given pair of " "tools." msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:300 +#: src/slic3r/GUI/WipeTowerDialog.cpp:302 msgid "Extruder changed to" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:308 +#: src/slic3r/GUI/WipeTowerDialog.cpp:310 msgid "unloaded" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:309 +#: src/slic3r/GUI/WipeTowerDialog.cpp:311 msgid "loaded" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:352 +#: src/slic3r/GUI/WipeTowerDialog.cpp:354 msgid "Tool #" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:361 +#: src/slic3r/GUI/WipeTowerDialog.cpp:363 msgid "" "Total purging volume is calculated by summing two values below, depending on " "which tools are loaded/unloaded." msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:362 +#: src/slic3r/GUI/WipeTowerDialog.cpp:364 msgid "Volume to purge (mm³) when the filament is being" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:376 +#: src/slic3r/GUI/WipeTowerDialog.cpp:378 msgid "From" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:442 +#: src/slic3r/GUI/WipeTowerDialog.cpp:444 msgid "" "Switching to simple settings will discard changes done in the advanced " "mode!\n" @@ -9279,26 +10988,28 @@ msgid "" "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show simplified settings" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show advanced settings" msgstr "" -#: src/slic3r/GUI/wxExtensions.cpp:644 +#: src/slic3r/GUI/wxExtensions.cpp:672 #, c-format, boost-format msgid "Switch to the %s mode" msgstr "" -#: src/slic3r/GUI/wxExtensions.cpp:645 +#: src/slic3r/GUI/wxExtensions.cpp:673 #, c-format, boost-format msgid "Current mode is %s" msgstr "" -#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:141 -#: src/slic3r/Utils/Repetier.cpp:69 +#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:206 +#: src/slic3r/Utils/OctoPrint.cpp:255 src/slic3r/Utils/OctoPrint.cpp:666 +#: src/slic3r/Utils/OctoPrint.cpp:824 src/slic3r/Utils/OctoPrint.cpp:897 +#: src/slic3r/Utils/Repetier.cpp:88 #, c-format, boost-format msgid "Mismatched type of print host: %s" msgstr "" @@ -9415,69 +11126,100 @@ msgid "" "is required." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:164 +#: src/slic3r/Utils/OctoPrint.cpp:278 msgid "Connection to OctoPrint works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:170 +#: src/slic3r/Utils/OctoPrint.cpp:284 msgid "Could not connect to OctoPrint" msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:172 +#: src/slic3r/Utils/OctoPrint.cpp:286 msgid "Note: OctoPrint version at least 1.1.0 is required." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:292 +#: src/slic3r/Utils/OctoPrint.cpp:528 msgid "Connection to Prusa SL1 / SL1S works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:298 +#: src/slic3r/Utils/OctoPrint.cpp:534 msgid "Could not connect to Prusa SLA" msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:336 +#: src/slic3r/Utils/OctoPrint.cpp:573 msgid "Connection to PrusaLink works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:342 +#: src/slic3r/Utils/OctoPrint.cpp:579 msgid "Could not connect to PrusaLink" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:61 +#: src/slic3r/Utils/OctoPrint.cpp:776 +msgid "Storages found:" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "read only" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "no free space" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:781 +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%.%2%" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:64 #, boost-format msgid "Copying of file %1% to %2% failed: %3%" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:645 -#: src/slic3r/Utils/PresetUpdater.cpp:662 +#: src/slic3r/Utils/PresetUpdater.cpp:998 +#: src/slic3r/Utils/PresetUpdater.cpp:1015 msgid "Continue and install configuration updates?" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:777 +#: src/slic3r/Utils/PresetUpdater.cpp:1021 +msgid "Installing profiles" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1071 +#, boost-format +msgid "Downloading resources for %1%." +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1171 msgid "" -"Configuration Updates causes a lost of preset modification.\n" +"Configuration Update will cause the preset modification to be lost.\n" "So, check unsaved changes and save them if necessary." msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:779 +#: src/slic3r/Utils/PresetUpdater.cpp:1173 msgid "Updating" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:808 +#: src/slic3r/Utils/PresetUpdater.cpp:1202 #, c-format, boost-format msgid "requires min. %s and max. %s" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:812 +#: src/slic3r/Utils/PresetUpdater.cpp:1206 #, c-format, boost-format msgid "requires min. %s" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:815 +#: src/slic3r/Utils/PresetUpdater.cpp:1209 #, c-format, boost-format msgid "requires max. %s" msgstr "" +#: src/slic3r/Utils/PresetUpdater.cpp:1362 +#, boost-format +msgid "Couldn't locate idx file %1% when performing updates." +msgstr "" + #: src/slic3r/Utils/Http.cpp:73 msgid "" "Could not detect system SSL certificate store. PrusaSlicer will be unable to " @@ -9502,30 +11244,30 @@ msgid "" "connections. See logs for additional details." msgstr "" -#: src/slic3r/Utils/Process.cpp:157 +#: src/slic3r/Utils/Process.cpp:164 msgid "Open G-code file:" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:84 +#: src/slic3r/Utils/Repetier.cpp:103 msgid "Connection to Repetier works correctly." msgstr "" -#: src/slic3r/Utils/Repetier.cpp:90 +#: src/slic3r/Utils/Repetier.cpp:109 msgid "Could not connect to Repetier" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:92 +#: src/slic3r/Utils/Repetier.cpp:111 msgid "Note: Repetier version at least 0.90.0 is required." msgstr "" -#: src/slic3r/Utils/Repetier.cpp:246 +#: src/slic3r/Utils/Repetier.cpp:263 #, boost-format msgid "" "HTTP status: %1%\n" "Message body: \"%2%\"" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:253 +#: src/slic3r/Utils/Repetier.cpp:270 #, boost-format msgid "" "Parsing of host response failed.\n" @@ -9533,7 +11275,7 @@ msgid "" "Error: \"%2%\"" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:266 +#: src/slic3r/Utils/Repetier.cpp:283 #, boost-format msgid "" "Enumeration of host printers failed.\n" @@ -9562,94 +11304,90 @@ msgstr "" msgid "Abort" msgstr "" -#: src/libslic3r/GCode.cpp:539 +#: src/libslic3r/GCode.cpp:490 msgid "There is an object with no extrusions in the first layer." msgstr "" -#: src/libslic3r/GCode.cpp:570 +#: src/libslic3r/GCode.cpp:521 #, boost-format msgid "Empty layer between %1% and %2%." msgstr "" -#: src/libslic3r/GCode.cpp:573 +#: src/libslic3r/GCode.cpp:524 msgid "(Some lines not shown)" msgstr "" -#: src/libslic3r/GCode.cpp:575 +#: src/libslic3r/GCode.cpp:526 #, boost-format msgid "Object name: %1%" msgstr "" -#: src/libslic3r/GCode.cpp:576 +#: src/libslic3r/GCode.cpp:527 msgid "" "Make sure the object is printable. This is usually caused by negligibly " "small extrusions or by a faulty model. Try to repair the model or change its " "orientation on the bed." msgstr "" -#: src/libslic3r/GCode.cpp:718 +#: src/libslic3r/GCode.cpp:669 msgid "Filament Start G-code" msgstr "" -#: src/libslic3r/GCode.cpp:725 +#: src/libslic3r/GCode.cpp:676 msgid "Filament End G-code" msgstr "" -#: src/libslic3r/GCode.cpp:764 +#: src/libslic3r/GCode.cpp:717 msgid "In the custom G-code were found reserved keywords:" msgstr "" -#: src/libslic3r/GCode.cpp:766 +#: src/libslic3r/GCode.cpp:719 msgid "" "This may cause problems in g-code visualization and printing time estimation." msgstr "" -#: src/libslic3r/GCode.cpp:1200 src/libslic3r/GCode.cpp:1211 +#: src/libslic3r/GCode.cpp:1124 src/libslic3r/GCode.cpp:1135 msgid "No extrusions were generated for objects." msgstr "" -#: src/libslic3r/GCode.cpp:1406 +#: src/libslic3r/GCode.cpp:1328 msgid "" "Your print is very close to the priming regions. Make sure there is no " "collision." msgstr "" -#: src/libslic3r/ExtrusionEntity.cpp:344 src/libslic3r/ExtrusionEntity.cpp:380 -msgid "Mixed" -msgstr "" - #: src/libslic3r/Flow.cpp:61 #, boost-format msgid "" "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1735 +#: src/libslic3r/Format/3mf.cpp:1880 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1746 +#: src/libslic3r/Format/3mf.cpp:1891 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1750 +#: src/libslic3r/Format/3mf.cpp:1895 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1754 +#: src/libslic3r/Format/3mf.cpp:1899 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/AMF.cpp:993 +#: src/libslic3r/Format/AMF.cpp:1000 #, boost-format msgid "" "The selected amf file has been saved with a newer version of %1% and is not " @@ -9792,116 +11530,134 @@ msgstr "" msgid "write calledback failed" msgstr "" -#: src/libslic3r/Print.cpp:454 +#: src/libslic3r/Print.cpp:473 msgid "All objects are outside of the print volume." msgstr "" -#: src/libslic3r/Print.cpp:457 +#: src/libslic3r/Print.cpp:476 msgid "The supplied settings will cause an empty print." msgstr "" -#: src/libslic3r/Print.cpp:461 +#: src/libslic3r/Print.cpp:480 msgid "Some objects are too close; your extruder will collide with them." msgstr "" -#: src/libslic3r/Print.cpp:463 +#: src/libslic3r/Print.cpp:482 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." msgstr "" -#: src/libslic3r/Print.cpp:472 +#: src/libslic3r/Print.cpp:486 +msgid "" +"Avoid crossing perimeters option and avoid crossing curled overhangs option " +"cannot be both enabled together." +msgstr "" + +#: src/libslic3r/Print.cpp:495 msgid "" "Only a single object may be printed at a time in Spiral Vase mode. Either " "remove all but the last object, or enable sequential mode by " "\"complete_objects\"." msgstr "" -#: src/libslic3r/Print.cpp:476 +#: src/libslic3r/Print.cpp:499 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." msgstr "" -#: src/libslic3r/Print.cpp:489 +#: src/libslic3r/Print.cpp:523 +msgid "" +"The print is taller than the maximum allowed height. You might want to " +"reduce the size of your model or change current print settings and retry." +msgstr "" + +#: src/libslic3r/Print.cpp:540 +msgid "Variable layer height is not supported with Organic supports." +msgstr "" + +#: src/libslic3r/Print.cpp:553 msgid "" "The wipe tower is only supported if all extruders have the same nozzle " "diameter and use filaments of the same diameter." msgstr "" -#: src/libslic3r/Print.cpp:495 +#: src/libslic3r/Print.cpp:559 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, " "RepRapFirmware and Repetier G-code flavors." msgstr "" -#: src/libslic3r/Print.cpp:497 +#: src/libslic3r/Print.cpp:561 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." msgstr "" -#: src/libslic3r/Print.cpp:499 -msgid "Ooze prevention is currently not supported with the wipe tower enabled." +#: src/libslic3r/Print.cpp:563 +msgid "" +"Ooze prevention is only supported with the wipe tower when " +"'single_extruder_multi_material' is off." msgstr "" -#: src/libslic3r/Print.cpp:501 +#: src/libslic3r/Print.cpp:565 msgid "" "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." msgstr "" -#: src/libslic3r/Print.cpp:503 +#: src/libslic3r/Print.cpp:567 msgid "" "The Wipe Tower is currently not supported for multimaterial sequential " "prints." msgstr "" -#: src/libslic3r/Print.cpp:524 +#: src/libslic3r/Print.cpp:577 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " "layer heights" msgstr "" -#: src/libslic3r/Print.cpp:526 +#: src/libslic3r/Print.cpp:579 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "over an equal number of raft layers" msgstr "" -#: src/libslic3r/Print.cpp:529 +#: src/libslic3r/Print.cpp:582 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "with the same support_material_contact_distance" msgstr "" -#: src/libslic3r/Print.cpp:531 +#: src/libslic3r/Print.cpp:584 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." msgstr "" -#: src/libslic3r/Print.cpp:555 +#: src/libslic3r/Print.cpp:609 msgid "" "The Wipe tower is only supported if all objects have the same variable layer " "height" msgstr "" -#: src/libslic3r/Print.cpp:579 +#: src/libslic3r/Print.cpp:633 msgid "" "One or more object were assigned an extruder that the printer does not have." msgstr "" "One or more objects were assigned an extruder that the printer does not have." -#: src/libslic3r/Print.cpp:592 +#: src/libslic3r/Print.cpp:646 #, boost-format msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" msgstr "" -#: src/libslic3r/Print.cpp:595 +#: src/libslic3r/Print.cpp:649 #, boost-format msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" msgstr "" -#: src/libslic3r/Print.cpp:606 +#: src/libslic3r/Print.cpp:660 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " @@ -9909,172 +11665,223 @@ msgid "" "same diameter." msgstr "" -#: src/libslic3r/Print.cpp:614 -msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers " -"need to be synchronized with the object layers." -msgstr "" - -#: src/libslic3r/Print.cpp:618 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only if they are " -"printed with the current extruder without triggering a tool change. (both " -"support_material_extruder and support_material_interface_extruder need to be " -"set to 0)." -msgstr "" - -#: src/libslic3r/Print.cpp:654 +#: src/libslic3r/Print.cpp:668 +msgid "" +"For the Wipe Tower to work with the soluble supports, the support layers " +"need to be synchronized with the object layers." +msgstr "" + +#: src/libslic3r/Print.cpp:708 msgid "First layer height can't be greater than nozzle diameter" msgstr "" -#: src/libslic3r/Print.cpp:659 +#: src/libslic3r/Print.cpp:713 msgid "Layer height can't be greater than nozzle diameter" msgstr "" -#: src/libslic3r/Print.cpp:680 +#: src/libslic3r/Print.cpp:734 msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " "layer_gcode." msgstr "" -#: src/libslic3r/Print.cpp:682 +#: src/libslic3r/Print.cpp:736 msgid "" "\"G92 E0\" was found in before_layer_gcode, which is incompatible with " "absolute extruder addressing." msgstr "" -#: src/libslic3r/Print.cpp:684 +#: src/libslic3r/Print.cpp:738 msgid "" "\"G92 E0\" was found in layer_gcode, which is incompatible with absolute " "extruder addressing." msgstr "" -#: src/libslic3r/Print.cpp:826 +#: src/libslic3r/Print.cpp:880 msgid "Infilling layers" msgstr "" -#: src/libslic3r/Print.cpp:848 +#: src/libslic3r/Print.cpp:908 msgid "Generating skirt and brim" msgstr "" -#: src/libslic3r/Print.cpp:896 +#: src/libslic3r/Print.cpp:956 msgid "Exporting G-code" msgstr "" -#: src/libslic3r/Print.cpp:900 +#: src/libslic3r/Print.cpp:960 msgid "Generating G-code" msgstr "" +#: src/libslic3r/Print.cpp:1169 +msgid "Alert if supports needed" +msgstr "" + +#: src/libslic3r/Print.cpp:1174 +msgid "long bridging extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1175 +msgid "floating bridge anchors" +msgstr "" + +#: src/libslic3r/Print.cpp:1178 +msgid "collapsing overhang" +msgstr "" + +#: src/libslic3r/Print.cpp:1180 +msgid "loose extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1183 +msgid "low bed adhesion" +msgstr "" + +#: src/libslic3r/Print.cpp:1184 +msgid "floating object part" +msgstr "" + +#: src/libslic3r/Print.cpp:1185 +msgid "thin fragile section" +msgstr "" + +#: src/libslic3r/Print.cpp:1221 +msgid "Detected print stability issues" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "or" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "and" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "brim" +msgstr "" + +#: src/libslic3r/Print.cpp:1248 +msgid "Consider enabling supports" +msgstr "" + #: src/libslic3r/SLA/Pad.cpp:533 msgid "Pad brim size is too small for the current configuration." msgstr "" -#: src/libslic3r/SLAPrint.cpp:628 +#: src/libslic3r/SLAPrint.cpp:546 msgid "" "Cannot proceed without support points! Add support points or disable support " "generation." msgstr "" -#: src/libslic3r/SLAPrint.cpp:640 +#: src/libslic3r/SLAPrint.cpp:558 msgid "" "Elevation is too low for object. Use the \"Pad around object\" feature to " "print the object without elevation." msgstr "" -#: src/libslic3r/SLAPrint.cpp:646 +#: src/libslic3r/SLAPrint.cpp:564 msgid "" "The endings of the support pillars will be deployed on the gap between the " "object and the pad. 'Support base safety distance' has to be greater than " "the 'Pad object gap' parameter to avoid this." msgstr "" -#: src/libslic3r/SLAPrint.cpp:661 +#: src/libslic3r/SLAPrint.cpp:579 msgid "Exposition time is out of printer profile bounds." msgstr "" -#: src/libslic3r/SLAPrint.cpp:668 +#: src/libslic3r/SLAPrint.cpp:586 msgid "Initial exposition time is out of printer profile bounds." msgstr "" -#: src/libslic3r/SLAPrint.cpp:784 +#: src/libslic3r/SLAPrint.cpp:693 msgid "Slicing done" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:47 +#: src/libslic3r/SLAPrintSteps.cpp:57 +msgid "Assembling model from parts" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:58 msgid "Hollowing model" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:48 +#: src/libslic3r/SLAPrintSteps.cpp:59 msgid "Drilling holes into model." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:49 +#: src/libslic3r/SLAPrintSteps.cpp:60 msgid "Slicing model" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:50 src/libslic3r/SLAPrintSteps.cpp:639 +#: src/libslic3r/SLAPrintSteps.cpp:61 src/libslic3r/SLAPrintSteps.cpp:691 msgid "Generating support points" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:51 +#: src/libslic3r/SLAPrintSteps.cpp:62 msgid "Generating support tree" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:52 +#: src/libslic3r/SLAPrintSteps.cpp:63 msgid "Generating pad" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:53 +#: src/libslic3r/SLAPrintSteps.cpp:64 msgid "Slicing supports" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:68 +#: src/libslic3r/SLAPrintSteps.cpp:79 msgid "Merging slices and calculating statistics" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:69 +#: src/libslic3r/SLAPrintSteps.cpp:80 msgid "Rasterizing layers" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:435 -msgid "Too many overlapping holes." -msgstr "" - -#: src/libslic3r/SLAPrintSteps.cpp:442 +#: src/libslic3r/SLAPrintSteps.cpp:255 msgid "" "Mesh to be hollowed is not suitable for hollowing (does not bound a volume)." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:450 +#: src/libslic3r/SLAPrintSteps.cpp:262 msgid "Unable to drill the current configuration of holes into the model." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:470 +#: src/libslic3r/SLAPrintSteps.cpp:271 msgid "" "Drilling holes into the mesh failed. This is usually caused by broken model. " "Try to fix it first." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:476 +#: src/libslic3r/SLAPrintSteps.cpp:279 msgid "Failed to drill some holes into the model" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:520 +#: src/libslic3r/SLAPrintSteps.cpp:289 +msgid "" +"Can't perform full mesh booleans! Some parts of the print will be previewed " +"with approximated meshes. This does not affect the quality of slices or the " +"physical print in any way." +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:510 msgid "" "Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:691 src/libslic3r/SLAPrintSteps.cpp:700 -#: src/libslic3r/SLAPrintSteps.cpp:738 +#: src/libslic3r/SLAPrintSteps.cpp:740 src/libslic3r/SLAPrintSteps.cpp:749 +#: src/libslic3r/SLAPrintSteps.cpp:787 msgid "Visualizing supports" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:730 +#: src/libslic3r/SLAPrintSteps.cpp:779 msgid "No pad can be generated for this model with the current configuration" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:854 +#: src/libslic3r/SLAPrintSteps.cpp:908 msgid "" "There are unprintable objects. Try to adjust support settings to make the " "objects printable." @@ -10084,73 +11891,73 @@ msgstr "" msgid "Failed processing of the output_filename_format template." msgstr "" -#: src/libslic3r/PrintConfig.cpp:236 src/libslic3r/PrintConfig.cpp:237 +#: src/libslic3r/PrintConfig.cpp:254 src/libslic3r/PrintConfig.cpp:255 msgid "Printer technology" msgstr "" -#: src/libslic3r/PrintConfig.cpp:244 +#: src/libslic3r/PrintConfig.cpp:260 msgid "Bed shape" msgstr "" -#: src/libslic3r/PrintConfig.cpp:249 +#: src/libslic3r/PrintConfig.cpp:265 msgid "Bed custom texture" msgstr "" -#: src/libslic3r/PrintConfig.cpp:254 +#: src/libslic3r/PrintConfig.cpp:270 msgid "Bed custom model" msgstr "" -#: src/libslic3r/PrintConfig.cpp:259 +#: src/libslic3r/PrintConfig.cpp:275 msgid "Elephant foot compensation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:261 +#: src/libslic3r/PrintConfig.cpp:277 msgid "" "The first layer will be shrunk in the XY plane by the configured value to " "compensate for the 1st layer squish aka an Elephant Foot effect." msgstr "" -#: src/libslic3r/PrintConfig.cpp:269 +#: src/libslic3r/PrintConfig.cpp:285 msgid "G-code thumbnails" msgstr "" -#: src/libslic3r/PrintConfig.cpp:270 +#: src/libslic3r/PrintConfig.cpp:286 msgid "" "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " "following format: \"XxY, XxY, ...\"" msgstr "" -#: src/libslic3r/PrintConfig.cpp:276 +#: src/libslic3r/PrintConfig.cpp:292 msgid "Format of G-code thumbnails" msgstr "" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:293 msgid "" "Format of G-code thumbnails: PNG for best quality, JPG for smallest size, " "QOI for low memory firmware" msgstr "" -#: src/libslic3r/PrintConfig.cpp:288 +#: src/libslic3r/PrintConfig.cpp:301 msgid "" "This setting controls the height (and thus the total number) of the slices/" "layers. Thinner layers give better accuracy but take more time to print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:295 +#: src/libslic3r/PrintConfig.cpp:308 msgid "Max print height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:296 +#: src/libslic3r/PrintConfig.cpp:309 msgid "" "Set this to the maximum height that can be reached by your extruder while " "printing." msgstr "" -#: src/libslic3r/PrintConfig.cpp:304 +#: src/libslic3r/PrintConfig.cpp:317 msgid "Hostname, IP or URL" msgstr "" -#: src/libslic3r/PrintConfig.cpp:305 +#: src/libslic3r/PrintConfig.cpp:318 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the hostname, IP address or URL of the printer host instance. Print host " @@ -10159,78 +11966,90 @@ msgid "" "password@your-octopi-address/" msgstr "" -#: src/libslic3r/PrintConfig.cpp:314 +#: src/libslic3r/PrintConfig.cpp:327 msgid "API Key / Password" msgstr "" -#: src/libslic3r/PrintConfig.cpp:315 +#: src/libslic3r/PrintConfig.cpp:328 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the API Key or the password required for authentication." msgstr "" -#: src/libslic3r/PrintConfig.cpp:323 +#: src/libslic3r/PrintConfig.cpp:336 msgid "Name of the printer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:331 +#: src/libslic3r/PrintConfig.cpp:344 msgid "" "Custom CA certificate file can be specified for HTTPS OctoPrint connections, " "in crt/pem format. If left blank, the default OS CA certificate repository " "is used." msgstr "" -#: src/libslic3r/PrintConfig.cpp:347 +#: src/libslic3r/PrintConfig.cpp:360 msgid "Password" msgstr "" -#: src/libslic3r/PrintConfig.cpp:355 +#: src/libslic3r/PrintConfig.cpp:368 msgid "Ignore HTTPS certificate revocation checks" msgstr "" -#: src/libslic3r/PrintConfig.cpp:356 +#: src/libslic3r/PrintConfig.cpp:369 msgid "" "Ignore HTTPS certificate revocation checks in case of missing or offline " "distribution points. One may want to enable this option for self signed " "certificates if connection fails." msgstr "" -#: src/libslic3r/PrintConfig.cpp:363 +#: src/libslic3r/PrintConfig.cpp:376 msgid "Printer preset names" msgstr "" -#: src/libslic3r/PrintConfig.cpp:364 +#: src/libslic3r/PrintConfig.cpp:377 msgid "Names of presets related to the physical printer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:369 +#: src/libslic3r/PrintConfig.cpp:382 msgid "Authorization Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:374 +#: src/libslic3r/PrintConfig.cpp:385 msgid "API key" msgstr "" -#: src/libslic3r/PrintConfig.cpp:375 +#: src/libslic3r/PrintConfig.cpp:386 msgid "HTTP digest" msgstr "" -#: src/libslic3r/PrintConfig.cpp:395 +#: src/libslic3r/PrintConfig.cpp:406 +msgid "Avoid crossing curled overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:407 +msgid "" +"Plan travel moves such that the extruder avoids areas where the filament may " +"be curled up. This is mostly happening on steeper rounded overhangs and may " +"cause a crash with the nozzle. This feature slows down both the print and " +"the G-code generation." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:414 msgid "Avoid crossing perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:396 +#: src/libslic3r/PrintConfig.cpp:415 msgid "" "Optimize travel moves in order to minimize the crossing of perimeters. This " "is mostly useful with Bowden extruders which suffer from oozing. This " "feature slows down both the print and the G-code generation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:403 +#: src/libslic3r/PrintConfig.cpp:422 msgid "Avoid crossing perimeters - Max detour length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:405 +#: src/libslic3r/PrintConfig.cpp:424 msgid "" "The maximum detour length for avoid crossing perimeters. If the detour is " "longer than this value, avoid crossing perimeters is not applied for this " @@ -10238,36 +12057,36 @@ msgid "" "as percentage (for example 50%) of a direct travel path." msgstr "" -#: src/libslic3r/PrintConfig.cpp:408 +#: src/libslic3r/PrintConfig.cpp:427 msgid "mm or % (zero to disable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:2839 +#: src/libslic3r/PrintConfig.cpp:434 src/libslic3r/PrintConfig.cpp:2927 msgid "Other layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:416 +#: src/libslic3r/PrintConfig.cpp:435 msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." msgstr "" -#: src/libslic3r/PrintConfig.cpp:419 +#: src/libslic3r/PrintConfig.cpp:438 msgid "Bed temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:426 +#: src/libslic3r/PrintConfig.cpp:445 msgid "" "This custom code is inserted at every layer change, right before the Z move. " "Note that you can use placeholder variables for all Slic3r settings as well " "as [layer_num] and [layer_z]." msgstr "" -#: src/libslic3r/PrintConfig.cpp:436 +#: src/libslic3r/PrintConfig.cpp:455 msgid "Between objects G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:456 msgid "" "This code is inserted between objects when using sequential printing. By " "default extruder and bed temperature are reset using non-wait command; " @@ -10277,84 +12096,79 @@ msgid "" "S[first_layer_temperature]\" command wherever you want." msgstr "" -#: src/libslic3r/PrintConfig.cpp:448 +#: src/libslic3r/PrintConfig.cpp:467 msgid "Number of solid layers to generate on bottom surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:449 +#: src/libslic3r/PrintConfig.cpp:468 msgid "Bottom solid layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:457 +#: src/libslic3r/PrintConfig.cpp:476 msgid "" "The number of bottom solid layers is increased above bottom_solid_layers if " "necessary to satisfy minimum thickness of bottom shell." msgstr "" -#: src/libslic3r/PrintConfig.cpp:459 +#: src/libslic3r/PrintConfig.cpp:478 msgid "Minimum bottom shell thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:484 msgid "Bridge" msgstr "" -#: src/libslic3r/PrintConfig.cpp:466 +#: src/libslic3r/PrintConfig.cpp:485 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." msgstr "" -#: src/libslic3r/PrintConfig.cpp:468 src/libslic3r/PrintConfig.cpp:639 -#: src/libslic3r/PrintConfig.cpp:1192 src/libslic3r/PrintConfig.cpp:1201 -#: src/libslic3r/PrintConfig.cpp:1401 src/libslic3r/PrintConfig.cpp:1410 -#: src/libslic3r/PrintConfig.cpp:1419 src/libslic3r/PrintConfig.cpp:1713 -#: src/libslic3r/PrintConfig.cpp:1764 src/libslic3r/PrintConfig.cpp:1775 -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1983 -#: src/libslic3r/PrintConfig.cpp:1991 +#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:1252 src/libslic3r/PrintConfig.cpp:1261 +#: src/libslic3r/PrintConfig.cpp:1447 src/libslic3r/PrintConfig.cpp:1456 +#: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1750 +#: src/libslic3r/PrintConfig.cpp:1801 src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1822 src/libslic3r/PrintConfig.cpp:2013 +#: src/libslic3r/PrintConfig.cpp:2021 msgid "mm/s²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:474 +#: src/libslic3r/PrintConfig.cpp:493 msgid "Bridging angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:476 +#: src/libslic3r/PrintConfig.cpp:495 msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for all " "bridges. Use 180° for zero angle." msgstr "" -#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:1102 -#: src/libslic3r/PrintConfig.cpp:2282 src/libslic3r/PrintConfig.cpp:2292 -#: src/libslic3r/PrintConfig.cpp:2583 src/libslic3r/PrintConfig.cpp:2824 -#: src/libslic3r/PrintConfig.cpp:3041 src/libslic3r/PrintConfig.cpp:3144 -#: src/libslic3r/PrintConfig.cpp:3698 src/libslic3r/PrintConfig.cpp:3819 -msgid "°" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:485 +#: src/libslic3r/PrintConfig.cpp:504 msgid "Bridges fan speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:486 +#: src/libslic3r/PrintConfig.cpp:505 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "" -#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:1114 -#: src/libslic3r/PrintConfig.cpp:1601 src/libslic3r/PrintConfig.cpp:1793 -#: src/libslic3r/PrintConfig.cpp:1856 src/libslic3r/PrintConfig.cpp:2115 -#: src/libslic3r/PrintConfig.cpp:2174 src/libslic3r/PrintConfig.cpp:3323 -#: src/libslic3r/PrintConfig.cpp:3612 src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:596 +#: src/libslic3r/PrintConfig.cpp:605 src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:623 src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1893 src/libslic3r/PrintConfig.cpp:2145 +#: src/libslic3r/PrintConfig.cpp:2204 src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3369 src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3870 msgid "%" msgstr "" -#: src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:513 msgid "Bridge flow ratio" msgstr "" -#: src/libslic3r/PrintConfig.cpp:496 +#: src/libslic3r/PrintConfig.cpp:515 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -10362,102 +12176,146 @@ msgid "" "before tweaking this." msgstr "" -#: src/libslic3r/PrintConfig.cpp:506 +#: src/libslic3r/PrintConfig.cpp:525 msgid "Bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:508 +#: src/libslic3r/PrintConfig.cpp:527 msgid "Speed for printing bridges." msgstr "" -#: src/libslic3r/PrintConfig.cpp:509 src/libslic3r/PrintConfig.cpp:920 -#: src/libslic3r/PrintConfig.cpp:928 src/libslic3r/PrintConfig.cpp:937 -#: src/libslic3r/PrintConfig.cpp:945 src/libslic3r/PrintConfig.cpp:972 -#: src/libslic3r/PrintConfig.cpp:991 src/libslic3r/PrintConfig.cpp:1329 -#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1620 -#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1730 -#: src/libslic3r/PrintConfig.cpp:1742 src/libslic3r/PrintConfig.cpp:1752 -#: src/libslic3r/PrintConfig.cpp:1815 src/libslic3r/PrintConfig.cpp:1874 -#: src/libslic3r/PrintConfig.cpp:2022 src/libslic3r/PrintConfig.cpp:2249 -#: src/libslic3r/PrintConfig.cpp:2258 src/libslic3r/PrintConfig.cpp:2789 -#: src/libslic3r/PrintConfig.cpp:2939 src/libslic3r/PrintConfig.cpp:2949 +#: src/libslic3r/PrintConfig.cpp:528 src/libslic3r/PrintConfig.cpp:1009 +#: src/libslic3r/PrintConfig.cpp:1017 src/libslic3r/PrintConfig.cpp:1026 +#: src/libslic3r/PrintConfig.cpp:1034 src/libslic3r/PrintConfig.cpp:1061 +#: src/libslic3r/PrintConfig.cpp:1080 src/libslic3r/PrintConfig.cpp:1386 +#: src/libslic3r/PrintConfig.cpp:1579 src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1733 src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1779 src/libslic3r/PrintConfig.cpp:1789 +#: src/libslic3r/PrintConfig.cpp:1852 src/libslic3r/PrintConfig.cpp:1911 +#: src/libslic3r/PrintConfig.cpp:2052 src/libslic3r/PrintConfig.cpp:2279 +#: src/libslic3r/PrintConfig.cpp:2288 src/libslic3r/PrintConfig.cpp:2810 +#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3037 msgid "mm/s" msgstr "" -#: src/libslic3r/PrintConfig.cpp:516 +#: src/libslic3r/PrintConfig.cpp:535 +msgid "Enable dynamic overhang speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:537 +msgid "This setting enables dynamic speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:541 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Speeds for overhang " +"sizes in between are calculated via linear interpolation. If set as " +"percentage, the speed is calculated over the external perimeter speed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:547 src/libslic3r/PrintConfig.cpp:594 +msgid "speed for 0% overlap (bridge)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:550 src/libslic3r/PrintConfig.cpp:559 +#: src/libslic3r/PrintConfig.cpp:568 src/libslic3r/PrintConfig.cpp:577 +#: src/libslic3r/PrintConfig.cpp:856 src/libslic3r/PrintConfig.cpp:1305 +#: src/libslic3r/PrintConfig.cpp:1316 src/libslic3r/PrintConfig.cpp:2387 +#: src/libslic3r/PrintConfig.cpp:2440 src/libslic3r/PrintConfig.cpp:2765 +#: src/libslic3r/PrintConfig.cpp:2997 +msgid "mm/s or %" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:556 src/libslic3r/PrintConfig.cpp:603 +msgid "speed for 25% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:612 +msgid "speed for 50% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:574 src/libslic3r/PrintConfig.cpp:621 +msgid "speed for 75% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:583 +msgid "Enable dynamic fan speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:584 +msgid "This setting enables dynamic fan speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:589 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Fan speeds for " +"overhang sizes in between are calculated via linear interpolation. " +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:630 msgid "Brim width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:518 +#: src/libslic3r/PrintConfig.cpp:632 msgid "" "The horizontal width of the brim that will be printed around each object on " "the first layer. When raft is used, no brim is generated (use " "raft_first_layer_expansion)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:527 +#: src/libslic3r/PrintConfig.cpp:641 msgid "Brim type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:529 +#: src/libslic3r/PrintConfig.cpp:643 msgid "" "The places where the brim will be printed around each object on the first " "layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:535 +#: src/libslic3r/PrintConfig.cpp:645 msgid "No brim" msgstr "" -#: src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:646 msgid "Outer brim only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:537 +#: src/libslic3r/PrintConfig.cpp:647 msgid "Inner brim only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:538 +#: src/libslic3r/PrintConfig.cpp:648 msgid "Outer and inner brim" msgstr "" -#: src/libslic3r/PrintConfig.cpp:543 +#: src/libslic3r/PrintConfig.cpp:654 msgid "Brim separation gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:545 +#: src/libslic3r/PrintConfig.cpp:656 msgid "" "Offset of brim from the printed object. The offset is applied after the " "elephant foot compensation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:552 -msgid "Clip multi-part objects" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:553 -msgid "" -"When printing multi-material objects, this settings will make Slic3r to clip " -"the overlapping object parts one by the other (2nd part will be clipped by " -"the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -msgstr "" -"When printing multi-material objects, this settings will make Slic3r to clip " -"the overlapping object parts one by the other (2nd part will be clipped by " -"the 1st, 3rd part will be clipped by the 1st and 2nd etc.)." - -#: src/libslic3r/PrintConfig.cpp:560 +#: src/libslic3r/PrintConfig.cpp:663 msgid "Colorprint height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:561 +#: src/libslic3r/PrintConfig.cpp:664 msgid "Heights at which a filament change is to occur." msgstr "" -#: src/libslic3r/PrintConfig.cpp:571 +#: src/libslic3r/PrintConfig.cpp:674 msgid "Compatible printers condition" msgstr "" -#: src/libslic3r/PrintConfig.cpp:572 +#: src/libslic3r/PrintConfig.cpp:675 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " @@ -10467,11 +12325,11 @@ msgstr "" "profile. If this expression evaluates to true, this profile is considered " "compatible with the active printer profile." -#: src/libslic3r/PrintConfig.cpp:586 +#: src/libslic3r/PrintConfig.cpp:689 msgid "Compatible print profiles condition" msgstr "" -#: src/libslic3r/PrintConfig.cpp:587 +#: src/libslic3r/PrintConfig.cpp:690 msgid "" "A boolean expression using the configuration values of an active print " "profile. If this expression evaluates to true, this profile is considered " @@ -10481,11 +12339,11 @@ msgstr "" "profile. If this expression evaluates to true, this profile is considered " "compatible with the active print profile." -#: src/libslic3r/PrintConfig.cpp:604 +#: src/libslic3r/PrintConfig.cpp:707 msgid "Complete individual objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:605 +#: src/libslic3r/PrintConfig.cpp:708 msgid "" "When printing multiple objects or copies, this feature will complete each " "object before moving onto next one (and starting it from its bottom layer). " @@ -10493,97 +12351,97 @@ msgid "" "warn and prevent you from extruder collisions, but beware." msgstr "" -#: src/libslic3r/PrintConfig.cpp:613 +#: src/libslic3r/PrintConfig.cpp:716 msgid "Enable auto cooling" msgstr "" -#: src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:717 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." msgstr "" -#: src/libslic3r/PrintConfig.cpp:619 +#: src/libslic3r/PrintConfig.cpp:722 msgid "Cooling tube position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:620 +#: src/libslic3r/PrintConfig.cpp:723 msgid "Distance of the center-point of the cooling tube from the extruder tip." msgstr "" -#: src/libslic3r/PrintConfig.cpp:627 +#: src/libslic3r/PrintConfig.cpp:730 msgid "Cooling tube length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:628 +#: src/libslic3r/PrintConfig.cpp:731 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "" -#: src/libslic3r/PrintConfig.cpp:636 +#: src/libslic3r/PrintConfig.cpp:739 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " "prevent resetting acceleration at all." msgstr "" -#: src/libslic3r/PrintConfig.cpp:645 +#: src/libslic3r/PrintConfig.cpp:748 msgid "Default filament profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:646 +#: src/libslic3r/PrintConfig.cpp:749 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " "activated." msgstr "" -#: src/libslic3r/PrintConfig.cpp:652 +#: src/libslic3r/PrintConfig.cpp:755 msgid "Default print profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:653 src/libslic3r/PrintConfig.cpp:3542 -#: src/libslic3r/PrintConfig.cpp:3553 +#: src/libslic3r/PrintConfig.cpp:756 src/libslic3r/PrintConfig.cpp:3819 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " "activated." msgstr "" -#: src/libslic3r/PrintConfig.cpp:659 +#: src/libslic3r/PrintConfig.cpp:762 msgid "Disable fan for the first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:660 +#: src/libslic3r/PrintConfig.cpp:763 msgid "" "You can set this to a positive value to disable fan at all during the first " "layers, so that it does not make adhesion worse." msgstr "" -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:772 msgid "Don't support bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:671 +#: src/libslic3r/PrintConfig.cpp:774 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." msgstr "" -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:780 msgid "Distance between copies" msgstr "" -#: src/libslic3r/PrintConfig.cpp:678 +#: src/libslic3r/PrintConfig.cpp:781 msgid "Distance used for the auto-arrange feature of the plater." msgstr "" -#: src/libslic3r/PrintConfig.cpp:686 +#: src/libslic3r/PrintConfig.cpp:789 msgid "" "This end procedure is inserted at the end of the output file. Note that you " "can use placeholder variables for all PrusaSlicer settings." msgstr "" -#: src/libslic3r/PrintConfig.cpp:696 +#: src/libslic3r/PrintConfig.cpp:799 msgid "" "This end procedure is inserted at the end of the output file, before the " "printer end gcode (and before any toolchange from this filament in case of " @@ -10597,78 +12455,66 @@ msgstr "" "PrusaSlicer settings. If you have multiple extruders, the gcode is processed " "in extruder order." -#: src/libslic3r/PrintConfig.cpp:707 -msgid "Ensure vertical shell thickness" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:709 -msgid "" -"Add solid infill near sloping surfaces to guarantee the vertical shell " -"thickness (top+bottom solid layers)." -msgstr "" -"Add solid infill near sloping surfaces to guarantee the vertical shell " -"thickness (top + bottom solid layers)." - -#: src/libslic3r/PrintConfig.cpp:715 +#: src/libslic3r/PrintConfig.cpp:810 msgid "Top fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:717 +#: src/libslic3r/PrintConfig.cpp:812 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." msgstr "" -#: src/libslic3r/PrintConfig.cpp:728 src/libslic3r/PrintConfig.cpp:1169 -#: src/libslic3r/PrintConfig.cpp:2754 src/libslic3r/PrintConfig.cpp:2771 +#: src/libslic3r/PrintConfig.cpp:815 src/libslic3r/PrintConfig.cpp:1228 +#: src/libslic3r/PrintConfig.cpp:2776 src/libslic3r/PrintConfig.cpp:2791 msgid "Rectilinear" msgstr "" -#: src/libslic3r/PrintConfig.cpp:729 +#: src/libslic3r/PrintConfig.cpp:816 msgid "Monotonic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:730 +#: src/libslic3r/PrintConfig.cpp:817 msgid "Monotonic Lines" msgstr "" -#: src/libslic3r/PrintConfig.cpp:731 src/libslic3r/PrintConfig.cpp:1170 +#: src/libslic3r/PrintConfig.cpp:818 src/libslic3r/PrintConfig.cpp:1229 msgid "Aligned Rectilinear" msgstr "" -#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:1176 -#: src/libslic3r/PrintConfig.cpp:2772 +#: src/libslic3r/PrintConfig.cpp:819 src/libslic3r/PrintConfig.cpp:1235 +#: src/libslic3r/PrintConfig.cpp:2792 msgid "Concentric" msgstr "" -#: src/libslic3r/PrintConfig.cpp:733 src/libslic3r/PrintConfig.cpp:1180 +#: src/libslic3r/PrintConfig.cpp:820 src/libslic3r/PrintConfig.cpp:1239 msgid "Hilbert Curve" msgstr "" -#: src/libslic3r/PrintConfig.cpp:734 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:821 src/libslic3r/PrintConfig.cpp:1240 msgid "Archimedean Chords" msgstr "" -#: src/libslic3r/PrintConfig.cpp:735 src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:822 src/libslic3r/PrintConfig.cpp:1241 msgid "Octagram Spiral" msgstr "" -#: src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:830 msgid "Bottom fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:832 msgid "" "Fill pattern for bottom infill. This only affects the bottom external " "visible layer, and not its adjacent solid shells." msgstr "" -#: src/libslic3r/PrintConfig.cpp:753 src/libslic3r/PrintConfig.cpp:765 -#: src/libslic3r/PrintConfig.cpp:1988 +#: src/libslic3r/PrintConfig.cpp:839 src/libslic3r/PrintConfig.cpp:851 +#: src/libslic3r/PrintConfig.cpp:2018 msgid "External perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:755 +#: src/libslic3r/PrintConfig.cpp:841 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " "perimeters. If left zero, default extrusion width will be used if set, " @@ -10676,60 +12522,65 @@ msgid "" "(for example 200%), it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:758 src/libslic3r/PrintConfig.cpp:869 -#: src/libslic3r/PrintConfig.cpp:1223 src/libslic3r/PrintConfig.cpp:1445 -#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1529 -#: src/libslic3r/PrintConfig.cpp:2011 src/libslic3r/PrintConfig.cpp:2397 -#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2660 -#: src/libslic3r/PrintConfig.cpp:2895 src/libslic3r/PrintConfig.cpp:3117 -#: src/libslic3r/PrintConfig.cpp:3132 src/libslic3r/PrintConfig.cpp:3166 -#: src/libslic3r/PrintConfig.cpp:3178 +#: src/libslic3r/PrintConfig.cpp:844 src/libslic3r/PrintConfig.cpp:958 +#: src/libslic3r/PrintConfig.cpp:1283 src/libslic3r/PrintConfig.cpp:1491 +#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1570 +#: src/libslic3r/PrintConfig.cpp:2041 src/libslic3r/PrintConfig.cpp:2428 +#: src/libslic3r/PrintConfig.cpp:2601 src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2983 src/libslic3r/PrintConfig.cpp:3204 +#: src/libslic3r/PrintConfig.cpp:3219 src/libslic3r/PrintConfig.cpp:3253 +#: src/libslic3r/PrintConfig.cpp:3265 msgid "mm or %" msgstr "" -#: src/libslic3r/PrintConfig.cpp:767 +#: src/libslic3r/PrintConfig.cpp:853 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " "calculated on the perimeters speed setting above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:770 src/libslic3r/PrintConfig.cpp:1245 -#: src/libslic3r/PrintConfig.cpp:1256 src/libslic3r/PrintConfig.cpp:2356 -#: src/libslic3r/PrintConfig.cpp:2409 src/libslic3r/PrintConfig.cpp:2740 -#: src/libslic3r/PrintConfig.cpp:2909 -msgid "mm/s or %" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:777 +#: src/libslic3r/PrintConfig.cpp:863 msgid "External perimeters first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:779 +#: src/libslic3r/PrintConfig.cpp:865 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:785 +#: src/libslic3r/PrintConfig.cpp:871 msgid "Extra perimeters if needed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:787 +#: src/libslic3r/PrintConfig.cpp:873 +#, c-format, boost-format msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " "keeps adding perimeters, until more than 70% of the loop immediately above " "is supported." msgstr "" -#: src/libslic3r/PrintConfig.cpp:797 +#: src/libslic3r/PrintConfig.cpp:880 +msgid "Extra perimeters on overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:882 +msgid "" +"Detect overhang areas where bridges cannot be anchored, and fill them with " +"extra perimeter paths. These paths are anchored to the nearby non-overhang " +"area when possible." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:890 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " "extruders." msgstr "" -#: src/libslic3r/PrintConfig.cpp:809 +#: src/libslic3r/PrintConfig.cpp:898 msgid "" "Set this to the vertical distance between your nozzle tip and (usually) the " "X carriage rods. In other words, this is the height of the clearance " @@ -10737,27 +12588,27 @@ msgid "" "extruder can peek before colliding with other printed objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:820 +#: src/libslic3r/PrintConfig.cpp:909 msgid "" "Set this to the clearance radius around your extruder. If the extruder is " "not centered, choose the largest value for safety. This setting is used to " "check for collisions and to display the graphical preview in the plater." msgstr "" -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:919 msgid "Extruder Color" msgstr "" -#: src/libslic3r/PrintConfig.cpp:831 src/libslic3r/PrintConfig.cpp:894 -#: src/libslic3r/PrintConfig.cpp:3394 +#: src/libslic3r/PrintConfig.cpp:920 src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:3666 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" -#: src/libslic3r/PrintConfig.cpp:837 +#: src/libslic3r/PrintConfig.cpp:926 msgid "Extruder offset" msgstr "" -#: src/libslic3r/PrintConfig.cpp:838 +#: src/libslic3r/PrintConfig.cpp:927 msgid "" "If your firmware doesn't handle the extruder displacement you need the G-" "code to take it into account. This option lets you specify the displacement " @@ -10765,21 +12616,21 @@ msgid "" "coordinates (they will be subtracted from the XY coordinate)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:847 +#: src/libslic3r/PrintConfig.cpp:936 msgid "Extrusion axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:848 +#: src/libslic3r/PrintConfig.cpp:937 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:853 +#: src/libslic3r/PrintConfig.cpp:942 msgid "Extrusion multiplier" msgstr "" -#: src/libslic3r/PrintConfig.cpp:854 +#: src/libslic3r/PrintConfig.cpp:943 msgid "" "This factor changes the amount of flow proportionally. You may need to tweak " "this setting to get nice surface finish and correct single wall widths. " @@ -10787,11 +12638,11 @@ msgid "" "more, check filament diameter and your firmware E steps." msgstr "" -#: src/libslic3r/PrintConfig.cpp:863 +#: src/libslic3r/PrintConfig.cpp:952 msgid "Default extrusion width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:865 +#: src/libslic3r/PrintConfig.cpp:954 msgid "" "Set this to a non-zero value to allow a manual extrusion width. If left to " "zero, Slic3r derives extrusion widths from the nozzle diameter (see the " @@ -10805,75 +12656,75 @@ msgstr "" "expressed as percentage (for example: 230%), it will be computed over layer " "height." -#: src/libslic3r/PrintConfig.cpp:877 +#: src/libslic3r/PrintConfig.cpp:966 msgid "Keep fan always on" msgstr "" -#: src/libslic3r/PrintConfig.cpp:878 +#: src/libslic3r/PrintConfig.cpp:967 msgid "" "If this is enabled, fan will never be disabled and will be kept running at " "least at its minimum speed. Useful for PLA, harmful for ABS." msgstr "" -#: src/libslic3r/PrintConfig.cpp:883 +#: src/libslic3r/PrintConfig.cpp:972 msgid "Enable fan if layer print time is below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:884 +#: src/libslic3r/PrintConfig.cpp:973 msgid "" "If layer print time is estimated below this number of seconds, fan will be " "enabled and its speed will be calculated by interpolating the minimum and " "maximum speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:886 src/libslic3r/PrintConfig.cpp:2344 +#: src/libslic3r/PrintConfig.cpp:975 src/libslic3r/PrintConfig.cpp:2375 msgid "approximate seconds" msgstr "" -#: src/libslic3r/PrintConfig.cpp:893 src/libslic3r/PrintConfig.cpp:3393 +#: src/libslic3r/PrintConfig.cpp:982 src/libslic3r/PrintConfig.cpp:3665 msgid "Color" msgstr "" -#: src/libslic3r/PrintConfig.cpp:899 +#: src/libslic3r/PrintConfig.cpp:988 msgid "Filament notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:900 +#: src/libslic3r/PrintConfig.cpp:989 msgid "You can put your notes regarding the filament here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:908 src/libslic3r/PrintConfig.cpp:1821 +#: src/libslic3r/PrintConfig.cpp:997 src/libslic3r/PrintConfig.cpp:1858 msgid "Max volumetric speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:909 +#: src/libslic3r/PrintConfig.cpp:998 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " "speed. Set to zero for no limit." msgstr "" -#: src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:1007 msgid "Loading speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:919 +#: src/libslic3r/PrintConfig.cpp:1008 msgid "Speed used for loading the filament on the wipe tower." msgstr "" -#: src/libslic3r/PrintConfig.cpp:926 +#: src/libslic3r/PrintConfig.cpp:1015 msgid "Loading speed at the start" msgstr "" -#: src/libslic3r/PrintConfig.cpp:927 +#: src/libslic3r/PrintConfig.cpp:1016 msgid "Speed used at the very beginning of loading phase." msgstr "" -#: src/libslic3r/PrintConfig.cpp:934 +#: src/libslic3r/PrintConfig.cpp:1023 msgid "Unloading speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:935 +#: src/libslic3r/PrintConfig.cpp:1024 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." @@ -10881,20 +12732,20 @@ msgstr "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." -#: src/libslic3r/PrintConfig.cpp:943 +#: src/libslic3r/PrintConfig.cpp:1032 msgid "Unloading speed at the start" msgstr "" -#: src/libslic3r/PrintConfig.cpp:944 +#: src/libslic3r/PrintConfig.cpp:1033 msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "" -#: src/libslic3r/PrintConfig.cpp:951 +#: src/libslic3r/PrintConfig.cpp:1040 msgid "Delay after unloading" msgstr "" -#: src/libslic3r/PrintConfig.cpp:952 +#: src/libslic3r/PrintConfig.cpp:1041 msgid "" "Time to wait after the filament is unloaded. May help to get reliable " "toolchanges with flexible materials that may need more time to shrink to " @@ -10904,29 +12755,29 @@ msgstr "" "changes with flexible materials that may need more time to shrink to " "original dimensions." -#: src/libslic3r/PrintConfig.cpp:961 +#: src/libslic3r/PrintConfig.cpp:1050 msgid "Number of cooling moves" msgstr "" -#: src/libslic3r/PrintConfig.cpp:962 +#: src/libslic3r/PrintConfig.cpp:1051 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " "Specify desired number of these moves." msgstr "" -#: src/libslic3r/PrintConfig.cpp:970 +#: src/libslic3r/PrintConfig.cpp:1059 msgid "Speed of the first cooling move" msgstr "" -#: src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:1060 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:978 +#: src/libslic3r/PrintConfig.cpp:1067 msgid "Minimal purge on wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:979 +#: src/libslic3r/PrintConfig.cpp:1068 msgid "" "After a tool change, the exact position of the newly loaded filament inside " "the nozzle may not be known, and the filament pressure is likely not yet " @@ -10935,63 +12786,63 @@ msgid "" "to produce successive infill or sacrificial object extrusions reliably." msgstr "" -#: src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:1072 msgid "mm³" msgstr "" -#: src/libslic3r/PrintConfig.cpp:989 +#: src/libslic3r/PrintConfig.cpp:1078 msgid "Speed of the last cooling move" msgstr "" -#: src/libslic3r/PrintConfig.cpp:990 +#: src/libslic3r/PrintConfig.cpp:1079 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:997 +#: src/libslic3r/PrintConfig.cpp:1086 msgid "Filament load time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:998 +#: src/libslic3r/PrintConfig.cpp:1087 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " "filament during a tool change (when executing the T code). This time is " "added to the total print time by the G-code time estimator." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1005 +#: src/libslic3r/PrintConfig.cpp:1094 msgid "Ramming parameters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1006 +#: src/libslic3r/PrintConfig.cpp:1095 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1012 +#: src/libslic3r/PrintConfig.cpp:1101 msgid "Filament unload time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1013 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " "filament during a tool change (when executing the T code). This time is " "added to the total print time by the G-code time estimator." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1021 +#: src/libslic3r/PrintConfig.cpp:1110 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " "average." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1028 src/libslic3r/PrintConfig.cpp:3432 -#: src/libslic3r/PrintConfig.cpp:3433 +#: src/libslic3r/PrintConfig.cpp:1117 src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3710 msgid "Density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1029 +#: src/libslic3r/PrintConfig.cpp:1118 msgid "" "Enter your filament density here. This is only for statistical information. " "A decent way is to weigh a known length of filament and compute the ratio of " @@ -10999,41 +12850,41 @@ msgid "" "displacement." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1032 +#: src/libslic3r/PrintConfig.cpp:1121 msgid "g/cm³" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1037 +#: src/libslic3r/PrintConfig.cpp:1126 msgid "Filament type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1038 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "The filament material type for use in custom G-codes." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1066 +#: src/libslic3r/PrintConfig.cpp:1155 msgid "Soluble material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1067 +#: src/libslic3r/PrintConfig.cpp:1156 msgid "Soluble material is most likely used for a soluble support." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1073 +#: src/libslic3r/PrintConfig.cpp:1162 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1074 +#: src/libslic3r/PrintConfig.cpp:1163 msgid "money/kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1168 msgid "Spool weight" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1080 +#: src/libslic3r/PrintConfig.cpp:1169 msgid "" "Enter weight of the empty filament spool. One may weigh a partially consumed " "filament spool before printing and one may compare the measured weight with " @@ -11041,109 +12892,109 @@ msgid "" "amount of filament on the spool is sufficient to finish the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1084 +#: src/libslic3r/PrintConfig.cpp:1173 msgid "g" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1093 src/libslic3r/PrintConfig.cpp:3537 +#: src/libslic3r/PrintConfig.cpp:1182 src/libslic3r/PrintConfig.cpp:3814 msgid "(Unknown)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:1186 msgid "Fill angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1099 +#: src/libslic3r/PrintConfig.cpp:1188 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " "so this setting does not affect them." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1199 msgid "Fill density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1113 +#: src/libslic3r/PrintConfig.cpp:1201 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "Density of internal infill, expressed in the range 0 % - 100 %." -#: src/libslic3r/PrintConfig.cpp:1148 +#: src/libslic3r/PrintConfig.cpp:1224 msgid "Fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1150 +#: src/libslic3r/PrintConfig.cpp:1226 msgid "Fill pattern for general low-density infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1171 src/libslic3r/PrintConfig.cpp:2803 +#: src/libslic3r/PrintConfig.cpp:1230 src/libslic3r/PrintConfig.cpp:2822 msgid "Grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1173 +#: src/libslic3r/PrintConfig.cpp:1232 msgid "Stars" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1174 +#: src/libslic3r/PrintConfig.cpp:1233 msgid "Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1175 +#: src/libslic3r/PrintConfig.cpp:1234 msgid "Line" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1177 src/libslic3r/PrintConfig.cpp:2756 +#: src/libslic3r/PrintConfig.cpp:1236 src/libslic3r/PrintConfig.cpp:2778 msgid "Honeycomb" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1178 +#: src/libslic3r/PrintConfig.cpp:1237 msgid "3D Honeycomb" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1179 +#: src/libslic3r/PrintConfig.cpp:1238 msgid "Gyroid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1183 +#: src/libslic3r/PrintConfig.cpp:1242 msgid "Adaptive Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1184 +#: src/libslic3r/PrintConfig.cpp:1243 msgid "Support Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1185 +#: src/libslic3r/PrintConfig.cpp:1244 msgid "Lightning" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1190 +#: src/libslic3r/PrintConfig.cpp:1250 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1198 +#: src/libslic3r/PrintConfig.cpp:1258 msgid "First object layer over raft interface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1199 +#: src/libslic3r/PrintConfig.cpp:1259 msgid "" "This is the acceleration your printer will use for first layer of object " "above raft interface. Set zero to disable acceleration control for first " "layer of object above raft interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "First layer bed temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1209 +#: src/libslic3r/PrintConfig.cpp:1269 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1219 +#: src/libslic3r/PrintConfig.cpp:1279 msgid "" "Set this to a non-zero value to set a manual extrusion width for first " "layer. You can use this to force fatter extrudates for better adhesion. If " @@ -11151,29 +13002,29 @@ msgid "" "layer height. If set to zero, it will use the default extrusion width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1293 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " "plates." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1301 msgid "First layer speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1242 +#: src/libslic3r/PrintConfig.cpp:1302 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " "as a percentage (for example: 40%) it will scale the default speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1252 +#: src/libslic3r/PrintConfig.cpp:1312 msgid "Speed of object first layer over raft interface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1253 +#: src/libslic3r/PrintConfig.cpp:1313 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first object layer above raft interface, regardless " @@ -11181,22 +13032,22 @@ msgid "" "the default speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1263 +#: src/libslic3r/PrintConfig.cpp:1323 msgid "First layer nozzle temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1264 +#: src/libslic3r/PrintConfig.cpp:1324 msgid "" "Nozzle temperature for the first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " "commands in the output G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1272 +#: src/libslic3r/PrintConfig.cpp:1332 msgid "Full fan speed at layer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1273 +#: src/libslic3r/PrintConfig.cpp:1333 msgid "" "Fan speed will be ramped up linearly from zero at layer " "\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". " @@ -11205,72 +13056,76 @@ msgid "" "maximum allowed speed at layer \"disable_fan_first_layers\" + 1." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1285 +#: src/libslic3r/PrintConfig.cpp:1345 msgid "Fuzzy skin type." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1348 msgid "Outside walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1293 +#: src/libslic3r/PrintConfig.cpp:1349 msgid "All walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1298 +#: src/libslic3r/PrintConfig.cpp:1355 msgid "Fuzzy skin thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1300 +#: src/libslic3r/PrintConfig.cpp:1357 msgid "" "The maximum distance that each skin point can be offset (both ways), " "measured perpendicular to the perimeter wall." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1308 +#: src/libslic3r/PrintConfig.cpp:1365 msgid "Fuzzy skin point distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1310 +#: src/libslic3r/PrintConfig.cpp:1367 msgid "" "Perimeters will be split into multiple segments by inserting Fuzzy skin " "points. Lowering the Fuzzy skin point distance will increase the number of " "randomly offset points on the perimeter wall." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1318 +#: src/libslic3r/PrintConfig.cpp:1375 msgid "Fill gaps" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1320 +#: src/libslic3r/PrintConfig.cpp:1377 msgid "" "Enables filling of gaps between perimeters and between the inner most " "perimeters and infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1327 +#: src/libslic3r/PrintConfig.cpp:1382 +msgid "Gap fill" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1384 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " "filling." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1335 +#: src/libslic3r/PrintConfig.cpp:1392 msgid "Verbose G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1336 +#: src/libslic3r/PrintConfig.cpp:1393 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " "file could make your firmware slow down." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1400 msgid "G-code flavor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1344 +#: src/libslic3r/PrintConfig.cpp:1401 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " @@ -11278,15 +13133,15 @@ msgid "" "extrusion value at all." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1416 msgid "No extrusion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1376 +#: src/libslic3r/PrintConfig.cpp:1422 msgid "Label objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1377 +#: src/libslic3r/PrintConfig.cpp:1423 msgid "" "Enable this to add comments into the G-Code labeling print moves with what " "object they belong to, which is useful for the Octoprint CancelObject " @@ -11294,62 +13149,72 @@ msgid "" "setup and Wipe into Object / Wipe into Infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1384 +#: src/libslic3r/PrintConfig.cpp:1430 msgid "G-code substitutions" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1385 +#: src/libslic3r/PrintConfig.cpp:1431 msgid "Find / replace patterns in G-code lines and substitute them." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1390 +#: src/libslic3r/PrintConfig.cpp:1436 msgid "High extruder current on filament swap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1391 +#: src/libslic3r/PrintConfig.cpp:1437 msgid "" "It may be beneficial to increase the extruder motor current during the " "filament exchange sequence to allow for rapid ramming feed rates and to " "overcome resistance when loading a filament with an ugly shaped tip." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1399 +#: src/libslic3r/PrintConfig.cpp:1445 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1408 +#: src/libslic3r/PrintConfig.cpp:1453 src/libslic3r/PrintConfig.cpp:2423 +#: src/libslic3r/PrintConfig.cpp:2435 +msgid "Solid infill" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1454 msgid "" "This is the acceleration your printer will use for solid infill. Set zero to " "use the value for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:2977 +#: src/libslic3r/PrintConfig.cpp:2990 +msgid "Top solid infill" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1463 msgid "" "This is the acceleration your printer will use for top solid infill. Set " "zero to use the value for solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1426 +#: src/libslic3r/PrintConfig.cpp:1472 msgid "Combine infill every" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1428 +#: src/libslic3r/PrintConfig.cpp:1474 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1431 +#: src/libslic3r/PrintConfig.cpp:1477 msgid "Combine infill every n layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1437 +#: src/libslic3r/PrintConfig.cpp:1483 msgid "Length of the infill anchor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1439 +#: src/libslic3r/PrintConfig.cpp:1485 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -11362,35 +13227,35 @@ msgid "" "perimeters connected to a single infill line." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1455 +#: src/libslic3r/PrintConfig.cpp:1495 msgid "0 (no open anchors)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1456 src/libslic3r/PrintConfig.cpp:1479 +#: src/libslic3r/PrintConfig.cpp:1496 src/libslic3r/PrintConfig.cpp:1519 msgid "1 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1457 src/libslic3r/PrintConfig.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:1520 msgid "2 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1458 src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1498 src/libslic3r/PrintConfig.cpp:1521 msgid "5 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1459 src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1499 src/libslic3r/PrintConfig.cpp:1522 msgid "10 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1460 src/libslic3r/PrintConfig.cpp:1483 +#: src/libslic3r/PrintConfig.cpp:1500 src/libslic3r/PrintConfig.cpp:1523 msgid "1000 (unlimited)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1465 +#: src/libslic3r/PrintConfig.cpp:1506 msgid "Maximum length of the infill anchor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1508 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -11402,19 +13267,19 @@ msgid "" "parameter. Set this parameter to zero to disable anchoring." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1478 +#: src/libslic3r/PrintConfig.cpp:1518 msgid "0 (not anchored)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1488 +#: src/libslic3r/PrintConfig.cpp:1529 msgid "Infill extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1490 +#: src/libslic3r/PrintConfig.cpp:1531 msgid "The extruder to use when printing infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:1539 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill. If " "left zero, default extrusion width will be used if set, otherwise 1.125 x " @@ -11423,32 +13288,32 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1550 msgid "Infill before perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1510 +#: src/libslic3r/PrintConfig.cpp:1551 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1515 +#: src/libslic3r/PrintConfig.cpp:1556 msgid "Only infill where needed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1517 +#: src/libslic3r/PrintConfig.cpp:1558 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " "the G-code generation due to the multiple checks involved." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1524 +#: src/libslic3r/PrintConfig.cpp:1565 msgid "Infill/perimeters overlap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1526 +#: src/libslic3r/PrintConfig.cpp:1567 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -11456,84 +13321,84 @@ msgid "" "perimeter extrusion width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1545 +#: src/libslic3r/PrintConfig.cpp:1586 msgid "Inherits profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1546 +#: src/libslic3r/PrintConfig.cpp:1587 msgid "Name of the profile, from which this profile inherits." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1600 msgid "Interface shells" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1560 +#: src/libslic3r/PrintConfig.cpp:1601 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " "soluble support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1568 +#: src/libslic3r/PrintConfig.cpp:1609 msgid "Maximum width of a segmented region" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1569 +#: src/libslic3r/PrintConfig.cpp:1610 msgid "Maximum width of a segmented region. Zero disables this feature." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1570 src/libslic3r/PrintConfig.cpp:2189 -#: src/libslic3r/PrintConfig.cpp:2198 +#: src/libslic3r/PrintConfig.cpp:1611 src/libslic3r/PrintConfig.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2228 msgid "mm (zero to disable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1577 +#: src/libslic3r/PrintConfig.cpp:1618 msgid "Enable ironing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1578 +#: src/libslic3r/PrintConfig.cpp:1619 msgid "" "Enable ironing of the top layers with the hot print head for smooth surface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1584 src/libslic3r/PrintConfig.cpp:1586 +#: src/libslic3r/PrintConfig.cpp:1625 src/libslic3r/PrintConfig.cpp:1627 msgid "Ironing Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1591 +#: src/libslic3r/PrintConfig.cpp:1629 msgid "All top surfaces" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Topmost surface only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1593 +#: src/libslic3r/PrintConfig.cpp:1631 msgid "All solid surfaces" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1598 +#: src/libslic3r/PrintConfig.cpp:1637 msgid "Flow rate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Percent of a flow rate relative to object's normal layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1608 +#: src/libslic3r/PrintConfig.cpp:1647 msgid "Spacing between ironing passes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1649 msgid "Distance between ironing lines" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1627 +#: src/libslic3r/PrintConfig.cpp:1666 msgid "" "This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can " @@ -11541,11 +13406,11 @@ msgid "" "[layer_z]." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1638 +#: src/libslic3r/PrintConfig.cpp:1677 msgid "Supports remaining times" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1639 +#: src/libslic3r/PrintConfig.cpp:1678 msgid "" "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " "intervals into the G-code to let the firmware show accurate remaining time. " @@ -11553,155 +13418,155 @@ msgid "" "firmware supports M73 Qxx Sxx for the silent mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1647 +#: src/libslic3r/PrintConfig.cpp:1686 msgid "Supports stealth mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1687 msgid "The firmware supports stealth mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1653 +#: src/libslic3r/PrintConfig.cpp:1692 msgid "How to apply limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1654 +#: src/libslic3r/PrintConfig.cpp:1693 msgid "Purpose of Machine Limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1656 +#: src/libslic3r/PrintConfig.cpp:1695 msgid "How to apply the Machine Limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1661 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "Emit to G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1662 +#: src/libslic3r/PrintConfig.cpp:1698 msgid "Use for time estimate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1663 +#: src/libslic3r/PrintConfig.cpp:1699 msgid "Ignore" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1686 +#: src/libslic3r/PrintConfig.cpp:1723 msgid "Maximum feedrate X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1687 +#: src/libslic3r/PrintConfig.cpp:1724 msgid "Maximum feedrate Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1688 +#: src/libslic3r/PrintConfig.cpp:1725 msgid "Maximum feedrate Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1689 +#: src/libslic3r/PrintConfig.cpp:1726 msgid "Maximum feedrate E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1692 +#: src/libslic3r/PrintConfig.cpp:1729 msgid "Maximum feedrate of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1693 +#: src/libslic3r/PrintConfig.cpp:1730 msgid "Maximum feedrate of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1694 +#: src/libslic3r/PrintConfig.cpp:1731 msgid "Maximum feedrate of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1695 +#: src/libslic3r/PrintConfig.cpp:1732 msgid "Maximum feedrate of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1703 +#: src/libslic3r/PrintConfig.cpp:1740 msgid "Maximum acceleration X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1704 +#: src/libslic3r/PrintConfig.cpp:1741 msgid "Maximum acceleration Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1705 +#: src/libslic3r/PrintConfig.cpp:1742 msgid "Maximum acceleration Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1706 +#: src/libslic3r/PrintConfig.cpp:1743 msgid "Maximum acceleration E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1709 +#: src/libslic3r/PrintConfig.cpp:1746 msgid "Maximum acceleration of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1710 +#: src/libslic3r/PrintConfig.cpp:1747 msgid "Maximum acceleration of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1711 +#: src/libslic3r/PrintConfig.cpp:1748 msgid "Maximum acceleration of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1712 +#: src/libslic3r/PrintConfig.cpp:1749 msgid "Maximum acceleration of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1720 +#: src/libslic3r/PrintConfig.cpp:1757 msgid "Maximum jerk X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1721 +#: src/libslic3r/PrintConfig.cpp:1758 msgid "Maximum jerk Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1722 +#: src/libslic3r/PrintConfig.cpp:1759 msgid "Maximum jerk Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1723 +#: src/libslic3r/PrintConfig.cpp:1760 msgid "Maximum jerk E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:1763 msgid "Maximum jerk of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1764 msgid "Maximum jerk of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1728 +#: src/libslic3r/PrintConfig.cpp:1765 msgid "Maximum jerk of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1729 +#: src/libslic3r/PrintConfig.cpp:1766 msgid "Maximum jerk of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1739 +#: src/libslic3r/PrintConfig.cpp:1776 msgid "Minimum feedrate when extruding" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1741 +#: src/libslic3r/PrintConfig.cpp:1778 msgid "Minimum feedrate when extruding (M205 S)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1749 +#: src/libslic3r/PrintConfig.cpp:1786 msgid "Minimum travel feedrate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:1788 msgid "Minimum travel feedrate (M205 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1759 +#: src/libslic3r/PrintConfig.cpp:1796 msgid "Maximum acceleration when extruding" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1798 msgid "" "Maximum acceleration when extruding (M204 P)\n" "\n" @@ -11709,31 +13574,32 @@ msgid "" "(M204 T)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1772 +#: src/libslic3r/PrintConfig.cpp:1809 msgid "Maximum acceleration when retracting" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1774 +#: src/libslic3r/PrintConfig.cpp:1811 msgid "Maximum acceleration when retracting (M204 R)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1782 +#: src/libslic3r/PrintConfig.cpp:1819 msgid "Maximum acceleration for travel moves" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1784 +#: src/libslic3r/PrintConfig.cpp:1821 msgid "Maximum acceleration for travel moves (M204 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1791 src/libslic3r/PrintConfig.cpp:1800 +#: src/libslic3r/PrintConfig.cpp:1828 src/libslic3r/PrintConfig.cpp:1837 msgid "Max" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1792 +#: src/libslic3r/PrintConfig.cpp:1829 msgid "This setting represents the maximum speed of your fan." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1801 +#: src/libslic3r/PrintConfig.cpp:1838 +#, c-format, boost-format msgid "" "This is the highest printable layer height for this extruder, used to cap " "the variable layer height and support layer height. Maximum recommended " @@ -11741,28 +13607,28 @@ msgid "" "adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1811 +#: src/libslic3r/PrintConfig.cpp:1848 msgid "Max print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1849 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " "is used to set the highest print speed you want to allow." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1822 +#: src/libslic3r/PrintConfig.cpp:1859 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1867 msgid "Max volumetric slope positive" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1831 +#: src/libslic3r/PrintConfig.cpp:1868 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from lower speed to higher speed. A value of 1.8 mm³/" @@ -11771,15 +13637,15 @@ msgid "" "(feedrate 60 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1836 src/libslic3r/PrintConfig.cpp:1848 +#: src/libslic3r/PrintConfig.cpp:1873 src/libslic3r/PrintConfig.cpp:1885 msgid "mm³/s²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1842 +#: src/libslic3r/PrintConfig.cpp:1879 msgid "Max volumetric slope negative" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1843 +#: src/libslic3r/PrintConfig.cpp:1880 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from higher speed to lower speed. A value of 1.8 mm³/" @@ -11788,87 +13654,86 @@ msgid "" "(feedrate 20 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1854 src/libslic3r/PrintConfig.cpp:1863 +#: src/libslic3r/PrintConfig.cpp:1891 src/libslic3r/PrintConfig.cpp:1900 msgid "Min" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1855 +#: src/libslic3r/PrintConfig.cpp:1892 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1864 +#: src/libslic3r/PrintConfig.cpp:1901 msgid "" "This is the lowest printable layer height for this extruder and limits the " "resolution for variable layer height. Typical values are between 0.05 mm and " "0.1 mm." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1872 +#: src/libslic3r/PrintConfig.cpp:1909 msgid "Min print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1873 +#: src/libslic3r/PrintConfig.cpp:1910 msgid "Slic3r will not scale speed down below this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1880 +#: src/libslic3r/PrintConfig.cpp:1917 msgid "Minimal filament extrusion length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1881 +#: src/libslic3r/PrintConfig.cpp:1918 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " "machines, this minimum applies to each extruder." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1890 +#: src/libslic3r/PrintConfig.cpp:1927 msgid "Configuration notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1891 +#: src/libslic3r/PrintConfig.cpp:1928 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:1938 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1906 +#: src/libslic3r/PrintConfig.cpp:1943 msgid "Host Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1907 +#: src/libslic3r/PrintConfig.cpp:1944 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:1961 msgid "Only retract when crossing perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1930 +#: src/libslic3r/PrintConfig.cpp:1962 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1937 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "" "This option will drop the temperature of the inactive extruders to prevent " -"oozing. It will enable a tall skirt automatically and move extruders outside " -"such skirt when changing temperatures." +"oozing. " msgstr "" -#: src/libslic3r/PrintConfig.cpp:1944 +#: src/libslic3r/PrintConfig.cpp:1974 msgid "Output filename format" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1945 +#: src/libslic3r/PrintConfig.cpp:1975 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -11876,31 +13741,31 @@ msgid "" "[input_filename], [input_filename_base]." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1954 +#: src/libslic3r/PrintConfig.cpp:1984 msgid "Detect bridging perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:1986 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1962 +#: src/libslic3r/PrintConfig.cpp:1992 msgid "Filament parking position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1963 +#: src/libslic3r/PrintConfig.cpp:1993 msgid "" "Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1971 +#: src/libslic3r/PrintConfig.cpp:2001 msgid "Extra loading distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:2002 msgid "" "When set to zero, the distance the filament is moved from parking position " "during load is exactly the same as it was moved back during unload. When " @@ -11912,33 +13777,33 @@ msgstr "" "positive, it is loaded further, if negative, the loading move is shorter " "than unloading." -#: src/libslic3r/PrintConfig.cpp:1980 src/libslic3r/PrintConfig.cpp:2005 -#: src/libslic3r/PrintConfig.cpp:2019 src/libslic3r/PrintConfig.cpp:2029 +#: src/libslic3r/PrintConfig.cpp:2010 src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2049 src/libslic3r/PrintConfig.cpp:2059 msgid "Perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1981 +#: src/libslic3r/PrintConfig.cpp:2011 msgid "" "This is the acceleration your printer will use for perimeters. Set zero to " "disable acceleration control for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1989 +#: src/libslic3r/PrintConfig.cpp:2019 msgid "" "This is the acceleration your printer will use for external perimeters. Set " "zero to use the value for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1996 +#: src/libslic3r/PrintConfig.cpp:2026 msgid "Perimeter extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1998 +#: src/libslic3r/PrintConfig.cpp:2028 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2007 +#: src/libslic3r/PrintConfig.cpp:2037 msgid "" "Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. If " @@ -11947,12 +13812,12 @@ msgid "" "it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2021 +#: src/libslic3r/PrintConfig.cpp:2051 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2031 +#: src/libslic3r/PrintConfig.cpp:2061 msgid "" "This option sets the number of perimeters to generate for each layer. Note " "that Slic3r may increase this number automatically when it detects sloping " @@ -11960,11 +13825,11 @@ msgid "" "Perimeters option is enabled." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2065 msgid "(minimum)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "" "If you want to process the output G-code through custom scripts, just list " "their absolute paths here. Separate multiple scripts with a semicolon. " @@ -11973,90 +13838,90 @@ msgid "" "environment variables." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2055 +#: src/libslic3r/PrintConfig.cpp:2085 msgid "Printer type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2056 +#: src/libslic3r/PrintConfig.cpp:2086 msgid "Type of the printer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2061 +#: src/libslic3r/PrintConfig.cpp:2091 msgid "Printer notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2062 +#: src/libslic3r/PrintConfig.cpp:2092 msgid "You can put your notes regarding the printer here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2070 +#: src/libslic3r/PrintConfig.cpp:2100 msgid "Printer vendor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2071 +#: src/libslic3r/PrintConfig.cpp:2101 msgid "Name of the printer vendor." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2076 +#: src/libslic3r/PrintConfig.cpp:2106 msgid "Printer variant" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2077 +#: src/libslic3r/PrintConfig.cpp:2107 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2094 +#: src/libslic3r/PrintConfig.cpp:2124 msgid "Raft contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2096 +#: src/libslic3r/PrintConfig.cpp:2126 msgid "" "The vertical distance between object and raft. Ignored for soluble interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2103 +#: src/libslic3r/PrintConfig.cpp:2133 msgid "Raft expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2105 +#: src/libslic3r/PrintConfig.cpp:2135 msgid "Expansion of the raft in XY plane for better stability." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:2142 msgid "First layer density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2114 +#: src/libslic3r/PrintConfig.cpp:2144 msgid "Density of the first raft or support layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2122 +#: src/libslic3r/PrintConfig.cpp:2152 msgid "First layer expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2124 +#: src/libslic3r/PrintConfig.cpp:2154 msgid "" "Expansion of the first raft or support layer to improve adhesion to print " "bed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2131 +#: src/libslic3r/PrintConfig.cpp:2161 msgid "Raft layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2133 +#: src/libslic3r/PrintConfig.cpp:2163 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2141 +#: src/libslic3r/PrintConfig.cpp:2171 msgid "Slice resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2142 +#: src/libslic3r/PrintConfig.cpp:2172 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -12064,11 +13929,11 @@ msgid "" "simplification and use full resolution from input." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:2182 msgid "G-code resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2153 +#: src/libslic3r/PrintConfig.cpp:2183 msgid "" "Maximum deviation of exported G-code paths from their full resolution " "counterparts. Very high resolution G-code requires huge amount of RAM to " @@ -12079,197 +13944,211 @@ msgid "" "produced." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2164 +#: src/libslic3r/PrintConfig.cpp:2194 msgid "Minimum travel after retraction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2165 +#: src/libslic3r/PrintConfig.cpp:2195 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2171 +#: src/libslic3r/PrintConfig.cpp:2201 msgid "Retract amount before wipe" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2172 +#: src/libslic3r/PrintConfig.cpp:2202 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2179 +#: src/libslic3r/PrintConfig.cpp:2209 msgid "Retract on layer change" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2180 +#: src/libslic3r/PrintConfig.cpp:2210 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2185 src/libslic3r/PrintConfig.cpp:2193 +#: src/libslic3r/PrintConfig.cpp:2215 src/libslic3r/PrintConfig.cpp:2223 msgid "Length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2186 +#: src/libslic3r/PrintConfig.cpp:2216 msgid "Retraction Length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2187 +#: src/libslic3r/PrintConfig.cpp:2217 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " "extruder)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2194 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Retraction Length (Toolchange)" msgstr "Retraction Length (Tool change)" -#: src/libslic3r/PrintConfig.cpp:2195 +#: src/libslic3r/PrintConfig.cpp:2225 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " "enters the extruder)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2203 +#: src/libslic3r/PrintConfig.cpp:2233 msgid "Lift Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2204 +#: src/libslic3r/PrintConfig.cpp:2234 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " "the first extruder will be considered." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2211 +#: src/libslic3r/PrintConfig.cpp:2241 msgid "Above Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2212 +#: src/libslic3r/PrintConfig.cpp:2242 msgid "Only lift Z above" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2213 +#: src/libslic3r/PrintConfig.cpp:2243 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " "first layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2220 +#: src/libslic3r/PrintConfig.cpp:2250 msgid "Below Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2221 +#: src/libslic3r/PrintConfig.cpp:2251 msgid "Only lift Z below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2252 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " "first layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2238 +#: src/libslic3r/PrintConfig.cpp:2260 src/libslic3r/PrintConfig.cpp:2268 msgid "Extra length on restart" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2231 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2239 +#: src/libslic3r/PrintConfig.cpp:2269 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2246 src/libslic3r/PrintConfig.cpp:2247 +#: src/libslic3r/PrintConfig.cpp:2276 src/libslic3r/PrintConfig.cpp:2277 msgid "Retraction Speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2248 +#: src/libslic3r/PrintConfig.cpp:2278 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2254 src/libslic3r/PrintConfig.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:2284 src/libslic3r/PrintConfig.cpp:2285 msgid "Deretraction Speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2256 +#: src/libslic3r/PrintConfig.cpp:2286 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " "used." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2293 msgid "Seam position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2265 +#: src/libslic3r/PrintConfig.cpp:2295 msgid "Position of perimeters starting points." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2272 -msgid "Nearest" +#: src/libslic3r/PrintConfig.cpp:2297 +msgid "Random" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2298 +msgid "Nearest" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2299 +msgid "Aligned" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2306 +msgid "Staggered inner seams" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2273 -msgid "Aligned" +#: src/libslic3r/PrintConfig.cpp:2307 +msgid "" +"This option causes the inner seams to be shifted backwards based on their " +"depth, forming a zigzag pattern." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2281 +#: src/libslic3r/PrintConfig.cpp:2314 msgid "Direction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2283 +#: src/libslic3r/PrintConfig.cpp:2316 msgid "Preferred direction of the seam" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2284 +#: src/libslic3r/PrintConfig.cpp:2317 msgid "Seam preferred direction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2291 +#: src/libslic3r/PrintConfig.cpp:2324 msgid "Jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2293 +#: src/libslic3r/PrintConfig.cpp:2326 msgid "Seam preferred direction jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2294 +#: src/libslic3r/PrintConfig.cpp:2327 msgid "Preferred direction of the seam - jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2301 +#: src/libslic3r/PrintConfig.cpp:2334 msgid "Distance from brim/object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2335 msgid "" "Distance between skirt and brim (when draft shield is not used) or objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2308 +#: src/libslic3r/PrintConfig.cpp:2341 msgid "Skirt height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2309 +#: src/libslic3r/PrintConfig.cpp:2342 msgid "Height of skirt expressed in layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2348 msgid "Draft shield" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2316 +#: src/libslic3r/PrintConfig.cpp:2349 msgid "" "With draft shield active, the skirt will be printed skirt_distance from the " "object, possibly intersecting brim.\n" @@ -12279,81 +14158,81 @@ msgid "" "from print bed due to wind draft." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2324 +#: src/libslic3r/PrintConfig.cpp:2354 msgid "Disabled" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2325 +#: src/libslic3r/PrintConfig.cpp:2355 msgid "Limited" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2326 +#: src/libslic3r/PrintConfig.cpp:2356 msgid "Enabled" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2331 +#: src/libslic3r/PrintConfig.cpp:2362 msgid "Loops (minimum)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2332 +#: src/libslic3r/PrintConfig.cpp:2363 msgid "Skirt Loops" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2364 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " "this to zero to disable skirt completely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2341 +#: src/libslic3r/PrintConfig.cpp:2372 msgid "Slow down if layer print time is below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2342 +#: src/libslic3r/PrintConfig.cpp:2373 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2351 +#: src/libslic3r/PrintConfig.cpp:2382 msgid "Small perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2353 +#: src/libslic3r/PrintConfig.cpp:2384 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " "be calculated on the perimeters speed setting above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2363 +#: src/libslic3r/PrintConfig.cpp:2394 msgid "Solid infill threshold area" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2365 +#: src/libslic3r/PrintConfig.cpp:2396 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2366 +#: src/libslic3r/PrintConfig.cpp:2397 msgid "mm²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2372 +#: src/libslic3r/PrintConfig.cpp:2403 msgid "Solid infill extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2374 +#: src/libslic3r/PrintConfig.cpp:2405 msgid "The extruder to use when printing solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2380 +#: src/libslic3r/PrintConfig.cpp:2411 msgid "Solid infill every" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2382 +#: src/libslic3r/PrintConfig.cpp:2413 msgid "" "This feature allows to force a solid layer every given number of layers. " "Zero to disable. You can set this to any value (for example 9999); Slic3r " @@ -12361,7 +14240,7 @@ msgid "" "according to nozzle diameter and layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2394 +#: src/libslic3r/PrintConfig.cpp:2425 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "solid surfaces. If left zero, default extrusion width will be used if set, " @@ -12369,26 +14248,26 @@ msgid "" "(for example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2406 +#: src/libslic3r/PrintConfig.cpp:2437 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " "infill speed above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2418 +#: src/libslic3r/PrintConfig.cpp:2449 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2455 src/libslic3r/PrintConfig.cpp:2456 msgid "Minimum thickness of a top / bottom shell" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2431 +#: src/libslic3r/PrintConfig.cpp:2462 msgid "Spiral vase" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2463 msgid "" "This feature will raise Z gradually while printing a single-walled object in " "order to remove any visible seam. This option requires a single perimeter, " @@ -12397,18 +14276,17 @@ msgid "" "when printing more than one single object." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2440 +#: src/libslic3r/PrintConfig.cpp:2471 msgid "Temperature variation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:2472 msgid "" -"Temperature difference to be applied when an extruder is not active. Enables " -"a full-height \"sacrificial\" skirt on which the nozzles are periodically " -"wiped." +"Temperature difference to be applied when an extruder is not active. The " +"value is not used when 'idle_temperature' in filament settings is defined." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2483 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -12419,7 +14297,7 @@ msgid "" "put a \"M109 S[first_layer_temperature]\" command wherever you want." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2466 +#: src/libslic3r/PrintConfig.cpp:2498 msgid "" "This start procedure is inserted at the beginning, after any printer start " "gcode (and after any toolchange to this filament in case of multi-material " @@ -12441,45 +14319,45 @@ msgstr "" "S[first_layer_temperature]\" command wherever you want. If you have multiple " "extruders, the gcode is processed in extruder order." -#: src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2514 msgid "Color change G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2483 +#: src/libslic3r/PrintConfig.cpp:2515 msgid "This G-code will be used as a code for the color change" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2492 +#: src/libslic3r/PrintConfig.cpp:2524 msgid "This G-code will be used as a code for the pause print" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2501 +#: src/libslic3r/PrintConfig.cpp:2533 msgid "This G-code will be used as a custom code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2509 +#: src/libslic3r/PrintConfig.cpp:2541 msgid "Single Extruder Multi Material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2510 +#: src/libslic3r/PrintConfig.cpp:2542 msgid "The printer multiplexes filaments into a single hot end." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2515 +#: src/libslic3r/PrintConfig.cpp:2547 msgid "Prime all printing extruders" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2516 +#: src/libslic3r/PrintConfig.cpp:2548 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2521 +#: src/libslic3r/PrintConfig.cpp:2553 msgid "No sparse layers (EXPERIMENTAL)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2554 msgid "" "If enabled, the wipe tower will not be printed on layers with no " "toolchanges. On layers with a toolchange, extruder will travel downward to " @@ -12491,129 +14369,127 @@ msgstr "" "print the wipe tower. User is responsible for ensuring there is no collision " "with the print." -#: src/libslic3r/PrintConfig.cpp:2529 +#: src/libslic3r/PrintConfig.cpp:2561 msgid "Slice gap closing radius" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2531 +#: src/libslic3r/PrintConfig.cpp:2563 msgid "" "Cracks smaller than 2x gap closing radius are being filled during the " "triangle mesh slicing. The gap closing operation may reduce the final print " "resolution, therefore it is advisable to keep the value reasonably low." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2539 +#: src/libslic3r/PrintConfig.cpp:2571 msgid "Slicing Mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2541 +#: src/libslic3r/PrintConfig.cpp:2573 msgid "" "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " "close all holes in the model." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2575 msgid "Regular" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2547 +#: src/libslic3r/PrintConfig.cpp:2576 msgid "Even-odd" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2548 +#: src/libslic3r/PrintConfig.cpp:2577 msgid "Close holes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2553 +#: src/libslic3r/PrintConfig.cpp:2583 msgid "Generate support material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2555 +#: src/libslic3r/PrintConfig.cpp:2585 msgid "Enable support material generation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2559 +#: src/libslic3r/PrintConfig.cpp:2589 msgid "Auto generated supports" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2561 +#: src/libslic3r/PrintConfig.cpp:2591 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " "\"Support Enforcer\" volumes only." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2567 +#: src/libslic3r/PrintConfig.cpp:2597 msgid "XY separation between an object and its support" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2599 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2580 +#: src/libslic3r/PrintConfig.cpp:2610 msgid "Pattern angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2582 +#: src/libslic3r/PrintConfig.cpp:2612 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2592 src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:2622 src/libslic3r/PrintConfig.cpp:3411 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2598 +#: src/libslic3r/PrintConfig.cpp:2627 msgid "Top contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2600 +#: src/libslic3r/PrintConfig.cpp:2629 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " "first object layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2608 +#: src/libslic3r/PrintConfig.cpp:2635 msgid "0 (soluble)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2609 +#: src/libslic3r/PrintConfig.cpp:2636 msgid "0.1 (detachable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2610 +#: src/libslic3r/PrintConfig.cpp:2637 msgid "0.2 (detachable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2616 +#: src/libslic3r/PrintConfig.cpp:2643 msgid "Bottom contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2618 +#: src/libslic3r/PrintConfig.cpp:2645 msgid "" "The vertical distance between the object top surface and the support " "material interface. If set to zero, support_material_contact_distance will " "be used for both top and bottom contact Z distances." msgstr "" -#. TRN To be shown in Print Settings "Bottom contact Z distance". Have to be as short as possible -#. TRN To be shown in Print Settings "Bottom interface layers". Have to be as short as possible -#: src/libslic3r/PrintConfig.cpp:2626 src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2651 src/libslic3r/PrintConfig.cpp:2732 msgid "Same as top" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2633 +#: src/libslic3r/PrintConfig.cpp:2659 msgid "Enforce support for the first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2635 +#: src/libslic3r/PrintConfig.cpp:2661 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -12621,21 +14497,21 @@ msgid "" "of objects having a very thin or poor footprint on the build plate." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2640 +#: src/libslic3r/PrintConfig.cpp:2666 msgid "Enforce support for the first n layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2646 +#: src/libslic3r/PrintConfig.cpp:2672 msgid "Support material/raft/skirt extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2648 +#: src/libslic3r/PrintConfig.cpp:2674 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2657 +#: src/libslic3r/PrintConfig.cpp:2683 msgid "" "Set this to a non-zero value to set a manual extrusion width for support " "material. If left zero, default extrusion width will be used if set, " @@ -12643,151 +14519,156 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2667 +#: src/libslic3r/PrintConfig.cpp:2693 msgid "Interface loops" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2669 +#: src/libslic3r/PrintConfig.cpp:2695 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2674 +#: src/libslic3r/PrintConfig.cpp:2700 msgid "Support material/raft interface extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2676 +#: src/libslic3r/PrintConfig.cpp:2702 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2684 +#: src/libslic3r/PrintConfig.cpp:2709 msgid "Top interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2711 msgid "" "Number of interface layers to insert between the object(s) and support " "material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2693 +#: src/libslic3r/PrintConfig.cpp:2715 src/libslic3r/PrintConfig.cpp:2733 msgid "0 (off)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2716 src/libslic3r/PrintConfig.cpp:2734 msgid "1 (light)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2695 +#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2735 msgid "2 (default)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2696 +#: src/libslic3r/PrintConfig.cpp:2718 src/libslic3r/PrintConfig.cpp:2736 msgid "3 (heavy)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:2724 msgid "Bottom interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2704 +#: src/libslic3r/PrintConfig.cpp:2726 msgid "" "Number of interface layers to insert between the object(s) and support " "material. Set to -1 to use support_material_interface_layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2717 +#: src/libslic3r/PrintConfig.cpp:2742 msgid "Closing radius" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2719 +#: src/libslic3r/PrintConfig.cpp:2744 msgid "" "For snug supports, the support regions will be merged using morphological " "closing operation. Gaps smaller than the closing radius will be filled in." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2727 +#: src/libslic3r/PrintConfig.cpp:2752 msgid "Interface pattern spacing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2729 +#: src/libslic3r/PrintConfig.cpp:2754 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2738 +#: src/libslic3r/PrintConfig.cpp:2761 +msgid "Support material interface" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2763 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " "speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2747 +#: src/libslic3r/PrintConfig.cpp:2772 msgid "Pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2749 +#: src/libslic3r/PrintConfig.cpp:2774 msgid "Pattern used to generate support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2755 +#: src/libslic3r/PrintConfig.cpp:2777 msgid "Rectilinear grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2761 +#: src/libslic3r/PrintConfig.cpp:2784 msgid "Interface pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2763 +#: src/libslic3r/PrintConfig.cpp:2786 msgid "" "Pattern used to generate support material interface. Default pattern for non-" "soluble support interface is Rectilinear, while default pattern for soluble " "support interface is Concentric." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2777 +#: src/libslic3r/PrintConfig.cpp:2798 msgid "Pattern spacing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2779 +#: src/libslic3r/PrintConfig.cpp:2800 msgid "Spacing between support material lines." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2788 +#: src/libslic3r/PrintConfig.cpp:2809 msgid "Speed for printing support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2795 -msgid "Style" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:2797 +#: src/libslic3r/PrintConfig.cpp:2818 msgid "" "Style and shape of the support towers. Projecting the supports into a " "regular grid will create more stable supports, while snug support towers " "will save material and reduce object scarring." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2804 +#: src/libslic3r/PrintConfig.cpp:2823 msgid "Snug" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2809 +#: src/libslic3r/PrintConfig.cpp:2824 +msgid "Organic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2830 msgid "Synchronize with object layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2811 +#: src/libslic3r/PrintConfig.cpp:2832 msgid "" "Synchronize support layers with the object print layers. This is useful with " -"multi-material printers, where the extruder switch is expensive." +"multi-material printers, where the extruder switch is expensive. This option " +"is only available when top contact Z distance is set to zero." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2817 +#: src/libslic3r/PrintConfig.cpp:2839 msgid "Overhang threshold" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2819 +#: src/libslic3r/PrintConfig.cpp:2841 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -12801,58 +14682,123 @@ msgstr "" "that you can print without support material. Set to zero for automatic " "detection (recommended)." -#: src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2853 msgid "With sheath around the support" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2833 +#: src/libslic3r/PrintConfig.cpp:2855 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2840 +#: src/libslic3r/PrintConfig.cpp:2861 +msgid "Maximum Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2863 +msgid "" +"The maximum angle of the branches, when the branches have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle to be able to have more reach." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2872 +msgid "Preferred Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2874 +msgid "" +"The preferred angle of the branches, when they do not have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle for branches to merge faster." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2883 +msgid "Tip Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2885 +msgid "The diameter of the top of the tip of the branches of organic support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2892 +msgid "Branch Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2894 +msgid "" +"The diameter of the thinnest branches of organic support. Thicker branches " +"are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2902 +msgid "Branch Diameter Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2904 +msgid "" +"The angle of the branches' diameter as they gradually become thicker towards " +"the bottom. An angle of 0 will cause the branches to have uniform thickness " +"over their length. A bit of an angle can increase stability of the organic " +"support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2914 +msgid "Branch Density" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2916 +msgid "" +"Adjusts the density of the support structure used to generate the tips of " +"the branches. A higher value results in better overhangs but the supports " +"are harder to remove, thus it is recommended to enable top support " +"interfaces instead of a high branch density value if dense interfaces are " +"needed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2928 msgid "" "Nozzle temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2843 +#: src/libslic3r/PrintConfig.cpp:2931 msgid "Nozzle temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2849 +#: src/libslic3r/PrintConfig.cpp:2937 msgid "Thick bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2851 +#: src/libslic3r/PrintConfig.cpp:2939 msgid "" "If enabled, bridges are more reliable, can bridge longer distances, but may " "look worse. If disabled, bridges look better but are reliable just for " "shorter bridged distances." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2857 +#: src/libslic3r/PrintConfig.cpp:2945 msgid "Detect thin walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2859 +#: src/libslic3r/PrintConfig.cpp:2947 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2953 msgid "Threads" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2866 +#: src/libslic3r/PrintConfig.cpp:2954 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2878 +#: src/libslic3r/PrintConfig.cpp:2966 msgid "" "This custom code is inserted before every toolchange. Placeholder variables " "for all PrusaSlicer settings as well as {toolchange_z}, {previous_extruder} " @@ -12862,7 +14808,7 @@ msgid "" "behaviour both before and after the toolchange." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2891 +#: src/libslic3r/PrintConfig.cpp:2979 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "top surfaces. You may want to use thinner extrudates to fill all narrow " @@ -12871,7 +14817,7 @@ msgid "" "percentage (for example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2904 +#: src/libslic3r/PrintConfig.cpp:2992 msgid "" "Speed for printing top solid layers (it only applies to the uppermost " "external layers and not to their internal solid layers). You may want to " @@ -12880,65 +14826,65 @@ msgid "" "for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2919 +#: src/libslic3r/PrintConfig.cpp:3007 msgid "Number of solid layers to generate on top surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3008 msgid "Top solid layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2928 +#: src/libslic3r/PrintConfig.cpp:3016 msgid "" "The number of top solid layers is increased above top_solid_layers if " "necessary to satisfy minimum thickness of top shell. This is useful to " "prevent pillowing effect when printing with variable layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2931 +#: src/libslic3r/PrintConfig.cpp:3019 msgid "Minimum top shell thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:3026 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2946 +#: src/libslic3r/PrintConfig.cpp:3034 msgid "Z travel" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2947 +#: src/libslic3r/PrintConfig.cpp:3035 msgid "" "Speed for movements along the Z axis.\n" "When set to zero, the value is ignored and regular travel speed is used " "instead." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2955 +#: src/libslic3r/PrintConfig.cpp:3043 msgid "Use firmware retraction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2956 +#: src/libslic3r/PrintConfig.cpp:3044 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2962 +#: src/libslic3r/PrintConfig.cpp:3050 msgid "Use relative E distances" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2963 +#: src/libslic3r/PrintConfig.cpp:3051 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2969 +#: src/libslic3r/PrintConfig.cpp:3057 msgid "Use volumetric E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2970 +#: src/libslic3r/PrintConfig.cpp:3058 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -12948,48 +14894,48 @@ msgid "" "only supported in recent Marlin." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2980 +#: src/libslic3r/PrintConfig.cpp:3068 msgid "Enable variable layer height feature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2981 +#: src/libslic3r/PrintConfig.cpp:3069 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2987 +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Wipe while retracting" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2988 +#: src/libslic3r/PrintConfig.cpp:3076 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2995 +#: src/libslic3r/PrintConfig.cpp:3083 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3001 +#: src/libslic3r/PrintConfig.cpp:3089 msgid "Purging volumes - load/unload volumes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3002 +#: src/libslic3r/PrintConfig.cpp:3090 msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " "volumes below." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3008 +#: src/libslic3r/PrintConfig.cpp:3096 msgid "Purging volumes - matrix" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3009 +#: src/libslic3r/PrintConfig.cpp:3097 msgid "" "This matrix describes volumes (in cubic milimetres) required to purge the " "new filament on the wipe tower for any given pair of tools." @@ -12997,54 +14943,58 @@ msgstr "" "This matrix describes volumes (in cubic millimetres) required to purge the " "new filament on the wipe tower for any given pair of tools." -#: src/libslic3r/PrintConfig.cpp:3018 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Position X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3019 +#: src/libslic3r/PrintConfig.cpp:3107 msgid "X coordinate of the left front corner of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3025 +#: src/libslic3r/PrintConfig.cpp:3113 msgid "Position Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3026 +#: src/libslic3r/PrintConfig.cpp:3114 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3033 +#: src/libslic3r/PrintConfig.cpp:3120 +msgid "Width" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3121 msgid "Width of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3039 +#: src/libslic3r/PrintConfig.cpp:3127 msgid "Wipe tower rotation angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3040 +#: src/libslic3r/PrintConfig.cpp:3128 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3046 src/libslic3r/PrintConfig.cpp:3047 +#: src/libslic3r/PrintConfig.cpp:3134 src/libslic3r/PrintConfig.cpp:3135 msgid "Wipe tower brim width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3055 +#: src/libslic3r/PrintConfig.cpp:3143 msgid "Wipe into this object's infill" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3056 +#: src/libslic3r/PrintConfig.cpp:3144 msgid "" "Purging after toolchange will be done inside this object's infills. This " "lowers the amount of waste but may result in longer print time due to " "additional travel moves." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3063 +#: src/libslic3r/PrintConfig.cpp:3151 msgid "Wipe into this object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3064 +#: src/libslic3r/PrintConfig.cpp:3152 msgid "" "Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " @@ -13054,30 +15004,30 @@ msgstr "" "that would otherwise end up in the wipe tower and decrease print time. " "Colours of the objects will be mixed as a result." -#: src/libslic3r/PrintConfig.cpp:3070 +#: src/libslic3r/PrintConfig.cpp:3158 msgid "Maximal bridging distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3071 +#: src/libslic3r/PrintConfig.cpp:3159 msgid "Maximal distance between supports on sparse infill sections." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3077 +#: src/libslic3r/PrintConfig.cpp:3165 msgid "XY Size Compensation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3167 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" "tuning hole sizes." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3087 +#: src/libslic3r/PrintConfig.cpp:3175 msgid "Z offset" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3088 +#: src/libslic3r/PrintConfig.cpp:3176 msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " "output G-code. It is used to compensate for bad Z endstop position: for " @@ -13085,11 +15035,11 @@ msgid "" "print bed, set this to -0.3 (or fix your endstop)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3097 +#: src/libslic3r/PrintConfig.cpp:3185 msgid "Perimeter generator" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3099 +#: src/libslic3r/PrintConfig.cpp:3187 msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " @@ -13097,19 +15047,19 @@ msgid "" "Concentric infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3192 msgid "Classic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3107 +#: src/libslic3r/PrintConfig.cpp:3193 msgid "Arachne" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3199 msgid "Perimeter transition length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3114 +#: src/libslic3r/PrintConfig.cpp:3201 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " @@ -13117,11 +15067,11 @@ msgid "" "be computed based on the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3123 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Perimeter transitioning filter margin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3125 +#: src/libslic3r/PrintConfig.cpp:3212 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -13133,11 +15083,11 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3138 +#: src/libslic3r/PrintConfig.cpp:3225 msgid "Perimeter transitioning threshold angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3140 +#: src/libslic3r/PrintConfig.cpp:3227 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -13146,499 +15096,541 @@ msgid "" "these center perimeters, but may leave gaps or overextrude." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3151 -msgid "Perimeter distribution count" +#: src/libslic3r/PrintConfig.cpp:3238 +msgid "Perimeter distribution count" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3240 +msgid "" +"The number of perimeters, counted from the center, over which the variation " +"needs to be spread. Lower values mean that the outer perimeters don't change " +"in width." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3247 +msgid "Minimum feature size" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3249 +msgid "" +"Minimum thickness of thin features. Model features that are thinner than " +"this value will not be printed, while features thicker than the Minimum " +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3259 +msgid "Minimum perimeter width" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3261 +msgid "" +"Width of the perimeter that will replace thin features (according to the " +"Minimum feature size) of the model. If the Minimum perimeter width is " +"thinner than the thickness of the feature, the perimeter will become as " +"thick as the feature itself. If expressed as a percentage (for example 85%), " +"it will be computed based on the nozzle diameter." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3327 +msgid "Pinhead front diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3329 +msgid "Diameter of the pointing side of the head" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3336 +msgid "Head penetration" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3338 +msgid "How much the pinhead has to penetrate the model surface" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3345 +msgid "Pinhead width" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3347 +msgid "Width from the back sphere center to the front sphere center" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3355 +msgid "Pillar diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3357 +msgid "Diameter in mm of the support pillars" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3365 +msgid "Small pillar diameter percent" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3367 +msgid "" +"The percentage of smaller pillars compared to the normal pillar diameter " +"which are used in problematic areas where a normal pilla cannot fit." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3376 +msgid "Max bridges on a pillar" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3378 +msgid "" +"Maximum number of bridges that can be placed on a pillar. Bridges hold " +"support point pinheads and connect to pillars as small branches." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3386 +msgid "Max weight on model" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3389 +msgid "" +"Maximum weight of sub-trees that terminate on the model instead of the print " +"bed. The weight is the sum of the lenghts of all branches emanating from the " +"endpoint." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3397 +msgid "Pillar connection mode" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3398 +msgid "" +"Controls the bridge type between two neighboring pillars. Can be zig-zag, " +"cross (double zig-zag) or dynamic which will automatically switch between " +"the first two depending on the distance of the two pillars." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Zig-Zag" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Cross" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Dynamic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3416 +msgid "Pillar widening factor" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3420 +msgid "" +"Merging bridges or pillars into another pillars can increase the radius. " +"Zero means no increase, one means full increase. The exact amount of " +"increase is unspecified and can change in the future." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3431 +msgid "Support base diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3433 +msgid "Diameter in mm of the pillar base" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3441 +msgid "Support base height" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3443 +msgid "The height of the pillar base cone" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3450 +msgid "Support base safety distance" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3453 +msgid "" +"The minimum distance of the pillar base from the model in mm. Makes sense in " +"zero elevation mode where a gap according to this parameter is inserted " +"between the model and the pad." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3463 +msgid "Critical angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3465 +msgid "The default angle for connecting support sticks and junctions." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3473 +msgid "Max bridge length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3153 -msgid "" -"The number of perimeters, counted from the center, over which the variation " -"needs to be spread. Lower values mean that the outer perimeters don't change " -"in width." +#: src/libslic3r/PrintConfig.cpp:3475 +msgid "The max length of a bridge" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3160 -msgid "Minimum feature size" +#: src/libslic3r/PrintConfig.cpp:3487 +msgid "Max pillar linking distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3162 +#: src/libslic3r/PrintConfig.cpp:3489 msgid "" -"Minimum thickness of thin features. Model features that are thinner than " -"this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width. If expressed as " -"a percentage (for example 25%), it will be computed based on the nozzle " -"diameter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3172 -msgid "Minimum perimeter width" +"The max distance of two pillars to get linked with each other. A zero value " +"will prohibit pillar cascading." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3174 +#: src/libslic3r/PrintConfig.cpp:3499 msgid "" -"Width of the perimeter that will replace thin features (according to the " -"Minimum feature size) of the model. If the Minimum perimeter width is " -"thinner than the thickness of the feature, the perimeter will become as " -"thick as the feature itself. If expressed as a percentage (for example 85%), " -"it will be computed based on the nozzle diameter." +"How much the supports should lift up the supported object. If \"Pad around " +"object\" is enabled, this value is ignored." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3242 +#: src/libslic3r/PrintConfig.cpp:3515 msgid "Display width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3516 msgid "Width of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3248 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "Display height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3522 msgid "Height of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3254 +#: src/libslic3r/PrintConfig.cpp:3527 msgid "Number of pixels in" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3256 +#: src/libslic3r/PrintConfig.cpp:3529 msgid "Number of pixels in X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3535 msgid "Number of pixels in Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3267 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Display horizontal mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3268 +#: src/libslic3r/PrintConfig.cpp:3541 msgid "Mirror horizontally" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3542 msgid "Enable horizontal mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3274 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Display vertical mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3275 +#: src/libslic3r/PrintConfig.cpp:3548 msgid "Mirror vertically" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "Enable vertical mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3281 +#: src/libslic3r/PrintConfig.cpp:3554 msgid "Display orientation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3282 +#: src/libslic3r/PrintConfig.cpp:3555 msgid "" "Set the actual LCD display orientation inside the SLA printer. Portrait mode " "will flip the meaning of display width and height parameters and the output " "images will be rotated by 90 degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3288 +#: src/libslic3r/PrintConfig.cpp:3559 msgid "Landscape" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3289 +#: src/libslic3r/PrintConfig.cpp:3560 msgid "Portrait" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3294 src/libslic3r/PrintConfig.cpp:3929 +#: src/libslic3r/PrintConfig.cpp:3566 src/libslic3r/PrintConfig.cpp:4058 msgid "Fast" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3295 +#: src/libslic3r/PrintConfig.cpp:3567 msgid "Fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3296 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Time of the fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3303 src/libslic3r/PrintConfig.cpp:3928 +#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:4057 msgid "Slow" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3304 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3305 +#: src/libslic3r/PrintConfig.cpp:3577 msgid "Time of the slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3312 src/libslic3r/PrintConfig.cpp:3930 +#: src/libslic3r/PrintConfig.cpp:3584 src/libslic3r/PrintConfig.cpp:4059 msgid "High viscosity" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3313 +#: src/libslic3r/PrintConfig.cpp:3585 msgid "Tilt for high viscosity resin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3314 +#: src/libslic3r/PrintConfig.cpp:3586 msgid "Time of the super slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3321 +#: src/libslic3r/PrintConfig.cpp:3593 msgid "Area fill" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3322 +#: src/libslic3r/PrintConfig.cpp:3594 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" "then a slow tilt will be used, otherwise - a fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 -#: src/libslic3r/PrintConfig.cpp:3331 +#: src/libslic3r/PrintConfig.cpp:3601 src/libslic3r/PrintConfig.cpp:3602 +#: src/libslic3r/PrintConfig.cpp:3603 msgid "Printer scaling correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3337 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3609 src/libslic3r/PrintConfig.cpp:3611 msgid "Printer scaling correction in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3338 +#: src/libslic3r/PrintConfig.cpp:3610 msgid "Printer scaling X axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3345 src/libslic3r/PrintConfig.cpp:3347 +#: src/libslic3r/PrintConfig.cpp:3617 src/libslic3r/PrintConfig.cpp:3619 msgid "Printer scaling correction in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3346 +#: src/libslic3r/PrintConfig.cpp:3618 msgid "Printer scaling Y axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3353 src/libslic3r/PrintConfig.cpp:3355 +#: src/libslic3r/PrintConfig.cpp:3625 src/libslic3r/PrintConfig.cpp:3627 msgid "Printer scaling correction in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3354 +#: src/libslic3r/PrintConfig.cpp:3626 msgid "Printer scaling Z axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3361 src/libslic3r/PrintConfig.cpp:3362 +#: src/libslic3r/PrintConfig.cpp:3633 src/libslic3r/PrintConfig.cpp:3634 msgid "Printer absolute correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3363 +#: src/libslic3r/PrintConfig.cpp:3635 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3369 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Elephant foot minimum width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3371 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3378 src/libslic3r/PrintConfig.cpp:3379 +#: src/libslic3r/PrintConfig.cpp:3650 src/libslic3r/PrintConfig.cpp:3651 msgid "Printer gamma correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3380 +#: src/libslic3r/PrintConfig.cpp:3652 msgid "" "This will apply a gamma correction to the rasterized 2D polygons. A gamma " "value of zero means thresholding with the threshold in the middle. This " "behaviour eliminates antialiasing without losing holes in polygons." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3399 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3671 src/libslic3r/PrintConfig.cpp:3672 msgid "SLA material type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3411 src/libslic3r/PrintConfig.cpp:3412 +#: src/libslic3r/PrintConfig.cpp:3679 src/libslic3r/PrintConfig.cpp:3680 msgid "Initial layer height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3418 src/libslic3r/PrintConfig.cpp:3419 +#: src/libslic3r/PrintConfig.cpp:3686 +msgid "Idle temperature" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3687 +msgid "" +"Nozzle temperature when the tool is currently not used in multi-tool setups." +"This is only used when 'Ooze prevention' is active in Print Settings." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3695 src/libslic3r/PrintConfig.cpp:3696 msgid "Bottle volume" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3420 +#: src/libslic3r/PrintConfig.cpp:3697 msgid "ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3425 src/libslic3r/PrintConfig.cpp:3426 +#: src/libslic3r/PrintConfig.cpp:3702 src/libslic3r/PrintConfig.cpp:3703 msgid "Bottle weight" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3427 +#: src/libslic3r/PrintConfig.cpp:3704 msgid "kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "g/ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3718 msgid "money/bottle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3446 +#: src/libslic3r/PrintConfig.cpp:3723 msgid "Faded layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3724 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3454 src/libslic3r/PrintConfig.cpp:3455 +#: src/libslic3r/PrintConfig.cpp:3731 src/libslic3r/PrintConfig.cpp:3732 msgid "Minimum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3462 src/libslic3r/PrintConfig.cpp:3463 +#: src/libslic3r/PrintConfig.cpp:3739 src/libslic3r/PrintConfig.cpp:3740 msgid "Maximum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3470 src/libslic3r/PrintConfig.cpp:3471 +#: src/libslic3r/PrintConfig.cpp:3747 src/libslic3r/PrintConfig.cpp:3748 msgid "Exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3477 src/libslic3r/PrintConfig.cpp:3478 +#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3755 msgid "Minimum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3485 src/libslic3r/PrintConfig.cpp:3486 +#: src/libslic3r/PrintConfig.cpp:3762 src/libslic3r/PrintConfig.cpp:3763 msgid "Maximum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3493 src/libslic3r/PrintConfig.cpp:3494 +#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3771 msgid "Initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3500 src/libslic3r/PrintConfig.cpp:3501 +#: src/libslic3r/PrintConfig.cpp:3777 src/libslic3r/PrintConfig.cpp:3778 msgid "Correction for expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3507 src/libslic3r/PrintConfig.cpp:3508 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3785 msgid "Correction for expansion in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3514 src/libslic3r/PrintConfig.cpp:3515 +#: src/libslic3r/PrintConfig.cpp:3791 src/libslic3r/PrintConfig.cpp:3792 msgid "Correction for expansion in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3521 src/libslic3r/PrintConfig.cpp:3522 +#: src/libslic3r/PrintConfig.cpp:3798 src/libslic3r/PrintConfig.cpp:3799 msgid "Correction for expansion in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3528 +#: src/libslic3r/PrintConfig.cpp:3805 msgid "SLA print material notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3529 +#: src/libslic3r/PrintConfig.cpp:3806 msgid "You can put your notes regarding the SLA print material here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3552 +#: src/libslic3r/PrintConfig.cpp:3818 src/libslic3r/PrintConfig.cpp:3829 msgid "Default SLA material profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3563 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "Generate supports" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3842 msgid "Generate supports for the models" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3570 -msgid "Pinhead front diameter" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3572 -msgid "Diameter of the pointing side of the head" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3579 -msgid "Head penetration" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3581 -msgid "How much the pinhead has to penetrate the model surface" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3588 -msgid "Pinhead width" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3590 -msgid "Width from the back sphere center to the front sphere center" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3598 -msgid "Pillar diameter" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3600 -msgid "Diameter in mm of the support pillars" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3608 -msgid "Small pillar diameter percent" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3610 -msgid "" -"The percentage of smaller pillars compared to the normal pillar diameter " -"which are used in problematic areas where a normal pilla cannot fit." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3619 -msgid "Max bridges on a pillar" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3621 -msgid "" -"Maximum number of bridges that can be placed on a pillar. Bridges hold " -"support point pinheads and connect to pillars as small branches." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3629 -msgid "Pillar connection mode" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3630 -msgid "" -"Controls the bridge type between two neighboring pillars. Can be zig-zag, " -"cross (double zig-zag) or dynamic which will automatically switch between " -"the first two depending on the distance of the two pillars." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3638 -msgid "Zig-Zag" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3639 -msgid "Cross" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3640 -msgid "Dynamic" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3652 -msgid "Pillar widening factor" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3654 -msgid "" -"Merging bridges or pillars into another pillars can increase the radius. " -"Zero means no increase, one means full increase." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3663 -msgid "Support base diameter" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3665 -msgid "Diameter in mm of the pillar base" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3673 -msgid "Support base height" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3675 -msgid "The height of the pillar base cone" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3682 -msgid "Support base safety distance" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3685 -msgid "" -"The minimum distance of the pillar base from the model in mm. Makes sense in " -"zero elevation mode where a gap according to this parameter is inserted " -"between the model and the pad." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3695 -msgid "Critical angle" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3697 -msgid "The default angle for connecting support sticks and junctions." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3705 -msgid "Max bridge length" +#: src/libslic3r/PrintConfig.cpp:3847 +msgid "Support tree type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3707 -msgid "The max length of a bridge" +#: src/libslic3r/PrintConfig.cpp:3848 +msgid "Support tree building strategy" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3714 -msgid "Max pillar linking distance" +#: src/libslic3r/PrintConfig.cpp:3851 +msgid "Branching (experimental)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3716 -msgid "" -"The max distance of two pillars to get linked with each other. A zero value " -"will prohibit pillar cascading." +#: src/libslic3r/PrintConfig.cpp:3860 +msgid "Support only in enforced regions" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3726 -msgid "" -"How much the supports should lift up the supported object. If \"Pad around " -"object\" is enabled, this value is ignored." +#: src/libslic3r/PrintConfig.cpp:3862 +msgid "Only create support if it lies in a support enforcer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3737 +#: src/libslic3r/PrintConfig.cpp:3869 msgid "This is a relative measure of support points density." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3743 +#: src/libslic3r/PrintConfig.cpp:3875 msgid "Minimal distance of the support points" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3745 +#: src/libslic3r/PrintConfig.cpp:3877 msgid "No support points will be placed closer than this threshold." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3751 +#: src/libslic3r/PrintConfig.cpp:3883 msgid "Use pad" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3885 msgid "Add a pad underneath the supported model" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3758 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "Pad wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3760 +#: src/libslic3r/PrintConfig.cpp:3892 msgid "The thickness of the pad and its optional cavity walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3768 +#: src/libslic3r/PrintConfig.cpp:3900 msgid "Pad wall height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3769 +#: src/libslic3r/PrintConfig.cpp:3901 msgid "" "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " "when enabling this feature, as some resins may produce an extreme suction " @@ -13646,19 +15638,19 @@ msgid "" "difficult." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3782 +#: src/libslic3r/PrintConfig.cpp:3914 msgid "Pad brim size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3783 +#: src/libslic3r/PrintConfig.cpp:3915 msgid "How far should the pad extend around the contained geometry" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3793 +#: src/libslic3r/PrintConfig.cpp:3925 msgid "Max merge distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3927 msgid "" "Some objects can get along with a few smaller pads instead of a single big " "one. This parameter defines how far the center of two smaller pads should " @@ -13668,92 +15660,92 @@ msgstr "" "one. This parameter defines how far the center of two smaller pads should " "be. If they are closer, they will get merged into one pad." -#: src/libslic3r/PrintConfig.cpp:3815 +#: src/libslic3r/PrintConfig.cpp:3947 msgid "Pad wall slope" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3817 +#: src/libslic3r/PrintConfig.cpp:3949 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3960 msgid "Create pad around object and ignore the support elevation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3833 +#: src/libslic3r/PrintConfig.cpp:3965 msgid "Pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3967 msgid "Force pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3840 +#: src/libslic3r/PrintConfig.cpp:3972 msgid "Pad object gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3842 +#: src/libslic3r/PrintConfig.cpp:3974 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3851 +#: src/libslic3r/PrintConfig.cpp:3983 msgid "Pad object connector stride" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3853 +#: src/libslic3r/PrintConfig.cpp:3985 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3860 +#: src/libslic3r/PrintConfig.cpp:3992 msgid "Pad object connector width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3862 +#: src/libslic3r/PrintConfig.cpp:3994 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3869 +#: src/libslic3r/PrintConfig.cpp:4001 msgid "Pad object connector penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3872 +#: src/libslic3r/PrintConfig.cpp:4004 msgid "How much should the tiny connectors penetrate into the model body." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3879 +#: src/libslic3r/PrintConfig.cpp:4011 msgid "Enable hollowing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:4013 msgid "Hollow out a model to have an empty interior" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3886 +#: src/libslic3r/PrintConfig.cpp:4018 msgid "Wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3888 +#: src/libslic3r/PrintConfig.cpp:4020 msgid "Minimum wall thickness of a hollowed model." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3896 +#: src/libslic3r/PrintConfig.cpp:4028 msgid "Accuracy" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3898 +#: src/libslic3r/PrintConfig.cpp:4030 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:4040 msgid "" "Hollowing is done in two steps: first, an imaginary interior is calculated " "deeper (offset plus the closing distance) in the object and then it's " @@ -13762,236 +15754,276 @@ msgid "" "most." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3920 +#: src/libslic3r/PrintConfig.cpp:4052 msgid "Print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3922 +#: src/libslic3r/PrintConfig.cpp:4054 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " "movement and adds a delay before exposure." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4390 +#: src/libslic3r/PrintConfig.cpp:4065 +msgid "Format of the output SLA archive" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4070 +msgid "SLA output precision" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4071 +msgid "Minimum resolution in nanometers" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4542 msgid "Export OBJ" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4391 +#: src/libslic3r/PrintConfig.cpp:4543 msgid "Export the model(s) as OBJ." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4554 msgid "Export SLA" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4403 +#: src/libslic3r/PrintConfig.cpp:4555 msgid "Slice the model and export SLA printing layers as PNG." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4408 +#: src/libslic3r/PrintConfig.cpp:4560 msgid "Export 3MF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4409 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Export the model(s) as 3MF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4413 +#: src/libslic3r/PrintConfig.cpp:4565 msgid "Export AMF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4414 +#: src/libslic3r/PrintConfig.cpp:4566 msgid "Export the model(s) as AMF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4418 +#: src/libslic3r/PrintConfig.cpp:4570 msgid "Export STL" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4419 +#: src/libslic3r/PrintConfig.cpp:4571 msgid "Export the model(s) as STL." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4424 +#: src/libslic3r/PrintConfig.cpp:4576 msgid "Slice the model and export toolpaths as G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4581 msgid "G-code viewer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4430 +#: src/libslic3r/PrintConfig.cpp:4582 msgid "Visualize an already sliced and saved G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4588 +msgid "OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4589 +msgid "Select the specified OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4594 +msgid "OpenGL debug output" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4595 +msgid "Activate OpenGL debug output on graphic cards which support it" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4601 msgid "Slice" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4436 +#: src/libslic3r/PrintConfig.cpp:4602 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4607 msgid "Help" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4442 +#: src/libslic3r/PrintConfig.cpp:4608 msgid "Show this help." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4447 +#: src/libslic3r/PrintConfig.cpp:4613 msgid "Help (FFF options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4448 +#: src/libslic3r/PrintConfig.cpp:4614 msgid "Show the full list of print/G-code configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4452 +#: src/libslic3r/PrintConfig.cpp:4618 msgid "Help (SLA options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4453 +#: src/libslic3r/PrintConfig.cpp:4619 msgid "Show the full list of SLA print configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4457 +#: src/libslic3r/PrintConfig.cpp:4623 msgid "Output Model Info" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4458 +#: src/libslic3r/PrintConfig.cpp:4624 msgid "Write information about the model to the console." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4462 +#: src/libslic3r/PrintConfig.cpp:4628 msgid "Save config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4463 +#: src/libslic3r/PrintConfig.cpp:4629 msgid "Save configuration to the specified file." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4473 +#: src/libslic3r/PrintConfig.cpp:4639 msgid "Align XY" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4474 +#: src/libslic3r/PrintConfig.cpp:4640 msgid "Align the model to the given point." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4479 +#: src/libslic3r/PrintConfig.cpp:4645 msgid "Cut model at the given Z." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4501 +#: src/libslic3r/PrintConfig.cpp:4666 +msgid "Center" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4667 msgid "Center the print around the given center." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4505 +#: src/libslic3r/PrintConfig.cpp:4671 msgid "Don't arrange" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4506 +#: src/libslic3r/PrintConfig.cpp:4672 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4509 +#: src/libslic3r/PrintConfig.cpp:4675 msgid "Ensure on bed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4510 +#: src/libslic3r/PrintConfig.cpp:4676 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4514 +#: src/libslic3r/PrintConfig.cpp:4680 msgid "Duplicate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4515 +#: src/libslic3r/PrintConfig.cpp:4681 msgid "Multiply copies by this factor." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4519 +#: src/libslic3r/PrintConfig.cpp:4685 msgid "Duplicate by grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4520 +#: src/libslic3r/PrintConfig.cpp:4686 msgid "Multiply copies by creating a grid." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4524 +#: src/libslic3r/PrintConfig.cpp:4690 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4529 +#: src/libslic3r/PrintConfig.cpp:4695 msgid "" "Try to repair any non-manifold meshes (this option is implicitly added " "whenever we need to slice the model to perform the requested action)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4533 +#: src/libslic3r/PrintConfig.cpp:4699 msgid "Rotation angle around the Z axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4537 +#: src/libslic3r/PrintConfig.cpp:4703 msgid "Rotate around X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4538 +#: src/libslic3r/PrintConfig.cpp:4704 msgid "Rotation angle around the X axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4542 +#: src/libslic3r/PrintConfig.cpp:4708 msgid "Rotate around Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4543 +#: src/libslic3r/PrintConfig.cpp:4709 msgid "Rotation angle around the Y axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4548 +#: src/libslic3r/PrintConfig.cpp:4714 msgid "Scaling factor or percentage." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4553 +#: src/libslic3r/PrintConfig.cpp:4719 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4556 +#: src/libslic3r/PrintConfig.cpp:4722 msgid "Scale to Fit" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4557 +#: src/libslic3r/PrintConfig.cpp:4723 msgid "Scale to fit the given volume." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4566 +#: src/libslic3r/PrintConfig.cpp:4727 +msgid "Delete files after loading" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4728 +msgid "Delete files after loading." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4736 msgid "Ignore non-existent config files" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4567 +#: src/libslic3r/PrintConfig.cpp:4737 msgid "Do not fail if a file supplied to --load does not exist." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4570 +#: src/libslic3r/PrintConfig.cpp:4740 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4741 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -13999,80 +16031,80 @@ msgid "" "substitute an unknown value with a default silently or verbosely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4745 msgid "Bail out on unknown configuration values" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4579 +#: src/libslic3r/PrintConfig.cpp:4746 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4580 +#: src/libslic3r/PrintConfig.cpp:4747 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4584 +#: src/libslic3r/PrintConfig.cpp:4752 msgid "Load config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4585 +#: src/libslic3r/PrintConfig.cpp:4753 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4588 +#: src/libslic3r/PrintConfig.cpp:4756 msgid "Output File" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4589 +#: src/libslic3r/PrintConfig.cpp:4757 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4593 +#: src/libslic3r/PrintConfig.cpp:4761 msgid "Single instance mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4594 +#: src/libslic3r/PrintConfig.cpp:4762 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " "the \"single_instance\" configuration value from application preferences." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4605 +#: src/libslic3r/PrintConfig.cpp:4767 msgid "Data directory" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4606 +#: src/libslic3r/PrintConfig.cpp:4768 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " "storage." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4771 msgid "Logging level" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4772 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" "For example. loglevel=2 logs fatal, error and warning level messages." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4616 +#: src/libslic3r/PrintConfig.cpp:4778 msgid "Render with a software renderer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4617 +#: src/libslic3r/PrintConfig.cpp:4779 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -14082,18 +16114,30 @@ msgstr "" msgid "Error with zip archive" msgstr "" -#: src/libslic3r/PrintObject.cpp:126 +#: src/libslic3r/PrintObject.cpp:152 msgid "Generating perimeters" msgstr "" -#: src/libslic3r/PrintObject.cpp:229 +#: src/libslic3r/PrintObject.cpp:257 msgid "Preparing infill" msgstr "" -#: src/libslic3r/PrintObject.cpp:403 +#: src/libslic3r/PrintObject.cpp:402 +msgid "making infill" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:449 +msgid "Searching support spots" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:474 msgid "Generating support material" msgstr "" +#: src/libslic3r/PrintObject.cpp:495 +msgid "Estimating curled extrusions" +msgstr "" + #: resources/data/hints.ini: [hint:Fuzzy skin] msgid "" "Fuzzy skin\n" @@ -14364,6 +16408,36 @@ msgid "" "F11 hotkey." msgstr "" +#: resources/data/hints.ini: [hint:Printables integration] +msgid "" +"Printables.com integration\n" +"Did you know that when you are browsing Printables.com, you can send 3D " +"model files to PrusaSlicer with a single click? Learn more in the " +"documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Cut tool] +msgid "" +"Cut tool\n" +"Did you know that you can cut a model at any angle and even create aligning " +"pins with the updated Cut tool? Learn more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Measurement tool] +msgid "" +"Measurement tool\n" +"Did you know that you can measure the distances between points, edges " +"and planes, the radius of a hole or the angle between edges or planes? Learn " +"more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Text tool] +msgid "" +"Text tool\n" +"Did you know that you can add custom text labels to your models or even use " +"the text as a modifier? Learn more in the documentation." +msgstr "" + #: ../src/common/debugrpt.cpp:586 msgid "" "\n" @@ -15516,6 +17590,10 @@ msgstr "" msgid "Align Right" msgstr "" +#: ../src/richtext/richtextsizepage.cpp:266 +msgid "Alignment" +msgstr "" + #: ../src/generic/filectrlg.cpp:1197 ../src/common/fldlgcmn.cpp:107 #, c-format msgid "All files (%s)|%s" @@ -16803,10 +18881,6 @@ msgstr "" msgid "Default encoding" msgstr "" -#: ../src/dfb/fontmgr.cpp:180 -msgid "Default font" -msgstr "" - #: ../src/generic/prntdlgg.cpp:510 msgid "Default printer" msgstr "" @@ -17162,11 +19236,6 @@ msgstr "" msgid "Error: " msgstr "" -#. TRANSLATORS: Name of keyboard key -#: ../src/common/accelcmn.cpp:69 -msgid "Esc" -msgstr "" - #. TRANSLATORS: Name of keyboard key #: ../src/common/accelcmn.cpp:70 msgid "Escape" @@ -17907,11 +19976,6 @@ msgstr "" msgid "Folio, 8 1/2 x 13 in" msgstr "" -#: ../src/richtext/richtextformatdlg.cpp:344 ../src/osx/carbon/fontdlg.cpp:287 -#: ../src/common/stockitem.cpp:194 -msgid "Font" -msgstr "" - #: ../src/richtext/richtextfontpage.cpp:221 msgid "Font &weight:" msgstr "" @@ -19010,10 +21074,6 @@ msgstr "" msgid "Menu" msgstr "" -#: ../src/common/msgout.cpp:124 -msgid "Message" -msgstr "" - #: ../src/univ/themes/metal.cpp:168 msgid "Metal theme" msgstr "" @@ -19047,10 +21107,6 @@ msgstr "" msgid "Modern" msgstr "" -#: ../src/generic/filectrlg.cpp:427 -msgid "Modified" -msgstr "" - #: ../src/common/module.cpp:133 #, c-format msgid "Module \"%s\" initialization failed" @@ -19140,11 +21196,6 @@ msgstr "" msgid "Next page" msgstr "" -#: ../include/wx/msgdlg.h:277 ../src/common/stockitem.cpp:177 -#: ../src/motif/msgdlg.cpp:196 -msgid "No" -msgstr "" - #. TRANSLATORS: System cursor name #: ../src/propgrid/advprops.cpp:1764 msgid "No Entry" @@ -19374,12 +21425,6 @@ msgstr "" msgid "Numbered outline" msgstr "" -#: ../include/wx/msgdlg.h:278 ../src/richtext/richtextstyledlg.cpp:297 -#: ../src/common/stockitem.cpp:178 ../src/msw/msgdlg.cpp:454 -#: ../src/msw/msgdlg.cpp:747 ../src/gtk1/fontdlg.cpp:138 -msgid "OK" -msgstr "" - #: ../src/msw/ole/automtn.cpp:692 #, c-format msgid "OLE Automation error in %s: %s" @@ -19450,6 +21495,10 @@ msgstr "" msgid "Option '%s': '%s' cannot be converted to a date." msgstr "" +#: ../src/generic/prntdlgg.cpp:618 +msgid "Options" +msgstr "" + #: ../src/propgrid/advprops.cpp:1606 msgid "Orange" msgstr "" @@ -20225,10 +22274,6 @@ msgstr "" msgid "Select underlining or no underlining." msgstr "" -#: ../src/motif/filedlg.cpp:220 -msgid "Selection" -msgstr "" - #: ../src/richtext/richtextliststylepage.cpp:187 #: ../src/richtext/richtextliststylepage.cpp:189 msgid "Selects the list level to edit." @@ -21090,10 +23135,6 @@ msgstr "" msgid "Turkish (ISO-8859-9)" msgstr "" -#: ../src/generic/filectrlg.cpp:426 -msgid "Type" -msgstr "" - #: ../src/richtext/richtextfontpage.cpp:151 #: ../src/richtext/richtextfontpage.cpp:153 msgid "Type a font name." @@ -21576,10 +23617,6 @@ msgstr "" msgid "Validation conflict" msgstr "" -#: ../src/propgrid/manager.cpp:238 -msgid "Value" -msgstr "" - #: ../src/propgrid/props.cpp:386 ../src/propgrid/props.cpp:500 #, c-format msgid "Value must be %s or higher." @@ -21809,11 +23846,6 @@ msgstr "" msgid "Yellow" msgstr "" -#: ../include/wx/msgdlg.h:276 ../src/common/stockitem.cpp:206 -#: ../src/motif/msgdlg.cpp:196 -msgid "Yes" -msgstr "" - #: ../src/osx/carbon/overlay.cpp:155 msgid "You cannot Clear an overlay that is not inited" msgstr "" diff --git a/resources/localization/hu/PrusaSlicer.mo b/resources/localization/hu/PrusaSlicer.mo index 6fde396bda4d80c40ade4924e7132d1965e0abcc..7394db5bfd947edd2c0d387b7e0ceb28bb4799b8 100644 GIT binary patch delta 81435 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 delta 89519 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 G?SBCZM|>0j diff --git a/resources/localization/hu/PrusaSlicer_hu.po b/resources/localization/hu/PrusaSlicer_hu.po index e141ab907dc..9f058838569 100644 --- a/resources/localization/hu/PrusaSlicer_hu.po +++ b/resources/localization/hu/PrusaSlicer_hu.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-01 16:30+0100\n" +"POT-Creation-Date: 2023-03-03 14:25+0100\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -18,16 +18,16 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 +#: src/slic3r/GUI/AboutDialog.cpp:46 src/slic3r/GUI/AboutDialog.cpp:306 msgid "Portions copyright" msgstr "Az összetevők szerzői joga" -#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 +#: src/slic3r/GUI/AboutDialog.cpp:143 src/slic3r/GUI/AboutDialog.cpp:270 msgid "Copyright" msgstr "Szerzői jog" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:143 +#: src/slic3r/GUI/AboutDialog.cpp:145 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -35,33 +35,33 @@ msgstr "" "A következő programok (könyvtárak) licencszerződései az alkalmazás " "licencszerződésének részét képezik" -#: src/slic3r/GUI/AboutDialog.cpp:212 +#: src/slic3r/GUI/AboutDialog.cpp:214 #, c-format, boost-format msgid "About %s" msgstr "Szerző: %s" -#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 -#: src/slic3r/GUI/GUI_App.cpp:262 +#: src/slic3r/GUI/AboutDialog.cpp:245 src/slic3r/GUI/AboutDialog.cpp:370 +#: src/slic3r/GUI/GUI_App.cpp:271 msgid "Version" msgstr "Verzió" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:277 msgid "is licensed under the" msgstr "engedélyezve van a következő szerint" -#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:273 src/slic3r/GUI/GUI_App.cpp:277 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero General Public License, 3-as verzió" -#: src/slic3r/GUI/AboutDialog.cpp:273 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." msgstr "" "A PrusaSlicer alapja Alessandro Ranellucci és a RepRap közösség Slic3r-je." -#: src/slic3r/GUI/AboutDialog.cpp:274 +#: src/slic3r/GUI/AboutDialog.cpp:275 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -71,7 +71,7 @@ msgstr "" "Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik és még sokan mások " "közreműködésével." -#: src/slic3r/GUI/AboutDialog.cpp:310 +#: src/slic3r/GUI/AboutDialog.cpp:311 msgid "Copy Version Info" msgstr "Verzióinformáció Másolása" @@ -100,54 +100,54 @@ msgstr "" "jelentené a problémát." #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:162 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:204 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:188 msgid "Slicing complete" msgstr "Szeletelés elkészült" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:199 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183 #, boost-format msgid "Masked SLA file exported to %1%" msgstr "Maszkolt SLA fájl exportálva az alábbi helyre: %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:286 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:279 msgid "Access violation" msgstr "Hozzáférés megsértése" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:288 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:281 msgid "Illegal instruction" msgstr "Illegális utasítás" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:283 msgid "Divide by zero" msgstr "Nullával osztás" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:292 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:285 msgid "Overflow" msgstr "Túlcsordulás" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:294 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:287 msgid "Underflow" msgstr "Alulcsordulás" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:297 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 msgid "Floating reserved operand" msgstr "Lebegő lefoglalt operandus_" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:300 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:293 msgid "Stack overflow" msgstr "Verem túlcsordulás" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:659 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:726 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:652 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:719 msgid "Running post-processing scripts" msgstr "Utófeldolgozó szkriptek futtatása" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:690 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:710 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:683 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:703 msgid "Unknown error occured during exporting G-code." msgstr "Ismeretlen hiba történt a G-kód exportálása közben." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:695 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:688 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. Maybe the SD " @@ -158,7 +158,7 @@ msgstr "" "SD kártya írásvédett?\n" "Hibaüzenet: %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:698 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:691 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. There might be " @@ -169,7 +169,7 @@ msgstr "" "a céleszközzel. Kérjük, próbálkozzon újra az exportálással, vagy használjon " "másik eszközt. A sérült kimeneti G-kód %1%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:701 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:694 #, boost-format msgid "" "Renaming of the G-code after copying to the selected destination folder has " @@ -178,7 +178,7 @@ msgstr "" "A G-kód átnevezése a kiválasztott célmappába másolás után nem sikerült. A " "jelenlegi elérési út %1%.tmp. Kérjük, próbálja meg újra az exportálást." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:704 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:697 #, boost-format msgid "" "Copying of the temporary G-code has finished but the original code at %1% " @@ -187,7 +187,7 @@ msgstr "" "Az ideiglenes G-kód másolása befejeződött, de az eredeti, %1% kódot nem " "lehetett megnyitni a másolásellenőrzés során. A kimeneti G-kód %2%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:707 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:700 #, boost-format msgid "" "Copying of the temporary G-code has finished but the exported code couldn't " @@ -196,16 +196,16 @@ msgstr "" "Az ideiglenes G-kód másolása befejeződött, de az exportált kódot nem " "lehetett megnyitni a másolásellenőrzés során. A kimeneti G-kód %1%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:715 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:708 #, boost-format msgid "G-code file exported to %1%" msgstr "G-kód fájl exportálva ide: %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:729 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:722 msgid "Copying of the temporary G-code to the output G-code failed" msgstr "Az ideiglenes G-kód másolása a kimeneti G-kódba nem sikerült" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:751 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:738 #, boost-format msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" @@ -213,8 +213,9 @@ msgstr "" "várakozási sor" #: src/slic3r/GUI/BedShapeDialog.cpp:31 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2765 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1576 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:241 src/slic3r/GUI/Plater.cpp:220 +#: src/slic3r/GUI/Tab.cpp:2697 msgid "Size" msgstr "Méret" @@ -222,7 +223,9 @@ msgstr "Méret" msgid "Origin" msgstr "Origó" -#: src/slic3r/GUI/BedShapeDialog.cpp:33 src/libslic3r/PrintConfig.cpp:1020 +#: src/slic3r/GUI/BedShapeDialog.cpp:33 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1994 +#: src/libslic3r/PrintConfig.cpp:1109 msgid "Diameter" msgstr "Átmérő" @@ -236,54 +239,62 @@ msgid "" "rectangle." msgstr "A 0,0 G-kód koordináta távolsága a téglalap bal elülső sarkától." -#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:262 -#: src/slic3r/GUI/ConfigWizard.cpp:1476 src/slic3r/GUI/ConfigWizard.cpp:1490 +#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:291 +#: src/slic3r/GUI/ConfigWizard.cpp:1796 src/slic3r/GUI/ConfigWizard.cpp:1832 +#: src/slic3r/GUI/ConfigWizard.cpp:1846 #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:100 -#: src/slic3r/GUI/GCodeViewer.cpp:3181 src/slic3r/GUI/GCodeViewer.cpp:3187 -#: src/slic3r/GUI/GCodeViewer.cpp:3195 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 src/slic3r/GUI/GCodeViewer.cpp:3455 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 #: src/slic3r/GUI/GUI_ObjectLayers.cpp:145 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 src/libslic3r/PrintConfig.cpp:263 -#: src/libslic3r/PrintConfig.cpp:290 src/libslic3r/PrintConfig.cpp:297 -#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:520 -#: src/libslic3r/PrintConfig.cpp:546 src/libslic3r/PrintConfig.cpp:621 -#: src/libslic3r/PrintConfig.cpp:629 src/libslic3r/PrintConfig.cpp:679 -#: src/libslic3r/PrintConfig.cpp:813 src/libslic3r/PrintConfig.cpp:824 -#: src/libslic3r/PrintConfig.cpp:842 src/libslic3r/PrintConfig.cpp:1023 -#: src/libslic3r/PrintConfig.cpp:1235 src/libslic3r/PrintConfig.cpp:1302 -#: src/libslic3r/PrintConfig.cpp:1312 src/libslic3r/PrintConfig.cpp:1611 -#: src/libslic3r/PrintConfig.cpp:1805 src/libslic3r/PrintConfig.cpp:1866 -#: src/libslic3r/PrintConfig.cpp:1884 src/libslic3r/PrintConfig.cpp:1902 -#: src/libslic3r/PrintConfig.cpp:1965 src/libslic3r/PrintConfig.cpp:1975 -#: src/libslic3r/PrintConfig.cpp:2097 src/libslic3r/PrintConfig.cpp:2106 -#: src/libslic3r/PrintConfig.cpp:2125 src/libslic3r/PrintConfig.cpp:2146 -#: src/libslic3r/PrintConfig.cpp:2158 src/libslic3r/PrintConfig.cpp:2166 -#: src/libslic3r/PrintConfig.cpp:2207 src/libslic3r/PrintConfig.cpp:2215 -#: src/libslic3r/PrintConfig.cpp:2225 src/libslic3r/PrintConfig.cpp:2233 -#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2303 -#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2603 -#: src/libslic3r/PrintConfig.cpp:2620 src/libslic3r/PrintConfig.cpp:2721 -#: src/libslic3r/PrintConfig.cpp:2730 src/libslic3r/PrintConfig.cpp:2780 -#: src/libslic3r/PrintConfig.cpp:2932 src/libslic3r/PrintConfig.cpp:3020 -#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3034 -#: src/libslic3r/PrintConfig.cpp:3048 src/libslic3r/PrintConfig.cpp:3072 -#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3092 -#: src/libslic3r/PrintConfig.cpp:3372 src/libslic3r/PrintConfig.cpp:3413 -#: src/libslic3r/PrintConfig.cpp:3573 src/libslic3r/PrintConfig.cpp:3582 -#: src/libslic3r/PrintConfig.cpp:3591 src/libslic3r/PrintConfig.cpp:3601 -#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3676 -#: src/libslic3r/PrintConfig.cpp:3688 src/libslic3r/PrintConfig.cpp:3708 -#: src/libslic3r/PrintConfig.cpp:3718 src/libslic3r/PrintConfig.cpp:3728 -#: src/libslic3r/PrintConfig.cpp:3746 src/libslic3r/PrintConfig.cpp:3761 -#: src/libslic3r/PrintConfig.cpp:3775 src/libslic3r/PrintConfig.cpp:3786 -#: src/libslic3r/PrintConfig.cpp:3799 src/libslic3r/PrintConfig.cpp:3844 -#: src/libslic3r/PrintConfig.cpp:3854 src/libslic3r/PrintConfig.cpp:3863 -#: src/libslic3r/PrintConfig.cpp:3873 src/libslic3r/PrintConfig.cpp:3889 -#: src/libslic3r/PrintConfig.cpp:3913 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 src/libslic3r/PrintConfig.cpp:279 +#: src/libslic3r/PrintConfig.cpp:303 src/libslic3r/PrintConfig.cpp:310 +#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:657 src/libslic3r/PrintConfig.cpp:724 +#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:782 +#: src/libslic3r/PrintConfig.cpp:902 src/libslic3r/PrintConfig.cpp:913 +#: src/libslic3r/PrintConfig.cpp:931 src/libslic3r/PrintConfig.cpp:1112 +#: src/libslic3r/PrintConfig.cpp:1295 src/libslic3r/PrintConfig.cpp:1359 +#: src/libslic3r/PrintConfig.cpp:1369 src/libslic3r/PrintConfig.cpp:1650 +#: src/libslic3r/PrintConfig.cpp:1842 src/libslic3r/PrintConfig.cpp:1903 +#: src/libslic3r/PrintConfig.cpp:1921 src/libslic3r/PrintConfig.cpp:1939 +#: src/libslic3r/PrintConfig.cpp:1995 src/libslic3r/PrintConfig.cpp:2005 +#: src/libslic3r/PrintConfig.cpp:2127 src/libslic3r/PrintConfig.cpp:2136 +#: src/libslic3r/PrintConfig.cpp:2155 src/libslic3r/PrintConfig.cpp:2176 +#: src/libslic3r/PrintConfig.cpp:2188 src/libslic3r/PrintConfig.cpp:2196 +#: src/libslic3r/PrintConfig.cpp:2237 src/libslic3r/PrintConfig.cpp:2245 +#: src/libslic3r/PrintConfig.cpp:2255 src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2271 src/libslic3r/PrintConfig.cpp:2336 +#: src/libslic3r/PrintConfig.cpp:2565 src/libslic3r/PrintConfig.cpp:2632 +#: src/libslic3r/PrintConfig.cpp:2647 src/libslic3r/PrintConfig.cpp:2746 +#: src/libslic3r/PrintConfig.cpp:2755 src/libslic3r/PrintConfig.cpp:2801 +#: src/libslic3r/PrintConfig.cpp:2886 src/libslic3r/PrintConfig.cpp:2896 +#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3108 +#: src/libslic3r/PrintConfig.cpp:3115 src/libslic3r/PrintConfig.cpp:3122 +#: src/libslic3r/PrintConfig.cpp:3136 src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3170 src/libslic3r/PrintConfig.cpp:3180 +#: src/libslic3r/PrintConfig.cpp:3330 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3391 src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3444 src/libslic3r/PrintConfig.cpp:3456 +#: src/libslic3r/PrintConfig.cpp:3476 src/libslic3r/PrintConfig.cpp:3491 +#: src/libslic3r/PrintConfig.cpp:3501 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3681 src/libslic3r/PrintConfig.cpp:3878 +#: src/libslic3r/PrintConfig.cpp:3893 src/libslic3r/PrintConfig.cpp:3907 +#: src/libslic3r/PrintConfig.cpp:3918 src/libslic3r/PrintConfig.cpp:3931 +#: src/libslic3r/PrintConfig.cpp:3976 src/libslic3r/PrintConfig.cpp:3986 +#: src/libslic3r/PrintConfig.cpp:3995 src/libslic3r/PrintConfig.cpp:4005 +#: src/libslic3r/PrintConfig.cpp:4021 src/libslic3r/PrintConfig.cpp:4045 +#: src/libslic3r/PrintConfig.cpp:4072 msgid "mm" msgstr "mm" @@ -303,13 +314,13 @@ msgstr "Négyzetes" msgid "Circular" msgstr "Körkörös" -#: src/slic3r/GUI/BedShapeDialog.cpp:81 src/slic3r/GUI/GUI_Preview.cpp:252 -#: src/libslic3r/ExtrusionEntity.cpp:343 src/libslic3r/ExtrusionEntity.cpp:378 +#: src/slic3r/GUI/BedShapeDialog.cpp:81 msgid "Custom" msgstr "Egyedi" #: src/slic3r/GUI/BedShapeDialog.cpp:104 src/slic3r/GUI/BedShapeDialog.cpp:179 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1701 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1565 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1798 msgid "Shape" msgstr "Alakzat" @@ -317,8 +328,8 @@ msgstr "Alakzat" msgid "Load shape from STL..." msgstr "Alakzat betöltése STL-ből..." -#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2147 +#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3914 +#: src/slic3r/GUI/MainFrame.cpp:2240 msgid "Settings" msgstr "Beállítások" @@ -331,7 +342,7 @@ msgid "Load..." msgstr "Betöltés..." #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/Tab.cpp:3973 msgid "Remove" msgstr "Eltávolítás" @@ -343,80 +354,123 @@ msgstr "Nem található:" msgid "Model" msgstr "Modell" -#: src/slic3r/GUI/BedShapeDialog.cpp:508 +#: src/slic3r/GUI/BedShapeDialog.cpp:506 msgid "Choose an STL file to import bed shape from:" msgstr "Válasszon egy STL-fájlt a tárgyasztal alakzatának importálásához:" -#: src/slic3r/GUI/BedShapeDialog.cpp:514 src/slic3r/GUI/BedShapeDialog.cpp:562 -#: src/slic3r/GUI/BedShapeDialog.cpp:584 +#: src/slic3r/GUI/BedShapeDialog.cpp:512 src/slic3r/GUI/BedShapeDialog.cpp:560 +#: src/slic3r/GUI/BedShapeDialog.cpp:582 msgid "Invalid file format." msgstr "Nem megfelelő formátum." -#: src/slic3r/GUI/BedShapeDialog.cpp:525 +#: src/slic3r/GUI/BedShapeDialog.cpp:523 msgid "Error! Invalid model" msgstr "Hiba! Nem megfelelő modell" -#: src/slic3r/GUI/BedShapeDialog.cpp:533 +#: src/slic3r/GUI/BedShapeDialog.cpp:531 msgid "The selected file contains no geometry." msgstr "A kiválasztott fájl nem tartalmaz geometriát." -#: src/slic3r/GUI/BedShapeDialog.cpp:537 +#: src/slic3r/GUI/BedShapeDialog.cpp:535 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "" "A kiválasztott fájl több szétválasztott területet tartalmaz. Ez nem " "támogatott." -#: src/slic3r/GUI/BedShapeDialog.cpp:552 +#: src/slic3r/GUI/BedShapeDialog.cpp:550 msgid "Choose a file to import bed texture from (PNG/SVG):" msgstr "" "Válasszon egy fájlt a tárgyasztal textúrájának importálásához (PNG/SVG):" -#: src/slic3r/GUI/BedShapeDialog.cpp:574 +#: src/slic3r/GUI/BedShapeDialog.cpp:572 msgid "Choose an STL file to import bed model from:" msgstr "Válasszon egy STL fájlt a tárgyasztal modelljének importálásához:" -#: src/slic3r/GUI/BedShapeDialog.hpp:95 src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/BedShapeDialog.hpp:96 src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape" msgstr "Tárgyasztal forma" -#: src/slic3r/GUI/BonjourDialog.cpp:55 +#: src/slic3r/GUI/BonjourDialog.cpp:58 msgid "Network lookup" msgstr "Hálózati keresés" -#: src/slic3r/GUI/BonjourDialog.cpp:72 +#: src/slic3r/GUI/BonjourDialog.cpp:75 src/slic3r/GUI/BonjourDialog.cpp:253 msgid "Address" msgstr "Cím" -#: src/slic3r/GUI/BonjourDialog.cpp:73 +#: src/slic3r/GUI/BonjourDialog.cpp:76 msgid "Hostname" msgstr "Hostnév" -#: src/slic3r/GUI/BonjourDialog.cpp:74 +#: src/slic3r/GUI/BonjourDialog.cpp:77 msgid "Service name" msgstr "Szolgáltatás neve" -#: src/slic3r/GUI/BonjourDialog.cpp:76 +#: src/slic3r/GUI/BonjourDialog.cpp:79 msgid "OctoPrint version" msgstr "OctoPrint verzió" -#: src/slic3r/GUI/BonjourDialog.cpp:224 +#: src/slic3r/GUI/BonjourDialog.cpp:227 msgid "Searching for devices" msgstr "Eszközök keresése" -#: src/slic3r/GUI/BonjourDialog.cpp:231 +#: src/slic3r/GUI/BonjourDialog.cpp:234 msgid "Finished" msgstr "Befejeződött" -#: src/slic3r/GUI/ButtonsDescription.cpp:42 +#: src/slic3r/GUI/BonjourDialog.cpp:240 +msgid "Multiple resolved IP addresses" +msgstr "" + +#: src/slic3r/GUI/BonjourDialog.cpp:249 +#, boost-format +msgid "" +"There are several IP addresses resolving to hostname %1%.\n" +"Please select one that should be used." +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:21 +msgid "Palette 1 (default)" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:22 +msgid "Palette 2" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:23 +msgid "Palette 3" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:24 +msgid "Palette 4" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:25 +msgid "Palette 5" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:26 +msgid "Palette 6" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:27 +msgid "Palette 7" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:28 +msgid "Palette 8" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:112 msgid "Revert color to default" msgstr "Szín visszaállítása az alapértelmezettre" -#: src/slic3r/GUI/ButtonsDescription.cpp:57 +#: src/slic3r/GUI/ButtonsDescription.cpp:127 msgid "Value is the same as the system value" msgstr "Az érték megegyezik a rendszerváltozóval" -#: src/slic3r/GUI/ButtonsDescription.cpp:58 +#: src/slic3r/GUI/ButtonsDescription.cpp:128 msgid "" "Value was changed and is not equal to the system value or the last saved " "preset" @@ -424,11 +478,35 @@ msgstr "" "Az érték megváltozott, és nem egyenlő a rendszerváltozóval vagy az utoljára " "mentett előbeállítással" -#: src/slic3r/GUI/ButtonsDescription.cpp:62 +#: src/slic3r/GUI/ButtonsDescription.cpp:155 +msgid "Default palette for mode markers" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2422 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Simple" +msgstr "Egyszerű" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2424 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgctxt "Mode" +msgid "Advanced" +msgstr "Haladó" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2425 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Expert" +msgstr "Szakértő" + +#: src/slic3r/GUI/ButtonsDescription.cpp:182 +msgid "Revert color" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:200 msgid "Buttons And Text Colors Description" msgstr "Gombok És Szövegszínek Leírása" -#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/ConfigManipulation.cpp:50 msgid "" "Layer height is not valid.\n" "\n" @@ -438,13 +516,13 @@ msgstr "" "\n" "A réteg magassága 0,01-re áll vissza." -#: src/slic3r/GUI/ConfigManipulation.cpp:50 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1449 -#: src/libslic3r/PrintConfig.cpp:286 +#: src/slic3r/GUI/ConfigManipulation.cpp:51 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1394 +#: src/libslic3r/PrintConfig.cpp:299 msgid "Layer height" msgstr "Réteg magasság" -#: src/slic3r/GUI/ConfigManipulation.cpp:61 +#: src/slic3r/GUI/ConfigManipulation.cpp:62 msgid "" "First layer height is not valid.\n" "\n" @@ -454,59 +532,30 @@ msgstr "" "\n" "Az első réteg magassága 0,01-re áll vissza." -#: src/slic3r/GUI/ConfigManipulation.cpp:62 src/libslic3r/PrintConfig.cpp:1231 +#: src/slic3r/GUI/ConfigManipulation.cpp:63 src/libslic3r/PrintConfig.cpp:1291 msgid "First layer height" msgstr "Első réteg magasság" #: src/slic3r/GUI/ConfigManipulation.cpp:82 +#, c-format, boost-format msgid "" "The Spiral Vase mode requires:\n" "- one perimeter\n" "- no top solid layers\n" "- 0% fill density\n" "- no support material\n" -"- Ensure vertical shell thickness enabled\n" "- Detect thin walls disabled" msgstr "" -"A Spirálváza módhoz:\n" -"- egy kerület\n" -"- nincs tömör felső réteg\n" -"- 0% kitöltési sűrűség\n" -"- nincs támaszanyag\n" -"- Győződjön meg arról, hogy a függőleges héjvastagság engedélyezve van\n" -"- Vékony falak észlelése letiltva" -#: src/slic3r/GUI/ConfigManipulation.cpp:90 +#: src/slic3r/GUI/ConfigManipulation.cpp:89 msgid "Shall I adjust those settings in order to enable Spiral Vase?" msgstr "Módosítsam ezeket a beállításokat a Spirálváza engedélyezéséhez?" -#: src/slic3r/GUI/ConfigManipulation.cpp:91 +#: src/slic3r/GUI/ConfigManipulation.cpp:90 msgid "Spiral Vase" msgstr "Spirál Váza" -#: src/slic3r/GUI/ConfigManipulation.cpp:121 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool " -"change.\n" -"(both support_material_extruder and support_material_interface_extruder need " -"to be set to 0)." -msgstr "" -"A törlőtorony jelenleg csak a nem oldódó támaszokat támogatja\n" -"ha az aktuális extruderrel nyomtatják szerszámcsere kiváltása nélkül.\n" -"(mind a support_material_extruder, mind a " -"support_material_interface_extruder értéket 0-ra kell állítani)." - -#: src/slic3r/GUI/ConfigManipulation.cpp:125 -msgid "Shall I adjust those settings in order to enable the Wipe Tower?" -msgstr "Módosítsam ezeket a beállításokat a törlőtorony engedélyezéséhez?" - -#: src/slic3r/GUI/ConfigManipulation.cpp:126 -#: src/slic3r/GUI/ConfigManipulation.cpp:146 -msgid "Wipe Tower" -msgstr "Törlőtorony" - -#: src/slic3r/GUI/ConfigManipulation.cpp:142 +#: src/slic3r/GUI/ConfigManipulation.cpp:123 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers\n" "need to be synchronized with the object layers." @@ -515,11 +564,32 @@ msgstr "" "támaszrétegeket\n" "szinkronizálni kell az objektumrétegekkel." -#: src/slic3r/GUI/ConfigManipulation.cpp:145 +#: src/slic3r/GUI/ConfigManipulation.cpp:126 msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" msgstr "Szinkronizáljam a támasz rétegeket a Törlőtorony engedélyezéséhez?" -#: src/slic3r/GUI/ConfigManipulation.cpp:164 +#: src/slic3r/GUI/ConfigManipulation.cpp:127 +#: src/slic3r/GUI/ConfigManipulation.cpp:145 +msgid "Wipe Tower" +msgstr "Törlőtorony" + +#: src/slic3r/GUI/ConfigManipulation.cpp:140 src/libslic3r/Print.cpp:672 +msgid "" +"The Wipe Tower currently supports the non-soluble supports only if they are " +"printed with the current extruder without triggering a tool change. (both " +"support_material_extruder and support_material_interface_extruder need to be " +"set to 0)." +msgstr "" +"A törlőtorony jelenleg csak akkor támogatja a nem oldható támasztékokat, ha " +"azok az aktuális extruderrel nyomtathatók szerszámváltás nélkül. (mind a " +"support_material_extruder, mind a support_material_interface_extruder " +"értékét 0-ra kell állítani)." + +#: src/slic3r/GUI/ConfigManipulation.cpp:144 +msgid "Shall I adjust those settings in order to enable the Wipe Tower?" +msgstr "Módosítsam ezeket a beállításokat a törlőtorony engedélyezéséhez?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:166 msgid "" "Supports work better, if the following feature is enabled:\n" "- Detect bridging perimeters" @@ -527,184 +597,188 @@ msgstr "" "A támaszok jobban működnek, ha a következő funkció engedélyezve van:\n" "- Az áthidaló kerületek felismerése" -#: src/slic3r/GUI/ConfigManipulation.cpp:167 +#: src/slic3r/GUI/ConfigManipulation.cpp:169 msgid "Shall I adjust those settings for supports?" msgstr "Módosítsam ezeket a beállításokat a támaszokhoz?" -#: src/slic3r/GUI/ConfigManipulation.cpp:168 +#: src/slic3r/GUI/ConfigManipulation.cpp:170 msgid "Support Generator" msgstr "Támasz generátor" -#: src/slic3r/GUI/ConfigManipulation.cpp:195 +#: src/slic3r/GUI/ConfigManipulation.cpp:194 #, boost-format msgid "The %1% infill pattern is not supposed to work at 100%% density." msgstr "A %1%-os kitöltési minta nem tud 100%%-os sűrűség mellett működni." -#: src/slic3r/GUI/ConfigManipulation.cpp:198 +#: src/slic3r/GUI/ConfigManipulation.cpp:196 msgid "Shall I switch to rectilinear fill pattern?" msgstr "Váltsak egyenes vonalú kitöltési mintára?" -#: src/slic3r/GUI/ConfigManipulation.cpp:199 +#: src/slic3r/GUI/ConfigManipulation.cpp:197 #: src/slic3r/GUI/GUI_Factories.cpp:55 src/slic3r/GUI/GUI_Factories.cpp:128 -#: src/slic3r/GUI/Plater.cpp:460 src/slic3r/GUI/Tab.cpp:1503 -#: src/slic3r/GUI/Tab.cpp:1505 src/libslic3r/PrintConfig.cpp:475 -#: src/libslic3r/PrintConfig.cpp:716 src/libslic3r/PrintConfig.cpp:743 -#: src/libslic3r/PrintConfig.cpp:1098 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1149 src/libslic3r/PrintConfig.cpp:1398 -#: src/libslic3r/PrintConfig.cpp:1427 src/libslic3r/PrintConfig.cpp:1496 -#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1535 -#: src/libslic3r/PrintConfig.cpp:2364 src/libslic3r/PrintConfig.cpp:2381 +#: src/slic3r/GUI/Plater.cpp:468 src/slic3r/GUI/Tab.cpp:1450 +#: src/slic3r/GUI/Tab.cpp:1452 src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:811 src/libslic3r/PrintConfig.cpp:831 +#: src/libslic3r/PrintConfig.cpp:1187 src/libslic3r/PrintConfig.cpp:1200 +#: src/libslic3r/PrintConfig.cpp:1225 src/libslic3r/PrintConfig.cpp:1444 +#: src/libslic3r/PrintConfig.cpp:1473 src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1557 src/libslic3r/PrintConfig.cpp:1576 +#: src/libslic3r/PrintConfig.cpp:2395 src/libslic3r/PrintConfig.cpp:2412 msgid "Infill" msgstr "Kitöltés" -#: src/slic3r/GUI/ConfigManipulation.cpp:337 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Head penetration should not be greater than the head width." msgstr "A fej benyúlása nem lehet nagyobb, mint a fej szélessége." -#: src/slic3r/GUI/ConfigManipulation.cpp:339 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid Head penetration" msgstr "Érvénytelen Fej benyúlás" -#: src/slic3r/GUI/ConfigManipulation.cpp:350 +#: src/slic3r/GUI/ConfigManipulation.cpp:362 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "A tűfej átmérőjének kisebbnek kell lennie, az oszlop átmérőjénél." -#: src/slic3r/GUI/ConfigManipulation.cpp:352 +#: src/slic3r/GUI/ConfigManipulation.cpp:364 msgid "Invalid pinhead diameter" msgstr "Érvénytelen tűfej átmérő" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20 msgid "Upgrade" msgstr "Frissítés" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22 msgid "Downgrade" msgstr "Visszafrissítés" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 msgid "Before roll back" msgstr "Visszalépés előtt" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:340 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:26 src/libslic3r/PrintConfig.cpp:353 msgid "User" msgstr "Felhasználó" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:329 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:29 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1135 msgid "Unknown" msgstr "Ismeretlen" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 msgid "Active" msgstr "Aktív" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 msgid "PrusaSlicer version" msgstr "PrusaSlicer verzió" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 src/libslic3r/Preset.cpp:1341 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 src/libslic3r/Preset.cpp:1480 msgid "print" msgstr "nyomtatás" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:65 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 msgid "filaments" msgstr "filamentek" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 src/libslic3r/Preset.cpp:1343 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:67 src/libslic3r/Preset.cpp:1482 msgid "SLA print" msgstr "SLA nyomtatás" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69 -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/slic3r/GUI/GUI.cpp:340 -#: src/slic3r/GUI/Plater.cpp:821 src/libslic3r/Preset.cpp:1344 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/slic3r/GUI/GUI.cpp:331 +#: src/slic3r/GUI/Plater.cpp:851 src/libslic3r/Preset.cpp:1483 msgid "SLA material" msgstr "SLA anyag" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:71 src/libslic3r/Preset.cpp:1345 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 src/libslic3r/Preset.cpp:1484 msgid "printer" msgstr "nyomtató" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 src/slic3r/GUI/Tab.cpp:1366 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 src/slic3r/GUI/Tab.cpp:1311 msgid "vendor" msgstr "gyártó" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 msgid "version" msgstr "verzió" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:76 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 msgid "min PrusaSlicer version" msgstr "min PrusaSlicer verzió" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:77 msgid "max PrusaSlicer version" msgstr "max PrusaSlicer verzió" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "model" msgstr "modell" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "variants" msgstr "változatok" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:93 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:92 #, c-format, boost-format msgid "Incompatible with this %s" msgstr "Nem kompatibilis ezzel %s" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:96 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:95 msgid "Activate" msgstr "Aktiválás" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:123 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:122 msgid "Configuration Snapshots" msgstr "Konfigurációs pillanatfelvételek" -#: src/slic3r/GUI/ConfigWizard.cpp:262 +#: src/slic3r/GUI/ConfigWizard.cpp:291 msgid "nozzle" msgstr "fúvóka" -#: src/slic3r/GUI/ConfigWizard.cpp:266 +#: src/slic3r/GUI/ConfigWizard.cpp:295 msgid "Alternate nozzles:" msgstr "Alternatív fúvókák:" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "All standard" msgstr "Összes standard" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "Standard" msgstr "Standard" -#: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3833 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 +#: src/slic3r/GUI/ConfigWizard.cpp:360 src/slic3r/GUI/ConfigWizard.cpp:681 +#: src/slic3r/GUI/FileArchiveDialog.cpp:261 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 src/slic3r/GUI/Preferences.cpp:550 +#: src/slic3r/GUI/Tab.cpp:4058 src/slic3r/GUI/UnsavedChangesDialog.cpp:1161 msgid "All" msgstr "Összes" -#: src/slic3r/GUI/ConfigWizard.cpp:332 src/slic3r/GUI/ConfigWizard.cpp:652 -#: src/slic3r/GUI/DoubleSlider.cpp:2030 src/slic3r/GUI/Plater.cpp:432 -#: src/slic3r/GUI/Plater.cpp:579 src/slic3r/GUI/Preferences.cpp:436 -#: src/libslic3r/PrintConfig.cpp:1291 +#: src/slic3r/GUI/ConfigWizard.cpp:361 src/slic3r/GUI/ConfigWizard.cpp:682 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 +#: src/slic3r/GUI/FileArchiveDialog.cpp:265 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1984 src/slic3r/GUI/Plater.cpp:439 +#: src/slic3r/GUI/Plater.cpp:594 src/slic3r/GUI/Preferences.cpp:552 +#: src/libslic3r/PrintConfig.cpp:1347 msgid "None" msgstr "Egyik sem" -#: src/slic3r/GUI/ConfigWizard.cpp:484 +#: src/slic3r/GUI/ConfigWizard.cpp:513 #, c-format, boost-format msgid "Welcome to the %s Configuration Assistant" msgstr "Üdvözli a %s Konfigurációs Asszisztens" -#: src/slic3r/GUI/ConfigWizard.cpp:486 +#: src/slic3r/GUI/ConfigWizard.cpp:515 #, c-format, boost-format msgid "Welcome to the %s Configuration Wizard" msgstr "Üdvözöli a %s Konfigurációs Varázsló" -#: src/slic3r/GUI/ConfigWizard.cpp:488 +#: src/slic3r/GUI/ConfigWizard.cpp:517 msgid "Welcome" msgstr "Üdvözlés" -#: src/slic3r/GUI/ConfigWizard.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:519 #, c-format, boost-format msgid "" "Hello, welcome to %s! This %s helps you with the initial configuration; just " @@ -713,11 +787,11 @@ msgstr "" "Üdvözli a %s! Ez a %s segít a kezdeti beállításokban. Csak néhány beállítás, " "és máris nyomtathat." -#: src/slic3r/GUI/ConfigWizard.cpp:495 +#: src/slic3r/GUI/ConfigWizard.cpp:524 msgid "Remove user profiles (a snapshot will be taken beforehand)" msgstr "Felhasználói profilok eltávolítása (előtte pillanatfelvétel készül)" -#: src/slic3r/GUI/ConfigWizard.cpp:498 +#: src/slic3r/GUI/ConfigWizard.cpp:527 msgid "" "Perform desktop integration (Sets this binary to be searchable by the " "system)." @@ -725,56 +799,67 @@ msgstr "" "Asztali integráció végrehajtása (beállítja, hogy a bináris fájl kereshető " "legyen a rendszer számára)." -#: src/slic3r/GUI/ConfigWizard.cpp:550 +#: src/slic3r/GUI/ConfigWizard.cpp:579 #, c-format, boost-format msgid "%s Family" msgstr "%s Család" -#: src/slic3r/GUI/ConfigWizard.cpp:640 +#: src/slic3r/GUI/ConfigWizard.cpp:670 msgid "Printer:" msgstr "Nyomtató:" -#: src/slic3r/GUI/ConfigWizard.cpp:642 +#: src/slic3r/GUI/ConfigWizard.cpp:672 msgid "Vendor:" msgstr "Gyártó:" -#: src/slic3r/GUI/ConfigWizard.cpp:643 +#: src/slic3r/GUI/ConfigWizard.cpp:673 msgid "Profile:" msgstr "Profil:" -#: src/slic3r/GUI/ConfigWizard.cpp:720 src/slic3r/GUI/ConfigWizard.cpp:892 -#: src/slic3r/GUI/ConfigWizard.cpp:952 src/slic3r/GUI/ConfigWizard.cpp:1088 +#: src/slic3r/GUI/ConfigWizard.cpp:750 src/slic3r/GUI/ConfigWizard.cpp:938 +#: src/slic3r/GUI/ConfigWizard.cpp:1024 src/slic3r/GUI/ConfigWizard.cpp:1163 msgid "(All)" msgstr "(Minden)" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:754 src/slic3r/GUI/ConfigWizard.cpp:1165 +msgid "(Templates)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:789 #, boost-format msgid "" -"%1% marked with * are not compatible with some installed " -"printers." +"%1% visible for (\"Template\") printer are universal profiles " +"available for all printers. These might not be compatible with your printer." msgstr "" -"A *-gal megjelölt %1% nem kompatibilisek az összes telepített " -"nyomtatóval." -#: src/slic3r/GUI/ConfigWizard.cpp:752 src/slic3r/GUI/ConfigWizard.cpp:2043 -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filaments" msgstr "Filamentek" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 msgid "SLA materials" msgstr "SLA anyagok" -#: src/slic3r/GUI/ConfigWizard.cpp:755 +#: src/slic3r/GUI/ConfigWizard.cpp:791 +#, boost-format +msgid "" +"%1% marked with * are not compatible with some installed " +"printers." +msgstr "" +"A *-gal megjelölt %1% nem kompatibilisek az összes telepített " +"nyomtatóval." + +#: src/slic3r/GUI/ConfigWizard.cpp:794 #, boost-format msgid "All installed printers are compatible with the selected %1%." msgstr "Minden telepített nyomtató kompatibilis a kiválasztott %1% -val." -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/libslic3r/Preset.cpp:1342 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/libslic3r/Preset.cpp:1481 msgid "filament" msgstr "filament" -#: src/slic3r/GUI/ConfigWizard.cpp:778 +#: src/slic3r/GUI/ConfigWizard.cpp:818 msgid "" "Only the following installed printers are compatible with the selected " "filaments" @@ -782,7 +867,7 @@ msgstr "" "Csak az alábbi telepített nyomtatók kompatibilisek a kiválasztott " "filamentekkel" -#: src/slic3r/GUI/ConfigWizard.cpp:779 +#: src/slic3r/GUI/ConfigWizard.cpp:819 msgid "" "Only the following installed printers are compatible with the selected SLA " "materials" @@ -790,35 +875,53 @@ msgstr "" "Csak az alábbi telepített nyomtatók kompatibilisek a kiválasztott SLA " "anyagokkal" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1213 +msgid "" +"You have selected template filament. Please note that these filaments are " +"available for all printers but are NOT certain to be compatible with your " +"printer. Do you still wish to have this filament selected?\n" +"(This message won't be displayed again.)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1214 src/slic3r/GUI/ConfigWizard.cpp:2720 +#: src/slic3r/GUI/ConfigWizard.cpp:2860 src/slic3r/GUI/DoubleSlider.cpp:2591 +#: src/slic3r/GUI/DoubleSlider.cpp:2612 src/slic3r/GUI/GUI.cpp:245 +#: src/slic3r/GUI/GUI_App.cpp:3458 src/slic3r/GUI/UpdateDialogs.cpp:204 +#: src/slic3r/GUI/UpdateDialogs.cpp:212 src/slic3r/GUI/UpdateDialogs.cpp:217 +#: src/slic3r/GUI/UpdateDialogs.cpp:222 src/slic3r/GUI/UpdateDialogs.cpp:229 +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +msgid "Notice" +msgstr "Megjegyzés" + +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer Setup" msgstr "Egyedi Nyomtató Beállítás" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer" msgstr "Egyedi Nyomtató" -#: src/slic3r/GUI/ConfigWizard.cpp:1177 +#: src/slic3r/GUI/ConfigWizard.cpp:1264 msgid "Define a custom printer profile" msgstr "Egyéni nyomtatóprofil létrehozása" -#: src/slic3r/GUI/ConfigWizard.cpp:1179 +#: src/slic3r/GUI/ConfigWizard.cpp:1265 msgid "Custom profile name:" msgstr "Egyéni profil neve:" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Automatic updates" msgstr "Automatikus frissítések" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Updates" msgstr "Frissítések" -#: src/slic3r/GUI/ConfigWizard.cpp:1214 +#: src/slic3r/GUI/ConfigWizard.cpp:1290 msgid "Check for application updates" msgstr "Alkalmazás automatikus frissítése" -#: src/slic3r/GUI/ConfigWizard.cpp:1218 +#: src/slic3r/GUI/ConfigWizard.cpp:1294 #, c-format, boost-format msgid "" "If enabled, %s checks for new application versions online. When a new " @@ -831,11 +934,11 @@ msgstr "" "jelenik meg (program használata közben soha). Ez csak egy értesítési " "mechanizmus, nem történik automatikus telepítés." -#: src/slic3r/GUI/ConfigWizard.cpp:1224 src/slic3r/GUI/Preferences.cpp:175 +#: src/slic3r/GUI/ConfigWizard.cpp:1300 src/slic3r/GUI/Preferences.cpp:306 msgid "Update built-in Presets automatically" msgstr "Beépített Előbeállítások automatikus frissítése" -#: src/slic3r/GUI/ConfigWizard.cpp:1228 +#: src/slic3r/GUI/ConfigWizard.cpp:1304 #, c-format, boost-format msgid "" "If enabled, %s downloads updates of built-in system presets in the " @@ -848,7 +951,7 @@ msgstr "" "letöltésre. Amikor egy új előbeállítások verzió elérhetővé válik, azt az " "alkalmazás a következő indításkor felajánlja." -#: src/slic3r/GUI/ConfigWizard.cpp:1231 +#: src/slic3r/GUI/ConfigWizard.cpp:1307 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." @@ -856,7 +959,7 @@ msgstr "" "A frissítések soha nem kerülnek telepítésre a felhasználó beleegyezése " "nélkül, és soha nem írják felül a felhasználó egyéni beállításait." -#: src/slic3r/GUI/ConfigWizard.cpp:1236 +#: src/slic3r/GUI/ConfigWizard.cpp:1312 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." @@ -864,19 +967,63 @@ msgstr "" "Ezenkívül a frissítés alkalmazása előtt a teljes konfigurációról " "pillanatfelvétel készül." -#: src/slic3r/GUI/ConfigWizard.cpp:1243 src/slic3r/GUI/GUI_Factories.cpp:726 -#: src/slic3r/GUI/Plater.cpp:3582 +#: src/slic3r/GUI/ConfigWizard.cpp:1361 src/slic3r/GUI/Preferences.cpp:1076 +msgid "Download path" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1366 src/slic3r/GUI/FirmwareDialog.cpp:815 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:300 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +msgid "Browse" +msgstr "Tallózás" + +#: src/slic3r/GUI/ConfigWizard.cpp:1371 +msgid "Choose folder:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads from URL" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1417 +msgid "Allow built-in downloader" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1424 +#, c-format, boost-format +msgid "" +"If enabled, %s registers to start on custom URL on www.printables.com. You " +"will be able to use button with %s logo to open models in this %s. The model " +"will be downloaded into folder you choose bellow." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1431 +msgid "" +"On Linux systems the process of registration also creates desktop " +"integration files for this version of application." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1458 +msgid "Chosen directory for downloads does not Exists." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1545 src/slic3r/GUI/GUI_Factories.cpp:810 +#: src/slic3r/GUI/Plater.cpp:3732 msgid "Reload from disk" msgstr "Újratöltés lemezről" -#: src/slic3r/GUI/ConfigWizard.cpp:1246 +#: src/slic3r/GUI/ConfigWizard.cpp:1548 msgid "" "Export full pathnames of models and parts sources into 3mf and amf files" msgstr "" "Exportálja a modellek és alkatrészforrások teljes elérési útját 3mf és amf " "fájlokba" -#: src/slic3r/GUI/ConfigWizard.cpp:1250 +#: src/slic3r/GUI/ConfigWizard.cpp:1552 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked.\n" @@ -888,23 +1035,23 @@ msgstr "" "Ha nincs engedélyezve, az Újratöltés lemezről parancs kérni fogja az egyes " "fájlok kiválasztását a fájl megnyitása párbeszédpanelen." -#: src/slic3r/GUI/ConfigWizard.cpp:1259 +#: src/slic3r/GUI/ConfigWizard.cpp:1561 msgid "Files association" msgstr "Fájl társítás" -#: src/slic3r/GUI/ConfigWizard.cpp:1261 src/slic3r/GUI/Preferences.cpp:157 +#: src/slic3r/GUI/ConfigWizard.cpp:1563 src/slic3r/GUI/Preferences.cpp:292 msgid "Associate .3mf files to PrusaSlicer" msgstr "Társítsa a .3mf fájlokat a PrusaSlicerhez" -#: src/slic3r/GUI/ConfigWizard.cpp:1262 src/slic3r/GUI/Preferences.cpp:164 +#: src/slic3r/GUI/ConfigWizard.cpp:1564 src/slic3r/GUI/Preferences.cpp:297 msgid "Associate .stl files to PrusaSlicer" msgstr "Társítsa a .stl fájlokat a PrusaSlicerhez" -#: src/slic3r/GUI/ConfigWizard.cpp:1272 +#: src/slic3r/GUI/ConfigWizard.cpp:1574 msgid "View mode" msgstr "Megjelenítési mód" -#: src/slic3r/GUI/ConfigWizard.cpp:1274 +#: src/slic3r/GUI/ConfigWizard.cpp:1576 msgid "" "PrusaSlicer's user interfaces comes in three variants:\n" "Simple, Advanced, and Expert.\n" @@ -918,82 +1065,96 @@ msgstr "" "beállításokat jeleníti meg. A másik kettő fokozatosan kifinomultabb " "finomhangolást kínál, haladó, illetve szakértő felhasználók számára." -#: src/slic3r/GUI/ConfigWizard.cpp:1279 +#: src/slic3r/GUI/ConfigWizard.cpp:1581 msgid "Simple mode" msgstr "Egyszerű mód" -#: src/slic3r/GUI/ConfigWizard.cpp:1280 +#: src/slic3r/GUI/ConfigWizard.cpp:1582 msgid "Advanced mode" msgstr "Haladó mód" -#: src/slic3r/GUI/ConfigWizard.cpp:1281 +#: src/slic3r/GUI/ConfigWizard.cpp:1583 msgid "Expert mode" msgstr "Szakértő mód" -#: src/slic3r/GUI/ConfigWizard.cpp:1287 +#: src/slic3r/GUI/ConfigWizard.cpp:1596 msgid "The size of the object can be specified in inches" msgstr "Az objektum mérete Inch-ben is megadható" -#: src/slic3r/GUI/ConfigWizard.cpp:1288 +#: src/slic3r/GUI/ConfigWizard.cpp:1597 msgid "Use inches" msgstr "Inch használata" -#: src/slic3r/GUI/ConfigWizard.cpp:1322 +#: src/slic3r/GUI/ConfigWizard.cpp:1617 msgid "Other Vendors" msgstr "További Gyártók" -#: src/slic3r/GUI/ConfigWizard.cpp:1326 +#: src/slic3r/GUI/ConfigWizard.cpp:1621 #, c-format, boost-format msgid "Pick another vendor supported by %s" msgstr "A %s által támogatott egyéb gyártó kiválasztása" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 msgid "Firmware Type" msgstr "Firmware Típus" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2366 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 src/slic3r/GUI/Tab.cpp:2354 msgid "Firmware" msgstr "Firmware" -#: src/slic3r/GUI/ConfigWizard.cpp:1361 +#: src/slic3r/GUI/ConfigWizard.cpp:1658 msgid "Choose the type of firmware used by your printer." msgstr "Válassza ki a nyomtató által használt firmware típusát." -#: src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/ConfigWizard.cpp:1707 src/slic3r/GUI/ConfigWizard.cpp:1778 +#: src/slic3r/GUI/ConfigWizard.cpp:1783 src/slic3r/GUI/ConfigWizard.cpp:1788 +#: src/slic3r/GUI/Field.cpp:258 src/slic3r/GUI/Field.cpp:328 +#: src/slic3r/GUI/Field.cpp:1585 src/slic3r/GUI/GUI_ObjectLayers.cpp:435 +msgid "Invalid numeric input." +msgstr "Érvénytelen numerikus bevitel." + +#: src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape and Size" msgstr "Az tárgyasztal formája és mérete" -#: src/slic3r/GUI/ConfigWizard.cpp:1399 +#: src/slic3r/GUI/ConfigWizard.cpp:1735 msgid "Set the shape of your printer's bed." msgstr "Állítsa be a nyomtató tárgyasztalának alakját." -#: src/slic3r/GUI/ConfigWizard.cpp:1433 src/slic3r/GUI/Field.cpp:255 -#: src/slic3r/GUI/Field.cpp:324 src/slic3r/GUI/Field.cpp:1561 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:435 -msgid "Invalid numeric input." -msgstr "Érvénytelen numerikus bevitel." +#: src/slic3r/GUI/ConfigWizard.cpp:1755 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1610 +msgid "Build Volume" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1758 +msgid "Set vertical size of your printer." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1795 +msgid "Max print height:" +msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Filament and Nozzle Diameters" msgstr "Filament és Fúvóka Átmérő" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Print Diameters" msgstr "Nyomtatási átmérők" -#: src/slic3r/GUI/ConfigWizard.cpp:1472 +#: src/slic3r/GUI/ConfigWizard.cpp:1828 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "Adja meg a nyomtató hot end fúvókájának átmérőjét." -#: src/slic3r/GUI/ConfigWizard.cpp:1475 +#: src/slic3r/GUI/ConfigWizard.cpp:1831 msgid "Nozzle Diameter:" msgstr "Fúvóka Átmérője:" -#: src/slic3r/GUI/ConfigWizard.cpp:1485 +#: src/slic3r/GUI/ConfigWizard.cpp:1841 msgid "Enter the diameter of your filament." msgstr "Adja meg a filament átmérőjét." -#: src/slic3r/GUI/ConfigWizard.cpp:1486 +#: src/slic3r/GUI/ConfigWizard.cpp:1842 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." @@ -1001,37 +1162,38 @@ msgstr "" "Jó pontosság szükséges, ezért használjon tolómérőt, és végezzen többszöri " "mérést a filament mentén, majd számítsa ki az átlagot." -#: src/slic3r/GUI/ConfigWizard.cpp:1489 +#: src/slic3r/GUI/ConfigWizard.cpp:1845 msgid "Filament Diameter:" msgstr "Filament Átmérő:" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Nozzle and Bed Temperatures" msgstr "A fúvóka és a tárgyasztal hőmérséklete" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Temperatures" msgstr "Hőmérséklet(ek)" -#: src/slic3r/GUI/ConfigWizard.cpp:1563 +#: src/slic3r/GUI/ConfigWizard.cpp:1919 msgid "Enter the temperature needed for extruding your filament." msgstr "Adja meg a filament extrudálásához szükséges hőmérsékletet." -#: src/slic3r/GUI/ConfigWizard.cpp:1564 +#: src/slic3r/GUI/ConfigWizard.cpp:1920 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "Az ökölszabály a 160–230 °C PLA, és a 215–250 °C ABS esetén." -#: src/slic3r/GUI/ConfigWizard.cpp:1567 +#: src/slic3r/GUI/ConfigWizard.cpp:1923 msgid "Extrusion Temperature:" msgstr "Extrudálási hőmérséklet:" -#: src/slic3r/GUI/ConfigWizard.cpp:1568 src/slic3r/GUI/ConfigWizard.cpp:1582 -#: src/libslic3r/PrintConfig.cpp:418 src/libslic3r/PrintConfig.cpp:1211 -#: src/libslic3r/PrintConfig.cpp:1266 src/libslic3r/PrintConfig.cpp:2842 +#: src/slic3r/GUI/ConfigWizard.cpp:1924 src/slic3r/GUI/ConfigWizard.cpp:1938 +#: src/libslic3r/PrintConfig.cpp:437 src/libslic3r/PrintConfig.cpp:1271 +#: src/libslic3r/PrintConfig.cpp:1326 src/libslic3r/PrintConfig.cpp:2930 +#: src/libslic3r/PrintConfig.cpp:3689 msgid "°C" msgstr "°C" -#: src/slic3r/GUI/ConfigWizard.cpp:1577 +#: src/slic3r/GUI/ConfigWizard.cpp:1933 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." @@ -1039,7 +1201,7 @@ msgstr "" "Adja meg azt a hőmérsékletet, amely ahhoz szükséges, hogy a filament a " "fűtött tárgyasztalhoz tapadjon." -#: src/slic3r/GUI/ConfigWizard.cpp:1578 +#: src/slic3r/GUI/ConfigWizard.cpp:1934 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." @@ -1047,23 +1209,23 @@ msgstr "" "Az ökölszabály a 60 °C PLA és 110 °C az ABS esetében. Ha nincs fűtött " "tárgyasztala, adjon meg nullát." -#: src/slic3r/GUI/ConfigWizard.cpp:1581 +#: src/slic3r/GUI/ConfigWizard.cpp:1937 msgid "Bed Temperature:" msgstr "Tárgyasztal hőmérséklet:" -#: src/slic3r/GUI/ConfigWizard.cpp:2043 src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Materials" msgstr "SLA Anyagok" -#: src/slic3r/GUI/ConfigWizard.cpp:2097 +#: src/slic3r/GUI/ConfigWizard.cpp:2464 msgid "FFF Technology Printers" msgstr "FFF Techológiájú Nyomtatók" -#: src/slic3r/GUI/ConfigWizard.cpp:2102 +#: src/slic3r/GUI/ConfigWizard.cpp:2469 msgid "SLA Technology Printers" msgstr "SLA Techológiájú Nyomtatók" -#: src/slic3r/GUI/ConfigWizard.cpp:2338 +#: src/slic3r/GUI/ConfigWizard.cpp:2718 #, boost-format msgid "" "Following printer profiles has no default filament: %1%Please select one " @@ -1072,7 +1234,7 @@ msgstr "" "A következő nyomtatóprofilokhoz nem tartozik alapértelmezett filament: " "%1%Kérem, válasszon egyet manuálisan." -#: src/slic3r/GUI/ConfigWizard.cpp:2339 +#: src/slic3r/GUI/ConfigWizard.cpp:2719 #, boost-format msgid "" "Following printer profiles has no default material: %1%Please select one " @@ -1081,38 +1243,32 @@ msgstr "" "A következő nyomtatóprofilokhoz nem tartozik alapértelmezett anyag: " "%1%Kérjük, válasszon egyet manuálisan." -#: src/slic3r/GUI/ConfigWizard.cpp:2340 src/slic3r/GUI/ConfigWizard.cpp:2438 -#: src/slic3r/GUI/DoubleSlider.cpp:2522 src/slic3r/GUI/DoubleSlider.cpp:2543 -#: src/slic3r/GUI/GUI.cpp:232 -msgid "Notice" -msgstr "Megjegyzés" - -#: src/slic3r/GUI/ConfigWizard.cpp:2459 +#: src/slic3r/GUI/ConfigWizard.cpp:2883 msgid "The following FFF printer models have no filament selected:" msgstr "A következő FFF nyomtatókhoz nincs kiválasztva filament:" -#: src/slic3r/GUI/ConfigWizard.cpp:2463 +#: src/slic3r/GUI/ConfigWizard.cpp:2887 msgid "Do you want to select default filaments for these FFF printer models?" msgstr "" "Kiválasztja az alapértelmezett filamenteket ezekhez az FFF nyomtatókhoz?" -#: src/slic3r/GUI/ConfigWizard.cpp:2477 +#: src/slic3r/GUI/ConfigWizard.cpp:2901 msgid "The following SLA printer models have no materials selected:" msgstr "A következő SLA nyomtatókhoz nincs kiválasztva anyag:" -#: src/slic3r/GUI/ConfigWizard.cpp:2481 +#: src/slic3r/GUI/ConfigWizard.cpp:2905 msgid "Do you want to select default SLA materials for these printer models?" msgstr "Kiválasztja az alapértelmezett anyagokat ezekhez az SLA nyomtatókhoz?" -#: src/slic3r/GUI/ConfigWizard.cpp:2523 +#: src/slic3r/GUI/ConfigWizard.cpp:2947 msgid "Configuration is edited in ConfigWizard" msgstr "A konfiguráció szerkesztése a ConfigWizardban történik_" -#: src/slic3r/GUI/ConfigWizard.cpp:2566 +#: src/slic3r/GUI/ConfigWizard.cpp:3000 msgid "All user presets will be deleted." msgstr "Az összes felhasználói előbeállítás törlésre kerül." -#: src/slic3r/GUI/ConfigWizard.cpp:2596 +#: src/slic3r/GUI/ConfigWizard.cpp:3037 msgid "A new vendor was installed and one of its printers will be activated" msgid_plural "" "New vendors were installed and one of theirs printers will be activated" @@ -1121,98 +1277,103 @@ msgstr[0] "" msgstr[1] "" "Új gyártók kerültek telepítésre, és azok egyik nyomtatója aktiválásra került" -#: src/slic3r/GUI/ConfigWizard.cpp:2625 +#: src/slic3r/GUI/ConfigWizard.cpp:3069 msgid "Do you want to continue changing the configuration?" msgstr "Folytatja a konfiguráció módosítását?" -#: src/slic3r/GUI/ConfigWizard.cpp:2691 +#: src/slic3r/GUI/ConfigWizard.cpp:3136 msgid "A new Printer was installed and it will be activated." msgstr "Új nyomtató lett telepítve, és aktiválásra került." -#: src/slic3r/GUI/ConfigWizard.cpp:2696 +#: src/slic3r/GUI/ConfigWizard.cpp:3141 msgid "Some Printers were uninstalled." msgstr "Néhány nyomtató eltávolításra került." -#: src/slic3r/GUI/ConfigWizard.cpp:2717 +#: src/slic3r/GUI/ConfigWizard.cpp:3162 msgid "A new filament was installed and it will be activated." msgstr "Új filament lett telepítve, és aktiválásra fog kerülni." -#: src/slic3r/GUI/ConfigWizard.cpp:2718 +#: src/slic3r/GUI/ConfigWizard.cpp:3163 msgid "A new SLA material was installed and it will be activated." msgstr "Új SLA anyag lett telepítve, és aktiválásra került." -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some filaments were uninstalled." msgstr "Néhány filament eltávolításra került." -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some SLA materials were uninstalled." msgstr "Néhány SLA anyag eltávolításra került." -#: src/slic3r/GUI/ConfigWizard.cpp:2773 +#: src/slic3r/GUI/ConfigWizard.cpp:3218 msgid "Custom printer was installed and it will be activated." msgstr "Egyedi nyomtató lett telepítve, és aktiválásra került." -#: src/slic3r/GUI/ConfigWizard.cpp:2858 +#: src/slic3r/GUI/ConfigWizard.cpp:3306 msgid "Select all standard printers" msgstr "Az összes standard nyomtató kiválasztása" -#: src/slic3r/GUI/ConfigWizard.cpp:2861 +#: src/slic3r/GUI/ConfigWizard.cpp:3309 msgid "< &Back" msgstr "< Vissza" -#: src/slic3r/GUI/ConfigWizard.cpp:2862 +#: src/slic3r/GUI/ConfigWizard.cpp:3310 msgid "&Next >" msgstr "Következő >" -#: src/slic3r/GUI/ConfigWizard.cpp:2863 +#: src/slic3r/GUI/ConfigWizard.cpp:3311 msgid "&Finish" msgstr "Befejezés" -#: src/slic3r/GUI/ConfigWizard.cpp:2864 -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:3312 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:657 +#: src/slic3r/GUI/FileArchiveDialog.cpp:274 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 #: src/slic3r/GUI/FirmwareDialog.cpp:153 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1593 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1365 #: src/slic3r/GUI/ProgressStatusBar.cpp:26 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:93 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:879 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:96 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:907 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1606 msgid "Cancel" msgstr "Mégse" -#: src/slic3r/GUI/ConfigWizard.cpp:2884 +#: src/slic3r/GUI/ConfigWizard.cpp:3332 msgid "Prusa FFF Technology Printers" msgstr "Prusa FFF Technológiájú Nyomtatók" -#: src/slic3r/GUI/ConfigWizard.cpp:2892 +#: src/slic3r/GUI/ConfigWizard.cpp:3340 msgid "Prusa MSLA Technology Printers" msgstr "Prusa MSLA Technológiájú Nyomtatók" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filament Profiles Selection" msgstr "Filament Profil Kiválasztás" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 src/slic3r/GUI/ConfigWizard.cpp:2915 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 src/slic3r/GUI/ConfigWizard.cpp:3363 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Type:" msgstr "Típus:" -#: src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Material Profiles Selection" msgstr "SLA Alapanyag Profilok Kiválasztása" -#: src/slic3r/GUI/ConfigWizard.cpp:3036 +#: src/slic3r/GUI/ConfigWizard.cpp:3486 msgid "Configuration Assistant" msgstr "Konfigurációs Segéd" -#: src/slic3r/GUI/ConfigWizard.cpp:3037 +#: src/slic3r/GUI/ConfigWizard.cpp:3487 msgid "Configuration &Assistant" msgstr "Konfigurációs Segéd" -#: src/slic3r/GUI/ConfigWizard.cpp:3039 +#: src/slic3r/GUI/ConfigWizard.cpp:3489 msgid "Configuration Wizard" msgstr "Konfigurációs Varázsló" -#: src/slic3r/GUI/ConfigWizard.cpp:3040 +#: src/slic3r/GUI/ConfigWizard.cpp:3490 msgid "Configuration &Wizard" msgstr "Konfigurációs Varázsló" @@ -1230,7 +1391,7 @@ msgstr "" "Az asztali integráció végrehajtása nem sikerült - Nem található a futtatható " "fájl." -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:378 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:383 msgid "" "Performing desktop integration failed because the application directory was " "not found." @@ -1238,7 +1399,7 @@ msgstr "" "Az asztali integráció végrehajtása sikertelen volt, mert az alkalmazás " "könyvtára nem található." -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:419 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:423 msgid "" "Performing desktop integration failed - could not create Gcodeviewer desktop " "file. PrusaSlicer desktop file was probably created successfully." @@ -1247,12 +1408,29 @@ msgstr "" "Gcodeviewer asztali fájlt. A PrusaSlicer asztali fájl valószínűleg sikeresen " "létrejött." -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:459 -#: src/slic3r/GUI/GUI_App.cpp:2245 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:472 +msgid "" +"Performing downloader desktop integration failed - boost::filesystem::" +"canonical did not return appimage path." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:484 +msgid "" +"Performing downloader desktop integration failed - Could not find executable." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:602 +msgid "" +"Performing downloader desktop integration failed because the application " +"directory was not found." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:626 +#: src/slic3r/GUI/GUI_App.cpp:2407 msgid "Desktop Integration" msgstr "Asztal integráció" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:466 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:633 msgid "" "Desktop Integration sets this binary to be searchable by the system.\n" "\n" @@ -1263,13 +1441,13 @@ msgstr "" "\n" "A folytatáshoz nyomja meg a \" Végrehajtás \" gombot." -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:480 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:647 msgid "Perform" msgstr "Végrahajtás" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1342 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:653 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/KBShortcutsDialog.cpp:106 +#: src/slic3r/GUI/MainFrame.cpp:1426 msgid "Undo" msgstr "Visszavonás" @@ -1277,19 +1455,19 @@ msgstr "Visszavonás" msgid "Place bearings in slots and resume printing" msgstr "Helyezze a csapágyakat a nyílásokba, és folytassa a nyomtatást" -#: src/slic3r/GUI/DoubleSlider.cpp:1379 +#: src/slic3r/GUI/DoubleSlider.cpp:1448 msgid "One layer mode" msgstr "Egyrétegű mód" -#: src/slic3r/GUI/DoubleSlider.cpp:1381 +#: src/slic3r/GUI/DoubleSlider.cpp:1450 msgid "Discard all custom changes" msgstr "Összes egyedi változtatás eldobása" -#: src/slic3r/GUI/DoubleSlider.cpp:1385 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:1454 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to move" msgstr "Ugrás a mozgáshoz" -#: src/slic3r/GUI/DoubleSlider.cpp:1388 +#: src/slic3r/GUI/DoubleSlider.cpp:1457 #, c-format, boost-format msgid "" "Jump to height %s\n" @@ -1300,7 +1478,7 @@ msgstr "" "Vonalzó mód beállítása\n" "vagy Extruder sorrend beállítása a teljes nyomtatáshoz" -#: src/slic3r/GUI/DoubleSlider.cpp:1391 +#: src/slic3r/GUI/DoubleSlider.cpp:1460 #, c-format, boost-format msgid "" "Jump to height %s\n" @@ -1309,17 +1487,17 @@ msgstr "" "Ugrás a magasságra %s\n" "vagy Vonalzó mód beállítása" -#: src/slic3r/GUI/DoubleSlider.cpp:1396 +#: src/slic3r/GUI/DoubleSlider.cpp:1465 msgid "Edit current color - Right click the colored slider segment" msgstr "" "Jelenlegi szín szerkesztése - Kattintson a jobb egérgombbal a színezett " "csúszkaszegmensre" -#: src/slic3r/GUI/DoubleSlider.cpp:1398 +#: src/slic3r/GUI/DoubleSlider.cpp:1467 msgid "This is wipe tower layer" msgstr "Ez egy törlőtorony réteg" -#: src/slic3r/GUI/DoubleSlider.cpp:1408 +#: src/slic3r/GUI/DoubleSlider.cpp:1477 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing sequentually." @@ -1327,15 +1505,15 @@ msgstr "" "A szekvenciális nyomtatás aktív.\n" "Ilyenkor nem lehet az objektumokhoz egyéni G-kódot adni." -#: src/slic3r/GUI/DoubleSlider.cpp:1412 +#: src/slic3r/GUI/DoubleSlider.cpp:1481 msgid "Print mode" msgstr "Nyomtatási mód" -#: src/slic3r/GUI/DoubleSlider.cpp:1426 +#: src/slic3r/GUI/DoubleSlider.cpp:1495 msgid "Add extruder change - Left click" msgstr "Extruder váltás hozzáadása - Bal egérkattintás" -#: src/slic3r/GUI/DoubleSlider.cpp:1428 +#: src/slic3r/GUI/DoubleSlider.cpp:1497 msgid "" "Add color change - Left click for predefined color or Shift + Left click for " "custom color selection" @@ -1343,23 +1521,23 @@ msgstr "" "Színváltás hozzáadása - Bal egérgombbal kattintás előre definiált színhez, " "vagy Shift + Bal egérgombbal kattintás egyéni színválasztáshoz" -#: src/slic3r/GUI/DoubleSlider.cpp:1430 +#: src/slic3r/GUI/DoubleSlider.cpp:1499 msgid "Add color change - Left click" msgstr "Színváltás hozzáadása - Bal egérgombbal kattintás" -#: src/slic3r/GUI/DoubleSlider.cpp:1431 +#: src/slic3r/GUI/DoubleSlider.cpp:1500 msgid "or press \"+\" key" msgstr "vagy nyomja meg a \"+\" billentyűt" -#: src/slic3r/GUI/DoubleSlider.cpp:1433 +#: src/slic3r/GUI/DoubleSlider.cpp:1502 msgid "Add another code - Ctrl + Left click" msgstr "További kód hozzáadása - Ctrl + Bal egérgombbal kattintás" -#: src/slic3r/GUI/DoubleSlider.cpp:1434 +#: src/slic3r/GUI/DoubleSlider.cpp:1503 msgid "Add another code - Right click" msgstr "További kód hozzáadása - Jobb egérgombbal kattintás" -#: src/slic3r/GUI/DoubleSlider.cpp:1440 +#: src/slic3r/GUI/DoubleSlider.cpp:1509 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing " @@ -1370,40 +1548,40 @@ msgstr "" "Ilyenkor nem lehet az objektumokhoz egyéni G-kódot adni.\n" "Ez a kód nem kerül feldolgozásra a G-kód generálásakor." -#: src/slic3r/GUI/DoubleSlider.cpp:1458 +#: src/slic3r/GUI/DoubleSlider.cpp:1527 msgid "continue" msgstr "folytatás" -#: src/slic3r/GUI/DoubleSlider.cpp:1466 +#: src/slic3r/GUI/DoubleSlider.cpp:1535 #, boost-format msgid "Color change (\"%1%\")" msgstr "Színváltás (\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1467 +#: src/slic3r/GUI/DoubleSlider.cpp:1536 #, boost-format msgid "Color change (\"%1%\") for Extruder %2%" msgstr "Színváltás (\"%1%\") az Extruder %2% esetében" -#: src/slic3r/GUI/DoubleSlider.cpp:1469 +#: src/slic3r/GUI/DoubleSlider.cpp:1538 #, boost-format msgid "Pause print (\"%1%\")" msgstr "Nyomtatás Szüneteltetése (\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1471 +#: src/slic3r/GUI/DoubleSlider.cpp:1540 #, boost-format msgid "Custom template (\"%1%\")" msgstr "Egyedi sablon (\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1473 +#: src/slic3r/GUI/DoubleSlider.cpp:1542 #, boost-format msgid "Extruder (tool) is changed to Extruder \"%1%\"" msgstr "Az Extruder (szerszám) \"%1%\" Extruderre változott." -#: src/slic3r/GUI/DoubleSlider.cpp:1480 +#: src/slic3r/GUI/DoubleSlider.cpp:1549 msgid "Note" msgstr "Megjegyzés" -#: src/slic3r/GUI/DoubleSlider.cpp:1482 +#: src/slic3r/GUI/DoubleSlider.cpp:1551 msgid "" "G-code associated to this tick mark is in a conflict with print mode.\n" "Editing it will cause changes of Slider data." @@ -1411,7 +1589,7 @@ msgstr "" "Az ehhez a jelöléshez tartozó G-kód konfliktusban van a nyomtatási móddal.\n" "Szerkesztése a Csúszkák adatainak megváltozását okozza." -#: src/slic3r/GUI/DoubleSlider.cpp:1485 +#: src/slic3r/GUI/DoubleSlider.cpp:1554 msgid "" "There is a color change for extruder that won't be used till the end of " "print job.\n" @@ -1421,7 +1599,7 @@ msgstr "" "végéig nem használnak.\n" "Ez a kód nem kerül feldolgozásra a G-kód generálásakor." -#: src/slic3r/GUI/DoubleSlider.cpp:1488 +#: src/slic3r/GUI/DoubleSlider.cpp:1557 msgid "" "There is an extruder change set to the same extruder.\n" "This code won't be processed during G-code generation." @@ -1429,7 +1607,7 @@ msgstr "" "Az aktuáli extruderrel megegyező extruderre való váltás van beállítva.\n" "Ez a kód nem kerül feldolgozásra a G-kód generálásakor." -#: src/slic3r/GUI/DoubleSlider.cpp:1491 +#: src/slic3r/GUI/DoubleSlider.cpp:1560 msgid "" "There is a color change for extruder that has not been used before.\n" "Check your settings to avoid redundant color changes." @@ -1438,148 +1616,148 @@ msgstr "" "használtak.\n" "Ellenőrizze a beállításokat a felesleges színváltások elkerülése érdekében." -#: src/slic3r/GUI/DoubleSlider.cpp:1496 +#: src/slic3r/GUI/DoubleSlider.cpp:1565 msgid "Delete tick mark - Left click or press \"-\" key" msgstr "Jelölő törlése - Bal kattintás vagy \"-\" billentyű" -#: src/slic3r/GUI/DoubleSlider.cpp:1498 +#: src/slic3r/GUI/DoubleSlider.cpp:1567 msgid "Edit tick mark - Ctrl + Left click" msgstr "Jelölő szerkesztése - Ctrl + Bal kattintás" -#: src/slic3r/GUI/DoubleSlider.cpp:1499 +#: src/slic3r/GUI/DoubleSlider.cpp:1568 msgid "Edit tick mark - Right click" msgstr "Jelölő szerkesztése - Jobb kattintás" -#: src/slic3r/GUI/DoubleSlider.cpp:1602 src/slic3r/GUI/DoubleSlider.cpp:1633 -#: src/slic3r/GUI/GUI_Factories.cpp:778 +#: src/slic3r/GUI/DoubleSlider.cpp:1671 src/slic3r/GUI/DoubleSlider.cpp:1702 +#: src/slic3r/GUI/GUI_Factories.cpp:862 #, c-format, boost-format msgid "Extruder %d" msgstr "Extruder %d" -#: src/slic3r/GUI/DoubleSlider.cpp:1603 src/slic3r/GUI/GUI_Factories.cpp:779 +#: src/slic3r/GUI/DoubleSlider.cpp:1672 src/slic3r/GUI/GUI_Factories.cpp:863 msgid "active" msgstr "aktív" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 msgid "Switch code to Change extruder" msgstr "Kapcsolókód az Extruder váltáshoz" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Change extruder" msgstr "Extruder váltás" -#: src/slic3r/GUI/DoubleSlider.cpp:1613 +#: src/slic3r/GUI/DoubleSlider.cpp:1682 msgid "Change extruder (N/A)" msgstr "Extruder váltás (N/A)" -#: src/slic3r/GUI/DoubleSlider.cpp:1615 src/slic3r/GUI/GUI_Factories.cpp:787 +#: src/slic3r/GUI/DoubleSlider.cpp:1684 src/slic3r/GUI/GUI_Factories.cpp:871 msgid "Use another extruder" msgstr "Másik extruder használata" -#: src/slic3r/GUI/DoubleSlider.cpp:1634 +#: src/slic3r/GUI/DoubleSlider.cpp:1703 msgid "used" msgstr "használatban" -#: src/slic3r/GUI/DoubleSlider.cpp:1642 +#: src/slic3r/GUI/DoubleSlider.cpp:1711 #, boost-format msgid "Switch code to Color change (%1%) for:" msgstr "Váltókód színváltáshoz (%1%) a következőhöz:" -#: src/slic3r/GUI/DoubleSlider.cpp:1643 +#: src/slic3r/GUI/DoubleSlider.cpp:1712 #, boost-format msgid "Add color change (%1%) for:" msgstr "Színváltás hozzáadása (%1%) a következőkhöz:" -#: src/slic3r/GUI/DoubleSlider.cpp:1968 +#: src/slic3r/GUI/DoubleSlider.cpp:2037 msgid "Add color change" msgstr "Színváltás hozzáadása" -#: src/slic3r/GUI/DoubleSlider.cpp:1979 +#: src/slic3r/GUI/DoubleSlider.cpp:2048 msgid "Add pause print" msgstr "Nyomtatási szünet hozzáadása" -#: src/slic3r/GUI/DoubleSlider.cpp:1983 +#: src/slic3r/GUI/DoubleSlider.cpp:2052 msgid "Add custom template" msgstr "Egyéni sablon hozzáadása" -#: src/slic3r/GUI/DoubleSlider.cpp:1986 +#: src/slic3r/GUI/DoubleSlider.cpp:2055 msgid "Add custom G-code" msgstr "Egyedi G-kód hozzáadása" -#: src/slic3r/GUI/DoubleSlider.cpp:2004 +#: src/slic3r/GUI/DoubleSlider.cpp:2073 msgid "Edit color" msgstr "Szín szerkesztése" -#: src/slic3r/GUI/DoubleSlider.cpp:2005 +#: src/slic3r/GUI/DoubleSlider.cpp:2074 msgid "Edit pause print message" msgstr "Nyomtatási szünet üzenetének szerkesztése" -#: src/slic3r/GUI/DoubleSlider.cpp:2006 +#: src/slic3r/GUI/DoubleSlider.cpp:2075 msgid "Edit custom G-code" msgstr "Egyedi G-kód szerkesztése" -#: src/slic3r/GUI/DoubleSlider.cpp:2012 +#: src/slic3r/GUI/DoubleSlider.cpp:2081 msgid "Delete color change" msgstr "Színváltás törlése" -#: src/slic3r/GUI/DoubleSlider.cpp:2013 +#: src/slic3r/GUI/DoubleSlider.cpp:2082 msgid "Delete tool change" msgstr "Szerszám törlése" -#: src/slic3r/GUI/DoubleSlider.cpp:2014 +#: src/slic3r/GUI/DoubleSlider.cpp:2083 msgid "Delete pause print" msgstr "Nyomtatási szünet törlése" -#: src/slic3r/GUI/DoubleSlider.cpp:2015 +#: src/slic3r/GUI/DoubleSlider.cpp:2084 msgid "Delete custom G-code" msgstr "Egyedi G-kód törlése" -#: src/slic3r/GUI/DoubleSlider.cpp:2025 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:2094 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to height" msgstr "Ugrás a magassághoz" -#: src/slic3r/GUI/DoubleSlider.cpp:2030 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 msgid "Hide ruler" msgstr "Vonalzó elrejtése" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height" msgstr "Objektum magasságának megjelenítése" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height on the ruler" msgstr "Objektum magasságának megjelenítése a vonalzón" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time" msgstr "Becsült nyomtatási idő megjelenítése" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time on the ruler" msgstr "Becsült nyomtatási idő megjelenítése a vonalzón" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Ruler mode" msgstr "Vonalzó mód" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Set ruler mode" msgstr "Vonalzó mód beállítása" -#: src/slic3r/GUI/DoubleSlider.cpp:2047 +#: src/slic3r/GUI/DoubleSlider.cpp:2116 msgid "Set extruder sequence for the entire print" msgstr "Extruder sorrend beállítása a teljes nyomtatáshoz" -#: src/slic3r/GUI/DoubleSlider.cpp:2051 +#: src/slic3r/GUI/DoubleSlider.cpp:2120 msgid "Set auto color changes" msgstr "Automatikus színváltás beállítása" -#: src/slic3r/GUI/DoubleSlider.cpp:2086 +#: src/slic3r/GUI/DoubleSlider.cpp:2155 msgid "This action will cause deletion of all ticks on vertical slider." msgstr "" "Ez a művelet a függőleges csúszkán lévő összes jelölő törléséhez vezet." -#: src/slic3r/GUI/DoubleSlider.cpp:2087 src/slic3r/GUI/Tab.cpp:1318 +#: src/slic3r/GUI/DoubleSlider.cpp:2156 src/slic3r/GUI/Tab.cpp:1263 msgid "" "This action is not revertible.\n" "Do you want to proceed?" @@ -1587,64 +1765,66 @@ msgstr "" "Ez a művelet nem visszavonható.\n" "Akarja folytatni?" -#: src/slic3r/GUI/DoubleSlider.cpp:2088 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1133 src/slic3r/GUI/GUI.cpp:245 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:649 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:679 -#: src/slic3r/GUI/WipeTowerDialog.cpp:58 src/slic3r/GUI/WipeTowerDialog.cpp:443 +#: src/slic3r/GUI/DoubleSlider.cpp:2157 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:537 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1119 src/slic3r/GUI/GUI.cpp:258 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:721 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:751 +#: src/slic3r/GUI/WipeTowerDialog.cpp:60 src/slic3r/GUI/WipeTowerDialog.cpp:445 msgid "Warning" msgstr "Figyelmeztetés" -#: src/slic3r/GUI/DoubleSlider.cpp:2216 +#: src/slic3r/GUI/DoubleSlider.cpp:2285 msgid "Enter custom G-code used on current layer" msgstr "Adja meg az aktuális rétegen használt egyéni G-kódot" -#: src/slic3r/GUI/DoubleSlider.cpp:2217 +#: src/slic3r/GUI/DoubleSlider.cpp:2286 #, boost-format msgid "Custom G-code on current layer (%1% mm)." msgstr "Egyedi G-kód az aktuális rétegen (%1% mm)." -#: src/slic3r/GUI/DoubleSlider.cpp:2238 +#: src/slic3r/GUI/DoubleSlider.cpp:2307 msgid "Enter short message shown on Printer display when a print is paused" msgstr "" "A nyomtatás szüneteltetésekor a nyomtató kijelzőjén megjelenő rövid üzenet " "megadása" -#: src/slic3r/GUI/DoubleSlider.cpp:2239 +#: src/slic3r/GUI/DoubleSlider.cpp:2308 #, boost-format msgid "Message for pause print on current layer (%1% mm)." msgstr "Üzenet a nyomtatás szüneteltetésekor az aktuális rétegen (%1% mm)." -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the move you want to jump to" msgstr "Adja meg a mozdulatot, amelyre ugrani szeretne" -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the height you want to jump to" msgstr "Adja meg a magasságot, amelyre ugrani szeretne" -#: src/slic3r/GUI/DoubleSlider.cpp:2515 +#: src/slic3r/GUI/DoubleSlider.cpp:2584 msgid "The last color change data was saved for a single extruder printing." msgstr "" "Az utolsó színváltási adatokat egyetlen extruderrel történő nyomtatáshoz " "mentették el." -#: src/slic3r/GUI/DoubleSlider.cpp:2516 src/slic3r/GUI/DoubleSlider.cpp:2532 +#: src/slic3r/GUI/DoubleSlider.cpp:2585 src/slic3r/GUI/DoubleSlider.cpp:2601 msgid "The last color change data was saved for a multi extruder printing." msgstr "" "Az utolsó színváltási adatokat több extruderrel történő nyomtatáshoz " "mentették el." -#: src/slic3r/GUI/DoubleSlider.cpp:2518 +#: src/slic3r/GUI/DoubleSlider.cpp:2587 msgid "Your current changes will delete all saved color changes." msgstr "" "Az aktuális módosítások törlik az összes korábban elmentett színváltást." -#: src/slic3r/GUI/DoubleSlider.cpp:2519 src/slic3r/GUI/DoubleSlider.cpp:2540 +#: src/slic3r/GUI/DoubleSlider.cpp:2588 src/slic3r/GUI/DoubleSlider.cpp:2609 msgid "Are you sure you want to continue?" msgstr "Biztos, hogy folytatni akarja?" -#: src/slic3r/GUI/DoubleSlider.cpp:2533 +#: src/slic3r/GUI/DoubleSlider.cpp:2602 msgid "" "Select YES if you want to delete all saved tool changes, \n" "NO if you want all tool changes switch to color changes, \n" @@ -1655,11 +1835,11 @@ msgstr "" "NEM, ha azt szeretné, hogy az összes szerszámváltás színváltásra váltson, \n" "vagy a VISSZAVONÁS lehetőséget, ha változatlanul szeretné hagyni." -#: src/slic3r/GUI/DoubleSlider.cpp:2536 +#: src/slic3r/GUI/DoubleSlider.cpp:2605 msgid "Do you want to delete all saved tool changes?" msgstr "Törölni szeretné az összes mentett szerszámváltást?" -#: src/slic3r/GUI/DoubleSlider.cpp:2538 +#: src/slic3r/GUI/DoubleSlider.cpp:2607 msgid "" "The last color change data was saved for a multi extruder printing with tool " "changes for whole print." @@ -1667,20 +1847,34 @@ msgstr "" "Az utolsó színváltási adatok több extruderrel történő nyomtatáshoz a teljes " "nyomtatásra vonatkozó szerszámváltásokkal együtt elmentésre kerültek." -#: src/slic3r/GUI/DoubleSlider.cpp:2539 +#: src/slic3r/GUI/DoubleSlider.cpp:2608 msgid "Your current changes will delete all saved extruder (tool) changes." msgstr "" "Az aktuális módosításai törlik az összes mentett Extruder (eszköz) " "módosítást." -#: src/slic3r/GUI/ExtraRenderers.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:538 -#: src/slic3r/GUI/GUI_ObjectList.cpp:550 src/slic3r/GUI/GUI_ObjectList.cpp:979 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4291 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:250 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:352 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:376 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:607 src/libslic3r/PrintConfig.cpp:800 +#: src/slic3r/GUI/Downloader.cpp:150 +#, boost-format +msgid "" +"Download won't start. Download URL doesn't point to https://files.printables." +"com : %1%" +msgstr "" + +#: src/slic3r/GUI/Downloader.cpp:181 +msgid "The download has failed:" +msgstr "" + +#: src/slic3r/GUI/DownloaderFileGet.cpp:193 +#, boost-format +msgid "Can't create file at %1%." +msgstr "" + +#: src/slic3r/GUI/ExtraRenderers.cpp:323 src/slic3r/GUI/GUI_ObjectList.cpp:571 +#: src/slic3r/GUI/GUI_ObjectList.cpp:583 src/slic3r/GUI/GUI_ObjectList.cpp:1043 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2125 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3013 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4884 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:259 src/libslic3r/PrintConfig.cpp:894 msgid "default" msgstr "alapértelmezett" @@ -1693,10 +1887,10 @@ msgid "Set extruder change for every" msgstr "Extruder sorrend beállítás az összesre" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:60 -#: src/libslic3r/PrintConfig.cpp:662 src/libslic3r/PrintConfig.cpp:1430 -#: src/libslic3r/PrintConfig.cpp:2135 src/libslic3r/PrintConfig.cpp:2310 -#: src/libslic3r/PrintConfig.cpp:2386 src/libslic3r/PrintConfig.cpp:2639 -#: src/libslic3r/PrintConfig.cpp:2687 src/libslic3r/PrintConfig.cpp:2706 +#: src/libslic3r/PrintConfig.cpp:765 src/libslic3r/PrintConfig.cpp:1476 +#: src/libslic3r/PrintConfig.cpp:2165 src/libslic3r/PrintConfig.cpp:2343 +#: src/libslic3r/PrintConfig.cpp:2417 src/libslic3r/PrintConfig.cpp:2665 +#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2728 msgid "layers" msgstr "réteg(nél)" @@ -1732,26 +1926,26 @@ msgstr "Extruder elávolítása a sorozatból" msgid "Add extruder to sequence" msgstr "Extruder hozzáadása a sorozathoz" -#: src/slic3r/GUI/Field.cpp:190 +#: src/slic3r/GUI/Field.cpp:188 msgid "default value" msgstr "alapértelmezett érték" -#: src/slic3r/GUI/Field.cpp:193 +#: src/slic3r/GUI/Field.cpp:191 msgid "parameter name" msgstr "paraméter név" -#: src/slic3r/GUI/Field.cpp:204 src/slic3r/GUI/OptionsGroup.cpp:827 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1067 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1079 +#: src/slic3r/GUI/Field.cpp:206 src/slic3r/GUI/OptionsGroup.cpp:852 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1074 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1086 msgid "N/A" msgstr "N/A" -#: src/slic3r/GUI/Field.cpp:226 src/slic3r/GUI/Field.cpp:298 +#: src/slic3r/GUI/Field.cpp:229 src/slic3r/GUI/Field.cpp:302 #, c-format, boost-format msgid "%s doesn't support percentage" msgstr "%s nem támogatja a százalékot" -#: src/slic3r/GUI/Field.cpp:266 +#: src/slic3r/GUI/Field.cpp:269 #, c-format, boost-format msgid "" "Input value is out of range\n" @@ -1760,16 +1954,16 @@ msgstr "" "A bemeneti érték kívül esik a tartományon\n" "Biztos benne, hogy %s a helyes érték, és folytatni szeretné?" -#: src/slic3r/GUI/Field.cpp:269 src/slic3r/GUI/Field.cpp:343 +#: src/slic3r/GUI/Field.cpp:272 src/slic3r/GUI/Field.cpp:347 msgid "Parameter validation" msgstr "Paraméter hitelesítés" -#: src/slic3r/GUI/Field.cpp:282 src/slic3r/GUI/Field.cpp:390 -#: src/slic3r/GUI/Field.cpp:1573 +#: src/slic3r/GUI/Field.cpp:285 src/slic3r/GUI/Field.cpp:394 +#: src/slic3r/GUI/Field.cpp:1597 msgid "Input value is out of range" msgstr "A bemeneti érték kívül esik a tartományon" -#: src/slic3r/GUI/Field.cpp:340 +#: src/slic3r/GUI/Field.cpp:344 #, c-format, boost-format msgid "" "Do you mean %s%% instead of %s %s?\n" @@ -1781,7 +1975,7 @@ msgstr "" "módosítani, \n" "vagy a NEM-et, ha biztos benne, hogy %s %s a helyes érték." -#: src/slic3r/GUI/Field.cpp:397 +#: src/slic3r/GUI/Field.cpp:401 #, boost-format msgid "" "Invalid input format. Expected vector of dimensions in the following format: " @@ -1790,6 +1984,15 @@ msgstr "" "Érvénytelen bemeneti formátum. A méretek vektora a következő formátumban " "lenne érvényes: \"%1%\"" +#: src/slic3r/GUI/FileArchiveDialog.cpp:170 +msgid "Archive preview" +msgstr "" + +#: src/slic3r/GUI/FileArchiveDialog.cpp:270 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +msgid "Open" +msgstr "" + #: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flash!" msgstr "Feltöltés!" @@ -1877,12 +2080,6 @@ msgstr "Firmware kép:" msgid "Select a file" msgstr "Válasszon egy fájlt" -#: src/slic3r/GUI/FirmwareDialog.cpp:815 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:297 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:372 -msgid "Browse" -msgstr "Tallózás" - #: src/slic3r/GUI/FirmwareDialog.cpp:817 msgid "Serial port:" msgstr "Soros port:" @@ -1912,10 +2109,10 @@ msgid "Advanced: Output log" msgstr "Haladó: Kimeneti napló" #: src/slic3r/GUI/FirmwareDialog.cpp:862 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:310 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:358 #: src/slic3r/GUI/Mouse3DController.cpp:543 -#: src/slic3r/GUI/PrintHostDialogs.cpp:261 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:122 +#: src/slic3r/GUI/PrintHostDialogs.cpp:313 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:125 msgid "Close" msgstr "Bezárás" @@ -1935,7 +2132,7 @@ msgstr "Megerősítés" msgid "Cancelling..." msgstr "Visszavonás..." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1488 msgid "Shape Gallery" msgstr "Alakzat Galéria" @@ -1943,38 +2140,43 @@ msgstr "Alakzat Galéria" msgid "Select shape from the gallery" msgstr "Alakzat választása a galériából" -#: src/slic3r/GUI/GalleryDialog.cpp:100 -msgid "Add to bed" -msgstr "Hozzáadás a tárgyasztalhoz" - -#: src/slic3r/GUI/GalleryDialog.cpp:101 -msgid "Add selected shape(s) to the bed" -msgstr "Kijelölt alakzat(ok) hozzáadása a tárgyasztalhoz" - -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4152 +#: src/slic3r/GUI/GalleryDialog.cpp:114 src/slic3r/GUI/Tab.cpp:4377 msgid "Add" msgstr "Hozzáadás" -#: src/slic3r/GUI/GalleryDialog.cpp:117 +#: src/slic3r/GUI/GalleryDialog.cpp:114 msgid "Add one or more custom shapes" msgstr "Egy vagy több egyedi alakzat hozzáadása" -#: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:506 -#: src/slic3r/GUI/GLCanvas3D.cpp:4547 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/GalleryDialog.cpp:115 src/slic3r/GUI/GalleryDialog.cpp:528 +#: src/slic3r/GUI/GLCanvas3D.cpp:4638 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/GUI_Factories.cpp:460 src/slic3r/GUI/Tab.cpp:3973 msgid "Delete" msgstr "Törlés" -#: src/slic3r/GUI/GalleryDialog.cpp:118 +#: src/slic3r/GUI/GalleryDialog.cpp:115 msgid "Delete one or more custom shape. You can't delete system shapes" msgstr "" "Egy vagy több egyedi alakzat törlése. Rendszer alakzatokat nem tud törölni" -#: src/slic3r/GUI/GalleryDialog.cpp:400 +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "Add to bed" +msgstr "Hozzáadás a tárgyasztalhoz" + +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "OK" +msgstr "Ok" + +#: src/slic3r/GUI/GalleryDialog.cpp:143 +msgid "Add selected shape(s) to the bed" +msgstr "Kijelölt alakzat(ok) hozzáadása a tárgyasztalhoz" + +#: src/slic3r/GUI/GalleryDialog.cpp:422 msgid "Choose one or more files (STL, OBJ):" msgstr "Egy vagy több fájl kiválasztása (STL, OBJ):" -#: src/slic3r/GUI/GalleryDialog.cpp:440 +#: src/slic3r/GUI/GalleryDialog.cpp:462 #, boost-format msgid "" "It looks like selected %1%-file has an error or is destructed.\n" @@ -1983,551 +2185,527 @@ msgstr "" "Úgy tűnik, hogy a kiválasztott %1%-fájl hibás vagy megsemmisült.\n" "Nem tudjuk betölteni ezt a fájlt" -#: src/slic3r/GUI/GalleryDialog.cpp:451 +#: src/slic3r/GUI/GalleryDialog.cpp:473 msgid "Choose one PNG file:" msgstr "Válasszon egy PNG-fájlt:" -#: src/slic3r/GUI/GalleryDialog.cpp:464 +#: src/slic3r/GUI/GalleryDialog.cpp:486 msgid "Replacing of the PNG" msgstr "A PNG cseréje" -#: src/slic3r/GUI/GalleryDialog.cpp:508 +#: src/slic3r/GUI/GalleryDialog.cpp:530 msgid "Change thumbnail" msgstr "Bélyegkép módosítása" -#: src/slic3r/GUI/GalleryDialog.cpp:549 src/slic3r/GUI/GalleryDialog.cpp:554 +#: src/slic3r/GUI/GalleryDialog.cpp:571 src/slic3r/GUI/GalleryDialog.cpp:576 #, boost-format msgid "Loading of the \"%1%\"" msgstr "\"%1%\" betöltése" -#: src/slic3r/GUI/GCodeViewer.cpp:274 +#: src/slic3r/GUI/GCodeViewer.cpp:343 msgid "Tool position" msgstr "Szerszám pozíció" -#: src/slic3r/GUI/GCodeViewer.cpp:1457 +#: src/slic3r/GUI/GCodeViewer.cpp:1547 msgid "Generating toolpaths" msgstr "Szerszámpályák generálása" -#: src/slic3r/GUI/GCodeViewer.cpp:1517 +#: src/slic3r/GUI/GCodeViewer.cpp:1619 msgid "Generating vertex buffer" msgstr "Vertex puffer generálása" -#: src/slic3r/GUI/GCodeViewer.cpp:1857 +#: src/slic3r/GUI/GCodeViewer.cpp:1979 msgid "Generating index buffers" msgstr "Index puffer generálása" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to hide" msgstr "Kattintás az elrejtéshez" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to show" msgstr "Kattintás a megjelenítéshez" -#: src/slic3r/GUI/GCodeViewer.cpp:3181 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 msgid "up to" msgstr "legfeljebb" -#: src/slic3r/GUI/GCodeViewer.cpp:3187 +#: src/slic3r/GUI/GCodeViewer.cpp:3455 msgid "above" msgstr "felett" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "from" msgstr "tól" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "to" msgstr "hoz_" -#: src/slic3r/GUI/GCodeViewer.cpp:3245 src/slic3r/GUI/GCodeViewer.cpp:3246 -#: src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3513 src/slic3r/GUI/GCodeViewer.cpp:3514 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 msgid "Percentage" msgstr "Százalék" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3570 msgid "Feature type" msgstr "Részelem típus" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3592 #: src/slic3r/GUI/RammingChart.cpp:90 msgid "Time" msgstr "Idő" -#: src/slic3r/GUI/GCodeViewer.cpp:3295 src/slic3r/GUI/GCodeViewer.cpp:3306 -#: src/slic3r/GUI/GCodeViewer.cpp:3566 -msgid "Used filament" -msgstr "Felhasznált filament" - -#: src/slic3r/GUI/GCodeViewer.cpp:3298 +#: src/slic3r/GUI/GCodeViewer.cpp:3571 msgid "Height (mm)" msgstr "Magasság (mm)" -#: src/slic3r/GUI/GCodeViewer.cpp:3299 +#: src/slic3r/GUI/GCodeViewer.cpp:3572 msgid "Width (mm)" msgstr "Szélesség (mm)" -#: src/slic3r/GUI/GCodeViewer.cpp:3300 +#: src/slic3r/GUI/GCodeViewer.cpp:3573 msgid "Speed (mm/s)" msgstr "Sebesség (mm/s)" -#: src/slic3r/GUI/GCodeViewer.cpp:3301 -msgid "Fan Speed (%)" -msgstr "Ventillátor Sebesség (%)" +#: src/slic3r/GUI/GCodeViewer.cpp:3574 +msgid "Fan speed (%)" +msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3302 +#: src/slic3r/GUI/GCodeViewer.cpp:3575 msgid "Temperature (°C)" msgstr "Hőmérséklet (°C)" -#: src/slic3r/GUI/GCodeViewer.cpp:3303 +#: src/slic3r/GUI/GCodeViewer.cpp:3576 msgid "Volumetric flow rate (mm³/s)" msgstr "Térfogatáram (mm³/s)" -#: src/slic3r/GUI/GCodeViewer.cpp:3306 src/slic3r/GUI/GUI_Preview.cpp:224 -#: src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3577 +msgid "Layer time (linear)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3578 +msgid "Layer time (logarithmic)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3579 msgid "Tool" msgstr "Eszköz" -#: src/slic3r/GUI/GCodeViewer.cpp:3309 src/slic3r/GUI/GUI_Preview.cpp:225 -#: src/slic3r/GUI/GUI_Preview.cpp:957 +#: src/slic3r/GUI/GCodeViewer.cpp:3580 msgid "Color Print" msgstr "Színes nyomtatás" -#: src/slic3r/GUI/GCodeViewer.cpp:3347 src/slic3r/GUI/GCodeViewer.cpp:3393 -#: src/slic3r/GUI/GCodeViewer.cpp:3398 src/slic3r/GUI/GUI_ObjectList.cpp:312 -#: src/slic3r/GUI/wxExtensions.cpp:536 src/libslic3r/PrintConfig.cpp:795 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 src/slic3r/GUI/GCodeViewer.cpp:3594 +#: src/slic3r/GUI/GCodeViewer.cpp:3860 +msgid "Used filament" +msgstr "Felhasznált filament" + +#: src/slic3r/GUI/GCodeViewer.cpp:3623 src/slic3r/GUI/GCodeViewer.cpp:4067 +#: src/libslic3r/PrintConfig.cpp:3025 +msgid "Travel" +msgstr "Utazás" + +#: src/slic3r/GUI/GCodeViewer.cpp:3640 src/slic3r/GUI/GCodeViewer.cpp:3685 +#: src/slic3r/GUI/GCodeViewer.cpp:3689 src/slic3r/GUI/GUI_ObjectList.cpp:338 +#: src/slic3r/GUI/wxExtensions.cpp:547 src/libslic3r/PrintConfig.cpp:888 msgid "Extruder" msgstr "Extruder" -#: src/slic3r/GUI/GCodeViewer.cpp:3370 +#: src/slic3r/GUI/GCodeViewer.cpp:3662 msgid "Default color" msgstr "Alapértelmezett szín" -#: src/slic3r/GUI/GCodeViewer.cpp:3393 +#: src/slic3r/GUI/GCodeViewer.cpp:3685 msgid "default color" msgstr "alapértelmezett szín" -#: src/slic3r/GUI/GCodeViewer.cpp:3491 src/slic3r/GUI/GCodeViewer.cpp:3547 +#: src/slic3r/GUI/GCodeViewer.cpp:3785 src/slic3r/GUI/GCodeViewer.cpp:3841 msgid "Color change" msgstr "Szín változtatás" -#: src/slic3r/GUI/GCodeViewer.cpp:3510 src/slic3r/GUI/GCodeViewer.cpp:3545 +#: src/slic3r/GUI/GCodeViewer.cpp:3804 src/slic3r/GUI/GCodeViewer.cpp:3839 msgid "Print" msgstr "Nyomtatás" -#: src/slic3r/GUI/GCodeViewer.cpp:3546 src/slic3r/GUI/GCodeViewer.cpp:3580 +#: src/slic3r/GUI/GCodeViewer.cpp:3840 src/slic3r/GUI/GCodeViewer.cpp:3874 msgid "Pause" msgstr "Felfüggesztés" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Event" msgstr "Esemény" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Remaining time" msgstr "Hátralévő idő" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Duration" msgstr "Időtartam" -#: src/slic3r/GUI/GCodeViewer.cpp:3609 src/slic3r/GUI/GUI_Preview.cpp:1049 -#: src/libslic3r/PrintConfig.cpp:2937 -msgid "Travel" -msgstr "Utazás" - -#: src/slic3r/GUI/GCodeViewer.cpp:3612 -msgid "Movement" -msgstr "Mozgás" - -#: src/slic3r/GUI/GCodeViewer.cpp:3613 -msgid "Extrusion" -msgstr "Extrudálás" - -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1870 -#: src/slic3r/GUI/Tab.cpp:2812 -msgid "Retraction" -msgstr "Visszahúzás" - -#: src/slic3r/GUI/GCodeViewer.cpp:3631 src/slic3r/GUI/GCodeViewer.cpp:3634 -#: src/slic3r/GUI/GUI_Preview.cpp:1050 -msgid "Wipe" -msgstr "Törlés" - -#: src/slic3r/GUI/GCodeViewer.cpp:3666 src/slic3r/GUI/GUI_Preview.cpp:257 -#: src/slic3r/GUI/GUI_Preview.cpp:272 -msgid "Options" -msgstr "Opciók" - -#: src/slic3r/GUI/GCodeViewer.cpp:3669 src/slic3r/GUI/GUI_Preview.cpp:1051 -msgid "Retractions" -msgstr "Visszahúzások" - -#: src/slic3r/GUI/GCodeViewer.cpp:3670 src/slic3r/GUI/GUI_Preview.cpp:1052 -msgid "Deretractions" -msgstr "Előretolások_" - -#: src/slic3r/GUI/GCodeViewer.cpp:3671 src/slic3r/GUI/GUI_Preview.cpp:1053 -msgid "Seams" -msgstr "Varratok" - -#: src/slic3r/GUI/GCodeViewer.cpp:3672 src/slic3r/GUI/GUI_Preview.cpp:1054 -msgid "Tool changes" -msgstr "Eszköz váltások" - -#: src/slic3r/GUI/GCodeViewer.cpp:3673 src/slic3r/GUI/GUI_Preview.cpp:1055 -msgid "Color changes" -msgstr "Szín váltások" - -#: src/slic3r/GUI/GCodeViewer.cpp:3674 src/slic3r/GUI/GUI_Preview.cpp:1056 -msgid "Print pauses" -msgstr "Nyomtátási szünetek" - -#: src/slic3r/GUI/GCodeViewer.cpp:3675 src/slic3r/GUI/GUI_Preview.cpp:1057 -msgid "Custom G-codes" -msgstr "Egyedi G-kódok" - -#: src/slic3r/GUI/GCodeViewer.cpp:3695 src/slic3r/GUI/GCodeViewer.cpp:3714 -#: src/slic3r/GUI/GUI.cpp:341 src/slic3r/GUI/Plater.cpp:822 -#: src/libslic3r/PrintConfig.cpp:322 +#: src/slic3r/GUI/GCodeViewer.cpp:3928 src/slic3r/GUI/GUI.cpp:332 +#: src/slic3r/GUI/Plater.cpp:852 src/libslic3r/PrintConfig.cpp:335 msgid "Printer" msgstr "Nyomtató" -#: src/slic3r/GUI/GCodeViewer.cpp:3697 src/slic3r/GUI/GCodeViewer.cpp:3719 -#: src/slic3r/GUI/GUI.cpp:337 src/slic3r/GUI/Plater.cpp:818 +#: src/slic3r/GUI/GCodeViewer.cpp:3931 src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/Plater.cpp:848 msgid "Print settings" msgstr "Nyomtatási beállítások" -#: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 -#: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1970 src/slic3r/GUI/Tab.cpp:1971 +#: src/slic3r/GUI/GCodeViewer.cpp:3936 src/slic3r/GUI/GUI.cpp:330 +#: src/slic3r/GUI/Plater.cpp:849 src/slic3r/GUI/Tab.cpp:1930 +#: src/slic3r/GUI/Tab.cpp:1931 msgid "Filament" msgstr "Filament" -#: src/slic3r/GUI/GCodeViewer.cpp:3739 +#: src/slic3r/GUI/GCodeViewer.cpp:3950 msgid "Estimated printing times" msgstr "Becsült nyomtatási idő" -#: src/slic3r/GUI/GCodeViewer.cpp:3758 +#: src/slic3r/GUI/GCodeViewer.cpp:3969 msgid "Normal mode" msgstr "Normál mód" -#: src/slic3r/GUI/GCodeViewer.cpp:3759 +#: src/slic3r/GUI/GCodeViewer.cpp:3970 msgid "Stealth mode" msgstr "Lopakodó mód" -#: src/slic3r/GUI/GCodeViewer.cpp:3766 src/libslic3r/PrintConfig.cpp:1189 -#: src/libslic3r/PrintConfig.cpp:1207 src/libslic3r/PrintConfig.cpp:1217 -#: src/libslic3r/PrintConfig.cpp:1262 +#: src/slic3r/GUI/GCodeViewer.cpp:3979 src/libslic3r/PrintConfig.cpp:1249 +#: src/libslic3r/PrintConfig.cpp:1267 src/libslic3r/PrintConfig.cpp:1277 +#: src/libslic3r/PrintConfig.cpp:1322 msgid "First layer" msgstr "Első réteg" -#: src/slic3r/GUI/GCodeViewer.cpp:3767 +#: src/slic3r/GUI/GCodeViewer.cpp:3983 msgid "Total" msgstr "Összes" -#: src/slic3r/GUI/GCodeViewer.cpp:3796 +#: src/slic3r/GUI/GCodeViewer.cpp:4002 msgid "Show stealth mode" msgstr "Lopakodó mód mutatása" -#: src/slic3r/GUI/GCodeViewer.cpp:3800 +#: src/slic3r/GUI/GCodeViewer.cpp:4006 msgid "Show normal mode" msgstr "Normál mód mutatása" -#: src/slic3r/GUI/GLCanvas3D.cpp:225 src/slic3r/GUI/GLCanvas3D.cpp:4694 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:53 -msgid "Variable layer height" -msgstr "Változó rétegmagasság" +#: src/slic3r/GUI/GCodeViewer.cpp:4071 +msgid "Wipe" +msgstr "Törlés" -#: src/slic3r/GUI/GLCanvas3D.cpp:227 -msgid "Left mouse button:" -msgstr "Bal egérgomb:" +#: src/slic3r/GUI/GCodeViewer.cpp:4075 +msgid "Retractions" +msgstr "Visszahúzások" -#: src/slic3r/GUI/GLCanvas3D.cpp:229 -msgid "Add detail" -msgstr "Részlet hozzáadása" +#: src/slic3r/GUI/GCodeViewer.cpp:4079 +msgid "Deretractions" +msgstr "Előretolások_" -#: src/slic3r/GUI/GLCanvas3D.cpp:231 -msgid "Right mouse button:" -msgstr "Jobb egérgomb:" +#: src/slic3r/GUI/GCodeViewer.cpp:4083 +msgid "Seams" +msgstr "Varratok" -#: src/slic3r/GUI/GLCanvas3D.cpp:233 +#: src/slic3r/GUI/GCodeViewer.cpp:4087 +msgid "Tool changes" +msgstr "Eszköz váltások" + +#: src/slic3r/GUI/GCodeViewer.cpp:4091 +msgid "Color changes" +msgstr "Szín váltások" + +#: src/slic3r/GUI/GCodeViewer.cpp:4095 +msgid "Print pauses" +msgstr "Nyomtátási szünetek" + +#: src/slic3r/GUI/GCodeViewer.cpp:4099 +msgid "Custom G-codes" +msgstr "Egyedi G-kódok" + +#: src/slic3r/GUI/GCodeViewer.cpp:4103 +msgid "Center of gravity" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:4108 +msgid "Shells" +msgstr "Héjak" + +#: src/slic3r/GUI/GCodeViewer.cpp:4113 +msgid "Tool marker" +msgstr "Szerszám jelölő" + +#: src/slic3r/GUI/GLCanvas3D.cpp:185 src/slic3r/GUI/GLCanvas3D.cpp:4784 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:71 +msgid "Variable layer height" +msgstr "Változó rétegmagasság" + +#: src/slic3r/GUI/GLCanvas3D.cpp:187 +msgid "Left mouse button:" +msgstr "Bal egérgomb:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:189 +msgid "Add detail" +msgstr "Részlet hozzáadása" + +#: src/slic3r/GUI/GLCanvas3D.cpp:191 +msgid "Right mouse button:" +msgstr "Jobb egérgomb:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:193 msgid "Remove detail" msgstr "Részlet eltávolítása" -#: src/slic3r/GUI/GLCanvas3D.cpp:235 +#: src/slic3r/GUI/GLCanvas3D.cpp:195 msgid "Shift + Left mouse button:" msgstr "Shift + Bal egérgomb:" -#: src/slic3r/GUI/GLCanvas3D.cpp:237 +#: src/slic3r/GUI/GLCanvas3D.cpp:197 msgid "Reset to base" msgstr "Alaphelyzetbe állítás" -#: src/slic3r/GUI/GLCanvas3D.cpp:239 +#: src/slic3r/GUI/GLCanvas3D.cpp:199 msgid "Shift + Right mouse button:" msgstr "Shift + Jobb egérgomb:" -#: src/slic3r/GUI/GLCanvas3D.cpp:241 +#: src/slic3r/GUI/GLCanvas3D.cpp:201 msgid "Smoothing" msgstr "Simítás" -#: src/slic3r/GUI/GLCanvas3D.cpp:243 +#: src/slic3r/GUI/GLCanvas3D.cpp:203 msgid "Mouse wheel:" msgstr "Egér görgő:" -#: src/slic3r/GUI/GLCanvas3D.cpp:245 +#: src/slic3r/GUI/GLCanvas3D.cpp:205 msgid "Increase/decrease edit area" msgstr "Szerkesztési terület növelése/csökkentése" -#: src/slic3r/GUI/GLCanvas3D.cpp:248 +#: src/slic3r/GUI/GLCanvas3D.cpp:208 msgid "Adaptive" msgstr "Adaptív" -#: src/slic3r/GUI/GLCanvas3D.cpp:254 +#: src/slic3r/GUI/GLCanvas3D.cpp:214 msgid "Quality / Speed" msgstr "Minőség / Sebesség" -#: src/slic3r/GUI/GLCanvas3D.cpp:257 +#: src/slic3r/GUI/GLCanvas3D.cpp:217 msgid "Higher print quality versus higher print speed." msgstr "Jobb nyomtatási minőség vagy nagyobb nyomtatási sebesség." -#: src/slic3r/GUI/GLCanvas3D.cpp:268 +#: src/slic3r/GUI/GLCanvas3D.cpp:228 msgid "Smooth" msgstr "Sima" -#: src/slic3r/GUI/GLCanvas3D.cpp:274 src/libslic3r/PrintConfig.cpp:819 +#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/libslic3r/PrintConfig.cpp:908 msgid "Radius" msgstr "Sugár" -#: src/slic3r/GUI/GLCanvas3D.cpp:286 +#: src/slic3r/GUI/GLCanvas3D.cpp:246 msgid "Keep min" msgstr "Min. megtartása" -#: src/slic3r/GUI/GLCanvas3D.cpp:295 src/slic3r/GUI/GLCanvas3D.cpp:4123 +#: src/slic3r/GUI/GLCanvas3D.cpp:255 src/slic3r/GUI/GLCanvas3D.cpp:4217 msgid "Reset" msgstr "Visszaállítás" -#: src/slic3r/GUI/GLCanvas3D.cpp:561 +#: src/slic3r/GUI/GLCanvas3D.cpp:602 msgid "Variable layer height - Manual edit" msgstr "Változó rétegmagasság - Kézi szerkesztés" -#: src/slic3r/GUI/GLCanvas3D.cpp:676 +#: src/slic3r/GUI/GLCanvas3D.cpp:717 msgid "Seq." msgstr "Seq." -#: src/slic3r/GUI/GLCanvas3D.cpp:1310 +#: src/slic3r/GUI/GLCanvas3D.cpp:1319 msgid "Variable layer height - Reset" msgstr "Változó rétegmagasság - Reset" -#: src/slic3r/GUI/GLCanvas3D.cpp:1318 +#: src/slic3r/GUI/GLCanvas3D.cpp:1327 msgid "Variable layer height - Adaptive" msgstr "Változó rétegmagasság - Adaptív" -#: src/slic3r/GUI/GLCanvas3D.cpp:1326 +#: src/slic3r/GUI/GLCanvas3D.cpp:1335 msgid "Variable layer height - Smooth all" msgstr "Változó rétegmagasság - Sima összes" -#: src/slic3r/GUI/GLCanvas3D.cpp:1733 +#: src/slic3r/GUI/GLCanvas3D.cpp:1778 msgid "Mirror Object" msgstr "Objektum Tükrözése" -#: src/slic3r/GUI/GLCanvas3D.cpp:2612 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:560 +#: src/slic3r/GUI/GLCanvas3D.cpp:2542 src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:117 msgid "Gizmo-Move" msgstr "Gizmo-Mozgatása" -#: src/slic3r/GUI/GLCanvas3D.cpp:2695 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562 +#: src/slic3r/GUI/GLCanvas3D.cpp:2638 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:661 msgid "Gizmo-Rotate" msgstr "Gizmo-Forgatása" -#: src/slic3r/GUI/GLCanvas3D.cpp:3300 +#: src/slic3r/GUI/GLCanvas3D.cpp:3263 msgid "Move Object" msgstr "Objektum Mozgatása" -#: src/slic3r/GUI/GLCanvas3D.cpp:3821 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3513 +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:40 +msgid "Gizmo-Place on Face" +msgstr "Gizmo- Felület Tárgyasztalra Illesztése" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3904 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Switch to Settings" msgstr "Váltás a Beállításokra" -#: src/slic3r/GUI/GLCanvas3D.cpp:3822 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3905 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Print Settings Tab" msgstr "Nyomtatási Beállítások Fül" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Filament Settings Tab" msgstr "Filament Beállítások Fül" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Material Settings Tab" msgstr "Alapanyag Beállítások Fül" -#: src/slic3r/GUI/GLCanvas3D.cpp:3824 src/slic3r/GUI/GLCanvas3D.cpp:4657 +#: src/slic3r/GUI/GLCanvas3D.cpp:3907 src/slic3r/GUI/GLCanvas3D.cpp:4746 msgid "Printer Settings Tab" msgstr "Nyomtató Beállítások Fül" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Undo History" msgstr "Előzmények visszavonása" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Redo History" msgstr "Előzmények alkalmazása" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" msgstr[0] "%1$d Művelet Visszavonása" msgstr[1] "%1$d Művelet Visszavonása" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" msgstr[0] "%1$d Művelet Mégis" msgstr[1] "%1$d Művelet Mégis" -#: src/slic3r/GUI/GLCanvas3D.cpp:4011 src/slic3r/GUI/GLCanvas3D.cpp:4673 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 src/slic3r/GUI/Search.cpp:426 +#: src/slic3r/GUI/GLCanvas3D.cpp:4106 src/slic3r/GUI/GLCanvas3D.cpp:4762 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/Search.cpp:482 msgid "Search" msgstr "Keresés" -#: src/slic3r/GUI/GLCanvas3D.cpp:4025 src/slic3r/GUI/GLCanvas3D.cpp:4033 -#: src/slic3r/GUI/Search.cpp:432 +#: src/slic3r/GUI/GLCanvas3D.cpp:4120 src/slic3r/GUI/GLCanvas3D.cpp:4128 +#: src/slic3r/GUI/Search.cpp:488 msgid "Enter a search term" msgstr "Írja be a keresett kifejezést" -#: src/slic3r/GUI/GLCanvas3D.cpp:4064 +#: src/slic3r/GUI/GLCanvas3D.cpp:4160 msgid "Arrange options" msgstr "Elrendezési lehetőségek" -#: src/slic3r/GUI/GLCanvas3D.cpp:4097 +#: src/slic3r/GUI/GLCanvas3D.cpp:4193 #, boost-format msgid "Press %1%left mouse button to enter the exact value" msgstr "Nyomja meg a %1% bal egérgombot a pontos érték megadásához" -#: src/slic3r/GUI/GLCanvas3D.cpp:4099 +#: src/slic3r/GUI/GLCanvas3D.cpp:4195 msgid "Spacing" msgstr "Térköz" -#: src/slic3r/GUI/GLCanvas3D.cpp:4106 -msgid "Enable rotations (slow)" -msgstr "Forgatás engedélyezése (lassú)" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -#, fuzzy -msgid "Alignment" -msgstr "Balra igazítsd" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:4500 -msgid "Center" -msgstr "Középre igazítás_" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear left" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front left" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front right" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear right" +#: src/slic3r/GUI/GLCanvas3D.cpp:4202 +msgid "Spacing from bed" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:2271 -msgid "Random" -msgstr "Véletlen" +#: src/slic3r/GUI/GLCanvas3D.cpp:4209 +msgid "Enable rotations (slow)" +msgstr "Forgatás engedélyezése (lassú)" -#: src/slic3r/GUI/GLCanvas3D.cpp:4133 src/slic3r/GUI/GLCanvas3D.cpp:4565 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Plater.cpp:1664 +#: src/slic3r/GUI/GLCanvas3D.cpp:4228 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 src/slic3r/GUI/Plater.cpp:7118 msgid "Arrange" msgstr "Elrendezés" -#: src/slic3r/GUI/GLCanvas3D.cpp:4539 +#: src/slic3r/GUI/GLCanvas3D.cpp:4630 msgid "Add..." msgstr "Hozzáadás..." -#: src/slic3r/GUI/GLCanvas3D.cpp:4556 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5509 src/slic3r/GUI/Tab.cpp:4158 +#: src/slic3r/GUI/GLCanvas3D.cpp:4647 src/slic3r/GUI/KBShortcutsDialog.cpp:105 +#: src/slic3r/GUI/Plater.cpp:6047 src/slic3r/GUI/Tab.cpp:4383 msgid "Delete all" msgstr "Összes törlése" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 src/slic3r/GUI/KBShortcutsDialog.cpp:133 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 src/slic3r/GUI/KBShortcutsDialog.cpp:142 msgid "Arrange selection" msgstr "Kijelöltek elrendezése" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 msgid "Click right mouse button to show arrangement options" msgstr "" "Kattintson a jobb egérgombbal az elrendezési lehetőségek megjelenítéséhez" -#: src/slic3r/GUI/GLCanvas3D.cpp:4587 +#: src/slic3r/GUI/GLCanvas3D.cpp:4676 msgid "Copy" msgstr "Másolás" -#: src/slic3r/GUI/GLCanvas3D.cpp:4596 +#: src/slic3r/GUI/GLCanvas3D.cpp:4685 msgid "Paste" msgstr "Beillesztés" -#: src/slic3r/GUI/GLCanvas3D.cpp:4608 src/slic3r/GUI/GUI_Factories.cpp:1084 -#: src/slic3r/GUI/GUI_Factories.cpp:1108 src/slic3r/GUI/GUI_Factories.cpp:1119 +#: src/slic3r/GUI/GLCanvas3D.cpp:4697 src/slic3r/GUI/GUI_Factories.cpp:1237 +#: src/slic3r/GUI/GUI_Factories.cpp:1261 src/slic3r/GUI/GUI_Factories.cpp:1272 msgid "Add instance" msgstr "Példány hozzáadása" -#: src/slic3r/GUI/GLCanvas3D.cpp:4619 src/slic3r/GUI/GUI_Factories.cpp:1087 +#: src/slic3r/GUI/GLCanvas3D.cpp:4708 src/slic3r/GUI/GUI_Factories.cpp:1240 msgid "Remove instance" msgstr "Példány eltávolítása" -#: src/slic3r/GUI/GLCanvas3D.cpp:4632 +#: src/slic3r/GUI/GLCanvas3D.cpp:4721 msgid "Split to objects" msgstr "Objektumokra bontás" -#: src/slic3r/GUI/GLCanvas3D.cpp:4642 +#: src/slic3r/GUI/GLCanvas3D.cpp:4731 msgid "Split to parts" msgstr "Alkatrészekre bontás" -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/GLCanvas3D.cpp:4795 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/GLCanvas3D.cpp:4874 msgid "Click right mouse button to open/close History" msgstr "Kattintson a jobb egérgombbal az előzmények megnyitásához/bezárásához" -#: src/slic3r/GUI/GLCanvas3D.cpp:4779 +#: src/slic3r/GUI/GLCanvas3D.cpp:4859 #, boost-format msgid "Next Undo action: %1%" msgstr "Következő visszavonás művelet: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:4795 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/GLCanvas3D.cpp:4874 src/slic3r/GUI/KBShortcutsDialog.cpp:107 +#: src/slic3r/GUI/MainFrame.cpp:1429 msgid "Redo" msgstr "Mégis" -#: src/slic3r/GUI/GLCanvas3D.cpp:4817 +#: src/slic3r/GUI/GLCanvas3D.cpp:4895 #, boost-format msgid "Next Redo action: %1%" msgstr "Következő mégis művelet: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:6434 +#: src/slic3r/GUI/GLCanvas3D.cpp:6784 msgid "An object outside the print area was detected." msgstr "Objektum található a nyomtatási területen kívül." -#: src/slic3r/GUI/GLCanvas3D.cpp:6435 +#: src/slic3r/GUI/GLCanvas3D.cpp:6785 msgid "A toolpath outside the print area was detected." msgstr "Szerszámpálya található a nyomtatási területen kívül." -#: src/slic3r/GUI/GLCanvas3D.cpp:6436 +#: src/slic3r/GUI/GLCanvas3D.cpp:6786 msgid "SLA supports outside the print area were detected." msgstr "SLA támaszték található a nyomtatási területen kívül." -#: src/slic3r/GUI/GLCanvas3D.cpp:6437 +#: src/slic3r/GUI/GLCanvas3D.cpp:6787 msgid "Some objects are not visible during editing." msgstr "Egyes objektumok nem láthatók szerkesztés közben." -#: src/slic3r/GUI/GLCanvas3D.cpp:6439 +#: src/slic3r/GUI/GLCanvas3D.cpp:6789 msgid "" "An object outside the print area was detected.\n" "Resolve the current problem to continue slicing." @@ -2535,325 +2713,1348 @@ msgstr "" "Objektum található a nyomtatási területen kívül.\n" "A szeletelés folytatásához oldja meg ezt a problémát." -#: src/slic3r/GUI/GLCanvas3D.cpp:6513 +#: src/slic3r/GUI/GLCanvas3D.cpp:6864 msgid "Selection-Add from rectangle" msgstr "Kijelölés – Hozzáadás a téglalaphoz" -#: src/slic3r/GUI/GLCanvas3D.cpp:6528 +#: src/slic3r/GUI/GLCanvas3D.cpp:6879 msgid "Selection-Remove from rectangle" msgstr "Kijelölés – Eltávolítás a téglalapból" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4478 -msgid "Cut" -msgstr "Vágás" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:206 +msgid "Planar" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -msgid "in" -msgstr "in" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Auto" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 -msgid "Keep upper part" -msgstr "Felső rész megtartása" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Manual" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 -msgid "Keep lower part" -msgstr "Alsó rész megtartása" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:213 +msgid "Plug" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:196 -msgid "Rotate lower part upwards" -msgstr "Az alsó rész felfelé forgatása" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:214 +msgid "Dowel" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:201 -msgid "Perform cut" -msgstr "Vágás végrehajtása" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Prism" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:49 -msgid "Paint-on supports" -msgstr "Támaszték festés" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Frustum" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 -msgid "Clipping of view" -msgstr "A nézet vágása" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Triangle" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 -msgid "Reset direction" -msgstr "Irány visszaállítása" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Square" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 -msgid "Brush size" -msgstr "Ecset méret" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Hexagon" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 -msgid "Brush shape" -msgstr "Ecset forma" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:59 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 +msgid "Circle" +msgstr "Kör" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 -msgid "Left mouse button" -msgstr "Bal egérgomb" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:233 +msgid "Keep orientation" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 -msgid "Enforce supports" -msgstr "Támaszték kényszerítése" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:234 +msgid "Place on cut" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 -msgid "Right mouse button" -msgstr "Jobb egérgomb" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:235 +msgid "Flip upside down" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:434 -msgid "Block supports" -msgstr "Támaszték blokkolása" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +msgid "inch" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 -msgid "Shift + Left mouse button" -msgstr "Shift + Bal egérgomb" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 +msgid "Part" +msgstr "Alkatrész" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:429 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 -msgid "Remove selection" -msgstr "Kijelölés eltávolítása" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 src/libslic3r/Print.cpp:1236 +msgid "Object" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 -msgid "Remove all selection" -msgstr "Az összes kijelölés eltávolítása" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:264 +msgid "" +"Click to flip the cut plane\n" +"Drag to move the cut plane" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 -msgid "Circle" -msgstr "Kör" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:269 src/libslic3r/PrintConfig.cpp:498 +#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2325 src/libslic3r/PrintConfig.cpp:2613 +#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2876 src/libslic3r/PrintConfig.cpp:2907 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3231 +#: src/libslic3r/PrintConfig.cpp:3466 src/libslic3r/PrintConfig.cpp:3951 +msgid "°" +msgstr "°" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 -#: src/slic3r/GUI/GUI_Factories.cpp:461 -msgid "Sphere" -msgstr "Gömb" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:367 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:571 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1232 +msgid "Move cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +msgid "in" +msgstr "in" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:68 -#: src/libslic3r/PrintConfig.cpp:1172 -msgid "Triangles" -msgstr "Háromszögek" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:544 +msgid "Value" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 -msgid "Highlight overhang by angle" -msgstr "Túlnyúlás kijelölése szöggel" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:549 +msgid "Tolerance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 -msgid "Enforce" -msgstr "Kényszerítés" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 +msgid "Left click" +msgstr "Bal klikk" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 -msgid "Tool type" -msgstr "Eszköz típus" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2348 +msgid "Add connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 -msgid "Brush" -msgstr "Ecset" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 +msgid "Right click" +msgstr "Jobb klikk" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:128 -msgid "Smart fill" -msgstr "Okos kitöltés" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +msgid "Remove connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:131 -msgid "Smart fill angle" -msgstr "Okos kitöltés szög" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 +msgid "Drag" +msgstr "Húzás" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:132 -msgid "Split triangles" -msgstr "Háromszögek felosztása" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1216 +msgid "Move connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 -msgid "On overhangs only" -msgstr "Csak túlnyúlásokon" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +msgid "Add connector to selection" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:174 -#, boost-format -msgid "" -"Preselects faces by overhang angle. It is possible to restrict paintable " -"facets to only preselected faces when the option \"%1%\" is enabled." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +msgid "Remove connector from selection" msgstr "" -"A felületeket a túlnyúlási szög alapján választja ki. Ha a \"%1%\" opció " -"engedélyezve van, akkor a festhető lapokat az előre kiválasztott lapokra " -"korlátozhatja." -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:217 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:378 -msgid "Paints facets according to the chosen painting brush." -msgstr "A felületeket a választott festőecset szerint festi." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:870 +msgid "Select all connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:391 -msgid "" -"Paints neighboring facets whose relative angle is less or equal to set angle." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:894 src/libslic3r/PrintConfig.cpp:4644 +msgid "Cut" +msgstr "Vágás" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1227 +msgid "Rotate cut plane" msgstr "" -"Olyan szomszédos oldalakat fest meg, amelyek relatív szöge kisebb vagy " -"egyenlő a beállított szöggel." -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:229 -#, boost-format -msgid "Allows painting only on facets selected by: \"%1%\"" -msgstr "Csak a \"%1%\" által kiválasztott felületekre enged festeni." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1448 +msgid "Render cut plane as circle" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:244 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:419 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:144 -msgid "Paints all facets inside, regardless of their orientation." -msgstr "Minden felületre fest, tájolástól függetlenül." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1537 +msgid "Connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:253 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:428 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:152 -msgid "Ignores facets facing away from the camera." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1541 +msgid "Remove connectors" msgstr "" -"Figyelmen kívül hagyja a kamerával ellentétes irányba néző felületeket." -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:262 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:437 -msgid "Paints only one facet." -msgstr "Csak egy felületet fest meg." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1550 +msgid "Type" +msgstr "Típus" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:270 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:285 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:445 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:462 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:132 -msgid "Alt + Mouse wheel" -msgstr "Alt + Egér görgő" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1561 src/libslic3r/PrintConfig.cpp:2816 +msgid "Style" +msgstr "Stílus" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 -msgid "Splits bigger facets into smaller ones while the object is painted." -msgstr "Az objektum festése közben a nagyobb felületeket kisebbekre osztja." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1568 +msgid "Depth ratio" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:308 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:483 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:170 -msgid "Ctrl + Mouse wheel" -msgstr "Ctrl + Egér görgő" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1586 +msgid "Confirm connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:313 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:488 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:175 -msgid "Reset selection" -msgstr "Kijelölés visszaállítása" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1652 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1666 +msgid "Flip cut plane" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:364 -msgid "Block supports by angle" -msgstr "Támasztékok blokkolása szög alapján" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1710 +msgid "Hold SHIFT key to draw a cut line" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:365 -msgid "Add supports by angle" -msgstr "Támasztékok hozzáadása szög alapján" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1716 +msgid "Cut position: " +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:432 -msgid "Add supports" -msgstr "Támasztékok hozzáadása" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1725 +msgid "Reset cutting plane" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:41 -msgid "Place on face" -msgstr "Felületre helyezés" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Edit connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 -msgid "Hollow this object" -msgstr "Objektum üregessé tétele" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Add connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 -msgid "Preview hollowed and drilled model" -msgstr "Az üreges és kifúrt modell előnézete" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1744 +msgid "Reset cut" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1745 +msgid "Reset cutting plane and remove connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1800 +msgid "After cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1820 +msgid "Cut to" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1823 +msgid "Objects" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1826 +msgid "Parts" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1840 +msgid "Perform cut" +msgstr "Vágás végrehajtása" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1930 +msgid "Invalid connectors detected" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1932 +#, c-format, boost-format +msgid "%1$d connector is out of cut contour" +msgid_plural "%1$d connectors are out of cut contour" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1935 +#, c-format, boost-format +msgid "%1$d connector is out of object" +msgid_plural "%1$d connectors are out of object" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1938 +msgid "Some connectors are overlapped" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1942 +msgid "" +"Invalid state. \n" +"No one part is selected for keep after cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1944 +msgid "" +"Warning state. \n" +"Cut plane is placed out of object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2153 +msgid "Connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2183 +msgid "Cut by Plane" +msgstr "Vágás Síkkal" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2323 +msgid "Cut by line" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2373 +msgid "Delete connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:252 +msgid "Entering Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:253 +msgid "Leaving Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:254 +msgid "Cut gizmo editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:601 +msgid "Emboss" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:866 +msgid "ERROR: Wait until ends or Cancel process." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:921 +msgid "Text-Rotate" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:953 +msgid "Font" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:954 +#: src/libslic3r/PrintConfig.cpp:897 +msgid "Height" +msgstr "Magasság" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:955 +msgid "Depth" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:963 +msgid "Use surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:964 +msgid "Char gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:965 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Line gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:966 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:967 +msgid "Skew ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:968 +msgid "Z-move" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:969 +msgid "Z-rot" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:970 +msgid "Collection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1047 +msgid "NORMAL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1048 +msgid "SMALL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1049 +msgid "ITALIC" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1050 +msgid "SWISS" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1051 +msgid "MODERN" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1088 +msgid "First font" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1093 +#, fuzzy +msgid "Default font" +msgstr "Az alapértelmezett nyomtató" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1098 +msgid "Embossed text" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1513 +msgid "Warning: No font is selected. Select correct one." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1531 +#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1437 +#: src/slic3r/GUI/Tab.cpp:1472 src/slic3r/GUI/Tab.cpp:1607 +#: src/slic3r/GUI/Tab.cpp:1611 src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:2390 src/slic3r/GUI/Tab.cpp:4985 +#: src/libslic3r/PrintConfig.cpp:276 src/libslic3r/PrintConfig.cpp:514 +#: src/libslic3r/PrintConfig.cpp:1484 src/libslic3r/PrintConfig.cpp:1566 +#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:2562 +#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:3166 +#: src/libslic3r/PrintConfig.cpp:3200 src/libslic3r/PrintConfig.cpp:3211 +#: src/libslic3r/PrintConfig.cpp:3226 src/libslic3r/PrintConfig.cpp:3239 +#: src/libslic3r/PrintConfig.cpp:3248 src/libslic3r/PrintConfig.cpp:3260 +#: src/libslic3r/PrintConfig.cpp:3642 +msgid "Advanced" +msgstr "Haladó" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1631 +msgid "Can't write text by selected font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1632 +msgid "Try to choose another font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Empty" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Embossed text can NOT contain only white spaces." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Bad symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Text contain character glyph (represented by '?') unknown by font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:535 +msgid "Skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +msgid "Unsupported visualization of font skew for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Unsupported visualization of font boldness for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Unsupported visualization of gap between lines inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Too tall" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Diminished font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Too small" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Enlarged font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1660 +#, boost-format +msgid "%1% is NOT shown." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1964 +msgid " No symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1965 +msgid " ... Loading" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2015 +msgid " ... In queue" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2132 +#, boost-format +msgid "Font face \"%1%\" can't be selected." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2180 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:754 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:367 +msgid "Apply" +msgstr "Alkalmaz" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2192 +msgid "add file with font(.ttf, .ttc)" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2202 +msgid "Open dialog for choose from fonts." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2210 +msgid "Text is to object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2224 +msgid "Added" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2227 +msgid "Click to change text into object part." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2230 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4321 +msgid "You can't change a type of the last solid part of the object." +msgstr "Az objektum utolsó tömör részének típusát nem lehet megváltoztatni." + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2231 +msgid "Subtracted" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2237 +msgid "Click to change part type into negative volume." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2243 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4338 +msgid "Modifier" +msgstr "Módosító" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2249 +msgid "Click to change part type into modifier." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2256 +msgid "Change Text Type" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2287 +#, boost-format +msgid "Rename style(%1%) for embossing text: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2299 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2384 +msgid "Name can't be empty." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2301 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2386 +msgid "Name has to be unique." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2310 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2397 +msgid "ok" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2312 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2401 +msgid "cancel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2337 +msgid "Rename style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2344 +msgid "Rename current style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2345 +msgid "Can't rename temporary style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2362 +msgid "First Add style to list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2364 +#, boost-format +msgid "Save %1% style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2366 +msgid "No changes to save." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2373 +msgid "New name of style: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2422 +msgid "Save as new style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2434 +msgid "Only valid font can be added to style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2436 +msgid "Add style to my list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2438 +msgid "Add as new named style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2454 +msgid "Remove style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2485 +#, boost-format +msgid "Delete \"%1%\" style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2486 +#, boost-format +msgid "Can't delete \"%1%\". It is last style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2487 +#, boost-format +msgid "Can't delete temporary style \"%1%\"." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2494 +#, boost-format +msgid "" +"Are you sure,\n" +"that you want permanently and unrecoverable \n" +"remove style \"%1%\"?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2496 +msgid "Yes" +msgstr "Igen" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2505 +msgid "No" +msgstr "Nem" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2555 +msgid "Presets" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2564 src/slic3r/GUI/GUI_App.cpp:2324 +msgid "modified" +msgstr "módosított" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2617 +#, boost-format +msgid "Modified style \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2618 +#, boost-format +msgid "Current style is \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2625 +msgid "Style modification will be lost." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2627 +#, boost-format +msgid "" +"Changing style to '%1%' will discard current style modification.\n" +"\n" +" Would you like to continue anyway?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2643 +msgid "Not valid style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2644 +#, boost-format +msgid "Style '%1%' can't be used and will be removed from list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2691 +msgid "Unset italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2708 +msgid "Set italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2738 +msgid "Unset bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2756 +msgid "Set bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2922 +msgid "WxFont is not loaded properly." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2957 +msgid "Revert font changes." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2991 +msgid "wx Make bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3002 +msgid "Revert text size." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3029 +msgid "Revert embossed depth." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3178 +msgid "" +"Advanced font options could be changed only for correct font.\n" +"Start with select correct font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3219 +msgid "Revert using of model surface." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3232 +msgid "font points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3241 +msgid "Revert gap between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3242 +msgid "Distance between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3257 +msgid "Revert gap between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3258 +msgid "Distance between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3272 +msgid "Undo boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3273 +msgid "Tiny / Wide glyphs" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3283 +msgid "Undo letter's skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3284 +msgid "Italic strength ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3304 +msgid "Undo translation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3305 +msgid "Distance of the center of text from model surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3350 +msgid "Undo rotation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3352 +msgid "Rotate text Clock-wise." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3386 +msgid "Select from True Type Collection." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3395 +msgid "Set text to face camera" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3402 +msgid "Use camera direction for text orientation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3486 +#, boost-format +msgid "Font '%1%' can't be used. Please select another." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3488 +msgid "Selected font is NOT True-type." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3512 +msgid "Choose one or more files (TTF, TTC):" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3539 +msgid "Choose SVG file:" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3600 +#, boost-format +msgid "" +"Can't load exactly same font(\"%1%\"), Aplication selected a similar " +"one(\"%2%\"). You have to specify font for enable edit text." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:81 +msgid "Enter emboss gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:82 +msgid "Leave emboss gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:83 +msgid "Embossing actions" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:37 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:66 +msgid "Paint-on supports" +msgstr "Támaszték festés" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 +msgid "Automatic painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 +msgid "painting..." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:107 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +msgid "Clipping of view" +msgstr "A nézet vágása" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:106 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 +msgid "Reset direction" +msgstr "Irány visszaállítása" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:108 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 +msgid "Brush size" +msgstr "Ecset méret" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:109 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 +msgid "Brush shape" +msgstr "Ecset forma" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1816 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:110 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 +msgid "Left mouse button" +msgstr "Bal egérgomb" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 +msgid "Enforce supports" +msgstr "Támaszték kényszerítése" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 +msgid "Right mouse button" +msgstr "Jobb egérgomb" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:573 +msgid "Block supports" +msgstr "Támaszték blokkolása" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 +msgid "Shift + Left mouse button" +msgstr "Shift + Bal egérgomb" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:568 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:247 +msgid "Remove selection" +msgstr "Kijelölés eltávolítása" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 +msgid "Remove all selection" +msgstr "Az összes kijelölés eltávolítása" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 +#: src/slic3r/GUI/GUI_Factories.cpp:481 +msgid "Sphere" +msgstr "Gömb" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:106 +#: src/libslic3r/PrintConfig.cpp:1231 +msgid "Triangles" +msgstr "Háromszögek" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 +msgid "Highlight overhang by angle" +msgstr "Túlnyúlás kijelölése szöggel" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:63 +msgid "Enforce" +msgstr "Kényszerítés" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +msgid "Tool type" +msgstr "Eszköz típus" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 +msgid "Brush" +msgstr "Ecset" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:68 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 +msgid "Smart fill" +msgstr "Okos kitöltés" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 +msgid "Smart fill angle" +msgstr "Okos kitöltés szög" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:72 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 +msgid "Split triangles" +msgstr "Háromszögek felosztása" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:73 +msgid "On overhangs only" +msgstr "Csak túlnyúlásokon" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:187 +#, boost-format +msgid "" +"Preselects faces by overhang angle. It is possible to restrict paintable " +"facets to only preselected faces when the option \"%1%\" is enabled." +msgstr "" +"A felületeket a túlnyúlási szög alapján választja ki. Ha a \"%1%\" opció " +"engedélyezve van, akkor a festhető lapokat az előre kiválasztott lapokra " +"korlátozhatja." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:230 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:371 +msgid "Paints facets according to the chosen painting brush." +msgstr "A felületeket a választott festőecset szerint festi." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:238 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:384 +msgid "" +"Paints neighboring facets whose relative angle is less or equal to set angle." +msgstr "" +"Olyan szomszédos oldalakat fest meg, amelyek relatív szöge kisebb vagy " +"egyenlő a beállított szöggel." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242 +#, boost-format +msgid "Allows painting only on facets selected by: \"%1%\"" +msgstr "Csak a \"%1%\" által kiválasztott felületekre enged festeni." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:257 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:412 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141 +msgid "Paints all facets inside, regardless of their orientation." +msgstr "Minden felületre fest, tájolástól függetlenül." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:266 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:421 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:149 +msgid "Ignores facets facing away from the camera." +msgstr "" +"Figyelmen kívül hagyja a kamerával ellentétes irányba néző felületeket." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:430 +msgid "Paints only one facet." +msgstr "Csak egy felületet fest meg." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:298 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:438 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:455 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:129 +msgid "Alt + Mouse wheel" +msgstr "Alt + Egér görgő" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:288 +msgid "Splits bigger facets into smaller ones while the object is painted." +msgstr "Az objektum festése közben a nagyobb felületeket kisebbekre osztja." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:321 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:476 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:167 +msgid "Ctrl + Mouse wheel" +msgstr "Ctrl + Egér görgő" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:326 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:481 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:172 +msgid "Reset selection" +msgstr "Kijelölés visszaállítása" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:382 +msgid "Block supports by angle" +msgstr "Támasztékok blokkolása szög alapján" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:383 +msgid "Add supports by angle" +msgstr "Támasztékok hozzáadása szög alapján" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +msgid "Automatic painting requires valid print setup." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:535 +msgid "Automatic painting will erase all currently painted areas." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:536 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1118 +msgid "Are you sure you want to do it?" +msgstr "Biztos benne, hogy meg akarja csinálni?" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:540 +msgid "Automatic painting support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:571 +msgid "Add supports" +msgstr "Támasztékok hozzáadása" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:22 +msgid "Entering Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:23 +msgid "Leaving Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:24 +msgid "Paint-on supports editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:88 +msgid "Place on face" +msgstr "Felületre helyezés" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:29 +msgid "Hollow this object" +msgstr "Objektum üregessé tétele" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 +msgid "Preview hollowed and drilled model" +msgstr "Az üreges és kifúrt modell előnézete" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 msgid "Offset" msgstr "Offset" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 msgid "Quality" msgstr "Minőség" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3905 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 +#: src/libslic3r/PrintConfig.cpp:4037 msgid "Closing distance" msgstr "Zárótávolság" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 msgid "Hole diameter" msgstr "Furat átmérő" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 -msgid "Hole depth" -msgstr "Furat mélység" +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 +msgid "Hole depth" +msgstr "Furat mélység" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 +msgid "Remove selected holes" +msgstr "Kijelölt furatok eltávolítása" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 +msgid "Remove all holes" +msgstr "Összes furat eltávolítása" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 +msgid "Show supports" +msgstr "Támasztékok mutatása" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:242 +msgid "Add drainage hole" +msgstr "Leeresztő furat hozzáadása" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:361 +msgid "Delete drainage hole" +msgstr "Leeresztő furat törlése" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:655 +msgid "Hollowing parameter change" +msgstr "Üregesítési paraméter megváltoztatása" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:739 +msgid "Change drainage hole diameter" +msgstr "Leeresztő furat átmérőjének megváltoztatása" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:827 +msgid "Hollow and drill" +msgstr "Üregelés és fúrás" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:869 +msgid "Move drainage hole" +msgstr "Leeresztő furat mozgatása" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:64 +msgid "No feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:65 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:76 +msgid "Vertex" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:66 +msgid "Edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:68 +msgid "Plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:77 +msgid "Point on edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:78 +msgid "Point on circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:79 +msgid "Point on plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:89 +msgid "Center of edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:90 +msgid "Center of circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:554 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2029 +msgid "Measure" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1236 +msgid "Edit to scale" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1258 +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:161 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:236 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:776 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:794 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:817 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:831 +#: src/libslic3r/PrintConfig.cpp:4713 +msgid "Scale" +msgstr "Skálázás" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1362 +msgctxt "Verb" +msgid "Scale" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1541 +msgid "##angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1740 +msgid "Measure tool debug" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1824 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1851 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1857 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1886 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1893 +msgid "Unselect feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1830 +msgid "Unselect center" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1835 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1862 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1898 +msgid "Select center" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1840 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1867 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1903 +msgid "Unselect point" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1846 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1873 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1910 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select point" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Shift" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Enable point selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2007 +msgid "Restart selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1952 +msgid "Esc" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1955 +msgid "Unselect" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1999 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2001 +msgid "Selection" +msgstr "Kiválasztott" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 -msgid "Remove selected holes" -msgstr "Kijelölt furatok eltávolítása" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2021 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +msgid "Copy to clipboard" +msgstr "Másolás a vágólapra" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 -msgid "Remove all holes" -msgstr "Összes furat eltávolítása" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2038 +msgid "Angle" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 -msgid "Show supports" -msgstr "Támasztékok mutatása" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Perpendicular distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:287 -msgid "Add drainage hole" -msgstr "Leeresztő furat hozzáadása" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:403 -msgid "Delete drainage hole" -msgstr "Leeresztő furat törlése" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2062 +msgid "Direct distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:590 -msgid "Hollowing parameter change" -msgstr "Üregesítési paraméter megváltoztatása" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2072 +msgid "Distance XYZ" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:667 -msgid "Change drainage hole diameter" -msgstr "Leeresztő furat átmérőjének megváltoztatása" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:163 +msgid "Entering Measure gizmo" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:761 -msgid "Hollow and drill" -msgstr "Üregelés és fúrás" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:164 +msgid "Leaving Measure gizmo" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:811 -msgid "Move drainage hole" -msgstr "Leeresztő furat mozgatása" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:165 +msgid "Measure gizmo editing" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:27 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:28 #, boost-format msgid "" "Your printer has more extruders than the multi-material painting gizmo " @@ -2863,81 +4064,85 @@ msgstr "" "A nyomtatója több extruderrel rendelkezik, mint amennyit a többanyagú " "festőeszköz támogat. Emiatt csak az első %1% extruder használható festéshez." -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:45 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:46 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 msgid "Multimaterial painting" msgstr "Többanyagú festés" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 msgid "First color" msgstr "Első szín" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 msgid "Second color" msgstr "Második szín" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:120 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:671 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:642 msgid "Remove painted color" msgstr "Festett szín eltávolítása" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 msgid "Clear all" msgstr "Összes törlése" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:129 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 msgid "Bucket fill" msgstr "Teljes kitöltés" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:404 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:397 msgid "Paints neighboring facets that have the same color." msgstr "Az azonos színű szomszédos felületeket is megfesti." -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:450 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:443 msgid "Split bigger facets into smaller ones while the object is painted." msgstr "Az objektum festése közben a nagyobb felületeket kisebbekre osztja." -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:674 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:645 #, boost-format msgid "Painted using: Extruder %1%" msgstr "Festés a következővel: Extruder %1%" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:118 +msgid "Entering Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:119 +msgid "Leaving Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:120 +msgid "Multimaterial painting editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:76 msgid "Move" msgstr "Mozgatás" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:466 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4532 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:643 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:745 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:775 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:813 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:830 +#: src/libslic3r/PrintConfig.cpp:4698 msgid "Rotate" msgstr "Forgatás" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:505 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:707 msgid "Optimize orientation" msgstr "Tájolás optimalizálása" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:552 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:319 -msgid "Apply" -msgstr "Alkalmaz" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:79 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4547 -msgid "Scale" -msgstr "Skálázás" +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:194 +msgid "Gizmo-Scale" +msgstr "Gizmo-Skála" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 msgid "Enforce seam" msgstr "Varrat kényszerítése" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:38 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:255 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:252 msgid "Block seam" msgstr "Varrat blokkolása" @@ -2945,278 +4150,280 @@ msgstr "Varrat blokkolása" msgid "Seam painting" msgstr "Varrat festés" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:23 +msgid "Entering Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:24 +msgid "Leaving Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:25 +msgid "Paint-on seam editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:105 msgid "Mesh name" msgstr "Háló neve" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:69 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:107 msgid "Detail level" msgstr "Részletességi szint" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:108 msgid "Decimate ratio" msgstr "Tizedelési arány" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:113 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:147 #, boost-format msgid "" "Processing model '%1%' with more than 1M triangles could be slow. It is " -"highly recommend to reduce amount of triangles." +"highly recommended to reduce amount of triangles." msgstr "" -"A több mint 1 millió háromszöget tartalmazó „%1%” modell feldolgozása lassú " -"lehet. Erősen ajánlott csökkenteni a háromszögek számát." -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:116 -#: src/slic3r/GUI/GUI_Factories.cpp:705 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:150 +#: src/slic3r/GUI/GUI_Factories.cpp:789 msgid "Simplify model" msgstr "Modell Egyszerűsítése" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:143 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:177 msgid "Simplify" msgstr "Egyszerűsítés" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:156 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:190 msgid "Simplification is currently only allowed when a single part is selected" msgstr "" "Az egyszerűsítés jelenleg csak egyetlen objektum kiválasztása esetén " "engedélyezett" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 -#: src/slic3r/GUI/PrintHostDialogs.cpp:373 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:191 +#: src/slic3r/GUI/MainFrame.cpp:1246 src/slic3r/GUI/MainFrame.cpp:1716 +#: src/slic3r/GUI/PrintHostDialogs.cpp:425 msgid "Error" msgstr "Hiba" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:250 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:294 msgid "Extra high" msgstr "Extra magas" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:251 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:295 msgid "High" msgstr "Magas" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:252 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:296 msgid "Medium" msgstr "Közepes" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:297 msgid "Low" msgstr "Elacsony" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:254 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:298 msgid "Extra low" msgstr "Extra alacsony" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:304 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#, boost-format +msgid "" +"Multipart object can be simplified only by %1%. If you want specify %2% " +"process it separately." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:352 #, c-format, boost-format msgid "%d triangles" msgstr "%d háromszögek" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:307 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:355 msgid "Show wireframe" msgstr "Drótváz megjelenítése" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:313 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:361 msgid "Operation already cancelling. Please wait few seconds." msgstr "" "A művelet megszakítása már folyamatban van. Kérjük, várjon néhány " "másodpercet." -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:370 msgid "Can't apply when proccess preview." msgstr "Nem alkalmazható a előnézet feldolgozása során." -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:329 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:377 #, boost-format msgid "Process %1% / 100" msgstr "Folyama%1% / 100" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:479 -#, boost-format -msgid "Simplify %1%" -msgstr "Egyszerűsítés %1%" +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:542 +msgid "Simplify " +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:543 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"simplifying the mesh." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:67 +msgid "Entering SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:68 +msgid "Leaving SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:35 msgid "Head diameter" msgstr "Fej átmérő" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:36 msgid "Lock supports under new islands" msgstr "A támasztékok lezárása az új szigetek alatt" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:37 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268 msgid "Remove selected points" msgstr "Kijelölt pontok eltávolítása" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:38 msgid "Remove all points" msgstr "Összes pont eltávolítása" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1226 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1271 msgid "Apply changes" msgstr "Változtatások alkalmazása" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1227 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1272 msgid "Discard changes" msgstr "Változtatások eldobása" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 msgid "Minimal points distance" msgstr "Pontok minimális távolsága" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3735 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/libslic3r/PrintConfig.cpp:3867 msgid "Support points density" msgstr "Támadztó pontok sűrűsége" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1229 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1274 msgid "Auto-generate points" msgstr "Pontok automatikus generálása" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 msgid "Manual editing" msgstr "Kézi szerkesztés" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:372 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:307 msgid "Add support point" msgstr "Támasztó pont hozzáadása" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:522 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:460 msgid "Delete support point" msgstr "Támasztó pont törlése" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:702 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:626 msgid "Change point head diameter" msgstr "Tűfej átmérőjének módosítáa" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:770 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:696 msgid "Support parameter change" msgstr "Támaszték paraméter változtatása" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:876 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:806 msgid "SLA Support Points" msgstr "SLA Támasztópontok" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:814 msgid "Do you want to save your manually edited support points?" msgstr "Menti a manuálisan szerkesztett támaszpontjait?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:898 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:815 msgid "Save support points?" msgstr "Támasztópontok mentése?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:958 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:880 msgid "Move support point" msgstr "Támasztópont mozgatása" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1051 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:987 msgid "Support points edit" msgstr "Támasztópontok szerkesztése" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1131 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1117 msgid "Autogeneration will erase all manually edited points." msgstr "Az automatikus generálás az összes manuális pontot törölni fogja." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1132 -msgid "Are you sure you want to do it?" -msgstr "Biztos benne, hogy meg akarja csinálni?" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1138 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1124 msgid "Autogenerate support points" msgstr "Támasztó pontok automatikus generálása" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1186 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 msgid "SLA gizmo keyboard shortcuts" msgstr "SLA gizmo gyorsbillentyűk" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1197 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1242 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "" "Megjegyzés: egyes billentyűparancsok csak (nem)szerkesztési módban működnek." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 -msgid "Left click" -msgstr "Bal klikk" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 msgid "Add point" msgstr "Pont hozzáadása" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 -msgid "Right click" -msgstr "Jobb klikk" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 msgid "Remove point" msgstr "Pont eltávolítása" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 -msgid "Drag" -msgstr "Húzás" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 msgid "Move point" msgstr "Pont mozgatása" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 msgid "Add point to selection" msgstr "Pont hozzáadása kijelöléshez" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 msgid "Remove point from selection" msgstr "Pont eltávolítása kijelölésből" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 msgid "Select by rectangle" msgstr "Kijelölés téglalappal" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 msgid "Deselect by rectangle" msgstr "Kijelölés megszüntetése téglalappal" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1267 msgid "Select all points" msgstr "Összes pont kijelölése" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Mouse wheel" msgstr "Egér görgő" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Move clipping plane" msgstr "Vágási sík mozgatása" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1225 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1270 msgid "Reset clipping plane" msgstr "Vágási sík visszaállítása" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1228 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273 msgid "Switch to editing mode" msgstr "Váltás szerkesztés módra" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:196 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:204 msgid "" "ERROR: Please close all manipulators available from the left toolbar first" msgstr "" "HIBA: Először zárja be a bal oldali eszköztárból elérhető összes manipulátort" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:561 -msgid "Gizmo-Scale" -msgstr "Gizmo-Skála" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:673 -msgid "Gizmo-Place on Face" -msgstr "Gizmo- Felület Tárgyasztalra Illesztése" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:1270 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:998 msgid "" "You are currently editing SLA support points. Please, apply or discard your " "changes first." @@ -3224,16 +4431,16 @@ msgstr "" "Jelenleg SLA támasztási pontokat szerkeszt. Kérjük, először alkalmazza vagy " "dobja el a módosításokat." -#: src/slic3r/GUI/GUI.cpp:292 +#: src/slic3r/GUI/GUI.cpp:287 msgid "Undefined" msgstr "Meghatározatlan" -#: src/slic3r/GUI/GUI.cpp:317 +#: src/slic3r/GUI/GUI.cpp:308 #, boost-format msgid "%1% was substituted with %2%" msgstr "%1% helyettesítére került a következővel: %2%" -#: src/slic3r/GUI/GUI.cpp:326 +#: src/slic3r/GUI/GUI.cpp:317 msgid "" "Most likely the configuration was produced by a newer version of PrusaSlicer " "or by some PrusaSlicer fork." @@ -3241,23 +4448,23 @@ msgstr "" "Valószínűleg a konfigurációt a PrusaSlicer újabb verziója vagy egyéb " "PrusaSlicer változat készítette." -#: src/slic3r/GUI/GUI.cpp:327 +#: src/slic3r/GUI/GUI.cpp:318 msgid "The following values were substituted:" msgstr "A következő értékek helyettesítésre kerültek:" -#: src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/GUI.cpp:319 msgid "Review the substitutions and adjust them if needed." msgstr "Ellenőrizze a helyettesítéseket, és szükség esetén módosítsa azokat." -#: src/slic3r/GUI/GUI.cpp:338 src/slic3r/GUI/Plater.cpp:820 +#: src/slic3r/GUI/GUI.cpp:329 src/slic3r/GUI/Plater.cpp:850 msgid "SLA print settings" msgstr "SLA nyomtatási beállítások" -#: src/slic3r/GUI/GUI.cpp:342 src/slic3r/GUI/PhysicalPrinterDialog.cpp:157 +#: src/slic3r/GUI/GUI.cpp:333 src/slic3r/GUI/PhysicalPrinterDialog.cpp:158 msgid "Physical Printer" msgstr "Fizikai Nyomtató" -#: src/slic3r/GUI/GUI.cpp:355 +#: src/slic3r/GUI/GUI.cpp:346 msgid "" "Configuration bundle was loaded, however some configuration values were not " "recognized." @@ -3265,7 +4472,7 @@ msgstr "" "A konfigurációs csomag betöltődött, azonban néhány konfigurációs értéket nem " "sikerült felismerni." -#: src/slic3r/GUI/GUI.cpp:365 +#: src/slic3r/GUI/GUI.cpp:356 #, boost-format msgid "" "Configuration file \"%1%\" was loaded, however some configuration values " @@ -3274,15 +4481,15 @@ msgstr "" "A \"%1%\" konfigurációs fájl betöltődött, azonban néhány konfigurációs " "értéket nem sikerült felismerni." -#: src/slic3r/GUI/GUI_App.cpp:266 +#: src/slic3r/GUI/GUI_App.cpp:275 msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." msgstr "_Alessandro Ranellucci és a RepRap közösség Slic3r-én alapul." -#: src/slic3r/GUI/GUI_App.cpp:267 +#: src/slic3r/GUI/GUI_App.cpp:276 msgid "Developed by Prusa Research." msgstr "A Prusa Research fejlesztette ki." -#: src/slic3r/GUI/GUI_App.cpp:269 +#: src/slic3r/GUI/GUI_App.cpp:278 msgid "" "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." @@ -3292,11 +4499,11 @@ msgstr "" "Első magyar nyelv: Zombori Attila & Nagy Dóra (zombifree@gmail.com), és " "később remélhetőleg sokan mások." -#: src/slic3r/GUI/GUI_App.cpp:270 -msgid "Artwork model by Leslie Ing" -msgstr "Művészeti modell Leslie Ing által" +#: src/slic3r/GUI/GUI_App.cpp:279 +msgid "Artwork model by Creative Tools" +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:411 +#: src/slic3r/GUI/GUI_App.cpp:420 #, boost-format msgid "" "Starting with %1% 2.3, configuration directory on Linux has changed " @@ -3328,20 +4535,20 @@ msgstr "" "\n" "Mit szeretne most tenni?" -#: src/slic3r/GUI/GUI_App.cpp:419 +#: src/slic3r/GUI/GUI_App.cpp:428 #, c-format, boost-format msgid "%s - BREAKING CHANGE" msgstr "%s - MEGTÖRŐ VÁLTOZÁS" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Quit, I will move my data now" msgstr "Kilépés, most áthelyezem az adataimat" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Start the application" msgstr "Az alkalmazás indítása" -#: src/slic3r/GUI/GUI_App.cpp:699 +#: src/slic3r/GUI/GUI_App.cpp:725 #, c-format, boost-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -3356,11 +4563,11 @@ msgstr "" "\n" "Az alkalmazás most leáll." -#: src/slic3r/GUI/GUI_App.cpp:702 +#: src/slic3r/GUI/GUI_App.cpp:728 msgid "Fatal error" msgstr "Végzetes hiba" -#: src/slic3r/GUI/GUI_App.cpp:706 +#: src/slic3r/GUI/GUI_App.cpp:732 msgid "" "PrusaSlicer has encountered a localization error. Please report to " "PrusaSlicer team, what language was active and in which scenario this issue " @@ -3374,16 +4581,16 @@ msgstr "" "\n" "Az alkalmazás most leáll." -#: src/slic3r/GUI/GUI_App.cpp:709 +#: src/slic3r/GUI/GUI_App.cpp:735 msgid "Critical error" msgstr "Kritikus hiba" -#: src/slic3r/GUI/GUI_App.cpp:714 +#: src/slic3r/GUI/GUI_App.cpp:740 #, boost-format msgid "Internal error: %1%" msgstr "Belső hiba: %1%" -#: src/slic3r/GUI/GUI_App.cpp:909 src/slic3r/GUI/GUI_App.cpp:1007 +#: src/slic3r/GUI/GUI_App.cpp:954 src/slic3r/GUI/GUI_App.cpp:1051 msgid "" "Error parsing PrusaSlicer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error. Your user profiles will " @@ -3393,7 +4600,7 @@ msgstr "" "Próbálja meg manuálisan törölni a fájlt a hiba elhárításához. A felhasználói " "profilok nem lesznek érintettek." -#: src/slic3r/GUI/GUI_App.cpp:915 src/slic3r/GUI/GUI_App.cpp:1013 +#: src/slic3r/GUI/GUI_App.cpp:960 src/slic3r/GUI/GUI_App.cpp:1057 msgid "" "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error." @@ -3401,12 +4608,12 @@ msgstr "" "Hiba a PrusaGCodeViewer konfigurációs fájl elemzése során, valószínűleg " "sérült. Próbálja meg manuálisan törölni a fájlt a hiba elhárításához." -#: src/slic3r/GUI/GUI_App.cpp:962 +#: src/slic3r/GUI/GUI_App.cpp:1006 #, boost-format msgid "You are opening %1% version %2%." msgstr "Ön a %1% %2% verzióját nyitja meg." -#: src/slic3r/GUI/GUI_App.cpp:965 +#: src/slic3r/GUI/GUI_App.cpp:1009 #, boost-format msgid "" "The active configuration was created by %1% %2%,\n" @@ -3424,7 +4631,7 @@ msgstr "" "Ha igen, akkor az aktív konfigurációról biztonsági másolat készül az új " "konfiguráció importálása előtt." -#: src/slic3r/GUI/GUI_App.cpp:973 +#: src/slic3r/GUI/GUI_App.cpp:1017 #, boost-format msgid "" "An existing configuration was found in %3%\n" @@ -3437,19 +4644,19 @@ msgstr "" "\n" "Importáljuk ezt a meglévő konfigurációt?" -#: src/slic3r/GUI/GUI_App.cpp:981 +#: src/slic3r/GUI/GUI_App.cpp:1025 msgid "Import" msgstr "Importálás_" -#: src/slic3r/GUI/GUI_App.cpp:982 +#: src/slic3r/GUI/GUI_App.cpp:1026 msgid "Don't import" msgstr "Ne importálja" -#: src/slic3r/GUI/GUI_App.cpp:990 +#: src/slic3r/GUI/GUI_App.cpp:1034 msgid "Continue and import newer configuration?" msgstr "Folytatás és az újabb konfiguráció importálása?" -#: src/slic3r/GUI/GUI_App.cpp:1051 +#: src/slic3r/GUI/GUI_App.cpp:1095 msgid "" "You are running a 32 bit build of PrusaSlicer on 64-bit Windows.\n" "32 bit build of PrusaSlicer will likely not be able to utilize all the RAM " @@ -3465,7 +4672,7 @@ msgstr "" "https://www.prusa3d.cz/prusaslicer/ oldalról.\n" "Szeretné folytatni?" -#: src/slic3r/GUI/GUI_App.cpp:1134 +#: src/slic3r/GUI/GUI_App.cpp:1182 #, c-format, boost-format msgid "" "%s\n" @@ -3474,46 +4681,37 @@ msgstr "" "%s\n" "Szeretné folytatni?" -#: src/slic3r/GUI/GUI_App.cpp:1136 src/slic3r/GUI/GUI_App.cpp:3101 -#: src/slic3r/GUI/Plater.cpp:1726 src/slic3r/GUI/UnsavedChangesDialog.cpp:889 +#: src/slic3r/GUI/GUI_App.cpp:1184 src/slic3r/GUI/GUI_App.cpp:3302 +#: src/slic3r/GUI/Plater.cpp:1736 src/slic3r/GUI/UnsavedChangesDialog.cpp:917 msgid "Remember my choice" msgstr "Emlékezzen a választásomra" -#: src/slic3r/GUI/GUI_App.cpp:1178 +#: src/slic3r/GUI/GUI_App.cpp:1226 msgid "Loading configuration" msgstr "Konfiguráció betöltése" -#: src/slic3r/GUI/GUI_App.cpp:1209 -#, boost-format -msgid "New release version %1% is available." -msgstr "Elérhető a(z) %1% új kiadott verziója." - -#: src/slic3r/GUI/GUI_App.cpp:1210 -msgid "See Download page." -msgstr "Tekintse meg a Letöltési oldalt." - -#: src/slic3r/GUI/GUI_App.cpp:1224 +#: src/slic3r/GUI/GUI_App.cpp:1257 #, boost-format msgid "New prerelease version %1% is available." msgstr "Elérhető a(z) %1% új kiadás előtti verziója." -#: src/slic3r/GUI/GUI_App.cpp:1225 +#: src/slic3r/GUI/GUI_App.cpp:1258 msgid "See Releases page." msgstr "Tekintse meg a kiadások oldalt." -#: src/slic3r/GUI/GUI_App.cpp:1262 +#: src/slic3r/GUI/GUI_App.cpp:1313 msgid "Preparing settings tabs" msgstr "A beállítások fül előkészítése" -#: src/slic3r/GUI/GUI_App.cpp:1336 src/slic3r/GUI/Preferences.cpp:287 +#: src/slic3r/GUI/GUI_App.cpp:1393 src/slic3r/GUI/Preferences.cpp:405 msgid "Restore window position on start" msgstr "Ablak pozíciójának visszaállítása indításkor" -#: src/slic3r/GUI/GUI_App.cpp:1338 +#: src/slic3r/GUI/GUI_App.cpp:1395 msgid "PrusaSlicer started after a crash" msgstr "A PrusaSlicer összeomlást követően indult el" -#: src/slic3r/GUI/GUI_App.cpp:1339 +#: src/slic3r/GUI/GUI_App.cpp:1396 #, boost-format msgid "" "PrusaSlicer crashed last time when attempting to set window position.\n" @@ -3539,24 +4737,24 @@ msgstr "" "\n" "Translated with www.DeepL.com/Translator (free version)" -#: src/slic3r/GUI/GUI_App.cpp:1351 +#: src/slic3r/GUI/GUI_App.cpp:1408 #, boost-format msgid "Disable \"%1%\"" msgstr "\"%1%\" letiltása" -#: src/slic3r/GUI/GUI_App.cpp:1352 +#: src/slic3r/GUI/GUI_App.cpp:1409 #, boost-format msgid "Leave \"%1%\" enabled" msgstr "Hagyja engedélyezve a \"%1%\"-ot" -#: src/slic3r/GUI/GUI_App.cpp:1679 +#: src/slic3r/GUI/GUI_App.cpp:1780 msgid "" "You have the following presets with saved options for \"Print Host upload\"" msgstr "" "A következő előbeállítások állnak rendelkezésre a \"Nyomtató feltöltés\" " "mentett beállításaival" -#: src/slic3r/GUI/GUI_App.cpp:1683 +#: src/slic3r/GUI/GUI_App.cpp:1784 msgid "" "But since this version of PrusaSlicer we don't show this information in " "Printer Settings anymore.\n" @@ -3566,7 +4764,7 @@ msgstr "" "nyomtató beállításaiban. \n" "A beállítások a fizikai nyomtatók beállításaiban lesznek elérhetőek." -#: src/slic3r/GUI/GUI_App.cpp:1685 +#: src/slic3r/GUI/GUI_App.cpp:1786 msgid "" "By default new Printer devices will be named as \"Printer N\" during its " "creation.\n" @@ -3576,138 +4774,147 @@ msgstr "" "létrehozásuk során.\n" "Megjegyzés: Ez a név később módosítható a fizikai nyomtató beállításainál" -#: src/slic3r/GUI/GUI_App.cpp:1689 src/slic3r/GUI/PhysicalPrinterDialog.cpp:726 +#: src/slic3r/GUI/GUI_App.cpp:1790 src/slic3r/GUI/PhysicalPrinterDialog.cpp:798 msgid "Information" msgstr "Információ" -#: src/slic3r/GUI/GUI_App.cpp:1702 src/slic3r/GUI/GUI_App.cpp:1713 +#: src/slic3r/GUI/GUI_App.cpp:1803 src/slic3r/GUI/GUI_App.cpp:1814 msgid "Recreating" msgstr "Újralétrehozás_" -#: src/slic3r/GUI/GUI_App.cpp:1716 +#: src/slic3r/GUI/GUI_App.cpp:1817 msgid "Loading of current presets" msgstr "Az aktuális előbeállítások betöltése" -#: src/slic3r/GUI/GUI_App.cpp:1721 +#: src/slic3r/GUI/GUI_App.cpp:1822 msgid "Loading of a mode view" msgstr "Mód nézet betöltése" -#: src/slic3r/GUI/GUI_App.cpp:1859 +#: src/slic3r/GUI/GUI_App.cpp:1961 msgid "Choose one file (3MF/AMF):" msgstr "Válasszon ki egy fájlt (3MF/AMF):" -#: src/slic3r/GUI/GUI_App.cpp:1871 +#: src/slic3r/GUI/GUI_App.cpp:1973 msgid "Choose one or more files (STL/3MF/STEP/OBJ/AMF/PRUSA):" msgstr "Válasszon ki egy vagy több fájlt (STL/3MF/STEP/OBJ/AMF/PRUSA):" -#: src/slic3r/GUI/GUI_App.cpp:1883 +#: src/slic3r/GUI/GUI_App.cpp:1984 +msgid "Choose ZIP file:" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1996 msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" msgstr "Válasszon ki egy fájlt (GCODE/.GCO/.G/.ngc/NGC):" -#: src/slic3r/GUI/GUI_App.cpp:1894 +#: src/slic3r/GUI/GUI_App.cpp:2007 msgid "Changing of an application language" msgstr "Egy alkalmazás nyelvének megváltoztatása" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Select the language" msgstr "Válassza ki a nyelvet" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Language" msgstr "Nyelv" -#: src/slic3r/GUI/GUI_App.cpp:2182 -msgid "modified" -msgstr "módosított" +#: src/slic3r/GUI/GUI_App.cpp:2363 +msgid "" +"Simple mode supports manipulation with single-part object(s)\n" +"or object(s) with support modifiers only." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2365 +msgid "Please check your object list before mode changing." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2366 +msgid "Change application mode" +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2236 +#: src/slic3r/GUI/GUI_App.cpp:2397 #, c-format, boost-format msgid "Run %s" msgstr "%s Fut_" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "&Configuration Snapshots" msgstr "Konfigurációs Pillanatfelvételek" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "Inspect / activate configuration snapshots" msgstr "Konfigurációs pillanatfelvételek megtekintése / aktiválása" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Take Configuration &Snapshot" msgstr "Konfigurációs Pillanatfelvétel Készítése" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Capture a configuration snapshot" msgstr "Pillanatfelvétel készítése az aktuális konfigurációról" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for Configuration Updates" msgstr "Konfigurációs Frissítések Keresése" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for configuration updates" msgstr "Konfigurációs frissítések keresése" -#: src/slic3r/GUI/GUI_App.cpp:2249 +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for Application Updates" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for new version of application" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2411 msgid "&Preferences" msgstr "Beállítások" -#: src/slic3r/GUI/GUI_App.cpp:2255 +#: src/slic3r/GUI/GUI_App.cpp:2417 msgid "Application preferences" msgstr "Alkalmazás beállítások" -#: src/slic3r/GUI/GUI_App.cpp:2260 src/slic3r/GUI/wxExtensions.cpp:708 -msgid "Simple" -msgstr "Egyszerű" - -#: src/slic3r/GUI/GUI_App.cpp:2260 +#: src/slic3r/GUI/GUI_App.cpp:2422 msgid "Simple View Mode" msgstr "Egyszerű Megjelenítési Mód" -#: src/slic3r/GUI/GUI_App.cpp:2262 src/slic3r/GUI/wxExtensions.cpp:710 -msgctxt "Mode" -msgid "Advanced" -msgstr "Haladó" - -#: src/slic3r/GUI/GUI_App.cpp:2262 +#: src/slic3r/GUI/GUI_App.cpp:2424 msgid "Advanced View Mode" msgstr "Haladó Megjelenítési Mód" -#: src/slic3r/GUI/GUI_App.cpp:2263 src/slic3r/GUI/wxExtensions.cpp:711 -msgid "Expert" -msgstr "Szakértő" - -#: src/slic3r/GUI/GUI_App.cpp:2263 +#: src/slic3r/GUI/GUI_App.cpp:2425 msgid "Expert View Mode" msgstr "Szakértő Megjelenítési Mód" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 msgid "Mode" msgstr "Mód" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 #, c-format, boost-format msgid "%s View Mode" msgstr "%s Megjelenítési Mód" -#: src/slic3r/GUI/GUI_App.cpp:2271 +#: src/slic3r/GUI/GUI_App.cpp:2433 msgid "&Language" msgstr "Nyelv" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Flash Printer &Firmware" msgstr "Nyomtató &Firmware Feltöltése" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Upload a firmware image into an Arduino based printer" msgstr "Firmware feltöltése Arduino alapú nyomtatóra" -#: src/slic3r/GUI/GUI_App.cpp:2294 +#: src/slic3r/GUI/GUI_App.cpp:2459 msgid "Taking a configuration snapshot" msgstr "Konfigurációs pillanatkép készítése" -#: src/slic3r/GUI/GUI_App.cpp:2295 +#: src/slic3r/GUI/GUI_App.cpp:2460 msgid "" "Some presets are modified and the unsaved changes will not be captured by " "the configuration snapshot." @@ -3715,32 +4922,28 @@ msgstr "" "Néhány előbeállítás módosult, és a nem mentett változásokat a konfigurációs " "pillanatkép nem rögzíti." -#: src/slic3r/GUI/GUI_App.cpp:2296 +#: src/slic3r/GUI/GUI_App.cpp:2461 msgid "Snapshot name" msgstr "Pillanatkép neve" -#: src/slic3r/GUI/GUI_App.cpp:2312 +#: src/slic3r/GUI/GUI_App.cpp:2477 msgid "Loading a configuration snapshot" msgstr "Konfigurációs pillanatkép betöltése" -#: src/slic3r/GUI/GUI_App.cpp:2321 +#: src/slic3r/GUI/GUI_App.cpp:2486 #, boost-format msgid "Continue to activate a configuration snapshot %1%?" msgstr "Folytatja a konfigurációs pillanatkép aktiválását: %1%?" -#: src/slic3r/GUI/GUI_App.cpp:2335 +#: src/slic3r/GUI/GUI_App.cpp:2500 msgid "Failed to activate configuration snapshot." msgstr "Nem sikerült a konfigurációs pillanatkép aktiválása." -#: src/slic3r/GUI/GUI_App.cpp:2354 -msgid "Restart application" -msgstr "Alkalmazás újraindítása" - -#: src/slic3r/GUI/GUI_App.cpp:2388 +#: src/slic3r/GUI/GUI_App.cpp:2520 msgid "Language selection" msgstr "Nyelv kiválasztása" -#: src/slic3r/GUI/GUI_App.cpp:2391 +#: src/slic3r/GUI/GUI_App.cpp:2523 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." @@ -3748,89 +4951,103 @@ msgstr "" "A nyelv megváltoztatása újraindítja az alkalmazást.\n" "Elveszíti a tárgyasztal tartalmát." -#: src/slic3r/GUI/GUI_App.cpp:2393 src/slic3r/GUI/Preferences.cpp:582 +#: src/slic3r/GUI/GUI_App.cpp:2525 src/slic3r/GUI/Preferences.cpp:730 +#: src/slic3r/GUI/Selection.cpp:1695 msgid "Do you want to proceed?" msgstr "Akarja folytatni?" -#: src/slic3r/GUI/GUI_App.cpp:2420 +#: src/slic3r/GUI/GUI_App.cpp:2552 msgid "&Configuration" msgstr "Konfiguráció" -#: src/slic3r/GUI/GUI_App.cpp:2534 src/slic3r/GUI/GUI_App.cpp:2595 -msgid "The preset modifications are successfully saved" -msgid_plural "The presets modifications are successfully saved" -msgstr[0] "Az előbeállítás módosításai sikeresen elmentésre kerültek" -msgstr[1] "Az előbeállítások módosításai sikeresen elmentésre kerültek" +#: src/slic3r/GUI/GUI_App.cpp:2560 +msgid "Restart application" +msgstr "Alkalmazás újraindítása" -#: src/slic3r/GUI/GUI_App.cpp:2598 +#: src/slic3r/GUI/GUI_App.cpp:2726 msgid "For new project all modifications will be reseted" msgstr "Új projekt esetén az összes módosítás visszaállításra kerül" -#: src/slic3r/GUI/GUI_App.cpp:2636 +#: src/slic3r/GUI/GUI_App.cpp:2764 msgid "Loading a new project while the current project is modified." msgstr "Új projekt betöltése az jelenlegi projekt módosítása közben." -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Project is loading" msgstr "A projekt betöltődik" -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Opening new project while some presets are unsaved." msgstr "Új projekt megnyitása, miközben néhány előbeállítás nincs elmentve." -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "The uploads are still ongoing" msgstr "A feltöltések még mindig folyamatban vannak" -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "Stop them and continue anyway?" msgstr "Megállítja őket, és akkor is folytatja?" -#: src/slic3r/GUI/GUI_App.cpp:2662 +#: src/slic3r/GUI/GUI_App.cpp:2790 msgid "Ongoing uploads" msgstr "Folyamatban lévő feltöltések" -#: src/slic3r/GUI/GUI_App.cpp:2876 -msgid "It's impossible to print multi-part object(s) with SLA technology." +#: src/slic3r/GUI/GUI_App.cpp:3026 +msgid "" +"It's impossible to print object(s) which contains parameter modifiers with " +"SLA technology." msgstr "" -"SLA technológiával nem lehetséges több részből álló objektum(ok) nyomtatása." -#: src/slic3r/GUI/GUI_App.cpp:2877 src/slic3r/GUI/Jobs/SLAImportJob.cpp:235 -#: src/slic3r/GUI/Plater.cpp:2459 +#: src/slic3r/GUI/GUI_App.cpp:3027 src/slic3r/GUI/Jobs/SLAImportJob.cpp:149 +#: src/slic3r/GUI/Plater.cpp:2536 msgid "Please check your object list before preset changing." msgstr "Ellenőrizze az objektumlistát, előbeállítás váltás előtt." -#: src/slic3r/GUI/GUI_App.cpp:2901 +#: src/slic3r/GUI/GUI_App.cpp:3070 msgid "Configuration is editing from ConfigWizard" msgstr "Konfiguráció szerkesztése a ConfigWizardból_" -#: src/slic3r/GUI/GUI_App.cpp:2926 +#: src/slic3r/GUI/GUI_App.cpp:3088 +#, boost-format +msgid "Welcome to %1% version %2%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3090 +#, boost-format +msgid "" +"Do you wish to register downloads from Printables.com\n" +"for this %1% %2% executable?\n" +"\n" +"Downloads can be registered for only 1 executable at time." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3118 msgid "Select a gcode file:" msgstr "Válasszon egy gcode fájlt:" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "Open hyperlink in default browser?" msgstr "Hiperhivatkozás megnyitása az alapértelmezett böngészőben?" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "PrusaSlicer: Open hyperlink" msgstr "PrusaSlicer: Hiperhivatkozás megnyitása" -#: src/slic3r/GUI/GUI_App.cpp:3105 src/slic3r/GUI/Preferences.cpp:382 +#: src/slic3r/GUI/GUI_App.cpp:3306 src/slic3r/GUI/Preferences.cpp:593 msgid "Suppress to open hyperlink in browser" msgstr "A hiperhivatkozások böngészőben való megnyitásának letiltása" -#: src/slic3r/GUI/GUI_App.cpp:3107 src/slic3r/GUI/Plater.cpp:1732 +#: src/slic3r/GUI/GUI_App.cpp:3308 src/slic3r/GUI/Plater.cpp:1742 msgid "PrusaSlicer will remember your choice." msgstr "A PrusaSlicer emlékezni fog a választására." -#: src/slic3r/GUI/GUI_App.cpp:3108 +#: src/slic3r/GUI/GUI_App.cpp:3309 msgid "You will not be asked about it again on hyperlinks hovering." msgstr "" "Erről nem fogjuk újra megkérdezni a hiperhivatkozások lebegtetésével " "kapcsolatban." -#: src/slic3r/GUI/GUI_App.cpp:3109 src/slic3r/GUI/Plater.cpp:1736 +#: src/slic3r/GUI/GUI_App.cpp:3310 src/slic3r/GUI/Plater.cpp:1746 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" @@ -3839,57 +5056,71 @@ msgstr "" "Látogasson el a \"Beállítások\" menüpontba, és jelölje be a \"%1%\" \n" "lehetőséget a választása módosításához." -#: src/slic3r/GUI/GUI_App.cpp:3111 src/slic3r/GUI/Plater.cpp:1738 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:906 +#: src/slic3r/GUI/GUI_App.cpp:3312 src/slic3r/GUI/Plater.cpp:1748 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:934 msgid "PrusaSlicer: Don't ask me again" msgstr "PrusaSlicer: Ne kérdezzen rá újra" -#: src/slic3r/GUI/GUI_Init.cpp:57 src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_App.cpp:3386 +msgid "Check for application update has failed." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3387 +#, boost-format +msgid "No new version is available. Latest release version is %1%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3458 +msgid "Download of new version is already ongoing. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/GUI_Init.cpp:64 src/slic3r/GUI/GUI_Init.cpp:67 msgid "PrusaSlicer GUI initialization failed" msgstr "A PrusaSlicer GUI inicializálása nem sikerült" -#: src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_Init.cpp:67 #, boost-format msgid "Fatal error, exception catched: %1%" msgstr "Végzetes hiba, elkapott kivétel: %1%" #: src/slic3r/GUI/GUI_Factories.cpp:54 src/slic3r/GUI/GUI_Factories.cpp:127 -#: src/libslic3r/PrintConfig.cpp:287 src/libslic3r/PrintConfig.cpp:404 -#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:456 -#: src/libslic3r/PrintConfig.cpp:708 src/libslic3r/PrintConfig.cpp:778 -#: src/libslic3r/PrintConfig.cpp:786 src/libslic3r/PrintConfig.cpp:1232 -#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1563 -#: src/libslic3r/PrintConfig.cpp:1955 src/libslic3r/PrintConfig.cpp:2030 -#: src/libslic3r/PrintConfig.cpp:2264 src/libslic3r/PrintConfig.cpp:2850 -#: src/libslic3r/PrintConfig.cpp:2858 src/libslic3r/PrintConfig.cpp:2918 -#: src/libslic3r/PrintConfig.cpp:2927 src/libslic3r/PrintConfig.cpp:3098 +#: src/libslic3r/PrintConfig.cpp:300 src/libslic3r/PrintConfig.cpp:423 +#: src/libslic3r/PrintConfig.cpp:466 src/libslic3r/PrintConfig.cpp:475 +#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:872 +#: src/libslic3r/PrintConfig.cpp:881 src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1376 src/libslic3r/PrintConfig.cpp:1604 +#: src/libslic3r/PrintConfig.cpp:1985 src/libslic3r/PrintConfig.cpp:2060 +#: src/libslic3r/PrintConfig.cpp:2294 src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:2946 src/libslic3r/PrintConfig.cpp:3006 +#: src/libslic3r/PrintConfig.cpp:3015 src/libslic3r/PrintConfig.cpp:3186 msgid "Layers and Perimeters" msgstr "Rétegek és Kerületek" #: src/slic3r/GUI/GUI_Factories.cpp:56 src/slic3r/GUI/GUI_Factories.cpp:131 -#: src/slic3r/GUI/GUI_Preview.cpp:249 src/slic3r/GUI/Tab.cpp:1547 -#: src/slic3r/GUI/Tab.cpp:1549 src/libslic3r/ExtrusionEntity.cpp:340 -#: src/libslic3r/ExtrusionEntity.cpp:372 src/libslic3r/PrintConfig.cpp:670 -#: src/libslic3r/PrintConfig.cpp:2095 src/libslic3r/PrintConfig.cpp:2104 -#: src/libslic3r/PrintConfig.cpp:2113 src/libslic3r/PrintConfig.cpp:2123 -#: src/libslic3r/PrintConfig.cpp:2132 src/libslic3r/PrintConfig.cpp:2554 -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2568 -#: src/libslic3r/PrintConfig.cpp:2581 src/libslic3r/PrintConfig.cpp:2591 -#: src/libslic3r/PrintConfig.cpp:2599 src/libslic3r/PrintConfig.cpp:2617 -#: src/libslic3r/PrintConfig.cpp:2634 src/libslic3r/PrintConfig.cpp:2655 -#: src/libslic3r/PrintConfig.cpp:2668 src/libslic3r/PrintConfig.cpp:2685 -#: src/libslic3r/PrintConfig.cpp:2703 src/libslic3r/PrintConfig.cpp:2718 -#: src/libslic3r/PrintConfig.cpp:2728 src/libslic3r/PrintConfig.cpp:2737 -#: src/libslic3r/PrintConfig.cpp:2748 src/libslic3r/PrintConfig.cpp:2762 -#: src/libslic3r/PrintConfig.cpp:2778 src/libslic3r/PrintConfig.cpp:2786 -#: src/libslic3r/PrintConfig.cpp:2787 src/libslic3r/PrintConfig.cpp:2796 -#: src/libslic3r/PrintConfig.cpp:2810 src/libslic3r/PrintConfig.cpp:2818 -#: src/libslic3r/PrintConfig.cpp:2832 +#: src/slic3r/GUI/Tab.cpp:1494 src/slic3r/GUI/Tab.cpp:1496 +#: src/libslic3r/PrintConfig.cpp:773 src/libslic3r/PrintConfig.cpp:2125 +#: src/libslic3r/PrintConfig.cpp:2134 src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2153 src/libslic3r/PrintConfig.cpp:2162 +#: src/libslic3r/PrintConfig.cpp:2584 src/libslic3r/PrintConfig.cpp:2590 +#: src/libslic3r/PrintConfig.cpp:2598 src/libslic3r/PrintConfig.cpp:2611 +#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2628 +#: src/libslic3r/PrintConfig.cpp:2644 src/libslic3r/PrintConfig.cpp:2660 +#: src/libslic3r/PrintConfig.cpp:2681 src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2725 +#: src/libslic3r/PrintConfig.cpp:2743 src/libslic3r/PrintConfig.cpp:2753 +#: src/libslic3r/PrintConfig.cpp:2762 src/libslic3r/PrintConfig.cpp:2773 +#: src/libslic3r/PrintConfig.cpp:2785 src/libslic3r/PrintConfig.cpp:2799 +#: src/libslic3r/PrintConfig.cpp:2807 src/libslic3r/PrintConfig.cpp:2808 +#: src/libslic3r/PrintConfig.cpp:2817 src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2840 src/libslic3r/PrintConfig.cpp:2854 +#: src/libslic3r/PrintConfig.cpp:2862 src/libslic3r/PrintConfig.cpp:2873 +#: src/libslic3r/PrintConfig.cpp:2884 src/libslic3r/PrintConfig.cpp:2893 +#: src/libslic3r/PrintConfig.cpp:2903 src/libslic3r/PrintConfig.cpp:2915 msgid "Support material" msgstr "Támaszanyag" #: src/slic3r/GUI/GUI_Factories.cpp:59 src/slic3r/GUI/GUI_Factories.cpp:135 -#: src/libslic3r/PrintConfig.cpp:3054 src/libslic3r/PrintConfig.cpp:3062 +#: src/libslic3r/PrintConfig.cpp:3142 src/libslic3r/PrintConfig.cpp:3150 msgid "Wipe options" msgstr "Törlési beállítások" @@ -3897,331 +5128,352 @@ msgstr "Törlési beállítások" msgid "Pad and Support" msgstr "Párna és Támasztó" -#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/GUI_Preview.cpp:245 -#: src/slic3r/GUI/Tab.cpp:1513 src/libslic3r/ExtrusionEntity.cpp:336 -#: src/libslic3r/ExtrusionEntity.cpp:364 src/libslic3r/PrintConfig.cpp:1579 -#: src/libslic3r/PrintConfig.cpp:1585 src/libslic3r/PrintConfig.cpp:1599 -#: src/libslic3r/PrintConfig.cpp:1609 src/libslic3r/PrintConfig.cpp:1617 -#: src/libslic3r/PrintConfig.cpp:1619 +#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/Tab.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1620 src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1638 src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1656 src/libslic3r/PrintConfig.cpp:1658 msgid "Ironing" msgstr "Vasalás" -#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1283 -#: src/libslic3r/PrintConfig.cpp:1284 src/libslic3r/PrintConfig.cpp:1299 -#: src/libslic3r/PrintConfig.cpp:1309 +#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1344 src/libslic3r/PrintConfig.cpp:1356 +#: src/libslic3r/PrintConfig.cpp:1366 msgid "Fuzzy Skin" msgstr "Fuzzy bőr" -#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/GUI_Preview.cpp:220 -#: src/slic3r/GUI/Tab.cpp:1581 src/libslic3r/PrintConfig.cpp:507 -#: src/libslic3r/PrintConfig.cpp:766 src/libslic3r/PrintConfig.cpp:1326 -#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1618 -#: src/libslic3r/PrintConfig.cpp:2020 src/libslic3r/PrintConfig.cpp:2352 -#: src/libslic3r/PrintConfig.cpp:2405 src/libslic3r/PrintConfig.cpp:2903 +#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/Tab.cpp:1536 +#: src/libslic3r/PrintConfig.cpp:526 src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:548 src/libslic3r/PrintConfig.cpp:557 +#: src/libslic3r/PrintConfig.cpp:566 src/libslic3r/PrintConfig.cpp:575 +#: src/libslic3r/PrintConfig.cpp:852 src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1657 +#: src/libslic3r/PrintConfig.cpp:2050 src/libslic3r/PrintConfig.cpp:2383 +#: src/libslic3r/PrintConfig.cpp:2436 src/libslic3r/PrintConfig.cpp:2991 msgid "Speed" msgstr "Sebesség" -#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1623 -#: src/slic3r/GUI/Tab.cpp:2304 src/libslic3r/PrintConfig.cpp:796 -#: src/libslic3r/PrintConfig.cpp:1489 src/libslic3r/PrintConfig.cpp:1997 -#: src/libslic3r/PrintConfig.cpp:2373 src/libslic3r/PrintConfig.cpp:2647 -#: src/libslic3r/PrintConfig.cpp:2675 +#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1585 +#: src/slic3r/GUI/Tab.cpp:2288 src/libslic3r/PrintConfig.cpp:889 +#: src/libslic3r/PrintConfig.cpp:1530 src/libslic3r/PrintConfig.cpp:2027 +#: src/libslic3r/PrintConfig.cpp:2404 src/libslic3r/PrintConfig.cpp:2673 +#: src/libslic3r/PrintConfig.cpp:2701 msgid "Extruders" msgstr "Extruderek" -#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:754 -#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:1218 -#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:2006 -#: src/libslic3r/PrintConfig.cpp:2393 src/libslic3r/PrintConfig.cpp:2656 -#: src/libslic3r/PrintConfig.cpp:2890 +#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:840 +#: src/libslic3r/PrintConfig.cpp:953 src/libslic3r/PrintConfig.cpp:1278 +#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:2036 +#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2682 +#: src/libslic3r/PrintConfig.cpp:2978 msgid "Extrusion Width" msgstr "Extrudálási Szélesség" -#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1533 -#: src/libslic3r/PrintConfig.cpp:517 src/libslic3r/PrintConfig.cpp:528 -#: src/libslic3r/PrintConfig.cpp:544 +#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:631 src/libslic3r/PrintConfig.cpp:642 +#: src/libslic3r/PrintConfig.cpp:655 msgid "Skirt and brim" msgstr "Szoknya és karima" -#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 -#: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1645 -#: src/slic3r/GUI/Tab.cpp:1649 src/slic3r/GUI/Tab.cpp:2031 -#: src/slic3r/GUI/Tab.cpp:2402 src/slic3r/GUI/Tab.cpp:4729 -#: src/libslic3r/PrintConfig.cpp:260 src/libslic3r/PrintConfig.cpp:495 -#: src/libslic3r/PrintConfig.cpp:1438 src/libslic3r/PrintConfig.cpp:1525 -#: src/libslic3r/PrintConfig.cpp:1572 src/libslic3r/PrintConfig.cpp:2530 -#: src/libslic3r/PrintConfig.cpp:2540 src/libslic3r/PrintConfig.cpp:3078 -#: src/libslic3r/PrintConfig.cpp:3113 src/libslic3r/PrintConfig.cpp:3124 -#: src/libslic3r/PrintConfig.cpp:3139 src/libslic3r/PrintConfig.cpp:3152 -#: src/libslic3r/PrintConfig.cpp:3161 src/libslic3r/PrintConfig.cpp:3173 -#: src/libslic3r/PrintConfig.cpp:3370 -msgid "Advanced" -msgstr "Haladó" - -#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4663 src/slic3r/GUI/Tab.cpp:4664 -#: src/libslic3r/PrintConfig.cpp:3564 src/libslic3r/PrintConfig.cpp:3571 -#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3589 -#: src/libslic3r/PrintConfig.cpp:3599 src/libslic3r/PrintConfig.cpp:3609 -#: src/libslic3r/PrintConfig.cpp:3646 src/libslic3r/PrintConfig.cpp:3653 -#: src/libslic3r/PrintConfig.cpp:3664 src/libslic3r/PrintConfig.cpp:3674 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3696 -#: src/libslic3r/PrintConfig.cpp:3706 src/libslic3r/PrintConfig.cpp:3715 -#: src/libslic3r/PrintConfig.cpp:3725 src/libslic3r/PrintConfig.cpp:3736 -#: src/libslic3r/PrintConfig.cpp:3744 +#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Tab.cpp:4946 src/slic3r/GUI/Tab.cpp:4948 +#: src/libslic3r/PrintConfig.cpp:3328 src/libslic3r/PrintConfig.cpp:3337 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3356 +#: src/libslic3r/PrintConfig.cpp:3366 src/libslic3r/PrintConfig.cpp:3387 +#: src/libslic3r/PrintConfig.cpp:3410 src/libslic3r/PrintConfig.cpp:3417 +#: src/libslic3r/PrintConfig.cpp:3432 src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3464 +#: src/libslic3r/PrintConfig.cpp:3474 src/libslic3r/PrintConfig.cpp:3488 +#: src/libslic3r/PrintConfig.cpp:3498 src/libslic3r/PrintConfig.cpp:3841 +#: src/libslic3r/PrintConfig.cpp:3861 src/libslic3r/PrintConfig.cpp:3868 +#: src/libslic3r/PrintConfig.cpp:3876 msgid "Supports" msgstr "Támasztékok" -#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4704 src/slic3r/GUI/Tab.cpp:4705 -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3752 -#: src/libslic3r/PrintConfig.cpp:3759 src/libslic3r/PrintConfig.cpp:3773 -#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3794 -#: src/libslic3r/PrintConfig.cpp:3816 src/libslic3r/PrintConfig.cpp:3827 -#: src/libslic3r/PrintConfig.cpp:3834 src/libslic3r/PrintConfig.cpp:3841 -#: src/libslic3r/PrintConfig.cpp:3852 src/libslic3r/PrintConfig.cpp:3861 -#: src/libslic3r/PrintConfig.cpp:3870 +#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:590 +#: src/slic3r/GUI/Tab.cpp:4960 src/slic3r/GUI/Tab.cpp:4961 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3884 +#: src/libslic3r/PrintConfig.cpp:3891 src/libslic3r/PrintConfig.cpp:3905 +#: src/libslic3r/PrintConfig.cpp:3916 src/libslic3r/PrintConfig.cpp:3926 +#: src/libslic3r/PrintConfig.cpp:3948 src/libslic3r/PrintConfig.cpp:3959 +#: src/libslic3r/PrintConfig.cpp:3966 src/libslic3r/PrintConfig.cpp:3973 +#: src/libslic3r/PrintConfig.cpp:3984 src/libslic3r/PrintConfig.cpp:3993 +#: src/libslic3r/PrintConfig.cpp:4002 msgid "Pad" msgstr "Párna" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4722 -#: src/slic3r/GUI/Tab.cpp:4723 src/libslic3r/SLA/Hollowing.cpp:73 -#: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3880 -#: src/libslic3r/PrintConfig.cpp:3887 src/libslic3r/PrintConfig.cpp:3897 -#: src/libslic3r/PrintConfig.cpp:3906 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4978 +#: src/slic3r/GUI/Tab.cpp:4979 src/libslic3r/SLA/Hollowing.cpp:86 +#: src/libslic3r/SLA/Hollowing.cpp:91 src/libslic3r/SLA/Hollowing.cpp:106 +#: src/libslic3r/SLA/Hollowing.cpp:115 src/libslic3r/PrintConfig.cpp:4012 +#: src/libslic3r/PrintConfig.cpp:4019 src/libslic3r/PrintConfig.cpp:4029 +#: src/libslic3r/PrintConfig.cpp:4038 msgid "Hollowing" msgstr "Üregesítés" -#: src/slic3r/GUI/GUI_Factories.cpp:160 +#: src/slic3r/GUI/GUI_Factories.cpp:159 msgid "Add part" msgstr "Alkatrész hozzáadása" -#: src/slic3r/GUI/GUI_Factories.cpp:161 +#: src/slic3r/GUI/GUI_Factories.cpp:160 msgid "Add negative volume" msgstr "Negatív térfogat hozzáadása" -#: src/slic3r/GUI/GUI_Factories.cpp:162 +#: src/slic3r/GUI/GUI_Factories.cpp:161 msgid "Add modifier" msgstr "Módosító hozzáadása" -#: src/slic3r/GUI/GUI_Factories.cpp:163 +#: src/slic3r/GUI/GUI_Factories.cpp:162 msgid "Add support blocker" msgstr "Támasz blokkoló hozzáadása" -#: src/slic3r/GUI/GUI_Factories.cpp:164 +#: src/slic3r/GUI/GUI_Factories.cpp:163 msgid "Add support enforcer" msgstr "Támasz kényszerítő hozzáadása" -#: src/slic3r/GUI/GUI_Factories.cpp:300 +#: src/slic3r/GUI/GUI_Factories.cpp:169 +msgid "Add text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:170 +msgid "Add negative text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:171 +msgid "Add text modifier" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:307 msgid "Select showing settings" msgstr "Válassza ki a megjelentés beállításait" -#: src/slic3r/GUI/GUI_Factories.cpp:407 src/slic3r/GUI/GUI_Factories.cpp:412 -#: src/slic3r/GUI/GUI_Factories.cpp:556 src/slic3r/GUI/GUI_Factories.cpp:562 +#: src/slic3r/GUI/GUI_Factories.cpp:414 src/slic3r/GUI/GUI_Factories.cpp:419 +#: src/slic3r/GUI/GUI_Factories.cpp:625 src/slic3r/GUI/GUI_Factories.cpp:631 #, c-format, boost-format msgid "Quick Add Settings (%s)" msgstr "Gyors hozzáadás beállításai (%s)" -#: src/slic3r/GUI/GUI_Factories.cpp:444 +#: src/slic3r/GUI/GUI_Factories.cpp:460 msgid "Remove the selected object" msgstr "A kijelölt objektum eltávolítása" -#: src/slic3r/GUI/GUI_Factories.cpp:456 +#: src/slic3r/GUI/GUI_Factories.cpp:475 msgid "Load" msgstr "Betöltés" -#: src/slic3r/GUI/GUI_Factories.cpp:461 src/slic3r/GUI/GUI_Factories.cpp:501 -#: src/slic3r/GUI/GUI_Factories.cpp:505 +#: src/slic3r/GUI/GUI_Factories.cpp:481 src/slic3r/GUI/GUI_Factories.cpp:566 +#: src/slic3r/GUI/GUI_Factories.cpp:570 msgid "Box" msgstr "Doboz" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Cylinder" msgstr "Henger" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Slab" msgstr "Lemez" -#: src/slic3r/GUI/GUI_Factories.cpp:471 +#: src/slic3r/GUI/GUI_Factories.cpp:493 msgid "Gallery" msgstr "Galéria" -#: src/slic3r/GUI/GUI_Factories.cpp:488 src/slic3r/GUI/GUI_Factories.cpp:526 +#: src/slic3r/GUI/GUI_Factories.cpp:529 src/slic3r/GUI/GUI_Factories.cpp:549 +#: src/slic3r/GUI/GUI_ObjectList.cpp:660 +msgid "Text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:555 src/slic3r/GUI/GUI_Factories.cpp:558 +#: src/slic3r/GUI/GUI_Factories.cpp:595 msgid "Height range Modifier" msgstr "Magasságtartomány módosító" -#: src/slic3r/GUI/GUI_Factories.cpp:535 +#: src/slic3r/GUI/GUI_Factories.cpp:604 msgid "Add settings" msgstr "Beállítások hozzáadása" -#: src/slic3r/GUI/GUI_Factories.cpp:626 +#: src/slic3r/GUI/GUI_Factories.cpp:695 msgid "Change type" msgstr "Típus módosítása" -#: src/slic3r/GUI/GUI_Factories.cpp:636 src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:705 src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Object" msgstr "Legyen különálló objektum" -#: src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Objects" msgstr "Legyenek különálló objektumok" -#: src/slic3r/GUI/GUI_Factories.cpp:658 +#: src/slic3r/GUI/GUI_Factories.cpp:727 msgid "Printable" msgstr "Nyomtatható" -#: src/slic3r/GUI/GUI_Factories.cpp:686 +#: src/slic3r/GUI/GUI_Factories.cpp:755 src/slic3r/GUI/GUI_ObjectList.cpp:2070 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2582 +msgid "Invalidate cut info" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:770 msgid "Rename" msgstr "Átnevezés" -#: src/slic3r/GUI/GUI_Factories.cpp:696 +#: src/slic3r/GUI/GUI_Factories.cpp:780 msgid "Fix through the Netfabb" msgstr "Javítás Netfabb-bal" -#: src/slic3r/GUI/GUI_Factories.cpp:715 -msgid "Export as STL" -msgstr "Exportálás STL-ként" +#: src/slic3r/GUI/GUI_Factories.cpp:799 +msgid "Export as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:726 +#: src/slic3r/GUI/GUI_Factories.cpp:810 msgid "Reload the selected volumes from disk" msgstr "A kiválasztott térfogatok újra betöltésé a lemezről" -#: src/slic3r/GUI/GUI_Factories.cpp:733 src/slic3r/GUI/Plater.cpp:3568 +#: src/slic3r/GUI/GUI_Factories.cpp:817 src/slic3r/GUI/Plater.cpp:3602 msgid "Replace with STL" msgstr "Helyettesítés STL-lel" -#: src/slic3r/GUI/GUI_Factories.cpp:733 +#: src/slic3r/GUI/GUI_Factories.cpp:817 msgid "Replace the selected volume with new STL" msgstr "A kiválasztott térfogat cseréje új STL-lel" -#: src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Set extruder for selected items" msgstr "Extruder beállítása a kiválasztott elemekhez" -#: src/slic3r/GUI/GUI_Factories.cpp:778 src/slic3r/Utils/Repetier.cpp:126 -#: src/slic3r/Utils/Repetier.cpp:209 src/libslic3r/PrintConfig.cpp:635 -#: src/libslic3r/PrintConfig.cpp:2770 +#: src/slic3r/GUI/GUI_Factories.cpp:862 src/slic3r/Utils/Repetier.cpp:145 +#: src/slic3r/Utils/Repetier.cpp:226 src/libslic3r/PrintConfig.cpp:738 +#: src/libslic3r/PrintConfig.cpp:2790 src/libslic3r/PrintConfig.cpp:3851 msgid "Default" msgstr "Alapértelmezett" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale to print volume" msgstr "Skálázás a nyomtatási térfogathoz" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale the selected object to fit the print volume" msgstr "" "Méretezze a kiválasztott objektumot a (maximális) nyomtatási térfogathoz" -#: src/slic3r/GUI/GUI_Factories.cpp:835 src/slic3r/GUI/Plater.cpp:5655 +#: src/slic3r/GUI/GUI_Factories.cpp:921 src/slic3r/GUI/Plater.cpp:6213 msgid "Convert from imperial units" msgstr "Konvertálás angolszász mértékegységről" -#: src/slic3r/GUI/GUI_Factories.cpp:836 src/slic3r/GUI/Plater.cpp:5656 +#: src/slic3r/GUI/GUI_Factories.cpp:922 src/slic3r/GUI/Plater.cpp:6214 msgid "Revert conversion from imperial units" msgstr "Konvertálás visszavonása (angolszász mértékegységről)" -#: src/slic3r/GUI/GUI_Factories.cpp:837 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:923 src/slic3r/GUI/Plater.cpp:6215 msgid "Convert from meters" msgstr "Konvertálás metrikus mértékegységről" -#: src/slic3r/GUI/GUI_Factories.cpp:838 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:924 src/slic3r/GUI/Plater.cpp:6215 msgid "Revert conversion from meters" msgstr "Konvertálás visszavonása (metrikus mértékegységről)" -#: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2135 -#: src/libslic3r/PrintConfig.cpp:4523 +#: src/slic3r/GUI/GUI_Factories.cpp:945 src/slic3r/GUI/GUI_ObjectList.cpp:2290 +#: src/libslic3r/PrintConfig.cpp:4689 msgid "Merge" msgstr "Összevonás" -#: src/slic3r/GUI/GUI_Factories.cpp:859 +#: src/slic3r/GUI/GUI_Factories.cpp:945 msgid "Merge objects to the one multipart object" msgstr "Objektumok összevonása egy többrészes objektumba" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Along X axis" msgstr "X tengely mentén" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Mirror the selected object along the X axis" msgstr "A kijelölt objektum tükrözése az X tengely mentén" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Along Y axis" msgstr "Y tengely mentén" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Mirror the selected object along the Y axis" msgstr "A kijelölt objektum tükrözése az Y tengely mentén" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Along Z axis" msgstr "Z tengely mentén" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Mirror the selected object along the Z axis" msgstr "A kijelölt objektum tükrözése az Z tengely mentén" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror" msgstr "Tükrözés" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror the selected object" msgstr "A kijelölt objektum tükrözése" -#: src/slic3r/GUI/GUI_Factories.cpp:901 src/slic3r/GUI/GUI_ObjectList.cpp:1696 +#: src/slic3r/GUI/GUI_Factories.cpp:977 +msgid "Edit text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:999 +msgid "Ability to change text, font, size, ..." +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1021 src/slic3r/GUI/GUI_ObjectList.cpp:1793 msgid "Add Shape" msgstr "Alakzat hozzáadása" -#: src/slic3r/GUI/GUI_Factories.cpp:937 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "To objects" msgstr "Objektumokra" -#: src/slic3r/GUI/GUI_Factories.cpp:937 src/slic3r/GUI/GUI_Factories.cpp:954 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "Split the selected object into individual objects" msgstr "A kijelölt objektum különálló objektumokra bontása" -#: src/slic3r/GUI/GUI_Factories.cpp:940 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 msgid "To parts" msgstr "Alkatrészekre" -#: src/slic3r/GUI/GUI_Factories.cpp:940 src/slic3r/GUI/GUI_Factories.cpp:975 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 src/slic3r/GUI/GUI_Factories.cpp:1097 msgid "Split the selected object into individual parts" msgstr "A kijelölt objektum különálló alkatrészekre bontása" -#: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4552 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 src/slic3r/GUI/GUI_Factories.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:4718 msgid "Split" msgstr "Felbontás" -#: src/slic3r/GUI/GUI_Factories.cpp:944 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 msgid "Split the selected object" msgstr "A kijelölt objektum felbontása" -#: src/slic3r/GUI/GUI_Factories.cpp:1084 +#: src/slic3r/GUI/GUI_Factories.cpp:1225 src/slic3r/GUI/GUI_Factories.cpp:1243 +msgid "Set number of instances" +msgstr "Példányok számának megadása" + +#: src/slic3r/GUI/GUI_Factories.cpp:1225 +msgid "Change the number of instances of the selected objects" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1237 msgid "Add one more instance of the selected object" msgstr "A kijelölt objektum egy újabb példányának hozzáadása" -#: src/slic3r/GUI/GUI_Factories.cpp:1087 +#: src/slic3r/GUI/GUI_Factories.cpp:1240 msgid "Remove one instance of the selected object" msgstr "A kijelölt objektum egy példányának eltávolítása" -#: src/slic3r/GUI/GUI_Factories.cpp:1090 -msgid "Set number of instances" -msgstr "Példányok számának megadása" - -#: src/slic3r/GUI/GUI_Factories.cpp:1090 +#: src/slic3r/GUI/GUI_Factories.cpp:1243 msgid "Change the number of instances of the selected object" msgstr "A kijelölt objektum példányszámának módosítása" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill bed with instances" msgstr "Tárgyasztal kitöltése példányokkal" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill the remaining area of bed with instances of the selected object" msgstr "" "Tárgyasztal fennmaradó területének kitöltése a kiválasztott objektum " @@ -4243,305 +5495,353 @@ msgstr "Rétegtartomány eltávolítása" msgid "Add layer range" msgstr "Rétegtartomány hozzáadása" -#: src/slic3r/GUI/GUI_ObjectList.cpp:297 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:323 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 msgid "Name" msgstr "Név" -#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:480 +#: src/slic3r/GUI/GUI_ObjectList.cpp:342 src/slic3r/GUI/GUI_ObjectList.cpp:513 msgid "Editing" msgstr "Szerkesztés" -#: src/slic3r/GUI/GUI_ObjectList.cpp:400 +#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +msgid "Wrong volume index " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:433 msgid "No errors detected" msgstr "Nem észlelhető hiba" -#: src/slic3r/GUI/GUI_ObjectList.cpp:409 +#: src/slic3r/GUI/GUI_ObjectList.cpp:442 #, c-format, boost-format msgid "Auto-repaired %1$d error" msgid_plural "Auto-repaired %1$d errors" msgstr[0] "Automatikusan megjavított %1$d hiba" msgstr[1] "Automatikusan megjavított %1$d hibák" -#: src/slic3r/GUI/GUI_ObjectList.cpp:415 +#: src/slic3r/GUI/GUI_ObjectList.cpp:448 #, c-format, boost-format msgid "%1$d degenerate facet" msgid_plural "%1$d degenerate facets" msgstr[0] "%1$d degenerált felület" msgstr[1] "%1$d degenerált felület" -#: src/slic3r/GUI/GUI_ObjectList.cpp:417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:450 #, c-format, boost-format msgid "%1$d edge fixed" msgid_plural "%1$d edges fixed" msgstr[0] "%1$d él javtva" msgstr[1] "%1$d él javtva" -#: src/slic3r/GUI/GUI_ObjectList.cpp:419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:452 #, c-format, boost-format msgid "%1$d facet removed" msgid_plural "%1$d facets removed" msgstr[0] "%1$d felület eltávolítva" msgstr[1] "%1$d felület eltávolítva" -#: src/slic3r/GUI/GUI_ObjectList.cpp:421 +#: src/slic3r/GUI/GUI_ObjectList.cpp:454 #, c-format, boost-format msgid "%1$d facet reversed" msgid_plural "%1$d facets reversed" msgstr[0] "%1$d felület megfordítva" msgstr[1] "%1$d felületek megfordítva" -#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +#: src/slic3r/GUI/GUI_ObjectList.cpp:456 #, c-format, boost-format msgid "%1$d backward edge" msgid_plural "%1$d backward edges" msgstr[0] "%1$d hátsó él" msgstr[1] "%1$d hátsó él" -#: src/slic3r/GUI/GUI_ObjectList.cpp:426 src/slic3r/GUI/GUI_ObjectList.cpp:429 +#: src/slic3r/GUI/GUI_ObjectList.cpp:459 src/slic3r/GUI/GUI_ObjectList.cpp:462 #, c-format, boost-format msgid "%1$d open edge" msgid_plural "%1$d open edges" msgstr[0] "%1$d nyitott él" msgstr[1] "%1$d nyitott él" -#: src/slic3r/GUI/GUI_ObjectList.cpp:428 +#: src/slic3r/GUI/GUI_ObjectList.cpp:461 msgid "Remaining errors" msgstr "Fennmaradó hibák" -#: src/slic3r/GUI/GUI_ObjectList.cpp:436 +#: src/slic3r/GUI/GUI_ObjectList.cpp:469 msgid "Right button click the icon to fix STL through Netfabb" msgstr "" "Kkattintson jobb gombbal az ikonra az STL Netfabb-on történő javításhoz" -#: src/slic3r/GUI/GUI_ObjectList.cpp:482 +#: src/slic3r/GUI/GUI_ObjectList.cpp:515 msgid "Right button click the icon to change the object settings" msgstr "Kattintson jobb gombbal az ikonra az objektumbeálltások módosításához" -#: src/slic3r/GUI/GUI_ObjectList.cpp:484 +#: src/slic3r/GUI/GUI_ObjectList.cpp:517 msgid "Click the icon to change the object settings" msgstr "Kattintson az ikonra az objektumbeálltások módosításához" -#: src/slic3r/GUI/GUI_ObjectList.cpp:488 +#: src/slic3r/GUI/GUI_ObjectList.cpp:521 msgid "Right button click the icon to change the object printable property" msgstr "" "Kattintson jobb gombbal az ikonra az objektum nyomtatható tulajdonságának " "módosításához" -#: src/slic3r/GUI/GUI_ObjectList.cpp:490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:523 msgid "Click the icon to change the object printable property" msgstr "" "Kattintson az ikonra az objektum nyomtatható tulajdonságának módosításához" -#: src/slic3r/GUI/GUI_ObjectList.cpp:616 +#: src/slic3r/GUI/GUI_ObjectList.cpp:649 msgid "Change Extruder" msgstr "Extruder Váltás" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Object" msgstr "Objektum átnevezése" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Sub-object" msgstr "Al-objektum átnevezése" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1242 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4006 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1307 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4589 msgid "Instances to Separated Objects" msgstr "Példányok külön objektumokká" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Volumes in Object reordered" msgstr "Az objektumban lévő térfogatok átrendezve" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Object reordered" msgstr "Objektum átrendezve" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1298 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1363 msgid "Add Settings for Layers" msgstr "Rétegek beállításainak hozzáadása" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1299 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1364 msgid "Add Settings for Sub-object" msgstr "Alobjektumok beállításainak hozzáadása" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1300 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1365 msgid "Add Settings for Object" msgstr "Objektum beállításainak hozzáadása" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1339 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1404 msgid "Add Settings Bundle for Height range" msgstr "Magasságtartományok beállítási csomag hozzáadása" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1340 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1405 msgid "Add Settings Bundle for Sub-object" msgstr "Alobjektumok beállítási csomag hozzáadása" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1341 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1406 msgid "Add Settings Bundle for Object" msgstr "Objektum beállítási csomag hozzáadása" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Part" msgstr "Alkatrész Betöltése" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Modifier" msgstr "Módosító Betöltése" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1509 src/slic3r/GUI/Plater.cpp:2380 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1582 src/slic3r/GUI/Plater.cpp:2453 msgid "Loading" msgstr "Betöltés" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1540 src/slic3r/GUI/Plater.cpp:2417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1617 src/slic3r/GUI/Plater.cpp:2494 msgid "Loading file" msgstr "Fájl betöltése" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1548 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1625 msgid "Error!" msgstr "Hiba!" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1638 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1721 msgid "Add Generic Subobject" msgstr "Általános Részobjektum Hzáadása" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1663 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1761 msgid "Generic" msgstr "Általános" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shape from Gallery" msgstr "Alakzat Hozzáadása a Galériából" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shapes from Gallery" msgstr "Alakzatok Hozzáadása a Galériából" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1830 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1945 msgid "Remove paint-on supports" msgstr "Felfestett támasztékok eltávolítása" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1837 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 msgid "Remove paint-on seam" msgstr "Felfestett varratok eltávolítása" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1844 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 msgid "Remove Multi Material painting" msgstr "Többanyagú festés eltávolítása" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1850 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1972 msgid "Shift objects to bed" msgstr "Tárgyak tárgyasztalba helyezése" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1856 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1978 msgid "Remove variable layer height" msgstr "Változó rétegmagasság eltávolítása" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1877 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1999 msgid "Delete Settings" msgstr "Beállítások Törlése" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1901 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2023 msgid "Delete All Instances from Object" msgstr "Minden példány törlése az objektumból" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1917 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2039 msgid "Delete Height Range" msgstr "Magasságtartomány Törlése" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1949 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2057 +msgid "Delete connector from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2058 +msgid "Delete solid part from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2059 +msgid "Delete negative volume from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2061 +msgid "" +"To save cut information you can delete all connectors from all related " +"objects." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2064 +msgid "" +"This action will break a cut information.\n" +"After that PrusaSlicer can't guarantee model consistency.\n" +"\n" +"To manipulate with solid parts or negative volumes you have to invalidate " +"cut infornation first." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2072 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2612 +msgid "Delete all connectors" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2103 msgid "From Object List You can't delete the last solid part from object." msgstr "" "Az objektumlistából nem törölheti az utolsó szilárd alkatrészt az " "objektumból." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1953 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2112 msgid "Delete Subobject" msgstr "Alobjektum törlése" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1976 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2138 msgid "Last instance of an object cannot be deleted." msgstr "Egy objektum utolsó példánya nem törölhető." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1980 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +msgid "Instance cannot be deleted from cut object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2146 msgid "Delete Instance" msgstr "Példány törlése" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2004 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2170 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" "A kijelölt objektumot nem lehetett felbontani, mert csak egy alkatrészt " "tartalmaz." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2008 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2174 msgid "Split to Parts" msgstr "Alkatrészekre bontás" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2177 src/slic3r/GUI/Plater.cpp:3133 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"splitting the object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2297 msgid "Merged" msgstr "Összevonva" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2237 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2392 msgid "Merge all parts to the one single object" msgstr "Az összes alkatrész összevonása egyetlen objektummá" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2269 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2424 msgid "Add Layers" msgstr "Rétegek hozzáadása" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2438 -msgid "Group manipulation" -msgstr "Csoport manipuláció" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2695 +msgid "Cut Connectors information" +msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2453 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2705 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2768 msgid "Object manipulation" msgstr "Objektum manipuláció" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2486 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2714 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1472 +msgid "Group manipulation" +msgstr "Csoport manipuláció" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2802 msgid "Object Settings to modify" msgstr "Módosítható objektum beálltások" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2806 msgid "Part Settings to modify" msgstr "Módosítható alkatrész beálltások" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2495 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2811 msgid "Layer range Settings to modify" msgstr "Módosítható rétegtartomány beálltások" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2501 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2817 msgid "Part manipulation" msgstr "Alkatrész manipuláció" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2825 msgid "Instance manipulation" msgstr "Példány manipuláció" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Height ranges" msgstr "Magasságtartományok" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Settings for height range" msgstr "Magasságtartomány beállítások" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2750 -msgid "Delete Selected Item" -msgstr "Kijelölt elem törlése" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2943 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3363 msgid "Delete Selected" msgstr "Kijelöltek törlése" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3019 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3047 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3067 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3441 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3469 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3489 msgid "Add Height Range" msgstr "Magasságtartomány hozzáadása" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3113 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3535 msgid "" "Cannot insert a new layer range after the current layer range.\n" "The next layer range is too thin to be split to two\n" @@ -4551,7 +5851,7 @@ msgstr "" "A következő rétegtartomány túl vékony ahhoz, \n" "hogy a minimális rétegmagasság megsértése nélkül ketté lehessen osztani." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3117 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3539 msgid "" "Cannot insert a new layer range between the current and the next layer " "range.\n" @@ -4563,7 +5863,7 @@ msgstr "" "Az aktuális és a következő rétegtartomány közötti hézag vékonyabb, \n" "mint a megengedett minimális rétegmagasság." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3122 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3544 msgid "" "Cannot insert a new layer range after the current layer range.\n" "Current layer range overlaps with the next layer range." @@ -4571,238 +5871,289 @@ msgstr "" "Nem lehet új rétegtartományt beszúrni az aktuális rétegtartomány után. \n" "Az aktuális rétegtartomány átfedésben van a következő rétegtartománnyal." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3603 msgid "Edit Height Range" msgstr "Magasságtartomány szerkesztése" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3500 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3989 msgid "Selection-Remove from list" msgstr "Kijelölés - törlés listából" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4001 msgid "Selection-Add from list" msgstr "Kijelölés - hozzáadás listából" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3649 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4138 msgid "Object or Instance" msgstr "Objektum vagy példány" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Part" -msgstr "Alkatrész" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 msgid "Layer" msgstr "Réteg" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3652 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4141 msgid "Unsupported selection" msgstr "Nem támogatott kijelölés" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3653 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 #, c-format, boost-format msgid "You started your selection with %s Item." msgstr "A kiválasztást a %s elemmel kezdte." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3654 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4143 #, c-format, boost-format msgid "In this mode you can select only other %s Items%s" msgstr "Ebben az módban csak másik %s elemeket lehet kiválasztani %s" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3657 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4146 msgid "of a current Object" msgstr "egy aktuális objektum_" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3662 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3737 src/slic3r/GUI/Plater.cpp:181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4151 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4226 src/slic3r/GUI/Plater.cpp:197 msgid "Info" msgstr "Info" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3784 -msgid "You can't change a type of the last solid part of the object." -msgstr "Az objektum utolsó tömör részének típusát nem lehet megváltoztatni." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 msgid "Negative Volume" msgstr "Negatív térfogat" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Modifier" -msgstr "Módosító" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Blocker" msgstr "Támasz Blokkoló" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Enforcer" msgstr "Támasz Kényszerítő" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Select type of part" msgstr "Válassza ki az alkatrész típusát" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3795 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4359 msgid "Change Part Type" msgstr "Alkatrész Típus Módosítás" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Enter new name" msgstr "Új név megadása" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Renaming" msgstr "Átnevezés" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4091 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4681 msgid "Repairing model" msgstr "Modell javítása" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4120 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4691 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"repairing the mesh." +msgstr "" +"Az egyedi támasztékok, varratok és a többanyagú festés eltávolításra került " +"háló javítása után." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4711 msgid "Fix through NetFabb" msgstr "Javítás a NetFabb segítségével" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4123 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4714 msgid "Fixing through NetFabb" msgstr "Javítás a NetFabb segítségével" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4153 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4744 msgid "The following model was repaired successfully" msgid_plural "The following models were repaired successfully" msgstr[0] "A következő modell javítása sikerült" msgstr[1] "A következő modellek javítása sikerült" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4159 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4750 msgid "Folowing model repair failed" msgid_plural "Folowing models repair failed" msgstr[0] "A következő modell javítása nem sikerült" msgstr[1] "A következő modellek javítása nem sikerült" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4164 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4755 msgid "Repairing was canceled" msgstr "A javítást vissza lett vonva" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4276 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4869 msgid "Change Extruders" msgstr "Extruderek Cseréje" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Printable group" msgstr "Csoport beállítása nyomtathatónak" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Unprintable group" msgstr "Csoport beállítása nem nyomtathatónak" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Printable" msgstr "Beálltás nyomtathatónak" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Unprintable" msgstr "Beálltás nem nyomtathatónak" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Printable Instance" msgstr "Példány beállítása nyomtathatónak" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Unprintable Instance" msgstr "Példány beállítása nem nyomtathatónak" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:55 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:84 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:61 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:96 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1132 msgid "World coordinates" msgstr "Világ koordináták" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:56 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:85 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:97 msgid "Local coordinates" msgstr "Helyi koordináták" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:60 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:67 msgid "Select coordinate space, in which the transformation will be performed." msgstr "" "Válassza ki azt a koordináta rendszert, amelyben a transzformáció " "végrehajtását szeretné." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:141 src/libslic3r/GCode.cpp:540 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:157 src/libslic3r/GCode.cpp:491 msgid "Object name" msgstr "Objektum neve" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:201 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:521 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:221 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:710 msgid "Position" msgstr "Pozíció" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:202 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:522 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:222 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:711 #: src/slic3r/GUI/Mouse3DController.cpp:478 #: src/slic3r/GUI/Mouse3DController.cpp:499 msgid "Rotation" msgstr "Forgatás" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:250 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:239 +msgid "Size [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "Mirror along" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +#, c-format, boost-format +msgid " %c " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "axis" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:279 #, c-format, boost-format msgid "Toggle %c axis mirroring" msgstr "%c tengely tükrözésének váltása" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:284 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:329 msgid "Set Mirror" msgstr "Tükrözés beállítása" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:324 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:336 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:348 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:374 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:387 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:393 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:401 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:428 msgid "Drop to bed" msgstr "Letétel az asztalra" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:445 msgid "Reset rotation" msgstr "Forgatás visszaállítása" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 msgid "Reset Rotation" msgstr "Forgatás Visszaállítása" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:398 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:400 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:490 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:519 msgid "Reset scale" msgstr "Skála visszaállítása" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:539 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546 +msgid "Reset skew" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:553 msgid "Inches" msgstr "Angolszász" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:523 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:712 msgid "Scale factors" msgstr "Skálázási tényezők" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:577 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:740 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:752 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:793 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:801 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +msgid "Rotate (relative)" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:751 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:800 +msgid "Translate (relative) [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:829 msgid "Translate" msgstr "Eltolás" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:640 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:905 msgid "" "You cannot use non-uniform scaling mode for multiple objects/parts selection" msgstr "" "Nem használhat nem egységes méretezési módot több objektum/alkatrész " "kijelölése esetén" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:820 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +msgid "Left handed" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1133 +msgid "Object coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1134 +msgid "Part coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1176 msgid "Set Position" msgstr "Helyzet Beállítása" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:852 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1220 msgid "Set Orientation" msgstr "Tájolás Beállítása" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:931 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1351 msgid "Set Scale" msgstr "Skálázás Beállítása" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1368 +msgid "Set Size" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1427 msgid "" "The currently manipulated object is tilted (rotation angles are not " "multiples of 90°).\n" @@ -4816,7 +6167,7 @@ msgstr "" "lehetséges,\n" "miután a forgatás beágyazódik az objektum koordinátáiba." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:983 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1430 msgid "" "This operation is irreversible.\n" "Do you want to proceed?" @@ -4842,171 +6193,70 @@ msgstr "%s Opció Törlése" msgid "Change Option %s" msgstr "%s Opció Megváltoztatása" -#: src/slic3r/GUI/GUI_Preview.cpp:211 -msgid "View" -msgstr "Nézet" - -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/libslic3r/PrintConfig.cpp:808 -msgid "Height" -msgstr "Magasság" - -#: src/slic3r/GUI/GUI_Preview.cpp:219 src/libslic3r/PrintConfig.cpp:3032 -msgid "Width" -msgstr "Szélesség" - -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2016 -msgid "Fan speed" -msgstr "Ventilátor sebesség" - -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1991 -msgid "Temperature" -msgstr "Hőmérséklet" - -#: src/slic3r/GUI/GUI_Preview.cpp:223 -msgid "Volumetric flow rate" -msgstr "Térfogatáram" - -#: src/slic3r/GUI/GUI_Preview.cpp:228 -msgid "Show" -msgstr "Megjelenítés" - -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/GUI_Preview.cpp:254 -msgid "Feature types" -msgstr "Részelem típus" - -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:330 -#: src/libslic3r/ExtrusionEntity.cpp:352 -msgid "Perimeter" -msgstr "Kerület" - -#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:331 -#: src/libslic3r/ExtrusionEntity.cpp:354 -msgid "External perimeter" -msgstr "Külső kerület" - -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:332 -#: src/libslic3r/ExtrusionEntity.cpp:356 -msgid "Overhang perimeter" -msgstr "Túllógó kerület" - -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:333 -#: src/libslic3r/ExtrusionEntity.cpp:358 -msgid "Internal infill" -msgstr "Belső kitöltés" - -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:334 -#: src/libslic3r/ExtrusionEntity.cpp:360 src/libslic3r/PrintConfig.cpp:1407 -#: src/libslic3r/PrintConfig.cpp:2392 src/libslic3r/PrintConfig.cpp:2404 -msgid "Solid infill" -msgstr "Tömör kitöltés" - -#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:335 -#: src/libslic3r/ExtrusionEntity.cpp:362 src/libslic3r/PrintConfig.cpp:1416 -#: src/libslic3r/PrintConfig.cpp:2889 src/libslic3r/PrintConfig.cpp:2902 -msgid "Top solid infill" -msgstr "Felső tömör kitöltés" - -#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:337 -#: src/libslic3r/ExtrusionEntity.cpp:366 -msgid "Bridge infill" -msgstr "Híd kitöltés" - -#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:338 -#: src/libslic3r/ExtrusionEntity.cpp:368 src/libslic3r/PrintConfig.cpp:1325 -msgid "Gap fill" -msgstr "Hézag kitöltés" - -#: src/slic3r/GUI/GUI_Preview.cpp:248 src/libslic3r/ExtrusionEntity.cpp:339 -#: src/libslic3r/ExtrusionEntity.cpp:370 -msgid "Skirt/Brim" -msgstr "Szoknya/Karima" - -#: src/slic3r/GUI/GUI_Preview.cpp:250 src/libslic3r/ExtrusionEntity.cpp:341 -#: src/libslic3r/ExtrusionEntity.cpp:374 src/libslic3r/PrintConfig.cpp:2736 -msgid "Support material interface" -msgstr "Támaszanyag interfész" - -#: src/slic3r/GUI/GUI_Preview.cpp:251 src/slic3r/GUI/Tab.cpp:1634 -#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/ExtrusionEntity.cpp:376 -msgid "Wipe tower" -msgstr "Törlőtorony" - -#: src/slic3r/GUI/GUI_Preview.cpp:728 +#: src/slic3r/GUI/GUI_Preview.cpp:581 msgid "NOTE:" msgstr "MEGJEGYZÉS:" -#: src/slic3r/GUI/GUI_Preview.cpp:729 +#: src/slic3r/GUI/GUI_Preview.cpp:582 #, boost-format msgid "Sliced object \"%1%\" looks like a logo or a sign" msgstr "" "A \"%1%\" szeletelt objektum úgy néz ki, mint egy logó vagy egy felirat" -#: src/slic3r/GUI/GUI_Preview.cpp:730 +#: src/slic3r/GUI/GUI_Preview.cpp:583 msgid "Apply color change automatically" msgstr "Színváltás alkalmazása automatikusan" -#: src/slic3r/GUI/GUI_Preview.cpp:1058 -msgid "Shells" -msgstr "Héjak" - -#: src/slic3r/GUI/GUI_Preview.cpp:1059 -msgid "Tool marker" -msgstr "Szerszám jelölő" - -#: src/slic3r/GUI/GUI_Preview.cpp:1060 -msgid "Legend/Estimated printing time" -msgstr "Magyarázat/becsült nyomtatási idő" - -#: src/slic3r/GUI/HintNotification.cpp:771 -#: src/slic3r/GUI/HintNotification.cpp:797 -#: src/slic3r/GUI/NotificationManager.cpp:374 -#: src/slic3r/GUI/NotificationManager.cpp:391 +#: src/slic3r/GUI/HintNotification.cpp:773 +#: src/slic3r/GUI/HintNotification.cpp:799 +#: src/slic3r/GUI/NotificationManager.cpp:457 +#: src/slic3r/GUI/NotificationManager.cpp:474 msgid "More" msgstr "Bővebben" -#: src/slic3r/GUI/HintNotification.cpp:912 +#: src/slic3r/GUI/HintNotification.cpp:914 msgid "Open Preferences." msgstr "Beállítások megnyitása." -#: src/slic3r/GUI/HintNotification.cpp:1004 +#: src/slic3r/GUI/HintNotification.cpp:1006 msgid "Open Documentation in web browser." msgstr "Dokumentáció megnyitása a webböngészőben." -#: src/slic3r/GUI/ImGuiWrapper.cpp:527 +#: src/slic3r/GUI/ImGuiWrapper.cpp:666 msgid "Edit" msgstr "Szerkesztés" -#: src/slic3r/GUI/ImGuiWrapper.cpp:960 src/slic3r/GUI/Search.cpp:470 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1166 src/slic3r/GUI/Search.cpp:531 msgid "Use for search" msgstr "Kereséshez használja" -#: src/slic3r/GUI/ImGuiWrapper.cpp:961 src/slic3r/GUI/Search.cpp:463 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1167 src/slic3r/GUI/Search.cpp:524 msgid "Category" msgstr "Kategória" -#: src/slic3r/GUI/ImGuiWrapper.cpp:963 src/slic3r/GUI/Search.cpp:465 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1169 src/slic3r/GUI/Search.cpp:526 msgid "Search in English" msgstr "Keresés Angolul" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:174 -msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "" -"Nem sikerült elrendezni a modell objektumokat! Egyes geometriák " -"érvénytelenek lehetnek." - -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:183 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:168 msgid "Arranging" msgstr "Elrendezés" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:207 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:204 msgid "Arranging canceled." msgstr "Elrendezés visszavonva." -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:208 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:205 msgid "Arranging done." msgstr "Elrendezés kész." -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:253 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:225 +msgid "Could not arrange model objects! Some geometries may be invalid." +msgstr "" +"Nem sikerült elrendezni a modell objektumokat! Egyes geometriák " +"érvénytelenek lehetnek." + +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:265 #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -5017,40 +6267,83 @@ msgstr "" "férnek el a tárgyasztalon:\n" "%s" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:119 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:108 msgid "Filling bed" msgstr "Tárgyasztal kitöltése" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:130 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:140 msgid "Bed filling canceled." msgstr "Tárgyasztal kitöltés megszakítva." -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:131 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:141 msgid "Bed filling done." msgstr "Tárgyasztal kitöltése kész." -#: src/slic3r/GUI/Jobs/Job.cpp:111 -msgid "ERROR: not enough resources to execute a new job." -msgstr "HIBA: nincs elegendő erőforrás egy új feladat végrehajtásához." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:148 src/slic3r/GUI/Jobs/EmbossJob.cpp:596 +msgid "Can't create empty volume." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:201 +msgid "Can't create empty object." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:208 +msgid "Add Emboss text object" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:247 +msgid "Created text volume is empty. Change text or font." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:465 +msgid "" +"It is used default volume for embossed text, try to change text or font to " +"fix it." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:549 +#, boost-format +msgid "Text: %1%" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:593 +msgid "Bad object to create volume." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:598 +msgid "Add Emboss text Volume" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:698 +msgid "Font doesn't have any shape for given text." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:738 +msgid "There is no volume in projection direction." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:787 +msgid "There is no valid surface for text projection." +msgstr "" -#: src/slic3r/GUI/Jobs/PlaterJob.cpp:13 -msgid "An unexpected error occured" -msgstr "Váratlan hiba történt" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:823 +msgid "Issue during embossing the text." +msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:21 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:22 msgid "Best surface quality" msgstr "Legjobb felületminőség" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:23 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 msgid "Optimize object rotation for best surface quality." msgstr "" "Az objektum forgatásának optimalizálása a legjobb felületminőség érdekében." -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:25 msgid "Reduced overhang slopes" msgstr "Csökkentett túlnyúlás meredekség" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:26 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:27 msgid "" "Optimize object rotation to have minimum amount of overhangs needing support " "structures.\n" @@ -5063,65 +6356,33 @@ msgstr "" "legjobb felületét a tágyasztalhoz való érintkezéshez, amennyiben nincs " "megadva magasság." -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:30 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:31 msgid "Lowest Z height" msgstr "Legalacsonyabb Z magasság" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:32 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:33 msgid "Rotate the model to have the lowest z height for faster print time." msgstr "" "Forgassa úgy a modellt, hogy a Z magasság a legkisebb legyen, a rövidebb " "nyomtatási idő érdekében." -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:59 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:53 msgid "Searching for optimal orientation" msgstr "Az optimális tájolás keresése" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:77 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:83 msgid "Orientation search canceled." msgstr "Tájolás keresés visszavonva." -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:78 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:84 msgid "Orientation found." msgstr "Tájolás megtalálva." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:36 -msgid "Choose SLA archive:" -msgstr "SLA archívum kiválasztása:" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:40 -msgid "Import file" -msgstr "Fájl importálása" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47 -msgid "Import model and profile" -msgstr "Modell és profil importálása" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48 -msgid "Import profile only" -msgstr "Csak profil importálása" - #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:49 -msgid "Import model only" -msgstr "Csak modell importálása" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60 -msgid "Accurate" -msgstr "Precíz" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61 -msgid "Balanced" -msgstr "Kiegyensúlyozott" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:62 -msgid "Quick" -msgstr "Gyors" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:140 msgid "Importing SLA archive" msgstr "SLA archívum importálása" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:158 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:77 msgid "" "The SLA archive doesn't contain any presets. Please activate some SLA " "printer preset first before importing that SLA archive." @@ -5129,19 +6390,23 @@ msgstr "" "Az SLA archívum nem tartalmaz előbeállításokat. Kérjük, aktiváljon néhány " "SLA nyomtató előbeállítást az SLA archívum importálása előtt." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:164 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:81 +msgid "Import is unavailable for this archive format." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:86 msgid "Importing canceled." msgstr "Importálás megszakítva." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:165 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:87 msgid "Importing done." msgstr "Importálás kész." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:187 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:108 msgid "The file does not exist." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:221 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135 msgid "" "The imported SLA archive did not contain any presets. The current SLA " "presets were used as fallback." @@ -5149,166 +6414,174 @@ msgstr "" "Az importált SLA-archívum nem tartalmazott előbeállításokat. Az aktuális SLA " "előbeállítások kerülnek felhasználásra." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:234 src/slic3r/GUI/Plater.cpp:2458 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:148 src/slic3r/GUI/Plater.cpp:2535 msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "" "Nem tölthet be olyan SLA projektet, amelyben több részből álló objektum van " "a tárgyasztalon" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:236 src/slic3r/GUI/Plater.cpp:2460 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:150 src/slic3r/GUI/Plater.cpp:2537 msgid "Attention!" msgstr "Figyelem!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:166 +msgid "The profile in the imported archive is corrupt and will not be loaded." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:178 +msgid "" +"No object could be retrieved from the archive. The slices might be corrupted " +"or missing." +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1184 msgid "Keyboard Shortcuts" msgstr "Gyorsbillentyűk" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:77 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:86 msgid "New project, clear plater" msgstr "Új projekt, üres tárgyasztal" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:78 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 msgid "Open project AMF/3MF with config, clear plater" msgstr "AMF/3MF projekt megnyitása konfigurációval, üres tárgyasztal" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 msgid "Save project (3mf)" msgstr "Projekt mentése (3mf)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 msgid "Save project as (3mf)" msgstr "Projekt mentése másként (3mf)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:81 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 msgid "(Re)slice" msgstr "(Újra)szeletelés" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:83 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:92 msgid "Import STL/3MF/STEP/OBJ/AMF without config, keep plater" msgstr "" "STL/OBJ/AMF/3MF/STEP Importálása konfiguráció nélkül, a tárgyasztal " "megtartásával" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:84 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 msgid "Import Config from ini/amf/3mf/gcode" msgstr "Konfiguráció importálása ini/amf/3mf/gcode fájlból" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:85 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "" "Konfiguráció betöltése ini/amf/3mf/gcode fájlból, és hozzáadás a meglévőhöz" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6543 src/libslic3r/PrintConfig.cpp:4423 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:96 src/slic3r/GUI/Plater.cpp:948 +#: src/slic3r/GUI/Plater.cpp:7161 src/libslic3r/PrintConfig.cpp:4575 msgid "Export G-code" msgstr "G-kód exportálása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:97 src/slic3r/GUI/Plater.cpp:7162 msgid "Send G-code" msgstr "G-kód küldése" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 msgid "Export config" msgstr "Beállítások exportálása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 src/slic3r/GUI/Plater.cpp:896 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 src/slic3r/GUI/Plater.cpp:931 msgid "Export to SD card / Flash drive" msgstr "Exportálás SD kártyára / Flash meghajtóra" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:91 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 msgid "Eject SD card / Flash drive" msgstr "SD-kártya/ Flash meghajtó eltávolítása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 msgid "Select all objects" msgstr "Összes objektum kijelölése" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 msgid "Deselect all" msgstr "Összes kijelölés megszüntetése" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:95 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 msgid "Delete selected" msgstr "Kijelöltek törlése" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 -msgid "Copy to clipboard" -msgstr "Másolás a vágólapra" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 msgid "Paste from clipboard" msgstr "Beillesztés a vágólapról" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Reload plater from disk" msgstr "Tárgyasztal újratöltése lemezről" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 msgid "Select Plater Tab" msgstr "Tárgyasztal Fül Kiválasztása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 msgid "Select Print Settings Tab" msgstr "Nyomtatási Beállítások Fül Kiválasztása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 msgid "Select Filament Settings Tab" msgstr "Filament Beállítások Fül Kiválasztása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 msgid "Select Printer Settings Tab" msgstr "Nyomtató Beállítások Fül Kiválasztása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 msgid "Switch to 3D" msgstr "Váltás 3D nézetre" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 msgid "Switch to Preview" msgstr "Váltás Előnézetre" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 -#: src/slic3r/GUI/PrintHostDialogs.cpp:217 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +#: src/slic3r/GUI/PrintHostDialogs.cpp:267 msgid "Print host upload queue" msgstr "Nyomtató-feltöltési várakozási sor" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/MainFrame.cpp:75 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 src/slic3r/GUI/MainFrame.cpp:77 msgid "Open new instance" msgstr "Új példány megnyitása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 msgid "Camera view" msgstr "Kamera nézet" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 msgid "Show/Hide object/instance labels" msgstr "Objektum/példánycímkék megjelenítése/elrejtése" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Preferences.cpp:46 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Preferences.cpp:57 +#: src/slic3r/GUI/Preferences.cpp:165 src/slic3r/GUI/Preferences.cpp:188 +#: src/slic3r/GUI/Preferences.cpp:207 src/slic3r/GUI/Preferences.cpp:215 msgid "Preferences" msgstr "Beállítások" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 msgid "Show keyboard shortcuts list" msgstr "A billentyűparancsok listájának megjelenítése" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 msgid "Commands" msgstr "Parancsok" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 msgid "Add Instance of the selected object" msgstr "A kijelölt objektum újabb példányának hozzáadása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Remove Instance of the selected object" msgstr "A kijelölt objektum egy példányának eltávolítása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 msgid "" "Press to select multiple objects\n" "or move multiple objects with mouse" @@ -5316,140 +6589,144 @@ msgstr "" "Nyomja meg a gombot több objektum kiválasztásához\n" "vagy egérrel való mozgatásáshoz" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 msgid "Press to activate selection rectangle" msgstr "Nyomja meg a kiválasztási téglalap aktiválásához" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 msgid "Press to activate deselection rectangle" msgstr "Nyomja meg a kijelölés megszüntetése téglalap aktiválásához" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Arrow Up" msgstr "Felfelé nyíl" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 msgid "Move selection 10 mm in positive Y direction" msgstr "Kijelölés mozgatása 10 mm-rel pozitív Y irányban" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Arrow Down" msgstr "Lefelé nyíl" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 msgid "Move selection 10 mm in negative Y direction" msgstr "Kijelölés mozgatása 10 mm-rel negatív Y irányban" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Arrow Left" msgstr "Balra nyíl" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 msgid "Move selection 10 mm in negative X direction" msgstr "Kijelölés mozgatása 10 mm-rel negatív X irányban" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Arrow Right" msgstr "Jobbra nyíl" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 msgid "Move selection 10 mm in positive X direction" msgstr "Kijelölés mozgatása 10 mm-rel pozitív X irányban" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Any arrow" msgstr "Bármelyik nyíl" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 msgid "Movement step set to 1 mm" msgstr "A mozgatási lépték 1 mm-re állítása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Movement in camera space" msgstr "Mozgás a kameratérben" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Page Up" msgstr "Page Up" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Rotate selection 45 degrees CCW" msgstr "Kijelölés elfordítása 45 fokkal óramutató járásával ellentétesen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Page Down" msgstr "Page Down" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Rotate selection 45 degrees CW" msgstr "Kijelölés elfordítása 45 fokkal óramutató járásával megegyezően" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 msgid "Gizmo move" msgstr "Gizmo mozgatása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 msgid "Gizmo scale" msgstr "Gizmo skálázása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Gizmo rotate" msgstr "Gizmo forgatása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Gizmo cut" msgstr "Gizmo vágása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 msgid "Gizmo Place face on bed" msgstr "Gizmo felület tárgyasztalra illesztése" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 msgid "Gizmo SLA hollow" msgstr "Gizmo SLA üreg" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 msgid "Gizmo SLA support points" msgstr "Gizmo SLA támaszték pontok" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 msgid "Gizmo FDM paint-on supports" msgstr "Gizmo FDM támaszték festés" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 msgid "Gizmo FDM paint-on seam" msgstr "Gizmo FDM varrat festés" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 msgid "Gizmo Multi Material painting" msgstr "Gizmo Többanyagú festés" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +msgid "Gizmo Text emboss / engrave" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 msgid "Unselect gizmo or clear selection" msgstr "Gizmo kijelölésének megszüntetése, vagy kijelölés megszüntetése" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 msgid "Change camera type (perspective, orthographic)" msgstr "Kamera típusának módosítása (perspektivikus, ortografikus)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 msgid "Zoom to Bed" msgstr "Zoom a tárgyasztalra" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 msgid "" "Zoom to selected object\n" "or all objects in scene, if none selected" @@ -5457,179 +6734,179 @@ msgstr "" "Nagyítás a kiválasztott objektumra\n" "vagy az összes objektumra a jelenetben, ha egy sincs kiválasztva" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 msgid "Zoom in" msgstr "Zoom közelítés" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Zoom out" msgstr "Zoom távolítás" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Switch between Editor/Preview" msgstr "Váltás Szerkesztő/Előnézet között" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Collapse/Expand the sidebar" msgstr "Az oldalsáv összecsukás/kibontása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled" msgstr "" "3Dconnexion eszközök beállításai párbeszédpanel megjelenítése/elrejtése, ha " "engedélyezve van" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "" "3Dconnexion eszközök beállításai párbeszédpanel megjelenítése/elrejtése" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 msgid "Minimize application" msgstr "Alkalmazás minimalizálása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 src/slic3r/GUI/MainFrame.cpp:284 -#: src/slic3r/GUI/MainFrame.cpp:333 src/slic3r/GUI/MainFrame.cpp:445 -#: src/slic3r/GUI/MainFrame.cpp:448 src/slic3r/GUI/MainFrame.cpp:470 -#: src/slic3r/GUI/MainFrame.cpp:473 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 src/slic3r/GUI/MainFrame.cpp:329 +#: src/slic3r/GUI/MainFrame.cpp:378 src/slic3r/GUI/MainFrame.cpp:490 +#: src/slic3r/GUI/MainFrame.cpp:493 src/slic3r/GUI/MainFrame.cpp:515 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Plater" msgstr "Tárgyasztal" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button" msgstr "Minden gizmo: Forgatás - bal egérgomb; Pásztázás - jobb egérgomb" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 msgid "Gizmo move: Press to snap by 1mm" msgstr "Gizmo mozgatása: Nyomja meg az 1 mm-rel elmozgatáshoz" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 msgid "Gizmo scale: Press to snap by 5%" msgstr "Gizmo mozgatása: Nyomja meg az 5%-kal elmozgatáshoz" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 msgid "Gizmo scale: Scale selection to fit print volume" msgstr "" "Gizmo skálázása: A kiválasztás skálázása a nyomtatási térfogathoz igazodva" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 msgid "Gizmo scale: Press to activate one direction scaling" msgstr "Gizmo skálázása: Nyomja meg az egyirányú skálázás aktiválásához" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 msgid "Gizmo scale: Press to scale selected objects around their own center" msgstr "" "Gizmo skálázása: Nyomja meg a kiválasztott objektumok saját középpontjuk " "körüli skálázásához" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 msgid "Gizmo rotate: Press to rotate selected objects around their own center" msgstr "" "Gizmo forgatása: Nyomja meg a kiválasztott objektumok saját középpontjuk " "körül történő elforgatásához" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "Gizmos" msgstr "Gizmok" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "" "The following shortcuts are applicable when the specified gizmo is active" msgstr "" "A következő parancsikonok akkor alkalmazhatók, ha a megadott gizmo aktív" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 msgid "Set selected items as Printable/Unprintable" msgstr "A kiválasztott elemek beállítása nyomtatható/nem nyomtathatóként" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:203 msgid "Set default extruder for the selected items" msgstr "Alapértelmezett extruder beállítása a kiválasztott elemekhez" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 msgid "Set extruder number for the selected items" msgstr "Extruder számának beállítása a kiválasztott elemekhez" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 msgid "Objects List" msgstr "Objektumok Listája" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/MainFrame.cpp:1611 msgid "Open a G-code file" msgstr "G-kód fájl megnyitása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 -#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 -#: src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 src/slic3r/GUI/MainFrame.cpp:1443 +#: src/slic3r/GUI/MainFrame.cpp:1447 src/slic3r/GUI/MainFrame.cpp:1616 +#: src/slic3r/GUI/MainFrame.cpp:1620 msgid "Reload the plater from disk" msgstr "Tárgyasztal újratöltése lemezről" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 msgid "Vertical slider - Move active thumb Up" msgstr "Függőleges csúszka - Aktív jelölő mozgatása Fel" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:228 msgid "Vertical slider - Move active thumb Down" msgstr "Függőleges csúszka - Aktív jelölő mozgatása Le" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 msgid "Horizontal slider - Move active thumb Left" msgstr "Vízszintes csúszka - Aktív jelölő mozgatása Balra" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 msgid "Horizontal slider - Move active thumb Right" msgstr "Vízszintes csúszka - Aktív jelölő mozgatása Jobbra" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:231 msgid "On/Off one layer mode of the vertical slider" msgstr "A függőleges csúszka egyrétegű módjának Be/Kikapcsolása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 -msgid "Show/Hide Legend and Estimated printing time" -msgstr "Jelmagyarázat és becsült nyomtatási idő megjelenítése/elrejtése" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:232 +msgid "Show/Hide legend" +msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 msgid "Show/Hide G-code window" msgstr "G-kód ablak megjelenítése/elrejtése" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4480 -#: src/slic3r/GUI/Tab.cpp:2832 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 src/slic3r/GUI/Plater.cpp:4562 +#: src/slic3r/GUI/Tab.cpp:2736 msgid "Preview" msgstr "Előnézet" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 msgid "Move active thumb Up" msgstr "Aktív jelölő mozgatása Fel" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 msgid "Move active thumb Down" msgstr "Aktív jelölő mozgatása Le" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 msgid "Set upper thumb as active" msgstr "Felső jelölő aktiválása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 msgid "Set lower thumb as active" msgstr "Alsó jelölő aktiválása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 msgid "Add color change marker for current layer" msgstr "Színváltási jelölő hozzáadása az aktuális réteghez" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:238 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:244 msgid "Delete color change marker for current layer" msgstr "Színváltási jelölő eltávolítása az aktuális rétegről" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:250 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:251 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:245 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:256 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:257 msgid "" "Press to speed up 5 times while moving thumb\n" "with arrow keys or mouse wheel" @@ -5637,11 +6914,11 @@ msgstr "" "Nyomja meg 5-szörös gyorsításhoz a jelölő\n" "nyílbillentyűkkel vagy egérgörgővel való mozgatása közben" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "Vertical Slider" msgstr "Függőleges Csúszka" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "" "The following shortcuts are applicable in G-code preview when the vertical " "slider is active" @@ -5649,27 +6926,27 @@ msgstr "" "A következő billentyűparancsok használhatók a G-kód előnézetében, amikor a " "függőleges csúszka aktív" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Move active thumb Left" msgstr "Az aktív jelölő balra mozgatása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Move active thumb Right" msgstr "Az aktív jelölő jobbra mozgatása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Set left thumb as active" msgstr "Bal jelölő beállítása aktívként" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Set right thumb as active" msgstr "Jobb jelölő beállítása aktívként" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "Horizontal Slider" msgstr "Vízszintes Csúszka" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "" "The following shortcuts are applicable in G-code preview when the horizontal " "slider is active" @@ -5677,139 +6954,139 @@ msgstr "" "A következő billentyűparancsok használhatók a G-kód előnézetében, amikor a " "vízszintes csúszka aktív" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:278 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:284 msgid "Keyboard shortcuts" msgstr "Gyorsbillentyűk" -#: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:77 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open a new PrusaSlicer instance" msgstr "Új PrusaSlicer példány megnyitása" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:93 msgid "G-code preview" msgstr "G-kód előnézet" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:1388 msgid "Open G-code viewer" msgstr "G-kód nézegető megnyitása" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:91 src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open PrusaSlicer" msgstr "PrusaSlicer megnyitása" -#: src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:93 msgid "Open new G-code viewer" msgstr "Új G-kód nézegető megnyitása" -#: src/slic3r/GUI/MainFrame.cpp:225 +#: src/slic3r/GUI/MainFrame.cpp:227 msgid "Closing PrusaSlicer. Current project is modified." msgstr "A PrusaSlicer bezárása. A jelenlegi projekt módosult." -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "PrusaSlicer is closing" msgstr "A PrusaSlicer kilép" -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "Closing PrusaSlicer while some presets are modified." msgstr "A PrusaSlicer bezárása, miközben egyes előbeállítások módosultak." -#: src/slic3r/GUI/MainFrame.cpp:285 src/slic3r/GUI/MainFrame.cpp:335 -#: src/slic3r/GUI/Tab.hpp:427 src/slic3r/GUI/Tab.hpp:550 +#: src/slic3r/GUI/MainFrame.cpp:330 src/slic3r/GUI/MainFrame.cpp:380 +#: src/slic3r/GUI/Tab.hpp:413 src/slic3r/GUI/Tab.hpp:539 msgid "Print Settings" msgstr "Nyomtatási Beállítások" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:535 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:384 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:520 msgid "Material Settings" msgstr "Alapanyag Beállítások" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:461 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:382 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:448 msgid "Filament Settings" msgstr "Filament Beállítások" -#: src/slic3r/GUI/MainFrame.cpp:287 src/slic3r/GUI/MainFrame.cpp:341 -#: src/slic3r/GUI/Tab.hpp:503 +#: src/slic3r/GUI/MainFrame.cpp:332 src/slic3r/GUI/MainFrame.cpp:386 +#: src/slic3r/GUI/Tab.hpp:488 msgid "Printer Settings" msgstr "Nyomtató Beállítások" -#: src/slic3r/GUI/MainFrame.cpp:632 src/slic3r/GUI/Plater.cpp:1719 -#: src/slic3r/GUI/Plater.cpp:2850 +#: src/slic3r/GUI/MainFrame.cpp:685 src/slic3r/GUI/Plater.cpp:1728 +#: src/slic3r/GUI/Plater.cpp:2879 msgid "Untitled" msgstr "Névtelen" -#: src/slic3r/GUI/MainFrame.cpp:655 +#: src/slic3r/GUI/MainFrame.cpp:710 msgid "based on Slic3r" msgstr "a Slic3r alapján" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Prusa 3D &Drivers" msgstr "Prusa 3D Meghajtók" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Open the Prusa3D drivers download page in your browser" msgstr "A Prusa3D illesztőprogramok letöltési oldalának megnyitása böngészőben" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Software &Releases" msgstr "Szoftver Kiadások" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open the software releases page in your browser" msgstr "A szoftverkiadások oldal megnyitása böngészőben" -#: src/slic3r/GUI/MainFrame.cpp:1081 +#: src/slic3r/GUI/MainFrame.cpp:1158 #, c-format, boost-format msgid "%s &Website" msgstr "%s Weboldal" -#: src/slic3r/GUI/MainFrame.cpp:1082 +#: src/slic3r/GUI/MainFrame.cpp:1159 #, c-format, boost-format msgid "Open the %s website in your browser" msgstr "A %s webhely megnyitása böngészőben" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "System &Info" msgstr "Rendszer információ" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "Show system information" msgstr "Rendszerinformáció mutatása" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show &Configuration Folder" msgstr "Konfigurációs Mappa Megjelenítése" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show user configuration folder (datadir)" msgstr "Konfigurációs Mappa Megjelenítése (datadir)" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "Report an I&ssue" msgstr "Hibabejelentés" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 #, c-format, boost-format msgid "Report an issue on %s" msgstr "Probléma bejelentése itt: %s" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 #, c-format, boost-format msgid "&About %s" msgstr "A %s névjegye" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 msgid "Show about dialog" msgstr "A Szerzőről szóló párbeszédpanel megnyitása" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1177 msgid "Show Tip of the Day" msgstr "Nap Tippje Mutatása" -#: src/slic3r/GUI/MainFrame.cpp:1104 +#: src/slic3r/GUI/MainFrame.cpp:1181 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." @@ -5817,94 +7094,94 @@ msgstr "" "Megnyitja a nap tippje értesítést a jobb alsó sarokban, vagy egy másik " "tippet jelenít meg, ha már nyitva van." -#: src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/MainFrame.cpp:1184 msgid "Show the list of the keyboard shortcuts" msgstr "A billentyűparancsok listájának megjelenítése" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso" msgstr "Izometrikus" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso View" msgstr "Izometrikus nézet" #. TRN To be shown in the main menu View->Top #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2917 -#: src/libslic3r/PrintConfig.cpp:2926 +#: src/slic3r/GUI/MainFrame.cpp:1202 src/libslic3r/PrintConfig.cpp:3005 +#: src/libslic3r/PrintConfig.cpp:3014 msgid "Top" msgstr "Felül" -#: src/slic3r/GUI/MainFrame.cpp:1125 +#: src/slic3r/GUI/MainFrame.cpp:1202 msgid "Top View" msgstr "Felülnézet" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:446 -#: src/libslic3r/PrintConfig.cpp:455 +#: src/slic3r/GUI/MainFrame.cpp:1205 src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:474 msgid "Bottom" msgstr "Alul" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1205 msgid "Bottom View" msgstr "Alulnézet" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front" msgstr "Elöl" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front View" msgstr "Elölnézet" -#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2274 +#: src/slic3r/GUI/MainFrame.cpp:1209 src/libslic3r/PrintConfig.cpp:2300 msgid "Rear" msgstr "Hátul" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1209 msgid "Rear View" msgstr "Hátulnézet" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left" msgstr "Bal" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left View" msgstr "Balnézet" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right" msgstr "Jobb" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right View" msgstr "Jobbnézet" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "&New Project" msgstr "Új Projekt" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "Start a new project" msgstr "Új projekt elkezdése" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "&Open Project" msgstr "Projekt megnyitása" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "Open a project file" msgstr "Projekt fájl megnyitása" -#: src/slic3r/GUI/MainFrame.cpp:1157 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Recent projects" msgstr "Legutóbbi projektek" -#: src/slic3r/GUI/MainFrame.cpp:1169 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -5912,510 +7189,544 @@ msgstr "" "A kiválasztott projekt már nem elérhető.\n" "El szeretné távolítani a legutóbbi projektek listájáról?" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Save Project" msgstr "Projekt mentése" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "Save current project file" msgstr "Aktuális projekt fájl mentése" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save Project &as" msgstr "Projekt mentése másként" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save current project file as" msgstr "Aktuális projekt fájl mentése másként" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Import STL/3MF/STEP/OBJ/AM&F" msgstr "STL/3MF/STEP/OBJ/AM&F Importálása" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Load a model" msgstr "Modell betöltése" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Import STL (Imperial Units)" msgstr "STL (Angolszász mértékegységek) Importálása" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Load an model saved with imperial units" msgstr "Angolszász mértékegységekkel mentett modell importálása" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Import SL1 / SL1S Archive" -msgstr "SL1 / SL1S Archív Importálása" +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Import SLA Archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Load an SLA archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Import ZIP Achive" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Load an SL1 / Sl1S archive" -msgstr "SL1 / Sl1S archív betöltése" +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Load a zip achive" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Import &Config" msgstr "Konfiguráció Importálása" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Load exported configuration file" msgstr "Korábban exportált konfigurációs fájl betöltése" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Import Config from &Project" msgstr "Konfiguráció Importálása Projektből" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Load configuration from project file" msgstr "Konfiguráció betöltése projekt fájlból" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Import Config &Bundle" msgstr "Konfigurációs Csomag Importálása" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Load presets from a bundle" msgstr "Előbeállítások betöltése konfigurációs csomagból" -#: src/slic3r/GUI/MainFrame.cpp:1231 +#: src/slic3r/GUI/MainFrame.cpp:1311 msgid "&Import" msgstr "Importálás" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1314 src/slic3r/GUI/MainFrame.cpp:1676 msgid "Export &G-code" msgstr "G-kód Exportálása" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1314 msgid "Export current plate as G-code" msgstr "Az aktuális tárgyasztal exportálása G-kódként" -#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1318 src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end G-code" msgstr "G-kód Küldése" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1318 msgid "Send to print current plate as G-code" msgstr "Az aktuális tárgyasztal küldése nyomtatóra G-kódként" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export G-code to SD Card / Flash Drive" msgstr "G-kód Exportálása SD Kártyára / Flash memóriára" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "Tárgyasztal Exportálása G-kódként SD Kártyára / Flash memóriára" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export Plate as &STL" -msgstr "Tárgyasztal Exportálása STL-ként" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export Plate as &STL/OBJ" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export current plate as STL" -msgstr "Tárgyasztal Exportálása STL-ként" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export current plate as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export Plate as STL &Including Supports" -msgstr "Tárgyasztal Exportálása STL-ként támasztékokkal együtt" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export Plate as STL/OBJ &Including Supports" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export current plate as STL including supports" -msgstr "Tárgyasztal Exportálása STL-ként támasztékokkal együtt" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export current plate as STL/OBJ including supports" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export &Toolpaths as OBJ" msgstr "Szerszámpálya Exportálása OBJ-ként" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export toolpaths as OBJ" msgstr "Szerszámpálya Exportálása OBJ-ként" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export &Config" msgstr "Beállítások Exportálása" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export current configuration to file" msgstr "Aktuális beállítások exportálása fájlba" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export Config &Bundle" msgstr "Konfigurációs Csomag Exportálása" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export all presets to file" msgstr "Az összes előbeállítás exportálása fájlba" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export Config Bundle With Physical Printers" msgstr "Konfigurációs Csomag Exportálása Fizikai Nyomtatókkal együtt" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export all presets including physical printers to file" msgstr "Konfigurációs csomag exportálása a fizikai nyomtatókkal együtt" -#: src/slic3r/GUI/MainFrame.cpp:1270 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "&Export" msgstr "Exportlálás" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Ejec&t SD Card / Flash Drive" msgstr "SD Kártya / Flash meghajtó eltávolítása" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "SD-kártyát / Flash meghajtót eltávolítása a G-kódot exportálása után." -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Quick Slice" msgstr "Gyors Szeletelés" -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Slice a file into a G-code" msgstr "Fájl szeletelése G-kódba" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Quick Slice and Save As" msgstr "Gyors Szeletelés és Mentés Másként" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Slice a file into a G-code, save as" msgstr "Fájl szeletelése G-kódba, mentés másként" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat Last Quick Slice" msgstr "Az Előző Gyors Szeletetelés Megismétlése" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat last quick slice" msgstr "Az előző gyors szeletetelés megismétlése" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "(Re)Slice No&w" msgstr "(Újra)Szeletelés Most" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "Start new slicing process" msgstr "Új szeletelés indítása" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "&Repair STL file" msgstr "STL fájl javítása" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "Automatically repair an STL file" msgstr "STL fájl automatikus javítása" -#: src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:1388 msgid "&G-code Preview" msgstr "G-Kód Előnézet" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1392 +msgid "E&xit" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1392 src/slic3r/GUI/UpdateDialogs.cpp:376 +#: src/slic3r/GUI/UpdateDialogs.cpp:423 +#, c-format, boost-format +msgid "Exit %s" +msgstr "Kilépés %s" + +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 msgid "&Quit" msgstr "Bezárás" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 #, c-format, boost-format msgid "Quit %s" msgstr "Kilépés %s" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1410 msgid "&Select All" msgstr "Összes kijelőlése" -#: src/slic3r/GUI/MainFrame.cpp:1327 +#: src/slic3r/GUI/MainFrame.cpp:1411 msgid "Selects all objects" msgstr "Az összes objektum kijelölése" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1413 msgid "D&eselect All" msgstr "Összes Kijelölés Megszüntetése" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1414 msgid "Deselects all objects" msgstr "Az összes objektum kijelölésének megszüntetése" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1417 msgid "&Delete Selected" msgstr "Kijelöltek törlése" -#: src/slic3r/GUI/MainFrame.cpp:1334 +#: src/slic3r/GUI/MainFrame.cpp:1418 msgid "Deletes the current selection" msgstr "Az összes kijelölt objektum törlése" -#: src/slic3r/GUI/MainFrame.cpp:1336 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Delete &All" msgstr "Összes törlése" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1421 msgid "Deletes all objects" msgstr "Az összes objektum törlése" -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1425 msgid "&Undo" msgstr "Visszavonás" -#: src/slic3r/GUI/MainFrame.cpp:1344 +#: src/slic3r/GUI/MainFrame.cpp:1428 msgid "&Redo" msgstr "Mégis" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1433 msgid "&Copy" msgstr "Másolás" -#: src/slic3r/GUI/MainFrame.cpp:1350 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Copy selection to clipboard" msgstr "Kijelöltek másolása a vágólapra" -#: src/slic3r/GUI/MainFrame.cpp:1352 +#: src/slic3r/GUI/MainFrame.cpp:1436 msgid "&Paste" msgstr "&Beillesztés" -#: src/slic3r/GUI/MainFrame.cpp:1353 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "Paste clipboard" msgstr "Beillesztés a vágólapról" -#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 -#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 +#: src/slic3r/GUI/MainFrame.cpp:1442 src/slic3r/GUI/MainFrame.cpp:1446 +#: src/slic3r/GUI/MainFrame.cpp:1615 src/slic3r/GUI/MainFrame.cpp:1619 msgid "Re&load from Disk" msgstr "Újratöltés lemezről" -#: src/slic3r/GUI/MainFrame.cpp:1368 +#: src/slic3r/GUI/MainFrame.cpp:1452 msgid "Searc&h" msgstr "Keresés" -#: src/slic3r/GUI/MainFrame.cpp:1369 +#: src/slic3r/GUI/MainFrame.cpp:1453 msgid "Search in settings" msgstr "Keresés a beállításokban" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "&Plater Tab" msgstr "Tárgyasztal Fül" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "Show the plater" msgstr "Tárgyasztal mutatása" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "P&rint Settings Tab" msgstr "Nyomtatási Beállítások Fül" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "Show the print settings" msgstr "Nyomtatási beállítások mutatása" -#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1469 src/slic3r/GUI/MainFrame.cpp:1679 msgid "&Filament Settings Tab" msgstr "Filament Beállítások Fül" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1469 msgid "Show the filament settings" msgstr "Filament beállítások mutatása" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Print&er Settings Tab" msgstr "Nyomtató Beállítások Fül" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Show the printer settings" msgstr "Nyomtató beállítások mutatása" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "3&D" msgstr "3D" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "Show the 3D editing view" msgstr "3D szerkesztő nézet mutatása" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Pre&view" msgstr "Előnézet" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Show the 3D slices preview" msgstr "3D szeletek nézet mutatása" -#: src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/MainFrame.cpp:1488 msgid "Open the dialog to modify shape gallery" msgstr "Dialógusablak megnyitása az Alakzat Galéria szerkesztéséhez" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Print &Host Upload Queue" msgstr "Nyomtató-feltöltési várakozási sor" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Display the Print Host Upload Queue window" msgstr "A Nyomtató-feltöltési várakozási sor ablak megjelenítése" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open New Instance" msgstr "Új Példány Megnyitása" -#: src/slic3r/GUI/MainFrame.cpp:1424 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 +#: src/slic3r/GUI/MainFrame.cpp:1507 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1727 msgid "Compare Presets" msgstr "Előbeállítások Összehasonlítása" -#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/MainFrame.cpp:1507 msgid "Compare presets" msgstr "Előbeállítások összehasonlítása" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show &Labels" msgstr "Címkék Mutatása" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show object/instance labels in 3D scene" msgstr "Objektum/példánycímkék megjelenítése 3D-s jelenetben" -#: src/slic3r/GUI/MainFrame.cpp:1437 +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show Legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show legend in preview" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1523 msgid "&Collapse Sidebar" msgstr "Oldalsáv Összecsukása" -#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1523 src/slic3r/GUI/Plater.cpp:2347 msgid "Collapse sidebar" msgstr "&Az oldalsáv összecsukása" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "&Fullscreen" msgstr "Teljes Képernyő" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "Fullscreen" msgstr "Teljes képernyő" -#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1543 src/slic3r/GUI/MainFrame.cpp:1650 msgid "&File" msgstr "&Fájl" -#: src/slic3r/GUI/MainFrame.cpp:1458 +#: src/slic3r/GUI/MainFrame.cpp:1544 msgid "&Edit" msgstr "&Szerkesztés" -#: src/slic3r/GUI/MainFrame.cpp:1459 +#: src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Window" msgstr "&Ablak" -#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 +#: src/slic3r/GUI/MainFrame.cpp:1546 src/slic3r/GUI/MainFrame.cpp:1651 msgid "&View" msgstr "&Nézet" -#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 +#: src/slic3r/GUI/MainFrame.cpp:1549 src/slic3r/GUI/MainFrame.cpp:1654 msgid "&Help" msgstr "&Segítség" -#: src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/MainFrame.cpp:1611 msgid "&Open G-code" msgstr "&G-kód megnyitása" -#: src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open &PrusaSlicer" msgstr "PrusaSlicer Megnyitása" -#: src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legend" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1676 msgid "E&xport" msgstr "Exportálás" -#: src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end to print" msgstr "Nyomtatásra küldés" -#: src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1679 msgid "Mate&rial Settings Tab" msgstr "Anyagbeállítások Lap" -#: src/slic3r/GUI/MainFrame.cpp:1613 +#: src/slic3r/GUI/MainFrame.cpp:1703 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Válasszon egy fájlt a szeleteléshez (STL/OBJ/AMF/3MF/PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1625 +#: src/slic3r/GUI/MainFrame.cpp:1715 msgid "No previously sliced file." msgstr "Nincs korábban szeletelt fájl." -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid "Previously sliced file (" msgstr "A korábban szeletelt fájl (" -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid ") not found." msgstr ") nem található." -#: src/slic3r/GUI/MainFrame.cpp:1633 +#: src/slic3r/GUI/MainFrame.cpp:1723 msgid "File Not Found" msgstr "Fájl Nem Található" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 #, c-format, boost-format msgid "Save %s file as:" msgstr "%s fájl mentése másként:" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "G-code" msgstr "G-kód" -#: src/slic3r/GUI/MainFrame.cpp:1680 +#: src/slic3r/GUI/MainFrame.cpp:1770 msgid "Save zip file as:" msgstr "Zip fájl mentése másként:" -#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6064 src/slic3r/GUI/Tab.cpp:1666 -#: src/slic3r/GUI/Tab.cpp:4730 +#: src/slic3r/GUI/MainFrame.cpp:1779 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6654 src/slic3r/GUI/Tab.cpp:1628 +#: src/slic3r/GUI/Tab.cpp:4986 msgid "Slicing" msgstr "Szeletelés" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1691 +#: src/slic3r/GUI/MainFrame.cpp:1781 #, c-format, boost-format msgid "Processing %s" msgstr "Feldolgozás %s" -#: src/slic3r/GUI/MainFrame.cpp:1714 +#: src/slic3r/GUI/MainFrame.cpp:1804 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% szeletelése sikeresen megtörtént." -#: src/slic3r/GUI/MainFrame.cpp:1717 +#: src/slic3r/GUI/MainFrame.cpp:1807 msgid "Slicing Done!" msgstr "Szeletelés Kész!" -#: src/slic3r/GUI/MainFrame.cpp:1733 +#: src/slic3r/GUI/MainFrame.cpp:1823 msgid "Select the STL file to repair:" msgstr "Válassza ki a javítandó STL fájlt:" -#: src/slic3r/GUI/MainFrame.cpp:1743 +#: src/slic3r/GUI/MainFrame.cpp:1833 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "" "OBJ fájl mentése (kevésbé hajlamos a koordinációs hibákra, mint az STL) a " "másként:" -#: src/slic3r/GUI/MainFrame.cpp:1754 +#: src/slic3r/GUI/MainFrame.cpp:1844 msgid "Your file was repaired." msgstr "A fájlja javításra került." -#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4528 +#: src/slic3r/GUI/MainFrame.cpp:1844 src/libslic3r/PrintConfig.cpp:4694 msgid "Repair" msgstr "Javítás" -#: src/slic3r/GUI/MainFrame.cpp:1768 +#: src/slic3r/GUI/MainFrame.cpp:1858 msgid "Save configuration as:" msgstr "Konfiguráció mentése a következőként:" -#: src/slic3r/GUI/MainFrame.cpp:1785 +#: src/slic3r/GUI/MainFrame.cpp:1875 msgid "Loading of a configuration file" msgstr "Konfigurációs fájl betöltése" -#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 +#: src/slic3r/GUI/MainFrame.cpp:1877 src/slic3r/GUI/MainFrame.cpp:1944 msgid "Select configuration to load:" msgstr "A Betöltendő konfiguráció kiválasztása:" -#: src/slic3r/GUI/MainFrame.cpp:1816 +#: src/slic3r/GUI/MainFrame.cpp:1908 msgid "Exporting configuration bundle" msgstr "Konfigurációs csomag exportálása" -#: src/slic3r/GUI/MainFrame.cpp:1817 +#: src/slic3r/GUI/MainFrame.cpp:1909 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." @@ -6423,15 +7734,15 @@ msgstr "" "Egyes előre beállított értékek módosultak, és a nem mentett módosítások nem " "kerülnek exportálásra a konfigurációs csomagba." -#: src/slic3r/GUI/MainFrame.cpp:1826 +#: src/slic3r/GUI/MainFrame.cpp:1918 msgid "Save presets bundle as:" msgstr "Előbeállítási csomag mentése a következőként:" -#: src/slic3r/GUI/MainFrame.cpp:1849 +#: src/slic3r/GUI/MainFrame.cpp:1941 msgid "Loading of a configuration bundle" msgstr "Konfigurációs csomag betöltése" -#: src/slic3r/GUI/MainFrame.cpp:1879 +#: src/slic3r/GUI/MainFrame.cpp:1971 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d előbeállítás sikeresen importálva." @@ -6500,19 +7811,19 @@ msgstr "%s info" msgid "%s information" msgstr "%s információ" -#: src/slic3r/GUI/NotificationManager.hpp:752 +#: src/slic3r/GUI/NotificationManager.hpp:899 msgid "3D Mouse disconnected." msgstr "3D egér leválasztva." -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "Configuration update is available." msgstr "A konfiguráció frissítése elérhető." -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "See more." msgstr "Továbbiak megjelenítése." -#: src/slic3r/GUI/NotificationManager.hpp:761 +#: src/slic3r/GUI/NotificationManager.hpp:908 msgid "" "You have just added a G-code for color change, but its value is empty.\n" "To export the G-code correctly, check the \"Color Change G-code\" in " @@ -6522,7 +7833,7 @@ msgstr "" "A G-kód helyes exportálásához jelölje be a \"G-kód színének módosítása\" " "lehetőséget a \"Nyomtatóbeállítások > Egyéni G-kód\" részben." -#: src/slic3r/GUI/NotificationManager.hpp:764 +#: src/slic3r/GUI/NotificationManager.hpp:911 msgid "" "No color change event was added to the print. The print does not look like a " "sign." @@ -6530,144 +7841,187 @@ msgstr "" "A nyomtatáshoz nem adott hozzá színváltoztatási eseményt. A nyomtatás nem " "úgy néz ki, mint a nézet." -#: src/slic3r/GUI/NotificationManager.hpp:766 +#: src/slic3r/GUI/NotificationManager.hpp:913 msgid "Desktop integration was successful." msgstr "Az asztal integrációja sikeres volt." -#: src/slic3r/GUI/NotificationManager.hpp:768 +#: src/slic3r/GUI/NotificationManager.hpp:915 msgid "Desktop integration failed." msgstr "Az asztal integrációja nem sikerült." -#: src/slic3r/GUI/NotificationManager.hpp:770 +#: src/slic3r/GUI/NotificationManager.hpp:917 msgid "Undo desktop integration was successful." msgstr "Az asztal integrációjának visszavonása sikeres volt." -#: src/slic3r/GUI/NotificationManager.hpp:772 +#: src/slic3r/GUI/NotificationManager.hpp:919 msgid "Undo desktop integration failed." msgstr "Az asztal integrációjának visszavonása nem volt sikeres." -#: src/slic3r/GUI/NotificationManager.hpp:773 +#: src/slic3r/GUI/NotificationManager.hpp:920 msgid "Exporting." msgstr "Exportálás." -#: src/slic3r/GUI/NotificationManager.cpp:664 +#: src/slic3r/GUI/NotificationManager.hpp:924 +msgid "" +"PrusaSlicer recieved a download request from Printables.com, but it's not " +"allowed. You can allow it" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:925 +msgid "here." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:773 msgid "Open Folder." msgstr "Mappa Megnyitása." -#: src/slic3r/GUI/NotificationManager.cpp:701 +#: src/slic3r/GUI/NotificationManager.cpp:811 msgid "Eject drive" msgstr "Meghajtó kiadása" -#: src/slic3r/GUI/NotificationManager.cpp:885 +#: src/slic3r/GUI/NotificationManager.cpp:1054 +#: src/slic3r/GUI/NotificationManager.cpp:1267 +#: src/slic3r/GUI/NotificationManager.cpp:1472 msgid "ERROR" msgstr "HIBA" -#: src/slic3r/GUI/NotificationManager.cpp:890 -msgid "CANCELED" -msgstr "VISSZAVONVA" - -#: src/slic3r/GUI/NotificationManager.cpp:895 +#: src/slic3r/GUI/NotificationManager.cpp:1269 +#: src/slic3r/GUI/NotificationManager.cpp:1377 msgid "COMPLETED" msgstr "KÉSZ" -#: src/slic3r/GUI/NotificationManager.cpp:937 +#: src/slic3r/GUI/NotificationManager.cpp:1467 +msgid "RESOLVING ADDRESS" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:1477 +msgid "CANCELED" +msgstr "VISSZAVONVA" + +#: src/slic3r/GUI/NotificationManager.cpp:1539 msgid "Cancel upload" msgstr "Feltöltés visszavonása" -#: src/slic3r/GUI/NotificationManager.cpp:996 +#: src/slic3r/GUI/NotificationManager.cpp:1648 #, c-format, boost-format msgid "%1$d object was loaded with custom supports." msgid_plural "%1$d objects were loaded with custom supports." msgstr[0] "%1$d objektum betöltésre került egyéni támasztékokkal." msgstr[1] "%1$d objektum betöltésre került egyéni támasztékokkal." -#: src/slic3r/GUI/NotificationManager.cpp:997 +#: src/slic3r/GUI/NotificationManager.cpp:1649 #, c-format, boost-format msgid "%1$d object was loaded with custom seam." msgid_plural "%1$d objects were loaded with custom seam." msgstr[0] "%1$d objektum betöltésre került egyéni varrattal." msgstr[1] "%1$d objektum betöltésre került egyéni varrattal." -#: src/slic3r/GUI/NotificationManager.cpp:998 +#: src/slic3r/GUI/NotificationManager.cpp:1650 #, c-format, boost-format msgid "%1$d object was loaded with multimaterial painting." msgid_plural "%1$d objects were loaded with multimaterial painting." msgstr[0] "%1$d objektum betöltésre került többanyagú festéssel." msgstr[1] "%1$d objektum betöltésre került többanyagú festéssel." -#: src/slic3r/GUI/NotificationManager.cpp:999 +#: src/slic3r/GUI/NotificationManager.cpp:1651 #, c-format, boost-format msgid "%1$d object was loaded with variable layer height." msgid_plural "%1$d objects were loaded with variable layer height." msgstr[0] "%1$d objektum betöltésre került változó rétegmagassággal." msgstr[1] "%1$d objektum betöltésre került változó rétegmagassággal." -#: src/slic3r/GUI/NotificationManager.cpp:1000 +#: src/slic3r/GUI/NotificationManager.cpp:1652 #, c-format, boost-format msgid "%1$d object was loaded with partial sinking." msgid_plural "%1$d objects were loaded with partial sinking." msgstr[0] "%1$d objektum betöltésre került részleges süllyedéssel." msgstr[1] "%1$d objektum betöltésre került részleges süllyedéssel." -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1653 +#, c-format, boost-format +msgid "%1$d object was loaded as a part of cut object." +msgid_plural "%1$d objects were loaded as parts of cut object" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Slicing finished." msgstr "Szeletelés kész." -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export G-Code." msgstr "G-Kód Exportálása." -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export." msgstr "Exportálás." -#: src/slic3r/GUI/NotificationManager.cpp:1447 -#: src/slic3r/GUI/NotificationManager.cpp:1454 -#: src/slic3r/GUI/NotificationManager.cpp:1470 -#: src/slic3r/GUI/NotificationManager.cpp:1476 -#: src/slic3r/GUI/NotificationManager.cpp:1547 +#: src/slic3r/GUI/NotificationManager.cpp:2101 +#: src/slic3r/GUI/NotificationManager.cpp:2108 +#: src/slic3r/GUI/NotificationManager.cpp:2124 +#: src/slic3r/GUI/NotificationManager.cpp:2130 +#: src/slic3r/GUI/NotificationManager.cpp:2201 msgid "ERROR:" msgstr "HIBA:" -#: src/slic3r/GUI/NotificationManager.cpp:1459 -#: src/slic3r/GUI/NotificationManager.cpp:1486 -#: src/slic3r/GUI/NotificationManager.cpp:1494 -#: src/slic3r/GUI/NotificationManager.cpp:1505 src/slic3r/GUI/Plater.cpp:3197 +#: src/slic3r/GUI/NotificationManager.cpp:2113 +#: src/slic3r/GUI/NotificationManager.cpp:2140 +#: src/slic3r/GUI/NotificationManager.cpp:2148 +#: src/slic3r/GUI/NotificationManager.cpp:2159 src/slic3r/GUI/Plater.cpp:3220 msgid "WARNING:" msgstr "FIGYELMEZTETÉS:" -#: src/slic3r/GUI/NotificationManager.cpp:1598 +#: src/slic3r/GUI/NotificationManager.cpp:2275 msgid "Exporting finished." msgstr "Exportálás kész." -#: src/slic3r/GUI/ObjectDataViewModel.cpp:50 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 msgid "Paint-on seam" msgstr "Varrat festése" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:52 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:68 +msgid "Cut connectors" +msgstr "" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:70 msgid "Sinking" msgstr "Süllyedés" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:110 msgid "Instances" msgstr "Példányok" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:98 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:266 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:114 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:275 #, c-format, boost-format msgid "Instance %d" msgstr "Példány %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4568 -#: src/slic3r/GUI/Tab.cpp:4659 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:121 src/slic3r/GUI/Tab.cpp:4805 +#: src/slic3r/GUI/Tab.cpp:4942 msgid "Layers" msgstr "Rétegek" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 msgid "Range" msgstr "Tartomány" -#: src/slic3r/GUI/OpenGLManager.cpp:258 +#: src/slic3r/GUI/OpenGLManager.cpp:376 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL ES 2.0 capable graphics driver to run " +"correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:379 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL %s capable graphics driver to run correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:382 #, c-format, boost-format msgid "" "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" @@ -6677,11 +8031,11 @@ msgstr "" "szükség, \n" "miközben az alábbiakat észleltük: OpenGL verzió %s, render %s, vendor %s." -#: src/slic3r/GUI/OpenGLManager.cpp:261 +#: src/slic3r/GUI/OpenGLManager.cpp:386 msgid "You may need to update your graphics card driver." msgstr "Lehet, hogy frissítenie kell a grafikus kártya illesztőprogramját." -#: src/slic3r/GUI/OpenGLManager.cpp:264 +#: src/slic3r/GUI/OpenGLManager.cpp:389 msgid "" "As a workaround, you may run PrusaSlicer with a software rendered 3D " "graphics by running prusa-slicer.exe with the --sw-renderer parameter." @@ -6690,11 +8044,11 @@ msgstr "" "is használható, ha a prusa-slicer.exe programot a --sw-renderer paraméterrel " "indítja el." -#: src/slic3r/GUI/OpenGLManager.cpp:266 +#: src/slic3r/GUI/OpenGLManager.cpp:391 msgid "Unsupported OpenGL version" msgstr "Nem támogatott OpenGL verzió" -#: src/slic3r/GUI/OpenGLManager.cpp:274 +#: src/slic3r/GUI/OpenGLManager.cpp:399 #, c-format, boost-format msgid "" "Unable to load the following shaders:\n" @@ -6703,16 +8057,20 @@ msgstr "" "Nem sikerült betölteni a következő Shaderekett:\n" "%s" -#: src/slic3r/GUI/OpenGLManager.cpp:275 +#: src/slic3r/GUI/OpenGLManager.cpp:400 msgid "Error loading shaders" msgstr "Hiba a shaderek betöltésekor" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:126 +msgid "Unavailable for this method." +msgstr "" + +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Top" msgstr "Felső" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Bottom" msgstr "Alsó" @@ -6721,7 +8079,7 @@ msgstr "Alsó" msgid "Delete this preset from this printer device" msgstr "Az előbeállítás törlése erről a nyomtatóeszközről" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:83 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:84 msgid "This printer will be shown in the presets list as" msgstr "" "Ez a nyomtató az előbeállítások listájában a következőképpen jelenik meg" @@ -6738,33 +8096,33 @@ msgstr "A nyomtató leíró elnevezése" msgid "Add preset for this printer device" msgstr "Előbeállítás hozzáadása ehhez a nyomtatóeszközhöz" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2255 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2239 msgid "Print Host upload" msgstr "Nyomtató feltöltés" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:268 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:271 msgid "Connection to printers connected via the print host failed." msgstr "" "A nyomtatási gazdán keresztül csatlakoztatott nyomtatókhoz való csatlakozás " "meghiúsult." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:310 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:313 msgid "Test" msgstr "Teszt" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:315 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:318 msgid "Could not get a valid Printer Host reference" msgstr "Nem sikerült érvényes nyomtató gazdagép hivatkozást szerezni" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:330 msgid "Success!" msgstr "Siker!" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:337 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:340 msgid "Refresh Printers" msgstr "Nyomtatók Frissítése" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:367 msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." @@ -6772,20 +8130,20 @@ msgstr "" "A HTTPS CA fájl opcionális. Csak akkor van rá szükség, ha a HTTPS-t saját " "aláírású tanúsítvánnyal használja." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:374 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:377 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "Tanúsítványfájlok (*.crt, *.pem)|*.crt;*.pem|Minden fájl|*.*" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:378 msgid "Open CA certificate file" msgstr "CA tanúsítvány fájl megnyitása" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:404 -#: src/libslic3r/PrintConfig.cpp:330 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:407 +#: src/libslic3r/PrintConfig.cpp:343 msgid "HTTPS CA File" msgstr "HTTPS CA Fájl" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:405 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:408 #, c-format, boost-format msgid "" "On this system, %s uses HTTPS certificates from the system Certificate Store " @@ -6794,7 +8152,7 @@ msgstr "" "Ezen a rendszeren a %s HTTPS-tanúsítványokat használ a rendszer " "tanúsítványtárolójából vagy kulcstárából." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:406 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:409 msgid "" "To use a custom CA file, please import your CA file into Certificate Store / " "Keychain." @@ -6802,24 +8160,24 @@ msgstr "" "Egyéni CA fájl használatához kérjük, importálja a CA fájlt a " "Tanúsítványtárolóba / Kulcstárba." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:634 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:706 msgid "The supplied name is empty. It can't be saved." msgstr "A megadott név üres. Nem menthető el." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:638 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:710 msgid "You have to enter a printer name." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:646 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:718 #, boost-format msgid "Printer with name \"%1%\" already exists." msgstr "A \"%1%\" nevű nyomtató már létezik." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:647 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:719 msgid "Replace?" msgstr "Lecseréli?" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:674 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:746 #, boost-format msgid "" "Following printer preset is duplicated:%1%The above preset for printer \"%2%" @@ -6834,19 +8192,19 @@ msgstr[1] "" "A következő nyomtató előbeállítások duplikálódtak:%1% A fenti előbeállítások " "a \"%2%\" nyomtatóhoz csak egyszer kerülnek felhasználásra." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:724 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:796 msgid "It's not possible to delete the last related preset for the printer." msgstr "Nem lehet törölni a nyomtató utolsó kapcsolódó előbeállítását." -#: src/slic3r/GUI/Plater.cpp:141 +#: src/slic3r/GUI/Plater.cpp:158 msgid "The provided name is not valid;" msgstr "A megadott név érvénytelen;" -#: src/slic3r/GUI/Plater.cpp:142 src/slic3r/GUI/SavePresetDialog.cpp:102 +#: src/slic3r/GUI/Plater.cpp:159 src/slic3r/GUI/SavePresetDialog.cpp:166 msgid "the following characters are not allowed:" msgstr "a következő karakterek nem engedélyezettek:" -#: src/slic3r/GUI/Plater.cpp:207 +#: src/slic3r/GUI/Plater.cpp:223 msgid "" "For a multipart object, this value isn't accurate.\n" "It doesn't take account of intersections and negative volumes." @@ -6854,69 +8212,69 @@ msgstr "" "Egy többrészes objektum esetében ez az érték nem pontos.\n" "Nem veszi figyelembe a metszeteket és a negatív térfogatokat." -#: src/slic3r/GUI/Plater.cpp:211 +#: src/slic3r/GUI/Plater.cpp:227 msgid "Volume" msgstr "Térfogat" -#: src/slic3r/GUI/Plater.cpp:213 +#: src/slic3r/GUI/Plater.cpp:229 msgid "Facets" msgstr "Felületek" -#: src/slic3r/GUI/Plater.cpp:276 +#: src/slic3r/GUI/Plater.cpp:286 msgid "Sliced Info" msgstr "Szeletelt Info" -#: src/slic3r/GUI/Plater.cpp:296 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:306 src/slic3r/GUI/Plater.cpp:1414 msgid "Used Filament (g)" msgstr "Felhasznált Filament (g)" -#: src/slic3r/GUI/Plater.cpp:297 src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:307 src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (m)" msgstr "Felhasznált Filament (m)" -#: src/slic3r/GUI/Plater.cpp:298 src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:308 src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (mm³)" msgstr "Felhasznált Filament (mm³)" -#: src/slic3r/GUI/Plater.cpp:299 +#: src/slic3r/GUI/Plater.cpp:309 msgid "Used Material (unit)" msgstr "Felhasznált Alapanyag (egység)" -#: src/slic3r/GUI/Plater.cpp:300 +#: src/slic3r/GUI/Plater.cpp:310 msgid "Cost (money)" msgstr "Költség (pénz)" -#: src/slic3r/GUI/Plater.cpp:301 src/slic3r/GUI/Plater.cpp:1340 -#: src/slic3r/GUI/Plater.cpp:1427 +#: src/slic3r/GUI/Plater.cpp:311 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:1464 msgid "Estimated printing time" msgstr "Becsült nyomtatási idő" -#: src/slic3r/GUI/Plater.cpp:302 +#: src/slic3r/GUI/Plater.cpp:312 msgid "Number of tool changes" msgstr "Szerszámcserék száma" -#: src/slic3r/GUI/Plater.cpp:431 +#: src/slic3r/GUI/Plater.cpp:437 msgid "Select what kind of support do you need" msgstr "Válassza ki, milyen támaszra van szüksége" -#: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2590 -#: src/libslic3r/PrintConfig.cpp:3645 +#: src/slic3r/GUI/Plater.cpp:440 src/libslic3r/PrintConfig.cpp:2620 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "Support on build plate only" msgstr "Támaszték csak tárgyasztalról" -#: src/slic3r/GUI/Plater.cpp:434 src/slic3r/GUI/Plater.cpp:564 +#: src/slic3r/GUI/Plater.cpp:441 msgid "For support enforcers only" msgstr "Csak támaszték kényszerítőkre" -#: src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Plater.cpp:442 msgid "Everywhere" msgstr "Mindenhol" -#: src/slic3r/GUI/Plater.cpp:467 src/slic3r/GUI/Tab.cpp:1542 +#: src/slic3r/GUI/Plater.cpp:475 src/slic3r/GUI/Tab.cpp:1489 msgid "Brim" msgstr "Karima" -#: src/slic3r/GUI/Plater.cpp:469 +#: src/slic3r/GUI/Plater.cpp:477 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." @@ -6924,116 +8282,113 @@ msgstr "" "Ez a jelölő engedélyezi a karimát, amely az első réteg minden objektuma köré " "kerül nyomtatásra." -#: src/slic3r/GUI/Plater.cpp:477 +#: src/slic3r/GUI/Plater.cpp:485 msgid "Purging volumes" msgstr "Öblítési térfogatok" -#: src/slic3r/GUI/Plater.cpp:578 +#: src/slic3r/GUI/Plater.cpp:592 msgid "Select what kind of pad do you need" msgstr "Válassza ki, milyen párnára van szüksége" -#: src/slic3r/GUI/Plater.cpp:580 +#: src/slic3r/GUI/Plater.cpp:595 msgid "Below object" msgstr "Objektum alatt" -#: src/slic3r/GUI/Plater.cpp:581 +#: src/slic3r/GUI/Plater.cpp:596 msgid "Around object" msgstr "Objektum körül" -#: src/slic3r/GUI/Plater.cpp:894 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/Plater.cpp:929 src/slic3r/GUI/Plater.cpp:7162 msgid "Send to printer" msgstr "Küldés nyomtatóra" -#: src/slic3r/GUI/Plater.cpp:914 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6067 +#: src/slic3r/GUI/Plater.cpp:949 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6657 msgid "Slice now" msgstr "Szeletelés most" -#: src/slic3r/GUI/Plater.cpp:1087 +#: src/slic3r/GUI/Plater.cpp:1127 msgid "Hold Shift to Slice & Export G-code" msgstr "Tartsa lenyomva a Shiftet szeleteléshez és a G-kód exportálásához" -#: src/slic3r/GUI/Plater.cpp:1287 +#: src/slic3r/GUI/Plater.cpp:1324 #, boost-format msgid "%1% (%2$d shell)" msgid_plural "%1% (%2$d shells)" msgstr[0] "%1% (%2$d héj)" msgstr[1] "%1% (%2$d héjak)" -#: src/slic3r/GUI/Plater.cpp:1315 +#: src/slic3r/GUI/Plater.cpp:1352 msgid "Used Material (ml)" msgstr "Felhasznált Anyag (ml)" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "object" msgid_plural "objects" msgstr[0] "objektum" msgstr[1] "objektumok" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "supports and pad" msgstr "támasztók és párna" -#: src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (in)" msgstr "Felhasznált Filament (in)" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "objects" msgstr "objektumok" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "wipe tower" msgstr "törlőtorony" -#: src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (in³)" msgstr "Felhasznált Filament (in³)" -#: src/slic3r/GUI/Plater.cpp:1396 +#: src/slic3r/GUI/Plater.cpp:1433 #, boost-format msgid "Filament at extruder %1%" msgstr "Filament %1% extrudernél _" -#: src/slic3r/GUI/Plater.cpp:1402 +#: src/slic3r/GUI/Plater.cpp:1439 msgid "(including spool)" msgstr "(beleértve a spulnit)" -#: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1072 -#: src/libslic3r/PrintConfig.cpp:3439 src/libslic3r/PrintConfig.cpp:3440 +#: src/slic3r/GUI/Plater.cpp:1448 src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:3716 src/libslic3r/PrintConfig.cpp:3717 msgid "Cost" msgstr "Költség" -#: src/slic3r/GUI/Plater.cpp:1429 +#: src/slic3r/GUI/Plater.cpp:1466 msgid "normal mode" msgstr "normál mód" -#: src/slic3r/GUI/Plater.cpp:1436 +#: src/slic3r/GUI/Plater.cpp:1473 msgid "stealth mode" msgstr "lopakodó mód" -#: src/slic3r/GUI/Plater.cpp:1670 -msgid "Fill bed" -msgstr "Tárgyasztal kitöltése" - -#: src/slic3r/GUI/Plater.cpp:1676 -msgid "Optimize Rotation" -msgstr "Tájolás Optimalizálása" - -#: src/slic3r/GUI/Plater.cpp:1682 -msgid "Import SLA archive" -msgstr "SLA archívum importálása" - -#: src/slic3r/GUI/Plater.cpp:1725 +#: src/slic3r/GUI/Plater.cpp:1734 #, boost-format msgid "Do you want to save the changes to \"%1%\"?" msgstr "Menti a változásokat a következőhöz: \"%1%\"?" -#: src/slic3r/GUI/Plater.cpp:1730 src/slic3r/GUI/Preferences.cpp:222 +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:905 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1599 +msgid "Save" +msgstr "Mentés" + +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +msgid "Discard" +msgstr "Elvetés" + +#: src/slic3r/GUI/Plater.cpp:1740 src/slic3r/GUI/Preferences.cpp:354 msgid "Ask for unsaved changes in project" msgstr "Kérdezzen rá a projektben nem mentett változtatásokra" -#: src/slic3r/GUI/Plater.cpp:1733 +#: src/slic3r/GUI/Plater.cpp:1743 msgid "" "You will not be asked about it again, when: \n" "- Closing PrusaSlicer,\n" @@ -7043,7 +8398,7 @@ msgstr "" "- A PrusaSlicert bezárja,\n" "- Új projektet tölt be, vagy hoz létre" -#: src/slic3r/GUI/Plater.cpp:2198 +#: src/slic3r/GUI/Plater.cpp:2214 #, c-format, boost-format msgid "" "Successfully unmounted. The device %s(%s) can now be safely removed from the " @@ -7052,20 +8407,20 @@ msgstr "" "Sikeresen leválasztva. A %s(%s) eszköz most biztonságosan eltávolítható a " "számítógépről." -#: src/slic3r/GUI/Plater.cpp:2203 +#: src/slic3r/GUI/Plater.cpp:2220 #, c-format, boost-format msgid "Ejecting of device %s(%s) has failed." msgstr "A %s(%s) eszköz eltávolítása nem sikerült." -#: src/slic3r/GUI/Plater.cpp:2222 src/slic3r/GUI/Plater.cpp:5108 +#: src/slic3r/GUI/Plater.cpp:2239 src/slic3r/GUI/Plater.cpp:5199 msgid "New Project" msgstr "Új Projekt" -#: src/slic3r/GUI/Plater.cpp:2319 +#: src/slic3r/GUI/Plater.cpp:2346 msgid "Expand sidebar" msgstr "Az oldalsáv kibontása" -#: src/slic3r/GUI/Plater.cpp:2518 +#: src/slic3r/GUI/Plater.cpp:2428 msgid "" "The preset below was temporarily installed on the active instance of " "PrusaSlicer" @@ -7079,12 +8434,12 @@ msgstr[1] "" "Az alábbi_ előbeállítások ideiglenesen telepítve lettek a PrusaSlicer aktív " "példányára" -#: src/slic3r/GUI/Plater.cpp:2548 +#: src/slic3r/GUI/Plater.cpp:2583 #, boost-format msgid "Failed loading file \"%1%\" due to an invalid configuration." msgstr "A \"%1%\" fájl betöltése nem sikerült érvénytelen konfiguráció miatt." -#: src/slic3r/GUI/Plater.cpp:2568 +#: src/slic3r/GUI/Plater.cpp:2603 #, c-format, boost-format msgid "" "Object size from file %s appears to be zero.\n" @@ -7099,11 +8454,11 @@ msgstr[1] "" "A fájlban lévő %s objektumuk mérete nullának tűnik.\n" "Ezek az objektumok eltávolításra kerültek a modellből" -#: src/slic3r/GUI/Plater.cpp:2572 +#: src/slic3r/GUI/Plater.cpp:2607 msgid "The size of the object is zero" msgstr "Az objektum mérete zéró" -#: src/slic3r/GUI/Plater.cpp:2585 +#: src/slic3r/GUI/Plater.cpp:2620 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in meters.\n" @@ -7124,15 +8479,15 @@ msgstr[1] "" "A PrusaSlicer belső mértékegysége a milliméter. Szeretné újraszámolni az " "objektumok méreteit?" -#: src/slic3r/GUI/Plater.cpp:2589 src/slic3r/GUI/Plater.cpp:2611 +#: src/slic3r/GUI/Plater.cpp:2624 src/slic3r/GUI/Plater.cpp:2646 msgid "The object is too small" msgstr "Az objektum túl kicsi" -#: src/slic3r/GUI/Plater.cpp:2590 src/slic3r/GUI/Plater.cpp:2612 +#: src/slic3r/GUI/Plater.cpp:2625 src/slic3r/GUI/Plater.cpp:2647 msgid "Apply to all the remaining small objects being loaded." msgstr "Alkalmazza az összes hátralévő betöltendő kis objektumra." -#: src/slic3r/GUI/Plater.cpp:2607 +#: src/slic3r/GUI/Plater.cpp:2642 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in inches.\n" @@ -7153,7 +8508,7 @@ msgstr[1] "" "A PrusaSlicer belső mértékegysége a milliméter. Szeretné újraszámolni az " "objektumok méreteit?" -#: src/slic3r/GUI/Plater.cpp:2625 +#: src/slic3r/GUI/Plater.cpp:2659 msgid "" "This file contains several objects positioned at multiple heights.\n" "Instead of considering them as multiple objects, should \n" @@ -7163,31 +8518,22 @@ msgstr "" "Több különálló objektum helyett, egyetlen, több részből álló objektumként " "kell betölteni őket?" -#: src/slic3r/GUI/Plater.cpp:2628 src/slic3r/GUI/Plater.cpp:2683 +#: src/slic3r/GUI/Plater.cpp:2662 src/slic3r/GUI/Plater.cpp:2711 msgid "Multi-part object detected" msgstr "Több részből álló objektum észlelve" -#: src/slic3r/GUI/Plater.cpp:2636 +#: src/slic3r/GUI/Plater.cpp:2669 msgid "" "This file cannot be loaded in a simple mode. Do you want to switch to an " "advanced mode?" msgstr "" "Ez a fájl nem tölthető be egyszerű módban. Szeretne haladó módra váltani?" -#: src/slic3r/GUI/Plater.cpp:2637 +#: src/slic3r/GUI/Plater.cpp:2670 msgid "Detected advanced data" msgstr "Fejlett adatok érzékelve" -#: src/slic3r/GUI/Plater.cpp:2657 -#, c-format, boost-format -msgid "" -"You can't to add the object(s) from %s because of one or some of them " -"is(are) multi-part" -msgstr "" -"Nem lehet hozzáadni az objektum(ok)at %s-ből, mert az egyik vagy néhány " -"közülük több részből áll(nak)" - -#: src/slic3r/GUI/Plater.cpp:2680 +#: src/slic3r/GUI/Plater.cpp:2708 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" @@ -7197,7 +8543,7 @@ msgstr "" "Több különálló objektum helyett, egyetlen, több részből álló objektumként " "kell betölteni őket?" -#: src/slic3r/GUI/Plater.cpp:2799 +#: src/slic3r/GUI/Plater.cpp:2827 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." @@ -7205,39 +8551,54 @@ msgstr "" "Az objektum túl nagynak tűnik, ezért automatikusan le lett méretezve, hogy " "illeszkedjen a tárgyasztalhoz." -#: src/slic3r/GUI/Plater.cpp:2800 +#: src/slic3r/GUI/Plater.cpp:2828 msgid "Object too large?" msgstr "Az objektum túl nagy?" -#: src/slic3r/GUI/Plater.cpp:2878 +#: src/slic3r/GUI/Plater.cpp:2908 msgid "Export STL file:" msgstr "STL fájl exportálása:" -#: src/slic3r/GUI/Plater.cpp:2885 +#: src/slic3r/GUI/Plater.cpp:2915 msgid "Export AMF file:" msgstr "AMF fájl exportálása:" -#: src/slic3r/GUI/Plater.cpp:2891 +#: src/slic3r/GUI/Plater.cpp:2921 msgid "Save file as:" msgstr "Fájl mentése mint:" -#: src/slic3r/GUI/Plater.cpp:2897 +#: src/slic3r/GUI/Plater.cpp:2927 msgid "Export OBJ file:" msgstr "OBJ fájl exportálása:" -#: src/slic3r/GUI/Plater.cpp:2995 +#: src/slic3r/GUI/Plater.cpp:3030 +msgid "Delete object which is a part of cut object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3031 +msgid "" +"You try to delete an object which is a part of a cut object.\n" +"This action will break a cut correspondence.\n" +"After that PrusaSlicer can't guarantee model consistency" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3035 +msgid "Delete object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3040 msgid "Delete Object" msgstr "Objektum Törlése" -#: src/slic3r/GUI/Plater.cpp:3007 +#: src/slic3r/GUI/Plater.cpp:3057 msgid "Delete All Objects" msgstr "Az Összes Objektum Törlése" -#: src/slic3r/GUI/Plater.cpp:3035 +#: src/slic3r/GUI/Plater.cpp:3086 msgid "Reset Project" msgstr "Projekt Újraindítása" -#: src/slic3r/GUI/Plater.cpp:3118 +#: src/slic3r/GUI/Plater.cpp:3141 msgid "" "The selected object couldn't be split because it contains only one solid " "part." @@ -7245,15 +8606,15 @@ msgstr "" "A kijelölt objektumot nem lehetett szétválasztani, mert csak egy szilárd " "alkatrészt tartalmaz." -#: src/slic3r/GUI/Plater.cpp:3125 +#: src/slic3r/GUI/Plater.cpp:3148 msgid "All non-solid parts (modifiers) were deleted" msgstr "Minden nem szilárd alkatrész (módosító) törlésre került" -#: src/slic3r/GUI/Plater.cpp:3127 +#: src/slic3r/GUI/Plater.cpp:3150 msgid "Split to Objects" msgstr "Objektumokra Osztás" -#: src/slic3r/GUI/Plater.cpp:3179 +#: src/slic3r/GUI/Plater.cpp:3202 msgid "" "An object has custom support enforcers which will not be used because " "supports are disabled." @@ -7261,87 +8622,88 @@ msgstr "" "Egy objektumnak vannak olyan egyéni támaszték kényszerítői, amelyek nem " "lesznek használva, mivel a támasztékok le vannak tiltva." -#: src/slic3r/GUI/Plater.cpp:3181 +#: src/slic3r/GUI/Plater.cpp:3204 msgid "Enable supports for enforcers only" msgstr "Támasztékok engedélyezése csak a kényszerítőkre" -#: src/slic3r/GUI/Plater.cpp:3310 src/slic3r/GUI/Plater.cpp:4176 +#: src/slic3r/GUI/Plater.cpp:3339 src/slic3r/GUI/Plater.cpp:4238 msgid "Invalid data" msgstr "Érvénytelen adat" -#: src/slic3r/GUI/Plater.cpp:3380 +#: src/slic3r/GUI/Plater.cpp:3410 msgid "Another export job is currently running." msgstr "Jelenleg egy másik exportálási feladat is fut." -#: src/slic3r/GUI/Plater.cpp:3466 +#: src/slic3r/GUI/Plater.cpp:3496 msgid "Replace from:" msgstr "Helyettesítés innen:" -#: src/slic3r/GUI/Plater.cpp:3484 +#: src/slic3r/GUI/Plater.cpp:3514 msgid "Unable to replace with more than one volume" msgstr "Nem lehet egynél több térfogattal helyettesíteni" -#: src/slic3r/GUI/Plater.cpp:3484 src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3514 src/slic3r/GUI/Plater.cpp:3597 msgid "Error during replace" msgstr "Hiba helyettesítés közben" -#: src/slic3r/GUI/Plater.cpp:3555 +#: src/slic3r/GUI/Plater.cpp:3589 msgid "Select the new file" msgstr "Válassza ki az új fájlt" -#: src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3597 msgid "File for the replace wasn't selected" msgstr "A helyettesítéshez nem volt fájl kiválasztva" -#: src/slic3r/GUI/Plater.cpp:3654 +#: src/slic3r/GUI/Plater.cpp:3684 msgid "Please select the file to reload" msgstr "Válassza ki az újratöltendő fájlt" -#: src/slic3r/GUI/Plater.cpp:3685 src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:3715 src/slic3r/GUI/Plater.cpp:5355 +#: src/slic3r/GUI/Plater.cpp:5365 msgid "The selected file" msgstr "A kiválasztott fájl" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "differs from the original file" msgstr "különbözik az eredeti fájltól" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "Do you want to replace it" msgstr "Szeretné helyettesíteni" -#: src/slic3r/GUI/Plater.cpp:3703 src/slic3r/GUI/Plater.cpp:3709 +#: src/slic3r/GUI/Plater.cpp:3736 src/slic3r/GUI/Plater.cpp:3742 msgid "Reload from:" msgstr "Újratöltés innen:" -#: src/slic3r/GUI/Plater.cpp:3812 +#: src/slic3r/GUI/Plater.cpp:3864 msgid "Unable to reload:" msgstr "Újratöltés sikertelen:" -#: src/slic3r/GUI/Plater.cpp:3817 +#: src/slic3r/GUI/Plater.cpp:3869 msgid "Error during reload" msgstr "Hiba újratöltés közben" -#: src/slic3r/GUI/Plater.cpp:3835 +#: src/slic3r/GUI/Plater.cpp:3887 msgid "Reload all from disk" msgstr "Minden újratöltése lemezről" -#: src/slic3r/GUI/Plater.cpp:4130 +#: src/slic3r/GUI/Plater.cpp:4191 msgid "There are active warnings concerning sliced models:" msgstr "Aktív figyelmeztetések vonatkoznak a szeletelt modellekre:" -#: src/slic3r/GUI/Plater.cpp:4141 +#: src/slic3r/GUI/Plater.cpp:4202 msgid "generated warnings" msgstr "generált figyelmeztetések" -#: src/slic3r/GUI/Plater.cpp:4472 +#: src/slic3r/GUI/Plater.cpp:4554 msgid "3D editor view" msgstr "3D szerkesztő nézet" -#: src/slic3r/GUI/Plater.cpp:4893 +#: src/slic3r/GUI/Plater.cpp:4980 msgid "Undo / Redo is processing" msgstr "Visszavonás / Mégis folyamatban" -#: src/slic3r/GUI/Plater.cpp:4895 +#: src/slic3r/GUI/Plater.cpp:4982 #, boost-format msgid "" "Switching the printer technology from %1% to %2%.\n" @@ -7352,21 +8714,21 @@ msgstr "" "Néhány %1% előbeállítás módosult, amelyek a nyomtatási technológia átváltása " "után elvesznek." -#: src/slic3r/GUI/Plater.cpp:5092 +#: src/slic3r/GUI/Plater.cpp:5184 msgid "Creating a new project while the current project is modified." msgstr "Új projekt létrehozása a jelenlegi projekt módosítása közben." -#: src/slic3r/GUI/Plater.cpp:5095 +#: src/slic3r/GUI/Plater.cpp:5187 msgid "Creating a new project while some presets are modified." msgstr "Új projekt létrehozása néhány előbeállítás módosítása közben." -#: src/slic3r/GUI/Plater.cpp:5096 +#: src/slic3r/GUI/Plater.cpp:5188 msgid "You can keep presets modifications to the new project or discard them" msgstr "" "Az előbeállítások módosításait megtarthatja az új projekthez, vagy elvetheti " "őket" -#: src/slic3r/GUI/Plater.cpp:5097 +#: src/slic3r/GUI/Plater.cpp:5189 msgid "" "You can keep presets modifications to the new project, discard them or save " "changes as new presets.\n" @@ -7377,125 +8739,172 @@ msgstr "" "Megjegyzés: ha a módosítások elmentésre kerülnek, akkor az új projekt nem " "tartja meg őket" -#: src/slic3r/GUI/Plater.cpp:5103 +#: src/slic3r/GUI/Plater.cpp:5194 msgid "Creating a new project" msgstr "Új projekt létrehozása" -#: src/slic3r/GUI/Plater.cpp:5137 +#: src/slic3r/GUI/Plater.cpp:5228 msgid "Load Project" msgstr "Projekt Betöltése" -#: src/slic3r/GUI/Plater.cpp:5167 src/slic3r/GUI/Plater.cpp:5432 +#: src/slic3r/GUI/Plater.cpp:5258 msgid "Import Object" msgstr "Objektum Importálása" -#: src/slic3r/GUI/Plater.cpp:5171 +#: src/slic3r/GUI/Plater.cpp:5262 msgid "Import Objects" msgstr "Objektumok Importálása" -#: src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:5291 +msgid "Import SLA archive" +msgstr "SLA archívum importálása" + +#: src/slic3r/GUI/Plater.cpp:5355 src/slic3r/GUI/Plater.cpp:5365 msgid "does not contain valid gcode." msgstr "nem tartalmaz érvényes g-kódot." -#: src/slic3r/GUI/Plater.cpp:5244 +#: src/slic3r/GUI/Plater.cpp:5356 src/slic3r/GUI/Plater.cpp:5366 msgid "Error while loading .gcode file" msgstr "Hiba a .gcode fájl betöltése közben" -#: src/slic3r/GUI/Plater.cpp:5297 +#: src/slic3r/GUI/Plater.cpp:5433 +#, c-format, boost-format +msgid "%s - Multiple projects file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 +msgid "There are several files being loaded, including Project files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 src/slic3r/GUI/Plater.cpp:5446 +msgid "Select an action to apply to all files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5446 +msgid "There are several files being loaded." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5448 src/slic3r/GUI/Plater.cpp:5842 +msgid "Action" +msgstr "Művelet" + +#: src/slic3r/GUI/Plater.cpp:5469 +msgid "Import geometry" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5482 src/slic3r/GUI/Plater.cpp:5834 +msgid "Start new PrusaSlicer instance" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5496 +msgid "Select one to load as project" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5507 +msgid "Select one to load config only" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5609 +#, boost-format +msgid "Failed to unzip file to %1%: %2% " +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5618 +#, boost-format +msgid "Failed to find unzipped file at %1%. Unzipping of file has failed." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5821 #, c-format, boost-format -msgid "%s - Drop project file" -msgstr "%s - Projekt fájl ejtése" +msgid "%s - Load project file" +msgstr "" -#: src/slic3r/GUI/Plater.cpp:5304 +#: src/slic3r/GUI/Plater.cpp:5830 msgid "Open as project" msgstr "Megnyitás Projektként" -#: src/slic3r/GUI/Plater.cpp:5305 +#: src/slic3r/GUI/Plater.cpp:5831 msgid "Import geometry only" msgstr "Csak geometria importálása" -#: src/slic3r/GUI/Plater.cpp:5306 +#: src/slic3r/GUI/Plater.cpp:5832 msgid "Import config only" msgstr "Csak a konfiguráció importálása" -#: src/slic3r/GUI/Plater.cpp:5309 +#: src/slic3r/GUI/Plater.cpp:5837 msgid "Select an action to apply to the file" msgstr "Válassza ki a fájlra alkalmazandó műveletet" -#: src/slic3r/GUI/Plater.cpp:5314 -msgid "Action" -msgstr "Művelet" - -#: src/slic3r/GUI/Plater.cpp:5330 +#: src/slic3r/GUI/Plater.cpp:5858 msgid "Don't show again" msgstr "Ne mutassa újra" -#: src/slic3r/GUI/Plater.cpp:5371 +#: src/slic3r/GUI/Plater.cpp:5899 msgid "You can open only one .gcode file at a time." msgstr "Egyszerre csak egy .gcode fájlt nyithat meg." -#: src/slic3r/GUI/Plater.cpp:5372 +#: src/slic3r/GUI/Plater.cpp:5900 msgid "Drag and drop G-code file" msgstr "Húzza és ejtse a G-kód fájlt" -#: src/slic3r/GUI/Plater.cpp:5454 +#: src/slic3r/GUI/Plater.cpp:5992 msgid "Load File" msgstr "Fájl Betöltése" -#: src/slic3r/GUI/Plater.cpp:5459 +#: src/slic3r/GUI/Plater.cpp:5997 msgid "Load Files" msgstr "Fájlok Betöltése" -#: src/slic3r/GUI/Plater.cpp:5509 +#: src/slic3r/GUI/Plater.cpp:6047 msgid "All objects will be removed, continue?" msgstr "Minden objektum el lesz távolítva, folytatja?" -#: src/slic3r/GUI/Plater.cpp:5520 +#: src/slic3r/GUI/Plater.cpp:6058 msgid "Delete Selected Objects" msgstr "Kijelölt Objektumok Törlése" -#: src/slic3r/GUI/Plater.cpp:5529 +#: src/slic3r/GUI/Plater.cpp:6067 msgid "Increase Instances" msgstr "Példányszám Növelése" -#: src/slic3r/GUI/Plater.cpp:5563 +#: src/slic3r/GUI/Plater.cpp:6109 msgid "Decrease Instances" msgstr "Példányszám Csökkentése" -#: src/slic3r/GUI/Plater.cpp:5614 +#: src/slic3r/GUI/Plater.cpp:6167 msgid "Enter the number of copies:" msgstr "Adja meg a szükséges példányok számát:" -#: src/slic3r/GUI/Plater.cpp:5615 +#: src/slic3r/GUI/Plater.cpp:6168 msgid "Copies of the selected object" msgstr "A kijelölt objektum másolatai" -#: src/slic3r/GUI/Plater.cpp:5619 +#: src/slic3r/GUI/Plater.cpp:6171 #, c-format, boost-format msgid "Set numbers of copies to %d" msgstr "A másolatok számának beállítása erre: %d" -#: src/slic3r/GUI/Plater.cpp:5697 -msgid "Cut by Plane" -msgstr "Vágás Síkkal" +#: src/slic3r/GUI/Plater.cpp:6187 +msgid "Fill bed" +msgstr "Tárgyasztal kitöltése" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save G-code file as:" msgstr "G-kód fájl mentése másként:" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save SL1 / SL1S file as:" msgstr "SL1 / SL1S fájl mentése másként:" -#: src/slic3r/GUI/Plater.cpp:5766 +#: src/slic3r/GUI/Plater.cpp:6336 msgid "The provided file name is not valid." msgstr "A megadott fájlnév érvénytelen." -#: src/slic3r/GUI/Plater.cpp:5767 +#: src/slic3r/GUI/Plater.cpp:6337 msgid "The following characters are not allowed by a FAT file system:" msgstr "A következő karaktereket a FAT fájlrendszer nem támogatja:" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "" "The plater is empty.\n" "Do you want to save the project?" @@ -7503,38 +8912,38 @@ msgstr "" "A tárgyasztal üres.\n" "Szeretné elmenteni a projektet?" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "Save project" msgstr "Projekt mentése" -#: src/slic3r/GUI/Plater.cpp:6543 +#: src/slic3r/GUI/Plater.cpp:6766 +msgid "Is the printer ready? Is the print sheet in place, empty and clean?" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:6766 src/slic3r/GUI/PrintHostDialogs.cpp:132 +msgid "Upload and Print" +msgstr "Feltöltés és Nyomtatás" + +#: src/slic3r/GUI/Plater.cpp:7161 msgid "Export" msgstr "Exportálás" -#: src/slic3r/GUI/Plater.cpp:6575 -msgid "" -"Custom supports, seams and multimaterial painting were removed after " -"repairing the mesh." -msgstr "" -"Az egyedi támasztékok, varratok és a többanyagú festés eltávolításra került " -"háló javítása után." - -#: src/slic3r/GUI/Plater.cpp:6689 +#: src/slic3r/GUI/Plater.cpp:7306 msgid "Paste From Clipboard" msgstr "Beillesztés Vágólapról" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2290 -#: src/slic3r/GUI/Tab.cpp:2517 src/slic3r/GUI/Tab.cpp:2624 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Preferences.cpp:240 src/slic3r/GUI/Tab.cpp:2274 +#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2617 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "General" msgstr "Általános" -#: src/slic3r/GUI/Preferences.cpp:121 +#: src/slic3r/GUI/Preferences.cpp:258 msgid "Remember output directory" msgstr "Emlékezzen a kimeneti könyvtárra" -#: src/slic3r/GUI/Preferences.cpp:123 +#: src/slic3r/GUI/Preferences.cpp:259 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." @@ -7542,11 +8951,11 @@ msgstr "" "Ha ez engedélyezve van, a Slic3r megjegyzi az utolsó kimeneti mappát, és azt " "használja a bemeneti fájlokat tartalmazó mappa helyett." -#: src/slic3r/GUI/Preferences.cpp:129 +#: src/slic3r/GUI/Preferences.cpp:263 msgid "Auto-center parts" msgstr "Alkatrészek automatikus középre igazítása" -#: src/slic3r/GUI/Preferences.cpp:131 +#: src/slic3r/GUI/Preferences.cpp:264 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." @@ -7554,11 +8963,11 @@ msgstr "" "Ha ez engedélyezve van, a Slic3r automatikusan középre igazítja az " "objektumokat a tárgyasztal közepe körül." -#: src/slic3r/GUI/Preferences.cpp:137 +#: src/slic3r/GUI/Preferences.cpp:268 msgid "Background processing" msgstr "Feldolgozás a háttérben" -#: src/slic3r/GUI/Preferences.cpp:139 +#: src/slic3r/GUI/Preferences.cpp:269 msgid "" "If this is enabled, Slic3r will pre-process objects as soon as they're " "loaded in order to save time when exporting G-code." @@ -7566,11 +8975,23 @@ msgstr "" "Ha ez engedélyezve van, a Slic3r a betöltés után azonnal előfeldolgozza az " "objektumokat, hogy időt takarítson meg a G-kód exportálásakor." -#: src/slic3r/GUI/Preferences.cpp:148 +#: src/slic3r/GUI/Preferences.cpp:274 +msgid "Alert when supports needed" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:275 +msgid "" +"If this is enabled, Slic3r will raise alerts when it detects issues in the " +"sliced object, that can be resolved with supports (and brim). Examples of " +"such issues are floating object parts, unsupported extrusions and low bed " +"adhesion." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:285 msgid "Export sources full pathnames to 3mf and amf" msgstr "Exportálja a források teljes elérési útját a 3mf és amf fájlokba" -#: src/slic3r/GUI/Preferences.cpp:150 +#: src/slic3r/GUI/Preferences.cpp:286 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked." @@ -7578,19 +8999,19 @@ msgstr "" "Ha engedélyezve van, lehetővé teszi, hogy az Újratöltés lemezről parancs " "automatikusan megkeresse és betöltse a fájlokat meghivatkozáskor." -#: src/slic3r/GUI/Preferences.cpp:159 +#: src/slic3r/GUI/Preferences.cpp:293 msgid "If enabled, sets PrusaSlicer as default application to open .3mf files." msgstr "" "Ha engedélyezve van, a PrusaSlicert alapértelmezett alkalmazásként állítja " "be a .3mf fájlok megnyitásához." -#: src/slic3r/GUI/Preferences.cpp:166 +#: src/slic3r/GUI/Preferences.cpp:298 msgid "If enabled, sets PrusaSlicer as default application to open .stl files." msgstr "" "Ha engedélyezve van, a PrusaSlicert alapértelmezett alkalmazásként állítja " "be a .stl fájlok megnyitásához." -#: src/slic3r/GUI/Preferences.cpp:177 +#: src/slic3r/GUI/Preferences.cpp:307 msgid "" "If enabled, Slic3r downloads updates of built-in system presets in the " "background. These updates are downloaded into a separate temporary location. " @@ -7602,11 +9023,11 @@ msgstr "" "kerülnek letöltésre. Amikor egy új előbeállítások verzió elérhetővé válik, " "azt az alkalmazás a következő indításkor felajánlja." -#: src/slic3r/GUI/Preferences.cpp:182 +#: src/slic3r/GUI/Preferences.cpp:312 msgid "Suppress \" - default - \" presets" msgstr "Az \" - alapértelmezett - \" előbeállítások elrejtése" -#: src/slic3r/GUI/Preferences.cpp:184 +#: src/slic3r/GUI/Preferences.cpp:313 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." @@ -7615,11 +9036,21 @@ msgstr "" "beállított értékeket a Nyomtatás / Filament / Nyomtató kiválasztásában, ha " "más érvényes előbeállítások állnak rendelkezésre." -#: src/slic3r/GUI/Preferences.cpp:190 +#: src/slic3r/GUI/Preferences.cpp:317 +msgid "Suppress \" Template \" filament presets" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:318 +msgid "" +"Suppress \" Template \" filament presets in configuration wizard and sidebar " +"visibility." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:322 msgid "Show incompatible print and filament presets" msgstr "Nem kompatibilis nyomtatási és filament előbeállítások megjelenítése" -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:323 msgid "" "When checked, the print and filament presets are shown in the preset editor " "even if they are marked as incompatible with the active printer" @@ -7628,11 +9059,22 @@ msgstr "" "megjelennek az előbeállítás szerkesztőben, ha az aktív nyomtatóval nem " "kompatibilisként vannak megjelölve" -#: src/slic3r/GUI/Preferences.cpp:200 +#: src/slic3r/GUI/Preferences.cpp:331 +msgid "Show load project dialog" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:332 +msgid "" +"When checked, whenever dragging and dropping a project file on the " +"application or open it from a browser, shows a dialog asking to select the " +"action to take on the file to load." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:335 msgid "Show drop project dialog" msgstr "Húz és ejt párbeszédpanel megjelenítése" -#: src/slic3r/GUI/Preferences.cpp:202 +#: src/slic3r/GUI/Preferences.cpp:336 msgid "" "When checked, whenever dragging and dropping a project file on the " "application, shows a dialog asking to select the action to take on the file " @@ -7642,11 +9084,11 @@ msgstr "" "megjelenik egy párbeszédpanel, amelyben ki kell választani a betöltendő " "fájlra vonatkozó műveletet." -#: src/slic3r/GUI/Preferences.cpp:208 src/slic3r/GUI/Preferences.cpp:212 +#: src/slic3r/GUI/Preferences.cpp:342 src/slic3r/GUI/Preferences.cpp:346 msgid "Allow just a single PrusaSlicer instance" msgstr "Csak egyetlen PrusaSlicer példány engedélyezése" -#: src/slic3r/GUI/Preferences.cpp:210 +#: src/slic3r/GUI/Preferences.cpp:343 msgid "" "On OSX there is always only one instance of app running by default. However " "it is allowed to run multiple instances of same app from the command line. " @@ -7656,7 +9098,7 @@ msgstr "" "alkalmazásból. Mindazonáltal az alkalmazás több példánya is futtatható a " "parancssorból. Ebben az esetben ez a beállítás csak egy példányt engedélyez." -#: src/slic3r/GUI/Preferences.cpp:214 +#: src/slic3r/GUI/Preferences.cpp:347 msgid "" "If this is enabled, when starting PrusaSlicer and another instance of the " "same PrusaSlicer is already running, that instance will be reactivated " @@ -7666,7 +9108,7 @@ msgstr "" "PrusaSlicernek egy másik példánya már fut, akkor az a példány lesz újra " "aktiválva." -#: src/slic3r/GUI/Preferences.cpp:224 +#: src/slic3r/GUI/Preferences.cpp:355 msgid "" "Always ask for unsaved changes in project, when: \n" "- Closing PrusaSlicer,\n" @@ -7676,8 +9118,8 @@ msgstr "" "- A PrusaSlicer bezárásakor,\n" "- Új projekt betöltésekor, vagy létrehozásakor" -#: src/slic3r/GUI/Preferences.cpp:233 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:897 +#: src/slic3r/GUI/Preferences.cpp:363 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:925 msgid "" "Ask to save unsaved changes in presets when closing the application or when " "loading a new project" @@ -7685,7 +9127,7 @@ msgstr "" "Kérdezzen rá az előbeállítások nem mentett módosításainak mentésére az " "alkalmazás bezárásakor vagy új projekt betöltésekor" -#: src/slic3r/GUI/Preferences.cpp:235 +#: src/slic3r/GUI/Preferences.cpp:364 msgid "" "Always ask for unsaved changes in presets, when: \n" "- Closing PrusaSlicer while some presets are modified,\n" @@ -7695,14 +9137,14 @@ msgstr "" "- A PrusaSlicer bezárásakor, miközben egyes előbeállítások módosultak,\n" "- Új projekt betöltésekor, miközben egyes előbeállítások módosultak" -#: src/slic3r/GUI/Preferences.cpp:242 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:896 +#: src/slic3r/GUI/Preferences.cpp:370 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:924 msgid "Ask for unsaved changes in presets when selecting new preset" msgstr "" "Kérdezzen rá az előbeállítások nem mentett módosításaira új előbeállítás " "kiválasztásakor" -#: src/slic3r/GUI/Preferences.cpp:244 +#: src/slic3r/GUI/Preferences.cpp:371 msgid "" "Always ask for unsaved changes in presets when selecting new preset or " "resetting a preset" @@ -7710,24 +9152,24 @@ msgstr "" "Mindig kérdezzen rá az előbeállítások nem mentett módosításaira, amikor új " "előbeállítást választ vagy visszaállít egy előbeállítást" -#: src/slic3r/GUI/Preferences.cpp:249 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 +#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:923 msgid "Ask for unsaved changes in presets when creating new project" msgstr "" "Kérdezzen rá az előbeállítások nem mentett módosításaira, amikor új " "projektet hoz létre" -#: src/slic3r/GUI/Preferences.cpp:251 +#: src/slic3r/GUI/Preferences.cpp:376 msgid "Always ask for unsaved changes in presets when creating new project" msgstr "" "Mindig kérdezzen rá az előbeállítások nem mentett módosításaira, amikor új " "projektet hoz létre" -#: src/slic3r/GUI/Preferences.cpp:258 +#: src/slic3r/GUI/Preferences.cpp:382 msgid "Associate .gcode files to PrusaSlicer G-code Viewer" msgstr ".gcode fájlok társítása a PrusaSlicer G-code Viewer alkalmazáshoz" -#: src/slic3r/GUI/Preferences.cpp:260 +#: src/slic3r/GUI/Preferences.cpp:383 msgid "" "If enabled, sets PrusaSlicer G-code Viewer as default application to open ." "gcode files." @@ -7735,11 +9177,11 @@ msgstr "" "Ha engedélyezve van, beállítja a PrusaSlicer G-code Viewer-t alapértelmezett " "alkalmazásként a .gcode fájlok megnyitásához." -#: src/slic3r/GUI/Preferences.cpp:268 +#: src/slic3r/GUI/Preferences.cpp:390 msgid "Use Retina resolution for the 3D scene" msgstr "Retina felbontás használata 3D jelenethez" -#: src/slic3r/GUI/Preferences.cpp:270 +#: src/slic3r/GUI/Preferences.cpp:391 msgid "" "If enabled, the 3D scene will be rendered in Retina resolution. If you are " "experiencing 3D performance problems, disabling this option may help." @@ -7748,31 +9190,31 @@ msgstr "" "Ha 3D-s teljesítményproblémák merülnek fel, ennek az opciónak a letiltása " "segíthet." -#: src/slic3r/GUI/Preferences.cpp:280 src/slic3r/GUI/Preferences.cpp:282 +#: src/slic3r/GUI/Preferences.cpp:400 src/slic3r/GUI/Preferences.cpp:401 msgid "Show splash screen" msgstr "Splash screen meglenítése" -#: src/slic3r/GUI/Preferences.cpp:289 +#: src/slic3r/GUI/Preferences.cpp:406 msgid "If enabled, PrusaSlicer will be open at the position it was closed" msgstr "" "Ha engedélyezve van, a PrusaSlicer azon a helyen fog megnyílni, ahol bezárták" -#: src/slic3r/GUI/Preferences.cpp:295 +#: src/slic3r/GUI/Preferences.cpp:411 msgid "Clear Undo / Redo stack on new project" msgstr "A Visszavonás/Mégis előzmények törlése új projektnél" -#: src/slic3r/GUI/Preferences.cpp:297 +#: src/slic3r/GUI/Preferences.cpp:412 msgid "" "Clear Undo / Redo stack on new project or when an existing project is loaded." msgstr "" "A Visszavonás/Mégis előzmények törlése új projektnél vagy egy meglévő " "projekt betöltésekor." -#: src/slic3r/GUI/Preferences.cpp:303 +#: src/slic3r/GUI/Preferences.cpp:417 msgid "Enable support for legacy 3DConnexion devices" msgstr "A korábbi 3DConnexion eszközök támogatásának engedélyezése" -#: src/slic3r/GUI/Preferences.cpp:305 +#: src/slic3r/GUI/Preferences.cpp:418 msgid "" "If enabled, the legacy 3DConnexion devices settings dialog is available by " "pressing CTRL+M" @@ -7780,63 +9222,59 @@ msgstr "" "Ha engedélyezve van, a régi 3DConnexion eszközök beállításai párbeszédablak " "elérhető a CTRL+M billentyűkombináció megnyomásával" -#: src/slic3r/GUI/Preferences.cpp:314 +#: src/slic3r/GUI/Preferences.cpp:425 msgid "Camera" msgstr "Kamera" -#: src/slic3r/GUI/Preferences.cpp:319 +#: src/slic3r/GUI/Preferences.cpp:435 msgid "Use perspective camera" msgstr "Perspektivikus kamera használata" -#: src/slic3r/GUI/Preferences.cpp:321 +#: src/slic3r/GUI/Preferences.cpp:436 msgid "" "If enabled, use perspective camera. If not enabled, use orthographic camera." msgstr "" "A program perspektivikus kamerát használ, ha engedélyezve van. Ha nincs " "engedélyezve, akkor ortografikusat." -#: src/slic3r/GUI/Preferences.cpp:326 +#: src/slic3r/GUI/Preferences.cpp:440 msgid "Use free camera" msgstr "Szabad kamera használata" -#: src/slic3r/GUI/Preferences.cpp:328 +#: src/slic3r/GUI/Preferences.cpp:441 msgid "If enabled, use free camera. If not enabled, use constrained camera." msgstr "" "Ha engedélyezve van, szabad kamerát használ. Ha nincs engedélyezve, akkor " "kötött kamerát használ." -#: src/slic3r/GUI/Preferences.cpp:333 +#: src/slic3r/GUI/Preferences.cpp:445 msgid "Reverse direction of zoom with mouse wheel" msgstr "Az egérgörgő zoom irányának megfordítása" -#: src/slic3r/GUI/Preferences.cpp:335 +#: src/slic3r/GUI/Preferences.cpp:446 msgid "If enabled, reverses the direction of zoom with mouse wheel" msgstr "Ha engedélyezve van, az egérgörgő zoom iránya megfordul" -#: src/slic3r/GUI/Preferences.cpp:343 +#: src/slic3r/GUI/Preferences.cpp:452 msgid "GUI" msgstr "GUI" -#: src/slic3r/GUI/Preferences.cpp:366 +#: src/slic3r/GUI/Preferences.cpp:492 msgid "Sequential slider applied only to top layer" msgstr "Szekvenciális csúszka csak a legfelső rétegre alkalmazva" -#: src/slic3r/GUI/Preferences.cpp:368 +#: src/slic3r/GUI/Preferences.cpp:493 msgid "" "If enabled, changes made using the sequential slider, in preview, apply only " -"to gcode top layer. If disabled, changes made using the sequential slider, " -"in preview, apply to the whole gcode." +"to gcode top layer.If disabled, changes made using the sequential slider, in " +"preview, apply to the whole gcode." msgstr "" -"Ha engedélyezve van, a szekvenciális csúszkával végzett módosítások az " -"előnézetben csak a g-kód legfelső rétegére vonatkoznak. Ha letiltja, a " -"szekvenciális csúszkával végzett módosítások az előnézetben a teljes g-kódra " -"vonatkoznak." -#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/Preferences.cpp:499 msgid "Show sidebar collapse/expand button" msgstr "Az oldalsáv összecsukás/kibontás gombjának megjelenítése" -#: src/slic3r/GUI/Preferences.cpp:377 +#: src/slic3r/GUI/Preferences.cpp:500 msgid "" "If enabled, the button for the collapse sidebar will be appeared in top " "right corner of the 3D Scene" @@ -7844,17 +9282,11 @@ msgstr "" "Ha engedélyezve van, az oldalsáv összecsukása gombja megjelenik a 3D jelenet " "jobb felső sarkában" -#: src/slic3r/GUI/Preferences.cpp:384 -msgid "If enabled, PrusaSlicer will not open hyperlinks in your browser." -msgstr "" -"Ha engedélyezve van, a PrusaSlicer nem nyitja meg a hiperhivatkozásokat a " -"böngészőjében." - -#: src/slic3r/GUI/Preferences.cpp:391 +#: src/slic3r/GUI/Preferences.cpp:511 msgid "Use colors for axes values in Manipulation panel" msgstr "Használjon színeket a tengelyértékekhez a Manipuláció panelen" -#: src/slic3r/GUI/Preferences.cpp:393 +#: src/slic3r/GUI/Preferences.cpp:512 msgid "" "If enabled, the axes names and axes values will be colorized according to " "the axes colors. If disabled, old UI will be used." @@ -7863,11 +9295,11 @@ msgstr "" "megfelelően lesznek színezve.\n" "Ha le van tiltva, akkor a régi felhasználói felület marad aktív." -#: src/slic3r/GUI/Preferences.cpp:399 +#: src/slic3r/GUI/Preferences.cpp:517 msgid "Order object volumes by types" msgstr "Objektum térfogatok rendezése típus szerint" -#: src/slic3r/GUI/Preferences.cpp:401 +#: src/slic3r/GUI/Preferences.cpp:518 msgid "" "If enabled, volumes will be always ordered inside the object. Correct order " "is Model Part, Negative Volume, Modifier, Support Blocker and Support " @@ -7880,11 +9312,29 @@ msgstr "" "Modellalkatrész, a Negatív térfogat és a Módosító átrendezhető. De az első " "helyen az egyik Modellalkatrésznek kell lennie." -#: src/slic3r/GUI/Preferences.cpp:408 +#: src/slic3r/GUI/Preferences.cpp:523 +msgid "Show non-manifold edges" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:524 +msgid "If enabled, shows non-manifold edges." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:528 +msgid "Allow automatically color change" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:529 +msgid "" +"If enabled, related notification will be shown, when sliced object looks " +"like a logo or a sign." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:534 msgid "Set settings tabs as menu items (experimental)" msgstr "Beállítások fülsáv megjelenítése menüelemként (kísérleti)" -#: src/slic3r/GUI/Preferences.cpp:410 +#: src/slic3r/GUI/Preferences.cpp:535 msgid "" "If enabled, Settings Tabs will be placed as menu items. If disabled, old UI " "will be used." @@ -7892,19 +9342,19 @@ msgstr "" "Ha engedélyezve van, a Beállítások fülek menüelemként jelennek meg. Ha le " "van tiltva, a régi felhasználói felület kerül megjelenítésre." -#: src/slic3r/GUI/Preferences.cpp:419 +#: src/slic3r/GUI/Preferences.cpp:542 msgid "Show \"Tip of the day\" notification after start" msgstr "A „Nap tippje” értesítés megjelenítése a program indításakor" -#: src/slic3r/GUI/Preferences.cpp:421 +#: src/slic3r/GUI/Preferences.cpp:543 msgid "If enabled, useful hints are displayed at startup." msgstr "Ha engedélyezve van, hasznos tippek jelennek meg indításkor." -#: src/slic3r/GUI/Preferences.cpp:427 +#: src/slic3r/GUI/Preferences.cpp:547 msgid "Notify about new releases" msgstr "Értesítés az új kiadásokról" -#: src/slic3r/GUI/Preferences.cpp:429 +#: src/slic3r/GUI/Preferences.cpp:548 msgid "" "You will be notified about new release after startup acordingly: All = " "Regular release and alpha / beta releases. Release only = regular release." @@ -7912,68 +9362,80 @@ msgstr "" "Az indítás után értesítést kap az új kiadásról: Összes = Normál kiadás és " "alfa/béta kiadás. Csak kiadás = normál kiadás." -#: src/slic3r/GUI/Preferences.cpp:435 +#: src/slic3r/GUI/Preferences.cpp:551 msgid "Release only" msgstr "Csak normál kiadás" -#: src/slic3r/GUI/Preferences.cpp:444 +#: src/slic3r/GUI/Preferences.cpp:558 msgid "Use custom size for toolbar icons" msgstr "Egyéni méretet használata az eszköztár ikonjaihoz" -#: src/slic3r/GUI/Preferences.cpp:446 -msgid "If enabled, you can change size of toolbar icons manually." +#: src/slic3r/GUI/Preferences.cpp:559 +msgid "If enabled, you can change size of toolbar icons manually." +msgstr "" +"Ha engedélyezve van, manuálisan módosíthatja az eszköztár ikonjainak méretét." + +#: src/slic3r/GUI/Preferences.cpp:577 src/slic3r/GUI/Tab.cpp:1659 +msgid "Other" +msgstr "Egyéb" + +#: src/slic3r/GUI/Preferences.cpp:594 +msgid "If enabled, PrusaSlicer will not open a hyperlinks in your browser." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:600 +msgid "Allow downloads from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:601 +msgid "If enabled, PrusaSlicer will be allowed to download from Printables.com" msgstr "" -"Ha engedélyezve van, manuálisan módosíthatja az eszköztár ikonjainak méretét." -#: src/slic3r/GUI/Preferences.cpp:471 +#: src/slic3r/GUI/Preferences.cpp:610 msgid "Render" msgstr "Renderelés" -#: src/slic3r/GUI/Preferences.cpp:476 +#: src/slic3r/GUI/Preferences.cpp:620 msgid "Use environment map" msgstr "Környezeti térkép használata" -#: src/slic3r/GUI/Preferences.cpp:478 +#: src/slic3r/GUI/Preferences.cpp:621 msgid "If enabled, renders object using the environment map." msgstr "" "Ha engedélyezve van, az objektumot a környezeti térkép használatával " "rendereli." -#: src/slic3r/GUI/Preferences.cpp:491 +#: src/slic3r/GUI/Preferences.cpp:629 msgid "Dark mode (experimental)" msgstr "Sötét mód (kísérleti)" -#: src/slic3r/GUI/Preferences.cpp:496 +#: src/slic3r/GUI/Preferences.cpp:639 msgid "Enable dark mode" msgstr "Sötét mód engedélyezése" -#: src/slic3r/GUI/Preferences.cpp:498 +#: src/slic3r/GUI/Preferences.cpp:640 msgid "" "If enabled, UI will use Dark mode colors. If disabled, old UI will be used." msgstr "" "Ha engedélyezve van, a felhasználói felület a sötét mód színeit használja. " "Ha le van tiltva, a régi felhasználói felület marad aktív." -#: src/slic3r/GUI/Preferences.cpp:507 +#: src/slic3r/GUI/Preferences.cpp:647 msgid "Use system menu for application" msgstr "Rendszermenü használata az alkalmazáshoz" -#: src/slic3r/GUI/Preferences.cpp:509 +#: src/slic3r/GUI/Preferences.cpp:648 msgid "" "If enabled, application will use the standard Windows system menu,\n" -"but on some combination of display scales it can looks ugly. If disabled, " -"old UI will be used." +"but on some combination od display scales it can look ugly. If disabled, old " +"UI will be used." msgstr "" -"Ha engedélyezve van, az alkalmazás a Windows szabványos rendszermenüjét " -"fogja használni, \n" -"de a kijelző egyes méretarányainak kombinációján ez csúnyán nézhet ki. \n" -"Ha kikapcsolva, a régi felhasználói felületet használja." -#: src/slic3r/GUI/Preferences.cpp:578 +#: src/slic3r/GUI/Preferences.cpp:726 msgid "Changes for the critical options" msgstr "Változtatások a kritikus opciókhoz" -#: src/slic3r/GUI/Preferences.cpp:580 +#: src/slic3r/GUI/Preferences.cpp:728 msgid "" "Changing some options will trigger application restart.\n" "You will lose the content of the plater." @@ -7981,110 +9443,123 @@ msgstr "" "Egyes beállítások megváltoztatása az alkalmazás újraindítását eredményezi. \n" "A tárgyasztal tartalmát elveszíti." -#: src/slic3r/GUI/Preferences.cpp:694 +#: src/slic3r/GUI/Preferences.cpp:921 msgid "Icon size in a respect to the default size" msgstr "Az ikonok mérete az alapértelmezett mérethez képest" -#: src/slic3r/GUI/Preferences.cpp:709 +#: src/slic3r/GUI/Preferences.cpp:936 msgid "Select toolbar icon size in respect to the default one." msgstr "" "Válassza ki az eszköztár ikonjainak méretét az alapértelmezetthez képest." -#: src/slic3r/GUI/Preferences.cpp:743 src/slic3r/GUI/Preferences.cpp:754 +#: src/slic3r/GUI/Preferences.cpp:972 +msgid "Layout Options" +msgstr "Elrendezési lehetőségek" + +#: src/slic3r/GUI/Preferences.cpp:981 msgid "Old regular layout with the tab bar" msgstr "Normál elrendezés állandó fülsávval" -#: src/slic3r/GUI/Preferences.cpp:744 +#: src/slic3r/GUI/Preferences.cpp:982 msgid "New layout, access via settings button in the top menu" msgstr "" "Új elrendezés, a fülsáv elérése felső menüben található beállítások gombbal " "lehetséges" -#: src/slic3r/GUI/Preferences.cpp:745 src/slic3r/GUI/Preferences.cpp:755 +#: src/slic3r/GUI/Preferences.cpp:983 msgid "Settings in non-modal window" msgstr "Beálltások külön ablakban" -#: src/slic3r/GUI/Preferences.cpp:763 -msgid "Layout Options" -msgstr "Elrendezési lehetőségek" - -#: src/slic3r/GUI/Preferences.cpp:806 +#: src/slic3r/GUI/Preferences.cpp:1025 msgid "Text colors" msgstr "Szöveg színek" -#: src/slic3r/GUI/PresetComboBoxes.cpp:249 -#: src/slic3r/GUI/PresetComboBoxes.cpp:287 -#: src/slic3r/GUI/PresetComboBoxes.cpp:794 -#: src/slic3r/GUI/PresetComboBoxes.cpp:849 -#: src/slic3r/GUI/PresetComboBoxes.cpp:989 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1033 +#: src/slic3r/GUI/Preferences.cpp:1049 +msgid "Mode markers" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:254 +#: src/slic3r/GUI/PresetComboBoxes.cpp:306 +#: src/slic3r/GUI/PresetComboBoxes.cpp:846 +#: src/slic3r/GUI/PresetComboBoxes.cpp:909 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1073 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1125 msgid "System presets" msgstr "Rendszer előbeállítások" -#: src/slic3r/GUI/PresetComboBoxes.cpp:291 -#: src/slic3r/GUI/PresetComboBoxes.cpp:853 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1037 +#: src/slic3r/GUI/PresetComboBoxes.cpp:310 +#: src/slic3r/GUI/PresetComboBoxes.cpp:915 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1130 msgid "User presets" msgstr "Felhasználói előbeállítások" -#: src/slic3r/GUI/PresetComboBoxes.cpp:302 +#: src/slic3r/GUI/PresetComboBoxes.cpp:321 msgid "Incompatible presets" msgstr "Nem kompatibilis előbeállítások" -#: src/slic3r/GUI/PresetComboBoxes.cpp:337 +#: src/slic3r/GUI/PresetComboBoxes.cpp:364 #, boost-format msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "Biztos benne, hogy törli a \"%1%\" nyomtatót?" -#: src/slic3r/GUI/PresetComboBoxes.cpp:340 +#: src/slic3r/GUI/PresetComboBoxes.cpp:366 msgid "Delete Physical Printer" msgstr "Fizikai Nyomtató Törlése" -#: src/slic3r/GUI/PresetComboBoxes.cpp:581 +#: src/slic3r/GUI/PresetComboBoxes.cpp:612 msgid "Click to edit preset" msgstr "Kattintson az előbeállítás szerkesztéséhez" -#: src/slic3r/GUI/PresetComboBoxes.cpp:697 -#: src/slic3r/GUI/PresetComboBoxes.cpp:737 +#: src/slic3r/GUI/PresetComboBoxes.cpp:740 +#: src/slic3r/GUI/PresetComboBoxes.cpp:788 msgid "Add/Remove presets" msgstr "Előbeállítás Hozzáadása/Eltávolítása" -#: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:745 +#: src/slic3r/GUI/PresetComboBoxes.cpp:793 src/slic3r/GUI/Tab.cpp:3312 msgid "Add physical printer" msgstr "Fizikai nyomtató hozzáadása" -#: src/slic3r/GUI/PresetComboBoxes.cpp:716 +#: src/slic3r/GUI/PresetComboBoxes.cpp:759 msgid "Edit preset" msgstr "Előbeállítás szerkesztése" -#: src/slic3r/GUI/PresetComboBoxes.cpp:722 +#: src/slic3r/GUI/PresetComboBoxes.cpp:765 msgid "Change extruder color" msgstr "Az Extruder színének változtatása" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:773 src/slic3r/GUI/Tab.cpp:3312 msgid "Edit physical printer" msgstr "Fizikai nyomtató szerkesztése" -#: src/slic3r/GUI/PresetComboBoxes.cpp:733 +#: src/slic3r/GUI/PresetComboBoxes.cpp:779 +msgid "Open physical printer URL" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:784 msgid "Delete physical printer" msgstr "Fizikai nyomtató törlése" -#: src/slic3r/GUI/PresetComboBoxes.cpp:864 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1051 +#: src/slic3r/GUI/PresetComboBoxes.cpp:924 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1142 +msgid "Template presets" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:935 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1156 msgid "Physical printers" msgstr "Fizikai nyomtatók" -#: src/slic3r/GUI/PresetComboBoxes.cpp:888 +#: src/slic3r/GUI/PresetComboBoxes.cpp:959 msgid "Add/Remove filaments" msgstr "Filament Hozzáadása/Eltávolítása" -#: src/slic3r/GUI/PresetComboBoxes.cpp:890 +#: src/slic3r/GUI/PresetComboBoxes.cpp:961 msgid "Add/Remove materials" msgstr "Alapanyag Hozzáadása/Eltávolítása" -#: src/slic3r/GUI/PresetComboBoxes.cpp:892 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1075 +#: src/slic3r/GUI/PresetComboBoxes.cpp:963 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1180 msgid "Add/Remove printers" msgstr "Nyomtató Hozzáadása/Eltávolítása" @@ -8275,98 +9750,107 @@ msgstr "Az alsó héj minimális vastagsága %1% mm." msgid "Bottom is open." msgstr "Alsó rész nyitott." -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Send G-Code to printer host" msgstr "G-kód küldése a nyomtató gazdagépének" -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Upload to Printer Host with the following filename:" msgstr "Feltöltés a Nyomtató gazdagépére a következő fájlnévvel:" -#: src/slic3r/GUI/PrintHostDialogs.cpp:51 +#: src/slic3r/GUI/PrintHostDialogs.cpp:55 msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "Ha szükséges, használjon perjeleket ( / ) könyvtárelválasztóként." -#: src/slic3r/GUI/PrintHostDialogs.cpp:60 +#: src/slic3r/GUI/PrintHostDialogs.cpp:64 msgid "Group" msgstr "Csoport" -#: src/slic3r/GUI/PrintHostDialogs.cpp:84 +#: src/slic3r/GUI/PrintHostDialogs.cpp:74 +msgid "Upload to storage:" +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:83 +msgid "Upload to storage: " +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:105 #, c-format, boost-format msgid "Upload filename doesn't end with \"%s\". Do you wish to continue?" msgstr "A feltöltött fájl neve nem végződik „%s”-ra. Szeretné folytatni?" -#: src/slic3r/GUI/PrintHostDialogs.cpp:91 +#: src/slic3r/GUI/PrintHostDialogs.cpp:112 msgid "Upload" msgstr "Feltöltés" -#: src/slic3r/GUI/PrintHostDialogs.cpp:101 -msgid "Upload and Print" -msgstr "Feltöltés és Nyomtatás" +#: src/slic3r/GUI/PrintHostDialogs.cpp:122 +msgid "Upload to Queue" +msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:112 +#: src/slic3r/GUI/PrintHostDialogs.cpp:143 msgid "Upload and Simulate" msgstr "Feltöltés és Szimuláció" -#: src/slic3r/GUI/PrintHostDialogs.cpp:247 +#: src/slic3r/GUI/PrintHostDialogs.cpp:298 msgid "ID" msgstr "Azonosító" -#: src/slic3r/GUI/PrintHostDialogs.cpp:248 +#: src/slic3r/GUI/PrintHostDialogs.cpp:299 msgid "Progress" msgstr "Előrehaladás" -#: src/slic3r/GUI/PrintHostDialogs.cpp:249 +#: src/slic3r/GUI/PrintHostDialogs.cpp:300 msgid "Status" msgstr "Állapot" -#: src/slic3r/GUI/PrintHostDialogs.cpp:250 +#: src/slic3r/GUI/PrintHostDialogs.cpp:301 msgid "Host" msgstr "Gazda" -#: src/slic3r/GUI/PrintHostDialogs.cpp:251 +#: src/slic3r/GUI/PrintHostDialogs.cpp:302 msgctxt "OfFile" msgid "Size" msgstr "Méret" -#: src/slic3r/GUI/PrintHostDialogs.cpp:252 +#: src/slic3r/GUI/PrintHostDialogs.cpp:303 msgid "Filename" msgstr "Fájlnév" -#: src/slic3r/GUI/PrintHostDialogs.cpp:253 -msgid "Error Message" -msgstr "Hibaüzenet" +#: src/slic3r/GUI/PrintHostDialogs.cpp:304 +#, fuzzy +msgid "Message" +msgstr "%s üzenet" -#: src/slic3r/GUI/PrintHostDialogs.cpp:256 +#: src/slic3r/GUI/PrintHostDialogs.cpp:308 msgid "Cancel selected" msgstr "Kijelölt visszavonása" -#: src/slic3r/GUI/PrintHostDialogs.cpp:258 +#: src/slic3r/GUI/PrintHostDialogs.cpp:310 msgid "Show error message" msgstr "Hibaüzenet megjelenítése" -#: src/slic3r/GUI/PrintHostDialogs.cpp:316 -#: src/slic3r/GUI/PrintHostDialogs.cpp:371 +#: src/slic3r/GUI/PrintHostDialogs.cpp:368 +#: src/slic3r/GUI/PrintHostDialogs.cpp:423 msgid "Enqueued" msgstr "Sorban áll" -#: src/slic3r/GUI/PrintHostDialogs.cpp:372 +#: src/slic3r/GUI/PrintHostDialogs.cpp:424 msgid "Uploading" msgstr "Feltöltés" -#: src/slic3r/GUI/PrintHostDialogs.cpp:374 +#: src/slic3r/GUI/PrintHostDialogs.cpp:426 msgid "Cancelling" msgstr "Visszavonás" -#: src/slic3r/GUI/PrintHostDialogs.cpp:375 +#: src/slic3r/GUI/PrintHostDialogs.cpp:427 msgid "Cancelled" msgstr "Visszavonva" -#: src/slic3r/GUI/PrintHostDialogs.cpp:376 +#: src/slic3r/GUI/PrintHostDialogs.cpp:428 msgid "Completed" msgstr "Kész" -#: src/slic3r/GUI/PrintHostDialogs.cpp:424 +#: src/slic3r/GUI/PrintHostDialogs.cpp:476 msgid "Error uploading to print host:" msgstr "Hiba a nyomtató gépre való történő feltöltéskor:" @@ -8374,13 +9858,13 @@ msgstr "Hiba a nyomtató gépre való történő feltöltéskor:" msgid "NO RAMMING AT ALL" msgstr "EGYÁLTALÁN NINCS TÖMÖRÍTÉS" -#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 -#: src/libslic3r/PrintConfig.cpp:955 src/libslic3r/PrintConfig.cpp:999 -#: src/libslic3r/PrintConfig.cpp:1014 src/libslic3r/PrintConfig.cpp:3297 -#: src/libslic3r/PrintConfig.cpp:3306 src/libslic3r/PrintConfig.cpp:3315 -#: src/libslic3r/PrintConfig.cpp:3456 src/libslic3r/PrintConfig.cpp:3464 -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3479 -#: src/libslic3r/PrintConfig.cpp:3487 src/libslic3r/PrintConfig.cpp:3495 +#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/libslic3r/PrintConfig.cpp:1044 src/libslic3r/PrintConfig.cpp:1088 +#: src/libslic3r/PrintConfig.cpp:1103 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3578 src/libslic3r/PrintConfig.cpp:3587 +#: src/libslic3r/PrintConfig.cpp:3733 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3749 src/libslic3r/PrintConfig.cpp:3756 +#: src/libslic3r/PrintConfig.cpp:3764 src/libslic3r/PrintConfig.cpp:3772 msgid "s" msgstr "s" @@ -8388,43 +9872,64 @@ msgstr "s" msgid "Volumetric speed" msgstr "Térfogati sebesség" -#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:912 -#: src/libslic3r/PrintConfig.cpp:1824 +#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:1001 +#: src/libslic3r/PrintConfig.cpp:1861 msgid "mm³/s" msgstr "mm³/s" -#: src/slic3r/GUI/SavePresetDialog.cpp:57 +#: src/slic3r/GUI/SavePresetDialog.cpp:90 +#, c-format, boost-format +msgid "Rename %s to:" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:90 #, c-format, boost-format msgid "Save %s as:" msgstr "Mentés mint %s:" -#: src/slic3r/GUI/SavePresetDialog.cpp:101 -#: src/slic3r/GUI/SavePresetDialog.cpp:109 +#: src/slic3r/GUI/SavePresetDialog.cpp:165 +#: src/slic3r/GUI/SavePresetDialog.cpp:173 msgid "The supplied name is not valid;" msgstr "A megadott név érvénytelen;" -#: src/slic3r/GUI/SavePresetDialog.cpp:110 +#: src/slic3r/GUI/SavePresetDialog.cpp:174 msgid "the following suffix is not allowed:" msgstr "a következő utótag nem engedélyezett:" -#: src/slic3r/GUI/SavePresetDialog.cpp:116 +#: src/slic3r/GUI/SavePresetDialog.cpp:180 msgid "The supplied name is not available." msgstr "A megadott név nem elérhető." -#: src/slic3r/GUI/SavePresetDialog.cpp:122 +#: src/slic3r/GUI/SavePresetDialog.cpp:186 +msgid "The supplied name is used for a system profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:187 msgid "Cannot overwrite a system profile." msgstr "Nem lehet rendszerprofilt felülírni." -#: src/slic3r/GUI/SavePresetDialog.cpp:127 +#: src/slic3r/GUI/SavePresetDialog.cpp:192 +msgid "The supplied name is used for a external profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:193 msgid "Cannot overwrite an external profile." msgstr "Nem lehet külső profilt felülírni." -#: src/slic3r/GUI/SavePresetDialog.cpp:134 +#: src/slic3r/GUI/SavePresetDialog.cpp:203 +msgid "Save preset modifications to existing user profile" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:205 +msgid "Nothing changed" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:210 #, boost-format msgid "Preset with name \"%1%\" already exists." msgstr "A \"%1%\" nevű előbeállítás már létezik." -#: src/slic3r/GUI/SavePresetDialog.cpp:136 +#: src/slic3r/GUI/SavePresetDialog.cpp:212 #, boost-format msgid "" "Preset with name \"%1%\" already exists and is incompatible with selected " @@ -8433,37 +9938,52 @@ msgstr "" "A \"%1%\" nevű előbeállítás már létezik, és nem kompatibilis a kiválasztott " "nyomtatóval." -#: src/slic3r/GUI/SavePresetDialog.cpp:137 +#: src/slic3r/GUI/SavePresetDialog.cpp:213 msgid "Note: This preset will be replaced after saving" msgstr "Megjegyzés: Ez az előbeállítás a mentés után lecserélődik" -#: src/slic3r/GUI/SavePresetDialog.cpp:142 +#: src/slic3r/GUI/SavePresetDialog.cpp:219 msgid "The name cannot be empty." msgstr "A név nem lehet üres." -#: src/slic3r/GUI/SavePresetDialog.cpp:147 +#: src/slic3r/GUI/SavePresetDialog.cpp:230 +msgid "The name is too long." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:235 msgid "The name cannot start with space character." msgstr "A név nem kezdődhet szóközzel." -#: src/slic3r/GUI/SavePresetDialog.cpp:152 +#: src/slic3r/GUI/SavePresetDialog.cpp:240 msgid "The name cannot end with space character." msgstr "A név nem végződhet szóközzel." -#: src/slic3r/GUI/SavePresetDialog.cpp:157 +#: src/slic3r/GUI/SavePresetDialog.cpp:245 msgid "The name cannot be the same as a preset alias name." msgstr "A név nem lehet azonos egy előbeállítás helyettesítő(alias) nevével." -#: src/slic3r/GUI/SavePresetDialog.cpp:191 -#: src/slic3r/GUI/SavePresetDialog.cpp:197 +#: src/slic3r/GUI/SavePresetDialog.cpp:289 msgid "Save preset" msgstr "Előbeállítás mentése" -#: src/slic3r/GUI/SavePresetDialog.cpp:221 +#: src/slic3r/GUI/SavePresetDialog.cpp:295 +msgid "Save presets" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:302 +msgid "Rename preset" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:327 msgctxt "PresetName" msgid "Copy" msgstr "Másolás" -#: src/slic3r/GUI/SavePresetDialog.cpp:283 +#: src/slic3r/GUI/SavePresetDialog.cpp:347 +msgid "Save as profile derived from current printer only." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:407 #, boost-format msgid "" "You have selected physical printer \"%1%\" \n" @@ -8472,83 +9992,95 @@ msgstr "" "Ön a \"%1%\" fizikai nyomtatót választotta ki \n" "a kapcsolódó \"%2%\" nyomtató-előbeállítással." -#: src/slic3r/GUI/SavePresetDialog.cpp:322 +#: src/slic3r/GUI/SavePresetDialog.cpp:446 #, boost-format msgid "What would you like to do with \"%1%\" preset after saving?" msgstr "Mit szeretne tenni a \"%1%\" előbeállítással a mentés után?" -#: src/slic3r/GUI/SavePresetDialog.cpp:325 +#: src/slic3r/GUI/SavePresetDialog.cpp:449 #, boost-format msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" msgstr "\"%1%\" \"%2%\"-ra változtatása a \"%3%\" fizikai nyomtatóhoz." -#: src/slic3r/GUI/SavePresetDialog.cpp:326 +#: src/slic3r/GUI/SavePresetDialog.cpp:450 #, boost-format msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" msgstr "" "\"%1%\" hozzáadása a \"%2%\" fizikai nyomtató következő előbeállításaként." -#: src/slic3r/GUI/SavePresetDialog.cpp:327 +#: src/slic3r/GUI/SavePresetDialog.cpp:451 #, boost-format msgid "Just switch to \"%1%\" preset" msgstr "Csak váltson a(z) \"%1%\" előbeállításra" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2652 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2645 msgid "Stealth" msgstr "Lopakodó" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2646 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2639 msgid "Normal" msgstr "Normál" -#: src/slic3r/GUI/Selection.cpp:168 +#: src/slic3r/GUI/Selection.cpp:180 msgid "Selection-Add" msgstr "Kiválasztás - Hozzáadás" -#: src/slic3r/GUI/Selection.cpp:209 +#: src/slic3r/GUI/Selection.cpp:221 msgid "Selection-Remove" msgstr "Kiválasztás - Törlés" -#: src/slic3r/GUI/Selection.cpp:241 +#: src/slic3r/GUI/Selection.cpp:253 msgid "Selection-Add Object" msgstr "Kiválasztás - Objektum hozzáadása" -#: src/slic3r/GUI/Selection.cpp:260 +#: src/slic3r/GUI/Selection.cpp:272 msgid "Selection-Remove Object" msgstr "Kiválasztás - Objektum törlése" -#: src/slic3r/GUI/Selection.cpp:278 +#: src/slic3r/GUI/Selection.cpp:290 msgid "Selection-Add Instance" msgstr "Kiválasztás - Példány hozzáadása" -#: src/slic3r/GUI/Selection.cpp:297 +#: src/slic3r/GUI/Selection.cpp:309 msgid "Selection-Remove Instance" msgstr "Kiválasztás - Példány törlése" -#: src/slic3r/GUI/Selection.cpp:394 +#: src/slic3r/GUI/Selection.cpp:406 msgid "Selection-Add All" msgstr "Kiválasztás - Összes hozzáadása" -#: src/slic3r/GUI/Selection.cpp:419 +#: src/slic3r/GUI/Selection.cpp:431 msgid "Selection-Remove All" msgstr "Kiválasztás - Összes törlése" -#: src/slic3r/GUI/Selection.cpp:950 +#: src/slic3r/GUI/Selection.cpp:1309 msgid "Scale To Fit" msgstr "Skálázás mérethez igazítva" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:114 +#: src/slic3r/GUI/Selection.cpp:1691 +msgid "" +"The currently manipulated object is tilted or contains tilted parts " +"(rotation angles are not multiples of 90°). Non-uniform scaling of tilted " +"objects is only possible in non-local coordinate systems, once the rotation " +"is embedded into the object coordinates." +msgstr "" + +#: src/slic3r/GUI/Selection.cpp:1694 +msgid "This operation is irreversible." +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:117 msgid "Data to send" msgstr "Elküldendő adat" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:550 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:618 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:557 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:624 msgid "Send system info" msgstr "Rendszerinformáció küldése" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:581 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:587 #, boost-format msgid "" "This is the first time you are running %1%. We would like to ask you to send " @@ -8560,7 +10092,7 @@ msgstr "" "el nekünk néhány rendszeradatát. Ez csak egyszer fog megtörténni, és nem " "fogjuk ezt újra kérni (csak a következő verzióra való frissítés után)." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:585 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:591 msgid "" "If we know your hardware, operating system, etc., it will greatly help us in " "development and prioritization, because we will be able to focus our effort " @@ -8571,11 +10103,11 @@ msgstr "" "hatékonyabban tudjuk majd az erőfeszítéseinket összpontosítani, és a " "leginkább szükséges funkciókkal tölthetjük az időnket." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:588 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:594 msgid "Is it safe?" msgstr "Ez biztonságos?" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:590 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:596 #, boost-format msgid "" "We do not send any personal information nor anything that would allow us to " @@ -8593,81 +10125,86 @@ msgstr "" "telepítéséről. A PrusaSlicer nyílt forráskódú, ha a kommunikációt " "ténylegesen végrehajtó kódot szeretné megvizsgálni, itt találja: %1%." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:614 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:620 msgid "Show verbatim data that will be sent" msgstr "Az elküldött adatok szó szerinti megjelenítése" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:616 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:622 msgid "Ask me next time" msgstr "Kérdezzen meg legközelebb" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:617 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:623 msgid "Do not send anything" msgstr "Ne küldjön semmit" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:703 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:709 msgid "System info sent successfully. Thank you." msgstr "Rendszerinformáció sikeresen elküldve. Köszönjük." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:706 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:712 msgid "Sending system info failed!" msgstr "A rendszerinformáció elküldése sikertelen!" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:713 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:719 msgid "Sending system info was cancelled." msgstr "A rendszerinformáció küldése visszavonásra került." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:720 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:726 msgid "Sending system info..." msgstr "Rendszerinformáció küldése..." -#: src/slic3r/GUI/SysInfoDialog.cpp:84 +#: src/slic3r/GUI/SysInfoDialog.cpp:92 msgid "System Information" msgstr "Rendszerinformáció" -#: src/slic3r/GUI/SysInfoDialog.cpp:150 +#: src/slic3r/GUI/SysInfoDialog.cpp:160 msgid "Blacklisted libraries loaded into PrusaSlicer process:" msgstr "Feketelistás könyvtárak kerültek betöltése a PrusaSlicer folyamatba:" -#: src/slic3r/GUI/SysInfoDialog.cpp:162 +#: src/slic3r/GUI/SysInfoDialog.cpp:172 msgid "Eigen vectorization supported:" msgstr "Támogatott saját vektorizálás:" -#: src/slic3r/GUI/SysInfoDialog.cpp:169 +#: src/slic3r/GUI/SysInfoDialog.cpp:179 msgid "Copy to Clipboard" msgstr "Másolás a Vágólapra" -#: src/slic3r/GUI/Tab.cpp:114 src/libslic3r/PrintConfig.cpp:565 +#: src/slic3r/GUI/Tab.cpp:68 src/libslic3r/PrintConfig.cpp:668 msgid "Compatible printers" msgstr "Kompatibilis nyomtatók" -#: src/slic3r/GUI/Tab.cpp:115 +#: src/slic3r/GUI/Tab.cpp:69 msgid "Select the printers this profile is compatible with." msgstr "Válassza ki az ezzel a profillal kompatibilis nyomtatókat." -#: src/slic3r/GUI/Tab.cpp:120 src/libslic3r/PrintConfig.cpp:580 +#: src/slic3r/GUI/Tab.cpp:74 src/libslic3r/PrintConfig.cpp:683 msgid "Compatible print profiles" msgstr "Kompatibilis nyomtatási profilok" -#: src/slic3r/GUI/Tab.cpp:121 +#: src/slic3r/GUI/Tab.cpp:75 msgid "Select the print profiles this profile is compatible with." msgstr "Válassza ki az ezzel a profillal kompatibilis nyomtatási profilokat." -#: src/slic3r/GUI/Tab.cpp:216 +#: src/slic3r/GUI/Tab.cpp:165 msgid "Compare this preset with some another" msgstr "Ennek az előbeállításnak az összehasonlítása egy másikkal" #. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:218 +#: src/slic3r/GUI/Tab.cpp:167 #, c-format, boost-format msgid "Save current %s" msgstr "Aktuális %s mentése" -#: src/slic3r/GUI/Tab.cpp:219 +#: src/slic3r/GUI/Tab.cpp:168 +#, c-format, boost-format +msgid "Rename current %s" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:170 msgid "Delete this preset" msgstr "Előbeálltás törlése" -#: src/slic3r/GUI/Tab.cpp:223 +#: src/slic3r/GUI/Tab.cpp:174 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." @@ -8675,16 +10212,16 @@ msgstr "" "További információért vigye a kurzort a gombok fölé, \n" "vagy kattintson erre a gombra." -#: src/slic3r/GUI/Tab.cpp:227 +#: src/slic3r/GUI/Tab.cpp:178 #, boost-format msgid "Search in settings [%1%]" msgstr "Keresés a beállításokban [%1%]" -#: src/slic3r/GUI/Tab.cpp:1298 +#: src/slic3r/GUI/Tab.cpp:1243 msgid "Detach from system preset" msgstr "Leválasztás a rendszer-előbeállításokról" -#: src/slic3r/GUI/Tab.cpp:1311 +#: src/slic3r/GUI/Tab.cpp:1256 msgid "" "A copy of the current system preset will be created, which will be detached " "from the system preset." @@ -8692,223 +10229,231 @@ msgstr "" "Létrejön az aktuális rendszer-előbeállítás másolata, amely leválik a " "rendszer-előbeállításról." -#: src/slic3r/GUI/Tab.cpp:1312 +#: src/slic3r/GUI/Tab.cpp:1257 msgid "" "The current custom preset will be detached from the parent system preset." msgstr "" "Az aktuális egyéni-előbeállítás leválik a szülő rendszer-előbeállításáról." -#: src/slic3r/GUI/Tab.cpp:1315 +#: src/slic3r/GUI/Tab.cpp:1260 msgid "Modifications to the current profile will be saved." msgstr "Az aktuális profil módosításai mentésre kerülnek." -#: src/slic3r/GUI/Tab.cpp:1321 +#: src/slic3r/GUI/Tab.cpp:1266 msgid "Detach preset" msgstr "Előbeállítás leválasztása" -#: src/slic3r/GUI/Tab.cpp:1347 +#: src/slic3r/GUI/Tab.cpp:1292 msgid "This is a default preset." msgstr "Ez az alapértelmezett előbeállítás." -#: src/slic3r/GUI/Tab.cpp:1349 +#: src/slic3r/GUI/Tab.cpp:1294 msgid "This is a system preset." msgstr "Ez a rendszer előbeállítás." -#: src/slic3r/GUI/Tab.cpp:1351 +#: src/slic3r/GUI/Tab.cpp:1296 msgid "Current preset is inherited from the default preset." msgstr "Az aktuális előbeállítás az alapértelmezett előbeállítástól öröklődik." -#: src/slic3r/GUI/Tab.cpp:1355 +#: src/slic3r/GUI/Tab.cpp:1300 msgid "Current preset is inherited from" msgstr "Az aktuális előbeállítás innen öröklődik" -#: src/slic3r/GUI/Tab.cpp:1359 +#: src/slic3r/GUI/Tab.cpp:1304 msgid "It can't be deleted or modified." msgstr "Ezt nem lehet törölni vagy módosítani." -#: src/slic3r/GUI/Tab.cpp:1360 +#: src/slic3r/GUI/Tab.cpp:1305 msgid "" "Any modifications should be saved as a new preset inherited from this one." msgstr "Minden módosítást új, ettől örökölt előbeállításként kell elmenteni." -#: src/slic3r/GUI/Tab.cpp:1361 +#: src/slic3r/GUI/Tab.cpp:1306 msgid "To do that please specify a new name for the preset." msgstr "Ehhez adjon meg egy új nevet az előbeállításnak." -#: src/slic3r/GUI/Tab.cpp:1365 +#: src/slic3r/GUI/Tab.cpp:1310 msgid "Additional information:" msgstr "További információ:" -#: src/slic3r/GUI/Tab.cpp:1371 +#: src/slic3r/GUI/Tab.cpp:1316 msgid "printer model" msgstr "nyomtató modell" -#: src/slic3r/GUI/Tab.cpp:1379 +#: src/slic3r/GUI/Tab.cpp:1324 msgid "default print profile" msgstr "alapértelmezett nyomtató profil" -#: src/slic3r/GUI/Tab.cpp:1382 +#: src/slic3r/GUI/Tab.cpp:1327 msgid "default filament profile" msgstr "alapértelmezett filament profil" -#: src/slic3r/GUI/Tab.cpp:1396 +#: src/slic3r/GUI/Tab.cpp:1341 msgid "default SLA material profile" msgstr "alapértelmezett SLA anyag profil" -#: src/slic3r/GUI/Tab.cpp:1400 +#: src/slic3r/GUI/Tab.cpp:1345 msgid "default SLA print profile" msgstr "alapértelmezett SLA nyomtatási profil" -#: src/slic3r/GUI/Tab.cpp:1408 +#: src/slic3r/GUI/Tab.cpp:1353 msgid "full profile name" msgstr "teljes profil név" -#: src/slic3r/GUI/Tab.cpp:1409 +#: src/slic3r/GUI/Tab.cpp:1354 msgid "symbolic profile name" msgstr "szimbolikus profil név" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4657 +#: src/slic3r/GUI/Tab.cpp:1392 src/slic3r/GUI/Tab.cpp:4940 msgid "Layers and perimeters" msgstr "Rétegek és kerületek" -#: src/slic3r/GUI/Tab.cpp:1453 +#: src/slic3r/GUI/Tab.cpp:1398 msgid "Vertical shells" msgstr "Függőleges héjak" -#: src/slic3r/GUI/Tab.cpp:1465 +#: src/slic3r/GUI/Tab.cpp:1410 msgid "Horizontal shells" msgstr "Vízszintes héjak" -#: src/slic3r/GUI/Tab.cpp:1466 src/libslic3r/PrintConfig.cpp:2417 +#: src/slic3r/GUI/Tab.cpp:1411 src/libslic3r/PrintConfig.cpp:2448 msgid "Solid layers" msgstr "Tömör rétegek" -#: src/slic3r/GUI/Tab.cpp:1471 +#: src/slic3r/GUI/Tab.cpp:1416 msgid "Minimum shell thickness" msgstr "Minimum héjvastagság" -#: src/slic3r/GUI/Tab.cpp:1482 +#: src/slic3r/GUI/Tab.cpp:1427 msgid "Quality (slower slicing)" msgstr "Minőség (lassabb szeletelés)" -#: src/slic3r/GUI/Tab.cpp:1497 +#: src/slic3r/GUI/Tab.cpp:1444 msgid "Fuzzy skin (experimental)" msgstr "Fuzzy bőr (kísérleti)" -#: src/slic3r/GUI/Tab.cpp:1520 +#: src/slic3r/GUI/Tab.cpp:1467 msgid "Reducing printing time" msgstr "Nyomtatási idő csökkentése" -#: src/slic3r/GUI/Tab.cpp:1535 src/libslic3r/ExtrusionEntity.cpp:370 +#: src/slic3r/GUI/Tab.cpp:1482 msgid "Skirt" msgstr "Szoknya" -#: src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1504 msgid "Raft" msgstr "Tutaj" -#: src/slic3r/GUI/Tab.cpp:1562 +#: src/slic3r/GUI/Tab.cpp:1509 msgid "Options for support material and raft" msgstr "Támaszanyag és a tutaj lehetőségei" -#: src/slic3r/GUI/Tab.cpp:1582 +#: src/slic3r/GUI/Tab.cpp:1528 +msgid "Organic supports" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1537 msgid "Speed for print moves" msgstr "Sebesség nyomtatási mozgásokhoz" -#: src/slic3r/GUI/Tab.cpp:1595 +#: src/slic3r/GUI/Tab.cpp:1550 +msgid "Dynamic overhang speed" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1557 msgid "Speed for non-print moves" msgstr "Sebesség nem nyomtatási mozgásokhoz" -#: src/slic3r/GUI/Tab.cpp:1599 +#: src/slic3r/GUI/Tab.cpp:1561 msgid "Modifiers" msgstr "Módosítók" -#: src/slic3r/GUI/Tab.cpp:1603 +#: src/slic3r/GUI/Tab.cpp:1565 msgid "Acceleration control (advanced)" msgstr "Gyorsulásszabályozás (Haladó)" -#: src/slic3r/GUI/Tab.cpp:1614 +#: src/slic3r/GUI/Tab.cpp:1576 msgid "Autospeed (advanced)" msgstr "Automatikus Sebesség (haladó)" -#: src/slic3r/GUI/Tab.cpp:1618 +#: src/slic3r/GUI/Tab.cpp:1580 msgid "Pressure equalizer (experimental)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1622 +#: src/slic3r/GUI/Tab.cpp:1584 msgid "Multiple Extruders" msgstr "Több Extruder" -#: src/slic3r/GUI/Tab.cpp:1630 +#: src/slic3r/GUI/Tab.cpp:1592 msgid "Ooze prevention" msgstr "Szivárgás megelőzés" -#: src/slic3r/GUI/Tab.cpp:1650 +#: src/slic3r/GUI/Tab.cpp:1596 +msgid "Wipe tower" +msgstr "Törlőtorony" + +#: src/slic3r/GUI/Tab.cpp:1612 msgid "Extrusion width" msgstr "Extrudálási szélesség" -#: src/slic3r/GUI/Tab.cpp:1660 +#: src/slic3r/GUI/Tab.cpp:1622 msgid "Overlap" msgstr "Átfedés" -#: src/slic3r/GUI/Tab.cpp:1663 +#: src/slic3r/GUI/Tab.cpp:1625 msgid "Flow" msgstr "Áramlás" -#: src/slic3r/GUI/Tab.cpp:1674 src/slic3r/GUI/Tab.cpp:1700 -msgid "Other" -msgstr "Egyéb" - -#: src/slic3r/GUI/Tab.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:1636 msgid "Arachne perimeter generator" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1685 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1644 src/slic3r/GUI/Tab.cpp:4990 msgid "Output options" msgstr "Kimeneti lehetőségek" -#: src/slic3r/GUI/Tab.cpp:1686 +#: src/slic3r/GUI/Tab.cpp:1645 msgid "Sequential printing" msgstr "Szekvenciális nyomtatás" -#: src/slic3r/GUI/Tab.cpp:1688 +#: src/slic3r/GUI/Tab.cpp:1647 msgid "Extruder clearance" msgstr "Extruder körüli szabad tér" -#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:4735 +#: src/slic3r/GUI/Tab.cpp:1652 src/slic3r/GUI/Tab.cpp:4991 msgid "Output file" msgstr "Kimeneti fájl" -#: src/slic3r/GUI/Tab.cpp:1712 src/libslic3r/PrintConfig.cpp:2042 +#: src/slic3r/GUI/Tab.cpp:1671 src/libslic3r/PrintConfig.cpp:2072 msgid "Post-processing scripts" msgstr "Utófeldolgozó szkriptek" -#: src/slic3r/GUI/Tab.cpp:1724 src/slic3r/GUI/Tab.cpp:1725 -#: src/slic3r/GUI/Tab.cpp:2110 src/slic3r/GUI/Tab.cpp:2111 -#: src/slic3r/GUI/Tab.cpp:2498 src/slic3r/GUI/Tab.cpp:2499 -#: src/slic3r/GUI/Tab.cpp:2571 src/slic3r/GUI/Tab.cpp:2572 -#: src/slic3r/GUI/Tab.cpp:3957 src/slic3r/GUI/Tab.cpp:4585 -#: src/slic3r/GUI/Tab.cpp:4586 +#: src/slic3r/GUI/Tab.cpp:1683 src/slic3r/GUI/Tab.cpp:1684 +#: src/slic3r/GUI/Tab.cpp:2080 src/slic3r/GUI/Tab.cpp:2081 +#: src/slic3r/GUI/Tab.cpp:2486 src/slic3r/GUI/Tab.cpp:2487 +#: src/slic3r/GUI/Tab.cpp:2564 src/slic3r/GUI/Tab.cpp:2565 +#: src/slic3r/GUI/Tab.cpp:4182 src/slic3r/GUI/Tab.cpp:4822 +#: src/slic3r/GUI/Tab.cpp:4823 msgid "Notes" msgstr "Megjegyzések" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:2088 +#: src/slic3r/GUI/Tab.cpp:2493 src/slic3r/GUI/Tab.cpp:2571 +#: src/slic3r/GUI/Tab.cpp:4830 src/slic3r/GUI/Tab.cpp:4996 msgid "Dependencies" msgstr "Függőségek" -#: src/slic3r/GUI/Tab.cpp:1732 src/slic3r/GUI/Tab.cpp:2119 -#: src/slic3r/GUI/Tab.cpp:2506 src/slic3r/GUI/Tab.cpp:2579 -#: src/slic3r/GUI/Tab.cpp:4594 src/slic3r/GUI/Tab.cpp:4741 +#: src/slic3r/GUI/Tab.cpp:1691 src/slic3r/GUI/Tab.cpp:2089 +#: src/slic3r/GUI/Tab.cpp:2494 src/slic3r/GUI/Tab.cpp:2572 +#: src/slic3r/GUI/Tab.cpp:4831 src/slic3r/GUI/Tab.cpp:4997 msgid "Profile dependencies" msgstr "Profilfüggőségek" -#: src/slic3r/GUI/Tab.cpp:1771 +#: src/slic3r/GUI/Tab.cpp:1723 msgid "Post processing scripts shall modify G-code file in place." msgstr "Az utófeldolgozási szkriptek a G-kód fájlt helyben módosítják." -#: src/slic3r/GUI/Tab.cpp:1850 +#: src/slic3r/GUI/Tab.cpp:1802 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8927,7 +10472,7 @@ msgstr[1] "" "Kérjük, távolítsa el ezeket, mivel problémákat okozhat a G-kód " "megjelenítésében és a nyomtatási idő becslésében." -#: src/slic3r/GUI/Tab.cpp:1855 +#: src/slic3r/GUI/Tab.cpp:1807 msgid "Found reserved keywords in" msgstr "Fenntartott kulcsszavakat találtam az" @@ -8935,75 +10480,91 @@ msgstr "Fenntartott kulcsszavakat találtam az" msgid "Filament Overrides" msgstr "Filament Felülbírálások" -#: src/slic3r/GUI/Tab.cpp:1992 +#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2827 +msgid "Retraction" +msgstr "Visszahúzás" + +#: src/slic3r/GUI/Tab.cpp:1951 +msgid "Temperature" +msgstr "Hőmérséklet" + +#: src/slic3r/GUI/Tab.cpp:1955 msgid "Nozzle" msgstr "Fúvóka" -#: src/slic3r/GUI/Tab.cpp:1997 +#: src/slic3r/GUI/Tab.cpp:1960 msgid "Bed" msgstr "Tárgyasztal" -#: src/slic3r/GUI/Tab.cpp:2002 +#: src/slic3r/GUI/Tab.cpp:1965 msgid "Cooling" msgstr "Hűtés" -#: src/slic3r/GUI/Tab.cpp:2004 src/libslic3r/PrintConfig.cpp:1936 -#: src/libslic3r/PrintConfig.cpp:2994 +#: src/slic3r/GUI/Tab.cpp:1967 src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "Enable" msgstr "Engedélyezés" -#: src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/Tab.cpp:1978 msgid "Fan settings" msgstr "Ventilátor Beállítások" -#: src/slic3r/GUI/Tab.cpp:2026 +#: src/slic3r/GUI/Tab.cpp:1979 +msgid "Fan speed" +msgstr "Ventilátor sebesség" + +#: src/slic3r/GUI/Tab.cpp:1989 +msgid "Dynamic fan speeds" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1996 msgid "Cooling thresholds" msgstr "Hűtési küszöbök" -#: src/slic3r/GUI/Tab.cpp:2032 +#: src/slic3r/GUI/Tab.cpp:2002 msgid "Filament properties" msgstr "Filament tulajdonságok" -#: src/slic3r/GUI/Tab.cpp:2039 +#: src/slic3r/GUI/Tab.cpp:2009 msgid "Print speed override" msgstr "Nyomtatási sebesség felülbírálás" -#: src/slic3r/GUI/Tab.cpp:2049 +#: src/slic3r/GUI/Tab.cpp:2019 msgid "Wipe tower parameters" msgstr "Törlőtorony paraméterek" -#: src/slic3r/GUI/Tab.cpp:2052 +#: src/slic3r/GUI/Tab.cpp:2022 msgid "Toolchange parameters with single extruder MM printers" msgstr "" "Szerszámváltási paraméterek egy extruderes Több Anyagos (MM) nyomtatónál" -#: src/slic3r/GUI/Tab.cpp:2065 +#: src/slic3r/GUI/Tab.cpp:2035 msgid "Ramming settings" msgstr "Tömörítési beállítások" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 -#: src/slic3r/GUI/Tab.cpp:4264 src/libslic3r/GCode.cpp:733 -#: src/libslic3r/PrintConfig.cpp:2500 +#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:2398 +#: src/slic3r/GUI/Tab.cpp:4493 src/libslic3r/GCode.cpp:684 +#: src/libslic3r/PrintConfig.cpp:2532 msgid "Custom G-code" msgstr "Egyéni G-kód" -#: src/slic3r/GUI/Tab.cpp:2090 src/slic3r/GUI/Tab.cpp:2411 -#: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2450 -#: src/libslic3r/PrintConfig.cpp:2465 +#: src/slic3r/GUI/Tab.cpp:2060 src/slic3r/GUI/Tab.cpp:2399 +#: src/libslic3r/GCode.cpp:658 src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2497 msgid "Start G-code" msgstr "G-kód kezdete" -#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:2421 -#: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:685 -#: src/libslic3r/PrintConfig.cpp:695 +#: src/slic3r/GUI/Tab.cpp:2070 src/slic3r/GUI/Tab.cpp:2409 +#: src/libslic3r/GCode.cpp:659 src/libslic3r/PrintConfig.cpp:788 +#: src/libslic3r/PrintConfig.cpp:798 msgid "End G-code" msgstr "G-kód vége" -#: src/slic3r/GUI/Tab.cpp:2153 +#: src/slic3r/GUI/Tab.cpp:2115 msgid "Volumetric flow hints not available" msgstr "Térfogatáramlási tippek nem állnak rendelkezésre" -#: src/slic3r/GUI/Tab.cpp:2257 +#: src/slic3r/GUI/Tab.cpp:2241 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -9025,20 +10586,20 @@ msgstr "" "beállításai lapon a \"fogaskerék\" ikonra kattint. A fizikai nyomtató " "profilok a PrusaSlicer/physical_printer könyvtárban kerülnek tárolásra." -#: src/slic3r/GUI/Tab.cpp:2291 src/slic3r/GUI/Tab.cpp:2518 +#: src/slic3r/GUI/Tab.cpp:2275 src/slic3r/GUI/Tab.cpp:2506 msgid "Size and coordinates" msgstr "Méret és koordináták" -#: src/slic3r/GUI/Tab.cpp:2300 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:2284 src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "Capabilities" msgstr "Képességek" -#: src/slic3r/GUI/Tab.cpp:2305 +#: src/slic3r/GUI/Tab.cpp:2289 msgid "Number of extruders of the printer." msgstr "A nyomtató Extrudereinek száma." -#: src/slic3r/GUI/Tab.cpp:2334 +#: src/slic3r/GUI/Tab.cpp:2322 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -9049,105 +10610,101 @@ msgstr "" "ezért minden extruder átmérőjének azonosnak kell lennie.\n" "Szeretné az összes extruder fúvókaátmérőjét az első extruderéhez igazítani?" -#: src/slic3r/GUI/Tab.cpp:2338 src/slic3r/GUI/Tab.cpp:2782 -#: src/libslic3r/PrintConfig.cpp:1900 +#: src/slic3r/GUI/Tab.cpp:2326 src/slic3r/GUI/Tab.cpp:2714 +#: src/libslic3r/PrintConfig.cpp:1937 msgid "Nozzle diameter" msgstr "Fúvóka Átmérő" -#: src/slic3r/GUI/Tab.cpp:2431 src/libslic3r/GCode.cpp:709 -#: src/libslic3r/PrintConfig.cpp:425 +#: src/slic3r/GUI/Tab.cpp:2419 src/libslic3r/GCode.cpp:660 +#: src/libslic3r/PrintConfig.cpp:444 msgid "Before layer change G-code" msgstr "G-kód Rétegváltás Előtt" -#: src/slic3r/GUI/Tab.cpp:2441 src/libslic3r/GCode.cpp:710 -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/slic3r/GUI/Tab.cpp:2429 src/libslic3r/GCode.cpp:661 +#: src/libslic3r/PrintConfig.cpp:1665 msgid "After layer change G-code" msgstr "G-kód Rétegváltás Után" -#: src/slic3r/GUI/Tab.cpp:2451 src/libslic3r/GCode.cpp:711 -#: src/libslic3r/PrintConfig.cpp:2877 +#: src/slic3r/GUI/Tab.cpp:2439 src/libslic3r/GCode.cpp:662 +#: src/libslic3r/PrintConfig.cpp:2965 msgid "Tool change G-code" msgstr "G-kód Szerszám Váltás" -#: src/slic3r/GUI/Tab.cpp:2461 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2449 src/libslic3r/GCode.cpp:663 msgid "Between objects G-code (for sequential printing)" msgstr "G-kód Objektumok Között (egymás utáni nyomtatáshoz)" -#: src/slic3r/GUI/Tab.cpp:2471 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2459 src/libslic3r/GCode.cpp:664 msgid "Color Change G-code" msgstr "G-kód Színváltás" -#: src/slic3r/GUI/Tab.cpp:2480 src/libslic3r/GCode.cpp:714 -#: src/libslic3r/PrintConfig.cpp:2491 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:665 +#: src/libslic3r/PrintConfig.cpp:2523 msgid "Pause Print G-code" msgstr "G-kód Nyomtatás Szüneteltetése" -#: src/slic3r/GUI/Tab.cpp:2489 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:666 msgid "Template Custom G-code" msgstr "G-kód Egyedi Minta" -#: src/slic3r/GUI/Tab.cpp:2525 +#: src/slic3r/GUI/Tab.cpp:2513 msgid "Display" msgstr "Kijelző" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2528 msgid "Tilt" msgstr "Billentés" -#: src/slic3r/GUI/Tab.cpp:2541 +#: src/slic3r/GUI/Tab.cpp:2529 msgid "Tilt time" msgstr "Billentési idő" -#: src/slic3r/GUI/Tab.cpp:2548 src/slic3r/GUI/Tab.cpp:4575 +#: src/slic3r/GUI/Tab.cpp:2536 src/slic3r/GUI/Tab.cpp:4812 msgid "Corrections" msgstr "Korrekciók" -#: src/slic3r/GUI/Tab.cpp:2561 src/slic3r/GUI/Tab.cpp:4571 +#: src/slic3r/GUI/Tab.cpp:2549 src/slic3r/GUI/Tab.cpp:4808 msgid "Exposure" msgstr "Expozíció" -#: src/slic3r/GUI/Tab.cpp:2622 src/slic3r/GUI/Tab.cpp:2709 -#: src/libslic3r/PrintConfig.cpp:1655 src/libslic3r/PrintConfig.cpp:1690 -#: src/libslic3r/PrintConfig.cpp:1707 src/libslic3r/PrintConfig.cpp:1724 -#: src/libslic3r/PrintConfig.cpp:1740 src/libslic3r/PrintConfig.cpp:1750 -#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1773 -#: src/libslic3r/PrintConfig.cpp:1783 +#: src/slic3r/GUI/Tab.cpp:2556 +msgid "Output" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2615 src/slic3r/GUI/Tab.cpp:2875 +#: src/libslic3r/PrintConfig.cpp:1694 src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1744 src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1777 src/libslic3r/PrintConfig.cpp:1787 +#: src/libslic3r/PrintConfig.cpp:1797 src/libslic3r/PrintConfig.cpp:1810 +#: src/libslic3r/PrintConfig.cpp:1820 msgid "Machine limits" msgstr "Gépi limitek" -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2638 msgid "Values in this column are for Normal mode" msgstr "Ez az oszlop a Normál módra vonatkozik" -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2644 msgid "Values in this column are for Stealth mode" msgstr "Ez az oszlop a Lopakodó módra vonatkozik" -#: src/slic3r/GUI/Tab.cpp:2660 +#: src/slic3r/GUI/Tab.cpp:2653 msgid "Maximum feedrates" msgstr "Maximum előtolások" -#: src/slic3r/GUI/Tab.cpp:2665 +#: src/slic3r/GUI/Tab.cpp:2658 msgid "Maximum accelerations" msgstr "Maximum gyorsulások" -#: src/slic3r/GUI/Tab.cpp:2674 +#: src/slic3r/GUI/Tab.cpp:2667 msgid "Jerk limits" msgstr "Rántás korlátok" -#: src/slic3r/GUI/Tab.cpp:2680 +#: src/slic3r/GUI/Tab.cpp:2673 msgid "Minimum feedrates" msgstr "Minimum előtolások" -#: src/slic3r/GUI/Tab.cpp:2734 src/slic3r/GUI/Tab.cpp:2743 -msgid "Single extruder MM setup" -msgstr "Egy extruders MM beállítása" - -#: src/slic3r/GUI/Tab.cpp:2744 -msgid "Single extruder multimaterial parameters" -msgstr "Egyetlen extruder többanyagú paraméterei" - -#: src/slic3r/GUI/Tab.cpp:2779 +#: src/slic3r/GUI/Tab.cpp:2711 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -9155,19 +10712,27 @@ msgstr "" "Ez egy egy-extruderes, többféle anyagot használó nyomtató, az összes " "extruder átmérője az új értékre lesz beállítva. Szeretné folytatni?" -#: src/slic3r/GUI/Tab.cpp:2804 +#: src/slic3r/GUI/Tab.cpp:2739 +msgid "Reset to Filament Color" +msgstr "Filament színének visszaállítása" + +#: src/slic3r/GUI/Tab.cpp:2775 +msgid "Apply below setting to other extruders" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2820 msgid "Layer height limits" msgstr "Rétegmagasság korlátok" -#: src/slic3r/GUI/Tab.cpp:2809 +#: src/slic3r/GUI/Tab.cpp:2824 msgid "Position (for multi-extruder printers)" msgstr "Pozíció (több extruderes nyomtatók esetében)" -#: src/slic3r/GUI/Tab.cpp:2815 +#: src/slic3r/GUI/Tab.cpp:2830 msgid "Only lift Z" msgstr "Csak a Z tengely emelése" -#: src/slic3r/GUI/Tab.cpp:2828 +#: src/slic3r/GUI/Tab.cpp:2843 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -9175,11 +10740,15 @@ msgstr "" "Visszahúzás, ha a szerszám ki van kapcsolva (több extruderes beállítások " "speciális beállításai)" -#: src/slic3r/GUI/Tab.cpp:2835 -msgid "Reset to Filament Color" -msgstr "Filament színének visszaállítása" +#: src/slic3r/GUI/Tab.cpp:2900 src/slic3r/GUI/Tab.cpp:2909 +msgid "Single extruder MM setup" +msgstr "Egy extruders MM beállítása" + +#: src/slic3r/GUI/Tab.cpp:2910 +msgid "Single extruder multimaterial parameters" +msgstr "Egyetlen extruder többanyagú paraméterei" -#: src/slic3r/GUI/Tab.cpp:3012 +#: src/slic3r/GUI/Tab.cpp:3074 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -9189,31 +10758,46 @@ msgstr "" "\n" "Kikapcsolja a Törlést, hogy engedélyezze a Firmware visszahúzást?" -#: src/slic3r/GUI/Tab.cpp:3014 +#: src/slic3r/GUI/Tab.cpp:3076 msgid "Firmware Retraction" msgstr "Firmware visszahúzás" -#: src/slic3r/GUI/Tab.cpp:3319 +#: src/slic3r/GUI/Tab.cpp:3384 msgid "New printer preset selected" msgstr "Új nyomtató előbeállítás kiválasztva" -#: src/slic3r/GUI/Tab.cpp:3625 +#: src/slic3r/GUI/Tab.cpp:3758 msgid "Detached" msgstr "Független_" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3857 +msgid "" +"The physical printer below is based on the preset, you are going to rename." +msgid_plural "" +"The physical printers below are based on the preset, you are going to rename." +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Tab.cpp:3862 +msgid "Note, that the selected preset will be renamed in this printer too." +msgid_plural "" +"Note, that the selected preset will be renamed in these printers too." +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Tab.cpp:3924 msgid "remove" msgstr "eltávolít" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3924 msgid "delete" msgstr "törlés" -#: src/slic3r/GUI/Tab.cpp:3711 +#: src/slic3r/GUI/Tab.cpp:3933 msgid "It's a last preset for this physical printer." msgstr "Ez az utolsó előbeállítás ehhez a fizikai nyomtatóhoz." -#: src/slic3r/GUI/Tab.cpp:3716 +#: src/slic3r/GUI/Tab.cpp:3938 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " @@ -9222,7 +10806,7 @@ msgstr "" "Biztos, hogy törölni szeretné a \"%1%\" előbeállítást a \"%2%\" fizikai " "nyomtatóról?" -#: src/slic3r/GUI/Tab.cpp:3728 +#: src/slic3r/GUI/Tab.cpp:3950 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -9234,7 +10818,7 @@ msgstr[1] "" "Az alábbi fizikai nyomtatók azon az előbeállításon alapulnak, amelyet " "törölni készül." -#: src/slic3r/GUI/Tab.cpp:3733 +#: src/slic3r/GUI/Tab.cpp:3955 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." @@ -9245,7 +10829,7 @@ msgstr[1] "" "Vegye figyelembe, hogy a kiválasztott előbeállítás törlődik ezekről a " "nyomtatókról is." -#: src/slic3r/GUI/Tab.cpp:3738 +#: src/slic3r/GUI/Tab.cpp:3960 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -9259,7 +10843,7 @@ msgstr[1] "" "Az alábbi fizikai nyomtatók csak azon az előbeállításon alapulnak, amelyet " "törölni készül." -#: src/slic3r/GUI/Tab.cpp:3743 +#: src/slic3r/GUI/Tab.cpp:3965 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -9271,57 +10855,57 @@ msgstr[1] "" "Vegye figyelembe, hogy ezek a nyomtatók is törlődnek a kiválasztott " "előbeállítás törlése után." -#: src/slic3r/GUI/Tab.cpp:3748 +#: src/slic3r/GUI/Tab.cpp:3970 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "Biztos, hogy a kiválasztott előbeállítást %1% szeretné?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3753 +#: src/slic3r/GUI/Tab.cpp:3975 #, boost-format msgid "%1% Preset" msgstr "%1% Előbeállítás" -#: src/slic3r/GUI/Tab.cpp:3836 src/slic3r/GUI/Tab.cpp:4198 +#: src/slic3r/GUI/Tab.cpp:4061 src/slic3r/GUI/Tab.cpp:4423 msgid "Set" msgstr "Beállítás" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:4180 msgid "Find" msgstr "Keresés" -#: src/slic3r/GUI/Tab.cpp:3956 +#: src/slic3r/GUI/Tab.cpp:4181 msgid "Replace with" msgstr "Csere erre" -#: src/slic3r/GUI/Tab.cpp:4045 +#: src/slic3r/GUI/Tab.cpp:4270 msgid "Regular expression" msgstr "Reguláris kifejezés" -#: src/slic3r/GUI/Tab.cpp:4049 +#: src/slic3r/GUI/Tab.cpp:4274 msgid "Case insensitive" msgstr "Nagy- és kisbetű érzékeny" -#: src/slic3r/GUI/Tab.cpp:4053 +#: src/slic3r/GUI/Tab.cpp:4278 msgid "Whole word" msgstr "Teljes szó" -#: src/slic3r/GUI/Tab.cpp:4057 +#: src/slic3r/GUI/Tab.cpp:4282 msgid "Match single line" msgstr "Egysoros egyeztetés" -#: src/slic3r/GUI/Tab.cpp:4160 +#: src/slic3r/GUI/Tab.cpp:4385 msgid "Are you sure you want to delete all substitutions?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4292 +#: src/slic3r/GUI/Tab.cpp:4521 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" "A gépi korlátok a G-kódba kerülnek, és a nyomtatási idő becslésére " "szolgálnak." -#: src/slic3r/GUI/Tab.cpp:4295 +#: src/slic3r/GUI/Tab.cpp:4524 msgid "" "Machine limits will NOT be emitted to G-code, however they will be used to " "estimate print time, which may therefore not be accurate as the printer may " @@ -9331,7 +10915,7 @@ msgstr "" "felhasználásra kerülnek. A nyomtató más gépi korlátokat alkalmazhat, ezért a " "nyomtatási idő becslése pontatlan lehet." -#: src/slic3r/GUI/Tab.cpp:4299 +#: src/slic3r/GUI/Tab.cpp:4528 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." @@ -9339,12 +10923,12 @@ msgstr "" "A gépi korlátok nincsenek beállítva, ezért a nyomtatási idő becslése " "pontatlan lehet." -#: src/slic3r/GUI/Tab.cpp:4321 +#: src/slic3r/GUI/Tab.cpp:4550 msgid "LOCKED LOCK" msgstr "ZÁRT LAKAT" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4323 +#: src/slic3r/GUI/Tab.cpp:4552 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" @@ -9352,12 +10936,12 @@ msgstr "" "azt jelzi, hogy a beállítások megegyeznek az aktuális opciócsoport rendszer- " "(vagy alapértelmezett) értékeivel" -#: src/slic3r/GUI/Tab.cpp:4325 +#: src/slic3r/GUI/Tab.cpp:4554 msgid "UNLOCKED LOCK" msgstr "NYITOTT LAKAT" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4327 +#: src/slic3r/GUI/Tab.cpp:4556 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -9369,12 +10953,12 @@ msgstr "" "Kattintson a NYITOTT LAKAT ikonra az aktuális opciócsoport összes " "beállításának visszaállításához a rendszer (vagy az alapértelmezett) értékre." -#: src/slic3r/GUI/Tab.cpp:4332 +#: src/slic3r/GUI/Tab.cpp:4561 msgid "WHITE BULLET" msgstr "SZÜRKE PÖTTY" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4334 +#: src/slic3r/GUI/Tab.cpp:4563 msgid "" "for the left button: indicates a non-system (or non-default) preset,\n" "for the right button: indicates that the settings hasn't been modified." @@ -9383,12 +10967,12 @@ msgstr "" "értéket jelez,\n" "jobb gomb esetén: azt jelzi, hogy a beállításokat nem módosították." -#: src/slic3r/GUI/Tab.cpp:4337 +#: src/slic3r/GUI/Tab.cpp:4566 msgid "BACK ARROW" msgstr "VISSZA NYÍL" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4339 +#: src/slic3r/GUI/Tab.cpp:4568 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -9400,7 +10984,7 @@ msgstr "" "Kattintson a VISSZA NYÍL ikonra az aktuális opciócsoport összes " "beállításának visszaállításához az utoljára mentett állapotra." -#: src/slic3r/GUI/Tab.cpp:4349 +#: src/slic3r/GUI/Tab.cpp:4578 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -9408,7 +10992,7 @@ msgstr "" "ZÁRT LAKAT ikon azt jelzi, hogy a beállítások megegyeznek az aktuális " "opciócsoport rendszer- (vagy alapértelmezett) értékeivel" -#: src/slic3r/GUI/Tab.cpp:4351 +#: src/slic3r/GUI/Tab.cpp:4580 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " "equal to the system (or default) values for the current option group.\n" @@ -9421,13 +11005,13 @@ msgstr "" "Kattintson az aktuális opciócsoport összes beállításának visszaállításához a " "rendszer (vagy az alapértelmezett) értékre." -#: src/slic3r/GUI/Tab.cpp:4354 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" "A SZÜRKE PÖTTY ikon a rendszeren kívüli (vagy nem alapértelmezett) " "előbeállítást jelzi." -#: src/slic3r/GUI/Tab.cpp:4357 +#: src/slic3r/GUI/Tab.cpp:4586 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -9435,7 +11019,7 @@ msgstr "" "A SZÜRKE PÖTTY ikon azt jelzi, hogy a beállítások megegyeznek az aktuális " "opciócsoport utoljára mentett előbeállításával." -#: src/slic3r/GUI/Tab.cpp:4359 +#: src/slic3r/GUI/Tab.cpp:4588 msgid "" "BACK ARROW icon indicates that the settings were changed and are not equal " "to the last saved preset for the current option group.\n" @@ -9447,7 +11031,7 @@ msgstr "" "Kattintson az aktuális opciócsoport összes beállításának visszaállításához " "az utoljára mentett állapotra." -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4594 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." @@ -9455,7 +11039,7 @@ msgstr "" "ZÁRT LAKAT ikon azt jelzi, hogy az érték megegyezik a rendszer (vagy " "alapértelmezett) értékével." -#: src/slic3r/GUI/Tab.cpp:4366 +#: src/slic3r/GUI/Tab.cpp:4595 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -9466,7 +11050,7 @@ msgstr "" "Kattintson az aktuális érték visszaállításához a rendszer (vagy " "alapértelmezett) értékre." -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4601 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -9474,7 +11058,7 @@ msgstr "" "A SZÜRKE PÖTTY azt jelzi, hogy az érték megegyezik az utoljára mentett " "előbeállítással." -#: src/slic3r/GUI/Tab.cpp:4373 +#: src/slic3r/GUI/Tab.cpp:4602 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -9485,31 +11069,31 @@ msgstr "" "Kattintson az aktuális érték visszaállításához az utoljára mentett " "beállításra." -#: src/slic3r/GUI/Tab.cpp:4527 src/slic3r/GUI/Tab.cpp:4529 +#: src/slic3r/GUI/Tab.cpp:4764 src/slic3r/GUI/Tab.cpp:4766 msgid "Material" msgstr "Anyag" -#: src/slic3r/GUI/Tab.cpp:4614 src/slic3r/GUI/Tab.cpp:4615 +#: src/slic3r/GUI/Tab.cpp:4851 src/slic3r/GUI/Tab.cpp:4852 msgid "Material printing profile" msgstr "Anyag nyomtatási profil" -#: src/slic3r/GUI/Tab.cpp:4667 +#: src/slic3r/GUI/Tab.cpp:4901 msgid "Support head" msgstr "Támasztó fej" -#: src/slic3r/GUI/Tab.cpp:4672 +#: src/slic3r/GUI/Tab.cpp:4906 msgid "Support pillar" msgstr "Támasztó pillér" -#: src/slic3r/GUI/Tab.cpp:4695 +#: src/slic3r/GUI/Tab.cpp:4929 msgid "Connection of the support sticks and junctions" msgstr "A tartópálcák és a csomópontok csatlakoztatása" -#: src/slic3r/GUI/Tab.cpp:4700 +#: src/slic3r/GUI/Tab.cpp:4956 msgid "Automatic generation" msgstr "Automatikus generálás" -#: src/slic3r/GUI/Tab.cpp:4775 +#: src/slic3r/GUI/Tab.cpp:5024 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -9519,62 +11103,60 @@ msgstr "" "kategóriában. \n" "\"%1%\" engedélyezéséhez kapcsolja ki a \"%2%\"-ot." -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3724 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3497 msgid "Object elevation" msgstr "Objektum magassága" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3826 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3958 msgid "Pad around object" msgstr "Párna az objektum körül" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:153 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:162 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1047 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1100 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1115 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1130 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1145 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:147 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:156 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:165 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1107 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1122 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1137 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1152 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1197 msgid "Undef" msgstr "Nem definált" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:772 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:792 msgid "Unsaved Changes" msgstr "Nem Mentett Változások" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:790 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:810 msgid "Switching Presets: Unsaved Changes" msgstr "Előbeállítások Átváltása: Nem Mentett Módosítások" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:832 -msgid "Old Value" -msgstr "Régi Érték" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:858 +msgid "Original Value" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:859 +msgid "Modified Value" +msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:833 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:861 msgid "New Value" msgstr "Új Érték" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:867 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 msgid "Keep" msgstr "Megtartás" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1569 msgid "Transfer" msgstr "Átvitel" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 msgid "Don't save" msgstr "Ne mentse" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 -msgid "Discard" -msgstr "Elvetés" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:877 -msgid "Save" -msgstr "Mentés" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:898 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:926 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "create new project" @@ -9582,7 +11164,7 @@ msgstr "" "Az előbeállítások nem mentett módosításaira legközelebb nem kérdez rá a " "rendszer új projekt létrehozásakor" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:927 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "switch a preset" @@ -9590,7 +11172,7 @@ msgstr "" "Az előbeállítások nem mentett módosításaira legközelebb nem kérdez rá a " "rendszer előbeállítás váltáskor" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:900 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:928 msgid "" "You will not be asked about the unsaved changes in presets the next time " "you: \n" @@ -9602,11 +11184,11 @@ msgstr "" "- A PrusaSlicer bezárásakor, miközben egyes előbeállítások módosultak,\n" "- Új projekt betöltésekor, miközben egyes előbeállítások módosultak" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:903 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:931 msgid "PrusaSlicer will remember your action." msgstr "A PrusaSlicer emlékezni fog a műveletére." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:904 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:932 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" @@ -9616,60 +11198,60 @@ msgstr "" "lehetőséget.\n" "hogy újra rákérdezzen a nem mentett módosításokra." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:964 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1772 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" "Néhány mező túl hosszú ahhoz, hogy elférjen. A jobb egérgombbal történő " "kattintással a teljes szöveg megjelenik." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will not be saved" msgstr "A beállítások módosításai nem kerülnek mentésre" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will be discarded." msgstr "Minden beállítási változtatás elvetése." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:941 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:969 msgid "Save the selected options." msgstr "A kiválasztott beállítások mentése." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:942 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:970 msgid "Keep the selected settings." msgstr "A kiválasztott beállítások megtartása." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:943 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:971 msgid "Transfer the selected settings to the newly selected preset." msgstr "" "A kiválasztott beállítások átvitele az újonnan kijelölt előbeállításba." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:947 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:975 #, boost-format msgid "Save the selected options to preset \"%1%\"." msgstr "A kiválasztott beállítások mentése a \"%1%\" előbeállításba." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:948 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:976 #, boost-format msgid "Transfer the selected options to the newly selected preset \"%1%\"." msgstr "" "A kiválasztott beállítások átvitele az újonnan kijelölt \"%1%\" " "előbeállításba." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1224 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1237 msgid "The following preset was modified" msgid_plural "The following presets were modified" msgstr[0] "A következő előbeállítás módosult" msgstr[1] "A következő előbeállítások módosultak" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1230 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1243 #, boost-format msgid "Preset \"%1%\" has the following unsaved changes:" msgstr "" "A \"%1%\" előbeállítás a következő el nem mentett változásokat tartalmazza:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1234 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1247 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new printer profile and it has the " @@ -9678,7 +11260,7 @@ msgstr "" "A \"%1%\" előbeállítás nem kompatibilis az új nyomtatóprofillal, és a " "következő el nem mentett változtatásokat tartalmazza:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1235 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1248 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new print profile and it has the " @@ -9687,42 +11269,69 @@ msgstr "" "A \"%1%\" előbeállítás nem kompatibilis az új nyomtatási profillal, és a " "következő el nem mentett változtatásokat tartalmazza:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1297 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1850 msgid "Extruders count" msgstr "Extruderek száma" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 -msgid "Select presets to compare" -msgstr "Előbeállítások kiválasztása az összehasonlításhoz" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1326 +msgid "The preset modifications are successfully saved" +msgid_plural "The presets modifications are successfully saved" +msgstr[0] "Az előbeállítás módosításai sikeresen elmentésre kerültek" +msgstr[1] "Az előbeállítások módosításai sikeresen elmentésre kerültek" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1515 msgid "Show all presets (including incompatible)" msgstr "Minden előbeállítás megjelenítése (beleértve az inkompatibiliseket is)" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1533 +msgid "Select presets to compare" +msgstr "Előbeállítások kiválasztása az összehasonlításhoz" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1545 msgid "Left Preset Value" msgstr "Bal Előbeállítás Értéke" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1546 msgid "Right Preset Value" msgstr "Jobb Előbeállítás Értéke" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1595 +msgid "" +"Transfer the selected options from left preset to the right.\n" +"Note: New modified presets will be selected in settings tabs after close " +"this dialog." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1603 +msgid "Save the selected options from left preset to the right." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1621 +msgid "Transfer values from left to right" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1622 +msgid "" +"If enabled, this dialog can be used for transver selected values from left " +"to right preset." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1807 msgid "One of the presets doesn't found" msgstr "Az egyik előbeállítás nem található" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1818 msgid "Compared presets has different printer technology" msgstr "" "Az összehasonlított előbeállítások különböző nyomtatási technológiával " "rendelkeznek" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1832 msgid "Presets are the same" msgstr "Az előbeállítások megyegyeznek" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1840 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." @@ -9731,57 +11340,129 @@ msgstr "" "Erre a gombra kattintva ugyanazt az előbeállítást választhatja ki a jobb és " "a bal előbeállításhoz." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef category" msgstr "Nem definiált kategória" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef group" msgstr "Nem definiált csoport" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:2016 +msgid "Modified" +msgstr "Módosítva" + +#: src/slic3r/GUI/UpdateDialogs.cpp:41 msgid "Update available" msgstr "Frissítés elérhető" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UpdateDialogs.cpp:41 #, c-format, boost-format msgid "New version of %s is available" msgstr "A %s új verziója elérhető" -#: src/slic3r/GUI/UpdateDialogs.cpp:42 +#: src/slic3r/GUI/UpdateDialogs.cpp:46 src/slic3r/GUI/UpdateDialogs.cpp:101 msgid "Current version:" msgstr "Aktuális verzió:" -#: src/slic3r/GUI/UpdateDialogs.cpp:44 +#: src/slic3r/GUI/UpdateDialogs.cpp:48 src/slic3r/GUI/UpdateDialogs.cpp:103 +#: src/slic3r/GUI/UpdateDialogs.cpp:141 msgid "New version:" msgstr "Új verzió:" -#: src/slic3r/GUI/UpdateDialogs.cpp:52 +#: src/slic3r/GUI/UpdateDialogs.cpp:56 msgid "Changelog & Download" msgstr "Változáslista & Letöltés" -#: src/slic3r/GUI/UpdateDialogs.cpp:59 src/slic3r/GUI/UpdateDialogs.cpp:133 -#: src/slic3r/GUI/UpdateDialogs.cpp:191 +#: src/slic3r/GUI/UpdateDialogs.cpp:63 src/slic3r/GUI/UpdateDialogs.cpp:309 +#: src/slic3r/GUI/UpdateDialogs.cpp:367 msgid "Open changelog page" msgstr "Változáslista megnyitása" -#: src/slic3r/GUI/UpdateDialogs.cpp:65 +#: src/slic3r/GUI/UpdateDialogs.cpp:69 msgid "Open download page" msgstr "Letöltési oldal megnyitása" -#: src/slic3r/GUI/UpdateDialogs.cpp:72 +#: src/slic3r/GUI/UpdateDialogs.cpp:76 src/slic3r/GUI/UpdateDialogs.cpp:109 msgid "Don't notify about new releases any more" msgstr "Ne értesítsen többé az új megjelenésekről" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +msgid "App Update available" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +#, c-format, boost-format +msgid "" +"New version of %s is available.\n" +"Do you wish to download it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +msgid "App Update download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +#, c-format, boost-format +msgid "New version of %s is available." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:146 +msgid "Run installer after download. (Otherwise file explorer will be opened)" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:151 +msgid "Target directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:158 +msgid "Select directory" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:176 +msgid "Select directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:193 +msgid "Download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:204 +msgid "Directory path is empty." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:212 +msgid "Directory path is incorrect." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:217 +#, boost-format +msgid "Directory %1% doesn't exists. Do you wish to create it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:222 +msgid "Failed to create directory." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:229 +#, boost-format +msgid "File %1% already exists. Do you wish to overwrite it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +#, boost-format +msgid "Download path is %1%. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:270 msgid "Opening Configuration Wizard" msgstr "Konfigurációs Varázsló Megnyitása" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 src/slic3r/GUI/UpdateDialogs.cpp:261 +#: src/slic3r/GUI/UpdateDialogs.cpp:270 src/slic3r/GUI/UpdateDialogs.cpp:437 msgid "Configuration update" msgstr "Konfiguráció frissítés" -#: src/slic3r/GUI/UpdateDialogs.cpp:95 +#: src/slic3r/GUI/UpdateDialogs.cpp:271 msgid "" "PrusaSlicer is not using the newest configuration available.\n" "Configuration Wizard may not offer the latest printers, filaments and SLA " @@ -9791,11 +11472,11 @@ msgstr "" "A Konfigurációs Varázsló nem biztos, hogy a legújabb nyomtatókat, " "filamenteket és SLA anyagokat kínálja fel a telepítéshez." -#: src/slic3r/GUI/UpdateDialogs.cpp:97 +#: src/slic3r/GUI/UpdateDialogs.cpp:273 msgid "Configuration update is available" msgstr "A konfiguráció frissítése elérhető" -#: src/slic3r/GUI/UpdateDialogs.cpp:100 +#: src/slic3r/GUI/UpdateDialogs.cpp:276 msgid "" "Would you like to install it?\n" "\n" @@ -9812,28 +11493,28 @@ msgstr "" "\n" "Frissített konfigurációs csomagok:" -#: src/slic3r/GUI/UpdateDialogs.cpp:121 src/slic3r/GUI/UpdateDialogs.cpp:181 +#: src/slic3r/GUI/UpdateDialogs.cpp:297 src/slic3r/GUI/UpdateDialogs.cpp:357 msgid "Comment:" msgstr "Komment:" -#: src/slic3r/GUI/UpdateDialogs.cpp:142 +#: src/slic3r/GUI/UpdateDialogs.cpp:318 msgid "Install" msgstr "Telepítés" -#: src/slic3r/GUI/UpdateDialogs.cpp:144 +#: src/slic3r/GUI/UpdateDialogs.cpp:320 msgid "Don't install" msgstr "Ne telepítse" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 src/slic3r/GUI/UpdateDialogs.cpp:212 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 src/slic3r/GUI/UpdateDialogs.cpp:388 #, c-format, boost-format msgid "%s incompatibility" msgstr "%s inkompatibilis" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 msgid "You must install a configuration update." msgstr "Telepítenie kell egy konfigurációs frissítést." -#: src/slic3r/GUI/UpdateDialogs.cpp:160 +#: src/slic3r/GUI/UpdateDialogs.cpp:336 #, c-format, boost-format msgid "" "%s will now start updates. Otherwise it won't be able to start.\n" @@ -9852,17 +11533,12 @@ msgstr "" "\n" "Frissített konfigurációs csomagok:" -#: src/slic3r/GUI/UpdateDialogs.cpp:200 src/slic3r/GUI/UpdateDialogs.cpp:247 -#, c-format, boost-format -msgid "Exit %s" -msgstr "Kilépés %s" - -#: src/slic3r/GUI/UpdateDialogs.cpp:213 +#: src/slic3r/GUI/UpdateDialogs.cpp:389 #, c-format, boost-format msgid "%s configuration is incompatible" msgstr "A %s konfiguráció nem kompatibilis" -#: src/slic3r/GUI/UpdateDialogs.cpp:216 +#: src/slic3r/GUI/UpdateDialogs.cpp:392 #, c-format, boost-format msgid "" "This version of %s is not compatible with currently installed configuration " @@ -9884,20 +11560,20 @@ msgstr "" "mentést a meglévő konfigurációról, mielőtt telepítené az ezzel a %s-szel " "kompatibilis fájlokat." -#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#: src/slic3r/GUI/UpdateDialogs.cpp:401 #, c-format, boost-format msgid "This %s version: %s" msgstr "Ez a %s verzió: %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:230 +#: src/slic3r/GUI/UpdateDialogs.cpp:406 msgid "Incompatible bundles:" msgstr "Nem kompatibilis csomagok:" -#: src/slic3r/GUI/UpdateDialogs.cpp:246 +#: src/slic3r/GUI/UpdateDialogs.cpp:422 msgid "Re-configure" msgstr "Újrakonfigurálás" -#: src/slic3r/GUI/UpdateDialogs.cpp:265 +#: src/slic3r/GUI/UpdateDialogs.cpp:441 #, c-format, boost-format msgid "" "%s now uses an updated configuration structure.\n" @@ -9926,28 +11602,37 @@ msgstr "" "engedélyezni kívánja-e az automatikus előbeállítás-frissítéseket, kérjük, " "folytassa a következő %s lépéseket." -#: src/slic3r/GUI/UpdateDialogs.cpp:282 +#: src/slic3r/GUI/UpdateDialogs.cpp:458 msgid "For more information please visit our wiki page:" msgstr "További információkért kérjük, látogasson el a wiki oldalunkra:" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 msgid "Configuration updates" msgstr "Konfigurációs frissítések" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 src/slic3r/GUI/UpdateDialogs.cpp:495 msgid "No updates available" msgstr "Nincs elérheő frissítés" -#: src/slic3r/GUI/UpdateDialogs.cpp:304 +#: src/slic3r/GUI/UpdateDialogs.cpp:480 #, c-format, boost-format msgid "%s has no configuration updates available." msgstr "A(z) %s nem rendelkezik elérhető konfigurációs frissítéssel." -#: src/slic3r/GUI/WipeTowerDialog.cpp:21 +#: src/slic3r/GUI/UpdateDialogs.cpp:495 +msgid "App update" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:500 +#, c-format, boost-format +msgid "%s has no version updates available." +msgstr "" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:23 msgid "Ramming customization" msgstr "Tömörítés testreszabása" -#: src/slic3r/GUI/WipeTowerDialog.cpp:54 +#: src/slic3r/GUI/WipeTowerDialog.cpp:56 msgid "" "Ramming denotes the rapid extrusion just before a tool change in a single-" "extruder MM printer. Its purpose is to properly shape the end of the " @@ -9970,27 +11655,27 @@ msgstr "" "Ez egy szakértői szintű beállítás, a helytelen beállítás elakadásokhoz, az " "extruder kerék filamentbe marásához stb. vezethet." -#: src/slic3r/GUI/WipeTowerDialog.cpp:114 +#: src/slic3r/GUI/WipeTowerDialog.cpp:116 msgid "Total ramming time" msgstr "Teljes tömörítési idő" -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 msgid "Total rammed volume" msgstr "Teljes tömörített térfogat" -#: src/slic3r/GUI/WipeTowerDialog.cpp:120 +#: src/slic3r/GUI/WipeTowerDialog.cpp:122 msgid "Ramming line width" msgstr "Tömörítési vonal szélessége" -#: src/slic3r/GUI/WipeTowerDialog.cpp:122 +#: src/slic3r/GUI/WipeTowerDialog.cpp:124 msgid "Ramming line spacing" msgstr "Tömörítési vonal térköze" -#: src/slic3r/GUI/WipeTowerDialog.cpp:173 +#: src/slic3r/GUI/WipeTowerDialog.cpp:175 msgid "Wipe tower - Purging volume adjustment" msgstr "Törlőtorony - Öblítési mennyiség beállítása" -#: src/slic3r/GUI/WipeTowerDialog.cpp:299 +#: src/slic3r/GUI/WipeTowerDialog.cpp:301 msgid "" "Here you can adjust required purging volume (mm³) for any given pair of " "tools." @@ -9998,23 +11683,23 @@ msgstr "" "Itt állíthatja be a szükséges öblítési térfogatot (mm³) bármely adott " "szerszámpárhoz." -#: src/slic3r/GUI/WipeTowerDialog.cpp:300 +#: src/slic3r/GUI/WipeTowerDialog.cpp:302 msgid "Extruder changed to" msgstr "Extruder cserélve" -#: src/slic3r/GUI/WipeTowerDialog.cpp:308 +#: src/slic3r/GUI/WipeTowerDialog.cpp:310 msgid "unloaded" msgstr "kiürítve_" -#: src/slic3r/GUI/WipeTowerDialog.cpp:309 +#: src/slic3r/GUI/WipeTowerDialog.cpp:311 msgid "loaded" msgstr "betöltve_" -#: src/slic3r/GUI/WipeTowerDialog.cpp:352 +#: src/slic3r/GUI/WipeTowerDialog.cpp:354 msgid "Tool #" msgstr "Szerszám #" -#: src/slic3r/GUI/WipeTowerDialog.cpp:361 +#: src/slic3r/GUI/WipeTowerDialog.cpp:363 msgid "" "Total purging volume is calculated by summing two values below, depending on " "which tools are loaded/unloaded." @@ -10022,15 +11707,15 @@ msgstr "" "A teljes öblítési térfogatot az alábbi két érték összegzésével kell " "kiszámítani, attól függően, hogy mely szerszámok vannak kiürítve/betöltve." -#: src/slic3r/GUI/WipeTowerDialog.cpp:362 +#: src/slic3r/GUI/WipeTowerDialog.cpp:364 msgid "Volume to purge (mm³) when the filament is being" msgstr "Tisztítandó térfogat (mm³), amikor a filament" -#: src/slic3r/GUI/WipeTowerDialog.cpp:376 +#: src/slic3r/GUI/WipeTowerDialog.cpp:378 msgid "From" msgstr "Erről" -#: src/slic3r/GUI/WipeTowerDialog.cpp:442 +#: src/slic3r/GUI/WipeTowerDialog.cpp:444 msgid "" "Switching to simple settings will discard changes done in the advanced " "mode!\n" @@ -10042,26 +11727,28 @@ msgstr "" "\n" "Akarja folytatni?" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show simplified settings" msgstr "Egyszerű beállítások megjelenítése" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show advanced settings" msgstr "Haladó beállítások megjelenítése" -#: src/slic3r/GUI/wxExtensions.cpp:644 +#: src/slic3r/GUI/wxExtensions.cpp:672 #, c-format, boost-format msgid "Switch to the %s mode" msgstr "Váltás %s módra" -#: src/slic3r/GUI/wxExtensions.cpp:645 +#: src/slic3r/GUI/wxExtensions.cpp:673 #, c-format, boost-format msgid "Current mode is %s" msgstr "Az aktuális mód %s" -#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:141 -#: src/slic3r/Utils/Repetier.cpp:69 +#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:206 +#: src/slic3r/Utils/OctoPrint.cpp:255 src/slic3r/Utils/OctoPrint.cpp:666 +#: src/slic3r/Utils/OctoPrint.cpp:824 src/slic3r/Utils/OctoPrint.cpp:897 +#: src/slic3r/Utils/Repetier.cpp:88 #, c-format, boost-format msgid "Mismatched type of print host: %s" msgstr "A nyomtató gazdagép típusa nem egyezik meg: %s" @@ -10181,73 +11868,100 @@ msgstr "" "Megjegyzés: 2.00.02 vagy újabb firmware-rel és aktivált feltöltési " "funkcióval rendelkező FlashAir szükséges." -#: src/slic3r/Utils/OctoPrint.cpp:164 +#: src/slic3r/Utils/OctoPrint.cpp:278 msgid "Connection to OctoPrint works correctly." msgstr "A kapcsolat az OctoPrinttel megfelelően működik." -#: src/slic3r/Utils/OctoPrint.cpp:170 +#: src/slic3r/Utils/OctoPrint.cpp:284 msgid "Could not connect to OctoPrint" msgstr "Nem sikerült csatlakozni az OctoPrinthez" -#: src/slic3r/Utils/OctoPrint.cpp:172 +#: src/slic3r/Utils/OctoPrint.cpp:286 msgid "Note: OctoPrint version at least 1.1.0 is required." msgstr "Megjegyzés: Az OctoPrint legalább 1.1.0-s verziója szükséges." -#: src/slic3r/Utils/OctoPrint.cpp:292 +#: src/slic3r/Utils/OctoPrint.cpp:528 msgid "Connection to Prusa SL1 / SL1S works correctly." msgstr "A kapcsolat a Prusa SL1 / SL1S-sel megfelelően működik." -#: src/slic3r/Utils/OctoPrint.cpp:298 +#: src/slic3r/Utils/OctoPrint.cpp:534 msgid "Could not connect to Prusa SLA" msgstr "Nem sikerült csatlakozni a Prusa SLA-hoz" -#: src/slic3r/Utils/OctoPrint.cpp:336 +#: src/slic3r/Utils/OctoPrint.cpp:573 msgid "Connection to PrusaLink works correctly." msgstr "A kapcsolat a PrusaLinkkel megfelelően működik." -#: src/slic3r/Utils/OctoPrint.cpp:342 +#: src/slic3r/Utils/OctoPrint.cpp:579 msgid "Could not connect to PrusaLink" msgstr "Nem sikerült csatlakozni a PrusaLinkhez" -#: src/slic3r/Utils/PresetUpdater.cpp:61 +#: src/slic3r/Utils/OctoPrint.cpp:776 +msgid "Storages found:" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "read only" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "no free space" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:781 +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%.%2%" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:64 #, boost-format msgid "Copying of file %1% to %2% failed: %3%" msgstr "A %1% fájl másolása %2%-ra nem sikerült: %3%" -#: src/slic3r/Utils/PresetUpdater.cpp:645 -#: src/slic3r/Utils/PresetUpdater.cpp:662 +#: src/slic3r/Utils/PresetUpdater.cpp:998 +#: src/slic3r/Utils/PresetUpdater.cpp:1015 msgid "Continue and install configuration updates?" msgstr "Folytassa és telepítse a konfigurációs frissítéseket?" -#: src/slic3r/Utils/PresetUpdater.cpp:777 +#: src/slic3r/Utils/PresetUpdater.cpp:1021 +msgid "Installing profiles" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1071 +#, boost-format +msgid "Downloading resources for %1%." +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1171 msgid "" -"Configuration Updates causes a lost of preset modification.\n" +"Configuration Update will cause the preset modification to be lost.\n" "So, check unsaved changes and save them if necessary." msgstr "" -"A Konfigurációs frissítések hatására az előre beállított módosítások " -"elvesznek. \n" -"Ezért ellenőrizze a nem mentett módosításokat, és szükség esetén mentse el " -"azokat." -#: src/slic3r/Utils/PresetUpdater.cpp:779 +#: src/slic3r/Utils/PresetUpdater.cpp:1173 msgid "Updating" msgstr "Frissítés" -#: src/slic3r/Utils/PresetUpdater.cpp:808 +#: src/slic3r/Utils/PresetUpdater.cpp:1202 #, c-format, boost-format msgid "requires min. %s and max. %s" msgstr "min. %s és max. %s szükséges" -#: src/slic3r/Utils/PresetUpdater.cpp:812 +#: src/slic3r/Utils/PresetUpdater.cpp:1206 #, c-format, boost-format msgid "requires min. %s" msgstr "min. %s szükséges" -#: src/slic3r/Utils/PresetUpdater.cpp:815 +#: src/slic3r/Utils/PresetUpdater.cpp:1209 #, c-format, boost-format msgid "requires max. %s" msgstr "max. %s szükséges" +#: src/slic3r/Utils/PresetUpdater.cpp:1362 +#, boost-format +msgid "Couldn't locate idx file %1% when performing updates." +msgstr "" + #: src/slic3r/Utils/Http.cpp:73 msgid "" "Could not detect system SSL certificate store. PrusaSlicer will be unable to " @@ -10280,23 +11994,23 @@ msgstr "" "A CURL inicializálása nem sikerült. A PrusaSlicer nem tud hálózati " "kapcsolatot létrehozni. További részletekért lásd a naplókat." -#: src/slic3r/Utils/Process.cpp:157 +#: src/slic3r/Utils/Process.cpp:164 msgid "Open G-code file:" msgstr "G-kód fájl megnyitása:" -#: src/slic3r/Utils/Repetier.cpp:84 +#: src/slic3r/Utils/Repetier.cpp:103 msgid "Connection to Repetier works correctly." msgstr "A kapcsolat az Repetierrel megfelelően működik." -#: src/slic3r/Utils/Repetier.cpp:90 +#: src/slic3r/Utils/Repetier.cpp:109 msgid "Could not connect to Repetier" msgstr "Nem sikerült csatlakozni az Repetierhez" -#: src/slic3r/Utils/Repetier.cpp:92 +#: src/slic3r/Utils/Repetier.cpp:111 msgid "Note: Repetier version at least 0.90.0 is required." msgstr "Megjegyzés: A Repetier legalább 0.90.0-s verziója szükséges." -#: src/slic3r/Utils/Repetier.cpp:246 +#: src/slic3r/Utils/Repetier.cpp:263 #, boost-format msgid "" "HTTP status: %1%\n" @@ -10305,7 +12019,7 @@ msgstr "" "HTTP status: %1%\n" "Message body: \"%2%\"" -#: src/slic3r/Utils/Repetier.cpp:253 +#: src/slic3r/Utils/Repetier.cpp:270 #, boost-format msgid "" "Parsing of host response failed.\n" @@ -10316,7 +12030,7 @@ msgstr "" "Message body: \"%1%\" \n" "Message: \"%2%\"" -#: src/slic3r/Utils/Repetier.cpp:266 +#: src/slic3r/Utils/Repetier.cpp:283 #, boost-format msgid "" "Enumeration of host printers failed.\n" @@ -10350,26 +12064,26 @@ msgstr "Folytatás" msgid "Abort" msgstr "Megszakítás" -#: src/libslic3r/GCode.cpp:539 +#: src/libslic3r/GCode.cpp:490 msgid "There is an object with no extrusions in the first layer." msgstr "" "Van egy olyan objektum, amihez nem tartozik extrudálás az első rétegen." -#: src/libslic3r/GCode.cpp:570 +#: src/libslic3r/GCode.cpp:521 #, boost-format msgid "Empty layer between %1% and %2%." msgstr "Üres réteg %1% és %2% között." -#: src/libslic3r/GCode.cpp:573 +#: src/libslic3r/GCode.cpp:524 msgid "(Some lines not shown)" msgstr "(Néhány sor nem látható)" -#: src/libslic3r/GCode.cpp:575 +#: src/libslic3r/GCode.cpp:526 #, boost-format msgid "Object name: %1%" msgstr "Objektum név: %1%" -#: src/libslic3r/GCode.cpp:576 +#: src/libslic3r/GCode.cpp:527 msgid "" "Make sure the object is printable. This is usually caused by negligibly " "small extrusions or by a faulty model. Try to repair the model or change its " @@ -10379,30 +12093,30 @@ msgstr "" "elhanyagolhatóan kis extrudálások vagy hibás modell okozza. Próbálja meg " "kijavítani a modellt, vagy változtassa meg az tárgyasztalon való tájolását." -#: src/libslic3r/GCode.cpp:718 +#: src/libslic3r/GCode.cpp:669 msgid "Filament Start G-code" msgstr "Filament Kezdete G-kód" -#: src/libslic3r/GCode.cpp:725 +#: src/libslic3r/GCode.cpp:676 msgid "Filament End G-code" msgstr "Filament Vége G-kód" -#: src/libslic3r/GCode.cpp:764 +#: src/libslic3r/GCode.cpp:717 msgid "In the custom G-code were found reserved keywords:" msgstr "Az egyéni G-kódban foglalt kulcsszavak találhatók:" -#: src/libslic3r/GCode.cpp:766 +#: src/libslic3r/GCode.cpp:719 msgid "" "This may cause problems in g-code visualization and printing time estimation." msgstr "" "Ez problémákat okozhat a g-kód megjelenítésében és a nyomtatási idő " "becslésében." -#: src/libslic3r/GCode.cpp:1200 src/libslic3r/GCode.cpp:1211 +#: src/libslic3r/GCode.cpp:1124 src/libslic3r/GCode.cpp:1135 msgid "No extrusions were generated for objects." msgstr "Az objektumokhoz nem készültek extrudálások." -#: src/libslic3r/GCode.cpp:1406 +#: src/libslic3r/GCode.cpp:1328 msgid "" "Your print is very close to the priming regions. Make sure there is no " "collision." @@ -10410,10 +12124,6 @@ msgstr "" "A nyomtatás nagyon közel van az alapozó régiókhoz. Győződjön meg róla, hogy " "nincs ütközés." -#: src/libslic3r/ExtrusionEntity.cpp:344 src/libslic3r/ExtrusionEntity.cpp:380 -msgid "Mixed" -msgstr "Vegyes" - #: src/libslic3r/Flow.cpp:61 #, boost-format msgid "" @@ -10422,7 +12132,7 @@ msgstr "" "Nem lehet kiszámítani a %1% extrudálási szélességet: %2%\" változó nem " "elérhető." -#: src/libslic3r/Format/3mf.cpp:1735 +#: src/libslic3r/Format/3mf.cpp:1880 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " @@ -10431,7 +12141,7 @@ msgstr "" "A kiválasztott 3mf fájl a %1% egy újabb verziójával lett mentve, és nem " "kompatibilis." -#: src/libslic3r/Format/3mf.cpp:1746 +#: src/libslic3r/Format/3mf.cpp:1891 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." @@ -10439,7 +12149,7 @@ msgstr "" "A kiválasztott 3MF a PrusaSlicer újabb verziójával készült FDM támaszték " "festett objektumot tartalmaz, és nem kompatibilis." -#: src/libslic3r/Format/3mf.cpp:1750 +#: src/libslic3r/Format/3mf.cpp:1895 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." @@ -10447,7 +12157,7 @@ msgstr "" "A kiválasztott 3MF a PrusaSlicer egy újabb verziójával készült varrat " "festett objektumot tartalmaz, és nem kompatibilis." -#: src/libslic3r/Format/3mf.cpp:1754 +#: src/libslic3r/Format/3mf.cpp:1899 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -10455,7 +12165,7 @@ msgstr "" "A kiválasztott 3MF a PrusaSlicer újabb verziójával készült, több anyagos " "festett objektumot tartalmaz, és nem kompatibilis." -#: src/libslic3r/Format/AMF.cpp:993 +#: src/libslic3r/Format/AMF.cpp:1000 #, boost-format msgid "" "The selected amf file has been saved with a newer version of %1% and is not " @@ -10608,27 +12318,33 @@ msgstr "validáció sikertelen" msgid "write calledback failed" msgstr "írás calledback sikertelen" -#: src/libslic3r/Print.cpp:454 +#: src/libslic3r/Print.cpp:473 msgid "All objects are outside of the print volume." msgstr "Minden objektum a nyomtatási területen kívülre esik." -#: src/libslic3r/Print.cpp:457 +#: src/libslic3r/Print.cpp:476 msgid "The supplied settings will cause an empty print." msgstr "A megadott beállítások üres nyomtatáshoz vezetnek." -#: src/libslic3r/Print.cpp:461 +#: src/libslic3r/Print.cpp:480 msgid "Some objects are too close; your extruder will collide with them." msgstr "" "Néhány objektum túl közel van egymáshoz; az extruder ütközni fog velük." -#: src/libslic3r/Print.cpp:463 +#: src/libslic3r/Print.cpp:482 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." msgstr "" "Néhány objektum túl magas, ezért nem nyomtathatók ki az extruder ütközése " "nélkül." -#: src/libslic3r/Print.cpp:472 +#: src/libslic3r/Print.cpp:486 +msgid "" +"Avoid crossing perimeters option and avoid crossing curled overhangs option " +"cannot be both enabled together." +msgstr "" + +#: src/libslic3r/Print.cpp:495 msgid "" "Only a single object may be printed at a time in Spiral Vase mode. Either " "remove all but the last object, or enable sequential mode by " @@ -10638,7 +12354,7 @@ msgstr "" "távolítsa el az összes objektumot az utolsó kivételével, vagy engedélyezze a " "szekvenciális módot a „complete_objects” paraméterrel." -#: src/libslic3r/Print.cpp:476 +#: src/libslic3r/Print.cpp:499 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." @@ -10646,7 +12362,17 @@ msgstr "" "A Spirálváza opció csak egyféle anyagból álló objektum nyomtatásához " "használható." -#: src/libslic3r/Print.cpp:489 +#: src/libslic3r/Print.cpp:523 +msgid "" +"The print is taller than the maximum allowed height. You might want to " +"reduce the size of your model or change current print settings and retry." +msgstr "" + +#: src/libslic3r/Print.cpp:540 +msgid "Variable layer height is not supported with Organic supports." +msgstr "" + +#: src/libslic3r/Print.cpp:553 msgid "" "The wipe tower is only supported if all extruders have the same nozzle " "diameter and use filaments of the same diameter." @@ -10654,7 +12380,7 @@ msgstr "" "A törlőtorony csak akkor támogatott, ha minden extruder azonos " "fúvókaátmérővel rendelkezik és azonos átmérőjű filamentet használ." -#: src/libslic3r/Print.cpp:495 +#: src/libslic3r/Print.cpp:559 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, " "RepRapFirmware and Repetier G-code flavors." @@ -10662,7 +12388,7 @@ msgstr "" "A törlőtorony jelenleg csak a Marlin, a RepRap/Sprinter, a RepRapFirmware és " "a Repetier G-kód változatokhoz támogatott." -#: src/libslic3r/Print.cpp:497 +#: src/libslic3r/Print.cpp:561 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." @@ -10670,19 +12396,19 @@ msgstr "" "A törlőtorony jelenleg csak relatív extruder címzéssel " "(use_relative_e_distances=1) támogatott." -#: src/libslic3r/Print.cpp:499 -msgid "Ooze prevention is currently not supported with the wipe tower enabled." +#: src/libslic3r/Print.cpp:563 +msgid "" +"Ooze prevention is only supported with the wipe tower when " +"'single_extruder_multi_material' is off." msgstr "" -"A szivárgásmegelőzés jelenleg nem támogatott, ha a törlőtorony engedélyezve " -"van." -#: src/libslic3r/Print.cpp:501 +#: src/libslic3r/Print.cpp:565 msgid "" "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." msgstr "" "A törlőtorony jelenleg nem támogatja a volumetrikus E-t (use_volumetric_e=0)." -#: src/libslic3r/Print.cpp:503 +#: src/libslic3r/Print.cpp:567 msgid "" "The Wipe Tower is currently not supported for multimaterial sequential " "prints." @@ -10690,7 +12416,7 @@ msgstr "" "A törlőtorony jelenleg nem támogatott a több anyagos szekvenciális nyomatok " "esetében." -#: src/libslic3r/Print.cpp:524 +#: src/libslic3r/Print.cpp:577 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " "layer heights" @@ -10698,7 +12424,7 @@ msgstr "" "A törlőtorony csak akkor támogatott több objektum nyomtatásához, ha azok " "azonos rétegmagassággal rendelkeznek" -#: src/libslic3r/Print.cpp:526 +#: src/libslic3r/Print.cpp:579 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "over an equal number of raft layers" @@ -10706,7 +12432,7 @@ msgstr "" "A törlőtorony csak akkor támogatott több objektum nyomtatása esetén, ha azok " "azonos számú tutaj rétegre vannak nyomtatva" -#: src/libslic3r/Print.cpp:529 +#: src/libslic3r/Print.cpp:582 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "with the same support_material_contact_distance" @@ -10714,7 +12440,7 @@ msgstr "" "A törlőtorony csak akkor támogatott több objektum esetében, ha azok azonos " "support_material_contact_distance paraméterbeálltással vannak nyomtatva" -#: src/libslic3r/Print.cpp:531 +#: src/libslic3r/Print.cpp:584 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." @@ -10722,7 +12448,7 @@ msgstr "" "A törlőtorony csak akkor támogatott több objektum esetén, ha azok egyformán " "vannak felszeletelve." -#: src/libslic3r/Print.cpp:555 +#: src/libslic3r/Print.cpp:609 msgid "" "The Wipe tower is only supported if all objects have the same variable layer " "height" @@ -10730,27 +12456,27 @@ msgstr "" "A törlőtorony csak akkor támogatott, ha minden objektumnak ugyanaz a változó " "rétegmagassága" -#: src/libslic3r/Print.cpp:579 +#: src/libslic3r/Print.cpp:633 msgid "" "One or more object were assigned an extruder that the printer does not have." msgstr "" "Egy vagy több objektumhoz olyan extruder lett hozzárendelve, amely nincs a " "nyomtatóban." -#: src/libslic3r/Print.cpp:592 +#: src/libslic3r/Print.cpp:646 #, boost-format msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" msgstr "" "%1%=%2% mm túl alacsony ahhoz, hogy nyomtatható legyen %3% mm-es " "rétegmagasságnál" -#: src/libslic3r/Print.cpp:595 +#: src/libslic3r/Print.cpp:649 #, boost-format msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" msgstr "" "%1%=%2% mm túl sok ahhoz, hogy nyomtatható legyen %3% mm fúvókaátmérővel" -#: src/libslic3r/Print.cpp:606 +#: src/libslic3r/Print.cpp:660 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " @@ -10761,75 +12487,115 @@ msgstr "" "aktuális extruderrel kell nyomtatni (support_material_extruder == 0 vagy " "support_material_interface_extruder == 0), akkor minden fúvókának azonos " "átmérőjűnek kell lennie." - -#: src/libslic3r/Print.cpp:614 -msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers " -"need to be synchronized with the object layers." -msgstr "" -"Ahhoz, hogy a törlőtorony működjön az oldható támasztékokkal, a támasztó " -"rétegeket szinkronizálni kell az objektum rétegeivel." - -#: src/libslic3r/Print.cpp:618 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only if they are " -"printed with the current extruder without triggering a tool change. (both " -"support_material_extruder and support_material_interface_extruder need to be " -"set to 0)." + +#: src/libslic3r/Print.cpp:668 +msgid "" +"For the Wipe Tower to work with the soluble supports, the support layers " +"need to be synchronized with the object layers." msgstr "" -"A törlőtorony jelenleg csak akkor támogatja a nem oldható támasztékokat, ha " -"azok az aktuális extruderrel nyomtathatók szerszámváltás nélkül. (mind a " -"support_material_extruder, mind a support_material_interface_extruder " -"értékét 0-ra kell állítani)." +"Ahhoz, hogy a törlőtorony működjön az oldható támasztékokkal, a támasztó " +"rétegeket szinkronizálni kell az objektum rétegeivel." -#: src/libslic3r/Print.cpp:654 +#: src/libslic3r/Print.cpp:708 msgid "First layer height can't be greater than nozzle diameter" msgstr "Az első réteg magassága nem lehet nagyobb, mint a fúvóka átmérője" -#: src/libslic3r/Print.cpp:659 +#: src/libslic3r/Print.cpp:713 msgid "Layer height can't be greater than nozzle diameter" msgstr "A réteg magassága nem lehet nagyobb, mint a fúvóka átmérője" -#: src/libslic3r/Print.cpp:680 +#: src/libslic3r/Print.cpp:734 msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " "layer_gcode." msgstr "" -#: src/libslic3r/Print.cpp:682 +#: src/libslic3r/Print.cpp:736 msgid "" "\"G92 E0\" was found in before_layer_gcode, which is incompatible with " "absolute extruder addressing." msgstr "" -#: src/libslic3r/Print.cpp:684 +#: src/libslic3r/Print.cpp:738 msgid "" "\"G92 E0\" was found in layer_gcode, which is incompatible with absolute " "extruder addressing." msgstr "" -#: src/libslic3r/Print.cpp:826 +#: src/libslic3r/Print.cpp:880 msgid "Infilling layers" msgstr "Kitöltő rétegek" -#: src/libslic3r/Print.cpp:848 +#: src/libslic3r/Print.cpp:908 msgid "Generating skirt and brim" msgstr "Szoknya és karima generálása" -#: src/libslic3r/Print.cpp:896 +#: src/libslic3r/Print.cpp:956 msgid "Exporting G-code" msgstr "G-kód exportálása" -#: src/libslic3r/Print.cpp:900 +#: src/libslic3r/Print.cpp:960 msgid "Generating G-code" msgstr "G-kód generálása" +#: src/libslic3r/Print.cpp:1169 +msgid "Alert if supports needed" +msgstr "" + +#: src/libslic3r/Print.cpp:1174 +msgid "long bridging extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1175 +msgid "floating bridge anchors" +msgstr "" + +#: src/libslic3r/Print.cpp:1178 +msgid "collapsing overhang" +msgstr "" + +#: src/libslic3r/Print.cpp:1180 +msgid "loose extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1183 +msgid "low bed adhesion" +msgstr "" + +#: src/libslic3r/Print.cpp:1184 +msgid "floating object part" +msgstr "" + +#: src/libslic3r/Print.cpp:1185 +msgid "thin fragile section" +msgstr "" + +#: src/libslic3r/Print.cpp:1221 +msgid "Detected print stability issues" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "or" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "and" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "brim" +msgstr "" + +#: src/libslic3r/Print.cpp:1248 +msgid "Consider enabling supports" +msgstr "" + #: src/libslic3r/SLA/Pad.cpp:533 msgid "Pad brim size is too small for the current configuration." msgstr "A párna karimájának mérete túl kicsi a jelenlegi konfigurációhoz." -#: src/libslic3r/SLAPrint.cpp:628 +#: src/libslic3r/SLAPrint.cpp:546 msgid "" "Cannot proceed without support points! Add support points or disable support " "generation." @@ -10837,7 +12603,7 @@ msgstr "" "Támasztó pontok nélkül nem lehet továbblépni! Adjon hozzá támasztó pontokat, " "vagy tiltsa le a támasztógenerálást." -#: src/libslic3r/SLAPrint.cpp:640 +#: src/libslic3r/SLAPrint.cpp:558 msgid "" "Elevation is too low for object. Use the \"Pad around object\" feature to " "print the object without elevation." @@ -10845,7 +12611,7 @@ msgstr "" "Az objektum túl alacsonyan van. Használja a \"Párna az objektum körül\" " "funkciót a tárgy elemelés nélküli nyomtatásához." -#: src/libslic3r/SLAPrint.cpp:646 +#: src/libslic3r/SLAPrint.cpp:564 msgid "" "The endings of the support pillars will be deployed on the gap between the " "object and the pad. 'Support base safety distance' has to be greater than " @@ -10856,70 +12622,70 @@ msgstr "" "távolsága' paraméternek nagyobbnak kell lennie, mint a 'Párna objektum " "hézag' paraméternek." -#: src/libslic3r/SLAPrint.cpp:661 +#: src/libslic3r/SLAPrint.cpp:579 msgid "Exposition time is out of printer profile bounds." msgstr "Az expozíciós idő a nyomtató profiljának határain kívül esik." -#: src/libslic3r/SLAPrint.cpp:668 +#: src/libslic3r/SLAPrint.cpp:586 msgid "Initial exposition time is out of printer profile bounds." msgstr "A kezdeti expozíciós idő a nyomtató profiljának határain kívül esik." -#: src/libslic3r/SLAPrint.cpp:784 +#: src/libslic3r/SLAPrint.cpp:693 msgid "Slicing done" msgstr "Szeletelés kész" -#: src/libslic3r/SLAPrintSteps.cpp:47 +#: src/libslic3r/SLAPrintSteps.cpp:57 +msgid "Assembling model from parts" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:58 msgid "Hollowing model" msgstr "Modell üregesítése" -#: src/libslic3r/SLAPrintSteps.cpp:48 +#: src/libslic3r/SLAPrintSteps.cpp:59 msgid "Drilling holes into model." msgstr "Furatok készítése a modellbe." -#: src/libslic3r/SLAPrintSteps.cpp:49 +#: src/libslic3r/SLAPrintSteps.cpp:60 msgid "Slicing model" msgstr "Modell szeletelése" -#: src/libslic3r/SLAPrintSteps.cpp:50 src/libslic3r/SLAPrintSteps.cpp:639 +#: src/libslic3r/SLAPrintSteps.cpp:61 src/libslic3r/SLAPrintSteps.cpp:691 msgid "Generating support points" msgstr "Támasztó pontok generálása" -#: src/libslic3r/SLAPrintSteps.cpp:51 +#: src/libslic3r/SLAPrintSteps.cpp:62 msgid "Generating support tree" msgstr "Támasztó fa generálása" -#: src/libslic3r/SLAPrintSteps.cpp:52 +#: src/libslic3r/SLAPrintSteps.cpp:63 msgid "Generating pad" msgstr "Alátét generálása" -#: src/libslic3r/SLAPrintSteps.cpp:53 +#: src/libslic3r/SLAPrintSteps.cpp:64 msgid "Slicing supports" msgstr "Támasztók szeletelése" -#: src/libslic3r/SLAPrintSteps.cpp:68 +#: src/libslic3r/SLAPrintSteps.cpp:79 msgid "Merging slices and calculating statistics" msgstr "Szeletek összefűzése és statisztika kiszámítása" -#: src/libslic3r/SLAPrintSteps.cpp:69 +#: src/libslic3r/SLAPrintSteps.cpp:80 msgid "Rasterizing layers" msgstr "Rétegek raszterizálása" -#: src/libslic3r/SLAPrintSteps.cpp:435 -msgid "Too many overlapping holes." -msgstr "Túl sok átfedő furat." - -#: src/libslic3r/SLAPrintSteps.cpp:442 +#: src/libslic3r/SLAPrintSteps.cpp:255 msgid "" "Mesh to be hollowed is not suitable for hollowing (does not bound a volume)." msgstr "" "Az üregesítendő térháló nem alkalmas az üregesítésre (nem foglal magába " "térfogatot)." -#: src/libslic3r/SLAPrintSteps.cpp:450 +#: src/libslic3r/SLAPrintSteps.cpp:262 msgid "Unable to drill the current configuration of holes into the model." msgstr "Nem lehet a furatok jelenlegi konfigurációját a modellbe fúrni." -#: src/libslic3r/SLAPrintSteps.cpp:470 +#: src/libslic3r/SLAPrintSteps.cpp:271 msgid "" "Drilling holes into the mesh failed. This is usually caused by broken model. " "Try to fix it first." @@ -10927,28 +12693,35 @@ msgstr "" "A lyukak fúrása a hálóba nem sikerült. Ezt általában a sérült modell okozza. " "Először próbálja meg azt kijavítani." -#: src/libslic3r/SLAPrintSteps.cpp:476 +#: src/libslic3r/SLAPrintSteps.cpp:279 msgid "Failed to drill some holes into the model" msgstr "Néhány lyukat nem sikerült a modellbe fúrni" -#: src/libslic3r/SLAPrintSteps.cpp:520 +#: src/libslic3r/SLAPrintSteps.cpp:289 +msgid "" +"Can't perform full mesh booleans! Some parts of the print will be previewed " +"with approximated meshes. This does not affect the quality of slices or the " +"physical print in any way." +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:510 msgid "" "Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "" "A szeletelést belső hiba miatt le kellett állítani: Inkonzisztens szelet " "index." -#: src/libslic3r/SLAPrintSteps.cpp:691 src/libslic3r/SLAPrintSteps.cpp:700 -#: src/libslic3r/SLAPrintSteps.cpp:738 +#: src/libslic3r/SLAPrintSteps.cpp:740 src/libslic3r/SLAPrintSteps.cpp:749 +#: src/libslic3r/SLAPrintSteps.cpp:787 msgid "Visualizing supports" msgstr "Támasztékok vizualizálása" -#: src/libslic3r/SLAPrintSteps.cpp:730 +#: src/libslic3r/SLAPrintSteps.cpp:779 msgid "No pad can be generated for this model with the current configuration" msgstr "" "A jelenlegi konfigurációval nem lehet párnát generálni ehhez a modellhez" -#: src/libslic3r/SLAPrintSteps.cpp:854 +#: src/libslic3r/SLAPrintSteps.cpp:908 msgid "" "There are unprintable objects. Try to adjust support settings to make the " "objects printable." @@ -10962,27 +12735,27 @@ msgstr "" "A kimeneti fájl formátum (output_filename_format) sablon feldolgozása nem " "sikerült." -#: src/libslic3r/PrintConfig.cpp:236 src/libslic3r/PrintConfig.cpp:237 +#: src/libslic3r/PrintConfig.cpp:254 src/libslic3r/PrintConfig.cpp:255 msgid "Printer technology" msgstr "Nyomtató technológia" -#: src/libslic3r/PrintConfig.cpp:244 +#: src/libslic3r/PrintConfig.cpp:260 msgid "Bed shape" msgstr "A tárgyasztal formája" -#: src/libslic3r/PrintConfig.cpp:249 +#: src/libslic3r/PrintConfig.cpp:265 msgid "Bed custom texture" msgstr "Egyedi tárgyasztal textúra" -#: src/libslic3r/PrintConfig.cpp:254 +#: src/libslic3r/PrintConfig.cpp:270 msgid "Bed custom model" msgstr "Egyedi tárgyasztal modell" -#: src/libslic3r/PrintConfig.cpp:259 +#: src/libslic3r/PrintConfig.cpp:275 msgid "Elephant foot compensation" msgstr "Elefántláb kompenzáció" -#: src/libslic3r/PrintConfig.cpp:261 +#: src/libslic3r/PrintConfig.cpp:277 msgid "" "The first layer will be shrunk in the XY plane by the configured value to " "compensate for the 1st layer squish aka an Elephant Foot effect." @@ -10990,11 +12763,11 @@ msgstr "" "Az első réteg a beállított értékkel zsugorításra kerül az XY síkban, hogy " "kompenzálja az 1. réteg összenyomódását, azaz az Elefántláb-effektust." -#: src/libslic3r/PrintConfig.cpp:269 +#: src/libslic3r/PrintConfig.cpp:285 msgid "G-code thumbnails" msgstr "G-kód miniatűrök" -#: src/libslic3r/PrintConfig.cpp:270 +#: src/libslic3r/PrintConfig.cpp:286 msgid "" "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " "following format: \"XxY, XxY, ...\"" @@ -11002,17 +12775,17 @@ msgstr "" "A képméreteket .gcode és .sl1 / .sl1s fájlokban kell tárolni, a következő " "formátumban: \"XxY, XxY, ...\"." -#: src/libslic3r/PrintConfig.cpp:276 +#: src/libslic3r/PrintConfig.cpp:292 msgid "Format of G-code thumbnails" msgstr "" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:293 msgid "" "Format of G-code thumbnails: PNG for best quality, JPG for smallest size, " "QOI for low memory firmware" msgstr "" -#: src/libslic3r/PrintConfig.cpp:288 +#: src/libslic3r/PrintConfig.cpp:301 msgid "" "This setting controls the height (and thus the total number) of the slices/" "layers. Thinner layers give better accuracy but take more time to print." @@ -11021,11 +12794,11 @@ msgstr "" "számát). A vékonyabb rétegek nagyobb pontosságot adnak, de több időt vesz " "igénybe a nyomtatás." -#: src/libslic3r/PrintConfig.cpp:295 +#: src/libslic3r/PrintConfig.cpp:308 msgid "Max print height" msgstr "Max nyomtatási magasság" -#: src/libslic3r/PrintConfig.cpp:296 +#: src/libslic3r/PrintConfig.cpp:309 msgid "" "Set this to the maximum height that can be reached by your extruder while " "printing." @@ -11033,11 +12806,11 @@ msgstr "" "Állítsa ezt a maximális magasságra, amelyet az extruder nyomtatás közben " "elérhet." -#: src/libslic3r/PrintConfig.cpp:304 +#: src/libslic3r/PrintConfig.cpp:317 msgid "Hostname, IP or URL" msgstr "Gazdanév, IP vagy URL" -#: src/libslic3r/PrintConfig.cpp:305 +#: src/libslic3r/PrintConfig.cpp:318 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the hostname, IP address or URL of the printer host instance. Print host " @@ -11052,11 +12825,11 @@ msgstr "" "érhető el a következő formátumban: https://username:password@your-octopi-" "address/" -#: src/libslic3r/PrintConfig.cpp:314 +#: src/libslic3r/PrintConfig.cpp:327 msgid "API Key / Password" msgstr "API kulcs / jelszó" -#: src/libslic3r/PrintConfig.cpp:315 +#: src/libslic3r/PrintConfig.cpp:328 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the API Key or the password required for authentication." @@ -11065,11 +12838,11 @@ msgstr "" "mezőnek tartalmaznia kell az API-kulcsot vagy a hitelesítéshez szükséges " "jelszót." -#: src/libslic3r/PrintConfig.cpp:323 +#: src/libslic3r/PrintConfig.cpp:336 msgid "Name of the printer" msgstr "Nyomtató neve" -#: src/libslic3r/PrintConfig.cpp:331 +#: src/libslic3r/PrintConfig.cpp:344 msgid "" "Custom CA certificate file can be specified for HTTPS OctoPrint connections, " "in crt/pem format. If left blank, the default OS CA certificate repository " @@ -11081,15 +12854,15 @@ msgstr "" "Ha üresen hagyja, akkor az operációs rendszer alapértelmezett " "hitelesítésszolgáltatói (CA) tanúsítványtárát használja." -#: src/libslic3r/PrintConfig.cpp:347 +#: src/libslic3r/PrintConfig.cpp:360 msgid "Password" msgstr "Jelszó" -#: src/libslic3r/PrintConfig.cpp:355 +#: src/libslic3r/PrintConfig.cpp:368 msgid "Ignore HTTPS certificate revocation checks" msgstr "Visszavont HTTPS tanúsítvány ellenőrzésének figyelmen kívül hagyása" -#: src/libslic3r/PrintConfig.cpp:356 +#: src/libslic3r/PrintConfig.cpp:369 msgid "" "Ignore HTTPS certificate revocation checks in case of missing or offline " "distribution points. One may want to enable this option for self signed " @@ -11099,31 +12872,43 @@ msgstr "" "vagy offline terjesztési pontok esetén. Ezt az opciót saját aláírású " "tanúsítványok esetén érdemes engedélyezni, ha a kapcsolat nem sikerül." -#: src/libslic3r/PrintConfig.cpp:363 +#: src/libslic3r/PrintConfig.cpp:376 msgid "Printer preset names" msgstr "Nyomtató előbeállítás nevek" -#: src/libslic3r/PrintConfig.cpp:364 +#: src/libslic3r/PrintConfig.cpp:377 msgid "Names of presets related to the physical printer" msgstr "A fizikai nyomtatóhoz tartozó előbeállítások nevei" -#: src/libslic3r/PrintConfig.cpp:369 +#: src/libslic3r/PrintConfig.cpp:382 msgid "Authorization Type" msgstr "Engedélyezés Típusa" -#: src/libslic3r/PrintConfig.cpp:374 +#: src/libslic3r/PrintConfig.cpp:385 msgid "API key" msgstr "API kulcs" -#: src/libslic3r/PrintConfig.cpp:375 +#: src/libslic3r/PrintConfig.cpp:386 msgid "HTTP digest" msgstr "HTTP azonosító" -#: src/libslic3r/PrintConfig.cpp:395 +#: src/libslic3r/PrintConfig.cpp:406 +msgid "Avoid crossing curled overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:407 +msgid "" +"Plan travel moves such that the extruder avoids areas where the filament may " +"be curled up. This is mostly happening on steeper rounded overhangs and may " +"cause a crash with the nozzle. This feature slows down both the print and " +"the G-code generation." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:414 msgid "Avoid crossing perimeters" msgstr "Kerülje el a kerületek keresztezését" -#: src/libslic3r/PrintConfig.cpp:396 +#: src/libslic3r/PrintConfig.cpp:415 msgid "" "Optimize travel moves in order to minimize the crossing of perimeters. This " "is mostly useful with Bowden extruders which suffer from oozing. This " @@ -11133,11 +12918,11 @@ msgstr "" "keresztezését. Ez főként a szivárgástól szenvedő Bowden extrudereknél " "hasznos. Ez a funkció lassítja a nyomtatást és a G-kód generálást." -#: src/libslic3r/PrintConfig.cpp:403 +#: src/libslic3r/PrintConfig.cpp:422 msgid "Avoid crossing perimeters - Max detour length" msgstr "Kerülje el a kerületek keresztezését - Max kerülőút hossza" -#: src/libslic3r/PrintConfig.cpp:405 +#: src/libslic3r/PrintConfig.cpp:424 msgid "" "The maximum detour length for avoid crossing perimeters. If the detour is " "longer than this value, avoid crossing perimeters is not applied for this " @@ -11150,15 +12935,15 @@ msgstr "" "megadható abszolút értékként vagy az adott útvonal százalékában (például " "50%)." -#: src/libslic3r/PrintConfig.cpp:408 +#: src/libslic3r/PrintConfig.cpp:427 msgid "mm or % (zero to disable)" msgstr "mm vagy % (nulla esetén letiltva)" -#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:2839 +#: src/libslic3r/PrintConfig.cpp:434 src/libslic3r/PrintConfig.cpp:2927 msgid "Other layers" msgstr "További rétegek" -#: src/libslic3r/PrintConfig.cpp:416 +#: src/libslic3r/PrintConfig.cpp:435 msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." @@ -11166,11 +12951,11 @@ msgstr "" "Tárgyasztal hőmérséklet az első réteg után. Ha ezt nullára állítja, akkor " "nem kerülnek a kimenetre a tárgyasztal hőmérsékletét szabályozó parancsok." -#: src/libslic3r/PrintConfig.cpp:419 +#: src/libslic3r/PrintConfig.cpp:438 msgid "Bed temperature" msgstr "Tárgyasztal hőmérséklet" -#: src/libslic3r/PrintConfig.cpp:426 +#: src/libslic3r/PrintConfig.cpp:445 msgid "" "This custom code is inserted at every layer change, right before the Z move. " "Note that you can use placeholder variables for all Slic3r settings as well " @@ -11180,11 +12965,11 @@ msgstr "" "beillesztésre. Vegye figyelembe, hogy helyőrző változókat is használhat az " "összes Slic3r-beállításhoz, valamint a [layer_num] és [layer_z] értékekhez." -#: src/libslic3r/PrintConfig.cpp:436 +#: src/libslic3r/PrintConfig.cpp:455 msgid "Between objects G-code" msgstr "G-kód Objektumok Között" -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:456 msgid "" "This code is inserted between objects when using sequential printing. By " "default extruder and bed temperature are reset using non-wait command; " @@ -11201,15 +12986,15 @@ msgstr "" "Slic3r-beállításhoz, így az \"M109 S[első_réteg_hőmérséklet]\" parancsot " "bárhova beírhatja." -#: src/libslic3r/PrintConfig.cpp:448 +#: src/libslic3r/PrintConfig.cpp:467 msgid "Number of solid layers to generate on bottom surfaces." msgstr "Az alsó felületeken létrehozandó szilárd rétegek száma." -#: src/libslic3r/PrintConfig.cpp:449 +#: src/libslic3r/PrintConfig.cpp:468 msgid "Bottom solid layers" msgstr "Alsó szilárd rétegek" -#: src/libslic3r/PrintConfig.cpp:457 +#: src/libslic3r/PrintConfig.cpp:476 msgid "" "The number of bottom solid layers is increased above bottom_solid_layers if " "necessary to satisfy minimum thickness of bottom shell." @@ -11217,15 +13002,15 @@ msgstr "" "Megnöveli az alsó szilárd rétegek számát a bottom_solid_layers fölé, ha " "szükséges az alsó héj minimális vastagságának teljesítéséhez." -#: src/libslic3r/PrintConfig.cpp:459 +#: src/libslic3r/PrintConfig.cpp:478 msgid "Minimum bottom shell thickness" msgstr "Minimális alsó héjvastagság" -#: src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:484 msgid "Bridge" msgstr "Híd" -#: src/libslic3r/PrintConfig.cpp:466 +#: src/libslic3r/PrintConfig.cpp:485 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." @@ -11233,21 +13018,21 @@ msgstr "" "Ez az a gyorsulás, amelyet a nyomtató a hidakhoz használ. A nulla " "beállításával kikapcsolhatja gyorsulásszabályozását a hidak esetén." -#: src/libslic3r/PrintConfig.cpp:468 src/libslic3r/PrintConfig.cpp:639 -#: src/libslic3r/PrintConfig.cpp:1192 src/libslic3r/PrintConfig.cpp:1201 -#: src/libslic3r/PrintConfig.cpp:1401 src/libslic3r/PrintConfig.cpp:1410 -#: src/libslic3r/PrintConfig.cpp:1419 src/libslic3r/PrintConfig.cpp:1713 -#: src/libslic3r/PrintConfig.cpp:1764 src/libslic3r/PrintConfig.cpp:1775 -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1983 -#: src/libslic3r/PrintConfig.cpp:1991 +#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:1252 src/libslic3r/PrintConfig.cpp:1261 +#: src/libslic3r/PrintConfig.cpp:1447 src/libslic3r/PrintConfig.cpp:1456 +#: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1750 +#: src/libslic3r/PrintConfig.cpp:1801 src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1822 src/libslic3r/PrintConfig.cpp:2013 +#: src/libslic3r/PrintConfig.cpp:2021 msgid "mm/s²" msgstr "mm/s²" -#: src/libslic3r/PrintConfig.cpp:474 +#: src/libslic3r/PrintConfig.cpp:493 msgid "Bridging angle" msgstr "Hídkészítési szög" -#: src/libslic3r/PrintConfig.cpp:476 +#: src/libslic3r/PrintConfig.cpp:495 msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for all " @@ -11257,35 +13042,30 @@ msgstr "" "automatikusan kiszámításra kerül. Ellenkező esetben a megadott szöget fogja " "használni az összes híd esetében. Nulla szög esetén 180°-ot használjon." -#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:1102 -#: src/libslic3r/PrintConfig.cpp:2282 src/libslic3r/PrintConfig.cpp:2292 -#: src/libslic3r/PrintConfig.cpp:2583 src/libslic3r/PrintConfig.cpp:2824 -#: src/libslic3r/PrintConfig.cpp:3041 src/libslic3r/PrintConfig.cpp:3144 -#: src/libslic3r/PrintConfig.cpp:3698 src/libslic3r/PrintConfig.cpp:3819 -msgid "°" -msgstr "°" - -#: src/libslic3r/PrintConfig.cpp:485 +#: src/libslic3r/PrintConfig.cpp:504 msgid "Bridges fan speed" msgstr "Híd ventilátor sebesség" -#: src/libslic3r/PrintConfig.cpp:486 +#: src/libslic3r/PrintConfig.cpp:505 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "Ez a ventilátorsebesség minden híd és túlnyúlás során érvényesül." -#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:1114 -#: src/libslic3r/PrintConfig.cpp:1601 src/libslic3r/PrintConfig.cpp:1793 -#: src/libslic3r/PrintConfig.cpp:1856 src/libslic3r/PrintConfig.cpp:2115 -#: src/libslic3r/PrintConfig.cpp:2174 src/libslic3r/PrintConfig.cpp:3323 -#: src/libslic3r/PrintConfig.cpp:3612 src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:596 +#: src/libslic3r/PrintConfig.cpp:605 src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:623 src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1893 src/libslic3r/PrintConfig.cpp:2145 +#: src/libslic3r/PrintConfig.cpp:2204 src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3369 src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3870 msgid "%" msgstr "%" -#: src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:513 msgid "Bridge flow ratio" msgstr "Híd áramlási arány" -#: src/libslic3r/PrintConfig.cpp:496 +#: src/libslic3r/PrintConfig.cpp:515 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -11297,33 +13077,91 @@ msgstr "" "megereszkedést, bár az alapbeállítások általában jók, és a hűtéssel is " "érdemes kísérletezni (ventilátorral), mielőtt ezen módosítana." -#: src/libslic3r/PrintConfig.cpp:506 +#: src/libslic3r/PrintConfig.cpp:525 msgid "Bridges" msgstr "Hidak" -#: src/libslic3r/PrintConfig.cpp:508 +#: src/libslic3r/PrintConfig.cpp:527 msgid "Speed for printing bridges." msgstr "A hidak nyomtatási sebessége." -#: src/libslic3r/PrintConfig.cpp:509 src/libslic3r/PrintConfig.cpp:920 -#: src/libslic3r/PrintConfig.cpp:928 src/libslic3r/PrintConfig.cpp:937 -#: src/libslic3r/PrintConfig.cpp:945 src/libslic3r/PrintConfig.cpp:972 -#: src/libslic3r/PrintConfig.cpp:991 src/libslic3r/PrintConfig.cpp:1329 -#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1620 -#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1730 -#: src/libslic3r/PrintConfig.cpp:1742 src/libslic3r/PrintConfig.cpp:1752 -#: src/libslic3r/PrintConfig.cpp:1815 src/libslic3r/PrintConfig.cpp:1874 -#: src/libslic3r/PrintConfig.cpp:2022 src/libslic3r/PrintConfig.cpp:2249 -#: src/libslic3r/PrintConfig.cpp:2258 src/libslic3r/PrintConfig.cpp:2789 -#: src/libslic3r/PrintConfig.cpp:2939 src/libslic3r/PrintConfig.cpp:2949 +#: src/libslic3r/PrintConfig.cpp:528 src/libslic3r/PrintConfig.cpp:1009 +#: src/libslic3r/PrintConfig.cpp:1017 src/libslic3r/PrintConfig.cpp:1026 +#: src/libslic3r/PrintConfig.cpp:1034 src/libslic3r/PrintConfig.cpp:1061 +#: src/libslic3r/PrintConfig.cpp:1080 src/libslic3r/PrintConfig.cpp:1386 +#: src/libslic3r/PrintConfig.cpp:1579 src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1733 src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1779 src/libslic3r/PrintConfig.cpp:1789 +#: src/libslic3r/PrintConfig.cpp:1852 src/libslic3r/PrintConfig.cpp:1911 +#: src/libslic3r/PrintConfig.cpp:2052 src/libslic3r/PrintConfig.cpp:2279 +#: src/libslic3r/PrintConfig.cpp:2288 src/libslic3r/PrintConfig.cpp:2810 +#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3037 msgid "mm/s" msgstr "mm/s" -#: src/libslic3r/PrintConfig.cpp:516 +#: src/libslic3r/PrintConfig.cpp:535 +msgid "Enable dynamic overhang speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:537 +msgid "This setting enables dynamic speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:541 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Speeds for overhang " +"sizes in between are calculated via linear interpolation. If set as " +"percentage, the speed is calculated over the external perimeter speed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:547 src/libslic3r/PrintConfig.cpp:594 +msgid "speed for 0% overlap (bridge)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:550 src/libslic3r/PrintConfig.cpp:559 +#: src/libslic3r/PrintConfig.cpp:568 src/libslic3r/PrintConfig.cpp:577 +#: src/libslic3r/PrintConfig.cpp:856 src/libslic3r/PrintConfig.cpp:1305 +#: src/libslic3r/PrintConfig.cpp:1316 src/libslic3r/PrintConfig.cpp:2387 +#: src/libslic3r/PrintConfig.cpp:2440 src/libslic3r/PrintConfig.cpp:2765 +#: src/libslic3r/PrintConfig.cpp:2997 +msgid "mm/s or %" +msgstr "mm/s vagy %" + +#: src/libslic3r/PrintConfig.cpp:556 src/libslic3r/PrintConfig.cpp:603 +msgid "speed for 25% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:612 +msgid "speed for 50% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:574 src/libslic3r/PrintConfig.cpp:621 +msgid "speed for 75% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:583 +msgid "Enable dynamic fan speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:584 +msgid "This setting enables dynamic fan speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:589 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Fan speeds for " +"overhang sizes in between are calculated via linear interpolation. " +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:630 msgid "Brim width" msgstr "Karima szélesség" -#: src/libslic3r/PrintConfig.cpp:518 +#: src/libslic3r/PrintConfig.cpp:632 msgid "" "The horizontal width of the brim that will be printed around each object on " "the first layer. When raft is used, no brim is generated (use " @@ -11333,11 +13171,11 @@ msgstr "" "köré nyomtatásra kerül. Tutaj használatakor a rendszer nem generál karimát. " "(használja a raft_first_layer_expansion-t)." -#: src/libslic3r/PrintConfig.cpp:527 +#: src/libslic3r/PrintConfig.cpp:641 msgid "Brim type" msgstr "Karima típus" -#: src/libslic3r/PrintConfig.cpp:529 +#: src/libslic3r/PrintConfig.cpp:643 msgid "" "The places where the brim will be printed around each object on the first " "layer." @@ -11345,27 +13183,27 @@ msgstr "" "Azok a helyek, ahol a karima az első réteg minden egyes objektuma köré " "kinyomtatásra kerül." -#: src/libslic3r/PrintConfig.cpp:535 +#: src/libslic3r/PrintConfig.cpp:645 msgid "No brim" msgstr "Nincs karima" -#: src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:646 msgid "Outer brim only" msgstr "Csak külső karima" -#: src/libslic3r/PrintConfig.cpp:537 +#: src/libslic3r/PrintConfig.cpp:647 msgid "Inner brim only" msgstr "Csak belső karima" -#: src/libslic3r/PrintConfig.cpp:538 +#: src/libslic3r/PrintConfig.cpp:648 msgid "Outer and inner brim" msgstr "Külső és belső karima" -#: src/libslic3r/PrintConfig.cpp:543 +#: src/libslic3r/PrintConfig.cpp:654 msgid "Brim separation gap" msgstr "Karima elválasztó hézag" -#: src/libslic3r/PrintConfig.cpp:545 +#: src/libslic3r/PrintConfig.cpp:656 msgid "" "Offset of brim from the printed object. The offset is applied after the " "elephant foot compensation." @@ -11373,33 +13211,19 @@ msgstr "" "A karima távolsága a nyomtatott objektumtól. Az az elefántláb-kompenzáció " "után kerül alkalmazásra." -#: src/libslic3r/PrintConfig.cpp:552 -msgid "Clip multi-part objects" -msgstr "Több részből álló objektumok vágása" - -#: src/libslic3r/PrintConfig.cpp:553 -msgid "" -"When printing multi-material objects, this settings will make Slic3r to clip " -"the overlapping object parts one by the other (2nd part will be clipped by " -"the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -msgstr "" -"Több anyagból készült objektumok nyomtatásakor ez a beállítás arra utasítja " -"a Slic3r-t, hogy az átfedő objektumrészeket egymás után vágja le (2. részbe " -"belevág az 1. rész, a 3. részbe belevág 1. és 2. rész, stb.)." - -#: src/libslic3r/PrintConfig.cpp:560 +#: src/libslic3r/PrintConfig.cpp:663 msgid "Colorprint height" msgstr "Színes nyomtatási magasság" -#: src/libslic3r/PrintConfig.cpp:561 +#: src/libslic3r/PrintConfig.cpp:664 msgid "Heights at which a filament change is to occur." msgstr "Magasságok, amelyeken filamenteket kell váltani." -#: src/libslic3r/PrintConfig.cpp:571 +#: src/libslic3r/PrintConfig.cpp:674 msgid "Compatible printers condition" msgstr "Nyomtató kompatibilitás feltétele" -#: src/libslic3r/PrintConfig.cpp:572 +#: src/libslic3r/PrintConfig.cpp:675 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " @@ -11409,11 +13233,11 @@ msgstr "" "használja. Ha ez a kifejezés igaz, akkor ez a profil kompatibilis az aktív " "nyomtatóprofillal." -#: src/libslic3r/PrintConfig.cpp:586 +#: src/libslic3r/PrintConfig.cpp:689 msgid "Compatible print profiles condition" msgstr "Nyomtatási profil kompatibilitás feltétle" -#: src/libslic3r/PrintConfig.cpp:587 +#: src/libslic3r/PrintConfig.cpp:690 msgid "" "A boolean expression using the configuration values of an active print " "profile. If this expression evaluates to true, this profile is considered " @@ -11423,11 +13247,11 @@ msgstr "" "használja. Ha ez a kifejezés igaz, akkor ez a profil kompatibilis az aktív " "nyomtatási profillal." -#: src/libslic3r/PrintConfig.cpp:604 +#: src/libslic3r/PrintConfig.cpp:707 msgid "Complete individual objects" msgstr "Egyedi objektumok befejezése" -#: src/libslic3r/PrintConfig.cpp:605 +#: src/libslic3r/PrintConfig.cpp:708 msgid "" "When printing multiple objects or copies, this feature will complete each " "object before moving onto next one (and starting it from its bottom layer). " @@ -11440,11 +13264,11 @@ msgstr "" "elkerülése érdekében. A Slic3r elvileg figyelmeztet és megakadályozza az " "extruder ütközéseket, de azért figyeljen." -#: src/libslic3r/PrintConfig.cpp:613 +#: src/libslic3r/PrintConfig.cpp:716 msgid "Enable auto cooling" msgstr "Automatikus hűtés engedélyezése" -#: src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:717 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." @@ -11453,25 +13277,25 @@ msgstr "" "sebességet és a ventilátor sebességét a rétegnyomtatási időnek megfelelően " "állítja be." -#: src/libslic3r/PrintConfig.cpp:619 +#: src/libslic3r/PrintConfig.cpp:722 msgid "Cooling tube position" msgstr "Hűtőcső helyzete" -#: src/libslic3r/PrintConfig.cpp:620 +#: src/libslic3r/PrintConfig.cpp:723 msgid "Distance of the center-point of the cooling tube from the extruder tip." msgstr "A hűtőcső középpontjának távolsága az extruder csúcsától." -#: src/libslic3r/PrintConfig.cpp:627 +#: src/libslic3r/PrintConfig.cpp:730 msgid "Cooling tube length" msgstr "Hűtőcső hossza" -#: src/libslic3r/PrintConfig.cpp:628 +#: src/libslic3r/PrintConfig.cpp:731 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "" "A hűtőcső hossza, ami limitálja a hűtéshez használható helyet annak a " "belsejében." -#: src/libslic3r/PrintConfig.cpp:636 +#: src/libslic3r/PrintConfig.cpp:739 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " @@ -11481,11 +13305,11 @@ msgstr "" "gyorsulási értékek használata után (perem/kitöltés). Állítsa nullára a " "gyorsulás visszaállításának letiltásához." -#: src/libslic3r/PrintConfig.cpp:645 +#: src/libslic3r/PrintConfig.cpp:748 msgid "Default filament profile" msgstr "Alapértelmezett filament profil" -#: src/libslic3r/PrintConfig.cpp:646 +#: src/libslic3r/PrintConfig.cpp:749 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " @@ -11494,12 +13318,12 @@ msgstr "" "Az aktuális nyomtatóprofilhoz tartozó alapértelmezett filament profil. Az " "aktuális nyomtatóprofil kiválasztásakor ez a filament profil aktiválódik." -#: src/libslic3r/PrintConfig.cpp:652 +#: src/libslic3r/PrintConfig.cpp:755 msgid "Default print profile" msgstr "Alapértelmezett nyomtatási profil" -#: src/libslic3r/PrintConfig.cpp:653 src/libslic3r/PrintConfig.cpp:3542 -#: src/libslic3r/PrintConfig.cpp:3553 +#: src/libslic3r/PrintConfig.cpp:756 src/libslic3r/PrintConfig.cpp:3819 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -11508,11 +13332,11 @@ msgstr "" "Az aktuális nyomtatóprofilhoz tartozó alapértelmezett nyomtatási profil. Az " "aktuális nyomtatóprofil kiválasztásakor ez a nyomtatási profil aktiválódik." -#: src/libslic3r/PrintConfig.cpp:659 +#: src/libslic3r/PrintConfig.cpp:762 msgid "Disable fan for the first" msgstr "Ventilátor letiltása az első" -#: src/libslic3r/PrintConfig.cpp:660 +#: src/libslic3r/PrintConfig.cpp:763 msgid "" "You can set this to a positive value to disable fan at all during the first " "layers, so that it does not make adhesion worse." @@ -11520,11 +13344,11 @@ msgstr "" "Beállíthatja egy pozitív értékre, hogy az első megadott számú rétegnél " "teljesen letiltsa a ventilátort, így az nem rontja a tapadást." -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:772 msgid "Don't support bridges" msgstr "Ne támassza a hidakat" -#: src/libslic3r/PrintConfig.cpp:671 +#: src/libslic3r/PrintConfig.cpp:774 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." @@ -11532,15 +13356,15 @@ msgstr "" "Kísérleti lehetőség a támasztékok létrehozásának megakadályozására az " "áthidalt területek alatt." -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:780 msgid "Distance between copies" msgstr "A példányok közötti távolság" -#: src/libslic3r/PrintConfig.cpp:678 +#: src/libslic3r/PrintConfig.cpp:781 msgid "Distance used for the auto-arrange feature of the plater." msgstr "A tárgyasztal automatikus feltöltési funkciójához használt távolság." -#: src/libslic3r/PrintConfig.cpp:686 +#: src/libslic3r/PrintConfig.cpp:789 msgid "" "This end procedure is inserted at the end of the output file. Note that you " "can use placeholder variables for all PrusaSlicer settings." @@ -11548,7 +13372,7 @@ msgstr "" "Ez a befejező eljárás a kimeneti fájl végére kerül. Vegye figyelembe, " "helyőrző változókat is használhat az összes PrusaSlicer beállításhoz." -#: src/libslic3r/PrintConfig.cpp:696 +#: src/libslic3r/PrintConfig.cpp:799 msgid "" "This end procedure is inserted at the end of the output file, before the " "printer end gcode (and before any toolchange from this filament in case of " @@ -11562,23 +13386,11 @@ msgstr "" "az összes Slic3r-beállításhoz. Ha több extruderrel rendelkezik, a g-kód " "feldolgozása az extruder sorrendjében történik." -#: src/libslic3r/PrintConfig.cpp:707 -msgid "Ensure vertical shell thickness" -msgstr "Függőleges héjvastagság biztosítása" - -#: src/libslic3r/PrintConfig.cpp:709 -msgid "" -"Add solid infill near sloping surfaces to guarantee the vertical shell " -"thickness (top+bottom solid layers)." -msgstr "" -"Adjon hozzá tömör kitöltést a ferde felületek közelében, hogy biztosítsa a " -"függőleges héjvastagságot (felső+alsó szilárd rétegek)." - -#: src/libslic3r/PrintConfig.cpp:715 +#: src/libslic3r/PrintConfig.cpp:810 msgid "Top fill pattern" msgstr "Felső kitöltés mintázata" -#: src/libslic3r/PrintConfig.cpp:717 +#: src/libslic3r/PrintConfig.cpp:812 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." @@ -11586,45 +13398,45 @@ msgstr "" "Kitöltési minta a felső kitöltéshez. Ez csak az felső külső látható réteget " "érinti, a szomszédos tömör héjakat nem." -#: src/libslic3r/PrintConfig.cpp:728 src/libslic3r/PrintConfig.cpp:1169 -#: src/libslic3r/PrintConfig.cpp:2754 src/libslic3r/PrintConfig.cpp:2771 +#: src/libslic3r/PrintConfig.cpp:815 src/libslic3r/PrintConfig.cpp:1228 +#: src/libslic3r/PrintConfig.cpp:2776 src/libslic3r/PrintConfig.cpp:2791 msgid "Rectilinear" msgstr "Egyenesvonalú" -#: src/libslic3r/PrintConfig.cpp:729 +#: src/libslic3r/PrintConfig.cpp:816 msgid "Monotonic" msgstr "Monotonikus" -#: src/libslic3r/PrintConfig.cpp:730 +#: src/libslic3r/PrintConfig.cpp:817 msgid "Monotonic Lines" msgstr "" -#: src/libslic3r/PrintConfig.cpp:731 src/libslic3r/PrintConfig.cpp:1170 +#: src/libslic3r/PrintConfig.cpp:818 src/libslic3r/PrintConfig.cpp:1229 msgid "Aligned Rectilinear" msgstr "Igazított Egyenes" -#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:1176 -#: src/libslic3r/PrintConfig.cpp:2772 +#: src/libslic3r/PrintConfig.cpp:819 src/libslic3r/PrintConfig.cpp:1235 +#: src/libslic3r/PrintConfig.cpp:2792 msgid "Concentric" msgstr "Koncentrikus" -#: src/libslic3r/PrintConfig.cpp:733 src/libslic3r/PrintConfig.cpp:1180 +#: src/libslic3r/PrintConfig.cpp:820 src/libslic3r/PrintConfig.cpp:1239 msgid "Hilbert Curve" msgstr "Hilbert-görbe" -#: src/libslic3r/PrintConfig.cpp:734 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:821 src/libslic3r/PrintConfig.cpp:1240 msgid "Archimedean Chords" msgstr "Archimédészi" -#: src/libslic3r/PrintConfig.cpp:735 src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:822 src/libslic3r/PrintConfig.cpp:1241 msgid "Octagram Spiral" msgstr "Octagram Spirál" -#: src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:830 msgid "Bottom fill pattern" msgstr "Alsó kitöltés mintázata" -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:832 msgid "" "Fill pattern for bottom infill. This only affects the bottom external " "visible layer, and not its adjacent solid shells." @@ -11632,12 +13444,12 @@ msgstr "" "Kitöltési minta az alsó kitöltéshez. Ez csak az alsó külső látható réteget " "érinti, a szomszédos tömör héjakat nem." -#: src/libslic3r/PrintConfig.cpp:753 src/libslic3r/PrintConfig.cpp:765 -#: src/libslic3r/PrintConfig.cpp:1988 +#: src/libslic3r/PrintConfig.cpp:839 src/libslic3r/PrintConfig.cpp:851 +#: src/libslic3r/PrintConfig.cpp:2018 msgid "External perimeters" msgstr "Külső kerületek" -#: src/libslic3r/PrintConfig.cpp:755 +#: src/libslic3r/PrintConfig.cpp:841 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " "perimeters. If left zero, default extrusion width will be used if set, " @@ -11652,18 +13464,18 @@ msgstr "" "százalékban van megadva (például 200%), akkor a rétegmagasságra lesz " "kiszámítva." -#: src/libslic3r/PrintConfig.cpp:758 src/libslic3r/PrintConfig.cpp:869 -#: src/libslic3r/PrintConfig.cpp:1223 src/libslic3r/PrintConfig.cpp:1445 -#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1529 -#: src/libslic3r/PrintConfig.cpp:2011 src/libslic3r/PrintConfig.cpp:2397 -#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2660 -#: src/libslic3r/PrintConfig.cpp:2895 src/libslic3r/PrintConfig.cpp:3117 -#: src/libslic3r/PrintConfig.cpp:3132 src/libslic3r/PrintConfig.cpp:3166 -#: src/libslic3r/PrintConfig.cpp:3178 +#: src/libslic3r/PrintConfig.cpp:844 src/libslic3r/PrintConfig.cpp:958 +#: src/libslic3r/PrintConfig.cpp:1283 src/libslic3r/PrintConfig.cpp:1491 +#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1570 +#: src/libslic3r/PrintConfig.cpp:2041 src/libslic3r/PrintConfig.cpp:2428 +#: src/libslic3r/PrintConfig.cpp:2601 src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2983 src/libslic3r/PrintConfig.cpp:3204 +#: src/libslic3r/PrintConfig.cpp:3219 src/libslic3r/PrintConfig.cpp:3253 +#: src/libslic3r/PrintConfig.cpp:3265 msgid "mm or %" msgstr "mm vagy %" -#: src/libslic3r/PrintConfig.cpp:767 +#: src/libslic3r/PrintConfig.cpp:853 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " @@ -11674,18 +13486,11 @@ msgstr "" "sebesség beállítás alapján kerül kiszámításra. Állítsa nullára az " "automatikus beállításhoz." -#: src/libslic3r/PrintConfig.cpp:770 src/libslic3r/PrintConfig.cpp:1245 -#: src/libslic3r/PrintConfig.cpp:1256 src/libslic3r/PrintConfig.cpp:2356 -#: src/libslic3r/PrintConfig.cpp:2409 src/libslic3r/PrintConfig.cpp:2740 -#: src/libslic3r/PrintConfig.cpp:2909 -msgid "mm/s or %" -msgstr "mm/s vagy %" - -#: src/libslic3r/PrintConfig.cpp:777 +#: src/libslic3r/PrintConfig.cpp:863 msgid "External perimeters first" msgstr "Külső kerületek először" -#: src/libslic3r/PrintConfig.cpp:779 +#: src/libslic3r/PrintConfig.cpp:865 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." @@ -11693,11 +13498,12 @@ msgstr "" "A kerületeket a legkülsőtől a legbelsőig nyomtatja az alapértelmezett " "fordított sorrend helyett." -#: src/libslic3r/PrintConfig.cpp:785 +#: src/libslic3r/PrintConfig.cpp:871 msgid "Extra perimeters if needed" msgstr "Extra kerületek szükség esetén" -#: src/libslic3r/PrintConfig.cpp:787 +#: src/libslic3r/PrintConfig.cpp:873 +#, fuzzy, c-format, boost-format msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " "keeps adding perimeters, until more than 70% of the loop immediately above " @@ -11707,7 +13513,18 @@ msgstr "" "hézagosodását. A Slic3r addig ad hozzá további kerületeket, amíg a " "közvetlenül fölé kerülő hurok több mint 70%-át nem támogatja." -#: src/libslic3r/PrintConfig.cpp:797 +#: src/libslic3r/PrintConfig.cpp:880 +msgid "Extra perimeters on overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:882 +msgid "" +"Detect overhang areas where bridges cannot be anchored, and fill them with " +"extra perimeter paths. These paths are anchored to the nearby non-overhang " +"area when possible." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:890 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " @@ -11717,7 +13534,7 @@ msgstr "" "vannak megadva). Ez az érték felülbírálja a perem- és a kitöltő " "extrudereket, de a tartó extrudereket nem." -#: src/libslic3r/PrintConfig.cpp:809 +#: src/libslic3r/PrintConfig.cpp:898 msgid "" "Set this to the vertical distance between your nozzle tip and (usually) the " "X carriage rods. In other words, this is the height of the clearance " @@ -11729,7 +13546,7 @@ msgstr "" "magassága, és ez jelenti azt a maximális mélységet, amelyre az extruder még " "le tud süllyedni, mielőtt a már kinyomtatott objektumokkal ütközne." -#: src/libslic3r/PrintConfig.cpp:820 +#: src/libslic3r/PrintConfig.cpp:909 msgid "" "Set this to the clearance radius around your extruder. If the extruder is " "not centered, choose the largest value for safety. This setting is used to " @@ -11740,20 +13557,20 @@ msgstr "" "értéket. Ez a beállítás az ütközések ellenőrzésére és a tárgyasztal grafikus " "előnézetének megjelenítésére szolgál." -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:919 msgid "Extruder Color" msgstr "Extruder színe" -#: src/libslic3r/PrintConfig.cpp:831 src/libslic3r/PrintConfig.cpp:894 -#: src/libslic3r/PrintConfig.cpp:3394 +#: src/libslic3r/PrintConfig.cpp:920 src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:3666 msgid "This is only used in the Slic3r interface as a visual help." msgstr "Ezt csak a Slic3r felületén használjuk vizuális segítségként." -#: src/libslic3r/PrintConfig.cpp:837 +#: src/libslic3r/PrintConfig.cpp:926 msgid "Extruder offset" msgstr "Extruder offset" -#: src/libslic3r/PrintConfig.cpp:838 +#: src/libslic3r/PrintConfig.cpp:927 msgid "" "If your firmware doesn't handle the extruder displacement you need the G-" "code to take it into account. This option lets you specify the displacement " @@ -11765,11 +13582,11 @@ msgstr "" "egyes extruderek előzőhöz viszonyított helyzetét. Pozitív koordinátákat vár " "(ezek le lesznek vonva az XY koordinátából)." -#: src/libslic3r/PrintConfig.cpp:847 +#: src/libslic3r/PrintConfig.cpp:936 msgid "Extrusion axis" msgstr "Extrudáló tengely" -#: src/libslic3r/PrintConfig.cpp:848 +#: src/libslic3r/PrintConfig.cpp:937 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." @@ -11777,11 +13594,11 @@ msgstr "" "Ezzel az opcióval állíthatja be a nyomtató extruderéhez tartozó tengely " "betűjelét (általában E, de egyes nyomtatók A-t használnak)." -#: src/libslic3r/PrintConfig.cpp:853 +#: src/libslic3r/PrintConfig.cpp:942 msgid "Extrusion multiplier" msgstr "Extrudáló szorzó" -#: src/libslic3r/PrintConfig.cpp:854 +#: src/libslic3r/PrintConfig.cpp:943 msgid "" "This factor changes the amount of flow proportionally. You may need to tweak " "this setting to get nice surface finish and correct single wall widths. " @@ -11794,11 +13611,11 @@ msgstr "" "hogy ezt még jobban meg kell változtatnia, ellenőrizze a filament átmérőjét " "és a firmware E lépéseit." -#: src/libslic3r/PrintConfig.cpp:863 +#: src/libslic3r/PrintConfig.cpp:952 msgid "Default extrusion width" msgstr "Alapértelmezett extrudálási szélesség" -#: src/libslic3r/PrintConfig.cpp:865 +#: src/libslic3r/PrintConfig.cpp:954 msgid "" "Set this to a non-zero value to allow a manual extrusion width. If left to " "zero, Slic3r derives extrusion widths from the nozzle diameter (see the " @@ -11813,11 +13630,11 @@ msgstr "" "szélességére stb. vonatkozó eszköztippeket). Ha százalékban van megadva " "(például: 230%), akkor a rétegmagasságra lesz kiszámítva." -#: src/libslic3r/PrintConfig.cpp:877 +#: src/libslic3r/PrintConfig.cpp:966 msgid "Keep fan always on" msgstr "Tartsa mindig bekapcsolva a ventilátort" -#: src/libslic3r/PrintConfig.cpp:878 +#: src/libslic3r/PrintConfig.cpp:967 msgid "" "If this is enabled, fan will never be disabled and will be kept running at " "least at its minimum speed. Useful for PLA, harmful for ABS." @@ -11825,12 +13642,12 @@ msgstr "" "Ha ez engedélyezve van, a ventilátor soha nem lesz kikapcsolva, és legalább " "a minimális fordulatszámon fog működni. Hasznos PLA esetén, káros ABS esetén." -#: src/libslic3r/PrintConfig.cpp:883 +#: src/libslic3r/PrintConfig.cpp:972 msgid "Enable fan if layer print time is below" msgstr "" "Engedélyezze a ventilátort, ha a rétegnyomtatási idő a következő alatt van" -#: src/libslic3r/PrintConfig.cpp:884 +#: src/libslic3r/PrintConfig.cpp:973 msgid "" "If layer print time is estimated below this number of seconds, fan will be " "enabled and its speed will be calculated by interpolating the minimum and " @@ -11840,27 +13657,27 @@ msgstr "" "ventilátor bekapcsol, és a sebessége a minimális és maximális sebesség " "interpolálásával kerül meghatározásra." -#: src/libslic3r/PrintConfig.cpp:886 src/libslic3r/PrintConfig.cpp:2344 +#: src/libslic3r/PrintConfig.cpp:975 src/libslic3r/PrintConfig.cpp:2375 msgid "approximate seconds" msgstr "becsült másodperc" -#: src/libslic3r/PrintConfig.cpp:893 src/libslic3r/PrintConfig.cpp:3393 +#: src/libslic3r/PrintConfig.cpp:982 src/libslic3r/PrintConfig.cpp:3665 msgid "Color" msgstr "Szín" -#: src/libslic3r/PrintConfig.cpp:899 +#: src/libslic3r/PrintConfig.cpp:988 msgid "Filament notes" msgstr "Filament megjegyzések" -#: src/libslic3r/PrintConfig.cpp:900 +#: src/libslic3r/PrintConfig.cpp:989 msgid "You can put your notes regarding the filament here." msgstr "A filamenttel kapcsolatos jegyzeteit ide teheti." -#: src/libslic3r/PrintConfig.cpp:908 src/libslic3r/PrintConfig.cpp:1821 +#: src/libslic3r/PrintConfig.cpp:997 src/libslic3r/PrintConfig.cpp:1858 msgid "Max volumetric speed" msgstr "Max Térfogati sebesség" -#: src/libslic3r/PrintConfig.cpp:909 +#: src/libslic3r/PrintConfig.cpp:998 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " @@ -11870,27 +13687,27 @@ msgstr "" "maximális térfogati sebességét a nyomtatási-, és a filament térfogati " "sebességének minimumára korlátozza. Nulla értékre állítva nincs korlátozás." -#: src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:1007 msgid "Loading speed" msgstr "Betöltési sebesség" -#: src/libslic3r/PrintConfig.cpp:919 +#: src/libslic3r/PrintConfig.cpp:1008 msgid "Speed used for loading the filament on the wipe tower." msgstr "A filament törlőtoronyra való betöltéséhez használt sebesség." -#: src/libslic3r/PrintConfig.cpp:926 +#: src/libslic3r/PrintConfig.cpp:1015 msgid "Loading speed at the start" msgstr "Betöltési sebesség kezdéskor" -#: src/libslic3r/PrintConfig.cpp:927 +#: src/libslic3r/PrintConfig.cpp:1016 msgid "Speed used at the very beginning of loading phase." msgstr "A betöltési fázis legelején használt sebesség." -#: src/libslic3r/PrintConfig.cpp:934 +#: src/libslic3r/PrintConfig.cpp:1023 msgid "Unloading speed" msgstr "Kiürítési sebesség" -#: src/libslic3r/PrintConfig.cpp:935 +#: src/libslic3r/PrintConfig.cpp:1024 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." @@ -11898,20 +13715,20 @@ msgstr "" "A filament törlőtoronynál való kiürítéséhez használt sebesség (nem " "befolyásolja a kiürítés kezdeti részét közvetlenül a tömörítés után)." -#: src/libslic3r/PrintConfig.cpp:943 +#: src/libslic3r/PrintConfig.cpp:1032 msgid "Unloading speed at the start" msgstr "Kiürítési sebesség kezdéskor" -#: src/libslic3r/PrintConfig.cpp:944 +#: src/libslic3r/PrintConfig.cpp:1033 msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "A filament kiürítésének sebessége közvetlenül a tömörítés után." -#: src/libslic3r/PrintConfig.cpp:951 +#: src/libslic3r/PrintConfig.cpp:1040 msgid "Delay after unloading" msgstr "Várakozás a kiürítés után" -#: src/libslic3r/PrintConfig.cpp:952 +#: src/libslic3r/PrintConfig.cpp:1041 msgid "" "Time to wait after the filament is unloaded. May help to get reliable " "toolchanges with flexible materials that may need more time to shrink to " @@ -11921,11 +13738,11 @@ msgstr "" "szerszámcserét elérni rugalmas anyagok esetén, amelyeknek több időre lehet " "szükségük ahhoz, hogy az eredeti méretükre zsugorodjanak." -#: src/libslic3r/PrintConfig.cpp:961 +#: src/libslic3r/PrintConfig.cpp:1050 msgid "Number of cooling moves" msgstr "Hűtési lépések száma" -#: src/libslic3r/PrintConfig.cpp:962 +#: src/libslic3r/PrintConfig.cpp:1051 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " "Specify desired number of these moves." @@ -11933,19 +13750,19 @@ msgstr "" "A filament hűtése úgy történik, hogy oda-vissza mozgatják a hűtőcsőben. Adja " "meg a kívánt lépések számát." -#: src/libslic3r/PrintConfig.cpp:970 +#: src/libslic3r/PrintConfig.cpp:1059 msgid "Speed of the first cooling move" msgstr "Az első hűtési lépés sebessége" -#: src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:1060 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "A hűtési lépések fokozatosan felgyorsulnak ettől a sebességtől kezdve." -#: src/libslic3r/PrintConfig.cpp:978 +#: src/libslic3r/PrintConfig.cpp:1067 msgid "Minimal purge on wipe tower" msgstr "Minimális öblítés a törlőtornyon" -#: src/libslic3r/PrintConfig.cpp:979 +#: src/libslic3r/PrintConfig.cpp:1068 msgid "" "After a tool change, the exact position of the newly loaded filament inside " "the nozzle may not be known, and the filament pressure is likely not yet " @@ -11960,23 +13777,23 @@ msgstr "" "tölti, hogy ezután már megbízhatóan tudjon extrudálni kitöltések vagy " "áldozati tárgyak esetén." -#: src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:1072 msgid "mm³" msgstr "mm³" -#: src/libslic3r/PrintConfig.cpp:989 +#: src/libslic3r/PrintConfig.cpp:1078 msgid "Speed of the last cooling move" msgstr "Az utolsó hűtési lépés sebessége" -#: src/libslic3r/PrintConfig.cpp:990 +#: src/libslic3r/PrintConfig.cpp:1079 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "A hűtési lépések fokozatosan felgyorsulnak erre a sebességre." -#: src/libslic3r/PrintConfig.cpp:997 +#: src/libslic3r/PrintConfig.cpp:1086 msgid "Filament load time" msgstr "Filament betöltési idő" -#: src/libslic3r/PrintConfig.cpp:998 +#: src/libslic3r/PrintConfig.cpp:1087 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " "filament during a tool change (when executing the T code). This time is " @@ -11986,11 +13803,11 @@ msgstr "" "2.0) új filamentet tölt be a szerszámcsere során (a T kód végrehajtásakor). " "Ezt az időt a G-kód időbecslő hozzáadja a teljes nyomtatási időhöz." -#: src/libslic3r/PrintConfig.cpp:1005 +#: src/libslic3r/PrintConfig.cpp:1094 msgid "Ramming parameters" msgstr "Tömörítési paraméterek" -#: src/libslic3r/PrintConfig.cpp:1006 +#: src/libslic3r/PrintConfig.cpp:1095 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." @@ -11998,11 +13815,11 @@ msgstr "" "Ez a karakterlánc a TömörítésPárbeszéd ablakban szerkeszthető, és a " "tömörítéssel kapcsolatos paramétereket tartalmaz." -#: src/libslic3r/PrintConfig.cpp:1012 +#: src/libslic3r/PrintConfig.cpp:1101 msgid "Filament unload time" msgstr "Filament kiürítési idő" -#: src/libslic3r/PrintConfig.cpp:1013 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " "filament during a tool change (when executing the T code). This time is " @@ -12013,7 +13830,7 @@ msgstr "" "végrehajtásakor). Ezt az időt a G-kód időbecslő hozzáadja a teljes " "nyomtatási időhöz." -#: src/libslic3r/PrintConfig.cpp:1021 +#: src/libslic3r/PrintConfig.cpp:1110 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " @@ -12023,12 +13840,12 @@ msgstr "" "tolómérőt, és végezzen többszöri mérést az izzószál mentén, majd számítsa ki " "az átlagot." -#: src/libslic3r/PrintConfig.cpp:1028 src/libslic3r/PrintConfig.cpp:3432 -#: src/libslic3r/PrintConfig.cpp:3433 +#: src/libslic3r/PrintConfig.cpp:1117 src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3710 msgid "Density" msgstr "Sűrűség" -#: src/libslic3r/PrintConfig.cpp:1029 +#: src/libslic3r/PrintConfig.cpp:1118 msgid "" "Enter your filament density here. This is only for statistical information. " "A decent way is to weigh a known length of filament and compute the ratio of " @@ -12040,42 +13857,42 @@ msgstr "" "és a térfogat arányának kiszámítása. Még jobb, ha a térfogatot közvetlenül " "víz kiszorítással határozza meg." -#: src/libslic3r/PrintConfig.cpp:1032 +#: src/libslic3r/PrintConfig.cpp:1121 msgid "g/cm³" msgstr "g/cm³" -#: src/libslic3r/PrintConfig.cpp:1037 +#: src/libslic3r/PrintConfig.cpp:1126 msgid "Filament type" msgstr "Filament típus" -#: src/libslic3r/PrintConfig.cpp:1038 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "The filament material type for use in custom G-codes." msgstr "A filament típus egyedi G-kódokhoz használható." -#: src/libslic3r/PrintConfig.cpp:1066 +#: src/libslic3r/PrintConfig.cpp:1155 msgid "Soluble material" msgstr "Oldható anyag" -#: src/libslic3r/PrintConfig.cpp:1067 +#: src/libslic3r/PrintConfig.cpp:1156 msgid "Soluble material is most likely used for a soluble support." msgstr "Az oldható anyagot általában oldható hordozóként használják." -#: src/libslic3r/PrintConfig.cpp:1073 +#: src/libslic3r/PrintConfig.cpp:1162 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." msgstr "" "Ide írja be a filament kg-onkénti költségét. Ez csak statisztikai információ." -#: src/libslic3r/PrintConfig.cpp:1074 +#: src/libslic3r/PrintConfig.cpp:1163 msgid "money/kg" msgstr "pénz/kg" -#: src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1168 msgid "Spool weight" msgstr "A spulni súlya" -#: src/libslic3r/PrintConfig.cpp:1080 +#: src/libslic3r/PrintConfig.cpp:1169 msgid "" "Enter weight of the empty filament spool. One may weigh a partially consumed " "filament spool before printing and one may compare the measured weight with " @@ -12087,19 +13904,19 @@ msgstr "" "számított súllyal, hogy megtudja elegendő-e az spulnin lévő filament " "mennyisége a nyomtatás befejezéséhez." -#: src/libslic3r/PrintConfig.cpp:1084 +#: src/libslic3r/PrintConfig.cpp:1173 msgid "g" msgstr "g" -#: src/libslic3r/PrintConfig.cpp:1093 src/libslic3r/PrintConfig.cpp:3537 +#: src/libslic3r/PrintConfig.cpp:1182 src/libslic3r/PrintConfig.cpp:3814 msgid "(Unknown)" msgstr "(Ismeretlen)" -#: src/libslic3r/PrintConfig.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:1186 msgid "Fill angle" msgstr "Kitöltési szög" -#: src/libslic3r/PrintConfig.cpp:1099 +#: src/libslic3r/PrintConfig.cpp:1188 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " @@ -12109,63 +13926,63 @@ msgstr "" "alkalmazva. A hidak a Slic3r által meghatározott lehető legjobb irányban " "lesznek kitöltve, így ez a beállítás nem befolyásolja azokat." -#: src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1199 msgid "Fill density" msgstr "Kitöltés sűrűsége" -#: src/libslic3r/PrintConfig.cpp:1113 +#: src/libslic3r/PrintConfig.cpp:1201 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "A belső kitöltés sűrűsége, 0% és 100% között kifejezve." -#: src/libslic3r/PrintConfig.cpp:1148 +#: src/libslic3r/PrintConfig.cpp:1224 msgid "Fill pattern" msgstr "Kitöltés mintázata" -#: src/libslic3r/PrintConfig.cpp:1150 +#: src/libslic3r/PrintConfig.cpp:1226 msgid "Fill pattern for general low-density infill." msgstr "Kitöltés mintázata általános alacsony sűrűségű kitöltéshez." -#: src/libslic3r/PrintConfig.cpp:1171 src/libslic3r/PrintConfig.cpp:2803 +#: src/libslic3r/PrintConfig.cpp:1230 src/libslic3r/PrintConfig.cpp:2822 msgid "Grid" msgstr "Háló" -#: src/libslic3r/PrintConfig.cpp:1173 +#: src/libslic3r/PrintConfig.cpp:1232 msgid "Stars" msgstr "Csillagok" -#: src/libslic3r/PrintConfig.cpp:1174 +#: src/libslic3r/PrintConfig.cpp:1233 msgid "Cubic" msgstr "Kocka" -#: src/libslic3r/PrintConfig.cpp:1175 +#: src/libslic3r/PrintConfig.cpp:1234 msgid "Line" msgstr "Vonal" -#: src/libslic3r/PrintConfig.cpp:1177 src/libslic3r/PrintConfig.cpp:2756 +#: src/libslic3r/PrintConfig.cpp:1236 src/libslic3r/PrintConfig.cpp:2778 msgid "Honeycomb" msgstr "Méhsejt" -#: src/libslic3r/PrintConfig.cpp:1178 +#: src/libslic3r/PrintConfig.cpp:1237 msgid "3D Honeycomb" msgstr "3D Méhsejt" -#: src/libslic3r/PrintConfig.cpp:1179 +#: src/libslic3r/PrintConfig.cpp:1238 msgid "Gyroid" msgstr "Gyroid" -#: src/libslic3r/PrintConfig.cpp:1183 +#: src/libslic3r/PrintConfig.cpp:1242 msgid "Adaptive Cubic" msgstr "Adaptív Kocka" -#: src/libslic3r/PrintConfig.cpp:1184 +#: src/libslic3r/PrintConfig.cpp:1243 msgid "Support Cubic" msgstr "Támasztó Kocka" -#: src/libslic3r/PrintConfig.cpp:1185 +#: src/libslic3r/PrintConfig.cpp:1244 msgid "Lightning" msgstr "Villám" -#: src/libslic3r/PrintConfig.cpp:1190 +#: src/libslic3r/PrintConfig.cpp:1250 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." @@ -12173,11 +13990,11 @@ msgstr "" "Ez az a gyorsulás, amelyet a nyomtató az első réteghez használ. A nulla " "beállítással az első réteg gyorsulásszabályozása kikapcsolható." -#: src/libslic3r/PrintConfig.cpp:1198 +#: src/libslic3r/PrintConfig.cpp:1258 msgid "First object layer over raft interface" msgstr "Első objektum réteg a tutaj felett" -#: src/libslic3r/PrintConfig.cpp:1199 +#: src/libslic3r/PrintConfig.cpp:1259 msgid "" "This is the acceleration your printer will use for first layer of object " "above raft interface. Set zero to disable acceleration control for first " @@ -12187,11 +14004,11 @@ msgstr "" "rétegéhez használ. A nulla beállításával kikapcsolhatja a " "gyorsulásszabályozást a tutaj feletti objektum első rétegére." -#: src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "First layer bed temperature" msgstr "Tárgyasztal hőmérséklete az első rétegnél" -#: src/libslic3r/PrintConfig.cpp:1209 +#: src/libslic3r/PrintConfig.cpp:1269 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." @@ -12200,7 +14017,7 @@ msgstr "" "akkor nem kerülnek a kimenetre a tárgyasztal hőmérsékletét szabályozó " "parancsok." -#: src/libslic3r/PrintConfig.cpp:1219 +#: src/libslic3r/PrintConfig.cpp:1279 msgid "" "Set this to a non-zero value to set a manual extrusion width for first " "layer. You can use this to force fatter extrudates for better adhesion. If " @@ -12214,7 +14031,7 @@ msgstr "" "alapján kerül kiszámításra. Ha nullára van állítva, akkor az alapértelmezett " "extrudálási szélességet használja." -#: src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1293 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " @@ -12224,11 +14041,11 @@ msgstr "" "vastagabb alsó réteget nyomtatni, hogy javítsa a tapadást és a nem tökéletes " "építőlemezek toleranciáját." -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1301 msgid "First layer speed" msgstr "Sebesség az első rétegnél" -#: src/libslic3r/PrintConfig.cpp:1242 +#: src/libslic3r/PrintConfig.cpp:1302 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " @@ -12239,11 +14056,11 @@ msgstr "" "Ha százalékos értékként van megadva (például: 40%), akkor az alapértelmezett " "sebességeket skálázza." -#: src/libslic3r/PrintConfig.cpp:1252 +#: src/libslic3r/PrintConfig.cpp:1312 msgid "Speed of object first layer over raft interface" msgstr "A tárgy első rétegének sebessége a tutajfelületen" -#: src/libslic3r/PrintConfig.cpp:1253 +#: src/libslic3r/PrintConfig.cpp:1313 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first object layer above raft interface, regardless " @@ -12255,11 +14072,11 @@ msgstr "" "vonatkozik, függetlenül azok típusától. Ha százalékban van megadva (például: " "40%), akkor az alapértelmezett sebességeket skálázza." -#: src/libslic3r/PrintConfig.cpp:1263 +#: src/libslic3r/PrintConfig.cpp:1323 msgid "First layer nozzle temperature" msgstr "Fúvóka hőmérséklet első rétegnél" -#: src/libslic3r/PrintConfig.cpp:1264 +#: src/libslic3r/PrintConfig.cpp:1324 msgid "" "Nozzle temperature for the first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " @@ -12269,11 +14086,11 @@ msgstr "" "szabályozni a nyomtatás során, ha ezt nullára állítja, akkor a kimeneti G-" "kódban nem jelennek meg a hőmérsékletet szabályozási parancsok." -#: src/libslic3r/PrintConfig.cpp:1272 +#: src/libslic3r/PrintConfig.cpp:1332 msgid "Full fan speed at layer" msgstr "Teljes ventilátorsebesség a következő rétegnél" -#: src/libslic3r/PrintConfig.cpp:1273 +#: src/libslic3r/PrintConfig.cpp:1333 msgid "" "Fan speed will be ramped up linearly from zero at layer " "\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". " @@ -12288,23 +14105,23 @@ msgstr "" "\"disable_fan_fan_first_layers\" + 1 értéken a maximális megengedett " "sebességgel fog működni." -#: src/libslic3r/PrintConfig.cpp:1285 +#: src/libslic3r/PrintConfig.cpp:1345 msgid "Fuzzy skin type." msgstr "Fuzzy bőr típusa." -#: src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1348 msgid "Outside walls" msgstr "Külső fal" -#: src/libslic3r/PrintConfig.cpp:1293 +#: src/libslic3r/PrintConfig.cpp:1349 msgid "All walls" msgstr "Összes fal" -#: src/libslic3r/PrintConfig.cpp:1298 +#: src/libslic3r/PrintConfig.cpp:1355 msgid "Fuzzy skin thickness" msgstr "Fuzzy bőr vastagság" -#: src/libslic3r/PrintConfig.cpp:1300 +#: src/libslic3r/PrintConfig.cpp:1357 msgid "" "The maximum distance that each skin point can be offset (both ways), " "measured perpendicular to the perimeter wall." @@ -12312,11 +14129,11 @@ msgstr "" "Az egyes bőrpontok maximális eltolási távolsága (mindkét irányban), a " "kerületi falra merőlegesen." -#: src/libslic3r/PrintConfig.cpp:1308 +#: src/libslic3r/PrintConfig.cpp:1365 msgid "Fuzzy skin point distance" msgstr "Fuzzy bőr pont távolság" -#: src/libslic3r/PrintConfig.cpp:1310 +#: src/libslic3r/PrintConfig.cpp:1367 msgid "" "Perimeters will be split into multiple segments by inserting Fuzzy skin " "points. Lowering the Fuzzy skin point distance will increase the number of " @@ -12326,11 +14143,11 @@ msgstr "" "Fuzzy bőr pontok távolságának csökkentése növeli a véletlenszerűen eltolt " "pontok számát a kerületi falon." -#: src/libslic3r/PrintConfig.cpp:1318 +#: src/libslic3r/PrintConfig.cpp:1375 msgid "Fill gaps" msgstr "Hézagok feltöltése" -#: src/libslic3r/PrintConfig.cpp:1320 +#: src/libslic3r/PrintConfig.cpp:1377 msgid "" "Enables filling of gaps between perimeters and between the inner most " "perimeters and infill." @@ -12338,7 +14155,11 @@ msgstr "" "Lehetővé teszi a kerületek közötti, valamint a legbelső kerületek és a " "kitöltés közötti hézagok kitöltését." -#: src/libslic3r/PrintConfig.cpp:1327 +#: src/libslic3r/PrintConfig.cpp:1382 +msgid "Gap fill" +msgstr "Hézag kitöltés" + +#: src/libslic3r/PrintConfig.cpp:1384 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " @@ -12349,11 +14170,11 @@ msgstr "" "rázkódást és rezonanciaproblémákat. A hézagkitöltés kikapcsolásához állítsa " "nullára." -#: src/libslic3r/PrintConfig.cpp:1335 +#: src/libslic3r/PrintConfig.cpp:1392 msgid "Verbose G-code" msgstr "Bővebb G-kód" -#: src/libslic3r/PrintConfig.cpp:1336 +#: src/libslic3r/PrintConfig.cpp:1393 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " @@ -12364,11 +14185,11 @@ msgstr "" "nyomtat, a fájl nagyobb mérete miatt a nyomtató vezérlő szoftvere " "lelassulhat." -#: src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1400 msgid "G-code flavor" msgstr "G-kód változat" -#: src/libslic3r/PrintConfig.cpp:1344 +#: src/libslic3r/PrintConfig.cpp:1401 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " @@ -12381,15 +14202,15 @@ msgstr "" "megakadályozza, hogy a PrusaSlicer egyáltalán bármilyen extrudálási értéket " "exportáljon." -#: src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1416 msgid "No extrusion" msgstr "Nincs extrudálás" -#: src/libslic3r/PrintConfig.cpp:1376 +#: src/libslic3r/PrintConfig.cpp:1422 msgid "Label objects" msgstr "Objektumok címkézése" -#: src/libslic3r/PrintConfig.cpp:1377 +#: src/libslic3r/PrintConfig.cpp:1423 msgid "" "Enable this to add comments into the G-Code labeling print moves with what " "object they belong to, which is useful for the Octoprint CancelObject " @@ -12402,19 +14223,19 @@ msgstr "" "Egyetlen Extruder Többféle Anyag beállítással és a Wipe into Object / Wipe " "into Infill beállítással." -#: src/libslic3r/PrintConfig.cpp:1384 +#: src/libslic3r/PrintConfig.cpp:1430 msgid "G-code substitutions" msgstr "G-kód helyettesítések" -#: src/libslic3r/PrintConfig.cpp:1385 +#: src/libslic3r/PrintConfig.cpp:1431 msgid "Find / replace patterns in G-code lines and substitute them." msgstr "A G-kód sorokban található mintázatok keresése/behelyettesítése." -#: src/libslic3r/PrintConfig.cpp:1390 +#: src/libslic3r/PrintConfig.cpp:1436 msgid "High extruder current on filament swap" msgstr "Magas extruderáram a szálcserénél" -#: src/libslic3r/PrintConfig.cpp:1391 +#: src/libslic3r/PrintConfig.cpp:1437 msgid "" "It may be beneficial to increase the extruder motor current during the " "filament exchange sequence to allow for rapid ramming feed rates and to " @@ -12424,7 +14245,7 @@ msgstr "" "elérhetővé tegye a tömörítéshez szükséges magas előtolási sebességet és az " "ellenállás leküzdését deformált hegyű filament betöltésekor." -#: src/libslic3r/PrintConfig.cpp:1399 +#: src/libslic3r/PrintConfig.cpp:1445 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." @@ -12432,23 +14253,33 @@ msgstr "" "Ez az a gyorsulás, amelyet a nyomtató a kitöltésekhez használ. Állítsa " "nullára a kitöltés gyorsulásszabályozás kikapcsolásához." -#: src/libslic3r/PrintConfig.cpp:1408 +#: src/libslic3r/PrintConfig.cpp:1453 src/libslic3r/PrintConfig.cpp:2423 +#: src/libslic3r/PrintConfig.cpp:2435 +msgid "Solid infill" +msgstr "Tömör kitöltés" + +#: src/libslic3r/PrintConfig.cpp:1454 msgid "" "This is the acceleration your printer will use for solid infill. Set zero to " "use the value for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:2977 +#: src/libslic3r/PrintConfig.cpp:2990 +msgid "Top solid infill" +msgstr "Felső tömör kitöltés" + +#: src/libslic3r/PrintConfig.cpp:1463 msgid "" "This is the acceleration your printer will use for top solid infill. Set " "zero to use the value for solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1426 +#: src/libslic3r/PrintConfig.cpp:1472 msgid "Combine infill every" msgstr "Vonja össze a kitöltést minden" -#: src/libslic3r/PrintConfig.cpp:1428 +#: src/libslic3r/PrintConfig.cpp:1474 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." @@ -12457,15 +14288,15 @@ msgstr "" "felgyorsítását a vastagabb kitöltési rétegek extrudálásával, miközben " "megőrzi a vékony kerületeket, így a pontosságot." -#: src/libslic3r/PrintConfig.cpp:1431 +#: src/libslic3r/PrintConfig.cpp:1477 msgid "Combine infill every n layers" msgstr "Vonja össze a kitöltést minden n rétegben" -#: src/libslic3r/PrintConfig.cpp:1437 +#: src/libslic3r/PrintConfig.cpp:1483 msgid "Length of the infill anchor" msgstr "A kitöltőhorgony hossza" -#: src/libslic3r/PrintConfig.cpp:1439 +#: src/libslic3r/PrintConfig.cpp:1485 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -12489,35 +14320,35 @@ msgstr "" "Ha ezt a paramétert nullára állítja, akkor a szabadon álló kitöltési vonalak " "kerületi szakaszokhoz való lehorgonyzását kikapcsolja." -#: src/libslic3r/PrintConfig.cpp:1455 +#: src/libslic3r/PrintConfig.cpp:1495 msgid "0 (no open anchors)" msgstr "0 (nincsenek nyitott horgonyok)" -#: src/libslic3r/PrintConfig.cpp:1456 src/libslic3r/PrintConfig.cpp:1479 +#: src/libslic3r/PrintConfig.cpp:1496 src/libslic3r/PrintConfig.cpp:1519 msgid "1 mm" msgstr "1 mm" -#: src/libslic3r/PrintConfig.cpp:1457 src/libslic3r/PrintConfig.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:1520 msgid "2 mm" msgstr "2 mm" -#: src/libslic3r/PrintConfig.cpp:1458 src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1498 src/libslic3r/PrintConfig.cpp:1521 msgid "5 mm" msgstr "5 mm" -#: src/libslic3r/PrintConfig.cpp:1459 src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1499 src/libslic3r/PrintConfig.cpp:1522 msgid "10 mm" msgstr "10 mm" -#: src/libslic3r/PrintConfig.cpp:1460 src/libslic3r/PrintConfig.cpp:1483 +#: src/libslic3r/PrintConfig.cpp:1500 src/libslic3r/PrintConfig.cpp:1523 msgid "1000 (unlimited)" msgstr "1000 (korlátlan)" -#: src/libslic3r/PrintConfig.cpp:1465 +#: src/libslic3r/PrintConfig.cpp:1506 msgid "Maximum length of the infill anchor" msgstr "A kitöltőhorgony maximális hossza" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1508 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -12538,19 +14369,19 @@ msgstr "" "korlátozódik, de nem lehet hosszabb, mint ez a paraméter.\n" "A lehorgonyzás kikapcsolásához állítsa ezt a paramétert nullára." -#: src/libslic3r/PrintConfig.cpp:1478 +#: src/libslic3r/PrintConfig.cpp:1518 msgid "0 (not anchored)" msgstr "0 (nem horgonyzott)" -#: src/libslic3r/PrintConfig.cpp:1488 +#: src/libslic3r/PrintConfig.cpp:1529 msgid "Infill extruder" msgstr "Kitöltés extruder" -#: src/libslic3r/PrintConfig.cpp:1490 +#: src/libslic3r/PrintConfig.cpp:1531 msgid "The extruder to use when printing infill." msgstr "A kitöltés nyomtatásához használt extruder." -#: src/libslic3r/PrintConfig.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:1539 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill. If " "left zero, default extrusion width will be used if set, otherwise 1.125 x " @@ -12566,11 +14397,11 @@ msgstr "" "felgyorsítsa a kitöltést és erősebbé tegye az alkatrészeket. Ha százalékban " "van megadva (például 90%), akkor a rétegmagasságra lesz kiszámítva." -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1550 msgid "Infill before perimeters" msgstr "Kitöltés a kerületek előtt" -#: src/libslic3r/PrintConfig.cpp:1510 +#: src/libslic3r/PrintConfig.cpp:1551 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." @@ -12578,11 +14409,11 @@ msgstr "" "Ez az opció felcseréli kerület és a kitöltés nyomtatási sorrendjét, így az " "utóbbi lesz az első." -#: src/libslic3r/PrintConfig.cpp:1515 +#: src/libslic3r/PrintConfig.cpp:1556 msgid "Only infill where needed" msgstr "Kitöltés csak ott, ahol szükséges" -#: src/libslic3r/PrintConfig.cpp:1517 +#: src/libslic3r/PrintConfig.cpp:1558 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " @@ -12592,11 +14423,11 @@ msgstr "" "területekre korlátozza (belső tartóanyagként fog működni). Ha engedélyezve " "van, a többszörös ellenőrzés miatt lassítja a G-kód generálását." -#: src/libslic3r/PrintConfig.cpp:1524 +#: src/libslic3r/PrintConfig.cpp:1565 msgid "Infill/perimeters overlap" msgstr "Kitöltés/kerület átfedés" -#: src/libslic3r/PrintConfig.cpp:1526 +#: src/libslic3r/PrintConfig.cpp:1567 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -12608,25 +14439,25 @@ msgstr "" "de a holtjáték hézagokat okozhat. Ha százalékban van megadva (példa: 15%), " "akkor a kerület extrudálási szélességére kerül kiszámításra." -#: src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "" "A belső kitöltés nyomtatási sebessége. Állítsa nullára az automatikus " "beállításhoz." -#: src/libslic3r/PrintConfig.cpp:1545 +#: src/libslic3r/PrintConfig.cpp:1586 msgid "Inherits profile" msgstr "Örököli a profilt" -#: src/libslic3r/PrintConfig.cpp:1546 +#: src/libslic3r/PrintConfig.cpp:1587 msgid "Name of the profile, from which this profile inherits." msgstr "A profilnak a neve, amelytől ez a profil örököl." -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1600 msgid "Interface shells" msgstr "Interfész héjak" -#: src/libslic3r/PrintConfig.cpp:1560 +#: src/libslic3r/PrintConfig.cpp:1601 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " @@ -12636,66 +14467,66 @@ msgstr "" "között. Hasznos több extruderrel történő áttetsző vagy feloldható anyagokkal " "való nyomtatáskor." -#: src/libslic3r/PrintConfig.cpp:1568 +#: src/libslic3r/PrintConfig.cpp:1609 msgid "Maximum width of a segmented region" msgstr "Szegmentált régió maximális szélessége" -#: src/libslic3r/PrintConfig.cpp:1569 +#: src/libslic3r/PrintConfig.cpp:1610 msgid "Maximum width of a segmented region. Zero disables this feature." msgstr "" "A szegmentált régió maximális szélessége. A nulla kikapcsolja ezt a funkciót." -#: src/libslic3r/PrintConfig.cpp:1570 src/libslic3r/PrintConfig.cpp:2189 -#: src/libslic3r/PrintConfig.cpp:2198 +#: src/libslic3r/PrintConfig.cpp:1611 src/libslic3r/PrintConfig.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2228 msgid "mm (zero to disable)" msgstr "mm (nulla a letiltáshoz)" -#: src/libslic3r/PrintConfig.cpp:1577 +#: src/libslic3r/PrintConfig.cpp:1618 msgid "Enable ironing" msgstr "Vasalás engedélyezése" -#: src/libslic3r/PrintConfig.cpp:1578 +#: src/libslic3r/PrintConfig.cpp:1619 msgid "" "Enable ironing of the top layers with the hot print head for smooth surface" msgstr "" "Lehetővé teszi a felső rétegek vasalását a forró nyomtatófejjel a sima " "felület érdekében" -#: src/libslic3r/PrintConfig.cpp:1584 src/libslic3r/PrintConfig.cpp:1586 +#: src/libslic3r/PrintConfig.cpp:1625 src/libslic3r/PrintConfig.cpp:1627 msgid "Ironing Type" msgstr "Vasalás típusa" -#: src/libslic3r/PrintConfig.cpp:1591 +#: src/libslic3r/PrintConfig.cpp:1629 msgid "All top surfaces" msgstr "Minden felső felület" -#: src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Topmost surface only" msgstr "Csak a legfelső felület" -#: src/libslic3r/PrintConfig.cpp:1593 +#: src/libslic3r/PrintConfig.cpp:1631 msgid "All solid surfaces" msgstr "Minden tömör felület" -#: src/libslic3r/PrintConfig.cpp:1598 +#: src/libslic3r/PrintConfig.cpp:1637 msgid "Flow rate" msgstr "Áramlási sebesség" -#: src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Percent of a flow rate relative to object's normal layer height." msgstr "" "Az áramlási sebesség százalékos aránya az objektum normál rétegmagasságához " "viszonyítva." -#: src/libslic3r/PrintConfig.cpp:1608 +#: src/libslic3r/PrintConfig.cpp:1647 msgid "Spacing between ironing passes" msgstr "Térköz a vasalási ismétlések között" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1649 msgid "Distance between ironing lines" msgstr "Távolság a vasalási vonalak között" -#: src/libslic3r/PrintConfig.cpp:1627 +#: src/libslic3r/PrintConfig.cpp:1666 msgid "" "This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can " @@ -12707,11 +14538,11 @@ msgstr "" "figyelembe, hogy helyőrző változókat is használhat az összes Slic3r-" "beállításhoz, valamint a [layer_num] és [layer_z] értékekhez." -#: src/libslic3r/PrintConfig.cpp:1638 +#: src/libslic3r/PrintConfig.cpp:1677 msgid "Supports remaining times" msgstr "Hátralévő idő támogatása" -#: src/libslic3r/PrintConfig.cpp:1639 +#: src/libslic3r/PrintConfig.cpp:1678 msgid "" "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " "intervals into the G-code to let the firmware show accurate remaining time. " @@ -12723,155 +14554,155 @@ msgstr "" "időt. Jelenleg csak a Prusa i3 MK3 firmware ismeri fel az M73-at. Az i3 MK3 " "firmware is támogatja az M73 Qxx Sxx Sxx-t a csendes módban." -#: src/libslic3r/PrintConfig.cpp:1647 +#: src/libslic3r/PrintConfig.cpp:1686 msgid "Supports stealth mode" msgstr "Lopakodó mód támogatása" -#: src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1687 msgid "The firmware supports stealth mode" msgstr "A firmware támogatja a lopakodó módot" -#: src/libslic3r/PrintConfig.cpp:1653 +#: src/libslic3r/PrintConfig.cpp:1692 msgid "How to apply limits" msgstr "Hogyan kell alkalmazni a korlátokat" -#: src/libslic3r/PrintConfig.cpp:1654 +#: src/libslic3r/PrintConfig.cpp:1693 msgid "Purpose of Machine Limits" msgstr "A gépi korlátok célja" -#: src/libslic3r/PrintConfig.cpp:1656 +#: src/libslic3r/PrintConfig.cpp:1695 msgid "How to apply the Machine Limits" msgstr "Hogyan kell alkalmazni a gépi korlátokat" -#: src/libslic3r/PrintConfig.cpp:1661 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "Emit to G-code" msgstr "Átvitel G-kódba" -#: src/libslic3r/PrintConfig.cpp:1662 +#: src/libslic3r/PrintConfig.cpp:1698 msgid "Use for time estimate" msgstr "Időbecsléshez használja" -#: src/libslic3r/PrintConfig.cpp:1663 +#: src/libslic3r/PrintConfig.cpp:1699 msgid "Ignore" msgstr "Figyelmen kívül hagy" -#: src/libslic3r/PrintConfig.cpp:1686 +#: src/libslic3r/PrintConfig.cpp:1723 msgid "Maximum feedrate X" msgstr "Maximum előtolási sebesség X" -#: src/libslic3r/PrintConfig.cpp:1687 +#: src/libslic3r/PrintConfig.cpp:1724 msgid "Maximum feedrate Y" msgstr "Maximum előtolási sebesség Y" -#: src/libslic3r/PrintConfig.cpp:1688 +#: src/libslic3r/PrintConfig.cpp:1725 msgid "Maximum feedrate Z" msgstr "Maximum előtolási sebesség Z" -#: src/libslic3r/PrintConfig.cpp:1689 +#: src/libslic3r/PrintConfig.cpp:1726 msgid "Maximum feedrate E" msgstr "Maximum előtolási sebesség E" -#: src/libslic3r/PrintConfig.cpp:1692 +#: src/libslic3r/PrintConfig.cpp:1729 msgid "Maximum feedrate of the X axis" msgstr "Maximum előtolási sebesség az X tengelyen" -#: src/libslic3r/PrintConfig.cpp:1693 +#: src/libslic3r/PrintConfig.cpp:1730 msgid "Maximum feedrate of the Y axis" msgstr "Maximum előtolási sebesség az Y tengelyen" -#: src/libslic3r/PrintConfig.cpp:1694 +#: src/libslic3r/PrintConfig.cpp:1731 msgid "Maximum feedrate of the Z axis" msgstr "Maximum előtolási sebesség az Z tengelyen" -#: src/libslic3r/PrintConfig.cpp:1695 +#: src/libslic3r/PrintConfig.cpp:1732 msgid "Maximum feedrate of the E axis" msgstr "Maximum előtolási sebesség az E tengelyen" -#: src/libslic3r/PrintConfig.cpp:1703 +#: src/libslic3r/PrintConfig.cpp:1740 msgid "Maximum acceleration X" msgstr "Maximum gyorsulás X" -#: src/libslic3r/PrintConfig.cpp:1704 +#: src/libslic3r/PrintConfig.cpp:1741 msgid "Maximum acceleration Y" msgstr "Maximum gyorsulás Y" -#: src/libslic3r/PrintConfig.cpp:1705 +#: src/libslic3r/PrintConfig.cpp:1742 msgid "Maximum acceleration Z" msgstr "Maximum gyorsulás Z" -#: src/libslic3r/PrintConfig.cpp:1706 +#: src/libslic3r/PrintConfig.cpp:1743 msgid "Maximum acceleration E" msgstr "Maximum gyorsulás E" -#: src/libslic3r/PrintConfig.cpp:1709 +#: src/libslic3r/PrintConfig.cpp:1746 msgid "Maximum acceleration of the X axis" msgstr "Maximum gyorsulás az X tengelyen" -#: src/libslic3r/PrintConfig.cpp:1710 +#: src/libslic3r/PrintConfig.cpp:1747 msgid "Maximum acceleration of the Y axis" msgstr "Maximum gyorsulás az Y tengelyen" -#: src/libslic3r/PrintConfig.cpp:1711 +#: src/libslic3r/PrintConfig.cpp:1748 msgid "Maximum acceleration of the Z axis" msgstr "Maximum gyorsulás az Z tengelyen" -#: src/libslic3r/PrintConfig.cpp:1712 +#: src/libslic3r/PrintConfig.cpp:1749 msgid "Maximum acceleration of the E axis" msgstr "Maximum gyorsulás az E tengelyen" -#: src/libslic3r/PrintConfig.cpp:1720 +#: src/libslic3r/PrintConfig.cpp:1757 msgid "Maximum jerk X" msgstr "Maximum rántás X" -#: src/libslic3r/PrintConfig.cpp:1721 +#: src/libslic3r/PrintConfig.cpp:1758 msgid "Maximum jerk Y" msgstr "Maximum rántás Y" -#: src/libslic3r/PrintConfig.cpp:1722 +#: src/libslic3r/PrintConfig.cpp:1759 msgid "Maximum jerk Z" msgstr "Maximum rántás Z" -#: src/libslic3r/PrintConfig.cpp:1723 +#: src/libslic3r/PrintConfig.cpp:1760 msgid "Maximum jerk E" msgstr "Maximum rántás E" -#: src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:1763 msgid "Maximum jerk of the X axis" msgstr "Maximum rántás az X tengelyen" -#: src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1764 msgid "Maximum jerk of the Y axis" msgstr "Maximum rántás az Y tengelyen" -#: src/libslic3r/PrintConfig.cpp:1728 +#: src/libslic3r/PrintConfig.cpp:1765 msgid "Maximum jerk of the Z axis" msgstr "Maximum rántás az Z tengelyen" -#: src/libslic3r/PrintConfig.cpp:1729 +#: src/libslic3r/PrintConfig.cpp:1766 msgid "Maximum jerk of the E axis" msgstr "Maximum rántás az E tengelyen" -#: src/libslic3r/PrintConfig.cpp:1739 +#: src/libslic3r/PrintConfig.cpp:1776 msgid "Minimum feedrate when extruding" msgstr "Minimum előtolási sebesség extrudáláskor" -#: src/libslic3r/PrintConfig.cpp:1741 +#: src/libslic3r/PrintConfig.cpp:1778 msgid "Minimum feedrate when extruding (M205 S)" msgstr "Minimum előtolási sebesség extrudáláskor (M205 S)" -#: src/libslic3r/PrintConfig.cpp:1749 +#: src/libslic3r/PrintConfig.cpp:1786 msgid "Minimum travel feedrate" msgstr "Minimum utazási előtolás" -#: src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:1788 msgid "Minimum travel feedrate (M205 T)" msgstr "Minimum utazási előtolás (M205 T)" -#: src/libslic3r/PrintConfig.cpp:1759 +#: src/libslic3r/PrintConfig.cpp:1796 msgid "Maximum acceleration when extruding" msgstr "Maximum gyorsulás extrudáláskor" -#: src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1798 msgid "" "Maximum acceleration when extruding (M204 P)\n" "\n" @@ -12882,31 +14713,32 @@ msgstr "" "\n" "A Marlin (régi) firmware ezt utazási gyorsulásként is használja (M204 T)." -#: src/libslic3r/PrintConfig.cpp:1772 +#: src/libslic3r/PrintConfig.cpp:1809 msgid "Maximum acceleration when retracting" msgstr "Maximum gyorsulás visszahúzáskor" -#: src/libslic3r/PrintConfig.cpp:1774 +#: src/libslic3r/PrintConfig.cpp:1811 msgid "Maximum acceleration when retracting (M204 R)" msgstr "Maximum gyorsulás visszahúzáskor (M204 R)" -#: src/libslic3r/PrintConfig.cpp:1782 +#: src/libslic3r/PrintConfig.cpp:1819 msgid "Maximum acceleration for travel moves" msgstr "Maximum gyorsulás utazási mozgásokhoz" -#: src/libslic3r/PrintConfig.cpp:1784 +#: src/libslic3r/PrintConfig.cpp:1821 msgid "Maximum acceleration for travel moves (M204 T)" msgstr "Maximum gyorsulás utazási mozgásokhoz (M204 T)" -#: src/libslic3r/PrintConfig.cpp:1791 src/libslic3r/PrintConfig.cpp:1800 +#: src/libslic3r/PrintConfig.cpp:1828 src/libslic3r/PrintConfig.cpp:1837 msgid "Max" msgstr "Max" -#: src/libslic3r/PrintConfig.cpp:1792 +#: src/libslic3r/PrintConfig.cpp:1829 msgid "This setting represents the maximum speed of your fan." msgstr "Ez a beállítás a ventilátor maximális sebességét jelzi." -#: src/libslic3r/PrintConfig.cpp:1801 +#: src/libslic3r/PrintConfig.cpp:1838 +#, fuzzy, c-format, boost-format msgid "" "This is the highest printable layer height for this extruder, used to cap " "the variable layer height and support layer height. Maximum recommended " @@ -12919,11 +14751,11 @@ msgstr "" "ésszerű rétegek közötti tapadás elérése érdekében. Ha 0-ra van állítva, a " "rétegmagasság a fúvóka átmérőjének 75%-ára korlátozódik." -#: src/libslic3r/PrintConfig.cpp:1811 +#: src/libslic3r/PrintConfig.cpp:1848 msgid "Max print speed" msgstr "Max nyomtatási sebesség" -#: src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1849 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " @@ -12934,7 +14766,7 @@ msgstr "" "érdekében. Ez a kísérleti beállítás a legnagyobb ön által megengedett " "nyomtatási sebesség beállítására szolgál." -#: src/libslic3r/PrintConfig.cpp:1822 +#: src/libslic3r/PrintConfig.cpp:1859 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." @@ -12942,11 +14774,11 @@ msgstr "" "Ez a kísérleti beállítás az extruder által támogatott maximális " "térfogatsebesség beállítására szolgál." -#: src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1867 msgid "Max volumetric slope positive" msgstr "Maximális térfogati meredekség pozitív" -#: src/libslic3r/PrintConfig.cpp:1831 +#: src/libslic3r/PrintConfig.cpp:1868 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from lower speed to higher speed. A value of 1.8 mm³/" @@ -12955,15 +14787,15 @@ msgid "" "(feedrate 60 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1836 src/libslic3r/PrintConfig.cpp:1848 +#: src/libslic3r/PrintConfig.cpp:1873 src/libslic3r/PrintConfig.cpp:1885 msgid "mm³/s²" msgstr "mm³/s²" -#: src/libslic3r/PrintConfig.cpp:1842 +#: src/libslic3r/PrintConfig.cpp:1879 msgid "Max volumetric slope negative" msgstr "Maximális térfogati meredekség negatív" -#: src/libslic3r/PrintConfig.cpp:1843 +#: src/libslic3r/PrintConfig.cpp:1880 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from higher speed to lower speed. A value of 1.8 mm³/" @@ -12972,18 +14804,18 @@ msgid "" "(feedrate 20 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1854 src/libslic3r/PrintConfig.cpp:1863 +#: src/libslic3r/PrintConfig.cpp:1891 src/libslic3r/PrintConfig.cpp:1900 msgid "Min" msgstr "Min" -#: src/libslic3r/PrintConfig.cpp:1855 +#: src/libslic3r/PrintConfig.cpp:1892 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "" "Ez a beállítás azt a minimális PWM-et (impulzusszélesség moduláció) jelenti, " "amelyre a ventilátornak szüksége van a működéshez. 30-35% alatt a legtöbb " "ventilátor nem indul el egyáltalán." -#: src/libslic3r/PrintConfig.cpp:1864 +#: src/libslic3r/PrintConfig.cpp:1901 msgid "" "This is the lowest printable layer height for this extruder and limits the " "resolution for variable layer height. Typical values are between 0.05 mm and " @@ -12993,19 +14825,19 @@ msgstr "" "változó rétegmagasság felbontását. A tipikus értékek 0,05 mm és 0,1 mm " "között vannak." -#: src/libslic3r/PrintConfig.cpp:1872 +#: src/libslic3r/PrintConfig.cpp:1909 msgid "Min print speed" msgstr "Min nyomtatási sebesség" -#: src/libslic3r/PrintConfig.cpp:1873 +#: src/libslic3r/PrintConfig.cpp:1910 msgid "Slic3r will not scale speed down below this speed." msgstr "A Slic3r nem csökkenti a sebességet ez alá." -#: src/libslic3r/PrintConfig.cpp:1880 +#: src/libslic3r/PrintConfig.cpp:1917 msgid "Minimal filament extrusion length" msgstr "Minimálisan elhasznált Filament" -#: src/libslic3r/PrintConfig.cpp:1881 +#: src/libslic3r/PrintConfig.cpp:1918 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " @@ -13016,11 +14848,11 @@ msgstr "" "kerüljön hozzá. Több Extruderrel működő gépek esetén ez a beállítás minden " "egyes Extruderre vonatkozik." -#: src/libslic3r/PrintConfig.cpp:1890 +#: src/libslic3r/PrintConfig.cpp:1927 msgid "Configuration notes" msgstr "Konfiguráció megjegyzések" -#: src/libslic3r/PrintConfig.cpp:1891 +#: src/libslic3r/PrintConfig.cpp:1928 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." @@ -13028,16 +14860,16 @@ msgstr "" "Itt elhelyezheti személyes jegyzeteit. Ez a szöveg hozzá lesz fűzve a G-kód " "fejlécének megjegyzéseihez." -#: src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:1938 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "Ez az extruder fúvókájának átmérője (például: 0,5, 0,35 stb.)" -#: src/libslic3r/PrintConfig.cpp:1906 +#: src/libslic3r/PrintConfig.cpp:1943 msgid "Host Type" msgstr "Gazda Típus" -#: src/libslic3r/PrintConfig.cpp:1907 +#: src/libslic3r/PrintConfig.cpp:1944 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." @@ -13045,11 +14877,11 @@ msgstr "" "A Slic3r képes G-kód fájlokat feltölteni egy nyomtató-gazdára. Ennek a " "mezőnek tartalmaznia kell a gazda típusát." -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:1961 msgid "Only retract when crossing perimeters" msgstr "Visszahúzás csak kerület kereszezésekor" -#: src/libslic3r/PrintConfig.cpp:1930 +#: src/libslic3r/PrintConfig.cpp:1962 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." @@ -13057,21 +14889,17 @@ msgstr "" "Letiltja a visszahúzást, ha az utazási pálya nem lépi át a felső réteg " "kerületét (és így az esetleges trutyi valószínűleg láthatatlan lesz)." -#: src/libslic3r/PrintConfig.cpp:1937 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "" "This option will drop the temperature of the inactive extruders to prevent " -"oozing. It will enable a tall skirt automatically and move extruders outside " -"such skirt when changing temperatures." +"oozing. " msgstr "" -"Ez az opció csökkenti az inaktív extruderek hőmérsékletét, hogy " -"megakadályozza a szivárgást. Automatikusan engedélyezi a magas szoknyát, és " -"az extrudereket a szoknyán kívülre helyezi a hőmérséklet változtatás idejére." -#: src/libslic3r/PrintConfig.cpp:1944 +#: src/libslic3r/PrintConfig.cpp:1974 msgid "Output filename format" msgstr "Kimeneti fájlnév formátum" -#: src/libslic3r/PrintConfig.cpp:1945 +#: src/libslic3r/PrintConfig.cpp:1975 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -13083,11 +14911,11 @@ msgstr "" "továbbá a [timestamp], [year], [month], [day], [hour], [minute], [second], " "[version], [input_filename], [input_filename_base] változókat is." -#: src/libslic3r/PrintConfig.cpp:1954 +#: src/libslic3r/PrintConfig.cpp:1984 msgid "Detect bridging perimeters" msgstr "Áthidaló kerületek felismerése" -#: src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:1986 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." @@ -13096,11 +14924,11 @@ msgstr "" "használt munkafolyamatot használja). A híd sebességét alkalmazza és a " "ventilátort bekapcsolja." -#: src/libslic3r/PrintConfig.cpp:1962 +#: src/libslic3r/PrintConfig.cpp:1992 msgid "Filament parking position" msgstr "Filament parkolási pozíció" -#: src/libslic3r/PrintConfig.cpp:1963 +#: src/libslic3r/PrintConfig.cpp:1993 msgid "" "Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware." @@ -13108,11 +14936,11 @@ msgstr "" "Az extruder hegyének távolsága attól a helyzettől, ahol a szál betöltetlenül " "parkol. Ennek meg kell egyeznie a nyomtató firmware-ében megadott értékkel." -#: src/libslic3r/PrintConfig.cpp:1971 +#: src/libslic3r/PrintConfig.cpp:2001 msgid "Extra loading distance" msgstr "Extra betöltési hossz" -#: src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:2002 msgid "" "When set to zero, the distance the filament is moved from parking position " "during load is exactly the same as it was moved back during unload. When " @@ -13124,12 +14952,12 @@ msgstr "" "kiürítéskor vissza lett húzva. Ha pozitív, akkor tovább töltődik, ha " "negatív, akkor a betöltési mozgás rövidebb, mint a kiürítési." -#: src/libslic3r/PrintConfig.cpp:1980 src/libslic3r/PrintConfig.cpp:2005 -#: src/libslic3r/PrintConfig.cpp:2019 src/libslic3r/PrintConfig.cpp:2029 +#: src/libslic3r/PrintConfig.cpp:2010 src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2049 src/libslic3r/PrintConfig.cpp:2059 msgid "Perimeters" msgstr "Kerületek" -#: src/libslic3r/PrintConfig.cpp:1981 +#: src/libslic3r/PrintConfig.cpp:2011 msgid "" "This is the acceleration your printer will use for perimeters. Set zero to " "disable acceleration control for perimeters." @@ -13137,24 +14965,24 @@ msgstr "" "Ez az a gyorsulás, amelyet a nyomtató a peremvonalakhoz használ. Állítsa " "nullára a kerületek gyorsulásszabályozásának kikapcsolásához." -#: src/libslic3r/PrintConfig.cpp:1989 +#: src/libslic3r/PrintConfig.cpp:2019 msgid "" "This is the acceleration your printer will use for external perimeters. Set " "zero to use the value for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1996 +#: src/libslic3r/PrintConfig.cpp:2026 msgid "Perimeter extruder" msgstr "Kerület extruder" -#: src/libslic3r/PrintConfig.cpp:1998 +#: src/libslic3r/PrintConfig.cpp:2028 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" "A kerület és a karima nyomtatásához használt extruder. Az első extruder az 1-" "es." -#: src/libslic3r/PrintConfig.cpp:2007 +#: src/libslic3r/PrintConfig.cpp:2037 msgid "" "Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. If " @@ -13170,14 +14998,14 @@ msgstr "" "fúvókaátmérőt fogja használni. Ha százalékban van megadva (például 200%), " "akkor a rétegmagasságra lesz kiszámítva." -#: src/libslic3r/PrintConfig.cpp:2021 +#: src/libslic3r/PrintConfig.cpp:2051 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "" "Sebesség a kerületekhez (kontúrok, más néven függőleges héjak). Állítsa " "nullára az automatikus beállításhoz." -#: src/libslic3r/PrintConfig.cpp:2031 +#: src/libslic3r/PrintConfig.cpp:2061 msgid "" "This option sets the number of perimeters to generate for each layer. Note " "that Slic3r may increase this number automatically when it detects sloping " @@ -13189,11 +15017,11 @@ msgstr "" "olyan ferde felületet észlel, amely számára előnyös a nagyobb számú kerület, " "amennyiben az Extra kerület opció engedélyezve van." -#: src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2065 msgid "(minimum)" msgstr "(minimum)" -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "" "If you want to process the output G-code through custom scripts, just list " "their absolute paths here. Separate multiple scripts with a semicolon. " @@ -13207,35 +15035,35 @@ msgstr "" "abszolút elérési útvonalát kapják meg, és a környezeti változók olvasásával " "hozzáférhetnek a Slic3r konfigurációs beállításaihoz." -#: src/libslic3r/PrintConfig.cpp:2055 +#: src/libslic3r/PrintConfig.cpp:2085 msgid "Printer type" msgstr "Nyomtató típusa" -#: src/libslic3r/PrintConfig.cpp:2056 +#: src/libslic3r/PrintConfig.cpp:2086 msgid "Type of the printer." msgstr "A nyomtató típusa." -#: src/libslic3r/PrintConfig.cpp:2061 +#: src/libslic3r/PrintConfig.cpp:2091 msgid "Printer notes" msgstr "Nyomtató megjegyzések" -#: src/libslic3r/PrintConfig.cpp:2062 +#: src/libslic3r/PrintConfig.cpp:2092 msgid "You can put your notes regarding the printer here." msgstr "A nyomtatóval kapcsolatos megjegyzéseit ide írhatja be." -#: src/libslic3r/PrintConfig.cpp:2070 +#: src/libslic3r/PrintConfig.cpp:2100 msgid "Printer vendor" msgstr "Nyomtató szállítója" -#: src/libslic3r/PrintConfig.cpp:2071 +#: src/libslic3r/PrintConfig.cpp:2101 msgid "Name of the printer vendor." msgstr "A nyomtató szállítójának neve." -#: src/libslic3r/PrintConfig.cpp:2076 +#: src/libslic3r/PrintConfig.cpp:2106 msgid "Printer variant" msgstr "Nyomtató változat" -#: src/libslic3r/PrintConfig.cpp:2077 +#: src/libslic3r/PrintConfig.cpp:2107 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." @@ -13243,38 +15071,38 @@ msgstr "" "A nyomtató változat neve. A nyomtató változatok például a fúvóka átmérője " "alapján különböztethetők meg." -#: src/libslic3r/PrintConfig.cpp:2094 +#: src/libslic3r/PrintConfig.cpp:2124 msgid "Raft contact Z distance" msgstr "Tutaj érintkezés Z távolság" -#: src/libslic3r/PrintConfig.cpp:2096 +#: src/libslic3r/PrintConfig.cpp:2126 msgid "" "The vertical distance between object and raft. Ignored for soluble interface." msgstr "" "Az objektum és a tutaj közötti függőleges távolság. Oldható határfelület " "esetén figyelmen kívül hagyva." -#: src/libslic3r/PrintConfig.cpp:2103 +#: src/libslic3r/PrintConfig.cpp:2133 msgid "Raft expansion" msgstr "Tutaj kiterjesztés" -#: src/libslic3r/PrintConfig.cpp:2105 +#: src/libslic3r/PrintConfig.cpp:2135 msgid "Expansion of the raft in XY plane for better stability." msgstr "A tutaj XY síkban történő kiterjesztése a jobb stabilitás érdekében." -#: src/libslic3r/PrintConfig.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:2142 msgid "First layer density" msgstr "Első réteg sűrűsége" -#: src/libslic3r/PrintConfig.cpp:2114 +#: src/libslic3r/PrintConfig.cpp:2144 msgid "Density of the first raft or support layer." msgstr "A támasz vagy tutaj első rétegének sűrűsége." -#: src/libslic3r/PrintConfig.cpp:2122 +#: src/libslic3r/PrintConfig.cpp:2152 msgid "First layer expansion" msgstr "Első réteg túlnyúlása" -#: src/libslic3r/PrintConfig.cpp:2124 +#: src/libslic3r/PrintConfig.cpp:2154 msgid "" "Expansion of the first raft or support layer to improve adhesion to print " "bed." @@ -13282,11 +15110,11 @@ msgstr "" "Az első tutaj-, vagy támaszréteg túlnyúlása a tárgyasztalhoz való tapadás " "javítása érdekében." -#: src/libslic3r/PrintConfig.cpp:2131 +#: src/libslic3r/PrintConfig.cpp:2161 msgid "Raft layers" msgstr "Tutaj rétegek" -#: src/libslic3r/PrintConfig.cpp:2133 +#: src/libslic3r/PrintConfig.cpp:2163 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." @@ -13294,11 +15122,11 @@ msgstr "" "Az objektum ennyi réteggel megemeljük, és alatta támasztékot (tutaj) hozunk " "létre." -#: src/libslic3r/PrintConfig.cpp:2141 +#: src/libslic3r/PrintConfig.cpp:2171 msgid "Slice resolution" msgstr "Szelet felbontása" -#: src/libslic3r/PrintConfig.cpp:2142 +#: src/libslic3r/PrintConfig.cpp:2172 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -13312,11 +15140,11 @@ msgstr "" "egyszerűsítés letiltásához, és a bemenetről származó teljes felbontás " "használatához." -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:2182 msgid "G-code resolution" msgstr "G-kód felbontása" -#: src/libslic3r/PrintConfig.cpp:2153 +#: src/libslic3r/PrintConfig.cpp:2183 msgid "" "Maximum deviation of exported G-code paths from their full resolution " "counterparts. Very high resolution G-code requires huge amount of RAM to " @@ -13334,21 +15162,21 @@ msgstr "" "a G-kód egyszerűsítése minden egyes rétegen egymástól függetlenül történik, " "látható műtermékek keletkezhetnek." -#: src/libslic3r/PrintConfig.cpp:2164 +#: src/libslic3r/PrintConfig.cpp:2194 msgid "Minimum travel after retraction" msgstr "Minimális út visszahúzás után" -#: src/libslic3r/PrintConfig.cpp:2165 +#: src/libslic3r/PrintConfig.cpp:2195 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "" "A visszahúzás nem lép működésbe, ha az utazási mozgás hossza ennél rövidebb." -#: src/libslic3r/PrintConfig.cpp:2171 +#: src/libslic3r/PrintConfig.cpp:2201 msgid "Retract amount before wipe" msgstr "Visszahúzott mennyiség törlés előtt" -#: src/libslic3r/PrintConfig.cpp:2172 +#: src/libslic3r/PrintConfig.cpp:2202 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." @@ -13356,23 +15184,23 @@ msgstr "" "A bowdenes extruderekkel célszerű lehet, ha a törlőmozgást megelőzően " "bizonyos mennyiségű gyors visszahúzást végez." -#: src/libslic3r/PrintConfig.cpp:2179 +#: src/libslic3r/PrintConfig.cpp:2209 msgid "Retract on layer change" msgstr "Visszahúzás rétegváltáskor" -#: src/libslic3r/PrintConfig.cpp:2180 +#: src/libslic3r/PrintConfig.cpp:2210 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "Ez a jelölő a Z mozgások esetén visszahúzást kényszerít ki." -#: src/libslic3r/PrintConfig.cpp:2185 src/libslic3r/PrintConfig.cpp:2193 +#: src/libslic3r/PrintConfig.cpp:2215 src/libslic3r/PrintConfig.cpp:2223 msgid "Length" msgstr "Hossz" -#: src/libslic3r/PrintConfig.cpp:2186 +#: src/libslic3r/PrintConfig.cpp:2216 msgid "Retraction Length" msgstr "Visszahúzás hossza" -#: src/libslic3r/PrintConfig.cpp:2187 +#: src/libslic3r/PrintConfig.cpp:2217 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " @@ -13381,11 +15209,11 @@ msgstr "" "A visszahúzáskor a filament az itt megadott mértékben visszahúzódik (a " "hosszúság a nyers szálon mérendő, mielőtt az belépne az extruderbe)." -#: src/libslic3r/PrintConfig.cpp:2194 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Retraction Length (Toolchange)" msgstr "Visszahúzás Hossza (Szerszámváltás)" -#: src/libslic3r/PrintConfig.cpp:2195 +#: src/libslic3r/PrintConfig.cpp:2225 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " @@ -13395,11 +15223,11 @@ msgstr "" "mértékben visszahúzásra kerül (a hosszúság a nyers szálon mérendő, mielőtt " "az belépne az extruderbe)." -#: src/libslic3r/PrintConfig.cpp:2203 +#: src/libslic3r/PrintConfig.cpp:2233 msgid "Lift Z" msgstr "Z emelés" -#: src/libslic3r/PrintConfig.cpp:2204 +#: src/libslic3r/PrintConfig.cpp:2234 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " @@ -13409,15 +15237,15 @@ msgstr "" "a visszahúzás aktiválásakor. Több extruder használata esetén csak az első " "extruder beállítása lesz figyelembe véve." -#: src/libslic3r/PrintConfig.cpp:2211 +#: src/libslic3r/PrintConfig.cpp:2241 msgid "Above Z" msgstr "Z felett" -#: src/libslic3r/PrintConfig.cpp:2212 +#: src/libslic3r/PrintConfig.cpp:2242 msgid "Only lift Z above" msgstr "Z emelés csak efelett" -#: src/libslic3r/PrintConfig.cpp:2213 +#: src/libslic3r/PrintConfig.cpp:2243 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " @@ -13426,15 +15254,15 @@ msgstr "" "Ha ezt pozitív értékre állítja, a Z emelés csak a megadott abszolút Z felett " "történik. Ezzel a beállítással ez emeléseket első rétegeknél kihagyhatja." -#: src/libslic3r/PrintConfig.cpp:2220 +#: src/libslic3r/PrintConfig.cpp:2250 msgid "Below Z" msgstr "Z alatt" -#: src/libslic3r/PrintConfig.cpp:2221 +#: src/libslic3r/PrintConfig.cpp:2251 msgid "Only lift Z below" msgstr "Z emelés csak ezalatt" -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2252 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " @@ -13443,11 +15271,11 @@ msgstr "" "Ha ezt pozitív értékre állítja, a Z emelés csak a megadott abszolút Z alatt " "történik. Ezzel a beállítással az emeléseket az első rétegekre korlátozhatja." -#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2238 +#: src/libslic3r/PrintConfig.cpp:2260 src/libslic3r/PrintConfig.cpp:2268 msgid "Extra length on restart" msgstr "Extra hosszúság újraindításkor" -#: src/libslic3r/PrintConfig.cpp:2231 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." @@ -13456,7 +15284,7 @@ msgstr "" "ezt a további szálmennyiséget nyomja előre. Erre a beállításra ritkán van " "szükség." -#: src/libslic3r/PrintConfig.cpp:2239 +#: src/libslic3r/PrintConfig.cpp:2269 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." @@ -13464,19 +15292,19 @@ msgstr "" "Amikor a visszahúzás kompenzálásra kerül szerszámváltás után, az extruder " "ezt a további szálmennyiséget nyomja előre." -#: src/libslic3r/PrintConfig.cpp:2246 src/libslic3r/PrintConfig.cpp:2247 +#: src/libslic3r/PrintConfig.cpp:2276 src/libslic3r/PrintConfig.cpp:2277 msgid "Retraction Speed" msgstr "Visszahúzási Sebesség" -#: src/libslic3r/PrintConfig.cpp:2248 +#: src/libslic3r/PrintConfig.cpp:2278 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "A visszahúzási sebesség (csak az extruder motorjára vonatkozik)." -#: src/libslic3r/PrintConfig.cpp:2254 src/libslic3r/PrintConfig.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:2284 src/libslic3r/PrintConfig.cpp:2285 msgid "Deretraction Speed" msgstr "Betöltési Sebesség" -#: src/libslic3r/PrintConfig.cpp:2256 +#: src/libslic3r/PrintConfig.cpp:2286 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " @@ -13486,70 +15314,84 @@ msgstr "" "extrudermotorra vonatkozik). Ha nullán hagyja, akkor a visszahúzási sebesség " "kerül felhasználásra." -#: src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2293 msgid "Seam position" msgstr "Varrat pozíció" -#: src/libslic3r/PrintConfig.cpp:2265 +#: src/libslic3r/PrintConfig.cpp:2295 msgid "Position of perimeters starting points." msgstr "A kerületi kiindulási pontok helyzete." -#: src/libslic3r/PrintConfig.cpp:2272 +#: src/libslic3r/PrintConfig.cpp:2297 +msgid "Random" +msgstr "Véletlen" + +#: src/libslic3r/PrintConfig.cpp:2298 msgid "Nearest" msgstr "Legközelebbi" -#: src/libslic3r/PrintConfig.cpp:2273 +#: src/libslic3r/PrintConfig.cpp:2299 msgid "Aligned" msgstr "Igazított" -#: src/libslic3r/PrintConfig.cpp:2281 +#: src/libslic3r/PrintConfig.cpp:2306 +msgid "Staggered inner seams" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2307 +msgid "" +"This option causes the inner seams to be shifted backwards based on their " +"depth, forming a zigzag pattern." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2314 msgid "Direction" msgstr "Irány" -#: src/libslic3r/PrintConfig.cpp:2283 +#: src/libslic3r/PrintConfig.cpp:2316 msgid "Preferred direction of the seam" msgstr "A varrat preferált iránya" -#: src/libslic3r/PrintConfig.cpp:2284 +#: src/libslic3r/PrintConfig.cpp:2317 msgid "Seam preferred direction" msgstr "A varrat preferált iránya" -#: src/libslic3r/PrintConfig.cpp:2291 +#: src/libslic3r/PrintConfig.cpp:2324 msgid "Jitter" msgstr "Jitter" -#: src/libslic3r/PrintConfig.cpp:2293 +#: src/libslic3r/PrintConfig.cpp:2326 msgid "Seam preferred direction jitter" msgstr "Varrat preferált iránya jitter" -#: src/libslic3r/PrintConfig.cpp:2294 +#: src/libslic3r/PrintConfig.cpp:2327 msgid "Preferred direction of the seam - jitter" msgstr "Varrat preferált iránya - jitter" -#: src/libslic3r/PrintConfig.cpp:2301 +#: src/libslic3r/PrintConfig.cpp:2334 msgid "Distance from brim/object" msgstr "Távolság a karimától/objektumtól" -#: src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2335 msgid "" "Distance between skirt and brim (when draft shield is not used) or objects." msgstr "" "A szoknya távolsága a karimától (ha nem használnak huzatvédőt), vagy az " "objektum(ok)tól." -#: src/libslic3r/PrintConfig.cpp:2308 +#: src/libslic3r/PrintConfig.cpp:2341 msgid "Skirt height" msgstr "Szoknya magasság" -#: src/libslic3r/PrintConfig.cpp:2309 +#: src/libslic3r/PrintConfig.cpp:2342 msgid "Height of skirt expressed in layers." msgstr "A szoknya magassága rétegekben kifejezve." -#: src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2348 msgid "Draft shield" msgstr "Huzatvédő" -#: src/libslic3r/PrintConfig.cpp:2316 +#: src/libslic3r/PrintConfig.cpp:2349 msgid "" "With draft shield active, the skirt will be printed skirt_distance from the " "object, possibly intersecting brim.\n" @@ -13567,27 +15409,27 @@ msgstr "" "Ez a funkció hasznos ABS vagy ASA munkadarabok védelmére, hogy azok huzat " "miatt ne vetemedjenek meg és ne váljanak le a nyomtatóágyról." -#: src/libslic3r/PrintConfig.cpp:2324 +#: src/libslic3r/PrintConfig.cpp:2354 msgid "Disabled" msgstr "Letiltva" -#: src/libslic3r/PrintConfig.cpp:2325 +#: src/libslic3r/PrintConfig.cpp:2355 msgid "Limited" msgstr "Korlátozott" -#: src/libslic3r/PrintConfig.cpp:2326 +#: src/libslic3r/PrintConfig.cpp:2356 msgid "Enabled" msgstr "Engedélyezve" -#: src/libslic3r/PrintConfig.cpp:2331 +#: src/libslic3r/PrintConfig.cpp:2362 msgid "Loops (minimum)" msgstr "Hurkok (minimum)" -#: src/libslic3r/PrintConfig.cpp:2332 +#: src/libslic3r/PrintConfig.cpp:2363 msgid "Skirt Loops" msgstr "Szoknya Hurkok" -#: src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2364 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " @@ -13597,11 +15439,11 @@ msgstr "" "opció be van állítva, akkor a hurkok száma nagyobb lehet, mint az itt " "beállított. A szoknya teljes kikapcsolásához állítsa ezt nullára." -#: src/libslic3r/PrintConfig.cpp:2341 +#: src/libslic3r/PrintConfig.cpp:2372 msgid "Slow down if layer print time is below" msgstr "Lassítson, ha a rétegnyomtatási idő a következő idő alatt van" -#: src/libslic3r/PrintConfig.cpp:2342 +#: src/libslic3r/PrintConfig.cpp:2373 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." @@ -13610,11 +15452,11 @@ msgstr "" "nyomtatási mozgások sebessége lecsökken, hogy az időtartamot erre az értékre " "növelje." -#: src/libslic3r/PrintConfig.cpp:2351 +#: src/libslic3r/PrintConfig.cpp:2382 msgid "Small perimeters" msgstr "Kicsi kerületek" -#: src/libslic3r/PrintConfig.cpp:2353 +#: src/libslic3r/PrintConfig.cpp:2384 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " @@ -13625,11 +15467,11 @@ msgstr "" "fenti Kerületek sebességbeállítása alapján kerül kiszámításra. Állítsa " "nullára az automatikus beállításhoz." -#: src/libslic3r/PrintConfig.cpp:2363 +#: src/libslic3r/PrintConfig.cpp:2394 msgid "Solid infill threshold area" msgstr "Tömör kitöltés küszöbérték" -#: src/libslic3r/PrintConfig.cpp:2365 +#: src/libslic3r/PrintConfig.cpp:2396 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." @@ -13637,23 +15479,23 @@ msgstr "" "Tömör kitöltés használata a megadott küszöbértéknél kisebb területű régiók " "esetében." -#: src/libslic3r/PrintConfig.cpp:2366 +#: src/libslic3r/PrintConfig.cpp:2397 msgid "mm²" msgstr "mm²" -#: src/libslic3r/PrintConfig.cpp:2372 +#: src/libslic3r/PrintConfig.cpp:2403 msgid "Solid infill extruder" msgstr "Tömör kitöltés extruder" -#: src/libslic3r/PrintConfig.cpp:2374 +#: src/libslic3r/PrintConfig.cpp:2405 msgid "The extruder to use when printing solid infill." msgstr "A tömör kitöltés nyomtatásához használt extruder." -#: src/libslic3r/PrintConfig.cpp:2380 +#: src/libslic3r/PrintConfig.cpp:2411 msgid "Solid infill every" msgstr "Tömör kitöltés minden" -#: src/libslic3r/PrintConfig.cpp:2382 +#: src/libslic3r/PrintConfig.cpp:2413 msgid "" "This feature allows to force a solid layer every given number of layers. " "Zero to disable. You can set this to any value (for example 9999); Slic3r " @@ -13665,7 +15507,7 @@ msgstr "" "a Slic3r automatikusan kiválasztja a kombinálandó rétegek maximálisan " "lehetséges számát a fúvóka átmérőjének és a rétegmagasságnak megfelelően." -#: src/libslic3r/PrintConfig.cpp:2394 +#: src/libslic3r/PrintConfig.cpp:2425 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "solid surfaces. If left zero, default extrusion width will be used if set, " @@ -13679,7 +15521,7 @@ msgstr "" "fogja használni. Ha százalékban van megadva (például 90%), akkor a " "rétegmagasságra lesz kiszámítva." -#: src/libslic3r/PrintConfig.cpp:2406 +#: src/libslic3r/PrintConfig.cpp:2437 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " @@ -13689,19 +15531,19 @@ msgstr "" "Ez a fenti alapértelmezett Kitöltés sebességéhez képest százalékban " "(például: 80%) adható meg. Állítsa nullára az automatikus beállításhoz." -#: src/libslic3r/PrintConfig.cpp:2418 +#: src/libslic3r/PrintConfig.cpp:2449 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "A felső és alsó felületeken létrehozandó tömör rétegek száma." -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2455 src/libslic3r/PrintConfig.cpp:2456 msgid "Minimum thickness of a top / bottom shell" msgstr "A felső/alsó héj minimális vastagsága" -#: src/libslic3r/PrintConfig.cpp:2431 +#: src/libslic3r/PrintConfig.cpp:2462 msgid "Spiral vase" msgstr "Spirál váza" -#: src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2463 msgid "" "This feature will raise Z gradually while printing a single-walled object in " "order to remove any visible seam. This option requires a single perimeter, " @@ -13715,21 +15557,17 @@ msgstr "" "Továbbra is beállíthat tetszőleges számú alsó tömör réteget, valamint " "szoknya-/karima hurkokat. Egynél több objektum nyomtatásakor nem fog működni." -#: src/libslic3r/PrintConfig.cpp:2440 +#: src/libslic3r/PrintConfig.cpp:2471 msgid "Temperature variation" msgstr "Hőmérséklet-változás" -#: src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:2472 msgid "" -"Temperature difference to be applied when an extruder is not active. Enables " -"a full-height \"sacrificial\" skirt on which the nozzles are periodically " -"wiped." +"Temperature difference to be applied when an extruder is not active. The " +"value is not used when 'idle_temperature' in filament settings is defined." msgstr "" -"Hőmérsékletkülönbség a nem aktív extruderek esetén. Engedélyezi továbbá egy " -"teljes magasságú \"áldozati\" szoknyát amelyen a fúvókák időszakosan " -"tisztításra kerülnek." -#: src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2483 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -13748,7 +15586,7 @@ msgstr "" "hogy minden PrusaSlicer beállításhoz használhat helyőrző változókat, így " "bárhová beírhat egy \"M109 S[first_layer_temperature]\" parancsot." -#: src/libslic3r/PrintConfig.cpp:2466 +#: src/libslic3r/PrintConfig.cpp:2498 msgid "" "This start procedure is inserted at the beginning, after any printer start " "gcode (and after any toolchange to this filament in case of multi-material " @@ -13771,35 +15609,35 @@ msgstr "" "egy \"M109 S[first_layer_temperature]\" parancsot. Ha több extruderrel " "rendelkezik, akkor a g-kód az extruderek sorrendjében kerül feldolgozásra." -#: src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2514 msgid "Color change G-code" msgstr "Színváltás G-kód" -#: src/libslic3r/PrintConfig.cpp:2483 +#: src/libslic3r/PrintConfig.cpp:2515 msgid "This G-code will be used as a code for the color change" msgstr "Ezt a G-kódot a színváltás kódjaként fogjuk használni" -#: src/libslic3r/PrintConfig.cpp:2492 +#: src/libslic3r/PrintConfig.cpp:2524 msgid "This G-code will be used as a code for the pause print" msgstr "Ezt a G-kódot a nyomtatás szüneteltetés kódjaként fogjuk használni" -#: src/libslic3r/PrintConfig.cpp:2501 +#: src/libslic3r/PrintConfig.cpp:2533 msgid "This G-code will be used as a custom code" msgstr "Ezt a G-kódot egyéni kódként fogjuk használni" -#: src/libslic3r/PrintConfig.cpp:2509 +#: src/libslic3r/PrintConfig.cpp:2541 msgid "Single Extruder Multi Material" msgstr "Egyetlen Extruder Többféle Anyag" -#: src/libslic3r/PrintConfig.cpp:2510 +#: src/libslic3r/PrintConfig.cpp:2542 msgid "The printer multiplexes filaments into a single hot end." msgstr "A nyomtató a filamenteket egyetlen 'hot endbe' fűzi." -#: src/libslic3r/PrintConfig.cpp:2515 +#: src/libslic3r/PrintConfig.cpp:2547 msgid "Prime all printing extruders" msgstr "Az összes nyomtató extruder előkészítése" -#: src/libslic3r/PrintConfig.cpp:2516 +#: src/libslic3r/PrintConfig.cpp:2548 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." @@ -13807,11 +15645,11 @@ msgstr "" "Ha engedélyezve van, akkor a nyomtatás kezdetén az összes nyomtató extruder " "előkészítésre kerül a tárgyasztal elülső szélénél." -#: src/libslic3r/PrintConfig.cpp:2521 +#: src/libslic3r/PrintConfig.cpp:2553 msgid "No sparse layers (EXPERIMENTAL)" msgstr "Nincsenek ritkás rétegek (Kísérleti)" -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2554 msgid "" "If enabled, the wipe tower will not be printed on layers with no " "toolchanges. On layers with a toolchange, extruder will travel downward to " @@ -13823,11 +15661,11 @@ msgstr "" "extruder az aktuális magasság alá süllyed a törlőtorony nyomtatásához. A " "felhasználó felelős azért, hogy ez ne okozzon ütközést a nyomtatás során." -#: src/libslic3r/PrintConfig.cpp:2529 +#: src/libslic3r/PrintConfig.cpp:2561 msgid "Slice gap closing radius" msgstr "Szelet hézagzárási sugara" -#: src/libslic3r/PrintConfig.cpp:2531 +#: src/libslic3r/PrintConfig.cpp:2563 msgid "" "Cracks smaller than 2x gap closing radius are being filled during the " "triangle mesh slicing. The gap closing operation may reduce the final print " @@ -13838,11 +15676,11 @@ msgstr "" "végső nyomtatási felbontást, ezért célszerű az értékét ésszerűen alacsonyan " "tartani." -#: src/libslic3r/PrintConfig.cpp:2539 +#: src/libslic3r/PrintConfig.cpp:2571 msgid "Slicing Mode" msgstr "Szeletelési mód" -#: src/libslic3r/PrintConfig.cpp:2541 +#: src/libslic3r/PrintConfig.cpp:2573 msgid "" "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " "close all holes in the model." @@ -13851,31 +15689,31 @@ msgstr "" "Használja a \"Lyukak bezárása\" opciót a modellen lévő összes lyuk " "bezárásához." -#: src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2575 msgid "Regular" msgstr "Általános" -#: src/libslic3r/PrintConfig.cpp:2547 +#: src/libslic3r/PrintConfig.cpp:2576 msgid "Even-odd" msgstr "Páros - Páratlan" -#: src/libslic3r/PrintConfig.cpp:2548 +#: src/libslic3r/PrintConfig.cpp:2577 msgid "Close holes" msgstr "Lyukak bezárása" -#: src/libslic3r/PrintConfig.cpp:2553 +#: src/libslic3r/PrintConfig.cpp:2583 msgid "Generate support material" msgstr "Támaszanyag létrehozása" -#: src/libslic3r/PrintConfig.cpp:2555 +#: src/libslic3r/PrintConfig.cpp:2585 msgid "Enable support material generation." msgstr "Engedélyezi a támaszanyag generálást." -#: src/libslic3r/PrintConfig.cpp:2559 +#: src/libslic3r/PrintConfig.cpp:2589 msgid "Auto generated supports" msgstr "Automatikusan generált támaszok" -#: src/libslic3r/PrintConfig.cpp:2561 +#: src/libslic3r/PrintConfig.cpp:2591 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " @@ -13885,11 +15723,11 @@ msgstr "" "küszöbértéke alapján. Ha nincs bejelölve, a támaszok csak a \"Támaszték " "Kényszerítők\" térfogatokon belül lesznek generálva." -#: src/libslic3r/PrintConfig.cpp:2567 +#: src/libslic3r/PrintConfig.cpp:2597 msgid "XY separation between an object and its support" msgstr "XY elválasztás egy objektum és annak támasztója között" -#: src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2599 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." @@ -13897,11 +15735,11 @@ msgstr "" "XY elválasztás egy objektum és a támasztószerkezet között. Ha százalékban " "van megadva (például 50%), akkor a külső kerület szélességére kell számítani." -#: src/libslic3r/PrintConfig.cpp:2580 +#: src/libslic3r/PrintConfig.cpp:2610 msgid "Pattern angle" msgstr "Mintázat szöge" -#: src/libslic3r/PrintConfig.cpp:2582 +#: src/libslic3r/PrintConfig.cpp:2612 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." @@ -13909,7 +15747,7 @@ msgstr "" "Ezzel a beállítással elforgathatja a támaszanyag mintázatát a vízszintes " "síkon." -#: src/libslic3r/PrintConfig.cpp:2592 src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:2622 src/libslic3r/PrintConfig.cpp:3411 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -13917,11 +15755,11 @@ msgstr "" "Csak akkor hozzon létre támaszt, ha az a tárgyasztalon nyugszik. Ne hozzon " "létre támaszt a nyomtatáson." -#: src/libslic3r/PrintConfig.cpp:2598 +#: src/libslic3r/PrintConfig.cpp:2627 msgid "Top contact Z distance" msgstr "Felső érintkező Z távolság" -#: src/libslic3r/PrintConfig.cpp:2600 +#: src/libslic3r/PrintConfig.cpp:2629 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " @@ -13931,23 +15769,23 @@ msgstr "" "Ennek 0-ra állítása megakadályozza azt is, hogy a Slic3r az első " "objektumrétegnél a híd áramlását és sebességét használja." -#: src/libslic3r/PrintConfig.cpp:2608 +#: src/libslic3r/PrintConfig.cpp:2635 msgid "0 (soluble)" msgstr "0 (oldható)" -#: src/libslic3r/PrintConfig.cpp:2609 +#: src/libslic3r/PrintConfig.cpp:2636 msgid "0.1 (detachable)" msgstr "0,1 (leválasztható)" -#: src/libslic3r/PrintConfig.cpp:2610 +#: src/libslic3r/PrintConfig.cpp:2637 msgid "0.2 (detachable)" msgstr "0,2 (leválasztható)" -#: src/libslic3r/PrintConfig.cpp:2616 +#: src/libslic3r/PrintConfig.cpp:2643 msgid "Bottom contact Z distance" msgstr "Alsó érintkező Z távolság" -#: src/libslic3r/PrintConfig.cpp:2618 +#: src/libslic3r/PrintConfig.cpp:2645 msgid "" "The vertical distance between the object top surface and the support " "material interface. If set to zero, support_material_contact_distance will " @@ -13957,17 +15795,15 @@ msgstr "" "nullára van állítva, akkor a support_material_contact_distance a felső és az " "alsó érintkezési Z távolsághoz is használható." -#. TRN To be shown in Print Settings "Bottom contact Z distance". Have to be as short as possible -#. TRN To be shown in Print Settings "Bottom interface layers". Have to be as short as possible -#: src/libslic3r/PrintConfig.cpp:2626 src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2651 src/libslic3r/PrintConfig.cpp:2732 msgid "Same as top" msgstr "Megegyezik a felsővel" -#: src/libslic3r/PrintConfig.cpp:2633 +#: src/libslic3r/PrintConfig.cpp:2659 msgid "Enforce support for the first" msgstr "Támasztó kényszerítése az első" -#: src/libslic3r/PrintConfig.cpp:2635 +#: src/libslic3r/PrintConfig.cpp:2661 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -13980,15 +15816,15 @@ msgstr "" "talpfelülettel rendelkező objektumok jobb tapadásának eléréséhez a " "tárgyasztalhoz." -#: src/libslic3r/PrintConfig.cpp:2640 +#: src/libslic3r/PrintConfig.cpp:2666 msgid "Enforce support for the first n layers" msgstr "Támasztó kényszerítése az első n rétegnél" -#: src/libslic3r/PrintConfig.cpp:2646 +#: src/libslic3r/PrintConfig.cpp:2672 msgid "Support material/raft/skirt extruder" msgstr "Támaszanyag/tutaj/szoknya extruder" -#: src/libslic3r/PrintConfig.cpp:2648 +#: src/libslic3r/PrintConfig.cpp:2674 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." @@ -13997,7 +15833,7 @@ msgstr "" "éppen aktuális extruder használatához a szerszámváltások minimalizálása " "érdekében)." -#: src/libslic3r/PrintConfig.cpp:2657 +#: src/libslic3r/PrintConfig.cpp:2683 msgid "" "Set this to a non-zero value to set a manual extrusion width for support " "material. If left zero, default extrusion width will be used if set, " @@ -14011,22 +15847,22 @@ msgstr "" "használni. Ha százalékban van megadva (például 90%), akkor a rétegmagasságra " "lesz kiszámítva." -#: src/libslic3r/PrintConfig.cpp:2667 +#: src/libslic3r/PrintConfig.cpp:2693 msgid "Interface loops" msgstr "Interfész hurkok" -#: src/libslic3r/PrintConfig.cpp:2669 +#: src/libslic3r/PrintConfig.cpp:2695 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" "Fedje le a támaszok felső érintkező rétegét hurkokkal. Alapértelmezés " "szerint kikapcsolva." -#: src/libslic3r/PrintConfig.cpp:2674 +#: src/libslic3r/PrintConfig.cpp:2700 msgid "Support material/raft interface extruder" msgstr "Támaszanyag interfész / tutaj extruder" -#: src/libslic3r/PrintConfig.cpp:2676 +#: src/libslic3r/PrintConfig.cpp:2702 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." @@ -14035,38 +15871,38 @@ msgstr "" "aktuális extruder használatához a szerszámváltások minimalizálása " "érdekében). Ez hatással van a tutajra is." -#: src/libslic3r/PrintConfig.cpp:2684 +#: src/libslic3r/PrintConfig.cpp:2709 msgid "Top interface layers" msgstr "Felső interfész rétegek" -#: src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2711 msgid "" "Number of interface layers to insert between the object(s) and support " "material." msgstr "" "Az objektum(ok) és a támaszanyag közé beillesztendő interfész rétegek száma." -#: src/libslic3r/PrintConfig.cpp:2693 +#: src/libslic3r/PrintConfig.cpp:2715 src/libslic3r/PrintConfig.cpp:2733 msgid "0 (off)" msgstr "0 (kikapcsolva)" -#: src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2716 src/libslic3r/PrintConfig.cpp:2734 msgid "1 (light)" msgstr "1 (könnyű)" -#: src/libslic3r/PrintConfig.cpp:2695 +#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2735 msgid "2 (default)" msgstr "2 (alapértelmezett)" -#: src/libslic3r/PrintConfig.cpp:2696 +#: src/libslic3r/PrintConfig.cpp:2718 src/libslic3r/PrintConfig.cpp:2736 msgid "3 (heavy)" msgstr "3 (nehéz)" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:2724 msgid "Bottom interface layers" msgstr "Alsó interfész rétegek" -#: src/libslic3r/PrintConfig.cpp:2704 +#: src/libslic3r/PrintConfig.cpp:2726 msgid "" "Number of interface layers to insert between the object(s) and support " "material. Set to -1 to use support_material_interface_layers" @@ -14074,11 +15910,11 @@ msgstr "" "Az objektum(ok) és a támaszanyag közé beillesztendő interfész rétegek száma. " "Állítsa -1-re a support_material_interface_layers használatához" -#: src/libslic3r/PrintConfig.cpp:2717 +#: src/libslic3r/PrintConfig.cpp:2742 msgid "Closing radius" msgstr "Zárási sugár" -#: src/libslic3r/PrintConfig.cpp:2719 +#: src/libslic3r/PrintConfig.cpp:2744 msgid "" "For snug supports, the support regions will be merged using morphological " "closing operation. Gaps smaller than the closing radius will be filled in." @@ -14087,17 +15923,21 @@ msgstr "" "segítségével egyesítjük. A zárási sugárnál kisebb hézagok kitöltésre " "kerülnek." -#: src/libslic3r/PrintConfig.cpp:2727 +#: src/libslic3r/PrintConfig.cpp:2752 msgid "Interface pattern spacing" msgstr "Interfész mintázat térköz" -#: src/libslic3r/PrintConfig.cpp:2729 +#: src/libslic3r/PrintConfig.cpp:2754 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" "Térköz az interfész vonalai között. HA nullára állítja, akkor összefüggő " "interfészt kap." -#: src/libslic3r/PrintConfig.cpp:2738 +#: src/libslic3r/PrintConfig.cpp:2761 +msgid "Support material interface" +msgstr "Támaszanyag interfész" + +#: src/libslic3r/PrintConfig.cpp:2763 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " @@ -14107,23 +15947,23 @@ msgstr "" "megadva (például 50%), akkor a sebességet a támasztó nyomtatási sebességére " "kell számítani." -#: src/libslic3r/PrintConfig.cpp:2747 +#: src/libslic3r/PrintConfig.cpp:2772 msgid "Pattern" msgstr "Mintázat" -#: src/libslic3r/PrintConfig.cpp:2749 +#: src/libslic3r/PrintConfig.cpp:2774 msgid "Pattern used to generate support material." msgstr "Támaszanyag létrehozásához használt mintázat." -#: src/libslic3r/PrintConfig.cpp:2755 +#: src/libslic3r/PrintConfig.cpp:2777 msgid "Rectilinear grid" msgstr "Egyenesvonalú háló" -#: src/libslic3r/PrintConfig.cpp:2761 +#: src/libslic3r/PrintConfig.cpp:2784 msgid "Interface pattern" msgstr "Interfész mintázat" -#: src/libslic3r/PrintConfig.cpp:2763 +#: src/libslic3r/PrintConfig.cpp:2786 msgid "" "Pattern used to generate support material interface. Default pattern for non-" "soluble support interface is Rectilinear, while default pattern for soluble " @@ -14134,23 +15974,19 @@ msgstr "" "(Rectilinear), míg az oldható támaszanyag interfész alapértelmezett " "mintázata a koncentrikus (Concentric)." -#: src/libslic3r/PrintConfig.cpp:2777 +#: src/libslic3r/PrintConfig.cpp:2798 msgid "Pattern spacing" msgstr "Mintázat térköze" -#: src/libslic3r/PrintConfig.cpp:2779 +#: src/libslic3r/PrintConfig.cpp:2800 msgid "Spacing between support material lines." msgstr "Térköz a támaszanyag vonalai között." -#: src/libslic3r/PrintConfig.cpp:2788 +#: src/libslic3r/PrintConfig.cpp:2809 msgid "Speed for printing support material." msgstr "Támaszanyag nyomtatásának sebessége." -#: src/libslic3r/PrintConfig.cpp:2795 -msgid "Style" -msgstr "Stílus" - -#: src/libslic3r/PrintConfig.cpp:2797 +#: src/libslic3r/PrintConfig.cpp:2818 msgid "" "Style and shape of the support towers. Projecting the supports into a " "regular grid will create more stable supports, while snug support towers " @@ -14160,27 +15996,30 @@ msgstr "" "stabilabb támaszokat hoz létre, míg a simulékony támasz tornyok anyagot " "takarítanak meg és csökkentik az objektumok hegesedését." -#: src/libslic3r/PrintConfig.cpp:2804 +#: src/libslic3r/PrintConfig.cpp:2823 msgid "Snug" msgstr "Simulékony" -#: src/libslic3r/PrintConfig.cpp:2809 +#: src/libslic3r/PrintConfig.cpp:2824 +msgid "Organic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2830 msgid "Synchronize with object layers" msgstr "Szinkronizálás objektumrétegekkel" -#: src/libslic3r/PrintConfig.cpp:2811 +#: src/libslic3r/PrintConfig.cpp:2832 msgid "" "Synchronize support layers with the object print layers. This is useful with " -"multi-material printers, where the extruder switch is expensive." +"multi-material printers, where the extruder switch is expensive. This option " +"is only available when top contact Z distance is set to zero." msgstr "" -"Támasztórétegek szinkronizálása az objektum nyomtatási rétegekkel. Ez több-" -"anyagos nyomtatóknál hasznos, ahol az extruder váltás költséges művelet." -#: src/libslic3r/PrintConfig.cpp:2817 +#: src/libslic3r/PrintConfig.cpp:2839 msgid "Overhang threshold" msgstr "Túlnyúlási küszöbértéke" -#: src/libslic3r/PrintConfig.cpp:2819 +#: src/libslic3r/PrintConfig.cpp:2841 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -14194,11 +16033,11 @@ msgstr "" "még támaszanyag NÉLKÜL nyomtathat. Automatikus felismeréshez állítsa nullára " "(ajánlott)." -#: src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2853 msgid "With sheath around the support" msgstr "Burkolat a támasz körül" -#: src/libslic3r/PrintConfig.cpp:2833 +#: src/libslic3r/PrintConfig.cpp:2855 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." @@ -14206,7 +16045,72 @@ msgstr "" "Hozzáad egy burkolatot (egyetlen kerületi vonalat) a támasztékhoz. Ez " "megbízhatóbbá, de nehezebben eltávolíthatóvá teszi a támaszt." -#: src/libslic3r/PrintConfig.cpp:2840 +#: src/libslic3r/PrintConfig.cpp:2861 +msgid "Maximum Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2863 +msgid "" +"The maximum angle of the branches, when the branches have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle to be able to have more reach." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2872 +msgid "Preferred Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2874 +msgid "" +"The preferred angle of the branches, when they do not have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle for branches to merge faster." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2883 +msgid "Tip Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2885 +msgid "The diameter of the top of the tip of the branches of organic support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2892 +msgid "Branch Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2894 +msgid "" +"The diameter of the thinnest branches of organic support. Thicker branches " +"are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2902 +msgid "Branch Diameter Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2904 +msgid "" +"The angle of the branches' diameter as they gradually become thicker towards " +"the bottom. An angle of 0 will cause the branches to have uniform thickness " +"over their length. A bit of an angle can increase stability of the organic " +"support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2914 +msgid "Branch Density" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2916 +msgid "" +"Adjusts the density of the support structure used to generate the tips of " +"the branches. A higher value results in better overhangs but the supports " +"are harder to remove, thus it is recommended to enable top support " +"interfaces instead of a high branch density value if dense interfaces are " +"needed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2928 msgid "" "Nozzle temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output G-code." @@ -14214,15 +16118,15 @@ msgstr "" "A fúvóka hőmérséklete az első réteg után. Állítsa ezt nullára, hogy a " "kimeneti G-kódban a hőmérsékletet befolyásoló parancsokat letiltsa." -#: src/libslic3r/PrintConfig.cpp:2843 +#: src/libslic3r/PrintConfig.cpp:2931 msgid "Nozzle temperature" msgstr "Fúvóka hőmérséklet" -#: src/libslic3r/PrintConfig.cpp:2849 +#: src/libslic3r/PrintConfig.cpp:2937 msgid "Thick bridges" msgstr "Vastag hidak" -#: src/libslic3r/PrintConfig.cpp:2851 +#: src/libslic3r/PrintConfig.cpp:2939 msgid "" "If enabled, bridges are more reliable, can bridge longer distances, but may " "look worse. If disabled, bridges look better but are reliable just for " @@ -14233,11 +16137,11 @@ msgstr "" "hidak jobban fognak kinézni, de csak a rövidebb áthidalt távolságokon " "lesznek megbízhatóak." -#: src/libslic3r/PrintConfig.cpp:2857 +#: src/libslic3r/PrintConfig.cpp:2945 msgid "Detect thin walls" msgstr "Vékony falak felismerése" -#: src/libslic3r/PrintConfig.cpp:2859 +#: src/libslic3r/PrintConfig.cpp:2947 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." @@ -14245,11 +16149,11 @@ msgstr "" "Szimpla szélességű falak felismerése (olyan részek, ahol két extrudálás nem " "fér el, ezért egyetlen nyomvonallá kell összezsúfolni őket)." -#: src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2953 msgid "Threads" msgstr "Szálak" -#: src/libslic3r/PrintConfig.cpp:2866 +#: src/libslic3r/PrintConfig.cpp:2954 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." @@ -14258,7 +16162,7 @@ msgstr "" "szálak optimális száma valamivel a rendelkezésre álló magok/processzorok " "száma felett van." -#: src/libslic3r/PrintConfig.cpp:2878 +#: src/libslic3r/PrintConfig.cpp:2966 msgid "" "This custom code is inserted before every toolchange. Placeholder variables " "for all PrusaSlicer settings as well as {toolchange_z}, {previous_extruder} " @@ -14275,7 +16179,7 @@ msgstr "" "parancsot. Lehetőség van tehát egyéni viselkedés szkriptelésére a " "szerszámváltás előtt és után is." -#: src/libslic3r/PrintConfig.cpp:2891 +#: src/libslic3r/PrintConfig.cpp:2979 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "top surfaces. You may want to use thinner extrudates to fill all narrow " @@ -14292,7 +16196,7 @@ msgstr "" "Ha százalékban van megadva (például 90%), akkor a rétegmagasságra lesz " "kiszámítva." -#: src/libslic3r/PrintConfig.cpp:2904 +#: src/libslic3r/PrintConfig.cpp:2992 msgid "" "Speed for printing top solid layers (it only applies to the uppermost " "external layers and not to their internal solid layers). You may want to " @@ -14306,15 +16210,15 @@ msgstr "" "százalékban (például: 80%) is kifejezhető. Állítsa nullára az automatikus " "beállításhoz." -#: src/libslic3r/PrintConfig.cpp:2919 +#: src/libslic3r/PrintConfig.cpp:3007 msgid "Number of solid layers to generate on top surfaces." msgstr "A felső felületeken létrehozandó tömör rétegek száma." -#: src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3008 msgid "Top solid layers" msgstr "Felső tömör rétegek" -#: src/libslic3r/PrintConfig.cpp:2928 +#: src/libslic3r/PrintConfig.cpp:3016 msgid "" "The number of top solid layers is increased above top_solid_layers if " "necessary to satisfy minimum thickness of top shell. This is useful to " @@ -14325,20 +16229,20 @@ msgstr "" "Ez hasznos a változó rétegmagasságú nyomtatásnál a \" párnásodás\" effektus " "elkerülése érdekében." -#: src/libslic3r/PrintConfig.cpp:2931 +#: src/libslic3r/PrintConfig.cpp:3019 msgid "Minimum top shell thickness" msgstr "Minimális felső héj vastagság" -#: src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:3026 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "" "Az utazási mozgások sebessége (távoli extrudálási pontok közötti ugrások)." -#: src/libslic3r/PrintConfig.cpp:2946 +#: src/libslic3r/PrintConfig.cpp:3034 msgid "Z travel" msgstr "Z utazás" -#: src/libslic3r/PrintConfig.cpp:2947 +#: src/libslic3r/PrintConfig.cpp:3035 msgid "" "Speed for movements along the Z axis.\n" "When set to zero, the value is ignored and regular travel speed is used " @@ -14348,11 +16252,11 @@ msgstr "" "Ha nullára van állítva, akkor az értéket figyelmen kívül hagyjuk, és " "helyette a normál utazási sebességet használjuk." -#: src/libslic3r/PrintConfig.cpp:2955 +#: src/libslic3r/PrintConfig.cpp:3043 msgid "Use firmware retraction" msgstr "Firmware visszahúzás használata" -#: src/libslic3r/PrintConfig.cpp:2956 +#: src/libslic3r/PrintConfig.cpp:3044 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." @@ -14360,11 +16264,11 @@ msgstr "" "Ez a kísérleti beállítás a G10 és G11 parancsokat használja, hogy a firmware " "kezelje a visszahúzást. Ezt csak a legújabb Marlin támogatja." -#: src/libslic3r/PrintConfig.cpp:2962 +#: src/libslic3r/PrintConfig.cpp:3050 msgid "Use relative E distances" msgstr "Relatív E távolságok használata" -#: src/libslic3r/PrintConfig.cpp:2963 +#: src/libslic3r/PrintConfig.cpp:3051 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." @@ -14372,11 +16276,11 @@ msgstr "" "Ha a firmware relatív E értékeket igényel, jelölje be ezt a lehetőséget, " "egyébként hagyja üresen. A legtöbb firmware abszolút értékeket használ." -#: src/libslic3r/PrintConfig.cpp:2969 +#: src/libslic3r/PrintConfig.cpp:3057 msgid "Use volumetric E" msgstr "Használjon volumetrikus E paramétert" -#: src/libslic3r/PrintConfig.cpp:2970 +#: src/libslic3r/PrintConfig.cpp:3058 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -14392,11 +16296,11 @@ msgstr "" "Slic3r-ben kiválasztott filamenthez tartozó filament átmérő használatával. " "Ezt csak a legújabb Marlin támogatja." -#: src/libslic3r/PrintConfig.cpp:2980 +#: src/libslic3r/PrintConfig.cpp:3068 msgid "Enable variable layer height feature" msgstr "A változó rétegmagasság funkció engedélyezése" -#: src/libslic3r/PrintConfig.cpp:2981 +#: src/libslic3r/PrintConfig.cpp:3069 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." @@ -14404,11 +16308,11 @@ msgstr "" "Egyes nyomtatók vagy nyomtatóbeállítások nehézségekbe ütközhetnek a változó " "rétegmagasságú nyomtatásnál. Alapértelmezés szerint engedélyezett." -#: src/libslic3r/PrintConfig.cpp:2987 +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Wipe while retracting" msgstr "Törlés visszahúzás közben" -#: src/libslic3r/PrintConfig.cpp:2988 +#: src/libslic3r/PrintConfig.cpp:3076 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." @@ -14416,7 +16320,7 @@ msgstr "" "Ez a jelölő a fúvókát visszahúzás közben mozgatja, hogy a szivárgó " "extruderek esetén minimalizálja az esetleges paca képződést." -#: src/libslic3r/PrintConfig.cpp:2995 +#: src/libslic3r/PrintConfig.cpp:3083 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." @@ -14425,11 +16329,11 @@ msgstr "" "az extruderek előkészítésére vagy tisztítására. A felesleges anyagot a " "törlőtoronyba extrudálja." -#: src/libslic3r/PrintConfig.cpp:3001 +#: src/libslic3r/PrintConfig.cpp:3089 msgid "Purging volumes - load/unload volumes" msgstr "Öblítési mennyiségek - betöltött/kiürített téfogat" -#: src/libslic3r/PrintConfig.cpp:3002 +#: src/libslic3r/PrintConfig.cpp:3090 msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " @@ -14439,11 +16343,11 @@ msgstr "" "váltáshoz szükséges mennyiségeket. Ezek az értékek az alábbi teljes öblítési " "mennyiségek létrehozásának egyszerűsítésére szolgálnak." -#: src/libslic3r/PrintConfig.cpp:3008 +#: src/libslic3r/PrintConfig.cpp:3096 msgid "Purging volumes - matrix" msgstr "Öblítési mennyiségek - mátrix" -#: src/libslic3r/PrintConfig.cpp:3009 +#: src/libslic3r/PrintConfig.cpp:3097 msgid "" "This matrix describes volumes (in cubic milimetres) required to purge the " "new filament on the wipe tower for any given pair of tools." @@ -14452,43 +16356,47 @@ msgstr "" "tisztításához szükséges, a törlőtoronyba töltenő térfogatokat " "(köbmilliméterben)." -#: src/libslic3r/PrintConfig.cpp:3018 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Position X" msgstr "X helyzet" -#: src/libslic3r/PrintConfig.cpp:3019 +#: src/libslic3r/PrintConfig.cpp:3107 msgid "X coordinate of the left front corner of a wipe tower" msgstr "A törlőtorony bal első sarkának X-koordinátája" -#: src/libslic3r/PrintConfig.cpp:3025 +#: src/libslic3r/PrintConfig.cpp:3113 msgid "Position Y" msgstr "Y helyzet" -#: src/libslic3r/PrintConfig.cpp:3026 +#: src/libslic3r/PrintConfig.cpp:3114 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "A törlőtorony bal első sarkának Y koordinátája" -#: src/libslic3r/PrintConfig.cpp:3033 +#: src/libslic3r/PrintConfig.cpp:3120 +msgid "Width" +msgstr "Szélesség" + +#: src/libslic3r/PrintConfig.cpp:3121 msgid "Width of a wipe tower" msgstr "A törlőtorony szélessége" -#: src/libslic3r/PrintConfig.cpp:3039 +#: src/libslic3r/PrintConfig.cpp:3127 msgid "Wipe tower rotation angle" msgstr "Törlőtorony forgatási szöge" -#: src/libslic3r/PrintConfig.cpp:3040 +#: src/libslic3r/PrintConfig.cpp:3128 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "Törlőtorony forgatási szöge az x-tengelyhez képest." -#: src/libslic3r/PrintConfig.cpp:3046 src/libslic3r/PrintConfig.cpp:3047 +#: src/libslic3r/PrintConfig.cpp:3134 src/libslic3r/PrintConfig.cpp:3135 msgid "Wipe tower brim width" msgstr "Törlőtorony karima szélesség" -#: src/libslic3r/PrintConfig.cpp:3055 +#: src/libslic3r/PrintConfig.cpp:3143 msgid "Wipe into this object's infill" msgstr "Törlés az objektum kitöltésébe" -#: src/libslic3r/PrintConfig.cpp:3056 +#: src/libslic3r/PrintConfig.cpp:3144 msgid "" "Purging after toolchange will be done inside this object's infills. This " "lowers the amount of waste but may result in longer print time due to " @@ -14498,11 +16406,11 @@ msgstr "" "csökkenti a hulladék mennyiségét, de a további mozgások miatt hosszabb " "nyomtatási időt eredményezhet." -#: src/libslic3r/PrintConfig.cpp:3063 +#: src/libslic3r/PrintConfig.cpp:3151 msgid "Wipe into this object" msgstr "Törlés ebbe az objektumba" -#: src/libslic3r/PrintConfig.cpp:3064 +#: src/libslic3r/PrintConfig.cpp:3152 msgid "" "Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " @@ -14513,19 +16421,19 @@ msgstr "" "emellett csökkenti a nyomtatási időt. Az objektumok színei emiatt keveredni " "fognak." -#: src/libslic3r/PrintConfig.cpp:3070 +#: src/libslic3r/PrintConfig.cpp:3158 msgid "Maximal bridging distance" msgstr "Maximális áthidalási távolság" -#: src/libslic3r/PrintConfig.cpp:3071 +#: src/libslic3r/PrintConfig.cpp:3159 msgid "Maximal distance between supports on sparse infill sections." msgstr "A támaszok közötti maximális távolság a ritkás kitöltésű részeken." -#: src/libslic3r/PrintConfig.cpp:3077 +#: src/libslic3r/PrintConfig.cpp:3165 msgid "XY Size Compensation" msgstr "XY méret kompenzáció" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3167 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" @@ -14535,11 +16443,11 @@ msgstr "" "= befelé, pozitív = kifelé). Ez hasznos lehet a furatok méretének " "finomhangolásához." -#: src/libslic3r/PrintConfig.cpp:3087 +#: src/libslic3r/PrintConfig.cpp:3175 msgid "Z offset" msgstr "Z ofszet" -#: src/libslic3r/PrintConfig.cpp:3088 +#: src/libslic3r/PrintConfig.cpp:3176 msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " "output G-code. It is used to compensate for bad Z endstop position: for " @@ -14552,11 +16460,11 @@ msgstr "" "tárgyasztal felett, akkor állítsa ezt az értéke -0,3-ra (vagy javítsa meg a " "végállást)." -#: src/libslic3r/PrintConfig.cpp:3097 +#: src/libslic3r/PrintConfig.cpp:3185 msgid "Perimeter generator" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3099 +#: src/libslic3r/PrintConfig.cpp:3187 msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " @@ -14564,19 +16472,19 @@ msgid "" "Concentric infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3192 msgid "Classic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3107 +#: src/libslic3r/PrintConfig.cpp:3193 msgid "Arachne" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3199 msgid "Perimeter transition length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3114 +#: src/libslic3r/PrintConfig.cpp:3201 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " @@ -14584,11 +16492,11 @@ msgid "" "be computed based on the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3123 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Perimeter transitioning filter margin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3125 +#: src/libslic3r/PrintConfig.cpp:3212 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -14600,11 +16508,11 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3138 +#: src/libslic3r/PrintConfig.cpp:3225 msgid "Perimeter transitioning threshold angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3140 +#: src/libslic3r/PrintConfig.cpp:3227 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -14613,22 +16521,22 @@ msgid "" "these center perimeters, but may leave gaps or overextrude." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3151 +#: src/libslic3r/PrintConfig.cpp:3238 msgid "Perimeter distribution count" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3153 +#: src/libslic3r/PrintConfig.cpp:3240 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " "in width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3247 msgid "Minimum feature size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3162 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " @@ -14637,76 +16545,247 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3172 +#: src/libslic3r/PrintConfig.cpp:3259 msgid "Minimum perimeter width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3174 +#: src/libslic3r/PrintConfig.cpp:3261 +msgid "" +"Width of the perimeter that will replace thin features (according to the " +"Minimum feature size) of the model. If the Minimum perimeter width is " +"thinner than the thickness of the feature, the perimeter will become as " +"thick as the feature itself. If expressed as a percentage (for example 85%), " +"it will be computed based on the nozzle diameter." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3327 +msgid "Pinhead front diameter" +msgstr "Tűfej elülső átmérője" + +#: src/libslic3r/PrintConfig.cpp:3329 +msgid "Diameter of the pointing side of the head" +msgstr "A fej mutató oldalának átmérője" + +#: src/libslic3r/PrintConfig.cpp:3336 +msgid "Head penetration" +msgstr "Fej benyúlás" + +#: src/libslic3r/PrintConfig.cpp:3338 +msgid "How much the pinhead has to penetrate the model surface" +msgstr "Mennyire kell a tűhegynek benyúlnia a modell felületébe" + +#: src/libslic3r/PrintConfig.cpp:3345 +msgid "Pinhead width" +msgstr "Tűfej szélessége" + +#: src/libslic3r/PrintConfig.cpp:3347 +msgid "Width from the back sphere center to the front sphere center" +msgstr "Szélesség a hátsó gömb középpontjától az első gömb középpontjáig" + +#: src/libslic3r/PrintConfig.cpp:3355 +msgid "Pillar diameter" +msgstr "Pillér átmérője" + +#: src/libslic3r/PrintConfig.cpp:3357 +msgid "Diameter in mm of the support pillars" +msgstr "A támasztó pillérek átmérője mm-ben" + +#: src/libslic3r/PrintConfig.cpp:3365 +msgid "Small pillar diameter percent" +msgstr "Kis pillér átmérője százalék" + +#: src/libslic3r/PrintConfig.cpp:3367 +msgid "" +"The percentage of smaller pillars compared to the normal pillar diameter " +"which are used in problematic areas where a normal pilla cannot fit." +msgstr "" +"A kisebb pillérek normál pillérek átmérőjéhez viszonyított aránya, amelyeket " +"olyan problémás helyeken használnak, ahol egy normál pillér nem fér el." + +#: src/libslic3r/PrintConfig.cpp:3376 +msgid "Max bridges on a pillar" +msgstr "Max hidak egy pilléren" + +#: src/libslic3r/PrintConfig.cpp:3378 +msgid "" +"Maximum number of bridges that can be placed on a pillar. Bridges hold " +"support point pinheads and connect to pillars as small branches." +msgstr "" +"Az egy pilléren elhelyezhető hidak maximális száma. A hidak tartják a " +"támasztópont tűfejeit, és kis ágakként csatlakoznak a pillérekhez." + +#: src/libslic3r/PrintConfig.cpp:3386 +msgid "Max weight on model" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3389 +msgid "" +"Maximum weight of sub-trees that terminate on the model instead of the print " +"bed. The weight is the sum of the lenghts of all branches emanating from the " +"endpoint." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3397 +msgid "Pillar connection mode" +msgstr "Pillér összekötési mód" + +#: src/libslic3r/PrintConfig.cpp:3398 +msgid "" +"Controls the bridge type between two neighboring pillars. Can be zig-zag, " +"cross (double zig-zag) or dynamic which will automatically switch between " +"the first two depending on the distance of the two pillars." +msgstr "" +"Két szomszédos pillér közötti híd típusát határozza meg. Lehet cikk-cakk, " +"kereszt (dupla cikk-cakk) vagy dinamikus, amely automatikusan vált az első " +"kettő között a két pillér távolságától függően." + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Zig-Zag" +msgstr "Cikk-Cakk" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Cross" +msgstr "Kereszt" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Dynamic" +msgstr "Dinamikus" + +#: src/libslic3r/PrintConfig.cpp:3416 +msgid "Pillar widening factor" +msgstr "Pillérszélesítési tényező" + +#: src/libslic3r/PrintConfig.cpp:3420 +msgid "" +"Merging bridges or pillars into another pillars can increase the radius. " +"Zero means no increase, one means full increase. The exact amount of " +"increase is unspecified and can change in the future." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3431 +msgid "Support base diameter" +msgstr "A támasztó alapjának átmérője" + +#: src/libslic3r/PrintConfig.cpp:3433 +msgid "Diameter in mm of the pillar base" +msgstr "A pillér alapjának átmérője mm-ben" + +#: src/libslic3r/PrintConfig.cpp:3441 +msgid "Support base height" +msgstr "A támasztó alapjának magassága" + +#: src/libslic3r/PrintConfig.cpp:3443 +msgid "The height of the pillar base cone" +msgstr "A pillér alapkúpjának magassága" + +#: src/libslic3r/PrintConfig.cpp:3450 +msgid "Support base safety distance" +msgstr "A támasztó alapjának biztonsági távolsága" + +#: src/libslic3r/PrintConfig.cpp:3453 +msgid "" +"The minimum distance of the pillar base from the model in mm. Makes sense in " +"zero elevation mode where a gap according to this parameter is inserted " +"between the model and the pad." +msgstr "" +"Az pillér alapjának legkisebb távolsága a modelltől mm-ben. Értelemszerűen a " +"nulla magasságú módban van értelme, ahol a modell és a pillér közé egy ennek " +"a paraméternek megfelelő rés kerül beillesztésre." + +#: src/libslic3r/PrintConfig.cpp:3463 +msgid "Critical angle" +msgstr "Kritikus szög" + +#: src/libslic3r/PrintConfig.cpp:3465 +msgid "The default angle for connecting support sticks and junctions." +msgstr "" +"Az alapértelmezett szög a támasztópálcák és csomópontok összekötéséhez." + +#: src/libslic3r/PrintConfig.cpp:3473 +msgid "Max bridge length" +msgstr "Híd max. hossza" + +#: src/libslic3r/PrintConfig.cpp:3475 +msgid "The max length of a bridge" +msgstr "A híd maximális hossza" + +#: src/libslic3r/PrintConfig.cpp:3487 +msgid "Max pillar linking distance" +msgstr "Maximális oszlop áthidalási távolság" + +#: src/libslic3r/PrintConfig.cpp:3489 +msgid "" +"The max distance of two pillars to get linked with each other. A zero value " +"will prohibit pillar cascading." +msgstr "" +"Két oszlop maximális távolsága, amelyeket még össze lehet kötni egymással. A " +"nulla érték tiltja az oszlopok kaszkádosítását." + +#: src/libslic3r/PrintConfig.cpp:3499 msgid "" -"Width of the perimeter that will replace thin features (according to the " -"Minimum feature size) of the model. If the Minimum perimeter width is " -"thinner than the thickness of the feature, the perimeter will become as " -"thick as the feature itself. If expressed as a percentage (for example 85%), " -"it will be computed based on the nozzle diameter." +"How much the supports should lift up the supported object. If \"Pad around " +"object\" is enabled, this value is ignored." msgstr "" +"Mennyire emeljék fel a támasztók a megtámasztott objektumot. Ha a \"Párna az " +"objektum körül\" opció engedélyezve van, ez az érték nem számít." -#: src/libslic3r/PrintConfig.cpp:3242 +#: src/libslic3r/PrintConfig.cpp:3515 msgid "Display width" msgstr "Kijelző szélesség" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3516 msgid "Width of the display" msgstr "Kijelző szélessége" -#: src/libslic3r/PrintConfig.cpp:3248 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "Display height" msgstr "Kijelző magasság" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3522 msgid "Height of the display" msgstr "Kijelző magassága" -#: src/libslic3r/PrintConfig.cpp:3254 +#: src/libslic3r/PrintConfig.cpp:3527 msgid "Number of pixels in" msgstr "Pixelek száma" -#: src/libslic3r/PrintConfig.cpp:3256 +#: src/libslic3r/PrintConfig.cpp:3529 msgid "Number of pixels in X" msgstr "Pixelek száma X irányban" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3535 msgid "Number of pixels in Y" msgstr "Pixelek száma Y irányban" -#: src/libslic3r/PrintConfig.cpp:3267 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Display horizontal mirroring" msgstr "Kijelző vízszintes tükrözése" -#: src/libslic3r/PrintConfig.cpp:3268 +#: src/libslic3r/PrintConfig.cpp:3541 msgid "Mirror horizontally" msgstr "Tükrözés vízszintesen" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3542 msgid "Enable horizontal mirroring of output images" msgstr "A kimeneti képek vízszintes tükrözése" -#: src/libslic3r/PrintConfig.cpp:3274 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Display vertical mirroring" msgstr "Kijelző függőleges tükrözése" -#: src/libslic3r/PrintConfig.cpp:3275 +#: src/libslic3r/PrintConfig.cpp:3548 msgid "Mirror vertically" msgstr "Tükrözés függőlegesen" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "Enable vertical mirroring of output images" msgstr "A kimeneti képe függőleges tükrözése" -#: src/libslic3r/PrintConfig.cpp:3281 +#: src/libslic3r/PrintConfig.cpp:3554 msgid "Display orientation" msgstr "Kijelző tájolás" -#: src/libslic3r/PrintConfig.cpp:3282 +#: src/libslic3r/PrintConfig.cpp:3555 msgid "" "Set the actual LCD display orientation inside the SLA printer. Portrait mode " "will flip the meaning of display width and height parameters and the output " @@ -14716,55 +16795,55 @@ msgstr "" "mód megfordítja a kijelző szélességi és magassági paramétereinek jelentését, " "és a kimeneti képek 90 fokkal el lesznek forgatva." -#: src/libslic3r/PrintConfig.cpp:3288 +#: src/libslic3r/PrintConfig.cpp:3559 msgid "Landscape" msgstr "Tájkép" -#: src/libslic3r/PrintConfig.cpp:3289 +#: src/libslic3r/PrintConfig.cpp:3560 msgid "Portrait" msgstr "Portré" -#: src/libslic3r/PrintConfig.cpp:3294 src/libslic3r/PrintConfig.cpp:3929 +#: src/libslic3r/PrintConfig.cpp:3566 src/libslic3r/PrintConfig.cpp:4058 msgid "Fast" msgstr "Gyors" -#: src/libslic3r/PrintConfig.cpp:3295 +#: src/libslic3r/PrintConfig.cpp:3567 msgid "Fast tilt" msgstr "Gyors billentés" -#: src/libslic3r/PrintConfig.cpp:3296 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Time of the fast tilt" msgstr "A gyors billenés időtartama" -#: src/libslic3r/PrintConfig.cpp:3303 src/libslic3r/PrintConfig.cpp:3928 +#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:4057 msgid "Slow" msgstr "Lassú" -#: src/libslic3r/PrintConfig.cpp:3304 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Slow tilt" msgstr "Lassú billentés" -#: src/libslic3r/PrintConfig.cpp:3305 +#: src/libslic3r/PrintConfig.cpp:3577 msgid "Time of the slow tilt" msgstr "A lassú billentés időtartama" -#: src/libslic3r/PrintConfig.cpp:3312 src/libslic3r/PrintConfig.cpp:3930 +#: src/libslic3r/PrintConfig.cpp:3584 src/libslic3r/PrintConfig.cpp:4059 msgid "High viscosity" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3313 +#: src/libslic3r/PrintConfig.cpp:3585 msgid "Tilt for high viscosity resin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3314 +#: src/libslic3r/PrintConfig.cpp:3586 msgid "Time of the super slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3321 +#: src/libslic3r/PrintConfig.cpp:3593 msgid "Area fill" msgstr "Felület kitöltés" -#: src/libslic3r/PrintConfig.cpp:3322 +#: src/libslic3r/PrintConfig.cpp:3594 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -14775,40 +16854,40 @@ msgstr "" "meghaladja a megadott értéket, \n" "akkor lassú billenés, ellenkező esetben gyors billenés fog történni" -#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 -#: src/libslic3r/PrintConfig.cpp:3331 +#: src/libslic3r/PrintConfig.cpp:3601 src/libslic3r/PrintConfig.cpp:3602 +#: src/libslic3r/PrintConfig.cpp:3603 msgid "Printer scaling correction" msgstr "Nyomtató méretkorrekciója" -#: src/libslic3r/PrintConfig.cpp:3337 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3609 src/libslic3r/PrintConfig.cpp:3611 msgid "Printer scaling correction in X axis" msgstr "Nyomtató méretkorrekciója az X tengelyen" -#: src/libslic3r/PrintConfig.cpp:3338 +#: src/libslic3r/PrintConfig.cpp:3610 msgid "Printer scaling X axis correction" msgstr "Nyomtató méretkorrekciója az X tengelyen" -#: src/libslic3r/PrintConfig.cpp:3345 src/libslic3r/PrintConfig.cpp:3347 +#: src/libslic3r/PrintConfig.cpp:3617 src/libslic3r/PrintConfig.cpp:3619 msgid "Printer scaling correction in Y axis" msgstr "Nyomtató méretkorrekciója az Y tengelyen" -#: src/libslic3r/PrintConfig.cpp:3346 +#: src/libslic3r/PrintConfig.cpp:3618 msgid "Printer scaling Y axis correction" msgstr "Printer scaling correction in Y axis" -#: src/libslic3r/PrintConfig.cpp:3353 src/libslic3r/PrintConfig.cpp:3355 +#: src/libslic3r/PrintConfig.cpp:3625 src/libslic3r/PrintConfig.cpp:3627 msgid "Printer scaling correction in Z axis" msgstr "Nyomtató méretkorrekciója a Z tengelyen" -#: src/libslic3r/PrintConfig.cpp:3354 +#: src/libslic3r/PrintConfig.cpp:3626 msgid "Printer scaling Z axis correction" msgstr "Nyomtató méretkorrekciója a Z tengelyen" -#: src/libslic3r/PrintConfig.cpp:3361 src/libslic3r/PrintConfig.cpp:3362 +#: src/libslic3r/PrintConfig.cpp:3633 src/libslic3r/PrintConfig.cpp:3634 msgid "Printer absolute correction" msgstr "Nyomtató abszolút korrekció" -#: src/libslic3r/PrintConfig.cpp:3363 +#: src/libslic3r/PrintConfig.cpp:3635 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." @@ -14816,21 +16895,21 @@ msgstr "" "A szeletelt 2D poligonokat megnöveli vagy összezsugorítja a korrekció " "előjelének megfelelően." -#: src/libslic3r/PrintConfig.cpp:3369 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Elephant foot minimum width" msgstr "Elefántláb minimális szélesség" -#: src/libslic3r/PrintConfig.cpp:3371 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" "Az elefántláb-kompenzáció során megőrzendő jellemzők minimális szélessége." -#: src/libslic3r/PrintConfig.cpp:3378 src/libslic3r/PrintConfig.cpp:3379 +#: src/libslic3r/PrintConfig.cpp:3650 src/libslic3r/PrintConfig.cpp:3651 msgid "Printer gamma correction" msgstr "Nyomtató Gamma korrekció" -#: src/libslic3r/PrintConfig.cpp:3380 +#: src/libslic3r/PrintConfig.cpp:3652 msgid "" "This will apply a gamma correction to the rasterized 2D polygons. A gamma " "value of zero means thresholding with the threshold in the middle. This " @@ -14841,43 +16920,53 @@ msgstr "" "viselkedés megszünteti az élsimítást anélkül, hogy a sokszögek lyukai " "elvesznének." -#: src/libslic3r/PrintConfig.cpp:3399 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3671 src/libslic3r/PrintConfig.cpp:3672 msgid "SLA material type" msgstr "SLA anyag típus" -#: src/libslic3r/PrintConfig.cpp:3411 src/libslic3r/PrintConfig.cpp:3412 +#: src/libslic3r/PrintConfig.cpp:3679 src/libslic3r/PrintConfig.cpp:3680 msgid "Initial layer height" msgstr "Első réteg magasság" -#: src/libslic3r/PrintConfig.cpp:3418 src/libslic3r/PrintConfig.cpp:3419 +#: src/libslic3r/PrintConfig.cpp:3686 +msgid "Idle temperature" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3687 +msgid "" +"Nozzle temperature when the tool is currently not used in multi-tool setups." +"This is only used when 'Ooze prevention' is active in Print Settings." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3695 src/libslic3r/PrintConfig.cpp:3696 msgid "Bottle volume" msgstr "Flakon térfogata" -#: src/libslic3r/PrintConfig.cpp:3420 +#: src/libslic3r/PrintConfig.cpp:3697 msgid "ml" msgstr "ml" -#: src/libslic3r/PrintConfig.cpp:3425 src/libslic3r/PrintConfig.cpp:3426 +#: src/libslic3r/PrintConfig.cpp:3702 src/libslic3r/PrintConfig.cpp:3703 msgid "Bottle weight" msgstr "A flakon súlya" -#: src/libslic3r/PrintConfig.cpp:3427 +#: src/libslic3r/PrintConfig.cpp:3704 msgid "kg" msgstr "kg" -#: src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "g/ml" msgstr "g/ml" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3718 msgid "money/bottle" msgstr "pénz/flakon" -#: src/libslic3r/PrintConfig.cpp:3446 +#: src/libslic3r/PrintConfig.cpp:3723 msgid "Faded layers" msgstr "Áttűnő rétegek" -#: src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3724 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" @@ -14885,262 +16974,120 @@ msgstr "" "A szükséges rétegek száma a kezdeti expozíciós időről az expozíciós időre " "való átmenethez" -#: src/libslic3r/PrintConfig.cpp:3454 src/libslic3r/PrintConfig.cpp:3455 +#: src/libslic3r/PrintConfig.cpp:3731 src/libslic3r/PrintConfig.cpp:3732 msgid "Minimum exposure time" msgstr "Minimális expozíciós idő" -#: src/libslic3r/PrintConfig.cpp:3462 src/libslic3r/PrintConfig.cpp:3463 +#: src/libslic3r/PrintConfig.cpp:3739 src/libslic3r/PrintConfig.cpp:3740 msgid "Maximum exposure time" msgstr "Maximum expozíciós idő" -#: src/libslic3r/PrintConfig.cpp:3470 src/libslic3r/PrintConfig.cpp:3471 +#: src/libslic3r/PrintConfig.cpp:3747 src/libslic3r/PrintConfig.cpp:3748 msgid "Exposure time" msgstr "Expozíciós idő" -#: src/libslic3r/PrintConfig.cpp:3477 src/libslic3r/PrintConfig.cpp:3478 +#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3755 msgid "Minimum initial exposure time" msgstr "Minimális kezdeti expozíciós idő" -#: src/libslic3r/PrintConfig.cpp:3485 src/libslic3r/PrintConfig.cpp:3486 +#: src/libslic3r/PrintConfig.cpp:3762 src/libslic3r/PrintConfig.cpp:3763 msgid "Maximum initial exposure time" msgstr "Maximum kezdeti expozíciós idő" -#: src/libslic3r/PrintConfig.cpp:3493 src/libslic3r/PrintConfig.cpp:3494 +#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3771 msgid "Initial exposure time" msgstr "Kezdeti expozíciós idő" -#: src/libslic3r/PrintConfig.cpp:3500 src/libslic3r/PrintConfig.cpp:3501 +#: src/libslic3r/PrintConfig.cpp:3777 src/libslic3r/PrintConfig.cpp:3778 msgid "Correction for expansion" msgstr "Terjeszkedés miatti korrekció" -#: src/libslic3r/PrintConfig.cpp:3507 src/libslic3r/PrintConfig.cpp:3508 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3785 msgid "Correction for expansion in X axis" msgstr "Terjeszkedés miatti korrekció az X tengelyen" -#: src/libslic3r/PrintConfig.cpp:3514 src/libslic3r/PrintConfig.cpp:3515 +#: src/libslic3r/PrintConfig.cpp:3791 src/libslic3r/PrintConfig.cpp:3792 msgid "Correction for expansion in Y axis" msgstr "Terjeszkedés miatti korrekció az Y tengelyen" -#: src/libslic3r/PrintConfig.cpp:3521 src/libslic3r/PrintConfig.cpp:3522 +#: src/libslic3r/PrintConfig.cpp:3798 src/libslic3r/PrintConfig.cpp:3799 msgid "Correction for expansion in Z axis" msgstr "Terjeszkedés miatti korrekció az Z tengelyen" -#: src/libslic3r/PrintConfig.cpp:3528 +#: src/libslic3r/PrintConfig.cpp:3805 msgid "SLA print material notes" msgstr "SLA anyag megjegyzések" -#: src/libslic3r/PrintConfig.cpp:3529 +#: src/libslic3r/PrintConfig.cpp:3806 msgid "You can put your notes regarding the SLA print material here." msgstr "Az SLA anyaggal kapcsolatos jegyzeteit ide írhatja." -#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3552 +#: src/libslic3r/PrintConfig.cpp:3818 src/libslic3r/PrintConfig.cpp:3829 msgid "Default SLA material profile" msgstr "Alapértelmezett SLA anyagprofil" -#: src/libslic3r/PrintConfig.cpp:3563 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "Generate supports" msgstr "Támasztók generálása" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3842 msgid "Generate supports for the models" msgstr "Támasztók generálása a modellekhez" -#: src/libslic3r/PrintConfig.cpp:3570 -msgid "Pinhead front diameter" -msgstr "Tűfej elülső átmérője" - -#: src/libslic3r/PrintConfig.cpp:3572 -msgid "Diameter of the pointing side of the head" -msgstr "A fej mutató oldalának átmérője" - -#: src/libslic3r/PrintConfig.cpp:3579 -msgid "Head penetration" -msgstr "Fej benyúlás" - -#: src/libslic3r/PrintConfig.cpp:3581 -msgid "How much the pinhead has to penetrate the model surface" -msgstr "Mennyire kell a tűhegynek benyúlnia a modell felületébe" - -#: src/libslic3r/PrintConfig.cpp:3588 -msgid "Pinhead width" -msgstr "Tűfej szélessége" - -#: src/libslic3r/PrintConfig.cpp:3590 -msgid "Width from the back sphere center to the front sphere center" -msgstr "Szélesség a hátsó gömb középpontjától az első gömb középpontjáig" - -#: src/libslic3r/PrintConfig.cpp:3598 -msgid "Pillar diameter" -msgstr "Pillér átmérője" - -#: src/libslic3r/PrintConfig.cpp:3600 -msgid "Diameter in mm of the support pillars" -msgstr "A támasztó pillérek átmérője mm-ben" - -#: src/libslic3r/PrintConfig.cpp:3608 -msgid "Small pillar diameter percent" -msgstr "Kis pillér átmérője százalék" - -#: src/libslic3r/PrintConfig.cpp:3610 -msgid "" -"The percentage of smaller pillars compared to the normal pillar diameter " -"which are used in problematic areas where a normal pilla cannot fit." -msgstr "" -"A kisebb pillérek normál pillérek átmérőjéhez viszonyított aránya, amelyeket " -"olyan problémás helyeken használnak, ahol egy normál pillér nem fér el." - -#: src/libslic3r/PrintConfig.cpp:3619 -msgid "Max bridges on a pillar" -msgstr "Max hidak egy pilléren" - -#: src/libslic3r/PrintConfig.cpp:3621 -msgid "" -"Maximum number of bridges that can be placed on a pillar. Bridges hold " -"support point pinheads and connect to pillars as small branches." -msgstr "" -"Az egy pilléren elhelyezhető hidak maximális száma. A hidak tartják a " -"támasztópont tűfejeit, és kis ágakként csatlakoznak a pillérekhez." - -#: src/libslic3r/PrintConfig.cpp:3629 -msgid "Pillar connection mode" -msgstr "Pillér összekötési mód" - -#: src/libslic3r/PrintConfig.cpp:3630 -msgid "" -"Controls the bridge type between two neighboring pillars. Can be zig-zag, " -"cross (double zig-zag) or dynamic which will automatically switch between " -"the first two depending on the distance of the two pillars." -msgstr "" -"Két szomszédos pillér közötti híd típusát határozza meg. Lehet cikk-cakk, " -"kereszt (dupla cikk-cakk) vagy dinamikus, amely automatikusan vált az első " -"kettő között a két pillér távolságától függően." - -#: src/libslic3r/PrintConfig.cpp:3638 -msgid "Zig-Zag" -msgstr "Cikk-Cakk" - -#: src/libslic3r/PrintConfig.cpp:3639 -msgid "Cross" -msgstr "Kereszt" - -#: src/libslic3r/PrintConfig.cpp:3640 -msgid "Dynamic" -msgstr "Dinamikus" - -#: src/libslic3r/PrintConfig.cpp:3652 -msgid "Pillar widening factor" -msgstr "Pillérszélesítési tényező" - -#: src/libslic3r/PrintConfig.cpp:3654 -msgid "" -"Merging bridges or pillars into another pillars can increase the radius. " -"Zero means no increase, one means full increase." +#: src/libslic3r/PrintConfig.cpp:3847 +msgid "Support tree type" msgstr "" -"A hidak vagy pillérek egy másik pillérbe való beolvasztása növelheti a " -"sugarat. A nulla azt jelenti, hogy nincs növelés, az egy pedig teljes " -"növelést jelent." - -#: src/libslic3r/PrintConfig.cpp:3663 -msgid "Support base diameter" -msgstr "A támasztó alapjának átmérője" - -#: src/libslic3r/PrintConfig.cpp:3665 -msgid "Diameter in mm of the pillar base" -msgstr "A pillér alapjának átmérője mm-ben" - -#: src/libslic3r/PrintConfig.cpp:3673 -msgid "Support base height" -msgstr "A támasztó alapjának magassága" - -#: src/libslic3r/PrintConfig.cpp:3675 -msgid "The height of the pillar base cone" -msgstr "A pillér alapkúpjának magassága" - -#: src/libslic3r/PrintConfig.cpp:3682 -msgid "Support base safety distance" -msgstr "A támasztó alapjának biztonsági távolsága" -#: src/libslic3r/PrintConfig.cpp:3685 -msgid "" -"The minimum distance of the pillar base from the model in mm. Makes sense in " -"zero elevation mode where a gap according to this parameter is inserted " -"between the model and the pad." +#: src/libslic3r/PrintConfig.cpp:3848 +msgid "Support tree building strategy" msgstr "" -"Az pillér alapjának legkisebb távolsága a modelltől mm-ben. Értelemszerűen a " -"nulla magasságú módban van értelme, ahol a modell és a pillér közé egy ennek " -"a paraméternek megfelelő rés kerül beillesztésre." -#: src/libslic3r/PrintConfig.cpp:3695 -msgid "Critical angle" -msgstr "Kritikus szög" - -#: src/libslic3r/PrintConfig.cpp:3697 -msgid "The default angle for connecting support sticks and junctions." +#: src/libslic3r/PrintConfig.cpp:3851 +msgid "Branching (experimental)" msgstr "" -"Az alapértelmezett szög a támasztópálcák és csomópontok összekötéséhez." - -#: src/libslic3r/PrintConfig.cpp:3705 -msgid "Max bridge length" -msgstr "Híd max. hossza" - -#: src/libslic3r/PrintConfig.cpp:3707 -msgid "The max length of a bridge" -msgstr "A híd maximális hossza" - -#: src/libslic3r/PrintConfig.cpp:3714 -msgid "Max pillar linking distance" -msgstr "Maximális oszlop áthidalási távolság" -#: src/libslic3r/PrintConfig.cpp:3716 -msgid "" -"The max distance of two pillars to get linked with each other. A zero value " -"will prohibit pillar cascading." +#: src/libslic3r/PrintConfig.cpp:3860 +msgid "Support only in enforced regions" msgstr "" -"Két oszlop maximális távolsága, amelyeket még össze lehet kötni egymással. A " -"nulla érték tiltja az oszlopok kaszkádosítását." -#: src/libslic3r/PrintConfig.cpp:3726 -msgid "" -"How much the supports should lift up the supported object. If \"Pad around " -"object\" is enabled, this value is ignored." +#: src/libslic3r/PrintConfig.cpp:3862 +msgid "Only create support if it lies in a support enforcer." msgstr "" -"Mennyire emeljék fel a támasztók a megtámasztott objektumot. Ha a \"Párna az " -"objektum körül\" opció engedélyezve van, ez az érték nem számít." -#: src/libslic3r/PrintConfig.cpp:3737 +#: src/libslic3r/PrintConfig.cpp:3869 msgid "This is a relative measure of support points density." msgstr "Ez a támasztási pontok sűrűségének relatív mérőszáma." -#: src/libslic3r/PrintConfig.cpp:3743 +#: src/libslic3r/PrintConfig.cpp:3875 msgid "Minimal distance of the support points" msgstr "A támasztási pontok minimális távolsága" -#: src/libslic3r/PrintConfig.cpp:3745 +#: src/libslic3r/PrintConfig.cpp:3877 msgid "No support points will be placed closer than this threshold." msgstr "" "Nem kerülnek támasztási pontok ennél a küszöbértéknél közelebb egymáshoz." -#: src/libslic3r/PrintConfig.cpp:3751 +#: src/libslic3r/PrintConfig.cpp:3883 msgid "Use pad" msgstr "Párna használata" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3885 msgid "Add a pad underneath the supported model" msgstr "Párna hozzáadása a támasztott modell alá" -#: src/libslic3r/PrintConfig.cpp:3758 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "Pad wall thickness" msgstr "Párna falvastagság" -#: src/libslic3r/PrintConfig.cpp:3760 +#: src/libslic3r/PrintConfig.cpp:3892 msgid "The thickness of the pad and its optional cavity walls." msgstr "A párna és az opcionális üreg falainak vastagsága." -#: src/libslic3r/PrintConfig.cpp:3768 +#: src/libslic3r/PrintConfig.cpp:3900 msgid "Pad wall height" msgstr "Párna fal magassága" -#: src/libslic3r/PrintConfig.cpp:3769 +#: src/libslic3r/PrintConfig.cpp:3901 msgid "" "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " "when enabling this feature, as some resins may produce an extreme suction " @@ -15152,19 +17099,19 @@ msgstr "" "szívóhatást fejthetnek ki az üregben, ami megnehezíti a nyomtatás lehúzását " "a kádfóliáról." -#: src/libslic3r/PrintConfig.cpp:3782 +#: src/libslic3r/PrintConfig.cpp:3914 msgid "Pad brim size" msgstr "Párna karima mérete" -#: src/libslic3r/PrintConfig.cpp:3783 +#: src/libslic3r/PrintConfig.cpp:3915 msgid "How far should the pad extend around the contained geometry" msgstr "Milyen messzire terjedjen ki a párna az körbevett geometria körül" -#: src/libslic3r/PrintConfig.cpp:3793 +#: src/libslic3r/PrintConfig.cpp:3925 msgid "Max merge distance" msgstr "Maximális összeolvadási távolság" -#: src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3927 msgid "" "Some objects can get along with a few smaller pads instead of a single big " "one. This parameter defines how far the center of two smaller pads should " @@ -15175,11 +17122,11 @@ msgstr "" "milyen messze legyen egymástól. Ha ennél közelebb vannak egymáshoz, akkor " "egy párnává olvadnak össze." -#: src/libslic3r/PrintConfig.cpp:3815 +#: src/libslic3r/PrintConfig.cpp:3947 msgid "Pad wall slope" msgstr "Párnafal meredekség" -#: src/libslic3r/PrintConfig.cpp:3817 +#: src/libslic3r/PrintConfig.cpp:3949 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." @@ -15187,80 +17134,80 @@ msgstr "" "A párnafal meredeksége a tárgyasztal síkjához képest. A 90 fok egyenes falat " "jelent." -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3960 msgid "Create pad around object and ignore the support elevation" msgstr "" "Hozzon létre párnát az objektum körül és hagyja figyelmen kívül a támasztók " "magasságát" -#: src/libslic3r/PrintConfig.cpp:3833 +#: src/libslic3r/PrintConfig.cpp:3965 msgid "Pad around object everywhere" msgstr "Párna az objektum körül mindenhol" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3967 msgid "Force pad around object everywhere" msgstr "Párna kényszerítése az objektum körül mindenhol" -#: src/libslic3r/PrintConfig.cpp:3840 +#: src/libslic3r/PrintConfig.cpp:3972 msgid "Pad object gap" msgstr "Párna objektum hézag" -#: src/libslic3r/PrintConfig.cpp:3842 +#: src/libslic3r/PrintConfig.cpp:3974 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "" "Az objektum alja és a generált párna közötti hézag nulla magasságú módban." -#: src/libslic3r/PrintConfig.cpp:3851 +#: src/libslic3r/PrintConfig.cpp:3983 msgid "Pad object connector stride" msgstr "Párna objektum összekötő lépésköz" -#: src/libslic3r/PrintConfig.cpp:3853 +#: src/libslic3r/PrintConfig.cpp:3985 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "Az objektumot és a generált párnát összekötő pálcák közötti távolság." -#: src/libslic3r/PrintConfig.cpp:3860 +#: src/libslic3r/PrintConfig.cpp:3992 msgid "Pad object connector width" msgstr "Párna objektum összekötő szélessége" -#: src/libslic3r/PrintConfig.cpp:3862 +#: src/libslic3r/PrintConfig.cpp:3994 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "" "Az objektumot és a generált párnát összekötő csatlakozó pálcák szélessége." -#: src/libslic3r/PrintConfig.cpp:3869 +#: src/libslic3r/PrintConfig.cpp:4001 msgid "Pad object connector penetration" msgstr "Párna objektum összekötő benyúlása" -#: src/libslic3r/PrintConfig.cpp:3872 +#: src/libslic3r/PrintConfig.cpp:4004 msgid "How much should the tiny connectors penetrate into the model body." msgstr "Az apró összekötőknek mennyire kell benyúlniuk a modell testébe." -#: src/libslic3r/PrintConfig.cpp:3879 +#: src/libslic3r/PrintConfig.cpp:4011 msgid "Enable hollowing" msgstr "Üregesítés engedélyezése" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:4013 msgid "Hollow out a model to have an empty interior" msgstr "Üregesítse a modellt, hogy üres legyen a belseje" -#: src/libslic3r/PrintConfig.cpp:3886 +#: src/libslic3r/PrintConfig.cpp:4018 msgid "Wall thickness" msgstr "Falvastagság" -#: src/libslic3r/PrintConfig.cpp:3888 +#: src/libslic3r/PrintConfig.cpp:4020 msgid "Minimum wall thickness of a hollowed model." msgstr "Az üreges modell minimális falvastagsága." -#: src/libslic3r/PrintConfig.cpp:3896 +#: src/libslic3r/PrintConfig.cpp:4028 msgid "Accuracy" msgstr "Pontosság" -#: src/libslic3r/PrintConfig.cpp:3898 +#: src/libslic3r/PrintConfig.cpp:4030 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." @@ -15268,7 +17215,7 @@ msgstr "" "Teljesítmény kontra számítási pontosság. Az alacsonyabb értékek nemkívánatos " "műtermékeket okozhatnak." -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:4040 msgid "" "Hollowing is done in two steps: first, an imaginary interior is calculated " "deeper (offset plus the closing distance) in the object and then it's " @@ -15282,11 +17229,11 @@ msgstr "" "lekerekíti a belső teret. Nulla értéknél a belső tér leginkább a külsőhöz " "fog hasonlítani." -#: src/libslic3r/PrintConfig.cpp:3920 +#: src/libslic3r/PrintConfig.cpp:4052 msgid "Print speed" msgstr "Nyomtatási sebesség" -#: src/libslic3r/PrintConfig.cpp:3922 +#: src/libslic3r/PrintConfig.cpp:4054 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " @@ -15296,65 +17243,93 @@ msgstr "" "nyomtatási profilra lehet szükség. Lelassítja a billenőmozgást, és " "késleltetést ad hozzá az expozíció előtt." -#: src/libslic3r/PrintConfig.cpp:4390 +#: src/libslic3r/PrintConfig.cpp:4065 +msgid "Format of the output SLA archive" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4070 +msgid "SLA output precision" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4071 +msgid "Minimum resolution in nanometers" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4542 msgid "Export OBJ" msgstr "OBJ exportálása" -#: src/libslic3r/PrintConfig.cpp:4391 +#: src/libslic3r/PrintConfig.cpp:4543 msgid "Export the model(s) as OBJ." msgstr "Modell(ek) exportálása OBJ formátumban." -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4554 msgid "Export SLA" msgstr "SLA exportálása" -#: src/libslic3r/PrintConfig.cpp:4403 +#: src/libslic3r/PrintConfig.cpp:4555 msgid "Slice the model and export SLA printing layers as PNG." msgstr "" "Szeletelje fel a modellt és exportálja az SLA nyomtatási rétegeket PNG " "formátumban." -#: src/libslic3r/PrintConfig.cpp:4408 +#: src/libslic3r/PrintConfig.cpp:4560 msgid "Export 3MF" msgstr "3MF exportálása" -#: src/libslic3r/PrintConfig.cpp:4409 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Export the model(s) as 3MF." msgstr "Modell(ek) exportálása 3MF formátumban." -#: src/libslic3r/PrintConfig.cpp:4413 +#: src/libslic3r/PrintConfig.cpp:4565 msgid "Export AMF" msgstr "AMF exportálása" -#: src/libslic3r/PrintConfig.cpp:4414 +#: src/libslic3r/PrintConfig.cpp:4566 msgid "Export the model(s) as AMF." msgstr "Modell(ek) exportálása AMF formátumban." -#: src/libslic3r/PrintConfig.cpp:4418 +#: src/libslic3r/PrintConfig.cpp:4570 msgid "Export STL" msgstr "STL exportálása" -#: src/libslic3r/PrintConfig.cpp:4419 +#: src/libslic3r/PrintConfig.cpp:4571 msgid "Export the model(s) as STL." msgstr "Modell(ek) exportálása STL formátumban." -#: src/libslic3r/PrintConfig.cpp:4424 +#: src/libslic3r/PrintConfig.cpp:4576 msgid "Slice the model and export toolpaths as G-code." msgstr "Szeletelje a modellt és exportálja a szerszámpályákat G-kódként." -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4581 msgid "G-code viewer" msgstr "G-kód nézegető" -#: src/libslic3r/PrintConfig.cpp:4430 +#: src/libslic3r/PrintConfig.cpp:4582 msgid "Visualize an already sliced and saved G-code" msgstr "Egy már felszeletelt és elmentett G-kód megjelenítése" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4588 +msgid "OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4589 +msgid "Select the specified OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4594 +msgid "OpenGL debug output" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4595 +msgid "Activate OpenGL debug output on graphic cards which support it" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4601 msgid "Slice" msgstr "Szeletelés_" -#: src/libslic3r/PrintConfig.cpp:4436 +#: src/libslic3r/PrintConfig.cpp:4602 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." @@ -15362,69 +17337,73 @@ msgstr "" "A modell szeletelése FFF-, vagy SLA-ként a printer_technology konfigurációs " "érték alapján." -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4607 msgid "Help" msgstr "Súgó" -#: src/libslic3r/PrintConfig.cpp:4442 +#: src/libslic3r/PrintConfig.cpp:4608 msgid "Show this help." msgstr "Ennek a súgónak a megjelenítése." -#: src/libslic3r/PrintConfig.cpp:4447 +#: src/libslic3r/PrintConfig.cpp:4613 msgid "Help (FFF options)" msgstr "Súgó (FFF lehetőségek)" -#: src/libslic3r/PrintConfig.cpp:4448 +#: src/libslic3r/PrintConfig.cpp:4614 msgid "Show the full list of print/G-code configuration options." msgstr "" "A nyomtatási/G-kód konfigurációs lehetőségek teljes listájának megjelenítése." -#: src/libslic3r/PrintConfig.cpp:4452 +#: src/libslic3r/PrintConfig.cpp:4618 msgid "Help (SLA options)" msgstr "Súgó (SLA lehetőségek)" -#: src/libslic3r/PrintConfig.cpp:4453 +#: src/libslic3r/PrintConfig.cpp:4619 msgid "Show the full list of SLA print configuration options." msgstr "" "Az SLA nyomtatási konfigurációs beállítások teljes listájának megjelenítése." -#: src/libslic3r/PrintConfig.cpp:4457 +#: src/libslic3r/PrintConfig.cpp:4623 msgid "Output Model Info" msgstr "Modell Információ Kimenet" -#: src/libslic3r/PrintConfig.cpp:4458 +#: src/libslic3r/PrintConfig.cpp:4624 msgid "Write information about the model to the console." msgstr "A modellre vonatkozó információk írása a konzolra." -#: src/libslic3r/PrintConfig.cpp:4462 +#: src/libslic3r/PrintConfig.cpp:4628 msgid "Save config file" msgstr "Konfigurációs fájl mentése" -#: src/libslic3r/PrintConfig.cpp:4463 +#: src/libslic3r/PrintConfig.cpp:4629 msgid "Save configuration to the specified file." msgstr "A konfiguráció mentése a megadott fájlba." -#: src/libslic3r/PrintConfig.cpp:4473 +#: src/libslic3r/PrintConfig.cpp:4639 msgid "Align XY" msgstr "XY igazítása" -#: src/libslic3r/PrintConfig.cpp:4474 +#: src/libslic3r/PrintConfig.cpp:4640 msgid "Align the model to the given point." msgstr "A modell igazítása egy megadott ponthoz." -#: src/libslic3r/PrintConfig.cpp:4479 +#: src/libslic3r/PrintConfig.cpp:4645 msgid "Cut model at the given Z." msgstr "A modellt elvágása egy megadott Z-nél." -#: src/libslic3r/PrintConfig.cpp:4501 +#: src/libslic3r/PrintConfig.cpp:4666 +msgid "Center" +msgstr "Középre igazítás_" + +#: src/libslic3r/PrintConfig.cpp:4667 msgid "Center the print around the given center." msgstr "A nyomtatás középre igazítása a megadott középpont körül." -#: src/libslic3r/PrintConfig.cpp:4505 +#: src/libslic3r/PrintConfig.cpp:4671 msgid "Don't arrange" msgstr "Ne rendezzen" -#: src/libslic3r/PrintConfig.cpp:4506 +#: src/libslic3r/PrintConfig.cpp:4672 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." @@ -15432,11 +17411,11 @@ msgstr "" "Az egyesítés előtt ne rendezze át az adott modelleket, és tartsa meg az " "eredeti XY-koordinátákat." -#: src/libslic3r/PrintConfig.cpp:4509 +#: src/libslic3r/PrintConfig.cpp:4675 msgid "Ensure on bed" msgstr "Ágyra igazítás" -#: src/libslic3r/PrintConfig.cpp:4510 +#: src/libslic3r/PrintConfig.cpp:4676 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." @@ -15445,23 +17424,23 @@ msgstr "" "Alapértelmezés szerint engedélyezve van, kikapcsolásához használja a --no-" "ensure-on-bed opciót." -#: src/libslic3r/PrintConfig.cpp:4514 +#: src/libslic3r/PrintConfig.cpp:4680 msgid "Duplicate" msgstr "Megkettőzés" -#: src/libslic3r/PrintConfig.cpp:4515 +#: src/libslic3r/PrintConfig.cpp:4681 msgid "Multiply copies by this factor." msgstr "Másolatok sokszorozása ezzel a tényezővel." -#: src/libslic3r/PrintConfig.cpp:4519 +#: src/libslic3r/PrintConfig.cpp:4685 msgid "Duplicate by grid" msgstr "Megkettőzés rács szerint" -#: src/libslic3r/PrintConfig.cpp:4520 +#: src/libslic3r/PrintConfig.cpp:4686 msgid "Multiply copies by creating a grid." msgstr "Másolatok sokszorozása rács létrehozásával." -#: src/libslic3r/PrintConfig.cpp:4524 +#: src/libslic3r/PrintConfig.cpp:4690 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." @@ -15469,7 +17448,7 @@ msgstr "" "A megadott modellek elredezése és egyetlen modellé való összevonása a " "tárgyasztalon, hogy egyszerre lehessen végrehajtani a műveleteket." -#: src/libslic3r/PrintConfig.cpp:4529 +#: src/libslic3r/PrintConfig.cpp:4695 msgid "" "Try to repair any non-manifold meshes (this option is implicitly added " "whenever we need to slice the model to perform the requested action)." @@ -15478,31 +17457,31 @@ msgstr "" "hozzáadódik, ha a modellt fel kell szeletelnünk a kért művelet " "végrehajtásához)." -#: src/libslic3r/PrintConfig.cpp:4533 +#: src/libslic3r/PrintConfig.cpp:4699 msgid "Rotation angle around the Z axis in degrees." msgstr "Az Z tengely körüli forgatási szög fokban." -#: src/libslic3r/PrintConfig.cpp:4537 +#: src/libslic3r/PrintConfig.cpp:4703 msgid "Rotate around X" msgstr "Forgatás X körül" -#: src/libslic3r/PrintConfig.cpp:4538 +#: src/libslic3r/PrintConfig.cpp:4704 msgid "Rotation angle around the X axis in degrees." msgstr "Az X tengely körüli forgatási szög fokban." -#: src/libslic3r/PrintConfig.cpp:4542 +#: src/libslic3r/PrintConfig.cpp:4708 msgid "Rotate around Y" msgstr "Forgatás Y körül" -#: src/libslic3r/PrintConfig.cpp:4543 +#: src/libslic3r/PrintConfig.cpp:4709 msgid "Rotation angle around the Y axis in degrees." msgstr "Az Y tengely körüli forgatási szög fokban." -#: src/libslic3r/PrintConfig.cpp:4548 +#: src/libslic3r/PrintConfig.cpp:4714 msgid "Scaling factor or percentage." msgstr "Skálázási tényező vagy százalék." -#: src/libslic3r/PrintConfig.cpp:4553 +#: src/libslic3r/PrintConfig.cpp:4719 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." @@ -15510,23 +17489,31 @@ msgstr "" "Az összekapcsolatlan részek felismerése és különálló objektumokra való " "bontása az adott modell(ek)ben." -#: src/libslic3r/PrintConfig.cpp:4556 +#: src/libslic3r/PrintConfig.cpp:4722 msgid "Scale to Fit" msgstr "Skálázás Mérethez Igazítva" -#: src/libslic3r/PrintConfig.cpp:4557 +#: src/libslic3r/PrintConfig.cpp:4723 msgid "Scale to fit the given volume." msgstr "A megadott térfogatra való skálázás." -#: src/libslic3r/PrintConfig.cpp:4566 +#: src/libslic3r/PrintConfig.cpp:4727 +msgid "Delete files after loading" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4728 +msgid "Delete files after loading." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4736 msgid "Ignore non-existent config files" msgstr "Nem létező konfigurációs fájlok figyelmen kívül hagyása" -#: src/libslic3r/PrintConfig.cpp:4567 +#: src/libslic3r/PrintConfig.cpp:4737 msgid "Do not fail if a file supplied to --load does not exist." msgstr "Ne hibázzon, ha a --betöltéshez megadott fájl nem létezik." -#: src/libslic3r/PrintConfig.cpp:4570 +#: src/libslic3r/PrintConfig.cpp:4740 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." @@ -15534,7 +17521,7 @@ msgstr "" "Előre kompatibilitási szabály konfigurációs és projektfájlokból (3MF, AMF) " "történő konfiguráció betöltéskor." -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4741 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -15547,11 +17534,11 @@ msgstr "" "hogy kilép, vagy az ismeretlen értéket egy alapértelmezett értékkel " "helyettesíti csendben vagy megjegyzéssel." -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4745 msgid "Bail out on unknown configuration values" msgstr "Kilépés ismeretlen konfigurációs értékek esetén" -#: src/libslic3r/PrintConfig.cpp:4579 +#: src/libslic3r/PrintConfig.cpp:4746 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." @@ -15559,7 +17546,7 @@ msgstr "" "Ismeretlen konfigurációs értékek olvasásának engedélyezése. Az " "alapértelmezett értékek helyettesítése megjegyzéssel." -#: src/libslic3r/PrintConfig.cpp:4580 +#: src/libslic3r/PrintConfig.cpp:4747 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." @@ -15567,11 +17554,11 @@ msgstr "" "Ismeretlen konfigurációs értékek olvasásának engedélyezése. Az " "alapértelmezett értékek helyettesítése csendben." -#: src/libslic3r/PrintConfig.cpp:4584 +#: src/libslic3r/PrintConfig.cpp:4752 msgid "Load config file" msgstr "Konfigurációs fájl betöltése" -#: src/libslic3r/PrintConfig.cpp:4585 +#: src/libslic3r/PrintConfig.cpp:4753 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -15579,11 +17566,11 @@ msgstr "" "Konfiguráció betöltése a megadott fájlból. Többször is használható " "beállítások több fájlból történő betöltéséhez." -#: src/libslic3r/PrintConfig.cpp:4588 +#: src/libslic3r/PrintConfig.cpp:4756 msgid "Output File" msgstr "Kimeneti Fájl" -#: src/libslic3r/PrintConfig.cpp:4589 +#: src/libslic3r/PrintConfig.cpp:4757 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." @@ -15591,11 +17578,11 @@ msgstr "" "Az a fájl, ahová a kimenet kiírásra kerül (ha nincs megadva, akkor a " "bemeneti fájlon alapul)." -#: src/libslic3r/PrintConfig.cpp:4593 +#: src/libslic3r/PrintConfig.cpp:4761 msgid "Single instance mode" msgstr "Egypéldányos mód" -#: src/libslic3r/PrintConfig.cpp:4594 +#: src/libslic3r/PrintConfig.cpp:4762 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -15606,11 +17593,11 @@ msgstr "" "alkalmazás beállításai közül felülírja a \"single_instance\" konfigurációs " "értéket." -#: src/libslic3r/PrintConfig.cpp:4605 +#: src/libslic3r/PrintConfig.cpp:4767 msgid "Data directory" msgstr "Adatkönyvtár" -#: src/libslic3r/PrintConfig.cpp:4606 +#: src/libslic3r/PrintConfig.cpp:4768 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -15620,11 +17607,11 @@ msgstr "" "különböző profilok karbantartásához vagy a hálózaton tárolt konfigurációk " "beviteléhez." -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4771 msgid "Logging level" msgstr "Naplózási szint" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4772 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -15635,11 +17622,11 @@ msgstr "" "Például: loglevel=2 a végzetes, hiba és figyelmeztetés szintű üzeneteket " "naplózza." -#: src/libslic3r/PrintConfig.cpp:4616 +#: src/libslic3r/PrintConfig.cpp:4778 msgid "Render with a software renderer" msgstr "Renderelés szoftveres renderelővel" -#: src/libslic3r/PrintConfig.cpp:4617 +#: src/libslic3r/PrintConfig.cpp:4779 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -15651,18 +17638,30 @@ msgstr "" msgid "Error with zip archive" msgstr "Hiba a zip archívummal" -#: src/libslic3r/PrintObject.cpp:126 +#: src/libslic3r/PrintObject.cpp:152 msgid "Generating perimeters" msgstr "Kerületek generálása" -#: src/libslic3r/PrintObject.cpp:229 +#: src/libslic3r/PrintObject.cpp:257 msgid "Preparing infill" msgstr "Kitöltés előkészítése" -#: src/libslic3r/PrintObject.cpp:403 +#: src/libslic3r/PrintObject.cpp:402 +msgid "making infill" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:449 +msgid "Searching support spots" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:474 msgid "Generating support material" msgstr "Támaszanyag generálása" +#: src/libslic3r/PrintObject.cpp:495 +msgid "Estimating curled extrusions" +msgstr "" + #: resources/data/hints.ini: [hint:Fuzzy skin] msgid "" "Fuzzy skin\n" @@ -16072,6 +18071,36 @@ msgstr "" "Tudta, hogy a PrusaSlicer teljes képernyős módba is kapcsolható? Használja a " "F11 gyorsbillentyűt." +#: resources/data/hints.ini: [hint:Printables integration] +msgid "" +"Printables.com integration\n" +"Did you know that when you are browsing Printables.com, you can send 3D " +"model files to PrusaSlicer with a single click? Learn more in the " +"documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Cut tool] +msgid "" +"Cut tool\n" +"Did you know that you can cut a model at any angle and even create aligning " +"pins with the updated Cut tool? Learn more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Measurement tool] +msgid "" +"Measurement tool\n" +"Did you know that you can measure the distances between points, edges " +"and planes, the radius of a hole or the angle between edges or planes? Learn " +"more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Text tool] +msgid "" +"Text tool\n" +"Did you know that you can add custom text labels to your models or even use " +"the text as a modifier? Learn more in the documentation." +msgstr "" + #: ../src/common/debugrpt.cpp:586 msgid "" "\n" @@ -17288,6 +19317,11 @@ msgstr "Balra igazítsd" msgid "Align Right" msgstr "Jobbra igazíts" +#: ../src/richtext/richtextsizepage.cpp:266 +#, fuzzy +msgid "Alignment" +msgstr "Balra igazítsd" + #: ../src/generic/filectrlg.cpp:1197 ../src/common/fldlgcmn.cpp:107 #, c-format msgid "All files (%s)|%s" @@ -18643,11 +20677,6 @@ msgstr "Dekoratív" msgid "Default encoding" msgstr "Az alapértelmezett kódolás" -#: ../src/dfb/fontmgr.cpp:180 -#, fuzzy -msgid "Default font" -msgstr "Az alapértelmezett nyomtató" - #: ../src/generic/prntdlgg.cpp:510 msgid "Default printer" msgstr "Az alapértelmezett nyomtató" @@ -19032,11 +21061,6 @@ msgstr "Hiba történt a semaforra várakozás során" msgid "Error: " msgstr "Hiba: " -#. TRANSLATORS: Name of keyboard key -#: ../src/common/accelcmn.cpp:69 -msgid "Esc" -msgstr "" - #. TRANSLATORS: Name of keyboard key #: ../src/common/accelcmn.cpp:70 #, fuzzy @@ -19811,11 +21835,6 @@ msgstr "&Másolás" msgid "Folio, 8 1/2 x 13 in" msgstr "Folio, 8 1/2 x 13 hüvelyk" -#: ../src/richtext/richtextformatdlg.cpp:344 ../src/osx/carbon/fontdlg.cpp:287 -#: ../src/common/stockitem.cpp:194 -msgid "Font" -msgstr "" - #: ../src/richtext/richtextfontpage.cpp:221 #, fuzzy msgid "Font &weight:" @@ -20954,11 +22973,6 @@ msgstr "A VFS memóriában már van '%s' fájl!" msgid "Menu" msgstr "Menu" -#: ../src/common/msgout.cpp:124 -#, fuzzy -msgid "Message" -msgstr "%s üzenet" - #: ../src/univ/themes/metal.cpp:168 msgid "Metal theme" msgstr "Fém bőr" @@ -20993,10 +23007,6 @@ msgstr "" msgid "Modern" msgstr "Modern" -#: ../src/generic/filectrlg.cpp:427 -msgid "Modified" -msgstr "Módosítva" - #: ../src/common/module.cpp:133 #, c-format msgid "Module \"%s\" initialization failed" @@ -21089,11 +23099,6 @@ msgstr "ÚjNév" msgid "Next page" msgstr "Következő oldal" -#: ../include/wx/msgdlg.h:277 ../src/common/stockitem.cpp:177 -#: ../src/motif/msgdlg.cpp:196 -msgid "No" -msgstr "Nem" - #. TRANSLATORS: System cursor name #: ../src/propgrid/advprops.cpp:1764 msgid "No Entry" @@ -21337,12 +23342,6 @@ msgstr "" msgid "Numbered outline" msgstr "" -#: ../include/wx/msgdlg.h:278 ../src/richtext/richtextstyledlg.cpp:297 -#: ../src/common/stockitem.cpp:178 ../src/msw/msgdlg.cpp:454 -#: ../src/msw/msgdlg.cpp:747 ../src/gtk1/fontdlg.cpp:138 -msgid "OK" -msgstr "Ok" - #: ../src/msw/ole/automtn.cpp:692 #, c-format msgid "OLE Automation error in %s: %s" @@ -21415,6 +23414,10 @@ msgstr "A(z) '%s' beállítás egy értéket kér." msgid "Option '%s': '%s' cannot be converted to a date." msgstr "A(z) '%s' beállítása: '%s' nem alakítható át dátummá." +#: ../src/generic/prntdlgg.cpp:618 +msgid "Options" +msgstr "Lehetőségek" + #: ../src/propgrid/advprops.cpp:1606 msgid "Orange" msgstr "" @@ -22236,10 +24239,6 @@ msgstr "" msgid "Select underlining or no underlining." msgstr "" -#: ../src/motif/filedlg.cpp:220 -msgid "Selection" -msgstr "Kiválasztott" - #: ../src/richtext/richtextliststylepage.cpp:187 #: ../src/richtext/richtextliststylepage.cpp:189 msgid "Selects the list level to edit." @@ -23176,10 +25175,6 @@ msgstr "" msgid "Turkish (ISO-8859-9)" msgstr "Török (ISO-8859-9)" -#: ../src/generic/filectrlg.cpp:426 -msgid "Type" -msgstr "Típus" - #: ../src/richtext/richtextfontpage.cpp:151 #: ../src/richtext/richtextfontpage.cpp:153 #, fuzzy @@ -23690,10 +25685,6 @@ msgstr "" msgid "Validation conflict" msgstr "Érvényességi ütközés" -#: ../src/propgrid/manager.cpp:238 -msgid "Value" -msgstr "" - #: ../src/propgrid/props.cpp:386 ../src/propgrid/props.cpp:500 #, c-format msgid "Value must be %s or higher." @@ -23938,11 +25929,6 @@ msgstr "" msgid "Yellow" msgstr "" -#: ../include/wx/msgdlg.h:276 ../src/common/stockitem.cpp:206 -#: ../src/motif/msgdlg.cpp:196 -msgid "Yes" -msgstr "Igen" - #: ../src/osx/carbon/overlay.cpp:155 #, fuzzy msgid "You cannot Clear an overlay that is not inited" diff --git a/resources/localization/ja/PrusaSlicer.mo b/resources/localization/ja/PrusaSlicer.mo index 482270cc4de8a64c48128f3644888c33a19c7efe..aacb7baaccb74559f201af04d4b64d4ca21cbd33 100644 GIT binary patch delta 70 zcmcaNP4V6|#fB}6HTq1u__o*SGagc43Si#u6u`*D!NkC@-7SLgSTSR9JMS4rAZ7w$ TW*}w(Vpbq#+s=E2J+K}CQE3;3 delta 70 zcmcaNP4V6|#fB}6HTp~e%-ieq84oEiF)(a*3Sea7VA{pE-7SLgSTSQsJMS4rAZ7w$ TW*}w(Vpbq#+s=E2J+K}CMq?L; diff --git a/resources/localization/ja/PrusaSlicer_ja.po b/resources/localization/ja/PrusaSlicer_ja.po index df0cde6174f..8d93b064199 100644 --- a/resources/localization/ja/PrusaSlicer_ja.po +++ b/resources/localization/ja/PrusaSlicer_ja.po @@ -2338,7 +2338,7 @@ msgstr "設定のスナップショット" #: src/slic3r/Utils/PresetUpdater.cpp:777 msgid "" -"Configuration Updates causes a lost of preset modification.\n" +"Configuration Updates causes a loss of preset modification.\n" "So, check unsaved changes and save them if necessary." msgstr "" "構成のアップデートをすると、プリセットの変更が失われます。\n" diff --git a/resources/localization/ko/PrusaSlicer.mo b/resources/localization/ko/PrusaSlicer.mo index cfb41c85060cc3ad4b9368ceebef3eb0580f03fa..c6057eb459a581060e1053f8488a87450b1e84a6 100644 GIT binary patch delta 68302 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 X$}L%PhwXYfo5nNN_3V\n" "Language-Team: ulsanether\n" @@ -21,16 +21,16 @@ msgstr "" "X-Crowdin-Language: ko\n" "X-Crowdin-File: ko_KR.po\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 +#: src/slic3r/GUI/AboutDialog.cpp:46 src/slic3r/GUI/AboutDialog.cpp:306 msgid "Portions copyright" msgstr "다른 저작권" -#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 +#: src/slic3r/GUI/AboutDialog.cpp:143 src/slic3r/GUI/AboutDialog.cpp:270 msgid "Copyright" msgstr "저작권" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:143 +#: src/slic3r/GUI/AboutDialog.cpp:145 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -38,26 +38,26 @@ msgstr "" "다음의 모든 프로그램 (라이브러리)의 라이센스 계약은 응용 프로그램 라이센스 계" "약의 일부입니다" -#: src/slic3r/GUI/AboutDialog.cpp:212 +#: src/slic3r/GUI/AboutDialog.cpp:214 #, c-format, boost-format msgid "About %s" msgstr "%s에 대하여" -#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 -#: src/slic3r/GUI/GUI_App.cpp:262 +#: src/slic3r/GUI/AboutDialog.cpp:245 src/slic3r/GUI/AboutDialog.cpp:370 +#: src/slic3r/GUI/GUI_App.cpp:271 msgid "Version" msgstr "버전" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:277 msgid "is licensed under the" msgstr "라이선스는" -#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:273 src/slic3r/GUI/GUI_App.cpp:277 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero 일반 공중 사용 허가서, 버전 3" -#: src/slic3r/GUI/AboutDialog.cpp:273 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -65,7 +65,7 @@ msgstr "" "프루사슬라이서는 알레산드로 라넬루치와 RepRap 커뮤니티 Slic3r를 기반으로합니" "다." -#: src/slic3r/GUI/AboutDialog.cpp:274 +#: src/slic3r/GUI/AboutDialog.cpp:275 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -73,9 +73,9 @@ msgid "" msgstr "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " -"numerous others. 한국어 번역 울산에테르, 밤송이직박구리" +"numerous others. 한국어 번역 울산에테르, 밤송이직박구리,brightstone song" -#: src/slic3r/GUI/AboutDialog.cpp:310 +#: src/slic3r/GUI/AboutDialog.cpp:311 msgid "Copy Version Info" msgstr "" @@ -93,63 +93,65 @@ msgstr "" #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:84 #, boost-format msgid "PrusaSlicer has encountered a fatal error: \"%1%\"" -msgstr "" +msgstr "슬라이서에 치명적인 오류가 발생했습니다: \"%1%\"" #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:85 msgid "" "Please save your project and restart PrusaSlicer. We would be glad if you " "reported the issue." msgstr "" +"작업물을 저장하시고 슬라이서를 재시작하시기 바랍니다. 이 이슈를 보고해주시면 " +"감사하겠습니다." #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:162 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:204 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:188 msgid "Slicing complete" msgstr "슬라이스 완료" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:199 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183 #, boost-format msgid "Masked SLA file exported to %1%" -msgstr "마스크 된 SLA 파일을 %1%로 내보냅니" +msgstr "마스크 된 SLA 파일을 %1%로 내보냅니다." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:286 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:279 msgid "Access violation" -msgstr "" +msgstr "접근 위반" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:288 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:281 msgid "Illegal instruction" -msgstr "" +msgstr "잘못된 명령" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:283 msgid "Divide by zero" -msgstr "" +msgstr "0" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:292 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:285 msgid "Overflow" -msgstr "" +msgstr "오버플로우" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:294 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:287 msgid "Underflow" -msgstr "" +msgstr "언더플로우" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:297 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 msgid "Floating reserved operand" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:300 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:293 msgid "Stack overflow" -msgstr "" +msgstr "스택 오버플로우" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:659 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:726 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:652 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:719 msgid "Running post-processing scripts" msgstr "포스트 프로세싱 스크립트" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:690 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:710 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:683 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:703 msgid "Unknown error occured during exporting G-code." -msgstr "" +msgstr "G고드 제작중 알 수 없는 오류가 발생" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:695 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:688 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. Maybe the SD " @@ -157,7 +159,7 @@ msgid "" "Error message: %1%" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:698 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:691 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. There might be " @@ -165,37 +167,37 @@ msgid "" "device. The corrupted output G-code is at %1%.tmp." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:701 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:694 #, boost-format msgid "" "Renaming of the G-code after copying to the selected destination folder has " "failed. Current path is %1%.tmp. Please try exporting again." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:704 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:697 #, boost-format msgid "" "Copying of the temporary G-code has finished but the original code at %1% " "couldn't be opened during copy check. The output G-code is at %2%.tmp." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:707 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:700 #, boost-format msgid "" "Copying of the temporary G-code has finished but the exported code couldn't " "be opened during copy check. The output G-code is at %1%.tmp." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:715 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:708 #, boost-format msgid "G-code file exported to %1%" -msgstr "%1%로 내보낸 G 코드 파일" +msgstr "%1%로 G코드 파일이 저장되었습니다." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:729 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:722 msgid "Copying of the temporary G-code to the output G-code failed" msgstr "임시 G 코드를 출력 G 코드에 복사 하지 못했습니다" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:751 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:738 #, boost-format msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" @@ -203,8 +205,9 @@ msgstr "" "오" #: src/slic3r/GUI/BedShapeDialog.cpp:31 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2765 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1576 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:241 src/slic3r/GUI/Plater.cpp:220 +#: src/slic3r/GUI/Tab.cpp:2697 msgid "Size" msgstr "사이즈" @@ -212,68 +215,78 @@ msgstr "사이즈" msgid "Origin" msgstr "원점" -#: src/slic3r/GUI/BedShapeDialog.cpp:33 src/libslic3r/PrintConfig.cpp:1020 +#: src/slic3r/GUI/BedShapeDialog.cpp:33 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1994 +#: src/libslic3r/PrintConfig.cpp:1109 msgid "Diameter" msgstr "노즐 직경" #: src/slic3r/GUI/BedShapeDialog.cpp:49 msgid "Size in X and Y of the rectangular plate." -msgstr "사각 플레이트 X 및 Y 크기." +msgstr "사각형 베드의 X와 Y크기." #: src/slic3r/GUI/BedShapeDialog.cpp:58 msgid "" "Distance of the 0,0 G-code coordinate from the front left corner of the " "rectangle." -msgstr "사각 전면 왼쪽 모서리에서 원저(0, 0) G-code 좌표 거리입니다." +msgstr "전면부 왼쪽 모서리부터 원점까지의(0, 0) G-code 좌표 거리입니다." -#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:262 -#: src/slic3r/GUI/ConfigWizard.cpp:1476 src/slic3r/GUI/ConfigWizard.cpp:1490 +#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:291 +#: src/slic3r/GUI/ConfigWizard.cpp:1796 src/slic3r/GUI/ConfigWizard.cpp:1832 +#: src/slic3r/GUI/ConfigWizard.cpp:1846 #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:100 -#: src/slic3r/GUI/GCodeViewer.cpp:3181 src/slic3r/GUI/GCodeViewer.cpp:3187 -#: src/slic3r/GUI/GCodeViewer.cpp:3195 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 src/slic3r/GUI/GCodeViewer.cpp:3455 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 #: src/slic3r/GUI/GUI_ObjectLayers.cpp:145 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 src/libslic3r/PrintConfig.cpp:263 -#: src/libslic3r/PrintConfig.cpp:290 src/libslic3r/PrintConfig.cpp:297 -#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:520 -#: src/libslic3r/PrintConfig.cpp:546 src/libslic3r/PrintConfig.cpp:621 -#: src/libslic3r/PrintConfig.cpp:629 src/libslic3r/PrintConfig.cpp:679 -#: src/libslic3r/PrintConfig.cpp:813 src/libslic3r/PrintConfig.cpp:824 -#: src/libslic3r/PrintConfig.cpp:842 src/libslic3r/PrintConfig.cpp:1023 -#: src/libslic3r/PrintConfig.cpp:1235 src/libslic3r/PrintConfig.cpp:1302 -#: src/libslic3r/PrintConfig.cpp:1312 src/libslic3r/PrintConfig.cpp:1611 -#: src/libslic3r/PrintConfig.cpp:1805 src/libslic3r/PrintConfig.cpp:1866 -#: src/libslic3r/PrintConfig.cpp:1884 src/libslic3r/PrintConfig.cpp:1902 -#: src/libslic3r/PrintConfig.cpp:1965 src/libslic3r/PrintConfig.cpp:1975 -#: src/libslic3r/PrintConfig.cpp:2097 src/libslic3r/PrintConfig.cpp:2106 -#: src/libslic3r/PrintConfig.cpp:2125 src/libslic3r/PrintConfig.cpp:2146 -#: src/libslic3r/PrintConfig.cpp:2158 src/libslic3r/PrintConfig.cpp:2166 -#: src/libslic3r/PrintConfig.cpp:2207 src/libslic3r/PrintConfig.cpp:2215 -#: src/libslic3r/PrintConfig.cpp:2225 src/libslic3r/PrintConfig.cpp:2233 -#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2303 -#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2603 -#: src/libslic3r/PrintConfig.cpp:2620 src/libslic3r/PrintConfig.cpp:2721 -#: src/libslic3r/PrintConfig.cpp:2730 src/libslic3r/PrintConfig.cpp:2780 -#: src/libslic3r/PrintConfig.cpp:2932 src/libslic3r/PrintConfig.cpp:3020 -#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3034 -#: src/libslic3r/PrintConfig.cpp:3048 src/libslic3r/PrintConfig.cpp:3072 -#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3092 -#: src/libslic3r/PrintConfig.cpp:3372 src/libslic3r/PrintConfig.cpp:3413 -#: src/libslic3r/PrintConfig.cpp:3573 src/libslic3r/PrintConfig.cpp:3582 -#: src/libslic3r/PrintConfig.cpp:3591 src/libslic3r/PrintConfig.cpp:3601 -#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3676 -#: src/libslic3r/PrintConfig.cpp:3688 src/libslic3r/PrintConfig.cpp:3708 -#: src/libslic3r/PrintConfig.cpp:3718 src/libslic3r/PrintConfig.cpp:3728 -#: src/libslic3r/PrintConfig.cpp:3746 src/libslic3r/PrintConfig.cpp:3761 -#: src/libslic3r/PrintConfig.cpp:3775 src/libslic3r/PrintConfig.cpp:3786 -#: src/libslic3r/PrintConfig.cpp:3799 src/libslic3r/PrintConfig.cpp:3844 -#: src/libslic3r/PrintConfig.cpp:3854 src/libslic3r/PrintConfig.cpp:3863 -#: src/libslic3r/PrintConfig.cpp:3873 src/libslic3r/PrintConfig.cpp:3889 -#: src/libslic3r/PrintConfig.cpp:3913 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 src/libslic3r/PrintConfig.cpp:279 +#: src/libslic3r/PrintConfig.cpp:303 src/libslic3r/PrintConfig.cpp:310 +#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:657 src/libslic3r/PrintConfig.cpp:724 +#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:782 +#: src/libslic3r/PrintConfig.cpp:902 src/libslic3r/PrintConfig.cpp:913 +#: src/libslic3r/PrintConfig.cpp:931 src/libslic3r/PrintConfig.cpp:1112 +#: src/libslic3r/PrintConfig.cpp:1295 src/libslic3r/PrintConfig.cpp:1359 +#: src/libslic3r/PrintConfig.cpp:1369 src/libslic3r/PrintConfig.cpp:1650 +#: src/libslic3r/PrintConfig.cpp:1842 src/libslic3r/PrintConfig.cpp:1903 +#: src/libslic3r/PrintConfig.cpp:1921 src/libslic3r/PrintConfig.cpp:1939 +#: src/libslic3r/PrintConfig.cpp:1995 src/libslic3r/PrintConfig.cpp:2005 +#: src/libslic3r/PrintConfig.cpp:2127 src/libslic3r/PrintConfig.cpp:2136 +#: src/libslic3r/PrintConfig.cpp:2155 src/libslic3r/PrintConfig.cpp:2176 +#: src/libslic3r/PrintConfig.cpp:2188 src/libslic3r/PrintConfig.cpp:2196 +#: src/libslic3r/PrintConfig.cpp:2237 src/libslic3r/PrintConfig.cpp:2245 +#: src/libslic3r/PrintConfig.cpp:2255 src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2271 src/libslic3r/PrintConfig.cpp:2336 +#: src/libslic3r/PrintConfig.cpp:2565 src/libslic3r/PrintConfig.cpp:2632 +#: src/libslic3r/PrintConfig.cpp:2647 src/libslic3r/PrintConfig.cpp:2746 +#: src/libslic3r/PrintConfig.cpp:2755 src/libslic3r/PrintConfig.cpp:2801 +#: src/libslic3r/PrintConfig.cpp:2886 src/libslic3r/PrintConfig.cpp:2896 +#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3108 +#: src/libslic3r/PrintConfig.cpp:3115 src/libslic3r/PrintConfig.cpp:3122 +#: src/libslic3r/PrintConfig.cpp:3136 src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3170 src/libslic3r/PrintConfig.cpp:3180 +#: src/libslic3r/PrintConfig.cpp:3330 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3391 src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3444 src/libslic3r/PrintConfig.cpp:3456 +#: src/libslic3r/PrintConfig.cpp:3476 src/libslic3r/PrintConfig.cpp:3491 +#: src/libslic3r/PrintConfig.cpp:3501 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3681 src/libslic3r/PrintConfig.cpp:3878 +#: src/libslic3r/PrintConfig.cpp:3893 src/libslic3r/PrintConfig.cpp:3907 +#: src/libslic3r/PrintConfig.cpp:3918 src/libslic3r/PrintConfig.cpp:3931 +#: src/libslic3r/PrintConfig.cpp:3976 src/libslic3r/PrintConfig.cpp:3986 +#: src/libslic3r/PrintConfig.cpp:3995 src/libslic3r/PrintConfig.cpp:4005 +#: src/libslic3r/PrintConfig.cpp:4021 src/libslic3r/PrintConfig.cpp:4045 +#: src/libslic3r/PrintConfig.cpp:4072 msgid "mm" msgstr "mm" @@ -281,7 +294,7 @@ msgstr "mm" msgid "" "Diameter of the print bed. It is assumed that origin (0,0) is located in the " "center." -msgstr "인쇄 배드의 직경. 원점 (0,0) 은 중재봉선에 있다고 가정합니다." +msgstr "인쇄 배드의 직경. 원점 (0,0) 은 중앙에 있다고 가정됩니다." #: src/slic3r/GUI/BedShapeDialog.cpp:79 msgid "Rectangular" @@ -291,22 +304,22 @@ msgstr "직사각형" msgid "Circular" msgstr "원형" -#: src/slic3r/GUI/BedShapeDialog.cpp:81 src/slic3r/GUI/GUI_Preview.cpp:252 -#: src/libslic3r/ExtrusionEntity.cpp:343 src/libslic3r/ExtrusionEntity.cpp:378 +#: src/slic3r/GUI/BedShapeDialog.cpp:81 msgid "Custom" msgstr "사용자 정의" #: src/slic3r/GUI/BedShapeDialog.cpp:104 src/slic3r/GUI/BedShapeDialog.cpp:179 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1701 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1565 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1798 msgid "Shape" msgstr "모양" #: src/slic3r/GUI/BedShapeDialog.cpp:203 msgid "Load shape from STL..." -msgstr "STL파일 로드." +msgstr "STL파일 로드하기." -#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2147 +#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3914 +#: src/slic3r/GUI/MainFrame.cpp:2240 msgid "Settings" msgstr "설정" @@ -319,120 +332,193 @@ msgid "Load..." msgstr "불러오기..." #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/Tab.cpp:3973 msgid "Remove" msgstr "제거" #: src/slic3r/GUI/BedShapeDialog.cpp:317 src/slic3r/GUI/BedShapeDialog.cpp:388 msgid "Not found:" -msgstr "" +msgstr "찾지 못함" #: src/slic3r/GUI/BedShapeDialog.cpp:344 msgid "Model" msgstr "모델" -#: src/slic3r/GUI/BedShapeDialog.cpp:508 +#: src/slic3r/GUI/BedShapeDialog.cpp:506 msgid "Choose an STL file to import bed shape from:" msgstr "가져올 베드 모양을(STL 파일) 선택합니다:" -#: src/slic3r/GUI/BedShapeDialog.cpp:514 src/slic3r/GUI/BedShapeDialog.cpp:562 -#: src/slic3r/GUI/BedShapeDialog.cpp:584 +#: src/slic3r/GUI/BedShapeDialog.cpp:512 src/slic3r/GUI/BedShapeDialog.cpp:560 +#: src/slic3r/GUI/BedShapeDialog.cpp:582 msgid "Invalid file format." msgstr "잘못된 파일 형식." -#: src/slic3r/GUI/BedShapeDialog.cpp:525 +#: src/slic3r/GUI/BedShapeDialog.cpp:523 msgid "Error! Invalid model" msgstr "오류! 잘못된 모델" -#: src/slic3r/GUI/BedShapeDialog.cpp:533 +#: src/slic3r/GUI/BedShapeDialog.cpp:531 msgid "The selected file contains no geometry." -msgstr "선택한 파일에 없는 형상이 있습니다." +msgstr "선택한 파일에는 형상이 존재하지 않습니다." -#: src/slic3r/GUI/BedShapeDialog.cpp:537 +#: src/slic3r/GUI/BedShapeDialog.cpp:535 msgid "" "The selected file contains several disjoint areas. This is not supported." -msgstr "" -"선택한 파일은 여러개의 분리 된 영역을 포함 되어 있어 지원 되지 않습니다." +msgstr "이 파일은 몇몇 끊어진 부분이 있습니다. 지원이 불가능합니다." -#: src/slic3r/GUI/BedShapeDialog.cpp:552 +#: src/slic3r/GUI/BedShapeDialog.cpp:550 msgid "Choose a file to import bed texture from (PNG/SVG):" -msgstr "(PNG /SVG)에서 배드 텍스처를 가져올 파일을 선택합니다." +msgstr "베드 텍스처를 가져올 (PNG /SVG)파일을 선택하십시오." -#: src/slic3r/GUI/BedShapeDialog.cpp:574 +#: src/slic3r/GUI/BedShapeDialog.cpp:572 msgid "Choose an STL file to import bed model from:" -msgstr "다음에서 베드 모델을 가져올 STL 파일을 선택합니다:" +msgstr "베드 모델을 가져올 STL 파일을 선택하십시오:" -#: src/slic3r/GUI/BedShapeDialog.hpp:95 src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/BedShapeDialog.hpp:96 src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape" -msgstr "배드 모양" +msgstr "베드 모양" -#: src/slic3r/GUI/BonjourDialog.cpp:55 +#: src/slic3r/GUI/BonjourDialog.cpp:58 msgid "Network lookup" msgstr "네트워크 조회" -#: src/slic3r/GUI/BonjourDialog.cpp:72 +#: src/slic3r/GUI/BonjourDialog.cpp:75 src/slic3r/GUI/BonjourDialog.cpp:253 msgid "Address" msgstr "주소" -#: src/slic3r/GUI/BonjourDialog.cpp:73 +#: src/slic3r/GUI/BonjourDialog.cpp:76 msgid "Hostname" -msgstr "호스트이름" +msgstr "호스트 이름" -#: src/slic3r/GUI/BonjourDialog.cpp:74 +#: src/slic3r/GUI/BonjourDialog.cpp:77 msgid "Service name" msgstr "서비스 이름" -#: src/slic3r/GUI/BonjourDialog.cpp:76 +#: src/slic3r/GUI/BonjourDialog.cpp:79 msgid "OctoPrint version" msgstr "옥토프린트 버전" -#: src/slic3r/GUI/BonjourDialog.cpp:224 +#: src/slic3r/GUI/BonjourDialog.cpp:227 msgid "Searching for devices" -msgstr "디바이스 검색" +msgstr "디바이스 검색중" -#: src/slic3r/GUI/BonjourDialog.cpp:231 +#: src/slic3r/GUI/BonjourDialog.cpp:234 msgid "Finished" msgstr "완료" -#: src/slic3r/GUI/ButtonsDescription.cpp:42 +#: src/slic3r/GUI/BonjourDialog.cpp:240 +msgid "Multiple resolved IP addresses" +msgstr "" + +#: src/slic3r/GUI/BonjourDialog.cpp:249 +#, boost-format +msgid "" +"There are several IP addresses resolving to hostname %1%.\n" +"Please select one that should be used." +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:21 +msgid "Palette 1 (default)" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:22 +msgid "Palette 2" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:23 +msgid "Palette 3" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:24 +msgid "Palette 4" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:25 +msgid "Palette 5" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:26 +msgid "Palette 6" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:27 +msgid "Palette 7" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:28 +msgid "Palette 8" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:112 msgid "Revert color to default" msgstr "" -#: src/slic3r/GUI/ButtonsDescription.cpp:57 +#: src/slic3r/GUI/ButtonsDescription.cpp:127 msgid "Value is the same as the system value" msgstr "이 값은 시스템 값과 같습니다" -#: src/slic3r/GUI/ButtonsDescription.cpp:58 +#: src/slic3r/GUI/ButtonsDescription.cpp:128 msgid "" "Value was changed and is not equal to the system value or the last saved " "preset" -msgstr "값이 변경 되었고, 시스템 값 또는 마지막으로 저장된 설정값과 다릅니다." +msgstr "" +"수치가 변경 되었고, 시스템 값 또는 마지막으로 저장된 설정값과 다릅니다." + +#: src/slic3r/GUI/ButtonsDescription.cpp:155 +msgid "Default palette for mode markers" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2422 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Simple" +msgstr "단순" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2424 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgctxt "Mode" +msgid "Advanced" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2425 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Expert" +msgstr "전문가" + +#: src/slic3r/GUI/ButtonsDescription.cpp:182 +msgid "Revert color" +msgstr "" -#: src/slic3r/GUI/ButtonsDescription.cpp:62 +#: src/slic3r/GUI/ButtonsDescription.cpp:200 msgid "Buttons And Text Colors Description" msgstr "버튼 및 텍스트 색상 설명" -#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/ConfigManipulation.cpp:50 msgid "" "Layer height is not valid.\n" "\n" "The layer height will be reset to 0.01." msgstr "" +"레이어 높이가 유호하지 않습니다.\n" +"\n" +"높이가 0.01로 재설정됩니다." -#: src/slic3r/GUI/ConfigManipulation.cpp:50 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1449 -#: src/libslic3r/PrintConfig.cpp:286 +#: src/slic3r/GUI/ConfigManipulation.cpp:51 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1394 +#: src/libslic3r/PrintConfig.cpp:299 msgid "Layer height" msgstr "레이어 높이" -#: src/slic3r/GUI/ConfigManipulation.cpp:61 +#: src/slic3r/GUI/ConfigManipulation.cpp:62 msgid "" "First layer height is not valid.\n" "\n" "The first layer height will be reset to 0.01." msgstr "" +"첫 레이어 높이가 유호하지 않습니다.\n" +"\n" +"첫 레이어 높이가 0.01로 재설정됩니다." -#: src/slic3r/GUI/ConfigManipulation.cpp:62 src/libslic3r/PrintConfig.cpp:1231 +#: src/slic3r/GUI/ConfigManipulation.cpp:63 src/libslic3r/PrintConfig.cpp:1291 msgid "First layer height" msgstr "첫 레이어 높이" @@ -443,344 +529,380 @@ msgid "" "- no top solid layers\n" "- 0% fill density\n" "- no support material\n" -"- Ensure vertical shell thickness enabled\n" "- Detect thin walls disabled" msgstr "" +"꽃병 모드는 다음과 같은 설정이 필요합니다:\n" +"- 외벽 1\n" +"- 상부 레이어 없음\n" +"- 내부 밀도 0%\n" +"- 서포트 없음\n" +"- 얇은 외벽 감지 비활성화" -#: src/slic3r/GUI/ConfigManipulation.cpp:90 +#: src/slic3r/GUI/ConfigManipulation.cpp:89 msgid "Shall I adjust those settings in order to enable Spiral Vase?" -msgstr "나선형 꽃병을 활성화하기 위해 이러한 설정을 조정해야 합니까?" +msgstr "꽃병 모드를 활성화하기 위해 이 설정들을 변경하시겠습니까?" -#: src/slic3r/GUI/ConfigManipulation.cpp:91 +#: src/slic3r/GUI/ConfigManipulation.cpp:90 msgid "Spiral Vase" -msgstr "스파이럴 바이스" +msgstr "꾳병 모드" -#: src/slic3r/GUI/ConfigManipulation.cpp:121 +#: src/slic3r/GUI/ConfigManipulation.cpp:123 msgid "" -"The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool " -"change.\n" -"(both support_material_extruder and support_material_interface_extruder need " -"to be set to 0)." +"For the Wipe Tower to work with the soluble supports, the support layers\n" +"need to be synchronized with the object layers." msgstr "" -"와이프 타워(프라임 타워)는 현재 비수용성 지원만 지원합니다.\n" -"공구 교환을 트리거하지 않고 현재 압출기로 인쇄된 경우\n" -"(support_material_extruder support_material_interface_extruder 모두 0으로 설" -"정해야 합니다)." - -#: src/slic3r/GUI/ConfigManipulation.cpp:125 -msgid "Shall I adjust those settings in order to enable the Wipe Tower?" -msgstr "와이프 타워를 활성화하기 위해 이러한 설정을 조정해야 합니까?" +"와이프 타워(프라임 타워)를 수용성 서포트와 함께 사용하기 위해서는 서포트 레이" +"어를 객체(object) 레이어와 동기화 해야 합니다." #: src/slic3r/GUI/ConfigManipulation.cpp:126 -#: src/slic3r/GUI/ConfigManipulation.cpp:146 +msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" +msgstr "와이프 타워를 사용하기 위해 서포트 레이어 설정을 변경하시겠습니까?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:127 +#: src/slic3r/GUI/ConfigManipulation.cpp:145 msgid "Wipe Tower" msgstr "와이프 타워(프라임 타워)" -#: src/slic3r/GUI/ConfigManipulation.cpp:142 +#: src/slic3r/GUI/ConfigManipulation.cpp:140 src/libslic3r/Print.cpp:672 msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers\n" -"need to be synchronized with the object layers." +"The Wipe Tower currently supports the non-soluble supports only if they are " +"printed with the current extruder without triggering a tool change. (both " +"support_material_extruder and support_material_interface_extruder need to be " +"set to 0)." msgstr "" -"와이프 타워(프라임 타워)가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 " -"객체(object) 레이어와 동기화 해야 합니다." +"와이프 타워는 현재 공구 교체를 트리거하지 않고 현재의 압출기로 인쇄 하는 경우" +"에만 비가용성 서포트를 지원 합니다. (support_material_extruder과 " +"support_material_interface_extruder 모두 0으로 설정 해야 합니다.)" -#: src/slic3r/GUI/ConfigManipulation.cpp:145 -msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" -msgstr "와이프 타워를 활성화하기 위해 지원 레이어를 동기화해야 합니까?" +#: src/slic3r/GUI/ConfigManipulation.cpp:144 +msgid "Shall I adjust those settings in order to enable the Wipe Tower?" +msgstr "와이프 타워를 활성화하기 위해 이 설정들을 변경하시겠습니까?" -#: src/slic3r/GUI/ConfigManipulation.cpp:164 +#: src/slic3r/GUI/ConfigManipulation.cpp:166 msgid "" "Supports work better, if the following feature is enabled:\n" "- Detect bridging perimeters" msgstr "" -"다음 기능이 활성화된 경우 더 나은 작업을 지원합니다.\n" -"- 브리징 경계를 감지" +"서포트는 다음 기능이 활성화되어 있으면 더 효율적으로 생성됩니다.\n" +"- 브릿징 동작 감지" -#: src/slic3r/GUI/ConfigManipulation.cpp:167 +#: src/slic3r/GUI/ConfigManipulation.cpp:169 msgid "Shall I adjust those settings for supports?" -msgstr "지원에 대한 설정을 조정해야 합니까?" +msgstr "서포트 세팅을 변경하시겠습니까?" -#: src/slic3r/GUI/ConfigManipulation.cpp:168 +#: src/slic3r/GUI/ConfigManipulation.cpp:170 msgid "Support Generator" -msgstr "서포트 생성" +msgstr "서포트 생성기" -#: src/slic3r/GUI/ConfigManipulation.cpp:195 +#: src/slic3r/GUI/ConfigManipulation.cpp:194 #, boost-format msgid "The %1% infill pattern is not supposed to work at 100%% density." -msgstr "%1% 채우기 패턴은 100%% 밀도로 작동하도록 되어 있지 않습니다." +msgstr "%1% 패턴은 100%% 밀도로 작동하도록 되어 있지 않습니다." -#: src/slic3r/GUI/ConfigManipulation.cpp:198 +#: src/slic3r/GUI/ConfigManipulation.cpp:196 msgid "Shall I switch to rectilinear fill pattern?" -msgstr "직선 채우기 패턴으로 전환해야 합니까?" +msgstr "직선 패턴으로 전환하시겠습니까?" -#: src/slic3r/GUI/ConfigManipulation.cpp:199 +#: src/slic3r/GUI/ConfigManipulation.cpp:197 #: src/slic3r/GUI/GUI_Factories.cpp:55 src/slic3r/GUI/GUI_Factories.cpp:128 -#: src/slic3r/GUI/Plater.cpp:460 src/slic3r/GUI/Tab.cpp:1503 -#: src/slic3r/GUI/Tab.cpp:1505 src/libslic3r/PrintConfig.cpp:475 -#: src/libslic3r/PrintConfig.cpp:716 src/libslic3r/PrintConfig.cpp:743 -#: src/libslic3r/PrintConfig.cpp:1098 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1149 src/libslic3r/PrintConfig.cpp:1398 -#: src/libslic3r/PrintConfig.cpp:1427 src/libslic3r/PrintConfig.cpp:1496 -#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1535 -#: src/libslic3r/PrintConfig.cpp:2364 src/libslic3r/PrintConfig.cpp:2381 +#: src/slic3r/GUI/Plater.cpp:468 src/slic3r/GUI/Tab.cpp:1450 +#: src/slic3r/GUI/Tab.cpp:1452 src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:811 src/libslic3r/PrintConfig.cpp:831 +#: src/libslic3r/PrintConfig.cpp:1187 src/libslic3r/PrintConfig.cpp:1200 +#: src/libslic3r/PrintConfig.cpp:1225 src/libslic3r/PrintConfig.cpp:1444 +#: src/libslic3r/PrintConfig.cpp:1473 src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1557 src/libslic3r/PrintConfig.cpp:1576 +#: src/libslic3r/PrintConfig.cpp:2395 src/libslic3r/PrintConfig.cpp:2412 msgid "Infill" -msgstr "인필(채움)" +msgstr "인필" -#: src/slic3r/GUI/ConfigManipulation.cpp:337 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Head penetration should not be greater than the head width." -msgstr "헤드 관통은 헤드 폭 보다 크지 않아야 합니다." +msgstr "헤드 접촉길이는 헤드의 지름보다 클 수 없습니다." -#: src/slic3r/GUI/ConfigManipulation.cpp:339 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid Head penetration" -msgstr "잘못된 헤드 관통" +msgstr "헤드 관통 불가" -#: src/slic3r/GUI/ConfigManipulation.cpp:350 +#: src/slic3r/GUI/ConfigManipulation.cpp:362 msgid "Pinhead diameter should be smaller than the pillar diameter." -msgstr "핀헤드 지름은 기둥 지름 보다 작아야 합니다." +msgstr "핀헤드 지름은 기둥 지름보다 클 수 ." -#: src/slic3r/GUI/ConfigManipulation.cpp:352 +#: src/slic3r/GUI/ConfigManipulation.cpp:364 msgid "Invalid pinhead diameter" msgstr "잘못된 핀 헤드 지름" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20 msgid "Upgrade" msgstr "업그레이드" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22 msgid "Downgrade" msgstr "다운그레이드" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 msgid "Before roll back" msgstr "롤백 전에" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:340 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:26 src/libslic3r/PrintConfig.cpp:353 msgid "User" msgstr "사용자" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:329 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:29 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1135 msgid "Unknown" msgstr "알 수 없음" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 msgid "Active" msgstr "활동중" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 msgid "PrusaSlicer version" msgstr "Prusa슬라이서 버전" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 src/libslic3r/Preset.cpp:1341 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 src/libslic3r/Preset.cpp:1480 msgid "print" msgstr "출력" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:65 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 msgid "filaments" msgstr "필라멘트" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 src/libslic3r/Preset.cpp:1343 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:67 src/libslic3r/Preset.cpp:1482 msgid "SLA print" msgstr "SLA 인쇄" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69 -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/slic3r/GUI/GUI.cpp:340 -#: src/slic3r/GUI/Plater.cpp:821 src/libslic3r/Preset.cpp:1344 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/slic3r/GUI/GUI.cpp:331 +#: src/slic3r/GUI/Plater.cpp:851 src/libslic3r/Preset.cpp:1483 msgid "SLA material" msgstr "SLA 재료" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:71 src/libslic3r/Preset.cpp:1345 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 src/libslic3r/Preset.cpp:1484 msgid "printer" msgstr "프린터" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 src/slic3r/GUI/Tab.cpp:1366 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 src/slic3r/GUI/Tab.cpp:1311 msgid "vendor" -msgstr "제조 회사" +msgstr "제조사" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 msgid "version" msgstr "버전" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:76 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 msgid "min PrusaSlicer version" msgstr "이전 slic3r 버전" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:77 msgid "max PrusaSlicer version" msgstr "최신 slic3r 버전" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "model" msgstr "모델" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "variants" msgstr "변종" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:93 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:92 #, c-format, boost-format msgid "Incompatible with this %s" msgstr "%s 와 호환되지 않습니다" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:96 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:95 msgid "Activate" msgstr "활성화" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:123 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:122 msgid "Configuration Snapshots" msgstr "구성 스냅숏" -#: src/slic3r/GUI/ConfigWizard.cpp:262 +#: src/slic3r/GUI/ConfigWizard.cpp:291 msgid "nozzle" msgstr "노즐" -#: src/slic3r/GUI/ConfigWizard.cpp:266 +#: src/slic3r/GUI/ConfigWizard.cpp:295 msgid "Alternate nozzles:" msgstr "대체 노즐:" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "All standard" -msgstr "모두 표준설정" +msgstr "전부 표준설정으로" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "Standard" msgstr "표준" -#: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3833 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 +#: src/slic3r/GUI/ConfigWizard.cpp:360 src/slic3r/GUI/ConfigWizard.cpp:681 +#: src/slic3r/GUI/FileArchiveDialog.cpp:261 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 src/slic3r/GUI/Preferences.cpp:550 +#: src/slic3r/GUI/Tab.cpp:4058 src/slic3r/GUI/UnsavedChangesDialog.cpp:1161 msgid "All" msgstr "모두 선택" -#: src/slic3r/GUI/ConfigWizard.cpp:332 src/slic3r/GUI/ConfigWizard.cpp:652 -#: src/slic3r/GUI/DoubleSlider.cpp:2030 src/slic3r/GUI/Plater.cpp:432 -#: src/slic3r/GUI/Plater.cpp:579 src/slic3r/GUI/Preferences.cpp:436 -#: src/libslic3r/PrintConfig.cpp:1291 +#: src/slic3r/GUI/ConfigWizard.cpp:361 src/slic3r/GUI/ConfigWizard.cpp:682 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 +#: src/slic3r/GUI/FileArchiveDialog.cpp:265 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1984 src/slic3r/GUI/Plater.cpp:439 +#: src/slic3r/GUI/Plater.cpp:594 src/slic3r/GUI/Preferences.cpp:552 +#: src/libslic3r/PrintConfig.cpp:1347 msgid "None" msgstr "없음" -#: src/slic3r/GUI/ConfigWizard.cpp:484 +#: src/slic3r/GUI/ConfigWizard.cpp:513 #, c-format, boost-format msgid "Welcome to the %s Configuration Assistant" msgstr "%s 구성 도우미에 오신 것을 환영 합니다" -#: src/slic3r/GUI/ConfigWizard.cpp:486 +#: src/slic3r/GUI/ConfigWizard.cpp:515 #, c-format, boost-format msgid "Welcome to the %s Configuration Wizard" msgstr "%s 구성 마법사에 오신 것을 환영 합니다" -#: src/slic3r/GUI/ConfigWizard.cpp:488 +#: src/slic3r/GUI/ConfigWizard.cpp:517 msgid "Welcome" msgstr "환영합니다" -#: src/slic3r/GUI/ConfigWizard.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:519 #, c-format, boost-format msgid "" "Hello, welcome to %s! This %s helps you with the initial configuration; just " "a few settings and you will be ready to print." msgstr "" -"안녕하세요 ,%s에 오신 것을 환영 합니다! 이 %s는 초기 구성에 도움이 됩니다. " -"몇 가지 설정만으로 인쇄 준비가 될 것입니다." +"안녕하세요 ,%s에 오신 것을 환영 합니다! 이 %s는 초기 설정에 도움이 됩니다. " +"몇 가지 설정 후 프린팅할 준비가 될 것입니다." -#: src/slic3r/GUI/ConfigWizard.cpp:495 +#: src/slic3r/GUI/ConfigWizard.cpp:524 msgid "Remove user profiles (a snapshot will be taken beforehand)" -msgstr "" +msgstr "유저 프로필 제거(제거 전 스냅샷이 생성될 것입니다.)" -#: src/slic3r/GUI/ConfigWizard.cpp:498 +#: src/slic3r/GUI/ConfigWizard.cpp:527 msgid "" "Perform desktop integration (Sets this binary to be searchable by the " "system)." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:550 +#: src/slic3r/GUI/ConfigWizard.cpp:579 #, c-format, boost-format msgid "%s Family" -msgstr "%s의 가족들" +msgstr "%s사 제품들" -#: src/slic3r/GUI/ConfigWizard.cpp:640 +#: src/slic3r/GUI/ConfigWizard.cpp:670 msgid "Printer:" msgstr "프린터:" -#: src/slic3r/GUI/ConfigWizard.cpp:642 +#: src/slic3r/GUI/ConfigWizard.cpp:672 msgid "Vendor:" msgstr "벤더:" -#: src/slic3r/GUI/ConfigWizard.cpp:643 +#: src/slic3r/GUI/ConfigWizard.cpp:673 msgid "Profile:" msgstr "프로필:" -#: src/slic3r/GUI/ConfigWizard.cpp:720 src/slic3r/GUI/ConfigWizard.cpp:892 -#: src/slic3r/GUI/ConfigWizard.cpp:952 src/slic3r/GUI/ConfigWizard.cpp:1088 +#: src/slic3r/GUI/ConfigWizard.cpp:750 src/slic3r/GUI/ConfigWizard.cpp:938 +#: src/slic3r/GUI/ConfigWizard.cpp:1024 src/slic3r/GUI/ConfigWizard.cpp:1163 msgid "(All)" msgstr "(모두)" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:754 src/slic3r/GUI/ConfigWizard.cpp:1165 +msgid "(Templates)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:789 #, boost-format msgid "" -"%1% marked with * are not compatible with some installed " -"printers." +"%1% visible for (\"Template\") printer are universal profiles " +"available for all printers. These might not be compatible with your printer." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:752 src/slic3r/GUI/ConfigWizard.cpp:2043 -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filaments" msgstr "필라멘트" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 msgid "SLA materials" +msgstr "SLA 레진" + +#: src/slic3r/GUI/ConfigWizard.cpp:791 +#, boost-format +msgid "" +"%1% marked with * are not compatible with some installed " +"printers." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:755 +#: src/slic3r/GUI/ConfigWizard.cpp:794 #, boost-format msgid "All installed printers are compatible with the selected %1%." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/libslic3r/Preset.cpp:1342 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/libslic3r/Preset.cpp:1481 msgid "filament" msgstr "필라멘트" -#: src/slic3r/GUI/ConfigWizard.cpp:778 +#: src/slic3r/GUI/ConfigWizard.cpp:818 msgid "" "Only the following installed printers are compatible with the selected " "filaments" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:779 +#: src/slic3r/GUI/ConfigWizard.cpp:819 msgid "" "Only the following installed printers are compatible with the selected SLA " "materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1213 +msgid "" +"You have selected template filament. Please note that these filaments are " +"available for all printers but are NOT certain to be compatible with your " +"printer. Do you still wish to have this filament selected?\n" +"(This message won't be displayed again.)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1214 src/slic3r/GUI/ConfigWizard.cpp:2720 +#: src/slic3r/GUI/ConfigWizard.cpp:2860 src/slic3r/GUI/DoubleSlider.cpp:2591 +#: src/slic3r/GUI/DoubleSlider.cpp:2612 src/slic3r/GUI/GUI.cpp:245 +#: src/slic3r/GUI/GUI_App.cpp:3458 src/slic3r/GUI/UpdateDialogs.cpp:204 +#: src/slic3r/GUI/UpdateDialogs.cpp:212 src/slic3r/GUI/UpdateDialogs.cpp:217 +#: src/slic3r/GUI/UpdateDialogs.cpp:222 src/slic3r/GUI/UpdateDialogs.cpp:229 +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +msgid "Notice" +msgstr "공지" + +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer Setup" -msgstr "사용자 지정 프린터 설정" +msgstr "커스텀 프린터 설정" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer" -msgstr "사용자 정의 프린터" +msgstr "커스텀 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:1177 +#: src/slic3r/GUI/ConfigWizard.cpp:1264 msgid "Define a custom printer profile" -msgstr "사용자 정의 프린터 프로필" +msgstr "커스텀 프린터 세팅 입력" -#: src/slic3r/GUI/ConfigWizard.cpp:1179 +#: src/slic3r/GUI/ConfigWizard.cpp:1265 msgid "Custom profile name:" -msgstr "사용자 정의 프로필 명칭:" +msgstr "커스텀 프로필 명칭:" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Automatic updates" msgstr "자동 업데이트" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Updates" msgstr "업데이트" -#: src/slic3r/GUI/ConfigWizard.cpp:1214 +#: src/slic3r/GUI/ConfigWizard.cpp:1290 msgid "Check for application updates" msgstr "프로그램 업데이트 확인" -#: src/slic3r/GUI/ConfigWizard.cpp:1218 +#: src/slic3r/GUI/ConfigWizard.cpp:1294 #, c-format, boost-format msgid "" "If enabled, %s checks for new application versions online. When a new " @@ -788,15 +910,15 @@ msgid "" "application startup (never during program usage). This is only a " "notification mechanisms, no automatic installation is done." msgstr "" -"활성화 된 경우 %s은 온라인의 새 버전을 확인합니다. 새 버전을 사용할 수 있게 " -"되면, 다음 응용 프로그램 시작시 알림이 표시됩니다 (프로그램 사용 중에는 절대" -"로 사용하지 마십시오).이것은 단순한 알림 일뿐 자동으로 설치가 되지 않습니다." +"활성화시 %s는 최신버전을 온라인에서 확인합니다. 새 버전이 있을시 프로그램이 " +"켜질 때 알림이 표시됩니다 (켜져있을 때는 알림이표시되지 않습니다).자동으로 설" +"치는 되지 않습니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1224 src/slic3r/GUI/Preferences.cpp:175 +#: src/slic3r/GUI/ConfigWizard.cpp:1300 src/slic3r/GUI/Preferences.cpp:306 msgid "Update built-in Presets automatically" msgstr "기존의 설정 자동 업데이트" -#: src/slic3r/GUI/ConfigWizard.cpp:1228 +#: src/slic3r/GUI/ConfigWizard.cpp:1304 #, c-format, boost-format msgid "" "If enabled, %s downloads updates of built-in system presets in the " @@ -808,7 +930,7 @@ msgstr "" "한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 사전 설정 버전을 사용" "할 수 있게되면 응용 프로그램 시작시 제공됩니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1231 +#: src/slic3r/GUI/ConfigWizard.cpp:1307 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." @@ -816,24 +938,68 @@ msgstr "" "업데이트는 사용자의 동의를 받아야 하고, 지정된 이전 설정을 덮어 쓰지 않습니" "다." -#: src/slic3r/GUI/ConfigWizard.cpp:1236 +#: src/slic3r/GUI/ConfigWizard.cpp:1312 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." msgstr "" "또한 업데이트가 적용되기 전에 전체 구성의 백업 구성(스냅샷)이 생성됩니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1243 src/slic3r/GUI/GUI_Factories.cpp:726 -#: src/slic3r/GUI/Plater.cpp:3582 +#: src/slic3r/GUI/ConfigWizard.cpp:1361 src/slic3r/GUI/Preferences.cpp:1076 +msgid "Download path" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1366 src/slic3r/GUI/FirmwareDialog.cpp:815 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:300 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +msgid "Browse" +msgstr "검색" + +#: src/slic3r/GUI/ConfigWizard.cpp:1371 +msgid "Choose folder:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads from URL" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1417 +msgid "Allow built-in downloader" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1424 +#, c-format, boost-format +msgid "" +"If enabled, %s registers to start on custom URL on www.printables.com. You " +"will be able to use button with %s logo to open models in this %s. The model " +"will be downloaded into folder you choose bellow." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1431 +msgid "" +"On Linux systems the process of registration also creates desktop " +"integration files for this version of application." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1458 +msgid "Chosen directory for downloads does not Exists." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1545 src/slic3r/GUI/GUI_Factories.cpp:810 +#: src/slic3r/GUI/Plater.cpp:3732 msgid "Reload from disk" msgstr "디스크에서 다시 불러오기" -#: src/slic3r/GUI/ConfigWizard.cpp:1246 +#: src/slic3r/GUI/ConfigWizard.cpp:1548 msgid "" "Export full pathnames of models and parts sources into 3mf and amf files" msgstr "모델 및 부품 소스의 전체 경로 이름을 3mf 및 amf 파일로 내보내기" -#: src/slic3r/GUI/ConfigWizard.cpp:1250 +#: src/slic3r/GUI/ConfigWizard.cpp:1552 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked.\n" @@ -845,23 +1011,23 @@ msgstr "" "활성화되지 않으면 디스크에서 다시 로드 명령에서 열린 파일 대화 상자를 사용하" "여 각 파일을 선택하라는 요청이 표시됩니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1259 +#: src/slic3r/GUI/ConfigWizard.cpp:1561 msgid "Files association" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1261 src/slic3r/GUI/Preferences.cpp:157 +#: src/slic3r/GUI/ConfigWizard.cpp:1563 src/slic3r/GUI/Preferences.cpp:292 msgid "Associate .3mf files to PrusaSlicer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1262 src/slic3r/GUI/Preferences.cpp:164 +#: src/slic3r/GUI/ConfigWizard.cpp:1564 src/slic3r/GUI/Preferences.cpp:297 msgid "Associate .stl files to PrusaSlicer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1272 +#: src/slic3r/GUI/ConfigWizard.cpp:1574 msgid "View mode" msgstr "방법 보기" -#: src/slic3r/GUI/ConfigWizard.cpp:1274 +#: src/slic3r/GUI/ConfigWizard.cpp:1576 msgid "" "PrusaSlicer's user interfaces comes in three variants:\n" "Simple, Advanced, and Expert.\n" @@ -875,291 +1041,305 @@ msgstr "" "두 가지는 점진적으로 더 정교한 미세 조정을 제공하며, 각각 고급 및 전문가 사용" "자에게 적합합니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1279 +#: src/slic3r/GUI/ConfigWizard.cpp:1581 msgid "Simple mode" -msgstr "단순 모드" +msgstr "초보자 모드" -#: src/slic3r/GUI/ConfigWizard.cpp:1280 +#: src/slic3r/GUI/ConfigWizard.cpp:1582 msgid "Advanced mode" msgstr "고급 모드" -#: src/slic3r/GUI/ConfigWizard.cpp:1281 +#: src/slic3r/GUI/ConfigWizard.cpp:1583 msgid "Expert mode" msgstr "전문가 모드" -#: src/slic3r/GUI/ConfigWizard.cpp:1287 +#: src/slic3r/GUI/ConfigWizard.cpp:1596 msgid "The size of the object can be specified in inches" -msgstr "" +msgstr "물체의 크기를 인치로 표시 가능합니다" -#: src/slic3r/GUI/ConfigWizard.cpp:1288 +#: src/slic3r/GUI/ConfigWizard.cpp:1597 msgid "Use inches" -msgstr "" +msgstr "인치 사용" -#: src/slic3r/GUI/ConfigWizard.cpp:1322 +#: src/slic3r/GUI/ConfigWizard.cpp:1617 msgid "Other Vendors" -msgstr "다른 공급 업체" +msgstr "다른 벤더" -#: src/slic3r/GUI/ConfigWizard.cpp:1326 +#: src/slic3r/GUI/ConfigWizard.cpp:1621 #, c-format, boost-format msgid "Pick another vendor supported by %s" -msgstr "%s가 지원하는 다른 공급 업체를 선택하십시오:" +msgstr "%s가 지원하는 다른 벤더를 선택하십시오:" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 msgid "Firmware Type" msgstr "펌웨어 종류" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2366 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 src/slic3r/GUI/Tab.cpp:2354 msgid "Firmware" msgstr "펌웨어" -#: src/slic3r/GUI/ConfigWizard.cpp:1361 +#: src/slic3r/GUI/ConfigWizard.cpp:1658 msgid "Choose the type of firmware used by your printer." -msgstr "프린터에 업로드 할 펌웨어를 선택하세요." +msgstr "프린터가 사용하는 펌웨어를 선택하세요." + +#: src/slic3r/GUI/ConfigWizard.cpp:1707 src/slic3r/GUI/ConfigWizard.cpp:1778 +#: src/slic3r/GUI/ConfigWizard.cpp:1783 src/slic3r/GUI/ConfigWizard.cpp:1788 +#: src/slic3r/GUI/Field.cpp:258 src/slic3r/GUI/Field.cpp:328 +#: src/slic3r/GUI/Field.cpp:1585 src/slic3r/GUI/GUI_ObjectLayers.cpp:435 +msgid "Invalid numeric input." +msgstr "잘못된 수치." -#: src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape and Size" msgstr "배드 모양과 크기" -#: src/slic3r/GUI/ConfigWizard.cpp:1399 +#: src/slic3r/GUI/ConfigWizard.cpp:1735 msgid "Set the shape of your printer's bed." -msgstr "프린터 배드모양을 설정하세요." +msgstr "프린터의 배드 모양을 설정하세요." -#: src/slic3r/GUI/ConfigWizard.cpp:1433 src/slic3r/GUI/Field.cpp:255 -#: src/slic3r/GUI/Field.cpp:324 src/slic3r/GUI/Field.cpp:1561 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:435 -msgid "Invalid numeric input." -msgstr "숫자 입력이 잘못 되었습니다." +#: src/slic3r/GUI/ConfigWizard.cpp:1755 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1610 +msgid "Build Volume" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1758 +msgid "Set vertical size of your printer." +msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1795 +msgid "Max print height:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Filament and Nozzle Diameters" msgstr "필라멘트와 노즐 크기" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Print Diameters" -msgstr "인쇄 직경" +msgstr "노즐,필라멘트 직경" -#: src/slic3r/GUI/ConfigWizard.cpp:1472 +#: src/slic3r/GUI/ConfigWizard.cpp:1828 msgid "Enter the diameter of your printer's hot end nozzle." -msgstr "핫 엔드 노즐 직경을 입력하십시오." +msgstr "노즐 직경을 입력하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:1475 +#: src/slic3r/GUI/ConfigWizard.cpp:1831 msgid "Nozzle Diameter:" msgstr "노즐 직경:" -#: src/slic3r/GUI/ConfigWizard.cpp:1485 +#: src/slic3r/GUI/ConfigWizard.cpp:1841 msgid "Enter the diameter of your filament." -msgstr "필라멘트의 직경을 입력하십시오." +msgstr "필라멘트 직경을 입력하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:1486 +#: src/slic3r/GUI/ConfigWizard.cpp:1842 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." msgstr "" -"정밀도가 필요하므로 캘리퍼를 사용하여 필라멘트를 따라 여러 번 측정 한 다음 평" -"균을 계산하십시오." +"정확한 수치가 필요하므로 버니어 캘리퍼로 여러번 측정하여평균값을 입력하십시" +"오." -#: src/slic3r/GUI/ConfigWizard.cpp:1489 +#: src/slic3r/GUI/ConfigWizard.cpp:1845 msgid "Filament Diameter:" msgstr "필라멘트 직경:" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Nozzle and Bed Temperatures" -msgstr "" +msgstr "노즐, 베드 온도" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Temperatures" msgstr "온도" -#: src/slic3r/GUI/ConfigWizard.cpp:1563 +#: src/slic3r/GUI/ConfigWizard.cpp:1919 msgid "Enter the temperature needed for extruding your filament." msgstr "필라멘트 압출에 필요한 온도를 입력하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:1564 +#: src/slic3r/GUI/ConfigWizard.cpp:1920 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "보통 PLA의 경우 160 ~ 230 ° C, ABS의 경우 215 ~ 250 ° C입니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1567 +#: src/slic3r/GUI/ConfigWizard.cpp:1923 msgid "Extrusion Temperature:" msgstr "출력 온도 :" -#: src/slic3r/GUI/ConfigWizard.cpp:1568 src/slic3r/GUI/ConfigWizard.cpp:1582 -#: src/libslic3r/PrintConfig.cpp:418 src/libslic3r/PrintConfig.cpp:1211 -#: src/libslic3r/PrintConfig.cpp:1266 src/libslic3r/PrintConfig.cpp:2842 +#: src/slic3r/GUI/ConfigWizard.cpp:1924 src/slic3r/GUI/ConfigWizard.cpp:1938 +#: src/libslic3r/PrintConfig.cpp:437 src/libslic3r/PrintConfig.cpp:1271 +#: src/libslic3r/PrintConfig.cpp:1326 src/libslic3r/PrintConfig.cpp:2930 +#: src/libslic3r/PrintConfig.cpp:3689 msgid "°C" msgstr "°C" -#: src/slic3r/GUI/ConfigWizard.cpp:1577 +#: src/slic3r/GUI/ConfigWizard.cpp:1933 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." -msgstr "필라멘트가 핫배드에 접착하는데 필요한 온도를 입력하십시오." +msgstr "필라멘트가 온열배드에 안착하는데 필요한 온도를 입력하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:1578 +#: src/slic3r/GUI/ConfigWizard.cpp:1934 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." msgstr "" -"보통은 PLA의 경우 60 ° C이고 ABS의 경우 110 ° C입니다. 핫배드가 없는 경우에" -"는 0으로 두십시오." +"보통 PLA는 60 ° C이고 ABS는 110 ° C입니다. 온열배드가 없는 경우에는 0으로 두" +"십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:1581 +#: src/slic3r/GUI/ConfigWizard.cpp:1937 msgid "Bed Temperature:" msgstr "배드 온도 :" -#: src/slic3r/GUI/ConfigWizard.cpp:2043 src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Materials" -msgstr "SLA 재료" +msgstr "SLA 레진" -#: src/slic3r/GUI/ConfigWizard.cpp:2097 +#: src/slic3r/GUI/ConfigWizard.cpp:2464 msgid "FFF Technology Printers" msgstr "FFF 기술 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:2102 +#: src/slic3r/GUI/ConfigWizard.cpp:2469 msgid "SLA Technology Printers" msgstr "SLA 기술 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:2338 +#: src/slic3r/GUI/ConfigWizard.cpp:2718 #, boost-format msgid "" "Following printer profiles has no default filament: %1%Please select one " "manually." -msgstr "" +msgstr "프린터 프로필에 기본 필라멘트가 없습니다: %1%하나를 선택하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:2339 +#: src/slic3r/GUI/ConfigWizard.cpp:2719 #, boost-format msgid "" "Following printer profiles has no default material: %1%Please select one " "manually." -msgstr "" - -#: src/slic3r/GUI/ConfigWizard.cpp:2340 src/slic3r/GUI/ConfigWizard.cpp:2438 -#: src/slic3r/GUI/DoubleSlider.cpp:2522 src/slic3r/GUI/DoubleSlider.cpp:2543 -#: src/slic3r/GUI/GUI.cpp:232 -msgid "Notice" -msgstr "공지" +msgstr "프린터 프로필에 기본 레진이 없습니다: %1%하나를 선택하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:2459 +#: src/slic3r/GUI/ConfigWizard.cpp:2883 msgid "The following FFF printer models have no filament selected:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2463 +#: src/slic3r/GUI/ConfigWizard.cpp:2887 msgid "Do you want to select default filaments for these FFF printer models?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2477 +#: src/slic3r/GUI/ConfigWizard.cpp:2901 msgid "The following SLA printer models have no materials selected:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2481 +#: src/slic3r/GUI/ConfigWizard.cpp:2905 msgid "Do you want to select default SLA materials for these printer models?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2523 +#: src/slic3r/GUI/ConfigWizard.cpp:2947 msgid "Configuration is edited in ConfigWizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2566 +#: src/slic3r/GUI/ConfigWizard.cpp:3000 msgid "All user presets will be deleted." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2596 +#: src/slic3r/GUI/ConfigWizard.cpp:3037 msgid "A new vendor was installed and one of its printers will be activated" msgid_plural "" "New vendors were installed and one of theirs printers will be activated" msgstr[0] "" -#: src/slic3r/GUI/ConfigWizard.cpp:2625 +#: src/slic3r/GUI/ConfigWizard.cpp:3069 msgid "Do you want to continue changing the configuration?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2691 +#: src/slic3r/GUI/ConfigWizard.cpp:3136 msgid "A new Printer was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2696 +#: src/slic3r/GUI/ConfigWizard.cpp:3141 msgid "Some Printers were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2717 +#: src/slic3r/GUI/ConfigWizard.cpp:3162 msgid "A new filament was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2718 +#: src/slic3r/GUI/ConfigWizard.cpp:3163 msgid "A new SLA material was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some filaments were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some SLA materials were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2773 +#: src/slic3r/GUI/ConfigWizard.cpp:3218 msgid "Custom printer was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2858 +#: src/slic3r/GUI/ConfigWizard.cpp:3306 msgid "Select all standard printers" msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요" -#: src/slic3r/GUI/ConfigWizard.cpp:2861 +#: src/slic3r/GUI/ConfigWizard.cpp:3309 msgid "< &Back" msgstr "< &뒤로" -#: src/slic3r/GUI/ConfigWizard.cpp:2862 +#: src/slic3r/GUI/ConfigWizard.cpp:3310 msgid "&Next >" msgstr "&다음 >" -#: src/slic3r/GUI/ConfigWizard.cpp:2863 +#: src/slic3r/GUI/ConfigWizard.cpp:3311 msgid "&Finish" msgstr "&완료" -#: src/slic3r/GUI/ConfigWizard.cpp:2864 -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:3312 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:657 +#: src/slic3r/GUI/FileArchiveDialog.cpp:274 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 #: src/slic3r/GUI/FirmwareDialog.cpp:153 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1593 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1365 #: src/slic3r/GUI/ProgressStatusBar.cpp:26 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:93 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:879 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:96 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:907 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1606 msgid "Cancel" msgstr "취소" -#: src/slic3r/GUI/ConfigWizard.cpp:2884 +#: src/slic3r/GUI/ConfigWizard.cpp:3332 msgid "Prusa FFF Technology Printers" msgstr "Prusa FFF 방식 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:2892 +#: src/slic3r/GUI/ConfigWizard.cpp:3340 msgid "Prusa MSLA Technology Printers" msgstr "Prusa MSLA 방식 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filament Profiles Selection" msgstr "필라멘트 프로파일 선택" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 src/slic3r/GUI/ConfigWizard.cpp:2915 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 src/slic3r/GUI/ConfigWizard.cpp:3363 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Type:" msgstr "형식:" -#: src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Material Profiles Selection" msgstr "SLA 재질 프로파일 선택" -#: src/slic3r/GUI/ConfigWizard.cpp:3036 +#: src/slic3r/GUI/ConfigWizard.cpp:3486 msgid "Configuration Assistant" msgstr "구성 도우미" -#: src/slic3r/GUI/ConfigWizard.cpp:3037 +#: src/slic3r/GUI/ConfigWizard.cpp:3487 msgid "Configuration &Assistant" msgstr "구성 & 도우미" -#: src/slic3r/GUI/ConfigWizard.cpp:3039 +#: src/slic3r/GUI/ConfigWizard.cpp:3489 msgid "Configuration Wizard" msgstr "구성 마법사" -#: src/slic3r/GUI/ConfigWizard.cpp:3040 +#: src/slic3r/GUI/ConfigWizard.cpp:3490 msgid "Configuration &Wizard" msgstr "구성 & 마법사" @@ -1173,37 +1353,54 @@ msgstr "" msgid "Performing desktop integration failed - Could not find executable." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:378 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:383 msgid "" "Performing desktop integration failed because the application directory was " "not found." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:419 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:423 msgid "" "Performing desktop integration failed - could not create Gcodeviewer desktop " "file. PrusaSlicer desktop file was probably created successfully." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:459 -#: src/slic3r/GUI/GUI_App.cpp:2245 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:472 +msgid "" +"Performing downloader desktop integration failed - boost::filesystem::" +"canonical did not return appimage path." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:484 +msgid "" +"Performing downloader desktop integration failed - Could not find executable." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:602 +msgid "" +"Performing downloader desktop integration failed because the application " +"directory was not found." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:626 +#: src/slic3r/GUI/GUI_App.cpp:2407 msgid "Desktop Integration" msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:466 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:633 msgid "" "Desktop Integration sets this binary to be searchable by the system.\n" "\n" "Press \"Perform\" to proceed." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:480 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:647 msgid "Perform" msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1342 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:653 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/KBShortcutsDialog.cpp:106 +#: src/slic3r/GUI/MainFrame.cpp:1426 msgid "Undo" msgstr "되돌리기" @@ -1211,19 +1408,19 @@ msgstr "되돌리기" msgid "Place bearings in slots and resume printing" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1379 +#: src/slic3r/GUI/DoubleSlider.cpp:1448 msgid "One layer mode" msgstr "하나의 레이어 모드" -#: src/slic3r/GUI/DoubleSlider.cpp:1381 +#: src/slic3r/GUI/DoubleSlider.cpp:1450 msgid "Discard all custom changes" msgstr "모든 사용자 지정 변경 내용 삭제" -#: src/slic3r/GUI/DoubleSlider.cpp:1385 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:1454 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to move" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1388 +#: src/slic3r/GUI/DoubleSlider.cpp:1457 #, c-format, boost-format msgid "" "Jump to height %s\n" @@ -1231,58 +1428,58 @@ msgid "" "or Set extruder sequence for the entire print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1391 +#: src/slic3r/GUI/DoubleSlider.cpp:1460 #, c-format, boost-format msgid "" "Jump to height %s\n" "or Set ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1396 +#: src/slic3r/GUI/DoubleSlider.cpp:1465 msgid "Edit current color - Right click the colored slider segment" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1398 +#: src/slic3r/GUI/DoubleSlider.cpp:1467 msgid "This is wipe tower layer" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1408 +#: src/slic3r/GUI/DoubleSlider.cpp:1477 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing sequentually." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1412 +#: src/slic3r/GUI/DoubleSlider.cpp:1481 msgid "Print mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1426 +#: src/slic3r/GUI/DoubleSlider.cpp:1495 msgid "Add extruder change - Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1428 +#: src/slic3r/GUI/DoubleSlider.cpp:1497 msgid "" "Add color change - Left click for predefined color or Shift + Left click for " "custom color selection" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1430 +#: src/slic3r/GUI/DoubleSlider.cpp:1499 msgid "Add color change - Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1431 +#: src/slic3r/GUI/DoubleSlider.cpp:1500 msgid "or press \"+\" key" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1433 +#: src/slic3r/GUI/DoubleSlider.cpp:1502 msgid "Add another code - Ctrl + Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1434 +#: src/slic3r/GUI/DoubleSlider.cpp:1503 msgid "Add another code - Right click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1440 +#: src/slic3r/GUI/DoubleSlider.cpp:1509 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing " @@ -1290,272 +1487,274 @@ msgid "" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1458 +#: src/slic3r/GUI/DoubleSlider.cpp:1527 msgid "continue" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1466 +#: src/slic3r/GUI/DoubleSlider.cpp:1535 #, boost-format msgid "Color change (\"%1%\")" msgstr "색상 변경(\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1467 +#: src/slic3r/GUI/DoubleSlider.cpp:1536 #, boost-format msgid "Color change (\"%1%\") for Extruder %2%" msgstr "압출기 %2%의 색상 변경(\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1469 +#: src/slic3r/GUI/DoubleSlider.cpp:1538 #, boost-format msgid "Pause print (\"%1%\")" msgstr "일시 중지 인쇄(\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1471 +#: src/slic3r/GUI/DoubleSlider.cpp:1540 #, boost-format msgid "Custom template (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1473 +#: src/slic3r/GUI/DoubleSlider.cpp:1542 #, boost-format msgid "Extruder (tool) is changed to Extruder \"%1%\"" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1480 +#: src/slic3r/GUI/DoubleSlider.cpp:1549 msgid "Note" msgstr "메모" -#: src/slic3r/GUI/DoubleSlider.cpp:1482 +#: src/slic3r/GUI/DoubleSlider.cpp:1551 msgid "" "G-code associated to this tick mark is in a conflict with print mode.\n" "Editing it will cause changes of Slider data." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1485 +#: src/slic3r/GUI/DoubleSlider.cpp:1554 msgid "" "There is a color change for extruder that won't be used till the end of " "print job.\n" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1488 +#: src/slic3r/GUI/DoubleSlider.cpp:1557 msgid "" "There is an extruder change set to the same extruder.\n" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1491 +#: src/slic3r/GUI/DoubleSlider.cpp:1560 msgid "" "There is a color change for extruder that has not been used before.\n" "Check your settings to avoid redundant color changes." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1496 +#: src/slic3r/GUI/DoubleSlider.cpp:1565 msgid "Delete tick mark - Left click or press \"-\" key" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1498 +#: src/slic3r/GUI/DoubleSlider.cpp:1567 msgid "Edit tick mark - Ctrl + Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1499 +#: src/slic3r/GUI/DoubleSlider.cpp:1568 msgid "Edit tick mark - Right click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1602 src/slic3r/GUI/DoubleSlider.cpp:1633 -#: src/slic3r/GUI/GUI_Factories.cpp:778 +#: src/slic3r/GUI/DoubleSlider.cpp:1671 src/slic3r/GUI/DoubleSlider.cpp:1702 +#: src/slic3r/GUI/GUI_Factories.cpp:862 #, c-format, boost-format msgid "Extruder %d" msgstr "익스트루더 %d" -#: src/slic3r/GUI/DoubleSlider.cpp:1603 src/slic3r/GUI/GUI_Factories.cpp:779 +#: src/slic3r/GUI/DoubleSlider.cpp:1672 src/slic3r/GUI/GUI_Factories.cpp:863 msgid "active" msgstr "활성" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 msgid "Switch code to Change extruder" msgstr "코드 전환- 압출기 변경" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Change extruder" msgstr "압출기(익스트루더) 변경" -#: src/slic3r/GUI/DoubleSlider.cpp:1613 +#: src/slic3r/GUI/DoubleSlider.cpp:1682 msgid "Change extruder (N/A)" msgstr "돌출자 변경(N/A)" -#: src/slic3r/GUI/DoubleSlider.cpp:1615 src/slic3r/GUI/GUI_Factories.cpp:787 +#: src/slic3r/GUI/DoubleSlider.cpp:1684 src/slic3r/GUI/GUI_Factories.cpp:871 msgid "Use another extruder" msgstr "다른 압출기 사용" -#: src/slic3r/GUI/DoubleSlider.cpp:1634 +#: src/slic3r/GUI/DoubleSlider.cpp:1703 msgid "used" msgstr "사용됨" -#: src/slic3r/GUI/DoubleSlider.cpp:1642 +#: src/slic3r/GUI/DoubleSlider.cpp:1711 #, boost-format msgid "Switch code to Color change (%1%) for:" msgstr "코드 에서 색상 변경(%1%) 에 대 한:" -#: src/slic3r/GUI/DoubleSlider.cpp:1643 +#: src/slic3r/GUI/DoubleSlider.cpp:1712 #, boost-format msgid "Add color change (%1%) for:" msgstr "색상 변경 추가(%1%) 에 대 한:" -#: src/slic3r/GUI/DoubleSlider.cpp:1968 +#: src/slic3r/GUI/DoubleSlider.cpp:2037 msgid "Add color change" msgstr "색상 변경 추가" -#: src/slic3r/GUI/DoubleSlider.cpp:1979 +#: src/slic3r/GUI/DoubleSlider.cpp:2048 msgid "Add pause print" msgstr "일시 정지 인쇄 추가" -#: src/slic3r/GUI/DoubleSlider.cpp:1983 +#: src/slic3r/GUI/DoubleSlider.cpp:2052 msgid "Add custom template" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1986 +#: src/slic3r/GUI/DoubleSlider.cpp:2055 msgid "Add custom G-code" msgstr "사용자 지정 G 코드 추가" -#: src/slic3r/GUI/DoubleSlider.cpp:2004 +#: src/slic3r/GUI/DoubleSlider.cpp:2073 msgid "Edit color" msgstr "색상 편집" -#: src/slic3r/GUI/DoubleSlider.cpp:2005 +#: src/slic3r/GUI/DoubleSlider.cpp:2074 msgid "Edit pause print message" msgstr "일시 정지 인쇄 메시지 편집" -#: src/slic3r/GUI/DoubleSlider.cpp:2006 +#: src/slic3r/GUI/DoubleSlider.cpp:2075 msgid "Edit custom G-code" msgstr "사용자 지정 G 코드 편집" -#: src/slic3r/GUI/DoubleSlider.cpp:2012 +#: src/slic3r/GUI/DoubleSlider.cpp:2081 msgid "Delete color change" msgstr "색상 변경 삭제" -#: src/slic3r/GUI/DoubleSlider.cpp:2013 +#: src/slic3r/GUI/DoubleSlider.cpp:2082 msgid "Delete tool change" msgstr "도구 변경 삭제" -#: src/slic3r/GUI/DoubleSlider.cpp:2014 +#: src/slic3r/GUI/DoubleSlider.cpp:2083 msgid "Delete pause print" msgstr "일시 정지 인쇄 삭제" -#: src/slic3r/GUI/DoubleSlider.cpp:2015 +#: src/slic3r/GUI/DoubleSlider.cpp:2084 msgid "Delete custom G-code" msgstr "사용자 지정 G 코드 삭제" -#: src/slic3r/GUI/DoubleSlider.cpp:2025 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:2094 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to height" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2030 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 msgid "Hide ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height on the ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time on the ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Set ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2047 +#: src/slic3r/GUI/DoubleSlider.cpp:2116 msgid "Set extruder sequence for the entire print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2051 +#: src/slic3r/GUI/DoubleSlider.cpp:2120 msgid "Set auto color changes" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2086 +#: src/slic3r/GUI/DoubleSlider.cpp:2155 msgid "This action will cause deletion of all ticks on vertical slider." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2087 src/slic3r/GUI/Tab.cpp:1318 +#: src/slic3r/GUI/DoubleSlider.cpp:2156 src/slic3r/GUI/Tab.cpp:1263 msgid "" "This action is not revertible.\n" "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2088 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1133 src/slic3r/GUI/GUI.cpp:245 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:649 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:679 -#: src/slic3r/GUI/WipeTowerDialog.cpp:58 src/slic3r/GUI/WipeTowerDialog.cpp:443 +#: src/slic3r/GUI/DoubleSlider.cpp:2157 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:537 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1119 src/slic3r/GUI/GUI.cpp:258 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:721 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:751 +#: src/slic3r/GUI/WipeTowerDialog.cpp:60 src/slic3r/GUI/WipeTowerDialog.cpp:445 msgid "Warning" msgstr "위험" -#: src/slic3r/GUI/DoubleSlider.cpp:2216 +#: src/slic3r/GUI/DoubleSlider.cpp:2285 msgid "Enter custom G-code used on current layer" msgstr "현재 레이어에 사용되는 사용자 지정 G 코드를 입력합니다." -#: src/slic3r/GUI/DoubleSlider.cpp:2217 +#: src/slic3r/GUI/DoubleSlider.cpp:2286 #, boost-format msgid "Custom G-code on current layer (%1% mm)." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2238 +#: src/slic3r/GUI/DoubleSlider.cpp:2307 msgid "Enter short message shown on Printer display when a print is paused" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2239 +#: src/slic3r/GUI/DoubleSlider.cpp:2308 #, boost-format msgid "Message for pause print on current layer (%1% mm)." msgstr "현재 레이어에서 일시 중지 인쇄를 위한 메시지(%1% mm)." -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the move you want to jump to" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the height you want to jump to" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2515 +#: src/slic3r/GUI/DoubleSlider.cpp:2584 msgid "The last color change data was saved for a single extruder printing." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2516 src/slic3r/GUI/DoubleSlider.cpp:2532 +#: src/slic3r/GUI/DoubleSlider.cpp:2585 src/slic3r/GUI/DoubleSlider.cpp:2601 msgid "The last color change data was saved for a multi extruder printing." msgstr "다중 압출기 인쇄를 위해 마지막 색상 변경 데이터가 저장되었습니다." -#: src/slic3r/GUI/DoubleSlider.cpp:2518 +#: src/slic3r/GUI/DoubleSlider.cpp:2587 msgid "Your current changes will delete all saved color changes." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2519 src/slic3r/GUI/DoubleSlider.cpp:2540 +#: src/slic3r/GUI/DoubleSlider.cpp:2588 src/slic3r/GUI/DoubleSlider.cpp:2609 msgid "Are you sure you want to continue?" msgstr "정말 계속하기를 원하십니까?" -#: src/slic3r/GUI/DoubleSlider.cpp:2533 +#: src/slic3r/GUI/DoubleSlider.cpp:2602 msgid "" "Select YES if you want to delete all saved tool changes, \n" "NO if you want all tool changes switch to color changes, \n" "or CANCEL to leave it unchanged." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2536 +#: src/slic3r/GUI/DoubleSlider.cpp:2605 msgid "Do you want to delete all saved tool changes?" msgstr "저장된 도구 변경 내용을 모두 삭제하시겠습니까?" -#: src/slic3r/GUI/DoubleSlider.cpp:2538 +#: src/slic3r/GUI/DoubleSlider.cpp:2607 msgid "" "The last color change data was saved for a multi extruder printing with tool " "changes for whole print." @@ -1563,18 +1762,32 @@ msgstr "" "마지막 색상 변경 데이터는 전체 인쇄에 대한 도구 변경이 있는 다중 압출기 인쇄" "를 위해 저장되었습니다." -#: src/slic3r/GUI/DoubleSlider.cpp:2539 +#: src/slic3r/GUI/DoubleSlider.cpp:2608 msgid "Your current changes will delete all saved extruder (tool) changes." msgstr "" -#: src/slic3r/GUI/ExtraRenderers.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:538 -#: src/slic3r/GUI/GUI_ObjectList.cpp:550 src/slic3r/GUI/GUI_ObjectList.cpp:979 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4291 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:250 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:352 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:376 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:607 src/libslic3r/PrintConfig.cpp:800 +#: src/slic3r/GUI/Downloader.cpp:150 +#, boost-format +msgid "" +"Download won't start. Download URL doesn't point to https://files.printables." +"com : %1%" +msgstr "" + +#: src/slic3r/GUI/Downloader.cpp:181 +msgid "The download has failed:" +msgstr "" + +#: src/slic3r/GUI/DownloaderFileGet.cpp:193 +#, boost-format +msgid "Can't create file at %1%." +msgstr "" + +#: src/slic3r/GUI/ExtraRenderers.cpp:323 src/slic3r/GUI/GUI_ObjectList.cpp:571 +#: src/slic3r/GUI/GUI_ObjectList.cpp:583 src/slic3r/GUI/GUI_ObjectList.cpp:1043 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2125 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3013 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4884 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:259 src/libslic3r/PrintConfig.cpp:894 msgid "default" msgstr "기본값" @@ -1587,10 +1800,10 @@ msgid "Set extruder change for every" msgstr "모든 압출기 변경 설정" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:60 -#: src/libslic3r/PrintConfig.cpp:662 src/libslic3r/PrintConfig.cpp:1430 -#: src/libslic3r/PrintConfig.cpp:2135 src/libslic3r/PrintConfig.cpp:2310 -#: src/libslic3r/PrintConfig.cpp:2386 src/libslic3r/PrintConfig.cpp:2639 -#: src/libslic3r/PrintConfig.cpp:2687 src/libslic3r/PrintConfig.cpp:2706 +#: src/libslic3r/PrintConfig.cpp:765 src/libslic3r/PrintConfig.cpp:1476 +#: src/libslic3r/PrintConfig.cpp:2165 src/libslic3r/PrintConfig.cpp:2343 +#: src/libslic3r/PrintConfig.cpp:2417 src/libslic3r/PrintConfig.cpp:2665 +#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2728 msgid "layers" msgstr "레이어" @@ -1622,42 +1835,42 @@ msgstr "시퀀스에서 압출기 제거" msgid "Add extruder to sequence" msgstr "시퀀스에 압출기 추가" -#: src/slic3r/GUI/Field.cpp:190 +#: src/slic3r/GUI/Field.cpp:188 msgid "default value" msgstr "기본값" -#: src/slic3r/GUI/Field.cpp:193 +#: src/slic3r/GUI/Field.cpp:191 msgid "parameter name" msgstr "매개 변수 명칭" -#: src/slic3r/GUI/Field.cpp:204 src/slic3r/GUI/OptionsGroup.cpp:827 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1067 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1079 +#: src/slic3r/GUI/Field.cpp:206 src/slic3r/GUI/OptionsGroup.cpp:852 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1074 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1086 msgid "N/A" msgstr "N/A" -#: src/slic3r/GUI/Field.cpp:226 src/slic3r/GUI/Field.cpp:298 +#: src/slic3r/GUI/Field.cpp:229 src/slic3r/GUI/Field.cpp:302 #, c-format, boost-format msgid "%s doesn't support percentage" msgstr "%s 이(가) 백분율을 지원하지 않음" -#: src/slic3r/GUI/Field.cpp:266 +#: src/slic3r/GUI/Field.cpp:269 #, c-format, boost-format msgid "" "Input value is out of range\n" "Are you sure that %s is a correct value and that you want to continue?" msgstr "" -#: src/slic3r/GUI/Field.cpp:269 src/slic3r/GUI/Field.cpp:343 +#: src/slic3r/GUI/Field.cpp:272 src/slic3r/GUI/Field.cpp:347 msgid "Parameter validation" msgstr "매개 변수 유효성 검사" -#: src/slic3r/GUI/Field.cpp:282 src/slic3r/GUI/Field.cpp:390 -#: src/slic3r/GUI/Field.cpp:1573 +#: src/slic3r/GUI/Field.cpp:285 src/slic3r/GUI/Field.cpp:394 +#: src/slic3r/GUI/Field.cpp:1597 msgid "Input value is out of range" msgstr "입력 값이 범위를 벗어났습니다." -#: src/slic3r/GUI/Field.cpp:340 +#: src/slic3r/GUI/Field.cpp:344 #, c-format, boost-format msgid "" "Do you mean %s%% instead of %s %s?\n" @@ -1668,13 +1881,22 @@ msgstr "" "이 값을 %s%%, 로 변경하려면 YES를 선택하십시오. \n" "또는 %s %s 이(가) 올바른 값인지 확인하는 경우 NO를 선택하세요." -#: src/slic3r/GUI/Field.cpp:397 +#: src/slic3r/GUI/Field.cpp:401 #, boost-format msgid "" "Invalid input format. Expected vector of dimensions in the following format: " "\"%1%\"" msgstr "" +#: src/slic3r/GUI/FileArchiveDialog.cpp:170 +msgid "Archive preview" +msgstr "" + +#: src/slic3r/GUI/FileArchiveDialog.cpp:270 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +msgid "Open" +msgstr "" + #: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flash!" msgstr "완료!" @@ -1759,12 +1981,6 @@ msgstr "펌웨어 이미지:" msgid "Select a file" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:815 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:297 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:372 -msgid "Browse" -msgstr "검색" - #: src/slic3r/GUI/FirmwareDialog.cpp:817 msgid "Serial port:" msgstr "시리얼 포트:" @@ -1794,10 +2010,10 @@ msgid "Advanced: Output log" msgstr "고급: 출력 로그" #: src/slic3r/GUI/FirmwareDialog.cpp:862 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:310 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:358 #: src/slic3r/GUI/Mouse3DController.cpp:543 -#: src/slic3r/GUI/PrintHostDialogs.cpp:261 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:122 +#: src/slic3r/GUI/PrintHostDialogs.cpp:313 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:125 msgid "Close" msgstr "닫기" @@ -1817,7 +2033,7 @@ msgstr "확인" msgid "Cancelling..." msgstr "취소 중...." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1488 msgid "Shape Gallery" msgstr "" @@ -1825,903 +2041,1904 @@ msgstr "" msgid "Select shape from the gallery" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:100 -msgid "Add to bed" -msgstr "" - -#: src/slic3r/GUI/GalleryDialog.cpp:101 -msgid "Add selected shape(s) to the bed" -msgstr "" - -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4152 +#: src/slic3r/GUI/GalleryDialog.cpp:114 src/slic3r/GUI/Tab.cpp:4377 msgid "Add" msgstr "추가" -#: src/slic3r/GUI/GalleryDialog.cpp:117 +#: src/slic3r/GUI/GalleryDialog.cpp:114 msgid "Add one or more custom shapes" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:506 -#: src/slic3r/GUI/GLCanvas3D.cpp:4547 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/GalleryDialog.cpp:115 src/slic3r/GUI/GalleryDialog.cpp:528 +#: src/slic3r/GUI/GLCanvas3D.cpp:4638 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/GUI_Factories.cpp:460 src/slic3r/GUI/Tab.cpp:3973 msgid "Delete" msgstr "지우기 " -#: src/slic3r/GUI/GalleryDialog.cpp:118 +#: src/slic3r/GUI/GalleryDialog.cpp:115 msgid "Delete one or more custom shape. You can't delete system shapes" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:400 +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "Add to bed" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "OK" +msgstr "확인" + +#: src/slic3r/GUI/GalleryDialog.cpp:143 +msgid "Add selected shape(s) to the bed" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:422 msgid "Choose one or more files (STL, OBJ):" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:440 +#: src/slic3r/GUI/GalleryDialog.cpp:462 #, boost-format msgid "" "It looks like selected %1%-file has an error or is destructed.\n" "We can't load this file" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:451 +#: src/slic3r/GUI/GalleryDialog.cpp:473 msgid "Choose one PNG file:" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:464 +#: src/slic3r/GUI/GalleryDialog.cpp:486 msgid "Replacing of the PNG" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:508 +#: src/slic3r/GUI/GalleryDialog.cpp:530 msgid "Change thumbnail" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:549 src/slic3r/GUI/GalleryDialog.cpp:554 +#: src/slic3r/GUI/GalleryDialog.cpp:571 src/slic3r/GUI/GalleryDialog.cpp:576 #, boost-format msgid "Loading of the \"%1%\"" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:274 +#: src/slic3r/GUI/GCodeViewer.cpp:343 msgid "Tool position" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1457 +#: src/slic3r/GUI/GCodeViewer.cpp:1547 msgid "Generating toolpaths" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1517 +#: src/slic3r/GUI/GCodeViewer.cpp:1619 msgid "Generating vertex buffer" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1857 +#: src/slic3r/GUI/GCodeViewer.cpp:1979 msgid "Generating index buffers" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to hide" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to show" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3181 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 msgid "up to" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3187 +#: src/slic3r/GUI/GCodeViewer.cpp:3455 msgid "above" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "from" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "to" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3245 src/slic3r/GUI/GCodeViewer.cpp:3246 -#: src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3513 src/slic3r/GUI/GCodeViewer.cpp:3514 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 msgid "Percentage" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3570 msgid "Feature type" msgstr "특색 유형" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3592 #: src/slic3r/GUI/RammingChart.cpp:90 msgid "Time" msgstr "시간" -#: src/slic3r/GUI/GCodeViewer.cpp:3295 src/slic3r/GUI/GCodeViewer.cpp:3306 -#: src/slic3r/GUI/GCodeViewer.cpp:3566 -msgid "Used filament" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3298 +#: src/slic3r/GUI/GCodeViewer.cpp:3571 msgid "Height (mm)" msgstr "높이 (mm)" -#: src/slic3r/GUI/GCodeViewer.cpp:3299 +#: src/slic3r/GUI/GCodeViewer.cpp:3572 msgid "Width (mm)" msgstr "폭 (mm)" -#: src/slic3r/GUI/GCodeViewer.cpp:3300 +#: src/slic3r/GUI/GCodeViewer.cpp:3573 msgid "Speed (mm/s)" msgstr "속도 (mm/s)" -#: src/slic3r/GUI/GCodeViewer.cpp:3301 -msgid "Fan Speed (%)" -msgstr "팬 속도(%)" +#: src/slic3r/GUI/GCodeViewer.cpp:3574 +msgid "Fan speed (%)" +msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3302 +#: src/slic3r/GUI/GCodeViewer.cpp:3575 msgid "Temperature (°C)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3303 +#: src/slic3r/GUI/GCodeViewer.cpp:3576 msgid "Volumetric flow rate (mm³/s)" msgstr "체적 유량(mm³/s)" -#: src/slic3r/GUI/GCodeViewer.cpp:3306 src/slic3r/GUI/GUI_Preview.cpp:224 -#: src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3577 +msgid "Layer time (linear)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3578 +msgid "Layer time (logarithmic)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3579 msgid "Tool" msgstr "도구" -#: src/slic3r/GUI/GCodeViewer.cpp:3309 src/slic3r/GUI/GUI_Preview.cpp:225 -#: src/slic3r/GUI/GUI_Preview.cpp:957 +#: src/slic3r/GUI/GCodeViewer.cpp:3580 msgid "Color Print" msgstr "컬러 프린트" -#: src/slic3r/GUI/GCodeViewer.cpp:3347 src/slic3r/GUI/GCodeViewer.cpp:3393 -#: src/slic3r/GUI/GCodeViewer.cpp:3398 src/slic3r/GUI/GUI_ObjectList.cpp:312 -#: src/slic3r/GUI/wxExtensions.cpp:536 src/libslic3r/PrintConfig.cpp:795 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 src/slic3r/GUI/GCodeViewer.cpp:3594 +#: src/slic3r/GUI/GCodeViewer.cpp:3860 +msgid "Used filament" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3623 src/slic3r/GUI/GCodeViewer.cpp:4067 +#: src/libslic3r/PrintConfig.cpp:3025 +msgid "Travel" +msgstr "이송" + +#: src/slic3r/GUI/GCodeViewer.cpp:3640 src/slic3r/GUI/GCodeViewer.cpp:3685 +#: src/slic3r/GUI/GCodeViewer.cpp:3689 src/slic3r/GUI/GUI_ObjectList.cpp:338 +#: src/slic3r/GUI/wxExtensions.cpp:547 src/libslic3r/PrintConfig.cpp:888 msgid "Extruder" msgstr "익스트루더(Extruder)" -#: src/slic3r/GUI/GCodeViewer.cpp:3370 +#: src/slic3r/GUI/GCodeViewer.cpp:3662 msgid "Default color" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3393 +#: src/slic3r/GUI/GCodeViewer.cpp:3685 msgid "default color" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3491 src/slic3r/GUI/GCodeViewer.cpp:3547 +#: src/slic3r/GUI/GCodeViewer.cpp:3785 src/slic3r/GUI/GCodeViewer.cpp:3841 msgid "Color change" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3510 src/slic3r/GUI/GCodeViewer.cpp:3545 +#: src/slic3r/GUI/GCodeViewer.cpp:3804 src/slic3r/GUI/GCodeViewer.cpp:3839 msgid "Print" msgstr "인쇄" -#: src/slic3r/GUI/GCodeViewer.cpp:3546 src/slic3r/GUI/GCodeViewer.cpp:3580 +#: src/slic3r/GUI/GCodeViewer.cpp:3840 src/slic3r/GUI/GCodeViewer.cpp:3874 msgid "Pause" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Event" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Remaining time" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Duration" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3609 src/slic3r/GUI/GUI_Preview.cpp:1049 -#: src/libslic3r/PrintConfig.cpp:2937 -msgid "Travel" -msgstr "이송" +#: src/slic3r/GUI/GCodeViewer.cpp:3928 src/slic3r/GUI/GUI.cpp:332 +#: src/slic3r/GUI/Plater.cpp:852 src/libslic3r/PrintConfig.cpp:335 +msgid "Printer" +msgstr "프린터" + +#: src/slic3r/GUI/GCodeViewer.cpp:3931 src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/Plater.cpp:848 +msgid "Print settings" +msgstr "프린트 설정" + +#: src/slic3r/GUI/GCodeViewer.cpp:3936 src/slic3r/GUI/GUI.cpp:330 +#: src/slic3r/GUI/Plater.cpp:849 src/slic3r/GUI/Tab.cpp:1930 +#: src/slic3r/GUI/Tab.cpp:1931 +msgid "Filament" +msgstr "필라멘트" -#: src/slic3r/GUI/GCodeViewer.cpp:3612 -msgid "Movement" +#: src/slic3r/GUI/GCodeViewer.cpp:3950 +msgid "Estimated printing times" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3613 -msgid "Extrusion" +#: src/slic3r/GUI/GCodeViewer.cpp:3969 +msgid "Normal mode" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1870 -#: src/slic3r/GUI/Tab.cpp:2812 -msgid "Retraction" -msgstr "리트렉션" +#: src/slic3r/GUI/GCodeViewer.cpp:3970 +msgid "Stealth mode" +msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3631 src/slic3r/GUI/GCodeViewer.cpp:3634 -#: src/slic3r/GUI/GUI_Preview.cpp:1050 -msgid "Wipe" +#: src/slic3r/GUI/GCodeViewer.cpp:3979 src/libslic3r/PrintConfig.cpp:1249 +#: src/libslic3r/PrintConfig.cpp:1267 src/libslic3r/PrintConfig.cpp:1277 +#: src/libslic3r/PrintConfig.cpp:1322 +msgid "First layer" +msgstr "첫 레이어" + +#: src/slic3r/GUI/GCodeViewer.cpp:3983 +msgid "Total" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3666 src/slic3r/GUI/GUI_Preview.cpp:257 -#: src/slic3r/GUI/GUI_Preview.cpp:272 -msgid "Options" -msgstr "설정" +#: src/slic3r/GUI/GCodeViewer.cpp:4002 +msgid "Show stealth mode" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:4006 +msgid "Show normal mode" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:4071 +msgid "Wipe" +msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3669 src/slic3r/GUI/GUI_Preview.cpp:1051 +#: src/slic3r/GUI/GCodeViewer.cpp:4075 msgid "Retractions" msgstr "리트랙션" -#: src/slic3r/GUI/GCodeViewer.cpp:3670 src/slic3r/GUI/GUI_Preview.cpp:1052 +#: src/slic3r/GUI/GCodeViewer.cpp:4079 msgid "Deretractions" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3671 src/slic3r/GUI/GUI_Preview.cpp:1053 +#: src/slic3r/GUI/GCodeViewer.cpp:4083 msgid "Seams" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3672 src/slic3r/GUI/GUI_Preview.cpp:1054 +#: src/slic3r/GUI/GCodeViewer.cpp:4087 msgid "Tool changes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3673 src/slic3r/GUI/GUI_Preview.cpp:1055 +#: src/slic3r/GUI/GCodeViewer.cpp:4091 msgid "Color changes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3674 src/slic3r/GUI/GUI_Preview.cpp:1056 +#: src/slic3r/GUI/GCodeViewer.cpp:4095 msgid "Print pauses" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3675 src/slic3r/GUI/GUI_Preview.cpp:1057 +#: src/slic3r/GUI/GCodeViewer.cpp:4099 msgid "Custom G-codes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3695 src/slic3r/GUI/GCodeViewer.cpp:3714 -#: src/slic3r/GUI/GUI.cpp:341 src/slic3r/GUI/Plater.cpp:822 -#: src/libslic3r/PrintConfig.cpp:322 -msgid "Printer" -msgstr "프린터" - -#: src/slic3r/GUI/GCodeViewer.cpp:3697 src/slic3r/GUI/GCodeViewer.cpp:3719 -#: src/slic3r/GUI/GUI.cpp:337 src/slic3r/GUI/Plater.cpp:818 -msgid "Print settings" -msgstr "프린트 설정" +#: src/slic3r/GUI/GCodeViewer.cpp:4103 +msgid "Center of gravity" +msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 -#: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1970 src/slic3r/GUI/Tab.cpp:1971 -msgid "Filament" -msgstr "필라멘트" +#: src/slic3r/GUI/GCodeViewer.cpp:4108 +msgid "Shells" +msgstr "쉘(Shells)" -#: src/slic3r/GUI/GCodeViewer.cpp:3739 -msgid "Estimated printing times" +#: src/slic3r/GUI/GCodeViewer.cpp:4113 +msgid "Tool marker" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3758 -msgid "Normal mode" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3759 -msgid "Stealth mode" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3766 src/libslic3r/PrintConfig.cpp:1189 -#: src/libslic3r/PrintConfig.cpp:1207 src/libslic3r/PrintConfig.cpp:1217 -#: src/libslic3r/PrintConfig.cpp:1262 -msgid "First layer" -msgstr "첫 레이어" - -#: src/slic3r/GUI/GCodeViewer.cpp:3767 -msgid "Total" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3796 -msgid "Show stealth mode" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3800 -msgid "Show normal mode" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:225 src/slic3r/GUI/GLCanvas3D.cpp:4694 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:53 +#: src/slic3r/GUI/GLCanvas3D.cpp:185 src/slic3r/GUI/GLCanvas3D.cpp:4784 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:71 msgid "Variable layer height" msgstr "가변 레이어 높이" -#: src/slic3r/GUI/GLCanvas3D.cpp:227 +#: src/slic3r/GUI/GLCanvas3D.cpp:187 msgid "Left mouse button:" msgstr "왼쪽 마우스 단추:" -#: src/slic3r/GUI/GLCanvas3D.cpp:229 +#: src/slic3r/GUI/GLCanvas3D.cpp:189 msgid "Add detail" msgstr "디테일 추가" -#: src/slic3r/GUI/GLCanvas3D.cpp:231 +#: src/slic3r/GUI/GLCanvas3D.cpp:191 msgid "Right mouse button:" msgstr "오른쪽 마우스 버튼:" -#: src/slic3r/GUI/GLCanvas3D.cpp:233 +#: src/slic3r/GUI/GLCanvas3D.cpp:193 msgid "Remove detail" msgstr "디테일 제거" -#: src/slic3r/GUI/GLCanvas3D.cpp:235 +#: src/slic3r/GUI/GLCanvas3D.cpp:195 msgid "Shift + Left mouse button:" msgstr "시프트 + 왼쪽 마우스 버튼:" -#: src/slic3r/GUI/GLCanvas3D.cpp:237 +#: src/slic3r/GUI/GLCanvas3D.cpp:197 msgid "Reset to base" msgstr "기본으로 재설정" -#: src/slic3r/GUI/GLCanvas3D.cpp:239 +#: src/slic3r/GUI/GLCanvas3D.cpp:199 msgid "Shift + Right mouse button:" msgstr "시프트 + 오른쪽 마우스 버튼:" -#: src/slic3r/GUI/GLCanvas3D.cpp:241 +#: src/slic3r/GUI/GLCanvas3D.cpp:201 msgid "Smoothing" msgstr "부드럽게" -#: src/slic3r/GUI/GLCanvas3D.cpp:243 +#: src/slic3r/GUI/GLCanvas3D.cpp:203 msgid "Mouse wheel:" msgstr "마우스 휠: " -#: src/slic3r/GUI/GLCanvas3D.cpp:245 +#: src/slic3r/GUI/GLCanvas3D.cpp:205 msgid "Increase/decrease edit area" msgstr "편집 영역 증가/감소" -#: src/slic3r/GUI/GLCanvas3D.cpp:248 +#: src/slic3r/GUI/GLCanvas3D.cpp:208 msgid "Adaptive" msgstr "어뎁티브" -#: src/slic3r/GUI/GLCanvas3D.cpp:254 +#: src/slic3r/GUI/GLCanvas3D.cpp:214 msgid "Quality / Speed" msgstr "품질 / 속도" -#: src/slic3r/GUI/GLCanvas3D.cpp:257 +#: src/slic3r/GUI/GLCanvas3D.cpp:217 msgid "Higher print quality versus higher print speed." msgstr "인쇄 품질이 높고 인쇄 속도가 빨라질 수 있습니다." -#: src/slic3r/GUI/GLCanvas3D.cpp:268 +#: src/slic3r/GUI/GLCanvas3D.cpp:228 msgid "Smooth" msgstr "부드럽게" -#: src/slic3r/GUI/GLCanvas3D.cpp:274 src/libslic3r/PrintConfig.cpp:819 +#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/libslic3r/PrintConfig.cpp:908 msgid "Radius" msgstr " 반지름" -#: src/slic3r/GUI/GLCanvas3D.cpp:286 +#: src/slic3r/GUI/GLCanvas3D.cpp:246 msgid "Keep min" msgstr "최소 유지" -#: src/slic3r/GUI/GLCanvas3D.cpp:295 src/slic3r/GUI/GLCanvas3D.cpp:4123 +#: src/slic3r/GUI/GLCanvas3D.cpp:255 src/slic3r/GUI/GLCanvas3D.cpp:4217 msgid "Reset" msgstr "초기화" -#: src/slic3r/GUI/GLCanvas3D.cpp:561 +#: src/slic3r/GUI/GLCanvas3D.cpp:602 msgid "Variable layer height - Manual edit" msgstr "가변 레이어 높이 - 수동 편집" -#: src/slic3r/GUI/GLCanvas3D.cpp:676 +#: src/slic3r/GUI/GLCanvas3D.cpp:717 msgid "Seq." msgstr "순서" -#: src/slic3r/GUI/GLCanvas3D.cpp:1310 +#: src/slic3r/GUI/GLCanvas3D.cpp:1319 msgid "Variable layer height - Reset" msgstr "가변 레이어 높이 - 재설정" -#: src/slic3r/GUI/GLCanvas3D.cpp:1318 +#: src/slic3r/GUI/GLCanvas3D.cpp:1327 msgid "Variable layer height - Adaptive" msgstr "가변 레이어 높이 - 어뎁티브" -#: src/slic3r/GUI/GLCanvas3D.cpp:1326 +#: src/slic3r/GUI/GLCanvas3D.cpp:1335 msgid "Variable layer height - Smooth all" msgstr "가변 레이어 높이 - 모두 부드럽게" -#: src/slic3r/GUI/GLCanvas3D.cpp:1733 +#: src/slic3r/GUI/GLCanvas3D.cpp:1778 msgid "Mirror Object" msgstr "객체(object) 반전" -#: src/slic3r/GUI/GLCanvas3D.cpp:2612 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:560 +#: src/slic3r/GUI/GLCanvas3D.cpp:2542 src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:117 msgid "Gizmo-Move" msgstr "개체(Gizmo) 이동" -#: src/slic3r/GUI/GLCanvas3D.cpp:2695 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562 +#: src/slic3r/GUI/GLCanvas3D.cpp:2638 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:661 msgid "Gizmo-Rotate" msgstr "개체(Gizmo) 회전" -#: src/slic3r/GUI/GLCanvas3D.cpp:3300 +#: src/slic3r/GUI/GLCanvas3D.cpp:3263 msgid "Move Object" msgstr "객체(object) 이동" -#: src/slic3r/GUI/GLCanvas3D.cpp:3821 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3513 +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:40 +msgid "Gizmo-Place on Face" +msgstr "개체(Gizmo)를 배드위로" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3904 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Switch to Settings" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3822 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3905 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Print Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Filament Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Material Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3824 src/slic3r/GUI/GLCanvas3D.cpp:4657 +#: src/slic3r/GUI/GLCanvas3D.cpp:3907 src/slic3r/GUI/GLCanvas3D.cpp:4746 msgid "Printer Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Undo History" msgstr "실행취소 기록" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Redo History" msgstr "다시 실행 히스토리" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" msgstr[0] "실행 취소 %1$d 작업" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" msgstr[0] "작업 %1$d 다시 실행" -#: src/slic3r/GUI/GLCanvas3D.cpp:4011 src/slic3r/GUI/GLCanvas3D.cpp:4673 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 src/slic3r/GUI/Search.cpp:426 +#: src/slic3r/GUI/GLCanvas3D.cpp:4106 src/slic3r/GUI/GLCanvas3D.cpp:4762 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/Search.cpp:482 msgid "Search" msgstr "찾기" -#: src/slic3r/GUI/GLCanvas3D.cpp:4025 src/slic3r/GUI/GLCanvas3D.cpp:4033 -#: src/slic3r/GUI/Search.cpp:432 +#: src/slic3r/GUI/GLCanvas3D.cpp:4120 src/slic3r/GUI/GLCanvas3D.cpp:4128 +#: src/slic3r/GUI/Search.cpp:488 msgid "Enter a search term" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4064 +#: src/slic3r/GUI/GLCanvas3D.cpp:4160 msgid "Arrange options" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4097 +#: src/slic3r/GUI/GLCanvas3D.cpp:4193 #, boost-format msgid "Press %1%left mouse button to enter the exact value" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4099 +#: src/slic3r/GUI/GLCanvas3D.cpp:4195 msgid "Spacing" msgstr "간격" -#: src/slic3r/GUI/GLCanvas3D.cpp:4106 -msgid "Enable rotations (slow)" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -#, fuzzy -msgid "Alignment" -msgstr "정렬(&A)" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:4500 -msgid "Center" -msgstr "중앙" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear left" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front left" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front right" +#: src/slic3r/GUI/GLCanvas3D.cpp:4202 +msgid "Spacing from bed" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear right" +#: src/slic3r/GUI/GLCanvas3D.cpp:4209 +msgid "Enable rotations (slow)" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:2271 -msgid "Random" -msgstr "무작위" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4133 src/slic3r/GUI/GLCanvas3D.cpp:4565 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Plater.cpp:1664 +#: src/slic3r/GUI/GLCanvas3D.cpp:4228 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 src/slic3r/GUI/Plater.cpp:7118 msgid "Arrange" msgstr "정렬" -#: src/slic3r/GUI/GLCanvas3D.cpp:4539 +#: src/slic3r/GUI/GLCanvas3D.cpp:4630 msgid "Add..." msgstr "추가..." -#: src/slic3r/GUI/GLCanvas3D.cpp:4556 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5509 src/slic3r/GUI/Tab.cpp:4158 +#: src/slic3r/GUI/GLCanvas3D.cpp:4647 src/slic3r/GUI/KBShortcutsDialog.cpp:105 +#: src/slic3r/GUI/Plater.cpp:6047 src/slic3r/GUI/Tab.cpp:4383 msgid "Delete all" msgstr "전부 지우기" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 src/slic3r/GUI/KBShortcutsDialog.cpp:133 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 src/slic3r/GUI/KBShortcutsDialog.cpp:142 msgid "Arrange selection" msgstr "선택 정렬" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 msgid "Click right mouse button to show arrangement options" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4587 +#: src/slic3r/GUI/GLCanvas3D.cpp:4676 msgid "Copy" msgstr "복사" -#: src/slic3r/GUI/GLCanvas3D.cpp:4596 +#: src/slic3r/GUI/GLCanvas3D.cpp:4685 msgid "Paste" msgstr "붙여넣기" -#: src/slic3r/GUI/GLCanvas3D.cpp:4608 src/slic3r/GUI/GUI_Factories.cpp:1084 -#: src/slic3r/GUI/GUI_Factories.cpp:1108 src/slic3r/GUI/GUI_Factories.cpp:1119 +#: src/slic3r/GUI/GLCanvas3D.cpp:4697 src/slic3r/GUI/GUI_Factories.cpp:1237 +#: src/slic3r/GUI/GUI_Factories.cpp:1261 src/slic3r/GUI/GUI_Factories.cpp:1272 msgid "Add instance" msgstr "복제본 추가" -#: src/slic3r/GUI/GLCanvas3D.cpp:4619 src/slic3r/GUI/GUI_Factories.cpp:1087 +#: src/slic3r/GUI/GLCanvas3D.cpp:4708 src/slic3r/GUI/GUI_Factories.cpp:1240 msgid "Remove instance" msgstr "복제본 제거" -#: src/slic3r/GUI/GLCanvas3D.cpp:4632 +#: src/slic3r/GUI/GLCanvas3D.cpp:4721 msgid "Split to objects" msgstr "객체(object)별 분할" -#: src/slic3r/GUI/GLCanvas3D.cpp:4642 +#: src/slic3r/GUI/GLCanvas3D.cpp:4731 msgid "Split to parts" msgstr "부품(Part)별 분할" -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/GLCanvas3D.cpp:4795 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/GLCanvas3D.cpp:4874 msgid "Click right mouse button to open/close History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4779 +#: src/slic3r/GUI/GLCanvas3D.cpp:4859 #, boost-format msgid "Next Undo action: %1%" msgstr "다음 작업 실행 취소 : %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:4795 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/GLCanvas3D.cpp:4874 src/slic3r/GUI/KBShortcutsDialog.cpp:107 +#: src/slic3r/GUI/MainFrame.cpp:1429 msgid "Redo" msgstr "다시실행" -#: src/slic3r/GUI/GLCanvas3D.cpp:4817 +#: src/slic3r/GUI/GLCanvas3D.cpp:4895 #, boost-format msgid "Next Redo action: %1%" msgstr "다음 작업 다시 실행: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:6434 +#: src/slic3r/GUI/GLCanvas3D.cpp:6784 msgid "An object outside the print area was detected." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6435 +#: src/slic3r/GUI/GLCanvas3D.cpp:6785 msgid "A toolpath outside the print area was detected." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6436 +#: src/slic3r/GUI/GLCanvas3D.cpp:6786 msgid "SLA supports outside the print area were detected." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6437 +#: src/slic3r/GUI/GLCanvas3D.cpp:6787 msgid "Some objects are not visible during editing." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6439 +#: src/slic3r/GUI/GLCanvas3D.cpp:6789 msgid "" "An object outside the print area was detected.\n" "Resolve the current problem to continue slicing." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6513 +#: src/slic3r/GUI/GLCanvas3D.cpp:6864 msgid "Selection-Add from rectangle" msgstr "선택-사각형에서 추가" -#: src/slic3r/GUI/GLCanvas3D.cpp:6528 +#: src/slic3r/GUI/GLCanvas3D.cpp:6879 msgid "Selection-Remove from rectangle" msgstr "선택- 사각형에서 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4478 -msgid "Cut" -msgstr "자르기" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:206 +msgid "Planar" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Auto" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Manual" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:213 +msgid "Plug" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:214 +msgid "Dowel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Prism" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Frustum" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Triangle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Square" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Hexagon" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:59 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 +msgid "Circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:233 +msgid "Keep orientation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:234 +msgid "Place on cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:235 +msgid "Flip upside down" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +msgid "inch" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 +msgid "Part" +msgstr "부품(Part)(Part)" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 src/libslic3r/Print.cpp:1236 +msgid "Object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:264 +msgid "" +"Click to flip the cut plane\n" +"Drag to move the cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:269 src/libslic3r/PrintConfig.cpp:498 +#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2325 src/libslic3r/PrintConfig.cpp:2613 +#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2876 src/libslic3r/PrintConfig.cpp:2907 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3231 +#: src/libslic3r/PrintConfig.cpp:3466 src/libslic3r/PrintConfig.cpp:3951 +msgid "°" +msgstr "°" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:367 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:571 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1232 +msgid "Move cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 msgid "in" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 -msgid "Keep upper part" -msgstr "상위 부분 유지" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:544 +msgid "Value" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:549 +msgid "Tolerance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 -msgid "Keep lower part" -msgstr "낮은 부분 유지" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 +msgid "Left click" +msgstr "왼쪽 클릭" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:196 -msgid "Rotate lower part upwards" -msgstr "아래쪽 부분을 위쪽으로 회전" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2348 +msgid "Add connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:201 -msgid "Perform cut" -msgstr "절단 실행" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 +msgid "Right click" +msgstr "오른쪽 클릭" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:49 -msgid "Paint-on supports" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +msgid "Remove connector" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 -msgid "Clipping of view" -msgstr "갈무리된것 보기" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 +msgid "Drag" +msgstr "드래그" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 -msgid "Reset direction" -msgstr "방향 재설정" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1216 +msgid "Move connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 -msgid "Brush size" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +msgid "Add connector to selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 -msgid "Brush shape" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +msgid "Remove connector from selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 -msgid "Left mouse button" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:870 +msgid "Select all connectors" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 -msgid "Enforce supports" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:894 src/libslic3r/PrintConfig.cpp:4644 +msgid "Cut" +msgstr "자르기" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1227 +msgid "Rotate cut plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 -msgid "Right mouse button" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1448 +msgid "Render cut plane as circle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:434 -msgid "Block supports" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1537 +msgid "Connectors" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 -msgid "Shift + Left mouse button" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1541 +msgid "Remove connectors" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:429 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 -msgid "Remove selection" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1550 +msgid "Type" +msgstr "타입" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1561 src/libslic3r/PrintConfig.cpp:2816 +msgid "Style" +msgstr "모양새" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1568 +msgid "Depth ratio" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 -msgid "Remove all selection" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1586 +msgid "Confirm connectors" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 -msgid "Circle" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1652 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1666 +msgid "Flip cut plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 -#: src/slic3r/GUI/GUI_Factories.cpp:461 -msgid "Sphere" -msgstr "영역" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1710 +msgid "Hold SHIFT key to draw a cut line" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:68 -#: src/libslic3r/PrintConfig.cpp:1172 -msgid "Triangles" -msgstr "삼각형(Triangles)" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1716 +msgid "Cut position: " +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 -msgid "Highlight overhang by angle" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1725 +msgid "Reset cutting plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 -msgid "Enforce" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Edit connectors" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 -msgid "Tool type" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Add connectors" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 -msgid "Brush" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1744 +msgid "Reset cut" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:128 -msgid "Smart fill" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1745 +msgid "Reset cutting plane and remove connectors" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:131 -msgid "Smart fill angle" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1800 +msgid "After cut" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:132 -msgid "Split triangles" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1820 +msgid "Cut to" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 -msgid "On overhangs only" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1823 +msgid "Objects" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:174 -#, boost-format -msgid "" -"Preselects faces by overhang angle. It is possible to restrict paintable " -"facets to only preselected faces when the option \"%1%\" is enabled." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1826 +msgid "Parts" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:217 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:378 -msgid "Paints facets according to the chosen painting brush." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1840 +msgid "Perform cut" +msgstr "절단 실행" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1930 +msgid "Invalid connectors detected" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1932 +#, c-format, boost-format +msgid "%1$d connector is out of cut contour" +msgid_plural "%1$d connectors are out of cut contour" +msgstr[0] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1935 +#, c-format, boost-format +msgid "%1$d connector is out of object" +msgid_plural "%1$d connectors are out of object" +msgstr[0] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1938 +msgid "Some connectors are overlapped" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:391 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1942 msgid "" -"Paints neighboring facets whose relative angle is less or equal to set angle." +"Invalid state. \n" +"No one part is selected for keep after cut" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:229 -#, boost-format -msgid "Allows painting only on facets selected by: \"%1%\"" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1944 +msgid "" +"Warning state. \n" +"Cut plane is placed out of object" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:244 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:419 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:144 -msgid "Paints all facets inside, regardless of their orientation." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2153 +msgid "Connector" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:253 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:428 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:152 -msgid "Ignores facets facing away from the camera." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2183 +msgid "Cut by Plane" +msgstr "평면으로 절단" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2323 +msgid "Cut by line" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:262 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:437 -msgid "Paints only one facet." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2373 +msgid "Delete connector" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:270 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:285 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:445 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:462 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:132 -msgid "Alt + Mouse wheel" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:252 +msgid "Entering Cut gizmo" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 -msgid "Splits bigger facets into smaller ones while the object is painted." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:253 +msgid "Leaving Cut gizmo" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:308 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:483 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:170 -msgid "Ctrl + Mouse wheel" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:254 +msgid "Cut gizmo editing" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:313 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:488 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:175 -msgid "Reset selection" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:601 +msgid "Emboss" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:364 -msgid "Block supports by angle" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:866 +msgid "ERROR: Wait until ends or Cancel process." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:365 -msgid "Add supports by angle" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:921 +msgid "Text-Rotate" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:953 +msgid "Font" +msgstr "Font" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:954 +#: src/libslic3r/PrintConfig.cpp:897 +msgid "Height" +msgstr "높이" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:955 +msgid "Depth" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:963 +msgid "Use surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:964 +msgid "Char gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:965 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Line gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:966 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:967 +msgid "Skew ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:968 +msgid "Z-move" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:969 +msgid "Z-rot" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:970 +msgid "Collection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1047 +msgid "NORMAL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1048 +msgid "SMALL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1049 +msgid "ITALIC" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1050 +msgid "SWISS" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1051 +msgid "MODERN" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1088 +msgid "First font" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1093 +msgid "Default font" +msgstr "기본 글꼴" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1098 +msgid "Embossed text" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1513 +msgid "Warning: No font is selected. Select correct one." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1531 +#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1437 +#: src/slic3r/GUI/Tab.cpp:1472 src/slic3r/GUI/Tab.cpp:1607 +#: src/slic3r/GUI/Tab.cpp:1611 src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:2390 src/slic3r/GUI/Tab.cpp:4985 +#: src/libslic3r/PrintConfig.cpp:276 src/libslic3r/PrintConfig.cpp:514 +#: src/libslic3r/PrintConfig.cpp:1484 src/libslic3r/PrintConfig.cpp:1566 +#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:2562 +#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:3166 +#: src/libslic3r/PrintConfig.cpp:3200 src/libslic3r/PrintConfig.cpp:3211 +#: src/libslic3r/PrintConfig.cpp:3226 src/libslic3r/PrintConfig.cpp:3239 +#: src/libslic3r/PrintConfig.cpp:3248 src/libslic3r/PrintConfig.cpp:3260 +#: src/libslic3r/PrintConfig.cpp:3642 +msgid "Advanced" +msgstr "고급" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1631 +msgid "Can't write text by selected font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1632 +msgid "Try to choose another font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Empty" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Embossed text can NOT contain only white spaces." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Bad symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Text contain character glyph (represented by '?') unknown by font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:535 +msgid "Skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +msgid "Unsupported visualization of font skew for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Unsupported visualization of font boldness for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Unsupported visualization of gap between lines inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Too tall" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Diminished font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Too small" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Enlarged font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1660 +#, boost-format +msgid "%1% is NOT shown." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1964 +msgid " No symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1965 +msgid " ... Loading" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2015 +msgid " ... In queue" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2132 +#, boost-format +msgid "Font face \"%1%\" can't be selected." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2180 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:754 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:367 +msgid "Apply" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2192 +msgid "add file with font(.ttf, .ttc)" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2202 +msgid "Open dialog for choose from fonts." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2210 +msgid "Text is to object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2224 +msgid "Added" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2227 +msgid "Click to change text into object part." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2230 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4321 +msgid "You can't change a type of the last solid part of the object." +msgstr "객체(object)의 마지막 부품(Part) 유형은 변경할 수 없습니다." + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2231 +msgid "Subtracted" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2237 +msgid "Click to change part type into negative volume." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2243 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4338 +msgid "Modifier" +msgstr "편집 영역" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2249 +msgid "Click to change part type into modifier." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2256 +msgid "Change Text Type" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2287 +#, boost-format +msgid "Rename style(%1%) for embossing text: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2299 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2384 +msgid "Name can't be empty." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2301 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2386 +msgid "Name has to be unique." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2310 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2397 +msgid "ok" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2312 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2401 +msgid "cancel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2337 +msgid "Rename style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2344 +msgid "Rename current style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2345 +msgid "Can't rename temporary style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2362 +msgid "First Add style to list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2364 +#, boost-format +msgid "Save %1% style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2366 +msgid "No changes to save." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2373 +msgid "New name of style: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2422 +msgid "Save as new style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2434 +msgid "Only valid font can be added to style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2436 +msgid "Add style to my list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2438 +msgid "Add as new named style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2454 +msgid "Remove style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2485 +#, boost-format +msgid "Delete \"%1%\" style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2486 +#, boost-format +msgid "Can't delete \"%1%\". It is last style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2487 +#, boost-format +msgid "Can't delete temporary style \"%1%\"." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2494 +#, boost-format +msgid "" +"Are you sure,\n" +"that you want permanently and unrecoverable \n" +"remove style \"%1%\"?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2496 +msgid "Yes" +msgstr "예" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2505 +msgid "No" +msgstr "아니오" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2555 +msgid "Presets" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2564 src/slic3r/GUI/GUI_App.cpp:2324 +msgid "modified" +msgstr "수정된곳" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2617 +#, boost-format +msgid "Modified style \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2618 +#, boost-format +msgid "Current style is \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2625 +msgid "Style modification will be lost." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2627 +#, boost-format +msgid "" +"Changing style to '%1%' will discard current style modification.\n" +"\n" +" Would you like to continue anyway?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2643 +msgid "Not valid style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2644 +#, boost-format +msgid "Style '%1%' can't be used and will be removed from list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2691 +msgid "Unset italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2708 +msgid "Set italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2738 +msgid "Unset bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2756 +msgid "Set bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2922 +msgid "WxFont is not loaded properly." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2957 +msgid "Revert font changes." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2991 +msgid "wx Make bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3002 +msgid "Revert text size." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3029 +msgid "Revert embossed depth." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3178 +msgid "" +"Advanced font options could be changed only for correct font.\n" +"Start with select correct font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3219 +msgid "Revert using of model surface." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3232 +msgid "font points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3241 +msgid "Revert gap between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3242 +msgid "Distance between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3257 +msgid "Revert gap between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3258 +msgid "Distance between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3272 +msgid "Undo boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3273 +msgid "Tiny / Wide glyphs" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3283 +msgid "Undo letter's skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3284 +msgid "Italic strength ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3304 +msgid "Undo translation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3305 +msgid "Distance of the center of text from model surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3350 +msgid "Undo rotation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3352 +msgid "Rotate text Clock-wise." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3386 +msgid "Select from True Type Collection." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3395 +msgid "Set text to face camera" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3402 +msgid "Use camera direction for text orientation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3486 +#, boost-format +msgid "Font '%1%' can't be used. Please select another." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3488 +msgid "Selected font is NOT True-type." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3512 +msgid "Choose one or more files (TTF, TTC):" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3539 +msgid "Choose SVG file:" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3600 +#, boost-format +msgid "" +"Can't load exactly same font(\"%1%\"), Aplication selected a similar " +"one(\"%2%\"). You have to specify font for enable edit text." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:81 +msgid "Enter emboss gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:82 +msgid "Leave emboss gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:83 +msgid "Embossing actions" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:37 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:66 +msgid "Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 +msgid "Automatic painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 +msgid "painting..." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:107 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +msgid "Clipping of view" +msgstr "갈무리된것 보기" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:106 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 +msgid "Reset direction" +msgstr "방향 재설정" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:108 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 +msgid "Brush size" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:109 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 +msgid "Brush shape" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1816 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:110 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 +msgid "Left mouse button" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 +msgid "Enforce supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 +msgid "Right mouse button" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:573 +msgid "Block supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 +msgid "Shift + Left mouse button" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:568 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:247 +msgid "Remove selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 +msgid "Remove all selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 +#: src/slic3r/GUI/GUI_Factories.cpp:481 +msgid "Sphere" +msgstr "영역" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:106 +#: src/libslic3r/PrintConfig.cpp:1231 +msgid "Triangles" +msgstr "삼각형(Triangles)" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 +msgid "Highlight overhang by angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:63 +msgid "Enforce" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +msgid "Tool type" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 +msgid "Brush" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:68 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 +msgid "Smart fill" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 +msgid "Smart fill angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:72 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 +msgid "Split triangles" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:73 +msgid "On overhangs only" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:187 +#, boost-format +msgid "" +"Preselects faces by overhang angle. It is possible to restrict paintable " +"facets to only preselected faces when the option \"%1%\" is enabled." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:230 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:371 +msgid "Paints facets according to the chosen painting brush." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:238 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:384 +msgid "" +"Paints neighboring facets whose relative angle is less or equal to set angle." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242 +#, boost-format +msgid "Allows painting only on facets selected by: \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:257 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:412 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141 +msgid "Paints all facets inside, regardless of their orientation." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:266 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:421 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:149 +msgid "Ignores facets facing away from the camera." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:430 +msgid "Paints only one facet." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:298 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:438 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:455 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:129 +msgid "Alt + Mouse wheel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:288 +msgid "Splits bigger facets into smaller ones while the object is painted." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:321 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:476 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:167 +msgid "Ctrl + Mouse wheel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:326 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:481 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:172 +msgid "Reset selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:382 +msgid "Block supports by angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:383 +msgid "Add supports by angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +msgid "Automatic painting requires valid print setup." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:535 +msgid "Automatic painting will erase all currently painted areas." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:536 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1118 +msgid "Are you sure you want to do it?" +msgstr "당신은 그것을 하시겠습니까?" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:540 +msgid "Automatic painting support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:571 +msgid "Add supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:22 +msgid "Entering Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:23 +msgid "Leaving Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:24 +msgid "Paint-on supports editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:88 +msgid "Place on face" +msgstr "면 배치 " + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:29 +msgid "Hollow this object" +msgstr "이 개체를 비우기" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 +msgid "Preview hollowed and drilled model" +msgstr "공동화된 모델 미리보기" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 +msgid "Offset" +msgstr "오프셋" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 +msgid "Quality" +msgstr "품질" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 +#: src/libslic3r/PrintConfig.cpp:4037 +msgid "Closing distance" +msgstr "닫힘 거리" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 +msgid "Hole diameter" +msgstr "구멍 직경" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 +msgid "Hole depth" +msgstr "구멍 깊이" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 +msgid "Remove selected holes" +msgstr "선택한 구멍 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 +msgid "Remove all holes" +msgstr "모든 구멍 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 +msgid "Show supports" +msgstr "서포트 표시" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:242 +msgid "Add drainage hole" +msgstr "배수 구멍 추가" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:361 +msgid "Delete drainage hole" +msgstr "배수 구멍 삭제" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:655 +msgid "Hollowing parameter change" +msgstr "공동화 변수 변경" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:739 +msgid "Change drainage hole diameter" +msgstr "배수 구멍 직경 변경" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:827 +msgid "Hollow and drill" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:869 +msgid "Move drainage hole" +msgstr "구멍 이동" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:64 +msgid "No feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:65 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:76 +msgid "Vertex" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:66 +msgid "Edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:68 +msgid "Plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:77 +msgid "Point on edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:78 +msgid "Point on circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:79 +msgid "Point on plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:89 +msgid "Center of edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:90 +msgid "Center of circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:554 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2029 +msgid "Measure" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1236 +msgid "Edit to scale" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1258 +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:161 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:236 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:776 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:794 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:817 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:831 +#: src/libslic3r/PrintConfig.cpp:4713 +msgid "Scale" +msgstr "크기" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1362 +msgctxt "Verb" +msgid "Scale" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1541 +msgid "##angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1740 +msgid "Measure tool debug" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1824 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1851 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1857 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1886 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1893 +msgid "Unselect feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1830 +msgid "Unselect center" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1835 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1862 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1898 +msgid "Select center" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:432 -msgid "Add supports" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1840 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1867 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1903 +msgid "Unselect point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:41 -msgid "Place on face" -msgstr "면 배치 " +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1846 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1873 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1910 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select feature" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 -msgid "Hollow this object" -msgstr "이 개체를 비우기" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select point" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 -msgid "Preview hollowed and drilled model" -msgstr "공동화된 모델 미리보기" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Shift" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 -msgid "Offset" -msgstr "오프셋" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Enable point selection" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:57 -msgid "Quality" -msgstr "품질" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2007 +msgid "Restart selection" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3905 -msgid "Closing distance" -msgstr "닫힘 거리" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1952 +msgid "Esc" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 -msgid "Hole diameter" -msgstr "구멍 직경" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1955 +msgid "Unselect" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 -msgid "Hole depth" -msgstr "구멍 깊이" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1999 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2001 +msgid "Selection" +msgstr "선택" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 -msgid "Remove selected holes" -msgstr "선택한 구멍 제거" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2021 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +msgid "Copy to clipboard" +msgstr "클립보드로 복사" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 -msgid "Remove all holes" -msgstr "모든 구멍 제거" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2038 +msgid "Angle" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 -msgid "Show supports" -msgstr "서포트 표시" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Perpendicular distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:287 -msgid "Add drainage hole" -msgstr "배수 구멍 추가" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:403 -msgid "Delete drainage hole" -msgstr "배수 구멍 삭제" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2062 +msgid "Direct distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:590 -msgid "Hollowing parameter change" -msgstr "공동화 변수 변경" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2072 +msgid "Distance XYZ" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:667 -msgid "Change drainage hole diameter" -msgstr "배수 구멍 직경 변경" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:163 +msgid "Entering Measure gizmo" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:761 -msgid "Hollow and drill" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:164 +msgid "Leaving Measure gizmo" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:811 -msgid "Move drainage hole" -msgstr "구멍 이동" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:165 +msgid "Measure gizmo editing" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:27 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:28 #, boost-format msgid "" "Your printer has more extruders than the multi-material painting gizmo " @@ -2729,81 +3946,85 @@ msgid "" "used for painting." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:45 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:46 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 msgid "Multimaterial painting" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 msgid "First color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 msgid "Second color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:120 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:671 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:642 msgid "Remove painted color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 msgid "Clear all" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:129 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 msgid "Bucket fill" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:404 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:397 msgid "Paints neighboring facets that have the same color." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:450 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:443 msgid "Split bigger facets into smaller ones while the object is painted." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:674 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:645 #, boost-format msgid "Painted using: Extruder %1%" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:118 +msgid "Entering Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:119 +msgid "Leaving Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:120 +msgid "Multimaterial painting editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:76 msgid "Move" msgstr "이동" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:466 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4532 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:643 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:745 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:775 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:813 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:830 +#: src/libslic3r/PrintConfig.cpp:4698 msgid "Rotate" msgstr "회전" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:505 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:707 msgid "Optimize orientation" msgstr "방향 최적화" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:552 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:319 -msgid "Apply" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:79 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4547 -msgid "Scale" -msgstr "크기" +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:194 +msgid "Gizmo-Scale" +msgstr "개체(Gizmo) 배율" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 msgid "Enforce seam" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:38 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:255 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:252 msgid "Block seam" msgstr "" @@ -2811,338 +4032,342 @@ msgstr "" msgid "Seam painting" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:23 +msgid "Entering Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:24 +msgid "Leaving Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:25 +msgid "Paint-on seam editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:105 msgid "Mesh name" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:69 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:107 msgid "Detail level" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:108 msgid "Decimate ratio" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:113 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:147 #, boost-format msgid "" "Processing model '%1%' with more than 1M triangles could be slow. It is " -"highly recommend to reduce amount of triangles." +"highly recommended to reduce amount of triangles." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:116 -#: src/slic3r/GUI/GUI_Factories.cpp:705 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:150 +#: src/slic3r/GUI/GUI_Factories.cpp:789 msgid "Simplify model" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:143 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:177 msgid "Simplify" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:156 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:190 msgid "Simplification is currently only allowed when a single part is selected" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 -#: src/slic3r/GUI/PrintHostDialogs.cpp:373 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:191 +#: src/slic3r/GUI/MainFrame.cpp:1246 src/slic3r/GUI/MainFrame.cpp:1716 +#: src/slic3r/GUI/PrintHostDialogs.cpp:425 msgid "Error" msgstr "에러" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:250 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:294 msgid "Extra high" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:251 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:295 msgid "High" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:252 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:296 msgid "Medium" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:297 msgid "Low" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:254 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:298 msgid "Extra low" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:304 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#, boost-format +msgid "" +"Multipart object can be simplified only by %1%. If you want specify %2% " +"process it separately." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:352 #, c-format, boost-format msgid "%d triangles" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:307 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:355 msgid "Show wireframe" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:313 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:361 msgid "Operation already cancelling. Please wait few seconds." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:370 msgid "Can't apply when proccess preview." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:329 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:377 #, boost-format msgid "Process %1% / 100" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:479 -#, boost-format -msgid "Simplify %1%" +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:542 +msgid "Simplify " msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:543 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"simplifying the mesh." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:67 +msgid "Entering SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:68 +msgid "Leaving SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:35 msgid "Head diameter" msgstr "헤드 지름" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:36 msgid "Lock supports under new islands" msgstr "새영역에서 서포트 잠금 지원" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:37 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268 msgid "Remove selected points" msgstr "선택한 지점 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:38 msgid "Remove all points" msgstr "모든 지점 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1226 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1271 msgid "Apply changes" msgstr "변경 내용을 적용" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1227 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1272 msgid "Discard changes" msgstr "변경사항을 취소" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 msgid "Minimal points distance" msgstr "최소한의 지점 거리" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3735 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/libslic3r/PrintConfig.cpp:3867 msgid "Support points density" msgstr "서포트 지점 밀도" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1229 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1274 msgid "Auto-generate points" msgstr "지점 자동 생성" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 msgid "Manual editing" msgstr "수동 편집" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:372 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:307 msgid "Add support point" msgstr "서포트 지점 추가" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:522 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:460 msgid "Delete support point" msgstr "서포트 지점 삭제" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:702 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:626 msgid "Change point head diameter" msgstr "변경된 해드의 끝 점 지름" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:770 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:696 msgid "Support parameter change" msgstr "서포트 매개 변수 변경" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:876 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:806 msgid "SLA Support Points" msgstr "SLA 지원 포인트" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:814 msgid "Do you want to save your manually edited support points?" msgstr "수동으로 편집한 서포트 지점을 저장 하시 겠습니까?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:898 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:815 msgid "Save support points?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:958 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:880 msgid "Move support point" msgstr "서포트 지점 이동" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1051 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:987 msgid "Support points edit" msgstr "서포트 지점 편집" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1131 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1117 msgid "Autogeneration will erase all manually edited points." msgstr "자동 생성은 수동으로 편집한 모든 점을 지웁히 지웁습니다." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1132 -msgid "Are you sure you want to do it?" -msgstr "당신은 그것을 하시겠습니까?" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1138 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1124 msgid "Autogenerate support points" msgstr "서포트 자동 생성" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1186 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 msgid "SLA gizmo keyboard shortcuts" msgstr "SLA 장치 바로 가기" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1197 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1242 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "참고: 일부 단축키는 (비)편집 모드 에서만 작동 합니다." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 -msgid "Left click" -msgstr "왼쪽 클릭" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 msgid "Add point" msgstr "지점 추가" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 -msgid "Right click" -msgstr "오른쪽 클릭" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 msgid "Remove point" msgstr "복제본 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 -msgid "Drag" -msgstr "드래그" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 msgid "Move point" msgstr "지점 이동" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 msgid "Add point to selection" msgstr "선택 영역에 지점 추가" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 msgid "Remove point from selection" msgstr "선택 영역에서 지점 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 msgid "Select by rectangle" msgstr "직사각형으로 선택" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 msgid "Deselect by rectangle" msgstr "사각형으로 선택 해제" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1267 msgid "Select all points" msgstr "모든 지점들 선택" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Mouse wheel" msgstr "마우스 휠" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Move clipping plane" msgstr "갈무리된 평면 이동" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1225 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1270 msgid "Reset clipping plane" msgstr "갈무리된 평면 재설정" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1228 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273 msgid "Switch to editing mode" msgstr "편집 모드로 전환" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:196 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:204 msgid "" "ERROR: Please close all manipulators available from the left toolbar first" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:561 -msgid "Gizmo-Scale" -msgstr "개체(Gizmo) 배율" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:673 -msgid "Gizmo-Place on Face" -msgstr "개체(Gizmo)를 배드위로" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:1270 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:998 msgid "" "You are currently editing SLA support points. Please, apply or discard your " "changes first." msgstr "" -#: src/slic3r/GUI/GUI.cpp:292 +#: src/slic3r/GUI/GUI.cpp:287 msgid "Undefined" msgstr "" -#: src/slic3r/GUI/GUI.cpp:317 +#: src/slic3r/GUI/GUI.cpp:308 #, boost-format msgid "%1% was substituted with %2%" msgstr "" -#: src/slic3r/GUI/GUI.cpp:326 +#: src/slic3r/GUI/GUI.cpp:317 msgid "" "Most likely the configuration was produced by a newer version of PrusaSlicer " "or by some PrusaSlicer fork." msgstr "" -#: src/slic3r/GUI/GUI.cpp:327 +#: src/slic3r/GUI/GUI.cpp:318 msgid "The following values were substituted:" msgstr "" -#: src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/GUI.cpp:319 msgid "Review the substitutions and adjust them if needed." msgstr "" -#: src/slic3r/GUI/GUI.cpp:338 src/slic3r/GUI/Plater.cpp:820 +#: src/slic3r/GUI/GUI.cpp:329 src/slic3r/GUI/Plater.cpp:850 msgid "SLA print settings" msgstr "SLA 인쇄 설정" -#: src/slic3r/GUI/GUI.cpp:342 src/slic3r/GUI/PhysicalPrinterDialog.cpp:157 +#: src/slic3r/GUI/GUI.cpp:333 src/slic3r/GUI/PhysicalPrinterDialog.cpp:158 msgid "Physical Printer" msgstr "" -#: src/slic3r/GUI/GUI.cpp:355 +#: src/slic3r/GUI/GUI.cpp:346 msgid "" "Configuration bundle was loaded, however some configuration values were not " "recognized." msgstr "" -#: src/slic3r/GUI/GUI.cpp:365 +#: src/slic3r/GUI/GUI.cpp:356 #, boost-format msgid "" "Configuration file \"%1%\" was loaded, however some configuration values " "were not recognized." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:266 +#: src/slic3r/GUI/GUI_App.cpp:275 msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:267 +#: src/slic3r/GUI/GUI_App.cpp:276 msgid "Developed by Prusa Research." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:269 +#: src/slic3r/GUI/GUI_App.cpp:278 msgid "" "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:270 -msgid "Artwork model by Leslie Ing" +#: src/slic3r/GUI/GUI_App.cpp:279 +msgid "Artwork model by Creative Tools" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:411 +#: src/slic3r/GUI/GUI_App.cpp:420 #, boost-format msgid "" "Starting with %1% 2.3, configuration directory on Linux has changed " @@ -3162,20 +4387,20 @@ msgid "" "What do you want to do now?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:419 +#: src/slic3r/GUI/GUI_App.cpp:428 #, c-format, boost-format msgid "%s - BREAKING CHANGE" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Quit, I will move my data now" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Start the application" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:699 +#: src/slic3r/GUI/GUI_App.cpp:725 #, c-format, boost-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -3190,11 +4415,11 @@ msgstr "" "\n" "이제 응용 프로그램이 종료됩니다." -#: src/slic3r/GUI/GUI_App.cpp:702 +#: src/slic3r/GUI/GUI_App.cpp:728 msgid "Fatal error" msgstr "치명적인 오류" -#: src/slic3r/GUI/GUI_App.cpp:706 +#: src/slic3r/GUI/GUI_App.cpp:732 msgid "" "PrusaSlicer has encountered a localization error. Please report to " "PrusaSlicer team, what language was active and in which scenario this issue " @@ -3203,16 +4428,16 @@ msgid "" "The application will now terminate." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:709 +#: src/slic3r/GUI/GUI_App.cpp:735 msgid "Critical error" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:714 +#: src/slic3r/GUI/GUI_App.cpp:740 #, boost-format msgid "Internal error: %1%" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:909 src/slic3r/GUI/GUI_App.cpp:1007 +#: src/slic3r/GUI/GUI_App.cpp:954 src/slic3r/GUI/GUI_App.cpp:1051 msgid "" "Error parsing PrusaSlicer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error. Your user profiles will " @@ -3221,18 +4446,18 @@ msgstr "" "PrusaSlicer 구성 파일을 구문 분석하는 오류, 아마 손상된 것입니다. 파일을 수동" "으로 삭제하여 오류에 복구해 보십시오. 사용자 프로필은 영향을 받지 않습니다." -#: src/slic3r/GUI/GUI_App.cpp:915 src/slic3r/GUI/GUI_App.cpp:1013 +#: src/slic3r/GUI/GUI_App.cpp:960 src/slic3r/GUI/GUI_App.cpp:1057 msgid "" "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:962 +#: src/slic3r/GUI/GUI_App.cpp:1006 #, boost-format msgid "You are opening %1% version %2%." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:965 +#: src/slic3r/GUI/GUI_App.cpp:1009 #, boost-format msgid "" "The active configuration was created by %1% %2%,\n" @@ -3244,7 +4469,7 @@ msgid "" "configuration." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:973 +#: src/slic3r/GUI/GUI_App.cpp:1017 #, boost-format msgid "" "An existing configuration was found in %3%\n" @@ -3253,19 +4478,19 @@ msgid "" "Shall this configuration be imported?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:981 +#: src/slic3r/GUI/GUI_App.cpp:1025 msgid "Import" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:982 +#: src/slic3r/GUI/GUI_App.cpp:1026 msgid "Don't import" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:990 +#: src/slic3r/GUI/GUI_App.cpp:1034 msgid "Continue and import newer configuration?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1051 +#: src/slic3r/GUI/GUI_App.cpp:1095 msgid "" "You are running a 32 bit build of PrusaSlicer on 64-bit Windows.\n" "32 bit build of PrusaSlicer will likely not be able to utilize all the RAM " @@ -3275,53 +4500,44 @@ msgid "" "Do you wish to continue?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1134 +#: src/slic3r/GUI/GUI_App.cpp:1182 #, c-format, boost-format msgid "" "%s\n" "Do you want to continue?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1136 src/slic3r/GUI/GUI_App.cpp:3101 -#: src/slic3r/GUI/Plater.cpp:1726 src/slic3r/GUI/UnsavedChangesDialog.cpp:889 +#: src/slic3r/GUI/GUI_App.cpp:1184 src/slic3r/GUI/GUI_App.cpp:3302 +#: src/slic3r/GUI/Plater.cpp:1736 src/slic3r/GUI/UnsavedChangesDialog.cpp:917 msgid "Remember my choice" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1178 +#: src/slic3r/GUI/GUI_App.cpp:1226 msgid "Loading configuration" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1209 -#, boost-format -msgid "New release version %1% is available." -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:1210 -msgid "See Download page." -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:1224 +#: src/slic3r/GUI/GUI_App.cpp:1257 #, boost-format msgid "New prerelease version %1% is available." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1225 +#: src/slic3r/GUI/GUI_App.cpp:1258 msgid "See Releases page." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1262 +#: src/slic3r/GUI/GUI_App.cpp:1313 msgid "Preparing settings tabs" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1336 src/slic3r/GUI/Preferences.cpp:287 +#: src/slic3r/GUI/GUI_App.cpp:1393 src/slic3r/GUI/Preferences.cpp:405 msgid "Restore window position on start" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1338 +#: src/slic3r/GUI/GUI_App.cpp:1395 msgid "PrusaSlicer started after a crash" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1339 +#: src/slic3r/GUI/GUI_App.cpp:1396 #, boost-format msgid "" "PrusaSlicer crashed last time when attempting to set window position.\n" @@ -3334,198 +4550,203 @@ msgid "" "Otherwise, the application will most likely crash again next time." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1351 +#: src/slic3r/GUI/GUI_App.cpp:1408 #, boost-format msgid "Disable \"%1%\"" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1352 +#: src/slic3r/GUI/GUI_App.cpp:1409 #, boost-format msgid "Leave \"%1%\" enabled" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1679 +#: src/slic3r/GUI/GUI_App.cpp:1780 msgid "" "You have the following presets with saved options for \"Print Host upload\"" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1683 +#: src/slic3r/GUI/GUI_App.cpp:1784 msgid "" "But since this version of PrusaSlicer we don't show this information in " "Printer Settings anymore.\n" "Settings will be available in physical printers settings." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1685 +#: src/slic3r/GUI/GUI_App.cpp:1786 msgid "" "By default new Printer devices will be named as \"Printer N\" during its " "creation.\n" "Note: This name can be changed later from the physical printers settings" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1689 src/slic3r/GUI/PhysicalPrinterDialog.cpp:726 +#: src/slic3r/GUI/GUI_App.cpp:1790 src/slic3r/GUI/PhysicalPrinterDialog.cpp:798 msgid "Information" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1702 src/slic3r/GUI/GUI_App.cpp:1713 +#: src/slic3r/GUI/GUI_App.cpp:1803 src/slic3r/GUI/GUI_App.cpp:1814 msgid "Recreating" msgstr "재현" -#: src/slic3r/GUI/GUI_App.cpp:1716 +#: src/slic3r/GUI/GUI_App.cpp:1817 msgid "Loading of current presets" msgstr "현재 기본 설정을 불러오기" -#: src/slic3r/GUI/GUI_App.cpp:1721 +#: src/slic3r/GUI/GUI_App.cpp:1822 msgid "Loading of a mode view" msgstr "보기 모드를 불러오기" -#: src/slic3r/GUI/GUI_App.cpp:1859 +#: src/slic3r/GUI/GUI_App.cpp:1961 msgid "Choose one file (3MF/AMF):" msgstr "파일(3MF/AMF) 선택:" -#: src/slic3r/GUI/GUI_App.cpp:1871 +#: src/slic3r/GUI/GUI_App.cpp:1973 msgid "Choose one or more files (STL/3MF/STEP/OBJ/AMF/PRUSA):" msgstr "파일을 선택하세요 (STL/3MF/STEP/OBJ/AMF/PRUSA):" -#: src/slic3r/GUI/GUI_App.cpp:1883 +#: src/slic3r/GUI/GUI_App.cpp:1984 +msgid "Choose ZIP file:" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1996 msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1894 +#: src/slic3r/GUI/GUI_App.cpp:2007 msgid "Changing of an application language" msgstr "응용 프로그램 언어 변경" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Select the language" msgstr "언어를 선택" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Language" msgstr "언어" -#: src/slic3r/GUI/GUI_App.cpp:2182 -msgid "modified" -msgstr "수정된곳" +#: src/slic3r/GUI/GUI_App.cpp:2363 +msgid "" +"Simple mode supports manipulation with single-part object(s)\n" +"or object(s) with support modifiers only." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2365 +msgid "Please check your object list before mode changing." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2366 +msgid "Change application mode" +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2236 +#: src/slic3r/GUI/GUI_App.cpp:2397 #, c-format, boost-format msgid "Run %s" msgstr "%s 실행" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "&Configuration Snapshots" msgstr "구성 스냅샷" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "Inspect / activate configuration snapshots" msgstr "구성 스냅 샷 검사 / 활성화" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Take Configuration &Snapshot" msgstr "구성 스냅 샷 가져 오기" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Capture a configuration snapshot" msgstr "구성 스냅 샷 캡처" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for Configuration Updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for configuration updates" msgstr "구성 업데이트 확인" -#: src/slic3r/GUI/GUI_App.cpp:2249 +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for Application Updates" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for new version of application" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2411 msgid "&Preferences" msgstr "환경 설정" -#: src/slic3r/GUI/GUI_App.cpp:2255 +#: src/slic3r/GUI/GUI_App.cpp:2417 msgid "Application preferences" msgstr "응용 프로그램 환경 설정" -#: src/slic3r/GUI/GUI_App.cpp:2260 src/slic3r/GUI/wxExtensions.cpp:708 -msgid "Simple" -msgstr "단순" - -#: src/slic3r/GUI/GUI_App.cpp:2260 +#: src/slic3r/GUI/GUI_App.cpp:2422 msgid "Simple View Mode" msgstr "기본 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:2262 src/slic3r/GUI/wxExtensions.cpp:710 -msgctxt "Mode" -msgid "Advanced" -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:2262 +#: src/slic3r/GUI/GUI_App.cpp:2424 msgid "Advanced View Mode" msgstr "고급 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:2263 src/slic3r/GUI/wxExtensions.cpp:711 -msgid "Expert" -msgstr "전문가" - -#: src/slic3r/GUI/GUI_App.cpp:2263 +#: src/slic3r/GUI/GUI_App.cpp:2425 msgid "Expert View Mode" msgstr "전문가 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 msgid "Mode" msgstr "모드" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 #, c-format, boost-format msgid "%s View Mode" msgstr "%s 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:2271 +#: src/slic3r/GUI/GUI_App.cpp:2433 msgid "&Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Flash Printer &Firmware" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Upload a firmware image into an Arduino based printer" msgstr "아두이노 기반의 프린터 이미지 업로드" -#: src/slic3r/GUI/GUI_App.cpp:2294 +#: src/slic3r/GUI/GUI_App.cpp:2459 msgid "Taking a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2295 +#: src/slic3r/GUI/GUI_App.cpp:2460 msgid "" "Some presets are modified and the unsaved changes will not be captured by " "the configuration snapshot." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2296 +#: src/slic3r/GUI/GUI_App.cpp:2461 msgid "Snapshot name" msgstr "스냅 샷 이름" -#: src/slic3r/GUI/GUI_App.cpp:2312 +#: src/slic3r/GUI/GUI_App.cpp:2477 msgid "Loading a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2321 +#: src/slic3r/GUI/GUI_App.cpp:2486 #, boost-format msgid "Continue to activate a configuration snapshot %1%?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2335 +#: src/slic3r/GUI/GUI_App.cpp:2500 msgid "Failed to activate configuration snapshot." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2354 -msgid "Restart application" -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:2388 +#: src/slic3r/GUI/GUI_App.cpp:2520 msgid "Language selection" msgstr "국가에 맞는 언어를 선택" -#: src/slic3r/GUI/GUI_App.cpp:2391 +#: src/slic3r/GUI/GUI_App.cpp:2523 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." @@ -3533,142 +4754,172 @@ msgstr "" "언어를 전환 하면 응용 프로그램 재시작 합니다. 플레이트 위 객체(object)는 모" "두 지워집니다." -#: src/slic3r/GUI/GUI_App.cpp:2393 src/slic3r/GUI/Preferences.cpp:582 +#: src/slic3r/GUI/GUI_App.cpp:2525 src/slic3r/GUI/Preferences.cpp:730 +#: src/slic3r/GUI/Selection.cpp:1695 msgid "Do you want to proceed?" msgstr "계속 하시겠습니까?" -#: src/slic3r/GUI/GUI_App.cpp:2420 +#: src/slic3r/GUI/GUI_App.cpp:2552 msgid "&Configuration" msgstr "&구성" -#: src/slic3r/GUI/GUI_App.cpp:2534 src/slic3r/GUI/GUI_App.cpp:2595 -msgid "The preset modifications are successfully saved" -msgid_plural "The presets modifications are successfully saved" -msgstr[0] "" +#: src/slic3r/GUI/GUI_App.cpp:2560 +msgid "Restart application" +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2598 +#: src/slic3r/GUI/GUI_App.cpp:2726 msgid "For new project all modifications will be reseted" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2636 +#: src/slic3r/GUI/GUI_App.cpp:2764 msgid "Loading a new project while the current project is modified." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Project is loading" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Opening new project while some presets are unsaved." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "The uploads are still ongoing" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "Stop them and continue anyway?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2662 +#: src/slic3r/GUI/GUI_App.cpp:2790 msgid "Ongoing uploads" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2876 -msgid "It's impossible to print multi-part object(s) with SLA technology." -msgstr "SLA 방식을 사용 하여 다중 객체(object)를 인쇄할 수는 없습니다." +#: src/slic3r/GUI/GUI_App.cpp:3026 +msgid "" +"It's impossible to print object(s) which contains parameter modifiers with " +"SLA technology." +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2877 src/slic3r/GUI/Jobs/SLAImportJob.cpp:235 -#: src/slic3r/GUI/Plater.cpp:2459 +#: src/slic3r/GUI/GUI_App.cpp:3027 src/slic3r/GUI/Jobs/SLAImportJob.cpp:149 +#: src/slic3r/GUI/Plater.cpp:2536 msgid "Please check your object list before preset changing." msgstr "사전 설정을 변경 하기 전에 객체(object) 목록을 확인 하십시오." -#: src/slic3r/GUI/GUI_App.cpp:2901 +#: src/slic3r/GUI/GUI_App.cpp:3070 msgid "Configuration is editing from ConfigWizard" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2926 +#: src/slic3r/GUI/GUI_App.cpp:3088 +#, boost-format +msgid "Welcome to %1% version %2%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3090 +#, boost-format +msgid "" +"Do you wish to register downloads from Printables.com\n" +"for this %1% %2% executable?\n" +"\n" +"Downloads can be registered for only 1 executable at time." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3118 msgid "Select a gcode file:" msgstr "gcode 파일 선택:" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "Open hyperlink in default browser?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "PrusaSlicer: Open hyperlink" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3105 src/slic3r/GUI/Preferences.cpp:382 +#: src/slic3r/GUI/GUI_App.cpp:3306 src/slic3r/GUI/Preferences.cpp:593 msgid "Suppress to open hyperlink in browser" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3107 src/slic3r/GUI/Plater.cpp:1732 +#: src/slic3r/GUI/GUI_App.cpp:3308 src/slic3r/GUI/Plater.cpp:1742 msgid "PrusaSlicer will remember your choice." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3108 +#: src/slic3r/GUI/GUI_App.cpp:3309 msgid "You will not be asked about it again on hyperlinks hovering." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3109 src/slic3r/GUI/Plater.cpp:1736 +#: src/slic3r/GUI/GUI_App.cpp:3310 src/slic3r/GUI/Plater.cpp:1746 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" "to changes your choice." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3111 src/slic3r/GUI/Plater.cpp:1738 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:906 +#: src/slic3r/GUI/GUI_App.cpp:3312 src/slic3r/GUI/Plater.cpp:1748 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:934 msgid "PrusaSlicer: Don't ask me again" msgstr "" -#: src/slic3r/GUI/GUI_Init.cpp:57 src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_App.cpp:3386 +msgid "Check for application update has failed." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3387 +#, boost-format +msgid "No new version is available. Latest release version is %1%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3458 +msgid "Download of new version is already ongoing. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/GUI_Init.cpp:64 src/slic3r/GUI/GUI_Init.cpp:67 msgid "PrusaSlicer GUI initialization failed" msgstr "" -#: src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_Init.cpp:67 #, boost-format msgid "Fatal error, exception catched: %1%" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:54 src/slic3r/GUI/GUI_Factories.cpp:127 -#: src/libslic3r/PrintConfig.cpp:287 src/libslic3r/PrintConfig.cpp:404 -#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:456 -#: src/libslic3r/PrintConfig.cpp:708 src/libslic3r/PrintConfig.cpp:778 -#: src/libslic3r/PrintConfig.cpp:786 src/libslic3r/PrintConfig.cpp:1232 -#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1563 -#: src/libslic3r/PrintConfig.cpp:1955 src/libslic3r/PrintConfig.cpp:2030 -#: src/libslic3r/PrintConfig.cpp:2264 src/libslic3r/PrintConfig.cpp:2850 -#: src/libslic3r/PrintConfig.cpp:2858 src/libslic3r/PrintConfig.cpp:2918 -#: src/libslic3r/PrintConfig.cpp:2927 src/libslic3r/PrintConfig.cpp:3098 +#: src/libslic3r/PrintConfig.cpp:300 src/libslic3r/PrintConfig.cpp:423 +#: src/libslic3r/PrintConfig.cpp:466 src/libslic3r/PrintConfig.cpp:475 +#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:872 +#: src/libslic3r/PrintConfig.cpp:881 src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1376 src/libslic3r/PrintConfig.cpp:1604 +#: src/libslic3r/PrintConfig.cpp:1985 src/libslic3r/PrintConfig.cpp:2060 +#: src/libslic3r/PrintConfig.cpp:2294 src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:2946 src/libslic3r/PrintConfig.cpp:3006 +#: src/libslic3r/PrintConfig.cpp:3015 src/libslic3r/PrintConfig.cpp:3186 msgid "Layers and Perimeters" msgstr "레이어 및 둘레" #: src/slic3r/GUI/GUI_Factories.cpp:56 src/slic3r/GUI/GUI_Factories.cpp:131 -#: src/slic3r/GUI/GUI_Preview.cpp:249 src/slic3r/GUI/Tab.cpp:1547 -#: src/slic3r/GUI/Tab.cpp:1549 src/libslic3r/ExtrusionEntity.cpp:340 -#: src/libslic3r/ExtrusionEntity.cpp:372 src/libslic3r/PrintConfig.cpp:670 -#: src/libslic3r/PrintConfig.cpp:2095 src/libslic3r/PrintConfig.cpp:2104 -#: src/libslic3r/PrintConfig.cpp:2113 src/libslic3r/PrintConfig.cpp:2123 -#: src/libslic3r/PrintConfig.cpp:2132 src/libslic3r/PrintConfig.cpp:2554 -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2568 -#: src/libslic3r/PrintConfig.cpp:2581 src/libslic3r/PrintConfig.cpp:2591 -#: src/libslic3r/PrintConfig.cpp:2599 src/libslic3r/PrintConfig.cpp:2617 -#: src/libslic3r/PrintConfig.cpp:2634 src/libslic3r/PrintConfig.cpp:2655 -#: src/libslic3r/PrintConfig.cpp:2668 src/libslic3r/PrintConfig.cpp:2685 -#: src/libslic3r/PrintConfig.cpp:2703 src/libslic3r/PrintConfig.cpp:2718 -#: src/libslic3r/PrintConfig.cpp:2728 src/libslic3r/PrintConfig.cpp:2737 -#: src/libslic3r/PrintConfig.cpp:2748 src/libslic3r/PrintConfig.cpp:2762 -#: src/libslic3r/PrintConfig.cpp:2778 src/libslic3r/PrintConfig.cpp:2786 -#: src/libslic3r/PrintConfig.cpp:2787 src/libslic3r/PrintConfig.cpp:2796 -#: src/libslic3r/PrintConfig.cpp:2810 src/libslic3r/PrintConfig.cpp:2818 -#: src/libslic3r/PrintConfig.cpp:2832 +#: src/slic3r/GUI/Tab.cpp:1494 src/slic3r/GUI/Tab.cpp:1496 +#: src/libslic3r/PrintConfig.cpp:773 src/libslic3r/PrintConfig.cpp:2125 +#: src/libslic3r/PrintConfig.cpp:2134 src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2153 src/libslic3r/PrintConfig.cpp:2162 +#: src/libslic3r/PrintConfig.cpp:2584 src/libslic3r/PrintConfig.cpp:2590 +#: src/libslic3r/PrintConfig.cpp:2598 src/libslic3r/PrintConfig.cpp:2611 +#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2628 +#: src/libslic3r/PrintConfig.cpp:2644 src/libslic3r/PrintConfig.cpp:2660 +#: src/libslic3r/PrintConfig.cpp:2681 src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2725 +#: src/libslic3r/PrintConfig.cpp:2743 src/libslic3r/PrintConfig.cpp:2753 +#: src/libslic3r/PrintConfig.cpp:2762 src/libslic3r/PrintConfig.cpp:2773 +#: src/libslic3r/PrintConfig.cpp:2785 src/libslic3r/PrintConfig.cpp:2799 +#: src/libslic3r/PrintConfig.cpp:2807 src/libslic3r/PrintConfig.cpp:2808 +#: src/libslic3r/PrintConfig.cpp:2817 src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2840 src/libslic3r/PrintConfig.cpp:2854 +#: src/libslic3r/PrintConfig.cpp:2862 src/libslic3r/PrintConfig.cpp:2873 +#: src/libslic3r/PrintConfig.cpp:2884 src/libslic3r/PrintConfig.cpp:2893 +#: src/libslic3r/PrintConfig.cpp:2903 src/libslic3r/PrintConfig.cpp:2915 msgid "Support material" msgstr "서포트 재료(Support material)" #: src/slic3r/GUI/GUI_Factories.cpp:59 src/slic3r/GUI/GUI_Factories.cpp:135 -#: src/libslic3r/PrintConfig.cpp:3054 src/libslic3r/PrintConfig.cpp:3062 +#: src/libslic3r/PrintConfig.cpp:3142 src/libslic3r/PrintConfig.cpp:3150 msgid "Wipe options" msgstr "지우기 옵션" @@ -3676,330 +4927,351 @@ msgstr "지우기 옵션" msgid "Pad and Support" msgstr "패드 및 서포트" -#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/GUI_Preview.cpp:245 -#: src/slic3r/GUI/Tab.cpp:1513 src/libslic3r/ExtrusionEntity.cpp:336 -#: src/libslic3r/ExtrusionEntity.cpp:364 src/libslic3r/PrintConfig.cpp:1579 -#: src/libslic3r/PrintConfig.cpp:1585 src/libslic3r/PrintConfig.cpp:1599 -#: src/libslic3r/PrintConfig.cpp:1609 src/libslic3r/PrintConfig.cpp:1617 -#: src/libslic3r/PrintConfig.cpp:1619 +#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/Tab.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1620 src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1638 src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1656 src/libslic3r/PrintConfig.cpp:1658 msgid "Ironing" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1283 -#: src/libslic3r/PrintConfig.cpp:1284 src/libslic3r/PrintConfig.cpp:1299 -#: src/libslic3r/PrintConfig.cpp:1309 +#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1344 src/libslic3r/PrintConfig.cpp:1356 +#: src/libslic3r/PrintConfig.cpp:1366 msgid "Fuzzy Skin" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/GUI_Preview.cpp:220 -#: src/slic3r/GUI/Tab.cpp:1581 src/libslic3r/PrintConfig.cpp:507 -#: src/libslic3r/PrintConfig.cpp:766 src/libslic3r/PrintConfig.cpp:1326 -#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1618 -#: src/libslic3r/PrintConfig.cpp:2020 src/libslic3r/PrintConfig.cpp:2352 -#: src/libslic3r/PrintConfig.cpp:2405 src/libslic3r/PrintConfig.cpp:2903 +#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/Tab.cpp:1536 +#: src/libslic3r/PrintConfig.cpp:526 src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:548 src/libslic3r/PrintConfig.cpp:557 +#: src/libslic3r/PrintConfig.cpp:566 src/libslic3r/PrintConfig.cpp:575 +#: src/libslic3r/PrintConfig.cpp:852 src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1657 +#: src/libslic3r/PrintConfig.cpp:2050 src/libslic3r/PrintConfig.cpp:2383 +#: src/libslic3r/PrintConfig.cpp:2436 src/libslic3r/PrintConfig.cpp:2991 msgid "Speed" msgstr "속도" -#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1623 -#: src/slic3r/GUI/Tab.cpp:2304 src/libslic3r/PrintConfig.cpp:796 -#: src/libslic3r/PrintConfig.cpp:1489 src/libslic3r/PrintConfig.cpp:1997 -#: src/libslic3r/PrintConfig.cpp:2373 src/libslic3r/PrintConfig.cpp:2647 -#: src/libslic3r/PrintConfig.cpp:2675 +#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1585 +#: src/slic3r/GUI/Tab.cpp:2288 src/libslic3r/PrintConfig.cpp:889 +#: src/libslic3r/PrintConfig.cpp:1530 src/libslic3r/PrintConfig.cpp:2027 +#: src/libslic3r/PrintConfig.cpp:2404 src/libslic3r/PrintConfig.cpp:2673 +#: src/libslic3r/PrintConfig.cpp:2701 msgid "Extruders" msgstr "익스트루더" -#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:754 -#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:1218 -#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:2006 -#: src/libslic3r/PrintConfig.cpp:2393 src/libslic3r/PrintConfig.cpp:2656 -#: src/libslic3r/PrintConfig.cpp:2890 +#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:840 +#: src/libslic3r/PrintConfig.cpp:953 src/libslic3r/PrintConfig.cpp:1278 +#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:2036 +#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2682 +#: src/libslic3r/PrintConfig.cpp:2978 msgid "Extrusion Width" msgstr "압출 폭" -#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1533 -#: src/libslic3r/PrintConfig.cpp:517 src/libslic3r/PrintConfig.cpp:528 -#: src/libslic3r/PrintConfig.cpp:544 +#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:631 src/libslic3r/PrintConfig.cpp:642 +#: src/libslic3r/PrintConfig.cpp:655 msgid "Skirt and brim" msgstr "스커트와 브림" -#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 -#: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1645 -#: src/slic3r/GUI/Tab.cpp:1649 src/slic3r/GUI/Tab.cpp:2031 -#: src/slic3r/GUI/Tab.cpp:2402 src/slic3r/GUI/Tab.cpp:4729 -#: src/libslic3r/PrintConfig.cpp:260 src/libslic3r/PrintConfig.cpp:495 -#: src/libslic3r/PrintConfig.cpp:1438 src/libslic3r/PrintConfig.cpp:1525 -#: src/libslic3r/PrintConfig.cpp:1572 src/libslic3r/PrintConfig.cpp:2530 -#: src/libslic3r/PrintConfig.cpp:2540 src/libslic3r/PrintConfig.cpp:3078 -#: src/libslic3r/PrintConfig.cpp:3113 src/libslic3r/PrintConfig.cpp:3124 -#: src/libslic3r/PrintConfig.cpp:3139 src/libslic3r/PrintConfig.cpp:3152 -#: src/libslic3r/PrintConfig.cpp:3161 src/libslic3r/PrintConfig.cpp:3173 -#: src/libslic3r/PrintConfig.cpp:3370 -msgid "Advanced" -msgstr "고급" - -#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4663 src/slic3r/GUI/Tab.cpp:4664 -#: src/libslic3r/PrintConfig.cpp:3564 src/libslic3r/PrintConfig.cpp:3571 -#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3589 -#: src/libslic3r/PrintConfig.cpp:3599 src/libslic3r/PrintConfig.cpp:3609 -#: src/libslic3r/PrintConfig.cpp:3646 src/libslic3r/PrintConfig.cpp:3653 -#: src/libslic3r/PrintConfig.cpp:3664 src/libslic3r/PrintConfig.cpp:3674 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3696 -#: src/libslic3r/PrintConfig.cpp:3706 src/libslic3r/PrintConfig.cpp:3715 -#: src/libslic3r/PrintConfig.cpp:3725 src/libslic3r/PrintConfig.cpp:3736 -#: src/libslic3r/PrintConfig.cpp:3744 +#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Tab.cpp:4946 src/slic3r/GUI/Tab.cpp:4948 +#: src/libslic3r/PrintConfig.cpp:3328 src/libslic3r/PrintConfig.cpp:3337 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3356 +#: src/libslic3r/PrintConfig.cpp:3366 src/libslic3r/PrintConfig.cpp:3387 +#: src/libslic3r/PrintConfig.cpp:3410 src/libslic3r/PrintConfig.cpp:3417 +#: src/libslic3r/PrintConfig.cpp:3432 src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3464 +#: src/libslic3r/PrintConfig.cpp:3474 src/libslic3r/PrintConfig.cpp:3488 +#: src/libslic3r/PrintConfig.cpp:3498 src/libslic3r/PrintConfig.cpp:3841 +#: src/libslic3r/PrintConfig.cpp:3861 src/libslic3r/PrintConfig.cpp:3868 +#: src/libslic3r/PrintConfig.cpp:3876 msgid "Supports" msgstr "서포트" -#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4704 src/slic3r/GUI/Tab.cpp:4705 -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3752 -#: src/libslic3r/PrintConfig.cpp:3759 src/libslic3r/PrintConfig.cpp:3773 -#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3794 -#: src/libslic3r/PrintConfig.cpp:3816 src/libslic3r/PrintConfig.cpp:3827 -#: src/libslic3r/PrintConfig.cpp:3834 src/libslic3r/PrintConfig.cpp:3841 -#: src/libslic3r/PrintConfig.cpp:3852 src/libslic3r/PrintConfig.cpp:3861 -#: src/libslic3r/PrintConfig.cpp:3870 +#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:590 +#: src/slic3r/GUI/Tab.cpp:4960 src/slic3r/GUI/Tab.cpp:4961 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3884 +#: src/libslic3r/PrintConfig.cpp:3891 src/libslic3r/PrintConfig.cpp:3905 +#: src/libslic3r/PrintConfig.cpp:3916 src/libslic3r/PrintConfig.cpp:3926 +#: src/libslic3r/PrintConfig.cpp:3948 src/libslic3r/PrintConfig.cpp:3959 +#: src/libslic3r/PrintConfig.cpp:3966 src/libslic3r/PrintConfig.cpp:3973 +#: src/libslic3r/PrintConfig.cpp:3984 src/libslic3r/PrintConfig.cpp:3993 +#: src/libslic3r/PrintConfig.cpp:4002 msgid "Pad" msgstr "패드" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4722 -#: src/slic3r/GUI/Tab.cpp:4723 src/libslic3r/SLA/Hollowing.cpp:73 -#: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3880 -#: src/libslic3r/PrintConfig.cpp:3887 src/libslic3r/PrintConfig.cpp:3897 -#: src/libslic3r/PrintConfig.cpp:3906 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4978 +#: src/slic3r/GUI/Tab.cpp:4979 src/libslic3r/SLA/Hollowing.cpp:86 +#: src/libslic3r/SLA/Hollowing.cpp:91 src/libslic3r/SLA/Hollowing.cpp:106 +#: src/libslic3r/SLA/Hollowing.cpp:115 src/libslic3r/PrintConfig.cpp:4012 +#: src/libslic3r/PrintConfig.cpp:4019 src/libslic3r/PrintConfig.cpp:4029 +#: src/libslic3r/PrintConfig.cpp:4038 msgid "Hollowing" msgstr "속이 빈 공동(Hollowing)" -#: src/slic3r/GUI/GUI_Factories.cpp:160 +#: src/slic3r/GUI/GUI_Factories.cpp:159 msgid "Add part" msgstr "부품(Part) 추가" -#: src/slic3r/GUI/GUI_Factories.cpp:161 +#: src/slic3r/GUI/GUI_Factories.cpp:160 msgid "Add negative volume" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:162 +#: src/slic3r/GUI/GUI_Factories.cpp:161 msgid "Add modifier" msgstr "편집영역(modifier) 추가" -#: src/slic3r/GUI/GUI_Factories.cpp:163 +#: src/slic3r/GUI/GUI_Factories.cpp:162 msgid "Add support blocker" msgstr "서포트 금지영역(blocker) 추가" -#: src/slic3r/GUI/GUI_Factories.cpp:164 +#: src/slic3r/GUI/GUI_Factories.cpp:163 msgid "Add support enforcer" msgstr "서포트 지원(enforcer)영역 추가" -#: src/slic3r/GUI/GUI_Factories.cpp:300 +#: src/slic3r/GUI/GUI_Factories.cpp:169 +msgid "Add text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:170 +msgid "Add negative text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:171 +msgid "Add text modifier" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:307 msgid "Select showing settings" msgstr "표시된 설정을 선택 합니다" -#: src/slic3r/GUI/GUI_Factories.cpp:407 src/slic3r/GUI/GUI_Factories.cpp:412 -#: src/slic3r/GUI/GUI_Factories.cpp:556 src/slic3r/GUI/GUI_Factories.cpp:562 +#: src/slic3r/GUI/GUI_Factories.cpp:414 src/slic3r/GUI/GUI_Factories.cpp:419 +#: src/slic3r/GUI/GUI_Factories.cpp:625 src/slic3r/GUI/GUI_Factories.cpp:631 #, c-format, boost-format msgid "Quick Add Settings (%s)" msgstr "빠른 추가 설정 (%s)" -#: src/slic3r/GUI/GUI_Factories.cpp:444 +#: src/slic3r/GUI/GUI_Factories.cpp:460 msgid "Remove the selected object" msgstr "선택한 객체(object) 제거" -#: src/slic3r/GUI/GUI_Factories.cpp:456 +#: src/slic3r/GUI/GUI_Factories.cpp:475 msgid "Load" msgstr "불러오기" -#: src/slic3r/GUI/GUI_Factories.cpp:461 src/slic3r/GUI/GUI_Factories.cpp:501 -#: src/slic3r/GUI/GUI_Factories.cpp:505 +#: src/slic3r/GUI/GUI_Factories.cpp:481 src/slic3r/GUI/GUI_Factories.cpp:566 +#: src/slic3r/GUI/GUI_Factories.cpp:570 msgid "Box" msgstr "박스" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Cylinder" msgstr "원통" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Slab" msgstr "슬랩" -#: src/slic3r/GUI/GUI_Factories.cpp:471 +#: src/slic3r/GUI/GUI_Factories.cpp:493 msgid "Gallery" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:488 src/slic3r/GUI/GUI_Factories.cpp:526 +#: src/slic3r/GUI/GUI_Factories.cpp:529 src/slic3r/GUI/GUI_Factories.cpp:549 +#: src/slic3r/GUI/GUI_ObjectList.cpp:660 +msgid "Text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:555 src/slic3r/GUI/GUI_Factories.cpp:558 +#: src/slic3r/GUI/GUI_Factories.cpp:595 msgid "Height range Modifier" msgstr "높이 범위에 대한 설정" -#: src/slic3r/GUI/GUI_Factories.cpp:535 +#: src/slic3r/GUI/GUI_Factories.cpp:604 msgid "Add settings" msgstr "다음 설정" -#: src/slic3r/GUI/GUI_Factories.cpp:626 +#: src/slic3r/GUI/GUI_Factories.cpp:695 msgid "Change type" msgstr "타입 변경" -#: src/slic3r/GUI/GUI_Factories.cpp:636 src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:705 src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Object" msgstr "분리 된 객체(object)로 설정" -#: src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Objects" msgstr "분리된 객체(object)로 설정" -#: src/slic3r/GUI/GUI_Factories.cpp:658 +#: src/slic3r/GUI/GUI_Factories.cpp:727 msgid "Printable" msgstr "인쇄가능" -#: src/slic3r/GUI/GUI_Factories.cpp:686 +#: src/slic3r/GUI/GUI_Factories.cpp:755 src/slic3r/GUI/GUI_ObjectList.cpp:2070 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2582 +msgid "Invalidate cut info" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:770 msgid "Rename" msgstr "이름 변경" -#: src/slic3r/GUI/GUI_Factories.cpp:696 +#: src/slic3r/GUI/GUI_Factories.cpp:780 msgid "Fix through the Netfabb" msgstr "Netfabb를 통해 수정" -#: src/slic3r/GUI/GUI_Factories.cpp:715 -msgid "Export as STL" -msgstr "STL로 내보내기" +#: src/slic3r/GUI/GUI_Factories.cpp:799 +msgid "Export as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:726 +#: src/slic3r/GUI/GUI_Factories.cpp:810 msgid "Reload the selected volumes from disk" msgstr "디스크에서 선택한 볼륨 다시 로드" -#: src/slic3r/GUI/GUI_Factories.cpp:733 src/slic3r/GUI/Plater.cpp:3568 +#: src/slic3r/GUI/GUI_Factories.cpp:817 src/slic3r/GUI/Plater.cpp:3602 msgid "Replace with STL" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:733 +#: src/slic3r/GUI/GUI_Factories.cpp:817 msgid "Replace the selected volume with new STL" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Set extruder for selected items" msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" -#: src/slic3r/GUI/GUI_Factories.cpp:778 src/slic3r/Utils/Repetier.cpp:126 -#: src/slic3r/Utils/Repetier.cpp:209 src/libslic3r/PrintConfig.cpp:635 -#: src/libslic3r/PrintConfig.cpp:2770 +#: src/slic3r/GUI/GUI_Factories.cpp:862 src/slic3r/Utils/Repetier.cpp:145 +#: src/slic3r/Utils/Repetier.cpp:226 src/libslic3r/PrintConfig.cpp:738 +#: src/libslic3r/PrintConfig.cpp:2790 src/libslic3r/PrintConfig.cpp:3851 msgid "Default" msgstr "기본값" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale to print volume" msgstr "인쇄 볼륨에 따라 배율 조정" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale the selected object to fit the print volume" msgstr "인쇄 볼륨에 맞게 선택한 객체(object)의 배율 조정" -#: src/slic3r/GUI/GUI_Factories.cpp:835 src/slic3r/GUI/Plater.cpp:5655 +#: src/slic3r/GUI/GUI_Factories.cpp:921 src/slic3r/GUI/Plater.cpp:6213 msgid "Convert from imperial units" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:836 src/slic3r/GUI/Plater.cpp:5656 +#: src/slic3r/GUI/GUI_Factories.cpp:922 src/slic3r/GUI/Plater.cpp:6214 msgid "Revert conversion from imperial units" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:837 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:923 src/slic3r/GUI/Plater.cpp:6215 msgid "Convert from meters" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:838 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:924 src/slic3r/GUI/Plater.cpp:6215 msgid "Revert conversion from meters" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2135 -#: src/libslic3r/PrintConfig.cpp:4523 +#: src/slic3r/GUI/GUI_Factories.cpp:945 src/slic3r/GUI/GUI_ObjectList.cpp:2290 +#: src/libslic3r/PrintConfig.cpp:4689 msgid "Merge" msgstr "병합" -#: src/slic3r/GUI/GUI_Factories.cpp:859 +#: src/slic3r/GUI/GUI_Factories.cpp:945 msgid "Merge objects to the one multipart object" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Along X axis" msgstr "X 축을 따라" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Mirror the selected object along the X axis" msgstr "선택한 객체(object)를 X 축을 따라 반전합니다" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Along Y axis" msgstr "Y 축을 따라" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Mirror the selected object along the Y axis" msgstr "선택한 객체(object)를 Y 축을 따라 반전합니다" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Along Z axis" msgstr "Z 축 따라" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Mirror the selected object along the Z axis" msgstr "선택한 객체(object)를 Z 축을 따라 반전합니다" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror" msgstr "반전(Mirror)" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror the selected object" msgstr "반전할 객제를 선택" -#: src/slic3r/GUI/GUI_Factories.cpp:901 src/slic3r/GUI/GUI_ObjectList.cpp:1696 +#: src/slic3r/GUI/GUI_Factories.cpp:977 +msgid "Edit text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:999 +msgid "Ability to change text, font, size, ..." +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1021 src/slic3r/GUI/GUI_ObjectList.cpp:1793 msgid "Add Shape" msgstr "모양 추가" -#: src/slic3r/GUI/GUI_Factories.cpp:937 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "To objects" msgstr "객체(object)에" -#: src/slic3r/GUI/GUI_Factories.cpp:937 src/slic3r/GUI/GUI_Factories.cpp:954 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "Split the selected object into individual objects" msgstr "선택한 객체(object)를 개별 객체(object)로 분할 합니다." -#: src/slic3r/GUI/GUI_Factories.cpp:940 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 msgid "To parts" msgstr "부품(Part)에" -#: src/slic3r/GUI/GUI_Factories.cpp:940 src/slic3r/GUI/GUI_Factories.cpp:975 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 src/slic3r/GUI/GUI_Factories.cpp:1097 msgid "Split the selected object into individual parts" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4552 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 src/slic3r/GUI/GUI_Factories.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:4718 msgid "Split" msgstr "쪼개기" -#: src/slic3r/GUI/GUI_Factories.cpp:944 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 msgid "Split the selected object" msgstr "선택한 객체(object) 분할" -#: src/slic3r/GUI/GUI_Factories.cpp:1084 +#: src/slic3r/GUI/GUI_Factories.cpp:1225 src/slic3r/GUI/GUI_Factories.cpp:1243 +msgid "Set number of instances" +msgstr "복제할 수량 설정" + +#: src/slic3r/GUI/GUI_Factories.cpp:1225 +msgid "Change the number of instances of the selected objects" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1237 msgid "Add one more instance of the selected object" msgstr "선택한 개체의 인스턴스를 하나 더 추가합니다." -#: src/slic3r/GUI/GUI_Factories.cpp:1087 +#: src/slic3r/GUI/GUI_Factories.cpp:1240 msgid "Remove one instance of the selected object" msgstr "선택한 개체의 인스턴스 하나 제거" -#: src/slic3r/GUI/GUI_Factories.cpp:1090 -msgid "Set number of instances" -msgstr "복제할 수량 설정" - -#: src/slic3r/GUI/GUI_Factories.cpp:1090 +#: src/slic3r/GUI/GUI_Factories.cpp:1243 msgid "Change the number of instances of the selected object" msgstr "선택한 객체의 인스턴스 수 변경" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill bed with instances" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill the remaining area of bed with instances of the selected object" msgstr "" @@ -4019,299 +5291,347 @@ msgstr "레이어 범위 제거" msgid "Add layer range" msgstr "레이어 범위 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:297 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:323 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 msgid "Name" msgstr "이름" -#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:480 +#: src/slic3r/GUI/GUI_ObjectList.cpp:342 src/slic3r/GUI/GUI_ObjectList.cpp:513 msgid "Editing" msgstr "편집" -#: src/slic3r/GUI/GUI_ObjectList.cpp:400 +#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +msgid "Wrong volume index " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:433 msgid "No errors detected" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:409 +#: src/slic3r/GUI/GUI_ObjectList.cpp:442 #, c-format, boost-format msgid "Auto-repaired %1$d error" msgid_plural "Auto-repaired %1$d errors" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:415 +#: src/slic3r/GUI/GUI_ObjectList.cpp:448 #, c-format, boost-format msgid "%1$d degenerate facet" msgid_plural "%1$d degenerate facets" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:450 #, c-format, boost-format msgid "%1$d edge fixed" msgid_plural "%1$d edges fixed" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:452 #, c-format, boost-format msgid "%1$d facet removed" msgid_plural "%1$d facets removed" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:421 +#: src/slic3r/GUI/GUI_ObjectList.cpp:454 #, c-format, boost-format msgid "%1$d facet reversed" msgid_plural "%1$d facets reversed" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +#: src/slic3r/GUI/GUI_ObjectList.cpp:456 #, c-format, boost-format msgid "%1$d backward edge" msgid_plural "%1$d backward edges" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:426 src/slic3r/GUI/GUI_ObjectList.cpp:429 +#: src/slic3r/GUI/GUI_ObjectList.cpp:459 src/slic3r/GUI/GUI_ObjectList.cpp:462 #, c-format, boost-format msgid "%1$d open edge" msgid_plural "%1$d open edges" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:428 +#: src/slic3r/GUI/GUI_ObjectList.cpp:461 msgid "Remaining errors" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:436 +#: src/slic3r/GUI/GUI_ObjectList.cpp:469 msgid "Right button click the icon to fix STL through Netfabb" msgstr "아이콘을 클릭 하여 Netfabb에서 STL을 수정 합니다" -#: src/slic3r/GUI/GUI_ObjectList.cpp:482 +#: src/slic3r/GUI/GUI_ObjectList.cpp:515 msgid "Right button click the icon to change the object settings" msgstr "아이콘을 클릭 하여 객체(object) 설정을 변경 합니다" -#: src/slic3r/GUI/GUI_ObjectList.cpp:484 +#: src/slic3r/GUI/GUI_ObjectList.cpp:517 msgid "Click the icon to change the object settings" msgstr "아이콘을 클릭 하여 오브젝트 설정을 변경 합니다" -#: src/slic3r/GUI/GUI_ObjectList.cpp:488 +#: src/slic3r/GUI/GUI_ObjectList.cpp:521 msgid "Right button click the icon to change the object printable property" msgstr "오른쪽 버튼이 아이콘을 클릭하여 객체 인쇄 가능한 속성을 변경합니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:523 msgid "Click the icon to change the object printable property" msgstr "아이콘을 클릭하여 객체 인쇄 가능 속성을 변경합니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:616 +#: src/slic3r/GUI/GUI_ObjectList.cpp:649 msgid "Change Extruder" msgstr "압출기(익스트루더) 변경" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Object" msgstr "객체(object) 이름 바꾸기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Sub-object" msgstr "하위 객체(object) 이름 바꾸기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1242 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4006 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1307 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4589 msgid "Instances to Separated Objects" msgstr "분리된 객체(object)에 대한 복제본" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Volumes in Object reordered" msgstr "개체의 볼륨이 재정렬되었습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Object reordered" msgstr "개체 순서가 다시 지정되었습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1298 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1363 msgid "Add Settings for Layers" msgstr "레이어 설정 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1299 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1364 msgid "Add Settings for Sub-object" msgstr "하위 객체(object)에 대한 설정 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1300 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1365 msgid "Add Settings for Object" msgstr "객체(object)에 대한 설정 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1339 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1404 msgid "Add Settings Bundle for Height range" msgstr "높이 범위에 대한 설정 번들 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1340 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1405 msgid "Add Settings Bundle for Sub-object" msgstr "하위 객체(object)에 대한 번들 설정을 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1341 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1406 msgid "Add Settings Bundle for Object" msgstr "객체(object)에 대한 번들 설정을 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Part" msgstr "부품(Part)을 불러 오기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1509 src/slic3r/GUI/Plater.cpp:2380 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1582 src/slic3r/GUI/Plater.cpp:2453 msgid "Loading" msgstr "로딩" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1540 src/slic3r/GUI/Plater.cpp:2417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1617 src/slic3r/GUI/Plater.cpp:2494 msgid "Loading file" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1548 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1625 msgid "Error!" msgstr "에러!" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1638 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1721 msgid "Add Generic Subobject" msgstr "기본이 되는 하위 객체(object) 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1663 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1761 msgid "Generic" msgstr "일반" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shape from Gallery" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shapes from Gallery" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1830 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1945 msgid "Remove paint-on supports" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1837 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 msgid "Remove paint-on seam" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1844 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 msgid "Remove Multi Material painting" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1850 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1972 msgid "Shift objects to bed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1856 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1978 msgid "Remove variable layer height" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1877 -msgid "Delete Settings" -msgstr "설정 삭제" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1901 -msgid "Delete All Instances from Object" -msgstr "객체(object)에서 모든 복제본 삭제" +#: src/slic3r/GUI/GUI_ObjectList.cpp:1999 +msgid "Delete Settings" +msgstr "설정 삭제" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2023 +msgid "Delete All Instances from Object" +msgstr "객체(object)에서 모든 복제본 삭제" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2039 +msgid "Delete Height Range" +msgstr "높이 범위 삭제" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2057 +msgid "Delete connector from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2058 +msgid "Delete solid part from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2059 +msgid "Delete negative volume from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2061 +msgid "" +"To save cut information you can delete all connectors from all related " +"objects." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2064 +msgid "" +"This action will break a cut information.\n" +"After that PrusaSlicer can't guarantee model consistency.\n" +"\n" +"To manipulate with solid parts or negative volumes you have to invalidate " +"cut infornation first." +msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1917 -msgid "Delete Height Range" -msgstr "높이 범위 삭제" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2072 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2612 +msgid "Delete all connectors" +msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1949 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2103 msgid "From Object List You can't delete the last solid part from object." msgstr "객체(object) 리스트에서 마지막 부품(Part)을 삭제할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1953 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2112 msgid "Delete Subobject" msgstr "하위 객체(object) 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1976 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2138 msgid "Last instance of an object cannot be deleted." msgstr "객체(object)의 마지막 복제본를 삭제할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1980 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +msgid "Instance cannot be deleted from cut object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2146 msgid "Delete Instance" msgstr "복제본 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2004 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2170 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" "선택한 객체(object)는 부품(Part) 하나만 포함되어 있기 때문에 분할 할 수 없습" "니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2008 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2174 msgid "Split to Parts" msgstr "부품(Part)으로 분할" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2177 src/slic3r/GUI/Plater.cpp:3133 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"splitting the object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2297 msgid "Merged" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2237 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2392 msgid "Merge all parts to the one single object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2269 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2424 msgid "Add Layers" msgstr "레이어 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2438 -msgid "Group manipulation" -msgstr "그룹 조작" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2695 +msgid "Cut Connectors information" +msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2453 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2705 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2768 msgid "Object manipulation" msgstr "객체(object) 조작" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2486 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2714 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1472 +msgid "Group manipulation" +msgstr "그룹 조작" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2802 msgid "Object Settings to modify" msgstr "수정할 객체(object) 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2806 msgid "Part Settings to modify" msgstr "수정할 부품(Part) 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2495 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2811 msgid "Layer range Settings to modify" msgstr "레이어 범위 설정 수정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2501 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2817 msgid "Part manipulation" msgstr "부품(Part) 조작" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2825 msgid "Instance manipulation" msgstr "복제본 제거" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Height ranges" msgstr "높이 범위" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Settings for height range" msgstr "높이 범위에 대한 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2750 -msgid "Delete Selected Item" -msgstr "선택한 항목(item) 삭제" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2943 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3363 msgid "Delete Selected" msgstr "선택된 것 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3019 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3047 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3067 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3441 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3469 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3489 msgid "Add Height Range" msgstr "높이 범위 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3113 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3535 msgid "" "Cannot insert a new layer range after the current layer range.\n" "The next layer range is too thin to be split to two\n" "without violating the minimum layer height." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3117 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3539 msgid "" "Cannot insert a new layer range between the current and the next layer " "range.\n" @@ -4319,239 +5639,288 @@ msgid "" "is thinner than the minimum layer height allowed." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3122 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3544 msgid "" "Cannot insert a new layer range after the current layer range.\n" "Current layer range overlaps with the next layer range." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3603 msgid "Edit Height Range" msgstr "높이 범위 편집" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3500 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3989 msgid "Selection-Remove from list" msgstr "목록에서 선택-제거" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4001 msgid "Selection-Add from list" msgstr "목록에서 선택-추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3649 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4138 msgid "Object or Instance" msgstr "객체(object) 또는 복제본" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Part" -msgstr "부품(Part)(Part)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 msgid "Layer" msgstr "레이어" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3652 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4141 msgid "Unsupported selection" msgstr "지원 되지 않는 선택" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3653 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 #, c-format, boost-format msgid "You started your selection with %s Item." msgstr "%s 선택된 항목으로 시작합니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3654 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4143 #, c-format, boost-format msgid "In this mode you can select only other %s Items%s" msgstr "이 모드에서는 %s의 다른 %s 항목만 선택할 수 있습니다" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3657 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4146 msgid "of a current Object" msgstr "현재 객체(object)의" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3662 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3737 src/slic3r/GUI/Plater.cpp:181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4151 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4226 src/slic3r/GUI/Plater.cpp:197 msgid "Info" msgstr "정보" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3784 -msgid "You can't change a type of the last solid part of the object." -msgstr "객체(object)의 마지막 부품(Part) 유형은 변경할 수 없습니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 msgid "Negative Volume" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Modifier" -msgstr "편집 영역" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Blocker" msgstr "서포트 금지 영역" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Enforcer" msgstr "서포트 지원 영역" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Select type of part" msgstr "부품(Part) 유형 선택" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3795 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4359 msgid "Change Part Type" msgstr "부품(Part) 유형 변경" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Enter new name" msgstr "새 이름 입력" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Renaming" msgstr "이름 바꾸기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4091 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4681 msgid "Repairing model" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4120 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4691 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"repairing the mesh." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4711 msgid "Fix through NetFabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4123 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4714 msgid "Fixing through NetFabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4153 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4744 msgid "The following model was repaired successfully" msgid_plural "The following models were repaired successfully" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4159 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4750 msgid "Folowing model repair failed" msgid_plural "Folowing models repair failed" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4164 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4755 msgid "Repairing was canceled" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4276 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4869 msgid "Change Extruders" msgstr "돌출기 변경" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Printable group" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Unprintable group" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Printable" msgstr "인쇄 가능 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Unprintable" msgstr "인쇄할 수 없는 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Printable Instance" msgstr "인쇄 가능한 인스턴스 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Unprintable Instance" msgstr "인쇄할 수 없는 인스턴스 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:55 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:84 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:61 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:96 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1132 msgid "World coordinates" msgstr "전체크기와 좌표" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:56 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:85 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:97 msgid "Local coordinates" msgstr "로컬 좌표" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:60 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:67 msgid "Select coordinate space, in which the transformation will be performed." msgstr "변환이 수행될 좌표 공간을 선택 합니다." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:141 src/libslic3r/GCode.cpp:540 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:157 src/libslic3r/GCode.cpp:491 msgid "Object name" msgstr "객체(object) 이름" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:201 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:521 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:221 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:710 msgid "Position" msgstr "위치" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:202 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:522 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:222 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:711 #: src/slic3r/GUI/Mouse3DController.cpp:478 #: src/slic3r/GUI/Mouse3DController.cpp:499 msgid "Rotation" msgstr "회전" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:250 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:239 +msgid "Size [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "Mirror along" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +#, c-format, boost-format +msgid " %c " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "axis" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:279 #, c-format, boost-format msgid "Toggle %c axis mirroring" msgstr "전환 %c 축 미러링" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:284 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:329 msgid "Set Mirror" msgstr "미러 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:324 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:336 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:348 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:374 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:387 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:393 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:401 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:428 msgid "Drop to bed" msgstr "배드를 아래로 내리기" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:445 msgid "Reset rotation" msgstr "회전 재설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 msgid "Reset Rotation" msgstr "회전 재설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:398 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:400 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:490 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:519 msgid "Reset scale" msgstr "크기 재설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:539 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546 +msgid "Reset skew" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:553 msgid "Inches" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:523 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:712 msgid "Scale factors" msgstr "축척 계수" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:577 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:740 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:752 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:793 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:801 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +msgid "Rotate (relative)" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:751 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:800 +msgid "Translate (relative) [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:829 msgid "Translate" msgstr "번역" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:640 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:905 msgid "" "You cannot use non-uniform scaling mode for multiple objects/parts selection" msgstr "" "여러 객체/부품 선택에 는 균일하지 않은 배율 조정 모드를 사용할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:820 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +msgid "Left handed" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1133 +msgid "Object coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1134 +msgid "Part coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1176 msgid "Set Position" msgstr "위치 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:852 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1220 msgid "Set Orientation" msgstr "방향 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:931 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1351 msgid "Set Scale" msgstr "축척 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1368 +msgid "Set Size" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1427 msgid "" "The currently manipulated object is tilted (rotation angles are not " "multiples of 90°).\n" @@ -4563,7 +5932,7 @@ msgstr "" "님).\n" "기울어진 객체(object)의 배율 조정은 기본 좌표에서만 가능 합니다." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:983 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1430 msgid "" "This operation is irreversible.\n" "Do you want to proceed?" @@ -4589,170 +5958,69 @@ msgstr "삭제 %s 옵션" msgid "Change Option %s" msgstr "옵션 %s 변경" -#: src/slic3r/GUI/GUI_Preview.cpp:211 -msgid "View" -msgstr "보기" - -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/libslic3r/PrintConfig.cpp:808 -msgid "Height" -msgstr "높이" - -#: src/slic3r/GUI/GUI_Preview.cpp:219 src/libslic3r/PrintConfig.cpp:3032 -msgid "Width" -msgstr "폭" - -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2016 -msgid "Fan speed" -msgstr "팬 속도" - -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1991 -msgid "Temperature" -msgstr "온도" - -#: src/slic3r/GUI/GUI_Preview.cpp:223 -msgid "Volumetric flow rate" -msgstr "용적의 유량값" - -#: src/slic3r/GUI/GUI_Preview.cpp:228 -msgid "Show" -msgstr "보다" - -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/GUI_Preview.cpp:254 -msgid "Feature types" -msgstr "특색 유형" - -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:330 -#: src/libslic3r/ExtrusionEntity.cpp:352 -msgid "Perimeter" -msgstr "가장자리" - -#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:331 -#: src/libslic3r/ExtrusionEntity.cpp:354 -msgid "External perimeter" -msgstr "외부 가장자리" - -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:332 -#: src/libslic3r/ExtrusionEntity.cpp:356 -msgid "Overhang perimeter" -msgstr "오버행(Overhang) 둘레" - -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:333 -#: src/libslic3r/ExtrusionEntity.cpp:358 -msgid "Internal infill" -msgstr "내부 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:334 -#: src/libslic3r/ExtrusionEntity.cpp:360 src/libslic3r/PrintConfig.cpp:1407 -#: src/libslic3r/PrintConfig.cpp:2392 src/libslic3r/PrintConfig.cpp:2404 -msgid "Solid infill" -msgstr "솔리드 인필" - -#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:335 -#: src/libslic3r/ExtrusionEntity.cpp:362 src/libslic3r/PrintConfig.cpp:1416 -#: src/libslic3r/PrintConfig.cpp:2889 src/libslic3r/PrintConfig.cpp:2902 -msgid "Top solid infill" -msgstr "가장 윗부분 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:337 -#: src/libslic3r/ExtrusionEntity.cpp:366 -msgid "Bridge infill" -msgstr "브릿지 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:338 -#: src/libslic3r/ExtrusionEntity.cpp:368 src/libslic3r/PrintConfig.cpp:1325 -msgid "Gap fill" -msgstr "공백 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:248 src/libslic3r/ExtrusionEntity.cpp:339 -#: src/libslic3r/ExtrusionEntity.cpp:370 -msgid "Skirt/Brim" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:250 src/libslic3r/ExtrusionEntity.cpp:341 -#: src/libslic3r/ExtrusionEntity.cpp:374 src/libslic3r/PrintConfig.cpp:2736 -msgid "Support material interface" -msgstr "서포트 접점" - -#: src/slic3r/GUI/GUI_Preview.cpp:251 src/slic3r/GUI/Tab.cpp:1634 -#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/ExtrusionEntity.cpp:376 -msgid "Wipe tower" -msgstr "와이프 타워(Wipe tower)" - -#: src/slic3r/GUI/GUI_Preview.cpp:728 +#: src/slic3r/GUI/GUI_Preview.cpp:581 msgid "NOTE:" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:729 +#: src/slic3r/GUI/GUI_Preview.cpp:582 #, boost-format msgid "Sliced object \"%1%\" looks like a logo or a sign" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:730 +#: src/slic3r/GUI/GUI_Preview.cpp:583 msgid "Apply color change automatically" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:1058 -msgid "Shells" -msgstr "쉘(Shells)" - -#: src/slic3r/GUI/GUI_Preview.cpp:1059 -msgid "Tool marker" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:1060 -msgid "Legend/Estimated printing time" -msgstr "" - -#: src/slic3r/GUI/HintNotification.cpp:771 -#: src/slic3r/GUI/HintNotification.cpp:797 -#: src/slic3r/GUI/NotificationManager.cpp:374 -#: src/slic3r/GUI/NotificationManager.cpp:391 +#: src/slic3r/GUI/HintNotification.cpp:773 +#: src/slic3r/GUI/HintNotification.cpp:799 +#: src/slic3r/GUI/NotificationManager.cpp:457 +#: src/slic3r/GUI/NotificationManager.cpp:474 msgid "More" msgstr "" -#: src/slic3r/GUI/HintNotification.cpp:912 +#: src/slic3r/GUI/HintNotification.cpp:914 msgid "Open Preferences." msgstr "" -#: src/slic3r/GUI/HintNotification.cpp:1004 +#: src/slic3r/GUI/HintNotification.cpp:1006 msgid "Open Documentation in web browser." msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:527 +#: src/slic3r/GUI/ImGuiWrapper.cpp:666 msgid "Edit" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:960 src/slic3r/GUI/Search.cpp:470 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1166 src/slic3r/GUI/Search.cpp:531 msgid "Use for search" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:961 src/slic3r/GUI/Search.cpp:463 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1167 src/slic3r/GUI/Search.cpp:524 msgid "Category" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:963 src/slic3r/GUI/Search.cpp:465 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1169 src/slic3r/GUI/Search.cpp:526 msgid "Search in English" msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:174 -msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "" -"모델 객체(object)를 정렬할 수 없습니다. 일부 형상은 유효 하지 않을 수 있습니" -"다." - -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:183 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:168 msgid "Arranging" msgstr "정렬" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:207 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:204 msgid "Arranging canceled." msgstr "취소 된 정렬" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:208 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:205 msgid "Arranging done." msgstr "정렬 완료." -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:253 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:225 +msgid "Could not arrange model objects! Some geometries may be invalid." +msgstr "" +"모델 객체(object)를 정렬할 수 없습니다. 일부 형상은 유효 하지 않을 수 있습니" +"다." + +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:265 #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -4760,39 +6028,82 @@ msgid "" "%s" msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:119 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:108 msgid "Filling bed" msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:130 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:140 msgid "Bed filling canceled." msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:131 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:141 msgid "Bed filling done." msgstr "" -#: src/slic3r/GUI/Jobs/Job.cpp:111 -msgid "ERROR: not enough resources to execute a new job." -msgstr "오류: 새 작업을 실행하기에 충분한 리소스가 없습니다." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:148 src/slic3r/GUI/Jobs/EmbossJob.cpp:596 +msgid "Can't create empty volume." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:201 +msgid "Can't create empty object." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:208 +msgid "Add Emboss text object" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:247 +msgid "Created text volume is empty. Change text or font." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:465 +msgid "" +"It is used default volume for embossed text, try to change text or font to " +"fix it." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:549 +#, boost-format +msgid "Text: %1%" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:593 +msgid "Bad object to create volume." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:598 +msgid "Add Emboss text Volume" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:698 +msgid "Font doesn't have any shape for given text." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:738 +msgid "There is no volume in projection direction." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:787 +msgid "There is no valid surface for text projection." +msgstr "" -#: src/slic3r/GUI/Jobs/PlaterJob.cpp:13 -msgid "An unexpected error occured" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:823 +msgid "Issue during embossing the text." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:21 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:22 msgid "Best surface quality" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:23 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 msgid "Optimize object rotation for best surface quality." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:25 msgid "Reduced overhang slopes" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:26 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:27 msgid "" "Optimize object rotation to have minimum amount of overhangs needing support " "structures.\n" @@ -4800,1338 +6111,1356 @@ msgid "" "touching the print bed if no elevation is set." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:30 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:31 msgid "Lowest Z height" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:32 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:33 msgid "Rotate the model to have the lowest z height for faster print time." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:59 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:53 msgid "Searching for optimal orientation" msgstr "최적의 방향 검색" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:77 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:83 msgid "Orientation search canceled." msgstr "방향 검색이 취소되었습니다." -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:78 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:84 msgid "Orientation found." msgstr "방향을 찾았습니다." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:36 -msgid "Choose SLA archive:" -msgstr "" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:40 -msgid "Import file" -msgstr "" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47 -msgid "Import model and profile" -msgstr "" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48 -msgid "Import profile only" -msgstr "" - #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:49 -msgid "Import model only" -msgstr "" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60 -msgid "Accurate" -msgstr "" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61 -msgid "Balanced" -msgstr "" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:62 -msgid "Quick" -msgstr "" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:140 msgid "Importing SLA archive" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:158 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:77 msgid "" "The SLA archive doesn't contain any presets. Please activate some SLA " "printer preset first before importing that SLA archive." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:164 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:81 +msgid "Import is unavailable for this archive format." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:86 msgid "Importing canceled." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:165 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:87 msgid "Importing done." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:187 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:108 msgid "The file does not exist." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:221 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135 msgid "" "The imported SLA archive did not contain any presets. The current SLA " "presets were used as fallback." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:234 src/slic3r/GUI/Plater.cpp:2458 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:148 src/slic3r/GUI/Plater.cpp:2535 msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "" "배드에 여러 부분으로 구성된 객체가 있는 SLA 프로젝트를 로드할 수 없습니다." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:236 src/slic3r/GUI/Plater.cpp:2460 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:150 src/slic3r/GUI/Plater.cpp:2537 msgid "Attention!" msgstr "주목!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:166 +msgid "The profile in the imported archive is corrupt and will not be loaded." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:178 +msgid "" +"No object could be retrieved from the archive. The slices might be corrupted " +"or missing." +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1184 msgid "Keyboard Shortcuts" msgstr "키보드 단축기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:77 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:86 msgid "New project, clear plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:78 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 msgid "Open project AMF/3MF with config, clear plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 msgid "Save project (3mf)" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 msgid "Save project as (3mf)" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:81 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 msgid "(Re)slice" msgstr "(Re)슬라이스" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:83 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:92 msgid "Import STL/3MF/STEP/OBJ/AMF without config, keep plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:84 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 msgid "Import Config from ini/amf/3mf/gcode" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:85 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6543 src/libslic3r/PrintConfig.cpp:4423 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:96 src/slic3r/GUI/Plater.cpp:948 +#: src/slic3r/GUI/Plater.cpp:7161 src/libslic3r/PrintConfig.cpp:4575 msgid "Export G-code" msgstr "G-code 내보내기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:97 src/slic3r/GUI/Plater.cpp:7162 msgid "Send G-code" msgstr "G-code 보내기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 msgid "Export config" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 src/slic3r/GUI/Plater.cpp:896 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 src/slic3r/GUI/Plater.cpp:931 msgid "Export to SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:91 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 msgid "Eject SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 msgid "Select all objects" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 msgid "Deselect all" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:95 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 msgid "Delete selected" msgstr "선택 삭제" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 -msgid "Copy to clipboard" -msgstr "클립보드로 복사" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 msgid "Paste from clipboard" msgstr "클립보드에서 붙여넣기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Reload plater from disk" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 msgid "Select Plater Tab" msgstr "선택 및 플래이터 탭" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 msgid "Select Print Settings Tab" msgstr "인쇄 설정을 선택 합니다" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 msgid "Select Filament Settings Tab" msgstr "필라멘트 설정을 선택" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 msgid "Select Printer Settings Tab" msgstr "프린터 설정을 선택 합니다" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 msgid "Switch to 3D" msgstr "3D로 전환" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 msgid "Switch to Preview" msgstr "미리 보기로 전환" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 -#: src/slic3r/GUI/PrintHostDialogs.cpp:217 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +#: src/slic3r/GUI/PrintHostDialogs.cpp:267 msgid "Print host upload queue" msgstr "프린터 호스트 업로드 대기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/MainFrame.cpp:75 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 src/slic3r/GUI/MainFrame.cpp:77 msgid "Open new instance" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 msgid "Camera view" msgstr "카메라 뷰" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 msgid "Show/Hide object/instance labels" msgstr "개체/인스턴스 레이블 표시/숨기기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Preferences.cpp:46 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Preferences.cpp:57 +#: src/slic3r/GUI/Preferences.cpp:165 src/slic3r/GUI/Preferences.cpp:188 +#: src/slic3r/GUI/Preferences.cpp:207 src/slic3r/GUI/Preferences.cpp:215 msgid "Preferences" msgstr "기본 설정" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 msgid "Show keyboard shortcuts list" msgstr "단축 키 목록 표시" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 msgid "Commands" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 msgid "Add Instance of the selected object" msgstr "선택한 객체(object)의 복제본 추가" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Remove Instance of the selected object" msgstr "선택한 객체(object)의 복제본 제거" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 msgid "" "Press to select multiple objects\n" "or move multiple objects with mouse" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 msgid "Press to activate selection rectangle" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 msgid "Press to activate deselection rectangle" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Arrow Up" msgstr "위쪽 화살표" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 msgid "Move selection 10 mm in positive Y direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Arrow Down" msgstr "아래쪽 화살표" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 msgid "Move selection 10 mm in negative Y direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Arrow Left" msgstr "왼쪽 화살표" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 msgid "Move selection 10 mm in negative X direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Arrow Right" msgstr "오른쪽 화살표" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 msgid "Move selection 10 mm in positive X direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Any arrow" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 msgid "Movement step set to 1 mm" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Movement in camera space" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Page Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Rotate selection 45 degrees CCW" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Page Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Rotate selection 45 degrees CW" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 msgid "Gizmo move" msgstr "개체(Gizmo) 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 msgid "Gizmo scale" msgstr "개체(Gizmo) 배율" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Gizmo rotate" msgstr "개체(Gizmo) 회전" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Gizmo cut" msgstr "개체(Gizmo) 자르기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 msgid "Gizmo Place face on bed" msgstr "개체(Gizmo)를 배드위로" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 msgid "Gizmo SLA hollow" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 msgid "Gizmo SLA support points" msgstr "SLA 개체(Gizmo) 서포트 지점들" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 msgid "Gizmo FDM paint-on supports" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 msgid "Gizmo FDM paint-on seam" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 msgid "Gizmo Multi Material painting" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +msgid "Gizmo Text emboss / engrave" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 msgid "Unselect gizmo or clear selection" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 msgid "Change camera type (perspective, orthographic)" msgstr "카메라 유형 변경(원근, 직교)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 msgid "Zoom to Bed" msgstr "배드 확대" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 msgid "" "Zoom to selected object\n" "or all objects in scene, if none selected" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 msgid "Zoom in" msgstr "확대" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Zoom out" msgstr "축소" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Switch between Editor/Preview" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Collapse/Expand the sidebar" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "3Dconnexion 장치 설정 대화 상자 표시/숨기기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 msgid "Minimize application" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 src/slic3r/GUI/MainFrame.cpp:284 -#: src/slic3r/GUI/MainFrame.cpp:333 src/slic3r/GUI/MainFrame.cpp:445 -#: src/slic3r/GUI/MainFrame.cpp:448 src/slic3r/GUI/MainFrame.cpp:470 -#: src/slic3r/GUI/MainFrame.cpp:473 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 src/slic3r/GUI/MainFrame.cpp:329 +#: src/slic3r/GUI/MainFrame.cpp:378 src/slic3r/GUI/MainFrame.cpp:490 +#: src/slic3r/GUI/MainFrame.cpp:493 src/slic3r/GUI/MainFrame.cpp:515 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Plater" msgstr "플레이터" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 msgid "Gizmo move: Press to snap by 1mm" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 msgid "Gizmo scale: Press to snap by 5%" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 msgid "Gizmo scale: Scale selection to fit print volume" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 msgid "Gizmo scale: Press to activate one direction scaling" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 msgid "Gizmo scale: Press to scale selected objects around their own center" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 msgid "Gizmo rotate: Press to rotate selected objects around their own center" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "Gizmos" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "" "The following shortcuts are applicable when the specified gizmo is active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 msgid "Set selected items as Printable/Unprintable" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:203 msgid "Set default extruder for the selected items" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 msgid "Set extruder number for the selected items" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 msgid "Objects List" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/MainFrame.cpp:1611 msgid "Open a G-code file" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 -#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 -#: src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 src/slic3r/GUI/MainFrame.cpp:1443 +#: src/slic3r/GUI/MainFrame.cpp:1447 src/slic3r/GUI/MainFrame.cpp:1616 +#: src/slic3r/GUI/MainFrame.cpp:1620 msgid "Reload the plater from disk" msgstr "디스크에서 플래터 다시 로드" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 msgid "Vertical slider - Move active thumb Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:228 msgid "Vertical slider - Move active thumb Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 msgid "Horizontal slider - Move active thumb Left" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 msgid "Horizontal slider - Move active thumb Right" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:231 msgid "On/Off one layer mode of the vertical slider" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 -msgid "Show/Hide Legend and Estimated printing time" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:232 +msgid "Show/Hide legend" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 msgid "Show/Hide G-code window" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4480 -#: src/slic3r/GUI/Tab.cpp:2832 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 src/slic3r/GUI/Plater.cpp:4562 +#: src/slic3r/GUI/Tab.cpp:2736 msgid "Preview" msgstr "미리보기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 msgid "Move active thumb Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 msgid "Move active thumb Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 msgid "Set upper thumb as active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 msgid "Set lower thumb as active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 msgid "Add color change marker for current layer" msgstr "현재 레이어의 색상을 변경할 마커 추가" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:238 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:244 msgid "Delete color change marker for current layer" msgstr "현재 레이어의 색상을 변경할 마커 삭제" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:250 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:251 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:245 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:256 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:257 msgid "" "Press to speed up 5 times while moving thumb\n" "with arrow keys or mouse wheel" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "Vertical Slider" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "" "The following shortcuts are applicable in G-code preview when the vertical " "slider is active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Move active thumb Left" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Move active thumb Right" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Set left thumb as active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Set right thumb as active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "Horizontal Slider" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "" "The following shortcuts are applicable in G-code preview when the horizontal " "slider is active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:278 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:284 msgid "Keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:77 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open a new PrusaSlicer instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:93 msgid "G-code preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:1388 msgid "Open G-code viewer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:91 src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open PrusaSlicer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:93 msgid "Open new G-code viewer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:225 +#: src/slic3r/GUI/MainFrame.cpp:227 msgid "Closing PrusaSlicer. Current project is modified." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "PrusaSlicer is closing" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "Closing PrusaSlicer while some presets are modified." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:285 src/slic3r/GUI/MainFrame.cpp:335 -#: src/slic3r/GUI/Tab.hpp:427 src/slic3r/GUI/Tab.hpp:550 +#: src/slic3r/GUI/MainFrame.cpp:330 src/slic3r/GUI/MainFrame.cpp:380 +#: src/slic3r/GUI/Tab.hpp:413 src/slic3r/GUI/Tab.hpp:539 msgid "Print Settings" msgstr "출력 설정" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:535 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:384 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:520 msgid "Material Settings" msgstr "재질 설정" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:461 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:382 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:448 msgid "Filament Settings" msgstr "필라멘트 설정" -#: src/slic3r/GUI/MainFrame.cpp:287 src/slic3r/GUI/MainFrame.cpp:341 -#: src/slic3r/GUI/Tab.hpp:503 +#: src/slic3r/GUI/MainFrame.cpp:332 src/slic3r/GUI/MainFrame.cpp:386 +#: src/slic3r/GUI/Tab.hpp:488 msgid "Printer Settings" msgstr "프린터 설정" -#: src/slic3r/GUI/MainFrame.cpp:632 src/slic3r/GUI/Plater.cpp:1719 -#: src/slic3r/GUI/Plater.cpp:2850 +#: src/slic3r/GUI/MainFrame.cpp:685 src/slic3r/GUI/Plater.cpp:1728 +#: src/slic3r/GUI/Plater.cpp:2879 msgid "Untitled" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:655 +#: src/slic3r/GUI/MainFrame.cpp:710 msgid "based on Slic3r" msgstr "Slic3r 기반" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Prusa 3D &Drivers" msgstr "푸르사 3D 드라이버" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Open the Prusa3D drivers download page in your browser" msgstr "브라우저에서 Prusa3D 드라이버 다운로드 페이지를 엽니다" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Software &Releases" msgstr "소프트웨어 &자료" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open the software releases page in your browser" msgstr "브라우저에서 소프트웨어 정보 페이지 열기" -#: src/slic3r/GUI/MainFrame.cpp:1081 +#: src/slic3r/GUI/MainFrame.cpp:1158 #, c-format, boost-format msgid "%s &Website" msgstr "%s &웹사이트" -#: src/slic3r/GUI/MainFrame.cpp:1082 +#: src/slic3r/GUI/MainFrame.cpp:1159 #, c-format, boost-format msgid "Open the %s website in your browser" msgstr "%s 웹사이트를 브라우저에서 열기" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "System &Info" msgstr "시스템 정보" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "Show system information" msgstr "시스템 정보 표시" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show &Configuration Folder" msgstr "폴더 표시 및 구성" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show user configuration folder (datadir)" msgstr "사용자 구성 폴더를 표시 (datadir)" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "Report an I&ssue" msgstr "문제를 보고" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 #, c-format, boost-format msgid "Report an issue on %s" msgstr "%s에 문제 보고" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 #, c-format, boost-format msgid "&About %s" msgstr "%s 에 대하여" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 msgid "Show about dialog" msgstr "다이얼로그 표시" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1177 msgid "Show Tip of the Day" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1104 +#: src/slic3r/GUI/MainFrame.cpp:1181 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/MainFrame.cpp:1184 msgid "Show the list of the keyboard shortcuts" msgstr "키보드 단축키 목록 표시" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso" msgstr "기본 " -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso View" msgstr "표준 보기" #. TRN To be shown in the main menu View->Top #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2917 -#: src/libslic3r/PrintConfig.cpp:2926 +#: src/slic3r/GUI/MainFrame.cpp:1202 src/libslic3r/PrintConfig.cpp:3005 +#: src/libslic3r/PrintConfig.cpp:3014 msgid "Top" msgstr "윗부분 " -#: src/slic3r/GUI/MainFrame.cpp:1125 +#: src/slic3r/GUI/MainFrame.cpp:1202 msgid "Top View" msgstr "위에서 보기" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:446 -#: src/libslic3r/PrintConfig.cpp:455 +#: src/slic3r/GUI/MainFrame.cpp:1205 src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:474 msgid "Bottom" msgstr "바닥 " -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1205 msgid "Bottom View" msgstr "바닥 보기" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front" msgstr "앞 " -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front View" msgstr "앞면 보기 " -#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2274 +#: src/slic3r/GUI/MainFrame.cpp:1209 src/libslic3r/PrintConfig.cpp:2300 msgid "Rear" msgstr "뒷면 " -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1209 msgid "Rear View" msgstr "뒷면 보기" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left" msgstr "왼쪽 " -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left View" msgstr "왼쪽 보기" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right" msgstr "오른쪽 " -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right View" msgstr "오른쪽 보기" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "&New Project" msgstr "&새로운 프로젝트" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "Start a new project" msgstr "새로운 프로젝트 시작" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "&Open Project" msgstr "&프로젝트 열기" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "Open a project file" msgstr "프로젝트 파일 열기" -#: src/slic3r/GUI/MainFrame.cpp:1157 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Recent projects" msgstr "최근 프로젝트" -#: src/slic3r/GUI/MainFrame.cpp:1169 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Save Project" msgstr "프로젝트 저장" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "Save current project file" msgstr "현재 프로젝트 파일 저장" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save Project &as" msgstr "프로젝트 저장" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save current project file as" msgstr "현재 프로젝트 파일을 다른 이름으로 저장" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Import STL/3MF/STEP/OBJ/AM&F" msgstr "가져오기 STL/3MF/STEP/OBJ/AM&F" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Load a model" msgstr "모델 로드" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Import STL (Imperial Units)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Load an model saved with imperial units" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Import SL1 / SL1S Archive" +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Import SLA Archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Load an SLA archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Import ZIP Achive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Load an SL1 / Sl1S archive" +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Load a zip achive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Import &Config" msgstr "&구성 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Load exported configuration file" msgstr "내 보낸 구성 파일로드" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Import Config from &Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Load configuration from project file" msgstr "프로젝트 파일에서 구성 로드" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Import Config &Bundle" msgstr "번들 &설정 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Load presets from a bundle" msgstr "미리 설정 번들값 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1231 +#: src/slic3r/GUI/MainFrame.cpp:1311 msgid "&Import" msgstr "&가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1314 src/slic3r/GUI/MainFrame.cpp:1676 msgid "Export &G-code" msgstr "G-code 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1314 msgid "Export current plate as G-code" msgstr "현재 플레이터를 G 코드로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1318 src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end G-code" msgstr "S&엔드 G- 코드" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1318 msgid "Send to print current plate as G-code" msgstr "현재 플레이트를 G 코드로 인쇄하기 위해 보내기" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export G-code to SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export Plate as &STL" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export Plate as &STL/OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export current plate as STL" -msgstr "현재 플레이터를 STL로 내보내기" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export current plate as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export Plate as STL &Including Supports" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export Plate as STL/OBJ &Including Supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export current plate as STL including supports" -msgstr "서포트를 포함 하여 현재 플레이터를 STL로 내보내기" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export current plate as STL/OBJ including supports" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export &Toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export toolpaths as OBJ" msgstr "도구 경로를 OBJ로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export &Config" msgstr "&구성 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export current configuration to file" msgstr "현재 구성을 파일로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export Config &Bundle" msgstr "번들 & 내보내기 설정" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export all presets to file" msgstr "모든 이전 설정을 파일로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export Config Bundle With Physical Printers" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export all presets including physical printers to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1270 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "&Export" msgstr "&내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Ejec&t SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Quick Slice" msgstr "빠른 슬라이스" -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Slice a file into a G-code" msgstr "파일을 G 코드로 분할" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Quick Slice and Save As" msgstr "빠른 슬라이스 및 다른 이름으로 저장" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Slice a file into a G-code, save as" msgstr "파일을 G 코드로 분할하고 다른 이름으로 저장" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat Last Quick Slice" msgstr "마지막으로 빠른 슬라이스 반복" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat last quick slice" msgstr "마지막으로 빠른 슬라이스 반복" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "(Re)Slice No&w" msgstr "지금(다시)자르기" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "Start new slicing process" msgstr "새로운 슬라이싱 작업 시작" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "&Repair STL file" msgstr "STL 파일 복구" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "Automatically repair an STL file" msgstr "STL 파일을 자동으로 복구합니다" -#: src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:1388 msgid "&G-code Preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1392 +msgid "E&xit" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1392 src/slic3r/GUI/UpdateDialogs.cpp:376 +#: src/slic3r/GUI/UpdateDialogs.cpp:423 +#, c-format, boost-format +msgid "Exit %s" +msgstr "%s 종료" + +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 msgid "&Quit" msgstr "&종료" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 #, c-format, boost-format msgid "Quit %s" msgstr "%s 종료" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1410 msgid "&Select All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1327 +#: src/slic3r/GUI/MainFrame.cpp:1411 msgid "Selects all objects" msgstr "모든 객체(object)를 선택 합니다" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1413 msgid "D&eselect All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1414 msgid "Deselects all objects" msgstr "모든 객체(object) 선택 취소" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1417 msgid "&Delete Selected" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1334 +#: src/slic3r/GUI/MainFrame.cpp:1418 msgid "Deletes the current selection" msgstr "현재 선택 영역을 삭제 합니다" -#: src/slic3r/GUI/MainFrame.cpp:1336 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Delete &All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1421 msgid "Deletes all objects" msgstr "모든 객체(object)를 삭제 합니다" -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1425 msgid "&Undo" msgstr "&되돌리기" -#: src/slic3r/GUI/MainFrame.cpp:1344 +#: src/slic3r/GUI/MainFrame.cpp:1428 msgid "&Redo" msgstr "&앞으로" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1433 msgid "&Copy" msgstr "&복사 " -#: src/slic3r/GUI/MainFrame.cpp:1350 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Copy selection to clipboard" msgstr "선택영역을 클립보드로 복사합니다" -#: src/slic3r/GUI/MainFrame.cpp:1352 +#: src/slic3r/GUI/MainFrame.cpp:1436 msgid "&Paste" msgstr "&붙이기 " -#: src/slic3r/GUI/MainFrame.cpp:1353 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "Paste clipboard" msgstr "클립보드 붙여넣기" -#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 -#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 +#: src/slic3r/GUI/MainFrame.cpp:1442 src/slic3r/GUI/MainFrame.cpp:1446 +#: src/slic3r/GUI/MainFrame.cpp:1615 src/slic3r/GUI/MainFrame.cpp:1619 msgid "Re&load from Disk" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1368 +#: src/slic3r/GUI/MainFrame.cpp:1452 msgid "Searc&h" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1369 +#: src/slic3r/GUI/MainFrame.cpp:1453 msgid "Search in settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "&Plater Tab" msgstr "&선택 및 플래이터 탭" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "Show the plater" msgstr "플레이터를 보기" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "P&rint Settings Tab" msgstr "프린트 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "Show the print settings" msgstr "인쇄 설정 표시" -#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1469 src/slic3r/GUI/MainFrame.cpp:1679 msgid "&Filament Settings Tab" msgstr "&필라멘트 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1469 msgid "Show the filament settings" msgstr "필라멘트 설정보기" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Print&er Settings Tab" msgstr "설정 인쇄 탭" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Show the printer settings" msgstr "간단한 설정보기" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "3&D" msgstr "3&D" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "Show the 3D editing view" msgstr "3D 편집용 보기 표시" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Pre&view" msgstr "미리 보기" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Show the 3D slices preview" msgstr "3D 슬라이스 미리 보기 표시" -#: src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/MainFrame.cpp:1488 msgid "Open the dialog to modify shape gallery" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Print &Host Upload Queue" msgstr "프린터 호스트 업로드 대기" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Display the Print Host Upload Queue window" msgstr "호스트 업로드 대기열 인쇄 창 표시" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open New Instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1424 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 +#: src/slic3r/GUI/MainFrame.cpp:1507 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1727 msgid "Compare Presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/MainFrame.cpp:1507 msgid "Compare presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show &Labels" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show object/instance labels in 3D scene" msgstr "3D 장면에서 오브젝트/인스턴스 레이블 표시" -#: src/slic3r/GUI/MainFrame.cpp:1437 +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show Legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show legend in preview" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1523 msgid "&Collapse Sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1523 src/slic3r/GUI/Plater.cpp:2347 msgid "Collapse sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "&Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1543 src/slic3r/GUI/MainFrame.cpp:1650 msgid "&File" msgstr "&파일" -#: src/slic3r/GUI/MainFrame.cpp:1458 +#: src/slic3r/GUI/MainFrame.cpp:1544 msgid "&Edit" msgstr "&수정" -#: src/slic3r/GUI/MainFrame.cpp:1459 +#: src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Window" msgstr "&윈도우" -#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 +#: src/slic3r/GUI/MainFrame.cpp:1546 src/slic3r/GUI/MainFrame.cpp:1651 msgid "&View" msgstr "&시점" -#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 +#: src/slic3r/GUI/MainFrame.cpp:1549 src/slic3r/GUI/MainFrame.cpp:1654 msgid "&Help" msgstr "&도움말" -#: src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/MainFrame.cpp:1611 msgid "&Open G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open &PrusaSlicer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legend" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1676 msgid "E&xport" msgstr "보내기" -#: src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end to print" msgstr "끝내고 프린트" -#: src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1679 msgid "Mate&rial Settings Tab" msgstr "재료(메터리리알) 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:1613 +#: src/slic3r/GUI/MainFrame.cpp:1703 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "슬라이스 할 파일을 선택하십시오 (STL / OBJ / AMF / 3MF / PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1625 +#: src/slic3r/GUI/MainFrame.cpp:1715 msgid "No previously sliced file." msgstr "이전에 분리 된 파일이 없습니다." -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid "Previously sliced file (" msgstr "이전에 분리 된 파일 (" -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid ") not found." msgstr ")을 찾을 수 없습니다." -#: src/slic3r/GUI/MainFrame.cpp:1633 +#: src/slic3r/GUI/MainFrame.cpp:1723 msgid "File Not Found" msgstr "파일을 찾을수 없다" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 #, c-format, boost-format msgid "Save %s file as:" msgstr "%s 파일을 저장 합니다:" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "SVG" msgstr "Svg" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "G-code" msgstr "G 코드" -#: src/slic3r/GUI/MainFrame.cpp:1680 +#: src/slic3r/GUI/MainFrame.cpp:1770 msgid "Save zip file as:" msgstr "압축(zip)파일 다른이름 저장:" -#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6064 src/slic3r/GUI/Tab.cpp:1666 -#: src/slic3r/GUI/Tab.cpp:4730 +#: src/slic3r/GUI/MainFrame.cpp:1779 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6654 src/slic3r/GUI/Tab.cpp:1628 +#: src/slic3r/GUI/Tab.cpp:4986 msgid "Slicing" msgstr "슬라이싱" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1691 +#: src/slic3r/GUI/MainFrame.cpp:1781 #, c-format, boost-format msgid "Processing %s" msgstr "처리 %s" -#: src/slic3r/GUI/MainFrame.cpp:1714 +#: src/slic3r/GUI/MainFrame.cpp:1804 #, boost-format msgid "%1% was successfully sliced." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1717 +#: src/slic3r/GUI/MainFrame.cpp:1807 msgid "Slicing Done!" msgstr "슬라이스 완료!" -#: src/slic3r/GUI/MainFrame.cpp:1733 +#: src/slic3r/GUI/MainFrame.cpp:1823 msgid "Select the STL file to repair:" msgstr "복구 할 STL 파일을 선택하십시오:" -#: src/slic3r/GUI/MainFrame.cpp:1743 +#: src/slic3r/GUI/MainFrame.cpp:1833 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "OBJ 파일을 저장하십시오 (STL보다 오류를 덜 조정할 가능성이 적음):" -#: src/slic3r/GUI/MainFrame.cpp:1754 +#: src/slic3r/GUI/MainFrame.cpp:1844 msgid "Your file was repaired." msgstr "파일이 복구되었습니다." -#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4528 +#: src/slic3r/GUI/MainFrame.cpp:1844 src/libslic3r/PrintConfig.cpp:4694 msgid "Repair" msgstr "수정" -#: src/slic3r/GUI/MainFrame.cpp:1768 +#: src/slic3r/GUI/MainFrame.cpp:1858 msgid "Save configuration as:" msgstr "구성을 저장 :" -#: src/slic3r/GUI/MainFrame.cpp:1785 +#: src/slic3r/GUI/MainFrame.cpp:1875 msgid "Loading of a configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 +#: src/slic3r/GUI/MainFrame.cpp:1877 src/slic3r/GUI/MainFrame.cpp:1944 msgid "Select configuration to load:" msgstr "불러올 구성 선택 :" -#: src/slic3r/GUI/MainFrame.cpp:1816 +#: src/slic3r/GUI/MainFrame.cpp:1908 msgid "Exporting configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1817 +#: src/slic3r/GUI/MainFrame.cpp:1909 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1826 +#: src/slic3r/GUI/MainFrame.cpp:1918 msgid "Save presets bundle as:" msgstr "이전 번들 설정을 다음과 같이 저장 :" -#: src/slic3r/GUI/MainFrame.cpp:1849 +#: src/slic3r/GUI/MainFrame.cpp:1941 msgid "Loading of a configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1879 +#: src/slic3r/GUI/MainFrame.cpp:1971 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "% d 사전 설정을 가져 왔습니다." @@ -6200,164 +7529,206 @@ msgstr "" msgid "%s information" msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:752 +#: src/slic3r/GUI/NotificationManager.hpp:899 msgid "3D Mouse disconnected." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "Configuration update is available." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "See more." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:761 +#: src/slic3r/GUI/NotificationManager.hpp:908 msgid "" "You have just added a G-code for color change, but its value is empty.\n" "To export the G-code correctly, check the \"Color Change G-code\" in " "\"Printer Settings > Custom G-code\"" msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:764 +#: src/slic3r/GUI/NotificationManager.hpp:911 msgid "" "No color change event was added to the print. The print does not look like a " "sign." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:766 +#: src/slic3r/GUI/NotificationManager.hpp:913 msgid "Desktop integration was successful." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:768 +#: src/slic3r/GUI/NotificationManager.hpp:915 msgid "Desktop integration failed." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:770 +#: src/slic3r/GUI/NotificationManager.hpp:917 msgid "Undo desktop integration was successful." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:772 +#: src/slic3r/GUI/NotificationManager.hpp:919 msgid "Undo desktop integration failed." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:773 +#: src/slic3r/GUI/NotificationManager.hpp:920 msgid "Exporting." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:664 +#: src/slic3r/GUI/NotificationManager.hpp:924 +msgid "" +"PrusaSlicer recieved a download request from Printables.com, but it's not " +"allowed. You can allow it" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:925 +msgid "here." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:773 msgid "Open Folder." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:701 +#: src/slic3r/GUI/NotificationManager.cpp:811 msgid "Eject drive" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:885 +#: src/slic3r/GUI/NotificationManager.cpp:1054 +#: src/slic3r/GUI/NotificationManager.cpp:1267 +#: src/slic3r/GUI/NotificationManager.cpp:1472 msgid "ERROR" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:890 -msgid "CANCELED" +#: src/slic3r/GUI/NotificationManager.cpp:1269 +#: src/slic3r/GUI/NotificationManager.cpp:1377 +msgid "COMPLETED" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:895 -msgid "COMPLETED" +#: src/slic3r/GUI/NotificationManager.cpp:1467 +msgid "RESOLVING ADDRESS" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:1477 +msgid "CANCELED" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:937 +#: src/slic3r/GUI/NotificationManager.cpp:1539 msgid "Cancel upload" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:996 +#: src/slic3r/GUI/NotificationManager.cpp:1648 #, c-format, boost-format msgid "%1$d object was loaded with custom supports." msgid_plural "%1$d objects were loaded with custom supports." msgstr[0] "" -#: src/slic3r/GUI/NotificationManager.cpp:997 +#: src/slic3r/GUI/NotificationManager.cpp:1649 #, c-format, boost-format msgid "%1$d object was loaded with custom seam." msgid_plural "%1$d objects were loaded with custom seam." msgstr[0] "" -#: src/slic3r/GUI/NotificationManager.cpp:998 +#: src/slic3r/GUI/NotificationManager.cpp:1650 #, c-format, boost-format msgid "%1$d object was loaded with multimaterial painting." msgid_plural "%1$d objects were loaded with multimaterial painting." msgstr[0] "" -#: src/slic3r/GUI/NotificationManager.cpp:999 +#: src/slic3r/GUI/NotificationManager.cpp:1651 #, c-format, boost-format msgid "%1$d object was loaded with variable layer height." msgid_plural "%1$d objects were loaded with variable layer height." msgstr[0] "" -#: src/slic3r/GUI/NotificationManager.cpp:1000 +#: src/slic3r/GUI/NotificationManager.cpp:1652 #, c-format, boost-format msgid "%1$d object was loaded with partial sinking." msgid_plural "%1$d objects were loaded with partial sinking." msgstr[0] "" -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1653 +#, c-format, boost-format +msgid "%1$d object was loaded as a part of cut object." +msgid_plural "%1$d objects were loaded as parts of cut object" +msgstr[0] "" + +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Slicing finished." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export G-Code." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1447 -#: src/slic3r/GUI/NotificationManager.cpp:1454 -#: src/slic3r/GUI/NotificationManager.cpp:1470 -#: src/slic3r/GUI/NotificationManager.cpp:1476 -#: src/slic3r/GUI/NotificationManager.cpp:1547 +#: src/slic3r/GUI/NotificationManager.cpp:2101 +#: src/slic3r/GUI/NotificationManager.cpp:2108 +#: src/slic3r/GUI/NotificationManager.cpp:2124 +#: src/slic3r/GUI/NotificationManager.cpp:2130 +#: src/slic3r/GUI/NotificationManager.cpp:2201 msgid "ERROR:" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1459 -#: src/slic3r/GUI/NotificationManager.cpp:1486 -#: src/slic3r/GUI/NotificationManager.cpp:1494 -#: src/slic3r/GUI/NotificationManager.cpp:1505 src/slic3r/GUI/Plater.cpp:3197 +#: src/slic3r/GUI/NotificationManager.cpp:2113 +#: src/slic3r/GUI/NotificationManager.cpp:2140 +#: src/slic3r/GUI/NotificationManager.cpp:2148 +#: src/slic3r/GUI/NotificationManager.cpp:2159 src/slic3r/GUI/Plater.cpp:3220 msgid "WARNING:" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1598 +#: src/slic3r/GUI/NotificationManager.cpp:2275 msgid "Exporting finished." msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:50 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 msgid "Paint-on seam" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:52 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:68 +msgid "Cut connectors" +msgstr "" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:70 msgid "Sinking" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:110 msgid "Instances" msgstr "복제본" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:98 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:266 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:114 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:275 #, c-format, boost-format msgid "Instance %d" msgstr "복제본 %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4568 -#: src/slic3r/GUI/Tab.cpp:4659 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:121 src/slic3r/GUI/Tab.cpp:4805 +#: src/slic3r/GUI/Tab.cpp:4942 msgid "Layers" msgstr "레이어" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 msgid "Range" msgstr "범위" -#: src/slic3r/GUI/OpenGLManager.cpp:258 +#: src/slic3r/GUI/OpenGLManager.cpp:376 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL ES 2.0 capable graphics driver to run " +"correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:379 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL %s capable graphics driver to run correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:382 #, c-format, boost-format msgid "" "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" @@ -6367,37 +7738,41 @@ msgstr "" "다. \n" "OpenGL 버전 %s, 렌더링 %s 동안, 공급 업체 %s가 감지되었습니다." -#: src/slic3r/GUI/OpenGLManager.cpp:261 +#: src/slic3r/GUI/OpenGLManager.cpp:386 msgid "You may need to update your graphics card driver." msgstr "그래픽 카드 드라이버를 업데이트해야 할 수 있습니다." -#: src/slic3r/GUI/OpenGLManager.cpp:264 +#: src/slic3r/GUI/OpenGLManager.cpp:389 msgid "" "As a workaround, you may run PrusaSlicer with a software rendered 3D " "graphics by running prusa-slicer.exe with the --sw-renderer parameter." msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:266 +#: src/slic3r/GUI/OpenGLManager.cpp:391 msgid "Unsupported OpenGL version" msgstr "지원되지 않는 OpenGL 버전" -#: src/slic3r/GUI/OpenGLManager.cpp:274 +#: src/slic3r/GUI/OpenGLManager.cpp:399 #, c-format, boost-format msgid "" "Unable to load the following shaders:\n" "%s" msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:275 +#: src/slic3r/GUI/OpenGLManager.cpp:400 msgid "Error loading shaders" msgstr "" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:126 +msgid "Unavailable for this method." +msgstr "" + +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Top" msgstr "윗부분 " -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Bottom" msgstr "바닥 " @@ -6406,7 +7781,7 @@ msgstr "바닥 " msgid "Delete this preset from this printer device" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:83 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:84 msgid "This printer will be shown in the presets list as" msgstr "" @@ -6422,31 +7797,31 @@ msgstr "" msgid "Add preset for this printer device" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2255 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2239 msgid "Print Host upload" msgstr "호스트 업로드 인쇄" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:268 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:271 msgid "Connection to printers connected via the print host failed." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:310 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:313 msgid "Test" msgstr "시험(test)" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:315 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:318 msgid "Could not get a valid Printer Host reference" msgstr "유효한 프린터 호스트 참조를 가져올 수 없습니다" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:330 msgid "Success!" msgstr "성공!" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:337 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:340 msgid "Refresh Printers" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:367 msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." @@ -6454,27 +7829,27 @@ msgstr "" "HTTPS CA 파일은 선택 사항입니다. 자체 서명 된 인증서로 HTTPS를 사용하는 경우" "에만 필요합니다." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:374 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:377 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "인증서 파일 (* .crt, * .pem) | * .crt; * .pem | 모든 파일 | *. *" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:378 msgid "Open CA certificate file" msgstr "CA 인증서 파일 열기" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:404 -#: src/libslic3r/PrintConfig.cpp:330 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:407 +#: src/libslic3r/PrintConfig.cpp:343 msgid "HTTPS CA File" msgstr "HTTPS CA 파일" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:405 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:408 #, c-format, boost-format msgid "" "On this system, %s uses HTTPS certificates from the system Certificate Store " "or Keychain." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:406 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:409 msgid "" "To use a custom CA file, please import your CA file into Certificate Store / " "Keychain." @@ -6482,24 +7857,24 @@ msgstr "" "사용자 지정 CA 파일을 사용 하려면 CA 파일을 인증서 저장소/키체인에 가져오십시" "오." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:634 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:706 msgid "The supplied name is empty. It can't be saved." msgstr "파일 이름이 비어 있습니다. 저장할 수 없습니다." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:638 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:710 msgid "You have to enter a printer name." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:646 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:718 #, boost-format msgid "Printer with name \"%1%\" already exists." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:647 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:719 msgid "Replace?" msgstr "교체?" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:674 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:746 #, boost-format msgid "" "Following printer preset is duplicated:%1%The above preset for printer \"%2%" @@ -6509,227 +7884,224 @@ msgid_plural "" "\"%2%\" will be used just once." msgstr[0] "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:724 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:796 msgid "It's not possible to delete the last related preset for the printer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:141 +#: src/slic3r/GUI/Plater.cpp:158 msgid "The provided name is not valid;" msgstr "" -#: src/slic3r/GUI/Plater.cpp:142 src/slic3r/GUI/SavePresetDialog.cpp:102 +#: src/slic3r/GUI/Plater.cpp:159 src/slic3r/GUI/SavePresetDialog.cpp:166 msgid "the following characters are not allowed:" msgstr "다음 문자는 허용되지 않습니다:" -#: src/slic3r/GUI/Plater.cpp:207 +#: src/slic3r/GUI/Plater.cpp:223 msgid "" "For a multipart object, this value isn't accurate.\n" "It doesn't take account of intersections and negative volumes." msgstr "" -#: src/slic3r/GUI/Plater.cpp:211 +#: src/slic3r/GUI/Plater.cpp:227 msgid "Volume" msgstr "크기" -#: src/slic3r/GUI/Plater.cpp:213 +#: src/slic3r/GUI/Plater.cpp:229 msgid "Facets" msgstr "측면" -#: src/slic3r/GUI/Plater.cpp:276 +#: src/slic3r/GUI/Plater.cpp:286 msgid "Sliced Info" msgstr "슬라이스된 정보" -#: src/slic3r/GUI/Plater.cpp:296 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:306 src/slic3r/GUI/Plater.cpp:1414 msgid "Used Filament (g)" msgstr "사용자 필라멘트 (g)" -#: src/slic3r/GUI/Plater.cpp:297 src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:307 src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (m)" msgstr "사용자 필라멘트 (m)" -#: src/slic3r/GUI/Plater.cpp:298 src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:308 src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (mm³)" msgstr "사용자 필라멘트 (mm³)" -#: src/slic3r/GUI/Plater.cpp:299 +#: src/slic3r/GUI/Plater.cpp:309 msgid "Used Material (unit)" msgstr "사용 재료 (단위)" -#: src/slic3r/GUI/Plater.cpp:300 +#: src/slic3r/GUI/Plater.cpp:310 msgid "Cost (money)" msgstr "비용 (돈)" -#: src/slic3r/GUI/Plater.cpp:301 src/slic3r/GUI/Plater.cpp:1340 -#: src/slic3r/GUI/Plater.cpp:1427 +#: src/slic3r/GUI/Plater.cpp:311 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:1464 msgid "Estimated printing time" msgstr "예상 인쇄 시간" -#: src/slic3r/GUI/Plater.cpp:302 +#: src/slic3r/GUI/Plater.cpp:312 msgid "Number of tool changes" msgstr "공구(tool) 변경 수" -#: src/slic3r/GUI/Plater.cpp:431 +#: src/slic3r/GUI/Plater.cpp:437 msgid "Select what kind of support do you need" msgstr "서포트의 종류를 선택하세요" -#: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2590 -#: src/libslic3r/PrintConfig.cpp:3645 +#: src/slic3r/GUI/Plater.cpp:440 src/libslic3r/PrintConfig.cpp:2620 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "Support on build plate only" msgstr "출력물만 서포트를 지지" -#: src/slic3r/GUI/Plater.cpp:434 src/slic3r/GUI/Plater.cpp:564 +#: src/slic3r/GUI/Plater.cpp:441 msgid "For support enforcers only" msgstr "서포트 지원영역 전용" -#: src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Plater.cpp:442 msgid "Everywhere" msgstr "모든곳" -#: src/slic3r/GUI/Plater.cpp:467 src/slic3r/GUI/Tab.cpp:1542 +#: src/slic3r/GUI/Plater.cpp:475 src/slic3r/GUI/Tab.cpp:1489 msgid "Brim" msgstr "브림" -#: src/slic3r/GUI/Plater.cpp:469 +#: src/slic3r/GUI/Plater.cpp:477 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." msgstr "첫 번째 레이어의 각 객체(object) 주위에 인쇄 될 브림을 활성화합니다." -#: src/slic3r/GUI/Plater.cpp:477 +#: src/slic3r/GUI/Plater.cpp:485 msgid "Purging volumes" msgstr "퍼징 조절" -#: src/slic3r/GUI/Plater.cpp:578 +#: src/slic3r/GUI/Plater.cpp:592 msgid "Select what kind of pad do you need" msgstr "필요한 패드 종류를 선택하십시오." -#: src/slic3r/GUI/Plater.cpp:580 +#: src/slic3r/GUI/Plater.cpp:595 msgid "Below object" msgstr "개체 아래" -#: src/slic3r/GUI/Plater.cpp:581 +#: src/slic3r/GUI/Plater.cpp:596 msgid "Around object" msgstr "개체 주위" -#: src/slic3r/GUI/Plater.cpp:894 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/Plater.cpp:929 src/slic3r/GUI/Plater.cpp:7162 msgid "Send to printer" msgstr "프린터로 보내기" -#: src/slic3r/GUI/Plater.cpp:914 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6067 +#: src/slic3r/GUI/Plater.cpp:949 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6657 msgid "Slice now" msgstr "바로 슬라이스" -#: src/slic3r/GUI/Plater.cpp:1087 +#: src/slic3r/GUI/Plater.cpp:1127 msgid "Hold Shift to Slice & Export G-code" msgstr "Shift 키를 누른 채 G 코드 내보내기" -#: src/slic3r/GUI/Plater.cpp:1287 +#: src/slic3r/GUI/Plater.cpp:1324 #, boost-format msgid "%1% (%2$d shell)" msgid_plural "%1% (%2$d shells)" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:1315 +#: src/slic3r/GUI/Plater.cpp:1352 msgid "Used Material (ml)" msgstr "사용 재료 (ml)" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "object" msgid_plural "objects" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "supports and pad" msgstr "지지대 및 패드" -#: src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (in)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "objects" msgstr "객체들(objects)" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "wipe tower" msgstr "와이프 타워(Wipe tower)" -#: src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (in³)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1396 +#: src/slic3r/GUI/Plater.cpp:1433 #, boost-format msgid "Filament at extruder %1%" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1402 +#: src/slic3r/GUI/Plater.cpp:1439 msgid "(including spool)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1072 -#: src/libslic3r/PrintConfig.cpp:3439 src/libslic3r/PrintConfig.cpp:3440 +#: src/slic3r/GUI/Plater.cpp:1448 src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:3716 src/libslic3r/PrintConfig.cpp:3717 msgid "Cost" msgstr "비용" -#: src/slic3r/GUI/Plater.cpp:1429 +#: src/slic3r/GUI/Plater.cpp:1466 msgid "normal mode" msgstr "일반 모드" -#: src/slic3r/GUI/Plater.cpp:1436 +#: src/slic3r/GUI/Plater.cpp:1473 msgid "stealth mode" msgstr "스텔스 모드" -#: src/slic3r/GUI/Plater.cpp:1670 -msgid "Fill bed" +#: src/slic3r/GUI/Plater.cpp:1734 +#, boost-format +msgid "Do you want to save the changes to \"%1%\"?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1676 -msgid "Optimize Rotation" -msgstr "회전 최적화" - -#: src/slic3r/GUI/Plater.cpp:1682 -msgid "Import SLA archive" -msgstr "" +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:905 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1599 +msgid "Save" +msgstr "저장" -#: src/slic3r/GUI/Plater.cpp:1725 -#, boost-format -msgid "Do you want to save the changes to \"%1%\"?" +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +msgid "Discard" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1730 src/slic3r/GUI/Preferences.cpp:222 +#: src/slic3r/GUI/Plater.cpp:1740 src/slic3r/GUI/Preferences.cpp:354 msgid "Ask for unsaved changes in project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1733 +#: src/slic3r/GUI/Plater.cpp:1743 msgid "" "You will not be asked about it again, when: \n" "- Closing PrusaSlicer,\n" "- Loading or creating a new project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2198 +#: src/slic3r/GUI/Plater.cpp:2214 #, c-format, boost-format msgid "" "Successfully unmounted. The device %s(%s) can now be safely removed from the " "computer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2203 +#: src/slic3r/GUI/Plater.cpp:2220 #, c-format, boost-format msgid "Ejecting of device %s(%s) has failed." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2222 src/slic3r/GUI/Plater.cpp:5108 +#: src/slic3r/GUI/Plater.cpp:2239 src/slic3r/GUI/Plater.cpp:5199 msgid "New Project" msgstr "새로운 프로젝트" -#: src/slic3r/GUI/Plater.cpp:2319 +#: src/slic3r/GUI/Plater.cpp:2346 msgid "Expand sidebar" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2518 +#: src/slic3r/GUI/Plater.cpp:2428 msgid "" "The preset below was temporarily installed on the active instance of " "PrusaSlicer" @@ -6738,12 +8110,12 @@ msgid_plural "" "PrusaSlicer" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:2548 +#: src/slic3r/GUI/Plater.cpp:2583 #, boost-format msgid "Failed loading file \"%1%\" due to an invalid configuration." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2568 +#: src/slic3r/GUI/Plater.cpp:2603 #, c-format, boost-format msgid "" "Object size from file %s appears to be zero.\n" @@ -6753,11 +8125,11 @@ msgid_plural "" "These objects have been removed from the model" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:2572 +#: src/slic3r/GUI/Plater.cpp:2607 msgid "The size of the object is zero" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2585 +#: src/slic3r/GUI/Plater.cpp:2620 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in meters.\n" @@ -6769,15 +8141,15 @@ msgid_plural "" "the dimensions of these objects?" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:2589 src/slic3r/GUI/Plater.cpp:2611 +#: src/slic3r/GUI/Plater.cpp:2624 src/slic3r/GUI/Plater.cpp:2646 msgid "The object is too small" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2590 src/slic3r/GUI/Plater.cpp:2612 +#: src/slic3r/GUI/Plater.cpp:2625 src/slic3r/GUI/Plater.cpp:2647 msgid "Apply to all the remaining small objects being loaded." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2607 +#: src/slic3r/GUI/Plater.cpp:2642 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in inches.\n" @@ -6789,38 +8161,29 @@ msgid_plural "" "the dimensions of these objects?" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:2625 +#: src/slic3r/GUI/Plater.cpp:2659 msgid "" "This file contains several objects positioned at multiple heights.\n" "Instead of considering them as multiple objects, should \n" "the file be loaded as a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2628 src/slic3r/GUI/Plater.cpp:2683 +#: src/slic3r/GUI/Plater.cpp:2662 src/slic3r/GUI/Plater.cpp:2711 msgid "Multi-part object detected" msgstr "다중 부품(Part) 객체(object)가 감지" -#: src/slic3r/GUI/Plater.cpp:2636 +#: src/slic3r/GUI/Plater.cpp:2669 msgid "" "This file cannot be loaded in a simple mode. Do you want to switch to an " "advanced mode?" msgstr "" "이 파일은 기본 모드에서 로드할 수 없습니다. 고급 모드로 전환 하시겠습니까?" -#: src/slic3r/GUI/Plater.cpp:2637 +#: src/slic3r/GUI/Plater.cpp:2670 msgid "Detected advanced data" msgstr "감지된 고급 데이터" -#: src/slic3r/GUI/Plater.cpp:2657 -#, c-format, boost-format -msgid "" -"You can't to add the object(s) from %s because of one or some of them " -"is(are) multi-part" -msgstr "" -"다중 부품(Part) 하나 또는 그 중 일부 때문에 %s에서 객체(object)를 추가 할 수 " -"없습니다" - -#: src/slic3r/GUI/Plater.cpp:2680 +#: src/slic3r/GUI/Plater.cpp:2708 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" @@ -6830,145 +8193,161 @@ msgstr "" "여러 객체(object)로 간주하는 대신,\n" "이 파일들은 여러 부분을 갖는 단일 객체(object)를 나타낼 수 있습니까?" -#: src/slic3r/GUI/Plater.cpp:2799 +#: src/slic3r/GUI/Plater.cpp:2827 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." msgstr "객체(object)가 너무 커서 인쇄물에 맞게 자동으로 축소되었습니다." -#: src/slic3r/GUI/Plater.cpp:2800 +#: src/slic3r/GUI/Plater.cpp:2828 msgid "Object too large?" msgstr "객체(object)가 너무 큽니까?" -#: src/slic3r/GUI/Plater.cpp:2878 +#: src/slic3r/GUI/Plater.cpp:2908 msgid "Export STL file:" msgstr "STL 파일 내보내기:" -#: src/slic3r/GUI/Plater.cpp:2885 +#: src/slic3r/GUI/Plater.cpp:2915 msgid "Export AMF file:" msgstr "AMF 파일 내보내기:" -#: src/slic3r/GUI/Plater.cpp:2891 +#: src/slic3r/GUI/Plater.cpp:2921 msgid "Save file as:" msgstr "다른 이름으로 파일 저장:" -#: src/slic3r/GUI/Plater.cpp:2897 +#: src/slic3r/GUI/Plater.cpp:2927 msgid "Export OBJ file:" msgstr "OBJ 파일 내보내기:" -#: src/slic3r/GUI/Plater.cpp:2995 +#: src/slic3r/GUI/Plater.cpp:3030 +msgid "Delete object which is a part of cut object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3031 +msgid "" +"You try to delete an object which is a part of a cut object.\n" +"This action will break a cut correspondence.\n" +"After that PrusaSlicer can't guarantee model consistency" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3035 +msgid "Delete object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3040 msgid "Delete Object" msgstr "객체(object) 지우기" -#: src/slic3r/GUI/Plater.cpp:3007 +#: src/slic3r/GUI/Plater.cpp:3057 msgid "Delete All Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3035 +#: src/slic3r/GUI/Plater.cpp:3086 msgid "Reset Project" msgstr "프로젝트 재설정" -#: src/slic3r/GUI/Plater.cpp:3118 +#: src/slic3r/GUI/Plater.cpp:3141 msgid "" "The selected object couldn't be split because it contains only one solid " "part." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3125 +#: src/slic3r/GUI/Plater.cpp:3148 msgid "All non-solid parts (modifiers) were deleted" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3127 +#: src/slic3r/GUI/Plater.cpp:3150 msgid "Split to Objects" msgstr "객체(object)로 분할" -#: src/slic3r/GUI/Plater.cpp:3179 +#: src/slic3r/GUI/Plater.cpp:3202 msgid "" "An object has custom support enforcers which will not be used because " "supports are disabled." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3181 +#: src/slic3r/GUI/Plater.cpp:3204 msgid "Enable supports for enforcers only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3310 src/slic3r/GUI/Plater.cpp:4176 +#: src/slic3r/GUI/Plater.cpp:3339 src/slic3r/GUI/Plater.cpp:4238 msgid "Invalid data" msgstr "잘못 된 데이터" -#: src/slic3r/GUI/Plater.cpp:3380 +#: src/slic3r/GUI/Plater.cpp:3410 msgid "Another export job is currently running." msgstr "다른 내보내기 작업이 현재 실행 중입니다." -#: src/slic3r/GUI/Plater.cpp:3466 +#: src/slic3r/GUI/Plater.cpp:3496 msgid "Replace from:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3484 +#: src/slic3r/GUI/Plater.cpp:3514 msgid "Unable to replace with more than one volume" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3484 src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3514 src/slic3r/GUI/Plater.cpp:3597 msgid "Error during replace" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3555 +#: src/slic3r/GUI/Plater.cpp:3589 msgid "Select the new file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3597 msgid "File for the replace wasn't selected" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3654 +#: src/slic3r/GUI/Plater.cpp:3684 msgid "Please select the file to reload" msgstr "다시 로드할 파일을 선택하십시오." -#: src/slic3r/GUI/Plater.cpp:3685 src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:3715 src/slic3r/GUI/Plater.cpp:5355 +#: src/slic3r/GUI/Plater.cpp:5365 msgid "The selected file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "differs from the original file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "Do you want to replace it" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3703 src/slic3r/GUI/Plater.cpp:3709 +#: src/slic3r/GUI/Plater.cpp:3736 src/slic3r/GUI/Plater.cpp:3742 msgid "Reload from:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3812 +#: src/slic3r/GUI/Plater.cpp:3864 msgid "Unable to reload:" msgstr "다시 로드할 수 없음:" -#: src/slic3r/GUI/Plater.cpp:3817 +#: src/slic3r/GUI/Plater.cpp:3869 msgid "Error during reload" msgstr "다시 로드하는 동안 오류" -#: src/slic3r/GUI/Plater.cpp:3835 +#: src/slic3r/GUI/Plater.cpp:3887 msgid "Reload all from disk" msgstr "디스크에서 모두 다시 로드" -#: src/slic3r/GUI/Plater.cpp:4130 +#: src/slic3r/GUI/Plater.cpp:4191 msgid "There are active warnings concerning sliced models:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4141 +#: src/slic3r/GUI/Plater.cpp:4202 msgid "generated warnings" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4472 +#: src/slic3r/GUI/Plater.cpp:4554 msgid "3D editor view" msgstr "3D 편집화면 보기" -#: src/slic3r/GUI/Plater.cpp:4893 +#: src/slic3r/GUI/Plater.cpp:4980 msgid "Undo / Redo is processing" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4895 +#: src/slic3r/GUI/Plater.cpp:4982 #, boost-format msgid "" "Switching the printer technology from %1% to %2%.\n" @@ -6976,179 +8355,228 @@ msgid "" "printer technology." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5092 +#: src/slic3r/GUI/Plater.cpp:5184 msgid "Creating a new project while the current project is modified." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5095 +#: src/slic3r/GUI/Plater.cpp:5187 msgid "Creating a new project while some presets are modified." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5096 +#: src/slic3r/GUI/Plater.cpp:5188 msgid "You can keep presets modifications to the new project or discard them" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5097 +#: src/slic3r/GUI/Plater.cpp:5189 msgid "" "You can keep presets modifications to the new project, discard them or save " "changes as new presets.\n" "Note, if changes will be saved then new project wouldn't keep them" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5103 +#: src/slic3r/GUI/Plater.cpp:5194 msgid "Creating a new project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5137 +#: src/slic3r/GUI/Plater.cpp:5228 msgid "Load Project" msgstr "프로젝트 불러오기" -#: src/slic3r/GUI/Plater.cpp:5167 src/slic3r/GUI/Plater.cpp:5432 +#: src/slic3r/GUI/Plater.cpp:5258 msgid "Import Object" msgstr "객체(object) 가져오기" -#: src/slic3r/GUI/Plater.cpp:5171 +#: src/slic3r/GUI/Plater.cpp:5262 msgid "Import Objects" msgstr "객체(object) 가져오기" -#: src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:5291 +msgid "Import SLA archive" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5355 src/slic3r/GUI/Plater.cpp:5365 msgid "does not contain valid gcode." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5244 +#: src/slic3r/GUI/Plater.cpp:5356 src/slic3r/GUI/Plater.cpp:5366 msgid "Error while loading .gcode file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5297 +#: src/slic3r/GUI/Plater.cpp:5433 +#, c-format, boost-format +msgid "%s - Multiple projects file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 +msgid "There are several files being loaded, including Project files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 src/slic3r/GUI/Plater.cpp:5446 +msgid "Select an action to apply to all files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5446 +msgid "There are several files being loaded." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5448 src/slic3r/GUI/Plater.cpp:5842 +msgid "Action" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5469 +msgid "Import geometry" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5482 src/slic3r/GUI/Plater.cpp:5834 +msgid "Start new PrusaSlicer instance" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5496 +msgid "Select one to load as project" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5507 +msgid "Select one to load config only" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5609 +#, boost-format +msgid "Failed to unzip file to %1%: %2% " +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5618 +#, boost-format +msgid "Failed to find unzipped file at %1%. Unzipping of file has failed." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5821 #, c-format, boost-format -msgid "%s - Drop project file" +msgid "%s - Load project file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5304 +#: src/slic3r/GUI/Plater.cpp:5830 msgid "Open as project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5305 +#: src/slic3r/GUI/Plater.cpp:5831 msgid "Import geometry only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5306 +#: src/slic3r/GUI/Plater.cpp:5832 msgid "Import config only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5309 +#: src/slic3r/GUI/Plater.cpp:5837 msgid "Select an action to apply to the file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5314 -msgid "Action" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:5330 +#: src/slic3r/GUI/Plater.cpp:5858 msgid "Don't show again" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5371 +#: src/slic3r/GUI/Plater.cpp:5899 msgid "You can open only one .gcode file at a time." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5372 +#: src/slic3r/GUI/Plater.cpp:5900 msgid "Drag and drop G-code file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5454 +#: src/slic3r/GUI/Plater.cpp:5992 msgid "Load File" msgstr "파일 로드" -#: src/slic3r/GUI/Plater.cpp:5459 +#: src/slic3r/GUI/Plater.cpp:5997 msgid "Load Files" msgstr "파일 로드" -#: src/slic3r/GUI/Plater.cpp:5509 +#: src/slic3r/GUI/Plater.cpp:6047 msgid "All objects will be removed, continue?" msgstr "모든 객체(object)가 제거 됩니다, 계속합니까?" -#: src/slic3r/GUI/Plater.cpp:5520 +#: src/slic3r/GUI/Plater.cpp:6058 msgid "Delete Selected Objects" msgstr "선택한 객체(object) 삭제" -#: src/slic3r/GUI/Plater.cpp:5529 +#: src/slic3r/GUI/Plater.cpp:6067 msgid "Increase Instances" msgstr "복제본 늘리기" -#: src/slic3r/GUI/Plater.cpp:5563 +#: src/slic3r/GUI/Plater.cpp:6109 msgid "Decrease Instances" msgstr "복제본 감소" -#: src/slic3r/GUI/Plater.cpp:5614 +#: src/slic3r/GUI/Plater.cpp:6167 msgid "Enter the number of copies:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5615 +#: src/slic3r/GUI/Plater.cpp:6168 msgid "Copies of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5619 +#: src/slic3r/GUI/Plater.cpp:6171 #, c-format, boost-format msgid "Set numbers of copies to %d" msgstr "복사본 수를 %d로 설정" -#: src/slic3r/GUI/Plater.cpp:5697 -msgid "Cut by Plane" -msgstr "평면으로 절단" +#: src/slic3r/GUI/Plater.cpp:6187 +msgid "Fill bed" +msgstr "" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save G-code file as:" msgstr "G-code 파일 다른 이름 저장:" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save SL1 / SL1S file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5766 +#: src/slic3r/GUI/Plater.cpp:6336 msgid "The provided file name is not valid." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5767 +#: src/slic3r/GUI/Plater.cpp:6337 msgid "The following characters are not allowed by a FAT file system:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "" "The plater is empty.\n" "Do you want to save the project?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "Save project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:6543 -msgid "Export" -msgstr "내보내기" +#: src/slic3r/GUI/Plater.cpp:6766 +msgid "Is the printer ready? Is the print sheet in place, empty and clean?" +msgstr "" -#: src/slic3r/GUI/Plater.cpp:6575 -msgid "" -"Custom supports, seams and multimaterial painting were removed after " -"repairing the mesh." +#: src/slic3r/GUI/Plater.cpp:6766 src/slic3r/GUI/PrintHostDialogs.cpp:132 +msgid "Upload and Print" msgstr "" -#: src/slic3r/GUI/Plater.cpp:6689 +#: src/slic3r/GUI/Plater.cpp:7161 +msgid "Export" +msgstr "내보내기" + +#: src/slic3r/GUI/Plater.cpp:7306 msgid "Paste From Clipboard" msgstr "클립보드에서 붙여넣기" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2290 -#: src/slic3r/GUI/Tab.cpp:2517 src/slic3r/GUI/Tab.cpp:2624 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Preferences.cpp:240 src/slic3r/GUI/Tab.cpp:2274 +#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2617 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "General" msgstr "일반" -#: src/slic3r/GUI/Preferences.cpp:121 +#: src/slic3r/GUI/Preferences.cpp:258 msgid "Remember output directory" msgstr "출력 디렉토리 기억하기" -#: src/slic3r/GUI/Preferences.cpp:123 +#: src/slic3r/GUI/Preferences.cpp:259 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." @@ -7156,22 +8584,22 @@ msgstr "" "이 옵션을 사용하면 Slic3r은 입력 파일이 들어있는 디렉터리 대신 마지막 출력 디" "렉터리를 묻습니다." -#: src/slic3r/GUI/Preferences.cpp:129 +#: src/slic3r/GUI/Preferences.cpp:263 msgid "Auto-center parts" msgstr "부품(Part)을 자동으로 중재봉선에" -#: src/slic3r/GUI/Preferences.cpp:131 +#: src/slic3r/GUI/Preferences.cpp:264 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." msgstr "" "이 옵션을 사용하면 Slic3r가 객체(object)를 인쇄판 중앙에 자동으로 배치합니다." -#: src/slic3r/GUI/Preferences.cpp:137 +#: src/slic3r/GUI/Preferences.cpp:268 msgid "Background processing" msgstr "백그라운드 프로세싱" -#: src/slic3r/GUI/Preferences.cpp:139 +#: src/slic3r/GUI/Preferences.cpp:269 msgid "" "If this is enabled, Slic3r will pre-process objects as soon as they're " "loaded in order to save time when exporting G-code." @@ -7179,11 +8607,23 @@ msgstr "" "이 사용 하는 경우 Slic3r는 최대한 빨리 시간을 절약 하기 위해 로드된 G-code를 " "내보낸다." -#: src/slic3r/GUI/Preferences.cpp:148 +#: src/slic3r/GUI/Preferences.cpp:274 +msgid "Alert when supports needed" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:275 +msgid "" +"If this is enabled, Slic3r will raise alerts when it detects issues in the " +"sliced object, that can be resolved with supports (and brim). Examples of " +"such issues are floating object parts, unsupported extrusions and low bed " +"adhesion." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:285 msgid "Export sources full pathnames to 3mf and amf" msgstr "소스 전체 경로 이름을 3mf 및 amf로 내보내기" -#: src/slic3r/GUI/Preferences.cpp:150 +#: src/slic3r/GUI/Preferences.cpp:286 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked." @@ -7191,15 +8631,15 @@ msgstr "" "활성화된 경우 디스크에서 다시 로드 명령을 사용하여 호출될 때 파일을 자동으로 " "찾고 로드할 수 있습니다." -#: src/slic3r/GUI/Preferences.cpp:159 +#: src/slic3r/GUI/Preferences.cpp:293 msgid "If enabled, sets PrusaSlicer as default application to open .3mf files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:166 +#: src/slic3r/GUI/Preferences.cpp:298 msgid "If enabled, sets PrusaSlicer as default application to open .stl files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:177 +#: src/slic3r/GUI/Preferences.cpp:307 msgid "" "If enabled, Slic3r downloads updates of built-in system presets in the " "background. These updates are downloaded into a separate temporary location. " @@ -7210,11 +8650,11 @@ msgstr "" "드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 '사전 " "설정' 버전을 사용할 수 있게되면 응용 프로그램 시작시 제공됩니다." -#: src/slic3r/GUI/Preferences.cpp:182 +#: src/slic3r/GUI/Preferences.cpp:312 msgid "Suppress \" - default - \" presets" msgstr "\"- 기본 -\"사전 설정 숨기기" -#: src/slic3r/GUI/Preferences.cpp:184 +#: src/slic3r/GUI/Preferences.cpp:313 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." @@ -7222,11 +8662,21 @@ msgstr "" "사용 가능한 다른 유효한 '사전 설정'이 있으면 인쇄 / 필라멘트 / 프린터 선택에" "서 \"- 기본 -\"'사전 설정'을 억제하십시오." -#: src/slic3r/GUI/Preferences.cpp:190 +#: src/slic3r/GUI/Preferences.cpp:317 +msgid "Suppress \" Template \" filament presets" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:318 +msgid "" +"Suppress \" Template \" filament presets in configuration wizard and sidebar " +"visibility." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:322 msgid "Show incompatible print and filament presets" msgstr "호환 되지 않는 인쇄 및 필라멘트 설정" -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:323 msgid "" "When checked, the print and filament presets are shown in the preset editor " "even if they are marked as incompatible with the active printer" @@ -7234,91 +8684,102 @@ msgstr "" "이 옵션을 선택하면 프린터와 호환되지 않는 것으로 표시된 경우에도 인쇄 및 필라" "멘트 '사전 설정'이 '사전 설정' 편집기에 표시됩니다" -#: src/slic3r/GUI/Preferences.cpp:200 +#: src/slic3r/GUI/Preferences.cpp:331 +msgid "Show load project dialog" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:332 +msgid "" +"When checked, whenever dragging and dropping a project file on the " +"application or open it from a browser, shows a dialog asking to select the " +"action to take on the file to load." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:335 msgid "Show drop project dialog" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:202 +#: src/slic3r/GUI/Preferences.cpp:336 msgid "" "When checked, whenever dragging and dropping a project file on the " "application, shows a dialog asking to select the action to take on the file " "to load." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:208 src/slic3r/GUI/Preferences.cpp:212 +#: src/slic3r/GUI/Preferences.cpp:342 src/slic3r/GUI/Preferences.cpp:346 msgid "Allow just a single PrusaSlicer instance" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:210 +#: src/slic3r/GUI/Preferences.cpp:343 msgid "" "On OSX there is always only one instance of app running by default. However " "it is allowed to run multiple instances of same app from the command line. " "In such case this settings will allow only one instance." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:214 +#: src/slic3r/GUI/Preferences.cpp:347 msgid "" "If this is enabled, when starting PrusaSlicer and another instance of the " "same PrusaSlicer is already running, that instance will be reactivated " "instead." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:224 +#: src/slic3r/GUI/Preferences.cpp:355 msgid "" "Always ask for unsaved changes in project, when: \n" "- Closing PrusaSlicer,\n" "- Loading or creating a new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:233 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:897 +#: src/slic3r/GUI/Preferences.cpp:363 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:925 msgid "" "Ask to save unsaved changes in presets when closing the application or when " "loading a new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:235 +#: src/slic3r/GUI/Preferences.cpp:364 msgid "" "Always ask for unsaved changes in presets, when: \n" "- Closing PrusaSlicer while some presets are modified,\n" "- Loading a new project while some presets are modified" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:242 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:896 +#: src/slic3r/GUI/Preferences.cpp:370 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:924 msgid "Ask for unsaved changes in presets when selecting new preset" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:244 +#: src/slic3r/GUI/Preferences.cpp:371 msgid "" "Always ask for unsaved changes in presets when selecting new preset or " "resetting a preset" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:249 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 +#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:923 msgid "Ask for unsaved changes in presets when creating new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:251 +#: src/slic3r/GUI/Preferences.cpp:376 msgid "Always ask for unsaved changes in presets when creating new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:258 +#: src/slic3r/GUI/Preferences.cpp:382 msgid "Associate .gcode files to PrusaSlicer G-code Viewer" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:260 +#: src/slic3r/GUI/Preferences.cpp:383 msgid "" "If enabled, sets PrusaSlicer G-code Viewer as default application to open ." "gcode files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:268 +#: src/slic3r/GUI/Preferences.cpp:390 msgid "Use Retina resolution for the 3D scene" msgstr "3D 장면에 레티나 해상도 사용" -#: src/slic3r/GUI/Preferences.cpp:270 +#: src/slic3r/GUI/Preferences.cpp:391 msgid "" "If enabled, the 3D scene will be rendered in Retina resolution. If you are " "experiencing 3D performance problems, disabling this option may help." @@ -7326,110 +8787,106 @@ msgstr "" "활성화 된 경우 3D 장면은 레티나 해상도로 렌더링 됩니다. 3D 성능 문제가 발생하" "는 경우, 옵션을 사용하지 않도록 설정 하면 도움이 될 수 있습니다." -#: src/slic3r/GUI/Preferences.cpp:280 src/slic3r/GUI/Preferences.cpp:282 +#: src/slic3r/GUI/Preferences.cpp:400 src/slic3r/GUI/Preferences.cpp:401 msgid "Show splash screen" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:289 +#: src/slic3r/GUI/Preferences.cpp:406 msgid "If enabled, PrusaSlicer will be open at the position it was closed" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:295 +#: src/slic3r/GUI/Preferences.cpp:411 msgid "Clear Undo / Redo stack on new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:297 +#: src/slic3r/GUI/Preferences.cpp:412 msgid "" "Clear Undo / Redo stack on new project or when an existing project is loaded." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:303 +#: src/slic3r/GUI/Preferences.cpp:417 msgid "Enable support for legacy 3DConnexion devices" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:305 +#: src/slic3r/GUI/Preferences.cpp:418 msgid "" "If enabled, the legacy 3DConnexion devices settings dialog is available by " "pressing CTRL+M" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:314 +#: src/slic3r/GUI/Preferences.cpp:425 msgid "Camera" msgstr "카메라" -#: src/slic3r/GUI/Preferences.cpp:319 +#: src/slic3r/GUI/Preferences.cpp:435 msgid "Use perspective camera" msgstr "원근 보기 사용" -#: src/slic3r/GUI/Preferences.cpp:321 +#: src/slic3r/GUI/Preferences.cpp:436 msgid "" "If enabled, use perspective camera. If not enabled, use orthographic camera." msgstr "" "이 옵션을 사용하면 원근 보기모드를 사용합니다. 활성화되지 않은 경우 일반 보기" "를 사용합니다." -#: src/slic3r/GUI/Preferences.cpp:326 +#: src/slic3r/GUI/Preferences.cpp:440 msgid "Use free camera" msgstr "무료 카메라 사용" -#: src/slic3r/GUI/Preferences.cpp:328 +#: src/slic3r/GUI/Preferences.cpp:441 msgid "If enabled, use free camera. If not enabled, use constrained camera." msgstr "" "활성화된 경우 무료 카메라를 사용하십시오. 활성화되지 않은 경우 구속된 카메라" "를 사용합니다." -#: src/slic3r/GUI/Preferences.cpp:333 +#: src/slic3r/GUI/Preferences.cpp:445 msgid "Reverse direction of zoom with mouse wheel" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:335 +#: src/slic3r/GUI/Preferences.cpp:446 msgid "If enabled, reverses the direction of zoom with mouse wheel" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:343 +#: src/slic3r/GUI/Preferences.cpp:452 msgid "GUI" msgstr "GUI" -#: src/slic3r/GUI/Preferences.cpp:366 +#: src/slic3r/GUI/Preferences.cpp:492 msgid "Sequential slider applied only to top layer" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:368 +#: src/slic3r/GUI/Preferences.cpp:493 msgid "" "If enabled, changes made using the sequential slider, in preview, apply only " -"to gcode top layer. If disabled, changes made using the sequential slider, " -"in preview, apply to the whole gcode." +"to gcode top layer.If disabled, changes made using the sequential slider, in " +"preview, apply to the whole gcode." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/Preferences.cpp:499 msgid "Show sidebar collapse/expand button" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:377 +#: src/slic3r/GUI/Preferences.cpp:500 msgid "" "If enabled, the button for the collapse sidebar will be appeared in top " "right corner of the 3D Scene" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:384 -msgid "If enabled, PrusaSlicer will not open hyperlinks in your browser." -msgstr "" - -#: src/slic3r/GUI/Preferences.cpp:391 +#: src/slic3r/GUI/Preferences.cpp:511 msgid "Use colors for axes values in Manipulation panel" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:393 +#: src/slic3r/GUI/Preferences.cpp:512 msgid "" "If enabled, the axes names and axes values will be colorized according to " "the axes colors. If disabled, old UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:399 +#: src/slic3r/GUI/Preferences.cpp:517 msgid "Order object volumes by types" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:401 +#: src/slic3r/GUI/Preferences.cpp:518 msgid "" "If enabled, volumes will be always ordered inside the object. Correct order " "is Model Part, Negative Volume, Modifier, Support Blocker and Support " @@ -7437,193 +8894,240 @@ msgid "" "Modifiers. But one of the model parts have to be on the first place." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:408 +#: src/slic3r/GUI/Preferences.cpp:523 +msgid "Show non-manifold edges" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:524 +msgid "If enabled, shows non-manifold edges." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:528 +msgid "Allow automatically color change" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:529 +msgid "" +"If enabled, related notification will be shown, when sliced object looks " +"like a logo or a sign." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:534 msgid "Set settings tabs as menu items (experimental)" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:410 +#: src/slic3r/GUI/Preferences.cpp:535 msgid "" "If enabled, Settings Tabs will be placed as menu items. If disabled, old UI " "will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:419 +#: src/slic3r/GUI/Preferences.cpp:542 msgid "Show \"Tip of the day\" notification after start" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:421 +#: src/slic3r/GUI/Preferences.cpp:543 msgid "If enabled, useful hints are displayed at startup." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:427 +#: src/slic3r/GUI/Preferences.cpp:547 msgid "Notify about new releases" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:429 +#: src/slic3r/GUI/Preferences.cpp:548 msgid "" "You will be notified about new release after startup acordingly: All = " "Regular release and alpha / beta releases. Release only = regular release." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:435 +#: src/slic3r/GUI/Preferences.cpp:551 msgid "Release only" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:444 +#: src/slic3r/GUI/Preferences.cpp:558 msgid "Use custom size for toolbar icons" msgstr "도구 모음 아이콘에 사용자 지정 크기 사용" -#: src/slic3r/GUI/Preferences.cpp:446 +#: src/slic3r/GUI/Preferences.cpp:559 msgid "If enabled, you can change size of toolbar icons manually." msgstr "활성화된 경우 도구 모음 아이콘의 크기를 수동으로 변경할 수 있습니다." -#: src/slic3r/GUI/Preferences.cpp:471 +#: src/slic3r/GUI/Preferences.cpp:577 src/slic3r/GUI/Tab.cpp:1659 +msgid "Other" +msgstr "그 외" + +#: src/slic3r/GUI/Preferences.cpp:594 +msgid "If enabled, PrusaSlicer will not open a hyperlinks in your browser." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:600 +msgid "Allow downloads from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:601 +msgid "If enabled, PrusaSlicer will be allowed to download from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:610 msgid "Render" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:476 +#: src/slic3r/GUI/Preferences.cpp:620 msgid "Use environment map" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:478 +#: src/slic3r/GUI/Preferences.cpp:621 msgid "If enabled, renders object using the environment map." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:491 +#: src/slic3r/GUI/Preferences.cpp:629 msgid "Dark mode (experimental)" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:496 +#: src/slic3r/GUI/Preferences.cpp:639 msgid "Enable dark mode" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:498 +#: src/slic3r/GUI/Preferences.cpp:640 msgid "" "If enabled, UI will use Dark mode colors. If disabled, old UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:507 +#: src/slic3r/GUI/Preferences.cpp:647 msgid "Use system menu for application" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:509 +#: src/slic3r/GUI/Preferences.cpp:648 msgid "" "If enabled, application will use the standard Windows system menu,\n" -"but on some combination of display scales it can looks ugly. If disabled, " -"old UI will be used." +"but on some combination od display scales it can look ugly. If disabled, old " +"UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:578 +#: src/slic3r/GUI/Preferences.cpp:726 msgid "Changes for the critical options" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:580 +#: src/slic3r/GUI/Preferences.cpp:728 msgid "" "Changing some options will trigger application restart.\n" "You will lose the content of the plater." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:694 +#: src/slic3r/GUI/Preferences.cpp:921 msgid "Icon size in a respect to the default size" msgstr "기본 크기에 대한 아이콘 크기" -#: src/slic3r/GUI/Preferences.cpp:709 +#: src/slic3r/GUI/Preferences.cpp:936 msgid "Select toolbar icon size in respect to the default one." msgstr "기본 도구 모음에 대해 도구 모음 아이콘 크기를 선택합니다." -#: src/slic3r/GUI/Preferences.cpp:743 src/slic3r/GUI/Preferences.cpp:754 +#: src/slic3r/GUI/Preferences.cpp:972 +msgid "Layout Options" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:981 msgid "Old regular layout with the tab bar" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:744 +#: src/slic3r/GUI/Preferences.cpp:982 msgid "New layout, access via settings button in the top menu" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:745 src/slic3r/GUI/Preferences.cpp:755 +#: src/slic3r/GUI/Preferences.cpp:983 msgid "Settings in non-modal window" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:763 -msgid "Layout Options" +#: src/slic3r/GUI/Preferences.cpp:1025 +msgid "Text colors" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:806 -msgid "Text colors" +#: src/slic3r/GUI/Preferences.cpp:1049 +msgid "Mode markers" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:249 -#: src/slic3r/GUI/PresetComboBoxes.cpp:287 -#: src/slic3r/GUI/PresetComboBoxes.cpp:794 -#: src/slic3r/GUI/PresetComboBoxes.cpp:849 -#: src/slic3r/GUI/PresetComboBoxes.cpp:989 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1033 +#: src/slic3r/GUI/PresetComboBoxes.cpp:254 +#: src/slic3r/GUI/PresetComboBoxes.cpp:306 +#: src/slic3r/GUI/PresetComboBoxes.cpp:846 +#: src/slic3r/GUI/PresetComboBoxes.cpp:909 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1073 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1125 msgid "System presets" msgstr "시스템 기본설정" -#: src/slic3r/GUI/PresetComboBoxes.cpp:291 -#: src/slic3r/GUI/PresetComboBoxes.cpp:853 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1037 +#: src/slic3r/GUI/PresetComboBoxes.cpp:310 +#: src/slic3r/GUI/PresetComboBoxes.cpp:915 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1130 msgid "User presets" msgstr "사용자 사전설정" -#: src/slic3r/GUI/PresetComboBoxes.cpp:302 +#: src/slic3r/GUI/PresetComboBoxes.cpp:321 msgid "Incompatible presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:337 +#: src/slic3r/GUI/PresetComboBoxes.cpp:364 #, boost-format msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:340 +#: src/slic3r/GUI/PresetComboBoxes.cpp:366 msgid "Delete Physical Printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:581 +#: src/slic3r/GUI/PresetComboBoxes.cpp:612 msgid "Click to edit preset" msgstr "사전 설정을 편집 하려면 클릭 하십시오" -#: src/slic3r/GUI/PresetComboBoxes.cpp:697 -#: src/slic3r/GUI/PresetComboBoxes.cpp:737 +#: src/slic3r/GUI/PresetComboBoxes.cpp:740 +#: src/slic3r/GUI/PresetComboBoxes.cpp:788 msgid "Add/Remove presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:745 +#: src/slic3r/GUI/PresetComboBoxes.cpp:793 src/slic3r/GUI/Tab.cpp:3312 msgid "Add physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:716 +#: src/slic3r/GUI/PresetComboBoxes.cpp:759 msgid "Edit preset" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:722 +#: src/slic3r/GUI/PresetComboBoxes.cpp:765 msgid "Change extruder color" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:773 src/slic3r/GUI/Tab.cpp:3312 msgid "Edit physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:733 +#: src/slic3r/GUI/PresetComboBoxes.cpp:779 +msgid "Open physical printer URL" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:784 msgid "Delete physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:864 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1051 +#: src/slic3r/GUI/PresetComboBoxes.cpp:924 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1142 +msgid "Template presets" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:935 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1156 msgid "Physical printers" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:888 +#: src/slic3r/GUI/PresetComboBoxes.cpp:959 msgid "Add/Remove filaments" msgstr "필라멘트 추가/제거" -#: src/slic3r/GUI/PresetComboBoxes.cpp:890 +#: src/slic3r/GUI/PresetComboBoxes.cpp:961 msgid "Add/Remove materials" msgstr "재질 추가/제거" -#: src/slic3r/GUI/PresetComboBoxes.cpp:892 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1075 +#: src/slic3r/GUI/PresetComboBoxes.cpp:963 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1180 msgid "Add/Remove printers" msgstr "" @@ -7803,98 +9307,107 @@ msgstr "최소 바닥 쉘 두께는 %1% mm입니다." msgid "Bottom is open." msgstr "바닥이 열려 있습니다." -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Send G-Code to printer host" msgstr "프린터 호스트로 G 코드 보내기" -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Upload to Printer Host with the following filename:" msgstr "다음 파일 이름으로 프린터 호스트에 업로드:" -#: src/slic3r/GUI/PrintHostDialogs.cpp:51 +#: src/slic3r/GUI/PrintHostDialogs.cpp:55 msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "필요한 경우 디렉토리 분리 기호로 슬래시 (/)를 사용하십시오." -#: src/slic3r/GUI/PrintHostDialogs.cpp:60 +#: src/slic3r/GUI/PrintHostDialogs.cpp:64 msgid "Group" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:84 +#: src/slic3r/GUI/PrintHostDialogs.cpp:74 +msgid "Upload to storage:" +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:83 +msgid "Upload to storage: " +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:105 #, c-format, boost-format msgid "Upload filename doesn't end with \"%s\". Do you wish to continue?" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:91 +#: src/slic3r/GUI/PrintHostDialogs.cpp:112 msgid "Upload" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:101 -msgid "Upload and Print" +#: src/slic3r/GUI/PrintHostDialogs.cpp:122 +msgid "Upload to Queue" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:112 +#: src/slic3r/GUI/PrintHostDialogs.cpp:143 msgid "Upload and Simulate" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:247 +#: src/slic3r/GUI/PrintHostDialogs.cpp:298 msgid "ID" msgstr "아이디" -#: src/slic3r/GUI/PrintHostDialogs.cpp:248 +#: src/slic3r/GUI/PrintHostDialogs.cpp:299 msgid "Progress" msgstr "진행률" -#: src/slic3r/GUI/PrintHostDialogs.cpp:249 +#: src/slic3r/GUI/PrintHostDialogs.cpp:300 msgid "Status" msgstr "상태" -#: src/slic3r/GUI/PrintHostDialogs.cpp:250 +#: src/slic3r/GUI/PrintHostDialogs.cpp:301 msgid "Host" msgstr "호스트" -#: src/slic3r/GUI/PrintHostDialogs.cpp:251 +#: src/slic3r/GUI/PrintHostDialogs.cpp:302 msgctxt "OfFile" msgid "Size" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:252 +#: src/slic3r/GUI/PrintHostDialogs.cpp:303 msgid "Filename" msgstr "파일이름" -#: src/slic3r/GUI/PrintHostDialogs.cpp:253 -msgid "Error Message" -msgstr "에러 메시지" +#: src/slic3r/GUI/PrintHostDialogs.cpp:304 +#, fuzzy +msgid "Message" +msgstr "알림 : %s" -#: src/slic3r/GUI/PrintHostDialogs.cpp:256 +#: src/slic3r/GUI/PrintHostDialogs.cpp:308 msgid "Cancel selected" msgstr "선택 취소" -#: src/slic3r/GUI/PrintHostDialogs.cpp:258 +#: src/slic3r/GUI/PrintHostDialogs.cpp:310 msgid "Show error message" msgstr "오류 메시지 표시" -#: src/slic3r/GUI/PrintHostDialogs.cpp:316 -#: src/slic3r/GUI/PrintHostDialogs.cpp:371 +#: src/slic3r/GUI/PrintHostDialogs.cpp:368 +#: src/slic3r/GUI/PrintHostDialogs.cpp:423 msgid "Enqueued" msgstr "입력됨" -#: src/slic3r/GUI/PrintHostDialogs.cpp:372 +#: src/slic3r/GUI/PrintHostDialogs.cpp:424 msgid "Uploading" msgstr "업로드" -#: src/slic3r/GUI/PrintHostDialogs.cpp:374 +#: src/slic3r/GUI/PrintHostDialogs.cpp:426 msgid "Cancelling" msgstr "취소 중" -#: src/slic3r/GUI/PrintHostDialogs.cpp:375 +#: src/slic3r/GUI/PrintHostDialogs.cpp:427 msgid "Cancelled" msgstr "취소됨" -#: src/slic3r/GUI/PrintHostDialogs.cpp:376 +#: src/slic3r/GUI/PrintHostDialogs.cpp:428 msgid "Completed" msgstr "완료됨" -#: src/slic3r/GUI/PrintHostDialogs.cpp:424 +#: src/slic3r/GUI/PrintHostDialogs.cpp:476 msgid "Error uploading to print host:" msgstr "인쇄 호스트에 업로드 하는 중 오류 발생:" @@ -7902,13 +9415,13 @@ msgstr "인쇄 호스트에 업로드 하는 중 오류 발생:" msgid "NO RAMMING AT ALL" msgstr "전혀 충돌 없음" -#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 -#: src/libslic3r/PrintConfig.cpp:955 src/libslic3r/PrintConfig.cpp:999 -#: src/libslic3r/PrintConfig.cpp:1014 src/libslic3r/PrintConfig.cpp:3297 -#: src/libslic3r/PrintConfig.cpp:3306 src/libslic3r/PrintConfig.cpp:3315 -#: src/libslic3r/PrintConfig.cpp:3456 src/libslic3r/PrintConfig.cpp:3464 -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3479 -#: src/libslic3r/PrintConfig.cpp:3487 src/libslic3r/PrintConfig.cpp:3495 +#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/libslic3r/PrintConfig.cpp:1044 src/libslic3r/PrintConfig.cpp:1088 +#: src/libslic3r/PrintConfig.cpp:1103 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3578 src/libslic3r/PrintConfig.cpp:3587 +#: src/libslic3r/PrintConfig.cpp:3733 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3749 src/libslic3r/PrintConfig.cpp:3756 +#: src/libslic3r/PrintConfig.cpp:3764 src/libslic3r/PrintConfig.cpp:3772 msgid "s" msgstr "s" @@ -7916,162 +9429,210 @@ msgstr "s" msgid "Volumetric speed" msgstr "용적(Volumetric) 스피트" -#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:912 -#: src/libslic3r/PrintConfig.cpp:1824 +#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:1001 +#: src/libslic3r/PrintConfig.cpp:1861 msgid "mm³/s" msgstr "밀리미터 ³/s" -#: src/slic3r/GUI/SavePresetDialog.cpp:57 +#: src/slic3r/GUI/SavePresetDialog.cpp:90 +#, c-format, boost-format +msgid "Rename %s to:" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:90 #, c-format, boost-format msgid "Save %s as:" msgstr "Save %s as:" -#: src/slic3r/GUI/SavePresetDialog.cpp:101 -#: src/slic3r/GUI/SavePresetDialog.cpp:109 +#: src/slic3r/GUI/SavePresetDialog.cpp:165 +#: src/slic3r/GUI/SavePresetDialog.cpp:173 msgid "The supplied name is not valid;" msgstr "제공된 이름이 유효하지 않습니다;" -#: src/slic3r/GUI/SavePresetDialog.cpp:110 +#: src/slic3r/GUI/SavePresetDialog.cpp:174 msgid "the following suffix is not allowed:" msgstr "다음 접미사는 허용되지 않습니다:" -#: src/slic3r/GUI/SavePresetDialog.cpp:116 +#: src/slic3r/GUI/SavePresetDialog.cpp:180 msgid "The supplied name is not available." msgstr "제공된 이름을 사용할 수 없습니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:122 +#: src/slic3r/GUI/SavePresetDialog.cpp:186 +msgid "The supplied name is used for a system profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:187 msgid "Cannot overwrite a system profile." msgstr "시스템 프로파일을 겹쳐 쓸 수 없습니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:127 +#: src/slic3r/GUI/SavePresetDialog.cpp:192 +msgid "The supplied name is used for a external profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:193 msgid "Cannot overwrite an external profile." msgstr "외부 프로필을 덮어 쓸 수 없습니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:134 +#: src/slic3r/GUI/SavePresetDialog.cpp:203 +msgid "Save preset modifications to existing user profile" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:205 +msgid "Nothing changed" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:210 #, boost-format msgid "Preset with name \"%1%\" already exists." msgstr "이름 \"%1%\"가 있는 사전 설정이 이미 있습니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:136 +#: src/slic3r/GUI/SavePresetDialog.cpp:212 #, boost-format msgid "" "Preset with name \"%1%\" already exists and is incompatible with selected " "printer." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:137 +#: src/slic3r/GUI/SavePresetDialog.cpp:213 msgid "Note: This preset will be replaced after saving" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:142 +#: src/slic3r/GUI/SavePresetDialog.cpp:219 msgid "The name cannot be empty." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:147 +#: src/slic3r/GUI/SavePresetDialog.cpp:230 +msgid "The name is too long." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:235 msgid "The name cannot start with space character." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:152 +#: src/slic3r/GUI/SavePresetDialog.cpp:240 msgid "The name cannot end with space character." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:157 +#: src/slic3r/GUI/SavePresetDialog.cpp:245 msgid "The name cannot be the same as a preset alias name." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:191 -#: src/slic3r/GUI/SavePresetDialog.cpp:197 +#: src/slic3r/GUI/SavePresetDialog.cpp:289 msgid "Save preset" msgstr "사전 설정 저장" -#: src/slic3r/GUI/SavePresetDialog.cpp:221 +#: src/slic3r/GUI/SavePresetDialog.cpp:295 +msgid "Save presets" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:302 +msgid "Rename preset" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:327 msgctxt "PresetName" msgid "Copy" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:283 +#: src/slic3r/GUI/SavePresetDialog.cpp:347 +msgid "Save as profile derived from current printer only." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:407 #, boost-format msgid "" "You have selected physical printer \"%1%\" \n" "with related printer preset \"%2%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:322 +#: src/slic3r/GUI/SavePresetDialog.cpp:446 #, boost-format msgid "What would you like to do with \"%1%\" preset after saving?" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:325 +#: src/slic3r/GUI/SavePresetDialog.cpp:449 #, boost-format msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:326 +#: src/slic3r/GUI/SavePresetDialog.cpp:450 #, boost-format msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:327 +#: src/slic3r/GUI/SavePresetDialog.cpp:451 #, boost-format msgid "Just switch to \"%1%\" preset" msgstr "" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2652 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2645 msgid "Stealth" msgstr "스텔스" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2646 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2639 msgid "Normal" msgstr "보통" -#: src/slic3r/GUI/Selection.cpp:168 +#: src/slic3r/GUI/Selection.cpp:180 msgid "Selection-Add" msgstr "선택 추가" -#: src/slic3r/GUI/Selection.cpp:209 +#: src/slic3r/GUI/Selection.cpp:221 msgid "Selection-Remove" msgstr "선택-제거" -#: src/slic3r/GUI/Selection.cpp:241 +#: src/slic3r/GUI/Selection.cpp:253 msgid "Selection-Add Object" msgstr "선택-추가 객체" -#: src/slic3r/GUI/Selection.cpp:260 +#: src/slic3r/GUI/Selection.cpp:272 msgid "Selection-Remove Object" msgstr "선택-제거 개체" -#: src/slic3r/GUI/Selection.cpp:278 +#: src/slic3r/GUI/Selection.cpp:290 msgid "Selection-Add Instance" msgstr "선택-인스턴스 추가" -#: src/slic3r/GUI/Selection.cpp:297 +#: src/slic3r/GUI/Selection.cpp:309 msgid "Selection-Remove Instance" msgstr "선택-제거 인스턴스" -#: src/slic3r/GUI/Selection.cpp:394 +#: src/slic3r/GUI/Selection.cpp:406 msgid "Selection-Add All" msgstr "선택-모두 추가" -#: src/slic3r/GUI/Selection.cpp:419 +#: src/slic3r/GUI/Selection.cpp:431 msgid "Selection-Remove All" msgstr "선택-모두 제거" -#: src/slic3r/GUI/Selection.cpp:950 +#: src/slic3r/GUI/Selection.cpp:1309 msgid "Scale To Fit" msgstr "크기에 맞게 조정" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:114 +#: src/slic3r/GUI/Selection.cpp:1691 +msgid "" +"The currently manipulated object is tilted or contains tilted parts " +"(rotation angles are not multiples of 90°). Non-uniform scaling of tilted " +"objects is only possible in non-local coordinate systems, once the rotation " +"is embedded into the object coordinates." +msgstr "" + +#: src/slic3r/GUI/Selection.cpp:1694 +msgid "This operation is irreversible." +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:117 msgid "Data to send" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:550 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:618 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:557 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:624 msgid "Send system info" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:581 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:587 #, boost-format msgid "" "This is the first time you are running %1%. We would like to ask you to send " @@ -8080,18 +9641,18 @@ msgid "" "version)." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:585 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:591 msgid "" "If we know your hardware, operating system, etc., it will greatly help us in " "development and prioritization, because we will be able to focus our effort " "more efficiently and spend time on features that are needed the most." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:588 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:594 msgid "Is it safe?" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:590 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:596 #, boost-format msgid "" "We do not send any personal information nor anything that would allow us to " @@ -8102,81 +9663,86 @@ msgid "" "inspect the code actually performing the communication, see %1%." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:614 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:620 msgid "Show verbatim data that will be sent" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:616 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:622 msgid "Ask me next time" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:617 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:623 msgid "Do not send anything" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:703 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:709 msgid "System info sent successfully. Thank you." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:706 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:712 msgid "Sending system info failed!" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:713 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:719 msgid "Sending system info was cancelled." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:720 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:726 msgid "Sending system info..." msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:84 +#: src/slic3r/GUI/SysInfoDialog.cpp:92 msgid "System Information" msgstr "시스템 정보" -#: src/slic3r/GUI/SysInfoDialog.cpp:150 +#: src/slic3r/GUI/SysInfoDialog.cpp:160 msgid "Blacklisted libraries loaded into PrusaSlicer process:" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:162 +#: src/slic3r/GUI/SysInfoDialog.cpp:172 msgid "Eigen vectorization supported:" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:169 +#: src/slic3r/GUI/SysInfoDialog.cpp:179 msgid "Copy to Clipboard" msgstr "클립보드에 복사" -#: src/slic3r/GUI/Tab.cpp:114 src/libslic3r/PrintConfig.cpp:565 +#: src/slic3r/GUI/Tab.cpp:68 src/libslic3r/PrintConfig.cpp:668 msgid "Compatible printers" msgstr "호환 가능한 프린터들" -#: src/slic3r/GUI/Tab.cpp:115 +#: src/slic3r/GUI/Tab.cpp:69 msgid "Select the printers this profile is compatible with." msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요." -#: src/slic3r/GUI/Tab.cpp:120 src/libslic3r/PrintConfig.cpp:580 +#: src/slic3r/GUI/Tab.cpp:74 src/libslic3r/PrintConfig.cpp:683 msgid "Compatible print profiles" msgstr "호환되는 인쇄 프로 파일" -#: src/slic3r/GUI/Tab.cpp:121 +#: src/slic3r/GUI/Tab.cpp:75 msgid "Select the print profiles this profile is compatible with." msgstr "이 프로필이 호환되는 인쇄 프로필을 선택 합니다." -#: src/slic3r/GUI/Tab.cpp:216 +#: src/slic3r/GUI/Tab.cpp:165 msgid "Compare this preset with some another" msgstr "" #. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:218 +#: src/slic3r/GUI/Tab.cpp:167 #, c-format, boost-format msgid "Save current %s" msgstr "현재 %s 저장" -#: src/slic3r/GUI/Tab.cpp:219 +#: src/slic3r/GUI/Tab.cpp:168 +#, c-format, boost-format +msgid "Rename current %s" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:170 msgid "Delete this preset" msgstr "이전 설정 삭제" -#: src/slic3r/GUI/Tab.cpp:223 +#: src/slic3r/GUI/Tab.cpp:174 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." @@ -8184,237 +9750,245 @@ msgstr "" "버튼 위로 커서를 가져 가서 자세한 정보를 찾습니다.\n" "또는이 버튼을 클릭하십시오." -#: src/slic3r/GUI/Tab.cpp:227 +#: src/slic3r/GUI/Tab.cpp:178 #, boost-format msgid "Search in settings [%1%]" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1298 +#: src/slic3r/GUI/Tab.cpp:1243 msgid "Detach from system preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1311 +#: src/slic3r/GUI/Tab.cpp:1256 msgid "" "A copy of the current system preset will be created, which will be detached " "from the system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1312 +#: src/slic3r/GUI/Tab.cpp:1257 msgid "" "The current custom preset will be detached from the parent system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1315 +#: src/slic3r/GUI/Tab.cpp:1260 msgid "Modifications to the current profile will be saved." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1321 +#: src/slic3r/GUI/Tab.cpp:1266 msgid "Detach preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1347 +#: src/slic3r/GUI/Tab.cpp:1292 msgid "This is a default preset." msgstr "기본 설정입니다." -#: src/slic3r/GUI/Tab.cpp:1349 +#: src/slic3r/GUI/Tab.cpp:1294 msgid "This is a system preset." msgstr "시스템 설정입니다." -#: src/slic3r/GUI/Tab.cpp:1351 +#: src/slic3r/GUI/Tab.cpp:1296 msgid "Current preset is inherited from the default preset." msgstr "현재 사전 설정은 기본 사전 설정에서 상속됩니다." -#: src/slic3r/GUI/Tab.cpp:1355 +#: src/slic3r/GUI/Tab.cpp:1300 msgid "Current preset is inherited from" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1359 +#: src/slic3r/GUI/Tab.cpp:1304 msgid "It can't be deleted or modified." msgstr "삭제하거나 수정할 수 없습니다." -#: src/slic3r/GUI/Tab.cpp:1360 +#: src/slic3r/GUI/Tab.cpp:1305 msgid "" "Any modifications should be saved as a new preset inherited from this one." msgstr "모든 수정 사항은 이 항목에서 받은 기본 설정으로 저장해야합니다." -#: src/slic3r/GUI/Tab.cpp:1361 +#: src/slic3r/GUI/Tab.cpp:1306 msgid "To do that please specify a new name for the preset." msgstr "그렇게하려면 기본 설정의 새 이름을 지정하십시오." -#: src/slic3r/GUI/Tab.cpp:1365 +#: src/slic3r/GUI/Tab.cpp:1310 msgid "Additional information:" msgstr "추가 정보:" -#: src/slic3r/GUI/Tab.cpp:1371 +#: src/slic3r/GUI/Tab.cpp:1316 msgid "printer model" msgstr "프린터 모델" -#: src/slic3r/GUI/Tab.cpp:1379 +#: src/slic3r/GUI/Tab.cpp:1324 msgid "default print profile" msgstr "기본 인쇄 프로파일" -#: src/slic3r/GUI/Tab.cpp:1382 +#: src/slic3r/GUI/Tab.cpp:1327 msgid "default filament profile" msgstr "기본 필라멘트 프로파일" -#: src/slic3r/GUI/Tab.cpp:1396 +#: src/slic3r/GUI/Tab.cpp:1341 msgid "default SLA material profile" msgstr "기본 SLA 재질 프로 파일" -#: src/slic3r/GUI/Tab.cpp:1400 +#: src/slic3r/GUI/Tab.cpp:1345 msgid "default SLA print profile" msgstr "기본 SLA 인쇄 프로필" -#: src/slic3r/GUI/Tab.cpp:1408 +#: src/slic3r/GUI/Tab.cpp:1353 msgid "full profile name" msgstr "전체 프로필 이름" -#: src/slic3r/GUI/Tab.cpp:1409 +#: src/slic3r/GUI/Tab.cpp:1354 msgid "symbolic profile name" msgstr "기호 프로파일 이름" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4657 +#: src/slic3r/GUI/Tab.cpp:1392 src/slic3r/GUI/Tab.cpp:4940 msgid "Layers and perimeters" msgstr "레이어 및 둘레" -#: src/slic3r/GUI/Tab.cpp:1453 +#: src/slic3r/GUI/Tab.cpp:1398 msgid "Vertical shells" msgstr "수직 쉘" -#: src/slic3r/GUI/Tab.cpp:1465 +#: src/slic3r/GUI/Tab.cpp:1410 msgid "Horizontal shells" msgstr "수평 쉘" -#: src/slic3r/GUI/Tab.cpp:1466 src/libslic3r/PrintConfig.cpp:2417 +#: src/slic3r/GUI/Tab.cpp:1411 src/libslic3r/PrintConfig.cpp:2448 msgid "Solid layers" msgstr "솔리드 레이어" -#: src/slic3r/GUI/Tab.cpp:1471 +#: src/slic3r/GUI/Tab.cpp:1416 msgid "Minimum shell thickness" msgstr "최소 쉘 두께" -#: src/slic3r/GUI/Tab.cpp:1482 +#: src/slic3r/GUI/Tab.cpp:1427 msgid "Quality (slower slicing)" msgstr "품질(슬라이싱이 느려짐)" -#: src/slic3r/GUI/Tab.cpp:1497 +#: src/slic3r/GUI/Tab.cpp:1444 msgid "Fuzzy skin (experimental)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1520 +#: src/slic3r/GUI/Tab.cpp:1467 msgid "Reducing printing time" msgstr "출력 시간 단축" -#: src/slic3r/GUI/Tab.cpp:1535 src/libslic3r/ExtrusionEntity.cpp:370 +#: src/slic3r/GUI/Tab.cpp:1482 msgid "Skirt" msgstr "스커트" -#: src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1504 msgid "Raft" msgstr "라프트" -#: src/slic3r/GUI/Tab.cpp:1562 +#: src/slic3r/GUI/Tab.cpp:1509 msgid "Options for support material and raft" msgstr "서포트와 라프트 재료를 선택" -#: src/slic3r/GUI/Tab.cpp:1582 +#: src/slic3r/GUI/Tab.cpp:1528 +msgid "Organic supports" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1537 msgid "Speed for print moves" msgstr "출력중 이동 속도" -#: src/slic3r/GUI/Tab.cpp:1595 +#: src/slic3r/GUI/Tab.cpp:1550 +msgid "Dynamic overhang speed" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1557 msgid "Speed for non-print moves" msgstr "미출력시 이동속도" -#: src/slic3r/GUI/Tab.cpp:1599 +#: src/slic3r/GUI/Tab.cpp:1561 msgid "Modifiers" msgstr "수정" -#: src/slic3r/GUI/Tab.cpp:1603 +#: src/slic3r/GUI/Tab.cpp:1565 msgid "Acceleration control (advanced)" msgstr "가속 제어(고급)" -#: src/slic3r/GUI/Tab.cpp:1614 +#: src/slic3r/GUI/Tab.cpp:1576 msgid "Autospeed (advanced)" msgstr "오토스피트(고급)" -#: src/slic3r/GUI/Tab.cpp:1618 +#: src/slic3r/GUI/Tab.cpp:1580 msgid "Pressure equalizer (experimental)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1622 +#: src/slic3r/GUI/Tab.cpp:1584 msgid "Multiple Extruders" msgstr "다중 익스트루더" -#: src/slic3r/GUI/Tab.cpp:1630 +#: src/slic3r/GUI/Tab.cpp:1592 msgid "Ooze prevention" msgstr "오즈 방지(Ooze prevention)" -#: src/slic3r/GUI/Tab.cpp:1650 +#: src/slic3r/GUI/Tab.cpp:1596 +msgid "Wipe tower" +msgstr "와이프 타워(Wipe tower)" + +#: src/slic3r/GUI/Tab.cpp:1612 msgid "Extrusion width" msgstr "악출 폭(Extrusion width)" -#: src/slic3r/GUI/Tab.cpp:1660 +#: src/slic3r/GUI/Tab.cpp:1622 msgid "Overlap" msgstr "겹침(Overlap)" -#: src/slic3r/GUI/Tab.cpp:1663 +#: src/slic3r/GUI/Tab.cpp:1625 msgid "Flow" msgstr "유량(Flow)" -#: src/slic3r/GUI/Tab.cpp:1674 src/slic3r/GUI/Tab.cpp:1700 -msgid "Other" -msgstr "그 외" - -#: src/slic3r/GUI/Tab.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:1636 msgid "Arachne perimeter generator" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1685 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1644 src/slic3r/GUI/Tab.cpp:4990 msgid "Output options" msgstr "출력 옵션" -#: src/slic3r/GUI/Tab.cpp:1686 +#: src/slic3r/GUI/Tab.cpp:1645 msgid "Sequential printing" msgstr "연속 인쇄" -#: src/slic3r/GUI/Tab.cpp:1688 +#: src/slic3r/GUI/Tab.cpp:1647 msgid "Extruder clearance" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:4735 +#: src/slic3r/GUI/Tab.cpp:1652 src/slic3r/GUI/Tab.cpp:4991 msgid "Output file" msgstr "출력 파일" -#: src/slic3r/GUI/Tab.cpp:1712 src/libslic3r/PrintConfig.cpp:2042 +#: src/slic3r/GUI/Tab.cpp:1671 src/libslic3r/PrintConfig.cpp:2072 msgid "Post-processing scripts" msgstr "사후 처리 스크립트" -#: src/slic3r/GUI/Tab.cpp:1724 src/slic3r/GUI/Tab.cpp:1725 -#: src/slic3r/GUI/Tab.cpp:2110 src/slic3r/GUI/Tab.cpp:2111 -#: src/slic3r/GUI/Tab.cpp:2498 src/slic3r/GUI/Tab.cpp:2499 -#: src/slic3r/GUI/Tab.cpp:2571 src/slic3r/GUI/Tab.cpp:2572 -#: src/slic3r/GUI/Tab.cpp:3957 src/slic3r/GUI/Tab.cpp:4585 -#: src/slic3r/GUI/Tab.cpp:4586 +#: src/slic3r/GUI/Tab.cpp:1683 src/slic3r/GUI/Tab.cpp:1684 +#: src/slic3r/GUI/Tab.cpp:2080 src/slic3r/GUI/Tab.cpp:2081 +#: src/slic3r/GUI/Tab.cpp:2486 src/slic3r/GUI/Tab.cpp:2487 +#: src/slic3r/GUI/Tab.cpp:2564 src/slic3r/GUI/Tab.cpp:2565 +#: src/slic3r/GUI/Tab.cpp:4182 src/slic3r/GUI/Tab.cpp:4822 +#: src/slic3r/GUI/Tab.cpp:4823 msgid "Notes" msgstr "메모" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:2088 +#: src/slic3r/GUI/Tab.cpp:2493 src/slic3r/GUI/Tab.cpp:2571 +#: src/slic3r/GUI/Tab.cpp:4830 src/slic3r/GUI/Tab.cpp:4996 msgid "Dependencies" msgstr "속한 그룹" -#: src/slic3r/GUI/Tab.cpp:1732 src/slic3r/GUI/Tab.cpp:2119 -#: src/slic3r/GUI/Tab.cpp:2506 src/slic3r/GUI/Tab.cpp:2579 -#: src/slic3r/GUI/Tab.cpp:4594 src/slic3r/GUI/Tab.cpp:4741 +#: src/slic3r/GUI/Tab.cpp:1691 src/slic3r/GUI/Tab.cpp:2089 +#: src/slic3r/GUI/Tab.cpp:2494 src/slic3r/GUI/Tab.cpp:2572 +#: src/slic3r/GUI/Tab.cpp:4831 src/slic3r/GUI/Tab.cpp:4997 msgid "Profile dependencies" msgstr "프로파일 속한곳" -#: src/slic3r/GUI/Tab.cpp:1771 +#: src/slic3r/GUI/Tab.cpp:1723 msgid "Post processing scripts shall modify G-code file in place." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1850 +#: src/slic3r/GUI/Tab.cpp:1802 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8426,7 +10000,7 @@ msgid_plural "" "printing time estimation." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:1855 +#: src/slic3r/GUI/Tab.cpp:1807 msgid "Found reserved keywords in" msgstr "" @@ -8434,74 +10008,90 @@ msgstr "" msgid "Filament Overrides" msgstr "필라멘트 재정의" -#: src/slic3r/GUI/Tab.cpp:1992 +#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2827 +msgid "Retraction" +msgstr "리트렉션" + +#: src/slic3r/GUI/Tab.cpp:1951 +msgid "Temperature" +msgstr "온도" + +#: src/slic3r/GUI/Tab.cpp:1955 msgid "Nozzle" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1997 +#: src/slic3r/GUI/Tab.cpp:1960 msgid "Bed" msgstr "배드(Bed)" -#: src/slic3r/GUI/Tab.cpp:2002 +#: src/slic3r/GUI/Tab.cpp:1965 msgid "Cooling" msgstr "냉각(Cooling)" -#: src/slic3r/GUI/Tab.cpp:2004 src/libslic3r/PrintConfig.cpp:1936 -#: src/libslic3r/PrintConfig.cpp:2994 +#: src/slic3r/GUI/Tab.cpp:1967 src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "Enable" msgstr "사용" -#: src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/Tab.cpp:1978 msgid "Fan settings" msgstr "팬 설정" -#: src/slic3r/GUI/Tab.cpp:2026 +#: src/slic3r/GUI/Tab.cpp:1979 +msgid "Fan speed" +msgstr "팬 속도" + +#: src/slic3r/GUI/Tab.cpp:1989 +msgid "Dynamic fan speeds" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1996 msgid "Cooling thresholds" msgstr "냉각 임계 값" -#: src/slic3r/GUI/Tab.cpp:2032 +#: src/slic3r/GUI/Tab.cpp:2002 msgid "Filament properties" msgstr "필라멘트 특성" -#: src/slic3r/GUI/Tab.cpp:2039 +#: src/slic3r/GUI/Tab.cpp:2009 msgid "Print speed override" msgstr "인쇄 속도 중단" -#: src/slic3r/GUI/Tab.cpp:2049 +#: src/slic3r/GUI/Tab.cpp:2019 msgid "Wipe tower parameters" msgstr "타워 매개변수 지우기" -#: src/slic3r/GUI/Tab.cpp:2052 +#: src/slic3r/GUI/Tab.cpp:2022 msgid "Toolchange parameters with single extruder MM printers" msgstr "MMU 프린터의 툴체인지 매개 변수" -#: src/slic3r/GUI/Tab.cpp:2065 +#: src/slic3r/GUI/Tab.cpp:2035 msgid "Ramming settings" msgstr "래밍 설정" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 -#: src/slic3r/GUI/Tab.cpp:4264 src/libslic3r/GCode.cpp:733 -#: src/libslic3r/PrintConfig.cpp:2500 +#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:2398 +#: src/slic3r/GUI/Tab.cpp:4493 src/libslic3r/GCode.cpp:684 +#: src/libslic3r/PrintConfig.cpp:2532 msgid "Custom G-code" msgstr "수동 G코드" -#: src/slic3r/GUI/Tab.cpp:2090 src/slic3r/GUI/Tab.cpp:2411 -#: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2450 -#: src/libslic3r/PrintConfig.cpp:2465 +#: src/slic3r/GUI/Tab.cpp:2060 src/slic3r/GUI/Tab.cpp:2399 +#: src/libslic3r/GCode.cpp:658 src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2497 msgid "Start G-code" msgstr "스타트 G코드" -#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:2421 -#: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:685 -#: src/libslic3r/PrintConfig.cpp:695 +#: src/slic3r/GUI/Tab.cpp:2070 src/slic3r/GUI/Tab.cpp:2409 +#: src/libslic3r/GCode.cpp:659 src/libslic3r/PrintConfig.cpp:788 +#: src/libslic3r/PrintConfig.cpp:798 msgid "End G-code" msgstr "엔드 G코드" -#: src/slic3r/GUI/Tab.cpp:2153 +#: src/slic3r/GUI/Tab.cpp:2115 msgid "Volumetric flow hints not available" msgstr "체적 흐름 힌트를 사용할 수 없음" -#: src/slic3r/GUI/Tab.cpp:2257 +#: src/slic3r/GUI/Tab.cpp:2241 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -8514,20 +10104,20 @@ msgid "" "physical_printer directory." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2291 src/slic3r/GUI/Tab.cpp:2518 +#: src/slic3r/GUI/Tab.cpp:2275 src/slic3r/GUI/Tab.cpp:2506 msgid "Size and coordinates" msgstr "크기와 좌표" -#: src/slic3r/GUI/Tab.cpp:2300 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:2284 src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "Capabilities" msgstr "기능" -#: src/slic3r/GUI/Tab.cpp:2305 +#: src/slic3r/GUI/Tab.cpp:2289 msgid "Number of extruders of the printer." msgstr "프린터 익스트루더 갯수." -#: src/slic3r/GUI/Tab.cpp:2334 +#: src/slic3r/GUI/Tab.cpp:2322 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -8538,105 +10128,101 @@ msgstr "" "모든 압출기는 동일한 직경을 가져야 합니다.\n" "모든 압출기의 지름을 첫 번째 압출기 노즐 값으로 변경하시겠습니까?" -#: src/slic3r/GUI/Tab.cpp:2338 src/slic3r/GUI/Tab.cpp:2782 -#: src/libslic3r/PrintConfig.cpp:1900 +#: src/slic3r/GUI/Tab.cpp:2326 src/slic3r/GUI/Tab.cpp:2714 +#: src/libslic3r/PrintConfig.cpp:1937 msgid "Nozzle diameter" msgstr "노즐 직경" -#: src/slic3r/GUI/Tab.cpp:2431 src/libslic3r/GCode.cpp:709 -#: src/libslic3r/PrintConfig.cpp:425 +#: src/slic3r/GUI/Tab.cpp:2419 src/libslic3r/GCode.cpp:660 +#: src/libslic3r/PrintConfig.cpp:444 msgid "Before layer change G-code" msgstr "레이어 변경 전 G 코드" -#: src/slic3r/GUI/Tab.cpp:2441 src/libslic3r/GCode.cpp:710 -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/slic3r/GUI/Tab.cpp:2429 src/libslic3r/GCode.cpp:661 +#: src/libslic3r/PrintConfig.cpp:1665 msgid "After layer change G-code" msgstr "레이어 변경 후 G 코드" -#: src/slic3r/GUI/Tab.cpp:2451 src/libslic3r/GCode.cpp:711 -#: src/libslic3r/PrintConfig.cpp:2877 +#: src/slic3r/GUI/Tab.cpp:2439 src/libslic3r/GCode.cpp:662 +#: src/libslic3r/PrintConfig.cpp:2965 msgid "Tool change G-code" msgstr "툴 채인지 G 코드" -#: src/slic3r/GUI/Tab.cpp:2461 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2449 src/libslic3r/GCode.cpp:663 msgid "Between objects G-code (for sequential printing)" msgstr "객체(object) 간 G 코드 (순차 인쇄용)" -#: src/slic3r/GUI/Tab.cpp:2471 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2459 src/libslic3r/GCode.cpp:664 msgid "Color Change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2480 src/libslic3r/GCode.cpp:714 -#: src/libslic3r/PrintConfig.cpp:2491 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:665 +#: src/libslic3r/PrintConfig.cpp:2523 msgid "Pause Print G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2489 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:666 msgid "Template Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2525 +#: src/slic3r/GUI/Tab.cpp:2513 msgid "Display" msgstr "표시" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2528 msgid "Tilt" msgstr "기울이기" -#: src/slic3r/GUI/Tab.cpp:2541 +#: src/slic3r/GUI/Tab.cpp:2529 msgid "Tilt time" msgstr "기울이기 시간" -#: src/slic3r/GUI/Tab.cpp:2548 src/slic3r/GUI/Tab.cpp:4575 +#: src/slic3r/GUI/Tab.cpp:2536 src/slic3r/GUI/Tab.cpp:4812 msgid "Corrections" msgstr "수정" -#: src/slic3r/GUI/Tab.cpp:2561 src/slic3r/GUI/Tab.cpp:4571 +#: src/slic3r/GUI/Tab.cpp:2549 src/slic3r/GUI/Tab.cpp:4808 msgid "Exposure" msgstr "노출" -#: src/slic3r/GUI/Tab.cpp:2622 src/slic3r/GUI/Tab.cpp:2709 -#: src/libslic3r/PrintConfig.cpp:1655 src/libslic3r/PrintConfig.cpp:1690 -#: src/libslic3r/PrintConfig.cpp:1707 src/libslic3r/PrintConfig.cpp:1724 -#: src/libslic3r/PrintConfig.cpp:1740 src/libslic3r/PrintConfig.cpp:1750 -#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1773 -#: src/libslic3r/PrintConfig.cpp:1783 +#: src/slic3r/GUI/Tab.cpp:2556 +msgid "Output" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2615 src/slic3r/GUI/Tab.cpp:2875 +#: src/libslic3r/PrintConfig.cpp:1694 src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1744 src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1777 src/libslic3r/PrintConfig.cpp:1787 +#: src/libslic3r/PrintConfig.cpp:1797 src/libslic3r/PrintConfig.cpp:1810 +#: src/libslic3r/PrintConfig.cpp:1820 msgid "Machine limits" msgstr "머신 한계설정" -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2638 msgid "Values in this column are for Normal mode" msgstr "이 열의 값은 일반 모드입니다" -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2644 msgid "Values in this column are for Stealth mode" msgstr "이 열의 값은 무음 모드 용입니다" -#: src/slic3r/GUI/Tab.cpp:2660 +#: src/slic3r/GUI/Tab.cpp:2653 msgid "Maximum feedrates" msgstr "최대 이송속도" -#: src/slic3r/GUI/Tab.cpp:2665 +#: src/slic3r/GUI/Tab.cpp:2658 msgid "Maximum accelerations" msgstr "최고 가속도" -#: src/slic3r/GUI/Tab.cpp:2674 +#: src/slic3r/GUI/Tab.cpp:2667 msgid "Jerk limits" msgstr "저크(Jerk)값 한계" -#: src/slic3r/GUI/Tab.cpp:2680 +#: src/slic3r/GUI/Tab.cpp:2673 msgid "Minimum feedrates" msgstr "최대 이송속도" -#: src/slic3r/GUI/Tab.cpp:2734 src/slic3r/GUI/Tab.cpp:2743 -msgid "Single extruder MM setup" -msgstr "싱글 익스트루더 MM 설정" - -#: src/slic3r/GUI/Tab.cpp:2744 -msgid "Single extruder multimaterial parameters" -msgstr "싱글 익스트루더 멀티메터리알 파라미터" - -#: src/slic3r/GUI/Tab.cpp:2779 +#: src/slic3r/GUI/Tab.cpp:2711 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -8644,29 +10230,41 @@ msgstr "" "이것은 단일 압출기 다중 재질 프린터이며 모든 압출기의 지름이 새 값으로 설정됩" "니다. 계속하시겠습니까?" -#: src/slic3r/GUI/Tab.cpp:2804 +#: src/slic3r/GUI/Tab.cpp:2739 +msgid "Reset to Filament Color" +msgstr "필라멘트 색상으로 재설정" + +#: src/slic3r/GUI/Tab.cpp:2775 +msgid "Apply below setting to other extruders" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2820 msgid "Layer height limits" msgstr "레이어 높이 한계치" -#: src/slic3r/GUI/Tab.cpp:2809 +#: src/slic3r/GUI/Tab.cpp:2824 msgid "Position (for multi-extruder printers)" msgstr "위치 (다중 익스트루더 프린터 포함)" -#: src/slic3r/GUI/Tab.cpp:2815 +#: src/slic3r/GUI/Tab.cpp:2830 msgid "Only lift Z" msgstr "Z축 올림" -#: src/slic3r/GUI/Tab.cpp:2828 +#: src/slic3r/GUI/Tab.cpp:2843 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "도구 비활성화시 리트렉션 (다중 익스트루더 고급 설정)" -#: src/slic3r/GUI/Tab.cpp:2835 -msgid "Reset to Filament Color" -msgstr "필라멘트 색상으로 재설정" +#: src/slic3r/GUI/Tab.cpp:2900 src/slic3r/GUI/Tab.cpp:2909 +msgid "Single extruder MM setup" +msgstr "싱글 익스트루더 MM 설정" + +#: src/slic3r/GUI/Tab.cpp:2910 +msgid "Single extruder multimaterial parameters" +msgstr "싱글 익스트루더 멀티메터리알 파라미터" -#: src/slic3r/GUI/Tab.cpp:3012 +#: src/slic3r/GUI/Tab.cpp:3074 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -8676,51 +10274,64 @@ msgstr "" "\n" "펌웨어 리트렉션 하려면 비활성화해야합니까?" -#: src/slic3r/GUI/Tab.cpp:3014 +#: src/slic3r/GUI/Tab.cpp:3076 msgid "Firmware Retraction" msgstr "펌웨어 레트렉션" -#: src/slic3r/GUI/Tab.cpp:3319 +#: src/slic3r/GUI/Tab.cpp:3384 msgid "New printer preset selected" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3625 +#: src/slic3r/GUI/Tab.cpp:3758 msgid "Detached" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3857 +msgid "" +"The physical printer below is based on the preset, you are going to rename." +msgid_plural "" +"The physical printers below are based on the preset, you are going to rename." +msgstr[0] "" + +#: src/slic3r/GUI/Tab.cpp:3862 +msgid "Note, that the selected preset will be renamed in this printer too." +msgid_plural "" +"Note, that the selected preset will be renamed in these printers too." +msgstr[0] "" + +#: src/slic3r/GUI/Tab.cpp:3924 msgid "remove" msgstr "제거(remove)" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3924 msgid "delete" msgstr "지우기" -#: src/slic3r/GUI/Tab.cpp:3711 +#: src/slic3r/GUI/Tab.cpp:3933 msgid "It's a last preset for this physical printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3716 +#: src/slic3r/GUI/Tab.cpp:3938 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " "\"%2%\"?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3728 +#: src/slic3r/GUI/Tab.cpp:3950 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" "The physical printers below are based on the preset, you are going to delete." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3733 +#: src/slic3r/GUI/Tab.cpp:3955 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3738 +#: src/slic3r/GUI/Tab.cpp:3960 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -8729,92 +10340,92 @@ msgid_plural "" "delete." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3743 +#: src/slic3r/GUI/Tab.cpp:3965 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" "Note, that these printers will be deleted after deleting the selected preset." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3748 +#: src/slic3r/GUI/Tab.cpp:3970 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "선택한 사전 설정의 %1%를 선택 하시겠습니까?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3753 +#: src/slic3r/GUI/Tab.cpp:3975 #, boost-format msgid "%1% Preset" msgstr "%1% 기본설정" -#: src/slic3r/GUI/Tab.cpp:3836 src/slic3r/GUI/Tab.cpp:4198 +#: src/slic3r/GUI/Tab.cpp:4061 src/slic3r/GUI/Tab.cpp:4423 msgid "Set" msgstr "설정" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:4180 msgid "Find" msgstr "찾기" -#: src/slic3r/GUI/Tab.cpp:3956 +#: src/slic3r/GUI/Tab.cpp:4181 msgid "Replace with" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4045 +#: src/slic3r/GUI/Tab.cpp:4270 msgid "Regular expression" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4049 +#: src/slic3r/GUI/Tab.cpp:4274 msgid "Case insensitive" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4053 +#: src/slic3r/GUI/Tab.cpp:4278 msgid "Whole word" msgstr "전체 단어 일치" -#: src/slic3r/GUI/Tab.cpp:4057 +#: src/slic3r/GUI/Tab.cpp:4282 msgid "Match single line" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4160 +#: src/slic3r/GUI/Tab.cpp:4385 msgid "Are you sure you want to delete all substitutions?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4292 +#: src/slic3r/GUI/Tab.cpp:4521 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4295 +#: src/slic3r/GUI/Tab.cpp:4524 msgid "" "Machine limits will NOT be emitted to G-code, however they will be used to " "estimate print time, which may therefore not be accurate as the printer may " "apply a different set of machine limits." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4299 +#: src/slic3r/GUI/Tab.cpp:4528 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4321 +#: src/slic3r/GUI/Tab.cpp:4550 msgid "LOCKED LOCK" msgstr "잠긴 잠금" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4323 +#: src/slic3r/GUI/Tab.cpp:4552 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" msgstr "" "설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4325 +#: src/slic3r/GUI/Tab.cpp:4554 msgid "UNLOCKED LOCK" msgstr "잠금 해제 잠금" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4327 +#: src/slic3r/GUI/Tab.cpp:4556 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -8826,12 +10437,12 @@ msgstr "" "잠금 해제 잠금 아이콘을 클릭하여 현재 옵션 그룹에 대한 모든 설정을 시스템(또" "는 기본값) 값으로 재설정합니다." -#: src/slic3r/GUI/Tab.cpp:4332 +#: src/slic3r/GUI/Tab.cpp:4561 msgid "WHITE BULLET" msgstr "흰색 글머리 기호" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4334 +#: src/slic3r/GUI/Tab.cpp:4563 msgid "" "for the left button: indicates a non-system (or non-default) preset,\n" "for the right button: indicates that the settings hasn't been modified." @@ -8839,12 +10450,12 @@ msgstr "" "왼쪽 단추의 경우: 비시스템(또는 기본이 아닌) 사전 설정을 나타냅니다.\n" "오른쪽 버튼: 설정이 수정되지 않았음을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4337 +#: src/slic3r/GUI/Tab.cpp:4566 msgid "BACK ARROW" msgstr "돌아가기 화살표" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4339 +#: src/slic3r/GUI/Tab.cpp:4568 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -8856,7 +10467,7 @@ msgstr "" "현재 옵션 그룹의 모든 설정을 시스템 값으로 재설정하려면 자물쇠 잠금 아이콘을 " "클릭하십시오." -#: src/slic3r/GUI/Tab.cpp:4349 +#: src/slic3r/GUI/Tab.cpp:4578 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -8864,7 +10475,7 @@ msgstr "" "LOCKED LOCK 아이콘은 설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하" "다는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4351 +#: src/slic3r/GUI/Tab.cpp:4580 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " "equal to the system (or default) values for the current option group.\n" @@ -8876,11 +10487,11 @@ msgstr "" "현재 옵션 그룹에 대한 모든 설정을 시스템(또는 기본값) 값으로 재설정하려면 클" "릭합니다." -#: src/slic3r/GUI/Tab.cpp:4354 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "WHITE BULLET 아이콘은 시스템 사전 설정이 아닌 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4357 +#: src/slic3r/GUI/Tab.cpp:4586 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -8888,7 +10499,7 @@ msgstr "" "WHITE BULLET 기호 아이콘은 설정이 현재 옵션 그룹에 대해 마지막으로 저장 된 사" "전 설정과 동일 하다는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4359 +#: src/slic3r/GUI/Tab.cpp:4588 msgid "" "BACK ARROW icon indicates that the settings were changed and are not equal " "to the last saved preset for the current option group.\n" @@ -8900,7 +10511,7 @@ msgstr "" "마지막 현재 옵션 그룹에 대 한 모든 설정 다시 설정을 클릭 하 여 사전 설정을 저" "장." -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4594 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." @@ -8908,7 +10519,7 @@ msgstr "" "LOCKED LOCK 아이콘은 값이 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니" "다." -#: src/slic3r/GUI/Tab.cpp:4366 +#: src/slic3r/GUI/Tab.cpp:4595 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -8918,7 +10529,7 @@ msgstr "" "을 나타냅니다.\n" "현재 값을 시스템(또는 기본값) 값으로 재설정하려면 클릭합니다." -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4601 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -8926,7 +10537,7 @@ msgstr "" "WHITE BULLET 기호 아이콘은 마지막으로 저장 한 사전 설정과 동일한 값을 나타냅" "니다." -#: src/slic3r/GUI/Tab.cpp:4373 +#: src/slic3r/GUI/Tab.cpp:4602 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -8936,105 +10547,103 @@ msgstr "" "을 나타냅니다.\n" "현재 값을 마지막으로 저장된 사전 설정으로 재설정하려면 클릭합니다." -#: src/slic3r/GUI/Tab.cpp:4527 src/slic3r/GUI/Tab.cpp:4529 +#: src/slic3r/GUI/Tab.cpp:4764 src/slic3r/GUI/Tab.cpp:4766 msgid "Material" msgstr "재료" -#: src/slic3r/GUI/Tab.cpp:4614 src/slic3r/GUI/Tab.cpp:4615 +#: src/slic3r/GUI/Tab.cpp:4851 src/slic3r/GUI/Tab.cpp:4852 msgid "Material printing profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4667 +#: src/slic3r/GUI/Tab.cpp:4901 msgid "Support head" msgstr "서포트 헤드" -#: src/slic3r/GUI/Tab.cpp:4672 +#: src/slic3r/GUI/Tab.cpp:4906 msgid "Support pillar" msgstr "서포트 기둥" -#: src/slic3r/GUI/Tab.cpp:4695 +#: src/slic3r/GUI/Tab.cpp:4929 msgid "Connection of the support sticks and junctions" msgstr "서포트 기둥 및 접합부 연결" -#: src/slic3r/GUI/Tab.cpp:4700 +#: src/slic3r/GUI/Tab.cpp:4956 msgid "Automatic generation" msgstr "자동 생성" -#: src/slic3r/GUI/Tab.cpp:4775 +#: src/slic3r/GUI/Tab.cpp:5024 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" "To enable \"%1%\", please switch off \"%2%\"" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3724 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3497 msgid "Object elevation" msgstr "객체(object) 고도" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3826 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3958 msgid "Pad around object" msgstr "개체 주위패드" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:153 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:162 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1047 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1100 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1115 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1130 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1145 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:147 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:156 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:165 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1107 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1122 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1137 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1152 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1197 msgid "Undef" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:772 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:792 msgid "Unsaved Changes" msgstr "미 저장된 변경점" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:790 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:810 msgid "Switching Presets: Unsaved Changes" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:832 -msgid "Old Value" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:858 +msgid "Original Value" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:859 +msgid "Modified Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:833 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:861 msgid "New Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:867 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 msgid "Keep" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1569 msgid "Transfer" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 msgid "Don't save" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 -msgid "Discard" -msgstr "" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:877 -msgid "Save" -msgstr "저장" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:898 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:926 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "create new project" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:927 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "switch a preset" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:900 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:928 msgid "" "You will not be asked about the unsaved changes in presets the next time " "you: \n" @@ -9042,178 +10651,276 @@ msgid "" "- Loading a new project while some presets are modified" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:903 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:931 msgid "PrusaSlicer will remember your action." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:904 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:932 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" "to be asked about unsaved changes again." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:964 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1772 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will not be saved" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will be discarded." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:941 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:969 msgid "Save the selected options." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:942 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:970 msgid "Keep the selected settings." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:943 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:971 msgid "Transfer the selected settings to the newly selected preset." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:947 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:975 #, boost-format msgid "Save the selected options to preset \"%1%\"." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:948 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:976 #, boost-format msgid "Transfer the selected options to the newly selected preset \"%1%\"." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1224 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1237 msgid "The following preset was modified" msgid_plural "The following presets were modified" msgstr[0] "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1230 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1243 #, boost-format msgid "Preset \"%1%\" has the following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1234 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1247 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new printer profile and it has the " "following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1235 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1248 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new print profile and it has the " "following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1297 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1850 msgid "Extruders count" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 -msgid "Select presets to compare" -msgstr "" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1326 +msgid "The preset modifications are successfully saved" +msgid_plural "The presets modifications are successfully saved" +msgstr[0] "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1515 msgid "Show all presets (including incompatible)" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1533 +msgid "Select presets to compare" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1545 msgid "Left Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1546 msgid "Right Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1595 +msgid "" +"Transfer the selected options from left preset to the right.\n" +"Note: New modified presets will be selected in settings tabs after close " +"this dialog." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1603 +msgid "Save the selected options from left preset to the right." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1621 +msgid "Transfer values from left to right" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1622 +msgid "" +"If enabled, this dialog can be used for transver selected values from left " +"to right preset." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1807 msgid "One of the presets doesn't found" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1818 msgid "Compared presets has different printer technology" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1832 msgid "Presets are the same" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1840 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef category" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef group" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:2016 +msgid "Modified" +msgstr "수정됨" + +#: src/slic3r/GUI/UpdateDialogs.cpp:41 msgid "Update available" msgstr "사용가능한 업데이트" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UpdateDialogs.cpp:41 #, c-format, boost-format msgid "New version of %s is available" msgstr "%s의 새 버전을 사용할 수 있습니다" -#: src/slic3r/GUI/UpdateDialogs.cpp:42 +#: src/slic3r/GUI/UpdateDialogs.cpp:46 src/slic3r/GUI/UpdateDialogs.cpp:101 msgid "Current version:" msgstr "현재 버전:" -#: src/slic3r/GUI/UpdateDialogs.cpp:44 +#: src/slic3r/GUI/UpdateDialogs.cpp:48 src/slic3r/GUI/UpdateDialogs.cpp:103 +#: src/slic3r/GUI/UpdateDialogs.cpp:141 msgid "New version:" msgstr "새로운 버전:" -#: src/slic3r/GUI/UpdateDialogs.cpp:52 +#: src/slic3r/GUI/UpdateDialogs.cpp:56 msgid "Changelog & Download" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:59 src/slic3r/GUI/UpdateDialogs.cpp:133 -#: src/slic3r/GUI/UpdateDialogs.cpp:191 +#: src/slic3r/GUI/UpdateDialogs.cpp:63 src/slic3r/GUI/UpdateDialogs.cpp:309 +#: src/slic3r/GUI/UpdateDialogs.cpp:367 msgid "Open changelog page" msgstr "변경 로그 페이지 열기" -#: src/slic3r/GUI/UpdateDialogs.cpp:65 +#: src/slic3r/GUI/UpdateDialogs.cpp:69 msgid "Open download page" msgstr "다운로드 페이지 열기" -#: src/slic3r/GUI/UpdateDialogs.cpp:72 +#: src/slic3r/GUI/UpdateDialogs.cpp:76 src/slic3r/GUI/UpdateDialogs.cpp:109 msgid "Don't notify about new releases any more" msgstr "새로운 수정사항에 대해 더 이상 알림 안 함" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +msgid "App Update available" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +#, c-format, boost-format +msgid "" +"New version of %s is available.\n" +"Do you wish to download it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +msgid "App Update download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +#, c-format, boost-format +msgid "New version of %s is available." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:146 +msgid "Run installer after download. (Otherwise file explorer will be opened)" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:151 +msgid "Target directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:158 +msgid "Select directory" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:176 +msgid "Select directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:193 +msgid "Download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:204 +msgid "Directory path is empty." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:212 +msgid "Directory path is incorrect." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:217 +#, boost-format +msgid "Directory %1% doesn't exists. Do you wish to create it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:222 +msgid "Failed to create directory." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:229 +#, boost-format +msgid "File %1% already exists. Do you wish to overwrite it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +#, boost-format +msgid "Download path is %1%. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:270 msgid "Opening Configuration Wizard" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 src/slic3r/GUI/UpdateDialogs.cpp:261 +#: src/slic3r/GUI/UpdateDialogs.cpp:270 src/slic3r/GUI/UpdateDialogs.cpp:437 msgid "Configuration update" msgstr "구성 업데이트" -#: src/slic3r/GUI/UpdateDialogs.cpp:95 +#: src/slic3r/GUI/UpdateDialogs.cpp:271 msgid "" "PrusaSlicer is not using the newest configuration available.\n" "Configuration Wizard may not offer the latest printers, filaments and SLA " "materials to be installed." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:97 +#: src/slic3r/GUI/UpdateDialogs.cpp:273 msgid "Configuration update is available" msgstr "구성 업데이트를 사용할 수 있음" -#: src/slic3r/GUI/UpdateDialogs.cpp:100 +#: src/slic3r/GUI/UpdateDialogs.cpp:276 msgid "" "Would you like to install it?\n" "\n" @@ -9229,28 +10936,28 @@ msgstr "" "\n" "업데이트 된 구성 번들 :" -#: src/slic3r/GUI/UpdateDialogs.cpp:121 src/slic3r/GUI/UpdateDialogs.cpp:181 +#: src/slic3r/GUI/UpdateDialogs.cpp:297 src/slic3r/GUI/UpdateDialogs.cpp:357 msgid "Comment:" msgstr "코멘트:" -#: src/slic3r/GUI/UpdateDialogs.cpp:142 +#: src/slic3r/GUI/UpdateDialogs.cpp:318 msgid "Install" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:144 +#: src/slic3r/GUI/UpdateDialogs.cpp:320 msgid "Don't install" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 src/slic3r/GUI/UpdateDialogs.cpp:212 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 src/slic3r/GUI/UpdateDialogs.cpp:388 #, c-format, boost-format msgid "%s incompatibility" msgstr "%s 비 호환성" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 msgid "You must install a configuration update." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:160 +#: src/slic3r/GUI/UpdateDialogs.cpp:336 #, c-format, boost-format msgid "" "%s will now start updates. Otherwise it won't be able to start.\n" @@ -9267,17 +10974,12 @@ msgstr "" "\n" "업데이트된 구성 번들:" -#: src/slic3r/GUI/UpdateDialogs.cpp:200 src/slic3r/GUI/UpdateDialogs.cpp:247 -#, c-format, boost-format -msgid "Exit %s" -msgstr "%s 종료" - -#: src/slic3r/GUI/UpdateDialogs.cpp:213 +#: src/slic3r/GUI/UpdateDialogs.cpp:389 #, c-format, boost-format msgid "%s configuration is incompatible" msgstr "%s 과 호환되지 않습니다" -#: src/slic3r/GUI/UpdateDialogs.cpp:216 +#: src/slic3r/GUI/UpdateDialogs.cpp:392 #, c-format, boost-format msgid "" "This version of %s is not compatible with currently installed configuration " @@ -9296,20 +10998,20 @@ msgstr "" "니다. 이렇게 하면 %s와 호환 되는 파일을 설치하기 전에 기존 구성의 백업 스냅샷" "이 생성 됩니다." -#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#: src/slic3r/GUI/UpdateDialogs.cpp:401 #, c-format, boost-format msgid "This %s version: %s" msgstr "이 %s 버전: %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:230 +#: src/slic3r/GUI/UpdateDialogs.cpp:406 msgid "Incompatible bundles:" msgstr "호환되지 않는 번들 :" -#: src/slic3r/GUI/UpdateDialogs.cpp:246 +#: src/slic3r/GUI/UpdateDialogs.cpp:422 msgid "Re-configure" msgstr "재구성" -#: src/slic3r/GUI/UpdateDialogs.cpp:265 +#: src/slic3r/GUI/UpdateDialogs.cpp:441 #, c-format, boost-format msgid "" "%s now uses an updated configuration structure.\n" @@ -9335,28 +11037,37 @@ msgstr "" "다음의 %s를 계속 진행하여 새 프리셋을 설정하고 자동 프리셋 업데이트를 사용할" "지 여부를 선택하십시오." -#: src/slic3r/GUI/UpdateDialogs.cpp:282 +#: src/slic3r/GUI/UpdateDialogs.cpp:458 msgid "For more information please visit our wiki page:" msgstr "자세한 정보는 위키 페이지를 참조하십시오 :" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 msgid "Configuration updates" msgstr "구성 업데이트" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 src/slic3r/GUI/UpdateDialogs.cpp:495 msgid "No updates available" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:304 +#: src/slic3r/GUI/UpdateDialogs.cpp:480 #, c-format, boost-format msgid "%s has no configuration updates available." msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:21 +#: src/slic3r/GUI/UpdateDialogs.cpp:495 +msgid "App update" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:500 +#, c-format, boost-format +msgid "%s has no version updates available." +msgstr "" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:23 msgid "Ramming customization" msgstr "사용자 정의 다지기(Ramming)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:54 +#: src/slic3r/GUI/WipeTowerDialog.cpp:56 msgid "" "Ramming denotes the rapid extrusion just before a tool change in a single-" "extruder MM printer. Its purpose is to properly shape the end of the " @@ -9377,49 +11088,49 @@ msgstr "" "전문가 수준의 설정이므로 잘못된 조정으로 인해 용지 걸림, 압출기 휠이 필라멘" "트 등에 연삭 될 수 있습니다." -#: src/slic3r/GUI/WipeTowerDialog.cpp:114 +#: src/slic3r/GUI/WipeTowerDialog.cpp:116 msgid "Total ramming time" msgstr "총 래밍 시간" -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 msgid "Total rammed volume" msgstr "총 레미드 양" -#: src/slic3r/GUI/WipeTowerDialog.cpp:120 +#: src/slic3r/GUI/WipeTowerDialog.cpp:122 msgid "Ramming line width" msgstr "래밍 선 너비" -#: src/slic3r/GUI/WipeTowerDialog.cpp:122 +#: src/slic3r/GUI/WipeTowerDialog.cpp:124 msgid "Ramming line spacing" msgstr "래밍 선 간격" -#: src/slic3r/GUI/WipeTowerDialog.cpp:173 +#: src/slic3r/GUI/WipeTowerDialog.cpp:175 msgid "Wipe tower - Purging volume adjustment" msgstr "와이프 타워 - 버려진 필라멘트 조절" -#: src/slic3r/GUI/WipeTowerDialog.cpp:299 +#: src/slic3r/GUI/WipeTowerDialog.cpp:301 msgid "" "Here you can adjust required purging volume (mm³) for any given pair of " "tools." msgstr "여기서 주어진 도구 쌍에 필요한 정화 용량 (mm³)을 조정할 수 있습니다." -#: src/slic3r/GUI/WipeTowerDialog.cpp:300 +#: src/slic3r/GUI/WipeTowerDialog.cpp:302 msgid "Extruder changed to" msgstr "익스트루더 번경" -#: src/slic3r/GUI/WipeTowerDialog.cpp:308 +#: src/slic3r/GUI/WipeTowerDialog.cpp:310 msgid "unloaded" msgstr "언로드(unloaded)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:309 +#: src/slic3r/GUI/WipeTowerDialog.cpp:311 msgid "loaded" msgstr "로드(loaded)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:352 +#: src/slic3r/GUI/WipeTowerDialog.cpp:354 msgid "Tool #" msgstr "도구(Tool) #" -#: src/slic3r/GUI/WipeTowerDialog.cpp:361 +#: src/slic3r/GUI/WipeTowerDialog.cpp:363 msgid "" "Total purging volume is calculated by summing two values below, depending on " "which tools are loaded/unloaded." @@ -9427,15 +11138,15 @@ msgstr "" "총 정화 량은 어느 공구가로드 / 언로드되는지에 따라 아래의 두 값을 합산하여 계" "산됩니다." -#: src/slic3r/GUI/WipeTowerDialog.cpp:362 +#: src/slic3r/GUI/WipeTowerDialog.cpp:364 msgid "Volume to purge (mm³) when the filament is being" msgstr "제거할 필라멘트 양 (mm³)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:376 +#: src/slic3r/GUI/WipeTowerDialog.cpp:378 msgid "From" msgstr "From" -#: src/slic3r/GUI/WipeTowerDialog.cpp:442 +#: src/slic3r/GUI/WipeTowerDialog.cpp:444 msgid "" "Switching to simple settings will discard changes done in the advanced " "mode!\n" @@ -9446,26 +11157,28 @@ msgstr "" "\n" "계속하시겠습니까?" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show simplified settings" msgstr "간단한 설정보기" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show advanced settings" msgstr "고급 설정보기" -#: src/slic3r/GUI/wxExtensions.cpp:644 +#: src/slic3r/GUI/wxExtensions.cpp:672 #, c-format, boost-format msgid "Switch to the %s mode" msgstr "%s 모드로 전환" -#: src/slic3r/GUI/wxExtensions.cpp:645 +#: src/slic3r/GUI/wxExtensions.cpp:673 #, c-format, boost-format msgid "Current mode is %s" msgstr "현재 모드는 %s입니다" -#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:141 -#: src/slic3r/Utils/Repetier.cpp:69 +#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:206 +#: src/slic3r/Utils/OctoPrint.cpp:255 src/slic3r/Utils/OctoPrint.cpp:666 +#: src/slic3r/Utils/OctoPrint.cpp:824 src/slic3r/Utils/OctoPrint.cpp:897 +#: src/slic3r/Utils/Repetier.cpp:88 #, c-format, boost-format msgid "Mismatched type of print host: %s" msgstr "일치 하지않는 인쇄 호스트 유형: %s" @@ -9584,69 +11297,100 @@ msgstr "" "참고 : 펌웨어 2.00.02 이상 및 활성화 된 업로드 기능이있는 FlashAir가 필요합니" "다." -#: src/slic3r/Utils/OctoPrint.cpp:164 +#: src/slic3r/Utils/OctoPrint.cpp:278 msgid "Connection to OctoPrint works correctly." msgstr "OctoPrint에 연결하면 올바르게 작동합니다." -#: src/slic3r/Utils/OctoPrint.cpp:170 +#: src/slic3r/Utils/OctoPrint.cpp:284 msgid "Could not connect to OctoPrint" msgstr "OctoPrint에 연결할 수 없습니다" -#: src/slic3r/Utils/OctoPrint.cpp:172 +#: src/slic3r/Utils/OctoPrint.cpp:286 msgid "Note: OctoPrint version at least 1.1.0 is required." msgstr "참고 : OctoPrint 버전 1.1.0 이상이 필요합니다." -#: src/slic3r/Utils/OctoPrint.cpp:292 +#: src/slic3r/Utils/OctoPrint.cpp:528 msgid "Connection to Prusa SL1 / SL1S works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:298 +#: src/slic3r/Utils/OctoPrint.cpp:534 msgid "Could not connect to Prusa SLA" msgstr "Prusa SLA에 연결할 수 없습니다" -#: src/slic3r/Utils/OctoPrint.cpp:336 +#: src/slic3r/Utils/OctoPrint.cpp:573 msgid "Connection to PrusaLink works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:342 +#: src/slic3r/Utils/OctoPrint.cpp:579 msgid "Could not connect to PrusaLink" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:61 +#: src/slic3r/Utils/OctoPrint.cpp:776 +msgid "Storages found:" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "read only" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "no free space" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:781 +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%.%2%" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:64 #, boost-format msgid "Copying of file %1% to %2% failed: %3%" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:645 -#: src/slic3r/Utils/PresetUpdater.cpp:662 +#: src/slic3r/Utils/PresetUpdater.cpp:998 +#: src/slic3r/Utils/PresetUpdater.cpp:1015 msgid "Continue and install configuration updates?" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:777 +#: src/slic3r/Utils/PresetUpdater.cpp:1021 +msgid "Installing profiles" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1071 +#, boost-format +msgid "Downloading resources for %1%." +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1171 msgid "" -"Configuration Updates causes a lost of preset modification.\n" +"Configuration Update will cause the preset modification to be lost.\n" "So, check unsaved changes and save them if necessary." msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:779 +#: src/slic3r/Utils/PresetUpdater.cpp:1173 msgid "Updating" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:808 +#: src/slic3r/Utils/PresetUpdater.cpp:1202 #, c-format, boost-format msgid "requires min. %s and max. %s" msgstr "최소. %s 와 최대. %s" -#: src/slic3r/Utils/PresetUpdater.cpp:812 +#: src/slic3r/Utils/PresetUpdater.cpp:1206 #, c-format, boost-format msgid "requires min. %s" msgstr "최소 %s가 필요 합니다" -#: src/slic3r/Utils/PresetUpdater.cpp:815 +#: src/slic3r/Utils/PresetUpdater.cpp:1209 #, c-format, boost-format msgid "requires max. %s" msgstr "최대 필요 합니다. %s" +#: src/slic3r/Utils/PresetUpdater.cpp:1362 +#, boost-format +msgid "Couldn't locate idx file %1% when performing updates." +msgstr "" + #: src/slic3r/Utils/Http.cpp:73 msgid "" "Could not detect system SSL certificate store. PrusaSlicer will be unable to " @@ -9671,30 +11415,30 @@ msgid "" "connections. See logs for additional details." msgstr "" -#: src/slic3r/Utils/Process.cpp:157 +#: src/slic3r/Utils/Process.cpp:164 msgid "Open G-code file:" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:84 +#: src/slic3r/Utils/Repetier.cpp:103 msgid "Connection to Repetier works correctly." msgstr "" -#: src/slic3r/Utils/Repetier.cpp:90 +#: src/slic3r/Utils/Repetier.cpp:109 msgid "Could not connect to Repetier" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:92 +#: src/slic3r/Utils/Repetier.cpp:111 msgid "Note: Repetier version at least 0.90.0 is required." msgstr "" -#: src/slic3r/Utils/Repetier.cpp:246 +#: src/slic3r/Utils/Repetier.cpp:263 #, boost-format msgid "" "HTTP status: %1%\n" "Message body: \"%2%\"" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:253 +#: src/slic3r/Utils/Repetier.cpp:270 #, boost-format msgid "" "Parsing of host response failed.\n" @@ -9702,7 +11446,7 @@ msgid "" "Error: \"%2%\"" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:266 +#: src/slic3r/Utils/Repetier.cpp:283 #, boost-format msgid "" "Enumeration of host printers failed.\n" @@ -9731,62 +11475,58 @@ msgstr "" msgid "Abort" msgstr "" -#: src/libslic3r/GCode.cpp:539 +#: src/libslic3r/GCode.cpp:490 msgid "There is an object with no extrusions in the first layer." msgstr "" -#: src/libslic3r/GCode.cpp:570 +#: src/libslic3r/GCode.cpp:521 #, boost-format msgid "Empty layer between %1% and %2%." msgstr "" -#: src/libslic3r/GCode.cpp:573 +#: src/libslic3r/GCode.cpp:524 msgid "(Some lines not shown)" msgstr "" -#: src/libslic3r/GCode.cpp:575 +#: src/libslic3r/GCode.cpp:526 #, boost-format msgid "Object name: %1%" msgstr "" -#: src/libslic3r/GCode.cpp:576 +#: src/libslic3r/GCode.cpp:527 msgid "" "Make sure the object is printable. This is usually caused by negligibly " "small extrusions or by a faulty model. Try to repair the model or change its " "orientation on the bed." msgstr "" -#: src/libslic3r/GCode.cpp:718 +#: src/libslic3r/GCode.cpp:669 msgid "Filament Start G-code" msgstr "" -#: src/libslic3r/GCode.cpp:725 +#: src/libslic3r/GCode.cpp:676 msgid "Filament End G-code" msgstr "" -#: src/libslic3r/GCode.cpp:764 +#: src/libslic3r/GCode.cpp:717 msgid "In the custom G-code were found reserved keywords:" msgstr "" -#: src/libslic3r/GCode.cpp:766 +#: src/libslic3r/GCode.cpp:719 msgid "" "This may cause problems in g-code visualization and printing time estimation." msgstr "" -#: src/libslic3r/GCode.cpp:1200 src/libslic3r/GCode.cpp:1211 +#: src/libslic3r/GCode.cpp:1124 src/libslic3r/GCode.cpp:1135 msgid "No extrusions were generated for objects." msgstr "" -#: src/libslic3r/GCode.cpp:1406 +#: src/libslic3r/GCode.cpp:1328 msgid "" "Your print is very close to the priming regions. Make sure there is no " "collision." msgstr "" -#: src/libslic3r/ExtrusionEntity.cpp:344 src/libslic3r/ExtrusionEntity.cpp:380 -msgid "Mixed" -msgstr "혼합" - #: src/libslic3r/Flow.cpp:61 #, boost-format msgid "" @@ -9794,32 +11534,32 @@ msgid "" msgstr "" "%1%에 대한 압출 폭을 계산할 수 없습니다: 변수 \"%2%\"에 액세스할 수 없습니다." -#: src/libslic3r/Format/3mf.cpp:1735 +#: src/libslic3r/Format/3mf.cpp:1880 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "선택한 3mf 파일은 %1%의 최신 버전으로 저장되었으며 호환되지 않습니다." -#: src/libslic3r/Format/3mf.cpp:1746 +#: src/libslic3r/Format/3mf.cpp:1891 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1750 +#: src/libslic3r/Format/3mf.cpp:1895 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1754 +#: src/libslic3r/Format/3mf.cpp:1899 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/AMF.cpp:993 +#: src/libslic3r/Format/AMF.cpp:1000 #, boost-format msgid "" "The selected amf file has been saved with a newer version of %1% and is not " @@ -9962,32 +11702,38 @@ msgstr "유효성 검사 실패" msgid "write calledback failed" msgstr "쓰기 다시 실패" -#: src/libslic3r/Print.cpp:454 +#: src/libslic3r/Print.cpp:473 msgid "All objects are outside of the print volume." msgstr "모든 객체(object)가 인쇄 볼륨 외부에 있습니다." -#: src/libslic3r/Print.cpp:457 +#: src/libslic3r/Print.cpp:476 msgid "The supplied settings will cause an empty print." msgstr "제공된 설정으로 인해 빈 인쇄가 발생합니다." -#: src/libslic3r/Print.cpp:461 +#: src/libslic3r/Print.cpp:480 msgid "Some objects are too close; your extruder will collide with them." msgstr "" "일부 객체(object)가 너무 가깝습니다. 귀하의 압출기가 그들과 충돌합니다." -#: src/libslic3r/Print.cpp:463 +#: src/libslic3r/Print.cpp:482 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." msgstr "일부 객체(object)는 너무 크고 익스트루더 충돌없이 인쇄 할 수 없습니다." -#: src/libslic3r/Print.cpp:472 +#: src/libslic3r/Print.cpp:486 +msgid "" +"Avoid crossing perimeters option and avoid crossing curled overhangs option " +"cannot be both enabled together." +msgstr "" + +#: src/libslic3r/Print.cpp:495 msgid "" "Only a single object may be printed at a time in Spiral Vase mode. Either " "remove all but the last object, or enable sequential mode by " "\"complete_objects\"." msgstr "" -#: src/libslic3r/Print.cpp:476 +#: src/libslic3r/Print.cpp:499 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." @@ -9995,7 +11741,17 @@ msgstr "" "나선형 꽃병 옵션(Spiral Vase)은 단일 재료 객체(object)를 인쇄 할 때만 사용할 " "수 있습니다." -#: src/libslic3r/Print.cpp:489 +#: src/libslic3r/Print.cpp:523 +msgid "" +"The print is taller than the maximum allowed height. You might want to " +"reduce the size of your model or change current print settings and retry." +msgstr "" + +#: src/libslic3r/Print.cpp:540 +msgid "Variable layer height is not supported with Organic supports." +msgstr "" + +#: src/libslic3r/Print.cpp:553 msgid "" "The wipe tower is only supported if all extruders have the same nozzle " "diameter and use filaments of the same diameter." @@ -10003,13 +11759,13 @@ msgstr "" "모든 압출기 의 노즐 직경이 동일하고 동일한 직경의 필라멘트를 사용하는 경우에" "만 와이프 타워가 지원됩니다." -#: src/libslic3r/Print.cpp:495 +#: src/libslic3r/Print.cpp:559 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, " "RepRapFirmware and Repetier G-code flavors." msgstr "" -#: src/libslic3r/Print.cpp:497 +#: src/libslic3r/Print.cpp:561 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." @@ -10017,24 +11773,24 @@ msgstr "" "와이프 타워는 현재 상대적 압출기 어드레싱 (use_relative_e_distances = 1)에서" "만 지원됩니다." -#: src/libslic3r/Print.cpp:499 -msgid "Ooze prevention is currently not supported with the wipe tower enabled." +#: src/libslic3r/Print.cpp:563 +msgid "" +"Ooze prevention is only supported with the wipe tower when " +"'single_extruder_multi_material' is off." msgstr "" -"현재 와이프 타워를 사용하도록 설정되어 있는 경우 스모즈 방지 기능이 지원되지 " -"않습니다." -#: src/libslic3r/Print.cpp:501 +#: src/libslic3r/Print.cpp:565 msgid "" "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." msgstr "와이프 타워는 현재 볼륨 E(use_volumetric_e=0)를 지원하지 않습니다." -#: src/libslic3r/Print.cpp:503 +#: src/libslic3r/Print.cpp:567 msgid "" "The Wipe Tower is currently not supported for multimaterial sequential " "prints." msgstr "와이프 타워는 현재 다중 재질 순차 인쇄에 지원되지 않습니다." -#: src/libslic3r/Print.cpp:524 +#: src/libslic3r/Print.cpp:577 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " "layer heights" @@ -10042,7 +11798,7 @@ msgstr "" "와이프 타워 (Wipe Tower)는 같은 레이어 높이에 경우 여러 객체(object)에 대해서" "만 지원됩니다" -#: src/libslic3r/Print.cpp:526 +#: src/libslic3r/Print.cpp:579 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "over an equal number of raft layers" @@ -10050,7 +11806,7 @@ msgstr "" "와이프 타워는 같은 수의 라프트 레이어 위에 인쇄 된 경우 여러 객체(object)에 " "대해서만 지원됩니다" -#: src/libslic3r/Print.cpp:529 +#: src/libslic3r/Print.cpp:582 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "with the same support_material_contact_distance" @@ -10058,7 +11814,7 @@ msgstr "" "와이프 타워는 동일한 support_material_contact_distance로 인쇄 된 경우 여러 객" "체(object)에 대해서만 지원됩니다" -#: src/libslic3r/Print.cpp:531 +#: src/libslic3r/Print.cpp:584 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." @@ -10066,29 +11822,29 @@ msgstr "" "와이프 타워는 똑같이 슬라이스 된 경우 여러 객체(object)에 대해서만 지원됩니" "다." -#: src/libslic3r/Print.cpp:555 +#: src/libslic3r/Print.cpp:609 msgid "" "The Wipe tower is only supported if all objects have the same variable layer " "height" msgstr "" "모든 오브젝트의 가변 레이어 높이가 같은 경우에만 지우기 타워가 지원됩니다." -#: src/libslic3r/Print.cpp:579 +#: src/libslic3r/Print.cpp:633 msgid "" "One or more object were assigned an extruder that the printer does not have." msgstr "하나 이상의 객체(object)에 프린터에없는 압출기가 지정되었습니다." -#: src/libslic3r/Print.cpp:592 +#: src/libslic3r/Print.cpp:646 #, boost-format msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" msgstr "%1%=%2% mm가 너무 낮아 레이어 높이 %3% mm에서 인쇄할 수 없습니다." -#: src/libslic3r/Print.cpp:595 +#: src/libslic3r/Print.cpp:649 #, boost-format msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" msgstr "노즐 직경 %3% mm로 인쇄할 수 있는 과도한 %1%=%2% mm" -#: src/libslic3r/Print.cpp:606 +#: src/libslic3r/Print.cpp:660 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " @@ -10099,7 +11855,7 @@ msgstr "" "(support_material_extruder == 0 또는 support_material_interface_extruder == " "0)로 인쇄되는 경우 모든 노즐은 동일한 지름이어야합니다." -#: src/libslic3r/Print.cpp:614 +#: src/libslic3r/Print.cpp:668 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers " "need to be synchronized with the object layers." @@ -10107,65 +11863,106 @@ msgstr "" "와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 객체(object) " "레이어와 동기화 해야 합니다." -#: src/libslic3r/Print.cpp:618 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only if they are " -"printed with the current extruder without triggering a tool change. (both " -"support_material_extruder and support_material_interface_extruder need to be " -"set to 0)." -msgstr "" -"와이프 타워는 현재 공구 교체를 트리거하지 않고 현재의 압출기로 인쇄 하는 경우" -"에만 비가용성 서포트를 지원 합니다. (support_material_extruder과 " -"support_material_interface_extruder 모두 0으로 설정 해야 합니다.)" - -#: src/libslic3r/Print.cpp:654 +#: src/libslic3r/Print.cpp:708 msgid "First layer height can't be greater than nozzle diameter" msgstr "첫번째 레이어 높이는 노즐 직경보다 클 수 없습니다" -#: src/libslic3r/Print.cpp:659 +#: src/libslic3r/Print.cpp:713 msgid "Layer height can't be greater than nozzle diameter" msgstr "레이어 높이는 노즐 직경보다 클 수 없습니다" -#: src/libslic3r/Print.cpp:680 +#: src/libslic3r/Print.cpp:734 msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " "layer_gcode." msgstr "" -#: src/libslic3r/Print.cpp:682 +#: src/libslic3r/Print.cpp:736 msgid "" "\"G92 E0\" was found in before_layer_gcode, which is incompatible with " "absolute extruder addressing." msgstr "" -#: src/libslic3r/Print.cpp:684 +#: src/libslic3r/Print.cpp:738 msgid "" "\"G92 E0\" was found in layer_gcode, which is incompatible with absolute " "extruder addressing." msgstr "" -#: src/libslic3r/Print.cpp:826 +#: src/libslic3r/Print.cpp:880 msgid "Infilling layers" msgstr "레이어 채우기" -#: src/libslic3r/Print.cpp:848 +#: src/libslic3r/Print.cpp:908 msgid "Generating skirt and brim" msgstr "" -#: src/libslic3r/Print.cpp:896 +#: src/libslic3r/Print.cpp:956 msgid "Exporting G-code" msgstr "G 코드 내보내기" -#: src/libslic3r/Print.cpp:900 +#: src/libslic3r/Print.cpp:960 msgid "Generating G-code" msgstr "G 코드 생성" +#: src/libslic3r/Print.cpp:1169 +msgid "Alert if supports needed" +msgstr "" + +#: src/libslic3r/Print.cpp:1174 +msgid "long bridging extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1175 +msgid "floating bridge anchors" +msgstr "" + +#: src/libslic3r/Print.cpp:1178 +msgid "collapsing overhang" +msgstr "" + +#: src/libslic3r/Print.cpp:1180 +msgid "loose extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1183 +msgid "low bed adhesion" +msgstr "" + +#: src/libslic3r/Print.cpp:1184 +msgid "floating object part" +msgstr "" + +#: src/libslic3r/Print.cpp:1185 +msgid "thin fragile section" +msgstr "" + +#: src/libslic3r/Print.cpp:1221 +msgid "Detected print stability issues" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "or" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "and" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "brim" +msgstr "" + +#: src/libslic3r/Print.cpp:1248 +msgid "Consider enabling supports" +msgstr "" + #: src/libslic3r/SLA/Pad.cpp:533 msgid "Pad brim size is too small for the current configuration." msgstr "패드 테두리 크기가 현재 구성에 너무 작습니다." -#: src/libslic3r/SLAPrint.cpp:628 +#: src/libslic3r/SLAPrint.cpp:546 msgid "" "Cannot proceed without support points! Add support points or disable support " "generation." @@ -10173,7 +11970,7 @@ msgstr "" "서포트 포인트 없이 진행할 수 없습니다! 서포트 지점을 추가 하거나 서포트 생성" "을 사용 하지 않도록 설정 합니다." -#: src/libslic3r/SLAPrint.cpp:640 +#: src/libslic3r/SLAPrint.cpp:558 msgid "" "Elevation is too low for object. Use the \"Pad around object\" feature to " "print the object without elevation." @@ -10181,7 +11978,7 @@ msgstr "" "객체의 고도가 너무 낮습니다. \"오브젝트 주위 패드\" 피쳐를 사용하여 고도 없" "이 오브젝트를 인쇄합니다." -#: src/libslic3r/SLAPrint.cpp:646 +#: src/libslic3r/SLAPrint.cpp:564 msgid "" "The endings of the support pillars will be deployed on the gap between the " "object and the pad. 'Support base safety distance' has to be greater than " @@ -10191,68 +11988,68 @@ msgstr "" "위해 '베이스 서포트 안전 거리'는 '패드 객체(object) 갭' 매개변수보다 커야 합" "니다." -#: src/libslic3r/SLAPrint.cpp:661 +#: src/libslic3r/SLAPrint.cpp:579 msgid "Exposition time is out of printer profile bounds." msgstr "박람회 시간이 프린터 프로파일 범위를 벗어났습니다." -#: src/libslic3r/SLAPrint.cpp:668 +#: src/libslic3r/SLAPrint.cpp:586 msgid "Initial exposition time is out of printer profile bounds." msgstr "초기 박람회 시간이 프린터 프로파일 범위를 벗어났습니다." -#: src/libslic3r/SLAPrint.cpp:784 +#: src/libslic3r/SLAPrint.cpp:693 msgid "Slicing done" msgstr "슬라이싱 완료" -#: src/libslic3r/SLAPrintSteps.cpp:47 +#: src/libslic3r/SLAPrintSteps.cpp:57 +msgid "Assembling model from parts" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:58 msgid "Hollowing model" msgstr "속이 빈 모델" -#: src/libslic3r/SLAPrintSteps.cpp:48 +#: src/libslic3r/SLAPrintSteps.cpp:59 msgid "Drilling holes into model." msgstr "모델에 구멍을 드릴링합니다." -#: src/libslic3r/SLAPrintSteps.cpp:49 +#: src/libslic3r/SLAPrintSteps.cpp:60 msgid "Slicing model" msgstr "슬라이싱 모델" -#: src/libslic3r/SLAPrintSteps.cpp:50 src/libslic3r/SLAPrintSteps.cpp:639 +#: src/libslic3r/SLAPrintSteps.cpp:61 src/libslic3r/SLAPrintSteps.cpp:691 msgid "Generating support points" msgstr "서포트 지점 생성" -#: src/libslic3r/SLAPrintSteps.cpp:51 +#: src/libslic3r/SLAPrintSteps.cpp:62 msgid "Generating support tree" msgstr "서포트 트리 생성" -#: src/libslic3r/SLAPrintSteps.cpp:52 +#: src/libslic3r/SLAPrintSteps.cpp:63 msgid "Generating pad" msgstr "패드 생성" -#: src/libslic3r/SLAPrintSteps.cpp:53 +#: src/libslic3r/SLAPrintSteps.cpp:64 msgid "Slicing supports" msgstr "슬라이싱 서포트즈" -#: src/libslic3r/SLAPrintSteps.cpp:68 +#: src/libslic3r/SLAPrintSteps.cpp:79 msgid "Merging slices and calculating statistics" msgstr "슬라이스 병합 및 통계 계산" -#: src/libslic3r/SLAPrintSteps.cpp:69 +#: src/libslic3r/SLAPrintSteps.cpp:80 msgid "Rasterizing layers" msgstr "레이어 래스터화" -#: src/libslic3r/SLAPrintSteps.cpp:435 -msgid "Too many overlapping holes." -msgstr "" - -#: src/libslic3r/SLAPrintSteps.cpp:442 +#: src/libslic3r/SLAPrintSteps.cpp:255 msgid "" "Mesh to be hollowed is not suitable for hollowing (does not bound a volume)." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:450 +#: src/libslic3r/SLAPrintSteps.cpp:262 msgid "Unable to drill the current configuration of holes into the model." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:470 +#: src/libslic3r/SLAPrintSteps.cpp:271 msgid "" "Drilling holes into the mesh failed. This is usually caused by broken model. " "Try to fix it first." @@ -10260,26 +12057,33 @@ msgstr "" "메시에 구멍을 뚫는 데 실패했습니다. 이는 일반적으로 모델이 손상되어 발생합니" "다. 먼저 해결해 보십시오." -#: src/libslic3r/SLAPrintSteps.cpp:476 +#: src/libslic3r/SLAPrintSteps.cpp:279 msgid "Failed to drill some holes into the model" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:520 +#: src/libslic3r/SLAPrintSteps.cpp:289 +msgid "" +"Can't perform full mesh booleans! Some parts of the print will be previewed " +"with approximated meshes. This does not affect the quality of slices or the " +"physical print in any way." +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:510 msgid "" "Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "" "내부 오류: 일치하지 않는 슬라이스 인덱스로 인해 슬라이싱을 중지해야 했습니다." -#: src/libslic3r/SLAPrintSteps.cpp:691 src/libslic3r/SLAPrintSteps.cpp:700 -#: src/libslic3r/SLAPrintSteps.cpp:738 +#: src/libslic3r/SLAPrintSteps.cpp:740 src/libslic3r/SLAPrintSteps.cpp:749 +#: src/libslic3r/SLAPrintSteps.cpp:787 msgid "Visualizing supports" msgstr "시각화 지원" -#: src/libslic3r/SLAPrintSteps.cpp:730 +#: src/libslic3r/SLAPrintSteps.cpp:779 msgid "No pad can be generated for this model with the current configuration" msgstr "현재 구성으로 이 모델에 대해 패드를 생성할 수 없습니다." -#: src/libslic3r/SLAPrintSteps.cpp:854 +#: src/libslic3r/SLAPrintSteps.cpp:908 msgid "" "There are unprintable objects. Try to adjust support settings to make the " "objects printable." @@ -10291,27 +12095,27 @@ msgstr "" msgid "Failed processing of the output_filename_format template." msgstr "아래 output_filename_format 템플리트의 처리에 실패했습니다." -#: src/libslic3r/PrintConfig.cpp:236 src/libslic3r/PrintConfig.cpp:237 +#: src/libslic3r/PrintConfig.cpp:254 src/libslic3r/PrintConfig.cpp:255 msgid "Printer technology" msgstr "프린터 기술" -#: src/libslic3r/PrintConfig.cpp:244 +#: src/libslic3r/PrintConfig.cpp:260 msgid "Bed shape" msgstr "배드 모양" -#: src/libslic3r/PrintConfig.cpp:249 +#: src/libslic3r/PrintConfig.cpp:265 msgid "Bed custom texture" msgstr "배드 사용자 정의 질감" -#: src/libslic3r/PrintConfig.cpp:254 +#: src/libslic3r/PrintConfig.cpp:270 msgid "Bed custom model" msgstr "배드 사용자 정의 모델" -#: src/libslic3r/PrintConfig.cpp:259 +#: src/libslic3r/PrintConfig.cpp:275 msgid "Elephant foot compensation" msgstr "코끼리 발(Elephant foot) 보상값" -#: src/libslic3r/PrintConfig.cpp:261 +#: src/libslic3r/PrintConfig.cpp:277 msgid "" "The first layer will be shrunk in the XY plane by the configured value to " "compensate for the 1st layer squish aka an Elephant Foot effect." @@ -10319,27 +12123,27 @@ msgstr "" "첫 번째 레이어는 구성 요소 값에 따라 XY 평면에서 수축되어 일층 스 퀴시 코끼리" "발(Elephant Foot) 효과를 보완합니다." -#: src/libslic3r/PrintConfig.cpp:269 +#: src/libslic3r/PrintConfig.cpp:285 msgid "G-code thumbnails" msgstr "" -#: src/libslic3r/PrintConfig.cpp:270 +#: src/libslic3r/PrintConfig.cpp:286 msgid "" "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " "following format: \"XxY, XxY, ...\"" msgstr "" -#: src/libslic3r/PrintConfig.cpp:276 +#: src/libslic3r/PrintConfig.cpp:292 msgid "Format of G-code thumbnails" msgstr "" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:293 msgid "" "Format of G-code thumbnails: PNG for best quality, JPG for smallest size, " "QOI for low memory firmware" msgstr "" -#: src/libslic3r/PrintConfig.cpp:288 +#: src/libslic3r/PrintConfig.cpp:301 msgid "" "This setting controls the height (and thus the total number) of the slices/" "layers. Thinner layers give better accuracy but take more time to print." @@ -10347,21 +12151,21 @@ msgstr "" "이 설정은 슬라이스/레이어의 높이(따라서 총 수)를 제어합니다. 얇은 층은 더 나" "은 정확성을 제공하지만 인쇄하는 데는 더 많은 시간이 걸린다." -#: src/libslic3r/PrintConfig.cpp:295 +#: src/libslic3r/PrintConfig.cpp:308 msgid "Max print height" msgstr "최대 프린트 높이" -#: src/libslic3r/PrintConfig.cpp:296 +#: src/libslic3r/PrintConfig.cpp:309 msgid "" "Set this to the maximum height that can be reached by your extruder while " "printing." msgstr "인쇄 중에 익스트루더가 도달 할 수있는 최대 높이로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:304 +#: src/libslic3r/PrintConfig.cpp:317 msgid "Hostname, IP or URL" msgstr "호스트 이름(Hostname), IP or URL" -#: src/libslic3r/PrintConfig.cpp:305 +#: src/libslic3r/PrintConfig.cpp:318 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the hostname, IP address or URL of the printer host instance. Print host " @@ -10370,11 +12174,11 @@ msgid "" "password@your-octopi-address/" msgstr "" -#: src/libslic3r/PrintConfig.cpp:314 +#: src/libslic3r/PrintConfig.cpp:327 msgid "API Key / Password" msgstr "API 키/암호" -#: src/libslic3r/PrintConfig.cpp:315 +#: src/libslic3r/PrintConfig.cpp:328 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the API Key or the password required for authentication." @@ -10382,11 +12186,11 @@ msgstr "" "Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 API " "키 또는 인증에 필요한 암호를 포함 해야 합니다." -#: src/libslic3r/PrintConfig.cpp:323 +#: src/libslic3r/PrintConfig.cpp:336 msgid "Name of the printer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:331 +#: src/libslic3r/PrintConfig.cpp:344 msgid "" "Custom CA certificate file can be specified for HTTPS OctoPrint connections, " "in crt/pem format. If left blank, the default OS CA certificate repository " @@ -10395,46 +12199,58 @@ msgstr "" "사용자 지정 CA 인증서 파일은 crt/pem 형식의 HTTPS 옥토 프린트 연결에 대해 지" "정할 수 있습니다. 비워 두면 기본 OS CA 인증서 리포지토리가 사용 됩니다." -#: src/libslic3r/PrintConfig.cpp:347 +#: src/libslic3r/PrintConfig.cpp:360 msgid "Password" msgstr "" -#: src/libslic3r/PrintConfig.cpp:355 +#: src/libslic3r/PrintConfig.cpp:368 msgid "Ignore HTTPS certificate revocation checks" msgstr "" -#: src/libslic3r/PrintConfig.cpp:356 +#: src/libslic3r/PrintConfig.cpp:369 msgid "" "Ignore HTTPS certificate revocation checks in case of missing or offline " "distribution points. One may want to enable this option for self signed " "certificates if connection fails." msgstr "" -#: src/libslic3r/PrintConfig.cpp:363 +#: src/libslic3r/PrintConfig.cpp:376 msgid "Printer preset names" msgstr "" -#: src/libslic3r/PrintConfig.cpp:364 +#: src/libslic3r/PrintConfig.cpp:377 msgid "Names of presets related to the physical printer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:369 +#: src/libslic3r/PrintConfig.cpp:382 msgid "Authorization Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:374 +#: src/libslic3r/PrintConfig.cpp:385 msgid "API key" msgstr "" -#: src/libslic3r/PrintConfig.cpp:375 +#: src/libslic3r/PrintConfig.cpp:386 msgid "HTTP digest" msgstr "" -#: src/libslic3r/PrintConfig.cpp:395 +#: src/libslic3r/PrintConfig.cpp:406 +msgid "Avoid crossing curled overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:407 +msgid "" +"Plan travel moves such that the extruder avoids areas where the filament may " +"be curled up. This is mostly happening on steeper rounded overhangs and may " +"cause a crash with the nozzle. This feature slows down both the print and " +"the G-code generation." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:414 msgid "Avoid crossing perimeters" msgstr "교체된 둘레를 피하세요." -#: src/libslic3r/PrintConfig.cpp:396 +#: src/libslic3r/PrintConfig.cpp:415 msgid "" "Optimize travel moves in order to minimize the crossing of perimeters. This " "is mostly useful with Bowden extruders which suffer from oozing. This " @@ -10444,11 +12260,11 @@ msgstr "" "(Bowling) 압출기가 흘러 나오기 쉬운 경우에 주로 유용합니다. 이 기능을 사용하" "면 인쇄 및 G 코드 생성 속도가 느려집니다." -#: src/libslic3r/PrintConfig.cpp:403 +#: src/libslic3r/PrintConfig.cpp:422 msgid "Avoid crossing perimeters - Max detour length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:405 +#: src/libslic3r/PrintConfig.cpp:424 msgid "" "The maximum detour length for avoid crossing perimeters. If the detour is " "longer than this value, avoid crossing perimeters is not applied for this " @@ -10456,15 +12272,15 @@ msgid "" "as percentage (for example 50%) of a direct travel path." msgstr "" -#: src/libslic3r/PrintConfig.cpp:408 +#: src/libslic3r/PrintConfig.cpp:427 msgid "mm or % (zero to disable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:2839 +#: src/libslic3r/PrintConfig.cpp:434 src/libslic3r/PrintConfig.cpp:2927 msgid "Other layers" msgstr "다른 레이어" -#: src/libslic3r/PrintConfig.cpp:416 +#: src/libslic3r/PrintConfig.cpp:435 msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." @@ -10472,11 +12288,11 @@ msgstr "" "첫 번째 레이어 이후의 레이어 온도. 이 값을 0으로 설정하면 출력에서 ​​베드 온도 " "제어 명령을 비활성화합니다." -#: src/libslic3r/PrintConfig.cpp:419 +#: src/libslic3r/PrintConfig.cpp:438 msgid "Bed temperature" msgstr "배드 온도" -#: src/libslic3r/PrintConfig.cpp:426 +#: src/libslic3r/PrintConfig.cpp:445 msgid "" "This custom code is inserted at every layer change, right before the Z move. " "Note that you can use placeholder variables for all Slic3r settings as well " @@ -10486,11 +12302,11 @@ msgstr "" "설정과 [layer_num] 및 [layer_z]에 대한 자리 표시 자 변수를 사용할 수 있습니" "다." -#: src/libslic3r/PrintConfig.cpp:436 +#: src/libslic3r/PrintConfig.cpp:455 msgid "Between objects G-code" msgstr "객체(object) 간 G 코드" -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:456 msgid "" "This code is inserted between objects when using sequential printing. By " "default extruder and bed temperature are reset using non-wait command; " @@ -10505,15 +12321,15 @@ msgstr "" "을 추가하지 않습니다. 모든 Slic3r 설정에 자리 표시 변수를 사용할 수 있으므로 " "원하는 위치에 \"M109 S [first_layer_temperature]\"명령을 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:448 +#: src/libslic3r/PrintConfig.cpp:467 msgid "Number of solid layers to generate on bottom surfaces." msgstr "바닥면에 생성 할 솔리드 레이어의 수." -#: src/libslic3r/PrintConfig.cpp:449 +#: src/libslic3r/PrintConfig.cpp:468 msgid "Bottom solid layers" msgstr "바닥 단일 레이어" -#: src/libslic3r/PrintConfig.cpp:457 +#: src/libslic3r/PrintConfig.cpp:476 msgid "" "The number of bottom solid layers is increased above bottom_solid_layers if " "necessary to satisfy minimum thickness of bottom shell." @@ -10521,15 +12337,15 @@ msgstr "" "바닥 단색 층의 수는 바닥 쉘의 최소 두께를 만족시키기 위해 필요한 경우 " "bottom_solid_layers 이상으로 증가한다." -#: src/libslic3r/PrintConfig.cpp:459 +#: src/libslic3r/PrintConfig.cpp:478 msgid "Minimum bottom shell thickness" msgstr "최소 하단 쉘 두께" -#: src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:484 msgid "Bridge" msgstr "브리지" -#: src/libslic3r/PrintConfig.cpp:466 +#: src/libslic3r/PrintConfig.cpp:485 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." @@ -10537,21 +12353,21 @@ msgstr "" "이것은 프린터가 브릿지에 사용할 가속도입니다. 브리지의 가속 제어를 사용하지 " "않으려면 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:468 src/libslic3r/PrintConfig.cpp:639 -#: src/libslic3r/PrintConfig.cpp:1192 src/libslic3r/PrintConfig.cpp:1201 -#: src/libslic3r/PrintConfig.cpp:1401 src/libslic3r/PrintConfig.cpp:1410 -#: src/libslic3r/PrintConfig.cpp:1419 src/libslic3r/PrintConfig.cpp:1713 -#: src/libslic3r/PrintConfig.cpp:1764 src/libslic3r/PrintConfig.cpp:1775 -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1983 -#: src/libslic3r/PrintConfig.cpp:1991 +#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:1252 src/libslic3r/PrintConfig.cpp:1261 +#: src/libslic3r/PrintConfig.cpp:1447 src/libslic3r/PrintConfig.cpp:1456 +#: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1750 +#: src/libslic3r/PrintConfig.cpp:1801 src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1822 src/libslic3r/PrintConfig.cpp:2013 +#: src/libslic3r/PrintConfig.cpp:2021 msgid "mm/s²" msgstr "mm/s ²" -#: src/libslic3r/PrintConfig.cpp:474 +#: src/libslic3r/PrintConfig.cpp:493 msgid "Bridging angle" msgstr "브릿지 각도" -#: src/libslic3r/PrintConfig.cpp:476 +#: src/libslic3r/PrintConfig.cpp:495 msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for all " @@ -10561,35 +12377,30 @@ msgstr "" "로 계산됩니다. 그렇지 않으면 제공된 각도가 모든 브리지에 사용됩니다. 각도 제" "로는 180 °를 사용하십시오." -#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:1102 -#: src/libslic3r/PrintConfig.cpp:2282 src/libslic3r/PrintConfig.cpp:2292 -#: src/libslic3r/PrintConfig.cpp:2583 src/libslic3r/PrintConfig.cpp:2824 -#: src/libslic3r/PrintConfig.cpp:3041 src/libslic3r/PrintConfig.cpp:3144 -#: src/libslic3r/PrintConfig.cpp:3698 src/libslic3r/PrintConfig.cpp:3819 -msgid "°" -msgstr "°" - -#: src/libslic3r/PrintConfig.cpp:485 +#: src/libslic3r/PrintConfig.cpp:504 msgid "Bridges fan speed" msgstr "브릿지 팬 속도" -#: src/libslic3r/PrintConfig.cpp:486 +#: src/libslic3r/PrintConfig.cpp:505 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "이 팬 속도는 모든 브릿지 및 오버행 중에 적용됩니다." -#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:1114 -#: src/libslic3r/PrintConfig.cpp:1601 src/libslic3r/PrintConfig.cpp:1793 -#: src/libslic3r/PrintConfig.cpp:1856 src/libslic3r/PrintConfig.cpp:2115 -#: src/libslic3r/PrintConfig.cpp:2174 src/libslic3r/PrintConfig.cpp:3323 -#: src/libslic3r/PrintConfig.cpp:3612 src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:596 +#: src/libslic3r/PrintConfig.cpp:605 src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:623 src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1893 src/libslic3r/PrintConfig.cpp:2145 +#: src/libslic3r/PrintConfig.cpp:2204 src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3369 src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3870 msgid "%" msgstr "%" -#: src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:513 msgid "Bridge flow ratio" msgstr "브릿지 유량(flow)값" -#: src/libslic3r/PrintConfig.cpp:496 +#: src/libslic3r/PrintConfig.cpp:515 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -10600,103 +12411,146 @@ msgstr "" "겨 처짐을 방지하기 위해 약간 줄일 수 있지만 기본 설정은 일반적으로 좋지만이 " "문제를 해결하기 전에 냉각 (팬 사용)을 시도해야합니다." -#: src/libslic3r/PrintConfig.cpp:506 +#: src/libslic3r/PrintConfig.cpp:525 msgid "Bridges" msgstr "브릿지(Bridges)" -#: src/libslic3r/PrintConfig.cpp:508 +#: src/libslic3r/PrintConfig.cpp:527 msgid "Speed for printing bridges." msgstr "브릿지 인쇄 속도." -#: src/libslic3r/PrintConfig.cpp:509 src/libslic3r/PrintConfig.cpp:920 -#: src/libslic3r/PrintConfig.cpp:928 src/libslic3r/PrintConfig.cpp:937 -#: src/libslic3r/PrintConfig.cpp:945 src/libslic3r/PrintConfig.cpp:972 -#: src/libslic3r/PrintConfig.cpp:991 src/libslic3r/PrintConfig.cpp:1329 -#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1620 -#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1730 -#: src/libslic3r/PrintConfig.cpp:1742 src/libslic3r/PrintConfig.cpp:1752 -#: src/libslic3r/PrintConfig.cpp:1815 src/libslic3r/PrintConfig.cpp:1874 -#: src/libslic3r/PrintConfig.cpp:2022 src/libslic3r/PrintConfig.cpp:2249 -#: src/libslic3r/PrintConfig.cpp:2258 src/libslic3r/PrintConfig.cpp:2789 -#: src/libslic3r/PrintConfig.cpp:2939 src/libslic3r/PrintConfig.cpp:2949 +#: src/libslic3r/PrintConfig.cpp:528 src/libslic3r/PrintConfig.cpp:1009 +#: src/libslic3r/PrintConfig.cpp:1017 src/libslic3r/PrintConfig.cpp:1026 +#: src/libslic3r/PrintConfig.cpp:1034 src/libslic3r/PrintConfig.cpp:1061 +#: src/libslic3r/PrintConfig.cpp:1080 src/libslic3r/PrintConfig.cpp:1386 +#: src/libslic3r/PrintConfig.cpp:1579 src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1733 src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1779 src/libslic3r/PrintConfig.cpp:1789 +#: src/libslic3r/PrintConfig.cpp:1852 src/libslic3r/PrintConfig.cpp:1911 +#: src/libslic3r/PrintConfig.cpp:2052 src/libslic3r/PrintConfig.cpp:2279 +#: src/libslic3r/PrintConfig.cpp:2288 src/libslic3r/PrintConfig.cpp:2810 +#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3037 msgid "mm/s" msgstr "mm/s" -#: src/libslic3r/PrintConfig.cpp:516 +#: src/libslic3r/PrintConfig.cpp:535 +msgid "Enable dynamic overhang speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:537 +msgid "This setting enables dynamic speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:541 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Speeds for overhang " +"sizes in between are calculated via linear interpolation. If set as " +"percentage, the speed is calculated over the external perimeter speed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:547 src/libslic3r/PrintConfig.cpp:594 +msgid "speed for 0% overlap (bridge)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:550 src/libslic3r/PrintConfig.cpp:559 +#: src/libslic3r/PrintConfig.cpp:568 src/libslic3r/PrintConfig.cpp:577 +#: src/libslic3r/PrintConfig.cpp:856 src/libslic3r/PrintConfig.cpp:1305 +#: src/libslic3r/PrintConfig.cpp:1316 src/libslic3r/PrintConfig.cpp:2387 +#: src/libslic3r/PrintConfig.cpp:2440 src/libslic3r/PrintConfig.cpp:2765 +#: src/libslic3r/PrintConfig.cpp:2997 +msgid "mm/s or %" +msgstr "mm/s 또는 %" + +#: src/libslic3r/PrintConfig.cpp:556 src/libslic3r/PrintConfig.cpp:603 +msgid "speed for 25% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:612 +msgid "speed for 50% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:574 src/libslic3r/PrintConfig.cpp:621 +msgid "speed for 75% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:583 +msgid "Enable dynamic fan speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:584 +msgid "This setting enables dynamic fan speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:589 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Fan speeds for " +"overhang sizes in between are calculated via linear interpolation. " +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:630 msgid "Brim width" msgstr "브림 폭" -#: src/libslic3r/PrintConfig.cpp:518 +#: src/libslic3r/PrintConfig.cpp:632 msgid "" "The horizontal width of the brim that will be printed around each object on " "the first layer. When raft is used, no brim is generated (use " "raft_first_layer_expansion)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:527 +#: src/libslic3r/PrintConfig.cpp:641 msgid "Brim type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:529 +#: src/libslic3r/PrintConfig.cpp:643 msgid "" "The places where the brim will be printed around each object on the first " "layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:535 +#: src/libslic3r/PrintConfig.cpp:645 msgid "No brim" msgstr "" -#: src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:646 msgid "Outer brim only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:537 +#: src/libslic3r/PrintConfig.cpp:647 msgid "Inner brim only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:538 +#: src/libslic3r/PrintConfig.cpp:648 msgid "Outer and inner brim" msgstr "" -#: src/libslic3r/PrintConfig.cpp:543 +#: src/libslic3r/PrintConfig.cpp:654 msgid "Brim separation gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:545 +#: src/libslic3r/PrintConfig.cpp:656 msgid "" "Offset of brim from the printed object. The offset is applied after the " "elephant foot compensation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:552 -msgid "Clip multi-part objects" -msgstr "여러 부품(Part) 객체(object) 클립" - -#: src/libslic3r/PrintConfig.cpp:553 -msgid "" -"When printing multi-material objects, this settings will make Slic3r to clip " -"the overlapping object parts one by the other (2nd part will be clipped by " -"the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -msgstr "" -"다중 메터리얼(multi-material) 객체(object)를 인쇄 할 때이 설정을 사용하면 겹" -"치는 객체(object) 부품(Part)를 서로 겹쳐서 잘라낼 수 있습니다 (두 번째 부분" -"은 첫 번째 부분에서 클리핑되며 세 번째 부분은 첫 번째 및 두 번째 부분에서 잘" -"립니다)." - -#: src/libslic3r/PrintConfig.cpp:560 +#: src/libslic3r/PrintConfig.cpp:663 msgid "Colorprint height" msgstr "컬러 인쇄 높이" -#: src/libslic3r/PrintConfig.cpp:561 +#: src/libslic3r/PrintConfig.cpp:664 msgid "Heights at which a filament change is to occur." msgstr "필라멘트 체인지가 발생 하는 높이." -#: src/libslic3r/PrintConfig.cpp:571 +#: src/libslic3r/PrintConfig.cpp:674 msgid "Compatible printers condition" msgstr "호환 가능한 프린터 조건" -#: src/libslic3r/PrintConfig.cpp:572 +#: src/libslic3r/PrintConfig.cpp:675 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " @@ -10705,11 +12559,11 @@ msgstr "" "활성 프린터 프로파일의 구성 값을 사용하는 부울 표현식. 이 표현식이 true로 평" "가되면이 프로필은 활성 프린터 프로필과 호환되는 것으로 간주됩니다." -#: src/libslic3r/PrintConfig.cpp:586 +#: src/libslic3r/PrintConfig.cpp:689 msgid "Compatible print profiles condition" msgstr "호환 되는 인쇄 프로 파일 조건" -#: src/libslic3r/PrintConfig.cpp:587 +#: src/libslic3r/PrintConfig.cpp:690 msgid "" "A boolean expression using the configuration values of an active print " "profile. If this expression evaluates to true, this profile is considered " @@ -10718,11 +12572,11 @@ msgstr "" "활성 인쇄 프로 파일의 구성 값을 사용하는 부울식입니다. 이 식이 true로 평가 되" "면, 이 프로필이 활성 인쇄 프로필과 호환 되는 것으로 간주 됩니다." -#: src/libslic3r/PrintConfig.cpp:604 +#: src/libslic3r/PrintConfig.cpp:707 msgid "Complete individual objects" msgstr "개별 객체(object) 완성" -#: src/libslic3r/PrintConfig.cpp:605 +#: src/libslic3r/PrintConfig.cpp:708 msgid "" "When printing multiple objects or copies, this feature will complete each " "object before moving onto next one (and starting it from its bottom layer). " @@ -10734,11 +12588,11 @@ msgstr "" "기능은 인쇄물이 망가지는 위험을 피할 때 유용합니다. Slic3r은 압출기 충돌을 경" "고하고 예방해야하지만 조재봉선하십시오." -#: src/libslic3r/PrintConfig.cpp:613 +#: src/libslic3r/PrintConfig.cpp:716 msgid "Enable auto cooling" msgstr "자동 냉각 사용" -#: src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:717 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." @@ -10746,23 +12600,23 @@ msgstr "" "이 플래그는 레이어 인쇄 시간에 따라 인쇄 속도와 팬 속도를 조정하는 자동 냉각 " "논리를 활성화합니다." -#: src/libslic3r/PrintConfig.cpp:619 +#: src/libslic3r/PrintConfig.cpp:722 msgid "Cooling tube position" msgstr "냉각 튜브 위치" -#: src/libslic3r/PrintConfig.cpp:620 +#: src/libslic3r/PrintConfig.cpp:723 msgid "Distance of the center-point of the cooling tube from the extruder tip." msgstr "압출기 팁에서 냉각 튜브의 중재봉선점까지의 거리 " -#: src/libslic3r/PrintConfig.cpp:627 +#: src/libslic3r/PrintConfig.cpp:730 msgid "Cooling tube length" msgstr "냉각 튜브 길이" -#: src/libslic3r/PrintConfig.cpp:628 +#: src/libslic3r/PrintConfig.cpp:731 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "내부의 냉각 이동을 위해 공간을 제한하는 냉각 튜브의 길이 " -#: src/libslic3r/PrintConfig.cpp:636 +#: src/libslic3r/PrintConfig.cpp:739 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " @@ -10771,11 +12625,11 @@ msgstr "" "역할 별 가속도 값이 사용 된 후에 프린터가 재설정되는 속도입니다 (둘레 / 충" "전). 가속을 전혀 재설정하지 않으려면 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:645 +#: src/libslic3r/PrintConfig.cpp:748 msgid "Default filament profile" msgstr "기본 필라멘트 프로파일" -#: src/libslic3r/PrintConfig.cpp:646 +#: src/libslic3r/PrintConfig.cpp:749 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " @@ -10784,12 +12638,12 @@ msgstr "" "현재 프린터 프로파일과 연관된 기본 필라멘트 프로파일. 현재 프린터 프로파일을 " "선택하면 이 필라멘트 프로파일이 활성화됩니다." -#: src/libslic3r/PrintConfig.cpp:652 +#: src/libslic3r/PrintConfig.cpp:755 msgid "Default print profile" msgstr "기본 인쇄 프로파일" -#: src/libslic3r/PrintConfig.cpp:653 src/libslic3r/PrintConfig.cpp:3542 -#: src/libslic3r/PrintConfig.cpp:3553 +#: src/libslic3r/PrintConfig.cpp:756 src/libslic3r/PrintConfig.cpp:3819 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -10798,11 +12652,11 @@ msgstr "" "현재 프린터 프로파일과 연관된 기본 인쇄 프로파일. 현재 프린터 프로파일을 선택" "하면이 인쇄 프로파일이 활성화됩니다." -#: src/libslic3r/PrintConfig.cpp:659 +#: src/libslic3r/PrintConfig.cpp:762 msgid "Disable fan for the first" msgstr "첫 번째 팬 사용 중지" -#: src/libslic3r/PrintConfig.cpp:660 +#: src/libslic3r/PrintConfig.cpp:763 msgid "" "You can set this to a positive value to disable fan at all during the first " "layers, so that it does not make adhesion worse." @@ -10810,26 +12664,26 @@ msgstr "" "이 값을 양수 값으로 설정하면 첫 번째 레이어에서 팬을 사용하지 않도록 설정하" "여 접착력을 악화시키지 않습니다." -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:772 msgid "Don't support bridges" msgstr "서포트와 브릿지를 사용하지 않음" -#: src/libslic3r/PrintConfig.cpp:671 +#: src/libslic3r/PrintConfig.cpp:774 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." msgstr "" "브릿지 영역 아래에 서포팅 재료가 생성되는 것을 방지하기위한 실험적 옵션." -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:780 msgid "Distance between copies" msgstr "복사본 간 거리" -#: src/libslic3r/PrintConfig.cpp:678 +#: src/libslic3r/PrintConfig.cpp:781 msgid "Distance used for the auto-arrange feature of the plater." msgstr "플래이터(plater)의 자동 정렬 기능에 사용되는 거리입니다." -#: src/libslic3r/PrintConfig.cpp:686 +#: src/libslic3r/PrintConfig.cpp:789 msgid "" "This end procedure is inserted at the end of the output file. Note that you " "can use placeholder variables for all PrusaSlicer settings." @@ -10837,7 +12691,7 @@ msgstr "" "이 끝 프로시저는 출력 파일의 끝에 삽입됩니다. 모든 PrusaSlicer 설정에 자리 표" "시자 변수를 사용할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:696 +#: src/libslic3r/PrintConfig.cpp:799 msgid "" "This end procedure is inserted at the end of the output file, before the " "printer end gcode (and before any toolchange from this filament in case of " @@ -10850,23 +12704,11 @@ msgstr "" "PrusaSlicer 설정에 자리 표시자 변수를 사용할 수 있습니다. 압출기가 여러 개 있" "는 경우 gcode는 압출기 순서로 처리됩니다." -#: src/libslic3r/PrintConfig.cpp:707 -msgid "Ensure vertical shell thickness" -msgstr "수직 쉘(shell) 두께 확인" - -#: src/libslic3r/PrintConfig.cpp:709 -msgid "" -"Add solid infill near sloping surfaces to guarantee the vertical shell " -"thickness (top+bottom solid layers)." -msgstr "" -"경사 표면 근처에 솔리드 인필을 추가하여 수직 셸 두께(상단+하단 솔리드 레이어)" -"를 보장하십시오." - -#: src/libslic3r/PrintConfig.cpp:715 +#: src/libslic3r/PrintConfig.cpp:810 msgid "Top fill pattern" msgstr "상단 채우기 패턴" -#: src/libslic3r/PrintConfig.cpp:717 +#: src/libslic3r/PrintConfig.cpp:812 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." @@ -10874,45 +12716,45 @@ msgstr "" "상단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 보이는 상위 레이어" "에만 영향을 줍니다." -#: src/libslic3r/PrintConfig.cpp:728 src/libslic3r/PrintConfig.cpp:1169 -#: src/libslic3r/PrintConfig.cpp:2754 src/libslic3r/PrintConfig.cpp:2771 +#: src/libslic3r/PrintConfig.cpp:815 src/libslic3r/PrintConfig.cpp:1228 +#: src/libslic3r/PrintConfig.cpp:2776 src/libslic3r/PrintConfig.cpp:2791 msgid "Rectilinear" msgstr "직선면(Rectilinear)" -#: src/libslic3r/PrintConfig.cpp:729 +#: src/libslic3r/PrintConfig.cpp:816 msgid "Monotonic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:730 +#: src/libslic3r/PrintConfig.cpp:817 msgid "Monotonic Lines" msgstr "" -#: src/libslic3r/PrintConfig.cpp:731 src/libslic3r/PrintConfig.cpp:1170 +#: src/libslic3r/PrintConfig.cpp:818 src/libslic3r/PrintConfig.cpp:1229 msgid "Aligned Rectilinear" msgstr "" -#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:1176 -#: src/libslic3r/PrintConfig.cpp:2772 +#: src/libslic3r/PrintConfig.cpp:819 src/libslic3r/PrintConfig.cpp:1235 +#: src/libslic3r/PrintConfig.cpp:2792 msgid "Concentric" msgstr "동심원(Concentric)" -#: src/libslic3r/PrintConfig.cpp:733 src/libslic3r/PrintConfig.cpp:1180 +#: src/libslic3r/PrintConfig.cpp:820 src/libslic3r/PrintConfig.cpp:1239 msgid "Hilbert Curve" msgstr "힐버트 곡선(Hilbert Curve)" -#: src/libslic3r/PrintConfig.cpp:734 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:821 src/libslic3r/PrintConfig.cpp:1240 msgid "Archimedean Chords" msgstr "아르키메데우스(Archimedean Chords)" -#: src/libslic3r/PrintConfig.cpp:735 src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:822 src/libslic3r/PrintConfig.cpp:1241 msgid "Octagram Spiral" msgstr "옥타그램 나선(Octagram Spiral)" -#: src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:830 msgid "Bottom fill pattern" msgstr "아래쪽 채우기 패턴" -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:832 msgid "" "Fill pattern for bottom infill. This only affects the bottom external " "visible layer, and not its adjacent solid shells." @@ -10920,12 +12762,12 @@ msgstr "" "하단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 아래쪽에 보이는 외" "부 레이어에만 영향을 줍니다." -#: src/libslic3r/PrintConfig.cpp:753 src/libslic3r/PrintConfig.cpp:765 -#: src/libslic3r/PrintConfig.cpp:1988 +#: src/libslic3r/PrintConfig.cpp:839 src/libslic3r/PrintConfig.cpp:851 +#: src/libslic3r/PrintConfig.cpp:2018 msgid "External perimeters" msgstr "외측 둘레" -#: src/libslic3r/PrintConfig.cpp:755 +#: src/libslic3r/PrintConfig.cpp:841 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " "perimeters. If left zero, default extrusion width will be used if set, " @@ -10936,18 +12778,18 @@ msgstr "" "오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경이 사" "용된다. 백분율(예: 200%)로 표현되는 경우, 레이어 높이에 걸쳐 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:758 src/libslic3r/PrintConfig.cpp:869 -#: src/libslic3r/PrintConfig.cpp:1223 src/libslic3r/PrintConfig.cpp:1445 -#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1529 -#: src/libslic3r/PrintConfig.cpp:2011 src/libslic3r/PrintConfig.cpp:2397 -#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2660 -#: src/libslic3r/PrintConfig.cpp:2895 src/libslic3r/PrintConfig.cpp:3117 -#: src/libslic3r/PrintConfig.cpp:3132 src/libslic3r/PrintConfig.cpp:3166 -#: src/libslic3r/PrintConfig.cpp:3178 +#: src/libslic3r/PrintConfig.cpp:844 src/libslic3r/PrintConfig.cpp:958 +#: src/libslic3r/PrintConfig.cpp:1283 src/libslic3r/PrintConfig.cpp:1491 +#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1570 +#: src/libslic3r/PrintConfig.cpp:2041 src/libslic3r/PrintConfig.cpp:2428 +#: src/libslic3r/PrintConfig.cpp:2601 src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2983 src/libslic3r/PrintConfig.cpp:3204 +#: src/libslic3r/PrintConfig.cpp:3219 src/libslic3r/PrintConfig.cpp:3253 +#: src/libslic3r/PrintConfig.cpp:3265 msgid "mm or %" msgstr "mm/s 또는 %" -#: src/libslic3r/PrintConfig.cpp:767 +#: src/libslic3r/PrintConfig.cpp:853 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " @@ -10957,18 +12799,11 @@ msgstr "" "(예: 80%)로 표현되는 경우 위의 Perimeter 속도 설정에 따라 계산된다. 자동을 위" "해 0으로 설정한다." -#: src/libslic3r/PrintConfig.cpp:770 src/libslic3r/PrintConfig.cpp:1245 -#: src/libslic3r/PrintConfig.cpp:1256 src/libslic3r/PrintConfig.cpp:2356 -#: src/libslic3r/PrintConfig.cpp:2409 src/libslic3r/PrintConfig.cpp:2740 -#: src/libslic3r/PrintConfig.cpp:2909 -msgid "mm/s or %" -msgstr "mm/s 또는 %" - -#: src/libslic3r/PrintConfig.cpp:777 +#: src/libslic3r/PrintConfig.cpp:863 msgid "External perimeters first" msgstr "외부 경계선 먼저" -#: src/libslic3r/PrintConfig.cpp:779 +#: src/libslic3r/PrintConfig.cpp:865 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." @@ -10976,11 +12811,11 @@ msgstr "" "기본 역순 대신 가장 바깥쪽부터 가장 안쪽까지 윤곽선을 인쇄하십시오. 타겟 TTS" "복사하기번역 저장번역 저장번역 수정." -#: src/libslic3r/PrintConfig.cpp:785 +#: src/libslic3r/PrintConfig.cpp:871 msgid "Extra perimeters if needed" msgstr "필요한 경우 추가 둘레" -#: src/libslic3r/PrintConfig.cpp:787 +#: src/libslic3r/PrintConfig.cpp:873 msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " "keeps adding perimeters, until more than 70% of the loop immediately above " @@ -10990,7 +12825,18 @@ msgstr "" "오. 위의 루프의 70% of 이상이 지지될 때까지 Slic3r는 계속해서 둘ㄹ를 추가한" "다." -#: src/libslic3r/PrintConfig.cpp:797 +#: src/libslic3r/PrintConfig.cpp:880 +msgid "Extra perimeters on overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:882 +msgid "" +"Detect overhang areas where bridges cannot be anchored, and fill them with " +"extra perimeter paths. These paths are anchored to the nearby non-overhang " +"area when possible." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:890 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " @@ -10999,7 +12845,7 @@ msgstr "" "사용할 압출부(더 구체적인 압출부 설정이 지정되지 않은 경우) 이 값은 경계 및 " "압출부를 초과하지만 지원 압출자를 주입하지는 않는다." -#: src/libslic3r/PrintConfig.cpp:809 +#: src/libslic3r/PrintConfig.cpp:898 msgid "" "Set this to the vertical distance between your nozzle tip and (usually) the " "X carriage rods. In other words, this is the height of the clearance " @@ -11010,7 +12856,7 @@ msgstr "" "다시 말하면, 이것은 당신의 압출기 주위의 틈새 실린더의 높이이며, 그것은 다른 " "인쇄된 개체와 충돌하기 전에 압출기가 엿볼 수 있는 최대 깊이를 나타낸다." -#: src/libslic3r/PrintConfig.cpp:820 +#: src/libslic3r/PrintConfig.cpp:909 msgid "" "Set this to the clearance radius around your extruder. If the extruder is " "not centered, choose the largest value for safety. This setting is used to " @@ -11020,20 +12866,20 @@ msgstr "" "으면 안전을 위해 가장 큰 값을 선택하십시오. 이 설정은 충돌 여부를 확인하고 플" "래터에 그래픽 미리 보기를 표시하기 위해 사용된다." -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:919 msgid "Extruder Color" msgstr "익스트루더 컬러" -#: src/libslic3r/PrintConfig.cpp:831 src/libslic3r/PrintConfig.cpp:894 -#: src/libslic3r/PrintConfig.cpp:3394 +#: src/libslic3r/PrintConfig.cpp:920 src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:3666 msgid "This is only used in the Slic3r interface as a visual help." msgstr "이것은 시각적 도움말로 Slic3r 접점에서만 사용된다." -#: src/libslic3r/PrintConfig.cpp:837 +#: src/libslic3r/PrintConfig.cpp:926 msgid "Extruder offset" msgstr "익스트루더 오프셋" -#: src/libslic3r/PrintConfig.cpp:838 +#: src/libslic3r/PrintConfig.cpp:927 msgid "" "If your firmware doesn't handle the extruder displacement you need the G-" "code to take it into account. This option lets you specify the displacement " @@ -11044,11 +12890,11 @@ msgstr "" "을 사용하면 첫 번째 것에 대한 각 압출기의 변위를 지정할 수 있습니다. 양의 좌" "표가 필요합니다 (XY 좌표에서 뺍니다)." -#: src/libslic3r/PrintConfig.cpp:847 +#: src/libslic3r/PrintConfig.cpp:936 msgid "Extrusion axis" msgstr "압출 축" -#: src/libslic3r/PrintConfig.cpp:848 +#: src/libslic3r/PrintConfig.cpp:937 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." @@ -11056,11 +12902,11 @@ msgstr "" "이 옵션을 사용하여 프린터의 압출기에 연결된 축 문자를 설정합니다 (보통 E이지" "만 일부 프린터는 A를 사용합니다)." -#: src/libslic3r/PrintConfig.cpp:853 +#: src/libslic3r/PrintConfig.cpp:942 msgid "Extrusion multiplier" msgstr "압출 승수" -#: src/libslic3r/PrintConfig.cpp:854 +#: src/libslic3r/PrintConfig.cpp:943 msgid "" "This factor changes the amount of flow proportionally. You may need to tweak " "this setting to get nice surface finish and correct single wall widths. " @@ -11072,11 +12918,11 @@ msgstr "" "이입니다. 이 값을 더 변경해야한다고 판단되면 필라멘트 직경과 펌웨어 E 단계를 " "확인하십시오." -#: src/libslic3r/PrintConfig.cpp:863 +#: src/libslic3r/PrintConfig.cpp:952 msgid "Default extrusion width" msgstr "기본 압출 폭" -#: src/libslic3r/PrintConfig.cpp:865 +#: src/libslic3r/PrintConfig.cpp:954 msgid "" "Set this to a non-zero value to allow a manual extrusion width. If left to " "zero, Slic3r derives extrusion widths from the nozzle diameter (see the " @@ -11089,11 +12935,11 @@ msgstr "" "의 툴팁 참조). 백분율로 표시되는 경우 (예 : 230 %) 레이어 높이를 기준으로 계" "산됩니다." -#: src/libslic3r/PrintConfig.cpp:877 +#: src/libslic3r/PrintConfig.cpp:966 msgid "Keep fan always on" msgstr "항상 팬 켜기" -#: src/libslic3r/PrintConfig.cpp:878 +#: src/libslic3r/PrintConfig.cpp:967 msgid "" "If this is enabled, fan will never be disabled and will be kept running at " "least at its minimum speed. Useful for PLA, harmful for ABS." @@ -11101,11 +12947,11 @@ msgstr "" "이 기능을 사용하면 팬이 비활성화되지 않으며 최소한 최소 속도로 계속 회전합니" "다. PLA에 유용하며 ABS에 해롭다." -#: src/libslic3r/PrintConfig.cpp:883 +#: src/libslic3r/PrintConfig.cpp:972 msgid "Enable fan if layer print time is below" msgstr "레이어 인쇄 시간이 미만인 경우 팬 활성화" -#: src/libslic3r/PrintConfig.cpp:884 +#: src/libslic3r/PrintConfig.cpp:973 msgid "" "If layer print time is estimated below this number of seconds, fan will be " "enabled and its speed will be calculated by interpolating the minimum and " @@ -11114,27 +12960,27 @@ msgstr "" "레이어 인쇄 시간이이 초 미만으로 예상되는 경우 팬이 활성화되고 속도는 최소 " "및 최대 속도를 보간하여 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:886 src/libslic3r/PrintConfig.cpp:2344 +#: src/libslic3r/PrintConfig.cpp:975 src/libslic3r/PrintConfig.cpp:2375 msgid "approximate seconds" msgstr "근사치 초" -#: src/libslic3r/PrintConfig.cpp:893 src/libslic3r/PrintConfig.cpp:3393 +#: src/libslic3r/PrintConfig.cpp:982 src/libslic3r/PrintConfig.cpp:3665 msgid "Color" msgstr "색상" -#: src/libslic3r/PrintConfig.cpp:899 +#: src/libslic3r/PrintConfig.cpp:988 msgid "Filament notes" msgstr "필라멘트 메모" -#: src/libslic3r/PrintConfig.cpp:900 +#: src/libslic3r/PrintConfig.cpp:989 msgid "You can put your notes regarding the filament here." msgstr "여기에 필라멘트에 관한 메모를 넣을 수 있다." -#: src/libslic3r/PrintConfig.cpp:908 src/libslic3r/PrintConfig.cpp:1821 +#: src/libslic3r/PrintConfig.cpp:997 src/libslic3r/PrintConfig.cpp:1858 msgid "Max volumetric speed" msgstr "최대 체적 속도" -#: src/libslic3r/PrintConfig.cpp:909 +#: src/libslic3r/PrintConfig.cpp:998 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " @@ -11143,27 +12989,27 @@ msgstr "" "이 필라멘트에 허용되는 최대 체적 속도. 인쇄물의 최대 체적 속도를 인쇄 및 필라" "멘트 체적 속도 최소로 제한한다. 제한 없음에 대해 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:1007 msgid "Loading speed" msgstr "로딩 속도" -#: src/libslic3r/PrintConfig.cpp:919 +#: src/libslic3r/PrintConfig.cpp:1008 msgid "Speed used for loading the filament on the wipe tower." msgstr "와이퍼 타워(wipe)에 필라멘트를 장착하는 데 사용되는 속도. " -#: src/libslic3r/PrintConfig.cpp:926 +#: src/libslic3r/PrintConfig.cpp:1015 msgid "Loading speed at the start" msgstr "시작시 로딩 속도" -#: src/libslic3r/PrintConfig.cpp:927 +#: src/libslic3r/PrintConfig.cpp:1016 msgid "Speed used at the very beginning of loading phase." msgstr "로딩 단계의 시작에 사용 되는 속도." -#: src/libslic3r/PrintConfig.cpp:934 +#: src/libslic3r/PrintConfig.cpp:1023 msgid "Unloading speed" msgstr "언로딩 스피드" -#: src/libslic3r/PrintConfig.cpp:935 +#: src/libslic3r/PrintConfig.cpp:1024 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." @@ -11171,20 +13017,20 @@ msgstr "" "와이퍼 타워에서 필라멘트를 언로드하는 데 사용되는 속도(램핑 후 바로 언로딩의 " "초기 부분에는 영향을 주지 않음)." -#: src/libslic3r/PrintConfig.cpp:943 +#: src/libslic3r/PrintConfig.cpp:1032 msgid "Unloading speed at the start" msgstr "시작 시 언로드 속도" -#: src/libslic3r/PrintConfig.cpp:944 +#: src/libslic3r/PrintConfig.cpp:1033 msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "속도는 램 밍 직후 필 라 멘 트의 팁을 언로딩 하는 데 사용 됩니다." -#: src/libslic3r/PrintConfig.cpp:951 +#: src/libslic3r/PrintConfig.cpp:1040 msgid "Delay after unloading" msgstr "언로드 후 딜레이" -#: src/libslic3r/PrintConfig.cpp:952 +#: src/libslic3r/PrintConfig.cpp:1041 msgid "" "Time to wait after the filament is unloaded. May help to get reliable " "toolchanges with flexible materials that may need more time to shrink to " @@ -11193,11 +13039,11 @@ msgstr "" "필라멘트를 내린 후 기다리는 시간. 원래 치수로 축소하는 데, 더 많은 시간이 필" "요할 수 있는 유연한 재료로 신뢰할 수있는 공구 교환을 얻을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:961 +#: src/libslic3r/PrintConfig.cpp:1050 msgid "Number of cooling moves" msgstr "쿨링 이동 숫자" -#: src/libslic3r/PrintConfig.cpp:962 +#: src/libslic3r/PrintConfig.cpp:1051 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " "Specify desired number of these moves." @@ -11205,19 +13051,19 @@ msgstr "" "필라멘트는 쿨링 튜브에서 앞뒤로 이동 하여 냉각 됩니다. 이러한 이동의 원하는 " "값을 지정 합니다." -#: src/libslic3r/PrintConfig.cpp:970 +#: src/libslic3r/PrintConfig.cpp:1059 msgid "Speed of the first cooling move" msgstr "첫 번째 냉각 이동 속도" -#: src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:1060 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "냉각 속도가 서서히 빨라지고 있습니다." -#: src/libslic3r/PrintConfig.cpp:978 +#: src/libslic3r/PrintConfig.cpp:1067 msgid "Minimal purge on wipe tower" msgstr "와이프(wipe) 탑의 최소 퍼지" -#: src/libslic3r/PrintConfig.cpp:979 +#: src/libslic3r/PrintConfig.cpp:1068 msgid "" "After a tool change, the exact position of the newly loaded filament inside " "the nozzle may not be known, and the filament pressure is likely not yet " @@ -11231,23 +13077,23 @@ msgstr "" "를 와이프 탑에 넣어 연속적인 채우기 또는 희생(sacrificial) 객체(object) 돌출" "을 안정적으로 생성 합니다." -#: src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:1072 msgid "mm³" msgstr "mm ³" -#: src/libslic3r/PrintConfig.cpp:989 +#: src/libslic3r/PrintConfig.cpp:1078 msgid "Speed of the last cooling move" msgstr "마지막 냉각 이동 속도" -#: src/libslic3r/PrintConfig.cpp:990 +#: src/libslic3r/PrintConfig.cpp:1079 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "냉각은 이 속도쪽으로 점차 가속화되고 있습니다. " -#: src/libslic3r/PrintConfig.cpp:997 +#: src/libslic3r/PrintConfig.cpp:1086 msgid "Filament load time" msgstr "필라멘트 로드 시간" -#: src/libslic3r/PrintConfig.cpp:998 +#: src/libslic3r/PrintConfig.cpp:1087 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " "filament during a tool change (when executing the T code). This time is " @@ -11257,22 +13103,22 @@ msgstr "" "라멘트를 로드하는 시간입니다. 이 시간은 G 코드 시간 추정기에 의해 총 인쇄 시" "간에 추가 됩니다." -#: src/libslic3r/PrintConfig.cpp:1005 +#: src/libslic3r/PrintConfig.cpp:1094 msgid "Ramming parameters" msgstr "래밍 파라미터" -#: src/libslic3r/PrintConfig.cpp:1006 +#: src/libslic3r/PrintConfig.cpp:1095 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." msgstr "" "이 문자열은 RammingDialog에 의해 편집되고 래밍 특정 매개 변수를 포함합니다." -#: src/libslic3r/PrintConfig.cpp:1012 +#: src/libslic3r/PrintConfig.cpp:1101 msgid "Filament unload time" msgstr "필라멘트 언로드 시간" -#: src/libslic3r/PrintConfig.cpp:1013 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " "filament during a tool change (when executing the T code). This time is " @@ -11282,7 +13128,7 @@ msgstr "" "입니다 (T 코드를 실행할 때). 이 시간은 G 코드 시간추정기에 의해 총 인쇄 시간" "에 추가 됩니다." -#: src/libslic3r/PrintConfig.cpp:1021 +#: src/libslic3r/PrintConfig.cpp:1110 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " @@ -11291,12 +13137,12 @@ msgstr "" "여기에 필라멘트 직경을 입력하십시오. 정밀도가 필요하므로 캘리퍼를 사용하여 필" "라멘트를 따라 여러 번 측정 한 다음 평균을 계산하십시오." -#: src/libslic3r/PrintConfig.cpp:1028 src/libslic3r/PrintConfig.cpp:3432 -#: src/libslic3r/PrintConfig.cpp:3433 +#: src/libslic3r/PrintConfig.cpp:1117 src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3710 msgid "Density" msgstr "밀도" -#: src/libslic3r/PrintConfig.cpp:1029 +#: src/libslic3r/PrintConfig.cpp:1118 msgid "" "Enter your filament density here. This is only for statistical information. " "A decent way is to weigh a known length of filament and compute the ratio of " @@ -11307,41 +13153,41 @@ msgstr "" "은 알려진 길이의 필라멘트의 무게를 측정하고 길이와 볼륨의 비율을 계산하는 것" "입니다. 변위를 통해 직접적으로 부피를 계산하는 것이 더 좋습니다." -#: src/libslic3r/PrintConfig.cpp:1032 +#: src/libslic3r/PrintConfig.cpp:1121 msgid "g/cm³" msgstr "g/cm³" -#: src/libslic3r/PrintConfig.cpp:1037 +#: src/libslic3r/PrintConfig.cpp:1126 msgid "Filament type" msgstr "필라멘트 타입" -#: src/libslic3r/PrintConfig.cpp:1038 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "The filament material type for use in custom G-codes." msgstr "사용자 지정 G 코드에 사용할 필라멘트재료 유형입니다." -#: src/libslic3r/PrintConfig.cpp:1066 +#: src/libslic3r/PrintConfig.cpp:1155 msgid "Soluble material" msgstr "수용성 재료" -#: src/libslic3r/PrintConfig.cpp:1067 +#: src/libslic3r/PrintConfig.cpp:1156 msgid "Soluble material is most likely used for a soluble support." msgstr "수용성 재료눈 물에 녹는 서포트에 가장 많이 사용된다." -#: src/libslic3r/PrintConfig.cpp:1073 +#: src/libslic3r/PrintConfig.cpp:1162 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." msgstr "필라멘트(kg당) 비용을 여기에 입력하십시오. 통계를 내기 위해서 입니다." -#: src/libslic3r/PrintConfig.cpp:1074 +#: src/libslic3r/PrintConfig.cpp:1163 msgid "money/kg" msgstr "원(\\)/kg" -#: src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1168 msgid "Spool weight" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1080 +#: src/libslic3r/PrintConfig.cpp:1169 msgid "" "Enter weight of the empty filament spool. One may weigh a partially consumed " "filament spool before printing and one may compare the measured weight with " @@ -11349,19 +13195,19 @@ msgid "" "amount of filament on the spool is sufficient to finish the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1084 +#: src/libslic3r/PrintConfig.cpp:1173 msgid "g" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1093 src/libslic3r/PrintConfig.cpp:3537 +#: src/libslic3r/PrintConfig.cpp:1182 src/libslic3r/PrintConfig.cpp:3814 msgid "(Unknown)" msgstr "(알 수 없음)" -#: src/libslic3r/PrintConfig.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:1186 msgid "Fill angle" msgstr "채움 각도" -#: src/libslic3r/PrintConfig.cpp:1099 +#: src/libslic3r/PrintConfig.cpp:1188 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " @@ -11371,63 +13217,63 @@ msgstr "" "지 할 수있는 최상의 방향을 사용하여 브릿징이 채워지므로이 설정은 영향을 미치" "지 않습니다." -#: src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1199 msgid "Fill density" msgstr "채우기(fill) 밀도" -#: src/libslic3r/PrintConfig.cpp:1113 +#: src/libslic3r/PrintConfig.cpp:1201 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "0 % - 100 % 범위로 표현 된 내부 채움(infill)의 밀도." -#: src/libslic3r/PrintConfig.cpp:1148 +#: src/libslic3r/PrintConfig.cpp:1224 msgid "Fill pattern" msgstr "채우기(fill) 패턴" -#: src/libslic3r/PrintConfig.cpp:1150 +#: src/libslic3r/PrintConfig.cpp:1226 msgid "Fill pattern for general low-density infill." msgstr "일반 낮은 밀도 채움의 패턴." -#: src/libslic3r/PrintConfig.cpp:1171 src/libslic3r/PrintConfig.cpp:2803 +#: src/libslic3r/PrintConfig.cpp:1230 src/libslic3r/PrintConfig.cpp:2822 msgid "Grid" msgstr "그리드(Grid)" -#: src/libslic3r/PrintConfig.cpp:1173 +#: src/libslic3r/PrintConfig.cpp:1232 msgid "Stars" msgstr "별(Stars)" -#: src/libslic3r/PrintConfig.cpp:1174 +#: src/libslic3r/PrintConfig.cpp:1233 msgid "Cubic" msgstr "큐빅" -#: src/libslic3r/PrintConfig.cpp:1175 +#: src/libslic3r/PrintConfig.cpp:1234 msgid "Line" msgstr "선(Line)" -#: src/libslic3r/PrintConfig.cpp:1177 src/libslic3r/PrintConfig.cpp:2756 +#: src/libslic3r/PrintConfig.cpp:1236 src/libslic3r/PrintConfig.cpp:2778 msgid "Honeycomb" msgstr "벌집" -#: src/libslic3r/PrintConfig.cpp:1178 +#: src/libslic3r/PrintConfig.cpp:1237 msgid "3D Honeycomb" msgstr "3D 벌집" -#: src/libslic3r/PrintConfig.cpp:1179 +#: src/libslic3r/PrintConfig.cpp:1238 msgid "Gyroid" msgstr "자이로이드(Gyroid)" -#: src/libslic3r/PrintConfig.cpp:1183 +#: src/libslic3r/PrintConfig.cpp:1242 msgid "Adaptive Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1184 +#: src/libslic3r/PrintConfig.cpp:1243 msgid "Support Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1185 +#: src/libslic3r/PrintConfig.cpp:1244 msgid "Lightning" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1190 +#: src/libslic3r/PrintConfig.cpp:1250 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." @@ -11435,22 +13281,22 @@ msgstr "" "이것은 프린터가 첫 번째 레이어에 사용할 가속도입니다. 0을 설정하면 첫 번째 레" "이어에 대한 가속 제어가 사용되지 않습니다." -#: src/libslic3r/PrintConfig.cpp:1198 +#: src/libslic3r/PrintConfig.cpp:1258 msgid "First object layer over raft interface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1199 +#: src/libslic3r/PrintConfig.cpp:1259 msgid "" "This is the acceleration your printer will use for first layer of object " "above raft interface. Set zero to disable acceleration control for first " "layer of object above raft interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "First layer bed temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1209 +#: src/libslic3r/PrintConfig.cpp:1269 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." @@ -11458,7 +13304,7 @@ msgstr "" "첫 번째 레이어에 대한 빌드 플레이트 온도를 가열. 이 값을 0으로 설정하면 출력" "에서 ​​베드 온도 제어 명령을 비활성화합니다." -#: src/libslic3r/PrintConfig.cpp:1219 +#: src/libslic3r/PrintConfig.cpp:1279 msgid "" "Set this to a non-zero value to set a manual extrusion width for first " "layer. You can use this to force fatter extrudates for better adhesion. If " @@ -11470,18 +13316,18 @@ msgstr "" "수 있습니다. 백분율 (예 : 120 %)로 표현하면 첫 번째 레이어 높이를 기준으로 계" "산됩니다. 0으로 설정하면 기본 압출 폭이 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1293 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " "plates." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1301 msgid "First layer speed" msgstr "첫 레이어 속도" -#: src/libslic3r/PrintConfig.cpp:1242 +#: src/libslic3r/PrintConfig.cpp:1302 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " @@ -11491,11 +13337,11 @@ msgstr "" "인쇄 이동에 적용된다. 백분율(예: 40%)로 표현되는 경우 기본 속도를 스케일링한" "다." -#: src/libslic3r/PrintConfig.cpp:1252 +#: src/libslic3r/PrintConfig.cpp:1312 msgid "Speed of object first layer over raft interface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1253 +#: src/libslic3r/PrintConfig.cpp:1313 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first object layer above raft interface, regardless " @@ -11503,22 +13349,22 @@ msgid "" "the default speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1263 +#: src/libslic3r/PrintConfig.cpp:1323 msgid "First layer nozzle temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1264 +#: src/libslic3r/PrintConfig.cpp:1324 msgid "" "Nozzle temperature for the first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " "commands in the output G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1272 +#: src/libslic3r/PrintConfig.cpp:1332 msgid "Full fan speed at layer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1273 +#: src/libslic3r/PrintConfig.cpp:1333 msgid "" "Fan speed will be ramped up linearly from zero at layer " "\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". " @@ -11527,50 +13373,54 @@ msgid "" "maximum allowed speed at layer \"disable_fan_first_layers\" + 1." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1285 +#: src/libslic3r/PrintConfig.cpp:1345 msgid "Fuzzy skin type." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1348 msgid "Outside walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1293 +#: src/libslic3r/PrintConfig.cpp:1349 msgid "All walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1298 +#: src/libslic3r/PrintConfig.cpp:1355 msgid "Fuzzy skin thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1300 +#: src/libslic3r/PrintConfig.cpp:1357 msgid "" "The maximum distance that each skin point can be offset (both ways), " "measured perpendicular to the perimeter wall." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1308 +#: src/libslic3r/PrintConfig.cpp:1365 msgid "Fuzzy skin point distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1310 +#: src/libslic3r/PrintConfig.cpp:1367 msgid "" "Perimeters will be split into multiple segments by inserting Fuzzy skin " "points. Lowering the Fuzzy skin point distance will increase the number of " "randomly offset points on the perimeter wall." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1318 +#: src/libslic3r/PrintConfig.cpp:1375 msgid "Fill gaps" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1320 +#: src/libslic3r/PrintConfig.cpp:1377 msgid "" "Enables filling of gaps between perimeters and between the inner most " "perimeters and infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1327 +#: src/libslic3r/PrintConfig.cpp:1382 +msgid "Gap fill" +msgstr "공백 채움" + +#: src/libslic3r/PrintConfig.cpp:1384 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " @@ -11580,11 +13430,11 @@ msgstr "" "기 위해 이것을 합리적으로 낮게 유지한다. 간격 채우기를 사용하지 않으려면 0을 " "설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1335 +#: src/libslic3r/PrintConfig.cpp:1392 msgid "Verbose G-code" msgstr "세부 G-code" -#: src/libslic3r/PrintConfig.cpp:1336 +#: src/libslic3r/PrintConfig.cpp:1393 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " @@ -11594,11 +13444,11 @@ msgstr "" "을 선택하십시오. 만일 당신이 SD카드로 인쇄한다면, 파일의 추가 무게로 인해 펌" "웨어의 속도가 느려질 수 있다." -#: src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1400 msgid "G-code flavor" msgstr "G-code 형식" -#: src/libslic3r/PrintConfig.cpp:1344 +#: src/libslic3r/PrintConfig.cpp:1401 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " @@ -11609,15 +13459,15 @@ msgstr "" "력을 얻으려면 프린터의 펌웨어로 이 옵션을 설정합니다. \"돌출 없음\" 맛은 " "PrusaSlicer가 압출 값을 전혀 내보내지 못하게 합니다." -#: src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1416 msgid "No extrusion" msgstr "압출 없음" -#: src/libslic3r/PrintConfig.cpp:1376 +#: src/libslic3r/PrintConfig.cpp:1422 msgid "Label objects" msgstr "레이블 객체(object)" -#: src/libslic3r/PrintConfig.cpp:1377 +#: src/libslic3r/PrintConfig.cpp:1423 msgid "" "Enable this to add comments into the G-Code labeling print moves with what " "object they belong to, which is useful for the Octoprint CancelObject " @@ -11629,19 +13479,19 @@ msgstr "" "에 유용 합니다. 이 설정은 단일 압출 기 다중 재료 설정과 호환 되지 않으며 객체" "(object)를 닦아 내 고 채우기로 닦습니다." -#: src/libslic3r/PrintConfig.cpp:1384 +#: src/libslic3r/PrintConfig.cpp:1430 msgid "G-code substitutions" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1385 +#: src/libslic3r/PrintConfig.cpp:1431 msgid "Find / replace patterns in G-code lines and substitute them." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1390 +#: src/libslic3r/PrintConfig.cpp:1436 msgid "High extruder current on filament swap" msgstr "필라멘트스왑에 높은 압출 기 전류" -#: src/libslic3r/PrintConfig.cpp:1391 +#: src/libslic3r/PrintConfig.cpp:1437 msgid "" "It may be beneficial to increase the extruder motor current during the " "filament exchange sequence to allow for rapid ramming feed rates and to " @@ -11651,7 +13501,7 @@ msgstr "" "는 빠른 래밍 공급 속도를 가능 하게하고, 불규칙한 모양의 필라멘트를 로딩할때 " "저항을 극복하기 위한것이다." -#: src/libslic3r/PrintConfig.cpp:1399 +#: src/libslic3r/PrintConfig.cpp:1445 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." @@ -11659,23 +13509,33 @@ msgstr "" "이것은 당신 프린터의 채움 가속력이다. 주입에 대한 가속 제어를 비활성화하려면 " "0을 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1408 +#: src/libslic3r/PrintConfig.cpp:1453 src/libslic3r/PrintConfig.cpp:2423 +#: src/libslic3r/PrintConfig.cpp:2435 +msgid "Solid infill" +msgstr "솔리드 인필" + +#: src/libslic3r/PrintConfig.cpp:1454 msgid "" "This is the acceleration your printer will use for solid infill. Set zero to " "use the value for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:2977 +#: src/libslic3r/PrintConfig.cpp:2990 +msgid "Top solid infill" +msgstr "가장 윗부분 채움" + +#: src/libslic3r/PrintConfig.cpp:1463 msgid "" "This is the acceleration your printer will use for top solid infill. Set " "zero to use the value for solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1426 +#: src/libslic3r/PrintConfig.cpp:1472 msgid "Combine infill every" msgstr "다음 레이어마다 결합" -#: src/libslic3r/PrintConfig.cpp:1428 +#: src/libslic3r/PrintConfig.cpp:1474 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." @@ -11683,15 +13543,15 @@ msgstr "" "이 기능은 인필을 결합하고 얇은 주변기기를 보존하면서 두꺼운 인필 층을 압출하" "여 인쇄 속도를 높일 수 있도록 하여 정확도를 높인다." -#: src/libslic3r/PrintConfig.cpp:1431 +#: src/libslic3r/PrintConfig.cpp:1477 msgid "Combine infill every n layers" msgstr "모든 n개 층을 채우기 위해 결합" -#: src/libslic3r/PrintConfig.cpp:1437 +#: src/libslic3r/PrintConfig.cpp:1483 msgid "Length of the infill anchor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1439 +#: src/libslic3r/PrintConfig.cpp:1485 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -11704,35 +13564,35 @@ msgid "" "perimeters connected to a single infill line." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1455 +#: src/libslic3r/PrintConfig.cpp:1495 msgid "0 (no open anchors)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1456 src/libslic3r/PrintConfig.cpp:1479 +#: src/libslic3r/PrintConfig.cpp:1496 src/libslic3r/PrintConfig.cpp:1519 msgid "1 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1457 src/libslic3r/PrintConfig.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:1520 msgid "2 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1458 src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1498 src/libslic3r/PrintConfig.cpp:1521 msgid "5 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1459 src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1499 src/libslic3r/PrintConfig.cpp:1522 msgid "10 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1460 src/libslic3r/PrintConfig.cpp:1483 +#: src/libslic3r/PrintConfig.cpp:1500 src/libslic3r/PrintConfig.cpp:1523 msgid "1000 (unlimited)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1465 +#: src/libslic3r/PrintConfig.cpp:1506 msgid "Maximum length of the infill anchor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1508 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -11744,19 +13604,19 @@ msgid "" "parameter. Set this parameter to zero to disable anchoring." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1478 +#: src/libslic3r/PrintConfig.cpp:1518 msgid "0 (not anchored)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1488 +#: src/libslic3r/PrintConfig.cpp:1529 msgid "Infill extruder" msgstr "채움(Infill) 익스트루더" -#: src/libslic3r/PrintConfig.cpp:1490 +#: src/libslic3r/PrintConfig.cpp:1531 msgid "The extruder to use when printing infill." msgstr "채움으로 사용할 익스트루더." -#: src/libslic3r/PrintConfig.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:1539 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill. If " "left zero, default extrusion width will be used if set, otherwise 1.125 x " @@ -11770,21 +13630,21 @@ msgstr "" "형물을 사용하는 것이 좋습니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기" "준으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1550 msgid "Infill before perimeters" msgstr "둘레보다 앞쪽에 채움" -#: src/libslic3r/PrintConfig.cpp:1510 +#: src/libslic3r/PrintConfig.cpp:1551 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." msgstr "이 옵션은 외부출력과 채움 인쇄 순서를 바꾸어, 후자를 먼저 만든다." -#: src/libslic3r/PrintConfig.cpp:1515 +#: src/libslic3r/PrintConfig.cpp:1556 msgid "Only infill where needed" msgstr "필요한 경우 채움" -#: src/libslic3r/PrintConfig.cpp:1517 +#: src/libslic3r/PrintConfig.cpp:1558 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " @@ -11794,11 +13654,11 @@ msgstr "" "을 할 것이다). 활성화된 경우 관련된 여러 번의 점검으로 인해 G-code 생성 속도" "를 늦춰라." -#: src/libslic3r/PrintConfig.cpp:1524 +#: src/libslic3r/PrintConfig.cpp:1565 msgid "Infill/perimeters overlap" msgstr "채움/둘레 겹침(perimeters overlap)" -#: src/libslic3r/PrintConfig.cpp:1526 +#: src/libslic3r/PrintConfig.cpp:1567 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -11809,23 +13669,23 @@ msgstr "" "론적으로 이것은 필요하지 않아야하지만 백래시가 갭을 유발할 수 있습니다. 백분" "율 (예 : 15 %)로 표시되는 경우 경계 압출 폭을 기준으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "내부 채우기 인쇄 속도. 자동으로 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1545 +#: src/libslic3r/PrintConfig.cpp:1586 msgid "Inherits profile" msgstr "프로필 상속" -#: src/libslic3r/PrintConfig.cpp:1546 +#: src/libslic3r/PrintConfig.cpp:1587 msgid "Name of the profile, from which this profile inherits." msgstr "이 프로파일이 상속되는 프로파일의 이름." -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1600 msgid "Interface shells" msgstr "접점 셸(shells)" -#: src/libslic3r/PrintConfig.cpp:1560 +#: src/libslic3r/PrintConfig.cpp:1601 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " @@ -11834,61 +13694,61 @@ msgstr "" "인접 재료/볼륨 사이에 고체 쉘 생성을 강제하십시오. 반투명 재료 또는 수동 수용" "성 서포트 재료를 사용한 다중 압ㅊ기 인쇄에 유용함." -#: src/libslic3r/PrintConfig.cpp:1568 +#: src/libslic3r/PrintConfig.cpp:1609 msgid "Maximum width of a segmented region" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1569 +#: src/libslic3r/PrintConfig.cpp:1610 msgid "Maximum width of a segmented region. Zero disables this feature." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1570 src/libslic3r/PrintConfig.cpp:2189 -#: src/libslic3r/PrintConfig.cpp:2198 +#: src/libslic3r/PrintConfig.cpp:1611 src/libslic3r/PrintConfig.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2228 msgid "mm (zero to disable)" msgstr "mm (0은 비활성화)" -#: src/libslic3r/PrintConfig.cpp:1577 +#: src/libslic3r/PrintConfig.cpp:1618 msgid "Enable ironing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1578 +#: src/libslic3r/PrintConfig.cpp:1619 msgid "" "Enable ironing of the top layers with the hot print head for smooth surface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1584 src/libslic3r/PrintConfig.cpp:1586 +#: src/libslic3r/PrintConfig.cpp:1625 src/libslic3r/PrintConfig.cpp:1627 msgid "Ironing Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1591 +#: src/libslic3r/PrintConfig.cpp:1629 msgid "All top surfaces" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Topmost surface only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1593 +#: src/libslic3r/PrintConfig.cpp:1631 msgid "All solid surfaces" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1598 +#: src/libslic3r/PrintConfig.cpp:1637 msgid "Flow rate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Percent of a flow rate relative to object's normal layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1608 +#: src/libslic3r/PrintConfig.cpp:1647 msgid "Spacing between ironing passes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1649 msgid "Distance between ironing lines" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1627 +#: src/libslic3r/PrintConfig.cpp:1666 msgid "" "This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can " @@ -11900,11 +13760,11 @@ msgstr "" "[layer_num] 및 [layer_z]에 자리 표시자 변수를 사용할 수 있다는 점에 유의하십" "시오." -#: src/libslic3r/PrintConfig.cpp:1638 +#: src/libslic3r/PrintConfig.cpp:1677 msgid "Supports remaining times" msgstr "남은 시간 지원" -#: src/libslic3r/PrintConfig.cpp:1639 +#: src/libslic3r/PrintConfig.cpp:1678 msgid "" "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " "intervals into the G-code to let the firmware show accurate remaining time. " @@ -11916,155 +13776,155 @@ msgstr "" "웨어는 M73를 인식 하 고 있습니다. 또한 i3 MK3 펌웨어는 자동 모드에서 M73 Qxx " "Sxx를 지원 합니다." -#: src/libslic3r/PrintConfig.cpp:1647 +#: src/libslic3r/PrintConfig.cpp:1686 msgid "Supports stealth mode" msgstr "자동 모드 지원" -#: src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1687 msgid "The firmware supports stealth mode" msgstr "펌웨어는 스텔스 모드를 지원 합니다" -#: src/libslic3r/PrintConfig.cpp:1653 +#: src/libslic3r/PrintConfig.cpp:1692 msgid "How to apply limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1654 +#: src/libslic3r/PrintConfig.cpp:1693 msgid "Purpose of Machine Limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1656 +#: src/libslic3r/PrintConfig.cpp:1695 msgid "How to apply the Machine Limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1661 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "Emit to G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1662 +#: src/libslic3r/PrintConfig.cpp:1698 msgid "Use for time estimate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1663 +#: src/libslic3r/PrintConfig.cpp:1699 msgid "Ignore" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1686 +#: src/libslic3r/PrintConfig.cpp:1723 msgid "Maximum feedrate X" msgstr "최대 이송 속도 X" -#: src/libslic3r/PrintConfig.cpp:1687 +#: src/libslic3r/PrintConfig.cpp:1724 msgid "Maximum feedrate Y" msgstr "최대 이송 속도 Y" -#: src/libslic3r/PrintConfig.cpp:1688 +#: src/libslic3r/PrintConfig.cpp:1725 msgid "Maximum feedrate Z" msgstr "최대 이송 속도 Z" -#: src/libslic3r/PrintConfig.cpp:1689 +#: src/libslic3r/PrintConfig.cpp:1726 msgid "Maximum feedrate E" msgstr "최대 이송 속도 E" -#: src/libslic3r/PrintConfig.cpp:1692 +#: src/libslic3r/PrintConfig.cpp:1729 msgid "Maximum feedrate of the X axis" msgstr "X 축의 최대 이송 속도" -#: src/libslic3r/PrintConfig.cpp:1693 +#: src/libslic3r/PrintConfig.cpp:1730 msgid "Maximum feedrate of the Y axis" msgstr "Y 축의 최대 이송 속도" -#: src/libslic3r/PrintConfig.cpp:1694 +#: src/libslic3r/PrintConfig.cpp:1731 msgid "Maximum feedrate of the Z axis" msgstr "Z 축의 최대 이송 속도" -#: src/libslic3r/PrintConfig.cpp:1695 +#: src/libslic3r/PrintConfig.cpp:1732 msgid "Maximum feedrate of the E axis" msgstr "E 축의 최대 이송 속도" -#: src/libslic3r/PrintConfig.cpp:1703 +#: src/libslic3r/PrintConfig.cpp:1740 msgid "Maximum acceleration X" msgstr "최대 가속도 X" -#: src/libslic3r/PrintConfig.cpp:1704 +#: src/libslic3r/PrintConfig.cpp:1741 msgid "Maximum acceleration Y" msgstr "최대 가속도 Y" -#: src/libslic3r/PrintConfig.cpp:1705 +#: src/libslic3r/PrintConfig.cpp:1742 msgid "Maximum acceleration Z" msgstr "최대 가속 Z" -#: src/libslic3r/PrintConfig.cpp:1706 +#: src/libslic3r/PrintConfig.cpp:1743 msgid "Maximum acceleration E" msgstr "최대 가속 E" -#: src/libslic3r/PrintConfig.cpp:1709 +#: src/libslic3r/PrintConfig.cpp:1746 msgid "Maximum acceleration of the X axis" msgstr "X 축의 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1710 +#: src/libslic3r/PrintConfig.cpp:1747 msgid "Maximum acceleration of the Y axis" msgstr "Y 축의 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1711 +#: src/libslic3r/PrintConfig.cpp:1748 msgid "Maximum acceleration of the Z axis" msgstr "Z 축의 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1712 +#: src/libslic3r/PrintConfig.cpp:1749 msgid "Maximum acceleration of the E axis" msgstr "E 축의 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1720 +#: src/libslic3r/PrintConfig.cpp:1757 msgid "Maximum jerk X" msgstr "최대 저크(jerk) X" -#: src/libslic3r/PrintConfig.cpp:1721 +#: src/libslic3r/PrintConfig.cpp:1758 msgid "Maximum jerk Y" msgstr "최대 저크(jerk) Y" -#: src/libslic3r/PrintConfig.cpp:1722 +#: src/libslic3r/PrintConfig.cpp:1759 msgid "Maximum jerk Z" msgstr "최대 저크(jerk) Z" -#: src/libslic3r/PrintConfig.cpp:1723 +#: src/libslic3r/PrintConfig.cpp:1760 msgid "Maximum jerk E" msgstr "최대 저크(jerk) E" -#: src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:1763 msgid "Maximum jerk of the X axis" msgstr "X축 최대 저크(jerk)" -#: src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1764 msgid "Maximum jerk of the Y axis" msgstr "Y축 최대 저크는(jerk)" -#: src/libslic3r/PrintConfig.cpp:1728 +#: src/libslic3r/PrintConfig.cpp:1765 msgid "Maximum jerk of the Z axis" msgstr "Z축 최대 저크(jerk)" -#: src/libslic3r/PrintConfig.cpp:1729 +#: src/libslic3r/PrintConfig.cpp:1766 msgid "Maximum jerk of the E axis" msgstr "E축 최대 저크(jerk)" -#: src/libslic3r/PrintConfig.cpp:1739 +#: src/libslic3r/PrintConfig.cpp:1776 msgid "Minimum feedrate when extruding" msgstr "압출시 최소 공급 속도" -#: src/libslic3r/PrintConfig.cpp:1741 +#: src/libslic3r/PrintConfig.cpp:1778 msgid "Minimum feedrate when extruding (M205 S)" msgstr "압출 시 최소 이송 속도 (M205 S)" -#: src/libslic3r/PrintConfig.cpp:1749 +#: src/libslic3r/PrintConfig.cpp:1786 msgid "Minimum travel feedrate" msgstr "최소 이송 속도" -#: src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:1788 msgid "Minimum travel feedrate (M205 T)" msgstr "최소 이동 이송 속도 (M205 T)" -#: src/libslic3r/PrintConfig.cpp:1759 +#: src/libslic3r/PrintConfig.cpp:1796 msgid "Maximum acceleration when extruding" msgstr "압출시 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1798 msgid "" "Maximum acceleration when extruding (M204 P)\n" "\n" @@ -12072,31 +13932,31 @@ msgid "" "(M204 T)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1772 +#: src/libslic3r/PrintConfig.cpp:1809 msgid "Maximum acceleration when retracting" msgstr "리트렉션 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1774 +#: src/libslic3r/PrintConfig.cpp:1811 msgid "Maximum acceleration when retracting (M204 R)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1782 +#: src/libslic3r/PrintConfig.cpp:1819 msgid "Maximum acceleration for travel moves" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1784 +#: src/libslic3r/PrintConfig.cpp:1821 msgid "Maximum acceleration for travel moves (M204 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1791 src/libslic3r/PrintConfig.cpp:1800 +#: src/libslic3r/PrintConfig.cpp:1828 src/libslic3r/PrintConfig.cpp:1837 msgid "Max" msgstr "최대" -#: src/libslic3r/PrintConfig.cpp:1792 +#: src/libslic3r/PrintConfig.cpp:1829 msgid "This setting represents the maximum speed of your fan." msgstr "이 설정은 팬의 최대 속도를 나타냅니다." -#: src/libslic3r/PrintConfig.cpp:1801 +#: src/libslic3r/PrintConfig.cpp:1838 msgid "" "This is the highest printable layer height for this extruder, used to cap " "the variable layer height and support layer height. Maximum recommended " @@ -12108,11 +13968,11 @@ msgstr "" "는 압출 폭의 75% of 입니다. 0으로 설정하면 층 높이가 노즐 지름의 75% of로 제" "한됩니다." -#: src/libslic3r/PrintConfig.cpp:1811 +#: src/libslic3r/PrintConfig.cpp:1848 msgid "Max print speed" msgstr "최대 프린트 속도" -#: src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1849 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " @@ -12122,18 +13982,18 @@ msgstr "" "의 속도를 자동 계산한다. 이 실험 설정은 허용할 최대 인쇄 속도를 설정하는 데 " "사용된다." -#: src/libslic3r/PrintConfig.cpp:1822 +#: src/libslic3r/PrintConfig.cpp:1859 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." msgstr "" "이 실험 설정은 압출기가 지원하는 최대 체적 속도를 설정하기 위해 사용된다." -#: src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1867 msgid "Max volumetric slope positive" msgstr "최대 체적 기울기 양" -#: src/libslic3r/PrintConfig.cpp:1831 +#: src/libslic3r/PrintConfig.cpp:1868 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from lower speed to higher speed. A value of 1.8 mm³/" @@ -12142,15 +14002,15 @@ msgid "" "(feedrate 60 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1836 src/libslic3r/PrintConfig.cpp:1848 +#: src/libslic3r/PrintConfig.cpp:1873 src/libslic3r/PrintConfig.cpp:1885 msgid "mm³/s²" msgstr "mm³/s²" -#: src/libslic3r/PrintConfig.cpp:1842 +#: src/libslic3r/PrintConfig.cpp:1879 msgid "Max volumetric slope negative" msgstr "최대 체적 기울기 음수" -#: src/libslic3r/PrintConfig.cpp:1843 +#: src/libslic3r/PrintConfig.cpp:1880 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from higher speed to lower speed. A value of 1.8 mm³/" @@ -12159,15 +14019,15 @@ msgid "" "(feedrate 20 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1854 src/libslic3r/PrintConfig.cpp:1863 +#: src/libslic3r/PrintConfig.cpp:1891 src/libslic3r/PrintConfig.cpp:1900 msgid "Min" msgstr "최소" -#: src/libslic3r/PrintConfig.cpp:1855 +#: src/libslic3r/PrintConfig.cpp:1892 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "이 설정은 최소 PWM팬이 활동하는데 필요한를 나타냅니다." -#: src/libslic3r/PrintConfig.cpp:1864 +#: src/libslic3r/PrintConfig.cpp:1901 msgid "" "This is the lowest printable layer height for this extruder and limits the " "resolution for variable layer height. Typical values are between 0.05 mm and " @@ -12176,19 +14036,19 @@ msgstr "" "이것은 이 압출기에 대한 가장 낮은 인쇄 가능한 층 높이이고 가변 층 높이에 대" "한 분해능을 제한한다. 대표적인 값은 0.05mm와 0.1mm이다." -#: src/libslic3r/PrintConfig.cpp:1872 +#: src/libslic3r/PrintConfig.cpp:1909 msgid "Min print speed" msgstr "최소 인쇄 속도" -#: src/libslic3r/PrintConfig.cpp:1873 +#: src/libslic3r/PrintConfig.cpp:1910 msgid "Slic3r will not scale speed down below this speed." msgstr "Slic3r는 이 속도 이하로 속도를 낮추지 않을 것이다." -#: src/libslic3r/PrintConfig.cpp:1880 +#: src/libslic3r/PrintConfig.cpp:1917 msgid "Minimal filament extrusion length" msgstr "최소 필라멘트 압출 길이" -#: src/libslic3r/PrintConfig.cpp:1881 +#: src/libslic3r/PrintConfig.cpp:1918 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " @@ -12197,11 +14057,11 @@ msgstr "" "하단 레이어에서 지정된 양의 필라멘트를 사용하는 데 필요한 스커트 루프의 수 이" "상으로 생성한다. 다중 익스트루더의 경우, 이 최소값은 각 추가기기에 적용된다." -#: src/libslic3r/PrintConfig.cpp:1890 +#: src/libslic3r/PrintConfig.cpp:1927 msgid "Configuration notes" msgstr "구성 노트" -#: src/libslic3r/PrintConfig.cpp:1891 +#: src/libslic3r/PrintConfig.cpp:1928 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." @@ -12209,16 +14069,16 @@ msgstr "" "여기에 개인 노트를 넣을 수 있다. 이 텍스트는 G-code 헤더 코멘트에 추가될 것이" "다." -#: src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:1938 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "이 지름은 익스트루더 노즐의 직경이다(예: 0.5, 0.35 등)." -#: src/libslic3r/PrintConfig.cpp:1906 +#: src/libslic3r/PrintConfig.cpp:1943 msgid "Host Type" msgstr "호스트 유형" -#: src/libslic3r/PrintConfig.cpp:1907 +#: src/libslic3r/PrintConfig.cpp:1944 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." @@ -12226,11 +14086,11 @@ msgstr "" "Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드에는 호스" "트의 종류가 포함 되어야 합니다." -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:1961 msgid "Only retract when crossing perimeters" msgstr "둘레를 횡단 할 때만 수축" -#: src/libslic3r/PrintConfig.cpp:1930 +#: src/libslic3r/PrintConfig.cpp:1962 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." @@ -12238,21 +14098,17 @@ msgstr "" "이동 경로가 상위 레이어의 경계를 초과하지 않는 경우 리트랙션을 비활성화합니" "다. 따라서 모든 오즈가 보이지 않습니다." -#: src/libslic3r/PrintConfig.cpp:1937 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "" "This option will drop the temperature of the inactive extruders to prevent " -"oozing. It will enable a tall skirt automatically and move extruders outside " -"such skirt when changing temperatures." +"oozing. " msgstr "" -"이 옵션은 누출을 방지하기 위해 비활성 압출기의 온도를 떨어 뜨립니다. 온도를 " -"변경할 때 키가 큰 스커트를 자동으로 사용하고 스커트 외부로 압출기를 이동합니" -"다." -#: src/libslic3r/PrintConfig.cpp:1944 +#: src/libslic3r/PrintConfig.cpp:1974 msgid "Output filename format" msgstr "출력 파일이름 형식" -#: src/libslic3r/PrintConfig.cpp:1945 +#: src/libslic3r/PrintConfig.cpp:1975 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -12263,11 +14119,11 @@ msgstr "" "[layer_height], [fill_density] 등 또한 [타임 스탬프], [연도], [월], [일], [시" "간], [input_filename], [input_filename_base]을 사용할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:1954 +#: src/libslic3r/PrintConfig.cpp:1984 msgid "Detect bridging perimeters" msgstr "브릿 징 경계선 감지" -#: src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:1986 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." @@ -12275,11 +14131,11 @@ msgstr "" "오버행에 대한 유량을 조정하는 실험 옵션 (브리지 흐름(flow)이 사용됨)에 브릿" "지 속도를 적용하고 팬을 활성화합니다." -#: src/libslic3r/PrintConfig.cpp:1962 +#: src/libslic3r/PrintConfig.cpp:1992 msgid "Filament parking position" msgstr "필라멘트 멈춤 위치" -#: src/libslic3r/PrintConfig.cpp:1963 +#: src/libslic3r/PrintConfig.cpp:1993 msgid "" "Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware." @@ -12287,11 +14143,11 @@ msgstr "" "언로딩시 필라멘트 위치에서 압출기 팁의 거리. 이 값은 프린터 펌웨어의 값과 일" "치해야합니다." -#: src/libslic3r/PrintConfig.cpp:1971 +#: src/libslic3r/PrintConfig.cpp:2001 msgid "Extra loading distance" msgstr "추가 로딩 거리" -#: src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:2002 msgid "" "When set to zero, the distance the filament is moved from parking position " "during load is exactly the same as it was moved back during unload. When " @@ -12302,34 +14158,34 @@ msgstr "" "이동 한 거리와 동일합니다. 양수이면 음수가 더 많이 로드되고 로드가 음수 인 경" "우 언로드보다 짧습니다." -#: src/libslic3r/PrintConfig.cpp:1980 src/libslic3r/PrintConfig.cpp:2005 -#: src/libslic3r/PrintConfig.cpp:2019 src/libslic3r/PrintConfig.cpp:2029 +#: src/libslic3r/PrintConfig.cpp:2010 src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2049 src/libslic3r/PrintConfig.cpp:2059 msgid "Perimeters" msgstr "둘레" -#: src/libslic3r/PrintConfig.cpp:1981 +#: src/libslic3r/PrintConfig.cpp:2011 msgid "" "This is the acceleration your printer will use for perimeters. Set zero to " "disable acceleration control for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1989 +#: src/libslic3r/PrintConfig.cpp:2019 msgid "" "This is the acceleration your printer will use for external perimeters. Set " "zero to use the value for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1996 +#: src/libslic3r/PrintConfig.cpp:2026 msgid "Perimeter extruder" msgstr "가장자리(Perimeter) 익스트루더" -#: src/libslic3r/PrintConfig.cpp:1998 +#: src/libslic3r/PrintConfig.cpp:2028 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" "둘레와 가장자리를 인쇄 할 때 사용할 압출기입니다. 첫 번째 압출기는 1입니다." -#: src/libslic3r/PrintConfig.cpp:2007 +#: src/libslic3r/PrintConfig.cpp:2037 msgid "" "Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. If " @@ -12343,12 +14199,12 @@ msgstr "" "직경이 사용됩니다. 백분율 (예 : 200 %)로 표현하면 레이어 높이를 기준으로 계산" "됩니다." -#: src/libslic3r/PrintConfig.cpp:2021 +#: src/libslic3r/PrintConfig.cpp:2051 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "둘레의 속도 (등고선, 일명 세로 셸). 자동으로 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:2031 +#: src/libslic3r/PrintConfig.cpp:2061 msgid "" "This option sets the number of perimeters to generate for each layer. Note " "that Slic3r may increase this number automatically when it detects sloping " @@ -12359,11 +14215,11 @@ msgstr "" "사용하면 더 큰 주변 수를 사용하는 경사면을 감지 할 때 Slic3r이이 수를 자동으" "로 증가시킬 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2065 msgid "(minimum)" msgstr "(최소)" -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "" "If you want to process the output G-code through custom scripts, just list " "their absolute paths here. Separate multiple scripts with a semicolon. " @@ -12376,35 +14232,35 @@ msgstr "" "파일의 절대 경로를 첫 번째 인수로 전달되며 환경 변수를 읽음으로써 Slic3r 구" "성 설정에 액세스 할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2055 +#: src/libslic3r/PrintConfig.cpp:2085 msgid "Printer type" msgstr "프린터 타입" -#: src/libslic3r/PrintConfig.cpp:2056 +#: src/libslic3r/PrintConfig.cpp:2086 msgid "Type of the printer." msgstr "프린터 유형." -#: src/libslic3r/PrintConfig.cpp:2061 +#: src/libslic3r/PrintConfig.cpp:2091 msgid "Printer notes" msgstr "프린터 노트" -#: src/libslic3r/PrintConfig.cpp:2062 +#: src/libslic3r/PrintConfig.cpp:2092 msgid "You can put your notes regarding the printer here." msgstr "프린터 관련 메모를 여기에 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2070 +#: src/libslic3r/PrintConfig.cpp:2100 msgid "Printer vendor" msgstr "제조 회사" -#: src/libslic3r/PrintConfig.cpp:2071 +#: src/libslic3r/PrintConfig.cpp:2101 msgid "Name of the printer vendor." msgstr "프린터 공급 업체의 이름입니다." -#: src/libslic3r/PrintConfig.cpp:2076 +#: src/libslic3r/PrintConfig.cpp:2106 msgid "Printer variant" msgstr "프린터 변형" -#: src/libslic3r/PrintConfig.cpp:2077 +#: src/libslic3r/PrintConfig.cpp:2107 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." @@ -12412,57 +14268,57 @@ msgstr "" "프린터 변종 이름입니다. 예를 들어, 프린터 변형은 노즐 지름으로 구별 될 수 있" "습니다." -#: src/libslic3r/PrintConfig.cpp:2094 +#: src/libslic3r/PrintConfig.cpp:2124 msgid "Raft contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2096 +#: src/libslic3r/PrintConfig.cpp:2126 msgid "" "The vertical distance between object and raft. Ignored for soluble interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2103 +#: src/libslic3r/PrintConfig.cpp:2133 msgid "Raft expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2105 +#: src/libslic3r/PrintConfig.cpp:2135 msgid "Expansion of the raft in XY plane for better stability." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:2142 msgid "First layer density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2114 +#: src/libslic3r/PrintConfig.cpp:2144 msgid "Density of the first raft or support layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2122 +#: src/libslic3r/PrintConfig.cpp:2152 msgid "First layer expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2124 +#: src/libslic3r/PrintConfig.cpp:2154 msgid "" "Expansion of the first raft or support layer to improve adhesion to print " "bed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2131 +#: src/libslic3r/PrintConfig.cpp:2161 msgid "Raft layers" msgstr "라프트(Raft) 레이어" -#: src/libslic3r/PrintConfig.cpp:2133 +#: src/libslic3r/PrintConfig.cpp:2163 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." msgstr "" "개체는 이 개수의 층에 의해 상승되며, 그 아래에서 서포트 재료가 생성될 것이다." -#: src/libslic3r/PrintConfig.cpp:2141 +#: src/libslic3r/PrintConfig.cpp:2171 msgid "Slice resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2142 +#: src/libslic3r/PrintConfig.cpp:2172 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -12474,11 +14330,11 @@ msgstr "" "있는 것보다 더 많은 디테일을 가지고 있다. 단순화를 사용하지 않고 입력에서 전" "체 해상도를 사용하려면 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:2182 msgid "G-code resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2153 +#: src/libslic3r/PrintConfig.cpp:2183 msgid "" "Maximum deviation of exported G-code paths from their full resolution " "counterparts. Very high resolution G-code requires huge amount of RAM to " @@ -12489,20 +14345,20 @@ msgid "" "produced." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2164 +#: src/libslic3r/PrintConfig.cpp:2194 msgid "Minimum travel after retraction" msgstr "리트랙션 후 최소 이동 거리" -#: src/libslic3r/PrintConfig.cpp:2165 +#: src/libslic3r/PrintConfig.cpp:2195 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "이동 거리가 이 길이보다 짧으면 리트렉션이 트리거되지 않습니다." -#: src/libslic3r/PrintConfig.cpp:2171 +#: src/libslic3r/PrintConfig.cpp:2201 msgid "Retract amount before wipe" msgstr "닦아 내기 전의 수축량" -#: src/libslic3r/PrintConfig.cpp:2172 +#: src/libslic3r/PrintConfig.cpp:2202 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." @@ -12510,23 +14366,23 @@ msgstr "" "보우 덴 압출기를 사용하면 와이퍼 동작을하기 전에 약간의 빠른 리트랙션 를하는 " "것이 좋습니다." -#: src/libslic3r/PrintConfig.cpp:2179 +#: src/libslic3r/PrintConfig.cpp:2209 msgid "Retract on layer change" msgstr "레이어 변경 후퇴" -#: src/libslic3r/PrintConfig.cpp:2180 +#: src/libslic3r/PrintConfig.cpp:2210 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "이 플래그는 Z 이동이 완료 될 때마다 취소를 강제 실행합니다." -#: src/libslic3r/PrintConfig.cpp:2185 src/libslic3r/PrintConfig.cpp:2193 +#: src/libslic3r/PrintConfig.cpp:2215 src/libslic3r/PrintConfig.cpp:2223 msgid "Length" msgstr "길이" -#: src/libslic3r/PrintConfig.cpp:2186 +#: src/libslic3r/PrintConfig.cpp:2216 msgid "Retraction Length" msgstr "리트랙션 길이" -#: src/libslic3r/PrintConfig.cpp:2187 +#: src/libslic3r/PrintConfig.cpp:2217 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " @@ -12535,11 +14391,11 @@ msgstr "" "후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니다 (길이는 압출기에 " "들어가기 전에 원시 필라멘트에서 측정됩니다)." -#: src/libslic3r/PrintConfig.cpp:2194 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Retraction Length (Toolchange)" msgstr "리트랙션 길이 (툴 체인지)" -#: src/libslic3r/PrintConfig.cpp:2195 +#: src/libslic3r/PrintConfig.cpp:2225 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " @@ -12548,11 +14404,11 @@ msgstr "" "공구를 교체하기 전에 후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니" "다 (길이는 압출기에 들어가기 전에 원시 필라멘트에서 측정됩니다)." -#: src/libslic3r/PrintConfig.cpp:2203 +#: src/libslic3r/PrintConfig.cpp:2233 msgid "Lift Z" msgstr "Z축 올림" -#: src/libslic3r/PrintConfig.cpp:2204 +#: src/libslic3r/PrintConfig.cpp:2234 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " @@ -12561,15 +14417,15 @@ msgstr "" "이 값을 양수 값으로 설정하면 철회가 트리거 될 때마다 Z가 빠르게 올라갑니다. " "여러 개의 압출기를 사용하는 경우 첫 번째 압출기의 설정 만 고려됩니다." -#: src/libslic3r/PrintConfig.cpp:2211 +#: src/libslic3r/PrintConfig.cpp:2241 msgid "Above Z" msgstr "Z 위" -#: src/libslic3r/PrintConfig.cpp:2212 +#: src/libslic3r/PrintConfig.cpp:2242 msgid "Only lift Z above" msgstr "오직 Z축 위로만" -#: src/libslic3r/PrintConfig.cpp:2213 +#: src/libslic3r/PrintConfig.cpp:2243 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " @@ -12578,15 +14434,15 @@ msgstr "" "이것을 양의 값으로 설정하면, Z 리프트는 지정된 절대 Z 위로만 발생한다. 첫 번" "째 층에서 리프트를 건너뛸 수 있도록 이 설정을 조정할 수 있다." -#: src/libslic3r/PrintConfig.cpp:2220 +#: src/libslic3r/PrintConfig.cpp:2250 msgid "Below Z" msgstr "Z 아래" -#: src/libslic3r/PrintConfig.cpp:2221 +#: src/libslic3r/PrintConfig.cpp:2251 msgid "Only lift Z below" msgstr "Z값 아래만" -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2252 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " @@ -12595,11 +14451,11 @@ msgstr "" "이것을 양수 값으로 설정하면 Z 리프트가 지정된 절대 Z 아래에서만 발생합니다. " "첫 번째 레이어로 리프트를 제한하기 위해이 설정을 조정할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2238 +#: src/libslic3r/PrintConfig.cpp:2260 src/libslic3r/PrintConfig.cpp:2268 msgid "Extra length on restart" msgstr "재시작시 여분의 길이" -#: src/libslic3r/PrintConfig.cpp:2231 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." @@ -12607,7 +14463,7 @@ msgstr "" "이동 후 리트렉셔이 보정되면 익스트루더가 추가 양의 필라멘트를 밀어냅니다. 이 " "설정은 거의 필요하지 않습니다." -#: src/libslic3r/PrintConfig.cpp:2239 +#: src/libslic3r/PrintConfig.cpp:2269 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." @@ -12615,19 +14471,19 @@ msgstr "" "도구를 교환 한 후 리트렉션를 보정하면 익스트루더가 추가 양의 필라멘트를 밀게" "됩니다." -#: src/libslic3r/PrintConfig.cpp:2246 src/libslic3r/PrintConfig.cpp:2247 +#: src/libslic3r/PrintConfig.cpp:2276 src/libslic3r/PrintConfig.cpp:2277 msgid "Retraction Speed" msgstr "리트랙션 속도" -#: src/libslic3r/PrintConfig.cpp:2248 +#: src/libslic3r/PrintConfig.cpp:2278 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "리트랙션 속도 (익스트루더 모터에만 적용됨)." -#: src/libslic3r/PrintConfig.cpp:2254 src/libslic3r/PrintConfig.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:2284 src/libslic3r/PrintConfig.cpp:2285 msgid "Deretraction Speed" msgstr "감속 속도" -#: src/libslic3r/PrintConfig.cpp:2256 +#: src/libslic3r/PrintConfig.cpp:2286 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " @@ -12636,68 +14492,82 @@ msgstr "" "리트랙션 후 압출기에 필라멘트를 로드하는 속도 (압출기 모터에만 적용됨). 0으" "로 방치하면 리트랙션 속도가 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2293 msgid "Seam position" msgstr "재봉선 위치" -#: src/libslic3r/PrintConfig.cpp:2265 +#: src/libslic3r/PrintConfig.cpp:2295 msgid "Position of perimeters starting points." msgstr "둘레의 시작점의 위치." -#: src/libslic3r/PrintConfig.cpp:2272 +#: src/libslic3r/PrintConfig.cpp:2297 +msgid "Random" +msgstr "무작위" + +#: src/libslic3r/PrintConfig.cpp:2298 msgid "Nearest" msgstr "가장 가까운" -#: src/libslic3r/PrintConfig.cpp:2273 +#: src/libslic3r/PrintConfig.cpp:2299 msgid "Aligned" msgstr "정렬" -#: src/libslic3r/PrintConfig.cpp:2281 +#: src/libslic3r/PrintConfig.cpp:2306 +msgid "Staggered inner seams" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2307 +msgid "" +"This option causes the inner seams to be shifted backwards based on their " +"depth, forming a zigzag pattern." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2314 msgid "Direction" msgstr "방향" -#: src/libslic3r/PrintConfig.cpp:2283 +#: src/libslic3r/PrintConfig.cpp:2316 msgid "Preferred direction of the seam" msgstr "선호하는 재봉선(seam)의 방향" -#: src/libslic3r/PrintConfig.cpp:2284 +#: src/libslic3r/PrintConfig.cpp:2317 msgid "Seam preferred direction" msgstr "재봉선(Seam) 선호 방향" -#: src/libslic3r/PrintConfig.cpp:2291 +#: src/libslic3r/PrintConfig.cpp:2324 msgid "Jitter" msgstr "지터(Jitter)" -#: src/libslic3r/PrintConfig.cpp:2293 +#: src/libslic3r/PrintConfig.cpp:2326 msgid "Seam preferred direction jitter" msgstr "재봉선 선호 방향 지터(Jitter)" -#: src/libslic3r/PrintConfig.cpp:2294 +#: src/libslic3r/PrintConfig.cpp:2327 msgid "Preferred direction of the seam - jitter" msgstr "재봉선 지터의 선호 방향" -#: src/libslic3r/PrintConfig.cpp:2301 +#: src/libslic3r/PrintConfig.cpp:2334 msgid "Distance from brim/object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2335 msgid "" "Distance between skirt and brim (when draft shield is not used) or objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2308 +#: src/libslic3r/PrintConfig.cpp:2341 msgid "Skirt height" msgstr "스커트(Skirt) 높이" -#: src/libslic3r/PrintConfig.cpp:2309 +#: src/libslic3r/PrintConfig.cpp:2342 msgid "Height of skirt expressed in layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2348 msgid "Draft shield" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2316 +#: src/libslic3r/PrintConfig.cpp:2349 msgid "" "With draft shield active, the skirt will be printed skirt_distance from the " "object, possibly intersecting brim.\n" @@ -12707,27 +14577,27 @@ msgid "" "from print bed due to wind draft." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2324 +#: src/libslic3r/PrintConfig.cpp:2354 msgid "Disabled" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2325 +#: src/libslic3r/PrintConfig.cpp:2355 msgid "Limited" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2326 +#: src/libslic3r/PrintConfig.cpp:2356 msgid "Enabled" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2331 +#: src/libslic3r/PrintConfig.cpp:2362 msgid "Loops (minimum)" msgstr "루프 (최소)" -#: src/libslic3r/PrintConfig.cpp:2332 +#: src/libslic3r/PrintConfig.cpp:2363 msgid "Skirt Loops" msgstr "스커트 루프" -#: src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2364 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " @@ -12736,11 +14606,11 @@ msgstr "" "스커트의 루프 수입니다. 최소 압출 길이 옵션을 설정한 경우 여기에 구성된 루프 " "수보다 클 수 있다. 스커트를 완전히 비활성화하려면 이 값을 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:2341 +#: src/libslic3r/PrintConfig.cpp:2372 msgid "Slow down if layer print time is below" msgstr "레이어 인쇄 시간이 다음과 같은 경우 속도를 낮추십시오" -#: src/libslic3r/PrintConfig.cpp:2342 +#: src/libslic3r/PrintConfig.cpp:2373 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." @@ -12748,11 +14618,11 @@ msgstr "" "층 인쇄 시간이 이 시간보다 낮게 추정될 경우, 인쇄 이동 속도는 이 값으로 지속" "되도록 축소된다." -#: src/libslic3r/PrintConfig.cpp:2351 +#: src/libslic3r/PrintConfig.cpp:2382 msgid "Small perimeters" msgstr "작은 둘레" -#: src/libslic3r/PrintConfig.cpp:2353 +#: src/libslic3r/PrintConfig.cpp:2384 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " @@ -12762,34 +14632,34 @@ msgstr "" "분율로 표시되는 경우 (예 : 80 %) 위의 속도 설정에서 계산됩니다. 자동으로 0으" "로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:2363 +#: src/libslic3r/PrintConfig.cpp:2394 msgid "Solid infill threshold area" msgstr "솔리드 채우기 임계값" -#: src/libslic3r/PrintConfig.cpp:2365 +#: src/libslic3r/PrintConfig.cpp:2396 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." msgstr "" "지정된 한계값보다 작은 영역을 가진 영역에 대해 솔리드 인필을 강제 적용." -#: src/libslic3r/PrintConfig.cpp:2366 +#: src/libslic3r/PrintConfig.cpp:2397 msgid "mm²" msgstr "mm²" -#: src/libslic3r/PrintConfig.cpp:2372 +#: src/libslic3r/PrintConfig.cpp:2403 msgid "Solid infill extruder" msgstr "솔리드 인필 익스트루더" -#: src/libslic3r/PrintConfig.cpp:2374 +#: src/libslic3r/PrintConfig.cpp:2405 msgid "The extruder to use when printing solid infill." msgstr "꽉찬 면을 인쇄할 때 사용하는 익스트루더." -#: src/libslic3r/PrintConfig.cpp:2380 +#: src/libslic3r/PrintConfig.cpp:2411 msgid "Solid infill every" msgstr "솔리드 인필 간격" -#: src/libslic3r/PrintConfig.cpp:2382 +#: src/libslic3r/PrintConfig.cpp:2413 msgid "" "This feature allows to force a solid layer every given number of layers. " "Zero to disable. You can set this to any value (for example 9999); Slic3r " @@ -12800,7 +14670,7 @@ msgstr "" "음. 당신은 이것을 어떤 값으로도 설정할 수 있다(예: 9999). Slic3r는 노즐 직경" "과 층 높이에 따라 결합할 최대 가능한 층 수를 자동으로 선택한다." -#: src/libslic3r/PrintConfig.cpp:2394 +#: src/libslic3r/PrintConfig.cpp:2425 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "solid surfaces. If left zero, default extrusion width will be used if set, " @@ -12811,7 +14681,7 @@ msgstr "" "하십시오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경" "이 사용된다. 백분율(예: 90%)로 표현되는 경우, 계층 높이에 걸쳐 계산된다." -#: src/libslic3r/PrintConfig.cpp:2406 +#: src/libslic3r/PrintConfig.cpp:2437 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " @@ -12820,19 +14690,19 @@ msgstr "" "솔리드 영역(상단/하부/내부 수평 셸) 인쇄 속도 이는 위의 기본 주입 속도에 대" "한 백분율(예: 80%)로 표시할 수 있다. 자동을 위해 0으로 설정한다." -#: src/libslic3r/PrintConfig.cpp:2418 +#: src/libslic3r/PrintConfig.cpp:2449 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "상단 및 하단 표면에 생성할 솔리드 레이어 수입니다." -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2455 src/libslic3r/PrintConfig.cpp:2456 msgid "Minimum thickness of a top / bottom shell" msgstr "상부/하부 쉘의 최소 두께" -#: src/libslic3r/PrintConfig.cpp:2431 +#: src/libslic3r/PrintConfig.cpp:2462 msgid "Spiral vase" msgstr "꽃병 모드(Spiral vase)" -#: src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2463 msgid "" "This feature will raise Z gradually while printing a single-walled object in " "order to remove any visible seam. This option requires a single perimeter, " @@ -12841,20 +14711,17 @@ msgid "" "when printing more than one single object." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2440 +#: src/libslic3r/PrintConfig.cpp:2471 msgid "Temperature variation" msgstr "온도 변화" -#: src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:2472 msgid "" -"Temperature difference to be applied when an extruder is not active. Enables " -"a full-height \"sacrificial\" skirt on which the nozzles are periodically " -"wiped." +"Temperature difference to be applied when an extruder is not active. The " +"value is not used when 'idle_temperature' in filament settings is defined." msgstr "" -"돌출부가 활성화되지 않은 경우 적용되는 온도 차이. 노즐을 주기적으로 닦는 전" -"체 높이 \"인공\" 스커트가 가능하다." -#: src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2483 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -12871,7 +14738,7 @@ msgstr "" "든 PrusaSlicer 설정에 자리 표시자 변수를 사용할 수 있으므로 원하는 위치에 " "\"M109 S[first_layer_temperature]\" 명령을 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2466 +#: src/libslic3r/PrintConfig.cpp:2498 msgid "" "This start procedure is inserted at the beginning, after any printer start " "gcode (and after any toolchange to this filament in case of multi-material " @@ -12892,35 +14759,35 @@ msgstr "" "\"M109 S[first_layer_temperature]\" 명령을 넣을 수 있습니다. 압출기가 여러 " "개 있는 경우 gcode는 압출기 순서로 처리됩니다." -#: src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2514 msgid "Color change G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2483 +#: src/libslic3r/PrintConfig.cpp:2515 msgid "This G-code will be used as a code for the color change" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2492 +#: src/libslic3r/PrintConfig.cpp:2524 msgid "This G-code will be used as a code for the pause print" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2501 +#: src/libslic3r/PrintConfig.cpp:2533 msgid "This G-code will be used as a custom code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2509 +#: src/libslic3r/PrintConfig.cpp:2541 msgid "Single Extruder Multi Material" msgstr "싱글 익스트루더 다중메터리얼" -#: src/libslic3r/PrintConfig.cpp:2510 +#: src/libslic3r/PrintConfig.cpp:2542 msgid "The printer multiplexes filaments into a single hot end." msgstr "프린터는 필라멘트를 하나의 핫 엔드에 다중플렉싱합니다." -#: src/libslic3r/PrintConfig.cpp:2515 +#: src/libslic3r/PrintConfig.cpp:2547 msgid "Prime all printing extruders" msgstr "모든 인쇄 압출기 프라임" -#: src/libslic3r/PrintConfig.cpp:2516 +#: src/libslic3r/PrintConfig.cpp:2548 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." @@ -12928,11 +14795,11 @@ msgstr "" "활성화 된 경우, 모든 인쇄 압출기는 인쇄 시작시 프린트 베드의 전면 가장자리에 " "프라이밍 됩니다." -#: src/libslic3r/PrintConfig.cpp:2521 +#: src/libslic3r/PrintConfig.cpp:2553 msgid "No sparse layers (EXPERIMENTAL)" msgstr "숨겨진 레이어층 없음(실험적)" -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2554 msgid "" "If enabled, the wipe tower will not be printed on layers with no " "toolchanges. On layers with a toolchange, extruder will travel downward to " @@ -12943,11 +14810,11 @@ msgstr "" "지 레이어에서 압출기는 아래쪽으로 이동하여 와이프 타워를 인쇄합니다. 사용자" "는 인쇄물과 충돌이 없는지 확인합니다." -#: src/libslic3r/PrintConfig.cpp:2529 +#: src/libslic3r/PrintConfig.cpp:2561 msgid "Slice gap closing radius" msgstr "슬라이스 간격 닫힘 반경" -#: src/libslic3r/PrintConfig.cpp:2531 +#: src/libslic3r/PrintConfig.cpp:2563 msgid "" "Cracks smaller than 2x gap closing radius are being filled during the " "triangle mesh slicing. The gap closing operation may reduce the final print " @@ -12957,41 +14824,41 @@ msgstr "" "틈 닫기 작업은 최종 인쇄 해상도를 줄일 수 있으므로 값을 합리적으로 낮게 유지 " "하는 것이 좋습니다." -#: src/libslic3r/PrintConfig.cpp:2539 +#: src/libslic3r/PrintConfig.cpp:2571 msgid "Slicing Mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2541 +#: src/libslic3r/PrintConfig.cpp:2573 msgid "" "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " "close all holes in the model." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2575 msgid "Regular" msgstr "일반" -#: src/libslic3r/PrintConfig.cpp:2547 +#: src/libslic3r/PrintConfig.cpp:2576 msgid "Even-odd" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2548 +#: src/libslic3r/PrintConfig.cpp:2577 msgid "Close holes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2553 +#: src/libslic3r/PrintConfig.cpp:2583 msgid "Generate support material" msgstr "서포트 재료 생성" -#: src/libslic3r/PrintConfig.cpp:2555 +#: src/libslic3r/PrintConfig.cpp:2585 msgid "Enable support material generation." msgstr "서포트 재료를 사용합니다." -#: src/libslic3r/PrintConfig.cpp:2559 +#: src/libslic3r/PrintConfig.cpp:2589 msgid "Auto generated supports" msgstr "자동 생성 지원" -#: src/libslic3r/PrintConfig.cpp:2561 +#: src/libslic3r/PrintConfig.cpp:2591 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " @@ -13001,11 +14868,11 @@ msgstr "" "인란을 선택 하지 않으면 \"서포트 지원 영역\" 볼륨 내 에서만 지원이 생성 됩니" "다." -#: src/libslic3r/PrintConfig.cpp:2567 +#: src/libslic3r/PrintConfig.cpp:2597 msgid "XY separation between an object and its support" msgstr "개체와 그 서포트 사이 XY 분리" -#: src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2599 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." @@ -13013,17 +14880,17 @@ msgstr "" "객체(object)와 그 서포트 사이의 XY 분리. 백분율 (예 : 50 %)로 표시되는 경우 " "외부 둘레 너비를 기준으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:2580 +#: src/libslic3r/PrintConfig.cpp:2610 msgid "Pattern angle" msgstr "채움 각도" -#: src/libslic3r/PrintConfig.cpp:2582 +#: src/libslic3r/PrintConfig.cpp:2612 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." msgstr "이 설정을 사용하여지지 평면 패턴을 수평면으로 회전시킵니다." -#: src/libslic3r/PrintConfig.cpp:2592 src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:2622 src/libslic3r/PrintConfig.cpp:3411 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -13031,11 +14898,11 @@ msgstr "" "그것이 빌드 플레이트에있는 경우에만 지원을 작성하십시오. 인쇄물에 대한 지원" "을 작성하지 마십시오." -#: src/libslic3r/PrintConfig.cpp:2598 +#: src/libslic3r/PrintConfig.cpp:2627 msgid "Top contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2600 +#: src/libslic3r/PrintConfig.cpp:2629 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " @@ -13044,40 +14911,38 @@ msgstr "" "개체와 서포트 사이의 수직 거리. 이 값을 0으로 설정하면 Slic3r이 첫 번째 객체" "(object) 레이어에 브리지 흐름과 속도를 사용하지 못하게됩니다." -#: src/libslic3r/PrintConfig.cpp:2608 +#: src/libslic3r/PrintConfig.cpp:2635 msgid "0 (soluble)" msgstr "0 (수용성)" -#: src/libslic3r/PrintConfig.cpp:2609 +#: src/libslic3r/PrintConfig.cpp:2636 msgid "0.1 (detachable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2610 +#: src/libslic3r/PrintConfig.cpp:2637 msgid "0.2 (detachable)" msgstr "0.2 (분리 가능)" -#: src/libslic3r/PrintConfig.cpp:2616 +#: src/libslic3r/PrintConfig.cpp:2643 msgid "Bottom contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2618 +#: src/libslic3r/PrintConfig.cpp:2645 msgid "" "The vertical distance between the object top surface and the support " "material interface. If set to zero, support_material_contact_distance will " "be used for both top and bottom contact Z distances." msgstr "" -#. TRN To be shown in Print Settings "Bottom contact Z distance". Have to be as short as possible -#. TRN To be shown in Print Settings "Bottom interface layers". Have to be as short as possible -#: src/libslic3r/PrintConfig.cpp:2626 src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2651 src/libslic3r/PrintConfig.cpp:2732 msgid "Same as top" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2633 +#: src/libslic3r/PrintConfig.cpp:2659 msgid "Enforce support for the first" msgstr "첫 번째 서포트 더 강화" -#: src/libslic3r/PrintConfig.cpp:2635 +#: src/libslic3r/PrintConfig.cpp:2661 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -13088,15 +14953,15 @@ msgstr "" "어 지정된 레이어 수에 대한지지 자료를 생성합니다. 이것은 빌드 플레이트에 매" "우 얇거나 부족한 풋 프린트를 가진 개체를 더 많이 부착 할 때 유용합니다." -#: src/libslic3r/PrintConfig.cpp:2640 +#: src/libslic3r/PrintConfig.cpp:2666 msgid "Enforce support for the first n layers" msgstr "첫 번째 n 개의 레이어에 대한 서포트 강화" -#: src/libslic3r/PrintConfig.cpp:2646 +#: src/libslic3r/PrintConfig.cpp:2672 msgid "Support material/raft/skirt extruder" msgstr "서포트 재료 / 라프트 / 스커트 익스트루더" -#: src/libslic3r/PrintConfig.cpp:2648 +#: src/libslic3r/PrintConfig.cpp:2674 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." @@ -13104,7 +14969,7 @@ msgstr "" "서포트 재료, 라프트 및 스커트를 인쇄 할 때 사용하는 압출기 (도구 변경을 최소" "화하기 위해 현재 압출기를 사용하려면 1+, 0)." -#: src/libslic3r/PrintConfig.cpp:2657 +#: src/libslic3r/PrintConfig.cpp:2683 msgid "" "Set this to a non-zero value to set a manual extrusion width for support " "material. If left zero, default extrusion width will be used if set, " @@ -13115,20 +14980,20 @@ msgstr "" "0으로 설정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 노즐 지름이 " "사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:2667 +#: src/libslic3r/PrintConfig.cpp:2693 msgid "Interface loops" msgstr "접점 루프" -#: src/libslic3r/PrintConfig.cpp:2669 +#: src/libslic3r/PrintConfig.cpp:2695 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "지지대의 상단 접촉 층을 루프로 덮으십시오. 기본적으로 사용 안 함." -#: src/libslic3r/PrintConfig.cpp:2674 +#: src/libslic3r/PrintConfig.cpp:2700 msgid "Support material/raft interface extruder" msgstr "서포트 재료/라프트 접점 익스트루더" -#: src/libslic3r/PrintConfig.cpp:2676 +#: src/libslic3r/PrintConfig.cpp:2702 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." @@ -13136,61 +15001,65 @@ msgstr "" "서포트 재료 접점를 인쇄 할 때 사용할 익스트루더 (도구 변경을 최소화하기 위해 " "현재 익스트루더를 사용하려면 1+, 0). 이것은 라프트에도 영향을 미칩니다." -#: src/libslic3r/PrintConfig.cpp:2684 +#: src/libslic3r/PrintConfig.cpp:2709 msgid "Top interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2711 msgid "" "Number of interface layers to insert between the object(s) and support " "material." msgstr "객체(object)와 서포트 재료 사이에 삽입할 접점 레이어 수입니다." -#: src/libslic3r/PrintConfig.cpp:2693 +#: src/libslic3r/PrintConfig.cpp:2715 src/libslic3r/PrintConfig.cpp:2733 msgid "0 (off)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2716 src/libslic3r/PrintConfig.cpp:2734 msgid "1 (light)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2695 +#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2735 msgid "2 (default)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2696 +#: src/libslic3r/PrintConfig.cpp:2718 src/libslic3r/PrintConfig.cpp:2736 msgid "3 (heavy)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:2724 msgid "Bottom interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2704 +#: src/libslic3r/PrintConfig.cpp:2726 msgid "" "Number of interface layers to insert between the object(s) and support " "material. Set to -1 to use support_material_interface_layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2717 +#: src/libslic3r/PrintConfig.cpp:2742 msgid "Closing radius" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2719 +#: src/libslic3r/PrintConfig.cpp:2744 msgid "" "For snug supports, the support regions will be merged using morphological " "closing operation. Gaps smaller than the closing radius will be filled in." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2727 +#: src/libslic3r/PrintConfig.cpp:2752 msgid "Interface pattern spacing" msgstr "접점 패턴 간격" -#: src/libslic3r/PrintConfig.cpp:2729 +#: src/libslic3r/PrintConfig.cpp:2754 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "접점 라인 간 간격. 솔리드 접점를 가져오려면 0을 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:2738 +#: src/libslic3r/PrintConfig.cpp:2761 +msgid "Support material interface" +msgstr "서포트 접점" + +#: src/libslic3r/PrintConfig.cpp:2763 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " @@ -13199,73 +15068,72 @@ msgstr "" "서포트 재료 접점 레이어 인쇄 속도 백분율(예: 50%)로 표현될 경우 서포트 재료 " "속도에 따라 계산된다." -#: src/libslic3r/PrintConfig.cpp:2747 +#: src/libslic3r/PrintConfig.cpp:2772 msgid "Pattern" msgstr "패턴" -#: src/libslic3r/PrintConfig.cpp:2749 +#: src/libslic3r/PrintConfig.cpp:2774 msgid "Pattern used to generate support material." msgstr "서포트 재료를 생성하는 데 사용되는 패턴." -#: src/libslic3r/PrintConfig.cpp:2755 +#: src/libslic3r/PrintConfig.cpp:2777 msgid "Rectilinear grid" msgstr "직선 그리드" -#: src/libslic3r/PrintConfig.cpp:2761 +#: src/libslic3r/PrintConfig.cpp:2784 msgid "Interface pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2763 +#: src/libslic3r/PrintConfig.cpp:2786 msgid "" "Pattern used to generate support material interface. Default pattern for non-" "soluble support interface is Rectilinear, while default pattern for soluble " "support interface is Concentric." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2777 +#: src/libslic3r/PrintConfig.cpp:2798 msgid "Pattern spacing" msgstr "패턴 간격" -#: src/libslic3r/PrintConfig.cpp:2779 +#: src/libslic3r/PrintConfig.cpp:2800 msgid "Spacing between support material lines." msgstr "서포트 재료 라인 사이의 간격." -#: src/libslic3r/PrintConfig.cpp:2788 +#: src/libslic3r/PrintConfig.cpp:2809 msgid "Speed for printing support material." msgstr "서포트 재료를 인쇄하는 속도." -#: src/libslic3r/PrintConfig.cpp:2795 -msgid "Style" -msgstr "모양새" - -#: src/libslic3r/PrintConfig.cpp:2797 +#: src/libslic3r/PrintConfig.cpp:2818 msgid "" "Style and shape of the support towers. Projecting the supports into a " "regular grid will create more stable supports, while snug support towers " "will save material and reduce object scarring." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2804 +#: src/libslic3r/PrintConfig.cpp:2823 msgid "Snug" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2809 +#: src/libslic3r/PrintConfig.cpp:2824 +msgid "Organic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2830 msgid "Synchronize with object layers" msgstr "객체(object) 레이어와 동기화" -#: src/libslic3r/PrintConfig.cpp:2811 +#: src/libslic3r/PrintConfig.cpp:2832 msgid "" "Synchronize support layers with the object print layers. This is useful with " -"multi-material printers, where the extruder switch is expensive." +"multi-material printers, where the extruder switch is expensive. This option " +"is only available when top contact Z distance is set to zero." msgstr "" -"서포트 레이어를 프린트 레이어와 동기화하십시오. 이것은 스위치가 비싼 다중 메" -"터리얼 프린터에서 유용하다." -#: src/libslic3r/PrintConfig.cpp:2817 +#: src/libslic3r/PrintConfig.cpp:2839 msgid "Overhang threshold" msgstr "오버행 한계점" -#: src/libslic3r/PrintConfig.cpp:2819 +#: src/libslic3r/PrintConfig.cpp:2841 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -13277,11 +15145,11 @@ msgstr "" "성되지 않는다. 즉, 이 값은 서포트 재료 없이 인쇄할 수 있는 가장 수평 경사(수" "평면에서 측정됨)를 나타낸다. 자동 감지를 위해 0으로 설정하십시오(권장)." -#: src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2853 msgid "With sheath around the support" msgstr "서포트 주변이나 외부로" -#: src/libslic3r/PrintConfig.cpp:2833 +#: src/libslic3r/PrintConfig.cpp:2855 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." @@ -13289,42 +15157,107 @@ msgstr "" "기본 서포트 주위에 외장 (단일 주변 선)을 추가하십시오. 이것은 페이스 업을보" "다 신뢰성있게 만들뿐만 아니라 제거하기도 어렵습니다." -#: src/libslic3r/PrintConfig.cpp:2840 +#: src/libslic3r/PrintConfig.cpp:2861 +msgid "Maximum Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2863 +msgid "" +"The maximum angle of the branches, when the branches have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle to be able to have more reach." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2872 +msgid "Preferred Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2874 +msgid "" +"The preferred angle of the branches, when they do not have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle for branches to merge faster." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2883 +msgid "Tip Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2885 +msgid "The diameter of the top of the tip of the branches of organic support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2892 +msgid "Branch Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2894 +msgid "" +"The diameter of the thinnest branches of organic support. Thicker branches " +"are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2902 +msgid "Branch Diameter Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2904 +msgid "" +"The angle of the branches' diameter as they gradually become thicker towards " +"the bottom. An angle of 0 will cause the branches to have uniform thickness " +"over their length. A bit of an angle can increase stability of the organic " +"support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2914 +msgid "Branch Density" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2916 +msgid "" +"Adjusts the density of the support structure used to generate the tips of " +"the branches. A higher value results in better overhangs but the supports " +"are harder to remove, thus it is recommended to enable top support " +"interfaces instead of a high branch density value if dense interfaces are " +"needed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2928 msgid "" "Nozzle temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2843 +#: src/libslic3r/PrintConfig.cpp:2931 msgid "Nozzle temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2849 +#: src/libslic3r/PrintConfig.cpp:2937 msgid "Thick bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2851 +#: src/libslic3r/PrintConfig.cpp:2939 msgid "" "If enabled, bridges are more reliable, can bridge longer distances, but may " "look worse. If disabled, bridges look better but are reliable just for " "shorter bridged distances." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2857 +#: src/libslic3r/PrintConfig.cpp:2945 msgid "Detect thin walls" msgstr "얇은 벽(walls) 감지" -#: src/libslic3r/PrintConfig.cpp:2859 +#: src/libslic3r/PrintConfig.cpp:2947 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." msgstr "싱글 너비 벽 (두 부분이 맞지 않는 부분과 무너지는 부분)을 감지합니다." -#: src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2953 msgid "Threads" msgstr "스레드(Threads)" -#: src/libslic3r/PrintConfig.cpp:2866 +#: src/libslic3r/PrintConfig.cpp:2954 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." @@ -13332,7 +15265,7 @@ msgstr "" "스레드는 장기 실행 태스크를 병렬 처리하는 데 사용됩니다. 최적의 스레드 수는 " "사용 가능한 코어 / 프로세서 수보다 약간 높습니다." -#: src/libslic3r/PrintConfig.cpp:2878 +#: src/libslic3r/PrintConfig.cpp:2966 msgid "" "This custom code is inserted before every toolchange. Placeholder variables " "for all PrusaSlicer settings as well as {toolchange_z}, {previous_extruder} " @@ -13342,7 +15275,7 @@ msgid "" "behaviour both before and after the toolchange." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2891 +#: src/libslic3r/PrintConfig.cpp:2979 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "top surfaces. You may want to use thinner extrudates to fill all narrow " @@ -13356,7 +15289,7 @@ msgstr "" "으면 노즐 지름이 사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준" "으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:2904 +#: src/libslic3r/PrintConfig.cpp:2992 msgid "" "Speed for printing top solid layers (it only applies to the uppermost " "external layers and not to their internal solid layers). You may want to " @@ -13369,15 +15302,15 @@ msgstr "" "전 속도에 대한 백분율 (예 : 80 %)로 나타낼 수 있습니다. 자동으로 0으로 설정하" "십시오." -#: src/libslic3r/PrintConfig.cpp:2919 +#: src/libslic3r/PrintConfig.cpp:3007 msgid "Number of solid layers to generate on top surfaces." msgstr "상단 표면에 생성 할 솔리드 레이어 수입니다." -#: src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3008 msgid "Top solid layers" msgstr "탑 솔리드 레이어" -#: src/libslic3r/PrintConfig.cpp:2928 +#: src/libslic3r/PrintConfig.cpp:3016 msgid "" "The number of top solid layers is increased above top_solid_layers if " "necessary to satisfy minimum thickness of top shell. This is useful to " @@ -13387,30 +15320,30 @@ msgstr "" "top_solid_layers 이상으로 증가한다. 이 기능은 가변 레이어 높이로 인쇄할 때 베" "개 효과를 방지하는 데 유용합니다." -#: src/libslic3r/PrintConfig.cpp:2931 +#: src/libslic3r/PrintConfig.cpp:3019 msgid "Minimum top shell thickness" msgstr "최소 상단 쉘 두께" -#: src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:3026 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "이동 속도 (먼 돌출 점 사이의 점프)." -#: src/libslic3r/PrintConfig.cpp:2946 +#: src/libslic3r/PrintConfig.cpp:3034 msgid "Z travel" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2947 +#: src/libslic3r/PrintConfig.cpp:3035 msgid "" "Speed for movements along the Z axis.\n" "When set to zero, the value is ignored and regular travel speed is used " "instead." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2955 +#: src/libslic3r/PrintConfig.cpp:3043 msgid "Use firmware retraction" msgstr "펌웨어 철회" -#: src/libslic3r/PrintConfig.cpp:2956 +#: src/libslic3r/PrintConfig.cpp:3044 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." @@ -13418,11 +15351,11 @@ msgstr "" "이 실험 설정은 G10 및 G11 명령을 사용하여 펌웨어에서 취소를 처리하도록합니" "다. 이것은 최근의 말린에서만 지원됩니다." -#: src/libslic3r/PrintConfig.cpp:2962 +#: src/libslic3r/PrintConfig.cpp:3050 msgid "Use relative E distances" msgstr "상대적인 E 거리 사용" -#: src/libslic3r/PrintConfig.cpp:2963 +#: src/libslic3r/PrintConfig.cpp:3051 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." @@ -13430,11 +15363,11 @@ msgstr "" "펌웨어에 상대 E 값이 필요한 경우이 값을 선택하고, 그렇지 않으면 선택하지 마십" "시오. 대부분의 회사는 절대 값을 사용합니다." -#: src/libslic3r/PrintConfig.cpp:2969 +#: src/libslic3r/PrintConfig.cpp:3057 msgid "Use volumetric E" msgstr "용적(volumetric) E 사용" -#: src/libslic3r/PrintConfig.cpp:2970 +#: src/libslic3r/PrintConfig.cpp:3058 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -13449,11 +15382,11 @@ msgstr "" "[filament_diameter_0] T0'과 같은 명령을 입력 할 수 있습니다 Slic3r. 이것은 최" "근의 말린에서만 지원됩니다." -#: src/libslic3r/PrintConfig.cpp:2980 +#: src/libslic3r/PrintConfig.cpp:3068 msgid "Enable variable layer height feature" msgstr "가변 레이어 높이 기능 사용" -#: src/libslic3r/PrintConfig.cpp:2981 +#: src/libslic3r/PrintConfig.cpp:3069 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." @@ -13461,11 +15394,11 @@ msgstr "" "일부 프린터 또는 프린터 설정은 가변 레이어 높이로 인쇄하는 데 어려움이있을 " "수 있습니다. 기본적으로 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:2987 +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Wipe while retracting" msgstr "수축시 닦아내십시오" -#: src/libslic3r/PrintConfig.cpp:2988 +#: src/libslic3r/PrintConfig.cpp:3076 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." @@ -13473,7 +15406,7 @@ msgstr "" "이 플래그는 누출된 리트랙싱의 블럽 가능성을 최소화하기 위해 수축하는 동안 노" "즐을 이동시킨다." -#: src/libslic3r/PrintConfig.cpp:2995 +#: src/libslic3r/PrintConfig.cpp:3083 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." @@ -13481,11 +15414,11 @@ msgstr "" "다중 메터리알 프린터는 공구 교환 시 익스트루더를 프라이밍하거나 제거해야 할 " "수 있다. 과도한 물질을 와이퍼 타워에 돌출시킨다." -#: src/libslic3r/PrintConfig.cpp:3001 +#: src/libslic3r/PrintConfig.cpp:3089 msgid "Purging volumes - load/unload volumes" msgstr "볼륨 삭제 - 볼륨 로드/언로드" -#: src/libslic3r/PrintConfig.cpp:3002 +#: src/libslic3r/PrintConfig.cpp:3090 msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " @@ -13495,11 +15428,11 @@ msgstr "" "을 저장 합니다. 이러한 값은 아래의 전체 퍼징 볼륨의 생성을 단순화 하는 데 사" "용 됩니다." -#: src/libslic3r/PrintConfig.cpp:3008 +#: src/libslic3r/PrintConfig.cpp:3096 msgid "Purging volumes - matrix" msgstr "볼륨 삭제 - 행렬" -#: src/libslic3r/PrintConfig.cpp:3009 +#: src/libslic3r/PrintConfig.cpp:3097 msgid "" "This matrix describes volumes (in cubic milimetres) required to purge the " "new filament on the wipe tower for any given pair of tools." @@ -13507,54 +15440,58 @@ msgstr "" "이 매트릭스는 지정 된 도구 쌍에 대해 와이퍼 타워의 새필라멘트를 제거 하는 데 " "필요한 체적 (입방 밀리 미터)을 설명 합니다." -#: src/libslic3r/PrintConfig.cpp:3018 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Position X" msgstr "X축 위치" -#: src/libslic3r/PrintConfig.cpp:3019 +#: src/libslic3r/PrintConfig.cpp:3107 msgid "X coordinate of the left front corner of a wipe tower" msgstr "와이프 타워의 좌측 전면 모서리의 X 좌표" -#: src/libslic3r/PrintConfig.cpp:3025 +#: src/libslic3r/PrintConfig.cpp:3113 msgid "Position Y" msgstr "Y축 위치" -#: src/libslic3r/PrintConfig.cpp:3026 +#: src/libslic3r/PrintConfig.cpp:3114 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "와이퍼 작동 타워의 좌측 전방 모서리의 Y 좌표" -#: src/libslic3r/PrintConfig.cpp:3033 +#: src/libslic3r/PrintConfig.cpp:3120 +msgid "Width" +msgstr "폭" + +#: src/libslic3r/PrintConfig.cpp:3121 msgid "Width of a wipe tower" msgstr "와이퍼 타워 폭" -#: src/libslic3r/PrintConfig.cpp:3039 +#: src/libslic3r/PrintConfig.cpp:3127 msgid "Wipe tower rotation angle" msgstr "와이퍼 타워 회전각도" -#: src/libslic3r/PrintConfig.cpp:3040 +#: src/libslic3r/PrintConfig.cpp:3128 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "X 축에 대해 타워 회전 각도를 닦습니다." -#: src/libslic3r/PrintConfig.cpp:3046 src/libslic3r/PrintConfig.cpp:3047 +#: src/libslic3r/PrintConfig.cpp:3134 src/libslic3r/PrintConfig.cpp:3135 msgid "Wipe tower brim width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3055 +#: src/libslic3r/PrintConfig.cpp:3143 msgid "Wipe into this object's infill" msgstr "이 객체(object)의 채우기로 지우기" -#: src/libslic3r/PrintConfig.cpp:3056 +#: src/libslic3r/PrintConfig.cpp:3144 msgid "" "Purging after toolchange will be done inside this object's infills. This " "lowers the amount of waste but may result in longer print time due to " "additional travel moves." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3063 +#: src/libslic3r/PrintConfig.cpp:3151 msgid "Wipe into this object" msgstr "이 객체(object)로 지우기" -#: src/libslic3r/PrintConfig.cpp:3064 +#: src/libslic3r/PrintConfig.cpp:3152 msgid "" "Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " @@ -13564,19 +15501,19 @@ msgstr "" "프 타워에서 종료 되는 재료를 저장 하고 인쇄 시간을 줄입니다. 그 결과 객체" "(object)의 색상이 혼합 됩니다." -#: src/libslic3r/PrintConfig.cpp:3070 +#: src/libslic3r/PrintConfig.cpp:3158 msgid "Maximal bridging distance" msgstr "최대 브리징 거리" -#: src/libslic3r/PrintConfig.cpp:3071 +#: src/libslic3r/PrintConfig.cpp:3159 msgid "Maximal distance between supports on sparse infill sections." msgstr "드문드문한 인필 섹션에서 지지대 사이의 최대 거리." -#: src/libslic3r/PrintConfig.cpp:3077 +#: src/libslic3r/PrintConfig.cpp:3165 msgid "XY Size Compensation" msgstr "XY 수평 확장" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3167 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" @@ -13585,11 +15522,11 @@ msgstr "" "XY 평면에서 설정된 값(음수 = 안, 양 = 바깥쪽)에 따라 객체(object)가 증가/정격" "된다. 이는 구멍 크기를 미세 조정하는데 유용할 수 있다." -#: src/libslic3r/PrintConfig.cpp:3087 +#: src/libslic3r/PrintConfig.cpp:3175 msgid "Z offset" msgstr "Z 오프셋" -#: src/libslic3r/PrintConfig.cpp:3088 +#: src/libslic3r/PrintConfig.cpp:3176 msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " "output G-code. It is used to compensate for bad Z endstop position: for " @@ -13600,11 +15537,11 @@ msgstr "" "톱 0이 실제로 노즐을 프린트 베드에서 0.3mm 떨어진 곳에 둔 경우, 이를 -0.3(또" "는 엔드 스톱을 고정)으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:3097 +#: src/libslic3r/PrintConfig.cpp:3185 msgid "Perimeter generator" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3099 +#: src/libslic3r/PrintConfig.cpp:3187 msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " @@ -13612,19 +15549,19 @@ msgid "" "Concentric infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3192 msgid "Classic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3107 +#: src/libslic3r/PrintConfig.cpp:3193 msgid "Arachne" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3199 msgid "Perimeter transition length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3114 +#: src/libslic3r/PrintConfig.cpp:3201 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " @@ -13632,11 +15569,11 @@ msgid "" "be computed based on the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3123 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Perimeter transitioning filter margin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3125 +#: src/libslic3r/PrintConfig.cpp:3212 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -13648,11 +15585,11 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3138 +#: src/libslic3r/PrintConfig.cpp:3225 msgid "Perimeter transitioning threshold angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3140 +#: src/libslic3r/PrintConfig.cpp:3227 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -13661,22 +15598,22 @@ msgid "" "these center perimeters, but may leave gaps or overextrude." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3151 +#: src/libslic3r/PrintConfig.cpp:3238 msgid "Perimeter distribution count" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3153 +#: src/libslic3r/PrintConfig.cpp:3240 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " "in width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3247 msgid "Minimum feature size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3162 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " @@ -13685,76 +15622,240 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3172 -msgid "Minimum perimeter width" +#: src/libslic3r/PrintConfig.cpp:3259 +msgid "Minimum perimeter width" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3261 +msgid "" +"Width of the perimeter that will replace thin features (according to the " +"Minimum feature size) of the model. If the Minimum perimeter width is " +"thinner than the thickness of the feature, the perimeter will become as " +"thick as the feature itself. If expressed as a percentage (for example 85%), " +"it will be computed based on the nozzle diameter." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3327 +msgid "Pinhead front diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3329 +msgid "Diameter of the pointing side of the head" +msgstr "헤드 포인팅 측면 지름" + +#: src/libslic3r/PrintConfig.cpp:3336 +msgid "Head penetration" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3338 +msgid "How much the pinhead has to penetrate the model surface" +msgstr "핀 헤드가 모델 표면에 침투 하는 정도" + +#: src/libslic3r/PrintConfig.cpp:3345 +msgid "Pinhead width" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3347 +msgid "Width from the back sphere center to the front sphere center" +msgstr "뒤쪽 구 중재봉선에서 앞쪽 구 중재봉선 까지의 폭입니다" + +#: src/libslic3r/PrintConfig.cpp:3355 +msgid "Pillar diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3357 +msgid "Diameter in mm of the support pillars" +msgstr "서포트 기둥의 지름 (mm)" + +#: src/libslic3r/PrintConfig.cpp:3365 +msgid "Small pillar diameter percent" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3367 +msgid "" +"The percentage of smaller pillars compared to the normal pillar diameter " +"which are used in problematic areas where a normal pilla cannot fit." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3376 +msgid "Max bridges on a pillar" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3378 +msgid "" +"Maximum number of bridges that can be placed on a pillar. Bridges hold " +"support point pinheads and connect to pillars as small branches." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3386 +msgid "Max weight on model" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3389 +msgid "" +"Maximum weight of sub-trees that terminate on the model instead of the print " +"bed. The weight is the sum of the lenghts of all branches emanating from the " +"endpoint." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3397 +msgid "Pillar connection mode" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3398 +msgid "" +"Controls the bridge type between two neighboring pillars. Can be zig-zag, " +"cross (double zig-zag) or dynamic which will automatically switch between " +"the first two depending on the distance of the two pillars." +msgstr "" +"인접한 두 기둥 사이의 교량 유형을 제어 합니다. 두 기둥의 거리에 따라 자동으" +"로 처음 두 사이를 전환 하는 지그재그, 크로스 (지그재그 더블 지그재그) 또는 동" +"적 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Zig-Zag" +msgstr "지그재그" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Cross" +msgstr "크로스" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Dynamic" +msgstr "동적" + +#: src/libslic3r/PrintConfig.cpp:3416 +msgid "Pillar widening factor" +msgstr "기둥 확장 계수" + +#: src/libslic3r/PrintConfig.cpp:3420 +msgid "" +"Merging bridges or pillars into another pillars can increase the radius. " +"Zero means no increase, one means full increase. The exact amount of " +"increase is unspecified and can change in the future." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3431 +msgid "Support base diameter" +msgstr "서포트 베이스 지름" + +#: src/libslic3r/PrintConfig.cpp:3433 +msgid "Diameter in mm of the pillar base" +msgstr "기둥 베이스의 mm 직경" + +#: src/libslic3r/PrintConfig.cpp:3441 +msgid "Support base height" +msgstr "서포트 기준 높이" + +#: src/libslic3r/PrintConfig.cpp:3443 +msgid "The height of the pillar base cone" +msgstr "서포트 베이스 원추의 높이" + +#: src/libslic3r/PrintConfig.cpp:3450 +msgid "Support base safety distance" +msgstr "지지기본 안전 거리" + +#: src/libslic3r/PrintConfig.cpp:3453 +msgid "" +"The minimum distance of the pillar base from the model in mm. Makes sense in " +"zero elevation mode where a gap according to this parameter is inserted " +"between the model and the pad." +msgstr "" +"모델에서 기둥 베이스의 최소 거리(mm.mm.)는 이 매개변수에 따른 간격이 모델과 " +"패드 사이에 삽입되는 제로 고도 모드에서 의미가 있습니다." + +#: src/libslic3r/PrintConfig.cpp:3463 +msgid "Critical angle" +msgstr "임계 각도" + +#: src/libslic3r/PrintConfig.cpp:3465 +msgid "The default angle for connecting support sticks and junctions." +msgstr "서포트 스틱과 접합부를 연결 하는 기본 각도입니다." + +#: src/libslic3r/PrintConfig.cpp:3473 +msgid "Max bridge length" +msgstr "최대 브리지 길이" + +#: src/libslic3r/PrintConfig.cpp:3475 +msgid "The max length of a bridge" +msgstr "브릿지의 최대 길이" + +#: src/libslic3r/PrintConfig.cpp:3487 +msgid "Max pillar linking distance" +msgstr "최대 기둥 연결 거리" + +#: src/libslic3r/PrintConfig.cpp:3489 +msgid "" +"The max distance of two pillars to get linked with each other. A zero value " +"will prohibit pillar cascading." msgstr "" +"서로 연결 되는 두기둥의 최대 거리. 0 값은 기둥을 계단식으로 금지 합니다." -#: src/libslic3r/PrintConfig.cpp:3174 +#: src/libslic3r/PrintConfig.cpp:3499 msgid "" -"Width of the perimeter that will replace thin features (according to the " -"Minimum feature size) of the model. If the Minimum perimeter width is " -"thinner than the thickness of the feature, the perimeter will become as " -"thick as the feature itself. If expressed as a percentage (for example 85%), " -"it will be computed based on the nozzle diameter." +"How much the supports should lift up the supported object. If \"Pad around " +"object\" is enabled, this value is ignored." msgstr "" +"지원 대상을 들어 올려야 하는 양입니다. \"개체 주위 패드\"를 사용하도록 설정하" +"면 이 값은 무시됩니다." -#: src/libslic3r/PrintConfig.cpp:3242 +#: src/libslic3r/PrintConfig.cpp:3515 msgid "Display width" msgstr "디스플레이 너비" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3516 msgid "Width of the display" msgstr "디스플레이의 폭입니다" -#: src/libslic3r/PrintConfig.cpp:3248 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "Display height" msgstr "표시 높이" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3522 msgid "Height of the display" msgstr "디스플레이의 높이" -#: src/libslic3r/PrintConfig.cpp:3254 +#: src/libslic3r/PrintConfig.cpp:3527 msgid "Number of pixels in" msgstr "의 픽셀 수" -#: src/libslic3r/PrintConfig.cpp:3256 +#: src/libslic3r/PrintConfig.cpp:3529 msgid "Number of pixels in X" msgstr "X의 픽셀 수" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3535 msgid "Number of pixels in Y" msgstr "Y의 픽셀 수" -#: src/libslic3r/PrintConfig.cpp:3267 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Display horizontal mirroring" msgstr "수평 미러링 표시" -#: src/libslic3r/PrintConfig.cpp:3268 +#: src/libslic3r/PrintConfig.cpp:3541 msgid "Mirror horizontally" msgstr "수평으로 미러" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3542 msgid "Enable horizontal mirroring of output images" msgstr "출력 이미지의 수평 미러링 사용" -#: src/libslic3r/PrintConfig.cpp:3274 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Display vertical mirroring" msgstr "수직 미러링 표시" -#: src/libslic3r/PrintConfig.cpp:3275 +#: src/libslic3r/PrintConfig.cpp:3548 msgid "Mirror vertically" msgstr "수직으로 미러" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "Enable vertical mirroring of output images" msgstr "출력 이미지의 수직 미러링 사용" -#: src/libslic3r/PrintConfig.cpp:3281 +#: src/libslic3r/PrintConfig.cpp:3554 msgid "Display orientation" msgstr "디스플레이 방향" -#: src/libslic3r/PrintConfig.cpp:3282 +#: src/libslic3r/PrintConfig.cpp:3555 msgid "" "Set the actual LCD display orientation inside the SLA printer. Portrait mode " "will flip the meaning of display width and height parameters and the output " @@ -13764,55 +15865,55 @@ msgstr "" "레이 너비 및 높이 매개 변수의 의미를 반전 하 고 출력 이미지는 90도 회전 합니" "다." -#: src/libslic3r/PrintConfig.cpp:3288 +#: src/libslic3r/PrintConfig.cpp:3559 msgid "Landscape" msgstr "가로" -#: src/libslic3r/PrintConfig.cpp:3289 +#: src/libslic3r/PrintConfig.cpp:3560 msgid "Portrait" msgstr "세로모드" -#: src/libslic3r/PrintConfig.cpp:3294 src/libslic3r/PrintConfig.cpp:3929 +#: src/libslic3r/PrintConfig.cpp:3566 src/libslic3r/PrintConfig.cpp:4058 msgid "Fast" msgstr "빠른" -#: src/libslic3r/PrintConfig.cpp:3295 +#: src/libslic3r/PrintConfig.cpp:3567 msgid "Fast tilt" msgstr "빠른 기울기" -#: src/libslic3r/PrintConfig.cpp:3296 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Time of the fast tilt" msgstr "기울이기 시간" -#: src/libslic3r/PrintConfig.cpp:3303 src/libslic3r/PrintConfig.cpp:3928 +#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:4057 msgid "Slow" msgstr "느리게" -#: src/libslic3r/PrintConfig.cpp:3304 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Slow tilt" msgstr "천천히 기울이기" -#: src/libslic3r/PrintConfig.cpp:3305 +#: src/libslic3r/PrintConfig.cpp:3577 msgid "Time of the slow tilt" msgstr "천천히 기울이는 속도" -#: src/libslic3r/PrintConfig.cpp:3312 src/libslic3r/PrintConfig.cpp:3930 +#: src/libslic3r/PrintConfig.cpp:3584 src/libslic3r/PrintConfig.cpp:4059 msgid "High viscosity" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3313 +#: src/libslic3r/PrintConfig.cpp:3585 msgid "Tilt for high viscosity resin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3314 +#: src/libslic3r/PrintConfig.cpp:3586 msgid "Time of the super slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3321 +#: src/libslic3r/PrintConfig.cpp:3593 msgid "Area fill" msgstr "영역 채우기" -#: src/libslic3r/PrintConfig.cpp:3322 +#: src/libslic3r/PrintConfig.cpp:3594 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -13822,59 +15923,59 @@ msgstr "" "인쇄 영역이 지정 된 값을 초과 하면 \n" "그런 다음 느린 기울기가 사용 됩니다, 그렇지 않으면-빠른 기울기가 됩니다" -#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 -#: src/libslic3r/PrintConfig.cpp:3331 +#: src/libslic3r/PrintConfig.cpp:3601 src/libslic3r/PrintConfig.cpp:3602 +#: src/libslic3r/PrintConfig.cpp:3603 msgid "Printer scaling correction" msgstr "프린터 스케일링 보정" -#: src/libslic3r/PrintConfig.cpp:3337 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3609 src/libslic3r/PrintConfig.cpp:3611 msgid "Printer scaling correction in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3338 +#: src/libslic3r/PrintConfig.cpp:3610 msgid "Printer scaling X axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3345 src/libslic3r/PrintConfig.cpp:3347 +#: src/libslic3r/PrintConfig.cpp:3617 src/libslic3r/PrintConfig.cpp:3619 msgid "Printer scaling correction in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3346 +#: src/libslic3r/PrintConfig.cpp:3618 msgid "Printer scaling Y axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3353 src/libslic3r/PrintConfig.cpp:3355 +#: src/libslic3r/PrintConfig.cpp:3625 src/libslic3r/PrintConfig.cpp:3627 msgid "Printer scaling correction in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3354 +#: src/libslic3r/PrintConfig.cpp:3626 msgid "Printer scaling Z axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3361 src/libslic3r/PrintConfig.cpp:3362 +#: src/libslic3r/PrintConfig.cpp:3633 src/libslic3r/PrintConfig.cpp:3634 msgid "Printer absolute correction" msgstr "프린터 절대 보정" -#: src/libslic3r/PrintConfig.cpp:3363 +#: src/libslic3r/PrintConfig.cpp:3635 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "교정 기호에 따라 슬라이스된 2D 폴리곤을 팽창 하거나 수축 합니다." -#: src/libslic3r/PrintConfig.cpp:3369 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Elephant foot minimum width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3371 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3378 src/libslic3r/PrintConfig.cpp:3379 +#: src/libslic3r/PrintConfig.cpp:3650 src/libslic3r/PrintConfig.cpp:3651 msgid "Printer gamma correction" msgstr "프린터 감마 보정" -#: src/libslic3r/PrintConfig.cpp:3380 +#: src/libslic3r/PrintConfig.cpp:3652 msgid "" "This will apply a gamma correction to the rasterized 2D polygons. A gamma " "value of zero means thresholding with the threshold in the middle. This " @@ -13884,295 +15985,171 @@ msgstr "" "중간에 임계값이 임계화 의미입니다. 이 동작은 폴리곤의 구멍을 잃지 않고 안티알" "리아싱을 제거 합니다." -#: src/libslic3r/PrintConfig.cpp:3399 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3671 src/libslic3r/PrintConfig.cpp:3672 msgid "SLA material type" msgstr "SLA 재질 유형" -#: src/libslic3r/PrintConfig.cpp:3411 src/libslic3r/PrintConfig.cpp:3412 +#: src/libslic3r/PrintConfig.cpp:3679 src/libslic3r/PrintConfig.cpp:3680 msgid "Initial layer height" msgstr "초기 레이어 높이" -#: src/libslic3r/PrintConfig.cpp:3418 src/libslic3r/PrintConfig.cpp:3419 +#: src/libslic3r/PrintConfig.cpp:3686 +msgid "Idle temperature" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3687 +msgid "" +"Nozzle temperature when the tool is currently not used in multi-tool setups." +"This is only used when 'Ooze prevention' is active in Print Settings." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3695 src/libslic3r/PrintConfig.cpp:3696 msgid "Bottle volume" msgstr "병 볼륨" -#: src/libslic3r/PrintConfig.cpp:3420 +#: src/libslic3r/PrintConfig.cpp:3697 msgid "ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3425 src/libslic3r/PrintConfig.cpp:3426 +#: src/libslic3r/PrintConfig.cpp:3702 src/libslic3r/PrintConfig.cpp:3703 msgid "Bottle weight" msgstr "병 무게" -#: src/libslic3r/PrintConfig.cpp:3427 +#: src/libslic3r/PrintConfig.cpp:3704 msgid "kg" msgstr "kg" -#: src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "g/ml" msgstr "g /ml" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3718 msgid "money/bottle" msgstr "가격 /병" -#: src/libslic3r/PrintConfig.cpp:3446 +#: src/libslic3r/PrintConfig.cpp:3723 msgid "Faded layers" msgstr "페이드 레이어" -#: src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3724 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "노출 시간에 필요한 레이어 수는 초기 노출 시간에서 노출 시간으로 페이드" -#: src/libslic3r/PrintConfig.cpp:3454 src/libslic3r/PrintConfig.cpp:3455 +#: src/libslic3r/PrintConfig.cpp:3731 src/libslic3r/PrintConfig.cpp:3732 msgid "Minimum exposure time" msgstr "최소 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3462 src/libslic3r/PrintConfig.cpp:3463 +#: src/libslic3r/PrintConfig.cpp:3739 src/libslic3r/PrintConfig.cpp:3740 msgid "Maximum exposure time" msgstr "최대 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3470 src/libslic3r/PrintConfig.cpp:3471 +#: src/libslic3r/PrintConfig.cpp:3747 src/libslic3r/PrintConfig.cpp:3748 msgid "Exposure time" msgstr "노출 시간" -#: src/libslic3r/PrintConfig.cpp:3477 src/libslic3r/PrintConfig.cpp:3478 +#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3755 msgid "Minimum initial exposure time" msgstr "최소 초기 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3485 src/libslic3r/PrintConfig.cpp:3486 +#: src/libslic3r/PrintConfig.cpp:3762 src/libslic3r/PrintConfig.cpp:3763 msgid "Maximum initial exposure time" msgstr "최대 초기 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3493 src/libslic3r/PrintConfig.cpp:3494 +#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3771 msgid "Initial exposure time" msgstr "초기 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3500 src/libslic3r/PrintConfig.cpp:3501 +#: src/libslic3r/PrintConfig.cpp:3777 src/libslic3r/PrintConfig.cpp:3778 msgid "Correction for expansion" msgstr "확장 보정" -#: src/libslic3r/PrintConfig.cpp:3507 src/libslic3r/PrintConfig.cpp:3508 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3785 msgid "Correction for expansion in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3514 src/libslic3r/PrintConfig.cpp:3515 +#: src/libslic3r/PrintConfig.cpp:3791 src/libslic3r/PrintConfig.cpp:3792 msgid "Correction for expansion in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3521 src/libslic3r/PrintConfig.cpp:3522 +#: src/libslic3r/PrintConfig.cpp:3798 src/libslic3r/PrintConfig.cpp:3799 msgid "Correction for expansion in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3528 +#: src/libslic3r/PrintConfig.cpp:3805 msgid "SLA print material notes" msgstr "SLA 인쇄 재료 참고 사항" -#: src/libslic3r/PrintConfig.cpp:3529 +#: src/libslic3r/PrintConfig.cpp:3806 msgid "You can put your notes regarding the SLA print material here." msgstr "여기에서 SLA 인쇄 자료에 대한 메모를 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3552 +#: src/libslic3r/PrintConfig.cpp:3818 src/libslic3r/PrintConfig.cpp:3829 msgid "Default SLA material profile" msgstr "기본 SLA 재질 프로 파일" -#: src/libslic3r/PrintConfig.cpp:3563 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "Generate supports" msgstr "지원 생성" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3842 msgid "Generate supports for the models" msgstr "모델에 대한 지원 생성" -#: src/libslic3r/PrintConfig.cpp:3570 -msgid "Pinhead front diameter" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3572 -msgid "Diameter of the pointing side of the head" -msgstr "헤드 포인팅 측면 지름" - -#: src/libslic3r/PrintConfig.cpp:3579 -msgid "Head penetration" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3581 -msgid "How much the pinhead has to penetrate the model surface" -msgstr "핀 헤드가 모델 표면에 침투 하는 정도" - -#: src/libslic3r/PrintConfig.cpp:3588 -msgid "Pinhead width" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3590 -msgid "Width from the back sphere center to the front sphere center" -msgstr "뒤쪽 구 중재봉선에서 앞쪽 구 중재봉선 까지의 폭입니다" - -#: src/libslic3r/PrintConfig.cpp:3598 -msgid "Pillar diameter" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3600 -msgid "Diameter in mm of the support pillars" -msgstr "서포트 기둥의 지름 (mm)" - -#: src/libslic3r/PrintConfig.cpp:3608 -msgid "Small pillar diameter percent" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3610 -msgid "" -"The percentage of smaller pillars compared to the normal pillar diameter " -"which are used in problematic areas where a normal pilla cannot fit." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3619 -msgid "Max bridges on a pillar" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3621 -msgid "" -"Maximum number of bridges that can be placed on a pillar. Bridges hold " -"support point pinheads and connect to pillars as small branches." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3629 -msgid "Pillar connection mode" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3630 -msgid "" -"Controls the bridge type between two neighboring pillars. Can be zig-zag, " -"cross (double zig-zag) or dynamic which will automatically switch between " -"the first two depending on the distance of the two pillars." +#: src/libslic3r/PrintConfig.cpp:3847 +msgid "Support tree type" msgstr "" -"인접한 두 기둥 사이의 교량 유형을 제어 합니다. 두 기둥의 거리에 따라 자동으" -"로 처음 두 사이를 전환 하는 지그재그, 크로스 (지그재그 더블 지그재그) 또는 동" -"적 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:3638 -msgid "Zig-Zag" -msgstr "지그재그" - -#: src/libslic3r/PrintConfig.cpp:3639 -msgid "Cross" -msgstr "크로스" - -#: src/libslic3r/PrintConfig.cpp:3640 -msgid "Dynamic" -msgstr "동적" - -#: src/libslic3r/PrintConfig.cpp:3652 -msgid "Pillar widening factor" -msgstr "기둥 확장 계수" -#: src/libslic3r/PrintConfig.cpp:3654 -msgid "" -"Merging bridges or pillars into another pillars can increase the radius. " -"Zero means no increase, one means full increase." +#: src/libslic3r/PrintConfig.cpp:3848 +msgid "Support tree building strategy" msgstr "" -"브릿지 또는 기둥을 다른 기둥에 병합 하면 반지름을 늘릴 수 있습니다. 0은 증가 " -"없음을 의미 하나는 전체 증가를 의미 합니다." - -#: src/libslic3r/PrintConfig.cpp:3663 -msgid "Support base diameter" -msgstr "서포트 베이스 지름" - -#: src/libslic3r/PrintConfig.cpp:3665 -msgid "Diameter in mm of the pillar base" -msgstr "기둥 베이스의 mm 직경" - -#: src/libslic3r/PrintConfig.cpp:3673 -msgid "Support base height" -msgstr "서포트 기준 높이" - -#: src/libslic3r/PrintConfig.cpp:3675 -msgid "The height of the pillar base cone" -msgstr "서포트 베이스 원추의 높이" - -#: src/libslic3r/PrintConfig.cpp:3682 -msgid "Support base safety distance" -msgstr "지지기본 안전 거리" -#: src/libslic3r/PrintConfig.cpp:3685 -msgid "" -"The minimum distance of the pillar base from the model in mm. Makes sense in " -"zero elevation mode where a gap according to this parameter is inserted " -"between the model and the pad." +#: src/libslic3r/PrintConfig.cpp:3851 +msgid "Branching (experimental)" msgstr "" -"모델에서 기둥 베이스의 최소 거리(mm.mm.)는 이 매개변수에 따른 간격이 모델과 " -"패드 사이에 삽입되는 제로 고도 모드에서 의미가 있습니다." - -#: src/libslic3r/PrintConfig.cpp:3695 -msgid "Critical angle" -msgstr "임계 각도" - -#: src/libslic3r/PrintConfig.cpp:3697 -msgid "The default angle for connecting support sticks and junctions." -msgstr "서포트 스틱과 접합부를 연결 하는 기본 각도입니다." -#: src/libslic3r/PrintConfig.cpp:3705 -msgid "Max bridge length" -msgstr "최대 브리지 길이" - -#: src/libslic3r/PrintConfig.cpp:3707 -msgid "The max length of a bridge" -msgstr "브릿지의 최대 길이" - -#: src/libslic3r/PrintConfig.cpp:3714 -msgid "Max pillar linking distance" -msgstr "최대 기둥 연결 거리" - -#: src/libslic3r/PrintConfig.cpp:3716 -msgid "" -"The max distance of two pillars to get linked with each other. A zero value " -"will prohibit pillar cascading." +#: src/libslic3r/PrintConfig.cpp:3860 +msgid "Support only in enforced regions" msgstr "" -"서로 연결 되는 두기둥의 최대 거리. 0 값은 기둥을 계단식으로 금지 합니다." -#: src/libslic3r/PrintConfig.cpp:3726 -msgid "" -"How much the supports should lift up the supported object. If \"Pad around " -"object\" is enabled, this value is ignored." +#: src/libslic3r/PrintConfig.cpp:3862 +msgid "Only create support if it lies in a support enforcer." msgstr "" -"지원 대상을 들어 올려야 하는 양입니다. \"개체 주위 패드\"를 사용하도록 설정하" -"면 이 값은 무시됩니다." -#: src/libslic3r/PrintConfig.cpp:3737 +#: src/libslic3r/PrintConfig.cpp:3869 msgid "This is a relative measure of support points density." msgstr "이는 서포트 점 밀도의 상대적인 척도입니다." -#: src/libslic3r/PrintConfig.cpp:3743 +#: src/libslic3r/PrintConfig.cpp:3875 msgid "Minimal distance of the support points" msgstr "서포트 지점의 최소 거리" -#: src/libslic3r/PrintConfig.cpp:3745 +#: src/libslic3r/PrintConfig.cpp:3877 msgid "No support points will be placed closer than this threshold." msgstr "서포트 지점은 이 임계값 보다 더 가깝게 배치 되지 않습니다." -#: src/libslic3r/PrintConfig.cpp:3751 +#: src/libslic3r/PrintConfig.cpp:3883 msgid "Use pad" msgstr "패드 사용" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3885 msgid "Add a pad underneath the supported model" msgstr "서포트 되는 모델 아래에 패드 추가" -#: src/libslic3r/PrintConfig.cpp:3758 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "Pad wall thickness" msgstr "패드 벽 두께" -#: src/libslic3r/PrintConfig.cpp:3760 +#: src/libslic3r/PrintConfig.cpp:3892 msgid "The thickness of the pad and its optional cavity walls." msgstr "패드의 두께와 옵션 캐비티 벽." -#: src/libslic3r/PrintConfig.cpp:3768 +#: src/libslic3r/PrintConfig.cpp:3900 msgid "Pad wall height" msgstr "패드 벽 높이" -#: src/libslic3r/PrintConfig.cpp:3769 +#: src/libslic3r/PrintConfig.cpp:3901 msgid "" "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " "when enabling this feature, as some resins may produce an extreme suction " @@ -14183,19 +16160,19 @@ msgstr "" "이 기능을 활성화 할 때 주의 해야할, 일부 수 캐비티 내부 극단적인 흡입 효과를 " "생성 할 수도 있기 때문에, vat 호일 인쇄를 벗겨 어렵게 만든다." -#: src/libslic3r/PrintConfig.cpp:3782 +#: src/libslic3r/PrintConfig.cpp:3914 msgid "Pad brim size" msgstr "패드 브럼 사이즈" -#: src/libslic3r/PrintConfig.cpp:3783 +#: src/libslic3r/PrintConfig.cpp:3915 msgid "How far should the pad extend around the contained geometry" msgstr "패드가 포함된 형상 주위로 얼마나 확장되어야 하는지" -#: src/libslic3r/PrintConfig.cpp:3793 +#: src/libslic3r/PrintConfig.cpp:3925 msgid "Max merge distance" msgstr "최대 병합 거리" -#: src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3927 msgid "" "Some objects can get along with a few smaller pads instead of a single big " "one. This parameter defines how far the center of two smaller pads should " @@ -14205,11 +16182,11 @@ msgstr "" "이 매개 변수는 두 개의 작은 패드의 중재봉선이 얼마나 되어야 하는지 정의 합니" "다. 그들은 하나의 패드에 병합을 얻을 것이다." -#: src/libslic3r/PrintConfig.cpp:3815 +#: src/libslic3r/PrintConfig.cpp:3947 msgid "Pad wall slope" msgstr "패드 벽 경사" -#: src/libslic3r/PrintConfig.cpp:3817 +#: src/libslic3r/PrintConfig.cpp:3949 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." @@ -14217,83 +16194,83 @@ msgstr "" "배드 평면을 기준으로 하는 패드 벽의 기울기입니다. 90도는 직선 벽을 의미 합니" "다." -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3960 msgid "Create pad around object and ignore the support elevation" msgstr "오브젝트 주위에 패드를 작성하고 지지 고도를 무시합니다." -#: src/libslic3r/PrintConfig.cpp:3833 +#: src/libslic3r/PrintConfig.cpp:3965 msgid "Pad around object everywhere" msgstr "어디서나 개체 주위에 패드" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3967 msgid "Force pad around object everywhere" msgstr "사방 오브젝트 주위의 포스 패드" -#: src/libslic3r/PrintConfig.cpp:3840 +#: src/libslic3r/PrintConfig.cpp:3972 msgid "Pad object gap" msgstr "패드 객체(object) 갭" -#: src/libslic3r/PrintConfig.cpp:3842 +#: src/libslic3r/PrintConfig.cpp:3974 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "0 고도 모드에서 객체(object) 바닥과 생성된 패드 사이의 간격입니다." -#: src/libslic3r/PrintConfig.cpp:3851 +#: src/libslic3r/PrintConfig.cpp:3983 msgid "Pad object connector stride" msgstr "패드 객체(object) 커넥터 보폭" -#: src/libslic3r/PrintConfig.cpp:3853 +#: src/libslic3r/PrintConfig.cpp:3985 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "오브젝트와 생성된 패드를 연결하는 두 커넥터 스틱 사이의 거리입니다." -#: src/libslic3r/PrintConfig.cpp:3860 +#: src/libslic3r/PrintConfig.cpp:3992 msgid "Pad object connector width" msgstr "패드 객체(object) 커넥터 너비" -#: src/libslic3r/PrintConfig.cpp:3862 +#: src/libslic3r/PrintConfig.cpp:3994 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "개체와 생성된 패드를 연결하는 커넥터 스틱의 너비입니다." -#: src/libslic3r/PrintConfig.cpp:3869 +#: src/libslic3r/PrintConfig.cpp:4001 msgid "Pad object connector penetration" msgstr "패드 객체(object) 커넥터 침투" -#: src/libslic3r/PrintConfig.cpp:3872 +#: src/libslic3r/PrintConfig.cpp:4004 msgid "How much should the tiny connectors penetrate into the model body." msgstr "작은 커넥터가 모델 본체에 얼마나 침투해야 하는가?" -#: src/libslic3r/PrintConfig.cpp:3879 +#: src/libslic3r/PrintConfig.cpp:4011 msgid "Enable hollowing" msgstr "속빈 공동 사용" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:4013 msgid "Hollow out a model to have an empty interior" msgstr "빈 내부를 가지고 모델을 비우기" -#: src/libslic3r/PrintConfig.cpp:3886 +#: src/libslic3r/PrintConfig.cpp:4018 msgid "Wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3888 +#: src/libslic3r/PrintConfig.cpp:4020 msgid "Minimum wall thickness of a hollowed model." msgstr "속이 빈 모델의 최소 벽 두께입니다." -#: src/libslic3r/PrintConfig.cpp:3896 +#: src/libslic3r/PrintConfig.cpp:4028 msgid "Accuracy" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3898 +#: src/libslic3r/PrintConfig.cpp:4030 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." msgstr "" "성능 계산의 정확성. 값이 낮을수록 원치 않는 아티팩트가 생성될 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:4040 msgid "" "Hollowing is done in two steps: first, an imaginary interior is calculated " "deeper (offset plus the closing distance) in the object and then it's " @@ -14302,181 +16279,213 @@ msgid "" "most." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3920 +#: src/libslic3r/PrintConfig.cpp:4052 msgid "Print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3922 +#: src/libslic3r/PrintConfig.cpp:4054 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " "movement and adds a delay before exposure." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4390 +#: src/libslic3r/PrintConfig.cpp:4065 +msgid "Format of the output SLA archive" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4070 +msgid "SLA output precision" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4071 +msgid "Minimum resolution in nanometers" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4542 msgid "Export OBJ" msgstr "OBJ 내보내기" -#: src/libslic3r/PrintConfig.cpp:4391 +#: src/libslic3r/PrintConfig.cpp:4543 msgid "Export the model(s) as OBJ." msgstr "모델을 OBJ로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4554 msgid "Export SLA" msgstr "STL로 내보내기" -#: src/libslic3r/PrintConfig.cpp:4403 +#: src/libslic3r/PrintConfig.cpp:4555 msgid "Slice the model and export SLA printing layers as PNG." msgstr "모델을 분할하고 SLA 인쇄 레이어를 PNG로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4408 +#: src/libslic3r/PrintConfig.cpp:4560 msgid "Export 3MF" msgstr "3MF 내보내기" -#: src/libslic3r/PrintConfig.cpp:4409 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Export the model(s) as 3MF." msgstr "모델을 3MF로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4413 +#: src/libslic3r/PrintConfig.cpp:4565 msgid "Export AMF" msgstr "AMF 내보내기" -#: src/libslic3r/PrintConfig.cpp:4414 +#: src/libslic3r/PrintConfig.cpp:4566 msgid "Export the model(s) as AMF." msgstr "모델을 AMF로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4418 +#: src/libslic3r/PrintConfig.cpp:4570 msgid "Export STL" msgstr "STL 내보내기" -#: src/libslic3r/PrintConfig.cpp:4419 +#: src/libslic3r/PrintConfig.cpp:4571 msgid "Export the model(s) as STL." msgstr "모델을 STL로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4424 +#: src/libslic3r/PrintConfig.cpp:4576 msgid "Slice the model and export toolpaths as G-code." msgstr "모델을 슬라이스하고 공구 경로를 G 코드로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4581 msgid "G-code viewer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4430 +#: src/libslic3r/PrintConfig.cpp:4582 msgid "Visualize an already sliced and saved G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4588 +msgid "OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4589 +msgid "Select the specified OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4594 +msgid "OpenGL debug output" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4595 +msgid "Activate OpenGL debug output on graphic cards which support it" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4601 msgid "Slice" msgstr "슬라이스" -#: src/libslic3r/PrintConfig.cpp:4436 +#: src/libslic3r/PrintConfig.cpp:4602 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "" " printer_technology 구성 값을 기반으로 모델을 FFF 또는 SLA로 슬라이스합니다." -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4607 msgid "Help" msgstr "도움말" -#: src/libslic3r/PrintConfig.cpp:4442 +#: src/libslic3r/PrintConfig.cpp:4608 msgid "Show this help." msgstr "이 도움말을 표시 합니다." -#: src/libslic3r/PrintConfig.cpp:4447 +#: src/libslic3r/PrintConfig.cpp:4613 msgid "Help (FFF options)" msgstr "도움말 (FFF 옵션)" -#: src/libslic3r/PrintConfig.cpp:4448 +#: src/libslic3r/PrintConfig.cpp:4614 msgid "Show the full list of print/G-code configuration options." msgstr "인쇄/G 코드 구성 옵션의 전체 목록을 표시 합니다." -#: src/libslic3r/PrintConfig.cpp:4452 +#: src/libslic3r/PrintConfig.cpp:4618 msgid "Help (SLA options)" msgstr "도움말 (SLA 옵션)" -#: src/libslic3r/PrintConfig.cpp:4453 +#: src/libslic3r/PrintConfig.cpp:4619 msgid "Show the full list of SLA print configuration options." msgstr "SLA 인쇄 구성 옵션의 전체 목록을 표시 합니다." -#: src/libslic3r/PrintConfig.cpp:4457 +#: src/libslic3r/PrintConfig.cpp:4623 msgid "Output Model Info" msgstr "출력 모델 정보" -#: src/libslic3r/PrintConfig.cpp:4458 +#: src/libslic3r/PrintConfig.cpp:4624 msgid "Write information about the model to the console." msgstr "모델에 대한 정보를 콘솔에 씁니다." -#: src/libslic3r/PrintConfig.cpp:4462 +#: src/libslic3r/PrintConfig.cpp:4628 msgid "Save config file" msgstr "구성 파일 저장" -#: src/libslic3r/PrintConfig.cpp:4463 +#: src/libslic3r/PrintConfig.cpp:4629 msgid "Save configuration to the specified file." msgstr "지정 된 파일에 구성을 저장 합니다." -#: src/libslic3r/PrintConfig.cpp:4473 +#: src/libslic3r/PrintConfig.cpp:4639 msgid "Align XY" msgstr "XY 정렬" -#: src/libslic3r/PrintConfig.cpp:4474 +#: src/libslic3r/PrintConfig.cpp:4640 msgid "Align the model to the given point." msgstr "모델을 지정된 점에 맞춥니다." -#: src/libslic3r/PrintConfig.cpp:4479 +#: src/libslic3r/PrintConfig.cpp:4645 msgid "Cut model at the given Z." msgstr "지정된 Z에서 모델을 잘라냅니다." -#: src/libslic3r/PrintConfig.cpp:4501 +#: src/libslic3r/PrintConfig.cpp:4666 +msgid "Center" +msgstr "중앙" + +#: src/libslic3r/PrintConfig.cpp:4667 msgid "Center the print around the given center." msgstr "지정된 점을 중재봉선으로 인쇄 합니다." -#: src/libslic3r/PrintConfig.cpp:4505 +#: src/libslic3r/PrintConfig.cpp:4671 msgid "Don't arrange" msgstr "준비하지 마십시오" -#: src/libslic3r/PrintConfig.cpp:4506 +#: src/libslic3r/PrintConfig.cpp:4672 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" "병합하기 전에 지정된 모델을 재정렬하고 원래 XY 좌표를 유지하지 마십시오." -#: src/libslic3r/PrintConfig.cpp:4509 +#: src/libslic3r/PrintConfig.cpp:4675 msgid "Ensure on bed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4510 +#: src/libslic3r/PrintConfig.cpp:4676 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4514 +#: src/libslic3r/PrintConfig.cpp:4680 msgid "Duplicate" msgstr "복사" -#: src/libslic3r/PrintConfig.cpp:4515 +#: src/libslic3r/PrintConfig.cpp:4681 msgid "Multiply copies by this factor." msgstr "이 계수로 복사본을 곱합니다." -#: src/libslic3r/PrintConfig.cpp:4519 +#: src/libslic3r/PrintConfig.cpp:4685 msgid "Duplicate by grid" msgstr "모눈에 따라 복제" -#: src/libslic3r/PrintConfig.cpp:4520 +#: src/libslic3r/PrintConfig.cpp:4686 msgid "Multiply copies by creating a grid." msgstr "그리드를 만들어 복사본을 곱합니다." -#: src/libslic3r/PrintConfig.cpp:4524 +#: src/libslic3r/PrintConfig.cpp:4690 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." msgstr "" "한 번 작업을 수행하기 위해 제공 된 모델을 정렬하고 단일 모델로 병합 합니다." -#: src/libslic3r/PrintConfig.cpp:4529 +#: src/libslic3r/PrintConfig.cpp:4695 msgid "" "Try to repair any non-manifold meshes (this option is implicitly added " "whenever we need to slice the model to perform the requested action)." @@ -14484,31 +16493,31 @@ msgstr "" "메쉬를 복구 하십시오 (요청 된 작업을 수행 하기 위해 모델을 슬라이스 해야 할때" "마다 이 옵션이 암시적으로 추가 됨)." -#: src/libslic3r/PrintConfig.cpp:4533 +#: src/libslic3r/PrintConfig.cpp:4699 msgid "Rotation angle around the Z axis in degrees." msgstr "Z 축 주위 회전 각도입니다." -#: src/libslic3r/PrintConfig.cpp:4537 +#: src/libslic3r/PrintConfig.cpp:4703 msgid "Rotate around X" msgstr "X 주위 회전" -#: src/libslic3r/PrintConfig.cpp:4538 +#: src/libslic3r/PrintConfig.cpp:4704 msgid "Rotation angle around the X axis in degrees." msgstr "X 축을 중재봉선 회전 각도 입니다." -#: src/libslic3r/PrintConfig.cpp:4542 +#: src/libslic3r/PrintConfig.cpp:4708 msgid "Rotate around Y" msgstr "Y 주위로 회전" -#: src/libslic3r/PrintConfig.cpp:4543 +#: src/libslic3r/PrintConfig.cpp:4709 msgid "Rotation angle around the Y axis in degrees." msgstr "Y 축을 중재봉선 회전 각도 입니다." -#: src/libslic3r/PrintConfig.cpp:4548 +#: src/libslic3r/PrintConfig.cpp:4714 msgid "Scaling factor or percentage." msgstr "배율 인수 또는 백분율입니다." -#: src/libslic3r/PrintConfig.cpp:4553 +#: src/libslic3r/PrintConfig.cpp:4719 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." @@ -14516,29 +16525,37 @@ msgstr "" "지정 된 모델에서 연결 되지 않은 부품(Part)을 감지 하여 별도의 객체(object)로 " "분할 합니다." -#: src/libslic3r/PrintConfig.cpp:4556 +#: src/libslic3r/PrintConfig.cpp:4722 msgid "Scale to Fit" msgstr "크기에 맞게 조정" -#: src/libslic3r/PrintConfig.cpp:4557 +#: src/libslic3r/PrintConfig.cpp:4723 msgid "Scale to fit the given volume." msgstr "지정 된 볼륨에 맞게 크기를 조정 합니다." -#: src/libslic3r/PrintConfig.cpp:4566 +#: src/libslic3r/PrintConfig.cpp:4727 +msgid "Delete files after loading" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4728 +msgid "Delete files after loading." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4736 msgid "Ignore non-existent config files" msgstr "존재 하지 않는 구성 파일 무시" -#: src/libslic3r/PrintConfig.cpp:4567 +#: src/libslic3r/PrintConfig.cpp:4737 msgid "Do not fail if a file supplied to --load does not exist." msgstr "로드에 제공 된 파일이 없는 경우 실패 하지 않습니다." -#: src/libslic3r/PrintConfig.cpp:4570 +#: src/libslic3r/PrintConfig.cpp:4740 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4741 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -14546,27 +16563,27 @@ msgid "" "substitute an unknown value with a default silently or verbosely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4745 msgid "Bail out on unknown configuration values" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4579 +#: src/libslic3r/PrintConfig.cpp:4746 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4580 +#: src/libslic3r/PrintConfig.cpp:4747 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4584 +#: src/libslic3r/PrintConfig.cpp:4752 msgid "Load config file" msgstr "구성 파일 로드" -#: src/libslic3r/PrintConfig.cpp:4585 +#: src/libslic3r/PrintConfig.cpp:4753 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -14574,33 +16591,33 @@ msgstr "" "지정 된 파일에서 구성을 로드 합니다. 여러 파일에서 옵션을 로드 하는 데 두 번 " "이상 사용할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:4588 +#: src/libslic3r/PrintConfig.cpp:4756 msgid "Output File" msgstr "출력파일" -#: src/libslic3r/PrintConfig.cpp:4589 +#: src/libslic3r/PrintConfig.cpp:4757 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." msgstr "" "출력이 기록 되는 파일 (지정 하지 않은 경우 입력 파일을 기반으로 합니다)." -#: src/libslic3r/PrintConfig.cpp:4593 +#: src/libslic3r/PrintConfig.cpp:4761 msgid "Single instance mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4594 +#: src/libslic3r/PrintConfig.cpp:4762 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " "the \"single_instance\" configuration value from application preferences." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4605 +#: src/libslic3r/PrintConfig.cpp:4767 msgid "Data directory" msgstr "데이터 디렉터리" -#: src/libslic3r/PrintConfig.cpp:4606 +#: src/libslic3r/PrintConfig.cpp:4768 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -14609,11 +16626,11 @@ msgstr "" "지정 된 디렉터리에 설정을 로드 하 고 저장 합니다. 이 기능은 다른 프로 파일을 " "유지 관리 하거나 네트워크 스토리지의 구성을 포함 하는 데 유용 합니다." -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4771 msgid "Logging level" msgstr "로깅 수준" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4772 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -14623,11 +16640,11 @@ msgstr "" "trace\n" "예를 들어. loglevel=2 치명적인, 오류 및 경고 수준 메시지를 기록합니다." -#: src/libslic3r/PrintConfig.cpp:4616 +#: src/libslic3r/PrintConfig.cpp:4778 msgid "Render with a software renderer" msgstr "소프트웨어 렌더러를 사용 하 여 렌더링" -#: src/libslic3r/PrintConfig.cpp:4617 +#: src/libslic3r/PrintConfig.cpp:4779 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -14639,18 +16656,30 @@ msgstr "" msgid "Error with zip archive" msgstr "zip 아카이브와 오류가 발생 했습니다" -#: src/libslic3r/PrintObject.cpp:126 +#: src/libslic3r/PrintObject.cpp:152 msgid "Generating perimeters" msgstr "둘레 생성" -#: src/libslic3r/PrintObject.cpp:229 +#: src/libslic3r/PrintObject.cpp:257 msgid "Preparing infill" msgstr "채우기 준비" -#: src/libslic3r/PrintObject.cpp:403 +#: src/libslic3r/PrintObject.cpp:402 +msgid "making infill" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:449 +msgid "Searching support spots" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:474 msgid "Generating support material" msgstr "지원할 서포트 생성" +#: src/libslic3r/PrintObject.cpp:495 +msgid "Estimating curled extrusions" +msgstr "" + #: resources/data/hints.ini: [hint:Fuzzy skin] msgid "" "Fuzzy skin\n" @@ -14921,6 +16950,36 @@ msgid "" "F11 hotkey." msgstr "" +#: resources/data/hints.ini: [hint:Printables integration] +msgid "" +"Printables.com integration\n" +"Did you know that when you are browsing Printables.com, you can send 3D " +"model files to PrusaSlicer with a single click? Learn more in the " +"documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Cut tool] +msgid "" +"Cut tool\n" +"Did you know that you can cut a model at any angle and even create aligning " +"pins with the updated Cut tool? Learn more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Measurement tool] +msgid "" +"Measurement tool\n" +"Did you know that you can measure the distances between points, edges " +"and planes, the radius of a hole or the angle between edges or planes? Learn " +"more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Text tool] +msgid "" +"Text tool\n" +"Did you know that you can add custom text labels to your models or even use " +"the text as a modifier? Learn more in the documentation." +msgstr "" + #: ../src/common/debugrpt.cpp:586 msgid "" "\n" @@ -16116,6 +18175,11 @@ msgstr "왼쪽 정렬" msgid "Align Right" msgstr "오른쪽 정렬" +#: ../src/richtext/richtextsizepage.cpp:266 +#, fuzzy +msgid "Alignment" +msgstr "정렬(&A)" + #: ../src/generic/filectrlg.cpp:1197 ../src/common/fldlgcmn.cpp:107 #, c-format msgid "All files (%s)|%s" @@ -17441,10 +19505,6 @@ msgstr "Decorative" msgid "Default encoding" msgstr "기본 인코딩" -#: ../src/dfb/fontmgr.cpp:180 -msgid "Default font" -msgstr "기본 글꼴" - #: ../src/generic/prntdlgg.cpp:510 msgid "Default printer" msgstr "프린터 기본값" @@ -17820,11 +19880,6 @@ msgstr "인쇄하는 도중 오류 발생:" msgid "Error: " msgstr "오류:" -#. TRANSLATORS: Name of keyboard key -#: ../src/common/accelcmn.cpp:69 -msgid "Esc" -msgstr "" - #. TRANSLATORS: Name of keyboard key #: ../src/common/accelcmn.cpp:70 #, fuzzy @@ -18582,11 +20637,6 @@ msgstr "복사" msgid "Folio, 8 1/2 x 13 in" msgstr "Folio, 8 1/2 x 13 in" -#: ../src/richtext/richtextformatdlg.cpp:344 ../src/osx/carbon/fontdlg.cpp:287 -#: ../src/common/stockitem.cpp:194 -msgid "Font" -msgstr "Font" - #: ../src/richtext/richtextfontpage.cpp:221 msgid "Font &weight:" msgstr "글꼴 굵기(&W):" @@ -19727,11 +21777,6 @@ msgstr "'%s' 파일이 VFS에 이미 포함되어 있습니다." msgid "Menu" msgstr "메뉴" -#: ../src/common/msgout.cpp:124 -#, fuzzy -msgid "Message" -msgstr "알림 : %s" - #: ../src/univ/themes/metal.cpp:168 msgid "Metal theme" msgstr "메탈 테마" @@ -19766,10 +21811,6 @@ msgstr "" msgid "Modern" msgstr "Modern" -#: ../src/generic/filectrlg.cpp:427 -msgid "Modified" -msgstr "수정됨" - #: ../src/common/module.cpp:133 #, c-format msgid "Module \"%s\" initialization failed" @@ -19863,11 +21904,6 @@ msgstr "새 이름" msgid "Next page" msgstr "다음 페이지" -#: ../include/wx/msgdlg.h:277 ../src/common/stockitem.cpp:177 -#: ../src/motif/msgdlg.cpp:196 -msgid "No" -msgstr "아니오" - #. TRANSLATORS: System cursor name #: ../src/propgrid/advprops.cpp:1764 msgid "No Entry" @@ -20109,12 +22145,6 @@ msgstr "" msgid "Numbered outline" msgstr "Numbered 형태" -#: ../include/wx/msgdlg.h:278 ../src/richtext/richtextstyledlg.cpp:297 -#: ../src/common/stockitem.cpp:178 ../src/msw/msgdlg.cpp:454 -#: ../src/msw/msgdlg.cpp:747 ../src/gtk1/fontdlg.cpp:138 -msgid "OK" -msgstr "확인" - #: ../src/msw/ole/automtn.cpp:692 #, c-format msgid "OLE Automation error in %s: %s" @@ -20187,6 +22217,10 @@ msgstr "옵션에 '%s' 값이 필요합니다." msgid "Option '%s': '%s' cannot be converted to a date." msgstr "옵션 '%s': '%s' 를 날짜로 변환할 수 없습니다." +#: ../src/generic/prntdlgg.cpp:618 +msgid "Options" +msgstr "설정" + #: ../src/propgrid/advprops.cpp:1606 msgid "Orange" msgstr "" @@ -20994,10 +23028,6 @@ msgstr "일반 또는 기울임 모양새 선택하시오." msgid "Select underlining or no underlining." msgstr "밑줄/밑줄 없음 을 선택합니다." -#: ../src/motif/filedlg.cpp:220 -msgid "Selection" -msgstr "선택" - #: ../src/richtext/richtextliststylepage.cpp:187 #: ../src/richtext/richtextliststylepage.cpp:189 msgid "Selects the list level to edit." @@ -21908,10 +23938,6 @@ msgstr "VFS에서 파일 '%s' 를 삭제할 수 없습니다.(로딩되지 않 msgid "Turkish (ISO-8859-9)" msgstr "터키어 (ISO-8859-9)" -#: ../src/generic/filectrlg.cpp:426 -msgid "Type" -msgstr "타입" - #: ../src/richtext/richtextfontpage.cpp:151 #: ../src/richtext/richtextfontpage.cpp:153 msgid "Type a font name." @@ -22418,10 +24444,6 @@ msgstr "현재 정렬 방식 사용" msgid "Validation conflict" msgstr "충돌" -#: ../src/propgrid/manager.cpp:238 -msgid "Value" -msgstr "" - #: ../src/propgrid/props.cpp:386 ../src/propgrid/props.cpp:500 #, c-format msgid "Value must be %s or higher." @@ -22666,11 +24688,6 @@ msgstr "XPM: %d 행에서 이미지가 잘렸습니다!" msgid "Yellow" msgstr "" -#: ../include/wx/msgdlg.h:276 ../src/common/stockitem.cpp:206 -#: ../src/motif/msgdlg.cpp:196 -msgid "Yes" -msgstr "예" - #: ../src/osx/carbon/overlay.cpp:155 msgid "You cannot Clear an overlay that is not inited" msgstr "오버레이 지울수 없습니다. 초기화 되지 않았습니다." diff --git a/resources/localization/ko_KR/PrusaSlicer.mo b/resources/localization/ko_KR/PrusaSlicer.mo index 3806248411b92e2c7398509bfba5a1cf9aa21497..e9dc41ca3e330251a163626ddb2cb47c12b6084e 100644 GIT binary patch delta 74986 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 D8_KCB delta 79886 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 diff --git a/resources/localization/ko_KR/PrusaSlicer_ko.po b/resources/localization/ko_KR/PrusaSlicer_ko.po index 821fe9412fc..2d7c38fda6c 100644 --- a/resources/localization/ko_KR/PrusaSlicer_ko.po +++ b/resources/localization/ko_KR/PrusaSlicer_ko.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-01 16:30+0100\n" +"POT-Creation-Date: 2023-03-03 14:25+0100\n" "PO-Revision-Date: 2021-04-05 21:03+0900\n" "Last-Translator: \n" "Language-Team: \n" @@ -18,16 +18,16 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 2.4.2\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 +#: src/slic3r/GUI/AboutDialog.cpp:46 src/slic3r/GUI/AboutDialog.cpp:306 msgid "Portions copyright" msgstr "다른 저작권" -#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 +#: src/slic3r/GUI/AboutDialog.cpp:143 src/slic3r/GUI/AboutDialog.cpp:270 msgid "Copyright" msgstr "저작권" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:143 +#: src/slic3r/GUI/AboutDialog.cpp:145 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -35,26 +35,26 @@ msgstr "" "다음의 모든 프로그램 (라이브러리)의 라이센스 계약은 응용 프로그램 라이센스 계" "약의 일부입니다" -#: src/slic3r/GUI/AboutDialog.cpp:212 +#: src/slic3r/GUI/AboutDialog.cpp:214 #, c-format, boost-format msgid "About %s" msgstr "%s 정보" -#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 -#: src/slic3r/GUI/GUI_App.cpp:262 +#: src/slic3r/GUI/AboutDialog.cpp:245 src/slic3r/GUI/AboutDialog.cpp:370 +#: src/slic3r/GUI/GUI_App.cpp:271 msgid "Version" msgstr "버전" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:277 msgid "is licensed under the" msgstr "이 라이센스는" -#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:273 src/slic3r/GUI/GUI_App.cpp:277 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero 일반 공공 라이센스, 버전 3" -#: src/slic3r/GUI/AboutDialog.cpp:273 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -62,7 +62,7 @@ msgstr "" "프루사슬라이서는 알레산드로 라넬루치와 RepRap 커뮤니티 Slic3r를 기반으로합니" "다." -#: src/slic3r/GUI/AboutDialog.cpp:274 +#: src/slic3r/GUI/AboutDialog.cpp:275 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -72,7 +72,7 @@ msgstr "" "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " "numerous others. 한국어 번역 울산에테르, 밤송이직박구리 (2.2.0)" -#: src/slic3r/GUI/AboutDialog.cpp:310 +#: src/slic3r/GUI/AboutDialog.cpp:311 msgid "Copy Version Info" msgstr "버전 정보" @@ -99,54 +99,54 @@ msgid "" msgstr "" #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:162 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:204 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:188 msgid "Slicing complete" msgstr "슬라이스 완료" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:199 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183 #, boost-format msgid "Masked SLA file exported to %1%" msgstr "마스크 된 SLA 파일을 %1%로 내보냅니" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:286 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:279 msgid "Access violation" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:288 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:281 msgid "Illegal instruction" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:283 msgid "Divide by zero" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:292 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:285 msgid "Overflow" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:294 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:287 msgid "Underflow" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:297 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 msgid "Floating reserved operand" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:300 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:293 msgid "Stack overflow" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:659 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:726 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:652 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:719 msgid "Running post-processing scripts" msgstr "포스트 프로세싱(후처리) 스크립트 실행" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:690 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:710 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:683 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:703 msgid "Unknown error occured during exporting G-code." msgstr "G-코드를 내보내는 동안 알 수 없는 오류가 발생했습니다." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:695 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:688 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. Maybe the SD " @@ -157,7 +157,7 @@ msgstr "" "쓰기?\n" "오류 메시지: %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:698 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:691 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. There might be " @@ -168,7 +168,7 @@ msgstr "" "수 있습니다, 다시 내보내거나 다른 장치를 사용하여 보십시오. 손상된 출력 G 코" "드는 %1%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:701 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:694 #, boost-format msgid "" "Renaming of the G-code after copying to the selected destination folder has " @@ -177,7 +177,7 @@ msgstr "" "선택한 대상 폴더로 복사한 후 G 코드의 이름을 변경하지 못했습니다. 현재 경로" "는 %1%.tmp. 다시 내보내주세요." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:704 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:697 #, boost-format msgid "" "Copying of the temporary G-code has finished but the original code at %1% " @@ -186,7 +186,7 @@ msgstr "" "임시 G 코드 복사가 완료되었지만 복사 검사 중에 %1% 원래 코드를 열 수 없습니" "다. 출력 G 코드는 %2%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:707 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:700 #, boost-format msgid "" "Copying of the temporary G-code has finished but the exported code couldn't " @@ -195,16 +195,16 @@ msgstr "" "임시 G 코드 복사가 완료되었지만 복사 확인 중에 내보낸 코드를 열 수 없습니다. " "출력 G 코드는 %1%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:715 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:708 #, boost-format msgid "G-code file exported to %1%" msgstr "%1%로 내보낸 G 코드 파일" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:729 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:722 msgid "Copying of the temporary G-code to the output G-code failed" msgstr "임시 G코드 복사를 출력 G 코드로 복사하는 데 실패" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:751 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:738 #, boost-format msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" @@ -212,8 +212,9 @@ msgstr "" "오" #: src/slic3r/GUI/BedShapeDialog.cpp:31 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2765 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1576 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:241 src/slic3r/GUI/Plater.cpp:220 +#: src/slic3r/GUI/Tab.cpp:2697 msgid "Size" msgstr "크기" @@ -221,7 +222,9 @@ msgstr "크기" msgid "Origin" msgstr "원본" -#: src/slic3r/GUI/BedShapeDialog.cpp:33 src/libslic3r/PrintConfig.cpp:1020 +#: src/slic3r/GUI/BedShapeDialog.cpp:33 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1994 +#: src/libslic3r/PrintConfig.cpp:1109 msgid "Diameter" msgstr "필라멘트 직경" @@ -235,54 +238,62 @@ msgid "" "rectangle." msgstr "사각 전면 왼쪽 모서리에서 원저(0, 0) G-코드 좌표 거리입니다." -#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:262 -#: src/slic3r/GUI/ConfigWizard.cpp:1476 src/slic3r/GUI/ConfigWizard.cpp:1490 +#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:291 +#: src/slic3r/GUI/ConfigWizard.cpp:1796 src/slic3r/GUI/ConfigWizard.cpp:1832 +#: src/slic3r/GUI/ConfigWizard.cpp:1846 #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:100 -#: src/slic3r/GUI/GCodeViewer.cpp:3181 src/slic3r/GUI/GCodeViewer.cpp:3187 -#: src/slic3r/GUI/GCodeViewer.cpp:3195 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 src/slic3r/GUI/GCodeViewer.cpp:3455 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 #: src/slic3r/GUI/GUI_ObjectLayers.cpp:145 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 src/libslic3r/PrintConfig.cpp:263 -#: src/libslic3r/PrintConfig.cpp:290 src/libslic3r/PrintConfig.cpp:297 -#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:520 -#: src/libslic3r/PrintConfig.cpp:546 src/libslic3r/PrintConfig.cpp:621 -#: src/libslic3r/PrintConfig.cpp:629 src/libslic3r/PrintConfig.cpp:679 -#: src/libslic3r/PrintConfig.cpp:813 src/libslic3r/PrintConfig.cpp:824 -#: src/libslic3r/PrintConfig.cpp:842 src/libslic3r/PrintConfig.cpp:1023 -#: src/libslic3r/PrintConfig.cpp:1235 src/libslic3r/PrintConfig.cpp:1302 -#: src/libslic3r/PrintConfig.cpp:1312 src/libslic3r/PrintConfig.cpp:1611 -#: src/libslic3r/PrintConfig.cpp:1805 src/libslic3r/PrintConfig.cpp:1866 -#: src/libslic3r/PrintConfig.cpp:1884 src/libslic3r/PrintConfig.cpp:1902 -#: src/libslic3r/PrintConfig.cpp:1965 src/libslic3r/PrintConfig.cpp:1975 -#: src/libslic3r/PrintConfig.cpp:2097 src/libslic3r/PrintConfig.cpp:2106 -#: src/libslic3r/PrintConfig.cpp:2125 src/libslic3r/PrintConfig.cpp:2146 -#: src/libslic3r/PrintConfig.cpp:2158 src/libslic3r/PrintConfig.cpp:2166 -#: src/libslic3r/PrintConfig.cpp:2207 src/libslic3r/PrintConfig.cpp:2215 -#: src/libslic3r/PrintConfig.cpp:2225 src/libslic3r/PrintConfig.cpp:2233 -#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2303 -#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2603 -#: src/libslic3r/PrintConfig.cpp:2620 src/libslic3r/PrintConfig.cpp:2721 -#: src/libslic3r/PrintConfig.cpp:2730 src/libslic3r/PrintConfig.cpp:2780 -#: src/libslic3r/PrintConfig.cpp:2932 src/libslic3r/PrintConfig.cpp:3020 -#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3034 -#: src/libslic3r/PrintConfig.cpp:3048 src/libslic3r/PrintConfig.cpp:3072 -#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3092 -#: src/libslic3r/PrintConfig.cpp:3372 src/libslic3r/PrintConfig.cpp:3413 -#: src/libslic3r/PrintConfig.cpp:3573 src/libslic3r/PrintConfig.cpp:3582 -#: src/libslic3r/PrintConfig.cpp:3591 src/libslic3r/PrintConfig.cpp:3601 -#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3676 -#: src/libslic3r/PrintConfig.cpp:3688 src/libslic3r/PrintConfig.cpp:3708 -#: src/libslic3r/PrintConfig.cpp:3718 src/libslic3r/PrintConfig.cpp:3728 -#: src/libslic3r/PrintConfig.cpp:3746 src/libslic3r/PrintConfig.cpp:3761 -#: src/libslic3r/PrintConfig.cpp:3775 src/libslic3r/PrintConfig.cpp:3786 -#: src/libslic3r/PrintConfig.cpp:3799 src/libslic3r/PrintConfig.cpp:3844 -#: src/libslic3r/PrintConfig.cpp:3854 src/libslic3r/PrintConfig.cpp:3863 -#: src/libslic3r/PrintConfig.cpp:3873 src/libslic3r/PrintConfig.cpp:3889 -#: src/libslic3r/PrintConfig.cpp:3913 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 src/libslic3r/PrintConfig.cpp:279 +#: src/libslic3r/PrintConfig.cpp:303 src/libslic3r/PrintConfig.cpp:310 +#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:657 src/libslic3r/PrintConfig.cpp:724 +#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:782 +#: src/libslic3r/PrintConfig.cpp:902 src/libslic3r/PrintConfig.cpp:913 +#: src/libslic3r/PrintConfig.cpp:931 src/libslic3r/PrintConfig.cpp:1112 +#: src/libslic3r/PrintConfig.cpp:1295 src/libslic3r/PrintConfig.cpp:1359 +#: src/libslic3r/PrintConfig.cpp:1369 src/libslic3r/PrintConfig.cpp:1650 +#: src/libslic3r/PrintConfig.cpp:1842 src/libslic3r/PrintConfig.cpp:1903 +#: src/libslic3r/PrintConfig.cpp:1921 src/libslic3r/PrintConfig.cpp:1939 +#: src/libslic3r/PrintConfig.cpp:1995 src/libslic3r/PrintConfig.cpp:2005 +#: src/libslic3r/PrintConfig.cpp:2127 src/libslic3r/PrintConfig.cpp:2136 +#: src/libslic3r/PrintConfig.cpp:2155 src/libslic3r/PrintConfig.cpp:2176 +#: src/libslic3r/PrintConfig.cpp:2188 src/libslic3r/PrintConfig.cpp:2196 +#: src/libslic3r/PrintConfig.cpp:2237 src/libslic3r/PrintConfig.cpp:2245 +#: src/libslic3r/PrintConfig.cpp:2255 src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2271 src/libslic3r/PrintConfig.cpp:2336 +#: src/libslic3r/PrintConfig.cpp:2565 src/libslic3r/PrintConfig.cpp:2632 +#: src/libslic3r/PrintConfig.cpp:2647 src/libslic3r/PrintConfig.cpp:2746 +#: src/libslic3r/PrintConfig.cpp:2755 src/libslic3r/PrintConfig.cpp:2801 +#: src/libslic3r/PrintConfig.cpp:2886 src/libslic3r/PrintConfig.cpp:2896 +#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3108 +#: src/libslic3r/PrintConfig.cpp:3115 src/libslic3r/PrintConfig.cpp:3122 +#: src/libslic3r/PrintConfig.cpp:3136 src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3170 src/libslic3r/PrintConfig.cpp:3180 +#: src/libslic3r/PrintConfig.cpp:3330 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3391 src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3444 src/libslic3r/PrintConfig.cpp:3456 +#: src/libslic3r/PrintConfig.cpp:3476 src/libslic3r/PrintConfig.cpp:3491 +#: src/libslic3r/PrintConfig.cpp:3501 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3681 src/libslic3r/PrintConfig.cpp:3878 +#: src/libslic3r/PrintConfig.cpp:3893 src/libslic3r/PrintConfig.cpp:3907 +#: src/libslic3r/PrintConfig.cpp:3918 src/libslic3r/PrintConfig.cpp:3931 +#: src/libslic3r/PrintConfig.cpp:3976 src/libslic3r/PrintConfig.cpp:3986 +#: src/libslic3r/PrintConfig.cpp:3995 src/libslic3r/PrintConfig.cpp:4005 +#: src/libslic3r/PrintConfig.cpp:4021 src/libslic3r/PrintConfig.cpp:4045 +#: src/libslic3r/PrintConfig.cpp:4072 msgid "mm" msgstr "mm" @@ -300,13 +311,13 @@ msgstr "직사각형" msgid "Circular" msgstr "원형" -#: src/slic3r/GUI/BedShapeDialog.cpp:81 src/slic3r/GUI/GUI_Preview.cpp:252 -#: src/libslic3r/ExtrusionEntity.cpp:343 src/libslic3r/ExtrusionEntity.cpp:378 +#: src/slic3r/GUI/BedShapeDialog.cpp:81 msgid "Custom" msgstr "사용자 정의" #: src/slic3r/GUI/BedShapeDialog.cpp:104 src/slic3r/GUI/BedShapeDialog.cpp:179 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1701 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1565 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1798 msgid "Shape" msgstr "모양" @@ -314,8 +325,8 @@ msgstr "모양" msgid "Load shape from STL..." msgstr "STL파일 로드." -#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2147 +#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3914 +#: src/slic3r/GUI/MainFrame.cpp:2240 msgid "Settings" msgstr "설정" @@ -328,7 +339,7 @@ msgid "Load..." msgstr "불러오기..." #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/Tab.cpp:3973 msgid "Remove" msgstr "삭제" @@ -340,108 +351,175 @@ msgstr "찾을 수 없습니다:" msgid "Model" msgstr "모델" -#: src/slic3r/GUI/BedShapeDialog.cpp:508 +#: src/slic3r/GUI/BedShapeDialog.cpp:506 msgid "Choose an STL file to import bed shape from:" msgstr "가져올 베드 모양을(STL 파일) 선택합니다:" -#: src/slic3r/GUI/BedShapeDialog.cpp:514 src/slic3r/GUI/BedShapeDialog.cpp:562 -#: src/slic3r/GUI/BedShapeDialog.cpp:584 +#: src/slic3r/GUI/BedShapeDialog.cpp:512 src/slic3r/GUI/BedShapeDialog.cpp:560 +#: src/slic3r/GUI/BedShapeDialog.cpp:582 msgid "Invalid file format." msgstr "잘못된 파일 형식." -#: src/slic3r/GUI/BedShapeDialog.cpp:525 +#: src/slic3r/GUI/BedShapeDialog.cpp:523 msgid "Error! Invalid model" msgstr "오류! 잘못된 모델" -#: src/slic3r/GUI/BedShapeDialog.cpp:533 +#: src/slic3r/GUI/BedShapeDialog.cpp:531 msgid "The selected file contains no geometry." msgstr "선택한 파일에 없는 형상이 있습니다." -#: src/slic3r/GUI/BedShapeDialog.cpp:537 +#: src/slic3r/GUI/BedShapeDialog.cpp:535 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "" "선택한 파일은 여러개의 분리 된 영역을 포함 되어 있어 지원 되지 않습니다." -#: src/slic3r/GUI/BedShapeDialog.cpp:552 +#: src/slic3r/GUI/BedShapeDialog.cpp:550 msgid "Choose a file to import bed texture from (PNG/SVG):" msgstr "(PNG / SVG)에서 침대 텍스처를 가져올 파일을 선택합니다." -#: src/slic3r/GUI/BedShapeDialog.cpp:574 +#: src/slic3r/GUI/BedShapeDialog.cpp:572 msgid "Choose an STL file to import bed model from:" msgstr "다음에서 베드 모델을 가져올 STL 파일을 선택합니다:" -#: src/slic3r/GUI/BedShapeDialog.hpp:95 src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/BedShapeDialog.hpp:96 src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape" msgstr "침대(bed) 모양" -#: src/slic3r/GUI/BonjourDialog.cpp:55 +#: src/slic3r/GUI/BonjourDialog.cpp:58 msgid "Network lookup" msgstr "네트워크 조회" -#: src/slic3r/GUI/BonjourDialog.cpp:72 +#: src/slic3r/GUI/BonjourDialog.cpp:75 src/slic3r/GUI/BonjourDialog.cpp:253 msgid "Address" msgstr "주소" -#: src/slic3r/GUI/BonjourDialog.cpp:73 +#: src/slic3r/GUI/BonjourDialog.cpp:76 msgid "Hostname" msgstr "호스트 이름" -#: src/slic3r/GUI/BonjourDialog.cpp:74 +#: src/slic3r/GUI/BonjourDialog.cpp:77 msgid "Service name" msgstr "서비스 이름" -#: src/slic3r/GUI/BonjourDialog.cpp:76 +#: src/slic3r/GUI/BonjourDialog.cpp:79 msgid "OctoPrint version" msgstr "옥토프린트 버전" -#: src/slic3r/GUI/BonjourDialog.cpp:224 +#: src/slic3r/GUI/BonjourDialog.cpp:227 msgid "Searching for devices" msgstr "장치 검색" -#: src/slic3r/GUI/BonjourDialog.cpp:231 +#: src/slic3r/GUI/BonjourDialog.cpp:234 msgid "Finished" msgstr "완료" -#: src/slic3r/GUI/ButtonsDescription.cpp:42 +#: src/slic3r/GUI/BonjourDialog.cpp:240 +msgid "Multiple resolved IP addresses" +msgstr "" + +#: src/slic3r/GUI/BonjourDialog.cpp:249 +#, boost-format +msgid "" +"There are several IP addresses resolving to hostname %1%.\n" +"Please select one that should be used." +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:21 +msgid "Palette 1 (default)" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:22 +msgid "Palette 2" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:23 +msgid "Palette 3" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:24 +msgid "Palette 4" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:25 +msgid "Palette 5" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:26 +msgid "Palette 6" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:27 +msgid "Palette 7" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:28 +msgid "Palette 8" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:112 msgid "Revert color to default" msgstr "" -#: src/slic3r/GUI/ButtonsDescription.cpp:57 +#: src/slic3r/GUI/ButtonsDescription.cpp:127 msgid "Value is the same as the system value" msgstr "이 값은 시스템 값과 같습니다" -#: src/slic3r/GUI/ButtonsDescription.cpp:58 +#: src/slic3r/GUI/ButtonsDescription.cpp:128 msgid "" "Value was changed and is not equal to the system value or the last saved " "preset" msgstr "값이 변경 되었고, 시스템 값 또는 마지막으로 저장된 설정값과 다릅니다." -#: src/slic3r/GUI/ButtonsDescription.cpp:62 +#: src/slic3r/GUI/ButtonsDescription.cpp:155 +msgid "Default palette for mode markers" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2422 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Simple" +msgstr "단순" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2424 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgctxt "Mode" +msgid "Advanced" +msgstr "고급" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2425 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Expert" +msgstr "전문가" + +#: src/slic3r/GUI/ButtonsDescription.cpp:182 +msgid "Revert color" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:200 msgid "Buttons And Text Colors Description" msgstr "버튼 및 글자 색상 설명" -#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/ConfigManipulation.cpp:50 msgid "" "Layer height is not valid.\n" "\n" "The layer height will be reset to 0.01." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:50 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1449 -#: src/libslic3r/PrintConfig.cpp:286 +#: src/slic3r/GUI/ConfigManipulation.cpp:51 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1394 +#: src/libslic3r/PrintConfig.cpp:299 msgid "Layer height" msgstr "레이어 높이" -#: src/slic3r/GUI/ConfigManipulation.cpp:61 +#: src/slic3r/GUI/ConfigManipulation.cpp:62 msgid "" "First layer height is not valid.\n" "\n" "The first layer height will be reset to 0.01." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:62 src/libslic3r/PrintConfig.cpp:1231 +#: src/slic3r/GUI/ConfigManipulation.cpp:63 src/libslic3r/PrintConfig.cpp:1291 msgid "First layer height" msgstr "첫 레이어 높이" @@ -452,7 +530,6 @@ msgid "" "- no top solid layers\n" "- 0% fill density\n" "- no support material\n" -"- Ensure vertical shell thickness enabled\n" "- Detect thin walls disabled" msgstr "" "나선형 꽃병 모드는 다음을 필요로 합니다.\n" @@ -460,51 +537,49 @@ msgstr "" "- 상단 솔리드 레이어 없음\n" "- 0% f 밀도\n" "- 지원 자료 없음\n" -"- 수직 쉘 두께가 활성화되었는지 확인\n" "- 얇은 벽이 비활성화 감지" -#: src/slic3r/GUI/ConfigManipulation.cpp:90 +#: src/slic3r/GUI/ConfigManipulation.cpp:89 msgid "Shall I adjust those settings in order to enable Spiral Vase?" msgstr "나선형 꽃병을 활성화하기 위해 이러한 설정을 조정해야 합니까?" -#: src/slic3r/GUI/ConfigManipulation.cpp:91 +#: src/slic3r/GUI/ConfigManipulation.cpp:90 msgid "Spiral Vase" msgstr "나선형 꽃병" -#: src/slic3r/GUI/ConfigManipulation.cpp:121 +#: src/slic3r/GUI/ConfigManipulation.cpp:123 msgid "" -"The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool " -"change.\n" -"(both support_material_extruder and support_material_interface_extruder need " -"to be set to 0)." +"For the Wipe Tower to work with the soluble supports, the support layers\n" +"need to be synchronized with the object layers." msgstr "" -"와이프 타워는 현재 공구 교체를 트리거하지 않고 현재의 압출기로 인쇄 하는 경우" -"에만 비가용성 서포트를 지원 합니다. (support_material_extruder과 " -"support_material_interface_extruder 모두 0으로 설정 해야 합니다.)" - -#: src/slic3r/GUI/ConfigManipulation.cpp:125 -msgid "Shall I adjust those settings in order to enable the Wipe Tower?" -msgstr "와이프 타워를 활성화하기 위해 이러한 설정을 조정해야 합니까?" +"와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 오브젝트 레이" +"어와 동기화 해야 합니다." #: src/slic3r/GUI/ConfigManipulation.cpp:126 -#: src/slic3r/GUI/ConfigManipulation.cpp:146 +msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" +msgstr "지우기 타워를 활성화하기 위해 지원 레이어를 동기화해야 합니까?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:127 +#: src/slic3r/GUI/ConfigManipulation.cpp:145 msgid "Wipe Tower" msgstr "와이프 타워 - 버려진 필라멘트 조절" -#: src/slic3r/GUI/ConfigManipulation.cpp:142 +#: src/slic3r/GUI/ConfigManipulation.cpp:140 src/libslic3r/Print.cpp:672 msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers\n" -"need to be synchronized with the object layers." +"The Wipe Tower currently supports the non-soluble supports only if they are " +"printed with the current extruder without triggering a tool change. (both " +"support_material_extruder and support_material_interface_extruder need to be " +"set to 0)." msgstr "" -"와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 오브젝트 레이" -"어와 동기화 해야 합니다." +"와이프 타워는 현재 공구 교체를 트리거하지 않고 현재의 압출기로 인쇄 하는 경우" +"에만 비가용성 서포트를 지원 합니다. (support_material_extruder과 " +"support_material_interface_extruder 모두 0으로 설정 해야 합니다.)" -#: src/slic3r/GUI/ConfigManipulation.cpp:145 -msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" -msgstr "지우기 타워를 활성화하기 위해 지원 레이어를 동기화해야 합니까?" +#: src/slic3r/GUI/ConfigManipulation.cpp:144 +msgid "Shall I adjust those settings in order to enable the Wipe Tower?" +msgstr "와이프 타워를 활성화하기 위해 이러한 설정을 조정해야 합니까?" -#: src/slic3r/GUI/ConfigManipulation.cpp:164 +#: src/slic3r/GUI/ConfigManipulation.cpp:166 msgid "" "Supports work better, if the following feature is enabled:\n" "- Detect bridging perimeters" @@ -512,184 +587,188 @@ msgstr "" "다음 기능이 활성화된 경우 더 나은 작업을 지원합니다.\n" "- 브리징 경계 감지" -#: src/slic3r/GUI/ConfigManipulation.cpp:167 +#: src/slic3r/GUI/ConfigManipulation.cpp:169 msgid "Shall I adjust those settings for supports?" msgstr "지원 설정을 조정해야 합니까?" -#: src/slic3r/GUI/ConfigManipulation.cpp:168 +#: src/slic3r/GUI/ConfigManipulation.cpp:170 msgid "Support Generator" msgstr "지원 발전기" -#: src/slic3r/GUI/ConfigManipulation.cpp:195 +#: src/slic3r/GUI/ConfigManipulation.cpp:194 #, boost-format msgid "The %1% infill pattern is not supposed to work at 100%% density." msgstr "%1% 채우기 패턴은 100%% 밀도로 작동하지 않아야합니다." -#: src/slic3r/GUI/ConfigManipulation.cpp:198 +#: src/slic3r/GUI/ConfigManipulation.cpp:196 msgid "Shall I switch to rectilinear fill pattern?" msgstr "직선 채우기 패턴으로 전환해야 합니까?" -#: src/slic3r/GUI/ConfigManipulation.cpp:199 +#: src/slic3r/GUI/ConfigManipulation.cpp:197 #: src/slic3r/GUI/GUI_Factories.cpp:55 src/slic3r/GUI/GUI_Factories.cpp:128 -#: src/slic3r/GUI/Plater.cpp:460 src/slic3r/GUI/Tab.cpp:1503 -#: src/slic3r/GUI/Tab.cpp:1505 src/libslic3r/PrintConfig.cpp:475 -#: src/libslic3r/PrintConfig.cpp:716 src/libslic3r/PrintConfig.cpp:743 -#: src/libslic3r/PrintConfig.cpp:1098 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1149 src/libslic3r/PrintConfig.cpp:1398 -#: src/libslic3r/PrintConfig.cpp:1427 src/libslic3r/PrintConfig.cpp:1496 -#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1535 -#: src/libslic3r/PrintConfig.cpp:2364 src/libslic3r/PrintConfig.cpp:2381 +#: src/slic3r/GUI/Plater.cpp:468 src/slic3r/GUI/Tab.cpp:1450 +#: src/slic3r/GUI/Tab.cpp:1452 src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:811 src/libslic3r/PrintConfig.cpp:831 +#: src/libslic3r/PrintConfig.cpp:1187 src/libslic3r/PrintConfig.cpp:1200 +#: src/libslic3r/PrintConfig.cpp:1225 src/libslic3r/PrintConfig.cpp:1444 +#: src/libslic3r/PrintConfig.cpp:1473 src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1557 src/libslic3r/PrintConfig.cpp:1576 +#: src/libslic3r/PrintConfig.cpp:2395 src/libslic3r/PrintConfig.cpp:2412 msgid "Infill" msgstr "채움(infill)" -#: src/slic3r/GUI/ConfigManipulation.cpp:337 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Head penetration should not be greater than the head width." msgstr "머리 침투가 머리 너비보다 크지 않아야 합니다." -#: src/slic3r/GUI/ConfigManipulation.cpp:339 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid Head penetration" msgstr "잘못된 헤드 관통" -#: src/slic3r/GUI/ConfigManipulation.cpp:350 +#: src/slic3r/GUI/ConfigManipulation.cpp:362 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "핀헤드 지름은 기둥 지름 보다 작아야 합니다." -#: src/slic3r/GUI/ConfigManipulation.cpp:352 +#: src/slic3r/GUI/ConfigManipulation.cpp:364 msgid "Invalid pinhead diameter" msgstr "잘못된 핀 헤드 지름" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20 msgid "Upgrade" msgstr "업그레이드" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22 msgid "Downgrade" msgstr "다운그레이드" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 msgid "Before roll back" msgstr "롤백 하기 전에" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:340 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:26 src/libslic3r/PrintConfig.cpp:353 msgid "User" msgstr "사용자" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:329 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:29 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1135 msgid "Unknown" msgstr "알 수 없음" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 msgid "Active" msgstr "활성" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 msgid "PrusaSlicer version" msgstr "프라사슬라이서 버전" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 src/libslic3r/Preset.cpp:1341 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 src/libslic3r/Preset.cpp:1480 msgid "print" msgstr "출력" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:65 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 msgid "filaments" msgstr "필 라 멘 트" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 src/libslic3r/Preset.cpp:1343 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:67 src/libslic3r/Preset.cpp:1482 msgid "SLA print" msgstr "SLA 프린트" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69 -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/slic3r/GUI/GUI.cpp:340 -#: src/slic3r/GUI/Plater.cpp:821 src/libslic3r/Preset.cpp:1344 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/slic3r/GUI/GUI.cpp:331 +#: src/slic3r/GUI/Plater.cpp:851 src/libslic3r/Preset.cpp:1483 msgid "SLA material" msgstr "SLA 재료" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:71 src/libslic3r/Preset.cpp:1345 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 src/libslic3r/Preset.cpp:1484 msgid "printer" msgstr "프린터" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 src/slic3r/GUI/Tab.cpp:1366 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 src/slic3r/GUI/Tab.cpp:1311 msgid "vendor" msgstr "벤더" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 msgid "version" msgstr "버전" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:76 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 msgid "min PrusaSlicer version" msgstr "이전 프라사슬라이스 버전" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:77 msgid "max PrusaSlicer version" msgstr "최신 프라사슬라이저 버전" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "model" msgstr "모델" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "variants" msgstr "변종" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:93 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:92 #, c-format, boost-format msgid "Incompatible with this %s" msgstr "이 %s 호환되지 않습니다." -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:96 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:95 msgid "Activate" msgstr "활성화" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:123 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:122 msgid "Configuration Snapshots" msgstr "구성 스냅샷" -#: src/slic3r/GUI/ConfigWizard.cpp:262 +#: src/slic3r/GUI/ConfigWizard.cpp:291 msgid "nozzle" msgstr "노즐" -#: src/slic3r/GUI/ConfigWizard.cpp:266 +#: src/slic3r/GUI/ConfigWizard.cpp:295 msgid "Alternate nozzles:" msgstr "대체 노즐:" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "All standard" msgstr "전부 기본값" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "Standard" msgstr "표준" -#: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3833 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 +#: src/slic3r/GUI/ConfigWizard.cpp:360 src/slic3r/GUI/ConfigWizard.cpp:681 +#: src/slic3r/GUI/FileArchiveDialog.cpp:261 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 src/slic3r/GUI/Preferences.cpp:550 +#: src/slic3r/GUI/Tab.cpp:4058 src/slic3r/GUI/UnsavedChangesDialog.cpp:1161 msgid "All" msgstr "모두" -#: src/slic3r/GUI/ConfigWizard.cpp:332 src/slic3r/GUI/ConfigWizard.cpp:652 -#: src/slic3r/GUI/DoubleSlider.cpp:2030 src/slic3r/GUI/Plater.cpp:432 -#: src/slic3r/GUI/Plater.cpp:579 src/slic3r/GUI/Preferences.cpp:436 -#: src/libslic3r/PrintConfig.cpp:1291 +#: src/slic3r/GUI/ConfigWizard.cpp:361 src/slic3r/GUI/ConfigWizard.cpp:682 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 +#: src/slic3r/GUI/FileArchiveDialog.cpp:265 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1984 src/slic3r/GUI/Plater.cpp:439 +#: src/slic3r/GUI/Plater.cpp:594 src/slic3r/GUI/Preferences.cpp:552 +#: src/libslic3r/PrintConfig.cpp:1347 msgid "None" msgstr "없음" -#: src/slic3r/GUI/ConfigWizard.cpp:484 +#: src/slic3r/GUI/ConfigWizard.cpp:513 #, c-format, boost-format msgid "Welcome to the %s Configuration Assistant" msgstr "%s 구성 도우미에 오신 것을 환영 합니다" -#: src/slic3r/GUI/ConfigWizard.cpp:486 +#: src/slic3r/GUI/ConfigWizard.cpp:515 #, c-format, boost-format msgid "Welcome to the %s Configuration Wizard" msgstr "%s 구성 마법사에 오신 것을 환영 합니다" -#: src/slic3r/GUI/ConfigWizard.cpp:488 +#: src/slic3r/GUI/ConfigWizard.cpp:517 msgid "Welcome" msgstr "환영합니다" -#: src/slic3r/GUI/ConfigWizard.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:519 #, c-format, boost-format msgid "" "Hello, welcome to %s! This %s helps you with the initial configuration; just " @@ -698,104 +777,133 @@ msgstr "" "안녕하세요 ,%s에 오신 것을 환영 합니다! 이 %s는 초기 구성에 도움이 됩니다. " "몇 가지 설정만으로 인쇄 준비가 될 것입니다." -#: src/slic3r/GUI/ConfigWizard.cpp:495 +#: src/slic3r/GUI/ConfigWizard.cpp:524 msgid "Remove user profiles (a snapshot will be taken beforehand)" msgstr "사용자 프로필 제거(스냅샷이 사전에 촬영됨)" -#: src/slic3r/GUI/ConfigWizard.cpp:498 +#: src/slic3r/GUI/ConfigWizard.cpp:527 msgid "" "Perform desktop integration (Sets this binary to be searchable by the " "system)." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:550 +#: src/slic3r/GUI/ConfigWizard.cpp:579 #, c-format, boost-format msgid "%s Family" msgstr "%s 패밀리" -#: src/slic3r/GUI/ConfigWizard.cpp:640 +#: src/slic3r/GUI/ConfigWizard.cpp:670 msgid "Printer:" msgstr "프린터:" -#: src/slic3r/GUI/ConfigWizard.cpp:642 +#: src/slic3r/GUI/ConfigWizard.cpp:672 msgid "Vendor:" msgstr "벤더:" -#: src/slic3r/GUI/ConfigWizard.cpp:643 +#: src/slic3r/GUI/ConfigWizard.cpp:673 msgid "Profile:" msgstr "프로필:" -#: src/slic3r/GUI/ConfigWizard.cpp:720 src/slic3r/GUI/ConfigWizard.cpp:892 -#: src/slic3r/GUI/ConfigWizard.cpp:952 src/slic3r/GUI/ConfigWizard.cpp:1088 +#: src/slic3r/GUI/ConfigWizard.cpp:750 src/slic3r/GUI/ConfigWizard.cpp:938 +#: src/slic3r/GUI/ConfigWizard.cpp:1024 src/slic3r/GUI/ConfigWizard.cpp:1163 msgid "(All)" msgstr "(All)" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:754 src/slic3r/GUI/ConfigWizard.cpp:1165 +msgid "(Templates)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:789 #, boost-format msgid "" -"%1% marked with * are not compatible with some installed " -"printers." +"%1% visible for (\"Template\") printer are universal profiles " +"available for all printers. These might not be compatible with your printer." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:752 src/slic3r/GUI/ConfigWizard.cpp:2043 -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filaments" msgstr "필 라 멘 트" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 msgid "SLA materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:755 +#: src/slic3r/GUI/ConfigWizard.cpp:791 +#, boost-format +msgid "" +"%1% marked with * are not compatible with some installed " +"printers." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:794 #, boost-format msgid "All installed printers are compatible with the selected %1%." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/libslic3r/Preset.cpp:1342 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/libslic3r/Preset.cpp:1481 msgid "filament" msgstr "필라멘트 설정을 선택" -#: src/slic3r/GUI/ConfigWizard.cpp:778 +#: src/slic3r/GUI/ConfigWizard.cpp:818 msgid "" "Only the following installed printers are compatible with the selected " "filaments" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:779 +#: src/slic3r/GUI/ConfigWizard.cpp:819 msgid "" "Only the following installed printers are compatible with the selected SLA " "materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1213 +msgid "" +"You have selected template filament. Please note that these filaments are " +"available for all printers but are NOT certain to be compatible with your " +"printer. Do you still wish to have this filament selected?\n" +"(This message won't be displayed again.)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1214 src/slic3r/GUI/ConfigWizard.cpp:2720 +#: src/slic3r/GUI/ConfigWizard.cpp:2860 src/slic3r/GUI/DoubleSlider.cpp:2591 +#: src/slic3r/GUI/DoubleSlider.cpp:2612 src/slic3r/GUI/GUI.cpp:245 +#: src/slic3r/GUI/GUI_App.cpp:3458 src/slic3r/GUI/UpdateDialogs.cpp:204 +#: src/slic3r/GUI/UpdateDialogs.cpp:212 src/slic3r/GUI/UpdateDialogs.cpp:217 +#: src/slic3r/GUI/UpdateDialogs.cpp:222 src/slic3r/GUI/UpdateDialogs.cpp:229 +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +msgid "Notice" +msgstr "공지" + +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer Setup" msgstr "사용자 지정 프린터 설정" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer" msgstr "사용자 지정 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:1177 +#: src/slic3r/GUI/ConfigWizard.cpp:1264 msgid "Define a custom printer profile" msgstr "사용자 정의 프린터 프로필" -#: src/slic3r/GUI/ConfigWizard.cpp:1179 +#: src/slic3r/GUI/ConfigWizard.cpp:1265 msgid "Custom profile name:" msgstr "사용자 정의 프로필 명칭:" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Automatic updates" msgstr "자동 업데이트" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Updates" msgstr "업데이트" -#: src/slic3r/GUI/ConfigWizard.cpp:1214 +#: src/slic3r/GUI/ConfigWizard.cpp:1290 msgid "Check for application updates" msgstr "응용 프로그램 업데이트 확인" -#: src/slic3r/GUI/ConfigWizard.cpp:1218 +#: src/slic3r/GUI/ConfigWizard.cpp:1294 #, c-format, boost-format msgid "" "If enabled, %s checks for new application versions online. When a new " @@ -807,11 +915,11 @@ msgstr "" "되면, 다음 응용 프로그램 시작시 알림이 표시됩니다 (프로그램 사용 중에는 절대" "로 사용하지 마십시오).이것은 단순한 알림 일뿐 자동으로 설치가 되지 않습니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1224 src/slic3r/GUI/Preferences.cpp:175 +#: src/slic3r/GUI/ConfigWizard.cpp:1300 src/slic3r/GUI/Preferences.cpp:306 msgid "Update built-in Presets automatically" msgstr "기본 제공 사전 설정 자동 업데이트" -#: src/slic3r/GUI/ConfigWizard.cpp:1228 +#: src/slic3r/GUI/ConfigWizard.cpp:1304 #, c-format, boost-format msgid "" "If enabled, %s downloads updates of built-in system presets in the " @@ -823,7 +931,7 @@ msgstr "" "한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 사전 설정 버전을 사용" "할 수 있게되면 응용 프로그램 시작시 제공됩니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1231 +#: src/slic3r/GUI/ConfigWizard.cpp:1307 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." @@ -831,24 +939,68 @@ msgstr "" "업데이트는 사용자의 동의를 받아야 하고, 지정된 이전 설정을 덮어 쓰지 않습니" "다." -#: src/slic3r/GUI/ConfigWizard.cpp:1236 +#: src/slic3r/GUI/ConfigWizard.cpp:1312 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." msgstr "" "또한 업데이트가 적용되기 전에 전체 구성의 백업 구성(스냅샷)이 생성됩니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1243 src/slic3r/GUI/GUI_Factories.cpp:726 -#: src/slic3r/GUI/Plater.cpp:3582 +#: src/slic3r/GUI/ConfigWizard.cpp:1361 src/slic3r/GUI/Preferences.cpp:1076 +msgid "Download path" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1366 src/slic3r/GUI/FirmwareDialog.cpp:815 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:300 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +msgid "Browse" +msgstr "찾아보기" + +#: src/slic3r/GUI/ConfigWizard.cpp:1371 +msgid "Choose folder:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads from URL" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1417 +msgid "Allow built-in downloader" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1424 +#, c-format, boost-format +msgid "" +"If enabled, %s registers to start on custom URL on www.printables.com. You " +"will be able to use button with %s logo to open models in this %s. The model " +"will be downloaded into folder you choose bellow." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1431 +msgid "" +"On Linux systems the process of registration also creates desktop " +"integration files for this version of application." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1458 +msgid "Chosen directory for downloads does not Exists." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1545 src/slic3r/GUI/GUI_Factories.cpp:810 +#: src/slic3r/GUI/Plater.cpp:3732 msgid "Reload from disk" msgstr "디스크에서 재장전" -#: src/slic3r/GUI/ConfigWizard.cpp:1246 +#: src/slic3r/GUI/ConfigWizard.cpp:1548 msgid "" "Export full pathnames of models and parts sources into 3mf and amf files" msgstr "모델 및 부품 소스의 전체 경로 이름을 3mf 및 amf 파일로 내보내기" -#: src/slic3r/GUI/ConfigWizard.cpp:1250 +#: src/slic3r/GUI/ConfigWizard.cpp:1552 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked.\n" @@ -860,23 +1012,23 @@ msgstr "" "활성화되지 않으면 디스크 명령의 다시 로드는 열린 파일 대화 상자를 사용하여 " "각 파일을 선택하라는 요청입니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1259 +#: src/slic3r/GUI/ConfigWizard.cpp:1561 msgid "Files association" msgstr "파일 연결" -#: src/slic3r/GUI/ConfigWizard.cpp:1261 src/slic3r/GUI/Preferences.cpp:157 +#: src/slic3r/GUI/ConfigWizard.cpp:1563 src/slic3r/GUI/Preferences.cpp:292 msgid "Associate .3mf files to PrusaSlicer" msgstr "프라사슬라이서에 .3mf 파일 연결" -#: src/slic3r/GUI/ConfigWizard.cpp:1262 src/slic3r/GUI/Preferences.cpp:164 +#: src/slic3r/GUI/ConfigWizard.cpp:1564 src/slic3r/GUI/Preferences.cpp:297 msgid "Associate .stl files to PrusaSlicer" msgstr "PrusaSlicer에 .stl 파일을 연결" -#: src/slic3r/GUI/ConfigWizard.cpp:1272 +#: src/slic3r/GUI/ConfigWizard.cpp:1574 msgid "View mode" msgstr "보기 모드" -#: src/slic3r/GUI/ConfigWizard.cpp:1274 +#: src/slic3r/GUI/ConfigWizard.cpp:1576 msgid "" "PrusaSlicer's user interfaces comes in three variants:\n" "Simple, Advanced, and Expert.\n" @@ -890,82 +1042,96 @@ msgstr "" "른 두 가지는 점진적으로 보다 정교한 미세 조정을 제공하며, 각각 고급 및 전문" "가 사용자에게 적합합니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1279 +#: src/slic3r/GUI/ConfigWizard.cpp:1581 msgid "Simple mode" msgstr "간단한 모드" -#: src/slic3r/GUI/ConfigWizard.cpp:1280 +#: src/slic3r/GUI/ConfigWizard.cpp:1582 msgid "Advanced mode" msgstr "고급 모드" -#: src/slic3r/GUI/ConfigWizard.cpp:1281 +#: src/slic3r/GUI/ConfigWizard.cpp:1583 msgid "Expert mode" msgstr "전문가 모드" -#: src/slic3r/GUI/ConfigWizard.cpp:1287 +#: src/slic3r/GUI/ConfigWizard.cpp:1596 msgid "The size of the object can be specified in inches" msgstr "개체의 크기를 인치 단위로 지정할 수 있습니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1288 +#: src/slic3r/GUI/ConfigWizard.cpp:1597 msgid "Use inches" msgstr "인치 사용" -#: src/slic3r/GUI/ConfigWizard.cpp:1322 +#: src/slic3r/GUI/ConfigWizard.cpp:1617 msgid "Other Vendors" msgstr "기타 공급업체" -#: src/slic3r/GUI/ConfigWizard.cpp:1326 +#: src/slic3r/GUI/ConfigWizard.cpp:1621 #, c-format, boost-format msgid "Pick another vendor supported by %s" msgstr "%s 지원하는 다른 공급업체 선택" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 msgid "Firmware Type" msgstr "펌웨어 종류" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2366 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 src/slic3r/GUI/Tab.cpp:2354 msgid "Firmware" msgstr "펌웨어 철회" -#: src/slic3r/GUI/ConfigWizard.cpp:1361 +#: src/slic3r/GUI/ConfigWizard.cpp:1658 msgid "Choose the type of firmware used by your printer." msgstr "프린터에 업로드 할 펌웨어를 선택하세요." -#: src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/ConfigWizard.cpp:1707 src/slic3r/GUI/ConfigWizard.cpp:1778 +#: src/slic3r/GUI/ConfigWizard.cpp:1783 src/slic3r/GUI/ConfigWizard.cpp:1788 +#: src/slic3r/GUI/Field.cpp:258 src/slic3r/GUI/Field.cpp:328 +#: src/slic3r/GUI/Field.cpp:1585 src/slic3r/GUI/GUI_ObjectLayers.cpp:435 +msgid "Invalid numeric input." +msgstr "잘못된 숫자 입력." + +#: src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape and Size" msgstr "침대 모양 및 크기" -#: src/slic3r/GUI/ConfigWizard.cpp:1399 +#: src/slic3r/GUI/ConfigWizard.cpp:1735 msgid "Set the shape of your printer's bed." msgstr "프린터 침대 모양을 설정합니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1433 src/slic3r/GUI/Field.cpp:255 -#: src/slic3r/GUI/Field.cpp:324 src/slic3r/GUI/Field.cpp:1561 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:435 -msgid "Invalid numeric input." -msgstr "잘못된 숫자 입력." +#: src/slic3r/GUI/ConfigWizard.cpp:1755 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1610 +msgid "Build Volume" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1758 +msgid "Set vertical size of your printer." +msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1795 +msgid "Max print height:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Filament and Nozzle Diameters" msgstr "필라멘트와 노즐 직경" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Print Diameters" msgstr "인쇄 직경" -#: src/slic3r/GUI/ConfigWizard.cpp:1472 +#: src/slic3r/GUI/ConfigWizard.cpp:1828 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "프린터의 핫 엔드 노즐의 지름을 입력합니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1475 +#: src/slic3r/GUI/ConfigWizard.cpp:1831 msgid "Nozzle Diameter:" msgstr "노즐 직경:" -#: src/slic3r/GUI/ConfigWizard.cpp:1485 +#: src/slic3r/GUI/ConfigWizard.cpp:1841 msgid "Enter the diameter of your filament." msgstr "필라멘트의 지름을 입력합니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1486 +#: src/slic3r/GUI/ConfigWizard.cpp:1842 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." @@ -973,7 +1139,7 @@ msgstr "" "정밀도가 필요하므로 캘리퍼를 사용하여 필라멘트를 여러 번 측정 한 다음 평균을 " "계산하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:1489 +#: src/slic3r/GUI/ConfigWizard.cpp:1845 msgid "Filament Diameter:" msgstr "" "이 실험 설정은 선형 밀리미터 대신에 입방 밀리미터 단위의 E 값을 출력으로 사용" @@ -984,40 +1150,41 @@ msgstr "" "Slic3r. \n" "이것은 최근의 말린에서만 지원됩니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Nozzle and Bed Temperatures" msgstr "노즐 및 침대 온도" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Temperatures" msgstr "온도" -#: src/slic3r/GUI/ConfigWizard.cpp:1563 +#: src/slic3r/GUI/ConfigWizard.cpp:1919 msgid "Enter the temperature needed for extruding your filament." msgstr "필라멘트를 압출하는 데 필요한 온도를 입력합니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1564 +#: src/slic3r/GUI/ConfigWizard.cpp:1920 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "" "엄지 손가락의 규칙은 PLA에 대한 160 ~ 230 °C, ABS에 대한 215 ~ 250 ° C입니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1567 +#: src/slic3r/GUI/ConfigWizard.cpp:1923 msgid "Extrusion Temperature:" msgstr "압출 온도:" -#: src/slic3r/GUI/ConfigWizard.cpp:1568 src/slic3r/GUI/ConfigWizard.cpp:1582 -#: src/libslic3r/PrintConfig.cpp:418 src/libslic3r/PrintConfig.cpp:1211 -#: src/libslic3r/PrintConfig.cpp:1266 src/libslic3r/PrintConfig.cpp:2842 +#: src/slic3r/GUI/ConfigWizard.cpp:1924 src/slic3r/GUI/ConfigWizard.cpp:1938 +#: src/libslic3r/PrintConfig.cpp:437 src/libslic3r/PrintConfig.cpp:1271 +#: src/libslic3r/PrintConfig.cpp:1326 src/libslic3r/PrintConfig.cpp:2930 +#: src/libslic3r/PrintConfig.cpp:3689 msgid "°C" msgstr "℃" -#: src/slic3r/GUI/ConfigWizard.cpp:1577 +#: src/slic3r/GUI/ConfigWizard.cpp:1933 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." msgstr "필라멘트가 핫배드에 접착하는데 필요한 온도를 입력하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:1578 +#: src/slic3r/GUI/ConfigWizard.cpp:1934 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." @@ -1025,164 +1192,163 @@ msgstr "" "보통은 PLA의 경우 60 ° C 이고, ABS의 경우 110 ° C입니다. 핫배드가 없는 경우에" "는 0으로 두십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:1581 +#: src/slic3r/GUI/ConfigWizard.cpp:1937 msgid "Bed Temperature:" msgstr "배드 온도" -#: src/slic3r/GUI/ConfigWizard.cpp:2043 src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Materials" msgstr "SLA 재료" -#: src/slic3r/GUI/ConfigWizard.cpp:2097 +#: src/slic3r/GUI/ConfigWizard.cpp:2464 msgid "FFF Technology Printers" msgstr "FFF 방식 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:2102 +#: src/slic3r/GUI/ConfigWizard.cpp:2469 msgid "SLA Technology Printers" msgstr "SLA 방식 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:2338 +#: src/slic3r/GUI/ConfigWizard.cpp:2718 #, boost-format msgid "" "Following printer profiles has no default filament: %1%Please select one " "manually." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2339 +#: src/slic3r/GUI/ConfigWizard.cpp:2719 #, boost-format msgid "" "Following printer profiles has no default material: %1%Please select one " "manually." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2340 src/slic3r/GUI/ConfigWizard.cpp:2438 -#: src/slic3r/GUI/DoubleSlider.cpp:2522 src/slic3r/GUI/DoubleSlider.cpp:2543 -#: src/slic3r/GUI/GUI.cpp:232 -msgid "Notice" -msgstr "공지" - -#: src/slic3r/GUI/ConfigWizard.cpp:2459 +#: src/slic3r/GUI/ConfigWizard.cpp:2883 msgid "The following FFF printer models have no filament selected:" msgstr "다음 FFF 프린터 모델에는 필라멘트가 선택되지 않습니다." -#: src/slic3r/GUI/ConfigWizard.cpp:2463 +#: src/slic3r/GUI/ConfigWizard.cpp:2887 msgid "Do you want to select default filaments for these FFF printer models?" msgstr "이러한 FFF 프린터 모델에 대한 기본 필라멘트를 선택하시겠습니까?" -#: src/slic3r/GUI/ConfigWizard.cpp:2477 +#: src/slic3r/GUI/ConfigWizard.cpp:2901 msgid "The following SLA printer models have no materials selected:" msgstr "다음 SLA 프린터 모델에는 선택한 재질이 없습니다." -#: src/slic3r/GUI/ConfigWizard.cpp:2481 +#: src/slic3r/GUI/ConfigWizard.cpp:2905 msgid "Do you want to select default SLA materials for these printer models?" msgstr "이러한 프린터 모델에 대한 기본 SLA 재질을 선택하시겠습니까?" -#: src/slic3r/GUI/ConfigWizard.cpp:2523 +#: src/slic3r/GUI/ConfigWizard.cpp:2947 msgid "Configuration is edited in ConfigWizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2566 +#: src/slic3r/GUI/ConfigWizard.cpp:3000 msgid "All user presets will be deleted." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2596 +#: src/slic3r/GUI/ConfigWizard.cpp:3037 msgid "A new vendor was installed and one of its printers will be activated" msgid_plural "" "New vendors were installed and one of theirs printers will be activated" msgstr[0] "" -#: src/slic3r/GUI/ConfigWizard.cpp:2625 +#: src/slic3r/GUI/ConfigWizard.cpp:3069 msgid "Do you want to continue changing the configuration?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2691 +#: src/slic3r/GUI/ConfigWizard.cpp:3136 msgid "A new Printer was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2696 +#: src/slic3r/GUI/ConfigWizard.cpp:3141 msgid "Some Printers were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2717 +#: src/slic3r/GUI/ConfigWizard.cpp:3162 msgid "A new filament was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2718 +#: src/slic3r/GUI/ConfigWizard.cpp:3163 msgid "A new SLA material was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some filaments were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some SLA materials were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2773 +#: src/slic3r/GUI/ConfigWizard.cpp:3218 msgid "Custom printer was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2858 +#: src/slic3r/GUI/ConfigWizard.cpp:3306 msgid "Select all standard printers" msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요" -#: src/slic3r/GUI/ConfigWizard.cpp:2861 +#: src/slic3r/GUI/ConfigWizard.cpp:3309 msgid "< &Back" msgstr "< & 뒤로" -#: src/slic3r/GUI/ConfigWizard.cpp:2862 +#: src/slic3r/GUI/ConfigWizard.cpp:3310 msgid "&Next >" msgstr "& 다음 >" -#: src/slic3r/GUI/ConfigWizard.cpp:2863 +#: src/slic3r/GUI/ConfigWizard.cpp:3311 msgid "&Finish" msgstr "완료(&Finish)" -#: src/slic3r/GUI/ConfigWizard.cpp:2864 -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:3312 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:657 +#: src/slic3r/GUI/FileArchiveDialog.cpp:274 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 #: src/slic3r/GUI/FirmwareDialog.cpp:153 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1593 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1365 #: src/slic3r/GUI/ProgressStatusBar.cpp:26 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:93 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:879 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:96 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:907 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1606 msgid "Cancel" msgstr "취소" -#: src/slic3r/GUI/ConfigWizard.cpp:2884 +#: src/slic3r/GUI/ConfigWizard.cpp:3332 msgid "Prusa FFF Technology Printers" msgstr "프루사 FFF 방식 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:2892 +#: src/slic3r/GUI/ConfigWizard.cpp:3340 msgid "Prusa MSLA Technology Printers" msgstr "프루사 MSLA 기술 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filament Profiles Selection" msgstr "필라멘트 프로파일 선택" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 src/slic3r/GUI/ConfigWizard.cpp:2915 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 src/slic3r/GUI/ConfigWizard.cpp:3363 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Type:" msgstr "종류:" -#: src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Material Profiles Selection" msgstr "SLA 재질 프로파일 선택" -#: src/slic3r/GUI/ConfigWizard.cpp:3036 +#: src/slic3r/GUI/ConfigWizard.cpp:3486 msgid "Configuration Assistant" msgstr "구성 도우미" -#: src/slic3r/GUI/ConfigWizard.cpp:3037 +#: src/slic3r/GUI/ConfigWizard.cpp:3487 msgid "Configuration &Assistant" msgstr "구성 및 도우미" -#: src/slic3r/GUI/ConfigWizard.cpp:3039 +#: src/slic3r/GUI/ConfigWizard.cpp:3489 msgid "Configuration Wizard" msgstr "구성 마법사" -#: src/slic3r/GUI/ConfigWizard.cpp:3040 +#: src/slic3r/GUI/ConfigWizard.cpp:3490 msgid "Configuration &Wizard" msgstr "구성 및 마법사" @@ -1196,37 +1362,54 @@ msgstr "" msgid "Performing desktop integration failed - Could not find executable." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:378 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:383 msgid "" "Performing desktop integration failed because the application directory was " "not found." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:419 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:423 msgid "" "Performing desktop integration failed - could not create Gcodeviewer desktop " "file. PrusaSlicer desktop file was probably created successfully." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:459 -#: src/slic3r/GUI/GUI_App.cpp:2245 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:472 +msgid "" +"Performing downloader desktop integration failed - boost::filesystem::" +"canonical did not return appimage path." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:484 +msgid "" +"Performing downloader desktop integration failed - Could not find executable." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:602 +msgid "" +"Performing downloader desktop integration failed because the application " +"directory was not found." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:626 +#: src/slic3r/GUI/GUI_App.cpp:2407 msgid "Desktop Integration" msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:466 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:633 msgid "" "Desktop Integration sets this binary to be searchable by the system.\n" "\n" "Press \"Perform\" to proceed." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:480 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:647 msgid "Perform" msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1342 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:653 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/KBShortcutsDialog.cpp:106 +#: src/slic3r/GUI/MainFrame.cpp:1426 msgid "Undo" msgstr "실행 취소" @@ -1234,19 +1417,19 @@ msgstr "실행 취소" msgid "Place bearings in slots and resume printing" msgstr "베어링을 슬롯에 놓고 인쇄를 재개합니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1379 +#: src/slic3r/GUI/DoubleSlider.cpp:1448 msgid "One layer mode" msgstr "단일 레이어 모드" -#: src/slic3r/GUI/DoubleSlider.cpp:1381 +#: src/slic3r/GUI/DoubleSlider.cpp:1450 msgid "Discard all custom changes" msgstr "모든 사용자 지정 변경 내용 삭제" -#: src/slic3r/GUI/DoubleSlider.cpp:1385 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:1454 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to move" msgstr "이동하려면 이동" -#: src/slic3r/GUI/DoubleSlider.cpp:1388 +#: src/slic3r/GUI/DoubleSlider.cpp:1457 #, c-format, boost-format msgid "" "Jump to height %s\n" @@ -1257,7 +1440,7 @@ msgstr "" "눈금 모드 설정\n" "또는 전체 인쇄용 압출기 시퀀스 설정" -#: src/slic3r/GUI/DoubleSlider.cpp:1391 +#: src/slic3r/GUI/DoubleSlider.cpp:1460 #, c-format, boost-format msgid "" "Jump to height %s\n" @@ -1266,30 +1449,30 @@ msgstr "" "높이로 이동 %s\n" "또는 눈금자 모드 설정" -#: src/slic3r/GUI/DoubleSlider.cpp:1396 +#: src/slic3r/GUI/DoubleSlider.cpp:1465 msgid "Edit current color - Right click the colored slider segment" msgstr "" "현재 색상 편집 - 컬러 슬라이더 세그먼트를 마우스 오른쪽 단추로 클릭합니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1398 +#: src/slic3r/GUI/DoubleSlider.cpp:1467 msgid "This is wipe tower layer" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1408 +#: src/slic3r/GUI/DoubleSlider.cpp:1477 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing sequentually." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1412 +#: src/slic3r/GUI/DoubleSlider.cpp:1481 msgid "Print mode" msgstr "인쇄 모드" -#: src/slic3r/GUI/DoubleSlider.cpp:1426 +#: src/slic3r/GUI/DoubleSlider.cpp:1495 msgid "Add extruder change - Left click" msgstr "압출기 변경 추가 - 왼쪽 클릭" -#: src/slic3r/GUI/DoubleSlider.cpp:1428 +#: src/slic3r/GUI/DoubleSlider.cpp:1497 msgid "" "Add color change - Left click for predefined color or Shift + Left click for " "custom color selection" @@ -1297,23 +1480,23 @@ msgstr "" "색상 변경 추가 - 미리 정의된 색상 또는 시프트 + 사용자 지정 색상 선택을 위한 " "왼쪽 클릭" -#: src/slic3r/GUI/DoubleSlider.cpp:1430 +#: src/slic3r/GUI/DoubleSlider.cpp:1499 msgid "Add color change - Left click" msgstr "색상 변경 추가 - 왼쪽 클릭" -#: src/slic3r/GUI/DoubleSlider.cpp:1431 +#: src/slic3r/GUI/DoubleSlider.cpp:1500 msgid "or press \"+\" key" msgstr "또는 \"+\" 키를 누릅니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1433 +#: src/slic3r/GUI/DoubleSlider.cpp:1502 msgid "Add another code - Ctrl + Left click" msgstr "다른 코드 추가 - Ctrl + 왼쪽 클릭" -#: src/slic3r/GUI/DoubleSlider.cpp:1434 +#: src/slic3r/GUI/DoubleSlider.cpp:1503 msgid "Add another code - Right click" msgstr "다른 코드 추가 - 마우스 오른쪽 클릭" -#: src/slic3r/GUI/DoubleSlider.cpp:1440 +#: src/slic3r/GUI/DoubleSlider.cpp:1509 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing " @@ -1325,40 +1508,40 @@ msgstr "" "다.\n" "이 코드는 G 코드 생성 중에 처리되지 않습니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1458 +#: src/slic3r/GUI/DoubleSlider.cpp:1527 msgid "continue" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1466 +#: src/slic3r/GUI/DoubleSlider.cpp:1535 #, boost-format msgid "Color change (\"%1%\")" msgstr "색상 변경(\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1467 +#: src/slic3r/GUI/DoubleSlider.cpp:1536 #, boost-format msgid "Color change (\"%1%\") for Extruder %2%" msgstr "압출기%2%색상 변경(\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1469 +#: src/slic3r/GUI/DoubleSlider.cpp:1538 #, boost-format msgid "Pause print (\"%1%\")" msgstr "인쇄 일시 중지(\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1471 +#: src/slic3r/GUI/DoubleSlider.cpp:1540 #, boost-format msgid "Custom template (\"%1%\")" msgstr "사용자 지정 템플릿(\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1473 +#: src/slic3r/GUI/DoubleSlider.cpp:1542 #, boost-format msgid "Extruder (tool) is changed to Extruder \"%1%\"" msgstr "압출기(도구)가 압출기 \"%1%\"로 변경됩니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1480 +#: src/slic3r/GUI/DoubleSlider.cpp:1549 msgid "Note" msgstr "메모" -#: src/slic3r/GUI/DoubleSlider.cpp:1482 +#: src/slic3r/GUI/DoubleSlider.cpp:1551 msgid "" "G-code associated to this tick mark is in a conflict with print mode.\n" "Editing it will cause changes of Slider data." @@ -1366,7 +1549,7 @@ msgstr "" "이 틱 마크와 연결된 G 코드는 인쇄 모드와 충돌합니다.\n" "편집하면 슬라이더 데이터가 변경됩니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1485 +#: src/slic3r/GUI/DoubleSlider.cpp:1554 msgid "" "There is a color change for extruder that won't be used till the end of " "print job.\n" @@ -1375,7 +1558,7 @@ msgstr "" "인쇄 작업이 끝날 때까지 사용되지 않는 압출기의 색상 변경이 있습니다.\n" "이 코드는 G 코드 생성 중에 처리되지 않습니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1488 +#: src/slic3r/GUI/DoubleSlider.cpp:1557 msgid "" "There is an extruder change set to the same extruder.\n" "This code won't be processed during G-code generation." @@ -1383,7 +1566,7 @@ msgstr "" "압출기 변경이 동일한 압출기로 설정되어 있습니다.\n" "이 코드는 G 코드 생성 중에 처리되지 않습니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1491 +#: src/slic3r/GUI/DoubleSlider.cpp:1560 msgid "" "There is a color change for extruder that has not been used before.\n" "Check your settings to avoid redundant color changes." @@ -1391,203 +1574,205 @@ msgstr "" "이전에 사용되지 않은 압출기의 색상 변경이 있습니다.\n" "중복 색상 변경을 방지하려면 설정을 확인합니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1496 +#: src/slic3r/GUI/DoubleSlider.cpp:1565 msgid "Delete tick mark - Left click or press \"-\" key" msgstr "체크 표시 삭제 - 왼쪽 클릭 또는 \"-\" 키 를 누릅니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1498 +#: src/slic3r/GUI/DoubleSlider.cpp:1567 msgid "Edit tick mark - Ctrl + Left click" msgstr "틱 마크 편집 - Ctrl + 왼쪽 클릭" -#: src/slic3r/GUI/DoubleSlider.cpp:1499 +#: src/slic3r/GUI/DoubleSlider.cpp:1568 msgid "Edit tick mark - Right click" msgstr "체크 마크 편집 - 마우스 오른쪽 클릭" -#: src/slic3r/GUI/DoubleSlider.cpp:1602 src/slic3r/GUI/DoubleSlider.cpp:1633 -#: src/slic3r/GUI/GUI_Factories.cpp:778 +#: src/slic3r/GUI/DoubleSlider.cpp:1671 src/slic3r/GUI/DoubleSlider.cpp:1702 +#: src/slic3r/GUI/GUI_Factories.cpp:862 #, c-format, boost-format msgid "Extruder %d" msgstr "압출기 %d" -#: src/slic3r/GUI/DoubleSlider.cpp:1603 src/slic3r/GUI/GUI_Factories.cpp:779 +#: src/slic3r/GUI/DoubleSlider.cpp:1672 src/slic3r/GUI/GUI_Factories.cpp:863 msgid "active" msgstr "활성" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 msgid "Switch code to Change extruder" msgstr "압출기 변경으로 코드를 전환" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Change extruder" msgstr "압출기(익스트루더) 변경" -#: src/slic3r/GUI/DoubleSlider.cpp:1613 +#: src/slic3r/GUI/DoubleSlider.cpp:1682 msgid "Change extruder (N/A)" msgstr "압출기 변경(N/A)" -#: src/slic3r/GUI/DoubleSlider.cpp:1615 src/slic3r/GUI/GUI_Factories.cpp:787 +#: src/slic3r/GUI/DoubleSlider.cpp:1684 src/slic3r/GUI/GUI_Factories.cpp:871 msgid "Use another extruder" msgstr "다른 압출기 사용" -#: src/slic3r/GUI/DoubleSlider.cpp:1634 +#: src/slic3r/GUI/DoubleSlider.cpp:1703 msgid "used" msgstr "사용됨" -#: src/slic3r/GUI/DoubleSlider.cpp:1642 +#: src/slic3r/GUI/DoubleSlider.cpp:1711 #, boost-format msgid "Switch code to Color change (%1%) for:" msgstr "다음을 위해 코드를 색상 변경(%1%)으로 전환합니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1643 +#: src/slic3r/GUI/DoubleSlider.cpp:1712 #, boost-format msgid "Add color change (%1%) for:" msgstr "다음을 위해 색상 변경(%1%)을 추가합니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1968 +#: src/slic3r/GUI/DoubleSlider.cpp:2037 msgid "Add color change" msgstr "색상 변경 추가" -#: src/slic3r/GUI/DoubleSlider.cpp:1979 +#: src/slic3r/GUI/DoubleSlider.cpp:2048 msgid "Add pause print" msgstr "일시 중지 인쇄 추가" -#: src/slic3r/GUI/DoubleSlider.cpp:1983 +#: src/slic3r/GUI/DoubleSlider.cpp:2052 msgid "Add custom template" msgstr "사용자 지정 템플릿 추가" -#: src/slic3r/GUI/DoubleSlider.cpp:1986 +#: src/slic3r/GUI/DoubleSlider.cpp:2055 msgid "Add custom G-code" msgstr "사용자 지정 G 코드 추가" -#: src/slic3r/GUI/DoubleSlider.cpp:2004 +#: src/slic3r/GUI/DoubleSlider.cpp:2073 msgid "Edit color" msgstr "색상 편집" -#: src/slic3r/GUI/DoubleSlider.cpp:2005 +#: src/slic3r/GUI/DoubleSlider.cpp:2074 msgid "Edit pause print message" msgstr "일시 중지 인쇄 메시지 편집" -#: src/slic3r/GUI/DoubleSlider.cpp:2006 +#: src/slic3r/GUI/DoubleSlider.cpp:2075 msgid "Edit custom G-code" msgstr "사용자 지정 G 코드 편집" -#: src/slic3r/GUI/DoubleSlider.cpp:2012 +#: src/slic3r/GUI/DoubleSlider.cpp:2081 msgid "Delete color change" msgstr "색상 변경 삭제" -#: src/slic3r/GUI/DoubleSlider.cpp:2013 +#: src/slic3r/GUI/DoubleSlider.cpp:2082 msgid "Delete tool change" msgstr "도구 변경 삭제" -#: src/slic3r/GUI/DoubleSlider.cpp:2014 +#: src/slic3r/GUI/DoubleSlider.cpp:2083 msgid "Delete pause print" msgstr "일시 중지 인쇄 삭제" -#: src/slic3r/GUI/DoubleSlider.cpp:2015 +#: src/slic3r/GUI/DoubleSlider.cpp:2084 msgid "Delete custom G-code" msgstr "사용자 지정 G 코드 삭제" -#: src/slic3r/GUI/DoubleSlider.cpp:2025 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:2094 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to height" msgstr "높이로 이동" -#: src/slic3r/GUI/DoubleSlider.cpp:2030 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 msgid "Hide ruler" msgstr "눈금 숨기기" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height" msgstr "개체 높이 표시" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height on the ruler" msgstr "눈금자에 개체 높이 표시" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time" msgstr "예상 인쇄 시간 표시" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time on the ruler" msgstr "눈금자에 대한 예상 인쇄 시간 표시" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Ruler mode" msgstr "눈금자 모드" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Set ruler mode" msgstr "눈금 모드 설정" -#: src/slic3r/GUI/DoubleSlider.cpp:2047 +#: src/slic3r/GUI/DoubleSlider.cpp:2116 msgid "Set extruder sequence for the entire print" msgstr "전체 인쇄에 대한 압출기 시퀀스 설정" -#: src/slic3r/GUI/DoubleSlider.cpp:2051 +#: src/slic3r/GUI/DoubleSlider.cpp:2120 msgid "Set auto color changes" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2086 +#: src/slic3r/GUI/DoubleSlider.cpp:2155 msgid "This action will cause deletion of all ticks on vertical slider." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2087 src/slic3r/GUI/Tab.cpp:1318 +#: src/slic3r/GUI/DoubleSlider.cpp:2156 src/slic3r/GUI/Tab.cpp:1263 msgid "" "This action is not revertible.\n" "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2088 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1133 src/slic3r/GUI/GUI.cpp:245 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:649 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:679 -#: src/slic3r/GUI/WipeTowerDialog.cpp:58 src/slic3r/GUI/WipeTowerDialog.cpp:443 +#: src/slic3r/GUI/DoubleSlider.cpp:2157 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:537 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1119 src/slic3r/GUI/GUI.cpp:258 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:721 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:751 +#: src/slic3r/GUI/WipeTowerDialog.cpp:60 src/slic3r/GUI/WipeTowerDialog.cpp:445 msgid "Warning" msgstr "경고" -#: src/slic3r/GUI/DoubleSlider.cpp:2216 +#: src/slic3r/GUI/DoubleSlider.cpp:2285 msgid "Enter custom G-code used on current layer" msgstr "현재 레이어에 사용되는 사용자 지정 G 코드 입력" -#: src/slic3r/GUI/DoubleSlider.cpp:2217 +#: src/slic3r/GUI/DoubleSlider.cpp:2286 #, boost-format msgid "Custom G-code on current layer (%1% mm)." msgstr "현재 레이어(%1% mm)의 사용자 지정 G 코드입니다." -#: src/slic3r/GUI/DoubleSlider.cpp:2238 +#: src/slic3r/GUI/DoubleSlider.cpp:2307 msgid "Enter short message shown on Printer display when a print is paused" msgstr "인쇄가 일시 중지될 때 프린터 디스플레이에 표시된 짧은 메시지 입력" -#: src/slic3r/GUI/DoubleSlider.cpp:2239 +#: src/slic3r/GUI/DoubleSlider.cpp:2308 #, boost-format msgid "Message for pause print on current layer (%1% mm)." msgstr "현재 레이어(%1% mm)에서 인쇄를 일시 중지하기 위한 메시지입니다." -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the move you want to jump to" msgstr "점프할 이동을 입력합니다." -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the height you want to jump to" msgstr "점프할 높이를 입력합니다." -#: src/slic3r/GUI/DoubleSlider.cpp:2515 +#: src/slic3r/GUI/DoubleSlider.cpp:2584 msgid "The last color change data was saved for a single extruder printing." msgstr "마지막 색상 변경 데이터는 단일 압출기 인쇄에 저장되었습니다." -#: src/slic3r/GUI/DoubleSlider.cpp:2516 src/slic3r/GUI/DoubleSlider.cpp:2532 +#: src/slic3r/GUI/DoubleSlider.cpp:2585 src/slic3r/GUI/DoubleSlider.cpp:2601 msgid "The last color change data was saved for a multi extruder printing." msgstr "마지막 색상 변경 데이터는 다중 압출기 인쇄를 위해 저장되었습니다." -#: src/slic3r/GUI/DoubleSlider.cpp:2518 +#: src/slic3r/GUI/DoubleSlider.cpp:2587 msgid "Your current changes will delete all saved color changes." msgstr "현재 변경 사항은 저장된 모든 색상 변경 내용을 삭제합니다." -#: src/slic3r/GUI/DoubleSlider.cpp:2519 src/slic3r/GUI/DoubleSlider.cpp:2540 +#: src/slic3r/GUI/DoubleSlider.cpp:2588 src/slic3r/GUI/DoubleSlider.cpp:2609 msgid "Are you sure you want to continue?" msgstr "정말 계속하기를 원하십니까?" -#: src/slic3r/GUI/DoubleSlider.cpp:2533 +#: src/slic3r/GUI/DoubleSlider.cpp:2602 msgid "" "Select YES if you want to delete all saved tool changes, \n" "NO if you want all tool changes switch to color changes, \n" @@ -1597,11 +1782,11 @@ msgstr "" "모든 도구 변경이 색상 변경으로 전환하려는 경우 아니요, \n" "또는 취소하여 변경되지 않은 상태로 둡니다." -#: src/slic3r/GUI/DoubleSlider.cpp:2536 +#: src/slic3r/GUI/DoubleSlider.cpp:2605 msgid "Do you want to delete all saved tool changes?" msgstr "저장된 모든 도구 변경 내용을 삭제하시겠습니까?" -#: src/slic3r/GUI/DoubleSlider.cpp:2538 +#: src/slic3r/GUI/DoubleSlider.cpp:2607 msgid "" "The last color change data was saved for a multi extruder printing with tool " "changes for whole print." @@ -1609,18 +1794,32 @@ msgstr "" "마지막 색상 변경 데이터는 전체 인쇄용 공구 변경과 함께 멀티 압출기 인쇄를 위" "해 저장되었습니다." -#: src/slic3r/GUI/DoubleSlider.cpp:2539 +#: src/slic3r/GUI/DoubleSlider.cpp:2608 msgid "Your current changes will delete all saved extruder (tool) changes." msgstr "현재 변경 사항은 저장된 모든 압출기(도구) 변경 내용을 삭제합니다." -#: src/slic3r/GUI/ExtraRenderers.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:538 -#: src/slic3r/GUI/GUI_ObjectList.cpp:550 src/slic3r/GUI/GUI_ObjectList.cpp:979 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4291 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:250 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:352 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:376 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:607 src/libslic3r/PrintConfig.cpp:800 +#: src/slic3r/GUI/Downloader.cpp:150 +#, boost-format +msgid "" +"Download won't start. Download URL doesn't point to https://files.printables." +"com : %1%" +msgstr "" + +#: src/slic3r/GUI/Downloader.cpp:181 +msgid "The download has failed:" +msgstr "" + +#: src/slic3r/GUI/DownloaderFileGet.cpp:193 +#, boost-format +msgid "Can't create file at %1%." +msgstr "" + +#: src/slic3r/GUI/ExtraRenderers.cpp:323 src/slic3r/GUI/GUI_ObjectList.cpp:571 +#: src/slic3r/GUI/GUI_ObjectList.cpp:583 src/slic3r/GUI/GUI_ObjectList.cpp:1043 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2125 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3013 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4884 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:259 src/libslic3r/PrintConfig.cpp:894 msgid "default" msgstr "기본값" @@ -1633,10 +1832,10 @@ msgid "Set extruder change for every" msgstr "압출기 변경 설정" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:60 -#: src/libslic3r/PrintConfig.cpp:662 src/libslic3r/PrintConfig.cpp:1430 -#: src/libslic3r/PrintConfig.cpp:2135 src/libslic3r/PrintConfig.cpp:2310 -#: src/libslic3r/PrintConfig.cpp:2386 src/libslic3r/PrintConfig.cpp:2639 -#: src/libslic3r/PrintConfig.cpp:2687 src/libslic3r/PrintConfig.cpp:2706 +#: src/libslic3r/PrintConfig.cpp:765 src/libslic3r/PrintConfig.cpp:1476 +#: src/libslic3r/PrintConfig.cpp:2165 src/libslic3r/PrintConfig.cpp:2343 +#: src/libslic3r/PrintConfig.cpp:2417 src/libslic3r/PrintConfig.cpp:2665 +#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2728 msgid "layers" msgstr "레이어" @@ -1668,26 +1867,26 @@ msgstr "시퀀스에서 압출기 제거" msgid "Add extruder to sequence" msgstr "시퀀스에 압출기 추가" -#: src/slic3r/GUI/Field.cpp:190 +#: src/slic3r/GUI/Field.cpp:188 msgid "default value" msgstr "기본 값" -#: src/slic3r/GUI/Field.cpp:193 +#: src/slic3r/GUI/Field.cpp:191 msgid "parameter name" msgstr "매개 변수 명칭" -#: src/slic3r/GUI/Field.cpp:204 src/slic3r/GUI/OptionsGroup.cpp:827 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1067 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1079 +#: src/slic3r/GUI/Field.cpp:206 src/slic3r/GUI/OptionsGroup.cpp:852 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1074 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1086 msgid "N/A" msgstr "N/A" -#: src/slic3r/GUI/Field.cpp:226 src/slic3r/GUI/Field.cpp:298 +#: src/slic3r/GUI/Field.cpp:229 src/slic3r/GUI/Field.cpp:302 #, c-format, boost-format msgid "%s doesn't support percentage" msgstr "%s 이(가) 백분율을 지원하지 않음" -#: src/slic3r/GUI/Field.cpp:266 +#: src/slic3r/GUI/Field.cpp:269 #, c-format, boost-format msgid "" "Input value is out of range\n" @@ -1696,16 +1895,16 @@ msgstr "" "입력 값이 범위를 벗어났습니다.\n" "%s 올바른 값이며 계속하시겠습니까?" -#: src/slic3r/GUI/Field.cpp:269 src/slic3r/GUI/Field.cpp:343 +#: src/slic3r/GUI/Field.cpp:272 src/slic3r/GUI/Field.cpp:347 msgid "Parameter validation" msgstr "매개 변수 유효성 검사" -#: src/slic3r/GUI/Field.cpp:282 src/slic3r/GUI/Field.cpp:390 -#: src/slic3r/GUI/Field.cpp:1573 +#: src/slic3r/GUI/Field.cpp:285 src/slic3r/GUI/Field.cpp:394 +#: src/slic3r/GUI/Field.cpp:1597 msgid "Input value is out of range" msgstr "입력 값이 범위를 벗어남" -#: src/slic3r/GUI/Field.cpp:340 +#: src/slic3r/GUI/Field.cpp:344 #, c-format, boost-format msgid "" "Do you mean %s%% instead of %s %s?\n" @@ -1716,13 +1915,22 @@ msgstr "" "이 값을 %s%%, 로 변경하려면 YES를 선택하십시오. \n" "또는 %s %s 이(가) 올바른 값인지 확인하는 경우 NO를 선택하세요. " -#: src/slic3r/GUI/Field.cpp:397 +#: src/slic3r/GUI/Field.cpp:401 #, boost-format msgid "" "Invalid input format. Expected vector of dimensions in the following format: " "\"%1%\"" msgstr "잘못된 입력 형식입니다. 다음 형식의 예상 치수 벡터: \"%1%\"" +#: src/slic3r/GUI/FileArchiveDialog.cpp:170 +msgid "Archive preview" +msgstr "" + +#: src/slic3r/GUI/FileArchiveDialog.cpp:270 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +msgid "Open" +msgstr "" + #: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flash!" msgstr "플래시!" @@ -1807,12 +2015,6 @@ msgstr "펌웨어 이미지:" msgid "Select a file" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:815 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:297 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:372 -msgid "Browse" -msgstr "찾아보기" - #: src/slic3r/GUI/FirmwareDialog.cpp:817 msgid "Serial port:" msgstr "직렬 포트:" @@ -1842,10 +2044,10 @@ msgid "Advanced: Output log" msgstr "고급: 출력 로그" #: src/slic3r/GUI/FirmwareDialog.cpp:862 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:310 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:358 #: src/slic3r/GUI/Mouse3DController.cpp:543 -#: src/slic3r/GUI/PrintHostDialogs.cpp:261 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:122 +#: src/slic3r/GUI/PrintHostDialogs.cpp:313 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:125 msgid "Close" msgstr "닫기" @@ -1865,7 +2067,7 @@ msgstr "확인" msgid "Cancelling..." msgstr "취소 중..." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1488 msgid "Shape Gallery" msgstr "" @@ -1873,585 +2075,566 @@ msgstr "" msgid "Select shape from the gallery" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:100 -msgid "Add to bed" -msgstr "" - -#: src/slic3r/GUI/GalleryDialog.cpp:101 -msgid "Add selected shape(s) to the bed" -msgstr "" - -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4152 +#: src/slic3r/GUI/GalleryDialog.cpp:114 src/slic3r/GUI/Tab.cpp:4377 msgid "Add" msgstr "추가" -#: src/slic3r/GUI/GalleryDialog.cpp:117 +#: src/slic3r/GUI/GalleryDialog.cpp:114 msgid "Add one or more custom shapes" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:506 -#: src/slic3r/GUI/GLCanvas3D.cpp:4547 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/GalleryDialog.cpp:115 src/slic3r/GUI/GalleryDialog.cpp:528 +#: src/slic3r/GUI/GLCanvas3D.cpp:4638 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/GUI_Factories.cpp:460 src/slic3r/GUI/Tab.cpp:3973 msgid "Delete" msgstr "삭제" -#: src/slic3r/GUI/GalleryDialog.cpp:118 +#: src/slic3r/GUI/GalleryDialog.cpp:115 msgid "Delete one or more custom shape. You can't delete system shapes" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:400 +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "Add to bed" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "OK" +msgstr "확인" + +#: src/slic3r/GUI/GalleryDialog.cpp:143 +msgid "Add selected shape(s) to the bed" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:422 msgid "Choose one or more files (STL, OBJ):" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:440 +#: src/slic3r/GUI/GalleryDialog.cpp:462 #, boost-format msgid "" "It looks like selected %1%-file has an error or is destructed.\n" "We can't load this file" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:451 +#: src/slic3r/GUI/GalleryDialog.cpp:473 msgid "Choose one PNG file:" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:464 +#: src/slic3r/GUI/GalleryDialog.cpp:486 msgid "Replacing of the PNG" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:508 +#: src/slic3r/GUI/GalleryDialog.cpp:530 msgid "Change thumbnail" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:549 src/slic3r/GUI/GalleryDialog.cpp:554 +#: src/slic3r/GUI/GalleryDialog.cpp:571 src/slic3r/GUI/GalleryDialog.cpp:576 #, boost-format msgid "Loading of the \"%1%\"" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:274 +#: src/slic3r/GUI/GCodeViewer.cpp:343 msgid "Tool position" msgstr "공구 위치" -#: src/slic3r/GUI/GCodeViewer.cpp:1457 +#: src/slic3r/GUI/GCodeViewer.cpp:1547 msgid "Generating toolpaths" msgstr "공구 경로 생성" -#: src/slic3r/GUI/GCodeViewer.cpp:1517 +#: src/slic3r/GUI/GCodeViewer.cpp:1619 msgid "Generating vertex buffer" msgstr "정점 버퍼 생성" -#: src/slic3r/GUI/GCodeViewer.cpp:1857 +#: src/slic3r/GUI/GCodeViewer.cpp:1979 msgid "Generating index buffers" msgstr "인덱스 버퍼 생성" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to hide" msgstr "숨기려면 클릭하십시오." -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to show" msgstr "표시하려면 클릭하십시오." -#: src/slic3r/GUI/GCodeViewer.cpp:3181 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 msgid "up to" msgstr "최대 " -#: src/slic3r/GUI/GCodeViewer.cpp:3187 +#: src/slic3r/GUI/GCodeViewer.cpp:3455 msgid "above" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "from" msgstr "부터" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "to" msgstr "에서" -#: src/slic3r/GUI/GCodeViewer.cpp:3245 src/slic3r/GUI/GCodeViewer.cpp:3246 -#: src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3513 src/slic3r/GUI/GCodeViewer.cpp:3514 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 msgid "Percentage" msgstr "백분율" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3570 msgid "Feature type" msgstr "특색 유형" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3592 #: src/slic3r/GUI/RammingChart.cpp:90 msgid "Time" msgstr "시간" -#: src/slic3r/GUI/GCodeViewer.cpp:3295 src/slic3r/GUI/GCodeViewer.cpp:3306 -#: src/slic3r/GUI/GCodeViewer.cpp:3566 -msgid "Used filament" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3298 +#: src/slic3r/GUI/GCodeViewer.cpp:3571 msgid "Height (mm)" msgstr "높이 (mm)" -#: src/slic3r/GUI/GCodeViewer.cpp:3299 +#: src/slic3r/GUI/GCodeViewer.cpp:3572 msgid "Width (mm)" msgstr "폭 (mm)" -#: src/slic3r/GUI/GCodeViewer.cpp:3300 +#: src/slic3r/GUI/GCodeViewer.cpp:3573 msgid "Speed (mm/s)" msgstr "속도 (mm/s)" -#: src/slic3r/GUI/GCodeViewer.cpp:3301 -msgid "Fan Speed (%)" -msgstr "브릿지 팬 속도" +#: src/slic3r/GUI/GCodeViewer.cpp:3574 +msgid "Fan speed (%)" +msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3302 +#: src/slic3r/GUI/GCodeViewer.cpp:3575 msgid "Temperature (°C)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3303 +#: src/slic3r/GUI/GCodeViewer.cpp:3576 msgid "Volumetric flow rate (mm³/s)" msgstr "체적 유량(mm³/s)" -#: src/slic3r/GUI/GCodeViewer.cpp:3306 src/slic3r/GUI/GUI_Preview.cpp:224 -#: src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3577 +msgid "Layer time (linear)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3578 +msgid "Layer time (logarithmic)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3579 msgid "Tool" msgstr "도구" -#: src/slic3r/GUI/GCodeViewer.cpp:3309 src/slic3r/GUI/GUI_Preview.cpp:225 -#: src/slic3r/GUI/GUI_Preview.cpp:957 +#: src/slic3r/GUI/GCodeViewer.cpp:3580 msgid "Color Print" msgstr "컬러 프린트" -#: src/slic3r/GUI/GCodeViewer.cpp:3347 src/slic3r/GUI/GCodeViewer.cpp:3393 -#: src/slic3r/GUI/GCodeViewer.cpp:3398 src/slic3r/GUI/GUI_ObjectList.cpp:312 -#: src/slic3r/GUI/wxExtensions.cpp:536 src/libslic3r/PrintConfig.cpp:795 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 src/slic3r/GUI/GCodeViewer.cpp:3594 +#: src/slic3r/GUI/GCodeViewer.cpp:3860 +msgid "Used filament" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3623 src/slic3r/GUI/GCodeViewer.cpp:4067 +#: src/libslic3r/PrintConfig.cpp:3025 +msgid "Travel" +msgstr "이송" + +#: src/slic3r/GUI/GCodeViewer.cpp:3640 src/slic3r/GUI/GCodeViewer.cpp:3685 +#: src/slic3r/GUI/GCodeViewer.cpp:3689 src/slic3r/GUI/GUI_ObjectList.cpp:338 +#: src/slic3r/GUI/wxExtensions.cpp:547 src/libslic3r/PrintConfig.cpp:888 msgid "Extruder" msgstr "익스트루더" -#: src/slic3r/GUI/GCodeViewer.cpp:3370 +#: src/slic3r/GUI/GCodeViewer.cpp:3662 msgid "Default color" msgstr "기본 색상" -#: src/slic3r/GUI/GCodeViewer.cpp:3393 +#: src/slic3r/GUI/GCodeViewer.cpp:3685 msgid "default color" msgstr "기본 색상" -#: src/slic3r/GUI/GCodeViewer.cpp:3491 src/slic3r/GUI/GCodeViewer.cpp:3547 +#: src/slic3r/GUI/GCodeViewer.cpp:3785 src/slic3r/GUI/GCodeViewer.cpp:3841 msgid "Color change" msgstr "색상 변경" -#: src/slic3r/GUI/GCodeViewer.cpp:3510 src/slic3r/GUI/GCodeViewer.cpp:3545 +#: src/slic3r/GUI/GCodeViewer.cpp:3804 src/slic3r/GUI/GCodeViewer.cpp:3839 msgid "Print" msgstr "인쇄" -#: src/slic3r/GUI/GCodeViewer.cpp:3546 src/slic3r/GUI/GCodeViewer.cpp:3580 +#: src/slic3r/GUI/GCodeViewer.cpp:3840 src/slic3r/GUI/GCodeViewer.cpp:3874 msgid "Pause" msgstr "일시 정지" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Event" msgstr "이벤트" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Remaining time" msgstr "남은 시간" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Duration" msgstr "기간" -#: src/slic3r/GUI/GCodeViewer.cpp:3609 src/slic3r/GUI/GUI_Preview.cpp:1049 -#: src/libslic3r/PrintConfig.cpp:2937 -msgid "Travel" -msgstr "이송" - -#: src/slic3r/GUI/GCodeViewer.cpp:3612 -msgid "Movement" -msgstr "운동" - -#: src/slic3r/GUI/GCodeViewer.cpp:3613 -msgid "Extrusion" -msgstr "압출 없음" - -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1870 -#: src/slic3r/GUI/Tab.cpp:2812 -msgid "Retraction" -msgstr "리트랙션 후 최소 이동 거리" - -#: src/slic3r/GUI/GCodeViewer.cpp:3631 src/slic3r/GUI/GCodeViewer.cpp:3634 -#: src/slic3r/GUI/GUI_Preview.cpp:1050 -msgid "Wipe" -msgstr "와이프(wipe) 탑의 최소 퍼지" - -#: src/slic3r/GUI/GCodeViewer.cpp:3666 src/slic3r/GUI/GUI_Preview.cpp:257 -#: src/slic3r/GUI/GUI_Preview.cpp:272 -msgid "Options" -msgstr "옵션" - -#: src/slic3r/GUI/GCodeViewer.cpp:3669 src/slic3r/GUI/GUI_Preview.cpp:1051 -msgid "Retractions" -msgstr "리트랙션" - -#: src/slic3r/GUI/GCodeViewer.cpp:3670 src/slic3r/GUI/GUI_Preview.cpp:1052 -msgid "Deretractions" -msgstr "환원점" - -#: src/slic3r/GUI/GCodeViewer.cpp:3671 src/slic3r/GUI/GUI_Preview.cpp:1053 -msgid "Seams" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3672 src/slic3r/GUI/GUI_Preview.cpp:1054 -msgid "Tool changes" -msgstr "도구 변경" - -#: src/slic3r/GUI/GCodeViewer.cpp:3673 src/slic3r/GUI/GUI_Preview.cpp:1055 -msgid "Color changes" -msgstr "색상 변경" - -#: src/slic3r/GUI/GCodeViewer.cpp:3674 src/slic3r/GUI/GUI_Preview.cpp:1056 -msgid "Print pauses" -msgstr "인쇄 일시 중지" - -#: src/slic3r/GUI/GCodeViewer.cpp:3675 src/slic3r/GUI/GUI_Preview.cpp:1057 -msgid "Custom G-codes" -msgstr "사용자 지정 G 코드" - -#: src/slic3r/GUI/GCodeViewer.cpp:3695 src/slic3r/GUI/GCodeViewer.cpp:3714 -#: src/slic3r/GUI/GUI.cpp:341 src/slic3r/GUI/Plater.cpp:822 -#: src/libslic3r/PrintConfig.cpp:322 +#: src/slic3r/GUI/GCodeViewer.cpp:3928 src/slic3r/GUI/GUI.cpp:332 +#: src/slic3r/GUI/Plater.cpp:852 src/libslic3r/PrintConfig.cpp:335 msgid "Printer" msgstr "프린터" -#: src/slic3r/GUI/GCodeViewer.cpp:3697 src/slic3r/GUI/GCodeViewer.cpp:3719 -#: src/slic3r/GUI/GUI.cpp:337 src/slic3r/GUI/Plater.cpp:818 +#: src/slic3r/GUI/GCodeViewer.cpp:3931 src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/Plater.cpp:848 msgid "Print settings" msgstr "출력 설정" -#: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 -#: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1970 src/slic3r/GUI/Tab.cpp:1971 +#: src/slic3r/GUI/GCodeViewer.cpp:3936 src/slic3r/GUI/GUI.cpp:330 +#: src/slic3r/GUI/Plater.cpp:849 src/slic3r/GUI/Tab.cpp:1930 +#: src/slic3r/GUI/Tab.cpp:1931 msgid "Filament" msgstr "필라멘트 설정을 선택" -#: src/slic3r/GUI/GCodeViewer.cpp:3739 +#: src/slic3r/GUI/GCodeViewer.cpp:3950 msgid "Estimated printing times" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3758 +#: src/slic3r/GUI/GCodeViewer.cpp:3969 msgid "Normal mode" msgstr "일반 모드" -#: src/slic3r/GUI/GCodeViewer.cpp:3759 +#: src/slic3r/GUI/GCodeViewer.cpp:3970 msgid "Stealth mode" msgstr "스텔스 모드" -#: src/slic3r/GUI/GCodeViewer.cpp:3766 src/libslic3r/PrintConfig.cpp:1189 -#: src/libslic3r/PrintConfig.cpp:1207 src/libslic3r/PrintConfig.cpp:1217 -#: src/libslic3r/PrintConfig.cpp:1262 +#: src/slic3r/GUI/GCodeViewer.cpp:3979 src/libslic3r/PrintConfig.cpp:1249 +#: src/libslic3r/PrintConfig.cpp:1267 src/libslic3r/PrintConfig.cpp:1277 +#: src/libslic3r/PrintConfig.cpp:1322 msgid "First layer" msgstr "첫 레이어" -#: src/slic3r/GUI/GCodeViewer.cpp:3767 +#: src/slic3r/GUI/GCodeViewer.cpp:3983 msgid "Total" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3796 +#: src/slic3r/GUI/GCodeViewer.cpp:4002 msgid "Show stealth mode" msgstr "스텔스 모드 표시" -#: src/slic3r/GUI/GCodeViewer.cpp:3800 +#: src/slic3r/GUI/GCodeViewer.cpp:4006 msgid "Show normal mode" msgstr "일반 모드 표시" -#: src/slic3r/GUI/GLCanvas3D.cpp:225 src/slic3r/GUI/GLCanvas3D.cpp:4694 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:53 -msgid "Variable layer height" -msgstr "가변 레이어 높이 기능 사용" - -#: src/slic3r/GUI/GLCanvas3D.cpp:227 -msgid "Left mouse button:" -msgstr "왼쪽 마우스 버튼:" +#: src/slic3r/GUI/GCodeViewer.cpp:4071 +msgid "Wipe" +msgstr "와이프(wipe) 탑의 최소 퍼지" -#: src/slic3r/GUI/GLCanvas3D.cpp:229 -msgid "Add detail" -msgstr "디테일 추가" +#: src/slic3r/GUI/GCodeViewer.cpp:4075 +msgid "Retractions" +msgstr "리트랙션" -#: src/slic3r/GUI/GLCanvas3D.cpp:231 -msgid "Right mouse button:" -msgstr "오른쪽 마우스 버튼:" +#: src/slic3r/GUI/GCodeViewer.cpp:4079 +msgid "Deretractions" +msgstr "환원점" -#: src/slic3r/GUI/GLCanvas3D.cpp:233 -msgid "Remove detail" -msgstr "디테일 제거" +#: src/slic3r/GUI/GCodeViewer.cpp:4083 +msgid "Seams" +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:235 +#: src/slic3r/GUI/GCodeViewer.cpp:4087 +msgid "Tool changes" +msgstr "도구 변경" + +#: src/slic3r/GUI/GCodeViewer.cpp:4091 +msgid "Color changes" +msgstr "색상 변경" + +#: src/slic3r/GUI/GCodeViewer.cpp:4095 +msgid "Print pauses" +msgstr "인쇄 일시 중지" + +#: src/slic3r/GUI/GCodeViewer.cpp:4099 +msgid "Custom G-codes" +msgstr "사용자 지정 G 코드" + +#: src/slic3r/GUI/GCodeViewer.cpp:4103 +msgid "Center of gravity" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:4108 +msgid "Shells" +msgstr "쉘(Shells)" + +#: src/slic3r/GUI/GCodeViewer.cpp:4113 +msgid "Tool marker" +msgstr "공구 마커" + +#: src/slic3r/GUI/GLCanvas3D.cpp:185 src/slic3r/GUI/GLCanvas3D.cpp:4784 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:71 +msgid "Variable layer height" +msgstr "가변 레이어 높이 기능 사용" + +#: src/slic3r/GUI/GLCanvas3D.cpp:187 +msgid "Left mouse button:" +msgstr "왼쪽 마우스 버튼:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:189 +msgid "Add detail" +msgstr "디테일 추가" + +#: src/slic3r/GUI/GLCanvas3D.cpp:191 +msgid "Right mouse button:" +msgstr "오른쪽 마우스 버튼:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:193 +msgid "Remove detail" +msgstr "디테일 제거" + +#: src/slic3r/GUI/GLCanvas3D.cpp:195 msgid "Shift + Left mouse button:" msgstr "시프트 + 왼쪽 마우스 버튼:" -#: src/slic3r/GUI/GLCanvas3D.cpp:237 +#: src/slic3r/GUI/GLCanvas3D.cpp:197 msgid "Reset to base" msgstr "베이스로 재설정" -#: src/slic3r/GUI/GLCanvas3D.cpp:239 +#: src/slic3r/GUI/GLCanvas3D.cpp:199 msgid "Shift + Right mouse button:" msgstr "시프트 + 오른쪽 마우스 버튼:" -#: src/slic3r/GUI/GLCanvas3D.cpp:241 +#: src/slic3r/GUI/GLCanvas3D.cpp:201 msgid "Smoothing" msgstr "부드럽게" -#: src/slic3r/GUI/GLCanvas3D.cpp:243 +#: src/slic3r/GUI/GLCanvas3D.cpp:203 msgid "Mouse wheel:" msgstr "마우스 휠: " -#: src/slic3r/GUI/GLCanvas3D.cpp:245 +#: src/slic3r/GUI/GLCanvas3D.cpp:205 msgid "Increase/decrease edit area" msgstr "편집 영역 증가/감소" -#: src/slic3r/GUI/GLCanvas3D.cpp:248 +#: src/slic3r/GUI/GLCanvas3D.cpp:208 msgid "Adaptive" msgstr "어뎁티브" -#: src/slic3r/GUI/GLCanvas3D.cpp:254 +#: src/slic3r/GUI/GLCanvas3D.cpp:214 msgid "Quality / Speed" msgstr "품질 /속도" -#: src/slic3r/GUI/GLCanvas3D.cpp:257 +#: src/slic3r/GUI/GLCanvas3D.cpp:217 msgid "Higher print quality versus higher print speed." msgstr "높은 인쇄 속도와 높은 인쇄 품질." -#: src/slic3r/GUI/GLCanvas3D.cpp:268 +#: src/slic3r/GUI/GLCanvas3D.cpp:228 msgid "Smooth" msgstr "부드럽게" -#: src/slic3r/GUI/GLCanvas3D.cpp:274 src/libslic3r/PrintConfig.cpp:819 +#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/libslic3r/PrintConfig.cpp:908 msgid "Radius" msgstr "반경" -#: src/slic3r/GUI/GLCanvas3D.cpp:286 +#: src/slic3r/GUI/GLCanvas3D.cpp:246 msgid "Keep min" msgstr "최소 분 유지" -#: src/slic3r/GUI/GLCanvas3D.cpp:295 src/slic3r/GUI/GLCanvas3D.cpp:4123 +#: src/slic3r/GUI/GLCanvas3D.cpp:255 src/slic3r/GUI/GLCanvas3D.cpp:4217 msgid "Reset" msgstr "초기화" -#: src/slic3r/GUI/GLCanvas3D.cpp:561 +#: src/slic3r/GUI/GLCanvas3D.cpp:602 msgid "Variable layer height - Manual edit" msgstr "가변 레이어 높이 - 수동 편집" -#: src/slic3r/GUI/GLCanvas3D.cpp:676 +#: src/slic3r/GUI/GLCanvas3D.cpp:717 msgid "Seq." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1310 +#: src/slic3r/GUI/GLCanvas3D.cpp:1319 msgid "Variable layer height - Reset" msgstr "가변 레이어 높이 - 재설정" -#: src/slic3r/GUI/GLCanvas3D.cpp:1318 +#: src/slic3r/GUI/GLCanvas3D.cpp:1327 msgid "Variable layer height - Adaptive" msgstr "가변 레이어 높이 - 어뎁티브" -#: src/slic3r/GUI/GLCanvas3D.cpp:1326 +#: src/slic3r/GUI/GLCanvas3D.cpp:1335 msgid "Variable layer height - Smooth all" msgstr "가변 레이어 높이 - 모든 것을 부드럽게" -#: src/slic3r/GUI/GLCanvas3D.cpp:1733 +#: src/slic3r/GUI/GLCanvas3D.cpp:1778 msgid "Mirror Object" msgstr "오브젝트 반전" -#: src/slic3r/GUI/GLCanvas3D.cpp:2612 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:560 +#: src/slic3r/GUI/GLCanvas3D.cpp:2542 src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:117 msgid "Gizmo-Move" msgstr "개체(Gizmo) 이동" -#: src/slic3r/GUI/GLCanvas3D.cpp:2695 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562 +#: src/slic3r/GUI/GLCanvas3D.cpp:2638 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:661 msgid "Gizmo-Rotate" msgstr "물체(Gizmo) 회전" -#: src/slic3r/GUI/GLCanvas3D.cpp:3300 +#: src/slic3r/GUI/GLCanvas3D.cpp:3263 msgid "Move Object" msgstr "개체 이동" -#: src/slic3r/GUI/GLCanvas3D.cpp:3821 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3513 +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:40 +msgid "Gizmo-Place on Face" +msgstr "물체(Gizmo)를 배드위로" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3904 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Switch to Settings" msgstr "설정으로 전환" -#: src/slic3r/GUI/GLCanvas3D.cpp:3822 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3905 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Print Settings Tab" msgstr "인쇄 설정을 선택 합니다" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Filament Settings Tab" msgstr "&필라멘트 설정 탭" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Material Settings Tab" msgstr "재질 설정 탭" -#: src/slic3r/GUI/GLCanvas3D.cpp:3824 src/slic3r/GUI/GLCanvas3D.cpp:4657 +#: src/slic3r/GUI/GLCanvas3D.cpp:3907 src/slic3r/GUI/GLCanvas3D.cpp:4746 msgid "Printer Settings Tab" msgstr "프린터 설정을 선택 합니다" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Undo History" msgstr "되돌리기 기록" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Redo History" msgstr "다시 실행 히스토리" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" msgstr[0] "%1$d 되돌아 가기" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" msgstr[0] "%1$d 다시 실행" -#: src/slic3r/GUI/GLCanvas3D.cpp:4011 src/slic3r/GUI/GLCanvas3D.cpp:4673 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 src/slic3r/GUI/Search.cpp:426 +#: src/slic3r/GUI/GLCanvas3D.cpp:4106 src/slic3r/GUI/GLCanvas3D.cpp:4762 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/Search.cpp:482 msgid "Search" msgstr "검색" -#: src/slic3r/GUI/GLCanvas3D.cpp:4025 src/slic3r/GUI/GLCanvas3D.cpp:4033 -#: src/slic3r/GUI/Search.cpp:432 +#: src/slic3r/GUI/GLCanvas3D.cpp:4120 src/slic3r/GUI/GLCanvas3D.cpp:4128 +#: src/slic3r/GUI/Search.cpp:488 msgid "Enter a search term" msgstr "검색어 입력" -#: src/slic3r/GUI/GLCanvas3D.cpp:4064 +#: src/slic3r/GUI/GLCanvas3D.cpp:4160 msgid "Arrange options" msgstr "옵션 정렬" -#: src/slic3r/GUI/GLCanvas3D.cpp:4097 +#: src/slic3r/GUI/GLCanvas3D.cpp:4193 #, boost-format msgid "Press %1%left mouse button to enter the exact value" msgstr "%1% 왼쪽 마우스 버튼을 눌러 정확한 값을 입력합니다." -#: src/slic3r/GUI/GLCanvas3D.cpp:4099 +#: src/slic3r/GUI/GLCanvas3D.cpp:4195 msgid "Spacing" msgstr "간격" -#: src/slic3r/GUI/GLCanvas3D.cpp:4106 -msgid "Enable rotations (slow)" -msgstr "회전 활성화(느린)" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -#, fuzzy -msgid "Alignment" -msgstr "정렬(&A)" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:4500 -msgid "Center" -msgstr "중앙" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear left" +#: src/slic3r/GUI/GLCanvas3D.cpp:4202 +msgid "Spacing from bed" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front left" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front right" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear right" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:2271 -msgid "Random" -msgstr "무작위" +#: src/slic3r/GUI/GLCanvas3D.cpp:4209 +msgid "Enable rotations (slow)" +msgstr "회전 활성화(느린)" -#: src/slic3r/GUI/GLCanvas3D.cpp:4133 src/slic3r/GUI/GLCanvas3D.cpp:4565 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Plater.cpp:1664 +#: src/slic3r/GUI/GLCanvas3D.cpp:4228 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 src/slic3r/GUI/Plater.cpp:7118 msgid "Arrange" msgstr "정렬" -#: src/slic3r/GUI/GLCanvas3D.cpp:4539 +#: src/slic3r/GUI/GLCanvas3D.cpp:4630 msgid "Add..." msgstr "더하기..." -#: src/slic3r/GUI/GLCanvas3D.cpp:4556 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5509 src/slic3r/GUI/Tab.cpp:4158 +#: src/slic3r/GUI/GLCanvas3D.cpp:4647 src/slic3r/GUI/KBShortcutsDialog.cpp:105 +#: src/slic3r/GUI/Plater.cpp:6047 src/slic3r/GUI/Tab.cpp:4383 msgid "Delete all" msgstr "모두 삭제" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 src/slic3r/GUI/KBShortcutsDialog.cpp:133 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 src/slic3r/GUI/KBShortcutsDialog.cpp:142 msgid "Arrange selection" msgstr "선택 정렬" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 msgid "Click right mouse button to show arrangement options" msgstr "오른쪽 마우스 버튼을 클릭하여 배열 옵션을 표시합니다." -#: src/slic3r/GUI/GLCanvas3D.cpp:4587 +#: src/slic3r/GUI/GLCanvas3D.cpp:4676 msgid "Copy" msgstr "복사" -#: src/slic3r/GUI/GLCanvas3D.cpp:4596 +#: src/slic3r/GUI/GLCanvas3D.cpp:4685 msgid "Paste" msgstr "붙여넣기" -#: src/slic3r/GUI/GLCanvas3D.cpp:4608 src/slic3r/GUI/GUI_Factories.cpp:1084 -#: src/slic3r/GUI/GUI_Factories.cpp:1108 src/slic3r/GUI/GUI_Factories.cpp:1119 +#: src/slic3r/GUI/GLCanvas3D.cpp:4697 src/slic3r/GUI/GUI_Factories.cpp:1237 +#: src/slic3r/GUI/GUI_Factories.cpp:1261 src/slic3r/GUI/GUI_Factories.cpp:1272 msgid "Add instance" msgstr "인스턴스 추가" -#: src/slic3r/GUI/GLCanvas3D.cpp:4619 src/slic3r/GUI/GUI_Factories.cpp:1087 +#: src/slic3r/GUI/GLCanvas3D.cpp:4708 src/slic3r/GUI/GUI_Factories.cpp:1240 msgid "Remove instance" msgstr "인스턴스 제거" -#: src/slic3r/GUI/GLCanvas3D.cpp:4632 +#: src/slic3r/GUI/GLCanvas3D.cpp:4721 msgid "Split to objects" msgstr "오브젝트별 분할" -#: src/slic3r/GUI/GLCanvas3D.cpp:4642 +#: src/slic3r/GUI/GLCanvas3D.cpp:4731 msgid "Split to parts" msgstr "파트별 분할" -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/GLCanvas3D.cpp:4795 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/GLCanvas3D.cpp:4874 msgid "Click right mouse button to open/close History" msgstr "오른쪽 마우스 버튼을 클릭하여 기록을 열/닫습니다." -#: src/slic3r/GUI/GLCanvas3D.cpp:4779 +#: src/slic3r/GUI/GLCanvas3D.cpp:4859 #, boost-format msgid "Next Undo action: %1%" msgstr "다음 작업 실행 취소 : %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:4795 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/GLCanvas3D.cpp:4874 src/slic3r/GUI/KBShortcutsDialog.cpp:107 +#: src/slic3r/GUI/MainFrame.cpp:1429 msgid "Redo" msgstr "다시 실행" -#: src/slic3r/GUI/GLCanvas3D.cpp:4817 +#: src/slic3r/GUI/GLCanvas3D.cpp:4895 #, boost-format msgid "Next Redo action: %1%" msgstr "다음 작업 다시 실행: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:6434 +#: src/slic3r/GUI/GLCanvas3D.cpp:6784 msgid "An object outside the print area was detected." msgstr "인쇄 영역 외부의 물체가 감지되었습니다." -#: src/slic3r/GUI/GLCanvas3D.cpp:6435 +#: src/slic3r/GUI/GLCanvas3D.cpp:6785 msgid "A toolpath outside the print area was detected." msgstr "인쇄 영역 외부의 도구 경로가 감지되었습니다." -#: src/slic3r/GUI/GLCanvas3D.cpp:6436 +#: src/slic3r/GUI/GLCanvas3D.cpp:6786 msgid "SLA supports outside the print area were detected." msgstr "인쇄 영역 외부의 SLA 지지대가 감지되었습니다." -#: src/slic3r/GUI/GLCanvas3D.cpp:6437 +#: src/slic3r/GUI/GLCanvas3D.cpp:6787 msgid "Some objects are not visible during editing." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6439 +#: src/slic3r/GUI/GLCanvas3D.cpp:6789 msgid "" "An object outside the print area was detected.\n" "Resolve the current problem to continue slicing." @@ -2459,319 +2642,1339 @@ msgstr "" "인쇄 영역 외부의 물체가 감지되었습니다.\n" "현재 문제를 해결하여 계속 슬라이싱합니다." -#: src/slic3r/GUI/GLCanvas3D.cpp:6513 +#: src/slic3r/GUI/GLCanvas3D.cpp:6864 msgid "Selection-Add from rectangle" msgstr "선택-사각형에서 추가" -#: src/slic3r/GUI/GLCanvas3D.cpp:6528 +#: src/slic3r/GUI/GLCanvas3D.cpp:6879 msgid "Selection-Remove from rectangle" msgstr "선택 영역-사각형에서 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4478 -msgid "Cut" -msgstr "잘라내기" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:206 +msgid "Planar" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Auto" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Manual" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:213 +msgid "Plug" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:214 +msgid "Dowel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Prism" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Frustum" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Triangle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Square" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Hexagon" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:59 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 +msgid "Circle" +msgstr "원형" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:233 +msgid "Keep orientation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:234 +msgid "Place on cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:235 +msgid "Flip upside down" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +msgid "inch" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 +msgid "Part" +msgstr "부품" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 src/libslic3r/Print.cpp:1236 +msgid "Object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:264 +msgid "" +"Click to flip the cut plane\n" +"Drag to move the cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:269 src/libslic3r/PrintConfig.cpp:498 +#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2325 src/libslic3r/PrintConfig.cpp:2613 +#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2876 src/libslic3r/PrintConfig.cpp:2907 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3231 +#: src/libslic3r/PrintConfig.cpp:3466 src/libslic3r/PrintConfig.cpp:3951 +msgid "°" +msgstr "°" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:367 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:571 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1232 +msgid "Move cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 msgid "in" msgstr "에서" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 -msgid "Keep upper part" -msgstr "상부 유지" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:544 +msgid "Value" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 -msgid "Keep lower part" -msgstr "낮은 부분 유지" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:549 +msgid "Tolerance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:196 -msgid "Rotate lower part upwards" -msgstr "아래쪽 부분을 위쪽으로 회전" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 +msgid "Left click" +msgstr "왼쪽 클릭" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:201 -msgid "Perform cut" -msgstr "절단 수행" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2348 +msgid "Add connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:49 -msgid "Paint-on supports" -msgstr "페인트 온 지원" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 +msgid "Right click" +msgstr "오른쪽 클릭" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 -msgid "Clipping of view" -msgstr "갈무리된것 보기" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +msgid "Remove connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 -msgid "Reset direction" -msgstr "방향 재설정" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 +msgid "Drag" +msgstr "드래그" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 -msgid "Brush size" -msgstr "브러쉬 크기" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1216 +msgid "Move connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 -msgid "Brush shape" -msgstr "브러시 모양" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +msgid "Add connector to selection" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 -msgid "Left mouse button" -msgstr "왼쪽 마우스 버튼" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +msgid "Remove connector from selection" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 -msgid "Enforce supports" -msgstr "지원 적용" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:870 +msgid "Select all connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 -msgid "Right mouse button" -msgstr "오른쪽 마우스 버튼" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:894 src/libslic3r/PrintConfig.cpp:4644 +msgid "Cut" +msgstr "잘라내기" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:434 -msgid "Block supports" -msgstr "블록 지원" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1227 +msgid "Rotate cut plane" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 -msgid "Shift + Left mouse button" -msgstr "시프트 + 왼쪽 마우스 버튼" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1448 +msgid "Render cut plane as circle" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:429 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 -msgid "Remove selection" -msgstr "선택 영역 제거" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1537 +msgid "Connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 -msgid "Remove all selection" -msgstr "모든 선택 영역 제거" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1541 +msgid "Remove connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 -msgid "Circle" -msgstr "원형" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1550 +msgid "Type" +msgstr "타입" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 -#: src/slic3r/GUI/GUI_Factories.cpp:461 -msgid "Sphere" -msgstr "영역" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1561 src/libslic3r/PrintConfig.cpp:2816 +msgid "Style" +msgstr "모양새" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:68 -#: src/libslic3r/PrintConfig.cpp:1172 -msgid "Triangles" -msgstr "삼각형(Triangles)" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1568 +msgid "Depth ratio" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 -msgid "Highlight overhang by angle" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1586 +msgid "Confirm connectors" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 -msgid "Enforce" -msgstr "첫 번째 n 개의 레이어에 대한 서포트 강화" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1652 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1666 +msgid "Flip cut plane" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 -msgid "Tool type" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1710 +msgid "Hold SHIFT key to draw a cut line" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 -msgid "Brush" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1716 +msgid "Cut position: " msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:128 -msgid "Smart fill" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1725 +msgid "Reset cutting plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:131 -msgid "Smart fill angle" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Edit connectors" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:132 -msgid "Split triangles" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Add connectors" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 -msgid "On overhangs only" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1744 +msgid "Reset cut" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:174 -#, boost-format -msgid "" -"Preselects faces by overhang angle. It is possible to restrict paintable " -"facets to only preselected faces when the option \"%1%\" is enabled." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1745 +msgid "Reset cutting plane and remove connectors" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:217 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:378 -msgid "Paints facets according to the chosen painting brush." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1800 +msgid "After cut" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:391 -msgid "" -"Paints neighboring facets whose relative angle is less or equal to set angle." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1820 +msgid "Cut to" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:229 -#, boost-format -msgid "Allows painting only on facets selected by: \"%1%\"" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1823 +msgid "Objects" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:244 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:419 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:144 -msgid "Paints all facets inside, regardless of their orientation." -msgstr "방향에 관계없이 내부에 모든 면을 페인트합니다." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1826 +msgid "Parts" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:253 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:428 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:152 -msgid "Ignores facets facing away from the camera." -msgstr "카메라에서 멀리 향하는 면을 무시합니다." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1840 +msgid "Perform cut" +msgstr "절단 수행" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:262 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:437 -msgid "Paints only one facet." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1930 +msgid "Invalid connectors detected" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:270 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:285 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:445 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:462 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:132 -msgid "Alt + Mouse wheel" -msgstr "Alt + 마우스 휠" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1932 +#, c-format, boost-format +msgid "%1$d connector is out of cut contour" +msgid_plural "%1$d connectors are out of cut contour" +msgstr[0] "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 -msgid "Splits bigger facets into smaller ones while the object is painted." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1935 +#, c-format, boost-format +msgid "%1$d connector is out of object" +msgid_plural "%1$d connectors are out of object" +msgstr[0] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1938 +msgid "Some connectors are overlapped" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:308 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:483 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:170 -msgid "Ctrl + Mouse wheel" -msgstr "Ctrl + 마우스 휠" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1942 +msgid "" +"Invalid state. \n" +"No one part is selected for keep after cut" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:313 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:488 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:175 -msgid "Reset selection" -msgstr "선택 재설정" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1944 +msgid "" +"Warning state. \n" +"Cut plane is placed out of object" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:364 -msgid "Block supports by angle" -msgstr "블록 지지대 각도별" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2153 +msgid "Connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:365 -msgid "Add supports by angle" -msgstr "각도별로 지지성 추가" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2183 +msgid "Cut by Plane" +msgstr "평면으로 절단" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2323 +msgid "Cut by line" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2373 +msgid "Delete connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:252 +msgid "Entering Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:253 +msgid "Leaving Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:254 +msgid "Cut gizmo editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:601 +msgid "Emboss" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:866 +msgid "ERROR: Wait until ends or Cancel process." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:921 +msgid "Text-Rotate" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:953 +msgid "Font" +msgstr "Font" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:954 +#: src/libslic3r/PrintConfig.cpp:897 +msgid "Height" +msgstr "높이" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:955 +msgid "Depth" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:963 +msgid "Use surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:964 +msgid "Char gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:965 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Line gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:966 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:967 +msgid "Skew ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:968 +msgid "Z-move" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:969 +msgid "Z-rot" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:970 +msgid "Collection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1047 +msgid "NORMAL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1048 +msgid "SMALL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1049 +msgid "ITALIC" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1050 +msgid "SWISS" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1051 +msgid "MODERN" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1088 +msgid "First font" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1093 +msgid "Default font" +msgstr "기본 글꼴" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1098 +msgid "Embossed text" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1513 +msgid "Warning: No font is selected. Select correct one." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1531 +#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1437 +#: src/slic3r/GUI/Tab.cpp:1472 src/slic3r/GUI/Tab.cpp:1607 +#: src/slic3r/GUI/Tab.cpp:1611 src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:2390 src/slic3r/GUI/Tab.cpp:4985 +#: src/libslic3r/PrintConfig.cpp:276 src/libslic3r/PrintConfig.cpp:514 +#: src/libslic3r/PrintConfig.cpp:1484 src/libslic3r/PrintConfig.cpp:1566 +#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:2562 +#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:3166 +#: src/libslic3r/PrintConfig.cpp:3200 src/libslic3r/PrintConfig.cpp:3211 +#: src/libslic3r/PrintConfig.cpp:3226 src/libslic3r/PrintConfig.cpp:3239 +#: src/libslic3r/PrintConfig.cpp:3248 src/libslic3r/PrintConfig.cpp:3260 +#: src/libslic3r/PrintConfig.cpp:3642 +msgid "Advanced" +msgstr "고급" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1631 +msgid "Can't write text by selected font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1632 +msgid "Try to choose another font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Empty" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Embossed text can NOT contain only white spaces." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Bad symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Text contain character glyph (represented by '?') unknown by font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:535 +msgid "Skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +msgid "Unsupported visualization of font skew for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Unsupported visualization of font boldness for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Unsupported visualization of gap between lines inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Too tall" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Diminished font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Too small" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Enlarged font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1660 +#, boost-format +msgid "%1% is NOT shown." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1964 +msgid " No symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1965 +msgid " ... Loading" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2015 +msgid " ... In queue" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2132 +#, boost-format +msgid "Font face \"%1%\" can't be selected." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2180 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:754 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:367 +msgid "Apply" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2192 +msgid "add file with font(.ttf, .ttc)" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2202 +msgid "Open dialog for choose from fonts." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2210 +msgid "Text is to object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2224 +msgid "Added" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2227 +msgid "Click to change text into object part." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2230 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4321 +msgid "You can't change a type of the last solid part of the object." +msgstr "객체(object)의 마지막 부품(Part) 유형은 변경할 수 없습니다." + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2231 +msgid "Subtracted" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2237 +msgid "Click to change part type into negative volume." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2243 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4338 +msgid "Modifier" +msgstr "편집" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2249 +msgid "Click to change part type into modifier." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2256 +msgid "Change Text Type" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2287 +#, boost-format +msgid "Rename style(%1%) for embossing text: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2299 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2384 +msgid "Name can't be empty." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2301 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2386 +msgid "Name has to be unique." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2310 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2397 +msgid "ok" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2312 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2401 +msgid "cancel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2337 +msgid "Rename style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2344 +msgid "Rename current style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2345 +msgid "Can't rename temporary style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2362 +msgid "First Add style to list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2364 +#, boost-format +msgid "Save %1% style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2366 +msgid "No changes to save." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2373 +msgid "New name of style: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2422 +msgid "Save as new style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2434 +msgid "Only valid font can be added to style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2436 +msgid "Add style to my list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2438 +msgid "Add as new named style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2454 +msgid "Remove style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2485 +#, boost-format +msgid "Delete \"%1%\" style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2486 +#, boost-format +msgid "Can't delete \"%1%\". It is last style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2487 +#, boost-format +msgid "Can't delete temporary style \"%1%\"." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2494 +#, boost-format +msgid "" +"Are you sure,\n" +"that you want permanently and unrecoverable \n" +"remove style \"%1%\"?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2496 +msgid "Yes" +msgstr "예" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2505 +msgid "No" +msgstr "아니오" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2555 +msgid "Presets" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2564 src/slic3r/GUI/GUI_App.cpp:2324 +msgid "modified" +msgstr "변경" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2617 +#, boost-format +msgid "Modified style \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2618 +#, boost-format +msgid "Current style is \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2625 +msgid "Style modification will be lost." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2627 +#, boost-format +msgid "" +"Changing style to '%1%' will discard current style modification.\n" +"\n" +" Would you like to continue anyway?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2643 +msgid "Not valid style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2644 +#, boost-format +msgid "Style '%1%' can't be used and will be removed from list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2691 +msgid "Unset italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2708 +msgid "Set italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2738 +msgid "Unset bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2756 +msgid "Set bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2922 +msgid "WxFont is not loaded properly." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2957 +msgid "Revert font changes." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2991 +msgid "wx Make bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3002 +msgid "Revert text size." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3029 +msgid "Revert embossed depth." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3178 +msgid "" +"Advanced font options could be changed only for correct font.\n" +"Start with select correct font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3219 +msgid "Revert using of model surface." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3232 +msgid "font points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3241 +msgid "Revert gap between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3242 +msgid "Distance between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3257 +msgid "Revert gap between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3258 +msgid "Distance between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3272 +msgid "Undo boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3273 +msgid "Tiny / Wide glyphs" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3283 +msgid "Undo letter's skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3284 +msgid "Italic strength ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3304 +msgid "Undo translation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3305 +msgid "Distance of the center of text from model surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3350 +msgid "Undo rotation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3352 +msgid "Rotate text Clock-wise." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3386 +msgid "Select from True Type Collection." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3395 +msgid "Set text to face camera" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3402 +msgid "Use camera direction for text orientation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3486 +#, boost-format +msgid "Font '%1%' can't be used. Please select another." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3488 +msgid "Selected font is NOT True-type." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3512 +msgid "Choose one or more files (TTF, TTC):" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3539 +msgid "Choose SVG file:" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3600 +#, boost-format +msgid "" +"Can't load exactly same font(\"%1%\"), Aplication selected a similar " +"one(\"%2%\"). You have to specify font for enable edit text." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:81 +msgid "Enter emboss gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:82 +msgid "Leave emboss gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:83 +msgid "Embossing actions" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:37 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:66 +msgid "Paint-on supports" +msgstr "페인트 온 지원" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 +msgid "Automatic painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 +msgid "painting..." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:107 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +msgid "Clipping of view" +msgstr "갈무리된것 보기" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:106 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 +msgid "Reset direction" +msgstr "방향 재설정" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:108 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 +msgid "Brush size" +msgstr "브러쉬 크기" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:109 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 +msgid "Brush shape" +msgstr "브러시 모양" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1816 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:110 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 +msgid "Left mouse button" +msgstr "왼쪽 마우스 버튼" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 +msgid "Enforce supports" +msgstr "지원 적용" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 +msgid "Right mouse button" +msgstr "오른쪽 마우스 버튼" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:573 +msgid "Block supports" +msgstr "블록 지원" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 +msgid "Shift + Left mouse button" +msgstr "시프트 + 왼쪽 마우스 버튼" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:568 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:247 +msgid "Remove selection" +msgstr "선택 영역 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 +msgid "Remove all selection" +msgstr "모든 선택 영역 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 +#: src/slic3r/GUI/GUI_Factories.cpp:481 +msgid "Sphere" +msgstr "영역" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:106 +#: src/libslic3r/PrintConfig.cpp:1231 +msgid "Triangles" +msgstr "삼각형(Triangles)" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 +msgid "Highlight overhang by angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:63 +msgid "Enforce" +msgstr "첫 번째 n 개의 레이어에 대한 서포트 강화" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +msgid "Tool type" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 +msgid "Brush" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:68 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 +msgid "Smart fill" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 +msgid "Smart fill angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:72 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 +msgid "Split triangles" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:73 +msgid "On overhangs only" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:187 +#, boost-format +msgid "" +"Preselects faces by overhang angle. It is possible to restrict paintable " +"facets to only preselected faces when the option \"%1%\" is enabled." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:230 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:371 +msgid "Paints facets according to the chosen painting brush." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:238 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:384 +msgid "" +"Paints neighboring facets whose relative angle is less or equal to set angle." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242 +#, boost-format +msgid "Allows painting only on facets selected by: \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:257 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:412 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141 +msgid "Paints all facets inside, regardless of their orientation." +msgstr "방향에 관계없이 내부에 모든 면을 페인트합니다." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:266 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:421 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:149 +msgid "Ignores facets facing away from the camera." +msgstr "카메라에서 멀리 향하는 면을 무시합니다." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:430 +msgid "Paints only one facet." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:298 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:438 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:455 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:129 +msgid "Alt + Mouse wheel" +msgstr "Alt + 마우스 휠" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:288 +msgid "Splits bigger facets into smaller ones while the object is painted." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:321 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:476 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:167 +msgid "Ctrl + Mouse wheel" +msgstr "Ctrl + 마우스 휠" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:326 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:481 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:172 +msgid "Reset selection" +msgstr "선택 재설정" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:382 +msgid "Block supports by angle" +msgstr "블록 지지대 각도별" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:383 +msgid "Add supports by angle" +msgstr "각도별로 지지성 추가" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +msgid "Automatic painting requires valid print setup." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:535 +msgid "Automatic painting will erase all currently painted areas." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:536 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1118 +msgid "Are you sure you want to do it?" +msgstr "당신은 그것을 하시겠습니까?" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:540 +msgid "Automatic painting support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:571 +msgid "Add supports" +msgstr "지원 추가" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:22 +msgid "Entering Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:23 +msgid "Leaving Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:24 +msgid "Paint-on supports editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:88 +msgid "Place on face" +msgstr "물체(Gizmo)를 배드위로" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:29 +msgid "Hollow this object" +msgstr "이 개체 중공" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 +msgid "Preview hollowed and drilled model" +msgstr "공동화된 모델 미리보기" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 +msgid "Offset" +msgstr "오프셋" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 +msgid "Quality" +msgstr "품질" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 +#: src/libslic3r/PrintConfig.cpp:4037 +msgid "Closing distance" +msgstr "닫힘 거리" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 +msgid "Hole diameter" +msgstr "구멍 직경" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 +msgid "Hole depth" +msgstr "구멍 깊이" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 +msgid "Remove selected holes" +msgstr "선택한 구멍 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 +msgid "Remove all holes" +msgstr "모든 구멍 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 +msgid "Show supports" +msgstr "지원 표시" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:242 +msgid "Add drainage hole" +msgstr "배수 구멍 추가" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:361 +msgid "Delete drainage hole" +msgstr "배수 구멍 삭제" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:655 +msgid "Hollowing parameter change" +msgstr "공동화 변수 변경" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:739 +msgid "Change drainage hole diameter" +msgstr "배수 구멍 직경 변경" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:827 +msgid "Hollow and drill" +msgstr "중공 및 드릴" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:869 +msgid "Move drainage hole" +msgstr "구멍 이동" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:64 +msgid "No feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:65 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:76 +msgid "Vertex" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:66 +msgid "Edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:68 +msgid "Plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:77 +msgid "Point on edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:78 +msgid "Point on circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:79 +msgid "Point on plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:89 +msgid "Center of edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:90 +msgid "Center of circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:554 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2029 +msgid "Measure" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1236 +msgid "Edit to scale" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1258 +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:161 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:236 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:776 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:794 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:817 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:831 +#: src/libslic3r/PrintConfig.cpp:4713 +msgid "Scale" +msgstr "크기" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1362 +msgctxt "Verb" +msgid "Scale" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1541 +msgid "##angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1740 +msgid "Measure tool debug" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1824 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1851 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1857 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1886 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1893 +msgid "Unselect feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1830 +msgid "Unselect center" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:432 -msgid "Add supports" -msgstr "지원 추가" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1835 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1862 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1898 +msgid "Select center" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:41 -msgid "Place on face" -msgstr "물체(Gizmo)를 배드위로" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1840 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1867 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1903 +msgid "Unselect point" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 -msgid "Hollow this object" -msgstr "이 개체 중공" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1846 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1873 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1910 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select feature" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 -msgid "Preview hollowed and drilled model" -msgstr "공동화된 모델 미리보기" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select point" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 -msgid "Offset" -msgstr "오프셋" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Shift" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:57 -msgid "Quality" -msgstr "품질" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Enable point selection" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3905 -msgid "Closing distance" -msgstr "닫힘 거리" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2007 +msgid "Restart selection" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 -msgid "Hole diameter" -msgstr "구멍 직경" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1952 +msgid "Esc" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 -msgid "Hole depth" -msgstr "구멍 깊이" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1955 +msgid "Unselect" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 -msgid "Remove selected holes" -msgstr "선택한 구멍 제거" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1999 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2001 +msgid "Selection" +msgstr "선택" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 -msgid "Remove all holes" -msgstr "모든 구멍 제거" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2021 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +msgid "Copy to clipboard" +msgstr "클립보드로 복사" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 -msgid "Show supports" -msgstr "지원 표시" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2038 +msgid "Angle" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:287 -msgid "Add drainage hole" -msgstr "배수 구멍 추가" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Perpendicular distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:403 -msgid "Delete drainage hole" -msgstr "배수 구멍 삭제" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:590 -msgid "Hollowing parameter change" -msgstr "공동화 변수 변경" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2062 +msgid "Direct distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:667 -msgid "Change drainage hole diameter" -msgstr "배수 구멍 직경 변경" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2072 +msgid "Distance XYZ" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:761 -msgid "Hollow and drill" -msgstr "중공 및 드릴" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:163 +msgid "Entering Measure gizmo" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:811 -msgid "Move drainage hole" -msgstr "구멍 이동" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:164 +msgid "Leaving Measure gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:165 +msgid "Measure gizmo editing" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:27 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:28 #, boost-format msgid "" "Your printer has more extruders than the multi-material painting gizmo " @@ -2779,81 +3982,85 @@ msgid "" "used for painting." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:45 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:46 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 msgid "Multimaterial painting" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 msgid "First color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 msgid "Second color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:120 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:671 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:642 msgid "Remove painted color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 msgid "Clear all" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:129 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 msgid "Bucket fill" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:404 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:397 msgid "Paints neighboring facets that have the same color." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:450 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:443 msgid "Split bigger facets into smaller ones while the object is painted." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:674 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:645 #, boost-format msgid "Painted using: Extruder %1%" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:118 +msgid "Entering Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:119 +msgid "Leaving Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:120 +msgid "Multimaterial painting editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:76 msgid "Move" msgstr "이동" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:466 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4532 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:643 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:745 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:775 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:813 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:830 +#: src/libslic3r/PrintConfig.cpp:4698 msgid "Rotate" msgstr "회전" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:505 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:707 msgid "Optimize orientation" msgstr "방향 최적화" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:552 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:319 -msgid "Apply" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:79 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4547 -msgid "Scale" -msgstr "크기" +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:194 +msgid "Gizmo-Scale" +msgstr "개체(Gizmo) 배율" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 msgid "Enforce seam" msgstr "적용 솔기" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:38 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:255 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:252 msgid "Block seam" msgstr "블록 솔기" @@ -2861,330 +4068,334 @@ msgstr "블록 솔기" msgid "Seam painting" msgstr "솔기 페인팅" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:23 +msgid "Entering Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:24 +msgid "Leaving Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:25 +msgid "Paint-on seam editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:105 msgid "Mesh name" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:69 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:107 msgid "Detail level" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:108 msgid "Decimate ratio" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:113 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:147 #, boost-format msgid "" "Processing model '%1%' with more than 1M triangles could be slow. It is " -"highly recommend to reduce amount of triangles." +"highly recommended to reduce amount of triangles." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:116 -#: src/slic3r/GUI/GUI_Factories.cpp:705 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:150 +#: src/slic3r/GUI/GUI_Factories.cpp:789 msgid "Simplify model" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:143 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:177 msgid "Simplify" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:156 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:190 msgid "Simplification is currently only allowed when a single part is selected" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 -#: src/slic3r/GUI/PrintHostDialogs.cpp:373 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:191 +#: src/slic3r/GUI/MainFrame.cpp:1246 src/slic3r/GUI/MainFrame.cpp:1716 +#: src/slic3r/GUI/PrintHostDialogs.cpp:425 msgid "Error" msgstr "오류" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:250 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:294 msgid "Extra high" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:251 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:295 msgid "High" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:252 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:296 msgid "Medium" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:297 msgid "Low" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:254 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:298 msgid "Extra low" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:304 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#, boost-format +msgid "" +"Multipart object can be simplified only by %1%. If you want specify %2% " +"process it separately." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:352 #, c-format, boost-format msgid "%d triangles" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:307 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:355 msgid "Show wireframe" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:313 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:361 msgid "Operation already cancelling. Please wait few seconds." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:370 msgid "Can't apply when proccess preview." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:329 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:377 #, boost-format msgid "Process %1% / 100" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:479 -#, boost-format -msgid "Simplify %1%" +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:542 +msgid "Simplify " msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:543 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"simplifying the mesh." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:67 +msgid "Entering SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:68 +msgid "Leaving SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:35 msgid "Head diameter" msgstr "머리 직경" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:36 msgid "Lock supports under new islands" msgstr "새영역에서 서포트 잠금 지원" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:37 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268 msgid "Remove selected points" msgstr "선택한 지점 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:38 msgid "Remove all points" msgstr "모든 지점 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1226 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1271 msgid "Apply changes" msgstr "적용하기" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1227 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1272 msgid "Discard changes" msgstr "변경사항을 취소" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 msgid "Minimal points distance" msgstr "최소한의 지점 거리" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3735 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/libslic3r/PrintConfig.cpp:3867 msgid "Support points density" msgstr "서포트 지점 밀도" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1229 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1274 msgid "Auto-generate points" msgstr "지점 자동 생성" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 msgid "Manual editing" msgstr "수동 편집" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:372 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:307 msgid "Add support point" msgstr "서포트 지점 추가" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:522 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:460 msgid "Delete support point" msgstr "서포트 지점 삭제" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:702 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:626 msgid "Change point head diameter" msgstr "변경된 해드의 끝 점 지름" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:770 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:696 msgid "Support parameter change" msgstr "서포트 매개 변수 변경" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:876 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:806 msgid "SLA Support Points" msgstr "SLA 서포트 지점" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:814 msgid "Do you want to save your manually edited support points?" msgstr "수동으로 편집한 서포트 지점을 저장 하시 겠습니까?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:898 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:815 msgid "Save support points?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:958 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:880 msgid "Move support point" msgstr "서포트 지점 이동" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1051 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:987 msgid "Support points edit" msgstr "서포트 지점 편집" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1131 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1117 msgid "Autogeneration will erase all manually edited points." msgstr "자동 생성은 수동으로 편집된 모든 지점을 지웁웁입니다." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1132 -msgid "Are you sure you want to do it?" -msgstr "당신은 그것을 하시겠습니까?" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1138 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1124 msgid "Autogenerate support points" msgstr "서포트 자동 생성" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1186 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 msgid "SLA gizmo keyboard shortcuts" msgstr "SLA 물체(gizmo) 바로 가기" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1197 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1242 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "참고: 일부 단축키는 (비)편집 모드 에서만 작동 합니다." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 -msgid "Left click" -msgstr "왼쪽 클릭" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 msgid "Add point" msgstr "지점 추가" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 -msgid "Right click" -msgstr "오른쪽 클릭" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 msgid "Remove point" msgstr "점 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 -msgid "Drag" -msgstr "드래그" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 msgid "Move point" msgstr "지점 이동" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 msgid "Add point to selection" msgstr "선택 영역에 지점 추가" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 msgid "Remove point from selection" msgstr "선택 영역에서 지점 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 msgid "Select by rectangle" msgstr "사각형으로 선택" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 msgid "Deselect by rectangle" msgstr "사각형으로 선택 해제" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1267 msgid "Select all points" msgstr "모든 지점들 선택" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Mouse wheel" msgstr "마우스 휠: " -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Move clipping plane" msgstr "갈무리된 평면 이동" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1225 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1270 msgid "Reset clipping plane" msgstr "갈무리된 평면 재설정" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1228 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273 msgid "Switch to editing mode" msgstr "편집 모드로 전환" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:196 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:204 msgid "" "ERROR: Please close all manipulators available from the left toolbar first" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:561 -msgid "Gizmo-Scale" -msgstr "개체(Gizmo) 배율" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:673 -msgid "Gizmo-Place on Face" -msgstr "물체(Gizmo)를 배드위로" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:1270 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:998 msgid "" "You are currently editing SLA support points. Please, apply or discard your " "changes first." msgstr "" -#: src/slic3r/GUI/GUI.cpp:292 +#: src/slic3r/GUI/GUI.cpp:287 msgid "Undefined" msgstr "" -#: src/slic3r/GUI/GUI.cpp:317 +#: src/slic3r/GUI/GUI.cpp:308 #, boost-format msgid "%1% was substituted with %2%" msgstr "" -#: src/slic3r/GUI/GUI.cpp:326 +#: src/slic3r/GUI/GUI.cpp:317 msgid "" "Most likely the configuration was produced by a newer version of PrusaSlicer " "or by some PrusaSlicer fork." msgstr "" -#: src/slic3r/GUI/GUI.cpp:327 +#: src/slic3r/GUI/GUI.cpp:318 msgid "The following values were substituted:" msgstr "" -#: src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/GUI.cpp:319 msgid "Review the substitutions and adjust them if needed." msgstr "" -#: src/slic3r/GUI/GUI.cpp:338 src/slic3r/GUI/Plater.cpp:820 +#: src/slic3r/GUI/GUI.cpp:329 src/slic3r/GUI/Plater.cpp:850 msgid "SLA print settings" msgstr "SLA 인쇄 설정" -#: src/slic3r/GUI/GUI.cpp:342 src/slic3r/GUI/PhysicalPrinterDialog.cpp:157 +#: src/slic3r/GUI/GUI.cpp:333 src/slic3r/GUI/PhysicalPrinterDialog.cpp:158 msgid "Physical Printer" msgstr "실제 프린터" -#: src/slic3r/GUI/GUI.cpp:355 +#: src/slic3r/GUI/GUI.cpp:346 msgid "" "Configuration bundle was loaded, however some configuration values were not " "recognized." msgstr "" -#: src/slic3r/GUI/GUI.cpp:365 +#: src/slic3r/GUI/GUI.cpp:356 #, boost-format msgid "" "Configuration file \"%1%\" was loaded, however some configuration values " "were not recognized." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:266 +#: src/slic3r/GUI/GUI_App.cpp:275 msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." msgstr "" "프루사슬라이서는 알레산드로 라넬루치와 RepRap 커뮤니티 Slic3r를 기반으로합니" "다." -#: src/slic3r/GUI/GUI_App.cpp:267 +#: src/slic3r/GUI/GUI_App.cpp:276 msgid "Developed by Prusa Research." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:269 +#: src/slic3r/GUI/GUI_App.cpp:278 msgid "" "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." @@ -3192,11 +4403,11 @@ msgstr "" "Vojtech Bubnik, 엔리코 투리, 올렉산드라 이우셴코, 타마스 메사로스, 루카스 마" "테나, 보즈테크 크랄, 데이비드 코시크 및 수많은 다른 사람들에 의해 기여." -#: src/slic3r/GUI/GUI_App.cpp:270 -msgid "Artwork model by Leslie Ing" +#: src/slic3r/GUI/GUI_App.cpp:279 +msgid "Artwork model by Creative Tools" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:411 +#: src/slic3r/GUI/GUI_App.cpp:420 #, boost-format msgid "" "Starting with %1% 2.3, configuration directory on Linux has changed " @@ -3229,20 +4440,20 @@ msgstr "" "\n" "지금 무엇을 하고 싶으신가요?" -#: src/slic3r/GUI/GUI_App.cpp:419 +#: src/slic3r/GUI/GUI_App.cpp:428 #, c-format, boost-format msgid "%s - BREAKING CHANGE" msgstr "%s - 획기적인 변화" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Quit, I will move my data now" msgstr "종료, 지금 내 데이터를 이동합니다" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Start the application" msgstr "응용 프로그램 시작" -#: src/slic3r/GUI/GUI_App.cpp:699 +#: src/slic3r/GUI/GUI_App.cpp:725 #, c-format, boost-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -3257,11 +4468,11 @@ msgstr "" "\n" "이제 응용 프로그램이 종료됩니다." -#: src/slic3r/GUI/GUI_App.cpp:702 +#: src/slic3r/GUI/GUI_App.cpp:728 msgid "Fatal error" msgstr "치명적인 오류" -#: src/slic3r/GUI/GUI_App.cpp:706 +#: src/slic3r/GUI/GUI_App.cpp:732 msgid "" "PrusaSlicer has encountered a localization error. Please report to " "PrusaSlicer team, what language was active and in which scenario this issue " @@ -3274,16 +4485,16 @@ msgstr "" "\n" "이제 응용 프로그램이 종료됩니다." -#: src/slic3r/GUI/GUI_App.cpp:709 +#: src/slic3r/GUI/GUI_App.cpp:735 msgid "Critical error" msgstr "중요 오류" -#: src/slic3r/GUI/GUI_App.cpp:714 +#: src/slic3r/GUI/GUI_App.cpp:740 #, boost-format msgid "Internal error: %1%" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:909 src/slic3r/GUI/GUI_App.cpp:1007 +#: src/slic3r/GUI/GUI_App.cpp:954 src/slic3r/GUI/GUI_App.cpp:1051 msgid "" "Error parsing PrusaSlicer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error. Your user profiles will " @@ -3292,7 +4503,7 @@ msgstr "" "PrusaSlicer 구성 파일을 구문 분석하는 오류, 아마 손상된 것입니다. 파일을 수동" "으로 삭제하여 오류에 복구해 보십시오. 사용자 프로필은 영향을 받지 않습니다." -#: src/slic3r/GUI/GUI_App.cpp:915 src/slic3r/GUI/GUI_App.cpp:1013 +#: src/slic3r/GUI/GUI_App.cpp:960 src/slic3r/GUI/GUI_App.cpp:1057 msgid "" "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error." @@ -3300,12 +4511,12 @@ msgstr "" "오류 구문 분석 PrusaGCodeViewer 컨피그 파일, 그것은 아마 손상. 오류를 복구하" "기 위해 파일을 수동으로 삭제해 봅보십시오." -#: src/slic3r/GUI/GUI_App.cpp:962 +#: src/slic3r/GUI/GUI_App.cpp:1006 #, boost-format msgid "You are opening %1% version %2%." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:965 +#: src/slic3r/GUI/GUI_App.cpp:1009 #, boost-format msgid "" "The active configuration was created by %1% %2%,\n" @@ -3317,7 +4528,7 @@ msgid "" "configuration." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:973 +#: src/slic3r/GUI/GUI_App.cpp:1017 #, boost-format msgid "" "An existing configuration was found in %3%\n" @@ -3326,19 +4537,19 @@ msgid "" "Shall this configuration be imported?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:981 +#: src/slic3r/GUI/GUI_App.cpp:1025 msgid "Import" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:982 +#: src/slic3r/GUI/GUI_App.cpp:1026 msgid "Don't import" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:990 +#: src/slic3r/GUI/GUI_App.cpp:1034 msgid "Continue and import newer configuration?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1051 +#: src/slic3r/GUI/GUI_App.cpp:1095 msgid "" "You are running a 32 bit build of PrusaSlicer on 64-bit Windows.\n" "32 bit build of PrusaSlicer will likely not be able to utilize all the RAM " @@ -3348,7 +4559,7 @@ msgid "" "Do you wish to continue?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1134 +#: src/slic3r/GUI/GUI_App.cpp:1182 #, c-format, boost-format msgid "" "%s\n" @@ -3357,46 +4568,37 @@ msgstr "" "%s\n" "계속하시겠습니까?" -#: src/slic3r/GUI/GUI_App.cpp:1136 src/slic3r/GUI/GUI_App.cpp:3101 -#: src/slic3r/GUI/Plater.cpp:1726 src/slic3r/GUI/UnsavedChangesDialog.cpp:889 +#: src/slic3r/GUI/GUI_App.cpp:1184 src/slic3r/GUI/GUI_App.cpp:3302 +#: src/slic3r/GUI/Plater.cpp:1736 src/slic3r/GUI/UnsavedChangesDialog.cpp:917 msgid "Remember my choice" msgstr "선택 기억" -#: src/slic3r/GUI/GUI_App.cpp:1178 +#: src/slic3r/GUI/GUI_App.cpp:1226 msgid "Loading configuration" msgstr "로딩 구성" -#: src/slic3r/GUI/GUI_App.cpp:1209 -#, boost-format -msgid "New release version %1% is available." -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:1210 -msgid "See Download page." -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:1224 +#: src/slic3r/GUI/GUI_App.cpp:1257 #, boost-format msgid "New prerelease version %1% is available." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1225 +#: src/slic3r/GUI/GUI_App.cpp:1258 msgid "See Releases page." msgstr "릴리스 페이지를 참조하십시오." -#: src/slic3r/GUI/GUI_App.cpp:1262 +#: src/slic3r/GUI/GUI_App.cpp:1313 msgid "Preparing settings tabs" msgstr "설정 탭 준비" -#: src/slic3r/GUI/GUI_App.cpp:1336 src/slic3r/GUI/Preferences.cpp:287 +#: src/slic3r/GUI/GUI_App.cpp:1393 src/slic3r/GUI/Preferences.cpp:405 msgid "Restore window position on start" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1338 +#: src/slic3r/GUI/GUI_App.cpp:1395 msgid "PrusaSlicer started after a crash" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1339 +#: src/slic3r/GUI/GUI_App.cpp:1396 #, boost-format msgid "" "PrusaSlicer crashed last time when attempting to set window position.\n" @@ -3409,23 +4611,23 @@ msgid "" "Otherwise, the application will most likely crash again next time." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1351 +#: src/slic3r/GUI/GUI_App.cpp:1408 #, boost-format msgid "Disable \"%1%\"" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1352 +#: src/slic3r/GUI/GUI_App.cpp:1409 #, boost-format msgid "Leave \"%1%\" enabled" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1679 +#: src/slic3r/GUI/GUI_App.cpp:1780 msgid "" "You have the following presets with saved options for \"Print Host upload\"" msgstr "" "\"인쇄 호스트 업로드\"에 대한 저장된 옵션이 있는 다음 사전 설정이 있습니다." -#: src/slic3r/GUI/GUI_App.cpp:1683 +#: src/slic3r/GUI/GUI_App.cpp:1784 msgid "" "But since this version of PrusaSlicer we don't show this information in " "Printer Settings anymore.\n" @@ -3435,7 +4637,7 @@ msgstr "" "지 않습니다.\n" "설정은 실제 프린터 설정에서 사용할 수 있습니다." -#: src/slic3r/GUI/GUI_App.cpp:1685 +#: src/slic3r/GUI/GUI_App.cpp:1786 msgid "" "By default new Printer devices will be named as \"Printer N\" during its " "creation.\n" @@ -3444,169 +4646,174 @@ msgstr "" "기본적으로 새 프린터 장치는 생성 중에 \"프린터 N\"으로 지정됩니다.\n" "참고: 이 이름은 나중에 실제 프린터 설정에서 변경할 수 있습니다." -#: src/slic3r/GUI/GUI_App.cpp:1689 src/slic3r/GUI/PhysicalPrinterDialog.cpp:726 +#: src/slic3r/GUI/GUI_App.cpp:1790 src/slic3r/GUI/PhysicalPrinterDialog.cpp:798 msgid "Information" msgstr "정보" -#: src/slic3r/GUI/GUI_App.cpp:1702 src/slic3r/GUI/GUI_App.cpp:1713 +#: src/slic3r/GUI/GUI_App.cpp:1803 src/slic3r/GUI/GUI_App.cpp:1814 msgid "Recreating" msgstr "재현" -#: src/slic3r/GUI/GUI_App.cpp:1716 +#: src/slic3r/GUI/GUI_App.cpp:1817 msgid "Loading of current presets" msgstr "현재 기본 설정을 불러오기" -#: src/slic3r/GUI/GUI_App.cpp:1721 +#: src/slic3r/GUI/GUI_App.cpp:1822 msgid "Loading of a mode view" msgstr "보기 모드를 불러오기" -#: src/slic3r/GUI/GUI_App.cpp:1859 +#: src/slic3r/GUI/GUI_App.cpp:1961 msgid "Choose one file (3MF/AMF):" msgstr "파일(3MF/AMF) 선택:" -#: src/slic3r/GUI/GUI_App.cpp:1871 +#: src/slic3r/GUI/GUI_App.cpp:1973 msgid "Choose one or more files (STL/3MF/STEP/OBJ/AMF/PRUSA):" msgstr "파일을 선택하세요 (STL/3MF/STEP/OBJ/AMF/PRUSA):" -#: src/slic3r/GUI/GUI_App.cpp:1883 +#: src/slic3r/GUI/GUI_App.cpp:1984 +msgid "Choose ZIP file:" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1996 msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" msgstr "하나의 파일(GCODE/)을 선택합니다. GCO/. G/.ngc/NGC):" -#: src/slic3r/GUI/GUI_App.cpp:1894 +#: src/slic3r/GUI/GUI_App.cpp:2007 msgid "Changing of an application language" msgstr "응용 프로그램 언어 변경" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Select the language" msgstr "언어 선택" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Language" msgstr "언어" -#: src/slic3r/GUI/GUI_App.cpp:2182 -msgid "modified" -msgstr "변경" +#: src/slic3r/GUI/GUI_App.cpp:2363 +msgid "" +"Simple mode supports manipulation with single-part object(s)\n" +"or object(s) with support modifiers only." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2365 +msgid "Please check your object list before mode changing." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2366 +msgid "Change application mode" +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2236 +#: src/slic3r/GUI/GUI_App.cpp:2397 #, c-format, boost-format msgid "Run %s" msgstr "%s 실행하기" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "&Configuration Snapshots" msgstr "&구성 스냅샷" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "Inspect / activate configuration snapshots" msgstr "구성 스냅숏 검사/활성화" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Take Configuration &Snapshot" msgstr "구성 및 스냅샷 찍기" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Capture a configuration snapshot" msgstr "구성 스냅샷 캡처" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for Configuration Updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for configuration updates" msgstr "구성 업데이트 확인" -#: src/slic3r/GUI/GUI_App.cpp:2249 +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for Application Updates" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for new version of application" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2411 msgid "&Preferences" msgstr "기본 설정" -#: src/slic3r/GUI/GUI_App.cpp:2255 +#: src/slic3r/GUI/GUI_App.cpp:2417 msgid "Application preferences" msgstr "응용 프로그램 기본 설정" -#: src/slic3r/GUI/GUI_App.cpp:2260 src/slic3r/GUI/wxExtensions.cpp:708 -msgid "Simple" -msgstr "단순" - -#: src/slic3r/GUI/GUI_App.cpp:2260 +#: src/slic3r/GUI/GUI_App.cpp:2422 msgid "Simple View Mode" msgstr "기본 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:2262 src/slic3r/GUI/wxExtensions.cpp:710 -msgctxt "Mode" -msgid "Advanced" -msgstr "고급" - -#: src/slic3r/GUI/GUI_App.cpp:2262 +#: src/slic3r/GUI/GUI_App.cpp:2424 msgid "Advanced View Mode" msgstr "고급 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:2263 src/slic3r/GUI/wxExtensions.cpp:711 -msgid "Expert" -msgstr "전문가" - -#: src/slic3r/GUI/GUI_App.cpp:2263 +#: src/slic3r/GUI/GUI_App.cpp:2425 msgid "Expert View Mode" msgstr "전문가 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 msgid "Mode" msgstr "모드" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 #, c-format, boost-format msgid "%s View Mode" msgstr "%s 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:2271 +#: src/slic3r/GUI/GUI_App.cpp:2433 msgid "&Language" msgstr "언어(&L)" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Flash Printer &Firmware" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Upload a firmware image into an Arduino based printer" msgstr "아두이노 기반 프린터에 펌웨어 이미지 업로드" -#: src/slic3r/GUI/GUI_App.cpp:2294 +#: src/slic3r/GUI/GUI_App.cpp:2459 msgid "Taking a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2295 +#: src/slic3r/GUI/GUI_App.cpp:2460 msgid "" "Some presets are modified and the unsaved changes will not be captured by " "the configuration snapshot." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2296 +#: src/slic3r/GUI/GUI_App.cpp:2461 msgid "Snapshot name" msgstr "스냅샷 이름" -#: src/slic3r/GUI/GUI_App.cpp:2312 +#: src/slic3r/GUI/GUI_App.cpp:2477 msgid "Loading a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2321 +#: src/slic3r/GUI/GUI_App.cpp:2486 #, boost-format msgid "Continue to activate a configuration snapshot %1%?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2335 +#: src/slic3r/GUI/GUI_App.cpp:2500 msgid "Failed to activate configuration snapshot." msgstr "구성 스냅숏을 활성화하지 못했습니다." -#: src/slic3r/GUI/GUI_App.cpp:2354 -msgid "Restart application" -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:2388 +#: src/slic3r/GUI/GUI_App.cpp:2520 msgid "Language selection" msgstr "언어 선택" -#: src/slic3r/GUI/GUI_App.cpp:2391 +#: src/slic3r/GUI/GUI_App.cpp:2523 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." @@ -3614,142 +4821,172 @@ msgstr "" "언어를 전환 하면 응용 프로그램 재시작 합니다. 플레이트 위 오브젝트는 모두 지" "워집니다." -#: src/slic3r/GUI/GUI_App.cpp:2393 src/slic3r/GUI/Preferences.cpp:582 +#: src/slic3r/GUI/GUI_App.cpp:2525 src/slic3r/GUI/Preferences.cpp:730 +#: src/slic3r/GUI/Selection.cpp:1695 msgid "Do you want to proceed?" msgstr "계속 하시겠습니까?" -#: src/slic3r/GUI/GUI_App.cpp:2420 +#: src/slic3r/GUI/GUI_App.cpp:2552 msgid "&Configuration" msgstr "구성 노트" -#: src/slic3r/GUI/GUI_App.cpp:2534 src/slic3r/GUI/GUI_App.cpp:2595 -msgid "The preset modifications are successfully saved" -msgid_plural "The presets modifications are successfully saved" -msgstr[0] "" +#: src/slic3r/GUI/GUI_App.cpp:2560 +msgid "Restart application" +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2598 +#: src/slic3r/GUI/GUI_App.cpp:2726 msgid "For new project all modifications will be reseted" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2636 +#: src/slic3r/GUI/GUI_App.cpp:2764 msgid "Loading a new project while the current project is modified." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Project is loading" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Opening new project while some presets are unsaved." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "The uploads are still ongoing" msgstr "업로드는 여전히 진행 중입니다." -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "Stop them and continue anyway?" msgstr "그들을 중지하고 어쨌든 계속?" -#: src/slic3r/GUI/GUI_App.cpp:2662 +#: src/slic3r/GUI/GUI_App.cpp:2790 msgid "Ongoing uploads" msgstr "지속적인 업로드" -#: src/slic3r/GUI/GUI_App.cpp:2876 -msgid "It's impossible to print multi-part object(s) with SLA technology." -msgstr "SLA 방식을 사용 하여 다중 객체를 인쇄할 수는 없습니다." +#: src/slic3r/GUI/GUI_App.cpp:3026 +msgid "" +"It's impossible to print object(s) which contains parameter modifiers with " +"SLA technology." +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2877 src/slic3r/GUI/Jobs/SLAImportJob.cpp:235 -#: src/slic3r/GUI/Plater.cpp:2459 +#: src/slic3r/GUI/GUI_App.cpp:3027 src/slic3r/GUI/Jobs/SLAImportJob.cpp:149 +#: src/slic3r/GUI/Plater.cpp:2536 msgid "Please check your object list before preset changing." msgstr "미리 설정하기 전에 개체 목록을 확인하십시오." -#: src/slic3r/GUI/GUI_App.cpp:2901 +#: src/slic3r/GUI/GUI_App.cpp:3070 msgid "Configuration is editing from ConfigWizard" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2926 +#: src/slic3r/GUI/GUI_App.cpp:3088 +#, boost-format +msgid "Welcome to %1% version %2%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3090 +#, boost-format +msgid "" +"Do you wish to register downloads from Printables.com\n" +"for this %1% %2% executable?\n" +"\n" +"Downloads can be registered for only 1 executable at time." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3118 msgid "Select a gcode file:" msgstr "gcode 파일을 선택합니다." -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "Open hyperlink in default browser?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "PrusaSlicer: Open hyperlink" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3105 src/slic3r/GUI/Preferences.cpp:382 +#: src/slic3r/GUI/GUI_App.cpp:3306 src/slic3r/GUI/Preferences.cpp:593 msgid "Suppress to open hyperlink in browser" msgstr "브라우저에서 하이퍼링크를 열도록 억제" -#: src/slic3r/GUI/GUI_App.cpp:3107 src/slic3r/GUI/Plater.cpp:1732 +#: src/slic3r/GUI/GUI_App.cpp:3308 src/slic3r/GUI/Plater.cpp:1742 msgid "PrusaSlicer will remember your choice." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3108 +#: src/slic3r/GUI/GUI_App.cpp:3309 msgid "You will not be asked about it again on hyperlinks hovering." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3109 src/slic3r/GUI/Plater.cpp:1736 +#: src/slic3r/GUI/GUI_App.cpp:3310 src/slic3r/GUI/Plater.cpp:1746 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" "to changes your choice." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3111 src/slic3r/GUI/Plater.cpp:1738 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:906 +#: src/slic3r/GUI/GUI_App.cpp:3312 src/slic3r/GUI/Plater.cpp:1748 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:934 msgid "PrusaSlicer: Don't ask me again" msgstr "프라사슬라이스: 다시 물어보지 마세요." -#: src/slic3r/GUI/GUI_Init.cpp:57 src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_App.cpp:3386 +msgid "Check for application update has failed." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3387 +#, boost-format +msgid "No new version is available. Latest release version is %1%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3458 +msgid "Download of new version is already ongoing. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/GUI_Init.cpp:64 src/slic3r/GUI/GUI_Init.cpp:67 msgid "PrusaSlicer GUI initialization failed" msgstr "PrusaSlicer GUI 초기화 실패" -#: src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_Init.cpp:67 #, boost-format msgid "Fatal error, exception catched: %1%" msgstr "치명적인 오류, 예외가 적중: %1%" #: src/slic3r/GUI/GUI_Factories.cpp:54 src/slic3r/GUI/GUI_Factories.cpp:127 -#: src/libslic3r/PrintConfig.cpp:287 src/libslic3r/PrintConfig.cpp:404 -#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:456 -#: src/libslic3r/PrintConfig.cpp:708 src/libslic3r/PrintConfig.cpp:778 -#: src/libslic3r/PrintConfig.cpp:786 src/libslic3r/PrintConfig.cpp:1232 -#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1563 -#: src/libslic3r/PrintConfig.cpp:1955 src/libslic3r/PrintConfig.cpp:2030 -#: src/libslic3r/PrintConfig.cpp:2264 src/libslic3r/PrintConfig.cpp:2850 -#: src/libslic3r/PrintConfig.cpp:2858 src/libslic3r/PrintConfig.cpp:2918 -#: src/libslic3r/PrintConfig.cpp:2927 src/libslic3r/PrintConfig.cpp:3098 +#: src/libslic3r/PrintConfig.cpp:300 src/libslic3r/PrintConfig.cpp:423 +#: src/libslic3r/PrintConfig.cpp:466 src/libslic3r/PrintConfig.cpp:475 +#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:872 +#: src/libslic3r/PrintConfig.cpp:881 src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1376 src/libslic3r/PrintConfig.cpp:1604 +#: src/libslic3r/PrintConfig.cpp:1985 src/libslic3r/PrintConfig.cpp:2060 +#: src/libslic3r/PrintConfig.cpp:2294 src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:2946 src/libslic3r/PrintConfig.cpp:3006 +#: src/libslic3r/PrintConfig.cpp:3015 src/libslic3r/PrintConfig.cpp:3186 msgid "Layers and Perimeters" msgstr "레이어 및 둘레" #: src/slic3r/GUI/GUI_Factories.cpp:56 src/slic3r/GUI/GUI_Factories.cpp:131 -#: src/slic3r/GUI/GUI_Preview.cpp:249 src/slic3r/GUI/Tab.cpp:1547 -#: src/slic3r/GUI/Tab.cpp:1549 src/libslic3r/ExtrusionEntity.cpp:340 -#: src/libslic3r/ExtrusionEntity.cpp:372 src/libslic3r/PrintConfig.cpp:670 -#: src/libslic3r/PrintConfig.cpp:2095 src/libslic3r/PrintConfig.cpp:2104 -#: src/libslic3r/PrintConfig.cpp:2113 src/libslic3r/PrintConfig.cpp:2123 -#: src/libslic3r/PrintConfig.cpp:2132 src/libslic3r/PrintConfig.cpp:2554 -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2568 -#: src/libslic3r/PrintConfig.cpp:2581 src/libslic3r/PrintConfig.cpp:2591 -#: src/libslic3r/PrintConfig.cpp:2599 src/libslic3r/PrintConfig.cpp:2617 -#: src/libslic3r/PrintConfig.cpp:2634 src/libslic3r/PrintConfig.cpp:2655 -#: src/libslic3r/PrintConfig.cpp:2668 src/libslic3r/PrintConfig.cpp:2685 -#: src/libslic3r/PrintConfig.cpp:2703 src/libslic3r/PrintConfig.cpp:2718 -#: src/libslic3r/PrintConfig.cpp:2728 src/libslic3r/PrintConfig.cpp:2737 -#: src/libslic3r/PrintConfig.cpp:2748 src/libslic3r/PrintConfig.cpp:2762 -#: src/libslic3r/PrintConfig.cpp:2778 src/libslic3r/PrintConfig.cpp:2786 -#: src/libslic3r/PrintConfig.cpp:2787 src/libslic3r/PrintConfig.cpp:2796 -#: src/libslic3r/PrintConfig.cpp:2810 src/libslic3r/PrintConfig.cpp:2818 -#: src/libslic3r/PrintConfig.cpp:2832 +#: src/slic3r/GUI/Tab.cpp:1494 src/slic3r/GUI/Tab.cpp:1496 +#: src/libslic3r/PrintConfig.cpp:773 src/libslic3r/PrintConfig.cpp:2125 +#: src/libslic3r/PrintConfig.cpp:2134 src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2153 src/libslic3r/PrintConfig.cpp:2162 +#: src/libslic3r/PrintConfig.cpp:2584 src/libslic3r/PrintConfig.cpp:2590 +#: src/libslic3r/PrintConfig.cpp:2598 src/libslic3r/PrintConfig.cpp:2611 +#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2628 +#: src/libslic3r/PrintConfig.cpp:2644 src/libslic3r/PrintConfig.cpp:2660 +#: src/libslic3r/PrintConfig.cpp:2681 src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2725 +#: src/libslic3r/PrintConfig.cpp:2743 src/libslic3r/PrintConfig.cpp:2753 +#: src/libslic3r/PrintConfig.cpp:2762 src/libslic3r/PrintConfig.cpp:2773 +#: src/libslic3r/PrintConfig.cpp:2785 src/libslic3r/PrintConfig.cpp:2799 +#: src/libslic3r/PrintConfig.cpp:2807 src/libslic3r/PrintConfig.cpp:2808 +#: src/libslic3r/PrintConfig.cpp:2817 src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2840 src/libslic3r/PrintConfig.cpp:2854 +#: src/libslic3r/PrintConfig.cpp:2862 src/libslic3r/PrintConfig.cpp:2873 +#: src/libslic3r/PrintConfig.cpp:2884 src/libslic3r/PrintConfig.cpp:2893 +#: src/libslic3r/PrintConfig.cpp:2903 src/libslic3r/PrintConfig.cpp:2915 msgid "Support material" msgstr "서포트 재료 / 라프트 / 스커트 익스트루더" #: src/slic3r/GUI/GUI_Factories.cpp:59 src/slic3r/GUI/GUI_Factories.cpp:135 -#: src/libslic3r/PrintConfig.cpp:3054 src/libslic3r/PrintConfig.cpp:3062 +#: src/libslic3r/PrintConfig.cpp:3142 src/libslic3r/PrintConfig.cpp:3150 msgid "Wipe options" msgstr "와이퍼(Wipe) 옵션" @@ -3757,330 +4994,351 @@ msgstr "와이퍼(Wipe) 옵션" msgid "Pad and Support" msgstr "패드 및 서포트" -#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/GUI_Preview.cpp:245 -#: src/slic3r/GUI/Tab.cpp:1513 src/libslic3r/ExtrusionEntity.cpp:336 -#: src/libslic3r/ExtrusionEntity.cpp:364 src/libslic3r/PrintConfig.cpp:1579 -#: src/libslic3r/PrintConfig.cpp:1585 src/libslic3r/PrintConfig.cpp:1599 -#: src/libslic3r/PrintConfig.cpp:1609 src/libslic3r/PrintConfig.cpp:1617 -#: src/libslic3r/PrintConfig.cpp:1619 +#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/Tab.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1620 src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1638 src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1656 src/libslic3r/PrintConfig.cpp:1658 msgid "Ironing" msgstr "다림 질" -#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1283 -#: src/libslic3r/PrintConfig.cpp:1284 src/libslic3r/PrintConfig.cpp:1299 -#: src/libslic3r/PrintConfig.cpp:1309 +#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1344 src/libslic3r/PrintConfig.cpp:1356 +#: src/libslic3r/PrintConfig.cpp:1366 msgid "Fuzzy Skin" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/GUI_Preview.cpp:220 -#: src/slic3r/GUI/Tab.cpp:1581 src/libslic3r/PrintConfig.cpp:507 -#: src/libslic3r/PrintConfig.cpp:766 src/libslic3r/PrintConfig.cpp:1326 -#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1618 -#: src/libslic3r/PrintConfig.cpp:2020 src/libslic3r/PrintConfig.cpp:2352 -#: src/libslic3r/PrintConfig.cpp:2405 src/libslic3r/PrintConfig.cpp:2903 +#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/Tab.cpp:1536 +#: src/libslic3r/PrintConfig.cpp:526 src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:548 src/libslic3r/PrintConfig.cpp:557 +#: src/libslic3r/PrintConfig.cpp:566 src/libslic3r/PrintConfig.cpp:575 +#: src/libslic3r/PrintConfig.cpp:852 src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1657 +#: src/libslic3r/PrintConfig.cpp:2050 src/libslic3r/PrintConfig.cpp:2383 +#: src/libslic3r/PrintConfig.cpp:2436 src/libslic3r/PrintConfig.cpp:2991 msgid "Speed" msgstr "속도" -#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1623 -#: src/slic3r/GUI/Tab.cpp:2304 src/libslic3r/PrintConfig.cpp:796 -#: src/libslic3r/PrintConfig.cpp:1489 src/libslic3r/PrintConfig.cpp:1997 -#: src/libslic3r/PrintConfig.cpp:2373 src/libslic3r/PrintConfig.cpp:2647 -#: src/libslic3r/PrintConfig.cpp:2675 +#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1585 +#: src/slic3r/GUI/Tab.cpp:2288 src/libslic3r/PrintConfig.cpp:889 +#: src/libslic3r/PrintConfig.cpp:1530 src/libslic3r/PrintConfig.cpp:2027 +#: src/libslic3r/PrintConfig.cpp:2404 src/libslic3r/PrintConfig.cpp:2673 +#: src/libslic3r/PrintConfig.cpp:2701 msgid "Extruders" msgstr "익스트루더" -#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:754 -#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:1218 -#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:2006 -#: src/libslic3r/PrintConfig.cpp:2393 src/libslic3r/PrintConfig.cpp:2656 -#: src/libslic3r/PrintConfig.cpp:2890 +#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:840 +#: src/libslic3r/PrintConfig.cpp:953 src/libslic3r/PrintConfig.cpp:1278 +#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:2036 +#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2682 +#: src/libslic3r/PrintConfig.cpp:2978 msgid "Extrusion Width" msgstr "돌출 폭" -#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1533 -#: src/libslic3r/PrintConfig.cpp:517 src/libslic3r/PrintConfig.cpp:528 -#: src/libslic3r/PrintConfig.cpp:544 +#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:631 src/libslic3r/PrintConfig.cpp:642 +#: src/libslic3r/PrintConfig.cpp:655 msgid "Skirt and brim" msgstr "스커트와 브림" -#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 -#: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1645 -#: src/slic3r/GUI/Tab.cpp:1649 src/slic3r/GUI/Tab.cpp:2031 -#: src/slic3r/GUI/Tab.cpp:2402 src/slic3r/GUI/Tab.cpp:4729 -#: src/libslic3r/PrintConfig.cpp:260 src/libslic3r/PrintConfig.cpp:495 -#: src/libslic3r/PrintConfig.cpp:1438 src/libslic3r/PrintConfig.cpp:1525 -#: src/libslic3r/PrintConfig.cpp:1572 src/libslic3r/PrintConfig.cpp:2530 -#: src/libslic3r/PrintConfig.cpp:2540 src/libslic3r/PrintConfig.cpp:3078 -#: src/libslic3r/PrintConfig.cpp:3113 src/libslic3r/PrintConfig.cpp:3124 -#: src/libslic3r/PrintConfig.cpp:3139 src/libslic3r/PrintConfig.cpp:3152 -#: src/libslic3r/PrintConfig.cpp:3161 src/libslic3r/PrintConfig.cpp:3173 -#: src/libslic3r/PrintConfig.cpp:3370 -msgid "Advanced" -msgstr "고급" - -#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4663 src/slic3r/GUI/Tab.cpp:4664 -#: src/libslic3r/PrintConfig.cpp:3564 src/libslic3r/PrintConfig.cpp:3571 -#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3589 -#: src/libslic3r/PrintConfig.cpp:3599 src/libslic3r/PrintConfig.cpp:3609 -#: src/libslic3r/PrintConfig.cpp:3646 src/libslic3r/PrintConfig.cpp:3653 -#: src/libslic3r/PrintConfig.cpp:3664 src/libslic3r/PrintConfig.cpp:3674 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3696 -#: src/libslic3r/PrintConfig.cpp:3706 src/libslic3r/PrintConfig.cpp:3715 -#: src/libslic3r/PrintConfig.cpp:3725 src/libslic3r/PrintConfig.cpp:3736 -#: src/libslic3r/PrintConfig.cpp:3744 +#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Tab.cpp:4946 src/slic3r/GUI/Tab.cpp:4948 +#: src/libslic3r/PrintConfig.cpp:3328 src/libslic3r/PrintConfig.cpp:3337 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3356 +#: src/libslic3r/PrintConfig.cpp:3366 src/libslic3r/PrintConfig.cpp:3387 +#: src/libslic3r/PrintConfig.cpp:3410 src/libslic3r/PrintConfig.cpp:3417 +#: src/libslic3r/PrintConfig.cpp:3432 src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3464 +#: src/libslic3r/PrintConfig.cpp:3474 src/libslic3r/PrintConfig.cpp:3488 +#: src/libslic3r/PrintConfig.cpp:3498 src/libslic3r/PrintConfig.cpp:3841 +#: src/libslic3r/PrintConfig.cpp:3861 src/libslic3r/PrintConfig.cpp:3868 +#: src/libslic3r/PrintConfig.cpp:3876 msgid "Supports" msgstr "서포트" -#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4704 src/slic3r/GUI/Tab.cpp:4705 -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3752 -#: src/libslic3r/PrintConfig.cpp:3759 src/libslic3r/PrintConfig.cpp:3773 -#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3794 -#: src/libslic3r/PrintConfig.cpp:3816 src/libslic3r/PrintConfig.cpp:3827 -#: src/libslic3r/PrintConfig.cpp:3834 src/libslic3r/PrintConfig.cpp:3841 -#: src/libslic3r/PrintConfig.cpp:3852 src/libslic3r/PrintConfig.cpp:3861 -#: src/libslic3r/PrintConfig.cpp:3870 +#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:590 +#: src/slic3r/GUI/Tab.cpp:4960 src/slic3r/GUI/Tab.cpp:4961 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3884 +#: src/libslic3r/PrintConfig.cpp:3891 src/libslic3r/PrintConfig.cpp:3905 +#: src/libslic3r/PrintConfig.cpp:3916 src/libslic3r/PrintConfig.cpp:3926 +#: src/libslic3r/PrintConfig.cpp:3948 src/libslic3r/PrintConfig.cpp:3959 +#: src/libslic3r/PrintConfig.cpp:3966 src/libslic3r/PrintConfig.cpp:3973 +#: src/libslic3r/PrintConfig.cpp:3984 src/libslic3r/PrintConfig.cpp:3993 +#: src/libslic3r/PrintConfig.cpp:4002 msgid "Pad" msgstr "패드" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4722 -#: src/slic3r/GUI/Tab.cpp:4723 src/libslic3r/SLA/Hollowing.cpp:73 -#: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3880 -#: src/libslic3r/PrintConfig.cpp:3887 src/libslic3r/PrintConfig.cpp:3897 -#: src/libslic3r/PrintConfig.cpp:3906 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4978 +#: src/slic3r/GUI/Tab.cpp:4979 src/libslic3r/SLA/Hollowing.cpp:86 +#: src/libslic3r/SLA/Hollowing.cpp:91 src/libslic3r/SLA/Hollowing.cpp:106 +#: src/libslic3r/SLA/Hollowing.cpp:115 src/libslic3r/PrintConfig.cpp:4012 +#: src/libslic3r/PrintConfig.cpp:4019 src/libslic3r/PrintConfig.cpp:4029 +#: src/libslic3r/PrintConfig.cpp:4038 msgid "Hollowing" msgstr "물체 속이 빈(Hollowing)" -#: src/slic3r/GUI/GUI_Factories.cpp:160 +#: src/slic3r/GUI/GUI_Factories.cpp:159 msgid "Add part" msgstr "부품 추가" -#: src/slic3r/GUI/GUI_Factories.cpp:161 +#: src/slic3r/GUI/GUI_Factories.cpp:160 msgid "Add negative volume" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:162 +#: src/slic3r/GUI/GUI_Factories.cpp:161 msgid "Add modifier" msgstr "편집영역(modifier) 추가" -#: src/slic3r/GUI/GUI_Factories.cpp:163 +#: src/slic3r/GUI/GUI_Factories.cpp:162 msgid "Add support blocker" msgstr "서포트 금지영역(blocker) 추가" -#: src/slic3r/GUI/GUI_Factories.cpp:164 +#: src/slic3r/GUI/GUI_Factories.cpp:163 msgid "Add support enforcer" msgstr "서포트 지원(enforcer)영역 추가" -#: src/slic3r/GUI/GUI_Factories.cpp:300 +#: src/slic3r/GUI/GUI_Factories.cpp:169 +msgid "Add text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:170 +msgid "Add negative text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:171 +msgid "Add text modifier" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:307 msgid "Select showing settings" msgstr "표시된 설정을 선택 합니다" -#: src/slic3r/GUI/GUI_Factories.cpp:407 src/slic3r/GUI/GUI_Factories.cpp:412 -#: src/slic3r/GUI/GUI_Factories.cpp:556 src/slic3r/GUI/GUI_Factories.cpp:562 +#: src/slic3r/GUI/GUI_Factories.cpp:414 src/slic3r/GUI/GUI_Factories.cpp:419 +#: src/slic3r/GUI/GUI_Factories.cpp:625 src/slic3r/GUI/GUI_Factories.cpp:631 #, c-format, boost-format msgid "Quick Add Settings (%s)" msgstr "빠른 추가 설정 (%s)" -#: src/slic3r/GUI/GUI_Factories.cpp:444 +#: src/slic3r/GUI/GUI_Factories.cpp:460 msgid "Remove the selected object" msgstr "선택한 객체 제거" -#: src/slic3r/GUI/GUI_Factories.cpp:456 +#: src/slic3r/GUI/GUI_Factories.cpp:475 msgid "Load" msgstr "불러오기" -#: src/slic3r/GUI/GUI_Factories.cpp:461 src/slic3r/GUI/GUI_Factories.cpp:501 -#: src/slic3r/GUI/GUI_Factories.cpp:505 +#: src/slic3r/GUI/GUI_Factories.cpp:481 src/slic3r/GUI/GUI_Factories.cpp:566 +#: src/slic3r/GUI/GUI_Factories.cpp:570 msgid "Box" msgstr "박스" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Cylinder" msgstr "실린더" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Slab" msgstr "슬 래 브" -#: src/slic3r/GUI/GUI_Factories.cpp:471 +#: src/slic3r/GUI/GUI_Factories.cpp:493 msgid "Gallery" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:488 src/slic3r/GUI/GUI_Factories.cpp:526 +#: src/slic3r/GUI/GUI_Factories.cpp:529 src/slic3r/GUI/GUI_Factories.cpp:549 +#: src/slic3r/GUI/GUI_ObjectList.cpp:660 +msgid "Text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:555 src/slic3r/GUI/GUI_Factories.cpp:558 +#: src/slic3r/GUI/GUI_Factories.cpp:595 msgid "Height range Modifier" msgstr "높이 범위 수정자" -#: src/slic3r/GUI/GUI_Factories.cpp:535 +#: src/slic3r/GUI/GUI_Factories.cpp:604 msgid "Add settings" msgstr "하위 오브젝트에 대한 번들 설정을 추가" -#: src/slic3r/GUI/GUI_Factories.cpp:626 +#: src/slic3r/GUI/GUI_Factories.cpp:695 msgid "Change type" msgstr "변경 유형" -#: src/slic3r/GUI/GUI_Factories.cpp:636 src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:705 src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Object" msgstr "분리된 개체로 설정" -#: src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Objects" msgstr "분리된 객체로 설정" -#: src/slic3r/GUI/GUI_Factories.cpp:658 +#: src/slic3r/GUI/GUI_Factories.cpp:727 msgid "Printable" msgstr "인쇄용" -#: src/slic3r/GUI/GUI_Factories.cpp:686 +#: src/slic3r/GUI/GUI_Factories.cpp:755 src/slic3r/GUI/GUI_ObjectList.cpp:2070 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2582 +msgid "Invalidate cut info" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:770 msgid "Rename" msgstr "이름 변경" -#: src/slic3r/GUI/GUI_Factories.cpp:696 +#: src/slic3r/GUI/GUI_Factories.cpp:780 msgid "Fix through the Netfabb" msgstr "Netfabb를 통해 수정" -#: src/slic3r/GUI/GUI_Factories.cpp:715 -msgid "Export as STL" -msgstr "STL로 수출" +#: src/slic3r/GUI/GUI_Factories.cpp:799 +msgid "Export as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:726 +#: src/slic3r/GUI/GUI_Factories.cpp:810 msgid "Reload the selected volumes from disk" msgstr "디스크에서 선택한 볼륨 다시 로드" -#: src/slic3r/GUI/GUI_Factories.cpp:733 src/slic3r/GUI/Plater.cpp:3568 +#: src/slic3r/GUI/GUI_Factories.cpp:817 src/slic3r/GUI/Plater.cpp:3602 msgid "Replace with STL" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:733 +#: src/slic3r/GUI/GUI_Factories.cpp:817 msgid "Replace the selected volume with new STL" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Set extruder for selected items" msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" -#: src/slic3r/GUI/GUI_Factories.cpp:778 src/slic3r/Utils/Repetier.cpp:126 -#: src/slic3r/Utils/Repetier.cpp:209 src/libslic3r/PrintConfig.cpp:635 -#: src/libslic3r/PrintConfig.cpp:2770 +#: src/slic3r/GUI/GUI_Factories.cpp:862 src/slic3r/Utils/Repetier.cpp:145 +#: src/slic3r/Utils/Repetier.cpp:226 src/libslic3r/PrintConfig.cpp:738 +#: src/libslic3r/PrintConfig.cpp:2790 src/libslic3r/PrintConfig.cpp:3851 msgid "Default" msgstr "기본값" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale to print volume" msgstr "볼륨 인쇄배율 조정" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale the selected object to fit the print volume" msgstr "인쇄 볼륨에 맞게 선택한 객체의 배율 조정" -#: src/slic3r/GUI/GUI_Factories.cpp:835 src/slic3r/GUI/Plater.cpp:5655 +#: src/slic3r/GUI/GUI_Factories.cpp:921 src/slic3r/GUI/Plater.cpp:6213 msgid "Convert from imperial units" msgstr "제국 단위에서 변환" -#: src/slic3r/GUI/GUI_Factories.cpp:836 src/slic3r/GUI/Plater.cpp:5656 +#: src/slic3r/GUI/GUI_Factories.cpp:922 src/slic3r/GUI/Plater.cpp:6214 msgid "Revert conversion from imperial units" msgstr "제국 단위에서 변환을 되돌리기" -#: src/slic3r/GUI/GUI_Factories.cpp:837 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:923 src/slic3r/GUI/Plater.cpp:6215 msgid "Convert from meters" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:838 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:924 src/slic3r/GUI/Plater.cpp:6215 msgid "Revert conversion from meters" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2135 -#: src/libslic3r/PrintConfig.cpp:4523 +#: src/slic3r/GUI/GUI_Factories.cpp:945 src/slic3r/GUI/GUI_ObjectList.cpp:2290 +#: src/libslic3r/PrintConfig.cpp:4689 msgid "Merge" msgstr "병합" -#: src/slic3r/GUI/GUI_Factories.cpp:859 +#: src/slic3r/GUI/GUI_Factories.cpp:945 msgid "Merge objects to the one multipart object" msgstr "객체를 하나의 다중 파트 개체로 병합" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Along X axis" msgstr "X 축을 따라" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Mirror the selected object along the X axis" msgstr "선택한 객체를 X 축을 따라 반전합니다" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Along Y axis" msgstr "Y축을 따라" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Mirror the selected object along the Y axis" msgstr "선택한 객체를 Y 축을 따라 반전합니다" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Along Z axis" msgstr "Z 축을 따라" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Mirror the selected object along the Z axis" msgstr "선택한 객체를 Z 축을 따라 반전합니다" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror" msgstr "미러" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror the selected object" msgstr "반전할 객제를 선택" -#: src/slic3r/GUI/GUI_Factories.cpp:901 src/slic3r/GUI/GUI_ObjectList.cpp:1696 +#: src/slic3r/GUI/GUI_Factories.cpp:977 +msgid "Edit text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:999 +msgid "Ability to change text, font, size, ..." +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1021 src/slic3r/GUI/GUI_ObjectList.cpp:1793 msgid "Add Shape" msgstr "셰이프 추가" -#: src/slic3r/GUI/GUI_Factories.cpp:937 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "To objects" msgstr "사물" -#: src/slic3r/GUI/GUI_Factories.cpp:937 src/slic3r/GUI/GUI_Factories.cpp:954 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "Split the selected object into individual objects" msgstr "선택한 개체를 개별 개체로 분할" -#: src/slic3r/GUI/GUI_Factories.cpp:940 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 msgid "To parts" msgstr "파츠를 자동으로 중심에" -#: src/slic3r/GUI/GUI_Factories.cpp:940 src/slic3r/GUI/GUI_Factories.cpp:975 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 src/slic3r/GUI/GUI_Factories.cpp:1097 msgid "Split the selected object into individual parts" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4552 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 src/slic3r/GUI/GUI_Factories.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:4718 msgid "Split" msgstr "분할" -#: src/slic3r/GUI/GUI_Factories.cpp:944 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 msgid "Split the selected object" msgstr "선택한 개체 분할" -#: src/slic3r/GUI/GUI_Factories.cpp:1084 +#: src/slic3r/GUI/GUI_Factories.cpp:1225 src/slic3r/GUI/GUI_Factories.cpp:1243 +msgid "Set number of instances" +msgstr "인스턴스 수 설정" + +#: src/slic3r/GUI/GUI_Factories.cpp:1225 +msgid "Change the number of instances of the selected objects" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1237 msgid "Add one more instance of the selected object" msgstr "선택한 개체의 인스턴스 를 하나 더 추가합니다." -#: src/slic3r/GUI/GUI_Factories.cpp:1087 +#: src/slic3r/GUI/GUI_Factories.cpp:1240 msgid "Remove one instance of the selected object" msgstr "선택한 개체의 인스턴스 하나 제거" -#: src/slic3r/GUI/GUI_Factories.cpp:1090 -msgid "Set number of instances" -msgstr "인스턴스 수 설정" - -#: src/slic3r/GUI/GUI_Factories.cpp:1090 +#: src/slic3r/GUI/GUI_Factories.cpp:1243 msgid "Change the number of instances of the selected object" msgstr "선택한 개체의 인스턴스 수 변경" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill bed with instances" msgstr "인스턴스로 침대 채우기" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill the remaining area of bed with instances of the selected object" msgstr "선택한 개체의 인스턴스로 나머지 침대 영역 채우기" @@ -4100,290 +5358,338 @@ msgstr "레이어 범위 제거" msgid "Add layer range" msgstr "레이어 범위 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:297 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:323 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 msgid "Name" msgstr "이름" -#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:480 +#: src/slic3r/GUI/GUI_ObjectList.cpp:342 src/slic3r/GUI/GUI_ObjectList.cpp:513 msgid "Editing" msgstr "편집" -#: src/slic3r/GUI/GUI_ObjectList.cpp:400 +#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +msgid "Wrong volume index " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:433 msgid "No errors detected" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:409 +#: src/slic3r/GUI/GUI_ObjectList.cpp:442 #, c-format, boost-format msgid "Auto-repaired %1$d error" msgid_plural "Auto-repaired %1$d errors" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:415 +#: src/slic3r/GUI/GUI_ObjectList.cpp:448 #, c-format, boost-format msgid "%1$d degenerate facet" msgid_plural "%1$d degenerate facets" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:450 #, c-format, boost-format msgid "%1$d edge fixed" msgid_plural "%1$d edges fixed" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:452 #, c-format, boost-format msgid "%1$d facet removed" msgid_plural "%1$d facets removed" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:421 +#: src/slic3r/GUI/GUI_ObjectList.cpp:454 #, c-format, boost-format msgid "%1$d facet reversed" msgid_plural "%1$d facets reversed" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +#: src/slic3r/GUI/GUI_ObjectList.cpp:456 #, c-format, boost-format msgid "%1$d backward edge" msgid_plural "%1$d backward edges" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:426 src/slic3r/GUI/GUI_ObjectList.cpp:429 +#: src/slic3r/GUI/GUI_ObjectList.cpp:459 src/slic3r/GUI/GUI_ObjectList.cpp:462 #, c-format, boost-format msgid "%1$d open edge" msgid_plural "%1$d open edges" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:428 +#: src/slic3r/GUI/GUI_ObjectList.cpp:461 msgid "Remaining errors" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:436 +#: src/slic3r/GUI/GUI_ObjectList.cpp:469 msgid "Right button click the icon to fix STL through Netfabb" msgstr "아이콘을 클릭 하여 Netfabb에서 STL을 수정 합니다" -#: src/slic3r/GUI/GUI_ObjectList.cpp:482 +#: src/slic3r/GUI/GUI_ObjectList.cpp:515 msgid "Right button click the icon to change the object settings" msgstr "아이콘을 클릭 하여 개체 설정을 변경 합니다" -#: src/slic3r/GUI/GUI_ObjectList.cpp:484 +#: src/slic3r/GUI/GUI_ObjectList.cpp:517 msgid "Click the icon to change the object settings" msgstr "아이콘을 클릭 하여 개체 설정을 변경 합니다" -#: src/slic3r/GUI/GUI_ObjectList.cpp:488 +#: src/slic3r/GUI/GUI_ObjectList.cpp:521 msgid "Right button click the icon to change the object printable property" msgstr "오른쪽 버튼이 아이콘을 클릭하여 인쇄 가능한 개체 속성을 변경합니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:523 msgid "Click the icon to change the object printable property" msgstr "아이콘을 클릭하여 인쇄 가능한 개체 속성을 변경합니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:616 +#: src/slic3r/GUI/GUI_ObjectList.cpp:649 msgid "Change Extruder" msgstr "압출기(익스트루더) 변경" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Object" msgstr "개체 이름 바꾸기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Sub-object" msgstr "하위 개체 이름 바꾸기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1242 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4006 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1307 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4589 msgid "Instances to Separated Objects" msgstr "분리된 개체에 대한 인스턴스" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Volumes in Object reordered" msgstr "개체의 볼륨 이 다시 정렬" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Object reordered" msgstr "개체 재정렬" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1298 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1363 msgid "Add Settings for Layers" msgstr "레이어 설정 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1299 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1364 msgid "Add Settings for Sub-object" msgstr "하위 객체에 대한 설정 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1300 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1365 msgid "Add Settings for Object" msgstr "객체에 대한 설정 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1339 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1404 msgid "Add Settings Bundle for Height range" msgstr "높이 범위에 대한 설정 번들 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1340 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1405 msgid "Add Settings Bundle for Sub-object" msgstr "하위 오브젝트에 대한 번들 설정을 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1341 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1406 msgid "Add Settings Bundle for Object" msgstr "개체에 대한 번들 설정을 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Part" msgstr "부품을 불러 오기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1509 src/slic3r/GUI/Plater.cpp:2380 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1582 src/slic3r/GUI/Plater.cpp:2453 msgid "Loading" msgstr "로딩중" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1540 src/slic3r/GUI/Plater.cpp:2417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1617 src/slic3r/GUI/Plater.cpp:2494 msgid "Loading file" msgstr "파일 로드" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1548 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1625 msgid "Error!" msgstr "오류!" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1638 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1721 msgid "Add Generic Subobject" msgstr "기본이 되는 하위 개체 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1663 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1761 msgid "Generic" msgstr "일반" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shape from Gallery" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shapes from Gallery" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1830 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1945 msgid "Remove paint-on supports" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1837 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 msgid "Remove paint-on seam" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1844 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 msgid "Remove Multi Material painting" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1850 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1972 msgid "Shift objects to bed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1856 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1978 msgid "Remove variable layer height" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1877 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1999 msgid "Delete Settings" msgstr "설정 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1901 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2023 msgid "Delete All Instances from Object" msgstr "개체에서 모든 인스턴스 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1917 -msgid "Delete Height Range" -msgstr "높이 범위 삭제" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2039 +msgid "Delete Height Range" +msgstr "높이 범위 삭제" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2057 +msgid "Delete connector from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2058 +msgid "Delete solid part from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2059 +msgid "Delete negative volume from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2061 +msgid "" +"To save cut information you can delete all connectors from all related " +"objects." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2064 +msgid "" +"This action will break a cut information.\n" +"After that PrusaSlicer can't guarantee model consistency.\n" +"\n" +"To manipulate with solid parts or negative volumes you have to invalidate " +"cut infornation first." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2072 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2612 +msgid "Delete all connectors" +msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1949 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2103 msgid "From Object List You can't delete the last solid part from object." msgstr "객체 리스트에서 마지막 부품을 삭제할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1953 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2112 msgid "Delete Subobject" msgstr "하위 개체 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1976 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2138 msgid "Last instance of an object cannot be deleted." msgstr "개체의 마지막 인스턴스를 삭제할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1980 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +msgid "Instance cannot be deleted from cut object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2146 msgid "Delete Instance" msgstr "인스턴스 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2004 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2170 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "선택한 객체는 부품 하나만 포함되어 있기 때문에 분할 할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2008 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2174 msgid "Split to Parts" msgstr "부품(Part)으로 분할" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2177 src/slic3r/GUI/Plater.cpp:3133 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"splitting the object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2297 msgid "Merged" msgstr "Merge됨" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2237 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2392 msgid "Merge all parts to the one single object" msgstr "모든 부품을 하나의 단일 오브젝트로 병합" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2269 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2424 msgid "Add Layers" msgstr "레이어 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2438 -msgid "Group manipulation" -msgstr "그룹 조작" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2695 +msgid "Cut Connectors information" +msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2453 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2705 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2768 msgid "Object manipulation" msgstr "개체 조작" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2486 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2714 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1472 +msgid "Group manipulation" +msgstr "그룹 조작" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2802 msgid "Object Settings to modify" msgstr "수정할 개체 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2806 msgid "Part Settings to modify" msgstr "수정할 부품 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2495 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2811 msgid "Layer range Settings to modify" msgstr "수정할 레이어 범위 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2501 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2817 msgid "Part manipulation" msgstr "부품 조작" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2825 msgid "Instance manipulation" msgstr "인스턴스 조작" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Height ranges" msgstr "높이 범위" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Settings for height range" msgstr "높이 범위설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2750 -msgid "Delete Selected Item" -msgstr "선택한 항목(item) 삭제" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2943 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3363 msgid "Delete Selected" msgstr "선택된 것을 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3019 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3047 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3067 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3441 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3469 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3489 msgid "Add Height Range" msgstr "높이 범위 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3113 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3535 msgid "" "Cannot insert a new layer range after the current layer range.\n" "The next layer range is too thin to be split to two\n" @@ -4393,7 +5699,7 @@ msgstr "" "다음 레이어 범위가 너무 얇아서 두 개로 나눌 수 없습니다.\n" "최소 레이어 높이를 위반하지 않습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3117 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3539 msgid "" "Cannot insert a new layer range between the current and the next layer " "range.\n" @@ -4404,7 +5710,7 @@ msgstr "" "현재 레이어 범위와 다음 레이어 범위 사이의 간격\n" "허용되는 최소 레이어 높이보다 얇습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3122 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3544 msgid "" "Cannot insert a new layer range after the current layer range.\n" "Current layer range overlaps with the next layer range." @@ -4412,233 +5718,282 @@ msgstr "" "현재 레이어 범위 이후에새 레이어 범위를 삽입할 수 없습니다.\n" "현재 레이어 범위는 다음 레이어 범위와 겹칩니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3603 msgid "Edit Height Range" msgstr "높이 범위 편집" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3500 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3989 msgid "Selection-Remove from list" msgstr "선택 선택 목록에서 제거" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4001 msgid "Selection-Add from list" msgstr "목록에서 선택 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3649 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4138 msgid "Object or Instance" msgstr "개체 또는 인스턴스" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Part" -msgstr "부품" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 msgid "Layer" msgstr "레이어" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3652 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4141 msgid "Unsupported selection" msgstr "지원되지 않는 선택" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3653 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 #, c-format, boost-format msgid "You started your selection with %s Item." msgstr "%s 선택된 항목으로 시작합니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3654 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4143 #, c-format, boost-format msgid "In this mode you can select only other %s Items%s" msgstr "이 모드에서는 %s의 다른 %s 항목만 선택할 수 있습니다" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3657 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4146 msgid "of a current Object" msgstr "현재 개체의" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3662 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3737 src/slic3r/GUI/Plater.cpp:181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4151 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4226 src/slic3r/GUI/Plater.cpp:197 msgid "Info" msgstr "정보" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3784 -msgid "You can't change a type of the last solid part of the object." -msgstr "객체(object)의 마지막 부품(Part) 유형은 변경할 수 없습니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 msgid "Negative Volume" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Modifier" -msgstr "편집" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Blocker" msgstr "서포트 금지영역" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Enforcer" msgstr "서포트 지원영역" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Select type of part" msgstr "부품 유형 선택" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3795 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4359 msgid "Change Part Type" msgstr "부품 유형 변경" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Enter new name" msgstr "새 이름 입력" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Renaming" msgstr "이름 바꾸기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4091 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4681 msgid "Repairing model" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4120 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4691 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"repairing the mesh." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4711 msgid "Fix through NetFabb" msgstr "NetFabb을 통해 수정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4123 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4714 msgid "Fixing through NetFabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4153 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4744 msgid "The following model was repaired successfully" msgid_plural "The following models were repaired successfully" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4159 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4750 msgid "Folowing model repair failed" msgid_plural "Folowing models repair failed" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4164 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4755 msgid "Repairing was canceled" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4276 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4869 msgid "Change Extruders" msgstr "압출기 변경" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Printable group" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Unprintable group" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Printable" msgstr "인쇄 가능 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Unprintable" msgstr "인쇄할 수 없는 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Printable Instance" msgstr "인쇄 가능한 인스턴스 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Unprintable Instance" msgstr "인쇄할 수 없는 인스턴스 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:55 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:84 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:61 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:96 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1132 msgid "World coordinates" msgstr "절대 좌표" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:56 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:85 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:97 msgid "Local coordinates" msgstr "상대 좌표" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:60 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:67 msgid "Select coordinate space, in which the transformation will be performed." msgstr "변환이 수행될 좌표 공간을 선택 합니다." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:141 src/libslic3r/GCode.cpp:540 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:157 src/libslic3r/GCode.cpp:491 msgid "Object name" msgstr "개체 이름" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:201 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:521 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:221 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:710 msgid "Position" msgstr "위치" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:202 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:522 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:222 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:711 #: src/slic3r/GUI/Mouse3DController.cpp:478 #: src/slic3r/GUI/Mouse3DController.cpp:499 msgid "Rotation" msgstr "회전" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:250 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:239 +msgid "Size [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "Mirror along" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +#, c-format, boost-format +msgid " %c " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "axis" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:279 #, c-format, boost-format msgid "Toggle %c axis mirroring" msgstr "축 미러링 %c 토글" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:284 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:329 msgid "Set Mirror" msgstr "미러 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:324 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:336 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:348 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:374 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:387 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:393 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:401 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:428 msgid "Drop to bed" msgstr "배드를 아래로 내리기" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:445 msgid "Reset rotation" msgstr "회전 재설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 msgid "Reset Rotation" msgstr "회전 재설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:398 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:400 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:490 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:519 msgid "Reset scale" msgstr "크기 재설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:539 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546 +msgid "Reset skew" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:553 msgid "Inches" msgstr "인치" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:523 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:712 msgid "Scale factors" msgstr "확대와 축소" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:577 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:740 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:752 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:793 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:801 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +msgid "Rotate (relative)" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:751 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:800 +msgid "Translate (relative) [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:829 msgid "Translate" msgstr "번역" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:640 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:905 msgid "" "You cannot use non-uniform scaling mode for multiple objects/parts selection" msgstr "" "여러 개체/부품 선택에 대해 균일하지 않은 크기 조정 모드를 사용할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:820 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +msgid "Left handed" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1133 +msgid "Object coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1134 +msgid "Part coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1176 msgid "Set Position" msgstr "위치 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:852 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1220 msgid "Set Orientation" msgstr "방향 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:931 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1351 msgid "Set Scale" msgstr "스케일 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1368 +msgid "Set Size" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1427 msgid "" "The currently manipulated object is tilted (rotation angles are not " "multiples of 90°).\n" @@ -4650,7 +6005,7 @@ msgstr "" "님).\n" "기울어진 객체(object)의 배율 조정은 기본 좌표에서만 가능 합니다." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:983 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1430 msgid "" "This operation is irreversible.\n" "Do you want to proceed?" @@ -4676,168 +6031,67 @@ msgstr "삭제 %s 옵션" msgid "Change Option %s" msgstr "변경 옵션 %s" -#: src/slic3r/GUI/GUI_Preview.cpp:211 -msgid "View" -msgstr "보기" - -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/libslic3r/PrintConfig.cpp:808 -msgid "Height" -msgstr "높이" - -#: src/slic3r/GUI/GUI_Preview.cpp:219 src/libslic3r/PrintConfig.cpp:3032 -msgid "Width" -msgstr "넓이" - -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2016 -msgid "Fan speed" -msgstr "팬 속도" - -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1991 -msgid "Temperature" -msgstr "온도" - -#: src/slic3r/GUI/GUI_Preview.cpp:223 -msgid "Volumetric flow rate" -msgstr "용적의 유량값" - -#: src/slic3r/GUI/GUI_Preview.cpp:228 -msgid "Show" -msgstr "보이기" - -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/GUI_Preview.cpp:254 -msgid "Feature types" -msgstr "특색 유형" - -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:330 -#: src/libslic3r/ExtrusionEntity.cpp:352 -msgid "Perimeter" -msgstr "둘레" - -#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:331 -#: src/libslic3r/ExtrusionEntity.cpp:354 -msgid "External perimeter" -msgstr "외부 가장자리" - -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:332 -#: src/libslic3r/ExtrusionEntity.cpp:356 -msgid "Overhang perimeter" -msgstr "오버행(Overhang) 둘레" - -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:333 -#: src/libslic3r/ExtrusionEntity.cpp:358 -msgid "Internal infill" -msgstr "내부 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:334 -#: src/libslic3r/ExtrusionEntity.cpp:360 src/libslic3r/PrintConfig.cpp:1407 -#: src/libslic3r/PrintConfig.cpp:2392 src/libslic3r/PrintConfig.cpp:2404 -msgid "Solid infill" -msgstr "솔리드 인필" - -#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:335 -#: src/libslic3r/ExtrusionEntity.cpp:362 src/libslic3r/PrintConfig.cpp:1416 -#: src/libslic3r/PrintConfig.cpp:2889 src/libslic3r/PrintConfig.cpp:2902 -msgid "Top solid infill" -msgstr "가장 윗부분 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:337 -#: src/libslic3r/ExtrusionEntity.cpp:366 -msgid "Bridge infill" -msgstr "브릿지 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:338 -#: src/libslic3r/ExtrusionEntity.cpp:368 src/libslic3r/PrintConfig.cpp:1325 -msgid "Gap fill" -msgstr "공백 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:248 src/libslic3r/ExtrusionEntity.cpp:339 -#: src/libslic3r/ExtrusionEntity.cpp:370 -msgid "Skirt/Brim" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:250 src/libslic3r/ExtrusionEntity.cpp:341 -#: src/libslic3r/ExtrusionEntity.cpp:374 src/libslic3r/PrintConfig.cpp:2736 -msgid "Support material interface" -msgstr "서포트 인터페이스" - -#: src/slic3r/GUI/GUI_Preview.cpp:251 src/slic3r/GUI/Tab.cpp:1634 -#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/ExtrusionEntity.cpp:376 -msgid "Wipe tower" -msgstr "와이프 타워 - 버려진 필라멘트 조절" - -#: src/slic3r/GUI/GUI_Preview.cpp:728 +#: src/slic3r/GUI/GUI_Preview.cpp:581 msgid "NOTE:" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:729 +#: src/slic3r/GUI/GUI_Preview.cpp:582 #, boost-format msgid "Sliced object \"%1%\" looks like a logo or a sign" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:730 +#: src/slic3r/GUI/GUI_Preview.cpp:583 msgid "Apply color change automatically" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:1058 -msgid "Shells" -msgstr "쉘(Shells)" - -#: src/slic3r/GUI/GUI_Preview.cpp:1059 -msgid "Tool marker" -msgstr "공구 마커" - -#: src/slic3r/GUI/GUI_Preview.cpp:1060 -msgid "Legend/Estimated printing time" -msgstr "범례/예상 인쇄 시간" - -#: src/slic3r/GUI/HintNotification.cpp:771 -#: src/slic3r/GUI/HintNotification.cpp:797 -#: src/slic3r/GUI/NotificationManager.cpp:374 -#: src/slic3r/GUI/NotificationManager.cpp:391 +#: src/slic3r/GUI/HintNotification.cpp:773 +#: src/slic3r/GUI/HintNotification.cpp:799 +#: src/slic3r/GUI/NotificationManager.cpp:457 +#: src/slic3r/GUI/NotificationManager.cpp:474 msgid "More" msgstr "더 보기" -#: src/slic3r/GUI/HintNotification.cpp:912 +#: src/slic3r/GUI/HintNotification.cpp:914 msgid "Open Preferences." msgstr "" -#: src/slic3r/GUI/HintNotification.cpp:1004 +#: src/slic3r/GUI/HintNotification.cpp:1006 msgid "Open Documentation in web browser." msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:527 +#: src/slic3r/GUI/ImGuiWrapper.cpp:666 msgid "Edit" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:960 src/slic3r/GUI/Search.cpp:470 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1166 src/slic3r/GUI/Search.cpp:531 msgid "Use for search" msgstr "검색에 사용" -#: src/slic3r/GUI/ImGuiWrapper.cpp:961 src/slic3r/GUI/Search.cpp:463 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1167 src/slic3r/GUI/Search.cpp:524 msgid "Category" msgstr "카테고리" -#: src/slic3r/GUI/ImGuiWrapper.cpp:963 src/slic3r/GUI/Search.cpp:465 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1169 src/slic3r/GUI/Search.cpp:526 msgid "Search in English" msgstr "영어로 검색" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:174 -msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "모델 객체를 정렬 할 수 없습니다! 일부 형상이 잘못되었을 수 있습니다." - -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:183 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:168 msgid "Arranging" msgstr "정렬" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:207 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:204 msgid "Arranging canceled." msgstr "정렬이 취소되었습니다." -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:208 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:205 msgid "Arranging done." msgstr "정리 완료." -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:253 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:225 +msgid "Could not arrange model objects! Some geometries may be invalid." +msgstr "모델 객체를 정렬 할 수 없습니다! 일부 형상이 잘못되었을 수 있습니다." + +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:265 #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -4845,39 +6099,82 @@ msgid "" "%s" msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:119 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:108 msgid "Filling bed" msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:130 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:140 msgid "Bed filling canceled." msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:131 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:141 msgid "Bed filling done." msgstr "" -#: src/slic3r/GUI/Jobs/Job.cpp:111 -msgid "ERROR: not enough resources to execute a new job." -msgstr "오류: 새 작업을 실행하기에 충분한 리소스가 없습니다." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:148 src/slic3r/GUI/Jobs/EmbossJob.cpp:596 +msgid "Can't create empty volume." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:201 +msgid "Can't create empty object." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:208 +msgid "Add Emboss text object" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:247 +msgid "Created text volume is empty. Change text or font." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:465 +msgid "" +"It is used default volume for embossed text, try to change text or font to " +"fix it." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:549 +#, boost-format +msgid "Text: %1%" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:593 +msgid "Bad object to create volume." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:598 +msgid "Add Emboss text Volume" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:698 +msgid "Font doesn't have any shape for given text." +msgstr "" -#: src/slic3r/GUI/Jobs/PlaterJob.cpp:13 -msgid "An unexpected error occured" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:738 +msgid "There is no volume in projection direction." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:21 +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:787 +msgid "There is no valid surface for text projection." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:823 +msgid "Issue during embossing the text." +msgstr "" + +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:22 msgid "Best surface quality" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:23 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 msgid "Optimize object rotation for best surface quality." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:25 msgid "Reduced overhang slopes" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:26 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:27 msgid "" "Optimize object rotation to have minimum amount of overhangs needing support " "structures.\n" @@ -4885,241 +6182,221 @@ msgid "" "touching the print bed if no elevation is set." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:30 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:31 msgid "Lowest Z height" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:32 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:33 msgid "Rotate the model to have the lowest z height for faster print time." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:59 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:53 msgid "Searching for optimal orientation" msgstr "최적의 방향 검색" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:77 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:83 msgid "Orientation search canceled." msgstr "방향 검색이 취소되었습니다." -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:78 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:84 msgid "Orientation found." msgstr "방향을 찾습니다." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:36 -msgid "Choose SLA archive:" -msgstr "SLA 아카이브를 선택합니다." - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:40 -msgid "Import file" -msgstr "파일 가져오기" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47 -msgid "Import model and profile" -msgstr "모델 가져오기 및 프로파일" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48 -msgid "Import profile only" -msgstr "프로필 가져오기만" - #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:49 -msgid "Import model only" -msgstr "가져오기 모델만" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60 -msgid "Accurate" -msgstr "정확한" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61 -msgid "Balanced" -msgstr "잔고 일치" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:62 -msgid "Quick" -msgstr "빨리" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:140 msgid "Importing SLA archive" msgstr "SLA 아카이브 가져오기" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:158 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:77 msgid "" "The SLA archive doesn't contain any presets. Please activate some SLA " "printer preset first before importing that SLA archive." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:164 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:81 +msgid "Import is unavailable for this archive format." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:86 msgid "Importing canceled." msgstr "가져오기가 취소되었습니다." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:165 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:87 msgid "Importing done." msgstr "가져오기 완료." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:187 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:108 msgid "The file does not exist." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:221 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135 msgid "" "The imported SLA archive did not contain any presets. The current SLA " "presets were used as fallback." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:234 src/slic3r/GUI/Plater.cpp:2458 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:148 src/slic3r/GUI/Plater.cpp:2535 msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "침대에 다중 부품 오브젝트가 있는 SLA 프로젝트를 로드할 수 없습니다." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:236 src/slic3r/GUI/Plater.cpp:2460 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:150 src/slic3r/GUI/Plater.cpp:2537 msgid "Attention!" msgstr "주의!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:166 +msgid "The profile in the imported archive is corrupt and will not be loaded." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:178 +msgid "" +"No object could be retrieved from the archive. The slices might be corrupted " +"or missing." +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1184 msgid "Keyboard Shortcuts" msgstr "키보드 단축키" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:77 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:86 msgid "New project, clear plater" msgstr "새로운 프로젝트, 클리어 플래터" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:78 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 msgid "Open project AMF/3MF with config, clear plater" msgstr "오픈 프로젝트 AMF/3MF 와 구성, 클리어 플래터" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 msgid "Save project (3mf)" msgstr "프로젝트 저장(3mf)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 msgid "Save project as (3mf)" msgstr "프로젝트 저장 (3mf)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:81 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 msgid "(Re)slice" msgstr "(Re)슬라이스" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:83 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:92 msgid "Import STL/3MF/STEP/OBJ/AMF without config, keep plater" msgstr "구성없이 STL / 3MF / STEP / OBJ / AMF를 가져 오기, 플래터 유지" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:84 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 msgid "Import Config from ini/amf/3mf/gcode" msgstr "ini/amf/3mf/gcode에서 컨피그로 가져오기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:85 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "ini/amf/3mf/gcode에서 구성을 로드하고 병합" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6543 src/libslic3r/PrintConfig.cpp:4423 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:96 src/slic3r/GUI/Plater.cpp:948 +#: src/slic3r/GUI/Plater.cpp:7161 src/libslic3r/PrintConfig.cpp:4575 msgid "Export G-code" msgstr "G코드 내보내기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:97 src/slic3r/GUI/Plater.cpp:7162 msgid "Send G-code" msgstr "G-code 보내기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 msgid "Export config" msgstr "&구성 내보내기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 src/slic3r/GUI/Plater.cpp:896 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 src/slic3r/GUI/Plater.cpp:931 msgid "Export to SD card / Flash drive" msgstr "SD카드/플래시 드라이브로 내보내기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:91 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 msgid "Eject SD card / Flash drive" msgstr "SD카드/ 플래시 드라이브 분리" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 msgid "Select all objects" msgstr "모든 개체 선택" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 msgid "Deselect all" msgstr "전체 선택 취소" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:95 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 msgid "Delete selected" msgstr "선택 삭제" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 -msgid "Copy to clipboard" -msgstr "클립보드로 복사" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 msgid "Paste from clipboard" msgstr "클립보드에서 붙여넣기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Reload plater from disk" msgstr "디스크에서 플래터 재로드" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 msgid "Select Plater Tab" msgstr "선택 및 플래이터 탭" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 msgid "Select Print Settings Tab" msgstr "인쇄 설정을 선택 합니다" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 msgid "Select Filament Settings Tab" msgstr "필라멘트 설정을 선택" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 msgid "Select Printer Settings Tab" msgstr "프린터 설정을 선택 합니다" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 msgid "Switch to 3D" msgstr "3D로 전환" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 msgid "Switch to Preview" msgstr "미리 보기로 전환" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 -#: src/slic3r/GUI/PrintHostDialogs.cpp:217 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +#: src/slic3r/GUI/PrintHostDialogs.cpp:267 msgid "Print host upload queue" msgstr "프린터 호스트 업로드 대기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/MainFrame.cpp:75 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 src/slic3r/GUI/MainFrame.cpp:77 msgid "Open new instance" msgstr "새 인스턴스 열기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 msgid "Camera view" msgstr "카메라 보기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 msgid "Show/Hide object/instance labels" msgstr "객체/인스턴스 레이블 표시/숨기기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Preferences.cpp:46 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Preferences.cpp:57 +#: src/slic3r/GUI/Preferences.cpp:165 src/slic3r/GUI/Preferences.cpp:188 +#: src/slic3r/GUI/Preferences.cpp:207 src/slic3r/GUI/Preferences.cpp:215 msgid "Preferences" msgstr "기본 설정" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 msgid "Show keyboard shortcuts list" msgstr "단축 키 목록 표시" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 msgid "Commands" msgstr "명령어" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 msgid "Add Instance of the selected object" msgstr "선택한 개체의 인스턴스 추가" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Remove Instance of the selected object" msgstr "선택한 개체의 인스턴스 제거" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 msgid "" "Press to select multiple objects\n" "or move multiple objects with mouse" @@ -5127,140 +6404,144 @@ msgstr "" "클릭하여 여러 개체를 선택합니다.\n" "또는 마우스로 여러 개체를 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 msgid "Press to activate selection rectangle" msgstr "선택 사각형을 활성화하려면 누릅니다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 msgid "Press to activate deselection rectangle" msgstr "이동을 눌러 선택 해제 사각형을 활성화합니다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Arrow Up" msgstr "화살표 위" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 msgid "Move selection 10 mm in positive Y direction" msgstr "선택 영역 10mm를 양수 Y 방향으로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Arrow Down" msgstr "화살표 다운" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 msgid "Move selection 10 mm in negative Y direction" msgstr "선택 영역 10mm를 음수 Y 방향으로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Arrow Left" msgstr "화살표 왼쪽" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 msgid "Move selection 10 mm in negative X direction" msgstr "선택 영역 10mm를 음수 X 방향으로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Arrow Right" msgstr "화살표 오른쪽" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 msgid "Move selection 10 mm in positive X direction" msgstr "선택 영역 10mm를 양수 X 방향으로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Any arrow" msgstr "모든 화살표" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 msgid "Movement step set to 1 mm" msgstr "1mm로 설정된 무브먼트 스텝" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Movement in camera space" msgstr "카메라 공간에서의 움직임" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Page Up" msgstr "Page Up" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Rotate selection 45 degrees CCW" msgstr "회전 선택 45도 CCW" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Page Down" msgstr "Page Down 키" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Rotate selection 45 degrees CW" msgstr "회전 선택 45도 CW" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 msgid "Gizmo move" msgstr "개체(Gizmo) 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 msgid "Gizmo scale" msgstr "개체(Gizmo) 배율" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Gizmo rotate" msgstr "개체(Gizmo) 회전" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Gizmo cut" msgstr "개체(Gizmo) 자르기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 msgid "Gizmo Place face on bed" msgstr "개체(Gizmo)를 배드위로" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 msgid "Gizmo SLA hollow" msgstr "기즈모 SLA 중공" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 msgid "Gizmo SLA support points" msgstr "SLA 개체(Gizmo) 서포트 지점들" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 msgid "Gizmo FDM paint-on supports" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 msgid "Gizmo FDM paint-on seam" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 msgid "Gizmo Multi Material painting" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +msgid "Gizmo Text emboss / engrave" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 msgid "Unselect gizmo or clear selection" msgstr "기즈모 선택 취소 또는 명확한 선택" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 msgid "Change camera type (perspective, orthographic)" msgstr "카메라 유형 변경(원근, 직교)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 msgid "Zoom to Bed" msgstr "배드 확대" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 msgid "" "Zoom to selected object\n" "or all objects in scene, if none selected" @@ -5268,172 +6549,172 @@ msgstr "" "선택한 개체로 확대/축소\n" "또는 장면의 모든 오브젝트가 선택되지 않은 경우" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 msgid "Zoom in" msgstr "확대" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Zoom out" msgstr "축소" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Switch between Editor/Preview" msgstr "편집기/미리 보기 간 전환" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Collapse/Expand the sidebar" msgstr "측면 표시줄 축소/확장" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled" msgstr "3Dconnexion 장치 설정 대화 상자 표시/숨기기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "3Dconnexion 장치 설정 대화 상자 표시/숨기기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 msgid "Minimize application" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 src/slic3r/GUI/MainFrame.cpp:284 -#: src/slic3r/GUI/MainFrame.cpp:333 src/slic3r/GUI/MainFrame.cpp:445 -#: src/slic3r/GUI/MainFrame.cpp:448 src/slic3r/GUI/MainFrame.cpp:470 -#: src/slic3r/GUI/MainFrame.cpp:473 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 src/slic3r/GUI/MainFrame.cpp:329 +#: src/slic3r/GUI/MainFrame.cpp:378 src/slic3r/GUI/MainFrame.cpp:490 +#: src/slic3r/GUI/MainFrame.cpp:493 src/slic3r/GUI/MainFrame.cpp:515 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Plater" msgstr "플레이트" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button" msgstr "모든 기즈모 : 회전 - 왼쪽 마우스 버튼; 팬 - 오른쪽 마우스 버튼" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 msgid "Gizmo move: Press to snap by 1mm" msgstr "기즈모 이동 : 1mm로 스냅 으로 눌러" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 msgid "Gizmo scale: Press to snap by 5%" msgstr "기즈모 스케일: 5% 스냅으로 누릅니다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 msgid "Gizmo scale: Scale selection to fit print volume" msgstr "기즈모 스케일: 인쇄 볼륨에 맞게 스케일 선택" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 msgid "Gizmo scale: Press to activate one direction scaling" msgstr "기즈모 스케일: 눌러 한 방향 배율을 활성화합니다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 msgid "Gizmo scale: Press to scale selected objects around their own center" msgstr "" "Gizmo 스케일: 자신의 중심 을 중심으로 선택한 개체의 크기를 조정하려면 누릅니" "다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 msgid "Gizmo rotate: Press to rotate selected objects around their own center" msgstr "기즈모 회전: 눌러 선택한 오브젝트를 자신의 중심 주위로 회전시다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "Gizmos" msgstr "Gizmos" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "" "The following shortcuts are applicable when the specified gizmo is active" msgstr "지정된 기즈모가 활성화된 경우 다음 바로 가기가 적용됩니다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 msgid "Set selected items as Printable/Unprintable" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:203 msgid "Set default extruder for the selected items" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 msgid "Set extruder number for the selected items" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 msgid "Objects List" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/MainFrame.cpp:1611 msgid "Open a G-code file" msgstr "G코드 파일 열기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 -#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 -#: src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 src/slic3r/GUI/MainFrame.cpp:1443 +#: src/slic3r/GUI/MainFrame.cpp:1447 src/slic3r/GUI/MainFrame.cpp:1616 +#: src/slic3r/GUI/MainFrame.cpp:1620 msgid "Reload the plater from disk" msgstr "디스크에서 플래터 다시 로드" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 msgid "Vertical slider - Move active thumb Up" msgstr "수직 슬라이더 - 활성 엄지 손가락을 위로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:228 msgid "Vertical slider - Move active thumb Down" msgstr "수직 슬라이더 - 활성 엄지 손가락을 아래로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 msgid "Horizontal slider - Move active thumb Left" msgstr "수평 슬라이더 - 활성 엄지 손가락 왼쪽으로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 msgid "Horizontal slider - Move active thumb Right" msgstr "수평 슬라이더 - 활성 엄지 손가락 오른쪽으로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:231 msgid "On/Off one layer mode of the vertical slider" msgstr "수직 슬라이더의 켜기/끄기 모드" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 -msgid "Show/Hide Legend and Estimated printing time" -msgstr "범례 표시/숨기기 및 예상 인쇄 시간" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:232 +msgid "Show/Hide legend" +msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 msgid "Show/Hide G-code window" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4480 -#: src/slic3r/GUI/Tab.cpp:2832 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 src/slic3r/GUI/Plater.cpp:4562 +#: src/slic3r/GUI/Tab.cpp:2736 msgid "Preview" msgstr "미리보기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 msgid "Move active thumb Up" msgstr "활성 엄지 손가락 위로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 msgid "Move active thumb Down" msgstr "활성 엄지 손가락 아래로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 msgid "Set upper thumb as active" msgstr "위 엄지 손가락을 활성으로 설정" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 msgid "Set lower thumb as active" msgstr "낮은 엄지 손가락을 활성으로 설정" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 msgid "Add color change marker for current layer" msgstr "현재 레이어의 색상을 변경할 마커 추가" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:238 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:244 msgid "Delete color change marker for current layer" msgstr "현재 레이어의 색상을 변경할 마커 삭제" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:250 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:251 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:245 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:256 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:257 msgid "" "Press to speed up 5 times while moving thumb\n" "with arrow keys or mouse wheel" @@ -5441,38 +6722,38 @@ msgstr "" "엄지 손가락을 이동하는 동안 5 배 속도를 눌러\n" "화살표 키 또는 마우스 휠" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "Vertical Slider" msgstr "세로 슬라이더" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "" "The following shortcuts are applicable in G-code preview when the vertical " "slider is active" msgstr "" "수직 슬라이더가 활성화된 G코드 미리 보기에는 다음 바로 가기가 적용됩니다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Move active thumb Left" msgstr "활성 엄지 손가락 왼쪽으로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Move active thumb Right" msgstr "활성 엄지 손가락 오른쪽으로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Set left thumb as active" msgstr "왼쪽 엄지 손가락을 활성으로 설정" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Set right thumb as active" msgstr "오른쪽 엄지 손가락을 활성으로 설정" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "Horizontal Slider" msgstr "수평 슬라이더" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "" "The following shortcuts are applicable in G-code preview when the horizontal " "slider is active" @@ -5480,232 +6761,232 @@ msgstr "" "수평 슬라이더가 활성화된 경우 다음 바로 가기는 G 코드 미리 보기에서 적용됩니" "다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:278 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:284 msgid "Keyboard shortcuts" msgstr "키보드 단축키" -#: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:77 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open a new PrusaSlicer instance" msgstr "새로운 프라사슬라이스인스턴스 열기" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:93 msgid "G-code preview" msgstr "G 코드 미리 보기" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:1388 msgid "Open G-code viewer" msgstr "G코드 뷰어 열기" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:91 src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open PrusaSlicer" msgstr "프라우슬라이서 오픈" -#: src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:93 msgid "Open new G-code viewer" msgstr "새로운 G코드 뷰어 열기" -#: src/slic3r/GUI/MainFrame.cpp:225 +#: src/slic3r/GUI/MainFrame.cpp:227 msgid "Closing PrusaSlicer. Current project is modified." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "PrusaSlicer is closing" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "Closing PrusaSlicer while some presets are modified." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:285 src/slic3r/GUI/MainFrame.cpp:335 -#: src/slic3r/GUI/Tab.hpp:427 src/slic3r/GUI/Tab.hpp:550 +#: src/slic3r/GUI/MainFrame.cpp:330 src/slic3r/GUI/MainFrame.cpp:380 +#: src/slic3r/GUI/Tab.hpp:413 src/slic3r/GUI/Tab.hpp:539 msgid "Print Settings" msgstr "출력 설정" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:535 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:384 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:520 msgid "Material Settings" msgstr "재질 설정" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:461 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:382 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:448 msgid "Filament Settings" msgstr "필라멘트 설정" -#: src/slic3r/GUI/MainFrame.cpp:287 src/slic3r/GUI/MainFrame.cpp:341 -#: src/slic3r/GUI/Tab.hpp:503 +#: src/slic3r/GUI/MainFrame.cpp:332 src/slic3r/GUI/MainFrame.cpp:386 +#: src/slic3r/GUI/Tab.hpp:488 msgid "Printer Settings" msgstr "프린터 설정" -#: src/slic3r/GUI/MainFrame.cpp:632 src/slic3r/GUI/Plater.cpp:1719 -#: src/slic3r/GUI/Plater.cpp:2850 +#: src/slic3r/GUI/MainFrame.cpp:685 src/slic3r/GUI/Plater.cpp:1728 +#: src/slic3r/GUI/Plater.cpp:2879 msgid "Untitled" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:655 +#: src/slic3r/GUI/MainFrame.cpp:710 msgid "based on Slic3r" msgstr "Slic3r 기반" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Prusa 3D &Drivers" msgstr "프라사 3D 및 드라이버" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Open the Prusa3D drivers download page in your browser" msgstr "브라우저에서 Prusa3D 드라이버 다운로드 페이지를 엽니다." -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Software &Releases" msgstr "소프트웨어 및 릴리스" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open the software releases page in your browser" msgstr "브라우저에서 소프트웨어 릴리스 페이지 열기" -#: src/slic3r/GUI/MainFrame.cpp:1081 +#: src/slic3r/GUI/MainFrame.cpp:1158 #, c-format, boost-format msgid "%s &Website" msgstr "%s 및 웹사이트" -#: src/slic3r/GUI/MainFrame.cpp:1082 +#: src/slic3r/GUI/MainFrame.cpp:1159 #, c-format, boost-format msgid "Open the %s website in your browser" msgstr "브라우저에서 %s 웹 사이트 열기" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "System &Info" msgstr "시스템 및 정보" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "Show system information" msgstr "시스템 정보 표시" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show &Configuration Folder" msgstr "폴더 표시 및 구성" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show user configuration folder (datadir)" msgstr "사용자 구성 폴더를 표시 (datadir)" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "Report an I&ssue" msgstr " 이슈내용 신고" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 #, c-format, boost-format msgid "Report an issue on %s" msgstr "%s 문제 보고" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 #, c-format, boost-format msgid "&About %s" msgstr "%s 정보" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 msgid "Show about dialog" msgstr "대화상자 표시" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1177 msgid "Show Tip of the Day" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1104 +#: src/slic3r/GUI/MainFrame.cpp:1181 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/MainFrame.cpp:1184 msgid "Show the list of the keyboard shortcuts" msgstr "키보드 단축키 목록 표시" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso" msgstr "ISO" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso View" msgstr "표준 보기" #. TRN To be shown in the main menu View->Top #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2917 -#: src/libslic3r/PrintConfig.cpp:2926 +#: src/slic3r/GUI/MainFrame.cpp:1202 src/libslic3r/PrintConfig.cpp:3005 +#: src/libslic3r/PrintConfig.cpp:3014 msgid "Top" msgstr "상단 " -#: src/slic3r/GUI/MainFrame.cpp:1125 +#: src/slic3r/GUI/MainFrame.cpp:1202 msgid "Top View" msgstr "위에서 보기 " #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:446 -#: src/libslic3r/PrintConfig.cpp:455 +#: src/slic3r/GUI/MainFrame.cpp:1205 src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:474 msgid "Bottom" msgstr "하단 " -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1205 msgid "Bottom View" msgstr "바닥 보기 " -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front" msgstr "앞 " -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front View" msgstr "앞면 보기 " -#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2274 +#: src/slic3r/GUI/MainFrame.cpp:1209 src/libslic3r/PrintConfig.cpp:2300 msgid "Rear" msgstr "뒷면 " -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1209 msgid "Rear View" msgstr "뒷면 보기 " -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left" msgstr "왼쪽" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left View" msgstr "왼쪽 보기 " -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right" msgstr "오른쪽" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right View" msgstr "오른쪽 보기 " -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "&New Project" msgstr "새로운 프로젝트" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "Start a new project" msgstr "새 프로젝트 시작" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "&Open Project" msgstr "&프로젝트 열기" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "Open a project file" msgstr "프로젝트 파일 열기" -#: src/slic3r/GUI/MainFrame.cpp:1157 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Recent projects" msgstr "최근 프로젝트" -#: src/slic3r/GUI/MainFrame.cpp:1169 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -5713,523 +6994,557 @@ msgstr "" "선택한 프로젝트를 더 이상 사용할 수 없습니다.\n" "최근 프로젝트 목록에서 제거하시겠습니까?" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Save Project" msgstr "프로젝트 저장" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "Save current project file" msgstr "현재 프로젝트 파일 저장" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save Project &as" msgstr "프로젝트 저장 및" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save current project file as" msgstr "현재 프로젝트 파일을 저장." -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Import STL/3MF/STEP/OBJ/AM&F" msgstr "STL/3MF/STEP/OBJ/AMF 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Load a model" msgstr "모델 로드" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Import STL (Imperial Units)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Load an model saved with imperial units" msgstr "제국 단위로 저장된 모델 로드" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Import SL1 / SL1S Archive" +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Import SLA Archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Load an SLA archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Import ZIP Achive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Load an SL1 / Sl1S archive" +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Load a zip achive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Import &Config" msgstr "&구성 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Load exported configuration file" msgstr "내 보낸 구성 파일로드" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Import Config from &Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Load configuration from project file" msgstr "프로젝트 파일에서 구성 부하" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Import Config &Bundle" msgstr "가져오기 구성 및 번들 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Load presets from a bundle" msgstr "미리 설정 번들값 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1231 +#: src/slic3r/GUI/MainFrame.cpp:1311 msgid "&Import" msgstr "&가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1314 src/slic3r/GUI/MainFrame.cpp:1676 msgid "Export &G-code" msgstr "내보내기 및 G 코드" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1314 msgid "Export current plate as G-code" msgstr "현재 플레이터를 G 코드로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1318 src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end G-code" msgstr "S&end G- 코드" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1318 msgid "Send to print current plate as G-code" msgstr "현재 플레이트를 G 코드로 인쇄하기 위해 보내기" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export G-code to SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "현재 플레이트를 G 코드로 SD 카드/플래시 드라이브로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export Plate as &STL" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export Plate as &STL/OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export current plate as STL" -msgstr "현재 플레이터를 STL로 내보내기" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export current plate as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export Plate as STL &Including Supports" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export Plate as STL/OBJ &Including Supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export current plate as STL including supports" -msgstr "서포트를 포함 하여 현재 플레이터를 STL로 내보내기" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export current plate as STL/OBJ including supports" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export &Toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export toolpaths as OBJ" msgstr "공구 경로를 OBJ로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export &Config" msgstr "&구성 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export current configuration to file" msgstr "현재 구성을 파일로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export Config &Bundle" msgstr "구성 및 번들 내보내기 " -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export all presets to file" msgstr "모든 이전 설정을 파일로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export Config Bundle With Physical Printers" msgstr "프린터 구성 번들 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export all presets including physical printers to file" msgstr "실제 프린터를 포함한 모든 사전 설정내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1270 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "&Export" msgstr "&내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Ejec&t SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "G 코드가 내보낸 후 SD 카드/플래시 드라이브를 배출합니다." -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Quick Slice" msgstr "빠른 슬라이스" -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Slice a file into a G-code" msgstr "파일을 G 코드로 분할" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Quick Slice and Save As" msgstr "빠른 슬라이스와 저장" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Slice a file into a G-code, save as" msgstr "파일을 G 코드로 분할하고 다른 이름으로 저장" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat Last Quick Slice" msgstr "마지막으로 빠른 슬라이스 반복" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat last quick slice" msgstr "마지막으로 빠른 슬라이스 반복" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "(Re)Slice No&w" msgstr "(Re)지금 슬라이스 " -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "Start new slicing process" msgstr "새로운 슬라이싱 작업 시작" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "&Repair STL file" msgstr "STL 파일 수리" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "Automatically repair an STL file" msgstr "STL 파일을 자동으로 복구합니다" -#: src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:1388 msgid "&G-code Preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1392 +msgid "E&xit" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1392 src/slic3r/GUI/UpdateDialogs.cpp:376 +#: src/slic3r/GUI/UpdateDialogs.cpp:423 +#, c-format, boost-format +msgid "Exit %s" +msgstr "%s Exit" + +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 msgid "&Quit" msgstr "종료" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 #, c-format, boost-format msgid "Quit %s" msgstr "종료 %s" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1410 msgid "&Select All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1327 +#: src/slic3r/GUI/MainFrame.cpp:1411 msgid "Selects all objects" msgstr "모든 개체를 선택 합니다" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1413 msgid "D&eselect All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1414 msgid "Deselects all objects" msgstr "모든 개체의 선택 취소" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1417 msgid "&Delete Selected" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1334 +#: src/slic3r/GUI/MainFrame.cpp:1418 msgid "Deletes the current selection" msgstr "현재 선택 영역을 삭제 합니다" -#: src/slic3r/GUI/MainFrame.cpp:1336 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Delete &All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1421 msgid "Deletes all objects" msgstr "모든 객체를 삭제 합니다" -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1425 msgid "&Undo" msgstr "되돌리기(&U)" -#: src/slic3r/GUI/MainFrame.cpp:1344 +#: src/slic3r/GUI/MainFrame.cpp:1428 msgid "&Redo" msgstr "&앞으로" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1433 msgid "&Copy" msgstr "복사(&C)" -#: src/slic3r/GUI/MainFrame.cpp:1350 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Copy selection to clipboard" msgstr "선택영역을 클립보드로 복사합니다" -#: src/slic3r/GUI/MainFrame.cpp:1352 +#: src/slic3r/GUI/MainFrame.cpp:1436 msgid "&Paste" msgstr "&붙여넣기" -#: src/slic3r/GUI/MainFrame.cpp:1353 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "Paste clipboard" msgstr "붙여 넣기 클립 보드" -#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 -#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 +#: src/slic3r/GUI/MainFrame.cpp:1442 src/slic3r/GUI/MainFrame.cpp:1446 +#: src/slic3r/GUI/MainFrame.cpp:1615 src/slic3r/GUI/MainFrame.cpp:1619 msgid "Re&load from Disk" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1368 +#: src/slic3r/GUI/MainFrame.cpp:1452 msgid "Searc&h" msgstr "검색" -#: src/slic3r/GUI/MainFrame.cpp:1369 +#: src/slic3r/GUI/MainFrame.cpp:1453 msgid "Search in settings" msgstr "설정 검색" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "&Plater Tab" msgstr "&선택 및 플래이터 탭" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "Show the plater" msgstr "플레이터를 보기" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "P&rint Settings Tab" msgstr "프린트 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "Show the print settings" msgstr "인쇄 설정 표시" -#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1469 src/slic3r/GUI/MainFrame.cpp:1679 msgid "&Filament Settings Tab" msgstr "&필라멘트 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1469 msgid "Show the filament settings" msgstr "필라멘트 설정보기" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Print&er Settings Tab" msgstr "인쇄 및 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Show the printer settings" msgstr "프린터 설정 표시" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "3&D" msgstr "3D" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "Show the 3D editing view" msgstr "3D 편집 보기 표시" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Pre&view" msgstr "사전 보기" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Show the 3D slices preview" msgstr "3D 슬라이스 미리 보기 표시" -#: src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/MainFrame.cpp:1488 msgid "Open the dialog to modify shape gallery" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Print &Host Upload Queue" msgstr "프린터 호스트 업로드 대기" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Display the Print Host Upload Queue window" msgstr "인쇄 호스트 업로드 대기열 창 표시" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open New Instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1424 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 +#: src/slic3r/GUI/MainFrame.cpp:1507 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1727 msgid "Compare Presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/MainFrame.cpp:1507 msgid "Compare presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show &Labels" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show object/instance labels in 3D scene" msgstr "3D 씬에서 개체/인스턴스 레이블 표시" -#: src/slic3r/GUI/MainFrame.cpp:1437 +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show Legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show legend in preview" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1523 msgid "&Collapse Sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1523 src/slic3r/GUI/Plater.cpp:2347 msgid "Collapse sidebar" msgstr "사이드바 축소" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "&Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1543 src/slic3r/GUI/MainFrame.cpp:1650 msgid "&File" msgstr "&파일" -#: src/slic3r/GUI/MainFrame.cpp:1458 +#: src/slic3r/GUI/MainFrame.cpp:1544 msgid "&Edit" msgstr "&수정" -#: src/slic3r/GUI/MainFrame.cpp:1459 +#: src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Window" msgstr "&윈도우" -#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 +#: src/slic3r/GUI/MainFrame.cpp:1546 src/slic3r/GUI/MainFrame.cpp:1651 msgid "&View" msgstr "보기(&V)" -#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 +#: src/slic3r/GUI/MainFrame.cpp:1549 src/slic3r/GUI/MainFrame.cpp:1654 msgid "&Help" msgstr "&도움" -#: src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/MainFrame.cpp:1611 msgid "&Open G-code" msgstr "G 코드 열기" -#: src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open &PrusaSlicer" msgstr "프라우슬라이서 오픈" -#: src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legend" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1676 msgid "E&xport" msgstr "보내기" -#: src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end to print" msgstr "끝내고 프린트" -#: src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1679 msgid "Mate&rial Settings Tab" msgstr "재료(메터리리알) 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:1613 +#: src/slic3r/GUI/MainFrame.cpp:1703 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "슬라이스 할 파일을 선택하십시오 (STL / OBJ / AMF / 3MF / PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1625 +#: src/slic3r/GUI/MainFrame.cpp:1715 msgid "No previously sliced file." msgstr "이전에 분리 된 파일이 없습니다." -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid "Previously sliced file (" msgstr "이전에 분리 된 파일 (" -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 #, fuzzy msgid ") not found." msgstr ")을 찾을 수 없습니다." -#: src/slic3r/GUI/MainFrame.cpp:1633 +#: src/slic3r/GUI/MainFrame.cpp:1723 msgid "File Not Found" msgstr "파일을 찾을 수 없음" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 #, c-format, boost-format msgid "Save %s file as:" msgstr "%s 파일을 저장 합니다:" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "SVG" msgstr "SVG 업로드 사용" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "G-code" msgstr "%1%로 내보낸 G 코드 파일" -#: src/slic3r/GUI/MainFrame.cpp:1680 +#: src/slic3r/GUI/MainFrame.cpp:1770 msgid "Save zip file as:" msgstr "압축(zip)파일 다른이름 저장:" -#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6064 src/slic3r/GUI/Tab.cpp:1666 -#: src/slic3r/GUI/Tab.cpp:4730 +#: src/slic3r/GUI/MainFrame.cpp:1779 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6654 src/slic3r/GUI/Tab.cpp:1628 +#: src/slic3r/GUI/Tab.cpp:4986 msgid "Slicing" msgstr "새로운 슬라이싱 작업 시작" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1691 +#: src/slic3r/GUI/MainFrame.cpp:1781 #, c-format, boost-format msgid "Processing %s" msgstr "처리 %s" -#: src/slic3r/GUI/MainFrame.cpp:1714 +#: src/slic3r/GUI/MainFrame.cpp:1804 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% 성공적으로 슬라이스되었습니다." -#: src/slic3r/GUI/MainFrame.cpp:1717 +#: src/slic3r/GUI/MainFrame.cpp:1807 msgid "Slicing Done!" msgstr "슬라이스 완료!" -#: src/slic3r/GUI/MainFrame.cpp:1733 +#: src/slic3r/GUI/MainFrame.cpp:1823 msgid "Select the STL file to repair:" msgstr "복구 할 STL 파일을 선택." -#: src/slic3r/GUI/MainFrame.cpp:1743 +#: src/slic3r/GUI/MainFrame.cpp:1833 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "OBJ 파일을 저장하십시오 (STL보다 오류를 덜 조정할 가능성이 적음)." -#: src/slic3r/GUI/MainFrame.cpp:1754 +#: src/slic3r/GUI/MainFrame.cpp:1844 msgid "Your file was repaired." msgstr "파일이 복구되었습니다." -#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4528 +#: src/slic3r/GUI/MainFrame.cpp:1844 src/libslic3r/PrintConfig.cpp:4694 msgid "Repair" msgstr "수정" -#: src/slic3r/GUI/MainFrame.cpp:1768 +#: src/slic3r/GUI/MainFrame.cpp:1858 msgid "Save configuration as:" msgstr "구성을 저장 :" -#: src/slic3r/GUI/MainFrame.cpp:1785 +#: src/slic3r/GUI/MainFrame.cpp:1875 msgid "Loading of a configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 +#: src/slic3r/GUI/MainFrame.cpp:1877 src/slic3r/GUI/MainFrame.cpp:1944 msgid "Select configuration to load:" msgstr "불러올 구성 선택 :" -#: src/slic3r/GUI/MainFrame.cpp:1816 +#: src/slic3r/GUI/MainFrame.cpp:1908 msgid "Exporting configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1817 +#: src/slic3r/GUI/MainFrame.cpp:1909 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1826 +#: src/slic3r/GUI/MainFrame.cpp:1918 msgid "Save presets bundle as:" msgstr "이전 번들 설정을 다음과 같이 저장 :" -#: src/slic3r/GUI/MainFrame.cpp:1849 +#: src/slic3r/GUI/MainFrame.cpp:1941 msgid "Loading of a configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1879 +#: src/slic3r/GUI/MainFrame.cpp:1971 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d 사전 설정을 가져 왔습니다." @@ -6298,19 +7613,19 @@ msgstr "" msgid "%s information" msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:752 +#: src/slic3r/GUI/NotificationManager.hpp:899 msgid "3D Mouse disconnected." msgstr "3D 마우스 연결이 끊어졌습니다." -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "Configuration update is available." msgstr "구성 업데이트를 사용할 수 있음" -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "See more." msgstr "자세한 내용은 참조하십시오." -#: src/slic3r/GUI/NotificationManager.hpp:761 +#: src/slic3r/GUI/NotificationManager.hpp:908 msgid "" "You have just added a G-code for color change, but its value is empty.\n" "To export the G-code correctly, check the \"Color Change G-code\" in " @@ -6320,145 +7635,187 @@ msgstr "" "G 코드를 올바르게 내보내려면 \"프린터 설정 > 사용자 지정 G 코드\"에서 \"색상 " "변경 G 코드\"를 확인합니다." -#: src/slic3r/GUI/NotificationManager.hpp:764 +#: src/slic3r/GUI/NotificationManager.hpp:911 msgid "" "No color change event was added to the print. The print does not look like a " "sign." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:766 +#: src/slic3r/GUI/NotificationManager.hpp:913 msgid "Desktop integration was successful." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:768 +#: src/slic3r/GUI/NotificationManager.hpp:915 msgid "Desktop integration failed." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:770 +#: src/slic3r/GUI/NotificationManager.hpp:917 msgid "Undo desktop integration was successful." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:772 +#: src/slic3r/GUI/NotificationManager.hpp:919 msgid "Undo desktop integration failed." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:773 +#: src/slic3r/GUI/NotificationManager.hpp:920 msgid "Exporting." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:664 +#: src/slic3r/GUI/NotificationManager.hpp:924 +msgid "" +"PrusaSlicer recieved a download request from Printables.com, but it's not " +"allowed. You can allow it" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:925 +msgid "here." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:773 msgid "Open Folder." msgstr "폴더를 엽니다." -#: src/slic3r/GUI/NotificationManager.cpp:701 +#: src/slic3r/GUI/NotificationManager.cpp:811 msgid "Eject drive" msgstr "배출 드라이브" -#: src/slic3r/GUI/NotificationManager.cpp:885 +#: src/slic3r/GUI/NotificationManager.cpp:1054 +#: src/slic3r/GUI/NotificationManager.cpp:1267 +#: src/slic3r/GUI/NotificationManager.cpp:1472 msgid "ERROR" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:890 -msgid "CANCELED" +#: src/slic3r/GUI/NotificationManager.cpp:1269 +#: src/slic3r/GUI/NotificationManager.cpp:1377 +msgid "COMPLETED" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:895 -msgid "COMPLETED" +#: src/slic3r/GUI/NotificationManager.cpp:1467 +msgid "RESOLVING ADDRESS" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:1477 +msgid "CANCELED" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:937 +#: src/slic3r/GUI/NotificationManager.cpp:1539 msgid "Cancel upload" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:996 +#: src/slic3r/GUI/NotificationManager.cpp:1648 #, c-format, boost-format msgid "%1$d object was loaded with custom supports." msgid_plural "%1$d objects were loaded with custom supports." msgstr[0] "" -#: src/slic3r/GUI/NotificationManager.cpp:997 +#: src/slic3r/GUI/NotificationManager.cpp:1649 #, c-format, boost-format msgid "%1$d object was loaded with custom seam." msgid_plural "%1$d objects were loaded with custom seam." msgstr[0] "" -#: src/slic3r/GUI/NotificationManager.cpp:998 +#: src/slic3r/GUI/NotificationManager.cpp:1650 #, c-format, boost-format msgid "%1$d object was loaded with multimaterial painting." msgid_plural "%1$d objects were loaded with multimaterial painting." msgstr[0] "" -#: src/slic3r/GUI/NotificationManager.cpp:999 +#: src/slic3r/GUI/NotificationManager.cpp:1651 #, c-format, boost-format msgid "%1$d object was loaded with variable layer height." msgid_plural "%1$d objects were loaded with variable layer height." msgstr[0] "" -#: src/slic3r/GUI/NotificationManager.cpp:1000 +#: src/slic3r/GUI/NotificationManager.cpp:1652 #, c-format, boost-format msgid "%1$d object was loaded with partial sinking." msgid_plural "%1$d objects were loaded with partial sinking." msgstr[0] "" -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1653 +#, c-format, boost-format +msgid "%1$d object was loaded as a part of cut object." +msgid_plural "%1$d objects were loaded as parts of cut object" +msgstr[0] "" + +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Slicing finished." msgstr "슬라이스가 끝났습니다." -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export G-Code." msgstr "G-코드 내보내기." -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1447 -#: src/slic3r/GUI/NotificationManager.cpp:1454 -#: src/slic3r/GUI/NotificationManager.cpp:1470 -#: src/slic3r/GUI/NotificationManager.cpp:1476 -#: src/slic3r/GUI/NotificationManager.cpp:1547 +#: src/slic3r/GUI/NotificationManager.cpp:2101 +#: src/slic3r/GUI/NotificationManager.cpp:2108 +#: src/slic3r/GUI/NotificationManager.cpp:2124 +#: src/slic3r/GUI/NotificationManager.cpp:2130 +#: src/slic3r/GUI/NotificationManager.cpp:2201 msgid "ERROR:" msgstr "오류:" -#: src/slic3r/GUI/NotificationManager.cpp:1459 -#: src/slic3r/GUI/NotificationManager.cpp:1486 -#: src/slic3r/GUI/NotificationManager.cpp:1494 -#: src/slic3r/GUI/NotificationManager.cpp:1505 src/slic3r/GUI/Plater.cpp:3197 +#: src/slic3r/GUI/NotificationManager.cpp:2113 +#: src/slic3r/GUI/NotificationManager.cpp:2140 +#: src/slic3r/GUI/NotificationManager.cpp:2148 +#: src/slic3r/GUI/NotificationManager.cpp:2159 src/slic3r/GUI/Plater.cpp:3220 msgid "WARNING:" msgstr "경고" -#: src/slic3r/GUI/NotificationManager.cpp:1598 +#: src/slic3r/GUI/NotificationManager.cpp:2275 msgid "Exporting finished." msgstr "내보내기가 완료되었습니다." -#: src/slic3r/GUI/ObjectDataViewModel.cpp:50 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 msgid "Paint-on seam" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:52 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:68 +msgid "Cut connectors" +msgstr "" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:70 msgid "Sinking" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:110 msgid "Instances" msgstr "적용" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:98 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:266 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:114 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:275 #, c-format, boost-format msgid "Instance %d" msgstr "인스턴스 %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4568 -#: src/slic3r/GUI/Tab.cpp:4659 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:121 src/slic3r/GUI/Tab.cpp:4805 +#: src/slic3r/GUI/Tab.cpp:4942 msgid "Layers" msgstr "레이어" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 msgid "Range" msgstr "범위" -#: src/slic3r/GUI/OpenGLManager.cpp:258 +#: src/slic3r/GUI/OpenGLManager.cpp:376 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL ES 2.0 capable graphics driver to run " +"correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:379 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL %s capable graphics driver to run correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:382 #, c-format, boost-format msgid "" "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" @@ -6468,21 +7825,21 @@ msgstr "" "니다. \n" "OpenGL 버전은 %s, 렌더링 %s 동안, 공급 업체 %s 감지되었습니다." -#: src/slic3r/GUI/OpenGLManager.cpp:261 +#: src/slic3r/GUI/OpenGLManager.cpp:386 msgid "You may need to update your graphics card driver." msgstr "그래픽 카드 드라이버를 업데이트해야 할 수 있습니다." -#: src/slic3r/GUI/OpenGLManager.cpp:264 +#: src/slic3r/GUI/OpenGLManager.cpp:389 msgid "" "As a workaround, you may run PrusaSlicer with a software rendered 3D " "graphics by running prusa-slicer.exe with the --sw-renderer parameter." msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:266 +#: src/slic3r/GUI/OpenGLManager.cpp:391 msgid "Unsupported OpenGL version" msgstr "지원되지 않는 OpenGL 버전" -#: src/slic3r/GUI/OpenGLManager.cpp:274 +#: src/slic3r/GUI/OpenGLManager.cpp:399 #, c-format, boost-format msgid "" "Unable to load the following shaders:\n" @@ -6491,16 +7848,20 @@ msgstr "" "다음 샤더를 로드할 수 없습니다.\n" "%s" -#: src/slic3r/GUI/OpenGLManager.cpp:275 +#: src/slic3r/GUI/OpenGLManager.cpp:400 msgid "Error loading shaders" msgstr "오류 로드 샤더" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:126 +msgid "Unavailable for this method." +msgstr "" + +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Top" msgstr "상단 " -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Bottom" msgstr "하단 " @@ -6509,7 +7870,7 @@ msgstr "하단 " msgid "Delete this preset from this printer device" msgstr "이 프린터 장치에서 이 사전 설정 삭제" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:83 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:84 msgid "This printer will be shown in the presets list as" msgstr "이 프린터는 사전 설정 목록에 표시됩니다." @@ -6525,31 +7886,31 @@ msgstr "프린터의 설명 이름" msgid "Add preset for this printer device" msgstr "이 프린터 장치에 대한 사전 설정 추가" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2255 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2239 msgid "Print Host upload" msgstr "프린터 호스트 업로드 대기" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:268 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:271 msgid "Connection to printers connected via the print host failed." msgstr "인쇄 호스트를 통해 연결된 프린터에 대한 연결이 실패했습니다." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:310 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:313 msgid "Test" msgstr "테스트" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:315 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:318 msgid "Could not get a valid Printer Host reference" msgstr "유효한 프린터 호스트 참조를 가져올 수 없습니다" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:330 msgid "Success!" msgstr "성공!" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:337 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:340 msgid "Refresh Printers" msgstr "프린터 새로 고침" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:367 msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." @@ -6557,20 +7918,20 @@ msgstr "" "HTTPS CA 파일은 선택 사항입니다. 자체 서명된 인증서와 함께 HTTPS를 사용하는 " "경우에만 필요합니다." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:374 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:377 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "인증서 파일(*.crt, *.pem)|*.crt;*.pem| 모든 파일|**" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:378 msgid "Open CA certificate file" msgstr "CA 인증서 파일 열기" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:404 -#: src/libslic3r/PrintConfig.cpp:330 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:407 +#: src/libslic3r/PrintConfig.cpp:343 msgid "HTTPS CA File" msgstr "HTTPS CA 파일" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:405 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:408 #, c-format, boost-format msgid "" "On this system, %s uses HTTPS certificates from the system Certificate Store " @@ -6579,7 +7940,7 @@ msgstr "" "이 시스템에서 는 %s 시스템 인증서 저장소 또는 키체인의 HTTPS 인증서를 사용합" "니다." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:406 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:409 msgid "" "To use a custom CA file, please import your CA file into Certificate Store / " "Keychain." @@ -6587,24 +7948,24 @@ msgstr "" "사용자 지정 CA 파일을 사용하려면 CA 파일을 인증서 저장소/ 키체인으로 가져오십" "시오." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:634 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:706 msgid "The supplied name is empty. It can't be saved." msgstr "파일 이름이 비어 있습니다. 저장할 수 없습니다." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:638 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:710 msgid "You have to enter a printer name." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:646 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:718 #, boost-format msgid "Printer with name \"%1%\" already exists." msgstr "\"%1%\"라는 이름의 프린터가 이미 있습니다." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:647 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:719 msgid "Replace?" msgstr "교체?" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:674 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:746 #, boost-format msgid "" "Following printer preset is duplicated:%1%The above preset for printer \"%2%" @@ -6614,207 +7975,204 @@ msgid_plural "" "\"%2%\" will be used just once." msgstr[0] "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:724 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:796 msgid "It's not possible to delete the last related preset for the printer." msgstr "프린터의 마지막 관련 사전 설정을 삭제할 수 없습니다." -#: src/slic3r/GUI/Plater.cpp:141 +#: src/slic3r/GUI/Plater.cpp:158 msgid "The provided name is not valid;" msgstr "" -#: src/slic3r/GUI/Plater.cpp:142 src/slic3r/GUI/SavePresetDialog.cpp:102 +#: src/slic3r/GUI/Plater.cpp:159 src/slic3r/GUI/SavePresetDialog.cpp:166 msgid "the following characters are not allowed:" msgstr "다음 문자는 허용되지 않습니다:" -#: src/slic3r/GUI/Plater.cpp:207 +#: src/slic3r/GUI/Plater.cpp:223 msgid "" "For a multipart object, this value isn't accurate.\n" "It doesn't take account of intersections and negative volumes." msgstr "" -#: src/slic3r/GUI/Plater.cpp:211 +#: src/slic3r/GUI/Plater.cpp:227 msgid "Volume" msgstr "볼륨" -#: src/slic3r/GUI/Plater.cpp:213 +#: src/slic3r/GUI/Plater.cpp:229 msgid "Facets" msgstr "측면" -#: src/slic3r/GUI/Plater.cpp:276 +#: src/slic3r/GUI/Plater.cpp:286 msgid "Sliced Info" msgstr "슬라이스된 정보" -#: src/slic3r/GUI/Plater.cpp:296 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:306 src/slic3r/GUI/Plater.cpp:1414 msgid "Used Filament (g)" msgstr "사용자 필라멘트 (g)" -#: src/slic3r/GUI/Plater.cpp:297 src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:307 src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (m)" msgstr "사용자 필라멘트 (m)" -#: src/slic3r/GUI/Plater.cpp:298 src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:308 src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (mm³)" msgstr "사용자 필라멘트 (mm³)" -#: src/slic3r/GUI/Plater.cpp:299 +#: src/slic3r/GUI/Plater.cpp:309 msgid "Used Material (unit)" msgstr "중고 재료(단위)" -#: src/slic3r/GUI/Plater.cpp:300 +#: src/slic3r/GUI/Plater.cpp:310 msgid "Cost (money)" msgstr "비용 (돈)" -#: src/slic3r/GUI/Plater.cpp:301 src/slic3r/GUI/Plater.cpp:1340 -#: src/slic3r/GUI/Plater.cpp:1427 +#: src/slic3r/GUI/Plater.cpp:311 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:1464 msgid "Estimated printing time" msgstr "예상 인쇄 시간" -#: src/slic3r/GUI/Plater.cpp:302 +#: src/slic3r/GUI/Plater.cpp:312 msgid "Number of tool changes" msgstr "공구(tool) 변경 수" -#: src/slic3r/GUI/Plater.cpp:431 +#: src/slic3r/GUI/Plater.cpp:437 msgid "Select what kind of support do you need" msgstr "필요한 지원 종류를 선택합니다." -#: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2590 -#: src/libslic3r/PrintConfig.cpp:3645 +#: src/slic3r/GUI/Plater.cpp:440 src/libslic3r/PrintConfig.cpp:2620 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "Support on build plate only" msgstr "출력물만 서포트를 지지" -#: src/slic3r/GUI/Plater.cpp:434 src/slic3r/GUI/Plater.cpp:564 +#: src/slic3r/GUI/Plater.cpp:441 msgid "For support enforcers only" msgstr "서포트 지원영역 전용" -#: src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Plater.cpp:442 msgid "Everywhere" msgstr "어디에서든" -#: src/slic3r/GUI/Plater.cpp:467 src/slic3r/GUI/Tab.cpp:1542 +#: src/slic3r/GUI/Plater.cpp:475 src/slic3r/GUI/Tab.cpp:1489 msgid "Brim" msgstr "테두리" -#: src/slic3r/GUI/Plater.cpp:469 +#: src/slic3r/GUI/Plater.cpp:477 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." msgstr "첫 번째 레이어의 각 객체(object) 주위에 인쇄 될 브림을 활성화합니다." -#: src/slic3r/GUI/Plater.cpp:477 +#: src/slic3r/GUI/Plater.cpp:485 msgid "Purging volumes" msgstr "볼륨 삭제 - 볼륨 로드/언로드" -#: src/slic3r/GUI/Plater.cpp:578 +#: src/slic3r/GUI/Plater.cpp:592 msgid "Select what kind of pad do you need" msgstr "필요한 패드 종류를 선택하십시오." -#: src/slic3r/GUI/Plater.cpp:580 +#: src/slic3r/GUI/Plater.cpp:595 msgid "Below object" msgstr "아래 개체" -#: src/slic3r/GUI/Plater.cpp:581 +#: src/slic3r/GUI/Plater.cpp:596 msgid "Around object" msgstr "개체 주변" -#: src/slic3r/GUI/Plater.cpp:894 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/Plater.cpp:929 src/slic3r/GUI/Plater.cpp:7162 msgid "Send to printer" msgstr "프린터로 보내기" -#: src/slic3r/GUI/Plater.cpp:914 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6067 +#: src/slic3r/GUI/Plater.cpp:949 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6657 msgid "Slice now" msgstr "바로 슬라이스" -#: src/slic3r/GUI/Plater.cpp:1087 +#: src/slic3r/GUI/Plater.cpp:1127 msgid "Hold Shift to Slice & Export G-code" msgstr "슬라이스로 의 전환 보류 및 내보내기 G 코드" -#: src/slic3r/GUI/Plater.cpp:1287 +#: src/slic3r/GUI/Plater.cpp:1324 #, boost-format msgid "%1% (%2$d shell)" msgid_plural "%1% (%2$d shells)" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:1315 +#: src/slic3r/GUI/Plater.cpp:1352 msgid "Used Material (ml)" msgstr "중고 재료 (ml)" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "object" msgid_plural "objects" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "supports and pad" msgstr "지지대 및 패드" -#: src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (in)" msgstr "사용자 필라멘트 (mm³)" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "objects" msgstr "사물" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "wipe tower" msgstr "와이프 타워 - 버려진 필라멘트 조절" -#: src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (in³)" msgstr "사용자 필라멘트 (mm³)" -#: src/slic3r/GUI/Plater.cpp:1396 +#: src/slic3r/GUI/Plater.cpp:1433 #, boost-format msgid "Filament at extruder %1%" msgstr "압출기 %1% 필라멘트" -#: src/slic3r/GUI/Plater.cpp:1402 +#: src/slic3r/GUI/Plater.cpp:1439 msgid "(including spool)" msgstr "(스풀 포함)" -#: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1072 -#: src/libslic3r/PrintConfig.cpp:3439 src/libslic3r/PrintConfig.cpp:3440 +#: src/slic3r/GUI/Plater.cpp:1448 src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:3716 src/libslic3r/PrintConfig.cpp:3717 msgid "Cost" msgstr "비용" -#: src/slic3r/GUI/Plater.cpp:1429 +#: src/slic3r/GUI/Plater.cpp:1466 msgid "normal mode" msgstr "일반 모드" -#: src/slic3r/GUI/Plater.cpp:1436 +#: src/slic3r/GUI/Plater.cpp:1473 msgid "stealth mode" msgstr "스텔스 모드" -#: src/slic3r/GUI/Plater.cpp:1670 -msgid "Fill bed" -msgstr "침대 채우기" - -#: src/slic3r/GUI/Plater.cpp:1676 -msgid "Optimize Rotation" -msgstr "회전 최적화" - -#: src/slic3r/GUI/Plater.cpp:1682 -msgid "Import SLA archive" -msgstr "SLA 아카이브 가져오기" - -#: src/slic3r/GUI/Plater.cpp:1725 +#: src/slic3r/GUI/Plater.cpp:1734 #, boost-format msgid "Do you want to save the changes to \"%1%\"?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1730 src/slic3r/GUI/Preferences.cpp:222 +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:905 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1599 +msgid "Save" +msgstr "저장" + +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +msgid "Discard" +msgstr "무시\t" + +#: src/slic3r/GUI/Plater.cpp:1740 src/slic3r/GUI/Preferences.cpp:354 msgid "Ask for unsaved changes in project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1733 +#: src/slic3r/GUI/Plater.cpp:1743 msgid "" "You will not be asked about it again, when: \n" "- Closing PrusaSlicer,\n" "- Loading or creating a new project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2198 +#: src/slic3r/GUI/Plater.cpp:2214 #, c-format, boost-format msgid "" "Successfully unmounted. The device %s(%s) can now be safely removed from the " @@ -6823,20 +8181,20 @@ msgstr "" "성공적으로 마운트 해제됩니다. 이제 %s %s 장치(장치를 컴퓨터에서 안전하게 제거" "할 수 있습니다)." -#: src/slic3r/GUI/Plater.cpp:2203 +#: src/slic3r/GUI/Plater.cpp:2220 #, c-format, boost-format msgid "Ejecting of device %s(%s) has failed." msgstr "장치 %s(%s)의 배출이 실패했습니다." -#: src/slic3r/GUI/Plater.cpp:2222 src/slic3r/GUI/Plater.cpp:5108 +#: src/slic3r/GUI/Plater.cpp:2239 src/slic3r/GUI/Plater.cpp:5199 msgid "New Project" msgstr "새로운 프로젝트" -#: src/slic3r/GUI/Plater.cpp:2319 +#: src/slic3r/GUI/Plater.cpp:2346 msgid "Expand sidebar" msgstr "사이드바 확장" -#: src/slic3r/GUI/Plater.cpp:2518 +#: src/slic3r/GUI/Plater.cpp:2428 msgid "" "The preset below was temporarily installed on the active instance of " "PrusaSlicer" @@ -6845,12 +8203,12 @@ msgid_plural "" "PrusaSlicer" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:2548 +#: src/slic3r/GUI/Plater.cpp:2583 #, boost-format msgid "Failed loading file \"%1%\" due to an invalid configuration." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2568 +#: src/slic3r/GUI/Plater.cpp:2603 #, c-format, boost-format msgid "" "Object size from file %s appears to be zero.\n" @@ -6860,11 +8218,11 @@ msgid_plural "" "These objects have been removed from the model" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:2572 +#: src/slic3r/GUI/Plater.cpp:2607 msgid "The size of the object is zero" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2585 +#: src/slic3r/GUI/Plater.cpp:2620 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in meters.\n" @@ -6876,15 +8234,15 @@ msgid_plural "" "the dimensions of these objects?" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:2589 src/slic3r/GUI/Plater.cpp:2611 +#: src/slic3r/GUI/Plater.cpp:2624 src/slic3r/GUI/Plater.cpp:2646 msgid "The object is too small" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2590 src/slic3r/GUI/Plater.cpp:2612 +#: src/slic3r/GUI/Plater.cpp:2625 src/slic3r/GUI/Plater.cpp:2647 msgid "Apply to all the remaining small objects being loaded." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2607 +#: src/slic3r/GUI/Plater.cpp:2642 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in inches.\n" @@ -6896,38 +8254,29 @@ msgid_plural "" "the dimensions of these objects?" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:2625 +#: src/slic3r/GUI/Plater.cpp:2659 msgid "" "This file contains several objects positioned at multiple heights.\n" "Instead of considering them as multiple objects, should \n" "the file be loaded as a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2628 src/slic3r/GUI/Plater.cpp:2683 +#: src/slic3r/GUI/Plater.cpp:2662 src/slic3r/GUI/Plater.cpp:2711 msgid "Multi-part object detected" msgstr "다중 부품 객체가 감지" -#: src/slic3r/GUI/Plater.cpp:2636 +#: src/slic3r/GUI/Plater.cpp:2669 msgid "" "This file cannot be loaded in a simple mode. Do you want to switch to an " "advanced mode?" msgstr "" "이 파일은 간단한 모드로 로드할 수 없습니다. 고급 모드로 전환하시겠습니까?" -#: src/slic3r/GUI/Plater.cpp:2637 +#: src/slic3r/GUI/Plater.cpp:2670 msgid "Detected advanced data" msgstr "감지된 고급 데이터" -#: src/slic3r/GUI/Plater.cpp:2657 -#, c-format, boost-format -msgid "" -"You can't to add the object(s) from %s because of one or some of them " -"is(are) multi-part" -msgstr "" -"다중 부품(Part) 하나 또는 그 중 일부 때문에 %s에서 객체(object)를 추가 할 수 " -"없습니다" - -#: src/slic3r/GUI/Plater.cpp:2680 +#: src/slic3r/GUI/Plater.cpp:2708 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" @@ -6937,145 +8286,161 @@ msgstr "" "여러 객체(object)로 간주하는 대신,\n" "이 파일들은 여러 부분을 갖는 단일 객체(object)를 나타낼 수 있습니까?" -#: src/slic3r/GUI/Plater.cpp:2799 +#: src/slic3r/GUI/Plater.cpp:2827 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." msgstr "개체가 너무 커서 인쇄물에 맞게 자동으로 축소되었습니다." -#: src/slic3r/GUI/Plater.cpp:2800 +#: src/slic3r/GUI/Plater.cpp:2828 msgid "Object too large?" msgstr "개체가 너무 큽니까?" -#: src/slic3r/GUI/Plater.cpp:2878 +#: src/slic3r/GUI/Plater.cpp:2908 msgid "Export STL file:" msgstr "STL 파일 내보내기:" -#: src/slic3r/GUI/Plater.cpp:2885 +#: src/slic3r/GUI/Plater.cpp:2915 msgid "Export AMF file:" msgstr "AMF 파일 내보내기:" -#: src/slic3r/GUI/Plater.cpp:2891 +#: src/slic3r/GUI/Plater.cpp:2921 msgid "Save file as:" msgstr "파일을 다음과 같이 저장" -#: src/slic3r/GUI/Plater.cpp:2897 +#: src/slic3r/GUI/Plater.cpp:2927 msgid "Export OBJ file:" msgstr "OBJ 파일 내보내기:" -#: src/slic3r/GUI/Plater.cpp:2995 +#: src/slic3r/GUI/Plater.cpp:3030 +msgid "Delete object which is a part of cut object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3031 +msgid "" +"You try to delete an object which is a part of a cut object.\n" +"This action will break a cut correspondence.\n" +"After that PrusaSlicer can't guarantee model consistency" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3035 +msgid "Delete object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3040 msgid "Delete Object" msgstr "오브젝트 지우기" -#: src/slic3r/GUI/Plater.cpp:3007 +#: src/slic3r/GUI/Plater.cpp:3057 msgid "Delete All Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3035 +#: src/slic3r/GUI/Plater.cpp:3086 msgid "Reset Project" msgstr "프로젝트 재설정" -#: src/slic3r/GUI/Plater.cpp:3118 +#: src/slic3r/GUI/Plater.cpp:3141 msgid "" "The selected object couldn't be split because it contains only one solid " "part." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3125 +#: src/slic3r/GUI/Plater.cpp:3148 msgid "All non-solid parts (modifiers) were deleted" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3127 +#: src/slic3r/GUI/Plater.cpp:3150 msgid "Split to Objects" msgstr "오브젝트별 분할" -#: src/slic3r/GUI/Plater.cpp:3179 +#: src/slic3r/GUI/Plater.cpp:3202 msgid "" "An object has custom support enforcers which will not be used because " "supports are disabled." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3181 +#: src/slic3r/GUI/Plater.cpp:3204 msgid "Enable supports for enforcers only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3310 src/slic3r/GUI/Plater.cpp:4176 +#: src/slic3r/GUI/Plater.cpp:3339 src/slic3r/GUI/Plater.cpp:4238 msgid "Invalid data" msgstr "잘못된 데이터" -#: src/slic3r/GUI/Plater.cpp:3380 +#: src/slic3r/GUI/Plater.cpp:3410 msgid "Another export job is currently running." msgstr "다른 내보내기 작업이 현재 실행 중입니다." -#: src/slic3r/GUI/Plater.cpp:3466 +#: src/slic3r/GUI/Plater.cpp:3496 msgid "Replace from:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3484 +#: src/slic3r/GUI/Plater.cpp:3514 msgid "Unable to replace with more than one volume" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3484 src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3514 src/slic3r/GUI/Plater.cpp:3597 msgid "Error during replace" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3555 +#: src/slic3r/GUI/Plater.cpp:3589 msgid "Select the new file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3597 msgid "File for the replace wasn't selected" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3654 +#: src/slic3r/GUI/Plater.cpp:3684 msgid "Please select the file to reload" msgstr "다시 로드할 파일을 선택하십시오." -#: src/slic3r/GUI/Plater.cpp:3685 src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:3715 src/slic3r/GUI/Plater.cpp:5355 +#: src/slic3r/GUI/Plater.cpp:5365 msgid "The selected file" msgstr "선택한 파일" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "differs from the original file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "Do you want to replace it" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3703 src/slic3r/GUI/Plater.cpp:3709 +#: src/slic3r/GUI/Plater.cpp:3736 src/slic3r/GUI/Plater.cpp:3742 msgid "Reload from:" msgstr "다음에서 다시 로드됩니다." -#: src/slic3r/GUI/Plater.cpp:3812 +#: src/slic3r/GUI/Plater.cpp:3864 msgid "Unable to reload:" msgstr "다시 로드할 수 없습니다." -#: src/slic3r/GUI/Plater.cpp:3817 +#: src/slic3r/GUI/Plater.cpp:3869 msgid "Error during reload" msgstr "다시 로드하는 동안 오류" -#: src/slic3r/GUI/Plater.cpp:3835 +#: src/slic3r/GUI/Plater.cpp:3887 msgid "Reload all from disk" msgstr "디스크에서 모두 다시 로드 " -#: src/slic3r/GUI/Plater.cpp:4130 +#: src/slic3r/GUI/Plater.cpp:4191 msgid "There are active warnings concerning sliced models:" msgstr "슬라이스 모델에 대한 활성 경고가 있습니다." -#: src/slic3r/GUI/Plater.cpp:4141 +#: src/slic3r/GUI/Plater.cpp:4202 msgid "generated warnings" msgstr "생성된 경고" -#: src/slic3r/GUI/Plater.cpp:4472 +#: src/slic3r/GUI/Plater.cpp:4554 msgid "3D editor view" msgstr "3D 편집기 보기" -#: src/slic3r/GUI/Plater.cpp:4893 +#: src/slic3r/GUI/Plater.cpp:4980 msgid "Undo / Redo is processing" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4895 +#: src/slic3r/GUI/Plater.cpp:4982 #, boost-format msgid "" "Switching the printer technology from %1% to %2%.\n" @@ -7083,179 +8448,228 @@ msgid "" "printer technology." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5092 +#: src/slic3r/GUI/Plater.cpp:5184 msgid "Creating a new project while the current project is modified." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5095 +#: src/slic3r/GUI/Plater.cpp:5187 msgid "Creating a new project while some presets are modified." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5096 +#: src/slic3r/GUI/Plater.cpp:5188 msgid "You can keep presets modifications to the new project or discard them" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5097 +#: src/slic3r/GUI/Plater.cpp:5189 msgid "" "You can keep presets modifications to the new project, discard them or save " "changes as new presets.\n" "Note, if changes will be saved then new project wouldn't keep them" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5103 +#: src/slic3r/GUI/Plater.cpp:5194 msgid "Creating a new project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5137 +#: src/slic3r/GUI/Plater.cpp:5228 msgid "Load Project" msgstr "프로젝트 불러오기" -#: src/slic3r/GUI/Plater.cpp:5167 src/slic3r/GUI/Plater.cpp:5432 +#: src/slic3r/GUI/Plater.cpp:5258 msgid "Import Object" msgstr "개체 가져오기" -#: src/slic3r/GUI/Plater.cpp:5171 +#: src/slic3r/GUI/Plater.cpp:5262 msgid "Import Objects" msgstr "가져오기 개체" -#: src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:5291 +msgid "Import SLA archive" +msgstr "SLA 아카이브 가져오기" + +#: src/slic3r/GUI/Plater.cpp:5355 src/slic3r/GUI/Plater.cpp:5365 msgid "does not contain valid gcode." msgstr "유효한 gcode가 포함되어 있지 않습니다." -#: src/slic3r/GUI/Plater.cpp:5244 +#: src/slic3r/GUI/Plater.cpp:5356 src/slic3r/GUI/Plater.cpp:5366 msgid "Error while loading .gcode file" msgstr ".gcode 파일을 로드하는 동안 오류" -#: src/slic3r/GUI/Plater.cpp:5297 +#: src/slic3r/GUI/Plater.cpp:5433 +#, c-format, boost-format +msgid "%s - Multiple projects file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 +msgid "There are several files being loaded, including Project files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 src/slic3r/GUI/Plater.cpp:5446 +msgid "Select an action to apply to all files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5446 +msgid "There are several files being loaded." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5448 src/slic3r/GUI/Plater.cpp:5842 +msgid "Action" +msgstr "실행" + +#: src/slic3r/GUI/Plater.cpp:5469 +msgid "Import geometry" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5482 src/slic3r/GUI/Plater.cpp:5834 +msgid "Start new PrusaSlicer instance" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5496 +msgid "Select one to load as project" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5507 +msgid "Select one to load config only" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5609 +#, boost-format +msgid "Failed to unzip file to %1%: %2% " +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5618 +#, boost-format +msgid "Failed to find unzipped file at %1%. Unzipping of file has failed." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5821 #, c-format, boost-format -msgid "%s - Drop project file" -msgstr "%s - 프로젝트 파일 삭제" +msgid "%s - Load project file" +msgstr "" -#: src/slic3r/GUI/Plater.cpp:5304 +#: src/slic3r/GUI/Plater.cpp:5830 msgid "Open as project" msgstr "&프로젝트 열기" -#: src/slic3r/GUI/Plater.cpp:5305 +#: src/slic3r/GUI/Plater.cpp:5831 msgid "Import geometry only" msgstr "형상 가져오기만" -#: src/slic3r/GUI/Plater.cpp:5306 +#: src/slic3r/GUI/Plater.cpp:5832 msgid "Import config only" msgstr "구성만 가져오기" -#: src/slic3r/GUI/Plater.cpp:5309 +#: src/slic3r/GUI/Plater.cpp:5837 msgid "Select an action to apply to the file" msgstr "파일에 적용할 작업 선택" -#: src/slic3r/GUI/Plater.cpp:5314 -msgid "Action" -msgstr "실행" - -#: src/slic3r/GUI/Plater.cpp:5330 +#: src/slic3r/GUI/Plater.cpp:5858 msgid "Don't show again" msgstr "다시 보지 않기" -#: src/slic3r/GUI/Plater.cpp:5371 +#: src/slic3r/GUI/Plater.cpp:5899 msgid "You can open only one .gcode file at a time." msgstr "한 번에 하나의 .gcode 파일만 열 수 있습니다." -#: src/slic3r/GUI/Plater.cpp:5372 +#: src/slic3r/GUI/Plater.cpp:5900 msgid "Drag and drop G-code file" msgstr "G 코드 파일 드래그 및 드롭" -#: src/slic3r/GUI/Plater.cpp:5454 +#: src/slic3r/GUI/Plater.cpp:5992 msgid "Load File" msgstr "로드 파일" -#: src/slic3r/GUI/Plater.cpp:5459 +#: src/slic3r/GUI/Plater.cpp:5997 msgid "Load Files" msgstr "파일 로드" -#: src/slic3r/GUI/Plater.cpp:5509 +#: src/slic3r/GUI/Plater.cpp:6047 msgid "All objects will be removed, continue?" msgstr "모든 개체가 제거되고 계속되나요?" -#: src/slic3r/GUI/Plater.cpp:5520 +#: src/slic3r/GUI/Plater.cpp:6058 msgid "Delete Selected Objects" msgstr "선택한 개체 삭제" -#: src/slic3r/GUI/Plater.cpp:5529 +#: src/slic3r/GUI/Plater.cpp:6067 msgid "Increase Instances" msgstr "인스턴스 증가" -#: src/slic3r/GUI/Plater.cpp:5563 +#: src/slic3r/GUI/Plater.cpp:6109 msgid "Decrease Instances" msgstr "인스턴스 감소" -#: src/slic3r/GUI/Plater.cpp:5614 +#: src/slic3r/GUI/Plater.cpp:6167 msgid "Enter the number of copies:" msgstr "사본 수를 입력합니다." -#: src/slic3r/GUI/Plater.cpp:5615 +#: src/slic3r/GUI/Plater.cpp:6168 msgid "Copies of the selected object" msgstr "선택한 개체의 복사본" -#: src/slic3r/GUI/Plater.cpp:5619 +#: src/slic3r/GUI/Plater.cpp:6171 #, c-format, boost-format msgid "Set numbers of copies to %d" msgstr "복사본 수를 %d" -#: src/slic3r/GUI/Plater.cpp:5697 -msgid "Cut by Plane" -msgstr "평면으로 절단" +#: src/slic3r/GUI/Plater.cpp:6187 +msgid "Fill bed" +msgstr "침대 채우기" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save G-code file as:" msgstr "G-code 파일 다른 이름 저장:" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save SL1 / SL1S file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5766 +#: src/slic3r/GUI/Plater.cpp:6336 msgid "The provided file name is not valid." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5767 +#: src/slic3r/GUI/Plater.cpp:6337 msgid "The following characters are not allowed by a FAT file system:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "" "The plater is empty.\n" "Do you want to save the project?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "Save project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:6543 -msgid "Export" -msgstr "내보내기" +#: src/slic3r/GUI/Plater.cpp:6766 +msgid "Is the printer ready? Is the print sheet in place, empty and clean?" +msgstr "" -#: src/slic3r/GUI/Plater.cpp:6575 -msgid "" -"Custom supports, seams and multimaterial painting were removed after " -"repairing the mesh." +#: src/slic3r/GUI/Plater.cpp:6766 src/slic3r/GUI/PrintHostDialogs.cpp:132 +msgid "Upload and Print" msgstr "" -#: src/slic3r/GUI/Plater.cpp:6689 +#: src/slic3r/GUI/Plater.cpp:7161 +msgid "Export" +msgstr "내보내기" + +#: src/slic3r/GUI/Plater.cpp:7306 msgid "Paste From Clipboard" msgstr "클립보드에서 붙여넣기" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2290 -#: src/slic3r/GUI/Tab.cpp:2517 src/slic3r/GUI/Tab.cpp:2624 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Preferences.cpp:240 src/slic3r/GUI/Tab.cpp:2274 +#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2617 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "General" msgstr "일반" -#: src/slic3r/GUI/Preferences.cpp:121 +#: src/slic3r/GUI/Preferences.cpp:258 msgid "Remember output directory" msgstr "출력 디렉토리 기억하기" -#: src/slic3r/GUI/Preferences.cpp:123 +#: src/slic3r/GUI/Preferences.cpp:259 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." @@ -7263,21 +8677,21 @@ msgstr "" "이 옵션을 사용하면 Slic3r은 입력 파일이 들어있는 디렉터리 대신, 마지막 출력 " "디렉터리에 묻습니다." -#: src/slic3r/GUI/Preferences.cpp:129 +#: src/slic3r/GUI/Preferences.cpp:263 msgid "Auto-center parts" msgstr "파츠를 자동으로 중심에" -#: src/slic3r/GUI/Preferences.cpp:131 +#: src/slic3r/GUI/Preferences.cpp:264 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." msgstr "이 옵션을 사용하면 Slic3r가 개체를 인쇄판 중앙에 자동으로 배치합니다." -#: src/slic3r/GUI/Preferences.cpp:137 +#: src/slic3r/GUI/Preferences.cpp:268 msgid "Background processing" msgstr "백그라운드 프로세싱" -#: src/slic3r/GUI/Preferences.cpp:139 +#: src/slic3r/GUI/Preferences.cpp:269 msgid "" "If this is enabled, Slic3r will pre-process objects as soon as they're " "loaded in order to save time when exporting G-code." @@ -7285,11 +8699,23 @@ msgstr "" "이 사용 하는 경우 Slic3r는 최대한 빨리 시간을 절약 하기 위해 로드된 G-코드를 " "내보낸다." -#: src/slic3r/GUI/Preferences.cpp:148 +#: src/slic3r/GUI/Preferences.cpp:274 +msgid "Alert when supports needed" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:275 +msgid "" +"If this is enabled, Slic3r will raise alerts when it detects issues in the " +"sliced object, that can be resolved with supports (and brim). Examples of " +"such issues are floating object parts, unsupported extrusions and low bed " +"adhesion." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:285 msgid "Export sources full pathnames to 3mf and amf" msgstr "소스 전체 경로 이름을 3mf 및 amf로 내보내기" -#: src/slic3r/GUI/Preferences.cpp:150 +#: src/slic3r/GUI/Preferences.cpp:286 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked." @@ -7297,19 +8723,19 @@ msgstr "" "활성화된 경우 디스크 명령에서 다시 로드하여 호출될 때 파일을 자동으로 찾고 로" "드할 수 있습니다." -#: src/slic3r/GUI/Preferences.cpp:159 +#: src/slic3r/GUI/Preferences.cpp:293 msgid "If enabled, sets PrusaSlicer as default application to open .3mf files." msgstr "" "활성화된 경우 PrusaSlicer를 기본 응용 프로그램으로 설정하여 .3mf 파일을 엽니" "다." -#: src/slic3r/GUI/Preferences.cpp:166 +#: src/slic3r/GUI/Preferences.cpp:298 msgid "If enabled, sets PrusaSlicer as default application to open .stl files." msgstr "" "활성화된 경우 PrusaSlicer를 기본 응용 프로그램으로 설정하여 .stl 파일을 엽니" "다." -#: src/slic3r/GUI/Preferences.cpp:177 +#: src/slic3r/GUI/Preferences.cpp:307 msgid "" "If enabled, Slic3r downloads updates of built-in system presets in the " "background. These updates are downloaded into a separate temporary location. " @@ -7320,11 +8746,11 @@ msgstr "" "드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 '사전 " "설정' 버전을 사용할 수 있게되면 응용 프로그램 시작시 제공됩니다." -#: src/slic3r/GUI/Preferences.cpp:182 +#: src/slic3r/GUI/Preferences.cpp:312 msgid "Suppress \" - default - \" presets" msgstr "이전 설정 \"- 기본 -\" 숨기기" -#: src/slic3r/GUI/Preferences.cpp:184 +#: src/slic3r/GUI/Preferences.cpp:313 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." @@ -7332,11 +8758,21 @@ msgstr "" "사용 가능한 다른 유효한 '사전 설정'이 있으면 인쇄 / 필라멘트 / 프린터 선택에" "서 \"- 기본 -\"'사전 설정'을 억제하십시오." -#: src/slic3r/GUI/Preferences.cpp:190 +#: src/slic3r/GUI/Preferences.cpp:317 +msgid "Suppress \" Template \" filament presets" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:318 +msgid "" +"Suppress \" Template \" filament presets in configuration wizard and sidebar " +"visibility." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:322 msgid "Show incompatible print and filament presets" msgstr "호환 되지 않는 인쇄 및 필라멘트 설정" -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:323 msgid "" "When checked, the print and filament presets are shown in the preset editor " "even if they are marked as incompatible with the active printer" @@ -7344,11 +8780,22 @@ msgstr "" "이 옵션을 선택하면 프린터와 호환되지 않는 것으로 표시된 경우에도 인쇄 및 필라" "멘트 '사전 설정'이 '사전 설정' 편집기에 표시됩니다" -#: src/slic3r/GUI/Preferences.cpp:200 +#: src/slic3r/GUI/Preferences.cpp:331 +msgid "Show load project dialog" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:332 +msgid "" +"When checked, whenever dragging and dropping a project file on the " +"application or open it from a browser, shows a dialog asking to select the " +"action to take on the file to load." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:335 msgid "Show drop project dialog" msgstr "드롭 프로젝트 대화 상자 표시" -#: src/slic3r/GUI/Preferences.cpp:202 +#: src/slic3r/GUI/Preferences.cpp:336 msgid "" "When checked, whenever dragging and dropping a project file on the " "application, shows a dialog asking to select the action to take on the file " @@ -7357,11 +8804,11 @@ msgstr "" "확인하면 응용 프로그램에서 프로젝트 파일을 드래그하고 삭제할 때마다 로드할 파" "일을 사용할 작업을 선택하라는 대화 상자가 표시됩니다." -#: src/slic3r/GUI/Preferences.cpp:208 src/slic3r/GUI/Preferences.cpp:212 +#: src/slic3r/GUI/Preferences.cpp:342 src/slic3r/GUI/Preferences.cpp:346 msgid "Allow just a single PrusaSlicer instance" msgstr "하나의 Prusa슬라이스어 인스턴스만 허용" -#: src/slic3r/GUI/Preferences.cpp:210 +#: src/slic3r/GUI/Preferences.cpp:343 msgid "" "On OSX there is always only one instance of app running by default. However " "it is allowed to run multiple instances of same app from the command line. " @@ -7371,7 +8818,7 @@ msgstr "" "서 동일한 앱의 여러 인스턴스를 실행할 수 있습니다. 이 경우 이 설정은 하나의 " "인스턴스만 허용합니다." -#: src/slic3r/GUI/Preferences.cpp:214 +#: src/slic3r/GUI/Preferences.cpp:347 msgid "" "If this is enabled, when starting PrusaSlicer and another instance of the " "same PrusaSlicer is already running, that instance will be reactivated " @@ -7380,52 +8827,52 @@ msgstr "" "이 옵션을 사용하도록 설정하면 PrusaSlicer와 이미 실행 중인 PrusaSlicer의 다" "른 인스턴스를 시작할 때 해당 인스턴스가 다시 활성화됩니다." -#: src/slic3r/GUI/Preferences.cpp:224 +#: src/slic3r/GUI/Preferences.cpp:355 msgid "" "Always ask for unsaved changes in project, when: \n" "- Closing PrusaSlicer,\n" "- Loading or creating a new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:233 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:897 +#: src/slic3r/GUI/Preferences.cpp:363 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:925 msgid "" "Ask to save unsaved changes in presets when closing the application or when " "loading a new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:235 +#: src/slic3r/GUI/Preferences.cpp:364 msgid "" "Always ask for unsaved changes in presets, when: \n" "- Closing PrusaSlicer while some presets are modified,\n" "- Loading a new project while some presets are modified" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:242 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:896 +#: src/slic3r/GUI/Preferences.cpp:370 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:924 msgid "Ask for unsaved changes in presets when selecting new preset" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:244 +#: src/slic3r/GUI/Preferences.cpp:371 msgid "" "Always ask for unsaved changes in presets when selecting new preset or " "resetting a preset" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:249 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 +#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:923 msgid "Ask for unsaved changes in presets when creating new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:251 +#: src/slic3r/GUI/Preferences.cpp:376 msgid "Always ask for unsaved changes in presets when creating new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:258 +#: src/slic3r/GUI/Preferences.cpp:382 msgid "Associate .gcode files to PrusaSlicer G-code Viewer" msgstr "PrusaSlicer G 코드 뷰어에 .gcode 파일을 연결" -#: src/slic3r/GUI/Preferences.cpp:260 +#: src/slic3r/GUI/Preferences.cpp:383 msgid "" "If enabled, sets PrusaSlicer G-code Viewer as default application to open ." "gcode files." @@ -7433,11 +8880,11 @@ msgstr "" "활성화된 경우 PrusaSlicer G 코드 뷰어를 기본 응용 프로그램으로 설정하여 ." "gcode 파일을 엽니다." -#: src/slic3r/GUI/Preferences.cpp:268 +#: src/slic3r/GUI/Preferences.cpp:390 msgid "Use Retina resolution for the 3D scene" msgstr "3D 장면에 레티나 해상도 사용" -#: src/slic3r/GUI/Preferences.cpp:270 +#: src/slic3r/GUI/Preferences.cpp:391 msgid "" "If enabled, the 3D scene will be rendered in Retina resolution. If you are " "experiencing 3D performance problems, disabling this option may help." @@ -7445,28 +8892,28 @@ msgstr "" "활성화 된 경우 3D 장면은 레티나 해상도로 렌더링 됩니다. 3D 성능 문제가 발생하" "는 경우, 옵션을 사용하지 않도록 설정 하면 도움이 될 수 있습니다." -#: src/slic3r/GUI/Preferences.cpp:280 src/slic3r/GUI/Preferences.cpp:282 +#: src/slic3r/GUI/Preferences.cpp:400 src/slic3r/GUI/Preferences.cpp:401 msgid "Show splash screen" msgstr "스플래시 화면 표시" -#: src/slic3r/GUI/Preferences.cpp:289 +#: src/slic3r/GUI/Preferences.cpp:406 msgid "If enabled, PrusaSlicer will be open at the position it was closed" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:295 +#: src/slic3r/GUI/Preferences.cpp:411 msgid "Clear Undo / Redo stack on new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:297 +#: src/slic3r/GUI/Preferences.cpp:412 msgid "" "Clear Undo / Redo stack on new project or when an existing project is loaded." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:303 +#: src/slic3r/GUI/Preferences.cpp:417 msgid "Enable support for legacy 3DConnexion devices" msgstr "레거시 3DConnexion 장치에 대한 지원 지원 지원" -#: src/slic3r/GUI/Preferences.cpp:305 +#: src/slic3r/GUI/Preferences.cpp:418 msgid "" "If enabled, the legacy 3DConnexion devices settings dialog is available by " "pressing CTRL+M" @@ -7474,87 +8921,80 @@ msgstr "" "활성화된 경우 CTRL+M을 눌러 레거시 3DConnexion 장치 설정 대화 상자를 사용할 " "수 있습니다." -#: src/slic3r/GUI/Preferences.cpp:314 +#: src/slic3r/GUI/Preferences.cpp:425 msgid "Camera" msgstr "카메라" -#: src/slic3r/GUI/Preferences.cpp:319 +#: src/slic3r/GUI/Preferences.cpp:435 msgid "Use perspective camera" msgstr "원근 보기 사용" -#: src/slic3r/GUI/Preferences.cpp:321 +#: src/slic3r/GUI/Preferences.cpp:436 msgid "" "If enabled, use perspective camera. If not enabled, use orthographic camera." msgstr "" "이 옵션을 사용하면 원근 보기모드를 사용합니다. 활성화되지 않은 경우 일반 보기" "를 사용합니다." -#: src/slic3r/GUI/Preferences.cpp:326 +#: src/slic3r/GUI/Preferences.cpp:440 msgid "Use free camera" msgstr "무료 카메라 사용" -#: src/slic3r/GUI/Preferences.cpp:328 +#: src/slic3r/GUI/Preferences.cpp:441 msgid "If enabled, use free camera. If not enabled, use constrained camera." msgstr "" "활성화된 경우 무료 카메라를 사용합니다. 활성화되지 않은 경우 제한된 카메라를 " "사용합니다." -#: src/slic3r/GUI/Preferences.cpp:333 +#: src/slic3r/GUI/Preferences.cpp:445 msgid "Reverse direction of zoom with mouse wheel" msgstr "마우스 휠을 가진 줌의 역방향" -#: src/slic3r/GUI/Preferences.cpp:335 +#: src/slic3r/GUI/Preferences.cpp:446 msgid "If enabled, reverses the direction of zoom with mouse wheel" msgstr "활성화된 경우 마우스 휠로 줌 방향을 반전시다." -#: src/slic3r/GUI/Preferences.cpp:343 +#: src/slic3r/GUI/Preferences.cpp:452 msgid "GUI" msgstr "GUI" -#: src/slic3r/GUI/Preferences.cpp:366 +#: src/slic3r/GUI/Preferences.cpp:492 msgid "Sequential slider applied only to top layer" msgstr "위쪽 레이어에만 적용된 순차 슬라이더" -#: src/slic3r/GUI/Preferences.cpp:368 +#: src/slic3r/GUI/Preferences.cpp:493 msgid "" "If enabled, changes made using the sequential slider, in preview, apply only " -"to gcode top layer. If disabled, changes made using the sequential slider, " -"in preview, apply to the whole gcode." +"to gcode top layer.If disabled, changes made using the sequential slider, in " +"preview, apply to the whole gcode." msgstr "" -"활성화된 경우 미리 보기에서 순차 슬라이더를 사용하여 변경한 내용은 gcode 상" -"단 레이어에만 적용됩니다. 비활성화된 경우 순차 슬라이더를 사용하여 변경한 내" -"용을 미리 보기에서 전체 gcode에 적용됩니다." -#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/Preferences.cpp:499 msgid "Show sidebar collapse/expand button" msgstr "사이드바 붕괴/확장 버튼 표시" -#: src/slic3r/GUI/Preferences.cpp:377 +#: src/slic3r/GUI/Preferences.cpp:500 msgid "" "If enabled, the button for the collapse sidebar will be appeared in top " "right corner of the 3D Scene" msgstr "" "활성화되면 붕괴 사이드바의 버튼이 3D 장면의 오른쪽 상단 모서리에 나타납니다." -#: src/slic3r/GUI/Preferences.cpp:384 -msgid "If enabled, PrusaSlicer will not open hyperlinks in your browser." -msgstr "" - -#: src/slic3r/GUI/Preferences.cpp:391 +#: src/slic3r/GUI/Preferences.cpp:511 msgid "Use colors for axes values in Manipulation panel" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:393 +#: src/slic3r/GUI/Preferences.cpp:512 msgid "" "If enabled, the axes names and axes values will be colorized according to " "the axes colors. If disabled, old UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:399 +#: src/slic3r/GUI/Preferences.cpp:517 msgid "Order object volumes by types" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:401 +#: src/slic3r/GUI/Preferences.cpp:518 msgid "" "If enabled, volumes will be always ordered inside the object. Correct order " "is Model Part, Negative Volume, Modifier, Support Blocker and Support " @@ -7562,193 +9002,240 @@ msgid "" "Modifiers. But one of the model parts have to be on the first place." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:408 +#: src/slic3r/GUI/Preferences.cpp:523 +msgid "Show non-manifold edges" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:524 +msgid "If enabled, shows non-manifold edges." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:528 +msgid "Allow automatically color change" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:529 +msgid "" +"If enabled, related notification will be shown, when sliced object looks " +"like a logo or a sign." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:534 msgid "Set settings tabs as menu items (experimental)" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:410 +#: src/slic3r/GUI/Preferences.cpp:535 msgid "" "If enabled, Settings Tabs will be placed as menu items. If disabled, old UI " "will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:419 +#: src/slic3r/GUI/Preferences.cpp:542 msgid "Show \"Tip of the day\" notification after start" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:421 +#: src/slic3r/GUI/Preferences.cpp:543 msgid "If enabled, useful hints are displayed at startup." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:427 +#: src/slic3r/GUI/Preferences.cpp:547 msgid "Notify about new releases" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:429 +#: src/slic3r/GUI/Preferences.cpp:548 msgid "" "You will be notified about new release after startup acordingly: All = " "Regular release and alpha / beta releases. Release only = regular release." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:435 +#: src/slic3r/GUI/Preferences.cpp:551 msgid "Release only" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:444 +#: src/slic3r/GUI/Preferences.cpp:558 msgid "Use custom size for toolbar icons" msgstr "도구 모음 아이콘에 사용자 지정 크기 사용" -#: src/slic3r/GUI/Preferences.cpp:446 +#: src/slic3r/GUI/Preferences.cpp:559 msgid "If enabled, you can change size of toolbar icons manually." msgstr "활성화된 경우 도구 모음 아이콘의 크기를 수동으로 변경할 수 있습니다." -#: src/slic3r/GUI/Preferences.cpp:471 +#: src/slic3r/GUI/Preferences.cpp:577 src/slic3r/GUI/Tab.cpp:1659 +msgid "Other" +msgstr "기타" + +#: src/slic3r/GUI/Preferences.cpp:594 +msgid "If enabled, PrusaSlicer will not open a hyperlinks in your browser." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:600 +msgid "Allow downloads from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:601 +msgid "If enabled, PrusaSlicer will be allowed to download from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:610 msgid "Render" msgstr "렌더링" -#: src/slic3r/GUI/Preferences.cpp:476 +#: src/slic3r/GUI/Preferences.cpp:620 msgid "Use environment map" msgstr "환경 맵 사용" -#: src/slic3r/GUI/Preferences.cpp:478 +#: src/slic3r/GUI/Preferences.cpp:621 msgid "If enabled, renders object using the environment map." msgstr "활성화된 경우 환경 맵을 사용하여 개체를 렌더링합니다." -#: src/slic3r/GUI/Preferences.cpp:491 +#: src/slic3r/GUI/Preferences.cpp:629 msgid "Dark mode (experimental)" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:496 +#: src/slic3r/GUI/Preferences.cpp:639 msgid "Enable dark mode" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:498 +#: src/slic3r/GUI/Preferences.cpp:640 msgid "" "If enabled, UI will use Dark mode colors. If disabled, old UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:507 +#: src/slic3r/GUI/Preferences.cpp:647 msgid "Use system menu for application" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:509 +#: src/slic3r/GUI/Preferences.cpp:648 msgid "" "If enabled, application will use the standard Windows system menu,\n" -"but on some combination of display scales it can looks ugly. If disabled, " -"old UI will be used." +"but on some combination od display scales it can look ugly. If disabled, old " +"UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:578 +#: src/slic3r/GUI/Preferences.cpp:726 msgid "Changes for the critical options" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:580 +#: src/slic3r/GUI/Preferences.cpp:728 msgid "" "Changing some options will trigger application restart.\n" "You will lose the content of the plater." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:694 +#: src/slic3r/GUI/Preferences.cpp:921 msgid "Icon size in a respect to the default size" msgstr "기본 크기에 대한 아이콘 크기" -#: src/slic3r/GUI/Preferences.cpp:709 +#: src/slic3r/GUI/Preferences.cpp:936 msgid "Select toolbar icon size in respect to the default one." msgstr "기본 아이콘과 관련하여 도구 모음 아이콘 크기를 선택합니다." -#: src/slic3r/GUI/Preferences.cpp:743 src/slic3r/GUI/Preferences.cpp:754 +#: src/slic3r/GUI/Preferences.cpp:972 +msgid "Layout Options" +msgstr "레이아웃 옵션" + +#: src/slic3r/GUI/Preferences.cpp:981 msgid "Old regular layout with the tab bar" msgstr "탭 표시줄이 있는 오래된 일반 레이아웃" -#: src/slic3r/GUI/Preferences.cpp:744 +#: src/slic3r/GUI/Preferences.cpp:982 msgid "New layout, access via settings button in the top menu" msgstr "새 레이아웃, 상단 메뉴의 설정 버튼을 통해 액세스" -#: src/slic3r/GUI/Preferences.cpp:745 src/slic3r/GUI/Preferences.cpp:755 +#: src/slic3r/GUI/Preferences.cpp:983 msgid "Settings in non-modal window" msgstr "모달이 아닌 창의 설정" -#: src/slic3r/GUI/Preferences.cpp:763 -msgid "Layout Options" -msgstr "레이아웃 옵션" - -#: src/slic3r/GUI/Preferences.cpp:806 +#: src/slic3r/GUI/Preferences.cpp:1025 msgid "Text colors" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:249 -#: src/slic3r/GUI/PresetComboBoxes.cpp:287 -#: src/slic3r/GUI/PresetComboBoxes.cpp:794 -#: src/slic3r/GUI/PresetComboBoxes.cpp:849 -#: src/slic3r/GUI/PresetComboBoxes.cpp:989 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1033 +#: src/slic3r/GUI/Preferences.cpp:1049 +msgid "Mode markers" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:254 +#: src/slic3r/GUI/PresetComboBoxes.cpp:306 +#: src/slic3r/GUI/PresetComboBoxes.cpp:846 +#: src/slic3r/GUI/PresetComboBoxes.cpp:909 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1073 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1125 msgid "System presets" msgstr "시스템 기본설정" -#: src/slic3r/GUI/PresetComboBoxes.cpp:291 -#: src/slic3r/GUI/PresetComboBoxes.cpp:853 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1037 +#: src/slic3r/GUI/PresetComboBoxes.cpp:310 +#: src/slic3r/GUI/PresetComboBoxes.cpp:915 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1130 msgid "User presets" msgstr "사용자 사전설정" -#: src/slic3r/GUI/PresetComboBoxes.cpp:302 +#: src/slic3r/GUI/PresetComboBoxes.cpp:321 msgid "Incompatible presets" msgstr "호환되지 않는 사전 설정" -#: src/slic3r/GUI/PresetComboBoxes.cpp:337 +#: src/slic3r/GUI/PresetComboBoxes.cpp:364 #, boost-format msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "\"%1%\" 프린터를 삭제하시겠습니까?" -#: src/slic3r/GUI/PresetComboBoxes.cpp:340 +#: src/slic3r/GUI/PresetComboBoxes.cpp:366 msgid "Delete Physical Printer" msgstr "실제 프린터 삭제" -#: src/slic3r/GUI/PresetComboBoxes.cpp:581 +#: src/slic3r/GUI/PresetComboBoxes.cpp:612 msgid "Click to edit preset" msgstr "사전 설정을 편집 하려면 클릭 하십시오" -#: src/slic3r/GUI/PresetComboBoxes.cpp:697 -#: src/slic3r/GUI/PresetComboBoxes.cpp:737 +#: src/slic3r/GUI/PresetComboBoxes.cpp:740 +#: src/slic3r/GUI/PresetComboBoxes.cpp:788 msgid "Add/Remove presets" msgstr "사전 설정 추가/제거" -#: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:745 +#: src/slic3r/GUI/PresetComboBoxes.cpp:793 src/slic3r/GUI/Tab.cpp:3312 msgid "Add physical printer" msgstr "실제 프린터 추가" -#: src/slic3r/GUI/PresetComboBoxes.cpp:716 +#: src/slic3r/GUI/PresetComboBoxes.cpp:759 msgid "Edit preset" msgstr "사전 설정 편집" -#: src/slic3r/GUI/PresetComboBoxes.cpp:722 +#: src/slic3r/GUI/PresetComboBoxes.cpp:765 msgid "Change extruder color" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:773 src/slic3r/GUI/Tab.cpp:3312 msgid "Edit physical printer" msgstr "실제 프린터 편집" -#: src/slic3r/GUI/PresetComboBoxes.cpp:733 +#: src/slic3r/GUI/PresetComboBoxes.cpp:779 +msgid "Open physical printer URL" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:784 msgid "Delete physical printer" msgstr "실제 프린터 삭제" -#: src/slic3r/GUI/PresetComboBoxes.cpp:864 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1051 +#: src/slic3r/GUI/PresetComboBoxes.cpp:924 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1142 +msgid "Template presets" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:935 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1156 msgid "Physical printers" msgstr "실제 프린터" -#: src/slic3r/GUI/PresetComboBoxes.cpp:888 +#: src/slic3r/GUI/PresetComboBoxes.cpp:959 msgid "Add/Remove filaments" msgstr "필라멘트 추가/제거" -#: src/slic3r/GUI/PresetComboBoxes.cpp:890 +#: src/slic3r/GUI/PresetComboBoxes.cpp:961 msgid "Add/Remove materials" msgstr "재질 추가/제거" -#: src/slic3r/GUI/PresetComboBoxes.cpp:892 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1075 +#: src/slic3r/GUI/PresetComboBoxes.cpp:963 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1180 msgid "Add/Remove printers" msgstr "프린터 추가/제거" @@ -7929,98 +9416,107 @@ msgstr "최소 바닥 쉘 두께는 %1% mm입니다." msgid "Bottom is open." msgstr "바닥이 열려 있습니다." -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Send G-Code to printer host" msgstr "프린터 호스트에 G 코드 보내기" -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Upload to Printer Host with the following filename:" msgstr "다음 파일 이름으로 프린터 호스트에 업로드:" -#: src/slic3r/GUI/PrintHostDialogs.cpp:51 +#: src/slic3r/GUI/PrintHostDialogs.cpp:55 msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "필요한 경우 디렉토리 분리 기호로 슬래시 (/ ) 를 사용하십시오." -#: src/slic3r/GUI/PrintHostDialogs.cpp:60 +#: src/slic3r/GUI/PrintHostDialogs.cpp:64 msgid "Group" msgstr "그룹" -#: src/slic3r/GUI/PrintHostDialogs.cpp:84 +#: src/slic3r/GUI/PrintHostDialogs.cpp:74 +msgid "Upload to storage:" +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:83 +msgid "Upload to storage: " +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:105 #, c-format, boost-format msgid "Upload filename doesn't end with \"%s\". Do you wish to continue?" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:91 +#: src/slic3r/GUI/PrintHostDialogs.cpp:112 msgid "Upload" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:101 -msgid "Upload and Print" +#: src/slic3r/GUI/PrintHostDialogs.cpp:122 +msgid "Upload to Queue" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:112 +#: src/slic3r/GUI/PrintHostDialogs.cpp:143 msgid "Upload and Simulate" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:247 +#: src/slic3r/GUI/PrintHostDialogs.cpp:298 msgid "ID" msgstr "ID" -#: src/slic3r/GUI/PrintHostDialogs.cpp:248 +#: src/slic3r/GUI/PrintHostDialogs.cpp:299 msgid "Progress" msgstr "진행" -#: src/slic3r/GUI/PrintHostDialogs.cpp:249 +#: src/slic3r/GUI/PrintHostDialogs.cpp:300 msgid "Status" msgstr "상태" -#: src/slic3r/GUI/PrintHostDialogs.cpp:250 +#: src/slic3r/GUI/PrintHostDialogs.cpp:301 msgid "Host" msgstr "호스트" -#: src/slic3r/GUI/PrintHostDialogs.cpp:251 +#: src/slic3r/GUI/PrintHostDialogs.cpp:302 msgctxt "OfFile" msgid "Size" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:252 +#: src/slic3r/GUI/PrintHostDialogs.cpp:303 msgid "Filename" msgstr "파일이름" -#: src/slic3r/GUI/PrintHostDialogs.cpp:253 -msgid "Error Message" -msgstr "에러 메시지" +#: src/slic3r/GUI/PrintHostDialogs.cpp:304 +#, fuzzy +msgid "Message" +msgstr "알림 : %s" -#: src/slic3r/GUI/PrintHostDialogs.cpp:256 +#: src/slic3r/GUI/PrintHostDialogs.cpp:308 msgid "Cancel selected" msgstr "선택한 취소" -#: src/slic3r/GUI/PrintHostDialogs.cpp:258 +#: src/slic3r/GUI/PrintHostDialogs.cpp:310 msgid "Show error message" msgstr "오류 메시지 표시" -#: src/slic3r/GUI/PrintHostDialogs.cpp:316 -#: src/slic3r/GUI/PrintHostDialogs.cpp:371 +#: src/slic3r/GUI/PrintHostDialogs.cpp:368 +#: src/slic3r/GUI/PrintHostDialogs.cpp:423 msgid "Enqueued" msgstr "입력됨" -#: src/slic3r/GUI/PrintHostDialogs.cpp:372 +#: src/slic3r/GUI/PrintHostDialogs.cpp:424 msgid "Uploading" msgstr "업로드 중" -#: src/slic3r/GUI/PrintHostDialogs.cpp:374 +#: src/slic3r/GUI/PrintHostDialogs.cpp:426 msgid "Cancelling" msgstr "취소하기" -#: src/slic3r/GUI/PrintHostDialogs.cpp:375 +#: src/slic3r/GUI/PrintHostDialogs.cpp:427 msgid "Cancelled" msgstr "취소됨" -#: src/slic3r/GUI/PrintHostDialogs.cpp:376 +#: src/slic3r/GUI/PrintHostDialogs.cpp:428 msgid "Completed" msgstr "완료됨" -#: src/slic3r/GUI/PrintHostDialogs.cpp:424 +#: src/slic3r/GUI/PrintHostDialogs.cpp:476 msgid "Error uploading to print host:" msgstr "인쇄 호스트에 대한 오류 업로드:" @@ -8028,13 +9524,13 @@ msgstr "인쇄 호스트에 대한 오류 업로드:" msgid "NO RAMMING AT ALL" msgstr "전혀 충돌 없음" -#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 -#: src/libslic3r/PrintConfig.cpp:955 src/libslic3r/PrintConfig.cpp:999 -#: src/libslic3r/PrintConfig.cpp:1014 src/libslic3r/PrintConfig.cpp:3297 -#: src/libslic3r/PrintConfig.cpp:3306 src/libslic3r/PrintConfig.cpp:3315 -#: src/libslic3r/PrintConfig.cpp:3456 src/libslic3r/PrintConfig.cpp:3464 -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3479 -#: src/libslic3r/PrintConfig.cpp:3487 src/libslic3r/PrintConfig.cpp:3495 +#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/libslic3r/PrintConfig.cpp:1044 src/libslic3r/PrintConfig.cpp:1088 +#: src/libslic3r/PrintConfig.cpp:1103 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3578 src/libslic3r/PrintConfig.cpp:3587 +#: src/libslic3r/PrintConfig.cpp:3733 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3749 src/libslic3r/PrintConfig.cpp:3756 +#: src/libslic3r/PrintConfig.cpp:3764 src/libslic3r/PrintConfig.cpp:3772 msgid "s" msgstr "s" @@ -8042,43 +9538,64 @@ msgstr "s" msgid "Volumetric speed" msgstr "용적(Volumetric) 스피트" -#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:912 -#: src/libslic3r/PrintConfig.cpp:1824 +#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:1001 +#: src/libslic3r/PrintConfig.cpp:1861 msgid "mm³/s" msgstr "mm³/s²" -#: src/slic3r/GUI/SavePresetDialog.cpp:57 +#: src/slic3r/GUI/SavePresetDialog.cpp:90 +#, c-format, boost-format +msgid "Rename %s to:" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:90 #, c-format, boost-format msgid "Save %s as:" msgstr "%s 파일을 저장 합니다:" -#: src/slic3r/GUI/SavePresetDialog.cpp:101 -#: src/slic3r/GUI/SavePresetDialog.cpp:109 +#: src/slic3r/GUI/SavePresetDialog.cpp:165 +#: src/slic3r/GUI/SavePresetDialog.cpp:173 msgid "The supplied name is not valid;" msgstr "제공된 이름이 유효하지 않습니다;" -#: src/slic3r/GUI/SavePresetDialog.cpp:110 +#: src/slic3r/GUI/SavePresetDialog.cpp:174 msgid "the following suffix is not allowed:" msgstr "다음 접미사는 허용되지 않습니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:116 +#: src/slic3r/GUI/SavePresetDialog.cpp:180 msgid "The supplied name is not available." msgstr "제공된 이름을 사용할 수 없다." -#: src/slic3r/GUI/SavePresetDialog.cpp:122 +#: src/slic3r/GUI/SavePresetDialog.cpp:186 +msgid "The supplied name is used for a system profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:187 msgid "Cannot overwrite a system profile." msgstr "시스템 프로파일을 겹쳐 쓸 수 없습니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:127 +#: src/slic3r/GUI/SavePresetDialog.cpp:192 +msgid "The supplied name is used for a external profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:193 msgid "Cannot overwrite an external profile." msgstr "외부 프로필을 덮어 쓸 수 없습니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:134 +#: src/slic3r/GUI/SavePresetDialog.cpp:203 +msgid "Save preset modifications to existing user profile" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:205 +msgid "Nothing changed" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:210 #, boost-format msgid "Preset with name \"%1%\" already exists." msgstr "이름 \"%1%\"로 미리 설정이 이미 존재합니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:136 +#: src/slic3r/GUI/SavePresetDialog.cpp:212 #, boost-format msgid "" "Preset with name \"%1%\" already exists and is incompatible with selected " @@ -8086,37 +9603,52 @@ msgid "" msgstr "" "이름 \"%1%\"로 미리 설정이 이미 존재하며 선택한 프린터와 호환되지 않습니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:137 +#: src/slic3r/GUI/SavePresetDialog.cpp:213 msgid "Note: This preset will be replaced after saving" msgstr "참고: 이 사전 설정은 저장 후 대체됩니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:142 +#: src/slic3r/GUI/SavePresetDialog.cpp:219 msgid "The name cannot be empty." msgstr "이름은 비어 있을 수 없습니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:147 +#: src/slic3r/GUI/SavePresetDialog.cpp:230 +msgid "The name is too long." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:235 msgid "The name cannot start with space character." msgstr "이름은 공간 문자로 시작할 수 없습니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:152 +#: src/slic3r/GUI/SavePresetDialog.cpp:240 msgid "The name cannot end with space character." msgstr "이름은 공간 문자로 끝날 수 없습니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:157 +#: src/slic3r/GUI/SavePresetDialog.cpp:245 msgid "The name cannot be the same as a preset alias name." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:191 -#: src/slic3r/GUI/SavePresetDialog.cpp:197 +#: src/slic3r/GUI/SavePresetDialog.cpp:289 msgid "Save preset" msgstr "프리셋 저장" -#: src/slic3r/GUI/SavePresetDialog.cpp:221 +#: src/slic3r/GUI/SavePresetDialog.cpp:295 +msgid "Save presets" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:302 +msgid "Rename preset" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:327 msgctxt "PresetName" msgid "Copy" msgstr "복사" -#: src/slic3r/GUI/SavePresetDialog.cpp:283 +#: src/slic3r/GUI/SavePresetDialog.cpp:347 +msgid "Save as profile derived from current printer only." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:407 #, boost-format msgid "" "You have selected physical printer \"%1%\" \n" @@ -8125,82 +9657,94 @@ msgstr "" "실제 프린터 \"%1%\"를 선택했습니다. \n" "관련 프린터 사전 설정 \"%2%\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:322 +#: src/slic3r/GUI/SavePresetDialog.cpp:446 #, boost-format msgid "What would you like to do with \"%1%\" preset after saving?" msgstr "저장 후 \"%1%\" 사전 설정으로 무엇을 하고 싶습니까?" -#: src/slic3r/GUI/SavePresetDialog.cpp:325 +#: src/slic3r/GUI/SavePresetDialog.cpp:449 #, boost-format msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" msgstr "이 실제 프린터 \"%3%\"에 대해 \"%1%\"을 \"%2%\"로 변경" -#: src/slic3r/GUI/SavePresetDialog.cpp:326 +#: src/slic3r/GUI/SavePresetDialog.cpp:450 #, boost-format msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" msgstr "실제 프린터 \"%2%\"의 다음 사전 설정으로 \"%1%\"를 추가합니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:327 +#: src/slic3r/GUI/SavePresetDialog.cpp:451 #, boost-format msgid "Just switch to \"%1%\" preset" msgstr "\"%1%\" 사전 설정으로 전환하기만 하면 됩니다." -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2652 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2645 msgid "Stealth" msgstr "스텔스" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2646 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2639 msgid "Normal" msgstr "보통" -#: src/slic3r/GUI/Selection.cpp:168 +#: src/slic3r/GUI/Selection.cpp:180 msgid "Selection-Add" msgstr "선택 추가" -#: src/slic3r/GUI/Selection.cpp:209 +#: src/slic3r/GUI/Selection.cpp:221 msgid "Selection-Remove" msgstr "선택 영역 제거" -#: src/slic3r/GUI/Selection.cpp:241 +#: src/slic3r/GUI/Selection.cpp:253 msgid "Selection-Add Object" msgstr "선택 추가 개체" -#: src/slic3r/GUI/Selection.cpp:260 +#: src/slic3r/GUI/Selection.cpp:272 msgid "Selection-Remove Object" msgstr "선택 제거 개체" -#: src/slic3r/GUI/Selection.cpp:278 +#: src/slic3r/GUI/Selection.cpp:290 msgid "Selection-Add Instance" msgstr "선택 추가 인스턴스" -#: src/slic3r/GUI/Selection.cpp:297 +#: src/slic3r/GUI/Selection.cpp:309 msgid "Selection-Remove Instance" msgstr "선택 제거 인스턴스" -#: src/slic3r/GUI/Selection.cpp:394 +#: src/slic3r/GUI/Selection.cpp:406 msgid "Selection-Add All" msgstr "선택 추가 모두" -#: src/slic3r/GUI/Selection.cpp:419 +#: src/slic3r/GUI/Selection.cpp:431 msgid "Selection-Remove All" msgstr "선택 영역 제거" -#: src/slic3r/GUI/Selection.cpp:950 +#: src/slic3r/GUI/Selection.cpp:1309 msgid "Scale To Fit" msgstr "크기 조정" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:114 +#: src/slic3r/GUI/Selection.cpp:1691 +msgid "" +"The currently manipulated object is tilted or contains tilted parts " +"(rotation angles are not multiples of 90°). Non-uniform scaling of tilted " +"objects is only possible in non-local coordinate systems, once the rotation " +"is embedded into the object coordinates." +msgstr "" + +#: src/slic3r/GUI/Selection.cpp:1694 +msgid "This operation is irreversible." +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:117 msgid "Data to send" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:550 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:618 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:557 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:624 msgid "Send system info" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:581 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:587 #, boost-format msgid "" "This is the first time you are running %1%. We would like to ask you to send " @@ -8209,18 +9753,18 @@ msgid "" "version)." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:585 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:591 msgid "" "If we know your hardware, operating system, etc., it will greatly help us in " "development and prioritization, because we will be able to focus our effort " "more efficiently and spend time on features that are needed the most." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:588 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:594 msgid "Is it safe?" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:590 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:596 #, boost-format msgid "" "We do not send any personal information nor anything that would allow us to " @@ -8231,81 +9775,86 @@ msgid "" "inspect the code actually performing the communication, see %1%." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:614 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:620 msgid "Show verbatim data that will be sent" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:616 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:622 msgid "Ask me next time" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:617 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:623 msgid "Do not send anything" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:703 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:709 msgid "System info sent successfully. Thank you." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:706 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:712 msgid "Sending system info failed!" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:713 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:719 msgid "Sending system info was cancelled." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:720 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:726 msgid "Sending system info..." msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:84 +#: src/slic3r/GUI/SysInfoDialog.cpp:92 msgid "System Information" msgstr "시스템 정보" -#: src/slic3r/GUI/SysInfoDialog.cpp:150 +#: src/slic3r/GUI/SysInfoDialog.cpp:160 msgid "Blacklisted libraries loaded into PrusaSlicer process:" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:162 +#: src/slic3r/GUI/SysInfoDialog.cpp:172 msgid "Eigen vectorization supported:" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:169 +#: src/slic3r/GUI/SysInfoDialog.cpp:179 msgid "Copy to Clipboard" msgstr "클립보드에 복사" -#: src/slic3r/GUI/Tab.cpp:114 src/libslic3r/PrintConfig.cpp:565 +#: src/slic3r/GUI/Tab.cpp:68 src/libslic3r/PrintConfig.cpp:668 msgid "Compatible printers" msgstr "호환 가능한 프린터 조건" -#: src/slic3r/GUI/Tab.cpp:115 +#: src/slic3r/GUI/Tab.cpp:69 msgid "Select the printers this profile is compatible with." msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요." -#: src/slic3r/GUI/Tab.cpp:120 src/libslic3r/PrintConfig.cpp:580 +#: src/slic3r/GUI/Tab.cpp:74 src/libslic3r/PrintConfig.cpp:683 msgid "Compatible print profiles" msgstr "호환되는 인쇄 프로 파일" -#: src/slic3r/GUI/Tab.cpp:121 +#: src/slic3r/GUI/Tab.cpp:75 msgid "Select the print profiles this profile is compatible with." msgstr "이 프로필이 호환되는 인쇄 프로필을 선택 합니다." -#: src/slic3r/GUI/Tab.cpp:216 +#: src/slic3r/GUI/Tab.cpp:165 msgid "Compare this preset with some another" msgstr "" #. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:218 +#: src/slic3r/GUI/Tab.cpp:167 #, c-format, boost-format msgid "Save current %s" msgstr "현재 %s 저장" -#: src/slic3r/GUI/Tab.cpp:219 +#: src/slic3r/GUI/Tab.cpp:168 +#, c-format, boost-format +msgid "Rename current %s" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:170 msgid "Delete this preset" msgstr "이전 설정 삭제" -#: src/slic3r/GUI/Tab.cpp:223 +#: src/slic3r/GUI/Tab.cpp:174 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." @@ -8313,241 +9862,249 @@ msgstr "" "버튼 위로 커서를 올려 놓으면 자세한 정보가 나옵니다.\n" "또는 이 버튼을 클릭하십시오." -#: src/slic3r/GUI/Tab.cpp:227 +#: src/slic3r/GUI/Tab.cpp:178 #, boost-format msgid "Search in settings [%1%]" msgstr "설정 검색 [%1%]" -#: src/slic3r/GUI/Tab.cpp:1298 +#: src/slic3r/GUI/Tab.cpp:1243 msgid "Detach from system preset" msgstr "시스템 사전 설정에서 분리" -#: src/slic3r/GUI/Tab.cpp:1311 +#: src/slic3r/GUI/Tab.cpp:1256 msgid "" "A copy of the current system preset will be created, which will be detached " "from the system preset." msgstr "" "현재 시스템 사전 설정의 복사본이 생성되며 시스템 사전 설정에서 분리됩니다." -#: src/slic3r/GUI/Tab.cpp:1312 +#: src/slic3r/GUI/Tab.cpp:1257 msgid "" "The current custom preset will be detached from the parent system preset." msgstr "현재 사용자 지정 사전 설정은 상위 시스템 사전 설정에서 분리됩니다." -#: src/slic3r/GUI/Tab.cpp:1315 +#: src/slic3r/GUI/Tab.cpp:1260 msgid "Modifications to the current profile will be saved." msgstr "현재 프로필에 대한 수정 사항이 저장됩니다." -#: src/slic3r/GUI/Tab.cpp:1321 +#: src/slic3r/GUI/Tab.cpp:1266 msgid "Detach preset" msgstr "분리 사전 설정" -#: src/slic3r/GUI/Tab.cpp:1347 +#: src/slic3r/GUI/Tab.cpp:1292 msgid "This is a default preset." msgstr "기본 사전 설정입니다." -#: src/slic3r/GUI/Tab.cpp:1349 +#: src/slic3r/GUI/Tab.cpp:1294 msgid "This is a system preset." msgstr "시스템 사전 설정입니다." -#: src/slic3r/GUI/Tab.cpp:1351 +#: src/slic3r/GUI/Tab.cpp:1296 msgid "Current preset is inherited from the default preset." msgstr "현재 사전 설정은 기본 사전 설정에서 상속됩니다." -#: src/slic3r/GUI/Tab.cpp:1355 +#: src/slic3r/GUI/Tab.cpp:1300 msgid "Current preset is inherited from" msgstr "현재 사전 설정은 에서 상속됩니다." -#: src/slic3r/GUI/Tab.cpp:1359 +#: src/slic3r/GUI/Tab.cpp:1304 msgid "It can't be deleted or modified." msgstr "삭제하거나 수정할 수 없습니다." -#: src/slic3r/GUI/Tab.cpp:1360 +#: src/slic3r/GUI/Tab.cpp:1305 msgid "" "Any modifications should be saved as a new preset inherited from this one." msgstr "모든 수정 사항은 이 항목에서 받은 기본 설정으로 저장해야합니다." -#: src/slic3r/GUI/Tab.cpp:1361 +#: src/slic3r/GUI/Tab.cpp:1306 msgid "To do that please specify a new name for the preset." msgstr "그렇게 하려면 새 이름을 지정하십시오." -#: src/slic3r/GUI/Tab.cpp:1365 +#: src/slic3r/GUI/Tab.cpp:1310 msgid "Additional information:" msgstr "추가 정보:" -#: src/slic3r/GUI/Tab.cpp:1371 +#: src/slic3r/GUI/Tab.cpp:1316 msgid "printer model" msgstr "프린터 모델" -#: src/slic3r/GUI/Tab.cpp:1379 +#: src/slic3r/GUI/Tab.cpp:1324 msgid "default print profile" msgstr "기본 인쇄 프로필" -#: src/slic3r/GUI/Tab.cpp:1382 +#: src/slic3r/GUI/Tab.cpp:1327 msgid "default filament profile" msgstr "기본 필라멘트 프로파일" -#: src/slic3r/GUI/Tab.cpp:1396 +#: src/slic3r/GUI/Tab.cpp:1341 msgid "default SLA material profile" msgstr "기본 SLA 재질 프로파일" -#: src/slic3r/GUI/Tab.cpp:1400 +#: src/slic3r/GUI/Tab.cpp:1345 msgid "default SLA print profile" msgstr "기본 SLA 인쇄 프로필" -#: src/slic3r/GUI/Tab.cpp:1408 +#: src/slic3r/GUI/Tab.cpp:1353 msgid "full profile name" msgstr "전체 프로필 이름" -#: src/slic3r/GUI/Tab.cpp:1409 +#: src/slic3r/GUI/Tab.cpp:1354 msgid "symbolic profile name" msgstr "기호 프로필 이름" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4657 +#: src/slic3r/GUI/Tab.cpp:1392 src/slic3r/GUI/Tab.cpp:4940 msgid "Layers and perimeters" msgstr "레이어 및 둘레" -#: src/slic3r/GUI/Tab.cpp:1453 +#: src/slic3r/GUI/Tab.cpp:1398 msgid "Vertical shells" msgstr "수직 쉘" -#: src/slic3r/GUI/Tab.cpp:1465 +#: src/slic3r/GUI/Tab.cpp:1410 msgid "Horizontal shells" msgstr "수평 쉘" -#: src/slic3r/GUI/Tab.cpp:1466 src/libslic3r/PrintConfig.cpp:2417 +#: src/slic3r/GUI/Tab.cpp:1411 src/libslic3r/PrintConfig.cpp:2448 msgid "Solid layers" msgstr "탑 솔리드 레이어" -#: src/slic3r/GUI/Tab.cpp:1471 +#: src/slic3r/GUI/Tab.cpp:1416 msgid "Minimum shell thickness" msgstr "최소 쉘 두께" -#: src/slic3r/GUI/Tab.cpp:1482 +#: src/slic3r/GUI/Tab.cpp:1427 msgid "Quality (slower slicing)" msgstr "품질(느린 슬라이싱)" -#: src/slic3r/GUI/Tab.cpp:1497 +#: src/slic3r/GUI/Tab.cpp:1444 msgid "Fuzzy skin (experimental)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1520 +#: src/slic3r/GUI/Tab.cpp:1467 msgid "Reducing printing time" msgstr "인쇄 시간 단축" -#: src/slic3r/GUI/Tab.cpp:1535 src/libslic3r/ExtrusionEntity.cpp:370 +#: src/slic3r/GUI/Tab.cpp:1482 msgid "Skirt" msgstr "스커트" -#: src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1504 msgid "Raft" msgstr "서포트와 라프트 재료를 선택" -#: src/slic3r/GUI/Tab.cpp:1562 +#: src/slic3r/GUI/Tab.cpp:1509 msgid "Options for support material and raft" msgstr "서포트와 라프트 재료를 선택" -#: src/slic3r/GUI/Tab.cpp:1582 +#: src/slic3r/GUI/Tab.cpp:1528 +msgid "Organic supports" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1537 msgid "Speed for print moves" msgstr "인쇄 이동 속도" -#: src/slic3r/GUI/Tab.cpp:1595 +#: src/slic3r/GUI/Tab.cpp:1550 +msgid "Dynamic overhang speed" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1557 msgid "Speed for non-print moves" msgstr "인쇄되지 않은 이동속도" -#: src/slic3r/GUI/Tab.cpp:1599 +#: src/slic3r/GUI/Tab.cpp:1561 msgid "Modifiers" msgstr "수정" -#: src/slic3r/GUI/Tab.cpp:1603 +#: src/slic3r/GUI/Tab.cpp:1565 msgid "Acceleration control (advanced)" msgstr "가속 제어(고급)" -#: src/slic3r/GUI/Tab.cpp:1614 +#: src/slic3r/GUI/Tab.cpp:1576 msgid "Autospeed (advanced)" msgstr "오토스피드(고급)" -#: src/slic3r/GUI/Tab.cpp:1618 +#: src/slic3r/GUI/Tab.cpp:1580 msgid "Pressure equalizer (experimental)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1622 +#: src/slic3r/GUI/Tab.cpp:1584 msgid "Multiple Extruders" msgstr "" "노즐 지름이 다른 여러 압출기로 인쇄. 지원이 현재 압출기 " "(support_material_extruder == 0 or support_material_interface_extruder == 0)" "로 인쇄되는 경우 모든 노즐은 동일한 지름이어야합니다." -#: src/slic3r/GUI/Tab.cpp:1630 +#: src/slic3r/GUI/Tab.cpp:1592 msgid "Ooze prevention" msgstr "스미즈 방지" -#: src/slic3r/GUI/Tab.cpp:1650 +#: src/slic3r/GUI/Tab.cpp:1596 +msgid "Wipe tower" +msgstr "와이프 타워 - 버려진 필라멘트 조절" + +#: src/slic3r/GUI/Tab.cpp:1612 msgid "Extrusion width" msgstr "돌출 폭" -#: src/slic3r/GUI/Tab.cpp:1660 +#: src/slic3r/GUI/Tab.cpp:1622 msgid "Overlap" msgstr "오버랩" -#: src/slic3r/GUI/Tab.cpp:1663 +#: src/slic3r/GUI/Tab.cpp:1625 msgid "Flow" msgstr "흐름도" -#: src/slic3r/GUI/Tab.cpp:1674 src/slic3r/GUI/Tab.cpp:1700 -msgid "Other" -msgstr "기타" - -#: src/slic3r/GUI/Tab.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:1636 msgid "Arachne perimeter generator" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1685 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1644 src/slic3r/GUI/Tab.cpp:4990 msgid "Output options" msgstr "출력 옵션" -#: src/slic3r/GUI/Tab.cpp:1686 +#: src/slic3r/GUI/Tab.cpp:1645 msgid "Sequential printing" msgstr "순차적 인쇄" -#: src/slic3r/GUI/Tab.cpp:1688 +#: src/slic3r/GUI/Tab.cpp:1647 msgid "Extruder clearance" msgstr "압출기 클리어런스" -#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:4735 +#: src/slic3r/GUI/Tab.cpp:1652 src/slic3r/GUI/Tab.cpp:4991 msgid "Output file" msgstr "출력 파일" -#: src/slic3r/GUI/Tab.cpp:1712 src/libslic3r/PrintConfig.cpp:2042 +#: src/slic3r/GUI/Tab.cpp:1671 src/libslic3r/PrintConfig.cpp:2072 msgid "Post-processing scripts" msgstr "포스트 프로세싱 스크립트" -#: src/slic3r/GUI/Tab.cpp:1724 src/slic3r/GUI/Tab.cpp:1725 -#: src/slic3r/GUI/Tab.cpp:2110 src/slic3r/GUI/Tab.cpp:2111 -#: src/slic3r/GUI/Tab.cpp:2498 src/slic3r/GUI/Tab.cpp:2499 -#: src/slic3r/GUI/Tab.cpp:2571 src/slic3r/GUI/Tab.cpp:2572 -#: src/slic3r/GUI/Tab.cpp:3957 src/slic3r/GUI/Tab.cpp:4585 -#: src/slic3r/GUI/Tab.cpp:4586 +#: src/slic3r/GUI/Tab.cpp:1683 src/slic3r/GUI/Tab.cpp:1684 +#: src/slic3r/GUI/Tab.cpp:2080 src/slic3r/GUI/Tab.cpp:2081 +#: src/slic3r/GUI/Tab.cpp:2486 src/slic3r/GUI/Tab.cpp:2487 +#: src/slic3r/GUI/Tab.cpp:2564 src/slic3r/GUI/Tab.cpp:2565 +#: src/slic3r/GUI/Tab.cpp:4182 src/slic3r/GUI/Tab.cpp:4822 +#: src/slic3r/GUI/Tab.cpp:4823 msgid "Notes" msgstr "메모" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:2088 +#: src/slic3r/GUI/Tab.cpp:2493 src/slic3r/GUI/Tab.cpp:2571 +#: src/slic3r/GUI/Tab.cpp:4830 src/slic3r/GUI/Tab.cpp:4996 msgid "Dependencies" msgstr "종속성" -#: src/slic3r/GUI/Tab.cpp:1732 src/slic3r/GUI/Tab.cpp:2119 -#: src/slic3r/GUI/Tab.cpp:2506 src/slic3r/GUI/Tab.cpp:2579 -#: src/slic3r/GUI/Tab.cpp:4594 src/slic3r/GUI/Tab.cpp:4741 +#: src/slic3r/GUI/Tab.cpp:1691 src/slic3r/GUI/Tab.cpp:2089 +#: src/slic3r/GUI/Tab.cpp:2494 src/slic3r/GUI/Tab.cpp:2572 +#: src/slic3r/GUI/Tab.cpp:4831 src/slic3r/GUI/Tab.cpp:4997 msgid "Profile dependencies" msgstr "프로파일 속한곳" -#: src/slic3r/GUI/Tab.cpp:1771 +#: src/slic3r/GUI/Tab.cpp:1723 msgid "Post processing scripts shall modify G-code file in place." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1850 +#: src/slic3r/GUI/Tab.cpp:1802 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8559,7 +10116,7 @@ msgid_plural "" "printing time estimation." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:1855 +#: src/slic3r/GUI/Tab.cpp:1807 msgid "Found reserved keywords in" msgstr "" @@ -8567,74 +10124,90 @@ msgstr "" msgid "Filament Overrides" msgstr "필라멘트 재정의" -#: src/slic3r/GUI/Tab.cpp:1992 +#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2827 +msgid "Retraction" +msgstr "리트랙션 후 최소 이동 거리" + +#: src/slic3r/GUI/Tab.cpp:1951 +msgid "Temperature" +msgstr "온도" + +#: src/slic3r/GUI/Tab.cpp:1955 msgid "Nozzle" msgstr "노즐" -#: src/slic3r/GUI/Tab.cpp:1997 +#: src/slic3r/GUI/Tab.cpp:1960 msgid "Bed" msgstr "침대" -#: src/slic3r/GUI/Tab.cpp:2002 +#: src/slic3r/GUI/Tab.cpp:1965 msgid "Cooling" msgstr "자동 냉각 사용" -#: src/slic3r/GUI/Tab.cpp:2004 src/libslic3r/PrintConfig.cpp:1936 -#: src/libslic3r/PrintConfig.cpp:2994 +#: src/slic3r/GUI/Tab.cpp:1967 src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "Enable" msgstr "활성화" -#: src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/Tab.cpp:1978 msgid "Fan settings" msgstr "팬 설정" -#: src/slic3r/GUI/Tab.cpp:2026 +#: src/slic3r/GUI/Tab.cpp:1979 +msgid "Fan speed" +msgstr "팬 속도" + +#: src/slic3r/GUI/Tab.cpp:1989 +msgid "Dynamic fan speeds" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1996 msgid "Cooling thresholds" msgstr "냉각 한계 값" -#: src/slic3r/GUI/Tab.cpp:2032 +#: src/slic3r/GUI/Tab.cpp:2002 msgid "Filament properties" msgstr "필라멘트 속성" -#: src/slic3r/GUI/Tab.cpp:2039 +#: src/slic3r/GUI/Tab.cpp:2009 msgid "Print speed override" msgstr "인쇄 속도 재정의" -#: src/slic3r/GUI/Tab.cpp:2049 +#: src/slic3r/GUI/Tab.cpp:2019 msgid "Wipe tower parameters" msgstr "타워 파라미터 지우기" -#: src/slic3r/GUI/Tab.cpp:2052 +#: src/slic3r/GUI/Tab.cpp:2022 msgid "Toolchange parameters with single extruder MM printers" msgstr "MMU 프린터의 툴체인지 매개 변수" -#: src/slic3r/GUI/Tab.cpp:2065 +#: src/slic3r/GUI/Tab.cpp:2035 msgid "Ramming settings" msgstr "래밍 설정" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 -#: src/slic3r/GUI/Tab.cpp:4264 src/libslic3r/GCode.cpp:733 -#: src/libslic3r/PrintConfig.cpp:2500 +#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:2398 +#: src/slic3r/GUI/Tab.cpp:4493 src/libslic3r/GCode.cpp:684 +#: src/libslic3r/PrintConfig.cpp:2532 msgid "Custom G-code" msgstr "사용자 지정 G 코드" -#: src/slic3r/GUI/Tab.cpp:2090 src/slic3r/GUI/Tab.cpp:2411 -#: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2450 -#: src/libslic3r/PrintConfig.cpp:2465 +#: src/slic3r/GUI/Tab.cpp:2060 src/slic3r/GUI/Tab.cpp:2399 +#: src/libslic3r/GCode.cpp:658 src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2497 msgid "Start G-code" msgstr "G 코드 시작" -#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:2421 -#: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:685 -#: src/libslic3r/PrintConfig.cpp:695 +#: src/slic3r/GUI/Tab.cpp:2070 src/slic3r/GUI/Tab.cpp:2409 +#: src/libslic3r/GCode.cpp:659 src/libslic3r/PrintConfig.cpp:788 +#: src/libslic3r/PrintConfig.cpp:798 msgid "End G-code" msgstr "끝 G 코드" -#: src/slic3r/GUI/Tab.cpp:2153 +#: src/slic3r/GUI/Tab.cpp:2115 msgid "Volumetric flow hints not available" msgstr "볼륨 흐름 힌트를 사용할 수 없음" -#: src/slic3r/GUI/Tab.cpp:2257 +#: src/slic3r/GUI/Tab.cpp:2241 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -8655,20 +10228,20 @@ msgstr "" "열립니다. 실제 프린터 프로파일은 PrusaSlicer/physical_printer 디렉터리에 저장" "됩니다." -#: src/slic3r/GUI/Tab.cpp:2291 src/slic3r/GUI/Tab.cpp:2518 +#: src/slic3r/GUI/Tab.cpp:2275 src/slic3r/GUI/Tab.cpp:2506 msgid "Size and coordinates" msgstr "크기 및 좌표" -#: src/slic3r/GUI/Tab.cpp:2300 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:2284 src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "Capabilities" msgstr "권한" -#: src/slic3r/GUI/Tab.cpp:2305 +#: src/slic3r/GUI/Tab.cpp:2289 msgid "Number of extruders of the printer." msgstr "프린터 익스트루더 숫자." -#: src/slic3r/GUI/Tab.cpp:2334 +#: src/slic3r/GUI/Tab.cpp:2322 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -8679,105 +10252,101 @@ msgstr "" "모든 압출기는 동일한 직경을 가져야 합니다.\n" "모든 압출기의 직경을 첫 번째 압출기 노즐 직경 값으로 변경하시겠습니까?" -#: src/slic3r/GUI/Tab.cpp:2338 src/slic3r/GUI/Tab.cpp:2782 -#: src/libslic3r/PrintConfig.cpp:1900 +#: src/slic3r/GUI/Tab.cpp:2326 src/slic3r/GUI/Tab.cpp:2714 +#: src/libslic3r/PrintConfig.cpp:1937 msgid "Nozzle diameter" msgstr "노즐 직경" -#: src/slic3r/GUI/Tab.cpp:2431 src/libslic3r/GCode.cpp:709 -#: src/libslic3r/PrintConfig.cpp:425 +#: src/slic3r/GUI/Tab.cpp:2419 src/libslic3r/GCode.cpp:660 +#: src/libslic3r/PrintConfig.cpp:444 msgid "Before layer change G-code" msgstr "레이어가 G 코드를 변경하기 전에" -#: src/slic3r/GUI/Tab.cpp:2441 src/libslic3r/GCode.cpp:710 -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/slic3r/GUI/Tab.cpp:2429 src/libslic3r/GCode.cpp:661 +#: src/libslic3r/PrintConfig.cpp:1665 msgid "After layer change G-code" msgstr "레이어 변경 후 G 코드" -#: src/slic3r/GUI/Tab.cpp:2451 src/libslic3r/GCode.cpp:711 -#: src/libslic3r/PrintConfig.cpp:2877 +#: src/slic3r/GUI/Tab.cpp:2439 src/libslic3r/GCode.cpp:662 +#: src/libslic3r/PrintConfig.cpp:2965 msgid "Tool change G-code" msgstr "공구 변경 G 코드" -#: src/slic3r/GUI/Tab.cpp:2461 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2449 src/libslic3r/GCode.cpp:663 msgid "Between objects G-code (for sequential printing)" msgstr "객체 간 G 코드 (순차 인쇄용)" -#: src/slic3r/GUI/Tab.cpp:2471 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2459 src/libslic3r/GCode.cpp:664 msgid "Color Change G-code" msgstr "색상 변경 G 코드" -#: src/slic3r/GUI/Tab.cpp:2480 src/libslic3r/GCode.cpp:714 -#: src/libslic3r/PrintConfig.cpp:2491 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:665 +#: src/libslic3r/PrintConfig.cpp:2523 msgid "Pause Print G-code" msgstr "G 코드 인쇄 일시 중지" -#: src/slic3r/GUI/Tab.cpp:2489 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:666 msgid "Template Custom G-code" msgstr "템플릿 사용자 지정 G 코드" -#: src/slic3r/GUI/Tab.cpp:2525 +#: src/slic3r/GUI/Tab.cpp:2513 msgid "Display" msgstr "표시" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2528 msgid "Tilt" msgstr "기울이기" -#: src/slic3r/GUI/Tab.cpp:2541 +#: src/slic3r/GUI/Tab.cpp:2529 msgid "Tilt time" msgstr "기울이기 시간" -#: src/slic3r/GUI/Tab.cpp:2548 src/slic3r/GUI/Tab.cpp:4575 +#: src/slic3r/GUI/Tab.cpp:2536 src/slic3r/GUI/Tab.cpp:4812 msgid "Corrections" msgstr "수정" -#: src/slic3r/GUI/Tab.cpp:2561 src/slic3r/GUI/Tab.cpp:4571 +#: src/slic3r/GUI/Tab.cpp:2549 src/slic3r/GUI/Tab.cpp:4808 msgid "Exposure" msgstr "최소 노출 시간" -#: src/slic3r/GUI/Tab.cpp:2622 src/slic3r/GUI/Tab.cpp:2709 -#: src/libslic3r/PrintConfig.cpp:1655 src/libslic3r/PrintConfig.cpp:1690 -#: src/libslic3r/PrintConfig.cpp:1707 src/libslic3r/PrintConfig.cpp:1724 -#: src/libslic3r/PrintConfig.cpp:1740 src/libslic3r/PrintConfig.cpp:1750 -#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1773 -#: src/libslic3r/PrintConfig.cpp:1783 +#: src/slic3r/GUI/Tab.cpp:2556 +msgid "Output" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2615 src/slic3r/GUI/Tab.cpp:2875 +#: src/libslic3r/PrintConfig.cpp:1694 src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1744 src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1777 src/libslic3r/PrintConfig.cpp:1787 +#: src/libslic3r/PrintConfig.cpp:1797 src/libslic3r/PrintConfig.cpp:1810 +#: src/libslic3r/PrintConfig.cpp:1820 msgid "Machine limits" msgstr "기계 제한" -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2638 msgid "Values in this column are for Normal mode" msgstr "이 열의 값은 일반 모드입니다" -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2644 msgid "Values in this column are for Stealth mode" msgstr "이 열의 값은 스텔스 모드용입니다." -#: src/slic3r/GUI/Tab.cpp:2660 +#: src/slic3r/GUI/Tab.cpp:2653 msgid "Maximum feedrates" msgstr "최대 피드값" -#: src/slic3r/GUI/Tab.cpp:2665 +#: src/slic3r/GUI/Tab.cpp:2658 msgid "Maximum accelerations" msgstr "최대 가속" -#: src/slic3r/GUI/Tab.cpp:2674 +#: src/slic3r/GUI/Tab.cpp:2667 msgid "Jerk limits" msgstr "바보 제한" -#: src/slic3r/GUI/Tab.cpp:2680 +#: src/slic3r/GUI/Tab.cpp:2673 msgid "Minimum feedrates" msgstr "최소 공급률" -#: src/slic3r/GUI/Tab.cpp:2734 src/slic3r/GUI/Tab.cpp:2743 -msgid "Single extruder MM setup" -msgstr "단일 압출기 MM 설정" - -#: src/slic3r/GUI/Tab.cpp:2744 -msgid "Single extruder multimaterial parameters" -msgstr "싱글 익스트루더 멀티메터리알 파라미터" - -#: src/slic3r/GUI/Tab.cpp:2779 +#: src/slic3r/GUI/Tab.cpp:2711 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -8785,29 +10354,41 @@ msgstr "" "이것은 단일 압출기 다중 재료 프린터이며, 모든 압출기의 직경은 새 값으로 설정" "됩니다. 계속 하시겠습니까?" -#: src/slic3r/GUI/Tab.cpp:2804 +#: src/slic3r/GUI/Tab.cpp:2739 +msgid "Reset to Filament Color" +msgstr "필라멘트 색상으로 재설정" + +#: src/slic3r/GUI/Tab.cpp:2775 +msgid "Apply below setting to other extruders" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2820 msgid "Layer height limits" msgstr "레이어 높이 제한" -#: src/slic3r/GUI/Tab.cpp:2809 +#: src/slic3r/GUI/Tab.cpp:2824 msgid "Position (for multi-extruder printers)" msgstr "위치 (멀티 익스트루더 프린터 포함)" -#: src/slic3r/GUI/Tab.cpp:2815 +#: src/slic3r/GUI/Tab.cpp:2830 msgid "Only lift Z" msgstr "Z축 올림" -#: src/slic3r/GUI/Tab.cpp:2828 +#: src/slic3r/GUI/Tab.cpp:2843 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "도구가 비활성화된 때의 철회(다중 압출기 설정에 대한 고급 설정)" -#: src/slic3r/GUI/Tab.cpp:2835 -msgid "Reset to Filament Color" -msgstr "필라멘트 색상으로 재설정" +#: src/slic3r/GUI/Tab.cpp:2900 src/slic3r/GUI/Tab.cpp:2909 +msgid "Single extruder MM setup" +msgstr "단일 압출기 MM 설정" + +#: src/slic3r/GUI/Tab.cpp:2910 +msgid "Single extruder multimaterial parameters" +msgstr "싱글 익스트루더 멀티메터리알 파라미터" -#: src/slic3r/GUI/Tab.cpp:3012 +#: src/slic3r/GUI/Tab.cpp:3074 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -8817,51 +10398,64 @@ msgstr "" "\n" "펌웨어 철회를 활성화하기 위해 비활성화해야 합니까?" -#: src/slic3r/GUI/Tab.cpp:3014 +#: src/slic3r/GUI/Tab.cpp:3076 msgid "Firmware Retraction" msgstr "펌웨어 철회" -#: src/slic3r/GUI/Tab.cpp:3319 +#: src/slic3r/GUI/Tab.cpp:3384 msgid "New printer preset selected" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3625 +#: src/slic3r/GUI/Tab.cpp:3758 msgid "Detached" msgstr "분리" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3857 +msgid "" +"The physical printer below is based on the preset, you are going to rename." +msgid_plural "" +"The physical printers below are based on the preset, you are going to rename." +msgstr[0] "" + +#: src/slic3r/GUI/Tab.cpp:3862 +msgid "Note, that the selected preset will be renamed in this printer too." +msgid_plural "" +"Note, that the selected preset will be renamed in these printers too." +msgstr[0] "" + +#: src/slic3r/GUI/Tab.cpp:3924 msgid "remove" msgstr "제거" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3924 msgid "delete" msgstr "삭제" -#: src/slic3r/GUI/Tab.cpp:3711 +#: src/slic3r/GUI/Tab.cpp:3933 msgid "It's a last preset for this physical printer." msgstr "이 실제 프린터의 마지막 사전 설정입니다." -#: src/slic3r/GUI/Tab.cpp:3716 +#: src/slic3r/GUI/Tab.cpp:3938 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " "\"%2%\"?" msgstr "실제 프린터 \"%2%\"에서 \"%1%\" 사전 설정을 삭제하시겠습니까?" -#: src/slic3r/GUI/Tab.cpp:3728 +#: src/slic3r/GUI/Tab.cpp:3950 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" "The physical printers below are based on the preset, you are going to delete." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3733 +#: src/slic3r/GUI/Tab.cpp:3955 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3738 +#: src/slic3r/GUI/Tab.cpp:3960 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -8870,62 +10464,62 @@ msgid_plural "" "delete." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3743 +#: src/slic3r/GUI/Tab.cpp:3965 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" "Note, that these printers will be deleted after deleting the selected preset." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3748 +#: src/slic3r/GUI/Tab.cpp:3970 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "선택한 사전 설정의 %1%를 선택 하시겠습니까?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3753 +#: src/slic3r/GUI/Tab.cpp:3975 #, boost-format msgid "%1% Preset" msgstr "%1% 기본설정" -#: src/slic3r/GUI/Tab.cpp:3836 src/slic3r/GUI/Tab.cpp:4198 +#: src/slic3r/GUI/Tab.cpp:4061 src/slic3r/GUI/Tab.cpp:4423 msgid "Set" msgstr "설정" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:4180 msgid "Find" msgstr "찾기" -#: src/slic3r/GUI/Tab.cpp:3956 +#: src/slic3r/GUI/Tab.cpp:4181 msgid "Replace with" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4045 +#: src/slic3r/GUI/Tab.cpp:4270 msgid "Regular expression" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4049 +#: src/slic3r/GUI/Tab.cpp:4274 msgid "Case insensitive" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4053 +#: src/slic3r/GUI/Tab.cpp:4278 msgid "Whole word" msgstr "전체 단어 일치" -#: src/slic3r/GUI/Tab.cpp:4057 +#: src/slic3r/GUI/Tab.cpp:4282 msgid "Match single line" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4160 +#: src/slic3r/GUI/Tab.cpp:4385 msgid "Are you sure you want to delete all substitutions?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4292 +#: src/slic3r/GUI/Tab.cpp:4521 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "기계 제한은 G 코드로 방출되고 인쇄 시간을 예측하는 데 사용됩니다." -#: src/slic3r/GUI/Tab.cpp:4295 +#: src/slic3r/GUI/Tab.cpp:4524 msgid "" "Machine limits will NOT be emitted to G-code, however they will be used to " "estimate print time, which may therefore not be accurate as the printer may " @@ -8935,26 +10529,26 @@ msgstr "" "는 데 사용됩니다, 따라서 프린터가 기계 제한의 다른 세트를 적용 할 수 있으므" "로 정확하지 않을 수 있습니다." -#: src/slic3r/GUI/Tab.cpp:4299 +#: src/slic3r/GUI/Tab.cpp:4528 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." msgstr "" "기계 제한이 설정되지 않으므로 인쇄 시간 추정치가 정확하지 않을 수 있습니다." -#: src/slic3r/GUI/Tab.cpp:4321 +#: src/slic3r/GUI/Tab.cpp:4550 msgid "LOCKED LOCK" msgstr "잠긴 잠금" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4323 +#: src/slic3r/GUI/Tab.cpp:4552 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" msgstr "" "설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4325 +#: src/slic3r/GUI/Tab.cpp:4554 msgid "UNLOCKED LOCK" msgstr "" "UNLOCKED LOCK 아이콘은 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템(또는 " @@ -8963,7 +10557,7 @@ msgstr "" "릭합니다." #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4327 +#: src/slic3r/GUI/Tab.cpp:4556 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -8975,14 +10569,14 @@ msgstr "" "잠금 해제 된 LOCK 아이콘을 클릭하여 현재 옵션 그룹에 대한 모든 설정을 시스템 " "(또는 기본값) 값으로 재설정합니다." -#: src/slic3r/GUI/Tab.cpp:4332 +#: src/slic3r/GUI/Tab.cpp:4561 msgid "WHITE BULLET" msgstr "" "WHITE BULLET 기호 아이콘은 설정이 현재 옵션 그룹에 대해 마지막으로 저장 된 사" "전 설정과 동일 하다는 것을 나타냅니다." #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4334 +#: src/slic3r/GUI/Tab.cpp:4563 msgid "" "for the left button: indicates a non-system (or non-default) preset,\n" "for the right button: indicates that the settings hasn't been modified." @@ -8990,12 +10584,12 @@ msgstr "" "왼쪽 단추의 경우: 비시스템(또는 비기본적) 사전 설정을 나타내고,\n" "오른쪽 단추: 설정이 수정되지 않았음을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4337 +#: src/slic3r/GUI/Tab.cpp:4566 msgid "BACK ARROW" msgstr "돌아가기 화살표" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4339 +#: src/slic3r/GUI/Tab.cpp:4568 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -9007,7 +10601,7 @@ msgstr "" "뒤로 화살표 아이콘을 클릭하여 현재 옵션 그룹에 대한 모든 설정을 마지막으로 저" "장된 사전 설정으로 재설정합니다." -#: src/slic3r/GUI/Tab.cpp:4349 +#: src/slic3r/GUI/Tab.cpp:4578 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -9015,7 +10609,7 @@ msgstr "" "잠긴 LOCK 아이콘은 설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하다" "는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4351 +#: src/slic3r/GUI/Tab.cpp:4580 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " "equal to the system (or default) values for the current option group.\n" @@ -9027,11 +10621,11 @@ msgstr "" "현재 옵션 그룹에 대한 모든 설정을 시스템(또는 기본값) 값으로 재설정하려면 클" "릭합니다." -#: src/slic3r/GUI/Tab.cpp:4354 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "WHITE BULLET 아이콘은 시스템 사전 설정이 아닌 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4357 +#: src/slic3r/GUI/Tab.cpp:4586 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -9039,7 +10633,7 @@ msgstr "" "WHITE BULLET 기호 아이콘은 설정이 현재 옵션 그룹에 대해 마지막으로 저장 된 사" "전 설정과 동일 하다는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4359 +#: src/slic3r/GUI/Tab.cpp:4588 msgid "" "BACK ARROW icon indicates that the settings were changed and are not equal " "to the last saved preset for the current option group.\n" @@ -9051,14 +10645,14 @@ msgstr "" "마지막 현재 옵션 그룹에 대 한 모든 설정 다시 설정을 클릭 하 여 사전 설정을 저" "장." -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4594 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "" "LOCK 아이콘잠기는 값이 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4366 +#: src/slic3r/GUI/Tab.cpp:4595 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -9068,7 +10662,7 @@ msgstr "" "을 나타냅니다.\n" "현재 값을 시스템(또는 기본값) 값으로 재설정하려면 클릭합니다." -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4601 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -9076,7 +10670,7 @@ msgstr "" "WHITE BULLET 기호 아이콘은 마지막으로 저장 한 사전 설정과 동일한 값을 나타냅" "니다." -#: src/slic3r/GUI/Tab.cpp:4373 +#: src/slic3r/GUI/Tab.cpp:4602 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -9086,31 +10680,31 @@ msgstr "" "음을 나타냅니다.\n" "현재 값을 마지막 저장된 사전 설정으로 재설정하려면 클릭합니다." -#: src/slic3r/GUI/Tab.cpp:4527 src/slic3r/GUI/Tab.cpp:4529 +#: src/slic3r/GUI/Tab.cpp:4764 src/slic3r/GUI/Tab.cpp:4766 msgid "Material" msgstr "재료" -#: src/slic3r/GUI/Tab.cpp:4614 src/slic3r/GUI/Tab.cpp:4615 +#: src/slic3r/GUI/Tab.cpp:4851 src/slic3r/GUI/Tab.cpp:4852 msgid "Material printing profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4667 +#: src/slic3r/GUI/Tab.cpp:4901 msgid "Support head" msgstr "서포트 헤드" -#: src/slic3r/GUI/Tab.cpp:4672 +#: src/slic3r/GUI/Tab.cpp:4906 msgid "Support pillar" msgstr "서포트 기둥" -#: src/slic3r/GUI/Tab.cpp:4695 +#: src/slic3r/GUI/Tab.cpp:4929 msgid "Connection of the support sticks and junctions" msgstr "서포트 기둥 및 접합부 연결" -#: src/slic3r/GUI/Tab.cpp:4700 +#: src/slic3r/GUI/Tab.cpp:4956 msgid "Automatic generation" msgstr "자동 생성" -#: src/slic3r/GUI/Tab.cpp:4775 +#: src/slic3r/GUI/Tab.cpp:5024 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -9119,74 +10713,72 @@ msgstr "" "\"%1%\"는 \"%3%\" 범주에 있기 때문에 \"%2% %1%\"이 비활성화됩니다.\n" "\"%1%\"을 활성화하려면 \"%2%\"을 끄십시오." -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3724 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3497 msgid "Object elevation" msgstr "객체 고도" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3826 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3958 msgid "Pad around object" msgstr "물체 주위의 패드" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:153 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:162 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1047 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1100 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1115 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1130 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1145 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:147 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:156 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:165 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1107 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1122 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1137 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1152 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1197 msgid "Undef" msgstr "Undef" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:772 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:792 msgid "Unsaved Changes" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:790 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:810 msgid "Switching Presets: Unsaved Changes" msgstr "사전 설정 전환: 저장되지 않은 변경 사항" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:832 -msgid "Old Value" -msgstr "이전 값" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:858 +msgid "Original Value" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:859 +msgid "Modified Value" +msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:833 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:861 msgid "New Value" msgstr "새 값" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:867 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 msgid "Keep" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1569 msgid "Transfer" msgstr "전송하기" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 msgid "Don't save" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 -msgid "Discard" -msgstr "무시\t" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:877 -msgid "Save" -msgstr "저장" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:898 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:926 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "create new project" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:927 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "switch a preset" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:900 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:928 msgid "" "You will not be asked about the unsaved changes in presets the next time " "you: \n" @@ -9194,11 +10786,11 @@ msgid "" "- Loading a new project while some presets are modified" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:903 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:931 msgid "PrusaSlicer will remember your action." msgstr "프라사슬라이스러는 당신의 행동을 기억할 것입니다." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:904 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:932 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" @@ -9207,56 +10799,56 @@ msgstr "" "\"기본 설정\"을 방문하여 \"%1%\"을 확인하십시오.\n" "저장되지 않은 변경 사항에 대해 다시 묻는 것입니다." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:964 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1772 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" "일부 필드는 너무 길기 때문에 적합합니다. 마우스 오른쪽 클릭으로 전체 텍스트" "가 드러납니다." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will not be saved" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will be discarded." msgstr "모든 설정 변경 내용은 삭제됩니다." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:941 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:969 msgid "Save the selected options." msgstr "선택한 옵션을 저장합니다." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:942 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:970 msgid "Keep the selected settings." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:943 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:971 msgid "Transfer the selected settings to the newly selected preset." msgstr "선택한 설정을 새로 선택한 사전 설정으로 전송합니다." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:947 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:975 #, boost-format msgid "Save the selected options to preset \"%1%\"." msgstr "선택한 옵션을 저장하여 \"%1%\"을 미리 설정합니다." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:948 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:976 #, boost-format msgid "Transfer the selected options to the newly selected preset \"%1%\"." msgstr "선택한 옵션을 새로 선택한 사전 설정된 \"%1%\"로 전송합니다." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1224 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1237 msgid "The following preset was modified" msgid_plural "The following presets were modified" msgstr[0] "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1230 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1243 #, boost-format msgid "Preset \"%1%\" has the following unsaved changes:" msgstr "" "사전 설정된 \"%1%\"에는 다음과 같은 저장되지 않은 변경 사항이 있습니다." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1234 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1247 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new printer profile and it has the " @@ -9265,7 +10857,7 @@ msgstr "" "사전 설정된 \"%1%\"은 새 프린터 프로필과 호환되지 않으며 다음과 같은 저장되" "지 않은 변경 사항이 있습니다." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1235 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1248 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new print profile and it has the " @@ -9274,107 +10866,205 @@ msgstr "" "사전 설정된 \"%1%\"은 새 인쇄 프로파일과 호환되지 않으며 다음과 같은 저장되" "지 않은 변경 사항이 있습니다." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1297 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1850 msgid "Extruders count" msgstr "압출기 수" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 -msgid "Select presets to compare" -msgstr "" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1326 +msgid "The preset modifications are successfully saved" +msgid_plural "The presets modifications are successfully saved" +msgstr[0] "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1515 msgid "Show all presets (including incompatible)" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1533 +msgid "Select presets to compare" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1545 msgid "Left Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1546 msgid "Right Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1595 +msgid "" +"Transfer the selected options from left preset to the right.\n" +"Note: New modified presets will be selected in settings tabs after close " +"this dialog." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1603 +msgid "Save the selected options from left preset to the right." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1621 +msgid "Transfer values from left to right" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1622 +msgid "" +"If enabled, this dialog can be used for transver selected values from left " +"to right preset." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1807 msgid "One of the presets doesn't found" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1818 msgid "Compared presets has different printer technology" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1832 msgid "Presets are the same" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1840 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef category" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef group" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:2016 +msgid "Modified" +msgstr "수정됨" + +#: src/slic3r/GUI/UpdateDialogs.cpp:41 msgid "Update available" msgstr "사용가능한 업데이트" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UpdateDialogs.cpp:41 #, c-format, boost-format msgid "New version of %s is available" msgstr "%s의 새 버전을 사용할 수 있습니다" -#: src/slic3r/GUI/UpdateDialogs.cpp:42 +#: src/slic3r/GUI/UpdateDialogs.cpp:46 src/slic3r/GUI/UpdateDialogs.cpp:101 msgid "Current version:" msgstr "현재 버전:" -#: src/slic3r/GUI/UpdateDialogs.cpp:44 +#: src/slic3r/GUI/UpdateDialogs.cpp:48 src/slic3r/GUI/UpdateDialogs.cpp:103 +#: src/slic3r/GUI/UpdateDialogs.cpp:141 msgid "New version:" msgstr "새로운 버전:" -#: src/slic3r/GUI/UpdateDialogs.cpp:52 +#: src/slic3r/GUI/UpdateDialogs.cpp:56 msgid "Changelog & Download" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:59 src/slic3r/GUI/UpdateDialogs.cpp:133 -#: src/slic3r/GUI/UpdateDialogs.cpp:191 +#: src/slic3r/GUI/UpdateDialogs.cpp:63 src/slic3r/GUI/UpdateDialogs.cpp:309 +#: src/slic3r/GUI/UpdateDialogs.cpp:367 msgid "Open changelog page" msgstr "변경 로그 페이지 열기" -#: src/slic3r/GUI/UpdateDialogs.cpp:65 +#: src/slic3r/GUI/UpdateDialogs.cpp:69 msgid "Open download page" msgstr "다운로드 페이지 열기" -#: src/slic3r/GUI/UpdateDialogs.cpp:72 +#: src/slic3r/GUI/UpdateDialogs.cpp:76 src/slic3r/GUI/UpdateDialogs.cpp:109 msgid "Don't notify about new releases any more" msgstr "새로운 수정사항에 대해 더 이상 알림 안 함" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +msgid "App Update available" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +#, c-format, boost-format +msgid "" +"New version of %s is available.\n" +"Do you wish to download it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +msgid "App Update download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +#, c-format, boost-format +msgid "New version of %s is available." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:146 +msgid "Run installer after download. (Otherwise file explorer will be opened)" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:151 +msgid "Target directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:158 +msgid "Select directory" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:176 +msgid "Select directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:193 +msgid "Download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:204 +msgid "Directory path is empty." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:212 +msgid "Directory path is incorrect." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:217 +#, boost-format +msgid "Directory %1% doesn't exists. Do you wish to create it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:222 +msgid "Failed to create directory." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:229 +#, boost-format +msgid "File %1% already exists. Do you wish to overwrite it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +#, boost-format +msgid "Download path is %1%. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:270 msgid "Opening Configuration Wizard" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 src/slic3r/GUI/UpdateDialogs.cpp:261 +#: src/slic3r/GUI/UpdateDialogs.cpp:270 src/slic3r/GUI/UpdateDialogs.cpp:437 msgid "Configuration update" msgstr "구성 업데이트" -#: src/slic3r/GUI/UpdateDialogs.cpp:95 +#: src/slic3r/GUI/UpdateDialogs.cpp:271 msgid "" "PrusaSlicer is not using the newest configuration available.\n" "Configuration Wizard may not offer the latest printers, filaments and SLA " "materials to be installed." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:97 +#: src/slic3r/GUI/UpdateDialogs.cpp:273 msgid "Configuration update is available" msgstr "구성 업데이트를 사용할 수 있음" -#: src/slic3r/GUI/UpdateDialogs.cpp:100 +#: src/slic3r/GUI/UpdateDialogs.cpp:276 msgid "" "Would you like to install it?\n" "\n" @@ -9390,28 +11080,28 @@ msgstr "" "\n" "업데이트 된 구성 번들 :" -#: src/slic3r/GUI/UpdateDialogs.cpp:121 src/slic3r/GUI/UpdateDialogs.cpp:181 +#: src/slic3r/GUI/UpdateDialogs.cpp:297 src/slic3r/GUI/UpdateDialogs.cpp:357 msgid "Comment:" msgstr "댓글:" -#: src/slic3r/GUI/UpdateDialogs.cpp:142 +#: src/slic3r/GUI/UpdateDialogs.cpp:318 msgid "Install" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:144 +#: src/slic3r/GUI/UpdateDialogs.cpp:320 msgid "Don't install" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 src/slic3r/GUI/UpdateDialogs.cpp:212 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 src/slic3r/GUI/UpdateDialogs.cpp:388 #, c-format, boost-format msgid "%s incompatibility" msgstr "%s 비호환성" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 msgid "You must install a configuration update." msgstr "구성 업데이트를 설치해야 합니다." -#: src/slic3r/GUI/UpdateDialogs.cpp:160 +#: src/slic3r/GUI/UpdateDialogs.cpp:336 #, c-format, boost-format msgid "" "%s will now start updates. Otherwise it won't be able to start.\n" @@ -9428,17 +11118,12 @@ msgstr "" "\n" "업데이트된 구성 번들:" -#: src/slic3r/GUI/UpdateDialogs.cpp:200 src/slic3r/GUI/UpdateDialogs.cpp:247 -#, c-format, boost-format -msgid "Exit %s" -msgstr "%s Exit" - -#: src/slic3r/GUI/UpdateDialogs.cpp:213 +#: src/slic3r/GUI/UpdateDialogs.cpp:389 #, c-format, boost-format msgid "%s configuration is incompatible" msgstr "%s 구성이 호환되지 않습니다." -#: src/slic3r/GUI/UpdateDialogs.cpp:216 +#: src/slic3r/GUI/UpdateDialogs.cpp:392 #, c-format, boost-format msgid "" "This version of %s is not compatible with currently installed configuration " @@ -9457,20 +11142,20 @@ msgstr "" "니다. 이렇게 하면 %s와 호환 되는 파일을 설치하기 전에 기존 구성의 백업 스냅샷" "이 생성 됩니다." -#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#: src/slic3r/GUI/UpdateDialogs.cpp:401 #, c-format, boost-format msgid "This %s version: %s" msgstr "이 %s 버전: %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:230 +#: src/slic3r/GUI/UpdateDialogs.cpp:406 msgid "Incompatible bundles:" msgstr "호환되지 않는 번들 :" -#: src/slic3r/GUI/UpdateDialogs.cpp:246 +#: src/slic3r/GUI/UpdateDialogs.cpp:422 msgid "Re-configure" msgstr "재구성" -#: src/slic3r/GUI/UpdateDialogs.cpp:265 +#: src/slic3r/GUI/UpdateDialogs.cpp:441 #, c-format, boost-format msgid "" "%s now uses an updated configuration structure.\n" @@ -9496,28 +11181,37 @@ msgstr "" "다음의 %s를 계속 진행하여 새 프리셋을 설정하고 자동 프리셋 업데이트를 사용할" "지 여부를 선택하십시오." -#: src/slic3r/GUI/UpdateDialogs.cpp:282 +#: src/slic3r/GUI/UpdateDialogs.cpp:458 msgid "For more information please visit our wiki page:" msgstr "자세한 정보는 위키 페이지를 참조하십시오 :" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 msgid "Configuration updates" msgstr "구성 업데이트" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 src/slic3r/GUI/UpdateDialogs.cpp:495 msgid "No updates available" msgstr "사용할 수 있는 업데이트 없음" -#: src/slic3r/GUI/UpdateDialogs.cpp:304 +#: src/slic3r/GUI/UpdateDialogs.cpp:480 #, c-format, boost-format msgid "%s has no configuration updates available." msgstr "%s 구성 업데이트를 사용할 수 없습니다." -#: src/slic3r/GUI/WipeTowerDialog.cpp:21 +#: src/slic3r/GUI/UpdateDialogs.cpp:495 +msgid "App update" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:500 +#, c-format, boost-format +msgid "%s has no version updates available." +msgstr "" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:23 msgid "Ramming customization" msgstr "사용자 정의 다지기(Ramming)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:54 +#: src/slic3r/GUI/WipeTowerDialog.cpp:56 msgid "" "Ramming denotes the rapid extrusion just before a tool change in a single-" "extruder MM printer. Its purpose is to properly shape the end of the " @@ -9538,63 +11232,63 @@ msgstr "" "전문가 수준의 설정이므로 잘못된 조정으로 인해 용지 걸림, 압출기 휠이 필라멘" "트 등에 연삭 될 수 있습니다." -#: src/slic3r/GUI/WipeTowerDialog.cpp:114 +#: src/slic3r/GUI/WipeTowerDialog.cpp:116 msgid "Total ramming time" msgstr "총 래밍 시간" -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 msgid "Total rammed volume" msgstr "총 레미드 양" -#: src/slic3r/GUI/WipeTowerDialog.cpp:120 +#: src/slic3r/GUI/WipeTowerDialog.cpp:122 msgid "Ramming line width" msgstr "래밍 선 너비" -#: src/slic3r/GUI/WipeTowerDialog.cpp:122 +#: src/slic3r/GUI/WipeTowerDialog.cpp:124 msgid "Ramming line spacing" msgstr "래밍 선 간격" -#: src/slic3r/GUI/WipeTowerDialog.cpp:173 +#: src/slic3r/GUI/WipeTowerDialog.cpp:175 msgid "Wipe tower - Purging volume adjustment" msgstr "와이프 타워 - 버려진 필라멘트 조절" -#: src/slic3r/GUI/WipeTowerDialog.cpp:299 +#: src/slic3r/GUI/WipeTowerDialog.cpp:301 msgid "" "Here you can adjust required purging volume (mm³) for any given pair of " "tools." msgstr "여기서 주어진 도구 쌍에 필요한 정화 용량 (mm³)을 조정할 수 있습니다." -#: src/slic3r/GUI/WipeTowerDialog.cpp:300 +#: src/slic3r/GUI/WipeTowerDialog.cpp:302 msgid "Extruder changed to" msgstr "익스트루더 번경" -#: src/slic3r/GUI/WipeTowerDialog.cpp:308 +#: src/slic3r/GUI/WipeTowerDialog.cpp:310 msgid "unloaded" msgstr "언로드" -#: src/slic3r/GUI/WipeTowerDialog.cpp:309 +#: src/slic3r/GUI/WipeTowerDialog.cpp:311 msgid "loaded" msgstr "로드(loaded)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:352 +#: src/slic3r/GUI/WipeTowerDialog.cpp:354 msgid "Tool #" msgstr "도구(Tool) #" -#: src/slic3r/GUI/WipeTowerDialog.cpp:361 +#: src/slic3r/GUI/WipeTowerDialog.cpp:363 msgid "" "Total purging volume is calculated by summing two values below, depending on " "which tools are loaded/unloaded." msgstr "도구가 로드 / 언로드되는지에 따라 아래의 두 값을 합산하여 계산됩니다." -#: src/slic3r/GUI/WipeTowerDialog.cpp:362 +#: src/slic3r/GUI/WipeTowerDialog.cpp:364 msgid "Volume to purge (mm³) when the filament is being" msgstr "제거할 필라멘트 양 (mm³)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:376 +#: src/slic3r/GUI/WipeTowerDialog.cpp:378 msgid "From" msgstr "발신자" -#: src/slic3r/GUI/WipeTowerDialog.cpp:442 +#: src/slic3r/GUI/WipeTowerDialog.cpp:444 msgid "" "Switching to simple settings will discard changes done in the advanced " "mode!\n" @@ -9605,26 +11299,28 @@ msgstr "" "\n" "계속하시겠습니까?" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show simplified settings" msgstr "간단한 설정보기" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show advanced settings" msgstr "고급설정 보기" -#: src/slic3r/GUI/wxExtensions.cpp:644 +#: src/slic3r/GUI/wxExtensions.cpp:672 #, c-format, boost-format msgid "Switch to the %s mode" msgstr "%s 모드로 전환" -#: src/slic3r/GUI/wxExtensions.cpp:645 +#: src/slic3r/GUI/wxExtensions.cpp:673 #, c-format, boost-format msgid "Current mode is %s" msgstr "현재 모드는 %s입니다" -#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:141 -#: src/slic3r/Utils/Repetier.cpp:69 +#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:206 +#: src/slic3r/Utils/OctoPrint.cpp:255 src/slic3r/Utils/OctoPrint.cpp:666 +#: src/slic3r/Utils/OctoPrint.cpp:824 src/slic3r/Utils/OctoPrint.cpp:897 +#: src/slic3r/Utils/Repetier.cpp:88 #, c-format, boost-format msgid "Mismatched type of print host: %s" msgstr "일치 하지않는 인쇄 호스트 유형: %s" @@ -9743,69 +11439,100 @@ msgstr "" "참고: 펌웨어 2.00.02 또는 최신 및 활성화된 업로드 기능이 있는 FlashAir가 필요" "합니다." -#: src/slic3r/Utils/OctoPrint.cpp:164 +#: src/slic3r/Utils/OctoPrint.cpp:278 msgid "Connection to OctoPrint works correctly." msgstr "OctoPrint에 대한 연결이 올바르게 작동합니다." -#: src/slic3r/Utils/OctoPrint.cpp:170 +#: src/slic3r/Utils/OctoPrint.cpp:284 msgid "Could not connect to OctoPrint" msgstr "OctoPrint에 연결할 수 없습니다" -#: src/slic3r/Utils/OctoPrint.cpp:172 +#: src/slic3r/Utils/OctoPrint.cpp:286 msgid "Note: OctoPrint version at least 1.1.0 is required." msgstr "참고: OctoPrint 버전 이상이 1.1.0 이상이 필요합니다." -#: src/slic3r/Utils/OctoPrint.cpp:292 +#: src/slic3r/Utils/OctoPrint.cpp:528 msgid "Connection to Prusa SL1 / SL1S works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:298 +#: src/slic3r/Utils/OctoPrint.cpp:534 msgid "Could not connect to Prusa SLA" msgstr "Prusa SLA에 연결할 수 없습니다" -#: src/slic3r/Utils/OctoPrint.cpp:336 +#: src/slic3r/Utils/OctoPrint.cpp:573 msgid "Connection to PrusaLink works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:342 +#: src/slic3r/Utils/OctoPrint.cpp:579 msgid "Could not connect to PrusaLink" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:61 +#: src/slic3r/Utils/OctoPrint.cpp:776 +msgid "Storages found:" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "read only" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "no free space" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:781 +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%.%2%" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:64 #, boost-format msgid "Copying of file %1% to %2% failed: %3%" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:645 -#: src/slic3r/Utils/PresetUpdater.cpp:662 +#: src/slic3r/Utils/PresetUpdater.cpp:998 +#: src/slic3r/Utils/PresetUpdater.cpp:1015 msgid "Continue and install configuration updates?" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:777 +#: src/slic3r/Utils/PresetUpdater.cpp:1021 +msgid "Installing profiles" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1071 +#, boost-format +msgid "Downloading resources for %1%." +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1171 msgid "" -"Configuration Updates causes a lost of preset modification.\n" +"Configuration Update will cause the preset modification to be lost.\n" "So, check unsaved changes and save them if necessary." msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:779 +#: src/slic3r/Utils/PresetUpdater.cpp:1173 msgid "Updating" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:808 +#: src/slic3r/Utils/PresetUpdater.cpp:1202 #, c-format, boost-format msgid "requires min. %s and max. %s" msgstr "최소. %s 와 최대. %s" -#: src/slic3r/Utils/PresetUpdater.cpp:812 +#: src/slic3r/Utils/PresetUpdater.cpp:1206 #, c-format, boost-format msgid "requires min. %s" msgstr "최소 %s가 필요 합니다" -#: src/slic3r/Utils/PresetUpdater.cpp:815 +#: src/slic3r/Utils/PresetUpdater.cpp:1209 #, c-format, boost-format msgid "requires max. %s" msgstr "최대 필요 합니다. %s" +#: src/slic3r/Utils/PresetUpdater.cpp:1362 +#, boost-format +msgid "Couldn't locate idx file %1% when performing updates." +msgstr "" + #: src/slic3r/Utils/Http.cpp:73 msgid "" "Could not detect system SSL certificate store. PrusaSlicer will be unable to " @@ -9836,30 +11563,30 @@ msgstr "" "컬 이트인이 실패했습니다. PrusaSlicer는 네트워크 연결을 설정할 수 없습니다. " "자세한 내용은 로그를 참조하십시오." -#: src/slic3r/Utils/Process.cpp:157 +#: src/slic3r/Utils/Process.cpp:164 msgid "Open G-code file:" msgstr "G 코드 파일 열기:" -#: src/slic3r/Utils/Repetier.cpp:84 +#: src/slic3r/Utils/Repetier.cpp:103 msgid "Connection to Repetier works correctly." msgstr "" -#: src/slic3r/Utils/Repetier.cpp:90 +#: src/slic3r/Utils/Repetier.cpp:109 msgid "Could not connect to Repetier" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:92 +#: src/slic3r/Utils/Repetier.cpp:111 msgid "Note: Repetier version at least 0.90.0 is required." msgstr "" -#: src/slic3r/Utils/Repetier.cpp:246 +#: src/slic3r/Utils/Repetier.cpp:263 #, boost-format msgid "" "HTTP status: %1%\n" "Message body: \"%2%\"" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:253 +#: src/slic3r/Utils/Repetier.cpp:270 #, boost-format msgid "" "Parsing of host response failed.\n" @@ -9867,7 +11594,7 @@ msgid "" "Error: \"%2%\"" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:266 +#: src/slic3r/Utils/Repetier.cpp:283 #, boost-format msgid "" "Enumeration of host printers failed.\n" @@ -9896,62 +11623,58 @@ msgstr "" msgid "Abort" msgstr "" -#: src/libslic3r/GCode.cpp:539 +#: src/libslic3r/GCode.cpp:490 msgid "There is an object with no extrusions in the first layer." msgstr "" -#: src/libslic3r/GCode.cpp:570 +#: src/libslic3r/GCode.cpp:521 #, boost-format msgid "Empty layer between %1% and %2%." msgstr "" -#: src/libslic3r/GCode.cpp:573 +#: src/libslic3r/GCode.cpp:524 msgid "(Some lines not shown)" msgstr "" -#: src/libslic3r/GCode.cpp:575 +#: src/libslic3r/GCode.cpp:526 #, boost-format msgid "Object name: %1%" msgstr "" -#: src/libslic3r/GCode.cpp:576 +#: src/libslic3r/GCode.cpp:527 msgid "" "Make sure the object is printable. This is usually caused by negligibly " "small extrusions or by a faulty model. Try to repair the model or change its " "orientation on the bed." msgstr "" -#: src/libslic3r/GCode.cpp:718 +#: src/libslic3r/GCode.cpp:669 msgid "Filament Start G-code" msgstr "" -#: src/libslic3r/GCode.cpp:725 +#: src/libslic3r/GCode.cpp:676 msgid "Filament End G-code" msgstr "" -#: src/libslic3r/GCode.cpp:764 +#: src/libslic3r/GCode.cpp:717 msgid "In the custom G-code were found reserved keywords:" msgstr "" -#: src/libslic3r/GCode.cpp:766 +#: src/libslic3r/GCode.cpp:719 msgid "" "This may cause problems in g-code visualization and printing time estimation." msgstr "" -#: src/libslic3r/GCode.cpp:1200 src/libslic3r/GCode.cpp:1211 +#: src/libslic3r/GCode.cpp:1124 src/libslic3r/GCode.cpp:1135 msgid "No extrusions were generated for objects." msgstr "" -#: src/libslic3r/GCode.cpp:1406 +#: src/libslic3r/GCode.cpp:1328 msgid "" "Your print is very close to the priming regions. Make sure there is no " "collision." msgstr "인쇄물은 프라이밍 영역과 매우 가깝습니다. 충돌이 없는지 확인합니다." -#: src/libslic3r/ExtrusionEntity.cpp:344 src/libslic3r/ExtrusionEntity.cpp:380 -msgid "Mixed" -msgstr "혼합" - #: src/libslic3r/Flow.cpp:61 #, boost-format msgid "" @@ -9959,32 +11682,32 @@ msgid "" msgstr "" "%1% 대해 압출 폭을 계산할 수 없습니다: 변수 \"%2%\"에 액세스할 수 없습니다." -#: src/libslic3r/Format/3mf.cpp:1735 +#: src/libslic3r/Format/3mf.cpp:1880 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "선택한 3mf 파일은 최신 버전의 %1% 저장되었으며 호환되지 않습니다." -#: src/libslic3r/Format/3mf.cpp:1746 +#: src/libslic3r/Format/3mf.cpp:1891 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1750 +#: src/libslic3r/Format/3mf.cpp:1895 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1754 +#: src/libslic3r/Format/3mf.cpp:1899 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/AMF.cpp:993 +#: src/libslic3r/Format/AMF.cpp:1000 #, boost-format msgid "" "The selected amf file has been saved with a newer version of %1% and is not " @@ -10127,24 +11850,30 @@ msgstr "유효성 검사 실패" msgid "write calledback failed" msgstr "쓰기 호출 백 실패" -#: src/libslic3r/Print.cpp:454 +#: src/libslic3r/Print.cpp:473 msgid "All objects are outside of the print volume." msgstr "모든 개체가 인쇄 볼륨 외부에 있습니다." -#: src/libslic3r/Print.cpp:457 +#: src/libslic3r/Print.cpp:476 msgid "The supplied settings will cause an empty print." msgstr "제공된 설정으로 인해 빈 인쇄가 발생합니다." -#: src/libslic3r/Print.cpp:461 +#: src/libslic3r/Print.cpp:480 msgid "Some objects are too close; your extruder will collide with them." msgstr "일부 개체가 너무 가깝습니다. 귀하의 압출기가 그들과 충돌합니다." -#: src/libslic3r/Print.cpp:463 +#: src/libslic3r/Print.cpp:482 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." msgstr "일부 개체는 너무 크고 익스트루더 충돌없이 인쇄 할 수 없습니다." -#: src/libslic3r/Print.cpp:472 +#: src/libslic3r/Print.cpp:486 +msgid "" +"Avoid crossing perimeters option and avoid crossing curled overhangs option " +"cannot be both enabled together." +msgstr "" + +#: src/libslic3r/Print.cpp:495 msgid "" "Only a single object may be printed at a time in Spiral Vase mode. Either " "remove all but the last object, or enable sequential mode by " @@ -10154,7 +11883,7 @@ msgstr "" "를 제외한 모든 개체를 제거하거나 \"complete_objects\"하여 순차 모드를 사용하" "도록 설정합니다." -#: src/libslic3r/Print.cpp:476 +#: src/libslic3r/Print.cpp:499 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." @@ -10162,7 +11891,17 @@ msgstr "" "나선형 꽃병 옵션(Spiral Vase)은 단일 재료 객체를 인쇄 할 때만 사용할 수 있습" "니다." -#: src/libslic3r/Print.cpp:489 +#: src/libslic3r/Print.cpp:523 +msgid "" +"The print is taller than the maximum allowed height. You might want to " +"reduce the size of your model or change current print settings and retry." +msgstr "" + +#: src/libslic3r/Print.cpp:540 +msgid "Variable layer height is not supported with Organic supports." +msgstr "" + +#: src/libslic3r/Print.cpp:553 msgid "" "The wipe tower is only supported if all extruders have the same nozzle " "diameter and use filaments of the same diameter." @@ -10170,7 +11909,7 @@ msgstr "" "와이프 타워는 모든 압출기직경이 동일하고 동일한 직경의 필라멘트를 사용하는 경" "우에만 지원됩니다." -#: src/libslic3r/Print.cpp:495 +#: src/libslic3r/Print.cpp:559 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, " "RepRapFirmware and Repetier G-code flavors." @@ -10178,7 +11917,7 @@ msgstr "" "와이프 타워는 현재 말린, RepRap / 단거리, RepRapFirmware 및 Repetier G 코드 " "맛에 대해서만 지원됩니다." -#: src/libslic3r/Print.cpp:497 +#: src/libslic3r/Print.cpp:561 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." @@ -10186,29 +11925,31 @@ msgstr "" "와이프 타워는 현재 상대적 압출기 어드레싱 (use_relative_e_distances=1)에서만 " "지원됩니다." -#: src/libslic3r/Print.cpp:499 -msgid "Ooze prevention is currently not supported with the wipe tower enabled." -msgstr "현재 활성화된 와이프 타워로는 Ooze 방지가 지원되지 않습니다." +#: src/libslic3r/Print.cpp:563 +msgid "" +"Ooze prevention is only supported with the wipe tower when " +"'single_extruder_multi_material' is off." +msgstr "" -#: src/libslic3r/Print.cpp:501 +#: src/libslic3r/Print.cpp:565 msgid "" "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." msgstr "와이프 타워는 현재 볼륨 E(use_volumetric_e=0)를 지원하지 않습니다." -#: src/libslic3r/Print.cpp:503 +#: src/libslic3r/Print.cpp:567 msgid "" "The Wipe Tower is currently not supported for multimaterial sequential " "prints." msgstr "와이프 타워는 현재 다중 재료 순차 인쇄에 대해 지원되지 않습니다." -#: src/libslic3r/Print.cpp:524 +#: src/libslic3r/Print.cpp:577 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " "layer heights" msgstr "" "와이프 타워는 레이어 높이가 동일한 경우에만 여러 개체에 대해서만 지원됩니다." -#: src/libslic3r/Print.cpp:526 +#: src/libslic3r/Print.cpp:579 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "over an equal number of raft layers" @@ -10216,7 +11957,7 @@ msgstr "" "와이프 타워는 같은 수의 라프트 레이어 위에 인쇄 된 경우 여러 객체에 대해서만 " "지원됩니다" -#: src/libslic3r/Print.cpp:529 +#: src/libslic3r/Print.cpp:582 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "with the same support_material_contact_distance" @@ -10224,14 +11965,14 @@ msgstr "" "와이프 타워는 동일한 support_material_contact_distance로 인쇄 된 경우 여러 객" "체에 대해서만 지원됩니다" -#: src/libslic3r/Print.cpp:531 +#: src/libslic3r/Print.cpp:584 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." msgstr "" "와이프 타워는 똑같이 슬라이스 된 경우 여러 오브젝트에 대해서만 지원됩니다." -#: src/libslic3r/Print.cpp:555 +#: src/libslic3r/Print.cpp:609 msgid "" "The Wipe tower is only supported if all objects have the same variable layer " "height" @@ -10239,22 +11980,22 @@ msgstr "" "지우기 타워는 모든 오브젝트가 동일한 가변 레이어 높이를 갖는 경우에만 지원됩" "니다." -#: src/libslic3r/Print.cpp:579 +#: src/libslic3r/Print.cpp:633 msgid "" "One or more object were assigned an extruder that the printer does not have." msgstr "하나 이상의 개체에 프린터에없는 압출기가 지정되었습니다." -#: src/libslic3r/Print.cpp:592 +#: src/libslic3r/Print.cpp:646 #, boost-format msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" msgstr "%1%=%2% mm가 너무 낮아 레이어 높이%3% mm에서 인쇄할 수 없습니다." -#: src/libslic3r/Print.cpp:595 +#: src/libslic3r/Print.cpp:649 #, boost-format msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" msgstr "노즐 직경 %3% mm로 인쇄할 수 있는 과도한 %1%=%2% mm" -#: src/libslic3r/Print.cpp:606 +#: src/libslic3r/Print.cpp:660 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " @@ -10265,7 +12006,7 @@ msgstr "" "(support_material_extruder == 0 or support_material_interface_extruder == 0)" "로 인쇄되는 경우 모든 노즐은 동일한 지름이어야합니다." -#: src/libslic3r/Print.cpp:614 +#: src/libslic3r/Print.cpp:668 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers " "need to be synchronized with the object layers." @@ -10273,65 +12014,106 @@ msgstr "" "와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 오브젝트 레이" "어와 동기화 해야 합니다." -#: src/libslic3r/Print.cpp:618 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only if they are " -"printed with the current extruder without triggering a tool change. (both " -"support_material_extruder and support_material_interface_extruder need to be " -"set to 0)." -msgstr "" -"와이프 타워는 현재 공구 교체를 트리거하지 않고 현재의 압출기로 인쇄 하는 경우" -"에만 비가용성 서포트를 지원 합니다. (support_material_extruder과 " -"support_material_interface_extruder 모두 0으로 설정 해야 합니다.)" - -#: src/libslic3r/Print.cpp:654 +#: src/libslic3r/Print.cpp:708 msgid "First layer height can't be greater than nozzle diameter" msgstr "첫번째 레이어의 높이는 노즐 직경보다 클 수 없습니다" -#: src/libslic3r/Print.cpp:659 +#: src/libslic3r/Print.cpp:713 msgid "Layer height can't be greater than nozzle diameter" msgstr "레이어 높이는 노즐 직경보다 클 수 없습니다" -#: src/libslic3r/Print.cpp:680 +#: src/libslic3r/Print.cpp:734 msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " "layer_gcode." msgstr "" -#: src/libslic3r/Print.cpp:682 +#: src/libslic3r/Print.cpp:736 msgid "" "\"G92 E0\" was found in before_layer_gcode, which is incompatible with " "absolute extruder addressing." msgstr "" -#: src/libslic3r/Print.cpp:684 +#: src/libslic3r/Print.cpp:738 msgid "" "\"G92 E0\" was found in layer_gcode, which is incompatible with absolute " "extruder addressing." msgstr "" -#: src/libslic3r/Print.cpp:826 +#: src/libslic3r/Print.cpp:880 msgid "Infilling layers" msgstr "레이어 채우기" -#: src/libslic3r/Print.cpp:848 +#: src/libslic3r/Print.cpp:908 msgid "Generating skirt and brim" msgstr "" -#: src/libslic3r/Print.cpp:896 +#: src/libslic3r/Print.cpp:956 msgid "Exporting G-code" msgstr "G코드 내보내기" -#: src/libslic3r/Print.cpp:900 +#: src/libslic3r/Print.cpp:960 msgid "Generating G-code" msgstr "G 코드 생성" +#: src/libslic3r/Print.cpp:1169 +msgid "Alert if supports needed" +msgstr "" + +#: src/libslic3r/Print.cpp:1174 +msgid "long bridging extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1175 +msgid "floating bridge anchors" +msgstr "" + +#: src/libslic3r/Print.cpp:1178 +msgid "collapsing overhang" +msgstr "" + +#: src/libslic3r/Print.cpp:1180 +msgid "loose extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1183 +msgid "low bed adhesion" +msgstr "" + +#: src/libslic3r/Print.cpp:1184 +msgid "floating object part" +msgstr "" + +#: src/libslic3r/Print.cpp:1185 +msgid "thin fragile section" +msgstr "" + +#: src/libslic3r/Print.cpp:1221 +msgid "Detected print stability issues" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "or" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "and" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "brim" +msgstr "" + +#: src/libslic3r/Print.cpp:1248 +msgid "Consider enabling supports" +msgstr "" + #: src/libslic3r/SLA/Pad.cpp:533 msgid "Pad brim size is too small for the current configuration." msgstr "패드 브램 크기는 현재 구성에 너무 작습니다." -#: src/libslic3r/SLAPrint.cpp:628 +#: src/libslic3r/SLAPrint.cpp:546 msgid "" "Cannot proceed without support points! Add support points or disable support " "generation." @@ -10339,7 +12121,7 @@ msgstr "" "서포트 포인트 없이 진행할 수 없습니다! 서포트 지점을 추가 하거나 서포트 생성" "을 사용 하지 않도록 설정 합니다." -#: src/libslic3r/SLAPrint.cpp:640 +#: src/libslic3r/SLAPrint.cpp:558 msgid "" "Elevation is too low for object. Use the \"Pad around object\" feature to " "print the object without elevation." @@ -10347,7 +12129,7 @@ msgstr "" "오브젝트의 표고가 너무 낮습니다. \"오브젝트 주위 의 패드\" 기능을 사용하여 고" "도 없이 오브젝트를 인쇄합니다." -#: src/libslic3r/SLAPrint.cpp:646 +#: src/libslic3r/SLAPrint.cpp:564 msgid "" "The endings of the support pillars will be deployed on the gap between the " "object and the pad. 'Support base safety distance' has to be greater than " @@ -10356,68 +12138,68 @@ msgstr "" "서포트 기둥 끝은 오브젝트와 패드 사이의 간격에 배치됩니다. 이를 방지하기 위" "해 '베이스 서포트 안전 거리'는 '패드 오브젝트 갭' 매개변수보다 커야 합니다." -#: src/libslic3r/SLAPrint.cpp:661 +#: src/libslic3r/SLAPrint.cpp:579 msgid "Exposition time is out of printer profile bounds." msgstr "박람회 시간은 프린터 프로필 경계가 없습니다." -#: src/libslic3r/SLAPrint.cpp:668 +#: src/libslic3r/SLAPrint.cpp:586 msgid "Initial exposition time is out of printer profile bounds." msgstr "초기 박람회 시간은 프린터 프로필 경계가 없습니다." -#: src/libslic3r/SLAPrint.cpp:784 +#: src/libslic3r/SLAPrint.cpp:693 msgid "Slicing done" msgstr "슬라이싱 완료" -#: src/libslic3r/SLAPrintSteps.cpp:47 +#: src/libslic3r/SLAPrintSteps.cpp:57 +msgid "Assembling model from parts" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:58 msgid "Hollowing model" msgstr "속이 빈 모델" -#: src/libslic3r/SLAPrintSteps.cpp:48 +#: src/libslic3r/SLAPrintSteps.cpp:59 msgid "Drilling holes into model." msgstr "구멍을 모델에 드릴링합니다." -#: src/libslic3r/SLAPrintSteps.cpp:49 +#: src/libslic3r/SLAPrintSteps.cpp:60 msgid "Slicing model" msgstr "슬라이싱 모델" -#: src/libslic3r/SLAPrintSteps.cpp:50 src/libslic3r/SLAPrintSteps.cpp:639 +#: src/libslic3r/SLAPrintSteps.cpp:61 src/libslic3r/SLAPrintSteps.cpp:691 msgid "Generating support points" msgstr "서포트 지점 생성" -#: src/libslic3r/SLAPrintSteps.cpp:51 +#: src/libslic3r/SLAPrintSteps.cpp:62 msgid "Generating support tree" msgstr "서포트 트리 생성" -#: src/libslic3r/SLAPrintSteps.cpp:52 +#: src/libslic3r/SLAPrintSteps.cpp:63 msgid "Generating pad" msgstr "패드 생성" -#: src/libslic3r/SLAPrintSteps.cpp:53 +#: src/libslic3r/SLAPrintSteps.cpp:64 msgid "Slicing supports" msgstr "슬라이싱 서포트즈" -#: src/libslic3r/SLAPrintSteps.cpp:68 +#: src/libslic3r/SLAPrintSteps.cpp:79 msgid "Merging slices and calculating statistics" msgstr "슬라이스 병합 및 통계 계산" -#: src/libslic3r/SLAPrintSteps.cpp:69 +#: src/libslic3r/SLAPrintSteps.cpp:80 msgid "Rasterizing layers" msgstr "래스터라이징 레이어" -#: src/libslic3r/SLAPrintSteps.cpp:435 -msgid "Too many overlapping holes." -msgstr "겹치는 구멍이 너무 많습니다." - -#: src/libslic3r/SLAPrintSteps.cpp:442 +#: src/libslic3r/SLAPrintSteps.cpp:255 msgid "" "Mesh to be hollowed is not suitable for hollowing (does not bound a volume)." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:450 +#: src/libslic3r/SLAPrintSteps.cpp:262 msgid "Unable to drill the current configuration of holes into the model." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:470 +#: src/libslic3r/SLAPrintSteps.cpp:271 msgid "" "Drilling holes into the mesh failed. This is usually caused by broken model. " "Try to fix it first." @@ -10425,26 +12207,33 @@ msgstr "" "메시에 구멍을 뚫지 못했습니다. 이는 일반적으로 모델 파손으로 인해 발생합니" "다. 먼저 고쳐보세요." -#: src/libslic3r/SLAPrintSteps.cpp:476 +#: src/libslic3r/SLAPrintSteps.cpp:279 msgid "Failed to drill some holes into the model" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:520 +#: src/libslic3r/SLAPrintSteps.cpp:289 +msgid "" +"Can't perform full mesh booleans! Some parts of the print will be previewed " +"with approximated meshes. This does not affect the quality of slices or the " +"physical print in any way." +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:510 msgid "" "Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "" "내부 오류: 일치하지 않는 슬라이스 인덱스로 인해 슬라이싱을 중지해야 했습니다." -#: src/libslic3r/SLAPrintSteps.cpp:691 src/libslic3r/SLAPrintSteps.cpp:700 -#: src/libslic3r/SLAPrintSteps.cpp:738 +#: src/libslic3r/SLAPrintSteps.cpp:740 src/libslic3r/SLAPrintSteps.cpp:749 +#: src/libslic3r/SLAPrintSteps.cpp:787 msgid "Visualizing supports" msgstr "지원 시각화" -#: src/libslic3r/SLAPrintSteps.cpp:730 +#: src/libslic3r/SLAPrintSteps.cpp:779 msgid "No pad can be generated for this model with the current configuration" msgstr "현재 구성을 통해 이 모델에 대해 패드를 생성할 수 없습니다." -#: src/libslic3r/SLAPrintSteps.cpp:854 +#: src/libslic3r/SLAPrintSteps.cpp:908 msgid "" "There are unprintable objects. Try to adjust support settings to make the " "objects printable." @@ -10456,27 +12245,27 @@ msgstr "" msgid "Failed processing of the output_filename_format template." msgstr "아래 output_filename_format 템플리트의 처리에 실패했습니다." -#: src/libslic3r/PrintConfig.cpp:236 src/libslic3r/PrintConfig.cpp:237 +#: src/libslic3r/PrintConfig.cpp:254 src/libslic3r/PrintConfig.cpp:255 msgid "Printer technology" msgstr "프린터 기술" -#: src/libslic3r/PrintConfig.cpp:244 +#: src/libslic3r/PrintConfig.cpp:260 msgid "Bed shape" msgstr "침대(bed) 모양" -#: src/libslic3r/PrintConfig.cpp:249 +#: src/libslic3r/PrintConfig.cpp:265 msgid "Bed custom texture" msgstr "침대 사용자 정의 텍스처" -#: src/libslic3r/PrintConfig.cpp:254 +#: src/libslic3r/PrintConfig.cpp:270 msgid "Bed custom model" msgstr "침대 사용자 정의 모델" -#: src/libslic3r/PrintConfig.cpp:259 +#: src/libslic3r/PrintConfig.cpp:275 msgid "Elephant foot compensation" msgstr "코끼리 발(Elephant foot) 보상값" -#: src/libslic3r/PrintConfig.cpp:261 +#: src/libslic3r/PrintConfig.cpp:277 msgid "" "The first layer will be shrunk in the XY plane by the configured value to " "compensate for the 1st layer squish aka an Elephant Foot effect." @@ -10484,27 +12273,27 @@ msgstr "" "첫 번째 레이어는 구성 요소 값에 따라 XY 평면에서 수축되어 일층 스퀴시 코끼리" "발(Elephant Foot) 효과를 보완합니다." -#: src/libslic3r/PrintConfig.cpp:269 +#: src/libslic3r/PrintConfig.cpp:285 msgid "G-code thumbnails" msgstr "G 코드 썸내일" -#: src/libslic3r/PrintConfig.cpp:270 +#: src/libslic3r/PrintConfig.cpp:286 msgid "" "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " "following format: \"XxY, XxY, ...\"" msgstr "" -#: src/libslic3r/PrintConfig.cpp:276 +#: src/libslic3r/PrintConfig.cpp:292 msgid "Format of G-code thumbnails" msgstr "" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:293 msgid "" "Format of G-code thumbnails: PNG for best quality, JPG for smallest size, " "QOI for low memory firmware" msgstr "" -#: src/libslic3r/PrintConfig.cpp:288 +#: src/libslic3r/PrintConfig.cpp:301 msgid "" "This setting controls the height (and thus the total number) of the slices/" "layers. Thinner layers give better accuracy but take more time to print." @@ -10512,21 +12301,21 @@ msgstr "" "이 설정은 슬라이스/레이어의 높이(따라서 총 수)를 제어합니다. 얇은 층은 더 나" "은 정확성을 제공하지만 인쇄하는 데는 더 많은 시간이 걸린다." -#: src/libslic3r/PrintConfig.cpp:295 +#: src/libslic3r/PrintConfig.cpp:308 msgid "Max print height" msgstr "최대 프린트 높이" -#: src/libslic3r/PrintConfig.cpp:296 +#: src/libslic3r/PrintConfig.cpp:309 msgid "" "Set this to the maximum height that can be reached by your extruder while " "printing." msgstr "인쇄 중에 익스트루더가 도달 할 수있는 최대 높이로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:304 +#: src/libslic3r/PrintConfig.cpp:317 msgid "Hostname, IP or URL" msgstr "호스트 이름(Hostname), IP or URL" -#: src/libslic3r/PrintConfig.cpp:305 +#: src/libslic3r/PrintConfig.cpp:318 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the hostname, IP address or URL of the printer host instance. Print host " @@ -10540,11 +12329,11 @@ msgstr "" "에 다음 형식으로 입력하여 액세스할 수 https://username:password@your-octopi-" "address/" -#: src/libslic3r/PrintConfig.cpp:314 +#: src/libslic3r/PrintConfig.cpp:327 msgid "API Key / Password" msgstr "API 키 / 암호" -#: src/libslic3r/PrintConfig.cpp:315 +#: src/libslic3r/PrintConfig.cpp:328 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the API Key or the password required for authentication." @@ -10552,11 +12341,11 @@ msgstr "" "Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드에는 API " "키 또는 인증에 필요한 암호가 포함되어야 합니다." -#: src/libslic3r/PrintConfig.cpp:323 +#: src/libslic3r/PrintConfig.cpp:336 msgid "Name of the printer" msgstr "프린터 공급 업체의 이름입니다." -#: src/libslic3r/PrintConfig.cpp:331 +#: src/libslic3r/PrintConfig.cpp:344 msgid "" "Custom CA certificate file can be specified for HTTPS OctoPrint connections, " "in crt/pem format. If left blank, the default OS CA certificate repository " @@ -10565,46 +12354,58 @@ msgstr "" "사용자 지정 CA 인증서 파일은 crt/pem 형식의 HTTPS 옥토 프린트 연결에 대해 지" "정할 수 있습니다. 비워 두면 기본 OS CA 인증서 리포지토리가 사용 됩니다." -#: src/libslic3r/PrintConfig.cpp:347 +#: src/libslic3r/PrintConfig.cpp:360 msgid "Password" msgstr "비밀번호" -#: src/libslic3r/PrintConfig.cpp:355 +#: src/libslic3r/PrintConfig.cpp:368 msgid "Ignore HTTPS certificate revocation checks" msgstr "" -#: src/libslic3r/PrintConfig.cpp:356 +#: src/libslic3r/PrintConfig.cpp:369 msgid "" "Ignore HTTPS certificate revocation checks in case of missing or offline " "distribution points. One may want to enable this option for self signed " "certificates if connection fails." msgstr "" -#: src/libslic3r/PrintConfig.cpp:363 +#: src/libslic3r/PrintConfig.cpp:376 msgid "Printer preset names" msgstr "" -#: src/libslic3r/PrintConfig.cpp:364 +#: src/libslic3r/PrintConfig.cpp:377 msgid "Names of presets related to the physical printer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:369 +#: src/libslic3r/PrintConfig.cpp:382 msgid "Authorization Type" msgstr "권한 부여 유형" -#: src/libslic3r/PrintConfig.cpp:374 +#: src/libslic3r/PrintConfig.cpp:385 msgid "API key" msgstr "API key" -#: src/libslic3r/PrintConfig.cpp:375 +#: src/libslic3r/PrintConfig.cpp:386 msgid "HTTP digest" msgstr "HTTP 다이제스트" -#: src/libslic3r/PrintConfig.cpp:395 +#: src/libslic3r/PrintConfig.cpp:406 +msgid "Avoid crossing curled overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:407 +msgid "" +"Plan travel moves such that the extruder avoids areas where the filament may " +"be curled up. This is mostly happening on steeper rounded overhangs and may " +"cause a crash with the nozzle. This feature slows down both the print and " +"the G-code generation." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:414 msgid "Avoid crossing perimeters" msgstr "교체된 둘레를 피하세요." -#: src/libslic3r/PrintConfig.cpp:396 +#: src/libslic3r/PrintConfig.cpp:415 msgid "" "Optimize travel moves in order to minimize the crossing of perimeters. This " "is mostly useful with Bowden extruders which suffer from oozing. This " @@ -10614,11 +12415,11 @@ msgstr "" "(Bowling) 압출기가 흘러 나오기 쉬운 경우에 주로 유용합니다. 이 기능을 사용하" "면 인쇄 및 G 코드 생성 속도가 느려집니다." -#: src/libslic3r/PrintConfig.cpp:403 +#: src/libslic3r/PrintConfig.cpp:422 msgid "Avoid crossing perimeters - Max detour length" msgstr "경계를 넘어가지 마십시오 - 최대 우회 길이" -#: src/libslic3r/PrintConfig.cpp:405 +#: src/libslic3r/PrintConfig.cpp:424 msgid "" "The maximum detour length for avoid crossing perimeters. If the detour is " "longer than this value, avoid crossing perimeters is not applied for this " @@ -10629,15 +12430,15 @@ msgstr "" "동 경로에 경계 횡단이 적용되지 않는 것을 피하십시오. 우회 길이는 절대 값 또" "는 백분율(예: 50%)으로 지정할 수 있습니다. 직항 경로." -#: src/libslic3r/PrintConfig.cpp:408 +#: src/libslic3r/PrintConfig.cpp:427 msgid "mm or % (zero to disable)" msgstr "mm 또는 %(비활성화할 0)" -#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:2839 +#: src/libslic3r/PrintConfig.cpp:434 src/libslic3r/PrintConfig.cpp:2927 msgid "Other layers" msgstr "다른 레이어" -#: src/libslic3r/PrintConfig.cpp:416 +#: src/libslic3r/PrintConfig.cpp:435 msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." @@ -10645,11 +12446,11 @@ msgstr "" "첫 번째 레이어 이후의 레이어 온도. 이 값을 0으로 설정하면 출력에서 ​​베드 온도 " "제어 명령을 비활성화합니다." -#: src/libslic3r/PrintConfig.cpp:419 +#: src/libslic3r/PrintConfig.cpp:438 msgid "Bed temperature" msgstr "배드 온도" -#: src/libslic3r/PrintConfig.cpp:426 +#: src/libslic3r/PrintConfig.cpp:445 msgid "" "This custom code is inserted at every layer change, right before the Z move. " "Note that you can use placeholder variables for all Slic3r settings as well " @@ -10658,11 +12459,11 @@ msgstr "" "이 사용자 정의 코드는 Z 이동 직전의 모든 레이어 변경에 삽입됩니다. Slic3r 설" "정과 [layer_num] 및 [layer_z]에 대한 자리 표시 자 변수를 사용할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:436 +#: src/libslic3r/PrintConfig.cpp:455 msgid "Between objects G-code" msgstr "객체 간 G 코드" -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:456 msgid "" "This code is inserted between objects when using sequential printing. By " "default extruder and bed temperature are reset using non-wait command; " @@ -10677,15 +12478,15 @@ msgstr "" "지 않습니다. 모든 Slic3r 설정에 자리 표시 변수를 사용할 수 있으므로 원하는 위" "치에 \"M109 S[first_layer_temperature]\"명령을 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:448 +#: src/libslic3r/PrintConfig.cpp:467 msgid "Number of solid layers to generate on bottom surfaces." msgstr "바닥면에 생성할 솔리드 레이어의 수." -#: src/libslic3r/PrintConfig.cpp:449 +#: src/libslic3r/PrintConfig.cpp:468 msgid "Bottom solid layers" msgstr "바닥 단일 레이어" -#: src/libslic3r/PrintConfig.cpp:457 +#: src/libslic3r/PrintConfig.cpp:476 msgid "" "The number of bottom solid layers is increased above bottom_solid_layers if " "necessary to satisfy minimum thickness of bottom shell." @@ -10693,15 +12494,15 @@ msgstr "" "바닥 쉘의 최소 두께를 충족하기 위해 필요한 경우 바닥 솔리드 레이어의 수가 " "bottom_solid_layers 이상 증가합니다." -#: src/libslic3r/PrintConfig.cpp:459 +#: src/libslic3r/PrintConfig.cpp:478 msgid "Minimum bottom shell thickness" msgstr "최소 바닥 쉘 두께" -#: src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:484 msgid "Bridge" msgstr "브리지" -#: src/libslic3r/PrintConfig.cpp:466 +#: src/libslic3r/PrintConfig.cpp:485 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." @@ -10709,21 +12510,21 @@ msgstr "" "이것은 프린터가 브릿지에 사용할 가속도입니다. 브리지의 가속 제어를 사용하지 " "않으려면 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:468 src/libslic3r/PrintConfig.cpp:639 -#: src/libslic3r/PrintConfig.cpp:1192 src/libslic3r/PrintConfig.cpp:1201 -#: src/libslic3r/PrintConfig.cpp:1401 src/libslic3r/PrintConfig.cpp:1410 -#: src/libslic3r/PrintConfig.cpp:1419 src/libslic3r/PrintConfig.cpp:1713 -#: src/libslic3r/PrintConfig.cpp:1764 src/libslic3r/PrintConfig.cpp:1775 -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1983 -#: src/libslic3r/PrintConfig.cpp:1991 +#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:1252 src/libslic3r/PrintConfig.cpp:1261 +#: src/libslic3r/PrintConfig.cpp:1447 src/libslic3r/PrintConfig.cpp:1456 +#: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1750 +#: src/libslic3r/PrintConfig.cpp:1801 src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1822 src/libslic3r/PrintConfig.cpp:2013 +#: src/libslic3r/PrintConfig.cpp:2021 msgid "mm/s²" msgstr "mm³/s²" -#: src/libslic3r/PrintConfig.cpp:474 +#: src/libslic3r/PrintConfig.cpp:493 msgid "Bridging angle" msgstr "브릿지 각도" -#: src/libslic3r/PrintConfig.cpp:476 +#: src/libslic3r/PrintConfig.cpp:495 msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for all " @@ -10733,35 +12534,30 @@ msgstr "" "로 계산됩니다. 그렇지 않으면 제공된 각도가 모든 브리지에 사용됩니다. 각도 제" "로는 180 °를 사용하십시오." -#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:1102 -#: src/libslic3r/PrintConfig.cpp:2282 src/libslic3r/PrintConfig.cpp:2292 -#: src/libslic3r/PrintConfig.cpp:2583 src/libslic3r/PrintConfig.cpp:2824 -#: src/libslic3r/PrintConfig.cpp:3041 src/libslic3r/PrintConfig.cpp:3144 -#: src/libslic3r/PrintConfig.cpp:3698 src/libslic3r/PrintConfig.cpp:3819 -msgid "°" -msgstr "°" - -#: src/libslic3r/PrintConfig.cpp:485 +#: src/libslic3r/PrintConfig.cpp:504 msgid "Bridges fan speed" msgstr "브릿지 팬 속도" -#: src/libslic3r/PrintConfig.cpp:486 +#: src/libslic3r/PrintConfig.cpp:505 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "이 팬 속도는 모든 브릿지 및 오버행 중에 적용됩니다." -#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:1114 -#: src/libslic3r/PrintConfig.cpp:1601 src/libslic3r/PrintConfig.cpp:1793 -#: src/libslic3r/PrintConfig.cpp:1856 src/libslic3r/PrintConfig.cpp:2115 -#: src/libslic3r/PrintConfig.cpp:2174 src/libslic3r/PrintConfig.cpp:3323 -#: src/libslic3r/PrintConfig.cpp:3612 src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:596 +#: src/libslic3r/PrintConfig.cpp:605 src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:623 src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1893 src/libslic3r/PrintConfig.cpp:2145 +#: src/libslic3r/PrintConfig.cpp:2204 src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3369 src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3870 msgid "%" msgstr "%" -#: src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:513 msgid "Bridge flow ratio" msgstr "브릿지 유량(flow)값" -#: src/libslic3r/PrintConfig.cpp:496 +#: src/libslic3r/PrintConfig.cpp:515 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -10772,101 +12568,146 @@ msgstr "" "당겨 처짐을 방지하기 위해 약간 줄일 수 있지만 기본 설정은 일반적으로 좋지만" "이 문제를 해결하기 전에 냉각 (팬 사용)을 시도해야합니다." -#: src/libslic3r/PrintConfig.cpp:506 +#: src/libslic3r/PrintConfig.cpp:525 msgid "Bridges" msgstr "브릿지(Bridges)" -#: src/libslic3r/PrintConfig.cpp:508 +#: src/libslic3r/PrintConfig.cpp:527 msgid "Speed for printing bridges." msgstr "브릿지 인쇄 속도." -#: src/libslic3r/PrintConfig.cpp:509 src/libslic3r/PrintConfig.cpp:920 -#: src/libslic3r/PrintConfig.cpp:928 src/libslic3r/PrintConfig.cpp:937 -#: src/libslic3r/PrintConfig.cpp:945 src/libslic3r/PrintConfig.cpp:972 -#: src/libslic3r/PrintConfig.cpp:991 src/libslic3r/PrintConfig.cpp:1329 -#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1620 -#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1730 -#: src/libslic3r/PrintConfig.cpp:1742 src/libslic3r/PrintConfig.cpp:1752 -#: src/libslic3r/PrintConfig.cpp:1815 src/libslic3r/PrintConfig.cpp:1874 -#: src/libslic3r/PrintConfig.cpp:2022 src/libslic3r/PrintConfig.cpp:2249 -#: src/libslic3r/PrintConfig.cpp:2258 src/libslic3r/PrintConfig.cpp:2789 -#: src/libslic3r/PrintConfig.cpp:2939 src/libslic3r/PrintConfig.cpp:2949 +#: src/libslic3r/PrintConfig.cpp:528 src/libslic3r/PrintConfig.cpp:1009 +#: src/libslic3r/PrintConfig.cpp:1017 src/libslic3r/PrintConfig.cpp:1026 +#: src/libslic3r/PrintConfig.cpp:1034 src/libslic3r/PrintConfig.cpp:1061 +#: src/libslic3r/PrintConfig.cpp:1080 src/libslic3r/PrintConfig.cpp:1386 +#: src/libslic3r/PrintConfig.cpp:1579 src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1733 src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1779 src/libslic3r/PrintConfig.cpp:1789 +#: src/libslic3r/PrintConfig.cpp:1852 src/libslic3r/PrintConfig.cpp:1911 +#: src/libslic3r/PrintConfig.cpp:2052 src/libslic3r/PrintConfig.cpp:2279 +#: src/libslic3r/PrintConfig.cpp:2288 src/libslic3r/PrintConfig.cpp:2810 +#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3037 msgid "mm/s" msgstr "mm³/s²" -#: src/libslic3r/PrintConfig.cpp:516 +#: src/libslic3r/PrintConfig.cpp:535 +msgid "Enable dynamic overhang speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:537 +msgid "This setting enables dynamic speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:541 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Speeds for overhang " +"sizes in between are calculated via linear interpolation. If set as " +"percentage, the speed is calculated over the external perimeter speed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:547 src/libslic3r/PrintConfig.cpp:594 +msgid "speed for 0% overlap (bridge)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:550 src/libslic3r/PrintConfig.cpp:559 +#: src/libslic3r/PrintConfig.cpp:568 src/libslic3r/PrintConfig.cpp:577 +#: src/libslic3r/PrintConfig.cpp:856 src/libslic3r/PrintConfig.cpp:1305 +#: src/libslic3r/PrintConfig.cpp:1316 src/libslic3r/PrintConfig.cpp:2387 +#: src/libslic3r/PrintConfig.cpp:2440 src/libslic3r/PrintConfig.cpp:2765 +#: src/libslic3r/PrintConfig.cpp:2997 +msgid "mm/s or %" +msgstr "mm/s 또는 %" + +#: src/libslic3r/PrintConfig.cpp:556 src/libslic3r/PrintConfig.cpp:603 +msgid "speed for 25% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:612 +msgid "speed for 50% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:574 src/libslic3r/PrintConfig.cpp:621 +msgid "speed for 75% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:583 +msgid "Enable dynamic fan speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:584 +msgid "This setting enables dynamic fan speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:589 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Fan speeds for " +"overhang sizes in between are calculated via linear interpolation. " +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:630 msgid "Brim width" msgstr "브림 폭" -#: src/libslic3r/PrintConfig.cpp:518 +#: src/libslic3r/PrintConfig.cpp:632 msgid "" "The horizontal width of the brim that will be printed around each object on " "the first layer. When raft is used, no brim is generated (use " "raft_first_layer_expansion)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:527 +#: src/libslic3r/PrintConfig.cpp:641 msgid "Brim type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:529 +#: src/libslic3r/PrintConfig.cpp:643 msgid "" "The places where the brim will be printed around each object on the first " "layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:535 +#: src/libslic3r/PrintConfig.cpp:645 msgid "No brim" msgstr "" -#: src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:646 msgid "Outer brim only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:537 +#: src/libslic3r/PrintConfig.cpp:647 msgid "Inner brim only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:538 +#: src/libslic3r/PrintConfig.cpp:648 msgid "Outer and inner brim" msgstr "" -#: src/libslic3r/PrintConfig.cpp:543 +#: src/libslic3r/PrintConfig.cpp:654 msgid "Brim separation gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:545 +#: src/libslic3r/PrintConfig.cpp:656 msgid "" "Offset of brim from the printed object. The offset is applied after the " "elephant foot compensation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:552 -msgid "Clip multi-part objects" -msgstr "멀티 파트 오브젝트 클립" - -#: src/libslic3r/PrintConfig.cpp:553 -msgid "" -"When printing multi-material objects, this settings will make Slic3r to clip " -"the overlapping object parts one by the other (2nd part will be clipped by " -"the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -msgstr "" -"다중 재료 객체를 인쇄할 때 이 설정은 Slic3r가 겹치는 오브젝트 부품을 하나씩 " -"클립으로 만듭니다(2부는 1, 3부는 1, 2부에 의해 잘립니다)." - -#: src/libslic3r/PrintConfig.cpp:560 +#: src/libslic3r/PrintConfig.cpp:663 msgid "Colorprint height" msgstr "컬러 프린트 높이" -#: src/libslic3r/PrintConfig.cpp:561 +#: src/libslic3r/PrintConfig.cpp:664 msgid "Heights at which a filament change is to occur." msgstr "필라멘트 체인지가 발생 하는 높이." -#: src/libslic3r/PrintConfig.cpp:571 +#: src/libslic3r/PrintConfig.cpp:674 msgid "Compatible printers condition" msgstr "호환 가능한 프린터 조건" -#: src/libslic3r/PrintConfig.cpp:572 +#: src/libslic3r/PrintConfig.cpp:675 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " @@ -10875,11 +12716,11 @@ msgstr "" "활성 프린터 프로파일의 구성 값을 사용하는 표현식. 이 표현식이 true로 평가되면" "이 프로필은 활성 프린터 프로필과 호환되는 것으로 간주됩니다." -#: src/libslic3r/PrintConfig.cpp:586 +#: src/libslic3r/PrintConfig.cpp:689 msgid "Compatible print profiles condition" msgstr "호환 되는 인쇄 프로파일 조건" -#: src/libslic3r/PrintConfig.cpp:587 +#: src/libslic3r/PrintConfig.cpp:690 msgid "" "A boolean expression using the configuration values of an active print " "profile. If this expression evaluates to true, this profile is considered " @@ -10888,11 +12729,11 @@ msgstr "" "활성 인쇄 프로 파일의 구성 값을 사용하는 부울식입니다. 이 식이 true로 평가 되" "면, 이 프로필이 활성 인쇄 프로필과 호환 되는 것으로 간주 됩니다." -#: src/libslic3r/PrintConfig.cpp:604 +#: src/libslic3r/PrintConfig.cpp:707 msgid "Complete individual objects" msgstr "개별 개체 완성" -#: src/libslic3r/PrintConfig.cpp:605 +#: src/libslic3r/PrintConfig.cpp:708 msgid "" "When printing multiple objects or copies, this feature will complete each " "object before moving onto next one (and starting it from its bottom layer). " @@ -10904,11 +12745,11 @@ msgstr "" "피할 때 유용합니다. Slic3r은 압출기 충돌을 경고하고 예방해야하지만 조심하십시" "오." -#: src/libslic3r/PrintConfig.cpp:613 +#: src/libslic3r/PrintConfig.cpp:716 msgid "Enable auto cooling" msgstr "자동 냉각 사용" -#: src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:717 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." @@ -10916,23 +12757,23 @@ msgstr "" "이 플래그는 레이어 인쇄 시간에 따라 인쇄 속도와 팬 속도를 조정하는 자동 냉각 " "논리를 활성화합니다." -#: src/libslic3r/PrintConfig.cpp:619 +#: src/libslic3r/PrintConfig.cpp:722 msgid "Cooling tube position" msgstr "냉각 튜브 위치" -#: src/libslic3r/PrintConfig.cpp:620 +#: src/libslic3r/PrintConfig.cpp:723 msgid "Distance of the center-point of the cooling tube from the extruder tip." msgstr "압출기 끝에서 냉각 튜브의 중심점의 거리." -#: src/libslic3r/PrintConfig.cpp:627 +#: src/libslic3r/PrintConfig.cpp:730 msgid "Cooling tube length" msgstr "냉각 튜브 길이" -#: src/libslic3r/PrintConfig.cpp:628 +#: src/libslic3r/PrintConfig.cpp:731 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "냉각 튜브의 길이는 냉각을위한 공간을 제한하는 내부 이동합니다." -#: src/libslic3r/PrintConfig.cpp:636 +#: src/libslic3r/PrintConfig.cpp:739 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " @@ -10941,11 +12782,11 @@ msgstr "" "역할 별 가속도 값이 사용 된 후에 프린터가 재설정되는 속도입니다 (둘레 / 충" "전). 가속을 전혀 재설정하지 않으려면 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:645 +#: src/libslic3r/PrintConfig.cpp:748 msgid "Default filament profile" msgstr "기본 필라멘트 프로파일" -#: src/libslic3r/PrintConfig.cpp:646 +#: src/libslic3r/PrintConfig.cpp:749 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " @@ -10954,12 +12795,12 @@ msgstr "" "현재 프린터 프로파일과 연관된 기본 필라멘트 프로파일. 현재 프린터 프로파일을 " "선택하면 이 필라멘트 프로파일이 활성화됩니다." -#: src/libslic3r/PrintConfig.cpp:652 +#: src/libslic3r/PrintConfig.cpp:755 msgid "Default print profile" msgstr "기본 인쇄 프로파일" -#: src/libslic3r/PrintConfig.cpp:653 src/libslic3r/PrintConfig.cpp:3542 -#: src/libslic3r/PrintConfig.cpp:3553 +#: src/libslic3r/PrintConfig.cpp:756 src/libslic3r/PrintConfig.cpp:3819 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -10968,11 +12809,11 @@ msgstr "" "현재 프린터 프로파일과 연관된 기본 인쇄 프로파일. 현재 프린터 프로파일을 선택" "하면이 인쇄 프로파일이 활성화됩니다." -#: src/libslic3r/PrintConfig.cpp:659 +#: src/libslic3r/PrintConfig.cpp:762 msgid "Disable fan for the first" msgstr "첫 번째 팬 사용 중지" -#: src/libslic3r/PrintConfig.cpp:660 +#: src/libslic3r/PrintConfig.cpp:763 msgid "" "You can set this to a positive value to disable fan at all during the first " "layers, so that it does not make adhesion worse." @@ -10980,26 +12821,26 @@ msgstr "" "이 값을 양수 값으로 설정하면 첫 번째 레이어에서 팬을 사용하지 않도록 설정하" "여 접착력을 악화시키지 않습니다." -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:772 msgid "Don't support bridges" msgstr "서포트와 브릿지를 사용하지 않음" -#: src/libslic3r/PrintConfig.cpp:671 +#: src/libslic3r/PrintConfig.cpp:774 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." msgstr "" "브릿지 영역 아래에 서포팅 재료가 생성되는 것을 방지하기위한 실험적 옵션." -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:780 msgid "Distance between copies" msgstr "복사본 간 거리" -#: src/libslic3r/PrintConfig.cpp:678 +#: src/libslic3r/PrintConfig.cpp:781 msgid "Distance used for the auto-arrange feature of the plater." msgstr "플래이터(plater)의 자동 정렬 기능에 사용되는 거리입니다." -#: src/libslic3r/PrintConfig.cpp:686 +#: src/libslic3r/PrintConfig.cpp:789 msgid "" "This end procedure is inserted at the end of the output file. Note that you " "can use placeholder variables for all PrusaSlicer settings." @@ -11007,7 +12848,7 @@ msgstr "" "이 최종 절차는 출력 파일의 끝에 삽입됩니다. 모든 PrusaSlicer 설정에 자리 표시" "자 변수를 사용할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:696 +#: src/libslic3r/PrintConfig.cpp:799 msgid "" "This end procedure is inserted at the end of the output file, before the " "printer end gcode (and before any toolchange from this filament in case of " @@ -11020,23 +12861,11 @@ msgstr "" "설정에 자리 표시자 변수를 사용할 수 있습니다. 압출기가 여러 개 있는 경우 " "gcode는 압출기 순서로 처리됩니다." -#: src/libslic3r/PrintConfig.cpp:707 -msgid "Ensure vertical shell thickness" -msgstr "수직 쉘(shell) 두께 확인" - -#: src/libslic3r/PrintConfig.cpp:709 -msgid "" -"Add solid infill near sloping surfaces to guarantee the vertical shell " -"thickness (top+bottom solid layers)." -msgstr "" -"경사 표면 근처에 솔리드 인필을 추가하여 수직 셸 두께(상단+하단 솔리드 레이어)" -"를 보장하십시오." - -#: src/libslic3r/PrintConfig.cpp:715 +#: src/libslic3r/PrintConfig.cpp:810 msgid "Top fill pattern" msgstr "상단 채우기 패턴" -#: src/libslic3r/PrintConfig.cpp:717 +#: src/libslic3r/PrintConfig.cpp:812 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." @@ -11044,45 +12873,45 @@ msgstr "" "상단 채우기패턴으로 채우기. 이는 인접한 솔리드 쉘이 아닌 맨 위 가시 레이어에" "만 영향을 줍니다." -#: src/libslic3r/PrintConfig.cpp:728 src/libslic3r/PrintConfig.cpp:1169 -#: src/libslic3r/PrintConfig.cpp:2754 src/libslic3r/PrintConfig.cpp:2771 +#: src/libslic3r/PrintConfig.cpp:815 src/libslic3r/PrintConfig.cpp:1228 +#: src/libslic3r/PrintConfig.cpp:2776 src/libslic3r/PrintConfig.cpp:2791 msgid "Rectilinear" msgstr "직선면(Rectilinear)" -#: src/libslic3r/PrintConfig.cpp:729 +#: src/libslic3r/PrintConfig.cpp:816 msgid "Monotonic" msgstr "단조" -#: src/libslic3r/PrintConfig.cpp:730 +#: src/libslic3r/PrintConfig.cpp:817 msgid "Monotonic Lines" msgstr "" -#: src/libslic3r/PrintConfig.cpp:731 src/libslic3r/PrintConfig.cpp:1170 +#: src/libslic3r/PrintConfig.cpp:818 src/libslic3r/PrintConfig.cpp:1229 msgid "Aligned Rectilinear" msgstr "정렬된 직선성" -#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:1176 -#: src/libslic3r/PrintConfig.cpp:2772 +#: src/libslic3r/PrintConfig.cpp:819 src/libslic3r/PrintConfig.cpp:1235 +#: src/libslic3r/PrintConfig.cpp:2792 msgid "Concentric" msgstr "동심원(Concentric)" -#: src/libslic3r/PrintConfig.cpp:733 src/libslic3r/PrintConfig.cpp:1180 +#: src/libslic3r/PrintConfig.cpp:820 src/libslic3r/PrintConfig.cpp:1239 msgid "Hilbert Curve" msgstr "힐버트 곡선(Hilbert Curve)" -#: src/libslic3r/PrintConfig.cpp:734 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:821 src/libslic3r/PrintConfig.cpp:1240 msgid "Archimedean Chords" msgstr "아르키메데우스(Archimedean Chords)" -#: src/libslic3r/PrintConfig.cpp:735 src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:822 src/libslic3r/PrintConfig.cpp:1241 msgid "Octagram Spiral" msgstr "옥타그램 나선(Octagram Spiral)" -#: src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:830 msgid "Bottom fill pattern" msgstr "하단 채우기 패턴" -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:832 msgid "" "Fill pattern for bottom infill. This only affects the bottom external " "visible layer, and not its adjacent solid shells." @@ -11090,12 +12919,12 @@ msgstr "" "하단 채우기 패턴에 대한 채우기 패턴입니다. 이는 인접한 솔리드 쉘이 아닌 하단 " "외부 가시 레이어에만 영향을 줍니다." -#: src/libslic3r/PrintConfig.cpp:753 src/libslic3r/PrintConfig.cpp:765 -#: src/libslic3r/PrintConfig.cpp:1988 +#: src/libslic3r/PrintConfig.cpp:839 src/libslic3r/PrintConfig.cpp:851 +#: src/libslic3r/PrintConfig.cpp:2018 msgid "External perimeters" msgstr "외측 둘레" -#: src/libslic3r/PrintConfig.cpp:755 +#: src/libslic3r/PrintConfig.cpp:841 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " "perimeters. If left zero, default extrusion width will be used if set, " @@ -11106,18 +12935,18 @@ msgstr "" "오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경이 사" "용된다. 백분율(예: 200%)로 표현되는 경우, 레이어 높이에 걸쳐 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:758 src/libslic3r/PrintConfig.cpp:869 -#: src/libslic3r/PrintConfig.cpp:1223 src/libslic3r/PrintConfig.cpp:1445 -#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1529 -#: src/libslic3r/PrintConfig.cpp:2011 src/libslic3r/PrintConfig.cpp:2397 -#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2660 -#: src/libslic3r/PrintConfig.cpp:2895 src/libslic3r/PrintConfig.cpp:3117 -#: src/libslic3r/PrintConfig.cpp:3132 src/libslic3r/PrintConfig.cpp:3166 -#: src/libslic3r/PrintConfig.cpp:3178 +#: src/libslic3r/PrintConfig.cpp:844 src/libslic3r/PrintConfig.cpp:958 +#: src/libslic3r/PrintConfig.cpp:1283 src/libslic3r/PrintConfig.cpp:1491 +#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1570 +#: src/libslic3r/PrintConfig.cpp:2041 src/libslic3r/PrintConfig.cpp:2428 +#: src/libslic3r/PrintConfig.cpp:2601 src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2983 src/libslic3r/PrintConfig.cpp:3204 +#: src/libslic3r/PrintConfig.cpp:3219 src/libslic3r/PrintConfig.cpp:3253 +#: src/libslic3r/PrintConfig.cpp:3265 msgid "mm or %" msgstr "mm 또는 %" -#: src/libslic3r/PrintConfig.cpp:767 +#: src/libslic3r/PrintConfig.cpp:853 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " @@ -11127,28 +12956,21 @@ msgstr "" "(예: 80%)로 표현되는 경우 위의 Perimeter 속도 설정에 따라 계산된다. 자동을 위" "해 0으로 설정한다." -#: src/libslic3r/PrintConfig.cpp:770 src/libslic3r/PrintConfig.cpp:1245 -#: src/libslic3r/PrintConfig.cpp:1256 src/libslic3r/PrintConfig.cpp:2356 -#: src/libslic3r/PrintConfig.cpp:2409 src/libslic3r/PrintConfig.cpp:2740 -#: src/libslic3r/PrintConfig.cpp:2909 -msgid "mm/s or %" -msgstr "mm/s 또는 %" - -#: src/libslic3r/PrintConfig.cpp:777 +#: src/libslic3r/PrintConfig.cpp:863 msgid "External perimeters first" msgstr "외부 경계선 먼저" -#: src/libslic3r/PrintConfig.cpp:779 +#: src/libslic3r/PrintConfig.cpp:865 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." msgstr "기본 역순 대신 가장 바깥쪽부터 가장 안쪽까지 윤곽선을 인쇄합니다." -#: src/libslic3r/PrintConfig.cpp:785 +#: src/libslic3r/PrintConfig.cpp:871 msgid "Extra perimeters if needed" msgstr "필요한 경우 추가 둘레" -#: src/libslic3r/PrintConfig.cpp:787 +#: src/libslic3r/PrintConfig.cpp:873 msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " "keeps adding perimeters, until more than 70% of the loop immediately above " @@ -11158,7 +12980,18 @@ msgstr "" "오. 위의 루프의 70% of 이상이 지지될 때까지 Slic3r는 계속해서 둘ㄹ를 추가한" "다." -#: src/libslic3r/PrintConfig.cpp:797 +#: src/libslic3r/PrintConfig.cpp:880 +msgid "Extra perimeters on overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:882 +msgid "" +"Detect overhang areas where bridges cannot be anchored, and fill them with " +"extra perimeter paths. These paths are anchored to the nearby non-overhang " +"area when possible." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:890 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " @@ -11167,7 +13000,7 @@ msgstr "" "사용할 익스트루더(더 구체적인 익스트루더 설정이 지정되지 않은 경우) 이 값은 " "파라미터 및 익스트루더를 초과하지만, 서포트 익스트루더는 초과 하지 않는다." -#: src/libslic3r/PrintConfig.cpp:809 +#: src/libslic3r/PrintConfig.cpp:898 msgid "" "Set this to the vertical distance between your nozzle tip and (usually) the " "X carriage rods. In other words, this is the height of the clearance " @@ -11178,7 +13011,7 @@ msgstr "" "다시 말하면, 이것은 당신의 익스트루더 주위의 틈새 실린더의 높이이며, 그것은 " "다른 인쇄된 물체와 충돌하기 전에 익스트루더의 최대 깊이를 나타냅니다." -#: src/libslic3r/PrintConfig.cpp:820 +#: src/libslic3r/PrintConfig.cpp:909 msgid "" "Set this to the clearance radius around your extruder. If the extruder is " "not centered, choose the largest value for safety. This setting is used to " @@ -11188,20 +13021,20 @@ msgstr "" "있지 않으면 안전을 위해 가장 큰 값을 선택하십시오. 이 설정은 충돌 여부를 확인" "하고 플래터에 그래픽 미리 보기를 표시하기 위해 사용된다." -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:919 msgid "Extruder Color" msgstr "익스트루더 컬러" -#: src/libslic3r/PrintConfig.cpp:831 src/libslic3r/PrintConfig.cpp:894 -#: src/libslic3r/PrintConfig.cpp:3394 +#: src/libslic3r/PrintConfig.cpp:920 src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:3666 msgid "This is only used in the Slic3r interface as a visual help." msgstr "이것은 시각적 도움말로 Slic3r 인터페이스에서만 사용된다." -#: src/libslic3r/PrintConfig.cpp:837 +#: src/libslic3r/PrintConfig.cpp:926 msgid "Extruder offset" msgstr "익스트루더 오프셋" -#: src/libslic3r/PrintConfig.cpp:838 +#: src/libslic3r/PrintConfig.cpp:927 msgid "" "If your firmware doesn't handle the extruder displacement you need the G-" "code to take it into account. This option lets you specify the displacement " @@ -11212,11 +13045,11 @@ msgstr "" "옵션을 사용하면 첫 번째 것에 대한 각 압출기의 변위를 지정할 수 있습니다. 양" "의 좌표가 필요합니다 (XY 좌표에서 뺍니다)." -#: src/libslic3r/PrintConfig.cpp:847 +#: src/libslic3r/PrintConfig.cpp:936 msgid "Extrusion axis" msgstr "압출 축" -#: src/libslic3r/PrintConfig.cpp:848 +#: src/libslic3r/PrintConfig.cpp:937 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." @@ -11224,11 +13057,11 @@ msgstr "" "이 옵션을 사용하여 프린터의 익스트루더에 연결된 축 문자를 설정합니다 (보통 E" "이지만 일부 프린터는 A를 사용합니다)." -#: src/libslic3r/PrintConfig.cpp:853 +#: src/libslic3r/PrintConfig.cpp:942 msgid "Extrusion multiplier" msgstr "압출 승수" -#: src/libslic3r/PrintConfig.cpp:854 +#: src/libslic3r/PrintConfig.cpp:943 msgid "" "This factor changes the amount of flow proportionally. You may need to tweak " "this setting to get nice surface finish and correct single wall widths. " @@ -11240,11 +13073,11 @@ msgstr "" "이입니다. 이 값을 더 변경해야한다고 판단되면 필라멘트 직경과 펌웨어 E 단계를 " "확인하십시오." -#: src/libslic3r/PrintConfig.cpp:863 +#: src/libslic3r/PrintConfig.cpp:952 msgid "Default extrusion width" msgstr "기본 압출 폭" -#: src/libslic3r/PrintConfig.cpp:865 +#: src/libslic3r/PrintConfig.cpp:954 msgid "" "Set this to a non-zero value to allow a manual extrusion width. If left to " "zero, Slic3r derives extrusion widths from the nozzle diameter (see the " @@ -11257,11 +13090,11 @@ msgstr "" "의 툴팁 참조). 백분율로 표시되는 경우 (예 : 230 %) 레이어 높이를 기준으로 계" "산됩니다." -#: src/libslic3r/PrintConfig.cpp:877 +#: src/libslic3r/PrintConfig.cpp:966 msgid "Keep fan always on" msgstr "항상 팬 켜기" -#: src/libslic3r/PrintConfig.cpp:878 +#: src/libslic3r/PrintConfig.cpp:967 msgid "" "If this is enabled, fan will never be disabled and will be kept running at " "least at its minimum speed. Useful for PLA, harmful for ABS." @@ -11269,11 +13102,11 @@ msgstr "" "이 기능을 사용하면 팬이 비활성화되지 않으며 최소한 최소 속도로 계속 회전합니" "다. PLA에 유용하며 ABS에 해롭다." -#: src/libslic3r/PrintConfig.cpp:883 +#: src/libslic3r/PrintConfig.cpp:972 msgid "Enable fan if layer print time is below" msgstr "레이어 인쇄 시간이 미만인 경우 팬 활성화" -#: src/libslic3r/PrintConfig.cpp:884 +#: src/libslic3r/PrintConfig.cpp:973 msgid "" "If layer print time is estimated below this number of seconds, fan will be " "enabled and its speed will be calculated by interpolating the minimum and " @@ -11282,27 +13115,27 @@ msgstr "" "레이어 인쇄 시간이, 초 미만으로 예상되는 경우 팬이 활성화되고 속도는 최소 및 " "최대 속도를 보간하여 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:886 src/libslic3r/PrintConfig.cpp:2344 +#: src/libslic3r/PrintConfig.cpp:975 src/libslic3r/PrintConfig.cpp:2375 msgid "approximate seconds" msgstr "근사치 초" -#: src/libslic3r/PrintConfig.cpp:893 src/libslic3r/PrintConfig.cpp:3393 +#: src/libslic3r/PrintConfig.cpp:982 src/libslic3r/PrintConfig.cpp:3665 msgid "Color" msgstr "색상" -#: src/libslic3r/PrintConfig.cpp:899 +#: src/libslic3r/PrintConfig.cpp:988 msgid "Filament notes" msgstr "필라멘트 메모" -#: src/libslic3r/PrintConfig.cpp:900 +#: src/libslic3r/PrintConfig.cpp:989 msgid "You can put your notes regarding the filament here." msgstr "여기에 필라멘트에 관한 메모를 넣을 수 있다." -#: src/libslic3r/PrintConfig.cpp:908 src/libslic3r/PrintConfig.cpp:1821 +#: src/libslic3r/PrintConfig.cpp:997 src/libslic3r/PrintConfig.cpp:1858 msgid "Max volumetric speed" msgstr "최대 체적 속도" -#: src/libslic3r/PrintConfig.cpp:909 +#: src/libslic3r/PrintConfig.cpp:998 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " @@ -11311,27 +13144,27 @@ msgstr "" "이 필라멘트에 허용되는 최대 체적 속도. 인쇄물의 최대 체적 속도를 인쇄 및 필라" "멘트 체적 속도 최소로 제한한다. 제한 없음에 대해 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:1007 msgid "Loading speed" msgstr "로딩 속도" -#: src/libslic3r/PrintConfig.cpp:919 +#: src/libslic3r/PrintConfig.cpp:1008 msgid "Speed used for loading the filament on the wipe tower." msgstr "와이퍼 타워(wipe)에 필라멘트를 장착하는 데 사용되는 속도. " -#: src/libslic3r/PrintConfig.cpp:926 +#: src/libslic3r/PrintConfig.cpp:1015 msgid "Loading speed at the start" msgstr "시작시 로딩 속도" -#: src/libslic3r/PrintConfig.cpp:927 +#: src/libslic3r/PrintConfig.cpp:1016 msgid "Speed used at the very beginning of loading phase." msgstr "로딩 단계의 시작 부분에 사용되는 속도입니다." -#: src/libslic3r/PrintConfig.cpp:934 +#: src/libslic3r/PrintConfig.cpp:1023 msgid "Unloading speed" msgstr "언로딩 스피드" -#: src/libslic3r/PrintConfig.cpp:935 +#: src/libslic3r/PrintConfig.cpp:1024 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." @@ -11339,20 +13172,20 @@ msgstr "" "와이퍼 타워에서 필라멘트를 언로드하는 데 사용되는 속도(램핑 후 바로 언로딩의 " "초기 부분에는 영향을 주지 않음)." -#: src/libslic3r/PrintConfig.cpp:943 +#: src/libslic3r/PrintConfig.cpp:1032 msgid "Unloading speed at the start" msgstr "시작 시 하역 속도" -#: src/libslic3r/PrintConfig.cpp:944 +#: src/libslic3r/PrintConfig.cpp:1033 msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "충돌 직후 필라멘트의 끝을 언로드하는 데 사용되는 속도입니다." -#: src/libslic3r/PrintConfig.cpp:951 +#: src/libslic3r/PrintConfig.cpp:1040 msgid "Delay after unloading" msgstr "언로드 후 딜레이" -#: src/libslic3r/PrintConfig.cpp:952 +#: src/libslic3r/PrintConfig.cpp:1041 msgid "" "Time to wait after the filament is unloaded. May help to get reliable " "toolchanges with flexible materials that may need more time to shrink to " @@ -11361,11 +13194,11 @@ msgstr "" "필라멘트를 내린 후 기다리는 시간. 원래 치수로 축소하는 데, 더 많은 시간이 필" "요할 수 있는 유연한 재료로 신뢰할 수있는 공구 교환을 얻을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:961 +#: src/libslic3r/PrintConfig.cpp:1050 msgid "Number of cooling moves" msgstr "쿨링 이동 숫자" -#: src/libslic3r/PrintConfig.cpp:962 +#: src/libslic3r/PrintConfig.cpp:1051 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " "Specify desired number of these moves." @@ -11373,19 +13206,19 @@ msgstr "" "필라멘트는 냉각 튜브에서 앞뒤로 이동하여 냉각됩니다. 이러한 이동의 원하는 수" "를 지정합니다." -#: src/libslic3r/PrintConfig.cpp:970 +#: src/libslic3r/PrintConfig.cpp:1059 msgid "Speed of the first cooling move" msgstr "첫 번째 냉각 이동 속도" -#: src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:1060 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "냉각 속도가 서서히 빨라지고 있습니다." -#: src/libslic3r/PrintConfig.cpp:978 +#: src/libslic3r/PrintConfig.cpp:1067 msgid "Minimal purge on wipe tower" msgstr "와이프(wipe) 탑의 최소 퍼지" -#: src/libslic3r/PrintConfig.cpp:979 +#: src/libslic3r/PrintConfig.cpp:1068 msgid "" "After a tool change, the exact position of the newly loaded filament inside " "the nozzle may not be known, and the filament pressure is likely not yet " @@ -11399,23 +13232,23 @@ msgstr "" "프 탑에 넣어 연속적인 채우기 또는 희생(sacrificial) 객체 돌출을 안정적으로 생" "성 합니다." -#: src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:1072 msgid "mm³" msgstr "mm" -#: src/libslic3r/PrintConfig.cpp:989 +#: src/libslic3r/PrintConfig.cpp:1078 msgid "Speed of the last cooling move" msgstr "마지막 냉각 이동 속도" -#: src/libslic3r/PrintConfig.cpp:990 +#: src/libslic3r/PrintConfig.cpp:1079 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "냉각 이동은 이 속도로 점차 가속화되고 있습니다." -#: src/libslic3r/PrintConfig.cpp:997 +#: src/libslic3r/PrintConfig.cpp:1086 msgid "Filament load time" msgstr "필라멘트 로드 시간" -#: src/libslic3r/PrintConfig.cpp:998 +#: src/libslic3r/PrintConfig.cpp:1087 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " "filament during a tool change (when executing the T code). This time is " @@ -11425,22 +13258,22 @@ msgstr "" "라멘트를 로드하는 시간입니다. 이 시간은 G 코드 시간 추정기에 의해 총 인쇄 시" "간에 추가 됩니다." -#: src/libslic3r/PrintConfig.cpp:1005 +#: src/libslic3r/PrintConfig.cpp:1094 msgid "Ramming parameters" msgstr "래밍 파라미터" -#: src/libslic3r/PrintConfig.cpp:1006 +#: src/libslic3r/PrintConfig.cpp:1095 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." msgstr "" "이 문자열은 RammingDialog에 의해 편집되고 래밍 특정 매개 변수를 포함합니다." -#: src/libslic3r/PrintConfig.cpp:1012 +#: src/libslic3r/PrintConfig.cpp:1101 msgid "Filament unload time" msgstr "필라멘트 언로드 시간" -#: src/libslic3r/PrintConfig.cpp:1013 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " "filament during a tool change (when executing the T code). This time is " @@ -11450,7 +13283,7 @@ msgstr "" "입니다 (T 코드를 실행할 때). 이 시간은 G 코드 시간추정기에 의해 총 인쇄 시간" "에 추가 됩니다." -#: src/libslic3r/PrintConfig.cpp:1021 +#: src/libslic3r/PrintConfig.cpp:1110 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " @@ -11459,12 +13292,12 @@ msgstr "" "여기에 필라멘트 직경을 입력하십시오. 정밀도가 필요하므로 캘리퍼를 사용하여 필" "라멘트를 따라 여러 번 측정 한 다음 평균을 계산하십시오." -#: src/libslic3r/PrintConfig.cpp:1028 src/libslic3r/PrintConfig.cpp:3432 -#: src/libslic3r/PrintConfig.cpp:3433 +#: src/libslic3r/PrintConfig.cpp:1117 src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3710 msgid "Density" msgstr "밀도" -#: src/libslic3r/PrintConfig.cpp:1029 +#: src/libslic3r/PrintConfig.cpp:1118 msgid "" "Enter your filament density here. This is only for statistical information. " "A decent way is to weigh a known length of filament and compute the ratio of " @@ -11475,41 +13308,41 @@ msgstr "" "은 알려진 길이의 필라멘트의 무게를 측정하고 길이와 볼륨의 비율을 계산하는 것" "입니다. 변위를 통해 직접적으로 부피를 계산하는 것이 더 좋습니다." -#: src/libslic3r/PrintConfig.cpp:1032 +#: src/libslic3r/PrintConfig.cpp:1121 msgid "g/cm³" msgstr "g/cm³" -#: src/libslic3r/PrintConfig.cpp:1037 +#: src/libslic3r/PrintConfig.cpp:1126 msgid "Filament type" msgstr "필라멘트 타입" -#: src/libslic3r/PrintConfig.cpp:1038 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "The filament material type for use in custom G-codes." msgstr "사용자 지정 G 코드에 사용할 필라멘트 재료 유형입니다." -#: src/libslic3r/PrintConfig.cpp:1066 +#: src/libslic3r/PrintConfig.cpp:1155 msgid "Soluble material" msgstr "수용성 재료" -#: src/libslic3r/PrintConfig.cpp:1067 +#: src/libslic3r/PrintConfig.cpp:1156 msgid "Soluble material is most likely used for a soluble support." msgstr "수용성 재료눈 물에 녹는 서포트에 가장 많이 사용된다." -#: src/libslic3r/PrintConfig.cpp:1073 +#: src/libslic3r/PrintConfig.cpp:1162 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." msgstr "필라멘트(kg당) 비용을 여기에 입력하십시오. 통계를 내기 위해서 입니다." -#: src/libslic3r/PrintConfig.cpp:1074 +#: src/libslic3r/PrintConfig.cpp:1163 msgid "money/kg" msgstr "원(\\)/kg" -#: src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1168 msgid "Spool weight" msgstr "스풀 중량" -#: src/libslic3r/PrintConfig.cpp:1080 +#: src/libslic3r/PrintConfig.cpp:1169 msgid "" "Enter weight of the empty filament spool. One may weigh a partially consumed " "filament spool before printing and one may compare the measured weight with " @@ -11521,19 +13354,19 @@ msgstr "" "에 충분한지 여부를 확인하기 위해 스풀과 필라멘트의 계산 된 무게와 측정 된 무" "게를 비교할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:1084 +#: src/libslic3r/PrintConfig.cpp:1173 msgid "g" msgstr "g" -#: src/libslic3r/PrintConfig.cpp:1093 src/libslic3r/PrintConfig.cpp:3537 +#: src/libslic3r/PrintConfig.cpp:1182 src/libslic3r/PrintConfig.cpp:3814 msgid "(Unknown)" msgstr "(알 수 없음)" -#: src/libslic3r/PrintConfig.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:1186 msgid "Fill angle" msgstr "채움 각도" -#: src/libslic3r/PrintConfig.cpp:1099 +#: src/libslic3r/PrintConfig.cpp:1188 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " @@ -11542,63 +13375,63 @@ msgstr "" "방향의 기본 각도입니다. 해칭이 적용될 것입니다. Slic3r이 감지 할 수있는 최상" "의 방향을 사용하여 브릿징이 채워지므로이 설정은 영향을 미치지 않습니다." -#: src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1199 msgid "Fill density" msgstr "채우기(fill) 밀도" -#: src/libslic3r/PrintConfig.cpp:1113 +#: src/libslic3r/PrintConfig.cpp:1201 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "0 % - 100 % 범위로 표현 된 내부 채움(infill)의 밀도." -#: src/libslic3r/PrintConfig.cpp:1148 +#: src/libslic3r/PrintConfig.cpp:1224 msgid "Fill pattern" msgstr "채우기(fill) 패턴" -#: src/libslic3r/PrintConfig.cpp:1150 +#: src/libslic3r/PrintConfig.cpp:1226 msgid "Fill pattern for general low-density infill." msgstr "일반 낮은 밀도 채움의 패턴." -#: src/libslic3r/PrintConfig.cpp:1171 src/libslic3r/PrintConfig.cpp:2803 +#: src/libslic3r/PrintConfig.cpp:1230 src/libslic3r/PrintConfig.cpp:2822 msgid "Grid" msgstr "그리드" -#: src/libslic3r/PrintConfig.cpp:1173 +#: src/libslic3r/PrintConfig.cpp:1232 msgid "Stars" msgstr "별점" -#: src/libslic3r/PrintConfig.cpp:1174 +#: src/libslic3r/PrintConfig.cpp:1233 msgid "Cubic" msgstr "큐빅" -#: src/libslic3r/PrintConfig.cpp:1175 +#: src/libslic3r/PrintConfig.cpp:1234 msgid "Line" msgstr "라인" -#: src/libslic3r/PrintConfig.cpp:1177 src/libslic3r/PrintConfig.cpp:2756 +#: src/libslic3r/PrintConfig.cpp:1236 src/libslic3r/PrintConfig.cpp:2778 msgid "Honeycomb" msgstr "벌집" -#: src/libslic3r/PrintConfig.cpp:1178 +#: src/libslic3r/PrintConfig.cpp:1237 msgid "3D Honeycomb" msgstr "3D 벌집" -#: src/libslic3r/PrintConfig.cpp:1179 +#: src/libslic3r/PrintConfig.cpp:1238 msgid "Gyroid" msgstr "자이로이드(Gyroid)" -#: src/libslic3r/PrintConfig.cpp:1183 +#: src/libslic3r/PrintConfig.cpp:1242 msgid "Adaptive Cubic" msgstr "적응형 입방" -#: src/libslic3r/PrintConfig.cpp:1184 +#: src/libslic3r/PrintConfig.cpp:1243 msgid "Support Cubic" msgstr "지원 입방" -#: src/libslic3r/PrintConfig.cpp:1185 +#: src/libslic3r/PrintConfig.cpp:1244 msgid "Lightning" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1190 +#: src/libslic3r/PrintConfig.cpp:1250 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." @@ -11606,22 +13439,22 @@ msgstr "" "이것은 프린터가 첫 번째 레이어에 사용할 가속도입니다. 0을 설정하면 첫 번째 레" "이어에 대한 가속 제어가 사용되지 않습니다." -#: src/libslic3r/PrintConfig.cpp:1198 +#: src/libslic3r/PrintConfig.cpp:1258 msgid "First object layer over raft interface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1199 +#: src/libslic3r/PrintConfig.cpp:1259 msgid "" "This is the acceleration your printer will use for first layer of object " "above raft interface. Set zero to disable acceleration control for first " "layer of object above raft interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "First layer bed temperature" msgstr "첫 번째 층 침대 온도" -#: src/libslic3r/PrintConfig.cpp:1209 +#: src/libslic3r/PrintConfig.cpp:1269 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." @@ -11629,7 +13462,7 @@ msgstr "" "첫 번째 레이어에 대한 빌드 플레이트 온도를 가열. 이 값을 0으로 설정하면 출력" "에서 ​​베드 온도 제어 명령을 비활성화합니다." -#: src/libslic3r/PrintConfig.cpp:1219 +#: src/libslic3r/PrintConfig.cpp:1279 msgid "" "Set this to a non-zero value to set a manual extrusion width for first " "layer. You can use this to force fatter extrudates for better adhesion. If " @@ -11641,18 +13474,18 @@ msgstr "" "수 있습니다. 백분율 (예 : 120 %)로 표현하면 첫 번째 레이어 높이를 기준으로 계" "산됩니다. 0으로 설정하면 기본 돌출 폭이 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1293 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " "plates." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1301 msgid "First layer speed" msgstr "첫 레이어 속도" -#: src/libslic3r/PrintConfig.cpp:1242 +#: src/libslic3r/PrintConfig.cpp:1302 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " @@ -11662,11 +13495,11 @@ msgstr "" "인쇄 이동에 적용된다. 백분율(예: 40%)로 표현되는 경우 기본 속도를 스케일링한" "다." -#: src/libslic3r/PrintConfig.cpp:1252 +#: src/libslic3r/PrintConfig.cpp:1312 msgid "Speed of object first layer over raft interface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1253 +#: src/libslic3r/PrintConfig.cpp:1313 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first object layer above raft interface, regardless " @@ -11674,11 +13507,11 @@ msgid "" "the default speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1263 +#: src/libslic3r/PrintConfig.cpp:1323 msgid "First layer nozzle temperature" msgstr "첫 번째 층 노즐 온도" -#: src/libslic3r/PrintConfig.cpp:1264 +#: src/libslic3r/PrintConfig.cpp:1324 msgid "" "Nozzle temperature for the first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " @@ -11687,11 +13520,11 @@ msgstr "" "첫 번째 레이어의 노즐 온도입니다. 인쇄 중에 수동으로 온도를 제어하려면 이를 0" "으로 설정하여 출력 G 코드에서 온도 제어 명령을 사용하지 않도록 설정합니다." -#: src/libslic3r/PrintConfig.cpp:1272 +#: src/libslic3r/PrintConfig.cpp:1332 msgid "Full fan speed at layer" msgstr "레이어의 전체 팬 속도" -#: src/libslic3r/PrintConfig.cpp:1273 +#: src/libslic3r/PrintConfig.cpp:1333 msgid "" "Fan speed will be ramped up linearly from zero at layer " "\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". " @@ -11705,50 +13538,54 @@ msgstr "" "이 경우 팬은 레이어 \"disable_fan_first_layers\" + 1에서 허용되는 최대 속도" "로 실행됩니다." -#: src/libslic3r/PrintConfig.cpp:1285 +#: src/libslic3r/PrintConfig.cpp:1345 msgid "Fuzzy skin type." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1348 msgid "Outside walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1293 +#: src/libslic3r/PrintConfig.cpp:1349 msgid "All walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1298 +#: src/libslic3r/PrintConfig.cpp:1355 msgid "Fuzzy skin thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1300 +#: src/libslic3r/PrintConfig.cpp:1357 msgid "" "The maximum distance that each skin point can be offset (both ways), " "measured perpendicular to the perimeter wall." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1308 +#: src/libslic3r/PrintConfig.cpp:1365 msgid "Fuzzy skin point distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1310 +#: src/libslic3r/PrintConfig.cpp:1367 msgid "" "Perimeters will be split into multiple segments by inserting Fuzzy skin " "points. Lowering the Fuzzy skin point distance will increase the number of " "randomly offset points on the perimeter wall." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1318 +#: src/libslic3r/PrintConfig.cpp:1375 msgid "Fill gaps" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1320 +#: src/libslic3r/PrintConfig.cpp:1377 msgid "" "Enables filling of gaps between perimeters and between the inner most " "perimeters and infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1327 +#: src/libslic3r/PrintConfig.cpp:1382 +msgid "Gap fill" +msgstr "공백 채움" + +#: src/libslic3r/PrintConfig.cpp:1384 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " @@ -11758,11 +13595,11 @@ msgstr "" "기 위해 이것을 합리적으로 낮게 유지한다. 간격 채우기를 사용하지 않으려면 0을 " "설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1335 +#: src/libslic3r/PrintConfig.cpp:1392 msgid "Verbose G-code" msgstr "세부 G-코드" -#: src/libslic3r/PrintConfig.cpp:1336 +#: src/libslic3r/PrintConfig.cpp:1393 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " @@ -11772,11 +13609,11 @@ msgstr "" "을 선택하십시오. 만일 당신이 SD카드로 인쇄한다면, 파일의 추가 무게로 인해 펌" "웨어의 속도가 느려질 수 있다." -#: src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1400 msgid "G-code flavor" msgstr "G-code 형식" -#: src/libslic3r/PrintConfig.cpp:1344 +#: src/libslic3r/PrintConfig.cpp:1401 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " @@ -11787,15 +13624,15 @@ msgstr "" "옵션을 프린터의 펌웨어로 설정하여 호환되는 출력을 얻을 수 있습니다. \"압출 없" "음\" 맛은 PrusaSlicer가 압출 값을 전혀 내보내지 못하게 합니다." -#: src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1416 msgid "No extrusion" msgstr "압출 없음" -#: src/libslic3r/PrintConfig.cpp:1376 +#: src/libslic3r/PrintConfig.cpp:1422 msgid "Label objects" msgstr "레이블 개체" -#: src/libslic3r/PrintConfig.cpp:1377 +#: src/libslic3r/PrintConfig.cpp:1423 msgid "" "Enable this to add comments into the G-Code labeling print moves with what " "object they belong to, which is useful for the Octoprint CancelObject " @@ -11806,19 +13643,19 @@ msgstr "" "록 설정하면 Octoprint CancelObject 플러그인에 유용합니다. 이 설정은 단일 압출" "기 멀티 재질 설정과 호환되지 않으며 개체로 닦아내기 / 채우기로 닦아냅니다." -#: src/libslic3r/PrintConfig.cpp:1384 +#: src/libslic3r/PrintConfig.cpp:1430 msgid "G-code substitutions" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1385 +#: src/libslic3r/PrintConfig.cpp:1431 msgid "Find / replace patterns in G-code lines and substitute them." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1390 +#: src/libslic3r/PrintConfig.cpp:1436 msgid "High extruder current on filament swap" msgstr "필라멘트 스왑에 높은 압출기 전류" -#: src/libslic3r/PrintConfig.cpp:1391 +#: src/libslic3r/PrintConfig.cpp:1437 msgid "" "It may be beneficial to increase the extruder motor current during the " "filament exchange sequence to allow for rapid ramming feed rates and to " @@ -11828,7 +13665,7 @@ msgstr "" "는 빠른 래밍 공급 속도를 가능 하게하고, 불규칙한 모양의 필라멘트를 로딩할때 " "저항을 극복하기 위한것이다." -#: src/libslic3r/PrintConfig.cpp:1399 +#: src/libslic3r/PrintConfig.cpp:1445 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." @@ -11836,23 +13673,33 @@ msgstr "" "이것은 당신 프린터의 채움 가속력입니다. 주입에 대한 가속 제어를 비활성화하려" "면 0을 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1408 +#: src/libslic3r/PrintConfig.cpp:1453 src/libslic3r/PrintConfig.cpp:2423 +#: src/libslic3r/PrintConfig.cpp:2435 +msgid "Solid infill" +msgstr "솔리드 인필" + +#: src/libslic3r/PrintConfig.cpp:1454 msgid "" "This is the acceleration your printer will use for solid infill. Set zero to " "use the value for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:2977 +#: src/libslic3r/PrintConfig.cpp:2990 +msgid "Top solid infill" +msgstr "가장 윗부분 채움" + +#: src/libslic3r/PrintConfig.cpp:1463 msgid "" "This is the acceleration your printer will use for top solid infill. Set " "zero to use the value for solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1426 +#: src/libslic3r/PrintConfig.cpp:1472 msgid "Combine infill every" msgstr "다음 레이어마다 결합" -#: src/libslic3r/PrintConfig.cpp:1428 +#: src/libslic3r/PrintConfig.cpp:1474 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." @@ -11860,15 +13707,15 @@ msgstr "" "이 기능은 인필을 결합하고 얇은 주변기기를 보존하면서 두꺼운 인필 층을 압출하" "여 인쇄 속도를 높일 수 있도록 하여 정확도를 높인다." -#: src/libslic3r/PrintConfig.cpp:1431 +#: src/libslic3r/PrintConfig.cpp:1477 msgid "Combine infill every n layers" msgstr "모든 n개 층을 채우기 위해 결합" -#: src/libslic3r/PrintConfig.cpp:1437 +#: src/libslic3r/PrintConfig.cpp:1483 msgid "Length of the infill anchor" msgstr "채우기 앵커의 길이" -#: src/libslic3r/PrintConfig.cpp:1439 +#: src/libslic3r/PrintConfig.cpp:1485 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -11888,35 +13735,35 @@ msgstr "" "제한되지만 더 이상 anchor_length_max. 이 매개 변수를 0으로 설정하여 단일 채우" "기 라인에 연결된 앵커링 경계를 비활성화합니다." -#: src/libslic3r/PrintConfig.cpp:1455 +#: src/libslic3r/PrintConfig.cpp:1495 msgid "0 (no open anchors)" msgstr "0(열린 앵커 없음)" -#: src/libslic3r/PrintConfig.cpp:1456 src/libslic3r/PrintConfig.cpp:1479 +#: src/libslic3r/PrintConfig.cpp:1496 src/libslic3r/PrintConfig.cpp:1519 msgid "1 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1457 src/libslic3r/PrintConfig.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:1520 msgid "2 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1458 src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1498 src/libslic3r/PrintConfig.cpp:1521 msgid "5 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1459 src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1499 src/libslic3r/PrintConfig.cpp:1522 msgid "10 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1460 src/libslic3r/PrintConfig.cpp:1483 +#: src/libslic3r/PrintConfig.cpp:1500 src/libslic3r/PrintConfig.cpp:1523 msgid "1000 (unlimited)" msgstr "1000(무제한)" -#: src/libslic3r/PrintConfig.cpp:1465 +#: src/libslic3r/PrintConfig.cpp:1506 msgid "Maximum length of the infill anchor" msgstr "채우기 앵커의 최대 길이" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1508 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -11935,19 +13782,19 @@ msgstr "" "개 변수보다 더 이상 이 매개 변수보다 더 이상 없습니다. 앵커링을 비활성화하려" "면 이 매개 변수를 0으로 설정합니다." -#: src/libslic3r/PrintConfig.cpp:1478 +#: src/libslic3r/PrintConfig.cpp:1518 msgid "0 (not anchored)" msgstr "0(고정되지 않음)" -#: src/libslic3r/PrintConfig.cpp:1488 +#: src/libslic3r/PrintConfig.cpp:1529 msgid "Infill extruder" msgstr "채움(Infill) 익스트루더" -#: src/libslic3r/PrintConfig.cpp:1490 +#: src/libslic3r/PrintConfig.cpp:1531 msgid "The extruder to use when printing infill." msgstr "채움으로 사용할 익스트루더." -#: src/libslic3r/PrintConfig.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:1539 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill. If " "left zero, default extrusion width will be used if set, otherwise 1.125 x " @@ -11961,21 +13808,21 @@ msgstr "" "을 사용하는 것이 좋습니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으" "로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1550 msgid "Infill before perimeters" msgstr "둘레보다 앞쪽에 채움" -#: src/libslic3r/PrintConfig.cpp:1510 +#: src/libslic3r/PrintConfig.cpp:1551 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." msgstr "이 옵션은 외부출력과 채움 인쇄 순서를 바꾸어, 후자를 먼저 만든다." -#: src/libslic3r/PrintConfig.cpp:1515 +#: src/libslic3r/PrintConfig.cpp:1556 msgid "Only infill where needed" msgstr "필요한 경우 채움" -#: src/libslic3r/PrintConfig.cpp:1517 +#: src/libslic3r/PrintConfig.cpp:1558 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " @@ -11985,11 +13832,11 @@ msgstr "" "을 할 것이다). 활성화된 경우 관련된 여러 번의 점검으로 인해 G-code 생성 속도" "를 늦춰라." -#: src/libslic3r/PrintConfig.cpp:1524 +#: src/libslic3r/PrintConfig.cpp:1565 msgid "Infill/perimeters overlap" msgstr "채움/둘레 겹침(perimeters overlap)" -#: src/libslic3r/PrintConfig.cpp:1526 +#: src/libslic3r/PrintConfig.cpp:1567 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -12000,23 +13847,23 @@ msgstr "" "론적으로 이것은 필요하지 않아야하지만 백래시가 갭을 유발할 수 있습니다. 백분" "율 (예 : 15 %)로 표시되는 경우 경계 압출 폭을 기준으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "내부 채우기 인쇄 속도. 자동으로 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1545 +#: src/libslic3r/PrintConfig.cpp:1586 msgid "Inherits profile" msgstr "프로필 이어가기" -#: src/libslic3r/PrintConfig.cpp:1546 +#: src/libslic3r/PrintConfig.cpp:1587 msgid "Name of the profile, from which this profile inherits." msgstr "이 프로파일이 복사되는 새 프로파일의 이름." -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1600 msgid "Interface shells" msgstr "인터페이스 셸(shells)" -#: src/libslic3r/PrintConfig.cpp:1560 +#: src/libslic3r/PrintConfig.cpp:1601 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " @@ -12025,62 +13872,62 @@ msgstr "" "인접 재료/볼륨 사이에 고체 쉘 생성을 강제하십시오. 반투명 재료 또는 수동 수용" "성 서포트 재료를 사용한 다중 압출기 인쇄에 유용함." -#: src/libslic3r/PrintConfig.cpp:1568 +#: src/libslic3r/PrintConfig.cpp:1609 msgid "Maximum width of a segmented region" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1569 +#: src/libslic3r/PrintConfig.cpp:1610 msgid "Maximum width of a segmented region. Zero disables this feature." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1570 src/libslic3r/PrintConfig.cpp:2189 -#: src/libslic3r/PrintConfig.cpp:2198 +#: src/libslic3r/PrintConfig.cpp:1611 src/libslic3r/PrintConfig.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2228 msgid "mm (zero to disable)" msgstr "mm (0은 비활성화)" -#: src/libslic3r/PrintConfig.cpp:1577 +#: src/libslic3r/PrintConfig.cpp:1618 msgid "Enable ironing" msgstr "다림질 활성화" -#: src/libslic3r/PrintConfig.cpp:1578 +#: src/libslic3r/PrintConfig.cpp:1619 msgid "" "Enable ironing of the top layers with the hot print head for smooth surface" msgstr "" "매끄러운 표면을 위해 핫 프린트 헤드로 상단 레이어의 다림질 을 가능하게합니다." -#: src/libslic3r/PrintConfig.cpp:1584 src/libslic3r/PrintConfig.cpp:1586 +#: src/libslic3r/PrintConfig.cpp:1625 src/libslic3r/PrintConfig.cpp:1627 msgid "Ironing Type" msgstr "다림질 타입" -#: src/libslic3r/PrintConfig.cpp:1591 +#: src/libslic3r/PrintConfig.cpp:1629 msgid "All top surfaces" msgstr "모든 상단 서피스" -#: src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Topmost surface only" msgstr "최상면만" -#: src/libslic3r/PrintConfig.cpp:1593 +#: src/libslic3r/PrintConfig.cpp:1631 msgid "All solid surfaces" msgstr "모든 솔리드 서피스" -#: src/libslic3r/PrintConfig.cpp:1598 +#: src/libslic3r/PrintConfig.cpp:1637 msgid "Flow rate" msgstr "유량" -#: src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Percent of a flow rate relative to object's normal layer height." msgstr "오브젝트의 일반 레이어 높이를 기준으로 유량의 백분율입니다." -#: src/libslic3r/PrintConfig.cpp:1608 +#: src/libslic3r/PrintConfig.cpp:1647 msgid "Spacing between ironing passes" msgstr "다림질 가공 패스 사이의 간격" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1649 msgid "Distance between ironing lines" msgstr "다림질선 사이의 거리" -#: src/libslic3r/PrintConfig.cpp:1627 +#: src/libslic3r/PrintConfig.cpp:1666 msgid "" "This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can " @@ -12092,11 +13939,11 @@ msgstr "" "[layer_num] 및 [layer_z]에 자리 표시자 변수를 사용할 수 있다는 점에 유의하십" "시오." -#: src/libslic3r/PrintConfig.cpp:1638 +#: src/libslic3r/PrintConfig.cpp:1677 msgid "Supports remaining times" msgstr "남은 시간 지원" -#: src/libslic3r/PrintConfig.cpp:1639 +#: src/libslic3r/PrintConfig.cpp:1678 msgid "" "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " "intervals into the G-code to let the firmware show accurate remaining time. " @@ -12108,155 +13955,155 @@ msgstr "" "웨어는 M73를 인식 하 고 있습니다. 또한 i3 MK3 펌웨어는 자동 모드에서 M73 Qxx " "Sxx를 지원 합니다." -#: src/libslic3r/PrintConfig.cpp:1647 +#: src/libslic3r/PrintConfig.cpp:1686 msgid "Supports stealth mode" msgstr "스텔스 모드 지원" -#: src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1687 msgid "The firmware supports stealth mode" msgstr "펌웨어는 스텔스 모드를 지원합니다." -#: src/libslic3r/PrintConfig.cpp:1653 +#: src/libslic3r/PrintConfig.cpp:1692 msgid "How to apply limits" msgstr "한도 적용 방법" -#: src/libslic3r/PrintConfig.cpp:1654 +#: src/libslic3r/PrintConfig.cpp:1693 msgid "Purpose of Machine Limits" msgstr "기계 제한의 목적" -#: src/libslic3r/PrintConfig.cpp:1656 +#: src/libslic3r/PrintConfig.cpp:1695 msgid "How to apply the Machine Limits" msgstr "기계 제한을 적용하는 방법" -#: src/libslic3r/PrintConfig.cpp:1661 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "Emit to G-code" msgstr "G 코드로 방출" -#: src/libslic3r/PrintConfig.cpp:1662 +#: src/libslic3r/PrintConfig.cpp:1698 msgid "Use for time estimate" msgstr "시간 추정에 사용" -#: src/libslic3r/PrintConfig.cpp:1663 +#: src/libslic3r/PrintConfig.cpp:1699 msgid "Ignore" msgstr "무시" -#: src/libslic3r/PrintConfig.cpp:1686 +#: src/libslic3r/PrintConfig.cpp:1723 msgid "Maximum feedrate X" msgstr "최대 공급율 X" -#: src/libslic3r/PrintConfig.cpp:1687 +#: src/libslic3r/PrintConfig.cpp:1724 msgid "Maximum feedrate Y" msgstr "최대 피드값 Y" -#: src/libslic3r/PrintConfig.cpp:1688 +#: src/libslic3r/PrintConfig.cpp:1725 msgid "Maximum feedrate Z" msgstr "최대 피드값 Z" -#: src/libslic3r/PrintConfig.cpp:1689 +#: src/libslic3r/PrintConfig.cpp:1726 msgid "Maximum feedrate E" msgstr "최대 피드값 E" -#: src/libslic3r/PrintConfig.cpp:1692 +#: src/libslic3r/PrintConfig.cpp:1729 msgid "Maximum feedrate of the X axis" msgstr "X 축의 최대 공급속도" -#: src/libslic3r/PrintConfig.cpp:1693 +#: src/libslic3r/PrintConfig.cpp:1730 msgid "Maximum feedrate of the Y axis" msgstr "Y축의 최대 공급속도" -#: src/libslic3r/PrintConfig.cpp:1694 +#: src/libslic3r/PrintConfig.cpp:1731 msgid "Maximum feedrate of the Z axis" msgstr "Z 축의 최대 공급량" -#: src/libslic3r/PrintConfig.cpp:1695 +#: src/libslic3r/PrintConfig.cpp:1732 msgid "Maximum feedrate of the E axis" msgstr "E 축의 최대 공급속도" -#: src/libslic3r/PrintConfig.cpp:1703 +#: src/libslic3r/PrintConfig.cpp:1740 msgid "Maximum acceleration X" msgstr "최대 가속 X" -#: src/libslic3r/PrintConfig.cpp:1704 +#: src/libslic3r/PrintConfig.cpp:1741 msgid "Maximum acceleration Y" msgstr "최대 가속 Y" -#: src/libslic3r/PrintConfig.cpp:1705 +#: src/libslic3r/PrintConfig.cpp:1742 msgid "Maximum acceleration Z" msgstr "최대 가속 Z" -#: src/libslic3r/PrintConfig.cpp:1706 +#: src/libslic3r/PrintConfig.cpp:1743 msgid "Maximum acceleration E" msgstr "최대 가속 E" -#: src/libslic3r/PrintConfig.cpp:1709 +#: src/libslic3r/PrintConfig.cpp:1746 msgid "Maximum acceleration of the X axis" msgstr "X 축의 최대 가속" -#: src/libslic3r/PrintConfig.cpp:1710 +#: src/libslic3r/PrintConfig.cpp:1747 msgid "Maximum acceleration of the Y axis" msgstr "Y축의 최대 가속" -#: src/libslic3r/PrintConfig.cpp:1711 +#: src/libslic3r/PrintConfig.cpp:1748 msgid "Maximum acceleration of the Z axis" msgstr "Z 축의 최대 가속" -#: src/libslic3r/PrintConfig.cpp:1712 +#: src/libslic3r/PrintConfig.cpp:1749 msgid "Maximum acceleration of the E axis" msgstr "E 축의 최대 가속" -#: src/libslic3r/PrintConfig.cpp:1720 +#: src/libslic3r/PrintConfig.cpp:1757 msgid "Maximum jerk X" msgstr "최대 저크(jerk) X" -#: src/libslic3r/PrintConfig.cpp:1721 +#: src/libslic3r/PrintConfig.cpp:1758 msgid "Maximum jerk Y" msgstr "최대 저크(jerk) Y" -#: src/libslic3r/PrintConfig.cpp:1722 +#: src/libslic3r/PrintConfig.cpp:1759 msgid "Maximum jerk Z" msgstr "최대 저크(jerk) Z" -#: src/libslic3r/PrintConfig.cpp:1723 +#: src/libslic3r/PrintConfig.cpp:1760 msgid "Maximum jerk E" msgstr "최대 저크(jerk) E" -#: src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:1763 msgid "Maximum jerk of the X axis" msgstr "X축 최대 저크(jerk)" -#: src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1764 msgid "Maximum jerk of the Y axis" msgstr "Y축 최대 저크는(jerk)" -#: src/libslic3r/PrintConfig.cpp:1728 +#: src/libslic3r/PrintConfig.cpp:1765 msgid "Maximum jerk of the Z axis" msgstr "Z축 최대 저크(jerk)" -#: src/libslic3r/PrintConfig.cpp:1729 +#: src/libslic3r/PrintConfig.cpp:1766 msgid "Maximum jerk of the E axis" msgstr "E축 최대 저크(jerk)" -#: src/libslic3r/PrintConfig.cpp:1739 +#: src/libslic3r/PrintConfig.cpp:1776 msgid "Minimum feedrate when extruding" msgstr "압출시 최소 공급 속도" -#: src/libslic3r/PrintConfig.cpp:1741 +#: src/libslic3r/PrintConfig.cpp:1778 msgid "Minimum feedrate when extruding (M205 S)" msgstr "압출 시 최소 공급(M205 S)" -#: src/libslic3r/PrintConfig.cpp:1749 +#: src/libslic3r/PrintConfig.cpp:1786 msgid "Minimum travel feedrate" msgstr "최소 이송 속도" -#: src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:1788 msgid "Minimum travel feedrate (M205 T)" msgstr "최소 여행 수유율(M205 T)" -#: src/libslic3r/PrintConfig.cpp:1759 +#: src/libslic3r/PrintConfig.cpp:1796 msgid "Maximum acceleration when extruding" msgstr "압출시 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1798 msgid "" "Maximum acceleration when extruding (M204 P)\n" "\n" @@ -12264,31 +14111,31 @@ msgid "" "(M204 T)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1772 +#: src/libslic3r/PrintConfig.cpp:1809 msgid "Maximum acceleration when retracting" msgstr "리트렉션 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1774 +#: src/libslic3r/PrintConfig.cpp:1811 msgid "Maximum acceleration when retracting (M204 R)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1782 +#: src/libslic3r/PrintConfig.cpp:1819 msgid "Maximum acceleration for travel moves" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1784 +#: src/libslic3r/PrintConfig.cpp:1821 msgid "Maximum acceleration for travel moves (M204 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1791 src/libslic3r/PrintConfig.cpp:1800 +#: src/libslic3r/PrintConfig.cpp:1828 src/libslic3r/PrintConfig.cpp:1837 msgid "Max" msgstr "최대" -#: src/libslic3r/PrintConfig.cpp:1792 +#: src/libslic3r/PrintConfig.cpp:1829 msgid "This setting represents the maximum speed of your fan." msgstr "이 설정은 팬의 최대 속도를 나타냅니다." -#: src/libslic3r/PrintConfig.cpp:1801 +#: src/libslic3r/PrintConfig.cpp:1838 msgid "" "This is the highest printable layer height for this extruder, used to cap " "the variable layer height and support layer height. Maximum recommended " @@ -12300,11 +14147,11 @@ msgstr "" "는 압출 폭의 75% of 입니다. 0으로 설정하면 층 높이가 노즐 지름의 75% of로 제" "한됩니다." -#: src/libslic3r/PrintConfig.cpp:1811 +#: src/libslic3r/PrintConfig.cpp:1848 msgid "Max print speed" msgstr "최대 프린트 속도" -#: src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1849 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " @@ -12314,18 +14161,18 @@ msgstr "" "의 속도를 자동 계산한다. 이 실험 설정은 허용할 최대 인쇄 속도를 설정하는 데 " "사용된다." -#: src/libslic3r/PrintConfig.cpp:1822 +#: src/libslic3r/PrintConfig.cpp:1859 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." msgstr "" "이 실험 설정은 압출기가 지원하는 최대 체적 속도를 설정하기 위해 사용된다." -#: src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1867 msgid "Max volumetric slope positive" msgstr "최대 체적 기울기 양" -#: src/libslic3r/PrintConfig.cpp:1831 +#: src/libslic3r/PrintConfig.cpp:1868 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from lower speed to higher speed. A value of 1.8 mm³/" @@ -12334,15 +14181,15 @@ msgid "" "(feedrate 60 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1836 src/libslic3r/PrintConfig.cpp:1848 +#: src/libslic3r/PrintConfig.cpp:1873 src/libslic3r/PrintConfig.cpp:1885 msgid "mm³/s²" msgstr "mm³/s²" -#: src/libslic3r/PrintConfig.cpp:1842 +#: src/libslic3r/PrintConfig.cpp:1879 msgid "Max volumetric slope negative" msgstr "최대 체적 기울기 음수" -#: src/libslic3r/PrintConfig.cpp:1843 +#: src/libslic3r/PrintConfig.cpp:1880 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from higher speed to lower speed. A value of 1.8 mm³/" @@ -12351,15 +14198,15 @@ msgid "" "(feedrate 20 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1854 src/libslic3r/PrintConfig.cpp:1863 +#: src/libslic3r/PrintConfig.cpp:1891 src/libslic3r/PrintConfig.cpp:1900 msgid "Min" msgstr "최소" -#: src/libslic3r/PrintConfig.cpp:1855 +#: src/libslic3r/PrintConfig.cpp:1892 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "이 설정은 최소 PWM팬이 활동하는데 필요한를 나타냅니다." -#: src/libslic3r/PrintConfig.cpp:1864 +#: src/libslic3r/PrintConfig.cpp:1901 msgid "" "This is the lowest printable layer height for this extruder and limits the " "resolution for variable layer height. Typical values are between 0.05 mm and " @@ -12368,19 +14215,19 @@ msgstr "" "이것은 이 압출기에 대한 가장 낮은 인쇄 가능한 층 높이이고 가변 층 높이에 대" "한 분해능을 제한한다. 대표적인 값은 0.05mm와 0.1mm이다." -#: src/libslic3r/PrintConfig.cpp:1872 +#: src/libslic3r/PrintConfig.cpp:1909 msgid "Min print speed" msgstr "최소 인쇄 속도" -#: src/libslic3r/PrintConfig.cpp:1873 +#: src/libslic3r/PrintConfig.cpp:1910 msgid "Slic3r will not scale speed down below this speed." msgstr "Slic3r는 이 속도 이하로 속도를 낮추지 않을 것이다." -#: src/libslic3r/PrintConfig.cpp:1880 +#: src/libslic3r/PrintConfig.cpp:1917 msgid "Minimal filament extrusion length" msgstr "최소 필라멘트 압출 길이" -#: src/libslic3r/PrintConfig.cpp:1881 +#: src/libslic3r/PrintConfig.cpp:1918 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " @@ -12389,11 +14236,11 @@ msgstr "" "하단 레이어에서 지정된 양의 필라멘트를 사용하는 데 필요한 스커트 루프의 수 이" "상으로 생성한다. 멀티 익스트루더의 경우, 이 최소값은 각 추가기기에 적용된다." -#: src/libslic3r/PrintConfig.cpp:1890 +#: src/libslic3r/PrintConfig.cpp:1927 msgid "Configuration notes" msgstr "구성 노트" -#: src/libslic3r/PrintConfig.cpp:1891 +#: src/libslic3r/PrintConfig.cpp:1928 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." @@ -12401,16 +14248,16 @@ msgstr "" "여기에 개인 노트를 넣을 수 있다. 이 텍스트는 G-code 헤더 코멘트에 추가될 것이" "다." -#: src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:1938 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "이 지름은 익스트루더 노즐의 직경이다(예: 0.5, 0.35 등)." -#: src/libslic3r/PrintConfig.cpp:1906 +#: src/libslic3r/PrintConfig.cpp:1943 msgid "Host Type" msgstr "호스트 유형" -#: src/libslic3r/PrintConfig.cpp:1907 +#: src/libslic3r/PrintConfig.cpp:1944 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." @@ -12418,11 +14265,11 @@ msgstr "" "Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드에는 호스" "트의 종류가 포함되어야 합니다." -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:1961 msgid "Only retract when crossing perimeters" msgstr "둘레를 횡단 할 때만 수축" -#: src/libslic3r/PrintConfig.cpp:1930 +#: src/libslic3r/PrintConfig.cpp:1962 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." @@ -12430,21 +14277,17 @@ msgstr "" "이동 경로가 상위 레이어의 경계를 초과하지 않는 경우 리트랙션을 비활성화합니" "다. 따라서 모든 오즈가 보이지 않습니다." -#: src/libslic3r/PrintConfig.cpp:1937 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "" "This option will drop the temperature of the inactive extruders to prevent " -"oozing. It will enable a tall skirt automatically and move extruders outside " -"such skirt when changing temperatures." +"oozing. " msgstr "" -"이 옵션은 누출을 방지하기 위해 비활성 압출기의 온도를 떨어 뜨립니다. 온도를 " -"변경할 때 키가 큰 스커트를 자동으로 사용하고 스커트 외부로 압출기를 이동합니" -"다." -#: src/libslic3r/PrintConfig.cpp:1944 +#: src/libslic3r/PrintConfig.cpp:1974 msgid "Output filename format" msgstr "출력 파일이름 형식" -#: src/libslic3r/PrintConfig.cpp:1945 +#: src/libslic3r/PrintConfig.cpp:1975 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -12456,11 +14299,11 @@ msgstr "" "[분], [초], [버전], [input_filename], [input_filename_base]을 사용할 수도 있" "습니다." -#: src/libslic3r/PrintConfig.cpp:1954 +#: src/libslic3r/PrintConfig.cpp:1984 msgid "Detect bridging perimeters" msgstr "브릿 징 경계선 감지" -#: src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:1986 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." @@ -12468,11 +14311,11 @@ msgstr "" "오버행에 대한 유량을 조정하는 실험 옵션 (브리지 흐름(flow)이 사용됨)에 브릿" "지 속도를 적용하고 팬을 활성화합니다." -#: src/libslic3r/PrintConfig.cpp:1962 +#: src/libslic3r/PrintConfig.cpp:1992 msgid "Filament parking position" msgstr "필라멘트 멈춤 위치" -#: src/libslic3r/PrintConfig.cpp:1963 +#: src/libslic3r/PrintConfig.cpp:1993 msgid "" "Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware." @@ -12480,11 +14323,11 @@ msgstr "" "언로드할 때 필라멘트가 주차되는 위치에서 압출기 팁의 거리입니다. 프린터 펌웨" "어의 값과 일치해야 합니다." -#: src/libslic3r/PrintConfig.cpp:1971 +#: src/libslic3r/PrintConfig.cpp:2001 msgid "Extra loading distance" msgstr "추가 로딩 거리" -#: src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:2002 msgid "" "When set to zero, the distance the filament is moved from parking position " "during load is exactly the same as it was moved back during unload. When " @@ -12495,12 +14338,12 @@ msgstr "" "이동 한 거리와 동일합니다. 양수이면 음수가 더 많이 로드되고 로드가 음수 인 경" "우 언로드보다 짧습니다." -#: src/libslic3r/PrintConfig.cpp:1980 src/libslic3r/PrintConfig.cpp:2005 -#: src/libslic3r/PrintConfig.cpp:2019 src/libslic3r/PrintConfig.cpp:2029 +#: src/libslic3r/PrintConfig.cpp:2010 src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2049 src/libslic3r/PrintConfig.cpp:2059 msgid "Perimeters" msgstr "둘레" -#: src/libslic3r/PrintConfig.cpp:1981 +#: src/libslic3r/PrintConfig.cpp:2011 msgid "" "This is the acceleration your printer will use for perimeters. Set zero to " "disable acceleration control for perimeters." @@ -12508,23 +14351,23 @@ msgstr "" "프린터가 둘레에 사용할 가속입니다. 둘레에 대한 가속 제어를 비활성화하도록 0" "을 설정합니다." -#: src/libslic3r/PrintConfig.cpp:1989 +#: src/libslic3r/PrintConfig.cpp:2019 msgid "" "This is the acceleration your printer will use for external perimeters. Set " "zero to use the value for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1996 +#: src/libslic3r/PrintConfig.cpp:2026 msgid "Perimeter extruder" msgstr "가장자리(Perimeter) 익스트루더" -#: src/libslic3r/PrintConfig.cpp:1998 +#: src/libslic3r/PrintConfig.cpp:2028 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" "둘레와 가장자리를 인쇄 할 때 사용할 압출기입니다. 첫 번째 압출기는 1입니다." -#: src/libslic3r/PrintConfig.cpp:2007 +#: src/libslic3r/PrintConfig.cpp:2037 msgid "" "Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. If " @@ -12538,12 +14381,12 @@ msgstr "" "직경이 사용됩니다. 백분율 (예 : 200 %)로 표현하면 레이어 높이를 기준으로 계산" "됩니다." -#: src/libslic3r/PrintConfig.cpp:2021 +#: src/libslic3r/PrintConfig.cpp:2051 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "둘레의 속도 (등고선, 일명 세로 셸). 자동으로 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:2031 +#: src/libslic3r/PrintConfig.cpp:2061 msgid "" "This option sets the number of perimeters to generate for each layer. Note " "that Slic3r may increase this number automatically when it detects sloping " @@ -12554,11 +14397,11 @@ msgstr "" "사용하면 더 큰 주변 수를 사용하는 경사면을 감지 할 때 Slic3r이이 수를 자동으" "로 증가시킬 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2065 msgid "(minimum)" msgstr "(최소)" -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "" "If you want to process the output G-code through custom scripts, just list " "their absolute paths here. Separate multiple scripts with a semicolon. " @@ -12571,35 +14414,35 @@ msgstr "" "파일의 절대 경로를 첫 번째 인수로 전달되며 환경 변수를 읽음으로써 Slic3r 구" "성 설정에 액세스 할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2055 +#: src/libslic3r/PrintConfig.cpp:2085 msgid "Printer type" msgstr "프린터 타입" -#: src/libslic3r/PrintConfig.cpp:2056 +#: src/libslic3r/PrintConfig.cpp:2086 msgid "Type of the printer." msgstr "프린터 유형." -#: src/libslic3r/PrintConfig.cpp:2061 +#: src/libslic3r/PrintConfig.cpp:2091 msgid "Printer notes" msgstr "프린터 노트" -#: src/libslic3r/PrintConfig.cpp:2062 +#: src/libslic3r/PrintConfig.cpp:2092 msgid "You can put your notes regarding the printer here." msgstr "프린터 관련 메모를 여기에 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2070 +#: src/libslic3r/PrintConfig.cpp:2100 msgid "Printer vendor" msgstr "제조 회사" -#: src/libslic3r/PrintConfig.cpp:2071 +#: src/libslic3r/PrintConfig.cpp:2101 msgid "Name of the printer vendor." msgstr "프린터 공급 업체의 이름입니다." -#: src/libslic3r/PrintConfig.cpp:2076 +#: src/libslic3r/PrintConfig.cpp:2106 msgid "Printer variant" msgstr "프린터 변형" -#: src/libslic3r/PrintConfig.cpp:2077 +#: src/libslic3r/PrintConfig.cpp:2107 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." @@ -12607,57 +14450,57 @@ msgstr "" "프린터 변종 이름입니다. 예를 들어, 프린터 변형은 노즐 지름으로 구별 될 수 있" "습니다." -#: src/libslic3r/PrintConfig.cpp:2094 +#: src/libslic3r/PrintConfig.cpp:2124 msgid "Raft contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2096 +#: src/libslic3r/PrintConfig.cpp:2126 msgid "" "The vertical distance between object and raft. Ignored for soluble interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2103 +#: src/libslic3r/PrintConfig.cpp:2133 msgid "Raft expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2105 +#: src/libslic3r/PrintConfig.cpp:2135 msgid "Expansion of the raft in XY plane for better stability." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:2142 msgid "First layer density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2114 +#: src/libslic3r/PrintConfig.cpp:2144 msgid "Density of the first raft or support layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2122 +#: src/libslic3r/PrintConfig.cpp:2152 msgid "First layer expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2124 +#: src/libslic3r/PrintConfig.cpp:2154 msgid "" "Expansion of the first raft or support layer to improve adhesion to print " "bed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2131 +#: src/libslic3r/PrintConfig.cpp:2161 msgid "Raft layers" msgstr "라프트(Raft) 레이어" -#: src/libslic3r/PrintConfig.cpp:2133 +#: src/libslic3r/PrintConfig.cpp:2163 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." msgstr "" "물체는 이 개수의 층에 의해 상승되며, 그 아래에서 서포트 재료가 생성될 것이다." -#: src/libslic3r/PrintConfig.cpp:2141 +#: src/libslic3r/PrintConfig.cpp:2171 msgid "Slice resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2142 +#: src/libslic3r/PrintConfig.cpp:2172 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -12669,11 +14512,11 @@ msgstr "" "있는 것보다 더 많은 디테일을 가지고 있다. 단순화를 사용하지 않고 입력에서 전" "체 해상도를 사용하려면 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:2182 msgid "G-code resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2153 +#: src/libslic3r/PrintConfig.cpp:2183 msgid "" "Maximum deviation of exported G-code paths from their full resolution " "counterparts. Very high resolution G-code requires huge amount of RAM to " @@ -12684,20 +14527,20 @@ msgid "" "produced." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2164 +#: src/libslic3r/PrintConfig.cpp:2194 msgid "Minimum travel after retraction" msgstr "리트랙션 후 최소 이동 거리" -#: src/libslic3r/PrintConfig.cpp:2165 +#: src/libslic3r/PrintConfig.cpp:2195 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "이동 거리가 이 길이보다 짧으면 리트렉션이 트리거되지 않습니다." -#: src/libslic3r/PrintConfig.cpp:2171 +#: src/libslic3r/PrintConfig.cpp:2201 msgid "Retract amount before wipe" msgstr "닦아 내기 전의 수축량" -#: src/libslic3r/PrintConfig.cpp:2172 +#: src/libslic3r/PrintConfig.cpp:2202 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." @@ -12705,23 +14548,23 @@ msgstr "" "보우 덴 압출기를 사용하면 와이퍼 동작을하기 전에 약간의 빠른 리트랙션 를하는 " "것이 좋습니다." -#: src/libslic3r/PrintConfig.cpp:2179 +#: src/libslic3r/PrintConfig.cpp:2209 msgid "Retract on layer change" msgstr "레이어 변경 후퇴" -#: src/libslic3r/PrintConfig.cpp:2180 +#: src/libslic3r/PrintConfig.cpp:2210 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "이 플래그는 Z 이동이 완료 될 때마다 취소를 강제 실행합니다." -#: src/libslic3r/PrintConfig.cpp:2185 src/libslic3r/PrintConfig.cpp:2193 +#: src/libslic3r/PrintConfig.cpp:2215 src/libslic3r/PrintConfig.cpp:2223 msgid "Length" msgstr "길이" -#: src/libslic3r/PrintConfig.cpp:2186 +#: src/libslic3r/PrintConfig.cpp:2216 msgid "Retraction Length" msgstr "리트랙션 길이" -#: src/libslic3r/PrintConfig.cpp:2187 +#: src/libslic3r/PrintConfig.cpp:2217 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " @@ -12730,11 +14573,11 @@ msgstr "" "리트렉션이 시작되면 필라멘트가 지정된 양만큼 뒤로 당겨집니다 (길이는 압출기" "에 들어가기 전에 원시 필라멘트에서 측정됩니다)." -#: src/libslic3r/PrintConfig.cpp:2194 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Retraction Length (Toolchange)" msgstr "리트랙션 길이 (툴 체인지)" -#: src/libslic3r/PrintConfig.cpp:2195 +#: src/libslic3r/PrintConfig.cpp:2225 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " @@ -12743,11 +14586,11 @@ msgstr "" "공구를 교체하기 전에 리트렉션이 시작하면 필라멘트가 지정된 양만큼 뒤로 당겨집" "니다 (길이는 압출기에 들어가기 전에 처음 필라멘트에서 측정됩니다)." -#: src/libslic3r/PrintConfig.cpp:2203 +#: src/libslic3r/PrintConfig.cpp:2233 msgid "Lift Z" msgstr "Z축 올림" -#: src/libslic3r/PrintConfig.cpp:2204 +#: src/libslic3r/PrintConfig.cpp:2234 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " @@ -12756,15 +14599,15 @@ msgstr "" "이 값을 양수 값으로 설정하면 리트렉션이 시작 될 때마다 Z가 빠르게 올라갑니" "다. 여러 개의 압출기를 사용하는 경우 첫 번째 압출기의 설정 만 고려됩니다." -#: src/libslic3r/PrintConfig.cpp:2211 +#: src/libslic3r/PrintConfig.cpp:2241 msgid "Above Z" msgstr "Z 위치" -#: src/libslic3r/PrintConfig.cpp:2212 +#: src/libslic3r/PrintConfig.cpp:2242 msgid "Only lift Z above" msgstr "오직 Z축 위로만" -#: src/libslic3r/PrintConfig.cpp:2213 +#: src/libslic3r/PrintConfig.cpp:2243 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " @@ -12773,15 +14616,15 @@ msgstr "" "이것을 양수의 값으로 설정하면, 지정된 Z값 위로만 발생한다. 첫 번째 층에서 리" "프트를 건너뛸 수 있도록 이 설정을 조정할 수 있다." -#: src/libslic3r/PrintConfig.cpp:2220 +#: src/libslic3r/PrintConfig.cpp:2250 msgid "Below Z" msgstr "Z 아래" -#: src/libslic3r/PrintConfig.cpp:2221 +#: src/libslic3r/PrintConfig.cpp:2251 msgid "Only lift Z below" msgstr "Z값 아래만" -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2252 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " @@ -12790,11 +14633,11 @@ msgstr "" "이것을 양수 값으로 설정하면, 지정된 Z값 아래에서만 발생합니다. 첫 번째 레이어" "로 리프트를 제한하기 위해이 설정을 조정할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2238 +#: src/libslic3r/PrintConfig.cpp:2260 src/libslic3r/PrintConfig.cpp:2268 msgid "Extra length on restart" msgstr "재시작시 여분의 길이" -#: src/libslic3r/PrintConfig.cpp:2231 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." @@ -12802,7 +14645,7 @@ msgstr "" "이동 후 리트렉셔이 보정되면 익스트루더가 추가 양의 필라멘트를 밀어냅니다. 이 " "설정은 거의 필요하지 않습니다." -#: src/libslic3r/PrintConfig.cpp:2239 +#: src/libslic3r/PrintConfig.cpp:2269 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." @@ -12810,19 +14653,19 @@ msgstr "" "도구를 교환 한 후 리트렉션를 보정하면 익스트루더가 추가 양의 필라멘트를 밀게" "됩니다." -#: src/libslic3r/PrintConfig.cpp:2246 src/libslic3r/PrintConfig.cpp:2247 +#: src/libslic3r/PrintConfig.cpp:2276 src/libslic3r/PrintConfig.cpp:2277 msgid "Retraction Speed" msgstr "리트랙션 속도" -#: src/libslic3r/PrintConfig.cpp:2248 +#: src/libslic3r/PrintConfig.cpp:2278 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "리트랙션 속도 (익스트루더 모터에만 적용됨)." -#: src/libslic3r/PrintConfig.cpp:2254 src/libslic3r/PrintConfig.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:2284 src/libslic3r/PrintConfig.cpp:2285 msgid "Deretraction Speed" msgstr "감속 속도" -#: src/libslic3r/PrintConfig.cpp:2256 +#: src/libslic3r/PrintConfig.cpp:2286 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " @@ -12831,68 +14674,82 @@ msgstr "" "리트랙션 후 압출기에 필라멘트를 로드하는 속도 (압출기 모터에만 적용됨). 0으" "로 방치하면 리트랙션 속도가 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2293 msgid "Seam position" msgstr "재봉선 위치" -#: src/libslic3r/PrintConfig.cpp:2265 +#: src/libslic3r/PrintConfig.cpp:2295 msgid "Position of perimeters starting points." msgstr "둘레의 시작점의 위치." -#: src/libslic3r/PrintConfig.cpp:2272 +#: src/libslic3r/PrintConfig.cpp:2297 +msgid "Random" +msgstr "무작위" + +#: src/libslic3r/PrintConfig.cpp:2298 msgid "Nearest" msgstr "가장 가까운" -#: src/libslic3r/PrintConfig.cpp:2273 +#: src/libslic3r/PrintConfig.cpp:2299 msgid "Aligned" msgstr "정렬" -#: src/libslic3r/PrintConfig.cpp:2281 +#: src/libslic3r/PrintConfig.cpp:2306 +msgid "Staggered inner seams" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2307 +msgid "" +"This option causes the inner seams to be shifted backwards based on their " +"depth, forming a zigzag pattern." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2314 msgid "Direction" msgstr "방향" -#: src/libslic3r/PrintConfig.cpp:2283 +#: src/libslic3r/PrintConfig.cpp:2316 msgid "Preferred direction of the seam" msgstr "선호하는 재봉선(seam)의 방향" -#: src/libslic3r/PrintConfig.cpp:2284 +#: src/libslic3r/PrintConfig.cpp:2317 msgid "Seam preferred direction" msgstr "재봉선(Seam) 선호 방향" -#: src/libslic3r/PrintConfig.cpp:2291 +#: src/libslic3r/PrintConfig.cpp:2324 msgid "Jitter" msgstr "지터(Jitter)" -#: src/libslic3r/PrintConfig.cpp:2293 +#: src/libslic3r/PrintConfig.cpp:2326 msgid "Seam preferred direction jitter" msgstr "재봉선 선호 방향 지터(Jitter)" -#: src/libslic3r/PrintConfig.cpp:2294 +#: src/libslic3r/PrintConfig.cpp:2327 msgid "Preferred direction of the seam - jitter" msgstr "재봉선 지터의 선호 방향" -#: src/libslic3r/PrintConfig.cpp:2301 +#: src/libslic3r/PrintConfig.cpp:2334 msgid "Distance from brim/object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2335 msgid "" "Distance between skirt and brim (when draft shield is not used) or objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2308 +#: src/libslic3r/PrintConfig.cpp:2341 msgid "Skirt height" msgstr "스커트(Skirt) 높이" -#: src/libslic3r/PrintConfig.cpp:2309 +#: src/libslic3r/PrintConfig.cpp:2342 msgid "Height of skirt expressed in layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2348 msgid "Draft shield" msgstr "드래프트 쉴드" -#: src/libslic3r/PrintConfig.cpp:2316 +#: src/libslic3r/PrintConfig.cpp:2349 msgid "" "With draft shield active, the skirt will be printed skirt_distance from the " "object, possibly intersecting brim.\n" @@ -12902,27 +14759,27 @@ msgid "" "from print bed due to wind draft." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2324 +#: src/libslic3r/PrintConfig.cpp:2354 msgid "Disabled" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2325 +#: src/libslic3r/PrintConfig.cpp:2355 msgid "Limited" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2326 +#: src/libslic3r/PrintConfig.cpp:2356 msgid "Enabled" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2331 +#: src/libslic3r/PrintConfig.cpp:2362 msgid "Loops (minimum)" msgstr "루프(Loops) (최소)" -#: src/libslic3r/PrintConfig.cpp:2332 +#: src/libslic3r/PrintConfig.cpp:2363 msgid "Skirt Loops" msgstr "스커트 루프선 수량" -#: src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2364 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " @@ -12932,11 +14789,11 @@ msgstr "" "프 수보다 클 수 있다. 스커트를 완전히 비활성화하려면 이 값을 0으로 설정하십시" "오." -#: src/libslic3r/PrintConfig.cpp:2341 +#: src/libslic3r/PrintConfig.cpp:2372 msgid "Slow down if layer print time is below" msgstr "레이어 인쇄 시간이 다음과 같은 경우 속도를 낮추십시오" -#: src/libslic3r/PrintConfig.cpp:2342 +#: src/libslic3r/PrintConfig.cpp:2373 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." @@ -12944,11 +14801,11 @@ msgstr "" "층 인쇄 시간이 이 시간보다 낮게 추정될 경우, 인쇄 이동 속도는 이 값으로 지속" "되도록 축소된다." -#: src/libslic3r/PrintConfig.cpp:2351 +#: src/libslic3r/PrintConfig.cpp:2382 msgid "Small perimeters" msgstr "작은 둘레" -#: src/libslic3r/PrintConfig.cpp:2353 +#: src/libslic3r/PrintConfig.cpp:2384 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " @@ -12958,33 +14815,33 @@ msgstr "" "분율로 표시되는 경우 (예 : 80 %) 위의 속도 설정에서 계산됩니다. 자동으로 0으" "로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:2363 +#: src/libslic3r/PrintConfig.cpp:2394 msgid "Solid infill threshold area" msgstr "솔리드 채우기 임계값" -#: src/libslic3r/PrintConfig.cpp:2365 +#: src/libslic3r/PrintConfig.cpp:2396 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." msgstr "한계값보다 작은 영역에 대해 솔리드 인필을 강제 적용." -#: src/libslic3r/PrintConfig.cpp:2366 +#: src/libslic3r/PrintConfig.cpp:2397 msgid "mm²" msgstr "mm" -#: src/libslic3r/PrintConfig.cpp:2372 +#: src/libslic3r/PrintConfig.cpp:2403 msgid "Solid infill extruder" msgstr "솔리드 인필 익스트루더" -#: src/libslic3r/PrintConfig.cpp:2374 +#: src/libslic3r/PrintConfig.cpp:2405 msgid "The extruder to use when printing solid infill." msgstr "꽉찬 면을 인쇄할 때 사용하는 익스트루더." -#: src/libslic3r/PrintConfig.cpp:2380 +#: src/libslic3r/PrintConfig.cpp:2411 msgid "Solid infill every" msgstr "솔리드 인필 간격" -#: src/libslic3r/PrintConfig.cpp:2382 +#: src/libslic3r/PrintConfig.cpp:2413 msgid "" "This feature allows to force a solid layer every given number of layers. " "Zero to disable. You can set this to any value (for example 9999); Slic3r " @@ -12995,7 +14852,7 @@ msgstr "" "음. 당신은 이것을 어떤 값으로도 설정할 수 있다(예: 9999). Slic3r는 노즐 직경" "과 층 높이에 따라 결합할 최대 가능한 층 수를 자동으로 선택한다." -#: src/libslic3r/PrintConfig.cpp:2394 +#: src/libslic3r/PrintConfig.cpp:2425 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "solid surfaces. If left zero, default extrusion width will be used if set, " @@ -13006,7 +14863,7 @@ msgstr "" "하십시오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경" "이 사용된다. 백분율(예: 90%)로 표현되는 경우, 계층 높이에 걸쳐 계산된다." -#: src/libslic3r/PrintConfig.cpp:2406 +#: src/libslic3r/PrintConfig.cpp:2437 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " @@ -13015,19 +14872,19 @@ msgstr "" "솔리드 영역(상단/하부/내부 수평 셸) 인쇄 속도 이는 위의 기본 주입 속도에 대" "한 백분율(예: 80%)로 표시할 수 있다. 자동을 위해 0으로 설정한다." -#: src/libslic3r/PrintConfig.cpp:2418 +#: src/libslic3r/PrintConfig.cpp:2449 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "상단 및 하단 표면에 생성할 솔리드 레이어 수입니다." -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2455 src/libslic3r/PrintConfig.cpp:2456 msgid "Minimum thickness of a top / bottom shell" msgstr "상단/하단 쉘의 최소 두께" -#: src/libslic3r/PrintConfig.cpp:2431 +#: src/libslic3r/PrintConfig.cpp:2462 msgid "Spiral vase" msgstr "화병 모드(Spiral vase)" -#: src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2463 msgid "" "This feature will raise Z gradually while printing a single-walled object in " "order to remove any visible seam. This option requires a single perimeter, " @@ -13041,20 +14898,17 @@ msgstr "" "만 아니라 하단 솔리드 레이어의 수를 설정할 수 있습니다. 하나 이상의 개체를 인" "쇄할 때는 작동하지 않습니다." -#: src/libslic3r/PrintConfig.cpp:2440 +#: src/libslic3r/PrintConfig.cpp:2471 msgid "Temperature variation" msgstr "온도 변화" -#: src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:2472 msgid "" -"Temperature difference to be applied when an extruder is not active. Enables " -"a full-height \"sacrificial\" skirt on which the nozzles are periodically " -"wiped." +"Temperature difference to be applied when an extruder is not active. The " +"value is not used when 'idle_temperature' in filament settings is defined." msgstr "" -"돌출부가 활성화되지 않은 경우 적용되는 온도 차이. 노즐을 주기적으로 닦는 전" -"체 높이 \"인공\" 스커트가 가능하다." -#: src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2483 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -13071,7 +14925,7 @@ msgstr "" "든 PrusaSlicer 설정에 자리 표시자 변수를 사용할 수 있으므로 원하는 모든 곳에 " "\"M109 S[first_layer_temperature]\" 명령을 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2466 +#: src/libslic3r/PrintConfig.cpp:2498 msgid "" "This start procedure is inserted at the beginning, after any printer start " "gcode (and after any toolchange to this filament in case of multi-material " @@ -13092,35 +14946,35 @@ msgstr "" "든 곳에 \"M109 S[first_layer_temperature]\" 명령을 넣을 수 있습니다. 압출기" "가 여러 개 있는 경우 gcode는 압출기 순서로 처리됩니다." -#: src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2514 msgid "Color change G-code" msgstr "색상 변경 G 코드" -#: src/libslic3r/PrintConfig.cpp:2483 +#: src/libslic3r/PrintConfig.cpp:2515 msgid "This G-code will be used as a code for the color change" msgstr "이 G 코드는 색상 변경에 대한 코드로 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:2492 +#: src/libslic3r/PrintConfig.cpp:2524 msgid "This G-code will be used as a code for the pause print" msgstr "이 G 코드는 일시 중지 인쇄에 대한 코드로 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:2501 +#: src/libslic3r/PrintConfig.cpp:2533 msgid "This G-code will be used as a custom code" msgstr "이 G 코드는 사용자 지정 코드로 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:2509 +#: src/libslic3r/PrintConfig.cpp:2541 msgid "Single Extruder Multi Material" msgstr "싱글 익스트루더 멀티메터리얼" -#: src/libslic3r/PrintConfig.cpp:2510 +#: src/libslic3r/PrintConfig.cpp:2542 msgid "The printer multiplexes filaments into a single hot end." msgstr "프린터는 필라멘트를 하나의 핫 엔드에 멀티플렉싱합니다." -#: src/libslic3r/PrintConfig.cpp:2515 +#: src/libslic3r/PrintConfig.cpp:2547 msgid "Prime all printing extruders" msgstr "모든 인쇄 압출기 프라임" -#: src/libslic3r/PrintConfig.cpp:2516 +#: src/libslic3r/PrintConfig.cpp:2548 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." @@ -13128,11 +14982,11 @@ msgstr "" "활성화 된 경우, 모든 인쇄 압출기는 인쇄 시작시 프린트 베드의 전면 가장자리에 " "프라이밍 됩니다." -#: src/libslic3r/PrintConfig.cpp:2521 +#: src/libslic3r/PrintConfig.cpp:2553 msgid "No sparse layers (EXPERIMENTAL)" msgstr "숨겨진 레이어층 없음(실험적)" -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2554 msgid "" "If enabled, the wipe tower will not be printed on layers with no " "toolchanges. On layers with a toolchange, extruder will travel downward to " @@ -13143,11 +14997,11 @@ msgstr "" "변경이 있는 레이어에서 압출기는 아래쪽으로 이동하여 닦은 타워를 인쇄합니다. " "사용자는 인쇄와 충돌하지 않도록 합니다." -#: src/libslic3r/PrintConfig.cpp:2529 +#: src/libslic3r/PrintConfig.cpp:2561 msgid "Slice gap closing radius" msgstr "슬라이스 갭 닫기 반지름" -#: src/libslic3r/PrintConfig.cpp:2531 +#: src/libslic3r/PrintConfig.cpp:2563 msgid "" "Cracks smaller than 2x gap closing radius are being filled during the " "triangle mesh slicing. The gap closing operation may reduce the final print " @@ -13157,41 +15011,41 @@ msgstr "" "틈 닫기 작업은 최종 인쇄 해상도를 줄일 수 있으므로 값을 합리적으로 낮게 유지 " "하는 것이 좋습니다." -#: src/libslic3r/PrintConfig.cpp:2539 +#: src/libslic3r/PrintConfig.cpp:2571 msgid "Slicing Mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2541 +#: src/libslic3r/PrintConfig.cpp:2573 msgid "" "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " "close all holes in the model." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2575 msgid "Regular" msgstr "일반" -#: src/libslic3r/PrintConfig.cpp:2547 +#: src/libslic3r/PrintConfig.cpp:2576 msgid "Even-odd" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2548 +#: src/libslic3r/PrintConfig.cpp:2577 msgid "Close holes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2553 +#: src/libslic3r/PrintConfig.cpp:2583 msgid "Generate support material" msgstr "서포트 재료 생성" -#: src/libslic3r/PrintConfig.cpp:2555 +#: src/libslic3r/PrintConfig.cpp:2585 msgid "Enable support material generation." msgstr "서포트 재료를 사용합니다." -#: src/libslic3r/PrintConfig.cpp:2559 +#: src/libslic3r/PrintConfig.cpp:2589 msgid "Auto generated supports" msgstr "자동 생성 지원" -#: src/libslic3r/PrintConfig.cpp:2561 +#: src/libslic3r/PrintConfig.cpp:2591 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " @@ -13201,11 +15055,11 @@ msgstr "" "인란을 선택 하지 않으면 \"서포트 지원 영역\" 볼륨 내 에서만 지원이 생성 됩니" "다." -#: src/libslic3r/PrintConfig.cpp:2567 +#: src/libslic3r/PrintConfig.cpp:2597 msgid "XY separation between an object and its support" msgstr "물체와 그 서포트 사이 XY 분리" -#: src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2599 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." @@ -13213,17 +15067,17 @@ msgstr "" "객체와 그 서포트 사이의 XY 분리. 백분율 (예 : 50 %)로 표시되는 경우 외부 둘" "레 너비를 기준으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:2580 +#: src/libslic3r/PrintConfig.cpp:2610 msgid "Pattern angle" msgstr "패턴 각도" -#: src/libslic3r/PrintConfig.cpp:2582 +#: src/libslic3r/PrintConfig.cpp:2612 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." msgstr "이 설정을 사용하여지지 평면 패턴을 수평면으로 회전시킵니다." -#: src/libslic3r/PrintConfig.cpp:2592 src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:2622 src/libslic3r/PrintConfig.cpp:3411 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -13231,11 +15085,11 @@ msgstr "" "그것이 빌드 플레이트에있는 경우에만 지원을 작성하십시오. 인쇄물에 대한 지원" "을 작성하지 마십시오." -#: src/libslic3r/PrintConfig.cpp:2598 +#: src/libslic3r/PrintConfig.cpp:2627 msgid "Top contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2600 +#: src/libslic3r/PrintConfig.cpp:2629 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " @@ -13244,40 +15098,38 @@ msgstr "" "물체와 서포트 사이의 수직 거리. 이 값을 0으로 설정하면 Slic3r이 첫 번째 객체 " "레이어에 브리지 흐름과 속도를 사용하지 못하게됩니다." -#: src/libslic3r/PrintConfig.cpp:2608 +#: src/libslic3r/PrintConfig.cpp:2635 msgid "0 (soluble)" msgstr "0 (수용성)" -#: src/libslic3r/PrintConfig.cpp:2609 +#: src/libslic3r/PrintConfig.cpp:2636 msgid "0.1 (detachable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2610 +#: src/libslic3r/PrintConfig.cpp:2637 msgid "0.2 (detachable)" msgstr "0.2(분리 가능)" -#: src/libslic3r/PrintConfig.cpp:2616 +#: src/libslic3r/PrintConfig.cpp:2643 msgid "Bottom contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2618 +#: src/libslic3r/PrintConfig.cpp:2645 msgid "" "The vertical distance between the object top surface and the support " "material interface. If set to zero, support_material_contact_distance will " "be used for both top and bottom contact Z distances." msgstr "" -#. TRN To be shown in Print Settings "Bottom contact Z distance". Have to be as short as possible -#. TRN To be shown in Print Settings "Bottom interface layers". Have to be as short as possible -#: src/libslic3r/PrintConfig.cpp:2626 src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2651 src/libslic3r/PrintConfig.cpp:2732 msgid "Same as top" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2633 +#: src/libslic3r/PrintConfig.cpp:2659 msgid "Enforce support for the first" msgstr "첫 번째 서포트 더 강화" -#: src/libslic3r/PrintConfig.cpp:2635 +#: src/libslic3r/PrintConfig.cpp:2661 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -13288,15 +15140,15 @@ msgstr "" "어 지정된 레이어 수에 대한지지 자료를 생성합니다. 이것은 빌드 플레이트에 매" "우 얇거나 부족한 풋 프린트를 가진 물체를 더 많이 부착 할 때 유용합니다." -#: src/libslic3r/PrintConfig.cpp:2640 +#: src/libslic3r/PrintConfig.cpp:2666 msgid "Enforce support for the first n layers" msgstr "첫 번째 n 개의 레이어에 대한 서포트 강화" -#: src/libslic3r/PrintConfig.cpp:2646 +#: src/libslic3r/PrintConfig.cpp:2672 msgid "Support material/raft/skirt extruder" msgstr "서포트 재료 / 라프트 / 스커트 익스트루더" -#: src/libslic3r/PrintConfig.cpp:2648 +#: src/libslic3r/PrintConfig.cpp:2674 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." @@ -13304,7 +15156,7 @@ msgstr "" "서포트 재료, 라프트 및 스커트를 인쇄 할 때 사용하는 압출기 (도구 변경을 최소" "화하기 위해 현재 압출기를 사용하려면 1+, 0)." -#: src/libslic3r/PrintConfig.cpp:2657 +#: src/libslic3r/PrintConfig.cpp:2683 msgid "" "Set this to a non-zero value to set a manual extrusion width for support " "material. If left zero, default extrusion width will be used if set, " @@ -13315,20 +15167,20 @@ msgstr "" "0으로 설정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 노즐 지름이 " "사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:2667 +#: src/libslic3r/PrintConfig.cpp:2693 msgid "Interface loops" msgstr "인터페이스 루프" -#: src/libslic3r/PrintConfig.cpp:2669 +#: src/libslic3r/PrintConfig.cpp:2695 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "지지대의 상단 접촉 층을 루프로 덮으십시오. 기본적으로 사용 안 함." -#: src/libslic3r/PrintConfig.cpp:2674 +#: src/libslic3r/PrintConfig.cpp:2700 msgid "Support material/raft interface extruder" msgstr "서포트 재료/라프트 인터페이스 익스트루더" -#: src/libslic3r/PrintConfig.cpp:2676 +#: src/libslic3r/PrintConfig.cpp:2702 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." @@ -13337,62 +15189,66 @@ msgstr "" "기 위해 현재 익스트루더를 사용하려면 1+, 0). 이것은 라프트에도 영향을 미칩니" "다." -#: src/libslic3r/PrintConfig.cpp:2684 +#: src/libslic3r/PrintConfig.cpp:2709 msgid "Top interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2711 msgid "" "Number of interface layers to insert between the object(s) and support " "material." msgstr "객체와 서포트 재료 사이에 삽입할 인터페이스 레이어 수입니다." -#: src/libslic3r/PrintConfig.cpp:2693 +#: src/libslic3r/PrintConfig.cpp:2715 src/libslic3r/PrintConfig.cpp:2733 msgid "0 (off)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2716 src/libslic3r/PrintConfig.cpp:2734 msgid "1 (light)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2695 +#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2735 msgid "2 (default)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2696 +#: src/libslic3r/PrintConfig.cpp:2718 src/libslic3r/PrintConfig.cpp:2736 msgid "3 (heavy)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:2724 msgid "Bottom interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2704 +#: src/libslic3r/PrintConfig.cpp:2726 msgid "" "Number of interface layers to insert between the object(s) and support " "material. Set to -1 to use support_material_interface_layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2717 +#: src/libslic3r/PrintConfig.cpp:2742 msgid "Closing radius" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2719 +#: src/libslic3r/PrintConfig.cpp:2744 msgid "" "For snug supports, the support regions will be merged using morphological " "closing operation. Gaps smaller than the closing radius will be filled in." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2727 +#: src/libslic3r/PrintConfig.cpp:2752 msgid "Interface pattern spacing" msgstr "인터페이스 패턴 간격" -#: src/libslic3r/PrintConfig.cpp:2729 +#: src/libslic3r/PrintConfig.cpp:2754 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" "인터페이스 라인 간 간격. 솔리드 인터페이스를 가져오려면 0을 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:2738 +#: src/libslic3r/PrintConfig.cpp:2761 +msgid "Support material interface" +msgstr "서포트 인터페이스" + +#: src/libslic3r/PrintConfig.cpp:2763 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " @@ -13401,73 +15257,72 @@ msgstr "" "서포트 재료 인터페이스 레이어 인쇄 속도 백분율(예: 50%)로 표현될 경우 서포트 " "재료 속도에 따라 계산된다." -#: src/libslic3r/PrintConfig.cpp:2747 +#: src/libslic3r/PrintConfig.cpp:2772 msgid "Pattern" msgstr "패턴" -#: src/libslic3r/PrintConfig.cpp:2749 +#: src/libslic3r/PrintConfig.cpp:2774 msgid "Pattern used to generate support material." msgstr "서포트 재료를 생성하는 데 사용되는 패턴." -#: src/libslic3r/PrintConfig.cpp:2755 +#: src/libslic3r/PrintConfig.cpp:2777 msgid "Rectilinear grid" msgstr "직선 그리드" -#: src/libslic3r/PrintConfig.cpp:2761 +#: src/libslic3r/PrintConfig.cpp:2784 msgid "Interface pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2763 +#: src/libslic3r/PrintConfig.cpp:2786 msgid "" "Pattern used to generate support material interface. Default pattern for non-" "soluble support interface is Rectilinear, while default pattern for soluble " "support interface is Concentric." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2777 +#: src/libslic3r/PrintConfig.cpp:2798 msgid "Pattern spacing" msgstr "패턴 간격" -#: src/libslic3r/PrintConfig.cpp:2779 +#: src/libslic3r/PrintConfig.cpp:2800 msgid "Spacing between support material lines." msgstr "서포트 재료와 라인 사이의 간격." -#: src/libslic3r/PrintConfig.cpp:2788 +#: src/libslic3r/PrintConfig.cpp:2809 msgid "Speed for printing support material." msgstr "서포트 재료를 인쇄하는 속도." -#: src/libslic3r/PrintConfig.cpp:2795 -msgid "Style" -msgstr "모양새" - -#: src/libslic3r/PrintConfig.cpp:2797 +#: src/libslic3r/PrintConfig.cpp:2818 msgid "" "Style and shape of the support towers. Projecting the supports into a " "regular grid will create more stable supports, while snug support towers " "will save material and reduce object scarring." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2804 +#: src/libslic3r/PrintConfig.cpp:2823 msgid "Snug" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2809 +#: src/libslic3r/PrintConfig.cpp:2824 +msgid "Organic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2830 msgid "Synchronize with object layers" msgstr "객체 레이어와 동기화" -#: src/libslic3r/PrintConfig.cpp:2811 +#: src/libslic3r/PrintConfig.cpp:2832 msgid "" "Synchronize support layers with the object print layers. This is useful with " -"multi-material printers, where the extruder switch is expensive." +"multi-material printers, where the extruder switch is expensive. This option " +"is only available when top contact Z distance is set to zero." msgstr "" -"서포트 레이어를 프린트 레이어와 동기화하십시오. 이것은 스위치가 비싼 멀티 메" -"터리얼 프린터에서 유용하다." -#: src/libslic3r/PrintConfig.cpp:2817 +#: src/libslic3r/PrintConfig.cpp:2839 msgid "Overhang threshold" msgstr "오버행 한계점" -#: src/libslic3r/PrintConfig.cpp:2819 +#: src/libslic3r/PrintConfig.cpp:2841 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -13479,11 +15334,11 @@ msgstr "" "성되지 않는다. 즉, 이 값은 서포트 재료 없이 인쇄할 수 있는 가장 수평 경사(수" "평면에서 측정됨)를 나타낸다. 자동 감지를 위해 0으로 설정하십시오(권장)." -#: src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2853 msgid "With sheath around the support" msgstr "서포트 주변이나 외부로" -#: src/libslic3r/PrintConfig.cpp:2833 +#: src/libslic3r/PrintConfig.cpp:2855 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." @@ -13491,7 +15346,72 @@ msgstr "" "기본 서포트 주위에 외장 (단일 주변 선)을 추가하십시오. 이것은 페이스 업을보" "다 신뢰성있게 만들뿐만 아니라 제거하기도 어렵습니다." -#: src/libslic3r/PrintConfig.cpp:2840 +#: src/libslic3r/PrintConfig.cpp:2861 +msgid "Maximum Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2863 +msgid "" +"The maximum angle of the branches, when the branches have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle to be able to have more reach." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2872 +msgid "Preferred Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2874 +msgid "" +"The preferred angle of the branches, when they do not have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle for branches to merge faster." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2883 +msgid "Tip Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2885 +msgid "The diameter of the top of the tip of the branches of organic support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2892 +msgid "Branch Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2894 +msgid "" +"The diameter of the thinnest branches of organic support. Thicker branches " +"are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2902 +msgid "Branch Diameter Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2904 +msgid "" +"The angle of the branches' diameter as they gradually become thicker towards " +"the bottom. An angle of 0 will cause the branches to have uniform thickness " +"over their length. A bit of an angle can increase stability of the organic " +"support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2914 +msgid "Branch Density" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2916 +msgid "" +"Adjusts the density of the support structure used to generate the tips of " +"the branches. A higher value results in better overhangs but the supports " +"are harder to remove, thus it is recommended to enable top support " +"interfaces instead of a high branch density value if dense interfaces are " +"needed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2928 msgid "" "Nozzle temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output G-code." @@ -13499,36 +15419,36 @@ msgstr "" "첫 번째 후 레이어에 대한 노즐 온도. 출력 G 코드에서 온도 제어 명령을 사용하" "지 않도록 설정합니다." -#: src/libslic3r/PrintConfig.cpp:2843 +#: src/libslic3r/PrintConfig.cpp:2931 msgid "Nozzle temperature" msgstr "노즐 온도" -#: src/libslic3r/PrintConfig.cpp:2849 +#: src/libslic3r/PrintConfig.cpp:2937 msgid "Thick bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2851 +#: src/libslic3r/PrintConfig.cpp:2939 msgid "" "If enabled, bridges are more reliable, can bridge longer distances, but may " "look worse. If disabled, bridges look better but are reliable just for " "shorter bridged distances." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2857 +#: src/libslic3r/PrintConfig.cpp:2945 msgid "Detect thin walls" msgstr "얇은 벽(walls) 감지" -#: src/libslic3r/PrintConfig.cpp:2859 +#: src/libslic3r/PrintConfig.cpp:2947 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." msgstr "싱글 너비 벽 (두 부분이 맞지 않는 부분과 무너지는 부분)을 감지합니다." -#: src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2953 msgid "Threads" msgstr "게시글" -#: src/libslic3r/PrintConfig.cpp:2866 +#: src/libslic3r/PrintConfig.cpp:2954 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." @@ -13536,7 +15456,7 @@ msgstr "" "스레드는 장기 실행 태스크를 병렬 처리하는 데 사용됩니다. 최적의 스레드 수는 " "사용 가능한 코어 / 프로세서 수보다 약간 높습니다." -#: src/libslic3r/PrintConfig.cpp:2878 +#: src/libslic3r/PrintConfig.cpp:2966 msgid "" "This custom code is inserted before every toolchange. Placeholder variables " "for all PrusaSlicer settings as well as {toolchange_z}, {previous_extruder} " @@ -13546,7 +15466,7 @@ msgid "" "behaviour both before and after the toolchange." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2891 +#: src/libslic3r/PrintConfig.cpp:2979 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "top surfaces. You may want to use thinner extrudates to fill all narrow " @@ -13560,7 +15480,7 @@ msgstr "" "으면 노즐 지름이 사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준" "으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:2904 +#: src/libslic3r/PrintConfig.cpp:2992 msgid "" "Speed for printing top solid layers (it only applies to the uppermost " "external layers and not to their internal solid layers). You may want to " @@ -13573,15 +15493,15 @@ msgstr "" "전 속도에 대한 백분율 (예 : 80 %)로 나타낼 수 있습니다. 자동으로 0으로 설정하" "십시오." -#: src/libslic3r/PrintConfig.cpp:2919 +#: src/libslic3r/PrintConfig.cpp:3007 msgid "Number of solid layers to generate on top surfaces." msgstr "상단 표면에 생성 할 솔리드 레이어 수입니다." -#: src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3008 msgid "Top solid layers" msgstr "탑 솔리드 레이어" -#: src/libslic3r/PrintConfig.cpp:2928 +#: src/libslic3r/PrintConfig.cpp:3016 msgid "" "The number of top solid layers is increased above top_solid_layers if " "necessary to satisfy minimum thickness of top shell. This is useful to " @@ -13591,30 +15511,30 @@ msgstr "" "top_solid_layers 이상 증가합니다. 이는 가변 층 높이로 인쇄할 때 베개 효과를 " "방지하는 데 유용합니다." -#: src/libslic3r/PrintConfig.cpp:2931 +#: src/libslic3r/PrintConfig.cpp:3019 msgid "Minimum top shell thickness" msgstr "최소 상단 쉘 두께" -#: src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:3026 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "이동 속도 (먼 돌출 점 사이의 점프)." -#: src/libslic3r/PrintConfig.cpp:2946 +#: src/libslic3r/PrintConfig.cpp:3034 msgid "Z travel" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2947 +#: src/libslic3r/PrintConfig.cpp:3035 msgid "" "Speed for movements along the Z axis.\n" "When set to zero, the value is ignored and regular travel speed is used " "instead." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2955 +#: src/libslic3r/PrintConfig.cpp:3043 msgid "Use firmware retraction" msgstr "펌웨어 철회" -#: src/libslic3r/PrintConfig.cpp:2956 +#: src/libslic3r/PrintConfig.cpp:3044 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." @@ -13622,11 +15542,11 @@ msgstr "" "이 실험 설정은 G10 및 G11 명령을 사용하여 펌웨어에서 취소를 처리하도록합니" "다. 이것은 최근의 말린에서만 지원됩니다." -#: src/libslic3r/PrintConfig.cpp:2962 +#: src/libslic3r/PrintConfig.cpp:3050 msgid "Use relative E distances" msgstr "상대적인 E 거리 사용" -#: src/libslic3r/PrintConfig.cpp:2963 +#: src/libslic3r/PrintConfig.cpp:3051 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." @@ -13634,11 +15554,11 @@ msgstr "" "펌웨어에 상대 E 값이 필요한 경우이 값을 선택하고, 그렇지 않으면 선택하지 마십" "시오. 대부분의 회사는 절대 값을 사용합니다." -#: src/libslic3r/PrintConfig.cpp:2969 +#: src/libslic3r/PrintConfig.cpp:3057 msgid "Use volumetric E" msgstr "용적(volumetric) E 사용" -#: src/libslic3r/PrintConfig.cpp:2970 +#: src/libslic3r/PrintConfig.cpp:3058 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -13653,11 +15573,11 @@ msgstr "" "[filament_diameter_0] T0'과 같은 명령을 입력 할 수 있습니다 Slic3r. 이것은 최" "근의 말린에서만 지원됩니다." -#: src/libslic3r/PrintConfig.cpp:2980 +#: src/libslic3r/PrintConfig.cpp:3068 msgid "Enable variable layer height feature" msgstr "가변 레이어 높이 기능 사용" -#: src/libslic3r/PrintConfig.cpp:2981 +#: src/libslic3r/PrintConfig.cpp:3069 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." @@ -13665,11 +15585,11 @@ msgstr "" "일부 프린터 또는 프린터 설정은 가변 레이어 높이로 인쇄하는 데 어려움이있을 " "수 있습니다. 기본적으로 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:2987 +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Wipe while retracting" msgstr "리트렉싱시 닦아내십시오." -#: src/libslic3r/PrintConfig.cpp:2988 +#: src/libslic3r/PrintConfig.cpp:3076 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." @@ -13677,7 +15597,7 @@ msgstr "" "이 플래그는 누출된 리트랙싱의 블럽 가능성을 최소화하기 위해 수축하는 동안 노" "즐을 이동시킨다." -#: src/libslic3r/PrintConfig.cpp:2995 +#: src/libslic3r/PrintConfig.cpp:3083 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." @@ -13685,11 +15605,11 @@ msgstr "" "멀티 메터리알 프린터는 공구 교환 시 익스트루더를 프라이밍하거나 제거해야 할 " "수 있다. 과도한 물질을 와이퍼 타워에 돌출시킨다." -#: src/libslic3r/PrintConfig.cpp:3001 +#: src/libslic3r/PrintConfig.cpp:3089 msgid "Purging volumes - load/unload volumes" msgstr "볼륨 삭제 - 볼륨 로드/언로드" -#: src/libslic3r/PrintConfig.cpp:3002 +#: src/libslic3r/PrintConfig.cpp:3090 msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " @@ -13698,11 +15618,11 @@ msgstr "" "이 벡터는 지우기 타워에 사용되는 각 도구에서/로 변경하는 데 필요한 볼륨을 저" "장합니다. 이러한 값은 아래 전체 제거 볼륨의 생성을 단순화하는 데 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:3008 +#: src/libslic3r/PrintConfig.cpp:3096 msgid "Purging volumes - matrix" msgstr "볼륨 삭제 - 행렬" -#: src/libslic3r/PrintConfig.cpp:3009 +#: src/libslic3r/PrintConfig.cpp:3097 msgid "" "This matrix describes volumes (in cubic milimetres) required to purge the " "new filament on the wipe tower for any given pair of tools." @@ -13710,54 +15630,58 @@ msgstr "" "이 매트릭스는 지정 된 도구 쌍에 대해 와이퍼 타워의 새필라멘트를 제거 하는 데 " "필요한 체적 (입방 밀리 미터)을 설명 합니다." -#: src/libslic3r/PrintConfig.cpp:3018 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Position X" msgstr "X축 위치" -#: src/libslic3r/PrintConfig.cpp:3019 +#: src/libslic3r/PrintConfig.cpp:3107 msgid "X coordinate of the left front corner of a wipe tower" msgstr "와이프 타워의 좌측 전면 모서리의 X 좌표" -#: src/libslic3r/PrintConfig.cpp:3025 +#: src/libslic3r/PrintConfig.cpp:3113 msgid "Position Y" msgstr "Y축 위치" -#: src/libslic3r/PrintConfig.cpp:3026 +#: src/libslic3r/PrintConfig.cpp:3114 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "와이퍼 작동 타워의 좌측 전방 모서리의 Y 좌표" -#: src/libslic3r/PrintConfig.cpp:3033 +#: src/libslic3r/PrintConfig.cpp:3120 +msgid "Width" +msgstr "넓이" + +#: src/libslic3r/PrintConfig.cpp:3121 msgid "Width of a wipe tower" msgstr "와이퍼 타워 폭" -#: src/libslic3r/PrintConfig.cpp:3039 +#: src/libslic3r/PrintConfig.cpp:3127 msgid "Wipe tower rotation angle" msgstr "와이퍼 타워 회전각도" -#: src/libslic3r/PrintConfig.cpp:3040 +#: src/libslic3r/PrintConfig.cpp:3128 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "x축에 대하여 타워 회전 각도를 닦아냅니다." -#: src/libslic3r/PrintConfig.cpp:3046 src/libslic3r/PrintConfig.cpp:3047 +#: src/libslic3r/PrintConfig.cpp:3134 src/libslic3r/PrintConfig.cpp:3135 msgid "Wipe tower brim width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3055 +#: src/libslic3r/PrintConfig.cpp:3143 msgid "Wipe into this object's infill" msgstr "이 오브젝트의 채우기를 닦아" -#: src/libslic3r/PrintConfig.cpp:3056 +#: src/libslic3r/PrintConfig.cpp:3144 msgid "" "Purging after toolchange will be done inside this object's infills. This " "lowers the amount of waste but may result in longer print time due to " "additional travel moves." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3063 +#: src/libslic3r/PrintConfig.cpp:3151 msgid "Wipe into this object" msgstr "이 개체로 닦아" -#: src/libslic3r/PrintConfig.cpp:3064 +#: src/libslic3r/PrintConfig.cpp:3152 msgid "" "Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " @@ -13767,19 +15691,19 @@ msgstr "" "에서 종료 되는 재료를 저장 하고 인쇄 시간을 줄입니다. 그 결과 개체의 색상이 " "혼합 됩니다." -#: src/libslic3r/PrintConfig.cpp:3070 +#: src/libslic3r/PrintConfig.cpp:3158 msgid "Maximal bridging distance" msgstr "최대 브리징 거리" -#: src/libslic3r/PrintConfig.cpp:3071 +#: src/libslic3r/PrintConfig.cpp:3159 msgid "Maximal distance between supports on sparse infill sections." msgstr "드문드문한 인필 섹션에서 지지대 사이의 최대 거리." -#: src/libslic3r/PrintConfig.cpp:3077 +#: src/libslic3r/PrintConfig.cpp:3165 msgid "XY Size Compensation" msgstr "XY 크기 보정" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3167 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" @@ -13788,11 +15712,11 @@ msgstr "" "XY 평면에서 설정된 값(음수 = 안, 양 = 바깥쪽)에 따라 객체가 증가/정격된다. 이" "는 구멍 크기를 미세 조정하는데 유용할 수 있다." -#: src/libslic3r/PrintConfig.cpp:3087 +#: src/libslic3r/PrintConfig.cpp:3175 msgid "Z offset" msgstr "Z 오프셋" -#: src/libslic3r/PrintConfig.cpp:3088 +#: src/libslic3r/PrintConfig.cpp:3176 msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " "output G-code. It is used to compensate for bad Z endstop position: for " @@ -13803,11 +15727,11 @@ msgstr "" "톱 0이 실제로 노즐을 프린트 베드에서 0.3mm 떨어진 곳에 둔 경우, 이를 -0.3(또" "는 엔드 스톱을 고정)으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:3097 +#: src/libslic3r/PrintConfig.cpp:3185 msgid "Perimeter generator" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3099 +#: src/libslic3r/PrintConfig.cpp:3187 msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " @@ -13815,19 +15739,19 @@ msgid "" "Concentric infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3192 msgid "Classic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3107 +#: src/libslic3r/PrintConfig.cpp:3193 msgid "Arachne" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3199 msgid "Perimeter transition length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3114 +#: src/libslic3r/PrintConfig.cpp:3201 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " @@ -13835,11 +15759,11 @@ msgid "" "be computed based on the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3123 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Perimeter transitioning filter margin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3125 +#: src/libslic3r/PrintConfig.cpp:3212 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -13851,11 +15775,11 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3138 +#: src/libslic3r/PrintConfig.cpp:3225 msgid "Perimeter transitioning threshold angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3140 +#: src/libslic3r/PrintConfig.cpp:3227 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -13864,22 +15788,22 @@ msgid "" "these center perimeters, but may leave gaps or overextrude." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3151 +#: src/libslic3r/PrintConfig.cpp:3238 msgid "Perimeter distribution count" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3153 +#: src/libslic3r/PrintConfig.cpp:3240 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " "in width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3247 msgid "Minimum feature size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3162 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " @@ -13888,76 +15812,244 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3172 +#: src/libslic3r/PrintConfig.cpp:3259 msgid "Minimum perimeter width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3174 +#: src/libslic3r/PrintConfig.cpp:3261 +msgid "" +"Width of the perimeter that will replace thin features (according to the " +"Minimum feature size) of the model. If the Minimum perimeter width is " +"thinner than the thickness of the feature, the perimeter will become as " +"thick as the feature itself. If expressed as a percentage (for example 85%), " +"it will be computed based on the nozzle diameter." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3327 +msgid "Pinhead front diameter" +msgstr "핀헤드 프론트 직경" + +#: src/libslic3r/PrintConfig.cpp:3329 +msgid "Diameter of the pointing side of the head" +msgstr "헤드 포인팅 측면 지름" + +#: src/libslic3r/PrintConfig.cpp:3336 +msgid "Head penetration" +msgstr "잘못된 헤드 관통" + +#: src/libslic3r/PrintConfig.cpp:3338 +msgid "How much the pinhead has to penetrate the model surface" +msgstr "핀헤드가 모델 표면에 침투해야 하는 양" + +#: src/libslic3r/PrintConfig.cpp:3345 +msgid "Pinhead width" +msgstr "핀헤드 너비" + +#: src/libslic3r/PrintConfig.cpp:3347 +msgid "Width from the back sphere center to the front sphere center" +msgstr "뒤쪽 구 중심에서 앞쪽 구 중심 까지의 폭입니다" + +#: src/libslic3r/PrintConfig.cpp:3355 +msgid "Pillar diameter" +msgstr "기둥 직경" + +#: src/libslic3r/PrintConfig.cpp:3357 +msgid "Diameter in mm of the support pillars" +msgstr "서포트 기둥의 지름 (mm)" + +#: src/libslic3r/PrintConfig.cpp:3365 +msgid "Small pillar diameter percent" +msgstr "작은 기둥 직경 퍼센트" + +#: src/libslic3r/PrintConfig.cpp:3367 +msgid "" +"The percentage of smaller pillars compared to the normal pillar diameter " +"which are used in problematic areas where a normal pilla cannot fit." +msgstr "" +"일반 필라가 맞지 않는 문제가 있는 부위에 사용되는 일반 기둥 직경에 비해 작은 " +"기둥의 백분율입니다." + +#: src/libslic3r/PrintConfig.cpp:3376 +msgid "Max bridges on a pillar" +msgstr "기둥의 최대 교량" + +#: src/libslic3r/PrintConfig.cpp:3378 +msgid "" +"Maximum number of bridges that can be placed on a pillar. Bridges hold " +"support point pinheads and connect to pillars as small branches." +msgstr "" +"기둥에 배치할 수 있는 최대 브리지 수입니다. 브리지는 지지점 핀헤드를 잡고 작" +"은 가지로 기둥에 연결합니다." + +#: src/libslic3r/PrintConfig.cpp:3386 +msgid "Max weight on model" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3389 +msgid "" +"Maximum weight of sub-trees that terminate on the model instead of the print " +"bed. The weight is the sum of the lenghts of all branches emanating from the " +"endpoint." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3397 +msgid "Pillar connection mode" +msgstr "기둥 연결 모드" + +#: src/libslic3r/PrintConfig.cpp:3398 +msgid "" +"Controls the bridge type between two neighboring pillars. Can be zig-zag, " +"cross (double zig-zag) or dynamic which will automatically switch between " +"the first two depending on the distance of the two pillars." +msgstr "" +"인접한 두 기둥 사이의 교량 유형을 제어 합니다. 두 기둥의 거리에 따라 자동으" +"로 처음 두 사이를 전환 하는 지그재그, 크로스 (지그재그 더블 지그재그) 또는 동" +"적 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Zig-Zag" +msgstr "지그재그" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Cross" +msgstr "십자가" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Dynamic" +msgstr "동적" + +#: src/libslic3r/PrintConfig.cpp:3416 +msgid "Pillar widening factor" +msgstr "기둥 확대 계수" + +#: src/libslic3r/PrintConfig.cpp:3420 +msgid "" +"Merging bridges or pillars into another pillars can increase the radius. " +"Zero means no increase, one means full increase. The exact amount of " +"increase is unspecified and can change in the future." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3431 +msgid "Support base diameter" +msgstr "서포트 베이스 지름" + +#: src/libslic3r/PrintConfig.cpp:3433 +msgid "Diameter in mm of the pillar base" +msgstr "기둥 베이스의 mm 직경" + +#: src/libslic3r/PrintConfig.cpp:3441 +msgid "Support base height" +msgstr "서포트 기준 높이" + +#: src/libslic3r/PrintConfig.cpp:3443 +msgid "The height of the pillar base cone" +msgstr "서포트 베이스 원추의 높이" + +#: src/libslic3r/PrintConfig.cpp:3450 +msgid "Support base safety distance" +msgstr "지지 기지 안전 거리" + +#: src/libslic3r/PrintConfig.cpp:3453 +msgid "" +"The minimum distance of the pillar base from the model in mm. Makes sense in " +"zero elevation mode where a gap according to this parameter is inserted " +"between the model and the pad." +msgstr "" +"모델에서 mm의 기둥 베이스의 최소 거리입니다. 이 매개 변수에 따른 간격이 모델" +"과 패드 사이에 삽입되는 0 고도 모드에서 의미가 있습니다." + +#: src/libslic3r/PrintConfig.cpp:3463 +msgid "Critical angle" +msgstr "임계 각도" + +#: src/libslic3r/PrintConfig.cpp:3465 +msgid "The default angle for connecting support sticks and junctions." +msgstr "서포트 스틱과 접합부를 연결 하는 기본 각도입니다." + +#: src/libslic3r/PrintConfig.cpp:3473 +msgid "Max bridge length" +msgstr "최대 브리지 길이" + +#: src/libslic3r/PrintConfig.cpp:3475 +msgid "The max length of a bridge" +msgstr "브릿지의 최대 길이" + +#: src/libslic3r/PrintConfig.cpp:3487 +msgid "Max pillar linking distance" +msgstr "최대 기둥 연결 거리" + +#: src/libslic3r/PrintConfig.cpp:3489 +msgid "" +"The max distance of two pillars to get linked with each other. A zero value " +"will prohibit pillar cascading." +msgstr "" +"서로 연결 되는 두기둥의 최대 거리. 0 값은 기둥을 계단식으로 금지 합니다." + +#: src/libslic3r/PrintConfig.cpp:3499 msgid "" -"Width of the perimeter that will replace thin features (according to the " -"Minimum feature size) of the model. If the Minimum perimeter width is " -"thinner than the thickness of the feature, the perimeter will become as " -"thick as the feature itself. If expressed as a percentage (for example 85%), " -"it will be computed based on the nozzle diameter." +"How much the supports should lift up the supported object. If \"Pad around " +"object\" is enabled, this value is ignored." msgstr "" +"지원되는 개체를 들어 올려야 하는 지원 의 양입니다. \"개체 주위 의 패드\"가 활" +"성화되면 이 값은 무시됩니다." -#: src/libslic3r/PrintConfig.cpp:3242 +#: src/libslic3r/PrintConfig.cpp:3515 msgid "Display width" msgstr "표시 폭" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3516 msgid "Width of the display" msgstr "디스플레이의 폭입니다" -#: src/libslic3r/PrintConfig.cpp:3248 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "Display height" msgstr "표시 높이" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3522 msgid "Height of the display" msgstr "디스플레이 높이" -#: src/libslic3r/PrintConfig.cpp:3254 +#: src/libslic3r/PrintConfig.cpp:3527 msgid "Number of pixels in" msgstr "픽셀 수" -#: src/libslic3r/PrintConfig.cpp:3256 +#: src/libslic3r/PrintConfig.cpp:3529 msgid "Number of pixels in X" msgstr "X의 픽셀 수" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3535 msgid "Number of pixels in Y" msgstr "Y의 픽셀 수" -#: src/libslic3r/PrintConfig.cpp:3267 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Display horizontal mirroring" msgstr "수평 미러링 표시" -#: src/libslic3r/PrintConfig.cpp:3268 +#: src/libslic3r/PrintConfig.cpp:3541 msgid "Mirror horizontally" msgstr "가로로 대칭" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3542 msgid "Enable horizontal mirroring of output images" msgstr "출력 이미지의 수평 미러링 사용" -#: src/libslic3r/PrintConfig.cpp:3274 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Display vertical mirroring" msgstr "세로 미러링 표시" -#: src/libslic3r/PrintConfig.cpp:3275 +#: src/libslic3r/PrintConfig.cpp:3548 msgid "Mirror vertically" msgstr "세로로 미러" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "Enable vertical mirroring of output images" msgstr "출력 이미지의 수직 미러링 사용" -#: src/libslic3r/PrintConfig.cpp:3281 +#: src/libslic3r/PrintConfig.cpp:3554 msgid "Display orientation" msgstr "표시 방향" -#: src/libslic3r/PrintConfig.cpp:3282 +#: src/libslic3r/PrintConfig.cpp:3555 msgid "" "Set the actual LCD display orientation inside the SLA printer. Portrait mode " "will flip the meaning of display width and height parameters and the output " @@ -13966,55 +16058,55 @@ msgstr "" "SLA 프린터 내부에 실제 LCD 디스플레이 방향을 설정합니다. 세로 모드는 디스플레" "이 너비와 높이 매개 변수의 의미를 뒤집고 출력 이미지가 90도 회전합니다." -#: src/libslic3r/PrintConfig.cpp:3288 +#: src/libslic3r/PrintConfig.cpp:3559 msgid "Landscape" msgstr "가로" -#: src/libslic3r/PrintConfig.cpp:3289 +#: src/libslic3r/PrintConfig.cpp:3560 msgid "Portrait" msgstr "세로" -#: src/libslic3r/PrintConfig.cpp:3294 src/libslic3r/PrintConfig.cpp:3929 +#: src/libslic3r/PrintConfig.cpp:3566 src/libslic3r/PrintConfig.cpp:4058 msgid "Fast" msgstr "빠른" -#: src/libslic3r/PrintConfig.cpp:3295 +#: src/libslic3r/PrintConfig.cpp:3567 msgid "Fast tilt" msgstr "빠른 기울기" -#: src/libslic3r/PrintConfig.cpp:3296 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Time of the fast tilt" msgstr "빠른 기울기의 시간" -#: src/libslic3r/PrintConfig.cpp:3303 src/libslic3r/PrintConfig.cpp:3928 +#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:4057 msgid "Slow" msgstr "느리게" -#: src/libslic3r/PrintConfig.cpp:3304 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Slow tilt" msgstr "천천히 기울이기" -#: src/libslic3r/PrintConfig.cpp:3305 +#: src/libslic3r/PrintConfig.cpp:3577 msgid "Time of the slow tilt" msgstr "천천히 기울이는 속도" -#: src/libslic3r/PrintConfig.cpp:3312 src/libslic3r/PrintConfig.cpp:3930 +#: src/libslic3r/PrintConfig.cpp:3584 src/libslic3r/PrintConfig.cpp:4059 msgid "High viscosity" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3313 +#: src/libslic3r/PrintConfig.cpp:3585 msgid "Tilt for high viscosity resin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3314 +#: src/libslic3r/PrintConfig.cpp:3586 msgid "Time of the super slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3321 +#: src/libslic3r/PrintConfig.cpp:3593 msgid "Area fill" msgstr "영역 채우기" -#: src/libslic3r/PrintConfig.cpp:3322 +#: src/libslic3r/PrintConfig.cpp:3594 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -14024,59 +16116,59 @@ msgstr "" "인쇄 영역이 지정 된 값을 초과 하면 \n" "그런 다음 느린 기울기가 사용 됩니다, 그렇지 않으면-빠른 기울기가 됩니다" -#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 -#: src/libslic3r/PrintConfig.cpp:3331 +#: src/libslic3r/PrintConfig.cpp:3601 src/libslic3r/PrintConfig.cpp:3602 +#: src/libslic3r/PrintConfig.cpp:3603 msgid "Printer scaling correction" msgstr "프린터 크기 조정 보정" -#: src/libslic3r/PrintConfig.cpp:3337 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3609 src/libslic3r/PrintConfig.cpp:3611 msgid "Printer scaling correction in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3338 +#: src/libslic3r/PrintConfig.cpp:3610 msgid "Printer scaling X axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3345 src/libslic3r/PrintConfig.cpp:3347 +#: src/libslic3r/PrintConfig.cpp:3617 src/libslic3r/PrintConfig.cpp:3619 msgid "Printer scaling correction in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3346 +#: src/libslic3r/PrintConfig.cpp:3618 msgid "Printer scaling Y axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3353 src/libslic3r/PrintConfig.cpp:3355 +#: src/libslic3r/PrintConfig.cpp:3625 src/libslic3r/PrintConfig.cpp:3627 msgid "Printer scaling correction in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3354 +#: src/libslic3r/PrintConfig.cpp:3626 msgid "Printer scaling Z axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3361 src/libslic3r/PrintConfig.cpp:3362 +#: src/libslic3r/PrintConfig.cpp:3633 src/libslic3r/PrintConfig.cpp:3634 msgid "Printer absolute correction" msgstr "프린터 절대 보정" -#: src/libslic3r/PrintConfig.cpp:3363 +#: src/libslic3r/PrintConfig.cpp:3635 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "보정 의 표시에 따라 슬라이스 된 2D 다각형을 팽창하거나 수축합니다." -#: src/libslic3r/PrintConfig.cpp:3369 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Elephant foot minimum width" msgstr "코끼리 발 최소 폭" -#: src/libslic3r/PrintConfig.cpp:3371 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "코끼리 발 보정을 할 때 유지 해야 하는 기능의 최소 폭." -#: src/libslic3r/PrintConfig.cpp:3378 src/libslic3r/PrintConfig.cpp:3379 +#: src/libslic3r/PrintConfig.cpp:3650 src/libslic3r/PrintConfig.cpp:3651 msgid "Printer gamma correction" msgstr "프린터 감마 보정" -#: src/libslic3r/PrintConfig.cpp:3380 +#: src/libslic3r/PrintConfig.cpp:3652 msgid "" "This will apply a gamma correction to the rasterized 2D polygons. A gamma " "value of zero means thresholding with the threshold in the middle. This " @@ -14086,299 +16178,171 @@ msgstr "" "중간에 임계값이 임계화 의미입니다. 이 동작은 폴리곤의 구멍을 잃지 않고 안티알" "리아싱을 제거 합니다." -#: src/libslic3r/PrintConfig.cpp:3399 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3671 src/libslic3r/PrintConfig.cpp:3672 msgid "SLA material type" msgstr "SLA 재료 유형" -#: src/libslic3r/PrintConfig.cpp:3411 src/libslic3r/PrintConfig.cpp:3412 +#: src/libslic3r/PrintConfig.cpp:3679 src/libslic3r/PrintConfig.cpp:3680 msgid "Initial layer height" msgstr "초기 레이어 높이" -#: src/libslic3r/PrintConfig.cpp:3418 src/libslic3r/PrintConfig.cpp:3419 +#: src/libslic3r/PrintConfig.cpp:3686 +msgid "Idle temperature" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3687 +msgid "" +"Nozzle temperature when the tool is currently not used in multi-tool setups." +"This is only used when 'Ooze prevention' is active in Print Settings." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3695 src/libslic3r/PrintConfig.cpp:3696 msgid "Bottle volume" msgstr "병 볼륨" -#: src/libslic3r/PrintConfig.cpp:3420 +#: src/libslic3r/PrintConfig.cpp:3697 msgid "ml" msgstr "ml" -#: src/libslic3r/PrintConfig.cpp:3425 src/libslic3r/PrintConfig.cpp:3426 +#: src/libslic3r/PrintConfig.cpp:3702 src/libslic3r/PrintConfig.cpp:3703 msgid "Bottle weight" msgstr "병 무게" -#: src/libslic3r/PrintConfig.cpp:3427 +#: src/libslic3r/PrintConfig.cpp:3704 msgid "kg" msgstr "kg" -#: src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "g/ml" msgstr "g/ml" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3718 msgid "money/bottle" msgstr "가격 /병" -#: src/libslic3r/PrintConfig.cpp:3446 +#: src/libslic3r/PrintConfig.cpp:3723 msgid "Faded layers" msgstr "페이드 레이어" -#: src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3724 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "노출 시간에 필요한 레이어 수가 초기 노출 시간에서 노출 시간으로 페이드" -#: src/libslic3r/PrintConfig.cpp:3454 src/libslic3r/PrintConfig.cpp:3455 +#: src/libslic3r/PrintConfig.cpp:3731 src/libslic3r/PrintConfig.cpp:3732 msgid "Minimum exposure time" msgstr "최소 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3462 src/libslic3r/PrintConfig.cpp:3463 +#: src/libslic3r/PrintConfig.cpp:3739 src/libslic3r/PrintConfig.cpp:3740 msgid "Maximum exposure time" msgstr "최대 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3470 src/libslic3r/PrintConfig.cpp:3471 +#: src/libslic3r/PrintConfig.cpp:3747 src/libslic3r/PrintConfig.cpp:3748 msgid "Exposure time" msgstr "노출 시간" -#: src/libslic3r/PrintConfig.cpp:3477 src/libslic3r/PrintConfig.cpp:3478 +#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3755 msgid "Minimum initial exposure time" msgstr "최소 초기 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3485 src/libslic3r/PrintConfig.cpp:3486 +#: src/libslic3r/PrintConfig.cpp:3762 src/libslic3r/PrintConfig.cpp:3763 msgid "Maximum initial exposure time" msgstr "최대 초기 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3493 src/libslic3r/PrintConfig.cpp:3494 +#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3771 msgid "Initial exposure time" msgstr "최소 초기 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3500 src/libslic3r/PrintConfig.cpp:3501 +#: src/libslic3r/PrintConfig.cpp:3777 src/libslic3r/PrintConfig.cpp:3778 msgid "Correction for expansion" msgstr "확장에 대한 수정" -#: src/libslic3r/PrintConfig.cpp:3507 src/libslic3r/PrintConfig.cpp:3508 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3785 msgid "Correction for expansion in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3514 src/libslic3r/PrintConfig.cpp:3515 +#: src/libslic3r/PrintConfig.cpp:3791 src/libslic3r/PrintConfig.cpp:3792 msgid "Correction for expansion in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3521 src/libslic3r/PrintConfig.cpp:3522 +#: src/libslic3r/PrintConfig.cpp:3798 src/libslic3r/PrintConfig.cpp:3799 msgid "Correction for expansion in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3528 +#: src/libslic3r/PrintConfig.cpp:3805 msgid "SLA print material notes" msgstr "SLA 프린트 소재 노트" -#: src/libslic3r/PrintConfig.cpp:3529 +#: src/libslic3r/PrintConfig.cpp:3806 msgid "You can put your notes regarding the SLA print material here." msgstr "여기에서 SLA 인쇄 자료에 대한 메모를 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3552 +#: src/libslic3r/PrintConfig.cpp:3818 src/libslic3r/PrintConfig.cpp:3829 msgid "Default SLA material profile" msgstr "기본 SLA 재질 프로파일" -#: src/libslic3r/PrintConfig.cpp:3563 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "Generate supports" msgstr "지원 생성" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3842 msgid "Generate supports for the models" msgstr "모델에 대한 지원 생성" -#: src/libslic3r/PrintConfig.cpp:3570 -msgid "Pinhead front diameter" -msgstr "핀헤드 프론트 직경" - -#: src/libslic3r/PrintConfig.cpp:3572 -msgid "Diameter of the pointing side of the head" -msgstr "헤드 포인팅 측면 지름" - -#: src/libslic3r/PrintConfig.cpp:3579 -msgid "Head penetration" -msgstr "잘못된 헤드 관통" - -#: src/libslic3r/PrintConfig.cpp:3581 -msgid "How much the pinhead has to penetrate the model surface" -msgstr "핀헤드가 모델 표면에 침투해야 하는 양" - -#: src/libslic3r/PrintConfig.cpp:3588 -msgid "Pinhead width" -msgstr "핀헤드 너비" - -#: src/libslic3r/PrintConfig.cpp:3590 -msgid "Width from the back sphere center to the front sphere center" -msgstr "뒤쪽 구 중심에서 앞쪽 구 중심 까지의 폭입니다" - -#: src/libslic3r/PrintConfig.cpp:3598 -msgid "Pillar diameter" -msgstr "기둥 직경" - -#: src/libslic3r/PrintConfig.cpp:3600 -msgid "Diameter in mm of the support pillars" -msgstr "서포트 기둥의 지름 (mm)" - -#: src/libslic3r/PrintConfig.cpp:3608 -msgid "Small pillar diameter percent" -msgstr "작은 기둥 직경 퍼센트" - -#: src/libslic3r/PrintConfig.cpp:3610 -msgid "" -"The percentage of smaller pillars compared to the normal pillar diameter " -"which are used in problematic areas where a normal pilla cannot fit." -msgstr "" -"일반 필라가 맞지 않는 문제가 있는 부위에 사용되는 일반 기둥 직경에 비해 작은 " -"기둥의 백분율입니다." - -#: src/libslic3r/PrintConfig.cpp:3619 -msgid "Max bridges on a pillar" -msgstr "기둥의 최대 교량" - -#: src/libslic3r/PrintConfig.cpp:3621 -msgid "" -"Maximum number of bridges that can be placed on a pillar. Bridges hold " -"support point pinheads and connect to pillars as small branches." -msgstr "" -"기둥에 배치할 수 있는 최대 브리지 수입니다. 브리지는 지지점 핀헤드를 잡고 작" -"은 가지로 기둥에 연결합니다." - -#: src/libslic3r/PrintConfig.cpp:3629 -msgid "Pillar connection mode" -msgstr "기둥 연결 모드" - -#: src/libslic3r/PrintConfig.cpp:3630 -msgid "" -"Controls the bridge type between two neighboring pillars. Can be zig-zag, " -"cross (double zig-zag) or dynamic which will automatically switch between " -"the first two depending on the distance of the two pillars." +#: src/libslic3r/PrintConfig.cpp:3847 +msgid "Support tree type" msgstr "" -"인접한 두 기둥 사이의 교량 유형을 제어 합니다. 두 기둥의 거리에 따라 자동으" -"로 처음 두 사이를 전환 하는 지그재그, 크로스 (지그재그 더블 지그재그) 또는 동" -"적 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:3638 -msgid "Zig-Zag" -msgstr "지그재그" - -#: src/libslic3r/PrintConfig.cpp:3639 -msgid "Cross" -msgstr "십자가" - -#: src/libslic3r/PrintConfig.cpp:3640 -msgid "Dynamic" -msgstr "동적" - -#: src/libslic3r/PrintConfig.cpp:3652 -msgid "Pillar widening factor" -msgstr "기둥 확대 계수" -#: src/libslic3r/PrintConfig.cpp:3654 -msgid "" -"Merging bridges or pillars into another pillars can increase the radius. " -"Zero means no increase, one means full increase." +#: src/libslic3r/PrintConfig.cpp:3848 +msgid "Support tree building strategy" msgstr "" -"브릿지 또는 기둥을 다른 기둥에 병합 하면 반지름을 늘릴 수 있습니다. 0은 증가 " -"없음을 의미 하나는 전체 증가를 의미 합니다." - -#: src/libslic3r/PrintConfig.cpp:3663 -msgid "Support base diameter" -msgstr "서포트 베이스 지름" - -#: src/libslic3r/PrintConfig.cpp:3665 -msgid "Diameter in mm of the pillar base" -msgstr "기둥 베이스의 mm 직경" - -#: src/libslic3r/PrintConfig.cpp:3673 -msgid "Support base height" -msgstr "서포트 기준 높이" - -#: src/libslic3r/PrintConfig.cpp:3675 -msgid "The height of the pillar base cone" -msgstr "서포트 베이스 원추의 높이" - -#: src/libslic3r/PrintConfig.cpp:3682 -msgid "Support base safety distance" -msgstr "지지 기지 안전 거리" -#: src/libslic3r/PrintConfig.cpp:3685 -msgid "" -"The minimum distance of the pillar base from the model in mm. Makes sense in " -"zero elevation mode where a gap according to this parameter is inserted " -"between the model and the pad." +#: src/libslic3r/PrintConfig.cpp:3851 +msgid "Branching (experimental)" msgstr "" -"모델에서 mm의 기둥 베이스의 최소 거리입니다. 이 매개 변수에 따른 간격이 모델" -"과 패드 사이에 삽입되는 0 고도 모드에서 의미가 있습니다." - -#: src/libslic3r/PrintConfig.cpp:3695 -msgid "Critical angle" -msgstr "임계 각도" - -#: src/libslic3r/PrintConfig.cpp:3697 -msgid "The default angle for connecting support sticks and junctions." -msgstr "서포트 스틱과 접합부를 연결 하는 기본 각도입니다." -#: src/libslic3r/PrintConfig.cpp:3705 -msgid "Max bridge length" -msgstr "최대 브리지 길이" - -#: src/libslic3r/PrintConfig.cpp:3707 -msgid "The max length of a bridge" -msgstr "브릿지의 최대 길이" - -#: src/libslic3r/PrintConfig.cpp:3714 -msgid "Max pillar linking distance" -msgstr "최대 기둥 연결 거리" - -#: src/libslic3r/PrintConfig.cpp:3716 -msgid "" -"The max distance of two pillars to get linked with each other. A zero value " -"will prohibit pillar cascading." +#: src/libslic3r/PrintConfig.cpp:3860 +msgid "Support only in enforced regions" msgstr "" -"서로 연결 되는 두기둥의 최대 거리. 0 값은 기둥을 계단식으로 금지 합니다." -#: src/libslic3r/PrintConfig.cpp:3726 -msgid "" -"How much the supports should lift up the supported object. If \"Pad around " -"object\" is enabled, this value is ignored." +#: src/libslic3r/PrintConfig.cpp:3862 +msgid "Only create support if it lies in a support enforcer." msgstr "" -"지원되는 개체를 들어 올려야 하는 지원 의 양입니다. \"개체 주위 의 패드\"가 활" -"성화되면 이 값은 무시됩니다." -#: src/libslic3r/PrintConfig.cpp:3737 +#: src/libslic3r/PrintConfig.cpp:3869 msgid "This is a relative measure of support points density." msgstr "이는 서포트 점 밀도의 상대적인 척도입니다." -#: src/libslic3r/PrintConfig.cpp:3743 +#: src/libslic3r/PrintConfig.cpp:3875 msgid "Minimal distance of the support points" msgstr "서포트 지점의 최소 거리" -#: src/libslic3r/PrintConfig.cpp:3745 +#: src/libslic3r/PrintConfig.cpp:3877 msgid "No support points will be placed closer than this threshold." msgstr "서포트 지점은 이 임계값 보다 더 가깝게 배치 되지 않습니다." -#: src/libslic3r/PrintConfig.cpp:3751 +#: src/libslic3r/PrintConfig.cpp:3883 msgid "Use pad" msgstr "패드 사용" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3885 msgid "Add a pad underneath the supported model" msgstr "서포트 되는 모델 아래에 패드 추가" -#: src/libslic3r/PrintConfig.cpp:3758 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "Pad wall thickness" msgstr "패드 벽 두께" -#: src/libslic3r/PrintConfig.cpp:3760 +#: src/libslic3r/PrintConfig.cpp:3892 msgid "The thickness of the pad and its optional cavity walls." msgstr "패드의 두께와 선택적 캐비티 벽." -#: src/libslic3r/PrintConfig.cpp:3768 +#: src/libslic3r/PrintConfig.cpp:3900 msgid "Pad wall height" msgstr "패드 벽 높이" -#: src/libslic3r/PrintConfig.cpp:3769 +#: src/libslic3r/PrintConfig.cpp:3901 msgid "" "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " "when enabling this feature, as some resins may produce an extreme suction " @@ -14389,19 +16353,19 @@ msgstr "" "이 기능을 활성화 할 때 주의 해야할, 일부 수 캐비티 내부 극단적인 흡입 효과를 " "생성 할 수도 있기 때문에, vat 호일 인쇄를 벗겨 어렵게 만든다." -#: src/libslic3r/PrintConfig.cpp:3782 +#: src/libslic3r/PrintConfig.cpp:3914 msgid "Pad brim size" msgstr "패드 브럼 사이즈" -#: src/libslic3r/PrintConfig.cpp:3783 +#: src/libslic3r/PrintConfig.cpp:3915 msgid "How far should the pad extend around the contained geometry" msgstr "패드가 포함된 형상 주위에 얼마나 멀리 확장되어야 합니까?" -#: src/libslic3r/PrintConfig.cpp:3793 +#: src/libslic3r/PrintConfig.cpp:3925 msgid "Max merge distance" msgstr "최대 병합 거리" -#: src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3927 msgid "" "Some objects can get along with a few smaller pads instead of a single big " "one. This parameter defines how far the center of two smaller pads should " @@ -14411,94 +16375,94 @@ msgstr "" "변수는 두 개의 작은 패드의 중심이 얼마나 되어야 하는지 정의 합니다. 그들은 하" "나의 패드에 병합을 얻을 것이다." -#: src/libslic3r/PrintConfig.cpp:3815 +#: src/libslic3r/PrintConfig.cpp:3947 msgid "Pad wall slope" msgstr "패드 벽 경사" -#: src/libslic3r/PrintConfig.cpp:3817 +#: src/libslic3r/PrintConfig.cpp:3949 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "" "침대 평면을 기준으로 패드 벽의 경사입니다. 90도는 직선 벽을 의미합니다." -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3960 msgid "Create pad around object and ignore the support elevation" msgstr "오브젝트 주위에 패드를 만들고 지지표 표고를 무시합니다." -#: src/libslic3r/PrintConfig.cpp:3833 +#: src/libslic3r/PrintConfig.cpp:3965 msgid "Pad around object everywhere" msgstr "사방 물체 주위의 패드" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3967 msgid "Force pad around object everywhere" msgstr "사방 물체 주위의 힘 패드" -#: src/libslic3r/PrintConfig.cpp:3840 +#: src/libslic3r/PrintConfig.cpp:3972 msgid "Pad object gap" msgstr "패드 오브젝트 갭" -#: src/libslic3r/PrintConfig.cpp:3842 +#: src/libslic3r/PrintConfig.cpp:3974 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "오브젝트 바닥과 생성된 패드 사이의 간격이 0 고도 모드에서 발생합니다." -#: src/libslic3r/PrintConfig.cpp:3851 +#: src/libslic3r/PrintConfig.cpp:3983 msgid "Pad object connector stride" msgstr "패드 오브젝트 커넥터 보폭" -#: src/libslic3r/PrintConfig.cpp:3853 +#: src/libslic3r/PrintConfig.cpp:3985 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "오브젝트와 생성된 패드를 연결하는 두 커넥터 스틱 사이의 거리입니다." -#: src/libslic3r/PrintConfig.cpp:3860 +#: src/libslic3r/PrintConfig.cpp:3992 msgid "Pad object connector width" msgstr "패드 오브젝트 커넥터 너비" -#: src/libslic3r/PrintConfig.cpp:3862 +#: src/libslic3r/PrintConfig.cpp:3994 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "오브젝트와 생성된 패드를 연결하는 커넥터 스틱의 너비입니다." -#: src/libslic3r/PrintConfig.cpp:3869 +#: src/libslic3r/PrintConfig.cpp:4001 msgid "Pad object connector penetration" msgstr "패드 오브젝트 커넥터 침투" -#: src/libslic3r/PrintConfig.cpp:3872 +#: src/libslic3r/PrintConfig.cpp:4004 msgid "How much should the tiny connectors penetrate into the model body." msgstr "작은 커넥터가 모델 본체에 얼마나 침투해야 하는가." -#: src/libslic3r/PrintConfig.cpp:3879 +#: src/libslic3r/PrintConfig.cpp:4011 msgid "Enable hollowing" msgstr "중공 활성화" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:4013 msgid "Hollow out a model to have an empty interior" msgstr "빈 인테리어를 가지고 모델을 중공" -#: src/libslic3r/PrintConfig.cpp:3886 +#: src/libslic3r/PrintConfig.cpp:4018 msgid "Wall thickness" msgstr "벽 두께" -#: src/libslic3r/PrintConfig.cpp:3888 +#: src/libslic3r/PrintConfig.cpp:4020 msgid "Minimum wall thickness of a hollowed model." msgstr "비어 있는 모델의 최소 벽 두께입니다." -#: src/libslic3r/PrintConfig.cpp:3896 +#: src/libslic3r/PrintConfig.cpp:4028 msgid "Accuracy" msgstr "명중률" -#: src/libslic3r/PrintConfig.cpp:3898 +#: src/libslic3r/PrintConfig.cpp:4030 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." msgstr "" "성능 대 계산의 정확도. 값이 낮을수록 원치 않는 아티팩트가 생성될 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:4040 msgid "" "Hollowing is done in two steps: first, an imaginary interior is calculated " "deeper (offset plus the closing distance) in the object and then it's " @@ -14510,181 +16474,213 @@ msgstr "" "플러스 닫는 거리)로 계산된 다음 지정된 오프셋으로 다시 팽창합니다. 닫는 거리" "가 클수록 내부가 더 둥글게 됩니다. 0에서 내부는 외관을 가장 닮은 것입니다." -#: src/libslic3r/PrintConfig.cpp:3920 +#: src/libslic3r/PrintConfig.cpp:4052 msgid "Print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3922 +#: src/libslic3r/PrintConfig.cpp:4054 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " "movement and adds a delay before exposure." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4390 +#: src/libslic3r/PrintConfig.cpp:4065 +msgid "Format of the output SLA archive" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4070 +msgid "SLA output precision" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4071 +msgid "Minimum resolution in nanometers" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4542 msgid "Export OBJ" msgstr "OBJ 내보내기" -#: src/libslic3r/PrintConfig.cpp:4391 +#: src/libslic3r/PrintConfig.cpp:4543 msgid "Export the model(s) as OBJ." msgstr "모델을 OBJ로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4554 msgid "Export SLA" msgstr "수출 SLA" -#: src/libslic3r/PrintConfig.cpp:4403 +#: src/libslic3r/PrintConfig.cpp:4555 msgid "Slice the model and export SLA printing layers as PNG." msgstr "모델을 분할하고 SLA 인쇄 레이어를 PNG로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4408 +#: src/libslic3r/PrintConfig.cpp:4560 msgid "Export 3MF" msgstr "3MF 내보내기" -#: src/libslic3r/PrintConfig.cpp:4409 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Export the model(s) as 3MF." msgstr "모델(들)을 3MF로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4413 +#: src/libslic3r/PrintConfig.cpp:4565 msgid "Export AMF" msgstr "AMF로 내보내기" -#: src/libslic3r/PrintConfig.cpp:4414 +#: src/libslic3r/PrintConfig.cpp:4566 msgid "Export the model(s) as AMF." msgstr "모델을 AMF로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4418 +#: src/libslic3r/PrintConfig.cpp:4570 msgid "Export STL" msgstr "STL로 내보내기" -#: src/libslic3r/PrintConfig.cpp:4419 +#: src/libslic3r/PrintConfig.cpp:4571 msgid "Export the model(s) as STL." msgstr "모델을 STL로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4424 +#: src/libslic3r/PrintConfig.cpp:4576 msgid "Slice the model and export toolpaths as G-code." msgstr "모델을 슬라이스하고 도구 경로를 G 코드로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4581 msgid "G-code viewer" msgstr "G 코드 뷰어" -#: src/libslic3r/PrintConfig.cpp:4430 +#: src/libslic3r/PrintConfig.cpp:4582 msgid "Visualize an already sliced and saved G-code" msgstr "이미 슬라이스되고 저장된 G 코드 시각화" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4588 +msgid "OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4589 +msgid "Select the specified OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4594 +msgid "OpenGL debug output" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4595 +msgid "Activate OpenGL debug output on graphic cards which support it" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4601 msgid "Slice" msgstr "슬라이스" -#: src/libslic3r/PrintConfig.cpp:4436 +#: src/libslic3r/PrintConfig.cpp:4602 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "" " printer_technology 구성 값을 기반으로 모델을 FFF 또는 SLA로 슬라이스합니다." -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4607 msgid "Help" msgstr "도움말" -#: src/libslic3r/PrintConfig.cpp:4442 +#: src/libslic3r/PrintConfig.cpp:4608 msgid "Show this help." msgstr "도움말 표시하기" -#: src/libslic3r/PrintConfig.cpp:4447 +#: src/libslic3r/PrintConfig.cpp:4613 msgid "Help (FFF options)" msgstr "도움말(FFF 옵션)" -#: src/libslic3r/PrintConfig.cpp:4448 +#: src/libslic3r/PrintConfig.cpp:4614 msgid "Show the full list of print/G-code configuration options." msgstr "인쇄/G 코드 구성 옵션의 전체 목록을 표시합니다." -#: src/libslic3r/PrintConfig.cpp:4452 +#: src/libslic3r/PrintConfig.cpp:4618 msgid "Help (SLA options)" msgstr "도움말(SLA 옵션)" -#: src/libslic3r/PrintConfig.cpp:4453 +#: src/libslic3r/PrintConfig.cpp:4619 msgid "Show the full list of SLA print configuration options." msgstr "SLA 인쇄 구성 옵션의 전체 목록을 표시합니다." -#: src/libslic3r/PrintConfig.cpp:4457 +#: src/libslic3r/PrintConfig.cpp:4623 msgid "Output Model Info" msgstr "출력 모델 정보" -#: src/libslic3r/PrintConfig.cpp:4458 +#: src/libslic3r/PrintConfig.cpp:4624 msgid "Write information about the model to the console." msgstr "콘솔에 모델에 대한 정보를 작성합니다." -#: src/libslic3r/PrintConfig.cpp:4462 +#: src/libslic3r/PrintConfig.cpp:4628 msgid "Save config file" msgstr "구성 파일 저장" -#: src/libslic3r/PrintConfig.cpp:4463 +#: src/libslic3r/PrintConfig.cpp:4629 msgid "Save configuration to the specified file." msgstr "지정된 파일에 구성을 저장합니다." -#: src/libslic3r/PrintConfig.cpp:4473 +#: src/libslic3r/PrintConfig.cpp:4639 msgid "Align XY" msgstr "XY 정렬" -#: src/libslic3r/PrintConfig.cpp:4474 +#: src/libslic3r/PrintConfig.cpp:4640 msgid "Align the model to the given point." msgstr "모델을 지정된 점에 맞춥니다." -#: src/libslic3r/PrintConfig.cpp:4479 +#: src/libslic3r/PrintConfig.cpp:4645 msgid "Cut model at the given Z." msgstr "지정된 Z에서 모델을 잘라냅니다." -#: src/libslic3r/PrintConfig.cpp:4501 +#: src/libslic3r/PrintConfig.cpp:4666 +msgid "Center" +msgstr "중앙" + +#: src/libslic3r/PrintConfig.cpp:4667 msgid "Center the print around the given center." msgstr "지정된 점을 중심으로 인쇄 합니다." -#: src/libslic3r/PrintConfig.cpp:4505 +#: src/libslic3r/PrintConfig.cpp:4671 msgid "Don't arrange" msgstr "준비하지 마십시오" -#: src/libslic3r/PrintConfig.cpp:4506 +#: src/libslic3r/PrintConfig.cpp:4672 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" "병합하기 전에 지정된 모델을 재정렬하고 원래 XY 좌표를 유지하지 마십시오." -#: src/libslic3r/PrintConfig.cpp:4509 +#: src/libslic3r/PrintConfig.cpp:4675 msgid "Ensure on bed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4510 +#: src/libslic3r/PrintConfig.cpp:4676 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4514 +#: src/libslic3r/PrintConfig.cpp:4680 msgid "Duplicate" msgstr "복사" -#: src/libslic3r/PrintConfig.cpp:4515 +#: src/libslic3r/PrintConfig.cpp:4681 msgid "Multiply copies by this factor." msgstr "이 계수에 따라 복사본을 곱합니다." -#: src/libslic3r/PrintConfig.cpp:4519 +#: src/libslic3r/PrintConfig.cpp:4685 msgid "Duplicate by grid" msgstr "그리드별 중복" -#: src/libslic3r/PrintConfig.cpp:4520 +#: src/libslic3r/PrintConfig.cpp:4686 msgid "Multiply copies by creating a grid." msgstr "그리드를 만들어 복사본을 곱합니다." -#: src/libslic3r/PrintConfig.cpp:4524 +#: src/libslic3r/PrintConfig.cpp:4690 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." msgstr "" "한 번 작업을 수행하기 위해 제공 된 모델을 정렬하고 단일 모델로 병합 합니다." -#: src/libslic3r/PrintConfig.cpp:4529 +#: src/libslic3r/PrintConfig.cpp:4695 msgid "" "Try to repair any non-manifold meshes (this option is implicitly added " "whenever we need to slice the model to perform the requested action)." @@ -14692,60 +16688,68 @@ msgstr "" "메쉬를 복구 하십시오 (요청 된 작업을 수행 하기 위해 모델을 슬라이스 해야 할때" "마다 이 옵션이 암시적으로 추가 됨)." -#: src/libslic3r/PrintConfig.cpp:4533 +#: src/libslic3r/PrintConfig.cpp:4699 msgid "Rotation angle around the Z axis in degrees." msgstr "Z 축 주위 회전 각도입니다." -#: src/libslic3r/PrintConfig.cpp:4537 +#: src/libslic3r/PrintConfig.cpp:4703 msgid "Rotate around X" msgstr "X 주위 회전" -#: src/libslic3r/PrintConfig.cpp:4538 +#: src/libslic3r/PrintConfig.cpp:4704 msgid "Rotation angle around the X axis in degrees." msgstr "X 축을 중심 회전 각도 입니다." -#: src/libslic3r/PrintConfig.cpp:4542 +#: src/libslic3r/PrintConfig.cpp:4708 msgid "Rotate around Y" msgstr "Y 주위 회전" -#: src/libslic3r/PrintConfig.cpp:4543 +#: src/libslic3r/PrintConfig.cpp:4709 msgid "Rotation angle around the Y axis in degrees." msgstr "Y 축을 중심 회전 각도 입니다." -#: src/libslic3r/PrintConfig.cpp:4548 +#: src/libslic3r/PrintConfig.cpp:4714 msgid "Scaling factor or percentage." msgstr "배율 또는 백분율을 조정합니다." -#: src/libslic3r/PrintConfig.cpp:4553 +#: src/libslic3r/PrintConfig.cpp:4719 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "" "지정 된 모델에서 연결 되지 않은 부품을 감지 하여 별도의 객체로 분할 합니다." -#: src/libslic3r/PrintConfig.cpp:4556 +#: src/libslic3r/PrintConfig.cpp:4722 msgid "Scale to Fit" msgstr "크기 조정" -#: src/libslic3r/PrintConfig.cpp:4557 +#: src/libslic3r/PrintConfig.cpp:4723 msgid "Scale to fit the given volume." msgstr "지정된 볼륨에 맞게 배율을 조정합니다." -#: src/libslic3r/PrintConfig.cpp:4566 +#: src/libslic3r/PrintConfig.cpp:4727 +msgid "Delete files after loading" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4728 +msgid "Delete files after loading." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4736 msgid "Ignore non-existent config files" msgstr "존재하지 않는 구성 파일 무시" -#: src/libslic3r/PrintConfig.cpp:4567 +#: src/libslic3r/PrintConfig.cpp:4737 msgid "Do not fail if a file supplied to --load does not exist." msgstr "--load에 제공된 파일이 존재하지 않는 경우 실패하지 마십시오." -#: src/libslic3r/PrintConfig.cpp:4570 +#: src/libslic3r/PrintConfig.cpp:4740 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4741 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -14753,27 +16757,27 @@ msgid "" "substitute an unknown value with a default silently or verbosely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4745 msgid "Bail out on unknown configuration values" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4579 +#: src/libslic3r/PrintConfig.cpp:4746 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4580 +#: src/libslic3r/PrintConfig.cpp:4747 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4584 +#: src/libslic3r/PrintConfig.cpp:4752 msgid "Load config file" msgstr "로드 구성 파일" -#: src/libslic3r/PrintConfig.cpp:4585 +#: src/libslic3r/PrintConfig.cpp:4753 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -14781,21 +16785,21 @@ msgstr "" "지정된 파일에서 구성을 로드합니다. 여러 파일에서 옵션을 로드하는 데 두 번 이" "상 사용할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:4588 +#: src/libslic3r/PrintConfig.cpp:4756 msgid "Output File" msgstr "출력 파일" -#: src/libslic3r/PrintConfig.cpp:4589 +#: src/libslic3r/PrintConfig.cpp:4757 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." msgstr "출력이 기록될 파일(지정되지 않은 경우 입력 파일을 기반으로 합니다)." -#: src/libslic3r/PrintConfig.cpp:4593 +#: src/libslic3r/PrintConfig.cpp:4761 msgid "Single instance mode" msgstr "단일 인스턴스 모드" -#: src/libslic3r/PrintConfig.cpp:4594 +#: src/libslic3r/PrintConfig.cpp:4762 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -14805,11 +16809,11 @@ msgstr "" "나 기존 PrusaSlicer 창이 활성화됩니다. 응용 프로그램 기본 설정에서 " "\"single_instance\" 구성 값을 재정의합니다." -#: src/libslic3r/PrintConfig.cpp:4605 +#: src/libslic3r/PrintConfig.cpp:4767 msgid "Data directory" msgstr "데이터 디렉터리" -#: src/libslic3r/PrintConfig.cpp:4606 +#: src/libslic3r/PrintConfig.cpp:4768 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -14818,11 +16822,11 @@ msgstr "" "지정된 디렉터리에서 설정을 로드하고 저장합니다. 이 기능은 서로 다른 프로파일" "을 유지 관리하거나 네트워크 저장소의 구성을 포함하는 데 유용합니다." -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4771 msgid "Logging level" msgstr "로깅 수준" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4772 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -14832,11 +16836,11 @@ msgstr "" "적\n" "예를 들어. loglevel=2는 치명적, 오류 및 경고 수준 메시지를 기록합니다." -#: src/libslic3r/PrintConfig.cpp:4616 +#: src/libslic3r/PrintConfig.cpp:4778 msgid "Render with a software renderer" msgstr "소프트웨어 렌더러로 렌더링" -#: src/libslic3r/PrintConfig.cpp:4617 +#: src/libslic3r/PrintConfig.cpp:4779 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -14848,18 +16852,30 @@ msgstr "" msgid "Error with zip archive" msgstr "zip 아카이브와 오류가 발생 했습니다" -#: src/libslic3r/PrintObject.cpp:126 +#: src/libslic3r/PrintObject.cpp:152 msgid "Generating perimeters" msgstr "둘레 생성" -#: src/libslic3r/PrintObject.cpp:229 +#: src/libslic3r/PrintObject.cpp:257 msgid "Preparing infill" msgstr "채우기 준비" -#: src/libslic3r/PrintObject.cpp:403 +#: src/libslic3r/PrintObject.cpp:402 +msgid "making infill" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:449 +msgid "Searching support spots" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:474 msgid "Generating support material" msgstr "지원할 서포트 생성" +#: src/libslic3r/PrintObject.cpp:495 +msgid "Estimating curled extrusions" +msgstr "" + #: resources/data/hints.ini: [hint:Fuzzy skin] msgid "" "Fuzzy skin\n" @@ -15130,6 +17146,36 @@ msgid "" "F11 hotkey." msgstr "" +#: resources/data/hints.ini: [hint:Printables integration] +msgid "" +"Printables.com integration\n" +"Did you know that when you are browsing Printables.com, you can send 3D " +"model files to PrusaSlicer with a single click? Learn more in the " +"documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Cut tool] +msgid "" +"Cut tool\n" +"Did you know that you can cut a model at any angle and even create aligning " +"pins with the updated Cut tool? Learn more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Measurement tool] +msgid "" +"Measurement tool\n" +"Did you know that you can measure the distances between points, edges " +"and planes, the radius of a hole or the angle between edges or planes? Learn " +"more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Text tool] +msgid "" +"Text tool\n" +"Did you know that you can add custom text labels to your models or even use " +"the text as a modifier? Learn more in the documentation." +msgstr "" + #: ../src/common/debugrpt.cpp:586 msgid "" "\n" @@ -16325,6 +18371,11 @@ msgstr "왼쪽 정렬" msgid "Align Right" msgstr "오른쪽 정렬" +#: ../src/richtext/richtextsizepage.cpp:266 +#, fuzzy +msgid "Alignment" +msgstr "정렬(&A)" + #: ../src/generic/filectrlg.cpp:1197 ../src/common/fldlgcmn.cpp:107 #, c-format msgid "All files (%s)|%s" @@ -17650,10 +19701,6 @@ msgstr "Decorative" msgid "Default encoding" msgstr "기본 인코딩" -#: ../src/dfb/fontmgr.cpp:180 -msgid "Default font" -msgstr "기본 글꼴" - #: ../src/generic/prntdlgg.cpp:510 msgid "Default printer" msgstr "프린터 기본값" @@ -18029,11 +20076,6 @@ msgstr "인쇄하는 도중 오류 발생:" msgid "Error: " msgstr "오류:" -#. TRANSLATORS: Name of keyboard key -#: ../src/common/accelcmn.cpp:69 -msgid "Esc" -msgstr "" - #. TRANSLATORS: Name of keyboard key #: ../src/common/accelcmn.cpp:70 #, fuzzy @@ -18791,11 +20833,6 @@ msgstr "복사" msgid "Folio, 8 1/2 x 13 in" msgstr "Folio, 8 1/2 x 13 in" -#: ../src/richtext/richtextformatdlg.cpp:344 ../src/osx/carbon/fontdlg.cpp:287 -#: ../src/common/stockitem.cpp:194 -msgid "Font" -msgstr "Font" - #: ../src/richtext/richtextfontpage.cpp:221 msgid "Font &weight:" msgstr "글꼴 굵기(&W):" @@ -19936,11 +21973,6 @@ msgstr "'%s' 파일이 VFS에 이미 포함되어 있습니다." msgid "Menu" msgstr "메뉴" -#: ../src/common/msgout.cpp:124 -#, fuzzy -msgid "Message" -msgstr "알림 : %s" - #: ../src/univ/themes/metal.cpp:168 msgid "Metal theme" msgstr "메탈 테마" @@ -19975,10 +22007,6 @@ msgstr "" msgid "Modern" msgstr "Modern" -#: ../src/generic/filectrlg.cpp:427 -msgid "Modified" -msgstr "수정됨" - #: ../src/common/module.cpp:133 #, c-format msgid "Module \"%s\" initialization failed" @@ -20072,11 +22100,6 @@ msgstr "새 이름" msgid "Next page" msgstr "다음 페이지" -#: ../include/wx/msgdlg.h:277 ../src/common/stockitem.cpp:177 -#: ../src/motif/msgdlg.cpp:196 -msgid "No" -msgstr "아니오" - #. TRANSLATORS: System cursor name #: ../src/propgrid/advprops.cpp:1764 msgid "No Entry" @@ -20318,12 +22341,6 @@ msgstr "" msgid "Numbered outline" msgstr "Numbered 형태" -#: ../include/wx/msgdlg.h:278 ../src/richtext/richtextstyledlg.cpp:297 -#: ../src/common/stockitem.cpp:178 ../src/msw/msgdlg.cpp:454 -#: ../src/msw/msgdlg.cpp:747 ../src/gtk1/fontdlg.cpp:138 -msgid "OK" -msgstr "확인" - #: ../src/msw/ole/automtn.cpp:692 #, c-format msgid "OLE Automation error in %s: %s" @@ -20396,6 +22413,10 @@ msgstr "옵션에 '%s' 값이 필요합니다." msgid "Option '%s': '%s' cannot be converted to a date." msgstr "옵션 '%s': '%s' 를 날짜로 변환할 수 없습니다." +#: ../src/generic/prntdlgg.cpp:618 +msgid "Options" +msgstr "설정" + #: ../src/propgrid/advprops.cpp:1606 msgid "Orange" msgstr "" @@ -21203,10 +23224,6 @@ msgstr "일반 또는 기울임 모양새 선택하시오." msgid "Select underlining or no underlining." msgstr "밑줄/밑줄 없음 을 선택합니다." -#: ../src/motif/filedlg.cpp:220 -msgid "Selection" -msgstr "선택" - #: ../src/richtext/richtextliststylepage.cpp:187 #: ../src/richtext/richtextliststylepage.cpp:189 msgid "Selects the list level to edit." @@ -22117,10 +24134,6 @@ msgstr "VFS에서 파일 '%s' 를 삭제할 수 없습니다.(로딩되지 않 msgid "Turkish (ISO-8859-9)" msgstr "터키어 (ISO-8859-9)" -#: ../src/generic/filectrlg.cpp:426 -msgid "Type" -msgstr "타입" - #: ../src/richtext/richtextfontpage.cpp:151 #: ../src/richtext/richtextfontpage.cpp:153 msgid "Type a font name." @@ -22627,10 +24640,6 @@ msgstr "현재 정렬 방식 사용" msgid "Validation conflict" msgstr "충돌" -#: ../src/propgrid/manager.cpp:238 -msgid "Value" -msgstr "" - #: ../src/propgrid/props.cpp:386 ../src/propgrid/props.cpp:500 #, c-format msgid "Value must be %s or higher." @@ -22875,11 +24884,6 @@ msgstr "XPM: %d 행에서 이미지가 잘렸습니다!" msgid "Yellow" msgstr "" -#: ../include/wx/msgdlg.h:276 ../src/common/stockitem.cpp:206 -#: ../src/motif/msgdlg.cpp:196 -msgid "Yes" -msgstr "예" - #: ../src/osx/carbon/overlay.cpp:155 msgid "You cannot Clear an overlay that is not inited" msgstr "오버레이 지울수 없습니다. 초기화 되지 않았습니다." diff --git a/resources/localization/ko_KR/PrusaSlicer_ko_KR.po b/resources/localization/ko_KR/PrusaSlicer_ko_KR.po index 31206d78186..ff64f17eeef 100644 --- a/resources/localization/ko_KR/PrusaSlicer_ko_KR.po +++ b/resources/localization/ko_KR/PrusaSlicer_ko_KR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-01 16:30+0100\n" +"POT-Creation-Date: 2023-03-03 14:25+0100\n" "PO-Revision-Date: 2021-04-04 22:15+0900\n" "Last-Translator: \n" "Language-Team: \n" @@ -18,16 +18,16 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 2.4.2\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 +#: src/slic3r/GUI/AboutDialog.cpp:46 src/slic3r/GUI/AboutDialog.cpp:306 msgid "Portions copyright" msgstr "다른 저작권" -#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 +#: src/slic3r/GUI/AboutDialog.cpp:143 src/slic3r/GUI/AboutDialog.cpp:270 msgid "Copyright" msgstr "저작권" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:143 +#: src/slic3r/GUI/AboutDialog.cpp:145 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -35,26 +35,26 @@ msgstr "" "다음의 모든 프로그램 (라이브러리)의 라이센스 계약은 응용 프로그램 라이센스 계" "약의 일부입니다" -#: src/slic3r/GUI/AboutDialog.cpp:212 +#: src/slic3r/GUI/AboutDialog.cpp:214 #, c-format, boost-format msgid "About %s" msgstr "%s 정보" -#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 -#: src/slic3r/GUI/GUI_App.cpp:262 +#: src/slic3r/GUI/AboutDialog.cpp:245 src/slic3r/GUI/AboutDialog.cpp:370 +#: src/slic3r/GUI/GUI_App.cpp:271 msgid "Version" msgstr "버전" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:277 msgid "is licensed under the" msgstr "이 라이센스는" -#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:273 src/slic3r/GUI/GUI_App.cpp:277 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero 일반 공공 라이센스, 버전 3" -#: src/slic3r/GUI/AboutDialog.cpp:273 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -62,7 +62,7 @@ msgstr "" "프루사슬라이서는 알레산드로 라넬루치와 RepRap 커뮤니티 Slic3r를 기반으로합니" "다." -#: src/slic3r/GUI/AboutDialog.cpp:274 +#: src/slic3r/GUI/AboutDialog.cpp:275 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -72,7 +72,7 @@ msgstr "" "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " "numerous others. 한국어 번역 울산에테르, 밤송이직박구리 (2.2.0)" -#: src/slic3r/GUI/AboutDialog.cpp:310 +#: src/slic3r/GUI/AboutDialog.cpp:311 msgid "Copy Version Info" msgstr "버전 정보" @@ -99,54 +99,54 @@ msgid "" msgstr "" #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:162 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:204 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:188 msgid "Slicing complete" msgstr "슬라이스 완료" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:199 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183 #, boost-format msgid "Masked SLA file exported to %1%" msgstr "마스크 된 SLA 파일을 %1%로 내보냅니" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:286 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:279 msgid "Access violation" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:288 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:281 msgid "Illegal instruction" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:283 msgid "Divide by zero" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:292 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:285 msgid "Overflow" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:294 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:287 msgid "Underflow" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:297 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 msgid "Floating reserved operand" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:300 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:293 msgid "Stack overflow" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:659 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:726 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:652 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:719 msgid "Running post-processing scripts" msgstr "포스트 프로세싱(후처리) 스크립트 실행" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:690 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:710 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:683 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:703 msgid "Unknown error occured during exporting G-code." msgstr "G-코드를 내보내는 동안 알 수 없는 오류가 발생했습니다." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:695 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:688 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. Maybe the SD " @@ -157,7 +157,7 @@ msgstr "" "쓰기?\n" "오류 메시지: %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:698 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:691 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. There might be " @@ -168,7 +168,7 @@ msgstr "" "수 있습니다, 다시 내보내거나 다른 장치를 사용하여 보십시오. 손상된 출력 G 코" "드는 %1%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:701 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:694 #, boost-format msgid "" "Renaming of the G-code after copying to the selected destination folder has " @@ -177,7 +177,7 @@ msgstr "" "선택한 대상 폴더로 복사한 후 G 코드의 이름을 변경하지 못했습니다. 현재 경로" "는 %1%.tmp. 다시 내보내주세요." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:704 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:697 #, boost-format msgid "" "Copying of the temporary G-code has finished but the original code at %1% " @@ -186,7 +186,7 @@ msgstr "" "임시 G 코드 복사가 완료되었지만 복사 검사 중에 %1% 원래 코드를 열 수 없습니" "다. 출력 G 코드는 %2%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:707 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:700 #, boost-format msgid "" "Copying of the temporary G-code has finished but the exported code couldn't " @@ -195,16 +195,16 @@ msgstr "" "임시 G 코드 복사가 완료되었지만 복사 확인 중에 내보낸 코드를 열 수 없습니다. " "출력 G 코드는 %1%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:715 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:708 #, boost-format msgid "G-code file exported to %1%" msgstr "%1%로 내보낸 G 코드 파일" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:729 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:722 msgid "Copying of the temporary G-code to the output G-code failed" msgstr "임시 G코드 복사를 출력 G 코드로 복사하는 데 실패" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:751 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:738 #, boost-format msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" @@ -212,8 +212,9 @@ msgstr "" "오" #: src/slic3r/GUI/BedShapeDialog.cpp:31 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2765 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1576 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:241 src/slic3r/GUI/Plater.cpp:220 +#: src/slic3r/GUI/Tab.cpp:2697 msgid "Size" msgstr "크기" @@ -221,7 +222,9 @@ msgstr "크기" msgid "Origin" msgstr "원본" -#: src/slic3r/GUI/BedShapeDialog.cpp:33 src/libslic3r/PrintConfig.cpp:1020 +#: src/slic3r/GUI/BedShapeDialog.cpp:33 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1994 +#: src/libslic3r/PrintConfig.cpp:1109 msgid "Diameter" msgstr "필라멘트 직경" @@ -235,54 +238,62 @@ msgid "" "rectangle." msgstr "사각 전면 왼쪽 모서리에서 원저(0, 0) G-코드 좌표 거리입니다." -#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:262 -#: src/slic3r/GUI/ConfigWizard.cpp:1476 src/slic3r/GUI/ConfigWizard.cpp:1490 +#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:291 +#: src/slic3r/GUI/ConfigWizard.cpp:1796 src/slic3r/GUI/ConfigWizard.cpp:1832 +#: src/slic3r/GUI/ConfigWizard.cpp:1846 #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:100 -#: src/slic3r/GUI/GCodeViewer.cpp:3181 src/slic3r/GUI/GCodeViewer.cpp:3187 -#: src/slic3r/GUI/GCodeViewer.cpp:3195 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 src/slic3r/GUI/GCodeViewer.cpp:3455 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 #: src/slic3r/GUI/GUI_ObjectLayers.cpp:145 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 src/libslic3r/PrintConfig.cpp:263 -#: src/libslic3r/PrintConfig.cpp:290 src/libslic3r/PrintConfig.cpp:297 -#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:520 -#: src/libslic3r/PrintConfig.cpp:546 src/libslic3r/PrintConfig.cpp:621 -#: src/libslic3r/PrintConfig.cpp:629 src/libslic3r/PrintConfig.cpp:679 -#: src/libslic3r/PrintConfig.cpp:813 src/libslic3r/PrintConfig.cpp:824 -#: src/libslic3r/PrintConfig.cpp:842 src/libslic3r/PrintConfig.cpp:1023 -#: src/libslic3r/PrintConfig.cpp:1235 src/libslic3r/PrintConfig.cpp:1302 -#: src/libslic3r/PrintConfig.cpp:1312 src/libslic3r/PrintConfig.cpp:1611 -#: src/libslic3r/PrintConfig.cpp:1805 src/libslic3r/PrintConfig.cpp:1866 -#: src/libslic3r/PrintConfig.cpp:1884 src/libslic3r/PrintConfig.cpp:1902 -#: src/libslic3r/PrintConfig.cpp:1965 src/libslic3r/PrintConfig.cpp:1975 -#: src/libslic3r/PrintConfig.cpp:2097 src/libslic3r/PrintConfig.cpp:2106 -#: src/libslic3r/PrintConfig.cpp:2125 src/libslic3r/PrintConfig.cpp:2146 -#: src/libslic3r/PrintConfig.cpp:2158 src/libslic3r/PrintConfig.cpp:2166 -#: src/libslic3r/PrintConfig.cpp:2207 src/libslic3r/PrintConfig.cpp:2215 -#: src/libslic3r/PrintConfig.cpp:2225 src/libslic3r/PrintConfig.cpp:2233 -#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2303 -#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2603 -#: src/libslic3r/PrintConfig.cpp:2620 src/libslic3r/PrintConfig.cpp:2721 -#: src/libslic3r/PrintConfig.cpp:2730 src/libslic3r/PrintConfig.cpp:2780 -#: src/libslic3r/PrintConfig.cpp:2932 src/libslic3r/PrintConfig.cpp:3020 -#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3034 -#: src/libslic3r/PrintConfig.cpp:3048 src/libslic3r/PrintConfig.cpp:3072 -#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3092 -#: src/libslic3r/PrintConfig.cpp:3372 src/libslic3r/PrintConfig.cpp:3413 -#: src/libslic3r/PrintConfig.cpp:3573 src/libslic3r/PrintConfig.cpp:3582 -#: src/libslic3r/PrintConfig.cpp:3591 src/libslic3r/PrintConfig.cpp:3601 -#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3676 -#: src/libslic3r/PrintConfig.cpp:3688 src/libslic3r/PrintConfig.cpp:3708 -#: src/libslic3r/PrintConfig.cpp:3718 src/libslic3r/PrintConfig.cpp:3728 -#: src/libslic3r/PrintConfig.cpp:3746 src/libslic3r/PrintConfig.cpp:3761 -#: src/libslic3r/PrintConfig.cpp:3775 src/libslic3r/PrintConfig.cpp:3786 -#: src/libslic3r/PrintConfig.cpp:3799 src/libslic3r/PrintConfig.cpp:3844 -#: src/libslic3r/PrintConfig.cpp:3854 src/libslic3r/PrintConfig.cpp:3863 -#: src/libslic3r/PrintConfig.cpp:3873 src/libslic3r/PrintConfig.cpp:3889 -#: src/libslic3r/PrintConfig.cpp:3913 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 src/libslic3r/PrintConfig.cpp:279 +#: src/libslic3r/PrintConfig.cpp:303 src/libslic3r/PrintConfig.cpp:310 +#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:657 src/libslic3r/PrintConfig.cpp:724 +#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:782 +#: src/libslic3r/PrintConfig.cpp:902 src/libslic3r/PrintConfig.cpp:913 +#: src/libslic3r/PrintConfig.cpp:931 src/libslic3r/PrintConfig.cpp:1112 +#: src/libslic3r/PrintConfig.cpp:1295 src/libslic3r/PrintConfig.cpp:1359 +#: src/libslic3r/PrintConfig.cpp:1369 src/libslic3r/PrintConfig.cpp:1650 +#: src/libslic3r/PrintConfig.cpp:1842 src/libslic3r/PrintConfig.cpp:1903 +#: src/libslic3r/PrintConfig.cpp:1921 src/libslic3r/PrintConfig.cpp:1939 +#: src/libslic3r/PrintConfig.cpp:1995 src/libslic3r/PrintConfig.cpp:2005 +#: src/libslic3r/PrintConfig.cpp:2127 src/libslic3r/PrintConfig.cpp:2136 +#: src/libslic3r/PrintConfig.cpp:2155 src/libslic3r/PrintConfig.cpp:2176 +#: src/libslic3r/PrintConfig.cpp:2188 src/libslic3r/PrintConfig.cpp:2196 +#: src/libslic3r/PrintConfig.cpp:2237 src/libslic3r/PrintConfig.cpp:2245 +#: src/libslic3r/PrintConfig.cpp:2255 src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2271 src/libslic3r/PrintConfig.cpp:2336 +#: src/libslic3r/PrintConfig.cpp:2565 src/libslic3r/PrintConfig.cpp:2632 +#: src/libslic3r/PrintConfig.cpp:2647 src/libslic3r/PrintConfig.cpp:2746 +#: src/libslic3r/PrintConfig.cpp:2755 src/libslic3r/PrintConfig.cpp:2801 +#: src/libslic3r/PrintConfig.cpp:2886 src/libslic3r/PrintConfig.cpp:2896 +#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3108 +#: src/libslic3r/PrintConfig.cpp:3115 src/libslic3r/PrintConfig.cpp:3122 +#: src/libslic3r/PrintConfig.cpp:3136 src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3170 src/libslic3r/PrintConfig.cpp:3180 +#: src/libslic3r/PrintConfig.cpp:3330 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3391 src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3444 src/libslic3r/PrintConfig.cpp:3456 +#: src/libslic3r/PrintConfig.cpp:3476 src/libslic3r/PrintConfig.cpp:3491 +#: src/libslic3r/PrintConfig.cpp:3501 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3681 src/libslic3r/PrintConfig.cpp:3878 +#: src/libslic3r/PrintConfig.cpp:3893 src/libslic3r/PrintConfig.cpp:3907 +#: src/libslic3r/PrintConfig.cpp:3918 src/libslic3r/PrintConfig.cpp:3931 +#: src/libslic3r/PrintConfig.cpp:3976 src/libslic3r/PrintConfig.cpp:3986 +#: src/libslic3r/PrintConfig.cpp:3995 src/libslic3r/PrintConfig.cpp:4005 +#: src/libslic3r/PrintConfig.cpp:4021 src/libslic3r/PrintConfig.cpp:4045 +#: src/libslic3r/PrintConfig.cpp:4072 msgid "mm" msgstr "mm" @@ -300,13 +311,13 @@ msgstr "직사각형" msgid "Circular" msgstr "원형" -#: src/slic3r/GUI/BedShapeDialog.cpp:81 src/slic3r/GUI/GUI_Preview.cpp:252 -#: src/libslic3r/ExtrusionEntity.cpp:343 src/libslic3r/ExtrusionEntity.cpp:378 +#: src/slic3r/GUI/BedShapeDialog.cpp:81 msgid "Custom" msgstr "사용자 정의" #: src/slic3r/GUI/BedShapeDialog.cpp:104 src/slic3r/GUI/BedShapeDialog.cpp:179 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1701 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1565 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1798 msgid "Shape" msgstr "모양" @@ -314,8 +325,8 @@ msgstr "모양" msgid "Load shape from STL..." msgstr "STL파일 로드." -#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2147 +#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3914 +#: src/slic3r/GUI/MainFrame.cpp:2240 msgid "Settings" msgstr "설정" @@ -328,7 +339,7 @@ msgid "Load..." msgstr "불러오기..." #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/Tab.cpp:3973 msgid "Remove" msgstr "삭제" @@ -340,108 +351,175 @@ msgstr "찾을 수 없습니다:" msgid "Model" msgstr "모델" -#: src/slic3r/GUI/BedShapeDialog.cpp:508 +#: src/slic3r/GUI/BedShapeDialog.cpp:506 msgid "Choose an STL file to import bed shape from:" msgstr "가져올 베드 모양을(STL 파일) 선택합니다:" -#: src/slic3r/GUI/BedShapeDialog.cpp:514 src/slic3r/GUI/BedShapeDialog.cpp:562 -#: src/slic3r/GUI/BedShapeDialog.cpp:584 +#: src/slic3r/GUI/BedShapeDialog.cpp:512 src/slic3r/GUI/BedShapeDialog.cpp:560 +#: src/slic3r/GUI/BedShapeDialog.cpp:582 msgid "Invalid file format." msgstr "잘못된 파일 형식." -#: src/slic3r/GUI/BedShapeDialog.cpp:525 +#: src/slic3r/GUI/BedShapeDialog.cpp:523 msgid "Error! Invalid model" msgstr "오류! 잘못된 모델" -#: src/slic3r/GUI/BedShapeDialog.cpp:533 +#: src/slic3r/GUI/BedShapeDialog.cpp:531 msgid "The selected file contains no geometry." msgstr "선택한 파일에 없는 형상이 있습니다." -#: src/slic3r/GUI/BedShapeDialog.cpp:537 +#: src/slic3r/GUI/BedShapeDialog.cpp:535 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "" "선택한 파일은 여러개의 분리 된 영역을 포함 되어 있어 지원 되지 않습니다." -#: src/slic3r/GUI/BedShapeDialog.cpp:552 +#: src/slic3r/GUI/BedShapeDialog.cpp:550 msgid "Choose a file to import bed texture from (PNG/SVG):" msgstr "(PNG / SVG)에서 침대 텍스처를 가져올 파일을 선택합니다." -#: src/slic3r/GUI/BedShapeDialog.cpp:574 +#: src/slic3r/GUI/BedShapeDialog.cpp:572 msgid "Choose an STL file to import bed model from:" msgstr "다음에서 베드 모델을 가져올 STL 파일을 선택합니다:" -#: src/slic3r/GUI/BedShapeDialog.hpp:95 src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/BedShapeDialog.hpp:96 src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape" msgstr "침대(bed) 모양" -#: src/slic3r/GUI/BonjourDialog.cpp:55 +#: src/slic3r/GUI/BonjourDialog.cpp:58 msgid "Network lookup" msgstr "네트워크 조회" -#: src/slic3r/GUI/BonjourDialog.cpp:72 +#: src/slic3r/GUI/BonjourDialog.cpp:75 src/slic3r/GUI/BonjourDialog.cpp:253 msgid "Address" msgstr "주소" -#: src/slic3r/GUI/BonjourDialog.cpp:73 +#: src/slic3r/GUI/BonjourDialog.cpp:76 msgid "Hostname" msgstr "호스트 이름" -#: src/slic3r/GUI/BonjourDialog.cpp:74 +#: src/slic3r/GUI/BonjourDialog.cpp:77 msgid "Service name" msgstr "서비스 이름" -#: src/slic3r/GUI/BonjourDialog.cpp:76 +#: src/slic3r/GUI/BonjourDialog.cpp:79 msgid "OctoPrint version" msgstr "옥토프린트 버전" -#: src/slic3r/GUI/BonjourDialog.cpp:224 +#: src/slic3r/GUI/BonjourDialog.cpp:227 msgid "Searching for devices" msgstr "장치 검색" -#: src/slic3r/GUI/BonjourDialog.cpp:231 +#: src/slic3r/GUI/BonjourDialog.cpp:234 msgid "Finished" msgstr "완료" -#: src/slic3r/GUI/ButtonsDescription.cpp:42 +#: src/slic3r/GUI/BonjourDialog.cpp:240 +msgid "Multiple resolved IP addresses" +msgstr "" + +#: src/slic3r/GUI/BonjourDialog.cpp:249 +#, boost-format +msgid "" +"There are several IP addresses resolving to hostname %1%.\n" +"Please select one that should be used." +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:21 +msgid "Palette 1 (default)" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:22 +msgid "Palette 2" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:23 +msgid "Palette 3" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:24 +msgid "Palette 4" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:25 +msgid "Palette 5" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:26 +msgid "Palette 6" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:27 +msgid "Palette 7" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:28 +msgid "Palette 8" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:112 msgid "Revert color to default" msgstr "" -#: src/slic3r/GUI/ButtonsDescription.cpp:57 +#: src/slic3r/GUI/ButtonsDescription.cpp:127 msgid "Value is the same as the system value" msgstr "이 값은 시스템 값과 같습니다" -#: src/slic3r/GUI/ButtonsDescription.cpp:58 +#: src/slic3r/GUI/ButtonsDescription.cpp:128 msgid "" "Value was changed and is not equal to the system value or the last saved " "preset" msgstr "값이 변경 되었고, 시스템 값 또는 마지막으로 저장된 설정값과 다릅니다." -#: src/slic3r/GUI/ButtonsDescription.cpp:62 +#: src/slic3r/GUI/ButtonsDescription.cpp:155 +msgid "Default palette for mode markers" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2422 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Simple" +msgstr "단순" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2424 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgctxt "Mode" +msgid "Advanced" +msgstr "고급" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2425 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Expert" +msgstr "전문가" + +#: src/slic3r/GUI/ButtonsDescription.cpp:182 +msgid "Revert color" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:200 msgid "Buttons And Text Colors Description" msgstr "버튼 및 글자 색상 설명" -#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/ConfigManipulation.cpp:50 msgid "" "Layer height is not valid.\n" "\n" "The layer height will be reset to 0.01." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:50 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1449 -#: src/libslic3r/PrintConfig.cpp:286 +#: src/slic3r/GUI/ConfigManipulation.cpp:51 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1394 +#: src/libslic3r/PrintConfig.cpp:299 msgid "Layer height" msgstr "레이어 높이" -#: src/slic3r/GUI/ConfigManipulation.cpp:61 +#: src/slic3r/GUI/ConfigManipulation.cpp:62 msgid "" "First layer height is not valid.\n" "\n" "The first layer height will be reset to 0.01." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:62 src/libslic3r/PrintConfig.cpp:1231 +#: src/slic3r/GUI/ConfigManipulation.cpp:63 src/libslic3r/PrintConfig.cpp:1291 msgid "First layer height" msgstr "첫 레이어 높이" @@ -452,7 +530,6 @@ msgid "" "- no top solid layers\n" "- 0% fill density\n" "- no support material\n" -"- Ensure vertical shell thickness enabled\n" "- Detect thin walls disabled" msgstr "" "나선형 꽃병 모드는 다음을 필요로 합니다.\n" @@ -460,51 +537,49 @@ msgstr "" "- 상단 솔리드 레이어 없음\n" "- 0% f 밀도\n" "- 지원 자료 없음\n" -"- 수직 쉘 두께가 활성화되었는지 확인\n" "- 얇은 벽이 비활성화 감지" -#: src/slic3r/GUI/ConfigManipulation.cpp:90 +#: src/slic3r/GUI/ConfigManipulation.cpp:89 msgid "Shall I adjust those settings in order to enable Spiral Vase?" msgstr "나선형 꽃병을 활성화하기 위해 이러한 설정을 조정해야 합니까?" -#: src/slic3r/GUI/ConfigManipulation.cpp:91 +#: src/slic3r/GUI/ConfigManipulation.cpp:90 msgid "Spiral Vase" msgstr "나선형 꽃병" -#: src/slic3r/GUI/ConfigManipulation.cpp:121 +#: src/slic3r/GUI/ConfigManipulation.cpp:123 msgid "" -"The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool " -"change.\n" -"(both support_material_extruder and support_material_interface_extruder need " -"to be set to 0)." +"For the Wipe Tower to work with the soluble supports, the support layers\n" +"need to be synchronized with the object layers." msgstr "" -"와이프 타워는 현재 공구 교체를 트리거하지 않고 현재의 압출기로 인쇄 하는 경우" -"에만 비가용성 서포트를 지원 합니다. (support_material_extruder과 " -"support_material_interface_extruder 모두 0으로 설정 해야 합니다.)" - -#: src/slic3r/GUI/ConfigManipulation.cpp:125 -msgid "Shall I adjust those settings in order to enable the Wipe Tower?" -msgstr "와이프 타워를 활성화하기 위해 이러한 설정을 조정해야 합니까?" +"와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 오브젝트 레이" +"어와 동기화 해야 합니다." #: src/slic3r/GUI/ConfigManipulation.cpp:126 -#: src/slic3r/GUI/ConfigManipulation.cpp:146 +msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" +msgstr "지우기 타워를 활성화하기 위해 지원 레이어를 동기화해야 합니까?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:127 +#: src/slic3r/GUI/ConfigManipulation.cpp:145 msgid "Wipe Tower" msgstr "와이프 타워 - 버려진 필라멘트 조절" -#: src/slic3r/GUI/ConfigManipulation.cpp:142 +#: src/slic3r/GUI/ConfigManipulation.cpp:140 src/libslic3r/Print.cpp:672 msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers\n" -"need to be synchronized with the object layers." +"The Wipe Tower currently supports the non-soluble supports only if they are " +"printed with the current extruder without triggering a tool change. (both " +"support_material_extruder and support_material_interface_extruder need to be " +"set to 0)." msgstr "" -"와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 오브젝트 레이" -"어와 동기화 해야 합니다." +"와이프 타워는 현재 공구 교체를 트리거하지 않고 현재의 압출기로 인쇄 하는 경우" +"에만 비가용성 서포트를 지원 합니다. (support_material_extruder과 " +"support_material_interface_extruder 모두 0으로 설정 해야 합니다.)" -#: src/slic3r/GUI/ConfigManipulation.cpp:145 -msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" -msgstr "지우기 타워를 활성화하기 위해 지원 레이어를 동기화해야 합니까?" +#: src/slic3r/GUI/ConfigManipulation.cpp:144 +msgid "Shall I adjust those settings in order to enable the Wipe Tower?" +msgstr "와이프 타워를 활성화하기 위해 이러한 설정을 조정해야 합니까?" -#: src/slic3r/GUI/ConfigManipulation.cpp:164 +#: src/slic3r/GUI/ConfigManipulation.cpp:166 msgid "" "Supports work better, if the following feature is enabled:\n" "- Detect bridging perimeters" @@ -512,184 +587,188 @@ msgstr "" "다음 기능이 활성화된 경우 더 나은 작업을 지원합니다.\n" "- 브리징 경계 감지" -#: src/slic3r/GUI/ConfigManipulation.cpp:167 +#: src/slic3r/GUI/ConfigManipulation.cpp:169 msgid "Shall I adjust those settings for supports?" msgstr "지원 설정을 조정해야 합니까?" -#: src/slic3r/GUI/ConfigManipulation.cpp:168 +#: src/slic3r/GUI/ConfigManipulation.cpp:170 msgid "Support Generator" msgstr "지원 발전기" -#: src/slic3r/GUI/ConfigManipulation.cpp:195 +#: src/slic3r/GUI/ConfigManipulation.cpp:194 #, boost-format msgid "The %1% infill pattern is not supposed to work at 100%% density." msgstr "%1% 채우기 패턴은 100%% 밀도로 작동하지 않아야합니다." -#: src/slic3r/GUI/ConfigManipulation.cpp:198 +#: src/slic3r/GUI/ConfigManipulation.cpp:196 msgid "Shall I switch to rectilinear fill pattern?" msgstr "직선 채우기 패턴으로 전환해야 합니까?" -#: src/slic3r/GUI/ConfigManipulation.cpp:199 +#: src/slic3r/GUI/ConfigManipulation.cpp:197 #: src/slic3r/GUI/GUI_Factories.cpp:55 src/slic3r/GUI/GUI_Factories.cpp:128 -#: src/slic3r/GUI/Plater.cpp:460 src/slic3r/GUI/Tab.cpp:1503 -#: src/slic3r/GUI/Tab.cpp:1505 src/libslic3r/PrintConfig.cpp:475 -#: src/libslic3r/PrintConfig.cpp:716 src/libslic3r/PrintConfig.cpp:743 -#: src/libslic3r/PrintConfig.cpp:1098 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1149 src/libslic3r/PrintConfig.cpp:1398 -#: src/libslic3r/PrintConfig.cpp:1427 src/libslic3r/PrintConfig.cpp:1496 -#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1535 -#: src/libslic3r/PrintConfig.cpp:2364 src/libslic3r/PrintConfig.cpp:2381 +#: src/slic3r/GUI/Plater.cpp:468 src/slic3r/GUI/Tab.cpp:1450 +#: src/slic3r/GUI/Tab.cpp:1452 src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:811 src/libslic3r/PrintConfig.cpp:831 +#: src/libslic3r/PrintConfig.cpp:1187 src/libslic3r/PrintConfig.cpp:1200 +#: src/libslic3r/PrintConfig.cpp:1225 src/libslic3r/PrintConfig.cpp:1444 +#: src/libslic3r/PrintConfig.cpp:1473 src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1557 src/libslic3r/PrintConfig.cpp:1576 +#: src/libslic3r/PrintConfig.cpp:2395 src/libslic3r/PrintConfig.cpp:2412 msgid "Infill" msgstr "채움(infill)" -#: src/slic3r/GUI/ConfigManipulation.cpp:337 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Head penetration should not be greater than the head width." msgstr "머리 침투가 머리 너비보다 크지 않아야 합니다." -#: src/slic3r/GUI/ConfigManipulation.cpp:339 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid Head penetration" msgstr "잘못된 헤드 관통" -#: src/slic3r/GUI/ConfigManipulation.cpp:350 +#: src/slic3r/GUI/ConfigManipulation.cpp:362 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "핀헤드 지름은 기둥 지름 보다 작아야 합니다." -#: src/slic3r/GUI/ConfigManipulation.cpp:352 +#: src/slic3r/GUI/ConfigManipulation.cpp:364 msgid "Invalid pinhead diameter" msgstr "잘못된 핀 헤드 지름" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20 msgid "Upgrade" msgstr "업그레이드" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22 msgid "Downgrade" msgstr "다운그레이드" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 msgid "Before roll back" msgstr "롤백 하기 전에" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:340 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:26 src/libslic3r/PrintConfig.cpp:353 msgid "User" msgstr "사용자" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:329 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:29 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1135 msgid "Unknown" msgstr "알 수 없음" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 msgid "Active" msgstr "활성" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 msgid "PrusaSlicer version" msgstr "프라사슬라이서 버전" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 src/libslic3r/Preset.cpp:1341 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 src/libslic3r/Preset.cpp:1480 msgid "print" msgstr "출력" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:65 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 msgid "filaments" msgstr "필 라 멘 트" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 src/libslic3r/Preset.cpp:1343 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:67 src/libslic3r/Preset.cpp:1482 msgid "SLA print" msgstr "SLA 프린트" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69 -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/slic3r/GUI/GUI.cpp:340 -#: src/slic3r/GUI/Plater.cpp:821 src/libslic3r/Preset.cpp:1344 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/slic3r/GUI/GUI.cpp:331 +#: src/slic3r/GUI/Plater.cpp:851 src/libslic3r/Preset.cpp:1483 msgid "SLA material" msgstr "SLA 재료" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:71 src/libslic3r/Preset.cpp:1345 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 src/libslic3r/Preset.cpp:1484 msgid "printer" msgstr "프린터" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 src/slic3r/GUI/Tab.cpp:1366 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 src/slic3r/GUI/Tab.cpp:1311 msgid "vendor" msgstr "벤더" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 msgid "version" msgstr "버전" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:76 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 msgid "min PrusaSlicer version" msgstr "이전 프라사슬라이스 버전" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:77 msgid "max PrusaSlicer version" msgstr "최신 프라사슬라이저 버전" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "model" msgstr "모델" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "variants" msgstr "변종" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:93 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:92 #, c-format, boost-format msgid "Incompatible with this %s" msgstr "이 %s 호환되지 않습니다." -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:96 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:95 msgid "Activate" msgstr "활성화" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:123 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:122 msgid "Configuration Snapshots" msgstr "구성 스냅샷" -#: src/slic3r/GUI/ConfigWizard.cpp:262 +#: src/slic3r/GUI/ConfigWizard.cpp:291 msgid "nozzle" msgstr "노즐" -#: src/slic3r/GUI/ConfigWizard.cpp:266 +#: src/slic3r/GUI/ConfigWizard.cpp:295 msgid "Alternate nozzles:" msgstr "대체 노즐:" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "All standard" msgstr "전부 기본값" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "Standard" msgstr "표준" -#: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3833 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 +#: src/slic3r/GUI/ConfigWizard.cpp:360 src/slic3r/GUI/ConfigWizard.cpp:681 +#: src/slic3r/GUI/FileArchiveDialog.cpp:261 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 src/slic3r/GUI/Preferences.cpp:550 +#: src/slic3r/GUI/Tab.cpp:4058 src/slic3r/GUI/UnsavedChangesDialog.cpp:1161 msgid "All" msgstr "모두" -#: src/slic3r/GUI/ConfigWizard.cpp:332 src/slic3r/GUI/ConfigWizard.cpp:652 -#: src/slic3r/GUI/DoubleSlider.cpp:2030 src/slic3r/GUI/Plater.cpp:432 -#: src/slic3r/GUI/Plater.cpp:579 src/slic3r/GUI/Preferences.cpp:436 -#: src/libslic3r/PrintConfig.cpp:1291 +#: src/slic3r/GUI/ConfigWizard.cpp:361 src/slic3r/GUI/ConfigWizard.cpp:682 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 +#: src/slic3r/GUI/FileArchiveDialog.cpp:265 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1984 src/slic3r/GUI/Plater.cpp:439 +#: src/slic3r/GUI/Plater.cpp:594 src/slic3r/GUI/Preferences.cpp:552 +#: src/libslic3r/PrintConfig.cpp:1347 msgid "None" msgstr "없음" -#: src/slic3r/GUI/ConfigWizard.cpp:484 +#: src/slic3r/GUI/ConfigWizard.cpp:513 #, c-format, boost-format msgid "Welcome to the %s Configuration Assistant" msgstr "%s 구성 도우미에 오신 것을 환영 합니다" -#: src/slic3r/GUI/ConfigWizard.cpp:486 +#: src/slic3r/GUI/ConfigWizard.cpp:515 #, c-format, boost-format msgid "Welcome to the %s Configuration Wizard" msgstr "%s 구성 마법사에 오신 것을 환영 합니다" -#: src/slic3r/GUI/ConfigWizard.cpp:488 +#: src/slic3r/GUI/ConfigWizard.cpp:517 msgid "Welcome" msgstr "환영합니다" -#: src/slic3r/GUI/ConfigWizard.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:519 #, c-format, boost-format msgid "" "Hello, welcome to %s! This %s helps you with the initial configuration; just " @@ -698,104 +777,133 @@ msgstr "" "안녕하세요 ,%s에 오신 것을 환영 합니다! 이 %s는 초기 구성에 도움이 됩니다. " "몇 가지 설정만으로 인쇄 준비가 될 것입니다." -#: src/slic3r/GUI/ConfigWizard.cpp:495 +#: src/slic3r/GUI/ConfigWizard.cpp:524 msgid "Remove user profiles (a snapshot will be taken beforehand)" msgstr "사용자 프로필 제거(스냅샷이 사전에 촬영됨)" -#: src/slic3r/GUI/ConfigWizard.cpp:498 +#: src/slic3r/GUI/ConfigWizard.cpp:527 msgid "" "Perform desktop integration (Sets this binary to be searchable by the " "system)." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:550 +#: src/slic3r/GUI/ConfigWizard.cpp:579 #, c-format, boost-format msgid "%s Family" msgstr "%s 패밀리" -#: src/slic3r/GUI/ConfigWizard.cpp:640 +#: src/slic3r/GUI/ConfigWizard.cpp:670 msgid "Printer:" msgstr "프린터:" -#: src/slic3r/GUI/ConfigWizard.cpp:642 +#: src/slic3r/GUI/ConfigWizard.cpp:672 msgid "Vendor:" msgstr "벤더:" -#: src/slic3r/GUI/ConfigWizard.cpp:643 +#: src/slic3r/GUI/ConfigWizard.cpp:673 msgid "Profile:" msgstr "프로필:" -#: src/slic3r/GUI/ConfigWizard.cpp:720 src/slic3r/GUI/ConfigWizard.cpp:892 -#: src/slic3r/GUI/ConfigWizard.cpp:952 src/slic3r/GUI/ConfigWizard.cpp:1088 +#: src/slic3r/GUI/ConfigWizard.cpp:750 src/slic3r/GUI/ConfigWizard.cpp:938 +#: src/slic3r/GUI/ConfigWizard.cpp:1024 src/slic3r/GUI/ConfigWizard.cpp:1163 msgid "(All)" msgstr "(All)" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:754 src/slic3r/GUI/ConfigWizard.cpp:1165 +msgid "(Templates)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:789 #, boost-format msgid "" -"%1% marked with * are not compatible with some installed " -"printers." +"%1% visible for (\"Template\") printer are universal profiles " +"available for all printers. These might not be compatible with your printer." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:752 src/slic3r/GUI/ConfigWizard.cpp:2043 -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filaments" msgstr "필 라 멘 트" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 msgid "SLA materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:755 +#: src/slic3r/GUI/ConfigWizard.cpp:791 +#, boost-format +msgid "" +"%1% marked with * are not compatible with some installed " +"printers." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:794 #, boost-format msgid "All installed printers are compatible with the selected %1%." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/libslic3r/Preset.cpp:1342 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/libslic3r/Preset.cpp:1481 msgid "filament" msgstr "필라멘트 설정을 선택" -#: src/slic3r/GUI/ConfigWizard.cpp:778 +#: src/slic3r/GUI/ConfigWizard.cpp:818 msgid "" "Only the following installed printers are compatible with the selected " "filaments" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:779 +#: src/slic3r/GUI/ConfigWizard.cpp:819 msgid "" "Only the following installed printers are compatible with the selected SLA " "materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1213 +msgid "" +"You have selected template filament. Please note that these filaments are " +"available for all printers but are NOT certain to be compatible with your " +"printer. Do you still wish to have this filament selected?\n" +"(This message won't be displayed again.)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1214 src/slic3r/GUI/ConfigWizard.cpp:2720 +#: src/slic3r/GUI/ConfigWizard.cpp:2860 src/slic3r/GUI/DoubleSlider.cpp:2591 +#: src/slic3r/GUI/DoubleSlider.cpp:2612 src/slic3r/GUI/GUI.cpp:245 +#: src/slic3r/GUI/GUI_App.cpp:3458 src/slic3r/GUI/UpdateDialogs.cpp:204 +#: src/slic3r/GUI/UpdateDialogs.cpp:212 src/slic3r/GUI/UpdateDialogs.cpp:217 +#: src/slic3r/GUI/UpdateDialogs.cpp:222 src/slic3r/GUI/UpdateDialogs.cpp:229 +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +msgid "Notice" +msgstr "공지" + +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer Setup" msgstr "사용자 지정 프린터 설정" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer" msgstr "사용자 지정 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:1177 +#: src/slic3r/GUI/ConfigWizard.cpp:1264 msgid "Define a custom printer profile" msgstr "사용자 정의 프린터 프로필" -#: src/slic3r/GUI/ConfigWizard.cpp:1179 +#: src/slic3r/GUI/ConfigWizard.cpp:1265 msgid "Custom profile name:" msgstr "사용자 정의 프로필 명칭:" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Automatic updates" msgstr "자동 업데이트" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Updates" msgstr "업데이트" -#: src/slic3r/GUI/ConfigWizard.cpp:1214 +#: src/slic3r/GUI/ConfigWizard.cpp:1290 msgid "Check for application updates" msgstr "응용 프로그램 업데이트 확인" -#: src/slic3r/GUI/ConfigWizard.cpp:1218 +#: src/slic3r/GUI/ConfigWizard.cpp:1294 #, c-format, boost-format msgid "" "If enabled, %s checks for new application versions online. When a new " @@ -807,11 +915,11 @@ msgstr "" "되면, 다음 응용 프로그램 시작시 알림이 표시됩니다 (프로그램 사용 중에는 절대" "로 사용하지 마십시오).이것은 단순한 알림 일뿐 자동으로 설치가 되지 않습니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1224 src/slic3r/GUI/Preferences.cpp:175 +#: src/slic3r/GUI/ConfigWizard.cpp:1300 src/slic3r/GUI/Preferences.cpp:306 msgid "Update built-in Presets automatically" msgstr "기본 제공 사전 설정 자동 업데이트" -#: src/slic3r/GUI/ConfigWizard.cpp:1228 +#: src/slic3r/GUI/ConfigWizard.cpp:1304 #, c-format, boost-format msgid "" "If enabled, %s downloads updates of built-in system presets in the " @@ -823,7 +931,7 @@ msgstr "" "한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 사전 설정 버전을 사용" "할 수 있게되면 응용 프로그램 시작시 제공됩니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1231 +#: src/slic3r/GUI/ConfigWizard.cpp:1307 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." @@ -831,24 +939,68 @@ msgstr "" "업데이트는 사용자의 동의를 받아야 하고, 지정된 이전 설정을 덮어 쓰지 않습니" "다." -#: src/slic3r/GUI/ConfigWizard.cpp:1236 +#: src/slic3r/GUI/ConfigWizard.cpp:1312 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." msgstr "" "또한 업데이트가 적용되기 전에 전체 구성의 백업 구성(스냅샷)이 생성됩니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1243 src/slic3r/GUI/GUI_Factories.cpp:726 -#: src/slic3r/GUI/Plater.cpp:3582 +#: src/slic3r/GUI/ConfigWizard.cpp:1361 src/slic3r/GUI/Preferences.cpp:1076 +msgid "Download path" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1366 src/slic3r/GUI/FirmwareDialog.cpp:815 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:300 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +msgid "Browse" +msgstr "찾아보기" + +#: src/slic3r/GUI/ConfigWizard.cpp:1371 +msgid "Choose folder:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads from URL" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1417 +msgid "Allow built-in downloader" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1424 +#, c-format, boost-format +msgid "" +"If enabled, %s registers to start on custom URL on www.printables.com. You " +"will be able to use button with %s logo to open models in this %s. The model " +"will be downloaded into folder you choose bellow." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1431 +msgid "" +"On Linux systems the process of registration also creates desktop " +"integration files for this version of application." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1458 +msgid "Chosen directory for downloads does not Exists." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1545 src/slic3r/GUI/GUI_Factories.cpp:810 +#: src/slic3r/GUI/Plater.cpp:3732 msgid "Reload from disk" msgstr "디스크에서 재장전" -#: src/slic3r/GUI/ConfigWizard.cpp:1246 +#: src/slic3r/GUI/ConfigWizard.cpp:1548 msgid "" "Export full pathnames of models and parts sources into 3mf and amf files" msgstr "모델 및 부품 소스의 전체 경로 이름을 3mf 및 amf 파일로 내보내기" -#: src/slic3r/GUI/ConfigWizard.cpp:1250 +#: src/slic3r/GUI/ConfigWizard.cpp:1552 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked.\n" @@ -860,23 +1012,23 @@ msgstr "" "활성화되지 않으면 디스크 명령의 다시 로드는 열린 파일 대화 상자를 사용하여 " "각 파일을 선택하라는 요청입니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1259 +#: src/slic3r/GUI/ConfigWizard.cpp:1561 msgid "Files association" msgstr "파일 연결" -#: src/slic3r/GUI/ConfigWizard.cpp:1261 src/slic3r/GUI/Preferences.cpp:157 +#: src/slic3r/GUI/ConfigWizard.cpp:1563 src/slic3r/GUI/Preferences.cpp:292 msgid "Associate .3mf files to PrusaSlicer" msgstr "프라사슬라이서에 .3mf 파일 연결" -#: src/slic3r/GUI/ConfigWizard.cpp:1262 src/slic3r/GUI/Preferences.cpp:164 +#: src/slic3r/GUI/ConfigWizard.cpp:1564 src/slic3r/GUI/Preferences.cpp:297 msgid "Associate .stl files to PrusaSlicer" msgstr "PrusaSlicer에 .stl 파일을 연결" -#: src/slic3r/GUI/ConfigWizard.cpp:1272 +#: src/slic3r/GUI/ConfigWizard.cpp:1574 msgid "View mode" msgstr "보기 모드" -#: src/slic3r/GUI/ConfigWizard.cpp:1274 +#: src/slic3r/GUI/ConfigWizard.cpp:1576 msgid "" "PrusaSlicer's user interfaces comes in three variants:\n" "Simple, Advanced, and Expert.\n" @@ -890,82 +1042,96 @@ msgstr "" "른 두 가지는 점진적으로 보다 정교한 미세 조정을 제공하며, 각각 고급 및 전문" "가 사용자에게 적합합니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1279 +#: src/slic3r/GUI/ConfigWizard.cpp:1581 msgid "Simple mode" msgstr "간단한 모드" -#: src/slic3r/GUI/ConfigWizard.cpp:1280 +#: src/slic3r/GUI/ConfigWizard.cpp:1582 msgid "Advanced mode" msgstr "고급 모드" -#: src/slic3r/GUI/ConfigWizard.cpp:1281 +#: src/slic3r/GUI/ConfigWizard.cpp:1583 msgid "Expert mode" msgstr "전문가 모드" -#: src/slic3r/GUI/ConfigWizard.cpp:1287 +#: src/slic3r/GUI/ConfigWizard.cpp:1596 msgid "The size of the object can be specified in inches" msgstr "개체의 크기를 인치 단위로 지정할 수 있습니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1288 +#: src/slic3r/GUI/ConfigWizard.cpp:1597 msgid "Use inches" msgstr "인치 사용" -#: src/slic3r/GUI/ConfigWizard.cpp:1322 +#: src/slic3r/GUI/ConfigWizard.cpp:1617 msgid "Other Vendors" msgstr "기타 공급업체" -#: src/slic3r/GUI/ConfigWizard.cpp:1326 +#: src/slic3r/GUI/ConfigWizard.cpp:1621 #, c-format, boost-format msgid "Pick another vendor supported by %s" msgstr "%s 지원하는 다른 공급업체 선택" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 msgid "Firmware Type" msgstr "펌웨어 종류" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2366 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 src/slic3r/GUI/Tab.cpp:2354 msgid "Firmware" msgstr "펌웨어 철회" -#: src/slic3r/GUI/ConfigWizard.cpp:1361 +#: src/slic3r/GUI/ConfigWizard.cpp:1658 msgid "Choose the type of firmware used by your printer." msgstr "프린터에 업로드 할 펌웨어를 선택하세요." -#: src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/ConfigWizard.cpp:1707 src/slic3r/GUI/ConfigWizard.cpp:1778 +#: src/slic3r/GUI/ConfigWizard.cpp:1783 src/slic3r/GUI/ConfigWizard.cpp:1788 +#: src/slic3r/GUI/Field.cpp:258 src/slic3r/GUI/Field.cpp:328 +#: src/slic3r/GUI/Field.cpp:1585 src/slic3r/GUI/GUI_ObjectLayers.cpp:435 +msgid "Invalid numeric input." +msgstr "잘못된 숫자 입력." + +#: src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape and Size" msgstr "침대 모양 및 크기" -#: src/slic3r/GUI/ConfigWizard.cpp:1399 +#: src/slic3r/GUI/ConfigWizard.cpp:1735 msgid "Set the shape of your printer's bed." msgstr "프린터 침대 모양을 설정합니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1433 src/slic3r/GUI/Field.cpp:255 -#: src/slic3r/GUI/Field.cpp:324 src/slic3r/GUI/Field.cpp:1561 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:435 -msgid "Invalid numeric input." -msgstr "잘못된 숫자 입력." +#: src/slic3r/GUI/ConfigWizard.cpp:1755 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1610 +msgid "Build Volume" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1758 +msgid "Set vertical size of your printer." +msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1795 +msgid "Max print height:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Filament and Nozzle Diameters" msgstr "필라멘트와 노즐 직경" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Print Diameters" msgstr "인쇄 직경" -#: src/slic3r/GUI/ConfigWizard.cpp:1472 +#: src/slic3r/GUI/ConfigWizard.cpp:1828 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "프린터의 핫 엔드 노즐의 지름을 입력합니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1475 +#: src/slic3r/GUI/ConfigWizard.cpp:1831 msgid "Nozzle Diameter:" msgstr "노즐 직경:" -#: src/slic3r/GUI/ConfigWizard.cpp:1485 +#: src/slic3r/GUI/ConfigWizard.cpp:1841 msgid "Enter the diameter of your filament." msgstr "필라멘트의 지름을 입력합니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1486 +#: src/slic3r/GUI/ConfigWizard.cpp:1842 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." @@ -973,7 +1139,7 @@ msgstr "" "정밀도가 필요하므로 캘리퍼를 사용하여 필라멘트를 여러 번 측정 한 다음 평균을 " "계산하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:1489 +#: src/slic3r/GUI/ConfigWizard.cpp:1845 msgid "Filament Diameter:" msgstr "" "이 실험 설정은 선형 밀리미터 대신에 입방 밀리미터 \n" @@ -984,40 +1150,41 @@ msgstr "" "할 수 있습니다 Slic3r. \n" "이것은 최근의 말린에서만 지원됩니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Nozzle and Bed Temperatures" msgstr "노즐 및 침대 온도" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Temperatures" msgstr "온도" -#: src/slic3r/GUI/ConfigWizard.cpp:1563 +#: src/slic3r/GUI/ConfigWizard.cpp:1919 msgid "Enter the temperature needed for extruding your filament." msgstr "필라멘트를 압출하는 데 필요한 온도를 입력합니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1564 +#: src/slic3r/GUI/ConfigWizard.cpp:1920 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "" "엄지 손가락의 규칙은 PLA에 대한 160 ~ 230 °C, ABS에 대한 215 ~ 250 ° C입니다." -#: src/slic3r/GUI/ConfigWizard.cpp:1567 +#: src/slic3r/GUI/ConfigWizard.cpp:1923 msgid "Extrusion Temperature:" msgstr "압출 온도:" -#: src/slic3r/GUI/ConfigWizard.cpp:1568 src/slic3r/GUI/ConfigWizard.cpp:1582 -#: src/libslic3r/PrintConfig.cpp:418 src/libslic3r/PrintConfig.cpp:1211 -#: src/libslic3r/PrintConfig.cpp:1266 src/libslic3r/PrintConfig.cpp:2842 +#: src/slic3r/GUI/ConfigWizard.cpp:1924 src/slic3r/GUI/ConfigWizard.cpp:1938 +#: src/libslic3r/PrintConfig.cpp:437 src/libslic3r/PrintConfig.cpp:1271 +#: src/libslic3r/PrintConfig.cpp:1326 src/libslic3r/PrintConfig.cpp:2930 +#: src/libslic3r/PrintConfig.cpp:3689 msgid "°C" msgstr "℃" -#: src/slic3r/GUI/ConfigWizard.cpp:1577 +#: src/slic3r/GUI/ConfigWizard.cpp:1933 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." msgstr "필라멘트가 핫배드에 접착하는데 필요한 온도를 입력하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:1578 +#: src/slic3r/GUI/ConfigWizard.cpp:1934 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." @@ -1025,164 +1192,163 @@ msgstr "" "보통은 PLA의 경우 60 ° C 이고, ABS의 경우 110 ° C입니다. 핫배드가 없는 경우에" "는 0으로 두십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:1581 +#: src/slic3r/GUI/ConfigWizard.cpp:1937 msgid "Bed Temperature:" msgstr "배드 온도" -#: src/slic3r/GUI/ConfigWizard.cpp:2043 src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Materials" msgstr "SLA 재료" -#: src/slic3r/GUI/ConfigWizard.cpp:2097 +#: src/slic3r/GUI/ConfigWizard.cpp:2464 msgid "FFF Technology Printers" msgstr "FFF 방식 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:2102 +#: src/slic3r/GUI/ConfigWizard.cpp:2469 msgid "SLA Technology Printers" msgstr "SLA 방식 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:2338 +#: src/slic3r/GUI/ConfigWizard.cpp:2718 #, boost-format msgid "" "Following printer profiles has no default filament: %1%Please select one " "manually." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2339 +#: src/slic3r/GUI/ConfigWizard.cpp:2719 #, boost-format msgid "" "Following printer profiles has no default material: %1%Please select one " "manually." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2340 src/slic3r/GUI/ConfigWizard.cpp:2438 -#: src/slic3r/GUI/DoubleSlider.cpp:2522 src/slic3r/GUI/DoubleSlider.cpp:2543 -#: src/slic3r/GUI/GUI.cpp:232 -msgid "Notice" -msgstr "공지" - -#: src/slic3r/GUI/ConfigWizard.cpp:2459 +#: src/slic3r/GUI/ConfigWizard.cpp:2883 msgid "The following FFF printer models have no filament selected:" msgstr "다음 FFF 프린터 모델에는 필라멘트가 선택되지 않습니다." -#: src/slic3r/GUI/ConfigWizard.cpp:2463 +#: src/slic3r/GUI/ConfigWizard.cpp:2887 msgid "Do you want to select default filaments for these FFF printer models?" msgstr "이러한 FFF 프린터 모델에 대한 기본 필라멘트를 선택하시겠습니까?" -#: src/slic3r/GUI/ConfigWizard.cpp:2477 +#: src/slic3r/GUI/ConfigWizard.cpp:2901 msgid "The following SLA printer models have no materials selected:" msgstr "다음 SLA 프린터 모델에는 선택한 재질이 없습니다." -#: src/slic3r/GUI/ConfigWizard.cpp:2481 +#: src/slic3r/GUI/ConfigWizard.cpp:2905 msgid "Do you want to select default SLA materials for these printer models?" msgstr "이러한 프린터 모델에 대한 기본 SLA 재질을 선택하시겠습니까?" -#: src/slic3r/GUI/ConfigWizard.cpp:2523 +#: src/slic3r/GUI/ConfigWizard.cpp:2947 msgid "Configuration is edited in ConfigWizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2566 +#: src/slic3r/GUI/ConfigWizard.cpp:3000 msgid "All user presets will be deleted." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2596 +#: src/slic3r/GUI/ConfigWizard.cpp:3037 msgid "A new vendor was installed and one of its printers will be activated" msgid_plural "" "New vendors were installed and one of theirs printers will be activated" msgstr[0] "" -#: src/slic3r/GUI/ConfigWizard.cpp:2625 +#: src/slic3r/GUI/ConfigWizard.cpp:3069 msgid "Do you want to continue changing the configuration?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2691 +#: src/slic3r/GUI/ConfigWizard.cpp:3136 msgid "A new Printer was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2696 +#: src/slic3r/GUI/ConfigWizard.cpp:3141 msgid "Some Printers were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2717 +#: src/slic3r/GUI/ConfigWizard.cpp:3162 msgid "A new filament was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2718 +#: src/slic3r/GUI/ConfigWizard.cpp:3163 msgid "A new SLA material was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some filaments were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some SLA materials were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2773 +#: src/slic3r/GUI/ConfigWizard.cpp:3218 msgid "Custom printer was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2858 +#: src/slic3r/GUI/ConfigWizard.cpp:3306 msgid "Select all standard printers" msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요" -#: src/slic3r/GUI/ConfigWizard.cpp:2861 +#: src/slic3r/GUI/ConfigWizard.cpp:3309 msgid "< &Back" msgstr "< & 뒤로" -#: src/slic3r/GUI/ConfigWizard.cpp:2862 +#: src/slic3r/GUI/ConfigWizard.cpp:3310 msgid "&Next >" msgstr "& 다음 >" -#: src/slic3r/GUI/ConfigWizard.cpp:2863 +#: src/slic3r/GUI/ConfigWizard.cpp:3311 msgid "&Finish" msgstr "완료(&Finish)" -#: src/slic3r/GUI/ConfigWizard.cpp:2864 -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:3312 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:657 +#: src/slic3r/GUI/FileArchiveDialog.cpp:274 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 #: src/slic3r/GUI/FirmwareDialog.cpp:153 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1593 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1365 #: src/slic3r/GUI/ProgressStatusBar.cpp:26 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:93 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:879 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:96 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:907 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1606 msgid "Cancel" msgstr "취소" -#: src/slic3r/GUI/ConfigWizard.cpp:2884 +#: src/slic3r/GUI/ConfigWizard.cpp:3332 msgid "Prusa FFF Technology Printers" msgstr "프루사 FFF 방식 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:2892 +#: src/slic3r/GUI/ConfigWizard.cpp:3340 msgid "Prusa MSLA Technology Printers" msgstr "프루사 MSLA 기술 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filament Profiles Selection" msgstr "필라멘트 프로파일 선택" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 src/slic3r/GUI/ConfigWizard.cpp:2915 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 src/slic3r/GUI/ConfigWizard.cpp:3363 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Type:" msgstr "종류:" -#: src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Material Profiles Selection" msgstr "SLA 재질 프로파일 선택" -#: src/slic3r/GUI/ConfigWizard.cpp:3036 +#: src/slic3r/GUI/ConfigWizard.cpp:3486 msgid "Configuration Assistant" msgstr "구성 도우미" -#: src/slic3r/GUI/ConfigWizard.cpp:3037 +#: src/slic3r/GUI/ConfigWizard.cpp:3487 msgid "Configuration &Assistant" msgstr "구성 및 도우미" -#: src/slic3r/GUI/ConfigWizard.cpp:3039 +#: src/slic3r/GUI/ConfigWizard.cpp:3489 msgid "Configuration Wizard" msgstr "구성 마법사" -#: src/slic3r/GUI/ConfigWizard.cpp:3040 +#: src/slic3r/GUI/ConfigWizard.cpp:3490 msgid "Configuration &Wizard" msgstr "구성 및 마법사" @@ -1196,37 +1362,54 @@ msgstr "" msgid "Performing desktop integration failed - Could not find executable." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:378 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:383 msgid "" "Performing desktop integration failed because the application directory was " "not found." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:419 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:423 msgid "" "Performing desktop integration failed - could not create Gcodeviewer desktop " "file. PrusaSlicer desktop file was probably created successfully." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:459 -#: src/slic3r/GUI/GUI_App.cpp:2245 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:472 +msgid "" +"Performing downloader desktop integration failed - boost::filesystem::" +"canonical did not return appimage path." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:484 +msgid "" +"Performing downloader desktop integration failed - Could not find executable." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:602 +msgid "" +"Performing downloader desktop integration failed because the application " +"directory was not found." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:626 +#: src/slic3r/GUI/GUI_App.cpp:2407 msgid "Desktop Integration" msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:466 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:633 msgid "" "Desktop Integration sets this binary to be searchable by the system.\n" "\n" "Press \"Perform\" to proceed." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:480 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:647 msgid "Perform" msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1342 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:653 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/KBShortcutsDialog.cpp:106 +#: src/slic3r/GUI/MainFrame.cpp:1426 msgid "Undo" msgstr "실행 취소" @@ -1234,19 +1417,19 @@ msgstr "실행 취소" msgid "Place bearings in slots and resume printing" msgstr "베어링을 슬롯에 놓고 인쇄를 재개합니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1379 +#: src/slic3r/GUI/DoubleSlider.cpp:1448 msgid "One layer mode" msgstr "단일 레이어 모드" -#: src/slic3r/GUI/DoubleSlider.cpp:1381 +#: src/slic3r/GUI/DoubleSlider.cpp:1450 msgid "Discard all custom changes" msgstr "모든 사용자 지정 변경 내용 삭제" -#: src/slic3r/GUI/DoubleSlider.cpp:1385 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:1454 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to move" msgstr "이동하려면 이동" -#: src/slic3r/GUI/DoubleSlider.cpp:1388 +#: src/slic3r/GUI/DoubleSlider.cpp:1457 #, c-format, boost-format msgid "" "Jump to height %s\n" @@ -1257,7 +1440,7 @@ msgstr "" "눈금 모드 설정\n" "또는 전체 인쇄용 압출기 시퀀스 설정" -#: src/slic3r/GUI/DoubleSlider.cpp:1391 +#: src/slic3r/GUI/DoubleSlider.cpp:1460 #, c-format, boost-format msgid "" "Jump to height %s\n" @@ -1266,30 +1449,30 @@ msgstr "" "높이로 이동 %s\n" "또는 눈금자 모드 설정" -#: src/slic3r/GUI/DoubleSlider.cpp:1396 +#: src/slic3r/GUI/DoubleSlider.cpp:1465 msgid "Edit current color - Right click the colored slider segment" msgstr "" "현재 색상 편집 - 컬러 슬라이더 세그먼트를 마우스 오른쪽 단추로 클릭합니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1398 +#: src/slic3r/GUI/DoubleSlider.cpp:1467 msgid "This is wipe tower layer" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1408 +#: src/slic3r/GUI/DoubleSlider.cpp:1477 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing sequentually." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1412 +#: src/slic3r/GUI/DoubleSlider.cpp:1481 msgid "Print mode" msgstr "인쇄 모드" -#: src/slic3r/GUI/DoubleSlider.cpp:1426 +#: src/slic3r/GUI/DoubleSlider.cpp:1495 msgid "Add extruder change - Left click" msgstr "압출기 변경 추가 - 왼쪽 클릭" -#: src/slic3r/GUI/DoubleSlider.cpp:1428 +#: src/slic3r/GUI/DoubleSlider.cpp:1497 msgid "" "Add color change - Left click for predefined color or Shift + Left click for " "custom color selection" @@ -1297,23 +1480,23 @@ msgstr "" "색상 변경 추가 - 미리 정의된 색상 또는 시프트 + 사용자 지정 색상 선택을 위한 " "왼쪽 클릭" -#: src/slic3r/GUI/DoubleSlider.cpp:1430 +#: src/slic3r/GUI/DoubleSlider.cpp:1499 msgid "Add color change - Left click" msgstr "색상 변경 추가 - 왼쪽 클릭" -#: src/slic3r/GUI/DoubleSlider.cpp:1431 +#: src/slic3r/GUI/DoubleSlider.cpp:1500 msgid "or press \"+\" key" msgstr "또는 \"+\" 키를 누릅니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1433 +#: src/slic3r/GUI/DoubleSlider.cpp:1502 msgid "Add another code - Ctrl + Left click" msgstr "다른 코드 추가 - Ctrl + 왼쪽 클릭" -#: src/slic3r/GUI/DoubleSlider.cpp:1434 +#: src/slic3r/GUI/DoubleSlider.cpp:1503 msgid "Add another code - Right click" msgstr "다른 코드 추가 - 마우스 오른쪽 클릭" -#: src/slic3r/GUI/DoubleSlider.cpp:1440 +#: src/slic3r/GUI/DoubleSlider.cpp:1509 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing " @@ -1325,40 +1508,40 @@ msgstr "" "다.\n" "이 코드는 G 코드 생성 중에 처리되지 않습니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1458 +#: src/slic3r/GUI/DoubleSlider.cpp:1527 msgid "continue" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1466 +#: src/slic3r/GUI/DoubleSlider.cpp:1535 #, boost-format msgid "Color change (\"%1%\")" msgstr "색상 변경(\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1467 +#: src/slic3r/GUI/DoubleSlider.cpp:1536 #, boost-format msgid "Color change (\"%1%\") for Extruder %2%" msgstr "압출기%2%색상 변경(\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1469 +#: src/slic3r/GUI/DoubleSlider.cpp:1538 #, boost-format msgid "Pause print (\"%1%\")" msgstr "인쇄 일시 중지(\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1471 +#: src/slic3r/GUI/DoubleSlider.cpp:1540 #, boost-format msgid "Custom template (\"%1%\")" msgstr "사용자 지정 템플릿(\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1473 +#: src/slic3r/GUI/DoubleSlider.cpp:1542 #, boost-format msgid "Extruder (tool) is changed to Extruder \"%1%\"" msgstr "압출기(도구)가 압출기 \"%1%\"로 변경됩니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1480 +#: src/slic3r/GUI/DoubleSlider.cpp:1549 msgid "Note" msgstr "메모" -#: src/slic3r/GUI/DoubleSlider.cpp:1482 +#: src/slic3r/GUI/DoubleSlider.cpp:1551 msgid "" "G-code associated to this tick mark is in a conflict with print mode.\n" "Editing it will cause changes of Slider data." @@ -1366,7 +1549,7 @@ msgstr "" "이 틱 마크와 연결된 G 코드는 인쇄 모드와 충돌합니다.\n" "편집하면 슬라이더 데이터가 변경됩니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1485 +#: src/slic3r/GUI/DoubleSlider.cpp:1554 msgid "" "There is a color change for extruder that won't be used till the end of " "print job.\n" @@ -1375,7 +1558,7 @@ msgstr "" "인쇄 작업이 끝날 때까지 사용되지 않는 압출기의 색상 변경이 있습니다.\n" "이 코드는 G 코드 생성 중에 처리되지 않습니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1488 +#: src/slic3r/GUI/DoubleSlider.cpp:1557 msgid "" "There is an extruder change set to the same extruder.\n" "This code won't be processed during G-code generation." @@ -1383,7 +1566,7 @@ msgstr "" "압출기 변경이 동일한 압출기로 설정되어 있습니다.\n" "이 코드는 G 코드 생성 중에 처리되지 않습니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1491 +#: src/slic3r/GUI/DoubleSlider.cpp:1560 msgid "" "There is a color change for extruder that has not been used before.\n" "Check your settings to avoid redundant color changes." @@ -1391,203 +1574,205 @@ msgstr "" "이전에 사용되지 않은 압출기의 색상 변경이 있습니다.\n" "중복 색상 변경을 방지하려면 설정을 확인합니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1496 +#: src/slic3r/GUI/DoubleSlider.cpp:1565 msgid "Delete tick mark - Left click or press \"-\" key" msgstr "체크 표시 삭제 - 왼쪽 클릭 또는 \"-\" 키 를 누릅니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1498 +#: src/slic3r/GUI/DoubleSlider.cpp:1567 msgid "Edit tick mark - Ctrl + Left click" msgstr "틱 마크 편집 - Ctrl + 왼쪽 클릭" -#: src/slic3r/GUI/DoubleSlider.cpp:1499 +#: src/slic3r/GUI/DoubleSlider.cpp:1568 msgid "Edit tick mark - Right click" msgstr "체크 마크 편집 - 마우스 오른쪽 클릭" -#: src/slic3r/GUI/DoubleSlider.cpp:1602 src/slic3r/GUI/DoubleSlider.cpp:1633 -#: src/slic3r/GUI/GUI_Factories.cpp:778 +#: src/slic3r/GUI/DoubleSlider.cpp:1671 src/slic3r/GUI/DoubleSlider.cpp:1702 +#: src/slic3r/GUI/GUI_Factories.cpp:862 #, c-format, boost-format msgid "Extruder %d" msgstr "압출기 %d" -#: src/slic3r/GUI/DoubleSlider.cpp:1603 src/slic3r/GUI/GUI_Factories.cpp:779 +#: src/slic3r/GUI/DoubleSlider.cpp:1672 src/slic3r/GUI/GUI_Factories.cpp:863 msgid "active" msgstr "활성" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 msgid "Switch code to Change extruder" msgstr "압출기 변경으로 코드를 전환" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Change extruder" msgstr "압출기(익스트루더) 변경" -#: src/slic3r/GUI/DoubleSlider.cpp:1613 +#: src/slic3r/GUI/DoubleSlider.cpp:1682 msgid "Change extruder (N/A)" msgstr "압출기 변경(N/A)" -#: src/slic3r/GUI/DoubleSlider.cpp:1615 src/slic3r/GUI/GUI_Factories.cpp:787 +#: src/slic3r/GUI/DoubleSlider.cpp:1684 src/slic3r/GUI/GUI_Factories.cpp:871 msgid "Use another extruder" msgstr "다른 압출기 사용" -#: src/slic3r/GUI/DoubleSlider.cpp:1634 +#: src/slic3r/GUI/DoubleSlider.cpp:1703 msgid "used" msgstr "사용됨" -#: src/slic3r/GUI/DoubleSlider.cpp:1642 +#: src/slic3r/GUI/DoubleSlider.cpp:1711 #, boost-format msgid "Switch code to Color change (%1%) for:" msgstr "다음을 위해 코드를 색상 변경(%1%)으로 전환합니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1643 +#: src/slic3r/GUI/DoubleSlider.cpp:1712 #, boost-format msgid "Add color change (%1%) for:" msgstr "다음을 위해 색상 변경(%1%)을 추가합니다." -#: src/slic3r/GUI/DoubleSlider.cpp:1968 +#: src/slic3r/GUI/DoubleSlider.cpp:2037 msgid "Add color change" msgstr "색상 변경 추가" -#: src/slic3r/GUI/DoubleSlider.cpp:1979 +#: src/slic3r/GUI/DoubleSlider.cpp:2048 msgid "Add pause print" msgstr "일시 중지 인쇄 추가" -#: src/slic3r/GUI/DoubleSlider.cpp:1983 +#: src/slic3r/GUI/DoubleSlider.cpp:2052 msgid "Add custom template" msgstr "사용자 지정 템플릿 추가" -#: src/slic3r/GUI/DoubleSlider.cpp:1986 +#: src/slic3r/GUI/DoubleSlider.cpp:2055 msgid "Add custom G-code" msgstr "사용자 지정 G 코드 추가" -#: src/slic3r/GUI/DoubleSlider.cpp:2004 +#: src/slic3r/GUI/DoubleSlider.cpp:2073 msgid "Edit color" msgstr "색상 편집" -#: src/slic3r/GUI/DoubleSlider.cpp:2005 +#: src/slic3r/GUI/DoubleSlider.cpp:2074 msgid "Edit pause print message" msgstr "일시 중지 인쇄 메시지 편집" -#: src/slic3r/GUI/DoubleSlider.cpp:2006 +#: src/slic3r/GUI/DoubleSlider.cpp:2075 msgid "Edit custom G-code" msgstr "사용자 지정 G 코드 편집" -#: src/slic3r/GUI/DoubleSlider.cpp:2012 +#: src/slic3r/GUI/DoubleSlider.cpp:2081 msgid "Delete color change" msgstr "색상 변경 삭제" -#: src/slic3r/GUI/DoubleSlider.cpp:2013 +#: src/slic3r/GUI/DoubleSlider.cpp:2082 msgid "Delete tool change" msgstr "도구 변경 삭제" -#: src/slic3r/GUI/DoubleSlider.cpp:2014 +#: src/slic3r/GUI/DoubleSlider.cpp:2083 msgid "Delete pause print" msgstr "일시 중지 인쇄 삭제" -#: src/slic3r/GUI/DoubleSlider.cpp:2015 +#: src/slic3r/GUI/DoubleSlider.cpp:2084 msgid "Delete custom G-code" msgstr "사용자 지정 G 코드 삭제" -#: src/slic3r/GUI/DoubleSlider.cpp:2025 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:2094 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to height" msgstr "높이로 이동" -#: src/slic3r/GUI/DoubleSlider.cpp:2030 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 msgid "Hide ruler" msgstr "눈금 숨기기" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height" msgstr "개체 높이 표시" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height on the ruler" msgstr "눈금자에 개체 높이 표시" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time" msgstr "예상 인쇄 시간 표시" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time on the ruler" msgstr "눈금자에 대한 예상 인쇄 시간 표시" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Ruler mode" msgstr "눈금자 모드" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Set ruler mode" msgstr "눈금 모드 설정" -#: src/slic3r/GUI/DoubleSlider.cpp:2047 +#: src/slic3r/GUI/DoubleSlider.cpp:2116 msgid "Set extruder sequence for the entire print" msgstr "전체 인쇄에 대한 압출기 시퀀스 설정" -#: src/slic3r/GUI/DoubleSlider.cpp:2051 +#: src/slic3r/GUI/DoubleSlider.cpp:2120 msgid "Set auto color changes" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2086 +#: src/slic3r/GUI/DoubleSlider.cpp:2155 msgid "This action will cause deletion of all ticks on vertical slider." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2087 src/slic3r/GUI/Tab.cpp:1318 +#: src/slic3r/GUI/DoubleSlider.cpp:2156 src/slic3r/GUI/Tab.cpp:1263 msgid "" "This action is not revertible.\n" "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2088 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1133 src/slic3r/GUI/GUI.cpp:245 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:649 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:679 -#: src/slic3r/GUI/WipeTowerDialog.cpp:58 src/slic3r/GUI/WipeTowerDialog.cpp:443 +#: src/slic3r/GUI/DoubleSlider.cpp:2157 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:537 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1119 src/slic3r/GUI/GUI.cpp:258 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:721 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:751 +#: src/slic3r/GUI/WipeTowerDialog.cpp:60 src/slic3r/GUI/WipeTowerDialog.cpp:445 msgid "Warning" msgstr "경고" -#: src/slic3r/GUI/DoubleSlider.cpp:2216 +#: src/slic3r/GUI/DoubleSlider.cpp:2285 msgid "Enter custom G-code used on current layer" msgstr "현재 레이어에 사용되는 사용자 지정 G 코드 입력" -#: src/slic3r/GUI/DoubleSlider.cpp:2217 +#: src/slic3r/GUI/DoubleSlider.cpp:2286 #, boost-format msgid "Custom G-code on current layer (%1% mm)." msgstr "현재 레이어(%1% mm)의 사용자 지정 G 코드입니다." -#: src/slic3r/GUI/DoubleSlider.cpp:2238 +#: src/slic3r/GUI/DoubleSlider.cpp:2307 msgid "Enter short message shown on Printer display when a print is paused" msgstr "인쇄가 일시 중지될 때 프린터 디스플레이에 표시된 짧은 메시지 입력" -#: src/slic3r/GUI/DoubleSlider.cpp:2239 +#: src/slic3r/GUI/DoubleSlider.cpp:2308 #, boost-format msgid "Message for pause print on current layer (%1% mm)." msgstr "현재 레이어(%1% mm)에서 인쇄를 일시 중지하기 위한 메시지입니다." -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the move you want to jump to" msgstr "점프할 이동을 입력합니다." -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the height you want to jump to" msgstr "점프할 높이를 입력합니다." -#: src/slic3r/GUI/DoubleSlider.cpp:2515 +#: src/slic3r/GUI/DoubleSlider.cpp:2584 msgid "The last color change data was saved for a single extruder printing." msgstr "마지막 색상 변경 데이터는 단일 압출기 인쇄에 저장되었습니다." -#: src/slic3r/GUI/DoubleSlider.cpp:2516 src/slic3r/GUI/DoubleSlider.cpp:2532 +#: src/slic3r/GUI/DoubleSlider.cpp:2585 src/slic3r/GUI/DoubleSlider.cpp:2601 msgid "The last color change data was saved for a multi extruder printing." msgstr "마지막 색상 변경 데이터는 다중 압출기 인쇄를 위해 저장되었습니다." -#: src/slic3r/GUI/DoubleSlider.cpp:2518 +#: src/slic3r/GUI/DoubleSlider.cpp:2587 msgid "Your current changes will delete all saved color changes." msgstr "현재 변경 사항은 저장된 모든 색상 변경 내용을 삭제합니다." -#: src/slic3r/GUI/DoubleSlider.cpp:2519 src/slic3r/GUI/DoubleSlider.cpp:2540 +#: src/slic3r/GUI/DoubleSlider.cpp:2588 src/slic3r/GUI/DoubleSlider.cpp:2609 msgid "Are you sure you want to continue?" msgstr "정말 계속하기를 원하십니까?" -#: src/slic3r/GUI/DoubleSlider.cpp:2533 +#: src/slic3r/GUI/DoubleSlider.cpp:2602 msgid "" "Select YES if you want to delete all saved tool changes, \n" "NO if you want all tool changes switch to color changes, \n" @@ -1597,11 +1782,11 @@ msgstr "" "모든 도구 변경이 색상 변경으로 전환하려는 경우 아니요, \n" "또는 취소하여 변경되지 않은 상태로 둡니다." -#: src/slic3r/GUI/DoubleSlider.cpp:2536 +#: src/slic3r/GUI/DoubleSlider.cpp:2605 msgid "Do you want to delete all saved tool changes?" msgstr "저장된 모든 도구 변경 내용을 삭제하시겠습니까?" -#: src/slic3r/GUI/DoubleSlider.cpp:2538 +#: src/slic3r/GUI/DoubleSlider.cpp:2607 msgid "" "The last color change data was saved for a multi extruder printing with tool " "changes for whole print." @@ -1609,18 +1794,32 @@ msgstr "" "마지막 색상 변경 데이터는 전체 인쇄용 공구 변경과 함께 멀티 압출기 인쇄를 위" "해 저장되었습니다." -#: src/slic3r/GUI/DoubleSlider.cpp:2539 +#: src/slic3r/GUI/DoubleSlider.cpp:2608 msgid "Your current changes will delete all saved extruder (tool) changes." msgstr "현재 변경 사항은 저장된 모든 압출기(도구) 변경 내용을 삭제합니다." -#: src/slic3r/GUI/ExtraRenderers.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:538 -#: src/slic3r/GUI/GUI_ObjectList.cpp:550 src/slic3r/GUI/GUI_ObjectList.cpp:979 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4291 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:250 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:352 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:376 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:607 src/libslic3r/PrintConfig.cpp:800 +#: src/slic3r/GUI/Downloader.cpp:150 +#, boost-format +msgid "" +"Download won't start. Download URL doesn't point to https://files.printables." +"com : %1%" +msgstr "" + +#: src/slic3r/GUI/Downloader.cpp:181 +msgid "The download has failed:" +msgstr "" + +#: src/slic3r/GUI/DownloaderFileGet.cpp:193 +#, boost-format +msgid "Can't create file at %1%." +msgstr "" + +#: src/slic3r/GUI/ExtraRenderers.cpp:323 src/slic3r/GUI/GUI_ObjectList.cpp:571 +#: src/slic3r/GUI/GUI_ObjectList.cpp:583 src/slic3r/GUI/GUI_ObjectList.cpp:1043 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2125 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3013 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4884 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:259 src/libslic3r/PrintConfig.cpp:894 msgid "default" msgstr "기본값" @@ -1633,10 +1832,10 @@ msgid "Set extruder change for every" msgstr "압출기 변경 설정" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:60 -#: src/libslic3r/PrintConfig.cpp:662 src/libslic3r/PrintConfig.cpp:1430 -#: src/libslic3r/PrintConfig.cpp:2135 src/libslic3r/PrintConfig.cpp:2310 -#: src/libslic3r/PrintConfig.cpp:2386 src/libslic3r/PrintConfig.cpp:2639 -#: src/libslic3r/PrintConfig.cpp:2687 src/libslic3r/PrintConfig.cpp:2706 +#: src/libslic3r/PrintConfig.cpp:765 src/libslic3r/PrintConfig.cpp:1476 +#: src/libslic3r/PrintConfig.cpp:2165 src/libslic3r/PrintConfig.cpp:2343 +#: src/libslic3r/PrintConfig.cpp:2417 src/libslic3r/PrintConfig.cpp:2665 +#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2728 msgid "layers" msgstr "레이어" @@ -1668,26 +1867,26 @@ msgstr "시퀀스에서 압출기 제거" msgid "Add extruder to sequence" msgstr "시퀀스에 압출기 추가" -#: src/slic3r/GUI/Field.cpp:190 +#: src/slic3r/GUI/Field.cpp:188 msgid "default value" msgstr "기본 값" -#: src/slic3r/GUI/Field.cpp:193 +#: src/slic3r/GUI/Field.cpp:191 msgid "parameter name" msgstr "매개 변수 명칭" -#: src/slic3r/GUI/Field.cpp:204 src/slic3r/GUI/OptionsGroup.cpp:827 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1067 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1079 +#: src/slic3r/GUI/Field.cpp:206 src/slic3r/GUI/OptionsGroup.cpp:852 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1074 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1086 msgid "N/A" msgstr "N/A" -#: src/slic3r/GUI/Field.cpp:226 src/slic3r/GUI/Field.cpp:298 +#: src/slic3r/GUI/Field.cpp:229 src/slic3r/GUI/Field.cpp:302 #, c-format, boost-format msgid "%s doesn't support percentage" msgstr "%s 이(가) 백분율을 지원하지 않음" -#: src/slic3r/GUI/Field.cpp:266 +#: src/slic3r/GUI/Field.cpp:269 #, c-format, boost-format msgid "" "Input value is out of range\n" @@ -1696,16 +1895,16 @@ msgstr "" "입력 값이 범위를 벗어났습니다.\n" "%s 올바른 값이며 계속하시겠습니까?" -#: src/slic3r/GUI/Field.cpp:269 src/slic3r/GUI/Field.cpp:343 +#: src/slic3r/GUI/Field.cpp:272 src/slic3r/GUI/Field.cpp:347 msgid "Parameter validation" msgstr "매개 변수 유효성 검사" -#: src/slic3r/GUI/Field.cpp:282 src/slic3r/GUI/Field.cpp:390 -#: src/slic3r/GUI/Field.cpp:1573 +#: src/slic3r/GUI/Field.cpp:285 src/slic3r/GUI/Field.cpp:394 +#: src/slic3r/GUI/Field.cpp:1597 msgid "Input value is out of range" msgstr "입력 값이 범위를 벗어남" -#: src/slic3r/GUI/Field.cpp:340 +#: src/slic3r/GUI/Field.cpp:344 #, c-format, boost-format msgid "" "Do you mean %s%% instead of %s %s?\n" @@ -1716,13 +1915,22 @@ msgstr "" "이 값을 %s%%, 로 변경하려면 YES를 선택하십시오. \n" "또는 %s %s 이(가) 올바른 값인지 확인하는 경우 NO를 선택하세요. " -#: src/slic3r/GUI/Field.cpp:397 +#: src/slic3r/GUI/Field.cpp:401 #, boost-format msgid "" "Invalid input format. Expected vector of dimensions in the following format: " "\"%1%\"" msgstr "잘못된 입력 형식입니다. 다음 형식의 예상 치수 벡터: \"%1%\"" +#: src/slic3r/GUI/FileArchiveDialog.cpp:170 +msgid "Archive preview" +msgstr "" + +#: src/slic3r/GUI/FileArchiveDialog.cpp:270 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +msgid "Open" +msgstr "" + #: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flash!" msgstr "플래시!" @@ -1807,12 +2015,6 @@ msgstr "펌웨어 이미지:" msgid "Select a file" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:815 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:297 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:372 -msgid "Browse" -msgstr "찾아보기" - #: src/slic3r/GUI/FirmwareDialog.cpp:817 msgid "Serial port:" msgstr "직렬 포트:" @@ -1842,10 +2044,10 @@ msgid "Advanced: Output log" msgstr "고급: 출력 로그" #: src/slic3r/GUI/FirmwareDialog.cpp:862 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:310 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:358 #: src/slic3r/GUI/Mouse3DController.cpp:543 -#: src/slic3r/GUI/PrintHostDialogs.cpp:261 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:122 +#: src/slic3r/GUI/PrintHostDialogs.cpp:313 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:125 msgid "Close" msgstr "닫기" @@ -1865,7 +2067,7 @@ msgstr "확인" msgid "Cancelling..." msgstr "취소 중..." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1488 msgid "Shape Gallery" msgstr "" @@ -1873,585 +2075,566 @@ msgstr "" msgid "Select shape from the gallery" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:100 -msgid "Add to bed" -msgstr "" - -#: src/slic3r/GUI/GalleryDialog.cpp:101 -msgid "Add selected shape(s) to the bed" -msgstr "" - -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4152 +#: src/slic3r/GUI/GalleryDialog.cpp:114 src/slic3r/GUI/Tab.cpp:4377 msgid "Add" msgstr "추가" -#: src/slic3r/GUI/GalleryDialog.cpp:117 +#: src/slic3r/GUI/GalleryDialog.cpp:114 msgid "Add one or more custom shapes" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:506 -#: src/slic3r/GUI/GLCanvas3D.cpp:4547 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/GalleryDialog.cpp:115 src/slic3r/GUI/GalleryDialog.cpp:528 +#: src/slic3r/GUI/GLCanvas3D.cpp:4638 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/GUI_Factories.cpp:460 src/slic3r/GUI/Tab.cpp:3973 msgid "Delete" msgstr "삭제" -#: src/slic3r/GUI/GalleryDialog.cpp:118 +#: src/slic3r/GUI/GalleryDialog.cpp:115 msgid "Delete one or more custom shape. You can't delete system shapes" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:400 +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "Add to bed" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "OK" +msgstr "확인" + +#: src/slic3r/GUI/GalleryDialog.cpp:143 +msgid "Add selected shape(s) to the bed" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:422 msgid "Choose one or more files (STL, OBJ):" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:440 +#: src/slic3r/GUI/GalleryDialog.cpp:462 #, boost-format msgid "" "It looks like selected %1%-file has an error or is destructed.\n" "We can't load this file" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:451 +#: src/slic3r/GUI/GalleryDialog.cpp:473 msgid "Choose one PNG file:" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:464 +#: src/slic3r/GUI/GalleryDialog.cpp:486 msgid "Replacing of the PNG" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:508 +#: src/slic3r/GUI/GalleryDialog.cpp:530 msgid "Change thumbnail" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:549 src/slic3r/GUI/GalleryDialog.cpp:554 +#: src/slic3r/GUI/GalleryDialog.cpp:571 src/slic3r/GUI/GalleryDialog.cpp:576 #, boost-format msgid "Loading of the \"%1%\"" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:274 +#: src/slic3r/GUI/GCodeViewer.cpp:343 msgid "Tool position" msgstr "공구 위치" -#: src/slic3r/GUI/GCodeViewer.cpp:1457 +#: src/slic3r/GUI/GCodeViewer.cpp:1547 msgid "Generating toolpaths" msgstr "공구 경로 생성" -#: src/slic3r/GUI/GCodeViewer.cpp:1517 +#: src/slic3r/GUI/GCodeViewer.cpp:1619 msgid "Generating vertex buffer" msgstr "정점 버퍼 생성" -#: src/slic3r/GUI/GCodeViewer.cpp:1857 +#: src/slic3r/GUI/GCodeViewer.cpp:1979 msgid "Generating index buffers" msgstr "인덱스 버퍼 생성" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to hide" msgstr "숨기려면 클릭하십시오." -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to show" msgstr "표시하려면 클릭하십시오." -#: src/slic3r/GUI/GCodeViewer.cpp:3181 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 msgid "up to" msgstr "최대 " -#: src/slic3r/GUI/GCodeViewer.cpp:3187 +#: src/slic3r/GUI/GCodeViewer.cpp:3455 msgid "above" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "from" msgstr "부터" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "to" msgstr "에서" -#: src/slic3r/GUI/GCodeViewer.cpp:3245 src/slic3r/GUI/GCodeViewer.cpp:3246 -#: src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3513 src/slic3r/GUI/GCodeViewer.cpp:3514 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 msgid "Percentage" msgstr "백분율" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3570 msgid "Feature type" msgstr "특색 유형" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3592 #: src/slic3r/GUI/RammingChart.cpp:90 msgid "Time" msgstr "시간" -#: src/slic3r/GUI/GCodeViewer.cpp:3295 src/slic3r/GUI/GCodeViewer.cpp:3306 -#: src/slic3r/GUI/GCodeViewer.cpp:3566 -msgid "Used filament" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3298 +#: src/slic3r/GUI/GCodeViewer.cpp:3571 msgid "Height (mm)" msgstr "높이 (mm)" -#: src/slic3r/GUI/GCodeViewer.cpp:3299 +#: src/slic3r/GUI/GCodeViewer.cpp:3572 msgid "Width (mm)" msgstr "폭 (mm)" -#: src/slic3r/GUI/GCodeViewer.cpp:3300 +#: src/slic3r/GUI/GCodeViewer.cpp:3573 msgid "Speed (mm/s)" msgstr "속도 (mm/s)" -#: src/slic3r/GUI/GCodeViewer.cpp:3301 -msgid "Fan Speed (%)" -msgstr "브릿지 팬 속도" +#: src/slic3r/GUI/GCodeViewer.cpp:3574 +msgid "Fan speed (%)" +msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3302 +#: src/slic3r/GUI/GCodeViewer.cpp:3575 msgid "Temperature (°C)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3303 +#: src/slic3r/GUI/GCodeViewer.cpp:3576 msgid "Volumetric flow rate (mm³/s)" msgstr "체적 유량(mm³/s)" -#: src/slic3r/GUI/GCodeViewer.cpp:3306 src/slic3r/GUI/GUI_Preview.cpp:224 -#: src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3577 +msgid "Layer time (linear)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3578 +msgid "Layer time (logarithmic)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3579 msgid "Tool" msgstr "도구" -#: src/slic3r/GUI/GCodeViewer.cpp:3309 src/slic3r/GUI/GUI_Preview.cpp:225 -#: src/slic3r/GUI/GUI_Preview.cpp:957 +#: src/slic3r/GUI/GCodeViewer.cpp:3580 msgid "Color Print" msgstr "컬러 프린트" -#: src/slic3r/GUI/GCodeViewer.cpp:3347 src/slic3r/GUI/GCodeViewer.cpp:3393 -#: src/slic3r/GUI/GCodeViewer.cpp:3398 src/slic3r/GUI/GUI_ObjectList.cpp:312 -#: src/slic3r/GUI/wxExtensions.cpp:536 src/libslic3r/PrintConfig.cpp:795 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 src/slic3r/GUI/GCodeViewer.cpp:3594 +#: src/slic3r/GUI/GCodeViewer.cpp:3860 +msgid "Used filament" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3623 src/slic3r/GUI/GCodeViewer.cpp:4067 +#: src/libslic3r/PrintConfig.cpp:3025 +msgid "Travel" +msgstr "이송" + +#: src/slic3r/GUI/GCodeViewer.cpp:3640 src/slic3r/GUI/GCodeViewer.cpp:3685 +#: src/slic3r/GUI/GCodeViewer.cpp:3689 src/slic3r/GUI/GUI_ObjectList.cpp:338 +#: src/slic3r/GUI/wxExtensions.cpp:547 src/libslic3r/PrintConfig.cpp:888 msgid "Extruder" msgstr "익스트루더" -#: src/slic3r/GUI/GCodeViewer.cpp:3370 +#: src/slic3r/GUI/GCodeViewer.cpp:3662 msgid "Default color" msgstr "기본 색상" -#: src/slic3r/GUI/GCodeViewer.cpp:3393 +#: src/slic3r/GUI/GCodeViewer.cpp:3685 msgid "default color" msgstr "기본 색상" -#: src/slic3r/GUI/GCodeViewer.cpp:3491 src/slic3r/GUI/GCodeViewer.cpp:3547 +#: src/slic3r/GUI/GCodeViewer.cpp:3785 src/slic3r/GUI/GCodeViewer.cpp:3841 msgid "Color change" msgstr "색상 변경" -#: src/slic3r/GUI/GCodeViewer.cpp:3510 src/slic3r/GUI/GCodeViewer.cpp:3545 +#: src/slic3r/GUI/GCodeViewer.cpp:3804 src/slic3r/GUI/GCodeViewer.cpp:3839 msgid "Print" msgstr "인쇄" -#: src/slic3r/GUI/GCodeViewer.cpp:3546 src/slic3r/GUI/GCodeViewer.cpp:3580 +#: src/slic3r/GUI/GCodeViewer.cpp:3840 src/slic3r/GUI/GCodeViewer.cpp:3874 msgid "Pause" msgstr "일시 정지" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Event" msgstr "이벤트" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Remaining time" msgstr "남은 시간" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Duration" msgstr "기간" -#: src/slic3r/GUI/GCodeViewer.cpp:3609 src/slic3r/GUI/GUI_Preview.cpp:1049 -#: src/libslic3r/PrintConfig.cpp:2937 -msgid "Travel" -msgstr "이송" - -#: src/slic3r/GUI/GCodeViewer.cpp:3612 -msgid "Movement" -msgstr "운동" - -#: src/slic3r/GUI/GCodeViewer.cpp:3613 -msgid "Extrusion" -msgstr "압출 없음" - -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1870 -#: src/slic3r/GUI/Tab.cpp:2812 -msgid "Retraction" -msgstr "리트랙션 후 최소 이동 거리" - -#: src/slic3r/GUI/GCodeViewer.cpp:3631 src/slic3r/GUI/GCodeViewer.cpp:3634 -#: src/slic3r/GUI/GUI_Preview.cpp:1050 -msgid "Wipe" -msgstr "와이프(wipe) 탑의 최소 퍼지" - -#: src/slic3r/GUI/GCodeViewer.cpp:3666 src/slic3r/GUI/GUI_Preview.cpp:257 -#: src/slic3r/GUI/GUI_Preview.cpp:272 -msgid "Options" -msgstr "옵션" - -#: src/slic3r/GUI/GCodeViewer.cpp:3669 src/slic3r/GUI/GUI_Preview.cpp:1051 -msgid "Retractions" -msgstr "리트랙션" - -#: src/slic3r/GUI/GCodeViewer.cpp:3670 src/slic3r/GUI/GUI_Preview.cpp:1052 -msgid "Deretractions" -msgstr "환원점" - -#: src/slic3r/GUI/GCodeViewer.cpp:3671 src/slic3r/GUI/GUI_Preview.cpp:1053 -msgid "Seams" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3672 src/slic3r/GUI/GUI_Preview.cpp:1054 -msgid "Tool changes" -msgstr "도구 변경" - -#: src/slic3r/GUI/GCodeViewer.cpp:3673 src/slic3r/GUI/GUI_Preview.cpp:1055 -msgid "Color changes" -msgstr "색상 변경" - -#: src/slic3r/GUI/GCodeViewer.cpp:3674 src/slic3r/GUI/GUI_Preview.cpp:1056 -msgid "Print pauses" -msgstr "인쇄 일시 중지" - -#: src/slic3r/GUI/GCodeViewer.cpp:3675 src/slic3r/GUI/GUI_Preview.cpp:1057 -msgid "Custom G-codes" -msgstr "사용자 지정 G 코드" - -#: src/slic3r/GUI/GCodeViewer.cpp:3695 src/slic3r/GUI/GCodeViewer.cpp:3714 -#: src/slic3r/GUI/GUI.cpp:341 src/slic3r/GUI/Plater.cpp:822 -#: src/libslic3r/PrintConfig.cpp:322 +#: src/slic3r/GUI/GCodeViewer.cpp:3928 src/slic3r/GUI/GUI.cpp:332 +#: src/slic3r/GUI/Plater.cpp:852 src/libslic3r/PrintConfig.cpp:335 msgid "Printer" msgstr "프린터" -#: src/slic3r/GUI/GCodeViewer.cpp:3697 src/slic3r/GUI/GCodeViewer.cpp:3719 -#: src/slic3r/GUI/GUI.cpp:337 src/slic3r/GUI/Plater.cpp:818 +#: src/slic3r/GUI/GCodeViewer.cpp:3931 src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/Plater.cpp:848 msgid "Print settings" msgstr "출력 설정" -#: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 -#: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1970 src/slic3r/GUI/Tab.cpp:1971 +#: src/slic3r/GUI/GCodeViewer.cpp:3936 src/slic3r/GUI/GUI.cpp:330 +#: src/slic3r/GUI/Plater.cpp:849 src/slic3r/GUI/Tab.cpp:1930 +#: src/slic3r/GUI/Tab.cpp:1931 msgid "Filament" msgstr "필라멘트 설정을 선택" -#: src/slic3r/GUI/GCodeViewer.cpp:3739 +#: src/slic3r/GUI/GCodeViewer.cpp:3950 msgid "Estimated printing times" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3758 +#: src/slic3r/GUI/GCodeViewer.cpp:3969 msgid "Normal mode" msgstr "일반 모드" -#: src/slic3r/GUI/GCodeViewer.cpp:3759 +#: src/slic3r/GUI/GCodeViewer.cpp:3970 msgid "Stealth mode" msgstr "스텔스 모드" -#: src/slic3r/GUI/GCodeViewer.cpp:3766 src/libslic3r/PrintConfig.cpp:1189 -#: src/libslic3r/PrintConfig.cpp:1207 src/libslic3r/PrintConfig.cpp:1217 -#: src/libslic3r/PrintConfig.cpp:1262 +#: src/slic3r/GUI/GCodeViewer.cpp:3979 src/libslic3r/PrintConfig.cpp:1249 +#: src/libslic3r/PrintConfig.cpp:1267 src/libslic3r/PrintConfig.cpp:1277 +#: src/libslic3r/PrintConfig.cpp:1322 msgid "First layer" msgstr "첫 레이어" -#: src/slic3r/GUI/GCodeViewer.cpp:3767 +#: src/slic3r/GUI/GCodeViewer.cpp:3983 msgid "Total" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3796 +#: src/slic3r/GUI/GCodeViewer.cpp:4002 msgid "Show stealth mode" msgstr "스텔스 모드 표시" -#: src/slic3r/GUI/GCodeViewer.cpp:3800 +#: src/slic3r/GUI/GCodeViewer.cpp:4006 msgid "Show normal mode" msgstr "일반 모드 표시" -#: src/slic3r/GUI/GLCanvas3D.cpp:225 src/slic3r/GUI/GLCanvas3D.cpp:4694 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:53 -msgid "Variable layer height" -msgstr "가변 레이어 높이 기능 사용" - -#: src/slic3r/GUI/GLCanvas3D.cpp:227 -msgid "Left mouse button:" -msgstr "왼쪽 마우스 버튼:" +#: src/slic3r/GUI/GCodeViewer.cpp:4071 +msgid "Wipe" +msgstr "와이프(wipe) 탑의 최소 퍼지" -#: src/slic3r/GUI/GLCanvas3D.cpp:229 -msgid "Add detail" -msgstr "디테일 추가" +#: src/slic3r/GUI/GCodeViewer.cpp:4075 +msgid "Retractions" +msgstr "리트랙션" -#: src/slic3r/GUI/GLCanvas3D.cpp:231 -msgid "Right mouse button:" -msgstr "오른쪽 마우스 버튼:" +#: src/slic3r/GUI/GCodeViewer.cpp:4079 +msgid "Deretractions" +msgstr "환원점" -#: src/slic3r/GUI/GLCanvas3D.cpp:233 -msgid "Remove detail" -msgstr "디테일 제거" +#: src/slic3r/GUI/GCodeViewer.cpp:4083 +msgid "Seams" +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:235 +#: src/slic3r/GUI/GCodeViewer.cpp:4087 +msgid "Tool changes" +msgstr "도구 변경" + +#: src/slic3r/GUI/GCodeViewer.cpp:4091 +msgid "Color changes" +msgstr "색상 변경" + +#: src/slic3r/GUI/GCodeViewer.cpp:4095 +msgid "Print pauses" +msgstr "인쇄 일시 중지" + +#: src/slic3r/GUI/GCodeViewer.cpp:4099 +msgid "Custom G-codes" +msgstr "사용자 지정 G 코드" + +#: src/slic3r/GUI/GCodeViewer.cpp:4103 +msgid "Center of gravity" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:4108 +msgid "Shells" +msgstr "쉘(Shells)" + +#: src/slic3r/GUI/GCodeViewer.cpp:4113 +msgid "Tool marker" +msgstr "공구 마커" + +#: src/slic3r/GUI/GLCanvas3D.cpp:185 src/slic3r/GUI/GLCanvas3D.cpp:4784 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:71 +msgid "Variable layer height" +msgstr "가변 레이어 높이 기능 사용" + +#: src/slic3r/GUI/GLCanvas3D.cpp:187 +msgid "Left mouse button:" +msgstr "왼쪽 마우스 버튼:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:189 +msgid "Add detail" +msgstr "디테일 추가" + +#: src/slic3r/GUI/GLCanvas3D.cpp:191 +msgid "Right mouse button:" +msgstr "오른쪽 마우스 버튼:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:193 +msgid "Remove detail" +msgstr "디테일 제거" + +#: src/slic3r/GUI/GLCanvas3D.cpp:195 msgid "Shift + Left mouse button:" msgstr "시프트 + 왼쪽 마우스 버튼:" -#: src/slic3r/GUI/GLCanvas3D.cpp:237 +#: src/slic3r/GUI/GLCanvas3D.cpp:197 msgid "Reset to base" msgstr "베이스로 재설정" -#: src/slic3r/GUI/GLCanvas3D.cpp:239 +#: src/slic3r/GUI/GLCanvas3D.cpp:199 msgid "Shift + Right mouse button:" msgstr "시프트 + 오른쪽 마우스 버튼:" -#: src/slic3r/GUI/GLCanvas3D.cpp:241 +#: src/slic3r/GUI/GLCanvas3D.cpp:201 msgid "Smoothing" msgstr "부드럽게" -#: src/slic3r/GUI/GLCanvas3D.cpp:243 +#: src/slic3r/GUI/GLCanvas3D.cpp:203 msgid "Mouse wheel:" msgstr "마우스 휠: " -#: src/slic3r/GUI/GLCanvas3D.cpp:245 +#: src/slic3r/GUI/GLCanvas3D.cpp:205 msgid "Increase/decrease edit area" msgstr "편집 영역 증가/감소" -#: src/slic3r/GUI/GLCanvas3D.cpp:248 +#: src/slic3r/GUI/GLCanvas3D.cpp:208 msgid "Adaptive" msgstr "어뎁티브" -#: src/slic3r/GUI/GLCanvas3D.cpp:254 +#: src/slic3r/GUI/GLCanvas3D.cpp:214 msgid "Quality / Speed" msgstr "품질 /속도" -#: src/slic3r/GUI/GLCanvas3D.cpp:257 +#: src/slic3r/GUI/GLCanvas3D.cpp:217 msgid "Higher print quality versus higher print speed." msgstr "높은 인쇄 속도와 높은 인쇄 품질." -#: src/slic3r/GUI/GLCanvas3D.cpp:268 +#: src/slic3r/GUI/GLCanvas3D.cpp:228 msgid "Smooth" msgstr "부드럽게" -#: src/slic3r/GUI/GLCanvas3D.cpp:274 src/libslic3r/PrintConfig.cpp:819 +#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/libslic3r/PrintConfig.cpp:908 msgid "Radius" msgstr "반경" -#: src/slic3r/GUI/GLCanvas3D.cpp:286 +#: src/slic3r/GUI/GLCanvas3D.cpp:246 msgid "Keep min" msgstr "최소 분 유지" -#: src/slic3r/GUI/GLCanvas3D.cpp:295 src/slic3r/GUI/GLCanvas3D.cpp:4123 +#: src/slic3r/GUI/GLCanvas3D.cpp:255 src/slic3r/GUI/GLCanvas3D.cpp:4217 msgid "Reset" msgstr "초기화" -#: src/slic3r/GUI/GLCanvas3D.cpp:561 +#: src/slic3r/GUI/GLCanvas3D.cpp:602 msgid "Variable layer height - Manual edit" msgstr "가변 레이어 높이 - 수동 편집" -#: src/slic3r/GUI/GLCanvas3D.cpp:676 +#: src/slic3r/GUI/GLCanvas3D.cpp:717 msgid "Seq." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1310 +#: src/slic3r/GUI/GLCanvas3D.cpp:1319 msgid "Variable layer height - Reset" msgstr "가변 레이어 높이 - 재설정" -#: src/slic3r/GUI/GLCanvas3D.cpp:1318 +#: src/slic3r/GUI/GLCanvas3D.cpp:1327 msgid "Variable layer height - Adaptive" msgstr "가변 레이어 높이 - 어뎁티브" -#: src/slic3r/GUI/GLCanvas3D.cpp:1326 +#: src/slic3r/GUI/GLCanvas3D.cpp:1335 msgid "Variable layer height - Smooth all" msgstr "가변 레이어 높이 - 모든 것을 부드럽게" -#: src/slic3r/GUI/GLCanvas3D.cpp:1733 +#: src/slic3r/GUI/GLCanvas3D.cpp:1778 msgid "Mirror Object" msgstr "오브젝트 반전" -#: src/slic3r/GUI/GLCanvas3D.cpp:2612 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:560 +#: src/slic3r/GUI/GLCanvas3D.cpp:2542 src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:117 msgid "Gizmo-Move" msgstr "개체(Gizmo) 이동" -#: src/slic3r/GUI/GLCanvas3D.cpp:2695 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562 +#: src/slic3r/GUI/GLCanvas3D.cpp:2638 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:661 msgid "Gizmo-Rotate" msgstr "물체(Gizmo) 회전" -#: src/slic3r/GUI/GLCanvas3D.cpp:3300 +#: src/slic3r/GUI/GLCanvas3D.cpp:3263 msgid "Move Object" msgstr "개체 이동" -#: src/slic3r/GUI/GLCanvas3D.cpp:3821 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3513 +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:40 +msgid "Gizmo-Place on Face" +msgstr "물체(Gizmo)를 배드위로" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3904 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Switch to Settings" msgstr "설정으로 전환" -#: src/slic3r/GUI/GLCanvas3D.cpp:3822 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3905 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Print Settings Tab" msgstr "인쇄 설정을 선택 합니다" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Filament Settings Tab" msgstr "&필라멘트 설정 탭" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Material Settings Tab" msgstr "재질 설정 탭" -#: src/slic3r/GUI/GLCanvas3D.cpp:3824 src/slic3r/GUI/GLCanvas3D.cpp:4657 +#: src/slic3r/GUI/GLCanvas3D.cpp:3907 src/slic3r/GUI/GLCanvas3D.cpp:4746 msgid "Printer Settings Tab" msgstr "프린터 설정을 선택 합니다" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Undo History" msgstr "되돌리기 기록" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Redo History" msgstr "다시 실행 히스토리" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" msgstr[0] "%1$d 되돌아 가기" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" msgstr[0] "%1$d 다시 실행" -#: src/slic3r/GUI/GLCanvas3D.cpp:4011 src/slic3r/GUI/GLCanvas3D.cpp:4673 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 src/slic3r/GUI/Search.cpp:426 +#: src/slic3r/GUI/GLCanvas3D.cpp:4106 src/slic3r/GUI/GLCanvas3D.cpp:4762 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/Search.cpp:482 msgid "Search" msgstr "검색" -#: src/slic3r/GUI/GLCanvas3D.cpp:4025 src/slic3r/GUI/GLCanvas3D.cpp:4033 -#: src/slic3r/GUI/Search.cpp:432 +#: src/slic3r/GUI/GLCanvas3D.cpp:4120 src/slic3r/GUI/GLCanvas3D.cpp:4128 +#: src/slic3r/GUI/Search.cpp:488 msgid "Enter a search term" msgstr "검색어 입력" -#: src/slic3r/GUI/GLCanvas3D.cpp:4064 +#: src/slic3r/GUI/GLCanvas3D.cpp:4160 msgid "Arrange options" msgstr "옵션 정렬" -#: src/slic3r/GUI/GLCanvas3D.cpp:4097 +#: src/slic3r/GUI/GLCanvas3D.cpp:4193 #, boost-format msgid "Press %1%left mouse button to enter the exact value" msgstr "%1% 왼쪽 마우스 버튼을 눌러 정확한 값을 입력합니다." -#: src/slic3r/GUI/GLCanvas3D.cpp:4099 +#: src/slic3r/GUI/GLCanvas3D.cpp:4195 msgid "Spacing" msgstr "간격" -#: src/slic3r/GUI/GLCanvas3D.cpp:4106 -msgid "Enable rotations (slow)" -msgstr "회전 활성화(느린)" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -#, fuzzy -msgid "Alignment" -msgstr "정렬(&A)" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:4500 -msgid "Center" -msgstr "중앙" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear left" +#: src/slic3r/GUI/GLCanvas3D.cpp:4202 +msgid "Spacing from bed" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front left" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front right" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear right" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:2271 -msgid "Random" -msgstr "무작위" +#: src/slic3r/GUI/GLCanvas3D.cpp:4209 +msgid "Enable rotations (slow)" +msgstr "회전 활성화(느린)" -#: src/slic3r/GUI/GLCanvas3D.cpp:4133 src/slic3r/GUI/GLCanvas3D.cpp:4565 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Plater.cpp:1664 +#: src/slic3r/GUI/GLCanvas3D.cpp:4228 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 src/slic3r/GUI/Plater.cpp:7118 msgid "Arrange" msgstr "정렬" -#: src/slic3r/GUI/GLCanvas3D.cpp:4539 +#: src/slic3r/GUI/GLCanvas3D.cpp:4630 msgid "Add..." msgstr "더하기..." -#: src/slic3r/GUI/GLCanvas3D.cpp:4556 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5509 src/slic3r/GUI/Tab.cpp:4158 +#: src/slic3r/GUI/GLCanvas3D.cpp:4647 src/slic3r/GUI/KBShortcutsDialog.cpp:105 +#: src/slic3r/GUI/Plater.cpp:6047 src/slic3r/GUI/Tab.cpp:4383 msgid "Delete all" msgstr "모두 삭제" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 src/slic3r/GUI/KBShortcutsDialog.cpp:133 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 src/slic3r/GUI/KBShortcutsDialog.cpp:142 msgid "Arrange selection" msgstr "선택 정렬" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 msgid "Click right mouse button to show arrangement options" msgstr "오른쪽 마우스 버튼을 클릭하여 배열 옵션을 표시합니다." -#: src/slic3r/GUI/GLCanvas3D.cpp:4587 +#: src/slic3r/GUI/GLCanvas3D.cpp:4676 msgid "Copy" msgstr "복사" -#: src/slic3r/GUI/GLCanvas3D.cpp:4596 +#: src/slic3r/GUI/GLCanvas3D.cpp:4685 msgid "Paste" msgstr "붙여넣기" -#: src/slic3r/GUI/GLCanvas3D.cpp:4608 src/slic3r/GUI/GUI_Factories.cpp:1084 -#: src/slic3r/GUI/GUI_Factories.cpp:1108 src/slic3r/GUI/GUI_Factories.cpp:1119 +#: src/slic3r/GUI/GLCanvas3D.cpp:4697 src/slic3r/GUI/GUI_Factories.cpp:1237 +#: src/slic3r/GUI/GUI_Factories.cpp:1261 src/slic3r/GUI/GUI_Factories.cpp:1272 msgid "Add instance" msgstr "인스턴스 추가" -#: src/slic3r/GUI/GLCanvas3D.cpp:4619 src/slic3r/GUI/GUI_Factories.cpp:1087 +#: src/slic3r/GUI/GLCanvas3D.cpp:4708 src/slic3r/GUI/GUI_Factories.cpp:1240 msgid "Remove instance" msgstr "인스턴스 제거" -#: src/slic3r/GUI/GLCanvas3D.cpp:4632 +#: src/slic3r/GUI/GLCanvas3D.cpp:4721 msgid "Split to objects" msgstr "오브젝트별 분할" -#: src/slic3r/GUI/GLCanvas3D.cpp:4642 +#: src/slic3r/GUI/GLCanvas3D.cpp:4731 msgid "Split to parts" msgstr "파트별 분할" -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/GLCanvas3D.cpp:4795 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/GLCanvas3D.cpp:4874 msgid "Click right mouse button to open/close History" msgstr "오른쪽 마우스 버튼을 클릭하여 기록을 열/닫습니다." -#: src/slic3r/GUI/GLCanvas3D.cpp:4779 +#: src/slic3r/GUI/GLCanvas3D.cpp:4859 #, boost-format msgid "Next Undo action: %1%" msgstr "다음 작업 실행 취소 : %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:4795 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/GLCanvas3D.cpp:4874 src/slic3r/GUI/KBShortcutsDialog.cpp:107 +#: src/slic3r/GUI/MainFrame.cpp:1429 msgid "Redo" msgstr "다시 실행" -#: src/slic3r/GUI/GLCanvas3D.cpp:4817 +#: src/slic3r/GUI/GLCanvas3D.cpp:4895 #, boost-format msgid "Next Redo action: %1%" msgstr "다음 작업 다시 실행: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:6434 +#: src/slic3r/GUI/GLCanvas3D.cpp:6784 msgid "An object outside the print area was detected." msgstr "인쇄 영역 외부의 물체가 감지되었습니다." -#: src/slic3r/GUI/GLCanvas3D.cpp:6435 +#: src/slic3r/GUI/GLCanvas3D.cpp:6785 msgid "A toolpath outside the print area was detected." msgstr "인쇄 영역 외부의 도구 경로가 감지되었습니다." -#: src/slic3r/GUI/GLCanvas3D.cpp:6436 +#: src/slic3r/GUI/GLCanvas3D.cpp:6786 msgid "SLA supports outside the print area were detected." msgstr "인쇄 영역 외부의 SLA 지지대가 감지되었습니다." -#: src/slic3r/GUI/GLCanvas3D.cpp:6437 +#: src/slic3r/GUI/GLCanvas3D.cpp:6787 msgid "Some objects are not visible during editing." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6439 +#: src/slic3r/GUI/GLCanvas3D.cpp:6789 msgid "" "An object outside the print area was detected.\n" "Resolve the current problem to continue slicing." @@ -2459,319 +2642,1339 @@ msgstr "" "인쇄 영역 외부의 물체가 감지되었습니다.\n" "현재 문제를 해결하여 계속 슬라이싱합니다." -#: src/slic3r/GUI/GLCanvas3D.cpp:6513 +#: src/slic3r/GUI/GLCanvas3D.cpp:6864 msgid "Selection-Add from rectangle" msgstr "선택-사각형에서 추가" -#: src/slic3r/GUI/GLCanvas3D.cpp:6528 +#: src/slic3r/GUI/GLCanvas3D.cpp:6879 msgid "Selection-Remove from rectangle" msgstr "선택 영역-사각형에서 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4478 -msgid "Cut" -msgstr "잘라내기" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:206 +msgid "Planar" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Auto" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Manual" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:213 +msgid "Plug" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:214 +msgid "Dowel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Prism" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Frustum" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Triangle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Square" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Hexagon" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:59 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 +msgid "Circle" +msgstr "원형" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:233 +msgid "Keep orientation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:234 +msgid "Place on cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:235 +msgid "Flip upside down" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +msgid "inch" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 +msgid "Part" +msgstr "부품" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 src/libslic3r/Print.cpp:1236 +msgid "Object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:264 +msgid "" +"Click to flip the cut plane\n" +"Drag to move the cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:269 src/libslic3r/PrintConfig.cpp:498 +#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2325 src/libslic3r/PrintConfig.cpp:2613 +#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2876 src/libslic3r/PrintConfig.cpp:2907 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3231 +#: src/libslic3r/PrintConfig.cpp:3466 src/libslic3r/PrintConfig.cpp:3951 +msgid "°" +msgstr "°" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:367 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:571 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1232 +msgid "Move cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 msgid "in" msgstr "에서" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 -msgid "Keep upper part" -msgstr "상부 유지" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:544 +msgid "Value" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 -msgid "Keep lower part" -msgstr "낮은 부분 유지" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:549 +msgid "Tolerance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:196 -msgid "Rotate lower part upwards" -msgstr "아래쪽 부분을 위쪽으로 회전" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 +msgid "Left click" +msgstr "왼쪽 클릭" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:201 -msgid "Perform cut" -msgstr "절단 수행" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2348 +msgid "Add connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:49 -msgid "Paint-on supports" -msgstr "페인트 온 지원" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 +msgid "Right click" +msgstr "오른쪽 클릭" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 -msgid "Clipping of view" -msgstr "갈무리된것 보기" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +msgid "Remove connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 -msgid "Reset direction" -msgstr "방향 재설정" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 +msgid "Drag" +msgstr "드래그" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 -msgid "Brush size" -msgstr "브러쉬 크기" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1216 +msgid "Move connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 -msgid "Brush shape" -msgstr "브러시 모양" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +msgid "Add connector to selection" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 -msgid "Left mouse button" -msgstr "왼쪽 마우스 버튼" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +msgid "Remove connector from selection" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 -msgid "Enforce supports" -msgstr "지원 적용" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:870 +msgid "Select all connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 -msgid "Right mouse button" -msgstr "오른쪽 마우스 버튼" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:894 src/libslic3r/PrintConfig.cpp:4644 +msgid "Cut" +msgstr "잘라내기" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:434 -msgid "Block supports" -msgstr "블록 지원" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1227 +msgid "Rotate cut plane" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 -msgid "Shift + Left mouse button" -msgstr "시프트 + 왼쪽 마우스 버튼" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1448 +msgid "Render cut plane as circle" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:429 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 -msgid "Remove selection" -msgstr "선택 영역 제거" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1537 +msgid "Connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 -msgid "Remove all selection" -msgstr "모든 선택 영역 제거" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1541 +msgid "Remove connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 -msgid "Circle" -msgstr "원형" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1550 +msgid "Type" +msgstr "타입" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 -#: src/slic3r/GUI/GUI_Factories.cpp:461 -msgid "Sphere" -msgstr "영역" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1561 src/libslic3r/PrintConfig.cpp:2816 +msgid "Style" +msgstr "모양새" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:68 -#: src/libslic3r/PrintConfig.cpp:1172 -msgid "Triangles" -msgstr "삼각형(Triangles)" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1568 +msgid "Depth ratio" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 -msgid "Highlight overhang by angle" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1586 +msgid "Confirm connectors" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 -msgid "Enforce" -msgstr "첫 번째 n 개의 레이어에 대한 서포트 강화" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1652 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1666 +msgid "Flip cut plane" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 -msgid "Tool type" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1710 +msgid "Hold SHIFT key to draw a cut line" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 -msgid "Brush" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1716 +msgid "Cut position: " msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:128 -msgid "Smart fill" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1725 +msgid "Reset cutting plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:131 -msgid "Smart fill angle" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Edit connectors" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:132 -msgid "Split triangles" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Add connectors" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 -msgid "On overhangs only" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1744 +msgid "Reset cut" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:174 -#, boost-format -msgid "" -"Preselects faces by overhang angle. It is possible to restrict paintable " -"facets to only preselected faces when the option \"%1%\" is enabled." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1745 +msgid "Reset cutting plane and remove connectors" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:217 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:378 -msgid "Paints facets according to the chosen painting brush." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1800 +msgid "After cut" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:391 -msgid "" -"Paints neighboring facets whose relative angle is less or equal to set angle." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1820 +msgid "Cut to" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:229 -#, boost-format -msgid "Allows painting only on facets selected by: \"%1%\"" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1823 +msgid "Objects" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:244 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:419 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:144 -msgid "Paints all facets inside, regardless of their orientation." -msgstr "방향에 관계없이 내부에 모든 면을 페인트합니다." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1826 +msgid "Parts" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:253 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:428 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:152 -msgid "Ignores facets facing away from the camera." -msgstr "카메라에서 멀리 향하는 면을 무시합니다." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1840 +msgid "Perform cut" +msgstr "절단 수행" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:262 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:437 -msgid "Paints only one facet." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1930 +msgid "Invalid connectors detected" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:270 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:285 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:445 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:462 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:132 -msgid "Alt + Mouse wheel" -msgstr "Alt + 마우스 휠" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1932 +#, c-format, boost-format +msgid "%1$d connector is out of cut contour" +msgid_plural "%1$d connectors are out of cut contour" +msgstr[0] "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 -msgid "Splits bigger facets into smaller ones while the object is painted." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1935 +#, c-format, boost-format +msgid "%1$d connector is out of object" +msgid_plural "%1$d connectors are out of object" +msgstr[0] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1938 +msgid "Some connectors are overlapped" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:308 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:483 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:170 -msgid "Ctrl + Mouse wheel" -msgstr "Ctrl + 마우스 휠" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1942 +msgid "" +"Invalid state. \n" +"No one part is selected for keep after cut" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:313 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:488 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:175 -msgid "Reset selection" -msgstr "선택 재설정" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1944 +msgid "" +"Warning state. \n" +"Cut plane is placed out of object" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:364 -msgid "Block supports by angle" -msgstr "블록 지지대 각도별" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2153 +msgid "Connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:365 -msgid "Add supports by angle" -msgstr "각도별로 지지성 추가" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2183 +msgid "Cut by Plane" +msgstr "평면으로 절단" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2323 +msgid "Cut by line" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2373 +msgid "Delete connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:252 +msgid "Entering Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:253 +msgid "Leaving Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:254 +msgid "Cut gizmo editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:601 +msgid "Emboss" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:866 +msgid "ERROR: Wait until ends or Cancel process." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:921 +msgid "Text-Rotate" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:953 +msgid "Font" +msgstr "Font" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:954 +#: src/libslic3r/PrintConfig.cpp:897 +msgid "Height" +msgstr "높이" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:955 +msgid "Depth" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:963 +msgid "Use surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:964 +msgid "Char gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:965 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Line gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:966 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:967 +msgid "Skew ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:968 +msgid "Z-move" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:969 +msgid "Z-rot" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:970 +msgid "Collection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1047 +msgid "NORMAL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1048 +msgid "SMALL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1049 +msgid "ITALIC" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1050 +msgid "SWISS" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1051 +msgid "MODERN" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1088 +msgid "First font" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1093 +msgid "Default font" +msgstr "기본 글꼴" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1098 +msgid "Embossed text" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1513 +msgid "Warning: No font is selected. Select correct one." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1531 +#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1437 +#: src/slic3r/GUI/Tab.cpp:1472 src/slic3r/GUI/Tab.cpp:1607 +#: src/slic3r/GUI/Tab.cpp:1611 src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:2390 src/slic3r/GUI/Tab.cpp:4985 +#: src/libslic3r/PrintConfig.cpp:276 src/libslic3r/PrintConfig.cpp:514 +#: src/libslic3r/PrintConfig.cpp:1484 src/libslic3r/PrintConfig.cpp:1566 +#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:2562 +#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:3166 +#: src/libslic3r/PrintConfig.cpp:3200 src/libslic3r/PrintConfig.cpp:3211 +#: src/libslic3r/PrintConfig.cpp:3226 src/libslic3r/PrintConfig.cpp:3239 +#: src/libslic3r/PrintConfig.cpp:3248 src/libslic3r/PrintConfig.cpp:3260 +#: src/libslic3r/PrintConfig.cpp:3642 +msgid "Advanced" +msgstr "고급" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1631 +msgid "Can't write text by selected font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1632 +msgid "Try to choose another font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Empty" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Embossed text can NOT contain only white spaces." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Bad symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Text contain character glyph (represented by '?') unknown by font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:535 +msgid "Skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +msgid "Unsupported visualization of font skew for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Unsupported visualization of font boldness for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Unsupported visualization of gap between lines inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Too tall" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Diminished font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Too small" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Enlarged font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1660 +#, boost-format +msgid "%1% is NOT shown." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1964 +msgid " No symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1965 +msgid " ... Loading" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2015 +msgid " ... In queue" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2132 +#, boost-format +msgid "Font face \"%1%\" can't be selected." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2180 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:754 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:367 +msgid "Apply" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2192 +msgid "add file with font(.ttf, .ttc)" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2202 +msgid "Open dialog for choose from fonts." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2210 +msgid "Text is to object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2224 +msgid "Added" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2227 +msgid "Click to change text into object part." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2230 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4321 +msgid "You can't change a type of the last solid part of the object." +msgstr "객체(object)의 마지막 부품(Part) 유형은 변경할 수 없습니다." + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2231 +msgid "Subtracted" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2237 +msgid "Click to change part type into negative volume." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2243 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4338 +msgid "Modifier" +msgstr "편집" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2249 +msgid "Click to change part type into modifier." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2256 +msgid "Change Text Type" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2287 +#, boost-format +msgid "Rename style(%1%) for embossing text: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2299 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2384 +msgid "Name can't be empty." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2301 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2386 +msgid "Name has to be unique." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2310 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2397 +msgid "ok" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2312 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2401 +msgid "cancel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2337 +msgid "Rename style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2344 +msgid "Rename current style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2345 +msgid "Can't rename temporary style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2362 +msgid "First Add style to list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2364 +#, boost-format +msgid "Save %1% style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2366 +msgid "No changes to save." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2373 +msgid "New name of style: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2422 +msgid "Save as new style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2434 +msgid "Only valid font can be added to style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2436 +msgid "Add style to my list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2438 +msgid "Add as new named style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2454 +msgid "Remove style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2485 +#, boost-format +msgid "Delete \"%1%\" style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2486 +#, boost-format +msgid "Can't delete \"%1%\". It is last style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2487 +#, boost-format +msgid "Can't delete temporary style \"%1%\"." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2494 +#, boost-format +msgid "" +"Are you sure,\n" +"that you want permanently and unrecoverable \n" +"remove style \"%1%\"?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2496 +msgid "Yes" +msgstr "예" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2505 +msgid "No" +msgstr "아니오" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2555 +msgid "Presets" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2564 src/slic3r/GUI/GUI_App.cpp:2324 +msgid "modified" +msgstr "변경" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2617 +#, boost-format +msgid "Modified style \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2618 +#, boost-format +msgid "Current style is \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2625 +msgid "Style modification will be lost." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2627 +#, boost-format +msgid "" +"Changing style to '%1%' will discard current style modification.\n" +"\n" +" Would you like to continue anyway?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2643 +msgid "Not valid style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2644 +#, boost-format +msgid "Style '%1%' can't be used and will be removed from list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2691 +msgid "Unset italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2708 +msgid "Set italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2738 +msgid "Unset bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2756 +msgid "Set bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2922 +msgid "WxFont is not loaded properly." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2957 +msgid "Revert font changes." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2991 +msgid "wx Make bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3002 +msgid "Revert text size." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3029 +msgid "Revert embossed depth." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3178 +msgid "" +"Advanced font options could be changed only for correct font.\n" +"Start with select correct font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3219 +msgid "Revert using of model surface." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3232 +msgid "font points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3241 +msgid "Revert gap between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3242 +msgid "Distance between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3257 +msgid "Revert gap between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3258 +msgid "Distance between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3272 +msgid "Undo boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3273 +msgid "Tiny / Wide glyphs" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3283 +msgid "Undo letter's skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3284 +msgid "Italic strength ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3304 +msgid "Undo translation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3305 +msgid "Distance of the center of text from model surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3350 +msgid "Undo rotation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3352 +msgid "Rotate text Clock-wise." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3386 +msgid "Select from True Type Collection." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3395 +msgid "Set text to face camera" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3402 +msgid "Use camera direction for text orientation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3486 +#, boost-format +msgid "Font '%1%' can't be used. Please select another." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3488 +msgid "Selected font is NOT True-type." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3512 +msgid "Choose one or more files (TTF, TTC):" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3539 +msgid "Choose SVG file:" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3600 +#, boost-format +msgid "" +"Can't load exactly same font(\"%1%\"), Aplication selected a similar " +"one(\"%2%\"). You have to specify font for enable edit text." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:81 +msgid "Enter emboss gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:82 +msgid "Leave emboss gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:83 +msgid "Embossing actions" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:37 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:66 +msgid "Paint-on supports" +msgstr "페인트 온 지원" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 +msgid "Automatic painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 +msgid "painting..." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:107 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +msgid "Clipping of view" +msgstr "갈무리된것 보기" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:106 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 +msgid "Reset direction" +msgstr "방향 재설정" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:108 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 +msgid "Brush size" +msgstr "브러쉬 크기" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:109 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 +msgid "Brush shape" +msgstr "브러시 모양" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1816 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:110 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 +msgid "Left mouse button" +msgstr "왼쪽 마우스 버튼" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 +msgid "Enforce supports" +msgstr "지원 적용" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 +msgid "Right mouse button" +msgstr "오른쪽 마우스 버튼" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:573 +msgid "Block supports" +msgstr "블록 지원" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 +msgid "Shift + Left mouse button" +msgstr "시프트 + 왼쪽 마우스 버튼" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:568 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:247 +msgid "Remove selection" +msgstr "선택 영역 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 +msgid "Remove all selection" +msgstr "모든 선택 영역 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 +#: src/slic3r/GUI/GUI_Factories.cpp:481 +msgid "Sphere" +msgstr "영역" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:106 +#: src/libslic3r/PrintConfig.cpp:1231 +msgid "Triangles" +msgstr "삼각형(Triangles)" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 +msgid "Highlight overhang by angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:63 +msgid "Enforce" +msgstr "첫 번째 n 개의 레이어에 대한 서포트 강화" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +msgid "Tool type" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 +msgid "Brush" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:68 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 +msgid "Smart fill" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 +msgid "Smart fill angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:72 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 +msgid "Split triangles" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:73 +msgid "On overhangs only" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:187 +#, boost-format +msgid "" +"Preselects faces by overhang angle. It is possible to restrict paintable " +"facets to only preselected faces when the option \"%1%\" is enabled." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:230 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:371 +msgid "Paints facets according to the chosen painting brush." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:238 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:384 +msgid "" +"Paints neighboring facets whose relative angle is less or equal to set angle." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242 +#, boost-format +msgid "Allows painting only on facets selected by: \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:257 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:412 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141 +msgid "Paints all facets inside, regardless of their orientation." +msgstr "방향에 관계없이 내부에 모든 면을 페인트합니다." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:266 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:421 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:149 +msgid "Ignores facets facing away from the camera." +msgstr "카메라에서 멀리 향하는 면을 무시합니다." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:430 +msgid "Paints only one facet." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:298 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:438 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:455 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:129 +msgid "Alt + Mouse wheel" +msgstr "Alt + 마우스 휠" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:288 +msgid "Splits bigger facets into smaller ones while the object is painted." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:321 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:476 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:167 +msgid "Ctrl + Mouse wheel" +msgstr "Ctrl + 마우스 휠" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:326 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:481 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:172 +msgid "Reset selection" +msgstr "선택 재설정" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:382 +msgid "Block supports by angle" +msgstr "블록 지지대 각도별" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:383 +msgid "Add supports by angle" +msgstr "각도별로 지지성 추가" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +msgid "Automatic painting requires valid print setup." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:535 +msgid "Automatic painting will erase all currently painted areas." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:536 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1118 +msgid "Are you sure you want to do it?" +msgstr "당신은 그것을 하시겠습니까?" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:540 +msgid "Automatic painting support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:571 +msgid "Add supports" +msgstr "지원 추가" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:22 +msgid "Entering Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:23 +msgid "Leaving Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:24 +msgid "Paint-on supports editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:88 +msgid "Place on face" +msgstr "물체(Gizmo)를 배드위로" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:29 +msgid "Hollow this object" +msgstr "이 개체 중공" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 +msgid "Preview hollowed and drilled model" +msgstr "공동화된 모델 미리보기" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 +msgid "Offset" +msgstr "오프셋" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 +msgid "Quality" +msgstr "품질" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 +#: src/libslic3r/PrintConfig.cpp:4037 +msgid "Closing distance" +msgstr "닫힘 거리" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 +msgid "Hole diameter" +msgstr "구멍 직경" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 +msgid "Hole depth" +msgstr "구멍 깊이" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 +msgid "Remove selected holes" +msgstr "선택한 구멍 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 +msgid "Remove all holes" +msgstr "모든 구멍 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 +msgid "Show supports" +msgstr "지원 표시" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:242 +msgid "Add drainage hole" +msgstr "배수 구멍 추가" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:361 +msgid "Delete drainage hole" +msgstr "배수 구멍 삭제" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:655 +msgid "Hollowing parameter change" +msgstr "공동화 변수 변경" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:739 +msgid "Change drainage hole diameter" +msgstr "배수 구멍 직경 변경" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:827 +msgid "Hollow and drill" +msgstr "중공 및 드릴" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:869 +msgid "Move drainage hole" +msgstr "구멍 이동" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:64 +msgid "No feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:65 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:76 +msgid "Vertex" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:66 +msgid "Edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:68 +msgid "Plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:77 +msgid "Point on edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:78 +msgid "Point on circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:79 +msgid "Point on plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:89 +msgid "Center of edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:90 +msgid "Center of circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:554 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2029 +msgid "Measure" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1236 +msgid "Edit to scale" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1258 +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:161 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:236 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:776 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:794 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:817 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:831 +#: src/libslic3r/PrintConfig.cpp:4713 +msgid "Scale" +msgstr "크기" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1362 +msgctxt "Verb" +msgid "Scale" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1541 +msgid "##angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1740 +msgid "Measure tool debug" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1824 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1851 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1857 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1886 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1893 +msgid "Unselect feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1830 +msgid "Unselect center" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:432 -msgid "Add supports" -msgstr "지원 추가" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1835 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1862 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1898 +msgid "Select center" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:41 -msgid "Place on face" -msgstr "물체(Gizmo)를 배드위로" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1840 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1867 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1903 +msgid "Unselect point" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 -msgid "Hollow this object" -msgstr "이 개체 중공" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1846 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1873 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1910 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select feature" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 -msgid "Preview hollowed and drilled model" -msgstr "공동화된 모델 미리보기" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select point" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 -msgid "Offset" -msgstr "오프셋" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Shift" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:57 -msgid "Quality" -msgstr "품질" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Enable point selection" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3905 -msgid "Closing distance" -msgstr "닫힘 거리" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2007 +msgid "Restart selection" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 -msgid "Hole diameter" -msgstr "구멍 직경" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1952 +msgid "Esc" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 -msgid "Hole depth" -msgstr "구멍 깊이" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1955 +msgid "Unselect" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 -msgid "Remove selected holes" -msgstr "선택한 구멍 제거" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1999 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2001 +msgid "Selection" +msgstr "선택" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 -msgid "Remove all holes" -msgstr "모든 구멍 제거" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2021 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +msgid "Copy to clipboard" +msgstr "클립보드로 복사" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 -msgid "Show supports" -msgstr "지원 표시" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2038 +msgid "Angle" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:287 -msgid "Add drainage hole" -msgstr "배수 구멍 추가" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Perpendicular distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:403 -msgid "Delete drainage hole" -msgstr "배수 구멍 삭제" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:590 -msgid "Hollowing parameter change" -msgstr "공동화 변수 변경" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2062 +msgid "Direct distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:667 -msgid "Change drainage hole diameter" -msgstr "배수 구멍 직경 변경" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2072 +msgid "Distance XYZ" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:761 -msgid "Hollow and drill" -msgstr "중공 및 드릴" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:163 +msgid "Entering Measure gizmo" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:811 -msgid "Move drainage hole" -msgstr "구멍 이동" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:164 +msgid "Leaving Measure gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:165 +msgid "Measure gizmo editing" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:27 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:28 #, boost-format msgid "" "Your printer has more extruders than the multi-material painting gizmo " @@ -2779,81 +3982,85 @@ msgid "" "used for painting." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:45 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:46 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 msgid "Multimaterial painting" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 msgid "First color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 msgid "Second color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:120 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:671 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:642 msgid "Remove painted color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 msgid "Clear all" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:129 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 msgid "Bucket fill" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:404 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:397 msgid "Paints neighboring facets that have the same color." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:450 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:443 msgid "Split bigger facets into smaller ones while the object is painted." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:674 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:645 #, boost-format msgid "Painted using: Extruder %1%" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:118 +msgid "Entering Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:119 +msgid "Leaving Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:120 +msgid "Multimaterial painting editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:76 msgid "Move" msgstr "이동" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:466 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4532 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:643 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:745 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:775 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:813 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:830 +#: src/libslic3r/PrintConfig.cpp:4698 msgid "Rotate" msgstr "회전" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:505 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:707 msgid "Optimize orientation" msgstr "방향 최적화" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:552 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:319 -msgid "Apply" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:79 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4547 -msgid "Scale" -msgstr "크기" +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:194 +msgid "Gizmo-Scale" +msgstr "개체(Gizmo) 배율" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 msgid "Enforce seam" msgstr "적용 솔기" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:38 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:255 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:252 msgid "Block seam" msgstr "블록 솔기" @@ -2861,330 +4068,334 @@ msgstr "블록 솔기" msgid "Seam painting" msgstr "솔기 페인팅" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:23 +msgid "Entering Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:24 +msgid "Leaving Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:25 +msgid "Paint-on seam editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:105 msgid "Mesh name" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:69 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:107 msgid "Detail level" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:108 msgid "Decimate ratio" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:113 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:147 #, boost-format msgid "" "Processing model '%1%' with more than 1M triangles could be slow. It is " -"highly recommend to reduce amount of triangles." +"highly recommended to reduce amount of triangles." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:116 -#: src/slic3r/GUI/GUI_Factories.cpp:705 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:150 +#: src/slic3r/GUI/GUI_Factories.cpp:789 msgid "Simplify model" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:143 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:177 msgid "Simplify" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:156 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:190 msgid "Simplification is currently only allowed when a single part is selected" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 -#: src/slic3r/GUI/PrintHostDialogs.cpp:373 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:191 +#: src/slic3r/GUI/MainFrame.cpp:1246 src/slic3r/GUI/MainFrame.cpp:1716 +#: src/slic3r/GUI/PrintHostDialogs.cpp:425 msgid "Error" msgstr "오류" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:250 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:294 msgid "Extra high" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:251 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:295 msgid "High" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:252 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:296 msgid "Medium" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:297 msgid "Low" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:254 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:298 msgid "Extra low" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:304 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#, boost-format +msgid "" +"Multipart object can be simplified only by %1%. If you want specify %2% " +"process it separately." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:352 #, c-format, boost-format msgid "%d triangles" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:307 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:355 msgid "Show wireframe" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:313 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:361 msgid "Operation already cancelling. Please wait few seconds." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:370 msgid "Can't apply when proccess preview." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:329 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:377 #, boost-format msgid "Process %1% / 100" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:479 -#, boost-format -msgid "Simplify %1%" +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:542 +msgid "Simplify " msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:543 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"simplifying the mesh." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:67 +msgid "Entering SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:68 +msgid "Leaving SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:35 msgid "Head diameter" msgstr "머리 직경" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:36 msgid "Lock supports under new islands" msgstr "새영역에서 서포트 잠금 지원" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:37 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268 msgid "Remove selected points" msgstr "선택한 지점 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:38 msgid "Remove all points" msgstr "모든 지점 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1226 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1271 msgid "Apply changes" msgstr "적용하기" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1227 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1272 msgid "Discard changes" msgstr "변경사항을 취소" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 msgid "Minimal points distance" msgstr "최소한의 지점 거리" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3735 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/libslic3r/PrintConfig.cpp:3867 msgid "Support points density" msgstr "서포트 지점 밀도" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1229 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1274 msgid "Auto-generate points" msgstr "지점 자동 생성" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 msgid "Manual editing" msgstr "수동 편집" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:372 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:307 msgid "Add support point" msgstr "서포트 지점 추가" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:522 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:460 msgid "Delete support point" msgstr "서포트 지점 삭제" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:702 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:626 msgid "Change point head diameter" msgstr "변경된 해드의 끝 점 지름" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:770 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:696 msgid "Support parameter change" msgstr "서포트 매개 변수 변경" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:876 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:806 msgid "SLA Support Points" msgstr "SLA 서포트 지점" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:814 msgid "Do you want to save your manually edited support points?" msgstr "수동으로 편집한 서포트 지점을 저장 하시 겠습니까?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:898 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:815 msgid "Save support points?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:958 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:880 msgid "Move support point" msgstr "서포트 지점 이동" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1051 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:987 msgid "Support points edit" msgstr "서포트 지점 편집" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1131 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1117 msgid "Autogeneration will erase all manually edited points." msgstr "자동 생성은 수동으로 편집된 모든 지점을 지웁웁입니다." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1132 -msgid "Are you sure you want to do it?" -msgstr "당신은 그것을 하시겠습니까?" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1138 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1124 msgid "Autogenerate support points" msgstr "서포트 자동 생성" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1186 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 msgid "SLA gizmo keyboard shortcuts" msgstr "SLA 물체(gizmo) 바로 가기" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1197 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1242 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "참고: 일부 단축키는 (비)편집 모드 에서만 작동 합니다." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 -msgid "Left click" -msgstr "왼쪽 클릭" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 msgid "Add point" msgstr "지점 추가" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 -msgid "Right click" -msgstr "오른쪽 클릭" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 msgid "Remove point" msgstr "점 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 -msgid "Drag" -msgstr "드래그" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 msgid "Move point" msgstr "지점 이동" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 msgid "Add point to selection" msgstr "선택 영역에 지점 추가" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 msgid "Remove point from selection" msgstr "선택 영역에서 지점 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 msgid "Select by rectangle" msgstr "사각형으로 선택" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 msgid "Deselect by rectangle" msgstr "사각형으로 선택 해제" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1267 msgid "Select all points" msgstr "모든 지점들 선택" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Mouse wheel" msgstr "마우스 휠: " -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Move clipping plane" msgstr "갈무리된 평면 이동" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1225 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1270 msgid "Reset clipping plane" msgstr "갈무리된 평면 재설정" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1228 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273 msgid "Switch to editing mode" msgstr "편집 모드로 전환" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:196 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:204 msgid "" "ERROR: Please close all manipulators available from the left toolbar first" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:561 -msgid "Gizmo-Scale" -msgstr "개체(Gizmo) 배율" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:673 -msgid "Gizmo-Place on Face" -msgstr "물체(Gizmo)를 배드위로" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:1270 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:998 msgid "" "You are currently editing SLA support points. Please, apply or discard your " "changes first." msgstr "" -#: src/slic3r/GUI/GUI.cpp:292 +#: src/slic3r/GUI/GUI.cpp:287 msgid "Undefined" msgstr "" -#: src/slic3r/GUI/GUI.cpp:317 +#: src/slic3r/GUI/GUI.cpp:308 #, boost-format msgid "%1% was substituted with %2%" msgstr "" -#: src/slic3r/GUI/GUI.cpp:326 +#: src/slic3r/GUI/GUI.cpp:317 msgid "" "Most likely the configuration was produced by a newer version of PrusaSlicer " "or by some PrusaSlicer fork." msgstr "" -#: src/slic3r/GUI/GUI.cpp:327 +#: src/slic3r/GUI/GUI.cpp:318 msgid "The following values were substituted:" msgstr "" -#: src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/GUI.cpp:319 msgid "Review the substitutions and adjust them if needed." msgstr "" -#: src/slic3r/GUI/GUI.cpp:338 src/slic3r/GUI/Plater.cpp:820 +#: src/slic3r/GUI/GUI.cpp:329 src/slic3r/GUI/Plater.cpp:850 msgid "SLA print settings" msgstr "SLA 인쇄 설정" -#: src/slic3r/GUI/GUI.cpp:342 src/slic3r/GUI/PhysicalPrinterDialog.cpp:157 +#: src/slic3r/GUI/GUI.cpp:333 src/slic3r/GUI/PhysicalPrinterDialog.cpp:158 msgid "Physical Printer" msgstr "실제 프린터" -#: src/slic3r/GUI/GUI.cpp:355 +#: src/slic3r/GUI/GUI.cpp:346 msgid "" "Configuration bundle was loaded, however some configuration values were not " "recognized." msgstr "" -#: src/slic3r/GUI/GUI.cpp:365 +#: src/slic3r/GUI/GUI.cpp:356 #, boost-format msgid "" "Configuration file \"%1%\" was loaded, however some configuration values " "were not recognized." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:266 +#: src/slic3r/GUI/GUI_App.cpp:275 msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." msgstr "" "프루사슬라이서는 알레산드로 라넬루치와 RepRap 커뮤니티 Slic3r를 기반으로합니" "다." -#: src/slic3r/GUI/GUI_App.cpp:267 +#: src/slic3r/GUI/GUI_App.cpp:276 msgid "Developed by Prusa Research." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:269 +#: src/slic3r/GUI/GUI_App.cpp:278 msgid "" "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." @@ -3192,11 +4403,11 @@ msgstr "" "Vojtech Bubnik, 엔리코 투리, 올렉산드라 이우셴코, 타마스 메사로스, 루카스 마" "테나, 보즈테크 크랄, 데이비드 코시크 및 수많은 다른 사람들에 의해 기여." -#: src/slic3r/GUI/GUI_App.cpp:270 -msgid "Artwork model by Leslie Ing" +#: src/slic3r/GUI/GUI_App.cpp:279 +msgid "Artwork model by Creative Tools" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:411 +#: src/slic3r/GUI/GUI_App.cpp:420 #, boost-format msgid "" "Starting with %1% 2.3, configuration directory on Linux has changed " @@ -3229,20 +4440,20 @@ msgstr "" "\n" "지금 무엇을 하고 싶으신가요?" -#: src/slic3r/GUI/GUI_App.cpp:419 +#: src/slic3r/GUI/GUI_App.cpp:428 #, c-format, boost-format msgid "%s - BREAKING CHANGE" msgstr "%s - 획기적인 변화" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Quit, I will move my data now" msgstr "종료, 지금 내 데이터를 이동합니다" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Start the application" msgstr "응용 프로그램 시작" -#: src/slic3r/GUI/GUI_App.cpp:699 +#: src/slic3r/GUI/GUI_App.cpp:725 #, c-format, boost-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -3257,11 +4468,11 @@ msgstr "" "\n" "이제 응용 프로그램이 종료됩니다." -#: src/slic3r/GUI/GUI_App.cpp:702 +#: src/slic3r/GUI/GUI_App.cpp:728 msgid "Fatal error" msgstr "치명적인 오류" -#: src/slic3r/GUI/GUI_App.cpp:706 +#: src/slic3r/GUI/GUI_App.cpp:732 msgid "" "PrusaSlicer has encountered a localization error. Please report to " "PrusaSlicer team, what language was active and in which scenario this issue " @@ -3274,16 +4485,16 @@ msgstr "" "\n" "이제 응용 프로그램이 종료됩니다." -#: src/slic3r/GUI/GUI_App.cpp:709 +#: src/slic3r/GUI/GUI_App.cpp:735 msgid "Critical error" msgstr "중요 오류" -#: src/slic3r/GUI/GUI_App.cpp:714 +#: src/slic3r/GUI/GUI_App.cpp:740 #, boost-format msgid "Internal error: %1%" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:909 src/slic3r/GUI/GUI_App.cpp:1007 +#: src/slic3r/GUI/GUI_App.cpp:954 src/slic3r/GUI/GUI_App.cpp:1051 msgid "" "Error parsing PrusaSlicer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error. Your user profiles will " @@ -3292,7 +4503,7 @@ msgstr "" "PrusaSlicer 구성 파일을 구문 분석하는 오류, 아마 손상된 것입니다. 파일을 수동" "으로 삭제하여 오류에 복구해 보십시오. 사용자 프로필은 영향을 받지 않습니다." -#: src/slic3r/GUI/GUI_App.cpp:915 src/slic3r/GUI/GUI_App.cpp:1013 +#: src/slic3r/GUI/GUI_App.cpp:960 src/slic3r/GUI/GUI_App.cpp:1057 msgid "" "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error." @@ -3300,12 +4511,12 @@ msgstr "" "오류 구문 분석 PrusaGCodeViewer 컨피그 파일, 그것은 아마 손상. 오류를 복구하" "기 위해 파일을 수동으로 삭제해 봅보십시오." -#: src/slic3r/GUI/GUI_App.cpp:962 +#: src/slic3r/GUI/GUI_App.cpp:1006 #, boost-format msgid "You are opening %1% version %2%." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:965 +#: src/slic3r/GUI/GUI_App.cpp:1009 #, boost-format msgid "" "The active configuration was created by %1% %2%,\n" @@ -3317,7 +4528,7 @@ msgid "" "configuration." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:973 +#: src/slic3r/GUI/GUI_App.cpp:1017 #, boost-format msgid "" "An existing configuration was found in %3%\n" @@ -3326,19 +4537,19 @@ msgid "" "Shall this configuration be imported?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:981 +#: src/slic3r/GUI/GUI_App.cpp:1025 msgid "Import" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:982 +#: src/slic3r/GUI/GUI_App.cpp:1026 msgid "Don't import" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:990 +#: src/slic3r/GUI/GUI_App.cpp:1034 msgid "Continue and import newer configuration?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1051 +#: src/slic3r/GUI/GUI_App.cpp:1095 msgid "" "You are running a 32 bit build of PrusaSlicer on 64-bit Windows.\n" "32 bit build of PrusaSlicer will likely not be able to utilize all the RAM " @@ -3348,7 +4559,7 @@ msgid "" "Do you wish to continue?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1134 +#: src/slic3r/GUI/GUI_App.cpp:1182 #, c-format, boost-format msgid "" "%s\n" @@ -3357,46 +4568,37 @@ msgstr "" "%s\n" "계속하시겠습니까?" -#: src/slic3r/GUI/GUI_App.cpp:1136 src/slic3r/GUI/GUI_App.cpp:3101 -#: src/slic3r/GUI/Plater.cpp:1726 src/slic3r/GUI/UnsavedChangesDialog.cpp:889 +#: src/slic3r/GUI/GUI_App.cpp:1184 src/slic3r/GUI/GUI_App.cpp:3302 +#: src/slic3r/GUI/Plater.cpp:1736 src/slic3r/GUI/UnsavedChangesDialog.cpp:917 msgid "Remember my choice" msgstr "선택 기억" -#: src/slic3r/GUI/GUI_App.cpp:1178 +#: src/slic3r/GUI/GUI_App.cpp:1226 msgid "Loading configuration" msgstr "로딩 구성" -#: src/slic3r/GUI/GUI_App.cpp:1209 -#, boost-format -msgid "New release version %1% is available." -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:1210 -msgid "See Download page." -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:1224 +#: src/slic3r/GUI/GUI_App.cpp:1257 #, boost-format msgid "New prerelease version %1% is available." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1225 +#: src/slic3r/GUI/GUI_App.cpp:1258 msgid "See Releases page." msgstr "릴리스 페이지를 참조하십시오." -#: src/slic3r/GUI/GUI_App.cpp:1262 +#: src/slic3r/GUI/GUI_App.cpp:1313 msgid "Preparing settings tabs" msgstr "설정 탭 준비" -#: src/slic3r/GUI/GUI_App.cpp:1336 src/slic3r/GUI/Preferences.cpp:287 +#: src/slic3r/GUI/GUI_App.cpp:1393 src/slic3r/GUI/Preferences.cpp:405 msgid "Restore window position on start" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1338 +#: src/slic3r/GUI/GUI_App.cpp:1395 msgid "PrusaSlicer started after a crash" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1339 +#: src/slic3r/GUI/GUI_App.cpp:1396 #, boost-format msgid "" "PrusaSlicer crashed last time when attempting to set window position.\n" @@ -3409,23 +4611,23 @@ msgid "" "Otherwise, the application will most likely crash again next time." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1351 +#: src/slic3r/GUI/GUI_App.cpp:1408 #, boost-format msgid "Disable \"%1%\"" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1352 +#: src/slic3r/GUI/GUI_App.cpp:1409 #, boost-format msgid "Leave \"%1%\" enabled" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1679 +#: src/slic3r/GUI/GUI_App.cpp:1780 msgid "" "You have the following presets with saved options for \"Print Host upload\"" msgstr "" "\"인쇄 호스트 업로드\"에 대한 저장된 옵션이 있는 다음 사전 설정이 있습니다." -#: src/slic3r/GUI/GUI_App.cpp:1683 +#: src/slic3r/GUI/GUI_App.cpp:1784 msgid "" "But since this version of PrusaSlicer we don't show this information in " "Printer Settings anymore.\n" @@ -3435,7 +4637,7 @@ msgstr "" "지 않습니다.\n" "설정은 실제 프린터 설정에서 사용할 수 있습니다." -#: src/slic3r/GUI/GUI_App.cpp:1685 +#: src/slic3r/GUI/GUI_App.cpp:1786 msgid "" "By default new Printer devices will be named as \"Printer N\" during its " "creation.\n" @@ -3444,169 +4646,174 @@ msgstr "" "기본적으로 새 프린터 장치는 생성 중에 \"프린터 N\"으로 지정됩니다.\n" "참고: 이 이름은 나중에 실제 프린터 설정에서 변경할 수 있습니다." -#: src/slic3r/GUI/GUI_App.cpp:1689 src/slic3r/GUI/PhysicalPrinterDialog.cpp:726 +#: src/slic3r/GUI/GUI_App.cpp:1790 src/slic3r/GUI/PhysicalPrinterDialog.cpp:798 msgid "Information" msgstr "정보" -#: src/slic3r/GUI/GUI_App.cpp:1702 src/slic3r/GUI/GUI_App.cpp:1713 +#: src/slic3r/GUI/GUI_App.cpp:1803 src/slic3r/GUI/GUI_App.cpp:1814 msgid "Recreating" msgstr "재현" -#: src/slic3r/GUI/GUI_App.cpp:1716 +#: src/slic3r/GUI/GUI_App.cpp:1817 msgid "Loading of current presets" msgstr "현재 기본 설정을 불러오기" -#: src/slic3r/GUI/GUI_App.cpp:1721 +#: src/slic3r/GUI/GUI_App.cpp:1822 msgid "Loading of a mode view" msgstr "보기 모드를 불러오기" -#: src/slic3r/GUI/GUI_App.cpp:1859 +#: src/slic3r/GUI/GUI_App.cpp:1961 msgid "Choose one file (3MF/AMF):" msgstr "파일(3MF/AMF) 선택:" -#: src/slic3r/GUI/GUI_App.cpp:1871 +#: src/slic3r/GUI/GUI_App.cpp:1973 msgid "Choose one or more files (STL/3MF/STEP/OBJ/AMF/PRUSA):" msgstr "파일을 선택하세요 (STL/3MF/STEP/OBJ/AMF/PRUSA):" -#: src/slic3r/GUI/GUI_App.cpp:1883 +#: src/slic3r/GUI/GUI_App.cpp:1984 +msgid "Choose ZIP file:" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1996 msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" msgstr "하나의 파일(GCODE/)을 선택합니다. GCO/. G/.ngc/NGC):" -#: src/slic3r/GUI/GUI_App.cpp:1894 +#: src/slic3r/GUI/GUI_App.cpp:2007 msgid "Changing of an application language" msgstr "응용 프로그램 언어 변경" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Select the language" msgstr "언어 선택" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Language" msgstr "언어" -#: src/slic3r/GUI/GUI_App.cpp:2182 -msgid "modified" -msgstr "변경" +#: src/slic3r/GUI/GUI_App.cpp:2363 +msgid "" +"Simple mode supports manipulation with single-part object(s)\n" +"or object(s) with support modifiers only." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2365 +msgid "Please check your object list before mode changing." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2366 +msgid "Change application mode" +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2236 +#: src/slic3r/GUI/GUI_App.cpp:2397 #, c-format, boost-format msgid "Run %s" msgstr "%s 실행하기" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "&Configuration Snapshots" msgstr "&구성 스냅샷" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "Inspect / activate configuration snapshots" msgstr "구성 스냅숏 검사/활성화" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Take Configuration &Snapshot" msgstr "구성 및 스냅샷 찍기" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Capture a configuration snapshot" msgstr "구성 스냅샷 캡처" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for Configuration Updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for configuration updates" msgstr "구성 업데이트 확인" -#: src/slic3r/GUI/GUI_App.cpp:2249 +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for Application Updates" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for new version of application" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2411 msgid "&Preferences" msgstr "기본 설정" -#: src/slic3r/GUI/GUI_App.cpp:2255 +#: src/slic3r/GUI/GUI_App.cpp:2417 msgid "Application preferences" msgstr "응용 프로그램 기본 설정" -#: src/slic3r/GUI/GUI_App.cpp:2260 src/slic3r/GUI/wxExtensions.cpp:708 -msgid "Simple" -msgstr "단순" - -#: src/slic3r/GUI/GUI_App.cpp:2260 +#: src/slic3r/GUI/GUI_App.cpp:2422 msgid "Simple View Mode" msgstr "기본 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:2262 src/slic3r/GUI/wxExtensions.cpp:710 -msgctxt "Mode" -msgid "Advanced" -msgstr "고급" - -#: src/slic3r/GUI/GUI_App.cpp:2262 +#: src/slic3r/GUI/GUI_App.cpp:2424 msgid "Advanced View Mode" msgstr "고급 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:2263 src/slic3r/GUI/wxExtensions.cpp:711 -msgid "Expert" -msgstr "전문가" - -#: src/slic3r/GUI/GUI_App.cpp:2263 +#: src/slic3r/GUI/GUI_App.cpp:2425 msgid "Expert View Mode" msgstr "전문가 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 msgid "Mode" msgstr "모드" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 #, c-format, boost-format msgid "%s View Mode" msgstr "%s 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:2271 +#: src/slic3r/GUI/GUI_App.cpp:2433 msgid "&Language" msgstr "언어(&L)" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Flash Printer &Firmware" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Upload a firmware image into an Arduino based printer" msgstr "아두이노 기반 프린터에 펌웨어 이미지 업로드" -#: src/slic3r/GUI/GUI_App.cpp:2294 +#: src/slic3r/GUI/GUI_App.cpp:2459 msgid "Taking a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2295 +#: src/slic3r/GUI/GUI_App.cpp:2460 msgid "" "Some presets are modified and the unsaved changes will not be captured by " "the configuration snapshot." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2296 +#: src/slic3r/GUI/GUI_App.cpp:2461 msgid "Snapshot name" msgstr "스냅샷 이름" -#: src/slic3r/GUI/GUI_App.cpp:2312 +#: src/slic3r/GUI/GUI_App.cpp:2477 msgid "Loading a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2321 +#: src/slic3r/GUI/GUI_App.cpp:2486 #, boost-format msgid "Continue to activate a configuration snapshot %1%?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2335 +#: src/slic3r/GUI/GUI_App.cpp:2500 msgid "Failed to activate configuration snapshot." msgstr "구성 스냅숏을 활성화하지 못했습니다." -#: src/slic3r/GUI/GUI_App.cpp:2354 -msgid "Restart application" -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:2388 +#: src/slic3r/GUI/GUI_App.cpp:2520 msgid "Language selection" msgstr "언어 선택" -#: src/slic3r/GUI/GUI_App.cpp:2391 +#: src/slic3r/GUI/GUI_App.cpp:2523 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." @@ -3614,142 +4821,172 @@ msgstr "" "언어를 전환 하면 응용 프로그램 재시작 합니다. 플레이트 위 오브젝트는 모두 지" "워집니다." -#: src/slic3r/GUI/GUI_App.cpp:2393 src/slic3r/GUI/Preferences.cpp:582 +#: src/slic3r/GUI/GUI_App.cpp:2525 src/slic3r/GUI/Preferences.cpp:730 +#: src/slic3r/GUI/Selection.cpp:1695 msgid "Do you want to proceed?" msgstr "계속 하시겠습니까?" -#: src/slic3r/GUI/GUI_App.cpp:2420 +#: src/slic3r/GUI/GUI_App.cpp:2552 msgid "&Configuration" msgstr "구성 노트" -#: src/slic3r/GUI/GUI_App.cpp:2534 src/slic3r/GUI/GUI_App.cpp:2595 -msgid "The preset modifications are successfully saved" -msgid_plural "The presets modifications are successfully saved" -msgstr[0] "" +#: src/slic3r/GUI/GUI_App.cpp:2560 +msgid "Restart application" +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2598 +#: src/slic3r/GUI/GUI_App.cpp:2726 msgid "For new project all modifications will be reseted" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2636 +#: src/slic3r/GUI/GUI_App.cpp:2764 msgid "Loading a new project while the current project is modified." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Project is loading" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Opening new project while some presets are unsaved." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "The uploads are still ongoing" msgstr "업로드는 여전히 진행 중입니다." -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "Stop them and continue anyway?" msgstr "그들을 중지하고 어쨌든 계속?" -#: src/slic3r/GUI/GUI_App.cpp:2662 +#: src/slic3r/GUI/GUI_App.cpp:2790 msgid "Ongoing uploads" msgstr "지속적인 업로드" -#: src/slic3r/GUI/GUI_App.cpp:2876 -msgid "It's impossible to print multi-part object(s) with SLA technology." -msgstr "SLA 방식을 사용 하여 다중 객체를 인쇄할 수는 없습니다." +#: src/slic3r/GUI/GUI_App.cpp:3026 +msgid "" +"It's impossible to print object(s) which contains parameter modifiers with " +"SLA technology." +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2877 src/slic3r/GUI/Jobs/SLAImportJob.cpp:235 -#: src/slic3r/GUI/Plater.cpp:2459 +#: src/slic3r/GUI/GUI_App.cpp:3027 src/slic3r/GUI/Jobs/SLAImportJob.cpp:149 +#: src/slic3r/GUI/Plater.cpp:2536 msgid "Please check your object list before preset changing." msgstr "미리 설정하기 전에 개체 목록을 확인하십시오." -#: src/slic3r/GUI/GUI_App.cpp:2901 +#: src/slic3r/GUI/GUI_App.cpp:3070 msgid "Configuration is editing from ConfigWizard" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2926 +#: src/slic3r/GUI/GUI_App.cpp:3088 +#, boost-format +msgid "Welcome to %1% version %2%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3090 +#, boost-format +msgid "" +"Do you wish to register downloads from Printables.com\n" +"for this %1% %2% executable?\n" +"\n" +"Downloads can be registered for only 1 executable at time." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3118 msgid "Select a gcode file:" msgstr "gcode 파일을 선택합니다." -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "Open hyperlink in default browser?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "PrusaSlicer: Open hyperlink" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3105 src/slic3r/GUI/Preferences.cpp:382 +#: src/slic3r/GUI/GUI_App.cpp:3306 src/slic3r/GUI/Preferences.cpp:593 msgid "Suppress to open hyperlink in browser" msgstr "브라우저에서 하이퍼링크를 열도록 억제" -#: src/slic3r/GUI/GUI_App.cpp:3107 src/slic3r/GUI/Plater.cpp:1732 +#: src/slic3r/GUI/GUI_App.cpp:3308 src/slic3r/GUI/Plater.cpp:1742 msgid "PrusaSlicer will remember your choice." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3108 +#: src/slic3r/GUI/GUI_App.cpp:3309 msgid "You will not be asked about it again on hyperlinks hovering." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3109 src/slic3r/GUI/Plater.cpp:1736 +#: src/slic3r/GUI/GUI_App.cpp:3310 src/slic3r/GUI/Plater.cpp:1746 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" "to changes your choice." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3111 src/slic3r/GUI/Plater.cpp:1738 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:906 +#: src/slic3r/GUI/GUI_App.cpp:3312 src/slic3r/GUI/Plater.cpp:1748 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:934 msgid "PrusaSlicer: Don't ask me again" msgstr "프라사슬라이스: 다시 물어보지 마세요." -#: src/slic3r/GUI/GUI_Init.cpp:57 src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_App.cpp:3386 +msgid "Check for application update has failed." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3387 +#, boost-format +msgid "No new version is available. Latest release version is %1%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3458 +msgid "Download of new version is already ongoing. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/GUI_Init.cpp:64 src/slic3r/GUI/GUI_Init.cpp:67 msgid "PrusaSlicer GUI initialization failed" msgstr "PrusaSlicer GUI 초기화 실패" -#: src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_Init.cpp:67 #, boost-format msgid "Fatal error, exception catched: %1%" msgstr "치명적인 오류, 예외가 적중: %1%" #: src/slic3r/GUI/GUI_Factories.cpp:54 src/slic3r/GUI/GUI_Factories.cpp:127 -#: src/libslic3r/PrintConfig.cpp:287 src/libslic3r/PrintConfig.cpp:404 -#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:456 -#: src/libslic3r/PrintConfig.cpp:708 src/libslic3r/PrintConfig.cpp:778 -#: src/libslic3r/PrintConfig.cpp:786 src/libslic3r/PrintConfig.cpp:1232 -#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1563 -#: src/libslic3r/PrintConfig.cpp:1955 src/libslic3r/PrintConfig.cpp:2030 -#: src/libslic3r/PrintConfig.cpp:2264 src/libslic3r/PrintConfig.cpp:2850 -#: src/libslic3r/PrintConfig.cpp:2858 src/libslic3r/PrintConfig.cpp:2918 -#: src/libslic3r/PrintConfig.cpp:2927 src/libslic3r/PrintConfig.cpp:3098 +#: src/libslic3r/PrintConfig.cpp:300 src/libslic3r/PrintConfig.cpp:423 +#: src/libslic3r/PrintConfig.cpp:466 src/libslic3r/PrintConfig.cpp:475 +#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:872 +#: src/libslic3r/PrintConfig.cpp:881 src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1376 src/libslic3r/PrintConfig.cpp:1604 +#: src/libslic3r/PrintConfig.cpp:1985 src/libslic3r/PrintConfig.cpp:2060 +#: src/libslic3r/PrintConfig.cpp:2294 src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:2946 src/libslic3r/PrintConfig.cpp:3006 +#: src/libslic3r/PrintConfig.cpp:3015 src/libslic3r/PrintConfig.cpp:3186 msgid "Layers and Perimeters" msgstr "레이어 및 둘레" #: src/slic3r/GUI/GUI_Factories.cpp:56 src/slic3r/GUI/GUI_Factories.cpp:131 -#: src/slic3r/GUI/GUI_Preview.cpp:249 src/slic3r/GUI/Tab.cpp:1547 -#: src/slic3r/GUI/Tab.cpp:1549 src/libslic3r/ExtrusionEntity.cpp:340 -#: src/libslic3r/ExtrusionEntity.cpp:372 src/libslic3r/PrintConfig.cpp:670 -#: src/libslic3r/PrintConfig.cpp:2095 src/libslic3r/PrintConfig.cpp:2104 -#: src/libslic3r/PrintConfig.cpp:2113 src/libslic3r/PrintConfig.cpp:2123 -#: src/libslic3r/PrintConfig.cpp:2132 src/libslic3r/PrintConfig.cpp:2554 -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2568 -#: src/libslic3r/PrintConfig.cpp:2581 src/libslic3r/PrintConfig.cpp:2591 -#: src/libslic3r/PrintConfig.cpp:2599 src/libslic3r/PrintConfig.cpp:2617 -#: src/libslic3r/PrintConfig.cpp:2634 src/libslic3r/PrintConfig.cpp:2655 -#: src/libslic3r/PrintConfig.cpp:2668 src/libslic3r/PrintConfig.cpp:2685 -#: src/libslic3r/PrintConfig.cpp:2703 src/libslic3r/PrintConfig.cpp:2718 -#: src/libslic3r/PrintConfig.cpp:2728 src/libslic3r/PrintConfig.cpp:2737 -#: src/libslic3r/PrintConfig.cpp:2748 src/libslic3r/PrintConfig.cpp:2762 -#: src/libslic3r/PrintConfig.cpp:2778 src/libslic3r/PrintConfig.cpp:2786 -#: src/libslic3r/PrintConfig.cpp:2787 src/libslic3r/PrintConfig.cpp:2796 -#: src/libslic3r/PrintConfig.cpp:2810 src/libslic3r/PrintConfig.cpp:2818 -#: src/libslic3r/PrintConfig.cpp:2832 +#: src/slic3r/GUI/Tab.cpp:1494 src/slic3r/GUI/Tab.cpp:1496 +#: src/libslic3r/PrintConfig.cpp:773 src/libslic3r/PrintConfig.cpp:2125 +#: src/libslic3r/PrintConfig.cpp:2134 src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2153 src/libslic3r/PrintConfig.cpp:2162 +#: src/libslic3r/PrintConfig.cpp:2584 src/libslic3r/PrintConfig.cpp:2590 +#: src/libslic3r/PrintConfig.cpp:2598 src/libslic3r/PrintConfig.cpp:2611 +#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2628 +#: src/libslic3r/PrintConfig.cpp:2644 src/libslic3r/PrintConfig.cpp:2660 +#: src/libslic3r/PrintConfig.cpp:2681 src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2725 +#: src/libslic3r/PrintConfig.cpp:2743 src/libslic3r/PrintConfig.cpp:2753 +#: src/libslic3r/PrintConfig.cpp:2762 src/libslic3r/PrintConfig.cpp:2773 +#: src/libslic3r/PrintConfig.cpp:2785 src/libslic3r/PrintConfig.cpp:2799 +#: src/libslic3r/PrintConfig.cpp:2807 src/libslic3r/PrintConfig.cpp:2808 +#: src/libslic3r/PrintConfig.cpp:2817 src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2840 src/libslic3r/PrintConfig.cpp:2854 +#: src/libslic3r/PrintConfig.cpp:2862 src/libslic3r/PrintConfig.cpp:2873 +#: src/libslic3r/PrintConfig.cpp:2884 src/libslic3r/PrintConfig.cpp:2893 +#: src/libslic3r/PrintConfig.cpp:2903 src/libslic3r/PrintConfig.cpp:2915 msgid "Support material" msgstr "서포트 재료 / 라프트 / 스커트 익스트루더" #: src/slic3r/GUI/GUI_Factories.cpp:59 src/slic3r/GUI/GUI_Factories.cpp:135 -#: src/libslic3r/PrintConfig.cpp:3054 src/libslic3r/PrintConfig.cpp:3062 +#: src/libslic3r/PrintConfig.cpp:3142 src/libslic3r/PrintConfig.cpp:3150 msgid "Wipe options" msgstr "와이퍼(Wipe) 옵션" @@ -3757,330 +4994,351 @@ msgstr "와이퍼(Wipe) 옵션" msgid "Pad and Support" msgstr "패드 및 서포트" -#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/GUI_Preview.cpp:245 -#: src/slic3r/GUI/Tab.cpp:1513 src/libslic3r/ExtrusionEntity.cpp:336 -#: src/libslic3r/ExtrusionEntity.cpp:364 src/libslic3r/PrintConfig.cpp:1579 -#: src/libslic3r/PrintConfig.cpp:1585 src/libslic3r/PrintConfig.cpp:1599 -#: src/libslic3r/PrintConfig.cpp:1609 src/libslic3r/PrintConfig.cpp:1617 -#: src/libslic3r/PrintConfig.cpp:1619 +#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/Tab.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1620 src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1638 src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1656 src/libslic3r/PrintConfig.cpp:1658 msgid "Ironing" msgstr "다림 질" -#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1283 -#: src/libslic3r/PrintConfig.cpp:1284 src/libslic3r/PrintConfig.cpp:1299 -#: src/libslic3r/PrintConfig.cpp:1309 +#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1344 src/libslic3r/PrintConfig.cpp:1356 +#: src/libslic3r/PrintConfig.cpp:1366 msgid "Fuzzy Skin" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/GUI_Preview.cpp:220 -#: src/slic3r/GUI/Tab.cpp:1581 src/libslic3r/PrintConfig.cpp:507 -#: src/libslic3r/PrintConfig.cpp:766 src/libslic3r/PrintConfig.cpp:1326 -#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1618 -#: src/libslic3r/PrintConfig.cpp:2020 src/libslic3r/PrintConfig.cpp:2352 -#: src/libslic3r/PrintConfig.cpp:2405 src/libslic3r/PrintConfig.cpp:2903 +#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/Tab.cpp:1536 +#: src/libslic3r/PrintConfig.cpp:526 src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:548 src/libslic3r/PrintConfig.cpp:557 +#: src/libslic3r/PrintConfig.cpp:566 src/libslic3r/PrintConfig.cpp:575 +#: src/libslic3r/PrintConfig.cpp:852 src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1657 +#: src/libslic3r/PrintConfig.cpp:2050 src/libslic3r/PrintConfig.cpp:2383 +#: src/libslic3r/PrintConfig.cpp:2436 src/libslic3r/PrintConfig.cpp:2991 msgid "Speed" msgstr "속도" -#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1623 -#: src/slic3r/GUI/Tab.cpp:2304 src/libslic3r/PrintConfig.cpp:796 -#: src/libslic3r/PrintConfig.cpp:1489 src/libslic3r/PrintConfig.cpp:1997 -#: src/libslic3r/PrintConfig.cpp:2373 src/libslic3r/PrintConfig.cpp:2647 -#: src/libslic3r/PrintConfig.cpp:2675 +#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1585 +#: src/slic3r/GUI/Tab.cpp:2288 src/libslic3r/PrintConfig.cpp:889 +#: src/libslic3r/PrintConfig.cpp:1530 src/libslic3r/PrintConfig.cpp:2027 +#: src/libslic3r/PrintConfig.cpp:2404 src/libslic3r/PrintConfig.cpp:2673 +#: src/libslic3r/PrintConfig.cpp:2701 msgid "Extruders" msgstr "압출 기" -#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:754 -#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:1218 -#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:2006 -#: src/libslic3r/PrintConfig.cpp:2393 src/libslic3r/PrintConfig.cpp:2656 -#: src/libslic3r/PrintConfig.cpp:2890 +#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:840 +#: src/libslic3r/PrintConfig.cpp:953 src/libslic3r/PrintConfig.cpp:1278 +#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:2036 +#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2682 +#: src/libslic3r/PrintConfig.cpp:2978 msgid "Extrusion Width" msgstr "돌출 폭" -#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1533 -#: src/libslic3r/PrintConfig.cpp:517 src/libslic3r/PrintConfig.cpp:528 -#: src/libslic3r/PrintConfig.cpp:544 +#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:631 src/libslic3r/PrintConfig.cpp:642 +#: src/libslic3r/PrintConfig.cpp:655 msgid "Skirt and brim" msgstr "스커트와 브림" -#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 -#: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1645 -#: src/slic3r/GUI/Tab.cpp:1649 src/slic3r/GUI/Tab.cpp:2031 -#: src/slic3r/GUI/Tab.cpp:2402 src/slic3r/GUI/Tab.cpp:4729 -#: src/libslic3r/PrintConfig.cpp:260 src/libslic3r/PrintConfig.cpp:495 -#: src/libslic3r/PrintConfig.cpp:1438 src/libslic3r/PrintConfig.cpp:1525 -#: src/libslic3r/PrintConfig.cpp:1572 src/libslic3r/PrintConfig.cpp:2530 -#: src/libslic3r/PrintConfig.cpp:2540 src/libslic3r/PrintConfig.cpp:3078 -#: src/libslic3r/PrintConfig.cpp:3113 src/libslic3r/PrintConfig.cpp:3124 -#: src/libslic3r/PrintConfig.cpp:3139 src/libslic3r/PrintConfig.cpp:3152 -#: src/libslic3r/PrintConfig.cpp:3161 src/libslic3r/PrintConfig.cpp:3173 -#: src/libslic3r/PrintConfig.cpp:3370 -msgid "Advanced" -msgstr "고급" - -#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4663 src/slic3r/GUI/Tab.cpp:4664 -#: src/libslic3r/PrintConfig.cpp:3564 src/libslic3r/PrintConfig.cpp:3571 -#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3589 -#: src/libslic3r/PrintConfig.cpp:3599 src/libslic3r/PrintConfig.cpp:3609 -#: src/libslic3r/PrintConfig.cpp:3646 src/libslic3r/PrintConfig.cpp:3653 -#: src/libslic3r/PrintConfig.cpp:3664 src/libslic3r/PrintConfig.cpp:3674 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3696 -#: src/libslic3r/PrintConfig.cpp:3706 src/libslic3r/PrintConfig.cpp:3715 -#: src/libslic3r/PrintConfig.cpp:3725 src/libslic3r/PrintConfig.cpp:3736 -#: src/libslic3r/PrintConfig.cpp:3744 +#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Tab.cpp:4946 src/slic3r/GUI/Tab.cpp:4948 +#: src/libslic3r/PrintConfig.cpp:3328 src/libslic3r/PrintConfig.cpp:3337 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3356 +#: src/libslic3r/PrintConfig.cpp:3366 src/libslic3r/PrintConfig.cpp:3387 +#: src/libslic3r/PrintConfig.cpp:3410 src/libslic3r/PrintConfig.cpp:3417 +#: src/libslic3r/PrintConfig.cpp:3432 src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3464 +#: src/libslic3r/PrintConfig.cpp:3474 src/libslic3r/PrintConfig.cpp:3488 +#: src/libslic3r/PrintConfig.cpp:3498 src/libslic3r/PrintConfig.cpp:3841 +#: src/libslic3r/PrintConfig.cpp:3861 src/libslic3r/PrintConfig.cpp:3868 +#: src/libslic3r/PrintConfig.cpp:3876 msgid "Supports" msgstr "서포트" -#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4704 src/slic3r/GUI/Tab.cpp:4705 -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3752 -#: src/libslic3r/PrintConfig.cpp:3759 src/libslic3r/PrintConfig.cpp:3773 -#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3794 -#: src/libslic3r/PrintConfig.cpp:3816 src/libslic3r/PrintConfig.cpp:3827 -#: src/libslic3r/PrintConfig.cpp:3834 src/libslic3r/PrintConfig.cpp:3841 -#: src/libslic3r/PrintConfig.cpp:3852 src/libslic3r/PrintConfig.cpp:3861 -#: src/libslic3r/PrintConfig.cpp:3870 +#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:590 +#: src/slic3r/GUI/Tab.cpp:4960 src/slic3r/GUI/Tab.cpp:4961 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3884 +#: src/libslic3r/PrintConfig.cpp:3891 src/libslic3r/PrintConfig.cpp:3905 +#: src/libslic3r/PrintConfig.cpp:3916 src/libslic3r/PrintConfig.cpp:3926 +#: src/libslic3r/PrintConfig.cpp:3948 src/libslic3r/PrintConfig.cpp:3959 +#: src/libslic3r/PrintConfig.cpp:3966 src/libslic3r/PrintConfig.cpp:3973 +#: src/libslic3r/PrintConfig.cpp:3984 src/libslic3r/PrintConfig.cpp:3993 +#: src/libslic3r/PrintConfig.cpp:4002 msgid "Pad" msgstr "패드" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4722 -#: src/slic3r/GUI/Tab.cpp:4723 src/libslic3r/SLA/Hollowing.cpp:73 -#: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3880 -#: src/libslic3r/PrintConfig.cpp:3887 src/libslic3r/PrintConfig.cpp:3897 -#: src/libslic3r/PrintConfig.cpp:3906 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4978 +#: src/slic3r/GUI/Tab.cpp:4979 src/libslic3r/SLA/Hollowing.cpp:86 +#: src/libslic3r/SLA/Hollowing.cpp:91 src/libslic3r/SLA/Hollowing.cpp:106 +#: src/libslic3r/SLA/Hollowing.cpp:115 src/libslic3r/PrintConfig.cpp:4012 +#: src/libslic3r/PrintConfig.cpp:4019 src/libslic3r/PrintConfig.cpp:4029 +#: src/libslic3r/PrintConfig.cpp:4038 msgid "Hollowing" msgstr "물체 속이 빈(Hollowing)" -#: src/slic3r/GUI/GUI_Factories.cpp:160 +#: src/slic3r/GUI/GUI_Factories.cpp:159 msgid "Add part" msgstr "부품 추가" -#: src/slic3r/GUI/GUI_Factories.cpp:161 +#: src/slic3r/GUI/GUI_Factories.cpp:160 msgid "Add negative volume" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:162 +#: src/slic3r/GUI/GUI_Factories.cpp:161 msgid "Add modifier" msgstr "편집영역(modifier) 추가" -#: src/slic3r/GUI/GUI_Factories.cpp:163 +#: src/slic3r/GUI/GUI_Factories.cpp:162 msgid "Add support blocker" msgstr "서포트 금지영역(blocker) 추가" -#: src/slic3r/GUI/GUI_Factories.cpp:164 +#: src/slic3r/GUI/GUI_Factories.cpp:163 msgid "Add support enforcer" msgstr "서포트 지원(enforcer)영역 추가" -#: src/slic3r/GUI/GUI_Factories.cpp:300 +#: src/slic3r/GUI/GUI_Factories.cpp:169 +msgid "Add text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:170 +msgid "Add negative text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:171 +msgid "Add text modifier" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:307 msgid "Select showing settings" msgstr "표시된 설정을 선택 합니다" -#: src/slic3r/GUI/GUI_Factories.cpp:407 src/slic3r/GUI/GUI_Factories.cpp:412 -#: src/slic3r/GUI/GUI_Factories.cpp:556 src/slic3r/GUI/GUI_Factories.cpp:562 +#: src/slic3r/GUI/GUI_Factories.cpp:414 src/slic3r/GUI/GUI_Factories.cpp:419 +#: src/slic3r/GUI/GUI_Factories.cpp:625 src/slic3r/GUI/GUI_Factories.cpp:631 #, c-format, boost-format msgid "Quick Add Settings (%s)" msgstr "빠른 추가 설정 (%s)" -#: src/slic3r/GUI/GUI_Factories.cpp:444 +#: src/slic3r/GUI/GUI_Factories.cpp:460 msgid "Remove the selected object" msgstr "선택한 객체 제거" -#: src/slic3r/GUI/GUI_Factories.cpp:456 +#: src/slic3r/GUI/GUI_Factories.cpp:475 msgid "Load" msgstr "불러오기" -#: src/slic3r/GUI/GUI_Factories.cpp:461 src/slic3r/GUI/GUI_Factories.cpp:501 -#: src/slic3r/GUI/GUI_Factories.cpp:505 +#: src/slic3r/GUI/GUI_Factories.cpp:481 src/slic3r/GUI/GUI_Factories.cpp:566 +#: src/slic3r/GUI/GUI_Factories.cpp:570 msgid "Box" msgstr "박스" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Cylinder" msgstr "실린더" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Slab" msgstr "슬 래 브" -#: src/slic3r/GUI/GUI_Factories.cpp:471 +#: src/slic3r/GUI/GUI_Factories.cpp:493 msgid "Gallery" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:488 src/slic3r/GUI/GUI_Factories.cpp:526 +#: src/slic3r/GUI/GUI_Factories.cpp:529 src/slic3r/GUI/GUI_Factories.cpp:549 +#: src/slic3r/GUI/GUI_ObjectList.cpp:660 +msgid "Text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:555 src/slic3r/GUI/GUI_Factories.cpp:558 +#: src/slic3r/GUI/GUI_Factories.cpp:595 msgid "Height range Modifier" msgstr "높이 범위 수정자" -#: src/slic3r/GUI/GUI_Factories.cpp:535 +#: src/slic3r/GUI/GUI_Factories.cpp:604 msgid "Add settings" msgstr "하위 오브젝트에 대한 번들 설정을 추가" -#: src/slic3r/GUI/GUI_Factories.cpp:626 +#: src/slic3r/GUI/GUI_Factories.cpp:695 msgid "Change type" msgstr "변경 유형" -#: src/slic3r/GUI/GUI_Factories.cpp:636 src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:705 src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Object" msgstr "분리된 개체로 설정" -#: src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Objects" msgstr "분리된 객체로 설정" -#: src/slic3r/GUI/GUI_Factories.cpp:658 +#: src/slic3r/GUI/GUI_Factories.cpp:727 msgid "Printable" msgstr "인쇄용" -#: src/slic3r/GUI/GUI_Factories.cpp:686 +#: src/slic3r/GUI/GUI_Factories.cpp:755 src/slic3r/GUI/GUI_ObjectList.cpp:2070 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2582 +msgid "Invalidate cut info" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:770 msgid "Rename" msgstr "이름 변경" -#: src/slic3r/GUI/GUI_Factories.cpp:696 +#: src/slic3r/GUI/GUI_Factories.cpp:780 msgid "Fix through the Netfabb" msgstr "Netfabb를 통해 수정" -#: src/slic3r/GUI/GUI_Factories.cpp:715 -msgid "Export as STL" -msgstr "STL로 수출" +#: src/slic3r/GUI/GUI_Factories.cpp:799 +msgid "Export as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:726 +#: src/slic3r/GUI/GUI_Factories.cpp:810 msgid "Reload the selected volumes from disk" msgstr "디스크에서 선택한 볼륨 다시 로드" -#: src/slic3r/GUI/GUI_Factories.cpp:733 src/slic3r/GUI/Plater.cpp:3568 +#: src/slic3r/GUI/GUI_Factories.cpp:817 src/slic3r/GUI/Plater.cpp:3602 msgid "Replace with STL" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:733 +#: src/slic3r/GUI/GUI_Factories.cpp:817 msgid "Replace the selected volume with new STL" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Set extruder for selected items" msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" -#: src/slic3r/GUI/GUI_Factories.cpp:778 src/slic3r/Utils/Repetier.cpp:126 -#: src/slic3r/Utils/Repetier.cpp:209 src/libslic3r/PrintConfig.cpp:635 -#: src/libslic3r/PrintConfig.cpp:2770 +#: src/slic3r/GUI/GUI_Factories.cpp:862 src/slic3r/Utils/Repetier.cpp:145 +#: src/slic3r/Utils/Repetier.cpp:226 src/libslic3r/PrintConfig.cpp:738 +#: src/libslic3r/PrintConfig.cpp:2790 src/libslic3r/PrintConfig.cpp:3851 msgid "Default" msgstr "기본값" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale to print volume" msgstr "볼륨 인쇄배율 조정" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale the selected object to fit the print volume" msgstr "인쇄 볼륨에 맞게 선택한 객체의 배율 조정" -#: src/slic3r/GUI/GUI_Factories.cpp:835 src/slic3r/GUI/Plater.cpp:5655 +#: src/slic3r/GUI/GUI_Factories.cpp:921 src/slic3r/GUI/Plater.cpp:6213 msgid "Convert from imperial units" msgstr "제국 단위에서 변환" -#: src/slic3r/GUI/GUI_Factories.cpp:836 src/slic3r/GUI/Plater.cpp:5656 +#: src/slic3r/GUI/GUI_Factories.cpp:922 src/slic3r/GUI/Plater.cpp:6214 msgid "Revert conversion from imperial units" msgstr "제국 단위에서 변환을 되돌리기" -#: src/slic3r/GUI/GUI_Factories.cpp:837 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:923 src/slic3r/GUI/Plater.cpp:6215 msgid "Convert from meters" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:838 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:924 src/slic3r/GUI/Plater.cpp:6215 msgid "Revert conversion from meters" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2135 -#: src/libslic3r/PrintConfig.cpp:4523 +#: src/slic3r/GUI/GUI_Factories.cpp:945 src/slic3r/GUI/GUI_ObjectList.cpp:2290 +#: src/libslic3r/PrintConfig.cpp:4689 msgid "Merge" msgstr "병합" -#: src/slic3r/GUI/GUI_Factories.cpp:859 +#: src/slic3r/GUI/GUI_Factories.cpp:945 msgid "Merge objects to the one multipart object" msgstr "객체를 하나의 다중 파트 개체로 병합" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Along X axis" msgstr "X 축을 따라" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Mirror the selected object along the X axis" msgstr "선택한 객체를 X 축을 따라 반전합니다" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Along Y axis" msgstr "Y축을 따라" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Mirror the selected object along the Y axis" msgstr "선택한 객체를 Y 축을 따라 반전합니다" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Along Z axis" msgstr "Z 축을 따라" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Mirror the selected object along the Z axis" msgstr "선택한 객체를 Z 축을 따라 반전합니다" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror" msgstr "미러" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror the selected object" msgstr "반전할 객제를 선택" -#: src/slic3r/GUI/GUI_Factories.cpp:901 src/slic3r/GUI/GUI_ObjectList.cpp:1696 +#: src/slic3r/GUI/GUI_Factories.cpp:977 +msgid "Edit text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:999 +msgid "Ability to change text, font, size, ..." +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1021 src/slic3r/GUI/GUI_ObjectList.cpp:1793 msgid "Add Shape" msgstr "셰이프 추가" -#: src/slic3r/GUI/GUI_Factories.cpp:937 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "To objects" msgstr "사물" -#: src/slic3r/GUI/GUI_Factories.cpp:937 src/slic3r/GUI/GUI_Factories.cpp:954 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "Split the selected object into individual objects" msgstr "선택한 개체를 개별 개체로 분할" -#: src/slic3r/GUI/GUI_Factories.cpp:940 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 msgid "To parts" msgstr "파츠를 자동으로 중심에" -#: src/slic3r/GUI/GUI_Factories.cpp:940 src/slic3r/GUI/GUI_Factories.cpp:975 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 src/slic3r/GUI/GUI_Factories.cpp:1097 msgid "Split the selected object into individual parts" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4552 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 src/slic3r/GUI/GUI_Factories.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:4718 msgid "Split" msgstr "분할" -#: src/slic3r/GUI/GUI_Factories.cpp:944 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 msgid "Split the selected object" msgstr "선택한 개체 분할" -#: src/slic3r/GUI/GUI_Factories.cpp:1084 +#: src/slic3r/GUI/GUI_Factories.cpp:1225 src/slic3r/GUI/GUI_Factories.cpp:1243 +msgid "Set number of instances" +msgstr "인스턴스 수 설정" + +#: src/slic3r/GUI/GUI_Factories.cpp:1225 +msgid "Change the number of instances of the selected objects" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1237 msgid "Add one more instance of the selected object" msgstr "선택한 개체의 인스턴스 를 하나 더 추가합니다." -#: src/slic3r/GUI/GUI_Factories.cpp:1087 +#: src/slic3r/GUI/GUI_Factories.cpp:1240 msgid "Remove one instance of the selected object" msgstr "선택한 개체의 인스턴스 하나 제거" -#: src/slic3r/GUI/GUI_Factories.cpp:1090 -msgid "Set number of instances" -msgstr "인스턴스 수 설정" - -#: src/slic3r/GUI/GUI_Factories.cpp:1090 +#: src/slic3r/GUI/GUI_Factories.cpp:1243 msgid "Change the number of instances of the selected object" msgstr "선택한 개체의 인스턴스 수 변경" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill bed with instances" msgstr "인스턴스로 침대 채우기" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill the remaining area of bed with instances of the selected object" msgstr "선택한 개체의 인스턴스로 나머지 침대 영역 채우기" @@ -4100,290 +5358,338 @@ msgstr "레이어 범위 제거" msgid "Add layer range" msgstr "레이어 범위 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:297 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:323 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 msgid "Name" msgstr "이름" -#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:480 +#: src/slic3r/GUI/GUI_ObjectList.cpp:342 src/slic3r/GUI/GUI_ObjectList.cpp:513 msgid "Editing" msgstr "편집" -#: src/slic3r/GUI/GUI_ObjectList.cpp:400 +#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +msgid "Wrong volume index " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:433 msgid "No errors detected" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:409 +#: src/slic3r/GUI/GUI_ObjectList.cpp:442 #, c-format, boost-format msgid "Auto-repaired %1$d error" msgid_plural "Auto-repaired %1$d errors" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:415 +#: src/slic3r/GUI/GUI_ObjectList.cpp:448 #, c-format, boost-format msgid "%1$d degenerate facet" msgid_plural "%1$d degenerate facets" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:450 #, c-format, boost-format msgid "%1$d edge fixed" msgid_plural "%1$d edges fixed" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:452 #, c-format, boost-format msgid "%1$d facet removed" msgid_plural "%1$d facets removed" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:421 +#: src/slic3r/GUI/GUI_ObjectList.cpp:454 #, c-format, boost-format msgid "%1$d facet reversed" msgid_plural "%1$d facets reversed" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +#: src/slic3r/GUI/GUI_ObjectList.cpp:456 #, c-format, boost-format msgid "%1$d backward edge" msgid_plural "%1$d backward edges" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:426 src/slic3r/GUI/GUI_ObjectList.cpp:429 +#: src/slic3r/GUI/GUI_ObjectList.cpp:459 src/slic3r/GUI/GUI_ObjectList.cpp:462 #, c-format, boost-format msgid "%1$d open edge" msgid_plural "%1$d open edges" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:428 +#: src/slic3r/GUI/GUI_ObjectList.cpp:461 msgid "Remaining errors" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:436 +#: src/slic3r/GUI/GUI_ObjectList.cpp:469 msgid "Right button click the icon to fix STL through Netfabb" msgstr "아이콘을 클릭 하여 Netfabb에서 STL을 수정 합니다" -#: src/slic3r/GUI/GUI_ObjectList.cpp:482 +#: src/slic3r/GUI/GUI_ObjectList.cpp:515 msgid "Right button click the icon to change the object settings" msgstr "아이콘을 클릭 하여 개체 설정을 변경 합니다" -#: src/slic3r/GUI/GUI_ObjectList.cpp:484 +#: src/slic3r/GUI/GUI_ObjectList.cpp:517 msgid "Click the icon to change the object settings" msgstr "아이콘을 클릭 하여 개체 설정을 변경 합니다" -#: src/slic3r/GUI/GUI_ObjectList.cpp:488 +#: src/slic3r/GUI/GUI_ObjectList.cpp:521 msgid "Right button click the icon to change the object printable property" msgstr "오른쪽 버튼이 아이콘을 클릭하여 인쇄 가능한 개체 속성을 변경합니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:523 msgid "Click the icon to change the object printable property" msgstr "아이콘을 클릭하여 인쇄 가능한 개체 속성을 변경합니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:616 +#: src/slic3r/GUI/GUI_ObjectList.cpp:649 msgid "Change Extruder" msgstr "압출기(익스트루더) 변경" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Object" msgstr "개체 이름 바꾸기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Sub-object" msgstr "하위 개체 이름 바꾸기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1242 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4006 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1307 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4589 msgid "Instances to Separated Objects" msgstr "분리된 개체에 대한 인스턴스" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Volumes in Object reordered" msgstr "개체의 볼륨 이 다시 정렬" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Object reordered" msgstr "개체 재정렬" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1298 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1363 msgid "Add Settings for Layers" msgstr "레이어 설정 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1299 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1364 msgid "Add Settings for Sub-object" msgstr "하위 객체에 대한 설정 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1300 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1365 msgid "Add Settings for Object" msgstr "객체에 대한 설정 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1339 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1404 msgid "Add Settings Bundle for Height range" msgstr "높이 범위에 대한 설정 번들 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1340 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1405 msgid "Add Settings Bundle for Sub-object" msgstr "하위 오브젝트에 대한 번들 설정을 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1341 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1406 msgid "Add Settings Bundle for Object" msgstr "개체에 대한 번들 설정을 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Part" msgstr "부품을 불러 오기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1509 src/slic3r/GUI/Plater.cpp:2380 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1582 src/slic3r/GUI/Plater.cpp:2453 msgid "Loading" msgstr "로딩중" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1540 src/slic3r/GUI/Plater.cpp:2417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1617 src/slic3r/GUI/Plater.cpp:2494 msgid "Loading file" msgstr "파일 로드" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1548 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1625 msgid "Error!" msgstr "오류!" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1638 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1721 msgid "Add Generic Subobject" msgstr "기본이 되는 하위 개체 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1663 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1761 msgid "Generic" msgstr "일반" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shape from Gallery" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shapes from Gallery" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1830 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1945 msgid "Remove paint-on supports" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1837 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 msgid "Remove paint-on seam" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1844 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 msgid "Remove Multi Material painting" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1850 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1972 msgid "Shift objects to bed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1856 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1978 msgid "Remove variable layer height" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1877 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1999 msgid "Delete Settings" msgstr "설정 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1901 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2023 msgid "Delete All Instances from Object" msgstr "개체에서 모든 인스턴스 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1917 -msgid "Delete Height Range" -msgstr "높이 범위 삭제" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2039 +msgid "Delete Height Range" +msgstr "높이 범위 삭제" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2057 +msgid "Delete connector from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2058 +msgid "Delete solid part from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2059 +msgid "Delete negative volume from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2061 +msgid "" +"To save cut information you can delete all connectors from all related " +"objects." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2064 +msgid "" +"This action will break a cut information.\n" +"After that PrusaSlicer can't guarantee model consistency.\n" +"\n" +"To manipulate with solid parts or negative volumes you have to invalidate " +"cut infornation first." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2072 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2612 +msgid "Delete all connectors" +msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1949 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2103 msgid "From Object List You can't delete the last solid part from object." msgstr "객체 리스트에서 마지막 부품을 삭제할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1953 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2112 msgid "Delete Subobject" msgstr "하위 개체 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1976 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2138 msgid "Last instance of an object cannot be deleted." msgstr "개체의 마지막 인스턴스를 삭제할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1980 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +msgid "Instance cannot be deleted from cut object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2146 msgid "Delete Instance" msgstr "인스턴스 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2004 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2170 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "선택한 객체는 부품 하나만 포함되어 있기 때문에 분할 할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2008 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2174 msgid "Split to Parts" msgstr "부품(Part)으로 분할" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2177 src/slic3r/GUI/Plater.cpp:3133 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"splitting the object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2297 msgid "Merged" msgstr "Merge됨" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2237 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2392 msgid "Merge all parts to the one single object" msgstr "모든 부품을 하나의 단일 오브젝트로 병합" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2269 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2424 msgid "Add Layers" msgstr "레이어 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2438 -msgid "Group manipulation" -msgstr "그룹 조작" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2695 +msgid "Cut Connectors information" +msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2453 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2705 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2768 msgid "Object manipulation" msgstr "개체 조작" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2486 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2714 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1472 +msgid "Group manipulation" +msgstr "그룹 조작" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2802 msgid "Object Settings to modify" msgstr "수정할 개체 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2806 msgid "Part Settings to modify" msgstr "수정할 부품 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2495 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2811 msgid "Layer range Settings to modify" msgstr "수정할 레이어 범위 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2501 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2817 msgid "Part manipulation" msgstr "부품 조작" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2825 msgid "Instance manipulation" msgstr "인스턴스 조작" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Height ranges" msgstr "높이 범위" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Settings for height range" msgstr "높이 범위설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2750 -msgid "Delete Selected Item" -msgstr "선택한 항목(item) 삭제" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2943 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3363 msgid "Delete Selected" msgstr "선택된 것을 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3019 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3047 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3067 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3441 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3469 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3489 msgid "Add Height Range" msgstr "높이 범위 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3113 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3535 msgid "" "Cannot insert a new layer range after the current layer range.\n" "The next layer range is too thin to be split to two\n" @@ -4393,7 +5699,7 @@ msgstr "" "다음 레이어 범위가 너무 얇아서 두 개로 나눌 수 없습니다.\n" "최소 레이어 높이를 위반하지 않습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3117 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3539 msgid "" "Cannot insert a new layer range between the current and the next layer " "range.\n" @@ -4404,7 +5710,7 @@ msgstr "" "현재 레이어 범위와 다음 레이어 범위 사이의 간격\n" "허용되는 최소 레이어 높이보다 얇습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3122 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3544 msgid "" "Cannot insert a new layer range after the current layer range.\n" "Current layer range overlaps with the next layer range." @@ -4412,233 +5718,282 @@ msgstr "" "현재 레이어 범위 이후에새 레이어 범위를 삽입할 수 없습니다.\n" "현재 레이어 범위는 다음 레이어 범위와 겹칩니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3603 msgid "Edit Height Range" msgstr "높이 범위 편집" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3500 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3989 msgid "Selection-Remove from list" msgstr "선택 선택 목록에서 제거" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4001 msgid "Selection-Add from list" msgstr "목록에서 선택 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3649 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4138 msgid "Object or Instance" msgstr "개체 또는 인스턴스" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Part" -msgstr "부품" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 msgid "Layer" msgstr "레이어" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3652 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4141 msgid "Unsupported selection" msgstr "지원되지 않는 선택" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3653 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 #, c-format, boost-format msgid "You started your selection with %s Item." msgstr "%s 선택된 항목으로 시작합니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3654 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4143 #, c-format, boost-format msgid "In this mode you can select only other %s Items%s" msgstr "이 모드에서는 %s의 다른 %s 항목만 선택할 수 있습니다" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3657 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4146 msgid "of a current Object" msgstr "현재 개체의" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3662 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3737 src/slic3r/GUI/Plater.cpp:181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4151 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4226 src/slic3r/GUI/Plater.cpp:197 msgid "Info" msgstr "정보" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3784 -msgid "You can't change a type of the last solid part of the object." -msgstr "객체(object)의 마지막 부품(Part) 유형은 변경할 수 없습니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 msgid "Negative Volume" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Modifier" -msgstr "편집" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Blocker" msgstr "서포트 금지영역" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Enforcer" msgstr "서포트 지원영역" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Select type of part" msgstr "부품 유형 선택" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3795 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4359 msgid "Change Part Type" msgstr "부품 유형 변경" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Enter new name" msgstr "새 이름 입력" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Renaming" msgstr "이름 바꾸기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4091 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4681 msgid "Repairing model" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4120 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4691 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"repairing the mesh." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4711 msgid "Fix through NetFabb" msgstr "NetFabb을 통해 수정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4123 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4714 msgid "Fixing through NetFabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4153 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4744 msgid "The following model was repaired successfully" msgid_plural "The following models were repaired successfully" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4159 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4750 msgid "Folowing model repair failed" msgid_plural "Folowing models repair failed" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4164 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4755 msgid "Repairing was canceled" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4276 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4869 msgid "Change Extruders" msgstr "압출기 변경" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Printable group" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Unprintable group" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Printable" msgstr "인쇄 가능 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Unprintable" msgstr "인쇄할 수 없는 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Printable Instance" msgstr "인쇄 가능한 인스턴스 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Unprintable Instance" msgstr "인쇄할 수 없는 인스턴스 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:55 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:84 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:61 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:96 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1132 msgid "World coordinates" msgstr "절대 좌표" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:56 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:85 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:97 msgid "Local coordinates" msgstr "상대 좌표" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:60 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:67 msgid "Select coordinate space, in which the transformation will be performed." msgstr "변환이 수행될 좌표 공간을 선택 합니다." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:141 src/libslic3r/GCode.cpp:540 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:157 src/libslic3r/GCode.cpp:491 msgid "Object name" msgstr "개체 이름" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:201 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:521 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:221 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:710 msgid "Position" msgstr "위치" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:202 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:522 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:222 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:711 #: src/slic3r/GUI/Mouse3DController.cpp:478 #: src/slic3r/GUI/Mouse3DController.cpp:499 msgid "Rotation" msgstr "회전" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:250 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:239 +msgid "Size [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "Mirror along" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +#, c-format, boost-format +msgid " %c " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "axis" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:279 #, c-format, boost-format msgid "Toggle %c axis mirroring" msgstr "축 미러링 %c 토글" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:284 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:329 msgid "Set Mirror" msgstr "미러 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:324 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:336 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:348 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:374 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:387 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:393 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:401 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:428 msgid "Drop to bed" msgstr "배드를 아래로 내리기" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:445 msgid "Reset rotation" msgstr "회전 재설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 msgid "Reset Rotation" msgstr "회전 재설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:398 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:400 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:490 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:519 msgid "Reset scale" msgstr "크기 재설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:539 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546 +msgid "Reset skew" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:553 msgid "Inches" msgstr "인치" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:523 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:712 msgid "Scale factors" msgstr "확대와 축소" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:577 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:740 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:752 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:793 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:801 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +msgid "Rotate (relative)" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:751 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:800 +msgid "Translate (relative) [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:829 msgid "Translate" msgstr "번역" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:640 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:905 msgid "" "You cannot use non-uniform scaling mode for multiple objects/parts selection" msgstr "" "여러 개체/부품 선택에 대해 균일하지 않은 크기 조정 모드를 사용할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:820 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +msgid "Left handed" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1133 +msgid "Object coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1134 +msgid "Part coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1176 msgid "Set Position" msgstr "위치 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:852 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1220 msgid "Set Orientation" msgstr "방향 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:931 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1351 msgid "Set Scale" msgstr "스케일 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1368 +msgid "Set Size" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1427 msgid "" "The currently manipulated object is tilted (rotation angles are not " "multiples of 90°).\n" @@ -4650,7 +6005,7 @@ msgstr "" "님).\n" "기울어진 객체(object)의 배율 조정은 기본 좌표에서만 가능 합니다." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:983 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1430 msgid "" "This operation is irreversible.\n" "Do you want to proceed?" @@ -4676,168 +6031,67 @@ msgstr "삭제 %s 옵션" msgid "Change Option %s" msgstr "변경 옵션 %s" -#: src/slic3r/GUI/GUI_Preview.cpp:211 -msgid "View" -msgstr "보기" - -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/libslic3r/PrintConfig.cpp:808 -msgid "Height" -msgstr "높이" - -#: src/slic3r/GUI/GUI_Preview.cpp:219 src/libslic3r/PrintConfig.cpp:3032 -msgid "Width" -msgstr "넓이" - -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2016 -msgid "Fan speed" -msgstr "팬 속도" - -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1991 -msgid "Temperature" -msgstr "온도" - -#: src/slic3r/GUI/GUI_Preview.cpp:223 -msgid "Volumetric flow rate" -msgstr "용적의 유량값" - -#: src/slic3r/GUI/GUI_Preview.cpp:228 -msgid "Show" -msgstr "보이기" - -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/GUI_Preview.cpp:254 -msgid "Feature types" -msgstr "특색 유형" - -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:330 -#: src/libslic3r/ExtrusionEntity.cpp:352 -msgid "Perimeter" -msgstr "둘레" - -#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:331 -#: src/libslic3r/ExtrusionEntity.cpp:354 -msgid "External perimeter" -msgstr "외부 가장자리" - -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:332 -#: src/libslic3r/ExtrusionEntity.cpp:356 -msgid "Overhang perimeter" -msgstr "오버행(Overhang) 둘레" - -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:333 -#: src/libslic3r/ExtrusionEntity.cpp:358 -msgid "Internal infill" -msgstr "내부 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:334 -#: src/libslic3r/ExtrusionEntity.cpp:360 src/libslic3r/PrintConfig.cpp:1407 -#: src/libslic3r/PrintConfig.cpp:2392 src/libslic3r/PrintConfig.cpp:2404 -msgid "Solid infill" -msgstr "솔리드 인필" - -#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:335 -#: src/libslic3r/ExtrusionEntity.cpp:362 src/libslic3r/PrintConfig.cpp:1416 -#: src/libslic3r/PrintConfig.cpp:2889 src/libslic3r/PrintConfig.cpp:2902 -msgid "Top solid infill" -msgstr "가장 윗부분 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:337 -#: src/libslic3r/ExtrusionEntity.cpp:366 -msgid "Bridge infill" -msgstr "브릿지 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:338 -#: src/libslic3r/ExtrusionEntity.cpp:368 src/libslic3r/PrintConfig.cpp:1325 -msgid "Gap fill" -msgstr "공백 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:248 src/libslic3r/ExtrusionEntity.cpp:339 -#: src/libslic3r/ExtrusionEntity.cpp:370 -msgid "Skirt/Brim" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:250 src/libslic3r/ExtrusionEntity.cpp:341 -#: src/libslic3r/ExtrusionEntity.cpp:374 src/libslic3r/PrintConfig.cpp:2736 -msgid "Support material interface" -msgstr "서포트 인터페이스" - -#: src/slic3r/GUI/GUI_Preview.cpp:251 src/slic3r/GUI/Tab.cpp:1634 -#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/ExtrusionEntity.cpp:376 -msgid "Wipe tower" -msgstr "와이프 타워 - 버려진 필라멘트 조절" - -#: src/slic3r/GUI/GUI_Preview.cpp:728 +#: src/slic3r/GUI/GUI_Preview.cpp:581 msgid "NOTE:" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:729 +#: src/slic3r/GUI/GUI_Preview.cpp:582 #, boost-format msgid "Sliced object \"%1%\" looks like a logo or a sign" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:730 +#: src/slic3r/GUI/GUI_Preview.cpp:583 msgid "Apply color change automatically" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:1058 -msgid "Shells" -msgstr "쉘(Shells)" - -#: src/slic3r/GUI/GUI_Preview.cpp:1059 -msgid "Tool marker" -msgstr "공구 마커" - -#: src/slic3r/GUI/GUI_Preview.cpp:1060 -msgid "Legend/Estimated printing time" -msgstr "범례/예상 인쇄 시간" - -#: src/slic3r/GUI/HintNotification.cpp:771 -#: src/slic3r/GUI/HintNotification.cpp:797 -#: src/slic3r/GUI/NotificationManager.cpp:374 -#: src/slic3r/GUI/NotificationManager.cpp:391 +#: src/slic3r/GUI/HintNotification.cpp:773 +#: src/slic3r/GUI/HintNotification.cpp:799 +#: src/slic3r/GUI/NotificationManager.cpp:457 +#: src/slic3r/GUI/NotificationManager.cpp:474 msgid "More" msgstr "더 보기" -#: src/slic3r/GUI/HintNotification.cpp:912 +#: src/slic3r/GUI/HintNotification.cpp:914 msgid "Open Preferences." msgstr "" -#: src/slic3r/GUI/HintNotification.cpp:1004 +#: src/slic3r/GUI/HintNotification.cpp:1006 msgid "Open Documentation in web browser." msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:527 +#: src/slic3r/GUI/ImGuiWrapper.cpp:666 msgid "Edit" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:960 src/slic3r/GUI/Search.cpp:470 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1166 src/slic3r/GUI/Search.cpp:531 msgid "Use for search" msgstr "검색에 사용" -#: src/slic3r/GUI/ImGuiWrapper.cpp:961 src/slic3r/GUI/Search.cpp:463 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1167 src/slic3r/GUI/Search.cpp:524 msgid "Category" msgstr "카테고리" -#: src/slic3r/GUI/ImGuiWrapper.cpp:963 src/slic3r/GUI/Search.cpp:465 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1169 src/slic3r/GUI/Search.cpp:526 msgid "Search in English" msgstr "영어로 검색" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:174 -msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "모델 객체를 정렬 할 수 없습니다! 일부 형상이 잘못되었을 수 있습니다." - -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:183 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:168 msgid "Arranging" msgstr "정렬" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:207 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:204 msgid "Arranging canceled." msgstr "정렬이 취소되었습니다." -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:208 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:205 msgid "Arranging done." msgstr "정리 완료." -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:253 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:225 +msgid "Could not arrange model objects! Some geometries may be invalid." +msgstr "모델 객체를 정렬 할 수 없습니다! 일부 형상이 잘못되었을 수 있습니다." + +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:265 #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -4845,39 +6099,82 @@ msgid "" "%s" msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:119 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:108 msgid "Filling bed" msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:130 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:140 msgid "Bed filling canceled." msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:131 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:141 msgid "Bed filling done." msgstr "" -#: src/slic3r/GUI/Jobs/Job.cpp:111 -msgid "ERROR: not enough resources to execute a new job." -msgstr "오류: 새 작업을 실행하기에 충분한 리소스가 없습니다." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:148 src/slic3r/GUI/Jobs/EmbossJob.cpp:596 +msgid "Can't create empty volume." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:201 +msgid "Can't create empty object." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:208 +msgid "Add Emboss text object" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:247 +msgid "Created text volume is empty. Change text or font." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:465 +msgid "" +"It is used default volume for embossed text, try to change text or font to " +"fix it." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:549 +#, boost-format +msgid "Text: %1%" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:593 +msgid "Bad object to create volume." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:598 +msgid "Add Emboss text Volume" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:698 +msgid "Font doesn't have any shape for given text." +msgstr "" -#: src/slic3r/GUI/Jobs/PlaterJob.cpp:13 -msgid "An unexpected error occured" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:738 +msgid "There is no volume in projection direction." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:21 +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:787 +msgid "There is no valid surface for text projection." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:823 +msgid "Issue during embossing the text." +msgstr "" + +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:22 msgid "Best surface quality" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:23 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 msgid "Optimize object rotation for best surface quality." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:25 msgid "Reduced overhang slopes" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:26 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:27 msgid "" "Optimize object rotation to have minimum amount of overhangs needing support " "structures.\n" @@ -4885,241 +6182,221 @@ msgid "" "touching the print bed if no elevation is set." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:30 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:31 msgid "Lowest Z height" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:32 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:33 msgid "Rotate the model to have the lowest z height for faster print time." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:59 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:53 msgid "Searching for optimal orientation" msgstr "최적의 방향 검색" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:77 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:83 msgid "Orientation search canceled." msgstr "방향 검색이 취소되었습니다." -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:78 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:84 msgid "Orientation found." msgstr "방향을 찾습니다." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:36 -msgid "Choose SLA archive:" -msgstr "SLA 아카이브를 선택합니다." - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:40 -msgid "Import file" -msgstr "파일 가져오기" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47 -msgid "Import model and profile" -msgstr "모델 가져오기 및 프로파일" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48 -msgid "Import profile only" -msgstr "프로필 가져오기만" - #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:49 -msgid "Import model only" -msgstr "가져오기 모델만" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60 -msgid "Accurate" -msgstr "정확한" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61 -msgid "Balanced" -msgstr "잔고 일치" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:62 -msgid "Quick" -msgstr "빨리" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:140 msgid "Importing SLA archive" msgstr "SLA 아카이브 가져오기" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:158 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:77 msgid "" "The SLA archive doesn't contain any presets. Please activate some SLA " "printer preset first before importing that SLA archive." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:164 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:81 +msgid "Import is unavailable for this archive format." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:86 msgid "Importing canceled." msgstr "가져오기가 취소되었습니다." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:165 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:87 msgid "Importing done." msgstr "가져오기 완료." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:187 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:108 msgid "The file does not exist." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:221 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135 msgid "" "The imported SLA archive did not contain any presets. The current SLA " "presets were used as fallback." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:234 src/slic3r/GUI/Plater.cpp:2458 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:148 src/slic3r/GUI/Plater.cpp:2535 msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "침대에 다중 부품 오브젝트가 있는 SLA 프로젝트를 로드할 수 없습니다." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:236 src/slic3r/GUI/Plater.cpp:2460 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:150 src/slic3r/GUI/Plater.cpp:2537 msgid "Attention!" msgstr "주의!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:166 +msgid "The profile in the imported archive is corrupt and will not be loaded." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:178 +msgid "" +"No object could be retrieved from the archive. The slices might be corrupted " +"or missing." +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1184 msgid "Keyboard Shortcuts" msgstr "키보드 단축키" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:77 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:86 msgid "New project, clear plater" msgstr "새로운 프로젝트, 클리어 플래터" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:78 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 msgid "Open project AMF/3MF with config, clear plater" msgstr "오픈 프로젝트 AMF/3MF 와 구성, 클리어 플래터" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 msgid "Save project (3mf)" msgstr "프로젝트 저장(3mf)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 msgid "Save project as (3mf)" msgstr "프로젝트 저장 (3mf)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:81 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 msgid "(Re)slice" msgstr "(Re)슬라이스" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:83 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:92 msgid "Import STL/3MF/STEP/OBJ/AMF without config, keep plater" msgstr "구성없이 STL / 3MF / STEP / OBJ / AMF를 가져 오기, 플래터 유지" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:84 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 msgid "Import Config from ini/amf/3mf/gcode" msgstr "ini/amf/3mf/gcode에서 컨피그로 가져오기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:85 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "ini/amf/3mf/gcode에서 구성을 로드하고 병합" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6543 src/libslic3r/PrintConfig.cpp:4423 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:96 src/slic3r/GUI/Plater.cpp:948 +#: src/slic3r/GUI/Plater.cpp:7161 src/libslic3r/PrintConfig.cpp:4575 msgid "Export G-code" msgstr "G코드 내보내기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:97 src/slic3r/GUI/Plater.cpp:7162 msgid "Send G-code" msgstr "G-code 보내기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 msgid "Export config" msgstr "&구성 내보내기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 src/slic3r/GUI/Plater.cpp:896 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 src/slic3r/GUI/Plater.cpp:931 msgid "Export to SD card / Flash drive" msgstr "SD카드/플래시 드라이브로 내보내기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:91 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 msgid "Eject SD card / Flash drive" msgstr "SD카드/ 플래시 드라이브 분리" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 msgid "Select all objects" msgstr "모든 개체 선택" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 msgid "Deselect all" msgstr "전체 선택 취소" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:95 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 msgid "Delete selected" msgstr "선택 삭제" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 -msgid "Copy to clipboard" -msgstr "클립보드로 복사" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 msgid "Paste from clipboard" msgstr "클립보드에서 붙여넣기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Reload plater from disk" msgstr "디스크에서 플래터 재로드" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 msgid "Select Plater Tab" msgstr "선택 및 플래이터 탭" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 msgid "Select Print Settings Tab" msgstr "인쇄 설정을 선택 합니다" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 msgid "Select Filament Settings Tab" msgstr "필라멘트 설정을 선택" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 msgid "Select Printer Settings Tab" msgstr "프린터 설정을 선택 합니다" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 msgid "Switch to 3D" msgstr "3D로 전환" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 msgid "Switch to Preview" msgstr "미리 보기로 전환" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 -#: src/slic3r/GUI/PrintHostDialogs.cpp:217 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +#: src/slic3r/GUI/PrintHostDialogs.cpp:267 msgid "Print host upload queue" msgstr "프린터 호스트 업로드 대기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/MainFrame.cpp:75 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 src/slic3r/GUI/MainFrame.cpp:77 msgid "Open new instance" msgstr "새 인스턴스 열기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 msgid "Camera view" msgstr "카메라 보기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 msgid "Show/Hide object/instance labels" msgstr "객체/인스턴스 레이블 표시/숨기기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Preferences.cpp:46 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Preferences.cpp:57 +#: src/slic3r/GUI/Preferences.cpp:165 src/slic3r/GUI/Preferences.cpp:188 +#: src/slic3r/GUI/Preferences.cpp:207 src/slic3r/GUI/Preferences.cpp:215 msgid "Preferences" msgstr "기본 설정" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 msgid "Show keyboard shortcuts list" msgstr "단축 키 목록 표시" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 msgid "Commands" msgstr "명령어" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 msgid "Add Instance of the selected object" msgstr "선택한 개체의 인스턴스 추가" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Remove Instance of the selected object" msgstr "선택한 개체의 인스턴스 제거" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 msgid "" "Press to select multiple objects\n" "or move multiple objects with mouse" @@ -5127,140 +6404,144 @@ msgstr "" "클릭하여 여러 개체를 선택합니다.\n" "또는 마우스로 여러 개체를 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 msgid "Press to activate selection rectangle" msgstr "선택 사각형을 활성화하려면 누릅니다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 msgid "Press to activate deselection rectangle" msgstr "이동을 눌러 선택 해제 사각형을 활성화합니다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Arrow Up" msgstr "화살표 위" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 msgid "Move selection 10 mm in positive Y direction" msgstr "선택 영역 10mm를 양수 Y 방향으로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Arrow Down" msgstr "화살표 다운" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 msgid "Move selection 10 mm in negative Y direction" msgstr "선택 영역 10mm를 음수 Y 방향으로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Arrow Left" msgstr "화살표 왼쪽" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 msgid "Move selection 10 mm in negative X direction" msgstr "선택 영역 10mm를 음수 X 방향으로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Arrow Right" msgstr "화살표 오른쪽" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 msgid "Move selection 10 mm in positive X direction" msgstr "선택 영역 10mm를 양수 X 방향으로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Any arrow" msgstr "모든 화살표" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 msgid "Movement step set to 1 mm" msgstr "1mm로 설정된 무브먼트 스텝" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Movement in camera space" msgstr "카메라 공간에서의 움직임" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Page Up" msgstr "Page Up" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Rotate selection 45 degrees CCW" msgstr "회전 선택 45도 CCW" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Page Down" msgstr "Page Down 키" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Rotate selection 45 degrees CW" msgstr "회전 선택 45도 CW" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 msgid "Gizmo move" msgstr "개체(Gizmo) 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 msgid "Gizmo scale" msgstr "개체(Gizmo) 배율" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Gizmo rotate" msgstr "개체(Gizmo) 회전" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Gizmo cut" msgstr "개체(Gizmo) 자르기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 msgid "Gizmo Place face on bed" msgstr "개체(Gizmo)를 배드위로" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 msgid "Gizmo SLA hollow" msgstr "기즈모 SLA 중공" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 msgid "Gizmo SLA support points" msgstr "SLA 개체(Gizmo) 서포트 지점들" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 msgid "Gizmo FDM paint-on supports" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 msgid "Gizmo FDM paint-on seam" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 msgid "Gizmo Multi Material painting" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +msgid "Gizmo Text emboss / engrave" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 msgid "Unselect gizmo or clear selection" msgstr "기즈모 선택 취소 또는 명확한 선택" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 msgid "Change camera type (perspective, orthographic)" msgstr "카메라 유형 변경(원근, 직교)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 msgid "Zoom to Bed" msgstr "배드 확대" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 msgid "" "Zoom to selected object\n" "or all objects in scene, if none selected" @@ -5268,172 +6549,172 @@ msgstr "" "선택한 개체로 확대/축소\n" "또는 장면의 모든 오브젝트가 선택되지 않은 경우" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 msgid "Zoom in" msgstr "확대" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Zoom out" msgstr "축소" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Switch between Editor/Preview" msgstr "편집기/미리 보기 간 전환" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Collapse/Expand the sidebar" msgstr "측면 표시줄 축소/확장" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled" msgstr "3Dconnexion 장치 설정 대화 상자 표시/숨기기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "3Dconnexion 장치 설정 대화 상자 표시/숨기기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 msgid "Minimize application" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 src/slic3r/GUI/MainFrame.cpp:284 -#: src/slic3r/GUI/MainFrame.cpp:333 src/slic3r/GUI/MainFrame.cpp:445 -#: src/slic3r/GUI/MainFrame.cpp:448 src/slic3r/GUI/MainFrame.cpp:470 -#: src/slic3r/GUI/MainFrame.cpp:473 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 src/slic3r/GUI/MainFrame.cpp:329 +#: src/slic3r/GUI/MainFrame.cpp:378 src/slic3r/GUI/MainFrame.cpp:490 +#: src/slic3r/GUI/MainFrame.cpp:493 src/slic3r/GUI/MainFrame.cpp:515 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Plater" msgstr "플레이트" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button" msgstr "모든 기즈모 : 회전 - 왼쪽 마우스 버튼; 팬 - 오른쪽 마우스 버튼" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 msgid "Gizmo move: Press to snap by 1mm" msgstr "기즈모 이동 : 1mm로 스냅 으로 눌러" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 msgid "Gizmo scale: Press to snap by 5%" msgstr "기즈모 스케일: 5% 스냅으로 누릅니다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 msgid "Gizmo scale: Scale selection to fit print volume" msgstr "기즈모 스케일: 인쇄 볼륨에 맞게 스케일 선택" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 msgid "Gizmo scale: Press to activate one direction scaling" msgstr "기즈모 스케일: 눌러 한 방향 배율을 활성화합니다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 msgid "Gizmo scale: Press to scale selected objects around their own center" msgstr "" "Gizmo 스케일: 자신의 중심 을 중심으로 선택한 개체의 크기를 조정하려면 누릅니" "다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 msgid "Gizmo rotate: Press to rotate selected objects around their own center" msgstr "기즈모 회전: 눌러 선택한 오브젝트를 자신의 중심 주위로 회전시다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "Gizmos" msgstr "Gizmos" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "" "The following shortcuts are applicable when the specified gizmo is active" msgstr "지정된 기즈모가 활성화된 경우 다음 바로 가기가 적용됩니다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 msgid "Set selected items as Printable/Unprintable" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:203 msgid "Set default extruder for the selected items" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 msgid "Set extruder number for the selected items" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 msgid "Objects List" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/MainFrame.cpp:1611 msgid "Open a G-code file" msgstr "G코드 파일 열기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 -#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 -#: src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 src/slic3r/GUI/MainFrame.cpp:1443 +#: src/slic3r/GUI/MainFrame.cpp:1447 src/slic3r/GUI/MainFrame.cpp:1616 +#: src/slic3r/GUI/MainFrame.cpp:1620 msgid "Reload the plater from disk" msgstr "디스크에서 플래터 다시 로드" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 msgid "Vertical slider - Move active thumb Up" msgstr "수직 슬라이더 - 활성 엄지 손가락을 위로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:228 msgid "Vertical slider - Move active thumb Down" msgstr "수직 슬라이더 - 활성 엄지 손가락을 아래로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 msgid "Horizontal slider - Move active thumb Left" msgstr "수평 슬라이더 - 활성 엄지 손가락 왼쪽으로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 msgid "Horizontal slider - Move active thumb Right" msgstr "수평 슬라이더 - 활성 엄지 손가락 오른쪽으로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:231 msgid "On/Off one layer mode of the vertical slider" msgstr "수직 슬라이더의 켜기/끄기 모드" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 -msgid "Show/Hide Legend and Estimated printing time" -msgstr "범례 표시/숨기기 및 예상 인쇄 시간" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:232 +msgid "Show/Hide legend" +msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 msgid "Show/Hide G-code window" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4480 -#: src/slic3r/GUI/Tab.cpp:2832 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 src/slic3r/GUI/Plater.cpp:4562 +#: src/slic3r/GUI/Tab.cpp:2736 msgid "Preview" msgstr "미리보기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 msgid "Move active thumb Up" msgstr "활성 엄지 손가락 위로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 msgid "Move active thumb Down" msgstr "활성 엄지 손가락 아래로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 msgid "Set upper thumb as active" msgstr "위 엄지 손가락을 활성으로 설정" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 msgid "Set lower thumb as active" msgstr "낮은 엄지 손가락을 활성으로 설정" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 msgid "Add color change marker for current layer" msgstr "현재 레이어의 색상을 변경할 마커 추가" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:238 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:244 msgid "Delete color change marker for current layer" msgstr "현재 레이어의 색상을 변경할 마커 삭제" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:250 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:251 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:245 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:256 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:257 msgid "" "Press to speed up 5 times while moving thumb\n" "with arrow keys or mouse wheel" @@ -5441,38 +6722,38 @@ msgstr "" "엄지 손가락을 이동하는 동안 5 배 속도를 눌러\n" "화살표 키 또는 마우스 휠" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "Vertical Slider" msgstr "세로 슬라이더" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "" "The following shortcuts are applicable in G-code preview when the vertical " "slider is active" msgstr "" "수직 슬라이더가 활성화된 G코드 미리 보기에는 다음 바로 가기가 적용됩니다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Move active thumb Left" msgstr "활성 엄지 손가락 왼쪽으로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Move active thumb Right" msgstr "활성 엄지 손가락 오른쪽으로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Set left thumb as active" msgstr "왼쪽 엄지 손가락을 활성으로 설정" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Set right thumb as active" msgstr "오른쪽 엄지 손가락을 활성으로 설정" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "Horizontal Slider" msgstr "수평 슬라이더" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "" "The following shortcuts are applicable in G-code preview when the horizontal " "slider is active" @@ -5480,232 +6761,232 @@ msgstr "" "수평 슬라이더가 활성화된 경우 다음 바로 가기는 G 코드 미리 보기에서 적용됩니" "다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:278 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:284 msgid "Keyboard shortcuts" msgstr "키보드 단축키" -#: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:77 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open a new PrusaSlicer instance" msgstr "새로운 프라사슬라이스인스턴스 열기" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:93 msgid "G-code preview" msgstr "G 코드 미리 보기" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:1388 msgid "Open G-code viewer" msgstr "G코드 뷰어 열기" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:91 src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open PrusaSlicer" msgstr "프라우슬라이서 오픈" -#: src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:93 msgid "Open new G-code viewer" msgstr "새로운 G코드 뷰어 열기" -#: src/slic3r/GUI/MainFrame.cpp:225 +#: src/slic3r/GUI/MainFrame.cpp:227 msgid "Closing PrusaSlicer. Current project is modified." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "PrusaSlicer is closing" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "Closing PrusaSlicer while some presets are modified." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:285 src/slic3r/GUI/MainFrame.cpp:335 -#: src/slic3r/GUI/Tab.hpp:427 src/slic3r/GUI/Tab.hpp:550 +#: src/slic3r/GUI/MainFrame.cpp:330 src/slic3r/GUI/MainFrame.cpp:380 +#: src/slic3r/GUI/Tab.hpp:413 src/slic3r/GUI/Tab.hpp:539 msgid "Print Settings" msgstr "출력 설정" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:535 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:384 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:520 msgid "Material Settings" msgstr "재질 설정" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:461 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:382 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:448 msgid "Filament Settings" msgstr "필라멘트 설정" -#: src/slic3r/GUI/MainFrame.cpp:287 src/slic3r/GUI/MainFrame.cpp:341 -#: src/slic3r/GUI/Tab.hpp:503 +#: src/slic3r/GUI/MainFrame.cpp:332 src/slic3r/GUI/MainFrame.cpp:386 +#: src/slic3r/GUI/Tab.hpp:488 msgid "Printer Settings" msgstr "프린터 설정" -#: src/slic3r/GUI/MainFrame.cpp:632 src/slic3r/GUI/Plater.cpp:1719 -#: src/slic3r/GUI/Plater.cpp:2850 +#: src/slic3r/GUI/MainFrame.cpp:685 src/slic3r/GUI/Plater.cpp:1728 +#: src/slic3r/GUI/Plater.cpp:2879 msgid "Untitled" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:655 +#: src/slic3r/GUI/MainFrame.cpp:710 msgid "based on Slic3r" msgstr "Slic3r 기반" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Prusa 3D &Drivers" msgstr "프라사 3D 및 드라이버" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Open the Prusa3D drivers download page in your browser" msgstr "브라우저에서 Prusa3D 드라이버 다운로드 페이지를 엽니다." -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Software &Releases" msgstr "소프트웨어 및 릴리스" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open the software releases page in your browser" msgstr "브라우저에서 소프트웨어 릴리스 페이지 열기" -#: src/slic3r/GUI/MainFrame.cpp:1081 +#: src/slic3r/GUI/MainFrame.cpp:1158 #, c-format, boost-format msgid "%s &Website" msgstr "%s 및 웹사이트" -#: src/slic3r/GUI/MainFrame.cpp:1082 +#: src/slic3r/GUI/MainFrame.cpp:1159 #, c-format, boost-format msgid "Open the %s website in your browser" msgstr "브라우저에서 %s 웹 사이트 열기" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "System &Info" msgstr "시스템 및 정보" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "Show system information" msgstr "시스템 정보 표시" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show &Configuration Folder" msgstr "폴더 표시 및 구성" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show user configuration folder (datadir)" msgstr "사용자 구성 폴더를 표시 (datadir)" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "Report an I&ssue" msgstr " 이슈내용 신고" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 #, c-format, boost-format msgid "Report an issue on %s" msgstr "%s 문제 보고" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 #, c-format, boost-format msgid "&About %s" msgstr "%s 정보" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 msgid "Show about dialog" msgstr "대화상자 표시" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1177 msgid "Show Tip of the Day" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1104 +#: src/slic3r/GUI/MainFrame.cpp:1181 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/MainFrame.cpp:1184 msgid "Show the list of the keyboard shortcuts" msgstr "키보드 단축키 목록 표시" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso" msgstr "ISO" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso View" msgstr "표준 보기" #. TRN To be shown in the main menu View->Top #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2917 -#: src/libslic3r/PrintConfig.cpp:2926 +#: src/slic3r/GUI/MainFrame.cpp:1202 src/libslic3r/PrintConfig.cpp:3005 +#: src/libslic3r/PrintConfig.cpp:3014 msgid "Top" msgstr "상단 " -#: src/slic3r/GUI/MainFrame.cpp:1125 +#: src/slic3r/GUI/MainFrame.cpp:1202 msgid "Top View" msgstr "위에서 보기 " #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:446 -#: src/libslic3r/PrintConfig.cpp:455 +#: src/slic3r/GUI/MainFrame.cpp:1205 src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:474 msgid "Bottom" msgstr "하단 " -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1205 msgid "Bottom View" msgstr "바닥 보기 " -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front" msgstr "앞 " -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front View" msgstr "앞면 보기 " -#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2274 +#: src/slic3r/GUI/MainFrame.cpp:1209 src/libslic3r/PrintConfig.cpp:2300 msgid "Rear" msgstr "뒷면 " -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1209 msgid "Rear View" msgstr "뒷면 보기 " -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left" msgstr "왼쪽" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left View" msgstr "왼쪽 보기 " -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right" msgstr "오른쪽" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right View" msgstr "오른쪽 보기 " -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "&New Project" msgstr "새로운 프로젝트" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "Start a new project" msgstr "새 프로젝트 시작" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "&Open Project" msgstr "&프로젝트 열기" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "Open a project file" msgstr "프로젝트 파일 열기" -#: src/slic3r/GUI/MainFrame.cpp:1157 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Recent projects" msgstr "최근 프로젝트" -#: src/slic3r/GUI/MainFrame.cpp:1169 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -5713,523 +6994,557 @@ msgstr "" "선택한 프로젝트를 더 이상 사용할 수 없습니다.\n" "최근 프로젝트 목록에서 제거하시겠습니까?" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Save Project" msgstr "프로젝트 저장" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "Save current project file" msgstr "현재 프로젝트 파일 저장" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save Project &as" msgstr "프로젝트 저장 및" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save current project file as" msgstr "현재 프로젝트 파일을 저장." -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Import STL/3MF/STEP/OBJ/AM&F" msgstr "STL/3MF/STEP/OBJ/AMF 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Load a model" msgstr "모델 로드" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Import STL (Imperial Units)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Load an model saved with imperial units" msgstr "제국 단위로 저장된 모델 로드" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Import SL1 / SL1S Archive" +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Import SLA Archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Load an SLA archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Import ZIP Achive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Load an SL1 / Sl1S archive" +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Load a zip achive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Import &Config" msgstr "&구성 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Load exported configuration file" msgstr "내 보낸 구성 파일로드" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Import Config from &Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Load configuration from project file" msgstr "프로젝트 파일에서 구성 부하" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Import Config &Bundle" msgstr "가져오기 구성 및 번들 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Load presets from a bundle" msgstr "미리 설정 번들값 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1231 +#: src/slic3r/GUI/MainFrame.cpp:1311 msgid "&Import" msgstr "&가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1314 src/slic3r/GUI/MainFrame.cpp:1676 msgid "Export &G-code" msgstr "내보내기 및 G 코드" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1314 msgid "Export current plate as G-code" msgstr "현재 플레이터를 G 코드로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1318 src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end G-code" msgstr "S&end G- 코드" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1318 msgid "Send to print current plate as G-code" msgstr "현재 플레이트를 G 코드로 인쇄하기 위해 보내기" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export G-code to SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "현재 플레이트를 G 코드로 SD 카드/플래시 드라이브로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export Plate as &STL" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export Plate as &STL/OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export current plate as STL" -msgstr "현재 플레이터를 STL로 내보내기" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export current plate as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export Plate as STL &Including Supports" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export Plate as STL/OBJ &Including Supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export current plate as STL including supports" -msgstr "서포트를 포함 하여 현재 플레이터를 STL로 내보내기" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export current plate as STL/OBJ including supports" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export &Toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export toolpaths as OBJ" msgstr "공구 경로를 OBJ로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export &Config" msgstr "&구성 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export current configuration to file" msgstr "현재 구성을 파일로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export Config &Bundle" msgstr "구성 및 번들 내보내기 " -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export all presets to file" msgstr "모든 이전 설정을 파일로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export Config Bundle With Physical Printers" msgstr "프린터 구성 번들 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export all presets including physical printers to file" msgstr "실제 프린터를 포함한 모든 사전 설정내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1270 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "&Export" msgstr "&내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Ejec&t SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "G 코드가 내보낸 후 SD 카드/플래시 드라이브를 배출합니다." -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Quick Slice" msgstr "빠른 슬라이스" -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Slice a file into a G-code" msgstr "파일을 G 코드로 분할" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Quick Slice and Save As" msgstr "빠른 슬라이스와 저장" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Slice a file into a G-code, save as" msgstr "파일을 G 코드로 분할하고 다른 이름으로 저장" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat Last Quick Slice" msgstr "마지막으로 빠른 슬라이스 반복" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat last quick slice" msgstr "마지막으로 빠른 슬라이스 반복" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "(Re)Slice No&w" msgstr "(Re)지금 슬라이스 " -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "Start new slicing process" msgstr "새로운 슬라이싱 작업 시작" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "&Repair STL file" msgstr "STL 파일 수리" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "Automatically repair an STL file" msgstr "STL 파일을 자동으로 복구합니다" -#: src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:1388 msgid "&G-code Preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1392 +msgid "E&xit" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1392 src/slic3r/GUI/UpdateDialogs.cpp:376 +#: src/slic3r/GUI/UpdateDialogs.cpp:423 +#, c-format, boost-format +msgid "Exit %s" +msgstr "%s Exit" + +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 msgid "&Quit" msgstr "종료" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 #, c-format, boost-format msgid "Quit %s" msgstr "종료 %s" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1410 msgid "&Select All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1327 +#: src/slic3r/GUI/MainFrame.cpp:1411 msgid "Selects all objects" msgstr "모든 개체를 선택 합니다" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1413 msgid "D&eselect All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1414 msgid "Deselects all objects" msgstr "모든 개체의 선택 취소" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1417 msgid "&Delete Selected" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1334 +#: src/slic3r/GUI/MainFrame.cpp:1418 msgid "Deletes the current selection" msgstr "현재 선택 영역을 삭제 합니다" -#: src/slic3r/GUI/MainFrame.cpp:1336 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Delete &All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1421 msgid "Deletes all objects" msgstr "모든 객체를 삭제 합니다" -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1425 msgid "&Undo" msgstr "되돌리기(&U)" -#: src/slic3r/GUI/MainFrame.cpp:1344 +#: src/slic3r/GUI/MainFrame.cpp:1428 msgid "&Redo" msgstr "&앞으로" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1433 msgid "&Copy" msgstr "복사(&C)" -#: src/slic3r/GUI/MainFrame.cpp:1350 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Copy selection to clipboard" msgstr "선택영역을 클립보드로 복사합니다" -#: src/slic3r/GUI/MainFrame.cpp:1352 +#: src/slic3r/GUI/MainFrame.cpp:1436 msgid "&Paste" msgstr "&붙여넣기" -#: src/slic3r/GUI/MainFrame.cpp:1353 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "Paste clipboard" msgstr "붙여 넣기 클립 보드" -#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 -#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 +#: src/slic3r/GUI/MainFrame.cpp:1442 src/slic3r/GUI/MainFrame.cpp:1446 +#: src/slic3r/GUI/MainFrame.cpp:1615 src/slic3r/GUI/MainFrame.cpp:1619 msgid "Re&load from Disk" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1368 +#: src/slic3r/GUI/MainFrame.cpp:1452 msgid "Searc&h" msgstr "검색" -#: src/slic3r/GUI/MainFrame.cpp:1369 +#: src/slic3r/GUI/MainFrame.cpp:1453 msgid "Search in settings" msgstr "설정 검색" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "&Plater Tab" msgstr "&선택 및 플래이터 탭" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "Show the plater" msgstr "플레이터를 보기" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "P&rint Settings Tab" msgstr "프린트 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "Show the print settings" msgstr "인쇄 설정 표시" -#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1469 src/slic3r/GUI/MainFrame.cpp:1679 msgid "&Filament Settings Tab" msgstr "&필라멘트 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1469 msgid "Show the filament settings" msgstr "필라멘트 설정보기" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Print&er Settings Tab" msgstr "인쇄 및 어 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Show the printer settings" msgstr "프린터 설정 표시" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "3&D" msgstr "3D" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "Show the 3D editing view" msgstr "3D 편집 보기 표시" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Pre&view" msgstr "사전 보기" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Show the 3D slices preview" msgstr "3D 슬라이스 미리 보기 표시" -#: src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/MainFrame.cpp:1488 msgid "Open the dialog to modify shape gallery" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Print &Host Upload Queue" msgstr "프린터 호스트 업로드 대기" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Display the Print Host Upload Queue window" msgstr "인쇄 호스트 업로드 대기열 창 표시" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open New Instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1424 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 +#: src/slic3r/GUI/MainFrame.cpp:1507 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1727 msgid "Compare Presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/MainFrame.cpp:1507 msgid "Compare presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show &Labels" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show object/instance labels in 3D scene" msgstr "3D 씬에서 개체/인스턴스 레이블 표시" -#: src/slic3r/GUI/MainFrame.cpp:1437 +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show Legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show legend in preview" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1523 msgid "&Collapse Sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1523 src/slic3r/GUI/Plater.cpp:2347 msgid "Collapse sidebar" msgstr "사이드바 축소" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "&Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1543 src/slic3r/GUI/MainFrame.cpp:1650 msgid "&File" msgstr "&파일" -#: src/slic3r/GUI/MainFrame.cpp:1458 +#: src/slic3r/GUI/MainFrame.cpp:1544 msgid "&Edit" msgstr "&수정" -#: src/slic3r/GUI/MainFrame.cpp:1459 +#: src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Window" msgstr "&윈도우" -#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 +#: src/slic3r/GUI/MainFrame.cpp:1546 src/slic3r/GUI/MainFrame.cpp:1651 msgid "&View" msgstr "보기(&V)" -#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 +#: src/slic3r/GUI/MainFrame.cpp:1549 src/slic3r/GUI/MainFrame.cpp:1654 msgid "&Help" msgstr "&도움" -#: src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/MainFrame.cpp:1611 msgid "&Open G-code" msgstr "G 코드 열기" -#: src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open &PrusaSlicer" msgstr "프라우슬라이서 오픈" -#: src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legend" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1676 msgid "E&xport" msgstr "보내기" -#: src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end to print" msgstr "끝내고 프린트" -#: src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1679 msgid "Mate&rial Settings Tab" msgstr "재료(메터리리알) 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:1613 +#: src/slic3r/GUI/MainFrame.cpp:1703 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "슬라이스 할 파일을 선택하십시오 (STL / OBJ / AMF / 3MF / PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1625 +#: src/slic3r/GUI/MainFrame.cpp:1715 msgid "No previously sliced file." msgstr "이전에 분리 된 파일이 없습니다." -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid "Previously sliced file (" msgstr "이전에 분리 된 파일 (" -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 #, fuzzy msgid ") not found." msgstr ")을 찾을 수 없습니다." -#: src/slic3r/GUI/MainFrame.cpp:1633 +#: src/slic3r/GUI/MainFrame.cpp:1723 msgid "File Not Found" msgstr "파일을 찾을 수 없음" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 #, c-format, boost-format msgid "Save %s file as:" msgstr "%s 파일을 저장 합니다:" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "SVG" msgstr "SVG 업로드 사용" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "G-code" msgstr "%1%로 내보낸 G 코드 파일" -#: src/slic3r/GUI/MainFrame.cpp:1680 +#: src/slic3r/GUI/MainFrame.cpp:1770 msgid "Save zip file as:" msgstr "압축(zip)파일 다른이름 저장:" -#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6064 src/slic3r/GUI/Tab.cpp:1666 -#: src/slic3r/GUI/Tab.cpp:4730 +#: src/slic3r/GUI/MainFrame.cpp:1779 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6654 src/slic3r/GUI/Tab.cpp:1628 +#: src/slic3r/GUI/Tab.cpp:4986 msgid "Slicing" msgstr "새로운 슬라이싱 작업 시작" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1691 +#: src/slic3r/GUI/MainFrame.cpp:1781 #, c-format, boost-format msgid "Processing %s" msgstr "처리 %s" -#: src/slic3r/GUI/MainFrame.cpp:1714 +#: src/slic3r/GUI/MainFrame.cpp:1804 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% 성공적으로 슬라이스되었습니다." -#: src/slic3r/GUI/MainFrame.cpp:1717 +#: src/slic3r/GUI/MainFrame.cpp:1807 msgid "Slicing Done!" msgstr "슬라이스 완료!" -#: src/slic3r/GUI/MainFrame.cpp:1733 +#: src/slic3r/GUI/MainFrame.cpp:1823 msgid "Select the STL file to repair:" msgstr "복구 할 STL 파일을 선택." -#: src/slic3r/GUI/MainFrame.cpp:1743 +#: src/slic3r/GUI/MainFrame.cpp:1833 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "OBJ 파일을 저장하십시오 (STL보다 오류를 덜 조정할 가능성이 적음)." -#: src/slic3r/GUI/MainFrame.cpp:1754 +#: src/slic3r/GUI/MainFrame.cpp:1844 msgid "Your file was repaired." msgstr "파일이 복구되었습니다." -#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4528 +#: src/slic3r/GUI/MainFrame.cpp:1844 src/libslic3r/PrintConfig.cpp:4694 msgid "Repair" msgstr "수정" -#: src/slic3r/GUI/MainFrame.cpp:1768 +#: src/slic3r/GUI/MainFrame.cpp:1858 msgid "Save configuration as:" msgstr "구성을 저장 :" -#: src/slic3r/GUI/MainFrame.cpp:1785 +#: src/slic3r/GUI/MainFrame.cpp:1875 msgid "Loading of a configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 +#: src/slic3r/GUI/MainFrame.cpp:1877 src/slic3r/GUI/MainFrame.cpp:1944 msgid "Select configuration to load:" msgstr "불러올 구성 선택 :" -#: src/slic3r/GUI/MainFrame.cpp:1816 +#: src/slic3r/GUI/MainFrame.cpp:1908 msgid "Exporting configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1817 +#: src/slic3r/GUI/MainFrame.cpp:1909 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1826 +#: src/slic3r/GUI/MainFrame.cpp:1918 msgid "Save presets bundle as:" msgstr "이전 번들 설정을 다음과 같이 저장 :" -#: src/slic3r/GUI/MainFrame.cpp:1849 +#: src/slic3r/GUI/MainFrame.cpp:1941 msgid "Loading of a configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1879 +#: src/slic3r/GUI/MainFrame.cpp:1971 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d 사전 설정을 가져 왔습니다." @@ -6298,19 +7613,19 @@ msgstr "" msgid "%s information" msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:752 +#: src/slic3r/GUI/NotificationManager.hpp:899 msgid "3D Mouse disconnected." msgstr "3D 마우스 연결이 끊어졌습니다." -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "Configuration update is available." msgstr "구성 업데이트를 사용할 수 있음" -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "See more." msgstr "자세한 내용은 참조하십시오." -#: src/slic3r/GUI/NotificationManager.hpp:761 +#: src/slic3r/GUI/NotificationManager.hpp:908 msgid "" "You have just added a G-code for color change, but its value is empty.\n" "To export the G-code correctly, check the \"Color Change G-code\" in " @@ -6320,145 +7635,187 @@ msgstr "" "G 코드를 올바르게 내보내려면 \"프린터 설정 > 사용자 지정 G 코드\"에서 \"색상 " "변경 G 코드\"를 확인합니다." -#: src/slic3r/GUI/NotificationManager.hpp:764 +#: src/slic3r/GUI/NotificationManager.hpp:911 msgid "" "No color change event was added to the print. The print does not look like a " "sign." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:766 +#: src/slic3r/GUI/NotificationManager.hpp:913 msgid "Desktop integration was successful." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:768 +#: src/slic3r/GUI/NotificationManager.hpp:915 msgid "Desktop integration failed." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:770 +#: src/slic3r/GUI/NotificationManager.hpp:917 msgid "Undo desktop integration was successful." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:772 +#: src/slic3r/GUI/NotificationManager.hpp:919 msgid "Undo desktop integration failed." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:773 +#: src/slic3r/GUI/NotificationManager.hpp:920 msgid "Exporting." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:664 +#: src/slic3r/GUI/NotificationManager.hpp:924 +msgid "" +"PrusaSlicer recieved a download request from Printables.com, but it's not " +"allowed. You can allow it" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:925 +msgid "here." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:773 msgid "Open Folder." msgstr "폴더를 엽니다." -#: src/slic3r/GUI/NotificationManager.cpp:701 +#: src/slic3r/GUI/NotificationManager.cpp:811 msgid "Eject drive" msgstr "배출 드라이브" -#: src/slic3r/GUI/NotificationManager.cpp:885 +#: src/slic3r/GUI/NotificationManager.cpp:1054 +#: src/slic3r/GUI/NotificationManager.cpp:1267 +#: src/slic3r/GUI/NotificationManager.cpp:1472 msgid "ERROR" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:890 -msgid "CANCELED" +#: src/slic3r/GUI/NotificationManager.cpp:1269 +#: src/slic3r/GUI/NotificationManager.cpp:1377 +msgid "COMPLETED" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:895 -msgid "COMPLETED" +#: src/slic3r/GUI/NotificationManager.cpp:1467 +msgid "RESOLVING ADDRESS" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:1477 +msgid "CANCELED" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:937 +#: src/slic3r/GUI/NotificationManager.cpp:1539 msgid "Cancel upload" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:996 +#: src/slic3r/GUI/NotificationManager.cpp:1648 #, c-format, boost-format msgid "%1$d object was loaded with custom supports." msgid_plural "%1$d objects were loaded with custom supports." msgstr[0] "" -#: src/slic3r/GUI/NotificationManager.cpp:997 +#: src/slic3r/GUI/NotificationManager.cpp:1649 #, c-format, boost-format msgid "%1$d object was loaded with custom seam." msgid_plural "%1$d objects were loaded with custom seam." msgstr[0] "" -#: src/slic3r/GUI/NotificationManager.cpp:998 +#: src/slic3r/GUI/NotificationManager.cpp:1650 #, c-format, boost-format msgid "%1$d object was loaded with multimaterial painting." msgid_plural "%1$d objects were loaded with multimaterial painting." msgstr[0] "" -#: src/slic3r/GUI/NotificationManager.cpp:999 +#: src/slic3r/GUI/NotificationManager.cpp:1651 #, c-format, boost-format msgid "%1$d object was loaded with variable layer height." msgid_plural "%1$d objects were loaded with variable layer height." msgstr[0] "" -#: src/slic3r/GUI/NotificationManager.cpp:1000 +#: src/slic3r/GUI/NotificationManager.cpp:1652 #, c-format, boost-format msgid "%1$d object was loaded with partial sinking." msgid_plural "%1$d objects were loaded with partial sinking." msgstr[0] "" -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1653 +#, c-format, boost-format +msgid "%1$d object was loaded as a part of cut object." +msgid_plural "%1$d objects were loaded as parts of cut object" +msgstr[0] "" + +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Slicing finished." msgstr "슬라이스가 끝났습니다." -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export G-Code." msgstr "G-코드 내보내기." -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1447 -#: src/slic3r/GUI/NotificationManager.cpp:1454 -#: src/slic3r/GUI/NotificationManager.cpp:1470 -#: src/slic3r/GUI/NotificationManager.cpp:1476 -#: src/slic3r/GUI/NotificationManager.cpp:1547 +#: src/slic3r/GUI/NotificationManager.cpp:2101 +#: src/slic3r/GUI/NotificationManager.cpp:2108 +#: src/slic3r/GUI/NotificationManager.cpp:2124 +#: src/slic3r/GUI/NotificationManager.cpp:2130 +#: src/slic3r/GUI/NotificationManager.cpp:2201 msgid "ERROR:" msgstr "오류:" -#: src/slic3r/GUI/NotificationManager.cpp:1459 -#: src/slic3r/GUI/NotificationManager.cpp:1486 -#: src/slic3r/GUI/NotificationManager.cpp:1494 -#: src/slic3r/GUI/NotificationManager.cpp:1505 src/slic3r/GUI/Plater.cpp:3197 +#: src/slic3r/GUI/NotificationManager.cpp:2113 +#: src/slic3r/GUI/NotificationManager.cpp:2140 +#: src/slic3r/GUI/NotificationManager.cpp:2148 +#: src/slic3r/GUI/NotificationManager.cpp:2159 src/slic3r/GUI/Plater.cpp:3220 msgid "WARNING:" msgstr "경고" -#: src/slic3r/GUI/NotificationManager.cpp:1598 +#: src/slic3r/GUI/NotificationManager.cpp:2275 msgid "Exporting finished." msgstr "내보내기가 완료되었습니다." -#: src/slic3r/GUI/ObjectDataViewModel.cpp:50 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 msgid "Paint-on seam" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:52 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:68 +msgid "Cut connectors" +msgstr "" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:70 msgid "Sinking" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:110 msgid "Instances" msgstr "적용" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:98 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:266 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:114 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:275 #, c-format, boost-format msgid "Instance %d" msgstr "인스턴스 %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4568 -#: src/slic3r/GUI/Tab.cpp:4659 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:121 src/slic3r/GUI/Tab.cpp:4805 +#: src/slic3r/GUI/Tab.cpp:4942 msgid "Layers" msgstr "레이어" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 msgid "Range" msgstr "범위" -#: src/slic3r/GUI/OpenGLManager.cpp:258 +#: src/slic3r/GUI/OpenGLManager.cpp:376 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL ES 2.0 capable graphics driver to run " +"correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:379 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL %s capable graphics driver to run correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:382 #, c-format, boost-format msgid "" "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" @@ -6468,21 +7825,21 @@ msgstr "" "니다. \n" "OpenGL 버전은 %s, 렌더링 %s 동안, 공급 업체 %s 감지되었습니다." -#: src/slic3r/GUI/OpenGLManager.cpp:261 +#: src/slic3r/GUI/OpenGLManager.cpp:386 msgid "You may need to update your graphics card driver." msgstr "그래픽 카드 드라이버를 업데이트해야 할 수 있습니다." -#: src/slic3r/GUI/OpenGLManager.cpp:264 +#: src/slic3r/GUI/OpenGLManager.cpp:389 msgid "" "As a workaround, you may run PrusaSlicer with a software rendered 3D " "graphics by running prusa-slicer.exe with the --sw-renderer parameter." msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:266 +#: src/slic3r/GUI/OpenGLManager.cpp:391 msgid "Unsupported OpenGL version" msgstr "지원되지 않는 OpenGL 버전" -#: src/slic3r/GUI/OpenGLManager.cpp:274 +#: src/slic3r/GUI/OpenGLManager.cpp:399 #, c-format, boost-format msgid "" "Unable to load the following shaders:\n" @@ -6491,16 +7848,20 @@ msgstr "" "다음 샤더를 로드할 수 없습니다.\n" "%s" -#: src/slic3r/GUI/OpenGLManager.cpp:275 +#: src/slic3r/GUI/OpenGLManager.cpp:400 msgid "Error loading shaders" msgstr "오류 로드 샤더" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:126 +msgid "Unavailable for this method." +msgstr "" + +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Top" msgstr "상단 " -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Bottom" msgstr "하단 " @@ -6509,7 +7870,7 @@ msgstr "하단 " msgid "Delete this preset from this printer device" msgstr "이 프린터 장치에서 이 사전 설정 삭제" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:83 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:84 msgid "This printer will be shown in the presets list as" msgstr "이 프린터는 사전 설정 목록에 표시됩니다." @@ -6525,31 +7886,31 @@ msgstr "프린터의 설명 이름" msgid "Add preset for this printer device" msgstr "이 프린터 장치에 대한 사전 설정 추가" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2255 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2239 msgid "Print Host upload" msgstr "프린터 호스트 업로드 대기" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:268 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:271 msgid "Connection to printers connected via the print host failed." msgstr "인쇄 호스트를 통해 연결된 프린터에 대한 연결이 실패했습니다." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:310 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:313 msgid "Test" msgstr "테스트" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:315 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:318 msgid "Could not get a valid Printer Host reference" msgstr "유효한 프린터 호스트 참조를 가져올 수 없습니다" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:330 msgid "Success!" msgstr "성공!" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:337 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:340 msgid "Refresh Printers" msgstr "프린터 새로 고침" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:367 msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." @@ -6557,20 +7918,20 @@ msgstr "" "HTTPS CA 파일은 선택 사항입니다. 자체 서명된 인증서와 함께 HTTPS를 사용하는 " "경우에만 필요합니다." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:374 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:377 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "인증서 파일(*.crt, *.pem)|*.crt;*.pem| 모든 파일|**" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:378 msgid "Open CA certificate file" msgstr "CA 인증서 파일 열기" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:404 -#: src/libslic3r/PrintConfig.cpp:330 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:407 +#: src/libslic3r/PrintConfig.cpp:343 msgid "HTTPS CA File" msgstr "HTTPS CA 파일" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:405 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:408 #, c-format, boost-format msgid "" "On this system, %s uses HTTPS certificates from the system Certificate Store " @@ -6579,7 +7940,7 @@ msgstr "" "이 시스템에서 는 %s 시스템 인증서 저장소 또는 키체인의 HTTPS 인증서를 사용합" "니다." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:406 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:409 msgid "" "To use a custom CA file, please import your CA file into Certificate Store / " "Keychain." @@ -6587,24 +7948,24 @@ msgstr "" "사용자 지정 CA 파일을 사용하려면 CA 파일을 인증서 저장소/ 키체인으로 가져오십" "시오." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:634 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:706 msgid "The supplied name is empty. It can't be saved." msgstr "파일 이름이 비어 있습니다. 저장할 수 없습니다." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:638 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:710 msgid "You have to enter a printer name." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:646 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:718 #, boost-format msgid "Printer with name \"%1%\" already exists." msgstr "\"%1%\"라는 이름의 프린터가 이미 있습니다." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:647 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:719 msgid "Replace?" msgstr "교체?" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:674 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:746 #, boost-format msgid "" "Following printer preset is duplicated:%1%The above preset for printer \"%2%" @@ -6614,207 +7975,204 @@ msgid_plural "" "\"%2%\" will be used just once." msgstr[0] "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:724 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:796 msgid "It's not possible to delete the last related preset for the printer." msgstr "프린터의 마지막 관련 사전 설정을 삭제할 수 없습니다." -#: src/slic3r/GUI/Plater.cpp:141 +#: src/slic3r/GUI/Plater.cpp:158 msgid "The provided name is not valid;" msgstr "" -#: src/slic3r/GUI/Plater.cpp:142 src/slic3r/GUI/SavePresetDialog.cpp:102 +#: src/slic3r/GUI/Plater.cpp:159 src/slic3r/GUI/SavePresetDialog.cpp:166 msgid "the following characters are not allowed:" msgstr "다음 문자는 허용되지 않습니다:" -#: src/slic3r/GUI/Plater.cpp:207 +#: src/slic3r/GUI/Plater.cpp:223 msgid "" "For a multipart object, this value isn't accurate.\n" "It doesn't take account of intersections and negative volumes." msgstr "" -#: src/slic3r/GUI/Plater.cpp:211 +#: src/slic3r/GUI/Plater.cpp:227 msgid "Volume" msgstr "볼륨" -#: src/slic3r/GUI/Plater.cpp:213 +#: src/slic3r/GUI/Plater.cpp:229 msgid "Facets" msgstr "측면" -#: src/slic3r/GUI/Plater.cpp:276 +#: src/slic3r/GUI/Plater.cpp:286 msgid "Sliced Info" msgstr "슬라이스된 정보" -#: src/slic3r/GUI/Plater.cpp:296 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:306 src/slic3r/GUI/Plater.cpp:1414 msgid "Used Filament (g)" msgstr "사용자 필라멘트 (g)" -#: src/slic3r/GUI/Plater.cpp:297 src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:307 src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (m)" msgstr "사용자 필라멘트 (m)" -#: src/slic3r/GUI/Plater.cpp:298 src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:308 src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (mm³)" msgstr "사용자 필라멘트 (mm³)" -#: src/slic3r/GUI/Plater.cpp:299 +#: src/slic3r/GUI/Plater.cpp:309 msgid "Used Material (unit)" msgstr "중고 재료(단위)" -#: src/slic3r/GUI/Plater.cpp:300 +#: src/slic3r/GUI/Plater.cpp:310 msgid "Cost (money)" msgstr "비용 (돈)" -#: src/slic3r/GUI/Plater.cpp:301 src/slic3r/GUI/Plater.cpp:1340 -#: src/slic3r/GUI/Plater.cpp:1427 +#: src/slic3r/GUI/Plater.cpp:311 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:1464 msgid "Estimated printing time" msgstr "예상 인쇄 시간" -#: src/slic3r/GUI/Plater.cpp:302 +#: src/slic3r/GUI/Plater.cpp:312 msgid "Number of tool changes" msgstr "공구(tool) 변경 수" -#: src/slic3r/GUI/Plater.cpp:431 +#: src/slic3r/GUI/Plater.cpp:437 msgid "Select what kind of support do you need" msgstr "필요한 지원 종류를 선택합니다." -#: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2590 -#: src/libslic3r/PrintConfig.cpp:3645 +#: src/slic3r/GUI/Plater.cpp:440 src/libslic3r/PrintConfig.cpp:2620 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "Support on build plate only" msgstr "출력물만 서포트를 지지" -#: src/slic3r/GUI/Plater.cpp:434 src/slic3r/GUI/Plater.cpp:564 +#: src/slic3r/GUI/Plater.cpp:441 msgid "For support enforcers only" msgstr "서포트 지원영역 전용" -#: src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Plater.cpp:442 msgid "Everywhere" msgstr "어디에서든" -#: src/slic3r/GUI/Plater.cpp:467 src/slic3r/GUI/Tab.cpp:1542 +#: src/slic3r/GUI/Plater.cpp:475 src/slic3r/GUI/Tab.cpp:1489 msgid "Brim" msgstr "테두리" -#: src/slic3r/GUI/Plater.cpp:469 +#: src/slic3r/GUI/Plater.cpp:477 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." msgstr "첫 번째 레이어의 각 객체(object) 주위에 인쇄 될 브림을 활성화합니다." -#: src/slic3r/GUI/Plater.cpp:477 +#: src/slic3r/GUI/Plater.cpp:485 msgid "Purging volumes" msgstr "볼륨 삭제 - 볼륨 로드/언로드" -#: src/slic3r/GUI/Plater.cpp:578 +#: src/slic3r/GUI/Plater.cpp:592 msgid "Select what kind of pad do you need" msgstr "필요한 패드 종류를 선택하십시오." -#: src/slic3r/GUI/Plater.cpp:580 +#: src/slic3r/GUI/Plater.cpp:595 msgid "Below object" msgstr "아래 개체" -#: src/slic3r/GUI/Plater.cpp:581 +#: src/slic3r/GUI/Plater.cpp:596 msgid "Around object" msgstr "개체 주변" -#: src/slic3r/GUI/Plater.cpp:894 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/Plater.cpp:929 src/slic3r/GUI/Plater.cpp:7162 msgid "Send to printer" msgstr "프린터로 보내기" -#: src/slic3r/GUI/Plater.cpp:914 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6067 +#: src/slic3r/GUI/Plater.cpp:949 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6657 msgid "Slice now" msgstr "바로 슬라이스" -#: src/slic3r/GUI/Plater.cpp:1087 +#: src/slic3r/GUI/Plater.cpp:1127 msgid "Hold Shift to Slice & Export G-code" msgstr "슬라이스로 의 전환 보류 및 내보내기 G 코드" -#: src/slic3r/GUI/Plater.cpp:1287 +#: src/slic3r/GUI/Plater.cpp:1324 #, boost-format msgid "%1% (%2$d shell)" msgid_plural "%1% (%2$d shells)" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:1315 +#: src/slic3r/GUI/Plater.cpp:1352 msgid "Used Material (ml)" msgstr "중고 재료 (ml)" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "object" msgid_plural "objects" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "supports and pad" msgstr "지지대 및 패드" -#: src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (in)" msgstr "사용자 필라멘트 (mm³)" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "objects" msgstr "사물" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "wipe tower" msgstr "와이프 타워 - 버려진 필라멘트 조절" -#: src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (in³)" msgstr "사용자 필라멘트 (mm³)" -#: src/slic3r/GUI/Plater.cpp:1396 +#: src/slic3r/GUI/Plater.cpp:1433 #, boost-format msgid "Filament at extruder %1%" msgstr "압출기 %1% 필라멘트" -#: src/slic3r/GUI/Plater.cpp:1402 +#: src/slic3r/GUI/Plater.cpp:1439 msgid "(including spool)" msgstr "(스풀 포함)" -#: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1072 -#: src/libslic3r/PrintConfig.cpp:3439 src/libslic3r/PrintConfig.cpp:3440 +#: src/slic3r/GUI/Plater.cpp:1448 src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:3716 src/libslic3r/PrintConfig.cpp:3717 msgid "Cost" msgstr "비용" -#: src/slic3r/GUI/Plater.cpp:1429 +#: src/slic3r/GUI/Plater.cpp:1466 msgid "normal mode" msgstr "일반 모드" -#: src/slic3r/GUI/Plater.cpp:1436 +#: src/slic3r/GUI/Plater.cpp:1473 msgid "stealth mode" msgstr "스텔스 모드" -#: src/slic3r/GUI/Plater.cpp:1670 -msgid "Fill bed" -msgstr "침대 채우기" - -#: src/slic3r/GUI/Plater.cpp:1676 -msgid "Optimize Rotation" -msgstr "회전 최적화" - -#: src/slic3r/GUI/Plater.cpp:1682 -msgid "Import SLA archive" -msgstr "SLA 아카이브 가져오기" - -#: src/slic3r/GUI/Plater.cpp:1725 +#: src/slic3r/GUI/Plater.cpp:1734 #, boost-format msgid "Do you want to save the changes to \"%1%\"?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1730 src/slic3r/GUI/Preferences.cpp:222 +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:905 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1599 +msgid "Save" +msgstr "저장" + +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +msgid "Discard" +msgstr "무시\t" + +#: src/slic3r/GUI/Plater.cpp:1740 src/slic3r/GUI/Preferences.cpp:354 msgid "Ask for unsaved changes in project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1733 +#: src/slic3r/GUI/Plater.cpp:1743 msgid "" "You will not be asked about it again, when: \n" "- Closing PrusaSlicer,\n" "- Loading or creating a new project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2198 +#: src/slic3r/GUI/Plater.cpp:2214 #, c-format, boost-format msgid "" "Successfully unmounted. The device %s(%s) can now be safely removed from the " @@ -6823,20 +8181,20 @@ msgstr "" "성공적으로 마운트 해제됩니다. 이제 %s %s 장치(장치를 컴퓨터에서 안전하게 제거" "할 수 있습니다)." -#: src/slic3r/GUI/Plater.cpp:2203 +#: src/slic3r/GUI/Plater.cpp:2220 #, c-format, boost-format msgid "Ejecting of device %s(%s) has failed." msgstr "장치 %s(%s)의 배출이 실패했습니다." -#: src/slic3r/GUI/Plater.cpp:2222 src/slic3r/GUI/Plater.cpp:5108 +#: src/slic3r/GUI/Plater.cpp:2239 src/slic3r/GUI/Plater.cpp:5199 msgid "New Project" msgstr "새로운 프로젝트" -#: src/slic3r/GUI/Plater.cpp:2319 +#: src/slic3r/GUI/Plater.cpp:2346 msgid "Expand sidebar" msgstr "사이드바 확장" -#: src/slic3r/GUI/Plater.cpp:2518 +#: src/slic3r/GUI/Plater.cpp:2428 msgid "" "The preset below was temporarily installed on the active instance of " "PrusaSlicer" @@ -6845,12 +8203,12 @@ msgid_plural "" "PrusaSlicer" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:2548 +#: src/slic3r/GUI/Plater.cpp:2583 #, boost-format msgid "Failed loading file \"%1%\" due to an invalid configuration." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2568 +#: src/slic3r/GUI/Plater.cpp:2603 #, c-format, boost-format msgid "" "Object size from file %s appears to be zero.\n" @@ -6860,11 +8218,11 @@ msgid_plural "" "These objects have been removed from the model" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:2572 +#: src/slic3r/GUI/Plater.cpp:2607 msgid "The size of the object is zero" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2585 +#: src/slic3r/GUI/Plater.cpp:2620 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in meters.\n" @@ -6876,15 +8234,15 @@ msgid_plural "" "the dimensions of these objects?" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:2589 src/slic3r/GUI/Plater.cpp:2611 +#: src/slic3r/GUI/Plater.cpp:2624 src/slic3r/GUI/Plater.cpp:2646 msgid "The object is too small" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2590 src/slic3r/GUI/Plater.cpp:2612 +#: src/slic3r/GUI/Plater.cpp:2625 src/slic3r/GUI/Plater.cpp:2647 msgid "Apply to all the remaining small objects being loaded." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2607 +#: src/slic3r/GUI/Plater.cpp:2642 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in inches.\n" @@ -6896,38 +8254,29 @@ msgid_plural "" "the dimensions of these objects?" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:2625 +#: src/slic3r/GUI/Plater.cpp:2659 msgid "" "This file contains several objects positioned at multiple heights.\n" "Instead of considering them as multiple objects, should \n" "the file be loaded as a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2628 src/slic3r/GUI/Plater.cpp:2683 +#: src/slic3r/GUI/Plater.cpp:2662 src/slic3r/GUI/Plater.cpp:2711 msgid "Multi-part object detected" msgstr "다중 부품 객체가 감지" -#: src/slic3r/GUI/Plater.cpp:2636 +#: src/slic3r/GUI/Plater.cpp:2669 msgid "" "This file cannot be loaded in a simple mode. Do you want to switch to an " "advanced mode?" msgstr "" "이 파일은 간단한 모드로 로드할 수 없습니다. 고급 모드로 전환하시겠습니까?" -#: src/slic3r/GUI/Plater.cpp:2637 +#: src/slic3r/GUI/Plater.cpp:2670 msgid "Detected advanced data" msgstr "감지된 고급 데이터" -#: src/slic3r/GUI/Plater.cpp:2657 -#, c-format, boost-format -msgid "" -"You can't to add the object(s) from %s because of one or some of them " -"is(are) multi-part" -msgstr "" -"다중 부품(Part) 하나 또는 그 중 일부 때문에 %s에서 객체(object)를 추가 할 수 " -"없습니다" - -#: src/slic3r/GUI/Plater.cpp:2680 +#: src/slic3r/GUI/Plater.cpp:2708 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" @@ -6937,145 +8286,161 @@ msgstr "" "여러 객체(object)로 간주하는 대신,\n" "이 파일들은 여러 부분을 갖는 단일 객체(object)를 나타낼 수 있습니까?" -#: src/slic3r/GUI/Plater.cpp:2799 +#: src/slic3r/GUI/Plater.cpp:2827 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." msgstr "개체가 너무 커서 인쇄물에 맞게 자동으로 축소되었습니다." -#: src/slic3r/GUI/Plater.cpp:2800 +#: src/slic3r/GUI/Plater.cpp:2828 msgid "Object too large?" msgstr "개체가 너무 큽니까?" -#: src/slic3r/GUI/Plater.cpp:2878 +#: src/slic3r/GUI/Plater.cpp:2908 msgid "Export STL file:" msgstr "STL 파일 내보내기:" -#: src/slic3r/GUI/Plater.cpp:2885 +#: src/slic3r/GUI/Plater.cpp:2915 msgid "Export AMF file:" msgstr "AMF 파일 내보내기:" -#: src/slic3r/GUI/Plater.cpp:2891 +#: src/slic3r/GUI/Plater.cpp:2921 msgid "Save file as:" msgstr "파일을 다음과 같이 저장" -#: src/slic3r/GUI/Plater.cpp:2897 +#: src/slic3r/GUI/Plater.cpp:2927 msgid "Export OBJ file:" msgstr "OBJ 파일 내보내기:" -#: src/slic3r/GUI/Plater.cpp:2995 +#: src/slic3r/GUI/Plater.cpp:3030 +msgid "Delete object which is a part of cut object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3031 +msgid "" +"You try to delete an object which is a part of a cut object.\n" +"This action will break a cut correspondence.\n" +"After that PrusaSlicer can't guarantee model consistency" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3035 +msgid "Delete object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3040 msgid "Delete Object" msgstr "오브젝트 지우기" -#: src/slic3r/GUI/Plater.cpp:3007 +#: src/slic3r/GUI/Plater.cpp:3057 msgid "Delete All Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3035 +#: src/slic3r/GUI/Plater.cpp:3086 msgid "Reset Project" msgstr "프로젝트 재설정" -#: src/slic3r/GUI/Plater.cpp:3118 +#: src/slic3r/GUI/Plater.cpp:3141 msgid "" "The selected object couldn't be split because it contains only one solid " "part." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3125 +#: src/slic3r/GUI/Plater.cpp:3148 msgid "All non-solid parts (modifiers) were deleted" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3127 +#: src/slic3r/GUI/Plater.cpp:3150 msgid "Split to Objects" msgstr "오브젝트별 분할" -#: src/slic3r/GUI/Plater.cpp:3179 +#: src/slic3r/GUI/Plater.cpp:3202 msgid "" "An object has custom support enforcers which will not be used because " "supports are disabled." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3181 +#: src/slic3r/GUI/Plater.cpp:3204 msgid "Enable supports for enforcers only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3310 src/slic3r/GUI/Plater.cpp:4176 +#: src/slic3r/GUI/Plater.cpp:3339 src/slic3r/GUI/Plater.cpp:4238 msgid "Invalid data" msgstr "잘못된 데이터" -#: src/slic3r/GUI/Plater.cpp:3380 +#: src/slic3r/GUI/Plater.cpp:3410 msgid "Another export job is currently running." msgstr "다른 내보내기 작업이 현재 실행 중입니다." -#: src/slic3r/GUI/Plater.cpp:3466 +#: src/slic3r/GUI/Plater.cpp:3496 msgid "Replace from:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3484 +#: src/slic3r/GUI/Plater.cpp:3514 msgid "Unable to replace with more than one volume" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3484 src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3514 src/slic3r/GUI/Plater.cpp:3597 msgid "Error during replace" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3555 +#: src/slic3r/GUI/Plater.cpp:3589 msgid "Select the new file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3597 msgid "File for the replace wasn't selected" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3654 +#: src/slic3r/GUI/Plater.cpp:3684 msgid "Please select the file to reload" msgstr "다시 로드할 파일을 선택하십시오." -#: src/slic3r/GUI/Plater.cpp:3685 src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:3715 src/slic3r/GUI/Plater.cpp:5355 +#: src/slic3r/GUI/Plater.cpp:5365 msgid "The selected file" msgstr "선택한 파일" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "differs from the original file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "Do you want to replace it" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3703 src/slic3r/GUI/Plater.cpp:3709 +#: src/slic3r/GUI/Plater.cpp:3736 src/slic3r/GUI/Plater.cpp:3742 msgid "Reload from:" msgstr "다음에서 다시 로드됩니다." -#: src/slic3r/GUI/Plater.cpp:3812 +#: src/slic3r/GUI/Plater.cpp:3864 msgid "Unable to reload:" msgstr "다시 로드할 수 없습니다." -#: src/slic3r/GUI/Plater.cpp:3817 +#: src/slic3r/GUI/Plater.cpp:3869 msgid "Error during reload" msgstr "다시 로드하는 동안 오류" -#: src/slic3r/GUI/Plater.cpp:3835 +#: src/slic3r/GUI/Plater.cpp:3887 msgid "Reload all from disk" msgstr "디스크에서 모두 다시 로드 " -#: src/slic3r/GUI/Plater.cpp:4130 +#: src/slic3r/GUI/Plater.cpp:4191 msgid "There are active warnings concerning sliced models:" msgstr "슬라이스 모델에 대한 활성 경고가 있습니다." -#: src/slic3r/GUI/Plater.cpp:4141 +#: src/slic3r/GUI/Plater.cpp:4202 msgid "generated warnings" msgstr "생성된 경고" -#: src/slic3r/GUI/Plater.cpp:4472 +#: src/slic3r/GUI/Plater.cpp:4554 msgid "3D editor view" msgstr "3D 편집기 보기" -#: src/slic3r/GUI/Plater.cpp:4893 +#: src/slic3r/GUI/Plater.cpp:4980 msgid "Undo / Redo is processing" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4895 +#: src/slic3r/GUI/Plater.cpp:4982 #, boost-format msgid "" "Switching the printer technology from %1% to %2%.\n" @@ -7083,179 +8448,228 @@ msgid "" "printer technology." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5092 +#: src/slic3r/GUI/Plater.cpp:5184 msgid "Creating a new project while the current project is modified." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5095 +#: src/slic3r/GUI/Plater.cpp:5187 msgid "Creating a new project while some presets are modified." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5096 +#: src/slic3r/GUI/Plater.cpp:5188 msgid "You can keep presets modifications to the new project or discard them" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5097 +#: src/slic3r/GUI/Plater.cpp:5189 msgid "" "You can keep presets modifications to the new project, discard them or save " "changes as new presets.\n" "Note, if changes will be saved then new project wouldn't keep them" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5103 +#: src/slic3r/GUI/Plater.cpp:5194 msgid "Creating a new project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5137 +#: src/slic3r/GUI/Plater.cpp:5228 msgid "Load Project" msgstr "프로젝트 불러오기" -#: src/slic3r/GUI/Plater.cpp:5167 src/slic3r/GUI/Plater.cpp:5432 +#: src/slic3r/GUI/Plater.cpp:5258 msgid "Import Object" msgstr "개체 가져오기" -#: src/slic3r/GUI/Plater.cpp:5171 +#: src/slic3r/GUI/Plater.cpp:5262 msgid "Import Objects" msgstr "가져오기 개체" -#: src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:5291 +msgid "Import SLA archive" +msgstr "SLA 아카이브 가져오기" + +#: src/slic3r/GUI/Plater.cpp:5355 src/slic3r/GUI/Plater.cpp:5365 msgid "does not contain valid gcode." msgstr "유효한 gcode가 포함되어 있지 않습니다." -#: src/slic3r/GUI/Plater.cpp:5244 +#: src/slic3r/GUI/Plater.cpp:5356 src/slic3r/GUI/Plater.cpp:5366 msgid "Error while loading .gcode file" msgstr ".gcode 파일을 로드하는 동안 오류" -#: src/slic3r/GUI/Plater.cpp:5297 +#: src/slic3r/GUI/Plater.cpp:5433 +#, c-format, boost-format +msgid "%s - Multiple projects file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 +msgid "There are several files being loaded, including Project files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 src/slic3r/GUI/Plater.cpp:5446 +msgid "Select an action to apply to all files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5446 +msgid "There are several files being loaded." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5448 src/slic3r/GUI/Plater.cpp:5842 +msgid "Action" +msgstr "실행" + +#: src/slic3r/GUI/Plater.cpp:5469 +msgid "Import geometry" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5482 src/slic3r/GUI/Plater.cpp:5834 +msgid "Start new PrusaSlicer instance" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5496 +msgid "Select one to load as project" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5507 +msgid "Select one to load config only" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5609 +#, boost-format +msgid "Failed to unzip file to %1%: %2% " +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5618 +#, boost-format +msgid "Failed to find unzipped file at %1%. Unzipping of file has failed." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5821 #, c-format, boost-format -msgid "%s - Drop project file" -msgstr "%s - 프로젝트 파일 삭제" +msgid "%s - Load project file" +msgstr "" -#: src/slic3r/GUI/Plater.cpp:5304 +#: src/slic3r/GUI/Plater.cpp:5830 msgid "Open as project" msgstr "&프로젝트 열기" -#: src/slic3r/GUI/Plater.cpp:5305 +#: src/slic3r/GUI/Plater.cpp:5831 msgid "Import geometry only" msgstr "형상 가져오기만" -#: src/slic3r/GUI/Plater.cpp:5306 +#: src/slic3r/GUI/Plater.cpp:5832 msgid "Import config only" msgstr "구성만 가져오기" -#: src/slic3r/GUI/Plater.cpp:5309 +#: src/slic3r/GUI/Plater.cpp:5837 msgid "Select an action to apply to the file" msgstr "파일에 적용할 작업 선택" -#: src/slic3r/GUI/Plater.cpp:5314 -msgid "Action" -msgstr "실행" - -#: src/slic3r/GUI/Plater.cpp:5330 +#: src/slic3r/GUI/Plater.cpp:5858 msgid "Don't show again" msgstr "다시 보지 않기" -#: src/slic3r/GUI/Plater.cpp:5371 +#: src/slic3r/GUI/Plater.cpp:5899 msgid "You can open only one .gcode file at a time." msgstr "한 번에 하나의 .gcode 파일만 열 수 있습니다." -#: src/slic3r/GUI/Plater.cpp:5372 +#: src/slic3r/GUI/Plater.cpp:5900 msgid "Drag and drop G-code file" msgstr "G 코드 파일 드래그 및 드롭" -#: src/slic3r/GUI/Plater.cpp:5454 +#: src/slic3r/GUI/Plater.cpp:5992 msgid "Load File" msgstr "로드 파일" -#: src/slic3r/GUI/Plater.cpp:5459 +#: src/slic3r/GUI/Plater.cpp:5997 msgid "Load Files" msgstr "파일 로드" -#: src/slic3r/GUI/Plater.cpp:5509 +#: src/slic3r/GUI/Plater.cpp:6047 msgid "All objects will be removed, continue?" msgstr "모든 개체가 제거되고 계속되나요?" -#: src/slic3r/GUI/Plater.cpp:5520 +#: src/slic3r/GUI/Plater.cpp:6058 msgid "Delete Selected Objects" msgstr "선택한 개체 삭제" -#: src/slic3r/GUI/Plater.cpp:5529 +#: src/slic3r/GUI/Plater.cpp:6067 msgid "Increase Instances" msgstr "인스턴스 증가" -#: src/slic3r/GUI/Plater.cpp:5563 +#: src/slic3r/GUI/Plater.cpp:6109 msgid "Decrease Instances" msgstr "인스턴스 감소" -#: src/slic3r/GUI/Plater.cpp:5614 +#: src/slic3r/GUI/Plater.cpp:6167 msgid "Enter the number of copies:" msgstr "사본 수를 입력합니다." -#: src/slic3r/GUI/Plater.cpp:5615 +#: src/slic3r/GUI/Plater.cpp:6168 msgid "Copies of the selected object" msgstr "선택한 개체의 복사본" -#: src/slic3r/GUI/Plater.cpp:5619 +#: src/slic3r/GUI/Plater.cpp:6171 #, c-format, boost-format msgid "Set numbers of copies to %d" msgstr "복사본 수를 %d" -#: src/slic3r/GUI/Plater.cpp:5697 -msgid "Cut by Plane" -msgstr "평면으로 절단" +#: src/slic3r/GUI/Plater.cpp:6187 +msgid "Fill bed" +msgstr "침대 채우기" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save G-code file as:" msgstr "G-code 파일 다른 이름 저장:" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save SL1 / SL1S file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5766 +#: src/slic3r/GUI/Plater.cpp:6336 msgid "The provided file name is not valid." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5767 +#: src/slic3r/GUI/Plater.cpp:6337 msgid "The following characters are not allowed by a FAT file system:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "" "The plater is empty.\n" "Do you want to save the project?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "Save project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:6543 -msgid "Export" -msgstr "내보내기" +#: src/slic3r/GUI/Plater.cpp:6766 +msgid "Is the printer ready? Is the print sheet in place, empty and clean?" +msgstr "" -#: src/slic3r/GUI/Plater.cpp:6575 -msgid "" -"Custom supports, seams and multimaterial painting were removed after " -"repairing the mesh." +#: src/slic3r/GUI/Plater.cpp:6766 src/slic3r/GUI/PrintHostDialogs.cpp:132 +msgid "Upload and Print" msgstr "" -#: src/slic3r/GUI/Plater.cpp:6689 +#: src/slic3r/GUI/Plater.cpp:7161 +msgid "Export" +msgstr "내보내기" + +#: src/slic3r/GUI/Plater.cpp:7306 msgid "Paste From Clipboard" msgstr "클립보드에서 붙여넣기" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2290 -#: src/slic3r/GUI/Tab.cpp:2517 src/slic3r/GUI/Tab.cpp:2624 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Preferences.cpp:240 src/slic3r/GUI/Tab.cpp:2274 +#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2617 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "General" msgstr "일반" -#: src/slic3r/GUI/Preferences.cpp:121 +#: src/slic3r/GUI/Preferences.cpp:258 msgid "Remember output directory" msgstr "출력 디렉토리 기억하기" -#: src/slic3r/GUI/Preferences.cpp:123 +#: src/slic3r/GUI/Preferences.cpp:259 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." @@ -7263,21 +8677,21 @@ msgstr "" "이 옵션을 사용하면 Slic3r은 입력 파일이 들어있는 디렉터리 대신, 마지막 출력 " "디렉터리에 묻습니다." -#: src/slic3r/GUI/Preferences.cpp:129 +#: src/slic3r/GUI/Preferences.cpp:263 msgid "Auto-center parts" msgstr "파츠를 자동으로 중심에" -#: src/slic3r/GUI/Preferences.cpp:131 +#: src/slic3r/GUI/Preferences.cpp:264 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." msgstr "이 옵션을 사용하면 Slic3r가 개체를 인쇄판 중앙에 자동으로 배치합니다." -#: src/slic3r/GUI/Preferences.cpp:137 +#: src/slic3r/GUI/Preferences.cpp:268 msgid "Background processing" msgstr "백그라운드 프로세싱" -#: src/slic3r/GUI/Preferences.cpp:139 +#: src/slic3r/GUI/Preferences.cpp:269 msgid "" "If this is enabled, Slic3r will pre-process objects as soon as they're " "loaded in order to save time when exporting G-code." @@ -7285,11 +8699,23 @@ msgstr "" "이 사용 하는 경우 Slic3r는 최대한 빨리 시간을 절약 하기 위해 로드된 G-코드를 " "내보낸다." -#: src/slic3r/GUI/Preferences.cpp:148 +#: src/slic3r/GUI/Preferences.cpp:274 +msgid "Alert when supports needed" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:275 +msgid "" +"If this is enabled, Slic3r will raise alerts when it detects issues in the " +"sliced object, that can be resolved with supports (and brim). Examples of " +"such issues are floating object parts, unsupported extrusions and low bed " +"adhesion." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:285 msgid "Export sources full pathnames to 3mf and amf" msgstr "소스 전체 경로 이름을 3mf 및 amf로 내보내기" -#: src/slic3r/GUI/Preferences.cpp:150 +#: src/slic3r/GUI/Preferences.cpp:286 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked." @@ -7297,19 +8723,19 @@ msgstr "" "활성화된 경우 디스크 명령에서 다시 로드하여 호출될 때 파일을 자동으로 찾고 로" "드할 수 있습니다." -#: src/slic3r/GUI/Preferences.cpp:159 +#: src/slic3r/GUI/Preferences.cpp:293 msgid "If enabled, sets PrusaSlicer as default application to open .3mf files." msgstr "" "활성화된 경우 PrusaSlicer를 기본 응용 프로그램으로 설정하여 .3mf 파일을 엽니" "다." -#: src/slic3r/GUI/Preferences.cpp:166 +#: src/slic3r/GUI/Preferences.cpp:298 msgid "If enabled, sets PrusaSlicer as default application to open .stl files." msgstr "" "활성화된 경우 PrusaSlicer를 기본 응용 프로그램으로 설정하여 .stl 파일을 엽니" "다." -#: src/slic3r/GUI/Preferences.cpp:177 +#: src/slic3r/GUI/Preferences.cpp:307 msgid "" "If enabled, Slic3r downloads updates of built-in system presets in the " "background. These updates are downloaded into a separate temporary location. " @@ -7320,11 +8746,11 @@ msgstr "" "드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 '사전 " "설정' 버전을 사용할 수 있게되면 응용 프로그램 시작시 제공됩니다." -#: src/slic3r/GUI/Preferences.cpp:182 +#: src/slic3r/GUI/Preferences.cpp:312 msgid "Suppress \" - default - \" presets" msgstr "이전 설정 \"- 기본 -\" 숨기기" -#: src/slic3r/GUI/Preferences.cpp:184 +#: src/slic3r/GUI/Preferences.cpp:313 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." @@ -7332,11 +8758,21 @@ msgstr "" "사용 가능한 다른 유효한 '사전 설정'이 있으면 인쇄 / 필라멘트 / 프린터 선택에" "서 \"- 기본 -\"'사전 설정'을 억제하십시오." -#: src/slic3r/GUI/Preferences.cpp:190 +#: src/slic3r/GUI/Preferences.cpp:317 +msgid "Suppress \" Template \" filament presets" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:318 +msgid "" +"Suppress \" Template \" filament presets in configuration wizard and sidebar " +"visibility." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:322 msgid "Show incompatible print and filament presets" msgstr "호환 되지 않는 인쇄 및 필라멘트 설정" -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:323 msgid "" "When checked, the print and filament presets are shown in the preset editor " "even if they are marked as incompatible with the active printer" @@ -7344,11 +8780,22 @@ msgstr "" "이 옵션을 선택하면 프린터와 호환되지 않는 것으로 표시된 경우에도 인쇄 및 필라" "멘트 '사전 설정'이 '사전 설정' 편집기에 표시됩니다" -#: src/slic3r/GUI/Preferences.cpp:200 +#: src/slic3r/GUI/Preferences.cpp:331 +msgid "Show load project dialog" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:332 +msgid "" +"When checked, whenever dragging and dropping a project file on the " +"application or open it from a browser, shows a dialog asking to select the " +"action to take on the file to load." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:335 msgid "Show drop project dialog" msgstr "드롭 프로젝트 대화 상자 표시" -#: src/slic3r/GUI/Preferences.cpp:202 +#: src/slic3r/GUI/Preferences.cpp:336 msgid "" "When checked, whenever dragging and dropping a project file on the " "application, shows a dialog asking to select the action to take on the file " @@ -7357,11 +8804,11 @@ msgstr "" "확인하면 응용 프로그램에서 프로젝트 파일을 드래그하고 삭제할 때마다 로드할 파" "일을 사용할 작업을 선택하라는 대화 상자가 표시됩니다." -#: src/slic3r/GUI/Preferences.cpp:208 src/slic3r/GUI/Preferences.cpp:212 +#: src/slic3r/GUI/Preferences.cpp:342 src/slic3r/GUI/Preferences.cpp:346 msgid "Allow just a single PrusaSlicer instance" msgstr "하나의 Prusa슬라이스어 인스턴스만 허용" -#: src/slic3r/GUI/Preferences.cpp:210 +#: src/slic3r/GUI/Preferences.cpp:343 msgid "" "On OSX there is always only one instance of app running by default. However " "it is allowed to run multiple instances of same app from the command line. " @@ -7371,7 +8818,7 @@ msgstr "" "서 동일한 앱의 여러 인스턴스를 실행할 수 있습니다. 이 경우 이 설정은 하나의 " "인스턴스만 허용합니다." -#: src/slic3r/GUI/Preferences.cpp:214 +#: src/slic3r/GUI/Preferences.cpp:347 msgid "" "If this is enabled, when starting PrusaSlicer and another instance of the " "same PrusaSlicer is already running, that instance will be reactivated " @@ -7380,52 +8827,52 @@ msgstr "" "이 옵션을 사용하도록 설정하면 PrusaSlicer와 이미 실행 중인 PrusaSlicer의 다" "른 인스턴스를 시작할 때 해당 인스턴스가 다시 활성화됩니다." -#: src/slic3r/GUI/Preferences.cpp:224 +#: src/slic3r/GUI/Preferences.cpp:355 msgid "" "Always ask for unsaved changes in project, when: \n" "- Closing PrusaSlicer,\n" "- Loading or creating a new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:233 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:897 +#: src/slic3r/GUI/Preferences.cpp:363 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:925 msgid "" "Ask to save unsaved changes in presets when closing the application or when " "loading a new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:235 +#: src/slic3r/GUI/Preferences.cpp:364 msgid "" "Always ask for unsaved changes in presets, when: \n" "- Closing PrusaSlicer while some presets are modified,\n" "- Loading a new project while some presets are modified" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:242 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:896 +#: src/slic3r/GUI/Preferences.cpp:370 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:924 msgid "Ask for unsaved changes in presets when selecting new preset" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:244 +#: src/slic3r/GUI/Preferences.cpp:371 msgid "" "Always ask for unsaved changes in presets when selecting new preset or " "resetting a preset" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:249 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 +#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:923 msgid "Ask for unsaved changes in presets when creating new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:251 +#: src/slic3r/GUI/Preferences.cpp:376 msgid "Always ask for unsaved changes in presets when creating new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:258 +#: src/slic3r/GUI/Preferences.cpp:382 msgid "Associate .gcode files to PrusaSlicer G-code Viewer" msgstr "PrusaSlicer G 코드 뷰어에 .gcode 파일을 연결" -#: src/slic3r/GUI/Preferences.cpp:260 +#: src/slic3r/GUI/Preferences.cpp:383 msgid "" "If enabled, sets PrusaSlicer G-code Viewer as default application to open ." "gcode files." @@ -7433,11 +8880,11 @@ msgstr "" "활성화된 경우 PrusaSlicer G 코드 뷰어를 기본 응용 프로그램으로 설정하여 ." "gcode 파일을 엽니다." -#: src/slic3r/GUI/Preferences.cpp:268 +#: src/slic3r/GUI/Preferences.cpp:390 msgid "Use Retina resolution for the 3D scene" msgstr "3D 장면에 레티나 해상도 사용" -#: src/slic3r/GUI/Preferences.cpp:270 +#: src/slic3r/GUI/Preferences.cpp:391 msgid "" "If enabled, the 3D scene will be rendered in Retina resolution. If you are " "experiencing 3D performance problems, disabling this option may help." @@ -7445,28 +8892,28 @@ msgstr "" "활성화 된 경우 3D 장면은 레티나 해상도로 렌더링 됩니다. 3D 성능 문제가 발생하" "는 경우, 옵션을 사용하지 않도록 설정 하면 도움이 될 수 있습니다." -#: src/slic3r/GUI/Preferences.cpp:280 src/slic3r/GUI/Preferences.cpp:282 +#: src/slic3r/GUI/Preferences.cpp:400 src/slic3r/GUI/Preferences.cpp:401 msgid "Show splash screen" msgstr "스플래시 화면 표시" -#: src/slic3r/GUI/Preferences.cpp:289 +#: src/slic3r/GUI/Preferences.cpp:406 msgid "If enabled, PrusaSlicer will be open at the position it was closed" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:295 +#: src/slic3r/GUI/Preferences.cpp:411 msgid "Clear Undo / Redo stack on new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:297 +#: src/slic3r/GUI/Preferences.cpp:412 msgid "" "Clear Undo / Redo stack on new project or when an existing project is loaded." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:303 +#: src/slic3r/GUI/Preferences.cpp:417 msgid "Enable support for legacy 3DConnexion devices" msgstr "레거시 3DConnexion 장치에 대한 지원 지원 지원" -#: src/slic3r/GUI/Preferences.cpp:305 +#: src/slic3r/GUI/Preferences.cpp:418 msgid "" "If enabled, the legacy 3DConnexion devices settings dialog is available by " "pressing CTRL+M" @@ -7474,87 +8921,80 @@ msgstr "" "활성화된 경우 CTRL+M을 눌러 레거시 3DConnexion 장치 설정 대화 상자를 사용할 " "수 있습니다." -#: src/slic3r/GUI/Preferences.cpp:314 +#: src/slic3r/GUI/Preferences.cpp:425 msgid "Camera" msgstr "카메라" -#: src/slic3r/GUI/Preferences.cpp:319 +#: src/slic3r/GUI/Preferences.cpp:435 msgid "Use perspective camera" msgstr "원근 보기 사용" -#: src/slic3r/GUI/Preferences.cpp:321 +#: src/slic3r/GUI/Preferences.cpp:436 msgid "" "If enabled, use perspective camera. If not enabled, use orthographic camera." msgstr "" "이 옵션을 사용하면 원근 보기모드를 사용합니다. 활성화되지 않은 경우 일반 보기" "를 사용합니다." -#: src/slic3r/GUI/Preferences.cpp:326 +#: src/slic3r/GUI/Preferences.cpp:440 msgid "Use free camera" msgstr "무료 카메라 사용" -#: src/slic3r/GUI/Preferences.cpp:328 +#: src/slic3r/GUI/Preferences.cpp:441 msgid "If enabled, use free camera. If not enabled, use constrained camera." msgstr "" "활성화된 경우 무료 카메라를 사용합니다. 활성화되지 않은 경우 제한된 카메라를 " "사용합니다." -#: src/slic3r/GUI/Preferences.cpp:333 +#: src/slic3r/GUI/Preferences.cpp:445 msgid "Reverse direction of zoom with mouse wheel" msgstr "마우스 휠을 가진 줌의 역방향" -#: src/slic3r/GUI/Preferences.cpp:335 +#: src/slic3r/GUI/Preferences.cpp:446 msgid "If enabled, reverses the direction of zoom with mouse wheel" msgstr "활성화된 경우 마우스 휠로 줌 방향을 반전시다." -#: src/slic3r/GUI/Preferences.cpp:343 +#: src/slic3r/GUI/Preferences.cpp:452 msgid "GUI" msgstr "GUI" -#: src/slic3r/GUI/Preferences.cpp:366 +#: src/slic3r/GUI/Preferences.cpp:492 msgid "Sequential slider applied only to top layer" msgstr "위쪽 레이어에만 적용된 순차 슬라이더" -#: src/slic3r/GUI/Preferences.cpp:368 +#: src/slic3r/GUI/Preferences.cpp:493 msgid "" "If enabled, changes made using the sequential slider, in preview, apply only " -"to gcode top layer. If disabled, changes made using the sequential slider, " -"in preview, apply to the whole gcode." +"to gcode top layer.If disabled, changes made using the sequential slider, in " +"preview, apply to the whole gcode." msgstr "" -"활성화된 경우 미리 보기에서 순차 슬라이더를 사용하여 변경한 내용은 gcode 상" -"단 레이어에만 적용됩니다. 비활성화된 경우 순차 슬라이더를 사용하여 변경한 내" -"용을 미리 보기에서 전체 gcode에 적용됩니다." -#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/Preferences.cpp:499 msgid "Show sidebar collapse/expand button" msgstr "사이드바 붕괴/확장 버튼 표시" -#: src/slic3r/GUI/Preferences.cpp:377 +#: src/slic3r/GUI/Preferences.cpp:500 msgid "" "If enabled, the button for the collapse sidebar will be appeared in top " "right corner of the 3D Scene" msgstr "" "활성화되면 붕괴 사이드바의 버튼이 3D 장면의 오른쪽 상단 모서리에 나타납니다." -#: src/slic3r/GUI/Preferences.cpp:384 -msgid "If enabled, PrusaSlicer will not open hyperlinks in your browser." -msgstr "" - -#: src/slic3r/GUI/Preferences.cpp:391 +#: src/slic3r/GUI/Preferences.cpp:511 msgid "Use colors for axes values in Manipulation panel" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:393 +#: src/slic3r/GUI/Preferences.cpp:512 msgid "" "If enabled, the axes names and axes values will be colorized according to " "the axes colors. If disabled, old UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:399 +#: src/slic3r/GUI/Preferences.cpp:517 msgid "Order object volumes by types" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:401 +#: src/slic3r/GUI/Preferences.cpp:518 msgid "" "If enabled, volumes will be always ordered inside the object. Correct order " "is Model Part, Negative Volume, Modifier, Support Blocker and Support " @@ -7562,193 +9002,240 @@ msgid "" "Modifiers. But one of the model parts have to be on the first place." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:408 +#: src/slic3r/GUI/Preferences.cpp:523 +msgid "Show non-manifold edges" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:524 +msgid "If enabled, shows non-manifold edges." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:528 +msgid "Allow automatically color change" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:529 +msgid "" +"If enabled, related notification will be shown, when sliced object looks " +"like a logo or a sign." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:534 msgid "Set settings tabs as menu items (experimental)" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:410 +#: src/slic3r/GUI/Preferences.cpp:535 msgid "" "If enabled, Settings Tabs will be placed as menu items. If disabled, old UI " "will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:419 +#: src/slic3r/GUI/Preferences.cpp:542 msgid "Show \"Tip of the day\" notification after start" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:421 +#: src/slic3r/GUI/Preferences.cpp:543 msgid "If enabled, useful hints are displayed at startup." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:427 +#: src/slic3r/GUI/Preferences.cpp:547 msgid "Notify about new releases" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:429 +#: src/slic3r/GUI/Preferences.cpp:548 msgid "" "You will be notified about new release after startup acordingly: All = " "Regular release and alpha / beta releases. Release only = regular release." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:435 +#: src/slic3r/GUI/Preferences.cpp:551 msgid "Release only" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:444 +#: src/slic3r/GUI/Preferences.cpp:558 msgid "Use custom size for toolbar icons" msgstr "도구 모음 아이콘에 사용자 지정 크기 사용" -#: src/slic3r/GUI/Preferences.cpp:446 +#: src/slic3r/GUI/Preferences.cpp:559 msgid "If enabled, you can change size of toolbar icons manually." msgstr "활성화된 경우 도구 모음 아이콘의 크기를 수동으로 변경할 수 있습니다." -#: src/slic3r/GUI/Preferences.cpp:471 +#: src/slic3r/GUI/Preferences.cpp:577 src/slic3r/GUI/Tab.cpp:1659 +msgid "Other" +msgstr "기타" + +#: src/slic3r/GUI/Preferences.cpp:594 +msgid "If enabled, PrusaSlicer will not open a hyperlinks in your browser." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:600 +msgid "Allow downloads from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:601 +msgid "If enabled, PrusaSlicer will be allowed to download from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:610 msgid "Render" msgstr "렌더링" -#: src/slic3r/GUI/Preferences.cpp:476 +#: src/slic3r/GUI/Preferences.cpp:620 msgid "Use environment map" msgstr "환경 맵 사용" -#: src/slic3r/GUI/Preferences.cpp:478 +#: src/slic3r/GUI/Preferences.cpp:621 msgid "If enabled, renders object using the environment map." msgstr "활성화된 경우 환경 맵을 사용하여 개체를 렌더링합니다." -#: src/slic3r/GUI/Preferences.cpp:491 +#: src/slic3r/GUI/Preferences.cpp:629 msgid "Dark mode (experimental)" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:496 +#: src/slic3r/GUI/Preferences.cpp:639 msgid "Enable dark mode" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:498 +#: src/slic3r/GUI/Preferences.cpp:640 msgid "" "If enabled, UI will use Dark mode colors. If disabled, old UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:507 +#: src/slic3r/GUI/Preferences.cpp:647 msgid "Use system menu for application" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:509 +#: src/slic3r/GUI/Preferences.cpp:648 msgid "" "If enabled, application will use the standard Windows system menu,\n" -"but on some combination of display scales it can looks ugly. If disabled, " -"old UI will be used." +"but on some combination od display scales it can look ugly. If disabled, old " +"UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:578 +#: src/slic3r/GUI/Preferences.cpp:726 msgid "Changes for the critical options" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:580 +#: src/slic3r/GUI/Preferences.cpp:728 msgid "" "Changing some options will trigger application restart.\n" "You will lose the content of the plater." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:694 +#: src/slic3r/GUI/Preferences.cpp:921 msgid "Icon size in a respect to the default size" msgstr "기본 크기에 대한 아이콘 크기" -#: src/slic3r/GUI/Preferences.cpp:709 +#: src/slic3r/GUI/Preferences.cpp:936 msgid "Select toolbar icon size in respect to the default one." msgstr "기본 아이콘과 관련하여 도구 모음 아이콘 크기를 선택합니다." -#: src/slic3r/GUI/Preferences.cpp:743 src/slic3r/GUI/Preferences.cpp:754 +#: src/slic3r/GUI/Preferences.cpp:972 +msgid "Layout Options" +msgstr "레이아웃 옵션" + +#: src/slic3r/GUI/Preferences.cpp:981 msgid "Old regular layout with the tab bar" msgstr "탭 표시줄이 있는 오래된 일반 레이아웃" -#: src/slic3r/GUI/Preferences.cpp:744 +#: src/slic3r/GUI/Preferences.cpp:982 msgid "New layout, access via settings button in the top menu" msgstr "새 레이아웃, 상단 메뉴의 설정 버튼을 통해 액세스" -#: src/slic3r/GUI/Preferences.cpp:745 src/slic3r/GUI/Preferences.cpp:755 +#: src/slic3r/GUI/Preferences.cpp:983 msgid "Settings in non-modal window" msgstr "모달이 아닌 창의 설정" -#: src/slic3r/GUI/Preferences.cpp:763 -msgid "Layout Options" -msgstr "레이아웃 옵션" - -#: src/slic3r/GUI/Preferences.cpp:806 +#: src/slic3r/GUI/Preferences.cpp:1025 msgid "Text colors" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:249 -#: src/slic3r/GUI/PresetComboBoxes.cpp:287 -#: src/slic3r/GUI/PresetComboBoxes.cpp:794 -#: src/slic3r/GUI/PresetComboBoxes.cpp:849 -#: src/slic3r/GUI/PresetComboBoxes.cpp:989 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1033 +#: src/slic3r/GUI/Preferences.cpp:1049 +msgid "Mode markers" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:254 +#: src/slic3r/GUI/PresetComboBoxes.cpp:306 +#: src/slic3r/GUI/PresetComboBoxes.cpp:846 +#: src/slic3r/GUI/PresetComboBoxes.cpp:909 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1073 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1125 msgid "System presets" msgstr "시스템 기본설정" -#: src/slic3r/GUI/PresetComboBoxes.cpp:291 -#: src/slic3r/GUI/PresetComboBoxes.cpp:853 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1037 +#: src/slic3r/GUI/PresetComboBoxes.cpp:310 +#: src/slic3r/GUI/PresetComboBoxes.cpp:915 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1130 msgid "User presets" msgstr "사용자 사전설정" -#: src/slic3r/GUI/PresetComboBoxes.cpp:302 +#: src/slic3r/GUI/PresetComboBoxes.cpp:321 msgid "Incompatible presets" msgstr "호환되지 않는 사전 설정" -#: src/slic3r/GUI/PresetComboBoxes.cpp:337 +#: src/slic3r/GUI/PresetComboBoxes.cpp:364 #, boost-format msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "\"%1%\" 프린터를 삭제하시겠습니까?" -#: src/slic3r/GUI/PresetComboBoxes.cpp:340 +#: src/slic3r/GUI/PresetComboBoxes.cpp:366 msgid "Delete Physical Printer" msgstr "실제 프린터 삭제" -#: src/slic3r/GUI/PresetComboBoxes.cpp:581 +#: src/slic3r/GUI/PresetComboBoxes.cpp:612 msgid "Click to edit preset" msgstr "사전 설정을 편집 하려면 클릭 하십시오" -#: src/slic3r/GUI/PresetComboBoxes.cpp:697 -#: src/slic3r/GUI/PresetComboBoxes.cpp:737 +#: src/slic3r/GUI/PresetComboBoxes.cpp:740 +#: src/slic3r/GUI/PresetComboBoxes.cpp:788 msgid "Add/Remove presets" msgstr "사전 설정 추가/제거" -#: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:745 +#: src/slic3r/GUI/PresetComboBoxes.cpp:793 src/slic3r/GUI/Tab.cpp:3312 msgid "Add physical printer" msgstr "실제 프린터 추가" -#: src/slic3r/GUI/PresetComboBoxes.cpp:716 +#: src/slic3r/GUI/PresetComboBoxes.cpp:759 msgid "Edit preset" msgstr "사전 설정 편집" -#: src/slic3r/GUI/PresetComboBoxes.cpp:722 +#: src/slic3r/GUI/PresetComboBoxes.cpp:765 msgid "Change extruder color" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:773 src/slic3r/GUI/Tab.cpp:3312 msgid "Edit physical printer" msgstr "실제 프린터 편집" -#: src/slic3r/GUI/PresetComboBoxes.cpp:733 +#: src/slic3r/GUI/PresetComboBoxes.cpp:779 +msgid "Open physical printer URL" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:784 msgid "Delete physical printer" msgstr "실제 프린터 삭제" -#: src/slic3r/GUI/PresetComboBoxes.cpp:864 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1051 +#: src/slic3r/GUI/PresetComboBoxes.cpp:924 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1142 +msgid "Template presets" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:935 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1156 msgid "Physical printers" msgstr "실제 프린터" -#: src/slic3r/GUI/PresetComboBoxes.cpp:888 +#: src/slic3r/GUI/PresetComboBoxes.cpp:959 msgid "Add/Remove filaments" msgstr "필라멘트 추가/제거" -#: src/slic3r/GUI/PresetComboBoxes.cpp:890 +#: src/slic3r/GUI/PresetComboBoxes.cpp:961 msgid "Add/Remove materials" msgstr "재질 추가/제거" -#: src/slic3r/GUI/PresetComboBoxes.cpp:892 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1075 +#: src/slic3r/GUI/PresetComboBoxes.cpp:963 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1180 msgid "Add/Remove printers" msgstr "프린터 추가/제거" @@ -7929,98 +9416,107 @@ msgstr "최소 바닥 쉘 두께는 %1% mm입니다." msgid "Bottom is open." msgstr "바닥이 열려 있습니다." -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Send G-Code to printer host" msgstr "프린터 호스트에 G 코드 보내기" -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Upload to Printer Host with the following filename:" msgstr "다음 파일 이름으로 프린터 호스트에 업로드:" -#: src/slic3r/GUI/PrintHostDialogs.cpp:51 +#: src/slic3r/GUI/PrintHostDialogs.cpp:55 msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "필요한 경우 디렉토리 분리 기호로 슬래시 (/ ) 를 사용하십시오." -#: src/slic3r/GUI/PrintHostDialogs.cpp:60 +#: src/slic3r/GUI/PrintHostDialogs.cpp:64 msgid "Group" msgstr "그룹" -#: src/slic3r/GUI/PrintHostDialogs.cpp:84 +#: src/slic3r/GUI/PrintHostDialogs.cpp:74 +msgid "Upload to storage:" +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:83 +msgid "Upload to storage: " +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:105 #, c-format, boost-format msgid "Upload filename doesn't end with \"%s\". Do you wish to continue?" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:91 +#: src/slic3r/GUI/PrintHostDialogs.cpp:112 msgid "Upload" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:101 -msgid "Upload and Print" +#: src/slic3r/GUI/PrintHostDialogs.cpp:122 +msgid "Upload to Queue" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:112 +#: src/slic3r/GUI/PrintHostDialogs.cpp:143 msgid "Upload and Simulate" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:247 +#: src/slic3r/GUI/PrintHostDialogs.cpp:298 msgid "ID" msgstr "ID" -#: src/slic3r/GUI/PrintHostDialogs.cpp:248 +#: src/slic3r/GUI/PrintHostDialogs.cpp:299 msgid "Progress" msgstr "진행" -#: src/slic3r/GUI/PrintHostDialogs.cpp:249 +#: src/slic3r/GUI/PrintHostDialogs.cpp:300 msgid "Status" msgstr "상태" -#: src/slic3r/GUI/PrintHostDialogs.cpp:250 +#: src/slic3r/GUI/PrintHostDialogs.cpp:301 msgid "Host" msgstr "호스트" -#: src/slic3r/GUI/PrintHostDialogs.cpp:251 +#: src/slic3r/GUI/PrintHostDialogs.cpp:302 msgctxt "OfFile" msgid "Size" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:252 +#: src/slic3r/GUI/PrintHostDialogs.cpp:303 msgid "Filename" msgstr "파일이름" -#: src/slic3r/GUI/PrintHostDialogs.cpp:253 -msgid "Error Message" -msgstr "에러 메시지" +#: src/slic3r/GUI/PrintHostDialogs.cpp:304 +#, fuzzy +msgid "Message" +msgstr "알림 : %s" -#: src/slic3r/GUI/PrintHostDialogs.cpp:256 +#: src/slic3r/GUI/PrintHostDialogs.cpp:308 msgid "Cancel selected" msgstr "선택한 취소" -#: src/slic3r/GUI/PrintHostDialogs.cpp:258 +#: src/slic3r/GUI/PrintHostDialogs.cpp:310 msgid "Show error message" msgstr "오류 메시지 표시" -#: src/slic3r/GUI/PrintHostDialogs.cpp:316 -#: src/slic3r/GUI/PrintHostDialogs.cpp:371 +#: src/slic3r/GUI/PrintHostDialogs.cpp:368 +#: src/slic3r/GUI/PrintHostDialogs.cpp:423 msgid "Enqueued" msgstr "입력됨" -#: src/slic3r/GUI/PrintHostDialogs.cpp:372 +#: src/slic3r/GUI/PrintHostDialogs.cpp:424 msgid "Uploading" msgstr "업로드 중" -#: src/slic3r/GUI/PrintHostDialogs.cpp:374 +#: src/slic3r/GUI/PrintHostDialogs.cpp:426 msgid "Cancelling" msgstr "취소하기" -#: src/slic3r/GUI/PrintHostDialogs.cpp:375 +#: src/slic3r/GUI/PrintHostDialogs.cpp:427 msgid "Cancelled" msgstr "취소됨" -#: src/slic3r/GUI/PrintHostDialogs.cpp:376 +#: src/slic3r/GUI/PrintHostDialogs.cpp:428 msgid "Completed" msgstr "완료됨" -#: src/slic3r/GUI/PrintHostDialogs.cpp:424 +#: src/slic3r/GUI/PrintHostDialogs.cpp:476 msgid "Error uploading to print host:" msgstr "인쇄 호스트에 대한 오류 업로드:" @@ -8028,13 +9524,13 @@ msgstr "인쇄 호스트에 대한 오류 업로드:" msgid "NO RAMMING AT ALL" msgstr "전혀 충돌 없음" -#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 -#: src/libslic3r/PrintConfig.cpp:955 src/libslic3r/PrintConfig.cpp:999 -#: src/libslic3r/PrintConfig.cpp:1014 src/libslic3r/PrintConfig.cpp:3297 -#: src/libslic3r/PrintConfig.cpp:3306 src/libslic3r/PrintConfig.cpp:3315 -#: src/libslic3r/PrintConfig.cpp:3456 src/libslic3r/PrintConfig.cpp:3464 -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3479 -#: src/libslic3r/PrintConfig.cpp:3487 src/libslic3r/PrintConfig.cpp:3495 +#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/libslic3r/PrintConfig.cpp:1044 src/libslic3r/PrintConfig.cpp:1088 +#: src/libslic3r/PrintConfig.cpp:1103 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3578 src/libslic3r/PrintConfig.cpp:3587 +#: src/libslic3r/PrintConfig.cpp:3733 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3749 src/libslic3r/PrintConfig.cpp:3756 +#: src/libslic3r/PrintConfig.cpp:3764 src/libslic3r/PrintConfig.cpp:3772 msgid "s" msgstr "s" @@ -8042,43 +9538,64 @@ msgstr "s" msgid "Volumetric speed" msgstr "용적(Volumetric) 스피트" -#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:912 -#: src/libslic3r/PrintConfig.cpp:1824 +#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:1001 +#: src/libslic3r/PrintConfig.cpp:1861 msgid "mm³/s" msgstr "mm³/s²" -#: src/slic3r/GUI/SavePresetDialog.cpp:57 +#: src/slic3r/GUI/SavePresetDialog.cpp:90 +#, c-format, boost-format +msgid "Rename %s to:" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:90 #, c-format, boost-format msgid "Save %s as:" msgstr "%s 파일을 저장 합니다:" -#: src/slic3r/GUI/SavePresetDialog.cpp:101 -#: src/slic3r/GUI/SavePresetDialog.cpp:109 +#: src/slic3r/GUI/SavePresetDialog.cpp:165 +#: src/slic3r/GUI/SavePresetDialog.cpp:173 msgid "The supplied name is not valid;" msgstr "제공된 이름이 유효하지 않습니다;" -#: src/slic3r/GUI/SavePresetDialog.cpp:110 +#: src/slic3r/GUI/SavePresetDialog.cpp:174 msgid "the following suffix is not allowed:" msgstr "다음 접미사는 허용되지 않습니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:116 +#: src/slic3r/GUI/SavePresetDialog.cpp:180 msgid "The supplied name is not available." msgstr "제공된 이름을 사용할 수 없다." -#: src/slic3r/GUI/SavePresetDialog.cpp:122 +#: src/slic3r/GUI/SavePresetDialog.cpp:186 +msgid "The supplied name is used for a system profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:187 msgid "Cannot overwrite a system profile." msgstr "시스템 프로파일을 겹쳐 쓸 수 없습니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:127 +#: src/slic3r/GUI/SavePresetDialog.cpp:192 +msgid "The supplied name is used for a external profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:193 msgid "Cannot overwrite an external profile." msgstr "외부 프로필을 덮어 쓸 수 없습니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:134 +#: src/slic3r/GUI/SavePresetDialog.cpp:203 +msgid "Save preset modifications to existing user profile" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:205 +msgid "Nothing changed" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:210 #, boost-format msgid "Preset with name \"%1%\" already exists." msgstr "이름 \"%1%\"로 미리 설정이 이미 존재합니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:136 +#: src/slic3r/GUI/SavePresetDialog.cpp:212 #, boost-format msgid "" "Preset with name \"%1%\" already exists and is incompatible with selected " @@ -8086,37 +9603,52 @@ msgid "" msgstr "" "이름 \"%1%\"로 미리 설정이 이미 존재하며 선택한 프린터와 호환되지 않습니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:137 +#: src/slic3r/GUI/SavePresetDialog.cpp:213 msgid "Note: This preset will be replaced after saving" msgstr "참고: 이 사전 설정은 저장 후 대체됩니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:142 +#: src/slic3r/GUI/SavePresetDialog.cpp:219 msgid "The name cannot be empty." msgstr "이름은 비어 있을 수 없습니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:147 +#: src/slic3r/GUI/SavePresetDialog.cpp:230 +msgid "The name is too long." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:235 msgid "The name cannot start with space character." msgstr "이름은 공간 문자로 시작할 수 없습니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:152 +#: src/slic3r/GUI/SavePresetDialog.cpp:240 msgid "The name cannot end with space character." msgstr "이름은 공간 문자로 끝날 수 없습니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:157 +#: src/slic3r/GUI/SavePresetDialog.cpp:245 msgid "The name cannot be the same as a preset alias name." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:191 -#: src/slic3r/GUI/SavePresetDialog.cpp:197 +#: src/slic3r/GUI/SavePresetDialog.cpp:289 msgid "Save preset" msgstr "프리셋 저장" -#: src/slic3r/GUI/SavePresetDialog.cpp:221 +#: src/slic3r/GUI/SavePresetDialog.cpp:295 +msgid "Save presets" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:302 +msgid "Rename preset" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:327 msgctxt "PresetName" msgid "Copy" msgstr "복사" -#: src/slic3r/GUI/SavePresetDialog.cpp:283 +#: src/slic3r/GUI/SavePresetDialog.cpp:347 +msgid "Save as profile derived from current printer only." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:407 #, boost-format msgid "" "You have selected physical printer \"%1%\" \n" @@ -8125,82 +9657,94 @@ msgstr "" "실제 프린터 \"%1%\"를 선택했습니다. \n" "관련 프린터 사전 설정 \"%2%\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:322 +#: src/slic3r/GUI/SavePresetDialog.cpp:446 #, boost-format msgid "What would you like to do with \"%1%\" preset after saving?" msgstr "저장 후 \"%1%\" 사전 설정으로 무엇을 하고 싶습니까?" -#: src/slic3r/GUI/SavePresetDialog.cpp:325 +#: src/slic3r/GUI/SavePresetDialog.cpp:449 #, boost-format msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" msgstr "이 실제 프린터 \"%3%\"에 대해 \"%1%\"을 \"%2%\"로 변경" -#: src/slic3r/GUI/SavePresetDialog.cpp:326 +#: src/slic3r/GUI/SavePresetDialog.cpp:450 #, boost-format msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" msgstr "실제 프린터 \"%2%\"의 다음 사전 설정으로 \"%1%\"를 추가합니다." -#: src/slic3r/GUI/SavePresetDialog.cpp:327 +#: src/slic3r/GUI/SavePresetDialog.cpp:451 #, boost-format msgid "Just switch to \"%1%\" preset" msgstr "\"%1%\" 사전 설정으로 전환하기만 하면 됩니다." -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2652 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2645 msgid "Stealth" msgstr "스텔스" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2646 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2639 msgid "Normal" msgstr "보통" -#: src/slic3r/GUI/Selection.cpp:168 +#: src/slic3r/GUI/Selection.cpp:180 msgid "Selection-Add" msgstr "선택 추가" -#: src/slic3r/GUI/Selection.cpp:209 +#: src/slic3r/GUI/Selection.cpp:221 msgid "Selection-Remove" msgstr "선택 영역 제거" -#: src/slic3r/GUI/Selection.cpp:241 +#: src/slic3r/GUI/Selection.cpp:253 msgid "Selection-Add Object" msgstr "선택 추가 개체" -#: src/slic3r/GUI/Selection.cpp:260 +#: src/slic3r/GUI/Selection.cpp:272 msgid "Selection-Remove Object" msgstr "선택 제거 개체" -#: src/slic3r/GUI/Selection.cpp:278 +#: src/slic3r/GUI/Selection.cpp:290 msgid "Selection-Add Instance" msgstr "선택 추가 인스턴스" -#: src/slic3r/GUI/Selection.cpp:297 +#: src/slic3r/GUI/Selection.cpp:309 msgid "Selection-Remove Instance" msgstr "선택 제거 인스턴스" -#: src/slic3r/GUI/Selection.cpp:394 +#: src/slic3r/GUI/Selection.cpp:406 msgid "Selection-Add All" msgstr "선택 추가 모두" -#: src/slic3r/GUI/Selection.cpp:419 +#: src/slic3r/GUI/Selection.cpp:431 msgid "Selection-Remove All" msgstr "선택 영역 제거" -#: src/slic3r/GUI/Selection.cpp:950 +#: src/slic3r/GUI/Selection.cpp:1309 msgid "Scale To Fit" msgstr "크기 조정" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:114 +#: src/slic3r/GUI/Selection.cpp:1691 +msgid "" +"The currently manipulated object is tilted or contains tilted parts " +"(rotation angles are not multiples of 90°). Non-uniform scaling of tilted " +"objects is only possible in non-local coordinate systems, once the rotation " +"is embedded into the object coordinates." +msgstr "" + +#: src/slic3r/GUI/Selection.cpp:1694 +msgid "This operation is irreversible." +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:117 msgid "Data to send" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:550 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:618 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:557 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:624 msgid "Send system info" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:581 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:587 #, boost-format msgid "" "This is the first time you are running %1%. We would like to ask you to send " @@ -8209,18 +9753,18 @@ msgid "" "version)." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:585 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:591 msgid "" "If we know your hardware, operating system, etc., it will greatly help us in " "development and prioritization, because we will be able to focus our effort " "more efficiently and spend time on features that are needed the most." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:588 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:594 msgid "Is it safe?" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:590 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:596 #, boost-format msgid "" "We do not send any personal information nor anything that would allow us to " @@ -8231,81 +9775,86 @@ msgid "" "inspect the code actually performing the communication, see %1%." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:614 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:620 msgid "Show verbatim data that will be sent" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:616 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:622 msgid "Ask me next time" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:617 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:623 msgid "Do not send anything" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:703 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:709 msgid "System info sent successfully. Thank you." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:706 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:712 msgid "Sending system info failed!" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:713 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:719 msgid "Sending system info was cancelled." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:720 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:726 msgid "Sending system info..." msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:84 +#: src/slic3r/GUI/SysInfoDialog.cpp:92 msgid "System Information" msgstr "시스템 정보" -#: src/slic3r/GUI/SysInfoDialog.cpp:150 +#: src/slic3r/GUI/SysInfoDialog.cpp:160 msgid "Blacklisted libraries loaded into PrusaSlicer process:" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:162 +#: src/slic3r/GUI/SysInfoDialog.cpp:172 msgid "Eigen vectorization supported:" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:169 +#: src/slic3r/GUI/SysInfoDialog.cpp:179 msgid "Copy to Clipboard" msgstr "클립보드에 복사" -#: src/slic3r/GUI/Tab.cpp:114 src/libslic3r/PrintConfig.cpp:565 +#: src/slic3r/GUI/Tab.cpp:68 src/libslic3r/PrintConfig.cpp:668 msgid "Compatible printers" msgstr "호환 가능한 프린터 조건" -#: src/slic3r/GUI/Tab.cpp:115 +#: src/slic3r/GUI/Tab.cpp:69 msgid "Select the printers this profile is compatible with." msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요." -#: src/slic3r/GUI/Tab.cpp:120 src/libslic3r/PrintConfig.cpp:580 +#: src/slic3r/GUI/Tab.cpp:74 src/libslic3r/PrintConfig.cpp:683 msgid "Compatible print profiles" msgstr "호환되는 인쇄 프로 파일" -#: src/slic3r/GUI/Tab.cpp:121 +#: src/slic3r/GUI/Tab.cpp:75 msgid "Select the print profiles this profile is compatible with." msgstr "이 프로필이 호환되는 인쇄 프로필을 선택 합니다." -#: src/slic3r/GUI/Tab.cpp:216 +#: src/slic3r/GUI/Tab.cpp:165 msgid "Compare this preset with some another" msgstr "" #. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:218 +#: src/slic3r/GUI/Tab.cpp:167 #, c-format, boost-format msgid "Save current %s" msgstr "현재 %s 저장" -#: src/slic3r/GUI/Tab.cpp:219 +#: src/slic3r/GUI/Tab.cpp:168 +#, c-format, boost-format +msgid "Rename current %s" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:170 msgid "Delete this preset" msgstr "이전 설정 삭제" -#: src/slic3r/GUI/Tab.cpp:223 +#: src/slic3r/GUI/Tab.cpp:174 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." @@ -8313,241 +9862,249 @@ msgstr "" "버튼 위로 커서를 올려 놓으면 자세한 정보가 나옵니다.\n" "또는 이 버튼을 클릭하십시오." -#: src/slic3r/GUI/Tab.cpp:227 +#: src/slic3r/GUI/Tab.cpp:178 #, boost-format msgid "Search in settings [%1%]" msgstr "설정 검색 [%1%]" -#: src/slic3r/GUI/Tab.cpp:1298 +#: src/slic3r/GUI/Tab.cpp:1243 msgid "Detach from system preset" msgstr "시스템 사전 설정에서 분리" -#: src/slic3r/GUI/Tab.cpp:1311 +#: src/slic3r/GUI/Tab.cpp:1256 msgid "" "A copy of the current system preset will be created, which will be detached " "from the system preset." msgstr "" "현재 시스템 사전 설정의 복사본이 생성되며 시스템 사전 설정에서 분리됩니다." -#: src/slic3r/GUI/Tab.cpp:1312 +#: src/slic3r/GUI/Tab.cpp:1257 msgid "" "The current custom preset will be detached from the parent system preset." msgstr "현재 사용자 지정 사전 설정은 상위 시스템 사전 설정에서 분리됩니다." -#: src/slic3r/GUI/Tab.cpp:1315 +#: src/slic3r/GUI/Tab.cpp:1260 msgid "Modifications to the current profile will be saved." msgstr "현재 프로필에 대한 수정 사항이 저장됩니다." -#: src/slic3r/GUI/Tab.cpp:1321 +#: src/slic3r/GUI/Tab.cpp:1266 msgid "Detach preset" msgstr "분리 사전 설정" -#: src/slic3r/GUI/Tab.cpp:1347 +#: src/slic3r/GUI/Tab.cpp:1292 msgid "This is a default preset." msgstr "기본 사전 설정입니다." -#: src/slic3r/GUI/Tab.cpp:1349 +#: src/slic3r/GUI/Tab.cpp:1294 msgid "This is a system preset." msgstr "시스템 사전 설정입니다." -#: src/slic3r/GUI/Tab.cpp:1351 +#: src/slic3r/GUI/Tab.cpp:1296 msgid "Current preset is inherited from the default preset." msgstr "현재 사전 설정은 기본 사전 설정에서 상속됩니다." -#: src/slic3r/GUI/Tab.cpp:1355 +#: src/slic3r/GUI/Tab.cpp:1300 msgid "Current preset is inherited from" msgstr "현재 사전 설정은 에서 상속됩니다." -#: src/slic3r/GUI/Tab.cpp:1359 +#: src/slic3r/GUI/Tab.cpp:1304 msgid "It can't be deleted or modified." msgstr "삭제하거나 수정할 수 없습니다." -#: src/slic3r/GUI/Tab.cpp:1360 +#: src/slic3r/GUI/Tab.cpp:1305 msgid "" "Any modifications should be saved as a new preset inherited from this one." msgstr "모든 수정 사항은 이 항목에서 받은 기본 설정으로 저장해야합니다." -#: src/slic3r/GUI/Tab.cpp:1361 +#: src/slic3r/GUI/Tab.cpp:1306 msgid "To do that please specify a new name for the preset." msgstr "그렇게 하려면 새 이름을 지정하십시오." -#: src/slic3r/GUI/Tab.cpp:1365 +#: src/slic3r/GUI/Tab.cpp:1310 msgid "Additional information:" msgstr "추가 정보:" -#: src/slic3r/GUI/Tab.cpp:1371 +#: src/slic3r/GUI/Tab.cpp:1316 msgid "printer model" msgstr "프린터 모델" -#: src/slic3r/GUI/Tab.cpp:1379 +#: src/slic3r/GUI/Tab.cpp:1324 msgid "default print profile" msgstr "기본 인쇄 프로필" -#: src/slic3r/GUI/Tab.cpp:1382 +#: src/slic3r/GUI/Tab.cpp:1327 msgid "default filament profile" msgstr "기본 필라멘트 프로파일" -#: src/slic3r/GUI/Tab.cpp:1396 +#: src/slic3r/GUI/Tab.cpp:1341 msgid "default SLA material profile" msgstr "기본 SLA 재질 프로파일" -#: src/slic3r/GUI/Tab.cpp:1400 +#: src/slic3r/GUI/Tab.cpp:1345 msgid "default SLA print profile" msgstr "기본 SLA 인쇄 프로필" -#: src/slic3r/GUI/Tab.cpp:1408 +#: src/slic3r/GUI/Tab.cpp:1353 msgid "full profile name" msgstr "전체 프로필 이름" -#: src/slic3r/GUI/Tab.cpp:1409 +#: src/slic3r/GUI/Tab.cpp:1354 msgid "symbolic profile name" msgstr "기호 프로필 이름" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4657 +#: src/slic3r/GUI/Tab.cpp:1392 src/slic3r/GUI/Tab.cpp:4940 msgid "Layers and perimeters" msgstr "레이어 및 둘레" -#: src/slic3r/GUI/Tab.cpp:1453 +#: src/slic3r/GUI/Tab.cpp:1398 msgid "Vertical shells" msgstr "수직 쉘" -#: src/slic3r/GUI/Tab.cpp:1465 +#: src/slic3r/GUI/Tab.cpp:1410 msgid "Horizontal shells" msgstr "수평 쉘" -#: src/slic3r/GUI/Tab.cpp:1466 src/libslic3r/PrintConfig.cpp:2417 +#: src/slic3r/GUI/Tab.cpp:1411 src/libslic3r/PrintConfig.cpp:2448 msgid "Solid layers" msgstr "탑 솔리드 레이어" -#: src/slic3r/GUI/Tab.cpp:1471 +#: src/slic3r/GUI/Tab.cpp:1416 msgid "Minimum shell thickness" msgstr "최소 쉘 두께" -#: src/slic3r/GUI/Tab.cpp:1482 +#: src/slic3r/GUI/Tab.cpp:1427 msgid "Quality (slower slicing)" msgstr "품질(느린 슬라이싱)" -#: src/slic3r/GUI/Tab.cpp:1497 +#: src/slic3r/GUI/Tab.cpp:1444 msgid "Fuzzy skin (experimental)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1520 +#: src/slic3r/GUI/Tab.cpp:1467 msgid "Reducing printing time" msgstr "인쇄 시간 단축" -#: src/slic3r/GUI/Tab.cpp:1535 src/libslic3r/ExtrusionEntity.cpp:370 +#: src/slic3r/GUI/Tab.cpp:1482 msgid "Skirt" msgstr "스커트" -#: src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1504 msgid "Raft" msgstr "서포트와 라프트 재료를 선택" -#: src/slic3r/GUI/Tab.cpp:1562 +#: src/slic3r/GUI/Tab.cpp:1509 msgid "Options for support material and raft" msgstr "서포트와 라프트 재료를 선택" -#: src/slic3r/GUI/Tab.cpp:1582 +#: src/slic3r/GUI/Tab.cpp:1528 +msgid "Organic supports" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1537 msgid "Speed for print moves" msgstr "인쇄 이동 속도" -#: src/slic3r/GUI/Tab.cpp:1595 +#: src/slic3r/GUI/Tab.cpp:1550 +msgid "Dynamic overhang speed" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1557 msgid "Speed for non-print moves" msgstr "인쇄되지 않은 이동속도" -#: src/slic3r/GUI/Tab.cpp:1599 +#: src/slic3r/GUI/Tab.cpp:1561 msgid "Modifiers" msgstr "수정" -#: src/slic3r/GUI/Tab.cpp:1603 +#: src/slic3r/GUI/Tab.cpp:1565 msgid "Acceleration control (advanced)" msgstr "가속 제어(고급)" -#: src/slic3r/GUI/Tab.cpp:1614 +#: src/slic3r/GUI/Tab.cpp:1576 msgid "Autospeed (advanced)" msgstr "오토스피드(고급)" -#: src/slic3r/GUI/Tab.cpp:1618 +#: src/slic3r/GUI/Tab.cpp:1580 msgid "Pressure equalizer (experimental)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1622 +#: src/slic3r/GUI/Tab.cpp:1584 msgid "Multiple Extruders" msgstr "" "노즐 지름이 다른 여러 압출기로 인쇄. 지원이 현재 압출기 " "(support_material_extruder == 0 or support_material_interface_extruder == 0)" "로 인쇄되는 경우 모든 노즐은 동일한 지름이어야합니다." -#: src/slic3r/GUI/Tab.cpp:1630 +#: src/slic3r/GUI/Tab.cpp:1592 msgid "Ooze prevention" msgstr "스미즈 방지" -#: src/slic3r/GUI/Tab.cpp:1650 +#: src/slic3r/GUI/Tab.cpp:1596 +msgid "Wipe tower" +msgstr "와이프 타워 - 버려진 필라멘트 조절" + +#: src/slic3r/GUI/Tab.cpp:1612 msgid "Extrusion width" msgstr "돌출 폭" -#: src/slic3r/GUI/Tab.cpp:1660 +#: src/slic3r/GUI/Tab.cpp:1622 msgid "Overlap" msgstr "오버랩" -#: src/slic3r/GUI/Tab.cpp:1663 +#: src/slic3r/GUI/Tab.cpp:1625 msgid "Flow" msgstr "흐름도" -#: src/slic3r/GUI/Tab.cpp:1674 src/slic3r/GUI/Tab.cpp:1700 -msgid "Other" -msgstr "기타" - -#: src/slic3r/GUI/Tab.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:1636 msgid "Arachne perimeter generator" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1685 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1644 src/slic3r/GUI/Tab.cpp:4990 msgid "Output options" msgstr "출력 옵션" -#: src/slic3r/GUI/Tab.cpp:1686 +#: src/slic3r/GUI/Tab.cpp:1645 msgid "Sequential printing" msgstr "순차적 인쇄" -#: src/slic3r/GUI/Tab.cpp:1688 +#: src/slic3r/GUI/Tab.cpp:1647 msgid "Extruder clearance" msgstr "압출기 클리어런스" -#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:4735 +#: src/slic3r/GUI/Tab.cpp:1652 src/slic3r/GUI/Tab.cpp:4991 msgid "Output file" msgstr "출력 파일" -#: src/slic3r/GUI/Tab.cpp:1712 src/libslic3r/PrintConfig.cpp:2042 +#: src/slic3r/GUI/Tab.cpp:1671 src/libslic3r/PrintConfig.cpp:2072 msgid "Post-processing scripts" msgstr "포스트 프로세싱 스크립트" -#: src/slic3r/GUI/Tab.cpp:1724 src/slic3r/GUI/Tab.cpp:1725 -#: src/slic3r/GUI/Tab.cpp:2110 src/slic3r/GUI/Tab.cpp:2111 -#: src/slic3r/GUI/Tab.cpp:2498 src/slic3r/GUI/Tab.cpp:2499 -#: src/slic3r/GUI/Tab.cpp:2571 src/slic3r/GUI/Tab.cpp:2572 -#: src/slic3r/GUI/Tab.cpp:3957 src/slic3r/GUI/Tab.cpp:4585 -#: src/slic3r/GUI/Tab.cpp:4586 +#: src/slic3r/GUI/Tab.cpp:1683 src/slic3r/GUI/Tab.cpp:1684 +#: src/slic3r/GUI/Tab.cpp:2080 src/slic3r/GUI/Tab.cpp:2081 +#: src/slic3r/GUI/Tab.cpp:2486 src/slic3r/GUI/Tab.cpp:2487 +#: src/slic3r/GUI/Tab.cpp:2564 src/slic3r/GUI/Tab.cpp:2565 +#: src/slic3r/GUI/Tab.cpp:4182 src/slic3r/GUI/Tab.cpp:4822 +#: src/slic3r/GUI/Tab.cpp:4823 msgid "Notes" msgstr "메모" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:2088 +#: src/slic3r/GUI/Tab.cpp:2493 src/slic3r/GUI/Tab.cpp:2571 +#: src/slic3r/GUI/Tab.cpp:4830 src/slic3r/GUI/Tab.cpp:4996 msgid "Dependencies" msgstr "종속성" -#: src/slic3r/GUI/Tab.cpp:1732 src/slic3r/GUI/Tab.cpp:2119 -#: src/slic3r/GUI/Tab.cpp:2506 src/slic3r/GUI/Tab.cpp:2579 -#: src/slic3r/GUI/Tab.cpp:4594 src/slic3r/GUI/Tab.cpp:4741 +#: src/slic3r/GUI/Tab.cpp:1691 src/slic3r/GUI/Tab.cpp:2089 +#: src/slic3r/GUI/Tab.cpp:2494 src/slic3r/GUI/Tab.cpp:2572 +#: src/slic3r/GUI/Tab.cpp:4831 src/slic3r/GUI/Tab.cpp:4997 msgid "Profile dependencies" msgstr "프로파일 속한곳" -#: src/slic3r/GUI/Tab.cpp:1771 +#: src/slic3r/GUI/Tab.cpp:1723 msgid "Post processing scripts shall modify G-code file in place." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1850 +#: src/slic3r/GUI/Tab.cpp:1802 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8559,7 +10116,7 @@ msgid_plural "" "printing time estimation." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:1855 +#: src/slic3r/GUI/Tab.cpp:1807 msgid "Found reserved keywords in" msgstr "" @@ -8567,74 +10124,90 @@ msgstr "" msgid "Filament Overrides" msgstr "필라멘트 재정의" -#: src/slic3r/GUI/Tab.cpp:1992 +#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2827 +msgid "Retraction" +msgstr "리트랙션 후 최소 이동 거리" + +#: src/slic3r/GUI/Tab.cpp:1951 +msgid "Temperature" +msgstr "온도" + +#: src/slic3r/GUI/Tab.cpp:1955 msgid "Nozzle" msgstr "노즐" -#: src/slic3r/GUI/Tab.cpp:1997 +#: src/slic3r/GUI/Tab.cpp:1960 msgid "Bed" msgstr "침대" -#: src/slic3r/GUI/Tab.cpp:2002 +#: src/slic3r/GUI/Tab.cpp:1965 msgid "Cooling" msgstr "자동 냉각 사용" -#: src/slic3r/GUI/Tab.cpp:2004 src/libslic3r/PrintConfig.cpp:1936 -#: src/libslic3r/PrintConfig.cpp:2994 +#: src/slic3r/GUI/Tab.cpp:1967 src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "Enable" msgstr "활성화" -#: src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/Tab.cpp:1978 msgid "Fan settings" msgstr "팬 설정" -#: src/slic3r/GUI/Tab.cpp:2026 +#: src/slic3r/GUI/Tab.cpp:1979 +msgid "Fan speed" +msgstr "팬 속도" + +#: src/slic3r/GUI/Tab.cpp:1989 +msgid "Dynamic fan speeds" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1996 msgid "Cooling thresholds" msgstr "냉각 한계 값" -#: src/slic3r/GUI/Tab.cpp:2032 +#: src/slic3r/GUI/Tab.cpp:2002 msgid "Filament properties" msgstr "필라멘트 속성" -#: src/slic3r/GUI/Tab.cpp:2039 +#: src/slic3r/GUI/Tab.cpp:2009 msgid "Print speed override" msgstr "인쇄 속도 재정의" -#: src/slic3r/GUI/Tab.cpp:2049 +#: src/slic3r/GUI/Tab.cpp:2019 msgid "Wipe tower parameters" msgstr "타워 파라미터 지우기" -#: src/slic3r/GUI/Tab.cpp:2052 +#: src/slic3r/GUI/Tab.cpp:2022 msgid "Toolchange parameters with single extruder MM printers" msgstr "MMU 프린터의 툴체인지 매개 변수" -#: src/slic3r/GUI/Tab.cpp:2065 +#: src/slic3r/GUI/Tab.cpp:2035 msgid "Ramming settings" msgstr "래밍 설정" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 -#: src/slic3r/GUI/Tab.cpp:4264 src/libslic3r/GCode.cpp:733 -#: src/libslic3r/PrintConfig.cpp:2500 +#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:2398 +#: src/slic3r/GUI/Tab.cpp:4493 src/libslic3r/GCode.cpp:684 +#: src/libslic3r/PrintConfig.cpp:2532 msgid "Custom G-code" msgstr "사용자 지정 G 코드" -#: src/slic3r/GUI/Tab.cpp:2090 src/slic3r/GUI/Tab.cpp:2411 -#: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2450 -#: src/libslic3r/PrintConfig.cpp:2465 +#: src/slic3r/GUI/Tab.cpp:2060 src/slic3r/GUI/Tab.cpp:2399 +#: src/libslic3r/GCode.cpp:658 src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2497 msgid "Start G-code" msgstr "G 코드 시작" -#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:2421 -#: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:685 -#: src/libslic3r/PrintConfig.cpp:695 +#: src/slic3r/GUI/Tab.cpp:2070 src/slic3r/GUI/Tab.cpp:2409 +#: src/libslic3r/GCode.cpp:659 src/libslic3r/PrintConfig.cpp:788 +#: src/libslic3r/PrintConfig.cpp:798 msgid "End G-code" msgstr "끝 G 코드" -#: src/slic3r/GUI/Tab.cpp:2153 +#: src/slic3r/GUI/Tab.cpp:2115 msgid "Volumetric flow hints not available" msgstr "볼륨 흐름 힌트를 사용할 수 없음" -#: src/slic3r/GUI/Tab.cpp:2257 +#: src/slic3r/GUI/Tab.cpp:2241 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -8655,20 +10228,20 @@ msgstr "" "열립니다. 실제 프린터 프로파일은 PrusaSlicer/physical_printer 디렉터리에 저장" "됩니다." -#: src/slic3r/GUI/Tab.cpp:2291 src/slic3r/GUI/Tab.cpp:2518 +#: src/slic3r/GUI/Tab.cpp:2275 src/slic3r/GUI/Tab.cpp:2506 msgid "Size and coordinates" msgstr "크기 및 좌표" -#: src/slic3r/GUI/Tab.cpp:2300 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:2284 src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "Capabilities" msgstr "권한" -#: src/slic3r/GUI/Tab.cpp:2305 +#: src/slic3r/GUI/Tab.cpp:2289 msgid "Number of extruders of the printer." msgstr "프린터 익스트루더 숫자." -#: src/slic3r/GUI/Tab.cpp:2334 +#: src/slic3r/GUI/Tab.cpp:2322 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -8679,105 +10252,101 @@ msgstr "" "모든 압출기는 동일한 직경을 가져야 합니다.\n" "모든 압출기의 직경을 첫 번째 압출기 노즐 직경 값으로 변경하시겠습니까?" -#: src/slic3r/GUI/Tab.cpp:2338 src/slic3r/GUI/Tab.cpp:2782 -#: src/libslic3r/PrintConfig.cpp:1900 +#: src/slic3r/GUI/Tab.cpp:2326 src/slic3r/GUI/Tab.cpp:2714 +#: src/libslic3r/PrintConfig.cpp:1937 msgid "Nozzle diameter" msgstr "노즐 직경" -#: src/slic3r/GUI/Tab.cpp:2431 src/libslic3r/GCode.cpp:709 -#: src/libslic3r/PrintConfig.cpp:425 +#: src/slic3r/GUI/Tab.cpp:2419 src/libslic3r/GCode.cpp:660 +#: src/libslic3r/PrintConfig.cpp:444 msgid "Before layer change G-code" msgstr "레이어가 G 코드를 변경하기 전에" -#: src/slic3r/GUI/Tab.cpp:2441 src/libslic3r/GCode.cpp:710 -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/slic3r/GUI/Tab.cpp:2429 src/libslic3r/GCode.cpp:661 +#: src/libslic3r/PrintConfig.cpp:1665 msgid "After layer change G-code" msgstr "레이어 변경 후 G 코드" -#: src/slic3r/GUI/Tab.cpp:2451 src/libslic3r/GCode.cpp:711 -#: src/libslic3r/PrintConfig.cpp:2877 +#: src/slic3r/GUI/Tab.cpp:2439 src/libslic3r/GCode.cpp:662 +#: src/libslic3r/PrintConfig.cpp:2965 msgid "Tool change G-code" msgstr "공구 변경 G 코드" -#: src/slic3r/GUI/Tab.cpp:2461 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2449 src/libslic3r/GCode.cpp:663 msgid "Between objects G-code (for sequential printing)" msgstr "객체 간 G 코드 (순차 인쇄용)" -#: src/slic3r/GUI/Tab.cpp:2471 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2459 src/libslic3r/GCode.cpp:664 msgid "Color Change G-code" msgstr "색상 변경 G 코드" -#: src/slic3r/GUI/Tab.cpp:2480 src/libslic3r/GCode.cpp:714 -#: src/libslic3r/PrintConfig.cpp:2491 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:665 +#: src/libslic3r/PrintConfig.cpp:2523 msgid "Pause Print G-code" msgstr "G 코드 인쇄 일시 중지" -#: src/slic3r/GUI/Tab.cpp:2489 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:666 msgid "Template Custom G-code" msgstr "템플릿 사용자 지정 G 코드" -#: src/slic3r/GUI/Tab.cpp:2525 +#: src/slic3r/GUI/Tab.cpp:2513 msgid "Display" msgstr "표시" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2528 msgid "Tilt" msgstr "기울이기" -#: src/slic3r/GUI/Tab.cpp:2541 +#: src/slic3r/GUI/Tab.cpp:2529 msgid "Tilt time" msgstr "기울이기 시간" -#: src/slic3r/GUI/Tab.cpp:2548 src/slic3r/GUI/Tab.cpp:4575 +#: src/slic3r/GUI/Tab.cpp:2536 src/slic3r/GUI/Tab.cpp:4812 msgid "Corrections" msgstr "수정" -#: src/slic3r/GUI/Tab.cpp:2561 src/slic3r/GUI/Tab.cpp:4571 +#: src/slic3r/GUI/Tab.cpp:2549 src/slic3r/GUI/Tab.cpp:4808 msgid "Exposure" msgstr "최소 노출 시간" -#: src/slic3r/GUI/Tab.cpp:2622 src/slic3r/GUI/Tab.cpp:2709 -#: src/libslic3r/PrintConfig.cpp:1655 src/libslic3r/PrintConfig.cpp:1690 -#: src/libslic3r/PrintConfig.cpp:1707 src/libslic3r/PrintConfig.cpp:1724 -#: src/libslic3r/PrintConfig.cpp:1740 src/libslic3r/PrintConfig.cpp:1750 -#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1773 -#: src/libslic3r/PrintConfig.cpp:1783 +#: src/slic3r/GUI/Tab.cpp:2556 +msgid "Output" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2615 src/slic3r/GUI/Tab.cpp:2875 +#: src/libslic3r/PrintConfig.cpp:1694 src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1744 src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1777 src/libslic3r/PrintConfig.cpp:1787 +#: src/libslic3r/PrintConfig.cpp:1797 src/libslic3r/PrintConfig.cpp:1810 +#: src/libslic3r/PrintConfig.cpp:1820 msgid "Machine limits" msgstr "기계 제한" -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2638 msgid "Values in this column are for Normal mode" msgstr "이 열의 값은 일반 모드입니다" -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2644 msgid "Values in this column are for Stealth mode" msgstr "이 열의 값은 스텔스 모드용입니다." -#: src/slic3r/GUI/Tab.cpp:2660 +#: src/slic3r/GUI/Tab.cpp:2653 msgid "Maximum feedrates" msgstr "최대 피드값" -#: src/slic3r/GUI/Tab.cpp:2665 +#: src/slic3r/GUI/Tab.cpp:2658 msgid "Maximum accelerations" msgstr "최대 가속" -#: src/slic3r/GUI/Tab.cpp:2674 +#: src/slic3r/GUI/Tab.cpp:2667 msgid "Jerk limits" msgstr "바보 제한" -#: src/slic3r/GUI/Tab.cpp:2680 +#: src/slic3r/GUI/Tab.cpp:2673 msgid "Minimum feedrates" msgstr "최소 공급률" -#: src/slic3r/GUI/Tab.cpp:2734 src/slic3r/GUI/Tab.cpp:2743 -msgid "Single extruder MM setup" -msgstr "단일 압출기 MM 설정" - -#: src/slic3r/GUI/Tab.cpp:2744 -msgid "Single extruder multimaterial parameters" -msgstr "싱글 익스트루더 멀티메터리알 파라미터" - -#: src/slic3r/GUI/Tab.cpp:2779 +#: src/slic3r/GUI/Tab.cpp:2711 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -8785,29 +10354,41 @@ msgstr "" "이것은 단일 압출기 다중 재료 프린터이며, 모든 압출기의 직경은 새 값으로 설정" "됩니다. 계속 하시겠습니까?" -#: src/slic3r/GUI/Tab.cpp:2804 +#: src/slic3r/GUI/Tab.cpp:2739 +msgid "Reset to Filament Color" +msgstr "필라멘트 색상으로 재설정" + +#: src/slic3r/GUI/Tab.cpp:2775 +msgid "Apply below setting to other extruders" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2820 msgid "Layer height limits" msgstr "레이어 높이 제한" -#: src/slic3r/GUI/Tab.cpp:2809 +#: src/slic3r/GUI/Tab.cpp:2824 msgid "Position (for multi-extruder printers)" msgstr "위치 (멀티 익스트루더 프린터 포함)" -#: src/slic3r/GUI/Tab.cpp:2815 +#: src/slic3r/GUI/Tab.cpp:2830 msgid "Only lift Z" msgstr "Z축 올림" -#: src/slic3r/GUI/Tab.cpp:2828 +#: src/slic3r/GUI/Tab.cpp:2843 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "도구가 비활성화된 때의 철회(다중 압출기 설정에 대한 고급 설정)" -#: src/slic3r/GUI/Tab.cpp:2835 -msgid "Reset to Filament Color" -msgstr "필라멘트 색상으로 재설정" +#: src/slic3r/GUI/Tab.cpp:2900 src/slic3r/GUI/Tab.cpp:2909 +msgid "Single extruder MM setup" +msgstr "단일 압출기 MM 설정" + +#: src/slic3r/GUI/Tab.cpp:2910 +msgid "Single extruder multimaterial parameters" +msgstr "싱글 익스트루더 멀티메터리알 파라미터" -#: src/slic3r/GUI/Tab.cpp:3012 +#: src/slic3r/GUI/Tab.cpp:3074 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -8817,51 +10398,64 @@ msgstr "" "\n" "펌웨어 철회를 활성화하기 위해 비활성화해야 합니까?" -#: src/slic3r/GUI/Tab.cpp:3014 +#: src/slic3r/GUI/Tab.cpp:3076 msgid "Firmware Retraction" msgstr "펌웨어 철회" -#: src/slic3r/GUI/Tab.cpp:3319 +#: src/slic3r/GUI/Tab.cpp:3384 msgid "New printer preset selected" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3625 +#: src/slic3r/GUI/Tab.cpp:3758 msgid "Detached" msgstr "분리" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3857 +msgid "" +"The physical printer below is based on the preset, you are going to rename." +msgid_plural "" +"The physical printers below are based on the preset, you are going to rename." +msgstr[0] "" + +#: src/slic3r/GUI/Tab.cpp:3862 +msgid "Note, that the selected preset will be renamed in this printer too." +msgid_plural "" +"Note, that the selected preset will be renamed in these printers too." +msgstr[0] "" + +#: src/slic3r/GUI/Tab.cpp:3924 msgid "remove" msgstr "제거" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3924 msgid "delete" msgstr "삭제" -#: src/slic3r/GUI/Tab.cpp:3711 +#: src/slic3r/GUI/Tab.cpp:3933 msgid "It's a last preset for this physical printer." msgstr "이 실제 프린터의 마지막 사전 설정입니다." -#: src/slic3r/GUI/Tab.cpp:3716 +#: src/slic3r/GUI/Tab.cpp:3938 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " "\"%2%\"?" msgstr "실제 프린터 \"%2%\"에서 \"%1%\" 사전 설정을 삭제하시겠습니까?" -#: src/slic3r/GUI/Tab.cpp:3728 +#: src/slic3r/GUI/Tab.cpp:3950 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" "The physical printers below are based on the preset, you are going to delete." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3733 +#: src/slic3r/GUI/Tab.cpp:3955 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3738 +#: src/slic3r/GUI/Tab.cpp:3960 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -8870,62 +10464,62 @@ msgid_plural "" "delete." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3743 +#: src/slic3r/GUI/Tab.cpp:3965 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" "Note, that these printers will be deleted after deleting the selected preset." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3748 +#: src/slic3r/GUI/Tab.cpp:3970 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "선택한 사전 설정의 %1%를 선택 하시겠습니까?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3753 +#: src/slic3r/GUI/Tab.cpp:3975 #, boost-format msgid "%1% Preset" msgstr "%1% 기본설정" -#: src/slic3r/GUI/Tab.cpp:3836 src/slic3r/GUI/Tab.cpp:4198 +#: src/slic3r/GUI/Tab.cpp:4061 src/slic3r/GUI/Tab.cpp:4423 msgid "Set" msgstr "설정" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:4180 msgid "Find" msgstr "찾기" -#: src/slic3r/GUI/Tab.cpp:3956 +#: src/slic3r/GUI/Tab.cpp:4181 msgid "Replace with" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4045 +#: src/slic3r/GUI/Tab.cpp:4270 msgid "Regular expression" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4049 +#: src/slic3r/GUI/Tab.cpp:4274 msgid "Case insensitive" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4053 +#: src/slic3r/GUI/Tab.cpp:4278 msgid "Whole word" msgstr "전체 단어 일치" -#: src/slic3r/GUI/Tab.cpp:4057 +#: src/slic3r/GUI/Tab.cpp:4282 msgid "Match single line" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4160 +#: src/slic3r/GUI/Tab.cpp:4385 msgid "Are you sure you want to delete all substitutions?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4292 +#: src/slic3r/GUI/Tab.cpp:4521 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "기계 제한은 G 코드로 방출되고 인쇄 시간을 예측하는 데 사용됩니다." -#: src/slic3r/GUI/Tab.cpp:4295 +#: src/slic3r/GUI/Tab.cpp:4524 msgid "" "Machine limits will NOT be emitted to G-code, however they will be used to " "estimate print time, which may therefore not be accurate as the printer may " @@ -8935,26 +10529,26 @@ msgstr "" "는 데 사용됩니다, 따라서 프린터가 기계 제한의 다른 세트를 적용 할 수 있으므" "로 정확하지 않을 수 있습니다." -#: src/slic3r/GUI/Tab.cpp:4299 +#: src/slic3r/GUI/Tab.cpp:4528 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." msgstr "" "기계 제한이 설정되지 않으므로 인쇄 시간 추정치가 정확하지 않을 수 있습니다." -#: src/slic3r/GUI/Tab.cpp:4321 +#: src/slic3r/GUI/Tab.cpp:4550 msgid "LOCKED LOCK" msgstr "잠긴 잠금" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4323 +#: src/slic3r/GUI/Tab.cpp:4552 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" msgstr "" "설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4325 +#: src/slic3r/GUI/Tab.cpp:4554 msgid "UNLOCKED LOCK" msgstr "" "UNLOCKED LOCK 아이콘은 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템(또는 " @@ -8963,7 +10557,7 @@ msgstr "" "릭합니다." #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4327 +#: src/slic3r/GUI/Tab.cpp:4556 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -8975,14 +10569,14 @@ msgstr "" "잠금 해제 된 LOCK 아이콘을 클릭하여 현재 옵션 그룹에 대한 모든 설정을 시스템 " "(또는 기본값) 값으로 재설정합니다." -#: src/slic3r/GUI/Tab.cpp:4332 +#: src/slic3r/GUI/Tab.cpp:4561 msgid "WHITE BULLET" msgstr "" "WHITE BULLET 기호 아이콘은 설정이 현재 옵션 그룹에 대해 마지막으로 저장 된 사" "전 설정과 동일 하다는 것을 나타냅니다." #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4334 +#: src/slic3r/GUI/Tab.cpp:4563 msgid "" "for the left button: indicates a non-system (or non-default) preset,\n" "for the right button: indicates that the settings hasn't been modified." @@ -8990,12 +10584,12 @@ msgstr "" "왼쪽 단추의 경우: 비시스템(또는 비기본적) 사전 설정을 나타내고,\n" "오른쪽 단추: 설정이 수정되지 않았음을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4337 +#: src/slic3r/GUI/Tab.cpp:4566 msgid "BACK ARROW" msgstr "돌아가기 화살표" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4339 +#: src/slic3r/GUI/Tab.cpp:4568 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -9007,7 +10601,7 @@ msgstr "" "뒤로 화살표 아이콘을 클릭하여 현재 옵션 그룹에 대한 모든 설정을 마지막으로 저" "장된 사전 설정으로 재설정합니다." -#: src/slic3r/GUI/Tab.cpp:4349 +#: src/slic3r/GUI/Tab.cpp:4578 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -9015,7 +10609,7 @@ msgstr "" "잠긴 LOCK 아이콘은 설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하다" "는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4351 +#: src/slic3r/GUI/Tab.cpp:4580 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " "equal to the system (or default) values for the current option group.\n" @@ -9027,11 +10621,11 @@ msgstr "" "현재 옵션 그룹에 대한 모든 설정을 시스템(또는 기본값) 값으로 재설정하려면 클" "릭합니다." -#: src/slic3r/GUI/Tab.cpp:4354 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "WHITE BULLET 아이콘은 시스템 사전 설정이 아닌 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4357 +#: src/slic3r/GUI/Tab.cpp:4586 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -9039,7 +10633,7 @@ msgstr "" "WHITE BULLET 기호 아이콘은 설정이 현재 옵션 그룹에 대해 마지막으로 저장 된 사" "전 설정과 동일 하다는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4359 +#: src/slic3r/GUI/Tab.cpp:4588 msgid "" "BACK ARROW icon indicates that the settings were changed and are not equal " "to the last saved preset for the current option group.\n" @@ -9051,14 +10645,14 @@ msgstr "" "마지막 현재 옵션 그룹에 대 한 모든 설정 다시 설정을 클릭 하 여 사전 설정을 저" "장." -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4594 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "" "LOCK 아이콘잠기는 값이 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4366 +#: src/slic3r/GUI/Tab.cpp:4595 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -9068,7 +10662,7 @@ msgstr "" "을 나타냅니다.\n" "현재 값을 시스템(또는 기본값) 값으로 재설정하려면 클릭합니다." -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4601 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -9076,7 +10670,7 @@ msgstr "" "WHITE BULLET 기호 아이콘은 마지막으로 저장 한 사전 설정과 동일한 값을 나타냅" "니다." -#: src/slic3r/GUI/Tab.cpp:4373 +#: src/slic3r/GUI/Tab.cpp:4602 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -9086,31 +10680,31 @@ msgstr "" "음을 나타냅니다.\n" "현재 값을 마지막 저장된 사전 설정으로 재설정하려면 클릭합니다." -#: src/slic3r/GUI/Tab.cpp:4527 src/slic3r/GUI/Tab.cpp:4529 +#: src/slic3r/GUI/Tab.cpp:4764 src/slic3r/GUI/Tab.cpp:4766 msgid "Material" msgstr "재료" -#: src/slic3r/GUI/Tab.cpp:4614 src/slic3r/GUI/Tab.cpp:4615 +#: src/slic3r/GUI/Tab.cpp:4851 src/slic3r/GUI/Tab.cpp:4852 msgid "Material printing profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4667 +#: src/slic3r/GUI/Tab.cpp:4901 msgid "Support head" msgstr "서포트 헤드" -#: src/slic3r/GUI/Tab.cpp:4672 +#: src/slic3r/GUI/Tab.cpp:4906 msgid "Support pillar" msgstr "서포트 기둥" -#: src/slic3r/GUI/Tab.cpp:4695 +#: src/slic3r/GUI/Tab.cpp:4929 msgid "Connection of the support sticks and junctions" msgstr "서포트 기둥 및 접합부 연결" -#: src/slic3r/GUI/Tab.cpp:4700 +#: src/slic3r/GUI/Tab.cpp:4956 msgid "Automatic generation" msgstr "자동 생성" -#: src/slic3r/GUI/Tab.cpp:4775 +#: src/slic3r/GUI/Tab.cpp:5024 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -9119,74 +10713,72 @@ msgstr "" "\"%1%\"는 \"%3%\" 범주에 있기 때문에 \"%2% %1%\"이 비활성화됩니다.\n" "\"%1%\"을 활성화하려면 \"%2%\"을 끄십시오." -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3724 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3497 msgid "Object elevation" msgstr "객체 고도" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3826 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3958 msgid "Pad around object" msgstr "물체 주위의 패드" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:153 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:162 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1047 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1100 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1115 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1130 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1145 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:147 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:156 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:165 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1107 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1122 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1137 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1152 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1197 msgid "Undef" msgstr "Undef" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:772 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:792 msgid "Unsaved Changes" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:790 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:810 msgid "Switching Presets: Unsaved Changes" msgstr "사전 설정 전환: 저장되지 않은 변경 사항" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:832 -msgid "Old Value" -msgstr "이전 값" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:858 +msgid "Original Value" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:859 +msgid "Modified Value" +msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:833 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:861 msgid "New Value" msgstr "새 값" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:867 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 msgid "Keep" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1569 msgid "Transfer" msgstr "전송하기" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 msgid "Don't save" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 -msgid "Discard" -msgstr "무시\t" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:877 -msgid "Save" -msgstr "저장" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:898 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:926 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "create new project" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:927 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "switch a preset" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:900 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:928 msgid "" "You will not be asked about the unsaved changes in presets the next time " "you: \n" @@ -9194,11 +10786,11 @@ msgid "" "- Loading a new project while some presets are modified" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:903 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:931 msgid "PrusaSlicer will remember your action." msgstr "프라사슬라이스러는 당신의 행동을 기억할 것입니다." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:904 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:932 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" @@ -9207,56 +10799,56 @@ msgstr "" "\"기본 설정\"을 방문하여 \"%1%\"을 확인하십시오.\n" "저장되지 않은 변경 사항에 대해 다시 묻는 것입니다." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:964 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1772 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" "일부 필드는 너무 길기 때문에 적합합니다. 마우스 오른쪽 클릭으로 전체 텍스트" "가 드러납니다." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will not be saved" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will be discarded." msgstr "모든 설정 변경 내용은 삭제됩니다." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:941 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:969 msgid "Save the selected options." msgstr "선택한 옵션을 저장합니다." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:942 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:970 msgid "Keep the selected settings." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:943 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:971 msgid "Transfer the selected settings to the newly selected preset." msgstr "선택한 설정을 새로 선택한 사전 설정으로 전송합니다." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:947 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:975 #, boost-format msgid "Save the selected options to preset \"%1%\"." msgstr "선택한 옵션을 저장하여 \"%1%\"을 미리 설정합니다." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:948 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:976 #, boost-format msgid "Transfer the selected options to the newly selected preset \"%1%\"." msgstr "선택한 옵션을 새로 선택한 사전 설정된 \"%1%\"로 전송합니다." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1224 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1237 msgid "The following preset was modified" msgid_plural "The following presets were modified" msgstr[0] "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1230 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1243 #, boost-format msgid "Preset \"%1%\" has the following unsaved changes:" msgstr "" "사전 설정된 \"%1%\"에는 다음과 같은 저장되지 않은 변경 사항이 있습니다." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1234 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1247 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new printer profile and it has the " @@ -9265,7 +10857,7 @@ msgstr "" "사전 설정된 \"%1%\"은 새 프린터 프로필과 호환되지 않으며 다음과 같은 저장되" "지 않은 변경 사항이 있습니다." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1235 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1248 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new print profile and it has the " @@ -9274,107 +10866,205 @@ msgstr "" "사전 설정된 \"%1%\"은 새 인쇄 프로파일과 호환되지 않으며 다음과 같은 저장되" "지 않은 변경 사항이 있습니다." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1297 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1850 msgid "Extruders count" msgstr "압출기 수" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 -msgid "Select presets to compare" -msgstr "" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1326 +msgid "The preset modifications are successfully saved" +msgid_plural "The presets modifications are successfully saved" +msgstr[0] "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1515 msgid "Show all presets (including incompatible)" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1533 +msgid "Select presets to compare" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1545 msgid "Left Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1546 msgid "Right Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1595 +msgid "" +"Transfer the selected options from left preset to the right.\n" +"Note: New modified presets will be selected in settings tabs after close " +"this dialog." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1603 +msgid "Save the selected options from left preset to the right." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1621 +msgid "Transfer values from left to right" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1622 +msgid "" +"If enabled, this dialog can be used for transver selected values from left " +"to right preset." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1807 msgid "One of the presets doesn't found" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1818 msgid "Compared presets has different printer technology" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1832 msgid "Presets are the same" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1840 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef category" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef group" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:2016 +msgid "Modified" +msgstr "수정됨" + +#: src/slic3r/GUI/UpdateDialogs.cpp:41 msgid "Update available" msgstr "사용가능한 업데이트" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UpdateDialogs.cpp:41 #, c-format, boost-format msgid "New version of %s is available" msgstr "%s의 새 버전을 사용할 수 있습니다" -#: src/slic3r/GUI/UpdateDialogs.cpp:42 +#: src/slic3r/GUI/UpdateDialogs.cpp:46 src/slic3r/GUI/UpdateDialogs.cpp:101 msgid "Current version:" msgstr "현재 버전:" -#: src/slic3r/GUI/UpdateDialogs.cpp:44 +#: src/slic3r/GUI/UpdateDialogs.cpp:48 src/slic3r/GUI/UpdateDialogs.cpp:103 +#: src/slic3r/GUI/UpdateDialogs.cpp:141 msgid "New version:" msgstr "새로운 버전:" -#: src/slic3r/GUI/UpdateDialogs.cpp:52 +#: src/slic3r/GUI/UpdateDialogs.cpp:56 msgid "Changelog & Download" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:59 src/slic3r/GUI/UpdateDialogs.cpp:133 -#: src/slic3r/GUI/UpdateDialogs.cpp:191 +#: src/slic3r/GUI/UpdateDialogs.cpp:63 src/slic3r/GUI/UpdateDialogs.cpp:309 +#: src/slic3r/GUI/UpdateDialogs.cpp:367 msgid "Open changelog page" msgstr "변경 로그 페이지 열기" -#: src/slic3r/GUI/UpdateDialogs.cpp:65 +#: src/slic3r/GUI/UpdateDialogs.cpp:69 msgid "Open download page" msgstr "다운로드 페이지 열기" -#: src/slic3r/GUI/UpdateDialogs.cpp:72 +#: src/slic3r/GUI/UpdateDialogs.cpp:76 src/slic3r/GUI/UpdateDialogs.cpp:109 msgid "Don't notify about new releases any more" msgstr "새로운 수정사항에 대해 더 이상 알림 안 함" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +msgid "App Update available" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +#, c-format, boost-format +msgid "" +"New version of %s is available.\n" +"Do you wish to download it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +msgid "App Update download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +#, c-format, boost-format +msgid "New version of %s is available." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:146 +msgid "Run installer after download. (Otherwise file explorer will be opened)" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:151 +msgid "Target directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:158 +msgid "Select directory" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:176 +msgid "Select directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:193 +msgid "Download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:204 +msgid "Directory path is empty." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:212 +msgid "Directory path is incorrect." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:217 +#, boost-format +msgid "Directory %1% doesn't exists. Do you wish to create it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:222 +msgid "Failed to create directory." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:229 +#, boost-format +msgid "File %1% already exists. Do you wish to overwrite it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +#, boost-format +msgid "Download path is %1%. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:270 msgid "Opening Configuration Wizard" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 src/slic3r/GUI/UpdateDialogs.cpp:261 +#: src/slic3r/GUI/UpdateDialogs.cpp:270 src/slic3r/GUI/UpdateDialogs.cpp:437 msgid "Configuration update" msgstr "구성 업데이트" -#: src/slic3r/GUI/UpdateDialogs.cpp:95 +#: src/slic3r/GUI/UpdateDialogs.cpp:271 msgid "" "PrusaSlicer is not using the newest configuration available.\n" "Configuration Wizard may not offer the latest printers, filaments and SLA " "materials to be installed." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:97 +#: src/slic3r/GUI/UpdateDialogs.cpp:273 msgid "Configuration update is available" msgstr "구성 업데이트를 사용할 수 있음" -#: src/slic3r/GUI/UpdateDialogs.cpp:100 +#: src/slic3r/GUI/UpdateDialogs.cpp:276 msgid "" "Would you like to install it?\n" "\n" @@ -9390,28 +11080,28 @@ msgstr "" "\n" "업데이트 된 구성 번들 :" -#: src/slic3r/GUI/UpdateDialogs.cpp:121 src/slic3r/GUI/UpdateDialogs.cpp:181 +#: src/slic3r/GUI/UpdateDialogs.cpp:297 src/slic3r/GUI/UpdateDialogs.cpp:357 msgid "Comment:" msgstr "댓글:" -#: src/slic3r/GUI/UpdateDialogs.cpp:142 +#: src/slic3r/GUI/UpdateDialogs.cpp:318 msgid "Install" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:144 +#: src/slic3r/GUI/UpdateDialogs.cpp:320 msgid "Don't install" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 src/slic3r/GUI/UpdateDialogs.cpp:212 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 src/slic3r/GUI/UpdateDialogs.cpp:388 #, c-format, boost-format msgid "%s incompatibility" msgstr "%s 비호환성" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 msgid "You must install a configuration update." msgstr "구성 업데이트를 설치해야 합니다." -#: src/slic3r/GUI/UpdateDialogs.cpp:160 +#: src/slic3r/GUI/UpdateDialogs.cpp:336 #, c-format, boost-format msgid "" "%s will now start updates. Otherwise it won't be able to start.\n" @@ -9428,17 +11118,12 @@ msgstr "" "\n" "업데이트된 구성 번들:" -#: src/slic3r/GUI/UpdateDialogs.cpp:200 src/slic3r/GUI/UpdateDialogs.cpp:247 -#, c-format, boost-format -msgid "Exit %s" -msgstr "%s Exit" - -#: src/slic3r/GUI/UpdateDialogs.cpp:213 +#: src/slic3r/GUI/UpdateDialogs.cpp:389 #, c-format, boost-format msgid "%s configuration is incompatible" msgstr "%s 구성이 호환되지 않습니다." -#: src/slic3r/GUI/UpdateDialogs.cpp:216 +#: src/slic3r/GUI/UpdateDialogs.cpp:392 #, c-format, boost-format msgid "" "This version of %s is not compatible with currently installed configuration " @@ -9457,20 +11142,20 @@ msgstr "" "니다. 이렇게 하면 %s와 호환 되는 파일을 설치하기 전에 기존 구성의 백업 스냅샷" "이 생성 됩니다." -#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#: src/slic3r/GUI/UpdateDialogs.cpp:401 #, c-format, boost-format msgid "This %s version: %s" msgstr "이 %s 버전: %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:230 +#: src/slic3r/GUI/UpdateDialogs.cpp:406 msgid "Incompatible bundles:" msgstr "호환되지 않는 번들 :" -#: src/slic3r/GUI/UpdateDialogs.cpp:246 +#: src/slic3r/GUI/UpdateDialogs.cpp:422 msgid "Re-configure" msgstr "재구성" -#: src/slic3r/GUI/UpdateDialogs.cpp:265 +#: src/slic3r/GUI/UpdateDialogs.cpp:441 #, c-format, boost-format msgid "" "%s now uses an updated configuration structure.\n" @@ -9496,28 +11181,37 @@ msgstr "" "다음의 %s를 계속 진행하여 새 프리셋을 설정하고 자동 프리셋 업데이트를 사용할" "지 여부를 선택하십시오." -#: src/slic3r/GUI/UpdateDialogs.cpp:282 +#: src/slic3r/GUI/UpdateDialogs.cpp:458 msgid "For more information please visit our wiki page:" msgstr "자세한 정보는 위키 페이지를 참조하십시오 :" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 msgid "Configuration updates" msgstr "구성 업데이트" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 src/slic3r/GUI/UpdateDialogs.cpp:495 msgid "No updates available" msgstr "사용할 수 있는 업데이트 없음" -#: src/slic3r/GUI/UpdateDialogs.cpp:304 +#: src/slic3r/GUI/UpdateDialogs.cpp:480 #, c-format, boost-format msgid "%s has no configuration updates available." msgstr "%s 구성 업데이트를 사용할 수 없습니다." -#: src/slic3r/GUI/WipeTowerDialog.cpp:21 +#: src/slic3r/GUI/UpdateDialogs.cpp:495 +msgid "App update" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:500 +#, c-format, boost-format +msgid "%s has no version updates available." +msgstr "" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:23 msgid "Ramming customization" msgstr "사용자 정의 다지기(Ramming)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:54 +#: src/slic3r/GUI/WipeTowerDialog.cpp:56 msgid "" "Ramming denotes the rapid extrusion just before a tool change in a single-" "extruder MM printer. Its purpose is to properly shape the end of the " @@ -9538,63 +11232,63 @@ msgstr "" "전문가 수준의 설정이므로 잘못된 조정으로 인해 용지 걸림, 압출기 휠이 필라멘" "트 등에 연삭 될 수 있습니다." -#: src/slic3r/GUI/WipeTowerDialog.cpp:114 +#: src/slic3r/GUI/WipeTowerDialog.cpp:116 msgid "Total ramming time" msgstr "총 래밍 시간" -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 msgid "Total rammed volume" msgstr "총 레미드 양" -#: src/slic3r/GUI/WipeTowerDialog.cpp:120 +#: src/slic3r/GUI/WipeTowerDialog.cpp:122 msgid "Ramming line width" msgstr "래밍 선 너비" -#: src/slic3r/GUI/WipeTowerDialog.cpp:122 +#: src/slic3r/GUI/WipeTowerDialog.cpp:124 msgid "Ramming line spacing" msgstr "래밍 선 간격" -#: src/slic3r/GUI/WipeTowerDialog.cpp:173 +#: src/slic3r/GUI/WipeTowerDialog.cpp:175 msgid "Wipe tower - Purging volume adjustment" msgstr "와이프 타워 - 버려진 필라멘트 조절" -#: src/slic3r/GUI/WipeTowerDialog.cpp:299 +#: src/slic3r/GUI/WipeTowerDialog.cpp:301 msgid "" "Here you can adjust required purging volume (mm³) for any given pair of " "tools." msgstr "여기서 주어진 도구 쌍에 필요한 정화 용량 (mm³)을 조정할 수 있습니다." -#: src/slic3r/GUI/WipeTowerDialog.cpp:300 +#: src/slic3r/GUI/WipeTowerDialog.cpp:302 msgid "Extruder changed to" msgstr "익스트루더 번경" -#: src/slic3r/GUI/WipeTowerDialog.cpp:308 +#: src/slic3r/GUI/WipeTowerDialog.cpp:310 msgid "unloaded" msgstr "언로드" -#: src/slic3r/GUI/WipeTowerDialog.cpp:309 +#: src/slic3r/GUI/WipeTowerDialog.cpp:311 msgid "loaded" msgstr "로드(loaded)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:352 +#: src/slic3r/GUI/WipeTowerDialog.cpp:354 msgid "Tool #" msgstr "도구(Tool) #" -#: src/slic3r/GUI/WipeTowerDialog.cpp:361 +#: src/slic3r/GUI/WipeTowerDialog.cpp:363 msgid "" "Total purging volume is calculated by summing two values below, depending on " "which tools are loaded/unloaded." msgstr "도구가 로드 / 언로드되는지에 따라 아래의 두 값을 합산하여 계산됩니다." -#: src/slic3r/GUI/WipeTowerDialog.cpp:362 +#: src/slic3r/GUI/WipeTowerDialog.cpp:364 msgid "Volume to purge (mm³) when the filament is being" msgstr "제거할 필라멘트 양 (mm³)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:376 +#: src/slic3r/GUI/WipeTowerDialog.cpp:378 msgid "From" msgstr "발신자" -#: src/slic3r/GUI/WipeTowerDialog.cpp:442 +#: src/slic3r/GUI/WipeTowerDialog.cpp:444 msgid "" "Switching to simple settings will discard changes done in the advanced " "mode!\n" @@ -9605,26 +11299,28 @@ msgstr "" "\n" "계속하시겠습니까?" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show simplified settings" msgstr "간단한 설정보기" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show advanced settings" msgstr "고급설정 보기" -#: src/slic3r/GUI/wxExtensions.cpp:644 +#: src/slic3r/GUI/wxExtensions.cpp:672 #, c-format, boost-format msgid "Switch to the %s mode" msgstr "%s 모드로 전환" -#: src/slic3r/GUI/wxExtensions.cpp:645 +#: src/slic3r/GUI/wxExtensions.cpp:673 #, c-format, boost-format msgid "Current mode is %s" msgstr "현재 모드는 %s입니다" -#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:141 -#: src/slic3r/Utils/Repetier.cpp:69 +#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:206 +#: src/slic3r/Utils/OctoPrint.cpp:255 src/slic3r/Utils/OctoPrint.cpp:666 +#: src/slic3r/Utils/OctoPrint.cpp:824 src/slic3r/Utils/OctoPrint.cpp:897 +#: src/slic3r/Utils/Repetier.cpp:88 #, c-format, boost-format msgid "Mismatched type of print host: %s" msgstr "일치 하지않는 인쇄 호스트 유형: %s" @@ -9743,69 +11439,100 @@ msgstr "" "참고: 펌웨어 2.00.02 또는 최신 및 활성화된 업로드 기능이 있는 FlashAir가 필요" "합니다." -#: src/slic3r/Utils/OctoPrint.cpp:164 +#: src/slic3r/Utils/OctoPrint.cpp:278 msgid "Connection to OctoPrint works correctly." msgstr "OctoPrint에 대한 연결이 올바르게 작동합니다." -#: src/slic3r/Utils/OctoPrint.cpp:170 +#: src/slic3r/Utils/OctoPrint.cpp:284 msgid "Could not connect to OctoPrint" msgstr "OctoPrint에 연결할 수 없습니다" -#: src/slic3r/Utils/OctoPrint.cpp:172 +#: src/slic3r/Utils/OctoPrint.cpp:286 msgid "Note: OctoPrint version at least 1.1.0 is required." msgstr "참고: OctoPrint 버전 이상이 1.1.0 이상이 필요합니다." -#: src/slic3r/Utils/OctoPrint.cpp:292 +#: src/slic3r/Utils/OctoPrint.cpp:528 msgid "Connection to Prusa SL1 / SL1S works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:298 +#: src/slic3r/Utils/OctoPrint.cpp:534 msgid "Could not connect to Prusa SLA" msgstr "Prusa SLA에 연결할 수 없습니다" -#: src/slic3r/Utils/OctoPrint.cpp:336 +#: src/slic3r/Utils/OctoPrint.cpp:573 msgid "Connection to PrusaLink works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:342 +#: src/slic3r/Utils/OctoPrint.cpp:579 msgid "Could not connect to PrusaLink" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:61 +#: src/slic3r/Utils/OctoPrint.cpp:776 +msgid "Storages found:" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "read only" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "no free space" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:781 +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%.%2%" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:64 #, boost-format msgid "Copying of file %1% to %2% failed: %3%" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:645 -#: src/slic3r/Utils/PresetUpdater.cpp:662 +#: src/slic3r/Utils/PresetUpdater.cpp:998 +#: src/slic3r/Utils/PresetUpdater.cpp:1015 msgid "Continue and install configuration updates?" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:777 +#: src/slic3r/Utils/PresetUpdater.cpp:1021 +msgid "Installing profiles" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1071 +#, boost-format +msgid "Downloading resources for %1%." +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1171 msgid "" -"Configuration Updates causes a lost of preset modification.\n" +"Configuration Update will cause the preset modification to be lost.\n" "So, check unsaved changes and save them if necessary." msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:779 +#: src/slic3r/Utils/PresetUpdater.cpp:1173 msgid "Updating" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:808 +#: src/slic3r/Utils/PresetUpdater.cpp:1202 #, c-format, boost-format msgid "requires min. %s and max. %s" msgstr "최소. %s 와 최대. %s" -#: src/slic3r/Utils/PresetUpdater.cpp:812 +#: src/slic3r/Utils/PresetUpdater.cpp:1206 #, c-format, boost-format msgid "requires min. %s" msgstr "최소 %s가 필요 합니다" -#: src/slic3r/Utils/PresetUpdater.cpp:815 +#: src/slic3r/Utils/PresetUpdater.cpp:1209 #, c-format, boost-format msgid "requires max. %s" msgstr "최대 필요 합니다. %s" +#: src/slic3r/Utils/PresetUpdater.cpp:1362 +#, boost-format +msgid "Couldn't locate idx file %1% when performing updates." +msgstr "" + #: src/slic3r/Utils/Http.cpp:73 msgid "" "Could not detect system SSL certificate store. PrusaSlicer will be unable to " @@ -9836,30 +11563,30 @@ msgstr "" "컬 이트인이 실패했습니다. PrusaSlicer는 네트워크 연결을 설정할 수 없습니다. " "자세한 내용은 로그를 참조하십시오." -#: src/slic3r/Utils/Process.cpp:157 +#: src/slic3r/Utils/Process.cpp:164 msgid "Open G-code file:" msgstr "G 코드 파일 열기:" -#: src/slic3r/Utils/Repetier.cpp:84 +#: src/slic3r/Utils/Repetier.cpp:103 msgid "Connection to Repetier works correctly." msgstr "" -#: src/slic3r/Utils/Repetier.cpp:90 +#: src/slic3r/Utils/Repetier.cpp:109 msgid "Could not connect to Repetier" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:92 +#: src/slic3r/Utils/Repetier.cpp:111 msgid "Note: Repetier version at least 0.90.0 is required." msgstr "" -#: src/slic3r/Utils/Repetier.cpp:246 +#: src/slic3r/Utils/Repetier.cpp:263 #, boost-format msgid "" "HTTP status: %1%\n" "Message body: \"%2%\"" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:253 +#: src/slic3r/Utils/Repetier.cpp:270 #, boost-format msgid "" "Parsing of host response failed.\n" @@ -9867,7 +11594,7 @@ msgid "" "Error: \"%2%\"" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:266 +#: src/slic3r/Utils/Repetier.cpp:283 #, boost-format msgid "" "Enumeration of host printers failed.\n" @@ -9896,62 +11623,58 @@ msgstr "" msgid "Abort" msgstr "" -#: src/libslic3r/GCode.cpp:539 +#: src/libslic3r/GCode.cpp:490 msgid "There is an object with no extrusions in the first layer." msgstr "" -#: src/libslic3r/GCode.cpp:570 +#: src/libslic3r/GCode.cpp:521 #, boost-format msgid "Empty layer between %1% and %2%." msgstr "" -#: src/libslic3r/GCode.cpp:573 +#: src/libslic3r/GCode.cpp:524 msgid "(Some lines not shown)" msgstr "" -#: src/libslic3r/GCode.cpp:575 +#: src/libslic3r/GCode.cpp:526 #, boost-format msgid "Object name: %1%" msgstr "" -#: src/libslic3r/GCode.cpp:576 +#: src/libslic3r/GCode.cpp:527 msgid "" "Make sure the object is printable. This is usually caused by negligibly " "small extrusions or by a faulty model. Try to repair the model or change its " "orientation on the bed." msgstr "" -#: src/libslic3r/GCode.cpp:718 +#: src/libslic3r/GCode.cpp:669 msgid "Filament Start G-code" msgstr "" -#: src/libslic3r/GCode.cpp:725 +#: src/libslic3r/GCode.cpp:676 msgid "Filament End G-code" msgstr "" -#: src/libslic3r/GCode.cpp:764 +#: src/libslic3r/GCode.cpp:717 msgid "In the custom G-code were found reserved keywords:" msgstr "" -#: src/libslic3r/GCode.cpp:766 +#: src/libslic3r/GCode.cpp:719 msgid "" "This may cause problems in g-code visualization and printing time estimation." msgstr "" -#: src/libslic3r/GCode.cpp:1200 src/libslic3r/GCode.cpp:1211 +#: src/libslic3r/GCode.cpp:1124 src/libslic3r/GCode.cpp:1135 msgid "No extrusions were generated for objects." msgstr "" -#: src/libslic3r/GCode.cpp:1406 +#: src/libslic3r/GCode.cpp:1328 msgid "" "Your print is very close to the priming regions. Make sure there is no " "collision." msgstr "인쇄물은 프라이밍 영역과 매우 가깝습니다. 충돌이 없는지 확인합니다." -#: src/libslic3r/ExtrusionEntity.cpp:344 src/libslic3r/ExtrusionEntity.cpp:380 -msgid "Mixed" -msgstr "혼합" - #: src/libslic3r/Flow.cpp:61 #, boost-format msgid "" @@ -9959,32 +11682,32 @@ msgid "" msgstr "" "%1% 대해 압출 폭을 계산할 수 없습니다: 변수 \"%2%\"에 액세스할 수 없습니다." -#: src/libslic3r/Format/3mf.cpp:1735 +#: src/libslic3r/Format/3mf.cpp:1880 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "선택한 3mf 파일은 최신 버전의 %1% 저장되었으며 호환되지 않습니다." -#: src/libslic3r/Format/3mf.cpp:1746 +#: src/libslic3r/Format/3mf.cpp:1891 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1750 +#: src/libslic3r/Format/3mf.cpp:1895 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1754 +#: src/libslic3r/Format/3mf.cpp:1899 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/AMF.cpp:993 +#: src/libslic3r/Format/AMF.cpp:1000 #, boost-format msgid "" "The selected amf file has been saved with a newer version of %1% and is not " @@ -10127,24 +11850,30 @@ msgstr "유효성 검사 실패" msgid "write calledback failed" msgstr "쓰기 호출 백 실패" -#: src/libslic3r/Print.cpp:454 +#: src/libslic3r/Print.cpp:473 msgid "All objects are outside of the print volume." msgstr "모든 개체가 인쇄 볼륨 외부에 있습니다." -#: src/libslic3r/Print.cpp:457 +#: src/libslic3r/Print.cpp:476 msgid "The supplied settings will cause an empty print." msgstr "제공된 설정으로 인해 빈 인쇄가 발생합니다." -#: src/libslic3r/Print.cpp:461 +#: src/libslic3r/Print.cpp:480 msgid "Some objects are too close; your extruder will collide with them." msgstr "일부 개체가 너무 가깝습니다. 귀하의 압출기가 그들과 충돌합니다." -#: src/libslic3r/Print.cpp:463 +#: src/libslic3r/Print.cpp:482 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." msgstr "일부 개체는 너무 크고 익스트루더 충돌없이 인쇄 할 수 없습니다." -#: src/libslic3r/Print.cpp:472 +#: src/libslic3r/Print.cpp:486 +msgid "" +"Avoid crossing perimeters option and avoid crossing curled overhangs option " +"cannot be both enabled together." +msgstr "" + +#: src/libslic3r/Print.cpp:495 msgid "" "Only a single object may be printed at a time in Spiral Vase mode. Either " "remove all but the last object, or enable sequential mode by " @@ -10154,7 +11883,7 @@ msgstr "" "를 제외한 모든 개체를 제거하거나 \"complete_objects\"하여 순차 모드를 사용하" "도록 설정합니다." -#: src/libslic3r/Print.cpp:476 +#: src/libslic3r/Print.cpp:499 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." @@ -10162,7 +11891,17 @@ msgstr "" "나선형 꽃병 옵션(Spiral Vase)은 단일 재료 객체를 인쇄 할 때만 사용할 수 있습" "니다." -#: src/libslic3r/Print.cpp:489 +#: src/libslic3r/Print.cpp:523 +msgid "" +"The print is taller than the maximum allowed height. You might want to " +"reduce the size of your model or change current print settings and retry." +msgstr "" + +#: src/libslic3r/Print.cpp:540 +msgid "Variable layer height is not supported with Organic supports." +msgstr "" + +#: src/libslic3r/Print.cpp:553 msgid "" "The wipe tower is only supported if all extruders have the same nozzle " "diameter and use filaments of the same diameter." @@ -10170,7 +11909,7 @@ msgstr "" "와이프 타워는 모든 압출기직경이 동일하고 동일한 직경의 필라멘트를 사용하는 경" "우에만 지원됩니다." -#: src/libslic3r/Print.cpp:495 +#: src/libslic3r/Print.cpp:559 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, " "RepRapFirmware and Repetier G-code flavors." @@ -10178,7 +11917,7 @@ msgstr "" "와이프 타워는 현재 말린, RepRap / 단거리, RepRapFirmware 및 Repetier G 코드 " "맛에 대해서만 지원됩니다." -#: src/libslic3r/Print.cpp:497 +#: src/libslic3r/Print.cpp:561 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." @@ -10186,29 +11925,31 @@ msgstr "" "와이프 타워는 현재 상대적 압출기 어드레싱 (use_relative_e_distances=1)에서만 " "지원됩니다." -#: src/libslic3r/Print.cpp:499 -msgid "Ooze prevention is currently not supported with the wipe tower enabled." -msgstr "현재 활성화된 와이프 타워로는 Ooze 방지가 지원되지 않습니다." +#: src/libslic3r/Print.cpp:563 +msgid "" +"Ooze prevention is only supported with the wipe tower when " +"'single_extruder_multi_material' is off." +msgstr "" -#: src/libslic3r/Print.cpp:501 +#: src/libslic3r/Print.cpp:565 msgid "" "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." msgstr "와이프 타워는 현재 볼륨 E(use_volumetric_e=0)를 지원하지 않습니다." -#: src/libslic3r/Print.cpp:503 +#: src/libslic3r/Print.cpp:567 msgid "" "The Wipe Tower is currently not supported for multimaterial sequential " "prints." msgstr "와이프 타워는 현재 다중 재료 순차 인쇄에 대해 지원되지 않습니다." -#: src/libslic3r/Print.cpp:524 +#: src/libslic3r/Print.cpp:577 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " "layer heights" msgstr "" "와이프 타워는 레이어 높이가 동일한 경우에만 여러 개체에 대해서만 지원됩니다." -#: src/libslic3r/Print.cpp:526 +#: src/libslic3r/Print.cpp:579 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "over an equal number of raft layers" @@ -10216,7 +11957,7 @@ msgstr "" "와이프 타워는 같은 수의 라프트 레이어 위에 인쇄 된 경우 여러 객체에 대해서만 " "지원됩니다" -#: src/libslic3r/Print.cpp:529 +#: src/libslic3r/Print.cpp:582 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "with the same support_material_contact_distance" @@ -10224,14 +11965,14 @@ msgstr "" "와이프 타워는 동일한 support_material_contact_distance로 인쇄 된 경우 여러 객" "체에 대해서만 지원됩니다" -#: src/libslic3r/Print.cpp:531 +#: src/libslic3r/Print.cpp:584 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." msgstr "" "와이프 타워는 똑같이 슬라이스 된 경우 여러 오브젝트에 대해서만 지원됩니다." -#: src/libslic3r/Print.cpp:555 +#: src/libslic3r/Print.cpp:609 msgid "" "The Wipe tower is only supported if all objects have the same variable layer " "height" @@ -10239,22 +11980,22 @@ msgstr "" "지우기 타워는 모든 오브젝트가 동일한 가변 레이어 높이를 갖는 경우에만 지원됩" "니다." -#: src/libslic3r/Print.cpp:579 +#: src/libslic3r/Print.cpp:633 msgid "" "One or more object were assigned an extruder that the printer does not have." msgstr "하나 이상의 개체에 프린터에없는 압출기가 지정되었습니다." -#: src/libslic3r/Print.cpp:592 +#: src/libslic3r/Print.cpp:646 #, boost-format msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" msgstr "%1%=%2% mm가 너무 낮아 레이어 높이%3% mm에서 인쇄할 수 없습니다." -#: src/libslic3r/Print.cpp:595 +#: src/libslic3r/Print.cpp:649 #, boost-format msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" msgstr "노즐 직경 %3% mm로 인쇄할 수 있는 과도한 %1%=%2% mm" -#: src/libslic3r/Print.cpp:606 +#: src/libslic3r/Print.cpp:660 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " @@ -10265,7 +12006,7 @@ msgstr "" "(support_material_extruder == 0 or support_material_interface_extruder == 0)" "로 인쇄되는 경우 모든 노즐은 동일한 지름이어야합니다." -#: src/libslic3r/Print.cpp:614 +#: src/libslic3r/Print.cpp:668 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers " "need to be synchronized with the object layers." @@ -10273,65 +12014,106 @@ msgstr "" "와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 오브젝트 레이" "어와 동기화 해야 합니다." -#: src/libslic3r/Print.cpp:618 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only if they are " -"printed with the current extruder without triggering a tool change. (both " -"support_material_extruder and support_material_interface_extruder need to be " -"set to 0)." -msgstr "" -"와이프 타워는 현재 공구 교체를 트리거하지 않고 현재의 압출기로 인쇄 하는 경우" -"에만 비가용성 서포트를 지원 합니다. (support_material_extruder과 " -"support_material_interface_extruder 모두 0으로 설정 해야 합니다.)" - -#: src/libslic3r/Print.cpp:654 +#: src/libslic3r/Print.cpp:708 msgid "First layer height can't be greater than nozzle diameter" msgstr "첫번째 레이어의 높이는 노즐 직경보다 클 수 없습니다" -#: src/libslic3r/Print.cpp:659 +#: src/libslic3r/Print.cpp:713 msgid "Layer height can't be greater than nozzle diameter" msgstr "레이어 높이는 노즐 직경보다 클 수 없습니다" -#: src/libslic3r/Print.cpp:680 +#: src/libslic3r/Print.cpp:734 msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " "layer_gcode." msgstr "" -#: src/libslic3r/Print.cpp:682 +#: src/libslic3r/Print.cpp:736 msgid "" "\"G92 E0\" was found in before_layer_gcode, which is incompatible with " "absolute extruder addressing." msgstr "" -#: src/libslic3r/Print.cpp:684 +#: src/libslic3r/Print.cpp:738 msgid "" "\"G92 E0\" was found in layer_gcode, which is incompatible with absolute " "extruder addressing." msgstr "" -#: src/libslic3r/Print.cpp:826 +#: src/libslic3r/Print.cpp:880 msgid "Infilling layers" msgstr "레이어 채우기" -#: src/libslic3r/Print.cpp:848 +#: src/libslic3r/Print.cpp:908 msgid "Generating skirt and brim" msgstr "" -#: src/libslic3r/Print.cpp:896 +#: src/libslic3r/Print.cpp:956 msgid "Exporting G-code" msgstr "G코드 내보내기" -#: src/libslic3r/Print.cpp:900 +#: src/libslic3r/Print.cpp:960 msgid "Generating G-code" msgstr "G 코드 생성" +#: src/libslic3r/Print.cpp:1169 +msgid "Alert if supports needed" +msgstr "" + +#: src/libslic3r/Print.cpp:1174 +msgid "long bridging extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1175 +msgid "floating bridge anchors" +msgstr "" + +#: src/libslic3r/Print.cpp:1178 +msgid "collapsing overhang" +msgstr "" + +#: src/libslic3r/Print.cpp:1180 +msgid "loose extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1183 +msgid "low bed adhesion" +msgstr "" + +#: src/libslic3r/Print.cpp:1184 +msgid "floating object part" +msgstr "" + +#: src/libslic3r/Print.cpp:1185 +msgid "thin fragile section" +msgstr "" + +#: src/libslic3r/Print.cpp:1221 +msgid "Detected print stability issues" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "or" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "and" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "brim" +msgstr "" + +#: src/libslic3r/Print.cpp:1248 +msgid "Consider enabling supports" +msgstr "" + #: src/libslic3r/SLA/Pad.cpp:533 msgid "Pad brim size is too small for the current configuration." msgstr "패드 브램 크기는 현재 구성에 너무 작습니다." -#: src/libslic3r/SLAPrint.cpp:628 +#: src/libslic3r/SLAPrint.cpp:546 msgid "" "Cannot proceed without support points! Add support points or disable support " "generation." @@ -10339,7 +12121,7 @@ msgstr "" "서포트 포인트 없이 진행할 수 없습니다! 서포트 지점을 추가 하거나 서포트 생성" "을 사용 하지 않도록 설정 합니다." -#: src/libslic3r/SLAPrint.cpp:640 +#: src/libslic3r/SLAPrint.cpp:558 msgid "" "Elevation is too low for object. Use the \"Pad around object\" feature to " "print the object without elevation." @@ -10347,7 +12129,7 @@ msgstr "" "오브젝트의 표고가 너무 낮습니다. \"오브젝트 주위 의 패드\" 기능을 사용하여 고" "도 없이 오브젝트를 인쇄합니다." -#: src/libslic3r/SLAPrint.cpp:646 +#: src/libslic3r/SLAPrint.cpp:564 msgid "" "The endings of the support pillars will be deployed on the gap between the " "object and the pad. 'Support base safety distance' has to be greater than " @@ -10356,68 +12138,68 @@ msgstr "" "서포트 기둥 끝은 오브젝트와 패드 사이의 간격에 배치됩니다. 이를 방지하기 위" "해 '베이스 서포트 안전 거리'는 '패드 오브젝트 갭' 매개변수보다 커야 합니다." -#: src/libslic3r/SLAPrint.cpp:661 +#: src/libslic3r/SLAPrint.cpp:579 msgid "Exposition time is out of printer profile bounds." msgstr "박람회 시간은 프린터 프로필 경계가 없습니다." -#: src/libslic3r/SLAPrint.cpp:668 +#: src/libslic3r/SLAPrint.cpp:586 msgid "Initial exposition time is out of printer profile bounds." msgstr "초기 박람회 시간은 프린터 프로필 경계가 없습니다." -#: src/libslic3r/SLAPrint.cpp:784 +#: src/libslic3r/SLAPrint.cpp:693 msgid "Slicing done" msgstr "슬라이싱 완료" -#: src/libslic3r/SLAPrintSteps.cpp:47 +#: src/libslic3r/SLAPrintSteps.cpp:57 +msgid "Assembling model from parts" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:58 msgid "Hollowing model" msgstr "속이 빈 모델" -#: src/libslic3r/SLAPrintSteps.cpp:48 +#: src/libslic3r/SLAPrintSteps.cpp:59 msgid "Drilling holes into model." msgstr "구멍을 모델에 드릴링합니다." -#: src/libslic3r/SLAPrintSteps.cpp:49 +#: src/libslic3r/SLAPrintSteps.cpp:60 msgid "Slicing model" msgstr "슬라이싱 모델" -#: src/libslic3r/SLAPrintSteps.cpp:50 src/libslic3r/SLAPrintSteps.cpp:639 +#: src/libslic3r/SLAPrintSteps.cpp:61 src/libslic3r/SLAPrintSteps.cpp:691 msgid "Generating support points" msgstr "서포트 지점 생성" -#: src/libslic3r/SLAPrintSteps.cpp:51 +#: src/libslic3r/SLAPrintSteps.cpp:62 msgid "Generating support tree" msgstr "서포트 트리 생성" -#: src/libslic3r/SLAPrintSteps.cpp:52 +#: src/libslic3r/SLAPrintSteps.cpp:63 msgid "Generating pad" msgstr "패드 생성" -#: src/libslic3r/SLAPrintSteps.cpp:53 +#: src/libslic3r/SLAPrintSteps.cpp:64 msgid "Slicing supports" msgstr "슬라이싱 서포트즈" -#: src/libslic3r/SLAPrintSteps.cpp:68 +#: src/libslic3r/SLAPrintSteps.cpp:79 msgid "Merging slices and calculating statistics" msgstr "슬라이스 병합 및 통계 계산" -#: src/libslic3r/SLAPrintSteps.cpp:69 +#: src/libslic3r/SLAPrintSteps.cpp:80 msgid "Rasterizing layers" msgstr "래스터라이징 레이어" -#: src/libslic3r/SLAPrintSteps.cpp:435 -msgid "Too many overlapping holes." -msgstr "겹치는 구멍이 너무 많습니다." - -#: src/libslic3r/SLAPrintSteps.cpp:442 +#: src/libslic3r/SLAPrintSteps.cpp:255 msgid "" "Mesh to be hollowed is not suitable for hollowing (does not bound a volume)." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:450 +#: src/libslic3r/SLAPrintSteps.cpp:262 msgid "Unable to drill the current configuration of holes into the model." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:470 +#: src/libslic3r/SLAPrintSteps.cpp:271 msgid "" "Drilling holes into the mesh failed. This is usually caused by broken model. " "Try to fix it first." @@ -10425,26 +12207,33 @@ msgstr "" "메시에 구멍을 뚫지 못했습니다. 이는 일반적으로 모델 파손으로 인해 발생합니" "다. 먼저 고쳐보세요." -#: src/libslic3r/SLAPrintSteps.cpp:476 +#: src/libslic3r/SLAPrintSteps.cpp:279 msgid "Failed to drill some holes into the model" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:520 +#: src/libslic3r/SLAPrintSteps.cpp:289 +msgid "" +"Can't perform full mesh booleans! Some parts of the print will be previewed " +"with approximated meshes. This does not affect the quality of slices or the " +"physical print in any way." +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:510 msgid "" "Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "" "내부 오류: 일치하지 않는 슬라이스 인덱스로 인해 슬라이싱을 중지해야 했습니다." -#: src/libslic3r/SLAPrintSteps.cpp:691 src/libslic3r/SLAPrintSteps.cpp:700 -#: src/libslic3r/SLAPrintSteps.cpp:738 +#: src/libslic3r/SLAPrintSteps.cpp:740 src/libslic3r/SLAPrintSteps.cpp:749 +#: src/libslic3r/SLAPrintSteps.cpp:787 msgid "Visualizing supports" msgstr "지원 시각화" -#: src/libslic3r/SLAPrintSteps.cpp:730 +#: src/libslic3r/SLAPrintSteps.cpp:779 msgid "No pad can be generated for this model with the current configuration" msgstr "현재 구성을 통해 이 모델에 대해 패드를 생성할 수 없습니다." -#: src/libslic3r/SLAPrintSteps.cpp:854 +#: src/libslic3r/SLAPrintSteps.cpp:908 msgid "" "There are unprintable objects. Try to adjust support settings to make the " "objects printable." @@ -10456,27 +12245,27 @@ msgstr "" msgid "Failed processing of the output_filename_format template." msgstr "아래 output_filename_format 템플리트의 처리에 실패했습니다." -#: src/libslic3r/PrintConfig.cpp:236 src/libslic3r/PrintConfig.cpp:237 +#: src/libslic3r/PrintConfig.cpp:254 src/libslic3r/PrintConfig.cpp:255 msgid "Printer technology" msgstr "프린터 기술" -#: src/libslic3r/PrintConfig.cpp:244 +#: src/libslic3r/PrintConfig.cpp:260 msgid "Bed shape" msgstr "침대(bed) 모양" -#: src/libslic3r/PrintConfig.cpp:249 +#: src/libslic3r/PrintConfig.cpp:265 msgid "Bed custom texture" msgstr "침대 사용자 정의 텍스처" -#: src/libslic3r/PrintConfig.cpp:254 +#: src/libslic3r/PrintConfig.cpp:270 msgid "Bed custom model" msgstr "침대 사용자 정의 모델" -#: src/libslic3r/PrintConfig.cpp:259 +#: src/libslic3r/PrintConfig.cpp:275 msgid "Elephant foot compensation" msgstr "코끼리 발(Elephant foot) 보상값" -#: src/libslic3r/PrintConfig.cpp:261 +#: src/libslic3r/PrintConfig.cpp:277 msgid "" "The first layer will be shrunk in the XY plane by the configured value to " "compensate for the 1st layer squish aka an Elephant Foot effect." @@ -10484,27 +12273,27 @@ msgstr "" "첫 번째 레이어는 구성 요소 값에 따라 XY 평면에서 수축되어 일층 스퀴시 코끼리" "발(Elephant Foot) 효과를 보완합니다." -#: src/libslic3r/PrintConfig.cpp:269 +#: src/libslic3r/PrintConfig.cpp:285 msgid "G-code thumbnails" msgstr "G 코드 축소판 손톱" -#: src/libslic3r/PrintConfig.cpp:270 +#: src/libslic3r/PrintConfig.cpp:286 msgid "" "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " "following format: \"XxY, XxY, ...\"" msgstr "" -#: src/libslic3r/PrintConfig.cpp:276 +#: src/libslic3r/PrintConfig.cpp:292 msgid "Format of G-code thumbnails" msgstr "" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:293 msgid "" "Format of G-code thumbnails: PNG for best quality, JPG for smallest size, " "QOI for low memory firmware" msgstr "" -#: src/libslic3r/PrintConfig.cpp:288 +#: src/libslic3r/PrintConfig.cpp:301 msgid "" "This setting controls the height (and thus the total number) of the slices/" "layers. Thinner layers give better accuracy but take more time to print." @@ -10512,21 +12301,21 @@ msgstr "" "이 설정은 슬라이스/레이어의 높이(따라서 총 수)를 제어합니다. 얇은 층은 더 나" "은 정확성을 제공하지만 인쇄하는 데는 더 많은 시간이 걸린다." -#: src/libslic3r/PrintConfig.cpp:295 +#: src/libslic3r/PrintConfig.cpp:308 msgid "Max print height" msgstr "최대 프린트 높이" -#: src/libslic3r/PrintConfig.cpp:296 +#: src/libslic3r/PrintConfig.cpp:309 msgid "" "Set this to the maximum height that can be reached by your extruder while " "printing." msgstr "인쇄 중에 익스트루더가 도달 할 수있는 최대 높이로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:304 +#: src/libslic3r/PrintConfig.cpp:317 msgid "Hostname, IP or URL" msgstr "호스트 이름(Hostname), IP or URL" -#: src/libslic3r/PrintConfig.cpp:305 +#: src/libslic3r/PrintConfig.cpp:318 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the hostname, IP address or URL of the printer host instance. Print host " @@ -10540,11 +12329,11 @@ msgstr "" "에 다음 형식으로 입력하여 액세스할 수 https://username:password@your-octopi-" "address/" -#: src/libslic3r/PrintConfig.cpp:314 +#: src/libslic3r/PrintConfig.cpp:327 msgid "API Key / Password" msgstr "API 키 / 암호" -#: src/libslic3r/PrintConfig.cpp:315 +#: src/libslic3r/PrintConfig.cpp:328 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the API Key or the password required for authentication." @@ -10552,11 +12341,11 @@ msgstr "" "Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드에는 API " "키 또는 인증에 필요한 암호가 포함되어야 합니다." -#: src/libslic3r/PrintConfig.cpp:323 +#: src/libslic3r/PrintConfig.cpp:336 msgid "Name of the printer" msgstr "프린터 공급 업체의 이름입니다." -#: src/libslic3r/PrintConfig.cpp:331 +#: src/libslic3r/PrintConfig.cpp:344 msgid "" "Custom CA certificate file can be specified for HTTPS OctoPrint connections, " "in crt/pem format. If left blank, the default OS CA certificate repository " @@ -10565,46 +12354,58 @@ msgstr "" "사용자 지정 CA 인증서 파일은 crt/pem 형식의 HTTPS 옥토 프린트 연결에 대해 지" "정할 수 있습니다. 비워 두면 기본 OS CA 인증서 리포지토리가 사용 됩니다." -#: src/libslic3r/PrintConfig.cpp:347 +#: src/libslic3r/PrintConfig.cpp:360 msgid "Password" msgstr "비밀번호" -#: src/libslic3r/PrintConfig.cpp:355 +#: src/libslic3r/PrintConfig.cpp:368 msgid "Ignore HTTPS certificate revocation checks" msgstr "" -#: src/libslic3r/PrintConfig.cpp:356 +#: src/libslic3r/PrintConfig.cpp:369 msgid "" "Ignore HTTPS certificate revocation checks in case of missing or offline " "distribution points. One may want to enable this option for self signed " "certificates if connection fails." msgstr "" -#: src/libslic3r/PrintConfig.cpp:363 +#: src/libslic3r/PrintConfig.cpp:376 msgid "Printer preset names" msgstr "" -#: src/libslic3r/PrintConfig.cpp:364 +#: src/libslic3r/PrintConfig.cpp:377 msgid "Names of presets related to the physical printer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:369 +#: src/libslic3r/PrintConfig.cpp:382 msgid "Authorization Type" msgstr "권한 부여 유형" -#: src/libslic3r/PrintConfig.cpp:374 +#: src/libslic3r/PrintConfig.cpp:385 msgid "API key" msgstr "API key" -#: src/libslic3r/PrintConfig.cpp:375 +#: src/libslic3r/PrintConfig.cpp:386 msgid "HTTP digest" msgstr "HTTP 다이제스트" -#: src/libslic3r/PrintConfig.cpp:395 +#: src/libslic3r/PrintConfig.cpp:406 +msgid "Avoid crossing curled overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:407 +msgid "" +"Plan travel moves such that the extruder avoids areas where the filament may " +"be curled up. This is mostly happening on steeper rounded overhangs and may " +"cause a crash with the nozzle. This feature slows down both the print and " +"the G-code generation." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:414 msgid "Avoid crossing perimeters" msgstr "교체된 둘레를 피하세요." -#: src/libslic3r/PrintConfig.cpp:396 +#: src/libslic3r/PrintConfig.cpp:415 msgid "" "Optimize travel moves in order to minimize the crossing of perimeters. This " "is mostly useful with Bowden extruders which suffer from oozing. This " @@ -10614,11 +12415,11 @@ msgstr "" "(Bowling) 압출기가 흘러 나오기 쉬운 경우에 주로 유용합니다. 이 기능을 사용하" "면 인쇄 및 G 코드 생성 속도가 느려집니다." -#: src/libslic3r/PrintConfig.cpp:403 +#: src/libslic3r/PrintConfig.cpp:422 msgid "Avoid crossing perimeters - Max detour length" msgstr "경계를 넘어가지 마십시오 - 최대 우회 길이" -#: src/libslic3r/PrintConfig.cpp:405 +#: src/libslic3r/PrintConfig.cpp:424 msgid "" "The maximum detour length for avoid crossing perimeters. If the detour is " "longer than this value, avoid crossing perimeters is not applied for this " @@ -10629,15 +12430,15 @@ msgstr "" "동 경로에 경계 횡단이 적용되지 않는 것을 피하십시오. 우회 길이는 절대 값 또" "는 백분율(예: 50%)으로 지정할 수 있습니다. 직항 경로." -#: src/libslic3r/PrintConfig.cpp:408 +#: src/libslic3r/PrintConfig.cpp:427 msgid "mm or % (zero to disable)" msgstr "mm 또는 %(비활성화할 0)" -#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:2839 +#: src/libslic3r/PrintConfig.cpp:434 src/libslic3r/PrintConfig.cpp:2927 msgid "Other layers" msgstr "다른 레이어" -#: src/libslic3r/PrintConfig.cpp:416 +#: src/libslic3r/PrintConfig.cpp:435 msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." @@ -10645,11 +12446,11 @@ msgstr "" "첫 번째 레이어 이후의 레이어 온도. 이 값을 0으로 설정하면 출력에서 ​​베드 온도 " "제어 명령을 비활성화합니다." -#: src/libslic3r/PrintConfig.cpp:419 +#: src/libslic3r/PrintConfig.cpp:438 msgid "Bed temperature" msgstr "배드 온도" -#: src/libslic3r/PrintConfig.cpp:426 +#: src/libslic3r/PrintConfig.cpp:445 msgid "" "This custom code is inserted at every layer change, right before the Z move. " "Note that you can use placeholder variables for all Slic3r settings as well " @@ -10658,11 +12459,11 @@ msgstr "" "이 사용자 정의 코드는 Z 이동 직전의 모든 레이어 변경에 삽입됩니다. Slic3r 설" "정과 [layer_num] 및 [layer_z]에 대한 자리 표시 자 변수를 사용할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:436 +#: src/libslic3r/PrintConfig.cpp:455 msgid "Between objects G-code" msgstr "객체 간 G 코드" -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:456 msgid "" "This code is inserted between objects when using sequential printing. By " "default extruder and bed temperature are reset using non-wait command; " @@ -10677,15 +12478,15 @@ msgstr "" "지 않습니다. 모든 Slic3r 설정에 자리 표시 변수를 사용할 수 있으므로 원하는 위" "치에 \"M109 S[first_layer_temperature]\"명령을 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:448 +#: src/libslic3r/PrintConfig.cpp:467 msgid "Number of solid layers to generate on bottom surfaces." msgstr "바닥면에 생성할 솔리드 레이어의 수." -#: src/libslic3r/PrintConfig.cpp:449 +#: src/libslic3r/PrintConfig.cpp:468 msgid "Bottom solid layers" msgstr "바닥 단일 레이어" -#: src/libslic3r/PrintConfig.cpp:457 +#: src/libslic3r/PrintConfig.cpp:476 msgid "" "The number of bottom solid layers is increased above bottom_solid_layers if " "necessary to satisfy minimum thickness of bottom shell." @@ -10693,15 +12494,15 @@ msgstr "" "바닥 쉘의 최소 두께를 충족하기 위해 필요한 경우 바닥 솔리드 레이어의 수가 " "bottom_solid_layers 이상 증가합니다." -#: src/libslic3r/PrintConfig.cpp:459 +#: src/libslic3r/PrintConfig.cpp:478 msgid "Minimum bottom shell thickness" msgstr "최소 바닥 쉘 두께" -#: src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:484 msgid "Bridge" msgstr "브리지" -#: src/libslic3r/PrintConfig.cpp:466 +#: src/libslic3r/PrintConfig.cpp:485 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." @@ -10709,21 +12510,21 @@ msgstr "" "이것은 프린터가 브릿지에 사용할 가속도입니다. 브리지의 가속 제어를 사용하지 " "않으려면 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:468 src/libslic3r/PrintConfig.cpp:639 -#: src/libslic3r/PrintConfig.cpp:1192 src/libslic3r/PrintConfig.cpp:1201 -#: src/libslic3r/PrintConfig.cpp:1401 src/libslic3r/PrintConfig.cpp:1410 -#: src/libslic3r/PrintConfig.cpp:1419 src/libslic3r/PrintConfig.cpp:1713 -#: src/libslic3r/PrintConfig.cpp:1764 src/libslic3r/PrintConfig.cpp:1775 -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1983 -#: src/libslic3r/PrintConfig.cpp:1991 +#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:1252 src/libslic3r/PrintConfig.cpp:1261 +#: src/libslic3r/PrintConfig.cpp:1447 src/libslic3r/PrintConfig.cpp:1456 +#: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1750 +#: src/libslic3r/PrintConfig.cpp:1801 src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1822 src/libslic3r/PrintConfig.cpp:2013 +#: src/libslic3r/PrintConfig.cpp:2021 msgid "mm/s²" msgstr "mm³/s²" -#: src/libslic3r/PrintConfig.cpp:474 +#: src/libslic3r/PrintConfig.cpp:493 msgid "Bridging angle" msgstr "브릿지 각도" -#: src/libslic3r/PrintConfig.cpp:476 +#: src/libslic3r/PrintConfig.cpp:495 msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for all " @@ -10733,35 +12534,30 @@ msgstr "" "로 계산됩니다. 그렇지 않으면 제공된 각도가 모든 브리지에 사용됩니다. 각도 제" "로는 180 °를 사용하십시오." -#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:1102 -#: src/libslic3r/PrintConfig.cpp:2282 src/libslic3r/PrintConfig.cpp:2292 -#: src/libslic3r/PrintConfig.cpp:2583 src/libslic3r/PrintConfig.cpp:2824 -#: src/libslic3r/PrintConfig.cpp:3041 src/libslic3r/PrintConfig.cpp:3144 -#: src/libslic3r/PrintConfig.cpp:3698 src/libslic3r/PrintConfig.cpp:3819 -msgid "°" -msgstr "°" - -#: src/libslic3r/PrintConfig.cpp:485 +#: src/libslic3r/PrintConfig.cpp:504 msgid "Bridges fan speed" msgstr "브릿지 팬 속도" -#: src/libslic3r/PrintConfig.cpp:486 +#: src/libslic3r/PrintConfig.cpp:505 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "이 팬 속도는 모든 브릿지 및 오버행 중에 적용됩니다." -#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:1114 -#: src/libslic3r/PrintConfig.cpp:1601 src/libslic3r/PrintConfig.cpp:1793 -#: src/libslic3r/PrintConfig.cpp:1856 src/libslic3r/PrintConfig.cpp:2115 -#: src/libslic3r/PrintConfig.cpp:2174 src/libslic3r/PrintConfig.cpp:3323 -#: src/libslic3r/PrintConfig.cpp:3612 src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:596 +#: src/libslic3r/PrintConfig.cpp:605 src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:623 src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1893 src/libslic3r/PrintConfig.cpp:2145 +#: src/libslic3r/PrintConfig.cpp:2204 src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3369 src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3870 msgid "%" msgstr "%" -#: src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:513 msgid "Bridge flow ratio" msgstr "브릿지 유량(flow)값" -#: src/libslic3r/PrintConfig.cpp:496 +#: src/libslic3r/PrintConfig.cpp:515 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -10772,101 +12568,146 @@ msgstr "" "당겨 처짐을 방지하기 위해 약간 줄일 수 있지만 기본 설정은 일반적으로 좋지만" "이 문제를 해결하기 전에 냉각 (팬 사용)을 시도해야합니다." -#: src/libslic3r/PrintConfig.cpp:506 +#: src/libslic3r/PrintConfig.cpp:525 msgid "Bridges" msgstr "브릿지(Bridges)" -#: src/libslic3r/PrintConfig.cpp:508 +#: src/libslic3r/PrintConfig.cpp:527 msgid "Speed for printing bridges." msgstr "브릿지 인쇄 속도." -#: src/libslic3r/PrintConfig.cpp:509 src/libslic3r/PrintConfig.cpp:920 -#: src/libslic3r/PrintConfig.cpp:928 src/libslic3r/PrintConfig.cpp:937 -#: src/libslic3r/PrintConfig.cpp:945 src/libslic3r/PrintConfig.cpp:972 -#: src/libslic3r/PrintConfig.cpp:991 src/libslic3r/PrintConfig.cpp:1329 -#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1620 -#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1730 -#: src/libslic3r/PrintConfig.cpp:1742 src/libslic3r/PrintConfig.cpp:1752 -#: src/libslic3r/PrintConfig.cpp:1815 src/libslic3r/PrintConfig.cpp:1874 -#: src/libslic3r/PrintConfig.cpp:2022 src/libslic3r/PrintConfig.cpp:2249 -#: src/libslic3r/PrintConfig.cpp:2258 src/libslic3r/PrintConfig.cpp:2789 -#: src/libslic3r/PrintConfig.cpp:2939 src/libslic3r/PrintConfig.cpp:2949 +#: src/libslic3r/PrintConfig.cpp:528 src/libslic3r/PrintConfig.cpp:1009 +#: src/libslic3r/PrintConfig.cpp:1017 src/libslic3r/PrintConfig.cpp:1026 +#: src/libslic3r/PrintConfig.cpp:1034 src/libslic3r/PrintConfig.cpp:1061 +#: src/libslic3r/PrintConfig.cpp:1080 src/libslic3r/PrintConfig.cpp:1386 +#: src/libslic3r/PrintConfig.cpp:1579 src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1733 src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1779 src/libslic3r/PrintConfig.cpp:1789 +#: src/libslic3r/PrintConfig.cpp:1852 src/libslic3r/PrintConfig.cpp:1911 +#: src/libslic3r/PrintConfig.cpp:2052 src/libslic3r/PrintConfig.cpp:2279 +#: src/libslic3r/PrintConfig.cpp:2288 src/libslic3r/PrintConfig.cpp:2810 +#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3037 msgid "mm/s" msgstr "mm³/s²" -#: src/libslic3r/PrintConfig.cpp:516 +#: src/libslic3r/PrintConfig.cpp:535 +msgid "Enable dynamic overhang speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:537 +msgid "This setting enables dynamic speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:541 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Speeds for overhang " +"sizes in between are calculated via linear interpolation. If set as " +"percentage, the speed is calculated over the external perimeter speed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:547 src/libslic3r/PrintConfig.cpp:594 +msgid "speed for 0% overlap (bridge)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:550 src/libslic3r/PrintConfig.cpp:559 +#: src/libslic3r/PrintConfig.cpp:568 src/libslic3r/PrintConfig.cpp:577 +#: src/libslic3r/PrintConfig.cpp:856 src/libslic3r/PrintConfig.cpp:1305 +#: src/libslic3r/PrintConfig.cpp:1316 src/libslic3r/PrintConfig.cpp:2387 +#: src/libslic3r/PrintConfig.cpp:2440 src/libslic3r/PrintConfig.cpp:2765 +#: src/libslic3r/PrintConfig.cpp:2997 +msgid "mm/s or %" +msgstr "mm/s 또는 %" + +#: src/libslic3r/PrintConfig.cpp:556 src/libslic3r/PrintConfig.cpp:603 +msgid "speed for 25% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:612 +msgid "speed for 50% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:574 src/libslic3r/PrintConfig.cpp:621 +msgid "speed for 75% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:583 +msgid "Enable dynamic fan speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:584 +msgid "This setting enables dynamic fan speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:589 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Fan speeds for " +"overhang sizes in between are calculated via linear interpolation. " +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:630 msgid "Brim width" msgstr "브림 폭" -#: src/libslic3r/PrintConfig.cpp:518 +#: src/libslic3r/PrintConfig.cpp:632 msgid "" "The horizontal width of the brim that will be printed around each object on " "the first layer. When raft is used, no brim is generated (use " "raft_first_layer_expansion)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:527 +#: src/libslic3r/PrintConfig.cpp:641 msgid "Brim type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:529 +#: src/libslic3r/PrintConfig.cpp:643 msgid "" "The places where the brim will be printed around each object on the first " "layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:535 +#: src/libslic3r/PrintConfig.cpp:645 msgid "No brim" msgstr "" -#: src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:646 msgid "Outer brim only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:537 +#: src/libslic3r/PrintConfig.cpp:647 msgid "Inner brim only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:538 +#: src/libslic3r/PrintConfig.cpp:648 msgid "Outer and inner brim" msgstr "" -#: src/libslic3r/PrintConfig.cpp:543 +#: src/libslic3r/PrintConfig.cpp:654 msgid "Brim separation gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:545 +#: src/libslic3r/PrintConfig.cpp:656 msgid "" "Offset of brim from the printed object. The offset is applied after the " "elephant foot compensation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:552 -msgid "Clip multi-part objects" -msgstr "멀티 파트 오브젝트 클립" - -#: src/libslic3r/PrintConfig.cpp:553 -msgid "" -"When printing multi-material objects, this settings will make Slic3r to clip " -"the overlapping object parts one by the other (2nd part will be clipped by " -"the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -msgstr "" -"다중 재료 객체를 인쇄할 때 이 설정은 Slic3r가 겹치는 오브젝트 부품을 하나씩 " -"클립으로 만듭니다(2부는 1, 3부는 1, 2부에 의해 잘립니다)." - -#: src/libslic3r/PrintConfig.cpp:560 +#: src/libslic3r/PrintConfig.cpp:663 msgid "Colorprint height" msgstr "컬러 프린트 높이" -#: src/libslic3r/PrintConfig.cpp:561 +#: src/libslic3r/PrintConfig.cpp:664 msgid "Heights at which a filament change is to occur." msgstr "필라멘트 체인지가 발생 하는 높이." -#: src/libslic3r/PrintConfig.cpp:571 +#: src/libslic3r/PrintConfig.cpp:674 msgid "Compatible printers condition" msgstr "호환 가능한 프린터 조건" -#: src/libslic3r/PrintConfig.cpp:572 +#: src/libslic3r/PrintConfig.cpp:675 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " @@ -10875,11 +12716,11 @@ msgstr "" "활성 프린터 프로파일의 구성 값을 사용하는 표현식. 이 표현식이 true로 평가되면" "이 프로필은 활성 프린터 프로필과 호환되는 것으로 간주됩니다." -#: src/libslic3r/PrintConfig.cpp:586 +#: src/libslic3r/PrintConfig.cpp:689 msgid "Compatible print profiles condition" msgstr "호환 되는 인쇄 프로파일 조건" -#: src/libslic3r/PrintConfig.cpp:587 +#: src/libslic3r/PrintConfig.cpp:690 msgid "" "A boolean expression using the configuration values of an active print " "profile. If this expression evaluates to true, this profile is considered " @@ -10888,11 +12729,11 @@ msgstr "" "활성 인쇄 프로 파일의 구성 값을 사용하는 부울식입니다. 이 식이 true로 평가 되" "면, 이 프로필이 활성 인쇄 프로필과 호환 되는 것으로 간주 됩니다." -#: src/libslic3r/PrintConfig.cpp:604 +#: src/libslic3r/PrintConfig.cpp:707 msgid "Complete individual objects" msgstr "개별 개체 완성" -#: src/libslic3r/PrintConfig.cpp:605 +#: src/libslic3r/PrintConfig.cpp:708 msgid "" "When printing multiple objects or copies, this feature will complete each " "object before moving onto next one (and starting it from its bottom layer). " @@ -10904,11 +12745,11 @@ msgstr "" "피할 때 유용합니다. Slic3r은 압출기 충돌을 경고하고 예방해야하지만 조심하십시" "오." -#: src/libslic3r/PrintConfig.cpp:613 +#: src/libslic3r/PrintConfig.cpp:716 msgid "Enable auto cooling" msgstr "자동 냉각 사용" -#: src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:717 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." @@ -10916,23 +12757,23 @@ msgstr "" "이 플래그는 레이어 인쇄 시간에 따라 인쇄 속도와 팬 속도를 조정하는 자동 냉각 " "논리를 활성화합니다." -#: src/libslic3r/PrintConfig.cpp:619 +#: src/libslic3r/PrintConfig.cpp:722 msgid "Cooling tube position" msgstr "냉각 튜브 위치" -#: src/libslic3r/PrintConfig.cpp:620 +#: src/libslic3r/PrintConfig.cpp:723 msgid "Distance of the center-point of the cooling tube from the extruder tip." msgstr "압출기 끝에서 냉각 튜브의 중심점의 거리." -#: src/libslic3r/PrintConfig.cpp:627 +#: src/libslic3r/PrintConfig.cpp:730 msgid "Cooling tube length" msgstr "냉각 튜브 길이" -#: src/libslic3r/PrintConfig.cpp:628 +#: src/libslic3r/PrintConfig.cpp:731 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "냉각 튜브의 길이는 냉각을위한 공간을 제한하는 내부 이동합니다." -#: src/libslic3r/PrintConfig.cpp:636 +#: src/libslic3r/PrintConfig.cpp:739 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " @@ -10941,11 +12782,11 @@ msgstr "" "역할 별 가속도 값이 사용 된 후에 프린터가 재설정되는 속도입니다 (둘레 / 충" "전). 가속을 전혀 재설정하지 않으려면 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:645 +#: src/libslic3r/PrintConfig.cpp:748 msgid "Default filament profile" msgstr "기본 필라멘트 프로파일" -#: src/libslic3r/PrintConfig.cpp:646 +#: src/libslic3r/PrintConfig.cpp:749 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " @@ -10954,12 +12795,12 @@ msgstr "" "현재 프린터 프로파일과 연관된 기본 필라멘트 프로파일. 현재 프린터 프로파일을 " "선택하면 이 필라멘트 프로파일이 활성화됩니다." -#: src/libslic3r/PrintConfig.cpp:652 +#: src/libslic3r/PrintConfig.cpp:755 msgid "Default print profile" msgstr "기본 인쇄 프로파일" -#: src/libslic3r/PrintConfig.cpp:653 src/libslic3r/PrintConfig.cpp:3542 -#: src/libslic3r/PrintConfig.cpp:3553 +#: src/libslic3r/PrintConfig.cpp:756 src/libslic3r/PrintConfig.cpp:3819 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -10968,11 +12809,11 @@ msgstr "" "현재 프린터 프로파일과 연관된 기본 인쇄 프로파일. 현재 프린터 프로파일을 선택" "하면이 인쇄 프로파일이 활성화됩니다." -#: src/libslic3r/PrintConfig.cpp:659 +#: src/libslic3r/PrintConfig.cpp:762 msgid "Disable fan for the first" msgstr "첫 번째 팬 사용 중지" -#: src/libslic3r/PrintConfig.cpp:660 +#: src/libslic3r/PrintConfig.cpp:763 msgid "" "You can set this to a positive value to disable fan at all during the first " "layers, so that it does not make adhesion worse." @@ -10980,26 +12821,26 @@ msgstr "" "이 값을 양수 값으로 설정하면 첫 번째 레이어에서 팬을 사용하지 않도록 설정하" "여 접착력을 악화시키지 않습니다." -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:772 msgid "Don't support bridges" msgstr "서포트와 브릿지를 사용하지 않음" -#: src/libslic3r/PrintConfig.cpp:671 +#: src/libslic3r/PrintConfig.cpp:774 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." msgstr "" "브릿지 영역 아래에 서포팅 재료가 생성되는 것을 방지하기위한 실험적 옵션." -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:780 msgid "Distance between copies" msgstr "복사본 간 거리" -#: src/libslic3r/PrintConfig.cpp:678 +#: src/libslic3r/PrintConfig.cpp:781 msgid "Distance used for the auto-arrange feature of the plater." msgstr "플래이터(plater)의 자동 정렬 기능에 사용되는 거리입니다." -#: src/libslic3r/PrintConfig.cpp:686 +#: src/libslic3r/PrintConfig.cpp:789 msgid "" "This end procedure is inserted at the end of the output file. Note that you " "can use placeholder variables for all PrusaSlicer settings." @@ -11007,7 +12848,7 @@ msgstr "" "이 최종 절차는 출력 파일의 끝에 삽입됩니다. 모든 PrusaSlicer 설정에 자리 표시" "자 변수를 사용할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:696 +#: src/libslic3r/PrintConfig.cpp:799 msgid "" "This end procedure is inserted at the end of the output file, before the " "printer end gcode (and before any toolchange from this filament in case of " @@ -11020,23 +12861,11 @@ msgstr "" "설정에 자리 표시자 변수를 사용할 수 있습니다. 압출기가 여러 개 있는 경우 " "gcode는 압출기 순서로 처리됩니다." -#: src/libslic3r/PrintConfig.cpp:707 -msgid "Ensure vertical shell thickness" -msgstr "수직 쉘(shell) 두께 확인" - -#: src/libslic3r/PrintConfig.cpp:709 -msgid "" -"Add solid infill near sloping surfaces to guarantee the vertical shell " -"thickness (top+bottom solid layers)." -msgstr "" -"경사 표면 근처에 솔리드 인필을 추가하여 수직 셸 두께(상단+하단 솔리드 레이어)" -"를 보장하십시오." - -#: src/libslic3r/PrintConfig.cpp:715 +#: src/libslic3r/PrintConfig.cpp:810 msgid "Top fill pattern" msgstr "상단 채우기 패턴" -#: src/libslic3r/PrintConfig.cpp:717 +#: src/libslic3r/PrintConfig.cpp:812 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." @@ -11044,45 +12873,45 @@ msgstr "" "상단 채우기패턴으로 채우기. 이는 인접한 솔리드 쉘이 아닌 맨 위 가시 레이어에" "만 영향을 줍니다." -#: src/libslic3r/PrintConfig.cpp:728 src/libslic3r/PrintConfig.cpp:1169 -#: src/libslic3r/PrintConfig.cpp:2754 src/libslic3r/PrintConfig.cpp:2771 +#: src/libslic3r/PrintConfig.cpp:815 src/libslic3r/PrintConfig.cpp:1228 +#: src/libslic3r/PrintConfig.cpp:2776 src/libslic3r/PrintConfig.cpp:2791 msgid "Rectilinear" msgstr "직선면(Rectilinear)" -#: src/libslic3r/PrintConfig.cpp:729 +#: src/libslic3r/PrintConfig.cpp:816 msgid "Monotonic" msgstr "단조" -#: src/libslic3r/PrintConfig.cpp:730 +#: src/libslic3r/PrintConfig.cpp:817 msgid "Monotonic Lines" msgstr "" -#: src/libslic3r/PrintConfig.cpp:731 src/libslic3r/PrintConfig.cpp:1170 +#: src/libslic3r/PrintConfig.cpp:818 src/libslic3r/PrintConfig.cpp:1229 msgid "Aligned Rectilinear" msgstr "정렬된 직선성" -#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:1176 -#: src/libslic3r/PrintConfig.cpp:2772 +#: src/libslic3r/PrintConfig.cpp:819 src/libslic3r/PrintConfig.cpp:1235 +#: src/libslic3r/PrintConfig.cpp:2792 msgid "Concentric" msgstr "동심원(Concentric)" -#: src/libslic3r/PrintConfig.cpp:733 src/libslic3r/PrintConfig.cpp:1180 +#: src/libslic3r/PrintConfig.cpp:820 src/libslic3r/PrintConfig.cpp:1239 msgid "Hilbert Curve" msgstr "힐버트 곡선(Hilbert Curve)" -#: src/libslic3r/PrintConfig.cpp:734 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:821 src/libslic3r/PrintConfig.cpp:1240 msgid "Archimedean Chords" msgstr "아르키메데우스(Archimedean Chords)" -#: src/libslic3r/PrintConfig.cpp:735 src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:822 src/libslic3r/PrintConfig.cpp:1241 msgid "Octagram Spiral" msgstr "옥타그램 나선(Octagram Spiral)" -#: src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:830 msgid "Bottom fill pattern" msgstr "하단 채우기 패턴" -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:832 msgid "" "Fill pattern for bottom infill. This only affects the bottom external " "visible layer, and not its adjacent solid shells." @@ -11090,12 +12919,12 @@ msgstr "" "하단 채우기 패턴에 대한 채우기 패턴입니다. 이는 인접한 솔리드 쉘이 아닌 하단 " "외부 가시 레이어에만 영향을 줍니다." -#: src/libslic3r/PrintConfig.cpp:753 src/libslic3r/PrintConfig.cpp:765 -#: src/libslic3r/PrintConfig.cpp:1988 +#: src/libslic3r/PrintConfig.cpp:839 src/libslic3r/PrintConfig.cpp:851 +#: src/libslic3r/PrintConfig.cpp:2018 msgid "External perimeters" msgstr "외측 둘레" -#: src/libslic3r/PrintConfig.cpp:755 +#: src/libslic3r/PrintConfig.cpp:841 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " "perimeters. If left zero, default extrusion width will be used if set, " @@ -11106,18 +12935,18 @@ msgstr "" "오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경이 사" "용된다. 백분율(예: 200%)로 표현되는 경우, 레이어 높이에 걸쳐 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:758 src/libslic3r/PrintConfig.cpp:869 -#: src/libslic3r/PrintConfig.cpp:1223 src/libslic3r/PrintConfig.cpp:1445 -#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1529 -#: src/libslic3r/PrintConfig.cpp:2011 src/libslic3r/PrintConfig.cpp:2397 -#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2660 -#: src/libslic3r/PrintConfig.cpp:2895 src/libslic3r/PrintConfig.cpp:3117 -#: src/libslic3r/PrintConfig.cpp:3132 src/libslic3r/PrintConfig.cpp:3166 -#: src/libslic3r/PrintConfig.cpp:3178 +#: src/libslic3r/PrintConfig.cpp:844 src/libslic3r/PrintConfig.cpp:958 +#: src/libslic3r/PrintConfig.cpp:1283 src/libslic3r/PrintConfig.cpp:1491 +#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1570 +#: src/libslic3r/PrintConfig.cpp:2041 src/libslic3r/PrintConfig.cpp:2428 +#: src/libslic3r/PrintConfig.cpp:2601 src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2983 src/libslic3r/PrintConfig.cpp:3204 +#: src/libslic3r/PrintConfig.cpp:3219 src/libslic3r/PrintConfig.cpp:3253 +#: src/libslic3r/PrintConfig.cpp:3265 msgid "mm or %" msgstr "mm 또는 %" -#: src/libslic3r/PrintConfig.cpp:767 +#: src/libslic3r/PrintConfig.cpp:853 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " @@ -11127,28 +12956,21 @@ msgstr "" "(예: 80%)로 표현되는 경우 위의 Perimeter 속도 설정에 따라 계산된다. 자동을 위" "해 0으로 설정한다." -#: src/libslic3r/PrintConfig.cpp:770 src/libslic3r/PrintConfig.cpp:1245 -#: src/libslic3r/PrintConfig.cpp:1256 src/libslic3r/PrintConfig.cpp:2356 -#: src/libslic3r/PrintConfig.cpp:2409 src/libslic3r/PrintConfig.cpp:2740 -#: src/libslic3r/PrintConfig.cpp:2909 -msgid "mm/s or %" -msgstr "mm/s 또는 %" - -#: src/libslic3r/PrintConfig.cpp:777 +#: src/libslic3r/PrintConfig.cpp:863 msgid "External perimeters first" msgstr "외부 경계선 먼저" -#: src/libslic3r/PrintConfig.cpp:779 +#: src/libslic3r/PrintConfig.cpp:865 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." msgstr "기본 역순 대신 가장 바깥쪽부터 가장 안쪽까지 윤곽선을 인쇄합니다." -#: src/libslic3r/PrintConfig.cpp:785 +#: src/libslic3r/PrintConfig.cpp:871 msgid "Extra perimeters if needed" msgstr "필요한 경우 추가 둘레" -#: src/libslic3r/PrintConfig.cpp:787 +#: src/libslic3r/PrintConfig.cpp:873 msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " "keeps adding perimeters, until more than 70% of the loop immediately above " @@ -11158,7 +12980,18 @@ msgstr "" "오. 위의 루프의 70% of 이상이 지지될 때까지 Slic3r는 계속해서 둘ㄹ를 추가한" "다." -#: src/libslic3r/PrintConfig.cpp:797 +#: src/libslic3r/PrintConfig.cpp:880 +msgid "Extra perimeters on overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:882 +msgid "" +"Detect overhang areas where bridges cannot be anchored, and fill them with " +"extra perimeter paths. These paths are anchored to the nearby non-overhang " +"area when possible." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:890 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " @@ -11167,7 +13000,7 @@ msgstr "" "사용할 익스트루더(더 구체적인 익스트루더 설정이 지정되지 않은 경우) 이 값은 " "파라미터 및 익스트루더를 초과하지만, 서포트 익스트루더는 초과 하지 않는다." -#: src/libslic3r/PrintConfig.cpp:809 +#: src/libslic3r/PrintConfig.cpp:898 msgid "" "Set this to the vertical distance between your nozzle tip and (usually) the " "X carriage rods. In other words, this is the height of the clearance " @@ -11178,7 +13011,7 @@ msgstr "" "다시 말하면, 이것은 당신의 익스트루더 주위의 틈새 실린더의 높이이며, 그것은 " "다른 인쇄된 물체와 충돌하기 전에 익스트루더의 최대 깊이를 나타냅니다." -#: src/libslic3r/PrintConfig.cpp:820 +#: src/libslic3r/PrintConfig.cpp:909 msgid "" "Set this to the clearance radius around your extruder. If the extruder is " "not centered, choose the largest value for safety. This setting is used to " @@ -11188,20 +13021,20 @@ msgstr "" "있지 않으면 안전을 위해 가장 큰 값을 선택하십시오. 이 설정은 충돌 여부를 확인" "하고 플래터에 그래픽 미리 보기를 표시하기 위해 사용된다." -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:919 msgid "Extruder Color" msgstr "익스트루더 컬러" -#: src/libslic3r/PrintConfig.cpp:831 src/libslic3r/PrintConfig.cpp:894 -#: src/libslic3r/PrintConfig.cpp:3394 +#: src/libslic3r/PrintConfig.cpp:920 src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:3666 msgid "This is only used in the Slic3r interface as a visual help." msgstr "이것은 시각적 도움말로 Slic3r 인터페이스에서만 사용된다." -#: src/libslic3r/PrintConfig.cpp:837 +#: src/libslic3r/PrintConfig.cpp:926 msgid "Extruder offset" msgstr "익스트루더 오프셋" -#: src/libslic3r/PrintConfig.cpp:838 +#: src/libslic3r/PrintConfig.cpp:927 msgid "" "If your firmware doesn't handle the extruder displacement you need the G-" "code to take it into account. This option lets you specify the displacement " @@ -11212,11 +13045,11 @@ msgstr "" "옵션을 사용하면 첫 번째 것에 대한 각 압출기의 변위를 지정할 수 있습니다. 양" "의 좌표가 필요합니다 (XY 좌표에서 뺍니다)." -#: src/libslic3r/PrintConfig.cpp:847 +#: src/libslic3r/PrintConfig.cpp:936 msgid "Extrusion axis" msgstr "압출 축" -#: src/libslic3r/PrintConfig.cpp:848 +#: src/libslic3r/PrintConfig.cpp:937 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." @@ -11224,11 +13057,11 @@ msgstr "" "이 옵션을 사용하여 프린터의 익스트루더에 연결된 축 문자를 설정합니다 (보통 E" "이지만 일부 프린터는 A를 사용합니다)." -#: src/libslic3r/PrintConfig.cpp:853 +#: src/libslic3r/PrintConfig.cpp:942 msgid "Extrusion multiplier" msgstr "압출 승수" -#: src/libslic3r/PrintConfig.cpp:854 +#: src/libslic3r/PrintConfig.cpp:943 msgid "" "This factor changes the amount of flow proportionally. You may need to tweak " "this setting to get nice surface finish and correct single wall widths. " @@ -11240,11 +13073,11 @@ msgstr "" "이입니다. 이 값을 더 변경해야한다고 판단되면 필라멘트 직경과 펌웨어 E 단계를 " "확인하십시오." -#: src/libslic3r/PrintConfig.cpp:863 +#: src/libslic3r/PrintConfig.cpp:952 msgid "Default extrusion width" msgstr "기본 압출 폭" -#: src/libslic3r/PrintConfig.cpp:865 +#: src/libslic3r/PrintConfig.cpp:954 msgid "" "Set this to a non-zero value to allow a manual extrusion width. If left to " "zero, Slic3r derives extrusion widths from the nozzle diameter (see the " @@ -11257,11 +13090,11 @@ msgstr "" "의 툴팁 참조). 백분율로 표시되는 경우 (예 : 230 %) 레이어 높이를 기준으로 계" "산됩니다." -#: src/libslic3r/PrintConfig.cpp:877 +#: src/libslic3r/PrintConfig.cpp:966 msgid "Keep fan always on" msgstr "항상 팬 켜기" -#: src/libslic3r/PrintConfig.cpp:878 +#: src/libslic3r/PrintConfig.cpp:967 msgid "" "If this is enabled, fan will never be disabled and will be kept running at " "least at its minimum speed. Useful for PLA, harmful for ABS." @@ -11269,11 +13102,11 @@ msgstr "" "이 기능을 사용하면 팬이 비활성화되지 않으며 최소한 최소 속도로 계속 회전합니" "다. PLA에 유용하며 ABS에 해롭다." -#: src/libslic3r/PrintConfig.cpp:883 +#: src/libslic3r/PrintConfig.cpp:972 msgid "Enable fan if layer print time is below" msgstr "레이어 인쇄 시간이 미만인 경우 팬 활성화" -#: src/libslic3r/PrintConfig.cpp:884 +#: src/libslic3r/PrintConfig.cpp:973 msgid "" "If layer print time is estimated below this number of seconds, fan will be " "enabled and its speed will be calculated by interpolating the minimum and " @@ -11282,27 +13115,27 @@ msgstr "" "레이어 인쇄 시간이, 초 미만으로 예상되는 경우 팬이 활성화되고 속도는 최소 및 " "최대 속도를 보간하여 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:886 src/libslic3r/PrintConfig.cpp:2344 +#: src/libslic3r/PrintConfig.cpp:975 src/libslic3r/PrintConfig.cpp:2375 msgid "approximate seconds" msgstr "근사치 초" -#: src/libslic3r/PrintConfig.cpp:893 src/libslic3r/PrintConfig.cpp:3393 +#: src/libslic3r/PrintConfig.cpp:982 src/libslic3r/PrintConfig.cpp:3665 msgid "Color" msgstr "색상" -#: src/libslic3r/PrintConfig.cpp:899 +#: src/libslic3r/PrintConfig.cpp:988 msgid "Filament notes" msgstr "필라멘트 메모" -#: src/libslic3r/PrintConfig.cpp:900 +#: src/libslic3r/PrintConfig.cpp:989 msgid "You can put your notes regarding the filament here." msgstr "여기에 필라멘트에 관한 메모를 넣을 수 있다." -#: src/libslic3r/PrintConfig.cpp:908 src/libslic3r/PrintConfig.cpp:1821 +#: src/libslic3r/PrintConfig.cpp:997 src/libslic3r/PrintConfig.cpp:1858 msgid "Max volumetric speed" msgstr "최대 체적 속도" -#: src/libslic3r/PrintConfig.cpp:909 +#: src/libslic3r/PrintConfig.cpp:998 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " @@ -11311,27 +13144,27 @@ msgstr "" "이 필라멘트에 허용되는 최대 체적 속도. 인쇄물의 최대 체적 속도를 인쇄 및 필라" "멘트 체적 속도 최소로 제한한다. 제한 없음에 대해 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:1007 msgid "Loading speed" msgstr "로딩 속도" -#: src/libslic3r/PrintConfig.cpp:919 +#: src/libslic3r/PrintConfig.cpp:1008 msgid "Speed used for loading the filament on the wipe tower." msgstr "와이퍼 타워(wipe)에 필라멘트를 장착하는 데 사용되는 속도. " -#: src/libslic3r/PrintConfig.cpp:926 +#: src/libslic3r/PrintConfig.cpp:1015 msgid "Loading speed at the start" msgstr "시작시 로딩 속도" -#: src/libslic3r/PrintConfig.cpp:927 +#: src/libslic3r/PrintConfig.cpp:1016 msgid "Speed used at the very beginning of loading phase." msgstr "로딩 단계의 시작 부분에 사용되는 속도입니다." -#: src/libslic3r/PrintConfig.cpp:934 +#: src/libslic3r/PrintConfig.cpp:1023 msgid "Unloading speed" msgstr "언로딩 스피드" -#: src/libslic3r/PrintConfig.cpp:935 +#: src/libslic3r/PrintConfig.cpp:1024 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." @@ -11339,20 +13172,20 @@ msgstr "" "와이퍼 타워에서 필라멘트를 언로드하는 데 사용되는 속도(램핑 후 바로 언로딩의 " "초기 부분에는 영향을 주지 않음)." -#: src/libslic3r/PrintConfig.cpp:943 +#: src/libslic3r/PrintConfig.cpp:1032 msgid "Unloading speed at the start" msgstr "시작 시 하역 속도" -#: src/libslic3r/PrintConfig.cpp:944 +#: src/libslic3r/PrintConfig.cpp:1033 msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "충돌 직후 필라멘트의 끝을 언로드하는 데 사용되는 속도입니다." -#: src/libslic3r/PrintConfig.cpp:951 +#: src/libslic3r/PrintConfig.cpp:1040 msgid "Delay after unloading" msgstr "언로드 후 딜레이" -#: src/libslic3r/PrintConfig.cpp:952 +#: src/libslic3r/PrintConfig.cpp:1041 msgid "" "Time to wait after the filament is unloaded. May help to get reliable " "toolchanges with flexible materials that may need more time to shrink to " @@ -11361,11 +13194,11 @@ msgstr "" "필라멘트를 내린 후 기다리는 시간. 원래 치수로 축소하는 데, 더 많은 시간이 필" "요할 수 있는 유연한 재료로 신뢰할 수있는 공구 교환을 얻을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:961 +#: src/libslic3r/PrintConfig.cpp:1050 msgid "Number of cooling moves" msgstr "쿨링 이동 숫자" -#: src/libslic3r/PrintConfig.cpp:962 +#: src/libslic3r/PrintConfig.cpp:1051 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " "Specify desired number of these moves." @@ -11373,19 +13206,19 @@ msgstr "" "필라멘트는 냉각 튜브에서 앞뒤로 이동하여 냉각됩니다. 이러한 이동의 원하는 수" "를 지정합니다." -#: src/libslic3r/PrintConfig.cpp:970 +#: src/libslic3r/PrintConfig.cpp:1059 msgid "Speed of the first cooling move" msgstr "첫 번째 냉각 이동 속도" -#: src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:1060 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "냉각 속도가 서서히 빨라지고 있습니다." -#: src/libslic3r/PrintConfig.cpp:978 +#: src/libslic3r/PrintConfig.cpp:1067 msgid "Minimal purge on wipe tower" msgstr "와이프(wipe) 탑의 최소 퍼지" -#: src/libslic3r/PrintConfig.cpp:979 +#: src/libslic3r/PrintConfig.cpp:1068 msgid "" "After a tool change, the exact position of the newly loaded filament inside " "the nozzle may not be known, and the filament pressure is likely not yet " @@ -11399,23 +13232,23 @@ msgstr "" "프 탑에 넣어 연속적인 채우기 또는 희생(sacrificial) 객체 돌출을 안정적으로 생" "성 합니다." -#: src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:1072 msgid "mm³" msgstr "mm" -#: src/libslic3r/PrintConfig.cpp:989 +#: src/libslic3r/PrintConfig.cpp:1078 msgid "Speed of the last cooling move" msgstr "마지막 냉각 이동 속도" -#: src/libslic3r/PrintConfig.cpp:990 +#: src/libslic3r/PrintConfig.cpp:1079 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "냉각 이동은 이 속도로 점차 가속화되고 있습니다." -#: src/libslic3r/PrintConfig.cpp:997 +#: src/libslic3r/PrintConfig.cpp:1086 msgid "Filament load time" msgstr "필라멘트 로드 시간" -#: src/libslic3r/PrintConfig.cpp:998 +#: src/libslic3r/PrintConfig.cpp:1087 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " "filament during a tool change (when executing the T code). This time is " @@ -11425,22 +13258,22 @@ msgstr "" "라멘트를 로드하는 시간입니다. 이 시간은 G 코드 시간 추정기에 의해 총 인쇄 시" "간에 추가 됩니다." -#: src/libslic3r/PrintConfig.cpp:1005 +#: src/libslic3r/PrintConfig.cpp:1094 msgid "Ramming parameters" msgstr "래밍 파라미터" -#: src/libslic3r/PrintConfig.cpp:1006 +#: src/libslic3r/PrintConfig.cpp:1095 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." msgstr "" "이 문자열은 RammingDialog에 의해 편집되고 래밍 특정 매개 변수를 포함합니다." -#: src/libslic3r/PrintConfig.cpp:1012 +#: src/libslic3r/PrintConfig.cpp:1101 msgid "Filament unload time" msgstr "필라멘트 언로드 시간" -#: src/libslic3r/PrintConfig.cpp:1013 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " "filament during a tool change (when executing the T code). This time is " @@ -11450,7 +13283,7 @@ msgstr "" "입니다 (T 코드를 실행할 때). 이 시간은 G 코드 시간추정기에 의해 총 인쇄 시간" "에 추가 됩니다." -#: src/libslic3r/PrintConfig.cpp:1021 +#: src/libslic3r/PrintConfig.cpp:1110 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " @@ -11459,12 +13292,12 @@ msgstr "" "여기에 필라멘트 직경을 입력하십시오. 정밀도가 필요하므로 캘리퍼를 사용하여 필" "라멘트를 따라 여러 번 측정 한 다음 평균을 계산하십시오." -#: src/libslic3r/PrintConfig.cpp:1028 src/libslic3r/PrintConfig.cpp:3432 -#: src/libslic3r/PrintConfig.cpp:3433 +#: src/libslic3r/PrintConfig.cpp:1117 src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3710 msgid "Density" msgstr "밀도" -#: src/libslic3r/PrintConfig.cpp:1029 +#: src/libslic3r/PrintConfig.cpp:1118 msgid "" "Enter your filament density here. This is only for statistical information. " "A decent way is to weigh a known length of filament and compute the ratio of " @@ -11475,41 +13308,41 @@ msgstr "" "은 알려진 길이의 필라멘트의 무게를 측정하고 길이와 볼륨의 비율을 계산하는 것" "입니다. 변위를 통해 직접적으로 부피를 계산하는 것이 더 좋습니다." -#: src/libslic3r/PrintConfig.cpp:1032 +#: src/libslic3r/PrintConfig.cpp:1121 msgid "g/cm³" msgstr "g/cm³" -#: src/libslic3r/PrintConfig.cpp:1037 +#: src/libslic3r/PrintConfig.cpp:1126 msgid "Filament type" msgstr "필라멘트 타입" -#: src/libslic3r/PrintConfig.cpp:1038 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "The filament material type for use in custom G-codes." msgstr "사용자 지정 G 코드에 사용할 필라멘트 재료 유형입니다." -#: src/libslic3r/PrintConfig.cpp:1066 +#: src/libslic3r/PrintConfig.cpp:1155 msgid "Soluble material" msgstr "수용성 재료" -#: src/libslic3r/PrintConfig.cpp:1067 +#: src/libslic3r/PrintConfig.cpp:1156 msgid "Soluble material is most likely used for a soluble support." msgstr "수용성 재료눈 물에 녹는 서포트에 가장 많이 사용된다." -#: src/libslic3r/PrintConfig.cpp:1073 +#: src/libslic3r/PrintConfig.cpp:1162 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." msgstr "필라멘트(kg당) 비용을 여기에 입력하십시오. 통계를 내기 위해서 입니다." -#: src/libslic3r/PrintConfig.cpp:1074 +#: src/libslic3r/PrintConfig.cpp:1163 msgid "money/kg" msgstr "원(\\)/kg" -#: src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1168 msgid "Spool weight" msgstr "스풀 중량" -#: src/libslic3r/PrintConfig.cpp:1080 +#: src/libslic3r/PrintConfig.cpp:1169 msgid "" "Enter weight of the empty filament spool. One may weigh a partially consumed " "filament spool before printing and one may compare the measured weight with " @@ -11521,19 +13354,19 @@ msgstr "" "에 충분한지 여부를 확인하기 위해 스풀과 필라멘트의 계산 된 무게와 측정 된 무" "게를 비교할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:1084 +#: src/libslic3r/PrintConfig.cpp:1173 msgid "g" msgstr "g" -#: src/libslic3r/PrintConfig.cpp:1093 src/libslic3r/PrintConfig.cpp:3537 +#: src/libslic3r/PrintConfig.cpp:1182 src/libslic3r/PrintConfig.cpp:3814 msgid "(Unknown)" msgstr "(알 수 없음)" -#: src/libslic3r/PrintConfig.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:1186 msgid "Fill angle" msgstr "채움 각도" -#: src/libslic3r/PrintConfig.cpp:1099 +#: src/libslic3r/PrintConfig.cpp:1188 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " @@ -11542,63 +13375,63 @@ msgstr "" "방향의 기본 각도입니다. 해칭이 적용될 것입니다. Slic3r이 감지 할 수있는 최상" "의 방향을 사용하여 브릿징이 채워지므로이 설정은 영향을 미치지 않습니다." -#: src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1199 msgid "Fill density" msgstr "채우기(fill) 밀도" -#: src/libslic3r/PrintConfig.cpp:1113 +#: src/libslic3r/PrintConfig.cpp:1201 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "0 % - 100 % 범위로 표현 된 내부 채움(infill)의 밀도." -#: src/libslic3r/PrintConfig.cpp:1148 +#: src/libslic3r/PrintConfig.cpp:1224 msgid "Fill pattern" msgstr "채우기(fill) 패턴" -#: src/libslic3r/PrintConfig.cpp:1150 +#: src/libslic3r/PrintConfig.cpp:1226 msgid "Fill pattern for general low-density infill." msgstr "일반 낮은 밀도 채움의 패턴." -#: src/libslic3r/PrintConfig.cpp:1171 src/libslic3r/PrintConfig.cpp:2803 +#: src/libslic3r/PrintConfig.cpp:1230 src/libslic3r/PrintConfig.cpp:2822 msgid "Grid" msgstr "그리드" -#: src/libslic3r/PrintConfig.cpp:1173 +#: src/libslic3r/PrintConfig.cpp:1232 msgid "Stars" msgstr "별점" -#: src/libslic3r/PrintConfig.cpp:1174 +#: src/libslic3r/PrintConfig.cpp:1233 msgid "Cubic" msgstr "큐빅" -#: src/libslic3r/PrintConfig.cpp:1175 +#: src/libslic3r/PrintConfig.cpp:1234 msgid "Line" msgstr "라인" -#: src/libslic3r/PrintConfig.cpp:1177 src/libslic3r/PrintConfig.cpp:2756 +#: src/libslic3r/PrintConfig.cpp:1236 src/libslic3r/PrintConfig.cpp:2778 msgid "Honeycomb" msgstr "벌집" -#: src/libslic3r/PrintConfig.cpp:1178 +#: src/libslic3r/PrintConfig.cpp:1237 msgid "3D Honeycomb" msgstr "3D 벌집" -#: src/libslic3r/PrintConfig.cpp:1179 +#: src/libslic3r/PrintConfig.cpp:1238 msgid "Gyroid" msgstr "자이로이드(Gyroid)" -#: src/libslic3r/PrintConfig.cpp:1183 +#: src/libslic3r/PrintConfig.cpp:1242 msgid "Adaptive Cubic" msgstr "적응형 입방" -#: src/libslic3r/PrintConfig.cpp:1184 +#: src/libslic3r/PrintConfig.cpp:1243 msgid "Support Cubic" msgstr "지원 입방" -#: src/libslic3r/PrintConfig.cpp:1185 +#: src/libslic3r/PrintConfig.cpp:1244 msgid "Lightning" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1190 +#: src/libslic3r/PrintConfig.cpp:1250 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." @@ -11606,22 +13439,22 @@ msgstr "" "이것은 프린터가 첫 번째 레이어에 사용할 가속도입니다. 0을 설정하면 첫 번째 레" "이어에 대한 가속 제어가 사용되지 않습니다." -#: src/libslic3r/PrintConfig.cpp:1198 +#: src/libslic3r/PrintConfig.cpp:1258 msgid "First object layer over raft interface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1199 +#: src/libslic3r/PrintConfig.cpp:1259 msgid "" "This is the acceleration your printer will use for first layer of object " "above raft interface. Set zero to disable acceleration control for first " "layer of object above raft interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "First layer bed temperature" msgstr "첫 번째 층 침대 온도" -#: src/libslic3r/PrintConfig.cpp:1209 +#: src/libslic3r/PrintConfig.cpp:1269 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." @@ -11629,7 +13462,7 @@ msgstr "" "첫 번째 레이어에 대한 빌드 플레이트 온도를 가열. 이 값을 0으로 설정하면 출력" "에서 ​​베드 온도 제어 명령을 비활성화합니다." -#: src/libslic3r/PrintConfig.cpp:1219 +#: src/libslic3r/PrintConfig.cpp:1279 msgid "" "Set this to a non-zero value to set a manual extrusion width for first " "layer. You can use this to force fatter extrudates for better adhesion. If " @@ -11641,18 +13474,18 @@ msgstr "" "수 있습니다. 백분율 (예 : 120 %)로 표현하면 첫 번째 레이어 높이를 기준으로 계" "산됩니다. 0으로 설정하면 기본 돌출 폭이 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1293 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " "plates." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1301 msgid "First layer speed" msgstr "첫 레이어 속도" -#: src/libslic3r/PrintConfig.cpp:1242 +#: src/libslic3r/PrintConfig.cpp:1302 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " @@ -11662,11 +13495,11 @@ msgstr "" "인쇄 이동에 적용된다. 백분율(예: 40%)로 표현되는 경우 기본 속도를 스케일링한" "다." -#: src/libslic3r/PrintConfig.cpp:1252 +#: src/libslic3r/PrintConfig.cpp:1312 msgid "Speed of object first layer over raft interface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1253 +#: src/libslic3r/PrintConfig.cpp:1313 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first object layer above raft interface, regardless " @@ -11674,11 +13507,11 @@ msgid "" "the default speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1263 +#: src/libslic3r/PrintConfig.cpp:1323 msgid "First layer nozzle temperature" msgstr "첫 번째 층 노즐 온도" -#: src/libslic3r/PrintConfig.cpp:1264 +#: src/libslic3r/PrintConfig.cpp:1324 msgid "" "Nozzle temperature for the first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " @@ -11687,11 +13520,11 @@ msgstr "" "첫 번째 레이어의 노즐 온도입니다. 인쇄 중에 수동으로 온도를 제어하려면 이를 0" "으로 설정하여 출력 G 코드에서 온도 제어 명령을 사용하지 않도록 설정합니다." -#: src/libslic3r/PrintConfig.cpp:1272 +#: src/libslic3r/PrintConfig.cpp:1332 msgid "Full fan speed at layer" msgstr "레이어의 전체 팬 속도" -#: src/libslic3r/PrintConfig.cpp:1273 +#: src/libslic3r/PrintConfig.cpp:1333 msgid "" "Fan speed will be ramped up linearly from zero at layer " "\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". " @@ -11705,50 +13538,54 @@ msgstr "" "이 경우 팬은 레이어 \"disable_fan_first_layers\" + 1에서 허용되는 최대 속도" "로 실행됩니다." -#: src/libslic3r/PrintConfig.cpp:1285 +#: src/libslic3r/PrintConfig.cpp:1345 msgid "Fuzzy skin type." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1348 msgid "Outside walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1293 +#: src/libslic3r/PrintConfig.cpp:1349 msgid "All walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1298 +#: src/libslic3r/PrintConfig.cpp:1355 msgid "Fuzzy skin thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1300 +#: src/libslic3r/PrintConfig.cpp:1357 msgid "" "The maximum distance that each skin point can be offset (both ways), " "measured perpendicular to the perimeter wall." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1308 +#: src/libslic3r/PrintConfig.cpp:1365 msgid "Fuzzy skin point distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1310 +#: src/libslic3r/PrintConfig.cpp:1367 msgid "" "Perimeters will be split into multiple segments by inserting Fuzzy skin " "points. Lowering the Fuzzy skin point distance will increase the number of " "randomly offset points on the perimeter wall." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1318 +#: src/libslic3r/PrintConfig.cpp:1375 msgid "Fill gaps" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1320 +#: src/libslic3r/PrintConfig.cpp:1377 msgid "" "Enables filling of gaps between perimeters and between the inner most " "perimeters and infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1327 +#: src/libslic3r/PrintConfig.cpp:1382 +msgid "Gap fill" +msgstr "공백 채움" + +#: src/libslic3r/PrintConfig.cpp:1384 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " @@ -11758,11 +13595,11 @@ msgstr "" "기 위해 이것을 합리적으로 낮게 유지한다. 간격 채우기를 사용하지 않으려면 0을 " "설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1335 +#: src/libslic3r/PrintConfig.cpp:1392 msgid "Verbose G-code" msgstr "세부 G-코드" -#: src/libslic3r/PrintConfig.cpp:1336 +#: src/libslic3r/PrintConfig.cpp:1393 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " @@ -11772,11 +13609,11 @@ msgstr "" "을 선택하십시오. 만일 당신이 SD카드로 인쇄한다면, 파일의 추가 무게로 인해 펌" "웨어의 속도가 느려질 수 있다." -#: src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1400 msgid "G-code flavor" msgstr "G-code 형식" -#: src/libslic3r/PrintConfig.cpp:1344 +#: src/libslic3r/PrintConfig.cpp:1401 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " @@ -11787,15 +13624,15 @@ msgstr "" "옵션을 프린터의 펌웨어로 설정하여 호환되는 출력을 얻을 수 있습니다. \"압출 없" "음\" 맛은 PrusaSlicer가 압출 값을 전혀 내보내지 못하게 합니다." -#: src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1416 msgid "No extrusion" msgstr "압출 없음" -#: src/libslic3r/PrintConfig.cpp:1376 +#: src/libslic3r/PrintConfig.cpp:1422 msgid "Label objects" msgstr "레이블 개체" -#: src/libslic3r/PrintConfig.cpp:1377 +#: src/libslic3r/PrintConfig.cpp:1423 msgid "" "Enable this to add comments into the G-Code labeling print moves with what " "object they belong to, which is useful for the Octoprint CancelObject " @@ -11806,19 +13643,19 @@ msgstr "" "록 설정하면 Octoprint CancelObject 플러그인에 유용합니다. 이 설정은 단일 압출" "기 멀티 재질 설정과 호환되지 않으며 개체로 닦아내기 / 채우기로 닦아냅니다." -#: src/libslic3r/PrintConfig.cpp:1384 +#: src/libslic3r/PrintConfig.cpp:1430 msgid "G-code substitutions" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1385 +#: src/libslic3r/PrintConfig.cpp:1431 msgid "Find / replace patterns in G-code lines and substitute them." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1390 +#: src/libslic3r/PrintConfig.cpp:1436 msgid "High extruder current on filament swap" msgstr "필라멘트 스왑에 높은 압출기 전류" -#: src/libslic3r/PrintConfig.cpp:1391 +#: src/libslic3r/PrintConfig.cpp:1437 msgid "" "It may be beneficial to increase the extruder motor current during the " "filament exchange sequence to allow for rapid ramming feed rates and to " @@ -11828,7 +13665,7 @@ msgstr "" "는 빠른 래밍 공급 속도를 가능 하게하고, 불규칙한 모양의 필라멘트를 로딩할때 " "저항을 극복하기 위한것이다." -#: src/libslic3r/PrintConfig.cpp:1399 +#: src/libslic3r/PrintConfig.cpp:1445 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." @@ -11836,23 +13673,33 @@ msgstr "" "이것은 당신 프린터의 채움 가속력입니다. 주입에 대한 가속 제어를 비활성화하려" "면 0을 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1408 +#: src/libslic3r/PrintConfig.cpp:1453 src/libslic3r/PrintConfig.cpp:2423 +#: src/libslic3r/PrintConfig.cpp:2435 +msgid "Solid infill" +msgstr "솔리드 인필" + +#: src/libslic3r/PrintConfig.cpp:1454 msgid "" "This is the acceleration your printer will use for solid infill. Set zero to " "use the value for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:2977 +#: src/libslic3r/PrintConfig.cpp:2990 +msgid "Top solid infill" +msgstr "가장 윗부분 채움" + +#: src/libslic3r/PrintConfig.cpp:1463 msgid "" "This is the acceleration your printer will use for top solid infill. Set " "zero to use the value for solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1426 +#: src/libslic3r/PrintConfig.cpp:1472 msgid "Combine infill every" msgstr "다음 레이어마다 결합" -#: src/libslic3r/PrintConfig.cpp:1428 +#: src/libslic3r/PrintConfig.cpp:1474 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." @@ -11860,15 +13707,15 @@ msgstr "" "이 기능은 인필을 결합하고 얇은 주변기기를 보존하면서 두꺼운 인필 층을 압출하" "여 인쇄 속도를 높일 수 있도록 하여 정확도를 높인다." -#: src/libslic3r/PrintConfig.cpp:1431 +#: src/libslic3r/PrintConfig.cpp:1477 msgid "Combine infill every n layers" msgstr "모든 n개 층을 채우기 위해 결합" -#: src/libslic3r/PrintConfig.cpp:1437 +#: src/libslic3r/PrintConfig.cpp:1483 msgid "Length of the infill anchor" msgstr "채우기 앵커의 길이" -#: src/libslic3r/PrintConfig.cpp:1439 +#: src/libslic3r/PrintConfig.cpp:1485 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -11888,35 +13735,35 @@ msgstr "" "제한되지만 더 이상 anchor_length_max. 이 매개 변수를 0으로 설정하여 단일 채우" "기 라인에 연결된 앵커링 경계를 비활성화합니다." -#: src/libslic3r/PrintConfig.cpp:1455 +#: src/libslic3r/PrintConfig.cpp:1495 msgid "0 (no open anchors)" msgstr "0(열린 앵커 없음)" -#: src/libslic3r/PrintConfig.cpp:1456 src/libslic3r/PrintConfig.cpp:1479 +#: src/libslic3r/PrintConfig.cpp:1496 src/libslic3r/PrintConfig.cpp:1519 msgid "1 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1457 src/libslic3r/PrintConfig.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:1520 msgid "2 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1458 src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1498 src/libslic3r/PrintConfig.cpp:1521 msgid "5 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1459 src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1499 src/libslic3r/PrintConfig.cpp:1522 msgid "10 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1460 src/libslic3r/PrintConfig.cpp:1483 +#: src/libslic3r/PrintConfig.cpp:1500 src/libslic3r/PrintConfig.cpp:1523 msgid "1000 (unlimited)" msgstr "1000(무제한)" -#: src/libslic3r/PrintConfig.cpp:1465 +#: src/libslic3r/PrintConfig.cpp:1506 msgid "Maximum length of the infill anchor" msgstr "채우기 앵커의 최대 길이" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1508 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -11935,19 +13782,19 @@ msgstr "" "개 변수보다 더 이상 이 매개 변수보다 더 이상 없습니다. 앵커링을 비활성화하려" "면 이 매개 변수를 0으로 설정합니다." -#: src/libslic3r/PrintConfig.cpp:1478 +#: src/libslic3r/PrintConfig.cpp:1518 msgid "0 (not anchored)" msgstr "0(고정되지 않음)" -#: src/libslic3r/PrintConfig.cpp:1488 +#: src/libslic3r/PrintConfig.cpp:1529 msgid "Infill extruder" msgstr "채움(Infill) 익스트루더" -#: src/libslic3r/PrintConfig.cpp:1490 +#: src/libslic3r/PrintConfig.cpp:1531 msgid "The extruder to use when printing infill." msgstr "채움으로 사용할 익스트루더." -#: src/libslic3r/PrintConfig.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:1539 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill. If " "left zero, default extrusion width will be used if set, otherwise 1.125 x " @@ -11961,21 +13808,21 @@ msgstr "" "을 사용하는 것이 좋습니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으" "로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1550 msgid "Infill before perimeters" msgstr "둘레보다 앞쪽에 채움" -#: src/libslic3r/PrintConfig.cpp:1510 +#: src/libslic3r/PrintConfig.cpp:1551 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." msgstr "이 옵션은 외부출력과 채움 인쇄 순서를 바꾸어, 후자를 먼저 만든다." -#: src/libslic3r/PrintConfig.cpp:1515 +#: src/libslic3r/PrintConfig.cpp:1556 msgid "Only infill where needed" msgstr "필요한 경우 채움" -#: src/libslic3r/PrintConfig.cpp:1517 +#: src/libslic3r/PrintConfig.cpp:1558 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " @@ -11985,11 +13832,11 @@ msgstr "" "을 할 것이다). 활성화된 경우 관련된 여러 번의 점검으로 인해 G-code 생성 속도" "를 늦춰라." -#: src/libslic3r/PrintConfig.cpp:1524 +#: src/libslic3r/PrintConfig.cpp:1565 msgid "Infill/perimeters overlap" msgstr "채움/둘레 겹침(perimeters overlap)" -#: src/libslic3r/PrintConfig.cpp:1526 +#: src/libslic3r/PrintConfig.cpp:1567 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -12000,23 +13847,23 @@ msgstr "" "론적으로 이것은 필요하지 않아야하지만 백래시가 갭을 유발할 수 있습니다. 백분" "율 (예 : 15 %)로 표시되는 경우 경계 압출 폭을 기준으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "내부 채우기 인쇄 속도. 자동으로 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1545 +#: src/libslic3r/PrintConfig.cpp:1586 msgid "Inherits profile" msgstr "프로필 이어가기" -#: src/libslic3r/PrintConfig.cpp:1546 +#: src/libslic3r/PrintConfig.cpp:1587 msgid "Name of the profile, from which this profile inherits." msgstr "이 프로파일이 복사되는 새 프로파일의 이름." -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1600 msgid "Interface shells" msgstr "인터페이스 셸(shells)" -#: src/libslic3r/PrintConfig.cpp:1560 +#: src/libslic3r/PrintConfig.cpp:1601 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " @@ -12025,62 +13872,62 @@ msgstr "" "인접 재료/볼륨 사이에 고체 쉘 생성을 강제하십시오. 반투명 재료 또는 수동 수용" "성 서포트 재료를 사용한 다중 압출기 인쇄에 유용함." -#: src/libslic3r/PrintConfig.cpp:1568 +#: src/libslic3r/PrintConfig.cpp:1609 msgid "Maximum width of a segmented region" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1569 +#: src/libslic3r/PrintConfig.cpp:1610 msgid "Maximum width of a segmented region. Zero disables this feature." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1570 src/libslic3r/PrintConfig.cpp:2189 -#: src/libslic3r/PrintConfig.cpp:2198 +#: src/libslic3r/PrintConfig.cpp:1611 src/libslic3r/PrintConfig.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2228 msgid "mm (zero to disable)" msgstr "mm (0은 비활성화)" -#: src/libslic3r/PrintConfig.cpp:1577 +#: src/libslic3r/PrintConfig.cpp:1618 msgid "Enable ironing" msgstr "다림질 활성화" -#: src/libslic3r/PrintConfig.cpp:1578 +#: src/libslic3r/PrintConfig.cpp:1619 msgid "" "Enable ironing of the top layers with the hot print head for smooth surface" msgstr "" "매끄러운 표면을 위해 핫 프린트 헤드로 상단 레이어의 다림질 을 가능하게합니다." -#: src/libslic3r/PrintConfig.cpp:1584 src/libslic3r/PrintConfig.cpp:1586 +#: src/libslic3r/PrintConfig.cpp:1625 src/libslic3r/PrintConfig.cpp:1627 msgid "Ironing Type" msgstr "다림질 타입" -#: src/libslic3r/PrintConfig.cpp:1591 +#: src/libslic3r/PrintConfig.cpp:1629 msgid "All top surfaces" msgstr "모든 상단 서피스" -#: src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Topmost surface only" msgstr "최상면만" -#: src/libslic3r/PrintConfig.cpp:1593 +#: src/libslic3r/PrintConfig.cpp:1631 msgid "All solid surfaces" msgstr "모든 솔리드 서피스" -#: src/libslic3r/PrintConfig.cpp:1598 +#: src/libslic3r/PrintConfig.cpp:1637 msgid "Flow rate" msgstr "유량" -#: src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Percent of a flow rate relative to object's normal layer height." msgstr "오브젝트의 일반 레이어 높이를 기준으로 유량의 백분율입니다." -#: src/libslic3r/PrintConfig.cpp:1608 +#: src/libslic3r/PrintConfig.cpp:1647 msgid "Spacing between ironing passes" msgstr "다림질 가공 패스 사이의 간격" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1649 msgid "Distance between ironing lines" msgstr "다림질선 사이의 거리" -#: src/libslic3r/PrintConfig.cpp:1627 +#: src/libslic3r/PrintConfig.cpp:1666 msgid "" "This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can " @@ -12092,11 +13939,11 @@ msgstr "" "[layer_num] 및 [layer_z]에 자리 표시자 변수를 사용할 수 있다는 점에 유의하십" "시오." -#: src/libslic3r/PrintConfig.cpp:1638 +#: src/libslic3r/PrintConfig.cpp:1677 msgid "Supports remaining times" msgstr "남은 시간 지원" -#: src/libslic3r/PrintConfig.cpp:1639 +#: src/libslic3r/PrintConfig.cpp:1678 msgid "" "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " "intervals into the G-code to let the firmware show accurate remaining time. " @@ -12108,155 +13955,155 @@ msgstr "" "웨어는 M73를 인식 하 고 있습니다. 또한 i3 MK3 펌웨어는 자동 모드에서 M73 Qxx " "Sxx를 지원 합니다." -#: src/libslic3r/PrintConfig.cpp:1647 +#: src/libslic3r/PrintConfig.cpp:1686 msgid "Supports stealth mode" msgstr "스텔스 모드 지원" -#: src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1687 msgid "The firmware supports stealth mode" msgstr "펌웨어는 스텔스 모드를 지원합니다." -#: src/libslic3r/PrintConfig.cpp:1653 +#: src/libslic3r/PrintConfig.cpp:1692 msgid "How to apply limits" msgstr "한도 적용 방법" -#: src/libslic3r/PrintConfig.cpp:1654 +#: src/libslic3r/PrintConfig.cpp:1693 msgid "Purpose of Machine Limits" msgstr "기계 제한의 목적" -#: src/libslic3r/PrintConfig.cpp:1656 +#: src/libslic3r/PrintConfig.cpp:1695 msgid "How to apply the Machine Limits" msgstr "기계 제한을 적용하는 방법" -#: src/libslic3r/PrintConfig.cpp:1661 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "Emit to G-code" msgstr "G 코드로 방출" -#: src/libslic3r/PrintConfig.cpp:1662 +#: src/libslic3r/PrintConfig.cpp:1698 msgid "Use for time estimate" msgstr "시간 추정에 사용" -#: src/libslic3r/PrintConfig.cpp:1663 +#: src/libslic3r/PrintConfig.cpp:1699 msgid "Ignore" msgstr "무시" -#: src/libslic3r/PrintConfig.cpp:1686 +#: src/libslic3r/PrintConfig.cpp:1723 msgid "Maximum feedrate X" msgstr "최대 공급율 X" -#: src/libslic3r/PrintConfig.cpp:1687 +#: src/libslic3r/PrintConfig.cpp:1724 msgid "Maximum feedrate Y" msgstr "최대 피드값 Y" -#: src/libslic3r/PrintConfig.cpp:1688 +#: src/libslic3r/PrintConfig.cpp:1725 msgid "Maximum feedrate Z" msgstr "최대 피드값 Z" -#: src/libslic3r/PrintConfig.cpp:1689 +#: src/libslic3r/PrintConfig.cpp:1726 msgid "Maximum feedrate E" msgstr "최대 피드값 E" -#: src/libslic3r/PrintConfig.cpp:1692 +#: src/libslic3r/PrintConfig.cpp:1729 msgid "Maximum feedrate of the X axis" msgstr "X 축의 최대 공급속도" -#: src/libslic3r/PrintConfig.cpp:1693 +#: src/libslic3r/PrintConfig.cpp:1730 msgid "Maximum feedrate of the Y axis" msgstr "Y축의 최대 공급속도" -#: src/libslic3r/PrintConfig.cpp:1694 +#: src/libslic3r/PrintConfig.cpp:1731 msgid "Maximum feedrate of the Z axis" msgstr "Z 축의 최대 공급량" -#: src/libslic3r/PrintConfig.cpp:1695 +#: src/libslic3r/PrintConfig.cpp:1732 msgid "Maximum feedrate of the E axis" msgstr "E 축의 최대 공급속도" -#: src/libslic3r/PrintConfig.cpp:1703 +#: src/libslic3r/PrintConfig.cpp:1740 msgid "Maximum acceleration X" msgstr "최대 가속 X" -#: src/libslic3r/PrintConfig.cpp:1704 +#: src/libslic3r/PrintConfig.cpp:1741 msgid "Maximum acceleration Y" msgstr "최대 가속 Y" -#: src/libslic3r/PrintConfig.cpp:1705 +#: src/libslic3r/PrintConfig.cpp:1742 msgid "Maximum acceleration Z" msgstr "최대 가속 Z" -#: src/libslic3r/PrintConfig.cpp:1706 +#: src/libslic3r/PrintConfig.cpp:1743 msgid "Maximum acceleration E" msgstr "최대 가속 E" -#: src/libslic3r/PrintConfig.cpp:1709 +#: src/libslic3r/PrintConfig.cpp:1746 msgid "Maximum acceleration of the X axis" msgstr "X 축의 최대 가속" -#: src/libslic3r/PrintConfig.cpp:1710 +#: src/libslic3r/PrintConfig.cpp:1747 msgid "Maximum acceleration of the Y axis" msgstr "Y축의 최대 가속" -#: src/libslic3r/PrintConfig.cpp:1711 +#: src/libslic3r/PrintConfig.cpp:1748 msgid "Maximum acceleration of the Z axis" msgstr "Z 축의 최대 가속" -#: src/libslic3r/PrintConfig.cpp:1712 +#: src/libslic3r/PrintConfig.cpp:1749 msgid "Maximum acceleration of the E axis" msgstr "E 축의 최대 가속" -#: src/libslic3r/PrintConfig.cpp:1720 +#: src/libslic3r/PrintConfig.cpp:1757 msgid "Maximum jerk X" msgstr "최대 저크(jerk) X" -#: src/libslic3r/PrintConfig.cpp:1721 +#: src/libslic3r/PrintConfig.cpp:1758 msgid "Maximum jerk Y" msgstr "최대 저크(jerk) Y" -#: src/libslic3r/PrintConfig.cpp:1722 +#: src/libslic3r/PrintConfig.cpp:1759 msgid "Maximum jerk Z" msgstr "최대 저크(jerk) Z" -#: src/libslic3r/PrintConfig.cpp:1723 +#: src/libslic3r/PrintConfig.cpp:1760 msgid "Maximum jerk E" msgstr "최대 저크(jerk) E" -#: src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:1763 msgid "Maximum jerk of the X axis" msgstr "X축 최대 저크(jerk)" -#: src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1764 msgid "Maximum jerk of the Y axis" msgstr "Y축 최대 저크는(jerk)" -#: src/libslic3r/PrintConfig.cpp:1728 +#: src/libslic3r/PrintConfig.cpp:1765 msgid "Maximum jerk of the Z axis" msgstr "Z축 최대 저크(jerk)" -#: src/libslic3r/PrintConfig.cpp:1729 +#: src/libslic3r/PrintConfig.cpp:1766 msgid "Maximum jerk of the E axis" msgstr "E축 최대 저크(jerk)" -#: src/libslic3r/PrintConfig.cpp:1739 +#: src/libslic3r/PrintConfig.cpp:1776 msgid "Minimum feedrate when extruding" msgstr "압출시 최소 공급 속도" -#: src/libslic3r/PrintConfig.cpp:1741 +#: src/libslic3r/PrintConfig.cpp:1778 msgid "Minimum feedrate when extruding (M205 S)" msgstr "압출 시 최소 공급(M205 S)" -#: src/libslic3r/PrintConfig.cpp:1749 +#: src/libslic3r/PrintConfig.cpp:1786 msgid "Minimum travel feedrate" msgstr "최소 이송 속도" -#: src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:1788 msgid "Minimum travel feedrate (M205 T)" msgstr "최소 여행 수유율(M205 T)" -#: src/libslic3r/PrintConfig.cpp:1759 +#: src/libslic3r/PrintConfig.cpp:1796 msgid "Maximum acceleration when extruding" msgstr "압출시 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1798 msgid "" "Maximum acceleration when extruding (M204 P)\n" "\n" @@ -12264,31 +14111,31 @@ msgid "" "(M204 T)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1772 +#: src/libslic3r/PrintConfig.cpp:1809 msgid "Maximum acceleration when retracting" msgstr "리트렉션 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1774 +#: src/libslic3r/PrintConfig.cpp:1811 msgid "Maximum acceleration when retracting (M204 R)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1782 +#: src/libslic3r/PrintConfig.cpp:1819 msgid "Maximum acceleration for travel moves" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1784 +#: src/libslic3r/PrintConfig.cpp:1821 msgid "Maximum acceleration for travel moves (M204 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1791 src/libslic3r/PrintConfig.cpp:1800 +#: src/libslic3r/PrintConfig.cpp:1828 src/libslic3r/PrintConfig.cpp:1837 msgid "Max" msgstr "최대" -#: src/libslic3r/PrintConfig.cpp:1792 +#: src/libslic3r/PrintConfig.cpp:1829 msgid "This setting represents the maximum speed of your fan." msgstr "이 설정은 팬의 최대 속도를 나타냅니다." -#: src/libslic3r/PrintConfig.cpp:1801 +#: src/libslic3r/PrintConfig.cpp:1838 msgid "" "This is the highest printable layer height for this extruder, used to cap " "the variable layer height and support layer height. Maximum recommended " @@ -12300,11 +14147,11 @@ msgstr "" "는 압출 폭의 75% of 입니다. 0으로 설정하면 층 높이가 노즐 지름의 75% of로 제" "한됩니다." -#: src/libslic3r/PrintConfig.cpp:1811 +#: src/libslic3r/PrintConfig.cpp:1848 msgid "Max print speed" msgstr "최대 프린트 속도" -#: src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1849 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " @@ -12314,18 +14161,18 @@ msgstr "" "의 속도를 자동 계산한다. 이 실험 설정은 허용할 최대 인쇄 속도를 설정하는 데 " "사용된다." -#: src/libslic3r/PrintConfig.cpp:1822 +#: src/libslic3r/PrintConfig.cpp:1859 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." msgstr "" "이 실험 설정은 압출기가 지원하는 최대 체적 속도를 설정하기 위해 사용된다." -#: src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1867 msgid "Max volumetric slope positive" msgstr "최대 체적 기울기 양" -#: src/libslic3r/PrintConfig.cpp:1831 +#: src/libslic3r/PrintConfig.cpp:1868 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from lower speed to higher speed. A value of 1.8 mm³/" @@ -12334,15 +14181,15 @@ msgid "" "(feedrate 60 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1836 src/libslic3r/PrintConfig.cpp:1848 +#: src/libslic3r/PrintConfig.cpp:1873 src/libslic3r/PrintConfig.cpp:1885 msgid "mm³/s²" msgstr "mm³/s²" -#: src/libslic3r/PrintConfig.cpp:1842 +#: src/libslic3r/PrintConfig.cpp:1879 msgid "Max volumetric slope negative" msgstr "최대 체적 기울기 음수" -#: src/libslic3r/PrintConfig.cpp:1843 +#: src/libslic3r/PrintConfig.cpp:1880 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from higher speed to lower speed. A value of 1.8 mm³/" @@ -12351,15 +14198,15 @@ msgid "" "(feedrate 20 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1854 src/libslic3r/PrintConfig.cpp:1863 +#: src/libslic3r/PrintConfig.cpp:1891 src/libslic3r/PrintConfig.cpp:1900 msgid "Min" msgstr "최소" -#: src/libslic3r/PrintConfig.cpp:1855 +#: src/libslic3r/PrintConfig.cpp:1892 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "이 설정은 최소 PWM팬이 활동하는데 필요한를 나타냅니다." -#: src/libslic3r/PrintConfig.cpp:1864 +#: src/libslic3r/PrintConfig.cpp:1901 msgid "" "This is the lowest printable layer height for this extruder and limits the " "resolution for variable layer height. Typical values are between 0.05 mm and " @@ -12368,19 +14215,19 @@ msgstr "" "이것은 이 압출기에 대한 가장 낮은 인쇄 가능한 층 높이이고 가변 층 높이에 대" "한 분해능을 제한한다. 대표적인 값은 0.05mm와 0.1mm이다." -#: src/libslic3r/PrintConfig.cpp:1872 +#: src/libslic3r/PrintConfig.cpp:1909 msgid "Min print speed" msgstr "최소 인쇄 속도" -#: src/libslic3r/PrintConfig.cpp:1873 +#: src/libslic3r/PrintConfig.cpp:1910 msgid "Slic3r will not scale speed down below this speed." msgstr "Slic3r는 이 속도 이하로 속도를 낮추지 않을 것이다." -#: src/libslic3r/PrintConfig.cpp:1880 +#: src/libslic3r/PrintConfig.cpp:1917 msgid "Minimal filament extrusion length" msgstr "최소 필라멘트 압출 길이" -#: src/libslic3r/PrintConfig.cpp:1881 +#: src/libslic3r/PrintConfig.cpp:1918 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " @@ -12389,11 +14236,11 @@ msgstr "" "하단 레이어에서 지정된 양의 필라멘트를 사용하는 데 필요한 스커트 루프의 수 이" "상으로 생성한다. 멀티 익스트루더의 경우, 이 최소값은 각 추가기기에 적용된다." -#: src/libslic3r/PrintConfig.cpp:1890 +#: src/libslic3r/PrintConfig.cpp:1927 msgid "Configuration notes" msgstr "구성 노트" -#: src/libslic3r/PrintConfig.cpp:1891 +#: src/libslic3r/PrintConfig.cpp:1928 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." @@ -12401,16 +14248,16 @@ msgstr "" "여기에 개인 노트를 넣을 수 있다. 이 텍스트는 G-code 헤더 코멘트에 추가될 것이" "다." -#: src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:1938 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "이 지름은 익스트루더 노즐의 직경이다(예: 0.5, 0.35 등)." -#: src/libslic3r/PrintConfig.cpp:1906 +#: src/libslic3r/PrintConfig.cpp:1943 msgid "Host Type" msgstr "호스트 유형" -#: src/libslic3r/PrintConfig.cpp:1907 +#: src/libslic3r/PrintConfig.cpp:1944 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." @@ -12418,11 +14265,11 @@ msgstr "" "Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드에는 호스" "트의 종류가 포함되어야 합니다." -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:1961 msgid "Only retract when crossing perimeters" msgstr "둘레를 횡단 할 때만 수축" -#: src/libslic3r/PrintConfig.cpp:1930 +#: src/libslic3r/PrintConfig.cpp:1962 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." @@ -12430,21 +14277,17 @@ msgstr "" "이동 경로가 상위 레이어의 경계를 초과하지 않는 경우 리트랙션을 비활성화합니" "다. 따라서 모든 오즈가 보이지 않습니다." -#: src/libslic3r/PrintConfig.cpp:1937 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "" "This option will drop the temperature of the inactive extruders to prevent " -"oozing. It will enable a tall skirt automatically and move extruders outside " -"such skirt when changing temperatures." +"oozing. " msgstr "" -"이 옵션은 누출을 방지하기 위해 비활성 압출기의 온도를 떨어 뜨립니다. 온도를 " -"변경할 때 키가 큰 스커트를 자동으로 사용하고 스커트 외부로 압출기를 이동합니" -"다." -#: src/libslic3r/PrintConfig.cpp:1944 +#: src/libslic3r/PrintConfig.cpp:1974 msgid "Output filename format" msgstr "출력 파일이름 형식" -#: src/libslic3r/PrintConfig.cpp:1945 +#: src/libslic3r/PrintConfig.cpp:1975 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -12456,11 +14299,11 @@ msgstr "" "[분], [초], [버전], [input_filename], [input_filename_base]을 사용할 수도 있" "습니다." -#: src/libslic3r/PrintConfig.cpp:1954 +#: src/libslic3r/PrintConfig.cpp:1984 msgid "Detect bridging perimeters" msgstr "브릿 징 경계선 감지" -#: src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:1986 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." @@ -12468,11 +14311,11 @@ msgstr "" "오버행에 대한 유량을 조정하는 실험 옵션 (브리지 흐름(flow)이 사용됨)에 브릿" "지 속도를 적용하고 팬을 활성화합니다." -#: src/libslic3r/PrintConfig.cpp:1962 +#: src/libslic3r/PrintConfig.cpp:1992 msgid "Filament parking position" msgstr "필라멘트 멈춤 위치" -#: src/libslic3r/PrintConfig.cpp:1963 +#: src/libslic3r/PrintConfig.cpp:1993 msgid "" "Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware." @@ -12480,11 +14323,11 @@ msgstr "" "언로드할 때 필라멘트가 주차되는 위치에서 압출기 팁의 거리입니다. 프린터 펌웨" "어의 값과 일치해야 합니다." -#: src/libslic3r/PrintConfig.cpp:1971 +#: src/libslic3r/PrintConfig.cpp:2001 msgid "Extra loading distance" msgstr "추가 로딩 거리" -#: src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:2002 msgid "" "When set to zero, the distance the filament is moved from parking position " "during load is exactly the same as it was moved back during unload. When " @@ -12495,12 +14338,12 @@ msgstr "" "이동 한 거리와 동일합니다. 양수이면 음수가 더 많이 로드되고 로드가 음수 인 경" "우 언로드보다 짧습니다." -#: src/libslic3r/PrintConfig.cpp:1980 src/libslic3r/PrintConfig.cpp:2005 -#: src/libslic3r/PrintConfig.cpp:2019 src/libslic3r/PrintConfig.cpp:2029 +#: src/libslic3r/PrintConfig.cpp:2010 src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2049 src/libslic3r/PrintConfig.cpp:2059 msgid "Perimeters" msgstr "둘레" -#: src/libslic3r/PrintConfig.cpp:1981 +#: src/libslic3r/PrintConfig.cpp:2011 msgid "" "This is the acceleration your printer will use for perimeters. Set zero to " "disable acceleration control for perimeters." @@ -12508,23 +14351,23 @@ msgstr "" "프린터가 둘레에 사용할 가속입니다. 둘레에 대한 가속 제어를 비활성화하도록 0" "을 설정합니다." -#: src/libslic3r/PrintConfig.cpp:1989 +#: src/libslic3r/PrintConfig.cpp:2019 msgid "" "This is the acceleration your printer will use for external perimeters. Set " "zero to use the value for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1996 +#: src/libslic3r/PrintConfig.cpp:2026 msgid "Perimeter extruder" msgstr "가장자리(Perimeter) 익스트루더" -#: src/libslic3r/PrintConfig.cpp:1998 +#: src/libslic3r/PrintConfig.cpp:2028 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" "둘레와 가장자리를 인쇄 할 때 사용할 압출기입니다. 첫 번째 압출기는 1입니다." -#: src/libslic3r/PrintConfig.cpp:2007 +#: src/libslic3r/PrintConfig.cpp:2037 msgid "" "Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. If " @@ -12538,12 +14381,12 @@ msgstr "" "직경이 사용됩니다. 백분율 (예 : 200 %)로 표현하면 레이어 높이를 기준으로 계산" "됩니다." -#: src/libslic3r/PrintConfig.cpp:2021 +#: src/libslic3r/PrintConfig.cpp:2051 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "둘레의 속도 (등고선, 일명 세로 셸). 자동으로 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:2031 +#: src/libslic3r/PrintConfig.cpp:2061 msgid "" "This option sets the number of perimeters to generate for each layer. Note " "that Slic3r may increase this number automatically when it detects sloping " @@ -12554,11 +14397,11 @@ msgstr "" "사용하면 더 큰 주변 수를 사용하는 경사면을 감지 할 때 Slic3r이이 수를 자동으" "로 증가시킬 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2065 msgid "(minimum)" msgstr "(최소)" -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "" "If you want to process the output G-code through custom scripts, just list " "their absolute paths here. Separate multiple scripts with a semicolon. " @@ -12571,35 +14414,35 @@ msgstr "" "파일의 절대 경로를 첫 번째 인수로 전달되며 환경 변수를 읽음으로써 Slic3r 구" "성 설정에 액세스 할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2055 +#: src/libslic3r/PrintConfig.cpp:2085 msgid "Printer type" msgstr "프린터 타입" -#: src/libslic3r/PrintConfig.cpp:2056 +#: src/libslic3r/PrintConfig.cpp:2086 msgid "Type of the printer." msgstr "프린터 유형." -#: src/libslic3r/PrintConfig.cpp:2061 +#: src/libslic3r/PrintConfig.cpp:2091 msgid "Printer notes" msgstr "프린터 노트" -#: src/libslic3r/PrintConfig.cpp:2062 +#: src/libslic3r/PrintConfig.cpp:2092 msgid "You can put your notes regarding the printer here." msgstr "프린터 관련 메모를 여기에 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2070 +#: src/libslic3r/PrintConfig.cpp:2100 msgid "Printer vendor" msgstr "제조 회사" -#: src/libslic3r/PrintConfig.cpp:2071 +#: src/libslic3r/PrintConfig.cpp:2101 msgid "Name of the printer vendor." msgstr "프린터 공급 업체의 이름입니다." -#: src/libslic3r/PrintConfig.cpp:2076 +#: src/libslic3r/PrintConfig.cpp:2106 msgid "Printer variant" msgstr "프린터 변형" -#: src/libslic3r/PrintConfig.cpp:2077 +#: src/libslic3r/PrintConfig.cpp:2107 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." @@ -12607,57 +14450,57 @@ msgstr "" "프린터 변종 이름입니다. 예를 들어, 프린터 변형은 노즐 지름으로 구별 될 수 있" "습니다." -#: src/libslic3r/PrintConfig.cpp:2094 +#: src/libslic3r/PrintConfig.cpp:2124 msgid "Raft contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2096 +#: src/libslic3r/PrintConfig.cpp:2126 msgid "" "The vertical distance between object and raft. Ignored for soluble interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2103 +#: src/libslic3r/PrintConfig.cpp:2133 msgid "Raft expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2105 +#: src/libslic3r/PrintConfig.cpp:2135 msgid "Expansion of the raft in XY plane for better stability." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:2142 msgid "First layer density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2114 +#: src/libslic3r/PrintConfig.cpp:2144 msgid "Density of the first raft or support layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2122 +#: src/libslic3r/PrintConfig.cpp:2152 msgid "First layer expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2124 +#: src/libslic3r/PrintConfig.cpp:2154 msgid "" "Expansion of the first raft or support layer to improve adhesion to print " "bed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2131 +#: src/libslic3r/PrintConfig.cpp:2161 msgid "Raft layers" msgstr "라프트(Raft) 레이어" -#: src/libslic3r/PrintConfig.cpp:2133 +#: src/libslic3r/PrintConfig.cpp:2163 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." msgstr "" "물체는 이 개수의 층에 의해 상승되며, 그 아래에서 서포트 재료가 생성될 것이다." -#: src/libslic3r/PrintConfig.cpp:2141 +#: src/libslic3r/PrintConfig.cpp:2171 msgid "Slice resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2142 +#: src/libslic3r/PrintConfig.cpp:2172 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -12669,11 +14512,11 @@ msgstr "" "있는 것보다 더 많은 디테일을 가지고 있다. 단순화를 사용하지 않고 입력에서 전" "체 해상도를 사용하려면 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:2182 msgid "G-code resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2153 +#: src/libslic3r/PrintConfig.cpp:2183 msgid "" "Maximum deviation of exported G-code paths from their full resolution " "counterparts. Very high resolution G-code requires huge amount of RAM to " @@ -12684,20 +14527,20 @@ msgid "" "produced." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2164 +#: src/libslic3r/PrintConfig.cpp:2194 msgid "Minimum travel after retraction" msgstr "리트랙션 후 최소 이동 거리" -#: src/libslic3r/PrintConfig.cpp:2165 +#: src/libslic3r/PrintConfig.cpp:2195 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "이동 거리가 이 길이보다 짧으면 리트렉션이 트리거되지 않습니다." -#: src/libslic3r/PrintConfig.cpp:2171 +#: src/libslic3r/PrintConfig.cpp:2201 msgid "Retract amount before wipe" msgstr "닦아 내기 전의 수축량" -#: src/libslic3r/PrintConfig.cpp:2172 +#: src/libslic3r/PrintConfig.cpp:2202 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." @@ -12705,23 +14548,23 @@ msgstr "" "보우 덴 압출기를 사용하면 와이퍼 동작을하기 전에 약간의 빠른 리트랙션 를하는 " "것이 좋습니다." -#: src/libslic3r/PrintConfig.cpp:2179 +#: src/libslic3r/PrintConfig.cpp:2209 msgid "Retract on layer change" msgstr "레이어 변경 후퇴" -#: src/libslic3r/PrintConfig.cpp:2180 +#: src/libslic3r/PrintConfig.cpp:2210 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "이 플래그는 Z 이동이 완료 될 때마다 취소를 강제 실행합니다." -#: src/libslic3r/PrintConfig.cpp:2185 src/libslic3r/PrintConfig.cpp:2193 +#: src/libslic3r/PrintConfig.cpp:2215 src/libslic3r/PrintConfig.cpp:2223 msgid "Length" msgstr "길이" -#: src/libslic3r/PrintConfig.cpp:2186 +#: src/libslic3r/PrintConfig.cpp:2216 msgid "Retraction Length" msgstr "리트랙션 길이" -#: src/libslic3r/PrintConfig.cpp:2187 +#: src/libslic3r/PrintConfig.cpp:2217 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " @@ -12730,11 +14573,11 @@ msgstr "" "리트렉션이 시작되면 필라멘트가 지정된 양만큼 뒤로 당겨집니다 (길이는 압출기" "에 들어가기 전에 원시 필라멘트에서 측정됩니다)." -#: src/libslic3r/PrintConfig.cpp:2194 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Retraction Length (Toolchange)" msgstr "리트랙션 길이 (툴 체인지)" -#: src/libslic3r/PrintConfig.cpp:2195 +#: src/libslic3r/PrintConfig.cpp:2225 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " @@ -12743,11 +14586,11 @@ msgstr "" "공구를 교체하기 전에 리트렉션이 시작하면 필라멘트가 지정된 양만큼 뒤로 당겨집" "니다 (길이는 압출기에 들어가기 전에 처음 필라멘트에서 측정됩니다)." -#: src/libslic3r/PrintConfig.cpp:2203 +#: src/libslic3r/PrintConfig.cpp:2233 msgid "Lift Z" msgstr "Z축 올림" -#: src/libslic3r/PrintConfig.cpp:2204 +#: src/libslic3r/PrintConfig.cpp:2234 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " @@ -12756,15 +14599,15 @@ msgstr "" "이 값을 양수 값으로 설정하면 리트렉션이 시작 될 때마다 Z가 빠르게 올라갑니" "다. 여러 개의 압출기를 사용하는 경우 첫 번째 압출기의 설정 만 고려됩니다." -#: src/libslic3r/PrintConfig.cpp:2211 +#: src/libslic3r/PrintConfig.cpp:2241 msgid "Above Z" msgstr "Z 위치" -#: src/libslic3r/PrintConfig.cpp:2212 +#: src/libslic3r/PrintConfig.cpp:2242 msgid "Only lift Z above" msgstr "오직 Z축 위로만" -#: src/libslic3r/PrintConfig.cpp:2213 +#: src/libslic3r/PrintConfig.cpp:2243 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " @@ -12773,15 +14616,15 @@ msgstr "" "이것을 양수의 값으로 설정하면, 지정된 Z값 위로만 발생한다. 첫 번째 층에서 리" "프트를 건너뛸 수 있도록 이 설정을 조정할 수 있다." -#: src/libslic3r/PrintConfig.cpp:2220 +#: src/libslic3r/PrintConfig.cpp:2250 msgid "Below Z" msgstr "Z 아래" -#: src/libslic3r/PrintConfig.cpp:2221 +#: src/libslic3r/PrintConfig.cpp:2251 msgid "Only lift Z below" msgstr "Z값 아래만" -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2252 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " @@ -12790,11 +14633,11 @@ msgstr "" "이것을 양수 값으로 설정하면, 지정된 Z값 아래에서만 발생합니다. 첫 번째 레이어" "로 리프트를 제한하기 위해이 설정을 조정할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2238 +#: src/libslic3r/PrintConfig.cpp:2260 src/libslic3r/PrintConfig.cpp:2268 msgid "Extra length on restart" msgstr "재시작시 여분의 길이" -#: src/libslic3r/PrintConfig.cpp:2231 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." @@ -12802,7 +14645,7 @@ msgstr "" "이동 후 리트렉셔이 보정되면 익스트루더가 추가 양의 필라멘트를 밀어냅니다. 이 " "설정은 거의 필요하지 않습니다." -#: src/libslic3r/PrintConfig.cpp:2239 +#: src/libslic3r/PrintConfig.cpp:2269 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." @@ -12810,19 +14653,19 @@ msgstr "" "도구를 교환 한 후 리트렉션를 보정하면 익스트루더가 추가 양의 필라멘트를 밀게" "됩니다." -#: src/libslic3r/PrintConfig.cpp:2246 src/libslic3r/PrintConfig.cpp:2247 +#: src/libslic3r/PrintConfig.cpp:2276 src/libslic3r/PrintConfig.cpp:2277 msgid "Retraction Speed" msgstr "리트랙션 속도" -#: src/libslic3r/PrintConfig.cpp:2248 +#: src/libslic3r/PrintConfig.cpp:2278 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "리트랙션 속도 (익스트루더 모터에만 적용됨)." -#: src/libslic3r/PrintConfig.cpp:2254 src/libslic3r/PrintConfig.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:2284 src/libslic3r/PrintConfig.cpp:2285 msgid "Deretraction Speed" msgstr "감속 속도" -#: src/libslic3r/PrintConfig.cpp:2256 +#: src/libslic3r/PrintConfig.cpp:2286 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " @@ -12831,68 +14674,82 @@ msgstr "" "리트랙션 후 압출기에 필라멘트를 로드하는 속도 (압출기 모터에만 적용됨). 0으" "로 방치하면 리트랙션 속도가 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2293 msgid "Seam position" msgstr "재봉선 위치" -#: src/libslic3r/PrintConfig.cpp:2265 +#: src/libslic3r/PrintConfig.cpp:2295 msgid "Position of perimeters starting points." msgstr "둘레의 시작점의 위치." -#: src/libslic3r/PrintConfig.cpp:2272 +#: src/libslic3r/PrintConfig.cpp:2297 +msgid "Random" +msgstr "무작위" + +#: src/libslic3r/PrintConfig.cpp:2298 msgid "Nearest" msgstr "가장 가까운" -#: src/libslic3r/PrintConfig.cpp:2273 +#: src/libslic3r/PrintConfig.cpp:2299 msgid "Aligned" msgstr "정렬" -#: src/libslic3r/PrintConfig.cpp:2281 +#: src/libslic3r/PrintConfig.cpp:2306 +msgid "Staggered inner seams" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2307 +msgid "" +"This option causes the inner seams to be shifted backwards based on their " +"depth, forming a zigzag pattern." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2314 msgid "Direction" msgstr "방향" -#: src/libslic3r/PrintConfig.cpp:2283 +#: src/libslic3r/PrintConfig.cpp:2316 msgid "Preferred direction of the seam" msgstr "선호하는 재봉선(seam)의 방향" -#: src/libslic3r/PrintConfig.cpp:2284 +#: src/libslic3r/PrintConfig.cpp:2317 msgid "Seam preferred direction" msgstr "재봉선(Seam) 선호 방향" -#: src/libslic3r/PrintConfig.cpp:2291 +#: src/libslic3r/PrintConfig.cpp:2324 msgid "Jitter" msgstr "지터(Jitter)" -#: src/libslic3r/PrintConfig.cpp:2293 +#: src/libslic3r/PrintConfig.cpp:2326 msgid "Seam preferred direction jitter" msgstr "재봉선 선호 방향 지터(Jitter)" -#: src/libslic3r/PrintConfig.cpp:2294 +#: src/libslic3r/PrintConfig.cpp:2327 msgid "Preferred direction of the seam - jitter" msgstr "재봉선 지터의 선호 방향" -#: src/libslic3r/PrintConfig.cpp:2301 +#: src/libslic3r/PrintConfig.cpp:2334 msgid "Distance from brim/object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2335 msgid "" "Distance between skirt and brim (when draft shield is not used) or objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2308 +#: src/libslic3r/PrintConfig.cpp:2341 msgid "Skirt height" msgstr "스커트(Skirt) 높이" -#: src/libslic3r/PrintConfig.cpp:2309 +#: src/libslic3r/PrintConfig.cpp:2342 msgid "Height of skirt expressed in layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2348 msgid "Draft shield" msgstr "드래프트 쉴드" -#: src/libslic3r/PrintConfig.cpp:2316 +#: src/libslic3r/PrintConfig.cpp:2349 msgid "" "With draft shield active, the skirt will be printed skirt_distance from the " "object, possibly intersecting brim.\n" @@ -12902,27 +14759,27 @@ msgid "" "from print bed due to wind draft." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2324 +#: src/libslic3r/PrintConfig.cpp:2354 msgid "Disabled" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2325 +#: src/libslic3r/PrintConfig.cpp:2355 msgid "Limited" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2326 +#: src/libslic3r/PrintConfig.cpp:2356 msgid "Enabled" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2331 +#: src/libslic3r/PrintConfig.cpp:2362 msgid "Loops (minimum)" msgstr "루프(Loops) (최소)" -#: src/libslic3r/PrintConfig.cpp:2332 +#: src/libslic3r/PrintConfig.cpp:2363 msgid "Skirt Loops" msgstr "스커트 루프선 수량" -#: src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2364 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " @@ -12932,11 +14789,11 @@ msgstr "" "프 수보다 클 수 있다. 스커트를 완전히 비활성화하려면 이 값을 0으로 설정하십시" "오." -#: src/libslic3r/PrintConfig.cpp:2341 +#: src/libslic3r/PrintConfig.cpp:2372 msgid "Slow down if layer print time is below" msgstr "레이어 인쇄 시간이 다음과 같은 경우 속도를 낮추십시오" -#: src/libslic3r/PrintConfig.cpp:2342 +#: src/libslic3r/PrintConfig.cpp:2373 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." @@ -12944,11 +14801,11 @@ msgstr "" "층 인쇄 시간이 이 시간보다 낮게 추정될 경우, 인쇄 이동 속도는 이 값으로 지속" "되도록 축소된다." -#: src/libslic3r/PrintConfig.cpp:2351 +#: src/libslic3r/PrintConfig.cpp:2382 msgid "Small perimeters" msgstr "작은 둘레" -#: src/libslic3r/PrintConfig.cpp:2353 +#: src/libslic3r/PrintConfig.cpp:2384 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " @@ -12958,33 +14815,33 @@ msgstr "" "분율로 표시되는 경우 (예 : 80 %) 위의 속도 설정에서 계산됩니다. 자동으로 0으" "로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:2363 +#: src/libslic3r/PrintConfig.cpp:2394 msgid "Solid infill threshold area" msgstr "솔리드 채우기 임계값" -#: src/libslic3r/PrintConfig.cpp:2365 +#: src/libslic3r/PrintConfig.cpp:2396 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." msgstr "한계값보다 작은 영역에 대해 솔리드 인필을 강제 적용." -#: src/libslic3r/PrintConfig.cpp:2366 +#: src/libslic3r/PrintConfig.cpp:2397 msgid "mm²" msgstr "mm" -#: src/libslic3r/PrintConfig.cpp:2372 +#: src/libslic3r/PrintConfig.cpp:2403 msgid "Solid infill extruder" msgstr "솔리드 인필 익스트루더" -#: src/libslic3r/PrintConfig.cpp:2374 +#: src/libslic3r/PrintConfig.cpp:2405 msgid "The extruder to use when printing solid infill." msgstr "꽉찬 면을 인쇄할 때 사용하는 익스트루더." -#: src/libslic3r/PrintConfig.cpp:2380 +#: src/libslic3r/PrintConfig.cpp:2411 msgid "Solid infill every" msgstr "솔리드 인필 간격" -#: src/libslic3r/PrintConfig.cpp:2382 +#: src/libslic3r/PrintConfig.cpp:2413 msgid "" "This feature allows to force a solid layer every given number of layers. " "Zero to disable. You can set this to any value (for example 9999); Slic3r " @@ -12995,7 +14852,7 @@ msgstr "" "음. 당신은 이것을 어떤 값으로도 설정할 수 있다(예: 9999). Slic3r는 노즐 직경" "과 층 높이에 따라 결합할 최대 가능한 층 수를 자동으로 선택한다." -#: src/libslic3r/PrintConfig.cpp:2394 +#: src/libslic3r/PrintConfig.cpp:2425 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "solid surfaces. If left zero, default extrusion width will be used if set, " @@ -13006,7 +14863,7 @@ msgstr "" "하십시오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경" "이 사용된다. 백분율(예: 90%)로 표현되는 경우, 계층 높이에 걸쳐 계산된다." -#: src/libslic3r/PrintConfig.cpp:2406 +#: src/libslic3r/PrintConfig.cpp:2437 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " @@ -13015,19 +14872,19 @@ msgstr "" "솔리드 영역(상단/하부/내부 수평 셸) 인쇄 속도 이는 위의 기본 주입 속도에 대" "한 백분율(예: 80%)로 표시할 수 있다. 자동을 위해 0으로 설정한다." -#: src/libslic3r/PrintConfig.cpp:2418 +#: src/libslic3r/PrintConfig.cpp:2449 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "상단 및 하단 표면에 생성할 솔리드 레이어 수입니다." -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2455 src/libslic3r/PrintConfig.cpp:2456 msgid "Minimum thickness of a top / bottom shell" msgstr "상단/하단 쉘의 최소 두께" -#: src/libslic3r/PrintConfig.cpp:2431 +#: src/libslic3r/PrintConfig.cpp:2462 msgid "Spiral vase" msgstr "화병 모드(Spiral vase)" -#: src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2463 msgid "" "This feature will raise Z gradually while printing a single-walled object in " "order to remove any visible seam. This option requires a single perimeter, " @@ -13041,20 +14898,17 @@ msgstr "" "만 아니라 하단 솔리드 레이어의 수를 설정할 수 있습니다. 하나 이상의 개체를 인" "쇄할 때는 작동하지 않습니다." -#: src/libslic3r/PrintConfig.cpp:2440 +#: src/libslic3r/PrintConfig.cpp:2471 msgid "Temperature variation" msgstr "온도 변화" -#: src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:2472 msgid "" -"Temperature difference to be applied when an extruder is not active. Enables " -"a full-height \"sacrificial\" skirt on which the nozzles are periodically " -"wiped." +"Temperature difference to be applied when an extruder is not active. The " +"value is not used when 'idle_temperature' in filament settings is defined." msgstr "" -"돌출부가 활성화되지 않은 경우 적용되는 온도 차이. 노즐을 주기적으로 닦는 전" -"체 높이 \"인공\" 스커트가 가능하다." -#: src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2483 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -13071,7 +14925,7 @@ msgstr "" "든 PrusaSlicer 설정에 자리 표시자 변수를 사용할 수 있으므로 원하는 모든 곳에 " "\"M109 S[first_layer_temperature]\" 명령을 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2466 +#: src/libslic3r/PrintConfig.cpp:2498 msgid "" "This start procedure is inserted at the beginning, after any printer start " "gcode (and after any toolchange to this filament in case of multi-material " @@ -13092,35 +14946,35 @@ msgstr "" "든 곳에 \"M109 S[first_layer_temperature]\" 명령을 넣을 수 있습니다. 압출기" "가 여러 개 있는 경우 gcode는 압출기 순서로 처리됩니다." -#: src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2514 msgid "Color change G-code" msgstr "색상 변경 G 코드" -#: src/libslic3r/PrintConfig.cpp:2483 +#: src/libslic3r/PrintConfig.cpp:2515 msgid "This G-code will be used as a code for the color change" msgstr "이 G 코드는 색상 변경에 대한 코드로 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:2492 +#: src/libslic3r/PrintConfig.cpp:2524 msgid "This G-code will be used as a code for the pause print" msgstr "이 G 코드는 일시 중지 인쇄에 대한 코드로 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:2501 +#: src/libslic3r/PrintConfig.cpp:2533 msgid "This G-code will be used as a custom code" msgstr "이 G 코드는 사용자 지정 코드로 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:2509 +#: src/libslic3r/PrintConfig.cpp:2541 msgid "Single Extruder Multi Material" msgstr "싱글 익스트루더 멀티메터리얼" -#: src/libslic3r/PrintConfig.cpp:2510 +#: src/libslic3r/PrintConfig.cpp:2542 msgid "The printer multiplexes filaments into a single hot end." msgstr "프린터는 필라멘트를 하나의 핫 엔드에 멀티플렉싱합니다." -#: src/libslic3r/PrintConfig.cpp:2515 +#: src/libslic3r/PrintConfig.cpp:2547 msgid "Prime all printing extruders" msgstr "모든 인쇄 압출기 프라임" -#: src/libslic3r/PrintConfig.cpp:2516 +#: src/libslic3r/PrintConfig.cpp:2548 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." @@ -13128,11 +14982,11 @@ msgstr "" "활성화 된 경우, 모든 인쇄 압출기는 인쇄 시작시 프린트 베드의 전면 가장자리에 " "프라이밍 됩니다." -#: src/libslic3r/PrintConfig.cpp:2521 +#: src/libslic3r/PrintConfig.cpp:2553 msgid "No sparse layers (EXPERIMENTAL)" msgstr "숨겨진 레이어층 없음(실험적)" -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2554 msgid "" "If enabled, the wipe tower will not be printed on layers with no " "toolchanges. On layers with a toolchange, extruder will travel downward to " @@ -13143,11 +14997,11 @@ msgstr "" "변경이 있는 레이어에서 압출기는 아래쪽으로 이동하여 닦은 타워를 인쇄합니다. " "사용자는 인쇄와 충돌하지 않도록 합니다." -#: src/libslic3r/PrintConfig.cpp:2529 +#: src/libslic3r/PrintConfig.cpp:2561 msgid "Slice gap closing radius" msgstr "슬라이스 갭 닫기 반지름" -#: src/libslic3r/PrintConfig.cpp:2531 +#: src/libslic3r/PrintConfig.cpp:2563 msgid "" "Cracks smaller than 2x gap closing radius are being filled during the " "triangle mesh slicing. The gap closing operation may reduce the final print " @@ -13157,41 +15011,41 @@ msgstr "" "틈 닫기 작업은 최종 인쇄 해상도를 줄일 수 있으므로 값을 합리적으로 낮게 유지 " "하는 것이 좋습니다." -#: src/libslic3r/PrintConfig.cpp:2539 +#: src/libslic3r/PrintConfig.cpp:2571 msgid "Slicing Mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2541 +#: src/libslic3r/PrintConfig.cpp:2573 msgid "" "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " "close all holes in the model." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2575 msgid "Regular" msgstr "일반" -#: src/libslic3r/PrintConfig.cpp:2547 +#: src/libslic3r/PrintConfig.cpp:2576 msgid "Even-odd" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2548 +#: src/libslic3r/PrintConfig.cpp:2577 msgid "Close holes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2553 +#: src/libslic3r/PrintConfig.cpp:2583 msgid "Generate support material" msgstr "서포트 재료 생성" -#: src/libslic3r/PrintConfig.cpp:2555 +#: src/libslic3r/PrintConfig.cpp:2585 msgid "Enable support material generation." msgstr "서포트 재료를 사용합니다." -#: src/libslic3r/PrintConfig.cpp:2559 +#: src/libslic3r/PrintConfig.cpp:2589 msgid "Auto generated supports" msgstr "자동 생성 지원" -#: src/libslic3r/PrintConfig.cpp:2561 +#: src/libslic3r/PrintConfig.cpp:2591 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " @@ -13201,11 +15055,11 @@ msgstr "" "인란을 선택 하지 않으면 \"서포트 지원 영역\" 볼륨 내 에서만 지원이 생성 됩니" "다." -#: src/libslic3r/PrintConfig.cpp:2567 +#: src/libslic3r/PrintConfig.cpp:2597 msgid "XY separation between an object and its support" msgstr "물체와 그 서포트 사이 XY 분리" -#: src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2599 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." @@ -13213,17 +15067,17 @@ msgstr "" "객체와 그 서포트 사이의 XY 분리. 백분율 (예 : 50 %)로 표시되는 경우 외부 둘" "레 너비를 기준으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:2580 +#: src/libslic3r/PrintConfig.cpp:2610 msgid "Pattern angle" msgstr "패턴 각도" -#: src/libslic3r/PrintConfig.cpp:2582 +#: src/libslic3r/PrintConfig.cpp:2612 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." msgstr "이 설정을 사용하여지지 평면 패턴을 수평면으로 회전시킵니다." -#: src/libslic3r/PrintConfig.cpp:2592 src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:2622 src/libslic3r/PrintConfig.cpp:3411 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -13231,11 +15085,11 @@ msgstr "" "그것이 빌드 플레이트에있는 경우에만 지원을 작성하십시오. 인쇄물에 대한 지원" "을 작성하지 마십시오." -#: src/libslic3r/PrintConfig.cpp:2598 +#: src/libslic3r/PrintConfig.cpp:2627 msgid "Top contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2600 +#: src/libslic3r/PrintConfig.cpp:2629 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " @@ -13244,40 +15098,38 @@ msgstr "" "물체와 서포트 사이의 수직 거리. 이 값을 0으로 설정하면 Slic3r이 첫 번째 객체 " "레이어에 브리지 흐름과 속도를 사용하지 못하게됩니다." -#: src/libslic3r/PrintConfig.cpp:2608 +#: src/libslic3r/PrintConfig.cpp:2635 msgid "0 (soluble)" msgstr "0 (수용성)" -#: src/libslic3r/PrintConfig.cpp:2609 +#: src/libslic3r/PrintConfig.cpp:2636 msgid "0.1 (detachable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2610 +#: src/libslic3r/PrintConfig.cpp:2637 msgid "0.2 (detachable)" msgstr "0.2(분리 가능)" -#: src/libslic3r/PrintConfig.cpp:2616 +#: src/libslic3r/PrintConfig.cpp:2643 msgid "Bottom contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2618 +#: src/libslic3r/PrintConfig.cpp:2645 msgid "" "The vertical distance between the object top surface and the support " "material interface. If set to zero, support_material_contact_distance will " "be used for both top and bottom contact Z distances." msgstr "" -#. TRN To be shown in Print Settings "Bottom contact Z distance". Have to be as short as possible -#. TRN To be shown in Print Settings "Bottom interface layers". Have to be as short as possible -#: src/libslic3r/PrintConfig.cpp:2626 src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2651 src/libslic3r/PrintConfig.cpp:2732 msgid "Same as top" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2633 +#: src/libslic3r/PrintConfig.cpp:2659 msgid "Enforce support for the first" msgstr "첫 번째 서포트 더 강화" -#: src/libslic3r/PrintConfig.cpp:2635 +#: src/libslic3r/PrintConfig.cpp:2661 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -13288,15 +15140,15 @@ msgstr "" "어 지정된 레이어 수에 대한지지 자료를 생성합니다. 이것은 빌드 플레이트에 매" "우 얇거나 부족한 풋 프린트를 가진 물체를 더 많이 부착 할 때 유용합니다." -#: src/libslic3r/PrintConfig.cpp:2640 +#: src/libslic3r/PrintConfig.cpp:2666 msgid "Enforce support for the first n layers" msgstr "첫 번째 n 개의 레이어에 대한 서포트 강화" -#: src/libslic3r/PrintConfig.cpp:2646 +#: src/libslic3r/PrintConfig.cpp:2672 msgid "Support material/raft/skirt extruder" msgstr "서포트 재료 / 라프트 / 스커트 익스트루더" -#: src/libslic3r/PrintConfig.cpp:2648 +#: src/libslic3r/PrintConfig.cpp:2674 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." @@ -13304,7 +15156,7 @@ msgstr "" "서포트 재료, 라프트 및 스커트를 인쇄 할 때 사용하는 압출기 (도구 변경을 최소" "화하기 위해 현재 압출기를 사용하려면 1+, 0)." -#: src/libslic3r/PrintConfig.cpp:2657 +#: src/libslic3r/PrintConfig.cpp:2683 msgid "" "Set this to a non-zero value to set a manual extrusion width for support " "material. If left zero, default extrusion width will be used if set, " @@ -13315,20 +15167,20 @@ msgstr "" "0으로 설정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 노즐 지름이 " "사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:2667 +#: src/libslic3r/PrintConfig.cpp:2693 msgid "Interface loops" msgstr "인터페이스 루프" -#: src/libslic3r/PrintConfig.cpp:2669 +#: src/libslic3r/PrintConfig.cpp:2695 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "지지대의 상단 접촉 층을 루프로 덮으십시오. 기본적으로 사용 안 함." -#: src/libslic3r/PrintConfig.cpp:2674 +#: src/libslic3r/PrintConfig.cpp:2700 msgid "Support material/raft interface extruder" msgstr "서포트 재료/라프트 인터페이스 익스트루더" -#: src/libslic3r/PrintConfig.cpp:2676 +#: src/libslic3r/PrintConfig.cpp:2702 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." @@ -13337,62 +15189,66 @@ msgstr "" "기 위해 현재 익스트루더를 사용하려면 1+, 0). 이것은 라프트에도 영향을 미칩니" "다." -#: src/libslic3r/PrintConfig.cpp:2684 +#: src/libslic3r/PrintConfig.cpp:2709 msgid "Top interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2711 msgid "" "Number of interface layers to insert between the object(s) and support " "material." msgstr "객체와 서포트 재료 사이에 삽입할 인터페이스 레이어 수입니다." -#: src/libslic3r/PrintConfig.cpp:2693 +#: src/libslic3r/PrintConfig.cpp:2715 src/libslic3r/PrintConfig.cpp:2733 msgid "0 (off)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2716 src/libslic3r/PrintConfig.cpp:2734 msgid "1 (light)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2695 +#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2735 msgid "2 (default)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2696 +#: src/libslic3r/PrintConfig.cpp:2718 src/libslic3r/PrintConfig.cpp:2736 msgid "3 (heavy)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:2724 msgid "Bottom interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2704 +#: src/libslic3r/PrintConfig.cpp:2726 msgid "" "Number of interface layers to insert between the object(s) and support " "material. Set to -1 to use support_material_interface_layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2717 +#: src/libslic3r/PrintConfig.cpp:2742 msgid "Closing radius" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2719 +#: src/libslic3r/PrintConfig.cpp:2744 msgid "" "For snug supports, the support regions will be merged using morphological " "closing operation. Gaps smaller than the closing radius will be filled in." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2727 +#: src/libslic3r/PrintConfig.cpp:2752 msgid "Interface pattern spacing" msgstr "인터페이스 패턴 간격" -#: src/libslic3r/PrintConfig.cpp:2729 +#: src/libslic3r/PrintConfig.cpp:2754 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" "인터페이스 라인 간 간격. 솔리드 인터페이스를 가져오려면 0을 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:2738 +#: src/libslic3r/PrintConfig.cpp:2761 +msgid "Support material interface" +msgstr "서포트 인터페이스" + +#: src/libslic3r/PrintConfig.cpp:2763 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " @@ -13401,73 +15257,72 @@ msgstr "" "서포트 재료 인터페이스 레이어 인쇄 속도 백분율(예: 50%)로 표현될 경우 서포트 " "재료 속도에 따라 계산된다." -#: src/libslic3r/PrintConfig.cpp:2747 +#: src/libslic3r/PrintConfig.cpp:2772 msgid "Pattern" msgstr "패턴" -#: src/libslic3r/PrintConfig.cpp:2749 +#: src/libslic3r/PrintConfig.cpp:2774 msgid "Pattern used to generate support material." msgstr "서포트 재료를 생성하는 데 사용되는 패턴." -#: src/libslic3r/PrintConfig.cpp:2755 +#: src/libslic3r/PrintConfig.cpp:2777 msgid "Rectilinear grid" msgstr "직선 그리드" -#: src/libslic3r/PrintConfig.cpp:2761 +#: src/libslic3r/PrintConfig.cpp:2784 msgid "Interface pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2763 +#: src/libslic3r/PrintConfig.cpp:2786 msgid "" "Pattern used to generate support material interface. Default pattern for non-" "soluble support interface is Rectilinear, while default pattern for soluble " "support interface is Concentric." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2777 +#: src/libslic3r/PrintConfig.cpp:2798 msgid "Pattern spacing" msgstr "패턴 간격" -#: src/libslic3r/PrintConfig.cpp:2779 +#: src/libslic3r/PrintConfig.cpp:2800 msgid "Spacing between support material lines." msgstr "서포트 재료와 라인 사이의 간격." -#: src/libslic3r/PrintConfig.cpp:2788 +#: src/libslic3r/PrintConfig.cpp:2809 msgid "Speed for printing support material." msgstr "서포트 재료를 인쇄하는 속도." -#: src/libslic3r/PrintConfig.cpp:2795 -msgid "Style" -msgstr "모양새" - -#: src/libslic3r/PrintConfig.cpp:2797 +#: src/libslic3r/PrintConfig.cpp:2818 msgid "" "Style and shape of the support towers. Projecting the supports into a " "regular grid will create more stable supports, while snug support towers " "will save material and reduce object scarring." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2804 +#: src/libslic3r/PrintConfig.cpp:2823 msgid "Snug" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2809 +#: src/libslic3r/PrintConfig.cpp:2824 +msgid "Organic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2830 msgid "Synchronize with object layers" msgstr "객체 레이어와 동기화" -#: src/libslic3r/PrintConfig.cpp:2811 +#: src/libslic3r/PrintConfig.cpp:2832 msgid "" "Synchronize support layers with the object print layers. This is useful with " -"multi-material printers, where the extruder switch is expensive." +"multi-material printers, where the extruder switch is expensive. This option " +"is only available when top contact Z distance is set to zero." msgstr "" -"서포트 레이어를 프린트 레이어와 동기화하십시오. 이것은 스위치가 비싼 멀티 메" -"터리얼 프린터에서 유용하다." -#: src/libslic3r/PrintConfig.cpp:2817 +#: src/libslic3r/PrintConfig.cpp:2839 msgid "Overhang threshold" msgstr "오버행 한계점" -#: src/libslic3r/PrintConfig.cpp:2819 +#: src/libslic3r/PrintConfig.cpp:2841 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -13479,11 +15334,11 @@ msgstr "" "성되지 않는다. 즉, 이 값은 서포트 재료 없이 인쇄할 수 있는 가장 수평 경사(수" "평면에서 측정됨)를 나타낸다. 자동 감지를 위해 0으로 설정하십시오(권장)." -#: src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2853 msgid "With sheath around the support" msgstr "서포트 주변이나 외부로" -#: src/libslic3r/PrintConfig.cpp:2833 +#: src/libslic3r/PrintConfig.cpp:2855 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." @@ -13491,7 +15346,72 @@ msgstr "" "기본 서포트 주위에 외장 (단일 주변 선)을 추가하십시오. 이것은 페이스 업을보" "다 신뢰성있게 만들뿐만 아니라 제거하기도 어렵습니다." -#: src/libslic3r/PrintConfig.cpp:2840 +#: src/libslic3r/PrintConfig.cpp:2861 +msgid "Maximum Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2863 +msgid "" +"The maximum angle of the branches, when the branches have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle to be able to have more reach." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2872 +msgid "Preferred Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2874 +msgid "" +"The preferred angle of the branches, when they do not have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle for branches to merge faster." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2883 +msgid "Tip Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2885 +msgid "The diameter of the top of the tip of the branches of organic support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2892 +msgid "Branch Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2894 +msgid "" +"The diameter of the thinnest branches of organic support. Thicker branches " +"are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2902 +msgid "Branch Diameter Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2904 +msgid "" +"The angle of the branches' diameter as they gradually become thicker towards " +"the bottom. An angle of 0 will cause the branches to have uniform thickness " +"over their length. A bit of an angle can increase stability of the organic " +"support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2914 +msgid "Branch Density" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2916 +msgid "" +"Adjusts the density of the support structure used to generate the tips of " +"the branches. A higher value results in better overhangs but the supports " +"are harder to remove, thus it is recommended to enable top support " +"interfaces instead of a high branch density value if dense interfaces are " +"needed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2928 msgid "" "Nozzle temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output G-code." @@ -13499,36 +15419,36 @@ msgstr "" "첫 번째 후 레이어에 대한 노즐 온도. 출력 G 코드에서 온도 제어 명령을 사용하" "지 않도록 설정합니다." -#: src/libslic3r/PrintConfig.cpp:2843 +#: src/libslic3r/PrintConfig.cpp:2931 msgid "Nozzle temperature" msgstr "노즐 온도" -#: src/libslic3r/PrintConfig.cpp:2849 +#: src/libslic3r/PrintConfig.cpp:2937 msgid "Thick bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2851 +#: src/libslic3r/PrintConfig.cpp:2939 msgid "" "If enabled, bridges are more reliable, can bridge longer distances, but may " "look worse. If disabled, bridges look better but are reliable just for " "shorter bridged distances." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2857 +#: src/libslic3r/PrintConfig.cpp:2945 msgid "Detect thin walls" msgstr "얇은 벽(walls) 감지" -#: src/libslic3r/PrintConfig.cpp:2859 +#: src/libslic3r/PrintConfig.cpp:2947 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." msgstr "싱글 너비 벽 (두 부분이 맞지 않는 부분과 무너지는 부분)을 감지합니다." -#: src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2953 msgid "Threads" msgstr "게시글" -#: src/libslic3r/PrintConfig.cpp:2866 +#: src/libslic3r/PrintConfig.cpp:2954 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." @@ -13536,7 +15456,7 @@ msgstr "" "스레드는 장기 실행 태스크를 병렬 처리하는 데 사용됩니다. 최적의 스레드 수는 " "사용 가능한 코어 / 프로세서 수보다 약간 높습니다." -#: src/libslic3r/PrintConfig.cpp:2878 +#: src/libslic3r/PrintConfig.cpp:2966 msgid "" "This custom code is inserted before every toolchange. Placeholder variables " "for all PrusaSlicer settings as well as {toolchange_z}, {previous_extruder} " @@ -13546,7 +15466,7 @@ msgid "" "behaviour both before and after the toolchange." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2891 +#: src/libslic3r/PrintConfig.cpp:2979 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "top surfaces. You may want to use thinner extrudates to fill all narrow " @@ -13560,7 +15480,7 @@ msgstr "" "으면 노즐 지름이 사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준" "으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:2904 +#: src/libslic3r/PrintConfig.cpp:2992 msgid "" "Speed for printing top solid layers (it only applies to the uppermost " "external layers and not to their internal solid layers). You may want to " @@ -13573,15 +15493,15 @@ msgstr "" "전 속도에 대한 백분율 (예 : 80 %)로 나타낼 수 있습니다. 자동으로 0으로 설정하" "십시오." -#: src/libslic3r/PrintConfig.cpp:2919 +#: src/libslic3r/PrintConfig.cpp:3007 msgid "Number of solid layers to generate on top surfaces." msgstr "상단 표면에 생성 할 솔리드 레이어 수입니다." -#: src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3008 msgid "Top solid layers" msgstr "탑 솔리드 레이어" -#: src/libslic3r/PrintConfig.cpp:2928 +#: src/libslic3r/PrintConfig.cpp:3016 msgid "" "The number of top solid layers is increased above top_solid_layers if " "necessary to satisfy minimum thickness of top shell. This is useful to " @@ -13591,30 +15511,30 @@ msgstr "" "top_solid_layers 이상 증가합니다. 이는 가변 층 높이로 인쇄할 때 베개 효과를 " "방지하는 데 유용합니다." -#: src/libslic3r/PrintConfig.cpp:2931 +#: src/libslic3r/PrintConfig.cpp:3019 msgid "Minimum top shell thickness" msgstr "최소 상단 쉘 두께" -#: src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:3026 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "이동 속도 (먼 돌출 점 사이의 점프)." -#: src/libslic3r/PrintConfig.cpp:2946 +#: src/libslic3r/PrintConfig.cpp:3034 msgid "Z travel" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2947 +#: src/libslic3r/PrintConfig.cpp:3035 msgid "" "Speed for movements along the Z axis.\n" "When set to zero, the value is ignored and regular travel speed is used " "instead." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2955 +#: src/libslic3r/PrintConfig.cpp:3043 msgid "Use firmware retraction" msgstr "펌웨어 철회" -#: src/libslic3r/PrintConfig.cpp:2956 +#: src/libslic3r/PrintConfig.cpp:3044 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." @@ -13622,11 +15542,11 @@ msgstr "" "이 실험 설정은 G10 및 G11 명령을 사용하여 펌웨어에서 취소를 처리하도록합니" "다. 이것은 최근의 말린에서만 지원됩니다." -#: src/libslic3r/PrintConfig.cpp:2962 +#: src/libslic3r/PrintConfig.cpp:3050 msgid "Use relative E distances" msgstr "상대적인 E 거리 사용" -#: src/libslic3r/PrintConfig.cpp:2963 +#: src/libslic3r/PrintConfig.cpp:3051 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." @@ -13634,11 +15554,11 @@ msgstr "" "펌웨어에 상대 E 값이 필요한 경우이 값을 선택하고, 그렇지 않으면 선택하지 마십" "시오. 대부분의 회사는 절대 값을 사용합니다." -#: src/libslic3r/PrintConfig.cpp:2969 +#: src/libslic3r/PrintConfig.cpp:3057 msgid "Use volumetric E" msgstr "용적(volumetric) E 사용" -#: src/libslic3r/PrintConfig.cpp:2970 +#: src/libslic3r/PrintConfig.cpp:3058 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -13653,11 +15573,11 @@ msgstr "" "[filament_diameter_0] T0'과 같은 명령을 입력 할 수 있습니다 Slic3r. 이것은 최" "근의 말린에서만 지원됩니다." -#: src/libslic3r/PrintConfig.cpp:2980 +#: src/libslic3r/PrintConfig.cpp:3068 msgid "Enable variable layer height feature" msgstr "가변 레이어 높이 기능 사용" -#: src/libslic3r/PrintConfig.cpp:2981 +#: src/libslic3r/PrintConfig.cpp:3069 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." @@ -13665,11 +15585,11 @@ msgstr "" "일부 프린터 또는 프린터 설정은 가변 레이어 높이로 인쇄하는 데 어려움이있을 " "수 있습니다. 기본적으로 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:2987 +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Wipe while retracting" msgstr "수축시 닦아내십시오" -#: src/libslic3r/PrintConfig.cpp:2988 +#: src/libslic3r/PrintConfig.cpp:3076 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." @@ -13677,7 +15597,7 @@ msgstr "" "이 플래그는 누출된 리트랙싱의 블럽 가능성을 최소화하기 위해 수축하는 동안 노" "즐을 이동시킨다." -#: src/libslic3r/PrintConfig.cpp:2995 +#: src/libslic3r/PrintConfig.cpp:3083 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." @@ -13685,11 +15605,11 @@ msgstr "" "멀티 메터리알 프린터는 공구 교환 시 익스트루더를 프라이밍하거나 제거해야 할 " "수 있다. 과도한 물질을 와이퍼 타워에 돌출시킨다." -#: src/libslic3r/PrintConfig.cpp:3001 +#: src/libslic3r/PrintConfig.cpp:3089 msgid "Purging volumes - load/unload volumes" msgstr "볼륨 삭제 - 볼륨 로드/언로드" -#: src/libslic3r/PrintConfig.cpp:3002 +#: src/libslic3r/PrintConfig.cpp:3090 msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " @@ -13698,11 +15618,11 @@ msgstr "" "이 벡터는 지우기 타워에 사용되는 각 도구에서/로 변경하는 데 필요한 볼륨을 저" "장합니다. 이러한 값은 아래 전체 제거 볼륨의 생성을 단순화하는 데 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:3008 +#: src/libslic3r/PrintConfig.cpp:3096 msgid "Purging volumes - matrix" msgstr "볼륨 삭제 - 행렬" -#: src/libslic3r/PrintConfig.cpp:3009 +#: src/libslic3r/PrintConfig.cpp:3097 msgid "" "This matrix describes volumes (in cubic milimetres) required to purge the " "new filament on the wipe tower for any given pair of tools." @@ -13710,54 +15630,58 @@ msgstr "" "이 매트릭스는 지정 된 도구 쌍에 대해 와이퍼 타워의 새필라멘트를 제거 하는 데 " "필요한 체적 (입방 밀리 미터)을 설명 합니다." -#: src/libslic3r/PrintConfig.cpp:3018 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Position X" msgstr "X축 위치" -#: src/libslic3r/PrintConfig.cpp:3019 +#: src/libslic3r/PrintConfig.cpp:3107 msgid "X coordinate of the left front corner of a wipe tower" msgstr "와이프 타워의 좌측 전면 모서리의 X 좌표" -#: src/libslic3r/PrintConfig.cpp:3025 +#: src/libslic3r/PrintConfig.cpp:3113 msgid "Position Y" msgstr "Y축 위치" -#: src/libslic3r/PrintConfig.cpp:3026 +#: src/libslic3r/PrintConfig.cpp:3114 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "와이퍼 작동 타워의 좌측 전방 모서리의 Y 좌표" -#: src/libslic3r/PrintConfig.cpp:3033 +#: src/libslic3r/PrintConfig.cpp:3120 +msgid "Width" +msgstr "넓이" + +#: src/libslic3r/PrintConfig.cpp:3121 msgid "Width of a wipe tower" msgstr "와이퍼 타워 폭" -#: src/libslic3r/PrintConfig.cpp:3039 +#: src/libslic3r/PrintConfig.cpp:3127 msgid "Wipe tower rotation angle" msgstr "와이퍼 타워 회전각도" -#: src/libslic3r/PrintConfig.cpp:3040 +#: src/libslic3r/PrintConfig.cpp:3128 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "x축에 대하여 타워 회전 각도를 닦아냅니다." -#: src/libslic3r/PrintConfig.cpp:3046 src/libslic3r/PrintConfig.cpp:3047 +#: src/libslic3r/PrintConfig.cpp:3134 src/libslic3r/PrintConfig.cpp:3135 msgid "Wipe tower brim width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3055 +#: src/libslic3r/PrintConfig.cpp:3143 msgid "Wipe into this object's infill" msgstr "이 오브젝트의 채우기를 닦아" -#: src/libslic3r/PrintConfig.cpp:3056 +#: src/libslic3r/PrintConfig.cpp:3144 msgid "" "Purging after toolchange will be done inside this object's infills. This " "lowers the amount of waste but may result in longer print time due to " "additional travel moves." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3063 +#: src/libslic3r/PrintConfig.cpp:3151 msgid "Wipe into this object" msgstr "이 개체로 닦아" -#: src/libslic3r/PrintConfig.cpp:3064 +#: src/libslic3r/PrintConfig.cpp:3152 msgid "" "Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " @@ -13767,19 +15691,19 @@ msgstr "" "에서 종료 되는 재료를 저장 하고 인쇄 시간을 줄입니다. 그 결과 개체의 색상이 " "혼합 됩니다." -#: src/libslic3r/PrintConfig.cpp:3070 +#: src/libslic3r/PrintConfig.cpp:3158 msgid "Maximal bridging distance" msgstr "최대 브리징 거리" -#: src/libslic3r/PrintConfig.cpp:3071 +#: src/libslic3r/PrintConfig.cpp:3159 msgid "Maximal distance between supports on sparse infill sections." msgstr "드문드문한 인필 섹션에서 지지대 사이의 최대 거리." -#: src/libslic3r/PrintConfig.cpp:3077 +#: src/libslic3r/PrintConfig.cpp:3165 msgid "XY Size Compensation" msgstr "XY 크기 보정" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3167 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" @@ -13788,11 +15712,11 @@ msgstr "" "XY 평면에서 설정된 값(음수 = 안, 양 = 바깥쪽)에 따라 객체가 증가/정격된다. 이" "는 구멍 크기를 미세 조정하는데 유용할 수 있다." -#: src/libslic3r/PrintConfig.cpp:3087 +#: src/libslic3r/PrintConfig.cpp:3175 msgid "Z offset" msgstr "Z 오프셋" -#: src/libslic3r/PrintConfig.cpp:3088 +#: src/libslic3r/PrintConfig.cpp:3176 msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " "output G-code. It is used to compensate for bad Z endstop position: for " @@ -13803,11 +15727,11 @@ msgstr "" "톱 0이 실제로 노즐을 프린트 베드에서 0.3mm 떨어진 곳에 둔 경우, 이를 -0.3(또" "는 엔드 스톱을 고정)으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:3097 +#: src/libslic3r/PrintConfig.cpp:3185 msgid "Perimeter generator" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3099 +#: src/libslic3r/PrintConfig.cpp:3187 msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " @@ -13815,19 +15739,19 @@ msgid "" "Concentric infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3192 msgid "Classic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3107 +#: src/libslic3r/PrintConfig.cpp:3193 msgid "Arachne" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3199 msgid "Perimeter transition length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3114 +#: src/libslic3r/PrintConfig.cpp:3201 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " @@ -13835,11 +15759,11 @@ msgid "" "be computed based on the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3123 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Perimeter transitioning filter margin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3125 +#: src/libslic3r/PrintConfig.cpp:3212 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -13851,11 +15775,11 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3138 +#: src/libslic3r/PrintConfig.cpp:3225 msgid "Perimeter transitioning threshold angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3140 +#: src/libslic3r/PrintConfig.cpp:3227 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -13864,22 +15788,22 @@ msgid "" "these center perimeters, but may leave gaps or overextrude." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3151 +#: src/libslic3r/PrintConfig.cpp:3238 msgid "Perimeter distribution count" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3153 +#: src/libslic3r/PrintConfig.cpp:3240 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " "in width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3247 msgid "Minimum feature size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3162 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " @@ -13888,76 +15812,244 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3172 +#: src/libslic3r/PrintConfig.cpp:3259 msgid "Minimum perimeter width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3174 +#: src/libslic3r/PrintConfig.cpp:3261 +msgid "" +"Width of the perimeter that will replace thin features (according to the " +"Minimum feature size) of the model. If the Minimum perimeter width is " +"thinner than the thickness of the feature, the perimeter will become as " +"thick as the feature itself. If expressed as a percentage (for example 85%), " +"it will be computed based on the nozzle diameter." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3327 +msgid "Pinhead front diameter" +msgstr "핀헤드 프론트 직경" + +#: src/libslic3r/PrintConfig.cpp:3329 +msgid "Diameter of the pointing side of the head" +msgstr "헤드 포인팅 측면 지름" + +#: src/libslic3r/PrintConfig.cpp:3336 +msgid "Head penetration" +msgstr "잘못된 헤드 관통" + +#: src/libslic3r/PrintConfig.cpp:3338 +msgid "How much the pinhead has to penetrate the model surface" +msgstr "핀헤드가 모델 표면에 침투해야 하는 양" + +#: src/libslic3r/PrintConfig.cpp:3345 +msgid "Pinhead width" +msgstr "핀헤드 너비" + +#: src/libslic3r/PrintConfig.cpp:3347 +msgid "Width from the back sphere center to the front sphere center" +msgstr "뒤쪽 구 중심에서 앞쪽 구 중심 까지의 폭입니다" + +#: src/libslic3r/PrintConfig.cpp:3355 +msgid "Pillar diameter" +msgstr "기둥 직경" + +#: src/libslic3r/PrintConfig.cpp:3357 +msgid "Diameter in mm of the support pillars" +msgstr "서포트 기둥의 지름 (mm)" + +#: src/libslic3r/PrintConfig.cpp:3365 +msgid "Small pillar diameter percent" +msgstr "작은 기둥 직경 퍼센트" + +#: src/libslic3r/PrintConfig.cpp:3367 +msgid "" +"The percentage of smaller pillars compared to the normal pillar diameter " +"which are used in problematic areas where a normal pilla cannot fit." +msgstr "" +"일반 필라가 맞지 않는 문제가 있는 부위에 사용되는 일반 기둥 직경에 비해 작은 " +"기둥의 백분율입니다." + +#: src/libslic3r/PrintConfig.cpp:3376 +msgid "Max bridges on a pillar" +msgstr "기둥의 최대 교량" + +#: src/libslic3r/PrintConfig.cpp:3378 +msgid "" +"Maximum number of bridges that can be placed on a pillar. Bridges hold " +"support point pinheads and connect to pillars as small branches." +msgstr "" +"기둥에 배치할 수 있는 최대 브리지 수입니다. 브리지는 지지점 핀헤드를 잡고 작" +"은 가지로 기둥에 연결합니다." + +#: src/libslic3r/PrintConfig.cpp:3386 +msgid "Max weight on model" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3389 +msgid "" +"Maximum weight of sub-trees that terminate on the model instead of the print " +"bed. The weight is the sum of the lenghts of all branches emanating from the " +"endpoint." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3397 +msgid "Pillar connection mode" +msgstr "기둥 연결 모드" + +#: src/libslic3r/PrintConfig.cpp:3398 +msgid "" +"Controls the bridge type between two neighboring pillars. Can be zig-zag, " +"cross (double zig-zag) or dynamic which will automatically switch between " +"the first two depending on the distance of the two pillars." +msgstr "" +"인접한 두 기둥 사이의 교량 유형을 제어 합니다. 두 기둥의 거리에 따라 자동으" +"로 처음 두 사이를 전환 하는 지그재그, 크로스 (지그재그 더블 지그재그) 또는 동" +"적 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Zig-Zag" +msgstr "지그재그" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Cross" +msgstr "십자가" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Dynamic" +msgstr "동적" + +#: src/libslic3r/PrintConfig.cpp:3416 +msgid "Pillar widening factor" +msgstr "기둥 확대 계수" + +#: src/libslic3r/PrintConfig.cpp:3420 +msgid "" +"Merging bridges or pillars into another pillars can increase the radius. " +"Zero means no increase, one means full increase. The exact amount of " +"increase is unspecified and can change in the future." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3431 +msgid "Support base diameter" +msgstr "서포트 베이스 지름" + +#: src/libslic3r/PrintConfig.cpp:3433 +msgid "Diameter in mm of the pillar base" +msgstr "기둥 베이스의 mm 직경" + +#: src/libslic3r/PrintConfig.cpp:3441 +msgid "Support base height" +msgstr "서포트 기준 높이" + +#: src/libslic3r/PrintConfig.cpp:3443 +msgid "The height of the pillar base cone" +msgstr "서포트 베이스 원추의 높이" + +#: src/libslic3r/PrintConfig.cpp:3450 +msgid "Support base safety distance" +msgstr "지지 기지 안전 거리" + +#: src/libslic3r/PrintConfig.cpp:3453 +msgid "" +"The minimum distance of the pillar base from the model in mm. Makes sense in " +"zero elevation mode where a gap according to this parameter is inserted " +"between the model and the pad." +msgstr "" +"모델에서 mm의 기둥 베이스의 최소 거리입니다. 이 매개 변수에 따른 간격이 모델" +"과 패드 사이에 삽입되는 0 고도 모드에서 의미가 있습니다." + +#: src/libslic3r/PrintConfig.cpp:3463 +msgid "Critical angle" +msgstr "임계 각도" + +#: src/libslic3r/PrintConfig.cpp:3465 +msgid "The default angle for connecting support sticks and junctions." +msgstr "서포트 스틱과 접합부를 연결 하는 기본 각도입니다." + +#: src/libslic3r/PrintConfig.cpp:3473 +msgid "Max bridge length" +msgstr "최대 브리지 길이" + +#: src/libslic3r/PrintConfig.cpp:3475 +msgid "The max length of a bridge" +msgstr "브릿지의 최대 길이" + +#: src/libslic3r/PrintConfig.cpp:3487 +msgid "Max pillar linking distance" +msgstr "최대 기둥 연결 거리" + +#: src/libslic3r/PrintConfig.cpp:3489 +msgid "" +"The max distance of two pillars to get linked with each other. A zero value " +"will prohibit pillar cascading." +msgstr "" +"서로 연결 되는 두기둥의 최대 거리. 0 값은 기둥을 계단식으로 금지 합니다." + +#: src/libslic3r/PrintConfig.cpp:3499 msgid "" -"Width of the perimeter that will replace thin features (according to the " -"Minimum feature size) of the model. If the Minimum perimeter width is " -"thinner than the thickness of the feature, the perimeter will become as " -"thick as the feature itself. If expressed as a percentage (for example 85%), " -"it will be computed based on the nozzle diameter." +"How much the supports should lift up the supported object. If \"Pad around " +"object\" is enabled, this value is ignored." msgstr "" +"지원되는 개체를 들어 올려야 하는 지원 의 양입니다. \"개체 주위 의 패드\"가 활" +"성화되면 이 값은 무시됩니다." -#: src/libslic3r/PrintConfig.cpp:3242 +#: src/libslic3r/PrintConfig.cpp:3515 msgid "Display width" msgstr "표시 폭" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3516 msgid "Width of the display" msgstr "디스플레이의 폭입니다" -#: src/libslic3r/PrintConfig.cpp:3248 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "Display height" msgstr "표시 높이" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3522 msgid "Height of the display" msgstr "디스플레이 높이" -#: src/libslic3r/PrintConfig.cpp:3254 +#: src/libslic3r/PrintConfig.cpp:3527 msgid "Number of pixels in" msgstr "픽셀 수" -#: src/libslic3r/PrintConfig.cpp:3256 +#: src/libslic3r/PrintConfig.cpp:3529 msgid "Number of pixels in X" msgstr "X의 픽셀 수" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3535 msgid "Number of pixels in Y" msgstr "Y의 픽셀 수" -#: src/libslic3r/PrintConfig.cpp:3267 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Display horizontal mirroring" msgstr "수평 미러링 표시" -#: src/libslic3r/PrintConfig.cpp:3268 +#: src/libslic3r/PrintConfig.cpp:3541 msgid "Mirror horizontally" msgstr "가로로 대칭" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3542 msgid "Enable horizontal mirroring of output images" msgstr "출력 이미지의 수평 미러링 사용" -#: src/libslic3r/PrintConfig.cpp:3274 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Display vertical mirroring" msgstr "세로 미러링 표시" -#: src/libslic3r/PrintConfig.cpp:3275 +#: src/libslic3r/PrintConfig.cpp:3548 msgid "Mirror vertically" msgstr "세로로 미러" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "Enable vertical mirroring of output images" msgstr "출력 이미지의 수직 미러링 사용" -#: src/libslic3r/PrintConfig.cpp:3281 +#: src/libslic3r/PrintConfig.cpp:3554 msgid "Display orientation" msgstr "표시 방향" -#: src/libslic3r/PrintConfig.cpp:3282 +#: src/libslic3r/PrintConfig.cpp:3555 msgid "" "Set the actual LCD display orientation inside the SLA printer. Portrait mode " "will flip the meaning of display width and height parameters and the output " @@ -13966,55 +16058,55 @@ msgstr "" "SLA 프린터 내부에 실제 LCD 디스플레이 방향을 설정합니다. 세로 모드는 디스플레" "이 너비와 높이 매개 변수의 의미를 뒤집고 출력 이미지가 90도 회전합니다." -#: src/libslic3r/PrintConfig.cpp:3288 +#: src/libslic3r/PrintConfig.cpp:3559 msgid "Landscape" msgstr "가로" -#: src/libslic3r/PrintConfig.cpp:3289 +#: src/libslic3r/PrintConfig.cpp:3560 msgid "Portrait" msgstr "세로" -#: src/libslic3r/PrintConfig.cpp:3294 src/libslic3r/PrintConfig.cpp:3929 +#: src/libslic3r/PrintConfig.cpp:3566 src/libslic3r/PrintConfig.cpp:4058 msgid "Fast" msgstr "빠른" -#: src/libslic3r/PrintConfig.cpp:3295 +#: src/libslic3r/PrintConfig.cpp:3567 msgid "Fast tilt" msgstr "빠른 기울기" -#: src/libslic3r/PrintConfig.cpp:3296 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Time of the fast tilt" msgstr "빠른 기울기의 시간" -#: src/libslic3r/PrintConfig.cpp:3303 src/libslic3r/PrintConfig.cpp:3928 +#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:4057 msgid "Slow" msgstr "느리게" -#: src/libslic3r/PrintConfig.cpp:3304 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Slow tilt" msgstr "천천히 기울이기" -#: src/libslic3r/PrintConfig.cpp:3305 +#: src/libslic3r/PrintConfig.cpp:3577 msgid "Time of the slow tilt" msgstr "천천히 기울이는 속도" -#: src/libslic3r/PrintConfig.cpp:3312 src/libslic3r/PrintConfig.cpp:3930 +#: src/libslic3r/PrintConfig.cpp:3584 src/libslic3r/PrintConfig.cpp:4059 msgid "High viscosity" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3313 +#: src/libslic3r/PrintConfig.cpp:3585 msgid "Tilt for high viscosity resin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3314 +#: src/libslic3r/PrintConfig.cpp:3586 msgid "Time of the super slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3321 +#: src/libslic3r/PrintConfig.cpp:3593 msgid "Area fill" msgstr "영역 채우기" -#: src/libslic3r/PrintConfig.cpp:3322 +#: src/libslic3r/PrintConfig.cpp:3594 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -14024,59 +16116,59 @@ msgstr "" "인쇄 영역이 지정 된 값을 초과 하면 \n" "그런 다음 느린 기울기가 사용 됩니다, 그렇지 않으면-빠른 기울기가 됩니다" -#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 -#: src/libslic3r/PrintConfig.cpp:3331 +#: src/libslic3r/PrintConfig.cpp:3601 src/libslic3r/PrintConfig.cpp:3602 +#: src/libslic3r/PrintConfig.cpp:3603 msgid "Printer scaling correction" msgstr "프린터 크기 조정 보정" -#: src/libslic3r/PrintConfig.cpp:3337 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3609 src/libslic3r/PrintConfig.cpp:3611 msgid "Printer scaling correction in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3338 +#: src/libslic3r/PrintConfig.cpp:3610 msgid "Printer scaling X axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3345 src/libslic3r/PrintConfig.cpp:3347 +#: src/libslic3r/PrintConfig.cpp:3617 src/libslic3r/PrintConfig.cpp:3619 msgid "Printer scaling correction in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3346 +#: src/libslic3r/PrintConfig.cpp:3618 msgid "Printer scaling Y axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3353 src/libslic3r/PrintConfig.cpp:3355 +#: src/libslic3r/PrintConfig.cpp:3625 src/libslic3r/PrintConfig.cpp:3627 msgid "Printer scaling correction in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3354 +#: src/libslic3r/PrintConfig.cpp:3626 msgid "Printer scaling Z axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3361 src/libslic3r/PrintConfig.cpp:3362 +#: src/libslic3r/PrintConfig.cpp:3633 src/libslic3r/PrintConfig.cpp:3634 msgid "Printer absolute correction" msgstr "프린터 절대 보정" -#: src/libslic3r/PrintConfig.cpp:3363 +#: src/libslic3r/PrintConfig.cpp:3635 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "보정 의 표시에 따라 슬라이스 된 2D 다각형을 팽창하거나 수축합니다." -#: src/libslic3r/PrintConfig.cpp:3369 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Elephant foot minimum width" msgstr "코끼리 발 최소 폭" -#: src/libslic3r/PrintConfig.cpp:3371 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "코끼리 발 보정을 할 때 유지 해야 하는 기능의 최소 폭." -#: src/libslic3r/PrintConfig.cpp:3378 src/libslic3r/PrintConfig.cpp:3379 +#: src/libslic3r/PrintConfig.cpp:3650 src/libslic3r/PrintConfig.cpp:3651 msgid "Printer gamma correction" msgstr "프린터 감마 보정" -#: src/libslic3r/PrintConfig.cpp:3380 +#: src/libslic3r/PrintConfig.cpp:3652 msgid "" "This will apply a gamma correction to the rasterized 2D polygons. A gamma " "value of zero means thresholding with the threshold in the middle. This " @@ -14086,299 +16178,171 @@ msgstr "" "중간에 임계값이 임계화 의미입니다. 이 동작은 폴리곤의 구멍을 잃지 않고 안티알" "리아싱을 제거 합니다." -#: src/libslic3r/PrintConfig.cpp:3399 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3671 src/libslic3r/PrintConfig.cpp:3672 msgid "SLA material type" msgstr "SLA 재료 유형" -#: src/libslic3r/PrintConfig.cpp:3411 src/libslic3r/PrintConfig.cpp:3412 +#: src/libslic3r/PrintConfig.cpp:3679 src/libslic3r/PrintConfig.cpp:3680 msgid "Initial layer height" msgstr "초기 레이어 높이" -#: src/libslic3r/PrintConfig.cpp:3418 src/libslic3r/PrintConfig.cpp:3419 +#: src/libslic3r/PrintConfig.cpp:3686 +msgid "Idle temperature" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3687 +msgid "" +"Nozzle temperature when the tool is currently not used in multi-tool setups." +"This is only used when 'Ooze prevention' is active in Print Settings." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3695 src/libslic3r/PrintConfig.cpp:3696 msgid "Bottle volume" msgstr "병 볼륨" -#: src/libslic3r/PrintConfig.cpp:3420 +#: src/libslic3r/PrintConfig.cpp:3697 msgid "ml" msgstr "ml" -#: src/libslic3r/PrintConfig.cpp:3425 src/libslic3r/PrintConfig.cpp:3426 +#: src/libslic3r/PrintConfig.cpp:3702 src/libslic3r/PrintConfig.cpp:3703 msgid "Bottle weight" msgstr "병 무게" -#: src/libslic3r/PrintConfig.cpp:3427 +#: src/libslic3r/PrintConfig.cpp:3704 msgid "kg" msgstr "kg" -#: src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "g/ml" msgstr "g/ml" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3718 msgid "money/bottle" msgstr "가격 /병" -#: src/libslic3r/PrintConfig.cpp:3446 +#: src/libslic3r/PrintConfig.cpp:3723 msgid "Faded layers" msgstr "페이드 레이어" -#: src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3724 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "노출 시간에 필요한 레이어 수가 초기 노출 시간에서 노출 시간으로 페이드" -#: src/libslic3r/PrintConfig.cpp:3454 src/libslic3r/PrintConfig.cpp:3455 +#: src/libslic3r/PrintConfig.cpp:3731 src/libslic3r/PrintConfig.cpp:3732 msgid "Minimum exposure time" msgstr "최소 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3462 src/libslic3r/PrintConfig.cpp:3463 +#: src/libslic3r/PrintConfig.cpp:3739 src/libslic3r/PrintConfig.cpp:3740 msgid "Maximum exposure time" msgstr "최대 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3470 src/libslic3r/PrintConfig.cpp:3471 +#: src/libslic3r/PrintConfig.cpp:3747 src/libslic3r/PrintConfig.cpp:3748 msgid "Exposure time" msgstr "노출 시간" -#: src/libslic3r/PrintConfig.cpp:3477 src/libslic3r/PrintConfig.cpp:3478 +#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3755 msgid "Minimum initial exposure time" msgstr "최소 초기 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3485 src/libslic3r/PrintConfig.cpp:3486 +#: src/libslic3r/PrintConfig.cpp:3762 src/libslic3r/PrintConfig.cpp:3763 msgid "Maximum initial exposure time" msgstr "최대 초기 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3493 src/libslic3r/PrintConfig.cpp:3494 +#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3771 msgid "Initial exposure time" msgstr "최소 초기 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3500 src/libslic3r/PrintConfig.cpp:3501 +#: src/libslic3r/PrintConfig.cpp:3777 src/libslic3r/PrintConfig.cpp:3778 msgid "Correction for expansion" msgstr "확장에 대한 수정" -#: src/libslic3r/PrintConfig.cpp:3507 src/libslic3r/PrintConfig.cpp:3508 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3785 msgid "Correction for expansion in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3514 src/libslic3r/PrintConfig.cpp:3515 +#: src/libslic3r/PrintConfig.cpp:3791 src/libslic3r/PrintConfig.cpp:3792 msgid "Correction for expansion in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3521 src/libslic3r/PrintConfig.cpp:3522 +#: src/libslic3r/PrintConfig.cpp:3798 src/libslic3r/PrintConfig.cpp:3799 msgid "Correction for expansion in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3528 +#: src/libslic3r/PrintConfig.cpp:3805 msgid "SLA print material notes" msgstr "SLA 프린트 소재 노트" -#: src/libslic3r/PrintConfig.cpp:3529 +#: src/libslic3r/PrintConfig.cpp:3806 msgid "You can put your notes regarding the SLA print material here." msgstr "여기에서 SLA 인쇄 자료에 대한 메모를 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3552 +#: src/libslic3r/PrintConfig.cpp:3818 src/libslic3r/PrintConfig.cpp:3829 msgid "Default SLA material profile" msgstr "기본 SLA 재질 프로파일" -#: src/libslic3r/PrintConfig.cpp:3563 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "Generate supports" msgstr "지원 생성" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3842 msgid "Generate supports for the models" msgstr "모델에 대한 지원 생성" -#: src/libslic3r/PrintConfig.cpp:3570 -msgid "Pinhead front diameter" -msgstr "핀헤드 프론트 직경" - -#: src/libslic3r/PrintConfig.cpp:3572 -msgid "Diameter of the pointing side of the head" -msgstr "헤드 포인팅 측면 지름" - -#: src/libslic3r/PrintConfig.cpp:3579 -msgid "Head penetration" -msgstr "잘못된 헤드 관통" - -#: src/libslic3r/PrintConfig.cpp:3581 -msgid "How much the pinhead has to penetrate the model surface" -msgstr "핀헤드가 모델 표면에 침투해야 하는 양" - -#: src/libslic3r/PrintConfig.cpp:3588 -msgid "Pinhead width" -msgstr "핀헤드 너비" - -#: src/libslic3r/PrintConfig.cpp:3590 -msgid "Width from the back sphere center to the front sphere center" -msgstr "뒤쪽 구 중심에서 앞쪽 구 중심 까지의 폭입니다" - -#: src/libslic3r/PrintConfig.cpp:3598 -msgid "Pillar diameter" -msgstr "기둥 직경" - -#: src/libslic3r/PrintConfig.cpp:3600 -msgid "Diameter in mm of the support pillars" -msgstr "서포트 기둥의 지름 (mm)" - -#: src/libslic3r/PrintConfig.cpp:3608 -msgid "Small pillar diameter percent" -msgstr "작은 기둥 직경 퍼센트" - -#: src/libslic3r/PrintConfig.cpp:3610 -msgid "" -"The percentage of smaller pillars compared to the normal pillar diameter " -"which are used in problematic areas where a normal pilla cannot fit." -msgstr "" -"일반 필라가 맞지 않는 문제가 있는 부위에 사용되는 일반 기둥 직경에 비해 작은 " -"기둥의 백분율입니다." - -#: src/libslic3r/PrintConfig.cpp:3619 -msgid "Max bridges on a pillar" -msgstr "기둥의 최대 교량" - -#: src/libslic3r/PrintConfig.cpp:3621 -msgid "" -"Maximum number of bridges that can be placed on a pillar. Bridges hold " -"support point pinheads and connect to pillars as small branches." -msgstr "" -"기둥에 배치할 수 있는 최대 브리지 수입니다. 브리지는 지지점 핀헤드를 잡고 작" -"은 가지로 기둥에 연결합니다." - -#: src/libslic3r/PrintConfig.cpp:3629 -msgid "Pillar connection mode" -msgstr "기둥 연결 모드" - -#: src/libslic3r/PrintConfig.cpp:3630 -msgid "" -"Controls the bridge type between two neighboring pillars. Can be zig-zag, " -"cross (double zig-zag) or dynamic which will automatically switch between " -"the first two depending on the distance of the two pillars." +#: src/libslic3r/PrintConfig.cpp:3847 +msgid "Support tree type" msgstr "" -"인접한 두 기둥 사이의 교량 유형을 제어 합니다. 두 기둥의 거리에 따라 자동으" -"로 처음 두 사이를 전환 하는 지그재그, 크로스 (지그재그 더블 지그재그) 또는 동" -"적 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:3638 -msgid "Zig-Zag" -msgstr "지그재그" - -#: src/libslic3r/PrintConfig.cpp:3639 -msgid "Cross" -msgstr "십자가" - -#: src/libslic3r/PrintConfig.cpp:3640 -msgid "Dynamic" -msgstr "동적" - -#: src/libslic3r/PrintConfig.cpp:3652 -msgid "Pillar widening factor" -msgstr "기둥 확대 계수" -#: src/libslic3r/PrintConfig.cpp:3654 -msgid "" -"Merging bridges or pillars into another pillars can increase the radius. " -"Zero means no increase, one means full increase." +#: src/libslic3r/PrintConfig.cpp:3848 +msgid "Support tree building strategy" msgstr "" -"브릿지 또는 기둥을 다른 기둥에 병합 하면 반지름을 늘릴 수 있습니다. 0은 증가 " -"없음을 의미 하나는 전체 증가를 의미 합니다." - -#: src/libslic3r/PrintConfig.cpp:3663 -msgid "Support base diameter" -msgstr "서포트 베이스 지름" - -#: src/libslic3r/PrintConfig.cpp:3665 -msgid "Diameter in mm of the pillar base" -msgstr "기둥 베이스의 mm 직경" - -#: src/libslic3r/PrintConfig.cpp:3673 -msgid "Support base height" -msgstr "서포트 기준 높이" - -#: src/libslic3r/PrintConfig.cpp:3675 -msgid "The height of the pillar base cone" -msgstr "서포트 베이스 원추의 높이" - -#: src/libslic3r/PrintConfig.cpp:3682 -msgid "Support base safety distance" -msgstr "지지 기지 안전 거리" -#: src/libslic3r/PrintConfig.cpp:3685 -msgid "" -"The minimum distance of the pillar base from the model in mm. Makes sense in " -"zero elevation mode where a gap according to this parameter is inserted " -"between the model and the pad." +#: src/libslic3r/PrintConfig.cpp:3851 +msgid "Branching (experimental)" msgstr "" -"모델에서 mm의 기둥 베이스의 최소 거리입니다. 이 매개 변수에 따른 간격이 모델" -"과 패드 사이에 삽입되는 0 고도 모드에서 의미가 있습니다." - -#: src/libslic3r/PrintConfig.cpp:3695 -msgid "Critical angle" -msgstr "임계 각도" - -#: src/libslic3r/PrintConfig.cpp:3697 -msgid "The default angle for connecting support sticks and junctions." -msgstr "서포트 스틱과 접합부를 연결 하는 기본 각도입니다." -#: src/libslic3r/PrintConfig.cpp:3705 -msgid "Max bridge length" -msgstr "최대 브리지 길이" - -#: src/libslic3r/PrintConfig.cpp:3707 -msgid "The max length of a bridge" -msgstr "브릿지의 최대 길이" - -#: src/libslic3r/PrintConfig.cpp:3714 -msgid "Max pillar linking distance" -msgstr "최대 기둥 연결 거리" - -#: src/libslic3r/PrintConfig.cpp:3716 -msgid "" -"The max distance of two pillars to get linked with each other. A zero value " -"will prohibit pillar cascading." +#: src/libslic3r/PrintConfig.cpp:3860 +msgid "Support only in enforced regions" msgstr "" -"서로 연결 되는 두기둥의 최대 거리. 0 값은 기둥을 계단식으로 금지 합니다." -#: src/libslic3r/PrintConfig.cpp:3726 -msgid "" -"How much the supports should lift up the supported object. If \"Pad around " -"object\" is enabled, this value is ignored." +#: src/libslic3r/PrintConfig.cpp:3862 +msgid "Only create support if it lies in a support enforcer." msgstr "" -"지원되는 개체를 들어 올려야 하는 지원 의 양입니다. \"개체 주위 의 패드\"가 활" -"성화되면 이 값은 무시됩니다." -#: src/libslic3r/PrintConfig.cpp:3737 +#: src/libslic3r/PrintConfig.cpp:3869 msgid "This is a relative measure of support points density." msgstr "이는 서포트 점 밀도의 상대적인 척도입니다." -#: src/libslic3r/PrintConfig.cpp:3743 +#: src/libslic3r/PrintConfig.cpp:3875 msgid "Minimal distance of the support points" msgstr "서포트 지점의 최소 거리" -#: src/libslic3r/PrintConfig.cpp:3745 +#: src/libslic3r/PrintConfig.cpp:3877 msgid "No support points will be placed closer than this threshold." msgstr "서포트 지점은 이 임계값 보다 더 가깝게 배치 되지 않습니다." -#: src/libslic3r/PrintConfig.cpp:3751 +#: src/libslic3r/PrintConfig.cpp:3883 msgid "Use pad" msgstr "패드 사용" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3885 msgid "Add a pad underneath the supported model" msgstr "서포트 되는 모델 아래에 패드 추가" -#: src/libslic3r/PrintConfig.cpp:3758 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "Pad wall thickness" msgstr "패드 벽 두께" -#: src/libslic3r/PrintConfig.cpp:3760 +#: src/libslic3r/PrintConfig.cpp:3892 msgid "The thickness of the pad and its optional cavity walls." msgstr "패드의 두께와 선택적 캐비티 벽." -#: src/libslic3r/PrintConfig.cpp:3768 +#: src/libslic3r/PrintConfig.cpp:3900 msgid "Pad wall height" msgstr "패드 벽 높이" -#: src/libslic3r/PrintConfig.cpp:3769 +#: src/libslic3r/PrintConfig.cpp:3901 msgid "" "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " "when enabling this feature, as some resins may produce an extreme suction " @@ -14389,19 +16353,19 @@ msgstr "" "이 기능을 활성화 할 때 주의 해야할, 일부 수 캐비티 내부 극단적인 흡입 효과를 " "생성 할 수도 있기 때문에, vat 호일 인쇄를 벗겨 어렵게 만든다." -#: src/libslic3r/PrintConfig.cpp:3782 +#: src/libslic3r/PrintConfig.cpp:3914 msgid "Pad brim size" msgstr "패드 브럼 사이즈" -#: src/libslic3r/PrintConfig.cpp:3783 +#: src/libslic3r/PrintConfig.cpp:3915 msgid "How far should the pad extend around the contained geometry" msgstr "패드가 포함된 형상 주위에 얼마나 멀리 확장되어야 합니까?" -#: src/libslic3r/PrintConfig.cpp:3793 +#: src/libslic3r/PrintConfig.cpp:3925 msgid "Max merge distance" msgstr "최대 병합 거리" -#: src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3927 msgid "" "Some objects can get along with a few smaller pads instead of a single big " "one. This parameter defines how far the center of two smaller pads should " @@ -14411,94 +16375,94 @@ msgstr "" "변수는 두 개의 작은 패드의 중심이 얼마나 되어야 하는지 정의 합니다. 그들은 하" "나의 패드에 병합을 얻을 것이다." -#: src/libslic3r/PrintConfig.cpp:3815 +#: src/libslic3r/PrintConfig.cpp:3947 msgid "Pad wall slope" msgstr "패드 벽 경사" -#: src/libslic3r/PrintConfig.cpp:3817 +#: src/libslic3r/PrintConfig.cpp:3949 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "" "침대 평면을 기준으로 패드 벽의 경사입니다. 90도는 직선 벽을 의미합니다." -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3960 msgid "Create pad around object and ignore the support elevation" msgstr "오브젝트 주위에 패드를 만들고 지지표 표고를 무시합니다." -#: src/libslic3r/PrintConfig.cpp:3833 +#: src/libslic3r/PrintConfig.cpp:3965 msgid "Pad around object everywhere" msgstr "사방 물체 주위의 패드" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3967 msgid "Force pad around object everywhere" msgstr "사방 물체 주위의 힘 패드" -#: src/libslic3r/PrintConfig.cpp:3840 +#: src/libslic3r/PrintConfig.cpp:3972 msgid "Pad object gap" msgstr "패드 오브젝트 갭" -#: src/libslic3r/PrintConfig.cpp:3842 +#: src/libslic3r/PrintConfig.cpp:3974 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "오브젝트 바닥과 생성된 패드 사이의 간격이 0 고도 모드에서 발생합니다." -#: src/libslic3r/PrintConfig.cpp:3851 +#: src/libslic3r/PrintConfig.cpp:3983 msgid "Pad object connector stride" msgstr "패드 오브젝트 커넥터 보폭" -#: src/libslic3r/PrintConfig.cpp:3853 +#: src/libslic3r/PrintConfig.cpp:3985 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "오브젝트와 생성된 패드를 연결하는 두 커넥터 스틱 사이의 거리입니다." -#: src/libslic3r/PrintConfig.cpp:3860 +#: src/libslic3r/PrintConfig.cpp:3992 msgid "Pad object connector width" msgstr "패드 오브젝트 커넥터 너비" -#: src/libslic3r/PrintConfig.cpp:3862 +#: src/libslic3r/PrintConfig.cpp:3994 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "오브젝트와 생성된 패드를 연결하는 커넥터 스틱의 너비입니다." -#: src/libslic3r/PrintConfig.cpp:3869 +#: src/libslic3r/PrintConfig.cpp:4001 msgid "Pad object connector penetration" msgstr "패드 오브젝트 커넥터 침투" -#: src/libslic3r/PrintConfig.cpp:3872 +#: src/libslic3r/PrintConfig.cpp:4004 msgid "How much should the tiny connectors penetrate into the model body." msgstr "작은 커넥터가 모델 본체에 얼마나 침투해야 하는가." -#: src/libslic3r/PrintConfig.cpp:3879 +#: src/libslic3r/PrintConfig.cpp:4011 msgid "Enable hollowing" msgstr "중공 활성화" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:4013 msgid "Hollow out a model to have an empty interior" msgstr "빈 인테리어를 가지고 모델을 중공" -#: src/libslic3r/PrintConfig.cpp:3886 +#: src/libslic3r/PrintConfig.cpp:4018 msgid "Wall thickness" msgstr "벽 두께" -#: src/libslic3r/PrintConfig.cpp:3888 +#: src/libslic3r/PrintConfig.cpp:4020 msgid "Minimum wall thickness of a hollowed model." msgstr "비어 있는 모델의 최소 벽 두께입니다." -#: src/libslic3r/PrintConfig.cpp:3896 +#: src/libslic3r/PrintConfig.cpp:4028 msgid "Accuracy" msgstr "명중률" -#: src/libslic3r/PrintConfig.cpp:3898 +#: src/libslic3r/PrintConfig.cpp:4030 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." msgstr "" "성능 대 계산의 정확도. 값이 낮을수록 원치 않는 아티팩트가 생성될 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:4040 msgid "" "Hollowing is done in two steps: first, an imaginary interior is calculated " "deeper (offset plus the closing distance) in the object and then it's " @@ -14510,181 +16474,213 @@ msgstr "" "플러스 닫는 거리)로 계산된 다음 지정된 오프셋으로 다시 팽창합니다. 닫는 거리" "가 클수록 내부가 더 둥글게 됩니다. 0에서 내부는 외관을 가장 닮은 것입니다." -#: src/libslic3r/PrintConfig.cpp:3920 +#: src/libslic3r/PrintConfig.cpp:4052 msgid "Print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3922 +#: src/libslic3r/PrintConfig.cpp:4054 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " "movement and adds a delay before exposure." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4390 +#: src/libslic3r/PrintConfig.cpp:4065 +msgid "Format of the output SLA archive" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4070 +msgid "SLA output precision" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4071 +msgid "Minimum resolution in nanometers" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4542 msgid "Export OBJ" msgstr "수출 OBJ" -#: src/libslic3r/PrintConfig.cpp:4391 +#: src/libslic3r/PrintConfig.cpp:4543 msgid "Export the model(s) as OBJ." msgstr "모델을 OBJ로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4554 msgid "Export SLA" msgstr "수출 SLA" -#: src/libslic3r/PrintConfig.cpp:4403 +#: src/libslic3r/PrintConfig.cpp:4555 msgid "Slice the model and export SLA printing layers as PNG." msgstr "모델을 분할하고 SLA 인쇄 레이어를 PNG로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4408 +#: src/libslic3r/PrintConfig.cpp:4560 msgid "Export 3MF" msgstr "3MF 내보내기" -#: src/libslic3r/PrintConfig.cpp:4409 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Export the model(s) as 3MF." msgstr "모델(들)을 3MF로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4413 +#: src/libslic3r/PrintConfig.cpp:4565 msgid "Export AMF" msgstr "AMF로 내보내기" -#: src/libslic3r/PrintConfig.cpp:4414 +#: src/libslic3r/PrintConfig.cpp:4566 msgid "Export the model(s) as AMF." msgstr "모델을 AMF로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4418 +#: src/libslic3r/PrintConfig.cpp:4570 msgid "Export STL" msgstr "STL로 내보내기" -#: src/libslic3r/PrintConfig.cpp:4419 +#: src/libslic3r/PrintConfig.cpp:4571 msgid "Export the model(s) as STL." msgstr "모델을 STL로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4424 +#: src/libslic3r/PrintConfig.cpp:4576 msgid "Slice the model and export toolpaths as G-code." msgstr "모델을 슬라이스하고 도구 경로를 G 코드로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4581 msgid "G-code viewer" msgstr "G 코드 뷰어" -#: src/libslic3r/PrintConfig.cpp:4430 +#: src/libslic3r/PrintConfig.cpp:4582 msgid "Visualize an already sliced and saved G-code" msgstr "이미 슬라이스되고 저장된 G 코드 시각화" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4588 +msgid "OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4589 +msgid "Select the specified OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4594 +msgid "OpenGL debug output" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4595 +msgid "Activate OpenGL debug output on graphic cards which support it" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4601 msgid "Slice" msgstr "슬라이스" -#: src/libslic3r/PrintConfig.cpp:4436 +#: src/libslic3r/PrintConfig.cpp:4602 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "" " printer_technology 구성 값을 기반으로 모델을 FFF 또는 SLA로 슬라이스합니다." -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4607 msgid "Help" msgstr "도움말" -#: src/libslic3r/PrintConfig.cpp:4442 +#: src/libslic3r/PrintConfig.cpp:4608 msgid "Show this help." msgstr "도움말 표시하기" -#: src/libslic3r/PrintConfig.cpp:4447 +#: src/libslic3r/PrintConfig.cpp:4613 msgid "Help (FFF options)" msgstr "도움말(FFF 옵션)" -#: src/libslic3r/PrintConfig.cpp:4448 +#: src/libslic3r/PrintConfig.cpp:4614 msgid "Show the full list of print/G-code configuration options." msgstr "인쇄/G 코드 구성 옵션의 전체 목록을 표시합니다." -#: src/libslic3r/PrintConfig.cpp:4452 +#: src/libslic3r/PrintConfig.cpp:4618 msgid "Help (SLA options)" msgstr "도움말(SLA 옵션)" -#: src/libslic3r/PrintConfig.cpp:4453 +#: src/libslic3r/PrintConfig.cpp:4619 msgid "Show the full list of SLA print configuration options." msgstr "SLA 인쇄 구성 옵션의 전체 목록을 표시합니다." -#: src/libslic3r/PrintConfig.cpp:4457 +#: src/libslic3r/PrintConfig.cpp:4623 msgid "Output Model Info" msgstr "출력 모델 정보" -#: src/libslic3r/PrintConfig.cpp:4458 +#: src/libslic3r/PrintConfig.cpp:4624 msgid "Write information about the model to the console." msgstr "콘솔에 모델에 대한 정보를 작성합니다." -#: src/libslic3r/PrintConfig.cpp:4462 +#: src/libslic3r/PrintConfig.cpp:4628 msgid "Save config file" msgstr "구성 파일 저장" -#: src/libslic3r/PrintConfig.cpp:4463 +#: src/libslic3r/PrintConfig.cpp:4629 msgid "Save configuration to the specified file." msgstr "지정된 파일에 구성을 저장합니다." -#: src/libslic3r/PrintConfig.cpp:4473 +#: src/libslic3r/PrintConfig.cpp:4639 msgid "Align XY" msgstr "XY 정렬" -#: src/libslic3r/PrintConfig.cpp:4474 +#: src/libslic3r/PrintConfig.cpp:4640 msgid "Align the model to the given point." msgstr "모델을 지정된 점에 맞춥니다." -#: src/libslic3r/PrintConfig.cpp:4479 +#: src/libslic3r/PrintConfig.cpp:4645 msgid "Cut model at the given Z." msgstr "지정된 Z에서 모델을 잘라냅니다." -#: src/libslic3r/PrintConfig.cpp:4501 +#: src/libslic3r/PrintConfig.cpp:4666 +msgid "Center" +msgstr "중앙" + +#: src/libslic3r/PrintConfig.cpp:4667 msgid "Center the print around the given center." msgstr "지정된 점을 중심으로 인쇄 합니다." -#: src/libslic3r/PrintConfig.cpp:4505 +#: src/libslic3r/PrintConfig.cpp:4671 msgid "Don't arrange" msgstr "준비하지 마십시오" -#: src/libslic3r/PrintConfig.cpp:4506 +#: src/libslic3r/PrintConfig.cpp:4672 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" "병합하기 전에 지정된 모델을 재정렬하고 원래 XY 좌표를 유지하지 마십시오." -#: src/libslic3r/PrintConfig.cpp:4509 +#: src/libslic3r/PrintConfig.cpp:4675 msgid "Ensure on bed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4510 +#: src/libslic3r/PrintConfig.cpp:4676 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4514 +#: src/libslic3r/PrintConfig.cpp:4680 msgid "Duplicate" msgstr "복사" -#: src/libslic3r/PrintConfig.cpp:4515 +#: src/libslic3r/PrintConfig.cpp:4681 msgid "Multiply copies by this factor." msgstr "이 계수에 따라 복사본을 곱합니다." -#: src/libslic3r/PrintConfig.cpp:4519 +#: src/libslic3r/PrintConfig.cpp:4685 msgid "Duplicate by grid" msgstr "그리드별 중복" -#: src/libslic3r/PrintConfig.cpp:4520 +#: src/libslic3r/PrintConfig.cpp:4686 msgid "Multiply copies by creating a grid." msgstr "그리드를 만들어 복사본을 곱합니다." -#: src/libslic3r/PrintConfig.cpp:4524 +#: src/libslic3r/PrintConfig.cpp:4690 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." msgstr "" "한 번 작업을 수행하기 위해 제공 된 모델을 정렬하고 단일 모델로 병합 합니다." -#: src/libslic3r/PrintConfig.cpp:4529 +#: src/libslic3r/PrintConfig.cpp:4695 msgid "" "Try to repair any non-manifold meshes (this option is implicitly added " "whenever we need to slice the model to perform the requested action)." @@ -14692,60 +16688,68 @@ msgstr "" "메쉬를 복구 하십시오 (요청 된 작업을 수행 하기 위해 모델을 슬라이스 해야 할때" "마다 이 옵션이 암시적으로 추가 됨)." -#: src/libslic3r/PrintConfig.cpp:4533 +#: src/libslic3r/PrintConfig.cpp:4699 msgid "Rotation angle around the Z axis in degrees." msgstr "Z 축 주위 회전 각도입니다." -#: src/libslic3r/PrintConfig.cpp:4537 +#: src/libslic3r/PrintConfig.cpp:4703 msgid "Rotate around X" msgstr "X 주위 회전" -#: src/libslic3r/PrintConfig.cpp:4538 +#: src/libslic3r/PrintConfig.cpp:4704 msgid "Rotation angle around the X axis in degrees." msgstr "X 축을 중심 회전 각도 입니다." -#: src/libslic3r/PrintConfig.cpp:4542 +#: src/libslic3r/PrintConfig.cpp:4708 msgid "Rotate around Y" msgstr "Y 주위 회전" -#: src/libslic3r/PrintConfig.cpp:4543 +#: src/libslic3r/PrintConfig.cpp:4709 msgid "Rotation angle around the Y axis in degrees." msgstr "Y 축을 중심 회전 각도 입니다." -#: src/libslic3r/PrintConfig.cpp:4548 +#: src/libslic3r/PrintConfig.cpp:4714 msgid "Scaling factor or percentage." msgstr "배율 또는 백분율을 조정합니다." -#: src/libslic3r/PrintConfig.cpp:4553 +#: src/libslic3r/PrintConfig.cpp:4719 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "" "지정 된 모델에서 연결 되지 않은 부품을 감지 하여 별도의 객체로 분할 합니다." -#: src/libslic3r/PrintConfig.cpp:4556 +#: src/libslic3r/PrintConfig.cpp:4722 msgid "Scale to Fit" msgstr "크기 조정" -#: src/libslic3r/PrintConfig.cpp:4557 +#: src/libslic3r/PrintConfig.cpp:4723 msgid "Scale to fit the given volume." msgstr "지정된 볼륨에 맞게 배율을 조정합니다." -#: src/libslic3r/PrintConfig.cpp:4566 +#: src/libslic3r/PrintConfig.cpp:4727 +msgid "Delete files after loading" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4728 +msgid "Delete files after loading." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4736 msgid "Ignore non-existent config files" msgstr "존재하지 않는 구성 파일 무시" -#: src/libslic3r/PrintConfig.cpp:4567 +#: src/libslic3r/PrintConfig.cpp:4737 msgid "Do not fail if a file supplied to --load does not exist." msgstr "--load에 제공된 파일이 존재하지 않는 경우 실패하지 마십시오." -#: src/libslic3r/PrintConfig.cpp:4570 +#: src/libslic3r/PrintConfig.cpp:4740 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4741 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -14753,27 +16757,27 @@ msgid "" "substitute an unknown value with a default silently or verbosely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4745 msgid "Bail out on unknown configuration values" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4579 +#: src/libslic3r/PrintConfig.cpp:4746 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4580 +#: src/libslic3r/PrintConfig.cpp:4747 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4584 +#: src/libslic3r/PrintConfig.cpp:4752 msgid "Load config file" msgstr "로드 구성 파일" -#: src/libslic3r/PrintConfig.cpp:4585 +#: src/libslic3r/PrintConfig.cpp:4753 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -14781,21 +16785,21 @@ msgstr "" "지정된 파일에서 구성을 로드합니다. 여러 파일에서 옵션을 로드하는 데 두 번 이" "상 사용할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:4588 +#: src/libslic3r/PrintConfig.cpp:4756 msgid "Output File" msgstr "출력 파일" -#: src/libslic3r/PrintConfig.cpp:4589 +#: src/libslic3r/PrintConfig.cpp:4757 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." msgstr "출력이 기록될 파일(지정되지 않은 경우 입력 파일을 기반으로 합니다)." -#: src/libslic3r/PrintConfig.cpp:4593 +#: src/libslic3r/PrintConfig.cpp:4761 msgid "Single instance mode" msgstr "단일 인스턴스 모드" -#: src/libslic3r/PrintConfig.cpp:4594 +#: src/libslic3r/PrintConfig.cpp:4762 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -14805,11 +16809,11 @@ msgstr "" "나 기존 PrusaSlicer 창이 활성화됩니다. 응용 프로그램 기본 설정에서 " "\"single_instance\" 구성 값을 재정의합니다." -#: src/libslic3r/PrintConfig.cpp:4605 +#: src/libslic3r/PrintConfig.cpp:4767 msgid "Data directory" msgstr "데이터 디렉터리" -#: src/libslic3r/PrintConfig.cpp:4606 +#: src/libslic3r/PrintConfig.cpp:4768 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -14818,11 +16822,11 @@ msgstr "" "지정된 디렉터리에서 설정을 로드하고 저장합니다. 이 기능은 서로 다른 프로파일" "을 유지 관리하거나 네트워크 저장소의 구성을 포함하는 데 유용합니다." -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4771 msgid "Logging level" msgstr "로깅 수준" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4772 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -14832,11 +16836,11 @@ msgstr "" "적\n" "예를 들어. loglevel=2는 치명적, 오류 및 경고 수준 메시지를 기록합니다." -#: src/libslic3r/PrintConfig.cpp:4616 +#: src/libslic3r/PrintConfig.cpp:4778 msgid "Render with a software renderer" msgstr "소프트웨어 렌더러로 렌더링" -#: src/libslic3r/PrintConfig.cpp:4617 +#: src/libslic3r/PrintConfig.cpp:4779 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -14848,18 +16852,30 @@ msgstr "" msgid "Error with zip archive" msgstr "zip 아카이브와 오류가 발생 했습니다" -#: src/libslic3r/PrintObject.cpp:126 +#: src/libslic3r/PrintObject.cpp:152 msgid "Generating perimeters" msgstr "둘레 생성" -#: src/libslic3r/PrintObject.cpp:229 +#: src/libslic3r/PrintObject.cpp:257 msgid "Preparing infill" msgstr "채우기 준비" -#: src/libslic3r/PrintObject.cpp:403 +#: src/libslic3r/PrintObject.cpp:402 +msgid "making infill" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:449 +msgid "Searching support spots" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:474 msgid "Generating support material" msgstr "지원할 서포트 생성" +#: src/libslic3r/PrintObject.cpp:495 +msgid "Estimating curled extrusions" +msgstr "" + #: resources/data/hints.ini: [hint:Fuzzy skin] msgid "" "Fuzzy skin\n" @@ -15130,6 +17146,36 @@ msgid "" "F11 hotkey." msgstr "" +#: resources/data/hints.ini: [hint:Printables integration] +msgid "" +"Printables.com integration\n" +"Did you know that when you are browsing Printables.com, you can send 3D " +"model files to PrusaSlicer with a single click? Learn more in the " +"documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Cut tool] +msgid "" +"Cut tool\n" +"Did you know that you can cut a model at any angle and even create aligning " +"pins with the updated Cut tool? Learn more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Measurement tool] +msgid "" +"Measurement tool\n" +"Did you know that you can measure the distances between points, edges " +"and planes, the radius of a hole or the angle between edges or planes? Learn " +"more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Text tool] +msgid "" +"Text tool\n" +"Did you know that you can add custom text labels to your models or even use " +"the text as a modifier? Learn more in the documentation." +msgstr "" + #: ../src/common/debugrpt.cpp:586 msgid "" "\n" @@ -16325,6 +18371,11 @@ msgstr "왼쪽 정렬" msgid "Align Right" msgstr "오른쪽 정렬" +#: ../src/richtext/richtextsizepage.cpp:266 +#, fuzzy +msgid "Alignment" +msgstr "정렬(&A)" + #: ../src/generic/filectrlg.cpp:1197 ../src/common/fldlgcmn.cpp:107 #, c-format msgid "All files (%s)|%s" @@ -17650,10 +19701,6 @@ msgstr "Decorative" msgid "Default encoding" msgstr "기본 인코딩" -#: ../src/dfb/fontmgr.cpp:180 -msgid "Default font" -msgstr "기본 글꼴" - #: ../src/generic/prntdlgg.cpp:510 msgid "Default printer" msgstr "프린터 기본값" @@ -18029,11 +20076,6 @@ msgstr "인쇄하는 도중 오류 발생:" msgid "Error: " msgstr "오류:" -#. TRANSLATORS: Name of keyboard key -#: ../src/common/accelcmn.cpp:69 -msgid "Esc" -msgstr "" - #. TRANSLATORS: Name of keyboard key #: ../src/common/accelcmn.cpp:70 #, fuzzy @@ -18791,11 +20833,6 @@ msgstr "복사" msgid "Folio, 8 1/2 x 13 in" msgstr "Folio, 8 1/2 x 13 in" -#: ../src/richtext/richtextformatdlg.cpp:344 ../src/osx/carbon/fontdlg.cpp:287 -#: ../src/common/stockitem.cpp:194 -msgid "Font" -msgstr "Font" - #: ../src/richtext/richtextfontpage.cpp:221 msgid "Font &weight:" msgstr "글꼴 굵기(&W):" @@ -19936,11 +21973,6 @@ msgstr "'%s' 파일이 VFS에 이미 포함되어 있습니다." msgid "Menu" msgstr "메뉴" -#: ../src/common/msgout.cpp:124 -#, fuzzy -msgid "Message" -msgstr "알림 : %s" - #: ../src/univ/themes/metal.cpp:168 msgid "Metal theme" msgstr "메탈 테마" @@ -19975,10 +22007,6 @@ msgstr "" msgid "Modern" msgstr "Modern" -#: ../src/generic/filectrlg.cpp:427 -msgid "Modified" -msgstr "수정됨" - #: ../src/common/module.cpp:133 #, c-format msgid "Module \"%s\" initialization failed" @@ -20072,11 +22100,6 @@ msgstr "새 이름" msgid "Next page" msgstr "다음 페이지" -#: ../include/wx/msgdlg.h:277 ../src/common/stockitem.cpp:177 -#: ../src/motif/msgdlg.cpp:196 -msgid "No" -msgstr "아니오" - #. TRANSLATORS: System cursor name #: ../src/propgrid/advprops.cpp:1764 msgid "No Entry" @@ -20318,12 +22341,6 @@ msgstr "" msgid "Numbered outline" msgstr "Numbered 형태" -#: ../include/wx/msgdlg.h:278 ../src/richtext/richtextstyledlg.cpp:297 -#: ../src/common/stockitem.cpp:178 ../src/msw/msgdlg.cpp:454 -#: ../src/msw/msgdlg.cpp:747 ../src/gtk1/fontdlg.cpp:138 -msgid "OK" -msgstr "확인" - #: ../src/msw/ole/automtn.cpp:692 #, c-format msgid "OLE Automation error in %s: %s" @@ -20396,6 +22413,10 @@ msgstr "옵션에 '%s' 값이 필요합니다." msgid "Option '%s': '%s' cannot be converted to a date." msgstr "옵션 '%s': '%s' 를 날짜로 변환할 수 없습니다." +#: ../src/generic/prntdlgg.cpp:618 +msgid "Options" +msgstr "설정" + #: ../src/propgrid/advprops.cpp:1606 msgid "Orange" msgstr "" @@ -21203,10 +23224,6 @@ msgstr "일반 또는 기울임 모양새 선택하시오." msgid "Select underlining or no underlining." msgstr "밑줄/밑줄 없음 을 선택합니다." -#: ../src/motif/filedlg.cpp:220 -msgid "Selection" -msgstr "선택" - #: ../src/richtext/richtextliststylepage.cpp:187 #: ../src/richtext/richtextliststylepage.cpp:189 msgid "Selects the list level to edit." @@ -22117,10 +24134,6 @@ msgstr "VFS에서 파일 '%s' 를 삭제할 수 없습니다.(로딩되지 않 msgid "Turkish (ISO-8859-9)" msgstr "터키어 (ISO-8859-9)" -#: ../src/generic/filectrlg.cpp:426 -msgid "Type" -msgstr "타입" - #: ../src/richtext/richtextfontpage.cpp:151 #: ../src/richtext/richtextfontpage.cpp:153 msgid "Type a font name." @@ -22627,10 +24640,6 @@ msgstr "현재 정렬 방식 사용" msgid "Validation conflict" msgstr "충돌" -#: ../src/propgrid/manager.cpp:238 -msgid "Value" -msgstr "" - #: ../src/propgrid/props.cpp:386 ../src/propgrid/props.cpp:500 #, c-format msgid "Value must be %s or higher." @@ -22875,11 +24884,6 @@ msgstr "XPM: %d 행에서 이미지가 잘렸습니다!" msgid "Yellow" msgstr "" -#: ../include/wx/msgdlg.h:276 ../src/common/stockitem.cpp:206 -#: ../src/motif/msgdlg.cpp:196 -msgid "Yes" -msgstr "예" - #: ../src/osx/carbon/overlay.cpp:155 msgid "You cannot Clear an overlay that is not inited" msgstr "오버레이 지울수 없습니다. 초기화 되지 않았습니다." diff --git a/resources/localization/list.txt b/resources/localization/list.txt index d68f99bff81..875e92721ce 100644 --- a/resources/localization/list.txt +++ b/resources/localization/list.txt @@ -9,23 +9,35 @@ src/slic3r/GUI/ConfigSnapshotDialog.cpp src/slic3r/GUI/ConfigWizard.cpp src/slic3r/GUI/DesktopIntegrationDialog.cpp src/slic3r/GUI/DoubleSlider.cpp +src/slic3r/GUI/Downloader.cpp +src/slic3r/GUI/DownloaderFileGet.cpp src/slic3r/GUI/ExtraRenderers.cpp src/slic3r/GUI/ExtruderSequenceDialog.cpp src/slic3r/GUI/Field.cpp +src/slic3r/GUI/FileArchiveDialog.cpp src/slic3r/GUI/FirmwareDialog.cpp src/slic3r/GUI/GalleryDialog.cpp src/slic3r/GUI/GCodeViewer.cpp src/slic3r/GUI/GLCanvas3D.cpp src/slic3r/GUI/Gizmos/GLGizmoCut.cpp +src/slic3r/GUI/Gizmos/GLGizmoCut.hpp +src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp +src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp +src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp +src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp +src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp src/slic3r/GUI/Gizmos/GLGizmoMove.cpp src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp src/slic3r/GUI/Gizmos/GLGizmoScale.cpp src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp +src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp +src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp src/slic3r/GUI/Gizmos/GLGizmosManager.cpp src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -42,8 +54,7 @@ src/slic3r/GUI/HintNotification.cpp src/slic3r/GUI/ImGuiWrapper.cpp src/slic3r/GUI/Jobs/ArrangeJob.cpp src/slic3r/GUI/Jobs/FillBedJob.cpp -src/slic3r/GUI/Jobs/Job.cpp -src/slic3r/GUI/Jobs/PlaterJob.cpp +src/slic3r/GUI/Jobs/EmbossJob.cpp src/slic3r/GUI/Jobs/RotoptimizeJob.hpp src/slic3r/GUI/Jobs/RotoptimizeJob.cpp src/slic3r/GUI/Jobs/SLAImportJob.cpp @@ -76,6 +87,7 @@ src/slic3r/GUI/UpdateDialogs.cpp src/slic3r/GUI/WipeTowerDialog.cpp src/slic3r/GUI/wxExtensions.cpp src/slic3r/Utils/AstroBox.cpp +src/slic3r/Utils/AppUpdater.cpp src/slic3r/Utils/Duet.cpp src/slic3r/Utils/FixModelByWin10.cpp src/slic3r/Utils/FlashAir.cpp @@ -90,6 +102,7 @@ src/libslic3r/ExtrusionEntity.cpp src/libslic3r/Flow.cpp src/libslic3r/Format/3mf.cpp src/libslic3r/Format/AMF.cpp +src/libslic3r/Format/SLAArchiveReader.cpp src/libslic3r/GCode/PostProcessor.cpp src/libslic3r/miniz_extension.cpp src/libslic3r/Preset.cpp @@ -102,3 +115,4 @@ src/libslic3r/PrintBase.cpp src/libslic3r/PrintConfig.cpp src/libslic3r/Zipper.cpp src/libslic3r/PrintObject.cpp +src/libslic3r/PrintObjectSlice.cpp diff --git a/resources/localization/nl/PrusaSlicer.mo b/resources/localization/nl/PrusaSlicer.mo index 097521c94d98dcdbbe2bab6afab0b64380cc630f..be157dac63c967f63e04871f9b1e4f482336f439 100644 GIT binary patch delta 129625 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 eQ#Er(#h, YEAR. +# msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-01 16:30+0100\n" -"PO-Revision-Date: 2021-12-14 09:56+0100\n" +"POT-Creation-Date: 2023-03-03 14:25+0100\n" +"PO-Revision-Date: 2022-09-27 15:39+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.0\n" -"X-Poedit-Basepath: .\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.1.1\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 +#: src/slic3r/GUI/AboutDialog.cpp:46 src/slic3r/GUI/AboutDialog.cpp:306 msgid "Portions copyright" msgstr "Gedeeltelijk auteursrecht" -#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 +#: src/slic3r/GUI/AboutDialog.cpp:143 src/slic3r/GUI/AboutDialog.cpp:270 msgid "Copyright" -msgstr "Copyright" +msgstr "Auteursrecht" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:143 +#: src/slic3r/GUI/AboutDialog.cpp:145 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -31,26 +35,26 @@ msgstr "" "Licentieovereenkomst van alle volgende programma's maken deel uit van de " "software-licentieovereenkomst" -#: src/slic3r/GUI/AboutDialog.cpp:212 +#: src/slic3r/GUI/AboutDialog.cpp:214 #, c-format, boost-format msgid "About %s" msgstr "Over %s" -#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 -#: src/slic3r/GUI/GUI_App.cpp:262 +#: src/slic3r/GUI/AboutDialog.cpp:245 src/slic3r/GUI/AboutDialog.cpp:370 +#: src/slic3r/GUI/GUI_App.cpp:271 msgid "Version" msgstr "Versie" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:277 msgid "is licensed under the" msgstr "is gelicenseerd onder de" -#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:273 src/slic3r/GUI/GUI_App.cpp:277 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero Algemene Publieke Licentie, versie 3" -#: src/slic3r/GUI/AboutDialog.cpp:273 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -58,7 +62,7 @@ msgstr "" "PrusaSlicer is gebaseerd op Slic3r van Alessandro Ranellucci en de RepRap-" "community." -#: src/slic3r/GUI/AboutDialog.cpp:274 +#: src/slic3r/GUI/AboutDialog.cpp:275 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -68,7 +72,7 @@ msgstr "" "Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik, Simon " "Tillema en vele anderen." -#: src/slic3r/GUI/AboutDialog.cpp:310 +#: src/slic3r/GUI/AboutDialog.cpp:311 msgid "Copy Version Info" msgstr "Kopieer versie-info" @@ -79,14 +83,14 @@ msgid "" "If you are sure you have enough RAM on your system, this may also be a bug " "and we would be glad if you reported it." msgstr "" -"Fout in %s. Mogelijk komt dit door een tekort aan RAM geheugen. Als u er " -"zeker van bent genoeg RAM geheugen te hebben, kan dit een andere oorzaak " -"hebben. We stellen het op prijs als u het aan ons rapporteert." +"%s heeft een fout opgelopen. Mogelijk komt dit door een tekort aan RAM " +"geheugen. Als u zeker weet genoeg RAM geheugen te hebben, kan dit een andere " +"oorzaak hebben. We stellen het op prijs als u het aan ons rapporteert." #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:84 #, boost-format msgid "PrusaSlicer has encountered a fatal error: \"%1%\"" -msgstr "" +msgstr "PrusaSlicer heeft een fatale fout opgelopen: \"%1%\"" #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:85 msgid "" @@ -97,54 +101,54 @@ msgstr "" "deze fout rapporteert." #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:162 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:204 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:188 msgid "Slicing complete" msgstr "Slicen gelukt" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:199 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183 #, boost-format msgid "Masked SLA file exported to %1%" msgstr "Gemaskeerd SLA bestand geëxporteerd naar %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:286 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:279 msgid "Access violation" msgstr "Toegangsschending" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:288 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:281 msgid "Illegal instruction" msgstr "Ongeldige instructie" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:283 msgid "Divide by zero" msgstr "Delen door nul" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:292 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:285 msgid "Overflow" msgstr "Overvloei" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:294 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:287 msgid "Underflow" msgstr "Ondervloei" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:297 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 msgid "Floating reserved operand" msgstr "Fout: floating reserved operand" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:300 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:293 msgid "Stack overflow" msgstr "Stack Overflow" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:659 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:726 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:652 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:719 msgid "Running post-processing scripts" msgstr "Uitvoeren van nabewerkingsscripts" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:690 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:710 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:683 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:703 msgid "Unknown error occured during exporting G-code." -msgstr "Onbekende error opgetreden tijdens exporteren van de G-code." +msgstr "Onbekende fout opgetreden tijdens exporteren van de G-code." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:695 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:688 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. Maybe the SD " @@ -155,7 +159,7 @@ msgstr "" "schrijven?\n" "Foutbericht: %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:698 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:691 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. There might be " @@ -166,7 +170,7 @@ msgstr "" "het doelapparaat. Probeer het opnieuw te exporteren of gebruik een ander " "apparat. De beschadigde G-code is opgeslagen als %1%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:701 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:694 #, boost-format msgid "" "Renaming of the G-code after copying to the selected destination folder has " @@ -175,7 +179,7 @@ msgstr "" "Fout bij het exporteren naar output-G-code. Hernoemen van het bestand " "mislukt. Huidige locatie is %1%.tmp. Probeer opnieuw te exporteren." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:704 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:697 #, boost-format msgid "" "Copying of the temporary G-code has finished but the original code at %1% " @@ -184,7 +188,7 @@ msgstr "" "Fout bij het exporteren naar output-G-code. Exporteren gelukt, maar kan het " "bestand %1% niet openen om te controleren. De output is %2%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:707 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:700 #, boost-format msgid "" "Copying of the temporary G-code has finished but the exported code couldn't " @@ -193,24 +197,25 @@ msgstr "" "Fout bij het exporteren naar output-G-code. Exporteren gelukt, maar kan het " "bestand niet openen om te controleren. De output is %1%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:715 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:708 #, boost-format msgid "G-code file exported to %1%" -msgstr "G-code-bestand geëxporteerd naar %1%" +msgstr ".gcode-bestand geëxporteerd naar %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:729 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:722 msgid "Copying of the temporary G-code to the output G-code failed" -msgstr "Fout bij het exporteren naar de output-G-code" +msgstr "Fout bij het exporteren naar output-G-code" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:751 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:738 #, boost-format msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" "Plannen van de upload naar '%1%'. Zie Venster -> printhost-uploadwachtrij" #: src/slic3r/GUI/BedShapeDialog.cpp:31 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2765 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1576 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:241 src/slic3r/GUI/Plater.cpp:220 +#: src/slic3r/GUI/Tab.cpp:2697 msgid "Size" msgstr "Grootte" @@ -218,7 +223,9 @@ msgstr "Grootte" msgid "Origin" msgstr "Nulpunt" -#: src/slic3r/GUI/BedShapeDialog.cpp:33 src/libslic3r/PrintConfig.cpp:1020 +#: src/slic3r/GUI/BedShapeDialog.cpp:33 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1994 +#: src/libslic3r/PrintConfig.cpp:1109 msgid "Diameter" msgstr "Diameter" @@ -233,54 +240,62 @@ msgid "" msgstr "" "Afstand van het nulpunt in de G-code naar de linkervoorhoek van het printbed." -#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:262 -#: src/slic3r/GUI/ConfigWizard.cpp:1476 src/slic3r/GUI/ConfigWizard.cpp:1490 +#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:291 +#: src/slic3r/GUI/ConfigWizard.cpp:1796 src/slic3r/GUI/ConfigWizard.cpp:1832 +#: src/slic3r/GUI/ConfigWizard.cpp:1846 #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:100 -#: src/slic3r/GUI/GCodeViewer.cpp:3181 src/slic3r/GUI/GCodeViewer.cpp:3187 -#: src/slic3r/GUI/GCodeViewer.cpp:3195 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 src/slic3r/GUI/GCodeViewer.cpp:3455 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 #: src/slic3r/GUI/GUI_ObjectLayers.cpp:145 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 src/libslic3r/PrintConfig.cpp:263 -#: src/libslic3r/PrintConfig.cpp:290 src/libslic3r/PrintConfig.cpp:297 -#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:520 -#: src/libslic3r/PrintConfig.cpp:546 src/libslic3r/PrintConfig.cpp:621 -#: src/libslic3r/PrintConfig.cpp:629 src/libslic3r/PrintConfig.cpp:679 -#: src/libslic3r/PrintConfig.cpp:813 src/libslic3r/PrintConfig.cpp:824 -#: src/libslic3r/PrintConfig.cpp:842 src/libslic3r/PrintConfig.cpp:1023 -#: src/libslic3r/PrintConfig.cpp:1235 src/libslic3r/PrintConfig.cpp:1302 -#: src/libslic3r/PrintConfig.cpp:1312 src/libslic3r/PrintConfig.cpp:1611 -#: src/libslic3r/PrintConfig.cpp:1805 src/libslic3r/PrintConfig.cpp:1866 -#: src/libslic3r/PrintConfig.cpp:1884 src/libslic3r/PrintConfig.cpp:1902 -#: src/libslic3r/PrintConfig.cpp:1965 src/libslic3r/PrintConfig.cpp:1975 -#: src/libslic3r/PrintConfig.cpp:2097 src/libslic3r/PrintConfig.cpp:2106 -#: src/libslic3r/PrintConfig.cpp:2125 src/libslic3r/PrintConfig.cpp:2146 -#: src/libslic3r/PrintConfig.cpp:2158 src/libslic3r/PrintConfig.cpp:2166 -#: src/libslic3r/PrintConfig.cpp:2207 src/libslic3r/PrintConfig.cpp:2215 -#: src/libslic3r/PrintConfig.cpp:2225 src/libslic3r/PrintConfig.cpp:2233 -#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2303 -#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2603 -#: src/libslic3r/PrintConfig.cpp:2620 src/libslic3r/PrintConfig.cpp:2721 -#: src/libslic3r/PrintConfig.cpp:2730 src/libslic3r/PrintConfig.cpp:2780 -#: src/libslic3r/PrintConfig.cpp:2932 src/libslic3r/PrintConfig.cpp:3020 -#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3034 -#: src/libslic3r/PrintConfig.cpp:3048 src/libslic3r/PrintConfig.cpp:3072 -#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3092 -#: src/libslic3r/PrintConfig.cpp:3372 src/libslic3r/PrintConfig.cpp:3413 -#: src/libslic3r/PrintConfig.cpp:3573 src/libslic3r/PrintConfig.cpp:3582 -#: src/libslic3r/PrintConfig.cpp:3591 src/libslic3r/PrintConfig.cpp:3601 -#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3676 -#: src/libslic3r/PrintConfig.cpp:3688 src/libslic3r/PrintConfig.cpp:3708 -#: src/libslic3r/PrintConfig.cpp:3718 src/libslic3r/PrintConfig.cpp:3728 -#: src/libslic3r/PrintConfig.cpp:3746 src/libslic3r/PrintConfig.cpp:3761 -#: src/libslic3r/PrintConfig.cpp:3775 src/libslic3r/PrintConfig.cpp:3786 -#: src/libslic3r/PrintConfig.cpp:3799 src/libslic3r/PrintConfig.cpp:3844 -#: src/libslic3r/PrintConfig.cpp:3854 src/libslic3r/PrintConfig.cpp:3863 -#: src/libslic3r/PrintConfig.cpp:3873 src/libslic3r/PrintConfig.cpp:3889 -#: src/libslic3r/PrintConfig.cpp:3913 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 src/libslic3r/PrintConfig.cpp:279 +#: src/libslic3r/PrintConfig.cpp:303 src/libslic3r/PrintConfig.cpp:310 +#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:657 src/libslic3r/PrintConfig.cpp:724 +#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:782 +#: src/libslic3r/PrintConfig.cpp:902 src/libslic3r/PrintConfig.cpp:913 +#: src/libslic3r/PrintConfig.cpp:931 src/libslic3r/PrintConfig.cpp:1112 +#: src/libslic3r/PrintConfig.cpp:1295 src/libslic3r/PrintConfig.cpp:1359 +#: src/libslic3r/PrintConfig.cpp:1369 src/libslic3r/PrintConfig.cpp:1650 +#: src/libslic3r/PrintConfig.cpp:1842 src/libslic3r/PrintConfig.cpp:1903 +#: src/libslic3r/PrintConfig.cpp:1921 src/libslic3r/PrintConfig.cpp:1939 +#: src/libslic3r/PrintConfig.cpp:1995 src/libslic3r/PrintConfig.cpp:2005 +#: src/libslic3r/PrintConfig.cpp:2127 src/libslic3r/PrintConfig.cpp:2136 +#: src/libslic3r/PrintConfig.cpp:2155 src/libslic3r/PrintConfig.cpp:2176 +#: src/libslic3r/PrintConfig.cpp:2188 src/libslic3r/PrintConfig.cpp:2196 +#: src/libslic3r/PrintConfig.cpp:2237 src/libslic3r/PrintConfig.cpp:2245 +#: src/libslic3r/PrintConfig.cpp:2255 src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2271 src/libslic3r/PrintConfig.cpp:2336 +#: src/libslic3r/PrintConfig.cpp:2565 src/libslic3r/PrintConfig.cpp:2632 +#: src/libslic3r/PrintConfig.cpp:2647 src/libslic3r/PrintConfig.cpp:2746 +#: src/libslic3r/PrintConfig.cpp:2755 src/libslic3r/PrintConfig.cpp:2801 +#: src/libslic3r/PrintConfig.cpp:2886 src/libslic3r/PrintConfig.cpp:2896 +#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3108 +#: src/libslic3r/PrintConfig.cpp:3115 src/libslic3r/PrintConfig.cpp:3122 +#: src/libslic3r/PrintConfig.cpp:3136 src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3170 src/libslic3r/PrintConfig.cpp:3180 +#: src/libslic3r/PrintConfig.cpp:3330 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3391 src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3444 src/libslic3r/PrintConfig.cpp:3456 +#: src/libslic3r/PrintConfig.cpp:3476 src/libslic3r/PrintConfig.cpp:3491 +#: src/libslic3r/PrintConfig.cpp:3501 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3681 src/libslic3r/PrintConfig.cpp:3878 +#: src/libslic3r/PrintConfig.cpp:3893 src/libslic3r/PrintConfig.cpp:3907 +#: src/libslic3r/PrintConfig.cpp:3918 src/libslic3r/PrintConfig.cpp:3931 +#: src/libslic3r/PrintConfig.cpp:3976 src/libslic3r/PrintConfig.cpp:3986 +#: src/libslic3r/PrintConfig.cpp:3995 src/libslic3r/PrintConfig.cpp:4005 +#: src/libslic3r/PrintConfig.cpp:4021 src/libslic3r/PrintConfig.cpp:4045 +#: src/libslic3r/PrintConfig.cpp:4072 msgid "mm" msgstr "mm" @@ -300,13 +315,13 @@ msgstr "Rechthoekig" msgid "Circular" msgstr "Rond" -#: src/slic3r/GUI/BedShapeDialog.cpp:81 src/slic3r/GUI/GUI_Preview.cpp:252 -#: src/libslic3r/ExtrusionEntity.cpp:343 src/libslic3r/ExtrusionEntity.cpp:378 +#: src/slic3r/GUI/BedShapeDialog.cpp:81 msgid "Custom" msgstr "Aangepast" #: src/slic3r/GUI/BedShapeDialog.cpp:104 src/slic3r/GUI/BedShapeDialog.cpp:179 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1701 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1565 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1798 msgid "Shape" msgstr "Vorm" @@ -314,8 +329,8 @@ msgstr "Vorm" msgid "Load shape from STL..." msgstr "Laad vorm van STL..." -#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2147 +#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3914 +#: src/slic3r/GUI/MainFrame.cpp:2240 msgid "Settings" msgstr "Instellingen" @@ -328,7 +343,7 @@ msgid "Load..." msgstr "Laad..." #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/Tab.cpp:3973 msgid "Remove" msgstr "Verwijder" @@ -340,79 +355,122 @@ msgstr "Niet gevonden:" msgid "Model" msgstr "Model" -#: src/slic3r/GUI/BedShapeDialog.cpp:508 +#: src/slic3r/GUI/BedShapeDialog.cpp:506 msgid "Choose an STL file to import bed shape from:" -msgstr "Kies een STL-bestand om te importeren als bedvorm:" +msgstr "Kies een .STL-bestand om te importeren als bedvorm:" -#: src/slic3r/GUI/BedShapeDialog.cpp:514 src/slic3r/GUI/BedShapeDialog.cpp:562 -#: src/slic3r/GUI/BedShapeDialog.cpp:584 +#: src/slic3r/GUI/BedShapeDialog.cpp:512 src/slic3r/GUI/BedShapeDialog.cpp:560 +#: src/slic3r/GUI/BedShapeDialog.cpp:582 msgid "Invalid file format." msgstr "Ongeldig bestandsformaat." -#: src/slic3r/GUI/BedShapeDialog.cpp:525 +#: src/slic3r/GUI/BedShapeDialog.cpp:523 msgid "Error! Invalid model" msgstr "Fout! Ongeldig model" -#: src/slic3r/GUI/BedShapeDialog.cpp:533 +#: src/slic3r/GUI/BedShapeDialog.cpp:531 msgid "The selected file contains no geometry." msgstr "Het geselecteerde bestand bevat geen geometrie." -#: src/slic3r/GUI/BedShapeDialog.cpp:537 +#: src/slic3r/GUI/BedShapeDialog.cpp:535 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "" "Het geselecteerde model bevat meerdere losse delen. Dit wordt niet " "ondersteund." -#: src/slic3r/GUI/BedShapeDialog.cpp:552 +#: src/slic3r/GUI/BedShapeDialog.cpp:550 msgid "Choose a file to import bed texture from (PNG/SVG):" msgstr "Kies een bestand om te importeren als bedtextuur (PNG/SVG):" -#: src/slic3r/GUI/BedShapeDialog.cpp:574 +#: src/slic3r/GUI/BedShapeDialog.cpp:572 msgid "Choose an STL file to import bed model from:" -msgstr "Kies een STL-bestand om te importeren als bedvorm:" +msgstr "Kies een .STL-bestand om te importeren als bedvorm:" -#: src/slic3r/GUI/BedShapeDialog.hpp:95 src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/BedShapeDialog.hpp:96 src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape" msgstr "Bedvorm" -#: src/slic3r/GUI/BonjourDialog.cpp:55 +#: src/slic3r/GUI/BonjourDialog.cpp:58 msgid "Network lookup" msgstr "Netwerk zoeken" -#: src/slic3r/GUI/BonjourDialog.cpp:72 +#: src/slic3r/GUI/BonjourDialog.cpp:75 src/slic3r/GUI/BonjourDialog.cpp:253 msgid "Address" msgstr "Adres" -#: src/slic3r/GUI/BonjourDialog.cpp:73 +#: src/slic3r/GUI/BonjourDialog.cpp:76 msgid "Hostname" msgstr "Hostnaam" -#: src/slic3r/GUI/BonjourDialog.cpp:74 +#: src/slic3r/GUI/BonjourDialog.cpp:77 msgid "Service name" msgstr "Servicenaam" -#: src/slic3r/GUI/BonjourDialog.cpp:76 +#: src/slic3r/GUI/BonjourDialog.cpp:79 msgid "OctoPrint version" msgstr "OctoPrint-versie" -#: src/slic3r/GUI/BonjourDialog.cpp:224 +#: src/slic3r/GUI/BonjourDialog.cpp:227 msgid "Searching for devices" msgstr "Zoeken naar apparaten" -#: src/slic3r/GUI/BonjourDialog.cpp:231 +#: src/slic3r/GUI/BonjourDialog.cpp:234 msgid "Finished" -msgstr "Klaar" +msgstr "Gereed" + +#: src/slic3r/GUI/BonjourDialog.cpp:240 +msgid "Multiple resolved IP addresses" +msgstr "" + +#: src/slic3r/GUI/BonjourDialog.cpp:249 +#, boost-format +msgid "" +"There are several IP addresses resolving to hostname %1%.\n" +"Please select one that should be used." +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:21 +msgid "Palette 1 (default)" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:22 +msgid "Palette 2" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:23 +msgid "Palette 3" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:24 +msgid "Palette 4" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:25 +msgid "Palette 5" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:26 +msgid "Palette 6" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:27 +msgid "Palette 7" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:28 +msgid "Palette 8" +msgstr "" -#: src/slic3r/GUI/ButtonsDescription.cpp:42 +#: src/slic3r/GUI/ButtonsDescription.cpp:112 msgid "Revert color to default" msgstr "Zet kleur terug op standaard" -#: src/slic3r/GUI/ButtonsDescription.cpp:57 +#: src/slic3r/GUI/ButtonsDescription.cpp:127 msgid "Value is the same as the system value" msgstr "Waarde is niet gelijk aan systeemwaarde" -#: src/slic3r/GUI/ButtonsDescription.cpp:58 +#: src/slic3r/GUI/ButtonsDescription.cpp:128 msgid "" "Value was changed and is not equal to the system value or the last saved " "preset" @@ -420,11 +478,35 @@ msgstr "" "Waarde is veranderd en niet gelijk aan systeemwaarde of laatst opgeslagen " "preset" -#: src/slic3r/GUI/ButtonsDescription.cpp:62 +#: src/slic3r/GUI/ButtonsDescription.cpp:155 +msgid "Default palette for mode markers" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2422 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Simple" +msgstr "Eenvoudig" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2424 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgctxt "Mode" +msgid "Advanced" +msgstr "Geavanceerd" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2425 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Expert" +msgstr "Expert" + +#: src/slic3r/GUI/ButtonsDescription.cpp:182 +msgid "Revert color" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:200 msgid "Buttons And Text Colors Description" msgstr "Knoppen- en tekstkleurbeschrijving" -#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/ConfigManipulation.cpp:50 msgid "" "Layer height is not valid.\n" "\n" @@ -434,13 +516,13 @@ msgstr "" "\n" "De laagdikte wordt ingesteld op 0,01." -#: src/slic3r/GUI/ConfigManipulation.cpp:50 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1449 -#: src/libslic3r/PrintConfig.cpp:286 +#: src/slic3r/GUI/ConfigManipulation.cpp:51 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1394 +#: src/libslic3r/PrintConfig.cpp:299 msgid "Layer height" msgstr "Laagdikte" -#: src/slic3r/GUI/ConfigManipulation.cpp:61 +#: src/slic3r/GUI/ConfigManipulation.cpp:62 msgid "" "First layer height is not valid.\n" "\n" @@ -450,7 +532,7 @@ msgstr "" "\n" "De laagdikte wordt ingesteld op 0,01." -#: src/slic3r/GUI/ConfigManipulation.cpp:62 src/libslic3r/PrintConfig.cpp:1231 +#: src/slic3r/GUI/ConfigManipulation.cpp:63 src/libslic3r/PrintConfig.cpp:1291 msgid "First layer height" msgstr "Laagdikte eerste laag" @@ -461,7 +543,6 @@ msgid "" "- no top solid layers\n" "- 0% fill density\n" "- no support material\n" -"- Ensure vertical shell thickness enabled\n" "- Detect thin walls disabled" msgstr "" "De spiraalmodus vereist:\n" @@ -469,56 +550,53 @@ msgstr "" "- geen dichte toplagen\n" "- 0% vullingsdichtheid\n" "- geen supportmateriaal\n" -"- 'Garandeer verticale shelldikte' aan\n" "- 'Detecteer dunne wanden' uit" -#: src/slic3r/GUI/ConfigManipulation.cpp:90 +#: src/slic3r/GUI/ConfigManipulation.cpp:89 msgid "Shall I adjust those settings in order to enable Spiral Vase?" msgstr "" "Moeten deze instellingen aangepast worden om de spiraalmodus te activeren?" -#: src/slic3r/GUI/ConfigManipulation.cpp:91 +#: src/slic3r/GUI/ConfigManipulation.cpp:90 msgid "Spiral Vase" msgstr "Spiraalmodus" -#: src/slic3r/GUI/ConfigManipulation.cpp:121 +#: src/slic3r/GUI/ConfigManipulation.cpp:123 msgid "" -"The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool " -"change.\n" -"(both support_material_extruder and support_material_interface_extruder need " -"to be set to 0)." +"For the Wipe Tower to work with the soluble supports, the support layers\n" +"need to be synchronized with the object layers." msgstr "" -"Het afveegblok ondersteunt voorlopig alleen onoplosbaar supportmateriaal\n" -"als ze met de huidige extruder worden geprint zonder toolwisseling.\n" -"(zowel support_material_extruder als support_material_interface_extruder " -"moet op 0 staan)." +"De supportlagen moeten gesynchroniseerd worden om oplosbaar support\n" +"met het afveegblok te laten werken." -#: src/slic3r/GUI/ConfigManipulation.cpp:125 -msgid "Shall I adjust those settings in order to enable the Wipe Tower?" +#: src/slic3r/GUI/ConfigManipulation.cpp:126 +msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" msgstr "" -"Moeten deze instellingen aangepast worden om het afveegblok te activeren?" +"Moeten de supportlagen gesynchroniseerd worden met de overige lagen om het " +"afveegblok te activeren?" -#: src/slic3r/GUI/ConfigManipulation.cpp:126 -#: src/slic3r/GUI/ConfigManipulation.cpp:146 +#: src/slic3r/GUI/ConfigManipulation.cpp:127 +#: src/slic3r/GUI/ConfigManipulation.cpp:145 msgid "Wipe Tower" msgstr "Afveegblok" -#: src/slic3r/GUI/ConfigManipulation.cpp:142 +#: src/slic3r/GUI/ConfigManipulation.cpp:140 src/libslic3r/Print.cpp:672 msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers\n" -"need to be synchronized with the object layers." +"The Wipe Tower currently supports the non-soluble supports only if they are " +"printed with the current extruder without triggering a tool change. (both " +"support_material_extruder and support_material_interface_extruder need to be " +"set to 0)." msgstr "" -"De supportlagen moeten gesynchroniseerd worden om oplosbaar support\n" -"met het afveegblok te laten werken." +"Het afveegblok ondersteunt alleen niet-oplosbaar support als dat geprint " +"worden met de huidige extruder zonder toolwissel (Zet zowel " +"'support_material_extruder' en 'support_material_interface_extruder' op 0)." -#: src/slic3r/GUI/ConfigManipulation.cpp:145 -msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" +#: src/slic3r/GUI/ConfigManipulation.cpp:144 +msgid "Shall I adjust those settings in order to enable the Wipe Tower?" msgstr "" -"Moeten de supportlagen gesynchroniseerd worden met de overage lagen om het " -"afveegblok te activeren?" +"Moeten deze instellingen aangepast worden om het afveegblok te activeren?" -#: src/slic3r/GUI/ConfigManipulation.cpp:164 +#: src/slic3r/GUI/ConfigManipulation.cpp:166 msgid "" "Supports work better, if the following feature is enabled:\n" "- Detect bridging perimeters" @@ -526,185 +604,189 @@ msgstr "" "Support werkt beter als de volgende instellingen zijn geactiveerd:\n" "- \"Detecteer brugperimeters\"" -#: src/slic3r/GUI/ConfigManipulation.cpp:167 +#: src/slic3r/GUI/ConfigManipulation.cpp:169 msgid "Shall I adjust those settings for supports?" msgstr "" "Moeten deze instellingen aangepast worden om supportmateriaal te activeren?" -#: src/slic3r/GUI/ConfigManipulation.cpp:168 +#: src/slic3r/GUI/ConfigManipulation.cpp:170 msgid "Support Generator" msgstr "Supportgenerator" -#: src/slic3r/GUI/ConfigManipulation.cpp:195 +#: src/slic3r/GUI/ConfigManipulation.cpp:194 #, boost-format msgid "The %1% infill pattern is not supposed to work at 100%% density." msgstr "Het %1% vullingspatroon wordt niet ondersteunt bij 100%% dichtheid." -#: src/slic3r/GUI/ConfigManipulation.cpp:198 +#: src/slic3r/GUI/ConfigManipulation.cpp:196 msgid "Shall I switch to rectilinear fill pattern?" msgstr "Moet dit aangepast worden naar het rechtlijnig patroon?" -#: src/slic3r/GUI/ConfigManipulation.cpp:199 +#: src/slic3r/GUI/ConfigManipulation.cpp:197 #: src/slic3r/GUI/GUI_Factories.cpp:55 src/slic3r/GUI/GUI_Factories.cpp:128 -#: src/slic3r/GUI/Plater.cpp:460 src/slic3r/GUI/Tab.cpp:1503 -#: src/slic3r/GUI/Tab.cpp:1505 src/libslic3r/PrintConfig.cpp:475 -#: src/libslic3r/PrintConfig.cpp:716 src/libslic3r/PrintConfig.cpp:743 -#: src/libslic3r/PrintConfig.cpp:1098 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1149 src/libslic3r/PrintConfig.cpp:1398 -#: src/libslic3r/PrintConfig.cpp:1427 src/libslic3r/PrintConfig.cpp:1496 -#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1535 -#: src/libslic3r/PrintConfig.cpp:2364 src/libslic3r/PrintConfig.cpp:2381 +#: src/slic3r/GUI/Plater.cpp:468 src/slic3r/GUI/Tab.cpp:1450 +#: src/slic3r/GUI/Tab.cpp:1452 src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:811 src/libslic3r/PrintConfig.cpp:831 +#: src/libslic3r/PrintConfig.cpp:1187 src/libslic3r/PrintConfig.cpp:1200 +#: src/libslic3r/PrintConfig.cpp:1225 src/libslic3r/PrintConfig.cpp:1444 +#: src/libslic3r/PrintConfig.cpp:1473 src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1557 src/libslic3r/PrintConfig.cpp:1576 +#: src/libslic3r/PrintConfig.cpp:2395 src/libslic3r/PrintConfig.cpp:2412 msgid "Infill" msgstr "Vulling" -#: src/slic3r/GUI/ConfigManipulation.cpp:337 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Head penetration should not be greater than the head width." msgstr "Koppenetratie mag niet groter zijn dan de kopbreedte." -#: src/slic3r/GUI/ConfigManipulation.cpp:339 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid Head penetration" msgstr "Ongeldige koppenetratie" -#: src/slic3r/GUI/ConfigManipulation.cpp:350 +#: src/slic3r/GUI/ConfigManipulation.cpp:362 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "Pinkopdiameter moet kleiner zijn dan de pijlerdiameter." -#: src/slic3r/GUI/ConfigManipulation.cpp:352 +#: src/slic3r/GUI/ConfigManipulation.cpp:364 msgid "Invalid pinhead diameter" msgstr "Ongeldige pinkopdiameter" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20 msgid "Upgrade" msgstr "Upgrade" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22 msgid "Downgrade" msgstr "Downgrade" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 msgid "Before roll back" msgstr "Voor terugrollen" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:340 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:26 src/libslic3r/PrintConfig.cpp:353 msgid "User" msgstr "Gebruiker" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:329 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:29 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1135 msgid "Unknown" msgstr "Onbekend" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 msgid "Active" msgstr "Actief" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 msgid "PrusaSlicer version" msgstr "PrusaSlicer versie" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 src/libslic3r/Preset.cpp:1341 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 src/libslic3r/Preset.cpp:1480 msgid "print" msgstr "print" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:65 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 msgid "filaments" msgstr "filamenten" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 src/libslic3r/Preset.cpp:1343 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:67 src/libslic3r/Preset.cpp:1482 msgid "SLA print" msgstr "SLA-print" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69 -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/slic3r/GUI/GUI.cpp:340 -#: src/slic3r/GUI/Plater.cpp:821 src/libslic3r/Preset.cpp:1344 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/slic3r/GUI/GUI.cpp:331 +#: src/slic3r/GUI/Plater.cpp:851 src/libslic3r/Preset.cpp:1483 msgid "SLA material" msgstr "SLA-materiaal" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:71 src/libslic3r/Preset.cpp:1345 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 src/libslic3r/Preset.cpp:1484 msgid "printer" msgstr "printer" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 src/slic3r/GUI/Tab.cpp:1366 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 src/slic3r/GUI/Tab.cpp:1311 msgid "vendor" msgstr "leverancier" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 msgid "version" msgstr "versie" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:76 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 msgid "min PrusaSlicer version" msgstr "min. PrusaSlicer versie" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:77 msgid "max PrusaSlicer version" msgstr "max. PrusaSlicer versie" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "model" msgstr "model" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "variants" msgstr "varianten" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:93 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:92 #, c-format, boost-format msgid "Incompatible with this %s" -msgstr "Niet geschikt voor deze %s" +msgstr "Niet compatibel met deze %s" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:96 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:95 msgid "Activate" msgstr "Activeer" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:123 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:122 msgid "Configuration Snapshots" msgstr "Configuratieopnamen" -#: src/slic3r/GUI/ConfigWizard.cpp:262 +#: src/slic3r/GUI/ConfigWizard.cpp:291 msgid "nozzle" msgstr "nozzle" -#: src/slic3r/GUI/ConfigWizard.cpp:266 +#: src/slic3r/GUI/ConfigWizard.cpp:295 msgid "Alternate nozzles:" msgstr "Overige nozzles:" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "All standard" msgstr "Alle standaard" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "Standard" msgstr "Standaard" -#: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3833 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 +#: src/slic3r/GUI/ConfigWizard.cpp:360 src/slic3r/GUI/ConfigWizard.cpp:681 +#: src/slic3r/GUI/FileArchiveDialog.cpp:261 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 src/slic3r/GUI/Preferences.cpp:550 +#: src/slic3r/GUI/Tab.cpp:4058 src/slic3r/GUI/UnsavedChangesDialog.cpp:1161 msgid "All" msgstr "Alles" -#: src/slic3r/GUI/ConfigWizard.cpp:332 src/slic3r/GUI/ConfigWizard.cpp:652 -#: src/slic3r/GUI/DoubleSlider.cpp:2030 src/slic3r/GUI/Plater.cpp:432 -#: src/slic3r/GUI/Plater.cpp:579 src/slic3r/GUI/Preferences.cpp:436 -#: src/libslic3r/PrintConfig.cpp:1291 +#: src/slic3r/GUI/ConfigWizard.cpp:361 src/slic3r/GUI/ConfigWizard.cpp:682 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 +#: src/slic3r/GUI/FileArchiveDialog.cpp:265 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1984 src/slic3r/GUI/Plater.cpp:439 +#: src/slic3r/GUI/Plater.cpp:594 src/slic3r/GUI/Preferences.cpp:552 +#: src/libslic3r/PrintConfig.cpp:1347 msgid "None" msgstr "Geen" -#: src/slic3r/GUI/ConfigWizard.cpp:484 +#: src/slic3r/GUI/ConfigWizard.cpp:513 #, c-format, boost-format msgid "Welcome to the %s Configuration Assistant" msgstr "Welkom bij de %s configuratie-assistent" -#: src/slic3r/GUI/ConfigWizard.cpp:486 +#: src/slic3r/GUI/ConfigWizard.cpp:515 #, c-format, boost-format msgid "Welcome to the %s Configuration Wizard" msgstr "Welkom bij de %s configuratie-assistent" -#: src/slic3r/GUI/ConfigWizard.cpp:488 +#: src/slic3r/GUI/ConfigWizard.cpp:517 msgid "Welcome" msgstr "Welkom" -#: src/slic3r/GUI/ConfigWizard.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:519 #, c-format, boost-format msgid "" "Hello, welcome to %s! This %s helps you with the initial configuration; just " @@ -713,68 +795,79 @@ msgstr "" "Hallo, welkom bij %s! Deze %s helpt u bij de eerste configuratie; nog een " "paar stappen te gaan en u bent klaar om te printen." -#: src/slic3r/GUI/ConfigWizard.cpp:495 +#: src/slic3r/GUI/ConfigWizard.cpp:524 msgid "Remove user profiles (a snapshot will be taken beforehand)" -msgstr "Verwijder gebruikersprofielen (vooraf wordt een opname gemaakt)" +msgstr "Verwijder gebruikersprofielen (vooraf wordt een snapshot gemaakt)" -#: src/slic3r/GUI/ConfigWizard.cpp:498 +#: src/slic3r/GUI/ConfigWizard.cpp:527 msgid "" "Perform desktop integration (Sets this binary to be searchable by the " "system)." msgstr "" -"Voer desktopintegratie uit (stel in op binary om zodat deze door het systeem " -"bezocht kan worden)." +"Voer desktopintegratie uit (stel in op binair zodat deze door het systeem " +"gezocht kan worden)." -#: src/slic3r/GUI/ConfigWizard.cpp:550 +#: src/slic3r/GUI/ConfigWizard.cpp:579 #, c-format, boost-format msgid "%s Family" msgstr "%s serie" -#: src/slic3r/GUI/ConfigWizard.cpp:640 +#: src/slic3r/GUI/ConfigWizard.cpp:670 msgid "Printer:" msgstr "Printer:" -#: src/slic3r/GUI/ConfigWizard.cpp:642 +#: src/slic3r/GUI/ConfigWizard.cpp:672 msgid "Vendor:" msgstr "Leverancier:" -#: src/slic3r/GUI/ConfigWizard.cpp:643 +#: src/slic3r/GUI/ConfigWizard.cpp:673 msgid "Profile:" msgstr "Profiel:" -#: src/slic3r/GUI/ConfigWizard.cpp:720 src/slic3r/GUI/ConfigWizard.cpp:892 -#: src/slic3r/GUI/ConfigWizard.cpp:952 src/slic3r/GUI/ConfigWizard.cpp:1088 +#: src/slic3r/GUI/ConfigWizard.cpp:750 src/slic3r/GUI/ConfigWizard.cpp:938 +#: src/slic3r/GUI/ConfigWizard.cpp:1024 src/slic3r/GUI/ConfigWizard.cpp:1163 msgid "(All)" msgstr "(Alles)" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:754 src/slic3r/GUI/ConfigWizard.cpp:1165 +msgid "(Templates)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:789 #, boost-format msgid "" -"%1% marked with * are not compatible with some installed " -"printers." +"%1% visible for (\"Template\") printer are universal profiles " +"available for all printers. These might not be compatible with your printer." msgstr "" -"%1% gemarkeerd met * zijn niet compatibel met sommige " -"geïnstalleerde printers." -#: src/slic3r/GUI/ConfigWizard.cpp:752 src/slic3r/GUI/ConfigWizard.cpp:2043 -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filaments" msgstr "Filamenten" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 msgid "SLA materials" msgstr "SLA materialen" -#: src/slic3r/GUI/ConfigWizard.cpp:755 +#: src/slic3r/GUI/ConfigWizard.cpp:791 +#, boost-format +msgid "" +"%1% marked with * are not compatible with some installed " +"printers." +msgstr "" +"%1% gemarkeerd met * zijn niet compatibel met sommige " +"geïnstalleerde printers." + +#: src/slic3r/GUI/ConfigWizard.cpp:794 #, boost-format msgid "All installed printers are compatible with the selected %1%." msgstr "Alle geïnstalleerde printers zijn compatibel met de geselecteerde %1%." -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/libslic3r/Preset.cpp:1342 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/libslic3r/Preset.cpp:1481 msgid "filament" msgstr "filament" -#: src/slic3r/GUI/ConfigWizard.cpp:778 +#: src/slic3r/GUI/ConfigWizard.cpp:818 msgid "" "Only the following installed printers are compatible with the selected " "filaments" @@ -782,7 +875,7 @@ msgstr "" "Alleen de volgende geïnstalleerde printers zijn compatibel met de " "geselecteerde filamenten" -#: src/slic3r/GUI/ConfigWizard.cpp:779 +#: src/slic3r/GUI/ConfigWizard.cpp:819 msgid "" "Only the following installed printers are compatible with the selected SLA " "materials" @@ -790,35 +883,53 @@ msgstr "" "Alleen de volgende geïnstalleerde printers zijn compatibel met de " "geselecteerde SLA materialen" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1213 +msgid "" +"You have selected template filament. Please note that these filaments are " +"available for all printers but are NOT certain to be compatible with your " +"printer. Do you still wish to have this filament selected?\n" +"(This message won't be displayed again.)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1214 src/slic3r/GUI/ConfigWizard.cpp:2720 +#: src/slic3r/GUI/ConfigWizard.cpp:2860 src/slic3r/GUI/DoubleSlider.cpp:2591 +#: src/slic3r/GUI/DoubleSlider.cpp:2612 src/slic3r/GUI/GUI.cpp:245 +#: src/slic3r/GUI/GUI_App.cpp:3458 src/slic3r/GUI/UpdateDialogs.cpp:204 +#: src/slic3r/GUI/UpdateDialogs.cpp:212 src/slic3r/GUI/UpdateDialogs.cpp:217 +#: src/slic3r/GUI/UpdateDialogs.cpp:222 src/slic3r/GUI/UpdateDialogs.cpp:229 +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +msgid "Notice" +msgstr "Let op" + +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer Setup" msgstr "Custom printersetup" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer" msgstr "Custom printer" -#: src/slic3r/GUI/ConfigWizard.cpp:1177 +#: src/slic3r/GUI/ConfigWizard.cpp:1264 msgid "Define a custom printer profile" msgstr "Definieer een custom printerprofiel" -#: src/slic3r/GUI/ConfigWizard.cpp:1179 +#: src/slic3r/GUI/ConfigWizard.cpp:1265 msgid "Custom profile name:" msgstr "Custom profielnaam:" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Automatic updates" msgstr "Automatische updates" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Updates" msgstr "Updates" -#: src/slic3r/GUI/ConfigWizard.cpp:1214 +#: src/slic3r/GUI/ConfigWizard.cpp:1290 msgid "Check for application updates" msgstr "Controleer op programma-updates" -#: src/slic3r/GUI/ConfigWizard.cpp:1218 +#: src/slic3r/GUI/ConfigWizard.cpp:1294 #, c-format, boost-format msgid "" "If enabled, %s checks for new application versions online. When a new " @@ -826,15 +937,15 @@ msgid "" "application startup (never during program usage). This is only a " "notification mechanisms, no automatic installation is done." msgstr "" -"%s controleert op nieuwe versie online als dit is geactiveerd. Als een " +"%s controleert naar nieuwe versies online als dit is ingeschakeld. Als een " "nieuwe versie beschikbaar komt, wordt bij de volgende keer opstarten een " "melding getoond (nooit tijdens gebruik). Dit is slechts een melding." -#: src/slic3r/GUI/ConfigWizard.cpp:1224 src/slic3r/GUI/Preferences.cpp:175 +#: src/slic3r/GUI/ConfigWizard.cpp:1300 src/slic3r/GUI/Preferences.cpp:306 msgid "Update built-in Presets automatically" msgstr "Update ingebouwde presets automatisch" -#: src/slic3r/GUI/ConfigWizard.cpp:1228 +#: src/slic3r/GUI/ConfigWizard.cpp:1304 #, c-format, boost-format msgid "" "If enabled, %s downloads updates of built-in system presets in the " @@ -842,12 +953,12 @@ msgid "" "When a new preset version becomes available it is offered at application " "startup." msgstr "" -"%s download updates op ingebouwde presets in de achtergrond als dit is " -"geactiveerd. De updates worden in een tijdelijke locatie opgeslagen. Wanneer " +"Als dit aanstaat download %s updates op ingebouwde presets in de " +"achtergrond. De updates worden in een tijdelijke locatie opgeslagen. Wanneer " "een nieuwe preset beschikbaar komt, wordt een melding getoond tijdens het " "opstarten." -#: src/slic3r/GUI/ConfigWizard.cpp:1231 +#: src/slic3r/GUI/ConfigWizard.cpp:1307 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." @@ -855,7 +966,7 @@ msgstr "" "Updates worden nooit toegepast zonder toestemming van de gebruiker en zullen " "nooit aangepaste instellingen overschrijven." -#: src/slic3r/GUI/ConfigWizard.cpp:1236 +#: src/slic3r/GUI/ConfigWizard.cpp:1312 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." @@ -863,18 +974,63 @@ msgstr "" "Daarnaast wordt een backup-opname van de hele configuratie gemaakt voor een " "update wordt toegepast." -#: src/slic3r/GUI/ConfigWizard.cpp:1243 src/slic3r/GUI/GUI_Factories.cpp:726 -#: src/slic3r/GUI/Plater.cpp:3582 +#: src/slic3r/GUI/ConfigWizard.cpp:1361 src/slic3r/GUI/Preferences.cpp:1076 +msgid "Download path" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1366 src/slic3r/GUI/FirmwareDialog.cpp:815 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:300 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +msgid "Browse" +msgstr "Zoek" + +#: src/slic3r/GUI/ConfigWizard.cpp:1371 +msgid "Choose folder:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads from URL" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1417 +msgid "Allow built-in downloader" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1424 +#, c-format, boost-format +msgid "" +"If enabled, %s registers to start on custom URL on www.printables.com. You " +"will be able to use button with %s logo to open models in this %s. The model " +"will be downloaded into folder you choose bellow." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1431 +msgid "" +"On Linux systems the process of registration also creates desktop " +"integration files for this version of application." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1458 +msgid "Chosen directory for downloads does not Exists." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1545 src/slic3r/GUI/GUI_Factories.cpp:810 +#: src/slic3r/GUI/Plater.cpp:3732 msgid "Reload from disk" msgstr "Herlaad van schijf" -#: src/slic3r/GUI/ConfigWizard.cpp:1246 +#: src/slic3r/GUI/ConfigWizard.cpp:1548 msgid "" "Export full pathnames of models and parts sources into 3mf and amf files" msgstr "" -"Exporteer volledige padnaam van modellen en bronnen in 3MF en AMF bestanden" +"Exporteer volledige padnaam van modellen en bronnen in .3MF- en .AMF-" +"bestanden" -#: src/slic3r/GUI/ConfigWizard.cpp:1250 +#: src/slic3r/GUI/ConfigWizard.cpp:1552 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked.\n" @@ -882,27 +1038,27 @@ msgid "" "using an open file dialog." msgstr "" "Sta toe om bestanden automatisch te vinden bij het herladen van de schijf " -"als dit is geactiveerd.\n" +"als dit is ingeschakeld.\n" "Als dit niet is geactiveerd vraagt het programma elke bestand apart te " "selecteren." -#: src/slic3r/GUI/ConfigWizard.cpp:1259 +#: src/slic3r/GUI/ConfigWizard.cpp:1561 msgid "Files association" msgstr "Bestandsassociatie" -#: src/slic3r/GUI/ConfigWizard.cpp:1261 src/slic3r/GUI/Preferences.cpp:157 +#: src/slic3r/GUI/ConfigWizard.cpp:1563 src/slic3r/GUI/Preferences.cpp:292 msgid "Associate .3mf files to PrusaSlicer" -msgstr "Open .3mf-bestanden met PrusaSlicer" +msgstr "Open .3MF-bestanden met PrusaSlicer" -#: src/slic3r/GUI/ConfigWizard.cpp:1262 src/slic3r/GUI/Preferences.cpp:164 +#: src/slic3r/GUI/ConfigWizard.cpp:1564 src/slic3r/GUI/Preferences.cpp:297 msgid "Associate .stl files to PrusaSlicer" -msgstr "Open .stl-bestanden met PrusaSlicer" +msgstr "Open .STL-bestanden met PrusaSlicer" -#: src/slic3r/GUI/ConfigWizard.cpp:1272 +#: src/slic3r/GUI/ConfigWizard.cpp:1574 msgid "View mode" msgstr "Toon modus" -#: src/slic3r/GUI/ConfigWizard.cpp:1274 +#: src/slic3r/GUI/ConfigWizard.cpp:1576 msgid "" "PrusaSlicer's user interfaces comes in three variants:\n" "Simple, Advanced, and Expert.\n" @@ -916,82 +1072,96 @@ msgstr "" "De andere twee tonen meer geavanceerdere instellingen voor het fine-tunen. " "Ze zijn van toepassing voor respectievelijk experts en gevorderden." -#: src/slic3r/GUI/ConfigWizard.cpp:1279 +#: src/slic3r/GUI/ConfigWizard.cpp:1581 msgid "Simple mode" msgstr "Eenvoudige modus" -#: src/slic3r/GUI/ConfigWizard.cpp:1280 +#: src/slic3r/GUI/ConfigWizard.cpp:1582 msgid "Advanced mode" msgstr "Geavanceerde modus" -#: src/slic3r/GUI/ConfigWizard.cpp:1281 +#: src/slic3r/GUI/ConfigWizard.cpp:1583 msgid "Expert mode" msgstr "Expertmodus" -#: src/slic3r/GUI/ConfigWizard.cpp:1287 +#: src/slic3r/GUI/ConfigWizard.cpp:1596 msgid "The size of the object can be specified in inches" msgstr "De maten van het object kunnen worden ingesteld op inches" -#: src/slic3r/GUI/ConfigWizard.cpp:1288 +#: src/slic3r/GUI/ConfigWizard.cpp:1597 msgid "Use inches" msgstr "Gebruik inches" -#: src/slic3r/GUI/ConfigWizard.cpp:1322 +#: src/slic3r/GUI/ConfigWizard.cpp:1617 msgid "Other Vendors" msgstr "Overige leveranciers" -#: src/slic3r/GUI/ConfigWizard.cpp:1326 +#: src/slic3r/GUI/ConfigWizard.cpp:1621 #, c-format, boost-format msgid "Pick another vendor supported by %s" msgstr "Kies een andere leverancier die ondersteund wordt door %s" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 msgid "Firmware Type" msgstr "Firmwaretype" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2366 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 src/slic3r/GUI/Tab.cpp:2354 msgid "Firmware" msgstr "Firmware" -#: src/slic3r/GUI/ConfigWizard.cpp:1361 +#: src/slic3r/GUI/ConfigWizard.cpp:1658 msgid "Choose the type of firmware used by your printer." msgstr "Kies het type firmware dat de printer gebruikt." -#: src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/ConfigWizard.cpp:1707 src/slic3r/GUI/ConfigWizard.cpp:1778 +#: src/slic3r/GUI/ConfigWizard.cpp:1783 src/slic3r/GUI/ConfigWizard.cpp:1788 +#: src/slic3r/GUI/Field.cpp:258 src/slic3r/GUI/Field.cpp:328 +#: src/slic3r/GUI/Field.cpp:1585 src/slic3r/GUI/GUI_ObjectLayers.cpp:435 +msgid "Invalid numeric input." +msgstr "Ongeldige numerieke invoer." + +#: src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape and Size" msgstr "Bedvorm en -grootte" -#: src/slic3r/GUI/ConfigWizard.cpp:1399 +#: src/slic3r/GUI/ConfigWizard.cpp:1735 msgid "Set the shape of your printer's bed." msgstr "Stel de vorm van het printbed in." -#: src/slic3r/GUI/ConfigWizard.cpp:1433 src/slic3r/GUI/Field.cpp:255 -#: src/slic3r/GUI/Field.cpp:324 src/slic3r/GUI/Field.cpp:1561 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:435 -msgid "Invalid numeric input." -msgstr "Ongeldige numerieke invoer." +#: src/slic3r/GUI/ConfigWizard.cpp:1755 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1610 +msgid "Build Volume" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1758 +msgid "Set vertical size of your printer." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1795 +msgid "Max print height:" +msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Filament and Nozzle Diameters" msgstr "Filament en nozzle diameters" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Print Diameters" msgstr "Printdiameter" -#: src/slic3r/GUI/ConfigWizard.cpp:1472 +#: src/slic3r/GUI/ConfigWizard.cpp:1828 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "Voer de diameter van de nozzle in." -#: src/slic3r/GUI/ConfigWizard.cpp:1475 +#: src/slic3r/GUI/ConfigWizard.cpp:1831 msgid "Nozzle Diameter:" msgstr "Nozzlediameter:" -#: src/slic3r/GUI/ConfigWizard.cpp:1485 +#: src/slic3r/GUI/ConfigWizard.cpp:1841 msgid "Enter the diameter of your filament." msgstr "Voer de diameter van het filament in." -#: src/slic3r/GUI/ConfigWizard.cpp:1486 +#: src/slic3r/GUI/ConfigWizard.cpp:1842 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." @@ -999,37 +1169,38 @@ msgstr "" "Goede nauwkeurigheid is van belang. Gebruik dus een schuifmaat en doe " "verschillende metingen op het filament. Bereken dan het gemiddelde." -#: src/slic3r/GUI/ConfigWizard.cpp:1489 +#: src/slic3r/GUI/ConfigWizard.cpp:1845 msgid "Filament Diameter:" msgstr "Filamentdiameter:" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Nozzle and Bed Temperatures" msgstr "Nozzle- en bedtemperaturen" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Temperatures" msgstr "Temperaturen" -#: src/slic3r/GUI/ConfigWizard.cpp:1563 +#: src/slic3r/GUI/ConfigWizard.cpp:1919 msgid "Enter the temperature needed for extruding your filament." msgstr "Voer de temperatuur in die nodig is om filament te extruderen." -#: src/slic3r/GUI/ConfigWizard.cpp:1564 +#: src/slic3r/GUI/ConfigWizard.cpp:1920 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "Een vuistregel is 180 tot 230 °C voor PLA en 230 tot 260 °C voor ABS." -#: src/slic3r/GUI/ConfigWizard.cpp:1567 +#: src/slic3r/GUI/ConfigWizard.cpp:1923 msgid "Extrusion Temperature:" msgstr "Extrusietemperatuur:" -#: src/slic3r/GUI/ConfigWizard.cpp:1568 src/slic3r/GUI/ConfigWizard.cpp:1582 -#: src/libslic3r/PrintConfig.cpp:418 src/libslic3r/PrintConfig.cpp:1211 -#: src/libslic3r/PrintConfig.cpp:1266 src/libslic3r/PrintConfig.cpp:2842 +#: src/slic3r/GUI/ConfigWizard.cpp:1924 src/slic3r/GUI/ConfigWizard.cpp:1938 +#: src/libslic3r/PrintConfig.cpp:437 src/libslic3r/PrintConfig.cpp:1271 +#: src/libslic3r/PrintConfig.cpp:1326 src/libslic3r/PrintConfig.cpp:2930 +#: src/libslic3r/PrintConfig.cpp:3689 msgid "°C" msgstr "°C" -#: src/slic3r/GUI/ConfigWizard.cpp:1577 +#: src/slic3r/GUI/ConfigWizard.cpp:1933 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." @@ -1037,7 +1208,7 @@ msgstr "" "Voer de bedtemperatuur in die nodig is om filament aan het bed te laten " "hechten." -#: src/slic3r/GUI/ConfigWizard.cpp:1578 +#: src/slic3r/GUI/ConfigWizard.cpp:1934 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." @@ -1045,23 +1216,23 @@ msgstr "" "Een vuistregel is 60 °C voor PLA en 110 °C voor ABS. Laat op 0 staan als er " "geen verwarmd bed is." -#: src/slic3r/GUI/ConfigWizard.cpp:1581 +#: src/slic3r/GUI/ConfigWizard.cpp:1937 msgid "Bed Temperature:" msgstr "Bedtemperatuur:" -#: src/slic3r/GUI/ConfigWizard.cpp:2043 src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Materials" msgstr "SLA materialen" -#: src/slic3r/GUI/ConfigWizard.cpp:2097 +#: src/slic3r/GUI/ConfigWizard.cpp:2464 msgid "FFF Technology Printers" msgstr "FFF-printers" -#: src/slic3r/GUI/ConfigWizard.cpp:2102 +#: src/slic3r/GUI/ConfigWizard.cpp:2469 msgid "SLA Technology Printers" msgstr "SLA-printers" -#: src/slic3r/GUI/ConfigWizard.cpp:2338 +#: src/slic3r/GUI/ConfigWizard.cpp:2718 #, boost-format msgid "" "Following printer profiles has no default filament: %1%Please select one " @@ -1070,7 +1241,7 @@ msgstr "" "De volgende printerprofielen hebben geen standaard filament: %1%Kies " "alstublieft een handmatig." -#: src/slic3r/GUI/ConfigWizard.cpp:2339 +#: src/slic3r/GUI/ConfigWizard.cpp:2719 #, boost-format msgid "" "Following printer profiles has no default material: %1%Please select one " @@ -1079,37 +1250,31 @@ msgstr "" "De volgende printerprofielen hebben geen standaard materiaal: %1%Kies " "alstublieft een handmatig." -#: src/slic3r/GUI/ConfigWizard.cpp:2340 src/slic3r/GUI/ConfigWizard.cpp:2438 -#: src/slic3r/GUI/DoubleSlider.cpp:2522 src/slic3r/GUI/DoubleSlider.cpp:2543 -#: src/slic3r/GUI/GUI.cpp:232 -msgid "Notice" -msgstr "Let op" - -#: src/slic3r/GUI/ConfigWizard.cpp:2459 +#: src/slic3r/GUI/ConfigWizard.cpp:2883 msgid "The following FFF printer models have no filament selected:" msgstr "Er is geen filament geselecteerd voor de volgende FFF-printers:" -#: src/slic3r/GUI/ConfigWizard.cpp:2463 +#: src/slic3r/GUI/ConfigWizard.cpp:2887 msgid "Do you want to select default filaments for these FFF printer models?" msgstr "Wil je standaardfilamenten selecteren voor deze FFF-printers?" -#: src/slic3r/GUI/ConfigWizard.cpp:2477 +#: src/slic3r/GUI/ConfigWizard.cpp:2901 msgid "The following SLA printer models have no materials selected:" msgstr "Er is geen materiaal geselecteerd voor de volgende SLA-printers:" -#: src/slic3r/GUI/ConfigWizard.cpp:2481 +#: src/slic3r/GUI/ConfigWizard.cpp:2905 msgid "Do you want to select default SLA materials for these printer models?" msgstr "Wil je standard SLA-materialen selecteren voor deze printers?" -#: src/slic3r/GUI/ConfigWizard.cpp:2523 +#: src/slic3r/GUI/ConfigWizard.cpp:2947 msgid "Configuration is edited in ConfigWizard" msgstr "Configuratie is gewijzigd in ConfigWizard" -#: src/slic3r/GUI/ConfigWizard.cpp:2566 +#: src/slic3r/GUI/ConfigWizard.cpp:3000 msgid "All user presets will be deleted." msgstr "Alle presets van de gebruiker worden verwijderd." -#: src/slic3r/GUI/ConfigWizard.cpp:2596 +#: src/slic3r/GUI/ConfigWizard.cpp:3037 msgid "A new vendor was installed and one of its printers will be activated" msgid_plural "" "New vendors were installed and one of theirs printers will be activated" @@ -1120,100 +1285,105 @@ msgstr[1] "" "Nieuwe leveranciers zijn geïnstalleerd en één van diens printers zal worden " "geactiveerd" -#: src/slic3r/GUI/ConfigWizard.cpp:2625 +#: src/slic3r/GUI/ConfigWizard.cpp:3069 msgid "Do you want to continue changing the configuration?" msgstr "Wil je doorgaan met het wijzigen van de configuratie?" -#: src/slic3r/GUI/ConfigWizard.cpp:2691 +#: src/slic3r/GUI/ConfigWizard.cpp:3136 msgid "A new Printer was installed and it will be activated." msgstr "Een nieuwe printer is geïnstalleerd en zal worden geactiveerd." -#: src/slic3r/GUI/ConfigWizard.cpp:2696 +#: src/slic3r/GUI/ConfigWizard.cpp:3141 msgid "Some Printers were uninstalled." msgstr "Sommige printers zijn verwijderd." -#: src/slic3r/GUI/ConfigWizard.cpp:2717 +#: src/slic3r/GUI/ConfigWizard.cpp:3162 msgid "A new filament was installed and it will be activated." msgstr "Een nieuw filament is geïnstalleerd en zal worden geactiveerd." -#: src/slic3r/GUI/ConfigWizard.cpp:2718 +#: src/slic3r/GUI/ConfigWizard.cpp:3163 msgid "A new SLA material was installed and it will be activated." msgstr "Een niet SLA-materiaal is geïnstalleerd en zal worden geactiveerd." -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some filaments were uninstalled." msgstr "Sommige filamenten zijn verwijderd." -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some SLA materials were uninstalled." msgstr "Sommige SLA-materialen zijn verwijderd." -#: src/slic3r/GUI/ConfigWizard.cpp:2773 +#: src/slic3r/GUI/ConfigWizard.cpp:3218 msgid "Custom printer was installed and it will be activated." msgstr "Custom printer is geïnstalleerd en zal worden geactiveerd." -#: src/slic3r/GUI/ConfigWizard.cpp:2858 +#: src/slic3r/GUI/ConfigWizard.cpp:3306 msgid "Select all standard printers" msgstr "Select alle standaardprinters" -#: src/slic3r/GUI/ConfigWizard.cpp:2861 +#: src/slic3r/GUI/ConfigWizard.cpp:3309 msgid "< &Back" -msgstr "< &Terug" +msgstr "< Terug" -#: src/slic3r/GUI/ConfigWizard.cpp:2862 +#: src/slic3r/GUI/ConfigWizard.cpp:3310 msgid "&Next >" -msgstr "&Volgende >" +msgstr "Volgende >" -#: src/slic3r/GUI/ConfigWizard.cpp:2863 +#: src/slic3r/GUI/ConfigWizard.cpp:3311 msgid "&Finish" -msgstr "&Voltooi" +msgstr "Voltooi" -#: src/slic3r/GUI/ConfigWizard.cpp:2864 -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:3312 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:657 +#: src/slic3r/GUI/FileArchiveDialog.cpp:274 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 #: src/slic3r/GUI/FirmwareDialog.cpp:153 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1593 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1365 #: src/slic3r/GUI/ProgressStatusBar.cpp:26 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:93 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:879 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:96 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:907 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1606 msgid "Cancel" msgstr "Annuleren" -#: src/slic3r/GUI/ConfigWizard.cpp:2884 +#: src/slic3r/GUI/ConfigWizard.cpp:3332 msgid "Prusa FFF Technology Printers" msgstr "Prusa FFF-printers" -#: src/slic3r/GUI/ConfigWizard.cpp:2892 +#: src/slic3r/GUI/ConfigWizard.cpp:3340 msgid "Prusa MSLA Technology Printers" msgstr "Prusa MSLA-printers" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filament Profiles Selection" msgstr "Filament profielselectie" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 src/slic3r/GUI/ConfigWizard.cpp:2915 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 src/slic3r/GUI/ConfigWizard.cpp:3363 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Type:" msgstr "Type:" -#: src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Material Profiles Selection" msgstr "SLA-materiaal profielselectie" -#: src/slic3r/GUI/ConfigWizard.cpp:3036 +#: src/slic3r/GUI/ConfigWizard.cpp:3486 msgid "Configuration Assistant" msgstr "Configuratie-assistent" -#: src/slic3r/GUI/ConfigWizard.cpp:3037 +#: src/slic3r/GUI/ConfigWizard.cpp:3487 msgid "Configuration &Assistant" -msgstr "Configuratie-&assistent" +msgstr "Configuratie-assistent" -#: src/slic3r/GUI/ConfigWizard.cpp:3039 +#: src/slic3r/GUI/ConfigWizard.cpp:3489 msgid "Configuration Wizard" msgstr "Configuratie-assistent" -#: src/slic3r/GUI/ConfigWizard.cpp:3040 +#: src/slic3r/GUI/ConfigWizard.cpp:3490 msgid "Configuration &Wizard" -msgstr "Configuratie-&assistent" +msgstr "Configuratie-assistent" #: src/slic3r/GUI/DesktopIntegrationDialog.cpp:232 msgid "" @@ -1227,7 +1397,7 @@ msgstr "" msgid "Performing desktop integration failed - Could not find executable." msgstr "Uitvoeren van desktopintegratie mislukt - kon executable niet vinden." -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:378 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:383 msgid "" "Performing desktop integration failed because the application directory was " "not found." @@ -1235,7 +1405,7 @@ msgstr "" "Uitvoeren van desktopintegratie mislukt omdat de locatie van het programma " "niet is gevonden." -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:419 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:423 msgid "" "Performing desktop integration failed - could not create Gcodeviewer desktop " "file. PrusaSlicer desktop file was probably created successfully." @@ -1244,12 +1414,29 @@ msgstr "" "desktopbestand aanmaken. PrusaSlicer-desktopbestand is mogelijk succesvol " "aangemaakt." -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:459 -#: src/slic3r/GUI/GUI_App.cpp:2245 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:472 +msgid "" +"Performing downloader desktop integration failed - boost::filesystem::" +"canonical did not return appimage path." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:484 +msgid "" +"Performing downloader desktop integration failed - Could not find executable." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:602 +msgid "" +"Performing downloader desktop integration failed because the application " +"directory was not found." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:626 +#: src/slic3r/GUI/GUI_App.cpp:2407 msgid "Desktop Integration" msgstr "Desktopintegratie" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:466 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:633 msgid "" "Desktop Integration sets this binary to be searchable by the system.\n" "\n" @@ -1259,13 +1446,13 @@ msgstr "" "\n" "Druk op \"Uitvoeren\" om door te gaan." -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:480 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:647 msgid "Perform" msgstr "Uitvoeren" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1342 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:653 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/KBShortcutsDialog.cpp:106 +#: src/slic3r/GUI/MainFrame.cpp:1426 msgid "Undo" msgstr "Maak ongedaan" @@ -1273,19 +1460,19 @@ msgstr "Maak ongedaan" msgid "Place bearings in slots and resume printing" msgstr "Plaats lagers in gleuven en ga door met printen" -#: src/slic3r/GUI/DoubleSlider.cpp:1379 +#: src/slic3r/GUI/DoubleSlider.cpp:1448 msgid "One layer mode" msgstr "Enkele-laagsmodus" -#: src/slic3r/GUI/DoubleSlider.cpp:1381 +#: src/slic3r/GUI/DoubleSlider.cpp:1450 msgid "Discard all custom changes" msgstr "Verwijder alle wijzigingen" -#: src/slic3r/GUI/DoubleSlider.cpp:1385 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:1454 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to move" msgstr "Ga naar beweging" -#: src/slic3r/GUI/DoubleSlider.cpp:1388 +#: src/slic3r/GUI/DoubleSlider.cpp:1457 #, c-format, boost-format msgid "" "Jump to height %s\n" @@ -1296,7 +1483,7 @@ msgstr "" "Stel meetlintmodus in\n" "of stel extrudervolgorde in voor de gehele print" -#: src/slic3r/GUI/DoubleSlider.cpp:1391 +#: src/slic3r/GUI/DoubleSlider.cpp:1460 #, c-format, boost-format msgid "" "Jump to height %s\n" @@ -1305,16 +1492,16 @@ msgstr "" "Ga naar hoogte %s\n" "of stel meetlintmodus in" -#: src/slic3r/GUI/DoubleSlider.cpp:1396 +#: src/slic3r/GUI/DoubleSlider.cpp:1465 msgid "Edit current color - Right click the colored slider segment" msgstr "" "Huidige kleur aanpassen - rechtermuisklik op het gekleurde schuifsegment" -#: src/slic3r/GUI/DoubleSlider.cpp:1398 +#: src/slic3r/GUI/DoubleSlider.cpp:1467 msgid "This is wipe tower layer" msgstr "Dit is de afveegblok-laag" -#: src/slic3r/GUI/DoubleSlider.cpp:1408 +#: src/slic3r/GUI/DoubleSlider.cpp:1477 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing sequentually." @@ -1323,15 +1510,15 @@ msgstr "" "Het is onmogelijk om custom G-codes toe te voegen voor het achtereenvolgens " "printen van objecten." -#: src/slic3r/GUI/DoubleSlider.cpp:1412 +#: src/slic3r/GUI/DoubleSlider.cpp:1481 msgid "Print mode" msgstr "Printmodus" -#: src/slic3r/GUI/DoubleSlider.cpp:1426 +#: src/slic3r/GUI/DoubleSlider.cpp:1495 msgid "Add extruder change - Left click" msgstr "Voeg extruderwissel toe - linkermuisklik" -#: src/slic3r/GUI/DoubleSlider.cpp:1428 +#: src/slic3r/GUI/DoubleSlider.cpp:1497 msgid "" "Add color change - Left click for predefined color or Shift + Left click for " "custom color selection" @@ -1339,23 +1526,23 @@ msgstr "" "Kleurwissel toevoegen: linkermuisklik voor ingestelde kleur of shift + " "linkermuisklik voor aangepaste kleurselectie" -#: src/slic3r/GUI/DoubleSlider.cpp:1430 +#: src/slic3r/GUI/DoubleSlider.cpp:1499 msgid "Add color change - Left click" msgstr "Kleurwissel toevoegen: linkermuisklik" -#: src/slic3r/GUI/DoubleSlider.cpp:1431 +#: src/slic3r/GUI/DoubleSlider.cpp:1500 msgid "or press \"+\" key" msgstr "of druk op de \"+\"-toets" -#: src/slic3r/GUI/DoubleSlider.cpp:1433 +#: src/slic3r/GUI/DoubleSlider.cpp:1502 msgid "Add another code - Ctrl + Left click" msgstr "Voeg andere code toe: Ctrl + linkermuisklik" -#: src/slic3r/GUI/DoubleSlider.cpp:1434 +#: src/slic3r/GUI/DoubleSlider.cpp:1503 msgid "Add another code - Right click" msgstr "Voeg andere code toe: rechtermuisklik" -#: src/slic3r/GUI/DoubleSlider.cpp:1440 +#: src/slic3r/GUI/DoubleSlider.cpp:1509 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing " @@ -1367,40 +1554,40 @@ msgstr "" "achtereenvolgens printen.\n" "Deze code wordt niet uitgevoerd bij de generatie van de G-code." -#: src/slic3r/GUI/DoubleSlider.cpp:1458 +#: src/slic3r/GUI/DoubleSlider.cpp:1527 msgid "continue" msgstr "doorgaan" -#: src/slic3r/GUI/DoubleSlider.cpp:1466 +#: src/slic3r/GUI/DoubleSlider.cpp:1535 #, boost-format msgid "Color change (\"%1%\")" msgstr "Kleurwissel (%1%)" -#: src/slic3r/GUI/DoubleSlider.cpp:1467 +#: src/slic3r/GUI/DoubleSlider.cpp:1536 #, boost-format msgid "Color change (\"%1%\") for Extruder %2%" msgstr "Kleurwissel (%1%) voor extruder %2%" -#: src/slic3r/GUI/DoubleSlider.cpp:1469 +#: src/slic3r/GUI/DoubleSlider.cpp:1538 #, boost-format msgid "Pause print (\"%1%\")" msgstr "Pauzeer print (%1%)" -#: src/slic3r/GUI/DoubleSlider.cpp:1471 +#: src/slic3r/GUI/DoubleSlider.cpp:1540 #, boost-format msgid "Custom template (\"%1%\")" msgstr "Aangepaste template (\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1473 +#: src/slic3r/GUI/DoubleSlider.cpp:1542 #, boost-format msgid "Extruder (tool) is changed to Extruder \"%1%\"" msgstr "Extruder (tool) is veranderd naar extruder %1%" -#: src/slic3r/GUI/DoubleSlider.cpp:1480 +#: src/slic3r/GUI/DoubleSlider.cpp:1549 msgid "Note" msgstr "Let op" -#: src/slic3r/GUI/DoubleSlider.cpp:1482 +#: src/slic3r/GUI/DoubleSlider.cpp:1551 msgid "" "G-code associated to this tick mark is in a conflict with print mode.\n" "Editing it will cause changes of Slider data." @@ -1409,7 +1596,7 @@ msgstr "" "printmodus.\n" "Dit aanpassen zal de gegevens van de schuif ook wijzigen." -#: src/slic3r/GUI/DoubleSlider.cpp:1485 +#: src/slic3r/GUI/DoubleSlider.cpp:1554 msgid "" "There is a color change for extruder that won't be used till the end of " "print job.\n" @@ -1419,7 +1606,7 @@ msgstr "" "van de print.\n" "Deze code wordt niet toegevoegd bij de generatie van de G-code." -#: src/slic3r/GUI/DoubleSlider.cpp:1488 +#: src/slic3r/GUI/DoubleSlider.cpp:1557 msgid "" "There is an extruder change set to the same extruder.\n" "This code won't be processed during G-code generation." @@ -1427,7 +1614,7 @@ msgstr "" "Er is een extruderwissel naar dezelfde extruder ingesteld.\n" "Deze code wordt niet toegevoegd bij de generatie van de G-code." -#: src/slic3r/GUI/DoubleSlider.cpp:1491 +#: src/slic3r/GUI/DoubleSlider.cpp:1560 msgid "" "There is a color change for extruder that has not been used before.\n" "Check your settings to avoid redundant color changes." @@ -1435,149 +1622,149 @@ msgstr "" "Er is een kleurwissel voor een extruder die niet eerder gebruikt is.\n" "Controleer de instellingen om overbodige kleurwisselingen te voorkomen." -#: src/slic3r/GUI/DoubleSlider.cpp:1496 +#: src/slic3r/GUI/DoubleSlider.cpp:1565 msgid "Delete tick mark - Left click or press \"-\" key" msgstr "Verwijder markering; linkermuisknop of druk op de '-'-knop" -#: src/slic3r/GUI/DoubleSlider.cpp:1498 +#: src/slic3r/GUI/DoubleSlider.cpp:1567 msgid "Edit tick mark - Ctrl + Left click" msgstr "Bewerk markering; CTRL + linkermuisknop" -#: src/slic3r/GUI/DoubleSlider.cpp:1499 +#: src/slic3r/GUI/DoubleSlider.cpp:1568 msgid "Edit tick mark - Right click" msgstr "Bewerk markering; rechtermuisknop" -#: src/slic3r/GUI/DoubleSlider.cpp:1602 src/slic3r/GUI/DoubleSlider.cpp:1633 -#: src/slic3r/GUI/GUI_Factories.cpp:778 +#: src/slic3r/GUI/DoubleSlider.cpp:1671 src/slic3r/GUI/DoubleSlider.cpp:1702 +#: src/slic3r/GUI/GUI_Factories.cpp:862 #, c-format, boost-format msgid "Extruder %d" msgstr "Extruder %d" -#: src/slic3r/GUI/DoubleSlider.cpp:1603 src/slic3r/GUI/GUI_Factories.cpp:779 +#: src/slic3r/GUI/DoubleSlider.cpp:1672 src/slic3r/GUI/GUI_Factories.cpp:863 msgid "active" msgstr "actief" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 msgid "Switch code to Change extruder" msgstr "Code om van extruder te wisselen" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Change extruder" msgstr "Wissel extruder" -#: src/slic3r/GUI/DoubleSlider.cpp:1613 +#: src/slic3r/GUI/DoubleSlider.cpp:1682 msgid "Change extruder (N/A)" msgstr "Wissel extruder (n.v.t.)" -#: src/slic3r/GUI/DoubleSlider.cpp:1615 src/slic3r/GUI/GUI_Factories.cpp:787 +#: src/slic3r/GUI/DoubleSlider.cpp:1684 src/slic3r/GUI/GUI_Factories.cpp:871 msgid "Use another extruder" msgstr "Gebruik een andere extruder" -#: src/slic3r/GUI/DoubleSlider.cpp:1634 +#: src/slic3r/GUI/DoubleSlider.cpp:1703 msgid "used" msgstr "gebruikt" -#: src/slic3r/GUI/DoubleSlider.cpp:1642 +#: src/slic3r/GUI/DoubleSlider.cpp:1711 #, boost-format msgid "Switch code to Color change (%1%) for:" msgstr "Code om naar kleur %1% te wisselen voor:" -#: src/slic3r/GUI/DoubleSlider.cpp:1643 +#: src/slic3r/GUI/DoubleSlider.cpp:1712 #, boost-format msgid "Add color change (%1%) for:" msgstr "Kleurwissel (%1%) toevoegen voor:" -#: src/slic3r/GUI/DoubleSlider.cpp:1968 +#: src/slic3r/GUI/DoubleSlider.cpp:2037 msgid "Add color change" msgstr "Kleurwissel toevoegen" -#: src/slic3r/GUI/DoubleSlider.cpp:1979 +#: src/slic3r/GUI/DoubleSlider.cpp:2048 msgid "Add pause print" msgstr "Voeg printpauze toe" -#: src/slic3r/GUI/DoubleSlider.cpp:1983 +#: src/slic3r/GUI/DoubleSlider.cpp:2052 msgid "Add custom template" msgstr "Voeg aangepaste template toe" -#: src/slic3r/GUI/DoubleSlider.cpp:1986 +#: src/slic3r/GUI/DoubleSlider.cpp:2055 msgid "Add custom G-code" msgstr "Custom G-code toevoegen" -#: src/slic3r/GUI/DoubleSlider.cpp:2004 +#: src/slic3r/GUI/DoubleSlider.cpp:2073 msgid "Edit color" msgstr "Bewerk kleur" -#: src/slic3r/GUI/DoubleSlider.cpp:2005 +#: src/slic3r/GUI/DoubleSlider.cpp:2074 msgid "Edit pause print message" msgstr "Bewerk printpauze-bericht" -#: src/slic3r/GUI/DoubleSlider.cpp:2006 +#: src/slic3r/GUI/DoubleSlider.cpp:2075 msgid "Edit custom G-code" msgstr "Bewerk custom G-code" -#: src/slic3r/GUI/DoubleSlider.cpp:2012 +#: src/slic3r/GUI/DoubleSlider.cpp:2081 msgid "Delete color change" msgstr "Verwijder kleurwissel" -#: src/slic3r/GUI/DoubleSlider.cpp:2013 +#: src/slic3r/GUI/DoubleSlider.cpp:2082 msgid "Delete tool change" msgstr "Verwijder toolwissel" -#: src/slic3r/GUI/DoubleSlider.cpp:2014 +#: src/slic3r/GUI/DoubleSlider.cpp:2083 msgid "Delete pause print" msgstr "Verwijder printpauze" -#: src/slic3r/GUI/DoubleSlider.cpp:2015 +#: src/slic3r/GUI/DoubleSlider.cpp:2084 msgid "Delete custom G-code" msgstr "Verwijder custom G-code" -#: src/slic3r/GUI/DoubleSlider.cpp:2025 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:2094 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to height" msgstr "Ga naar hoogte" -#: src/slic3r/GUI/DoubleSlider.cpp:2030 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 msgid "Hide ruler" msgstr "Verberg meetlint" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height" msgstr "Toon objecthoogte" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height on the ruler" msgstr "Toon objecthoogte op het meetlint" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time" msgstr "Toon geschatte printtijd" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time on the ruler" msgstr "Toon geschatte printtijd op het meetlint" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Ruler mode" msgstr "Meetlintmodus" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Set ruler mode" msgstr "Stel meetlintmodus in" -#: src/slic3r/GUI/DoubleSlider.cpp:2047 +#: src/slic3r/GUI/DoubleSlider.cpp:2116 msgid "Set extruder sequence for the entire print" msgstr "Stel extrudervolgorde in voor de hele print" -#: src/slic3r/GUI/DoubleSlider.cpp:2051 +#: src/slic3r/GUI/DoubleSlider.cpp:2120 msgid "Set auto color changes" msgstr "Stel automatische kleurwisseling in" -#: src/slic3r/GUI/DoubleSlider.cpp:2086 +#: src/slic3r/GUI/DoubleSlider.cpp:2155 msgid "This action will cause deletion of all ticks on vertical slider." msgstr "" "Deze actie veroorzaakt een verwijdering van alle punten op de verticale " "slider." -#: src/slic3r/GUI/DoubleSlider.cpp:2087 src/slic3r/GUI/Tab.cpp:1318 +#: src/slic3r/GUI/DoubleSlider.cpp:2156 src/slic3r/GUI/Tab.cpp:1263 msgid "" "This action is not revertible.\n" "Do you want to proceed?" @@ -1585,62 +1772,64 @@ msgstr "" "Deze actie is niet terug te draaien.\n" "Wilt u doorgaan?" -#: src/slic3r/GUI/DoubleSlider.cpp:2088 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1133 src/slic3r/GUI/GUI.cpp:245 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:649 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:679 -#: src/slic3r/GUI/WipeTowerDialog.cpp:58 src/slic3r/GUI/WipeTowerDialog.cpp:443 +#: src/slic3r/GUI/DoubleSlider.cpp:2157 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:537 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1119 src/slic3r/GUI/GUI.cpp:258 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:721 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:751 +#: src/slic3r/GUI/WipeTowerDialog.cpp:60 src/slic3r/GUI/WipeTowerDialog.cpp:445 msgid "Warning" msgstr "Waarschuwing" -#: src/slic3r/GUI/DoubleSlider.cpp:2216 +#: src/slic3r/GUI/DoubleSlider.cpp:2285 msgid "Enter custom G-code used on current layer" msgstr "Voer custom G-code in voor de huidige laag" -#: src/slic3r/GUI/DoubleSlider.cpp:2217 +#: src/slic3r/GUI/DoubleSlider.cpp:2286 #, boost-format msgid "Custom G-code on current layer (%1% mm)." msgstr "Custom G-code voor huidige laag (%1% mm)." -#: src/slic3r/GUI/DoubleSlider.cpp:2238 +#: src/slic3r/GUI/DoubleSlider.cpp:2307 msgid "Enter short message shown on Printer display when a print is paused" msgstr "" "Voer een kort bericht in om te tonen op het printscherm tijdens een pauze" -#: src/slic3r/GUI/DoubleSlider.cpp:2239 +#: src/slic3r/GUI/DoubleSlider.cpp:2308 #, boost-format msgid "Message for pause print on current layer (%1% mm)." msgstr "Kort bericht voor printpauze bij huidige laag (%1% mm)." -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the move you want to jump to" msgstr "Voer de beweging in waar u naartoe wilt" -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the height you want to jump to" msgstr "Voer de hoogte in waar u naartoe wilt" -#: src/slic3r/GUI/DoubleSlider.cpp:2515 +#: src/slic3r/GUI/DoubleSlider.cpp:2584 msgid "The last color change data was saved for a single extruder printing." msgstr "" "De laatste gegevens van de kleurwissel zijn opgeslagen voor enkel-" "extruderprinters." -#: src/slic3r/GUI/DoubleSlider.cpp:2516 src/slic3r/GUI/DoubleSlider.cpp:2532 +#: src/slic3r/GUI/DoubleSlider.cpp:2585 src/slic3r/GUI/DoubleSlider.cpp:2601 msgid "The last color change data was saved for a multi extruder printing." msgstr "" "De laatste gegevens van de kleurwissel zijn opgeslagen voor een multi-" "extruderprinter." -#: src/slic3r/GUI/DoubleSlider.cpp:2518 +#: src/slic3r/GUI/DoubleSlider.cpp:2587 msgid "Your current changes will delete all saved color changes." msgstr "De huidige wijzigingen zullen alle kleurwisselingen verwijderen." -#: src/slic3r/GUI/DoubleSlider.cpp:2519 src/slic3r/GUI/DoubleSlider.cpp:2540 +#: src/slic3r/GUI/DoubleSlider.cpp:2588 src/slic3r/GUI/DoubleSlider.cpp:2609 msgid "Are you sure you want to continue?" msgstr "Weet u zeker dat u wilt doorgaan?" -#: src/slic3r/GUI/DoubleSlider.cpp:2533 +#: src/slic3r/GUI/DoubleSlider.cpp:2602 msgid "" "Select YES if you want to delete all saved tool changes, \n" "NO if you want all tool changes switch to color changes, \n" @@ -1650,11 +1839,11 @@ msgstr "" "of NEE als u alle toolwisselingen wilt veranderen in kleurwisselingen\n" "of klik op annuleren om wijzingen ongedaan te maken." -#: src/slic3r/GUI/DoubleSlider.cpp:2536 +#: src/slic3r/GUI/DoubleSlider.cpp:2605 msgid "Do you want to delete all saved tool changes?" msgstr "Wilt u alle opgeslagen toolwisselingen verwijderen?" -#: src/slic3r/GUI/DoubleSlider.cpp:2538 +#: src/slic3r/GUI/DoubleSlider.cpp:2607 msgid "" "The last color change data was saved for a multi extruder printing with tool " "changes for whole print." @@ -1662,20 +1851,34 @@ msgstr "" "De laatste gegevens van de kleurwisseling zijn opgeslagen voor een multi-" "extruderprinter met toolwisselingen voor de hele print." -#: src/slic3r/GUI/DoubleSlider.cpp:2539 +#: src/slic3r/GUI/DoubleSlider.cpp:2608 msgid "Your current changes will delete all saved extruder (tool) changes." msgstr "" "De huidige wijzigingen worden verwijderd voor alle extruder " "(tool)wisselingen." -#: src/slic3r/GUI/ExtraRenderers.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:538 -#: src/slic3r/GUI/GUI_ObjectList.cpp:550 src/slic3r/GUI/GUI_ObjectList.cpp:979 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4291 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:250 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:352 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:376 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:607 src/libslic3r/PrintConfig.cpp:800 +#: src/slic3r/GUI/Downloader.cpp:150 +#, boost-format +msgid "" +"Download won't start. Download URL doesn't point to https://files.printables." +"com : %1%" +msgstr "" + +#: src/slic3r/GUI/Downloader.cpp:181 +msgid "The download has failed:" +msgstr "" + +#: src/slic3r/GUI/DownloaderFileGet.cpp:193 +#, boost-format +msgid "Can't create file at %1%." +msgstr "" + +#: src/slic3r/GUI/ExtraRenderers.cpp:323 src/slic3r/GUI/GUI_ObjectList.cpp:571 +#: src/slic3r/GUI/GUI_ObjectList.cpp:583 src/slic3r/GUI/GUI_ObjectList.cpp:1043 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2125 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3013 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4884 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:259 src/libslic3r/PrintConfig.cpp:894 msgid "default" msgstr "standaard" @@ -1688,10 +1891,10 @@ msgid "Set extruder change for every" msgstr "Stel toolwissel in voor elke" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:60 -#: src/libslic3r/PrintConfig.cpp:662 src/libslic3r/PrintConfig.cpp:1430 -#: src/libslic3r/PrintConfig.cpp:2135 src/libslic3r/PrintConfig.cpp:2310 -#: src/libslic3r/PrintConfig.cpp:2386 src/libslic3r/PrintConfig.cpp:2639 -#: src/libslic3r/PrintConfig.cpp:2687 src/libslic3r/PrintConfig.cpp:2706 +#: src/libslic3r/PrintConfig.cpp:765 src/libslic3r/PrintConfig.cpp:1476 +#: src/libslic3r/PrintConfig.cpp:2165 src/libslic3r/PrintConfig.cpp:2343 +#: src/libslic3r/PrintConfig.cpp:2417 src/libslic3r/PrintConfig.cpp:2665 +#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2728 msgid "layers" msgstr "lagen" @@ -1703,7 +1906,7 @@ msgstr "Willekeurige volgorde" msgid "If enabled, random sequence of the selected extruders will be used." msgstr "" "Willekeurige volgorde van de geselecteerde extruders wordt toegestaan als " -"dit aan staat." +"dit is ingeschakeld." #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:172 msgid "Allow next color repetition" @@ -1712,8 +1915,8 @@ msgstr "Sta volgende kleur volgorde toe" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:174 msgid "If enabled, a repetition of the next random color will be allowed." msgstr "" -"Een herhaling van de volgende willekeurige kleur wordt toegestaan als dit " -"aan staat." +"Een herhaling van de volgende willekeurige kleur wordt toegestaan als dit is " +"ingeschakeld." #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:177 msgid "Set extruder(tool) sequence" @@ -1727,26 +1930,26 @@ msgstr "Verwijder extruder uit de reeks" msgid "Add extruder to sequence" msgstr "Voeg extruder toe aan de reeks" -#: src/slic3r/GUI/Field.cpp:190 +#: src/slic3r/GUI/Field.cpp:188 msgid "default value" msgstr "standaardwaarde" -#: src/slic3r/GUI/Field.cpp:193 +#: src/slic3r/GUI/Field.cpp:191 msgid "parameter name" msgstr "parameternaam" -#: src/slic3r/GUI/Field.cpp:204 src/slic3r/GUI/OptionsGroup.cpp:827 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1067 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1079 +#: src/slic3r/GUI/Field.cpp:206 src/slic3r/GUI/OptionsGroup.cpp:852 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1074 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1086 msgid "N/A" msgstr "n.v.t." -#: src/slic3r/GUI/Field.cpp:226 src/slic3r/GUI/Field.cpp:298 +#: src/slic3r/GUI/Field.cpp:229 src/slic3r/GUI/Field.cpp:302 #, c-format, boost-format msgid "%s doesn't support percentage" msgstr "%s ondersteunt geen percentage" -#: src/slic3r/GUI/Field.cpp:266 +#: src/slic3r/GUI/Field.cpp:269 #, c-format, boost-format msgid "" "Input value is out of range\n" @@ -1755,16 +1958,16 @@ msgstr "" "Ingevoerde waarde is buiten bereik\n" "Weet u zeker dat %s een juiste waarde is en dat u door wilt gaan?" -#: src/slic3r/GUI/Field.cpp:269 src/slic3r/GUI/Field.cpp:343 +#: src/slic3r/GUI/Field.cpp:272 src/slic3r/GUI/Field.cpp:347 msgid "Parameter validation" msgstr "Parametervalidatie" -#: src/slic3r/GUI/Field.cpp:282 src/slic3r/GUI/Field.cpp:390 -#: src/slic3r/GUI/Field.cpp:1573 +#: src/slic3r/GUI/Field.cpp:285 src/slic3r/GUI/Field.cpp:394 +#: src/slic3r/GUI/Field.cpp:1597 msgid "Input value is out of range" msgstr "Ingevoerde waarde valt buiten het bereik" -#: src/slic3r/GUI/Field.cpp:340 +#: src/slic3r/GUI/Field.cpp:344 #, c-format, boost-format msgid "" "Do you mean %s%% instead of %s %s?\n" @@ -1775,7 +1978,7 @@ msgstr "" "Selecteer JA als de waarden aangepast moeten worden naar %s%%\n" "of NEE als %s %s is de juiste waarde." -#: src/slic3r/GUI/Field.cpp:397 +#: src/slic3r/GUI/Field.cpp:401 #, boost-format msgid "" "Invalid input format. Expected vector of dimensions in the following format: " @@ -1783,6 +1986,15 @@ msgid "" msgstr "" "Ongeldige invoer. Verwachte waarde moet in het volgende format: \"%1%\"" +#: src/slic3r/GUI/FileArchiveDialog.cpp:170 +msgid "Archive preview" +msgstr "" + +#: src/slic3r/GUI/FileArchiveDialog.cpp:270 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +msgid "Open" +msgstr "" + #: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flash!" msgstr "Flash!" @@ -1867,13 +2079,7 @@ msgstr "Firmwarebestand:" #: src/slic3r/GUI/FirmwareDialog.cpp:813 msgid "Select a file" -msgstr "" - -#: src/slic3r/GUI/FirmwareDialog.cpp:815 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:297 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:372 -msgid "Browse" -msgstr "Zoek" +msgstr "Selecteer een bestand" #: src/slic3r/GUI/FirmwareDialog.cpp:817 msgid "Serial port:" @@ -1904,10 +2110,10 @@ msgid "Advanced: Output log" msgstr "Geavanceerd: Output logboek" #: src/slic3r/GUI/FirmwareDialog.cpp:862 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:310 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:358 #: src/slic3r/GUI/Mouse3DController.cpp:543 -#: src/slic3r/GUI/PrintHostDialogs.cpp:261 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:122 +#: src/slic3r/GUI/PrintHostDialogs.cpp:313 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:125 msgid "Close" msgstr "Sluit" @@ -1927,7 +2133,7 @@ msgstr "Bevestiging" msgid "Cancelling..." msgstr "Annuleren..." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1488 msgid "Shape Gallery" msgstr "Vormengalerij" @@ -1935,39 +2141,44 @@ msgstr "Vormengalerij" msgid "Select shape from the gallery" msgstr "Selecteer vorm uit de galerij" -#: src/slic3r/GUI/GalleryDialog.cpp:100 -msgid "Add to bed" -msgstr "Voeg toe aan bed" - -#: src/slic3r/GUI/GalleryDialog.cpp:101 -msgid "Add selected shape(s) to the bed" -msgstr "Voeg geselecteerd(e) object(en) toe aan bed" - -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4152 +#: src/slic3r/GUI/GalleryDialog.cpp:114 src/slic3r/GUI/Tab.cpp:4377 msgid "Add" msgstr "Voeg toe" -#: src/slic3r/GUI/GalleryDialog.cpp:117 +#: src/slic3r/GUI/GalleryDialog.cpp:114 msgid "Add one or more custom shapes" msgstr "Voeg een of meer aangepaste vormen toe" -#: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:506 -#: src/slic3r/GUI/GLCanvas3D.cpp:4547 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/GalleryDialog.cpp:115 src/slic3r/GUI/GalleryDialog.cpp:528 +#: src/slic3r/GUI/GLCanvas3D.cpp:4638 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/GUI_Factories.cpp:460 src/slic3r/GUI/Tab.cpp:3973 msgid "Delete" msgstr "Verwijder" -#: src/slic3r/GUI/GalleryDialog.cpp:118 +#: src/slic3r/GUI/GalleryDialog.cpp:115 msgid "Delete one or more custom shape. You can't delete system shapes" msgstr "" "Verwijder een of meer aangepaste vormen. U kunt geen standaardvormen " "verwijderen" -#: src/slic3r/GUI/GalleryDialog.cpp:400 +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "Add to bed" +msgstr "Voeg toe aan bed" + +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "OK" +msgstr "OK" + +#: src/slic3r/GUI/GalleryDialog.cpp:143 +msgid "Add selected shape(s) to the bed" +msgstr "Voeg geselecteerd(e) object(en) toe aan bed" + +#: src/slic3r/GUI/GalleryDialog.cpp:422 msgid "Choose one or more files (STL, OBJ):" msgstr "Kies een of meer bestanden (STL, OBJ):" -#: src/slic3r/GUI/GalleryDialog.cpp:440 +#: src/slic3r/GUI/GalleryDialog.cpp:462 #, boost-format msgid "" "It looks like selected %1%-file has an error or is destructed.\n" @@ -1977,723 +2188,1523 @@ msgstr "" "vernietigd.\n" "Het bestand kan niet geladen worden" -#: src/slic3r/GUI/GalleryDialog.cpp:451 +#: src/slic3r/GUI/GalleryDialog.cpp:473 msgid "Choose one PNG file:" msgstr "Kies een PNG-bestand:" -#: src/slic3r/GUI/GalleryDialog.cpp:464 +#: src/slic3r/GUI/GalleryDialog.cpp:486 msgid "Replacing of the PNG" msgstr "Herplaats de PNG" -#: src/slic3r/GUI/GalleryDialog.cpp:508 +#: src/slic3r/GUI/GalleryDialog.cpp:530 msgid "Change thumbnail" msgstr "Verander miniatuur" -#: src/slic3r/GUI/GalleryDialog.cpp:549 src/slic3r/GUI/GalleryDialog.cpp:554 +#: src/slic3r/GUI/GalleryDialog.cpp:571 src/slic3r/GUI/GalleryDialog.cpp:576 #, boost-format msgid "Loading of the \"%1%\"" msgstr "Laden van de \"%1%\"" -#: src/slic3r/GUI/GCodeViewer.cpp:274 +#: src/slic3r/GUI/GCodeViewer.cpp:343 msgid "Tool position" msgstr "Toolpositie" -#: src/slic3r/GUI/GCodeViewer.cpp:1457 +#: src/slic3r/GUI/GCodeViewer.cpp:1547 msgid "Generating toolpaths" msgstr "Toolpaden genereren" -#: src/slic3r/GUI/GCodeViewer.cpp:1517 +#: src/slic3r/GUI/GCodeViewer.cpp:1619 msgid "Generating vertex buffer" msgstr "Vertex buffer genereren" -#: src/slic3r/GUI/GCodeViewer.cpp:1857 +#: src/slic3r/GUI/GCodeViewer.cpp:1979 msgid "Generating index buffers" msgstr "Index buffers genereren" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to hide" msgstr "Klik om te verbergen" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to show" msgstr "Klik om te tonen" -#: src/slic3r/GUI/GCodeViewer.cpp:3181 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 msgid "up to" msgstr "tot op" -#: src/slic3r/GUI/GCodeViewer.cpp:3187 +#: src/slic3r/GUI/GCodeViewer.cpp:3455 msgid "above" msgstr "boven" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "from" msgstr "vanaf" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "to" msgstr "naar" -#: src/slic3r/GUI/GCodeViewer.cpp:3245 src/slic3r/GUI/GCodeViewer.cpp:3246 -#: src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3513 src/slic3r/GUI/GCodeViewer.cpp:3514 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 msgid "Percentage" msgstr "Percentage" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3570 msgid "Feature type" msgstr "Type optie" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3592 #: src/slic3r/GUI/RammingChart.cpp:90 msgid "Time" msgstr "Tijd" -#: src/slic3r/GUI/GCodeViewer.cpp:3295 src/slic3r/GUI/GCodeViewer.cpp:3306 -#: src/slic3r/GUI/GCodeViewer.cpp:3566 -msgid "Used filament" -msgstr "Gebruikt filament" - -#: src/slic3r/GUI/GCodeViewer.cpp:3298 +#: src/slic3r/GUI/GCodeViewer.cpp:3571 msgid "Height (mm)" msgstr "Hoogte (mm)" -#: src/slic3r/GUI/GCodeViewer.cpp:3299 +#: src/slic3r/GUI/GCodeViewer.cpp:3572 msgid "Width (mm)" msgstr "Breedte (mm)" -#: src/slic3r/GUI/GCodeViewer.cpp:3300 +#: src/slic3r/GUI/GCodeViewer.cpp:3573 msgid "Speed (mm/s)" msgstr "Snelheid (mm/s)" -#: src/slic3r/GUI/GCodeViewer.cpp:3301 -msgid "Fan Speed (%)" -msgstr "Ventilatorsnelheid (%)" +#: src/slic3r/GUI/GCodeViewer.cpp:3574 +msgid "Fan speed (%)" +msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3302 +#: src/slic3r/GUI/GCodeViewer.cpp:3575 msgid "Temperature (°C)" msgstr "Temperatuur (°C)" -#: src/slic3r/GUI/GCodeViewer.cpp:3303 +#: src/slic3r/GUI/GCodeViewer.cpp:3576 msgid "Volumetric flow rate (mm³/s)" msgstr "Volumetrisch debiet (mm³/s)" -#: src/slic3r/GUI/GCodeViewer.cpp:3306 src/slic3r/GUI/GUI_Preview.cpp:224 -#: src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3577 +msgid "Layer time (linear)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3578 +msgid "Layer time (logarithmic)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3579 msgid "Tool" msgstr "Tool" -#: src/slic3r/GUI/GCodeViewer.cpp:3309 src/slic3r/GUI/GUI_Preview.cpp:225 -#: src/slic3r/GUI/GUI_Preview.cpp:957 +#: src/slic3r/GUI/GCodeViewer.cpp:3580 msgid "Color Print" msgstr "Kleurenprint" -#: src/slic3r/GUI/GCodeViewer.cpp:3347 src/slic3r/GUI/GCodeViewer.cpp:3393 -#: src/slic3r/GUI/GCodeViewer.cpp:3398 src/slic3r/GUI/GUI_ObjectList.cpp:312 -#: src/slic3r/GUI/wxExtensions.cpp:536 src/libslic3r/PrintConfig.cpp:795 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 src/slic3r/GUI/GCodeViewer.cpp:3594 +#: src/slic3r/GUI/GCodeViewer.cpp:3860 +msgid "Used filament" +msgstr "Gebruikt filament" + +#: src/slic3r/GUI/GCodeViewer.cpp:3623 src/slic3r/GUI/GCodeViewer.cpp:4067 +#: src/libslic3r/PrintConfig.cpp:3025 +msgid "Travel" +msgstr "Beweging" + +#: src/slic3r/GUI/GCodeViewer.cpp:3640 src/slic3r/GUI/GCodeViewer.cpp:3685 +#: src/slic3r/GUI/GCodeViewer.cpp:3689 src/slic3r/GUI/GUI_ObjectList.cpp:338 +#: src/slic3r/GUI/wxExtensions.cpp:547 src/libslic3r/PrintConfig.cpp:888 msgid "Extruder" msgstr "Extruder" -#: src/slic3r/GUI/GCodeViewer.cpp:3370 +#: src/slic3r/GUI/GCodeViewer.cpp:3662 msgid "Default color" msgstr "Standaardkleur" -#: src/slic3r/GUI/GCodeViewer.cpp:3393 +#: src/slic3r/GUI/GCodeViewer.cpp:3685 msgid "default color" msgstr "standaardkleur" -#: src/slic3r/GUI/GCodeViewer.cpp:3491 src/slic3r/GUI/GCodeViewer.cpp:3547 +#: src/slic3r/GUI/GCodeViewer.cpp:3785 src/slic3r/GUI/GCodeViewer.cpp:3841 msgid "Color change" msgstr "Kleurwissel" -#: src/slic3r/GUI/GCodeViewer.cpp:3510 src/slic3r/GUI/GCodeViewer.cpp:3545 +#: src/slic3r/GUI/GCodeViewer.cpp:3804 src/slic3r/GUI/GCodeViewer.cpp:3839 msgid "Print" msgstr "Print" -#: src/slic3r/GUI/GCodeViewer.cpp:3546 src/slic3r/GUI/GCodeViewer.cpp:3580 +#: src/slic3r/GUI/GCodeViewer.cpp:3840 src/slic3r/GUI/GCodeViewer.cpp:3874 msgid "Pause" msgstr "Pauzeer" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Event" msgstr "Gebeurtenis" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Remaining time" msgstr "Resterende tijd" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Duration" msgstr "Duur" -#: src/slic3r/GUI/GCodeViewer.cpp:3609 src/slic3r/GUI/GUI_Preview.cpp:1049 -#: src/libslic3r/PrintConfig.cpp:2937 -msgid "Travel" -msgstr "Beweging" - -#: src/slic3r/GUI/GCodeViewer.cpp:3612 -msgid "Movement" -msgstr "Beweging" - -#: src/slic3r/GUI/GCodeViewer.cpp:3613 -msgid "Extrusion" -msgstr "Extrusie" - -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1870 -#: src/slic3r/GUI/Tab.cpp:2812 -msgid "Retraction" -msgstr "Retractie" - -#: src/slic3r/GUI/GCodeViewer.cpp:3631 src/slic3r/GUI/GCodeViewer.cpp:3634 -#: src/slic3r/GUI/GUI_Preview.cpp:1050 -msgid "Wipe" -msgstr "Afvegen" - -#: src/slic3r/GUI/GCodeViewer.cpp:3666 src/slic3r/GUI/GUI_Preview.cpp:257 -#: src/slic3r/GUI/GUI_Preview.cpp:272 -msgid "Options" -msgstr "Opties" - -#: src/slic3r/GUI/GCodeViewer.cpp:3669 src/slic3r/GUI/GUI_Preview.cpp:1051 -msgid "Retractions" -msgstr "Retracties" - -#: src/slic3r/GUI/GCodeViewer.cpp:3670 src/slic3r/GUI/GUI_Preview.cpp:1052 -msgid "Deretractions" -msgstr "Deretracties" - -#: src/slic3r/GUI/GCodeViewer.cpp:3671 src/slic3r/GUI/GUI_Preview.cpp:1053 -msgid "Seams" -msgstr "Naad" - -#: src/slic3r/GUI/GCodeViewer.cpp:3672 src/slic3r/GUI/GUI_Preview.cpp:1054 -msgid "Tool changes" -msgstr "Toolwisselingen" - -#: src/slic3r/GUI/GCodeViewer.cpp:3673 src/slic3r/GUI/GUI_Preview.cpp:1055 -msgid "Color changes" -msgstr "Kleurwisselingen" - -#: src/slic3r/GUI/GCodeViewer.cpp:3674 src/slic3r/GUI/GUI_Preview.cpp:1056 -msgid "Print pauses" -msgstr "Printpauzes" - -#: src/slic3r/GUI/GCodeViewer.cpp:3675 src/slic3r/GUI/GUI_Preview.cpp:1057 -msgid "Custom G-codes" -msgstr "Aangepaste G-code" - -#: src/slic3r/GUI/GCodeViewer.cpp:3695 src/slic3r/GUI/GCodeViewer.cpp:3714 -#: src/slic3r/GUI/GUI.cpp:341 src/slic3r/GUI/Plater.cpp:822 -#: src/libslic3r/PrintConfig.cpp:322 +#: src/slic3r/GUI/GCodeViewer.cpp:3928 src/slic3r/GUI/GUI.cpp:332 +#: src/slic3r/GUI/Plater.cpp:852 src/libslic3r/PrintConfig.cpp:335 msgid "Printer" msgstr "Printer" -#: src/slic3r/GUI/GCodeViewer.cpp:3697 src/slic3r/GUI/GCodeViewer.cpp:3719 -#: src/slic3r/GUI/GUI.cpp:337 src/slic3r/GUI/Plater.cpp:818 +#: src/slic3r/GUI/GCodeViewer.cpp:3931 src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/Plater.cpp:848 msgid "Print settings" msgstr "Printinstellingen" -#: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 -#: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1970 src/slic3r/GUI/Tab.cpp:1971 +#: src/slic3r/GUI/GCodeViewer.cpp:3936 src/slic3r/GUI/GUI.cpp:330 +#: src/slic3r/GUI/Plater.cpp:849 src/slic3r/GUI/Tab.cpp:1930 +#: src/slic3r/GUI/Tab.cpp:1931 msgid "Filament" msgstr "Filament" -#: src/slic3r/GUI/GCodeViewer.cpp:3739 +#: src/slic3r/GUI/GCodeViewer.cpp:3950 msgid "Estimated printing times" msgstr "Geschatte printtijden" -#: src/slic3r/GUI/GCodeViewer.cpp:3758 +#: src/slic3r/GUI/GCodeViewer.cpp:3969 msgid "Normal mode" msgstr "Normale modus" -#: src/slic3r/GUI/GCodeViewer.cpp:3759 +#: src/slic3r/GUI/GCodeViewer.cpp:3970 msgid "Stealth mode" msgstr "Stille modus" -#: src/slic3r/GUI/GCodeViewer.cpp:3766 src/libslic3r/PrintConfig.cpp:1189 -#: src/libslic3r/PrintConfig.cpp:1207 src/libslic3r/PrintConfig.cpp:1217 -#: src/libslic3r/PrintConfig.cpp:1262 +#: src/slic3r/GUI/GCodeViewer.cpp:3979 src/libslic3r/PrintConfig.cpp:1249 +#: src/libslic3r/PrintConfig.cpp:1267 src/libslic3r/PrintConfig.cpp:1277 +#: src/libslic3r/PrintConfig.cpp:1322 msgid "First layer" msgstr "Eerste laag" -#: src/slic3r/GUI/GCodeViewer.cpp:3767 +#: src/slic3r/GUI/GCodeViewer.cpp:3983 msgid "Total" msgstr "Totaal" -#: src/slic3r/GUI/GCodeViewer.cpp:3796 +#: src/slic3r/GUI/GCodeViewer.cpp:4002 msgid "Show stealth mode" msgstr "Toon stille modus" -#: src/slic3r/GUI/GCodeViewer.cpp:3800 +#: src/slic3r/GUI/GCodeViewer.cpp:4006 msgid "Show normal mode" msgstr "Toon normale modus" -#: src/slic3r/GUI/GLCanvas3D.cpp:225 src/slic3r/GUI/GLCanvas3D.cpp:4694 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:53 -msgid "Variable layer height" -msgstr "Variabele laagdikte" +#: src/slic3r/GUI/GCodeViewer.cpp:4071 +msgid "Wipe" +msgstr "Afvegen" -#: src/slic3r/GUI/GLCanvas3D.cpp:227 -msgid "Left mouse button:" -msgstr "Linkermuisknop:" +#: src/slic3r/GUI/GCodeViewer.cpp:4075 +msgid "Retractions" +msgstr "Retracties" -#: src/slic3r/GUI/GLCanvas3D.cpp:229 -msgid "Add detail" -msgstr "Voeg detail toe" +#: src/slic3r/GUI/GCodeViewer.cpp:4079 +msgid "Deretractions" +msgstr "Deretracties" -#: src/slic3r/GUI/GLCanvas3D.cpp:231 -msgid "Right mouse button:" +#: src/slic3r/GUI/GCodeViewer.cpp:4083 +msgid "Seams" +msgstr "Naad" + +#: src/slic3r/GUI/GCodeViewer.cpp:4087 +msgid "Tool changes" +msgstr "Toolwisselingen" + +#: src/slic3r/GUI/GCodeViewer.cpp:4091 +msgid "Color changes" +msgstr "Kleurwisselingen" + +#: src/slic3r/GUI/GCodeViewer.cpp:4095 +msgid "Print pauses" +msgstr "Printpauzes" + +#: src/slic3r/GUI/GCodeViewer.cpp:4099 +msgid "Custom G-codes" +msgstr "Aangepaste G-code" + +#: src/slic3r/GUI/GCodeViewer.cpp:4103 +msgid "Center of gravity" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:4108 +msgid "Shells" +msgstr "Shells" + +#: src/slic3r/GUI/GCodeViewer.cpp:4113 +msgid "Tool marker" +msgstr "Toolmarkering" + +#: src/slic3r/GUI/GLCanvas3D.cpp:185 src/slic3r/GUI/GLCanvas3D.cpp:4784 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:71 +msgid "Variable layer height" +msgstr "Variabele laagdikte" + +#: src/slic3r/GUI/GLCanvas3D.cpp:187 +msgid "Left mouse button:" +msgstr "Linkermuisknop:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:189 +msgid "Add detail" +msgstr "Voeg detail toe" + +#: src/slic3r/GUI/GLCanvas3D.cpp:191 +msgid "Right mouse button:" msgstr "Rechtermuisknop:" -#: src/slic3r/GUI/GLCanvas3D.cpp:233 +#: src/slic3r/GUI/GLCanvas3D.cpp:193 msgid "Remove detail" msgstr "Verwijder detail" -#: src/slic3r/GUI/GLCanvas3D.cpp:235 +#: src/slic3r/GUI/GLCanvas3D.cpp:195 msgid "Shift + Left mouse button:" msgstr "Shift + linkermuisknop:" -#: src/slic3r/GUI/GLCanvas3D.cpp:237 +#: src/slic3r/GUI/GLCanvas3D.cpp:197 msgid "Reset to base" msgstr "Reset" -#: src/slic3r/GUI/GLCanvas3D.cpp:239 +#: src/slic3r/GUI/GLCanvas3D.cpp:199 msgid "Shift + Right mouse button:" msgstr "Shift + rechtermuisknop:" -#: src/slic3r/GUI/GLCanvas3D.cpp:241 +#: src/slic3r/GUI/GLCanvas3D.cpp:201 msgid "Smoothing" msgstr "Egaliseren" -#: src/slic3r/GUI/GLCanvas3D.cpp:243 +#: src/slic3r/GUI/GLCanvas3D.cpp:203 msgid "Mouse wheel:" msgstr "Scrollwieltje:" -#: src/slic3r/GUI/GLCanvas3D.cpp:245 +#: src/slic3r/GUI/GLCanvas3D.cpp:205 msgid "Increase/decrease edit area" msgstr "Vergroot/verklein bewerkgebied" -#: src/slic3r/GUI/GLCanvas3D.cpp:248 +#: src/slic3r/GUI/GLCanvas3D.cpp:208 msgid "Adaptive" msgstr "Adaptief" -#: src/slic3r/GUI/GLCanvas3D.cpp:254 +#: src/slic3r/GUI/GLCanvas3D.cpp:214 msgid "Quality / Speed" msgstr "Kwaliteit / Snelheid" -#: src/slic3r/GUI/GLCanvas3D.cpp:257 +#: src/slic3r/GUI/GLCanvas3D.cpp:217 msgid "Higher print quality versus higher print speed." msgstr "Hogere printkwaliteit tegenover een hogere printsnelheid." -#: src/slic3r/GUI/GLCanvas3D.cpp:268 +#: src/slic3r/GUI/GLCanvas3D.cpp:228 msgid "Smooth" msgstr "Egaliseer" -#: src/slic3r/GUI/GLCanvas3D.cpp:274 src/libslic3r/PrintConfig.cpp:819 +#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/libslic3r/PrintConfig.cpp:908 msgid "Radius" msgstr "Radius" -#: src/slic3r/GUI/GLCanvas3D.cpp:286 +#: src/slic3r/GUI/GLCanvas3D.cpp:246 msgid "Keep min" msgstr "Behoud min" -#: src/slic3r/GUI/GLCanvas3D.cpp:295 src/slic3r/GUI/GLCanvas3D.cpp:4123 +#: src/slic3r/GUI/GLCanvas3D.cpp:255 src/slic3r/GUI/GLCanvas3D.cpp:4217 msgid "Reset" msgstr "Reset" -#: src/slic3r/GUI/GLCanvas3D.cpp:561 +#: src/slic3r/GUI/GLCanvas3D.cpp:602 msgid "Variable layer height - Manual edit" msgstr "Variabele laagdikte - handmatig bewerken" -#: src/slic3r/GUI/GLCanvas3D.cpp:676 +#: src/slic3r/GUI/GLCanvas3D.cpp:717 msgid "Seq." msgstr "Volg." -#: src/slic3r/GUI/GLCanvas3D.cpp:1310 +#: src/slic3r/GUI/GLCanvas3D.cpp:1319 msgid "Variable layer height - Reset" msgstr "Variabele laagdikte - reset" -#: src/slic3r/GUI/GLCanvas3D.cpp:1318 +#: src/slic3r/GUI/GLCanvas3D.cpp:1327 msgid "Variable layer height - Adaptive" msgstr "Variabele laagdikte - adaptief" -#: src/slic3r/GUI/GLCanvas3D.cpp:1326 +#: src/slic3r/GUI/GLCanvas3D.cpp:1335 msgid "Variable layer height - Smooth all" -msgstr "Variable laagdikte - egaliseer alles" +msgstr "Variabele laagdikte - egaliseer alles" -#: src/slic3r/GUI/GLCanvas3D.cpp:1733 +#: src/slic3r/GUI/GLCanvas3D.cpp:1778 msgid "Mirror Object" msgstr "Spiegel object" -#: src/slic3r/GUI/GLCanvas3D.cpp:2612 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:560 +#: src/slic3r/GUI/GLCanvas3D.cpp:2542 src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:117 msgid "Gizmo-Move" msgstr "Verplaatsen" -#: src/slic3r/GUI/GLCanvas3D.cpp:2695 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562 +#: src/slic3r/GUI/GLCanvas3D.cpp:2638 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:661 msgid "Gizmo-Rotate" msgstr "Roteren" -#: src/slic3r/GUI/GLCanvas3D.cpp:3300 +#: src/slic3r/GUI/GLCanvas3D.cpp:3263 msgid "Move Object" msgstr "Verplaats object" -#: src/slic3r/GUI/GLCanvas3D.cpp:3821 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3513 +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:40 +msgid "Gizmo-Place on Face" +msgstr "Plaats op vlak" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3904 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Switch to Settings" msgstr "Schakel over naar instellingen" -#: src/slic3r/GUI/GLCanvas3D.cpp:3822 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3905 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Print Settings Tab" msgstr "Printinstellingentab" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Filament Settings Tab" msgstr "Filamentinstellingentab" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Material Settings Tab" msgstr "Materiaalinstellingentab" -#: src/slic3r/GUI/GLCanvas3D.cpp:3824 src/slic3r/GUI/GLCanvas3D.cpp:4657 +#: src/slic3r/GUI/GLCanvas3D.cpp:3907 src/slic3r/GUI/GLCanvas3D.cpp:4746 msgid "Printer Settings Tab" msgstr "Printerinstellingentab" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Undo History" msgstr "Geschiedenis ongedaan maken" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Redo History" msgstr "Geschiedenis opnieuw doen" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" msgstr[0] "Maak %1$d actie ongedaan" msgstr[1] "Maak %1$d acties ongedaan" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" msgstr[0] "Doe %1$d actie opnieuw" msgstr[1] "Doe %1$d acties opnieuw" -#: src/slic3r/GUI/GLCanvas3D.cpp:4011 src/slic3r/GUI/GLCanvas3D.cpp:4673 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 src/slic3r/GUI/Search.cpp:426 +#: src/slic3r/GUI/GLCanvas3D.cpp:4106 src/slic3r/GUI/GLCanvas3D.cpp:4762 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/Search.cpp:482 msgid "Search" msgstr "Zoek" -#: src/slic3r/GUI/GLCanvas3D.cpp:4025 src/slic3r/GUI/GLCanvas3D.cpp:4033 -#: src/slic3r/GUI/Search.cpp:432 +#: src/slic3r/GUI/GLCanvas3D.cpp:4120 src/slic3r/GUI/GLCanvas3D.cpp:4128 +#: src/slic3r/GUI/Search.cpp:488 msgid "Enter a search term" msgstr "Voer een zoekterm in" -#: src/slic3r/GUI/GLCanvas3D.cpp:4064 +#: src/slic3r/GUI/GLCanvas3D.cpp:4160 msgid "Arrange options" msgstr "Schikopties" -#: src/slic3r/GUI/GLCanvas3D.cpp:4097 +#: src/slic3r/GUI/GLCanvas3D.cpp:4193 #, boost-format msgid "Press %1%left mouse button to enter the exact value" msgstr "Druk de %1%linkermuisknop om de exacte waarde in te voeren" -#: src/slic3r/GUI/GLCanvas3D.cpp:4099 +#: src/slic3r/GUI/GLCanvas3D.cpp:4195 msgid "Spacing" msgstr "Tussenruimte" -#: src/slic3r/GUI/GLCanvas3D.cpp:4106 -msgid "Enable rotations (slow)" -msgstr "Sta draaien toe (vertraagd het slicen)" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Alignment" -msgstr "Uitlijning" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:4500 -msgid "Center" -msgstr "Centreer" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear left" +#: src/slic3r/GUI/GLCanvas3D.cpp:4202 +msgid "Spacing from bed" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front left" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front right" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear right" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:2271 -msgid "Random" -msgstr "Willekeurig" +#: src/slic3r/GUI/GLCanvas3D.cpp:4209 +msgid "Enable rotations (slow)" +msgstr "Sta draaien toe (vertraagd het slicen)" -#: src/slic3r/GUI/GLCanvas3D.cpp:4133 src/slic3r/GUI/GLCanvas3D.cpp:4565 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Plater.cpp:1664 +#: src/slic3r/GUI/GLCanvas3D.cpp:4228 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 src/slic3r/GUI/Plater.cpp:7118 msgid "Arrange" msgstr "Schikken" -#: src/slic3r/GUI/GLCanvas3D.cpp:4539 +#: src/slic3r/GUI/GLCanvas3D.cpp:4630 msgid "Add..." msgstr "Voeg toe..." -#: src/slic3r/GUI/GLCanvas3D.cpp:4556 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5509 src/slic3r/GUI/Tab.cpp:4158 +#: src/slic3r/GUI/GLCanvas3D.cpp:4647 src/slic3r/GUI/KBShortcutsDialog.cpp:105 +#: src/slic3r/GUI/Plater.cpp:6047 src/slic3r/GUI/Tab.cpp:4383 msgid "Delete all" msgstr "Verwijder alles" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 src/slic3r/GUI/KBShortcutsDialog.cpp:133 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 src/slic3r/GUI/KBShortcutsDialog.cpp:142 msgid "Arrange selection" msgstr "Schik selectie" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 msgid "Click right mouse button to show arrangement options" msgstr "Rechtermuisklik om schikopties te tonen" -#: src/slic3r/GUI/GLCanvas3D.cpp:4587 +#: src/slic3r/GUI/GLCanvas3D.cpp:4676 msgid "Copy" msgstr "Kopieer" -#: src/slic3r/GUI/GLCanvas3D.cpp:4596 +#: src/slic3r/GUI/GLCanvas3D.cpp:4685 msgid "Paste" msgstr "Plak" -#: src/slic3r/GUI/GLCanvas3D.cpp:4608 src/slic3r/GUI/GUI_Factories.cpp:1084 -#: src/slic3r/GUI/GUI_Factories.cpp:1108 src/slic3r/GUI/GUI_Factories.cpp:1119 +#: src/slic3r/GUI/GLCanvas3D.cpp:4697 src/slic3r/GUI/GUI_Factories.cpp:1237 +#: src/slic3r/GUI/GUI_Factories.cpp:1261 src/slic3r/GUI/GUI_Factories.cpp:1272 msgid "Add instance" msgstr "Voeg instantie toe" -#: src/slic3r/GUI/GLCanvas3D.cpp:4619 src/slic3r/GUI/GUI_Factories.cpp:1087 +#: src/slic3r/GUI/GLCanvas3D.cpp:4708 src/slic3r/GUI/GUI_Factories.cpp:1240 msgid "Remove instance" msgstr "Verwijder instantie" -#: src/slic3r/GUI/GLCanvas3D.cpp:4632 +#: src/slic3r/GUI/GLCanvas3D.cpp:4721 msgid "Split to objects" msgstr "Verdeel in objecten" -#: src/slic3r/GUI/GLCanvas3D.cpp:4642 +#: src/slic3r/GUI/GLCanvas3D.cpp:4731 msgid "Split to parts" msgstr "Verdeel in onderdelen" -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/GLCanvas3D.cpp:4795 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/GLCanvas3D.cpp:4874 msgid "Click right mouse button to open/close History" msgstr "Rechtermuisklik om geschiedenis te openen/sluiten" -#: src/slic3r/GUI/GLCanvas3D.cpp:4779 +#: src/slic3r/GUI/GLCanvas3D.cpp:4859 #, boost-format msgid "Next Undo action: %1%" msgstr "Volgende ongedaan maken: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:4795 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/GLCanvas3D.cpp:4874 src/slic3r/GUI/KBShortcutsDialog.cpp:107 +#: src/slic3r/GUI/MainFrame.cpp:1429 msgid "Redo" msgstr "Doe opnieuw" -#: src/slic3r/GUI/GLCanvas3D.cpp:4817 +#: src/slic3r/GUI/GLCanvas3D.cpp:4895 #, boost-format msgid "Next Redo action: %1%" msgstr "Volgende opnieuw doen: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:6434 +#: src/slic3r/GUI/GLCanvas3D.cpp:6784 msgid "An object outside the print area was detected." msgstr "Er is een object buiten het printbereik gedetecteerd." -#: src/slic3r/GUI/GLCanvas3D.cpp:6435 +#: src/slic3r/GUI/GLCanvas3D.cpp:6785 msgid "A toolpath outside the print area was detected." msgstr "Er is een toolpad buiten het printbereik gedetecteerd." -#: src/slic3r/GUI/GLCanvas3D.cpp:6436 +#: src/slic3r/GUI/GLCanvas3D.cpp:6786 msgid "SLA supports outside the print area were detected." msgstr "Er zijn SLA-supports buiten het printbereik gedetecteerd." -#: src/slic3r/GUI/GLCanvas3D.cpp:6437 +#: src/slic3r/GUI/GLCanvas3D.cpp:6787 msgid "Some objects are not visible during editing." msgstr "Sommige objecten zijn niet zichtbaar tijdens het bewerken." -#: src/slic3r/GUI/GLCanvas3D.cpp:6439 -msgid "" -"An object outside the print area was detected.\n" -"Resolve the current problem to continue slicing." +#: src/slic3r/GUI/GLCanvas3D.cpp:6789 +msgid "" +"An object outside the print area was detected.\n" +"Resolve the current problem to continue slicing." +msgstr "" +"Er is een object buiten het printbereik gedetecteerd.\n" +"Los het probleem op om door te gaan met slicen." + +#: src/slic3r/GUI/GLCanvas3D.cpp:6864 +msgid "Selection-Add from rectangle" +msgstr "Selectie - Voeg toe van boxselectie" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6879 +msgid "Selection-Remove from rectangle" +msgstr "Selectie - Verwijder van boxselectie" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:206 +msgid "Planar" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Auto" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Manual" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:213 +msgid "Plug" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:214 +msgid "Dowel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Prism" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Frustum" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Triangle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Square" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Hexagon" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:59 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 +msgid "Circle" +msgstr "Cirkel" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:233 +msgid "Keep orientation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:234 +msgid "Place on cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:235 +msgid "Flip upside down" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +msgid "inch" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 +msgid "Part" +msgstr "Onderdeel" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 src/libslic3r/Print.cpp:1236 +msgid "Object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:264 +msgid "" +"Click to flip the cut plane\n" +"Drag to move the cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:269 src/libslic3r/PrintConfig.cpp:498 +#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2325 src/libslic3r/PrintConfig.cpp:2613 +#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2876 src/libslic3r/PrintConfig.cpp:2907 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3231 +#: src/libslic3r/PrintConfig.cpp:3466 src/libslic3r/PrintConfig.cpp:3951 +msgid "°" +msgstr "°" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:367 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:571 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1232 +msgid "Move cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +msgid "in" +msgstr "in" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:544 +msgid "Value" +msgstr "Waarde" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:549 +msgid "Tolerance" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 +msgid "Left click" +msgstr "Linkermuisknop" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2348 +msgid "Add connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 +msgid "Right click" +msgstr "Rechtermuisknop" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +msgid "Remove connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 +msgid "Drag" +msgstr "Versleep" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1216 +msgid "Move connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +msgid "Add connector to selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +msgid "Remove connector from selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:870 +msgid "Select all connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:894 src/libslic3r/PrintConfig.cpp:4644 +msgid "Cut" +msgstr "Snij door" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1227 +msgid "Rotate cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1448 +msgid "Render cut plane as circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1537 +msgid "Connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1541 +msgid "Remove connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1550 +msgid "Type" +msgstr "Type" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1561 src/libslic3r/PrintConfig.cpp:2816 +msgid "Style" +msgstr "Type" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1568 +msgid "Depth ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1586 +msgid "Confirm connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1652 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1666 +msgid "Flip cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1710 +msgid "Hold SHIFT key to draw a cut line" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1716 +msgid "Cut position: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1725 +msgid "Reset cutting plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Edit connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Add connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1744 +msgid "Reset cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1745 +msgid "Reset cutting plane and remove connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1800 +msgid "After cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1820 +msgid "Cut to" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1823 +msgid "Objects" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1826 +msgid "Parts" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1840 +msgid "Perform cut" +msgstr "Snij door" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1930 +msgid "Invalid connectors detected" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1932 +#, c-format, boost-format +msgid "%1$d connector is out of cut contour" +msgid_plural "%1$d connectors are out of cut contour" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1935 +#, c-format, boost-format +msgid "%1$d connector is out of object" +msgid_plural "%1$d connectors are out of object" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1938 +msgid "Some connectors are overlapped" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1942 +msgid "" +"Invalid state. \n" +"No one part is selected for keep after cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1944 +msgid "" +"Warning state. \n" +"Cut plane is placed out of object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2153 +msgid "Connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2183 +msgid "Cut by Plane" +msgstr "Snij met behulp van vlak" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2323 +msgid "Cut by line" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2373 +msgid "Delete connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:252 +msgid "Entering Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:253 +msgid "Leaving Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:254 +msgid "Cut gizmo editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:601 +msgid "Emboss" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:866 +msgid "ERROR: Wait until ends or Cancel process." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:921 +msgid "Text-Rotate" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:953 +msgid "Font" +msgstr "Lettertype" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:954 +#: src/libslic3r/PrintConfig.cpp:897 +msgid "Height" +msgstr "Hoogte" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:955 +msgid "Depth" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:963 +msgid "Use surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:964 +msgid "Char gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:965 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Line gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:966 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:967 +msgid "Skew ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:968 +msgid "Z-move" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:969 +msgid "Z-rot" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:970 +msgid "Collection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1047 +msgid "NORMAL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1048 +msgid "SMALL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1049 +msgid "ITALIC" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1050 +msgid "SWISS" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1051 +msgid "MODERN" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1088 +msgid "First font" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1093 +msgid "Default font" +msgstr "Standaard lettertype" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1098 +msgid "Embossed text" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1513 +msgid "Warning: No font is selected. Select correct one." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1531 +#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1437 +#: src/slic3r/GUI/Tab.cpp:1472 src/slic3r/GUI/Tab.cpp:1607 +#: src/slic3r/GUI/Tab.cpp:1611 src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:2390 src/slic3r/GUI/Tab.cpp:4985 +#: src/libslic3r/PrintConfig.cpp:276 src/libslic3r/PrintConfig.cpp:514 +#: src/libslic3r/PrintConfig.cpp:1484 src/libslic3r/PrintConfig.cpp:1566 +#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:2562 +#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:3166 +#: src/libslic3r/PrintConfig.cpp:3200 src/libslic3r/PrintConfig.cpp:3211 +#: src/libslic3r/PrintConfig.cpp:3226 src/libslic3r/PrintConfig.cpp:3239 +#: src/libslic3r/PrintConfig.cpp:3248 src/libslic3r/PrintConfig.cpp:3260 +#: src/libslic3r/PrintConfig.cpp:3642 +msgid "Advanced" +msgstr "Geavanceerd" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1631 +msgid "Can't write text by selected font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1632 +msgid "Try to choose another font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Empty" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Embossed text can NOT contain only white spaces." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Bad symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Text contain character glyph (represented by '?') unknown by font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:535 +msgid "Skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +msgid "Unsupported visualization of font skew for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Unsupported visualization of font boldness for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Unsupported visualization of gap between lines inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Too tall" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Diminished font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Too small" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Enlarged font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1660 +#, boost-format +msgid "%1% is NOT shown." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1964 +msgid " No symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1965 +msgid " ... Loading" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2015 +msgid " ... In queue" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2132 +#, boost-format +msgid "Font face \"%1%\" can't be selected." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2180 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:754 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:367 +msgid "Apply" +msgstr "Toepassen" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2192 +msgid "add file with font(.ttf, .ttc)" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2202 +msgid "Open dialog for choose from fonts." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2210 +msgid "Text is to object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2224 +msgid "Added" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2227 +msgid "Click to change text into object part." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2230 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4321 +msgid "You can't change a type of the last solid part of the object." +msgstr "" +"U kunt het type van het laatste onderdeel van een object niet wijzigen." + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2231 +msgid "Subtracted" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2237 +msgid "Click to change part type into negative volume." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2243 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4338 +msgid "Modifier" +msgstr "Modificator" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2249 +msgid "Click to change part type into modifier." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2256 +msgid "Change Text Type" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2287 +#, boost-format +msgid "Rename style(%1%) for embossing text: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2299 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2384 +msgid "Name can't be empty." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2301 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2386 +msgid "Name has to be unique." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2310 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2397 +msgid "ok" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2312 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2401 +msgid "cancel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2337 +msgid "Rename style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2344 +msgid "Rename current style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2345 +msgid "Can't rename temporary style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2362 +msgid "First Add style to list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2364 +#, boost-format +msgid "Save %1% style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2366 +msgid "No changes to save." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2373 +msgid "New name of style: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2422 +msgid "Save as new style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2434 +msgid "Only valid font can be added to style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2436 +msgid "Add style to my list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2438 +msgid "Add as new named style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2454 +msgid "Remove style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2485 +#, boost-format +msgid "Delete \"%1%\" style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2486 +#, boost-format +msgid "Can't delete \"%1%\". It is last style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2487 +#, boost-format +msgid "Can't delete temporary style \"%1%\"." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2494 +#, boost-format +msgid "" +"Are you sure,\n" +"that you want permanently and unrecoverable \n" +"remove style \"%1%\"?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2496 +msgid "Yes" +msgstr "Ja" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2505 +msgid "No" +msgstr "Nee" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2555 +msgid "Presets" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2564 src/slic3r/GUI/GUI_App.cpp:2324 +msgid "modified" +msgstr "aangepast" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2617 +#, boost-format +msgid "Modified style \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2618 +#, boost-format +msgid "Current style is \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2625 +msgid "Style modification will be lost." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2627 +#, boost-format +msgid "" +"Changing style to '%1%' will discard current style modification.\n" +"\n" +" Would you like to continue anyway?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2643 +msgid "Not valid style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2644 +#, boost-format +msgid "Style '%1%' can't be used and will be removed from list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2691 +msgid "Unset italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2708 +msgid "Set italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2738 +msgid "Unset bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2756 +msgid "Set bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2922 +msgid "WxFont is not loaded properly." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2957 +msgid "Revert font changes." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2991 +msgid "wx Make bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3002 +msgid "Revert text size." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3029 +msgid "Revert embossed depth." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3178 +msgid "" +"Advanced font options could be changed only for correct font.\n" +"Start with select correct font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3219 +msgid "Revert using of model surface." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3232 +msgid "font points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3241 +msgid "Revert gap between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3242 +msgid "Distance between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3257 +msgid "Revert gap between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3258 +msgid "Distance between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3272 +msgid "Undo boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3273 +msgid "Tiny / Wide glyphs" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3283 +msgid "Undo letter's skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3284 +msgid "Italic strength ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3304 +msgid "Undo translation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3305 +msgid "Distance of the center of text from model surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3350 +msgid "Undo rotation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3352 +msgid "Rotate text Clock-wise." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3386 +msgid "Select from True Type Collection." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3395 +msgid "Set text to face camera" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3402 +msgid "Use camera direction for text orientation" msgstr "" -"Er is een object buiten het printbereik gedetecteerd.\n" -"Los het probleem op om door te gaan met slicen." -#: src/slic3r/GUI/GLCanvas3D.cpp:6513 -msgid "Selection-Add from rectangle" -msgstr "Selectie - Voeg toe van boxselectie" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3486 +#, boost-format +msgid "Font '%1%' can't be used. Please select another." +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6528 -msgid "Selection-Remove from rectangle" -msgstr "Selectie - Verwijder van boxselectie" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3488 +msgid "Selected font is NOT True-type." +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4478 -msgid "Cut" -msgstr "Snij door" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3512 +msgid "Choose one or more files (TTF, TTC):" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -msgid "in" -msgstr "in" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3539 +msgid "Choose SVG file:" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 -msgid "Keep upper part" -msgstr "Behoud bovenste deel" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3600 +#, boost-format +msgid "" +"Can't load exactly same font(\"%1%\"), Aplication selected a similar " +"one(\"%2%\"). You have to specify font for enable edit text." +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 -msgid "Keep lower part" -msgstr "Behoud onderste deel" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:81 +msgid "Enter emboss gizmo" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:196 -msgid "Rotate lower part upwards" -msgstr "Kantel onderste deel naar boven" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:82 +msgid "Leave emboss gizmo" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:201 -msgid "Perform cut" -msgstr "Snij door" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:83 +msgid "Embossing actions" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:37 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:66 msgid "Paint-on supports" msgstr "Inkleur-supports" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 +msgid "Automatic painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 +msgid "painting..." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:107 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 msgid "Clipping of view" msgstr "Weergave samenvoegen" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:106 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 msgid "Reset direction" msgstr "Reset-richting" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:108 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 msgid "Brush size" msgstr "Penseelgrootte" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:109 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 msgid "Brush shape" msgstr "Penseelvorm" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1816 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:110 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 msgid "Left mouse button" msgstr "Linkermuisknop" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 msgid "Enforce supports" msgstr "Forceer supportmateriaal" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 msgid "Right mouse button" msgstr "Rechtermuisknop" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:434 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:573 msgid "Block supports" msgstr "Blokkeer supportmateriaal" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 msgid "Shift + Left mouse button" msgstr "Shift + linkermuisknop" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:429 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:568 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:247 msgid "Remove selection" msgstr "Verwijder selectie" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 msgid "Remove all selection" msgstr "Verwijder alle selecties" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 -msgid "Circle" -msgstr "Cirkel" - -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Sphere" msgstr "Bol" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:68 -#: src/libslic3r/PrintConfig.cpp:1172 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:106 +#: src/libslic3r/PrintConfig.cpp:1231 msgid "Triangles" msgstr "Facetten" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 msgid "Highlight overhang by angle" msgstr "Markeer overhanging bij hoek" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:63 msgid "Enforce" msgstr "Forceer" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 msgid "Tool type" msgstr "Tooltype" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 msgid "Brush" msgstr "Kwast" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:128 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:68 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 msgid "Smart fill" msgstr "Slim vullen" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:131 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 msgid "Smart fill angle" msgstr "Slim hoekvullen" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:132 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:72 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 msgid "Split triangles" msgstr "Split facetten" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:73 msgid "On overhangs only" msgstr "Alleen bij overhangingen" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:174 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:187 #, boost-format msgid "" "Preselects faces by overhang angle. It is possible to restrict paintable " @@ -2703,150 +3714,350 @@ msgstr "" "overschilderbare facetten te beperken tot alleen voorgeselecteerde facetten " "als de optie \"%1%\" aan staat." -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:217 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:378 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:230 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:371 msgid "Paints facets according to the chosen painting brush." msgstr "Schildert facetten volgens de gekozen schilderkwast." -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:391 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:238 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:384 msgid "" "Paints neighboring facets whose relative angle is less or equal to set angle." msgstr "" "Schildert naastgelegen facetten van welke de relatieve hoek kleiner dan of " "gelijk aan een gegeven hoek is." -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:229 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242 #, boost-format msgid "Allows painting only on facets selected by: \"%1%\"" msgstr "" "Staat toe om alleen te schilderen op facetten geselecteerd door: \"%1%\"" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:244 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:419 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:144 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:257 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:412 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141 msgid "Paints all facets inside, regardless of their orientation." msgstr "Kleurt alle binnenfacetten, onafhankelijk van hun oriëntatie." -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:253 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:428 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:152 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:266 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:421 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:149 msgid "Ignores facets facing away from the camera." msgstr "Negeer facetten die niet in beeld zijn." -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:262 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:437 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:430 msgid "Paints only one facet." msgstr "Schildert slechts één facet." -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:270 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:285 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:445 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:462 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:132 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:298 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:438 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:455 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:129 msgid "Alt + Mouse wheel" msgstr "Alt + scrollwieltje" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:288 msgid "Splits bigger facets into smaller ones while the object is painted." msgstr "" "Splitst grote facetten in kleinere terwijl het object wordt geschilderd." -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:308 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:483 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:170 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:321 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:476 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:167 msgid "Ctrl + Mouse wheel" msgstr "Ctrl + scrollwieltje" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:313 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:488 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:175 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:326 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:481 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:172 msgid "Reset selection" msgstr "Reset selectie" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:364 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:382 msgid "Block supports by angle" msgstr "Blokkeer supports op basis van hoek" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:365 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:383 msgid "Add supports by angle" msgstr "Voeg supports to op basis van hoek" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:432 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +msgid "Automatic painting requires valid print setup." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:535 +msgid "Automatic painting will erase all currently painted areas." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:536 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1118 +msgid "Are you sure you want to do it?" +msgstr "Weet u zeker dat u dit wilt doen?" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:540 +msgid "Automatic painting support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:571 msgid "Add supports" msgstr "Voeg supports toe" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:41 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:22 +msgid "Entering Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:23 +msgid "Leaving Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:24 +msgid "Paint-on supports editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:88 msgid "Place on face" msgstr "Plaats op vlak" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:29 msgid "Hollow this object" msgstr "Dit object uithollen" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 msgid "Preview hollowed and drilled model" msgstr "Toon voorbeeld van uitgehold model met gat" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 msgid "Offset" msgstr "Shelldikte" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 msgid "Quality" msgstr "Kwaliteit" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3905 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 +#: src/libslic3r/PrintConfig.cpp:4037 msgid "Closing distance" msgstr "Sluitafstand" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 msgid "Hole diameter" msgstr "Gatdiameter" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 msgid "Hole depth" msgstr "Gatdiepte" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 msgid "Remove selected holes" msgstr "Verwijder geselecteerde gaten" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 msgid "Remove all holes" msgstr "Verwijder alle gaten" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 msgid "Show supports" msgstr "Toon support" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:287 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:242 msgid "Add drainage hole" msgstr "Voeg afvoergat toe" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:403 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:361 msgid "Delete drainage hole" msgstr "Verwijder afvoergat" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:590 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:655 msgid "Hollowing parameter change" msgstr "Wijziging van uitholparameter" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:667 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:739 msgid "Change drainage hole diameter" msgstr "Verander afvoergatdiameter" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:761 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:827 msgid "Hollow and drill" msgstr "Uithollen en gat toevoegen" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:811 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:869 msgid "Move drainage hole" msgstr "Verplaats afvoergat" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:27 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:64 +msgid "No feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:65 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:76 +msgid "Vertex" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:66 +msgid "Edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:68 +msgid "Plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:77 +msgid "Point on edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:78 +msgid "Point on circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:79 +msgid "Point on plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:89 +msgid "Center of edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:90 +msgid "Center of circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:554 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2029 +msgid "Measure" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1236 +msgid "Edit to scale" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1258 +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:161 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:236 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:776 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:794 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:817 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:831 +#: src/libslic3r/PrintConfig.cpp:4713 +msgid "Scale" +msgstr "Verschaal" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1362 +msgctxt "Verb" +msgid "Scale" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1541 +msgid "##angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1740 +msgid "Measure tool debug" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1824 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1851 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1857 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1886 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1893 +msgid "Unselect feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1830 +msgid "Unselect center" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1835 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1862 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1898 +msgid "Select center" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1840 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1867 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1903 +msgid "Unselect point" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1846 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1873 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1910 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select point" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Shift" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Enable point selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2007 +msgid "Restart selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1952 +msgid "Esc" +msgstr "Esc" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1955 +msgid "Unselect" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1999 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2001 +msgid "Selection" +msgstr "Selectie" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2021 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +msgid "Copy to clipboard" +msgstr "Kopieer naar klembord" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2038 +msgid "Angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Perpendicular distance" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Distance" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2062 +msgid "Direct distance" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2072 +msgid "Distance XYZ" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:163 +msgid "Entering Measure gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:164 +msgid "Leaving Measure gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:165 +msgid "Measure gizmo editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:28 #, boost-format msgid "" "Your printer has more extruders than the multi-material painting gizmo " @@ -2857,82 +4068,86 @@ msgstr "" "ondersteunt. Daarom worden alleen de eerste %1% extruders gebruiker voor het " "schilderen." -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:45 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:46 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 msgid "Multimaterial painting" msgstr "Multi-material schilderen" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 msgid "First color" msgstr "Eerste kleur" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 msgid "Second color" msgstr "Tweede kleur" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:120 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:671 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:642 msgid "Remove painted color" msgstr "Verwijder geschilderde kleur" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 msgid "Clear all" msgstr "Herstel alles" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:129 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 msgid "Bucket fill" msgstr "Vlakvullen" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:404 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:397 msgid "Paints neighboring facets that have the same color." msgstr "Schildert naastgelegen facetten die dezelfde kleur hebben." -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:450 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:443 msgid "Split bigger facets into smaller ones while the object is painted." msgstr "" "Splitst groter facetten in kleinere terwijl het object wordt geschilderd." -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:674 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:645 #, boost-format msgid "Painted using: Extruder %1%" msgstr "Geschilderd met: Extruder %1%" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:118 +msgid "Entering Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:119 +msgid "Leaving Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:120 +msgid "Multimaterial painting editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:76 msgid "Move" msgstr "Verplaats" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:466 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4532 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:643 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:745 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:775 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:813 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:830 +#: src/libslic3r/PrintConfig.cpp:4698 msgid "Rotate" msgstr "Roteer" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:505 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:707 msgid "Optimize orientation" msgstr "Optimaliseer oriëntatie" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:552 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:319 -msgid "Apply" -msgstr "Toepassen" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:79 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4547 -msgid "Scale" -msgstr "Verschaal" +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:194 +msgid "Gizmo-Scale" +msgstr "Verschalen" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 msgid "Enforce seam" msgstr "Forceer naad" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:38 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:255 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:252 msgid "Block seam" msgstr "Blokkeer naad" @@ -2940,277 +4155,279 @@ msgstr "Blokkeer naad" msgid "Seam painting" msgstr "Naad kleuren" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:23 +msgid "Entering Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:24 +msgid "Leaving Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:25 +msgid "Paint-on seam editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:105 msgid "Mesh name" msgstr "Mesh-naam" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:69 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:107 msgid "Detail level" msgstr "Detailleringsniveau" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:108 msgid "Decimate ratio" msgstr "Decimeerverhouding" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:113 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:147 #, boost-format msgid "" "Processing model '%1%' with more than 1M triangles could be slow. It is " -"highly recommend to reduce amount of triangles." +"highly recommended to reduce amount of triangles." msgstr "" -"Verwerken van model '%1%' met meer dan 1M facetten kan langzaam zijn. Het " -"wordt aanbevolen het aantal facetten te reduceren." -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:116 -#: src/slic3r/GUI/GUI_Factories.cpp:705 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:150 +#: src/slic3r/GUI/GUI_Factories.cpp:789 msgid "Simplify model" msgstr "Vereenvoudig model" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:143 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:177 msgid "Simplify" msgstr "Vereenvoudig" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:156 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:190 msgid "Simplification is currently only allowed when a single part is selected" msgstr "" "Vereenvoudiging wordt nu alleen ondersteund als een enkel onderdeel is " "geselecteerd" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 -#: src/slic3r/GUI/PrintHostDialogs.cpp:373 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:191 +#: src/slic3r/GUI/MainFrame.cpp:1246 src/slic3r/GUI/MainFrame.cpp:1716 +#: src/slic3r/GUI/PrintHostDialogs.cpp:425 msgid "Error" msgstr "Fout" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:250 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:294 msgid "Extra high" msgstr "Extra hoog" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:251 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:295 msgid "High" msgstr "Hoog" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:252 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:296 msgid "Medium" msgstr "Gemiddeld" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:297 msgid "Low" msgstr "Laag" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:254 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:298 msgid "Extra low" msgstr "Extra laag" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:304 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#, boost-format +msgid "" +"Multipart object can be simplified only by %1%. If you want specify %2% " +"process it separately." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:352 #, c-format, boost-format msgid "%d triangles" msgstr "%d facetten" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:307 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:355 msgid "Show wireframe" msgstr "Toon draadmodel" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:313 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:361 msgid "Operation already cancelling. Please wait few seconds." msgstr "Operatie wordt geannuleerd. Even geduld alstublieft." -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:370 msgid "Can't apply when proccess preview." msgstr "Kan niet toepassen tijdens verwerken van sliceweergave." -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:329 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:377 #, boost-format msgid "Process %1% / 100" msgstr "Proces %1% / 100" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:479 -#, boost-format -msgid "Simplify %1%" -msgstr "Vereenvoudig %1%" +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:542 +msgid "Simplify " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:543 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"simplifying the mesh." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:67 +msgid "Entering SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:68 +msgid "Leaving SLA support points" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:35 msgid "Head diameter" msgstr "Kopdiameter" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:36 msgid "Lock supports under new islands" msgstr "Vergrendel support onder nieuwe eilanden" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:37 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268 msgid "Remove selected points" msgstr "Verwijder geselecteerde punten" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:38 msgid "Remove all points" msgstr "Verwijder alle punten" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1226 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1271 msgid "Apply changes" msgstr "Wijzigingen toepassen" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1227 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1272 msgid "Discard changes" msgstr "Wijzigingen afwijzen" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 msgid "Minimal points distance" msgstr "Minimale puntafstand" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3735 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/libslic3r/PrintConfig.cpp:3867 msgid "Support points density" msgstr "Dichtheid van supportpunten" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1229 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1274 msgid "Auto-generate points" msgstr "Genereer automatisch punten" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 msgid "Manual editing" msgstr "Handmatig bewerken" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:372 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:307 msgid "Add support point" msgstr "Voeg supportpunt toe" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:522 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:460 msgid "Delete support point" msgstr "Verwijder supportpunt" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:702 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:626 msgid "Change point head diameter" msgstr "Wijzig puntkopdiameter" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:770 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:696 msgid "Support parameter change" msgstr "Wijzig supportparameter" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:876 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:806 msgid "SLA Support Points" msgstr "SLA-supportpunten" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:814 msgid "Do you want to save your manually edited support points?" msgstr "Wilt u handmatig aangepaste supportpunten opslaan?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:898 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:815 msgid "Save support points?" msgstr "Supportpunten opslaan?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:958 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:880 msgid "Move support point" msgstr "Verplaats supportpunt" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1051 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:987 msgid "Support points edit" msgstr "Bewerk supportpunten" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1131 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1117 msgid "Autogeneration will erase all manually edited points." msgstr "" "Automatisch genereren zal alle handmatig aangepaste punten verwijderen." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1132 -msgid "Are you sure you want to do it?" -msgstr "Weet u zeker dat u dit wilt doen?" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1138 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1124 msgid "Autogenerate support points" msgstr "Automatisch gegenereerde supportpunten" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1186 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 msgid "SLA gizmo keyboard shortcuts" msgstr "SLA sneltoetsen" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1197 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1242 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "Let op: sommige sneltoetsen werken alleen in bewerkmodus." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 -msgid "Left click" -msgstr "Linkermuisknop" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 msgid "Add point" msgstr "Voeg punt toe" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 -msgid "Right click" -msgstr "Rechtermuisknop" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 msgid "Remove point" msgstr "Verwijder punt" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 -msgid "Drag" -msgstr "Versleep" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 msgid "Move point" msgstr "Verplaats punt" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 msgid "Add point to selection" msgstr "Voeg punt toe aan selectie" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 msgid "Remove point from selection" msgstr "Verwijder punt uit selectie" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 msgid "Select by rectangle" msgstr "Selecteer met boxselectie" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 msgid "Deselect by rectangle" msgstr "Deselecteer met boxselectie" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1267 msgid "Select all points" msgstr "Selecteer alle punten" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Mouse wheel" msgstr "Scrollwieltje" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Move clipping plane" msgstr "Verplaats snijvlak" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1225 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1270 msgid "Reset clipping plane" msgstr "Reset snijvlak" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1228 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273 msgid "Switch to editing mode" msgstr "Schakel over naar bewerkmodus" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:196 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:204 msgid "" "ERROR: Please close all manipulators available from the left toolbar first" msgstr "" "FOUT: Sluit alstublieft eerst alle bewerkingen zoals beschikbaar op de " "linker werkbalk" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:561 -msgid "Gizmo-Scale" -msgstr "Verschalen" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:673 -msgid "Gizmo-Place on Face" -msgstr "Plaats op vlak" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:1270 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:998 msgid "" "You are currently editing SLA support points. Please, apply or discard your " "changes first." @@ -3218,16 +4435,16 @@ msgstr "" "U bewerkt momenteel SLA-supportpunten. Pas de wijzigingen toe of negeer ze " "eerst." -#: src/slic3r/GUI/GUI.cpp:292 +#: src/slic3r/GUI/GUI.cpp:287 msgid "Undefined" msgstr "Ongedefinieerd" -#: src/slic3r/GUI/GUI.cpp:317 +#: src/slic3r/GUI/GUI.cpp:308 #, boost-format msgid "%1% was substituted with %2%" msgstr "%1% is gesubstitueerd met %2%" -#: src/slic3r/GUI/GUI.cpp:326 +#: src/slic3r/GUI/GUI.cpp:317 msgid "" "Most likely the configuration was produced by a newer version of PrusaSlicer " "or by some PrusaSlicer fork." @@ -3235,23 +4452,23 @@ msgstr "" "Waarschijnlijk is de configuratie gemaakt door een nieuwere versie van " "PrusaSlicer of een afgeleide daarvan." -#: src/slic3r/GUI/GUI.cpp:327 +#: src/slic3r/GUI/GUI.cpp:318 msgid "The following values were substituted:" msgstr "De volgende waarden zijn gesubstitueerd:" -#: src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/GUI.cpp:319 msgid "Review the substitutions and adjust them if needed." msgstr "Beoordeel de substituties en pas aan indien gewenst." -#: src/slic3r/GUI/GUI.cpp:338 src/slic3r/GUI/Plater.cpp:820 +#: src/slic3r/GUI/GUI.cpp:329 src/slic3r/GUI/Plater.cpp:850 msgid "SLA print settings" msgstr "SLA-printinstellingen" -#: src/slic3r/GUI/GUI.cpp:342 src/slic3r/GUI/PhysicalPrinterDialog.cpp:157 +#: src/slic3r/GUI/GUI.cpp:333 src/slic3r/GUI/PhysicalPrinterDialog.cpp:158 msgid "Physical Printer" msgstr "Fysieke printer" -#: src/slic3r/GUI/GUI.cpp:355 +#: src/slic3r/GUI/GUI.cpp:346 msgid "" "Configuration bundle was loaded, however some configuration values were not " "recognized." @@ -3259,7 +4476,7 @@ msgstr "" "Configuratiebundel is geladen, hoewel sommige configuratiewaarden niet " "herkend werden." -#: src/slic3r/GUI/GUI.cpp:365 +#: src/slic3r/GUI/GUI.cpp:356 #, boost-format msgid "" "Configuration file \"%1%\" was loaded, however some configuration values " @@ -3268,16 +4485,16 @@ msgstr "" "Configuratiebestand \"%1%\" is geladen, hoewel sommige configuratiewaarden " "niet herkend werden." -#: src/slic3r/GUI/GUI_App.cpp:266 +#: src/slic3r/GUI/GUI_App.cpp:275 msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." msgstr "" "is gebaseerd op Slic3R van Allessandro Ranellucci en de RepRap-community." -#: src/slic3r/GUI/GUI_App.cpp:267 +#: src/slic3r/GUI/GUI_App.cpp:276 msgid "Developed by Prusa Research." msgstr "Ontwikkeld door Prusa Research." -#: src/slic3r/GUI/GUI_App.cpp:269 +#: src/slic3r/GUI/GUI_App.cpp:278 msgid "" "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." @@ -3286,11 +4503,11 @@ msgstr "" "Meszaros, Lukas Matena, Vojtech Kral, David Kocik, Simon Tillema en vele " "anderen." -#: src/slic3r/GUI/GUI_App.cpp:270 -msgid "Artwork model by Leslie Ing" -msgstr "Kunstwerkmodel door Leslie Ing" +#: src/slic3r/GUI/GUI_App.cpp:279 +msgid "Artwork model by Creative Tools" +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:411 +#: src/slic3r/GUI/GUI_App.cpp:420 #, boost-format msgid "" "Starting with %1% 2.3, configuration directory on Linux has changed " @@ -3325,20 +4542,20 @@ msgstr "" "\n" "Wat wil je nu doen?" -#: src/slic3r/GUI/GUI_App.cpp:419 +#: src/slic3r/GUI/GUI_App.cpp:428 #, c-format, boost-format msgid "%s - BREAKING CHANGE" msgstr "%s- INGRIJPENDE WIJZIGING" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Quit, I will move my data now" msgstr "Afsluiten, ik zal mijn data nu verplaatsen" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Start the application" msgstr "Start het programma" -#: src/slic3r/GUI/GUI_App.cpp:699 +#: src/slic3r/GUI/GUI_App.cpp:725 #, c-format, boost-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -3347,17 +4564,17 @@ msgid "" "\n" "The application will now terminate." msgstr "" -"%s veroorzaakte een fout. Dit komt mogelijk door een geheugentekort. Als u " -"zeker weet dat u genoeg RAM-geheugen heeft, kan dit ook een andere fout " +"%s heeft een fout opgelopen. Dit komt mogelijk door een geheugentekort. Als " +"u zeker weet genoeg RAM geheugen te hebben, kan dit ook een andere fout " "zijn. We waarderen het als u dit meldt.\n" "\n" "Het programma zal nu afsluiten." -#: src/slic3r/GUI/GUI_App.cpp:702 +#: src/slic3r/GUI/GUI_App.cpp:728 msgid "Fatal error" msgstr "Fatale fout" -#: src/slic3r/GUI/GUI_App.cpp:706 +#: src/slic3r/GUI/GUI_App.cpp:732 msgid "" "PrusaSlicer has encountered a localization error. Please report to " "PrusaSlicer team, what language was active and in which scenario this issue " @@ -3365,22 +4582,22 @@ msgid "" "\n" "The application will now terminate." msgstr "" -"PrusaSlicer is een vertalingsprobleem tegengekomen. Gelieve te melden bij " -"het PrusaSlicer team; welke taal actief is en in welk scenario dit gebeurde. " -"Hartelijk dank.\n" +"PrusaSlicer heeft een vertalingsprobleem opgelopen. We zouden het waarderen " +"als u dit meldt bij het PrusaSlicer team; welke taal actief is en in welk " +"scenario dit gebeurde. Hartelijk dank.\n" "\n" "Het programma zal nu sluiten." -#: src/slic3r/GUI/GUI_App.cpp:709 +#: src/slic3r/GUI/GUI_App.cpp:735 msgid "Critical error" msgstr "Kritische fout" -#: src/slic3r/GUI/GUI_App.cpp:714 +#: src/slic3r/GUI/GUI_App.cpp:740 #, boost-format msgid "Internal error: %1%" msgstr "Interne fout: %1%" -#: src/slic3r/GUI/GUI_App.cpp:909 src/slic3r/GUI/GUI_App.cpp:1007 +#: src/slic3r/GUI/GUI_App.cpp:954 src/slic3r/GUI/GUI_App.cpp:1051 msgid "" "Error parsing PrusaSlicer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error. Your user profiles will " @@ -3390,7 +4607,7 @@ msgstr "" "Probeer het bestand handmatig te verwijderen om de fout te herstellen. Uw " "gebruikersprofielen worden niet beïnvloed." -#: src/slic3r/GUI/GUI_App.cpp:915 src/slic3r/GUI/GUI_App.cpp:1013 +#: src/slic3r/GUI/GUI_App.cpp:960 src/slic3r/GUI/GUI_App.cpp:1057 msgid "" "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error." @@ -3398,12 +4615,12 @@ msgstr "" "Fout tijdens het lezen van PrusaGCodeViewer-configuratiebestand. Het is " "mogelijk beschadigd. Probeer het handmatig te verwijderen." -#: src/slic3r/GUI/GUI_App.cpp:962 +#: src/slic3r/GUI/GUI_App.cpp:1006 #, boost-format msgid "You are opening %1% version %2%." msgstr "U opent %1%, versie %2%." -#: src/slic3r/GUI/GUI_App.cpp:965 +#: src/slic3r/GUI/GUI_App.cpp:1009 #, boost-format msgid "" "The active configuration was created by %1% %2%,\n" @@ -3422,7 +4639,7 @@ msgstr "" "In dat geval wordt uw actieve configuratie opgeslagen voor het importeren " "van de nieuwe configuratie." -#: src/slic3r/GUI/GUI_App.cpp:973 +#: src/slic3r/GUI/GUI_App.cpp:1017 #, boost-format msgid "" "An existing configuration was found in %3%\n" @@ -3431,22 +4648,22 @@ msgid "" "Shall this configuration be imported?" msgstr "" "Een bestaande configuratie is gevonden in %3%,\n" -"aangemaakt door %1% %2%.\n" +"aangemaakt door b>%1% %2%.\n" "Moet de nieuwe configuratie worden geïmporteerd?" -#: src/slic3r/GUI/GUI_App.cpp:981 +#: src/slic3r/GUI/GUI_App.cpp:1025 msgid "Import" msgstr "Importeer" -#: src/slic3r/GUI/GUI_App.cpp:982 +#: src/slic3r/GUI/GUI_App.cpp:1026 msgid "Don't import" msgstr "Niet importeren" -#: src/slic3r/GUI/GUI_App.cpp:990 +#: src/slic3r/GUI/GUI_App.cpp:1034 msgid "Continue and import newer configuration?" -msgstr "" +msgstr "Doorgaan en nieuwere configuraties importeren?" -#: src/slic3r/GUI/GUI_App.cpp:1051 +#: src/slic3r/GUI/GUI_App.cpp:1095 msgid "" "You are running a 32 bit build of PrusaSlicer on 64-bit Windows.\n" "32 bit build of PrusaSlicer will likely not be able to utilize all the RAM " @@ -3462,7 +4679,7 @@ msgstr "" "https://www.prusa3d.com/prusaslicer/.\n" "Wilt u doorgaan?" -#: src/slic3r/GUI/GUI_App.cpp:1134 +#: src/slic3r/GUI/GUI_App.cpp:1182 #, c-format, boost-format msgid "" "%s\n" @@ -3471,46 +4688,37 @@ msgstr "" "%s\n" "Wilt u doorgaan?" -#: src/slic3r/GUI/GUI_App.cpp:1136 src/slic3r/GUI/GUI_App.cpp:3101 -#: src/slic3r/GUI/Plater.cpp:1726 src/slic3r/GUI/UnsavedChangesDialog.cpp:889 +#: src/slic3r/GUI/GUI_App.cpp:1184 src/slic3r/GUI/GUI_App.cpp:3302 +#: src/slic3r/GUI/Plater.cpp:1736 src/slic3r/GUI/UnsavedChangesDialog.cpp:917 msgid "Remember my choice" msgstr "Onthoud mijn keuze" -#: src/slic3r/GUI/GUI_App.cpp:1178 +#: src/slic3r/GUI/GUI_App.cpp:1226 msgid "Loading configuration" -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:1209 -#, boost-format -msgid "New release version %1% is available." -msgstr "Nieuwe release versie %1% is beschikbaar." +msgstr "Configuratie aan het laden" -#: src/slic3r/GUI/GUI_App.cpp:1210 -msgid "See Download page." -msgstr "Zie downloadpagina." - -#: src/slic3r/GUI/GUI_App.cpp:1224 +#: src/slic3r/GUI/GUI_App.cpp:1257 #, boost-format msgid "New prerelease version %1% is available." msgstr "Nieuwe pre-release versie %1% is beschikbaar." -#: src/slic3r/GUI/GUI_App.cpp:1225 +#: src/slic3r/GUI/GUI_App.cpp:1258 msgid "See Releases page." msgstr "Zie Release-pagina." -#: src/slic3r/GUI/GUI_App.cpp:1262 +#: src/slic3r/GUI/GUI_App.cpp:1313 msgid "Preparing settings tabs" msgstr "Instellingentab voorbereiden" -#: src/slic3r/GUI/GUI_App.cpp:1336 src/slic3r/GUI/Preferences.cpp:287 +#: src/slic3r/GUI/GUI_App.cpp:1393 src/slic3r/GUI/Preferences.cpp:405 msgid "Restore window position on start" -msgstr "" +msgstr "Herstel vensterpositie na opstarten" -#: src/slic3r/GUI/GUI_App.cpp:1338 +#: src/slic3r/GUI/GUI_App.cpp:1395 msgid "PrusaSlicer started after a crash" -msgstr "" +msgstr "PrusaSlicer is opgestart na een crash" -#: src/slic3r/GUI/GUI_App.cpp:1339 +#: src/slic3r/GUI/GUI_App.cpp:1396 #, boost-format msgid "" "PrusaSlicer crashed last time when attempting to set window position.\n" @@ -3522,24 +4730,34 @@ msgid "" "To avoid this problem, consider disabling \"%4%\" in \"Preferences\". " "Otherwise, the application will most likely crash again next time." msgstr "" +"PrusaSlicer is de vorige keer gecrasht tijdens een poging om de " +"vensterpositie in te stellen.\n" +"Sorry voor het ongemak. Het gebeurt helaas met sommige meer-schermen " +"opstellingen.\n" +"Exacte reden van de crash: \"%1%\".\n" +"For meer informatie, zie onze Github probleemtracker: \"%2%\" en \"%3%\"\n" +"\n" +"Overweeg om \"%4%\" in voorkeuren uit te zetten om dit probleem te " +"voorkomen. Waarschijnlijk zal anders het programma de volgende keer weer " +"crashen." -#: src/slic3r/GUI/GUI_App.cpp:1351 +#: src/slic3r/GUI/GUI_App.cpp:1408 #, boost-format msgid "Disable \"%1%\"" -msgstr "" +msgstr "\"%1%\" uitschakelen" -#: src/slic3r/GUI/GUI_App.cpp:1352 +#: src/slic3r/GUI/GUI_App.cpp:1409 #, boost-format msgid "Leave \"%1%\" enabled" -msgstr "" +msgstr "Laat \"%1%\" aanstaan" -#: src/slic3r/GUI/GUI_App.cpp:1679 +#: src/slic3r/GUI/GUI_App.cpp:1780 msgid "" "You have the following presets with saved options for \"Print Host upload\"" msgstr "" "Je hebt de volgende presets opgeslagen voor de printhost-uploadwachtrij" -#: src/slic3r/GUI/GUI_App.cpp:1683 +#: src/slic3r/GUI/GUI_App.cpp:1784 msgid "" "But since this version of PrusaSlicer we don't show this information in " "Printer Settings anymore.\n" @@ -3547,9 +4765,9 @@ msgid "" msgstr "" "Maar sinds deze versie van PrusaSlicer, wordt de informatie niet meer " "getoond in de printerinstellingen.\n" -"Instellingen zijn beschikbaar in de fysieke printerinstellingen." +"Instellingen zijn beschikbaar in de fysieke-printerinstellingen." -#: src/slic3r/GUI/GUI_App.cpp:1685 +#: src/slic3r/GUI/GUI_App.cpp:1786 msgid "" "By default new Printer devices will be named as \"Printer N\" during its " "creation.\n" @@ -3559,138 +4777,147 @@ msgstr "" "Let op: deze naam kan later worden aangepast in de fysieke-" "printerinstellingen" -#: src/slic3r/GUI/GUI_App.cpp:1689 src/slic3r/GUI/PhysicalPrinterDialog.cpp:726 +#: src/slic3r/GUI/GUI_App.cpp:1790 src/slic3r/GUI/PhysicalPrinterDialog.cpp:798 msgid "Information" msgstr "Informatie" -#: src/slic3r/GUI/GUI_App.cpp:1702 src/slic3r/GUI/GUI_App.cpp:1713 +#: src/slic3r/GUI/GUI_App.cpp:1803 src/slic3r/GUI/GUI_App.cpp:1814 msgid "Recreating" msgstr "Opnieuw aanmaken" -#: src/slic3r/GUI/GUI_App.cpp:1716 +#: src/slic3r/GUI/GUI_App.cpp:1817 msgid "Loading of current presets" msgstr "Laden van huidige presets" -#: src/slic3r/GUI/GUI_App.cpp:1721 +#: src/slic3r/GUI/GUI_App.cpp:1822 msgid "Loading of a mode view" msgstr "Laden van de weergavemodus" -#: src/slic3r/GUI/GUI_App.cpp:1859 +#: src/slic3r/GUI/GUI_App.cpp:1961 msgid "Choose one file (3MF/AMF):" -msgstr "Kies een 3MF- of AMF-bestand:" +msgstr "Kies een .3MF- of .AMF-bestand:" -#: src/slic3r/GUI/GUI_App.cpp:1871 +#: src/slic3r/GUI/GUI_App.cpp:1973 msgid "Choose one or more files (STL/3MF/STEP/OBJ/AMF/PRUSA):" -msgstr "Kies één of meer STL-, 3MF-, STEP-, OBJ-, AMF- of PRUSA- bestanden:" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1984 +msgid "Choose ZIP file:" +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1883 +#: src/slic3r/GUI/GUI_App.cpp:1996 msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" -msgstr "Kies een bestand (gcode/.GCO/.G/.ngc/NGC):" +msgstr "Kies een bestand (.gcode/.GCO/.G/.ngc):" -#: src/slic3r/GUI/GUI_App.cpp:1894 +#: src/slic3r/GUI/GUI_App.cpp:2007 msgid "Changing of an application language" msgstr "Veranderen van de taal van het programma" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Select the language" msgstr "Taalselectie" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Language" msgstr "Wijzig taal (change language)" -#: src/slic3r/GUI/GUI_App.cpp:2182 -msgid "modified" -msgstr "aangepast" +#: src/slic3r/GUI/GUI_App.cpp:2363 +msgid "" +"Simple mode supports manipulation with single-part object(s)\n" +"or object(s) with support modifiers only." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2365 +msgid "Please check your object list before mode changing." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2366 +msgid "Change application mode" +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2236 +#: src/slic3r/GUI/GUI_App.cpp:2397 #, c-format, boost-format msgid "Run %s" msgstr "Voer %s uit" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "&Configuration Snapshots" msgstr "Configuratiesnapshots" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "Inspect / activate configuration snapshots" msgstr "Inspecteer/activeer configuratiesnapshots" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Take Configuration &Snapshot" msgstr "Neem configuratiesnapshot" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Capture a configuration snapshot" msgstr "Neem een configuratiesnapshot op" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for Configuration Updates" msgstr "Controleer op configuratie-updates" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for configuration updates" msgstr "Controleer op configuratie-updates" -#: src/slic3r/GUI/GUI_App.cpp:2249 +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for Application Updates" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for new version of application" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2411 msgid "&Preferences" msgstr "Voorkeuren" -#: src/slic3r/GUI/GUI_App.cpp:2255 +#: src/slic3r/GUI/GUI_App.cpp:2417 msgid "Application preferences" msgstr "Programmavoorkeuren" -#: src/slic3r/GUI/GUI_App.cpp:2260 src/slic3r/GUI/wxExtensions.cpp:708 -msgid "Simple" -msgstr "Eenvoudig" - -#: src/slic3r/GUI/GUI_App.cpp:2260 +#: src/slic3r/GUI/GUI_App.cpp:2422 msgid "Simple View Mode" msgstr "Eenvoudige weergave" -#: src/slic3r/GUI/GUI_App.cpp:2262 src/slic3r/GUI/wxExtensions.cpp:710 -msgctxt "Mode" -msgid "Advanced" -msgstr "Geavanceerd" - -#: src/slic3r/GUI/GUI_App.cpp:2262 +#: src/slic3r/GUI/GUI_App.cpp:2424 msgid "Advanced View Mode" msgstr "Geavanceerde weergave" -#: src/slic3r/GUI/GUI_App.cpp:2263 src/slic3r/GUI/wxExtensions.cpp:711 -msgid "Expert" -msgstr "Expert" - -#: src/slic3r/GUI/GUI_App.cpp:2263 +#: src/slic3r/GUI/GUI_App.cpp:2425 msgid "Expert View Mode" msgstr "Expertweergave" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 msgid "Mode" msgstr "Modus" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 #, c-format, boost-format msgid "%s View Mode" msgstr "%s-weergavemodus" -#: src/slic3r/GUI/GUI_App.cpp:2271 +#: src/slic3r/GUI/GUI_App.cpp:2433 msgid "&Language" msgstr "Wijzig taal (change language)" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Flash Printer &Firmware" msgstr "Flash printer firmware" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Upload a firmware image into an Arduino based printer" msgstr "Upload een firmwarebestand op een Arduino-gebaseerde printer" -#: src/slic3r/GUI/GUI_App.cpp:2294 +#: src/slic3r/GUI/GUI_App.cpp:2459 msgid "Taking a configuration snapshot" msgstr "Neemt een configuratiesnapshot" -#: src/slic3r/GUI/GUI_App.cpp:2295 +#: src/slic3r/GUI/GUI_App.cpp:2460 msgid "" "Some presets are modified and the unsaved changes will not be captured by " "the configuration snapshot." @@ -3698,32 +4925,28 @@ msgstr "" "Sommige presets zijn aangepast en onopgeslagen instellingen worden niet " "meegenomen bij de configuratiesnapshot." -#: src/slic3r/GUI/GUI_App.cpp:2296 +#: src/slic3r/GUI/GUI_App.cpp:2461 msgid "Snapshot name" msgstr "Snapshotnaam" -#: src/slic3r/GUI/GUI_App.cpp:2312 +#: src/slic3r/GUI/GUI_App.cpp:2477 msgid "Loading a configuration snapshot" msgstr "Laad een configuratiesnapshot" -#: src/slic3r/GUI/GUI_App.cpp:2321 +#: src/slic3r/GUI/GUI_App.cpp:2486 #, boost-format msgid "Continue to activate a configuration snapshot %1%?" msgstr "Doorgaan om configuratiesnapshot %1% te activeren?" -#: src/slic3r/GUI/GUI_App.cpp:2335 +#: src/slic3r/GUI/GUI_App.cpp:2500 msgid "Failed to activate configuration snapshot." msgstr "Activeren van configuratiesnapshot mislukt." -#: src/slic3r/GUI/GUI_App.cpp:2354 -msgid "Restart application" -msgstr "Herstart programma" - -#: src/slic3r/GUI/GUI_App.cpp:2388 +#: src/slic3r/GUI/GUI_App.cpp:2520 msgid "Language selection" msgstr "Taalselectie" -#: src/slic3r/GUI/GUI_App.cpp:2391 +#: src/slic3r/GUI/GUI_App.cpp:2523 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." @@ -3731,89 +4954,103 @@ msgstr "" "Het veranderen van de taal zorgt dat het programma opnieuw opstart.\n" "U verliest de geladen inhoud zoals getoond in de modelweergave." -#: src/slic3r/GUI/GUI_App.cpp:2393 src/slic3r/GUI/Preferences.cpp:582 +#: src/slic3r/GUI/GUI_App.cpp:2525 src/slic3r/GUI/Preferences.cpp:730 +#: src/slic3r/GUI/Selection.cpp:1695 msgid "Do you want to proceed?" msgstr "" "Weet u zeker dat u door wilt gaan?\n" "Do you want to proceed?" -#: src/slic3r/GUI/GUI_App.cpp:2420 +#: src/slic3r/GUI/GUI_App.cpp:2552 msgid "&Configuration" msgstr "Configuratie" -#: src/slic3r/GUI/GUI_App.cpp:2534 src/slic3r/GUI/GUI_App.cpp:2595 -msgid "The preset modifications are successfully saved" -msgid_plural "The presets modifications are successfully saved" -msgstr[0] "De preset-aanpassing is succesvol opgeslagen" -msgstr[1] "De presets-aanpassing is succesvol opgeslagen" +#: src/slic3r/GUI/GUI_App.cpp:2560 +msgid "Restart application" +msgstr "Herstart programma" -#: src/slic3r/GUI/GUI_App.cpp:2598 +#: src/slic3r/GUI/GUI_App.cpp:2726 msgid "For new project all modifications will be reseted" msgstr "Voor nieuwe projecten worden alle aanpassingen gereset" -#: src/slic3r/GUI/GUI_App.cpp:2636 +#: src/slic3r/GUI/GUI_App.cpp:2764 msgid "Loading a new project while the current project is modified." msgstr "Laad een nieuw project terwijl het huidige project is aangepast." -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Project is loading" msgstr "Project is aan het laden" -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Opening new project while some presets are unsaved." msgstr "Openen van nieuw project terwijl sommige presets niet opgeslagen zijn." -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "The uploads are still ongoing" msgstr "De uploads zijn nog bezig" -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "Stop them and continue anyway?" msgstr "Stop ze en ga toch door?" -#: src/slic3r/GUI/GUI_App.cpp:2662 +#: src/slic3r/GUI/GUI_App.cpp:2790 msgid "Ongoing uploads" msgstr "Lopende uploads" -#: src/slic3r/GUI/GUI_App.cpp:2876 -msgid "It's impossible to print multi-part object(s) with SLA technology." +#: src/slic3r/GUI/GUI_App.cpp:3026 +msgid "" +"It's impossible to print object(s) which contains parameter modifiers with " +"SLA technology." msgstr "" -"Het is niet mogelijk meerdelige objecten te printen met de SLA-technologie." -#: src/slic3r/GUI/GUI_App.cpp:2877 src/slic3r/GUI/Jobs/SLAImportJob.cpp:235 -#: src/slic3r/GUI/Plater.cpp:2459 +#: src/slic3r/GUI/GUI_App.cpp:3027 src/slic3r/GUI/Jobs/SLAImportJob.cpp:149 +#: src/slic3r/GUI/Plater.cpp:2536 msgid "Please check your object list before preset changing." msgstr "Controleer de objectenlijst voor het wijzigen van de preset." -#: src/slic3r/GUI/GUI_App.cpp:2901 +#: src/slic3r/GUI/GUI_App.cpp:3070 msgid "Configuration is editing from ConfigWizard" msgstr "Configuratie is aangepast van de configuratiewizard" -#: src/slic3r/GUI/GUI_App.cpp:2926 +#: src/slic3r/GUI/GUI_App.cpp:3088 +#, boost-format +msgid "Welcome to %1% version %2%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3090 +#, boost-format +msgid "" +"Do you wish to register downloads from Printables.com\n" +"for this %1% %2% executable?\n" +"\n" +"Downloads can be registered for only 1 executable at time." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3118 msgid "Select a gcode file:" -msgstr "Selecteer een gcode-bestand:" +msgstr "Selecteer een .gcode-bestand:" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "Open hyperlink in default browser?" msgstr "Open hyperlinks in de standaardbrowser?" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "PrusaSlicer: Open hyperlink" msgstr "PrusaSlicer: Open hyperlink" -#: src/slic3r/GUI/GUI_App.cpp:3105 src/slic3r/GUI/Preferences.cpp:382 +#: src/slic3r/GUI/GUI_App.cpp:3306 src/slic3r/GUI/Preferences.cpp:593 msgid "Suppress to open hyperlink in browser" msgstr "Hyperlinks openen in browser uitzetten" -#: src/slic3r/GUI/GUI_App.cpp:3107 src/slic3r/GUI/Plater.cpp:1732 +#: src/slic3r/GUI/GUI_App.cpp:3308 src/slic3r/GUI/Plater.cpp:1742 msgid "PrusaSlicer will remember your choice." msgstr "PrusaSlicer onthoudt uw keuze." -#: src/slic3r/GUI/GUI_App.cpp:3108 +#: src/slic3r/GUI/GUI_App.cpp:3309 msgid "You will not be asked about it again on hyperlinks hovering." -msgstr "" +msgstr "U wordt niet opnieuw gevraagd over het bewegen over hyperlinks." -#: src/slic3r/GUI/GUI_App.cpp:3109 src/slic3r/GUI/Plater.cpp:1736 +#: src/slic3r/GUI/GUI_App.cpp:3310 src/slic3r/GUI/Plater.cpp:1746 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" @@ -3822,57 +5059,71 @@ msgstr "" "Ga naar Voorkeuren en controleer \"%1%\"\n" "om uw keuze te wijzigen." -#: src/slic3r/GUI/GUI_App.cpp:3111 src/slic3r/GUI/Plater.cpp:1738 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:906 +#: src/slic3r/GUI/GUI_App.cpp:3312 src/slic3r/GUI/Plater.cpp:1748 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:934 msgid "PrusaSlicer: Don't ask me again" msgstr "PrusaSlicer: vraag het niet nogmaals" -#: src/slic3r/GUI/GUI_Init.cpp:57 src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_App.cpp:3386 +msgid "Check for application update has failed." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3387 +#, boost-format +msgid "No new version is available. Latest release version is %1%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3458 +msgid "Download of new version is already ongoing. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/GUI_Init.cpp:64 src/slic3r/GUI/GUI_Init.cpp:67 msgid "PrusaSlicer GUI initialization failed" msgstr "Initialisatie van PrusaSlicer GUI mislukt" -#: src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_Init.cpp:67 #, boost-format msgid "Fatal error, exception catched: %1%" msgstr "Fatale fout, uitzondering gevonden: %1%" #: src/slic3r/GUI/GUI_Factories.cpp:54 src/slic3r/GUI/GUI_Factories.cpp:127 -#: src/libslic3r/PrintConfig.cpp:287 src/libslic3r/PrintConfig.cpp:404 -#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:456 -#: src/libslic3r/PrintConfig.cpp:708 src/libslic3r/PrintConfig.cpp:778 -#: src/libslic3r/PrintConfig.cpp:786 src/libslic3r/PrintConfig.cpp:1232 -#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1563 -#: src/libslic3r/PrintConfig.cpp:1955 src/libslic3r/PrintConfig.cpp:2030 -#: src/libslic3r/PrintConfig.cpp:2264 src/libslic3r/PrintConfig.cpp:2850 -#: src/libslic3r/PrintConfig.cpp:2858 src/libslic3r/PrintConfig.cpp:2918 -#: src/libslic3r/PrintConfig.cpp:2927 src/libslic3r/PrintConfig.cpp:3098 +#: src/libslic3r/PrintConfig.cpp:300 src/libslic3r/PrintConfig.cpp:423 +#: src/libslic3r/PrintConfig.cpp:466 src/libslic3r/PrintConfig.cpp:475 +#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:872 +#: src/libslic3r/PrintConfig.cpp:881 src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1376 src/libslic3r/PrintConfig.cpp:1604 +#: src/libslic3r/PrintConfig.cpp:1985 src/libslic3r/PrintConfig.cpp:2060 +#: src/libslic3r/PrintConfig.cpp:2294 src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:2946 src/libslic3r/PrintConfig.cpp:3006 +#: src/libslic3r/PrintConfig.cpp:3015 src/libslic3r/PrintConfig.cpp:3186 msgid "Layers and Perimeters" msgstr "Lagen en perimeters" #: src/slic3r/GUI/GUI_Factories.cpp:56 src/slic3r/GUI/GUI_Factories.cpp:131 -#: src/slic3r/GUI/GUI_Preview.cpp:249 src/slic3r/GUI/Tab.cpp:1547 -#: src/slic3r/GUI/Tab.cpp:1549 src/libslic3r/ExtrusionEntity.cpp:340 -#: src/libslic3r/ExtrusionEntity.cpp:372 src/libslic3r/PrintConfig.cpp:670 -#: src/libslic3r/PrintConfig.cpp:2095 src/libslic3r/PrintConfig.cpp:2104 -#: src/libslic3r/PrintConfig.cpp:2113 src/libslic3r/PrintConfig.cpp:2123 -#: src/libslic3r/PrintConfig.cpp:2132 src/libslic3r/PrintConfig.cpp:2554 -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2568 -#: src/libslic3r/PrintConfig.cpp:2581 src/libslic3r/PrintConfig.cpp:2591 -#: src/libslic3r/PrintConfig.cpp:2599 src/libslic3r/PrintConfig.cpp:2617 -#: src/libslic3r/PrintConfig.cpp:2634 src/libslic3r/PrintConfig.cpp:2655 -#: src/libslic3r/PrintConfig.cpp:2668 src/libslic3r/PrintConfig.cpp:2685 -#: src/libslic3r/PrintConfig.cpp:2703 src/libslic3r/PrintConfig.cpp:2718 -#: src/libslic3r/PrintConfig.cpp:2728 src/libslic3r/PrintConfig.cpp:2737 -#: src/libslic3r/PrintConfig.cpp:2748 src/libslic3r/PrintConfig.cpp:2762 -#: src/libslic3r/PrintConfig.cpp:2778 src/libslic3r/PrintConfig.cpp:2786 -#: src/libslic3r/PrintConfig.cpp:2787 src/libslic3r/PrintConfig.cpp:2796 -#: src/libslic3r/PrintConfig.cpp:2810 src/libslic3r/PrintConfig.cpp:2818 -#: src/libslic3r/PrintConfig.cpp:2832 +#: src/slic3r/GUI/Tab.cpp:1494 src/slic3r/GUI/Tab.cpp:1496 +#: src/libslic3r/PrintConfig.cpp:773 src/libslic3r/PrintConfig.cpp:2125 +#: src/libslic3r/PrintConfig.cpp:2134 src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2153 src/libslic3r/PrintConfig.cpp:2162 +#: src/libslic3r/PrintConfig.cpp:2584 src/libslic3r/PrintConfig.cpp:2590 +#: src/libslic3r/PrintConfig.cpp:2598 src/libslic3r/PrintConfig.cpp:2611 +#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2628 +#: src/libslic3r/PrintConfig.cpp:2644 src/libslic3r/PrintConfig.cpp:2660 +#: src/libslic3r/PrintConfig.cpp:2681 src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2725 +#: src/libslic3r/PrintConfig.cpp:2743 src/libslic3r/PrintConfig.cpp:2753 +#: src/libslic3r/PrintConfig.cpp:2762 src/libslic3r/PrintConfig.cpp:2773 +#: src/libslic3r/PrintConfig.cpp:2785 src/libslic3r/PrintConfig.cpp:2799 +#: src/libslic3r/PrintConfig.cpp:2807 src/libslic3r/PrintConfig.cpp:2808 +#: src/libslic3r/PrintConfig.cpp:2817 src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2840 src/libslic3r/PrintConfig.cpp:2854 +#: src/libslic3r/PrintConfig.cpp:2862 src/libslic3r/PrintConfig.cpp:2873 +#: src/libslic3r/PrintConfig.cpp:2884 src/libslic3r/PrintConfig.cpp:2893 +#: src/libslic3r/PrintConfig.cpp:2903 src/libslic3r/PrintConfig.cpp:2915 msgid "Support material" msgstr "Support" #: src/slic3r/GUI/GUI_Factories.cpp:59 src/slic3r/GUI/GUI_Factories.cpp:135 -#: src/libslic3r/PrintConfig.cpp:3054 src/libslic3r/PrintConfig.cpp:3062 +#: src/libslic3r/PrintConfig.cpp:3142 src/libslic3r/PrintConfig.cpp:3150 msgid "Wipe options" msgstr "Afveegopties" @@ -3880,330 +5131,351 @@ msgstr "Afveegopties" msgid "Pad and Support" msgstr "Basisplaat en support" -#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/GUI_Preview.cpp:245 -#: src/slic3r/GUI/Tab.cpp:1513 src/libslic3r/ExtrusionEntity.cpp:336 -#: src/libslic3r/ExtrusionEntity.cpp:364 src/libslic3r/PrintConfig.cpp:1579 -#: src/libslic3r/PrintConfig.cpp:1585 src/libslic3r/PrintConfig.cpp:1599 -#: src/libslic3r/PrintConfig.cpp:1609 src/libslic3r/PrintConfig.cpp:1617 -#: src/libslic3r/PrintConfig.cpp:1619 +#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/Tab.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1620 src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1638 src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1656 src/libslic3r/PrintConfig.cpp:1658 msgid "Ironing" msgstr "Strijken" -#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1283 -#: src/libslic3r/PrintConfig.cpp:1284 src/libslic3r/PrintConfig.cpp:1299 -#: src/libslic3r/PrintConfig.cpp:1309 +#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1344 src/libslic3r/PrintConfig.cpp:1356 +#: src/libslic3r/PrintConfig.cpp:1366 msgid "Fuzzy Skin" msgstr "Oneffen oppervlak" -#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/GUI_Preview.cpp:220 -#: src/slic3r/GUI/Tab.cpp:1581 src/libslic3r/PrintConfig.cpp:507 -#: src/libslic3r/PrintConfig.cpp:766 src/libslic3r/PrintConfig.cpp:1326 -#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1618 -#: src/libslic3r/PrintConfig.cpp:2020 src/libslic3r/PrintConfig.cpp:2352 -#: src/libslic3r/PrintConfig.cpp:2405 src/libslic3r/PrintConfig.cpp:2903 +#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/Tab.cpp:1536 +#: src/libslic3r/PrintConfig.cpp:526 src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:548 src/libslic3r/PrintConfig.cpp:557 +#: src/libslic3r/PrintConfig.cpp:566 src/libslic3r/PrintConfig.cpp:575 +#: src/libslic3r/PrintConfig.cpp:852 src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1657 +#: src/libslic3r/PrintConfig.cpp:2050 src/libslic3r/PrintConfig.cpp:2383 +#: src/libslic3r/PrintConfig.cpp:2436 src/libslic3r/PrintConfig.cpp:2991 msgid "Speed" msgstr "Snelheid" -#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1623 -#: src/slic3r/GUI/Tab.cpp:2304 src/libslic3r/PrintConfig.cpp:796 -#: src/libslic3r/PrintConfig.cpp:1489 src/libslic3r/PrintConfig.cpp:1997 -#: src/libslic3r/PrintConfig.cpp:2373 src/libslic3r/PrintConfig.cpp:2647 -#: src/libslic3r/PrintConfig.cpp:2675 +#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1585 +#: src/slic3r/GUI/Tab.cpp:2288 src/libslic3r/PrintConfig.cpp:889 +#: src/libslic3r/PrintConfig.cpp:1530 src/libslic3r/PrintConfig.cpp:2027 +#: src/libslic3r/PrintConfig.cpp:2404 src/libslic3r/PrintConfig.cpp:2673 +#: src/libslic3r/PrintConfig.cpp:2701 msgid "Extruders" msgstr "Extruders" -#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:754 -#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:1218 -#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:2006 -#: src/libslic3r/PrintConfig.cpp:2393 src/libslic3r/PrintConfig.cpp:2656 -#: src/libslic3r/PrintConfig.cpp:2890 +#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:840 +#: src/libslic3r/PrintConfig.cpp:953 src/libslic3r/PrintConfig.cpp:1278 +#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:2036 +#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2682 +#: src/libslic3r/PrintConfig.cpp:2978 msgid "Extrusion Width" msgstr "Extrusiebreedte" -#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1533 -#: src/libslic3r/PrintConfig.cpp:517 src/libslic3r/PrintConfig.cpp:528 -#: src/libslic3r/PrintConfig.cpp:544 +#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:631 src/libslic3r/PrintConfig.cpp:642 +#: src/libslic3r/PrintConfig.cpp:655 msgid "Skirt and brim" msgstr "Skirt en brim" -#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 -#: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1645 -#: src/slic3r/GUI/Tab.cpp:1649 src/slic3r/GUI/Tab.cpp:2031 -#: src/slic3r/GUI/Tab.cpp:2402 src/slic3r/GUI/Tab.cpp:4729 -#: src/libslic3r/PrintConfig.cpp:260 src/libslic3r/PrintConfig.cpp:495 -#: src/libslic3r/PrintConfig.cpp:1438 src/libslic3r/PrintConfig.cpp:1525 -#: src/libslic3r/PrintConfig.cpp:1572 src/libslic3r/PrintConfig.cpp:2530 -#: src/libslic3r/PrintConfig.cpp:2540 src/libslic3r/PrintConfig.cpp:3078 -#: src/libslic3r/PrintConfig.cpp:3113 src/libslic3r/PrintConfig.cpp:3124 -#: src/libslic3r/PrintConfig.cpp:3139 src/libslic3r/PrintConfig.cpp:3152 -#: src/libslic3r/PrintConfig.cpp:3161 src/libslic3r/PrintConfig.cpp:3173 -#: src/libslic3r/PrintConfig.cpp:3370 -msgid "Advanced" -msgstr "Geavanceerd" - -#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4663 src/slic3r/GUI/Tab.cpp:4664 -#: src/libslic3r/PrintConfig.cpp:3564 src/libslic3r/PrintConfig.cpp:3571 -#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3589 -#: src/libslic3r/PrintConfig.cpp:3599 src/libslic3r/PrintConfig.cpp:3609 -#: src/libslic3r/PrintConfig.cpp:3646 src/libslic3r/PrintConfig.cpp:3653 -#: src/libslic3r/PrintConfig.cpp:3664 src/libslic3r/PrintConfig.cpp:3674 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3696 -#: src/libslic3r/PrintConfig.cpp:3706 src/libslic3r/PrintConfig.cpp:3715 -#: src/libslic3r/PrintConfig.cpp:3725 src/libslic3r/PrintConfig.cpp:3736 -#: src/libslic3r/PrintConfig.cpp:3744 +#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Tab.cpp:4946 src/slic3r/GUI/Tab.cpp:4948 +#: src/libslic3r/PrintConfig.cpp:3328 src/libslic3r/PrintConfig.cpp:3337 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3356 +#: src/libslic3r/PrintConfig.cpp:3366 src/libslic3r/PrintConfig.cpp:3387 +#: src/libslic3r/PrintConfig.cpp:3410 src/libslic3r/PrintConfig.cpp:3417 +#: src/libslic3r/PrintConfig.cpp:3432 src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3464 +#: src/libslic3r/PrintConfig.cpp:3474 src/libslic3r/PrintConfig.cpp:3488 +#: src/libslic3r/PrintConfig.cpp:3498 src/libslic3r/PrintConfig.cpp:3841 +#: src/libslic3r/PrintConfig.cpp:3861 src/libslic3r/PrintConfig.cpp:3868 +#: src/libslic3r/PrintConfig.cpp:3876 msgid "Supports" msgstr "Support" -#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4704 src/slic3r/GUI/Tab.cpp:4705 -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3752 -#: src/libslic3r/PrintConfig.cpp:3759 src/libslic3r/PrintConfig.cpp:3773 -#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3794 -#: src/libslic3r/PrintConfig.cpp:3816 src/libslic3r/PrintConfig.cpp:3827 -#: src/libslic3r/PrintConfig.cpp:3834 src/libslic3r/PrintConfig.cpp:3841 -#: src/libslic3r/PrintConfig.cpp:3852 src/libslic3r/PrintConfig.cpp:3861 -#: src/libslic3r/PrintConfig.cpp:3870 +#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:590 +#: src/slic3r/GUI/Tab.cpp:4960 src/slic3r/GUI/Tab.cpp:4961 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3884 +#: src/libslic3r/PrintConfig.cpp:3891 src/libslic3r/PrintConfig.cpp:3905 +#: src/libslic3r/PrintConfig.cpp:3916 src/libslic3r/PrintConfig.cpp:3926 +#: src/libslic3r/PrintConfig.cpp:3948 src/libslic3r/PrintConfig.cpp:3959 +#: src/libslic3r/PrintConfig.cpp:3966 src/libslic3r/PrintConfig.cpp:3973 +#: src/libslic3r/PrintConfig.cpp:3984 src/libslic3r/PrintConfig.cpp:3993 +#: src/libslic3r/PrintConfig.cpp:4002 msgid "Pad" msgstr "Basisplaat" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4722 -#: src/slic3r/GUI/Tab.cpp:4723 src/libslic3r/SLA/Hollowing.cpp:73 -#: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3880 -#: src/libslic3r/PrintConfig.cpp:3887 src/libslic3r/PrintConfig.cpp:3897 -#: src/libslic3r/PrintConfig.cpp:3906 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4978 +#: src/slic3r/GUI/Tab.cpp:4979 src/libslic3r/SLA/Hollowing.cpp:86 +#: src/libslic3r/SLA/Hollowing.cpp:91 src/libslic3r/SLA/Hollowing.cpp:106 +#: src/libslic3r/SLA/Hollowing.cpp:115 src/libslic3r/PrintConfig.cpp:4012 +#: src/libslic3r/PrintConfig.cpp:4019 src/libslic3r/PrintConfig.cpp:4029 +#: src/libslic3r/PrintConfig.cpp:4038 msgid "Hollowing" msgstr "Uithollen" -#: src/slic3r/GUI/GUI_Factories.cpp:160 +#: src/slic3r/GUI/GUI_Factories.cpp:159 msgid "Add part" msgstr "Voeg onderdeel toe" -#: src/slic3r/GUI/GUI_Factories.cpp:161 +#: src/slic3r/GUI/GUI_Factories.cpp:160 msgid "Add negative volume" msgstr "Voeg negatief volume toe" -#: src/slic3r/GUI/GUI_Factories.cpp:162 +#: src/slic3r/GUI/GUI_Factories.cpp:161 msgid "Add modifier" msgstr "Voeg modificator toe" -#: src/slic3r/GUI/GUI_Factories.cpp:163 +#: src/slic3r/GUI/GUI_Factories.cpp:162 msgid "Add support blocker" msgstr "Voeg supportblokkering toe" -#: src/slic3r/GUI/GUI_Factories.cpp:164 +#: src/slic3r/GUI/GUI_Factories.cpp:163 msgid "Add support enforcer" msgstr "Voeg supportforcering toe" -#: src/slic3r/GUI/GUI_Factories.cpp:300 +#: src/slic3r/GUI/GUI_Factories.cpp:169 +msgid "Add text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:170 +msgid "Add negative text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:171 +msgid "Add text modifier" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:307 msgid "Select showing settings" msgstr "Selecteer getoonde instellingen" -#: src/slic3r/GUI/GUI_Factories.cpp:407 src/slic3r/GUI/GUI_Factories.cpp:412 -#: src/slic3r/GUI/GUI_Factories.cpp:556 src/slic3r/GUI/GUI_Factories.cpp:562 +#: src/slic3r/GUI/GUI_Factories.cpp:414 src/slic3r/GUI/GUI_Factories.cpp:419 +#: src/slic3r/GUI/GUI_Factories.cpp:625 src/slic3r/GUI/GUI_Factories.cpp:631 #, c-format, boost-format msgid "Quick Add Settings (%s)" msgstr "Snel instellingen toevoegen (%s)" -#: src/slic3r/GUI/GUI_Factories.cpp:444 +#: src/slic3r/GUI/GUI_Factories.cpp:460 msgid "Remove the selected object" msgstr "Verwijder het geselecteerde object" -#: src/slic3r/GUI/GUI_Factories.cpp:456 +#: src/slic3r/GUI/GUI_Factories.cpp:475 msgid "Load" msgstr "Laad" -#: src/slic3r/GUI/GUI_Factories.cpp:461 src/slic3r/GUI/GUI_Factories.cpp:501 -#: src/slic3r/GUI/GUI_Factories.cpp:505 +#: src/slic3r/GUI/GUI_Factories.cpp:481 src/slic3r/GUI/GUI_Factories.cpp:566 +#: src/slic3r/GUI/GUI_Factories.cpp:570 msgid "Box" msgstr "Blok" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Cylinder" msgstr "Cilinder" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Slab" msgstr "Plaat" -#: src/slic3r/GUI/GUI_Factories.cpp:471 +#: src/slic3r/GUI/GUI_Factories.cpp:493 msgid "Gallery" msgstr "Galerij" -#: src/slic3r/GUI/GUI_Factories.cpp:488 src/slic3r/GUI/GUI_Factories.cpp:526 +#: src/slic3r/GUI/GUI_Factories.cpp:529 src/slic3r/GUI/GUI_Factories.cpp:549 +#: src/slic3r/GUI/GUI_ObjectList.cpp:660 +msgid "Text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:555 src/slic3r/GUI/GUI_Factories.cpp:558 +#: src/slic3r/GUI/GUI_Factories.cpp:595 msgid "Height range Modifier" msgstr "Modificator voor hoogtebereik" -#: src/slic3r/GUI/GUI_Factories.cpp:535 +#: src/slic3r/GUI/GUI_Factories.cpp:604 msgid "Add settings" msgstr "Voeg instellingen toe" -#: src/slic3r/GUI/GUI_Factories.cpp:626 +#: src/slic3r/GUI/GUI_Factories.cpp:695 msgid "Change type" msgstr "Wijzig type" -#: src/slic3r/GUI/GUI_Factories.cpp:636 src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:705 src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Object" msgstr "Stel in als apart object" -#: src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Objects" msgstr "Stel in als aparte objecten" -#: src/slic3r/GUI/GUI_Factories.cpp:658 +#: src/slic3r/GUI/GUI_Factories.cpp:727 msgid "Printable" msgstr "Printbaar" -#: src/slic3r/GUI/GUI_Factories.cpp:686 +#: src/slic3r/GUI/GUI_Factories.cpp:755 src/slic3r/GUI/GUI_ObjectList.cpp:2070 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2582 +msgid "Invalidate cut info" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:770 msgid "Rename" msgstr "Hernoem" -#: src/slic3r/GUI/GUI_Factories.cpp:696 +#: src/slic3r/GUI/GUI_Factories.cpp:780 msgid "Fix through the Netfabb" msgstr "Repareer met NetFabb" -#: src/slic3r/GUI/GUI_Factories.cpp:715 -msgid "Export as STL" -msgstr "Exporteer als STL-bestand" +#: src/slic3r/GUI/GUI_Factories.cpp:799 +msgid "Export as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:726 +#: src/slic3r/GUI/GUI_Factories.cpp:810 msgid "Reload the selected volumes from disk" msgstr "Herlaad de geselecteerde volumes vanaf schijf" -#: src/slic3r/GUI/GUI_Factories.cpp:733 src/slic3r/GUI/Plater.cpp:3568 +#: src/slic3r/GUI/GUI_Factories.cpp:817 src/slic3r/GUI/Plater.cpp:3602 msgid "Replace with STL" msgstr "Vervang met STL" -#: src/slic3r/GUI/GUI_Factories.cpp:733 +#: src/slic3r/GUI/GUI_Factories.cpp:817 msgid "Replace the selected volume with new STL" msgstr "Vervang het geselecteerde volume met nieuwe STL" -#: src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Set extruder for selected items" msgstr "Stel extruder in voor de geselecteerde items" -#: src/slic3r/GUI/GUI_Factories.cpp:778 src/slic3r/Utils/Repetier.cpp:126 -#: src/slic3r/Utils/Repetier.cpp:209 src/libslic3r/PrintConfig.cpp:635 -#: src/libslic3r/PrintConfig.cpp:2770 +#: src/slic3r/GUI/GUI_Factories.cpp:862 src/slic3r/Utils/Repetier.cpp:145 +#: src/slic3r/Utils/Repetier.cpp:226 src/libslic3r/PrintConfig.cpp:738 +#: src/libslic3r/PrintConfig.cpp:2790 src/libslic3r/PrintConfig.cpp:3851 msgid "Default" msgstr "Standaard" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale to print volume" msgstr "Verschaal tot printvolume" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale the selected object to fit the print volume" msgstr "Verschaal het geselecteerde object tot deze in het printvolume past" -#: src/slic3r/GUI/GUI_Factories.cpp:835 src/slic3r/GUI/Plater.cpp:5655 +#: src/slic3r/GUI/GUI_Factories.cpp:921 src/slic3r/GUI/Plater.cpp:6213 msgid "Convert from imperial units" msgstr "Converteer naar Engelse eenheden" -#: src/slic3r/GUI/GUI_Factories.cpp:836 src/slic3r/GUI/Plater.cpp:5656 +#: src/slic3r/GUI/GUI_Factories.cpp:922 src/slic3r/GUI/Plater.cpp:6214 msgid "Revert conversion from imperial units" msgstr "Conversie van Engelse eenheden ongedaan maken" -#: src/slic3r/GUI/GUI_Factories.cpp:837 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:923 src/slic3r/GUI/Plater.cpp:6215 msgid "Convert from meters" msgstr "Converteer vanaf meters" -#: src/slic3r/GUI/GUI_Factories.cpp:838 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:924 src/slic3r/GUI/Plater.cpp:6215 msgid "Revert conversion from meters" msgstr "Omrekenen van meters terugdraaien" -#: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2135 -#: src/libslic3r/PrintConfig.cpp:4523 +#: src/slic3r/GUI/GUI_Factories.cpp:945 src/slic3r/GUI/GUI_ObjectList.cpp:2290 +#: src/libslic3r/PrintConfig.cpp:4689 msgid "Merge" msgstr "Samenvoegen" -#: src/slic3r/GUI/GUI_Factories.cpp:859 +#: src/slic3r/GUI/GUI_Factories.cpp:945 msgid "Merge objects to the one multipart object" msgstr "Voeg objecten samen tot één meerdelig object" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Along X axis" msgstr "Over de X-as" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Mirror the selected object along the X axis" msgstr "Spiegel het geselecteerde object over de X-as" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Along Y axis" msgstr "Over de Y-as" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Mirror the selected object along the Y axis" msgstr "Spiegel het geselecteerde object over de Y-as" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Along Z axis" msgstr "Over de Z-as" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Mirror the selected object along the Z axis" msgstr "Spiegel het geselecteerde object over de Z-as" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror" msgstr "Spiegelen" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror the selected object" msgstr "Spiegel het geselecteerde object" -#: src/slic3r/GUI/GUI_Factories.cpp:901 src/slic3r/GUI/GUI_ObjectList.cpp:1696 +#: src/slic3r/GUI/GUI_Factories.cpp:977 +msgid "Edit text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:999 +msgid "Ability to change text, font, size, ..." +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1021 src/slic3r/GUI/GUI_ObjectList.cpp:1793 msgid "Add Shape" msgstr "Voeg vorm toe" -#: src/slic3r/GUI/GUI_Factories.cpp:937 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "To objects" msgstr "Aan objecten" -#: src/slic3r/GUI/GUI_Factories.cpp:937 src/slic3r/GUI/GUI_Factories.cpp:954 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "Split the selected object into individual objects" msgstr "Verdeel het geselecteerde object in individuele objecten" -#: src/slic3r/GUI/GUI_Factories.cpp:940 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 msgid "To parts" msgstr "Aan onderdelen" -#: src/slic3r/GUI/GUI_Factories.cpp:940 src/slic3r/GUI/GUI_Factories.cpp:975 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 src/slic3r/GUI/GUI_Factories.cpp:1097 msgid "Split the selected object into individual parts" msgstr "Splits de geselecteerde objecten in individuele onderdelen" -#: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4552 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 src/slic3r/GUI/GUI_Factories.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:4718 msgid "Split" msgstr "Splits" -#: src/slic3r/GUI/GUI_Factories.cpp:944 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 msgid "Split the selected object" msgstr "Verdeel het geselecteerde object" -#: src/slic3r/GUI/GUI_Factories.cpp:1084 +#: src/slic3r/GUI/GUI_Factories.cpp:1225 src/slic3r/GUI/GUI_Factories.cpp:1243 +msgid "Set number of instances" +msgstr "Stel aantal instanties in" + +#: src/slic3r/GUI/GUI_Factories.cpp:1225 +msgid "Change the number of instances of the selected objects" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1237 msgid "Add one more instance of the selected object" msgstr "Voeg een instantie van het geselecteerde object toe" -#: src/slic3r/GUI/GUI_Factories.cpp:1087 +#: src/slic3r/GUI/GUI_Factories.cpp:1240 msgid "Remove one instance of the selected object" msgstr "Verwijder een instantie van het geselecteerde object" -#: src/slic3r/GUI/GUI_Factories.cpp:1090 -msgid "Set number of instances" -msgstr "Stel aantal instanties in" - -#: src/slic3r/GUI/GUI_Factories.cpp:1090 +#: src/slic3r/GUI/GUI_Factories.cpp:1243 msgid "Change the number of instances of the selected object" msgstr "Wijzig het aantal instanties van het geselecteerde object" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill bed with instances" msgstr "Vul het bed met instanties" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill the remaining area of bed with instances of the selected object" msgstr "" "Vul het overige deel van het bed met instanties van het geselecteerde object" @@ -4224,300 +5496,348 @@ msgstr "Verwijder laagbereik" msgid "Add layer range" msgstr "Voeg laagbereik toe" -#: src/slic3r/GUI/GUI_ObjectList.cpp:297 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:323 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 msgid "Name" msgstr "Naam" -#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:480 +#: src/slic3r/GUI/GUI_ObjectList.cpp:342 src/slic3r/GUI/GUI_ObjectList.cpp:513 msgid "Editing" msgstr "Bewerken" -#: src/slic3r/GUI/GUI_ObjectList.cpp:400 +#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +msgid "Wrong volume index " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:433 msgid "No errors detected" msgstr "Geen fouten gevonden" -#: src/slic3r/GUI/GUI_ObjectList.cpp:409 +#: src/slic3r/GUI/GUI_ObjectList.cpp:442 #, c-format, boost-format msgid "Auto-repaired %1$d error" msgid_plural "Auto-repaired %1$d errors" msgstr[0] "%1$d fout automatisch hersteld" msgstr[1] "%1$d fouten automatisch hersteld" -#: src/slic3r/GUI/GUI_ObjectList.cpp:415 +#: src/slic3r/GUI/GUI_ObjectList.cpp:448 #, c-format, boost-format msgid "%1$d degenerate facet" msgid_plural "%1$d degenerate facets" msgstr[0] "%1$d degenereer facet" msgstr[1] "%1$d degenereer facetten" -#: src/slic3r/GUI/GUI_ObjectList.cpp:417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:450 #, c-format, boost-format msgid "%1$d edge fixed" msgid_plural "%1$d edges fixed" msgstr[0] "%1$d lijn gerepareerd" msgstr[1] "%1$d lijnen gerepareerd" -#: src/slic3r/GUI/GUI_ObjectList.cpp:419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:452 #, c-format, boost-format msgid "%1$d facet removed" msgid_plural "%1$d facets removed" msgstr[0] "%1$d facet verwijderd" msgstr[1] "%1$d facetten verwijderd" -#: src/slic3r/GUI/GUI_ObjectList.cpp:421 +#: src/slic3r/GUI/GUI_ObjectList.cpp:454 #, c-format, boost-format msgid "%1$d facet reversed" msgid_plural "%1$d facets reversed" msgstr[0] "%1$d facet omgekeerd" msgstr[1] "%1$d facetten omgekeerd" -#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +#: src/slic3r/GUI/GUI_ObjectList.cpp:456 #, c-format, boost-format msgid "%1$d backward edge" msgid_plural "%1$d backward edges" msgstr[0] "%1$d lijn achterstevoren" msgstr[1] "%1$d lijnen achterstevoren" -#: src/slic3r/GUI/GUI_ObjectList.cpp:426 src/slic3r/GUI/GUI_ObjectList.cpp:429 +#: src/slic3r/GUI/GUI_ObjectList.cpp:459 src/slic3r/GUI/GUI_ObjectList.cpp:462 #, c-format, boost-format msgid "%1$d open edge" msgid_plural "%1$d open edges" msgstr[0] "%1$d open lijn" msgstr[1] "%1$d open lijnen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:428 +#: src/slic3r/GUI/GUI_ObjectList.cpp:461 msgid "Remaining errors" msgstr "Resterende fouten" -#: src/slic3r/GUI/GUI_ObjectList.cpp:436 +#: src/slic3r/GUI/GUI_ObjectList.cpp:469 msgid "Right button click the icon to fix STL through Netfabb" msgstr "" -"Rechtermuisklik op het pictogram om het STL-bestand met NetFabb te repareren" +"Rechtermuisklik op het pictogram om het .STL-bestand met NetFabb te repareren" -#: src/slic3r/GUI/GUI_ObjectList.cpp:482 +#: src/slic3r/GUI/GUI_ObjectList.cpp:515 msgid "Right button click the icon to change the object settings" msgstr "Rechtermuisklik op het icoontje om de objectinstellingen te wijzigen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:484 +#: src/slic3r/GUI/GUI_ObjectList.cpp:517 msgid "Click the icon to change the object settings" msgstr "Klik op het pictogram om de objectinstellingen te wijzigen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:488 +#: src/slic3r/GUI/GUI_ObjectList.cpp:521 msgid "Right button click the icon to change the object printable property" msgstr "Rechtermuisklik op het pictogram om de printinstellingen te wijzigen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:523 msgid "Click the icon to change the object printable property" msgstr "Klik op het pictogram om de printinstellingen te wijzigen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:616 +#: src/slic3r/GUI/GUI_ObjectList.cpp:649 msgid "Change Extruder" msgstr "Wijzig extruder" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Object" msgstr "Hernoem object" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Sub-object" msgstr "Hernoem subobject" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1242 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4006 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1307 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4589 msgid "Instances to Separated Objects" msgstr "Zet instanties om in objecten" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Volumes in Object reordered" msgstr "Volumes in object opnieuw geordend" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Object reordered" msgstr "Object opnieuw geordend" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1298 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1363 msgid "Add Settings for Layers" msgstr "Voeg laaginstellingen toe" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1299 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1364 msgid "Add Settings for Sub-object" msgstr "Voeg instellingen voor subobject toe" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1300 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1365 msgid "Add Settings for Object" msgstr "Voeg instellingen voor object toe" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1339 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1404 msgid "Add Settings Bundle for Height range" msgstr "Voeg instellingen voor hoogtebereik toe" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1340 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1405 msgid "Add Settings Bundle for Sub-object" msgstr "Voeg instellingen voor subobject toe" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1341 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1406 msgid "Add Settings Bundle for Object" msgstr "Voeg instellingen voor een object toe" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Part" msgstr "Laad onderdeel" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Modifier" msgstr "Laad bewerker" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1509 src/slic3r/GUI/Plater.cpp:2380 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1582 src/slic3r/GUI/Plater.cpp:2453 msgid "Loading" msgstr "Aan het laden" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1540 src/slic3r/GUI/Plater.cpp:2417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1617 src/slic3r/GUI/Plater.cpp:2494 msgid "Loading file" msgstr "Bestand laden" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1548 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1625 msgid "Error!" msgstr "Fout!" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1638 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1721 msgid "Add Generic Subobject" msgstr "Voeg algemene subobjecten toe" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1663 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1761 msgid "Generic" msgstr "Algemeen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shape from Gallery" msgstr "Voeg vorm uit galerij toe" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shapes from Gallery" msgstr "Voeg vormen uit galerij toe" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1830 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1945 msgid "Remove paint-on supports" msgstr "Verwijder inkleur-supports" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1837 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 msgid "Remove paint-on seam" msgstr "Verwijder inkleur-naad" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1844 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 msgid "Remove Multi Material painting" msgstr "Verwijder multi-materiaal inkleuring" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1850 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1972 msgid "Shift objects to bed" msgstr "Verplaats objecten naar bed" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1856 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1978 msgid "Remove variable layer height" -msgstr "Verwijder variable laagdikte" +msgstr "Verwijder variabele laagdikte" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1877 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1999 msgid "Delete Settings" msgstr "Verwijder instellingen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1901 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2023 msgid "Delete All Instances from Object" msgstr "Verwijder alle instanties van het object" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1917 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2039 msgid "Delete Height Range" msgstr "Verwijder hoogtebereik" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1949 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2057 +msgid "Delete connector from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2058 +msgid "Delete solid part from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2059 +msgid "Delete negative volume from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2061 +msgid "" +"To save cut information you can delete all connectors from all related " +"objects." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2064 +msgid "" +"This action will break a cut information.\n" +"After that PrusaSlicer can't guarantee model consistency.\n" +"\n" +"To manipulate with solid parts or negative volumes you have to invalidate " +"cut infornation first." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2072 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2612 +msgid "Delete all connectors" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2103 msgid "From Object List You can't delete the last solid part from object." msgstr "Het laatste onderdeel van de objectenlijst kan niet verwijderd worden." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1953 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2112 msgid "Delete Subobject" msgstr "Verwijder subobject" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1976 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2138 msgid "Last instance of an object cannot be deleted." msgstr "Laatste instantie van een object kan niet verwijderd worden." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1980 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +msgid "Instance cannot be deleted from cut object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2146 msgid "Delete Instance" msgstr "Verwijder instantie" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2004 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2170 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" "Het geselecteerde object kan niet opgedeeld worden omdat het maar één " "geometrie bevat." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2008 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2174 msgid "Split to Parts" msgstr "Splits naar onderdelen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2177 src/slic3r/GUI/Plater.cpp:3133 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"splitting the object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2297 msgid "Merged" msgstr "Samengevoegd" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2237 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2392 msgid "Merge all parts to the one single object" msgstr "Voeg alle delen samen tot een enkel object" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2269 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2424 msgid "Add Layers" msgstr "Voeg lagen toe" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2438 -msgid "Group manipulation" -msgstr "Groep bewerken" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2695 +msgid "Cut Connectors information" +msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2453 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2705 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2768 msgid "Object manipulation" msgstr "Object bewerken" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2486 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2714 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1472 +msgid "Group manipulation" +msgstr "Groep bewerken" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2802 msgid "Object Settings to modify" msgstr "Objectinstellingen om te bewerken" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2806 msgid "Part Settings to modify" msgstr "Onderdeelinstellingen om te bewerken" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2495 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2811 msgid "Layer range Settings to modify" msgstr "Laagbereikinstellingen om te bewerken" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2501 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2817 msgid "Part manipulation" msgstr "Onderdeel bewerken" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2825 msgid "Instance manipulation" msgstr "Instantie bewerken" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Height ranges" msgstr "Hoogtebereik" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Settings for height range" msgstr "Instellingen voor hoogtebereik" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2750 -msgid "Delete Selected Item" -msgstr "Verwijder geselecteerd item" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2943 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3363 msgid "Delete Selected" msgstr "Verwijder selectie" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3019 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3047 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3067 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3441 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3469 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3489 msgid "Add Height Range" msgstr "Voeg hoogtebereik toe" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3113 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3535 msgid "" "Cannot insert a new layer range after the current layer range.\n" "The next layer range is too thin to be split to two\n" @@ -4527,7 +5847,7 @@ msgstr "" "Het volgende laagbereik is te dun om in tweeën te splitsen\n" "zonder over de minimale laagdikte heen te gaan." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3117 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3539 msgid "" "Cannot insert a new layer range between the current and the next layer " "range.\n" @@ -4539,7 +5859,7 @@ msgstr "" "Het gat tussen het huidige en volgende laagbereik is kleiner dan\n" "de minimum toegestane laagdikte." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3122 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3544 msgid "" "Cannot insert a new layer range after the current layer range.\n" "Current layer range overlaps with the next layer range." @@ -4547,237 +5867,287 @@ msgstr "" "Kan geen nieuw laagbereik toevoegen na het huidige laagbereik.\n" "Het huidige laagbereik overlapt met het volgende laagbereik." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3603 msgid "Edit Height Range" msgstr "Bewerk hoogtebereik" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3500 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3989 msgid "Selection-Remove from list" msgstr "Selectie - Verwijder van lijst" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4001 msgid "Selection-Add from list" msgstr "Selectie - Voeg toe aan lijst" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3649 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4138 msgid "Object or Instance" msgstr "Object of instantie" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Part" -msgstr "Onderdeel" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 msgid "Layer" msgstr "Laag" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3652 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4141 msgid "Unsupported selection" msgstr "Niet-ondersteunde selectie" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3653 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 #, c-format, boost-format msgid "You started your selection with %s Item." msgstr "De selectie is gestart met item %s." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3654 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4143 #, c-format, boost-format msgid "In this mode you can select only other %s Items%s" msgstr "In deze modus kunt u alleen andere %s items %s selecteren" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3657 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4146 msgid "of a current Object" msgstr "van het huidige object" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3662 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3737 src/slic3r/GUI/Plater.cpp:181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4151 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4226 src/slic3r/GUI/Plater.cpp:197 msgid "Info" msgstr "Info" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3784 -msgid "You can't change a type of the last solid part of the object." -msgstr "" -"U kunt het type van het laatste onderdeel van een object niet wijzigen." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 msgid "Negative Volume" msgstr "Negatief volume" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Modifier" -msgstr "Modificator" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Blocker" msgstr "Supportblokkering" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Enforcer" msgstr "Supportforcering" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Select type of part" msgstr "Selecteer onderdeeltype" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3795 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4359 msgid "Change Part Type" msgstr "Wijzig onderdeeltype" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Enter new name" msgstr "Voer nieuwe naam in" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Renaming" msgstr "Hernoemen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4091 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4681 msgid "Repairing model" msgstr "Model repareren" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4120 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4691 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"repairing the mesh." +msgstr "" +"Aangepaste supports, naden en multi-material schilderingen zijn verwijderd " +"bij het repareren van de mesh." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4711 msgid "Fix through NetFabb" msgstr "Repareer met NetFabb" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4123 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4714 msgid "Fixing through NetFabb" msgstr "Repareren met NetFabb" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4153 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4744 msgid "The following model was repaired successfully" msgid_plural "The following models were repaired successfully" msgstr[0] "Het volgende model is succesvol gerepareerd" msgstr[1] "De volgende modellen zijn succesvol gerepareerd" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4159 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4750 msgid "Folowing model repair failed" msgid_plural "Folowing models repair failed" msgstr[0] "Volgende model repareren mislukt" msgstr[1] "Volgende modellen repareren mislukt" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4164 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4755 msgid "Repairing was canceled" msgstr "Repareren is stopgezet" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4276 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4869 msgid "Change Extruders" msgstr "Wijzig extruders" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Printable group" msgstr "Stel printbare groep in" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Unprintable group" msgstr "Stel onprintbare groep in" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Printable" msgstr "Stel in op printbaar" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Unprintable" msgstr "Stel in op niet-printbaar" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Printable Instance" msgstr "Stel printbare instanties in" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Unprintable Instance" msgstr "Stel instantie in op niet-printbaar" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:55 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:84 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:61 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:96 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1132 msgid "World coordinates" msgstr "Wereldcoördinaten" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:56 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:85 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:97 msgid "Local coordinates" msgstr "Lokale coördinaten" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:60 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:67 msgid "Select coordinate space, in which the transformation will be performed." msgstr "Stel een coördinatenstelsel in. Hierin wordt de wijziging uitgevoerd." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:141 src/libslic3r/GCode.cpp:540 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:157 src/libslic3r/GCode.cpp:491 msgid "Object name" msgstr "Objectnaam" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:201 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:521 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:221 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:710 msgid "Position" msgstr "Positie" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:202 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:522 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:222 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:711 #: src/slic3r/GUI/Mouse3DController.cpp:478 #: src/slic3r/GUI/Mouse3DController.cpp:499 msgid "Rotation" msgstr "Rotatie" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:250 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:239 +msgid "Size [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "Mirror along" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +#, c-format, boost-format +msgid " %c " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "axis" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:279 #, c-format, boost-format msgid "Toggle %c axis mirroring" msgstr "Zet %c-asspiegeling aan" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:284 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:329 msgid "Set Mirror" msgstr "Stel spiegeling in" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:324 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:336 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:348 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:374 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:387 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:393 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:401 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:428 msgid "Drop to bed" msgstr "Plaats op het bed" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:445 msgid "Reset rotation" msgstr "Reset rotatie" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 msgid "Reset Rotation" msgstr "Reset rotatie" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:398 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:400 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:490 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:519 msgid "Reset scale" msgstr "Reset verschaling" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:539 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546 +msgid "Reset skew" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:553 msgid "Inches" msgstr "Inches" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:523 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:712 msgid "Scale factors" msgstr "Verschalingsfactoren" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:577 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:740 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:752 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:793 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:801 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +msgid "Rotate (relative)" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:751 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:800 +msgid "Translate (relative) [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:829 msgid "Translate" msgstr "Verplaats" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:640 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:905 msgid "" "You cannot use non-uniform scaling mode for multiple objects/parts selection" msgstr "" "Niet-gelijke verschaling kan niet gebruikt worden voor meerdere objecten of " "onderdelen" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:820 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +msgid "Left handed" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1133 +msgid "Object coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1134 +msgid "Part coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1176 msgid "Set Position" msgstr "Stel positie in" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:852 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1220 msgid "Set Orientation" msgstr "Stel oriëntatie in" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:931 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1351 msgid "Set Scale" msgstr "Stel verschaling in" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1368 +msgid "Set Size" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1427 msgid "" "The currently manipulated object is tilted (rotation angles are not " "multiples of 90°).\n" @@ -4791,7 +6161,7 @@ msgstr "" "wereldcoördinatensysteem\n" "als de rotatie is ingebouwd in de objectcoördinaten." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:983 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1430 msgid "" "This operation is irreversible.\n" "Do you want to proceed?" @@ -4803,182 +6173,81 @@ msgstr "" msgid "Additional Settings" msgstr "Extra instellingen" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:99 -msgid "Remove parameter" -msgstr "Verwijder parameter" - -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:105 -#, c-format, boost-format -msgid "Delete Option %s" -msgstr "Verwijder optie %s" - -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:154 -#, c-format, boost-format -msgid "Change Option %s" -msgstr "Wijzig optie %s" - -#: src/slic3r/GUI/GUI_Preview.cpp:211 -msgid "View" -msgstr "Weergave" - -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/libslic3r/PrintConfig.cpp:808 -msgid "Height" -msgstr "Hoogte" - -#: src/slic3r/GUI/GUI_Preview.cpp:219 src/libslic3r/PrintConfig.cpp:3032 -msgid "Width" -msgstr "Breedte" - -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2016 -msgid "Fan speed" -msgstr "Ventilatorsnelheid" - -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1991 -msgid "Temperature" -msgstr "Temperatuur" - -#: src/slic3r/GUI/GUI_Preview.cpp:223 -msgid "Volumetric flow rate" -msgstr "Volumetrisch debiet" - -#: src/slic3r/GUI/GUI_Preview.cpp:228 -msgid "Show" -msgstr "Toon" - -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/GUI_Preview.cpp:254 -msgid "Feature types" -msgstr "Type opties" - -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:330 -#: src/libslic3r/ExtrusionEntity.cpp:352 -msgid "Perimeter" -msgstr "Perimeter" - -#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:331 -#: src/libslic3r/ExtrusionEntity.cpp:354 -msgid "External perimeter" -msgstr "Buitenste perimeter" - -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:332 -#: src/libslic3r/ExtrusionEntity.cpp:356 -msgid "Overhang perimeter" -msgstr "Overhangende perimeter" - -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:333 -#: src/libslic3r/ExtrusionEntity.cpp:358 -msgid "Internal infill" -msgstr "Inwendige vulling" - -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:334 -#: src/libslic3r/ExtrusionEntity.cpp:360 src/libslic3r/PrintConfig.cpp:1407 -#: src/libslic3r/PrintConfig.cpp:2392 src/libslic3r/PrintConfig.cpp:2404 -msgid "Solid infill" -msgstr "Dichte vulling" - -#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:335 -#: src/libslic3r/ExtrusionEntity.cpp:362 src/libslic3r/PrintConfig.cpp:1416 -#: src/libslic3r/PrintConfig.cpp:2889 src/libslic3r/PrintConfig.cpp:2902 -msgid "Top solid infill" -msgstr "Bovenste dichte vulling" - -#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:337 -#: src/libslic3r/ExtrusionEntity.cpp:366 -msgid "Bridge infill" -msgstr "Brugvulling" - -#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:338 -#: src/libslic3r/ExtrusionEntity.cpp:368 src/libslic3r/PrintConfig.cpp:1325 -msgid "Gap fill" -msgstr "Gatenvulling" - -#: src/slic3r/GUI/GUI_Preview.cpp:248 src/libslic3r/ExtrusionEntity.cpp:339 -#: src/libslic3r/ExtrusionEntity.cpp:370 -msgid "Skirt/Brim" -msgstr "Skirt/Brim" +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:99 +msgid "Remove parameter" +msgstr "Verwijder parameter" -#: src/slic3r/GUI/GUI_Preview.cpp:250 src/libslic3r/ExtrusionEntity.cpp:341 -#: src/libslic3r/ExtrusionEntity.cpp:374 src/libslic3r/PrintConfig.cpp:2736 -msgid "Support material interface" -msgstr "Supportinterface" +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:105 +#, c-format, boost-format +msgid "Delete Option %s" +msgstr "Verwijder optie %s" -#: src/slic3r/GUI/GUI_Preview.cpp:251 src/slic3r/GUI/Tab.cpp:1634 -#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/ExtrusionEntity.cpp:376 -msgid "Wipe tower" -msgstr "Afveegblok" +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:154 +#, c-format, boost-format +msgid "Change Option %s" +msgstr "Wijzig optie %s" -#: src/slic3r/GUI/GUI_Preview.cpp:728 +#: src/slic3r/GUI/GUI_Preview.cpp:581 msgid "NOTE:" msgstr "Let op:" -#: src/slic3r/GUI/GUI_Preview.cpp:729 +#: src/slic3r/GUI/GUI_Preview.cpp:582 #, boost-format msgid "Sliced object \"%1%\" looks like a logo or a sign" msgstr "Gesliced object \"%1%\" lijkt op een logo of bord" -#: src/slic3r/GUI/GUI_Preview.cpp:730 +#: src/slic3r/GUI/GUI_Preview.cpp:583 msgid "Apply color change automatically" msgstr "Pas kleurverandering automatisch toe" -#: src/slic3r/GUI/GUI_Preview.cpp:1058 -msgid "Shells" -msgstr "Shells" - -#: src/slic3r/GUI/GUI_Preview.cpp:1059 -msgid "Tool marker" -msgstr "Toolmarkering" - -#: src/slic3r/GUI/GUI_Preview.cpp:1060 -msgid "Legend/Estimated printing time" -msgstr "Legenda / Geschatte printtijd" - -#: src/slic3r/GUI/HintNotification.cpp:771 -#: src/slic3r/GUI/HintNotification.cpp:797 -#: src/slic3r/GUI/NotificationManager.cpp:374 -#: src/slic3r/GUI/NotificationManager.cpp:391 +#: src/slic3r/GUI/HintNotification.cpp:773 +#: src/slic3r/GUI/HintNotification.cpp:799 +#: src/slic3r/GUI/NotificationManager.cpp:457 +#: src/slic3r/GUI/NotificationManager.cpp:474 msgid "More" msgstr "Meer" -#: src/slic3r/GUI/HintNotification.cpp:912 +#: src/slic3r/GUI/HintNotification.cpp:914 msgid "Open Preferences." msgstr "Open voorkeuren." -#: src/slic3r/GUI/HintNotification.cpp:1004 +#: src/slic3r/GUI/HintNotification.cpp:1006 msgid "Open Documentation in web browser." msgstr "Open documentatie in de webbrowser." -#: src/slic3r/GUI/ImGuiWrapper.cpp:527 +#: src/slic3r/GUI/ImGuiWrapper.cpp:666 msgid "Edit" msgstr "Bewerk" -#: src/slic3r/GUI/ImGuiWrapper.cpp:960 src/slic3r/GUI/Search.cpp:470 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1166 src/slic3r/GUI/Search.cpp:531 msgid "Use for search" msgstr "Gebruik om te zoeken" -#: src/slic3r/GUI/ImGuiWrapper.cpp:961 src/slic3r/GUI/Search.cpp:463 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1167 src/slic3r/GUI/Search.cpp:524 msgid "Category" msgstr "Categorie" -#: src/slic3r/GUI/ImGuiWrapper.cpp:963 src/slic3r/GUI/Search.cpp:465 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1169 src/slic3r/GUI/Search.cpp:526 msgid "Search in English" msgstr "Zoek in het Engels" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:174 -msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "Kan modellen niet schikken. Sommige vormen kunnen ongeldig zijn." - -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:183 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:168 msgid "Arranging" msgstr "Schikken" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:207 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:204 msgid "Arranging canceled." msgstr "Schikken geannuleerd." -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:208 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:205 msgid "Arranging done." msgstr "Schikken voltooid." -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:253 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:225 +msgid "Could not arrange model objects! Some geometries may be invalid." +msgstr "Kan modellen niet schikken. Sommige vormen kunnen ongeldig zijn." + +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:265 #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -4988,103 +6257,118 @@ msgstr "" "De opstelling negeerde de volgende objecten die niet passen op één bed:\n" "%s" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:119 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:108 msgid "Filling bed" msgstr "Vul bed" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:130 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:140 msgid "Bed filling canceled." msgstr "Bed vullen geannuleerd." -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:131 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:141 msgid "Bed filling done." msgstr "Bed vullen klaar." -#: src/slic3r/GUI/Jobs/Job.cpp:111 -msgid "ERROR: not enough resources to execute a new job." -msgstr "Fout: niet genoeg middelen om nieuwe job te starten." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:148 src/slic3r/GUI/Jobs/EmbossJob.cpp:596 +msgid "Can't create empty volume." +msgstr "" -#: src/slic3r/GUI/Jobs/PlaterJob.cpp:13 -msgid "An unexpected error occured" -msgstr "Er is een onverwachte fout opgetreden" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:201 +msgid "Can't create empty object." +msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:21 -msgid "Best surface quality" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:208 +msgid "Add Emboss text object" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:23 -msgid "Optimize object rotation for best surface quality." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:247 +msgid "Created text volume is empty. Change text or font." msgstr "" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:465 +msgid "" +"It is used default volume for embossed text, try to change text or font to " +"fix it." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:549 +#, boost-format +msgid "Text: %1%" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:593 +msgid "Bad object to create volume." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:598 +msgid "Add Emboss text Volume" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:698 +msgid "Font doesn't have any shape for given text." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:738 +msgid "There is no volume in projection direction." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:787 +msgid "There is no valid surface for text projection." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:823 +msgid "Issue during embossing the text." +msgstr "" + +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:22 +msgid "Best surface quality" +msgstr "Beste oppervlaktekwaliteit" + #: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 +msgid "Optimize object rotation for best surface quality." +msgstr "Optimaliseer objectrotatie voor beste oppervlaktekwaliteit." + +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:25 msgid "Reduced overhang slopes" -msgstr "" +msgstr "Gereduceerde overhanghellingen" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:26 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:27 msgid "" "Optimize object rotation to have minimum amount of overhangs needing support " "structures.\n" "Note that this method will try to find the best surface of the object for " "touching the print bed if no elevation is set." msgstr "" +"Optimaliseer objectrotatie voor een minimale hoeveelheid overhangingen die " +"support nodig hebben.\n" +"Let op dat deze methode zoekt naar het beste vlak van het object om op het " +"printbed te leggen als geen verhoging ingesteld is." -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:30 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:31 msgid "Lowest Z height" -msgstr "" +msgstr "Laagste Z-hoogte" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:32 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:33 msgid "Rotate the model to have the lowest z height for faster print time." -msgstr "" +msgstr "Roteer het model voor een minimale hoogte voor snellere printtijd." -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:59 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:53 msgid "Searching for optimal orientation" msgstr "Zoeken naar optimale oriëntatie" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:77 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:83 msgid "Orientation search canceled." msgstr "Oriëntatie zoeken geannuleerd." -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:78 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:84 msgid "Orientation found." msgstr "Oriëntatie gevonden." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:36 -msgid "Choose SLA archive:" -msgstr "Kies SLA-archief:" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:40 -msgid "Import file" -msgstr "Importeer bestand" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47 -msgid "Import model and profile" -msgstr "Importeerd model en profiel" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48 -msgid "Import profile only" -msgstr "Importeer alleen profiel" - #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:49 -msgid "Import model only" -msgstr "Importeer alleen model" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60 -msgid "Accurate" -msgstr "Nauwkeurig" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61 -msgid "Balanced" -msgstr "Gebalanceerd" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:62 -msgid "Quick" -msgstr "Snel" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:140 msgid "Importing SLA archive" msgstr "Importeer SLA-archief" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:158 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:77 msgid "" "The SLA archive doesn't contain any presets. Please activate some SLA " "printer preset first before importing that SLA archive." @@ -5092,19 +6376,23 @@ msgstr "" "Het SLA-archief bevat geen presets. Activeer alstublieft eerste sommige SLA-" "printerpresets voor het importeren van dat SLA-archief." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:164 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:81 +msgid "Import is unavailable for this archive format." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:86 msgid "Importing canceled." msgstr "Importeren geannuleerd." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:165 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:87 msgid "Importing done." msgstr "Succesvol geïmporteerd." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:187 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:108 msgid "The file does not exist." -msgstr "" +msgstr "Het bestand bestaat niet." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:221 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135 msgid "" "The imported SLA archive did not contain any presets. The current SLA " "presets were used as fallback." @@ -5112,164 +6400,170 @@ msgstr "" "Het geïmporteerde SLA-archief bevat geen presets. De huidige SLA-presets " "worden gebruikt als oplossing." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:234 src/slic3r/GUI/Plater.cpp:2458 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:148 src/slic3r/GUI/Plater.cpp:2535 msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "U kunt geen SLA-project laden met een meerdelig object op het bed" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:236 src/slic3r/GUI/Plater.cpp:2460 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:150 src/slic3r/GUI/Plater.cpp:2537 msgid "Attention!" msgstr "Attentie!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:166 +msgid "The profile in the imported archive is corrupt and will not be loaded." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:178 +msgid "" +"No object could be retrieved from the archive. The slices might be corrupted " +"or missing." +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1184 msgid "Keyboard Shortcuts" msgstr "Sneltoetsen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:77 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:86 msgid "New project, clear plater" msgstr "Start nieuw project, verwijder modellen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:78 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 msgid "Open project AMF/3MF with config, clear plater" -msgstr "Open AMF- of 3MF-project met configuratie, verwijder huidige modellen" +msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 msgid "Save project (3mf)" -msgstr "3MF-project opslaan" +msgstr ".3MF-project opslaan" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 msgid "Save project as (3mf)" -msgstr "3MF-project opslaan als" +msgstr ".3MF-project opslaan als" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:81 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 msgid "(Re)slice" msgstr "(Her)slice" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:83 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:92 msgid "Import STL/3MF/STEP/OBJ/AMF without config, keep plater" msgstr "" -"Importeer STL-, 3MF-, STEP-, OBJ- of AMF-bestanden zonder configuratie en " -"behoud modellen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:84 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 msgid "Import Config from ini/amf/3mf/gcode" -msgstr "Importeer configuratie van INI-, AMF-, 3MF- of gcode-bestand" +msgstr "Importeer configuratie van .INI-, .AMF-, .3MF- of .gcode-bestand" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:85 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "" -"Laad configuratie van INI-, AMF-, 3MF- of gcode-bestanden en voeg samen" +"Laad configuratie van .INI-, .AMF-, .3MF- of .gcode-bestanden en voeg samen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6543 src/libslic3r/PrintConfig.cpp:4423 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:96 src/slic3r/GUI/Plater.cpp:948 +#: src/slic3r/GUI/Plater.cpp:7161 src/libslic3r/PrintConfig.cpp:4575 msgid "Export G-code" -msgstr "Exporteer gcode-bestand" +msgstr "Exporteer .gcode-bestand" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:97 src/slic3r/GUI/Plater.cpp:7162 msgid "Send G-code" msgstr "Stuur G-code" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 msgid "Export config" msgstr "Exporteer configuratie" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 src/slic3r/GUI/Plater.cpp:896 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 src/slic3r/GUI/Plater.cpp:931 msgid "Export to SD card / Flash drive" msgstr "Exporteer naar SD-kaart / USB-stick" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:91 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 msgid "Eject SD card / Flash drive" msgstr "SD-kaart/USB-stick uitwerpen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 msgid "Select all objects" msgstr "Selecteer alle objecten" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 msgid "Deselect all" msgstr "Deselecteer alles" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:95 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 msgid "Delete selected" msgstr "Deselecteer selectie" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 -msgid "Copy to clipboard" -msgstr "Kopieer naar klembord" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 msgid "Paste from clipboard" msgstr "Plak van klembord" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Reload plater from disk" msgstr "Herlaad modellen van schijf" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 msgid "Select Plater Tab" msgstr "Selecteer modelweergave" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 msgid "Select Print Settings Tab" msgstr "Selecteer printinstellingentab" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 msgid "Select Filament Settings Tab" msgstr "Selecteer filamentinstellingentab" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 msgid "Select Printer Settings Tab" msgstr "Selecteer printerinstellingentab" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 msgid "Switch to 3D" msgstr "Schakel over naar 3D-bewerkingsweergave" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 msgid "Switch to Preview" msgstr "Schakel over naar sliceweergave" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 -#: src/slic3r/GUI/PrintHostDialogs.cpp:217 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +#: src/slic3r/GUI/PrintHostDialogs.cpp:267 msgid "Print host upload queue" msgstr "Printhost-uploadwachtrij" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/MainFrame.cpp:75 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 src/slic3r/GUI/MainFrame.cpp:77 msgid "Open new instance" msgstr "Open nieuw venster" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 msgid "Camera view" msgstr "Weergave" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 msgid "Show/Hide object/instance labels" msgstr "Toon/verberg objecten- of instantielabels" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Preferences.cpp:46 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Preferences.cpp:57 +#: src/slic3r/GUI/Preferences.cpp:165 src/slic3r/GUI/Preferences.cpp:188 +#: src/slic3r/GUI/Preferences.cpp:207 src/slic3r/GUI/Preferences.cpp:215 msgid "Preferences" msgstr "Voorkeuren" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 msgid "Show keyboard shortcuts list" msgstr "Toon lijst met sneltoetsen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 msgid "Commands" msgstr "Commando's" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 msgid "Add Instance of the selected object" msgstr "Voeg instantie van het geselecteerde object toe" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Remove Instance of the selected object" msgstr "Verwijder instanties van het geselecteerde object" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 msgid "" "Press to select multiple objects\n" "or move multiple objects with mouse" @@ -5277,140 +6571,144 @@ msgstr "" "Druk om meerdere objecten te selecteren\n" "of beweeg meerdere objecten met de muis" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 msgid "Press to activate selection rectangle" msgstr "Druk om selectiebox te activeren" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 msgid "Press to activate deselection rectangle" msgstr "Druk om deselectiebox te activeren" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Arrow Up" msgstr "Pijltje naar boven" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 msgid "Move selection 10 mm in positive Y direction" msgstr "Verplaats selectie +10 mm in Y-richting" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Arrow Down" msgstr "Pijltje naar beneden" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 msgid "Move selection 10 mm in negative Y direction" msgstr "Verplaats selectie -10 mm in Y-richting" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Arrow Left" msgstr "Pijltje naar links" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 msgid "Move selection 10 mm in negative X direction" msgstr "Verplaats selectie -10 mm in X-richting" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Arrow Right" msgstr "Pijltje naar rechts" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 msgid "Move selection 10 mm in positive X direction" msgstr "Verplaats selectie +10 mm in X-richting" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Any arrow" msgstr "Elke pijl" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 msgid "Movement step set to 1 mm" msgstr "Verplaatsingsstap instellen op 1 mm" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Movement in camera space" msgstr "Verplaatsing in cameraruimte" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Page Up" msgstr "Page Up" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Rotate selection 45 degrees CCW" msgstr "Roteer selectie 45° tegen de klok in" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Page Down" msgstr "Page Down" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Rotate selection 45 degrees CW" msgstr "Roteer selectie 45° met de klok mee" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 msgid "Gizmo move" msgstr "Verplaats" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 msgid "Gizmo scale" msgstr "Verschaal" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Gizmo rotate" msgstr "Roteer" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Gizmo cut" msgstr "Snijden" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 msgid "Gizmo Place face on bed" msgstr "Plaats vlak op bed" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 msgid "Gizmo SLA hollow" msgstr "SLA uithollen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 msgid "Gizmo SLA support points" msgstr "SLA-supportpunten" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 msgid "Gizmo FDM paint-on supports" msgstr "FDM inkleur-supports" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 msgid "Gizmo FDM paint-on seam" msgstr "FDM inkleur-naad" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 msgid "Gizmo Multi Material painting" msgstr "Multi-materiaal schilderen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +msgid "Gizmo Text emboss / engrave" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 msgid "Unselect gizmo or clear selection" msgstr "Deselecteer bewerker of selectie" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 msgid "Change camera type (perspective, orthographic)" msgstr "Wijzig weergavetype (perspectief of orthografisch)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 msgid "Zoom to Bed" msgstr "Zoom in op bed" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 msgid "" "Zoom to selected object\n" "or all objects in scene, if none selected" @@ -5418,176 +6716,177 @@ msgstr "" "Zoom in op geselecteerde objecten\n" "of alle objecten in de modelweergave als niets is geselecteerd" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 msgid "Zoom in" msgstr "Zoom in" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Zoom out" msgstr "Zoom uit" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Switch between Editor/Preview" msgstr "Schakel tussen model- en sliceweergave" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Collapse/Expand the sidebar" msgstr "Klap de zijbalk in/uit" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled" msgstr "" -"Toon/verberg 3DConnexion-apparaten-instellingenvenster als dit aanstaat" +"Toon/verberg 3DConnexion-apparaten-instellingenvenster als dit is " +"ingeschakeld" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "Toon/verberg het dialoogvenster van 3Dconnexion-apparaatinstellingen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 msgid "Minimize application" msgstr "Minimaliseer programma" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 src/slic3r/GUI/MainFrame.cpp:284 -#: src/slic3r/GUI/MainFrame.cpp:333 src/slic3r/GUI/MainFrame.cpp:445 -#: src/slic3r/GUI/MainFrame.cpp:448 src/slic3r/GUI/MainFrame.cpp:470 -#: src/slic3r/GUI/MainFrame.cpp:473 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 src/slic3r/GUI/MainFrame.cpp:329 +#: src/slic3r/GUI/MainFrame.cpp:378 src/slic3r/GUI/MainFrame.cpp:490 +#: src/slic3r/GUI/MainFrame.cpp:493 src/slic3r/GUI/MainFrame.cpp:515 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Plater" msgstr "Modelweergave" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button" msgstr "Alle bewerkingen: roteer - linkermuisknop, beweeg - rechtermuisknop" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 msgid "Gizmo move: Press to snap by 1mm" msgstr "Bewerken: Druk om te snappen per 1mm" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 msgid "Gizmo scale: Press to snap by 5%" msgstr "Verschalen: Druk om te snappen per 5%" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 msgid "Gizmo scale: Scale selection to fit print volume" msgstr "Verschalen: Verschaal selectie tot het past in het printvolume" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 msgid "Gizmo scale: Press to activate one direction scaling" msgstr "Verschalen: Druk om in een enkele richting te verschalen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 msgid "Gizmo scale: Press to scale selected objects around their own center" msgstr "" "Verschalen: Druk om geselecteerde modellen rond hun eigen middelpunt te " "verschalen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 msgid "Gizmo rotate: Press to rotate selected objects around their own center" msgstr "" "Roteren: Druk om geselecteerde modellen rond hun eigen middelpunt te draaien" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "Gizmos" msgstr "Bewerkers" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "" "The following shortcuts are applicable when the specified gizmo is active" msgstr "" "De volgende sneltoetsen zijn van toepassing als de gespecificeerde bewerking " "actief is" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 msgid "Set selected items as Printable/Unprintable" msgstr "Stel de geselecteerde items in als printbaar/onprintbaar" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:203 msgid "Set default extruder for the selected items" msgstr "Stel de standaardextruder in voor de geselecteerde items" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 msgid "Set extruder number for the selected items" msgstr "Stel het extrudernummer in voor de geselecteerde items" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 msgid "Objects List" msgstr "Objectenlijst" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/MainFrame.cpp:1611 msgid "Open a G-code file" msgstr "Open een G-code-bestand" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 -#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 -#: src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 src/slic3r/GUI/MainFrame.cpp:1443 +#: src/slic3r/GUI/MainFrame.cpp:1447 src/slic3r/GUI/MainFrame.cpp:1616 +#: src/slic3r/GUI/MainFrame.cpp:1620 msgid "Reload the plater from disk" msgstr "Herlaad modellen van schijf" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 msgid "Vertical slider - Move active thumb Up" msgstr "Verticale schuif - verplaats actieve markering naar boven" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:228 msgid "Vertical slider - Move active thumb Down" msgstr "Verticale schuif - verplaats actieve markering naar beneden" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 msgid "Horizontal slider - Move active thumb Left" msgstr "Horizontale schuif - verplaats actieve markering naar links" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 msgid "Horizontal slider - Move active thumb Right" msgstr "Horizontale schuif - verplaats actieve markering naar rechts" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:231 msgid "On/Off one layer mode of the vertical slider" msgstr "Zet eenlaagsmodus aan/uit van de verticale schuif" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 -msgid "Show/Hide Legend and Estimated printing time" -msgstr "Toon/verberg legenda en geschatte printtijd" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:232 +msgid "Show/Hide legend" +msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 msgid "Show/Hide G-code window" msgstr "Toon/verberg G-code venster" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4480 -#: src/slic3r/GUI/Tab.cpp:2832 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 src/slic3r/GUI/Plater.cpp:4562 +#: src/slic3r/GUI/Tab.cpp:2736 msgid "Preview" msgstr "Sliceweergave" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 msgid "Move active thumb Up" msgstr "Verplaats actieve markering omhoog" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 msgid "Move active thumb Down" msgstr "Verplaats actieve markering omlaag" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 msgid "Set upper thumb as active" msgstr "Activeer bovenste markering" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 msgid "Set lower thumb as active" msgstr "Activeer onderste markering" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 msgid "Add color change marker for current layer" msgstr "Kleurwisselmarkering voor de huidige laag toevoegen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:238 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:244 msgid "Delete color change marker for current layer" msgstr "Verwijder kleurwisselmarkering voor de huidige laag" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:250 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:251 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:245 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:256 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:257 msgid "" "Press to speed up 5 times while moving thumb\n" "with arrow keys or mouse wheel" @@ -5595,11 +6894,11 @@ msgstr "" "Druk om 5x zo snel te gaan bij het verplaatsen van de markering\n" "met pijltjestoetsen of het scrollwieltje" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "Vertical Slider" msgstr "Verticale schuif" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "" "The following shortcuts are applicable in G-code preview when the vertical " "slider is active" @@ -5607,27 +6906,27 @@ msgstr "" "De volgende sneltoetsen zijn van toepassing in de sliceweergave als de " "verticale schuif actief is" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Move active thumb Left" msgstr "Verplaats actieve markering naar links" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Move active thumb Right" msgstr "Verplaats actieve markering naar rechts" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Set left thumb as active" msgstr "Activeer linker markering" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Set right thumb as active" msgstr "Activeer rechter markering" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "Horizontal Slider" msgstr "Horizontale schuif" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "" "The following shortcuts are applicable in G-code preview when the horizontal " "slider is active" @@ -5635,139 +6934,139 @@ msgstr "" "De volgende sneltoetsen zijn van toepassing in de sliceweergave als de " "horizontale schuif actief is" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:278 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:284 msgid "Keyboard shortcuts" msgstr "Sneltoetsen" -#: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:77 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open a new PrusaSlicer instance" msgstr "Open een PrusaSlicer venster" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:93 msgid "G-code preview" msgstr "Sliceweergave" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:1388 msgid "Open G-code viewer" msgstr "Open de G-code weergave" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:91 src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open PrusaSlicer" msgstr "Open PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:93 msgid "Open new G-code viewer" msgstr "Open G-code weergave" -#: src/slic3r/GUI/MainFrame.cpp:225 +#: src/slic3r/GUI/MainFrame.cpp:227 msgid "Closing PrusaSlicer. Current project is modified." msgstr "PrusaSlicer wordt afgesloten. Het huidig project is gewijzigd." -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "PrusaSlicer is closing" msgstr "PrusaSlicer sluit nu" -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "Closing PrusaSlicer while some presets are modified." msgstr "PrusaSlicer sluit terwijl sommige presets aangepast zijn." -#: src/slic3r/GUI/MainFrame.cpp:285 src/slic3r/GUI/MainFrame.cpp:335 -#: src/slic3r/GUI/Tab.hpp:427 src/slic3r/GUI/Tab.hpp:550 +#: src/slic3r/GUI/MainFrame.cpp:330 src/slic3r/GUI/MainFrame.cpp:380 +#: src/slic3r/GUI/Tab.hpp:413 src/slic3r/GUI/Tab.hpp:539 msgid "Print Settings" msgstr "Printinstellingen" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:535 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:384 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:520 msgid "Material Settings" msgstr "Materiaalinstellingen" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:461 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:382 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:448 msgid "Filament Settings" msgstr "Filamentinstellingen" -#: src/slic3r/GUI/MainFrame.cpp:287 src/slic3r/GUI/MainFrame.cpp:341 -#: src/slic3r/GUI/Tab.hpp:503 +#: src/slic3r/GUI/MainFrame.cpp:332 src/slic3r/GUI/MainFrame.cpp:386 +#: src/slic3r/GUI/Tab.hpp:488 msgid "Printer Settings" msgstr "Printerinstellingen" -#: src/slic3r/GUI/MainFrame.cpp:632 src/slic3r/GUI/Plater.cpp:1719 -#: src/slic3r/GUI/Plater.cpp:2850 +#: src/slic3r/GUI/MainFrame.cpp:685 src/slic3r/GUI/Plater.cpp:1728 +#: src/slic3r/GUI/Plater.cpp:2879 msgid "Untitled" msgstr "Zonder titel" -#: src/slic3r/GUI/MainFrame.cpp:655 +#: src/slic3r/GUI/MainFrame.cpp:710 msgid "based on Slic3r" msgstr "gebaseerd op Slic3r" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Prusa 3D &Drivers" msgstr "Prusa 3D-stuurprogramma" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Open the Prusa3D drivers download page in your browser" msgstr "Open de Prusa3D drivers-downloadpagina in uw browser" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Software &Releases" msgstr "Laatste versie downloaden" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open the software releases page in your browser" msgstr "Download de laatste softwareversie vanuit uw browser" -#: src/slic3r/GUI/MainFrame.cpp:1081 +#: src/slic3r/GUI/MainFrame.cpp:1158 #, c-format, boost-format msgid "%s &Website" -msgstr "%s-&website" +msgstr "%s-website" -#: src/slic3r/GUI/MainFrame.cpp:1082 +#: src/slic3r/GUI/MainFrame.cpp:1159 #, c-format, boost-format msgid "Open the %s website in your browser" msgstr "Open de %s website in uw browser" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "System &Info" msgstr "Systeeminfo" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "Show system information" msgstr "Toon systeeminformatie" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show &Configuration Folder" msgstr "Toon configuratiemap" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show user configuration folder (datadir)" msgstr "Toon gebruikersconfiguratiemap (datadir)" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "Report an I&ssue" msgstr "Rapporteer een fout" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 #, c-format, boost-format msgid "Report an issue on %s" msgstr "Rapporteer een fout op %s" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 #, c-format, boost-format msgid "&About %s" -msgstr "&Over %s" +msgstr "Over %s" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 msgid "Show about dialog" msgstr "Toon Over-dialoogvenster" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1177 msgid "Show Tip of the Day" msgstr "Toon tip van de dag" -#: src/slic3r/GUI/MainFrame.cpp:1104 +#: src/slic3r/GUI/MainFrame.cpp:1181 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." @@ -5775,94 +7074,94 @@ msgstr "" "Opent tip van de dag melding in de rechteronderhoek, of toont een andere tip " "als die al open staat." -#: src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/MainFrame.cpp:1184 msgid "Show the list of the keyboard shortcuts" msgstr "Toon de lijst met sneltoetsen" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso" msgstr "Isometrisch" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso View" msgstr "Isometrisch aanzicht" #. TRN To be shown in the main menu View->Top #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2917 -#: src/libslic3r/PrintConfig.cpp:2926 +#: src/slic3r/GUI/MainFrame.cpp:1202 src/libslic3r/PrintConfig.cpp:3005 +#: src/libslic3r/PrintConfig.cpp:3014 msgid "Top" msgstr "Bovenkant" -#: src/slic3r/GUI/MainFrame.cpp:1125 +#: src/slic3r/GUI/MainFrame.cpp:1202 msgid "Top View" msgstr "Bovenaanzicht" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:446 -#: src/libslic3r/PrintConfig.cpp:455 +#: src/slic3r/GUI/MainFrame.cpp:1205 src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:474 msgid "Bottom" msgstr "Onderkant" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1205 msgid "Bottom View" msgstr "Onderaanzicht" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front" msgstr "Voorkant" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front View" msgstr "Vooraanzicht" -#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2274 +#: src/slic3r/GUI/MainFrame.cpp:1209 src/libslic3r/PrintConfig.cpp:2300 msgid "Rear" msgstr "Achterzijde" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1209 msgid "Rear View" msgstr "Achteraanzicht" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left" msgstr "Links" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left View" msgstr "Linkerzijaanzicht" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right" msgstr "Rechts" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right View" msgstr "Rechterzijaanzicht" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "&New Project" msgstr "Nieuw project" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "Start a new project" msgstr "Start nieuw project" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "&Open Project" msgstr "Open project" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "Open a project file" msgstr "Open een projectbestand" -#: src/slic3r/GUI/MainFrame.cpp:1157 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Recent projects" msgstr "Huidige projecten" -#: src/slic3r/GUI/MainFrame.cpp:1169 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -5870,508 +7169,542 @@ msgstr "" "Het geselecteerde project is niet langer beschikbaar.\n" "Wilt u het verwijderen uit de lijst met recente projecten?" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Save Project" msgstr "Project opslaan" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "Save current project file" msgstr "Projectbestand opslaan" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save Project &as" msgstr "Project opslaan als" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save current project file as" msgstr "Projectbestand opslaan als" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Import STL/3MF/STEP/OBJ/AM&F" -msgstr "Importeer STL-, 3MF-, STEP-, OBJ- of AMF-bestanden" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Load a model" msgstr "Laad een model" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Import STL (Imperial Units)" msgstr "Importeer STL (Engelse eenheden)" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Load an model saved with imperial units" msgstr "Laad een model dat is opgeslagen met Engelse eenheden" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Import SL1 / SL1S Archive" -msgstr "Importeer SL1 / SL1S archief" +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Import SLA Archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Load an SLA archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Import ZIP Achive" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Load an SL1 / Sl1S archive" -msgstr "Laad SL1 / SL1S archief" +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Load a zip achive" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Import &Config" msgstr "Importeer configuratiebestand" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Load exported configuration file" msgstr "Laad geëxporteerd configuratiebestand" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Import Config from &Project" msgstr "Importeer configuratie van project" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Load configuration from project file" msgstr "Laad configuratie van projectbestand" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Import Config &Bundle" msgstr "Importeer configuratiebundel" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Load presets from a bundle" msgstr "Laad presets van een bundel" -#: src/slic3r/GUI/MainFrame.cpp:1231 +#: src/slic3r/GUI/MainFrame.cpp:1311 msgid "&Import" msgstr "Importeer" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1314 src/slic3r/GUI/MainFrame.cpp:1676 msgid "Export &G-code" msgstr "Exporteer G-code" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1314 msgid "Export current plate as G-code" -msgstr "Exporteer modellen als gcode-bestand" +msgstr "Exporteer modellen als .gcode-bestand" -#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1318 src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end G-code" msgstr "Stuur G-code" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1318 msgid "Send to print current plate as G-code" msgstr "Stuur huidige weergave als G-code" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export G-code to SD Card / Flash Drive" msgstr "Exporteer G-code naar SD-kaart / USB-stick" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "Exporteer modellen als G-code naar SD-kaart/USB-stick" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export Plate as &STL" -msgstr "Exporteer modellen als STL" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export Plate as &STL/OBJ" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export current plate as STL" -msgstr "Exporteer modellen als STL-bestand" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export current plate as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export Plate as STL &Including Supports" -msgstr "Exporteer modellen inclusief supports als STL" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export Plate as STL/OBJ &Including Supports" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export current plate as STL including supports" -msgstr "Exporteer modellen met support als STL-bestand" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export current plate as STL/OBJ including supports" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export &Toolpaths as OBJ" msgstr "Exporteer toolpaden als OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export toolpaths as OBJ" -msgstr "Exporteer toolpaden als OBJ-bestand" +msgstr "Exporteer toolpaden als .OBJ-bestand" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export &Config" msgstr "Exporteer configuratie" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export current configuration to file" msgstr "Exporteer huidige configuratie naar bestand" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export Config &Bundle" msgstr "Exporteer configuratiebundel" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export all presets to file" msgstr "Exporteer alle presets naar bestand" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export Config Bundle With Physical Printers" msgstr "Exporteer configuratiebundel met fysieke printers" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export all presets including physical printers to file" msgstr "Exporteer alle presets, inclusief fysieke printers naar bestand" -#: src/slic3r/GUI/MainFrame.cpp:1270 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "&Export" msgstr "Exporteer" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Ejec&t SD Card / Flash Drive" msgstr "SD-kaart / USB-stick uitwerpen" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "SD-kaart/USB-stick uitwerpen nadat de G-code geëxporteerd is." -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Quick Slice" msgstr "Snel slicen" -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Slice a file into a G-code" -msgstr "Slice naar een gcode-bestand" +msgstr "Slice naar een .gcode-bestand" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Quick Slice and Save As" msgstr "Snel slicen en opslaan als" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Slice a file into a G-code, save as" -msgstr "Slice naar gcode-bestand, opslaan als" +msgstr "Slice naar .gcode-bestand, opslaan als" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat Last Quick Slice" msgstr "Herhaal laatste snelle slice" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat last quick slice" msgstr "Herhaal laatste snelle slice" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "(Re)Slice No&w" -msgstr "(&Her)slice nu" +msgstr "(Her)slice nu" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "Start new slicing process" msgstr "Start nieuw sliceproces" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "&Repair STL file" -msgstr "&Repareer STL-bestand" +msgstr "Repareer .STL-bestand" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "Automatically repair an STL file" -msgstr "Automatisch een STL-bestand repareren" +msgstr "Automatisch een .STL-bestand repareren" -#: src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:1388 msgid "&G-code Preview" msgstr "Voorbeeldweergave" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1392 +msgid "E&xit" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1392 src/slic3r/GUI/UpdateDialogs.cpp:376 +#: src/slic3r/GUI/UpdateDialogs.cpp:423 +#, c-format, boost-format +msgid "Exit %s" +msgstr "%s afsluiten" + +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 msgid "&Quit" msgstr "Afsluiten" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 #, c-format, boost-format msgid "Quit %s" msgstr "%s afsluiten" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1410 msgid "&Select All" msgstr "Selecteer alles" -#: src/slic3r/GUI/MainFrame.cpp:1327 +#: src/slic3r/GUI/MainFrame.cpp:1411 msgid "Selects all objects" msgstr "Selecteer alle objecten" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1413 msgid "D&eselect All" msgstr "Deselecteer alles" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1414 msgid "Deselects all objects" msgstr "Deselecteer alle objecten" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1417 msgid "&Delete Selected" msgstr "Verwijder geselecteerde" -#: src/slic3r/GUI/MainFrame.cpp:1334 +#: src/slic3r/GUI/MainFrame.cpp:1418 msgid "Deletes the current selection" msgstr "Verwijdert huidige selectie" -#: src/slic3r/GUI/MainFrame.cpp:1336 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Delete &All" msgstr "Verwijder alles" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1421 msgid "Deletes all objects" msgstr "Verwijdert alle objecten" -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1425 msgid "&Undo" msgstr "Ongedaan maken" -#: src/slic3r/GUI/MainFrame.cpp:1344 +#: src/slic3r/GUI/MainFrame.cpp:1428 msgid "&Redo" msgstr "Opnieuw doen" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1433 msgid "&Copy" msgstr "Kopieer" -#: src/slic3r/GUI/MainFrame.cpp:1350 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Copy selection to clipboard" msgstr "Kopieer selectie naar klembord" -#: src/slic3r/GUI/MainFrame.cpp:1352 +#: src/slic3r/GUI/MainFrame.cpp:1436 msgid "&Paste" msgstr "Plak" -#: src/slic3r/GUI/MainFrame.cpp:1353 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "Paste clipboard" msgstr "Plak van klembord" -#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 -#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 +#: src/slic3r/GUI/MainFrame.cpp:1442 src/slic3r/GUI/MainFrame.cpp:1446 +#: src/slic3r/GUI/MainFrame.cpp:1615 src/slic3r/GUI/MainFrame.cpp:1619 msgid "Re&load from Disk" msgstr "Herlaad van schijf" -#: src/slic3r/GUI/MainFrame.cpp:1368 +#: src/slic3r/GUI/MainFrame.cpp:1452 msgid "Searc&h" msgstr "Zoek" -#: src/slic3r/GUI/MainFrame.cpp:1369 +#: src/slic3r/GUI/MainFrame.cpp:1453 msgid "Search in settings" msgstr "Zoek in instellingen" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "&Plater Tab" msgstr "Tabblad modelweergave" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "Show the plater" msgstr "Toon de modelweergave" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "P&rint Settings Tab" msgstr "Tabblad printinstellingen" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "Show the print settings" msgstr "Toon de printinstellingen" -#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1469 src/slic3r/GUI/MainFrame.cpp:1679 msgid "&Filament Settings Tab" msgstr "Tabblad filamentinstellingen" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1469 msgid "Show the filament settings" msgstr "Toon de filamentinstellingen" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Print&er Settings Tab" msgstr "Tabblad printerinstellingen" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Show the printer settings" msgstr "Toon de printerinstellingen" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "3&D" msgstr "3D-bewerkingsweergave" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "Show the 3D editing view" msgstr "Toon de modelweergave" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Pre&view" msgstr "Sliceweergave" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Show the 3D slices preview" msgstr "Toon de weergave van de slice" -#: src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/MainFrame.cpp:1488 msgid "Open the dialog to modify shape gallery" msgstr "Open het venster voor bewerken van de vormengalerij" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Print &Host Upload Queue" msgstr "Printhost-uploadwachtrij" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Display the Print Host Upload Queue window" msgstr "Toon het venster van de printhost-uploadwachtrij" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open New Instance" msgstr "Open nieuwe instantie" -#: src/slic3r/GUI/MainFrame.cpp:1424 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 +#: src/slic3r/GUI/MainFrame.cpp:1507 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1727 msgid "Compare Presets" msgstr "Vergelijk presets" -#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/MainFrame.cpp:1507 msgid "Compare presets" msgstr "Vergelijk presets" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show &Labels" msgstr "Toon labels" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show object/instance labels in 3D scene" msgstr "Toon object-/instantielabels in de modelweergave" -#: src/slic3r/GUI/MainFrame.cpp:1437 +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show Legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show legend in preview" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1523 msgid "&Collapse Sidebar" msgstr "Zijbalk inklappen" -#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1523 src/slic3r/GUI/Plater.cpp:2347 msgid "Collapse sidebar" msgstr "Zijbalk inklappen" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "&Fullscreen" msgstr "Volledig scherm" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "Fullscreen" msgstr "Volledig scherm" -#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1543 src/slic3r/GUI/MainFrame.cpp:1650 msgid "&File" msgstr "Bestand" -#: src/slic3r/GUI/MainFrame.cpp:1458 +#: src/slic3r/GUI/MainFrame.cpp:1544 msgid "&Edit" msgstr "Bewerken" -#: src/slic3r/GUI/MainFrame.cpp:1459 +#: src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Window" msgstr "Venster" -#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 +#: src/slic3r/GUI/MainFrame.cpp:1546 src/slic3r/GUI/MainFrame.cpp:1651 msgid "&View" msgstr "Toon" -#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 +#: src/slic3r/GUI/MainFrame.cpp:1549 src/slic3r/GUI/MainFrame.cpp:1654 msgid "&Help" -msgstr "&Help" +msgstr "Help" -#: src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/MainFrame.cpp:1611 msgid "&Open G-code" -msgstr "&Open G-code" +msgstr "Open G-code" -#: src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open &PrusaSlicer" -msgstr "Open &PrusaSlicer" +msgstr "Open PrusaSlicer" + +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legend" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1676 msgid "E&xport" msgstr "Exporteer" -#: src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end to print" msgstr "Stuur om te printen" -#: src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1679 msgid "Mate&rial Settings Tab" msgstr "Materiaalinstellingentab" -#: src/slic3r/GUI/MainFrame.cpp:1613 +#: src/slic3r/GUI/MainFrame.cpp:1703 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" -msgstr "Kies een STL-, OBJ-, AMF-, 3MF- of PRUSA-bestand om te slicen:" +msgstr "Kies een .STL-, .OBJ-, .AMF-, .3MF- of .PRUSA-bestand om te slicen:" -#: src/slic3r/GUI/MainFrame.cpp:1625 +#: src/slic3r/GUI/MainFrame.cpp:1715 msgid "No previously sliced file." msgstr "Niet eerder gesliced bestand." -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid "Previously sliced file (" msgstr "Eerder gesliced bestand (" -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid ") not found." msgstr ") niet gevonden." -#: src/slic3r/GUI/MainFrame.cpp:1633 +#: src/slic3r/GUI/MainFrame.cpp:1723 msgid "File Not Found" msgstr "Bestand niet gevonden" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 #, c-format, boost-format msgid "Save %s file as:" msgstr "%s-bestand opslaan als:" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "G-code" msgstr "G-code" -#: src/slic3r/GUI/MainFrame.cpp:1680 +#: src/slic3r/GUI/MainFrame.cpp:1770 msgid "Save zip file as:" -msgstr "ZIP-bestand opslaan als:" +msgstr ".ZIP-bestand opslaan als:" -#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6064 src/slic3r/GUI/Tab.cpp:1666 -#: src/slic3r/GUI/Tab.cpp:4730 +#: src/slic3r/GUI/MainFrame.cpp:1779 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6654 src/slic3r/GUI/Tab.cpp:1628 +#: src/slic3r/GUI/Tab.cpp:4986 msgid "Slicing" msgstr "Slicen" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1691 +#: src/slic3r/GUI/MainFrame.cpp:1781 #, c-format, boost-format msgid "Processing %s" msgstr "%s verwerken" -#: src/slic3r/GUI/MainFrame.cpp:1714 +#: src/slic3r/GUI/MainFrame.cpp:1804 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% is succesvol gesliced." -#: src/slic3r/GUI/MainFrame.cpp:1717 +#: src/slic3r/GUI/MainFrame.cpp:1807 msgid "Slicing Done!" msgstr "Slicen klaar!" -#: src/slic3r/GUI/MainFrame.cpp:1733 +#: src/slic3r/GUI/MainFrame.cpp:1823 msgid "Select the STL file to repair:" -msgstr "Selecteer het STL-bestand om te repareren:" +msgstr "Selecteer het .STL-bestand om te repareren:" -#: src/slic3r/GUI/MainFrame.cpp:1743 +#: src/slic3r/GUI/MainFrame.cpp:1833 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" -msgstr "OBJ-bestand opslaan als:" +msgstr ".OBJ-bestand opslaan als:" -#: src/slic3r/GUI/MainFrame.cpp:1754 +#: src/slic3r/GUI/MainFrame.cpp:1844 msgid "Your file was repaired." msgstr "Het bestand is gerepareerd." -#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4528 +#: src/slic3r/GUI/MainFrame.cpp:1844 src/libslic3r/PrintConfig.cpp:4694 msgid "Repair" msgstr "Repareer" -#: src/slic3r/GUI/MainFrame.cpp:1768 +#: src/slic3r/GUI/MainFrame.cpp:1858 msgid "Save configuration as:" msgstr "Configuratie opslaan als:" -#: src/slic3r/GUI/MainFrame.cpp:1785 +#: src/slic3r/GUI/MainFrame.cpp:1875 msgid "Loading of a configuration file" msgstr "Laden van een configuratiebestand" -#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 +#: src/slic3r/GUI/MainFrame.cpp:1877 src/slic3r/GUI/MainFrame.cpp:1944 msgid "Select configuration to load:" msgstr "Selecteer configuratie om te laden:" -#: src/slic3r/GUI/MainFrame.cpp:1816 +#: src/slic3r/GUI/MainFrame.cpp:1908 msgid "Exporting configuration bundle" msgstr "Exporteren van configuratiebundel" -#: src/slic3r/GUI/MainFrame.cpp:1817 +#: src/slic3r/GUI/MainFrame.cpp:1909 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." @@ -6379,15 +7712,15 @@ msgstr "" "Sommige presets zijn aangepast en de niet-opgeslagen wijzigingen zullen niet " "worden geëxporteerd in de configuratiebundel." -#: src/slic3r/GUI/MainFrame.cpp:1826 +#: src/slic3r/GUI/MainFrame.cpp:1918 msgid "Save presets bundle as:" msgstr "Presetbundel opslaan als:" -#: src/slic3r/GUI/MainFrame.cpp:1849 +#: src/slic3r/GUI/MainFrame.cpp:1941 msgid "Loading of a configuration bundle" msgstr "Laden van een configuratiebundel" -#: src/slic3r/GUI/MainFrame.cpp:1879 +#: src/slic3r/GUI/MainFrame.cpp:1971 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d presets succesvol geïmporteerd." @@ -6434,7 +7767,7 @@ msgstr "%s fout" #: src/slic3r/GUI/MsgDialog.cpp:228 #, c-format, boost-format msgid "%s has encountered an error" -msgstr "%s heeft een fout veroorzaakt" +msgstr "%s heeft een fout opgelopen" #: src/slic3r/GUI/MsgDialog.cpp:247 #, c-format, boost-format @@ -6456,19 +7789,19 @@ msgstr "%s info" msgid "%s information" msgstr "%s informatie" -#: src/slic3r/GUI/NotificationManager.hpp:752 +#: src/slic3r/GUI/NotificationManager.hpp:899 msgid "3D Mouse disconnected." msgstr "3D-muis ontkoppeld." -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "Configuration update is available." msgstr "Configuratie-update is beschikbaar." -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "See more." msgstr "Zie meer." -#: src/slic3r/GUI/NotificationManager.hpp:761 +#: src/slic3r/GUI/NotificationManager.hpp:908 msgid "" "You have just added a G-code for color change, but its value is empty.\n" "To export the G-code correctly, check the \"Color Change G-code\" in " @@ -6478,7 +7811,7 @@ msgstr "" "Om de G-code juist te exporteren, moet u de kleurwissel-G-code in " "printerinstellingen > custom G-code controleren." -#: src/slic3r/GUI/NotificationManager.hpp:764 +#: src/slic3r/GUI/NotificationManager.hpp:911 msgid "" "No color change event was added to the print. The print does not look like a " "sign." @@ -6486,144 +7819,187 @@ msgstr "" "Geen kleurwisseling toegevoegd aan de print. De print lijkt niet op een logo " "of bord." -#: src/slic3r/GUI/NotificationManager.hpp:766 +#: src/slic3r/GUI/NotificationManager.hpp:913 msgid "Desktop integration was successful." msgstr "Desktopintegratie is succesvol." -#: src/slic3r/GUI/NotificationManager.hpp:768 +#: src/slic3r/GUI/NotificationManager.hpp:915 msgid "Desktop integration failed." msgstr "Desktopintegratie mislukt." -#: src/slic3r/GUI/NotificationManager.hpp:770 +#: src/slic3r/GUI/NotificationManager.hpp:917 msgid "Undo desktop integration was successful." msgstr "Desktopintegratie ongedaan maken is succesvol." -#: src/slic3r/GUI/NotificationManager.hpp:772 +#: src/slic3r/GUI/NotificationManager.hpp:919 msgid "Undo desktop integration failed." msgstr "Desktopintegratie ongedaan maken mislukt." -#: src/slic3r/GUI/NotificationManager.hpp:773 +#: src/slic3r/GUI/NotificationManager.hpp:920 msgid "Exporting." msgstr "Exporteren." -#: src/slic3r/GUI/NotificationManager.cpp:664 +#: src/slic3r/GUI/NotificationManager.hpp:924 +msgid "" +"PrusaSlicer recieved a download request from Printables.com, but it's not " +"allowed. You can allow it" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:925 +msgid "here." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:773 msgid "Open Folder." msgstr "Open map." -#: src/slic3r/GUI/NotificationManager.cpp:701 +#: src/slic3r/GUI/NotificationManager.cpp:811 msgid "Eject drive" msgstr "Schijf uitwerpen" -#: src/slic3r/GUI/NotificationManager.cpp:885 +#: src/slic3r/GUI/NotificationManager.cpp:1054 +#: src/slic3r/GUI/NotificationManager.cpp:1267 +#: src/slic3r/GUI/NotificationManager.cpp:1472 msgid "ERROR" msgstr "FOUT" -#: src/slic3r/GUI/NotificationManager.cpp:890 -msgid "CANCELED" -msgstr "GEANNULEERD" - -#: src/slic3r/GUI/NotificationManager.cpp:895 +#: src/slic3r/GUI/NotificationManager.cpp:1269 +#: src/slic3r/GUI/NotificationManager.cpp:1377 msgid "COMPLETED" msgstr "VOLTOOID" -#: src/slic3r/GUI/NotificationManager.cpp:937 +#: src/slic3r/GUI/NotificationManager.cpp:1467 +msgid "RESOLVING ADDRESS" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:1477 +msgid "CANCELED" +msgstr "GEANNULEERD" + +#: src/slic3r/GUI/NotificationManager.cpp:1539 msgid "Cancel upload" msgstr "Annuleer upload" -#: src/slic3r/GUI/NotificationManager.cpp:996 +#: src/slic3r/GUI/NotificationManager.cpp:1648 #, c-format, boost-format msgid "%1$d object was loaded with custom supports." msgid_plural "%1$d objects were loaded with custom supports." -msgstr[0] "%1$d object is geladen met aangepaste supports." -msgstr[1] "%1$d objecten zijn geladen met aangepaste supports." +msgstr[0] "%1$d object is geladen met custom supports." +msgstr[1] "%1$d objecten zijn geladen met custom supports." -#: src/slic3r/GUI/NotificationManager.cpp:997 +#: src/slic3r/GUI/NotificationManager.cpp:1649 #, c-format, boost-format msgid "%1$d object was loaded with custom seam." msgid_plural "%1$d objects were loaded with custom seam." -msgstr[0] "%1$d object is geladen met aangepaste naad." -msgstr[1] "%1$d objecten zijn geladen met aangepaste naad." +msgstr[0] "%1$d object is geladen met een custom naad." +msgstr[1] "%1$d objecten zijn geladen met een custom naad." -#: src/slic3r/GUI/NotificationManager.cpp:998 +#: src/slic3r/GUI/NotificationManager.cpp:1650 #, c-format, boost-format msgid "%1$d object was loaded with multimaterial painting." msgid_plural "%1$d objects were loaded with multimaterial painting." -msgstr[0] "%1$d object is geladen met multi-material inkleuring." -msgstr[1] "%1$d objecten zijn geladen met multi-material inkleuring." +msgstr[0] "%1$d object is geladen met multi-materiaal schilderingen." +msgstr[1] "%1$d objecten zijn geladen met multi-materiaal schilderingen." -#: src/slic3r/GUI/NotificationManager.cpp:999 +#: src/slic3r/GUI/NotificationManager.cpp:1651 #, c-format, boost-format msgid "%1$d object was loaded with variable layer height." msgid_plural "%1$d objects were loaded with variable layer height." msgstr[0] "%1$d object is geladen met variabele laagdikte." msgstr[1] "%1$d objecten zijn geladen met variabele laagdikte." -#: src/slic3r/GUI/NotificationManager.cpp:1000 +#: src/slic3r/GUI/NotificationManager.cpp:1652 #, c-format, boost-format msgid "%1$d object was loaded with partial sinking." msgid_plural "%1$d objects were loaded with partial sinking." -msgstr[0] "%1$d object is geladen met een (gedeeltelijke) verzakking." -msgstr[1] "%1$d objecten zijn geladen met een (gedeeltelijke) verzakking." +msgstr[0] "%1$d object is geladen met gedeeltelijk verzakken." +msgstr[1] "%1$d objecten zijn geladen met gedeeltelijk verzakken." + +#: src/slic3r/GUI/NotificationManager.cpp:1653 +#, c-format, boost-format +msgid "%1$d object was loaded as a part of cut object." +msgid_plural "%1$d objects were loaded as parts of cut object" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Slicing finished." msgstr "Slicen gelukt." -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export G-Code." msgstr "Exporteer G-code." -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export." msgstr "Exporteer." -#: src/slic3r/GUI/NotificationManager.cpp:1447 -#: src/slic3r/GUI/NotificationManager.cpp:1454 -#: src/slic3r/GUI/NotificationManager.cpp:1470 -#: src/slic3r/GUI/NotificationManager.cpp:1476 -#: src/slic3r/GUI/NotificationManager.cpp:1547 +#: src/slic3r/GUI/NotificationManager.cpp:2101 +#: src/slic3r/GUI/NotificationManager.cpp:2108 +#: src/slic3r/GUI/NotificationManager.cpp:2124 +#: src/slic3r/GUI/NotificationManager.cpp:2130 +#: src/slic3r/GUI/NotificationManager.cpp:2201 msgid "ERROR:" msgstr "Fout:" -#: src/slic3r/GUI/NotificationManager.cpp:1459 -#: src/slic3r/GUI/NotificationManager.cpp:1486 -#: src/slic3r/GUI/NotificationManager.cpp:1494 -#: src/slic3r/GUI/NotificationManager.cpp:1505 src/slic3r/GUI/Plater.cpp:3197 +#: src/slic3r/GUI/NotificationManager.cpp:2113 +#: src/slic3r/GUI/NotificationManager.cpp:2140 +#: src/slic3r/GUI/NotificationManager.cpp:2148 +#: src/slic3r/GUI/NotificationManager.cpp:2159 src/slic3r/GUI/Plater.cpp:3220 msgid "WARNING:" msgstr "Waarschuwing:" -#: src/slic3r/GUI/NotificationManager.cpp:1598 +#: src/slic3r/GUI/NotificationManager.cpp:2275 msgid "Exporting finished." msgstr "Exporteren gelukt." -#: src/slic3r/GUI/ObjectDataViewModel.cpp:50 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 msgid "Paint-on seam" msgstr "Naad schilderen" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:52 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:68 +msgid "Cut connectors" +msgstr "" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:70 msgid "Sinking" msgstr "Verzakken" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:110 msgid "Instances" msgstr "Instanties" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:98 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:266 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:114 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:275 #, c-format, boost-format msgid "Instance %d" msgstr "Instantie %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4568 -#: src/slic3r/GUI/Tab.cpp:4659 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:121 src/slic3r/GUI/Tab.cpp:4805 +#: src/slic3r/GUI/Tab.cpp:4942 msgid "Layers" msgstr "Lagen" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 msgid "Range" msgstr "Bereik" -#: src/slic3r/GUI/OpenGLManager.cpp:258 +#: src/slic3r/GUI/OpenGLManager.cpp:376 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL ES 2.0 capable graphics driver to run " +"correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:379 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL %s capable graphics driver to run correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:382 #, c-format, boost-format msgid "" "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" @@ -6632,11 +8008,11 @@ msgstr "" "PrusaSlicer vereist een grafische driver die OpenGL 2.0 kan draaien,\n" "terwijl OpenGL-versie %s, render %s, leverancier %s is gedetecteerd." -#: src/slic3r/GUI/OpenGLManager.cpp:261 +#: src/slic3r/GUI/OpenGLManager.cpp:386 msgid "You may need to update your graphics card driver." msgstr "U moet mogelijk uw grafische kaart updaten." -#: src/slic3r/GUI/OpenGLManager.cpp:264 +#: src/slic3r/GUI/OpenGLManager.cpp:389 msgid "" "As a workaround, you may run PrusaSlicer with a software rendered 3D " "graphics by running prusa-slicer.exe with the --sw-renderer parameter." @@ -6645,11 +8021,11 @@ msgstr "" "modelweergave door prusa-slicer.exe te draaien met de --sw-renderer " "parameter." -#: src/slic3r/GUI/OpenGLManager.cpp:266 +#: src/slic3r/GUI/OpenGLManager.cpp:391 msgid "Unsupported OpenGL version" msgstr "Niet-ondersteunde OpenGL-versie" -#: src/slic3r/GUI/OpenGLManager.cpp:274 +#: src/slic3r/GUI/OpenGLManager.cpp:399 #, c-format, boost-format msgid "" "Unable to load the following shaders:\n" @@ -6658,16 +8034,20 @@ msgstr "" "Kan de volgende sjablonen niet laden:\n" "%s" -#: src/slic3r/GUI/OpenGLManager.cpp:275 +#: src/slic3r/GUI/OpenGLManager.cpp:400 msgid "Error loading shaders" msgstr "Fout bij het laden van de sjablonen" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:126 +msgid "Unavailable for this method." +msgstr "" + +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Top" msgstr "Bovenkant" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Bottom" msgstr "Onderkant" @@ -6676,7 +8056,7 @@ msgstr "Onderkant" msgid "Delete this preset from this printer device" msgstr "Verwijderen van deze preset van deze printer" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:83 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:84 msgid "This printer will be shown in the presets list as" msgstr "De printer wordt getoond in de presets als" @@ -6692,31 +8072,31 @@ msgstr "Beschrijvende naam voor de printer" msgid "Add preset for this printer device" msgstr "Voeg preset toe voor deze printer" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2255 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2239 msgid "Print Host upload" msgstr "Printhost-upload" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:268 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:271 msgid "Connection to printers connected via the print host failed." msgstr "Verbinding met printers die via printhost verbonden zijn niet gelukt." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:310 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:313 msgid "Test" msgstr "Test" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:315 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:318 msgid "Could not get a valid Printer Host reference" msgstr "Kan geen geldige printerhost-referentie krijgen" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:330 msgid "Success!" msgstr "Gelukt!" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:337 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:340 msgid "Refresh Printers" msgstr "Ververs printers" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:367 msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." @@ -6724,20 +8104,20 @@ msgstr "" "HTTPS-CA-bestand is optioneel. Het is alleen nodig als u werkt met een zelf " "ondertekend certificaat." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:374 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:377 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "Certificaatbestanden (*.crt, *.pem)|*.crt;*.pem|Alle betanden|*.*" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:378 msgid "Open CA certificate file" msgstr "Open een CA-certificaatbestand" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:404 -#: src/libslic3r/PrintConfig.cpp:330 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:407 +#: src/libslic3r/PrintConfig.cpp:343 msgid "HTTPS CA File" msgstr "HTTPS-CA-bestand" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:405 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:408 #, c-format, boost-format msgid "" "On this system, %s uses HTTPS certificates from the system Certificate Store " @@ -6746,7 +8126,7 @@ msgstr "" "Op dit systeem gebruikt %s HTTPS-certificaten van de Certificate Store of " "Keychain." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:406 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:409 msgid "" "To use a custom CA file, please import your CA file into Certificate Store / " "Keychain." @@ -6754,24 +8134,24 @@ msgstr "" "Importeer een CA-bestand in de Certificate Store of Keychain om deze te " "gebruiken." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:634 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:706 msgid "The supplied name is empty. It can't be saved." msgstr "De ingevoerde naam is leeg. Kan niet opgeslagen worden." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:638 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:710 msgid "You have to enter a printer name." -msgstr "" +msgstr "U moet een printernaam invoeren." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:646 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:718 #, boost-format msgid "Printer with name \"%1%\" already exists." msgstr "Printer met naam \"%1%\" bestaat al." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:647 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:719 msgid "Replace?" msgstr "Vervangen?" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:674 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:746 #, boost-format msgid "" "Following printer preset is duplicated:%1%The above preset for printer \"%2%" @@ -6786,21 +8166,21 @@ msgstr[1] "" "De volgende printerpresets zijn gedupliceerd:%1%De bovenste preset voor " "printer \"%2%\" zal eenmalig worden gebruikt." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:724 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:796 msgid "It's not possible to delete the last related preset for the printer." msgstr "" "Het is niet mogelijk om de laatst gerelateerde preset voor de printer te " "verwijderen." -#: src/slic3r/GUI/Plater.cpp:141 +#: src/slic3r/GUI/Plater.cpp:158 msgid "The provided name is not valid;" msgstr "De gegeven naam is niet geldig;" -#: src/slic3r/GUI/Plater.cpp:142 src/slic3r/GUI/SavePresetDialog.cpp:102 +#: src/slic3r/GUI/Plater.cpp:159 src/slic3r/GUI/SavePresetDialog.cpp:166 msgid "the following characters are not allowed:" msgstr "de volgende karakters zijn niet toegestaan:" -#: src/slic3r/GUI/Plater.cpp:207 +#: src/slic3r/GUI/Plater.cpp:223 msgid "" "For a multipart object, this value isn't accurate.\n" "It doesn't take account of intersections and negative volumes." @@ -6808,191 +8188,191 @@ msgstr "" "Voor een meerdelig object is deze waarde niet accuraat.\n" "Intersecties en negatieve volumes worden niet meegenomen." -#: src/slic3r/GUI/Plater.cpp:211 +#: src/slic3r/GUI/Plater.cpp:227 msgid "Volume" msgstr "Volume" -#: src/slic3r/GUI/Plater.cpp:213 +#: src/slic3r/GUI/Plater.cpp:229 msgid "Facets" msgstr "Vlakken" -#: src/slic3r/GUI/Plater.cpp:276 +#: src/slic3r/GUI/Plater.cpp:286 msgid "Sliced Info" msgstr "Slice-info" -#: src/slic3r/GUI/Plater.cpp:296 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:306 src/slic3r/GUI/Plater.cpp:1414 msgid "Used Filament (g)" msgstr "Filamentverbruik (g)" -#: src/slic3r/GUI/Plater.cpp:297 src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:307 src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (m)" msgstr "Filamentverbruik (m)" -#: src/slic3r/GUI/Plater.cpp:298 src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:308 src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (mm³)" msgstr "Filamentverbruik (mm³)" -#: src/slic3r/GUI/Plater.cpp:299 +#: src/slic3r/GUI/Plater.cpp:309 msgid "Used Material (unit)" msgstr "Materiaalverbruik (eenheid)" -#: src/slic3r/GUI/Plater.cpp:300 +#: src/slic3r/GUI/Plater.cpp:310 msgid "Cost (money)" msgstr "Kosten (€)" -#: src/slic3r/GUI/Plater.cpp:301 src/slic3r/GUI/Plater.cpp:1340 -#: src/slic3r/GUI/Plater.cpp:1427 +#: src/slic3r/GUI/Plater.cpp:311 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:1464 msgid "Estimated printing time" msgstr "Geschatte printtijd" -#: src/slic3r/GUI/Plater.cpp:302 +#: src/slic3r/GUI/Plater.cpp:312 msgid "Number of tool changes" msgstr "Aantal toolwisselingen" -#: src/slic3r/GUI/Plater.cpp:431 +#: src/slic3r/GUI/Plater.cpp:437 msgid "Select what kind of support do you need" msgstr "Selecteer welk type support nodig is" -#: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2590 -#: src/libslic3r/PrintConfig.cpp:3645 +#: src/slic3r/GUI/Plater.cpp:440 src/libslic3r/PrintConfig.cpp:2620 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "Support on build plate only" msgstr "Support alleen op het bed" -#: src/slic3r/GUI/Plater.cpp:434 src/slic3r/GUI/Plater.cpp:564 +#: src/slic3r/GUI/Plater.cpp:441 msgid "For support enforcers only" msgstr "Alleen voor supportforceringen" -#: src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Plater.cpp:442 msgid "Everywhere" msgstr "Overal" -#: src/slic3r/GUI/Plater.cpp:467 src/slic3r/GUI/Tab.cpp:1542 +#: src/slic3r/GUI/Plater.cpp:475 src/slic3r/GUI/Tab.cpp:1489 msgid "Brim" msgstr "Brim" -#: src/slic3r/GUI/Plater.cpp:469 +#: src/slic3r/GUI/Plater.cpp:477 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." msgstr "Door dit aan te vinken zal een brim rond elke object geprint worden." -#: src/slic3r/GUI/Plater.cpp:477 +#: src/slic3r/GUI/Plater.cpp:485 msgid "Purging volumes" msgstr "Afveegvolume" -#: src/slic3r/GUI/Plater.cpp:578 +#: src/slic3r/GUI/Plater.cpp:592 msgid "Select what kind of pad do you need" msgstr "Selecteer welk soort basisplaat nodig is" -#: src/slic3r/GUI/Plater.cpp:580 +#: src/slic3r/GUI/Plater.cpp:595 msgid "Below object" msgstr "Onder het object" -#: src/slic3r/GUI/Plater.cpp:581 +#: src/slic3r/GUI/Plater.cpp:596 msgid "Around object" msgstr "Rondom het object" -#: src/slic3r/GUI/Plater.cpp:894 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/Plater.cpp:929 src/slic3r/GUI/Plater.cpp:7162 msgid "Send to printer" msgstr "Stuur naar printer" -#: src/slic3r/GUI/Plater.cpp:914 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6067 +#: src/slic3r/GUI/Plater.cpp:949 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6657 msgid "Slice now" msgstr "Slice nu" -#: src/slic3r/GUI/Plater.cpp:1087 +#: src/slic3r/GUI/Plater.cpp:1127 msgid "Hold Shift to Slice & Export G-code" msgstr "Houdt shift ingedrukt om te slicen en de G-code te exporteren" -#: src/slic3r/GUI/Plater.cpp:1287 +#: src/slic3r/GUI/Plater.cpp:1324 #, boost-format msgid "%1% (%2$d shell)" msgid_plural "%1% (%2$d shells)" msgstr[0] "%1% (%2$d shell)" msgstr[1] "%1% (%2$d shells)" -#: src/slic3r/GUI/Plater.cpp:1315 +#: src/slic3r/GUI/Plater.cpp:1352 msgid "Used Material (ml)" msgstr "Materiaalgebruik (ml)" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "object" msgid_plural "objects" msgstr[0] "object" msgstr[1] "objecten" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "supports and pad" msgstr "support en basisplaat" -#: src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (in)" msgstr "Gebruikt filament (in)" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "objects" msgstr "objecten" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "wipe tower" msgstr "afveegblok" -#: src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (in³)" msgstr "Gebruikt filament (in³)" -#: src/slic3r/GUI/Plater.cpp:1396 +#: src/slic3r/GUI/Plater.cpp:1433 #, boost-format msgid "Filament at extruder %1%" msgstr "Filament in extruder %1%" -#: src/slic3r/GUI/Plater.cpp:1402 +#: src/slic3r/GUI/Plater.cpp:1439 msgid "(including spool)" msgstr "(inclusief spoel)" -#: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1072 -#: src/libslic3r/PrintConfig.cpp:3439 src/libslic3r/PrintConfig.cpp:3440 +#: src/slic3r/GUI/Plater.cpp:1448 src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:3716 src/libslic3r/PrintConfig.cpp:3717 msgid "Cost" msgstr "Kosten" -#: src/slic3r/GUI/Plater.cpp:1429 +#: src/slic3r/GUI/Plater.cpp:1466 msgid "normal mode" msgstr "normale modus" -#: src/slic3r/GUI/Plater.cpp:1436 +#: src/slic3r/GUI/Plater.cpp:1473 msgid "stealth mode" msgstr "stille modus" -#: src/slic3r/GUI/Plater.cpp:1670 -msgid "Fill bed" -msgstr "Vul het bed" - -#: src/slic3r/GUI/Plater.cpp:1676 -msgid "Optimize Rotation" -msgstr "Optimaliseer rotatie" - -#: src/slic3r/GUI/Plater.cpp:1682 -msgid "Import SLA archive" -msgstr "Importeer SLA-archief" - -#: src/slic3r/GUI/Plater.cpp:1725 +#: src/slic3r/GUI/Plater.cpp:1734 #, boost-format msgid "Do you want to save the changes to \"%1%\"?" msgstr "Wilt u de wijzigingen opslaan naar \"%1%\"?" -#: src/slic3r/GUI/Plater.cpp:1730 src/slic3r/GUI/Preferences.cpp:222 +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:905 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1599 +msgid "Save" +msgstr "Opslaan" + +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +msgid "Discard" +msgstr "Afwijzen" + +#: src/slic3r/GUI/Plater.cpp:1740 src/slic3r/GUI/Preferences.cpp:354 msgid "Ask for unsaved changes in project" -msgstr "" +msgstr "Vraag naar niet-opgeslagen wijzigingen in dit project" -#: src/slic3r/GUI/Plater.cpp:1733 +#: src/slic3r/GUI/Plater.cpp:1743 msgid "" "You will not be asked about it again, when: \n" "- Closing PrusaSlicer,\n" "- Loading or creating a new project" msgstr "" +"U wordt hier niet opnieuw over gevraagd bij:\n" +"- het sluiten van PrusaSlicer;\n" +"- het laden of openen van een nieuw project" -#: src/slic3r/GUI/Plater.cpp:2198 +#: src/slic3r/GUI/Plater.cpp:2214 #, c-format, boost-format msgid "" "Successfully unmounted. The device %s(%s) can now be safely removed from the " @@ -7001,20 +8381,20 @@ msgstr "" "Succesvol ontkoppeld. Het apparat %s(%s) kan nu veilig worden verwijderd uit " "de computer." -#: src/slic3r/GUI/Plater.cpp:2203 +#: src/slic3r/GUI/Plater.cpp:2220 #, c-format, boost-format msgid "Ejecting of device %s(%s) has failed." msgstr "Uitwerpen van apparat %s(%s) mislukt." -#: src/slic3r/GUI/Plater.cpp:2222 src/slic3r/GUI/Plater.cpp:5108 +#: src/slic3r/GUI/Plater.cpp:2239 src/slic3r/GUI/Plater.cpp:5199 msgid "New Project" msgstr "Nieuw project" -#: src/slic3r/GUI/Plater.cpp:2319 +#: src/slic3r/GUI/Plater.cpp:2346 msgid "Expand sidebar" msgstr "Zijbalk uitklappen" -#: src/slic3r/GUI/Plater.cpp:2518 +#: src/slic3r/GUI/Plater.cpp:2428 msgid "" "The preset below was temporarily installed on the active instance of " "PrusaSlicer" @@ -7028,12 +8408,12 @@ msgstr[1] "" "De vorige presets zijn tijdelijk geïnstalleerd op de actieve instantie van " "PrusaSlicer" -#: src/slic3r/GUI/Plater.cpp:2548 +#: src/slic3r/GUI/Plater.cpp:2583 #, boost-format msgid "Failed loading file \"%1%\" due to an invalid configuration." msgstr "Laden van bestand \"%1%\" mislukt dankzij een ongeldige configuratie." -#: src/slic3r/GUI/Plater.cpp:2568 +#: src/slic3r/GUI/Plater.cpp:2603 #, c-format, boost-format msgid "" "Object size from file %s appears to be zero.\n" @@ -7048,11 +8428,11 @@ msgstr[1] "" "Objectengrootte van bestand %s blijken nul te zijn.\n" "Het object is verwijderd van het model" -#: src/slic3r/GUI/Plater.cpp:2572 +#: src/slic3r/GUI/Plater.cpp:2607 msgid "The size of the object is zero" msgstr "De afmetingen van het object zijn nul" -#: src/slic3r/GUI/Plater.cpp:2585 +#: src/slic3r/GUI/Plater.cpp:2620 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in meters.\n" @@ -7071,15 +8451,15 @@ msgstr[1] "" "De gebruikte eenheid van PrusaSlicer is millimeters. Wilt u de afmetingen " "van het object verschalen?" -#: src/slic3r/GUI/Plater.cpp:2589 src/slic3r/GUI/Plater.cpp:2611 +#: src/slic3r/GUI/Plater.cpp:2624 src/slic3r/GUI/Plater.cpp:2646 msgid "The object is too small" msgstr "Het object is te klein" -#: src/slic3r/GUI/Plater.cpp:2590 src/slic3r/GUI/Plater.cpp:2612 +#: src/slic3r/GUI/Plater.cpp:2625 src/slic3r/GUI/Plater.cpp:2647 msgid "Apply to all the remaining small objects being loaded." msgstr "Pas toe op alle resterende kleine objecten die worden geladen." -#: src/slic3r/GUI/Plater.cpp:2607 +#: src/slic3r/GUI/Plater.cpp:2642 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in inches.\n" @@ -7098,7 +8478,7 @@ msgstr[1] "" "De gebruikte eenheid van PrusaSlicer is millimeters. Wilt u de afmetingen " "van het object verschalen?" -#: src/slic3r/GUI/Plater.cpp:2625 +#: src/slic3r/GUI/Plater.cpp:2659 msgid "" "This file contains several objects positioned at multiple heights.\n" "Instead of considering them as multiple objects, should \n" @@ -7109,11 +8489,11 @@ msgstr "" "Moet het bestand worden geladen als één object met meerdere onderdelen\n" "in plaats van deze te beschouwen als meerdere objecten?" -#: src/slic3r/GUI/Plater.cpp:2628 src/slic3r/GUI/Plater.cpp:2683 +#: src/slic3r/GUI/Plater.cpp:2662 src/slic3r/GUI/Plater.cpp:2711 msgid "Multi-part object detected" msgstr "Meerdelig object gedetecteerd" -#: src/slic3r/GUI/Plater.cpp:2636 +#: src/slic3r/GUI/Plater.cpp:2669 msgid "" "This file cannot be loaded in a simple mode. Do you want to switch to an " "advanced mode?" @@ -7121,20 +8501,11 @@ msgstr "" "Dit bestand kan niet geladen worden in eenvoudige modus. Wilt u overstappen " "op geavanceerde modus?" -#: src/slic3r/GUI/Plater.cpp:2637 +#: src/slic3r/GUI/Plater.cpp:2670 msgid "Detected advanced data" msgstr "Geavanceerde data gedetecteerd" -#: src/slic3r/GUI/Plater.cpp:2657 -#, c-format, boost-format -msgid "" -"You can't to add the object(s) from %s because of one or some of them " -"is(are) multi-part" -msgstr "" -"U kan geen objecten toevoegen van %s, omdat sommige daarvan meerdelig kunnen " -"zijn" - -#: src/slic3r/GUI/Plater.cpp:2680 +#: src/slic3r/GUI/Plater.cpp:2708 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" @@ -7144,7 +8515,7 @@ msgstr "" "Moeten deze objecten beschouwd worden als één object\n" "met meerdere onderdelen, of als meerdere objecten?" -#: src/slic3r/GUI/Plater.cpp:2799 +#: src/slic3r/GUI/Plater.cpp:2827 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." @@ -7152,39 +8523,54 @@ msgstr "" "Het object is te groot. Daarom is het automatisch verschaald tot de grootte " "van het printbed." -#: src/slic3r/GUI/Plater.cpp:2800 +#: src/slic3r/GUI/Plater.cpp:2828 msgid "Object too large?" msgstr "Object te groot?" -#: src/slic3r/GUI/Plater.cpp:2878 +#: src/slic3r/GUI/Plater.cpp:2908 msgid "Export STL file:" -msgstr "Exporteer STL-bestand:" +msgstr "Exporteer .STL-bestand:" -#: src/slic3r/GUI/Plater.cpp:2885 +#: src/slic3r/GUI/Plater.cpp:2915 msgid "Export AMF file:" -msgstr "Exporteer AMF-bestand:" +msgstr "Exporteer .AMF-bestand:" -#: src/slic3r/GUI/Plater.cpp:2891 +#: src/slic3r/GUI/Plater.cpp:2921 msgid "Save file as:" msgstr "Bestand opslaan als:" -#: src/slic3r/GUI/Plater.cpp:2897 +#: src/slic3r/GUI/Plater.cpp:2927 msgid "Export OBJ file:" -msgstr "Exporteer OBJ-bestand:" +msgstr "Exporteer .OBJ-bestand:" + +#: src/slic3r/GUI/Plater.cpp:3030 +msgid "Delete object which is a part of cut object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3031 +msgid "" +"You try to delete an object which is a part of a cut object.\n" +"This action will break a cut correspondence.\n" +"After that PrusaSlicer can't guarantee model consistency" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3035 +msgid "Delete object" +msgstr "" -#: src/slic3r/GUI/Plater.cpp:2995 +#: src/slic3r/GUI/Plater.cpp:3040 msgid "Delete Object" msgstr "Verwijder object" -#: src/slic3r/GUI/Plater.cpp:3007 +#: src/slic3r/GUI/Plater.cpp:3057 msgid "Delete All Objects" msgstr "Verwijder alle objecten" -#: src/slic3r/GUI/Plater.cpp:3035 +#: src/slic3r/GUI/Plater.cpp:3086 msgid "Reset Project" msgstr "Reset project" -#: src/slic3r/GUI/Plater.cpp:3118 +#: src/slic3r/GUI/Plater.cpp:3141 msgid "" "The selected object couldn't be split because it contains only one solid " "part." @@ -7192,103 +8578,104 @@ msgstr "" "Het geselecteerde object kan niet gesplitst worden omdat het maar één " "onderdeel bevat." -#: src/slic3r/GUI/Plater.cpp:3125 +#: src/slic3r/GUI/Plater.cpp:3148 msgid "All non-solid parts (modifiers) were deleted" msgstr "Alle niet-solide onderdelen (bewerkers) zijn verwijderd" -#: src/slic3r/GUI/Plater.cpp:3127 +#: src/slic3r/GUI/Plater.cpp:3150 msgid "Split to Objects" msgstr "Splits op naar objecten" -#: src/slic3r/GUI/Plater.cpp:3179 +#: src/slic3r/GUI/Plater.cpp:3202 msgid "" "An object has custom support enforcers which will not be used because " "supports are disabled." msgstr "" -"Een object heeft aangepaste supportforcering die niet gebruikt worden omdat " +"Een object heeft custom supportforcering die niet gebruikt worden omdat " "supports uit staan." -#: src/slic3r/GUI/Plater.cpp:3181 +#: src/slic3r/GUI/Plater.cpp:3204 msgid "Enable supports for enforcers only" msgstr "Sta supports voor forceringen alleen toe" -#: src/slic3r/GUI/Plater.cpp:3310 src/slic3r/GUI/Plater.cpp:4176 +#: src/slic3r/GUI/Plater.cpp:3339 src/slic3r/GUI/Plater.cpp:4238 msgid "Invalid data" msgstr "Ongeldige data" -#: src/slic3r/GUI/Plater.cpp:3380 +#: src/slic3r/GUI/Plater.cpp:3410 msgid "Another export job is currently running." msgstr "Een andere export loopt op dit moment." -#: src/slic3r/GUI/Plater.cpp:3466 +#: src/slic3r/GUI/Plater.cpp:3496 msgid "Replace from:" msgstr "Vervangen door:" -#: src/slic3r/GUI/Plater.cpp:3484 +#: src/slic3r/GUI/Plater.cpp:3514 msgid "Unable to replace with more than one volume" msgstr "Niet mogelijk om te vervangen met meer dan één volume" -#: src/slic3r/GUI/Plater.cpp:3484 src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3514 src/slic3r/GUI/Plater.cpp:3597 msgid "Error during replace" msgstr "Fout tijdens vervangen" -#: src/slic3r/GUI/Plater.cpp:3555 +#: src/slic3r/GUI/Plater.cpp:3589 msgid "Select the new file" msgstr "Selecteer het nieuwe bestand" -#: src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3597 msgid "File for the replace wasn't selected" msgstr "Vervangbestand is niet geselecteerd" -#: src/slic3r/GUI/Plater.cpp:3654 +#: src/slic3r/GUI/Plater.cpp:3684 msgid "Please select the file to reload" msgstr "Selecteer het bestand om te herladen" -#: src/slic3r/GUI/Plater.cpp:3685 src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:3715 src/slic3r/GUI/Plater.cpp:5355 +#: src/slic3r/GUI/Plater.cpp:5365 msgid "The selected file" msgstr "Het geselecteerde bestand" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "differs from the original file" msgstr "verschilt ten opzichte van het originele bestand" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "Do you want to replace it" msgstr "Wilt u het vervangen" -#: src/slic3r/GUI/Plater.cpp:3703 src/slic3r/GUI/Plater.cpp:3709 +#: src/slic3r/GUI/Plater.cpp:3736 src/slic3r/GUI/Plater.cpp:3742 msgid "Reload from:" msgstr "Herladen van:" -#: src/slic3r/GUI/Plater.cpp:3812 +#: src/slic3r/GUI/Plater.cpp:3864 msgid "Unable to reload:" msgstr "Niet in staat om te herladen:" -#: src/slic3r/GUI/Plater.cpp:3817 +#: src/slic3r/GUI/Plater.cpp:3869 msgid "Error during reload" msgstr "Fout tijdens herladen" -#: src/slic3r/GUI/Plater.cpp:3835 +#: src/slic3r/GUI/Plater.cpp:3887 msgid "Reload all from disk" msgstr "Herlaad alles van schijf" -#: src/slic3r/GUI/Plater.cpp:4130 +#: src/slic3r/GUI/Plater.cpp:4191 msgid "There are active warnings concerning sliced models:" msgstr "Er zijn actieve waarschuwingen wat betreft de slice:" -#: src/slic3r/GUI/Plater.cpp:4141 +#: src/slic3r/GUI/Plater.cpp:4202 msgid "generated warnings" msgstr "gegeven waarschuwingen" -#: src/slic3r/GUI/Plater.cpp:4472 +#: src/slic3r/GUI/Plater.cpp:4554 msgid "3D editor view" msgstr "3D-bewerkingsweergave" -#: src/slic3r/GUI/Plater.cpp:4893 +#: src/slic3r/GUI/Plater.cpp:4980 msgid "Undo / Redo is processing" msgstr "Ongedaan maken / opnieuw doen wordt verwerkt" -#: src/slic3r/GUI/Plater.cpp:4895 +#: src/slic3r/GUI/Plater.cpp:4982 #, boost-format msgid "" "Switching the printer technology from %1% to %2%.\n" @@ -7299,21 +8686,21 @@ msgstr "" "Sommige %1% presets zijn aangepast. Deze gaan verloren bij het wijzigen van " "het soort printer." -#: src/slic3r/GUI/Plater.cpp:5092 +#: src/slic3r/GUI/Plater.cpp:5184 msgid "Creating a new project while the current project is modified." msgstr "Een nieuw project aanmaken terwijl het huidige project is aangepast." -#: src/slic3r/GUI/Plater.cpp:5095 +#: src/slic3r/GUI/Plater.cpp:5187 msgid "Creating a new project while some presets are modified." msgstr "Een nieuw project aanmaken terwijl sommige presets zijn aangepast." -#: src/slic3r/GUI/Plater.cpp:5096 +#: src/slic3r/GUI/Plater.cpp:5188 msgid "You can keep presets modifications to the new project or discard them" msgstr "" "U kunt de aanpassingen in de preset behouden bij het nieuwe project, of deze " "verwijderen" -#: src/slic3r/GUI/Plater.cpp:5097 +#: src/slic3r/GUI/Plater.cpp:5189 msgid "" "You can keep presets modifications to the new project, discard them or save " "changes as new presets.\n" @@ -7324,126 +8711,173 @@ msgstr "" "Let op dat als de wijzigingen worden opgeslagen, deze niet bewaard worden in " "het nieuwe project" -#: src/slic3r/GUI/Plater.cpp:5103 +#: src/slic3r/GUI/Plater.cpp:5194 msgid "Creating a new project" msgstr "Maak een nieuw project aan" -#: src/slic3r/GUI/Plater.cpp:5137 +#: src/slic3r/GUI/Plater.cpp:5228 msgid "Load Project" msgstr "Laad project" -#: src/slic3r/GUI/Plater.cpp:5167 src/slic3r/GUI/Plater.cpp:5432 +#: src/slic3r/GUI/Plater.cpp:5258 msgid "Import Object" msgstr "Importeer object" -#: src/slic3r/GUI/Plater.cpp:5171 +#: src/slic3r/GUI/Plater.cpp:5262 msgid "Import Objects" msgstr "Importeer objecten" -#: src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:5291 +msgid "Import SLA archive" +msgstr "Importeer SLA-archief" + +#: src/slic3r/GUI/Plater.cpp:5355 src/slic3r/GUI/Plater.cpp:5365 msgid "does not contain valid gcode." msgstr "bevat geen geldige G-code." -#: src/slic3r/GUI/Plater.cpp:5244 +#: src/slic3r/GUI/Plater.cpp:5356 src/slic3r/GUI/Plater.cpp:5366 msgid "Error while loading .gcode file" -msgstr "Probleem bij het laden van het gcode-bestand" +msgstr "Probleem bij het laden van het .gcode-bestand" + +#: src/slic3r/GUI/Plater.cpp:5433 +#, c-format, boost-format +msgid "%s - Multiple projects file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 +msgid "There are several files being loaded, including Project files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 src/slic3r/GUI/Plater.cpp:5446 +msgid "Select an action to apply to all files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5446 +msgid "There are several files being loaded." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5448 src/slic3r/GUI/Plater.cpp:5842 +msgid "Action" +msgstr "Actie" + +#: src/slic3r/GUI/Plater.cpp:5469 +msgid "Import geometry" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5482 src/slic3r/GUI/Plater.cpp:5834 +msgid "Start new PrusaSlicer instance" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5496 +msgid "Select one to load as project" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5507 +msgid "Select one to load config only" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5609 +#, boost-format +msgid "Failed to unzip file to %1%: %2% " +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5618 +#, boost-format +msgid "Failed to find unzipped file at %1%. Unzipping of file has failed." +msgstr "" -#: src/slic3r/GUI/Plater.cpp:5297 +#: src/slic3r/GUI/Plater.cpp:5821 #, c-format, boost-format -msgid "%s - Drop project file" -msgstr "%s - Plaats projectbestand" +msgid "%s - Load project file" +msgstr "" -#: src/slic3r/GUI/Plater.cpp:5304 +#: src/slic3r/GUI/Plater.cpp:5830 msgid "Open as project" msgstr "Open als project" -#: src/slic3r/GUI/Plater.cpp:5305 +#: src/slic3r/GUI/Plater.cpp:5831 msgid "Import geometry only" msgstr "Importeer alleen het model" -#: src/slic3r/GUI/Plater.cpp:5306 +#: src/slic3r/GUI/Plater.cpp:5832 msgid "Import config only" msgstr "Importeer alleen de configuratie" -#: src/slic3r/GUI/Plater.cpp:5309 +#: src/slic3r/GUI/Plater.cpp:5837 msgid "Select an action to apply to the file" msgstr "Selecteer een commando om toe te passen op het bestand" -#: src/slic3r/GUI/Plater.cpp:5314 -msgid "Action" -msgstr "Commando" - -#: src/slic3r/GUI/Plater.cpp:5330 +#: src/slic3r/GUI/Plater.cpp:5858 msgid "Don't show again" msgstr "Laat niet meer zien" -#: src/slic3r/GUI/Plater.cpp:5371 +#: src/slic3r/GUI/Plater.cpp:5899 msgid "You can open only one .gcode file at a time." -msgstr "Je kunt maar één gcode-bestand tegelijk openen." +msgstr "Je kunt maar één .gcode-bestand tegelijk openen." -#: src/slic3r/GUI/Plater.cpp:5372 +#: src/slic3r/GUI/Plater.cpp:5900 msgid "Drag and drop G-code file" msgstr "Versleep en plaats G-code-bestand" -#: src/slic3r/GUI/Plater.cpp:5454 +#: src/slic3r/GUI/Plater.cpp:5992 msgid "Load File" msgstr "Laad bestand" -#: src/slic3r/GUI/Plater.cpp:5459 +#: src/slic3r/GUI/Plater.cpp:5997 msgid "Load Files" msgstr "Laad bestanden" -#: src/slic3r/GUI/Plater.cpp:5509 +#: src/slic3r/GUI/Plater.cpp:6047 msgid "All objects will be removed, continue?" msgstr "Alle objecten worden verwijderd. Doorgaan?" -#: src/slic3r/GUI/Plater.cpp:5520 +#: src/slic3r/GUI/Plater.cpp:6058 msgid "Delete Selected Objects" msgstr "Verwijder geselecteerde objecten" -#: src/slic3r/GUI/Plater.cpp:5529 +#: src/slic3r/GUI/Plater.cpp:6067 msgid "Increase Instances" msgstr "Verhoog aantal instanties" -#: src/slic3r/GUI/Plater.cpp:5563 +#: src/slic3r/GUI/Plater.cpp:6109 msgid "Decrease Instances" msgstr "Verlaag aantal instanties" -#: src/slic3r/GUI/Plater.cpp:5614 +#: src/slic3r/GUI/Plater.cpp:6167 msgid "Enter the number of copies:" msgstr "Voer het aantal kopieën in:" -#: src/slic3r/GUI/Plater.cpp:5615 +#: src/slic3r/GUI/Plater.cpp:6168 msgid "Copies of the selected object" msgstr "Kopieën van het geselecteerde object" -#: src/slic3r/GUI/Plater.cpp:5619 +#: src/slic3r/GUI/Plater.cpp:6171 #, c-format, boost-format msgid "Set numbers of copies to %d" msgstr "Stel aantal kopieën in voor %d" -#: src/slic3r/GUI/Plater.cpp:5697 -msgid "Cut by Plane" -msgstr "Snij met behulp van vlak" +#: src/slic3r/GUI/Plater.cpp:6187 +msgid "Fill bed" +msgstr "Vul het bed" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save G-code file as:" -msgstr "G-code-bestand opslaan als:" +msgstr ".gcode-bestand opslaan als:" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save SL1 / SL1S file as:" msgstr "SL1 / SL1S bestand opslaan als:" -#: src/slic3r/GUI/Plater.cpp:5766 +#: src/slic3r/GUI/Plater.cpp:6336 msgid "The provided file name is not valid." msgstr "De gegeven naam is niet geldig." -#: src/slic3r/GUI/Plater.cpp:5767 +#: src/slic3r/GUI/Plater.cpp:6337 msgid "The following characters are not allowed by a FAT file system:" msgstr "" "De volgende karakters worden niet toegestaan in een FAT-bestandssysteem:" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "" "The plater is empty.\n" "Do you want to save the project?" @@ -7451,38 +8885,38 @@ msgstr "" "Het bed is leeg.\n" "Wilt u toch het project opslaan?" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "Save project" msgstr "Project opslaan" -#: src/slic3r/GUI/Plater.cpp:6543 +#: src/slic3r/GUI/Plater.cpp:6766 +msgid "Is the printer ready? Is the print sheet in place, empty and clean?" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:6766 src/slic3r/GUI/PrintHostDialogs.cpp:132 +msgid "Upload and Print" +msgstr "Upload en print" + +#: src/slic3r/GUI/Plater.cpp:7161 msgid "Export" msgstr "Exporteer" -#: src/slic3r/GUI/Plater.cpp:6575 -msgid "" -"Custom supports, seams and multimaterial painting were removed after " -"repairing the mesh." -msgstr "" -"Aangepaste supports, naden en multi-material schilderingen zijn verwijderd " -"bij het repareren van de mesh." - -#: src/slic3r/GUI/Plater.cpp:6689 +#: src/slic3r/GUI/Plater.cpp:7306 msgid "Paste From Clipboard" msgstr "Plak van klembord" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2290 -#: src/slic3r/GUI/Tab.cpp:2517 src/slic3r/GUI/Tab.cpp:2624 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Preferences.cpp:240 src/slic3r/GUI/Tab.cpp:2274 +#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2617 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "General" msgstr "Algemeen" -#: src/slic3r/GUI/Preferences.cpp:121 +#: src/slic3r/GUI/Preferences.cpp:258 msgid "Remember output directory" msgstr "Onthoud de opslaglocatie" -#: src/slic3r/GUI/Preferences.cpp:123 +#: src/slic3r/GUI/Preferences.cpp:259 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." @@ -7490,11 +8924,11 @@ msgstr "" "Als dit aan staat zal PrusaSlicer de opslaglocatie gebruiken in plaats van " "de originele locatie." -#: src/slic3r/GUI/Preferences.cpp:129 +#: src/slic3r/GUI/Preferences.cpp:263 msgid "Auto-center parts" msgstr "Centreer onderdelen automatisch" -#: src/slic3r/GUI/Preferences.cpp:131 +#: src/slic3r/GUI/Preferences.cpp:264 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." @@ -7502,11 +8936,11 @@ msgstr "" "Als dit aan staat zal PrusaSlicer objecten automatisch centreren in het " "midden." -#: src/slic3r/GUI/Preferences.cpp:137 +#: src/slic3r/GUI/Preferences.cpp:268 msgid "Background processing" msgstr "Slicen op de achtergrond" -#: src/slic3r/GUI/Preferences.cpp:139 +#: src/slic3r/GUI/Preferences.cpp:269 msgid "" "If this is enabled, Slic3r will pre-process objects as soon as they're " "loaded in order to save time when exporting G-code." @@ -7514,11 +8948,23 @@ msgstr "" "Als dit aanstaat zal PrusaSlicer objecten op de achtergrond slicen om tijd " "te besparen bij het exporteren van de G-code." -#: src/slic3r/GUI/Preferences.cpp:148 +#: src/slic3r/GUI/Preferences.cpp:274 +msgid "Alert when supports needed" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:275 +msgid "" +"If this is enabled, Slic3r will raise alerts when it detects issues in the " +"sliced object, that can be resolved with supports (and brim). Examples of " +"such issues are floating object parts, unsupported extrusions and low bed " +"adhesion." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:285 msgid "Export sources full pathnames to 3mf and amf" -msgstr "Exporteer de volledige padnamen naar 3MF- en AMF-bestanden" +msgstr "Exporteer de volledige padnamen naar .3MF- en .AMF-bestanden" -#: src/slic3r/GUI/Preferences.cpp:150 +#: src/slic3r/GUI/Preferences.cpp:286 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked." @@ -7526,19 +8972,19 @@ msgstr "" "Als dit is ingeschakeld is het 'herladen van de schijf'-commando toegestaan " "om automatisch bestanden te vinden en laden als deze worden aangeroepen." -#: src/slic3r/GUI/Preferences.cpp:159 +#: src/slic3r/GUI/Preferences.cpp:293 msgid "If enabled, sets PrusaSlicer as default application to open .3mf files." msgstr "" -"Als dit aanstaat wordt PrusaSlicer als standaardprogramma ingesteld om 3MF-" +"Als dit aanstaat wordt PrusaSlicer als standaardprogramma ingesteld om .3MF-" "bestanden te openen." -#: src/slic3r/GUI/Preferences.cpp:166 +#: src/slic3r/GUI/Preferences.cpp:298 msgid "If enabled, sets PrusaSlicer as default application to open .stl files." msgstr "" -"Als dit aanstaat wordt PrusaSlicer als standaardprogramma ingesteld om STL-" +"Als dit aanstaat wordt PrusaSlicer als standaardprogramma ingesteld om .STL-" "bestanden te openen." -#: src/slic3r/GUI/Preferences.cpp:177 +#: src/slic3r/GUI/Preferences.cpp:307 msgid "" "If enabled, Slic3r downloads updates of built-in system presets in the " "background. These updates are downloaded into a separate temporary location. " @@ -7550,11 +8996,11 @@ msgstr "" "locatie. Als een nieuwe preset beschikbaar komt, zal dit gemeld worden bij " "de eerstvolgende keer opstarten." -#: src/slic3r/GUI/Preferences.cpp:182 +#: src/slic3r/GUI/Preferences.cpp:312 msgid "Suppress \" - default - \" presets" msgstr "Verberg standaardpresets" -#: src/slic3r/GUI/Preferences.cpp:184 +#: src/slic3r/GUI/Preferences.cpp:313 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." @@ -7562,24 +9008,45 @@ msgstr "" "Verberg standaardpresets bij de print-, filament- en printerpresets als er " "andere geldige presets beschikbaar zijn." -#: src/slic3r/GUI/Preferences.cpp:190 +#: src/slic3r/GUI/Preferences.cpp:317 +msgid "Suppress \" Template \" filament presets" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:318 +msgid "" +"Suppress \" Template \" filament presets in configuration wizard and sidebar " +"visibility." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:322 msgid "Show incompatible print and filament presets" -msgstr "Toon niet geschikte print- en filamentpresets" +msgstr "Toon niet compatibele print- en filamentpresets" -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:323 msgid "" "When checked, the print and filament presets are shown in the preset editor " "even if they are marked as incompatible with the active printer" msgstr "" "Als dit aan staat worden de print- en filamentpresets getoond in de presets-" -"editor, zelfs als ze als niet geschikt voor de actieve printer zijn " +"editor, zelfs als ze als niet compatibel met de actieve printer zijn " "gemarkeerd" -#: src/slic3r/GUI/Preferences.cpp:200 +#: src/slic3r/GUI/Preferences.cpp:331 +msgid "Show load project dialog" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:332 +msgid "" +"When checked, whenever dragging and dropping a project file on the " +"application or open it from a browser, shows a dialog asking to select the " +"action to take on the file to load." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:335 msgid "Show drop project dialog" msgstr "Toon venster bij plaatsen project" -#: src/slic3r/GUI/Preferences.cpp:202 +#: src/slic3r/GUI/Preferences.cpp:336 msgid "" "When checked, whenever dragging and dropping a project file on the " "application, shows a dialog asking to select the action to take on the file " @@ -7589,11 +9056,11 @@ msgstr "" "een venster getoond met de vraag wat gedaan moet worden met het te laden " "bestand." -#: src/slic3r/GUI/Preferences.cpp:208 src/slic3r/GUI/Preferences.cpp:212 +#: src/slic3r/GUI/Preferences.cpp:342 src/slic3r/GUI/Preferences.cpp:346 msgid "Allow just a single PrusaSlicer instance" msgstr "Sta één PrusaSlicer-instantie toe" -#: src/slic3r/GUI/Preferences.cpp:210 +#: src/slic3r/GUI/Preferences.cpp:343 msgid "" "On OSX there is always only one instance of app running by default. However " "it is allowed to run multiple instances of same app from the command line. " @@ -7604,7 +9071,7 @@ msgstr "" "commandoprompt. In zulke gevallen geldt deze instelling slechts voor één " "instantie." -#: src/slic3r/GUI/Preferences.cpp:214 +#: src/slic3r/GUI/Preferences.cpp:347 msgid "" "If this is enabled, when starting PrusaSlicer and another instance of the " "same PrusaSlicer is already running, that instance will be reactivated " @@ -7613,52 +9080,68 @@ msgstr "" "Als dit is ingeschakeld zal PrusaSlicer een andere instantie van PrusaSlicer " "openen als die wordt gestart." -#: src/slic3r/GUI/Preferences.cpp:224 +#: src/slic3r/GUI/Preferences.cpp:355 msgid "" "Always ask for unsaved changes in project, when: \n" "- Closing PrusaSlicer,\n" "- Loading or creating a new project" msgstr "" +"Vraag altijd naar niet-opgeslagen wijzigingen in het project als:\n" +"- PrusaSlicer afgesloten wordt,\n" +"- Een nieuw project wordt geladen of aangemaakt" -#: src/slic3r/GUI/Preferences.cpp:233 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:897 +#: src/slic3r/GUI/Preferences.cpp:363 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:925 msgid "" "Ask to save unsaved changes in presets when closing the application or when " "loading a new project" msgstr "" +"Vraag om niet-opgeslagen wijziging op te slaan in presets bij het sluiten " +"van het programma of het laden van een nieuw project" -#: src/slic3r/GUI/Preferences.cpp:235 +#: src/slic3r/GUI/Preferences.cpp:364 msgid "" "Always ask for unsaved changes in presets, when: \n" "- Closing PrusaSlicer while some presets are modified,\n" "- Loading a new project while some presets are modified" msgstr "" +"Vraag altijd naar niet-opgeslagen wijzigingen in presets als:\n" +"- PrusaSlicer afgesloten wordt terwijl presets zijn gewijzigd,\n" +"- Een nieuw project wordt geladen terwijl sommige presets zijn gewijzigd" -#: src/slic3r/GUI/Preferences.cpp:242 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:896 +#: src/slic3r/GUI/Preferences.cpp:370 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:924 msgid "Ask for unsaved changes in presets when selecting new preset" msgstr "" +"Vraag naar niet-opgeslagen wijzigingen in presets bij het selecteren van een " +"nieuwe preset" -#: src/slic3r/GUI/Preferences.cpp:244 +#: src/slic3r/GUI/Preferences.cpp:371 msgid "" "Always ask for unsaved changes in presets when selecting new preset or " "resetting a preset" msgstr "" +"Vraag altijd naar niet-opgeslagen wijzigingen in presets bij het resetten " +"van een preset of het selecteren van een nieuwe preset" -#: src/slic3r/GUI/Preferences.cpp:249 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 +#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:923 msgid "Ask for unsaved changes in presets when creating new project" msgstr "" +"Vraag naar niet-opgeslagen wijzigingen in presets bij het aanmaken van een " +"nieuw project" -#: src/slic3r/GUI/Preferences.cpp:251 +#: src/slic3r/GUI/Preferences.cpp:376 msgid "Always ask for unsaved changes in presets when creating new project" msgstr "" +"Vraag altijd naar niet-opgeslagen wijzigingen in presets bij het aanmaken " +"van een new project" -#: src/slic3r/GUI/Preferences.cpp:258 +#: src/slic3r/GUI/Preferences.cpp:382 msgid "Associate .gcode files to PrusaSlicer G-code Viewer" msgstr "Open .gcode-bestanden met de PrusaSlicer G-code weergave" -#: src/slic3r/GUI/Preferences.cpp:260 +#: src/slic3r/GUI/Preferences.cpp:383 msgid "" "If enabled, sets PrusaSlicer G-code Viewer as default application to open ." "gcode files." @@ -7666,43 +9149,45 @@ msgstr "" "Als dit aanstaat wordt PrusaSlicer G-code Viewer als standaardprogramma " "ingesteld om .gcode-bestanden te openen." -#: src/slic3r/GUI/Preferences.cpp:268 +#: src/slic3r/GUI/Preferences.cpp:390 msgid "Use Retina resolution for the 3D scene" -msgstr "Gebruik hoge resolutie voor de 3D-scène" +msgstr "Gebruik hoge resolutie voor de modelweergave" -#: src/slic3r/GUI/Preferences.cpp:270 +#: src/slic3r/GUI/Preferences.cpp:391 msgid "" "If enabled, the 3D scene will be rendered in Retina resolution. If you are " "experiencing 3D performance problems, disabling this option may help." msgstr "" -"Als dit is ingeschakeld zal de 3D-scène worden gerenderd in hoge resolutie. " -"Als u problemen ondervindt met de prestaties kan het uitschakelen van deze " -"optie mogelijk helpen." +"Als dit is ingeschakeld zal de modelweergave worden gerenderd in hoge " +"resolutie. Als u problemen ondervindt met de prestaties kan het uitschakelen " +"van deze optie mogelijk helpen." -#: src/slic3r/GUI/Preferences.cpp:280 src/slic3r/GUI/Preferences.cpp:282 +#: src/slic3r/GUI/Preferences.cpp:400 src/slic3r/GUI/Preferences.cpp:401 msgid "Show splash screen" msgstr "Toon startscherm" -#: src/slic3r/GUI/Preferences.cpp:289 +#: src/slic3r/GUI/Preferences.cpp:406 msgid "If enabled, PrusaSlicer will be open at the position it was closed" msgstr "" +"Als dit is ingeschakeld zal PrusaSlicer openen op de positie waarop die is " +"afgesloten" -#: src/slic3r/GUI/Preferences.cpp:295 +#: src/slic3r/GUI/Preferences.cpp:411 msgid "Clear Undo / Redo stack on new project" msgstr "Leeg lijst met ongedaan maken / opnieuw doen bij nieuwe projecten" -#: src/slic3r/GUI/Preferences.cpp:297 +#: src/slic3r/GUI/Preferences.cpp:412 msgid "" "Clear Undo / Redo stack on new project or when an existing project is loaded." msgstr "" "Leeg lijst met ongedaan maken / opnieuw doen bij nieuwe projecten of wanneer " "een bestaand project is geladen." -#: src/slic3r/GUI/Preferences.cpp:303 +#: src/slic3r/GUI/Preferences.cpp:417 msgid "Enable support for legacy 3DConnexion devices" msgstr "Sta support voor oudere 3DConnexion-apparaten toe" -#: src/slic3r/GUI/Preferences.cpp:305 +#: src/slic3r/GUI/Preferences.cpp:418 msgid "" "If enabled, the legacy 3DConnexion devices settings dialog is available by " "pressing CTRL+M" @@ -7710,126 +9195,137 @@ msgstr "" "Als dit aanstaat is de oudere 3DConnexion-apparaten-instellingenvenster " "beschikbaar door te drukken op CTRL+M" -#: src/slic3r/GUI/Preferences.cpp:314 +#: src/slic3r/GUI/Preferences.cpp:425 msgid "Camera" msgstr "Camera" -#: src/slic3r/GUI/Preferences.cpp:319 +#: src/slic3r/GUI/Preferences.cpp:435 msgid "Use perspective camera" msgstr "Gebruik perspectiefweergave" -#: src/slic3r/GUI/Preferences.cpp:321 +#: src/slic3r/GUI/Preferences.cpp:436 msgid "" "If enabled, use perspective camera. If not enabled, use orthographic camera." msgstr "" "Als dit is ingeschakeld zal de weergave op perspectief worden gezet. Anders " "wordt een orthografische weergave gebruikt." -#: src/slic3r/GUI/Preferences.cpp:326 +#: src/slic3r/GUI/Preferences.cpp:440 msgid "Use free camera" msgstr "Gebruik vrij beweegbare camera" -#: src/slic3r/GUI/Preferences.cpp:328 +#: src/slic3r/GUI/Preferences.cpp:441 msgid "If enabled, use free camera. If not enabled, use constrained camera." msgstr "" "Als dit is ingeschakeld wordt de vrij beweegbare camera gebruikt, anders een " "vaste camera." -#: src/slic3r/GUI/Preferences.cpp:333 +#: src/slic3r/GUI/Preferences.cpp:445 msgid "Reverse direction of zoom with mouse wheel" msgstr "Zoomrichting van scrollwieltje omkeren" -#: src/slic3r/GUI/Preferences.cpp:335 +#: src/slic3r/GUI/Preferences.cpp:446 msgid "If enabled, reverses the direction of zoom with mouse wheel" msgstr "Als dit aanstaat wordt de scrollrichting de andere kant op ingesteld" -#: src/slic3r/GUI/Preferences.cpp:343 +#: src/slic3r/GUI/Preferences.cpp:452 msgid "GUI" msgstr "GUI" -#: src/slic3r/GUI/Preferences.cpp:366 +#: src/slic3r/GUI/Preferences.cpp:492 msgid "Sequential slider applied only to top layer" msgstr "Opeenvolgende schuif alleen toegepast op toplaag" -#: src/slic3r/GUI/Preferences.cpp:368 +#: src/slic3r/GUI/Preferences.cpp:493 msgid "" "If enabled, changes made using the sequential slider, in preview, apply only " -"to gcode top layer. If disabled, changes made using the sequential slider, " -"in preview, apply to the whole gcode." +"to gcode top layer.If disabled, changes made using the sequential slider, in " +"preview, apply to the whole gcode." msgstr "" -"Sta toe om wijzigingen van de opeenvolgende schuif in de voorbeeldweergave " -"alleen toe te passen op de toplaag. Als dit uitstaat worden wijzigingen " -"toegepast op de hele G-code." -#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/Preferences.cpp:499 msgid "Show sidebar collapse/expand button" msgstr "Toon zijbalk in-/uitklappen-knop" -#: src/slic3r/GUI/Preferences.cpp:377 +#: src/slic3r/GUI/Preferences.cpp:500 msgid "" "If enabled, the button for the collapse sidebar will be appeared in top " "right corner of the 3D Scene" msgstr "" "Als dit is ingeschakeld zal de knop om de zijbalk in te klappen getoond " -"worden in de rechterbovenhoek van de 3D-bewerkingsweergave" +"worden in de rechterbovenhoek van de modelweergave" -#: src/slic3r/GUI/Preferences.cpp:384 -msgid "If enabled, PrusaSlicer will not open hyperlinks in your browser." -msgstr "" - -#: src/slic3r/GUI/Preferences.cpp:391 +#: src/slic3r/GUI/Preferences.cpp:511 msgid "Use colors for axes values in Manipulation panel" msgstr "Gebruik kleuren voor waarden voor assen in het bewerkingsmenu" -#: src/slic3r/GUI/Preferences.cpp:393 +#: src/slic3r/GUI/Preferences.cpp:512 msgid "" "If enabled, the axes names and axes values will be colorized according to " "the axes colors. If disabled, old UI will be used." msgstr "" -"Als dit aanstaat worden namen en waarden van assen gekleurd volgens de kleur " -"van de as. Als dit uitstaat wordt de oude interface gebruikt." +"Als dit is ingeschakeld worden namen en waarden van assen gekleurd volgens " +"de kleur van de as. Als dit uitstaat wordt de oude interface gebruikt." -#: src/slic3r/GUI/Preferences.cpp:399 +#: src/slic3r/GUI/Preferences.cpp:517 msgid "Order object volumes by types" msgstr "Sorteer objectvolumes op type" -#: src/slic3r/GUI/Preferences.cpp:401 +#: src/slic3r/GUI/Preferences.cpp:518 msgid "" "If enabled, volumes will be always ordered inside the object. Correct order " "is Model Part, Negative Volume, Modifier, Support Blocker and Support " "Enforcer. If disabled, you can reorder Model Parts, Negative Volumes and " "Modifiers. But one of the model parts have to be on the first place." msgstr "" -"Als dit aanstaat worden volumes altijd gesorteerd binnen een object. De " -"juiste volgorde is Model - Negatieve volumes - Modificators - " +"Als dit is ingeschakeld worden volumes altijd gesorteerd binnen een object. " +"De juiste volgorde is Model - Negatieve volumes - Modificators - " "Supportblokkering - Supportforcering. Als dit uitstaat kan u de onderdelen " "zelf schikken. Een van de modellen moet op de eerste plaats staan." -#: src/slic3r/GUI/Preferences.cpp:408 +#: src/slic3r/GUI/Preferences.cpp:523 +msgid "Show non-manifold edges" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:524 +msgid "If enabled, shows non-manifold edges." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:528 +msgid "Allow automatically color change" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:529 +msgid "" +"If enabled, related notification will be shown, when sliced object looks " +"like a logo or a sign." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:534 msgid "Set settings tabs as menu items (experimental)" msgstr "Stel instellingentabs in als menu-onderdelen (experimenteel)" -#: src/slic3r/GUI/Preferences.cpp:410 +#: src/slic3r/GUI/Preferences.cpp:535 msgid "" "If enabled, Settings Tabs will be placed as menu items. If disabled, old UI " "will be used." msgstr "" -"Als dit aanstaat worden instellingentabs geplaatst als menu-onderdelen. Als " -"dit uitstaat wordt de oude interface gebruikt." +"Als dit is ingeschakeld worden instellingentabs geplaatst als menu-" +"onderdelen. Als dit uitstaat wordt de oude interface gebruikt." -#: src/slic3r/GUI/Preferences.cpp:419 +#: src/slic3r/GUI/Preferences.cpp:542 msgid "Show \"Tip of the day\" notification after start" msgstr "Toon \"Tip van de dag\" melding bij het starten" -#: src/slic3r/GUI/Preferences.cpp:421 +#: src/slic3r/GUI/Preferences.cpp:543 msgid "If enabled, useful hints are displayed at startup." -msgstr "Als dit aanstaat worden handige tips getoond bij het starten." +msgstr "Als dit is ingeschakeld worden handige tips getoond bij het starten." -#: src/slic3r/GUI/Preferences.cpp:427 +#: src/slic3r/GUI/Preferences.cpp:547 msgid "Notify about new releases" msgstr "Notificaties over nieuwe versies" -#: src/slic3r/GUI/Preferences.cpp:429 +#: src/slic3r/GUI/Preferences.cpp:548 msgid "" "You will be notified about new release after startup acordingly: All = " "Regular release and alpha / beta releases. Release only = regular release." @@ -7838,65 +9334,79 @@ msgstr "" "reguliere versies en alpha/beta-versies. Standaardversies = alleen reguliere " "versies." -#: src/slic3r/GUI/Preferences.cpp:435 +#: src/slic3r/GUI/Preferences.cpp:551 msgid "Release only" msgstr "Alleen standaardversies" -#: src/slic3r/GUI/Preferences.cpp:444 +#: src/slic3r/GUI/Preferences.cpp:558 msgid "Use custom size for toolbar icons" msgstr "Aangepaste pictogramgrootte in de modelweergave" -#: src/slic3r/GUI/Preferences.cpp:446 +#: src/slic3r/GUI/Preferences.cpp:559 msgid "If enabled, you can change size of toolbar icons manually." msgstr "" "Hiermee kan de grootte van werkbalkpictogrammen handmatig ingesteld worden." -#: src/slic3r/GUI/Preferences.cpp:471 +#: src/slic3r/GUI/Preferences.cpp:577 src/slic3r/GUI/Tab.cpp:1659 +msgid "Other" +msgstr "Overige" + +#: src/slic3r/GUI/Preferences.cpp:594 +msgid "If enabled, PrusaSlicer will not open a hyperlinks in your browser." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:600 +msgid "Allow downloads from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:601 +msgid "If enabled, PrusaSlicer will be allowed to download from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:610 msgid "Render" msgstr "Render" -#: src/slic3r/GUI/Preferences.cpp:476 +#: src/slic3r/GUI/Preferences.cpp:620 msgid "Use environment map" msgstr "Gebruik omgevingskaart" -#: src/slic3r/GUI/Preferences.cpp:478 +#: src/slic3r/GUI/Preferences.cpp:621 msgid "If enabled, renders object using the environment map." -msgstr "Als dit aanstaat worden objecten gerenderd met de omgevingskaart." +msgstr "" +"Als dit is ingeschakeld worden objecten gerenderd met de omgevingskaart." -#: src/slic3r/GUI/Preferences.cpp:491 +#: src/slic3r/GUI/Preferences.cpp:629 msgid "Dark mode (experimental)" msgstr "Donkere modus (experimenteel)" -#: src/slic3r/GUI/Preferences.cpp:496 +#: src/slic3r/GUI/Preferences.cpp:639 msgid "Enable dark mode" msgstr "Gebruik donkere modus" -#: src/slic3r/GUI/Preferences.cpp:498 +#: src/slic3r/GUI/Preferences.cpp:640 msgid "" "If enabled, UI will use Dark mode colors. If disabled, old UI will be used." msgstr "" -"Als dit aan staat worden kleuren van de donkere modus gebruikt. De oude " -"kleuren worden gebruikt als dit uit staat." +"Als dit is ingeschakeld worden kleuren van de donkere modus gebruikt. De " +"oude kleuren worden gebruikt als dit uit staat." -#: src/slic3r/GUI/Preferences.cpp:507 +#: src/slic3r/GUI/Preferences.cpp:647 msgid "Use system menu for application" msgstr "Gebruik systeemmenu voor programma" -#: src/slic3r/GUI/Preferences.cpp:509 +#: src/slic3r/GUI/Preferences.cpp:648 msgid "" "If enabled, application will use the standard Windows system menu,\n" -"but on some combination of display scales it can looks ugly. If disabled, " -"old UI will be used." +"but on some combination od display scales it can look ugly. If disabled, old " +"UI will be used." msgstr "" -"Als dit aan staat worden de standaard Windows-menukleuren gebruikt,\n" -"maar op sommige combinaties van displaygroottes kan die lelijk lijken. Als " -"dit uitstaat wordt de oude interface gebruikt." -#: src/slic3r/GUI/Preferences.cpp:578 +#: src/slic3r/GUI/Preferences.cpp:726 msgid "Changes for the critical options" msgstr "Aanpassingen voor de kritische opties" -#: src/slic3r/GUI/Preferences.cpp:580 +#: src/slic3r/GUI/Preferences.cpp:728 msgid "" "Changing some options will trigger application restart.\n" "You will lose the content of the plater." @@ -7904,109 +9414,122 @@ msgstr "" "Sommige opties aanpassen kan een herstart veroorzaken.\n" "U kunt de inhoud van het bed kwijtraken." -#: src/slic3r/GUI/Preferences.cpp:694 +#: src/slic3r/GUI/Preferences.cpp:921 msgid "Icon size in a respect to the default size" msgstr "Pictogramgrootte vergeleken met de originele grootte" -#: src/slic3r/GUI/Preferences.cpp:709 +#: src/slic3r/GUI/Preferences.cpp:936 msgid "Select toolbar icon size in respect to the default one." msgstr "Selecteer werkbalk-pictogramgrootte in verhouding tot de originele." -#: src/slic3r/GUI/Preferences.cpp:743 src/slic3r/GUI/Preferences.cpp:754 +#: src/slic3r/GUI/Preferences.cpp:972 +msgid "Layout Options" +msgstr "Layout-opties" + +#: src/slic3r/GUI/Preferences.cpp:981 msgid "Old regular layout with the tab bar" msgstr "Oude standaardlayout met de tabbladen" -#: src/slic3r/GUI/Preferences.cpp:744 +#: src/slic3r/GUI/Preferences.cpp:982 msgid "New layout, access via settings button in the top menu" msgstr "" "Nieuwe layout, krijg toegang tot de instellingen via de instellingenknop in " "het topmenu" -#: src/slic3r/GUI/Preferences.cpp:745 src/slic3r/GUI/Preferences.cpp:755 +#: src/slic3r/GUI/Preferences.cpp:983 msgid "Settings in non-modal window" msgstr "Instelling voor niet-modaal venster" -#: src/slic3r/GUI/Preferences.cpp:763 -msgid "Layout Options" -msgstr "Layout-opties" - -#: src/slic3r/GUI/Preferences.cpp:806 +#: src/slic3r/GUI/Preferences.cpp:1025 msgid "Text colors" msgstr "Tekstkleuren" -#: src/slic3r/GUI/PresetComboBoxes.cpp:249 -#: src/slic3r/GUI/PresetComboBoxes.cpp:287 -#: src/slic3r/GUI/PresetComboBoxes.cpp:794 -#: src/slic3r/GUI/PresetComboBoxes.cpp:849 -#: src/slic3r/GUI/PresetComboBoxes.cpp:989 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1033 +#: src/slic3r/GUI/Preferences.cpp:1049 +msgid "Mode markers" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:254 +#: src/slic3r/GUI/PresetComboBoxes.cpp:306 +#: src/slic3r/GUI/PresetComboBoxes.cpp:846 +#: src/slic3r/GUI/PresetComboBoxes.cpp:909 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1073 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1125 msgid "System presets" msgstr "Systeempresets" -#: src/slic3r/GUI/PresetComboBoxes.cpp:291 -#: src/slic3r/GUI/PresetComboBoxes.cpp:853 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1037 +#: src/slic3r/GUI/PresetComboBoxes.cpp:310 +#: src/slic3r/GUI/PresetComboBoxes.cpp:915 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1130 msgid "User presets" msgstr "Presets van de gebruiker" -#: src/slic3r/GUI/PresetComboBoxes.cpp:302 +#: src/slic3r/GUI/PresetComboBoxes.cpp:321 msgid "Incompatible presets" -msgstr "Ongeschikte presets" +msgstr "Niet compatibele presets" -#: src/slic3r/GUI/PresetComboBoxes.cpp:337 +#: src/slic3r/GUI/PresetComboBoxes.cpp:364 #, boost-format msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "Weet je zeker dat je \"%1%\"-printer wilt verwijderen?" -#: src/slic3r/GUI/PresetComboBoxes.cpp:340 +#: src/slic3r/GUI/PresetComboBoxes.cpp:366 msgid "Delete Physical Printer" msgstr "Verwijder fysieke printer" -#: src/slic3r/GUI/PresetComboBoxes.cpp:581 +#: src/slic3r/GUI/PresetComboBoxes.cpp:612 msgid "Click to edit preset" msgstr "Klik om de preset te wijzigen" -#: src/slic3r/GUI/PresetComboBoxes.cpp:697 -#: src/slic3r/GUI/PresetComboBoxes.cpp:737 +#: src/slic3r/GUI/PresetComboBoxes.cpp:740 +#: src/slic3r/GUI/PresetComboBoxes.cpp:788 msgid "Add/Remove presets" msgstr "Toevoegen/verwijderen van presets" -#: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:745 +#: src/slic3r/GUI/PresetComboBoxes.cpp:793 src/slic3r/GUI/Tab.cpp:3312 msgid "Add physical printer" msgstr "Voeg fysieke printer toe" -#: src/slic3r/GUI/PresetComboBoxes.cpp:716 +#: src/slic3r/GUI/PresetComboBoxes.cpp:759 msgid "Edit preset" msgstr "Bewerk preset" -#: src/slic3r/GUI/PresetComboBoxes.cpp:722 +#: src/slic3r/GUI/PresetComboBoxes.cpp:765 msgid "Change extruder color" msgstr "Verander extruderkleur" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:773 src/slic3r/GUI/Tab.cpp:3312 msgid "Edit physical printer" msgstr "Bewerk fysieke printer" -#: src/slic3r/GUI/PresetComboBoxes.cpp:733 +#: src/slic3r/GUI/PresetComboBoxes.cpp:779 +msgid "Open physical printer URL" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:784 msgid "Delete physical printer" msgstr "Verwijder fysieke printer" -#: src/slic3r/GUI/PresetComboBoxes.cpp:864 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1051 +#: src/slic3r/GUI/PresetComboBoxes.cpp:924 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1142 +msgid "Template presets" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:935 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1156 msgid "Physical printers" msgstr "Fysieke printers" -#: src/slic3r/GUI/PresetComboBoxes.cpp:888 +#: src/slic3r/GUI/PresetComboBoxes.cpp:959 msgid "Add/Remove filaments" msgstr "Verwijder of voeg filamenten toe" -#: src/slic3r/GUI/PresetComboBoxes.cpp:890 +#: src/slic3r/GUI/PresetComboBoxes.cpp:961 msgid "Add/Remove materials" msgstr "Verwijder of voeg materialen toe" -#: src/slic3r/GUI/PresetComboBoxes.cpp:892 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1075 +#: src/slic3r/GUI/PresetComboBoxes.cpp:963 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1180 msgid "Add/Remove printers" msgstr "Voeg toe/verwijder printers" @@ -8194,99 +9717,107 @@ msgstr "Minimale dikte van onderzijde is %1% mm." msgid "Bottom is open." msgstr "Onderzijde is open." -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Send G-Code to printer host" msgstr "Stuur G-code naar printerhost" -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Upload to Printer Host with the following filename:" msgstr "Upload naar printerhost met de volgende bestandsnaam:" -#: src/slic3r/GUI/PrintHostDialogs.cpp:51 +#: src/slic3r/GUI/PrintHostDialogs.cpp:55 msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "" "Gebruik schuine streepjes ( / ) als mapscheidingstekens als dat nodig is." -#: src/slic3r/GUI/PrintHostDialogs.cpp:60 +#: src/slic3r/GUI/PrintHostDialogs.cpp:64 msgid "Group" msgstr "Groep" -#: src/slic3r/GUI/PrintHostDialogs.cpp:84 +#: src/slic3r/GUI/PrintHostDialogs.cpp:74 +msgid "Upload to storage:" +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:83 +msgid "Upload to storage: " +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:105 #, c-format, boost-format msgid "Upload filename doesn't end with \"%s\". Do you wish to continue?" msgstr "Bestandsnaam eindigt niet op \"%s\". Wilt u doorgaan?" -#: src/slic3r/GUI/PrintHostDialogs.cpp:91 +#: src/slic3r/GUI/PrintHostDialogs.cpp:112 msgid "Upload" msgstr "Upload" -#: src/slic3r/GUI/PrintHostDialogs.cpp:101 -msgid "Upload and Print" -msgstr "Upload en print" +#: src/slic3r/GUI/PrintHostDialogs.cpp:122 +msgid "Upload to Queue" +msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:112 +#: src/slic3r/GUI/PrintHostDialogs.cpp:143 msgid "Upload and Simulate" msgstr "Uploaden en simuleren" -#: src/slic3r/GUI/PrintHostDialogs.cpp:247 +#: src/slic3r/GUI/PrintHostDialogs.cpp:298 msgid "ID" msgstr "ID" -#: src/slic3r/GUI/PrintHostDialogs.cpp:248 +#: src/slic3r/GUI/PrintHostDialogs.cpp:299 msgid "Progress" msgstr "Voortgang" -#: src/slic3r/GUI/PrintHostDialogs.cpp:249 +#: src/slic3r/GUI/PrintHostDialogs.cpp:300 msgid "Status" msgstr "Status" -#: src/slic3r/GUI/PrintHostDialogs.cpp:250 +#: src/slic3r/GUI/PrintHostDialogs.cpp:301 msgid "Host" msgstr "Host" -#: src/slic3r/GUI/PrintHostDialogs.cpp:251 +#: src/slic3r/GUI/PrintHostDialogs.cpp:302 msgctxt "OfFile" msgid "Size" msgstr "Grootte" -#: src/slic3r/GUI/PrintHostDialogs.cpp:252 +#: src/slic3r/GUI/PrintHostDialogs.cpp:303 msgid "Filename" msgstr "Bestandsnaam" -#: src/slic3r/GUI/PrintHostDialogs.cpp:253 -msgid "Error Message" -msgstr "Foutbericht" +#: src/slic3r/GUI/PrintHostDialogs.cpp:304 +msgid "Message" +msgstr "Bericht" -#: src/slic3r/GUI/PrintHostDialogs.cpp:256 +#: src/slic3r/GUI/PrintHostDialogs.cpp:308 msgid "Cancel selected" msgstr "Annuleren geselecteerd" -#: src/slic3r/GUI/PrintHostDialogs.cpp:258 +#: src/slic3r/GUI/PrintHostDialogs.cpp:310 msgid "Show error message" msgstr "Toon foutbericht" -#: src/slic3r/GUI/PrintHostDialogs.cpp:316 -#: src/slic3r/GUI/PrintHostDialogs.cpp:371 +#: src/slic3r/GUI/PrintHostDialogs.cpp:368 +#: src/slic3r/GUI/PrintHostDialogs.cpp:423 msgid "Enqueued" msgstr "In de wachtrij geplaatst" -#: src/slic3r/GUI/PrintHostDialogs.cpp:372 +#: src/slic3r/GUI/PrintHostDialogs.cpp:424 msgid "Uploading" msgstr "Uploaden" -#: src/slic3r/GUI/PrintHostDialogs.cpp:374 +#: src/slic3r/GUI/PrintHostDialogs.cpp:426 msgid "Cancelling" msgstr "Annuleren" -#: src/slic3r/GUI/PrintHostDialogs.cpp:375 +#: src/slic3r/GUI/PrintHostDialogs.cpp:427 msgid "Cancelled" msgstr "Geannuleerd" -#: src/slic3r/GUI/PrintHostDialogs.cpp:376 +#: src/slic3r/GUI/PrintHostDialogs.cpp:428 msgid "Completed" msgstr "Voltooid" -#: src/slic3r/GUI/PrintHostDialogs.cpp:424 +#: src/slic3r/GUI/PrintHostDialogs.cpp:476 msgid "Error uploading to print host:" msgstr "Fout bij het uploaden naar de printhost:" @@ -8294,13 +9825,13 @@ msgstr "Fout bij het uploaden naar de printhost:" msgid "NO RAMMING AT ALL" msgstr "Fout: geen ramming" -#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 -#: src/libslic3r/PrintConfig.cpp:955 src/libslic3r/PrintConfig.cpp:999 -#: src/libslic3r/PrintConfig.cpp:1014 src/libslic3r/PrintConfig.cpp:3297 -#: src/libslic3r/PrintConfig.cpp:3306 src/libslic3r/PrintConfig.cpp:3315 -#: src/libslic3r/PrintConfig.cpp:3456 src/libslic3r/PrintConfig.cpp:3464 -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3479 -#: src/libslic3r/PrintConfig.cpp:3487 src/libslic3r/PrintConfig.cpp:3495 +#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/libslic3r/PrintConfig.cpp:1044 src/libslic3r/PrintConfig.cpp:1088 +#: src/libslic3r/PrintConfig.cpp:1103 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3578 src/libslic3r/PrintConfig.cpp:3587 +#: src/libslic3r/PrintConfig.cpp:3733 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3749 src/libslic3r/PrintConfig.cpp:3756 +#: src/libslic3r/PrintConfig.cpp:3764 src/libslic3r/PrintConfig.cpp:3772 msgid "s" msgstr "s" @@ -8308,82 +9839,118 @@ msgstr "s" msgid "Volumetric speed" msgstr "Volumetrische snelheid" -#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:912 -#: src/libslic3r/PrintConfig.cpp:1824 +#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:1001 +#: src/libslic3r/PrintConfig.cpp:1861 msgid "mm³/s" msgstr "mm³/s" -#: src/slic3r/GUI/SavePresetDialog.cpp:57 +#: src/slic3r/GUI/SavePresetDialog.cpp:90 +#, c-format, boost-format +msgid "Rename %s to:" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:90 #, c-format, boost-format msgid "Save %s as:" msgstr "%s opslaan als:" -#: src/slic3r/GUI/SavePresetDialog.cpp:101 -#: src/slic3r/GUI/SavePresetDialog.cpp:109 +#: src/slic3r/GUI/SavePresetDialog.cpp:165 +#: src/slic3r/GUI/SavePresetDialog.cpp:173 msgid "The supplied name is not valid;" msgstr "De ingevoerde naam is niet geldig;" -#: src/slic3r/GUI/SavePresetDialog.cpp:110 +#: src/slic3r/GUI/SavePresetDialog.cpp:174 msgid "the following suffix is not allowed:" msgstr "het volgende achtervoegsel is niet toegestaan:" -#: src/slic3r/GUI/SavePresetDialog.cpp:116 +#: src/slic3r/GUI/SavePresetDialog.cpp:180 msgid "The supplied name is not available." msgstr "De ingevoerde naam is niet beschikbaar." -#: src/slic3r/GUI/SavePresetDialog.cpp:122 +#: src/slic3r/GUI/SavePresetDialog.cpp:186 +msgid "The supplied name is used for a system profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:187 msgid "Cannot overwrite a system profile." msgstr "Een systeemprofiel kan niet overschreven worden." -#: src/slic3r/GUI/SavePresetDialog.cpp:127 +#: src/slic3r/GUI/SavePresetDialog.cpp:192 +msgid "The supplied name is used for a external profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:193 msgid "Cannot overwrite an external profile." msgstr "Een extern profiel kan niet overschreven worden." -#: src/slic3r/GUI/SavePresetDialog.cpp:134 +#: src/slic3r/GUI/SavePresetDialog.cpp:203 +msgid "Save preset modifications to existing user profile" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:205 +msgid "Nothing changed" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:210 #, boost-format msgid "Preset with name \"%1%\" already exists." msgstr "Preset met de naam '%1%' bestaat al." -#: src/slic3r/GUI/SavePresetDialog.cpp:136 +#: src/slic3r/GUI/SavePresetDialog.cpp:212 #, boost-format msgid "" "Preset with name \"%1%\" already exists and is incompatible with selected " "printer." msgstr "" -"Preset met de naam \"%1%\" bestaat al en is incompatibel met de " +"Preset met de naam \"%1%\" bestaat al en is niet compatibel met de " "geselecteerde printer." -#: src/slic3r/GUI/SavePresetDialog.cpp:137 +#: src/slic3r/GUI/SavePresetDialog.cpp:213 msgid "Note: This preset will be replaced after saving" msgstr "Let op: deze preset wordt vervangen na het opslaan" -#: src/slic3r/GUI/SavePresetDialog.cpp:142 +#: src/slic3r/GUI/SavePresetDialog.cpp:219 msgid "The name cannot be empty." msgstr "De naam is ongeldig." -#: src/slic3r/GUI/SavePresetDialog.cpp:147 +#: src/slic3r/GUI/SavePresetDialog.cpp:230 +msgid "The name is too long." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:235 msgid "The name cannot start with space character." msgstr "De naam kan niet beginnen met een spatie." -#: src/slic3r/GUI/SavePresetDialog.cpp:152 +#: src/slic3r/GUI/SavePresetDialog.cpp:240 msgid "The name cannot end with space character." msgstr "De naam kan niet eindigen met een spatie." -#: src/slic3r/GUI/SavePresetDialog.cpp:157 +#: src/slic3r/GUI/SavePresetDialog.cpp:245 msgid "The name cannot be the same as a preset alias name." msgstr "De naam kan niet gelijk zijn als de presetnaam." -#: src/slic3r/GUI/SavePresetDialog.cpp:191 -#: src/slic3r/GUI/SavePresetDialog.cpp:197 +#: src/slic3r/GUI/SavePresetDialog.cpp:289 msgid "Save preset" msgstr "Preset opslaan" -#: src/slic3r/GUI/SavePresetDialog.cpp:221 +#: src/slic3r/GUI/SavePresetDialog.cpp:295 +msgid "Save presets" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:302 +msgid "Rename preset" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:327 msgctxt "PresetName" msgid "Copy" msgstr "Kopieer" -#: src/slic3r/GUI/SavePresetDialog.cpp:283 +#: src/slic3r/GUI/SavePresetDialog.cpp:347 +msgid "Save as profile derived from current printer only." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:407 #, boost-format msgid "" "You have selected physical printer \"%1%\" \n" @@ -8392,82 +9959,94 @@ msgstr "" "Je heb de fysieke printer \"%1%\" geselecteerd\n" "met gerelateerde printerpreset \"%2%\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:322 +#: src/slic3r/GUI/SavePresetDialog.cpp:446 #, boost-format msgid "What would you like to do with \"%1%\" preset after saving?" msgstr "Wat wil je doen met de preset \"%1%\" na het opslaan?" -#: src/slic3r/GUI/SavePresetDialog.cpp:325 +#: src/slic3r/GUI/SavePresetDialog.cpp:449 #, boost-format msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" msgstr "Verander \"%1%\" naar \"%2%\" voor deze fysieke printer \"%3%\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:326 +#: src/slic3r/GUI/SavePresetDialog.cpp:450 #, boost-format msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" msgstr "Voeg \"%1%\" als volgende preset toe aan de fysieke printer \"%2%\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:327 +#: src/slic3r/GUI/SavePresetDialog.cpp:451 #, boost-format msgid "Just switch to \"%1%\" preset" msgstr "Schakel naar de \"%1%\"-preset" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2652 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2645 msgid "Stealth" msgstr "Stille modus" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2646 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2639 msgid "Normal" msgstr "Normaal" -#: src/slic3r/GUI/Selection.cpp:168 +#: src/slic3r/GUI/Selection.cpp:180 msgid "Selection-Add" msgstr "Selectie - Voeg toe" -#: src/slic3r/GUI/Selection.cpp:209 +#: src/slic3r/GUI/Selection.cpp:221 msgid "Selection-Remove" msgstr "Selectie - Verwijder" -#: src/slic3r/GUI/Selection.cpp:241 +#: src/slic3r/GUI/Selection.cpp:253 msgid "Selection-Add Object" msgstr "Selectie - Voeg object toe" -#: src/slic3r/GUI/Selection.cpp:260 +#: src/slic3r/GUI/Selection.cpp:272 msgid "Selection-Remove Object" msgstr "Selectie - Verwijder object" -#: src/slic3r/GUI/Selection.cpp:278 +#: src/slic3r/GUI/Selection.cpp:290 msgid "Selection-Add Instance" msgstr "Selectie - Voeg instantie toe" -#: src/slic3r/GUI/Selection.cpp:297 +#: src/slic3r/GUI/Selection.cpp:309 msgid "Selection-Remove Instance" msgstr "Selectie - Verwijder instantie" -#: src/slic3r/GUI/Selection.cpp:394 +#: src/slic3r/GUI/Selection.cpp:406 msgid "Selection-Add All" msgstr "Selectie - Voeg alle toe" -#: src/slic3r/GUI/Selection.cpp:419 +#: src/slic3r/GUI/Selection.cpp:431 msgid "Selection-Remove All" msgstr "Selectie - Verwijder alle" -#: src/slic3r/GUI/Selection.cpp:950 +#: src/slic3r/GUI/Selection.cpp:1309 msgid "Scale To Fit" msgstr "Verschaal tot het past" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:114 +#: src/slic3r/GUI/Selection.cpp:1691 +msgid "" +"The currently manipulated object is tilted or contains tilted parts " +"(rotation angles are not multiples of 90°). Non-uniform scaling of tilted " +"objects is only possible in non-local coordinate systems, once the rotation " +"is embedded into the object coordinates." +msgstr "" + +#: src/slic3r/GUI/Selection.cpp:1694 +msgid "This operation is irreversible." +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:117 msgid "Data to send" msgstr "Data om te sturen" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:550 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:618 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:557 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:624 msgid "Send system info" msgstr "Stuur systeeminfo" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:581 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:587 #, boost-format msgid "" "This is the first time you are running %1%. We would like to ask you to send " @@ -8480,7 +10059,7 @@ msgstr "" "zullen u niet nogmaals vragen om dit te doen (tenzij u upgrade naar een " "volgende versie)." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:585 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:591 msgid "" "If we know your hardware, operating system, etc., it will greatly help us in " "development and prioritization, because we will be able to focus our effort " @@ -8488,13 +10067,13 @@ msgid "" msgstr "" "Als we uw hardware, besturingssysteem, etc. kennen, zal dit ons erg helpen " "bij de ontwikkeling en prioritering, omdat we dan beter weten waar de focus " -"ligt, en efficiënter de tijd besteden op onderdelen die veel tijd kosten." +"ligt, en efficiënter de tijd besteden op delen die veel tijd kosten." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:588 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:594 msgid "Is it safe?" msgstr "Is het veilig?" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:590 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:596 #, boost-format msgid "" "We do not send any personal information nor anything that would allow us to " @@ -8512,81 +10091,86 @@ msgstr "" "wat inhoudt dat u de broncode kunt bekijken om uzelf ervan te verzekeren hoe " "de communicatie is. Zie %1%." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:614 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:620 msgid "Show verbatim data that will be sent" msgstr "Toon de data die zal worden gestuurd" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:616 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:622 msgid "Ask me next time" msgstr "Vraag me volgende keer" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:617 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:623 msgid "Do not send anything" msgstr "Stuur niets" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:703 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:709 msgid "System info sent successfully. Thank you." msgstr "Systeeminfo succesvol verzonden. Hartelijk dank." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:706 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:712 msgid "Sending system info failed!" msgstr "Systeeminfo verzenden mislukt!" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:713 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:719 msgid "Sending system info was cancelled." msgstr "Systeeminfo verzenden is geannuleerd." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:720 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:726 msgid "Sending system info..." msgstr "Systeeminfo sturen..." -#: src/slic3r/GUI/SysInfoDialog.cpp:84 +#: src/slic3r/GUI/SysInfoDialog.cpp:92 msgid "System Information" msgstr "Systeeminformatie" -#: src/slic3r/GUI/SysInfoDialog.cpp:150 +#: src/slic3r/GUI/SysInfoDialog.cpp:160 msgid "Blacklisted libraries loaded into PrusaSlicer process:" msgstr "Zwarte-lijstlibrary's geladen in het PrusaSlicer proces:" -#: src/slic3r/GUI/SysInfoDialog.cpp:162 +#: src/slic3r/GUI/SysInfoDialog.cpp:172 msgid "Eigen vectorization supported:" msgstr "Eigen-vectorisatie ondersteund:" -#: src/slic3r/GUI/SysInfoDialog.cpp:169 +#: src/slic3r/GUI/SysInfoDialog.cpp:179 msgid "Copy to Clipboard" msgstr "Kopieer van klembord" -#: src/slic3r/GUI/Tab.cpp:114 src/libslic3r/PrintConfig.cpp:565 +#: src/slic3r/GUI/Tab.cpp:68 src/libslic3r/PrintConfig.cpp:668 msgid "Compatible printers" -msgstr "Geschikte printers" +msgstr "Compatibele printers" -#: src/slic3r/GUI/Tab.cpp:115 +#: src/slic3r/GUI/Tab.cpp:69 msgid "Select the printers this profile is compatible with." -msgstr "Selecteer de printers die geschikt voor dit profiel zijn." +msgstr "Selecteer de printers die compatibel zijn met dit profiel." -#: src/slic3r/GUI/Tab.cpp:120 src/libslic3r/PrintConfig.cpp:580 +#: src/slic3r/GUI/Tab.cpp:74 src/libslic3r/PrintConfig.cpp:683 msgid "Compatible print profiles" -msgstr "Geschikte printprofielen" +msgstr "Compatibele printprofielen" -#: src/slic3r/GUI/Tab.cpp:121 +#: src/slic3r/GUI/Tab.cpp:75 msgid "Select the print profiles this profile is compatible with." -msgstr "Selecteer de printprofielen die geschikt voor dit profiel zijn." +msgstr "Selecteer de printprofielen die compatibel zijn met dit profiel." -#: src/slic3r/GUI/Tab.cpp:216 +#: src/slic3r/GUI/Tab.cpp:165 msgid "Compare this preset with some another" msgstr "Vergelijk deze preset met een andere" #. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:218 +#: src/slic3r/GUI/Tab.cpp:167 #, c-format, boost-format msgid "Save current %s" msgstr "Huidige %s opslaan" -#: src/slic3r/GUI/Tab.cpp:219 +#: src/slic3r/GUI/Tab.cpp:168 +#, c-format, boost-format +msgid "Rename current %s" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:170 msgid "Delete this preset" msgstr "Verwijder preset" -#: src/slic3r/GUI/Tab.cpp:223 +#: src/slic3r/GUI/Tab.cpp:174 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." @@ -8594,16 +10178,16 @@ msgstr "" "Beweeg de cursor over de knoppen voor meer informatie\n" "of klik op deze knop." -#: src/slic3r/GUI/Tab.cpp:227 +#: src/slic3r/GUI/Tab.cpp:178 #, boost-format msgid "Search in settings [%1%]" msgstr "Zoek in instellingen [%1%]" -#: src/slic3r/GUI/Tab.cpp:1298 +#: src/slic3r/GUI/Tab.cpp:1243 msgid "Detach from system preset" msgstr "Ontkoppel van systeempreset" -#: src/slic3r/GUI/Tab.cpp:1311 +#: src/slic3r/GUI/Tab.cpp:1256 msgid "" "A copy of the current system preset will be created, which will be detached " "from the system preset." @@ -8611,224 +10195,232 @@ msgstr "" "Een kopie van de huidige systeempreset wordt aangemaakt. Deze wordt " "ontkoppeld van het origineel." -#: src/slic3r/GUI/Tab.cpp:1312 +#: src/slic3r/GUI/Tab.cpp:1257 msgid "" "The current custom preset will be detached from the parent system preset." msgstr "De huidige custom preset wordt ontkoppeld van de originele preset." -#: src/slic3r/GUI/Tab.cpp:1315 +#: src/slic3r/GUI/Tab.cpp:1260 msgid "Modifications to the current profile will be saved." msgstr "Aanpassingen aan het huidige profiel worden opgeslagen." -#: src/slic3r/GUI/Tab.cpp:1321 +#: src/slic3r/GUI/Tab.cpp:1266 msgid "Detach preset" msgstr "Ontkoppel preset" -#: src/slic3r/GUI/Tab.cpp:1347 +#: src/slic3r/GUI/Tab.cpp:1292 msgid "This is a default preset." msgstr "Dit is een standaard preset." -#: src/slic3r/GUI/Tab.cpp:1349 +#: src/slic3r/GUI/Tab.cpp:1294 msgid "This is a system preset." msgstr "Dit is een systeempreset." -#: src/slic3r/GUI/Tab.cpp:1351 +#: src/slic3r/GUI/Tab.cpp:1296 msgid "Current preset is inherited from the default preset." msgstr "Huidige preset is gebaseerd op de standaard preset." -#: src/slic3r/GUI/Tab.cpp:1355 +#: src/slic3r/GUI/Tab.cpp:1300 msgid "Current preset is inherited from" msgstr "Huidige preset is afgeleid van" -#: src/slic3r/GUI/Tab.cpp:1359 +#: src/slic3r/GUI/Tab.cpp:1304 msgid "It can't be deleted or modified." msgstr "Kan niet verwijderd of aangepast worden." -#: src/slic3r/GUI/Tab.cpp:1360 +#: src/slic3r/GUI/Tab.cpp:1305 msgid "" "Any modifications should be saved as a new preset inherited from this one." msgstr "" "Eventuele wijzigingen moet worden opgeslagen als een nieuwe preset die is " "gebaseerd op de huidige." -#: src/slic3r/GUI/Tab.cpp:1361 +#: src/slic3r/GUI/Tab.cpp:1306 msgid "To do that please specify a new name for the preset." msgstr "Geef daarvoor een nieuwe naam aan de preset." -#: src/slic3r/GUI/Tab.cpp:1365 +#: src/slic3r/GUI/Tab.cpp:1310 msgid "Additional information:" msgstr "Overige informatie:" -#: src/slic3r/GUI/Tab.cpp:1371 +#: src/slic3r/GUI/Tab.cpp:1316 msgid "printer model" msgstr "printermodel" -#: src/slic3r/GUI/Tab.cpp:1379 +#: src/slic3r/GUI/Tab.cpp:1324 msgid "default print profile" msgstr "standaard printprofiel" -#: src/slic3r/GUI/Tab.cpp:1382 +#: src/slic3r/GUI/Tab.cpp:1327 msgid "default filament profile" msgstr "standaard filamentprofiel" -#: src/slic3r/GUI/Tab.cpp:1396 +#: src/slic3r/GUI/Tab.cpp:1341 msgid "default SLA material profile" msgstr "standaard SLA-materiaalprofiel" -#: src/slic3r/GUI/Tab.cpp:1400 +#: src/slic3r/GUI/Tab.cpp:1345 msgid "default SLA print profile" msgstr "standaard SLA-printprofiel" -#: src/slic3r/GUI/Tab.cpp:1408 +#: src/slic3r/GUI/Tab.cpp:1353 msgid "full profile name" msgstr "volledige profielnaam" -#: src/slic3r/GUI/Tab.cpp:1409 +#: src/slic3r/GUI/Tab.cpp:1354 msgid "symbolic profile name" msgstr "symbolische profielnaam" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4657 +#: src/slic3r/GUI/Tab.cpp:1392 src/slic3r/GUI/Tab.cpp:4940 msgid "Layers and perimeters" msgstr "Lagen en perimeters" -#: src/slic3r/GUI/Tab.cpp:1453 +#: src/slic3r/GUI/Tab.cpp:1398 msgid "Vertical shells" msgstr "Verticale shells" -#: src/slic3r/GUI/Tab.cpp:1465 +#: src/slic3r/GUI/Tab.cpp:1410 msgid "Horizontal shells" msgstr "Horizontale shells" -#: src/slic3r/GUI/Tab.cpp:1466 src/libslic3r/PrintConfig.cpp:2417 +#: src/slic3r/GUI/Tab.cpp:1411 src/libslic3r/PrintConfig.cpp:2448 msgid "Solid layers" msgstr "Dichte lagen" -#: src/slic3r/GUI/Tab.cpp:1471 +#: src/slic3r/GUI/Tab.cpp:1416 msgid "Minimum shell thickness" msgstr "Minimale shelldikte" -#: src/slic3r/GUI/Tab.cpp:1482 +#: src/slic3r/GUI/Tab.cpp:1427 msgid "Quality (slower slicing)" msgstr "Kwaliteit (slicen kan langer duren)" -#: src/slic3r/GUI/Tab.cpp:1497 +#: src/slic3r/GUI/Tab.cpp:1444 msgid "Fuzzy skin (experimental)" msgstr "Oneffen oppervlak (experimenteel)" -#: src/slic3r/GUI/Tab.cpp:1520 +#: src/slic3r/GUI/Tab.cpp:1467 msgid "Reducing printing time" msgstr "Printtijd verkorten" -#: src/slic3r/GUI/Tab.cpp:1535 src/libslic3r/ExtrusionEntity.cpp:370 +#: src/slic3r/GUI/Tab.cpp:1482 msgid "Skirt" msgstr "Skirt" -#: src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1504 msgid "Raft" msgstr "Raft" -#: src/slic3r/GUI/Tab.cpp:1562 +#: src/slic3r/GUI/Tab.cpp:1509 msgid "Options for support material and raft" msgstr "Opties voor support en raft" -#: src/slic3r/GUI/Tab.cpp:1582 +#: src/slic3r/GUI/Tab.cpp:1528 +msgid "Organic supports" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1537 msgid "Speed for print moves" msgstr "Snelheid voor printbewegingen" -#: src/slic3r/GUI/Tab.cpp:1595 +#: src/slic3r/GUI/Tab.cpp:1550 +msgid "Dynamic overhang speed" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1557 msgid "Speed for non-print moves" msgstr "Snelheid voor niet-print bewegingen" -#: src/slic3r/GUI/Tab.cpp:1599 +#: src/slic3r/GUI/Tab.cpp:1561 msgid "Modifiers" msgstr "Modificators" -#: src/slic3r/GUI/Tab.cpp:1603 +#: src/slic3r/GUI/Tab.cpp:1565 msgid "Acceleration control (advanced)" msgstr "Acceleraties (geavanceerd)" -#: src/slic3r/GUI/Tab.cpp:1614 +#: src/slic3r/GUI/Tab.cpp:1576 msgid "Autospeed (advanced)" msgstr "Automatische snelheid (geavanceerd)" -#: src/slic3r/GUI/Tab.cpp:1618 +#: src/slic3r/GUI/Tab.cpp:1580 msgid "Pressure equalizer (experimental)" -msgstr "" +msgstr "Drukverdeler (experimenteel)" -#: src/slic3r/GUI/Tab.cpp:1622 +#: src/slic3r/GUI/Tab.cpp:1584 msgid "Multiple Extruders" msgstr "Meerdere extruders" -#: src/slic3r/GUI/Tab.cpp:1630 +#: src/slic3r/GUI/Tab.cpp:1592 msgid "Ooze prevention" msgstr "Druippreventie" -#: src/slic3r/GUI/Tab.cpp:1650 +#: src/slic3r/GUI/Tab.cpp:1596 +msgid "Wipe tower" +msgstr "Afveegblok" + +#: src/slic3r/GUI/Tab.cpp:1612 msgid "Extrusion width" msgstr "Extrusiebreedte" -#: src/slic3r/GUI/Tab.cpp:1660 +#: src/slic3r/GUI/Tab.cpp:1622 msgid "Overlap" msgstr "Overlapping" -#: src/slic3r/GUI/Tab.cpp:1663 +#: src/slic3r/GUI/Tab.cpp:1625 msgid "Flow" msgstr "Stroom" -#: src/slic3r/GUI/Tab.cpp:1674 src/slic3r/GUI/Tab.cpp:1700 -msgid "Other" -msgstr "Overige" - -#: src/slic3r/GUI/Tab.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:1636 msgid "Arachne perimeter generator" -msgstr "" +msgstr "Arachne-perimetergeneratie" -#: src/slic3r/GUI/Tab.cpp:1685 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1644 src/slic3r/GUI/Tab.cpp:4990 msgid "Output options" msgstr "Output-opties" -#: src/slic3r/GUI/Tab.cpp:1686 +#: src/slic3r/GUI/Tab.cpp:1645 msgid "Sequential printing" msgstr "Achtereenvolgens printen" -#: src/slic3r/GUI/Tab.cpp:1688 +#: src/slic3r/GUI/Tab.cpp:1647 msgid "Extruder clearance" msgstr "Extruderruimte" -#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:4735 +#: src/slic3r/GUI/Tab.cpp:1652 src/slic3r/GUI/Tab.cpp:4991 msgid "Output file" msgstr "Outputbestand" -#: src/slic3r/GUI/Tab.cpp:1712 src/libslic3r/PrintConfig.cpp:2042 +#: src/slic3r/GUI/Tab.cpp:1671 src/libslic3r/PrintConfig.cpp:2072 msgid "Post-processing scripts" msgstr "Scripts voor nabewerking" -#: src/slic3r/GUI/Tab.cpp:1724 src/slic3r/GUI/Tab.cpp:1725 -#: src/slic3r/GUI/Tab.cpp:2110 src/slic3r/GUI/Tab.cpp:2111 -#: src/slic3r/GUI/Tab.cpp:2498 src/slic3r/GUI/Tab.cpp:2499 -#: src/slic3r/GUI/Tab.cpp:2571 src/slic3r/GUI/Tab.cpp:2572 -#: src/slic3r/GUI/Tab.cpp:3957 src/slic3r/GUI/Tab.cpp:4585 -#: src/slic3r/GUI/Tab.cpp:4586 +#: src/slic3r/GUI/Tab.cpp:1683 src/slic3r/GUI/Tab.cpp:1684 +#: src/slic3r/GUI/Tab.cpp:2080 src/slic3r/GUI/Tab.cpp:2081 +#: src/slic3r/GUI/Tab.cpp:2486 src/slic3r/GUI/Tab.cpp:2487 +#: src/slic3r/GUI/Tab.cpp:2564 src/slic3r/GUI/Tab.cpp:2565 +#: src/slic3r/GUI/Tab.cpp:4182 src/slic3r/GUI/Tab.cpp:4822 +#: src/slic3r/GUI/Tab.cpp:4823 msgid "Notes" msgstr "Opmerkingen" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:2088 +#: src/slic3r/GUI/Tab.cpp:2493 src/slic3r/GUI/Tab.cpp:2571 +#: src/slic3r/GUI/Tab.cpp:4830 src/slic3r/GUI/Tab.cpp:4996 msgid "Dependencies" msgstr "Afhankelijkheden" -#: src/slic3r/GUI/Tab.cpp:1732 src/slic3r/GUI/Tab.cpp:2119 -#: src/slic3r/GUI/Tab.cpp:2506 src/slic3r/GUI/Tab.cpp:2579 -#: src/slic3r/GUI/Tab.cpp:4594 src/slic3r/GUI/Tab.cpp:4741 +#: src/slic3r/GUI/Tab.cpp:1691 src/slic3r/GUI/Tab.cpp:2089 +#: src/slic3r/GUI/Tab.cpp:2494 src/slic3r/GUI/Tab.cpp:2572 +#: src/slic3r/GUI/Tab.cpp:4831 src/slic3r/GUI/Tab.cpp:4997 msgid "Profile dependencies" msgstr "Profielafhankelijkheden" -#: src/slic3r/GUI/Tab.cpp:1771 +#: src/slic3r/GUI/Tab.cpp:1723 msgid "Post processing scripts shall modify G-code file in place." msgstr "Nabewerkscripts zullen de G-code wijzigen." -#: src/slic3r/GUI/Tab.cpp:1850 +#: src/slic3r/GUI/Tab.cpp:1802 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8847,7 +10439,7 @@ msgstr[1] "" "Verwijder deze alstublieft; dit kan problemen veroorzaken in de visualisatie " "en printtijdschattingen." -#: src/slic3r/GUI/Tab.cpp:1855 +#: src/slic3r/GUI/Tab.cpp:1807 msgid "Found reserved keywords in" msgstr "Gereserveerde sleutelwoorden gevonden in" @@ -8855,74 +10447,90 @@ msgstr "Gereserveerde sleutelwoorden gevonden in" msgid "Filament Overrides" msgstr "Overschrijven door filament" -#: src/slic3r/GUI/Tab.cpp:1992 +#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2827 +msgid "Retraction" +msgstr "Retractie" + +#: src/slic3r/GUI/Tab.cpp:1951 +msgid "Temperature" +msgstr "Temperatuur" + +#: src/slic3r/GUI/Tab.cpp:1955 msgid "Nozzle" msgstr "Nozzle" -#: src/slic3r/GUI/Tab.cpp:1997 +#: src/slic3r/GUI/Tab.cpp:1960 msgid "Bed" msgstr "Bed" -#: src/slic3r/GUI/Tab.cpp:2002 +#: src/slic3r/GUI/Tab.cpp:1965 msgid "Cooling" msgstr "Koeling" -#: src/slic3r/GUI/Tab.cpp:2004 src/libslic3r/PrintConfig.cpp:1936 -#: src/libslic3r/PrintConfig.cpp:2994 +#: src/slic3r/GUI/Tab.cpp:1967 src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "Enable" msgstr "Toestaan" -#: src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/Tab.cpp:1978 msgid "Fan settings" msgstr "Ventilatorinstellingen" -#: src/slic3r/GUI/Tab.cpp:2026 +#: src/slic3r/GUI/Tab.cpp:1979 +msgid "Fan speed" +msgstr "Ventilatorsnelheid" + +#: src/slic3r/GUI/Tab.cpp:1989 +msgid "Dynamic fan speeds" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1996 msgid "Cooling thresholds" msgstr "Koeldrempels" -#: src/slic3r/GUI/Tab.cpp:2032 +#: src/slic3r/GUI/Tab.cpp:2002 msgid "Filament properties" msgstr "Filamenteigenschappen" -#: src/slic3r/GUI/Tab.cpp:2039 +#: src/slic3r/GUI/Tab.cpp:2009 msgid "Print speed override" msgstr "Printsnelheid overschrijven" -#: src/slic3r/GUI/Tab.cpp:2049 +#: src/slic3r/GUI/Tab.cpp:2019 msgid "Wipe tower parameters" msgstr "Afveegblokparameters" -#: src/slic3r/GUI/Tab.cpp:2052 +#: src/slic3r/GUI/Tab.cpp:2022 msgid "Toolchange parameters with single extruder MM printers" msgstr "Toolwisselparameter voor multi-materialprinters met één extruder" -#: src/slic3r/GUI/Tab.cpp:2065 +#: src/slic3r/GUI/Tab.cpp:2035 msgid "Ramming settings" msgstr "Ramming-instellingen" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 -#: src/slic3r/GUI/Tab.cpp:4264 src/libslic3r/GCode.cpp:733 -#: src/libslic3r/PrintConfig.cpp:2500 +#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:2398 +#: src/slic3r/GUI/Tab.cpp:4493 src/libslic3r/GCode.cpp:684 +#: src/libslic3r/PrintConfig.cpp:2532 msgid "Custom G-code" msgstr "Custom G-code" -#: src/slic3r/GUI/Tab.cpp:2090 src/slic3r/GUI/Tab.cpp:2411 -#: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2450 -#: src/libslic3r/PrintConfig.cpp:2465 +#: src/slic3r/GUI/Tab.cpp:2060 src/slic3r/GUI/Tab.cpp:2399 +#: src/libslic3r/GCode.cpp:658 src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2497 msgid "Start G-code" msgstr "Start G-code" -#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:2421 -#: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:685 -#: src/libslic3r/PrintConfig.cpp:695 +#: src/slic3r/GUI/Tab.cpp:2070 src/slic3r/GUI/Tab.cpp:2409 +#: src/libslic3r/GCode.cpp:659 src/libslic3r/PrintConfig.cpp:788 +#: src/libslic3r/PrintConfig.cpp:798 msgid "End G-code" msgstr "Eind G-code" -#: src/slic3r/GUI/Tab.cpp:2153 +#: src/slic3r/GUI/Tab.cpp:2115 msgid "Volumetric flow hints not available" msgstr "Volumetrische stroom - opmerkingen niet beschikbaar" -#: src/slic3r/GUI/Tab.cpp:2257 +#: src/slic3r/GUI/Tab.cpp:2241 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -8934,7 +10542,7 @@ msgid "" "The Physical Printer profiles are being stored into PrusaSlicer/" "physical_printer directory." msgstr "" -"Let op dat alle parameters van deze groep zijn verplaatst naar de fysieke " +"Let op dat alle parameters van deze groep zijn verplaatst naar de fysieke-" "printerinstellingen (zie wijzigingslogboek).\n" "\n" "Een nieuw fysieke printerprofiel wordt aangemaakt door te klikken op het " @@ -8944,20 +10552,20 @@ msgstr "" "printerinstellingentab. Het fysieke printerprofiel is opgeslagen in de " "locatie PrusaSlicer/physical_printer." -#: src/slic3r/GUI/Tab.cpp:2291 src/slic3r/GUI/Tab.cpp:2518 +#: src/slic3r/GUI/Tab.cpp:2275 src/slic3r/GUI/Tab.cpp:2506 msgid "Size and coordinates" msgstr "Grootte en coördinaten" -#: src/slic3r/GUI/Tab.cpp:2300 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:2284 src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "Capabilities" msgstr "Mogelijkheden" -#: src/slic3r/GUI/Tab.cpp:2305 +#: src/slic3r/GUI/Tab.cpp:2289 msgid "Number of extruders of the printer." msgstr "Aantal extruders van de printer." -#: src/slic3r/GUI/Tab.cpp:2334 +#: src/slic3r/GUI/Tab.cpp:2322 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -8969,105 +10577,101 @@ msgstr "" "Wilt u de diameters voor alle extruders aanpassen gelijk aan die van de " "eerste extruder?" -#: src/slic3r/GUI/Tab.cpp:2338 src/slic3r/GUI/Tab.cpp:2782 -#: src/libslic3r/PrintConfig.cpp:1900 +#: src/slic3r/GUI/Tab.cpp:2326 src/slic3r/GUI/Tab.cpp:2714 +#: src/libslic3r/PrintConfig.cpp:1937 msgid "Nozzle diameter" msgstr "Nozzlediameter" -#: src/slic3r/GUI/Tab.cpp:2431 src/libslic3r/GCode.cpp:709 -#: src/libslic3r/PrintConfig.cpp:425 +#: src/slic3r/GUI/Tab.cpp:2419 src/libslic3r/GCode.cpp:660 +#: src/libslic3r/PrintConfig.cpp:444 msgid "Before layer change G-code" msgstr "G-code die komt vóór de laagwisseling" -#: src/slic3r/GUI/Tab.cpp:2441 src/libslic3r/GCode.cpp:710 -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/slic3r/GUI/Tab.cpp:2429 src/libslic3r/GCode.cpp:661 +#: src/libslic3r/PrintConfig.cpp:1665 msgid "After layer change G-code" msgstr "G-code die komt na de laagwisseling" -#: src/slic3r/GUI/Tab.cpp:2451 src/libslic3r/GCode.cpp:711 -#: src/libslic3r/PrintConfig.cpp:2877 +#: src/slic3r/GUI/Tab.cpp:2439 src/libslic3r/GCode.cpp:662 +#: src/libslic3r/PrintConfig.cpp:2965 msgid "Tool change G-code" msgstr "Toolwisseling G-code" -#: src/slic3r/GUI/Tab.cpp:2461 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2449 src/libslic3r/GCode.cpp:663 msgid "Between objects G-code (for sequential printing)" msgstr "G-code die komt tussen objecten (bij achtereenvolgens printen)" -#: src/slic3r/GUI/Tab.cpp:2471 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2459 src/libslic3r/GCode.cpp:664 msgid "Color Change G-code" msgstr "Kleurwissel G-code" -#: src/slic3r/GUI/Tab.cpp:2480 src/libslic3r/GCode.cpp:714 -#: src/libslic3r/PrintConfig.cpp:2491 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:665 +#: src/libslic3r/PrintConfig.cpp:2523 msgid "Pause Print G-code" msgstr "Pauzeer print G-code" -#: src/slic3r/GUI/Tab.cpp:2489 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:666 msgid "Template Custom G-code" msgstr "Template custom G-code" -#: src/slic3r/GUI/Tab.cpp:2525 +#: src/slic3r/GUI/Tab.cpp:2513 msgid "Display" msgstr "Scherm" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2528 msgid "Tilt" msgstr "Draaiing" -#: src/slic3r/GUI/Tab.cpp:2541 +#: src/slic3r/GUI/Tab.cpp:2529 msgid "Tilt time" msgstr "Draaitijd" -#: src/slic3r/GUI/Tab.cpp:2548 src/slic3r/GUI/Tab.cpp:4575 +#: src/slic3r/GUI/Tab.cpp:2536 src/slic3r/GUI/Tab.cpp:4812 msgid "Corrections" msgstr "Correcties" -#: src/slic3r/GUI/Tab.cpp:2561 src/slic3r/GUI/Tab.cpp:4571 +#: src/slic3r/GUI/Tab.cpp:2549 src/slic3r/GUI/Tab.cpp:4808 msgid "Exposure" msgstr "Belichtingstijd" -#: src/slic3r/GUI/Tab.cpp:2622 src/slic3r/GUI/Tab.cpp:2709 -#: src/libslic3r/PrintConfig.cpp:1655 src/libslic3r/PrintConfig.cpp:1690 -#: src/libslic3r/PrintConfig.cpp:1707 src/libslic3r/PrintConfig.cpp:1724 -#: src/libslic3r/PrintConfig.cpp:1740 src/libslic3r/PrintConfig.cpp:1750 -#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1773 -#: src/libslic3r/PrintConfig.cpp:1783 +#: src/slic3r/GUI/Tab.cpp:2556 +msgid "Output" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2615 src/slic3r/GUI/Tab.cpp:2875 +#: src/libslic3r/PrintConfig.cpp:1694 src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1744 src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1777 src/libslic3r/PrintConfig.cpp:1787 +#: src/libslic3r/PrintConfig.cpp:1797 src/libslic3r/PrintConfig.cpp:1810 +#: src/libslic3r/PrintConfig.cpp:1820 msgid "Machine limits" msgstr "Machinelimieten" -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2638 msgid "Values in this column are for Normal mode" msgstr "Waarden in deze kolom zijn voor de normale modus" -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2644 msgid "Values in this column are for Stealth mode" msgstr "Waarden in deze kolom zijn voor de stille modus" -#: src/slic3r/GUI/Tab.cpp:2660 +#: src/slic3r/GUI/Tab.cpp:2653 msgid "Maximum feedrates" msgstr "Maximale snelheden" -#: src/slic3r/GUI/Tab.cpp:2665 +#: src/slic3r/GUI/Tab.cpp:2658 msgid "Maximum accelerations" msgstr "Maximale acceleraties" -#: src/slic3r/GUI/Tab.cpp:2674 +#: src/slic3r/GUI/Tab.cpp:2667 msgid "Jerk limits" msgstr "Ruklimieten" -#: src/slic3r/GUI/Tab.cpp:2680 +#: src/slic3r/GUI/Tab.cpp:2673 msgid "Minimum feedrates" msgstr "Minimale snelheden" -#: src/slic3r/GUI/Tab.cpp:2734 src/slic3r/GUI/Tab.cpp:2743 -msgid "Single extruder MM setup" -msgstr "Multi-materialsetup met één extruder" - -#: src/slic3r/GUI/Tab.cpp:2744 -msgid "Single extruder multimaterial parameters" -msgstr "Parameter voor multi-material met één extruder" - -#: src/slic3r/GUI/Tab.cpp:2779 +#: src/slic3r/GUI/Tab.cpp:2711 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -9076,19 +10680,27 @@ msgstr "" "extruders worden ingesteld op de nieuwe waarde. Weet u zeker dat u wilt " "doorgaan?" -#: src/slic3r/GUI/Tab.cpp:2804 +#: src/slic3r/GUI/Tab.cpp:2739 +msgid "Reset to Filament Color" +msgstr "Reset naar filamentkleur" + +#: src/slic3r/GUI/Tab.cpp:2775 +msgid "Apply below setting to other extruders" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2820 msgid "Layer height limits" msgstr "Laagdiktelimieten" -#: src/slic3r/GUI/Tab.cpp:2809 +#: src/slic3r/GUI/Tab.cpp:2824 msgid "Position (for multi-extruder printers)" msgstr "Positie (voor multi-extruderprinters)" -#: src/slic3r/GUI/Tab.cpp:2815 +#: src/slic3r/GUI/Tab.cpp:2830 msgid "Only lift Z" -msgstr "Beweeg alleen Z omhoog" +msgstr "Beweeg alleen omhoog" -#: src/slic3r/GUI/Tab.cpp:2828 +#: src/slic3r/GUI/Tab.cpp:2843 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -9096,11 +10708,15 @@ msgstr "" "Retractie als de tool uit staat (geavanceerde instelling voor multi-" "extrudersetups)" -#: src/slic3r/GUI/Tab.cpp:2835 -msgid "Reset to Filament Color" -msgstr "Reset naar filamentkleur" +#: src/slic3r/GUI/Tab.cpp:2900 src/slic3r/GUI/Tab.cpp:2909 +msgid "Single extruder MM setup" +msgstr "Multi-materialsetup met één extruder" + +#: src/slic3r/GUI/Tab.cpp:2910 +msgid "Single extruder multimaterial parameters" +msgstr "Parameter voor multi-material met één extruder" -#: src/slic3r/GUI/Tab.cpp:3012 +#: src/slic3r/GUI/Tab.cpp:3074 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -9110,31 +10726,46 @@ msgstr "" "\n" "Moet deze uitgezet worden om firmwareretractie te gebruiken?" -#: src/slic3r/GUI/Tab.cpp:3014 +#: src/slic3r/GUI/Tab.cpp:3076 msgid "Firmware Retraction" msgstr "Firmware-retractie" -#: src/slic3r/GUI/Tab.cpp:3319 +#: src/slic3r/GUI/Tab.cpp:3384 msgid "New printer preset selected" msgstr "Nieuwe printerpreset geselecteerd" -#: src/slic3r/GUI/Tab.cpp:3625 +#: src/slic3r/GUI/Tab.cpp:3758 msgid "Detached" msgstr "Ontkoppeld" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3857 +msgid "" +"The physical printer below is based on the preset, you are going to rename." +msgid_plural "" +"The physical printers below are based on the preset, you are going to rename." +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Tab.cpp:3862 +msgid "Note, that the selected preset will be renamed in this printer too." +msgid_plural "" +"Note, that the selected preset will be renamed in these printers too." +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Tab.cpp:3924 msgid "remove" msgstr "verwijder" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3924 msgid "delete" msgstr "verwijderen" -#: src/slic3r/GUI/Tab.cpp:3711 +#: src/slic3r/GUI/Tab.cpp:3933 msgid "It's a last preset for this physical printer." msgstr "Het is een laatste preset voor deze fysieke printer." -#: src/slic3r/GUI/Tab.cpp:3716 +#: src/slic3r/GUI/Tab.cpp:3938 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " @@ -9142,7 +10773,7 @@ msgid "" msgstr "" "Weet je zeker dat je \"%1%\" wilt verwijderen van de fysieke printer \"%2%\"?" -#: src/slic3r/GUI/Tab.cpp:3728 +#: src/slic3r/GUI/Tab.cpp:3950 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -9154,7 +10785,7 @@ msgstr[1] "" "De onderstaande fysieke printers zijn gebaseerd op de preset die u wilt " "verwijderen." -#: src/slic3r/GUI/Tab.cpp:3733 +#: src/slic3r/GUI/Tab.cpp:3955 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." @@ -9163,7 +10794,7 @@ msgstr[0] "" msgstr[1] "" "Let op dat de geselecteerde preset ook voor deze printers wordt verwijderd." -#: src/slic3r/GUI/Tab.cpp:3738 +#: src/slic3r/GUI/Tab.cpp:3960 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -9177,7 +10808,7 @@ msgstr[1] "" "De onderstaande fysieke printers zijn alleen gebaseerd op de preset die u " "wilt verwijderen." -#: src/slic3r/GUI/Tab.cpp:3743 +#: src/slic3r/GUI/Tab.cpp:3965 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -9189,57 +10820,57 @@ msgstr[1] "" "Let op dat deze printers worden verwijderd na het verwijderen van de " "geselecteerde preset." -#: src/slic3r/GUI/Tab.cpp:3748 +#: src/slic3r/GUI/Tab.cpp:3970 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "Weet u zeker dat u de geselecteerde preset %1% wilt?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3753 +#: src/slic3r/GUI/Tab.cpp:3975 #, boost-format msgid "%1% Preset" msgstr "Preset %1%" -#: src/slic3r/GUI/Tab.cpp:3836 src/slic3r/GUI/Tab.cpp:4198 +#: src/slic3r/GUI/Tab.cpp:4061 src/slic3r/GUI/Tab.cpp:4423 msgid "Set" msgstr "Stel in" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:4180 msgid "Find" -msgstr "Zoeken" +msgstr "Zoek" -#: src/slic3r/GUI/Tab.cpp:3956 +#: src/slic3r/GUI/Tab.cpp:4181 msgid "Replace with" -msgstr "" +msgstr "Vervang met" -#: src/slic3r/GUI/Tab.cpp:4045 +#: src/slic3r/GUI/Tab.cpp:4270 msgid "Regular expression" -msgstr "" +msgstr "Reguliere uitdrukking" -#: src/slic3r/GUI/Tab.cpp:4049 +#: src/slic3r/GUI/Tab.cpp:4274 msgid "Case insensitive" -msgstr "" +msgstr "Hoofdletterongevoelig" -#: src/slic3r/GUI/Tab.cpp:4053 +#: src/slic3r/GUI/Tab.cpp:4278 msgid "Whole word" -msgstr "Alleen hele woorden" +msgstr "Geheel woord" -#: src/slic3r/GUI/Tab.cpp:4057 +#: src/slic3r/GUI/Tab.cpp:4282 msgid "Match single line" -msgstr "" +msgstr "Laat overeenkomen met enkele lijn" -#: src/slic3r/GUI/Tab.cpp:4160 +#: src/slic3r/GUI/Tab.cpp:4385 msgid "Are you sure you want to delete all substitutions?" -msgstr "" +msgstr "Weet je zeker dat je alle substituties wilt verwijderen?" -#: src/slic3r/GUI/Tab.cpp:4292 +#: src/slic3r/GUI/Tab.cpp:4521 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" "Machinelimieten worden opgenomen in de G-code en gebruikt voor de geschatte " "printtijd." -#: src/slic3r/GUI/Tab.cpp:4295 +#: src/slic3r/GUI/Tab.cpp:4524 msgid "" "Machine limits will NOT be emitted to G-code, however they will be used to " "estimate print time, which may therefore not be accurate as the printer may " @@ -9249,7 +10880,7 @@ msgstr "" "gebruikt om de printtijd te schatten, waardoor ze niet nauwkeurig kunnen " "zijn bij een printer met andere machinelimieten." -#: src/slic3r/GUI/Tab.cpp:4299 +#: src/slic3r/GUI/Tab.cpp:4528 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." @@ -9257,12 +10888,12 @@ msgstr "" "Machinelimieten zijn niet ingesteld, waardoor de geschatte printtijd niet " "nauwkeurig is." -#: src/slic3r/GUI/Tab.cpp:4321 +#: src/slic3r/GUI/Tab.cpp:4550 msgid "LOCKED LOCK" msgstr "Vergrendeld" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4323 +#: src/slic3r/GUI/Tab.cpp:4552 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" @@ -9270,12 +10901,12 @@ msgstr "" "geeft aan dat de instellingen gelijk zijn aan de systeemwaarden voor de " "huidige optiegroep" -#: src/slic3r/GUI/Tab.cpp:4325 +#: src/slic3r/GUI/Tab.cpp:4554 msgid "UNLOCKED LOCK" msgstr "Ontgrendeld" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4327 +#: src/slic3r/GUI/Tab.cpp:4556 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -9287,12 +10918,12 @@ msgstr "" "Klik op het ontgrendeld-pictogram om de instelling te resetten naar de " "systeemwaarden voor de huidige optiegroep." -#: src/slic3r/GUI/Tab.cpp:4332 +#: src/slic3r/GUI/Tab.cpp:4561 msgid "WHITE BULLET" msgstr "Wit bolletje" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4334 +#: src/slic3r/GUI/Tab.cpp:4563 msgid "" "for the left button: indicates a non-system (or non-default) preset,\n" "for the right button: indicates that the settings hasn't been modified." @@ -9300,12 +10931,12 @@ msgstr "" "de linkerknop geeft aan dat het niet een systeempreset is,\n" "de rechterknop geeft aan of de instelling is gewijzigd." -#: src/slic3r/GUI/Tab.cpp:4337 +#: src/slic3r/GUI/Tab.cpp:4566 msgid "BACK ARROW" msgstr "Pijltje terug" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4339 +#: src/slic3r/GUI/Tab.cpp:4568 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -9317,7 +10948,7 @@ msgstr "" "Klik op het pijltje-terug-pictogram om alle instellingen te resetten naar de " "laatst opgeslagen preset voor de huidige optiegroep." -#: src/slic3r/GUI/Tab.cpp:4349 +#: src/slic3r/GUI/Tab.cpp:4578 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -9325,7 +10956,7 @@ msgstr "" "Vergrendeld-pictogram geeft aan dat de instellingen gelijk zijn aan de " "systeemwaarde van de huidige optiegroep" -#: src/slic3r/GUI/Tab.cpp:4351 +#: src/slic3r/GUI/Tab.cpp:4580 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " "equal to the system (or default) values for the current option group.\n" @@ -9337,11 +10968,11 @@ msgstr "" "Klik om alle instellingen voor de huidige optiegroep te resetten naar " "systeemwaarden." -#: src/slic3r/GUI/Tab.cpp:4354 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "Het witte bolletje geeft aan dat het geen systeempreset betreft." -#: src/slic3r/GUI/Tab.cpp:4357 +#: src/slic3r/GUI/Tab.cpp:4586 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -9349,7 +10980,7 @@ msgstr "" "Het witte bolletje geeft aan dat de instelling gelijk is aan de laatst " "opgeslagen preset voor de huidige optiegroep." -#: src/slic3r/GUI/Tab.cpp:4359 +#: src/slic3r/GUI/Tab.cpp:4588 msgid "" "BACK ARROW icon indicates that the settings were changed and are not equal " "to the last saved preset for the current option group.\n" @@ -9362,14 +10993,14 @@ msgstr "" "Klik om alle instellingen terug te zetten voor de huidige optiegroep naar de " "laatst opgeslagen preset." -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4594 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "" "Vergrendeld-pictogram geeft aan dat de waarde gelijk is aan de systeemwaarde." -#: src/slic3r/GUI/Tab.cpp:4366 +#: src/slic3r/GUI/Tab.cpp:4595 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -9379,7 +11010,7 @@ msgstr "" "aan de systeemwaarde.\n" "Klik om de huidige waarde te resetten naar de systeemwaarde." -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4601 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -9387,7 +11018,7 @@ msgstr "" "Het witte bolletje geeft aan dat de waarde gelijk is aan de laatst " "opgeslagen preset." -#: src/slic3r/GUI/Tab.cpp:4373 +#: src/slic3r/GUI/Tab.cpp:4602 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -9397,31 +11028,31 @@ msgstr "" "gelijk is aan de laatst opgeslagen preset.\n" "Klik om de waarde te resetten naar de laatst opgeslagen preset." -#: src/slic3r/GUI/Tab.cpp:4527 src/slic3r/GUI/Tab.cpp:4529 +#: src/slic3r/GUI/Tab.cpp:4764 src/slic3r/GUI/Tab.cpp:4766 msgid "Material" msgstr "Materiaal" -#: src/slic3r/GUI/Tab.cpp:4614 src/slic3r/GUI/Tab.cpp:4615 +#: src/slic3r/GUI/Tab.cpp:4851 src/slic3r/GUI/Tab.cpp:4852 msgid "Material printing profile" msgstr "Materiaal-printprofiel" -#: src/slic3r/GUI/Tab.cpp:4667 +#: src/slic3r/GUI/Tab.cpp:4901 msgid "Support head" msgstr "Supportkop" -#: src/slic3r/GUI/Tab.cpp:4672 +#: src/slic3r/GUI/Tab.cpp:4906 msgid "Support pillar" msgstr "Supportpijler" -#: src/slic3r/GUI/Tab.cpp:4695 +#: src/slic3r/GUI/Tab.cpp:4929 msgid "Connection of the support sticks and junctions" msgstr "Verbindingen van de supporttakken en kruisingen" -#: src/slic3r/GUI/Tab.cpp:4700 +#: src/slic3r/GUI/Tab.cpp:4956 msgid "Automatic generation" msgstr "Automatisch genereren" -#: src/slic3r/GUI/Tab.cpp:4775 +#: src/slic3r/GUI/Tab.cpp:5024 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -9430,86 +11061,92 @@ msgstr "" "\"%1%\" is uitgeschakeld omdat \"%2%\" aanstaat in \"%3%\"-categorie.\n" "Om \"%1%\" aan te zetten moet \"%2%\" uit staan" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3724 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3497 msgid "Object elevation" msgstr "Objectverhoging" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3826 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3958 msgid "Pad around object" msgstr "Basisplaat rondom object" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:153 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:162 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1047 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1100 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1115 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1130 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1145 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:147 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:156 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:165 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1107 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1122 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1137 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1152 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1197 msgid "Undef" msgstr "Ongedefinieerd" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:772 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:792 msgid "Unsaved Changes" msgstr "Onopgeslagen wijzigingen" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:790 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:810 msgid "Switching Presets: Unsaved Changes" msgstr "Wisselen van presets: niet-opgeslagen wijzigingen" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:832 -msgid "Old Value" -msgstr "Oude waarde" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:858 +msgid "Original Value" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:859 +msgid "Modified Value" +msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:833 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:861 msgid "New Value" msgstr "Nieuwe waarde" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:867 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 msgid "Keep" msgstr "Behoud" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1569 msgid "Transfer" msgstr "Omzetten" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 msgid "Don't save" msgstr "Niet opslaan" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 -msgid "Discard" -msgstr "Afwijzen" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:877 -msgid "Save" -msgstr "Opslaan" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:898 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:926 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "create new project" msgstr "" +"U wordt niet gevraagd naar niet-opgeslagen wijzigingen in presets de " +"volgende keer als u een nieuw project aanmaakt" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:927 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "switch a preset" msgstr "" +"U wordt niet gevraagd naar niet-opgeslagen wijzigingen in presets de " +"volgende keer als u wisselt van preset" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:900 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:928 msgid "" "You will not be asked about the unsaved changes in presets the next time " "you: \n" "- Closing PrusaSlicer while some presets are modified,\n" "- Loading a new project while some presets are modified" msgstr "" +"U wordt niet gevraagd naar niet-opgeslagen wijzigingen in presets de " +"volgende keer als:\n" +"- PrusaSlicer afgesloten wordt terwijl sommige presets zijn aangepast;\n" +"- een nieuw project wordt geladen terwijl sommige presets zijn aangepast" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:903 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:931 msgid "PrusaSlicer will remember your action." msgstr "PrusaSlicer onthoudt je keuze." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:904 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:932 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" @@ -9518,108 +11155,135 @@ msgstr "" "Kijk naar \"Voorkeuren\" en check \"%1%\"\n" "om weer te vragen over niet-opgeslagen wijzigingen." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:964 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1772 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" "Sommige velden zijn te lang om te passen. Rechtermuisklik toont de volledige " "tekst." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will not be saved" msgstr "Alle gewijzigde instellingen worden niet opgeslagen" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will be discarded." msgstr "Gewijzigde instellingen worden niet opgeslagen." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:941 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:969 msgid "Save the selected options." msgstr "Geselecteerde opties opslaan." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:942 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:970 msgid "Keep the selected settings." msgstr "Behoud de geselecteerde instellingen." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:943 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:971 msgid "Transfer the selected settings to the newly selected preset." msgstr "Ze de geselecteerde instelling om in de nieuw geselecteerde preset." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:947 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:975 #, boost-format msgid "Save the selected options to preset \"%1%\"." msgstr "Geselecteerde opties voor preset \"%1%\" opslaan." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:948 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:976 #, boost-format msgid "Transfer the selected options to the newly selected preset \"%1%\"." msgstr "" "Zet de geselecteerde optie om in de nieuw geselecteerde preset \"%1%\"." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1224 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1237 msgid "The following preset was modified" msgid_plural "The following presets were modified" msgstr[0] "De volgende preset is aangepast" msgstr[1] "De volgende presets zijn aangepast" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1230 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1243 #, boost-format msgid "Preset \"%1%\" has the following unsaved changes:" msgstr "Preset \"%1%\" heeft de volgende niet-opgeslagen wijzigingen:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1234 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1247 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new printer profile and it has the " "following unsaved changes:" msgstr "" -"Preset \"%1%\" is niet geschikt voor het nieuwe printerprofiel en heeft de " +"Preset \"%1%\" is niet compatibel met het nieuwe printerprofiel en heeft de " "volgende niet-opgeslagen wijzigingen:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1235 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1248 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new print profile and it has the " "following unsaved changes:" msgstr "" -"Preset \"%1%\" is niet geschikt voor het nieuwe printprofiel en heeft de " +"Preset \"%1%\" is niet compatibel met het nieuwe printprofiel en heeft de " "volgende niet-opgeslagen wijzigingen:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1297 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1850 msgid "Extruders count" msgstr "Aantal extruders" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 -msgid "Select presets to compare" -msgstr "" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1326 +msgid "The preset modifications are successfully saved" +msgid_plural "The presets modifications are successfully saved" +msgstr[0] "De preset-aanpassing is succesvol opgeslagen" +msgstr[1] "De presets-aanpassing is succesvol opgeslagen" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1515 msgid "Show all presets (including incompatible)" -msgstr "Toon alle presets (inclusief incompatibele)" +msgstr "Toon alle presets (inclusief niet compatibele)" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1533 +msgid "Select presets to compare" +msgstr "Selecteer presets om te vergelijken" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1545 msgid "Left Preset Value" msgstr "Linker presetwaarde" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1546 msgid "Right Preset Value" msgstr "Rechter presetwaarde" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1595 +msgid "" +"Transfer the selected options from left preset to the right.\n" +"Note: New modified presets will be selected in settings tabs after close " +"this dialog." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1603 +msgid "Save the selected options from left preset to the right." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1621 +msgid "Transfer values from left to right" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1622 +msgid "" +"If enabled, this dialog can be used for transver selected values from left " +"to right preset." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1807 msgid "One of the presets doesn't found" msgstr "Een van de presets niet gevonden" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1818 msgid "Compared presets has different printer technology" msgstr "Vergeleken presets hebben verschillende soorten printers" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1832 msgid "Presets are the same" msgstr "Presets zijn gelijk" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1840 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." @@ -9628,57 +11292,129 @@ msgstr "" "Klik op deze knop om dezelfde preset te selecteren voor de rechter en linker " "preset." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef category" msgstr "Ongedefinieerde categorie" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef group" msgstr "Ongedefinieerde groep" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:2016 +msgid "Modified" +msgstr "Gewijzigd" + +#: src/slic3r/GUI/UpdateDialogs.cpp:41 msgid "Update available" msgstr "Update beschikbaar" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UpdateDialogs.cpp:41 #, c-format, boost-format msgid "New version of %s is available" msgstr "Nieuwe versie van %s beschikbaar" -#: src/slic3r/GUI/UpdateDialogs.cpp:42 +#: src/slic3r/GUI/UpdateDialogs.cpp:46 src/slic3r/GUI/UpdateDialogs.cpp:101 msgid "Current version:" msgstr "Huidige versie:" -#: src/slic3r/GUI/UpdateDialogs.cpp:44 +#: src/slic3r/GUI/UpdateDialogs.cpp:48 src/slic3r/GUI/UpdateDialogs.cpp:103 +#: src/slic3r/GUI/UpdateDialogs.cpp:141 msgid "New version:" msgstr "Nieuwe versie:" -#: src/slic3r/GUI/UpdateDialogs.cpp:52 +#: src/slic3r/GUI/UpdateDialogs.cpp:56 msgid "Changelog & Download" -msgstr "" +msgstr "Wijzigingslogboek downloaden" -#: src/slic3r/GUI/UpdateDialogs.cpp:59 src/slic3r/GUI/UpdateDialogs.cpp:133 -#: src/slic3r/GUI/UpdateDialogs.cpp:191 +#: src/slic3r/GUI/UpdateDialogs.cpp:63 src/slic3r/GUI/UpdateDialogs.cpp:309 +#: src/slic3r/GUI/UpdateDialogs.cpp:367 msgid "Open changelog page" msgstr "Open wijzigingslogboekpagina" -#: src/slic3r/GUI/UpdateDialogs.cpp:65 +#: src/slic3r/GUI/UpdateDialogs.cpp:69 msgid "Open download page" msgstr "Open downloadpagina" -#: src/slic3r/GUI/UpdateDialogs.cpp:72 +#: src/slic3r/GUI/UpdateDialogs.cpp:76 src/slic3r/GUI/UpdateDialogs.cpp:109 msgid "Don't notify about new releases any more" msgstr "Geef geen meldingen over nieuwe versies meer" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +msgid "App Update available" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +#, c-format, boost-format +msgid "" +"New version of %s is available.\n" +"Do you wish to download it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +msgid "App Update download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +#, c-format, boost-format +msgid "New version of %s is available." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:146 +msgid "Run installer after download. (Otherwise file explorer will be opened)" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:151 +msgid "Target directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:158 +msgid "Select directory" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:176 +msgid "Select directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:193 +msgid "Download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:204 +msgid "Directory path is empty." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:212 +msgid "Directory path is incorrect." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:217 +#, boost-format +msgid "Directory %1% doesn't exists. Do you wish to create it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:222 +msgid "Failed to create directory." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:229 +#, boost-format +msgid "File %1% already exists. Do you wish to overwrite it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +#, boost-format +msgid "Download path is %1%. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:270 msgid "Opening Configuration Wizard" msgstr "Configuratiewizard openen" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 src/slic3r/GUI/UpdateDialogs.cpp:261 +#: src/slic3r/GUI/UpdateDialogs.cpp:270 src/slic3r/GUI/UpdateDialogs.cpp:437 msgid "Configuration update" msgstr "Configuratie-update" -#: src/slic3r/GUI/UpdateDialogs.cpp:95 +#: src/slic3r/GUI/UpdateDialogs.cpp:271 msgid "" "PrusaSlicer is not using the newest configuration available.\n" "Configuration Wizard may not offer the latest printers, filaments and SLA " @@ -9688,11 +11424,11 @@ msgstr "" "De configuratiewizard toont niet de nieuwste printers, filamenten en SLA-" "materialen om te installeren." -#: src/slic3r/GUI/UpdateDialogs.cpp:97 +#: src/slic3r/GUI/UpdateDialogs.cpp:273 msgid "Configuration update is available" msgstr "Configuratie-update is beschikbaar" -#: src/slic3r/GUI/UpdateDialogs.cpp:100 +#: src/slic3r/GUI/UpdateDialogs.cpp:276 msgid "" "Would you like to install it?\n" "\n" @@ -9708,28 +11444,28 @@ msgstr "" "\n" "Geüpdatete configuratiebundels:" -#: src/slic3r/GUI/UpdateDialogs.cpp:121 src/slic3r/GUI/UpdateDialogs.cpp:181 +#: src/slic3r/GUI/UpdateDialogs.cpp:297 src/slic3r/GUI/UpdateDialogs.cpp:357 msgid "Comment:" msgstr "Opmerking:" -#: src/slic3r/GUI/UpdateDialogs.cpp:142 +#: src/slic3r/GUI/UpdateDialogs.cpp:318 msgid "Install" msgstr "Installeer" -#: src/slic3r/GUI/UpdateDialogs.cpp:144 +#: src/slic3r/GUI/UpdateDialogs.cpp:320 msgid "Don't install" msgstr "Niet installeren" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 src/slic3r/GUI/UpdateDialogs.cpp:212 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 src/slic3r/GUI/UpdateDialogs.cpp:388 #, c-format, boost-format msgid "%s incompatibility" msgstr "%s incompatibiliteit" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 msgid "You must install a configuration update." msgstr "U moet een configuratie-update installeren." -#: src/slic3r/GUI/UpdateDialogs.cpp:160 +#: src/slic3r/GUI/UpdateDialogs.cpp:336 #, c-format, boost-format msgid "" "%s will now start updates. Otherwise it won't be able to start.\n" @@ -9747,17 +11483,12 @@ msgstr "" "\n" "Geüpdatete configuratiebundels:" -#: src/slic3r/GUI/UpdateDialogs.cpp:200 src/slic3r/GUI/UpdateDialogs.cpp:247 -#, c-format, boost-format -msgid "Exit %s" -msgstr "%s afsluiten" - -#: src/slic3r/GUI/UpdateDialogs.cpp:213 +#: src/slic3r/GUI/UpdateDialogs.cpp:389 #, c-format, boost-format msgid "%s configuration is incompatible" -msgstr "%s configuratie is niet geschikt" +msgstr "%s configuratie is niet compatibel" -#: src/slic3r/GUI/UpdateDialogs.cpp:216 +#: src/slic3r/GUI/UpdateDialogs.cpp:392 #, c-format, boost-format msgid "" "This version of %s is not compatible with currently installed configuration " @@ -9769,7 +11500,7 @@ msgid "" "the initial configuration. Doing so will create a backup snapshot of the " "existing configuration before installing files compatible with this %s." msgstr "" -"Deze versie van %s is niet geschikt voor de huidig geïnstalleerde " +"Deze versie van %s is niet compatibel voor de huidig geïnstalleerde " "configuratiebundels.\n" "Dit kan mogelijk ontstaan als resultaat van het draaien van een ouder %s na " "het gebruik van een nieuwere.\n" @@ -9779,20 +11510,20 @@ msgstr "" "wordt een backup-snapshot gemaakt van de bestaande configuratie voor het " "installeren van bestanden die geschikt zijn voor deze %s." -#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#: src/slic3r/GUI/UpdateDialogs.cpp:401 #, c-format, boost-format msgid "This %s version: %s" msgstr "Deze %s versie: %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:230 +#: src/slic3r/GUI/UpdateDialogs.cpp:406 msgid "Incompatible bundles:" -msgstr "Ongeschikte bundels:" +msgstr "Niet compatibele bundels:" -#: src/slic3r/GUI/UpdateDialogs.cpp:246 +#: src/slic3r/GUI/UpdateDialogs.cpp:422 msgid "Re-configure" msgstr "Herconfigureer" -#: src/slic3r/GUI/UpdateDialogs.cpp:265 +#: src/slic3r/GUI/UpdateDialogs.cpp:441 #, c-format, boost-format msgid "" "%s now uses an updated configuration structure.\n" @@ -9819,28 +11550,37 @@ msgstr "" "Ga verdere met de %s die volgt om de nieuwe presets in te stellen en om te " "kiezen of automatische presets moeten worden ingeschakeld." -#: src/slic3r/GUI/UpdateDialogs.cpp:282 +#: src/slic3r/GUI/UpdateDialogs.cpp:458 msgid "For more information please visit our wiki page:" msgstr "Voor meer informatie kunt u naar onze wiki-pagina gaan:" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 msgid "Configuration updates" msgstr "Configuratie-updates" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 src/slic3r/GUI/UpdateDialogs.cpp:495 msgid "No updates available" msgstr "Geen updates beschikbaar" -#: src/slic3r/GUI/UpdateDialogs.cpp:304 +#: src/slic3r/GUI/UpdateDialogs.cpp:480 #, c-format, boost-format msgid "%s has no configuration updates available." msgstr "%s heeft geen configuratie-updates beschikbaar." -#: src/slic3r/GUI/WipeTowerDialog.cpp:21 +#: src/slic3r/GUI/UpdateDialogs.cpp:495 +msgid "App update" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:500 +#, c-format, boost-format +msgid "%s has no version updates available." +msgstr "" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:23 msgid "Ramming customization" msgstr "Ramming aanpassen" -#: src/slic3r/GUI/WipeTowerDialog.cpp:54 +#: src/slic3r/GUI/WipeTowerDialog.cpp:56 msgid "" "Ramming denotes the rapid extrusion just before a tool change in a single-" "extruder MM printer. Its purpose is to properly shape the end of the " @@ -9863,50 +11603,50 @@ msgstr "" "Dit is een expert-level instelling. Onjuiste aanpassingen kunnen zorgen voor " "verstoppingen en andere problemen." -#: src/slic3r/GUI/WipeTowerDialog.cpp:114 +#: src/slic3r/GUI/WipeTowerDialog.cpp:116 msgid "Total ramming time" msgstr "Totale ramming-tijd" -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 msgid "Total rammed volume" msgstr "Totaal ramming-volume" -#: src/slic3r/GUI/WipeTowerDialog.cpp:120 +#: src/slic3r/GUI/WipeTowerDialog.cpp:122 msgid "Ramming line width" msgstr "Lijnbreedte voor ramming" -#: src/slic3r/GUI/WipeTowerDialog.cpp:122 +#: src/slic3r/GUI/WipeTowerDialog.cpp:124 msgid "Ramming line spacing" msgstr "Lijnafstand voor ramming" -#: src/slic3r/GUI/WipeTowerDialog.cpp:173 +#: src/slic3r/GUI/WipeTowerDialog.cpp:175 msgid "Wipe tower - Purging volume adjustment" msgstr "Afveegblok - afveegvolume aanpassen" -#: src/slic3r/GUI/WipeTowerDialog.cpp:299 +#: src/slic3r/GUI/WipeTowerDialog.cpp:301 msgid "" "Here you can adjust required purging volume (mm³) for any given pair of " "tools." msgstr "" "Hier kunt u het benodigde afveegvolume (mm³) voor elk soort tool aanpassen." -#: src/slic3r/GUI/WipeTowerDialog.cpp:300 +#: src/slic3r/GUI/WipeTowerDialog.cpp:302 msgid "Extruder changed to" msgstr "Extruder veranderd naar" -#: src/slic3r/GUI/WipeTowerDialog.cpp:308 +#: src/slic3r/GUI/WipeTowerDialog.cpp:310 msgid "unloaded" msgstr "ontladen" -#: src/slic3r/GUI/WipeTowerDialog.cpp:309 +#: src/slic3r/GUI/WipeTowerDialog.cpp:311 msgid "loaded" msgstr "geladen" -#: src/slic3r/GUI/WipeTowerDialog.cpp:352 +#: src/slic3r/GUI/WipeTowerDialog.cpp:354 msgid "Tool #" msgstr "Tool #" -#: src/slic3r/GUI/WipeTowerDialog.cpp:361 +#: src/slic3r/GUI/WipeTowerDialog.cpp:363 msgid "" "Total purging volume is calculated by summing two values below, depending on " "which tools are loaded/unloaded." @@ -9914,15 +11654,15 @@ msgstr "" "Totaal afveegvolume dat de som is van de twee onderstaande waarden, " "afhankelijk van welke tools zijn geladen/ontladen." -#: src/slic3r/GUI/WipeTowerDialog.cpp:362 +#: src/slic3r/GUI/WipeTowerDialog.cpp:364 msgid "Volume to purge (mm³) when the filament is being" msgstr "Afveegvolume (mm³) als het filament wordt gebruikt" -#: src/slic3r/GUI/WipeTowerDialog.cpp:376 +#: src/slic3r/GUI/WipeTowerDialog.cpp:378 msgid "From" msgstr "Van" -#: src/slic3r/GUI/WipeTowerDialog.cpp:442 +#: src/slic3r/GUI/WipeTowerDialog.cpp:444 msgid "" "Switching to simple settings will discard changes done in the advanced " "mode!\n" @@ -9934,26 +11674,28 @@ msgstr "" "\n" "Weet u zeker dat u wilt doorgaan?" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show simplified settings" msgstr "Toon eenvoudige instellingen" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show advanced settings" msgstr "Toon geavanceerde instellingen" -#: src/slic3r/GUI/wxExtensions.cpp:644 +#: src/slic3r/GUI/wxExtensions.cpp:672 #, c-format, boost-format msgid "Switch to the %s mode" msgstr "Schakel over naar de %s modus" -#: src/slic3r/GUI/wxExtensions.cpp:645 +#: src/slic3r/GUI/wxExtensions.cpp:673 #, c-format, boost-format msgid "Current mode is %s" msgstr "Huidige modus is: %s" -#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:141 -#: src/slic3r/Utils/Repetier.cpp:69 +#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:206 +#: src/slic3r/Utils/OctoPrint.cpp:255 src/slic3r/Utils/OctoPrint.cpp:666 +#: src/slic3r/Utils/OctoPrint.cpp:824 src/slic3r/Utils/OctoPrint.cpp:897 +#: src/slic3r/Utils/Repetier.cpp:88 #, c-format, boost-format msgid "Mismatched type of print host: %s" msgstr "Onjuist type printhost: %s" @@ -10022,27 +11764,27 @@ msgstr "Opslaan van mesh in 3MF-container mislukt." #: src/slic3r/Utils/FixModelByWin10.cpp:378 msgid "Export of a temporary 3mf file failed" -msgstr "Exporteren van tijdelijk 3MF-bestand mislukt" +msgstr "Exporteren van tijdelijk .3MF-bestand mislukt" #: src/slic3r/Utils/FixModelByWin10.cpp:394 msgid "Import of the repaired 3mf file failed" -msgstr "Importeren van het gerepareerde 3MF-bestand mislukt" +msgstr "Importeren van het gerepareerde .3MF-bestand mislukt" #: src/slic3r/Utils/FixModelByWin10.cpp:396 msgid "Repaired 3MF file does not contain any object" -msgstr "Gerepareerd 3MF-bestand bevat geen object" +msgstr "Gerepareerd .3MF-bestand bevat geen object" #: src/slic3r/Utils/FixModelByWin10.cpp:398 msgid "Repaired 3MF file contains more than one object" -msgstr "Gerepareerd 3MF-bestand bevat meer dan één object" +msgstr "Gerepareerd .3MF-bestand bevat meer dan één object" #: src/slic3r/Utils/FixModelByWin10.cpp:400 msgid "Repaired 3MF file does not contain any volume" -msgstr "Gerepareerd 3MF-bestand bevat geen volume" +msgstr "Gerepareerd .3MF-bestand bevat geen volume" #: src/slic3r/Utils/FixModelByWin10.cpp:402 msgid "Repaired 3MF file contains more than one volume" -msgstr "Gerepareerd 3MF-bestand bevat meer dan één volume" +msgstr "Gerepareerd .3MF-bestand bevat meer dan één volume" #: src/slic3r/Utils/FixModelByWin10.cpp:412 msgid "Model repair finished" @@ -10072,71 +11814,100 @@ msgstr "" "Let op: FlashAir met firmware 2.00.02 (of nieuwer) en een geactiveerde " "upload zijn vereist." -#: src/slic3r/Utils/OctoPrint.cpp:164 +#: src/slic3r/Utils/OctoPrint.cpp:278 msgid "Connection to OctoPrint works correctly." msgstr "Verbinding met OctoPrint werkt naar behoren." -#: src/slic3r/Utils/OctoPrint.cpp:170 +#: src/slic3r/Utils/OctoPrint.cpp:284 msgid "Could not connect to OctoPrint" msgstr "Kan niet verbinden met OctoPrint" -#: src/slic3r/Utils/OctoPrint.cpp:172 +#: src/slic3r/Utils/OctoPrint.cpp:286 msgid "Note: OctoPrint version at least 1.1.0 is required." msgstr "Let op: de minimaal vereiste versie van OctoPrint is 1.1.0." -#: src/slic3r/Utils/OctoPrint.cpp:292 +#: src/slic3r/Utils/OctoPrint.cpp:528 msgid "Connection to Prusa SL1 / SL1S works correctly." msgstr "Verbinding met Prusa SL1 / SL1S werkt naar behoren." -#: src/slic3r/Utils/OctoPrint.cpp:298 +#: src/slic3r/Utils/OctoPrint.cpp:534 msgid "Could not connect to Prusa SLA" msgstr "Kan niet verbinden met Prusa SLA" -#: src/slic3r/Utils/OctoPrint.cpp:336 +#: src/slic3r/Utils/OctoPrint.cpp:573 msgid "Connection to PrusaLink works correctly." msgstr "Verbinding met PrusaLink werkt naar behoren." -#: src/slic3r/Utils/OctoPrint.cpp:342 +#: src/slic3r/Utils/OctoPrint.cpp:579 msgid "Could not connect to PrusaLink" msgstr "Kan niet verbinden met PrusaLink" -#: src/slic3r/Utils/PresetUpdater.cpp:61 +#: src/slic3r/Utils/OctoPrint.cpp:776 +msgid "Storages found:" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "read only" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "no free space" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:781 +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%.%2%" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:64 #, boost-format msgid "Copying of file %1% to %2% failed: %3%" msgstr "Kopiëren van bestand %1% naar %2% mislukt: %3%" -#: src/slic3r/Utils/PresetUpdater.cpp:645 -#: src/slic3r/Utils/PresetUpdater.cpp:662 +#: src/slic3r/Utils/PresetUpdater.cpp:998 +#: src/slic3r/Utils/PresetUpdater.cpp:1015 msgid "Continue and install configuration updates?" msgstr "Doorgaan en configuratie-updates installeren?" -#: src/slic3r/Utils/PresetUpdater.cpp:777 +#: src/slic3r/Utils/PresetUpdater.cpp:1021 +msgid "Installing profiles" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1071 +#, boost-format +msgid "Downloading resources for %1%." +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1171 msgid "" -"Configuration Updates causes a lost of preset modification.\n" +"Configuration Update will cause the preset modification to be lost.\n" "So, check unsaved changes and save them if necessary." msgstr "" -"Configuratie-updates veroorzaken een verlies van preset-aanpassingen.\n" -"Check daarom niet-opgeslagen aanpassingen en sla op indien nodig." -#: src/slic3r/Utils/PresetUpdater.cpp:779 +#: src/slic3r/Utils/PresetUpdater.cpp:1173 msgid "Updating" msgstr "Updaten" -#: src/slic3r/Utils/PresetUpdater.cpp:808 +#: src/slic3r/Utils/PresetUpdater.cpp:1202 #, c-format, boost-format msgid "requires min. %s and max. %s" msgstr "vereist minimaal %s en maximaal %s" -#: src/slic3r/Utils/PresetUpdater.cpp:812 +#: src/slic3r/Utils/PresetUpdater.cpp:1206 #, c-format, boost-format msgid "requires min. %s" msgstr "vereist minimaal %s" -#: src/slic3r/Utils/PresetUpdater.cpp:815 +#: src/slic3r/Utils/PresetUpdater.cpp:1209 #, c-format, boost-format msgid "requires max. %s" msgstr "vereist maximaal %s" +#: src/slic3r/Utils/PresetUpdater.cpp:1362 +#, boost-format +msgid "Couldn't locate idx file %1% when performing updates." +msgstr "" + #: src/slic3r/Utils/Http.cpp:73 msgid "" "Could not detect system SSL certificate store. PrusaSlicer will be unable to " @@ -10170,23 +11941,23 @@ msgstr "" "netwerkverbinding in te stellen. Zie het wijzigingslogboek voor verdere " "details." -#: src/slic3r/Utils/Process.cpp:157 +#: src/slic3r/Utils/Process.cpp:164 msgid "Open G-code file:" -msgstr "Open G-code bestand:" +msgstr "Open .gcode-bestand:" -#: src/slic3r/Utils/Repetier.cpp:84 +#: src/slic3r/Utils/Repetier.cpp:103 msgid "Connection to Repetier works correctly." msgstr "Verbinding met Repetier werkt naar behoren." -#: src/slic3r/Utils/Repetier.cpp:90 +#: src/slic3r/Utils/Repetier.cpp:109 msgid "Could not connect to Repetier" msgstr "Kan niet verbinden met Repetier" -#: src/slic3r/Utils/Repetier.cpp:92 +#: src/slic3r/Utils/Repetier.cpp:111 msgid "Note: Repetier version at least 0.90.0 is required." msgstr "Let op dat minimaal Repetier-versie 0.90.0 is vereist." -#: src/slic3r/Utils/Repetier.cpp:246 +#: src/slic3r/Utils/Repetier.cpp:263 #, boost-format msgid "" "HTTP status: %1%\n" @@ -10195,7 +11966,7 @@ msgstr "" "HTTP-status: %1%\n" "Bericht: \"%2%\"" -#: src/slic3r/Utils/Repetier.cpp:253 +#: src/slic3r/Utils/Repetier.cpp:270 #, boost-format msgid "" "Parsing of host response failed.\n" @@ -10206,7 +11977,7 @@ msgstr "" "Bericht: \"%1%\"\n" "Fout: \"%2%\"" -#: src/slic3r/Utils/Repetier.cpp:266 +#: src/slic3r/Utils/Repetier.cpp:283 #, boost-format msgid "" "Enumeration of host printers failed.\n" @@ -10219,44 +11990,46 @@ msgstr "" #: src/slic3r/Config/Snapshot.cpp:584 msgid "Taking a configuration snapshot failed." -msgstr "" +msgstr "Configuratiesnapshot nemen is mislukt." #: src/slic3r/Config/Snapshot.cpp:598 msgid "" "PrusaSlicer has encountered an error while taking a configuration snapshot." msgstr "" +"PrusaSlicer heeft een fout opgelopen bij het maken van een " +"configuratiesnapshot." #: src/slic3r/Config/Snapshot.cpp:599 msgid "PrusaSlicer error" -msgstr "" +msgstr "PrusaSlicer-fout" #: src/slic3r/Config/Snapshot.cpp:601 msgid "Continue" -msgstr "" +msgstr "Doorgaan" #: src/slic3r/Config/Snapshot.cpp:601 msgid "Abort" -msgstr "" +msgstr "Stoppen" -#: src/libslic3r/GCode.cpp:539 +#: src/libslic3r/GCode.cpp:490 msgid "There is an object with no extrusions in the first layer." msgstr "Er is een object zonder extrusie op de eerste laag." -#: src/libslic3r/GCode.cpp:570 +#: src/libslic3r/GCode.cpp:521 #, boost-format msgid "Empty layer between %1% and %2%." msgstr "Lege lagen tussen %1% en %2%." -#: src/libslic3r/GCode.cpp:573 +#: src/libslic3r/GCode.cpp:524 msgid "(Some lines not shown)" msgstr "(Sommige lijnen niet getoond)" -#: src/libslic3r/GCode.cpp:575 +#: src/libslic3r/GCode.cpp:526 #, boost-format msgid "Object name: %1%" msgstr "Objectnaam: %1%" -#: src/libslic3r/GCode.cpp:576 +#: src/libslic3r/GCode.cpp:527 msgid "" "Make sure the object is printable. This is usually caused by negligibly " "small extrusions or by a faulty model. Try to repair the model or change its " @@ -10266,29 +12039,29 @@ msgstr "" "kleine extrusies of een corrupt model. Probeer het model te repareren of " "verander de oriëntatie op het bed." -#: src/libslic3r/GCode.cpp:718 +#: src/libslic3r/GCode.cpp:669 msgid "Filament Start G-code" msgstr "Filament start-G-code" -#: src/libslic3r/GCode.cpp:725 +#: src/libslic3r/GCode.cpp:676 msgid "Filament End G-code" msgstr "Filament eind-G-code" -#: src/libslic3r/GCode.cpp:764 +#: src/libslic3r/GCode.cpp:717 msgid "In the custom G-code were found reserved keywords:" msgstr "In de custom G-code zijn gereserveerde sleutelwoorden gevonden:" -#: src/libslic3r/GCode.cpp:766 +#: src/libslic3r/GCode.cpp:719 msgid "" "This may cause problems in g-code visualization and printing time estimation." msgstr "" "Dit kan problemen veroorzaken in de visualisatie en printtijdschattingen." -#: src/libslic3r/GCode.cpp:1200 src/libslic3r/GCode.cpp:1211 +#: src/libslic3r/GCode.cpp:1124 src/libslic3r/GCode.cpp:1135 msgid "No extrusions were generated for objects." -msgstr "" +msgstr "Geen extrusies werden gegenereerd voor de objecten." -#: src/libslic3r/GCode.cpp:1406 +#: src/libslic3r/GCode.cpp:1328 msgid "" "Your print is very close to the priming regions. Make sure there is no " "collision." @@ -10296,10 +12069,6 @@ msgstr "" "Uw print is dichtbij de afveeggebieden. Let op dat dit geen botsingen " "veroorzaakt." -#: src/libslic3r/ExtrusionEntity.cpp:344 src/libslic3r/ExtrusionEntity.cpp:380 -msgid "Mixed" -msgstr "Gemengd" - #: src/libslic3r/Flow.cpp:61 #, boost-format msgid "" @@ -10308,16 +12077,16 @@ msgstr "" "Kan de extrusiebreedte niet berekenen voor %1%: Variabele '%2%' niet " "beschikbaar." -#: src/libslic3r/Format/3mf.cpp:1735 +#: src/libslic3r/Format/3mf.cpp:1880 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "" -"Het geselecteerde 3MF-bestand is opgeslagen in een nieuwere versie van %1% " -"en is niet geschikt." +"Het geselecteerde .3MF-bestand is opgeslagen in een nieuwere versie van %1% " +"en is niet compatibel." -#: src/libslic3r/Format/3mf.cpp:1746 +#: src/libslic3r/Format/3mf.cpp:1891 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." @@ -10325,7 +12094,7 @@ msgstr "" "De geselecteerde 3MF bevat een FDM-supports geschilderd object van een " "nieuwere versie van PrusaSlicer en is niet compatibel." -#: src/libslic3r/Format/3mf.cpp:1750 +#: src/libslic3r/Format/3mf.cpp:1895 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." @@ -10333,7 +12102,7 @@ msgstr "" "De geselecteerde 3MF bevat een naadschildering object van een nieuwere " "versie van PrusaSlicer en is niet compatibel." -#: src/libslic3r/Format/3mf.cpp:1754 +#: src/libslic3r/Format/3mf.cpp:1899 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -10341,14 +12110,14 @@ msgstr "" "De geselecteerde 3MF bevat een multi-material geschilderd object van een " "nieuwere versie van PrusaSlicer en is niet compatibel." -#: src/libslic3r/Format/AMF.cpp:993 +#: src/libslic3r/Format/AMF.cpp:1000 #, boost-format msgid "" "The selected amf file has been saved with a newer version of %1% and is not " "compatible." msgstr "" -"Het geselecteerde AMF-bestand is opgeslagen in een nieuwere versie van %1% " -"en is niet geschikt." +"Het geselecteerde .AMF-bestand is opgeslagen in een nieuwere versie van %1% " +"en is niet compatibel." #: src/libslic3r/GCode/PostProcessor.cpp:289 #, boost-format @@ -10363,10 +12132,10 @@ msgid "" msgstr "" "Nabewerkscript %1% gaf een fout.\n" "\n" -"Het nabewerkscript zou de het gcode-bestand %2% moeten aanpassen, maar het " +"Het nabewerkscript zou de het .gcode-bestand %2% moeten aanpassen, maar het " "bestand is verwijderd en waarschijnlijk opgeslagen onder een andere naam.\n" "Pas alstublieft het nabewerkscript aan om de G-code aan te passen en " -"raadpleeg de handleiding over de benoeming van het nabewerkte gcode-" +"raadpleeg de handleiding over de benoeming van het nabewerkte .gcode-" "bestand.\n" #: src/libslic3r/miniz_extension.cpp:91 @@ -10493,28 +12262,34 @@ msgstr "validatie mislukt" msgid "write calledback failed" msgstr "terugschrijven mislukt" -#: src/libslic3r/Print.cpp:454 +#: src/libslic3r/Print.cpp:473 msgid "All objects are outside of the print volume." msgstr "Alle objecten bevinden zich buiten het printvolume." -#: src/libslic3r/Print.cpp:457 +#: src/libslic3r/Print.cpp:476 msgid "The supplied settings will cause an empty print." msgstr "De ingevoerde instellingen resulteren in een lege print." -#: src/libslic3r/Print.cpp:461 +#: src/libslic3r/Print.cpp:480 msgid "Some objects are too close; your extruder will collide with them." msgstr "" "Sommige objecten staan te dicht op elkaar. De extruder zal er tegenaan " "botsen." -#: src/libslic3r/Print.cpp:463 +#: src/libslic3r/Print.cpp:482 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." msgstr "" "Sommige objecten zijn te groot en kunnen niet geprint worden zonder " "botsingen." -#: src/libslic3r/Print.cpp:472 +#: src/libslic3r/Print.cpp:486 +msgid "" +"Avoid crossing perimeters option and avoid crossing curled overhangs option " +"cannot be both enabled together." +msgstr "" + +#: src/libslic3r/Print.cpp:495 msgid "" "Only a single object may be printed at a time in Spiral Vase mode. Either " "remove all but the last object, or enable sequential mode by " @@ -10524,14 +12299,24 @@ msgstr "" "alle objecten op één na, of sta achtereenvolgens printen toe bij " "\"complete_objects\"." -#: src/libslic3r/Print.cpp:476 +#: src/libslic3r/Print.cpp:499 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." msgstr "" "De spiraalmodus kan alleen gebruikt worden met enkel-materiaal objecten." -#: src/libslic3r/Print.cpp:489 +#: src/libslic3r/Print.cpp:523 +msgid "" +"The print is taller than the maximum allowed height. You might want to " +"reduce the size of your model or change current print settings and retry." +msgstr "" + +#: src/libslic3r/Print.cpp:540 +msgid "Variable layer height is not supported with Organic supports." +msgstr "" + +#: src/libslic3r/Print.cpp:553 msgid "" "The wipe tower is only supported if all extruders have the same nozzle " "diameter and use filaments of the same diameter." @@ -10539,7 +12324,7 @@ msgstr "" "Het afveegblok wordt alleen ondersteunt als alle extruders dezelfde nozzle- " "en filamentdiameter hebben." -#: src/libslic3r/Print.cpp:495 +#: src/libslic3r/Print.cpp:559 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, " "RepRapFirmware and Repetier G-code flavors." @@ -10547,7 +12332,7 @@ msgstr "" "Het afveegblok wordt alleen ondersteunt voor Marlin, RepRap/Sprinter, " "RepRapFirmware en Repetier firmwaretypes." -#: src/libslic3r/Print.cpp:497 +#: src/libslic3r/Print.cpp:561 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." @@ -10555,19 +12340,20 @@ msgstr "" "Het afveegblok wordt alleen ondersteunt met de relatieve extruderinstelling " "('use_relative_e_distances' = 1)." -#: src/libslic3r/Print.cpp:499 -msgid "Ooze prevention is currently not supported with the wipe tower enabled." +#: src/libslic3r/Print.cpp:563 +msgid "" +"Ooze prevention is only supported with the wipe tower when " +"'single_extruder_multi_material' is off." msgstr "" -"Druippreventie wordt niet ondersteund als het afveegblok is geactiveerd." -#: src/libslic3r/Print.cpp:501 +#: src/libslic3r/Print.cpp:565 msgid "" "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." msgstr "" "Het afveegblok niet ondersteunt bij volumetrische extrusiewaarden " "('use_volumetric_e' = 0)." -#: src/libslic3r/Print.cpp:503 +#: src/libslic3r/Print.cpp:567 msgid "" "The Wipe Tower is currently not supported for multimaterial sequential " "prints." @@ -10575,7 +12361,7 @@ msgstr "" "Het afveegblok wordt momenteel niet ondersteund voor multi-materiaal " "achtereenvolgens printen." -#: src/libslic3r/Print.cpp:524 +#: src/libslic3r/Print.cpp:577 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " "layer heights" @@ -10583,7 +12369,7 @@ msgstr "" "Het afveegblok wordt alleen ondersteunt voor meerdere objecten als deze een " "gelijke laagdikte hebben" -#: src/libslic3r/Print.cpp:526 +#: src/libslic3r/Print.cpp:579 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "over an equal number of raft layers" @@ -10591,7 +12377,7 @@ msgstr "" "Het afveegblok wordt alleen ondersteunt voor meerdere objecten als deze op " "een gelijk aantal raftlagen zijn geplaatst" -#: src/libslic3r/Print.cpp:529 +#: src/libslic3r/Print.cpp:582 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "with the same support_material_contact_distance" @@ -10599,7 +12385,7 @@ msgstr "" "Het afveegblok wordt alleen ondersteunt voor meerdere objecten als de " "instelling 'support_material_contact_distance' gelijk staat" -#: src/libslic3r/Print.cpp:531 +#: src/libslic3r/Print.cpp:584 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." @@ -10607,7 +12393,7 @@ msgstr "" "Het afveegblok wordt alleen ondersteunt voor meerdere objecten als ze " "tegelijk gesliced worden." -#: src/libslic3r/Print.cpp:555 +#: src/libslic3r/Print.cpp:609 msgid "" "The Wipe tower is only supported if all objects have the same variable layer " "height" @@ -10615,24 +12401,24 @@ msgstr "" "Het afveegblok wordt alleen ondersteunt als alle objecten dezelfde variabele " "laagdikte hebben" -#: src/libslic3r/Print.cpp:579 +#: src/libslic3r/Print.cpp:633 msgid "" "One or more object were assigned an extruder that the printer does not have." msgstr "" "Een of meer objecten staan ingesteld op een extruder die de printer niet " "heeft." -#: src/libslic3r/Print.cpp:592 +#: src/libslic3r/Print.cpp:646 #, boost-format msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" msgstr "%1%=%2% mm is te weinig om te printen bij een laagdikte van %3% mm" -#: src/libslic3r/Print.cpp:595 +#: src/libslic3r/Print.cpp:649 #, boost-format msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" msgstr "Te veel %1%=%2% mm om te printen met een nozzlediameter van %3% mm" -#: src/libslic3r/Print.cpp:606 +#: src/libslic3r/Print.cpp:660 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " @@ -10644,7 +12430,7 @@ msgstr "" "dezelfde diameter hebben ('support_material_extruder' = 0 of " "'support_material_interface_extruder' = 0)." -#: src/libslic3r/Print.cpp:614 +#: src/libslic3r/Print.cpp:668 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers " "need to be synchronized with the object layers." @@ -10652,66 +12438,114 @@ msgstr "" "Om het afveegblok te laten samenwerken met oplosbare support, moeten de " "supportlagen gesynchroniseerd worden met de objectlagen." -#: src/libslic3r/Print.cpp:618 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only if they are " -"printed with the current extruder without triggering a tool change. (both " -"support_material_extruder and support_material_interface_extruder need to be " -"set to 0)." -msgstr "" -"Het afveegblok ondersteunt alleen niet-oplosbaar support als dat geprint " -"worden met de huidige extruder zonder toolwissel (Zet zowel " -"'support_material_extruder' en 'support_material_interface_extruder' op 0)." - -#: src/libslic3r/Print.cpp:654 +#: src/libslic3r/Print.cpp:708 msgid "First layer height can't be greater than nozzle diameter" msgstr "" "Laagdikte van de eerste laag kan niet groter zijn dan de nozzlediameter" -#: src/libslic3r/Print.cpp:659 +#: src/libslic3r/Print.cpp:713 msgid "Layer height can't be greater than nozzle diameter" msgstr "Laagdikte kan niet groter zijn dan de nozzlediameter" -#: src/libslic3r/Print.cpp:680 +#: src/libslic3r/Print.cpp:734 msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " "layer_gcode." msgstr "" +"Relatieve extruderwaarden vereist het resetten van de extruderpositie op " +"elke laag om decimale onnauwkeurigheid te voorkomen. Voeg \"G92 E0\" toe aan " +"layer_gcode." + +#: src/libslic3r/Print.cpp:736 +msgid "" +"\"G92 E0\" was found in before_layer_gcode, which is incompatible with " +"absolute extruder addressing." +msgstr "" +"\"G92 E0\" gevonden in before_layer_gcode, wat niet compatibel is met " +"absolute positionering." + +#: src/libslic3r/Print.cpp:738 +msgid "" +"\"G92 E0\" was found in layer_gcode, which is incompatible with absolute " +"extruder addressing." +msgstr "" +"\"G92 E0\" gevonden in layer_gcode, wat niet compatibel is met absolute " +"positionering." + +#: src/libslic3r/Print.cpp:880 +msgid "Infilling layers" +msgstr "Vullingslagen" + +#: src/libslic3r/Print.cpp:908 +msgid "Generating skirt and brim" +msgstr "Genereer skirt en brim" + +#: src/libslic3r/Print.cpp:956 +msgid "Exporting G-code" +msgstr "G-code exporteren" + +#: src/libslic3r/Print.cpp:960 +msgid "Generating G-code" +msgstr "G-code genereren" + +#: src/libslic3r/Print.cpp:1169 +msgid "Alert if supports needed" +msgstr "" + +#: src/libslic3r/Print.cpp:1174 +msgid "long bridging extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1175 +msgid "floating bridge anchors" +msgstr "" + +#: src/libslic3r/Print.cpp:1178 +msgid "collapsing overhang" +msgstr "" + +#: src/libslic3r/Print.cpp:1180 +msgid "loose extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1183 +msgid "low bed adhesion" +msgstr "" -#: src/libslic3r/Print.cpp:682 -msgid "" -"\"G92 E0\" was found in before_layer_gcode, which is incompatible with " -"absolute extruder addressing." +#: src/libslic3r/Print.cpp:1184 +msgid "floating object part" msgstr "" -#: src/libslic3r/Print.cpp:684 -msgid "" -"\"G92 E0\" was found in layer_gcode, which is incompatible with absolute " -"extruder addressing." +#: src/libslic3r/Print.cpp:1185 +msgid "thin fragile section" msgstr "" -#: src/libslic3r/Print.cpp:826 -msgid "Infilling layers" -msgstr "Vullingslagen" +#: src/libslic3r/Print.cpp:1221 +msgid "Detected print stability issues" +msgstr "" -#: src/libslic3r/Print.cpp:848 -msgid "Generating skirt and brim" -msgstr "Genereer skirt en brim" +#: src/libslic3r/Print.cpp:1247 +msgid "or" +msgstr "" -#: src/libslic3r/Print.cpp:896 -msgid "Exporting G-code" -msgstr "G-code exporteren" +#: src/libslic3r/Print.cpp:1247 +msgid "and" +msgstr "" -#: src/libslic3r/Print.cpp:900 -msgid "Generating G-code" -msgstr "G-code genereren" +#: src/libslic3r/Print.cpp:1247 +msgid "brim" +msgstr "" + +#: src/libslic3r/Print.cpp:1248 +msgid "Consider enabling supports" +msgstr "" #: src/libslic3r/SLA/Pad.cpp:533 msgid "Pad brim size is too small for the current configuration." msgstr "Brimgrootte is te klein voor de huidige configuratie." -#: src/libslic3r/SLAPrint.cpp:628 +#: src/libslic3r/SLAPrint.cpp:546 msgid "" "Cannot proceed without support points! Add support points or disable support " "generation." @@ -10719,7 +12553,7 @@ msgstr "" "Kan niet doorgaan zonder supportpunten! Voeg supportpunten toe of schakel " "supportgeneratie uit." -#: src/libslic3r/SLAPrint.cpp:640 +#: src/libslic3r/SLAPrint.cpp:558 msgid "" "Elevation is too low for object. Use the \"Pad around object\" feature to " "print the object without elevation." @@ -10727,7 +12561,7 @@ msgstr "" "Verhoging is te klein voor het object. Gebruik de 'Basisplaat rondom object'-" "optie om het object zonder verhoging te printen." -#: src/libslic3r/SLAPrint.cpp:646 +#: src/libslic3r/SLAPrint.cpp:564 msgid "" "The endings of the support pillars will be deployed on the gap between the " "object and the pad. 'Support base safety distance' has to be greater than " @@ -10737,69 +12571,69 @@ msgstr "" "de basisplaat. De instelling 'Veilige afstand voor supportbasis' moet groter " "zijn dan de 'Basisplaat-objectgat'-parameter hiervoor." -#: src/libslic3r/SLAPrint.cpp:661 +#: src/libslic3r/SLAPrint.cpp:579 msgid "Exposition time is out of printer profile bounds." msgstr "De belichtingstijd valt buiten de grenzen van het printerprofiel." -#: src/libslic3r/SLAPrint.cpp:668 +#: src/libslic3r/SLAPrint.cpp:586 msgid "Initial exposition time is out of printer profile bounds." msgstr "Initiële belichtingstijd valt buiten de printerprofielgrenzen." -#: src/libslic3r/SLAPrint.cpp:784 +#: src/libslic3r/SLAPrint.cpp:693 msgid "Slicing done" msgstr "Slicen voltooid" -#: src/libslic3r/SLAPrintSteps.cpp:47 +#: src/libslic3r/SLAPrintSteps.cpp:57 +msgid "Assembling model from parts" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:58 msgid "Hollowing model" msgstr "Model uithollen" -#: src/libslic3r/SLAPrintSteps.cpp:48 +#: src/libslic3r/SLAPrintSteps.cpp:59 msgid "Drilling holes into model." msgstr "Afvoergaten toevoegen." -#: src/libslic3r/SLAPrintSteps.cpp:49 +#: src/libslic3r/SLAPrintSteps.cpp:60 msgid "Slicing model" msgstr "Model slicen" -#: src/libslic3r/SLAPrintSteps.cpp:50 src/libslic3r/SLAPrintSteps.cpp:639 +#: src/libslic3r/SLAPrintSteps.cpp:61 src/libslic3r/SLAPrintSteps.cpp:691 msgid "Generating support points" msgstr "Supportpunten genereren" -#: src/libslic3r/SLAPrintSteps.cpp:51 +#: src/libslic3r/SLAPrintSteps.cpp:62 msgid "Generating support tree" msgstr "Supportboom genereren" -#: src/libslic3r/SLAPrintSteps.cpp:52 +#: src/libslic3r/SLAPrintSteps.cpp:63 msgid "Generating pad" msgstr "Basisplaat genereren" -#: src/libslic3r/SLAPrintSteps.cpp:53 +#: src/libslic3r/SLAPrintSteps.cpp:64 msgid "Slicing supports" msgstr "Support slicen" -#: src/libslic3r/SLAPrintSteps.cpp:68 +#: src/libslic3r/SLAPrintSteps.cpp:79 msgid "Merging slices and calculating statistics" msgstr "Slices samenvoegen en statistieken berekenen" -#: src/libslic3r/SLAPrintSteps.cpp:69 +#: src/libslic3r/SLAPrintSteps.cpp:80 msgid "Rasterizing layers" msgstr "Lagen roosteren" -#: src/libslic3r/SLAPrintSteps.cpp:435 -msgid "Too many overlapping holes." -msgstr "Te veel overlappende gaten." - -#: src/libslic3r/SLAPrintSteps.cpp:442 +#: src/libslic3r/SLAPrintSteps.cpp:255 msgid "" "Mesh to be hollowed is not suitable for hollowing (does not bound a volume)." msgstr "Mesh uithollen is niet geschikt voor dit model (heeft geen volume)." -#: src/libslic3r/SLAPrintSteps.cpp:450 +#: src/libslic3r/SLAPrintSteps.cpp:262 msgid "Unable to drill the current configuration of holes into the model." msgstr "" "Niet mogelijk om de huidige configuratie van gaten te maken in het model." -#: src/libslic3r/SLAPrintSteps.cpp:470 +#: src/libslic3r/SLAPrintSteps.cpp:271 msgid "" "Drilling holes into the mesh failed. This is usually caused by broken model. " "Try to fix it first." @@ -10807,28 +12641,35 @@ msgstr "" "Afvoergaten toevoegen mislukt. Dit komt meestal door een incorrect model. " "Probeer die eerst te repareren." -#: src/libslic3r/SLAPrintSteps.cpp:476 +#: src/libslic3r/SLAPrintSteps.cpp:279 msgid "Failed to drill some holes into the model" msgstr "Gaten maken in het model is mislukt" -#: src/libslic3r/SLAPrintSteps.cpp:520 +#: src/libslic3r/SLAPrintSteps.cpp:289 +msgid "" +"Can't perform full mesh booleans! Some parts of the print will be previewed " +"with approximated meshes. This does not affect the quality of slices or the " +"physical print in any way." +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:510 msgid "" "Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "" "Slicen moest gestopt worden door een interne fout: inconsistente slice-index." -#: src/libslic3r/SLAPrintSteps.cpp:691 src/libslic3r/SLAPrintSteps.cpp:700 -#: src/libslic3r/SLAPrintSteps.cpp:738 +#: src/libslic3r/SLAPrintSteps.cpp:740 src/libslic3r/SLAPrintSteps.cpp:749 +#: src/libslic3r/SLAPrintSteps.cpp:787 msgid "Visualizing supports" msgstr "Visualiseer support" -#: src/libslic3r/SLAPrintSteps.cpp:730 +#: src/libslic3r/SLAPrintSteps.cpp:779 msgid "No pad can be generated for this model with the current configuration" msgstr "" "Met de huidige configuratie kan voor dit model geen basisplaat gegenereerd " "worden" -#: src/libslic3r/SLAPrintSteps.cpp:854 +#: src/libslic3r/SLAPrintSteps.cpp:908 msgid "" "There are unprintable objects. Try to adjust support settings to make the " "objects printable." @@ -10840,27 +12681,27 @@ msgstr "" msgid "Failed processing of the output_filename_format template." msgstr "Verwerken van de 'output_filename_format'-template mislukt." -#: src/libslic3r/PrintConfig.cpp:236 src/libslic3r/PrintConfig.cpp:237 +#: src/libslic3r/PrintConfig.cpp:254 src/libslic3r/PrintConfig.cpp:255 msgid "Printer technology" msgstr "Printtechnologie" -#: src/libslic3r/PrintConfig.cpp:244 +#: src/libslic3r/PrintConfig.cpp:260 msgid "Bed shape" msgstr "Bedvorm" -#: src/libslic3r/PrintConfig.cpp:249 +#: src/libslic3r/PrintConfig.cpp:265 msgid "Bed custom texture" msgstr "Custom bedtextuur" -#: src/libslic3r/PrintConfig.cpp:254 +#: src/libslic3r/PrintConfig.cpp:270 msgid "Bed custom model" msgstr "Custom bedmodel" -#: src/libslic3r/PrintConfig.cpp:259 +#: src/libslic3r/PrintConfig.cpp:275 msgid "Elephant foot compensation" msgstr "Squish-compensatie" -#: src/libslic3r/PrintConfig.cpp:261 +#: src/libslic3r/PrintConfig.cpp:277 msgid "" "The first layer will be shrunk in the XY plane by the configured value to " "compensate for the 1st layer squish aka an Elephant Foot effect." @@ -10868,29 +12709,31 @@ msgstr "" "De eerste laag wordt verkleind in horizontale richting met de ingestelde " "waarde ter compensatie van het platdrukken." -#: src/libslic3r/PrintConfig.cpp:269 +#: src/libslic3r/PrintConfig.cpp:285 msgid "G-code thumbnails" msgstr "G-code miniaturen" -#: src/libslic3r/PrintConfig.cpp:270 +#: src/libslic3r/PrintConfig.cpp:286 msgid "" "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " "following format: \"XxY, XxY, ...\"" msgstr "" -"Afbeeldingsgrootte wordt opgeslagen in de .gcode en .sl1 / .sl1s bestanden " -"in het formaat: \"XxY, XxY, ...\"" +"Afbeeldingsgrootte wordt opgeslagen in de .gcode en .sl1/.sl1s-bestanden in " +"het formaat: \"XxY, XxY, ...\"" -#: src/libslic3r/PrintConfig.cpp:276 +#: src/libslic3r/PrintConfig.cpp:292 msgid "Format of G-code thumbnails" -msgstr "" +msgstr "Bestandstype van G-code-voorbeelden" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:293 msgid "" "Format of G-code thumbnails: PNG for best quality, JPG for smallest size, " "QOI for low memory firmware" msgstr "" +"Bestandstype van G-code-voorbeelden: PNG voor de beste kwaliteit, JPG voor " +"kleinste bestand, QOI voor firmware met weinig geheugen" -#: src/libslic3r/PrintConfig.cpp:288 +#: src/libslic3r/PrintConfig.cpp:301 msgid "" "This setting controls the height (and thus the total number) of the slices/" "layers. Thinner layers give better accuracy but take more time to print." @@ -10898,22 +12741,22 @@ msgstr "" "Deze instelling is voor de laagdikte (en dus het totaal aantal lagen). " "Dunnere lagen geven een betere nauwkeurigheid, maar het printen duurt langer." -#: src/libslic3r/PrintConfig.cpp:295 +#: src/libslic3r/PrintConfig.cpp:308 msgid "Max print height" msgstr "Maximale printhoogte" -#: src/libslic3r/PrintConfig.cpp:296 +#: src/libslic3r/PrintConfig.cpp:309 msgid "" "Set this to the maximum height that can be reached by your extruder while " "printing." msgstr "" "Stel dit in als maximale hoogte die bereikt kan worden door de printer." -#: src/libslic3r/PrintConfig.cpp:304 +#: src/libslic3r/PrintConfig.cpp:317 msgid "Hostname, IP or URL" msgstr "Hostnaam, IP of URL" -#: src/libslic3r/PrintConfig.cpp:305 +#: src/libslic3r/PrintConfig.cpp:318 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the hostname, IP address or URL of the printer host instance. Print host " @@ -10921,29 +12764,29 @@ msgid "" "name and password into the URL in the following format: https://username:" "password@your-octopi-address/" msgstr "" -"PrusaSlicer kan G-code-bestanden uploaden naar een printerhost. Dit tekstvak " +"PrusaSlicer kan .gcode-bestanden uploaden naar een printerhost. Dit tekstvak " "bevat de hostnaam, IP-adres of URL van de printerhostinstantie. Als de " "printerhost achter HAProxy met basis-authorisatie aan staat, kan toegang " "worden verkregen door gebruikersnaam en wachtwoord in te voeren in bij de " "URL in de vorm: https://gebruikersnaam:wachtwoord@je-octopi-adres/" -#: src/libslic3r/PrintConfig.cpp:314 +#: src/libslic3r/PrintConfig.cpp:327 msgid "API Key / Password" msgstr "API-key / wachtwoord" -#: src/libslic3r/PrintConfig.cpp:315 +#: src/libslic3r/PrintConfig.cpp:328 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the API Key or the password required for authentication." msgstr "" -"PrusaSlicer kan gcode-bestanden naar een printerhost uploaden. Dit veld moet " -"de API-key of het wachtwoord voor authenticatie bevatten." +"PrusaSlicer kan .gcode-bestanden naar een printerhost uploaden. Dit veld " +"moet de API-key of het wachtwoord voor authenticatie bevatten." -#: src/libslic3r/PrintConfig.cpp:323 +#: src/libslic3r/PrintConfig.cpp:336 msgid "Name of the printer" msgstr "Naam van de printer" -#: src/libslic3r/PrintConfig.cpp:331 +#: src/libslic3r/PrintConfig.cpp:344 msgid "" "Custom CA certificate file can be specified for HTTPS OctoPrint connections, " "in crt/pem format. If left blank, the default OS CA certificate repository " @@ -10953,15 +12796,15 @@ msgstr "" "OctoPrint verbindingen in CRT/PEM-formaat. Als er niets wordt ingevuld, " "wordt de standaard OS-CA-certificaatopslaglocatie gebruikt." -#: src/libslic3r/PrintConfig.cpp:347 +#: src/libslic3r/PrintConfig.cpp:360 msgid "Password" msgstr "Wachtwoord" -#: src/libslic3r/PrintConfig.cpp:355 +#: src/libslic3r/PrintConfig.cpp:368 msgid "Ignore HTTPS certificate revocation checks" msgstr "Negeer HTTPS-certificaat herroepingscontrole" -#: src/libslic3r/PrintConfig.cpp:356 +#: src/libslic3r/PrintConfig.cpp:369 msgid "" "Ignore HTTPS certificate revocation checks in case of missing or offline " "distribution points. One may want to enable this option for self signed " @@ -10971,31 +12814,43 @@ msgstr "" "offline distributiepunten. U kunt dit aanzetten voor zelf-gesigneerde " "certificaten als de verbinding mislukt." -#: src/libslic3r/PrintConfig.cpp:363 +#: src/libslic3r/PrintConfig.cpp:376 msgid "Printer preset names" msgstr "Printerpresetnamen" -#: src/libslic3r/PrintConfig.cpp:364 +#: src/libslic3r/PrintConfig.cpp:377 msgid "Names of presets related to the physical printer" msgstr "Namen van de presets gerelateerd aan de fysieke printer" -#: src/libslic3r/PrintConfig.cpp:369 +#: src/libslic3r/PrintConfig.cpp:382 msgid "Authorization Type" msgstr "Authorisatietype" -#: src/libslic3r/PrintConfig.cpp:374 +#: src/libslic3r/PrintConfig.cpp:385 msgid "API key" msgstr "API-sleutel" -#: src/libslic3r/PrintConfig.cpp:375 +#: src/libslic3r/PrintConfig.cpp:386 msgid "HTTP digest" -msgstr "HTTP authenticatie" +msgstr "HTTP weergave" + +#: src/libslic3r/PrintConfig.cpp:406 +msgid "Avoid crossing curled overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:407 +msgid "" +"Plan travel moves such that the extruder avoids areas where the filament may " +"be curled up. This is mostly happening on steeper rounded overhangs and may " +"cause a crash with the nozzle. This feature slows down both the print and " +"the G-code generation." +msgstr "" -#: src/libslic3r/PrintConfig.cpp:395 +#: src/libslic3r/PrintConfig.cpp:414 msgid "Avoid crossing perimeters" msgstr "Vermijd kruisende perimeters" -#: src/libslic3r/PrintConfig.cpp:396 +#: src/libslic3r/PrintConfig.cpp:415 msgid "" "Optimize travel moves in order to minimize the crossing of perimeters. This " "is mostly useful with Bowden extruders which suffer from oozing. This " @@ -11005,11 +12860,11 @@ msgstr "" "handig bij bowden-extruders die gevoelig zijn voor druipen. Deze aanpassing " "vertraagd zowel de print als de G-code-generatie." -#: src/libslic3r/PrintConfig.cpp:403 +#: src/libslic3r/PrintConfig.cpp:422 msgid "Avoid crossing perimeters - Max detour length" msgstr "Vermijd kruisende perimeters - maximale omleidingslengte" -#: src/libslic3r/PrintConfig.cpp:405 +#: src/libslic3r/PrintConfig.cpp:424 msgid "" "The maximum detour length for avoid crossing perimeters. If the detour is " "longer than this value, avoid crossing perimeters is not applied for this " @@ -11022,15 +12877,15 @@ msgstr "" "een absolute waarde of als percentage (bijv. 50%) van een rechtlijnige " "beweging." -#: src/libslic3r/PrintConfig.cpp:408 +#: src/libslic3r/PrintConfig.cpp:427 msgid "mm or % (zero to disable)" msgstr "mm of % (stel in op 0 om uit te zetten)" -#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:2839 +#: src/libslic3r/PrintConfig.cpp:434 src/libslic3r/PrintConfig.cpp:2927 msgid "Other layers" msgstr "Overige lagen" -#: src/libslic3r/PrintConfig.cpp:416 +#: src/libslic3r/PrintConfig.cpp:435 msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." @@ -11038,11 +12893,11 @@ msgstr "" "Bedtemperatuur voor lagen na de eerste laag. Als dit ingesteld is op 0, " "worden bedverwarmingscommando's uitgezet." -#: src/libslic3r/PrintConfig.cpp:419 +#: src/libslic3r/PrintConfig.cpp:438 msgid "Bed temperature" msgstr "Bedtemperatuur" -#: src/libslic3r/PrintConfig.cpp:426 +#: src/libslic3r/PrintConfig.cpp:445 msgid "" "This custom code is inserted at every layer change, right before the Z move. " "Note that you can use placeholder variables for all Slic3r settings as well " @@ -11052,11 +12907,11 @@ msgstr "" "beweging. U kunt hier variabelen gebruiken voor alle instellingen zoals " "'layer_num' en 'layer_z'." -#: src/libslic3r/PrintConfig.cpp:436 +#: src/libslic3r/PrintConfig.cpp:455 msgid "Between objects G-code" msgstr "G-code die komt tussen objecten" -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:456 msgid "" "This code is inserted between objects when using sequential printing. By " "default extruder and bed temperature are reset using non-wait command; " @@ -11071,15 +12926,15 @@ msgstr "" "gedetecteerd zal PrusaSlicer deze commando's niet meenemen. Merk op dat " "variabelen voor alle instellingen gebruikt kunnen worden." -#: src/libslic3r/PrintConfig.cpp:448 +#: src/libslic3r/PrintConfig.cpp:467 msgid "Number of solid layers to generate on bottom surfaces." msgstr "Aantal te genereren dichte lagen voor ondervlakken." -#: src/libslic3r/PrintConfig.cpp:449 +#: src/libslic3r/PrintConfig.cpp:468 msgid "Bottom solid layers" msgstr "Dichte bodemlagen" -#: src/libslic3r/PrintConfig.cpp:457 +#: src/libslic3r/PrintConfig.cpp:476 msgid "" "The number of bottom solid layers is increased above bottom_solid_layers if " "necessary to satisfy minimum thickness of bottom shell." @@ -11087,15 +12942,15 @@ msgstr "" "Het aantal dichte bodemlagen wordt verhoogd als blijkt dat het nodig is om " "de minimale bodemshelldikte te garanderen." -#: src/libslic3r/PrintConfig.cpp:459 +#: src/libslic3r/PrintConfig.cpp:478 msgid "Minimum bottom shell thickness" msgstr "Minimale shelldikte aan de onderzijde" -#: src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:484 msgid "Bridge" msgstr "Brug" -#: src/libslic3r/PrintConfig.cpp:466 +#: src/libslic3r/PrintConfig.cpp:485 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." @@ -11103,21 +12958,21 @@ msgstr "" "Deze acceleratie zal uw printer gebruiken voor bruggen. Als dit ingesteld is " "op 0, wordt de acceleratie-instelling voor bruggen uitgezet." -#: src/libslic3r/PrintConfig.cpp:468 src/libslic3r/PrintConfig.cpp:639 -#: src/libslic3r/PrintConfig.cpp:1192 src/libslic3r/PrintConfig.cpp:1201 -#: src/libslic3r/PrintConfig.cpp:1401 src/libslic3r/PrintConfig.cpp:1410 -#: src/libslic3r/PrintConfig.cpp:1419 src/libslic3r/PrintConfig.cpp:1713 -#: src/libslic3r/PrintConfig.cpp:1764 src/libslic3r/PrintConfig.cpp:1775 -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1983 -#: src/libslic3r/PrintConfig.cpp:1991 +#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:1252 src/libslic3r/PrintConfig.cpp:1261 +#: src/libslic3r/PrintConfig.cpp:1447 src/libslic3r/PrintConfig.cpp:1456 +#: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1750 +#: src/libslic3r/PrintConfig.cpp:1801 src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1822 src/libslic3r/PrintConfig.cpp:2013 +#: src/libslic3r/PrintConfig.cpp:2021 msgid "mm/s²" msgstr "mm/s²" -#: src/libslic3r/PrintConfig.cpp:474 +#: src/libslic3r/PrintConfig.cpp:493 msgid "Bridging angle" msgstr "Brughoek" -#: src/libslic3r/PrintConfig.cpp:476 +#: src/libslic3r/PrintConfig.cpp:495 msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for all " @@ -11127,35 +12982,30 @@ msgstr "" "automatisch berekend, anders wordt de opgegeven hoek voor alle bruggen " "gebruikt. 180° staat gelijk aan 0°." -#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:1102 -#: src/libslic3r/PrintConfig.cpp:2282 src/libslic3r/PrintConfig.cpp:2292 -#: src/libslic3r/PrintConfig.cpp:2583 src/libslic3r/PrintConfig.cpp:2824 -#: src/libslic3r/PrintConfig.cpp:3041 src/libslic3r/PrintConfig.cpp:3144 -#: src/libslic3r/PrintConfig.cpp:3698 src/libslic3r/PrintConfig.cpp:3819 -msgid "°" -msgstr "°" - -#: src/libslic3r/PrintConfig.cpp:485 +#: src/libslic3r/PrintConfig.cpp:504 msgid "Bridges fan speed" msgstr "Ventilatorsnelheid voor bruggen" -#: src/libslic3r/PrintConfig.cpp:486 +#: src/libslic3r/PrintConfig.cpp:505 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "Deze ventilatorsnelheid wordt aangehouden bij bruggen en overhanging." -#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:1114 -#: src/libslic3r/PrintConfig.cpp:1601 src/libslic3r/PrintConfig.cpp:1793 -#: src/libslic3r/PrintConfig.cpp:1856 src/libslic3r/PrintConfig.cpp:2115 -#: src/libslic3r/PrintConfig.cpp:2174 src/libslic3r/PrintConfig.cpp:3323 -#: src/libslic3r/PrintConfig.cpp:3612 src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:596 +#: src/libslic3r/PrintConfig.cpp:605 src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:623 src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1893 src/libslic3r/PrintConfig.cpp:2145 +#: src/libslic3r/PrintConfig.cpp:2204 src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3369 src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3870 msgid "%" msgstr "%" -#: src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:513 msgid "Bridge flow ratio" msgstr "Brugextrusieverhouding" -#: src/libslic3r/PrintConfig.cpp:496 +#: src/libslic3r/PrintConfig.cpp:515 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -11167,33 +13017,91 @@ msgstr "" "voorkomen. Hoewel de systeemwaarden goed zijn, kan geëxperimenteerd worden " "met de koeling voor dit aangepast wordt." -#: src/libslic3r/PrintConfig.cpp:506 +#: src/libslic3r/PrintConfig.cpp:525 msgid "Bridges" msgstr "Bruggen" -#: src/libslic3r/PrintConfig.cpp:508 +#: src/libslic3r/PrintConfig.cpp:527 msgid "Speed for printing bridges." msgstr "Printsnelheid voor bruggen." -#: src/libslic3r/PrintConfig.cpp:509 src/libslic3r/PrintConfig.cpp:920 -#: src/libslic3r/PrintConfig.cpp:928 src/libslic3r/PrintConfig.cpp:937 -#: src/libslic3r/PrintConfig.cpp:945 src/libslic3r/PrintConfig.cpp:972 -#: src/libslic3r/PrintConfig.cpp:991 src/libslic3r/PrintConfig.cpp:1329 -#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1620 -#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1730 -#: src/libslic3r/PrintConfig.cpp:1742 src/libslic3r/PrintConfig.cpp:1752 -#: src/libslic3r/PrintConfig.cpp:1815 src/libslic3r/PrintConfig.cpp:1874 -#: src/libslic3r/PrintConfig.cpp:2022 src/libslic3r/PrintConfig.cpp:2249 -#: src/libslic3r/PrintConfig.cpp:2258 src/libslic3r/PrintConfig.cpp:2789 -#: src/libslic3r/PrintConfig.cpp:2939 src/libslic3r/PrintConfig.cpp:2949 +#: src/libslic3r/PrintConfig.cpp:528 src/libslic3r/PrintConfig.cpp:1009 +#: src/libslic3r/PrintConfig.cpp:1017 src/libslic3r/PrintConfig.cpp:1026 +#: src/libslic3r/PrintConfig.cpp:1034 src/libslic3r/PrintConfig.cpp:1061 +#: src/libslic3r/PrintConfig.cpp:1080 src/libslic3r/PrintConfig.cpp:1386 +#: src/libslic3r/PrintConfig.cpp:1579 src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1733 src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1779 src/libslic3r/PrintConfig.cpp:1789 +#: src/libslic3r/PrintConfig.cpp:1852 src/libslic3r/PrintConfig.cpp:1911 +#: src/libslic3r/PrintConfig.cpp:2052 src/libslic3r/PrintConfig.cpp:2279 +#: src/libslic3r/PrintConfig.cpp:2288 src/libslic3r/PrintConfig.cpp:2810 +#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3037 msgid "mm/s" msgstr "mm/s" -#: src/libslic3r/PrintConfig.cpp:516 +#: src/libslic3r/PrintConfig.cpp:535 +msgid "Enable dynamic overhang speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:537 +msgid "This setting enables dynamic speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:541 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Speeds for overhang " +"sizes in between are calculated via linear interpolation. If set as " +"percentage, the speed is calculated over the external perimeter speed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:547 src/libslic3r/PrintConfig.cpp:594 +msgid "speed for 0% overlap (bridge)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:550 src/libslic3r/PrintConfig.cpp:559 +#: src/libslic3r/PrintConfig.cpp:568 src/libslic3r/PrintConfig.cpp:577 +#: src/libslic3r/PrintConfig.cpp:856 src/libslic3r/PrintConfig.cpp:1305 +#: src/libslic3r/PrintConfig.cpp:1316 src/libslic3r/PrintConfig.cpp:2387 +#: src/libslic3r/PrintConfig.cpp:2440 src/libslic3r/PrintConfig.cpp:2765 +#: src/libslic3r/PrintConfig.cpp:2997 +msgid "mm/s or %" +msgstr "mm/s of %" + +#: src/libslic3r/PrintConfig.cpp:556 src/libslic3r/PrintConfig.cpp:603 +msgid "speed for 25% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:612 +msgid "speed for 50% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:574 src/libslic3r/PrintConfig.cpp:621 +msgid "speed for 75% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:583 +msgid "Enable dynamic fan speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:584 +msgid "This setting enables dynamic fan speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:589 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Fan speeds for " +"overhang sizes in between are calculated via linear interpolation. " +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:630 msgid "Brim width" msgstr "Breedte van de brim" -#: src/libslic3r/PrintConfig.cpp:518 +#: src/libslic3r/PrintConfig.cpp:632 msgid "" "The horizontal width of the brim that will be printed around each object on " "the first layer. When raft is used, no brim is generated (use " @@ -11203,38 +13111,38 @@ msgstr "" "eerste laag. Als een raft wordt gebruikt, staat de brim uit (gebruik " "raft_first_layer_expansion)." -#: src/libslic3r/PrintConfig.cpp:527 +#: src/libslic3r/PrintConfig.cpp:641 msgid "Brim type" msgstr "Brimtype" -#: src/libslic3r/PrintConfig.cpp:529 +#: src/libslic3r/PrintConfig.cpp:643 msgid "" "The places where the brim will be printed around each object on the first " "layer." msgstr "" "De plaatsen waar de brim wordt geprint rond elk object op de eerste laag." -#: src/libslic3r/PrintConfig.cpp:535 +#: src/libslic3r/PrintConfig.cpp:645 msgid "No brim" msgstr "Geen brim" -#: src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:646 msgid "Outer brim only" msgstr "Alleen buitenste brim" -#: src/libslic3r/PrintConfig.cpp:537 +#: src/libslic3r/PrintConfig.cpp:647 msgid "Inner brim only" msgstr "Alleen binnenste brim" -#: src/libslic3r/PrintConfig.cpp:538 +#: src/libslic3r/PrintConfig.cpp:648 msgid "Outer and inner brim" msgstr "Buitenste en binnenste brim" -#: src/libslic3r/PrintConfig.cpp:543 +#: src/libslic3r/PrintConfig.cpp:654 msgid "Brim separation gap" msgstr "Brim-scheidingsgat" -#: src/libslic3r/PrintConfig.cpp:545 +#: src/libslic3r/PrintConfig.cpp:656 msgid "" "Offset of brim from the printed object. The offset is applied after the " "elephant foot compensation." @@ -11242,33 +13150,19 @@ msgstr "" "Afstand van de brim van het geprinte object. De afstand wordt toegepast na " "het compenseren van de squish-compensatie." -#: src/libslic3r/PrintConfig.cpp:552 -msgid "Clip multi-part objects" -msgstr "Meerdelige objecten samenvoegen" - -#: src/libslic3r/PrintConfig.cpp:553 -msgid "" -"When printing multi-material objects, this settings will make Slic3r to clip " -"the overlapping object parts one by the other (2nd part will be clipped by " -"the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -msgstr "" -"Als meerdere multi-materialobjecten worden geprint, zorgt deze instelling " -"dat PrusaSlicer de overlappende delen met de vorige in de reeks combineert " -"(2e deel wordt gecombineerd met het 1e, 3e deel met het 1e en 2e, etc)." - -#: src/libslic3r/PrintConfig.cpp:560 +#: src/libslic3r/PrintConfig.cpp:663 msgid "Colorprint height" msgstr "Kleurenprinthoogte" -#: src/libslic3r/PrintConfig.cpp:561 +#: src/libslic3r/PrintConfig.cpp:664 msgid "Heights at which a filament change is to occur." msgstr "Hoogte waarbij de filamentwissel plaatsvindt." -#: src/libslic3r/PrintConfig.cpp:571 +#: src/libslic3r/PrintConfig.cpp:674 msgid "Compatible printers condition" -msgstr "Voorwaarden geschikte printers" +msgstr "Voorwaarden compatibele printers" -#: src/libslic3r/PrintConfig.cpp:572 +#: src/libslic3r/PrintConfig.cpp:675 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " @@ -11276,13 +13170,13 @@ msgid "" msgstr "" "Een waar/niet waar aanduiding die gebruik maakt van configuratiewaarden van " "een actief printerprofiel. Als deze aanduiding op waar staat, wordt dit " -"profiel beschouwd als geschikt voor het actieve printerprofiel." +"profiel beschouwd als compatibel voor het actieve printerprofiel." -#: src/libslic3r/PrintConfig.cpp:586 +#: src/libslic3r/PrintConfig.cpp:689 msgid "Compatible print profiles condition" -msgstr "Voorwaarden geschikte printprofielen" +msgstr "Voorwaarden compatibele printprofielen" -#: src/libslic3r/PrintConfig.cpp:587 +#: src/libslic3r/PrintConfig.cpp:690 msgid "" "A boolean expression using the configuration values of an active print " "profile. If this expression evaluates to true, this profile is considered " @@ -11290,13 +13184,13 @@ msgid "" msgstr "" "Een waar/niet waar aanduiding die gebruik maakt van configuratiewaarden van " "een actief printprofiel. Als deze aanduiding op waar staat, wordt dit " -"profiel beschouwd als geschikt voor het actieve printprofiel." +"profiel beschouwd als compatibel met het actieve printprofiel." -#: src/libslic3r/PrintConfig.cpp:604 +#: src/libslic3r/PrintConfig.cpp:707 msgid "Complete individual objects" msgstr "Achtereenvolgens objecten printen" -#: src/libslic3r/PrintConfig.cpp:605 +#: src/libslic3r/PrintConfig.cpp:708 msgid "" "When printing multiple objects or copies, this feature will complete each " "object before moving onto next one (and starting it from its bottom layer). " @@ -11308,11 +13202,11 @@ msgstr "" "PrusaSlicer voorkomt botsingen van de extruder tegen eerder geprinte " "objecten en zal u daar ook voor waarschuwen, maar blijf wel alert." -#: src/libslic3r/PrintConfig.cpp:613 +#: src/libslic3r/PrintConfig.cpp:716 msgid "Enable auto cooling" msgstr "Automatisch koelen toestaan" -#: src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:717 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." @@ -11320,24 +13214,24 @@ msgstr "" "Dit vinkje zorgt dat automatisch gekoeld wordt; de print- en " "ventilatorsnelheid worden aangepast op basis van de laagprinttijd." -#: src/libslic3r/PrintConfig.cpp:619 +#: src/libslic3r/PrintConfig.cpp:722 msgid "Cooling tube position" msgstr "Koelbuispositie" -#: src/libslic3r/PrintConfig.cpp:620 +#: src/libslic3r/PrintConfig.cpp:723 msgid "Distance of the center-point of the cooling tube from the extruder tip." msgstr "Afstand vanaf de nozzle tot het middelpunt van de koelbuis." -#: src/libslic3r/PrintConfig.cpp:627 +#: src/libslic3r/PrintConfig.cpp:730 msgid "Cooling tube length" msgstr "Koelbuislengte" -#: src/libslic3r/PrintConfig.cpp:628 +#: src/libslic3r/PrintConfig.cpp:731 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "" "Lengte van de koelbuis om de ruimte voor koelbewegingen daarin te beperken." -#: src/libslic3r/PrintConfig.cpp:636 +#: src/libslic3r/PrintConfig.cpp:739 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " @@ -11347,11 +13241,11 @@ msgstr "" "acceleratiewaarde (perimeters/vulling). Als dit ingesteld is op 0, worden " "geen acceleratiewaarden opnieuw ingesteld." -#: src/libslic3r/PrintConfig.cpp:645 +#: src/libslic3r/PrintConfig.cpp:748 msgid "Default filament profile" msgstr "Standaard filamentprofiel" -#: src/libslic3r/PrintConfig.cpp:646 +#: src/libslic3r/PrintConfig.cpp:749 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " @@ -11361,12 +13255,12 @@ msgstr "" "Bij selectie van het huidige printerprofiel wordt dit filamentprofiel " "geactiveerd." -#: src/libslic3r/PrintConfig.cpp:652 +#: src/libslic3r/PrintConfig.cpp:755 msgid "Default print profile" msgstr "Standaard printprofiel" -#: src/libslic3r/PrintConfig.cpp:653 src/libslic3r/PrintConfig.cpp:3542 -#: src/libslic3r/PrintConfig.cpp:3553 +#: src/libslic3r/PrintConfig.cpp:756 src/libslic3r/PrintConfig.cpp:3819 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -11375,11 +13269,11 @@ msgstr "" "Standaard printprofiel dat geassocieerd wordt met huidig printerprofiel. Bij " "selectie van het huidige printerprofiel wordt dit printprofiel geactiveerd." -#: src/libslic3r/PrintConfig.cpp:659 +#: src/libslic3r/PrintConfig.cpp:762 msgid "Disable fan for the first" msgstr "Zet ventilator uit voor de eerste" -#: src/libslic3r/PrintConfig.cpp:660 +#: src/libslic3r/PrintConfig.cpp:763 msgid "" "You can set this to a positive value to disable fan at all during the first " "layers, so that it does not make adhesion worse." @@ -11387,27 +13281,27 @@ msgstr "" "U kunt dit instellen op een positieve waarde om de ventilator uit te " "schakelen tijdens het printen van de eerste lagen voor een betere adhesie." -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:772 msgid "Don't support bridges" msgstr "Geen support voor bruggen" -#: src/libslic3r/PrintConfig.cpp:671 +#: src/libslic3r/PrintConfig.cpp:774 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." msgstr "Experimentele optie om support onder brugvlakken te vermijden." -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:780 msgid "Distance between copies" msgstr "Ruimte tussen kopieën" -#: src/libslic3r/PrintConfig.cpp:678 +#: src/libslic3r/PrintConfig.cpp:781 msgid "Distance used for the auto-arrange feature of the plater." msgstr "" "Gebruikte afstand tussen objecten bij automatisch schikken in de " "modelweergave." -#: src/libslic3r/PrintConfig.cpp:686 +#: src/libslic3r/PrintConfig.cpp:789 msgid "" "This end procedure is inserted at the end of the output file. Note that you " "can use placeholder variables for all PrusaSlicer settings." @@ -11415,7 +13309,7 @@ msgstr "" "Deze eindprocedure wordt aan het eind van het outputbestand ingevoegd. Merk " "op dat variabelen voor alle instellingen gebruikt kunnen worden." -#: src/libslic3r/PrintConfig.cpp:696 +#: src/libslic3r/PrintConfig.cpp:799 msgid "" "This end procedure is inserted at the end of the output file, before the " "printer end gcode (and before any toolchange from this filament in case of " @@ -11428,23 +13322,11 @@ msgstr "" "alle instellingen gebruikt kunnen worden. Als de printer meerdere extruders " "heeft, wordt deze G-code in de extrudervolgorde uitgevoerd." -#: src/libslic3r/PrintConfig.cpp:707 -msgid "Ensure vertical shell thickness" -msgstr "Garandeer verticale shelldikte" - -#: src/libslic3r/PrintConfig.cpp:709 -msgid "" -"Add solid infill near sloping surfaces to guarantee the vertical shell " -"thickness (top+bottom solid layers)." -msgstr "" -"Voeg dichte vulling toe bij hellende vlakken om de verticale shelldikte te " -"garanderen." - -#: src/libslic3r/PrintConfig.cpp:715 +#: src/libslic3r/PrintConfig.cpp:810 msgid "Top fill pattern" msgstr "Vulpatroon voor bovenzijde" -#: src/libslic3r/PrintConfig.cpp:717 +#: src/libslic3r/PrintConfig.cpp:812 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." @@ -11452,45 +13334,45 @@ msgstr "" "Vullingspatroon voor bovenste lagen. Dit heeft alleen invloed op de bovenste " "zichtbare laag en niet de aangrenzende horizontale dichte shells." -#: src/libslic3r/PrintConfig.cpp:728 src/libslic3r/PrintConfig.cpp:1169 -#: src/libslic3r/PrintConfig.cpp:2754 src/libslic3r/PrintConfig.cpp:2771 +#: src/libslic3r/PrintConfig.cpp:815 src/libslic3r/PrintConfig.cpp:1228 +#: src/libslic3r/PrintConfig.cpp:2776 src/libslic3r/PrintConfig.cpp:2791 msgid "Rectilinear" msgstr "Rechtlijnig" -#: src/libslic3r/PrintConfig.cpp:729 +#: src/libslic3r/PrintConfig.cpp:816 msgid "Monotonic" msgstr "Monotoon" -#: src/libslic3r/PrintConfig.cpp:730 +#: src/libslic3r/PrintConfig.cpp:817 msgid "Monotonic Lines" msgstr "" -#: src/libslic3r/PrintConfig.cpp:731 src/libslic3r/PrintConfig.cpp:1170 +#: src/libslic3r/PrintConfig.cpp:818 src/libslic3r/PrintConfig.cpp:1229 msgid "Aligned Rectilinear" msgstr "Parallel rechtlijnig" -#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:1176 -#: src/libslic3r/PrintConfig.cpp:2772 +#: src/libslic3r/PrintConfig.cpp:819 src/libslic3r/PrintConfig.cpp:1235 +#: src/libslic3r/PrintConfig.cpp:2792 msgid "Concentric" msgstr "Concentrisch" -#: src/libslic3r/PrintConfig.cpp:733 src/libslic3r/PrintConfig.cpp:1180 +#: src/libslic3r/PrintConfig.cpp:820 src/libslic3r/PrintConfig.cpp:1239 msgid "Hilbert Curve" msgstr "Hilbert-kromme" -#: src/libslic3r/PrintConfig.cpp:734 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:821 src/libslic3r/PrintConfig.cpp:1240 msgid "Archimedean Chords" msgstr "Archimedes-spiraal" -#: src/libslic3r/PrintConfig.cpp:735 src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:822 src/libslic3r/PrintConfig.cpp:1241 msgid "Octagram Spiral" msgstr "Octagramspiraal" -#: src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:830 msgid "Bottom fill pattern" msgstr "Vulpatroon voor onderzijde" -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:832 msgid "" "Fill pattern for bottom infill. This only affects the bottom external " "visible layer, and not its adjacent solid shells." @@ -11498,12 +13380,12 @@ msgstr "" "Vulpatroon voor de bodemlaag. Dit heeft alleen invloed op de onderste " "zichtbare laag en niet de aangrenzende horizontale dichte shells." -#: src/libslic3r/PrintConfig.cpp:753 src/libslic3r/PrintConfig.cpp:765 -#: src/libslic3r/PrintConfig.cpp:1988 +#: src/libslic3r/PrintConfig.cpp:839 src/libslic3r/PrintConfig.cpp:851 +#: src/libslic3r/PrintConfig.cpp:2018 msgid "External perimeters" msgstr "Buitenste perimeters" -#: src/libslic3r/PrintConfig.cpp:755 +#: src/libslic3r/PrintConfig.cpp:841 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " "perimeters. If left zero, default extrusion width will be used if set, " @@ -11515,18 +13397,18 @@ msgstr "" "breedte instellen op 1,125x de nozzlediameter. Als dit is uitgedrukt als " "percentage, wordt dit berekend over de laagdikte." -#: src/libslic3r/PrintConfig.cpp:758 src/libslic3r/PrintConfig.cpp:869 -#: src/libslic3r/PrintConfig.cpp:1223 src/libslic3r/PrintConfig.cpp:1445 -#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1529 -#: src/libslic3r/PrintConfig.cpp:2011 src/libslic3r/PrintConfig.cpp:2397 -#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2660 -#: src/libslic3r/PrintConfig.cpp:2895 src/libslic3r/PrintConfig.cpp:3117 -#: src/libslic3r/PrintConfig.cpp:3132 src/libslic3r/PrintConfig.cpp:3166 -#: src/libslic3r/PrintConfig.cpp:3178 +#: src/libslic3r/PrintConfig.cpp:844 src/libslic3r/PrintConfig.cpp:958 +#: src/libslic3r/PrintConfig.cpp:1283 src/libslic3r/PrintConfig.cpp:1491 +#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1570 +#: src/libslic3r/PrintConfig.cpp:2041 src/libslic3r/PrintConfig.cpp:2428 +#: src/libslic3r/PrintConfig.cpp:2601 src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2983 src/libslic3r/PrintConfig.cpp:3204 +#: src/libslic3r/PrintConfig.cpp:3219 src/libslic3r/PrintConfig.cpp:3253 +#: src/libslic3r/PrintConfig.cpp:3265 msgid "mm or %" msgstr "mm of %" -#: src/libslic3r/PrintConfig.cpp:767 +#: src/libslic3r/PrintConfig.cpp:853 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " @@ -11537,29 +13419,23 @@ msgstr "" "perimeters. Als dit ingesteld is op 0, wordt een automatische snelheid " "genomen." -#: src/libslic3r/PrintConfig.cpp:770 src/libslic3r/PrintConfig.cpp:1245 -#: src/libslic3r/PrintConfig.cpp:1256 src/libslic3r/PrintConfig.cpp:2356 -#: src/libslic3r/PrintConfig.cpp:2409 src/libslic3r/PrintConfig.cpp:2740 -#: src/libslic3r/PrintConfig.cpp:2909 -msgid "mm/s or %" -msgstr "mm/s of %" - -#: src/libslic3r/PrintConfig.cpp:777 +#: src/libslic3r/PrintConfig.cpp:863 msgid "External perimeters first" msgstr "Buitenste perimeters eerst" -#: src/libslic3r/PrintConfig.cpp:779 +#: src/libslic3r/PrintConfig.cpp:865 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." msgstr "" "Print de buitenste perimeters eerder dan de binnenste in plaats van andersom." -#: src/libslic3r/PrintConfig.cpp:785 +#: src/libslic3r/PrintConfig.cpp:871 msgid "Extra perimeters if needed" msgstr "Extra perimeters indien nodig" -#: src/libslic3r/PrintConfig.cpp:787 +#: src/libslic3r/PrintConfig.cpp:873 +#, fuzzy msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " "keeps adding perimeters, until more than 70% of the loop immediately above " @@ -11569,7 +13445,18 @@ msgstr "" "voorkomen. PrusaSlicer blijft perimeters toevoegen, tot meer dan 70% van de " "rondgang erboven volledig wordt ondersteund." -#: src/libslic3r/PrintConfig.cpp:797 +#: src/libslic3r/PrintConfig.cpp:880 +msgid "Extra perimeters on overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:882 +msgid "" +"Detect overhang areas where bridges cannot be anchored, and fill them with " +"extra perimeter paths. These paths are anchored to the nearby non-overhang " +"area when possible." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:890 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " @@ -11579,7 +13466,7 @@ msgstr "" "extruderinstellingen zijn aangegeven). Deze waarde overschrijft de " "perimeter- en vullingsextruder, maar niet de supportextruders." -#: src/libslic3r/PrintConfig.cpp:809 +#: src/libslic3r/PrintConfig.cpp:898 msgid "" "Set this to the vertical distance between your nozzle tip and (usually) the " "X carriage rods. In other words, this is the height of the clearance " @@ -11591,7 +13478,7 @@ msgstr "" "rond de extruder en geeft de maximale diepte weer die de extruder kan halen " "zonder te botsen met eerder geprinte objecten." -#: src/libslic3r/PrintConfig.cpp:820 +#: src/libslic3r/PrintConfig.cpp:909 msgid "" "Set this to the clearance radius around your extruder. If the extruder is " "not centered, choose the largest value for safety. This setting is used to " @@ -11602,22 +13489,22 @@ msgstr "" "wordt gebruikt om te controleren op botsingen en om te tonen in de " "modelweergave." -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:919 msgid "Extruder Color" msgstr "Extruderkleur" -#: src/libslic3r/PrintConfig.cpp:831 src/libslic3r/PrintConfig.cpp:894 -#: src/libslic3r/PrintConfig.cpp:3394 +#: src/libslic3r/PrintConfig.cpp:920 src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:3666 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" "Dit wordt alleen gebruikt in de PrusaSlicer-interface als een visueel " "hulpmiddel." -#: src/libslic3r/PrintConfig.cpp:837 +#: src/libslic3r/PrintConfig.cpp:926 msgid "Extruder offset" msgstr "Extruder-offset" -#: src/libslic3r/PrintConfig.cpp:838 +#: src/libslic3r/PrintConfig.cpp:927 msgid "" "If your firmware doesn't handle the extruder displacement you need the G-" "code to take it into account. This option lets you specify the displacement " @@ -11630,11 +13517,11 @@ msgstr "" "positieve coördinaten nodig (die worden van de X- en Y-coördinaten " "afgetrokken)." -#: src/libslic3r/PrintConfig.cpp:847 +#: src/libslic3r/PrintConfig.cpp:936 msgid "Extrusion axis" msgstr "Extrusie-as" -#: src/libslic3r/PrintConfig.cpp:848 +#: src/libslic3r/PrintConfig.cpp:937 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." @@ -11642,11 +13529,11 @@ msgstr "" "Gebruik deze optie om de naam van de as van de extruder in te stellen " "(normaal gesproken E, maar soms A)." -#: src/libslic3r/PrintConfig.cpp:853 +#: src/libslic3r/PrintConfig.cpp:942 msgid "Extrusion multiplier" msgstr "Extrusie vermenigvuldigingsfactor" -#: src/libslic3r/PrintConfig.cpp:854 +#: src/libslic3r/PrintConfig.cpp:943 msgid "" "This factor changes the amount of flow proportionally. You may need to tweak " "this setting to get nice surface finish and correct single wall widths. " @@ -11658,11 +13545,11 @@ msgstr "" "0.9 en 1.1. Check eventueel de filamentdiameter en de extruderstappen (uit " "de firmware) als u denkt dat dit aangepast moet worden." -#: src/libslic3r/PrintConfig.cpp:863 +#: src/libslic3r/PrintConfig.cpp:952 msgid "Default extrusion width" msgstr "Standaard extrusiebreedte" -#: src/libslic3r/PrintConfig.cpp:865 +#: src/libslic3r/PrintConfig.cpp:954 msgid "" "Set this to a non-zero value to allow a manual extrusion width. If left to " "zero, Slic3r derives extrusion widths from the nozzle diameter (see the " @@ -11675,11 +13562,11 @@ msgstr "" "van de nozzlediameter. Als dit is uitgedrukt als percentage, wordt dit " "berekend over de laagdikte." -#: src/libslic3r/PrintConfig.cpp:877 +#: src/libslic3r/PrintConfig.cpp:966 msgid "Keep fan always on" msgstr "Laat ventilator altijd aan" -#: src/libslic3r/PrintConfig.cpp:878 +#: src/libslic3r/PrintConfig.cpp:967 msgid "" "If this is enabled, fan will never be disabled and will be kept running at " "least at its minimum speed. Useful for PLA, harmful for ABS." @@ -11687,11 +13574,11 @@ msgstr "" "Als dit is ingeschakeld zal de ventilator nooit uitgezet worden, maar " "tenminste de ingestelde minimale snelheid aanhouden." -#: src/libslic3r/PrintConfig.cpp:883 +#: src/libslic3r/PrintConfig.cpp:972 msgid "Enable fan if layer print time is below" msgstr "Schakel de ventilator in bij een printtijd korter dan" -#: src/libslic3r/PrintConfig.cpp:884 +#: src/libslic3r/PrintConfig.cpp:973 msgid "" "If layer print time is estimated below this number of seconds, fan will be " "enabled and its speed will be calculated by interpolating the minimum and " @@ -11701,27 +13588,27 @@ msgstr "" "ventilator aangezet worden en wordt de snelheid berekend door te " "interpoleren tussen de minimale en maximale snelheid." -#: src/libslic3r/PrintConfig.cpp:886 src/libslic3r/PrintConfig.cpp:2344 +#: src/libslic3r/PrintConfig.cpp:975 src/libslic3r/PrintConfig.cpp:2375 msgid "approximate seconds" msgstr "geschat aantal seconden" -#: src/libslic3r/PrintConfig.cpp:893 src/libslic3r/PrintConfig.cpp:3393 +#: src/libslic3r/PrintConfig.cpp:982 src/libslic3r/PrintConfig.cpp:3665 msgid "Color" msgstr "Kleur" -#: src/libslic3r/PrintConfig.cpp:899 +#: src/libslic3r/PrintConfig.cpp:988 msgid "Filament notes" msgstr "Filamentopmerkingen" -#: src/libslic3r/PrintConfig.cpp:900 +#: src/libslic3r/PrintConfig.cpp:989 msgid "You can put your notes regarding the filament here." msgstr "Hier kunt u opmerkingen over het filament plaatsen." -#: src/libslic3r/PrintConfig.cpp:908 src/libslic3r/PrintConfig.cpp:1821 +#: src/libslic3r/PrintConfig.cpp:997 src/libslic3r/PrintConfig.cpp:1858 msgid "Max volumetric speed" msgstr "Maximale volumetrische snelheid" -#: src/libslic3r/PrintConfig.cpp:909 +#: src/libslic3r/PrintConfig.cpp:998 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " @@ -11732,27 +13619,27 @@ msgstr "" "maximale volumetrische snelheid van de print en het filament. Als dit " "ingesteld is op 0, geldt er geen limiet." -#: src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:1007 msgid "Loading speed" msgstr "Laadsnelheid" -#: src/libslic3r/PrintConfig.cpp:919 +#: src/libslic3r/PrintConfig.cpp:1008 msgid "Speed used for loading the filament on the wipe tower." msgstr "Snelheid die gebruikt wordt voor het afveegblok." -#: src/libslic3r/PrintConfig.cpp:926 +#: src/libslic3r/PrintConfig.cpp:1015 msgid "Loading speed at the start" msgstr "Laadsnelheid aan het begin" -#: src/libslic3r/PrintConfig.cpp:927 +#: src/libslic3r/PrintConfig.cpp:1016 msgid "Speed used at the very beginning of loading phase." msgstr "Snelheid die gebruikt wordt aan het begin van de laadfase." -#: src/libslic3r/PrintConfig.cpp:934 +#: src/libslic3r/PrintConfig.cpp:1023 msgid "Unloading speed" msgstr "Ontlaadsnelheid" -#: src/libslic3r/PrintConfig.cpp:935 +#: src/libslic3r/PrintConfig.cpp:1024 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." @@ -11760,22 +13647,22 @@ msgstr "" "Snelheid die gebruikt wordt voor het ontladen van het afveegblok (heeft geen " "effect op het initiële onderdeel van het ontladen direct na de ramming)." -#: src/libslic3r/PrintConfig.cpp:943 +#: src/libslic3r/PrintConfig.cpp:1032 msgid "Unloading speed at the start" msgstr "Ontlaadsnelheid in het begin" -#: src/libslic3r/PrintConfig.cpp:944 +#: src/libslic3r/PrintConfig.cpp:1033 msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "" "Snelheid die gebruikt wordt voor het ontladen van het filament direct na de " "ramming." -#: src/libslic3r/PrintConfig.cpp:951 +#: src/libslic3r/PrintConfig.cpp:1040 msgid "Delay after unloading" msgstr "Vertraging na het ontladen" -#: src/libslic3r/PrintConfig.cpp:952 +#: src/libslic3r/PrintConfig.cpp:1041 msgid "" "Time to wait after the filament is unloaded. May help to get reliable " "toolchanges with flexible materials that may need more time to shrink to " @@ -11785,11 +13672,11 @@ msgstr "" "toolwisselingen te krijgen met flexibele materialen die meer tijd nodig " "hebben om te krimpen naar de originele afmetingen." -#: src/libslic3r/PrintConfig.cpp:961 +#: src/libslic3r/PrintConfig.cpp:1050 msgid "Number of cooling moves" msgstr "Aantal koelbewegingen" -#: src/libslic3r/PrintConfig.cpp:962 +#: src/libslic3r/PrintConfig.cpp:1051 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " "Specify desired number of these moves." @@ -11797,20 +13684,20 @@ msgstr "" "Het filament wordt gekoeld tijdens het terug en voorwaarts bewegen in de " "koelbuis. Specificeer het benodigd aantal bewegingen." -#: src/libslic3r/PrintConfig.cpp:970 +#: src/libslic3r/PrintConfig.cpp:1059 msgid "Speed of the first cooling move" msgstr "Snelheid voor de eerste koelbeweging" -#: src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:1060 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "" "Koelbewegingen worden gelijkmatig versneld, beginnend vanaf deze snelheid." -#: src/libslic3r/PrintConfig.cpp:978 +#: src/libslic3r/PrintConfig.cpp:1067 msgid "Minimal purge on wipe tower" msgstr "Minimale afstand op afveegblok" -#: src/libslic3r/PrintConfig.cpp:979 +#: src/libslic3r/PrintConfig.cpp:1068 msgid "" "After a tool change, the exact position of the newly loaded filament inside " "the nozzle may not be known, and the filament pressure is likely not yet " @@ -11824,23 +13711,23 @@ msgstr "" "afvegen aan het afveegblok om vervolgens de vulling of overige objecten goed " "te kunnen printen." -#: src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:1072 msgid "mm³" msgstr "mm³" -#: src/libslic3r/PrintConfig.cpp:989 +#: src/libslic3r/PrintConfig.cpp:1078 msgid "Speed of the last cooling move" msgstr "Snelheid voor de laatste koelbeweging" -#: src/libslic3r/PrintConfig.cpp:990 +#: src/libslic3r/PrintConfig.cpp:1079 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "Koelbewegingen versnellen gelijkmatig tot aan deze snelheid." -#: src/libslic3r/PrintConfig.cpp:997 +#: src/libslic3r/PrintConfig.cpp:1086 msgid "Filament load time" msgstr "Laadtijd van het filament" -#: src/libslic3r/PrintConfig.cpp:998 +#: src/libslic3r/PrintConfig.cpp:1087 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " "filament during a tool change (when executing the T code). This time is " @@ -11850,11 +13737,11 @@ msgstr "" "tijdens een toolwissel (tijdens het uitvoeren van de T-code). Deze tijd " "wordt toegevoegd aan de totale printtijd in de tijdsschatting." -#: src/libslic3r/PrintConfig.cpp:1005 +#: src/libslic3r/PrintConfig.cpp:1094 msgid "Ramming parameters" msgstr "Rammingparameters" -#: src/libslic3r/PrintConfig.cpp:1006 +#: src/libslic3r/PrintConfig.cpp:1095 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." @@ -11862,11 +13749,11 @@ msgstr "" "Deze frase is bewerkt door het Rammingdialoog en bevat parameters voor de " "ramming." -#: src/libslic3r/PrintConfig.cpp:1012 +#: src/libslic3r/PrintConfig.cpp:1101 msgid "Filament unload time" msgstr "Ontlaadtijd voor filament" -#: src/libslic3r/PrintConfig.cpp:1013 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " "filament during a tool change (when executing the T code). This time is " @@ -11876,7 +13763,7 @@ msgstr "" "een toolwissel (tijdens het uitvoeren van de T-code). Deze tijd wordt " "toegevoegd aan de totale printtijd in de tijdsschatting." -#: src/libslic3r/PrintConfig.cpp:1021 +#: src/libslic3r/PrintConfig.cpp:1110 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " @@ -11886,12 +13773,12 @@ msgstr "" "daarom een schuifmaat en doe meerdere metingen over het hele filament. " "Bereken vervolgens het gemiddelde." -#: src/libslic3r/PrintConfig.cpp:1028 src/libslic3r/PrintConfig.cpp:3432 -#: src/libslic3r/PrintConfig.cpp:3433 +#: src/libslic3r/PrintConfig.cpp:1117 src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3710 msgid "Density" msgstr "Dichtheid" -#: src/libslic3r/PrintConfig.cpp:1029 +#: src/libslic3r/PrintConfig.cpp:1118 msgid "" "Enter your filament density here. This is only for statistical information. " "A decent way is to weigh a known length of filament and compute the ratio of " @@ -11903,27 +13790,27 @@ msgstr "" "volume[cm³]. Formule voor volume: volume[cm³] = 1000 * (diameter[mm])² * π / " "4 * lengte[mm]." -#: src/libslic3r/PrintConfig.cpp:1032 +#: src/libslic3r/PrintConfig.cpp:1121 msgid "g/cm³" msgstr "g/cm³" -#: src/libslic3r/PrintConfig.cpp:1037 +#: src/libslic3r/PrintConfig.cpp:1126 msgid "Filament type" msgstr "Filamenttype" -#: src/libslic3r/PrintConfig.cpp:1038 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "The filament material type for use in custom G-codes." msgstr "Het filamenttype voor het gebruik van de custom G-codes." -#: src/libslic3r/PrintConfig.cpp:1066 +#: src/libslic3r/PrintConfig.cpp:1155 msgid "Soluble material" msgstr "Oplosbaar materiaal" -#: src/libslic3r/PrintConfig.cpp:1067 +#: src/libslic3r/PrintConfig.cpp:1156 msgid "Soluble material is most likely used for a soluble support." msgstr "Oplosbaar materiaal wordt vaak gebruikt voor oplosbaar support." -#: src/libslic3r/PrintConfig.cpp:1073 +#: src/libslic3r/PrintConfig.cpp:1162 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." @@ -11931,15 +13818,15 @@ msgstr "" "Voer hier de filamentkosten per kilogram in. Dit is alleen voor statistische " "informatie." -#: src/libslic3r/PrintConfig.cpp:1074 +#: src/libslic3r/PrintConfig.cpp:1163 msgid "money/kg" msgstr "€/kg" -#: src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1168 msgid "Spool weight" msgstr "Spoelgewicht" -#: src/libslic3r/PrintConfig.cpp:1080 +#: src/libslic3r/PrintConfig.cpp:1169 msgid "" "Enter weight of the empty filament spool. One may weigh a partially consumed " "filament spool before printing and one may compare the measured weight with " @@ -11951,19 +13838,19 @@ msgstr "" "berekende gewicht van de filamentspoel om te weten te komen of de " "hoeveelheid filament op de spoel voldoende is om de print te voltooien." -#: src/libslic3r/PrintConfig.cpp:1084 +#: src/libslic3r/PrintConfig.cpp:1173 msgid "g" msgstr "g" -#: src/libslic3r/PrintConfig.cpp:1093 src/libslic3r/PrintConfig.cpp:3537 +#: src/libslic3r/PrintConfig.cpp:1182 src/libslic3r/PrintConfig.cpp:3814 msgid "(Unknown)" msgstr "(Onbekend)" -#: src/libslic3r/PrintConfig.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:1186 msgid "Fill angle" msgstr "Vullingshoek" -#: src/libslic3r/PrintConfig.cpp:1099 +#: src/libslic3r/PrintConfig.cpp:1188 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " @@ -11973,64 +13860,64 @@ msgstr "" "geprint. Bruggen worden geprint met de optimale richting. Deze instelling " "zal die richting niet beïnvloeden." -#: src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1199 msgid "Fill density" msgstr "Vullingsdichtheid" -#: src/libslic3r/PrintConfig.cpp:1113 +#: src/libslic3r/PrintConfig.cpp:1201 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "" "Dichtheid van inwendige vulling, uitgedrukt in een percentage (0 - 100%)" -#: src/libslic3r/PrintConfig.cpp:1148 +#: src/libslic3r/PrintConfig.cpp:1224 msgid "Fill pattern" msgstr "Vullingspatroon" -#: src/libslic3r/PrintConfig.cpp:1150 +#: src/libslic3r/PrintConfig.cpp:1226 msgid "Fill pattern for general low-density infill." msgstr "Vulpatroon voor algemene lagere-dichtheidsvulling." -#: src/libslic3r/PrintConfig.cpp:1171 src/libslic3r/PrintConfig.cpp:2803 +#: src/libslic3r/PrintConfig.cpp:1230 src/libslic3r/PrintConfig.cpp:2822 msgid "Grid" msgstr "Raster" -#: src/libslic3r/PrintConfig.cpp:1173 +#: src/libslic3r/PrintConfig.cpp:1232 msgid "Stars" msgstr "Sterren" -#: src/libslic3r/PrintConfig.cpp:1174 +#: src/libslic3r/PrintConfig.cpp:1233 msgid "Cubic" msgstr "Kubisch" -#: src/libslic3r/PrintConfig.cpp:1175 +#: src/libslic3r/PrintConfig.cpp:1234 msgid "Line" msgstr "Lijn" -#: src/libslic3r/PrintConfig.cpp:1177 src/libslic3r/PrintConfig.cpp:2756 +#: src/libslic3r/PrintConfig.cpp:1236 src/libslic3r/PrintConfig.cpp:2778 msgid "Honeycomb" msgstr "Honingraat" -#: src/libslic3r/PrintConfig.cpp:1178 +#: src/libslic3r/PrintConfig.cpp:1237 msgid "3D Honeycomb" msgstr "3D-honingraat" -#: src/libslic3r/PrintConfig.cpp:1179 +#: src/libslic3r/PrintConfig.cpp:1238 msgid "Gyroid" msgstr "Gyroïde" -#: src/libslic3r/PrintConfig.cpp:1183 +#: src/libslic3r/PrintConfig.cpp:1242 msgid "Adaptive Cubic" msgstr "Adaptief kubisch" -#: src/libslic3r/PrintConfig.cpp:1184 +#: src/libslic3r/PrintConfig.cpp:1243 msgid "Support Cubic" msgstr "Ondersteunend kubisch" -#: src/libslic3r/PrintConfig.cpp:1185 +#: src/libslic3r/PrintConfig.cpp:1244 msgid "Lightning" -msgstr "Belichting" +msgstr "Bliksem" -#: src/libslic3r/PrintConfig.cpp:1190 +#: src/libslic3r/PrintConfig.cpp:1250 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." @@ -12038,11 +13925,11 @@ msgstr "" "Deze acceleratie zal uw printer gebruiken voor de eerste laag. Als dit " "ingesteld is op 0, wordt de standaard acceleratie gebruikt." -#: src/libslic3r/PrintConfig.cpp:1198 +#: src/libslic3r/PrintConfig.cpp:1258 msgid "First object layer over raft interface" msgstr "Eerste laag van het object boven de raft-interface" -#: src/libslic3r/PrintConfig.cpp:1199 +#: src/libslic3r/PrintConfig.cpp:1259 msgid "" "This is the acceleration your printer will use for first layer of object " "above raft interface. Set zero to disable acceleration control for first " @@ -12052,11 +13939,11 @@ msgstr "" "raft-interface. Stel in op 0 om acceleratiecontrole uit te schakelen voor de " "eerste laag boven de raft-interface." -#: src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "First layer bed temperature" msgstr "Bedtemperatuur eerste laag" -#: src/libslic3r/PrintConfig.cpp:1209 +#: src/libslic3r/PrintConfig.cpp:1269 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." @@ -12064,7 +13951,7 @@ msgstr "" "Bedtemperatuur voor de eerste laag. Als dit ingesteld is op 0, worden " "bedtemperatuur-commando's weggelaten in de output." -#: src/libslic3r/PrintConfig.cpp:1219 +#: src/libslic3r/PrintConfig.cpp:1279 msgid "" "Set this to a non-zero value to set a manual extrusion width for first " "layer. You can use this to force fatter extrudates for better adhesion. If " @@ -12077,7 +13964,7 @@ msgstr "" "wordt dit berekend over de laagdikte van de eerste laag. Als dit is " "ingesteld op 0, wordt de standaard extrusiebreedte gebruikt." -#: src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1293 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " @@ -12087,11 +13974,11 @@ msgstr "" "printen om bedhechting en tolerantie te verbeteren op niet-perfecte " "printbedden." -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1301 msgid "First layer speed" msgstr "Snelheid eerste laag" -#: src/libslic3r/PrintConfig.cpp:1242 +#: src/libslic3r/PrintConfig.cpp:1302 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " @@ -12102,11 +13989,11 @@ msgstr "" "van het type. Als dit is uitgedrukt als percentage, wordt dit berekend over " "de standaardsnelheid." -#: src/libslic3r/PrintConfig.cpp:1252 +#: src/libslic3r/PrintConfig.cpp:1312 msgid "Speed of object first layer over raft interface" msgstr "Snelheid van de eerste laag boven de raft-interface" -#: src/libslic3r/PrintConfig.cpp:1253 +#: src/libslic3r/PrintConfig.cpp:1313 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first object layer above raft interface, regardless " @@ -12118,11 +14005,11 @@ msgstr "" "interface, onafhankelijk van het type. Als dit is uitgedrukt als percentage " "(bijv. 40%) worden de standaard snelheden verschaald." -#: src/libslic3r/PrintConfig.cpp:1263 +#: src/libslic3r/PrintConfig.cpp:1323 msgid "First layer nozzle temperature" msgstr "Nozzletemperatuur eerste laag" -#: src/libslic3r/PrintConfig.cpp:1264 +#: src/libslic3r/PrintConfig.cpp:1324 msgid "" "Nozzle temperature for the first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " @@ -12132,11 +14019,11 @@ msgstr "" "wijzigen in de print, stel dit dan in op 0 om temperatuurregeling uit te " "zetten in de G-code." -#: src/libslic3r/PrintConfig.cpp:1272 +#: src/libslic3r/PrintConfig.cpp:1332 msgid "Full fan speed at layer" msgstr "Volledige ventilatorsnelheid op laag" -#: src/libslic3r/PrintConfig.cpp:1273 +#: src/libslic3r/PrintConfig.cpp:1333 msgid "" "Fan speed will be ramped up linearly from zero at layer " "\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". " @@ -12150,23 +14037,23 @@ msgstr "" "\"disable_fan_first_layers\" in welk geval de ventilator zal draaien op de " "maximaal toegestane snelheid op laag \"disable_fan_first_layers\" + 1." -#: src/libslic3r/PrintConfig.cpp:1285 +#: src/libslic3r/PrintConfig.cpp:1345 msgid "Fuzzy skin type." msgstr "Type oneffen oppervlak." -#: src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1348 msgid "Outside walls" msgstr "Alleen buitenwanden" -#: src/libslic3r/PrintConfig.cpp:1293 +#: src/libslic3r/PrintConfig.cpp:1349 msgid "All walls" msgstr "Alle wanden" -#: src/libslic3r/PrintConfig.cpp:1298 +#: src/libslic3r/PrintConfig.cpp:1355 msgid "Fuzzy skin thickness" msgstr "Dikte van oneffen oppervlak" -#: src/libslic3r/PrintConfig.cpp:1300 +#: src/libslic3r/PrintConfig.cpp:1357 msgid "" "The maximum distance that each skin point can be offset (both ways), " "measured perpendicular to the perimeter wall." @@ -12174,11 +14061,11 @@ msgstr "" "De maximale afstand die elke punt kan hebben (naar beide kanten), haaks " "gemeten op de perimeterwand." -#: src/libslic3r/PrintConfig.cpp:1308 +#: src/libslic3r/PrintConfig.cpp:1365 msgid "Fuzzy skin point distance" msgstr "Puntafstand van oneffen oppervlak" -#: src/libslic3r/PrintConfig.cpp:1310 +#: src/libslic3r/PrintConfig.cpp:1367 msgid "" "Perimeters will be split into multiple segments by inserting Fuzzy skin " "points. Lowering the Fuzzy skin point distance will increase the number of " @@ -12188,11 +14075,11 @@ msgstr "" "punten voor oneffen oppervlak. Verlagen van de afstand zorgt voor een " "verhoging van het aantal willekeurige punten op de perimeterwand." -#: src/libslic3r/PrintConfig.cpp:1318 +#: src/libslic3r/PrintConfig.cpp:1375 msgid "Fill gaps" msgstr "Vul gaten" -#: src/libslic3r/PrintConfig.cpp:1320 +#: src/libslic3r/PrintConfig.cpp:1377 msgid "" "Enables filling of gaps between perimeters and between the inner most " "perimeters and infill." @@ -12200,7 +14087,11 @@ msgstr "" "Toestaan van het vullen van gaten tussen perimeters en de binnenste " "perimeter en vulling." -#: src/libslic3r/PrintConfig.cpp:1327 +#: src/libslic3r/PrintConfig.cpp:1382 +msgid "Gap fill" +msgstr "Gatenvulling" + +#: src/libslic3r/PrintConfig.cpp:1384 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " @@ -12210,11 +14101,11 @@ msgstr "" "Houd deze waarde laag om schudden te voorkomen (wat resulteert in " "resonantieproblemen). Als dit is ingesteld op 0, worden gaten niet gevuld." -#: src/libslic3r/PrintConfig.cpp:1335 +#: src/libslic3r/PrintConfig.cpp:1392 msgid "Verbose G-code" msgstr "Opmerkingen in G-code" -#: src/libslic3r/PrintConfig.cpp:1336 +#: src/libslic3r/PrintConfig.cpp:1393 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " @@ -12224,11 +14115,11 @@ msgstr "" "commando's wordt een opmerking geplaatst. Als u print vanaf een SD-kaart, " "kan de extra grootte van het bestand de firmware vertragen." -#: src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1400 msgid "G-code flavor" msgstr "G-code-variant" -#: src/libslic3r/PrintConfig.cpp:1344 +#: src/libslic3r/PrintConfig.cpp:1401 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " @@ -12236,18 +14127,18 @@ msgid "" "extrusion value at all." msgstr "" "Sommige G- en M-commando's zijn niet universeel. Stel deze optie in om een " -"geschikte uitvoer te krijgen voor uw printer. De 'Geen extrusie'-instelling " -"kan gebruikt worden om te printen zonder materiaal te extruderen." +"compatibele uitvoer te krijgen voor uw printer. De 'Geen extrusie'-" +"instelling kan gebruikt worden om te printen zonder materiaal te extruderen." -#: src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1416 msgid "No extrusion" msgstr "Geen extrusie" -#: src/libslic3r/PrintConfig.cpp:1376 +#: src/libslic3r/PrintConfig.cpp:1422 msgid "Label objects" msgstr "Label objecten" -#: src/libslic3r/PrintConfig.cpp:1377 +#: src/libslic3r/PrintConfig.cpp:1423 msgid "" "Enable this to add comments into the G-Code labeling print moves with what " "object they belong to, which is useful for the Octoprint CancelObject " @@ -12256,22 +14147,22 @@ msgid "" msgstr "" "Schakel dit in om opmerkingen in de G-code toe te voegen voor bewegingen die " "behoren tot een object. Dit is handig voor de OctoPrint CancelObject-plugin. " -"Deze instelling is NIET geschikt voor een multi-materialsetup met één " +"Deze instelling is NIET compatibel met een multi-materialsetup met één " "extruder en 'Afvegen in object' en 'Afvegen in vulling'." -#: src/libslic3r/PrintConfig.cpp:1384 +#: src/libslic3r/PrintConfig.cpp:1430 msgid "G-code substitutions" -msgstr "" +msgstr "G-code-substituties" -#: src/libslic3r/PrintConfig.cpp:1385 +#: src/libslic3r/PrintConfig.cpp:1431 msgid "Find / replace patterns in G-code lines and substitute them." -msgstr "" +msgstr "Zoek / vervang patronen in G-coderegels en substitueer ze." -#: src/libslic3r/PrintConfig.cpp:1390 +#: src/libslic3r/PrintConfig.cpp:1436 msgid "High extruder current on filament swap" msgstr "Hoge stroomsterkte bij extruder voor filamentwissel" -#: src/libslic3r/PrintConfig.cpp:1391 +#: src/libslic3r/PrintConfig.cpp:1437 msgid "" "It may be beneficial to increase the extruder motor current during the " "filament exchange sequence to allow for rapid ramming feed rates and to " @@ -12282,7 +14173,7 @@ msgstr "" "maken en om weerstand te overwinnen tijdens het laden van filament met een " "misvormde kop." -#: src/libslic3r/PrintConfig.cpp:1399 +#: src/libslic3r/PrintConfig.cpp:1445 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." @@ -12290,23 +14181,33 @@ msgstr "" "Deze acceleratie zal uw printer gebruiken voor de vulling. Als dit is " "ingesteld op 0, wordt de acceleratiecontrole uitgeschakeld." -#: src/libslic3r/PrintConfig.cpp:1408 +#: src/libslic3r/PrintConfig.cpp:1453 src/libslic3r/PrintConfig.cpp:2423 +#: src/libslic3r/PrintConfig.cpp:2435 +msgid "Solid infill" +msgstr "Dichte vulling" + +#: src/libslic3r/PrintConfig.cpp:1454 msgid "" "This is the acceleration your printer will use for solid infill. Set zero to " "use the value for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:2977 +#: src/libslic3r/PrintConfig.cpp:2990 +msgid "Top solid infill" +msgstr "Bovenste dichte vulling" + +#: src/libslic3r/PrintConfig.cpp:1463 msgid "" "This is the acceleration your printer will use for top solid infill. Set " "zero to use the value for solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1426 +#: src/libslic3r/PrintConfig.cpp:1472 msgid "Combine infill every" msgstr "Combineer vulling elke" -#: src/libslic3r/PrintConfig.cpp:1428 +#: src/libslic3r/PrintConfig.cpp:1474 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." @@ -12315,15 +14216,15 @@ msgstr "" "de vullingslagen stapsgewijs dikker te maken, terwijl de laagdikte van " "perimeters behouden wordt." -#: src/libslic3r/PrintConfig.cpp:1431 +#: src/libslic3r/PrintConfig.cpp:1477 msgid "Combine infill every n layers" msgstr "Combineer vulling elke n lagen" -#: src/libslic3r/PrintConfig.cpp:1437 +#: src/libslic3r/PrintConfig.cpp:1483 msgid "Length of the infill anchor" msgstr "Lengte van de vullingsbevestiging" -#: src/libslic3r/PrintConfig.cpp:1439 +#: src/libslic3r/PrintConfig.cpp:1485 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -12345,35 +14246,35 @@ msgstr "" "deze parameter, maar niet langer dan \"anchor_length_max\". Stel in op 0 om " "uit te zetten." -#: src/libslic3r/PrintConfig.cpp:1455 +#: src/libslic3r/PrintConfig.cpp:1495 msgid "0 (no open anchors)" msgstr "0 (geen losse bevestiging)" -#: src/libslic3r/PrintConfig.cpp:1456 src/libslic3r/PrintConfig.cpp:1479 +#: src/libslic3r/PrintConfig.cpp:1496 src/libslic3r/PrintConfig.cpp:1519 msgid "1 mm" msgstr "1 mm" -#: src/libslic3r/PrintConfig.cpp:1457 src/libslic3r/PrintConfig.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:1520 msgid "2 mm" msgstr "2 mm" -#: src/libslic3r/PrintConfig.cpp:1458 src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1498 src/libslic3r/PrintConfig.cpp:1521 msgid "5 mm" msgstr "5 mm" -#: src/libslic3r/PrintConfig.cpp:1459 src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1499 src/libslic3r/PrintConfig.cpp:1522 msgid "10 mm" msgstr "10 mm" -#: src/libslic3r/PrintConfig.cpp:1460 src/libslic3r/PrintConfig.cpp:1483 +#: src/libslic3r/PrintConfig.cpp:1500 src/libslic3r/PrintConfig.cpp:1523 msgid "1000 (unlimited)" msgstr "1000 (ongelimiteerd)" -#: src/libslic3r/PrintConfig.cpp:1465 +#: src/libslic3r/PrintConfig.cpp:1506 msgid "Maximum length of the infill anchor" msgstr "Maximale lengte van de vullingsbevestiging" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1508 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -12394,19 +14295,19 @@ msgstr "" "perimetersegment wordt gelimiteerd tot \"infill_anchor\", maar niet langer " "dan deze parameter. Stel in op 0 om uit te zetten." -#: src/libslic3r/PrintConfig.cpp:1478 +#: src/libslic3r/PrintConfig.cpp:1518 msgid "0 (not anchored)" msgstr "0 (niet bevestigd)" -#: src/libslic3r/PrintConfig.cpp:1488 +#: src/libslic3r/PrintConfig.cpp:1529 msgid "Infill extruder" msgstr "Vullingsextruder" -#: src/libslic3r/PrintConfig.cpp:1490 +#: src/libslic3r/PrintConfig.cpp:1531 msgid "The extruder to use when printing infill." msgstr "De extruder die gebruikt wordt voor het printen van de vulling." -#: src/libslic3r/PrintConfig.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:1539 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill. If " "left zero, default extrusion width will be used if set, otherwise 1.125 x " @@ -12420,11 +14321,11 @@ msgstr "" "printen en het onderdeel sterker maken met deze optie. Als dit is uitgedrukt " "als percentage, wordt dit berekend over de laagdikte." -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1550 msgid "Infill before perimeters" msgstr "Vulling vóór perimeters" -#: src/libslic3r/PrintConfig.cpp:1510 +#: src/libslic3r/PrintConfig.cpp:1551 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." @@ -12432,11 +14333,11 @@ msgstr "" "Deze optie verandert de printvolgorde van perimeters en vulling; de " "laatstgenoemde eerst." -#: src/libslic3r/PrintConfig.cpp:1515 +#: src/libslic3r/PrintConfig.cpp:1556 msgid "Only infill where needed" msgstr "Alleen vulling waar nodig" -#: src/libslic3r/PrintConfig.cpp:1517 +#: src/libslic3r/PrintConfig.cpp:1558 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " @@ -12446,11 +14347,11 @@ msgstr "" "ondersteuning van bovenvlakken (het fungeert als inwendig support). Let op: " "deze optie vertraagt de G-code-generatie." -#: src/libslic3r/PrintConfig.cpp:1524 +#: src/libslic3r/PrintConfig.cpp:1565 msgid "Infill/perimeters overlap" msgstr "Overlapping van vulling/perimeters" -#: src/libslic3r/PrintConfig.cpp:1526 +#: src/libslic3r/PrintConfig.cpp:1567 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -12462,25 +14363,25 @@ msgstr "" "maar terugslag kan zorgen voor gaten. Als dit is uitgedrukt als percentage, " "wordt dit berekend over de extrusiebreedte van de perimeters." -#: src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "" "Printsnelheid voor vulling. Als dit ingesteld is op 0, wordt de snelheid " "automatisch berekend." -#: src/libslic3r/PrintConfig.cpp:1545 +#: src/libslic3r/PrintConfig.cpp:1586 msgid "Inherits profile" msgstr "Afgeleid profiel" -#: src/libslic3r/PrintConfig.cpp:1546 +#: src/libslic3r/PrintConfig.cpp:1587 msgid "Name of the profile, from which this profile inherits." msgstr "Profielnaam waar profiel op is gebaseerd." -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1600 msgid "Interface shells" msgstr "Interfaceshells" -#: src/libslic3r/PrintConfig.cpp:1560 +#: src/libslic3r/PrintConfig.cpp:1601 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " @@ -12490,67 +14391,67 @@ msgstr "" "volumes. Dit is handig voor multi-extruderprints met transparante materialen " "of handmatig oplosbaar support." -#: src/libslic3r/PrintConfig.cpp:1568 +#: src/libslic3r/PrintConfig.cpp:1609 msgid "Maximum width of a segmented region" msgstr "Maximale breedte van een gesegmenteerd gebied" -#: src/libslic3r/PrintConfig.cpp:1569 +#: src/libslic3r/PrintConfig.cpp:1610 msgid "Maximum width of a segmented region. Zero disables this feature." msgstr "" "Maximale breedte van een gesegmenteerd gebied. Stel in op 0 om uit te " "schakelen." -#: src/libslic3r/PrintConfig.cpp:1570 src/libslic3r/PrintConfig.cpp:2189 -#: src/libslic3r/PrintConfig.cpp:2198 +#: src/libslic3r/PrintConfig.cpp:1611 src/libslic3r/PrintConfig.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2228 msgid "mm (zero to disable)" msgstr "mm (stel in op 0 om uit te schakelen)" -#: src/libslic3r/PrintConfig.cpp:1577 +#: src/libslic3r/PrintConfig.cpp:1618 msgid "Enable ironing" msgstr "Sta strijken toe" -#: src/libslic3r/PrintConfig.cpp:1578 +#: src/libslic3r/PrintConfig.cpp:1619 msgid "" "Enable ironing of the top layers with the hot print head for smooth surface" msgstr "" "Sta strijken van de toplagen toe met het hete hotend voor een gladder " "oppervlak" -#: src/libslic3r/PrintConfig.cpp:1584 src/libslic3r/PrintConfig.cpp:1586 +#: src/libslic3r/PrintConfig.cpp:1625 src/libslic3r/PrintConfig.cpp:1627 msgid "Ironing Type" msgstr "Strijktype" -#: src/libslic3r/PrintConfig.cpp:1591 +#: src/libslic3r/PrintConfig.cpp:1629 msgid "All top surfaces" msgstr "Alle bovenvlakken" -#: src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Topmost surface only" msgstr "Alleen bovenste vlak" -#: src/libslic3r/PrintConfig.cpp:1593 +#: src/libslic3r/PrintConfig.cpp:1631 msgid "All solid surfaces" msgstr "Alle dichte vlakken" -#: src/libslic3r/PrintConfig.cpp:1598 +#: src/libslic3r/PrintConfig.cpp:1637 msgid "Flow rate" msgstr "Debiet" -#: src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Percent of a flow rate relative to object's normal layer height." msgstr "" "Percentage van het debiet ten opzichte van de standaard laagdikte van het " "model." -#: src/libslic3r/PrintConfig.cpp:1608 +#: src/libslic3r/PrintConfig.cpp:1647 msgid "Spacing between ironing passes" msgstr "Ruimte tussen strijkpassages" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1649 msgid "Distance between ironing lines" msgstr "Afstand tussen strijkpaden" -#: src/libslic3r/PrintConfig.cpp:1627 +#: src/libslic3r/PrintConfig.cpp:1666 msgid "" "This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can " @@ -12561,11 +14462,11 @@ msgstr "" "beweging en voor de extruder naar het volgende punt beweegt. Hier kunt u " "variabelen gebruiken voor alle instellingen zoals 'layer_num' en 'layer_z'." -#: src/libslic3r/PrintConfig.cpp:1638 +#: src/libslic3r/PrintConfig.cpp:1677 msgid "Supports remaining times" msgstr "Ondersteunt resterende tijd" -#: src/libslic3r/PrintConfig.cpp:1639 +#: src/libslic3r/PrintConfig.cpp:1678 msgid "" "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " "intervals into the G-code to let the firmware show accurate remaining time. " @@ -12577,155 +14478,155 @@ msgstr "" "nu herkent de Prusa i3 MK3 de M73-commando's. Ook ondersteunt de i3 MK3 " "firmware M73 Qxx Sxx voor de stille modus." -#: src/libslic3r/PrintConfig.cpp:1647 +#: src/libslic3r/PrintConfig.cpp:1686 msgid "Supports stealth mode" msgstr "Ondersteunt stille modus" -#: src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1687 msgid "The firmware supports stealth mode" msgstr "De firmware ondersteunt stille modus" -#: src/libslic3r/PrintConfig.cpp:1653 +#: src/libslic3r/PrintConfig.cpp:1692 msgid "How to apply limits" msgstr "Hoe limieten toe te voegen" -#: src/libslic3r/PrintConfig.cpp:1654 +#: src/libslic3r/PrintConfig.cpp:1693 msgid "Purpose of Machine Limits" msgstr "Doel van de machinelimieten" -#: src/libslic3r/PrintConfig.cpp:1656 +#: src/libslic3r/PrintConfig.cpp:1695 msgid "How to apply the Machine Limits" msgstr "Hoe machinelimieten toe te voegen" -#: src/libslic3r/PrintConfig.cpp:1661 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "Emit to G-code" msgstr "Invoegen in de G-code" -#: src/libslic3r/PrintConfig.cpp:1662 +#: src/libslic3r/PrintConfig.cpp:1698 msgid "Use for time estimate" msgstr "Gebruik om tijd te schatten" -#: src/libslic3r/PrintConfig.cpp:1663 +#: src/libslic3r/PrintConfig.cpp:1699 msgid "Ignore" msgstr "Negeren" -#: src/libslic3r/PrintConfig.cpp:1686 +#: src/libslic3r/PrintConfig.cpp:1723 msgid "Maximum feedrate X" msgstr "Maximale snelheid van de X-as" -#: src/libslic3r/PrintConfig.cpp:1687 +#: src/libslic3r/PrintConfig.cpp:1724 msgid "Maximum feedrate Y" msgstr "Maximale snelheid van de Y-as" -#: src/libslic3r/PrintConfig.cpp:1688 +#: src/libslic3r/PrintConfig.cpp:1725 msgid "Maximum feedrate Z" msgstr "Maximale snelheid van de Z-as" -#: src/libslic3r/PrintConfig.cpp:1689 +#: src/libslic3r/PrintConfig.cpp:1726 msgid "Maximum feedrate E" msgstr "Maximale extrusiesnelheid" -#: src/libslic3r/PrintConfig.cpp:1692 +#: src/libslic3r/PrintConfig.cpp:1729 msgid "Maximum feedrate of the X axis" msgstr "Maximale snelheid van de X-as" -#: src/libslic3r/PrintConfig.cpp:1693 +#: src/libslic3r/PrintConfig.cpp:1730 msgid "Maximum feedrate of the Y axis" msgstr "Maximale snelheid van de Y-as" -#: src/libslic3r/PrintConfig.cpp:1694 +#: src/libslic3r/PrintConfig.cpp:1731 msgid "Maximum feedrate of the Z axis" msgstr "Maximale snelheid van de Z-as" -#: src/libslic3r/PrintConfig.cpp:1695 +#: src/libslic3r/PrintConfig.cpp:1732 msgid "Maximum feedrate of the E axis" msgstr "Maximale extrusiesnelheid" -#: src/libslic3r/PrintConfig.cpp:1703 +#: src/libslic3r/PrintConfig.cpp:1740 msgid "Maximum acceleration X" msgstr "Maximale acceleratie X" -#: src/libslic3r/PrintConfig.cpp:1704 +#: src/libslic3r/PrintConfig.cpp:1741 msgid "Maximum acceleration Y" msgstr "Maximale acceleratie Y" -#: src/libslic3r/PrintConfig.cpp:1705 +#: src/libslic3r/PrintConfig.cpp:1742 msgid "Maximum acceleration Z" msgstr "Maximale acceleratie Z" -#: src/libslic3r/PrintConfig.cpp:1706 +#: src/libslic3r/PrintConfig.cpp:1743 msgid "Maximum acceleration E" msgstr "Maximale acceleratie E" -#: src/libslic3r/PrintConfig.cpp:1709 +#: src/libslic3r/PrintConfig.cpp:1746 msgid "Maximum acceleration of the X axis" msgstr "Maximale acceleratie van de X-as" -#: src/libslic3r/PrintConfig.cpp:1710 +#: src/libslic3r/PrintConfig.cpp:1747 msgid "Maximum acceleration of the Y axis" msgstr "Maximale acceleratie van de Y-as" -#: src/libslic3r/PrintConfig.cpp:1711 +#: src/libslic3r/PrintConfig.cpp:1748 msgid "Maximum acceleration of the Z axis" msgstr "Maximale acceleratie van de Z-as" -#: src/libslic3r/PrintConfig.cpp:1712 +#: src/libslic3r/PrintConfig.cpp:1749 msgid "Maximum acceleration of the E axis" msgstr "Maximale extrusie-acceleratie" -#: src/libslic3r/PrintConfig.cpp:1720 +#: src/libslic3r/PrintConfig.cpp:1757 msgid "Maximum jerk X" msgstr "Maximale ruk X" -#: src/libslic3r/PrintConfig.cpp:1721 +#: src/libslic3r/PrintConfig.cpp:1758 msgid "Maximum jerk Y" msgstr "Maximale ruk Y" -#: src/libslic3r/PrintConfig.cpp:1722 +#: src/libslic3r/PrintConfig.cpp:1759 msgid "Maximum jerk Z" msgstr "Maximale ruk Z" -#: src/libslic3r/PrintConfig.cpp:1723 +#: src/libslic3r/PrintConfig.cpp:1760 msgid "Maximum jerk E" msgstr "Maximale ruk E" -#: src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:1763 msgid "Maximum jerk of the X axis" msgstr "Maximale ruk van de X-as" -#: src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1764 msgid "Maximum jerk of the Y axis" msgstr "Maximale ruk van de Y-as" -#: src/libslic3r/PrintConfig.cpp:1728 +#: src/libslic3r/PrintConfig.cpp:1765 msgid "Maximum jerk of the Z axis" msgstr "Maximale ruk van de Z-as" -#: src/libslic3r/PrintConfig.cpp:1729 +#: src/libslic3r/PrintConfig.cpp:1766 msgid "Maximum jerk of the E axis" msgstr "Maximale extrusie-ruk" -#: src/libslic3r/PrintConfig.cpp:1739 +#: src/libslic3r/PrintConfig.cpp:1776 msgid "Minimum feedrate when extruding" msgstr "Minimale snelheid tijdens extruderen" -#: src/libslic3r/PrintConfig.cpp:1741 +#: src/libslic3r/PrintConfig.cpp:1778 msgid "Minimum feedrate when extruding (M205 S)" msgstr "Minimale snelheid tijdens extruderen (M205 S)" -#: src/libslic3r/PrintConfig.cpp:1749 +#: src/libslic3r/PrintConfig.cpp:1786 msgid "Minimum travel feedrate" msgstr "Minimale snelheid voor bewegingen" -#: src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:1788 msgid "Minimum travel feedrate (M205 T)" msgstr "Minimale snelheid voor bewegingen (M205 T)" -#: src/libslic3r/PrintConfig.cpp:1759 +#: src/libslic3r/PrintConfig.cpp:1796 msgid "Maximum acceleration when extruding" msgstr "Maximale acceleratie tijdens extruderen" -#: src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1798 msgid "" "Maximum acceleration when extruding (M204 P)\n" "\n" @@ -12737,31 +14638,31 @@ msgstr "" "Marlin (legacy) firmware gebruikt deze ook voor bewegingsacceleratie (M204 " "T)." -#: src/libslic3r/PrintConfig.cpp:1772 +#: src/libslic3r/PrintConfig.cpp:1809 msgid "Maximum acceleration when retracting" msgstr "Maximale acceleratie tijdens retracten" -#: src/libslic3r/PrintConfig.cpp:1774 +#: src/libslic3r/PrintConfig.cpp:1811 msgid "Maximum acceleration when retracting (M204 R)" msgstr "Maximale acceleratie tijdens retracten (M204 R)" -#: src/libslic3r/PrintConfig.cpp:1782 +#: src/libslic3r/PrintConfig.cpp:1819 msgid "Maximum acceleration for travel moves" msgstr "Maximale acceleratie voor bewegingen" -#: src/libslic3r/PrintConfig.cpp:1784 +#: src/libslic3r/PrintConfig.cpp:1821 msgid "Maximum acceleration for travel moves (M204 T)" msgstr "Maximale acceleratie voor bewegingen (M204 T)" -#: src/libslic3r/PrintConfig.cpp:1791 src/libslic3r/PrintConfig.cpp:1800 +#: src/libslic3r/PrintConfig.cpp:1828 src/libslic3r/PrintConfig.cpp:1837 msgid "Max" msgstr "Max" -#: src/libslic3r/PrintConfig.cpp:1792 +#: src/libslic3r/PrintConfig.cpp:1829 msgid "This setting represents the maximum speed of your fan." msgstr "Deze instelling gaat over de maximale snelheid van uw ventilator." -#: src/libslic3r/PrintConfig.cpp:1801 +#: src/libslic3r/PrintConfig.cpp:1838 msgid "" "This is the highest printable layer height for this extruder, used to cap " "the variable layer height and support layer height. Maximum recommended " @@ -12773,11 +14674,11 @@ msgstr "" "75% van de extrusiebreedte voor een goede interfacehechting. Als dit op 0 " "staat, wordt de hoogte gelimiteerd tot 75% van de nozzlediameter." -#: src/libslic3r/PrintConfig.cpp:1811 +#: src/libslic3r/PrintConfig.cpp:1848 msgid "Max print speed" msgstr "Maximale printsnelheid" -#: src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1849 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " @@ -12788,7 +14689,7 @@ msgstr "" "experimentele instelling wordt gebruikt voor de hoogste printsnelheid die u " "toestaat." -#: src/libslic3r/PrintConfig.cpp:1822 +#: src/libslic3r/PrintConfig.cpp:1859 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." @@ -12796,11 +14697,11 @@ msgstr "" "Deze experimentele instelling wordt gebruikt voor de maximale volumetrische " "snelheid van de extruder." -#: src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1867 msgid "Max volumetric slope positive" msgstr "Maximale volumetrische stijging" -#: src/libslic3r/PrintConfig.cpp:1831 +#: src/libslic3r/PrintConfig.cpp:1868 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from lower speed to higher speed. A value of 1.8 mm³/" @@ -12808,16 +14709,21 @@ msgid "" "extrusion width, 0.2 mm extrusion height, feedrate 20 mm/s) to 5.4 mm³/s " "(feedrate 60 mm/s) will take at least 2 seconds." msgstr "" +"Deze experimentele instelling wordt gebruikt om de extrusiesnelheidsratio te " +"limiteren voor een transitie van lage tot hoge snelheid. Een waarde van 1,8 " +"mm³/s² verzekert dat een wijziging in extrusieratio van 1,8 mm³/s (0,45 mm " +"extrusiebreedte, 0,2 mm laagdikte, voedingssnelheid 20 mm/s) naar 5,4 mm³/s " +"(voedingssnelheid 60 mm/s) tenminste 2 seconden duurt." -#: src/libslic3r/PrintConfig.cpp:1836 src/libslic3r/PrintConfig.cpp:1848 +#: src/libslic3r/PrintConfig.cpp:1873 src/libslic3r/PrintConfig.cpp:1885 msgid "mm³/s²" msgstr "mm³/s²" -#: src/libslic3r/PrintConfig.cpp:1842 +#: src/libslic3r/PrintConfig.cpp:1879 msgid "Max volumetric slope negative" msgstr "Maximale volumetrische daling" -#: src/libslic3r/PrintConfig.cpp:1843 +#: src/libslic3r/PrintConfig.cpp:1880 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from higher speed to lower speed. A value of 1.8 mm³/" @@ -12825,18 +14731,23 @@ msgid "" "extrusion width, 0.2 mm extrusion height, feedrate 60 mm/s) to 1.8 mm³/s " "(feedrate 20 mm/s) will take at least 2 seconds." msgstr "" +"Deze experimentele instelling wordt gebruikt om de extrusiesnelheidsratio te " +"limiteren voor een transitie van hoge tot lage snelheid. Een waarde van 1,8 " +"mm³/s² verzekert dat een wijziging in extrusieratio van 5,4 mm³/s (0,45 mm " +"extrusiebreedte, 0,2 mm laagdikte, voedingssnelheid 60 mm/s) naar 1,8 mm³/s " +"(voedingssnelheid 20 mm/s) tenminste 2 seconden duurt." -#: src/libslic3r/PrintConfig.cpp:1854 src/libslic3r/PrintConfig.cpp:1863 +#: src/libslic3r/PrintConfig.cpp:1891 src/libslic3r/PrintConfig.cpp:1900 msgid "Min" msgstr "Min" -#: src/libslic3r/PrintConfig.cpp:1855 +#: src/libslic3r/PrintConfig.cpp:1892 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "" "Deze instelling geeft de minimale snelheid van uw ventilator aan waarbij de " "ventilator draait." -#: src/libslic3r/PrintConfig.cpp:1864 +#: src/libslic3r/PrintConfig.cpp:1901 msgid "" "This is the lowest printable layer height for this extruder and limits the " "resolution for variable layer height. Typical values are between 0.05 mm and " @@ -12846,20 +14757,20 @@ msgstr "" "resolutie voor variabele laagdikte. Typische waarden zijn tussen 0,05 en 0,1 " "mm." -#: src/libslic3r/PrintConfig.cpp:1872 +#: src/libslic3r/PrintConfig.cpp:1909 msgid "Min print speed" msgstr "Minimale printsnelheid" -#: src/libslic3r/PrintConfig.cpp:1873 +#: src/libslic3r/PrintConfig.cpp:1910 msgid "Slic3r will not scale speed down below this speed." msgstr "" "PrusaSlicer zal de printsnelheid niet verlagen tot onder deze snelheid." -#: src/libslic3r/PrintConfig.cpp:1880 +#: src/libslic3r/PrintConfig.cpp:1917 msgid "Minimal filament extrusion length" msgstr "Minimale extrusielengte" -#: src/libslic3r/PrintConfig.cpp:1881 +#: src/libslic3r/PrintConfig.cpp:1918 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " @@ -12869,11 +14780,11 @@ msgstr "" "hoeveelheid filament op de eerste laag te verbruiken. Voor multi-" "extruderprinters is dit het minimum voor elke extruder." -#: src/libslic3r/PrintConfig.cpp:1890 +#: src/libslic3r/PrintConfig.cpp:1927 msgid "Configuration notes" msgstr "Configuratie-opmerkingen" -#: src/libslic3r/PrintConfig.cpp:1891 +#: src/libslic3r/PrintConfig.cpp:1928 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." @@ -12881,28 +14792,28 @@ msgstr "" "Hier kunt u eigen opmerkingen plaatsen. Deze tekst wordt bovenin de G-code " "toegevoegd." -#: src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:1938 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "Dit is de diameter van uw extruder-nozzle (bijvoorbeeld 0.4)" -#: src/libslic3r/PrintConfig.cpp:1906 +#: src/libslic3r/PrintConfig.cpp:1943 msgid "Host Type" msgstr "Hosttype" -#: src/libslic3r/PrintConfig.cpp:1907 +#: src/libslic3r/PrintConfig.cpp:1944 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." msgstr "" -"PrusaSlicer kan gcode-bestanden uploaden naar een printerhost. Dit veld moet " -"het type host bevatten." +"PrusaSlicer kan .gcode-bestanden uploaden naar een printerhost. Dit veld " +"moet het type host bevatten." -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:1961 msgid "Only retract when crossing perimeters" msgstr "Alleen retracten bij kruisende perimeters" -#: src/libslic3r/PrintConfig.cpp:1930 +#: src/libslic3r/PrintConfig.cpp:1962 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." @@ -12910,21 +14821,17 @@ msgstr "" "Schakelt retracten uit als de bewegingspaden de perimeters van de bovenste " "laag niet overschrijdt (en maakt eventueel druipen dus onzichtbaar)." -#: src/libslic3r/PrintConfig.cpp:1937 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "" "This option will drop the temperature of the inactive extruders to prevent " -"oozing. It will enable a tall skirt automatically and move extruders outside " -"such skirt when changing temperatures." +"oozing. " msgstr "" -"Deze optie verlaagt de temperatuur van de inactieve extruders om druipen te " -"voorkomen. Het staat een smalle skirt automatisch toe en beweegt extruders " -"buiten zo'n skirt als de temperatuur verandert." -#: src/libslic3r/PrintConfig.cpp:1944 +#: src/libslic3r/PrintConfig.cpp:1974 msgid "Output filename format" msgstr "Formaat van bestandsnaam" -#: src/libslic3r/PrintConfig.cpp:1945 +#: src/libslic3r/PrintConfig.cpp:1975 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -12936,11 +14843,11 @@ msgstr "" "'year', 'month', 'day', 'hour', 'minute', 'second', 'version', " "'input_filename', 'input_filename_base', etc." -#: src/libslic3r/PrintConfig.cpp:1954 +#: src/libslic3r/PrintConfig.cpp:1984 msgid "Detect bridging perimeters" msgstr "Detecteer brugperimeters" -#: src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:1986 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." @@ -12948,11 +14855,11 @@ msgstr "" "Experimentele optie om het debiet voor overhanging aan te passen. Het debiet " "voor bruggen wordt aangehouden, evenals de printsnelheid en de koeling." -#: src/libslic3r/PrintConfig.cpp:1962 +#: src/libslic3r/PrintConfig.cpp:1992 msgid "Filament parking position" msgstr "Filament parkeerpositie" -#: src/libslic3r/PrintConfig.cpp:1963 +#: src/libslic3r/PrintConfig.cpp:1993 msgid "" "Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware." @@ -12961,11 +14868,11 @@ msgstr "" "wanneer dat niet geladen is. Deze moet overeenkomen met de waarde in de " "firmware." -#: src/libslic3r/PrintConfig.cpp:1971 +#: src/libslic3r/PrintConfig.cpp:2001 msgid "Extra loading distance" msgstr "Extra laadafstand" -#: src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:2002 msgid "" "When set to zero, the distance the filament is moved from parking position " "during load is exactly the same as it was moved back during unload. When " @@ -12977,12 +14884,12 @@ msgstr "" "teruggetrokken wordt. Als de waarde positief is, zal het verder geladen " "worden. Als het negatief is, is de laadafstand dus korter." -#: src/libslic3r/PrintConfig.cpp:1980 src/libslic3r/PrintConfig.cpp:2005 -#: src/libslic3r/PrintConfig.cpp:2019 src/libslic3r/PrintConfig.cpp:2029 +#: src/libslic3r/PrintConfig.cpp:2010 src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2049 src/libslic3r/PrintConfig.cpp:2059 msgid "Perimeters" msgstr "Perimeters" -#: src/libslic3r/PrintConfig.cpp:1981 +#: src/libslic3r/PrintConfig.cpp:2011 msgid "" "This is the acceleration your printer will use for perimeters. Set zero to " "disable acceleration control for perimeters." @@ -12990,23 +14897,23 @@ msgstr "" "Deze acceleratie zal uw printer gebruiken voor de perimeters. Als dit is " "ingesteld op 0, wordt de acceleratiecontrole uitgeschakeld." -#: src/libslic3r/PrintConfig.cpp:1989 +#: src/libslic3r/PrintConfig.cpp:2019 msgid "" "This is the acceleration your printer will use for external perimeters. Set " "zero to use the value for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1996 +#: src/libslic3r/PrintConfig.cpp:2026 msgid "Perimeter extruder" msgstr "Perimeterextruder" -#: src/libslic3r/PrintConfig.cpp:1998 +#: src/libslic3r/PrintConfig.cpp:2028 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" "De extruder die gebruikt wordt voor het printen van perimeters en de brim." -#: src/libslic3r/PrintConfig.cpp:2007 +#: src/libslic3r/PrintConfig.cpp:2037 msgid "" "Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. If " @@ -13020,14 +14927,14 @@ msgstr "" "nozzlediameter. Als dit is uitgedrukt als percentage, wordt dit berekend " "over de laagdikte." -#: src/libslic3r/PrintConfig.cpp:2021 +#: src/libslic3r/PrintConfig.cpp:2051 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "" "Printsnelheid voor de perimeters (contouren, ook wel bekend als verticale " "shells). Als dit ingesteld is op 0, wordt een automatische snelheid genomen." -#: src/libslic3r/PrintConfig.cpp:2031 +#: src/libslic3r/PrintConfig.cpp:2061 msgid "" "This option sets the number of perimeters to generate for each layer. Note " "that Slic3r may increase this number automatically when it detects sloping " @@ -13039,11 +14946,11 @@ msgstr "" "een hoger aantal perimeters als de optie voor extra perimeters is " "ingeschakeld." -#: src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2065 msgid "(minimum)" msgstr "(minimum)" -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "" "If you want to process the output G-code through custom scripts, just list " "their absolute paths here. Separate multiple scripts with a semicolon. " @@ -13053,38 +14960,38 @@ msgid "" msgstr "" "Als u de output-G-code via custom scripts wilt verwerken, hoeft u alleen de " "paden hier te plaatsen. Scheid meerdere scripts met een puntkomma. Scripts " -"krijgen als eerste argument het pad naar het gcode-bestand. Ze hebben ook " +"krijgen als eerste argument het pad naar het .gcode-bestand. Ze hebben ook " "toegang tot de configuratie-instellingen door het lezen van variabelen." -#: src/libslic3r/PrintConfig.cpp:2055 +#: src/libslic3r/PrintConfig.cpp:2085 msgid "Printer type" msgstr "Printertype" -#: src/libslic3r/PrintConfig.cpp:2056 +#: src/libslic3r/PrintConfig.cpp:2086 msgid "Type of the printer." msgstr "Type van de printer." -#: src/libslic3r/PrintConfig.cpp:2061 +#: src/libslic3r/PrintConfig.cpp:2091 msgid "Printer notes" msgstr "Printeropmerkingen" -#: src/libslic3r/PrintConfig.cpp:2062 +#: src/libslic3r/PrintConfig.cpp:2092 msgid "You can put your notes regarding the printer here." msgstr "Hier kunnen opmerkingen over de printer geplaatst worden." -#: src/libslic3r/PrintConfig.cpp:2070 +#: src/libslic3r/PrintConfig.cpp:2100 msgid "Printer vendor" msgstr "Printerleverancier" -#: src/libslic3r/PrintConfig.cpp:2071 +#: src/libslic3r/PrintConfig.cpp:2101 msgid "Name of the printer vendor." msgstr "Naam van de printerleverancier." -#: src/libslic3r/PrintConfig.cpp:2076 +#: src/libslic3r/PrintConfig.cpp:2106 msgid "Printer variant" msgstr "Printervariant" -#: src/libslic3r/PrintConfig.cpp:2077 +#: src/libslic3r/PrintConfig.cpp:2107 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." @@ -13092,38 +14999,38 @@ msgstr "" "Naam van de printervariant. De nozzlediameter kan bijvoorbeeld afwijken voor " "verschillende varianten." -#: src/libslic3r/PrintConfig.cpp:2094 +#: src/libslic3r/PrintConfig.cpp:2124 msgid "Raft contact Z distance" msgstr "Z-afstand voor raft" -#: src/libslic3r/PrintConfig.cpp:2096 +#: src/libslic3r/PrintConfig.cpp:2126 msgid "" "The vertical distance between object and raft. Ignored for soluble interface." msgstr "" "De verticale afstand tussen object en raft. Wordt genegeerd bij oplosbare " "interface." -#: src/libslic3r/PrintConfig.cpp:2103 +#: src/libslic3r/PrintConfig.cpp:2133 msgid "Raft expansion" msgstr "Raftuitbreiding" -#: src/libslic3r/PrintConfig.cpp:2105 +#: src/libslic3r/PrintConfig.cpp:2135 msgid "Expansion of the raft in XY plane for better stability." msgstr "Uitbreiding van de raft in het XY-vlak voor betere stabiliteit." -#: src/libslic3r/PrintConfig.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:2142 msgid "First layer density" msgstr "Dichtheid eerste laag" -#: src/libslic3r/PrintConfig.cpp:2114 +#: src/libslic3r/PrintConfig.cpp:2144 msgid "Density of the first raft or support layer." msgstr "Dichtheid van de eerste raft- of supportlaag." -#: src/libslic3r/PrintConfig.cpp:2122 +#: src/libslic3r/PrintConfig.cpp:2152 msgid "First layer expansion" msgstr "Uitbreiding van eerste laag" -#: src/libslic3r/PrintConfig.cpp:2124 +#: src/libslic3r/PrintConfig.cpp:2154 msgid "" "Expansion of the first raft or support layer to improve adhesion to print " "bed." @@ -13131,11 +15038,11 @@ msgstr "" "Uitbreiding van de eerste raft- of supportlaag voor verbetering van de " "bedhechting." -#: src/libslic3r/PrintConfig.cpp:2131 +#: src/libslic3r/PrintConfig.cpp:2161 msgid "Raft layers" msgstr "Raftlagen" -#: src/libslic3r/PrintConfig.cpp:2133 +#: src/libslic3r/PrintConfig.cpp:2163 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." @@ -13143,11 +15050,11 @@ msgstr "" "Het object wordt verhoogd met dit aantal lagen. Support wordt onder het " "object gegenereerd." -#: src/libslic3r/PrintConfig.cpp:2141 +#: src/libslic3r/PrintConfig.cpp:2171 msgid "Slice resolution" msgstr "Slice-resolutie" -#: src/libslic3r/PrintConfig.cpp:2142 +#: src/libslic3r/PrintConfig.cpp:2172 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -13159,11 +15066,11 @@ msgstr "" "een hoge resolutie vragen meer van een printer dan mogelijk. Als dit " "ingesteld is op 0, wordt simplificatie uitgeschakeld." -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:2182 msgid "G-code resolution" msgstr "G-code-resolutie" -#: src/libslic3r/PrintConfig.cpp:2153 +#: src/libslic3r/PrintConfig.cpp:2183 msgid "" "Maximum deviation of exported G-code paths from their full resolution " "counterparts. Very high resolution G-code requires huge amount of RAM to " @@ -13181,22 +15088,22 @@ msgstr "" "reductie is toegepast per laag, kan dit zorgen voor oneffenheden tijdens het " "printen." -#: src/libslic3r/PrintConfig.cpp:2164 +#: src/libslic3r/PrintConfig.cpp:2194 msgid "Minimum travel after retraction" msgstr "Minimale beweging na retracten" -#: src/libslic3r/PrintConfig.cpp:2165 +#: src/libslic3r/PrintConfig.cpp:2195 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "" "Retracten is niet geactiveerd als bewegingen korter zijn dan de hier " "ingevoerde lengte." -#: src/libslic3r/PrintConfig.cpp:2171 +#: src/libslic3r/PrintConfig.cpp:2201 msgid "Retract amount before wipe" msgstr "Retracthoeveelheid voor het afvegen" -#: src/libslic3r/PrintConfig.cpp:2172 +#: src/libslic3r/PrintConfig.cpp:2202 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." @@ -13204,23 +15111,23 @@ msgstr "" "Met bowden-extruders is het verstandig om een aantal maal snel te retracten " "voor het afvegen." -#: src/libslic3r/PrintConfig.cpp:2179 +#: src/libslic3r/PrintConfig.cpp:2209 msgid "Retract on layer change" msgstr "Retracten bij laagwisselingen" -#: src/libslic3r/PrintConfig.cpp:2180 +#: src/libslic3r/PrintConfig.cpp:2210 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "Dit vinkje geeft aan of wordt teruggetrokken bij een Z-beweging." -#: src/libslic3r/PrintConfig.cpp:2185 src/libslic3r/PrintConfig.cpp:2193 +#: src/libslic3r/PrintConfig.cpp:2215 src/libslic3r/PrintConfig.cpp:2223 msgid "Length" msgstr "Lengte" -#: src/libslic3r/PrintConfig.cpp:2186 +#: src/libslic3r/PrintConfig.cpp:2216 msgid "Retraction Length" msgstr "Retractielengte" -#: src/libslic3r/PrintConfig.cpp:2187 +#: src/libslic3r/PrintConfig.cpp:2217 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " @@ -13229,11 +15136,11 @@ msgstr "" "Als retracten is geactiveerd, wordt filament teruggetrokken op de ingestelde " "waarde (filamentlengte voor het de extruder in gaat)." -#: src/libslic3r/PrintConfig.cpp:2194 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Retraction Length (Toolchange)" msgstr "Retractielengte (toolwissel)" -#: src/libslic3r/PrintConfig.cpp:2195 +#: src/libslic3r/PrintConfig.cpp:2225 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " @@ -13243,11 +15150,11 @@ msgstr "" "teruggetrokken op de ingestelde waarde (filamentlengte voor het de extruder " "in gaat)." -#: src/libslic3r/PrintConfig.cpp:2203 +#: src/libslic3r/PrintConfig.cpp:2233 msgid "Lift Z" msgstr "Beweeg Z omhoog" -#: src/libslic3r/PrintConfig.cpp:2204 +#: src/libslic3r/PrintConfig.cpp:2234 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " @@ -13257,15 +15164,15 @@ msgstr "" "enigszins omhoog bij het retracten. Als meerdere extruders worden gebruikt, " "wordt alleen de instelling van de eerste extruder aangehouden." -#: src/libslic3r/PrintConfig.cpp:2211 +#: src/libslic3r/PrintConfig.cpp:2241 msgid "Above Z" msgstr "Boven Z" -#: src/libslic3r/PrintConfig.cpp:2212 +#: src/libslic3r/PrintConfig.cpp:2242 msgid "Only lift Z above" msgstr "Beweeg Z alleen omhoog boven" -#: src/libslic3r/PrintConfig.cpp:2213 +#: src/libslic3r/PrintConfig.cpp:2243 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " @@ -13275,15 +15182,15 @@ msgstr "" "ingestelde waarde omhoog bewegen voor het retracten. Deze kan aangepast " "worden om warping te voorkomen bij de eerste lagen." -#: src/libslic3r/PrintConfig.cpp:2220 +#: src/libslic3r/PrintConfig.cpp:2250 msgid "Below Z" msgstr "Onder Z" -#: src/libslic3r/PrintConfig.cpp:2221 +#: src/libslic3r/PrintConfig.cpp:2251 msgid "Only lift Z below" msgstr "Beweeg Z alleen omhoog onder" -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2252 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " @@ -13292,11 +15199,11 @@ msgstr "" "Als dit ingesteld is op een positieve waarde, zal de nozzle alleen onder de " "ingestelde waarde omhoog bewegen bij het retracten." -#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2238 +#: src/libslic3r/PrintConfig.cpp:2260 src/libslic3r/PrintConfig.cpp:2268 msgid "Extra length on restart" msgstr "Extra lengte bij herstart" -#: src/libslic3r/PrintConfig.cpp:2231 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." @@ -13304,7 +15211,7 @@ msgstr "" "Als retracten wordt gecompenseerd na een beweging, wordt deze extra " "hoeveelheid filament geëxtrudeerd. Deze instelling is zelden van toepassing." -#: src/libslic3r/PrintConfig.cpp:2239 +#: src/libslic3r/PrintConfig.cpp:2269 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." @@ -13312,19 +15219,19 @@ msgstr "" "Als retracten wordt gecompenseerd na een toolwisseling, wordt deze extra " "hoeveelheid filament geëxtrudeerd." -#: src/libslic3r/PrintConfig.cpp:2246 src/libslic3r/PrintConfig.cpp:2247 +#: src/libslic3r/PrintConfig.cpp:2276 src/libslic3r/PrintConfig.cpp:2277 msgid "Retraction Speed" msgstr "Retractiesnelheid" -#: src/libslic3r/PrintConfig.cpp:2248 +#: src/libslic3r/PrintConfig.cpp:2278 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "De snelheid voor retracties (geldt alleen voor de extrudermotor)." -#: src/libslic3r/PrintConfig.cpp:2254 src/libslic3r/PrintConfig.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:2284 src/libslic3r/PrintConfig.cpp:2285 msgid "Deretraction Speed" msgstr "Deretractiesnelheid" -#: src/libslic3r/PrintConfig.cpp:2256 +#: src/libslic3r/PrintConfig.cpp:2286 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " @@ -13334,70 +15241,84 @@ msgstr "" "voor de extrudermotor). Als dit ingesteld is op 0, wordt de " "retractiesnelheid gebruikt." -#: src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2293 msgid "Seam position" msgstr "Naadpositie" -#: src/libslic3r/PrintConfig.cpp:2265 +#: src/libslic3r/PrintConfig.cpp:2295 msgid "Position of perimeters starting points." msgstr "Startpuntpositie van perimeters." -#: src/libslic3r/PrintConfig.cpp:2272 +#: src/libslic3r/PrintConfig.cpp:2297 +msgid "Random" +msgstr "Willekeurig" + +#: src/libslic3r/PrintConfig.cpp:2298 msgid "Nearest" msgstr "Dichtstbijzijnd" -#: src/libslic3r/PrintConfig.cpp:2273 +#: src/libslic3r/PrintConfig.cpp:2299 msgid "Aligned" msgstr "Uitgelijnd" -#: src/libslic3r/PrintConfig.cpp:2281 +#: src/libslic3r/PrintConfig.cpp:2306 +msgid "Staggered inner seams" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2307 +msgid "" +"This option causes the inner seams to be shifted backwards based on their " +"depth, forming a zigzag pattern." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2314 msgid "Direction" msgstr "Richting" -#: src/libslic3r/PrintConfig.cpp:2283 +#: src/libslic3r/PrintConfig.cpp:2316 msgid "Preferred direction of the seam" msgstr "Richtingsvoorkeur voor de naad" -#: src/libslic3r/PrintConfig.cpp:2284 +#: src/libslic3r/PrintConfig.cpp:2317 msgid "Seam preferred direction" msgstr "Richtingsvoorkeur voor de naad" -#: src/libslic3r/PrintConfig.cpp:2291 +#: src/libslic3r/PrintConfig.cpp:2324 msgid "Jitter" msgstr "Jitter" -#: src/libslic3r/PrintConfig.cpp:2293 +#: src/libslic3r/PrintConfig.cpp:2326 msgid "Seam preferred direction jitter" msgstr "Voorkeursrichting voor de naad - jitter" -#: src/libslic3r/PrintConfig.cpp:2294 +#: src/libslic3r/PrintConfig.cpp:2327 msgid "Preferred direction of the seam - jitter" msgstr "Voorkeursrichting voor de naad - jitter" -#: src/libslic3r/PrintConfig.cpp:2301 +#: src/libslic3r/PrintConfig.cpp:2334 msgid "Distance from brim/object" msgstr "Afstand van brim en object" -#: src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2335 msgid "" "Distance between skirt and brim (when draft shield is not used) or objects." msgstr "" "Afstand tussen de skirt en de brim of objecten (wanneer tochtscherm niet " "wordt gebruikt)." -#: src/libslic3r/PrintConfig.cpp:2308 +#: src/libslic3r/PrintConfig.cpp:2341 msgid "Skirt height" msgstr "Skirthoogte" -#: src/libslic3r/PrintConfig.cpp:2309 +#: src/libslic3r/PrintConfig.cpp:2342 msgid "Height of skirt expressed in layers." msgstr "Hoogte van de skirt uitgedrukt in het aantal lagen." -#: src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2348 msgid "Draft shield" msgstr "Tochtscherm" -#: src/libslic3r/PrintConfig.cpp:2316 +#: src/libslic3r/PrintConfig.cpp:2349 msgid "" "With draft shield active, the skirt will be printed skirt_distance from the " "object, possibly intersecting brim.\n" @@ -13413,27 +15334,27 @@ msgstr "" "Dit is handig om een ABS of ASA print te beschermen tegen opkrullen en " "loslaten van het printbed door tocht." -#: src/libslic3r/PrintConfig.cpp:2324 +#: src/libslic3r/PrintConfig.cpp:2354 msgid "Disabled" msgstr "Uit" -#: src/libslic3r/PrintConfig.cpp:2325 +#: src/libslic3r/PrintConfig.cpp:2355 msgid "Limited" msgstr "Gelimiteerd" -#: src/libslic3r/PrintConfig.cpp:2326 +#: src/libslic3r/PrintConfig.cpp:2356 msgid "Enabled" msgstr "Aan" -#: src/libslic3r/PrintConfig.cpp:2331 +#: src/libslic3r/PrintConfig.cpp:2362 msgid "Loops (minimum)" msgstr "Rondgangen (minimaal)" -#: src/libslic3r/PrintConfig.cpp:2332 +#: src/libslic3r/PrintConfig.cpp:2363 msgid "Skirt Loops" msgstr "Rondgangen voor de skirt" -#: src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2364 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " @@ -13443,11 +15364,11 @@ msgstr "" "ingesteld kan dit aantal rondgangen groter zijn dan hier is ingesteld. Als " "dit ingesteld is op 0, wordt de skirt uitgeschakeld." -#: src/libslic3r/PrintConfig.cpp:2341 +#: src/libslic3r/PrintConfig.cpp:2372 msgid "Slow down if layer print time is below" msgstr "Vertraag bij een kortere laagprinttijd dan" -#: src/libslic3r/PrintConfig.cpp:2342 +#: src/libslic3r/PrintConfig.cpp:2373 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." @@ -13455,11 +15376,11 @@ msgstr "" "Als de laagprinttijd wordt berekend onder dit aantal seconden, wordt de " "printsnelheid verlaagd om de laagprinttijd te verlengen." -#: src/libslic3r/PrintConfig.cpp:2351 +#: src/libslic3r/PrintConfig.cpp:2382 msgid "Small perimeters" msgstr "Smalle perimeters" -#: src/libslic3r/PrintConfig.cpp:2353 +#: src/libslic3r/PrintConfig.cpp:2384 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " @@ -13470,11 +15391,11 @@ msgstr "" "wordt deze genomen over de snelheid van de perimeters. Als dit ingesteld is " "op 0, wordt een automatische snelheid genomen." -#: src/libslic3r/PrintConfig.cpp:2363 +#: src/libslic3r/PrintConfig.cpp:2394 msgid "Solid infill threshold area" msgstr "Dichte vulling bij oppervlak" -#: src/libslic3r/PrintConfig.cpp:2365 +#: src/libslic3r/PrintConfig.cpp:2396 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." @@ -13482,23 +15403,23 @@ msgstr "" "Forceer dichte vulling voor delen met een kleiner doorsnee-oppervlak dan de " "hier ingestelde waarde." -#: src/libslic3r/PrintConfig.cpp:2366 +#: src/libslic3r/PrintConfig.cpp:2397 msgid "mm²" msgstr "mm²" -#: src/libslic3r/PrintConfig.cpp:2372 +#: src/libslic3r/PrintConfig.cpp:2403 msgid "Solid infill extruder" msgstr "Extruder voor dichte vulling" -#: src/libslic3r/PrintConfig.cpp:2374 +#: src/libslic3r/PrintConfig.cpp:2405 msgid "The extruder to use when printing solid infill." msgstr "De extruder die gebruikt wordt voor het printen van dichte vullingen." -#: src/libslic3r/PrintConfig.cpp:2380 +#: src/libslic3r/PrintConfig.cpp:2411 msgid "Solid infill every" msgstr "Dichte vulling elke" -#: src/libslic3r/PrintConfig.cpp:2382 +#: src/libslic3r/PrintConfig.cpp:2413 msgid "" "This feature allows to force a solid layer every given number of layers. " "Zero to disable. You can set this to any value (for example 9999); Slic3r " @@ -13510,7 +15431,7 @@ msgstr "" "waarde; PrusaSlicer zal dan automatisch het maximaal aantal lagen kiezen om " "te combineren op basis van de nozzlediameter en de laagdikte." -#: src/libslic3r/PrintConfig.cpp:2394 +#: src/libslic3r/PrintConfig.cpp:2425 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "solid surfaces. If left zero, default extrusion width will be used if set, " @@ -13522,7 +15443,7 @@ msgstr "" "breedte instellen op 1,125x de nozzlediameter. Als dit is uitgedrukt als " "percentage, wordt dit berekend over de laagdikte." -#: src/libslic3r/PrintConfig.cpp:2406 +#: src/libslic3r/PrintConfig.cpp:2437 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " @@ -13532,19 +15453,19 @@ msgstr "" "dit berekend over de standaard vullingssnelheid. Als dit ingesteld is op 0, " "worden automatische waarden genomen." -#: src/libslic3r/PrintConfig.cpp:2418 +#: src/libslic3r/PrintConfig.cpp:2449 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "Aantal te genereren dichte lagen voor boven- en ondervlakken." -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2455 src/libslic3r/PrintConfig.cpp:2456 msgid "Minimum thickness of a top / bottom shell" msgstr "Minimale dikte van top-/bodemshell" -#: src/libslic3r/PrintConfig.cpp:2431 +#: src/libslic3r/PrintConfig.cpp:2462 msgid "Spiral vase" msgstr "Spiraalmodus" -#: src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2463 msgid "" "This feature will raise Z gradually while printing a single-walled object in " "order to remove any visible seam. This option requires a single perimeter, " @@ -13559,20 +15480,17 @@ msgstr "" "skirt- en brimrondgangen. Het werkt niet bij het printen van meer dan één " "object." -#: src/libslic3r/PrintConfig.cpp:2440 +#: src/libslic3r/PrintConfig.cpp:2471 msgid "Temperature variation" msgstr "Temperatuurverschil" -#: src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:2472 msgid "" -"Temperature difference to be applied when an extruder is not active. Enables " -"a full-height \"sacrificial\" skirt on which the nozzles are periodically " -"wiped." +"Temperature difference to be applied when an extruder is not active. The " +"value is not used when 'idle_temperature' in filament settings is defined." msgstr "" -"Temperatuurverschil dat wordt toegepast als een extruder niet actief is. Dit " -"genereert een afveegblok waarop de nozzle wordt schoongeveegd." -#: src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2483 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -13590,7 +15508,7 @@ msgstr "" "andere aangepaste acties aan te passen. Merk op dat u voor alle PrusaSlicer-" "instellingen variabelen kunt gebruiken." -#: src/libslic3r/PrintConfig.cpp:2466 +#: src/libslic3r/PrintConfig.cpp:2498 msgid "" "This start procedure is inserted at the beginning, after any printer start " "gcode (and after any toolchange to this filament in case of multi-material " @@ -13613,47 +15531,47 @@ msgstr "" "meerdere extruders hebt, wordt de G-code in de volgorde van de extruders " "verwerkt." -#: src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2514 msgid "Color change G-code" msgstr "Kleurwissel-G-code" -#: src/libslic3r/PrintConfig.cpp:2483 +#: src/libslic3r/PrintConfig.cpp:2515 msgid "This G-code will be used as a code for the color change" msgstr "Deze G-code wordt gebruikt voor een kleurwisseling" -#: src/libslic3r/PrintConfig.cpp:2492 +#: src/libslic3r/PrintConfig.cpp:2524 msgid "This G-code will be used as a code for the pause print" msgstr "Deze G-code wordt gebruikt bij het pauzeren van de print" -#: src/libslic3r/PrintConfig.cpp:2501 +#: src/libslic3r/PrintConfig.cpp:2533 msgid "This G-code will be used as a custom code" msgstr "Deze G-code wordt gebruikt als custom G-code" -#: src/libslic3r/PrintConfig.cpp:2509 +#: src/libslic3r/PrintConfig.cpp:2541 msgid "Single Extruder Multi Material" msgstr "Multi-material met één extruder" -#: src/libslic3r/PrintConfig.cpp:2510 +#: src/libslic3r/PrintConfig.cpp:2542 msgid "The printer multiplexes filaments into a single hot end." msgstr "De printer mengt filament in een enkele extruder." -#: src/libslic3r/PrintConfig.cpp:2515 +#: src/libslic3r/PrintConfig.cpp:2547 msgid "Prime all printing extruders" msgstr "Veeg alle printextruders af" -#: src/libslic3r/PrintConfig.cpp:2516 +#: src/libslic3r/PrintConfig.cpp:2548 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." msgstr "" "Alle extruders worden afgeveegd aan de voorzijde van het printbed aan het " -"begin van de print als dit aanstaat." +"begin van de print als dit is ingeschakeld." -#: src/libslic3r/PrintConfig.cpp:2521 +#: src/libslic3r/PrintConfig.cpp:2553 msgid "No sparse layers (EXPERIMENTAL)" msgstr "Geen smalle lagen (experimenteel)" -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2554 msgid "" "If enabled, the wipe tower will not be printed on layers with no " "toolchanges. On layers with a toolchange, extruder will travel downward to " @@ -13665,11 +15583,11 @@ msgstr "" "bewegen naar het afveegblok. De gebruiker is verantwoordelijk voor eventuele " "botsingen met de print." -#: src/libslic3r/PrintConfig.cpp:2529 +#: src/libslic3r/PrintConfig.cpp:2561 msgid "Slice gap closing radius" msgstr "Gatvulradius" -#: src/libslic3r/PrintConfig.cpp:2531 +#: src/libslic3r/PrintConfig.cpp:2563 msgid "" "Cracks smaller than 2x gap closing radius are being filled during the " "triangle mesh slicing. The gap closing operation may reduce the final print " @@ -13679,11 +15597,11 @@ msgstr "" "het slicen. Het vullen kan zorgen dat de printresolutie minder wordt. Daarom " "wordt geadviseerd de waarde laag te houden." -#: src/libslic3r/PrintConfig.cpp:2539 +#: src/libslic3r/PrintConfig.cpp:2571 msgid "Slicing Mode" msgstr "Slicemodus" -#: src/libslic3r/PrintConfig.cpp:2541 +#: src/libslic3r/PrintConfig.cpp:2573 msgid "" "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " "close all holes in the model." @@ -13691,31 +15609,31 @@ msgstr "" "Gebruik \"even-oneven\" voor 3DLabPrint vliegtuigmodellen. Gebruik \"Sluit " "gaten\" om alle gaten in het model te vullen." -#: src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2575 msgid "Regular" msgstr "Normaal" -#: src/libslic3r/PrintConfig.cpp:2547 +#: src/libslic3r/PrintConfig.cpp:2576 msgid "Even-odd" msgstr "Even-oneven" -#: src/libslic3r/PrintConfig.cpp:2548 +#: src/libslic3r/PrintConfig.cpp:2577 msgid "Close holes" msgstr "Sluit gaten" -#: src/libslic3r/PrintConfig.cpp:2553 +#: src/libslic3r/PrintConfig.cpp:2583 msgid "Generate support material" msgstr "Genereer support" -#: src/libslic3r/PrintConfig.cpp:2555 +#: src/libslic3r/PrintConfig.cpp:2585 msgid "Enable support material generation." msgstr "Sta de generatie van support toe." -#: src/libslic3r/PrintConfig.cpp:2559 +#: src/libslic3r/PrintConfig.cpp:2589 msgid "Auto generated supports" msgstr "Automatisch gegenereerd support" -#: src/libslic3r/PrintConfig.cpp:2561 +#: src/libslic3r/PrintConfig.cpp:2591 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " @@ -13724,11 +15642,11 @@ msgstr "" "Support wordt automatisch gegenereerd als dit aan staat. Als dit niet " "aanstaat zal support alleen bij supportforceringen gegenereerd worden." -#: src/libslic3r/PrintConfig.cpp:2567 +#: src/libslic3r/PrintConfig.cpp:2597 msgid "XY separation between an object and its support" msgstr "Horizontale ruimte tussen het object en het support" -#: src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2599 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." @@ -13736,17 +15654,17 @@ msgstr "" "Horizontale ruimte tussen object en support. Als dit is uitgedrukt als " "percentage, wordt deze berekend over de breedte van de buitenste perimeter." -#: src/libslic3r/PrintConfig.cpp:2580 +#: src/libslic3r/PrintConfig.cpp:2610 msgid "Pattern angle" msgstr "Patroonhoek" -#: src/libslic3r/PrintConfig.cpp:2582 +#: src/libslic3r/PrintConfig.cpp:2612 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." msgstr "Gebruik deze instelling om het patroon van het support te draaien." -#: src/libslic3r/PrintConfig.cpp:2592 src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:2622 src/libslic3r/PrintConfig.cpp:3411 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -13754,11 +15672,11 @@ msgstr "" "Genereer alleen support als dit op het bed geplaatst wordt, dus niet op de " "print zelf." -#: src/libslic3r/PrintConfig.cpp:2598 +#: src/libslic3r/PrintConfig.cpp:2627 msgid "Top contact Z distance" msgstr "Z-afstand aan de bovenkant" -#: src/libslic3r/PrintConfig.cpp:2600 +#: src/libslic3r/PrintConfig.cpp:2629 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " @@ -13768,23 +15686,23 @@ msgstr "" "PrusaSlicer bruginstellingen gebruikt voor de eerste laag boven de " "supportinterface." -#: src/libslic3r/PrintConfig.cpp:2608 +#: src/libslic3r/PrintConfig.cpp:2635 msgid "0 (soluble)" msgstr "0 (oplosbaar)" -#: src/libslic3r/PrintConfig.cpp:2609 +#: src/libslic3r/PrintConfig.cpp:2636 msgid "0.1 (detachable)" msgstr "0,1 (losbreekbaar)" -#: src/libslic3r/PrintConfig.cpp:2610 +#: src/libslic3r/PrintConfig.cpp:2637 msgid "0.2 (detachable)" msgstr "0,2 (losbreekbaar)" -#: src/libslic3r/PrintConfig.cpp:2616 +#: src/libslic3r/PrintConfig.cpp:2643 msgid "Bottom contact Z distance" msgstr "Z-afstand aan de onderkant" -#: src/libslic3r/PrintConfig.cpp:2618 +#: src/libslic3r/PrintConfig.cpp:2645 msgid "" "The vertical distance between the object top surface and the support " "material interface. If set to zero, support_material_contact_distance will " @@ -13794,17 +15712,15 @@ msgstr "" "interface. Als dit ingesteld op 0 zal support_material_contact_distance " "worden gebruikt voor Z-afstand van zowel onder- als bovenkant." -#. TRN To be shown in Print Settings "Bottom contact Z distance". Have to be as short as possible -#. TRN To be shown in Print Settings "Bottom interface layers". Have to be as short as possible -#: src/libslic3r/PrintConfig.cpp:2626 src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2651 src/libslic3r/PrintConfig.cpp:2732 msgid "Same as top" msgstr "Zelfde als bovenkant" -#: src/libslic3r/PrintConfig.cpp:2633 +#: src/libslic3r/PrintConfig.cpp:2659 msgid "Enforce support for the first" msgstr "Forceer support voor de eerste" -#: src/libslic3r/PrintConfig.cpp:2635 +#: src/libslic3r/PrintConfig.cpp:2661 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -13816,15 +15732,15 @@ msgstr "" "waarbij de ingesteld hoek wordt aangehouden. Dit is handig om meer hechting " "op het bed te verkrijgen bij objecten met een klein contactoppervlak." -#: src/libslic3r/PrintConfig.cpp:2640 +#: src/libslic3r/PrintConfig.cpp:2666 msgid "Enforce support for the first n layers" msgstr "Forceer support voor de eerste n lagen" -#: src/libslic3r/PrintConfig.cpp:2646 +#: src/libslic3r/PrintConfig.cpp:2672 msgid "Support material/raft/skirt extruder" msgstr "Extruder voor support/raft/skirt" -#: src/libslic3r/PrintConfig.cpp:2648 +#: src/libslic3r/PrintConfig.cpp:2674 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." @@ -13832,7 +15748,7 @@ msgstr "" "De extruder die gebruikt wordt voor support, raft en skirt (stel in op 1 of " "op 0 om de huidige extruder te gebruiken)." -#: src/libslic3r/PrintConfig.cpp:2657 +#: src/libslic3r/PrintConfig.cpp:2683 msgid "" "Set this to a non-zero value to set a manual extrusion width for support " "material. If left zero, default extrusion width will be used if set, " @@ -13844,22 +15760,22 @@ msgstr "" "zelf bepalen op basis van de nozzlediameter. Als dit is uitgedrukt als " "percentage, wordt dit berekend over de laagdikte." -#: src/libslic3r/PrintConfig.cpp:2667 +#: src/libslic3r/PrintConfig.cpp:2693 msgid "Interface loops" msgstr "Interface rondgangen" -#: src/libslic3r/PrintConfig.cpp:2669 +#: src/libslic3r/PrintConfig.cpp:2695 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" "Bedek de bovenste interfacelagen van het support met rondgangen. Dit staat " "standaard uit." -#: src/libslic3r/PrintConfig.cpp:2674 +#: src/libslic3r/PrintConfig.cpp:2700 msgid "Support material/raft interface extruder" msgstr "Extruder voor supportinterfacce en de bovenlaag van de raft" -#: src/libslic3r/PrintConfig.cpp:2676 +#: src/libslic3r/PrintConfig.cpp:2702 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." @@ -13868,37 +15784,37 @@ msgstr "" "dan 1 of op 0 om de huidige extruder te gebruiken voor minder " "toolwisselingen). Dit heeft ook effect op de raft." -#: src/libslic3r/PrintConfig.cpp:2684 +#: src/libslic3r/PrintConfig.cpp:2709 msgid "Top interface layers" msgstr "Interfacelagen bovenkant" -#: src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2711 msgid "" "Number of interface layers to insert between the object(s) and support " "material." msgstr "Aantal interfacelagen tussen het support en het object." -#: src/libslic3r/PrintConfig.cpp:2693 +#: src/libslic3r/PrintConfig.cpp:2715 src/libslic3r/PrintConfig.cpp:2733 msgid "0 (off)" msgstr "0 (uit)" -#: src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2716 src/libslic3r/PrintConfig.cpp:2734 msgid "1 (light)" msgstr "1 (licht)" -#: src/libslic3r/PrintConfig.cpp:2695 +#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2735 msgid "2 (default)" msgstr "2 (standaard)" -#: src/libslic3r/PrintConfig.cpp:2696 +#: src/libslic3r/PrintConfig.cpp:2718 src/libslic3r/PrintConfig.cpp:2736 msgid "3 (heavy)" msgstr "3 (zwaar)" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:2724 msgid "Bottom interface layers" msgstr "Interfacelagen onderkant" -#: src/libslic3r/PrintConfig.cpp:2704 +#: src/libslic3r/PrintConfig.cpp:2726 msgid "" "Number of interface layers to insert between the object(s) and support " "material. Set to -1 to use support_material_interface_layers" @@ -13906,11 +15822,11 @@ msgstr "" "Het aantal interfacelagen tussen de objecten en het supportmateriaal. Stel " "in op -1 om evenveel lagen als op bovenkant te gebruiken" -#: src/libslic3r/PrintConfig.cpp:2717 +#: src/libslic3r/PrintConfig.cpp:2742 msgid "Closing radius" msgstr "Sluitradius" -#: src/libslic3r/PrintConfig.cpp:2719 +#: src/libslic3r/PrintConfig.cpp:2744 msgid "" "For snug supports, the support regions will be merged using morphological " "closing operation. Gaps smaller than the closing radius will be filled in." @@ -13918,17 +15834,21 @@ msgstr "" "Voor handvaste supports worden supportdelen samengevoegd met een " "morfologische sluitmethode. Gaten kleiner dan de sluitradius worden gevuld." -#: src/libslic3r/PrintConfig.cpp:2727 +#: src/libslic3r/PrintConfig.cpp:2752 msgid "Interface pattern spacing" msgstr "Tussenafstand voor interface" -#: src/libslic3r/PrintConfig.cpp:2729 +#: src/libslic3r/PrintConfig.cpp:2754 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" "Ruimte tussen lijnen van supportinterface. Als dit ingesteld is op 0, wordt " "een dichte supportinterface gegenereerd." -#: src/libslic3r/PrintConfig.cpp:2738 +#: src/libslic3r/PrintConfig.cpp:2761 +msgid "Support material interface" +msgstr "Supportinterface" + +#: src/libslic3r/PrintConfig.cpp:2763 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " @@ -13937,23 +15857,23 @@ msgstr "" "Printsnelheid van supportinterfacelagen. Als dit is uitgedrukt als " "percentage, wordt dit berekend over de snelheid van het support." -#: src/libslic3r/PrintConfig.cpp:2747 +#: src/libslic3r/PrintConfig.cpp:2772 msgid "Pattern" msgstr "Patroon" -#: src/libslic3r/PrintConfig.cpp:2749 +#: src/libslic3r/PrintConfig.cpp:2774 msgid "Pattern used to generate support material." msgstr "Patroon dat gebruikt wordt voor het support." -#: src/libslic3r/PrintConfig.cpp:2755 +#: src/libslic3r/PrintConfig.cpp:2777 msgid "Rectilinear grid" msgstr "Rechtlijnig raster" -#: src/libslic3r/PrintConfig.cpp:2761 +#: src/libslic3r/PrintConfig.cpp:2784 msgid "Interface pattern" msgstr "Interfacepatroon" -#: src/libslic3r/PrintConfig.cpp:2763 +#: src/libslic3r/PrintConfig.cpp:2786 msgid "" "Pattern used to generate support material interface. Default pattern for non-" "soluble support interface is Rectilinear, while default pattern for soluble " @@ -13963,23 +15883,19 @@ msgstr "" "niet-oplosbaar support is rechtlijnig, terwijl het patroon voor oplosbaar " "support concentrisch is." -#: src/libslic3r/PrintConfig.cpp:2777 +#: src/libslic3r/PrintConfig.cpp:2798 msgid "Pattern spacing" msgstr "Tussenafstand van het patroon" -#: src/libslic3r/PrintConfig.cpp:2779 +#: src/libslic3r/PrintConfig.cpp:2800 msgid "Spacing between support material lines." msgstr "Afstand tussen supportlijnen." -#: src/libslic3r/PrintConfig.cpp:2788 +#: src/libslic3r/PrintConfig.cpp:2809 msgid "Speed for printing support material." msgstr "Printsnelheid voor support." -#: src/libslic3r/PrintConfig.cpp:2795 -msgid "Style" -msgstr "Type" - -#: src/libslic3r/PrintConfig.cpp:2797 +#: src/libslic3r/PrintConfig.cpp:2818 msgid "" "Style and shape of the support towers. Projecting the supports into a " "regular grid will create more stable supports, while snug support towers " @@ -13989,27 +15905,30 @@ msgstr "" "regelmatig raster creëert stabielere supports, terwijl handvaste supports " "materiaal besparen en een lelijk oppervlak reduceert." -#: src/libslic3r/PrintConfig.cpp:2804 +#: src/libslic3r/PrintConfig.cpp:2823 msgid "Snug" msgstr "Handvast" -#: src/libslic3r/PrintConfig.cpp:2809 +#: src/libslic3r/PrintConfig.cpp:2824 +msgid "Organic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2830 msgid "Synchronize with object layers" msgstr "Synchroniseer met objectlagen" -#: src/libslic3r/PrintConfig.cpp:2811 +#: src/libslic3r/PrintConfig.cpp:2832 msgid "" "Synchronize support layers with the object print layers. This is useful with " -"multi-material printers, where the extruder switch is expensive." +"multi-material printers, where the extruder switch is expensive. This option " +"is only available when top contact Z distance is set to zero." msgstr "" -"Synchroniseer de supportlagen met de objectlagen. Dit is handig voor multi-" -"materialprinters waar een toolwissel duur is." -#: src/libslic3r/PrintConfig.cpp:2817 +#: src/libslic3r/PrintConfig.cpp:2839 msgid "Overhang threshold" msgstr "Maximale overhanghoek" -#: src/libslic3r/PrintConfig.cpp:2819 +#: src/libslic3r/PrintConfig.cpp:2841 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -14022,11 +15941,11 @@ msgstr "" "geprint moet worden met support. Als dit ingesteld is op 0, wordt dit " "automatisch gedetecteerd (aanbevolen)." -#: src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2853 msgid "With sheath around the support" msgstr "Met schild rond het support" -#: src/libslic3r/PrintConfig.cpp:2833 +#: src/libslic3r/PrintConfig.cpp:2855 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." @@ -14034,7 +15953,72 @@ msgstr "" "Voeg een schild (één perimeterlijn) rondom het support toe. Dit maakt het " "support betrouwbaarder maar ook moeilijker te verwijderen." -#: src/libslic3r/PrintConfig.cpp:2840 +#: src/libslic3r/PrintConfig.cpp:2861 +msgid "Maximum Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2863 +msgid "" +"The maximum angle of the branches, when the branches have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle to be able to have more reach." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2872 +msgid "Preferred Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2874 +msgid "" +"The preferred angle of the branches, when they do not have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle for branches to merge faster." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2883 +msgid "Tip Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2885 +msgid "The diameter of the top of the tip of the branches of organic support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2892 +msgid "Branch Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2894 +msgid "" +"The diameter of the thinnest branches of organic support. Thicker branches " +"are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2902 +msgid "Branch Diameter Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2904 +msgid "" +"The angle of the branches' diameter as they gradually become thicker towards " +"the bottom. An angle of 0 will cause the branches to have uniform thickness " +"over their length. A bit of an angle can increase stability of the organic " +"support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2914 +msgid "Branch Density" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2916 +msgid "" +"Adjusts the density of the support structure used to generate the tips of " +"the branches. A higher value results in better overhangs but the supports " +"are harder to remove, thus it is recommended to enable top support " +"interfaces instead of a high branch density value if dense interfaces are " +"needed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2928 msgid "" "Nozzle temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output G-code." @@ -14042,29 +16026,29 @@ msgstr "" "Nozzletemperatuur voor lagen na de eerste laag. Stel in op 0 om " "temperatuurregeling uit te zetten in de G-code." -#: src/libslic3r/PrintConfig.cpp:2843 +#: src/libslic3r/PrintConfig.cpp:2931 msgid "Nozzle temperature" msgstr "Nozzletemperatuur" -#: src/libslic3r/PrintConfig.cpp:2849 +#: src/libslic3r/PrintConfig.cpp:2937 msgid "Thick bridges" msgstr "Dikke bruggen" -#: src/libslic3r/PrintConfig.cpp:2851 +#: src/libslic3r/PrintConfig.cpp:2939 msgid "" "If enabled, bridges are more reliable, can bridge longer distances, but may " "look worse. If disabled, bridges look better but are reliable just for " "shorter bridged distances." msgstr "" -"Als dit aanstaat worden bruggen betrouwbaarder, kunnen langere bruggen " -"printen, maar er minder mooi uitzien. Als dit uitstaat zien bruggen er beter " -"uit, maar zijn alleen betrouwbaar over korte afstanden." +"Als dit is ingeschakeld worden bruggen betrouwbaarder, kunnen langere " +"bruggen printen, maar er minder mooi uitzien. Als dit uitstaat zien bruggen " +"er beter uit, maar zijn alleen betrouwbaar over korte afstanden." -#: src/libslic3r/PrintConfig.cpp:2857 +#: src/libslic3r/PrintConfig.cpp:2945 msgid "Detect thin walls" msgstr "Detecteer dunne wanden" -#: src/libslic3r/PrintConfig.cpp:2859 +#: src/libslic3r/PrintConfig.cpp:2947 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." @@ -14072,11 +16056,11 @@ msgstr "" "Detecteer éénlijnige wanden (delen waar 2 extrusielijnen niet passen en dit " "geprint moet worden met 1 lijn)." -#: src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2953 msgid "Threads" -msgstr "Meerdere processen" +msgstr "Processen" -#: src/libslic3r/PrintConfig.cpp:2866 +#: src/libslic3r/PrintConfig.cpp:2954 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." @@ -14085,7 +16069,7 @@ msgstr "" "draaien. Het optimaal aantal processen is vlak boven het aanwezige aantal " "kernen/processoren." -#: src/libslic3r/PrintConfig.cpp:2878 +#: src/libslic3r/PrintConfig.cpp:2966 msgid "" "This custom code is inserted before every toolchange. Placeholder variables " "for all PrusaSlicer settings as well as {toolchange_z}, {previous_extruder} " @@ -14101,7 +16085,7 @@ msgstr "" "(zoals T{next_extruder}), zal PrusaSlicer deze verder negeren. Het is daarom " "mogelijk om een custom script toe te passen voor en na de toolwisseling." -#: src/libslic3r/PrintConfig.cpp:2891 +#: src/libslic3r/PrintConfig.cpp:2979 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "top surfaces. You may want to use thinner extrudates to fill all narrow " @@ -14114,7 +16098,7 @@ msgstr "" "extrudaat in smalle gebieden voor een gladdere afwerking. Als dit is " "uitgedrukt als percentage, wordt dit berekend over de laagdikte." -#: src/libslic3r/PrintConfig.cpp:2904 +#: src/libslic3r/PrintConfig.cpp:2992 msgid "" "Speed for printing top solid layers (it only applies to the uppermost " "external layers and not to their internal solid layers). You may want to " @@ -14128,15 +16112,15 @@ msgstr "" "vullingssnelheid. Als dit ingesteld is op 0, wordt een automatische snelheid " "genomen." -#: src/libslic3r/PrintConfig.cpp:2919 +#: src/libslic3r/PrintConfig.cpp:3007 msgid "Number of solid layers to generate on top surfaces." msgstr "Aantal te genereren dichte lagen voor bovenvlakken." -#: src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3008 msgid "Top solid layers" msgstr "Bovenste dichte vulling" -#: src/libslic3r/PrintConfig.cpp:2928 +#: src/libslic3r/PrintConfig.cpp:3016 msgid "" "The number of top solid layers is increased above top_solid_layers if " "necessary to satisfy minimum thickness of top shell. This is useful to " @@ -14146,19 +16130,19 @@ msgstr "" "de minimale shelldikte te garanderen. Dit is handig om kussenvorming te " "voorkomen bij het printen met variabele laagdikte." -#: src/libslic3r/PrintConfig.cpp:2931 +#: src/libslic3r/PrintConfig.cpp:3019 msgid "Minimum top shell thickness" msgstr "Minimale shelldikte aan de bovenzijde" -#: src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:3026 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "Bewegingssnelheid als niet geëxtrudeerd wordt." -#: src/libslic3r/PrintConfig.cpp:2946 +#: src/libslic3r/PrintConfig.cpp:3034 msgid "Z travel" msgstr "Z-beweging" -#: src/libslic3r/PrintConfig.cpp:2947 +#: src/libslic3r/PrintConfig.cpp:3035 msgid "" "Speed for movements along the Z axis.\n" "When set to zero, the value is ignored and regular travel speed is used " @@ -14168,11 +16152,11 @@ msgstr "" "Als dit ingesteld is op 0, zal de waarde worden genegeerd en " "standaardwaarden worden gebruikt." -#: src/libslic3r/PrintConfig.cpp:2955 +#: src/libslic3r/PrintConfig.cpp:3043 msgid "Use firmware retraction" msgstr "Gebruik de firmware-retractie" -#: src/libslic3r/PrintConfig.cpp:2956 +#: src/libslic3r/PrintConfig.cpp:3044 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." @@ -14181,11 +16165,11 @@ msgstr "" "retracten in de firmware. Dit wordt alleen ondersteunt bij de recente Marlin-" "variant." -#: src/libslic3r/PrintConfig.cpp:2962 +#: src/libslic3r/PrintConfig.cpp:3050 msgid "Use relative E distances" msgstr "Gebruik relatieve E-waarden" -#: src/libslic3r/PrintConfig.cpp:2963 +#: src/libslic3r/PrintConfig.cpp:3051 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." @@ -14193,11 +16177,11 @@ msgstr "" "Als uw firmware relatieve extrusiewaarden nodig heeft, vink dit dan aan. " "Laat het ander uit staan. De meeste firmware gebruiken absolute waarden." -#: src/libslic3r/PrintConfig.cpp:2969 +#: src/libslic3r/PrintConfig.cpp:3057 msgid "Use volumetric E" msgstr "Gebruik volumetrische E-waarden" -#: src/libslic3r/PrintConfig.cpp:2970 +#: src/libslic3r/PrintConfig.cpp:3058 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -14214,11 +16198,11 @@ msgstr "" "filamentinstellingen. Dit wordt alleen ondersteund in de recente Marlin-" "variant." -#: src/libslic3r/PrintConfig.cpp:2980 +#: src/libslic3r/PrintConfig.cpp:3068 msgid "Enable variable layer height feature" msgstr "Variabele laagdikte toestaan" -#: src/libslic3r/PrintConfig.cpp:2981 +#: src/libslic3r/PrintConfig.cpp:3069 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." @@ -14226,11 +16210,11 @@ msgstr "" "Sommige printers of printersetups kunnen niet printen met een variabele " "laagdikte. Staat standaard aan." -#: src/libslic3r/PrintConfig.cpp:2987 +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Wipe while retracting" msgstr "Veeg af bij het retracten" -#: src/libslic3r/PrintConfig.cpp:2988 +#: src/libslic3r/PrintConfig.cpp:3076 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." @@ -14238,7 +16222,7 @@ msgstr "" "Als u dit aanvinkt beweegt de nozzle tijdens het retracten om een blob of " "lekkende extruders tegen te gaan." -#: src/libslic3r/PrintConfig.cpp:2995 +#: src/libslic3r/PrintConfig.cpp:3083 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." @@ -14246,11 +16230,11 @@ msgstr "" "Multi-materialprinters moeten afvegen bij toolwisselingen. Extrudeer het " "overtollige materiaal op het afveegblok." -#: src/libslic3r/PrintConfig.cpp:3001 +#: src/libslic3r/PrintConfig.cpp:3089 msgid "Purging volumes - load/unload volumes" msgstr "Afveegvolume - laad/ontlaad volumes" -#: src/libslic3r/PrintConfig.cpp:3002 +#: src/libslic3r/PrintConfig.cpp:3090 msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " @@ -14261,11 +16245,11 @@ msgstr "" "het creëren van de onderstaande volledige reinigingsvolumes te " "vereenvoudigen." -#: src/libslic3r/PrintConfig.cpp:3008 +#: src/libslic3r/PrintConfig.cpp:3096 msgid "Purging volumes - matrix" msgstr "Afveegvolume - matrix" -#: src/libslic3r/PrintConfig.cpp:3009 +#: src/libslic3r/PrintConfig.cpp:3097 msgid "" "This matrix describes volumes (in cubic milimetres) required to purge the " "new filament on the wipe tower for any given pair of tools." @@ -14273,43 +16257,47 @@ msgstr "" "Deze matrix beschrijft volume (in mm³) dat is vereist om nieuw filament af " "te vegen aan het afveegblok voor elk paar van extruders." -#: src/libslic3r/PrintConfig.cpp:3018 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Position X" msgstr "X-positie" -#: src/libslic3r/PrintConfig.cpp:3019 +#: src/libslic3r/PrintConfig.cpp:3107 msgid "X coordinate of the left front corner of a wipe tower" msgstr "X-coördinaat van de linkervoorhoek van het afveegblok" -#: src/libslic3r/PrintConfig.cpp:3025 +#: src/libslic3r/PrintConfig.cpp:3113 msgid "Position Y" msgstr "Y-positie" -#: src/libslic3r/PrintConfig.cpp:3026 +#: src/libslic3r/PrintConfig.cpp:3114 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "Y-coördinaat van de linkervoorhoek van het afveegblok" -#: src/libslic3r/PrintConfig.cpp:3033 +#: src/libslic3r/PrintConfig.cpp:3120 +msgid "Width" +msgstr "Breedte" + +#: src/libslic3r/PrintConfig.cpp:3121 msgid "Width of a wipe tower" msgstr "Breedte van het afveegblok" -#: src/libslic3r/PrintConfig.cpp:3039 +#: src/libslic3r/PrintConfig.cpp:3127 msgid "Wipe tower rotation angle" msgstr "Rotatie van het afveegblok" -#: src/libslic3r/PrintConfig.cpp:3040 +#: src/libslic3r/PrintConfig.cpp:3128 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "Rotatie van het afveegblok ten opzichte van de X-as." -#: src/libslic3r/PrintConfig.cpp:3046 src/libslic3r/PrintConfig.cpp:3047 +#: src/libslic3r/PrintConfig.cpp:3134 src/libslic3r/PrintConfig.cpp:3135 msgid "Wipe tower brim width" msgstr "Brimbreedte van het afveegblok" -#: src/libslic3r/PrintConfig.cpp:3055 +#: src/libslic3r/PrintConfig.cpp:3143 msgid "Wipe into this object's infill" msgstr "Afvegen in de vulling van het object" -#: src/libslic3r/PrintConfig.cpp:3056 +#: src/libslic3r/PrintConfig.cpp:3144 msgid "" "Purging after toolchange will be done inside this object's infills. This " "lowers the amount of waste but may result in longer print time due to " @@ -14319,11 +16307,11 @@ msgstr "" "reduceert de hoeveelheid afval, maar kan resulteren in langere printtijden " "door meer bewegingen." -#: src/libslic3r/PrintConfig.cpp:3063 +#: src/libslic3r/PrintConfig.cpp:3151 msgid "Wipe into this object" msgstr "Afvegen in dit object" -#: src/libslic3r/PrintConfig.cpp:3064 +#: src/libslic3r/PrintConfig.cpp:3152 msgid "" "Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " @@ -14333,19 +16321,19 @@ msgstr "" "materiaal dat anders in het afveegblok gebruikt wordt te besparen. Kleuren " "kunnen dan gemengd worden." -#: src/libslic3r/PrintConfig.cpp:3070 +#: src/libslic3r/PrintConfig.cpp:3158 msgid "Maximal bridging distance" msgstr "Maximale brugafstand" -#: src/libslic3r/PrintConfig.cpp:3071 +#: src/libslic3r/PrintConfig.cpp:3159 msgid "Maximal distance between supports on sparse infill sections." msgstr "Maximale afstand tussen support op dunne vullingsdelen." -#: src/libslic3r/PrintConfig.cpp:3077 +#: src/libslic3r/PrintConfig.cpp:3165 msgid "XY Size Compensation" msgstr "Compensatie voor X- en Y-grootte" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3167 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" @@ -14355,11 +16343,11 @@ msgstr "" "waarde (negatief = naar binnen, positief = naar buiten). Dit kan handig zijn " "voor het verfijnen van gaten." -#: src/libslic3r/PrintConfig.cpp:3087 +#: src/libslic3r/PrintConfig.cpp:3175 msgid "Z offset" msgstr "Z-hoogte" -#: src/libslic3r/PrintConfig.cpp:3088 +#: src/libslic3r/PrintConfig.cpp:3176 msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " "output G-code. It is used to compensate for bad Z endstop position: for " @@ -14371,43 +16359,51 @@ msgstr "" "eindstop bijvoorbeeld een waarde gebruikt die 0.3mm van het printbed is, kan " "dit ingesteld worden op -0.3mm." -#: src/libslic3r/PrintConfig.cpp:3097 +#: src/libslic3r/PrintConfig.cpp:3185 msgid "Perimeter generator" -msgstr "" +msgstr "Perimetergeneratie" -#: src/libslic3r/PrintConfig.cpp:3099 +#: src/libslic3r/PrintConfig.cpp:3187 msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " "perimeters with variable extrusion width. This setting also affects the " "Concentric infill." msgstr "" +"Klassieke perimetergeneratie produceert perimeters met constante " +"extrusiebreedte en gebruikt gatenvulling voor dunne stukken. Arachne " +"produceert perimeters met variabele extrusiebreedte. Deze instelling heeft " +"ook effect op concentrische vulling." -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3192 msgid "Classic" -msgstr "" +msgstr "Klassiek" -#: src/libslic3r/PrintConfig.cpp:3107 +#: src/libslic3r/PrintConfig.cpp:3193 msgid "Arachne" -msgstr "" +msgstr "Arachne" -#: src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3199 msgid "Perimeter transition length" -msgstr "" +msgstr "Transitielengte voor perimeters" -#: src/libslic3r/PrintConfig.cpp:3114 +#: src/libslic3r/PrintConfig.cpp:3201 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " "perimeter segments. If expressed as a percentage (for example 100%), it will " "be computed based on the nozzle diameter." msgstr "" +"Bij de overgang naar een verschillend aantal perimeters bij dunnere diktes " +"wordt een bepaalde ruimte gebruikt om te splitten of samenvoegen van " +"perimetersegmenten. Als dit wordt uitgedrukt als percentage (bijvoorbeeld " +"100%), wordt deze berekend op basis van de nozzlediameter." -#: src/libslic3r/PrintConfig.cpp:3123 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Perimeter transitioning filter margin" -msgstr "" +msgstr "Marge voor transitielengte voor perimeters" -#: src/libslic3r/PrintConfig.cpp:3125 +#: src/libslic3r/PrintConfig.cpp:3212 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -14418,12 +16414,19 @@ msgid "" "as a percentage (for example 25%), it will be computed based on the nozzle " "diameter." msgstr "" +"Voorkom transities tussen één en meerdere perimeters. Deze marge breidt het " +"bereik uit van de extrusiebreedte die volgt op [minimale perimeterbreedte - " +"marge, 2x minimale perimeterbreedte + marge]. Verhogen van deze marge " +"reduceert het aantal transities, wat het aantal terugtrekkingen verlaagt. " +"Hoewel, een hogere variatie van de extrusiebreedte kan leiden tot onder- of " +"overextrusie problemen. Als dit wordt uitgedrukt als percentage " +"(bijvoorbeeld 25%) wordt dit berekend op basis van de nozzlediameter." -#: src/libslic3r/PrintConfig.cpp:3138 +#: src/libslic3r/PrintConfig.cpp:3225 msgid "Perimeter transitioning threshold angle" -msgstr "" +msgstr "Transitiehoek voor perimeters" -#: src/libslic3r/PrintConfig.cpp:3140 +#: src/libslic3r/PrintConfig.cpp:3227 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -14431,23 +16434,31 @@ msgid "" "remaining space. Reducing this setting reduces the number and length of " "these center perimeters, but may leave gaps or overextrude." msgstr "" +"When to create transitions between even and odd numbers of perimeters. A " +"wedge shape with an angle greater than this setting will not have " +"transitions and no perimeters will be printed in the center to fill the " +"remaining space. Reducing this setting reduces the number and length of " +"these center perimeters, but may leave gaps or overextrude." -#: src/libslic3r/PrintConfig.cpp:3151 +#: src/libslic3r/PrintConfig.cpp:3238 msgid "Perimeter distribution count" -msgstr "" +msgstr "Perimeterdistributieaantal" -#: src/libslic3r/PrintConfig.cpp:3153 +#: src/libslic3r/PrintConfig.cpp:3240 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " "in width." msgstr "" +"Het aantal perimeters, geteld vanaf het midden waarover de variatie gespreid " +"wordt. Lagere waarde betekenen dat de buitenste perimeter niet in breedte " +"verandert." -#: src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3247 msgid "Minimum feature size" -msgstr "" +msgstr "Minimale objectgrootte" -#: src/libslic3r/PrintConfig.cpp:3162 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " @@ -14455,77 +16466,257 @@ msgid "" "a percentage (for example 25%), it will be computed based on the nozzle " "diameter." msgstr "" +"Minimale dikte van dunne delen. Delen van het model die dunner zijn dan deze " +"waarde worden niet geprint, terwijl delen van het model dikker dan de " +"minimale dikte van dunnen delen worden verbreed tot de minimale " +"perimeterbreedte. Als dit is uitgedrukt als percentage (bijvoorbeeld 25%), " +"wordt dit berekend op basis van de nozzlediameter." -#: src/libslic3r/PrintConfig.cpp:3172 +#: src/libslic3r/PrintConfig.cpp:3259 msgid "Minimum perimeter width" +msgstr "Minimale perimeterbreedte" + +#: src/libslic3r/PrintConfig.cpp:3261 +msgid "" +"Width of the perimeter that will replace thin features (according to the " +"Minimum feature size) of the model. If the Minimum perimeter width is " +"thinner than the thickness of the feature, the perimeter will become as " +"thick as the feature itself. If expressed as a percentage (for example 85%), " +"it will be computed based on the nozzle diameter." +msgstr "" +"Perimeterbreedte die dunne delen vervangt (volgens de minimale dikte van " +"dunne delen) van het model. Als die minimale perimeterbreedte dunner is dan " +"de dikte van de dunne delen, wordt de perimeter net zo dik als het de dunne " +"delen. Als dit is uitgedrukt als percentage (bijvoorbeeld 85%), dan wordt " +"dit berekend op basis van de nozzlediameter." + +#: src/libslic3r/PrintConfig.cpp:3327 +msgid "Pinhead front diameter" +msgstr "Diameter voorzijde pinkop" + +#: src/libslic3r/PrintConfig.cpp:3329 +msgid "Diameter of the pointing side of the head" +msgstr "Diameter van de puntige zijde van de kop" + +#: src/libslic3r/PrintConfig.cpp:3336 +msgid "Head penetration" +msgstr "Koppenetratie" + +#: src/libslic3r/PrintConfig.cpp:3338 +msgid "How much the pinhead has to penetrate the model surface" +msgstr "Hoe ver de supportkop in het model moet steken" + +#: src/libslic3r/PrintConfig.cpp:3345 +msgid "Pinhead width" +msgstr "Pinkopbreedte" + +#: src/libslic3r/PrintConfig.cpp:3347 +msgid "Width from the back sphere center to the front sphere center" +msgstr "Centerafstand van de achterste tot de voorste bol" + +#: src/libslic3r/PrintConfig.cpp:3355 +msgid "Pillar diameter" +msgstr "Pijlerdiameter" + +#: src/libslic3r/PrintConfig.cpp:3357 +msgid "Diameter in mm of the support pillars" +msgstr "Diameter van de supportpijlers (in mm)" + +#: src/libslic3r/PrintConfig.cpp:3365 +msgid "Small pillar diameter percent" +msgstr "Percentage van smalle pijlerdiameter" + +#: src/libslic3r/PrintConfig.cpp:3367 +msgid "" +"The percentage of smaller pillars compared to the normal pillar diameter " +"which are used in problematic areas where a normal pilla cannot fit." +msgstr "" +"Het percentage van smallere pijlers vergeleken met normale pijlerdiameters " +"die worden gebruikt in moeilijk te bereiken plekken." + +#: src/libslic3r/PrintConfig.cpp:3376 +msgid "Max bridges on a pillar" +msgstr "Maximaal aantal bruggen op een pijler" + +#: src/libslic3r/PrintConfig.cpp:3378 +msgid "" +"Maximum number of bridges that can be placed on a pillar. Bridges hold " +"support point pinheads and connect to pillars as small branches." +msgstr "" +"Maximaal aantal bruggen dat op een pijler geplaatst kan worden. Bruggen " +"houden supportpuntkop bij elkaar en verbinden pijlers as smalle takken." + +#: src/libslic3r/PrintConfig.cpp:3386 +msgid "Max weight on model" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3389 +msgid "" +"Maximum weight of sub-trees that terminate on the model instead of the print " +"bed. The weight is the sum of the lenghts of all branches emanating from the " +"endpoint." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3397 +msgid "Pillar connection mode" +msgstr "Pijlerverbindingsmodus" + +#: src/libslic3r/PrintConfig.cpp:3398 +msgid "" +"Controls the bridge type between two neighboring pillars. Can be zig-zag, " +"cross (double zig-zag) or dynamic which will automatically switch between " +"the first two depending on the distance of the two pillars." +msgstr "" +"Geeft het type brug tussen twee aangrenzende pijlers aan. Dit kan zigzag, " +"kruisend (dubbele zigzag) of dynamisch zijn. Dynamisch houdt in dat wordt " +"geschakeld tussen de eerste twee, afhankelijk van de pijlerafstand." + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Zig-Zag" +msgstr "Zigzag" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Cross" +msgstr "Kruisend" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Dynamic" +msgstr "Dynamisch" + +#: src/libslic3r/PrintConfig.cpp:3416 +msgid "Pillar widening factor" +msgstr "Pijlervergrotingsfactor" + +#: src/libslic3r/PrintConfig.cpp:3420 +msgid "" +"Merging bridges or pillars into another pillars can increase the radius. " +"Zero means no increase, one means full increase. The exact amount of " +"increase is unspecified and can change in the future." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3431 +msgid "Support base diameter" +msgstr "Supportbasis - diameter" + +#: src/libslic3r/PrintConfig.cpp:3433 +msgid "Diameter in mm of the pillar base" +msgstr "Diameter van de pijlerbasis (in mm)" + +#: src/libslic3r/PrintConfig.cpp:3441 +msgid "Support base height" +msgstr "Supportbasis - hoogte" + +#: src/libslic3r/PrintConfig.cpp:3443 +msgid "The height of the pillar base cone" +msgstr "Hoogte van de pijlerbasiskegel" + +#: src/libslic3r/PrintConfig.cpp:3450 +msgid "Support base safety distance" +msgstr "Supportbasis - veilige afstand" + +#: src/libslic3r/PrintConfig.cpp:3453 +msgid "" +"The minimum distance of the pillar base from the model in mm. Makes sense in " +"zero elevation mode where a gap according to this parameter is inserted " +"between the model and the pad." +msgstr "" +"Minimale afstand tussen pijlerbasis en model (in mm). Dit is handig bij de " +"modus zonder verhoging waar een gat volgens deze parameter wordt ingevoegd " +"tussen het model en de basisplaat." + +#: src/libslic3r/PrintConfig.cpp:3463 +msgid "Critical angle" +msgstr "Kritische hoek" + +#: src/libslic3r/PrintConfig.cpp:3465 +msgid "The default angle for connecting support sticks and junctions." +msgstr "De standaardhoek voor de verbinding van supporttakken en kruisingen." + +#: src/libslic3r/PrintConfig.cpp:3473 +msgid "Max bridge length" +msgstr "Maximale bruglengte" + +#: src/libslic3r/PrintConfig.cpp:3475 +msgid "The max length of a bridge" +msgstr "Maximale bruglengte" + +#: src/libslic3r/PrintConfig.cpp:3487 +msgid "Max pillar linking distance" +msgstr "Maximale pijler-verbindafstand" + +#: src/libslic3r/PrintConfig.cpp:3489 +msgid "" +"The max distance of two pillars to get linked with each other. A zero value " +"will prohibit pillar cascading." msgstr "" +"Maximale verbindingsafstand van twee pijlers. Een waarde van 0 schakelt aan " +"elkaar verbonden pijlers uit." -#: src/libslic3r/PrintConfig.cpp:3174 +#: src/libslic3r/PrintConfig.cpp:3499 msgid "" -"Width of the perimeter that will replace thin features (according to the " -"Minimum feature size) of the model. If the Minimum perimeter width is " -"thinner than the thickness of the feature, the perimeter will become as " -"thick as the feature itself. If expressed as a percentage (for example 85%), " -"it will be computed based on the nozzle diameter." +"How much the supports should lift up the supported object. If \"Pad around " +"object\" is enabled, this value is ignored." msgstr "" +"Hoe veel het support omhoog moet bewegen op het ondersteunde object. Als " +"'Basisplaat rondom object' is ingeschakeld wordt deze waarde genegeerd." -#: src/libslic3r/PrintConfig.cpp:3242 +#: src/libslic3r/PrintConfig.cpp:3515 msgid "Display width" msgstr "Schermbreedte" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3516 msgid "Width of the display" msgstr "Breedte van het scherm" -#: src/libslic3r/PrintConfig.cpp:3248 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "Display height" msgstr "Schermhoogte" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3522 msgid "Height of the display" msgstr "Hoogte van het scherm" -#: src/libslic3r/PrintConfig.cpp:3254 +#: src/libslic3r/PrintConfig.cpp:3527 msgid "Number of pixels in" msgstr "Aantal pixels" -#: src/libslic3r/PrintConfig.cpp:3256 +#: src/libslic3r/PrintConfig.cpp:3529 msgid "Number of pixels in X" msgstr "Aantal pixels in de breedte" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3535 msgid "Number of pixels in Y" msgstr "Aantal pixels in de hoogte" -#: src/libslic3r/PrintConfig.cpp:3267 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Display horizontal mirroring" msgstr "Scherm horizontaal spiegelen" -#: src/libslic3r/PrintConfig.cpp:3268 +#: src/libslic3r/PrintConfig.cpp:3541 msgid "Mirror horizontally" msgstr "Spiegel horizontaal" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3542 msgid "Enable horizontal mirroring of output images" msgstr "Horizontaal spiegelen" -#: src/libslic3r/PrintConfig.cpp:3274 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Display vertical mirroring" msgstr "Scherm verticaal spiegelen" -#: src/libslic3r/PrintConfig.cpp:3275 +#: src/libslic3r/PrintConfig.cpp:3548 msgid "Mirror vertically" msgstr "Verticaal spiegelen" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "Enable vertical mirroring of output images" msgstr "Verticaal spiegelen" -#: src/libslic3r/PrintConfig.cpp:3281 +#: src/libslic3r/PrintConfig.cpp:3554 msgid "Display orientation" msgstr "Schermoriëntatie" -#: src/libslic3r/PrintConfig.cpp:3282 +#: src/libslic3r/PrintConfig.cpp:3555 msgid "" "Set the actual LCD display orientation inside the SLA printer. Portrait mode " "will flip the meaning of display width and height parameters and the output " @@ -14535,55 +16726,55 @@ msgstr "" "Staande modus zal de breedte- en hoogteparameters omwisselen en de output " "wordt 90 graden gedraaid." -#: src/libslic3r/PrintConfig.cpp:3288 +#: src/libslic3r/PrintConfig.cpp:3559 msgid "Landscape" msgstr "Liggend" -#: src/libslic3r/PrintConfig.cpp:3289 +#: src/libslic3r/PrintConfig.cpp:3560 msgid "Portrait" msgstr "Staand" -#: src/libslic3r/PrintConfig.cpp:3294 src/libslic3r/PrintConfig.cpp:3929 +#: src/libslic3r/PrintConfig.cpp:3566 src/libslic3r/PrintConfig.cpp:4058 msgid "Fast" msgstr "Snel" -#: src/libslic3r/PrintConfig.cpp:3295 +#: src/libslic3r/PrintConfig.cpp:3567 msgid "Fast tilt" msgstr "Snelle draaiing" -#: src/libslic3r/PrintConfig.cpp:3296 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Time of the fast tilt" msgstr "Tijd van de snelle draaiing" -#: src/libslic3r/PrintConfig.cpp:3303 src/libslic3r/PrintConfig.cpp:3928 +#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:4057 msgid "Slow" msgstr "Langzaam" -#: src/libslic3r/PrintConfig.cpp:3304 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Slow tilt" msgstr "Langzaam draaien" -#: src/libslic3r/PrintConfig.cpp:3305 +#: src/libslic3r/PrintConfig.cpp:3577 msgid "Time of the slow tilt" msgstr "Tijd van de langzame draaiing" -#: src/libslic3r/PrintConfig.cpp:3312 src/libslic3r/PrintConfig.cpp:3930 +#: src/libslic3r/PrintConfig.cpp:3584 src/libslic3r/PrintConfig.cpp:4059 msgid "High viscosity" -msgstr "" +msgstr "Hoge viscositeit" -#: src/libslic3r/PrintConfig.cpp:3313 +#: src/libslic3r/PrintConfig.cpp:3585 msgid "Tilt for high viscosity resin" -msgstr "" +msgstr "Draaiing voor hoogvisceuze resin" -#: src/libslic3r/PrintConfig.cpp:3314 +#: src/libslic3r/PrintConfig.cpp:3586 msgid "Time of the super slow tilt" -msgstr "" +msgstr "Tijd van de zeer langzame draaiing" -#: src/libslic3r/PrintConfig.cpp:3321 +#: src/libslic3r/PrintConfig.cpp:3593 msgid "Area fill" msgstr "Vulgebied" -#: src/libslic3r/PrintConfig.cpp:3322 +#: src/libslic3r/PrintConfig.cpp:3594 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -14593,40 +16784,40 @@ msgstr "" "Als het printgebied buiten een specifieke waarde valt \n" "wordt een korte draaiing gebruikt, anders een snelle" -#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 -#: src/libslic3r/PrintConfig.cpp:3331 +#: src/libslic3r/PrintConfig.cpp:3601 src/libslic3r/PrintConfig.cpp:3602 +#: src/libslic3r/PrintConfig.cpp:3603 msgid "Printer scaling correction" msgstr "Verschalingscorrectie voor printer" -#: src/libslic3r/PrintConfig.cpp:3337 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3609 src/libslic3r/PrintConfig.cpp:3611 msgid "Printer scaling correction in X axis" msgstr "Verschalingscorrectie over de X-as" -#: src/libslic3r/PrintConfig.cpp:3338 +#: src/libslic3r/PrintConfig.cpp:3610 msgid "Printer scaling X axis correction" msgstr "Verschalingscorrectie in X-richting" -#: src/libslic3r/PrintConfig.cpp:3345 src/libslic3r/PrintConfig.cpp:3347 +#: src/libslic3r/PrintConfig.cpp:3617 src/libslic3r/PrintConfig.cpp:3619 msgid "Printer scaling correction in Y axis" msgstr "Verschalingscorrectie over de Y-as" -#: src/libslic3r/PrintConfig.cpp:3346 +#: src/libslic3r/PrintConfig.cpp:3618 msgid "Printer scaling Y axis correction" msgstr "Verschalingscorrectie in Y-riching" -#: src/libslic3r/PrintConfig.cpp:3353 src/libslic3r/PrintConfig.cpp:3355 +#: src/libslic3r/PrintConfig.cpp:3625 src/libslic3r/PrintConfig.cpp:3627 msgid "Printer scaling correction in Z axis" msgstr "Verschalingscorrectie over de Z-as" -#: src/libslic3r/PrintConfig.cpp:3354 +#: src/libslic3r/PrintConfig.cpp:3626 msgid "Printer scaling Z axis correction" msgstr "Verschalingscorrectie in Z-riching" -#: src/libslic3r/PrintConfig.cpp:3361 src/libslic3r/PrintConfig.cpp:3362 +#: src/libslic3r/PrintConfig.cpp:3633 src/libslic3r/PrintConfig.cpp:3634 msgid "Printer absolute correction" msgstr "Absolute correctie voor printer" -#: src/libslic3r/PrintConfig.cpp:3363 +#: src/libslic3r/PrintConfig.cpp:3635 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." @@ -14634,20 +16825,20 @@ msgstr "" "Zal de geslicede veelhoeken uitrekken of laten krimpen, afhankelijk van de " "correctiewaarde." -#: src/libslic3r/PrintConfig.cpp:3369 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Elephant foot minimum width" msgstr "Squish-compensatiebreedte" -#: src/libslic3r/PrintConfig.cpp:3371 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "Minimale breedte van delen waarop squish-compensatie wordt toegepast." -#: src/libslic3r/PrintConfig.cpp:3378 src/libslic3r/PrintConfig.cpp:3379 +#: src/libslic3r/PrintConfig.cpp:3650 src/libslic3r/PrintConfig.cpp:3651 msgid "Printer gamma correction" msgstr "Gammacorrectie voor printer" -#: src/libslic3r/PrintConfig.cpp:3380 +#: src/libslic3r/PrintConfig.cpp:3652 msgid "" "This will apply a gamma correction to the rasterized 2D polygons. A gamma " "value of zero means thresholding with the threshold in the middle. This " @@ -14657,43 +16848,53 @@ msgstr "" "betekent een waarde die in het midden ligt. Dit gedrag elimineert anti-" "aliasing zonder dat gaten in de veelhoeken verloren gaan." -#: src/libslic3r/PrintConfig.cpp:3399 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3671 src/libslic3r/PrintConfig.cpp:3672 msgid "SLA material type" msgstr "SLA-materiaaltype" -#: src/libslic3r/PrintConfig.cpp:3411 src/libslic3r/PrintConfig.cpp:3412 +#: src/libslic3r/PrintConfig.cpp:3679 src/libslic3r/PrintConfig.cpp:3680 msgid "Initial layer height" msgstr "Laagdikte eerste laag" -#: src/libslic3r/PrintConfig.cpp:3418 src/libslic3r/PrintConfig.cpp:3419 +#: src/libslic3r/PrintConfig.cpp:3686 +msgid "Idle temperature" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3687 +msgid "" +"Nozzle temperature when the tool is currently not used in multi-tool setups." +"This is only used when 'Ooze prevention' is active in Print Settings." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3695 src/libslic3r/PrintConfig.cpp:3696 msgid "Bottle volume" msgstr "Flesinhoud (volume)" -#: src/libslic3r/PrintConfig.cpp:3420 +#: src/libslic3r/PrintConfig.cpp:3697 msgid "ml" msgstr "ml" -#: src/libslic3r/PrintConfig.cpp:3425 src/libslic3r/PrintConfig.cpp:3426 +#: src/libslic3r/PrintConfig.cpp:3702 src/libslic3r/PrintConfig.cpp:3703 msgid "Bottle weight" msgstr "Flesinhoud (gewicht)" -#: src/libslic3r/PrintConfig.cpp:3427 +#: src/libslic3r/PrintConfig.cpp:3704 msgid "kg" msgstr "kg" -#: src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "g/ml" msgstr "g/ml" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3718 msgid "money/bottle" msgstr "€/fles" -#: src/libslic3r/PrintConfig.cpp:3446 +#: src/libslic3r/PrintConfig.cpp:3723 msgid "Faded layers" msgstr "Transitielagen" -#: src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3724 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" @@ -14701,259 +16902,119 @@ msgstr "" "Aantal lagen waarin de initiële belichtingstijd stapsgewijs wordt " "teruggebracht naar de standaard belichtingstijd" -#: src/libslic3r/PrintConfig.cpp:3454 src/libslic3r/PrintConfig.cpp:3455 +#: src/libslic3r/PrintConfig.cpp:3731 src/libslic3r/PrintConfig.cpp:3732 msgid "Minimum exposure time" msgstr "Minimale belichtingstijd" -#: src/libslic3r/PrintConfig.cpp:3462 src/libslic3r/PrintConfig.cpp:3463 +#: src/libslic3r/PrintConfig.cpp:3739 src/libslic3r/PrintConfig.cpp:3740 msgid "Maximum exposure time" msgstr "Maximale belichtingstijd" -#: src/libslic3r/PrintConfig.cpp:3470 src/libslic3r/PrintConfig.cpp:3471 +#: src/libslic3r/PrintConfig.cpp:3747 src/libslic3r/PrintConfig.cpp:3748 msgid "Exposure time" msgstr "Belichtingstijd" -#: src/libslic3r/PrintConfig.cpp:3477 src/libslic3r/PrintConfig.cpp:3478 +#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3755 msgid "Minimum initial exposure time" msgstr "Minimale initiële belichtingstijd" -#: src/libslic3r/PrintConfig.cpp:3485 src/libslic3r/PrintConfig.cpp:3486 +#: src/libslic3r/PrintConfig.cpp:3762 src/libslic3r/PrintConfig.cpp:3763 msgid "Maximum initial exposure time" msgstr "Maximale initiële belichtingstijd" -#: src/libslic3r/PrintConfig.cpp:3493 src/libslic3r/PrintConfig.cpp:3494 +#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3771 msgid "Initial exposure time" msgstr "Initiële belichtingstijd" -#: src/libslic3r/PrintConfig.cpp:3500 src/libslic3r/PrintConfig.cpp:3501 +#: src/libslic3r/PrintConfig.cpp:3777 src/libslic3r/PrintConfig.cpp:3778 msgid "Correction for expansion" msgstr "Vergrotingscorrectie" -#: src/libslic3r/PrintConfig.cpp:3507 src/libslic3r/PrintConfig.cpp:3508 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3785 msgid "Correction for expansion in X axis" msgstr "Uitzettingscorrectie over de X-as" -#: src/libslic3r/PrintConfig.cpp:3514 src/libslic3r/PrintConfig.cpp:3515 +#: src/libslic3r/PrintConfig.cpp:3791 src/libslic3r/PrintConfig.cpp:3792 msgid "Correction for expansion in Y axis" msgstr "Uitzettingscorrectie over de Y-as" -#: src/libslic3r/PrintConfig.cpp:3521 src/libslic3r/PrintConfig.cpp:3522 +#: src/libslic3r/PrintConfig.cpp:3798 src/libslic3r/PrintConfig.cpp:3799 msgid "Correction for expansion in Z axis" msgstr "Uitzettingscorrectie over de Z-as" -#: src/libslic3r/PrintConfig.cpp:3528 +#: src/libslic3r/PrintConfig.cpp:3805 msgid "SLA print material notes" msgstr "SLA-printmateriaal opmerkingen" -#: src/libslic3r/PrintConfig.cpp:3529 +#: src/libslic3r/PrintConfig.cpp:3806 msgid "You can put your notes regarding the SLA print material here." msgstr "U kunt hier opmerkingen plaatsen wat betreft het SLA-materiaal." -#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3552 +#: src/libslic3r/PrintConfig.cpp:3818 src/libslic3r/PrintConfig.cpp:3829 msgid "Default SLA material profile" msgstr "Standaard SLA-materiaalprofiel" -#: src/libslic3r/PrintConfig.cpp:3563 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "Generate supports" msgstr "Genereer support" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3842 msgid "Generate supports for the models" msgstr "Genereer support voor de modellen" -#: src/libslic3r/PrintConfig.cpp:3570 -msgid "Pinhead front diameter" -msgstr "Diameter voorzijde pinkop" - -#: src/libslic3r/PrintConfig.cpp:3572 -msgid "Diameter of the pointing side of the head" -msgstr "Diameter van de puntige zijde van de kop" - -#: src/libslic3r/PrintConfig.cpp:3579 -msgid "Head penetration" -msgstr "Koppenetratie" - -#: src/libslic3r/PrintConfig.cpp:3581 -msgid "How much the pinhead has to penetrate the model surface" -msgstr "Hoe ver de supportkop in het model moet steken" - -#: src/libslic3r/PrintConfig.cpp:3588 -msgid "Pinhead width" -msgstr "Pinkopbreedte" - -#: src/libslic3r/PrintConfig.cpp:3590 -msgid "Width from the back sphere center to the front sphere center" -msgstr "Centerafstand van de achterste tot de voorste bol" - -#: src/libslic3r/PrintConfig.cpp:3598 -msgid "Pillar diameter" -msgstr "Pijlerdiameter" - -#: src/libslic3r/PrintConfig.cpp:3600 -msgid "Diameter in mm of the support pillars" -msgstr "Diameter van de supportpijlers (in mm)" - -#: src/libslic3r/PrintConfig.cpp:3608 -msgid "Small pillar diameter percent" -msgstr "Percentage van smalle pijlerdiameter" - -#: src/libslic3r/PrintConfig.cpp:3610 -msgid "" -"The percentage of smaller pillars compared to the normal pillar diameter " -"which are used in problematic areas where a normal pilla cannot fit." -msgstr "" -"Het percentage van smallere pijlers vergeleken met normale pijlerdiameters " -"die worden gebruikt in moeilijk te bereiken plekken." - -#: src/libslic3r/PrintConfig.cpp:3619 -msgid "Max bridges on a pillar" -msgstr "Maximaal aantal bruggen op een pijler" - -#: src/libslic3r/PrintConfig.cpp:3621 -msgid "" -"Maximum number of bridges that can be placed on a pillar. Bridges hold " -"support point pinheads and connect to pillars as small branches." -msgstr "" -"Maximaal aantal bruggen dat op een pijler geplaatst kan worden. Bruggen " -"houden supportpuntkop bij elkaar en verbinden pijlers as smalle takken." - -#: src/libslic3r/PrintConfig.cpp:3629 -msgid "Pillar connection mode" -msgstr "Pijlerverbindingsmodus" - -#: src/libslic3r/PrintConfig.cpp:3630 -msgid "" -"Controls the bridge type between two neighboring pillars. Can be zig-zag, " -"cross (double zig-zag) or dynamic which will automatically switch between " -"the first two depending on the distance of the two pillars." +#: src/libslic3r/PrintConfig.cpp:3847 +msgid "Support tree type" msgstr "" -"Geeft het type brug tussen twee aangrenzende pijlers aan. Dit kan zigzag, " -"kruisend (dubbele zigzag) of dynamisch zijn. Dynamisch houdt in dat wordt " -"geschakeld tussen de eerste twee, afhankelijk van de pijlerafstand." - -#: src/libslic3r/PrintConfig.cpp:3638 -msgid "Zig-Zag" -msgstr "Zigzag" - -#: src/libslic3r/PrintConfig.cpp:3639 -msgid "Cross" -msgstr "Kruisend" - -#: src/libslic3r/PrintConfig.cpp:3640 -msgid "Dynamic" -msgstr "Dynamisch" - -#: src/libslic3r/PrintConfig.cpp:3652 -msgid "Pillar widening factor" -msgstr "Pijlervergrotingsfactor" -#: src/libslic3r/PrintConfig.cpp:3654 -msgid "" -"Merging bridges or pillars into another pillars can increase the radius. " -"Zero means no increase, one means full increase." +#: src/libslic3r/PrintConfig.cpp:3848 +msgid "Support tree building strategy" msgstr "" -"Bruggen of pijlers samenvoegen met andere pijlers kan de radius vergroten. 0 " -"betekent geen vergroting, 1 betekent volle vergroting." - -#: src/libslic3r/PrintConfig.cpp:3663 -msgid "Support base diameter" -msgstr "Supportbasis - diameter" - -#: src/libslic3r/PrintConfig.cpp:3665 -msgid "Diameter in mm of the pillar base" -msgstr "Diameter van de pijlerbasis (in mm)" - -#: src/libslic3r/PrintConfig.cpp:3673 -msgid "Support base height" -msgstr "Supportbasis - hoogte" - -#: src/libslic3r/PrintConfig.cpp:3675 -msgid "The height of the pillar base cone" -msgstr "Hoogte van de pijlerbasiskegel" - -#: src/libslic3r/PrintConfig.cpp:3682 -msgid "Support base safety distance" -msgstr "Supportbasis - veilige afstand" -#: src/libslic3r/PrintConfig.cpp:3685 -msgid "" -"The minimum distance of the pillar base from the model in mm. Makes sense in " -"zero elevation mode where a gap according to this parameter is inserted " -"between the model and the pad." +#: src/libslic3r/PrintConfig.cpp:3851 +msgid "Branching (experimental)" msgstr "" -"Minimale afstand tussen pijlerbasis en model (in mm). Dit is handig bij de " -"modus zonder verhoging waar een gat volgens deze parameter wordt ingevoegd " -"tussen het model en de basisplaat." - -#: src/libslic3r/PrintConfig.cpp:3695 -msgid "Critical angle" -msgstr "Kritische hoek" - -#: src/libslic3r/PrintConfig.cpp:3697 -msgid "The default angle for connecting support sticks and junctions." -msgstr "De standaardhoek voor de verbinding van supporttakken en kruisingen." - -#: src/libslic3r/PrintConfig.cpp:3705 -msgid "Max bridge length" -msgstr "Maximale bruglengte" - -#: src/libslic3r/PrintConfig.cpp:3707 -msgid "The max length of a bridge" -msgstr "Maximale bruglengte" - -#: src/libslic3r/PrintConfig.cpp:3714 -msgid "Max pillar linking distance" -msgstr "Maximale pijler-verbindafstand" -#: src/libslic3r/PrintConfig.cpp:3716 -msgid "" -"The max distance of two pillars to get linked with each other. A zero value " -"will prohibit pillar cascading." +#: src/libslic3r/PrintConfig.cpp:3860 +msgid "Support only in enforced regions" msgstr "" -"Maximale verbindingsafstand van twee pijlers. Een waarde van 0 schakelt aan " -"elkaar verbonden pijlers uit." -#: src/libslic3r/PrintConfig.cpp:3726 -msgid "" -"How much the supports should lift up the supported object. If \"Pad around " -"object\" is enabled, this value is ignored." +#: src/libslic3r/PrintConfig.cpp:3862 +msgid "Only create support if it lies in a support enforcer." msgstr "" -"Hoe veel het support omhoog moet bewegen op het ondersteunde object. Als " -"'Basisplaat rondom object' is ingeschakeld wordt deze waarde genegeerd." -#: src/libslic3r/PrintConfig.cpp:3737 +#: src/libslic3r/PrintConfig.cpp:3869 msgid "This is a relative measure of support points density." msgstr "Relatieve waarde van de dichtheid van supportpunten." -#: src/libslic3r/PrintConfig.cpp:3743 +#: src/libslic3r/PrintConfig.cpp:3875 msgid "Minimal distance of the support points" msgstr "Minimale supportpuntafstand" -#: src/libslic3r/PrintConfig.cpp:3745 +#: src/libslic3r/PrintConfig.cpp:3877 msgid "No support points will be placed closer than this threshold." msgstr "Minimale afstand tussen supportpunten." -#: src/libslic3r/PrintConfig.cpp:3751 +#: src/libslic3r/PrintConfig.cpp:3883 msgid "Use pad" msgstr "Gebruik basisplaat" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3885 msgid "Add a pad underneath the supported model" msgstr "Voeg een basisplaat toe onder het model met support" -#: src/libslic3r/PrintConfig.cpp:3758 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "Pad wall thickness" msgstr "Basisplaat - wanddikte" -#: src/libslic3r/PrintConfig.cpp:3760 +#: src/libslic3r/PrintConfig.cpp:3892 msgid "The thickness of the pad and its optional cavity walls." msgstr "Dikte van de basisplaat en optionele wanden." -#: src/libslic3r/PrintConfig.cpp:3768 +#: src/libslic3r/PrintConfig.cpp:3900 msgid "Pad wall height" msgstr "Basisplaat - wandhoogte" -#: src/libslic3r/PrintConfig.cpp:3769 +#: src/libslic3r/PrintConfig.cpp:3901 msgid "" "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " "when enabling this feature, as some resins may produce an extreme suction " @@ -14965,19 +17026,19 @@ msgstr "" "sommige resins een sterk zuigeffect in de holte produceren, wat het afpellen " "van de print van het folie lastig kan maken." -#: src/libslic3r/PrintConfig.cpp:3782 +#: src/libslic3r/PrintConfig.cpp:3914 msgid "Pad brim size" msgstr "Basisplaat - expansie" -#: src/libslic3r/PrintConfig.cpp:3783 +#: src/libslic3r/PrintConfig.cpp:3915 msgid "How far should the pad extend around the contained geometry" msgstr "Hoe ver de basisplaat moet uitsteken buiten de geometrie" -#: src/libslic3r/PrintConfig.cpp:3793 +#: src/libslic3r/PrintConfig.cpp:3925 msgid "Max merge distance" msgstr "Maximale combineerafstand" -#: src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3927 msgid "" "Some objects can get along with a few smaller pads instead of a single big " "one. This parameter defines how far the center of two smaller pads should " @@ -14987,11 +17048,11 @@ msgstr "" "van één grote. Deze parameter bepaalt hoe ver de tussenafstand van de " "kleinere basisplaten mogen zijn." -#: src/libslic3r/PrintConfig.cpp:3815 +#: src/libslic3r/PrintConfig.cpp:3947 msgid "Pad wall slope" msgstr "Basisplaat - zijhoek" -#: src/libslic3r/PrintConfig.cpp:3817 +#: src/libslic3r/PrintConfig.cpp:3949 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." @@ -14999,23 +17060,23 @@ msgstr "" "Hoek van de basisplaatzijde ten opzichte van het bed. 90 graden betekent een " "rechte zijkant." -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3960 msgid "Create pad around object and ignore the support elevation" msgstr "Genereer basisplaat rondom object en schakel objectverhoging uit" -#: src/libslic3r/PrintConfig.cpp:3833 +#: src/libslic3r/PrintConfig.cpp:3965 msgid "Pad around object everywhere" msgstr "Overal basisplaat rondom object" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3967 msgid "Force pad around object everywhere" msgstr "Forceer basisplaat overal rondom het object" -#: src/libslic3r/PrintConfig.cpp:3840 +#: src/libslic3r/PrintConfig.cpp:3972 msgid "Pad object gap" msgstr "Basisplaat - gat" -#: src/libslic3r/PrintConfig.cpp:3842 +#: src/libslic3r/PrintConfig.cpp:3974 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." @@ -15023,11 +17084,11 @@ msgstr "" "Het gat tussen de onderkant van het object en de gegenereerde basisplaat in " "de modus zonder verhoging." -#: src/libslic3r/PrintConfig.cpp:3851 +#: src/libslic3r/PrintConfig.cpp:3983 msgid "Pad object connector stride" msgstr "Basisplaat - verbindingstakafstand" -#: src/libslic3r/PrintConfig.cpp:3853 +#: src/libslic3r/PrintConfig.cpp:3985 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." @@ -15035,46 +17096,46 @@ msgstr "" "Afstand tussen twee verbindingstakken die het object verbinden aan de " "basisplaat." -#: src/libslic3r/PrintConfig.cpp:3860 +#: src/libslic3r/PrintConfig.cpp:3992 msgid "Pad object connector width" msgstr "Basisplaat - verbindingstakbreedte" -#: src/libslic3r/PrintConfig.cpp:3862 +#: src/libslic3r/PrintConfig.cpp:3994 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "" "Breedte van de verbindingstakken die het object en de basisplaat met elkaar " "verbinden." -#: src/libslic3r/PrintConfig.cpp:3869 +#: src/libslic3r/PrintConfig.cpp:4001 msgid "Pad object connector penetration" msgstr "Basisplaat - Verbindingstakinsteek" -#: src/libslic3r/PrintConfig.cpp:3872 +#: src/libslic3r/PrintConfig.cpp:4004 msgid "How much should the tiny connectors penetrate into the model body." msgstr "Hoe ver de verbindingstakken in het model steken." -#: src/libslic3r/PrintConfig.cpp:3879 +#: src/libslic3r/PrintConfig.cpp:4011 msgid "Enable hollowing" msgstr "Uithollen toestaan" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:4013 msgid "Hollow out a model to have an empty interior" msgstr "Hol een model uit voor een leeg binnenste" -#: src/libslic3r/PrintConfig.cpp:3886 +#: src/libslic3r/PrintConfig.cpp:4018 msgid "Wall thickness" msgstr "Wanddikte" -#: src/libslic3r/PrintConfig.cpp:3888 +#: src/libslic3r/PrintConfig.cpp:4020 msgid "Minimum wall thickness of a hollowed model." msgstr "Minimale wanddikte van een uitgehold model." -#: src/libslic3r/PrintConfig.cpp:3896 +#: src/libslic3r/PrintConfig.cpp:4028 msgid "Accuracy" msgstr "Nauwkeurigheid" -#: src/libslic3r/PrintConfig.cpp:3898 +#: src/libslic3r/PrintConfig.cpp:4030 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." @@ -15082,7 +17143,7 @@ msgstr "" "Prestatie tegenover nauwkeurigheid van berekenen. Lagere waarde kunnen " "ongewenste artefacten produceren." -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:4040 msgid "" "Hollowing is done in two steps: first, an imaginary interior is calculated " "deeper (offset plus the closing distance) in the object and then it's " @@ -15096,11 +17157,11 @@ msgstr "" "binnenste ronder. Bij een waarde van 0 is het binnenste vrijwel gelijk aan " "de buitenzijde." -#: src/libslic3r/PrintConfig.cpp:3920 +#: src/libslic3r/PrintConfig.cpp:4052 msgid "Print speed" msgstr "Printsnelheid" -#: src/libslic3r/PrintConfig.cpp:3922 +#: src/libslic3r/PrintConfig.cpp:4054 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " @@ -15110,63 +17171,91 @@ msgstr "" "vloeibaarheid of met holle delen. Het vertraagt de kantelbeweging en voegt " "een vertraging toe na de belichting." -#: src/libslic3r/PrintConfig.cpp:4390 +#: src/libslic3r/PrintConfig.cpp:4065 +msgid "Format of the output SLA archive" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4070 +msgid "SLA output precision" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4071 +msgid "Minimum resolution in nanometers" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4542 msgid "Export OBJ" msgstr "Exporteer OBJ" -#: src/libslic3r/PrintConfig.cpp:4391 +#: src/libslic3r/PrintConfig.cpp:4543 msgid "Export the model(s) as OBJ." -msgstr "Exporteer de modellen als OBJ-bestand." +msgstr "Exporteer de modellen als .OBJ-bestand." -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4554 msgid "Export SLA" msgstr "Exporteer SLA" -#: src/libslic3r/PrintConfig.cpp:4403 +#: src/libslic3r/PrintConfig.cpp:4555 msgid "Slice the model and export SLA printing layers as PNG." -msgstr "Slice het model en exporteer SLA-printlagen als PNG-bestanden." +msgstr "Slice het model en exporteer SLA-printlagen als .PNG-bestanden." -#: src/libslic3r/PrintConfig.cpp:4408 +#: src/libslic3r/PrintConfig.cpp:4560 msgid "Export 3MF" msgstr "Exporteer 3MF" -#: src/libslic3r/PrintConfig.cpp:4409 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Export the model(s) as 3MF." -msgstr "Exporteer de modellen als 3MF-bestanden." +msgstr "Exporteer de modellen als .3MF-bestanden." -#: src/libslic3r/PrintConfig.cpp:4413 +#: src/libslic3r/PrintConfig.cpp:4565 msgid "Export AMF" msgstr "Exporteer AMF" -#: src/libslic3r/PrintConfig.cpp:4414 +#: src/libslic3r/PrintConfig.cpp:4566 msgid "Export the model(s) as AMF." -msgstr "Exporteer de modellen als AMF-bestanden." +msgstr "Exporteer de modellen als .AMF-bestanden." -#: src/libslic3r/PrintConfig.cpp:4418 +#: src/libslic3r/PrintConfig.cpp:4570 msgid "Export STL" msgstr "Exporteer STL" -#: src/libslic3r/PrintConfig.cpp:4419 +#: src/libslic3r/PrintConfig.cpp:4571 msgid "Export the model(s) as STL." -msgstr "Exporteer de modellen als STL-bestand." +msgstr "Exporteer de modellen als .STL-bestand." -#: src/libslic3r/PrintConfig.cpp:4424 +#: src/libslic3r/PrintConfig.cpp:4576 msgid "Slice the model and export toolpaths as G-code." -msgstr "Slice het model en exporteer de paden als G-code-bestand." +msgstr "Slice het model en exporteer de paden als .gcode-bestand." -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4581 msgid "G-code viewer" msgstr "G-code weergave" -#: src/libslic3r/PrintConfig.cpp:4430 +#: src/libslic3r/PrintConfig.cpp:4582 msgid "Visualize an already sliced and saved G-code" msgstr "Visualiseer een reeds opgeslagen G-code" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4588 +msgid "OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4589 +msgid "Select the specified OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4594 +msgid "OpenGL debug output" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4595 +msgid "Activate OpenGL debug output on graphic cards which support it" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4601 msgid "Slice" msgstr "Slice" -#: src/libslic3r/PrintConfig.cpp:4436 +#: src/libslic3r/PrintConfig.cpp:4602 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." @@ -15174,67 +17263,71 @@ msgstr "" "Slice het model als FFF of SLA, gebaseerd op de 'printer_technology'-" "configuratiewaarde." -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4607 msgid "Help" msgstr "Help" -#: src/libslic3r/PrintConfig.cpp:4442 +#: src/libslic3r/PrintConfig.cpp:4608 msgid "Show this help." msgstr "Toon deze hulp zien." -#: src/libslic3r/PrintConfig.cpp:4447 +#: src/libslic3r/PrintConfig.cpp:4613 msgid "Help (FFF options)" msgstr "Help (FFF-opties)" -#: src/libslic3r/PrintConfig.cpp:4448 +#: src/libslic3r/PrintConfig.cpp:4614 msgid "Show the full list of print/G-code configuration options." msgstr "Toon de volledige lijst van print- of G-code-configuratie-opties." -#: src/libslic3r/PrintConfig.cpp:4452 +#: src/libslic3r/PrintConfig.cpp:4618 msgid "Help (SLA options)" msgstr "Help (SLA opties)" -#: src/libslic3r/PrintConfig.cpp:4453 +#: src/libslic3r/PrintConfig.cpp:4619 msgid "Show the full list of SLA print configuration options." msgstr "Toon de volledige lijst van SLA-printconfiguratie-opties." -#: src/libslic3r/PrintConfig.cpp:4457 +#: src/libslic3r/PrintConfig.cpp:4623 msgid "Output Model Info" msgstr "Output model-info" -#: src/libslic3r/PrintConfig.cpp:4458 +#: src/libslic3r/PrintConfig.cpp:4624 msgid "Write information about the model to the console." msgstr "Schrijf informatie over het model naar de console." -#: src/libslic3r/PrintConfig.cpp:4462 +#: src/libslic3r/PrintConfig.cpp:4628 msgid "Save config file" msgstr "Sla configuratiebestand op" -#: src/libslic3r/PrintConfig.cpp:4463 +#: src/libslic3r/PrintConfig.cpp:4629 msgid "Save configuration to the specified file." msgstr "Sla configuratie op in aangegeven bestand." -#: src/libslic3r/PrintConfig.cpp:4473 +#: src/libslic3r/PrintConfig.cpp:4639 msgid "Align XY" msgstr "XY uitlijnen" -#: src/libslic3r/PrintConfig.cpp:4474 +#: src/libslic3r/PrintConfig.cpp:4640 msgid "Align the model to the given point." msgstr "Lijn de modellen uit op het gegeven punt." -#: src/libslic3r/PrintConfig.cpp:4479 +#: src/libslic3r/PrintConfig.cpp:4645 msgid "Cut model at the given Z." msgstr "Snijdt model op de ingestelde hoogte." -#: src/libslic3r/PrintConfig.cpp:4501 +#: src/libslic3r/PrintConfig.cpp:4666 +msgid "Center" +msgstr "Centreer" + +#: src/libslic3r/PrintConfig.cpp:4667 msgid "Center the print around the given center." msgstr "Centreer de print op het middelpunt." -#: src/libslic3r/PrintConfig.cpp:4505 +#: src/libslic3r/PrintConfig.cpp:4671 msgid "Don't arrange" msgstr "Niet schikken" -#: src/libslic3r/PrintConfig.cpp:4506 +#: src/libslic3r/PrintConfig.cpp:4672 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." @@ -15242,11 +17335,11 @@ msgstr "" "Herschik de modellen niet voor het samenvoegen en behoudt de originele X- en " "Y-coördinaten." -#: src/libslic3r/PrintConfig.cpp:4509 +#: src/libslic3r/PrintConfig.cpp:4675 msgid "Ensure on bed" msgstr "Plaats op bed" -#: src/libslic3r/PrintConfig.cpp:4510 +#: src/libslic3r/PrintConfig.cpp:4676 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." @@ -15254,23 +17347,23 @@ msgstr "" "Til het object boven het bed als deze er gedeeltelijk onder valt. Staat " "standaard aan. Gebruik \"no_ensure_on_bed\" om uit te zetten." -#: src/libslic3r/PrintConfig.cpp:4514 +#: src/libslic3r/PrintConfig.cpp:4680 msgid "Duplicate" msgstr "Dupliceer" -#: src/libslic3r/PrintConfig.cpp:4515 +#: src/libslic3r/PrintConfig.cpp:4681 msgid "Multiply copies by this factor." msgstr "Meerdere kopieën van dit aantal." -#: src/libslic3r/PrintConfig.cpp:4519 +#: src/libslic3r/PrintConfig.cpp:4685 msgid "Duplicate by grid" msgstr "Dupliceer in raster" -#: src/libslic3r/PrintConfig.cpp:4520 +#: src/libslic3r/PrintConfig.cpp:4686 msgid "Multiply copies by creating a grid." msgstr "Meerdere kopieën in raster." -#: src/libslic3r/PrintConfig.cpp:4524 +#: src/libslic3r/PrintConfig.cpp:4690 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." @@ -15278,7 +17371,7 @@ msgstr "" "Schik de toegevoegde modellen en combineer ze tot één model om eenmalig " "acties uit te voeren." -#: src/libslic3r/PrintConfig.cpp:4529 +#: src/libslic3r/PrintConfig.cpp:4695 msgid "" "Try to repair any non-manifold meshes (this option is implicitly added " "whenever we need to slice the model to perform the requested action)." @@ -15286,31 +17379,31 @@ msgstr "" "Probeer alle niet-gesloten meshes te repareren (deze optie is impliciet " "toegevoegd om, wanneer dat nodig is, onmogelijke modellen toch te slicen)." -#: src/libslic3r/PrintConfig.cpp:4533 +#: src/libslic3r/PrintConfig.cpp:4699 msgid "Rotation angle around the Z axis in degrees." msgstr "Rotatiehoek rond de Z-as in graden." -#: src/libslic3r/PrintConfig.cpp:4537 +#: src/libslic3r/PrintConfig.cpp:4703 msgid "Rotate around X" msgstr "Draai over de X-as" -#: src/libslic3r/PrintConfig.cpp:4538 +#: src/libslic3r/PrintConfig.cpp:4704 msgid "Rotation angle around the X axis in degrees." msgstr "Rotatiehoek rond de X-as in graden." -#: src/libslic3r/PrintConfig.cpp:4542 +#: src/libslic3r/PrintConfig.cpp:4708 msgid "Rotate around Y" msgstr "Draai over de Y-as" -#: src/libslic3r/PrintConfig.cpp:4543 +#: src/libslic3r/PrintConfig.cpp:4709 msgid "Rotation angle around the Y axis in degrees." msgstr "Rotatiehoek rond de Y-as in graden." -#: src/libslic3r/PrintConfig.cpp:4548 +#: src/libslic3r/PrintConfig.cpp:4714 msgid "Scaling factor or percentage." msgstr "Schalingsfactor of percentage." -#: src/libslic3r/PrintConfig.cpp:4553 +#: src/libslic3r/PrintConfig.cpp:4719 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." @@ -15318,23 +17411,31 @@ msgstr "" "Detecteer niet-verbonden onderdelen in het model en deel ze op in " "verschillende objecten." -#: src/libslic3r/PrintConfig.cpp:4556 +#: src/libslic3r/PrintConfig.cpp:4722 msgid "Scale to Fit" msgstr "Verschaal naar passing" -#: src/libslic3r/PrintConfig.cpp:4557 +#: src/libslic3r/PrintConfig.cpp:4723 msgid "Scale to fit the given volume." msgstr "Verschaal naar passing in het gegeven volume." -#: src/libslic3r/PrintConfig.cpp:4566 +#: src/libslic3r/PrintConfig.cpp:4727 +msgid "Delete files after loading" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4728 +msgid "Delete files after loading." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4736 msgid "Ignore non-existent config files" msgstr "Negeer niet-bestaande configuratiebestanden" -#: src/libslic3r/PrintConfig.cpp:4567 +#: src/libslic3r/PrintConfig.cpp:4737 msgid "Do not fail if a file supplied to --load does not exist." msgstr "Geef geen fout als een bestand om te laden niet bestaat." -#: src/libslic3r/PrintConfig.cpp:4570 +#: src/libslic3r/PrintConfig.cpp:4740 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." @@ -15342,7 +17443,7 @@ msgstr "" "Doorgang-compatibiliteitsregel bij het laden van configuraties van " "configuratie- en projectbestanden (3MF, AMF)." -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4741 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -15355,11 +17456,11 @@ msgstr "" "onbekende waarde zonder melding of woordelijk te vervangen door een " "standaardwaarde." -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4745 msgid "Bail out on unknown configuration values" msgstr "Sla onbekende configuratiewaarden over" -#: src/libslic3r/PrintConfig.cpp:4579 +#: src/libslic3r/PrintConfig.cpp:4746 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." @@ -15367,7 +17468,7 @@ msgstr "" "Sta to om onbekende configuratiewaarden te lezen door woordelijk te " "substitueren met standaardwaarden." -#: src/libslic3r/PrintConfig.cpp:4580 +#: src/libslic3r/PrintConfig.cpp:4747 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." @@ -15375,11 +17476,11 @@ msgstr "" "Sta to om onbekende configuratiewaarden te lezen door zonder melding te " "substitueren met standaardwaarden." -#: src/libslic3r/PrintConfig.cpp:4584 +#: src/libslic3r/PrintConfig.cpp:4752 msgid "Load config file" msgstr "Laad configuratiebestand" -#: src/libslic3r/PrintConfig.cpp:4585 +#: src/libslic3r/PrintConfig.cpp:4753 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -15387,11 +17488,11 @@ msgstr "" "Laad configuratie uit een specifiek bestand. Dit kan meerdere keren gebruikt " "worden om instellingen uit meerdere bestanden te laden." -#: src/libslic3r/PrintConfig.cpp:4588 +#: src/libslic3r/PrintConfig.cpp:4756 msgid "Output File" msgstr "Outputbestand" -#: src/libslic3r/PrintConfig.cpp:4589 +#: src/libslic3r/PrintConfig.cpp:4757 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." @@ -15399,11 +17500,11 @@ msgstr "" "Het bestand waaroverheen wordt geschreven (als dit niet aangegeven is, wort " "dit gebaseerd op het inputbestand)." -#: src/libslic3r/PrintConfig.cpp:4593 +#: src/libslic3r/PrintConfig.cpp:4761 msgid "Single instance mode" msgstr "Enkele instantiemodus" -#: src/libslic3r/PrintConfig.cpp:4594 +#: src/libslic3r/PrintConfig.cpp:4762 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -15414,11 +17515,11 @@ msgstr "" "gestuurd. Dit overschrijft de \"enkele instantie\"-configuratiewaarde van de " "programmavoorkeuren." -#: src/libslic3r/PrintConfig.cpp:4605 +#: src/libslic3r/PrintConfig.cpp:4767 msgid "Data directory" msgstr "Bestandslocatie voor de data" -#: src/libslic3r/PrintConfig.cpp:4606 +#: src/libslic3r/PrintConfig.cpp:4768 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -15428,11 +17529,11 @@ msgstr "" "verschillende profielen of het opnemen van configuraties van een " "netwerkopslag." -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4771 msgid "Logging level" msgstr "Logboekniveau" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4772 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -15442,11 +17543,11 @@ msgstr "" "debug, 5: traceer\n" "Voorbeeld: loglevel = 2 geeft fataal-, fout- en waarschuwingslevelberichten." -#: src/libslic3r/PrintConfig.cpp:4616 +#: src/libslic3r/PrintConfig.cpp:4778 msgid "Render with a software renderer" msgstr "Render met software-renderer" -#: src/libslic3r/PrintConfig.cpp:4617 +#: src/libslic3r/PrintConfig.cpp:4779 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -15458,18 +17559,30 @@ msgstr "" msgid "Error with zip archive" msgstr "Fout bij ZIP-archief" -#: src/libslic3r/PrintObject.cpp:126 +#: src/libslic3r/PrintObject.cpp:152 msgid "Generating perimeters" msgstr "Perimeters genereren" -#: src/libslic3r/PrintObject.cpp:229 +#: src/libslic3r/PrintObject.cpp:257 msgid "Preparing infill" msgstr "Vulling voorbereiden" -#: src/libslic3r/PrintObject.cpp:403 +#: src/libslic3r/PrintObject.cpp:402 +msgid "making infill" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:449 +msgid "Searching support spots" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:474 msgid "Generating support material" msgstr "Support genereren" +#: src/libslic3r/PrintObject.cpp:495 +msgid "Estimating curled extrusions" +msgstr "" + #: resources/data/hints.ini: [hint:Fuzzy skin] msgid "" "Fuzzy skin\n" @@ -15477,6 +17590,10 @@ msgid "" "your models using theFuzzy skinfeature? You can also use modifiers to " "apply fuzzy-skin only to a portion of your model." msgstr "" +"Oneffen oppervlak\n" +"Wist u dat u een vezelachtige textuur op de zijden van uw object kan " +"aanbrengen met de Oneffen oppervlak optie? U kunt ook modificators " +"toepassen op een oneffen oppervlak voor een gedeelte van het model." #: resources/data/hints.ini: [hint:Shapes gallery] msgid "" @@ -15485,6 +17602,11 @@ msgid "" "models as modifiers, negative volumes or as printable objects. Right-click " "the platter and selectAdd Shape - Gallery." msgstr "" +"Vormengalerij\n" +"Wist u dat PrusaSlicer een vormengalerij heeft? U kunt de vormen daaruit " +"gebruiken als modificators, negatieve volumes, of als printbare objecten. " +"Rechtermuisklik in de modelweergave en selecteer Voeg vorm toe - " +"galerij." #: resources/data/hints.ini: [hint:Arrange settings] msgid "" @@ -15492,6 +17614,9 @@ msgid "" "Did you know that you can right-click theArrange iconto adjust the " "size of the gap between objects and to allow automatic rotations?" msgstr "" +"Schikken-instellingen\n" +"Wist u dat u met de rechtermuisklik op het Schikken icoon de afstand " +"tussen de objecten en automatisch roteren kunt instellen?" #: resources/data/hints.ini: [hint:Negative volume] msgid "" @@ -15501,6 +17626,11 @@ msgid "" "holes directly in PrusaSlicer. Read more in the documentation. (Requires " "Advanced or Expert mode.)" msgstr "" +"Negatief volume\n" +"Wist u dat u volumes van elkaar kunt aftrekken met een negatief volume als " +"modificator? Daarmee kunt u bijvoorbeeld makkelijk verschaalbare gaten " +"aanbrengen, direct in PrusaSlicer. Lees meer in de documentatie (vereist " +"geavanceerde- of expertmodus)." #: resources/data/hints.ini: [hint:Simplify mesh] msgid "" @@ -15509,6 +17639,10 @@ msgid "" "Simplify mesh feature? Right-click the model and select Simplify model. Read " "more in the documentation." msgstr "" +"Mesh vereenvoudigen\n" +"Wist u dat het u het aantal facetten van een mesh kunt reduceren met de Mesh " +"vereenvoudigen optie? Rechtermuisklik op het model en selecteer Mesh " +"vereenvoudigen. Lees meer in de documentatie." #: resources/data/hints.ini: [hint:Reload from disk] msgid "" @@ -15517,6 +17651,10 @@ msgid "" "simply reload it in PrusaSlicer? Right-click the model in the 3D view and " "choose Reload from disk. Read more in the documentation." msgstr "" +"Herlaad van schijf\n" +"Wist u dat als u een nieuwere versie van het model heeft gemaakt, u deze " +"eenvoudig kunt herladen in PrusaSlicer? Rechtermuisklik op het model in de " +"modelweergave en kies Herlaad van schijf. Lees meer in de documentatie." #: resources/data/hints.ini: [hint:Hiding sidebar] msgid "" @@ -15524,6 +17662,9 @@ msgid "" "Did you know that you can hide the right sidebar using the shortcut Shift" "+Tab? You can also enable the icon for this from thePreferences." msgstr "" +"Verberg zijbalk\n" +"Wist u dat u de rechter zijbalk kan verbergen met de sneltoets Shift+Tab? U kunt ook het icoontje aanzetten via de Voorkeuren." #: resources/data/hints.ini: [hint:Perspective camera] msgid "" @@ -15531,6 +17672,9 @@ msgid "" "Did you know that you can use the K key to quickly switch between an " "orthographic and perspective camera?" msgstr "" +"Perspectiefweergave\n" +"Wist u dat u de K-toets kunt gebruiken om snel te schakelen tussen " +"orthografische en perspectiefweergave?" #: resources/data/hints.ini: [hint:Camera Views] msgid "" @@ -15538,6 +17682,9 @@ msgid "" "Did you know that you can use the number keys 0-6 to quickly switch " "between predefined camera angles?" msgstr "" +"Weergave\n" +"Wist us dat u de getallen 0-6 kunt gebruiken voor het snel schakelen " +"tussen vooraf ingestelde camerahoeken?" #: resources/data/hints.ini: [hint:Place on face] msgid "" @@ -15546,6 +17693,10 @@ msgid "" "sits on the print bed? Select thePlace on facefunction or press the " "F key." msgstr "" +"Plaats op vlak\n" +"Wist u dat u snel een model zo kan oriënteren dat het met een vlak van het " +"model op het bed geplaatst wordt? Selecteer Plaats op vlak-functie of " +"druk op de F-toets." #: resources/data/hints.ini: [hint:Set number of instances] msgid "" @@ -15553,6 +17704,9 @@ msgid "" "Did you know that you can right-click a model and set an exact number of " "instances instead of copy-pasting it several times?" msgstr "" +"Stel aantal instanties in\n" +"Wist u dat u met de rechtermuisklik op een model een exact aantal instanties " +"kan instellen zonder meerdere keren te kopiëren en plakken?" #: resources/data/hints.ini: [hint:Combine infill] msgid "" @@ -15561,6 +17715,10 @@ msgid "" "compared to perimeters to save print time using the settingCombine infill " "every." msgstr "" +"Combineer vulling\n" +"Wist u dat u tijd kunt besparen door de laagdikte van de vulling te " +"vermenigvuldigen ten opzichte van die van de perimeters met de instelling " +"Combineer vulling elke." #: resources/data/hints.ini: [hint:Variable layer height] msgid "" @@ -15569,6 +17727,10 @@ msgid "" "different layer height and smooth the transitions between them? Try " "theVariable layer height tool. (Not available for SLA printers.)" msgstr "" +"Variabele laagdikte\n" +"Wist u dat u verschillende delen van uw model kunt printen met een " +"verschillende laagdikte om zo transities tussen delen vloeiender te maken? " +"Probeer de Variabele laagdikte. (Niet beschikbaar voor SLA printers.)" #: resources/data/hints.ini: [hint:Undo/redo history] msgid "" @@ -15576,6 +17738,10 @@ msgid "" "Did you know that you can right-click theundo/redo arrowsto see the " "history of changes and to undo or redo several actions at once?" msgstr "" +"Ongedaan maken / Opnieuw doen lijst\n" +"Wist u dat u met de rechtermuisklik op Ongedaan maken / opnieuw doen " +"pijlen kunt klikken voor een lijst van aanpassingen en meerdere acties " +"tegelijk kunt doen?" #: resources/data/hints.ini: [hint:Different layer height for each model] msgid "" @@ -15585,6 +17751,10 @@ msgid "" "Perimeters and adjust the values in the right panel. Read more in the " "documentation." msgstr "" +"Verschillende laagdikte voor elk model\n" +"Wist u dat u elk model op het bed met een andere laagdikte kunt printen? " +"Rechtermuisklik op het model in de modelweergave, kies Lagen en Perimeters " +"en pas de waarde aan in het rechter menu. Lees meer in de documentatie." #: resources/data/hints.ini: [hint:Solid infill threshold area] msgid "" @@ -15593,6 +17763,10 @@ msgid "" "section be filled with solid infill automatically? Set theSolid infill " "threshold area. (Expert mode only.)" msgstr "" +"Dichte vulling bij oppervlak\n" +"Wist u dat u delen van uw model met een klein doorsnee-oppervlak automatisch " +"met dichte vulling kan vullen? Stel de optie Dichte vulling bij " +"oppervlak in. (alleen in expertmodus)." #: resources/data/hints.ini: [hint:Search functionality] msgid "" @@ -15600,6 +17774,10 @@ msgid "" "Did you know that you use theSearchtool to quickly find a specific " "PrusaSlicer setting? Or use the familiar shortcut Ctrl+F." msgstr "" +"Zoekfuncties\n" +"Wist u dat u de Zoekfunctie kunt gebruiken om snel een specifieke " +"instelling in PrusaSlicer te vinden? Of gebruik de bekende sneltoets Ctrl" +"+F." #: resources/data/hints.ini: [hint:Box selection] msgid "" @@ -15607,6 +17785,10 @@ msgid "" "Did you know that you can do a box selection with Shift+Mouse drag? You can " "also box-deselect objects with Alt+Mouse drag." msgstr "" +"Boxselectie\n" +"Wist u dat u een boxselectie kunt doen door Shift in te drukken en dan met " +"de muis te slepen? U kunt ook deselecteren op deze manier met Alt+muis " +"bewegen." #: resources/data/hints.ini: [hint:Zoom on selected objects or all if none #: selected] @@ -15616,6 +17798,9 @@ msgid "" "b> key? If none are selected, the camera will zoom on all objects in the " "scene." msgstr "" +"Zoom op geselecteerde objecten of op alle objecten als geen geselecteerd is\n" +"Wist u dat u in kunt zoomen op geselecteerde objecten door te drukken op de " +"Z-toets? Als niets geselecteerd is, wordt ingezoomd op alle objecten." #: resources/data/hints.ini: [hint:Printable toggle] msgid "" @@ -15624,6 +17809,10 @@ msgid "" "model without having to move or delete it? Toggle the Printable property of " "a model from the Right-click context menu." msgstr "" +"Als printbaar instellen\n" +"Wist u dat u G-code-generatie kunt uitzetten voor geselecteerde modellen " +"zonder deze te verplaatsen of verwijderen? Zet de Printbaar-optie aan of uit " +"van een model met de rechtermuisklik op een object." #: resources/data/hints.ini: [hint:Mirror] msgid "" @@ -15631,6 +17820,10 @@ msgid "" "Did you know that you can mirror the selected model to create a reversed " "version of it? Right-click the model, select Mirror and pick the mirror axis." msgstr "" +"Spiegelen\n" +"Wist u dat u de geselecteerde modellen kunt spiegelen om een omgekeerd " +"object te verkrijgen? Rechtermuisklik op het model, kies voor Spiegelen en " +"kies over welke as gespiegeld moet worden." #: resources/data/hints.ini: [hint:PageUp / PageDown quick rotation by 45 #: degrees] @@ -15640,6 +17833,10 @@ msgid "" "around the Z-axis clockwise or counter-clockwise by pressing Page Up " "or Page Down respectively?" msgstr "" +"PageUp / PageDown snel roteren bij 45 graden\n" +"Wist u dat u snel modellen kunt roteren over 45 graden rond de Z-as (met de " +"klok mee of er tegenin) door te klikken op de PageUp- of PageDown-toetsen?" #: resources/data/hints.ini: [hint:Load config from G-code] msgid "" @@ -15649,6 +17846,11 @@ msgid "" "can use File-Import-Import SL1 / SL1S archive, which also lets you " "reconstruct 3D models from the voxel data." msgstr "" +"Laad configuratie van G-code\n" +"Wist u dat u een configuratie voor printen, filament, en printerprofielen " +"kunt laden door te klikken op Bestand - Importeer - Importeer configuratie? " +"Dit geldt ook voor SL1 / SL1S archieven die u een 3D-model laten " +"reconstrueren van de voxel-data." #: resources/data/hints.ini: [hint:Ironing] msgid "" @@ -15658,6 +17860,11 @@ msgid "" "holes and flatten any lifted plastic. Read more in the documentation. " "(Requires Advanced or Expert mode.)" msgstr "" +"Strijken\n" +"Wist u dat u een glad bovenoppervlak kunt maken door deze te laten strijken? " +"De nozzle gaat dan nogmaals over het oppervlak om kleine gaatjes te vullen " +"en oneffenheden plat te drukken (vereist geavanceerde of expertmodus). Lees " +"meer in de documentatie." #: resources/data/hints.ini: [hint:Paint-on supports] msgid "" @@ -15666,6 +17873,10 @@ msgid "" "where supports should be enforced or blocked? Try thePaint-on supportsfeature. (Requires Advanced or Expert mode.)" msgstr "" +"Support schilderen\n" +"Wist u dat u direct op het model regios kunt schilderen waar support moet of " +"niet mag worden geplaatst? Probeer de support schilderen-functie " +"(vereist geavanceerde of expertmodus)." #: resources/data/hints.ini: [hint:Paint-on seam] msgid "" @@ -15674,6 +17885,10 @@ msgid "" "place the start/endpoint of each perimeter loop? Try theSeam paintingfeature. (Requires Advanced or Expert mode.)" msgstr "" +"Naad schilderen\n" +"Wist u dat u direct op het model regios kunt schilderen waar de naad zich " +"moet bevinden? Probeer de Naad schilderen-functie (vereist " +"geavanceerde of expertmodus)." #: resources/data/hints.ini: [hint:Insert Pause] msgid "" @@ -15683,6 +17898,11 @@ msgid "" "(M601). This can be used to insert magnets, weights or nuts into your " "prints. Read more in the documentation." msgstr "" +"Pauze invoegen\n" +"Wist u dat u een pauze kunt inplannen op een specifieke laag? " +"Rechtermuisklik op de slider in de sliceweergave en selecteer Voeg pauze toe " +"(M601). Dit kan handig zijn voor het plaatsen van magneetjes, gewichtjes, " +"moertjes, etc. in het model. Lees meer in de documentatie." #: resources/data/hints.ini: [hint:Insert Custom G-code] msgid "" @@ -15692,6 +17912,11 @@ msgid "" "custom G-code. With this function you can, for example, create a temperature " "tower. Read more in the documentation." msgstr "" +"Custom G-code invoegen\n" +"Wist u dat u een custom G-code kunt invoegen op een specifieke laag? " +"Linkermuisklik op de laag in de voorbeeldweergave. Dan rechtermuisklik het " +"plus-icoon en selecteer Voeg custom G-code toe. Met deze functie kunt u " +"bijvoorbeeld een temperatuurtoren printen. Lees meer in de documentatie." #: resources/data/hints.ini: [hint:Configuration snapshots] msgid "" @@ -15700,6 +17925,10 @@ msgid "" "user profiles? You can view and move back and forth between snapshots using " "the Configuration - Configuration snapshots menu." msgstr "" +"Configuratiesnapshots\n" +"Wist u dat u terug kunt gaan naar een complete backup van alle systeem- en " +"gebruikersprofielen? U kunt heen en weer bewegen tussen snapshots door " +"middel van het Configuratiesnapshots-menu." #: resources/data/hints.ini: [hint:Minimum shell thickness] msgid "" @@ -15708,6 +17937,10 @@ msgid "" "define theMinimum shell thicknessin millimeters? This feature is " "especially useful when using the variable layer height function." msgstr "" +"Minimale shelldikte\n" +"Wist u dat u in plaats van het aantal boven- en onderlagen de Minimale " +"shelldikte kunt aangeven? Deze optie is handig wanneer een variabele " +"laagdikte wordt gebruikt." #: resources/data/hints.ini: [hint:Settings in non-modal window] msgid "" @@ -15716,6 +17949,11 @@ msgid "" "means you can have settings open on one screen and the G-code Preview on the " "other. Go to thePreferencesand select Settings in non-modal window." msgstr "" +"Instellingen in niet-modaal venster\n" +"Wist u dat u de instellingen kunt openen in een niet-modaal venster? Dit " +"houdt in dat u de instellingen open kunt hebben staan op één scherm en de " +"sliceweergave op een ander scherm. Ga naar Voorkeuren en selecteer " +"Instellingen in niet-modaal venster." #: resources/data/hints.ini: [hint:Adaptive infills] msgid "" @@ -15724,6 +17962,10 @@ msgid "" "to decrease the print time and lower the filament consumption? Read more in " "the documentation." msgstr "" +"Adaptieve vulling\n" +"Wist u dat u adaptief kubische en ondersteunend kubische vulling kunt " +"gebruiken om de printtijd te verkorten en de hoeveelheid filament te " +"reduceren? Lees meer in de documentatie." #: resources/data/hints.ini: [hint:Lightning infill] msgid "" @@ -15732,6 +17974,10 @@ msgid "" "surfaces, save a lot of the filament, and decrease the print time? Read more " "in the documentation." msgstr "" +"Bliksemvulling\n" +"Wist u dat u bliksemvulling kunt toepassen om alleen topvlakken te " +"ondersteunen? Dit bespaart veel filament en reduceert de printtijd. Lees " +"meer in de documentatie." #: resources/data/hints.ini: [hint:Fullscreen mode] msgid "" @@ -15739,6 +17985,39 @@ msgid "" "Did you know that you can switch PrusaSlicer to fullscreen mode? Use the " "F11 hotkey." msgstr "" +"Volledig scherm\n" +"Wist u dat u in PrusaSlicer kunt wisselen naar volledig scherm? Gebruik " +"daarvoor de F11-toets." + +#: resources/data/hints.ini: [hint:Printables integration] +msgid "" +"Printables.com integration\n" +"Did you know that when you are browsing Printables.com, you can send 3D " +"model files to PrusaSlicer with a single click? Learn more in the " +"documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Cut tool] +msgid "" +"Cut tool\n" +"Did you know that you can cut a model at any angle and even create aligning " +"pins with the updated Cut tool? Learn more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Measurement tool] +msgid "" +"Measurement tool\n" +"Did you know that you can measure the distances between points, edges " +"and planes, the radius of a hole or the angle between edges or planes? Learn " +"more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Text tool] +msgid "" +"Text tool\n" +"Did you know that you can add custom text labels to your models or even use " +"the text as a modifier? Learn more in the documentation." +msgstr "" #: ../src/common/debugrpt.cpp:586 msgid "" @@ -16894,6 +19173,10 @@ msgstr "Links uitlijnen" msgid "Align Right" msgstr "Rechts uitlijnen" +#: ../src/richtext/richtextsizepage.cpp:266 +msgid "Alignment" +msgstr "Uitlijning" + #: ../src/generic/filectrlg.cpp:1197 ../src/common/fldlgcmn.cpp:107 #, c-format msgid "All files (%s)|%s" @@ -18195,10 +20478,6 @@ msgstr "Decoratief" msgid "Default encoding" msgstr "Standaardcodering" -#: ../src/dfb/fontmgr.cpp:180 -msgid "Default font" -msgstr "Standaard lettertype" - #: ../src/generic/prntdlgg.cpp:510 msgid "Default printer" msgstr "Standaardprinter" @@ -18560,11 +20839,6 @@ msgstr "Fout bij het printen: " msgid "Error: " msgstr "Fout: " -#. TRANSLATORS: Name of keyboard key -#: ../src/common/accelcmn.cpp:69 -msgid "Esc" -msgstr "Esc" - #. TRANSLATORS: Name of keyboard key #: ../src/common/accelcmn.cpp:70 msgid "Escape" @@ -19314,11 +21588,6 @@ msgstr "Diskette" msgid "Folio, 8 1/2 x 13 in" msgstr "Folio, 8 1/2 x 13 inch" -#: ../src/richtext/richtextformatdlg.cpp:344 ../src/osx/carbon/fontdlg.cpp:287 -#: ../src/common/stockitem.cpp:194 -msgid "Font" -msgstr "Lettertype" - #: ../src/richtext/richtextfontpage.cpp:221 msgid "Font &weight:" msgstr "Lettertype z&waarte:" @@ -20436,10 +22705,6 @@ msgstr "Geheugen VFS bevat al bestand '%s'!" msgid "Menu" msgstr "Menu" -#: ../src/common/msgout.cpp:124 -msgid "Message" -msgstr "Bericht" - #: ../src/univ/themes/metal.cpp:168 msgid "Metal theme" msgstr "Metaal thema" @@ -20473,10 +22738,6 @@ msgstr "Er ontbreekt een vereiste parameter." msgid "Modern" msgstr "Modern" -#: ../src/generic/filectrlg.cpp:427 -msgid "Modified" -msgstr "Gewijzigd" - #: ../src/common/module.cpp:133 #, c-format msgid "Module \"%s\" initialization failed" @@ -20568,11 +22829,6 @@ msgstr "Nieuwe map" msgid "Next page" msgstr "Volgende pagina" -#: ../include/wx/msgdlg.h:277 ../src/common/stockitem.cpp:177 -#: ../src/motif/msgdlg.cpp:196 -msgid "No" -msgstr "Nee" - #. TRANSLATORS: System cursor name #: ../src/propgrid/advprops.cpp:1764 msgid "No Entry" @@ -20809,12 +23065,6 @@ msgstr "Num_lock" msgid "Numbered outline" msgstr "Genummerde outline" -#: ../include/wx/msgdlg.h:278 ../src/richtext/richtextstyledlg.cpp:297 -#: ../src/common/stockitem.cpp:178 ../src/msw/msgdlg.cpp:454 -#: ../src/msw/msgdlg.cpp:747 ../src/gtk1/fontdlg.cpp:138 -msgid "OK" -msgstr "OK" - #: ../src/msw/ole/automtn.cpp:692 #, c-format msgid "OLE Automation error in %s: %s" @@ -20887,6 +23137,10 @@ msgstr "Optie '%s' vereist een waarde." msgid "Option '%s': '%s' cannot be converted to a date." msgstr "Optie '%s': '%s' kan niet naar een datum worden geconverteerd." +#: ../src/generic/prntdlgg.cpp:618 +msgid "Options" +msgstr "Instellingen" + #: ../src/propgrid/advprops.cpp:1606 msgid "Orange" msgstr "Oranje" @@ -21671,10 +23925,6 @@ msgstr "Selecteer normale of cursieve stijl." msgid "Select underlining or no underlining." msgstr "Selecteer onderstreept of normaal." -#: ../src/motif/filedlg.cpp:220 -msgid "Selection" -msgstr "Selectie" - #: ../src/richtext/richtextliststylepage.cpp:187 #: ../src/richtext/richtextliststylepage.cpp:189 msgid "Selects the list level to edit." @@ -22568,10 +24818,6 @@ msgstr "" msgid "Turkish (ISO-8859-9)" msgstr "Turks (ISO-8859-9)" -#: ../src/generic/filectrlg.cpp:426 -msgid "Type" -msgstr "Type" - #: ../src/richtext/richtextfontpage.cpp:151 #: ../src/richtext/richtextfontpage.cpp:153 msgid "Type a font name." @@ -23057,10 +25303,6 @@ msgstr "Gebruik de actuele uitlijningsinstelling." msgid "Validation conflict" msgstr "Validatie-conflict" -#: ../src/propgrid/manager.cpp:238 -msgid "Value" -msgstr "Waarde" - #: ../src/propgrid/props.cpp:386 ../src/propgrid/props.cpp:500 #, c-format msgid "Value must be %s or higher." @@ -23290,11 +25532,6 @@ msgstr "XPM: afgeknotte afbeeldingsgegevens op regel %d!" msgid "Yellow" msgstr "Geel" -#: ../include/wx/msgdlg.h:276 ../src/common/stockitem.cpp:206 -#: ../src/motif/msgdlg.cpp:196 -msgid "Yes" -msgstr "Ja" - #: ../src/osx/carbon/overlay.cpp:155 msgid "You cannot Clear an overlay that is not inited" msgstr "U kunt geen overlay wissen die niet is geïnitieerd" diff --git a/resources/localization/pt_BR/PrusaSlicer.mo b/resources/localization/pt_BR/PrusaSlicer.mo index 98aeb015b87c76f5c1ae5ef9aef82a50e4c58c2b..a86a2b0d6b6a9dfe7d6fc563cdd1af3567c4e4c5 100644 GIT binary patch delta 101721 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 delta 108209 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

RA%J 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 diff --git a/resources/localization/pt_BR/PrusaSlicer_pt_BR.po b/resources/localization/pt_BR/PrusaSlicer_pt_BR.po index 8022a594d60..9a9c7eada29 100644 --- a/resources/localization/pt_BR/PrusaSlicer_pt_BR.po +++ b/resources/localization/pt_BR/PrusaSlicer_pt_BR.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-01 16:30+0100\n" +"POT-Creation-Date: 2023-03-03 14:25+0100\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -13,16 +13,16 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 3.1\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 +#: src/slic3r/GUI/AboutDialog.cpp:46 src/slic3r/GUI/AboutDialog.cpp:306 msgid "Portions copyright" msgstr "Direitos autorais das partes" -#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 +#: src/slic3r/GUI/AboutDialog.cpp:143 src/slic3r/GUI/AboutDialog.cpp:270 msgid "Copyright" msgstr "Direitos autorais" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:143 +#: src/slic3r/GUI/AboutDialog.cpp:145 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -30,26 +30,26 @@ msgstr "" "Os contratos de licença de todos os seguintes programas (bibliotecas) são " "parte do contrato de licença de aplicativo" -#: src/slic3r/GUI/AboutDialog.cpp:212 +#: src/slic3r/GUI/AboutDialog.cpp:214 #, c-format, boost-format msgid "About %s" msgstr "Sobre %s" -#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 -#: src/slic3r/GUI/GUI_App.cpp:262 +#: src/slic3r/GUI/AboutDialog.cpp:245 src/slic3r/GUI/AboutDialog.cpp:370 +#: src/slic3r/GUI/GUI_App.cpp:271 msgid "Version" msgstr "Versão" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:277 msgid "is licensed under the" msgstr "está licenciado sobre o(a)" -#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:273 src/slic3r/GUI/GUI_App.cpp:277 msgid "GNU Affero General Public License, version 3" msgstr "Licensa GNU Affero General Public, versão 3" -#: src/slic3r/GUI/AboutDialog.cpp:273 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -57,7 +57,7 @@ msgstr "" "PrusaSlicer é baseado no Slic3r criado por Alessandro Ranellucci e a " "comunidade RepRap." -#: src/slic3r/GUI/AboutDialog.cpp:274 +#: src/slic3r/GUI/AboutDialog.cpp:275 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -67,7 +67,7 @@ msgstr "" "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik e " "outros." -#: src/slic3r/GUI/AboutDialog.cpp:310 +#: src/slic3r/GUI/AboutDialog.cpp:311 msgid "Copy Version Info" msgstr "Copiar Informações da Versão" @@ -96,54 +96,54 @@ msgstr "" "você relatar o problema." #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:162 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:204 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:188 msgid "Slicing complete" msgstr "Fatiamento completo" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:199 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183 #, boost-format msgid "Masked SLA file exported to %1%" msgstr "Arquivo SLA mascarado exportado para %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:286 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:279 msgid "Access violation" msgstr "Violação de acesso" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:288 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:281 msgid "Illegal instruction" msgstr "Instrução ilegal" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:283 msgid "Divide by zero" msgstr "Divisão por zero" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:292 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:285 msgid "Overflow" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:294 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:287 msgid "Underflow" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:297 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 msgid "Floating reserved operand" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:300 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:293 msgid "Stack overflow" msgstr "Estouro de pilha" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:659 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:726 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:652 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:719 msgid "Running post-processing scripts" msgstr "Aplicando scripts de pós-processamento" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:690 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:710 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:683 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:703 msgid "Unknown error occured during exporting G-code." msgstr "Ocorreu um erro desconhecido durante a exportação do G-code." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:695 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:688 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. Maybe the SD " @@ -154,7 +154,7 @@ msgstr "" "SD está bloqueado para escrita?\n" "Mensagem de erro: %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:698 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:691 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. There might be " @@ -165,7 +165,7 @@ msgstr "" "problemas com o dispositivo de destino, por favor tente exportar novamente " "ou usar dispositivo diferente. O G-code de saída corrompido está em %1%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:701 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:694 #, boost-format msgid "" "Renaming of the G-code after copying to the selected destination folder has " @@ -174,7 +174,7 @@ msgstr "" "A renomeação do G-code após a cópia na pasta de destino selecionada falhou. " "O caminho atual é %1%.tmp. Por favor, tente exportar de novo." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:704 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:697 #, boost-format msgid "" "Copying of the temporary G-code has finished but the original code at %1% " @@ -184,7 +184,7 @@ msgstr "" "pôde ser aberto durante a verificação de cópia. O G-code de saída está em " "%2%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:707 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:700 #, boost-format msgid "" "Copying of the temporary G-code has finished but the exported code couldn't " @@ -193,23 +193,24 @@ msgstr "" "A cópia do G-code temporário foi concluída, mas o código exportado não pôde " "ser aberto durante a verificação de cópia. O G-code de saída está em %1%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:715 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:708 #, boost-format msgid "G-code file exported to %1%" msgstr "Arquivo G-code exportado para %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:729 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:722 msgid "Copying of the temporary G-code to the output G-code failed" msgstr "A cópia do G-code temporário para o G-code de saída falhou" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:751 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:738 #, boost-format msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "Agendando upload para ` %1%` . Veja a aba -> Print Host Upload Queue" #: src/slic3r/GUI/BedShapeDialog.cpp:31 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2765 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1576 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:241 src/slic3r/GUI/Plater.cpp:220 +#: src/slic3r/GUI/Tab.cpp:2697 msgid "Size" msgstr "Tamanho" @@ -217,7 +218,9 @@ msgstr "Tamanho" msgid "Origin" msgstr "Origem" -#: src/slic3r/GUI/BedShapeDialog.cpp:33 src/libslic3r/PrintConfig.cpp:1020 +#: src/slic3r/GUI/BedShapeDialog.cpp:33 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1994 +#: src/libslic3r/PrintConfig.cpp:1109 msgid "Diameter" msgstr "Diâmetro" @@ -233,54 +236,62 @@ msgstr "" "Distância do ponto 0,0 da coordenada do G-code do canto esquerdo do " "retângulo." -#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:262 -#: src/slic3r/GUI/ConfigWizard.cpp:1476 src/slic3r/GUI/ConfigWizard.cpp:1490 +#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:291 +#: src/slic3r/GUI/ConfigWizard.cpp:1796 src/slic3r/GUI/ConfigWizard.cpp:1832 +#: src/slic3r/GUI/ConfigWizard.cpp:1846 #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:100 -#: src/slic3r/GUI/GCodeViewer.cpp:3181 src/slic3r/GUI/GCodeViewer.cpp:3187 -#: src/slic3r/GUI/GCodeViewer.cpp:3195 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 src/slic3r/GUI/GCodeViewer.cpp:3455 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 #: src/slic3r/GUI/GUI_ObjectLayers.cpp:145 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 src/libslic3r/PrintConfig.cpp:263 -#: src/libslic3r/PrintConfig.cpp:290 src/libslic3r/PrintConfig.cpp:297 -#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:520 -#: src/libslic3r/PrintConfig.cpp:546 src/libslic3r/PrintConfig.cpp:621 -#: src/libslic3r/PrintConfig.cpp:629 src/libslic3r/PrintConfig.cpp:679 -#: src/libslic3r/PrintConfig.cpp:813 src/libslic3r/PrintConfig.cpp:824 -#: src/libslic3r/PrintConfig.cpp:842 src/libslic3r/PrintConfig.cpp:1023 -#: src/libslic3r/PrintConfig.cpp:1235 src/libslic3r/PrintConfig.cpp:1302 -#: src/libslic3r/PrintConfig.cpp:1312 src/libslic3r/PrintConfig.cpp:1611 -#: src/libslic3r/PrintConfig.cpp:1805 src/libslic3r/PrintConfig.cpp:1866 -#: src/libslic3r/PrintConfig.cpp:1884 src/libslic3r/PrintConfig.cpp:1902 -#: src/libslic3r/PrintConfig.cpp:1965 src/libslic3r/PrintConfig.cpp:1975 -#: src/libslic3r/PrintConfig.cpp:2097 src/libslic3r/PrintConfig.cpp:2106 -#: src/libslic3r/PrintConfig.cpp:2125 src/libslic3r/PrintConfig.cpp:2146 -#: src/libslic3r/PrintConfig.cpp:2158 src/libslic3r/PrintConfig.cpp:2166 -#: src/libslic3r/PrintConfig.cpp:2207 src/libslic3r/PrintConfig.cpp:2215 -#: src/libslic3r/PrintConfig.cpp:2225 src/libslic3r/PrintConfig.cpp:2233 -#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2303 -#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2603 -#: src/libslic3r/PrintConfig.cpp:2620 src/libslic3r/PrintConfig.cpp:2721 -#: src/libslic3r/PrintConfig.cpp:2730 src/libslic3r/PrintConfig.cpp:2780 -#: src/libslic3r/PrintConfig.cpp:2932 src/libslic3r/PrintConfig.cpp:3020 -#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3034 -#: src/libslic3r/PrintConfig.cpp:3048 src/libslic3r/PrintConfig.cpp:3072 -#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3092 -#: src/libslic3r/PrintConfig.cpp:3372 src/libslic3r/PrintConfig.cpp:3413 -#: src/libslic3r/PrintConfig.cpp:3573 src/libslic3r/PrintConfig.cpp:3582 -#: src/libslic3r/PrintConfig.cpp:3591 src/libslic3r/PrintConfig.cpp:3601 -#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3676 -#: src/libslic3r/PrintConfig.cpp:3688 src/libslic3r/PrintConfig.cpp:3708 -#: src/libslic3r/PrintConfig.cpp:3718 src/libslic3r/PrintConfig.cpp:3728 -#: src/libslic3r/PrintConfig.cpp:3746 src/libslic3r/PrintConfig.cpp:3761 -#: src/libslic3r/PrintConfig.cpp:3775 src/libslic3r/PrintConfig.cpp:3786 -#: src/libslic3r/PrintConfig.cpp:3799 src/libslic3r/PrintConfig.cpp:3844 -#: src/libslic3r/PrintConfig.cpp:3854 src/libslic3r/PrintConfig.cpp:3863 -#: src/libslic3r/PrintConfig.cpp:3873 src/libslic3r/PrintConfig.cpp:3889 -#: src/libslic3r/PrintConfig.cpp:3913 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 src/libslic3r/PrintConfig.cpp:279 +#: src/libslic3r/PrintConfig.cpp:303 src/libslic3r/PrintConfig.cpp:310 +#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:657 src/libslic3r/PrintConfig.cpp:724 +#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:782 +#: src/libslic3r/PrintConfig.cpp:902 src/libslic3r/PrintConfig.cpp:913 +#: src/libslic3r/PrintConfig.cpp:931 src/libslic3r/PrintConfig.cpp:1112 +#: src/libslic3r/PrintConfig.cpp:1295 src/libslic3r/PrintConfig.cpp:1359 +#: src/libslic3r/PrintConfig.cpp:1369 src/libslic3r/PrintConfig.cpp:1650 +#: src/libslic3r/PrintConfig.cpp:1842 src/libslic3r/PrintConfig.cpp:1903 +#: src/libslic3r/PrintConfig.cpp:1921 src/libslic3r/PrintConfig.cpp:1939 +#: src/libslic3r/PrintConfig.cpp:1995 src/libslic3r/PrintConfig.cpp:2005 +#: src/libslic3r/PrintConfig.cpp:2127 src/libslic3r/PrintConfig.cpp:2136 +#: src/libslic3r/PrintConfig.cpp:2155 src/libslic3r/PrintConfig.cpp:2176 +#: src/libslic3r/PrintConfig.cpp:2188 src/libslic3r/PrintConfig.cpp:2196 +#: src/libslic3r/PrintConfig.cpp:2237 src/libslic3r/PrintConfig.cpp:2245 +#: src/libslic3r/PrintConfig.cpp:2255 src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2271 src/libslic3r/PrintConfig.cpp:2336 +#: src/libslic3r/PrintConfig.cpp:2565 src/libslic3r/PrintConfig.cpp:2632 +#: src/libslic3r/PrintConfig.cpp:2647 src/libslic3r/PrintConfig.cpp:2746 +#: src/libslic3r/PrintConfig.cpp:2755 src/libslic3r/PrintConfig.cpp:2801 +#: src/libslic3r/PrintConfig.cpp:2886 src/libslic3r/PrintConfig.cpp:2896 +#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3108 +#: src/libslic3r/PrintConfig.cpp:3115 src/libslic3r/PrintConfig.cpp:3122 +#: src/libslic3r/PrintConfig.cpp:3136 src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3170 src/libslic3r/PrintConfig.cpp:3180 +#: src/libslic3r/PrintConfig.cpp:3330 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3391 src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3444 src/libslic3r/PrintConfig.cpp:3456 +#: src/libslic3r/PrintConfig.cpp:3476 src/libslic3r/PrintConfig.cpp:3491 +#: src/libslic3r/PrintConfig.cpp:3501 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3681 src/libslic3r/PrintConfig.cpp:3878 +#: src/libslic3r/PrintConfig.cpp:3893 src/libslic3r/PrintConfig.cpp:3907 +#: src/libslic3r/PrintConfig.cpp:3918 src/libslic3r/PrintConfig.cpp:3931 +#: src/libslic3r/PrintConfig.cpp:3976 src/libslic3r/PrintConfig.cpp:3986 +#: src/libslic3r/PrintConfig.cpp:3995 src/libslic3r/PrintConfig.cpp:4005 +#: src/libslic3r/PrintConfig.cpp:4021 src/libslic3r/PrintConfig.cpp:4045 +#: src/libslic3r/PrintConfig.cpp:4072 msgid "mm" msgstr "mm" @@ -300,13 +311,13 @@ msgstr "Retangular" msgid "Circular" msgstr "Circular" -#: src/slic3r/GUI/BedShapeDialog.cpp:81 src/slic3r/GUI/GUI_Preview.cpp:252 -#: src/libslic3r/ExtrusionEntity.cpp:343 src/libslic3r/ExtrusionEntity.cpp:378 +#: src/slic3r/GUI/BedShapeDialog.cpp:81 msgid "Custom" msgstr "Customizado" #: src/slic3r/GUI/BedShapeDialog.cpp:104 src/slic3r/GUI/BedShapeDialog.cpp:179 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1701 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1565 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1798 msgid "Shape" msgstr "Forma" @@ -314,8 +325,8 @@ msgstr "Forma" msgid "Load shape from STL..." msgstr "Carregar forma do STL..." -#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2147 +#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3914 +#: src/slic3r/GUI/MainFrame.cpp:2240 msgid "Settings" msgstr "Config" @@ -328,7 +339,7 @@ msgid "Load..." msgstr "Carregar..." #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/Tab.cpp:3973 msgid "Remove" msgstr "Remover" @@ -340,77 +351,120 @@ msgstr "Não encontrado:" msgid "Model" msgstr "Modelo" -#: src/slic3r/GUI/BedShapeDialog.cpp:508 +#: src/slic3r/GUI/BedShapeDialog.cpp:506 msgid "Choose an STL file to import bed shape from:" msgstr "Escolha um arquivo STL para importar o formato da mesa:" -#: src/slic3r/GUI/BedShapeDialog.cpp:514 src/slic3r/GUI/BedShapeDialog.cpp:562 -#: src/slic3r/GUI/BedShapeDialog.cpp:584 +#: src/slic3r/GUI/BedShapeDialog.cpp:512 src/slic3r/GUI/BedShapeDialog.cpp:560 +#: src/slic3r/GUI/BedShapeDialog.cpp:582 msgid "Invalid file format." msgstr "Formato de arquivo inválido." -#: src/slic3r/GUI/BedShapeDialog.cpp:525 +#: src/slic3r/GUI/BedShapeDialog.cpp:523 msgid "Error! Invalid model" msgstr "Erro! Modelo inválido" -#: src/slic3r/GUI/BedShapeDialog.cpp:533 +#: src/slic3r/GUI/BedShapeDialog.cpp:531 msgid "The selected file contains no geometry." msgstr "O arquivo selecionado não contém geometria." -#: src/slic3r/GUI/BedShapeDialog.cpp:537 +#: src/slic3r/GUI/BedShapeDialog.cpp:535 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "O arquivo selecionado contém áreas não juntas. Isso não é suportado." -#: src/slic3r/GUI/BedShapeDialog.cpp:552 +#: src/slic3r/GUI/BedShapeDialog.cpp:550 msgid "Choose a file to import bed texture from (PNG/SVG):" msgstr "Escolher um arquivo para importar a textura da mesa (PNG/SVG):" -#: src/slic3r/GUI/BedShapeDialog.cpp:574 +#: src/slic3r/GUI/BedShapeDialog.cpp:572 msgid "Choose an STL file to import bed model from:" msgstr "Escolha um arquivo STL para importar o modelo da mesa:" -#: src/slic3r/GUI/BedShapeDialog.hpp:95 src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/BedShapeDialog.hpp:96 src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape" msgstr "Formato da mesa" -#: src/slic3r/GUI/BonjourDialog.cpp:55 +#: src/slic3r/GUI/BonjourDialog.cpp:58 msgid "Network lookup" msgstr "Pesquisa de rede" -#: src/slic3r/GUI/BonjourDialog.cpp:72 +#: src/slic3r/GUI/BonjourDialog.cpp:75 src/slic3r/GUI/BonjourDialog.cpp:253 msgid "Address" msgstr "Endereço" -#: src/slic3r/GUI/BonjourDialog.cpp:73 +#: src/slic3r/GUI/BonjourDialog.cpp:76 msgid "Hostname" msgstr "Nome do Host" -#: src/slic3r/GUI/BonjourDialog.cpp:74 +#: src/slic3r/GUI/BonjourDialog.cpp:77 msgid "Service name" msgstr "Nome de serviços" -#: src/slic3r/GUI/BonjourDialog.cpp:76 +#: src/slic3r/GUI/BonjourDialog.cpp:79 msgid "OctoPrint version" msgstr "Versão do OctoPrint" -#: src/slic3r/GUI/BonjourDialog.cpp:224 +#: src/slic3r/GUI/BonjourDialog.cpp:227 msgid "Searching for devices" msgstr "Procurando por dispositivos" -#: src/slic3r/GUI/BonjourDialog.cpp:231 +#: src/slic3r/GUI/BonjourDialog.cpp:234 msgid "Finished" msgstr "Finalizado" -#: src/slic3r/GUI/ButtonsDescription.cpp:42 +#: src/slic3r/GUI/BonjourDialog.cpp:240 +msgid "Multiple resolved IP addresses" +msgstr "" + +#: src/slic3r/GUI/BonjourDialog.cpp:249 +#, boost-format +msgid "" +"There are several IP addresses resolving to hostname %1%.\n" +"Please select one that should be used." +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:21 +msgid "Palette 1 (default)" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:22 +msgid "Palette 2" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:23 +msgid "Palette 3" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:24 +msgid "Palette 4" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:25 +msgid "Palette 5" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:26 +msgid "Palette 6" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:27 +msgid "Palette 7" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:28 +msgid "Palette 8" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:112 msgid "Revert color to default" msgstr "Reverter a cor para o padrão" -#: src/slic3r/GUI/ButtonsDescription.cpp:57 +#: src/slic3r/GUI/ButtonsDescription.cpp:127 msgid "Value is the same as the system value" msgstr "O valor é o mesmo que o valor do sistema" -#: src/slic3r/GUI/ButtonsDescription.cpp:58 +#: src/slic3r/GUI/ButtonsDescription.cpp:128 msgid "" "Value was changed and is not equal to the system value or the last saved " "preset" @@ -418,11 +472,35 @@ msgstr "" "O valor foi mudado e não é igual ao valor do sistema ou da última config. " "salva" -#: src/slic3r/GUI/ButtonsDescription.cpp:62 +#: src/slic3r/GUI/ButtonsDescription.cpp:155 +msgid "Default palette for mode markers" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2422 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Simple" +msgstr "Simples" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2424 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgctxt "Mode" +msgid "Advanced" +msgstr "Avançado" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2425 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Expert" +msgstr "Especialista" + +#: src/slic3r/GUI/ButtonsDescription.cpp:182 +msgid "Revert color" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:200 msgid "Buttons And Text Colors Description" msgstr "Descrição dos botões e cores de texto" -#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/ConfigManipulation.cpp:50 msgid "" "Layer height is not valid.\n" "\n" @@ -432,13 +510,13 @@ msgstr "" "\n" "A altura da camada será redefinida para 0.01." -#: src/slic3r/GUI/ConfigManipulation.cpp:50 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1449 -#: src/libslic3r/PrintConfig.cpp:286 +#: src/slic3r/GUI/ConfigManipulation.cpp:51 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1394 +#: src/libslic3r/PrintConfig.cpp:299 msgid "Layer height" msgstr "Altura da camada" -#: src/slic3r/GUI/ConfigManipulation.cpp:61 +#: src/slic3r/GUI/ConfigManipulation.cpp:62 msgid "" "First layer height is not valid.\n" "\n" @@ -448,7 +526,7 @@ msgstr "" "\n" "A altura da primeira camada será redefinida para 0.01." -#: src/slic3r/GUI/ConfigManipulation.cpp:62 src/libslic3r/PrintConfig.cpp:1231 +#: src/slic3r/GUI/ConfigManipulation.cpp:63 src/libslic3r/PrintConfig.cpp:1291 msgid "First layer height" msgstr "Altura da primeira camada" @@ -459,7 +537,6 @@ msgid "" "- no top solid layers\n" "- 0% fill density\n" "- no support material\n" -"- Ensure vertical shell thickness enabled\n" "- Detect thin walls disabled" msgstr "" "O modo Vaso Espiral requer:\n" @@ -467,53 +544,50 @@ msgstr "" "- sem camadas sólidas superiores\n" "- 0% fdensidade de enchimento 0\n" "- nenhum material de suporte\n" -"- habilitar opção Garantir a espessura da casca vertical\n" "- desativar opção Detectar paredes finas" -#: src/slic3r/GUI/ConfigManipulation.cpp:90 +#: src/slic3r/GUI/ConfigManipulation.cpp:89 msgid "Shall I adjust those settings in order to enable Spiral Vase?" msgstr "Devo ajustar essas configurações para habilitar o Vaso Espiral?" -#: src/slic3r/GUI/ConfigManipulation.cpp:91 +#: src/slic3r/GUI/ConfigManipulation.cpp:90 msgid "Spiral Vase" msgstr "Vaso espiral" -#: src/slic3r/GUI/ConfigManipulation.cpp:121 +#: src/slic3r/GUI/ConfigManipulation.cpp:123 msgid "" -"The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool " -"change.\n" -"(both support_material_extruder and support_material_interface_extruder need " -"to be set to 0)." +"For the Wipe Tower to work with the soluble supports, the support layers\n" +"need to be synchronized with the object layers." msgstr "" -"A torre de limpeza suporta atualmente os suportes não-solúveis\n" -" somente se são imprimidos com o extrusor atual sem provocar uma mudança da " -"ferramenta. \n" -"(ambos support_material_extruder e support_material_interface_extruder " -"precisam ser definidos como 0)." - -#: src/slic3r/GUI/ConfigManipulation.cpp:125 -msgid "Shall I adjust those settings in order to enable the Wipe Tower?" -msgstr "Devo ajustar essas configurações para ativar a Torre limpa?" +"Para que a torre de limpeza funcione com os suportes solúveis, as camadas de " +"suporte precisam ser sincronizadas com as camadas de objeto." #: src/slic3r/GUI/ConfigManipulation.cpp:126 -#: src/slic3r/GUI/ConfigManipulation.cpp:146 +msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" +msgstr "Devo sincronizar camadas de suporte para habilitar a Torre Limpa?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:127 +#: src/slic3r/GUI/ConfigManipulation.cpp:145 msgid "Wipe Tower" msgstr "Torre de limpeza" -#: src/slic3r/GUI/ConfigManipulation.cpp:142 +#: src/slic3r/GUI/ConfigManipulation.cpp:140 src/libslic3r/Print.cpp:672 msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers\n" -"need to be synchronized with the object layers." +"The Wipe Tower currently supports the non-soluble supports only if they are " +"printed with the current extruder without triggering a tool change. (both " +"support_material_extruder and support_material_interface_extruder need to be " +"set to 0)." msgstr "" -"Para que a torre de limpeza funcione com os suportes solúveis, as camadas de " -"suporte precisam ser sincronizadas com as camadas de objeto." +"A torre de limpeza suporta atualmente os suportes não-solúveis somente se " +"são imprimidos com o extrusor atual sem provocar uma mudança da ferramenta. " +"(ambos support_material_extruder e support_material_interface_extruder " +"precisam ser definidos como 0)." -#: src/slic3r/GUI/ConfigManipulation.cpp:145 -msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" -msgstr "Devo sincronizar camadas de suporte para habilitar a Torre Limpa?" +#: src/slic3r/GUI/ConfigManipulation.cpp:144 +msgid "Shall I adjust those settings in order to enable the Wipe Tower?" +msgstr "Devo ajustar essas configurações para ativar a Torre limpa?" -#: src/slic3r/GUI/ConfigManipulation.cpp:164 +#: src/slic3r/GUI/ConfigManipulation.cpp:166 msgid "" "Supports work better, if the following feature is enabled:\n" "- Detect bridging perimeters" @@ -521,186 +595,190 @@ msgstr "" "Os suportes funcionam melhor, se o seguinte recurso estiver ativado:\n" "- Detectar perímetros de ponte" -#: src/slic3r/GUI/ConfigManipulation.cpp:167 +#: src/slic3r/GUI/ConfigManipulation.cpp:169 msgid "Shall I adjust those settings for supports?" msgstr "Devo ajustar essas configurações para suportes?" -#: src/slic3r/GUI/ConfigManipulation.cpp:168 +#: src/slic3r/GUI/ConfigManipulation.cpp:170 msgid "Support Generator" msgstr "Gerador de suporte" -#: src/slic3r/GUI/ConfigManipulation.cpp:195 +#: src/slic3r/GUI/ConfigManipulation.cpp:194 #, boost-format msgid "The %1% infill pattern is not supposed to work at 100%% density." msgstr "" "O padrão de preenchimento %1% não deve funcionar com 100%% de densidade." -#: src/slic3r/GUI/ConfigManipulation.cpp:198 +#: src/slic3r/GUI/ConfigManipulation.cpp:196 msgid "Shall I switch to rectilinear fill pattern?" msgstr "Devo mudar para padrão de preenchimento retilíneo?" -#: src/slic3r/GUI/ConfigManipulation.cpp:199 +#: src/slic3r/GUI/ConfigManipulation.cpp:197 #: src/slic3r/GUI/GUI_Factories.cpp:55 src/slic3r/GUI/GUI_Factories.cpp:128 -#: src/slic3r/GUI/Plater.cpp:460 src/slic3r/GUI/Tab.cpp:1503 -#: src/slic3r/GUI/Tab.cpp:1505 src/libslic3r/PrintConfig.cpp:475 -#: src/libslic3r/PrintConfig.cpp:716 src/libslic3r/PrintConfig.cpp:743 -#: src/libslic3r/PrintConfig.cpp:1098 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1149 src/libslic3r/PrintConfig.cpp:1398 -#: src/libslic3r/PrintConfig.cpp:1427 src/libslic3r/PrintConfig.cpp:1496 -#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1535 -#: src/libslic3r/PrintConfig.cpp:2364 src/libslic3r/PrintConfig.cpp:2381 +#: src/slic3r/GUI/Plater.cpp:468 src/slic3r/GUI/Tab.cpp:1450 +#: src/slic3r/GUI/Tab.cpp:1452 src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:811 src/libslic3r/PrintConfig.cpp:831 +#: src/libslic3r/PrintConfig.cpp:1187 src/libslic3r/PrintConfig.cpp:1200 +#: src/libslic3r/PrintConfig.cpp:1225 src/libslic3r/PrintConfig.cpp:1444 +#: src/libslic3r/PrintConfig.cpp:1473 src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1557 src/libslic3r/PrintConfig.cpp:1576 +#: src/libslic3r/PrintConfig.cpp:2395 src/libslic3r/PrintConfig.cpp:2412 msgid "Infill" msgstr "Preenchimento" -#: src/slic3r/GUI/ConfigManipulation.cpp:337 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Head penetration should not be greater than the head width." msgstr "A penetração da cabeça não deve ser maior do que a largura da cabeça." -#: src/slic3r/GUI/ConfigManipulation.cpp:339 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid Head penetration" msgstr "Penetração inválida da cabeça" -#: src/slic3r/GUI/ConfigManipulation.cpp:350 +#: src/slic3r/GUI/ConfigManipulation.cpp:362 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "" "O diâmetro da cabeça de pino deve ser menor do que o diâmetro do pilar." -#: src/slic3r/GUI/ConfigManipulation.cpp:352 +#: src/slic3r/GUI/ConfigManipulation.cpp:364 msgid "Invalid pinhead diameter" msgstr "Diâmetro inválido da cabeça de pino" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20 msgid "Upgrade" msgstr "Atualização" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22 msgid "Downgrade" msgstr "Desatualização" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 msgid "Before roll back" msgstr "Antes de reverter" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:340 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:26 src/libslic3r/PrintConfig.cpp:353 msgid "User" msgstr "Usuário" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:329 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:29 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1135 msgid "Unknown" msgstr "Desconhecido" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 msgid "Active" msgstr "Ativar" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 msgid "PrusaSlicer version" msgstr "Versão do PrusaSlicer" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 src/libslic3r/Preset.cpp:1341 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 src/libslic3r/Preset.cpp:1480 msgid "print" msgstr "impressão" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:65 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 msgid "filaments" msgstr "filamentos" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 src/libslic3r/Preset.cpp:1343 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:67 src/libslic3r/Preset.cpp:1482 msgid "SLA print" msgstr "Impressão de SLA" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69 -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/slic3r/GUI/GUI.cpp:340 -#: src/slic3r/GUI/Plater.cpp:821 src/libslic3r/Preset.cpp:1344 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/slic3r/GUI/GUI.cpp:331 +#: src/slic3r/GUI/Plater.cpp:851 src/libslic3r/Preset.cpp:1483 msgid "SLA material" msgstr "Material de SLA" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:71 src/libslic3r/Preset.cpp:1345 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 src/libslic3r/Preset.cpp:1484 msgid "printer" msgstr "impressora" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 src/slic3r/GUI/Tab.cpp:1366 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 src/slic3r/GUI/Tab.cpp:1311 msgid "vendor" msgstr "fornecedor" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 msgid "version" msgstr "versão" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:76 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 msgid "min PrusaSlicer version" msgstr "versão mínima do PrusaSlicer" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:77 msgid "max PrusaSlicer version" msgstr "versão máxima do PrusaSlicer" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "model" msgstr "modelo" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "variants" msgstr "variantes" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:93 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:92 #, c-format, boost-format msgid "Incompatible with this %s" msgstr "Incompatível com isso %s" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:96 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:95 msgid "Activate" msgstr "Ativar" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:123 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:122 msgid "Configuration Snapshots" msgstr "Config. das versões" -#: src/slic3r/GUI/ConfigWizard.cpp:262 +#: src/slic3r/GUI/ConfigWizard.cpp:291 msgid "nozzle" msgstr "bico de impressão" -#: src/slic3r/GUI/ConfigWizard.cpp:266 +#: src/slic3r/GUI/ConfigWizard.cpp:295 msgid "Alternate nozzles:" msgstr "Alternar bicos:" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "All standard" msgstr "Todos padrão" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "Standard" msgstr "Todos padrão" -#: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3833 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 +#: src/slic3r/GUI/ConfigWizard.cpp:360 src/slic3r/GUI/ConfigWizard.cpp:681 +#: src/slic3r/GUI/FileArchiveDialog.cpp:261 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 src/slic3r/GUI/Preferences.cpp:550 +#: src/slic3r/GUI/Tab.cpp:4058 src/slic3r/GUI/UnsavedChangesDialog.cpp:1161 msgid "All" msgstr "Todos" -#: src/slic3r/GUI/ConfigWizard.cpp:332 src/slic3r/GUI/ConfigWizard.cpp:652 -#: src/slic3r/GUI/DoubleSlider.cpp:2030 src/slic3r/GUI/Plater.cpp:432 -#: src/slic3r/GUI/Plater.cpp:579 src/slic3r/GUI/Preferences.cpp:436 -#: src/libslic3r/PrintConfig.cpp:1291 +#: src/slic3r/GUI/ConfigWizard.cpp:361 src/slic3r/GUI/ConfigWizard.cpp:682 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 +#: src/slic3r/GUI/FileArchiveDialog.cpp:265 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1984 src/slic3r/GUI/Plater.cpp:439 +#: src/slic3r/GUI/Plater.cpp:594 src/slic3r/GUI/Preferences.cpp:552 +#: src/libslic3r/PrintConfig.cpp:1347 msgid "None" msgstr "Nenhum" -#: src/slic3r/GUI/ConfigWizard.cpp:484 +#: src/slic3r/GUI/ConfigWizard.cpp:513 #, c-format, boost-format msgid "Welcome to the %s Configuration Assistant" msgstr "Bem-vindo ao %s Assistente de config" -#: src/slic3r/GUI/ConfigWizard.cpp:486 +#: src/slic3r/GUI/ConfigWizard.cpp:515 #, c-format, boost-format msgid "Welcome to the %s Configuration Wizard" msgstr "Bem-vindo ao %s Assistente de config" -#: src/slic3r/GUI/ConfigWizard.cpp:488 +#: src/slic3r/GUI/ConfigWizard.cpp:517 msgid "Welcome" msgstr "Bem-vindo(a)" -#: src/slic3r/GUI/ConfigWizard.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:519 #, c-format, boost-format msgid "" "Hello, welcome to %s! This %s helps you with the initial configuration; just " @@ -709,12 +787,12 @@ msgstr "" "Olá, bem-vindo ao %s! Isso %s te ajuda com a config. inicial; com apenas " "algumas config. e você estará pronto para imprimir." -#: src/slic3r/GUI/ConfigWizard.cpp:495 +#: src/slic3r/GUI/ConfigWizard.cpp:524 msgid "Remove user profiles (a snapshot will be taken beforehand)" msgstr "" "Remover perfis de usuário - instalar do zero (uma captura será salva antes)" -#: src/slic3r/GUI/ConfigWizard.cpp:498 +#: src/slic3r/GUI/ConfigWizard.cpp:527 msgid "" "Perform desktop integration (Sets this binary to be searchable by the " "system)." @@ -722,56 +800,67 @@ msgstr "" "Executar integração de área de trabalho (configura este binário para ser " "pesquisável pelo sistema)." -#: src/slic3r/GUI/ConfigWizard.cpp:550 +#: src/slic3r/GUI/ConfigWizard.cpp:579 #, c-format, boost-format msgid "%s Family" msgstr "%s Família" -#: src/slic3r/GUI/ConfigWizard.cpp:640 +#: src/slic3r/GUI/ConfigWizard.cpp:670 msgid "Printer:" msgstr "Impressora:" -#: src/slic3r/GUI/ConfigWizard.cpp:642 +#: src/slic3r/GUI/ConfigWizard.cpp:672 msgid "Vendor:" msgstr "Fornecedor:" -#: src/slic3r/GUI/ConfigWizard.cpp:643 +#: src/slic3r/GUI/ConfigWizard.cpp:673 msgid "Profile:" msgstr "Perfil:" -#: src/slic3r/GUI/ConfigWizard.cpp:720 src/slic3r/GUI/ConfigWizard.cpp:892 -#: src/slic3r/GUI/ConfigWizard.cpp:952 src/slic3r/GUI/ConfigWizard.cpp:1088 +#: src/slic3r/GUI/ConfigWizard.cpp:750 src/slic3r/GUI/ConfigWizard.cpp:938 +#: src/slic3r/GUI/ConfigWizard.cpp:1024 src/slic3r/GUI/ConfigWizard.cpp:1163 msgid "(All)" msgstr "(Todos)" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:754 src/slic3r/GUI/ConfigWizard.cpp:1165 +msgid "(Templates)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:789 #, boost-format msgid "" -"%1% marked with * are not compatible with some installed " -"printers." +"%1% visible for (\"Template\") printer are universal profiles " +"available for all printers. These might not be compatible with your printer." msgstr "" -"%1% marcados com * são não compatíveis com algumas impressoras " -"instaladas." -#: src/slic3r/GUI/ConfigWizard.cpp:752 src/slic3r/GUI/ConfigWizard.cpp:2043 -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filaments" msgstr "Filamentos" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 msgid "SLA materials" msgstr "Materiais SLA" -#: src/slic3r/GUI/ConfigWizard.cpp:755 +#: src/slic3r/GUI/ConfigWizard.cpp:791 +#, boost-format +msgid "" +"%1% marked with * are not compatible with some installed " +"printers." +msgstr "" +"%1% marcados com * são não compatíveis com algumas impressoras " +"instaladas." + +#: src/slic3r/GUI/ConfigWizard.cpp:794 #, boost-format msgid "All installed printers are compatible with the selected %1%." msgstr "Todas as impressoras instaladas são compatíveis com o %1%." -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/libslic3r/Preset.cpp:1342 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/libslic3r/Preset.cpp:1481 msgid "filament" msgstr "filamento" -#: src/slic3r/GUI/ConfigWizard.cpp:778 +#: src/slic3r/GUI/ConfigWizard.cpp:818 msgid "" "Only the following installed printers are compatible with the selected " "filaments" @@ -779,7 +868,7 @@ msgstr "" "Apenas as seguintes impressoras instaladas são compatíveis com os filamentos " "selecionados" -#: src/slic3r/GUI/ConfigWizard.cpp:779 +#: src/slic3r/GUI/ConfigWizard.cpp:819 msgid "" "Only the following installed printers are compatible with the selected SLA " "materials" @@ -787,35 +876,53 @@ msgstr "" "Somente as seguintes impressoras instaladas são compatíveis com os materiais " "SLA selecionados" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1213 +msgid "" +"You have selected template filament. Please note that these filaments are " +"available for all printers but are NOT certain to be compatible with your " +"printer. Do you still wish to have this filament selected?\n" +"(This message won't be displayed again.)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1214 src/slic3r/GUI/ConfigWizard.cpp:2720 +#: src/slic3r/GUI/ConfigWizard.cpp:2860 src/slic3r/GUI/DoubleSlider.cpp:2591 +#: src/slic3r/GUI/DoubleSlider.cpp:2612 src/slic3r/GUI/GUI.cpp:245 +#: src/slic3r/GUI/GUI_App.cpp:3458 src/slic3r/GUI/UpdateDialogs.cpp:204 +#: src/slic3r/GUI/UpdateDialogs.cpp:212 src/slic3r/GUI/UpdateDialogs.cpp:217 +#: src/slic3r/GUI/UpdateDialogs.cpp:222 src/slic3r/GUI/UpdateDialogs.cpp:229 +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +msgid "Notice" +msgstr "Aviso" + +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer Setup" msgstr "Config. da impressora customizada" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer" msgstr "Impressora customizada" -#: src/slic3r/GUI/ConfigWizard.cpp:1177 +#: src/slic3r/GUI/ConfigWizard.cpp:1264 msgid "Define a custom printer profile" msgstr "Definir uma config. para a impressora customizada" -#: src/slic3r/GUI/ConfigWizard.cpp:1179 +#: src/slic3r/GUI/ConfigWizard.cpp:1265 msgid "Custom profile name:" msgstr "Nome customizado da config.:" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Automatic updates" msgstr "Atualizações automáticas" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Updates" msgstr "Atualizações" -#: src/slic3r/GUI/ConfigWizard.cpp:1214 +#: src/slic3r/GUI/ConfigWizard.cpp:1290 msgid "Check for application updates" msgstr "Verificar atualizações nas aplicações" -#: src/slic3r/GUI/ConfigWizard.cpp:1218 +#: src/slic3r/GUI/ConfigWizard.cpp:1294 #, c-format, boost-format msgid "" "If enabled, %s checks for new application versions online. When a new " @@ -828,11 +935,11 @@ msgstr "" "inicialização do aplicativo (nunca durante o uso do programa). Este é apenas " "um mecanismos de notificação, nenhuma instalação automática é feita." -#: src/slic3r/GUI/ConfigWizard.cpp:1224 src/slic3r/GUI/Preferences.cpp:175 +#: src/slic3r/GUI/ConfigWizard.cpp:1300 src/slic3r/GUI/Preferences.cpp:306 msgid "Update built-in Presets automatically" msgstr "Atualizar predefinições incorporadas automaticamente" -#: src/slic3r/GUI/ConfigWizard.cpp:1228 +#: src/slic3r/GUI/ConfigWizard.cpp:1304 #, c-format, boost-format msgid "" "If enabled, %s downloads updates of built-in system presets in the " @@ -845,7 +952,7 @@ msgstr "" "separado. Quando uma nova versão predefinida se torna disponível, ela é " "oferecida na inicialização do aplicativo." -#: src/slic3r/GUI/ConfigWizard.cpp:1231 +#: src/slic3r/GUI/ConfigWizard.cpp:1307 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." @@ -853,7 +960,7 @@ msgstr "" "Atualizações nunca são aplicadas sem a permissão do usuário e nunca sobre " "escrevem as config. do usuário." -#: src/slic3r/GUI/ConfigWizard.cpp:1236 +#: src/slic3r/GUI/ConfigWizard.cpp:1312 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." @@ -861,18 +968,62 @@ msgstr "" "Além disso, uma captura de backup de toda a config. é criado antes que uma " "atualização seja aplicada." -#: src/slic3r/GUI/ConfigWizard.cpp:1243 src/slic3r/GUI/GUI_Factories.cpp:726 -#: src/slic3r/GUI/Plater.cpp:3582 +#: src/slic3r/GUI/ConfigWizard.cpp:1361 src/slic3r/GUI/Preferences.cpp:1076 +msgid "Download path" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1366 src/slic3r/GUI/FirmwareDialog.cpp:815 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:300 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +msgid "Browse" +msgstr "Procurar" + +#: src/slic3r/GUI/ConfigWizard.cpp:1371 +msgid "Choose folder:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads from URL" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1417 +msgid "Allow built-in downloader" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1424 +#, c-format, boost-format +msgid "" +"If enabled, %s registers to start on custom URL on www.printables.com. You " +"will be able to use button with %s logo to open models in this %s. The model " +"will be downloaded into folder you choose bellow." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1431 +msgid "" +"On Linux systems the process of registration also creates desktop " +"integration files for this version of application." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1458 +msgid "Chosen directory for downloads does not Exists." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1545 src/slic3r/GUI/GUI_Factories.cpp:810 +#: src/slic3r/GUI/Plater.cpp:3732 msgid "Reload from disk" msgstr "Recarregar a partir do disco" -#: src/slic3r/GUI/ConfigWizard.cpp:1246 +#: src/slic3r/GUI/ConfigWizard.cpp:1548 msgid "" "Export full pathnames of models and parts sources into 3mf and amf files" msgstr "" "Exportar nomes completos de modelos e fontes de peças para arquivos 3mf e amf" -#: src/slic3r/GUI/ConfigWizard.cpp:1250 +#: src/slic3r/GUI/ConfigWizard.cpp:1552 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked.\n" @@ -884,23 +1035,23 @@ msgstr "" "Se não estiver habilitado, o comando Recarregar a partir do disco pedirá " "para selecionar cada arquivo usando uma caixa de diálogo de arquivo aberto." -#: src/slic3r/GUI/ConfigWizard.cpp:1259 +#: src/slic3r/GUI/ConfigWizard.cpp:1561 msgid "Files association" msgstr "Associação de arquivos" -#: src/slic3r/GUI/ConfigWizard.cpp:1261 src/slic3r/GUI/Preferences.cpp:157 +#: src/slic3r/GUI/ConfigWizard.cpp:1563 src/slic3r/GUI/Preferences.cpp:292 msgid "Associate .3mf files to PrusaSlicer" msgstr "Associar arquivos .3mf para PrusaSlicer" -#: src/slic3r/GUI/ConfigWizard.cpp:1262 src/slic3r/GUI/Preferences.cpp:164 +#: src/slic3r/GUI/ConfigWizard.cpp:1564 src/slic3r/GUI/Preferences.cpp:297 msgid "Associate .stl files to PrusaSlicer" msgstr "Associar arquivos .stl para PrusaSlicer" -#: src/slic3r/GUI/ConfigWizard.cpp:1272 +#: src/slic3r/GUI/ConfigWizard.cpp:1574 msgid "View mode" msgstr "Modo de visualização" -#: src/slic3r/GUI/ConfigWizard.cpp:1274 +#: src/slic3r/GUI/ConfigWizard.cpp:1576 msgid "" "PrusaSlicer's user interfaces comes in three variants:\n" "Simple, Advanced, and Expert.\n" @@ -915,82 +1066,96 @@ msgstr "" "sofisticados, são adequados para usuários avançados e experientes, " "respectivamente." -#: src/slic3r/GUI/ConfigWizard.cpp:1279 +#: src/slic3r/GUI/ConfigWizard.cpp:1581 msgid "Simple mode" msgstr "Modo simples" -#: src/slic3r/GUI/ConfigWizard.cpp:1280 +#: src/slic3r/GUI/ConfigWizard.cpp:1582 msgid "Advanced mode" msgstr "Modo avançado" -#: src/slic3r/GUI/ConfigWizard.cpp:1281 +#: src/slic3r/GUI/ConfigWizard.cpp:1583 msgid "Expert mode" msgstr "Modo especialista" -#: src/slic3r/GUI/ConfigWizard.cpp:1287 +#: src/slic3r/GUI/ConfigWizard.cpp:1596 msgid "The size of the object can be specified in inches" msgstr "O tamanho do objeto pode ser especificado em polegadas" -#: src/slic3r/GUI/ConfigWizard.cpp:1288 +#: src/slic3r/GUI/ConfigWizard.cpp:1597 msgid "Use inches" msgstr "Usar polegadas" -#: src/slic3r/GUI/ConfigWizard.cpp:1322 +#: src/slic3r/GUI/ConfigWizard.cpp:1617 msgid "Other Vendors" msgstr "Outros fornecedores" -#: src/slic3r/GUI/ConfigWizard.cpp:1326 +#: src/slic3r/GUI/ConfigWizard.cpp:1621 #, c-format, boost-format msgid "Pick another vendor supported by %s" msgstr "Escolha outro fornecedor suportado por %s" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 msgid "Firmware Type" msgstr "Tipo de Firmware" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2366 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 src/slic3r/GUI/Tab.cpp:2354 msgid "Firmware" msgstr "Firmware" -#: src/slic3r/GUI/ConfigWizard.cpp:1361 +#: src/slic3r/GUI/ConfigWizard.cpp:1658 msgid "Choose the type of firmware used by your printer." msgstr "Escolha o tipo de firmware utilizado na sua impressora." -#: src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/ConfigWizard.cpp:1707 src/slic3r/GUI/ConfigWizard.cpp:1778 +#: src/slic3r/GUI/ConfigWizard.cpp:1783 src/slic3r/GUI/ConfigWizard.cpp:1788 +#: src/slic3r/GUI/Field.cpp:258 src/slic3r/GUI/Field.cpp:328 +#: src/slic3r/GUI/Field.cpp:1585 src/slic3r/GUI/GUI_ObjectLayers.cpp:435 +msgid "Invalid numeric input." +msgstr "Entrada numérica não válida." + +#: src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape and Size" msgstr "Forma e tamanho da mesa" -#: src/slic3r/GUI/ConfigWizard.cpp:1399 +#: src/slic3r/GUI/ConfigWizard.cpp:1735 msgid "Set the shape of your printer's bed." msgstr "Insira o formato da mesa de impressão." -#: src/slic3r/GUI/ConfigWizard.cpp:1433 src/slic3r/GUI/Field.cpp:255 -#: src/slic3r/GUI/Field.cpp:324 src/slic3r/GUI/Field.cpp:1561 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:435 -msgid "Invalid numeric input." -msgstr "Entrada numérica não válida." +#: src/slic3r/GUI/ConfigWizard.cpp:1755 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1610 +msgid "Build Volume" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1758 +msgid "Set vertical size of your printer." +msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1795 +msgid "Max print height:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Filament and Nozzle Diameters" msgstr "Diâmetro do bico e do filamento" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Print Diameters" msgstr "Diâmetros de impressão" -#: src/slic3r/GUI/ConfigWizard.cpp:1472 +#: src/slic3r/GUI/ConfigWizard.cpp:1828 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "Insira o diâmetro do bico de impressão." -#: src/slic3r/GUI/ConfigWizard.cpp:1475 +#: src/slic3r/GUI/ConfigWizard.cpp:1831 msgid "Nozzle Diameter:" msgstr "Diâmetro do bico:" -#: src/slic3r/GUI/ConfigWizard.cpp:1485 +#: src/slic3r/GUI/ConfigWizard.cpp:1841 msgid "Enter the diameter of your filament." msgstr "Coloque o diâmetro do seu filamento." -#: src/slic3r/GUI/ConfigWizard.cpp:1486 +#: src/slic3r/GUI/ConfigWizard.cpp:1842 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." @@ -998,37 +1163,38 @@ msgstr "" "É necessário uma boa precisão, utilize um paquímetro e realize várias " "medições ao longo do filamento, faça uma média." -#: src/slic3r/GUI/ConfigWizard.cpp:1489 +#: src/slic3r/GUI/ConfigWizard.cpp:1845 msgid "Filament Diameter:" msgstr "Diâmetro do filamento:" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Nozzle and Bed Temperatures" msgstr "Temperaturas da mesa e da extrusora" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Temperatures" msgstr "Temperaturas" -#: src/slic3r/GUI/ConfigWizard.cpp:1563 +#: src/slic3r/GUI/ConfigWizard.cpp:1919 msgid "Enter the temperature needed for extruding your filament." msgstr "Coloque a temperatura necessária para extrusar seu filamento." -#: src/slic3r/GUI/ConfigWizard.cpp:1564 +#: src/slic3r/GUI/ConfigWizard.cpp:1920 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "A regra de ouro é 160 à 230°C para PLA, e 215 à 250°C para ABS." -#: src/slic3r/GUI/ConfigWizard.cpp:1567 +#: src/slic3r/GUI/ConfigWizard.cpp:1923 msgid "Extrusion Temperature:" msgstr "Temperatura de extrusão:" -#: src/slic3r/GUI/ConfigWizard.cpp:1568 src/slic3r/GUI/ConfigWizard.cpp:1582 -#: src/libslic3r/PrintConfig.cpp:418 src/libslic3r/PrintConfig.cpp:1211 -#: src/libslic3r/PrintConfig.cpp:1266 src/libslic3r/PrintConfig.cpp:2842 +#: src/slic3r/GUI/ConfigWizard.cpp:1924 src/slic3r/GUI/ConfigWizard.cpp:1938 +#: src/libslic3r/PrintConfig.cpp:437 src/libslic3r/PrintConfig.cpp:1271 +#: src/libslic3r/PrintConfig.cpp:1326 src/libslic3r/PrintConfig.cpp:2930 +#: src/libslic3r/PrintConfig.cpp:3689 msgid "°C" msgstr "°C" -#: src/slic3r/GUI/ConfigWizard.cpp:1577 +#: src/slic3r/GUI/ConfigWizard.cpp:1933 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." @@ -1036,7 +1202,7 @@ msgstr "" "Coloque a temperatura da mesa necessária para fazer com que seu filamento " "grude na mesa." -#: src/slic3r/GUI/ConfigWizard.cpp:1578 +#: src/slic3r/GUI/ConfigWizard.cpp:1934 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." @@ -1044,23 +1210,23 @@ msgstr "" "A regra de ouro é 60°C para PLA, e 110°C para ABS. Deixe em zero se não há " "mesa aquecida." -#: src/slic3r/GUI/ConfigWizard.cpp:1581 +#: src/slic3r/GUI/ConfigWizard.cpp:1937 msgid "Bed Temperature:" msgstr "Temperatura da mesa:" -#: src/slic3r/GUI/ConfigWizard.cpp:2043 src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Materials" msgstr "Materiais" -#: src/slic3r/GUI/ConfigWizard.cpp:2097 +#: src/slic3r/GUI/ConfigWizard.cpp:2464 msgid "FFF Technology Printers" msgstr "Impressoras de tecnologia Prusa FFF" -#: src/slic3r/GUI/ConfigWizard.cpp:2102 +#: src/slic3r/GUI/ConfigWizard.cpp:2469 msgid "SLA Technology Printers" msgstr "Impressoras de tecnologia SLA" -#: src/slic3r/GUI/ConfigWizard.cpp:2338 +#: src/slic3r/GUI/ConfigWizard.cpp:2718 #, boost-format msgid "" "Following printer profiles has no default filament: %1%Please select one " @@ -1069,7 +1235,7 @@ msgstr "" "Os seguintes perfis de impressora não tem filamento padrão: %1%Por favor " "selecione um manualmente." -#: src/slic3r/GUI/ConfigWizard.cpp:2339 +#: src/slic3r/GUI/ConfigWizard.cpp:2719 #, boost-format msgid "" "Following printer profiles has no default material: %1%Please select one " @@ -1078,37 +1244,31 @@ msgstr "" "Os seguintes perfis de impressora não possuem material padrão: %1%Por favor " "selecione um manualmente." -#: src/slic3r/GUI/ConfigWizard.cpp:2340 src/slic3r/GUI/ConfigWizard.cpp:2438 -#: src/slic3r/GUI/DoubleSlider.cpp:2522 src/slic3r/GUI/DoubleSlider.cpp:2543 -#: src/slic3r/GUI/GUI.cpp:232 -msgid "Notice" -msgstr "Aviso" - -#: src/slic3r/GUI/ConfigWizard.cpp:2459 +#: src/slic3r/GUI/ConfigWizard.cpp:2883 msgid "The following FFF printer models have no filament selected:" msgstr "Os seguintes caracteres não são permitidos:" -#: src/slic3r/GUI/ConfigWizard.cpp:2463 +#: src/slic3r/GUI/ConfigWizard.cpp:2887 msgid "Do you want to select default filaments for these FFF printer models?" msgstr "Deseja selecionar filamentos padrão automáticos?" -#: src/slic3r/GUI/ConfigWizard.cpp:2477 +#: src/slic3r/GUI/ConfigWizard.cpp:2901 msgid "The following SLA printer models have no materials selected:" msgstr "Os seguintes caracteres não são permitidos:" -#: src/slic3r/GUI/ConfigWizard.cpp:2481 +#: src/slic3r/GUI/ConfigWizard.cpp:2905 msgid "Do you want to select default SLA materials for these printer models?" msgstr "Deseja selecionar automaticamente materiais padrão?" -#: src/slic3r/GUI/ConfigWizard.cpp:2523 +#: src/slic3r/GUI/ConfigWizard.cpp:2947 msgid "Configuration is edited in ConfigWizard" msgstr "A configuração é editada no ConfigWizard" -#: src/slic3r/GUI/ConfigWizard.cpp:2566 +#: src/slic3r/GUI/ConfigWizard.cpp:3000 msgid "All user presets will be deleted." msgstr "Todas as predefinições do usuário serão excluídas." -#: src/slic3r/GUI/ConfigWizard.cpp:2596 +#: src/slic3r/GUI/ConfigWizard.cpp:3037 msgid "A new vendor was installed and one of its printers will be activated" msgid_plural "" "New vendors were installed and one of theirs printers will be activated" @@ -1117,98 +1277,103 @@ msgstr[0] "" msgstr[1] "" "Novos fornecedores foram instalados e uma de suas impressoras será ativada" -#: src/slic3r/GUI/ConfigWizard.cpp:2625 +#: src/slic3r/GUI/ConfigWizard.cpp:3069 msgid "Do you want to continue changing the configuration?" msgstr "Deseja continuar alterando a configuração?" -#: src/slic3r/GUI/ConfigWizard.cpp:2691 +#: src/slic3r/GUI/ConfigWizard.cpp:3136 msgid "A new Printer was installed and it will be activated." msgstr "Uma nova impressora foi instalada e será ativada." -#: src/slic3r/GUI/ConfigWizard.cpp:2696 +#: src/slic3r/GUI/ConfigWizard.cpp:3141 msgid "Some Printers were uninstalled." msgstr "Algumas impressoras foram desinstaladas." -#: src/slic3r/GUI/ConfigWizard.cpp:2717 +#: src/slic3r/GUI/ConfigWizard.cpp:3162 msgid "A new filament was installed and it will be activated." msgstr "Um novo filamento foi instalado e será ativado." -#: src/slic3r/GUI/ConfigWizard.cpp:2718 +#: src/slic3r/GUI/ConfigWizard.cpp:3163 msgid "A new SLA material was installed and it will be activated." msgstr "Um novo material de SLA foi instalado e será ativado." -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some filaments were uninstalled." msgstr "Alguns filamentos foram desinstalados." -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some SLA materials were uninstalled." msgstr "Alguns materiais de SLA foram desinstalados." -#: src/slic3r/GUI/ConfigWizard.cpp:2773 +#: src/slic3r/GUI/ConfigWizard.cpp:3218 msgid "Custom printer was installed and it will be activated." msgstr "A impressora personalizada foi instalada e será ativada." -#: src/slic3r/GUI/ConfigWizard.cpp:2858 +#: src/slic3r/GUI/ConfigWizard.cpp:3306 msgid "Select all standard printers" msgstr "Selecione todas as impressoras padrão" -#: src/slic3r/GUI/ConfigWizard.cpp:2861 +#: src/slic3r/GUI/ConfigWizard.cpp:3309 msgid "< &Back" msgstr "< &Voltar" -#: src/slic3r/GUI/ConfigWizard.cpp:2862 +#: src/slic3r/GUI/ConfigWizard.cpp:3310 msgid "&Next >" msgstr "&Próximo >" -#: src/slic3r/GUI/ConfigWizard.cpp:2863 +#: src/slic3r/GUI/ConfigWizard.cpp:3311 msgid "&Finish" msgstr "&Final" -#: src/slic3r/GUI/ConfigWizard.cpp:2864 -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:3312 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:657 +#: src/slic3r/GUI/FileArchiveDialog.cpp:274 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 #: src/slic3r/GUI/FirmwareDialog.cpp:153 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1593 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1365 #: src/slic3r/GUI/ProgressStatusBar.cpp:26 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:93 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:879 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:96 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:907 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1606 msgid "Cancel" msgstr "Cancelar" -#: src/slic3r/GUI/ConfigWizard.cpp:2884 +#: src/slic3r/GUI/ConfigWizard.cpp:3332 msgid "Prusa FFF Technology Printers" msgstr "Impressoras de tecnologia Prusa FFF" -#: src/slic3r/GUI/ConfigWizard.cpp:2892 +#: src/slic3r/GUI/ConfigWizard.cpp:3340 msgid "Prusa MSLA Technology Printers" msgstr "Impressoras de tecnologia Prusa MSLA" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filament Profiles Selection" msgstr "Seleção de Perfis de Filamento" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 src/slic3r/GUI/ConfigWizard.cpp:2915 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 src/slic3r/GUI/ConfigWizard.cpp:3363 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Type:" msgstr "Tipo:" -#: src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Material Profiles Selection" msgstr "Perfil de material SLA padrão" -#: src/slic3r/GUI/ConfigWizard.cpp:3036 +#: src/slic3r/GUI/ConfigWizard.cpp:3486 msgid "Configuration Assistant" msgstr "Assistente de config" -#: src/slic3r/GUI/ConfigWizard.cpp:3037 +#: src/slic3r/GUI/ConfigWizard.cpp:3487 msgid "Configuration &Assistant" msgstr "Assistente &de config" -#: src/slic3r/GUI/ConfigWizard.cpp:3039 +#: src/slic3r/GUI/ConfigWizard.cpp:3489 msgid "Configuration Wizard" msgstr "Assistente de config" -#: src/slic3r/GUI/ConfigWizard.cpp:3040 +#: src/slic3r/GUI/ConfigWizard.cpp:3490 msgid "Configuration &Wizard" msgstr "Assistente &de config" @@ -1226,7 +1391,7 @@ msgstr "" "Falha na execução da integração da área de trabalho - Não foi possível " "encontrar o executável." -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:378 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:383 msgid "" "Performing desktop integration failed because the application directory was " "not found." @@ -1234,7 +1399,7 @@ msgstr "" "Falha na integração da área de trabalho porque o diretório do aplicativo não " "foi encontrado." -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:419 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:423 msgid "" "Performing desktop integration failed - could not create Gcodeviewer desktop " "file. PrusaSlicer desktop file was probably created successfully." @@ -1243,12 +1408,29 @@ msgstr "" "trabalho do arquivo Gcodeviewer. O arquivo de desktop PrusaSlicer " "provavelmente foi criado com sucesso." -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:459 -#: src/slic3r/GUI/GUI_App.cpp:2245 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:472 +msgid "" +"Performing downloader desktop integration failed - boost::filesystem::" +"canonical did not return appimage path." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:484 +msgid "" +"Performing downloader desktop integration failed - Could not find executable." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:602 +msgid "" +"Performing downloader desktop integration failed because the application " +"directory was not found." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:626 +#: src/slic3r/GUI/GUI_App.cpp:2407 msgid "Desktop Integration" msgstr "Integração da área de trabalho" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:466 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:633 msgid "" "Desktop Integration sets this binary to be searchable by the system.\n" "\n" @@ -1259,13 +1441,13 @@ msgstr "" "\n" "Pressione \"Executar\" para continuar." -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:480 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:647 msgid "Perform" msgstr "Executar" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1342 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:653 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/KBShortcutsDialog.cpp:106 +#: src/slic3r/GUI/MainFrame.cpp:1426 msgid "Undo" msgstr "Desfazer" @@ -1273,19 +1455,19 @@ msgstr "Desfazer" msgid "Place bearings in slots and resume printing" msgstr "Coloque rolamentos em ranhuras e retome a impressão" -#: src/slic3r/GUI/DoubleSlider.cpp:1379 +#: src/slic3r/GUI/DoubleSlider.cpp:1448 msgid "One layer mode" msgstr "Modo de uma camada" -#: src/slic3r/GUI/DoubleSlider.cpp:1381 +#: src/slic3r/GUI/DoubleSlider.cpp:1450 msgid "Discard all custom changes" msgstr "Descarte todas as alterações personalizadas" -#: src/slic3r/GUI/DoubleSlider.cpp:1385 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:1454 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to move" msgstr "Pule para movimento" -#: src/slic3r/GUI/DoubleSlider.cpp:1388 +#: src/slic3r/GUI/DoubleSlider.cpp:1457 #, c-format, boost-format msgid "" "Jump to height %s\n" @@ -1296,7 +1478,7 @@ msgstr "" "Definir modo régua\n" "ou Definir extrusoras sequenciais para toda impressão" -#: src/slic3r/GUI/DoubleSlider.cpp:1391 +#: src/slic3r/GUI/DoubleSlider.cpp:1460 #, c-format, boost-format msgid "" "Jump to height %s\n" @@ -1305,17 +1487,17 @@ msgstr "" "Pule para altura %s\n" "Ou Definir modo régua" -#: src/slic3r/GUI/DoubleSlider.cpp:1396 +#: src/slic3r/GUI/DoubleSlider.cpp:1465 msgid "Edit current color - Right click the colored slider segment" msgstr "" "Editar cor atual - Clique com o botão direito do mouse no segmento de " "controle deslizante colorido" -#: src/slic3r/GUI/DoubleSlider.cpp:1398 +#: src/slic3r/GUI/DoubleSlider.cpp:1467 msgid "This is wipe tower layer" msgstr "Esta é a camada da torre de limpeza" -#: src/slic3r/GUI/DoubleSlider.cpp:1408 +#: src/slic3r/GUI/DoubleSlider.cpp:1477 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing sequentually." @@ -1324,15 +1506,15 @@ msgstr "" "É impossível aplicar qualquer G-code personalizado para a impressão de " "objetos sequencialmente." -#: src/slic3r/GUI/DoubleSlider.cpp:1412 +#: src/slic3r/GUI/DoubleSlider.cpp:1481 msgid "Print mode" msgstr "Modo da impressora" -#: src/slic3r/GUI/DoubleSlider.cpp:1426 +#: src/slic3r/GUI/DoubleSlider.cpp:1495 msgid "Add extruder change - Left click" msgstr "Adicionar alteração extrusora - Clique à esquerda" -#: src/slic3r/GUI/DoubleSlider.cpp:1428 +#: src/slic3r/GUI/DoubleSlider.cpp:1497 msgid "" "Add color change - Left click for predefined color or Shift + Left click for " "custom color selection" @@ -1340,23 +1522,23 @@ msgstr "" "Adicionar mudança de cor - Clique à esquerda para cor predefinida ou Shift + " "Clique à esquerda para seleção personalizada de cores" -#: src/slic3r/GUI/DoubleSlider.cpp:1430 +#: src/slic3r/GUI/DoubleSlider.cpp:1499 msgid "Add color change - Left click" msgstr "Adicionar mudança de cor - Clique à esquerda" -#: src/slic3r/GUI/DoubleSlider.cpp:1431 +#: src/slic3r/GUI/DoubleSlider.cpp:1500 msgid "or press \"+\" key" msgstr "ou pressione a tecla \"+\"" -#: src/slic3r/GUI/DoubleSlider.cpp:1433 +#: src/slic3r/GUI/DoubleSlider.cpp:1502 msgid "Add another code - Ctrl + Left click" msgstr "Adicionar outro código - Ctrl + Clique à esquerda" -#: src/slic3r/GUI/DoubleSlider.cpp:1434 +#: src/slic3r/GUI/DoubleSlider.cpp:1503 msgid "Add another code - Right click" msgstr "Adicionar outro código - Clique com o botão direito" -#: src/slic3r/GUI/DoubleSlider.cpp:1440 +#: src/slic3r/GUI/DoubleSlider.cpp:1509 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing " @@ -1368,40 +1550,40 @@ msgstr "" "de objetos.\n" "Este código não será processado durante a geração de G-code." -#: src/slic3r/GUI/DoubleSlider.cpp:1458 +#: src/slic3r/GUI/DoubleSlider.cpp:1527 msgid "continue" msgstr "continuar" -#: src/slic3r/GUI/DoubleSlider.cpp:1466 +#: src/slic3r/GUI/DoubleSlider.cpp:1535 #, boost-format msgid "Color change (\"%1%\")" msgstr "Mudança de cor (\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1467 +#: src/slic3r/GUI/DoubleSlider.cpp:1536 #, boost-format msgid "Color change (\"%1%\") for Extruder %2%" msgstr "Mudança de cor (\"%1%\") para Extrusor %2%" -#: src/slic3r/GUI/DoubleSlider.cpp:1469 +#: src/slic3r/GUI/DoubleSlider.cpp:1538 #, boost-format msgid "Pause print (\"%1%\")" msgstr "Pausar impressão (\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1471 +#: src/slic3r/GUI/DoubleSlider.cpp:1540 #, boost-format msgid "Custom template (\"%1%\")" msgstr "Modelo customizado (\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1473 +#: src/slic3r/GUI/DoubleSlider.cpp:1542 #, boost-format msgid "Extruder (tool) is changed to Extruder \"%1%\"" msgstr "Extrusora (ferramenta) é alterada para Extrusora \"%1%\"" -#: src/slic3r/GUI/DoubleSlider.cpp:1480 +#: src/slic3r/GUI/DoubleSlider.cpp:1549 msgid "Note" msgstr "Nota" -#: src/slic3r/GUI/DoubleSlider.cpp:1482 +#: src/slic3r/GUI/DoubleSlider.cpp:1551 msgid "" "G-code associated to this tick mark is in a conflict with print mode.\n" "Editing it will cause changes of Slider data." @@ -1410,7 +1592,7 @@ msgstr "" "de impressão.\n" "Editá-lo causará alterações nos dados do Slider." -#: src/slic3r/GUI/DoubleSlider.cpp:1485 +#: src/slic3r/GUI/DoubleSlider.cpp:1554 msgid "" "There is a color change for extruder that won't be used till the end of " "print job.\n" @@ -1420,7 +1602,7 @@ msgstr "" "trabalho de impressão.\n" "Este código não será processado durante a geração de G-code." -#: src/slic3r/GUI/DoubleSlider.cpp:1488 +#: src/slic3r/GUI/DoubleSlider.cpp:1557 msgid "" "There is an extruder change set to the same extruder.\n" "This code won't be processed during G-code generation." @@ -1428,7 +1610,7 @@ msgstr "" "Há uma mudança extrusora definida para o mesmo extrusor.\n" "Este código não será processado durante a geração de G-code." -#: src/slic3r/GUI/DoubleSlider.cpp:1491 +#: src/slic3r/GUI/DoubleSlider.cpp:1560 msgid "" "There is a color change for extruder that has not been used before.\n" "Check your settings to avoid redundant color changes." @@ -1436,151 +1618,151 @@ msgstr "" "Há uma mudança de cor para extrusor que não foi usada antes.\n" "Verifique suas configurações para evitar alterações de cor redundantes." -#: src/slic3r/GUI/DoubleSlider.cpp:1496 +#: src/slic3r/GUI/DoubleSlider.cpp:1565 msgid "Delete tick mark - Left click or press \"-\" key" msgstr "" "Excluir marca de marca de marca - Clique à esquerda ou pressione a tecla \"-" "\"" -#: src/slic3r/GUI/DoubleSlider.cpp:1498 +#: src/slic3r/GUI/DoubleSlider.cpp:1567 msgid "Edit tick mark - Ctrl + Left click" msgstr "Editar marca de tique - Ctrl + Clique à esquerda" -#: src/slic3r/GUI/DoubleSlider.cpp:1499 +#: src/slic3r/GUI/DoubleSlider.cpp:1568 msgid "Edit tick mark - Right click" msgstr "Editar marca de tique - Clique com o botão direito do mouse" -#: src/slic3r/GUI/DoubleSlider.cpp:1602 src/slic3r/GUI/DoubleSlider.cpp:1633 -#: src/slic3r/GUI/GUI_Factories.cpp:778 +#: src/slic3r/GUI/DoubleSlider.cpp:1671 src/slic3r/GUI/DoubleSlider.cpp:1702 +#: src/slic3r/GUI/GUI_Factories.cpp:862 #, c-format, boost-format msgid "Extruder %d" msgstr "Extrusora %d" -#: src/slic3r/GUI/DoubleSlider.cpp:1603 src/slic3r/GUI/GUI_Factories.cpp:779 +#: src/slic3r/GUI/DoubleSlider.cpp:1672 src/slic3r/GUI/GUI_Factories.cpp:863 msgid "active" msgstr "ativar" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 msgid "Switch code to Change extruder" msgstr "Mudar código para extrusor de alterar" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Change extruder" msgstr "Mudar extrusora" -#: src/slic3r/GUI/DoubleSlider.cpp:1613 +#: src/slic3r/GUI/DoubleSlider.cpp:1682 msgid "Change extruder (N/A)" msgstr "Extrusora de alterações (N/A)" -#: src/slic3r/GUI/DoubleSlider.cpp:1615 src/slic3r/GUI/GUI_Factories.cpp:787 +#: src/slic3r/GUI/DoubleSlider.cpp:1684 src/slic3r/GUI/GUI_Factories.cpp:871 msgid "Use another extruder" msgstr "Use outra extrusora" -#: src/slic3r/GUI/DoubleSlider.cpp:1634 +#: src/slic3r/GUI/DoubleSlider.cpp:1703 msgid "used" msgstr "usado" -#: src/slic3r/GUI/DoubleSlider.cpp:1642 +#: src/slic3r/GUI/DoubleSlider.cpp:1711 #, boost-format msgid "Switch code to Color change (%1%) for:" msgstr "Mudar o código para mudança de cor (%1%) Para:" -#: src/slic3r/GUI/DoubleSlider.cpp:1643 +#: src/slic3r/GUI/DoubleSlider.cpp:1712 #, boost-format msgid "Add color change (%1%) for:" msgstr "Add/Excluir mudança de cor (%1%) para:" -#: src/slic3r/GUI/DoubleSlider.cpp:1968 +#: src/slic3r/GUI/DoubleSlider.cpp:2037 msgid "Add color change" msgstr "Adicionar mudança de cor" -#: src/slic3r/GUI/DoubleSlider.cpp:1979 +#: src/slic3r/GUI/DoubleSlider.cpp:2048 msgid "Add pause print" msgstr "Adicionar impressão de pausa" -#: src/slic3r/GUI/DoubleSlider.cpp:1983 +#: src/slic3r/GUI/DoubleSlider.cpp:2052 msgid "Add custom template" msgstr "Adicionar modelo customizado" -#: src/slic3r/GUI/DoubleSlider.cpp:1986 +#: src/slic3r/GUI/DoubleSlider.cpp:2055 msgid "Add custom G-code" msgstr "Adicionar G-code personalizado" -#: src/slic3r/GUI/DoubleSlider.cpp:2004 +#: src/slic3r/GUI/DoubleSlider.cpp:2073 msgid "Edit color" msgstr "Editar cor" -#: src/slic3r/GUI/DoubleSlider.cpp:2005 +#: src/slic3r/GUI/DoubleSlider.cpp:2074 msgid "Edit pause print message" msgstr "Editar mensagem de impressão de pausa" -#: src/slic3r/GUI/DoubleSlider.cpp:2006 +#: src/slic3r/GUI/DoubleSlider.cpp:2075 msgid "Edit custom G-code" msgstr "Editar G-code personalizado" -#: src/slic3r/GUI/DoubleSlider.cpp:2012 +#: src/slic3r/GUI/DoubleSlider.cpp:2081 msgid "Delete color change" msgstr "Excluir alteração de cor" -#: src/slic3r/GUI/DoubleSlider.cpp:2013 +#: src/slic3r/GUI/DoubleSlider.cpp:2082 msgid "Delete tool change" msgstr "Excluir alteração de ferramenta" -#: src/slic3r/GUI/DoubleSlider.cpp:2014 +#: src/slic3r/GUI/DoubleSlider.cpp:2083 msgid "Delete pause print" msgstr "Excluir impressão de pausa" -#: src/slic3r/GUI/DoubleSlider.cpp:2015 +#: src/slic3r/GUI/DoubleSlider.cpp:2084 msgid "Delete custom G-code" msgstr "Excluir G-code personalizado" -#: src/slic3r/GUI/DoubleSlider.cpp:2025 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:2094 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to height" msgstr "Pule para altura" -#: src/slic3r/GUI/DoubleSlider.cpp:2030 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 msgid "Hide ruler" msgstr "Esconder régua" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height" msgstr "Mostrar altura do objeto" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height on the ruler" msgstr "Mostrar altura do objeto na régua" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time" msgstr "Mostrar tempo estimado de impressão" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time on the ruler" msgstr "Mostrar tempo estimado de impressão na régua" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Ruler mode" msgstr "Modo régua" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Set ruler mode" msgstr "Definir modo régua" -#: src/slic3r/GUI/DoubleSlider.cpp:2047 +#: src/slic3r/GUI/DoubleSlider.cpp:2116 msgid "Set extruder sequence for the entire print" msgstr "Definir sequência de extrusora para toda a impressão" -#: src/slic3r/GUI/DoubleSlider.cpp:2051 +#: src/slic3r/GUI/DoubleSlider.cpp:2120 msgid "Set auto color changes" msgstr "Definir mudança de cor automática" -#: src/slic3r/GUI/DoubleSlider.cpp:2086 +#: src/slic3r/GUI/DoubleSlider.cpp:2155 msgid "This action will cause deletion of all ticks on vertical slider." msgstr "" "Esta ação causará a exclusão de todos os tiques no controle deslizante " "vertical." -#: src/slic3r/GUI/DoubleSlider.cpp:2087 src/slic3r/GUI/Tab.cpp:1318 +#: src/slic3r/GUI/DoubleSlider.cpp:2156 src/slic3r/GUI/Tab.cpp:1263 msgid "" "This action is not revertible.\n" "Do you want to proceed?" @@ -1588,63 +1770,65 @@ msgstr "" "Esta ação não é reversível.\n" "Você quer prosseguir?" -#: src/slic3r/GUI/DoubleSlider.cpp:2088 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1133 src/slic3r/GUI/GUI.cpp:245 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:649 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:679 -#: src/slic3r/GUI/WipeTowerDialog.cpp:58 src/slic3r/GUI/WipeTowerDialog.cpp:443 +#: src/slic3r/GUI/DoubleSlider.cpp:2157 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:537 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1119 src/slic3r/GUI/GUI.cpp:258 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:721 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:751 +#: src/slic3r/GUI/WipeTowerDialog.cpp:60 src/slic3r/GUI/WipeTowerDialog.cpp:445 msgid "Warning" msgstr "Aviso" -#: src/slic3r/GUI/DoubleSlider.cpp:2216 +#: src/slic3r/GUI/DoubleSlider.cpp:2285 msgid "Enter custom G-code used on current layer" msgstr "Digite o G-code personalizado usado na camada atual" -#: src/slic3r/GUI/DoubleSlider.cpp:2217 +#: src/slic3r/GUI/DoubleSlider.cpp:2286 #, boost-format msgid "Custom G-code on current layer (%1% mm)." msgstr "G-code personalizado na camada atual (%1% mm)." -#: src/slic3r/GUI/DoubleSlider.cpp:2238 +#: src/slic3r/GUI/DoubleSlider.cpp:2307 msgid "Enter short message shown on Printer display when a print is paused" msgstr "" "Digite mensagem curta mostrada no visor da impressora quando uma impressão é " "pausada" -#: src/slic3r/GUI/DoubleSlider.cpp:2239 +#: src/slic3r/GUI/DoubleSlider.cpp:2308 #, boost-format msgid "Message for pause print on current layer (%1% mm)." msgstr "Mensagem para impressão de pausa na camada atual (%1% mm)." -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the move you want to jump to" msgstr "Digite o movimento que você deseja saltar para" -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the height you want to jump to" msgstr "Digite a altura que você deseja saltar para" -#: src/slic3r/GUI/DoubleSlider.cpp:2515 +#: src/slic3r/GUI/DoubleSlider.cpp:2584 msgid "The last color change data was saved for a single extruder printing." msgstr "" "Parâmetros de mudança de ferramenta com impressoras de multi material com " "apenas uma extrusora." -#: src/slic3r/GUI/DoubleSlider.cpp:2516 src/slic3r/GUI/DoubleSlider.cpp:2532 +#: src/slic3r/GUI/DoubleSlider.cpp:2585 src/slic3r/GUI/DoubleSlider.cpp:2601 msgid "The last color change data was saved for a multi extruder printing." msgstr "" "Os últimos dados de mudança de cor foram salvos para uma impressão de vários " "extrusores." -#: src/slic3r/GUI/DoubleSlider.cpp:2518 +#: src/slic3r/GUI/DoubleSlider.cpp:2587 msgid "Your current changes will delete all saved color changes." msgstr "Suas alterações atuais excluirão todas as alterações de cor salvas." -#: src/slic3r/GUI/DoubleSlider.cpp:2519 src/slic3r/GUI/DoubleSlider.cpp:2540 +#: src/slic3r/GUI/DoubleSlider.cpp:2588 src/slic3r/GUI/DoubleSlider.cpp:2609 msgid "Are you sure you want to continue?" msgstr "Você tem certeza que deseja continuar?" -#: src/slic3r/GUI/DoubleSlider.cpp:2533 +#: src/slic3r/GUI/DoubleSlider.cpp:2602 msgid "" "Select YES if you want to delete all saved tool changes, \n" "NO if you want all tool changes switch to color changes, \n" @@ -1655,11 +1839,11 @@ msgstr "" "mudanças de cor, \n" "ou CANCELAR para deixá-lo inalterado." -#: src/slic3r/GUI/DoubleSlider.cpp:2536 +#: src/slic3r/GUI/DoubleSlider.cpp:2605 msgid "Do you want to delete all saved tool changes?" msgstr "Deseja excluir todas as alterações de ferramenta salvas?" -#: src/slic3r/GUI/DoubleSlider.cpp:2538 +#: src/slic3r/GUI/DoubleSlider.cpp:2607 msgid "" "The last color change data was saved for a multi extruder printing with tool " "changes for whole print." @@ -1667,20 +1851,34 @@ msgstr "" "Os últimos dados de mudança de cor foram salvos para uma impressão multi-" "extrusora com alterações de ferramenta para impressão inteira." -#: src/slic3r/GUI/DoubleSlider.cpp:2539 +#: src/slic3r/GUI/DoubleSlider.cpp:2608 msgid "Your current changes will delete all saved extruder (tool) changes." msgstr "" "Suas alterações atuais excluirão todas as alterações do extrusor " "(ferramenta) salvos." -#: src/slic3r/GUI/ExtraRenderers.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:538 -#: src/slic3r/GUI/GUI_ObjectList.cpp:550 src/slic3r/GUI/GUI_ObjectList.cpp:979 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4291 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:250 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:352 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:376 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:607 src/libslic3r/PrintConfig.cpp:800 +#: src/slic3r/GUI/Downloader.cpp:150 +#, boost-format +msgid "" +"Download won't start. Download URL doesn't point to https://files.printables." +"com : %1%" +msgstr "" + +#: src/slic3r/GUI/Downloader.cpp:181 +msgid "The download has failed:" +msgstr "" + +#: src/slic3r/GUI/DownloaderFileGet.cpp:193 +#, boost-format +msgid "Can't create file at %1%." +msgstr "" + +#: src/slic3r/GUI/ExtraRenderers.cpp:323 src/slic3r/GUI/GUI_ObjectList.cpp:571 +#: src/slic3r/GUI/GUI_ObjectList.cpp:583 src/slic3r/GUI/GUI_ObjectList.cpp:1043 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2125 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3013 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4884 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:259 src/libslic3r/PrintConfig.cpp:894 msgid "default" msgstr "padrão" @@ -1693,10 +1891,10 @@ msgid "Set extruder change for every" msgstr "Definir a mudança de extrusor para cada" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:60 -#: src/libslic3r/PrintConfig.cpp:662 src/libslic3r/PrintConfig.cpp:1430 -#: src/libslic3r/PrintConfig.cpp:2135 src/libslic3r/PrintConfig.cpp:2310 -#: src/libslic3r/PrintConfig.cpp:2386 src/libslic3r/PrintConfig.cpp:2639 -#: src/libslic3r/PrintConfig.cpp:2687 src/libslic3r/PrintConfig.cpp:2706 +#: src/libslic3r/PrintConfig.cpp:765 src/libslic3r/PrintConfig.cpp:1476 +#: src/libslic3r/PrintConfig.cpp:2165 src/libslic3r/PrintConfig.cpp:2343 +#: src/libslic3r/PrintConfig.cpp:2417 src/libslic3r/PrintConfig.cpp:2665 +#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2728 msgid "layers" msgstr "camadas" @@ -1729,26 +1927,26 @@ msgstr "Remover extrusor da seqüência" msgid "Add extruder to sequence" msgstr "Adicionar extrusor à seqüência" -#: src/slic3r/GUI/Field.cpp:190 +#: src/slic3r/GUI/Field.cpp:188 msgid "default value" msgstr "valor padrão" -#: src/slic3r/GUI/Field.cpp:193 +#: src/slic3r/GUI/Field.cpp:191 msgid "parameter name" msgstr "nome do parâmetro" -#: src/slic3r/GUI/Field.cpp:204 src/slic3r/GUI/OptionsGroup.cpp:827 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1067 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1079 +#: src/slic3r/GUI/Field.cpp:206 src/slic3r/GUI/OptionsGroup.cpp:852 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1074 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1086 msgid "N/A" msgstr "N/D" -#: src/slic3r/GUI/Field.cpp:226 src/slic3r/GUI/Field.cpp:298 +#: src/slic3r/GUI/Field.cpp:229 src/slic3r/GUI/Field.cpp:302 #, c-format, boost-format msgid "%s doesn't support percentage" msgstr "%s não suporta porcentagem" -#: src/slic3r/GUI/Field.cpp:266 +#: src/slic3r/GUI/Field.cpp:269 #, c-format, boost-format msgid "" "Input value is out of range\n" @@ -1757,16 +1955,16 @@ msgstr "" "O valor de entrada está fora do intervalo\n" "Tem certeza de que %s é um valor correto e deseja continuar?" -#: src/slic3r/GUI/Field.cpp:269 src/slic3r/GUI/Field.cpp:343 +#: src/slic3r/GUI/Field.cpp:272 src/slic3r/GUI/Field.cpp:347 msgid "Parameter validation" msgstr "Validação do parâmetro" -#: src/slic3r/GUI/Field.cpp:282 src/slic3r/GUI/Field.cpp:390 -#: src/slic3r/GUI/Field.cpp:1573 +#: src/slic3r/GUI/Field.cpp:285 src/slic3r/GUI/Field.cpp:394 +#: src/slic3r/GUI/Field.cpp:1597 msgid "Input value is out of range" msgstr "Valor de entrada está fora do limite" -#: src/slic3r/GUI/Field.cpp:340 +#: src/slic3r/GUI/Field.cpp:344 #, c-format, boost-format msgid "" "Do you mean %s%% instead of %s %s?\n" @@ -1777,7 +1975,7 @@ msgstr "" "Selecione SIM se quiser trocar esse valor para %s%%, \n" "ou NÃO se você tem certeza que %s %s é o valor correto." -#: src/slic3r/GUI/Field.cpp:397 +#: src/slic3r/GUI/Field.cpp:401 #, boost-format msgid "" "Invalid input format. Expected vector of dimensions in the following format: " @@ -1786,6 +1984,15 @@ msgstr "" "Formato de entrada inválido. Vetor de dimensões esperado no seguinte " "formato: \"%1%\"" +#: src/slic3r/GUI/FileArchiveDialog.cpp:170 +msgid "Archive preview" +msgstr "" + +#: src/slic3r/GUI/FileArchiveDialog.cpp:270 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +msgid "Open" +msgstr "" + #: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flash!" msgstr "Atualizando!" @@ -1873,12 +2080,6 @@ msgstr "Imagem do Firmware:" msgid "Select a file" msgstr "Selecione um arquivo" -#: src/slic3r/GUI/FirmwareDialog.cpp:815 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:297 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:372 -msgid "Browse" -msgstr "Procurar" - #: src/slic3r/GUI/FirmwareDialog.cpp:817 msgid "Serial port:" msgstr "Porte Serial:" @@ -1908,10 +2109,10 @@ msgid "Advanced: Output log" msgstr "Avançado: log de Saída" #: src/slic3r/GUI/FirmwareDialog.cpp:862 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:310 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:358 #: src/slic3r/GUI/Mouse3DController.cpp:543 -#: src/slic3r/GUI/PrintHostDialogs.cpp:261 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:122 +#: src/slic3r/GUI/PrintHostDialogs.cpp:313 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:125 msgid "Close" msgstr "Fechar" @@ -1931,7 +2132,7 @@ msgstr "Confirmação" msgid "Cancelling..." msgstr "Cancelando..." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1488 msgid "Shape Gallery" msgstr "Galeria de Formas" @@ -1939,39 +2140,44 @@ msgstr "Galeria de Formas" msgid "Select shape from the gallery" msgstr "Selecionar forma da galeria" -#: src/slic3r/GUI/GalleryDialog.cpp:100 -msgid "Add to bed" -msgstr "Adicionar a mesa" - -#: src/slic3r/GUI/GalleryDialog.cpp:101 -msgid "Add selected shape(s) to the bed" -msgstr "Adicione a(s) forma(s) selecionada(s) à mesa" - -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4152 +#: src/slic3r/GUI/GalleryDialog.cpp:114 src/slic3r/GUI/Tab.cpp:4377 msgid "Add" msgstr "Adicionar" -#: src/slic3r/GUI/GalleryDialog.cpp:117 +#: src/slic3r/GUI/GalleryDialog.cpp:114 msgid "Add one or more custom shapes" msgstr "Adicionar uma ou mais formas personalizadas" -#: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:506 -#: src/slic3r/GUI/GLCanvas3D.cpp:4547 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/GalleryDialog.cpp:115 src/slic3r/GUI/GalleryDialog.cpp:528 +#: src/slic3r/GUI/GLCanvas3D.cpp:4638 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/GUI_Factories.cpp:460 src/slic3r/GUI/Tab.cpp:3973 msgid "Delete" msgstr "Deletar" -#: src/slic3r/GUI/GalleryDialog.cpp:118 +#: src/slic3r/GUI/GalleryDialog.cpp:115 msgid "Delete one or more custom shape. You can't delete system shapes" msgstr "" "Exclua uma ou mais formas personalizadas. Você não pode excluir formas do " "sistema" -#: src/slic3r/GUI/GalleryDialog.cpp:400 +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "Add to bed" +msgstr "Adicionar a mesa" + +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "OK" +msgstr "OK" + +#: src/slic3r/GUI/GalleryDialog.cpp:143 +msgid "Add selected shape(s) to the bed" +msgstr "Adicione a(s) forma(s) selecionada(s) à mesa" + +#: src/slic3r/GUI/GalleryDialog.cpp:422 msgid "Choose one or more files (STL, OBJ):" msgstr "Escolha um ou mais arquivos (STL, OBJ):" -#: src/slic3r/GUI/GalleryDialog.cpp:440 +#: src/slic3r/GUI/GalleryDialog.cpp:462 #, boost-format msgid "" "It looks like selected %1%-file has an error or is destructed.\n" @@ -1980,549 +2186,526 @@ msgstr "" "Parece que o arquivo %1% selecionado tem um erro ou está destruído.\n" "Não podemos carregar este arquivo" -#: src/slic3r/GUI/GalleryDialog.cpp:451 +#: src/slic3r/GUI/GalleryDialog.cpp:473 msgid "Choose one PNG file:" msgstr "Escolha um arquivo PNG:" -#: src/slic3r/GUI/GalleryDialog.cpp:464 +#: src/slic3r/GUI/GalleryDialog.cpp:486 msgid "Replacing of the PNG" msgstr "Substituição do PNG" -#: src/slic3r/GUI/GalleryDialog.cpp:508 +#: src/slic3r/GUI/GalleryDialog.cpp:530 msgid "Change thumbnail" msgstr "Alterar miniatura" -#: src/slic3r/GUI/GalleryDialog.cpp:549 src/slic3r/GUI/GalleryDialog.cpp:554 +#: src/slic3r/GUI/GalleryDialog.cpp:571 src/slic3r/GUI/GalleryDialog.cpp:576 #, boost-format msgid "Loading of the \"%1%\"" msgstr "Carregando o \"%1%\"" -#: src/slic3r/GUI/GCodeViewer.cpp:274 +#: src/slic3r/GUI/GCodeViewer.cpp:343 msgid "Tool position" msgstr "Posição da ferramenta" -#: src/slic3r/GUI/GCodeViewer.cpp:1457 +#: src/slic3r/GUI/GCodeViewer.cpp:1547 msgid "Generating toolpaths" msgstr "Gerando caminhos" -#: src/slic3r/GUI/GCodeViewer.cpp:1517 +#: src/slic3r/GUI/GCodeViewer.cpp:1619 msgid "Generating vertex buffer" msgstr "Gerando buffer do vértice" -#: src/slic3r/GUI/GCodeViewer.cpp:1857 +#: src/slic3r/GUI/GCodeViewer.cpp:1979 msgid "Generating index buffers" msgstr "Gerando buffer do índice" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to hide" msgstr "Clique para esconder" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to show" msgstr "Clique para mostrar" -#: src/slic3r/GUI/GCodeViewer.cpp:3181 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 msgid "up to" msgstr "até" -#: src/slic3r/GUI/GCodeViewer.cpp:3187 +#: src/slic3r/GUI/GCodeViewer.cpp:3455 msgid "above" msgstr "acima de Z" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "from" msgstr "de" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "to" msgstr "para" -#: src/slic3r/GUI/GCodeViewer.cpp:3245 src/slic3r/GUI/GCodeViewer.cpp:3246 -#: src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3513 src/slic3r/GUI/GCodeViewer.cpp:3514 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 msgid "Percentage" msgstr "Porcentagem" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3570 msgid "Feature type" msgstr "Tipo de recurso" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3592 #: src/slic3r/GUI/RammingChart.cpp:90 msgid "Time" msgstr "Tempo" -#: src/slic3r/GUI/GCodeViewer.cpp:3295 src/slic3r/GUI/GCodeViewer.cpp:3306 -#: src/slic3r/GUI/GCodeViewer.cpp:3566 -msgid "Used filament" -msgstr "Filamento utilizado" - -#: src/slic3r/GUI/GCodeViewer.cpp:3298 +#: src/slic3r/GUI/GCodeViewer.cpp:3571 msgid "Height (mm)" msgstr "Altura (mm)" -#: src/slic3r/GUI/GCodeViewer.cpp:3299 +#: src/slic3r/GUI/GCodeViewer.cpp:3572 msgid "Width (mm)" msgstr "Espessura (mm)" -#: src/slic3r/GUI/GCodeViewer.cpp:3300 +#: src/slic3r/GUI/GCodeViewer.cpp:3573 msgid "Speed (mm/s)" msgstr "Velocidade (mm/s)" -#: src/slic3r/GUI/GCodeViewer.cpp:3301 -msgid "Fan Speed (%)" -msgstr "Velocidade da ventoinha (%)" +#: src/slic3r/GUI/GCodeViewer.cpp:3574 +msgid "Fan speed (%)" +msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3302 +#: src/slic3r/GUI/GCodeViewer.cpp:3575 msgid "Temperature (°C)" msgstr "Temperatura (ºC)" -#: src/slic3r/GUI/GCodeViewer.cpp:3303 +#: src/slic3r/GUI/GCodeViewer.cpp:3576 msgid "Volumetric flow rate (mm³/s)" msgstr "Vazão volumétrica (mm³/s)" -#: src/slic3r/GUI/GCodeViewer.cpp:3306 src/slic3r/GUI/GUI_Preview.cpp:224 -#: src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3577 +msgid "Layer time (linear)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3578 +msgid "Layer time (logarithmic)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3579 msgid "Tool" msgstr "Ferramenta" -#: src/slic3r/GUI/GCodeViewer.cpp:3309 src/slic3r/GUI/GUI_Preview.cpp:225 -#: src/slic3r/GUI/GUI_Preview.cpp:957 +#: src/slic3r/GUI/GCodeViewer.cpp:3580 msgid "Color Print" msgstr "Impressão colorida" -#: src/slic3r/GUI/GCodeViewer.cpp:3347 src/slic3r/GUI/GCodeViewer.cpp:3393 -#: src/slic3r/GUI/GCodeViewer.cpp:3398 src/slic3r/GUI/GUI_ObjectList.cpp:312 -#: src/slic3r/GUI/wxExtensions.cpp:536 src/libslic3r/PrintConfig.cpp:795 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 src/slic3r/GUI/GCodeViewer.cpp:3594 +#: src/slic3r/GUI/GCodeViewer.cpp:3860 +msgid "Used filament" +msgstr "Filamento utilizado" + +#: src/slic3r/GUI/GCodeViewer.cpp:3623 src/slic3r/GUI/GCodeViewer.cpp:4067 +#: src/libslic3r/PrintConfig.cpp:3025 +msgid "Travel" +msgstr "Deslocamento" + +#: src/slic3r/GUI/GCodeViewer.cpp:3640 src/slic3r/GUI/GCodeViewer.cpp:3685 +#: src/slic3r/GUI/GCodeViewer.cpp:3689 src/slic3r/GUI/GUI_ObjectList.cpp:338 +#: src/slic3r/GUI/wxExtensions.cpp:547 src/libslic3r/PrintConfig.cpp:888 msgid "Extruder" msgstr "Extrusora" -#: src/slic3r/GUI/GCodeViewer.cpp:3370 +#: src/slic3r/GUI/GCodeViewer.cpp:3662 msgid "Default color" msgstr "Cor de impressão padrão" -#: src/slic3r/GUI/GCodeViewer.cpp:3393 +#: src/slic3r/GUI/GCodeViewer.cpp:3685 msgid "default color" msgstr "cor de impressão padrão" -#: src/slic3r/GUI/GCodeViewer.cpp:3491 src/slic3r/GUI/GCodeViewer.cpp:3547 +#: src/slic3r/GUI/GCodeViewer.cpp:3785 src/slic3r/GUI/GCodeViewer.cpp:3841 msgid "Color change" msgstr "Adicionar mudança de cor" -#: src/slic3r/GUI/GCodeViewer.cpp:3510 src/slic3r/GUI/GCodeViewer.cpp:3545 +#: src/slic3r/GUI/GCodeViewer.cpp:3804 src/slic3r/GUI/GCodeViewer.cpp:3839 msgid "Print" msgstr "Imprrimir" -#: src/slic3r/GUI/GCodeViewer.cpp:3546 src/slic3r/GUI/GCodeViewer.cpp:3580 +#: src/slic3r/GUI/GCodeViewer.cpp:3840 src/slic3r/GUI/GCodeViewer.cpp:3874 msgid "Pause" msgstr "Pausar" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Event" msgstr "Evento" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Remaining time" msgstr "Tempo de impressão restante" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Duration" msgstr "Duração" -#: src/slic3r/GUI/GCodeViewer.cpp:3609 src/slic3r/GUI/GUI_Preview.cpp:1049 -#: src/libslic3r/PrintConfig.cpp:2937 -msgid "Travel" -msgstr "Deslocamento" - -#: src/slic3r/GUI/GCodeViewer.cpp:3612 -msgid "Movement" -msgstr "Movimento" - -#: src/slic3r/GUI/GCodeViewer.cpp:3613 -msgid "Extrusion" -msgstr "Extrusão" - -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1870 -#: src/slic3r/GUI/Tab.cpp:2812 -msgid "Retraction" -msgstr "Retração" - -#: src/slic3r/GUI/GCodeViewer.cpp:3631 src/slic3r/GUI/GCodeViewer.cpp:3634 -#: src/slic3r/GUI/GUI_Preview.cpp:1050 -msgid "Wipe" -msgstr "Limpar" - -#: src/slic3r/GUI/GCodeViewer.cpp:3666 src/slic3r/GUI/GUI_Preview.cpp:257 -#: src/slic3r/GUI/GUI_Preview.cpp:272 -msgid "Options" -msgstr "Opções de saída" - -#: src/slic3r/GUI/GCodeViewer.cpp:3669 src/slic3r/GUI/GUI_Preview.cpp:1051 -msgid "Retractions" -msgstr "Retrações" - -#: src/slic3r/GUI/GCodeViewer.cpp:3670 src/slic3r/GUI/GUI_Preview.cpp:1052 -msgid "Deretractions" -msgstr "Retorno da retração" - -#: src/slic3r/GUI/GCodeViewer.cpp:3671 src/slic3r/GUI/GUI_Preview.cpp:1053 -msgid "Seams" -msgstr "Costuras" - -#: src/slic3r/GUI/GCodeViewer.cpp:3672 src/slic3r/GUI/GUI_Preview.cpp:1054 -msgid "Tool changes" -msgstr "G-code de troca de ferramenta" - -#: src/slic3r/GUI/GCodeViewer.cpp:3673 src/slic3r/GUI/GUI_Preview.cpp:1055 -msgid "Color changes" -msgstr "Adicionar mudança de cor" - -#: src/slic3r/GUI/GCodeViewer.cpp:3674 src/slic3r/GUI/GUI_Preview.cpp:1056 -msgid "Print pauses" -msgstr "Pausas de impressão" - -#: src/slic3r/GUI/GCodeViewer.cpp:3675 src/slic3r/GUI/GUI_Preview.cpp:1057 -msgid "Custom G-codes" -msgstr "G-code customizado" - -#: src/slic3r/GUI/GCodeViewer.cpp:3695 src/slic3r/GUI/GCodeViewer.cpp:3714 -#: src/slic3r/GUI/GUI.cpp:341 src/slic3r/GUI/Plater.cpp:822 -#: src/libslic3r/PrintConfig.cpp:322 +#: src/slic3r/GUI/GCodeViewer.cpp:3928 src/slic3r/GUI/GUI.cpp:332 +#: src/slic3r/GUI/Plater.cpp:852 src/libslic3r/PrintConfig.cpp:335 msgid "Printer" msgstr "Impressora" -#: src/slic3r/GUI/GCodeViewer.cpp:3697 src/slic3r/GUI/GCodeViewer.cpp:3719 -#: src/slic3r/GUI/GUI.cpp:337 src/slic3r/GUI/Plater.cpp:818 +#: src/slic3r/GUI/GCodeViewer.cpp:3931 src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/Plater.cpp:848 msgid "Print settings" msgstr "Config. de impressão" -#: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 -#: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1970 src/slic3r/GUI/Tab.cpp:1971 +#: src/slic3r/GUI/GCodeViewer.cpp:3936 src/slic3r/GUI/GUI.cpp:330 +#: src/slic3r/GUI/Plater.cpp:849 src/slic3r/GUI/Tab.cpp:1930 +#: src/slic3r/GUI/Tab.cpp:1931 msgid "Filament" msgstr "Filamento" -#: src/slic3r/GUI/GCodeViewer.cpp:3739 +#: src/slic3r/GUI/GCodeViewer.cpp:3950 msgid "Estimated printing times" msgstr "Tempos estimados de impressão" -#: src/slic3r/GUI/GCodeViewer.cpp:3758 +#: src/slic3r/GUI/GCodeViewer.cpp:3969 msgid "Normal mode" msgstr "Modo normal" -#: src/slic3r/GUI/GCodeViewer.cpp:3759 +#: src/slic3r/GUI/GCodeViewer.cpp:3970 msgid "Stealth mode" msgstr "Modo silencioso" -#: src/slic3r/GUI/GCodeViewer.cpp:3766 src/libslic3r/PrintConfig.cpp:1189 -#: src/libslic3r/PrintConfig.cpp:1207 src/libslic3r/PrintConfig.cpp:1217 -#: src/libslic3r/PrintConfig.cpp:1262 +#: src/slic3r/GUI/GCodeViewer.cpp:3979 src/libslic3r/PrintConfig.cpp:1249 +#: src/libslic3r/PrintConfig.cpp:1267 src/libslic3r/PrintConfig.cpp:1277 +#: src/libslic3r/PrintConfig.cpp:1322 msgid "First layer" msgstr "Primeira camada" -#: src/slic3r/GUI/GCodeViewer.cpp:3767 +#: src/slic3r/GUI/GCodeViewer.cpp:3983 msgid "Total" msgstr "Total" -#: src/slic3r/GUI/GCodeViewer.cpp:3796 +#: src/slic3r/GUI/GCodeViewer.cpp:4002 msgid "Show stealth mode" msgstr "Mostrar modo silencioso" -#: src/slic3r/GUI/GCodeViewer.cpp:3800 +#: src/slic3r/GUI/GCodeViewer.cpp:4006 msgid "Show normal mode" msgstr "Mostrar modo normal" -#: src/slic3r/GUI/GLCanvas3D.cpp:225 src/slic3r/GUI/GLCanvas3D.cpp:4694 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:53 -msgid "Variable layer height" -msgstr "Altura da camada variável" +#: src/slic3r/GUI/GCodeViewer.cpp:4071 +msgid "Wipe" +msgstr "Limpar" -#: src/slic3r/GUI/GLCanvas3D.cpp:227 -msgid "Left mouse button:" -msgstr "Botão esquerdo do mouse:" +#: src/slic3r/GUI/GCodeViewer.cpp:4075 +msgid "Retractions" +msgstr "Retrações" -#: src/slic3r/GUI/GLCanvas3D.cpp:229 -msgid "Add detail" -msgstr "Adicionar Detalhe" +#: src/slic3r/GUI/GCodeViewer.cpp:4079 +msgid "Deretractions" +msgstr "Retorno da retração" -#: src/slic3r/GUI/GLCanvas3D.cpp:231 -msgid "Right mouse button:" -msgstr "Botão direito do mouse:" +#: src/slic3r/GUI/GCodeViewer.cpp:4083 +msgid "Seams" +msgstr "Costuras" -#: src/slic3r/GUI/GLCanvas3D.cpp:233 +#: src/slic3r/GUI/GCodeViewer.cpp:4087 +msgid "Tool changes" +msgstr "G-code de troca de ferramenta" + +#: src/slic3r/GUI/GCodeViewer.cpp:4091 +msgid "Color changes" +msgstr "Adicionar mudança de cor" + +#: src/slic3r/GUI/GCodeViewer.cpp:4095 +msgid "Print pauses" +msgstr "Pausas de impressão" + +#: src/slic3r/GUI/GCodeViewer.cpp:4099 +msgid "Custom G-codes" +msgstr "G-code customizado" + +#: src/slic3r/GUI/GCodeViewer.cpp:4103 +msgid "Center of gravity" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:4108 +msgid "Shells" +msgstr "Paredes" + +#: src/slic3r/GUI/GCodeViewer.cpp:4113 +msgid "Tool marker" +msgstr "Ferramenta de marcação" + +#: src/slic3r/GUI/GLCanvas3D.cpp:185 src/slic3r/GUI/GLCanvas3D.cpp:4784 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:71 +msgid "Variable layer height" +msgstr "Altura da camada variável" + +#: src/slic3r/GUI/GLCanvas3D.cpp:187 +msgid "Left mouse button:" +msgstr "Botão esquerdo do mouse:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:189 +msgid "Add detail" +msgstr "Adicionar Detalhe" + +#: src/slic3r/GUI/GLCanvas3D.cpp:191 +msgid "Right mouse button:" +msgstr "Botão direito do mouse:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:193 msgid "Remove detail" msgstr "Remover detalhes" -#: src/slic3r/GUI/GLCanvas3D.cpp:235 +#: src/slic3r/GUI/GLCanvas3D.cpp:195 msgid "Shift + Left mouse button:" msgstr "Shift + Botão do mouse esquerdo:" -#: src/slic3r/GUI/GLCanvas3D.cpp:237 +#: src/slic3r/GUI/GLCanvas3D.cpp:197 msgid "Reset to base" msgstr "Redefinir para base" -#: src/slic3r/GUI/GLCanvas3D.cpp:239 +#: src/slic3r/GUI/GLCanvas3D.cpp:199 msgid "Shift + Right mouse button:" msgstr "Shift + Botão do mouse direito:" -#: src/slic3r/GUI/GLCanvas3D.cpp:241 +#: src/slic3r/GUI/GLCanvas3D.cpp:201 msgid "Smoothing" msgstr "Suavizar" -#: src/slic3r/GUI/GLCanvas3D.cpp:243 +#: src/slic3r/GUI/GLCanvas3D.cpp:203 msgid "Mouse wheel:" msgstr "Scroll do mouse:" -#: src/slic3r/GUI/GLCanvas3D.cpp:245 +#: src/slic3r/GUI/GLCanvas3D.cpp:205 msgid "Increase/decrease edit area" msgstr "Aumentar/diminuir a área de edição" -#: src/slic3r/GUI/GLCanvas3D.cpp:248 +#: src/slic3r/GUI/GLCanvas3D.cpp:208 msgid "Adaptive" msgstr "Adaptativo" -#: src/slic3r/GUI/GLCanvas3D.cpp:254 +#: src/slic3r/GUI/GLCanvas3D.cpp:214 msgid "Quality / Speed" msgstr "Qualidade / Velocidade" -#: src/slic3r/GUI/GLCanvas3D.cpp:257 +#: src/slic3r/GUI/GLCanvas3D.cpp:217 msgid "Higher print quality versus higher print speed." msgstr "Maior qualidade de impressão versus maior velocidade de impressão." -#: src/slic3r/GUI/GLCanvas3D.cpp:268 +#: src/slic3r/GUI/GLCanvas3D.cpp:228 msgid "Smooth" msgstr "Suavizar" -#: src/slic3r/GUI/GLCanvas3D.cpp:274 src/libslic3r/PrintConfig.cpp:819 +#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/libslic3r/PrintConfig.cpp:908 msgid "Radius" msgstr "Raio" -#: src/slic3r/GUI/GLCanvas3D.cpp:286 +#: src/slic3r/GUI/GLCanvas3D.cpp:246 msgid "Keep min" msgstr "Mantenha min" -#: src/slic3r/GUI/GLCanvas3D.cpp:295 src/slic3r/GUI/GLCanvas3D.cpp:4123 +#: src/slic3r/GUI/GLCanvas3D.cpp:255 src/slic3r/GUI/GLCanvas3D.cpp:4217 msgid "Reset" msgstr "Redefinir" -#: src/slic3r/GUI/GLCanvas3D.cpp:561 +#: src/slic3r/GUI/GLCanvas3D.cpp:602 msgid "Variable layer height - Manual edit" msgstr "Habilitar altura de camada variável" -#: src/slic3r/GUI/GLCanvas3D.cpp:676 +#: src/slic3r/GUI/GLCanvas3D.cpp:717 msgid "Seq." msgstr "Seq." -#: src/slic3r/GUI/GLCanvas3D.cpp:1310 +#: src/slic3r/GUI/GLCanvas3D.cpp:1319 msgid "Variable layer height - Reset" msgstr "Habilitar altura de camada variável - Resetar" -#: src/slic3r/GUI/GLCanvas3D.cpp:1318 +#: src/slic3r/GUI/GLCanvas3D.cpp:1327 msgid "Variable layer height - Adaptive" msgstr "Habilitar altura de camada variável - Adaptativo" -#: src/slic3r/GUI/GLCanvas3D.cpp:1326 +#: src/slic3r/GUI/GLCanvas3D.cpp:1335 msgid "Variable layer height - Smooth all" msgstr "Habilitar altura de camada variável - Deixar tudo suave" -#: src/slic3r/GUI/GLCanvas3D.cpp:1733 +#: src/slic3r/GUI/GLCanvas3D.cpp:1778 msgid "Mirror Object" msgstr "Espelhar objeto" -#: src/slic3r/GUI/GLCanvas3D.cpp:2612 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:560 +#: src/slic3r/GUI/GLCanvas3D.cpp:2542 src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:117 msgid "Gizmo-Move" msgstr "Gizmo-Mover" -#: src/slic3r/GUI/GLCanvas3D.cpp:2695 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562 +#: src/slic3r/GUI/GLCanvas3D.cpp:2638 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:661 msgid "Gizmo-Rotate" msgstr "Gizmo-Rotacionar" -#: src/slic3r/GUI/GLCanvas3D.cpp:3300 +#: src/slic3r/GUI/GLCanvas3D.cpp:3263 msgid "Move Object" msgstr "Mover objeto" -#: src/slic3r/GUI/GLCanvas3D.cpp:3821 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3513 +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:40 +msgid "Gizmo-Place on Face" +msgstr "Gizmo-Colocar em uma face" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3904 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Switch to Settings" msgstr "Alterar para modo de edição" -#: src/slic3r/GUI/GLCanvas3D.cpp:3822 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3905 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Print Settings Tab" msgstr "Config. de impressão" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Filament Settings Tab" msgstr "Config. de filamentos" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Material Settings Tab" msgstr "Aba de config. de material" -#: src/slic3r/GUI/GLCanvas3D.cpp:3824 src/slic3r/GUI/GLCanvas3D.cpp:4657 +#: src/slic3r/GUI/GLCanvas3D.cpp:3907 src/slic3r/GUI/GLCanvas3D.cpp:4746 msgid "Printer Settings Tab" msgstr "Aba de config. da impressora" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Undo History" msgstr "Desfazer histórico" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Redo History" msgstr "Refazer histórico" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" msgstr[0] "Desfazer ação de %1$d" msgstr[1] "Desfazer ações de %1$d" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" msgstr[0] "Refazer ação de %1$d" msgstr[1] "Refazer ações de %1$d" -#: src/slic3r/GUI/GLCanvas3D.cpp:4011 src/slic3r/GUI/GLCanvas3D.cpp:4673 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 src/slic3r/GUI/Search.cpp:426 +#: src/slic3r/GUI/GLCanvas3D.cpp:4106 src/slic3r/GUI/GLCanvas3D.cpp:4762 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/Search.cpp:482 msgid "Search" msgstr "Pesquisar" -#: src/slic3r/GUI/GLCanvas3D.cpp:4025 src/slic3r/GUI/GLCanvas3D.cpp:4033 -#: src/slic3r/GUI/Search.cpp:432 +#: src/slic3r/GUI/GLCanvas3D.cpp:4120 src/slic3r/GUI/GLCanvas3D.cpp:4128 +#: src/slic3r/GUI/Search.cpp:488 msgid "Enter a search term" msgstr "Entre com um termo de busca" -#: src/slic3r/GUI/GLCanvas3D.cpp:4064 +#: src/slic3r/GUI/GLCanvas3D.cpp:4160 msgid "Arrange options" msgstr "Arranjar opções" -#: src/slic3r/GUI/GLCanvas3D.cpp:4097 +#: src/slic3r/GUI/GLCanvas3D.cpp:4193 #, boost-format msgid "Press %1%left mouse button to enter the exact value" msgstr "Pressione %1%botão esquerdo do mouse para inserir o valor exato" -#: src/slic3r/GUI/GLCanvas3D.cpp:4099 +#: src/slic3r/GUI/GLCanvas3D.cpp:4195 msgid "Spacing" msgstr "Espaçamento" -#: src/slic3r/GUI/GLCanvas3D.cpp:4106 -msgid "Enable rotations (slow)" -msgstr "Ativar rotações (devagar)" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Alignment" -msgstr "Alinhamento" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:4500 -msgid "Center" -msgstr "Centralizar" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear left" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front left" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front right" +#: src/slic3r/GUI/GLCanvas3D.cpp:4202 +msgid "Spacing from bed" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear right" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:2271 -msgid "Random" -msgstr "Aleatório" +#: src/slic3r/GUI/GLCanvas3D.cpp:4209 +msgid "Enable rotations (slow)" +msgstr "Ativar rotações (devagar)" -#: src/slic3r/GUI/GLCanvas3D.cpp:4133 src/slic3r/GUI/GLCanvas3D.cpp:4565 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Plater.cpp:1664 +#: src/slic3r/GUI/GLCanvas3D.cpp:4228 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 src/slic3r/GUI/Plater.cpp:7118 msgid "Arrange" msgstr "Arranjar" -#: src/slic3r/GUI/GLCanvas3D.cpp:4539 +#: src/slic3r/GUI/GLCanvas3D.cpp:4630 msgid "Add..." msgstr "Adicionar..." -#: src/slic3r/GUI/GLCanvas3D.cpp:4556 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5509 src/slic3r/GUI/Tab.cpp:4158 +#: src/slic3r/GUI/GLCanvas3D.cpp:4647 src/slic3r/GUI/KBShortcutsDialog.cpp:105 +#: src/slic3r/GUI/Plater.cpp:6047 src/slic3r/GUI/Tab.cpp:4383 msgid "Delete all" msgstr "Deletar todos" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 src/slic3r/GUI/KBShortcutsDialog.cpp:133 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 src/slic3r/GUI/KBShortcutsDialog.cpp:142 msgid "Arrange selection" msgstr "Arranjar seleção" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 msgid "Click right mouse button to show arrangement options" msgstr "Clique no botão direito para mostrar opções de arranjo" -#: src/slic3r/GUI/GLCanvas3D.cpp:4587 +#: src/slic3r/GUI/GLCanvas3D.cpp:4676 msgid "Copy" msgstr "Copiar" -#: src/slic3r/GUI/GLCanvas3D.cpp:4596 +#: src/slic3r/GUI/GLCanvas3D.cpp:4685 msgid "Paste" msgstr "Colar" -#: src/slic3r/GUI/GLCanvas3D.cpp:4608 src/slic3r/GUI/GUI_Factories.cpp:1084 -#: src/slic3r/GUI/GUI_Factories.cpp:1108 src/slic3r/GUI/GUI_Factories.cpp:1119 +#: src/slic3r/GUI/GLCanvas3D.cpp:4697 src/slic3r/GUI/GUI_Factories.cpp:1237 +#: src/slic3r/GUI/GUI_Factories.cpp:1261 src/slic3r/GUI/GUI_Factories.cpp:1272 msgid "Add instance" msgstr "Adicionar instância" -#: src/slic3r/GUI/GLCanvas3D.cpp:4619 src/slic3r/GUI/GUI_Factories.cpp:1087 +#: src/slic3r/GUI/GLCanvas3D.cpp:4708 src/slic3r/GUI/GUI_Factories.cpp:1240 msgid "Remove instance" msgstr "Remover instância" -#: src/slic3r/GUI/GLCanvas3D.cpp:4632 +#: src/slic3r/GUI/GLCanvas3D.cpp:4721 msgid "Split to objects" msgstr "Dividir em objetos" -#: src/slic3r/GUI/GLCanvas3D.cpp:4642 +#: src/slic3r/GUI/GLCanvas3D.cpp:4731 msgid "Split to parts" msgstr "Dividir em partes" -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/GLCanvas3D.cpp:4795 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/GLCanvas3D.cpp:4874 msgid "Click right mouse button to open/close History" msgstr "Clique no botão direito para abrir/fechar o Histórico" -#: src/slic3r/GUI/GLCanvas3D.cpp:4779 +#: src/slic3r/GUI/GLCanvas3D.cpp:4859 #, boost-format msgid "Next Undo action: %1%" msgstr "Próxima ação de desfazer: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:4795 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/GLCanvas3D.cpp:4874 src/slic3r/GUI/KBShortcutsDialog.cpp:107 +#: src/slic3r/GUI/MainFrame.cpp:1429 msgid "Redo" msgstr "Refazer" -#: src/slic3r/GUI/GLCanvas3D.cpp:4817 +#: src/slic3r/GUI/GLCanvas3D.cpp:4895 #, boost-format msgid "Next Redo action: %1%" msgstr "Próxima ação de refazer: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:6434 +#: src/slic3r/GUI/GLCanvas3D.cpp:6784 msgid "An object outside the print area was detected." msgstr "Um objeto foi detectado fora da área de impressão." -#: src/slic3r/GUI/GLCanvas3D.cpp:6435 +#: src/slic3r/GUI/GLCanvas3D.cpp:6785 msgid "A toolpath outside the print area was detected." msgstr "Há movimentos fora da área de impressão." -#: src/slic3r/GUI/GLCanvas3D.cpp:6436 +#: src/slic3r/GUI/GLCanvas3D.cpp:6786 msgid "SLA supports outside the print area were detected." msgstr "Suportes de SLA foram detectados fora da área de impressão." -#: src/slic3r/GUI/GLCanvas3D.cpp:6437 +#: src/slic3r/GUI/GLCanvas3D.cpp:6787 msgid "Some objects are not visible during editing." msgstr "Alguns objetos não são visíveis durante a edição." -#: src/slic3r/GUI/GLCanvas3D.cpp:6439 +#: src/slic3r/GUI/GLCanvas3D.cpp:6789 msgid "" "An object outside the print area was detected.\n" "Resolve the current problem to continue slicing." @@ -2530,324 +2713,1346 @@ msgstr "" "Um objeto foi encontrado fora da área de impressão.\n" "Resolva o problema atual para continuar o fatiamento." -#: src/slic3r/GUI/GLCanvas3D.cpp:6513 +#: src/slic3r/GUI/GLCanvas3D.cpp:6864 msgid "Selection-Add from rectangle" msgstr "Seleção-Adicionar do retângulo" -#: src/slic3r/GUI/GLCanvas3D.cpp:6528 +#: src/slic3r/GUI/GLCanvas3D.cpp:6879 msgid "Selection-Remove from rectangle" msgstr "Seleção-remover do retângulo" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4478 -msgid "Cut" -msgstr "Cortar" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:206 +msgid "Planar" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -msgid "in" -msgstr "pol" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Auto" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 -msgid "Keep upper part" -msgstr "Manter parte superior" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Manual" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 -msgid "Keep lower part" -msgstr "Manter parte inferior" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:213 +msgid "Plug" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:196 -msgid "Rotate lower part upwards" -msgstr "Rotacione as partes inferiores para cima" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:214 +msgid "Dowel" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:201 -msgid "Perform cut" -msgstr "Aplicar o corte" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Prism" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:49 -msgid "Paint-on supports" -msgstr "Pincel de suportes" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Frustum" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 -msgid "Clipping of view" -msgstr "Recorte de vista" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Triangle" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 -msgid "Reset direction" -msgstr "Restabelecer direção" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Square" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 -msgid "Brush size" -msgstr "Tamanho do pincel" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Hexagon" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 -msgid "Brush shape" -msgstr "Formato do pincel" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:59 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 +msgid "Circle" +msgstr "Circular" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 -msgid "Left mouse button" -msgstr "Botão esquerdo do mouse" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:233 +msgid "Keep orientation" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 -msgid "Enforce supports" -msgstr "Reforçar suportes" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:234 +msgid "Place on cut" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 -msgid "Right mouse button" -msgstr "Botão direito do mouse" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:235 +msgid "Flip upside down" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:434 -msgid "Block supports" -msgstr "Bloquear suportes" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +msgid "inch" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 -msgid "Shift + Left mouse button" -msgstr "Shift + Botão do mouse esquerdo" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 +msgid "Part" +msgstr "Parte" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:429 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 -msgid "Remove selection" -msgstr "Remover seleção" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 src/libslic3r/Print.cpp:1236 +msgid "Object" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 -msgid "Remove all selection" -msgstr "Remover toda seleção" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:264 +msgid "" +"Click to flip the cut plane\n" +"Drag to move the cut plane" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 -msgid "Circle" -msgstr "Circular" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:269 src/libslic3r/PrintConfig.cpp:498 +#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2325 src/libslic3r/PrintConfig.cpp:2613 +#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2876 src/libslic3r/PrintConfig.cpp:2907 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3231 +#: src/libslic3r/PrintConfig.cpp:3466 src/libslic3r/PrintConfig.cpp:3951 +msgid "°" +msgstr "°" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 -#: src/slic3r/GUI/GUI_Factories.cpp:461 -msgid "Sphere" -msgstr "Esfera" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:367 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:571 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1232 +msgid "Move cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +msgid "in" +msgstr "pol" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:68 -#: src/libslic3r/PrintConfig.cpp:1172 -msgid "Triangles" -msgstr "Triângulos" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:544 +msgid "Value" +msgstr "Valor" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 -msgid "Highlight overhang by angle" -msgstr "Destaque o overhang por ângulo" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:549 +msgid "Tolerance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 -msgid "Enforce" -msgstr "Reforçar" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 +msgid "Left click" +msgstr "Clique esquerdo" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 -msgid "Tool type" -msgstr "Tipo de ferramenta" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2348 +msgid "Add connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 -msgid "Brush" -msgstr "Pincel" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 +msgid "Right click" +msgstr "Clique direito" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:128 -msgid "Smart fill" -msgstr "Preenchimento inteligente" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +msgid "Remove connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:131 -msgid "Smart fill angle" -msgstr "Ângulo de preenchimento inteligente" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 +msgid "Drag" +msgstr "Arrastar" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:132 -msgid "Split triangles" -msgstr "Dividir triângulos" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1216 +msgid "Move connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 -msgid "On overhangs only" -msgstr "Apenas em overhangs" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +msgid "Add connector to selection" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:174 -#, boost-format -msgid "" -"Preselects faces by overhang angle. It is possible to restrict paintable " -"facets to only preselected faces when the option \"%1%\" is enabled." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +msgid "Remove connector from selection" msgstr "" -"Pré-seleções faces por ângulo de overhang. É possível restringir pintando " -"faces apenas para faces pré-selecionadas quando a opção \"%1%\" estiver " -"habilitada." -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:217 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:378 -msgid "Paints facets according to the chosen painting brush." -msgstr "Pinta faces de acordo com o pincel escolhido." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:870 +msgid "Select all connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:391 -msgid "" -"Paints neighboring facets whose relative angle is less or equal to set angle." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:894 src/libslic3r/PrintConfig.cpp:4644 +msgid "Cut" +msgstr "Cortar" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1227 +msgid "Rotate cut plane" msgstr "" -"Pinta faces vizinhas cujo ângulo relativo é menor ou igual ao ângulo " -"definido." -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:229 -#, boost-format -msgid "Allows painting only on facets selected by: \"%1%\"" -msgstr "Permite pintar apenas em faces selecionadas por: \"%1%\"" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1448 +msgid "Render cut plane as circle" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:244 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:419 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:144 -msgid "Paints all facets inside, regardless of their orientation." -msgstr "Pinte todas as faces internas, independente de suas orientações." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1537 +msgid "Connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:253 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:428 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:152 -msgid "Ignores facets facing away from the camera." -msgstr "Ignore faces de costas para a câmera." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1541 +msgid "Remove connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:262 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:437 -msgid "Paints only one facet." -msgstr "Pinta apenas uma face." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1550 +msgid "Type" +msgstr "Tipo" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:270 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:285 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:445 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:462 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:132 -msgid "Alt + Mouse wheel" -msgstr "Alt + Scroll do mouse" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1561 src/libslic3r/PrintConfig.cpp:2816 +msgid "Style" +msgstr "Estilo" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 -msgid "Splits bigger facets into smaller ones while the object is painted." -msgstr "Divide as faces maiores em menores enquanto o objeto é pintado." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1568 +msgid "Depth ratio" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:308 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:483 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:170 -msgid "Ctrl + Mouse wheel" -msgstr "Ctrl + Scroll do mouse" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1586 +msgid "Confirm connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:313 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:488 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:175 -msgid "Reset selection" -msgstr "Restabelecer seleção" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1652 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1666 +msgid "Flip cut plane" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:364 -msgid "Block supports by angle" -msgstr "Bloquear suporte por ângulo" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1710 +msgid "Hold SHIFT key to draw a cut line" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:365 -msgid "Add supports by angle" -msgstr "Adicionar suportes por ângulo" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1716 +msgid "Cut position: " +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:432 -msgid "Add supports" -msgstr "Adicionar ponto de suporte" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1725 +msgid "Reset cutting plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Edit connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Add connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1744 +msgid "Reset cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1745 +msgid "Reset cutting plane and remove connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1800 +msgid "After cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1820 +msgid "Cut to" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1823 +msgid "Objects" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1826 +msgid "Parts" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1840 +msgid "Perform cut" +msgstr "Aplicar o corte" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1930 +msgid "Invalid connectors detected" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1932 +#, c-format, boost-format +msgid "%1$d connector is out of cut contour" +msgid_plural "%1$d connectors are out of cut contour" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1935 +#, c-format, boost-format +msgid "%1$d connector is out of object" +msgid_plural "%1$d connectors are out of object" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1938 +msgid "Some connectors are overlapped" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1942 +msgid "" +"Invalid state. \n" +"No one part is selected for keep after cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1944 +msgid "" +"Warning state. \n" +"Cut plane is placed out of object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2153 +msgid "Connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2183 +msgid "Cut by Plane" +msgstr "Cortado por plano" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2323 +msgid "Cut by line" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2373 +msgid "Delete connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:252 +msgid "Entering Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:253 +msgid "Leaving Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:254 +msgid "Cut gizmo editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:601 +msgid "Emboss" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:866 +msgid "ERROR: Wait until ends or Cancel process." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:921 +msgid "Text-Rotate" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:953 +msgid "Font" +msgstr "Fonte" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:954 +#: src/libslic3r/PrintConfig.cpp:897 +msgid "Height" +msgstr "Altura" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:955 +msgid "Depth" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:963 +msgid "Use surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:964 +msgid "Char gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:965 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Line gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:966 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:967 +msgid "Skew ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:968 +msgid "Z-move" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:969 +msgid "Z-rot" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:970 +msgid "Collection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1047 +msgid "NORMAL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1048 +msgid "SMALL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1049 +msgid "ITALIC" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1050 +msgid "SWISS" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1051 +msgid "MODERN" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1088 +msgid "First font" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1093 +msgid "Default font" +msgstr "Fonte padrão" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1098 +msgid "Embossed text" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1513 +msgid "Warning: No font is selected. Select correct one." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1531 +#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1437 +#: src/slic3r/GUI/Tab.cpp:1472 src/slic3r/GUI/Tab.cpp:1607 +#: src/slic3r/GUI/Tab.cpp:1611 src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:2390 src/slic3r/GUI/Tab.cpp:4985 +#: src/libslic3r/PrintConfig.cpp:276 src/libslic3r/PrintConfig.cpp:514 +#: src/libslic3r/PrintConfig.cpp:1484 src/libslic3r/PrintConfig.cpp:1566 +#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:2562 +#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:3166 +#: src/libslic3r/PrintConfig.cpp:3200 src/libslic3r/PrintConfig.cpp:3211 +#: src/libslic3r/PrintConfig.cpp:3226 src/libslic3r/PrintConfig.cpp:3239 +#: src/libslic3r/PrintConfig.cpp:3248 src/libslic3r/PrintConfig.cpp:3260 +#: src/libslic3r/PrintConfig.cpp:3642 +msgid "Advanced" +msgstr "Avançado" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1631 +msgid "Can't write text by selected font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1632 +msgid "Try to choose another font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Empty" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Embossed text can NOT contain only white spaces." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Bad symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Text contain character glyph (represented by '?') unknown by font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:535 +msgid "Skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +msgid "Unsupported visualization of font skew for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Unsupported visualization of font boldness for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Unsupported visualization of gap between lines inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Too tall" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Diminished font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Too small" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Enlarged font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1660 +#, boost-format +msgid "%1% is NOT shown." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1964 +msgid " No symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1965 +msgid " ... Loading" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2015 +msgid " ... In queue" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2132 +#, boost-format +msgid "Font face \"%1%\" can't be selected." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2180 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:754 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:367 +msgid "Apply" +msgstr "Aplicar" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2192 +msgid "add file with font(.ttf, .ttc)" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2202 +msgid "Open dialog for choose from fonts." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2210 +msgid "Text is to object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2224 +msgid "Added" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2227 +msgid "Click to change text into object part." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2230 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4321 +msgid "You can't change a type of the last solid part of the object." +msgstr "Não é possível alterar um tipo da última parte sólida do objeto." + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2231 +msgid "Subtracted" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2237 +msgid "Click to change part type into negative volume." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2243 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4338 +msgid "Modifier" +msgstr "Modificador" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2249 +msgid "Click to change part type into modifier." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2256 +msgid "Change Text Type" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2287 +#, boost-format +msgid "Rename style(%1%) for embossing text: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2299 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2384 +msgid "Name can't be empty." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2301 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2386 +msgid "Name has to be unique." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2310 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2397 +msgid "ok" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2312 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2401 +msgid "cancel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2337 +msgid "Rename style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2344 +msgid "Rename current style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2345 +msgid "Can't rename temporary style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2362 +msgid "First Add style to list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2364 +#, boost-format +msgid "Save %1% style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2366 +msgid "No changes to save." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2373 +msgid "New name of style: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2422 +msgid "Save as new style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2434 +msgid "Only valid font can be added to style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2436 +msgid "Add style to my list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2438 +msgid "Add as new named style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2454 +msgid "Remove style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2485 +#, boost-format +msgid "Delete \"%1%\" style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2486 +#, boost-format +msgid "Can't delete \"%1%\". It is last style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2487 +#, boost-format +msgid "Can't delete temporary style \"%1%\"." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2494 +#, boost-format +msgid "" +"Are you sure,\n" +"that you want permanently and unrecoverable \n" +"remove style \"%1%\"?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2496 +msgid "Yes" +msgstr "Sim" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2505 +msgid "No" +msgstr "Não" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2555 +msgid "Presets" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2564 src/slic3r/GUI/GUI_App.cpp:2324 +msgid "modified" +msgstr "modificado" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2617 +#, boost-format +msgid "Modified style \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2618 +#, boost-format +msgid "Current style is \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2625 +msgid "Style modification will be lost." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2627 +#, boost-format +msgid "" +"Changing style to '%1%' will discard current style modification.\n" +"\n" +" Would you like to continue anyway?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2643 +msgid "Not valid style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2644 +#, boost-format +msgid "Style '%1%' can't be used and will be removed from list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2691 +msgid "Unset italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2708 +msgid "Set italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2738 +msgid "Unset bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2756 +msgid "Set bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2922 +msgid "WxFont is not loaded properly." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2957 +msgid "Revert font changes." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2991 +msgid "wx Make bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3002 +msgid "Revert text size." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3029 +msgid "Revert embossed depth." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3178 +msgid "" +"Advanced font options could be changed only for correct font.\n" +"Start with select correct font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3219 +msgid "Revert using of model surface." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3232 +msgid "font points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3241 +msgid "Revert gap between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3242 +msgid "Distance between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3257 +msgid "Revert gap between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3258 +msgid "Distance between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3272 +msgid "Undo boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3273 +msgid "Tiny / Wide glyphs" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3283 +msgid "Undo letter's skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3284 +msgid "Italic strength ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3304 +msgid "Undo translation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3305 +msgid "Distance of the center of text from model surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3350 +msgid "Undo rotation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3352 +msgid "Rotate text Clock-wise." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3386 +msgid "Select from True Type Collection." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3395 +msgid "Set text to face camera" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3402 +msgid "Use camera direction for text orientation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3486 +#, boost-format +msgid "Font '%1%' can't be used. Please select another." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3488 +msgid "Selected font is NOT True-type." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3512 +msgid "Choose one or more files (TTF, TTC):" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3539 +msgid "Choose SVG file:" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3600 +#, boost-format +msgid "" +"Can't load exactly same font(\"%1%\"), Aplication selected a similar " +"one(\"%2%\"). You have to specify font for enable edit text." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:81 +msgid "Enter emboss gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:82 +msgid "Leave emboss gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:83 +msgid "Embossing actions" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:37 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:66 +msgid "Paint-on supports" +msgstr "Pincel de suportes" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 +msgid "Automatic painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 +msgid "painting..." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:107 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +msgid "Clipping of view" +msgstr "Recorte de vista" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:106 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 +msgid "Reset direction" +msgstr "Restabelecer direção" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:108 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 +msgid "Brush size" +msgstr "Tamanho do pincel" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:109 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 +msgid "Brush shape" +msgstr "Formato do pincel" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1816 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:110 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 +msgid "Left mouse button" +msgstr "Botão esquerdo do mouse" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 +msgid "Enforce supports" +msgstr "Reforçar suportes" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 +msgid "Right mouse button" +msgstr "Botão direito do mouse" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:573 +msgid "Block supports" +msgstr "Bloquear suportes" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 +msgid "Shift + Left mouse button" +msgstr "Shift + Botão do mouse esquerdo" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:568 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:247 +msgid "Remove selection" +msgstr "Remover seleção" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 +msgid "Remove all selection" +msgstr "Remover toda seleção" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 +#: src/slic3r/GUI/GUI_Factories.cpp:481 +msgid "Sphere" +msgstr "Esfera" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:106 +#: src/libslic3r/PrintConfig.cpp:1231 +msgid "Triangles" +msgstr "Triângulos" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 +msgid "Highlight overhang by angle" +msgstr "Destaque o overhang por ângulo" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:63 +msgid "Enforce" +msgstr "Reforçar" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +msgid "Tool type" +msgstr "Tipo de ferramenta" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 +msgid "Brush" +msgstr "Pincel" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:68 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 +msgid "Smart fill" +msgstr "Preenchimento inteligente" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 +msgid "Smart fill angle" +msgstr "Ângulo de preenchimento inteligente" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:72 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 +msgid "Split triangles" +msgstr "Dividir triângulos" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:73 +msgid "On overhangs only" +msgstr "Apenas em overhangs" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:187 +#, boost-format +msgid "" +"Preselects faces by overhang angle. It is possible to restrict paintable " +"facets to only preselected faces when the option \"%1%\" is enabled." +msgstr "" +"Pré-seleções faces por ângulo de overhang. É possível restringir pintando " +"faces apenas para faces pré-selecionadas quando a opção \"%1%\" estiver " +"habilitada." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:230 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:371 +msgid "Paints facets according to the chosen painting brush." +msgstr "Pinta faces de acordo com o pincel escolhido." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:238 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:384 +msgid "" +"Paints neighboring facets whose relative angle is less or equal to set angle." +msgstr "" +"Pinta faces vizinhas cujo ângulo relativo é menor ou igual ao ângulo " +"definido." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242 +#, boost-format +msgid "Allows painting only on facets selected by: \"%1%\"" +msgstr "Permite pintar apenas em faces selecionadas por: \"%1%\"" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:257 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:412 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141 +msgid "Paints all facets inside, regardless of their orientation." +msgstr "Pinte todas as faces internas, independente de suas orientações." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:266 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:421 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:149 +msgid "Ignores facets facing away from the camera." +msgstr "Ignore faces de costas para a câmera." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:430 +msgid "Paints only one facet." +msgstr "Pinta apenas uma face." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:298 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:438 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:455 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:129 +msgid "Alt + Mouse wheel" +msgstr "Alt + Scroll do mouse" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:288 +msgid "Splits bigger facets into smaller ones while the object is painted." +msgstr "Divide as faces maiores em menores enquanto o objeto é pintado." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:321 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:476 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:167 +msgid "Ctrl + Mouse wheel" +msgstr "Ctrl + Scroll do mouse" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:326 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:481 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:172 +msgid "Reset selection" +msgstr "Restabelecer seleção" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:382 +msgid "Block supports by angle" +msgstr "Bloquear suporte por ângulo" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:383 +msgid "Add supports by angle" +msgstr "Adicionar suportes por ângulo" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +msgid "Automatic painting requires valid print setup." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:535 +msgid "Automatic painting will erase all currently painted areas." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:536 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1118 +msgid "Are you sure you want to do it?" +msgstr "Tem certeza que quer fazer isso?" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:540 +msgid "Automatic painting support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:571 +msgid "Add supports" +msgstr "Adicionar ponto de suporte" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:22 +msgid "Entering Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:23 +msgid "Leaving Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:24 +msgid "Paint-on supports editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:88 +msgid "Place on face" +msgstr "Colocar em uma face" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:29 +msgid "Hollow this object" +msgstr "Deixar este objeto oco" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 +msgid "Preview hollowed and drilled model" +msgstr "Modelo de visualização oco e perfurado" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 +msgid "Offset" +msgstr "Compensação" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 +msgid "Quality" +msgstr "Qualidade" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 +#: src/libslic3r/PrintConfig.cpp:4037 +msgid "Closing distance" +msgstr "Distância de fechamento" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 +msgid "Hole diameter" +msgstr "Diâmetro do orifício" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 +msgid "Hole depth" +msgstr "Profundidade do orifício" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 +msgid "Remove selected holes" +msgstr "Remover os buracos selecionados" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 +msgid "Remove all holes" +msgstr "Remova todos os buracos" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 +msgid "Show supports" +msgstr "Mostrar suportes" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:242 +msgid "Add drainage hole" +msgstr "Adicionar orifício de drenagem" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:361 +msgid "Delete drainage hole" +msgstr "Excluir orifício de drenagem" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:655 +msgid "Hollowing parameter change" +msgstr "Mudança de parâmetro de suporte" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:739 +msgid "Change drainage hole diameter" +msgstr "Mudar o diâmetro do orifício de drenagem" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:827 +msgid "Hollow and drill" +msgstr "Oco e broca" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:869 +msgid "Move drainage hole" +msgstr "Mover o orifício de drenagem" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:64 +msgid "No feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:65 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:76 +msgid "Vertex" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:66 +msgid "Edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:68 +msgid "Plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:77 +msgid "Point on edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:78 +msgid "Point on circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:79 +msgid "Point on plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:89 +msgid "Center of edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:90 +msgid "Center of circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:554 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2029 +msgid "Measure" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1236 +msgid "Edit to scale" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1258 +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:161 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:236 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:776 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:794 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:817 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:831 +#: src/libslic3r/PrintConfig.cpp:4713 +msgid "Scale" +msgstr "Escala" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1362 +msgctxt "Verb" +msgid "Scale" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1541 +msgid "##angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1740 +msgid "Measure tool debug" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1824 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1851 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1857 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1886 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1893 +msgid "Unselect feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1830 +msgid "Unselect center" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1835 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1862 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1898 +msgid "Select center" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1840 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1867 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1903 +msgid "Unselect point" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:41 -msgid "Place on face" -msgstr "Colocar em uma face" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1846 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1873 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1910 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select feature" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 -msgid "Hollow this object" -msgstr "Deixar este objeto oco" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select point" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 -msgid "Preview hollowed and drilled model" -msgstr "Modelo de visualização oco e perfurado" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Shift" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 -msgid "Offset" -msgstr "Compensação" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Enable point selection" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:57 -msgid "Quality" -msgstr "Qualidade" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2007 +msgid "Restart selection" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3905 -msgid "Closing distance" -msgstr "Distância de fechamento" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1952 +msgid "Esc" +msgstr "Esc" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 -msgid "Hole diameter" -msgstr "Diâmetro do orifício" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1955 +msgid "Unselect" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 -msgid "Hole depth" -msgstr "Profundidade do orifício" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1999 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2001 +msgid "Selection" +msgstr "Seleção" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 -msgid "Remove selected holes" -msgstr "Remover os buracos selecionados" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2021 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +msgid "Copy to clipboard" +msgstr "Copiar para a área de transferência" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 -msgid "Remove all holes" -msgstr "Remova todos os buracos" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2038 +msgid "Angle" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 -msgid "Show supports" -msgstr "Mostrar suportes" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Perpendicular distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:287 -msgid "Add drainage hole" -msgstr "Adicionar orifício de drenagem" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:403 -msgid "Delete drainage hole" -msgstr "Excluir orifício de drenagem" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2062 +msgid "Direct distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:590 -msgid "Hollowing parameter change" -msgstr "Mudança de parâmetro de suporte" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2072 +msgid "Distance XYZ" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:667 -msgid "Change drainage hole diameter" -msgstr "Mudar o diâmetro do orifício de drenagem" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:163 +msgid "Entering Measure gizmo" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:761 -msgid "Hollow and drill" -msgstr "Oco e broca" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:164 +msgid "Leaving Measure gizmo" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:811 -msgid "Move drainage hole" -msgstr "Mover o orifício de drenagem" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:165 +msgid "Measure gizmo editing" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:27 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:28 #, boost-format msgid "" "Your printer has more extruders than the multi-material painting gizmo " @@ -2858,81 +4063,85 @@ msgstr "" "multimateriais suporta. Por esta razão, apenas as primeiras %1% extrusoras " "poderão ser usadas para pintura." -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:45 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:46 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 msgid "Multimaterial painting" msgstr "Pintura multimateriais" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 msgid "First color" msgstr "Primeira cor" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 msgid "Second color" msgstr "Segunda cor" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:120 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:671 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:642 msgid "Remove painted color" msgstr "Remova a cor pintada" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 msgid "Clear all" msgstr "Limpar tudo" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:129 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 msgid "Bucket fill" msgstr "Preenchimento de balde" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:404 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:397 msgid "Paints neighboring facets that have the same color." msgstr "Pinta as faces vizinhas que têm a mesma cor." -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:450 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:443 msgid "Split bigger facets into smaller ones while the object is painted." msgstr "Divida as faces maiores em menores enquanto o objeto é pintado." -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:674 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:645 #, boost-format msgid "Painted using: Extruder %1%" msgstr "Pintado usando: Extrusora %1%" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:118 +msgid "Entering Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:119 +msgid "Leaving Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:120 +msgid "Multimaterial painting editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:76 msgid "Move" msgstr "Mover" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:466 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4532 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:643 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:745 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:775 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:813 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:830 +#: src/libslic3r/PrintConfig.cpp:4698 msgid "Rotate" msgstr "Rotacionar" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:505 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:707 msgid "Optimize orientation" msgstr "Otimize a orientação" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:552 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:319 -msgid "Apply" -msgstr "Aplicar" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:79 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4547 -msgid "Scale" -msgstr "Escala" +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:194 +msgid "Gizmo-Scale" +msgstr "Gizmo-Escala" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 msgid "Enforce seam" msgstr "Reforçar costura" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:38 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:255 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:252 msgid "Block seam" msgstr "Bloquear costura" @@ -2940,276 +4149,278 @@ msgstr "Bloquear costura" msgid "Seam painting" msgstr "Pintura de costura" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:23 +msgid "Entering Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:24 +msgid "Leaving Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:25 +msgid "Paint-on seam editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:105 msgid "Mesh name" msgstr "Nome da malha" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:69 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:107 msgid "Detail level" msgstr "Nível de detalhe" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:108 msgid "Decimate ratio" msgstr "Proporção de redução" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:113 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:147 #, boost-format msgid "" "Processing model '%1%' with more than 1M triangles could be slow. It is " -"highly recommend to reduce amount of triangles." +"highly recommended to reduce amount of triangles." msgstr "" -"O processamento do modelo '%1%' com mais de 1 milhão de triângulos pode ser " -"lento. recomendo reduzir a quantidade de triângulos." -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:116 -#: src/slic3r/GUI/GUI_Factories.cpp:705 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:150 +#: src/slic3r/GUI/GUI_Factories.cpp:789 msgid "Simplify model" msgstr "Modelo simplificado" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:143 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:177 msgid "Simplify" msgstr "Simplificar" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:156 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:190 msgid "Simplification is currently only allowed when a single part is selected" msgstr "" "Atualmente, a simplificação só é permitida quando uma única parte é " "selecionada" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 -#: src/slic3r/GUI/PrintHostDialogs.cpp:373 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:191 +#: src/slic3r/GUI/MainFrame.cpp:1246 src/slic3r/GUI/MainFrame.cpp:1716 +#: src/slic3r/GUI/PrintHostDialogs.cpp:425 msgid "Error" msgstr "Erro" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:250 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:294 msgid "Extra high" msgstr "Muito alto" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:251 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:295 msgid "High" msgstr "Alto" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:252 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:296 msgid "Medium" msgstr "Medio" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:297 msgid "Low" msgstr "Baixo" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:254 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:298 msgid "Extra low" msgstr "Muito baixo" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:304 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#, boost-format +msgid "" +"Multipart object can be simplified only by %1%. If you want specify %2% " +"process it separately." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:352 #, c-format, boost-format msgid "%d triangles" msgstr "%d triângulos" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:307 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:355 msgid "Show wireframe" msgstr "Mostrar estrutura de arame" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:313 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:361 msgid "Operation already cancelling. Please wait few seconds." msgstr "Operação já cancelada. Por favor, aguarde alguns segundos." -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:370 msgid "Can't apply when proccess preview." msgstr "Não pode ser aplicado durante a visualização do processo." -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:329 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:377 #, boost-format msgid "Process %1% / 100" msgstr "Processo %1% / 100" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:479 -#, boost-format -msgid "Simplify %1%" -msgstr "Simplificar %1%" +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:542 +msgid "Simplify " +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:543 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"simplifying the mesh." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:67 +msgid "Entering SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:68 +msgid "Leaving SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:35 msgid "Head diameter" msgstr "Diâmetro da cabeça" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:36 msgid "Lock supports under new islands" msgstr "Travar suportes debaixo de novas ilhas" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:37 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268 msgid "Remove selected points" msgstr "Remover pontos selecionados" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:38 msgid "Remove all points" msgstr "Remover todos os pontos" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1226 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1271 msgid "Apply changes" msgstr "Aplicar mudanças" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1227 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1272 msgid "Discard changes" msgstr "Descartar mudanças" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 msgid "Minimal points distance" msgstr "Distância mínima entre pontos" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3735 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/libslic3r/PrintConfig.cpp:3867 msgid "Support points density" msgstr "Densidade dos pontos de suporte" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1229 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1274 msgid "Auto-generate points" msgstr "Pontos gerados automaticamente" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 msgid "Manual editing" msgstr "Edição manual" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:372 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:307 msgid "Add support point" msgstr "Adicionar ponto de suporte" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:522 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:460 msgid "Delete support point" msgstr "Deletar ponto de suporte" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:702 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:626 msgid "Change point head diameter" msgstr "Mudar o diâmetro do ponto da cabeça" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:770 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:696 msgid "Support parameter change" msgstr "Mudança de parâmetro de suporte" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:876 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:806 msgid "SLA Support Points" msgstr "Pontos de suporte SLA" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:814 msgid "Do you want to save your manually edited support points?" msgstr "Você deseja salvar os pontos manualmente editados?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:898 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:815 msgid "Save support points?" msgstr "Salvar pontos de suporte?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:958 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:880 msgid "Move support point" msgstr "Mover pontos de suporte" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1051 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:987 msgid "Support points edit" msgstr "Edição de pontos de suporte" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1131 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1117 msgid "Autogeneration will erase all manually edited points." msgstr "Gerar automaticamente irá apagar todos os pontos manualmente editados." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1132 -msgid "Are you sure you want to do it?" -msgstr "Tem certeza que quer fazer isso?" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1138 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1124 msgid "Autogenerate support points" msgstr "Pontos de suporte gerados automaticamente" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1186 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 msgid "SLA gizmo keyboard shortcuts" msgstr "Atalhos no teclado para gizmo SLA" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1197 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1242 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "Nota: alguns atalhos funcionam somente em modos que não editam." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 -msgid "Left click" -msgstr "Clique esquerdo" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 msgid "Add point" msgstr "Adicionar ponto" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 -msgid "Right click" -msgstr "Clique direito" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 msgid "Remove point" msgstr "Remover ponto" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 -msgid "Drag" -msgstr "Arrastar" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 msgid "Move point" msgstr "Mover ponto" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 msgid "Add point to selection" msgstr "Adicionar ponto à seleção" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 msgid "Remove point from selection" msgstr "Remover ponto da seleção" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 msgid "Select by rectangle" msgstr "Selecionar por retângulo" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 msgid "Deselect by rectangle" msgstr "Desselecionar por retângulo" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1267 msgid "Select all points" msgstr "Selecionar todos os pontos" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Mouse wheel" msgstr "Scroll do mouse" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Move clipping plane" msgstr "Mover plano de recorte" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1225 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1270 msgid "Reset clipping plane" msgstr "Restabelecer plano de recorte" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1228 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273 msgid "Switch to editing mode" msgstr "Alterar para modo de edição" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:196 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:204 msgid "" "ERROR: Please close all manipulators available from the left toolbar first" msgstr "" "ERRO: Por favor, feche todos os manipuladores disponíveis na barra de " "ferramentas esquerda primeiro" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:561 -msgid "Gizmo-Scale" -msgstr "Gizmo-Escala" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:673 -msgid "Gizmo-Place on Face" -msgstr "Gizmo-Colocar em uma face" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:1270 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:998 msgid "" "You are currently editing SLA support points. Please, apply or discard your " "changes first." @@ -3217,16 +4428,16 @@ msgstr "" "Você está editando pontos de suporte de SLA. Por favor, aplique ou descarte " "suas alterações primeiro." -#: src/slic3r/GUI/GUI.cpp:292 +#: src/slic3r/GUI/GUI.cpp:287 msgid "Undefined" msgstr "Indefinido" -#: src/slic3r/GUI/GUI.cpp:317 +#: src/slic3r/GUI/GUI.cpp:308 #, boost-format msgid "%1% was substituted with %2%" msgstr "%1% foi substituído por %2%" -#: src/slic3r/GUI/GUI.cpp:326 +#: src/slic3r/GUI/GUI.cpp:317 msgid "" "Most likely the configuration was produced by a newer version of PrusaSlicer " "or by some PrusaSlicer fork." @@ -3234,23 +4445,23 @@ msgstr "" "Provavelmente a configuração foi produzida por uma versão mais recente do " "PrusaSlicer ou por algum fork PrusaSlicer." -#: src/slic3r/GUI/GUI.cpp:327 +#: src/slic3r/GUI/GUI.cpp:318 msgid "The following values were substituted:" msgstr "Os seguintes valores foram substituídos:" -#: src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/GUI.cpp:319 msgid "Review the substitutions and adjust them if needed." msgstr "Revise as substituições e ajuste-as, se necessário." -#: src/slic3r/GUI/GUI.cpp:338 src/slic3r/GUI/Plater.cpp:820 +#: src/slic3r/GUI/GUI.cpp:329 src/slic3r/GUI/Plater.cpp:850 msgid "SLA print settings" msgstr "Config. de impressão de SLA" -#: src/slic3r/GUI/GUI.cpp:342 src/slic3r/GUI/PhysicalPrinterDialog.cpp:157 +#: src/slic3r/GUI/GUI.cpp:333 src/slic3r/GUI/PhysicalPrinterDialog.cpp:158 msgid "Physical Printer" msgstr "Impressora Física" -#: src/slic3r/GUI/GUI.cpp:355 +#: src/slic3r/GUI/GUI.cpp:346 msgid "" "Configuration bundle was loaded, however some configuration values were not " "recognized." @@ -3258,7 +4469,7 @@ msgstr "" "O pacote de configuração foi carregado, porém alguns valores de " "configuração " -#: src/slic3r/GUI/GUI.cpp:365 +#: src/slic3r/GUI/GUI.cpp:356 #, boost-format msgid "" "Configuration file \"%1%\" was loaded, however some configuration values " @@ -3267,16 +4478,16 @@ msgstr "" "Arquivo de configuração \"%1%\" foi carregado, porém alguns valores de " "configuração não foram reconhecidos." -#: src/slic3r/GUI/GUI_App.cpp:266 +#: src/slic3r/GUI/GUI_App.cpp:275 msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." msgstr "" "é baseado no Slic3r criado por Alessandro Ranellucci e a comunidade RepRap." -#: src/slic3r/GUI/GUI_App.cpp:267 +#: src/slic3r/GUI/GUI_App.cpp:276 msgid "Developed by Prusa Research." msgstr "Desenvolvido por Prusa Research." -#: src/slic3r/GUI/GUI_App.cpp:269 +#: src/slic3r/GUI/GUI_App.cpp:278 msgid "" "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." @@ -3284,11 +4495,11 @@ msgstr "" "Contribuições por Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik e outros." -#: src/slic3r/GUI/GUI_App.cpp:270 -msgid "Artwork model by Leslie Ing" +#: src/slic3r/GUI/GUI_App.cpp:279 +msgid "Artwork model by Creative Tools" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:411 +#: src/slic3r/GUI/GUI_App.cpp:420 #, boost-format msgid "" "Starting with %1% 2.3, configuration directory on Linux has changed " @@ -3323,20 +4534,20 @@ msgstr "" "\n" "O que você quer fazer agora?" -#: src/slic3r/GUI/GUI_App.cpp:419 +#: src/slic3r/GUI/GUI_App.cpp:428 #, c-format, boost-format msgid "%s - BREAKING CHANGE" msgstr "%s - QUEBRANDO MUDANÇAS" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Quit, I will move my data now" msgstr "Sair, eu moverei meus dados agora" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Start the application" msgstr "Começar a aplicação" -#: src/slic3r/GUI/GUI_App.cpp:699 +#: src/slic3r/GUI/GUI_App.cpp:725 #, c-format, boost-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -3351,11 +4562,11 @@ msgstr "" "\n" "O aplicativo será encerrado agora." -#: src/slic3r/GUI/GUI_App.cpp:702 +#: src/slic3r/GUI/GUI_App.cpp:728 msgid "Fatal error" msgstr "Erro fatal" -#: src/slic3r/GUI/GUI_App.cpp:706 +#: src/slic3r/GUI/GUI_App.cpp:732 msgid "" "PrusaSlicer has encountered a localization error. Please report to " "PrusaSlicer team, what language was active and in which scenario this issue " @@ -3368,16 +4579,16 @@ msgstr "" "\n" "O aplicativo será encerrado agora." -#: src/slic3r/GUI/GUI_App.cpp:709 +#: src/slic3r/GUI/GUI_App.cpp:735 msgid "Critical error" msgstr "Erro crítico" -#: src/slic3r/GUI/GUI_App.cpp:714 +#: src/slic3r/GUI/GUI_App.cpp:740 #, boost-format msgid "Internal error: %1%" msgstr "Erro interno: %1%" -#: src/slic3r/GUI/GUI_App.cpp:909 src/slic3r/GUI/GUI_App.cpp:1007 +#: src/slic3r/GUI/GUI_App.cpp:954 src/slic3r/GUI/GUI_App.cpp:1051 msgid "" "Error parsing PrusaSlicer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error. Your user profiles will " @@ -3387,7 +4598,7 @@ msgstr "" "Tente excluir manualmente o arquivo para recuperar do erro. Seus perfis de " "usuário não serão afetados." -#: src/slic3r/GUI/GUI_App.cpp:915 src/slic3r/GUI/GUI_App.cpp:1013 +#: src/slic3r/GUI/GUI_App.cpp:960 src/slic3r/GUI/GUI_App.cpp:1057 msgid "" "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error." @@ -3395,12 +4606,12 @@ msgstr "" "Erro de análise PrusaGCodeViewer, ele provavelmente está corrompido. Tente " "excluir manualmente o arquivo para recuperar do erro." -#: src/slic3r/GUI/GUI_App.cpp:962 +#: src/slic3r/GUI/GUI_App.cpp:1006 #, boost-format msgid "You are opening %1% version %2%." msgstr "Você está abrindo %1% versão %2%." -#: src/slic3r/GUI/GUI_App.cpp:965 +#: src/slic3r/GUI/GUI_App.cpp:1009 #, boost-format msgid "" "The active configuration was created by %1% %2%,\n" @@ -3419,7 +4630,7 @@ msgstr "" "Em caso afirmativo, será feito backup de sua configuração ativa antes de " "importar a nova configuração." -#: src/slic3r/GUI/GUI_App.cpp:973 +#: src/slic3r/GUI/GUI_App.cpp:1017 #, boost-format msgid "" "An existing configuration was found in %3%\n" @@ -3432,19 +4643,19 @@ msgstr "" "\n" "Esta configuração deve ser importada?" -#: src/slic3r/GUI/GUI_App.cpp:981 +#: src/slic3r/GUI/GUI_App.cpp:1025 msgid "Import" msgstr "Importar" -#: src/slic3r/GUI/GUI_App.cpp:982 +#: src/slic3r/GUI/GUI_App.cpp:1026 msgid "Don't import" msgstr "Não importar" -#: src/slic3r/GUI/GUI_App.cpp:990 +#: src/slic3r/GUI/GUI_App.cpp:1034 msgid "Continue and import newer configuration?" msgstr "Continuar e importar nova configuração?" -#: src/slic3r/GUI/GUI_App.cpp:1051 +#: src/slic3r/GUI/GUI_App.cpp:1095 msgid "" "You are running a 32 bit build of PrusaSlicer on 64-bit Windows.\n" "32 bit build of PrusaSlicer will likely not be able to utilize all the RAM " @@ -3461,7 +4672,7 @@ msgstr "" "www.prusa3d.cz/prusaslicer/.\n" "Você deseja continuar?" -#: src/slic3r/GUI/GUI_App.cpp:1134 +#: src/slic3r/GUI/GUI_App.cpp:1182 #, c-format, boost-format msgid "" "%s\n" @@ -3470,46 +4681,37 @@ msgstr "" "%s\n" "Você tem certeza que deseja continuar?" -#: src/slic3r/GUI/GUI_App.cpp:1136 src/slic3r/GUI/GUI_App.cpp:3101 -#: src/slic3r/GUI/Plater.cpp:1726 src/slic3r/GUI/UnsavedChangesDialog.cpp:889 +#: src/slic3r/GUI/GUI_App.cpp:1184 src/slic3r/GUI/GUI_App.cpp:3302 +#: src/slic3r/GUI/Plater.cpp:1736 src/slic3r/GUI/UnsavedChangesDialog.cpp:917 msgid "Remember my choice" msgstr "Lembrar minha escolha" -#: src/slic3r/GUI/GUI_App.cpp:1178 +#: src/slic3r/GUI/GUI_App.cpp:1226 msgid "Loading configuration" msgstr "Carregando configuração" -#: src/slic3r/GUI/GUI_App.cpp:1209 -#, boost-format -msgid "New release version %1% is available." -msgstr "Nova versão de lançamento %1% está disponível." - -#: src/slic3r/GUI/GUI_App.cpp:1210 -msgid "See Download page." -msgstr "Consulte a página de download." - -#: src/slic3r/GUI/GUI_App.cpp:1224 +#: src/slic3r/GUI/GUI_App.cpp:1257 #, boost-format msgid "New prerelease version %1% is available." msgstr "A nova versão de pré-lançamento %1% está disponível." -#: src/slic3r/GUI/GUI_App.cpp:1225 +#: src/slic3r/GUI/GUI_App.cpp:1258 msgid "See Releases page." msgstr "Ver página de lançamentos." -#: src/slic3r/GUI/GUI_App.cpp:1262 +#: src/slic3r/GUI/GUI_App.cpp:1313 msgid "Preparing settings tabs" msgstr "Preparando abas de configuração" -#: src/slic3r/GUI/GUI_App.cpp:1336 src/slic3r/GUI/Preferences.cpp:287 +#: src/slic3r/GUI/GUI_App.cpp:1393 src/slic3r/GUI/Preferences.cpp:405 msgid "Restore window position on start" msgstr "Restaurar a posição da janela ao iniciar" -#: src/slic3r/GUI/GUI_App.cpp:1338 +#: src/slic3r/GUI/GUI_App.cpp:1395 msgid "PrusaSlicer started after a crash" msgstr "PrusaSlicer iniciado após um acidente" -#: src/slic3r/GUI/GUI_App.cpp:1339 +#: src/slic3r/GUI/GUI_App.cpp:1396 #, boost-format msgid "" "PrusaSlicer crashed last time when attempting to set window position.\n" @@ -3532,24 +4734,24 @@ msgstr "" "\". Caso contrário, o aplicativo provavelmente travará novamente na próxima " "vez." -#: src/slic3r/GUI/GUI_App.cpp:1351 +#: src/slic3r/GUI/GUI_App.cpp:1408 #, boost-format msgid "Disable \"%1%\"" msgstr "Desabilitar \"%1%\"" -#: src/slic3r/GUI/GUI_App.cpp:1352 +#: src/slic3r/GUI/GUI_App.cpp:1409 #, boost-format msgid "Leave \"%1%\" enabled" msgstr "Manter \"%1%\" habilitado" -#: src/slic3r/GUI/GUI_App.cpp:1679 +#: src/slic3r/GUI/GUI_App.cpp:1780 msgid "" "You have the following presets with saved options for \"Print Host upload\"" msgstr "" "Você tem a seguinte predefinição com opções salvas para o \"Print Host upload" "\"" -#: src/slic3r/GUI/GUI_App.cpp:1683 +#: src/slic3r/GUI/GUI_App.cpp:1784 msgid "" "But since this version of PrusaSlicer we don't show this information in " "Printer Settings anymore.\n" @@ -3560,7 +4762,7 @@ msgstr "" "Agora essa informação vai ser exposta em configurações das impressoras " "físicas." -#: src/slic3r/GUI/GUI_App.cpp:1685 +#: src/slic3r/GUI/GUI_App.cpp:1786 msgid "" "By default new Printer devices will be named as \"Printer N\" during its " "creation.\n" @@ -3571,138 +4773,147 @@ msgstr "" "Nota: Esse nome pode ser alterado depois a partir das configurações de " "impressoras físicas" -#: src/slic3r/GUI/GUI_App.cpp:1689 src/slic3r/GUI/PhysicalPrinterDialog.cpp:726 +#: src/slic3r/GUI/GUI_App.cpp:1790 src/slic3r/GUI/PhysicalPrinterDialog.cpp:798 msgid "Information" msgstr "Informação" -#: src/slic3r/GUI/GUI_App.cpp:1702 src/slic3r/GUI/GUI_App.cpp:1713 +#: src/slic3r/GUI/GUI_App.cpp:1803 src/slic3r/GUI/GUI_App.cpp:1814 msgid "Recreating" msgstr "Recriando" -#: src/slic3r/GUI/GUI_App.cpp:1716 +#: src/slic3r/GUI/GUI_App.cpp:1817 msgid "Loading of current presets" msgstr "Carregando presets" -#: src/slic3r/GUI/GUI_App.cpp:1721 +#: src/slic3r/GUI/GUI_App.cpp:1822 msgid "Loading of a mode view" msgstr "Carregamento de um modelo de vista" -#: src/slic3r/GUI/GUI_App.cpp:1859 +#: src/slic3r/GUI/GUI_App.cpp:1961 msgid "Choose one file (3MF/AMF):" msgstr "Escolha um arquivo (3MF/AMF):" -#: src/slic3r/GUI/GUI_App.cpp:1871 +#: src/slic3r/GUI/GUI_App.cpp:1973 msgid "Choose one or more files (STL/3MF/STEP/OBJ/AMF/PRUSA):" msgstr "Escolha um ou mais arquivos (STL/3MF/STEP/OBJ/AMF/PRUSA):" -#: src/slic3r/GUI/GUI_App.cpp:1883 +#: src/slic3r/GUI/GUI_App.cpp:1984 +msgid "Choose ZIP file:" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1996 msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" msgstr "Escolha um arquivo (GCODE/.GCO/.G/.ngc/NGC):" -#: src/slic3r/GUI/GUI_App.cpp:1894 +#: src/slic3r/GUI/GUI_App.cpp:2007 msgid "Changing of an application language" msgstr "Alteração de um idioma do aplicativo" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Select the language" msgstr "Selecione o idioma" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Language" msgstr "Idioma" -#: src/slic3r/GUI/GUI_App.cpp:2182 -msgid "modified" -msgstr "modificado" +#: src/slic3r/GUI/GUI_App.cpp:2363 +msgid "" +"Simple mode supports manipulation with single-part object(s)\n" +"or object(s) with support modifiers only." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2365 +msgid "Please check your object list before mode changing." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2366 +msgid "Change application mode" +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2236 +#: src/slic3r/GUI/GUI_App.cpp:2397 #, c-format, boost-format msgid "Run %s" msgstr "Executar %s" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "&Configuration Snapshots" msgstr "&Captura das config" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "Inspect / activate configuration snapshots" msgstr "Inspecionar / ativar capturas de config" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Take Configuration &Snapshot" msgstr "Capturar &config" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Capture a configuration snapshot" msgstr "Capturar uma config" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for Configuration Updates" msgstr "Verificar atualizações de configuração" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for configuration updates" msgstr "Verificar atualizações de configuração" -#: src/slic3r/GUI/GUI_App.cpp:2249 +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for Application Updates" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for new version of application" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2411 msgid "&Preferences" msgstr "&Preferências" -#: src/slic3r/GUI/GUI_App.cpp:2255 +#: src/slic3r/GUI/GUI_App.cpp:2417 msgid "Application preferences" msgstr "Preferências de aplicação" -#: src/slic3r/GUI/GUI_App.cpp:2260 src/slic3r/GUI/wxExtensions.cpp:708 -msgid "Simple" -msgstr "Simples" - -#: src/slic3r/GUI/GUI_App.cpp:2260 +#: src/slic3r/GUI/GUI_App.cpp:2422 msgid "Simple View Mode" msgstr "Modo simples de visualização" -#: src/slic3r/GUI/GUI_App.cpp:2262 src/slic3r/GUI/wxExtensions.cpp:710 -msgctxt "Mode" -msgid "Advanced" -msgstr "Avançado" - -#: src/slic3r/GUI/GUI_App.cpp:2262 +#: src/slic3r/GUI/GUI_App.cpp:2424 msgid "Advanced View Mode" msgstr "Modo avançado de visualização" -#: src/slic3r/GUI/GUI_App.cpp:2263 src/slic3r/GUI/wxExtensions.cpp:711 -msgid "Expert" -msgstr "Especialista" - -#: src/slic3r/GUI/GUI_App.cpp:2263 +#: src/slic3r/GUI/GUI_App.cpp:2425 msgid "Expert View Mode" msgstr "Modo especialista de visualização" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 msgid "Mode" msgstr "Modo" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 #, c-format, boost-format msgid "%s View Mode" msgstr "%s Modo de visualização" -#: src/slic3r/GUI/GUI_App.cpp:2271 +#: src/slic3r/GUI/GUI_App.cpp:2433 msgid "&Language" msgstr "&Linguagem" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Flash Printer &Firmware" msgstr "Flash &Firmware de Impressora" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Upload a firmware image into an Arduino based printer" msgstr "Atualizar o firmware para uma impressora baseada em Arduino" -#: src/slic3r/GUI/GUI_App.cpp:2294 +#: src/slic3r/GUI/GUI_App.cpp:2459 msgid "Taking a configuration snapshot" msgstr "Tirando uma captura de configuração" -#: src/slic3r/GUI/GUI_App.cpp:2295 +#: src/slic3r/GUI/GUI_App.cpp:2460 msgid "" "Some presets are modified and the unsaved changes will not be captured by " "the configuration snapshot." @@ -3710,32 +4921,28 @@ msgstr "" "Algumas predefinições são modificadas e as alterações não salvas não serão " "capturadas pela captura de configuração." -#: src/slic3r/GUI/GUI_App.cpp:2296 +#: src/slic3r/GUI/GUI_App.cpp:2461 msgid "Snapshot name" msgstr "Nome da captura" -#: src/slic3r/GUI/GUI_App.cpp:2312 +#: src/slic3r/GUI/GUI_App.cpp:2477 msgid "Loading a configuration snapshot" msgstr "Carregando uma captura de configuração" -#: src/slic3r/GUI/GUI_App.cpp:2321 +#: src/slic3r/GUI/GUI_App.cpp:2486 #, boost-format msgid "Continue to activate a configuration snapshot %1%?" msgstr "Continuar a ativar uma captura de configuração %1%?" -#: src/slic3r/GUI/GUI_App.cpp:2335 +#: src/slic3r/GUI/GUI_App.cpp:2500 msgid "Failed to activate configuration snapshot." msgstr "Falha ao ativar a captura de configuração." -#: src/slic3r/GUI/GUI_App.cpp:2354 -msgid "Restart application" -msgstr "Reiniciar aplicação" - -#: src/slic3r/GUI/GUI_App.cpp:2388 +#: src/slic3r/GUI/GUI_App.cpp:2520 msgid "Language selection" msgstr "Seleção de linguagem" -#: src/slic3r/GUI/GUI_App.cpp:2391 +#: src/slic3r/GUI/GUI_App.cpp:2523 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." @@ -3743,87 +4950,101 @@ msgstr "" "Alterar a linguagem fará com que o aplicativo reinicie.\n" "Você irá perder conteúdo na bandeja." -#: src/slic3r/GUI/GUI_App.cpp:2393 src/slic3r/GUI/Preferences.cpp:582 +#: src/slic3r/GUI/GUI_App.cpp:2525 src/slic3r/GUI/Preferences.cpp:730 +#: src/slic3r/GUI/Selection.cpp:1695 msgid "Do you want to proceed?" msgstr "Você quer prosseguir?" -#: src/slic3r/GUI/GUI_App.cpp:2420 +#: src/slic3r/GUI/GUI_App.cpp:2552 msgid "&Configuration" msgstr "&Configuração" -#: src/slic3r/GUI/GUI_App.cpp:2534 src/slic3r/GUI/GUI_App.cpp:2595 -msgid "The preset modifications are successfully saved" -msgid_plural "The presets modifications are successfully saved" -msgstr[0] "As modificações da predefinição foram salvas com sucesso" -msgstr[1] "As modificações das predefinições foram salvas com sucesso" +#: src/slic3r/GUI/GUI_App.cpp:2560 +msgid "Restart application" +msgstr "Reiniciar aplicação" -#: src/slic3r/GUI/GUI_App.cpp:2598 +#: src/slic3r/GUI/GUI_App.cpp:2726 msgid "For new project all modifications will be reseted" msgstr "Para novo projeto, todas as modificações serão redefinidas" -#: src/slic3r/GUI/GUI_App.cpp:2636 +#: src/slic3r/GUI/GUI_App.cpp:2764 msgid "Loading a new project while the current project is modified." msgstr "Carregando um novo projeto enquanto o projeto atual é modificado." -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Project is loading" msgstr "Projeto está carregando" -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Opening new project while some presets are unsaved." msgstr "Abrindo novo projeto enquanto algumas predefinições não são salvas." -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "The uploads are still ongoing" msgstr "Os uploads ainda estão em andamento" -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "Stop them and continue anyway?" msgstr "Pará-los e continuar assim mesmo?" -#: src/slic3r/GUI/GUI_App.cpp:2662 +#: src/slic3r/GUI/GUI_App.cpp:2790 msgid "Ongoing uploads" msgstr "Uploads em andamento" -#: src/slic3r/GUI/GUI_App.cpp:2876 -msgid "It's impossible to print multi-part object(s) with SLA technology." +#: src/slic3r/GUI/GUI_App.cpp:3026 +msgid "" +"It's impossible to print object(s) which contains parameter modifiers with " +"SLA technology." msgstr "" -"É impossível imprimir objetos com múltiplas partes com a tecnologia SLA." -#: src/slic3r/GUI/GUI_App.cpp:2877 src/slic3r/GUI/Jobs/SLAImportJob.cpp:235 -#: src/slic3r/GUI/Plater.cpp:2459 +#: src/slic3r/GUI/GUI_App.cpp:3027 src/slic3r/GUI/Jobs/SLAImportJob.cpp:149 +#: src/slic3r/GUI/Plater.cpp:2536 msgid "Please check your object list before preset changing." msgstr "Verifique a lista de objetos antes de alterar a predefinição." -#: src/slic3r/GUI/GUI_App.cpp:2901 +#: src/slic3r/GUI/GUI_App.cpp:3070 msgid "Configuration is editing from ConfigWizard" msgstr "A configuração está editando do ConfigWizard" -#: src/slic3r/GUI/GUI_App.cpp:2926 +#: src/slic3r/GUI/GUI_App.cpp:3088 +#, boost-format +msgid "Welcome to %1% version %2%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3090 +#, boost-format +msgid "" +"Do you wish to register downloads from Printables.com\n" +"for this %1% %2% executable?\n" +"\n" +"Downloads can be registered for only 1 executable at time." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3118 msgid "Select a gcode file:" msgstr "Selecione um arquivo gcode:" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "Open hyperlink in default browser?" msgstr "Abrir link no navegador padrão?" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "PrusaSlicer: Open hyperlink" msgstr "PrusaSlicer: Abrir link" -#: src/slic3r/GUI/GUI_App.cpp:3105 src/slic3r/GUI/Preferences.cpp:382 +#: src/slic3r/GUI/GUI_App.cpp:3306 src/slic3r/GUI/Preferences.cpp:593 msgid "Suppress to open hyperlink in browser" msgstr "Suprimir para abrir o link no navegador" -#: src/slic3r/GUI/GUI_App.cpp:3107 src/slic3r/GUI/Plater.cpp:1732 +#: src/slic3r/GUI/GUI_App.cpp:3308 src/slic3r/GUI/Plater.cpp:1742 msgid "PrusaSlicer will remember your choice." msgstr "PrusaSlicer lembrará de sua escolha." -#: src/slic3r/GUI/GUI_App.cpp:3108 +#: src/slic3r/GUI/GUI_App.cpp:3309 msgid "You will not be asked about it again on hyperlinks hovering." msgstr "Você não será questionado sobre isso novamente em links suspensos." -#: src/slic3r/GUI/GUI_App.cpp:3109 src/slic3r/GUI/Plater.cpp:1736 +#: src/slic3r/GUI/GUI_App.cpp:3310 src/slic3r/GUI/Plater.cpp:1746 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" @@ -3832,57 +5053,71 @@ msgstr "" "Visite \"Preferências\" e marque \"%1%\"\n" "para mudar sua escolha." -#: src/slic3r/GUI/GUI_App.cpp:3111 src/slic3r/GUI/Plater.cpp:1738 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:906 +#: src/slic3r/GUI/GUI_App.cpp:3312 src/slic3r/GUI/Plater.cpp:1748 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:934 msgid "PrusaSlicer: Don't ask me again" msgstr "PrusaSlicer: Não me pergunte de novo" -#: src/slic3r/GUI/GUI_Init.cpp:57 src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_App.cpp:3386 +msgid "Check for application update has failed." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3387 +#, boost-format +msgid "No new version is available. Latest release version is %1%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3458 +msgid "Download of new version is already ongoing. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/GUI_Init.cpp:64 src/slic3r/GUI/GUI_Init.cpp:67 msgid "PrusaSlicer GUI initialization failed" msgstr "Inicialização do PrusaSlicer GUI falhou" -#: src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_Init.cpp:67 #, boost-format msgid "Fatal error, exception catched: %1%" msgstr "Erro Fatal, exceção capturada: %1%" #: src/slic3r/GUI/GUI_Factories.cpp:54 src/slic3r/GUI/GUI_Factories.cpp:127 -#: src/libslic3r/PrintConfig.cpp:287 src/libslic3r/PrintConfig.cpp:404 -#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:456 -#: src/libslic3r/PrintConfig.cpp:708 src/libslic3r/PrintConfig.cpp:778 -#: src/libslic3r/PrintConfig.cpp:786 src/libslic3r/PrintConfig.cpp:1232 -#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1563 -#: src/libslic3r/PrintConfig.cpp:1955 src/libslic3r/PrintConfig.cpp:2030 -#: src/libslic3r/PrintConfig.cpp:2264 src/libslic3r/PrintConfig.cpp:2850 -#: src/libslic3r/PrintConfig.cpp:2858 src/libslic3r/PrintConfig.cpp:2918 -#: src/libslic3r/PrintConfig.cpp:2927 src/libslic3r/PrintConfig.cpp:3098 +#: src/libslic3r/PrintConfig.cpp:300 src/libslic3r/PrintConfig.cpp:423 +#: src/libslic3r/PrintConfig.cpp:466 src/libslic3r/PrintConfig.cpp:475 +#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:872 +#: src/libslic3r/PrintConfig.cpp:881 src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1376 src/libslic3r/PrintConfig.cpp:1604 +#: src/libslic3r/PrintConfig.cpp:1985 src/libslic3r/PrintConfig.cpp:2060 +#: src/libslic3r/PrintConfig.cpp:2294 src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:2946 src/libslic3r/PrintConfig.cpp:3006 +#: src/libslic3r/PrintConfig.cpp:3015 src/libslic3r/PrintConfig.cpp:3186 msgid "Layers and Perimeters" msgstr "Camadas e perímetros" #: src/slic3r/GUI/GUI_Factories.cpp:56 src/slic3r/GUI/GUI_Factories.cpp:131 -#: src/slic3r/GUI/GUI_Preview.cpp:249 src/slic3r/GUI/Tab.cpp:1547 -#: src/slic3r/GUI/Tab.cpp:1549 src/libslic3r/ExtrusionEntity.cpp:340 -#: src/libslic3r/ExtrusionEntity.cpp:372 src/libslic3r/PrintConfig.cpp:670 -#: src/libslic3r/PrintConfig.cpp:2095 src/libslic3r/PrintConfig.cpp:2104 -#: src/libslic3r/PrintConfig.cpp:2113 src/libslic3r/PrintConfig.cpp:2123 -#: src/libslic3r/PrintConfig.cpp:2132 src/libslic3r/PrintConfig.cpp:2554 -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2568 -#: src/libslic3r/PrintConfig.cpp:2581 src/libslic3r/PrintConfig.cpp:2591 -#: src/libslic3r/PrintConfig.cpp:2599 src/libslic3r/PrintConfig.cpp:2617 -#: src/libslic3r/PrintConfig.cpp:2634 src/libslic3r/PrintConfig.cpp:2655 -#: src/libslic3r/PrintConfig.cpp:2668 src/libslic3r/PrintConfig.cpp:2685 -#: src/libslic3r/PrintConfig.cpp:2703 src/libslic3r/PrintConfig.cpp:2718 -#: src/libslic3r/PrintConfig.cpp:2728 src/libslic3r/PrintConfig.cpp:2737 -#: src/libslic3r/PrintConfig.cpp:2748 src/libslic3r/PrintConfig.cpp:2762 -#: src/libslic3r/PrintConfig.cpp:2778 src/libslic3r/PrintConfig.cpp:2786 -#: src/libslic3r/PrintConfig.cpp:2787 src/libslic3r/PrintConfig.cpp:2796 -#: src/libslic3r/PrintConfig.cpp:2810 src/libslic3r/PrintConfig.cpp:2818 -#: src/libslic3r/PrintConfig.cpp:2832 +#: src/slic3r/GUI/Tab.cpp:1494 src/slic3r/GUI/Tab.cpp:1496 +#: src/libslic3r/PrintConfig.cpp:773 src/libslic3r/PrintConfig.cpp:2125 +#: src/libslic3r/PrintConfig.cpp:2134 src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2153 src/libslic3r/PrintConfig.cpp:2162 +#: src/libslic3r/PrintConfig.cpp:2584 src/libslic3r/PrintConfig.cpp:2590 +#: src/libslic3r/PrintConfig.cpp:2598 src/libslic3r/PrintConfig.cpp:2611 +#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2628 +#: src/libslic3r/PrintConfig.cpp:2644 src/libslic3r/PrintConfig.cpp:2660 +#: src/libslic3r/PrintConfig.cpp:2681 src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2725 +#: src/libslic3r/PrintConfig.cpp:2743 src/libslic3r/PrintConfig.cpp:2753 +#: src/libslic3r/PrintConfig.cpp:2762 src/libslic3r/PrintConfig.cpp:2773 +#: src/libslic3r/PrintConfig.cpp:2785 src/libslic3r/PrintConfig.cpp:2799 +#: src/libslic3r/PrintConfig.cpp:2807 src/libslic3r/PrintConfig.cpp:2808 +#: src/libslic3r/PrintConfig.cpp:2817 src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2840 src/libslic3r/PrintConfig.cpp:2854 +#: src/libslic3r/PrintConfig.cpp:2862 src/libslic3r/PrintConfig.cpp:2873 +#: src/libslic3r/PrintConfig.cpp:2884 src/libslic3r/PrintConfig.cpp:2893 +#: src/libslic3r/PrintConfig.cpp:2903 src/libslic3r/PrintConfig.cpp:2915 msgid "Support material" msgstr "Material de suporte" #: src/slic3r/GUI/GUI_Factories.cpp:59 src/slic3r/GUI/GUI_Factories.cpp:135 -#: src/libslic3r/PrintConfig.cpp:3054 src/libslic3r/PrintConfig.cpp:3062 +#: src/libslic3r/PrintConfig.cpp:3142 src/libslic3r/PrintConfig.cpp:3150 msgid "Wipe options" msgstr "Opções de limpeza" @@ -3890,330 +5125,351 @@ msgstr "Opções de limpeza" msgid "Pad and Support" msgstr "Bloco e suporte" -#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/GUI_Preview.cpp:245 -#: src/slic3r/GUI/Tab.cpp:1513 src/libslic3r/ExtrusionEntity.cpp:336 -#: src/libslic3r/ExtrusionEntity.cpp:364 src/libslic3r/PrintConfig.cpp:1579 -#: src/libslic3r/PrintConfig.cpp:1585 src/libslic3r/PrintConfig.cpp:1599 -#: src/libslic3r/PrintConfig.cpp:1609 src/libslic3r/PrintConfig.cpp:1617 -#: src/libslic3r/PrintConfig.cpp:1619 +#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/Tab.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1620 src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1638 src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1656 src/libslic3r/PrintConfig.cpp:1658 msgid "Ironing" msgstr "Passar ferro" -#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1283 -#: src/libslic3r/PrintConfig.cpp:1284 src/libslic3r/PrintConfig.cpp:1299 -#: src/libslic3r/PrintConfig.cpp:1309 +#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1344 src/libslic3r/PrintConfig.cpp:1356 +#: src/libslic3r/PrintConfig.cpp:1366 msgid "Fuzzy Skin" msgstr "Pele Difusa" -#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/GUI_Preview.cpp:220 -#: src/slic3r/GUI/Tab.cpp:1581 src/libslic3r/PrintConfig.cpp:507 -#: src/libslic3r/PrintConfig.cpp:766 src/libslic3r/PrintConfig.cpp:1326 -#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1618 -#: src/libslic3r/PrintConfig.cpp:2020 src/libslic3r/PrintConfig.cpp:2352 -#: src/libslic3r/PrintConfig.cpp:2405 src/libslic3r/PrintConfig.cpp:2903 +#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/Tab.cpp:1536 +#: src/libslic3r/PrintConfig.cpp:526 src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:548 src/libslic3r/PrintConfig.cpp:557 +#: src/libslic3r/PrintConfig.cpp:566 src/libslic3r/PrintConfig.cpp:575 +#: src/libslic3r/PrintConfig.cpp:852 src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1657 +#: src/libslic3r/PrintConfig.cpp:2050 src/libslic3r/PrintConfig.cpp:2383 +#: src/libslic3r/PrintConfig.cpp:2436 src/libslic3r/PrintConfig.cpp:2991 msgid "Speed" msgstr "Velocidade" -#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1623 -#: src/slic3r/GUI/Tab.cpp:2304 src/libslic3r/PrintConfig.cpp:796 -#: src/libslic3r/PrintConfig.cpp:1489 src/libslic3r/PrintConfig.cpp:1997 -#: src/libslic3r/PrintConfig.cpp:2373 src/libslic3r/PrintConfig.cpp:2647 -#: src/libslic3r/PrintConfig.cpp:2675 +#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1585 +#: src/slic3r/GUI/Tab.cpp:2288 src/libslic3r/PrintConfig.cpp:889 +#: src/libslic3r/PrintConfig.cpp:1530 src/libslic3r/PrintConfig.cpp:2027 +#: src/libslic3r/PrintConfig.cpp:2404 src/libslic3r/PrintConfig.cpp:2673 +#: src/libslic3r/PrintConfig.cpp:2701 msgid "Extruders" msgstr "Exrtrusoras" -#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:754 -#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:1218 -#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:2006 -#: src/libslic3r/PrintConfig.cpp:2393 src/libslic3r/PrintConfig.cpp:2656 -#: src/libslic3r/PrintConfig.cpp:2890 +#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:840 +#: src/libslic3r/PrintConfig.cpp:953 src/libslic3r/PrintConfig.cpp:1278 +#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:2036 +#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2682 +#: src/libslic3r/PrintConfig.cpp:2978 msgid "Extrusion Width" msgstr "Espessura da extrusão" -#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1533 -#: src/libslic3r/PrintConfig.cpp:517 src/libslic3r/PrintConfig.cpp:528 -#: src/libslic3r/PrintConfig.cpp:544 +#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:631 src/libslic3r/PrintConfig.cpp:642 +#: src/libslic3r/PrintConfig.cpp:655 msgid "Skirt and brim" msgstr "Saia e aba" -#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 -#: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1645 -#: src/slic3r/GUI/Tab.cpp:1649 src/slic3r/GUI/Tab.cpp:2031 -#: src/slic3r/GUI/Tab.cpp:2402 src/slic3r/GUI/Tab.cpp:4729 -#: src/libslic3r/PrintConfig.cpp:260 src/libslic3r/PrintConfig.cpp:495 -#: src/libslic3r/PrintConfig.cpp:1438 src/libslic3r/PrintConfig.cpp:1525 -#: src/libslic3r/PrintConfig.cpp:1572 src/libslic3r/PrintConfig.cpp:2530 -#: src/libslic3r/PrintConfig.cpp:2540 src/libslic3r/PrintConfig.cpp:3078 -#: src/libslic3r/PrintConfig.cpp:3113 src/libslic3r/PrintConfig.cpp:3124 -#: src/libslic3r/PrintConfig.cpp:3139 src/libslic3r/PrintConfig.cpp:3152 -#: src/libslic3r/PrintConfig.cpp:3161 src/libslic3r/PrintConfig.cpp:3173 -#: src/libslic3r/PrintConfig.cpp:3370 -msgid "Advanced" -msgstr "Avançado" - -#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4663 src/slic3r/GUI/Tab.cpp:4664 -#: src/libslic3r/PrintConfig.cpp:3564 src/libslic3r/PrintConfig.cpp:3571 -#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3589 -#: src/libslic3r/PrintConfig.cpp:3599 src/libslic3r/PrintConfig.cpp:3609 -#: src/libslic3r/PrintConfig.cpp:3646 src/libslic3r/PrintConfig.cpp:3653 -#: src/libslic3r/PrintConfig.cpp:3664 src/libslic3r/PrintConfig.cpp:3674 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3696 -#: src/libslic3r/PrintConfig.cpp:3706 src/libslic3r/PrintConfig.cpp:3715 -#: src/libslic3r/PrintConfig.cpp:3725 src/libslic3r/PrintConfig.cpp:3736 -#: src/libslic3r/PrintConfig.cpp:3744 +#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Tab.cpp:4946 src/slic3r/GUI/Tab.cpp:4948 +#: src/libslic3r/PrintConfig.cpp:3328 src/libslic3r/PrintConfig.cpp:3337 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3356 +#: src/libslic3r/PrintConfig.cpp:3366 src/libslic3r/PrintConfig.cpp:3387 +#: src/libslic3r/PrintConfig.cpp:3410 src/libslic3r/PrintConfig.cpp:3417 +#: src/libslic3r/PrintConfig.cpp:3432 src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3464 +#: src/libslic3r/PrintConfig.cpp:3474 src/libslic3r/PrintConfig.cpp:3488 +#: src/libslic3r/PrintConfig.cpp:3498 src/libslic3r/PrintConfig.cpp:3841 +#: src/libslic3r/PrintConfig.cpp:3861 src/libslic3r/PrintConfig.cpp:3868 +#: src/libslic3r/PrintConfig.cpp:3876 msgid "Supports" msgstr "Suportes" -#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4704 src/slic3r/GUI/Tab.cpp:4705 -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3752 -#: src/libslic3r/PrintConfig.cpp:3759 src/libslic3r/PrintConfig.cpp:3773 -#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3794 -#: src/libslic3r/PrintConfig.cpp:3816 src/libslic3r/PrintConfig.cpp:3827 -#: src/libslic3r/PrintConfig.cpp:3834 src/libslic3r/PrintConfig.cpp:3841 -#: src/libslic3r/PrintConfig.cpp:3852 src/libslic3r/PrintConfig.cpp:3861 -#: src/libslic3r/PrintConfig.cpp:3870 +#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:590 +#: src/slic3r/GUI/Tab.cpp:4960 src/slic3r/GUI/Tab.cpp:4961 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3884 +#: src/libslic3r/PrintConfig.cpp:3891 src/libslic3r/PrintConfig.cpp:3905 +#: src/libslic3r/PrintConfig.cpp:3916 src/libslic3r/PrintConfig.cpp:3926 +#: src/libslic3r/PrintConfig.cpp:3948 src/libslic3r/PrintConfig.cpp:3959 +#: src/libslic3r/PrintConfig.cpp:3966 src/libslic3r/PrintConfig.cpp:3973 +#: src/libslic3r/PrintConfig.cpp:3984 src/libslic3r/PrintConfig.cpp:3993 +#: src/libslic3r/PrintConfig.cpp:4002 msgid "Pad" msgstr "Bloco" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4722 -#: src/slic3r/GUI/Tab.cpp:4723 src/libslic3r/SLA/Hollowing.cpp:73 -#: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3880 -#: src/libslic3r/PrintConfig.cpp:3887 src/libslic3r/PrintConfig.cpp:3897 -#: src/libslic3r/PrintConfig.cpp:3906 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4978 +#: src/slic3r/GUI/Tab.cpp:4979 src/libslic3r/SLA/Hollowing.cpp:86 +#: src/libslic3r/SLA/Hollowing.cpp:91 src/libslic3r/SLA/Hollowing.cpp:106 +#: src/libslic3r/SLA/Hollowing.cpp:115 src/libslic3r/PrintConfig.cpp:4012 +#: src/libslic3r/PrintConfig.cpp:4019 src/libslic3r/PrintConfig.cpp:4029 +#: src/libslic3r/PrintConfig.cpp:4038 msgid "Hollowing" msgstr "Deixar oco" -#: src/slic3r/GUI/GUI_Factories.cpp:160 +#: src/slic3r/GUI/GUI_Factories.cpp:159 msgid "Add part" msgstr "Adicionar parte" -#: src/slic3r/GUI/GUI_Factories.cpp:161 +#: src/slic3r/GUI/GUI_Factories.cpp:160 msgid "Add negative volume" msgstr "Adicionar volume negativo" -#: src/slic3r/GUI/GUI_Factories.cpp:162 +#: src/slic3r/GUI/GUI_Factories.cpp:161 msgid "Add modifier" msgstr "Adicionar modificador" -#: src/slic3r/GUI/GUI_Factories.cpp:163 +#: src/slic3r/GUI/GUI_Factories.cpp:162 msgid "Add support blocker" msgstr "Adicionar bloqueador de suporte" -#: src/slic3r/GUI/GUI_Factories.cpp:164 +#: src/slic3r/GUI/GUI_Factories.cpp:163 msgid "Add support enforcer" msgstr "Adicionar reforço de suporte" -#: src/slic3r/GUI/GUI_Factories.cpp:300 +#: src/slic3r/GUI/GUI_Factories.cpp:169 +msgid "Add text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:170 +msgid "Add negative text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:171 +msgid "Add text modifier" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:307 msgid "Select showing settings" msgstr "Selecionar config. mostradas" -#: src/slic3r/GUI/GUI_Factories.cpp:407 src/slic3r/GUI/GUI_Factories.cpp:412 -#: src/slic3r/GUI/GUI_Factories.cpp:556 src/slic3r/GUI/GUI_Factories.cpp:562 +#: src/slic3r/GUI/GUI_Factories.cpp:414 src/slic3r/GUI/GUI_Factories.cpp:419 +#: src/slic3r/GUI/GUI_Factories.cpp:625 src/slic3r/GUI/GUI_Factories.cpp:631 #, c-format, boost-format msgid "Quick Add Settings (%s)" msgstr "Adicionar config. rapidamente (%s)" -#: src/slic3r/GUI/GUI_Factories.cpp:444 +#: src/slic3r/GUI/GUI_Factories.cpp:460 msgid "Remove the selected object" msgstr "Remover o objeto selecionado" -#: src/slic3r/GUI/GUI_Factories.cpp:456 +#: src/slic3r/GUI/GUI_Factories.cpp:475 msgid "Load" msgstr "Carregar" -#: src/slic3r/GUI/GUI_Factories.cpp:461 src/slic3r/GUI/GUI_Factories.cpp:501 -#: src/slic3r/GUI/GUI_Factories.cpp:505 +#: src/slic3r/GUI/GUI_Factories.cpp:481 src/slic3r/GUI/GUI_Factories.cpp:566 +#: src/slic3r/GUI/GUI_Factories.cpp:570 msgid "Box" msgstr "Caixa" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Cylinder" msgstr "Cilindro" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Slab" msgstr "Placa" -#: src/slic3r/GUI/GUI_Factories.cpp:471 +#: src/slic3r/GUI/GUI_Factories.cpp:493 msgid "Gallery" msgstr "Galeria" -#: src/slic3r/GUI/GUI_Factories.cpp:488 src/slic3r/GUI/GUI_Factories.cpp:526 +#: src/slic3r/GUI/GUI_Factories.cpp:529 src/slic3r/GUI/GUI_Factories.cpp:549 +#: src/slic3r/GUI/GUI_ObjectList.cpp:660 +msgid "Text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:555 src/slic3r/GUI/GUI_Factories.cpp:558 +#: src/slic3r/GUI/GUI_Factories.cpp:595 msgid "Height range Modifier" msgstr "Modificador de intervalo de altura" -#: src/slic3r/GUI/GUI_Factories.cpp:535 +#: src/slic3r/GUI/GUI_Factories.cpp:604 msgid "Add settings" msgstr "Adicionar config" -#: src/slic3r/GUI/GUI_Factories.cpp:626 +#: src/slic3r/GUI/GUI_Factories.cpp:695 msgid "Change type" msgstr "Mudar o tipo" -#: src/slic3r/GUI/GUI_Factories.cpp:636 src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:705 src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Object" msgstr "Configurar como objeto separado" -#: src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Objects" msgstr "Definir como objetos separados" -#: src/slic3r/GUI/GUI_Factories.cpp:658 +#: src/slic3r/GUI/GUI_Factories.cpp:727 msgid "Printable" msgstr "Imprimível" -#: src/slic3r/GUI/GUI_Factories.cpp:686 +#: src/slic3r/GUI/GUI_Factories.cpp:755 src/slic3r/GUI/GUI_ObjectList.cpp:2070 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2582 +msgid "Invalidate cut info" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:770 msgid "Rename" msgstr "Renomear" -#: src/slic3r/GUI/GUI_Factories.cpp:696 +#: src/slic3r/GUI/GUI_Factories.cpp:780 msgid "Fix through the Netfabb" msgstr "Arrumar através do Netfabb" -#: src/slic3r/GUI/GUI_Factories.cpp:715 -msgid "Export as STL" -msgstr "Exportar como STL" +#: src/slic3r/GUI/GUI_Factories.cpp:799 +msgid "Export as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:726 +#: src/slic3r/GUI/GUI_Factories.cpp:810 msgid "Reload the selected volumes from disk" msgstr "Recarregue os volumes selecionados do disco" -#: src/slic3r/GUI/GUI_Factories.cpp:733 src/slic3r/GUI/Plater.cpp:3568 +#: src/slic3r/GUI/GUI_Factories.cpp:817 src/slic3r/GUI/Plater.cpp:3602 msgid "Replace with STL" msgstr "Substituir por STL" -#: src/slic3r/GUI/GUI_Factories.cpp:733 +#: src/slic3r/GUI/GUI_Factories.cpp:817 msgid "Replace the selected volume with new STL" msgstr "Substitua o volume selecionado por um novo STL" -#: src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Set extruder for selected items" msgstr "Definir extrusora para itens selecionados" -#: src/slic3r/GUI/GUI_Factories.cpp:778 src/slic3r/Utils/Repetier.cpp:126 -#: src/slic3r/Utils/Repetier.cpp:209 src/libslic3r/PrintConfig.cpp:635 -#: src/libslic3r/PrintConfig.cpp:2770 +#: src/slic3r/GUI/GUI_Factories.cpp:862 src/slic3r/Utils/Repetier.cpp:145 +#: src/slic3r/Utils/Repetier.cpp:226 src/libslic3r/PrintConfig.cpp:738 +#: src/libslic3r/PrintConfig.cpp:2790 src/libslic3r/PrintConfig.cpp:3851 msgid "Default" msgstr "Padrão" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale to print volume" msgstr "Escalar para volume de impressão" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale the selected object to fit the print volume" msgstr "Escale o objeto selecionado para se adequar ao volume de impressão" -#: src/slic3r/GUI/GUI_Factories.cpp:835 src/slic3r/GUI/Plater.cpp:5655 +#: src/slic3r/GUI/GUI_Factories.cpp:921 src/slic3r/GUI/Plater.cpp:6213 msgid "Convert from imperial units" msgstr "Converter de unidades imperiais" -#: src/slic3r/GUI/GUI_Factories.cpp:836 src/slic3r/GUI/Plater.cpp:5656 +#: src/slic3r/GUI/GUI_Factories.cpp:922 src/slic3r/GUI/Plater.cpp:6214 msgid "Revert conversion from imperial units" msgstr "Reverter conversão de unidades imperiais" -#: src/slic3r/GUI/GUI_Factories.cpp:837 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:923 src/slic3r/GUI/Plater.cpp:6215 msgid "Convert from meters" msgstr "Converter de metros" -#: src/slic3r/GUI/GUI_Factories.cpp:838 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:924 src/slic3r/GUI/Plater.cpp:6215 msgid "Revert conversion from meters" msgstr "Reverter conversão de metros" -#: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2135 -#: src/libslic3r/PrintConfig.cpp:4523 +#: src/slic3r/GUI/GUI_Factories.cpp:945 src/slic3r/GUI/GUI_ObjectList.cpp:2290 +#: src/libslic3r/PrintConfig.cpp:4689 msgid "Merge" msgstr "Mesclar" -#: src/slic3r/GUI/GUI_Factories.cpp:859 +#: src/slic3r/GUI/GUI_Factories.cpp:945 msgid "Merge objects to the one multipart object" msgstr "Mesclar objetos para um objeto multiparte" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Along X axis" msgstr "Ao longo do eixo X" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Mirror the selected object along the X axis" msgstr "Espelhar o objeto selecionado ao longo do eixo X" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Along Y axis" msgstr "Ao longo do eixo Y" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Mirror the selected object along the Y axis" msgstr "Espelhar o objeto selecionado ao longo do eixo Y" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Along Z axis" msgstr "Ao longo do eixo Z" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Mirror the selected object along the Z axis" msgstr "Espelhar o objeto selecionado ao longo do eixo Z" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror" msgstr "Espelhar" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror the selected object" msgstr "Espelhar o objeto selecionado" -#: src/slic3r/GUI/GUI_Factories.cpp:901 src/slic3r/GUI/GUI_ObjectList.cpp:1696 +#: src/slic3r/GUI/GUI_Factories.cpp:977 +msgid "Edit text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:999 +msgid "Ability to change text, font, size, ..." +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1021 src/slic3r/GUI/GUI_ObjectList.cpp:1793 msgid "Add Shape" msgstr "Adicionar forma" -#: src/slic3r/GUI/GUI_Factories.cpp:937 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "To objects" msgstr "Para objetos" -#: src/slic3r/GUI/GUI_Factories.cpp:937 src/slic3r/GUI/GUI_Factories.cpp:954 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "Split the selected object into individual objects" msgstr "Dividir o objeto selecionado em objetos individuais" -#: src/slic3r/GUI/GUI_Factories.cpp:940 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 msgid "To parts" msgstr "Para peças" -#: src/slic3r/GUI/GUI_Factories.cpp:940 src/slic3r/GUI/GUI_Factories.cpp:975 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 src/slic3r/GUI/GUI_Factories.cpp:1097 msgid "Split the selected object into individual parts" msgstr "Dividir o objeto selecionado em partes individuais" -#: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4552 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 src/slic3r/GUI/GUI_Factories.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:4718 msgid "Split" msgstr "Dividir" -#: src/slic3r/GUI/GUI_Factories.cpp:944 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 msgid "Split the selected object" msgstr "Dividir o objeto selecionado" -#: src/slic3r/GUI/GUI_Factories.cpp:1084 +#: src/slic3r/GUI/GUI_Factories.cpp:1225 src/slic3r/GUI/GUI_Factories.cpp:1243 +msgid "Set number of instances" +msgstr "Definir o número de instâncias" + +#: src/slic3r/GUI/GUI_Factories.cpp:1225 +msgid "Change the number of instances of the selected objects" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1237 msgid "Add one more instance of the selected object" msgstr "Adicionar mais uma instância do objeto selecionado" -#: src/slic3r/GUI/GUI_Factories.cpp:1087 +#: src/slic3r/GUI/GUI_Factories.cpp:1240 msgid "Remove one instance of the selected object" msgstr "Remover uma instância do objeto selecionado" -#: src/slic3r/GUI/GUI_Factories.cpp:1090 -msgid "Set number of instances" -msgstr "Definir o número de instâncias" - -#: src/slic3r/GUI/GUI_Factories.cpp:1090 +#: src/slic3r/GUI/GUI_Factories.cpp:1243 msgid "Change the number of instances of the selected object" msgstr "Alterar o número de instâncias do objeto selecionado" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill bed with instances" msgstr "Preencher mesa com instancias" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill the remaining area of bed with instances of the selected object" msgstr "" "Preencher o restante da área da mesa com instancias do objeto selecionado" @@ -4234,301 +5490,349 @@ msgstr "Remover limite da camada" msgid "Add layer range" msgstr "Adicionar limite da camada" -#: src/slic3r/GUI/GUI_ObjectList.cpp:297 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:323 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 msgid "Name" msgstr "Nome" -#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:480 +#: src/slic3r/GUI/GUI_ObjectList.cpp:342 src/slic3r/GUI/GUI_ObjectList.cpp:513 msgid "Editing" msgstr "Edição" -#: src/slic3r/GUI/GUI_ObjectList.cpp:400 +#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +msgid "Wrong volume index " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:433 msgid "No errors detected" msgstr "Sem erros detectados" -#: src/slic3r/GUI/GUI_ObjectList.cpp:409 +#: src/slic3r/GUI/GUI_ObjectList.cpp:442 #, c-format, boost-format msgid "Auto-repaired %1$d error" msgid_plural "Auto-repaired %1$d errors" msgstr[0] "Erro %1$d reparado automaticamente" msgstr[1] "Erros %1$d corrigidos automaticamente" -#: src/slic3r/GUI/GUI_ObjectList.cpp:415 +#: src/slic3r/GUI/GUI_ObjectList.cpp:448 #, c-format, boost-format msgid "%1$d degenerate facet" msgid_plural "%1$d degenerate facets" msgstr[0] "%1$d face degenerada" msgstr[1] "%1$d faces degeneradas" -#: src/slic3r/GUI/GUI_ObjectList.cpp:417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:450 #, c-format, boost-format msgid "%1$d edge fixed" msgid_plural "%1$d edges fixed" msgstr[0] "%1$d borda corrigida" msgstr[1] "%1$d bordas corrigidas" -#: src/slic3r/GUI/GUI_ObjectList.cpp:419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:452 #, c-format, boost-format msgid "%1$d facet removed" msgid_plural "%1$d facets removed" msgstr[0] "%1$d face removida" msgstr[1] "%1$d faces removidas" -#: src/slic3r/GUI/GUI_ObjectList.cpp:421 +#: src/slic3r/GUI/GUI_ObjectList.cpp:454 #, c-format, boost-format msgid "%1$d facet reversed" msgid_plural "%1$d facets reversed" msgstr[0] "%1$d face revertida" msgstr[1] "%1$d faces invertidas" -#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +#: src/slic3r/GUI/GUI_ObjectList.cpp:456 #, c-format, boost-format msgid "%1$d backward edge" msgid_plural "%1$d backward edges" msgstr[0] "%1$d borda invertida" msgstr[1] "%1$d bordas invertidas" -#: src/slic3r/GUI/GUI_ObjectList.cpp:426 src/slic3r/GUI/GUI_ObjectList.cpp:429 +#: src/slic3r/GUI/GUI_ObjectList.cpp:459 src/slic3r/GUI/GUI_ObjectList.cpp:462 #, c-format, boost-format msgid "%1$d open edge" msgid_plural "%1$d open edges" msgstr[0] "%1$d borda aberta" msgstr[1] "%1$d bordas abertas" -#: src/slic3r/GUI/GUI_ObjectList.cpp:428 +#: src/slic3r/GUI/GUI_ObjectList.cpp:461 msgid "Remaining errors" msgstr "Erros restantes" -#: src/slic3r/GUI/GUI_ObjectList.cpp:436 +#: src/slic3r/GUI/GUI_ObjectList.cpp:469 msgid "Right button click the icon to fix STL through Netfabb" msgstr "" "Clique com o botão direito no ícone para arrumar STL através do Netfabb" -#: src/slic3r/GUI/GUI_ObjectList.cpp:482 +#: src/slic3r/GUI/GUI_ObjectList.cpp:515 msgid "Right button click the icon to change the object settings" msgstr "Clique com o botão direito no ícone para mudar as config. do objeto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:484 +#: src/slic3r/GUI/GUI_ObjectList.cpp:517 msgid "Click the icon to change the object settings" msgstr "Clique no ícone para mudar as config. do objeto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:488 +#: src/slic3r/GUI/GUI_ObjectList.cpp:521 msgid "Right button click the icon to change the object printable property" msgstr "" "Clique com o botão direito no ícone para mudar a propriedade de impressão do " "objeto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:523 msgid "Click the icon to change the object printable property" msgstr "Clique no ícone para mudar a propriedade de impressão do objeto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:616 +#: src/slic3r/GUI/GUI_ObjectList.cpp:649 msgid "Change Extruder" msgstr "Mudar extrusora" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Object" msgstr "Renomear objeto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Sub-object" msgstr "Renomear sub-objeto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1242 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4006 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1307 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4589 msgid "Instances to Separated Objects" msgstr "Instâncias para separar objetos" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Volumes in Object reordered" msgstr "Volume reorganizados no objeto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Object reordered" msgstr "Objeto reorganizado" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1298 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1363 msgid "Add Settings for Layers" msgstr "Adicionar config. para camadas" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1299 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1364 msgid "Add Settings for Sub-object" msgstr "Adicionar config. para sub-objetos" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1300 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1365 msgid "Add Settings for Object" msgstr "Adicionar config. para objetos" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1339 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1404 msgid "Add Settings Bundle for Height range" msgstr "Adicionar pacote de config. para intervalo de altura" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1340 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1405 msgid "Add Settings Bundle for Sub-object" msgstr "Adicionar pacote de config. para subobjeto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1341 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1406 msgid "Add Settings Bundle for Object" msgstr "Adicionar pacote de config. para objeto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Part" msgstr "Carregar parte" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Modifier" msgstr "Carregar modificadores" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1509 src/slic3r/GUI/Plater.cpp:2380 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1582 src/slic3r/GUI/Plater.cpp:2453 msgid "Loading" msgstr "Carregando" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1540 src/slic3r/GUI/Plater.cpp:2417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1617 src/slic3r/GUI/Plater.cpp:2494 msgid "Loading file" msgstr "Carregar arquivo de config" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1548 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1625 msgid "Error!" msgstr "Erro!" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1638 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1721 msgid "Add Generic Subobject" msgstr "Adicionar sub-objeto genérico" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1663 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1761 msgid "Generic" msgstr "Genérico" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shape from Gallery" msgstr "Adicionar forma da galeria" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shapes from Gallery" msgstr "Adicionar formas da galeria" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1830 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1945 msgid "Remove paint-on supports" msgstr "Remova os suportes de pintura" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1837 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 msgid "Remove paint-on seam" msgstr "Remova a costura de pintura" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1844 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 msgid "Remove Multi Material painting" msgstr "Remova a pintura de vários materiais" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1850 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1972 msgid "Shift objects to bed" msgstr "Deslocar objetos para a cama" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1856 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1978 msgid "Remove variable layer height" msgstr "Remover altura variável da camada" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1877 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1999 msgid "Delete Settings" msgstr "Deletar config" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1901 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2023 msgid "Delete All Instances from Object" msgstr "Excluir todas as instâncias do objeto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1917 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2039 msgid "Delete Height Range" msgstr "Excluir limite de altura" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1949 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2057 +msgid "Delete connector from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2058 +msgid "Delete solid part from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2059 +msgid "Delete negative volume from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2061 +msgid "" +"To save cut information you can delete all connectors from all related " +"objects." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2064 +msgid "" +"This action will break a cut information.\n" +"After that PrusaSlicer can't guarantee model consistency.\n" +"\n" +"To manipulate with solid parts or negative volumes you have to invalidate " +"cut infornation first." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2072 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2612 +msgid "Delete all connectors" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2103 msgid "From Object List You can't delete the last solid part from object." msgstr "" "Na lista de objetos não é possível excluir a última parte sólida do objeto." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1953 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2112 msgid "Delete Subobject" msgstr "Deletar sub-objeto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1976 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2138 msgid "Last instance of an object cannot be deleted." msgstr "A última instância de um objeto não pode ser excluída." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1980 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +msgid "Instance cannot be deleted from cut object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2146 msgid "Delete Instance" msgstr "Deletar instância" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2004 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2170 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "O seguinte objeto não pode ser dividido pois contém uma parte." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2008 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2174 msgid "Split to Parts" msgstr "Dividir em partes" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2177 src/slic3r/GUI/Plater.cpp:3133 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"splitting the object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2297 msgid "Merged" msgstr "Mesclado" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2237 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2392 msgid "Merge all parts to the one single object" msgstr "Mesclar todas partes para um único objeto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2269 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2424 msgid "Add Layers" msgstr "Adicionar camadas" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2438 -msgid "Group manipulation" -msgstr "Manipulação de grupos" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2695 +msgid "Cut Connectors information" +msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2453 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2705 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2768 msgid "Object manipulation" msgstr "Manipulação de objetos" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2486 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2714 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1472 +msgid "Group manipulation" +msgstr "Manipulação de grupos" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2802 msgid "Object Settings to modify" msgstr "Config. do objeto para modificar" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2806 msgid "Part Settings to modify" msgstr "Config. da parte para modificar" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2495 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2811 msgid "Layer range Settings to modify" msgstr "Config. de intervalo de camada para modificar" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2501 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2817 msgid "Part manipulation" msgstr "Manipulação da parte" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2825 msgid "Instance manipulation" msgstr "Manipulação da instância" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Height ranges" msgstr "Limites de altura" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Settings for height range" msgstr "Config. para intervalo de altura" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2750 -msgid "Delete Selected Item" -msgstr "Excluir item selecionado" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2943 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3363 msgid "Delete Selected" msgstr "Excluir seleção" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3019 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3047 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3067 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3441 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3469 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3489 msgid "Add Height Range" msgstr "Adicionar intervalo de altura" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3113 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3535 msgid "" "Cannot insert a new layer range after the current layer range.\n" "The next layer range is too thin to be split to two\n" @@ -4539,7 +5843,7 @@ msgstr "" "O próximo intervalo de camada é muito fino para ser separado em dois\n" "sem violar a altura mínima de camada." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3117 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3539 msgid "" "Cannot insert a new layer range between the current and the next layer " "range.\n" @@ -4551,7 +5855,7 @@ msgstr "" "O vão entre o atual intervalo de camada e o próximo intervalo de camada\n" "é mais fino que a altura de camada mínima permitida." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3122 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3544 msgid "" "Cannot insert a new layer range after the current layer range.\n" "Current layer range overlaps with the next layer range." @@ -4560,237 +5864,288 @@ msgstr "" "camada\n" "Intervalo de altura atual se sobrepões com o próximo intervalo." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3603 msgid "Edit Height Range" msgstr "Editar intervalo de altura" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3500 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3989 msgid "Selection-Remove from list" msgstr "Seleção-Remover da lista" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4001 msgid "Selection-Add from list" msgstr "Seleção-Adicionar da lista" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3649 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4138 msgid "Object or Instance" msgstr "Objeto ou instância" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Part" -msgstr "Parte" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 msgid "Layer" msgstr "Camada" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3652 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4141 msgid "Unsupported selection" msgstr "Seleção não suportada" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3653 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 #, c-format, boost-format msgid "You started your selection with %s Item." msgstr "Você iniciou sua seleção com o item de %s." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3654 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4143 #, c-format, boost-format msgid "In this mode you can select only other %s Items%s" msgstr "Neste modo, você pode selecionar apenas outros %s itens%s" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3657 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4146 msgid "of a current Object" msgstr "de um objeto atual" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3662 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3737 src/slic3r/GUI/Plater.cpp:181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4151 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4226 src/slic3r/GUI/Plater.cpp:197 msgid "Info" msgstr "Informação" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3784 -msgid "You can't change a type of the last solid part of the object." -msgstr "Não é possível alterar um tipo da última parte sólida do objeto." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 msgid "Negative Volume" msgstr "Volume Negativo" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Modifier" -msgstr "Modificador" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Blocker" msgstr "Bloqueador de suporte" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Enforcer" msgstr "Reforçador de suporte" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Select type of part" msgstr "Selecione o tipo de parte" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3795 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4359 msgid "Change Part Type" msgstr "Mudar o tipo da parte" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Enter new name" msgstr "Insira o novo nome" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Renaming" msgstr "Renomeando" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4091 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4681 msgid "Repairing model" msgstr "Reparando modelo" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4120 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4691 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"repairing the mesh." +msgstr "" +"Suportes personalizados, costuras e pintura multimaterial foram removidos " +"após reparação da malha." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4711 msgid "Fix through NetFabb" msgstr "Arrumar através do NetFabb" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4123 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4714 msgid "Fixing through NetFabb" msgstr "Corrigindo através do NetFabb" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4153 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4744 msgid "The following model was repaired successfully" msgid_plural "The following models were repaired successfully" msgstr[0] "O seguinte modelo foi reparado com sucesso" msgstr[1] "Os seguintes modelos foram reparados com sucesso" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4159 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4750 msgid "Folowing model repair failed" msgid_plural "Folowing models repair failed" msgstr[0] "Falha no reparo do seguinte modelo" msgstr[1] "Falha no reparo dos seguintes modelos" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4164 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4755 msgid "Repairing was canceled" msgstr "A reparação foi cancelada" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4276 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4869 msgid "Change Extruders" msgstr "Mudar extrusoras" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Printable group" msgstr "Definir grupo imprimível" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Unprintable group" msgstr "Definir grupo não imprimível" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Printable" msgstr "Definir como imprimível" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Unprintable" msgstr "Definir não imprimível" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Printable Instance" msgstr "Definir instância imprimível" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Unprintable Instance" msgstr "Definir instância não imprimível" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:55 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:84 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:61 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:96 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1132 msgid "World coordinates" msgstr "Coordenadas mundiais" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:56 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:85 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:97 msgid "Local coordinates" msgstr "Coordenadas locais" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:60 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:67 msgid "Select coordinate space, in which the transformation will be performed." msgstr "" "Selecione o espaço de coordenadas, no qual a transformação será executada." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:141 src/libslic3r/GCode.cpp:540 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:157 src/libslic3r/GCode.cpp:491 msgid "Object name" msgstr "Nome do objeto" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:201 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:521 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:221 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:710 msgid "Position" msgstr "Posição" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:202 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:522 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:222 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:711 #: src/slic3r/GUI/Mouse3DController.cpp:478 #: src/slic3r/GUI/Mouse3DController.cpp:499 msgid "Rotation" msgstr "Rotação" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:250 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:239 +msgid "Size [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "Mirror along" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +#, c-format, boost-format +msgid " %c " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "axis" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:279 #, c-format, boost-format msgid "Toggle %c axis mirroring" msgstr "Ativar espelhamento do eixo %c" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:284 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:329 msgid "Set Mirror" msgstr "Definir espelhamento" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:324 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:336 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:348 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:374 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:387 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:393 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:401 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:428 msgid "Drop to bed" msgstr "Soltar na mesa" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:445 msgid "Reset rotation" msgstr "Restabelecer rotação" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 msgid "Reset Rotation" msgstr "Restabelecer Rotação" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:398 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:400 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:490 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:519 msgid "Reset scale" msgstr "Restabelecer escala" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:539 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546 +msgid "Reset skew" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:553 msgid "Inches" msgstr "Polegadas" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:523 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:712 msgid "Scale factors" msgstr "Fatores de escala" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:577 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:740 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:752 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:793 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:801 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +msgid "Rotate (relative)" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:751 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:800 +msgid "Translate (relative) [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:829 msgid "Translate" msgstr "Tradução" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:640 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:905 msgid "" "You cannot use non-uniform scaling mode for multiple objects/parts selection" msgstr "" "Não é possível usar o modo de dimensionamento não uniforme para vários " "objetos/seleção de peças" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:820 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +msgid "Left handed" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1133 +msgid "Object coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1134 +msgid "Part coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1176 msgid "Set Position" msgstr "Definir posição" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:852 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1220 msgid "Set Orientation" msgstr "Definir orientação" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:931 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1351 msgid "Set Scale" msgstr "Definir escala" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1368 +msgid "Set Size" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1427 msgid "" "The currently manipulated object is tilted (rotation angles are not " "multiples of 90°).\n" @@ -4804,7 +6159,7 @@ msgstr "" "sistema de coordenadas mundiais,\n" "uma vez que a rotação é incorporada nas coordenadas do objeto." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:983 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1430 msgid "" "This operation is irreversible.\n" "Do you want to proceed?" @@ -4830,170 +6185,69 @@ msgstr "Excluir opção %s" msgid "Change Option %s" msgstr "Alterar opção %s" -#: src/slic3r/GUI/GUI_Preview.cpp:211 -msgid "View" -msgstr "Vista" - -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/libslic3r/PrintConfig.cpp:808 -msgid "Height" -msgstr "Altura" - -#: src/slic3r/GUI/GUI_Preview.cpp:219 src/libslic3r/PrintConfig.cpp:3032 -msgid "Width" -msgstr "Espessura" - -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2016 -msgid "Fan speed" -msgstr "Velocidade do ventoinha" - -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1991 -msgid "Temperature" -msgstr "Temperatura" - -#: src/slic3r/GUI/GUI_Preview.cpp:223 -msgid "Volumetric flow rate" -msgstr "Taxa de fluxo volumétrico" - -#: src/slic3r/GUI/GUI_Preview.cpp:228 -msgid "Show" -msgstr "Mostrar" - -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/GUI_Preview.cpp:254 -msgid "Feature types" -msgstr "Tipos de características" - -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:330 -#: src/libslic3r/ExtrusionEntity.cpp:352 -msgid "Perimeter" -msgstr "Perímetro" - -#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:331 -#: src/libslic3r/ExtrusionEntity.cpp:354 -msgid "External perimeter" -msgstr "Perímetro externo" - -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:332 -#: src/libslic3r/ExtrusionEntity.cpp:356 -msgid "Overhang perimeter" -msgstr "Perímetro de angulação" - -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:333 -#: src/libslic3r/ExtrusionEntity.cpp:358 -msgid "Internal infill" -msgstr "Preenchimento interno" - -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:334 -#: src/libslic3r/ExtrusionEntity.cpp:360 src/libslic3r/PrintConfig.cpp:1407 -#: src/libslic3r/PrintConfig.cpp:2392 src/libslic3r/PrintConfig.cpp:2404 -msgid "Solid infill" -msgstr "Preenchimento sólido" - -#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:335 -#: src/libslic3r/ExtrusionEntity.cpp:362 src/libslic3r/PrintConfig.cpp:1416 -#: src/libslic3r/PrintConfig.cpp:2889 src/libslic3r/PrintConfig.cpp:2902 -msgid "Top solid infill" -msgstr "Preenchimento do sólido do topo" - -#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:337 -#: src/libslic3r/ExtrusionEntity.cpp:366 -msgid "Bridge infill" -msgstr "Preenchimento de pontes" - -#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:338 -#: src/libslic3r/ExtrusionEntity.cpp:368 src/libslic3r/PrintConfig.cpp:1325 -msgid "Gap fill" -msgstr "Preenchimento de vão" - -#: src/slic3r/GUI/GUI_Preview.cpp:248 src/libslic3r/ExtrusionEntity.cpp:339 -#: src/libslic3r/ExtrusionEntity.cpp:370 -msgid "Skirt/Brim" -msgstr "Saia/aba" - -#: src/slic3r/GUI/GUI_Preview.cpp:250 src/libslic3r/ExtrusionEntity.cpp:341 -#: src/libslic3r/ExtrusionEntity.cpp:374 src/libslic3r/PrintConfig.cpp:2736 -msgid "Support material interface" -msgstr "Interface do material de suporte" - -#: src/slic3r/GUI/GUI_Preview.cpp:251 src/slic3r/GUI/Tab.cpp:1634 -#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/ExtrusionEntity.cpp:376 -msgid "Wipe tower" -msgstr "Torre de limpeza" - -#: src/slic3r/GUI/GUI_Preview.cpp:728 +#: src/slic3r/GUI/GUI_Preview.cpp:581 msgid "NOTE:" msgstr "NOTA:" -#: src/slic3r/GUI/GUI_Preview.cpp:729 +#: src/slic3r/GUI/GUI_Preview.cpp:582 #, boost-format msgid "Sliced object \"%1%\" looks like a logo or a sign" msgstr "O objeto fatiado \"%1%\" se parece com um logotipo ou sinal" -#: src/slic3r/GUI/GUI_Preview.cpp:730 +#: src/slic3r/GUI/GUI_Preview.cpp:583 msgid "Apply color change automatically" msgstr "Aplicar mudança de cor automaticamente" -#: src/slic3r/GUI/GUI_Preview.cpp:1058 -msgid "Shells" -msgstr "Paredes" - -#: src/slic3r/GUI/GUI_Preview.cpp:1059 -msgid "Tool marker" -msgstr "Ferramenta de marcação" - -#: src/slic3r/GUI/GUI_Preview.cpp:1060 -msgid "Legend/Estimated printing time" -msgstr "Legenda/Tempo estimado de impressão" - -#: src/slic3r/GUI/HintNotification.cpp:771 -#: src/slic3r/GUI/HintNotification.cpp:797 -#: src/slic3r/GUI/NotificationManager.cpp:374 -#: src/slic3r/GUI/NotificationManager.cpp:391 +#: src/slic3r/GUI/HintNotification.cpp:773 +#: src/slic3r/GUI/HintNotification.cpp:799 +#: src/slic3r/GUI/NotificationManager.cpp:457 +#: src/slic3r/GUI/NotificationManager.cpp:474 msgid "More" msgstr "Mais" -#: src/slic3r/GUI/HintNotification.cpp:912 +#: src/slic3r/GUI/HintNotification.cpp:914 msgid "Open Preferences." msgstr "Abrir Preferências." -#: src/slic3r/GUI/HintNotification.cpp:1004 +#: src/slic3r/GUI/HintNotification.cpp:1006 msgid "Open Documentation in web browser." msgstr "Abra a Documentação no navegador da web." -#: src/slic3r/GUI/ImGuiWrapper.cpp:527 +#: src/slic3r/GUI/ImGuiWrapper.cpp:666 msgid "Edit" msgstr "Editar" -#: src/slic3r/GUI/ImGuiWrapper.cpp:960 src/slic3r/GUI/Search.cpp:470 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1166 src/slic3r/GUI/Search.cpp:531 msgid "Use for search" msgstr "Use para pesquisar" -#: src/slic3r/GUI/ImGuiWrapper.cpp:961 src/slic3r/GUI/Search.cpp:463 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1167 src/slic3r/GUI/Search.cpp:524 msgid "Category" msgstr "Categoria" -#: src/slic3r/GUI/ImGuiWrapper.cpp:963 src/slic3r/GUI/Search.cpp:465 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1169 src/slic3r/GUI/Search.cpp:526 msgid "Search in English" msgstr "Procurar em inglês" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:174 -msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "" -"Não foi possível organizar objetos de modelo! Algumas geometrias podem ser " -"inválidas." - -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:183 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:168 msgid "Arranging" msgstr "Organizar" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:207 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:204 msgid "Arranging canceled." msgstr "Arranjo cancelado." -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:208 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:205 msgid "Arranging done." msgstr "Arranjo feito." -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:253 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:225 +msgid "Could not arrange model objects! Some geometries may be invalid." +msgstr "" +"Não foi possível organizar objetos de modelo! Algumas geometrias podem ser " +"inválidas." + +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:265 #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -5003,40 +6257,83 @@ msgstr "" "Arranjo ignorou os seguintes objetos que não podem caber em um único cama:\n" "%s" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:119 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:108 msgid "Filling bed" msgstr "Enchendo a cama" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:130 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:140 msgid "Bed filling canceled." msgstr "Enchimento da cama cancelado." -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:131 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:141 msgid "Bed filling done." msgstr "Enchimento da cama feito." -#: src/slic3r/GUI/Jobs/Job.cpp:111 -msgid "ERROR: not enough resources to execute a new job." -msgstr "ERRO: não há recursos suficientes para executar um novo trabalho." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:148 src/slic3r/GUI/Jobs/EmbossJob.cpp:596 +msgid "Can't create empty volume." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:201 +msgid "Can't create empty object." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:208 +msgid "Add Emboss text object" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:247 +msgid "Created text volume is empty. Change text or font." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:465 +msgid "" +"It is used default volume for embossed text, try to change text or font to " +"fix it." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:549 +#, boost-format +msgid "Text: %1%" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:593 +msgid "Bad object to create volume." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:598 +msgid "Add Emboss text Volume" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:698 +msgid "Font doesn't have any shape for given text." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:738 +msgid "There is no volume in projection direction." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:787 +msgid "There is no valid surface for text projection." +msgstr "" -#: src/slic3r/GUI/Jobs/PlaterJob.cpp:13 -msgid "An unexpected error occured" -msgstr "Ocorreu um erro inesperado" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:823 +msgid "Issue during embossing the text." +msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:21 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:22 msgid "Best surface quality" msgstr "Melhor qualidade de superfície" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:23 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 msgid "Optimize object rotation for best surface quality." msgstr "" "Otimize a rotação do objeto para obter a melhor qualidade de superfície." -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:25 msgid "Reduced overhang slopes" msgstr "Inclinações de overhang reduzidas" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:26 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:27 msgid "" "Optimize object rotation to have minimum amount of overhangs needing support " "structures.\n" @@ -5048,65 +6345,33 @@ msgstr "" "Observe que este método tentará encontrar a melhor superfície do objeto para " "tocar na mesa de impressão se nenhuma elevação estiver definida." -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:30 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:31 msgid "Lowest Z height" msgstr "Altura Z mais baixa" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:32 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:33 msgid "Rotate the model to have the lowest z height for faster print time." msgstr "" "Gire o modelo para ter a menor altura z para um tempo de impressão mais " "rápido." -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:59 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:53 msgid "Searching for optimal orientation" msgstr "Procurando orientação ideal" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:77 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:83 msgid "Orientation search canceled." msgstr "Pesquisa de orientação cancelada." -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:78 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:84 msgid "Orientation found." msgstr "Orientação encontrada." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:36 -msgid "Choose SLA archive:" -msgstr "Selecione arquivo SLA:" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:40 -msgid "Import file" -msgstr "Importar arquivo" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47 -msgid "Import model and profile" -msgstr "Importar modelo e perfil" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48 -msgid "Import profile only" -msgstr "Importar somente perfil" - #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:49 -msgid "Import model only" -msgstr "Modelo somente modelo" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60 -msgid "Accurate" -msgstr "Preciso" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61 -msgid "Balanced" -msgstr "Balanceado" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:62 -msgid "Quick" -msgstr "Ágil" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:140 msgid "Importing SLA archive" msgstr "Importando arquivos SLA" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:158 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:77 msgid "" "The SLA archive doesn't contain any presets. Please activate some SLA " "printer preset first before importing that SLA archive." @@ -5114,19 +6379,23 @@ msgstr "" "O arquivo de SLA não contém predefinições. Por favor, ative algum SLA " "impressora predefinida antes de importar esse arquivo SLA." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:164 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:81 +msgid "Import is unavailable for this archive format." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:86 msgid "Importing canceled." msgstr "Importação cancelada." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:165 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:87 msgid "Importing done." msgstr "Importação feita." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:187 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:108 msgid "The file does not exist." msgstr "O arquivo não existe." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:221 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135 msgid "" "The imported SLA archive did not contain any presets. The current SLA " "presets were used as fallback." @@ -5134,162 +6403,170 @@ msgstr "" "O arquivo de SLA importado não continha nenhuma predefinição. O SLA atual os " "presets foram usados como fallback." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:234 src/slic3r/GUI/Plater.cpp:2458 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:148 src/slic3r/GUI/Plater.cpp:2535 msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "" "Você não pode carregar o projeto SLA com um objeto de várias partes na mesa" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:236 src/slic3r/GUI/Plater.cpp:2460 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:150 src/slic3r/GUI/Plater.cpp:2537 msgid "Attention!" msgstr "Atenção!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:166 +msgid "The profile in the imported archive is corrupt and will not be loaded." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:178 +msgid "" +"No object could be retrieved from the archive. The slices might be corrupted " +"or missing." +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1184 msgid "Keyboard Shortcuts" msgstr "Atalhos do teclado" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:77 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:86 msgid "New project, clear plater" msgstr "Novo projeto, limpar a bandeja" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:78 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 msgid "Open project AMF/3MF with config, clear plater" msgstr "Abra o projeto AMF/3MF com config, limpar bandeja" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 msgid "Save project (3mf)" msgstr "Salvar projeto (3MF)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 msgid "Save project as (3mf)" msgstr "Salvar projeto como (3mf)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:81 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 msgid "(Re)slice" msgstr "(Re)fatiar" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:83 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:92 msgid "Import STL/3MF/STEP/OBJ/AMF without config, keep plater" msgstr "Importar STL/3MF/STEP/OBJ/AMF sem config, manter bandeja" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:84 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 msgid "Import Config from ini/amf/3mf/gcode" msgstr "Config importação de ini/amf/3mf/gcode" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:85 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "Carregar config. de um. ini/AMF/3mf/gcode e mesclar" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6543 src/libslic3r/PrintConfig.cpp:4423 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:96 src/slic3r/GUI/Plater.cpp:948 +#: src/slic3r/GUI/Plater.cpp:7161 src/libslic3r/PrintConfig.cpp:4575 msgid "Export G-code" msgstr "Exportar G-code" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:97 src/slic3r/GUI/Plater.cpp:7162 msgid "Send G-code" msgstr "Enviar G-code" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 msgid "Export config" msgstr "Exportar config" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 src/slic3r/GUI/Plater.cpp:896 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 src/slic3r/GUI/Plater.cpp:931 msgid "Export to SD card / Flash drive" msgstr "Exportar para cartão SD / unidade Flash" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:91 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 msgid "Eject SD card / Flash drive" msgstr "Ejetar cartão SD / unidade Flash" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 msgid "Select all objects" msgstr "Selecionar todos os objetos" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 msgid "Deselect all" msgstr "Desmarcar todos" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:95 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 msgid "Delete selected" msgstr "Deletar seleção" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 -msgid "Copy to clipboard" -msgstr "Copiar para a área de transferência" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 msgid "Paste from clipboard" msgstr "Colar da área de transferência" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Reload plater from disk" msgstr "Recarregar bandeja do disco" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 msgid "Select Plater Tab" msgstr "Selecione a guia de bandeja" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 msgid "Select Print Settings Tab" msgstr "Selecione a guia config. de impressão" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 msgid "Select Filament Settings Tab" msgstr "Selecione a guia config. de filamento" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 msgid "Select Printer Settings Tab" msgstr "Selecione a guia config. da impressora" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 msgid "Switch to 3D" msgstr "Mude para 3D" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 msgid "Switch to Preview" msgstr "Mudar para pré-visualização" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 -#: src/slic3r/GUI/PrintHostDialogs.cpp:217 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +#: src/slic3r/GUI/PrintHostDialogs.cpp:267 msgid "Print host upload queue" msgstr "Fila de carregamento do host de impressão" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/MainFrame.cpp:75 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 src/slic3r/GUI/MainFrame.cpp:77 msgid "Open new instance" msgstr "Abrir nova instância" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 msgid "Camera view" msgstr "Vista da câmera" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 msgid "Show/Hide object/instance labels" msgstr "Mostrar/Ocultar rótulos de objeto/instância" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Preferences.cpp:46 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Preferences.cpp:57 +#: src/slic3r/GUI/Preferences.cpp:165 src/slic3r/GUI/Preferences.cpp:188 +#: src/slic3r/GUI/Preferences.cpp:207 src/slic3r/GUI/Preferences.cpp:215 msgid "Preferences" msgstr "Preferências" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 msgid "Show keyboard shortcuts list" msgstr "Mostrar lista dos atalhos no teclado" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 msgid "Commands" msgstr "Comandos" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 msgid "Add Instance of the selected object" msgstr "Adicionar instância do objeto selecionado" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Remove Instance of the selected object" msgstr "Remover instância do objeto selecionado" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 msgid "" "Press to select multiple objects\n" "or move multiple objects with mouse" @@ -5297,140 +6574,144 @@ msgstr "" "Aperte para selecionar múltiplos objetos ou mover múltiplos objetos com o " "mouse" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 msgid "Press to activate selection rectangle" msgstr "Pressione para ativar o retângulo de seleção" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 msgid "Press to activate deselection rectangle" msgstr "Pressione para ativar o retângulo de desseleção" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Arrow Up" msgstr "Seta para cima" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 msgid "Move selection 10 mm in positive Y direction" msgstr "Mover seleção 10 mm na direção Y positiva" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Arrow Down" msgstr "Seta para baixo" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 msgid "Move selection 10 mm in negative Y direction" msgstr "Mover seleção 10 mm na direção Y negativa" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Arrow Left" msgstr "Seta esquerda" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 msgid "Move selection 10 mm in negative X direction" msgstr "Mover seleção 10 mm na direção X negativa" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Arrow Right" msgstr "Seta direita" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 msgid "Move selection 10 mm in positive X direction" msgstr "Mover seleção 10 mm na direção X positiva" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Any arrow" msgstr "Qualquer flecha" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 msgid "Movement step set to 1 mm" msgstr "Passo de movimento definido para 1 mm" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Movement in camera space" msgstr "Movimento no espaço da câmera" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Page Up" msgstr "Page Up" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Rotate selection 45 degrees CCW" msgstr "Seleção rotatura 45 graus SAH" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Page Down" msgstr "Page Down" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Rotate selection 45 degrees CW" msgstr "Seleção de rotação 45 graus SH" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 msgid "Gizmo move" msgstr "Gizmo-Mover" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 msgid "Gizmo scale" msgstr "Gizmo-Escala" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Gizmo rotate" msgstr "Gizmo-Rotacionar" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Gizmo cut" msgstr "Gizmo-Cortar" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 msgid "Gizmo Place face on bed" msgstr "Colocar face do Gizmo na mesa" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 msgid "Gizmo SLA hollow" msgstr "Gizmo de SLA ligado" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 msgid "Gizmo SLA support points" msgstr "Pontos de suporte do Gizmo SLA" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 msgid "Gizmo FDM paint-on supports" msgstr "Suportes de pintura Gizmo FDM" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 msgid "Gizmo FDM paint-on seam" msgstr "Costura de pintura Gizmo FDM" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 msgid "Gizmo Multi Material painting" msgstr "Pintura Gizmo Multi Material" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +msgid "Gizmo Text emboss / engrave" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 msgid "Unselect gizmo or clear selection" msgstr "Desmarcar Gizmo/limpar seleção" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 msgid "Change camera type (perspective, orthographic)" msgstr "Alterar tipo de câmera (perspectiva, ortográfica)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 msgid "Zoom to Bed" msgstr "Ampliar para a mesa" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 msgid "" "Zoom to selected object\n" "or all objects in scene, if none selected" @@ -5438,180 +6719,180 @@ msgstr "" "Zoom para objeto selecionado\n" "ou todos os objetos em cena, se nenhum selecionado" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 msgid "Zoom in" msgstr "Ampliar" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Zoom out" msgstr "Diminuir" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Switch between Editor/Preview" msgstr "Mudar entre Editor/Pré-visualização" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Collapse/Expand the sidebar" msgstr "Recolher/Expandir a barra lateral" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled" msgstr "" "Mostrar/Ocultar a caixa de configurações de dispositivos 3Dconnexion, se " "ativado" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "Mostrar/Ocultar a caixa de configurações de dispositivos 3Dconnexion" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 msgid "Minimize application" msgstr "Minimizar aplicativo" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 src/slic3r/GUI/MainFrame.cpp:284 -#: src/slic3r/GUI/MainFrame.cpp:333 src/slic3r/GUI/MainFrame.cpp:445 -#: src/slic3r/GUI/MainFrame.cpp:448 src/slic3r/GUI/MainFrame.cpp:470 -#: src/slic3r/GUI/MainFrame.cpp:473 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 src/slic3r/GUI/MainFrame.cpp:329 +#: src/slic3r/GUI/MainFrame.cpp:378 src/slic3r/GUI/MainFrame.cpp:490 +#: src/slic3r/GUI/MainFrame.cpp:493 src/slic3r/GUI/MainFrame.cpp:515 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Plater" msgstr "Bandeja" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button" msgstr "" "Todos gizmos: Rotacionar - Botão esquerdo do mouse; Pan - Botão direito do " "mouse" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 msgid "Gizmo move: Press to snap by 1mm" msgstr "Gizmo movimentar: Pressione para ajustar em 1 mm" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 msgid "Gizmo scale: Press to snap by 5%" msgstr "Gizmo escala: Pressione para ajustar em 5%" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 msgid "Gizmo scale: Scale selection to fit print volume" msgstr "Gizmo escala: Seleção de escala para caber no volume da impressora" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 msgid "Gizmo scale: Press to activate one direction scaling" msgstr "Gizmo escala: Pressione para ativar escalonamento em uma direção" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 msgid "Gizmo scale: Press to scale selected objects around their own center" msgstr "" "Gizmo escala: Pressione para escalonar os objetos selecionados em torno de " "seus próprios centros" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 msgid "Gizmo rotate: Press to rotate selected objects around their own center" msgstr "" "Gizmo rotação: Pressione para rotacionar objetos selecionados em torno de " "seus próprios centros" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "Gizmos" msgstr "Gizmos" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "" "The following shortcuts are applicable when the specified gizmo is active" msgstr "" "Os seguintes atalhos são aplicáveis quando o dispositivo especificado está " "ativo" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 msgid "Set selected items as Printable/Unprintable" msgstr "Definir itens selecionados como imprimíveis/não imprimíveis" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:203 msgid "Set default extruder for the selected items" msgstr "Definir extrusora padrão para os itens selecionados" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 msgid "Set extruder number for the selected items" msgstr "Definir o número da extrusora para os itens selecionados" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 msgid "Objects List" msgstr "Lista de objetos" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/MainFrame.cpp:1611 msgid "Open a G-code file" msgstr "Abrir um arquivo G-code" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 -#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 -#: src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 src/slic3r/GUI/MainFrame.cpp:1443 +#: src/slic3r/GUI/MainFrame.cpp:1447 src/slic3r/GUI/MainFrame.cpp:1616 +#: src/slic3r/GUI/MainFrame.cpp:1620 msgid "Reload the plater from disk" msgstr "Recarregar a bandeja do disco" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 msgid "Vertical slider - Move active thumb Up" msgstr "Rolagem vertical - Mover barra ativa para Cima" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:228 msgid "Vertical slider - Move active thumb Down" msgstr "Rolagem vertical - Mover barra ativa para Baixo" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 msgid "Horizontal slider - Move active thumb Left" msgstr "Rolagem horizontal - Mover barra ativa para Esquerda" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 msgid "Horizontal slider - Move active thumb Right" msgstr "Rolagem horizontal - Mover barra ativa para Direita" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:231 msgid "On/Off one layer mode of the vertical slider" msgstr "Liga/Desliga modo camada única da barra de rolagem vertical" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 -msgid "Show/Hide Legend and Estimated printing time" -msgstr "Mostrar/Esconder Legenda e Tempo estimado de impressão" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:232 +msgid "Show/Hide legend" +msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 msgid "Show/Hide G-code window" msgstr "Mostrar/ocultar janela de G-code" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4480 -#: src/slic3r/GUI/Tab.cpp:2832 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 src/slic3r/GUI/Plater.cpp:4562 +#: src/slic3r/GUI/Tab.cpp:2736 msgid "Preview" msgstr "Visualização" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 msgid "Move active thumb Up" msgstr "Mover a barra ativa para cima" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 msgid "Move active thumb Down" msgstr "Mover a barra ativa para baixo" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 msgid "Set upper thumb as active" msgstr "Definir barra superior como ativa" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 msgid "Set lower thumb as active" msgstr "Definir barra inferior como ativa" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 msgid "Add color change marker for current layer" msgstr "Adicionar mudança de cor para a camada atual" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:238 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:244 msgid "Delete color change marker for current layer" msgstr "Excluir mudança de cor para a camada atual" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:250 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:251 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:245 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:256 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:257 msgid "" "Press to speed up 5 times while moving thumb\n" "with arrow keys or mouse wheel" @@ -5619,11 +6900,11 @@ msgstr "" "Pressione para acelerar em 5 vezes enquanto move miniatura\n" "com as setas do teclado ou scroll do mouse" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "Vertical Slider" msgstr "Rolagem vertical" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "" "The following shortcuts are applicable in G-code preview when the vertical " "slider is active" @@ -5631,27 +6912,27 @@ msgstr "" "Os seguintes atalhos são aplicáveis na visualização do G-code quando a " "rolagem vertical está ativo" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Move active thumb Left" msgstr "Mover a barra ativa para Esquerda" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Move active thumb Right" msgstr "Mover a barra ativa para Direita" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Set left thumb as active" msgstr "Definir barra esquerda como ativa" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Set right thumb as active" msgstr "Definir barra direita como ativa" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "Horizontal Slider" msgstr "Rolagem horizontal" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "" "The following shortcuts are applicable in G-code preview when the horizontal " "slider is active" @@ -5659,140 +6940,140 @@ msgstr "" "Os seguintes atalhos são aplicáveis na visualização do G-code quando a " "rolagem horizontal está ativo" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:278 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:284 msgid "Keyboard shortcuts" msgstr "Atalhos do teclado" -#: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:77 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open a new PrusaSlicer instance" msgstr "Abrir uma nova instância do PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:93 msgid "G-code preview" msgstr "Previsualização do G-code" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:1388 msgid "Open G-code viewer" msgstr "Abrir visualizador G-code" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:91 src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open PrusaSlicer" msgstr "Versão mínima do PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:93 msgid "Open new G-code viewer" msgstr "Abrir novo visualizador G-code" -#: src/slic3r/GUI/MainFrame.cpp:225 +#: src/slic3r/GUI/MainFrame.cpp:227 msgid "Closing PrusaSlicer. Current project is modified." msgstr "Fechando o PrusaSlicer. O projeto atual foi modificado." -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "PrusaSlicer is closing" msgstr "PrusaSlicer está fechando" -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "Closing PrusaSlicer while some presets are modified." msgstr "" "Fechando o PrusaSlicer enquanto algumas predefinições foram modificados." -#: src/slic3r/GUI/MainFrame.cpp:285 src/slic3r/GUI/MainFrame.cpp:335 -#: src/slic3r/GUI/Tab.hpp:427 src/slic3r/GUI/Tab.hpp:550 +#: src/slic3r/GUI/MainFrame.cpp:330 src/slic3r/GUI/MainFrame.cpp:380 +#: src/slic3r/GUI/Tab.hpp:413 src/slic3r/GUI/Tab.hpp:539 msgid "Print Settings" msgstr "Config. de impressão" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:535 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:384 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:520 msgid "Material Settings" msgstr "Config. de material" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:461 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:382 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:448 msgid "Filament Settings" msgstr "Config. de filamento" -#: src/slic3r/GUI/MainFrame.cpp:287 src/slic3r/GUI/MainFrame.cpp:341 -#: src/slic3r/GUI/Tab.hpp:503 +#: src/slic3r/GUI/MainFrame.cpp:332 src/slic3r/GUI/MainFrame.cpp:386 +#: src/slic3r/GUI/Tab.hpp:488 msgid "Printer Settings" msgstr "Config. da impressora" -#: src/slic3r/GUI/MainFrame.cpp:632 src/slic3r/GUI/Plater.cpp:1719 -#: src/slic3r/GUI/Plater.cpp:2850 +#: src/slic3r/GUI/MainFrame.cpp:685 src/slic3r/GUI/Plater.cpp:1728 +#: src/slic3r/GUI/Plater.cpp:2879 msgid "Untitled" msgstr "Sem título" -#: src/slic3r/GUI/MainFrame.cpp:655 +#: src/slic3r/GUI/MainFrame.cpp:710 msgid "based on Slic3r" msgstr "baseado no Slic3r" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Prusa 3D &Drivers" msgstr "Drivers 3D &Prusa" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Open the Prusa3D drivers download page in your browser" msgstr "Abrir a página para baixar os drivers da Prusa3D no seu navegador" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Software &Releases" msgstr "Lançamentos de &software" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open the software releases page in your browser" msgstr "Abrir a página de lançamentos de software no seu navegador" -#: src/slic3r/GUI/MainFrame.cpp:1081 +#: src/slic3r/GUI/MainFrame.cpp:1158 #, c-format, boost-format msgid "%s &Website" msgstr "%s &Site" -#: src/slic3r/GUI/MainFrame.cpp:1082 +#: src/slic3r/GUI/MainFrame.cpp:1159 #, c-format, boost-format msgid "Open the %s website in your browser" msgstr "Abra o site do %s no seu navegador" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "System &Info" msgstr "Informação &do sistema" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "Show system information" msgstr "Mostrar a informação do sistema" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show &Configuration Folder" msgstr "Mostrar &pasta de config" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show user configuration folder (datadir)" msgstr "Mostrar pasta de config. do usuário (datadir)" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "Report an I&ssue" msgstr "Reportar um p&roblema" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 #, c-format, boost-format msgid "Report an issue on %s" msgstr "Relatar um problema em %s" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 #, c-format, boost-format msgid "&About %s" msgstr "&Sobre %s" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 msgid "Show about dialog" msgstr "Mostrar diálogo sobre" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1177 msgid "Show Tip of the Day" msgstr "Mostrar dica do dia" -#: src/slic3r/GUI/MainFrame.cpp:1104 +#: src/slic3r/GUI/MainFrame.cpp:1181 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." @@ -5800,94 +7081,94 @@ msgstr "" "Abre a notificação da Dica do dia no canto inferior direito ou mostra outra " "dica se já estiver aberta." -#: src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/MainFrame.cpp:1184 msgid "Show the list of the keyboard shortcuts" msgstr "Mostrar lista dos atalhos no teclado" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso" msgstr "Isométrico" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso View" msgstr "Vista isométrica" #. TRN To be shown in the main menu View->Top #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2917 -#: src/libslic3r/PrintConfig.cpp:2926 +#: src/slic3r/GUI/MainFrame.cpp:1202 src/libslic3r/PrintConfig.cpp:3005 +#: src/libslic3r/PrintConfig.cpp:3014 msgid "Top" msgstr "Topo" -#: src/slic3r/GUI/MainFrame.cpp:1125 +#: src/slic3r/GUI/MainFrame.cpp:1202 msgid "Top View" msgstr "Vista do topo" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:446 -#: src/libslic3r/PrintConfig.cpp:455 +#: src/slic3r/GUI/MainFrame.cpp:1205 src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:474 msgid "Bottom" msgstr "Base" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1205 msgid "Bottom View" msgstr "Vista da base" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front" msgstr "Frente" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front View" msgstr "Vista da frente" -#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2274 +#: src/slic3r/GUI/MainFrame.cpp:1209 src/libslic3r/PrintConfig.cpp:2300 msgid "Rear" msgstr "Traseira" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1209 msgid "Rear View" msgstr "Vista traseira" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left" msgstr "Esquerda" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left View" msgstr "Vista esquerda" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right" msgstr "Direita" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right View" msgstr "Vista direita" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "&New Project" msgstr "&Novo projeto" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "Start a new project" msgstr "Começar um novo projeto" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "&Open Project" msgstr "&Abrir projeto" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "Open a project file" msgstr "Abrir novo projeto" -#: src/slic3r/GUI/MainFrame.cpp:1157 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Recent projects" msgstr "Projetos recentes" -#: src/slic3r/GUI/MainFrame.cpp:1169 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -5895,510 +7176,544 @@ msgstr "" "O projeto selecionado não está mais disponível.\n" "Você quer removê-lo da lista de projetos recentes?" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Save Project" msgstr "&Salvar projeto" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "Save current project file" msgstr "Salvar arquivo do projeto atual" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save Project &as" msgstr "Salvar projeto &como" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save current project file as" msgstr "Salvar arquivo atual como" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Import STL/3MF/STEP/OBJ/AM&F" msgstr "Importar STL/3MF/STEP/OBJ/AM&F" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Load a model" msgstr "Carregar um modelo" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Import STL (Imperial Units)" msgstr "Importar STL (Unidades Imperiais)" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Load an model saved with imperial units" msgstr "Carregar um modelo salvo com unidades imperiais" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Import SL1 / SL1S Archive" -msgstr "Importar Arquivo SL1 / SL1S" +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Import SLA Archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Load an SLA archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Import ZIP Achive" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Load an SL1 / Sl1S archive" -msgstr "Carregar um arquivo SL1 / Sl1S" +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Load a zip achive" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Import &Config" msgstr "Importar &configuração" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Load exported configuration file" msgstr "Carregar config. de arquivo exportado" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Import Config from &Project" msgstr "Importar Configuração de &Projeto" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Load configuration from project file" msgstr "Carregar config. de arquivo de projeto" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Import Config &Bundle" msgstr "Importar coleção &de config" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Load presets from a bundle" msgstr "Carregar predefinições de um pacote" -#: src/slic3r/GUI/MainFrame.cpp:1231 +#: src/slic3r/GUI/MainFrame.cpp:1311 msgid "&Import" msgstr "&Importar" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1314 src/slic3r/GUI/MainFrame.cpp:1676 msgid "Export &G-code" msgstr "Exportar &G-code" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1314 msgid "Export current plate as G-code" msgstr "Exporte a bandeja atual como o G-code" -#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1318 src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end G-code" msgstr "E&nviar G-code" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1318 msgid "Send to print current plate as G-code" msgstr "Enviar para imprimir a bandeja atual como G-code" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export G-code to SD Card / Flash Drive" msgstr "Exporte o G-code para o cartão SD / Flash Drive" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "Exportar bandeja atual como G-code para cartão SD / unidade Flash" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export Plate as &STL" -msgstr "Exportar bandeja como &STL" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export Plate as &STL/OBJ" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export current plate as STL" -msgstr "Exporte a bandeja atual como STL" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export current plate as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export Plate as STL &Including Supports" -msgstr "Exportar Bandeja como STL & Incluindo Suportes" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export Plate as STL/OBJ &Including Supports" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export current plate as STL including supports" -msgstr "Exporte a bandeja atual como o STL que inclui suportes" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export current plate as STL/OBJ including supports" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export &Toolpaths as OBJ" msgstr "Exportar &Percursos como OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export toolpaths as OBJ" msgstr "Exportar percursos como OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export &Config" msgstr "Exportar &config" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export current configuration to file" msgstr "Exporte a config. atual para o arquivo" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export Config &Bundle" msgstr "Exportar coleção &de config" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export all presets to file" msgstr "Exporte todas as predefinições para o arquivo" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export Config Bundle With Physical Printers" msgstr "Exportar coleção &de config com Impressoras Físicas" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export all presets including physical printers to file" msgstr "" "Exporte todas as predefinições, incluindo impressoras físicas, para o arquivo" -#: src/slic3r/GUI/MainFrame.cpp:1270 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "&Export" msgstr "&Exportar" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Ejec&t SD Card / Flash Drive" msgstr "Ejetar cartão SD / Flash Drive" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "Ejetar cartão SD / unidade Flash após G-code for exportado para ele." -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Quick Slice" msgstr "Fatiamento rápido" -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Slice a file into a G-code" msgstr "Fatiar um arquivo em um G-code" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Quick Slice and Save As" msgstr "Salvamento rápido e salvar como" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Slice a file into a G-code, save as" msgstr "Fatiar um arquivo em um G-code, salvar como" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat Last Quick Slice" msgstr "Repetir Último Fatiamento Rápido" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat last quick slice" msgstr "Repetir último fatiamento rápido" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "(Re)Slice No&w" msgstr "(Re)Fatiar ago&ra" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "Start new slicing process" msgstr "Começar novo processo de fatiamento" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "&Repair STL file" msgstr "&Reparar arquivo STL" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "Automatically repair an STL file" msgstr "Reparar automaticamente um arquivo STL" -#: src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:1388 msgid "&G-code Preview" msgstr "Visualizar &G-code" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1392 +msgid "E&xit" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1392 src/slic3r/GUI/UpdateDialogs.cpp:376 +#: src/slic3r/GUI/UpdateDialogs.cpp:423 +#, c-format, boost-format +msgid "Exit %s" +msgstr "Saída %s" + +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 msgid "&Quit" msgstr "&Sair" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 #, c-format, boost-format msgid "Quit %s" msgstr "Sair %s" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1410 msgid "&Select All" msgstr "&Selecionar tudo" -#: src/slic3r/GUI/MainFrame.cpp:1327 +#: src/slic3r/GUI/MainFrame.cpp:1411 msgid "Selects all objects" msgstr "Selecionar todos os objetos" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1413 msgid "D&eselect All" msgstr "D&esmarcar todos" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1414 msgid "Deselects all objects" msgstr "Deselecionar todos os objetos" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1417 msgid "&Delete Selected" msgstr "&Excluir selecionados" -#: src/slic3r/GUI/MainFrame.cpp:1334 +#: src/slic3r/GUI/MainFrame.cpp:1418 msgid "Deletes the current selection" msgstr "Excluir a seleção atual" -#: src/slic3r/GUI/MainFrame.cpp:1336 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Delete &All" msgstr "Deletar &Tudo" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1421 msgid "Deletes all objects" msgstr "Excluir todos os objetos" -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1425 msgid "&Undo" msgstr "&Desfazer" -#: src/slic3r/GUI/MainFrame.cpp:1344 +#: src/slic3r/GUI/MainFrame.cpp:1428 msgid "&Redo" msgstr "&Refazer" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1433 msgid "&Copy" msgstr "&Copiar" -#: src/slic3r/GUI/MainFrame.cpp:1350 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Copy selection to clipboard" msgstr "Copiar seleção para a área de transferência" -#: src/slic3r/GUI/MainFrame.cpp:1352 +#: src/slic3r/GUI/MainFrame.cpp:1436 msgid "&Paste" msgstr "&Colar" -#: src/slic3r/GUI/MainFrame.cpp:1353 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "Paste clipboard" msgstr "Colar área de transferência" -#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 -#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 +#: src/slic3r/GUI/MainFrame.cpp:1442 src/slic3r/GUI/MainFrame.cpp:1446 +#: src/slic3r/GUI/MainFrame.cpp:1615 src/slic3r/GUI/MainFrame.cpp:1619 msgid "Re&load from Disk" msgstr "Re&carregar do disco" -#: src/slic3r/GUI/MainFrame.cpp:1368 +#: src/slic3r/GUI/MainFrame.cpp:1452 msgid "Searc&h" msgstr "Pesquisa&r" -#: src/slic3r/GUI/MainFrame.cpp:1369 +#: src/slic3r/GUI/MainFrame.cpp:1453 msgid "Search in settings" msgstr "Procurar em configurações" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "&Plater Tab" msgstr "&Bandeja" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "Show the plater" msgstr "Mostrar a bandeja" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "P&rint Settings Tab" msgstr "C&onfig. de impressão" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "Show the print settings" msgstr "Mostrar as config. de impressão" -#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1469 src/slic3r/GUI/MainFrame.cpp:1679 msgid "&Filament Settings Tab" msgstr "&Config. de filamentos" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1469 msgid "Show the filament settings" msgstr "Mostrar as config. de filamento" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Print&er Settings Tab" msgstr "A&ba de config. da impressora" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Show the printer settings" msgstr "Mostrar as config. da impressora" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "3&D" msgstr "3&D" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "Show the 3D editing view" msgstr "Mostrar a vista de edição 3D" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Pre&view" msgstr "Pre&visualização" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Show the 3D slices preview" msgstr "Mostrar a pré-visualização do fatiamento 3D" -#: src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/MainFrame.cpp:1488 msgid "Open the dialog to modify shape gallery" msgstr "Abra a caixa de diálogo para modificar a galeria de formas" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Print &Host Upload Queue" msgstr "Imprimir &Fila de upload do Host" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Display the Print Host Upload Queue window" msgstr "Exibir a janela fila de upload do host de impressão" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open New Instance" msgstr "Abrir Nova Instância" -#: src/slic3r/GUI/MainFrame.cpp:1424 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 +#: src/slic3r/GUI/MainFrame.cpp:1507 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1727 msgid "Compare Presets" msgstr "Comparar predefinições" -#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/MainFrame.cpp:1507 msgid "Compare presets" msgstr "Comparar predefinições" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show &Labels" msgstr "Mostrar &rótulos" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show object/instance labels in 3D scene" msgstr "Mostrar rótulos de objeto/instância em cena 3D" -#: src/slic3r/GUI/MainFrame.cpp:1437 +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show Legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show legend in preview" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1523 msgid "&Collapse Sidebar" msgstr "&Recolher barra lateral" -#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1523 src/slic3r/GUI/Plater.cpp:2347 msgid "Collapse sidebar" msgstr "Recolher barra lateral" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "&Fullscreen" msgstr "&Tela cheia" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "Fullscreen" msgstr "Tela cheia" -#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1543 src/slic3r/GUI/MainFrame.cpp:1650 msgid "&File" msgstr "&Arquivo" -#: src/slic3r/GUI/MainFrame.cpp:1458 +#: src/slic3r/GUI/MainFrame.cpp:1544 msgid "&Edit" msgstr "&Editar" -#: src/slic3r/GUI/MainFrame.cpp:1459 +#: src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Window" msgstr "&Janela" -#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 +#: src/slic3r/GUI/MainFrame.cpp:1546 src/slic3r/GUI/MainFrame.cpp:1651 msgid "&View" msgstr "&Vista" -#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 +#: src/slic3r/GUI/MainFrame.cpp:1549 src/slic3r/GUI/MainFrame.cpp:1654 msgid "&Help" msgstr "&Ajuda" -#: src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/MainFrame.cpp:1611 msgid "&Open G-code" msgstr "&Abrir G-code" -#: src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open &PrusaSlicer" msgstr "Abrir &PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legend" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1676 msgid "E&xport" msgstr "E&xportar" -#: src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end to print" msgstr "E&nviar para impressora" -#: src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1679 msgid "Mate&rial Settings Tab" msgstr "A&ba de config. de material" -#: src/slic3r/GUI/MainFrame.cpp:1613 +#: src/slic3r/GUI/MainFrame.cpp:1703 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Escolha um arquivo para fatiar (STL/OBJ/AMF/3MF/PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1625 +#: src/slic3r/GUI/MainFrame.cpp:1715 msgid "No previously sliced file." msgstr "Sem arquivo fatiado anteriormente." -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid "Previously sliced file (" msgstr "Arquivo fatiado anteriormente (" -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid ") not found." msgstr ") não encontrado." -#: src/slic3r/GUI/MainFrame.cpp:1633 +#: src/slic3r/GUI/MainFrame.cpp:1723 msgid "File Not Found" msgstr "Arquivo não encontrado" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 #, c-format, boost-format msgid "Save %s file as:" msgstr "Salve o arquivo %s como:" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "G-code" msgstr "G-code" -#: src/slic3r/GUI/MainFrame.cpp:1680 +#: src/slic3r/GUI/MainFrame.cpp:1770 msgid "Save zip file as:" msgstr "Salvar arquivo compactado(zip) como:" -#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6064 src/slic3r/GUI/Tab.cpp:1666 -#: src/slic3r/GUI/Tab.cpp:4730 +#: src/slic3r/GUI/MainFrame.cpp:1779 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6654 src/slic3r/GUI/Tab.cpp:1628 +#: src/slic3r/GUI/Tab.cpp:4986 msgid "Slicing" msgstr "Fatiamento" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1691 +#: src/slic3r/GUI/MainFrame.cpp:1781 #, c-format, boost-format msgid "Processing %s" msgstr "Processando %s" -#: src/slic3r/GUI/MainFrame.cpp:1714 +#: src/slic3r/GUI/MainFrame.cpp:1804 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% foi fatiado com sucesso." -#: src/slic3r/GUI/MainFrame.cpp:1717 +#: src/slic3r/GUI/MainFrame.cpp:1807 msgid "Slicing Done!" msgstr "Fatiamento completo!" -#: src/slic3r/GUI/MainFrame.cpp:1733 +#: src/slic3r/GUI/MainFrame.cpp:1823 msgid "Select the STL file to repair:" msgstr "Selecione o arquivo STL para corrigir:" -#: src/slic3r/GUI/MainFrame.cpp:1743 +#: src/slic3r/GUI/MainFrame.cpp:1833 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "" "Salvar arquivo OBJ (menos propenso a erros de coordenada que STL) como:" -#: src/slic3r/GUI/MainFrame.cpp:1754 +#: src/slic3r/GUI/MainFrame.cpp:1844 msgid "Your file was repaired." msgstr "Seu arquivo foi corrigido." -#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4528 +#: src/slic3r/GUI/MainFrame.cpp:1844 src/libslic3r/PrintConfig.cpp:4694 msgid "Repair" msgstr "Corrigir" -#: src/slic3r/GUI/MainFrame.cpp:1768 +#: src/slic3r/GUI/MainFrame.cpp:1858 msgid "Save configuration as:" msgstr "Salvar config. como:" -#: src/slic3r/GUI/MainFrame.cpp:1785 +#: src/slic3r/GUI/MainFrame.cpp:1875 msgid "Loading of a configuration file" msgstr "Carregando um arquivo de configuração" -#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 +#: src/slic3r/GUI/MainFrame.cpp:1877 src/slic3r/GUI/MainFrame.cpp:1944 msgid "Select configuration to load:" msgstr "Selecionar config. para carregar:" -#: src/slic3r/GUI/MainFrame.cpp:1816 +#: src/slic3r/GUI/MainFrame.cpp:1908 msgid "Exporting configuration bundle" msgstr "Exportando pacote de configuração" -#: src/slic3r/GUI/MainFrame.cpp:1817 +#: src/slic3r/GUI/MainFrame.cpp:1909 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." @@ -6406,15 +7721,15 @@ msgstr "" "Algumas predefinições forma modificadas e as alterações não salvas não serão " "exportadas para pacote de configuração." -#: src/slic3r/GUI/MainFrame.cpp:1826 +#: src/slic3r/GUI/MainFrame.cpp:1918 msgid "Save presets bundle as:" msgstr "Salvar pacote de predefinições como:" -#: src/slic3r/GUI/MainFrame.cpp:1849 +#: src/slic3r/GUI/MainFrame.cpp:1941 msgid "Loading of a configuration bundle" msgstr "Carregando um pacote de configuração" -#: src/slic3r/GUI/MainFrame.cpp:1879 +#: src/slic3r/GUI/MainFrame.cpp:1971 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d predefinições importadas com êxito." @@ -6483,19 +7798,19 @@ msgstr "%s info" msgid "%s information" msgstr "Informação do %s" -#: src/slic3r/GUI/NotificationManager.hpp:752 +#: src/slic3r/GUI/NotificationManager.hpp:899 msgid "3D Mouse disconnected." msgstr "Mouse 3D desconectado." -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "Configuration update is available." msgstr "A atualização de config. está disponível." -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "See more." msgstr "Ver mais." -#: src/slic3r/GUI/NotificationManager.hpp:761 +#: src/slic3r/GUI/NotificationManager.hpp:908 msgid "" "You have just added a G-code for color change, but its value is empty.\n" "To export the G-code correctly, check the \"Color Change G-code\" in " @@ -6506,7 +7821,7 @@ msgstr "" "Para exportar o G-code corretamente, verifique o \"G-code de mudança de cor" "\" em \"Configurações da impressora> G-code personalizado\"" -#: src/slic3r/GUI/NotificationManager.hpp:764 +#: src/slic3r/GUI/NotificationManager.hpp:911 msgid "" "No color change event was added to the print. The print does not look like a " "sign." @@ -6514,144 +7829,187 @@ msgstr "" "Nenhum evento de mudança de cor foi adicionado à impressão. A impressão não " "se parece com um sinal." -#: src/slic3r/GUI/NotificationManager.hpp:766 +#: src/slic3r/GUI/NotificationManager.hpp:913 msgid "Desktop integration was successful." msgstr "A integração da área de trabalho foi bem-sucedida." -#: src/slic3r/GUI/NotificationManager.hpp:768 +#: src/slic3r/GUI/NotificationManager.hpp:915 msgid "Desktop integration failed." msgstr "Falha na integração da área de trabalho." -#: src/slic3r/GUI/NotificationManager.hpp:770 +#: src/slic3r/GUI/NotificationManager.hpp:917 msgid "Undo desktop integration was successful." msgstr "Desfazer a integração da área de trabalho foi bem-sucedida." -#: src/slic3r/GUI/NotificationManager.hpp:772 +#: src/slic3r/GUI/NotificationManager.hpp:919 msgid "Undo desktop integration failed." msgstr "Falha ao desfazer a integração da área de trabalho." -#: src/slic3r/GUI/NotificationManager.hpp:773 +#: src/slic3r/GUI/NotificationManager.hpp:920 msgid "Exporting." msgstr "Exportando." -#: src/slic3r/GUI/NotificationManager.cpp:664 +#: src/slic3r/GUI/NotificationManager.hpp:924 +msgid "" +"PrusaSlicer recieved a download request from Printables.com, but it's not " +"allowed. You can allow it" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:925 +msgid "here." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:773 msgid "Open Folder." msgstr "Abrir pasta." -#: src/slic3r/GUI/NotificationManager.cpp:701 +#: src/slic3r/GUI/NotificationManager.cpp:811 msgid "Eject drive" msgstr "Ejetar unidade" -#: src/slic3r/GUI/NotificationManager.cpp:885 +#: src/slic3r/GUI/NotificationManager.cpp:1054 +#: src/slic3r/GUI/NotificationManager.cpp:1267 +#: src/slic3r/GUI/NotificationManager.cpp:1472 msgid "ERROR" msgstr "ERRO" -#: src/slic3r/GUI/NotificationManager.cpp:890 -msgid "CANCELED" -msgstr "CANCELADO" - -#: src/slic3r/GUI/NotificationManager.cpp:895 +#: src/slic3r/GUI/NotificationManager.cpp:1269 +#: src/slic3r/GUI/NotificationManager.cpp:1377 msgid "COMPLETED" msgstr "CONCLUÍDO" -#: src/slic3r/GUI/NotificationManager.cpp:937 +#: src/slic3r/GUI/NotificationManager.cpp:1467 +msgid "RESOLVING ADDRESS" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:1477 +msgid "CANCELED" +msgstr "CANCELADO" + +#: src/slic3r/GUI/NotificationManager.cpp:1539 msgid "Cancel upload" msgstr "Cancelar upload" -#: src/slic3r/GUI/NotificationManager.cpp:996 +#: src/slic3r/GUI/NotificationManager.cpp:1648 #, c-format, boost-format msgid "%1$d object was loaded with custom supports." msgid_plural "%1$d objects were loaded with custom supports." msgstr[0] "O objeto %1$d foi carregado com suportes personalizados." msgstr[1] "%1$d objetos foram carregados com suportes personalizados." -#: src/slic3r/GUI/NotificationManager.cpp:997 +#: src/slic3r/GUI/NotificationManager.cpp:1649 #, c-format, boost-format msgid "%1$d object was loaded with custom seam." msgid_plural "%1$d objects were loaded with custom seam." msgstr[0] "O objeto %1$d foi carregado com costura personalizada." msgstr[1] "%1$d objetos foram carregados com costura personalizada." -#: src/slic3r/GUI/NotificationManager.cpp:998 +#: src/slic3r/GUI/NotificationManager.cpp:1650 #, c-format, boost-format msgid "%1$d object was loaded with multimaterial painting." msgid_plural "%1$d objects were loaded with multimaterial painting." msgstr[0] "%1$d objeto foi carregado com pintura multimaterial." msgstr[1] "%1$d objetos foram carregados com pintura multimaterial." -#: src/slic3r/GUI/NotificationManager.cpp:999 +#: src/slic3r/GUI/NotificationManager.cpp:1651 #, c-format, boost-format msgid "%1$d object was loaded with variable layer height." msgid_plural "%1$d objects were loaded with variable layer height." msgstr[0] "O objeto %1$d foi carregado com altura de camada variável." msgstr[1] "%1$d objetos foram carregados com altura de camada variável." -#: src/slic3r/GUI/NotificationManager.cpp:1000 +#: src/slic3r/GUI/NotificationManager.cpp:1652 #, c-format, boost-format msgid "%1$d object was loaded with partial sinking." msgid_plural "%1$d objects were loaded with partial sinking." msgstr[0] "O objeto %1$d foi carregado com afundamento parcial." msgstr[1] "%1$d objetos foram carregados com afundamento parcial." -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1653 +#, c-format, boost-format +msgid "%1$d object was loaded as a part of cut object." +msgid_plural "%1$d objects were loaded as parts of cut object" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Slicing finished." msgstr "Fatiamento pronto." -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export G-Code." msgstr "Exportar G-code." -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export." msgstr "Exportar." -#: src/slic3r/GUI/NotificationManager.cpp:1447 -#: src/slic3r/GUI/NotificationManager.cpp:1454 -#: src/slic3r/GUI/NotificationManager.cpp:1470 -#: src/slic3r/GUI/NotificationManager.cpp:1476 -#: src/slic3r/GUI/NotificationManager.cpp:1547 +#: src/slic3r/GUI/NotificationManager.cpp:2101 +#: src/slic3r/GUI/NotificationManager.cpp:2108 +#: src/slic3r/GUI/NotificationManager.cpp:2124 +#: src/slic3r/GUI/NotificationManager.cpp:2130 +#: src/slic3r/GUI/NotificationManager.cpp:2201 msgid "ERROR:" msgstr "ERRO:" -#: src/slic3r/GUI/NotificationManager.cpp:1459 -#: src/slic3r/GUI/NotificationManager.cpp:1486 -#: src/slic3r/GUI/NotificationManager.cpp:1494 -#: src/slic3r/GUI/NotificationManager.cpp:1505 src/slic3r/GUI/Plater.cpp:3197 +#: src/slic3r/GUI/NotificationManager.cpp:2113 +#: src/slic3r/GUI/NotificationManager.cpp:2140 +#: src/slic3r/GUI/NotificationManager.cpp:2148 +#: src/slic3r/GUI/NotificationManager.cpp:2159 src/slic3r/GUI/Plater.cpp:3220 msgid "WARNING:" msgstr "AVISO:" -#: src/slic3r/GUI/NotificationManager.cpp:1598 +#: src/slic3r/GUI/NotificationManager.cpp:2275 msgid "Exporting finished." msgstr "Exportação finalizada." -#: src/slic3r/GUI/ObjectDataViewModel.cpp:50 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 msgid "Paint-on seam" msgstr "Costura de pintura" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:52 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:68 +msgid "Cut connectors" +msgstr "" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:70 msgid "Sinking" msgstr "Afundar" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:110 msgid "Instances" msgstr "Instâncias" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:98 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:266 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:114 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:275 #, c-format, boost-format msgid "Instance %d" msgstr "Instância %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4568 -#: src/slic3r/GUI/Tab.cpp:4659 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:121 src/slic3r/GUI/Tab.cpp:4805 +#: src/slic3r/GUI/Tab.cpp:4942 msgid "Layers" msgstr "Camadas" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 msgid "Range" msgstr "Intervalo" -#: src/slic3r/GUI/OpenGLManager.cpp:258 +#: src/slic3r/GUI/OpenGLManager.cpp:376 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL ES 2.0 capable graphics driver to run " +"correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:379 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL %s capable graphics driver to run correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:382 #, c-format, boost-format msgid "" "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" @@ -6660,11 +8018,11 @@ msgstr "" "PrusaSlicer requer drivers capazes de executar OpenGL 2.0, \n" "enquanto a versão do OpenGL %s, renderização %s, fornecedor %s foi detectada." -#: src/slic3r/GUI/OpenGLManager.cpp:261 +#: src/slic3r/GUI/OpenGLManager.cpp:386 msgid "You may need to update your graphics card driver." msgstr "Você pode ter que atualizar os drivers da sua placa de vídeo." -#: src/slic3r/GUI/OpenGLManager.cpp:264 +#: src/slic3r/GUI/OpenGLManager.cpp:389 msgid "" "As a workaround, you may run PrusaSlicer with a software rendered 3D " "graphics by running prusa-slicer.exe with the --sw-renderer parameter." @@ -6673,11 +8031,11 @@ msgstr "" "renderizado em 3D gráficos executando prusa-slicer.exe com o parâmetro --sw-" "renderer." -#: src/slic3r/GUI/OpenGLManager.cpp:266 +#: src/slic3r/GUI/OpenGLManager.cpp:391 msgid "Unsupported OpenGL version" msgstr "Versão do OpenGL não suportada" -#: src/slic3r/GUI/OpenGLManager.cpp:274 +#: src/slic3r/GUI/OpenGLManager.cpp:399 #, c-format, boost-format msgid "" "Unable to load the following shaders:\n" @@ -6686,16 +8044,20 @@ msgstr "" "E tem as seguintes alterações não salvas:\n" "%s" -#: src/slic3r/GUI/OpenGLManager.cpp:275 +#: src/slic3r/GUI/OpenGLManager.cpp:400 msgid "Error loading shaders" msgstr "Erro carregando shaders" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:126 +msgid "Unavailable for this method." +msgstr "" + +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Top" msgstr "Topo" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Bottom" msgstr "Base" @@ -6704,7 +8066,7 @@ msgstr "Base" msgid "Delete this preset from this printer device" msgstr "Deletar predefinição desta impressora" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:83 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:84 msgid "This printer will be shown in the presets list as" msgstr "Esta impressora será na lista de predefinição como" @@ -6720,31 +8082,31 @@ msgstr "Nome descritivo para a impressora" msgid "Add preset for this printer device" msgstr "Adicionar predefinição para esta impressora" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2255 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2239 msgid "Print Host upload" msgstr "Upload do host de impressão" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:268 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:271 msgid "Connection to printers connected via the print host failed." msgstr "Conexão das impressoras via host de impressão falhou." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:310 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:313 msgid "Test" msgstr "Teste" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:315 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:318 msgid "Could not get a valid Printer Host reference" msgstr "Não foi possível obter uma referência de host de impressora válida" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:330 msgid "Success!" msgstr "Sucesso!" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:337 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:340 msgid "Refresh Printers" msgstr "Atualizar Impressoras" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:367 msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." @@ -6752,22 +8114,22 @@ msgstr "" "O arquivo HTTPS CA é opcional. Só é necessário se você usar HTTPS com um " "certificado auto-assinado." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:374 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:377 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "" "Arquivos de certificado (*. CRT, *. pem) | *. CRT; *. pem | Todos os " "arquivos | *. *" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:378 msgid "Open CA certificate file" msgstr "Abra o arquivo de certificado da CA" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:404 -#: src/libslic3r/PrintConfig.cpp:330 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:407 +#: src/libslic3r/PrintConfig.cpp:343 msgid "HTTPS CA File" msgstr "Arquivo de CA HTTPS" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:405 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:408 #, c-format, boost-format msgid "" "On this system, %s uses HTTPS certificates from the system Certificate Store " @@ -6776,7 +8138,7 @@ msgstr "" "Neste sistema, %s usa certificados HTTPS do sistema Certificate Store ou " "keychain." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:406 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:409 msgid "" "To use a custom CA file, please import your CA file into Certificate Store / " "Keychain." @@ -6784,24 +8146,24 @@ msgstr "" "Para usar um arquivo de CA personalizado, importe seu arquivo de CA para o " "repositório de certificados/chaveiro." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:634 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:706 msgid "The supplied name is empty. It can't be saved." msgstr "O nome fornecido está vazio. Não pode ser salvo." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:638 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:710 msgid "You have to enter a printer name." msgstr "Você precisa introduzir um nome de impressora." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:646 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:718 #, boost-format msgid "Printer with name \"%1%\" already exists." msgstr "Impressora com nome \"%1%\" já existe." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:647 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:719 msgid "Replace?" msgstr "Substituir?" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:674 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:746 #, boost-format msgid "" "Following printer preset is duplicated:%1%The above preset for printer \"%2%" @@ -6812,20 +8174,20 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:724 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:796 msgid "It's not possible to delete the last related preset for the printer." msgstr "" "Não é possível excluir a última predefinição relacionada para a impressora." -#: src/slic3r/GUI/Plater.cpp:141 +#: src/slic3r/GUI/Plater.cpp:158 msgid "The provided name is not valid;" msgstr "O nome fornecido não é válido;" -#: src/slic3r/GUI/Plater.cpp:142 src/slic3r/GUI/SavePresetDialog.cpp:102 +#: src/slic3r/GUI/Plater.cpp:159 src/slic3r/GUI/SavePresetDialog.cpp:166 msgid "the following characters are not allowed:" msgstr "os seguintes caracteres não são permitidos:" -#: src/slic3r/GUI/Plater.cpp:207 +#: src/slic3r/GUI/Plater.cpp:223 msgid "" "For a multipart object, this value isn't accurate.\n" "It doesn't take account of intersections and negative volumes." @@ -6833,69 +8195,69 @@ msgstr "" "Para um objeto de várias partes, este valor não é preciso.\n" "Não leva em conta interseções e volumes negativos." -#: src/slic3r/GUI/Plater.cpp:211 +#: src/slic3r/GUI/Plater.cpp:227 msgid "Volume" msgstr "Volume" -#: src/slic3r/GUI/Plater.cpp:213 +#: src/slic3r/GUI/Plater.cpp:229 msgid "Facets" msgstr "Faces" -#: src/slic3r/GUI/Plater.cpp:276 +#: src/slic3r/GUI/Plater.cpp:286 msgid "Sliced Info" msgstr "Informações fatiadas" -#: src/slic3r/GUI/Plater.cpp:296 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:306 src/slic3r/GUI/Plater.cpp:1414 msgid "Used Filament (g)" msgstr "Filamento utilizado (g)" -#: src/slic3r/GUI/Plater.cpp:297 src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:307 src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (m)" msgstr "Filamento utilizado (m)" -#: src/slic3r/GUI/Plater.cpp:298 src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:308 src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (mm³)" msgstr "Filamento utilizado (mm³)" -#: src/slic3r/GUI/Plater.cpp:299 +#: src/slic3r/GUI/Plater.cpp:309 msgid "Used Material (unit)" msgstr "Material utilizado (unidade)" -#: src/slic3r/GUI/Plater.cpp:300 +#: src/slic3r/GUI/Plater.cpp:310 msgid "Cost (money)" msgstr "Custo (dinheiro)" -#: src/slic3r/GUI/Plater.cpp:301 src/slic3r/GUI/Plater.cpp:1340 -#: src/slic3r/GUI/Plater.cpp:1427 +#: src/slic3r/GUI/Plater.cpp:311 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:1464 msgid "Estimated printing time" msgstr "Tempo estimado de impressão" -#: src/slic3r/GUI/Plater.cpp:302 +#: src/slic3r/GUI/Plater.cpp:312 msgid "Number of tool changes" msgstr "Número de mudanças de ferramenta" -#: src/slic3r/GUI/Plater.cpp:431 +#: src/slic3r/GUI/Plater.cpp:437 msgid "Select what kind of support do you need" msgstr "Selecione o tipo de suporte que você precisa" -#: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2590 -#: src/libslic3r/PrintConfig.cpp:3645 +#: src/slic3r/GUI/Plater.cpp:440 src/libslic3r/PrintConfig.cpp:2620 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "Support on build plate only" msgstr "Suportes somente na mesa de impressão" -#: src/slic3r/GUI/Plater.cpp:434 src/slic3r/GUI/Plater.cpp:564 +#: src/slic3r/GUI/Plater.cpp:441 msgid "For support enforcers only" msgstr "Para apenas reforçadores de suporte" -#: src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Plater.cpp:442 msgid "Everywhere" msgstr "Em toda parte" -#: src/slic3r/GUI/Plater.cpp:467 src/slic3r/GUI/Tab.cpp:1542 +#: src/slic3r/GUI/Plater.cpp:475 src/slic3r/GUI/Tab.cpp:1489 msgid "Brim" msgstr "Aba" -#: src/slic3r/GUI/Plater.cpp:469 +#: src/slic3r/GUI/Plater.cpp:477 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." @@ -6903,116 +8265,113 @@ msgstr "" "Este sinalizador permite que a aba que será impressa em torno de cada objeto " "na primeira camada." -#: src/slic3r/GUI/Plater.cpp:477 +#: src/slic3r/GUI/Plater.cpp:485 msgid "Purging volumes" msgstr "Volumes de purga" -#: src/slic3r/GUI/Plater.cpp:578 +#: src/slic3r/GUI/Plater.cpp:592 msgid "Select what kind of pad do you need" msgstr "Selecione o tipo de bloco que você precisa" -#: src/slic3r/GUI/Plater.cpp:580 +#: src/slic3r/GUI/Plater.cpp:595 msgid "Below object" msgstr "Abaixo do objeto" -#: src/slic3r/GUI/Plater.cpp:581 +#: src/slic3r/GUI/Plater.cpp:596 msgid "Around object" msgstr "Em torno do objeto" -#: src/slic3r/GUI/Plater.cpp:894 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/Plater.cpp:929 src/slic3r/GUI/Plater.cpp:7162 msgid "Send to printer" msgstr "Enviar para a impressora" -#: src/slic3r/GUI/Plater.cpp:914 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6067 +#: src/slic3r/GUI/Plater.cpp:949 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6657 msgid "Slice now" msgstr "Fatiar agora" -#: src/slic3r/GUI/Plater.cpp:1087 +#: src/slic3r/GUI/Plater.cpp:1127 msgid "Hold Shift to Slice & Export G-code" msgstr "Hold Shift to Slice & Export G-code" -#: src/slic3r/GUI/Plater.cpp:1287 +#: src/slic3r/GUI/Plater.cpp:1324 #, boost-format msgid "%1% (%2$d shell)" msgid_plural "%1% (%2$d shells)" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:1315 +#: src/slic3r/GUI/Plater.cpp:1352 msgid "Used Material (ml)" msgstr "Material usado (ml)" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "object" msgid_plural "objects" msgstr[0] "objeto" msgstr[1] "objetos" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "supports and pad" msgstr "suportes e bloco" -#: src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (in)" msgstr "Filamento utilizado (pol)" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "objects" msgstr "objetos" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "wipe tower" msgstr "torre de limpeza" -#: src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (in³)" msgstr "Filamento utilizado (pol³)" -#: src/slic3r/GUI/Plater.cpp:1396 +#: src/slic3r/GUI/Plater.cpp:1433 #, boost-format msgid "Filament at extruder %1%" msgstr "Filamento na extrusora %1%" -#: src/slic3r/GUI/Plater.cpp:1402 +#: src/slic3r/GUI/Plater.cpp:1439 msgid "(including spool)" msgstr "(incluindo carretel)" -#: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1072 -#: src/libslic3r/PrintConfig.cpp:3439 src/libslic3r/PrintConfig.cpp:3440 +#: src/slic3r/GUI/Plater.cpp:1448 src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:3716 src/libslic3r/PrintConfig.cpp:3717 msgid "Cost" msgstr "Custo" -#: src/slic3r/GUI/Plater.cpp:1429 +#: src/slic3r/GUI/Plater.cpp:1466 msgid "normal mode" msgstr "modo normal" -#: src/slic3r/GUI/Plater.cpp:1436 +#: src/slic3r/GUI/Plater.cpp:1473 msgid "stealth mode" msgstr "modo silencioso" -#: src/slic3r/GUI/Plater.cpp:1670 -msgid "Fill bed" -msgstr "Preencher mesa" - -#: src/slic3r/GUI/Plater.cpp:1676 -msgid "Optimize Rotation" -msgstr "Otimize a rotação" - -#: src/slic3r/GUI/Plater.cpp:1682 -msgid "Import SLA archive" -msgstr "Importar arquivo SLA" - -#: src/slic3r/GUI/Plater.cpp:1725 +#: src/slic3r/GUI/Plater.cpp:1734 #, boost-format msgid "Do you want to save the changes to \"%1%\"?" msgstr "Deseja salvar as alterações em \"%1%\"?" -#: src/slic3r/GUI/Plater.cpp:1730 src/slic3r/GUI/Preferences.cpp:222 +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:905 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1599 +msgid "Save" +msgstr "Salvar" + +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +msgid "Discard" +msgstr "Descartar" + +#: src/slic3r/GUI/Plater.cpp:1740 src/slic3r/GUI/Preferences.cpp:354 msgid "Ask for unsaved changes in project" msgstr "Questionar sobre alterações não salvas no projeto" -#: src/slic3r/GUI/Plater.cpp:1733 +#: src/slic3r/GUI/Plater.cpp:1743 msgid "" "You will not be asked about it again, when: \n" "- Closing PrusaSlicer,\n" @@ -7022,7 +8381,7 @@ msgstr "" "- Fechando o PrusaSlicer,\n" "- Carregando ou criando um novo projeto" -#: src/slic3r/GUI/Plater.cpp:2198 +#: src/slic3r/GUI/Plater.cpp:2214 #, c-format, boost-format msgid "" "Successfully unmounted. The device %s(%s) can now be safely removed from the " @@ -7031,20 +8390,20 @@ msgstr "" "Desmontado com sucesso. O dispositivo %s(%s) agora pode ser removido com " "segurança do computador." -#: src/slic3r/GUI/Plater.cpp:2203 +#: src/slic3r/GUI/Plater.cpp:2220 #, c-format, boost-format msgid "Ejecting of device %s(%s) has failed." msgstr "Ejetar o dispositivo %s(%s) falhou." -#: src/slic3r/GUI/Plater.cpp:2222 src/slic3r/GUI/Plater.cpp:5108 +#: src/slic3r/GUI/Plater.cpp:2239 src/slic3r/GUI/Plater.cpp:5199 msgid "New Project" msgstr "Novo projeto" -#: src/slic3r/GUI/Plater.cpp:2319 +#: src/slic3r/GUI/Plater.cpp:2346 msgid "Expand sidebar" msgstr "Expandir barra lateral" -#: src/slic3r/GUI/Plater.cpp:2518 +#: src/slic3r/GUI/Plater.cpp:2428 msgid "" "The preset below was temporarily installed on the active instance of " "PrusaSlicer" @@ -7054,13 +8413,13 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:2548 +#: src/slic3r/GUI/Plater.cpp:2583 #, boost-format msgid "Failed loading file \"%1%\" due to an invalid configuration." msgstr "" "Falha ao carregar o arquivo \"%1%\" devido a uma configuração inválida." -#: src/slic3r/GUI/Plater.cpp:2568 +#: src/slic3r/GUI/Plater.cpp:2603 #, c-format, boost-format msgid "" "Object size from file %s appears to be zero.\n" @@ -7071,11 +8430,11 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:2572 +#: src/slic3r/GUI/Plater.cpp:2607 msgid "The size of the object is zero" msgstr "O tamanho do objeto é zero" -#: src/slic3r/GUI/Plater.cpp:2585 +#: src/slic3r/GUI/Plater.cpp:2620 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in meters.\n" @@ -7088,16 +8447,16 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:2589 src/slic3r/GUI/Plater.cpp:2611 +#: src/slic3r/GUI/Plater.cpp:2624 src/slic3r/GUI/Plater.cpp:2646 msgid "The object is too small" msgstr "O objeto é muito pequeno" -#: src/slic3r/GUI/Plater.cpp:2590 src/slic3r/GUI/Plater.cpp:2612 +#: src/slic3r/GUI/Plater.cpp:2625 src/slic3r/GUI/Plater.cpp:2647 msgid "Apply to all the remaining small objects being loaded." msgstr "" "Aplica-se a todos os objetos pequenos restantes que estão sendo carregados." -#: src/slic3r/GUI/Plater.cpp:2607 +#: src/slic3r/GUI/Plater.cpp:2642 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in inches.\n" @@ -7117,7 +8476,7 @@ msgstr[1] "" "A unidade interna do PrusaSlicer é um milímetro. Deseja recalcular as " "dimensões desses objetos?" -#: src/slic3r/GUI/Plater.cpp:2625 +#: src/slic3r/GUI/Plater.cpp:2659 msgid "" "This file contains several objects positioned at multiple heights.\n" "Instead of considering them as multiple objects, should \n" @@ -7127,11 +8486,11 @@ msgstr "" "Em vez de considerá-los como vários objetos, deve-se \n" "o arquivo ser carregado como um único objeto com várias partes?" -#: src/slic3r/GUI/Plater.cpp:2628 src/slic3r/GUI/Plater.cpp:2683 +#: src/slic3r/GUI/Plater.cpp:2662 src/slic3r/GUI/Plater.cpp:2711 msgid "Multi-part object detected" msgstr "Objeto de várias partes detectado" -#: src/slic3r/GUI/Plater.cpp:2636 +#: src/slic3r/GUI/Plater.cpp:2669 msgid "" "This file cannot be loaded in a simple mode. Do you want to switch to an " "advanced mode?" @@ -7139,20 +8498,11 @@ msgstr "" "Este arquivo não pode ser carregado em um modo simples. Deseja mudar para um " "modo avançado?" -#: src/slic3r/GUI/Plater.cpp:2637 +#: src/slic3r/GUI/Plater.cpp:2670 msgid "Detected advanced data" msgstr "Dados avançados detectados" -#: src/slic3r/GUI/Plater.cpp:2657 -#, c-format, boost-format -msgid "" -"You can't to add the object(s) from %s because of one or some of them " -"is(are) multi-part" -msgstr "" -"Você não pode adicionar o objeto (s) %s por causa de um ou alguns deles é " -"(são) de várias partes" - -#: src/slic3r/GUI/Plater.cpp:2680 +#: src/slic3r/GUI/Plater.cpp:2708 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" @@ -7162,7 +8512,7 @@ msgstr "" "Em vez de considerá-los como múltiplos objetos, devo considerar\n" "esses arquivos para representar um único objeto com várias partes?" -#: src/slic3r/GUI/Plater.cpp:2799 +#: src/slic3r/GUI/Plater.cpp:2827 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." @@ -7170,39 +8520,54 @@ msgstr "" "Seu objeto parece ser muito grande, por isso foi automaticamente " "dimensionado para baixo para caber sua mesa de impressão." -#: src/slic3r/GUI/Plater.cpp:2800 +#: src/slic3r/GUI/Plater.cpp:2828 msgid "Object too large?" msgstr "Objeto muito grande?" -#: src/slic3r/GUI/Plater.cpp:2878 +#: src/slic3r/GUI/Plater.cpp:2908 msgid "Export STL file:" msgstr "Exportar arquivo STL:" -#: src/slic3r/GUI/Plater.cpp:2885 +#: src/slic3r/GUI/Plater.cpp:2915 msgid "Export AMF file:" msgstr "Exportar arquivo AMF:" -#: src/slic3r/GUI/Plater.cpp:2891 +#: src/slic3r/GUI/Plater.cpp:2921 msgid "Save file as:" msgstr "Salvar arquivo como:" -#: src/slic3r/GUI/Plater.cpp:2897 +#: src/slic3r/GUI/Plater.cpp:2927 msgid "Export OBJ file:" msgstr "Exportar arquivo OBJ:" -#: src/slic3r/GUI/Plater.cpp:2995 +#: src/slic3r/GUI/Plater.cpp:3030 +msgid "Delete object which is a part of cut object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3031 +msgid "" +"You try to delete an object which is a part of a cut object.\n" +"This action will break a cut correspondence.\n" +"After that PrusaSlicer can't guarantee model consistency" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3035 +msgid "Delete object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3040 msgid "Delete Object" msgstr "Excluir objeto" -#: src/slic3r/GUI/Plater.cpp:3007 +#: src/slic3r/GUI/Plater.cpp:3057 msgid "Delete All Objects" msgstr "Excluir Todos os Objetos" -#: src/slic3r/GUI/Plater.cpp:3035 +#: src/slic3r/GUI/Plater.cpp:3086 msgid "Reset Project" msgstr "Redefinir projeto" -#: src/slic3r/GUI/Plater.cpp:3118 +#: src/slic3r/GUI/Plater.cpp:3141 msgid "" "The selected object couldn't be split because it contains only one solid " "part." @@ -7210,15 +8575,15 @@ msgstr "" "O objeto selecionado não pode ser dividido porque contém apenas uma parte " "sólida. " -#: src/slic3r/GUI/Plater.cpp:3125 +#: src/slic3r/GUI/Plater.cpp:3148 msgid "All non-solid parts (modifiers) were deleted" msgstr "Todas as partes não sólidas (modificadores) foram excluídas" -#: src/slic3r/GUI/Plater.cpp:3127 +#: src/slic3r/GUI/Plater.cpp:3150 msgid "Split to Objects" msgstr "Dividir em objetos" -#: src/slic3r/GUI/Plater.cpp:3179 +#: src/slic3r/GUI/Plater.cpp:3202 msgid "" "An object has custom support enforcers which will not be used because " "supports are disabled." @@ -7226,87 +8591,88 @@ msgstr "" "Um objeto tem reforçadores de suporte personalizados que não serão usados " "porque os suportes estão desabilitados." -#: src/slic3r/GUI/Plater.cpp:3181 +#: src/slic3r/GUI/Plater.cpp:3204 msgid "Enable supports for enforcers only" msgstr "Ativar suporte apenas para reforçadores" -#: src/slic3r/GUI/Plater.cpp:3310 src/slic3r/GUI/Plater.cpp:4176 +#: src/slic3r/GUI/Plater.cpp:3339 src/slic3r/GUI/Plater.cpp:4238 msgid "Invalid data" msgstr "Dados inválidos" -#: src/slic3r/GUI/Plater.cpp:3380 +#: src/slic3r/GUI/Plater.cpp:3410 msgid "Another export job is currently running." msgstr "Outro trabalho de exportação está em execução no momento." -#: src/slic3r/GUI/Plater.cpp:3466 +#: src/slic3r/GUI/Plater.cpp:3496 msgid "Replace from:" msgstr "Substituir de:" -#: src/slic3r/GUI/Plater.cpp:3484 +#: src/slic3r/GUI/Plater.cpp:3514 msgid "Unable to replace with more than one volume" msgstr "Não é possível substituir por mais de um volume" -#: src/slic3r/GUI/Plater.cpp:3484 src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3514 src/slic3r/GUI/Plater.cpp:3597 msgid "Error during replace" msgstr "Erro durante a substituição" -#: src/slic3r/GUI/Plater.cpp:3555 +#: src/slic3r/GUI/Plater.cpp:3589 msgid "Select the new file" msgstr "Selecione o novo arquivo" -#: src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3597 msgid "File for the replace wasn't selected" msgstr "O arquivo para a substituição não foi selecionado" -#: src/slic3r/GUI/Plater.cpp:3654 +#: src/slic3r/GUI/Plater.cpp:3684 msgid "Please select the file to reload" msgstr "Selecione o arquivo STL para recarregar" -#: src/slic3r/GUI/Plater.cpp:3685 src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:3715 src/slic3r/GUI/Plater.cpp:5355 +#: src/slic3r/GUI/Plater.cpp:5365 msgid "The selected file" msgstr "O arquivo selecionado" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "differs from the original file" msgstr "difere do arquivo original" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "Do you want to replace it" msgstr "Deseja substituir" -#: src/slic3r/GUI/Plater.cpp:3703 src/slic3r/GUI/Plater.cpp:3709 +#: src/slic3r/GUI/Plater.cpp:3736 src/slic3r/GUI/Plater.cpp:3742 msgid "Reload from:" msgstr "Recarregar a partir do disco:" -#: src/slic3r/GUI/Plater.cpp:3812 +#: src/slic3r/GUI/Plater.cpp:3864 msgid "Unable to reload:" msgstr "Não é possível recarregar:" -#: src/slic3r/GUI/Plater.cpp:3817 +#: src/slic3r/GUI/Plater.cpp:3869 msgid "Error during reload" msgstr "Erro durante a recarga" -#: src/slic3r/GUI/Plater.cpp:3835 +#: src/slic3r/GUI/Plater.cpp:3887 msgid "Reload all from disk" msgstr "Recarregar tudo do disco" -#: src/slic3r/GUI/Plater.cpp:4130 +#: src/slic3r/GUI/Plater.cpp:4191 msgid "There are active warnings concerning sliced models:" msgstr "Existem avisos ativos sobre modelos fatiados:" -#: src/slic3r/GUI/Plater.cpp:4141 +#: src/slic3r/GUI/Plater.cpp:4202 msgid "generated warnings" msgstr "avisos gerados" -#: src/slic3r/GUI/Plater.cpp:4472 +#: src/slic3r/GUI/Plater.cpp:4554 msgid "3D editor view" msgstr "vista do editor 3D" -#: src/slic3r/GUI/Plater.cpp:4893 +#: src/slic3r/GUI/Plater.cpp:4980 msgid "Undo / Redo is processing" msgstr "Desfazer / Refazer está sendo processado" -#: src/slic3r/GUI/Plater.cpp:4895 +#: src/slic3r/GUI/Plater.cpp:4982 #, boost-format msgid "" "Switching the printer technology from %1% to %2%.\n" @@ -7317,21 +8683,21 @@ msgstr "" "Algumas %1% predefinições foram modificadas, e serão perdidas após a troca " "de " -#: src/slic3r/GUI/Plater.cpp:5092 +#: src/slic3r/GUI/Plater.cpp:5184 msgid "Creating a new project while the current project is modified." msgstr "Criando um novo projeto enquanto o projeto atual é modificado." -#: src/slic3r/GUI/Plater.cpp:5095 +#: src/slic3r/GUI/Plater.cpp:5187 msgid "Creating a new project while some presets are modified." msgstr "" "Criando um novo projeto enquanto algumas predefinições são modificadas." -#: src/slic3r/GUI/Plater.cpp:5096 +#: src/slic3r/GUI/Plater.cpp:5188 msgid "You can keep presets modifications to the new project or discard them" msgstr "" "Você pode manter as modificações predefinidas no novo projeto ou descartá-las" -#: src/slic3r/GUI/Plater.cpp:5097 +#: src/slic3r/GUI/Plater.cpp:5189 msgid "" "You can keep presets modifications to the new project, discard them or save " "changes as new presets.\n" @@ -7341,126 +8707,173 @@ msgstr "" "las ou salvá-las muda como novas predefinições.\n" "Observação, se as alterações forem salvas, o novo projeto não as manterá" -#: src/slic3r/GUI/Plater.cpp:5103 +#: src/slic3r/GUI/Plater.cpp:5194 msgid "Creating a new project" msgstr "Criando um novo projeto" -#: src/slic3r/GUI/Plater.cpp:5137 +#: src/slic3r/GUI/Plater.cpp:5228 msgid "Load Project" msgstr "Carregar projeto" -#: src/slic3r/GUI/Plater.cpp:5167 src/slic3r/GUI/Plater.cpp:5432 +#: src/slic3r/GUI/Plater.cpp:5258 msgid "Import Object" msgstr "Importar objeto" -#: src/slic3r/GUI/Plater.cpp:5171 +#: src/slic3r/GUI/Plater.cpp:5262 msgid "Import Objects" msgstr "Importar objetos" -#: src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:5291 +msgid "Import SLA archive" +msgstr "Importar arquivo SLA" + +#: src/slic3r/GUI/Plater.cpp:5355 src/slic3r/GUI/Plater.cpp:5365 msgid "does not contain valid gcode." msgstr "não contém um gcode válido." -#: src/slic3r/GUI/Plater.cpp:5244 +#: src/slic3r/GUI/Plater.cpp:5356 src/slic3r/GUI/Plater.cpp:5366 msgid "Error while loading .gcode file" msgstr "Erro durante carregamento do arquivo .gcode" -#: src/slic3r/GUI/Plater.cpp:5297 +#: src/slic3r/GUI/Plater.cpp:5433 +#, c-format, boost-format +msgid "%s - Multiple projects file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 +msgid "There are several files being loaded, including Project files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 src/slic3r/GUI/Plater.cpp:5446 +msgid "Select an action to apply to all files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5446 +msgid "There are several files being loaded." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5448 src/slic3r/GUI/Plater.cpp:5842 +msgid "Action" +msgstr "Ação" + +#: src/slic3r/GUI/Plater.cpp:5469 +msgid "Import geometry" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5482 src/slic3r/GUI/Plater.cpp:5834 +msgid "Start new PrusaSlicer instance" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5496 +msgid "Select one to load as project" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5507 +msgid "Select one to load config only" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5609 +#, boost-format +msgid "Failed to unzip file to %1%: %2% " +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5618 +#, boost-format +msgid "Failed to find unzipped file at %1%. Unzipping of file has failed." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5821 #, c-format, boost-format -msgid "%s - Drop project file" -msgstr "%s - Soltar arquivo de projeto" +msgid "%s - Load project file" +msgstr "" -#: src/slic3r/GUI/Plater.cpp:5304 +#: src/slic3r/GUI/Plater.cpp:5830 msgid "Open as project" msgstr "Abrir como projeto" -#: src/slic3r/GUI/Plater.cpp:5305 +#: src/slic3r/GUI/Plater.cpp:5831 msgid "Import geometry only" msgstr "Modelo somente geometria" -#: src/slic3r/GUI/Plater.cpp:5306 +#: src/slic3r/GUI/Plater.cpp:5832 msgid "Import config only" msgstr "Importar somente config" -#: src/slic3r/GUI/Plater.cpp:5309 +#: src/slic3r/GUI/Plater.cpp:5837 msgid "Select an action to apply to the file" msgstr "Selecione uma ação para aplicar ao arquivo" -#: src/slic3r/GUI/Plater.cpp:5314 -msgid "Action" -msgstr "Ação" - -#: src/slic3r/GUI/Plater.cpp:5330 +#: src/slic3r/GUI/Plater.cpp:5858 msgid "Don't show again" msgstr "Não mostrar novamente" -#: src/slic3r/GUI/Plater.cpp:5371 +#: src/slic3r/GUI/Plater.cpp:5899 msgid "You can open only one .gcode file at a time." msgstr "Você pode abrir apenas um arquivo .gcode por vez." -#: src/slic3r/GUI/Plater.cpp:5372 +#: src/slic3r/GUI/Plater.cpp:5900 msgid "Drag and drop G-code file" msgstr "Arraste e solte o arquivo G-code" -#: src/slic3r/GUI/Plater.cpp:5454 +#: src/slic3r/GUI/Plater.cpp:5992 msgid "Load File" msgstr "Carregar arquivo" -#: src/slic3r/GUI/Plater.cpp:5459 +#: src/slic3r/GUI/Plater.cpp:5997 msgid "Load Files" msgstr "Carregar arquivos" -#: src/slic3r/GUI/Plater.cpp:5509 +#: src/slic3r/GUI/Plater.cpp:6047 msgid "All objects will be removed, continue?" msgstr "Todos os objetos serão removidos, continuar?" -#: src/slic3r/GUI/Plater.cpp:5520 +#: src/slic3r/GUI/Plater.cpp:6058 msgid "Delete Selected Objects" msgstr "Excluir objetos selecionados" -#: src/slic3r/GUI/Plater.cpp:5529 +#: src/slic3r/GUI/Plater.cpp:6067 msgid "Increase Instances" msgstr "Aumentar instâncias" -#: src/slic3r/GUI/Plater.cpp:5563 +#: src/slic3r/GUI/Plater.cpp:6109 msgid "Decrease Instances" msgstr "Diminuir instâncias" -#: src/slic3r/GUI/Plater.cpp:5614 +#: src/slic3r/GUI/Plater.cpp:6167 msgid "Enter the number of copies:" msgstr "Definir números de cópias:" -#: src/slic3r/GUI/Plater.cpp:5615 +#: src/slic3r/GUI/Plater.cpp:6168 msgid "Copies of the selected object" msgstr "Cópias do objeto selecionado" -#: src/slic3r/GUI/Plater.cpp:5619 +#: src/slic3r/GUI/Plater.cpp:6171 #, c-format, boost-format msgid "Set numbers of copies to %d" msgstr "Definir números de cópias para %d" -#: src/slic3r/GUI/Plater.cpp:5697 -msgid "Cut by Plane" -msgstr "Cortado por plano" +#: src/slic3r/GUI/Plater.cpp:6187 +msgid "Fill bed" +msgstr "Preencher mesa" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save G-code file as:" msgstr "Salve o arquivo G-code como:" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save SL1 / SL1S file as:" msgstr "Salve o arquivo SL1 / SL1S como:" -#: src/slic3r/GUI/Plater.cpp:5766 +#: src/slic3r/GUI/Plater.cpp:6336 msgid "The provided file name is not valid." msgstr "O nome do arquivo fornecido não é válido." -#: src/slic3r/GUI/Plater.cpp:5767 +#: src/slic3r/GUI/Plater.cpp:6337 msgid "The following characters are not allowed by a FAT file system:" msgstr "" "Os seguintes caracteres não são permitidos por um sistema de arquivos FAT:" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "" "The plater is empty.\n" "Do you want to save the project?" @@ -7468,38 +8881,38 @@ msgstr "" "A bandeja está vazia.\n" "Você deseja salvar o projeto?" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "Save project" msgstr "Salvar projeto" -#: src/slic3r/GUI/Plater.cpp:6543 +#: src/slic3r/GUI/Plater.cpp:6766 +msgid "Is the printer ready? Is the print sheet in place, empty and clean?" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:6766 src/slic3r/GUI/PrintHostDialogs.cpp:132 +msgid "Upload and Print" +msgstr "Upload e Imprimir" + +#: src/slic3r/GUI/Plater.cpp:7161 msgid "Export" msgstr "Exportar" -#: src/slic3r/GUI/Plater.cpp:6575 -msgid "" -"Custom supports, seams and multimaterial painting were removed after " -"repairing the mesh." -msgstr "" -"Suportes personalizados, costuras e pintura multimaterial foram removidos " -"após reparação da malha." - -#: src/slic3r/GUI/Plater.cpp:6689 +#: src/slic3r/GUI/Plater.cpp:7306 msgid "Paste From Clipboard" msgstr "Colar da área de transferência" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2290 -#: src/slic3r/GUI/Tab.cpp:2517 src/slic3r/GUI/Tab.cpp:2624 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Preferences.cpp:240 src/slic3r/GUI/Tab.cpp:2274 +#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2617 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "General" msgstr "Geral" -#: src/slic3r/GUI/Preferences.cpp:121 +#: src/slic3r/GUI/Preferences.cpp:258 msgid "Remember output directory" msgstr "Lembrar diretório de saída" -#: src/slic3r/GUI/Preferences.cpp:123 +#: src/slic3r/GUI/Preferences.cpp:259 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." @@ -7507,11 +8920,11 @@ msgstr "" "Se isso estiver habilitado, PrusaSlicer solicitará o último diretório de " "saída em vez de um contendo os arquivos de entrada." -#: src/slic3r/GUI/Preferences.cpp:129 +#: src/slic3r/GUI/Preferences.cpp:263 msgid "Auto-center parts" msgstr "Centrar automaticamente as partes" -#: src/slic3r/GUI/Preferences.cpp:131 +#: src/slic3r/GUI/Preferences.cpp:264 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." @@ -7519,11 +8932,11 @@ msgstr "" "Se isso estiver habilitado, o PrusaSlicer irá centralizar objetos " "automaticamente ao redor do centro de mesa de impressão." -#: src/slic3r/GUI/Preferences.cpp:137 +#: src/slic3r/GUI/Preferences.cpp:268 msgid "Background processing" msgstr "Processamento em segundo plano" -#: src/slic3r/GUI/Preferences.cpp:139 +#: src/slic3r/GUI/Preferences.cpp:269 msgid "" "If this is enabled, Slic3r will pre-process objects as soon as they're " "loaded in order to save time when exporting G-code." @@ -7531,11 +8944,23 @@ msgstr "" "Se isso estiver ativado, o PrusaSlicer irá pré-processar objetos assim que " "eles forem carregados para economizar tempo ao exportar o G-code." -#: src/slic3r/GUI/Preferences.cpp:148 +#: src/slic3r/GUI/Preferences.cpp:274 +msgid "Alert when supports needed" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:275 +msgid "" +"If this is enabled, Slic3r will raise alerts when it detects issues in the " +"sliced object, that can be resolved with supports (and brim). Examples of " +"such issues are floating object parts, unsupported extrusions and low bed " +"adhesion." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:285 msgid "Export sources full pathnames to 3mf and amf" msgstr "Fontes de exportação completas para 3mf e amf" -#: src/slic3r/GUI/Preferences.cpp:150 +#: src/slic3r/GUI/Preferences.cpp:286 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked." @@ -7543,19 +8968,19 @@ msgstr "" "Se ativado, permite que o comando Reload from disk encontre e carregue " "automaticamente os arquivos quando invocado." -#: src/slic3r/GUI/Preferences.cpp:159 +#: src/slic3r/GUI/Preferences.cpp:293 msgid "If enabled, sets PrusaSlicer as default application to open .3mf files." msgstr "" "Se ativado, define PrusaSlicer como aplicativo padrão para abrir " "arquivos .3mf." -#: src/slic3r/GUI/Preferences.cpp:166 +#: src/slic3r/GUI/Preferences.cpp:298 msgid "If enabled, sets PrusaSlicer as default application to open .stl files." msgstr "" "Se ativado, define PrusaSlicer como aplicativo padrão para abrir arquivos ." "stl." -#: src/slic3r/GUI/Preferences.cpp:177 +#: src/slic3r/GUI/Preferences.cpp:307 msgid "" "If enabled, Slic3r downloads updates of built-in system presets in the " "background. These updates are downloaded into a separate temporary location. " @@ -7567,11 +8992,11 @@ msgstr "" "temporário separado. Quando uma nova versão predefinida se torna disponível, " "ela é oferecida na inicialização do aplicativo." -#: src/slic3r/GUI/Preferences.cpp:182 +#: src/slic3r/GUI/Preferences.cpp:312 msgid "Suppress \" - default - \" presets" msgstr "Suprimir predefinições \"-padrão-\"" -#: src/slic3r/GUI/Preferences.cpp:184 +#: src/slic3r/GUI/Preferences.cpp:313 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." @@ -7579,11 +9004,21 @@ msgstr "" "Suprimir predefinições \"-padrão-\" em impressão/filamento/impressora, uma " "vez que existam outras predefinições válidas disponíveis." -#: src/slic3r/GUI/Preferences.cpp:190 +#: src/slic3r/GUI/Preferences.cpp:317 +msgid "Suppress \" Template \" filament presets" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:318 +msgid "" +"Suppress \" Template \" filament presets in configuration wizard and sidebar " +"visibility." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:322 msgid "Show incompatible print and filament presets" msgstr "Mostrar predefinições de impressão e filamento incompatíveis" -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:323 msgid "" "When checked, the print and filament presets are shown in the preset editor " "even if they are marked as incompatible with the active printer" @@ -7592,11 +9027,22 @@ msgstr "" "editor de predefinições, mesmo que estejam marcadas como incompatíveis com a " "impressora ativa" -#: src/slic3r/GUI/Preferences.cpp:200 +#: src/slic3r/GUI/Preferences.cpp:331 +msgid "Show load project dialog" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:332 +msgid "" +"When checked, whenever dragging and dropping a project file on the " +"application or open it from a browser, shows a dialog asking to select the " +"action to take on the file to load." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:335 msgid "Show drop project dialog" msgstr "Mostrar / soltar caixa de diálogo do projeto" -#: src/slic3r/GUI/Preferences.cpp:202 +#: src/slic3r/GUI/Preferences.cpp:336 msgid "" "When checked, whenever dragging and dropping a project file on the " "application, shows a dialog asking to select the action to take on the file " @@ -7606,11 +9052,11 @@ msgstr "" "aplicativo, é exibida uma caixa de diálogo solicitando a seleção da ação a " "ser executada no arquivo a ser carregado." -#: src/slic3r/GUI/Preferences.cpp:208 src/slic3r/GUI/Preferences.cpp:212 +#: src/slic3r/GUI/Preferences.cpp:342 src/slic3r/GUI/Preferences.cpp:346 msgid "Allow just a single PrusaSlicer instance" msgstr "Permitir apenas uma única instancia do PrusaSlicer" -#: src/slic3r/GUI/Preferences.cpp:210 +#: src/slic3r/GUI/Preferences.cpp:343 msgid "" "On OSX there is always only one instance of app running by default. However " "it is allowed to run multiple instances of same app from the command line. " @@ -7621,7 +9067,7 @@ msgstr "" "partir da linha de comando. Nesse caso, essas configurações permitirão " "apenas uma instância." -#: src/slic3r/GUI/Preferences.cpp:214 +#: src/slic3r/GUI/Preferences.cpp:347 msgid "" "If this is enabled, when starting PrusaSlicer and another instance of the " "same PrusaSlicer is already running, that instance will be reactivated " @@ -7630,7 +9076,7 @@ msgstr "" "Se estiver habilitado, ao iniciar o PrusaSlicer e outra instância do mesmo " "PrusaSlicer estiver em execução, essa instância será reativada." -#: src/slic3r/GUI/Preferences.cpp:224 +#: src/slic3r/GUI/Preferences.cpp:355 msgid "" "Always ask for unsaved changes in project, when: \n" "- Closing PrusaSlicer,\n" @@ -7640,8 +9086,8 @@ msgstr "" "- Fechando o PrusaSlicer,\n" "- Carregando ou criando um novo projeto" -#: src/slic3r/GUI/Preferences.cpp:233 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:897 +#: src/slic3r/GUI/Preferences.cpp:363 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:925 msgid "" "Ask to save unsaved changes in presets when closing the application or when " "loading a new project" @@ -7649,7 +9095,7 @@ msgstr "" "Peça para salvar as alterações não salvas nas predefinições ao fechar o " "aplicativo ou ao carregar um novo projeto" -#: src/slic3r/GUI/Preferences.cpp:235 +#: src/slic3r/GUI/Preferences.cpp:364 msgid "" "Always ask for unsaved changes in presets, when: \n" "- Closing PrusaSlicer while some presets are modified,\n" @@ -7659,14 +9105,14 @@ msgstr "" "- Fechando o PrusaSlicer enquanto algumas predefinições são modificadas,\n" "- Carregando um novo projeto enquanto alguns presets são modificados" -#: src/slic3r/GUI/Preferences.cpp:242 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:896 +#: src/slic3r/GUI/Preferences.cpp:370 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:924 msgid "Ask for unsaved changes in presets when selecting new preset" msgstr "" "Solicitar alterações não salvas em predefinições ao selecionar uma nova " "predefinição" -#: src/slic3r/GUI/Preferences.cpp:244 +#: src/slic3r/GUI/Preferences.cpp:371 msgid "" "Always ask for unsaved changes in presets when selecting new preset or " "resetting a preset" @@ -7674,22 +9120,22 @@ msgstr "" "Sempre peça alterações não salvas nas predefinições ao selecionar uma nova " "predefinição ou redefinir uma predefinição" -#: src/slic3r/GUI/Preferences.cpp:249 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 +#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:923 msgid "Ask for unsaved changes in presets when creating new project" msgstr "" "Solicitar alterações não salvas em predefinições ao criar um novo projeto" -#: src/slic3r/GUI/Preferences.cpp:251 +#: src/slic3r/GUI/Preferences.cpp:376 msgid "Always ask for unsaved changes in presets when creating new project" msgstr "" "Sempre peça alterações não salvas nas predefinições ao criar um novo projeto" -#: src/slic3r/GUI/Preferences.cpp:258 +#: src/slic3r/GUI/Preferences.cpp:382 msgid "Associate .gcode files to PrusaSlicer G-code Viewer" msgstr "Associar arquivos .gcode para o Visualizador de G-code PrusaSlicer" -#: src/slic3r/GUI/Preferences.cpp:260 +#: src/slic3r/GUI/Preferences.cpp:383 msgid "" "If enabled, sets PrusaSlicer G-code Viewer as default application to open ." "gcode files." @@ -7697,11 +9143,11 @@ msgstr "" "Se ativado, define o Visualizador de G-code PrusaSLicer como aplicação " "padrão para abrir arquivos .gcode." -#: src/slic3r/GUI/Preferences.cpp:268 +#: src/slic3r/GUI/Preferences.cpp:390 msgid "Use Retina resolution for the 3D scene" msgstr "Usar a resolução retina para a cena 3D" -#: src/slic3r/GUI/Preferences.cpp:270 +#: src/slic3r/GUI/Preferences.cpp:391 msgid "" "If enabled, the 3D scene will be rendered in Retina resolution. If you are " "experiencing 3D performance problems, disabling this option may help." @@ -7709,30 +9155,30 @@ msgstr "" "Se ativada, a cena 3D será renderizada na resolução retina. Se você estiver " "enfrentando problemas de desempenho 3D, desabilitar essa opção pode ajudar." -#: src/slic3r/GUI/Preferences.cpp:280 src/slic3r/GUI/Preferences.cpp:282 +#: src/slic3r/GUI/Preferences.cpp:400 src/slic3r/GUI/Preferences.cpp:401 msgid "Show splash screen" msgstr "Mostrar tela inicial" -#: src/slic3r/GUI/Preferences.cpp:289 +#: src/slic3r/GUI/Preferences.cpp:406 msgid "If enabled, PrusaSlicer will be open at the position it was closed" msgstr "Se ativado, o PrusaSlicer será aberto na posição em que foi fechado" -#: src/slic3r/GUI/Preferences.cpp:295 +#: src/slic3r/GUI/Preferences.cpp:411 msgid "Clear Undo / Redo stack on new project" msgstr "Limpar pilha Desfazer/Refazer em novo projeto" -#: src/slic3r/GUI/Preferences.cpp:297 +#: src/slic3r/GUI/Preferences.cpp:412 msgid "" "Clear Undo / Redo stack on new project or when an existing project is loaded." msgstr "" "Desmarque a pilha Desfazer/Refazer em um novo projeto ou quando um projeto " "existente for carregado." -#: src/slic3r/GUI/Preferences.cpp:303 +#: src/slic3r/GUI/Preferences.cpp:417 msgid "Enable support for legacy 3DConnexion devices" msgstr "Ativar suporte para dispositivos 3DConnexion legados" -#: src/slic3r/GUI/Preferences.cpp:305 +#: src/slic3r/GUI/Preferences.cpp:418 msgid "" "If enabled, the legacy 3DConnexion devices settings dialog is available by " "pressing CTRL+M" @@ -7740,62 +9186,59 @@ msgstr "" "Se ativado, a caixa de diálogo de configurações dos dispositivos 3DConnexion " "legados está disponível pressionando CTRL + M" -#: src/slic3r/GUI/Preferences.cpp:314 +#: src/slic3r/GUI/Preferences.cpp:425 msgid "Camera" msgstr "Câmera" -#: src/slic3r/GUI/Preferences.cpp:319 +#: src/slic3r/GUI/Preferences.cpp:435 msgid "Use perspective camera" msgstr "Usar a câmera em perspectiva" -#: src/slic3r/GUI/Preferences.cpp:321 +#: src/slic3r/GUI/Preferences.cpp:436 msgid "" "If enabled, use perspective camera. If not enabled, use orthographic camera." msgstr "" "Se ativada, use a câmera em perspectiva. Se não estiver ativada, use a " "câmera ortográfica." -#: src/slic3r/GUI/Preferences.cpp:326 +#: src/slic3r/GUI/Preferences.cpp:440 msgid "Use free camera" msgstr "Use câmera livre" -#: src/slic3r/GUI/Preferences.cpp:328 +#: src/slic3r/GUI/Preferences.cpp:441 msgid "If enabled, use free camera. If not enabled, use constrained camera." msgstr "" "Se ativado, use câmera livre. Se não estiver habilitado, use a câmera " "restrita." -#: src/slic3r/GUI/Preferences.cpp:333 +#: src/slic3r/GUI/Preferences.cpp:445 msgid "Reverse direction of zoom with mouse wheel" msgstr "Reverter direção do zoom com a roda do mouse" -#: src/slic3r/GUI/Preferences.cpp:335 +#: src/slic3r/GUI/Preferences.cpp:446 msgid "If enabled, reverses the direction of zoom with mouse wheel" msgstr "Se ativado, reverte a direção do zoom com a roda do mouse" -#: src/slic3r/GUI/Preferences.cpp:343 +#: src/slic3r/GUI/Preferences.cpp:452 msgid "GUI" msgstr "GUI" -#: src/slic3r/GUI/Preferences.cpp:366 +#: src/slic3r/GUI/Preferences.cpp:492 msgid "Sequential slider applied only to top layer" msgstr "Rolagem sequencial aplicado apenas na camada de topo" -#: src/slic3r/GUI/Preferences.cpp:368 +#: src/slic3r/GUI/Preferences.cpp:493 msgid "" "If enabled, changes made using the sequential slider, in preview, apply only " -"to gcode top layer. If disabled, changes made using the sequential slider, " -"in preview, apply to the whole gcode." +"to gcode top layer.If disabled, changes made using the sequential slider, in " +"preview, apply to the whole gcode." msgstr "" -"Se ativo, mudanças feitas usando a rolagem sequencial, na pré-visualização, " -"aplica somente para o topo do G-code. Se desativado, mudanças feitas usando " -"a rolagem sequencial, na pré-visualização, aplica para todo o G-code." -#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/Preferences.cpp:499 msgid "Show sidebar collapse/expand button" msgstr "Mostrar botão de recolher/expandir barra lateral" -#: src/slic3r/GUI/Preferences.cpp:377 +#: src/slic3r/GUI/Preferences.cpp:500 msgid "" "If enabled, the button for the collapse sidebar will be appeared in top " "right corner of the 3D Scene" @@ -7803,15 +9246,11 @@ msgstr "" "Se ativado, o botão para recolher a barra lateral aparecerá no canto " "superior direito da cena 3D" -#: src/slic3r/GUI/Preferences.cpp:384 -msgid "If enabled, PrusaSlicer will not open hyperlinks in your browser." -msgstr "Se ativado, o PrusaSlicer não abrirá links em seu navegador." - -#: src/slic3r/GUI/Preferences.cpp:391 +#: src/slic3r/GUI/Preferences.cpp:511 msgid "Use colors for axes values in Manipulation panel" msgstr "Use cores para valores de eixos no painel Manipulação" -#: src/slic3r/GUI/Preferences.cpp:393 +#: src/slic3r/GUI/Preferences.cpp:512 msgid "" "If enabled, the axes names and axes values will be colorized according to " "the axes colors. If disabled, old UI will be used." @@ -7820,11 +9259,11 @@ msgstr "" "acordo com as cores dos eixos. Se desativado, interface do usuário antiga " "será usada." -#: src/slic3r/GUI/Preferences.cpp:399 +#: src/slic3r/GUI/Preferences.cpp:517 msgid "Order object volumes by types" msgstr "Ordenar volumes de objetos por tipos" -#: src/slic3r/GUI/Preferences.cpp:401 +#: src/slic3r/GUI/Preferences.cpp:518 msgid "" "If enabled, volumes will be always ordered inside the object. Correct order " "is Model Part, Negative Volume, Modifier, Support Blocker and Support " @@ -7837,11 +9276,29 @@ msgstr "" "de modelo, volumes negativos e Modificadores. Mas uma das partes do modelo " "tem que estar em primeiro lugar." -#: src/slic3r/GUI/Preferences.cpp:408 +#: src/slic3r/GUI/Preferences.cpp:523 +msgid "Show non-manifold edges" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:524 +msgid "If enabled, shows non-manifold edges." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:528 +msgid "Allow automatically color change" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:529 +msgid "" +"If enabled, related notification will be shown, when sliced object looks " +"like a logo or a sign." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:534 msgid "Set settings tabs as menu items (experimental)" msgstr "Definir guias de configurações como itens de menu (experimental)" -#: src/slic3r/GUI/Preferences.cpp:410 +#: src/slic3r/GUI/Preferences.cpp:535 msgid "" "If enabled, Settings Tabs will be placed as menu items. If disabled, old UI " "will be used." @@ -7849,19 +9306,19 @@ msgstr "" "Se ativado, as guias de configurações serão colocadas como itens de menu. Se " "desativado, a interface do usuário antiga será usada." -#: src/slic3r/GUI/Preferences.cpp:419 +#: src/slic3r/GUI/Preferences.cpp:542 msgid "Show \"Tip of the day\" notification after start" msgstr "Mostrar notificação de \"Dica do dia\" após o início" -#: src/slic3r/GUI/Preferences.cpp:421 +#: src/slic3r/GUI/Preferences.cpp:543 msgid "If enabled, useful hints are displayed at startup." msgstr "Se ativado, dicas úteis são exibidas na inicialização." -#: src/slic3r/GUI/Preferences.cpp:427 +#: src/slic3r/GUI/Preferences.cpp:547 msgid "Notify about new releases" msgstr "Notificar sobre novos releases" -#: src/slic3r/GUI/Preferences.cpp:429 +#: src/slic3r/GUI/Preferences.cpp:548 msgid "" "You will be notified about new release after startup acordingly: All = " "Regular release and alpha / beta releases. Release only = regular release." @@ -7870,66 +9327,79 @@ msgstr "" "Todos = release regular e releases alfa / beta. Somente Release = release " "regular." -#: src/slic3r/GUI/Preferences.cpp:435 +#: src/slic3r/GUI/Preferences.cpp:551 msgid "Release only" msgstr "Somente Release" -#: src/slic3r/GUI/Preferences.cpp:444 +#: src/slic3r/GUI/Preferences.cpp:558 msgid "Use custom size for toolbar icons" msgstr "Usar tamanho personalizado para ícones da barra de ferramentas" -#: src/slic3r/GUI/Preferences.cpp:446 +#: src/slic3r/GUI/Preferences.cpp:559 msgid "If enabled, you can change size of toolbar icons manually." msgstr "" "Se ativado, você pode alterar o tamanho dos ícones da barra de ferramentas " "manualmente." -#: src/slic3r/GUI/Preferences.cpp:471 +#: src/slic3r/GUI/Preferences.cpp:577 src/slic3r/GUI/Tab.cpp:1659 +msgid "Other" +msgstr "Outro" + +#: src/slic3r/GUI/Preferences.cpp:594 +msgid "If enabled, PrusaSlicer will not open a hyperlinks in your browser." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:600 +msgid "Allow downloads from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:601 +msgid "If enabled, PrusaSlicer will be allowed to download from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:610 msgid "Render" msgstr "Reenderizar" -#: src/slic3r/GUI/Preferences.cpp:476 +#: src/slic3r/GUI/Preferences.cpp:620 msgid "Use environment map" msgstr "Usar mapa do ambiente" -#: src/slic3r/GUI/Preferences.cpp:478 +#: src/slic3r/GUI/Preferences.cpp:621 msgid "If enabled, renders object using the environment map." msgstr "Se ativo, reenderiza objetos usando o mapa de ambiente." -#: src/slic3r/GUI/Preferences.cpp:491 +#: src/slic3r/GUI/Preferences.cpp:629 msgid "Dark mode (experimental)" msgstr "Modo escuro (experimental)" -#: src/slic3r/GUI/Preferences.cpp:496 +#: src/slic3r/GUI/Preferences.cpp:639 msgid "Enable dark mode" msgstr "Habilitar modo escuro" -#: src/slic3r/GUI/Preferences.cpp:498 +#: src/slic3r/GUI/Preferences.cpp:640 msgid "" "If enabled, UI will use Dark mode colors. If disabled, old UI will be used." msgstr "" "Se ativado, a interface do usuário usará as cores do modo escuro. Se " "desativado, a interface do usuário antiga será usada." -#: src/slic3r/GUI/Preferences.cpp:507 +#: src/slic3r/GUI/Preferences.cpp:647 msgid "Use system menu for application" msgstr "Use o menu do sistema para aplicação" -#: src/slic3r/GUI/Preferences.cpp:509 +#: src/slic3r/GUI/Preferences.cpp:648 msgid "" "If enabled, application will use the standard Windows system menu,\n" -"but on some combination of display scales it can looks ugly. If disabled, " -"old UI will be used." +"but on some combination od display scales it can look ugly. If disabled, old " +"UI will be used." msgstr "" -"Se ativado, o aplicativo usará o menu padrão do sistema Windows,\n" -"mas em alguma combinação de escalas de exibição pode parecer feio. Se " -"desabilitado, a interface do usuário antiga será usada." -#: src/slic3r/GUI/Preferences.cpp:578 +#: src/slic3r/GUI/Preferences.cpp:726 msgid "Changes for the critical options" msgstr "Mudanças para as opções críticas" -#: src/slic3r/GUI/Preferences.cpp:580 +#: src/slic3r/GUI/Preferences.cpp:728 msgid "" "Changing some options will trigger application restart.\n" "You will lose the content of the plater." @@ -7937,108 +9407,121 @@ msgstr "" "Alterar algumas opções acionará a reinicialização do aplicativo.\n" "Você vai perder o conteúdo da bandeja." -#: src/slic3r/GUI/Preferences.cpp:694 +#: src/slic3r/GUI/Preferences.cpp:921 msgid "Icon size in a respect to the default size" msgstr "Tamanho do ícone em relação ao tamanho padrão" -#: src/slic3r/GUI/Preferences.cpp:709 +#: src/slic3r/GUI/Preferences.cpp:936 msgid "Select toolbar icon size in respect to the default one." msgstr "" "Selecione o tamanho do ícone da barra de ferramentas em relação ao padrão." -#: src/slic3r/GUI/Preferences.cpp:743 src/slic3r/GUI/Preferences.cpp:754 +#: src/slic3r/GUI/Preferences.cpp:972 +msgid "Layout Options" +msgstr "Opções de Layout" + +#: src/slic3r/GUI/Preferences.cpp:981 msgid "Old regular layout with the tab bar" msgstr "Layout padrão antigo com a barra de abas" -#: src/slic3r/GUI/Preferences.cpp:744 +#: src/slic3r/GUI/Preferences.cpp:982 msgid "New layout, access via settings button in the top menu" msgstr "Novo layout, acesso pelo botão de configuração no menu superior" -#: src/slic3r/GUI/Preferences.cpp:745 src/slic3r/GUI/Preferences.cpp:755 +#: src/slic3r/GUI/Preferences.cpp:983 msgid "Settings in non-modal window" msgstr "Configurações em janela não modal" -#: src/slic3r/GUI/Preferences.cpp:763 -msgid "Layout Options" -msgstr "Opções de Layout" - -#: src/slic3r/GUI/Preferences.cpp:806 +#: src/slic3r/GUI/Preferences.cpp:1025 msgid "Text colors" msgstr "Cores do texto" -#: src/slic3r/GUI/PresetComboBoxes.cpp:249 -#: src/slic3r/GUI/PresetComboBoxes.cpp:287 -#: src/slic3r/GUI/PresetComboBoxes.cpp:794 -#: src/slic3r/GUI/PresetComboBoxes.cpp:849 -#: src/slic3r/GUI/PresetComboBoxes.cpp:989 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1033 +#: src/slic3r/GUI/Preferences.cpp:1049 +msgid "Mode markers" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:254 +#: src/slic3r/GUI/PresetComboBoxes.cpp:306 +#: src/slic3r/GUI/PresetComboBoxes.cpp:846 +#: src/slic3r/GUI/PresetComboBoxes.cpp:909 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1073 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1125 msgid "System presets" msgstr "Predefinições do sistema" -#: src/slic3r/GUI/PresetComboBoxes.cpp:291 -#: src/slic3r/GUI/PresetComboBoxes.cpp:853 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1037 +#: src/slic3r/GUI/PresetComboBoxes.cpp:310 +#: src/slic3r/GUI/PresetComboBoxes.cpp:915 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1130 msgid "User presets" msgstr "Predefinições do usuário" -#: src/slic3r/GUI/PresetComboBoxes.cpp:302 +#: src/slic3r/GUI/PresetComboBoxes.cpp:321 msgid "Incompatible presets" msgstr "Pacotes incompatíveis" -#: src/slic3r/GUI/PresetComboBoxes.cpp:337 +#: src/slic3r/GUI/PresetComboBoxes.cpp:364 #, boost-format msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "Tem certeza que quer deletar a impressora \"%1%\"?" -#: src/slic3r/GUI/PresetComboBoxes.cpp:340 +#: src/slic3r/GUI/PresetComboBoxes.cpp:366 msgid "Delete Physical Printer" msgstr "Excluir Impressora Física" -#: src/slic3r/GUI/PresetComboBoxes.cpp:581 +#: src/slic3r/GUI/PresetComboBoxes.cpp:612 msgid "Click to edit preset" msgstr "Clique para editar a predefinição" -#: src/slic3r/GUI/PresetComboBoxes.cpp:697 -#: src/slic3r/GUI/PresetComboBoxes.cpp:737 +#: src/slic3r/GUI/PresetComboBoxes.cpp:740 +#: src/slic3r/GUI/PresetComboBoxes.cpp:788 msgid "Add/Remove presets" msgstr "Adicionar/Remover predefinições" -#: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:745 +#: src/slic3r/GUI/PresetComboBoxes.cpp:793 src/slic3r/GUI/Tab.cpp:3312 msgid "Add physical printer" msgstr "Adicionar impressora física" -#: src/slic3r/GUI/PresetComboBoxes.cpp:716 +#: src/slic3r/GUI/PresetComboBoxes.cpp:759 msgid "Edit preset" msgstr "Editar a predefinição" -#: src/slic3r/GUI/PresetComboBoxes.cpp:722 +#: src/slic3r/GUI/PresetComboBoxes.cpp:765 msgid "Change extruder color" msgstr "Alterar a cor da extrusora" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:773 src/slic3r/GUI/Tab.cpp:3312 msgid "Edit physical printer" msgstr "Editar impressora física" -#: src/slic3r/GUI/PresetComboBoxes.cpp:733 +#: src/slic3r/GUI/PresetComboBoxes.cpp:779 +msgid "Open physical printer URL" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:784 msgid "Delete physical printer" msgstr "Excluir impressora física" -#: src/slic3r/GUI/PresetComboBoxes.cpp:864 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1051 +#: src/slic3r/GUI/PresetComboBoxes.cpp:924 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1142 +msgid "Template presets" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:935 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1156 msgid "Physical printers" msgstr "Impressoras físicas" -#: src/slic3r/GUI/PresetComboBoxes.cpp:888 +#: src/slic3r/GUI/PresetComboBoxes.cpp:959 msgid "Add/Remove filaments" msgstr "Adicionar/Remover filamentos" -#: src/slic3r/GUI/PresetComboBoxes.cpp:890 +#: src/slic3r/GUI/PresetComboBoxes.cpp:961 msgid "Add/Remove materials" msgstr "Adicionar/Remover materiais" -#: src/slic3r/GUI/PresetComboBoxes.cpp:892 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1075 +#: src/slic3r/GUI/PresetComboBoxes.cpp:963 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1180 msgid "Add/Remove printers" msgstr "Adicionar/Remover impressoras" @@ -8230,99 +9713,107 @@ msgstr "A espessura mínima da camada inferior é de %1% mm." msgid "Bottom is open." msgstr "Base está aberta." -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Send G-Code to printer host" msgstr "Enviar G-code para o host da impressora" -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Upload to Printer Host with the following filename:" msgstr "Carregue para o host da impressora com o seguinte nome de arquivo:" -#: src/slic3r/GUI/PrintHostDialogs.cpp:51 +#: src/slic3r/GUI/PrintHostDialogs.cpp:55 msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "Use barras (/) como um separador de diretório, se necessário." -#: src/slic3r/GUI/PrintHostDialogs.cpp:60 +#: src/slic3r/GUI/PrintHostDialogs.cpp:64 msgid "Group" msgstr "Grupo" -#: src/slic3r/GUI/PrintHostDialogs.cpp:84 +#: src/slic3r/GUI/PrintHostDialogs.cpp:74 +msgid "Upload to storage:" +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:83 +msgid "Upload to storage: " +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:105 #, c-format, boost-format msgid "Upload filename doesn't end with \"%s\". Do you wish to continue?" msgstr "" "O nome do arquivo de upload não termina com \"%s\". Você deseja continuar?" -#: src/slic3r/GUI/PrintHostDialogs.cpp:91 +#: src/slic3r/GUI/PrintHostDialogs.cpp:112 msgid "Upload" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:101 -msgid "Upload and Print" -msgstr "Upload e Imprimir" +#: src/slic3r/GUI/PrintHostDialogs.cpp:122 +msgid "Upload to Queue" +msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:112 +#: src/slic3r/GUI/PrintHostDialogs.cpp:143 msgid "Upload and Simulate" msgstr "Upload e Simular" -#: src/slic3r/GUI/PrintHostDialogs.cpp:247 +#: src/slic3r/GUI/PrintHostDialogs.cpp:298 msgid "ID" msgstr "ID" -#: src/slic3r/GUI/PrintHostDialogs.cpp:248 +#: src/slic3r/GUI/PrintHostDialogs.cpp:299 msgid "Progress" msgstr "Progresso" -#: src/slic3r/GUI/PrintHostDialogs.cpp:249 +#: src/slic3r/GUI/PrintHostDialogs.cpp:300 msgid "Status" msgstr "Status" -#: src/slic3r/GUI/PrintHostDialogs.cpp:250 +#: src/slic3r/GUI/PrintHostDialogs.cpp:301 msgid "Host" msgstr "Servidor" -#: src/slic3r/GUI/PrintHostDialogs.cpp:251 +#: src/slic3r/GUI/PrintHostDialogs.cpp:302 msgctxt "OfFile" msgid "Size" msgstr "Tamanho" -#: src/slic3r/GUI/PrintHostDialogs.cpp:252 +#: src/slic3r/GUI/PrintHostDialogs.cpp:303 msgid "Filename" msgstr "Nome do arquivo" -#: src/slic3r/GUI/PrintHostDialogs.cpp:253 -msgid "Error Message" -msgstr "Mensagem de Erro" +#: src/slic3r/GUI/PrintHostDialogs.cpp:304 +msgid "Message" +msgstr "Mensagem" -#: src/slic3r/GUI/PrintHostDialogs.cpp:256 +#: src/slic3r/GUI/PrintHostDialogs.cpp:308 msgid "Cancel selected" msgstr "Cancelar selecionado" -#: src/slic3r/GUI/PrintHostDialogs.cpp:258 +#: src/slic3r/GUI/PrintHostDialogs.cpp:310 msgid "Show error message" msgstr "Exibir mensagem de erro" -#: src/slic3r/GUI/PrintHostDialogs.cpp:316 -#: src/slic3r/GUI/PrintHostDialogs.cpp:371 +#: src/slic3r/GUI/PrintHostDialogs.cpp:368 +#: src/slic3r/GUI/PrintHostDialogs.cpp:423 msgid "Enqueued" msgstr "Enfileirado" -#: src/slic3r/GUI/PrintHostDialogs.cpp:372 +#: src/slic3r/GUI/PrintHostDialogs.cpp:424 msgid "Uploading" msgstr "Enviando" -#: src/slic3r/GUI/PrintHostDialogs.cpp:374 +#: src/slic3r/GUI/PrintHostDialogs.cpp:426 msgid "Cancelling" msgstr "Cancelar" -#: src/slic3r/GUI/PrintHostDialogs.cpp:375 +#: src/slic3r/GUI/PrintHostDialogs.cpp:427 msgid "Cancelled" msgstr "Cancelado" -#: src/slic3r/GUI/PrintHostDialogs.cpp:376 +#: src/slic3r/GUI/PrintHostDialogs.cpp:428 msgid "Completed" msgstr "Concluído" -#: src/slic3r/GUI/PrintHostDialogs.cpp:424 +#: src/slic3r/GUI/PrintHostDialogs.cpp:476 msgid "Error uploading to print host:" msgstr "Erro ao carregar para o host de impressão:" @@ -8330,13 +9821,13 @@ msgstr "Erro ao carregar para o host de impressão:" msgid "NO RAMMING AT ALL" msgstr "NÃO USAR RAMMING" -#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 -#: src/libslic3r/PrintConfig.cpp:955 src/libslic3r/PrintConfig.cpp:999 -#: src/libslic3r/PrintConfig.cpp:1014 src/libslic3r/PrintConfig.cpp:3297 -#: src/libslic3r/PrintConfig.cpp:3306 src/libslic3r/PrintConfig.cpp:3315 -#: src/libslic3r/PrintConfig.cpp:3456 src/libslic3r/PrintConfig.cpp:3464 -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3479 -#: src/libslic3r/PrintConfig.cpp:3487 src/libslic3r/PrintConfig.cpp:3495 +#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/libslic3r/PrintConfig.cpp:1044 src/libslic3r/PrintConfig.cpp:1088 +#: src/libslic3r/PrintConfig.cpp:1103 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3578 src/libslic3r/PrintConfig.cpp:3587 +#: src/libslic3r/PrintConfig.cpp:3733 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3749 src/libslic3r/PrintConfig.cpp:3756 +#: src/libslic3r/PrintConfig.cpp:3764 src/libslic3r/PrintConfig.cpp:3772 msgid "s" msgstr "s" @@ -8344,43 +9835,64 @@ msgstr "s" msgid "Volumetric speed" msgstr "Velocidade volumétrica" -#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:912 -#: src/libslic3r/PrintConfig.cpp:1824 +#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:1001 +#: src/libslic3r/PrintConfig.cpp:1861 msgid "mm³/s" msgstr "mm ³/s" -#: src/slic3r/GUI/SavePresetDialog.cpp:57 +#: src/slic3r/GUI/SavePresetDialog.cpp:90 +#, c-format, boost-format +msgid "Rename %s to:" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:90 #, c-format, boost-format msgid "Save %s as:" msgstr "Salvar %s como:" -#: src/slic3r/GUI/SavePresetDialog.cpp:101 -#: src/slic3r/GUI/SavePresetDialog.cpp:109 +#: src/slic3r/GUI/SavePresetDialog.cpp:165 +#: src/slic3r/GUI/SavePresetDialog.cpp:173 msgid "The supplied name is not valid;" msgstr "O nome inserido não é valido;" -#: src/slic3r/GUI/SavePresetDialog.cpp:110 +#: src/slic3r/GUI/SavePresetDialog.cpp:174 msgid "the following suffix is not allowed:" msgstr "o sufixo seguinte não é permitido:" -#: src/slic3r/GUI/SavePresetDialog.cpp:116 +#: src/slic3r/GUI/SavePresetDialog.cpp:180 msgid "The supplied name is not available." msgstr "O nome fornecido não está disponível." -#: src/slic3r/GUI/SavePresetDialog.cpp:122 +#: src/slic3r/GUI/SavePresetDialog.cpp:186 +msgid "The supplied name is used for a system profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:187 msgid "Cannot overwrite a system profile." msgstr "Não é possível substituir um perfil de sistema." -#: src/slic3r/GUI/SavePresetDialog.cpp:127 +#: src/slic3r/GUI/SavePresetDialog.cpp:192 +msgid "The supplied name is used for a external profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:193 msgid "Cannot overwrite an external profile." msgstr "Não é possível substituir um perfil externo." -#: src/slic3r/GUI/SavePresetDialog.cpp:134 +#: src/slic3r/GUI/SavePresetDialog.cpp:203 +msgid "Save preset modifications to existing user profile" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:205 +msgid "Nothing changed" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:210 #, boost-format msgid "Preset with name \"%1%\" already exists." msgstr "Predefinido com nome \"%1%\" já existe." -#: src/slic3r/GUI/SavePresetDialog.cpp:136 +#: src/slic3r/GUI/SavePresetDialog.cpp:212 #, boost-format msgid "" "Preset with name \"%1%\" already exists and is incompatible with selected " @@ -8389,37 +9901,52 @@ msgstr "" "A predefinição com o nome \"%1%\" já existe e é incompatível com a " "impressora selecionada." -#: src/slic3r/GUI/SavePresetDialog.cpp:137 +#: src/slic3r/GUI/SavePresetDialog.cpp:213 msgid "Note: This preset will be replaced after saving" msgstr "Nota: Essa predefinição será substituída após salvar" -#: src/slic3r/GUI/SavePresetDialog.cpp:142 +#: src/slic3r/GUI/SavePresetDialog.cpp:219 msgid "The name cannot be empty." msgstr "O nome não pode estar vazio." -#: src/slic3r/GUI/SavePresetDialog.cpp:147 +#: src/slic3r/GUI/SavePresetDialog.cpp:230 +msgid "The name is too long." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:235 msgid "The name cannot start with space character." msgstr "O nome não pode começar com um caractere de espaço." -#: src/slic3r/GUI/SavePresetDialog.cpp:152 +#: src/slic3r/GUI/SavePresetDialog.cpp:240 msgid "The name cannot end with space character." msgstr "O nome não pode terminar com um caractere de espaço." -#: src/slic3r/GUI/SavePresetDialog.cpp:157 +#: src/slic3r/GUI/SavePresetDialog.cpp:245 msgid "The name cannot be the same as a preset alias name." msgstr "O nome não pode ser igual a um nome de alias predefinido." -#: src/slic3r/GUI/SavePresetDialog.cpp:191 -#: src/slic3r/GUI/SavePresetDialog.cpp:197 +#: src/slic3r/GUI/SavePresetDialog.cpp:289 msgid "Save preset" msgstr "Salvar predefinição" -#: src/slic3r/GUI/SavePresetDialog.cpp:221 +#: src/slic3r/GUI/SavePresetDialog.cpp:295 +msgid "Save presets" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:302 +msgid "Rename preset" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:327 msgctxt "PresetName" msgid "Copy" msgstr "Copiar" -#: src/slic3r/GUI/SavePresetDialog.cpp:283 +#: src/slic3r/GUI/SavePresetDialog.cpp:347 +msgid "Save as profile derived from current printer only." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:407 #, boost-format msgid "" "You have selected physical printer \"%1%\" \n" @@ -8428,84 +9955,96 @@ msgstr "" "Você selecionou a impressora física \"%1%\"\n" "com a predefinição de impressora relacionada \"%2%\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:322 +#: src/slic3r/GUI/SavePresetDialog.cpp:446 #, boost-format msgid "What would you like to do with \"%1%\" preset after saving?" msgstr "O que você gostaria de fazer com a predefinição \"%1%\" após salvar?" -#: src/slic3r/GUI/SavePresetDialog.cpp:325 +#: src/slic3r/GUI/SavePresetDialog.cpp:449 #, boost-format msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" msgstr "Altere \"%1%\" para \"%2%\" para esta impressora física \"%3%\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:326 +#: src/slic3r/GUI/SavePresetDialog.cpp:450 #, boost-format msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" msgstr "" "Adicione \"%1%\" como uma próxima predefinição para a impressora física \"%2%" "\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:327 +#: src/slic3r/GUI/SavePresetDialog.cpp:451 #, boost-format msgid "Just switch to \"%1%\" preset" msgstr "Basta mudar para a predefinição \"%1%\"" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2652 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2645 msgid "Stealth" msgstr "Silencioso" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2646 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2639 msgid "Normal" msgstr "Normal" -#: src/slic3r/GUI/Selection.cpp:168 +#: src/slic3r/GUI/Selection.cpp:180 msgid "Selection-Add" msgstr "Seleção-Adicionar" -#: src/slic3r/GUI/Selection.cpp:209 +#: src/slic3r/GUI/Selection.cpp:221 msgid "Selection-Remove" msgstr "Seleção-remover" -#: src/slic3r/GUI/Selection.cpp:241 +#: src/slic3r/GUI/Selection.cpp:253 msgid "Selection-Add Object" msgstr "Seleção-Adicionar objeto" -#: src/slic3r/GUI/Selection.cpp:260 +#: src/slic3r/GUI/Selection.cpp:272 msgid "Selection-Remove Object" msgstr "Seleção-remover objeto" -#: src/slic3r/GUI/Selection.cpp:278 +#: src/slic3r/GUI/Selection.cpp:290 msgid "Selection-Add Instance" msgstr "Instância de seleção-Adicionar" -#: src/slic3r/GUI/Selection.cpp:297 +#: src/slic3r/GUI/Selection.cpp:309 msgid "Selection-Remove Instance" msgstr "Seleção-remover instância" -#: src/slic3r/GUI/Selection.cpp:394 +#: src/slic3r/GUI/Selection.cpp:406 msgid "Selection-Add All" msgstr "Seleção-adicionar todos" -#: src/slic3r/GUI/Selection.cpp:419 +#: src/slic3r/GUI/Selection.cpp:431 msgid "Selection-Remove All" msgstr "Seleção-remover todos" -#: src/slic3r/GUI/Selection.cpp:950 +#: src/slic3r/GUI/Selection.cpp:1309 msgid "Scale To Fit" msgstr "Dimensionar para caber" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:114 +#: src/slic3r/GUI/Selection.cpp:1691 +msgid "" +"The currently manipulated object is tilted or contains tilted parts " +"(rotation angles are not multiples of 90°). Non-uniform scaling of tilted " +"objects is only possible in non-local coordinate systems, once the rotation " +"is embedded into the object coordinates." +msgstr "" + +#: src/slic3r/GUI/Selection.cpp:1694 +msgid "This operation is irreversible." +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:117 msgid "Data to send" msgstr "Dados a serem enviados" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:550 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:618 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:557 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:624 msgid "Send system info" msgstr "Enviar informações do sistema" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:581 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:587 #, boost-format msgid "" "This is the first time you are running %1%. We would like to ask you to send " @@ -8518,7 +10057,7 @@ msgstr "" "apenas uma vez e não solicitaremos que você faça isso novamente (somente " "depois de atualizar para a próxima versão)." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:585 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:591 msgid "" "If we know your hardware, operating system, etc., it will greatly help us in " "development and prioritization, because we will be able to focus our effort " @@ -8529,11 +10068,11 @@ msgstr "" "nossos esforços de forma mais eficiente e gastar tempo em recursos que são " "necessários a maioria." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:588 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:594 msgid "Is it safe?" msgstr "Isto é seguro?" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:590 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:596 #, boost-format msgid "" "We do not send any personal information nor anything that would allow us to " @@ -8551,82 +10090,87 @@ msgstr "" "código aberto, se você quiser inspecionar o código realmente realizando a " "comunicação, consulte %1%." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:614 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:620 msgid "Show verbatim data that will be sent" msgstr "Mostrar dados textuais que serão enviados" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:616 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:622 msgid "Ask me next time" msgstr "Pergunte-me da próxima vez" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:617 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:623 msgid "Do not send anything" msgstr "Não envie nada" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:703 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:709 msgid "System info sent successfully. Thank you." msgstr "Informações do sistema enviadas com sucesso. Obrigada." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:706 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:712 msgid "Sending system info failed!" msgstr "Falha ao enviar informações do sistema!" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:713 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:719 msgid "Sending system info was cancelled." msgstr "O envio de informações do sistema foi cancelado." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:720 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:726 msgid "Sending system info..." msgstr "Enviando informações do sistema..." -#: src/slic3r/GUI/SysInfoDialog.cpp:84 +#: src/slic3r/GUI/SysInfoDialog.cpp:92 msgid "System Information" msgstr "Informações do sistema" -#: src/slic3r/GUI/SysInfoDialog.cpp:150 +#: src/slic3r/GUI/SysInfoDialog.cpp:160 msgid "Blacklisted libraries loaded into PrusaSlicer process:" msgstr "Bibliotecas na lista negra carregadas no processo PrusaSlicer:" -#: src/slic3r/GUI/SysInfoDialog.cpp:162 +#: src/slic3r/GUI/SysInfoDialog.cpp:172 msgid "Eigen vectorization supported:" msgstr "Vetorização Eigen suportada:" -#: src/slic3r/GUI/SysInfoDialog.cpp:169 +#: src/slic3r/GUI/SysInfoDialog.cpp:179 msgid "Copy to Clipboard" msgstr "Copiar para a Área de Transferência" -#: src/slic3r/GUI/Tab.cpp:114 src/libslic3r/PrintConfig.cpp:565 +#: src/slic3r/GUI/Tab.cpp:68 src/libslic3r/PrintConfig.cpp:668 msgid "Compatible printers" msgstr "Impressoras compatíveis" -#: src/slic3r/GUI/Tab.cpp:115 +#: src/slic3r/GUI/Tab.cpp:69 msgid "Select the printers this profile is compatible with." msgstr "Selecione as impressoras com as quais este perfil é compatível." -#: src/slic3r/GUI/Tab.cpp:120 src/libslic3r/PrintConfig.cpp:580 +#: src/slic3r/GUI/Tab.cpp:74 src/libslic3r/PrintConfig.cpp:683 msgid "Compatible print profiles" msgstr "Perfis de impressão compatíveis" -#: src/slic3r/GUI/Tab.cpp:121 +#: src/slic3r/GUI/Tab.cpp:75 msgid "Select the print profiles this profile is compatible with." msgstr "" "Selecione os perfis de impressão com os quais este perfil é compatível." -#: src/slic3r/GUI/Tab.cpp:216 +#: src/slic3r/GUI/Tab.cpp:165 msgid "Compare this preset with some another" msgstr "Compare esta predefinição com alguma outra" #. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:218 +#: src/slic3r/GUI/Tab.cpp:167 #, c-format, boost-format msgid "Save current %s" msgstr "Salvar %s atual" -#: src/slic3r/GUI/Tab.cpp:219 +#: src/slic3r/GUI/Tab.cpp:168 +#, c-format, boost-format +msgid "Rename current %s" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:170 msgid "Delete this preset" msgstr "Exclua esta predefinição" -#: src/slic3r/GUI/Tab.cpp:223 +#: src/slic3r/GUI/Tab.cpp:174 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." @@ -8634,16 +10178,16 @@ msgstr "" "Passe o cursor sobre os botões para encontrar mais informações \n" "ou clique neste botão." -#: src/slic3r/GUI/Tab.cpp:227 +#: src/slic3r/GUI/Tab.cpp:178 #, boost-format msgid "Search in settings [%1%]" msgstr "Procurar em configurações [%1%]" -#: src/slic3r/GUI/Tab.cpp:1298 +#: src/slic3r/GUI/Tab.cpp:1243 msgid "Detach from system preset" msgstr "Esta é uma predefinição do sistema" -#: src/slic3r/GUI/Tab.cpp:1311 +#: src/slic3r/GUI/Tab.cpp:1256 msgid "" "A copy of the current system preset will be created, which will be detached " "from the system preset." @@ -8651,227 +10195,235 @@ msgstr "" "Uma cópia da predefinição do sistema atual será criada, que será desanexada " "da predefinição do sistema." -#: src/slic3r/GUI/Tab.cpp:1312 +#: src/slic3r/GUI/Tab.cpp:1257 msgid "" "The current custom preset will be detached from the parent system preset." msgstr "" "A predefinição personalizada atual será separada da predefinição do sistema " "padrão." -#: src/slic3r/GUI/Tab.cpp:1315 +#: src/slic3r/GUI/Tab.cpp:1260 msgid "Modifications to the current profile will be saved." msgstr "Modificações no perfil atual serão salvas." -#: src/slic3r/GUI/Tab.cpp:1321 +#: src/slic3r/GUI/Tab.cpp:1266 msgid "Detach preset" msgstr "Separar predefinição" -#: src/slic3r/GUI/Tab.cpp:1347 +#: src/slic3r/GUI/Tab.cpp:1292 msgid "This is a default preset." msgstr "Esta é uma predefinição padrão." -#: src/slic3r/GUI/Tab.cpp:1349 +#: src/slic3r/GUI/Tab.cpp:1294 msgid "This is a system preset." msgstr "Esta é uma predefinição do sistema." -#: src/slic3r/GUI/Tab.cpp:1351 +#: src/slic3r/GUI/Tab.cpp:1296 msgid "Current preset is inherited from the default preset." msgstr "Predefinição atual é herdada da predefinição padrão." -#: src/slic3r/GUI/Tab.cpp:1355 +#: src/slic3r/GUI/Tab.cpp:1300 msgid "Current preset is inherited from" msgstr "Predefinição atual é herdada de" -#: src/slic3r/GUI/Tab.cpp:1359 +#: src/slic3r/GUI/Tab.cpp:1304 msgid "It can't be deleted or modified." msgstr "Ele não pode ser excluído ou modificado." -#: src/slic3r/GUI/Tab.cpp:1360 +#: src/slic3r/GUI/Tab.cpp:1305 msgid "" "Any modifications should be saved as a new preset inherited from this one." msgstr "" "Todas as modificações devem ser salvas como uma nova predefinição herdada de " "uma presente." -#: src/slic3r/GUI/Tab.cpp:1361 +#: src/slic3r/GUI/Tab.cpp:1306 msgid "To do that please specify a new name for the preset." msgstr "Para fazer isso, especifique um novo nome para a predefinição." -#: src/slic3r/GUI/Tab.cpp:1365 +#: src/slic3r/GUI/Tab.cpp:1310 msgid "Additional information:" msgstr "Informações adicionais:" -#: src/slic3r/GUI/Tab.cpp:1371 +#: src/slic3r/GUI/Tab.cpp:1316 msgid "printer model" msgstr "modelo de impressora" -#: src/slic3r/GUI/Tab.cpp:1379 +#: src/slic3r/GUI/Tab.cpp:1324 msgid "default print profile" msgstr "perfil de impressão padrão" -#: src/slic3r/GUI/Tab.cpp:1382 +#: src/slic3r/GUI/Tab.cpp:1327 msgid "default filament profile" msgstr "perfil de filamento padrão" -#: src/slic3r/GUI/Tab.cpp:1396 +#: src/slic3r/GUI/Tab.cpp:1341 msgid "default SLA material profile" msgstr "perfil de material SLA padrão" -#: src/slic3r/GUI/Tab.cpp:1400 +#: src/slic3r/GUI/Tab.cpp:1345 msgid "default SLA print profile" msgstr "perfil de impressão padrão do SLA" -#: src/slic3r/GUI/Tab.cpp:1408 +#: src/slic3r/GUI/Tab.cpp:1353 msgid "full profile name" msgstr "nome customizado da config" -#: src/slic3r/GUI/Tab.cpp:1409 +#: src/slic3r/GUI/Tab.cpp:1354 msgid "symbolic profile name" msgstr "nome customizado da config" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4657 +#: src/slic3r/GUI/Tab.cpp:1392 src/slic3r/GUI/Tab.cpp:4940 msgid "Layers and perimeters" msgstr "Camadas e perímetros" -#: src/slic3r/GUI/Tab.cpp:1453 +#: src/slic3r/GUI/Tab.cpp:1398 msgid "Vertical shells" msgstr "Paredes verticais" -#: src/slic3r/GUI/Tab.cpp:1465 +#: src/slic3r/GUI/Tab.cpp:1410 msgid "Horizontal shells" msgstr "Paredes horizontais" -#: src/slic3r/GUI/Tab.cpp:1466 src/libslic3r/PrintConfig.cpp:2417 +#: src/slic3r/GUI/Tab.cpp:1411 src/libslic3r/PrintConfig.cpp:2448 msgid "Solid layers" msgstr "Camadas sólidas" -#: src/slic3r/GUI/Tab.cpp:1471 +#: src/slic3r/GUI/Tab.cpp:1416 msgid "Minimum shell thickness" msgstr "Espessura mínima da concha" -#: src/slic3r/GUI/Tab.cpp:1482 +#: src/slic3r/GUI/Tab.cpp:1427 msgid "Quality (slower slicing)" msgstr "Qualidade (fatiamento mais lento)" -#: src/slic3r/GUI/Tab.cpp:1497 +#: src/slic3r/GUI/Tab.cpp:1444 msgid "Fuzzy skin (experimental)" msgstr "Pele Difusa (Fuzzy skin - experimental)" -#: src/slic3r/GUI/Tab.cpp:1520 +#: src/slic3r/GUI/Tab.cpp:1467 msgid "Reducing printing time" msgstr "Reduzindo o tempo de impressão" -#: src/slic3r/GUI/Tab.cpp:1535 src/libslic3r/ExtrusionEntity.cpp:370 +#: src/slic3r/GUI/Tab.cpp:1482 msgid "Skirt" msgstr "Saia" -#: src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1504 msgid "Raft" msgstr "Estrado" -#: src/slic3r/GUI/Tab.cpp:1562 +#: src/slic3r/GUI/Tab.cpp:1509 msgid "Options for support material and raft" msgstr "Opções para material de suporte e estrado" -#: src/slic3r/GUI/Tab.cpp:1582 +#: src/slic3r/GUI/Tab.cpp:1528 +msgid "Organic supports" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1537 msgid "Speed for print moves" msgstr "Velocidade para movimentos de impressão" -#: src/slic3r/GUI/Tab.cpp:1595 +#: src/slic3r/GUI/Tab.cpp:1550 +msgid "Dynamic overhang speed" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1557 msgid "Speed for non-print moves" msgstr "Velocidade para movimentos não impressos" -#: src/slic3r/GUI/Tab.cpp:1599 +#: src/slic3r/GUI/Tab.cpp:1561 msgid "Modifiers" msgstr "Modificadores" -#: src/slic3r/GUI/Tab.cpp:1603 +#: src/slic3r/GUI/Tab.cpp:1565 msgid "Acceleration control (advanced)" msgstr "Controle de aceleração (avançado)" -#: src/slic3r/GUI/Tab.cpp:1614 +#: src/slic3r/GUI/Tab.cpp:1576 msgid "Autospeed (advanced)" msgstr "Velocidade automática (avançado)" -#: src/slic3r/GUI/Tab.cpp:1618 +#: src/slic3r/GUI/Tab.cpp:1580 msgid "Pressure equalizer (experimental)" msgstr "Equalizador de pressão (experimental)" -#: src/slic3r/GUI/Tab.cpp:1622 +#: src/slic3r/GUI/Tab.cpp:1584 msgid "Multiple Extruders" msgstr "Extrusoras múltiplas" -#: src/slic3r/GUI/Tab.cpp:1630 +#: src/slic3r/GUI/Tab.cpp:1592 msgid "Ooze prevention" msgstr "Prevenção de vazão" -#: src/slic3r/GUI/Tab.cpp:1650 +#: src/slic3r/GUI/Tab.cpp:1596 +msgid "Wipe tower" +msgstr "Torre de limpeza" + +#: src/slic3r/GUI/Tab.cpp:1612 msgid "Extrusion width" msgstr "Espessura da extrusão" -#: src/slic3r/GUI/Tab.cpp:1660 +#: src/slic3r/GUI/Tab.cpp:1622 msgid "Overlap" msgstr "Cobrir" -#: src/slic3r/GUI/Tab.cpp:1663 +#: src/slic3r/GUI/Tab.cpp:1625 msgid "Flow" msgstr "Fluxo" -#: src/slic3r/GUI/Tab.cpp:1674 src/slic3r/GUI/Tab.cpp:1700 -msgid "Other" -msgstr "Outro" - -#: src/slic3r/GUI/Tab.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:1636 msgid "Arachne perimeter generator" msgstr "Gerador de perímetro Arachne" -#: src/slic3r/GUI/Tab.cpp:1685 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1644 src/slic3r/GUI/Tab.cpp:4990 msgid "Output options" msgstr "Opções de saída" -#: src/slic3r/GUI/Tab.cpp:1686 +#: src/slic3r/GUI/Tab.cpp:1645 msgid "Sequential printing" msgstr "Impressão sequencial" -#: src/slic3r/GUI/Tab.cpp:1688 +#: src/slic3r/GUI/Tab.cpp:1647 msgid "Extruder clearance" msgstr "Folga da extrusora" -#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:4735 +#: src/slic3r/GUI/Tab.cpp:1652 src/slic3r/GUI/Tab.cpp:4991 msgid "Output file" msgstr "Arquivo de saída" -#: src/slic3r/GUI/Tab.cpp:1712 src/libslic3r/PrintConfig.cpp:2042 +#: src/slic3r/GUI/Tab.cpp:1671 src/libslic3r/PrintConfig.cpp:2072 msgid "Post-processing scripts" msgstr "Scripts de pós-processamento" -#: src/slic3r/GUI/Tab.cpp:1724 src/slic3r/GUI/Tab.cpp:1725 -#: src/slic3r/GUI/Tab.cpp:2110 src/slic3r/GUI/Tab.cpp:2111 -#: src/slic3r/GUI/Tab.cpp:2498 src/slic3r/GUI/Tab.cpp:2499 -#: src/slic3r/GUI/Tab.cpp:2571 src/slic3r/GUI/Tab.cpp:2572 -#: src/slic3r/GUI/Tab.cpp:3957 src/slic3r/GUI/Tab.cpp:4585 -#: src/slic3r/GUI/Tab.cpp:4586 +#: src/slic3r/GUI/Tab.cpp:1683 src/slic3r/GUI/Tab.cpp:1684 +#: src/slic3r/GUI/Tab.cpp:2080 src/slic3r/GUI/Tab.cpp:2081 +#: src/slic3r/GUI/Tab.cpp:2486 src/slic3r/GUI/Tab.cpp:2487 +#: src/slic3r/GUI/Tab.cpp:2564 src/slic3r/GUI/Tab.cpp:2565 +#: src/slic3r/GUI/Tab.cpp:4182 src/slic3r/GUI/Tab.cpp:4822 +#: src/slic3r/GUI/Tab.cpp:4823 msgid "Notes" msgstr "Notas" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:2088 +#: src/slic3r/GUI/Tab.cpp:2493 src/slic3r/GUI/Tab.cpp:2571 +#: src/slic3r/GUI/Tab.cpp:4830 src/slic3r/GUI/Tab.cpp:4996 msgid "Dependencies" msgstr "Dependências" -#: src/slic3r/GUI/Tab.cpp:1732 src/slic3r/GUI/Tab.cpp:2119 -#: src/slic3r/GUI/Tab.cpp:2506 src/slic3r/GUI/Tab.cpp:2579 -#: src/slic3r/GUI/Tab.cpp:4594 src/slic3r/GUI/Tab.cpp:4741 +#: src/slic3r/GUI/Tab.cpp:1691 src/slic3r/GUI/Tab.cpp:2089 +#: src/slic3r/GUI/Tab.cpp:2494 src/slic3r/GUI/Tab.cpp:2572 +#: src/slic3r/GUI/Tab.cpp:4831 src/slic3r/GUI/Tab.cpp:4997 msgid "Profile dependencies" msgstr "Dependências de perfil" -#: src/slic3r/GUI/Tab.cpp:1771 +#: src/slic3r/GUI/Tab.cpp:1723 msgid "Post processing scripts shall modify G-code file in place." msgstr "" "Os scripts de pós-processamento devem modificar o arquivo de G-code no local." -#: src/slic3r/GUI/Tab.cpp:1850 +#: src/slic3r/GUI/Tab.cpp:1802 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8884,7 +10436,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:1855 +#: src/slic3r/GUI/Tab.cpp:1807 msgid "Found reserved keywords in" msgstr "Palavras-chave reservadas encontradas em" @@ -8892,76 +10444,92 @@ msgstr "Palavras-chave reservadas encontradas em" msgid "Filament Overrides" msgstr "Sobrescrever config. de filamento" -#: src/slic3r/GUI/Tab.cpp:1992 +#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2827 +msgid "Retraction" +msgstr "Retração" + +#: src/slic3r/GUI/Tab.cpp:1951 +msgid "Temperature" +msgstr "Temperatura" + +#: src/slic3r/GUI/Tab.cpp:1955 msgid "Nozzle" msgstr "Bico de impressão" -#: src/slic3r/GUI/Tab.cpp:1997 +#: src/slic3r/GUI/Tab.cpp:1960 msgid "Bed" msgstr "Mesa" -#: src/slic3r/GUI/Tab.cpp:2002 +#: src/slic3r/GUI/Tab.cpp:1965 msgid "Cooling" msgstr "Resfriamento" -#: src/slic3r/GUI/Tab.cpp:2004 src/libslic3r/PrintConfig.cpp:1936 -#: src/libslic3r/PrintConfig.cpp:2994 +#: src/slic3r/GUI/Tab.cpp:1967 src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "Enable" msgstr "Habilitar" -#: src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/Tab.cpp:1978 msgid "Fan settings" msgstr "Config. da ventoinha" -#: src/slic3r/GUI/Tab.cpp:2026 +#: src/slic3r/GUI/Tab.cpp:1979 +msgid "Fan speed" +msgstr "Velocidade do ventoinha" + +#: src/slic3r/GUI/Tab.cpp:1989 +msgid "Dynamic fan speeds" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1996 msgid "Cooling thresholds" msgstr "Limiares de resfriamento" -#: src/slic3r/GUI/Tab.cpp:2032 +#: src/slic3r/GUI/Tab.cpp:2002 msgid "Filament properties" msgstr "Propriedades de filamento" -#: src/slic3r/GUI/Tab.cpp:2039 +#: src/slic3r/GUI/Tab.cpp:2009 msgid "Print speed override" msgstr "Substituição da velocidade de impressão" -#: src/slic3r/GUI/Tab.cpp:2049 +#: src/slic3r/GUI/Tab.cpp:2019 msgid "Wipe tower parameters" msgstr "Parâmetros da torre de limpeza" -#: src/slic3r/GUI/Tab.cpp:2052 +#: src/slic3r/GUI/Tab.cpp:2022 msgid "Toolchange parameters with single extruder MM printers" msgstr "" "Parâmetros de mudança de ferramenta com impressoras de multi material com " "apenas uma extrusora" -#: src/slic3r/GUI/Tab.cpp:2065 +#: src/slic3r/GUI/Tab.cpp:2035 msgid "Ramming settings" msgstr "Config. de Ramming" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 -#: src/slic3r/GUI/Tab.cpp:4264 src/libslic3r/GCode.cpp:733 -#: src/libslic3r/PrintConfig.cpp:2500 +#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:2398 +#: src/slic3r/GUI/Tab.cpp:4493 src/libslic3r/GCode.cpp:684 +#: src/libslic3r/PrintConfig.cpp:2532 msgid "Custom G-code" msgstr "G-code customizado" -#: src/slic3r/GUI/Tab.cpp:2090 src/slic3r/GUI/Tab.cpp:2411 -#: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2450 -#: src/libslic3r/PrintConfig.cpp:2465 +#: src/slic3r/GUI/Tab.cpp:2060 src/slic3r/GUI/Tab.cpp:2399 +#: src/libslic3r/GCode.cpp:658 src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2497 msgid "Start G-code" msgstr "G-code de início" -#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:2421 -#: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:685 -#: src/libslic3r/PrintConfig.cpp:695 +#: src/slic3r/GUI/Tab.cpp:2070 src/slic3r/GUI/Tab.cpp:2409 +#: src/libslic3r/GCode.cpp:659 src/libslic3r/PrintConfig.cpp:788 +#: src/libslic3r/PrintConfig.cpp:798 msgid "End G-code" msgstr "G-code de finalização" -#: src/slic3r/GUI/Tab.cpp:2153 +#: src/slic3r/GUI/Tab.cpp:2115 msgid "Volumetric flow hints not available" msgstr "Dicas de fluxo volumétrico não disponíveis" -#: src/slic3r/GUI/Tab.cpp:2257 +#: src/slic3r/GUI/Tab.cpp:2241 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -8983,20 +10551,20 @@ msgstr "" "\"engrenagem\" na guia Configurações da impressora. Os perfis de impressora " "física estão sendo armazenados no diretório PrusaSlicer /physical_printer." -#: src/slic3r/GUI/Tab.cpp:2291 src/slic3r/GUI/Tab.cpp:2518 +#: src/slic3r/GUI/Tab.cpp:2275 src/slic3r/GUI/Tab.cpp:2506 msgid "Size and coordinates" msgstr "Tamanho e coordenadas" -#: src/slic3r/GUI/Tab.cpp:2300 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:2284 src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "Capabilities" msgstr "Capacidades" -#: src/slic3r/GUI/Tab.cpp:2305 +#: src/slic3r/GUI/Tab.cpp:2289 msgid "Number of extruders of the printer." msgstr "Número de extrusoras da impressora." -#: src/slic3r/GUI/Tab.cpp:2334 +#: src/slic3r/GUI/Tab.cpp:2322 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -9008,105 +10576,101 @@ msgstr "" "Você quer mudar o diâmetro para todas as extrusoras ao primeiro valor do " "diâmetro da ponteira da extrusora?" -#: src/slic3r/GUI/Tab.cpp:2338 src/slic3r/GUI/Tab.cpp:2782 -#: src/libslic3r/PrintConfig.cpp:1900 +#: src/slic3r/GUI/Tab.cpp:2326 src/slic3r/GUI/Tab.cpp:2714 +#: src/libslic3r/PrintConfig.cpp:1937 msgid "Nozzle diameter" msgstr "Diâmetro do bico" -#: src/slic3r/GUI/Tab.cpp:2431 src/libslic3r/GCode.cpp:709 -#: src/libslic3r/PrintConfig.cpp:425 +#: src/slic3r/GUI/Tab.cpp:2419 src/libslic3r/GCode.cpp:660 +#: src/libslic3r/PrintConfig.cpp:444 msgid "Before layer change G-code" msgstr "Antes da mudança de camada G-code" -#: src/slic3r/GUI/Tab.cpp:2441 src/libslic3r/GCode.cpp:710 -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/slic3r/GUI/Tab.cpp:2429 src/libslic3r/GCode.cpp:661 +#: src/libslic3r/PrintConfig.cpp:1665 msgid "After layer change G-code" msgstr "Após a mudança da camada do G-code" -#: src/slic3r/GUI/Tab.cpp:2451 src/libslic3r/GCode.cpp:711 -#: src/libslic3r/PrintConfig.cpp:2877 +#: src/slic3r/GUI/Tab.cpp:2439 src/libslic3r/GCode.cpp:662 +#: src/libslic3r/PrintConfig.cpp:2965 msgid "Tool change G-code" msgstr "G-code de troca de ferramenta" -#: src/slic3r/GUI/Tab.cpp:2461 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2449 src/libslic3r/GCode.cpp:663 msgid "Between objects G-code (for sequential printing)" msgstr "G-code entre objetos (para impressão sequencial)" -#: src/slic3r/GUI/Tab.cpp:2471 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2459 src/libslic3r/GCode.cpp:664 msgid "Color Change G-code" msgstr "G-code de troca de cor" -#: src/slic3r/GUI/Tab.cpp:2480 src/libslic3r/GCode.cpp:714 -#: src/libslic3r/PrintConfig.cpp:2491 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:665 +#: src/libslic3r/PrintConfig.cpp:2523 msgid "Pause Print G-code" msgstr "Pausa impressão ou G-code personalizado" -#: src/slic3r/GUI/Tab.cpp:2489 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:666 msgid "Template Custom G-code" msgstr "Modelo de G-code customizado" -#: src/slic3r/GUI/Tab.cpp:2525 +#: src/slic3r/GUI/Tab.cpp:2513 msgid "Display" msgstr "Exibição" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2528 msgid "Tilt" msgstr "Inclinar" -#: src/slic3r/GUI/Tab.cpp:2541 +#: src/slic3r/GUI/Tab.cpp:2529 msgid "Tilt time" msgstr "Tempo de inclinação" -#: src/slic3r/GUI/Tab.cpp:2548 src/slic3r/GUI/Tab.cpp:4575 +#: src/slic3r/GUI/Tab.cpp:2536 src/slic3r/GUI/Tab.cpp:4812 msgid "Corrections" msgstr "Correções" -#: src/slic3r/GUI/Tab.cpp:2561 src/slic3r/GUI/Tab.cpp:4571 +#: src/slic3r/GUI/Tab.cpp:2549 src/slic3r/GUI/Tab.cpp:4808 msgid "Exposure" msgstr "Exposição" -#: src/slic3r/GUI/Tab.cpp:2622 src/slic3r/GUI/Tab.cpp:2709 -#: src/libslic3r/PrintConfig.cpp:1655 src/libslic3r/PrintConfig.cpp:1690 -#: src/libslic3r/PrintConfig.cpp:1707 src/libslic3r/PrintConfig.cpp:1724 -#: src/libslic3r/PrintConfig.cpp:1740 src/libslic3r/PrintConfig.cpp:1750 -#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1773 -#: src/libslic3r/PrintConfig.cpp:1783 +#: src/slic3r/GUI/Tab.cpp:2556 +msgid "Output" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2615 src/slic3r/GUI/Tab.cpp:2875 +#: src/libslic3r/PrintConfig.cpp:1694 src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1744 src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1777 src/libslic3r/PrintConfig.cpp:1787 +#: src/libslic3r/PrintConfig.cpp:1797 src/libslic3r/PrintConfig.cpp:1810 +#: src/libslic3r/PrintConfig.cpp:1820 msgid "Machine limits" msgstr "Limites da máquina" -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2638 msgid "Values in this column are for Normal mode" msgstr "Valores nesta coluna são para o modo normal" -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2644 msgid "Values in this column are for Stealth mode" msgstr "Valores nesta coluna são para o modo furtivo" -#: src/slic3r/GUI/Tab.cpp:2660 +#: src/slic3r/GUI/Tab.cpp:2653 msgid "Maximum feedrates" msgstr "Velocidade máxima de alimentação" -#: src/slic3r/GUI/Tab.cpp:2665 +#: src/slic3r/GUI/Tab.cpp:2658 msgid "Maximum accelerations" msgstr "Acelerações máximas" -#: src/slic3r/GUI/Tab.cpp:2674 +#: src/slic3r/GUI/Tab.cpp:2667 msgid "Jerk limits" msgstr "Limites de empurrão" -#: src/slic3r/GUI/Tab.cpp:2680 +#: src/slic3r/GUI/Tab.cpp:2673 msgid "Minimum feedrates" msgstr "Velocidades alimentação mínimos" -#: src/slic3r/GUI/Tab.cpp:2734 src/slic3r/GUI/Tab.cpp:2743 -msgid "Single extruder MM setup" -msgstr "Config. de extrusora multi material" - -#: src/slic3r/GUI/Tab.cpp:2744 -msgid "Single extruder multimaterial parameters" -msgstr "Parâmetros para extrusora única multimaterial" - -#: src/slic3r/GUI/Tab.cpp:2779 +#: src/slic3r/GUI/Tab.cpp:2711 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -9114,19 +10678,27 @@ msgstr "" "Esta é uma única impressora multimaterial extrusora, diâmetros de todas as " "extrusoras será definido para o novo valor. Você quer prosseguir?" -#: src/slic3r/GUI/Tab.cpp:2804 +#: src/slic3r/GUI/Tab.cpp:2739 +msgid "Reset to Filament Color" +msgstr "Restabelecer cor do filamento" + +#: src/slic3r/GUI/Tab.cpp:2775 +msgid "Apply below setting to other extruders" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2820 msgid "Layer height limits" msgstr "Limites de altura da camada" -#: src/slic3r/GUI/Tab.cpp:2809 +#: src/slic3r/GUI/Tab.cpp:2824 msgid "Position (for multi-extruder printers)" msgstr "Posição (para impressoras multiextrusoras)" -#: src/slic3r/GUI/Tab.cpp:2815 +#: src/slic3r/GUI/Tab.cpp:2830 msgid "Only lift Z" msgstr "Apenas elevar Z" -#: src/slic3r/GUI/Tab.cpp:2828 +#: src/slic3r/GUI/Tab.cpp:2843 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -9134,11 +10706,15 @@ msgstr "" "Retração quando a ferramenta está desativada (config. avançadas para " "instalações multiextrusoras)" -#: src/slic3r/GUI/Tab.cpp:2835 -msgid "Reset to Filament Color" -msgstr "Restabelecer cor do filamento" +#: src/slic3r/GUI/Tab.cpp:2900 src/slic3r/GUI/Tab.cpp:2909 +msgid "Single extruder MM setup" +msgstr "Config. de extrusora multi material" + +#: src/slic3r/GUI/Tab.cpp:2910 +msgid "Single extruder multimaterial parameters" +msgstr "Parâmetros para extrusora única multimaterial" -#: src/slic3r/GUI/Tab.cpp:3012 +#: src/slic3r/GUI/Tab.cpp:3074 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -9148,31 +10724,46 @@ msgstr "" "\n" "Devo desativá-lo, a fim de permitir a retração de firmware?" -#: src/slic3r/GUI/Tab.cpp:3014 +#: src/slic3r/GUI/Tab.cpp:3076 msgid "Firmware Retraction" msgstr "Retração do firmware" -#: src/slic3r/GUI/Tab.cpp:3319 +#: src/slic3r/GUI/Tab.cpp:3384 msgid "New printer preset selected" msgstr "Nova predefinição de impressora selecionada" -#: src/slic3r/GUI/Tab.cpp:3625 +#: src/slic3r/GUI/Tab.cpp:3758 msgid "Detached" msgstr "Separado" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3857 +msgid "" +"The physical printer below is based on the preset, you are going to rename." +msgid_plural "" +"The physical printers below are based on the preset, you are going to rename." +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Tab.cpp:3862 +msgid "Note, that the selected preset will be renamed in this printer too." +msgid_plural "" +"Note, that the selected preset will be renamed in these printers too." +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Tab.cpp:3924 msgid "remove" msgstr "remover" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3924 msgid "delete" msgstr "excluir" -#: src/slic3r/GUI/Tab.cpp:3711 +#: src/slic3r/GUI/Tab.cpp:3933 msgid "It's a last preset for this physical printer." msgstr "É uma última predefinição para esta impressora física." -#: src/slic3r/GUI/Tab.cpp:3716 +#: src/slic3r/GUI/Tab.cpp:3938 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " @@ -9181,7 +10772,7 @@ msgstr "" "Tem certeza de que deseja excluir predefinição \"%1%\" da impressora física " "\"%2%\"?" -#: src/slic3r/GUI/Tab.cpp:3728 +#: src/slic3r/GUI/Tab.cpp:3950 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -9189,14 +10780,14 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3733 +#: src/slic3r/GUI/Tab.cpp:3955 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3738 +#: src/slic3r/GUI/Tab.cpp:3960 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -9206,7 +10797,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3743 +#: src/slic3r/GUI/Tab.cpp:3965 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -9214,57 +10805,57 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3748 +#: src/slic3r/GUI/Tab.cpp:3970 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "Tem certeza de que deseja %1% da predefinição selecionada?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3753 +#: src/slic3r/GUI/Tab.cpp:3975 #, boost-format msgid "%1% Preset" msgstr "%1% Predefinição" -#: src/slic3r/GUI/Tab.cpp:3836 src/slic3r/GUI/Tab.cpp:4198 +#: src/slic3r/GUI/Tab.cpp:4061 src/slic3r/GUI/Tab.cpp:4423 msgid "Set" msgstr "Definir" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:4180 msgid "Find" msgstr "Achar" -#: src/slic3r/GUI/Tab.cpp:3956 +#: src/slic3r/GUI/Tab.cpp:4181 msgid "Replace with" msgstr "Substituir por" -#: src/slic3r/GUI/Tab.cpp:4045 +#: src/slic3r/GUI/Tab.cpp:4270 msgid "Regular expression" msgstr "Expressão regular" -#: src/slic3r/GUI/Tab.cpp:4049 +#: src/slic3r/GUI/Tab.cpp:4274 msgid "Case insensitive" msgstr "Não diferencia maiúsculas de minúsculas" -#: src/slic3r/GUI/Tab.cpp:4053 +#: src/slic3r/GUI/Tab.cpp:4278 msgid "Whole word" msgstr "Palavra inteira" -#: src/slic3r/GUI/Tab.cpp:4057 +#: src/slic3r/GUI/Tab.cpp:4282 msgid "Match single line" msgstr "Corresponder a uma única linha" -#: src/slic3r/GUI/Tab.cpp:4160 +#: src/slic3r/GUI/Tab.cpp:4385 msgid "Are you sure you want to delete all substitutions?" msgstr "Tem certeza de que deseja excluir todas as substituições?" -#: src/slic3r/GUI/Tab.cpp:4292 +#: src/slic3r/GUI/Tab.cpp:4521 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" "Os limites da máquina serão emitidos para o G-code e usados ​​o para estimar o " "tempo de impressão." -#: src/slic3r/GUI/Tab.cpp:4295 +#: src/slic3r/GUI/Tab.cpp:4524 msgid "" "Machine limits will NOT be emitted to G-code, however they will be used to " "estimate print time, which may therefore not be accurate as the printer may " @@ -9275,7 +10866,7 @@ msgstr "" "preciso, pois a impressora pode aplicar um conjunto diferente de limites da " "máquina." -#: src/slic3r/GUI/Tab.cpp:4299 +#: src/slic3r/GUI/Tab.cpp:4528 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." @@ -9283,12 +10874,12 @@ msgstr "" "Os limites da máquina não são definidos, portanto, a estimativa do tempo de " "impressão pode não ser precisa." -#: src/slic3r/GUI/Tab.cpp:4321 +#: src/slic3r/GUI/Tab.cpp:4550 msgid "LOCKED LOCK" msgstr "CADEADO FECHADO" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4323 +#: src/slic3r/GUI/Tab.cpp:4552 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" @@ -9296,12 +10887,12 @@ msgstr "" "indica que as config. são as mesmas que os valores do sistema (ou padrão) " "para o grupo de opções atual" -#: src/slic3r/GUI/Tab.cpp:4325 +#: src/slic3r/GUI/Tab.cpp:4554 msgid "UNLOCKED LOCK" msgstr "CADEADO ABERTO" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4327 +#: src/slic3r/GUI/Tab.cpp:4556 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -9313,12 +10904,12 @@ msgstr "" "Clique no ícone DESBLOQUEAR para redefinir todas as config. do grupo de " "opções atual para os valores do sistema (ou padrão)." -#: src/slic3r/GUI/Tab.cpp:4332 +#: src/slic3r/GUI/Tab.cpp:4561 msgid "WHITE BULLET" msgstr "PONTO BRANCO" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4334 +#: src/slic3r/GUI/Tab.cpp:4563 msgid "" "for the left button: indicates a non-system (or non-default) preset,\n" "for the right button: indicates that the settings hasn't been modified." @@ -9327,12 +10918,12 @@ msgstr "" "padrão),\n" "para o botão direito: indica que as config. não foram modificadas." -#: src/slic3r/GUI/Tab.cpp:4337 +#: src/slic3r/GUI/Tab.cpp:4566 msgid "BACK ARROW" msgstr "REDEFINIR" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4339 +#: src/slic3r/GUI/Tab.cpp:4568 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -9344,7 +10935,7 @@ msgstr "" "Clique no ícone REDEFINIR para redefinir todas as config. do grupo de opções " "atual para a última predefinição salva." -#: src/slic3r/GUI/Tab.cpp:4349 +#: src/slic3r/GUI/Tab.cpp:4578 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -9352,7 +10943,7 @@ msgstr "" "O ícone CADEADO FECHADO indica que as config. são as mesmas que os valores " "do sistema (ou padrão) para o grupo de opções atual" -#: src/slic3r/GUI/Tab.cpp:4351 +#: src/slic3r/GUI/Tab.cpp:4580 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " "equal to the system (or default) values for the current option group.\n" @@ -9364,13 +10955,13 @@ msgstr "" "Clique para redefinir todas as config. para o grupo de opções atual para os " "valores do sistema (ou padrão)." -#: src/slic3r/GUI/Tab.cpp:4354 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" "O ícone PONTO BRANCO indica uma predefinição que não é do sistema (ou não " "predefinida)." -#: src/slic3r/GUI/Tab.cpp:4357 +#: src/slic3r/GUI/Tab.cpp:4586 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -9378,7 +10969,7 @@ msgstr "" "O ícone PONTO BRANCO indica que as config. são as mesmas da última " "predefinição salva para o grupo de opções atual." -#: src/slic3r/GUI/Tab.cpp:4359 +#: src/slic3r/GUI/Tab.cpp:4588 msgid "" "BACK ARROW icon indicates that the settings were changed and are not equal " "to the last saved preset for the current option group.\n" @@ -9390,7 +10981,7 @@ msgstr "" "Clique para redefinir todas as config. do grupo de opções atual para a " "última predefinição salva." -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4594 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." @@ -9398,7 +10989,7 @@ msgstr "" "O ícone CADEADO FECHADO indica que o valor é o mesmo que o valor do sistema " "(ou padrão)." -#: src/slic3r/GUI/Tab.cpp:4366 +#: src/slic3r/GUI/Tab.cpp:4595 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -9408,7 +10999,7 @@ msgstr "" "valor do sistema (ou padrão).\n" "Clique para redefinir o valor atual para o valor do sistema (ou padrão)." -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4601 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -9416,7 +11007,7 @@ msgstr "" "O ícone PONTO BRANCO indica que o valor é o mesmo da última predefinição " "guardada." -#: src/slic3r/GUI/Tab.cpp:4373 +#: src/slic3r/GUI/Tab.cpp:4602 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -9426,31 +11017,31 @@ msgstr "" "predefinição salva.\n" "Clique para redefinir o valor atual para a última predefinição salva." -#: src/slic3r/GUI/Tab.cpp:4527 src/slic3r/GUI/Tab.cpp:4529 +#: src/slic3r/GUI/Tab.cpp:4764 src/slic3r/GUI/Tab.cpp:4766 msgid "Material" msgstr "Material" -#: src/slic3r/GUI/Tab.cpp:4614 src/slic3r/GUI/Tab.cpp:4615 +#: src/slic3r/GUI/Tab.cpp:4851 src/slic3r/GUI/Tab.cpp:4852 msgid "Material printing profile" msgstr "Perfil de impressão de materiais" -#: src/slic3r/GUI/Tab.cpp:4667 +#: src/slic3r/GUI/Tab.cpp:4901 msgid "Support head" msgstr "Cabeça de suporte" -#: src/slic3r/GUI/Tab.cpp:4672 +#: src/slic3r/GUI/Tab.cpp:4906 msgid "Support pillar" msgstr "Pilar de suporte" -#: src/slic3r/GUI/Tab.cpp:4695 +#: src/slic3r/GUI/Tab.cpp:4929 msgid "Connection of the support sticks and junctions" msgstr "Conexão das varas de suporte e junções" -#: src/slic3r/GUI/Tab.cpp:4700 +#: src/slic3r/GUI/Tab.cpp:4956 msgid "Automatic generation" msgstr "Geração Automática" -#: src/slic3r/GUI/Tab.cpp:4775 +#: src/slic3r/GUI/Tab.cpp:5024 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -9459,62 +11050,60 @@ msgstr "" "\"%1%\" está desabilitado porque \"%2%\" está ativado na categoria \"%3%\".\n" "Para habilitar \"%1%\", desligue \"%2%\"" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3724 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3497 msgid "Object elevation" msgstr "Elevação do objeto" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3826 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3958 msgid "Pad around object" msgstr "Pad em torno do objeto" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:153 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:162 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1047 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1100 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1115 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1130 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1145 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:147 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:156 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:165 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1107 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1122 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1137 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1152 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1197 msgid "Undef" msgstr "Indef" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:772 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:792 msgid "Unsaved Changes" msgstr "Mudanças não salvas" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:790 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:810 msgid "Switching Presets: Unsaved Changes" msgstr "Alterando Predefinições: Alterações não salvas" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:832 -msgid "Old Value" -msgstr "Valor Antigo" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:858 +msgid "Original Value" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:859 +msgid "Modified Value" +msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:833 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:861 msgid "New Value" msgstr "Valor Novo" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:867 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 msgid "Keep" msgstr "Manter" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1569 msgid "Transfer" msgstr "Transferir" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 msgid "Don't save" msgstr "Não Salvar" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 -msgid "Discard" -msgstr "Descartar" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:877 -msgid "Save" -msgstr "Salvar" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:898 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:926 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "create new project" @@ -9522,7 +11111,7 @@ msgstr "" "Você não será perguntado sobre as alterações não salvas nas predefinições na " "próxima vez que criar um novo projeto" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:927 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "switch a preset" @@ -9530,7 +11119,7 @@ msgstr "" "Você não será questionado sobre as alterações não salvas nas predefinições " "na próxima vez que alternar uma predefinição" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:900 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:928 msgid "" "You will not be asked about the unsaved changes in presets the next time " "you: \n" @@ -9542,11 +11131,11 @@ msgstr "" "- Fechando o PrusaSlicer enquanto algumas predefinições são modificadas,\n" "- Carregando um novo projeto enquanto alguns predefinições são modificados" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:903 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:931 msgid "PrusaSlicer will remember your action." msgstr "PrusaSlicer se lembrará de sua ação." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:904 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:932 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" @@ -9555,59 +11144,59 @@ msgstr "" "Visite \"Preferências\" e marque \"%1%\"\n" "para ser questionado sobre alterações não salvas novamente." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:964 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1772 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" "Alguns campos são muito longos para caber. Clique com o botão direito do " "mouse para revelar o texto completo." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will not be saved" msgstr "Todas as alterações de configurações não serão salvas" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will be discarded." msgstr "Todas as alterações nas configurações serão descartadas." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:941 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:969 msgid "Save the selected options." msgstr "Remover o objeto selecionado." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:942 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:970 msgid "Keep the selected settings." msgstr "Mantenha as configurações selecionadas." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:943 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:971 msgid "Transfer the selected settings to the newly selected preset." msgstr "" "Transfira as opções selecionadas para as predefinições recém-selecionadas." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:947 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:975 #, boost-format msgid "Save the selected options to preset \"%1%\"." msgstr "Salve as opções selecionadas para predefinir \"%1%\"." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:948 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:976 #, boost-format msgid "Transfer the selected options to the newly selected preset \"%1%\"." msgstr "" "Transfira as opções selecionadas para a predefinição recém-selecionada \"%1%" "\"." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1224 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1237 msgid "The following preset was modified" msgid_plural "The following presets were modified" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1230 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1243 #, boost-format msgid "Preset \"%1%\" has the following unsaved changes:" msgstr "\"%1%\"Tem as seguintes alterações não salvas:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1234 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1247 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new printer profile and it has the " @@ -9616,7 +11205,7 @@ msgstr "" "A predefinição \"%1%\" não é compatível com o novo perfil de impressora e " "possui as seguintes alterações não salvas:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1235 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1248 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new print profile and it has the " @@ -9625,40 +11214,67 @@ msgstr "" "A predefinição \"%1%\" não é compatível com o novo perfil de impressão e " "possui as seguintes alterações não salvas:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1297 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1850 msgid "Extruders count" msgstr "Contagem de extrusoras" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 -msgid "Select presets to compare" -msgstr "Selecione predefinições para comparar" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1326 +msgid "The preset modifications are successfully saved" +msgid_plural "The presets modifications are successfully saved" +msgstr[0] "As modificações da predefinição foram salvas com sucesso" +msgstr[1] "As modificações das predefinições foram salvas com sucesso" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1515 msgid "Show all presets (including incompatible)" msgstr "Mostrar todas as predefinições (incluindo incompatíveis)" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1533 +msgid "Select presets to compare" +msgstr "Selecione predefinições para comparar" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1545 msgid "Left Preset Value" msgstr "Valor predefinido esquerdo" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1546 msgid "Right Preset Value" msgstr "Valor predefinido direito" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1595 +msgid "" +"Transfer the selected options from left preset to the right.\n" +"Note: New modified presets will be selected in settings tabs after close " +"this dialog." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1603 +msgid "Save the selected options from left preset to the right." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1621 +msgid "Transfer values from left to right" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1622 +msgid "" +"If enabled, this dialog can be used for transver selected values from left " +"to right preset." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1807 msgid "One of the presets doesn't found" msgstr "Uma das predefinições não foi encontrada" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1818 msgid "Compared presets has different printer technology" msgstr "As predefinições comparadas têm tecnologia de impressora diferente" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1832 msgid "Presets are the same" msgstr "As predefinições são as mesmas" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1840 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." @@ -9667,57 +11283,129 @@ msgstr "" "Clique neste botão para selecionar a mesma predefinição para a predefinição " "direita e esquerda." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef category" msgstr "Categoria indefinida" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef group" msgstr "Grupo indefinido" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:2016 +msgid "Modified" +msgstr "Modificado" + +#: src/slic3r/GUI/UpdateDialogs.cpp:41 msgid "Update available" msgstr "Atualização disponível" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UpdateDialogs.cpp:41 #, c-format, boost-format msgid "New version of %s is available" msgstr "Nova versão do %s está disponível" -#: src/slic3r/GUI/UpdateDialogs.cpp:42 +#: src/slic3r/GUI/UpdateDialogs.cpp:46 src/slic3r/GUI/UpdateDialogs.cpp:101 msgid "Current version:" msgstr "Versão atual:" -#: src/slic3r/GUI/UpdateDialogs.cpp:44 +#: src/slic3r/GUI/UpdateDialogs.cpp:48 src/slic3r/GUI/UpdateDialogs.cpp:103 +#: src/slic3r/GUI/UpdateDialogs.cpp:141 msgid "New version:" msgstr "Nova versão:" -#: src/slic3r/GUI/UpdateDialogs.cpp:52 +#: src/slic3r/GUI/UpdateDialogs.cpp:56 msgid "Changelog & Download" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:59 src/slic3r/GUI/UpdateDialogs.cpp:133 -#: src/slic3r/GUI/UpdateDialogs.cpp:191 +#: src/slic3r/GUI/UpdateDialogs.cpp:63 src/slic3r/GUI/UpdateDialogs.cpp:309 +#: src/slic3r/GUI/UpdateDialogs.cpp:367 msgid "Open changelog page" msgstr "Abra a página do changelog" -#: src/slic3r/GUI/UpdateDialogs.cpp:65 +#: src/slic3r/GUI/UpdateDialogs.cpp:69 msgid "Open download page" msgstr "Abrir página de download" -#: src/slic3r/GUI/UpdateDialogs.cpp:72 +#: src/slic3r/GUI/UpdateDialogs.cpp:76 src/slic3r/GUI/UpdateDialogs.cpp:109 msgid "Don't notify about new releases any more" msgstr "Não notifique mais sobre novas versões" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +msgid "App Update available" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +#, c-format, boost-format +msgid "" +"New version of %s is available.\n" +"Do you wish to download it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +msgid "App Update download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +#, c-format, boost-format +msgid "New version of %s is available." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:146 +msgid "Run installer after download. (Otherwise file explorer will be opened)" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:151 +msgid "Target directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:158 +msgid "Select directory" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:176 +msgid "Select directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:193 +msgid "Download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:204 +msgid "Directory path is empty." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:212 +msgid "Directory path is incorrect." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:217 +#, boost-format +msgid "Directory %1% doesn't exists. Do you wish to create it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:222 +msgid "Failed to create directory." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:229 +#, boost-format +msgid "File %1% already exists. Do you wish to overwrite it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +#, boost-format +msgid "Download path is %1%. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:270 msgid "Opening Configuration Wizard" msgstr "Abrindo o Assistente de Configuração" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 src/slic3r/GUI/UpdateDialogs.cpp:261 +#: src/slic3r/GUI/UpdateDialogs.cpp:270 src/slic3r/GUI/UpdateDialogs.cpp:437 msgid "Configuration update" msgstr "Atualização de config" -#: src/slic3r/GUI/UpdateDialogs.cpp:95 +#: src/slic3r/GUI/UpdateDialogs.cpp:271 msgid "" "PrusaSlicer is not using the newest configuration available.\n" "Configuration Wizard may not offer the latest printers, filaments and SLA " @@ -9727,11 +11415,11 @@ msgstr "" "O Assistente de Configuração pode não oferecer as impressoras, filamentos e " "materiais SLA mais recentes a serem instalados." -#: src/slic3r/GUI/UpdateDialogs.cpp:97 +#: src/slic3r/GUI/UpdateDialogs.cpp:273 msgid "Configuration update is available" msgstr "A atualização de config. está disponível" -#: src/slic3r/GUI/UpdateDialogs.cpp:100 +#: src/slic3r/GUI/UpdateDialogs.cpp:276 msgid "" "Would you like to install it?\n" "\n" @@ -9748,28 +11436,28 @@ msgstr "" "\n" "Pacotes de config. atualizados:" -#: src/slic3r/GUI/UpdateDialogs.cpp:121 src/slic3r/GUI/UpdateDialogs.cpp:181 +#: src/slic3r/GUI/UpdateDialogs.cpp:297 src/slic3r/GUI/UpdateDialogs.cpp:357 msgid "Comment:" msgstr "Comentário:" -#: src/slic3r/GUI/UpdateDialogs.cpp:142 +#: src/slic3r/GUI/UpdateDialogs.cpp:318 msgid "Install" msgstr "Instalar" -#: src/slic3r/GUI/UpdateDialogs.cpp:144 +#: src/slic3r/GUI/UpdateDialogs.cpp:320 msgid "Don't install" msgstr "Não instalar" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 src/slic3r/GUI/UpdateDialogs.cpp:212 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 src/slic3r/GUI/UpdateDialogs.cpp:388 #, c-format, boost-format msgid "%s incompatibility" msgstr "%s incompatibilidade" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 msgid "You must install a configuration update." msgstr "Você deve instalar uma atualização de configuração." -#: src/slic3r/GUI/UpdateDialogs.cpp:160 +#: src/slic3r/GUI/UpdateDialogs.cpp:336 #, c-format, boost-format msgid "" "%s will now start updates. Otherwise it won't be able to start.\n" @@ -9787,17 +11475,12 @@ msgstr "" "\n" "Pacotes de configuração atualizados:" -#: src/slic3r/GUI/UpdateDialogs.cpp:200 src/slic3r/GUI/UpdateDialogs.cpp:247 -#, c-format, boost-format -msgid "Exit %s" -msgstr "Saída %s" - -#: src/slic3r/GUI/UpdateDialogs.cpp:213 +#: src/slic3r/GUI/UpdateDialogs.cpp:389 #, c-format, boost-format msgid "%s configuration is incompatible" msgstr "%s config. é incompatível" -#: src/slic3r/GUI/UpdateDialogs.cpp:216 +#: src/slic3r/GUI/UpdateDialogs.cpp:392 #, c-format, boost-format msgid "" "This version of %s is not compatible with currently installed configuration " @@ -9818,20 +11501,20 @@ msgstr "" "pode executar novamente a config. inicial. Isso criará uma captura de backup " "da config. existente antes de instalar os arquivos compatíveis com este %s." -#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#: src/slic3r/GUI/UpdateDialogs.cpp:401 #, c-format, boost-format msgid "This %s version: %s" msgstr "Esta versão %s : %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:230 +#: src/slic3r/GUI/UpdateDialogs.cpp:406 msgid "Incompatible bundles:" msgstr "Pacotes incompatíveis:" -#: src/slic3r/GUI/UpdateDialogs.cpp:246 +#: src/slic3r/GUI/UpdateDialogs.cpp:422 msgid "Re-configure" msgstr "Re-config.urar" -#: src/slic3r/GUI/UpdateDialogs.cpp:265 +#: src/slic3r/GUI/UpdateDialogs.cpp:441 #, c-format, boost-format msgid "" "%s now uses an updated configuration structure.\n" @@ -9860,28 +11543,37 @@ msgstr "" "predefinições e para escolher se deseja ativar as atualizações automáticas " "predefinidas." -#: src/slic3r/GUI/UpdateDialogs.cpp:282 +#: src/slic3r/GUI/UpdateDialogs.cpp:458 msgid "For more information please visit our wiki page:" msgstr "Para mais informações, visite a nossa página wiki:" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 msgid "Configuration updates" msgstr "Atualizações de configuração" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 src/slic3r/GUI/UpdateDialogs.cpp:495 msgid "No updates available" msgstr "Nenhuma atualização disponível" -#: src/slic3r/GUI/UpdateDialogs.cpp:304 +#: src/slic3r/GUI/UpdateDialogs.cpp:480 #, c-format, boost-format msgid "%s has no configuration updates available." msgstr "%s não tem atualizações de configuração disponíveis." -#: src/slic3r/GUI/WipeTowerDialog.cpp:21 +#: src/slic3r/GUI/UpdateDialogs.cpp:495 +msgid "App update" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:500 +#, c-format, boost-format +msgid "%s has no version updates available." +msgstr "" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:23 msgid "Ramming customization" msgstr "Personalização de Ramming" -#: src/slic3r/GUI/WipeTowerDialog.cpp:54 +#: src/slic3r/GUI/WipeTowerDialog.cpp:56 msgid "" "Ramming denotes the rapid extrusion just before a tool change in a single-" "extruder MM printer. Its purpose is to properly shape the end of the " @@ -9904,27 +11596,27 @@ msgstr "" "Esta é uma config. de nível especialista, ajuste incorreto provavelmente " "levará a compotas, roda extrusora moagem em filamento etc." -#: src/slic3r/GUI/WipeTowerDialog.cpp:114 +#: src/slic3r/GUI/WipeTowerDialog.cpp:116 msgid "Total ramming time" msgstr "Tempo total de Ramming" -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 msgid "Total rammed volume" msgstr "Volume total de Ramming" -#: src/slic3r/GUI/WipeTowerDialog.cpp:120 +#: src/slic3r/GUI/WipeTowerDialog.cpp:122 msgid "Ramming line width" msgstr "Largura da linha de Ramming" -#: src/slic3r/GUI/WipeTowerDialog.cpp:122 +#: src/slic3r/GUI/WipeTowerDialog.cpp:124 msgid "Ramming line spacing" msgstr "Espaçamento de linha de Ramming" -#: src/slic3r/GUI/WipeTowerDialog.cpp:173 +#: src/slic3r/GUI/WipeTowerDialog.cpp:175 msgid "Wipe tower - Purging volume adjustment" msgstr "Torre de limpeza - Ajuste de volume de purga" -#: src/slic3r/GUI/WipeTowerDialog.cpp:299 +#: src/slic3r/GUI/WipeTowerDialog.cpp:301 msgid "" "Here you can adjust required purging volume (mm³) for any given pair of " "tools." @@ -9932,23 +11624,23 @@ msgstr "" "Aqui você pode ajustar o volume de purga necessário (mm ³) para qualquer par " "dado de ferramentas." -#: src/slic3r/GUI/WipeTowerDialog.cpp:300 +#: src/slic3r/GUI/WipeTowerDialog.cpp:302 msgid "Extruder changed to" msgstr "Extrusora alterada para" -#: src/slic3r/GUI/WipeTowerDialog.cpp:308 +#: src/slic3r/GUI/WipeTowerDialog.cpp:310 msgid "unloaded" msgstr "descarregado" -#: src/slic3r/GUI/WipeTowerDialog.cpp:309 +#: src/slic3r/GUI/WipeTowerDialog.cpp:311 msgid "loaded" msgstr "carregado" -#: src/slic3r/GUI/WipeTowerDialog.cpp:352 +#: src/slic3r/GUI/WipeTowerDialog.cpp:354 msgid "Tool #" msgstr "Ferramenta #" -#: src/slic3r/GUI/WipeTowerDialog.cpp:361 +#: src/slic3r/GUI/WipeTowerDialog.cpp:363 msgid "" "Total purging volume is calculated by summing two values below, depending on " "which tools are loaded/unloaded." @@ -9956,15 +11648,15 @@ msgstr "" "O volume de purga total é calculado somando-se dois valores abaixo, " "dependendo de quais ferramentas são carregadas/descarregadas." -#: src/slic3r/GUI/WipeTowerDialog.cpp:362 +#: src/slic3r/GUI/WipeTowerDialog.cpp:364 msgid "Volume to purge (mm³) when the filament is being" msgstr "Volume a purgar (mm ³) quando o filamento está a ser" -#: src/slic3r/GUI/WipeTowerDialog.cpp:376 +#: src/slic3r/GUI/WipeTowerDialog.cpp:378 msgid "From" msgstr "De" -#: src/slic3r/GUI/WipeTowerDialog.cpp:442 +#: src/slic3r/GUI/WipeTowerDialog.cpp:444 msgid "" "Switching to simple settings will discard changes done in the advanced " "mode!\n" @@ -9976,26 +11668,28 @@ msgstr "" "\n" "Você quer prosseguir?" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show simplified settings" msgstr "Mostrar config. simplificadas" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show advanced settings" msgstr "Mostrar opções avançadas" -#: src/slic3r/GUI/wxExtensions.cpp:644 +#: src/slic3r/GUI/wxExtensions.cpp:672 #, c-format, boost-format msgid "Switch to the %s mode" msgstr "Mude para o modo %s" -#: src/slic3r/GUI/wxExtensions.cpp:645 +#: src/slic3r/GUI/wxExtensions.cpp:673 #, c-format, boost-format msgid "Current mode is %s" msgstr "O modo atual é %s" -#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:141 -#: src/slic3r/Utils/Repetier.cpp:69 +#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:206 +#: src/slic3r/Utils/OctoPrint.cpp:255 src/slic3r/Utils/OctoPrint.cpp:666 +#: src/slic3r/Utils/OctoPrint.cpp:824 src/slic3r/Utils/OctoPrint.cpp:897 +#: src/slic3r/Utils/Repetier.cpp:88 #, c-format, boost-format msgid "Mismatched type of print host: %s" msgstr "Tipo incompatível de host de impressão: %s" @@ -10115,71 +11809,100 @@ msgstr "" "Nota: O FlashAir com firmware 2.00.02 ou função de upload mais nova e " "ativada é necessário." -#: src/slic3r/Utils/OctoPrint.cpp:164 +#: src/slic3r/Utils/OctoPrint.cpp:278 msgid "Connection to OctoPrint works correctly." msgstr "A ligação ao OctoPrint funciona correctamente." -#: src/slic3r/Utils/OctoPrint.cpp:170 +#: src/slic3r/Utils/OctoPrint.cpp:284 msgid "Could not connect to OctoPrint" msgstr "Não foi possível conectar-se ao OctoPrint" -#: src/slic3r/Utils/OctoPrint.cpp:172 +#: src/slic3r/Utils/OctoPrint.cpp:286 msgid "Note: OctoPrint version at least 1.1.0 is required." msgstr "Nota: OctoPrint versão pelo menos 1.1.0 é necessária." -#: src/slic3r/Utils/OctoPrint.cpp:292 +#: src/slic3r/Utils/OctoPrint.cpp:528 msgid "Connection to Prusa SL1 / SL1S works correctly." msgstr "A conexão com Prusa SL1 / SL1S funciona corretamente." -#: src/slic3r/Utils/OctoPrint.cpp:298 +#: src/slic3r/Utils/OctoPrint.cpp:534 msgid "Could not connect to Prusa SLA" msgstr "Não foi possível conectar-se a Prusa SLA" -#: src/slic3r/Utils/OctoPrint.cpp:336 +#: src/slic3r/Utils/OctoPrint.cpp:573 msgid "Connection to PrusaLink works correctly." msgstr "A conexão com o PrusaLink funciona corretamente." -#: src/slic3r/Utils/OctoPrint.cpp:342 +#: src/slic3r/Utils/OctoPrint.cpp:579 msgid "Could not connect to PrusaLink" msgstr "Não foi possível conectar ao PrusaLink" -#: src/slic3r/Utils/PresetUpdater.cpp:61 +#: src/slic3r/Utils/OctoPrint.cpp:776 +msgid "Storages found:" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "read only" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "no free space" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:781 +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%.%2%" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:64 #, boost-format msgid "Copying of file %1% to %2% failed: %3%" msgstr "Falha na cópia do arquivo %1% para %2%: %3%" -#: src/slic3r/Utils/PresetUpdater.cpp:645 -#: src/slic3r/Utils/PresetUpdater.cpp:662 +#: src/slic3r/Utils/PresetUpdater.cpp:998 +#: src/slic3r/Utils/PresetUpdater.cpp:1015 msgid "Continue and install configuration updates?" msgstr "Continuar e instalar atualizações de configuração?" -#: src/slic3r/Utils/PresetUpdater.cpp:777 +#: src/slic3r/Utils/PresetUpdater.cpp:1021 +msgid "Installing profiles" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1071 +#, boost-format +msgid "Downloading resources for %1%." +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1171 msgid "" -"Configuration Updates causes a lost of preset modification.\n" +"Configuration Update will cause the preset modification to be lost.\n" "So, check unsaved changes and save them if necessary." msgstr "" -"Atualizações de configuração causam perda de modificação predefinida.\n" -"Então, verifique as alterações não salvas e salve-as, se necessário." -#: src/slic3r/Utils/PresetUpdater.cpp:779 +#: src/slic3r/Utils/PresetUpdater.cpp:1173 msgid "Updating" msgstr "Atualizando" -#: src/slic3r/Utils/PresetUpdater.cpp:808 +#: src/slic3r/Utils/PresetUpdater.cpp:1202 #, c-format, boost-format msgid "requires min. %s and max. %s" msgstr "requer min . %s e máx. %s" -#: src/slic3r/Utils/PresetUpdater.cpp:812 +#: src/slic3r/Utils/PresetUpdater.cpp:1206 #, c-format, boost-format msgid "requires min. %s" msgstr "requer min . %s" -#: src/slic3r/Utils/PresetUpdater.cpp:815 +#: src/slic3r/Utils/PresetUpdater.cpp:1209 #, c-format, boost-format msgid "requires max. %s" msgstr "requer Max. %s" +#: src/slic3r/Utils/PresetUpdater.cpp:1362 +#, boost-format +msgid "Couldn't locate idx file %1% when performing updates." +msgstr "" + #: src/slic3r/Utils/Http.cpp:73 msgid "" "Could not detect system SSL certificate store. PrusaSlicer will be unable to " @@ -10212,23 +11935,23 @@ msgstr "" "A iniciação do CURL falhou. PrusaSlicer não conseguirá estabelecer conexões " "de rede. Consulte os logs para obter detalhes adicionais." -#: src/slic3r/Utils/Process.cpp:157 +#: src/slic3r/Utils/Process.cpp:164 msgid "Open G-code file:" msgstr "Abrir arquivo G-code:" -#: src/slic3r/Utils/Repetier.cpp:84 +#: src/slic3r/Utils/Repetier.cpp:103 msgid "Connection to Repetier works correctly." msgstr "A conexão com o Repetier funciona corretamente." -#: src/slic3r/Utils/Repetier.cpp:90 +#: src/slic3r/Utils/Repetier.cpp:109 msgid "Could not connect to Repetier" msgstr "Não foi possível conectar ao Repetier" -#: src/slic3r/Utils/Repetier.cpp:92 +#: src/slic3r/Utils/Repetier.cpp:111 msgid "Note: Repetier version at least 0.90.0 is required." msgstr "Nota: A versão do Repetier pelo menos 0.90.0 é necessária." -#: src/slic3r/Utils/Repetier.cpp:246 +#: src/slic3r/Utils/Repetier.cpp:263 #, boost-format msgid "" "HTTP status: %1%\n" @@ -10237,7 +11960,7 @@ msgstr "" "Status HTTP: %1%\n" "Corpo da mensagem: \"%2%\"" -#: src/slic3r/Utils/Repetier.cpp:253 +#: src/slic3r/Utils/Repetier.cpp:270 #, boost-format msgid "" "Parsing of host response failed.\n" @@ -10248,7 +11971,7 @@ msgstr "" "Corpo da mensagem: \"%1%\"\n" "Erro: \"%2%\"" -#: src/slic3r/Utils/Repetier.cpp:266 +#: src/slic3r/Utils/Repetier.cpp:283 #, boost-format msgid "" "Enumeration of host printers failed.\n" @@ -10280,25 +12003,25 @@ msgstr "Continuar" msgid "Abort" msgstr "Abortar" -#: src/libslic3r/GCode.cpp:539 +#: src/libslic3r/GCode.cpp:490 msgid "There is an object with no extrusions in the first layer." msgstr "Há um objeto sem extrusões na primeira camada." -#: src/libslic3r/GCode.cpp:570 +#: src/libslic3r/GCode.cpp:521 #, boost-format msgid "Empty layer between %1% and %2%." msgstr "Camada vazia entre %1% e %2%." -#: src/libslic3r/GCode.cpp:573 +#: src/libslic3r/GCode.cpp:524 msgid "(Some lines not shown)" msgstr "(Algumas linhas não mostradas)" -#: src/libslic3r/GCode.cpp:575 +#: src/libslic3r/GCode.cpp:526 #, boost-format msgid "Object name: %1%" msgstr "Nome do objeto: %1%" -#: src/libslic3r/GCode.cpp:576 +#: src/libslic3r/GCode.cpp:527 msgid "" "Make sure the object is printable. This is usually caused by negligibly " "small extrusions or by a faulty model. Try to repair the model or change its " @@ -10308,30 +12031,30 @@ msgstr "" "pequenas extrusões ou por um modelo defeituoso. Tente reparar o modelo ou " "troque sua orientação na mesa." -#: src/libslic3r/GCode.cpp:718 +#: src/libslic3r/GCode.cpp:669 msgid "Filament Start G-code" msgstr "G-code de início de filamento" -#: src/libslic3r/GCode.cpp:725 +#: src/libslic3r/GCode.cpp:676 msgid "Filament End G-code" msgstr "G-code de fim de filamento" -#: src/libslic3r/GCode.cpp:764 +#: src/libslic3r/GCode.cpp:717 msgid "In the custom G-code were found reserved keywords:" msgstr "No G-code personalizado foram encontradas palavras-chave reservadas:" -#: src/libslic3r/GCode.cpp:766 +#: src/libslic3r/GCode.cpp:719 msgid "" "This may cause problems in g-code visualization and printing time estimation." msgstr "" "Isso pode causar problemas na visualização do G-code e na estimativa do " "tempo de impressão." -#: src/libslic3r/GCode.cpp:1200 src/libslic3r/GCode.cpp:1211 +#: src/libslic3r/GCode.cpp:1124 src/libslic3r/GCode.cpp:1135 msgid "No extrusions were generated for objects." msgstr "Nenhuma extrusão foi gerada para objetos." -#: src/libslic3r/GCode.cpp:1406 +#: src/libslic3r/GCode.cpp:1328 msgid "" "Your print is very close to the priming regions. Make sure there is no " "collision." @@ -10339,10 +12062,6 @@ msgstr "" "Sua impressão está muito próxima das regiões de preparação. Certifique-se de " "que não haverá colisão." -#: src/libslic3r/ExtrusionEntity.cpp:344 src/libslic3r/ExtrusionEntity.cpp:380 -msgid "Mixed" -msgstr "Misto" - #: src/libslic3r/Flow.cpp:61 #, boost-format msgid "" @@ -10351,7 +12070,7 @@ msgstr "" "Não é possível calcular a largura de extrusão para %1%: Variável \"%2%\" não " "acessível." -#: src/libslic3r/Format/3mf.cpp:1735 +#: src/libslic3r/Format/3mf.cpp:1880 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " @@ -10360,7 +12079,7 @@ msgstr "" "O arquivo 3mf selecionado foi salvo com uma versão mais recente de %1% e não " "é compatível." -#: src/libslic3r/Format/3mf.cpp:1746 +#: src/libslic3r/Format/3mf.cpp:1891 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." @@ -10368,7 +12087,7 @@ msgstr "" "O 3MF selecionado contém FDM objetos pintados de suporte usando uma versão " "mais recente do PrusaSlicer e não é compatível." -#: src/libslic3r/Format/3mf.cpp:1750 +#: src/libslic3r/Format/3mf.cpp:1895 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." @@ -10376,7 +12095,7 @@ msgstr "" "O 3MF selecionado contém um objeto pintado com costura usando uma versão " "mais recente do PrusaSlicer e não é compatível." -#: src/libslic3r/Format/3mf.cpp:1754 +#: src/libslic3r/Format/3mf.cpp:1899 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -10384,7 +12103,7 @@ msgstr "" "O 3MF selecionado contém um objeto pintado multimaterial usando uma versão " "mais recente do PrusaSlicer e não é compatível." -#: src/libslic3r/Format/AMF.cpp:993 +#: src/libslic3r/Format/AMF.cpp:1000 #, boost-format msgid "" "The selected amf file has been saved with a newer version of %1% and is not " @@ -10537,26 +12256,32 @@ msgstr "falha na validação" msgid "write calledback failed" msgstr "write calledback falhou" -#: src/libslic3r/Print.cpp:454 +#: src/libslic3r/Print.cpp:473 msgid "All objects are outside of the print volume." msgstr "Todos os objetos estão fora do volume de impressão." -#: src/libslic3r/Print.cpp:457 +#: src/libslic3r/Print.cpp:476 msgid "The supplied settings will cause an empty print." msgstr "As config. fornecidas causarão uma impressão vazia." -#: src/libslic3r/Print.cpp:461 +#: src/libslic3r/Print.cpp:480 msgid "Some objects are too close; your extruder will collide with them." msgstr "Alguns objetos são muito próximos; sua extrusora irá colidir com eles." -#: src/libslic3r/Print.cpp:463 +#: src/libslic3r/Print.cpp:482 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." msgstr "" "Alguns objetos são muito altos e não podem ser impressos sem colisões de " "extrusoras." -#: src/libslic3r/Print.cpp:472 +#: src/libslic3r/Print.cpp:486 +msgid "" +"Avoid crossing perimeters option and avoid crossing curled overhangs option " +"cannot be both enabled together." +msgstr "" + +#: src/libslic3r/Print.cpp:495 msgid "" "Only a single object may be printed at a time in Spiral Vase mode. Either " "remove all but the last object, or enable sequential mode by " @@ -10566,14 +12291,24 @@ msgstr "" "Remova todos, exceto o último objeto, ou habilite o modo sequencial por " "\"complete_objects\"." -#: src/libslic3r/Print.cpp:476 +#: src/libslic3r/Print.cpp:499 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." msgstr "" "A opção vaso espiral só pode ser usada ao imprimir objetos de material único." -#: src/libslic3r/Print.cpp:489 +#: src/libslic3r/Print.cpp:523 +msgid "" +"The print is taller than the maximum allowed height. You might want to " +"reduce the size of your model or change current print settings and retry." +msgstr "" + +#: src/libslic3r/Print.cpp:540 +msgid "Variable layer height is not supported with Organic supports." +msgstr "" + +#: src/libslic3r/Print.cpp:553 msgid "" "The wipe tower is only supported if all extruders have the same nozzle " "diameter and use filaments of the same diameter." @@ -10581,7 +12316,7 @@ msgstr "" "A torre de limpeza só é suportada se todas as extrusoras tiverem o mesmo " "diâmetro da ponteira e usarem filamentos do mesmo diâmetro." -#: src/libslic3r/Print.cpp:495 +#: src/libslic3r/Print.cpp:559 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, " "RepRapFirmware and Repetier G-code flavors." @@ -10589,7 +12324,7 @@ msgstr "" "A Torre de Limpeza é atualmente suportada apenas para os firmwares Marlin, " "RepRap/Sprinter, RepRapFirmware e Repetier G-code." -#: src/libslic3r/Print.cpp:497 +#: src/libslic3r/Print.cpp:561 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." @@ -10597,19 +12332,19 @@ msgstr "" "A torre da limpeza é suportada atualmente somente com o endereçamento " "relativo da extrusora (use_relative_e_distances = 1)." -#: src/libslic3r/Print.cpp:499 -msgid "Ooze prevention is currently not supported with the wipe tower enabled." +#: src/libslic3r/Print.cpp:563 +msgid "" +"Ooze prevention is only supported with the wipe tower when " +"'single_extruder_multi_material' is off." msgstr "" -"A prevenção de escorrimento não é suportada atualmente com a torre da " -"limpeza permitida." -#: src/libslic3r/Print.cpp:501 +#: src/libslic3r/Print.cpp:565 msgid "" "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." msgstr "" "Atualmente, a Torre limpa não suporta E volumétrica (use_volumetric_e=0)." -#: src/libslic3r/Print.cpp:503 +#: src/libslic3r/Print.cpp:567 msgid "" "The Wipe Tower is currently not supported for multimaterial sequential " "prints." @@ -10617,7 +12352,7 @@ msgstr "" "A torre de limpeza só é suportada para vários objetos se eles tiverem " "alturas de camada iguais." -#: src/libslic3r/Print.cpp:524 +#: src/libslic3r/Print.cpp:577 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " "layer heights" @@ -10625,7 +12360,7 @@ msgstr "" "A torre de limpeza só é suportada para vários objetos se eles tiverem " "alturas de camada iguais" -#: src/libslic3r/Print.cpp:526 +#: src/libslic3r/Print.cpp:579 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "over an equal number of raft layers" @@ -10633,7 +12368,7 @@ msgstr "" "A torre de limpeza só é suportada para vários objetos se elas forem " "impressas em um número igual de camadas de estrado" -#: src/libslic3r/Print.cpp:529 +#: src/libslic3r/Print.cpp:582 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "with the same support_material_contact_distance" @@ -10641,7 +12376,7 @@ msgstr "" "A torre de limpeza só é suportado para vários objetos se eles são impressos " "com a mesma distância de contato do suporte" -#: src/libslic3r/Print.cpp:531 +#: src/libslic3r/Print.cpp:584 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." @@ -10649,7 +12384,7 @@ msgstr "" "A torre de limpeza só é suportada para vários objetos se eles são fatiados " "igualmente." -#: src/libslic3r/Print.cpp:555 +#: src/libslic3r/Print.cpp:609 msgid "" "The Wipe tower is only supported if all objects have the same variable layer " "height" @@ -10657,26 +12392,26 @@ msgstr "" "A torre de limpeza só é suportada se todos os objetos tiverem a mesma altura " "de camada variável" -#: src/libslic3r/Print.cpp:579 +#: src/libslic3r/Print.cpp:633 msgid "" "One or more object were assigned an extruder that the printer does not have." msgstr "" "Um ou mais objetos foram atribuídos a uma extrusora que a impressora não tem." -#: src/libslic3r/Print.cpp:592 +#: src/libslic3r/Print.cpp:646 #, boost-format msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" msgstr "" "%1% = %2% mm é muito baixo para ser impresso a uma altura de camada %3% mm" -#: src/libslic3r/Print.cpp:595 +#: src/libslic3r/Print.cpp:649 #, boost-format msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" msgstr "" "Excesso %1%=%2% milímetro a ser imprimível com um diâmetro da ponteira %3% " "milímetro" -#: src/libslic3r/Print.cpp:606 +#: src/libslic3r/Print.cpp:660 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " @@ -10688,7 +12423,7 @@ msgstr "" "(support_material_extruder = = 0 ou support_material_interface_extruder = = " "0), todos as ponteiras têm que ser do mesmo diâmetro." -#: src/libslic3r/Print.cpp:614 +#: src/libslic3r/Print.cpp:668 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers " "need to be synchronized with the object layers." @@ -10696,28 +12431,16 @@ msgstr "" "Para que a torre de limpeza funcione com os suportes solúveis, as camadas de " "suporte precisam ser sincronizadas com as camadas de objeto." -#: src/libslic3r/Print.cpp:618 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only if they are " -"printed with the current extruder without triggering a tool change. (both " -"support_material_extruder and support_material_interface_extruder need to be " -"set to 0)." -msgstr "" -"A torre de limpeza suporta atualmente os suportes não-solúveis somente se " -"são imprimidos com o extrusor atual sem provocar uma mudança da ferramenta. " -"(ambos support_material_extruder e support_material_interface_extruder " -"precisam ser definidos como 0)." - -#: src/libslic3r/Print.cpp:654 +#: src/libslic3r/Print.cpp:708 msgid "First layer height can't be greater than nozzle diameter" msgstr "" "A primeira altura da camada não pode ser maior do que o diâmetro da ponteira" -#: src/libslic3r/Print.cpp:659 +#: src/libslic3r/Print.cpp:713 msgid "Layer height can't be greater than nozzle diameter" msgstr "A altura da camada não pode ser maior do que o diâmetro da ponteira" -#: src/libslic3r/Print.cpp:680 +#: src/libslic3r/Print.cpp:734 msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " @@ -10727,7 +12450,7 @@ msgstr "" "extrusora em cada camada para evitar a perda de precisão de ponto flutuante. " "Adicione \"G92 E0\" ao layer_gcode." -#: src/libslic3r/Print.cpp:682 +#: src/libslic3r/Print.cpp:736 msgid "" "\"G92 E0\" was found in before_layer_gcode, which is incompatible with " "absolute extruder addressing." @@ -10735,7 +12458,7 @@ msgstr "" "\"G92 E0\" foi encontrado em before_layer_gcode, que é incompatível com o " "endereçamento absoluto da extrusora." -#: src/libslic3r/Print.cpp:684 +#: src/libslic3r/Print.cpp:738 msgid "" "\"G92 E0\" was found in layer_gcode, which is incompatible with absolute " "extruder addressing." @@ -10743,27 +12466,79 @@ msgstr "" "\"G92 E0\" foi encontrado em layer_gcode, que é incompatível com o " "endereçamento absoluto da extrusora." -#: src/libslic3r/Print.cpp:826 +#: src/libslic3r/Print.cpp:880 msgid "Infilling layers" msgstr "Camadas de preenchimento" -#: src/libslic3r/Print.cpp:848 +#: src/libslic3r/Print.cpp:908 msgid "Generating skirt and brim" msgstr "Gerando saia e aba" -#: src/libslic3r/Print.cpp:896 +#: src/libslic3r/Print.cpp:956 msgid "Exporting G-code" msgstr "Exportando o G-code" -#: src/libslic3r/Print.cpp:900 +#: src/libslic3r/Print.cpp:960 msgid "Generating G-code" msgstr "Gerando G-code" +#: src/libslic3r/Print.cpp:1169 +msgid "Alert if supports needed" +msgstr "" + +#: src/libslic3r/Print.cpp:1174 +msgid "long bridging extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1175 +msgid "floating bridge anchors" +msgstr "" + +#: src/libslic3r/Print.cpp:1178 +msgid "collapsing overhang" +msgstr "" + +#: src/libslic3r/Print.cpp:1180 +msgid "loose extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1183 +msgid "low bed adhesion" +msgstr "" + +#: src/libslic3r/Print.cpp:1184 +msgid "floating object part" +msgstr "" + +#: src/libslic3r/Print.cpp:1185 +msgid "thin fragile section" +msgstr "" + +#: src/libslic3r/Print.cpp:1221 +msgid "Detected print stability issues" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "or" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "and" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "brim" +msgstr "" + +#: src/libslic3r/Print.cpp:1248 +msgid "Consider enabling supports" +msgstr "" + #: src/libslic3r/SLA/Pad.cpp:533 msgid "Pad brim size is too small for the current configuration." msgstr "O tamanho da borda do bloco é muito pequeno para a configuração atual." -#: src/libslic3r/SLAPrint.cpp:628 +#: src/libslic3r/SLAPrint.cpp:546 msgid "" "Cannot proceed without support points! Add support points or disable support " "generation." @@ -10771,7 +12546,7 @@ msgstr "" "Não pode prosseguir sem pontos de suporte! Adicione pontos de suporte ou " "desative a geração de suporte." -#: src/libslic3r/SLAPrint.cpp:640 +#: src/libslic3r/SLAPrint.cpp:558 msgid "" "Elevation is too low for object. Use the \"Pad around object\" feature to " "print the object without elevation." @@ -10779,7 +12554,7 @@ msgstr "" "A elevação é muito baixa para o objeto. Use o recurso \"pad ao redor do " "objeto\" para imprimir o objeto sem elevação." -#: src/libslic3r/SLAPrint.cpp:646 +#: src/libslic3r/SLAPrint.cpp:564 msgid "" "The endings of the support pillars will be deployed on the gap between the " "object and the pad. 'Support base safety distance' has to be greater than " @@ -10789,69 +12564,69 @@ msgstr "" "objeto e o pad. ' Distância de segurança de base de suporte ' tem de ser " "maior do que o parâmetro ' pad objecto Gap ' para evitar este." -#: src/libslic3r/SLAPrint.cpp:661 +#: src/libslic3r/SLAPrint.cpp:579 msgid "Exposition time is out of printer profile bounds." msgstr "O tempo de exposição está fora dos limites do perfil da impressora." -#: src/libslic3r/SLAPrint.cpp:668 +#: src/libslic3r/SLAPrint.cpp:586 msgid "Initial exposition time is out of printer profile bounds." msgstr "" "O tempo de exposição inicial está fora dos limites do perfil da impressora." -#: src/libslic3r/SLAPrint.cpp:784 +#: src/libslic3r/SLAPrint.cpp:693 msgid "Slicing done" msgstr "Fatiamento pronto" -#: src/libslic3r/SLAPrintSteps.cpp:47 +#: src/libslic3r/SLAPrintSteps.cpp:57 +msgid "Assembling model from parts" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:58 msgid "Hollowing model" msgstr "Deixar oco o modelo" -#: src/libslic3r/SLAPrintSteps.cpp:48 +#: src/libslic3r/SLAPrintSteps.cpp:59 msgid "Drilling holes into model." msgstr "Furando o modelo." -#: src/libslic3r/SLAPrintSteps.cpp:49 +#: src/libslic3r/SLAPrintSteps.cpp:60 msgid "Slicing model" msgstr "Modelo de fatiamento" -#: src/libslic3r/SLAPrintSteps.cpp:50 src/libslic3r/SLAPrintSteps.cpp:639 +#: src/libslic3r/SLAPrintSteps.cpp:61 src/libslic3r/SLAPrintSteps.cpp:691 msgid "Generating support points" msgstr "Gerando pontos de suporte" -#: src/libslic3r/SLAPrintSteps.cpp:51 +#: src/libslic3r/SLAPrintSteps.cpp:62 msgid "Generating support tree" msgstr "Gerando suporte em árvore" -#: src/libslic3r/SLAPrintSteps.cpp:52 +#: src/libslic3r/SLAPrintSteps.cpp:63 msgid "Generating pad" msgstr "Gerando pad" -#: src/libslic3r/SLAPrintSteps.cpp:53 +#: src/libslic3r/SLAPrintSteps.cpp:64 msgid "Slicing supports" msgstr "Fatiando suportes" -#: src/libslic3r/SLAPrintSteps.cpp:68 +#: src/libslic3r/SLAPrintSteps.cpp:79 msgid "Merging slices and calculating statistics" msgstr "Mesclando camadas e calculando estatísticas" -#: src/libslic3r/SLAPrintSteps.cpp:69 +#: src/libslic3r/SLAPrintSteps.cpp:80 msgid "Rasterizing layers" msgstr "Rasterizando camadas" -#: src/libslic3r/SLAPrintSteps.cpp:435 -msgid "Too many overlapping holes." -msgstr "Muitos buracos sobrepostos." - -#: src/libslic3r/SLAPrintSteps.cpp:442 +#: src/libslic3r/SLAPrintSteps.cpp:255 msgid "" "Mesh to be hollowed is not suitable for hollowing (does not bound a volume)." msgstr "A malha a ser vazada não é adequada para vazar (não limita um volume)." -#: src/libslic3r/SLAPrintSteps.cpp:450 +#: src/libslic3r/SLAPrintSteps.cpp:262 msgid "Unable to drill the current configuration of holes into the model." msgstr "Não é possível perfurar a configuração atual de furos no modelo." -#: src/libslic3r/SLAPrintSteps.cpp:470 +#: src/libslic3r/SLAPrintSteps.cpp:271 msgid "" "Drilling holes into the mesh failed. This is usually caused by broken model. " "Try to fix it first." @@ -10859,27 +12634,34 @@ msgstr "" "Os furos de perfuração na malha falharam. Isso geralmente é causado por " "modelo quebrado. Tente consertá-lo primeiro." -#: src/libslic3r/SLAPrintSteps.cpp:476 +#: src/libslic3r/SLAPrintSteps.cpp:279 msgid "Failed to drill some holes into the model" msgstr "Falha ao fazer alguns furos no modelo" -#: src/libslic3r/SLAPrintSteps.cpp:520 +#: src/libslic3r/SLAPrintSteps.cpp:289 +msgid "" +"Can't perform full mesh booleans! Some parts of the print will be previewed " +"with approximated meshes. This does not affect the quality of slices or the " +"physical print in any way." +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:510 msgid "" "Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "" "O fatiamento teve que ser parado devido a um erro interno: índice de " "fatiamento inconsistente." -#: src/libslic3r/SLAPrintSteps.cpp:691 src/libslic3r/SLAPrintSteps.cpp:700 -#: src/libslic3r/SLAPrintSteps.cpp:738 +#: src/libslic3r/SLAPrintSteps.cpp:740 src/libslic3r/SLAPrintSteps.cpp:749 +#: src/libslic3r/SLAPrintSteps.cpp:787 msgid "Visualizing supports" msgstr "Visualizando suportes" -#: src/libslic3r/SLAPrintSteps.cpp:730 +#: src/libslic3r/SLAPrintSteps.cpp:779 msgid "No pad can be generated for this model with the current configuration" msgstr "Nenhum pad pode ser gerado para este modelo com a configuração atual" -#: src/libslic3r/SLAPrintSteps.cpp:854 +#: src/libslic3r/SLAPrintSteps.cpp:908 msgid "" "There are unprintable objects. Try to adjust support settings to make the " "objects printable." @@ -10891,27 +12673,27 @@ msgstr "" msgid "Failed processing of the output_filename_format template." msgstr "Falha no processamento do modelo output_filename_format." -#: src/libslic3r/PrintConfig.cpp:236 src/libslic3r/PrintConfig.cpp:237 +#: src/libslic3r/PrintConfig.cpp:254 src/libslic3r/PrintConfig.cpp:255 msgid "Printer technology" msgstr "Tecnologia da impressora" -#: src/libslic3r/PrintConfig.cpp:244 +#: src/libslic3r/PrintConfig.cpp:260 msgid "Bed shape" msgstr "Formato da mesa" -#: src/libslic3r/PrintConfig.cpp:249 +#: src/libslic3r/PrintConfig.cpp:265 msgid "Bed custom texture" msgstr "Textura customizada da mesa" -#: src/libslic3r/PrintConfig.cpp:254 +#: src/libslic3r/PrintConfig.cpp:270 msgid "Bed custom model" msgstr "Modelo customizado da mesa" -#: src/libslic3r/PrintConfig.cpp:259 +#: src/libslic3r/PrintConfig.cpp:275 msgid "Elephant foot compensation" msgstr "Compensação do pé do elefante" -#: src/libslic3r/PrintConfig.cpp:261 +#: src/libslic3r/PrintConfig.cpp:277 msgid "" "The first layer will be shrunk in the XY plane by the configured value to " "compensate for the 1st layer squish aka an Elephant Foot effect." @@ -10919,11 +12701,11 @@ msgstr "" "A primeira camada será encolhido no plano XY pelo valor config.urado para " "compensar a 1ª camada esmagada, também conhecida como pé de elefante." -#: src/libslic3r/PrintConfig.cpp:269 +#: src/libslic3r/PrintConfig.cpp:285 msgid "G-code thumbnails" msgstr "Miniaturas de G-code" -#: src/libslic3r/PrintConfig.cpp:270 +#: src/libslic3r/PrintConfig.cpp:286 msgid "" "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " "following format: \"XxY, XxY, ...\"" @@ -10931,11 +12713,11 @@ msgstr "" "Tamanhos de imagem a serem armazenados em arquivos .gcode e .sl1 / .sl1s, no " "seguinte formato: \"XxY, XxY, ...\"" -#: src/libslic3r/PrintConfig.cpp:276 +#: src/libslic3r/PrintConfig.cpp:292 msgid "Format of G-code thumbnails" msgstr "Formato de miniaturas de G-code" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:293 msgid "" "Format of G-code thumbnails: PNG for best quality, JPG for smallest size, " "QOI for low memory firmware" @@ -10943,7 +12725,7 @@ msgstr "" "Formato de miniaturas de G-code: PNG para melhor qualidade, JPG para tamanho " "menor, QOI para firmware com pouca memória" -#: src/libslic3r/PrintConfig.cpp:288 +#: src/libslic3r/PrintConfig.cpp:301 msgid "" "This setting controls the height (and thus the total number) of the slices/" "layers. Thinner layers give better accuracy but take more time to print." @@ -10952,11 +12734,11 @@ msgstr "" "camadas. Camadas mais finas dão melhor precisão, mas levam mais tempo para " "imprimir." -#: src/libslic3r/PrintConfig.cpp:295 +#: src/libslic3r/PrintConfig.cpp:308 msgid "Max print height" msgstr "Altura máxima de impressão" -#: src/libslic3r/PrintConfig.cpp:296 +#: src/libslic3r/PrintConfig.cpp:309 msgid "" "Set this to the maximum height that can be reached by your extruder while " "printing." @@ -10964,11 +12746,11 @@ msgstr "" "Defina isto para a altura máxima que pode ser alcançada pela sua extrusora " "durante a impressão." -#: src/libslic3r/PrintConfig.cpp:304 +#: src/libslic3r/PrintConfig.cpp:317 msgid "Hostname, IP or URL" msgstr "Hostname, IP ou URL" -#: src/libslic3r/PrintConfig.cpp:305 +#: src/libslic3r/PrintConfig.cpp:318 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the hostname, IP address or URL of the printer host instance. Print host " @@ -10982,11 +12764,11 @@ msgstr "" "básica ativada pode ser acessado colocando o nome de usuário e a senha na " "URL no seguinte formato: https: //nomedeusuário:senha@seu-endereço-de-octopi/" -#: src/libslic3r/PrintConfig.cpp:314 +#: src/libslic3r/PrintConfig.cpp:327 msgid "API Key / Password" msgstr "Chave de API/senha" -#: src/libslic3r/PrintConfig.cpp:315 +#: src/libslic3r/PrintConfig.cpp:328 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the API Key or the password required for authentication." @@ -10994,11 +12776,11 @@ msgstr "" "PrusaSlicer pode carregar arquivos de G-code para um host de impressora. " "Este campo deve conter a chave de API ou a senha exigida para a autenticação." -#: src/libslic3r/PrintConfig.cpp:323 +#: src/libslic3r/PrintConfig.cpp:336 msgid "Name of the printer" msgstr "Nome da impressora" -#: src/libslic3r/PrintConfig.cpp:331 +#: src/libslic3r/PrintConfig.cpp:344 msgid "" "Custom CA certificate file can be specified for HTTPS OctoPrint connections, " "in crt/pem format. If left blank, the default OS CA certificate repository " @@ -11008,15 +12790,15 @@ msgstr "" "conexões HTTPS OctoPrint, no formato CRT/PEM. Se deixado em branco, o " "repositório de certificados do OS CA padrão é usado." -#: src/libslic3r/PrintConfig.cpp:347 +#: src/libslic3r/PrintConfig.cpp:360 msgid "Password" msgstr "Senha" -#: src/libslic3r/PrintConfig.cpp:355 +#: src/libslic3r/PrintConfig.cpp:368 msgid "Ignore HTTPS certificate revocation checks" msgstr "Ignorar verificações de revogação de certificado HTTPS" -#: src/libslic3r/PrintConfig.cpp:356 +#: src/libslic3r/PrintConfig.cpp:369 msgid "" "Ignore HTTPS certificate revocation checks in case of missing or offline " "distribution points. One may want to enable this option for self signed " @@ -11026,31 +12808,43 @@ msgstr "" "de distribuição ausentes ou offline. Pode-se querer habilitar esta opção " "para certificados autoassinados se a conexão falhar." -#: src/libslic3r/PrintConfig.cpp:363 +#: src/libslic3r/PrintConfig.cpp:376 msgid "Printer preset names" msgstr "Nomes predefinidos da impressora" -#: src/libslic3r/PrintConfig.cpp:364 +#: src/libslic3r/PrintConfig.cpp:377 msgid "Names of presets related to the physical printer" msgstr "Nomes de predefinições relacionadas à impressora física" -#: src/libslic3r/PrintConfig.cpp:369 +#: src/libslic3r/PrintConfig.cpp:382 msgid "Authorization Type" msgstr "Tipo de Autorização" -#: src/libslic3r/PrintConfig.cpp:374 +#: src/libslic3r/PrintConfig.cpp:385 msgid "API key" msgstr "Chave API" -#: src/libslic3r/PrintConfig.cpp:375 +#: src/libslic3r/PrintConfig.cpp:386 msgid "HTTP digest" msgstr "Resumo HTTP" -#: src/libslic3r/PrintConfig.cpp:395 +#: src/libslic3r/PrintConfig.cpp:406 +msgid "Avoid crossing curled overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:407 +msgid "" +"Plan travel moves such that the extruder avoids areas where the filament may " +"be curled up. This is mostly happening on steeper rounded overhangs and may " +"cause a crash with the nozzle. This feature slows down both the print and " +"the G-code generation." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:414 msgid "Avoid crossing perimeters" msgstr "Evitar cruzamento de perímetros" -#: src/libslic3r/PrintConfig.cpp:396 +#: src/libslic3r/PrintConfig.cpp:415 msgid "" "Optimize travel moves in order to minimize the crossing of perimeters. This " "is mostly useful with Bowden extruders which suffer from oozing. This " @@ -11060,11 +12854,11 @@ msgstr "" "perímetros. Isto é principalmente útil com extrusoras Bowden que sofrem de " "escorrimento. Este recurso retarda a impressão e a geração de G-code." -#: src/libslic3r/PrintConfig.cpp:403 +#: src/libslic3r/PrintConfig.cpp:422 msgid "Avoid crossing perimeters - Max detour length" msgstr "Evitar cruzamento de perímetros - Comprimento máximo do desvio" -#: src/libslic3r/PrintConfig.cpp:405 +#: src/libslic3r/PrintConfig.cpp:424 msgid "" "The maximum detour length for avoid crossing perimeters. If the detour is " "longer than this value, avoid crossing perimeters is not applied for this " @@ -11077,15 +12871,15 @@ msgstr "" "um valor absoluto ou como porcentagem (por exemplo, 50%) de um caminho de " "deslocamento direto." -#: src/libslic3r/PrintConfig.cpp:408 +#: src/libslic3r/PrintConfig.cpp:427 msgid "mm or % (zero to disable)" msgstr "mm ou % (zero para desativar)" -#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:2839 +#: src/libslic3r/PrintConfig.cpp:434 src/libslic3r/PrintConfig.cpp:2927 msgid "Other layers" msgstr "Outras camadas" -#: src/libslic3r/PrintConfig.cpp:416 +#: src/libslic3r/PrintConfig.cpp:435 msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." @@ -11093,11 +12887,11 @@ msgstr "" "Temperatura da mesa para camadas após o primeiro. Defina isso como zero para " "desabilitar os comandos de controle de temperatura da mesa na saída." -#: src/libslic3r/PrintConfig.cpp:419 +#: src/libslic3r/PrintConfig.cpp:438 msgid "Bed temperature" msgstr "Temperatura da mesa" -#: src/libslic3r/PrintConfig.cpp:426 +#: src/libslic3r/PrintConfig.cpp:445 msgid "" "This custom code is inserted at every layer change, right before the Z move. " "Note that you can use placeholder variables for all Slic3r settings as well " @@ -11107,11 +12901,11 @@ msgstr "" "da movimentação Z. Observe que você pode usar variáveis de espaço reservado " "para todas as config. PrusaSlicer, bem como [layer_num] e [layer_z]." -#: src/libslic3r/PrintConfig.cpp:436 +#: src/libslic3r/PrintConfig.cpp:455 msgid "Between objects G-code" msgstr "G-code entre objetos" -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:456 msgid "" "This code is inserted between objects when using sequential printing. By " "default extruder and bed temperature are reset using non-wait command; " @@ -11128,15 +12922,15 @@ msgstr "" "config. de Slic3r, para que você possa colocar um comando \"M109 S " "[temperatura_primeira_camada]\" onde quiser." -#: src/libslic3r/PrintConfig.cpp:448 +#: src/libslic3r/PrintConfig.cpp:467 msgid "Number of solid layers to generate on bottom surfaces." msgstr "Número de camadas sólidas para gerar em superfícies inferiores." -#: src/libslic3r/PrintConfig.cpp:449 +#: src/libslic3r/PrintConfig.cpp:468 msgid "Bottom solid layers" msgstr "Camadas sólidas inferiores" -#: src/libslic3r/PrintConfig.cpp:457 +#: src/libslic3r/PrintConfig.cpp:476 msgid "" "The number of bottom solid layers is increased above bottom_solid_layers if " "necessary to satisfy minimum thickness of bottom shell." @@ -11145,15 +12939,15 @@ msgstr "" "bottom_solid_layers se necessário para satisfazer a espessura mínima da " "camada inferior." -#: src/libslic3r/PrintConfig.cpp:459 +#: src/libslic3r/PrintConfig.cpp:478 msgid "Minimum bottom shell thickness" msgstr "Espessura mínima da casca inferior" -#: src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:484 msgid "Bridge" msgstr "Ponte" -#: src/libslic3r/PrintConfig.cpp:466 +#: src/libslic3r/PrintConfig.cpp:485 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." @@ -11161,21 +12955,21 @@ msgstr "" "Esta é a aceleração que sua impressora usará para pontes. Defina zero para " "desabilitar o controle de aceleração para pontes." -#: src/libslic3r/PrintConfig.cpp:468 src/libslic3r/PrintConfig.cpp:639 -#: src/libslic3r/PrintConfig.cpp:1192 src/libslic3r/PrintConfig.cpp:1201 -#: src/libslic3r/PrintConfig.cpp:1401 src/libslic3r/PrintConfig.cpp:1410 -#: src/libslic3r/PrintConfig.cpp:1419 src/libslic3r/PrintConfig.cpp:1713 -#: src/libslic3r/PrintConfig.cpp:1764 src/libslic3r/PrintConfig.cpp:1775 -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1983 -#: src/libslic3r/PrintConfig.cpp:1991 +#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:1252 src/libslic3r/PrintConfig.cpp:1261 +#: src/libslic3r/PrintConfig.cpp:1447 src/libslic3r/PrintConfig.cpp:1456 +#: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1750 +#: src/libslic3r/PrintConfig.cpp:1801 src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1822 src/libslic3r/PrintConfig.cpp:2013 +#: src/libslic3r/PrintConfig.cpp:2021 msgid "mm/s²" msgstr "mm/s²" -#: src/libslic3r/PrintConfig.cpp:474 +#: src/libslic3r/PrintConfig.cpp:493 msgid "Bridging angle" msgstr "Ângulo de ponte" -#: src/libslic3r/PrintConfig.cpp:476 +#: src/libslic3r/PrintConfig.cpp:495 msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for all " @@ -11185,36 +12979,31 @@ msgstr "" "calculado automaticamente. Caso contrário, o ângulo fornecido será usado " "para todas as pontes. Use 180 ° para o ângulo zero." -#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:1102 -#: src/libslic3r/PrintConfig.cpp:2282 src/libslic3r/PrintConfig.cpp:2292 -#: src/libslic3r/PrintConfig.cpp:2583 src/libslic3r/PrintConfig.cpp:2824 -#: src/libslic3r/PrintConfig.cpp:3041 src/libslic3r/PrintConfig.cpp:3144 -#: src/libslic3r/PrintConfig.cpp:3698 src/libslic3r/PrintConfig.cpp:3819 -msgid "°" -msgstr "°" - -#: src/libslic3r/PrintConfig.cpp:485 +#: src/libslic3r/PrintConfig.cpp:504 msgid "Bridges fan speed" msgstr "Velocidade da ventoinha nas pontes" -#: src/libslic3r/PrintConfig.cpp:486 +#: src/libslic3r/PrintConfig.cpp:505 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "" "Esta velocidade da ventoinha é imposta durante todas as pontes e angulações." -#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:1114 -#: src/libslic3r/PrintConfig.cpp:1601 src/libslic3r/PrintConfig.cpp:1793 -#: src/libslic3r/PrintConfig.cpp:1856 src/libslic3r/PrintConfig.cpp:2115 -#: src/libslic3r/PrintConfig.cpp:2174 src/libslic3r/PrintConfig.cpp:3323 -#: src/libslic3r/PrintConfig.cpp:3612 src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:596 +#: src/libslic3r/PrintConfig.cpp:605 src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:623 src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1893 src/libslic3r/PrintConfig.cpp:2145 +#: src/libslic3r/PrintConfig.cpp:2204 src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3369 src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3870 msgid "%" msgstr "%" -#: src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:513 msgid "Bridge flow ratio" msgstr "Relação de fluxo da ponte" -#: src/libslic3r/PrintConfig.cpp:496 +#: src/libslic3r/PrintConfig.cpp:515 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -11226,33 +13015,91 @@ msgstr "" "padrão são geralmente boas e você deve experimentar com refrigeração (use " "uma ventoinha) antes de ajustes isso." -#: src/libslic3r/PrintConfig.cpp:506 +#: src/libslic3r/PrintConfig.cpp:525 msgid "Bridges" msgstr "Pontes" -#: src/libslic3r/PrintConfig.cpp:508 +#: src/libslic3r/PrintConfig.cpp:527 msgid "Speed for printing bridges." msgstr "Velocidade para a impressão de pontes." -#: src/libslic3r/PrintConfig.cpp:509 src/libslic3r/PrintConfig.cpp:920 -#: src/libslic3r/PrintConfig.cpp:928 src/libslic3r/PrintConfig.cpp:937 -#: src/libslic3r/PrintConfig.cpp:945 src/libslic3r/PrintConfig.cpp:972 -#: src/libslic3r/PrintConfig.cpp:991 src/libslic3r/PrintConfig.cpp:1329 -#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1620 -#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1730 -#: src/libslic3r/PrintConfig.cpp:1742 src/libslic3r/PrintConfig.cpp:1752 -#: src/libslic3r/PrintConfig.cpp:1815 src/libslic3r/PrintConfig.cpp:1874 -#: src/libslic3r/PrintConfig.cpp:2022 src/libslic3r/PrintConfig.cpp:2249 -#: src/libslic3r/PrintConfig.cpp:2258 src/libslic3r/PrintConfig.cpp:2789 -#: src/libslic3r/PrintConfig.cpp:2939 src/libslic3r/PrintConfig.cpp:2949 +#: src/libslic3r/PrintConfig.cpp:528 src/libslic3r/PrintConfig.cpp:1009 +#: src/libslic3r/PrintConfig.cpp:1017 src/libslic3r/PrintConfig.cpp:1026 +#: src/libslic3r/PrintConfig.cpp:1034 src/libslic3r/PrintConfig.cpp:1061 +#: src/libslic3r/PrintConfig.cpp:1080 src/libslic3r/PrintConfig.cpp:1386 +#: src/libslic3r/PrintConfig.cpp:1579 src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1733 src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1779 src/libslic3r/PrintConfig.cpp:1789 +#: src/libslic3r/PrintConfig.cpp:1852 src/libslic3r/PrintConfig.cpp:1911 +#: src/libslic3r/PrintConfig.cpp:2052 src/libslic3r/PrintConfig.cpp:2279 +#: src/libslic3r/PrintConfig.cpp:2288 src/libslic3r/PrintConfig.cpp:2810 +#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3037 msgid "mm/s" msgstr "mm/s" -#: src/libslic3r/PrintConfig.cpp:516 +#: src/libslic3r/PrintConfig.cpp:535 +msgid "Enable dynamic overhang speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:537 +msgid "This setting enables dynamic speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:541 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Speeds for overhang " +"sizes in between are calculated via linear interpolation. If set as " +"percentage, the speed is calculated over the external perimeter speed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:547 src/libslic3r/PrintConfig.cpp:594 +msgid "speed for 0% overlap (bridge)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:550 src/libslic3r/PrintConfig.cpp:559 +#: src/libslic3r/PrintConfig.cpp:568 src/libslic3r/PrintConfig.cpp:577 +#: src/libslic3r/PrintConfig.cpp:856 src/libslic3r/PrintConfig.cpp:1305 +#: src/libslic3r/PrintConfig.cpp:1316 src/libslic3r/PrintConfig.cpp:2387 +#: src/libslic3r/PrintConfig.cpp:2440 src/libslic3r/PrintConfig.cpp:2765 +#: src/libslic3r/PrintConfig.cpp:2997 +msgid "mm/s or %" +msgstr "mm/s ou %" + +#: src/libslic3r/PrintConfig.cpp:556 src/libslic3r/PrintConfig.cpp:603 +msgid "speed for 25% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:612 +msgid "speed for 50% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:574 src/libslic3r/PrintConfig.cpp:621 +msgid "speed for 75% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:583 +msgid "Enable dynamic fan speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:584 +msgid "This setting enables dynamic fan speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:589 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Fan speeds for " +"overhang sizes in between are calculated via linear interpolation. " +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:630 msgid "Brim width" msgstr "Largura da aba" -#: src/libslic3r/PrintConfig.cpp:518 +#: src/libslic3r/PrintConfig.cpp:632 msgid "" "The horizontal width of the brim that will be printed around each object on " "the first layer. When raft is used, no brim is generated (use " @@ -11262,11 +13109,11 @@ msgstr "" "primeira camada. Quando a jangada for usado, nenhuma aba é gerada (use " "raft_first_layer_expansion)." -#: src/libslic3r/PrintConfig.cpp:527 +#: src/libslic3r/PrintConfig.cpp:641 msgid "Brim type" msgstr "Tipo de aba" -#: src/libslic3r/PrintConfig.cpp:529 +#: src/libslic3r/PrintConfig.cpp:643 msgid "" "The places where the brim will be printed around each object on the first " "layer." @@ -11274,27 +13121,27 @@ msgstr "" "Os lugares onde a aba será impressa em torno de cada objeto na primeira " "camada." -#: src/libslic3r/PrintConfig.cpp:535 +#: src/libslic3r/PrintConfig.cpp:645 msgid "No brim" msgstr "Sem borda" -#: src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:646 msgid "Outer brim only" msgstr "Somente aba externa" -#: src/libslic3r/PrintConfig.cpp:537 +#: src/libslic3r/PrintConfig.cpp:647 msgid "Inner brim only" msgstr "Somente aba interna" -#: src/libslic3r/PrintConfig.cpp:538 +#: src/libslic3r/PrintConfig.cpp:648 msgid "Outer and inner brim" msgstr "Aba exterior e interior" -#: src/libslic3r/PrintConfig.cpp:543 +#: src/libslic3r/PrintConfig.cpp:654 msgid "Brim separation gap" msgstr "Espaçamento de separação da borda" -#: src/libslic3r/PrintConfig.cpp:545 +#: src/libslic3r/PrintConfig.cpp:656 msgid "" "Offset of brim from the printed object. The offset is applied after the " "elephant foot compensation." @@ -11302,33 +13149,19 @@ msgstr "" "Deslocamento da aba do objeto impresso. O deslocamento é aplicado após a " "compensação do pé de elefante." -#: src/libslic3r/PrintConfig.cpp:552 -msgid "Clip multi-part objects" -msgstr "Clip objetos de várias partes" - -#: src/libslic3r/PrintConfig.cpp:553 -msgid "" -"When printing multi-material objects, this settings will make Slic3r to clip " -"the overlapping object parts one by the other (2nd part will be clipped by " -"the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -msgstr "" -"Ao imprimir objetos de vários materiais, essas config. farão com que o " -"PrusaSlicer recorte as partes do objeto sobrepostas uma pela outra (2ª parte " -"será cortada pela 1ª, 3ª parte será cortada pela 1ª e 2ª, etc.)." - -#: src/libslic3r/PrintConfig.cpp:560 +#: src/libslic3r/PrintConfig.cpp:663 msgid "Colorprint height" msgstr "Altura da impressão colorida" -#: src/libslic3r/PrintConfig.cpp:561 +#: src/libslic3r/PrintConfig.cpp:664 msgid "Heights at which a filament change is to occur." msgstr "Alturas em que uma mudança do filamento ocorre." -#: src/libslic3r/PrintConfig.cpp:571 +#: src/libslic3r/PrintConfig.cpp:674 msgid "Compatible printers condition" msgstr "Condição de impressoras compatíveis" -#: src/libslic3r/PrintConfig.cpp:572 +#: src/libslic3r/PrintConfig.cpp:675 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " @@ -11338,11 +13171,11 @@ msgstr "" "impressora ativo. Se essa expressão for avaliada como verdadeira, esse " "perfil será considerado compatível com o perfil de impressora ativo." -#: src/libslic3r/PrintConfig.cpp:586 +#: src/libslic3r/PrintConfig.cpp:689 msgid "Compatible print profiles condition" msgstr "Condição de perfis de impressão compatíveis" -#: src/libslic3r/PrintConfig.cpp:587 +#: src/libslic3r/PrintConfig.cpp:690 msgid "" "A boolean expression using the configuration values of an active print " "profile. If this expression evaluates to true, this profile is considered " @@ -11352,11 +13185,11 @@ msgstr "" "impressão ativo. Se essa expressão for avaliada como verdadeira, esse perfil " "será considerado compatível com o perfil de impressão ativo." -#: src/libslic3r/PrintConfig.cpp:604 +#: src/libslic3r/PrintConfig.cpp:707 msgid "Complete individual objects" msgstr "Complete objetos individuais" -#: src/libslic3r/PrintConfig.cpp:605 +#: src/libslic3r/PrintConfig.cpp:708 msgid "" "When printing multiple objects or copies, this feature will complete each " "object before moving onto next one (and starting it from its bottom layer). " @@ -11368,11 +13201,11 @@ msgstr "" "recurso é útil para evitar o risco de impressões arruinadas. PrusaSlicer " "deve avisar e impedi-lo de colisões de extrusoras, mas cuidado." -#: src/libslic3r/PrintConfig.cpp:613 +#: src/libslic3r/PrintConfig.cpp:716 msgid "Enable auto cooling" msgstr "Ativar o resfriamento automático" -#: src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:717 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." @@ -11381,26 +13214,26 @@ msgstr "" "velocidade de impressão e a velocidade do ventoinha de acordo com o tempo de " "impressão da camada." -#: src/libslic3r/PrintConfig.cpp:619 +#: src/libslic3r/PrintConfig.cpp:722 msgid "Cooling tube position" msgstr "Posição do tubo de resfriamento" -#: src/libslic3r/PrintConfig.cpp:620 +#: src/libslic3r/PrintConfig.cpp:723 msgid "Distance of the center-point of the cooling tube from the extruder tip." msgstr "" "Distância do ponto central do tubo de resfriamento da ponta da extrusora." -#: src/libslic3r/PrintConfig.cpp:627 +#: src/libslic3r/PrintConfig.cpp:730 msgid "Cooling tube length" msgstr "Comprimento do tubo de resfriamento" -#: src/libslic3r/PrintConfig.cpp:628 +#: src/libslic3r/PrintConfig.cpp:731 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "" "Comprimento do tubo de resfriamento para limitar o espaço para movimentos de " "resfriamento dentro dele." -#: src/libslic3r/PrintConfig.cpp:636 +#: src/libslic3r/PrintConfig.cpp:739 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " @@ -11410,11 +13243,11 @@ msgstr "" "valores de aceleração específicos da função forem usados (perímetro/" "preenchimento). Defina zero para evitar redefinir a aceleração em tudo." -#: src/libslic3r/PrintConfig.cpp:645 +#: src/libslic3r/PrintConfig.cpp:748 msgid "Default filament profile" msgstr "Perfil de filamento padrão" -#: src/libslic3r/PrintConfig.cpp:646 +#: src/libslic3r/PrintConfig.cpp:749 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " @@ -11423,12 +13256,12 @@ msgstr "" "Perfil de filamento padrão associado ao perfil de impressora atual. Na " "seleção do perfil da impressora atual, este perfil de filamento será ativado." -#: src/libslic3r/PrintConfig.cpp:652 +#: src/libslic3r/PrintConfig.cpp:755 msgid "Default print profile" msgstr "Perfil de impressão padrão" -#: src/libslic3r/PrintConfig.cpp:653 src/libslic3r/PrintConfig.cpp:3542 -#: src/libslic3r/PrintConfig.cpp:3553 +#: src/libslic3r/PrintConfig.cpp:756 src/libslic3r/PrintConfig.cpp:3819 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -11437,11 +13270,11 @@ msgstr "" "Perfil de impressão padrão associado ao perfil de impressora atual. Na " "seleção do perfil de impressora atual, este perfil de impressão será ativado." -#: src/libslic3r/PrintConfig.cpp:659 +#: src/libslic3r/PrintConfig.cpp:762 msgid "Disable fan for the first" msgstr "Desabilite o ventoinha para a(s) primeira(s)" -#: src/libslic3r/PrintConfig.cpp:660 +#: src/libslic3r/PrintConfig.cpp:763 msgid "" "You can set this to a positive value to disable fan at all during the first " "layers, so that it does not make adhesion worse." @@ -11449,11 +13282,11 @@ msgstr "" "Você pode ajustar isto a um valor positivo para desabilitar a ventoinha " "durante as primeiras camadas, de modo que melhore a adesão." -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:772 msgid "Don't support bridges" msgstr "Não suporte pontes" -#: src/libslic3r/PrintConfig.cpp:671 +#: src/libslic3r/PrintConfig.cpp:774 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." @@ -11461,15 +13294,15 @@ msgstr "" "Opção experimental para impedir que o material de suporte seja gerado em " "áreas com ponte." -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:780 msgid "Distance between copies" msgstr "Distância entre cópias" -#: src/libslic3r/PrintConfig.cpp:678 +#: src/libslic3r/PrintConfig.cpp:781 msgid "Distance used for the auto-arrange feature of the plater." msgstr "Distância usada para o recurso de organizar automaticamente a bandeja." -#: src/libslic3r/PrintConfig.cpp:686 +#: src/libslic3r/PrintConfig.cpp:789 msgid "" "This end procedure is inserted at the end of the output file. Note that you " "can use placeholder variables for all PrusaSlicer settings." @@ -11478,7 +13311,7 @@ msgstr "" "você pode usar variáveis de espaço reservado para todas as config. de " "PrusaSlicer." -#: src/libslic3r/PrintConfig.cpp:696 +#: src/libslic3r/PrintConfig.cpp:799 msgid "" "This end procedure is inserted at the end of the output file, before the " "printer end gcode (and before any toolchange from this filament in case of " @@ -11492,23 +13325,11 @@ msgstr "" "variáveis de espaço reservado para todas as Configurações do PrusaSlicer. Se " "você tiver várias extrusoras, o G-code será processado em ordem de extrusão." -#: src/libslic3r/PrintConfig.cpp:707 -msgid "Ensure vertical shell thickness" -msgstr "Assegure a espessura vertical da parede" - -#: src/libslic3r/PrintConfig.cpp:709 -msgid "" -"Add solid infill near sloping surfaces to guarantee the vertical shell " -"thickness (top+bottom solid layers)." -msgstr "" -"Adicionar preenchimento sólido perto de superfícies inclinadas para garantir " -"a espessura do escudo vertical (camadas sólidas no topo + base )." - -#: src/libslic3r/PrintConfig.cpp:715 +#: src/libslic3r/PrintConfig.cpp:810 msgid "Top fill pattern" msgstr "Padrão de preenchimento do topo" -#: src/libslic3r/PrintConfig.cpp:717 +#: src/libslic3r/PrintConfig.cpp:812 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." @@ -11516,45 +13337,45 @@ msgstr "" "Padrão de preenchimento para preenchimento do topo. Isto afeta somente a " "camada visível superior, e não suas paredes adjacentes." -#: src/libslic3r/PrintConfig.cpp:728 src/libslic3r/PrintConfig.cpp:1169 -#: src/libslic3r/PrintConfig.cpp:2754 src/libslic3r/PrintConfig.cpp:2771 +#: src/libslic3r/PrintConfig.cpp:815 src/libslic3r/PrintConfig.cpp:1228 +#: src/libslic3r/PrintConfig.cpp:2776 src/libslic3r/PrintConfig.cpp:2791 msgid "Rectilinear" msgstr "Rectilíneo" -#: src/libslic3r/PrintConfig.cpp:729 +#: src/libslic3r/PrintConfig.cpp:816 msgid "Monotonic" msgstr "Monotônico" -#: src/libslic3r/PrintConfig.cpp:730 +#: src/libslic3r/PrintConfig.cpp:817 msgid "Monotonic Lines" msgstr "" -#: src/libslic3r/PrintConfig.cpp:731 src/libslic3r/PrintConfig.cpp:1170 +#: src/libslic3r/PrintConfig.cpp:818 src/libslic3r/PrintConfig.cpp:1229 msgid "Aligned Rectilinear" msgstr "Rectilíneo Alinhado" -#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:1176 -#: src/libslic3r/PrintConfig.cpp:2772 +#: src/libslic3r/PrintConfig.cpp:819 src/libslic3r/PrintConfig.cpp:1235 +#: src/libslic3r/PrintConfig.cpp:2792 msgid "Concentric" msgstr "Concêntrico" -#: src/libslic3r/PrintConfig.cpp:733 src/libslic3r/PrintConfig.cpp:1180 +#: src/libslic3r/PrintConfig.cpp:820 src/libslic3r/PrintConfig.cpp:1239 msgid "Hilbert Curve" msgstr "Curva de Hilbert" -#: src/libslic3r/PrintConfig.cpp:734 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:821 src/libslic3r/PrintConfig.cpp:1240 msgid "Archimedean Chords" msgstr "Cordas Archimedean" -#: src/libslic3r/PrintConfig.cpp:735 src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:822 src/libslic3r/PrintConfig.cpp:1241 msgid "Octagram Spiral" msgstr "Espiral estrelado" -#: src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:830 msgid "Bottom fill pattern" msgstr "Padrão de preenchimento da base" -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:832 msgid "" "Fill pattern for bottom infill. This only affects the bottom external " "visible layer, and not its adjacent solid shells." @@ -11562,12 +13383,12 @@ msgstr "" "Padrão de preenchimento para preenchimento da base. Isto afeta somente a " "camada visível externa inferior, e não suas paredes adjacentes." -#: src/libslic3r/PrintConfig.cpp:753 src/libslic3r/PrintConfig.cpp:765 -#: src/libslic3r/PrintConfig.cpp:1988 +#: src/libslic3r/PrintConfig.cpp:839 src/libslic3r/PrintConfig.cpp:851 +#: src/libslic3r/PrintConfig.cpp:2018 msgid "External perimeters" msgstr "Perímetros externos" -#: src/libslic3r/PrintConfig.cpp:755 +#: src/libslic3r/PrintConfig.cpp:841 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " "perimeters. If left zero, default extrusion width will be used if set, " @@ -11580,18 +13401,18 @@ msgstr "" "ponteira será usado. Se expresso em porcentagem(por exemplo 200%), será " "calculado sobre a altura da camada." -#: src/libslic3r/PrintConfig.cpp:758 src/libslic3r/PrintConfig.cpp:869 -#: src/libslic3r/PrintConfig.cpp:1223 src/libslic3r/PrintConfig.cpp:1445 -#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1529 -#: src/libslic3r/PrintConfig.cpp:2011 src/libslic3r/PrintConfig.cpp:2397 -#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2660 -#: src/libslic3r/PrintConfig.cpp:2895 src/libslic3r/PrintConfig.cpp:3117 -#: src/libslic3r/PrintConfig.cpp:3132 src/libslic3r/PrintConfig.cpp:3166 -#: src/libslic3r/PrintConfig.cpp:3178 +#: src/libslic3r/PrintConfig.cpp:844 src/libslic3r/PrintConfig.cpp:958 +#: src/libslic3r/PrintConfig.cpp:1283 src/libslic3r/PrintConfig.cpp:1491 +#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1570 +#: src/libslic3r/PrintConfig.cpp:2041 src/libslic3r/PrintConfig.cpp:2428 +#: src/libslic3r/PrintConfig.cpp:2601 src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2983 src/libslic3r/PrintConfig.cpp:3204 +#: src/libslic3r/PrintConfig.cpp:3219 src/libslic3r/PrintConfig.cpp:3253 +#: src/libslic3r/PrintConfig.cpp:3265 msgid "mm or %" msgstr "mm ou %" -#: src/libslic3r/PrintConfig.cpp:767 +#: src/libslic3r/PrintConfig.cpp:853 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " @@ -11601,18 +13422,11 @@ msgstr "" "visíveis). Se expresso em porcentagem(por exemplo: 80%) Ele será calculado " "sobre a velocidade de perímetros config. acima. Defina como zero para auto." -#: src/libslic3r/PrintConfig.cpp:770 src/libslic3r/PrintConfig.cpp:1245 -#: src/libslic3r/PrintConfig.cpp:1256 src/libslic3r/PrintConfig.cpp:2356 -#: src/libslic3r/PrintConfig.cpp:2409 src/libslic3r/PrintConfig.cpp:2740 -#: src/libslic3r/PrintConfig.cpp:2909 -msgid "mm/s or %" -msgstr "mm/s ou %" - -#: src/libslic3r/PrintConfig.cpp:777 +#: src/libslic3r/PrintConfig.cpp:863 msgid "External perimeters first" msgstr "Perímetros externos primeiro" -#: src/libslic3r/PrintConfig.cpp:779 +#: src/libslic3r/PrintConfig.cpp:865 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." @@ -11620,11 +13434,11 @@ msgstr "" "Imprima perímetros de contorno do mais externo para o mais interno em vez da " "ordem inversa padrão." -#: src/libslic3r/PrintConfig.cpp:785 +#: src/libslic3r/PrintConfig.cpp:871 msgid "Extra perimeters if needed" msgstr "Perímetros extras se necessário" -#: src/libslic3r/PrintConfig.cpp:787 +#: src/libslic3r/PrintConfig.cpp:873 msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " "keeps adding perimeters, until more than 70% of the loop immediately above " @@ -11634,7 +13448,18 @@ msgstr "" "inclinados. PrusaSlicer continua adicionando perímetros, até que mais de 70% " "o do loop imediatamente acima é suportado." -#: src/libslic3r/PrintConfig.cpp:797 +#: src/libslic3r/PrintConfig.cpp:880 +msgid "Extra perimeters on overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:882 +msgid "" +"Detect overhang areas where bridges cannot be anchored, and fill them with " +"extra perimeter paths. These paths are anchored to the nearby non-overhang " +"area when possible." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:890 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " @@ -11644,7 +13469,7 @@ msgstr "" "sejam especificadas). Esse valor substitui as extrusoras de perímetro e " "preenchimento, mas não as extrusoras de suporte." -#: src/libslic3r/PrintConfig.cpp:809 +#: src/libslic3r/PrintConfig.cpp:898 msgid "" "Set this to the vertical distance between your nozzle tip and (usually) the " "X carriage rods. In other words, this is the height of the clearance " @@ -11656,7 +13481,7 @@ msgstr "" "torno de sua extrusora, e representa a profundidade máxima que a extrusora " "pode espreitar antes de colidir com outros objetos impressos." -#: src/libslic3r/PrintConfig.cpp:820 +#: src/libslic3r/PrintConfig.cpp:909 msgid "" "Set this to the clearance radius around your extruder. If the extruder is " "not centered, choose the largest value for safety. This setting is used to " @@ -11667,20 +13492,20 @@ msgstr "" "config. é usada para verificar colisões e exibir a visualização gráfica na " "bandeja." -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:919 msgid "Extruder Color" msgstr "Cor da extrusora" -#: src/libslic3r/PrintConfig.cpp:831 src/libslic3r/PrintConfig.cpp:894 -#: src/libslic3r/PrintConfig.cpp:3394 +#: src/libslic3r/PrintConfig.cpp:920 src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:3666 msgid "This is only used in the Slic3r interface as a visual help." msgstr "Isso é usado apenas na interface PrusaSlicer como uma ajuda visual." -#: src/libslic3r/PrintConfig.cpp:837 +#: src/libslic3r/PrintConfig.cpp:926 msgid "Extruder offset" msgstr "Compensação da extrusora" -#: src/libslic3r/PrintConfig.cpp:838 +#: src/libslic3r/PrintConfig.cpp:927 msgid "" "If your firmware doesn't handle the extruder displacement you need the G-" "code to take it into account. This option lets you specify the displacement " @@ -11692,11 +13517,11 @@ msgstr "" "de cada extrusora em relação à primeira. Ele espera coordenadas positivas " "(eles serão subtraída da coordenada XY)." -#: src/libslic3r/PrintConfig.cpp:847 +#: src/libslic3r/PrintConfig.cpp:936 msgid "Extrusion axis" msgstr "Eixo de extrusão" -#: src/libslic3r/PrintConfig.cpp:848 +#: src/libslic3r/PrintConfig.cpp:937 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." @@ -11704,11 +13529,11 @@ msgstr "" "Use esta opção para definir a letra do eixo associada à extrusora da sua " "impressora (geralmente E, mas algumas impressoras usam A)." -#: src/libslic3r/PrintConfig.cpp:853 +#: src/libslic3r/PrintConfig.cpp:942 msgid "Extrusion multiplier" msgstr "Multiplicador de extrusão" -#: src/libslic3r/PrintConfig.cpp:854 +#: src/libslic3r/PrintConfig.cpp:943 msgid "" "This factor changes the amount of flow proportionally. You may need to tweak " "this setting to get nice surface finish and correct single wall widths. " @@ -11721,11 +13546,11 @@ msgstr "" "0,9 e 1,1. Se você acha que precisa mudar isso mais, verifique o diâmetro do " "filamento e os passos configurados no firmware da extrusora." -#: src/libslic3r/PrintConfig.cpp:863 +#: src/libslic3r/PrintConfig.cpp:952 msgid "Default extrusion width" msgstr "Largura de extrusão padrão" -#: src/libslic3r/PrintConfig.cpp:865 +#: src/libslic3r/PrintConfig.cpp:954 msgid "" "Set this to a non-zero value to allow a manual extrusion width. If left to " "zero, Slic3r derives extrusion widths from the nozzle diameter (see the " @@ -11740,11 +13565,11 @@ msgstr "" "expresso como porcentagem (por exemplo: 230%), ele será calculado sobre a " "altura da camada." -#: src/libslic3r/PrintConfig.cpp:877 +#: src/libslic3r/PrintConfig.cpp:966 msgid "Keep fan always on" msgstr "Mantenha a ventoinha sempre ligada" -#: src/libslic3r/PrintConfig.cpp:878 +#: src/libslic3r/PrintConfig.cpp:967 msgid "" "If this is enabled, fan will never be disabled and will be kept running at " "least at its minimum speed. Useful for PLA, harmful for ABS." @@ -11753,11 +13578,11 @@ msgstr "" "funcionando pelo menos em sua velocidade mínima. Útil para o PLA, " "prejudicial para o ABS." -#: src/libslic3r/PrintConfig.cpp:883 +#: src/libslic3r/PrintConfig.cpp:972 msgid "Enable fan if layer print time is below" msgstr "Ative o ventoinha se o tempo de impressão da camada estiver abaixo" -#: src/libslic3r/PrintConfig.cpp:884 +#: src/libslic3r/PrintConfig.cpp:973 msgid "" "If layer print time is estimated below this number of seconds, fan will be " "enabled and its speed will be calculated by interpolating the minimum and " @@ -11767,27 +13592,27 @@ msgstr "" "segundos, a ventoinha será ativada e sua velocidade será calculada " "interpolando as velocidades mínima e máxima." -#: src/libslic3r/PrintConfig.cpp:886 src/libslic3r/PrintConfig.cpp:2344 +#: src/libslic3r/PrintConfig.cpp:975 src/libslic3r/PrintConfig.cpp:2375 msgid "approximate seconds" msgstr "segundos aproximados" -#: src/libslic3r/PrintConfig.cpp:893 src/libslic3r/PrintConfig.cpp:3393 +#: src/libslic3r/PrintConfig.cpp:982 src/libslic3r/PrintConfig.cpp:3665 msgid "Color" msgstr "Cor" -#: src/libslic3r/PrintConfig.cpp:899 +#: src/libslic3r/PrintConfig.cpp:988 msgid "Filament notes" msgstr "Notas de filamento" -#: src/libslic3r/PrintConfig.cpp:900 +#: src/libslic3r/PrintConfig.cpp:989 msgid "You can put your notes regarding the filament here." msgstr "Você pode colocar suas anotações sobre o filamento aqui." -#: src/libslic3r/PrintConfig.cpp:908 src/libslic3r/PrintConfig.cpp:1821 +#: src/libslic3r/PrintConfig.cpp:997 src/libslic3r/PrintConfig.cpp:1858 msgid "Max volumetric speed" msgstr "Máxima velocidade volumétrica" -#: src/libslic3r/PrintConfig.cpp:909 +#: src/libslic3r/PrintConfig.cpp:998 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " @@ -11797,27 +13622,27 @@ msgstr "" "velocidade volumétrica máxima de uma impressão ao mínimo de velocidade " "volumétrica de impressão e de filamento. Defina como zero para nenhum limite." -#: src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:1007 msgid "Loading speed" msgstr "Velocidade de carregamento" -#: src/libslic3r/PrintConfig.cpp:919 +#: src/libslic3r/PrintConfig.cpp:1008 msgid "Speed used for loading the filament on the wipe tower." msgstr "Velocidade utilizada para carregar o filamento na torre de limpeza." -#: src/libslic3r/PrintConfig.cpp:926 +#: src/libslic3r/PrintConfig.cpp:1015 msgid "Loading speed at the start" msgstr "Velocidade de carregamento no início" -#: src/libslic3r/PrintConfig.cpp:927 +#: src/libslic3r/PrintConfig.cpp:1016 msgid "Speed used at the very beginning of loading phase." msgstr "Velocidade utilizada no início da fase de carregamento." -#: src/libslic3r/PrintConfig.cpp:934 +#: src/libslic3r/PrintConfig.cpp:1023 msgid "Unloading speed" msgstr "Velocidade de descarregamento" -#: src/libslic3r/PrintConfig.cpp:935 +#: src/libslic3r/PrintConfig.cpp:1024 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." @@ -11825,22 +13650,22 @@ msgstr "" "Velocidade utilizada para descarregar o filamento na torre de limpeza (não " "afeta a parte inicial do descarregamento logo após o Ramming)." -#: src/libslic3r/PrintConfig.cpp:943 +#: src/libslic3r/PrintConfig.cpp:1032 msgid "Unloading speed at the start" msgstr "Velocidade de descarregamento no início" -#: src/libslic3r/PrintConfig.cpp:944 +#: src/libslic3r/PrintConfig.cpp:1033 msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "" "Velocidade usada para descarregar a ponta do filamento imediatamente após o " "Ramming." -#: src/libslic3r/PrintConfig.cpp:951 +#: src/libslic3r/PrintConfig.cpp:1040 msgid "Delay after unloading" msgstr "Atraso após o descarregamento" -#: src/libslic3r/PrintConfig.cpp:952 +#: src/libslic3r/PrintConfig.cpp:1041 msgid "" "Time to wait after the filament is unloaded. May help to get reliable " "toolchanges with flexible materials that may need more time to shrink to " @@ -11850,11 +13675,11 @@ msgstr "" "trocas de ferramenta confiáveis com materiais flexíveis que podem precisar " "de mais tempo para reduzir as dimensões originais." -#: src/libslic3r/PrintConfig.cpp:961 +#: src/libslic3r/PrintConfig.cpp:1050 msgid "Number of cooling moves" msgstr "Número de movimentos de resfriamento" -#: src/libslic3r/PrintConfig.cpp:962 +#: src/libslic3r/PrintConfig.cpp:1051 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " "Specify desired number of these moves." @@ -11862,21 +13687,21 @@ msgstr "" "O filamento é resfriado por ser movido para frente e para trás nos tubos de " "resfriamento. Especifique o número desejado desses movimentos." -#: src/libslic3r/PrintConfig.cpp:970 +#: src/libslic3r/PrintConfig.cpp:1059 msgid "Speed of the first cooling move" msgstr "Velocidade do primeiro movimento de resfriamento" -#: src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:1060 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "" "Movimentos de resfriamento estão gradualmente acelerando a partir desta " "velocidade." -#: src/libslic3r/PrintConfig.cpp:978 +#: src/libslic3r/PrintConfig.cpp:1067 msgid "Minimal purge on wipe tower" msgstr "Remoção mínima na torre da limpeza" -#: src/libslic3r/PrintConfig.cpp:979 +#: src/libslic3r/PrintConfig.cpp:1068 msgid "" "After a tool change, the exact position of the newly loaded filament inside " "the nozzle may not be known, and the filament pressure is likely not yet " @@ -11892,25 +13717,25 @@ msgstr "" "produzir sucessivas preenchimento ou sacrificial objeto extrusões de forma " "confiável." -#: src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:1072 msgid "mm³" msgstr "mm³" -#: src/libslic3r/PrintConfig.cpp:989 +#: src/libslic3r/PrintConfig.cpp:1078 msgid "Speed of the last cooling move" msgstr "Velocidade do último movimento de resfriamento" -#: src/libslic3r/PrintConfig.cpp:990 +#: src/libslic3r/PrintConfig.cpp:1079 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "" "Movimentos de resfriamento estão gradualmente acelerando para esta " "velocidade." -#: src/libslic3r/PrintConfig.cpp:997 +#: src/libslic3r/PrintConfig.cpp:1086 msgid "Filament load time" msgstr "Tempo de carga do filamento" -#: src/libslic3r/PrintConfig.cpp:998 +#: src/libslic3r/PrintConfig.cpp:1087 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " "filament during a tool change (when executing the T code). This time is " @@ -11921,11 +13746,11 @@ msgstr "" "código T). Esse tempo é adicionado ao tempo total de impressão pelo " "estimador de tempo do G-code." -#: src/libslic3r/PrintConfig.cpp:1005 +#: src/libslic3r/PrintConfig.cpp:1094 msgid "Ramming parameters" msgstr "Parâmetros de Ramming" -#: src/libslic3r/PrintConfig.cpp:1006 +#: src/libslic3r/PrintConfig.cpp:1095 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." @@ -11933,11 +13758,11 @@ msgstr "" "Essa cadeia de caracteres é editada por rammingdialog e contém parâmetros " "específicos de Ramming." -#: src/libslic3r/PrintConfig.cpp:1012 +#: src/libslic3r/PrintConfig.cpp:1101 msgid "Filament unload time" msgstr "Tempo de descarregamento do filamento" -#: src/libslic3r/PrintConfig.cpp:1013 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " "filament during a tool change (when executing the T code). This time is " @@ -11948,7 +13773,7 @@ msgstr "" "o código T). Esse tempo é adicionado ao tempo total de impressão pelo " "estimador de tempo do G-code." -#: src/libslic3r/PrintConfig.cpp:1021 +#: src/libslic3r/PrintConfig.cpp:1110 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " @@ -11958,12 +13783,12 @@ msgstr "" "paquímetro e fazer várias medições ao longo do filamento, em seguida, " "calcular a média." -#: src/libslic3r/PrintConfig.cpp:1028 src/libslic3r/PrintConfig.cpp:3432 -#: src/libslic3r/PrintConfig.cpp:3433 +#: src/libslic3r/PrintConfig.cpp:1117 src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3710 msgid "Density" msgstr "Densidade" -#: src/libslic3r/PrintConfig.cpp:1029 +#: src/libslic3r/PrintConfig.cpp:1118 msgid "" "Enter your filament density here. This is only for statistical information. " "A decent way is to weigh a known length of filament and compute the ratio of " @@ -11975,27 +13800,27 @@ msgstr "" "filamento e computar a relação do comprimento ao volume. Melhor é calcular o " "volume diretamente através do deslocamento." -#: src/libslic3r/PrintConfig.cpp:1032 +#: src/libslic3r/PrintConfig.cpp:1121 msgid "g/cm³" msgstr "g/cm³" -#: src/libslic3r/PrintConfig.cpp:1037 +#: src/libslic3r/PrintConfig.cpp:1126 msgid "Filament type" msgstr "Tipo de filamento" -#: src/libslic3r/PrintConfig.cpp:1038 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "The filament material type for use in custom G-codes." msgstr "O tipo de material de filamento para uso em G-code customizados." -#: src/libslic3r/PrintConfig.cpp:1066 +#: src/libslic3r/PrintConfig.cpp:1155 msgid "Soluble material" msgstr "Material solúvel" -#: src/libslic3r/PrintConfig.cpp:1067 +#: src/libslic3r/PrintConfig.cpp:1156 msgid "Soluble material is most likely used for a soluble support." msgstr "O material solúvel é mais provável usado para um suporte solúvel." -#: src/libslic3r/PrintConfig.cpp:1073 +#: src/libslic3r/PrintConfig.cpp:1162 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." @@ -12003,15 +13828,15 @@ msgstr "" "Insira o seu custo de filamento por kg aqui. Isto é apenas para informação " "estatística." -#: src/libslic3r/PrintConfig.cpp:1074 +#: src/libslic3r/PrintConfig.cpp:1163 msgid "money/kg" msgstr "dinheiro/kg" -#: src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1168 msgid "Spool weight" msgstr "Peso do carretel" -#: src/libslic3r/PrintConfig.cpp:1080 +#: src/libslic3r/PrintConfig.cpp:1169 msgid "" "Enter weight of the empty filament spool. One may weigh a partially consumed " "filament spool before printing and one may compare the measured weight with " @@ -12023,19 +13848,19 @@ msgstr "" "medido com o peso calculado do filamento com o carretel para descobrir se a " "quantidade de filamento no carretel é suficiente para terminar a impressão." -#: src/libslic3r/PrintConfig.cpp:1084 +#: src/libslic3r/PrintConfig.cpp:1173 msgid "g" msgstr "g" -#: src/libslic3r/PrintConfig.cpp:1093 src/libslic3r/PrintConfig.cpp:3537 +#: src/libslic3r/PrintConfig.cpp:1182 src/libslic3r/PrintConfig.cpp:3814 msgid "(Unknown)" msgstr "(Desconhecido)" -#: src/libslic3r/PrintConfig.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:1186 msgid "Fill angle" msgstr "Ângulo de preenchimento" -#: src/libslic3r/PrintConfig.cpp:1099 +#: src/libslic3r/PrintConfig.cpp:1188 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " @@ -12045,63 +13870,63 @@ msgstr "" "aplicada a isso. Pontes serão preenchidas usando a melhor direção " "PrusaSlicer pode detectar, portanto, essa config. não vai afeta-los." -#: src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1199 msgid "Fill density" msgstr "Densidade de preenchimento" -#: src/libslic3r/PrintConfig.cpp:1113 +#: src/libslic3r/PrintConfig.cpp:1201 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "Densidade de preenchimento interno, expresso na faixa de 0%-100%." -#: src/libslic3r/PrintConfig.cpp:1148 +#: src/libslic3r/PrintConfig.cpp:1224 msgid "Fill pattern" msgstr "Padrão de preenchimento" -#: src/libslic3r/PrintConfig.cpp:1150 +#: src/libslic3r/PrintConfig.cpp:1226 msgid "Fill pattern for general low-density infill." msgstr "Padrão de preenchimento para preenchimento de baixa densidade." -#: src/libslic3r/PrintConfig.cpp:1171 src/libslic3r/PrintConfig.cpp:2803 +#: src/libslic3r/PrintConfig.cpp:1230 src/libslic3r/PrintConfig.cpp:2822 msgid "Grid" msgstr "Grade" -#: src/libslic3r/PrintConfig.cpp:1173 +#: src/libslic3r/PrintConfig.cpp:1232 msgid "Stars" msgstr "Estrelas" -#: src/libslic3r/PrintConfig.cpp:1174 +#: src/libslic3r/PrintConfig.cpp:1233 msgid "Cubic" msgstr "Cúbico" -#: src/libslic3r/PrintConfig.cpp:1175 +#: src/libslic3r/PrintConfig.cpp:1234 msgid "Line" msgstr "Linha" -#: src/libslic3r/PrintConfig.cpp:1177 src/libslic3r/PrintConfig.cpp:2756 +#: src/libslic3r/PrintConfig.cpp:1236 src/libslic3r/PrintConfig.cpp:2778 msgid "Honeycomb" msgstr "Hexágono" -#: src/libslic3r/PrintConfig.cpp:1178 +#: src/libslic3r/PrintConfig.cpp:1237 msgid "3D Honeycomb" msgstr "Hexágono 3D" -#: src/libslic3r/PrintConfig.cpp:1179 +#: src/libslic3r/PrintConfig.cpp:1238 msgid "Gyroid" msgstr "Giróide" -#: src/libslic3r/PrintConfig.cpp:1183 +#: src/libslic3r/PrintConfig.cpp:1242 msgid "Adaptive Cubic" msgstr "Adaptativo" -#: src/libslic3r/PrintConfig.cpp:1184 +#: src/libslic3r/PrintConfig.cpp:1243 msgid "Support Cubic" msgstr "Pilar de suporte" -#: src/libslic3r/PrintConfig.cpp:1185 +#: src/libslic3r/PrintConfig.cpp:1244 msgid "Lightning" msgstr "Relâmpago" -#: src/libslic3r/PrintConfig.cpp:1190 +#: src/libslic3r/PrintConfig.cpp:1250 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." @@ -12109,11 +13934,11 @@ msgstr "" "Esta é a aceleração que sua impressora usará para a primeira camada. Defina " "zero para desabilitar o controle de aceleração para a primeira camada." -#: src/libslic3r/PrintConfig.cpp:1198 +#: src/libslic3r/PrintConfig.cpp:1258 msgid "First object layer over raft interface" msgstr "Primeira camada de objeto sobre a interface de jangada" -#: src/libslic3r/PrintConfig.cpp:1199 +#: src/libslic3r/PrintConfig.cpp:1259 msgid "" "This is the acceleration your printer will use for first layer of object " "above raft interface. Set zero to disable acceleration control for first " @@ -12124,11 +13949,11 @@ msgstr "" "controle de aceleração para a primeira camada do objeto acima da interface " "da balsa." -#: src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "First layer bed temperature" msgstr "Temperatura da mesa da primeira camada" -#: src/libslic3r/PrintConfig.cpp:1209 +#: src/libslic3r/PrintConfig.cpp:1269 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." @@ -12136,7 +13961,7 @@ msgstr "" "Temperatura da mesa aquecida para a primeira camada. Defina isso como zero " "para desabilitar os comandos de controle de temperatura da mesa na saída." -#: src/libslic3r/PrintConfig.cpp:1219 +#: src/libslic3r/PrintConfig.cpp:1279 msgid "" "Set this to a non-zero value to set a manual extrusion width for first " "layer. You can use this to force fatter extrudates for better adhesion. If " @@ -12149,7 +13974,7 @@ msgstr "" "exemplo, 120%) será computado sobre a primeira altura da camada. Se definido " "como zero, ele usará a largura de extrusão padrão." -#: src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1293 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " @@ -12159,11 +13984,11 @@ msgstr "" "imprimir uma camada inferior mais grossa para melhoraradesão e tolerância " "para placas de construção não perfeitas." -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1301 msgid "First layer speed" msgstr "Velocidade da primeira camada" -#: src/libslic3r/PrintConfig.cpp:1242 +#: src/libslic3r/PrintConfig.cpp:1302 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " @@ -12174,11 +13999,11 @@ msgstr "" "seu tipo. Se expresso em porcentagem(por exemplo: 40%) Ele dimensionará as " "velocidades padrão." -#: src/libslic3r/PrintConfig.cpp:1252 +#: src/libslic3r/PrintConfig.cpp:1312 msgid "Speed of object first layer over raft interface" msgstr "Velocidade da primeira camada do objeto sobre a interface de jangada" -#: src/libslic3r/PrintConfig.cpp:1253 +#: src/libslic3r/PrintConfig.cpp:1313 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first object layer above raft interface, regardless " @@ -12190,11 +14015,11 @@ msgstr "" "interface da balsa, independentemente de seu tipo. Se expresso em " "porcentagem (por exemplo: 40%) será escalar as velocidades padrão." -#: src/libslic3r/PrintConfig.cpp:1263 +#: src/libslic3r/PrintConfig.cpp:1323 msgid "First layer nozzle temperature" msgstr "Temperatura do bico da primeira camada" -#: src/libslic3r/PrintConfig.cpp:1264 +#: src/libslic3r/PrintConfig.cpp:1324 msgid "" "Nozzle temperature for the first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " @@ -12204,11 +14029,11 @@ msgstr "" "temperatura manualmente durante a impressão, defina isso como zero para " "desabilitar os comandos de controle no arquivo de saída G-code." -#: src/libslic3r/PrintConfig.cpp:1272 +#: src/libslic3r/PrintConfig.cpp:1332 msgid "Full fan speed at layer" msgstr "Velocidade total da ventoinha na camada" -#: src/libslic3r/PrintConfig.cpp:1273 +#: src/libslic3r/PrintConfig.cpp:1333 msgid "" "Fan speed will be ramped up linearly from zero at layer " "\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". " @@ -12222,23 +14047,23 @@ msgstr "" "\"disable_fan_first_layers\", caso em que o ventilador estará funcionando na " "velocidade máxima permitida na camada \"disable_fan_first_layers\" + 1." -#: src/libslic3r/PrintConfig.cpp:1285 +#: src/libslic3r/PrintConfig.cpp:1345 msgid "Fuzzy skin type." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1348 msgid "Outside walls" msgstr "Paredes externas" -#: src/libslic3r/PrintConfig.cpp:1293 +#: src/libslic3r/PrintConfig.cpp:1349 msgid "All walls" msgstr "Todas paredes" -#: src/libslic3r/PrintConfig.cpp:1298 +#: src/libslic3r/PrintConfig.cpp:1355 msgid "Fuzzy skin thickness" msgstr "Espessura da pele difusa" -#: src/libslic3r/PrintConfig.cpp:1300 +#: src/libslic3r/PrintConfig.cpp:1357 msgid "" "The maximum distance that each skin point can be offset (both ways), " "measured perpendicular to the perimeter wall." @@ -12246,11 +14071,11 @@ msgstr "" "A distância máxima que cada ponto da pele pode ser deslocado (nos dois " "sentidos), medido perpendicularmente ao perímetromuro." -#: src/libslic3r/PrintConfig.cpp:1308 +#: src/libslic3r/PrintConfig.cpp:1365 msgid "Fuzzy skin point distance" msgstr "Distância do ponto de pele difusa" -#: src/libslic3r/PrintConfig.cpp:1310 +#: src/libslic3r/PrintConfig.cpp:1367 msgid "" "Perimeters will be split into multiple segments by inserting Fuzzy skin " "points. Lowering the Fuzzy skin point distance will increase the number of " @@ -12260,11 +14085,11 @@ msgstr "" "difusos. Reduzindo o ponto de pele difuso a distância aumentará o número de " "pontos de deslocamento aleatórios na parede do perímetro." -#: src/libslic3r/PrintConfig.cpp:1318 +#: src/libslic3r/PrintConfig.cpp:1375 msgid "Fill gaps" msgstr "Preencher vãos" -#: src/libslic3r/PrintConfig.cpp:1320 +#: src/libslic3r/PrintConfig.cpp:1377 msgid "" "Enables filling of gaps between perimeters and between the inner most " "perimeters and infill." @@ -12272,7 +14097,11 @@ msgstr "" "Permite o preenchimento de lacunas entre perímetros e entre os perímetros " "mais internos e o preenchimento." -#: src/libslic3r/PrintConfig.cpp:1327 +#: src/libslic3r/PrintConfig.cpp:1382 +msgid "Gap fill" +msgstr "Preenchimento de vão" + +#: src/libslic3r/PrintConfig.cpp:1384 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " @@ -12283,11 +14112,11 @@ msgstr "" "problemas de ressonância. Defina zero para desabilitar o preenchimento de " "lacunas." -#: src/libslic3r/PrintConfig.cpp:1335 +#: src/libslic3r/PrintConfig.cpp:1392 msgid "Verbose G-code" msgstr "G-code detalhado" -#: src/libslic3r/PrintConfig.cpp:1336 +#: src/libslic3r/PrintConfig.cpp:1393 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " @@ -12297,11 +14126,11 @@ msgstr "" "explicada por um texto descritivo. Se você imprimir a partir do cartão SD, o " "peso adicional do arquivo pode fazer o seu firmware ficar mais lento." -#: src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1400 msgid "G-code flavor" msgstr "Tipo de G-code" -#: src/libslic3r/PrintConfig.cpp:1344 +#: src/libslic3r/PrintConfig.cpp:1401 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " @@ -12313,15 +14142,15 @@ msgstr "" "uma saída compatível. O \"sem extrusão\" tipo impede PrusaSlicer de exportar " "qualquer valor de extrusão em tudo." -#: src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1416 msgid "No extrusion" msgstr "Sem extrusão" -#: src/libslic3r/PrintConfig.cpp:1376 +#: src/libslic3r/PrintConfig.cpp:1422 msgid "Label objects" msgstr "Rotular objetos" -#: src/libslic3r/PrintConfig.cpp:1377 +#: src/libslic3r/PrintConfig.cpp:1423 msgid "" "Enable this to add comments into the G-Code labeling print moves with what " "object they belong to, which is useful for the Octoprint CancelObject " @@ -12334,19 +14163,19 @@ msgstr "" "config. de multi material de extrusora única e limpe em objeto/limpar em " "preenchimento." -#: src/libslic3r/PrintConfig.cpp:1384 +#: src/libslic3r/PrintConfig.cpp:1430 msgid "G-code substitutions" msgstr "Substituições de G-code" -#: src/libslic3r/PrintConfig.cpp:1385 +#: src/libslic3r/PrintConfig.cpp:1431 msgid "Find / replace patterns in G-code lines and substitute them." msgstr "Encontre/substitua padrões em linhas de G-code e substitua-os." -#: src/libslic3r/PrintConfig.cpp:1390 +#: src/libslic3r/PrintConfig.cpp:1436 msgid "High extruder current on filament swap" msgstr "Corrente elevada da extrusora na troca do filamento" -#: src/libslic3r/PrintConfig.cpp:1391 +#: src/libslic3r/PrintConfig.cpp:1437 msgid "" "It may be beneficial to increase the extruder motor current during the " "filament exchange sequence to allow for rapid ramming feed rates and to " @@ -12357,7 +14186,7 @@ msgstr "" "Ramming rápidas e para superar a resistência ao carregar um filamento com " "uma ponta feia." -#: src/libslic3r/PrintConfig.cpp:1399 +#: src/libslic3r/PrintConfig.cpp:1445 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." @@ -12365,23 +14194,33 @@ msgstr "" "Esta é a aceleração que sua impressora usará para preenchimento. Defina zero " "para desabilitar o controle de aceleração para preenchimento." -#: src/libslic3r/PrintConfig.cpp:1408 +#: src/libslic3r/PrintConfig.cpp:1453 src/libslic3r/PrintConfig.cpp:2423 +#: src/libslic3r/PrintConfig.cpp:2435 +msgid "Solid infill" +msgstr "Preenchimento sólido" + +#: src/libslic3r/PrintConfig.cpp:1454 msgid "" "This is the acceleration your printer will use for solid infill. Set zero to " "use the value for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:2977 +#: src/libslic3r/PrintConfig.cpp:2990 +msgid "Top solid infill" +msgstr "Preenchimento do sólido do topo" + +#: src/libslic3r/PrintConfig.cpp:1463 msgid "" "This is the acceleration your printer will use for top solid infill. Set " "zero to use the value for solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1426 +#: src/libslic3r/PrintConfig.cpp:1472 msgid "Combine infill every" msgstr "Combine preenchimento a cada" -#: src/libslic3r/PrintConfig.cpp:1428 +#: src/libslic3r/PrintConfig.cpp:1474 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." @@ -12390,15 +14229,15 @@ msgstr "" "extrusão camadas de preenchimento mais espessa, preservando perímetros " "finos, assim, a precisão." -#: src/libslic3r/PrintConfig.cpp:1431 +#: src/libslic3r/PrintConfig.cpp:1477 msgid "Combine infill every n layers" msgstr "Combine preenchimento cada n camadas" -#: src/libslic3r/PrintConfig.cpp:1437 +#: src/libslic3r/PrintConfig.cpp:1483 msgid "Length of the infill anchor" msgstr "Comprimento da âncora de preenchimento" -#: src/libslic3r/PrintConfig.cpp:1439 +#: src/libslic3r/PrintConfig.cpp:1485 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -12421,35 +14260,35 @@ msgstr "" "Defina este parâmetro como zero para desativar os perímetros de ancoragem " "conectados a uma única linha de enchimento." -#: src/libslic3r/PrintConfig.cpp:1455 +#: src/libslic3r/PrintConfig.cpp:1495 msgid "0 (no open anchors)" msgstr "0 (sem âncoras abertas)" -#: src/libslic3r/PrintConfig.cpp:1456 src/libslic3r/PrintConfig.cpp:1479 +#: src/libslic3r/PrintConfig.cpp:1496 src/libslic3r/PrintConfig.cpp:1519 msgid "1 mm" msgstr "1 mm" -#: src/libslic3r/PrintConfig.cpp:1457 src/libslic3r/PrintConfig.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:1520 msgid "2 mm" msgstr "2 mm" -#: src/libslic3r/PrintConfig.cpp:1458 src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1498 src/libslic3r/PrintConfig.cpp:1521 msgid "5 mm" msgstr "5 mm" -#: src/libslic3r/PrintConfig.cpp:1459 src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1499 src/libslic3r/PrintConfig.cpp:1522 msgid "10 mm" msgstr "10 mm" -#: src/libslic3r/PrintConfig.cpp:1460 src/libslic3r/PrintConfig.cpp:1483 +#: src/libslic3r/PrintConfig.cpp:1500 src/libslic3r/PrintConfig.cpp:1523 msgid "1000 (unlimited)" msgstr "1000 (ilimitado)" -#: src/libslic3r/PrintConfig.cpp:1465 +#: src/libslic3r/PrintConfig.cpp:1506 msgid "Maximum length of the infill anchor" msgstr "Comprimento máximo da âncora de preenchimento" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1508 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -12470,20 +14309,20 @@ msgstr "" "tomado é limitado a infill_anchor, mas não mais do que este parâmetro. " "Defina este parâmetro como zero para desativar a ancoragem." -#: src/libslic3r/PrintConfig.cpp:1478 +#: src/libslic3r/PrintConfig.cpp:1518 msgid "0 (not anchored)" msgstr "0(não ancorado)" -#: src/libslic3r/PrintConfig.cpp:1488 +#: src/libslic3r/PrintConfig.cpp:1529 msgid "Infill extruder" msgstr "Extrusora de preenchimento" -#: src/libslic3r/PrintConfig.cpp:1490 +#: src/libslic3r/PrintConfig.cpp:1531 msgid "The extruder to use when printing infill." msgstr "" "A extrusora a ser utilizada quando estiver imprimindo preenchimento sólido." -#: src/libslic3r/PrintConfig.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:1539 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill. If " "left zero, default extrusion width will be used if set, otherwise 1.125 x " @@ -12498,11 +14337,11 @@ msgstr "" "acelerar o preenchimento e tornar suas peças mais fortes. Se expresso em " "porcentagem(por exemplo, 90%) Ele será calculado sobre a altura da camada." -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1550 msgid "Infill before perimeters" msgstr "Preenchimento antes dos perímetros" -#: src/libslic3r/PrintConfig.cpp:1510 +#: src/libslic3r/PrintConfig.cpp:1551 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." @@ -12510,11 +14349,11 @@ msgstr "" "Esta opção irá mudar a ordem de impressão de perímetros e preenchimento, " "tornando o último primeiro." -#: src/libslic3r/PrintConfig.cpp:1515 +#: src/libslic3r/PrintConfig.cpp:1556 msgid "Only infill where needed" msgstr "Somente preenchimento onde necessário" -#: src/libslic3r/PrintConfig.cpp:1517 +#: src/libslic3r/PrintConfig.cpp:1558 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " @@ -12525,11 +14364,11 @@ msgstr "" "habilitada, retarda a geração de G-code devido às várias verificações " "envolvidas." -#: src/libslic3r/PrintConfig.cpp:1524 +#: src/libslic3r/PrintConfig.cpp:1565 msgid "Infill/perimeters overlap" msgstr "Sobreposição de preenchimento/perímetros" -#: src/libslic3r/PrintConfig.cpp:1526 +#: src/libslic3r/PrintConfig.cpp:1567 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -12542,24 +14381,24 @@ msgstr "" "porcentagem(exemplo: 15%) é calculado sobre a largura da extrusão do " "perímetro." -#: src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "" "Velocidade para imprimir o preenchimento interno. Defina como zero para auto." -#: src/libslic3r/PrintConfig.cpp:1545 +#: src/libslic3r/PrintConfig.cpp:1586 msgid "Inherits profile" msgstr "Herda o perfil" -#: src/libslic3r/PrintConfig.cpp:1546 +#: src/libslic3r/PrintConfig.cpp:1587 msgid "Name of the profile, from which this profile inherits." msgstr "Nome do perfil, a partir do qual este perfil herda." -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1600 msgid "Interface shells" msgstr "Interface dos perímetros externos" -#: src/libslic3r/PrintConfig.cpp:1560 +#: src/libslic3r/PrintConfig.cpp:1601 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " @@ -12569,65 +14408,65 @@ msgstr "" "adjacentes. Útil para cópias da multi-extrusora com materiais translúcidos " "ou material de sustentação solúvel manual." -#: src/libslic3r/PrintConfig.cpp:1568 +#: src/libslic3r/PrintConfig.cpp:1609 msgid "Maximum width of a segmented region" msgstr "Largura máxima de uma região segmentada" -#: src/libslic3r/PrintConfig.cpp:1569 +#: src/libslic3r/PrintConfig.cpp:1610 msgid "Maximum width of a segmented region. Zero disables this feature." msgstr "Largura máxima de uma região segmentada. Zero desativa esse recurso." -#: src/libslic3r/PrintConfig.cpp:1570 src/libslic3r/PrintConfig.cpp:2189 -#: src/libslic3r/PrintConfig.cpp:2198 +#: src/libslic3r/PrintConfig.cpp:1611 src/libslic3r/PrintConfig.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2228 msgid "mm (zero to disable)" msgstr "mm (zero para desativar)" -#: src/libslic3r/PrintConfig.cpp:1577 +#: src/libslic3r/PrintConfig.cpp:1618 msgid "Enable ironing" msgstr "Ativar passar ferro" -#: src/libslic3r/PrintConfig.cpp:1578 +#: src/libslic3r/PrintConfig.cpp:1619 msgid "" "Enable ironing of the top layers with the hot print head for smooth surface" msgstr "" "Ative Passar Ferro nas camadas de topo com a cabeça de impressão a quente " "para uma superfície lisa" -#: src/libslic3r/PrintConfig.cpp:1584 src/libslic3r/PrintConfig.cpp:1586 +#: src/libslic3r/PrintConfig.cpp:1625 src/libslic3r/PrintConfig.cpp:1627 msgid "Ironing Type" msgstr "Tipo de Passar Ferro" -#: src/libslic3r/PrintConfig.cpp:1591 +#: src/libslic3r/PrintConfig.cpp:1629 msgid "All top surfaces" msgstr "Todas superfícies de topo" -#: src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Topmost surface only" msgstr "Apenas superfície superior" -#: src/libslic3r/PrintConfig.cpp:1593 +#: src/libslic3r/PrintConfig.cpp:1631 msgid "All solid surfaces" msgstr "Todas superfícies sólidas" -#: src/libslic3r/PrintConfig.cpp:1598 +#: src/libslic3r/PrintConfig.cpp:1637 msgid "Flow rate" msgstr "Fluxo" -#: src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Percent of a flow rate relative to object's normal layer height." msgstr "" "Porcentagem de uma taxa de fluxo em relação à altura normal da camada do " "objeto." -#: src/libslic3r/PrintConfig.cpp:1608 +#: src/libslic3r/PrintConfig.cpp:1647 msgid "Spacing between ironing passes" msgstr "Espaçamento entre passagem de ferro" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1649 msgid "Distance between ironing lines" msgstr "Distância entre as linhas de passar ferro" -#: src/libslic3r/PrintConfig.cpp:1627 +#: src/libslic3r/PrintConfig.cpp:1666 msgid "" "This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can " @@ -12639,11 +14478,11 @@ msgstr "" "Observe que você pode usar variáveis de espaço reservado para todas as " "config. PrusaSlicer, bem como [layer_num] e [layer_z]." -#: src/libslic3r/PrintConfig.cpp:1638 +#: src/libslic3r/PrintConfig.cpp:1677 msgid "Supports remaining times" msgstr "Tempo de impressão restante" -#: src/libslic3r/PrintConfig.cpp:1639 +#: src/libslic3r/PrintConfig.cpp:1678 msgid "" "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " "intervals into the G-code to let the firmware show accurate remaining time. " @@ -12656,155 +14495,155 @@ msgstr "" "M73. Além disso, o firmware i3 MK3 suporta M73 QXX Sxx para o modo " "silencioso." -#: src/libslic3r/PrintConfig.cpp:1647 +#: src/libslic3r/PrintConfig.cpp:1686 msgid "Supports stealth mode" msgstr "Suporta o modo silencioso" -#: src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1687 msgid "The firmware supports stealth mode" msgstr "O firmware suporta o modo silencioso" -#: src/libslic3r/PrintConfig.cpp:1653 +#: src/libslic3r/PrintConfig.cpp:1692 msgid "How to apply limits" msgstr "Como aplicar limites" -#: src/libslic3r/PrintConfig.cpp:1654 +#: src/libslic3r/PrintConfig.cpp:1693 msgid "Purpose of Machine Limits" msgstr "Proposito dos Limites da máquina" -#: src/libslic3r/PrintConfig.cpp:1656 +#: src/libslic3r/PrintConfig.cpp:1695 msgid "How to apply the Machine Limits" msgstr "Como aplicar os Limites da Máquina" -#: src/libslic3r/PrintConfig.cpp:1661 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "Emit to G-code" msgstr "Emitir para G-code" -#: src/libslic3r/PrintConfig.cpp:1662 +#: src/libslic3r/PrintConfig.cpp:1698 msgid "Use for time estimate" msgstr "Usar para estimar tempo" -#: src/libslic3r/PrintConfig.cpp:1663 +#: src/libslic3r/PrintConfig.cpp:1699 msgid "Ignore" msgstr "Ignorar" -#: src/libslic3r/PrintConfig.cpp:1686 +#: src/libslic3r/PrintConfig.cpp:1723 msgid "Maximum feedrate X" msgstr "Máxima taxa de alimentação do X" -#: src/libslic3r/PrintConfig.cpp:1687 +#: src/libslic3r/PrintConfig.cpp:1724 msgid "Maximum feedrate Y" msgstr "Máxima taxa de alimentação do Y" -#: src/libslic3r/PrintConfig.cpp:1688 +#: src/libslic3r/PrintConfig.cpp:1725 msgid "Maximum feedrate Z" msgstr "Máxima taxa de alimentação do Z" -#: src/libslic3r/PrintConfig.cpp:1689 +#: src/libslic3r/PrintConfig.cpp:1726 msgid "Maximum feedrate E" msgstr "Máxima taxa de alimentação do E" -#: src/libslic3r/PrintConfig.cpp:1692 +#: src/libslic3r/PrintConfig.cpp:1729 msgid "Maximum feedrate of the X axis" msgstr "Máxima taxa de alimentação do eixo X" -#: src/libslic3r/PrintConfig.cpp:1693 +#: src/libslic3r/PrintConfig.cpp:1730 msgid "Maximum feedrate of the Y axis" msgstr "Máxima taxa de alimentação do eixo Y" -#: src/libslic3r/PrintConfig.cpp:1694 +#: src/libslic3r/PrintConfig.cpp:1731 msgid "Maximum feedrate of the Z axis" msgstr "Máxima taxa de alimentação do eixo Z" -#: src/libslic3r/PrintConfig.cpp:1695 +#: src/libslic3r/PrintConfig.cpp:1732 msgid "Maximum feedrate of the E axis" msgstr "Máxima taxa de alimentação do eixo E" -#: src/libslic3r/PrintConfig.cpp:1703 +#: src/libslic3r/PrintConfig.cpp:1740 msgid "Maximum acceleration X" msgstr "Aceleração máxima do X" -#: src/libslic3r/PrintConfig.cpp:1704 +#: src/libslic3r/PrintConfig.cpp:1741 msgid "Maximum acceleration Y" msgstr "Aceleração máxima do Y" -#: src/libslic3r/PrintConfig.cpp:1705 +#: src/libslic3r/PrintConfig.cpp:1742 msgid "Maximum acceleration Z" msgstr "Aceleração máxima do Z" -#: src/libslic3r/PrintConfig.cpp:1706 +#: src/libslic3r/PrintConfig.cpp:1743 msgid "Maximum acceleration E" msgstr "Aceleração máxima do E" -#: src/libslic3r/PrintConfig.cpp:1709 +#: src/libslic3r/PrintConfig.cpp:1746 msgid "Maximum acceleration of the X axis" msgstr "Aceleração máxima do eixo X" -#: src/libslic3r/PrintConfig.cpp:1710 +#: src/libslic3r/PrintConfig.cpp:1747 msgid "Maximum acceleration of the Y axis" msgstr "Aceleração máxima do eixo Y" -#: src/libslic3r/PrintConfig.cpp:1711 +#: src/libslic3r/PrintConfig.cpp:1748 msgid "Maximum acceleration of the Z axis" msgstr "Aceleração máxima do eixo Z" -#: src/libslic3r/PrintConfig.cpp:1712 +#: src/libslic3r/PrintConfig.cpp:1749 msgid "Maximum acceleration of the E axis" msgstr "Aceleração máxima do eixo E" -#: src/libslic3r/PrintConfig.cpp:1720 +#: src/libslic3r/PrintConfig.cpp:1757 msgid "Maximum jerk X" msgstr "Máximo empurrão X" -#: src/libslic3r/PrintConfig.cpp:1721 +#: src/libslic3r/PrintConfig.cpp:1758 msgid "Maximum jerk Y" msgstr "Máximo empurrão Y" -#: src/libslic3r/PrintConfig.cpp:1722 +#: src/libslic3r/PrintConfig.cpp:1759 msgid "Maximum jerk Z" msgstr "Máximo empurrão Z" -#: src/libslic3r/PrintConfig.cpp:1723 +#: src/libslic3r/PrintConfig.cpp:1760 msgid "Maximum jerk E" msgstr "Máximo empurrão E" -#: src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:1763 msgid "Maximum jerk of the X axis" msgstr "Máximo empurrão do eixo X" -#: src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1764 msgid "Maximum jerk of the Y axis" msgstr "Máximo empurrão do eixo Y" -#: src/libslic3r/PrintConfig.cpp:1728 +#: src/libslic3r/PrintConfig.cpp:1765 msgid "Maximum jerk of the Z axis" msgstr "Máximo empurrão do eixo Z" -#: src/libslic3r/PrintConfig.cpp:1729 +#: src/libslic3r/PrintConfig.cpp:1766 msgid "Maximum jerk of the E axis" msgstr "Máximo empurrão do eixo E" -#: src/libslic3r/PrintConfig.cpp:1739 +#: src/libslic3r/PrintConfig.cpp:1776 msgid "Minimum feedrate when extruding" msgstr "Taxa de alimentação mínima ao extrudar" -#: src/libslic3r/PrintConfig.cpp:1741 +#: src/libslic3r/PrintConfig.cpp:1778 msgid "Minimum feedrate when extruding (M205 S)" msgstr "Taxa de alimentação mínima ao extrudar (M205 S)" -#: src/libslic3r/PrintConfig.cpp:1749 +#: src/libslic3r/PrintConfig.cpp:1786 msgid "Minimum travel feedrate" msgstr "Taxa de alimentação mínima no deslocamento" -#: src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:1788 msgid "Minimum travel feedrate (M205 T)" msgstr "Taxa de alimentação mínima no deslocamento (M205 T)" -#: src/libslic3r/PrintConfig.cpp:1759 +#: src/libslic3r/PrintConfig.cpp:1796 msgid "Maximum acceleration when extruding" msgstr "Aceleração máxima quando expurgando" -#: src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1798 msgid "" "Maximum acceleration when extruding (M204 P)\n" "\n" @@ -12816,31 +14655,31 @@ msgstr "" "Firmware Marlin (legado) usará isso também como aceleração de deslocamento " "(M204 T)." -#: src/libslic3r/PrintConfig.cpp:1772 +#: src/libslic3r/PrintConfig.cpp:1809 msgid "Maximum acceleration when retracting" msgstr "Aceleração máxima durante a retração" -#: src/libslic3r/PrintConfig.cpp:1774 +#: src/libslic3r/PrintConfig.cpp:1811 msgid "Maximum acceleration when retracting (M204 R)" msgstr "Aceleração máxima ao retrair (M204 R)" -#: src/libslic3r/PrintConfig.cpp:1782 +#: src/libslic3r/PrintConfig.cpp:1819 msgid "Maximum acceleration for travel moves" msgstr "Aceleração máxima para movimentos de deslocamento" -#: src/libslic3r/PrintConfig.cpp:1784 +#: src/libslic3r/PrintConfig.cpp:1821 msgid "Maximum acceleration for travel moves (M204 T)" msgstr "Aceleração máxima para movimentos de deslocamento (M204 T)" -#: src/libslic3r/PrintConfig.cpp:1791 src/libslic3r/PrintConfig.cpp:1800 +#: src/libslic3r/PrintConfig.cpp:1828 src/libslic3r/PrintConfig.cpp:1837 msgid "Max" msgstr "Máx" -#: src/libslic3r/PrintConfig.cpp:1792 +#: src/libslic3r/PrintConfig.cpp:1829 msgid "This setting represents the maximum speed of your fan." msgstr "Esta config. representa a velocidade máxima da sua ventoinha." -#: src/libslic3r/PrintConfig.cpp:1801 +#: src/libslic3r/PrintConfig.cpp:1838 msgid "" "This is the highest printable layer height for this extruder, used to cap " "the variable layer height and support layer height. Maximum recommended " @@ -12853,11 +14692,11 @@ msgstr "" "adesão razoável entre camadas. Se definido como 0, a altura da camada é " "limitada a 75% o do diâmetro da ponteira." -#: src/libslic3r/PrintConfig.cpp:1811 +#: src/libslic3r/PrintConfig.cpp:1848 msgid "Max print speed" msgstr "Velocidade máxima de impressão" -#: src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1849 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " @@ -12868,7 +14707,7 @@ msgstr "" "extrusora. Esta config. experimental é usada para definir a velocidade de " "impressão mais alta que você deseja permitir." -#: src/libslic3r/PrintConfig.cpp:1822 +#: src/libslic3r/PrintConfig.cpp:1859 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." @@ -12876,11 +14715,11 @@ msgstr "" "Esta config. experimental é usada para definir a velocidade máxima " "volumétrica que sua extrusora suporta." -#: src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1867 msgid "Max volumetric slope positive" msgstr "Inclinação volumétrica máx positiva" -#: src/libslic3r/PrintConfig.cpp:1831 +#: src/libslic3r/PrintConfig.cpp:1868 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from lower speed to higher speed. A value of 1.8 mm³/" @@ -12894,15 +14733,15 @@ msgstr "" "mm³/s (0.45 mm de largura de extrusão, 0.2 mm de altura de extrusão, avanço " "de 20 mm/s) a 5.4 mm³/s (avanço de 60 mm/s) levará em pelo menos 2 segundos." -#: src/libslic3r/PrintConfig.cpp:1836 src/libslic3r/PrintConfig.cpp:1848 +#: src/libslic3r/PrintConfig.cpp:1873 src/libslic3r/PrintConfig.cpp:1885 msgid "mm³/s²" msgstr "mm ³/s ²" -#: src/libslic3r/PrintConfig.cpp:1842 +#: src/libslic3r/PrintConfig.cpp:1879 msgid "Max volumetric slope negative" msgstr "Inclinação volumétrica máx negativa" -#: src/libslic3r/PrintConfig.cpp:1843 +#: src/libslic3r/PrintConfig.cpp:1880 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from higher speed to lower speed. A value of 1.8 mm³/" @@ -12917,17 +14756,17 @@ msgstr "" "avanço de 60 mm/s) a 1.8 mm³/s (avanço de 20 mm/s) levará a pelo menos 2 " "segundos." -#: src/libslic3r/PrintConfig.cpp:1854 src/libslic3r/PrintConfig.cpp:1863 +#: src/libslic3r/PrintConfig.cpp:1891 src/libslic3r/PrintConfig.cpp:1900 msgid "Min" msgstr "Min" -#: src/libslic3r/PrintConfig.cpp:1855 +#: src/libslic3r/PrintConfig.cpp:1892 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "" "Esta config. representa o PWM mínimo que seu ventoinha precisa para " "trabalhar." -#: src/libslic3r/PrintConfig.cpp:1864 +#: src/libslic3r/PrintConfig.cpp:1901 msgid "" "This is the lowest printable layer height for this extruder and limits the " "resolution for variable layer height. Typical values are between 0.05 mm and " @@ -12937,19 +14776,19 @@ msgstr "" "definição para a altura variável da camada. Os valores típicos são entre 0, " "5 mm e 0,1 mm." -#: src/libslic3r/PrintConfig.cpp:1872 +#: src/libslic3r/PrintConfig.cpp:1909 msgid "Min print speed" msgstr "Velocidade mínima de impressão" -#: src/libslic3r/PrintConfig.cpp:1873 +#: src/libslic3r/PrintConfig.cpp:1910 msgid "Slic3r will not scale speed down below this speed." msgstr "PrusaSlicer não vai escalar a velocidade abaixo desta velocidade." -#: src/libslic3r/PrintConfig.cpp:1880 +#: src/libslic3r/PrintConfig.cpp:1917 msgid "Minimal filament extrusion length" msgstr "Comprimento mínimo da extrusão do filamento" -#: src/libslic3r/PrintConfig.cpp:1881 +#: src/libslic3r/PrintConfig.cpp:1918 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " @@ -12959,11 +14798,11 @@ msgstr "" "a quantidade especificada de filamento na camada inferior. Para máquinas " "multiextrusoras, este mínimo aplica-se a cada extrusora." -#: src/libslic3r/PrintConfig.cpp:1890 +#: src/libslic3r/PrintConfig.cpp:1927 msgid "Configuration notes" msgstr "Notas de config" -#: src/libslic3r/PrintConfig.cpp:1891 +#: src/libslic3r/PrintConfig.cpp:1928 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." @@ -12971,17 +14810,17 @@ msgstr "" "Você pode colocar aqui suas anotações pessoais. Este texto será adicionado " "aos comentários do cabeçalho do G-code." -#: src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:1938 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "" "Este é o diâmetro da ponteira da extrusora (por exemplo: 0.5, 0.35 etc.)" -#: src/libslic3r/PrintConfig.cpp:1906 +#: src/libslic3r/PrintConfig.cpp:1943 msgid "Host Type" msgstr "Tipo de host" -#: src/libslic3r/PrintConfig.cpp:1907 +#: src/libslic3r/PrintConfig.cpp:1944 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." @@ -12989,11 +14828,11 @@ msgstr "" "PrusaSlicer pode carregar arquivos de G-code para um host de impressora. " "Este campo deve conter o tipo do host." -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:1961 msgid "Only retract when crossing perimeters" msgstr "Apenas retrair quando cruzar perímetros" -#: src/libslic3r/PrintConfig.cpp:1930 +#: src/libslic3r/PrintConfig.cpp:1962 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." @@ -13002,21 +14841,17 @@ msgstr "" "perímetros da camada superior (e, portanto, qualquer escorrimento será " "provavelmente invisível)." -#: src/libslic3r/PrintConfig.cpp:1937 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "" "This option will drop the temperature of the inactive extruders to prevent " -"oozing. It will enable a tall skirt automatically and move extruders outside " -"such skirt when changing temperatures." +"oozing. " msgstr "" -"Esta opção irá descartar a temperatura das extrusoras inativas para evitar a " -"escorrimento. Ele vai permitir uma saia alta automaticamente e mover " -"extrusoras fora de tal saia quando a mudança de temperatura." -#: src/libslic3r/PrintConfig.cpp:1944 +#: src/libslic3r/PrintConfig.cpp:1974 msgid "Output filename format" msgstr "Formato de nome de arquivo de saída" -#: src/libslic3r/PrintConfig.cpp:1945 +#: src/libslic3r/PrintConfig.cpp:1975 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -13028,11 +14863,11 @@ msgstr "" "também pode usar [tempo], [ano], [mês], [dia], [hora], [minuto], [segundo], " "[versão], [nome_entrada], [nome_entrada_base]." -#: src/libslic3r/PrintConfig.cpp:1954 +#: src/libslic3r/PrintConfig.cpp:1984 msgid "Detect bridging perimeters" msgstr "Detectar perímetros de ponte" -#: src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:1986 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." @@ -13041,11 +14876,11 @@ msgstr "" "será usado), para aplicar a velocidade da ponte a eles e para habilitar a " "ventoinha." -#: src/libslic3r/PrintConfig.cpp:1962 +#: src/libslic3r/PrintConfig.cpp:1992 msgid "Filament parking position" msgstr "Posição de estacionamento do filamento" -#: src/libslic3r/PrintConfig.cpp:1963 +#: src/libslic3r/PrintConfig.cpp:1993 msgid "" "Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware." @@ -13054,11 +14889,11 @@ msgstr "" "quando descarregado. Isso deve corresponder ao valor no firmware da " "impressora." -#: src/libslic3r/PrintConfig.cpp:1971 +#: src/libslic3r/PrintConfig.cpp:2001 msgid "Extra loading distance" msgstr "Distância de carregamento extra" -#: src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:2002 msgid "" "When set to zero, the distance the filament is moved from parking position " "during load is exactly the same as it was moved back during unload. When " @@ -13070,12 +14905,12 @@ msgstr "" "durante o descarregamento. Quando positivo, ele é carregado ainda mais, se " "negativo, o movimento de carga é menor do que o descarregamento." -#: src/libslic3r/PrintConfig.cpp:1980 src/libslic3r/PrintConfig.cpp:2005 -#: src/libslic3r/PrintConfig.cpp:2019 src/libslic3r/PrintConfig.cpp:2029 +#: src/libslic3r/PrintConfig.cpp:2010 src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2049 src/libslic3r/PrintConfig.cpp:2059 msgid "Perimeters" msgstr "Perímetros" -#: src/libslic3r/PrintConfig.cpp:1981 +#: src/libslic3r/PrintConfig.cpp:2011 msgid "" "This is the acceleration your printer will use for perimeters. Set zero to " "disable acceleration control for perimeters." @@ -13083,23 +14918,23 @@ msgstr "" "Esta é a aceleração que sua impressora usará para perimetros. Defina zero " "para desabilitar o controle de aceleração para perimetros." -#: src/libslic3r/PrintConfig.cpp:1989 +#: src/libslic3r/PrintConfig.cpp:2019 msgid "" "This is the acceleration your printer will use for external perimeters. Set " "zero to use the value for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1996 +#: src/libslic3r/PrintConfig.cpp:2026 msgid "Perimeter extruder" msgstr "Extrusora de perímetro" -#: src/libslic3r/PrintConfig.cpp:1998 +#: src/libslic3r/PrintConfig.cpp:2028 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" "A extrusora para usar ao imprimir perímetros e aba. A primeira extrusora é 1." -#: src/libslic3r/PrintConfig.cpp:2007 +#: src/libslic3r/PrintConfig.cpp:2037 msgid "" "Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. If " @@ -13114,14 +14949,14 @@ msgstr "" "ponteira será usado. Se expresso em porcentagem(por exemplo, 200%) Ele será " "calculado sobre a altura da camada." -#: src/libslic3r/PrintConfig.cpp:2021 +#: src/libslic3r/PrintConfig.cpp:2051 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "" "Velocidade para perímetros (contornos, também chamadas de perímetros " "externos verticais). Defina como zero para auto." -#: src/libslic3r/PrintConfig.cpp:2031 +#: src/libslic3r/PrintConfig.cpp:2061 msgid "" "This option sets the number of perimeters to generate for each layer. Note " "that Slic3r may increase this number automatically when it detects sloping " @@ -13133,11 +14968,11 @@ msgstr "" "superfícies inclinadas que se beneficiam de um número maior de perímetros se " "a opção extra perímetros estiver habilitada." -#: src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2065 msgid "(minimum)" msgstr "(mínimo)" -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "" "If you want to process the output G-code through custom scripts, just list " "their absolute paths here. Separate multiple scripts with a semicolon. " @@ -13151,35 +14986,35 @@ msgstr "" "para o arquivo de G-code como o primeiro argumento, e eles poderão acessar " "as config. de config. do PrusaSlicer lendo variáveis de ambiente." -#: src/libslic3r/PrintConfig.cpp:2055 +#: src/libslic3r/PrintConfig.cpp:2085 msgid "Printer type" msgstr "Tipo de impressora" -#: src/libslic3r/PrintConfig.cpp:2056 +#: src/libslic3r/PrintConfig.cpp:2086 msgid "Type of the printer." msgstr "Tipo da impressora." -#: src/libslic3r/PrintConfig.cpp:2061 +#: src/libslic3r/PrintConfig.cpp:2091 msgid "Printer notes" msgstr "Notas da impressora" -#: src/libslic3r/PrintConfig.cpp:2062 +#: src/libslic3r/PrintConfig.cpp:2092 msgid "You can put your notes regarding the printer here." msgstr "Você pode colocar suas anotações sobre a impressora aqui." -#: src/libslic3r/PrintConfig.cpp:2070 +#: src/libslic3r/PrintConfig.cpp:2100 msgid "Printer vendor" msgstr "Fornecedor da impressora" -#: src/libslic3r/PrintConfig.cpp:2071 +#: src/libslic3r/PrintConfig.cpp:2101 msgid "Name of the printer vendor." msgstr "Nome do fornecedor da impressora." -#: src/libslic3r/PrintConfig.cpp:2076 +#: src/libslic3r/PrintConfig.cpp:2106 msgid "Printer variant" msgstr "Variante da impressora" -#: src/libslic3r/PrintConfig.cpp:2077 +#: src/libslic3r/PrintConfig.cpp:2107 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." @@ -13187,38 +15022,38 @@ msgstr "" "Nome da variante da impressora. Por exemplo, as variantes da impressora " "podem ser diferenciadas por um diâmetro da ponteira." -#: src/libslic3r/PrintConfig.cpp:2094 +#: src/libslic3r/PrintConfig.cpp:2124 msgid "Raft contact Z distance" msgstr "Distância Z do contato da balsa" -#: src/libslic3r/PrintConfig.cpp:2096 +#: src/libslic3r/PrintConfig.cpp:2126 msgid "" "The vertical distance between object and raft. Ignored for soluble interface." msgstr "" "A distância vertical entre o objeto e a balsa. Ignorado para interface " "solúvel." -#: src/libslic3r/PrintConfig.cpp:2103 +#: src/libslic3r/PrintConfig.cpp:2133 msgid "Raft expansion" msgstr "Expansão da balsa" -#: src/libslic3r/PrintConfig.cpp:2105 +#: src/libslic3r/PrintConfig.cpp:2135 msgid "Expansion of the raft in XY plane for better stability." msgstr "Expansão da balsa no plano XY para melhor estabilidade." -#: src/libslic3r/PrintConfig.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:2142 msgid "First layer density" msgstr "Densidade da primeira camada" -#: src/libslic3r/PrintConfig.cpp:2114 +#: src/libslic3r/PrintConfig.cpp:2144 msgid "Density of the first raft or support layer." msgstr "Densidade da primeira jangada ou camada de suporte." -#: src/libslic3r/PrintConfig.cpp:2122 +#: src/libslic3r/PrintConfig.cpp:2152 msgid "First layer expansion" msgstr "Expansão da primeira camada" -#: src/libslic3r/PrintConfig.cpp:2124 +#: src/libslic3r/PrintConfig.cpp:2154 msgid "" "Expansion of the first raft or support layer to improve adhesion to print " "bed." @@ -13226,11 +15061,11 @@ msgstr "" "Expansão da primeira jangada ou camada de suporte para melhorar a adesão à " "mesa de impressão." -#: src/libslic3r/PrintConfig.cpp:2131 +#: src/libslic3r/PrintConfig.cpp:2161 msgid "Raft layers" msgstr "Camadas da estrado" -#: src/libslic3r/PrintConfig.cpp:2133 +#: src/libslic3r/PrintConfig.cpp:2163 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." @@ -13238,11 +15073,11 @@ msgstr "" "O objeto será elevado por este número de camadas, e o material de suporte " "será gerado em baixo dele." -#: src/libslic3r/PrintConfig.cpp:2141 +#: src/libslic3r/PrintConfig.cpp:2171 msgid "Slice resolution" msgstr "Resolução do fatiamento" -#: src/libslic3r/PrintConfig.cpp:2142 +#: src/libslic3r/PrintConfig.cpp:2172 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -13255,11 +15090,11 @@ msgstr "" "podem renderizar. Defina como zero para desabilitar qualquer simplificação e " "usar a resolução completa da entrada." -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:2182 msgid "G-code resolution" msgstr "Resolução do G-code" -#: src/libslic3r/PrintConfig.cpp:2153 +#: src/libslic3r/PrintConfig.cpp:2183 msgid "" "Maximum deviation of exported G-code paths from their full resolution " "counterparts. Very high resolution G-code requires huge amount of RAM to " @@ -13277,22 +15112,22 @@ msgstr "" "redução do G-code é realizada em cada camada de forma independente, " "artefatos visíveis podem ser produzidos." -#: src/libslic3r/PrintConfig.cpp:2164 +#: src/libslic3r/PrintConfig.cpp:2194 msgid "Minimum travel after retraction" msgstr "Retração em viagens acima de" -#: src/libslic3r/PrintConfig.cpp:2165 +#: src/libslic3r/PrintConfig.cpp:2195 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "" "A retração não é acionada quando os movimentos de deslocamento são mais " "curtos que esse comprimento." -#: src/libslic3r/PrintConfig.cpp:2171 +#: src/libslic3r/PrintConfig.cpp:2201 msgid "Retract amount before wipe" msgstr "Quantidade de retração antes da limpeza" -#: src/libslic3r/PrintConfig.cpp:2172 +#: src/libslic3r/PrintConfig.cpp:2202 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." @@ -13300,23 +15135,23 @@ msgstr "" "Com extrusoras Bowden, pode ser sábio fazer alguma quantidade de retração " "rápida antes de fazer o movimento da limpeza." -#: src/libslic3r/PrintConfig.cpp:2179 +#: src/libslic3r/PrintConfig.cpp:2209 msgid "Retract on layer change" msgstr "Retrair na mudança de camada" -#: src/libslic3r/PrintConfig.cpp:2180 +#: src/libslic3r/PrintConfig.cpp:2210 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "Este sinalizador impõe uma retração sempre que um movimento Z é feito." -#: src/libslic3r/PrintConfig.cpp:2185 src/libslic3r/PrintConfig.cpp:2193 +#: src/libslic3r/PrintConfig.cpp:2215 src/libslic3r/PrintConfig.cpp:2223 msgid "Length" msgstr "Comprimento" -#: src/libslic3r/PrintConfig.cpp:2186 +#: src/libslic3r/PrintConfig.cpp:2216 msgid "Retraction Length" msgstr "Comprimento de retração" -#: src/libslic3r/PrintConfig.cpp:2187 +#: src/libslic3r/PrintConfig.cpp:2217 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " @@ -13326,11 +15161,11 @@ msgstr "" "especificada (o comprimento é medido em filamento cru, antes de entrar na " "extrusora)." -#: src/libslic3r/PrintConfig.cpp:2194 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Retraction Length (Toolchange)" msgstr "Comprimento de retração (mudança de ferramenta)" -#: src/libslic3r/PrintConfig.cpp:2195 +#: src/libslic3r/PrintConfig.cpp:2225 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " @@ -13340,11 +15175,11 @@ msgstr "" "puxado para trás pela quantidade especificada (o comprimento é medido em " "filamento cru, antes de entrar na extrusora)." -#: src/libslic3r/PrintConfig.cpp:2203 +#: src/libslic3r/PrintConfig.cpp:2233 msgid "Lift Z" msgstr "Elevar Z" -#: src/libslic3r/PrintConfig.cpp:2204 +#: src/libslic3r/PrintConfig.cpp:2234 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " @@ -13354,15 +15189,15 @@ msgstr "" "que uma retração é acionada. Ao usar várias extrusoras, somente a config. " "para a primeira extrusora será considerada." -#: src/libslic3r/PrintConfig.cpp:2211 +#: src/libslic3r/PrintConfig.cpp:2241 msgid "Above Z" msgstr "Acima de Z" -#: src/libslic3r/PrintConfig.cpp:2212 +#: src/libslic3r/PrintConfig.cpp:2242 msgid "Only lift Z above" msgstr "Apenas elevar Z acima" -#: src/libslic3r/PrintConfig.cpp:2213 +#: src/libslic3r/PrintConfig.cpp:2243 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " @@ -13372,15 +15207,15 @@ msgstr "" "acima do Z absoluto especificado. Você pode ajustar essa config. para pular " "o elevador nas primeiras camadas." -#: src/libslic3r/PrintConfig.cpp:2220 +#: src/libslic3r/PrintConfig.cpp:2250 msgid "Below Z" msgstr "Abaixo de Z" -#: src/libslic3r/PrintConfig.cpp:2221 +#: src/libslic3r/PrintConfig.cpp:2251 msgid "Only lift Z below" msgstr "Apenas elevar Z abaixo" -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2252 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " @@ -13390,11 +15225,11 @@ msgstr "" "abaixo do Z absoluto especificado. Você pode ajustar essa config. para " "limitar a elevação às primeiras camadas." -#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2238 +#: src/libslic3r/PrintConfig.cpp:2260 src/libslic3r/PrintConfig.cpp:2268 msgid "Extra length on restart" msgstr "Comprimento extra no reinício" -#: src/libslic3r/PrintConfig.cpp:2231 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." @@ -13403,7 +15238,7 @@ msgstr "" "vai empurrar esta quantidade adicional de filamento. Essa config. raramente " "é necessária." -#: src/libslic3r/PrintConfig.cpp:2239 +#: src/libslic3r/PrintConfig.cpp:2269 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." @@ -13411,19 +15246,19 @@ msgstr "" "Quando a retração é compensada após a ferramenta de mudança, a extrusora " "empurrará esta quantidade adicional de filamento." -#: src/libslic3r/PrintConfig.cpp:2246 src/libslic3r/PrintConfig.cpp:2247 +#: src/libslic3r/PrintConfig.cpp:2276 src/libslic3r/PrintConfig.cpp:2277 msgid "Retraction Speed" msgstr "Velocidade da retração" -#: src/libslic3r/PrintConfig.cpp:2248 +#: src/libslic3r/PrintConfig.cpp:2278 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "A velocidade para retrações (aplica-se somente ao motor da extrusora)." -#: src/libslic3r/PrintConfig.cpp:2254 src/libslic3r/PrintConfig.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:2284 src/libslic3r/PrintConfig.cpp:2285 msgid "Deretraction Speed" msgstr "Velocidade de retorno de retração" -#: src/libslic3r/PrintConfig.cpp:2256 +#: src/libslic3r/PrintConfig.cpp:2286 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " @@ -13433,70 +15268,84 @@ msgstr "" "retração (aplica-se somente ao motor da extrusora). Se deixada como zero, a " "velocidade de retração é usada." -#: src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2293 msgid "Seam position" msgstr "Posição da costura" -#: src/libslic3r/PrintConfig.cpp:2265 +#: src/libslic3r/PrintConfig.cpp:2295 msgid "Position of perimeters starting points." msgstr "Posição inicial dos pontos do perímetro." -#: src/libslic3r/PrintConfig.cpp:2272 +#: src/libslic3r/PrintConfig.cpp:2297 +msgid "Random" +msgstr "Aleatório" + +#: src/libslic3r/PrintConfig.cpp:2298 msgid "Nearest" msgstr "Próximo" -#: src/libslic3r/PrintConfig.cpp:2273 +#: src/libslic3r/PrintConfig.cpp:2299 msgid "Aligned" msgstr "Alinhado(a)" -#: src/libslic3r/PrintConfig.cpp:2281 +#: src/libslic3r/PrintConfig.cpp:2306 +msgid "Staggered inner seams" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2307 +msgid "" +"This option causes the inner seams to be shifted backwards based on their " +"depth, forming a zigzag pattern." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2314 msgid "Direction" msgstr "Direção" -#: src/libslic3r/PrintConfig.cpp:2283 +#: src/libslic3r/PrintConfig.cpp:2316 msgid "Preferred direction of the seam" msgstr "Direção preferida da costura" -#: src/libslic3r/PrintConfig.cpp:2284 +#: src/libslic3r/PrintConfig.cpp:2317 msgid "Seam preferred direction" msgstr "Direção de preferência da costura" -#: src/libslic3r/PrintConfig.cpp:2291 +#: src/libslic3r/PrintConfig.cpp:2324 msgid "Jitter" msgstr "Jitter" -#: src/libslic3r/PrintConfig.cpp:2293 +#: src/libslic3r/PrintConfig.cpp:2326 msgid "Seam preferred direction jitter" msgstr "Direção da costura preferencial para Jitter" -#: src/libslic3r/PrintConfig.cpp:2294 +#: src/libslic3r/PrintConfig.cpp:2327 msgid "Preferred direction of the seam - jitter" msgstr "Direção preferida da costura-jitter" -#: src/libslic3r/PrintConfig.cpp:2301 +#: src/libslic3r/PrintConfig.cpp:2334 msgid "Distance from brim/object" msgstr "Distância da aba/objeto" -#: src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2335 msgid "" "Distance between skirt and brim (when draft shield is not used) or objects." msgstr "" "Distância entre a saia e a aba (quando a capela de proteção não é usada) ou " "objetos." -#: src/libslic3r/PrintConfig.cpp:2308 +#: src/libslic3r/PrintConfig.cpp:2341 msgid "Skirt height" msgstr "Altura da saia" -#: src/libslic3r/PrintConfig.cpp:2309 +#: src/libslic3r/PrintConfig.cpp:2342 msgid "Height of skirt expressed in layers." msgstr "Altura da saia expressa em camadas." -#: src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2348 msgid "Draft shield" msgstr "Escudo de proteção" -#: src/libslic3r/PrintConfig.cpp:2316 +#: src/libslic3r/PrintConfig.cpp:2349 msgid "" "With draft shield active, the skirt will be printed skirt_distance from the " "object, possibly intersecting brim.\n" @@ -13512,27 +15361,27 @@ msgstr "" "Isto é útil para proteger uma impressão ABS ou ASA contra deformação e " "descolamento da mesa de impressão devido à corrente de vento." -#: src/libslic3r/PrintConfig.cpp:2324 +#: src/libslic3r/PrintConfig.cpp:2354 msgid "Disabled" msgstr "Desabilitado" -#: src/libslic3r/PrintConfig.cpp:2325 +#: src/libslic3r/PrintConfig.cpp:2355 msgid "Limited" msgstr "Limitado" -#: src/libslic3r/PrintConfig.cpp:2326 +#: src/libslic3r/PrintConfig.cpp:2356 msgid "Enabled" msgstr "Habilitado" -#: src/libslic3r/PrintConfig.cpp:2331 +#: src/libslic3r/PrintConfig.cpp:2362 msgid "Loops (minimum)" msgstr "Voltas (mínimo)" -#: src/libslic3r/PrintConfig.cpp:2332 +#: src/libslic3r/PrintConfig.cpp:2363 msgid "Skirt Loops" msgstr "Voltas de saia" -#: src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2364 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " @@ -13543,11 +15392,11 @@ msgstr "" "configurado aqui. Defina isso como zero para desabilitar a saia " "completamente." -#: src/libslic3r/PrintConfig.cpp:2341 +#: src/libslic3r/PrintConfig.cpp:2372 msgid "Slow down if layer print time is below" msgstr "Diminuir a velocidade quando o tempo de impressão for menor que" -#: src/libslic3r/PrintConfig.cpp:2342 +#: src/libslic3r/PrintConfig.cpp:2373 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." @@ -13556,11 +15405,11 @@ msgstr "" "segundos, a velocidade de impressão será reduzida para estender a duração a " "esse valor." -#: src/libslic3r/PrintConfig.cpp:2351 +#: src/libslic3r/PrintConfig.cpp:2382 msgid "Small perimeters" msgstr "Perímetro pequeno" -#: src/libslic3r/PrintConfig.cpp:2353 +#: src/libslic3r/PrintConfig.cpp:2384 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " @@ -13571,11 +15420,11 @@ msgstr "" "será calculado sobre a velocidade de perímetros configurados acima. Defina " "como zero para auto." -#: src/libslic3r/PrintConfig.cpp:2363 +#: src/libslic3r/PrintConfig.cpp:2394 msgid "Solid infill threshold area" msgstr "Área de limiar de preenchimento sólido" -#: src/libslic3r/PrintConfig.cpp:2365 +#: src/libslic3r/PrintConfig.cpp:2396 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." @@ -13583,24 +15432,24 @@ msgstr "" "Forçar preenchimento sólido para regiões com uma área menor do que o limite " "especificado." -#: src/libslic3r/PrintConfig.cpp:2366 +#: src/libslic3r/PrintConfig.cpp:2397 msgid "mm²" msgstr "mm²" -#: src/libslic3r/PrintConfig.cpp:2372 +#: src/libslic3r/PrintConfig.cpp:2403 msgid "Solid infill extruder" msgstr "Extrusora de preenchimento sólido" -#: src/libslic3r/PrintConfig.cpp:2374 +#: src/libslic3r/PrintConfig.cpp:2405 msgid "The extruder to use when printing solid infill." msgstr "" "A extrusora a ser utilizada quando estiver imprimindo preenchimento sólido." -#: src/libslic3r/PrintConfig.cpp:2380 +#: src/libslic3r/PrintConfig.cpp:2411 msgid "Solid infill every" msgstr "Preenchimento sólido a cada" -#: src/libslic3r/PrintConfig.cpp:2382 +#: src/libslic3r/PrintConfig.cpp:2413 msgid "" "This feature allows to force a solid layer every given number of layers. " "Zero to disable. You can set this to any value (for example 9999); Slic3r " @@ -13613,7 +15462,7 @@ msgstr "" "possível de camadas para combinar de acordo com o diâmetro da ponteira e a " "altura da camada." -#: src/libslic3r/PrintConfig.cpp:2394 +#: src/libslic3r/PrintConfig.cpp:2425 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "solid surfaces. If left zero, default extrusion width will be used if set, " @@ -13626,7 +15475,7 @@ msgstr "" "1,125 x diâmetro da ponteira será usado. Se expresso em porcentagem(por " "exemplo, 90%) Ele será calculado sobre a altura da camada." -#: src/libslic3r/PrintConfig.cpp:2406 +#: src/libslic3r/PrintConfig.cpp:2437 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " @@ -13637,20 +15486,20 @@ msgstr "" "80%) sobre a velocidade de preenchimento padrão acima. Defina como zero para " "auto." -#: src/libslic3r/PrintConfig.cpp:2418 +#: src/libslic3r/PrintConfig.cpp:2449 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "" "Número de camadas sólidas a serem geradas nas interfaces do topo e base." -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2455 src/libslic3r/PrintConfig.cpp:2456 msgid "Minimum thickness of a top / bottom shell" msgstr "Espessura mínima de uma parede superior/inferior" -#: src/libslic3r/PrintConfig.cpp:2431 +#: src/libslic3r/PrintConfig.cpp:2462 msgid "Spiral vase" msgstr "Vaso espiral" -#: src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2463 msgid "" "This feature will raise Z gradually while printing a single-walled object in " "order to remove any visible seam. This option requires a single perimeter, " @@ -13665,21 +15514,17 @@ msgstr "" "camadas sólidas de fundo, bem como voltas de saia/aba. Ele não funcionará ao " "imprimir mais de um objeto." -#: src/libslic3r/PrintConfig.cpp:2440 +#: src/libslic3r/PrintConfig.cpp:2471 msgid "Temperature variation" msgstr "Variação de temperatura" -#: src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:2472 msgid "" -"Temperature difference to be applied when an extruder is not active. Enables " -"a full-height \"sacrificial\" skirt on which the nozzles are periodically " -"wiped." +"Temperature difference to be applied when an extruder is not active. The " +"value is not used when 'idle_temperature' in filament settings is defined." msgstr "" -"Diferença de temperatura a ser aplicada quando uma extrusora não está ativa. " -"Permite uma saia \"sacrificial\" em que as ponteiras são limpadas " -"periodicamente." -#: src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2483 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -13699,7 +15544,7 @@ msgstr "" "para que você possa colocar um comando \"M109 S " "[temperatura_primeira_camada]\" onde quiser." -#: src/libslic3r/PrintConfig.cpp:2466 +#: src/libslic3r/PrintConfig.cpp:2498 msgid "" "This start procedure is inserted at the beginning, after any printer start " "gcode (and after any toolchange to this filament in case of multi-material " @@ -13723,35 +15568,35 @@ msgstr "" "\"M109 S[first_layer_temperature]\" onde quiser. Se você tiver várias " "extrusoras, o G-code é processado em ordem de extrusora." -#: src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2514 msgid "Color change G-code" msgstr "G-code de troca de ferramenta" -#: src/libslic3r/PrintConfig.cpp:2483 +#: src/libslic3r/PrintConfig.cpp:2515 msgid "This G-code will be used as a code for the color change" msgstr "Este G-code será usado como um código para a mudança de cor" -#: src/libslic3r/PrintConfig.cpp:2492 +#: src/libslic3r/PrintConfig.cpp:2524 msgid "This G-code will be used as a code for the pause print" msgstr "Este G-code será usado como um código para pausar a impressora" -#: src/libslic3r/PrintConfig.cpp:2501 +#: src/libslic3r/PrintConfig.cpp:2533 msgid "This G-code will be used as a custom code" msgstr "Este G-code será usado como um código customizado" -#: src/libslic3r/PrintConfig.cpp:2509 +#: src/libslic3r/PrintConfig.cpp:2541 msgid "Single Extruder Multi Material" msgstr "Única extrusora multi material" -#: src/libslic3r/PrintConfig.cpp:2510 +#: src/libslic3r/PrintConfig.cpp:2542 msgid "The printer multiplexes filaments into a single hot end." msgstr "A impressora multiplexes filamentos em uma única extremidade quente." -#: src/libslic3r/PrintConfig.cpp:2515 +#: src/libslic3r/PrintConfig.cpp:2547 msgid "Prime all printing extruders" msgstr "Extrusar todas as extrusoras de impressão" -#: src/libslic3r/PrintConfig.cpp:2516 +#: src/libslic3r/PrintConfig.cpp:2548 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." @@ -13759,11 +15604,11 @@ msgstr "" "Se ativada, todas as extrusoras de impressão extrusarão na aba dianteira da " "mesa de impressão no início da impressão." -#: src/libslic3r/PrintConfig.cpp:2521 +#: src/libslic3r/PrintConfig.cpp:2553 msgid "No sparse layers (EXPERIMENTAL)" msgstr "Sem camadas esparsas (EXPERIMENTAL)" -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2554 msgid "" "If enabled, the wipe tower will not be printed on layers with no " "toolchanges. On layers with a toolchange, extruder will travel downward to " @@ -13775,11 +15620,11 @@ msgstr "" "deslocará para baixo para imprimir a torre de limpeza. O usuário é " "responsável por garantir que não haja colisão com a impressão." -#: src/libslic3r/PrintConfig.cpp:2529 +#: src/libslic3r/PrintConfig.cpp:2561 msgid "Slice gap closing radius" msgstr "Raio de fechamento da abertura da fatia" -#: src/libslic3r/PrintConfig.cpp:2531 +#: src/libslic3r/PrintConfig.cpp:2563 msgid "" "Cracks smaller than 2x gap closing radius are being filled during the " "triangle mesh slicing. The gap closing operation may reduce the final print " @@ -13790,11 +15635,11 @@ msgstr "" "fechamento de vão pode reduzir a resolução final de impressão, portanto, é " "aconselhável manter o valor razoavelmente baixo." -#: src/libslic3r/PrintConfig.cpp:2539 +#: src/libslic3r/PrintConfig.cpp:2571 msgid "Slicing Mode" msgstr "Modo de fatiamento" -#: src/libslic3r/PrintConfig.cpp:2541 +#: src/libslic3r/PrintConfig.cpp:2573 msgid "" "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " "close all holes in the model." @@ -13802,31 +15647,31 @@ msgstr "" "Use \"Par-ímpar\" para modelos de avião 3DLabPrint. Use \"Fechar orifícios\" " "para fechar todos os orifícios no modelo." -#: src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2575 msgid "Regular" msgstr "Regular" -#: src/libslic3r/PrintConfig.cpp:2547 +#: src/libslic3r/PrintConfig.cpp:2576 msgid "Even-odd" msgstr "Par-ímpar" -#: src/libslic3r/PrintConfig.cpp:2548 +#: src/libslic3r/PrintConfig.cpp:2577 msgid "Close holes" msgstr "Fechar orifícios" -#: src/libslic3r/PrintConfig.cpp:2553 +#: src/libslic3r/PrintConfig.cpp:2583 msgid "Generate support material" msgstr "Gerar material de suporte" -#: src/libslic3r/PrintConfig.cpp:2555 +#: src/libslic3r/PrintConfig.cpp:2585 msgid "Enable support material generation." msgstr "Habilitar geração de material de suporte." -#: src/libslic3r/PrintConfig.cpp:2559 +#: src/libslic3r/PrintConfig.cpp:2589 msgid "Auto generated supports" msgstr "Gerar suportes automaticamente" -#: src/libslic3r/PrintConfig.cpp:2561 +#: src/libslic3r/PrintConfig.cpp:2591 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " @@ -13836,11 +15681,11 @@ msgstr "" "limite de angulação. Se desmarcada, as sustentações serão geradas dentro dos " "volumes do \"reforçador de suporte\" somente." -#: src/libslic3r/PrintConfig.cpp:2567 +#: src/libslic3r/PrintConfig.cpp:2597 msgid "XY separation between an object and its support" msgstr "Separação entre o objeto e seu suporte em XY" -#: src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2599 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." @@ -13849,11 +15694,11 @@ msgstr "" "(por exemplo, 50%), será calculado com base na espessura do perímetro " "externo." -#: src/libslic3r/PrintConfig.cpp:2580 +#: src/libslic3r/PrintConfig.cpp:2610 msgid "Pattern angle" msgstr "Ângulo do padrão" -#: src/libslic3r/PrintConfig.cpp:2582 +#: src/libslic3r/PrintConfig.cpp:2612 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." @@ -13861,7 +15706,7 @@ msgstr "" "Use essa config. para girar o padrão de material de suporte no plano " "horizontal." -#: src/libslic3r/PrintConfig.cpp:2592 src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:2622 src/libslic3r/PrintConfig.cpp:3411 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -13869,11 +15714,11 @@ msgstr "" "Apenas criar suporte se ele está em uma mesa. Não crie suporte em uma " "impressão." -#: src/libslic3r/PrintConfig.cpp:2598 +#: src/libslic3r/PrintConfig.cpp:2627 msgid "Top contact Z distance" msgstr "Distância Z do contato superior" -#: src/libslic3r/PrintConfig.cpp:2600 +#: src/libslic3r/PrintConfig.cpp:2629 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " @@ -13883,23 +15728,23 @@ msgstr "" "Definir isso como 0 também impedirá PrusaSlicer de usar o fluxo de ponte e a " "velocidade para a primeira camada de objeto." -#: src/libslic3r/PrintConfig.cpp:2608 +#: src/libslic3r/PrintConfig.cpp:2635 msgid "0 (soluble)" msgstr "0 (solúvel)" -#: src/libslic3r/PrintConfig.cpp:2609 +#: src/libslic3r/PrintConfig.cpp:2636 msgid "0.1 (detachable)" msgstr "0.1 (destacável)" -#: src/libslic3r/PrintConfig.cpp:2610 +#: src/libslic3r/PrintConfig.cpp:2637 msgid "0.2 (detachable)" msgstr "0.2 (destacável)" -#: src/libslic3r/PrintConfig.cpp:2616 +#: src/libslic3r/PrintConfig.cpp:2643 msgid "Bottom contact Z distance" msgstr "Distância Z do contato inferior" -#: src/libslic3r/PrintConfig.cpp:2618 +#: src/libslic3r/PrintConfig.cpp:2645 msgid "" "The vertical distance between the object top surface and the support " "material interface. If set to zero, support_material_contact_distance will " @@ -13910,17 +15755,15 @@ msgstr "" "support_material_contact_distance será usado para distâncias Z de contato " "superior e inferior." -#. TRN To be shown in Print Settings "Bottom contact Z distance". Have to be as short as possible -#. TRN To be shown in Print Settings "Bottom interface layers". Have to be as short as possible -#: src/libslic3r/PrintConfig.cpp:2626 src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2651 src/libslic3r/PrintConfig.cpp:2732 msgid "Same as top" msgstr "Igual ao topo" -#: src/libslic3r/PrintConfig.cpp:2633 +#: src/libslic3r/PrintConfig.cpp:2659 msgid "Enforce support for the first" msgstr "Reforçar suportes para a(s) primeira(s)" -#: src/libslic3r/PrintConfig.cpp:2635 +#: src/libslic3r/PrintConfig.cpp:2661 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -13933,15 +15776,15 @@ msgstr "" "para obter mais aderência de objetos com uma pegada muito fina ou fraca na " "placa de construção." -#: src/libslic3r/PrintConfig.cpp:2640 +#: src/libslic3r/PrintConfig.cpp:2666 msgid "Enforce support for the first n layers" msgstr "Reforçar suportes na(s) primera(s) n camada(s)" -#: src/libslic3r/PrintConfig.cpp:2646 +#: src/libslic3r/PrintConfig.cpp:2672 msgid "Support material/raft/skirt extruder" msgstr "Extrusora de material de suporte/estrado/saia" -#: src/libslic3r/PrintConfig.cpp:2648 +#: src/libslic3r/PrintConfig.cpp:2674 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." @@ -13949,7 +15792,7 @@ msgstr "" "A extrusora a ser usada ao imprimir material de suporte, estrado e saia (1 " "+, 0 para usar a extrusora atual para minimizar as mudanças na ferramenta)." -#: src/libslic3r/PrintConfig.cpp:2657 +#: src/libslic3r/PrintConfig.cpp:2683 msgid "" "Set this to a non-zero value to set a manual extrusion width for support " "material. If left zero, default extrusion width will be used if set, " @@ -13962,22 +15805,22 @@ msgstr "" "expresso em porcentagem(por exemplo, 90%) Ele será calculado sobre a altura " "da camada." -#: src/libslic3r/PrintConfig.cpp:2667 +#: src/libslic3r/PrintConfig.cpp:2693 msgid "Interface loops" msgstr "Voltas da interface" -#: src/libslic3r/PrintConfig.cpp:2669 +#: src/libslic3r/PrintConfig.cpp:2695 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" "Cubra a camada de contato superior dos suportes com laços. Desativado por " "padrão." -#: src/libslic3r/PrintConfig.cpp:2674 +#: src/libslic3r/PrintConfig.cpp:2700 msgid "Support material/raft interface extruder" msgstr "Extrusora de material de suporte/estrado" -#: src/libslic3r/PrintConfig.cpp:2676 +#: src/libslic3r/PrintConfig.cpp:2702 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." @@ -13986,11 +15829,11 @@ msgstr "" "usar o extrusor atual para minimizar mudanças da ferramenta). Isso afeta o " "estrado também." -#: src/libslic3r/PrintConfig.cpp:2684 +#: src/libslic3r/PrintConfig.cpp:2709 msgid "Top interface layers" msgstr "Camadas de interface superiores" -#: src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2711 msgid "" "Number of interface layers to insert between the object(s) and support " "material." @@ -13998,27 +15841,27 @@ msgstr "" "Número de camadas de interface para inserir entre o objeto(s) e material de " "suporte." -#: src/libslic3r/PrintConfig.cpp:2693 +#: src/libslic3r/PrintConfig.cpp:2715 src/libslic3r/PrintConfig.cpp:2733 msgid "0 (off)" msgstr "0 (desligado)" -#: src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2716 src/libslic3r/PrintConfig.cpp:2734 msgid "1 (light)" msgstr "1 (leve)" -#: src/libslic3r/PrintConfig.cpp:2695 +#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2735 msgid "2 (default)" msgstr "2 (padrão)" -#: src/libslic3r/PrintConfig.cpp:2696 +#: src/libslic3r/PrintConfig.cpp:2718 src/libslic3r/PrintConfig.cpp:2736 msgid "3 (heavy)" msgstr "3 (pesado)" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:2724 msgid "Bottom interface layers" msgstr "Camadas de interface inferiores" -#: src/libslic3r/PrintConfig.cpp:2704 +#: src/libslic3r/PrintConfig.cpp:2726 msgid "" "Number of interface layers to insert between the object(s) and support " "material. Set to -1 to use support_material_interface_layers" @@ -14027,11 +15870,11 @@ msgstr "" "material de suporte. Defina como -1 para usar " "support_material_interface_layers" -#: src/libslic3r/PrintConfig.cpp:2717 +#: src/libslic3r/PrintConfig.cpp:2742 msgid "Closing radius" msgstr "Raio de fechamento" -#: src/libslic3r/PrintConfig.cpp:2719 +#: src/libslic3r/PrintConfig.cpp:2744 msgid "" "For snug supports, the support regions will be merged using morphological " "closing operation. Gaps smaller than the closing radius will be filled in." @@ -14040,17 +15883,21 @@ msgstr "" "operação de fechamento morfológico. Lacunas menores que o raio de fechamento " "será preenchido." -#: src/libslic3r/PrintConfig.cpp:2727 +#: src/libslic3r/PrintConfig.cpp:2752 msgid "Interface pattern spacing" msgstr "Espaçamento do padrão da interface" -#: src/libslic3r/PrintConfig.cpp:2729 +#: src/libslic3r/PrintConfig.cpp:2754 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" "Espaçamento entre as linhas de interface. Defina zero para obter uma " "interface sólida." -#: src/libslic3r/PrintConfig.cpp:2738 +#: src/libslic3r/PrintConfig.cpp:2761 +msgid "Support material interface" +msgstr "Interface do material de suporte" + +#: src/libslic3r/PrintConfig.cpp:2763 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " @@ -14060,23 +15907,23 @@ msgstr "" "expresso em porcentagem(por exemplo, 50%) Ele será calculado sobre a " "velocidade do material de suporte." -#: src/libslic3r/PrintConfig.cpp:2747 +#: src/libslic3r/PrintConfig.cpp:2772 msgid "Pattern" msgstr "Padrão" -#: src/libslic3r/PrintConfig.cpp:2749 +#: src/libslic3r/PrintConfig.cpp:2774 msgid "Pattern used to generate support material." msgstr "Padrão usado para gerar material de suporte." -#: src/libslic3r/PrintConfig.cpp:2755 +#: src/libslic3r/PrintConfig.cpp:2777 msgid "Rectilinear grid" msgstr "Grade rectilínea" -#: src/libslic3r/PrintConfig.cpp:2761 +#: src/libslic3r/PrintConfig.cpp:2784 msgid "Interface pattern" msgstr "Padrão de interface" -#: src/libslic3r/PrintConfig.cpp:2763 +#: src/libslic3r/PrintConfig.cpp:2786 msgid "" "Pattern used to generate support material interface. Default pattern for non-" "soluble support interface is Rectilinear, while default pattern for soluble " @@ -14086,23 +15933,19 @@ msgstr "" "para interface de suporte não solúvel é Rectilíneo, enquanto o padrão " "default para interface de suporte solúvel é Concêntrico." -#: src/libslic3r/PrintConfig.cpp:2777 +#: src/libslic3r/PrintConfig.cpp:2798 msgid "Pattern spacing" msgstr "Padrão de espaçamento" -#: src/libslic3r/PrintConfig.cpp:2779 +#: src/libslic3r/PrintConfig.cpp:2800 msgid "Spacing between support material lines." msgstr "Espaçamento entre linhas de material de suporte." -#: src/libslic3r/PrintConfig.cpp:2788 +#: src/libslic3r/PrintConfig.cpp:2809 msgid "Speed for printing support material." msgstr "Velocidade para imprimir material de suporte." -#: src/libslic3r/PrintConfig.cpp:2795 -msgid "Style" -msgstr "Estilo" - -#: src/libslic3r/PrintConfig.cpp:2797 +#: src/libslic3r/PrintConfig.cpp:2818 msgid "" "Style and shape of the support towers. Projecting the supports into a " "regular grid will create more stable supports, while snug support towers " @@ -14112,28 +15955,30 @@ msgstr "" "regular criará suportes mais estáveis, enquanto as torres de suporte " "confortáveis economizarão material e reduzirão as cicatrizes de objetos." -#: src/libslic3r/PrintConfig.cpp:2804 +#: src/libslic3r/PrintConfig.cpp:2823 msgid "Snug" msgstr "Confortável" -#: src/libslic3r/PrintConfig.cpp:2809 +#: src/libslic3r/PrintConfig.cpp:2824 +msgid "Organic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2830 msgid "Synchronize with object layers" msgstr "Sincronizar com camadas de objeto" -#: src/libslic3r/PrintConfig.cpp:2811 +#: src/libslic3r/PrintConfig.cpp:2832 msgid "" "Synchronize support layers with the object print layers. This is useful with " -"multi-material printers, where the extruder switch is expensive." +"multi-material printers, where the extruder switch is expensive. This option " +"is only available when top contact Z distance is set to zero." msgstr "" -"Sincronize camadas de suporte com as camadas de impressão do objeto. Isto é " -"útil com as impressoras do multi-material, onde o interruptor da extrusora é " -"caro." -#: src/libslic3r/PrintConfig.cpp:2817 +#: src/libslic3r/PrintConfig.cpp:2839 msgid "Overhang threshold" msgstr "Limite de angulação" -#: src/libslic3r/PrintConfig.cpp:2819 +#: src/libslic3r/PrintConfig.cpp:2841 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -14147,11 +15992,11 @@ msgstr "" "partir do plano horizontal) que você pode imprimir sem material de suporte. " "Defina como zero para detecção automática (recomendado)." -#: src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2853 msgid "With sheath around the support" msgstr "Com bainha em torno do apoio" -#: src/libslic3r/PrintConfig.cpp:2833 +#: src/libslic3r/PrintConfig.cpp:2855 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." @@ -14159,7 +16004,72 @@ msgstr "" "Adicione uma bainha (uma única linha de perímetro) em torno do suporte base. " "Isso torna o suporte mais confiável, mas também mais difícil de remover." -#: src/libslic3r/PrintConfig.cpp:2840 +#: src/libslic3r/PrintConfig.cpp:2861 +msgid "Maximum Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2863 +msgid "" +"The maximum angle of the branches, when the branches have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle to be able to have more reach." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2872 +msgid "Preferred Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2874 +msgid "" +"The preferred angle of the branches, when they do not have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle for branches to merge faster." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2883 +msgid "Tip Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2885 +msgid "The diameter of the top of the tip of the branches of organic support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2892 +msgid "Branch Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2894 +msgid "" +"The diameter of the thinnest branches of organic support. Thicker branches " +"are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2902 +msgid "Branch Diameter Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2904 +msgid "" +"The angle of the branches' diameter as they gradually become thicker towards " +"the bottom. An angle of 0 will cause the branches to have uniform thickness " +"over their length. A bit of an angle can increase stability of the organic " +"support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2914 +msgid "Branch Density" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2916 +msgid "" +"Adjusts the density of the support structure used to generate the tips of " +"the branches. A higher value results in better overhangs but the supports " +"are harder to remove, thus it is recommended to enable top support " +"interfaces instead of a high branch density value if dense interfaces are " +"needed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2928 msgid "" "Nozzle temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output G-code." @@ -14168,15 +16078,15 @@ msgstr "" "desabilitar os comandos de controle de temperatura da mesa na saída do G-" "code." -#: src/libslic3r/PrintConfig.cpp:2843 +#: src/libslic3r/PrintConfig.cpp:2931 msgid "Nozzle temperature" msgstr "Temperatura do Bico" -#: src/libslic3r/PrintConfig.cpp:2849 +#: src/libslic3r/PrintConfig.cpp:2937 msgid "Thick bridges" msgstr "Pontes grossas" -#: src/libslic3r/PrintConfig.cpp:2851 +#: src/libslic3r/PrintConfig.cpp:2939 msgid "" "If enabled, bridges are more reliable, can bridge longer distances, but may " "look worse. If disabled, bridges look better but are reliable just for " @@ -14186,11 +16096,11 @@ msgstr "" "maiores, mas podem parecer piores. Se desabilitadas, as pontes parecem " "melhores, mas são confiáveis apenas para distâncias de ponte mais curtas." -#: src/libslic3r/PrintConfig.cpp:2857 +#: src/libslic3r/PrintConfig.cpp:2945 msgid "Detect thin walls" msgstr "Detectar paredes finas" -#: src/libslic3r/PrintConfig.cpp:2859 +#: src/libslic3r/PrintConfig.cpp:2947 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." @@ -14198,11 +16108,11 @@ msgstr "" "Detecte paredes de largura única (partes onde duas extrusões não cabem e " "precisamos recolhê-las em um único traço)." -#: src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2953 msgid "Threads" msgstr "Roscas" -#: src/libslic3r/PrintConfig.cpp:2866 +#: src/libslic3r/PrintConfig.cpp:2954 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." @@ -14211,7 +16121,7 @@ msgstr "" "de tópicos ideais está ligeiramente acima do número de núcleos/processadores " "disponíveis." -#: src/libslic3r/PrintConfig.cpp:2878 +#: src/libslic3r/PrintConfig.cpp:2966 msgid "" "This custom code is inserted before every toolchange. Placeholder variables " "for all PrusaSlicer settings as well as {toolchange_z}, {previous_extruder} " @@ -14228,7 +16138,7 @@ msgstr "" "nenhum outro tal comando. Portanto, é possível criar scripts de " "comportamento personalizado antes e depois da troca de ferramentas." -#: src/libslic3r/PrintConfig.cpp:2891 +#: src/libslic3r/PrintConfig.cpp:2979 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "top surfaces. You may want to use thinner extrudates to fill all narrow " @@ -14244,7 +16154,7 @@ msgstr "" "Se expresso em porcentagem(por exemplo, 90%) Ele será calculado sobre a " "altura da camada." -#: src/libslic3r/PrintConfig.cpp:2904 +#: src/libslic3r/PrintConfig.cpp:2992 msgid "" "Speed for printing top solid layers (it only applies to the uppermost " "external layers and not to their internal solid layers). You may want to " @@ -14258,15 +16168,15 @@ msgstr "" "Isto pode ser expresso em porcentagem(por exemplo: 80%) sobre a velocidade " "de preenchimento sólido acima. Defina como zero para auto." -#: src/libslic3r/PrintConfig.cpp:2919 +#: src/libslic3r/PrintConfig.cpp:3007 msgid "Number of solid layers to generate on top surfaces." msgstr "Número de camadas sólidas para gerar em superfícies superiores." -#: src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3008 msgid "Top solid layers" msgstr "Camadas sólidas de topo" -#: src/libslic3r/PrintConfig.cpp:2928 +#: src/libslic3r/PrintConfig.cpp:3016 msgid "" "The number of top solid layers is increased above top_solid_layers if " "necessary to satisfy minimum thickness of top shell. This is useful to " @@ -14277,21 +16187,21 @@ msgstr "" "útil para evitar o efeito de travesseiro ao imprimir com altura de camada " "variável." -#: src/libslic3r/PrintConfig.cpp:2931 +#: src/libslic3r/PrintConfig.cpp:3019 msgid "Minimum top shell thickness" msgstr "Espessura mínima vertical da parede" -#: src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:3026 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "" "Velocidade para movimentos de deslocamento (saltos entre pontos de extrusão " "distantes)." -#: src/libslic3r/PrintConfig.cpp:2946 +#: src/libslic3r/PrintConfig.cpp:3034 msgid "Z travel" msgstr "Z deslocamento" -#: src/libslic3r/PrintConfig.cpp:2947 +#: src/libslic3r/PrintConfig.cpp:3035 msgid "" "Speed for movements along the Z axis.\n" "When set to zero, the value is ignored and regular travel speed is used " @@ -14301,11 +16211,11 @@ msgstr "" "Quando definido como zero, o valor é ignorado e a velocidade de deslocamento " "normal é usada." -#: src/libslic3r/PrintConfig.cpp:2955 +#: src/libslic3r/PrintConfig.cpp:3043 msgid "Use firmware retraction" msgstr "Usar retração do firmware" -#: src/libslic3r/PrintConfig.cpp:2956 +#: src/libslic3r/PrintConfig.cpp:3044 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." @@ -14313,11 +16223,11 @@ msgstr "" "Esta config. experimental usa comandos G10 e G11 para que o firmware " "manipule a retração. Isso só é suportado no recente Marlin." -#: src/libslic3r/PrintConfig.cpp:2962 +#: src/libslic3r/PrintConfig.cpp:3050 msgid "Use relative E distances" msgstr "Utilizar distâncias relativas do E" -#: src/libslic3r/PrintConfig.cpp:2963 +#: src/libslic3r/PrintConfig.cpp:3051 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." @@ -14325,11 +16235,11 @@ msgstr "" "Se o firmware necessitar de valores relativos E, verifique isto, caso " "contrário, deixe-o desmarcado. A maioria dos firmwares usa valores absolutos." -#: src/libslic3r/PrintConfig.cpp:2969 +#: src/libslic3r/PrintConfig.cpp:3057 msgid "Use volumetric E" msgstr "Usar E volumétrico" -#: src/libslic3r/PrintConfig.cpp:2970 +#: src/libslic3r/PrintConfig.cpp:3058 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -14345,11 +16255,11 @@ msgstr "" "do filamento associado ao filamento selecionado em Slic3r. Isso só é " "suportado no recente Marlin." -#: src/libslic3r/PrintConfig.cpp:2980 +#: src/libslic3r/PrintConfig.cpp:3068 msgid "Enable variable layer height feature" msgstr "Habilitar altura de camada variável" -#: src/libslic3r/PrintConfig.cpp:2981 +#: src/libslic3r/PrintConfig.cpp:3069 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." @@ -14357,11 +16267,11 @@ msgstr "" "Algumas impressoras ou config. de impressora podem ter dificuldades para " "imprimir com uma altura de camada variável. Ativado por padrão." -#: src/libslic3r/PrintConfig.cpp:2987 +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Wipe while retracting" msgstr "Limpe durante a retração" -#: src/libslic3r/PrintConfig.cpp:2988 +#: src/libslic3r/PrintConfig.cpp:3076 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." @@ -14369,7 +16279,7 @@ msgstr "" "Esta bandeira moverá a ponteira ao retrair para minimizar a bolha possível " "em extrusoras vazando." -#: src/libslic3r/PrintConfig.cpp:2995 +#: src/libslic3r/PrintConfig.cpp:3083 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." @@ -14378,11 +16288,11 @@ msgstr "" "alterações de ferramenta. EXTRUDE o excesso de material para a torre de " "limpeza." -#: src/libslic3r/PrintConfig.cpp:3001 +#: src/libslic3r/PrintConfig.cpp:3089 msgid "Purging volumes - load/unload volumes" msgstr "Volumes de purga-volumes de carga/descarregamento" -#: src/libslic3r/PrintConfig.cpp:3002 +#: src/libslic3r/PrintConfig.cpp:3090 msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " @@ -14392,11 +16302,11 @@ msgstr "" "usada na torre de limpeza. Esses valores são usados para simplificar a " "criação dos volumes de purga completos abaixo." -#: src/libslic3r/PrintConfig.cpp:3008 +#: src/libslic3r/PrintConfig.cpp:3096 msgid "Purging volumes - matrix" msgstr "Volumes de purga-matriz" -#: src/libslic3r/PrintConfig.cpp:3009 +#: src/libslic3r/PrintConfig.cpp:3097 msgid "" "This matrix describes volumes (in cubic milimetres) required to purge the " "new filament on the wipe tower for any given pair of tools." @@ -14404,43 +16314,47 @@ msgstr "" "Esta matriz descreve volumes (em milimetros cúbicos) necessários para limpar " "o novo filamento na torre de limpeza para qualquer dado par de ferramentas." -#: src/libslic3r/PrintConfig.cpp:3018 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Position X" msgstr "Posição X" -#: src/libslic3r/PrintConfig.cpp:3019 +#: src/libslic3r/PrintConfig.cpp:3107 msgid "X coordinate of the left front corner of a wipe tower" msgstr "Coordenada X do canto frontal esquerdo de uma torre de limpeza" -#: src/libslic3r/PrintConfig.cpp:3025 +#: src/libslic3r/PrintConfig.cpp:3113 msgid "Position Y" msgstr "Posição Y" -#: src/libslic3r/PrintConfig.cpp:3026 +#: src/libslic3r/PrintConfig.cpp:3114 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "Coordenada Y do canto dianteiro esquerdo de uma torre de limpeza" -#: src/libslic3r/PrintConfig.cpp:3033 +#: src/libslic3r/PrintConfig.cpp:3120 +msgid "Width" +msgstr "Espessura" + +#: src/libslic3r/PrintConfig.cpp:3121 msgid "Width of a wipe tower" msgstr "Largura de uma torre da limpeza" -#: src/libslic3r/PrintConfig.cpp:3039 +#: src/libslic3r/PrintConfig.cpp:3127 msgid "Wipe tower rotation angle" msgstr "Ângulo de rotação da torre" -#: src/libslic3r/PrintConfig.cpp:3040 +#: src/libslic3r/PrintConfig.cpp:3128 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "Ângulo de rotação da torre de limpeza em relação ao eixo X." -#: src/libslic3r/PrintConfig.cpp:3046 src/libslic3r/PrintConfig.cpp:3047 +#: src/libslic3r/PrintConfig.cpp:3134 src/libslic3r/PrintConfig.cpp:3135 msgid "Wipe tower brim width" msgstr "Largura da borda da torre de limpeza" -#: src/libslic3r/PrintConfig.cpp:3055 +#: src/libslic3r/PrintConfig.cpp:3143 msgid "Wipe into this object's infill" msgstr "Limpe no preenchimento deste objeto" -#: src/libslic3r/PrintConfig.cpp:3056 +#: src/libslic3r/PrintConfig.cpp:3144 msgid "" "Purging after toolchange will be done inside this object's infills. This " "lowers the amount of waste but may result in longer print time due to " @@ -14450,11 +16364,11 @@ msgstr "" "deste objeto. Isso reduz a quantidade de resíduos, mas pode resultar em " "maior tempo de impressão devido a movimentos de deslocamento adicionais." -#: src/libslic3r/PrintConfig.cpp:3063 +#: src/libslic3r/PrintConfig.cpp:3151 msgid "Wipe into this object" msgstr "Limpar neste objeto" -#: src/libslic3r/PrintConfig.cpp:3064 +#: src/libslic3r/PrintConfig.cpp:3152 msgid "" "Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " @@ -14464,20 +16378,20 @@ msgstr "" "salvar o material que de outra forma acabaria na torre de limpeza e diminuir " "o tempo de impressão. As cores dos objetos serão misturadas como resultado." -#: src/libslic3r/PrintConfig.cpp:3070 +#: src/libslic3r/PrintConfig.cpp:3158 msgid "Maximal bridging distance" msgstr "Distância de ponte máxima" -#: src/libslic3r/PrintConfig.cpp:3071 +#: src/libslic3r/PrintConfig.cpp:3159 msgid "Maximal distance between supports on sparse infill sections." msgstr "" "Distância máxima entre as sustentações em seções preenchimento esparsas." -#: src/libslic3r/PrintConfig.cpp:3077 +#: src/libslic3r/PrintConfig.cpp:3165 msgid "XY Size Compensation" msgstr "Compensação de tamanho em XY" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3167 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" @@ -14487,11 +16401,11 @@ msgstr "" "(negativo = para dentro, positivo = para fora). Isso pode ser útil para " "ajustar os tamanhos dos furos." -#: src/libslic3r/PrintConfig.cpp:3087 +#: src/libslic3r/PrintConfig.cpp:3175 msgid "Z offset" msgstr "Compensação do Z" -#: src/libslic3r/PrintConfig.cpp:3088 +#: src/libslic3r/PrintConfig.cpp:3176 msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " "output G-code. It is used to compensate for bad Z endstop position: for " @@ -14504,11 +16418,11 @@ msgstr "" "mm longe da mesa de impressão, defina este para-0,3 (ou corrigir o seu final " "de curso)." -#: src/libslic3r/PrintConfig.cpp:3097 +#: src/libslic3r/PrintConfig.cpp:3185 msgid "Perimeter generator" msgstr "Gerador de perímetro" -#: src/libslic3r/PrintConfig.cpp:3099 +#: src/libslic3r/PrintConfig.cpp:3187 msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " @@ -14516,19 +16430,19 @@ msgid "" "Concentric infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3192 msgid "Classic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3107 +#: src/libslic3r/PrintConfig.cpp:3193 msgid "Arachne" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3199 msgid "Perimeter transition length" msgstr "Comprimento de transição do perímetro" -#: src/libslic3r/PrintConfig.cpp:3114 +#: src/libslic3r/PrintConfig.cpp:3201 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " @@ -14536,11 +16450,11 @@ msgid "" "be computed based on the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3123 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Perimeter transitioning filter margin" msgstr "Margem do filtro de transição de perímetro" -#: src/libslic3r/PrintConfig.cpp:3125 +#: src/libslic3r/PrintConfig.cpp:3212 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -14560,11 +16474,11 @@ msgstr "" "superextrusão. Se expresso em porcentagem (por exemplo 25%), será calculado " "com base no diâmetro do bocal." -#: src/libslic3r/PrintConfig.cpp:3138 +#: src/libslic3r/PrintConfig.cpp:3225 msgid "Perimeter transitioning threshold angle" msgstr "Ângulo limite de transição de perímetro" -#: src/libslic3r/PrintConfig.cpp:3140 +#: src/libslic3r/PrintConfig.cpp:3227 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -14578,11 +16492,11 @@ msgstr "" "Reduzir essa configuração reduz o número e o comprimento desses perímetros " "centrais, mas pode deixar lacunas ou overextrude." -#: src/libslic3r/PrintConfig.cpp:3151 +#: src/libslic3r/PrintConfig.cpp:3238 msgid "Perimeter distribution count" msgstr "Contagem de distribuição de perímetro" -#: src/libslic3r/PrintConfig.cpp:3153 +#: src/libslic3r/PrintConfig.cpp:3240 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " @@ -14592,11 +16506,11 @@ msgstr "" "variação precisa ser espalhada. Valores mais baixos significa que os " "perímetros externos não mudam de largura." -#: src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3247 msgid "Minimum feature size" msgstr "Tamanho mínimo do recurso" -#: src/libslic3r/PrintConfig.cpp:3162 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " @@ -14605,11 +16519,11 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3172 +#: src/libslic3r/PrintConfig.cpp:3259 msgid "Minimum perimeter width" msgstr "Largura mínima do perímetro" -#: src/libslic3r/PrintConfig.cpp:3174 +#: src/libslic3r/PrintConfig.cpp:3261 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -14617,69 +16531,240 @@ msgid "" "thick as the feature itself. If expressed as a percentage (for example 85%), " "it will be computed based on the nozzle diameter." msgstr "" -"Largura do perímetro que substituirá os recursos finos (de acordo com o " -"tamanho mínimo do recurso) do modelo.Se a largura mínima do perímetro for " -"mais fina que a espessura do recurso, o perímetro se tornará espesso como o " -"próprio recurso. Se expresso em porcentagem (por exemplo, 85%), será " -"calculado com base no diâmetro do bocal." +"Largura do perímetro que substituirá os recursos finos (de acordo com o " +"tamanho mínimo do recurso) do modelo.Se a largura mínima do perímetro for " +"mais fina que a espessura do recurso, o perímetro se tornará espesso como o " +"próprio recurso. Se expresso em porcentagem (por exemplo, 85%), será " +"calculado com base no diâmetro do bocal." + +#: src/libslic3r/PrintConfig.cpp:3327 +msgid "Pinhead front diameter" +msgstr "Diâmetro dianteiro principal da sustentação" + +#: src/libslic3r/PrintConfig.cpp:3329 +msgid "Diameter of the pointing side of the head" +msgstr "Diâmetro do lado apontando da cabeça" + +#: src/libslic3r/PrintConfig.cpp:3336 +msgid "Head penetration" +msgstr "Penetração inválida da cabeça" + +#: src/libslic3r/PrintConfig.cpp:3338 +msgid "How much the pinhead has to penetrate the model surface" +msgstr "Quanto a cabeça de alfinete tem de penetrar na superfície do modelo" + +#: src/libslic3r/PrintConfig.cpp:3345 +msgid "Pinhead width" +msgstr "Largura da cabeça de suporte" + +#: src/libslic3r/PrintConfig.cpp:3347 +msgid "Width from the back sphere center to the front sphere center" +msgstr "Largura do centro da esfera traseira ao centro da esfera dianteira" + +#: src/libslic3r/PrintConfig.cpp:3355 +msgid "Pillar diameter" +msgstr "Diâmetro do pilar do suporte" + +#: src/libslic3r/PrintConfig.cpp:3357 +msgid "Diameter in mm of the support pillars" +msgstr "Diâmetro em mm dos pilares de suporte" + +#: src/libslic3r/PrintConfig.cpp:3365 +msgid "Small pillar diameter percent" +msgstr "Diâmetro do pilar do suporte" + +#: src/libslic3r/PrintConfig.cpp:3367 +msgid "" +"The percentage of smaller pillars compared to the normal pillar diameter " +"which are used in problematic areas where a normal pilla cannot fit." +msgstr "" +"A porcentagem de pilares menores em comparação com o diâmetro de pilar " +"normal que são usados ​​em áreas problemáticas onde um pilar normal não pode " +"caber." + +#: src/libslic3r/PrintConfig.cpp:3376 +msgid "Max bridges on a pillar" +msgstr "Distância máxima de conexão entre pilares" + +#: src/libslic3r/PrintConfig.cpp:3378 +msgid "" +"Maximum number of bridges that can be placed on a pillar. Bridges hold " +"support point pinheads and connect to pillars as small branches." +msgstr "" +"Número máximo de pontes que podem ser colocadas em um pilar. As pontes " +"seguram pinças de ponto de apoio e se conectam a pilares como pequenos ramos." + +#: src/libslic3r/PrintConfig.cpp:3386 +msgid "Max weight on model" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3389 +msgid "" +"Maximum weight of sub-trees that terminate on the model instead of the print " +"bed. The weight is the sum of the lenghts of all branches emanating from the " +"endpoint." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3397 +msgid "Pillar connection mode" +msgstr "Modalidade da conexão da coluna da sustentação" + +#: src/libslic3r/PrintConfig.cpp:3398 +msgid "" +"Controls the bridge type between two neighboring pillars. Can be zig-zag, " +"cross (double zig-zag) or dynamic which will automatically switch between " +"the first two depending on the distance of the two pillars." +msgstr "" +"Controla o tipo de ponte entre dois pilares vizinhos. Pode ser zig-zag, Cruz " +"(zig-zag dobro) ou dinâmico que comutará automaticamente entre os primeiros " +"dois dependendo da distância dos dois pilares." + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Zig-Zag" +msgstr "Zig-Zag" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Cross" +msgstr "Cruz" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Dynamic" +msgstr "Dinâmico" + +#: src/libslic3r/PrintConfig.cpp:3416 +msgid "Pillar widening factor" +msgstr "Fator de alargamento da coluna" + +#: src/libslic3r/PrintConfig.cpp:3420 +msgid "" +"Merging bridges or pillars into another pillars can increase the radius. " +"Zero means no increase, one means full increase. The exact amount of " +"increase is unspecified and can change in the future." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3431 +msgid "Support base diameter" +msgstr "Diâmetro base do suporte" + +#: src/libslic3r/PrintConfig.cpp:3433 +msgid "Diameter in mm of the pillar base" +msgstr "Diâmetro em mm da base do pilar" + +#: src/libslic3r/PrintConfig.cpp:3441 +msgid "Support base height" +msgstr "Altura base do suporte" + +#: src/libslic3r/PrintConfig.cpp:3443 +msgid "The height of the pillar base cone" +msgstr "A altura do cone da base da coluna" + +#: src/libslic3r/PrintConfig.cpp:3450 +msgid "Support base safety distance" +msgstr "Distância da segurança da base da sustentação" + +#: src/libslic3r/PrintConfig.cpp:3453 +msgid "" +"The minimum distance of the pillar base from the model in mm. Makes sense in " +"zero elevation mode where a gap according to this parameter is inserted " +"between the model and the pad." +msgstr "" +"A distância mínima da base do pilar do modelo em mm. faz sentido no modo de " +"elevação zero, onde uma lacuna de acordo com este parâmetro é inserida entre " +"o modelo e o pad." + +#: src/libslic3r/PrintConfig.cpp:3463 +msgid "Critical angle" +msgstr "Ângulo crítico" + +#: src/libslic3r/PrintConfig.cpp:3465 +msgid "The default angle for connecting support sticks and junctions." +msgstr "O ângulo padrão para conectar suportes e junções." + +#: src/libslic3r/PrintConfig.cpp:3473 +msgid "Max bridge length" +msgstr "Comprimento máximo da ponte" + +#: src/libslic3r/PrintConfig.cpp:3475 +msgid "The max length of a bridge" +msgstr "O comprimento máximo de uma ponte" + +#: src/libslic3r/PrintConfig.cpp:3487 +msgid "Max pillar linking distance" +msgstr "Distância máxima de conexão entre pilares" + +#: src/libslic3r/PrintConfig.cpp:3489 +msgid "" +"The max distance of two pillars to get linked with each other. A zero value " +"will prohibit pillar cascading." +msgstr "" +"A distância máxima de dois pilares para ficar ligado uns com os outros. Um " +"valor zero irá proibir o pilar em cascata." + +#: src/libslic3r/PrintConfig.cpp:3499 +msgid "" +"How much the supports should lift up the supported object. If \"Pad around " +"object\" is enabled, this value is ignored." +msgstr "" +"Quanto os suportes devem levantar o objecto suportado. Se \"pad em torno do " +"objeto\" estiver habilitado, esse valor será ignorado." -#: src/libslic3r/PrintConfig.cpp:3242 +#: src/libslic3r/PrintConfig.cpp:3515 msgid "Display width" msgstr "Largura do display" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3516 msgid "Width of the display" msgstr "Largura do display" -#: src/libslic3r/PrintConfig.cpp:3248 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "Display height" msgstr "Altura do display" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3522 msgid "Height of the display" msgstr "Altura do display" -#: src/libslic3r/PrintConfig.cpp:3254 +#: src/libslic3r/PrintConfig.cpp:3527 msgid "Number of pixels in" msgstr "Número de pixels em" -#: src/libslic3r/PrintConfig.cpp:3256 +#: src/libslic3r/PrintConfig.cpp:3529 msgid "Number of pixels in X" msgstr "Número de pixels em X" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3535 msgid "Number of pixels in Y" msgstr "Número de pixels em Y" -#: src/libslic3r/PrintConfig.cpp:3267 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Display horizontal mirroring" msgstr "Exibir espelhamento horizontal" -#: src/libslic3r/PrintConfig.cpp:3268 +#: src/libslic3r/PrintConfig.cpp:3541 msgid "Mirror horizontally" msgstr "Espelhar horizontalmente" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3542 msgid "Enable horizontal mirroring of output images" msgstr "Habilitar espelhamento horizontal de imagens de saída" -#: src/libslic3r/PrintConfig.cpp:3274 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Display vertical mirroring" msgstr "Exibir espelhamento vertical" -#: src/libslic3r/PrintConfig.cpp:3275 +#: src/libslic3r/PrintConfig.cpp:3548 msgid "Mirror vertically" msgstr "Espelharvertical" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "Enable vertical mirroring of output images" msgstr "Habilitar espelhamento vertical de imagens de saída" -#: src/libslic3r/PrintConfig.cpp:3281 +#: src/libslic3r/PrintConfig.cpp:3554 msgid "Display orientation" msgstr "Orientação do display" -#: src/libslic3r/PrintConfig.cpp:3282 +#: src/libslic3r/PrintConfig.cpp:3555 msgid "" "Set the actual LCD display orientation inside the SLA printer. Portrait mode " "will flip the meaning of display width and height parameters and the output " @@ -14689,55 +16774,55 @@ msgstr "" "retrato inverterá o significado dos parâmetros de largura e altura da tela e " "as imagens de saída serão giradas por 90 graus." -#: src/libslic3r/PrintConfig.cpp:3288 +#: src/libslic3r/PrintConfig.cpp:3559 msgid "Landscape" msgstr "Paisagem" -#: src/libslic3r/PrintConfig.cpp:3289 +#: src/libslic3r/PrintConfig.cpp:3560 msgid "Portrait" msgstr "Retrato" -#: src/libslic3r/PrintConfig.cpp:3294 src/libslic3r/PrintConfig.cpp:3929 +#: src/libslic3r/PrintConfig.cpp:3566 src/libslic3r/PrintConfig.cpp:4058 msgid "Fast" msgstr "Rápido" -#: src/libslic3r/PrintConfig.cpp:3295 +#: src/libslic3r/PrintConfig.cpp:3567 msgid "Fast tilt" msgstr "Inclinação rápida" -#: src/libslic3r/PrintConfig.cpp:3296 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Time of the fast tilt" msgstr "Tempo da inclinação rápida" -#: src/libslic3r/PrintConfig.cpp:3303 src/libslic3r/PrintConfig.cpp:3928 +#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:4057 msgid "Slow" msgstr "Lento" -#: src/libslic3r/PrintConfig.cpp:3304 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Slow tilt" msgstr "Inclinação lenta" -#: src/libslic3r/PrintConfig.cpp:3305 +#: src/libslic3r/PrintConfig.cpp:3577 msgid "Time of the slow tilt" msgstr "Tempo da inclinação lenta" -#: src/libslic3r/PrintConfig.cpp:3312 src/libslic3r/PrintConfig.cpp:3930 +#: src/libslic3r/PrintConfig.cpp:3584 src/libslic3r/PrintConfig.cpp:4059 msgid "High viscosity" msgstr "Alta viscosidade" -#: src/libslic3r/PrintConfig.cpp:3313 +#: src/libslic3r/PrintConfig.cpp:3585 msgid "Tilt for high viscosity resin" msgstr "Inclinação para resina de alta viscosidade" -#: src/libslic3r/PrintConfig.cpp:3314 +#: src/libslic3r/PrintConfig.cpp:3586 msgid "Time of the super slow tilt" msgstr "Tempo da inclinação super lenta" -#: src/libslic3r/PrintConfig.cpp:3321 +#: src/libslic3r/PrintConfig.cpp:3593 msgid "Area fill" msgstr "Preenchimento de área" -#: src/libslic3r/PrintConfig.cpp:3322 +#: src/libslic3r/PrintConfig.cpp:3594 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -14748,40 +16833,40 @@ msgstr "" "em seguida, uma inclinação lenta será usada, caso contrário-uma inclinação " "rápida" -#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 -#: src/libslic3r/PrintConfig.cpp:3331 +#: src/libslic3r/PrintConfig.cpp:3601 src/libslic3r/PrintConfig.cpp:3602 +#: src/libslic3r/PrintConfig.cpp:3603 msgid "Printer scaling correction" msgstr "Correção de dimensionamento da impressora" -#: src/libslic3r/PrintConfig.cpp:3337 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3609 src/libslic3r/PrintConfig.cpp:3611 msgid "Printer scaling correction in X axis" msgstr "Correção de dimensionamento da impressora no eixo X" -#: src/libslic3r/PrintConfig.cpp:3338 +#: src/libslic3r/PrintConfig.cpp:3610 msgid "Printer scaling X axis correction" msgstr "Correção do eixo X da escala da impressora" -#: src/libslic3r/PrintConfig.cpp:3345 src/libslic3r/PrintConfig.cpp:3347 +#: src/libslic3r/PrintConfig.cpp:3617 src/libslic3r/PrintConfig.cpp:3619 msgid "Printer scaling correction in Y axis" msgstr "Correção de dimensionamento da impressora no eixo Y" -#: src/libslic3r/PrintConfig.cpp:3346 +#: src/libslic3r/PrintConfig.cpp:3618 msgid "Printer scaling Y axis correction" msgstr "Correção do eixo Y da escala da impressora" -#: src/libslic3r/PrintConfig.cpp:3353 src/libslic3r/PrintConfig.cpp:3355 +#: src/libslic3r/PrintConfig.cpp:3625 src/libslic3r/PrintConfig.cpp:3627 msgid "Printer scaling correction in Z axis" msgstr "Correção de dimensionamento da impressora no eixo Z" -#: src/libslic3r/PrintConfig.cpp:3354 +#: src/libslic3r/PrintConfig.cpp:3626 msgid "Printer scaling Z axis correction" msgstr "Correção do eixo Z de dimensionamento da impressora" -#: src/libslic3r/PrintConfig.cpp:3361 src/libslic3r/PrintConfig.cpp:3362 +#: src/libslic3r/PrintConfig.cpp:3633 src/libslic3r/PrintConfig.cpp:3634 msgid "Printer absolute correction" msgstr "Correção absoluta da impressora" -#: src/libslic3r/PrintConfig.cpp:3363 +#: src/libslic3r/PrintConfig.cpp:3635 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." @@ -14789,22 +16874,22 @@ msgstr "" "Irá inflar ou esvaziar os polígonos 2D cortados de acordo com o sinal da " "correção." -#: src/libslic3r/PrintConfig.cpp:3369 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Elephant foot minimum width" msgstr "Largura mínima do pé de elefante" -#: src/libslic3r/PrintConfig.cpp:3371 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" "Largura mínima de características para manter ao fazer compensação do pé de " "elefante." -#: src/libslic3r/PrintConfig.cpp:3378 src/libslic3r/PrintConfig.cpp:3379 +#: src/libslic3r/PrintConfig.cpp:3650 src/libslic3r/PrintConfig.cpp:3651 msgid "Printer gamma correction" msgstr "Correção de gama de impressora" -#: src/libslic3r/PrintConfig.cpp:3380 +#: src/libslic3r/PrintConfig.cpp:3652 msgid "" "This will apply a gamma correction to the rasterized 2D polygons. A gamma " "value of zero means thresholding with the threshold in the middle. This " @@ -14814,43 +16899,53 @@ msgstr "" "valor gama de zero significa limiarização com o limiar no meio. Este " "comportamento elimina suavização sem perder buracos em polígonos." -#: src/libslic3r/PrintConfig.cpp:3399 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3671 src/libslic3r/PrintConfig.cpp:3672 msgid "SLA material type" msgstr "Tipo de Material de SLA" -#: src/libslic3r/PrintConfig.cpp:3411 src/libslic3r/PrintConfig.cpp:3412 +#: src/libslic3r/PrintConfig.cpp:3679 src/libslic3r/PrintConfig.cpp:3680 msgid "Initial layer height" msgstr "Altura da camada inicial" -#: src/libslic3r/PrintConfig.cpp:3418 src/libslic3r/PrintConfig.cpp:3419 +#: src/libslic3r/PrintConfig.cpp:3686 +msgid "Idle temperature" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3687 +msgid "" +"Nozzle temperature when the tool is currently not used in multi-tool setups." +"This is only used when 'Ooze prevention' is active in Print Settings." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3695 src/libslic3r/PrintConfig.cpp:3696 msgid "Bottle volume" msgstr "Volume do pote" -#: src/libslic3r/PrintConfig.cpp:3420 +#: src/libslic3r/PrintConfig.cpp:3697 msgid "ml" msgstr "ml" -#: src/libslic3r/PrintConfig.cpp:3425 src/libslic3r/PrintConfig.cpp:3426 +#: src/libslic3r/PrintConfig.cpp:3702 src/libslic3r/PrintConfig.cpp:3703 msgid "Bottle weight" msgstr "Peso do pote" -#: src/libslic3r/PrintConfig.cpp:3427 +#: src/libslic3r/PrintConfig.cpp:3704 msgid "kg" msgstr "kg" -#: src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "g/ml" msgstr "g/ml" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3718 msgid "money/bottle" msgstr "dinheiro/pote" -#: src/libslic3r/PrintConfig.cpp:3446 +#: src/libslic3r/PrintConfig.cpp:3723 msgid "Faded layers" msgstr "Camadas desbotadas" -#: src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3724 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" @@ -14858,261 +16953,120 @@ msgstr "" "Número de camadas necessárias para o tempo de exposição desvanecer-se do " "tempo de exposição inicial ao tempo de exposição" -#: src/libslic3r/PrintConfig.cpp:3454 src/libslic3r/PrintConfig.cpp:3455 +#: src/libslic3r/PrintConfig.cpp:3731 src/libslic3r/PrintConfig.cpp:3732 msgid "Minimum exposure time" msgstr "Tempo mínimo de exposição" -#: src/libslic3r/PrintConfig.cpp:3462 src/libslic3r/PrintConfig.cpp:3463 +#: src/libslic3r/PrintConfig.cpp:3739 src/libslic3r/PrintConfig.cpp:3740 msgid "Maximum exposure time" msgstr "Tempo máximo de exposição" -#: src/libslic3r/PrintConfig.cpp:3470 src/libslic3r/PrintConfig.cpp:3471 +#: src/libslic3r/PrintConfig.cpp:3747 src/libslic3r/PrintConfig.cpp:3748 msgid "Exposure time" msgstr "Tempo de exposição" -#: src/libslic3r/PrintConfig.cpp:3477 src/libslic3r/PrintConfig.cpp:3478 +#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3755 msgid "Minimum initial exposure time" msgstr "Tempo inicial mínimo de exposição" -#: src/libslic3r/PrintConfig.cpp:3485 src/libslic3r/PrintConfig.cpp:3486 +#: src/libslic3r/PrintConfig.cpp:3762 src/libslic3r/PrintConfig.cpp:3763 msgid "Maximum initial exposure time" msgstr "Tempo inicial máximo de exposição" -#: src/libslic3r/PrintConfig.cpp:3493 src/libslic3r/PrintConfig.cpp:3494 +#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3771 msgid "Initial exposure time" msgstr "Tempo inicial mínimo de exposição" -#: src/libslic3r/PrintConfig.cpp:3500 src/libslic3r/PrintConfig.cpp:3501 +#: src/libslic3r/PrintConfig.cpp:3777 src/libslic3r/PrintConfig.cpp:3778 msgid "Correction for expansion" msgstr "Correção para expansão" -#: src/libslic3r/PrintConfig.cpp:3507 src/libslic3r/PrintConfig.cpp:3508 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3785 msgid "Correction for expansion in X axis" msgstr "Correção para expansão no eixo X" -#: src/libslic3r/PrintConfig.cpp:3514 src/libslic3r/PrintConfig.cpp:3515 +#: src/libslic3r/PrintConfig.cpp:3791 src/libslic3r/PrintConfig.cpp:3792 msgid "Correction for expansion in Y axis" msgstr "Correção para expansão no eixo Y" -#: src/libslic3r/PrintConfig.cpp:3521 src/libslic3r/PrintConfig.cpp:3522 +#: src/libslic3r/PrintConfig.cpp:3798 src/libslic3r/PrintConfig.cpp:3799 msgid "Correction for expansion in Z axis" msgstr "Correção para expansão no eixo Z" -#: src/libslic3r/PrintConfig.cpp:3528 +#: src/libslic3r/PrintConfig.cpp:3805 msgid "SLA print material notes" msgstr "Notas de material de impressão de SLA" -#: src/libslic3r/PrintConfig.cpp:3529 +#: src/libslic3r/PrintConfig.cpp:3806 msgid "You can put your notes regarding the SLA print material here." msgstr "" "Você pode colocar suas anotações sobre o material de impressão de SLA aqui." -#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3552 +#: src/libslic3r/PrintConfig.cpp:3818 src/libslic3r/PrintConfig.cpp:3829 msgid "Default SLA material profile" msgstr "Perfil de material de SLA padrão" -#: src/libslic3r/PrintConfig.cpp:3563 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "Generate supports" msgstr "Gerar suportes" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3842 msgid "Generate supports for the models" msgstr "Gere suportes para os modelos" -#: src/libslic3r/PrintConfig.cpp:3570 -msgid "Pinhead front diameter" -msgstr "Diâmetro dianteiro principal da sustentação" - -#: src/libslic3r/PrintConfig.cpp:3572 -msgid "Diameter of the pointing side of the head" -msgstr "Diâmetro do lado apontando da cabeça" - -#: src/libslic3r/PrintConfig.cpp:3579 -msgid "Head penetration" -msgstr "Penetração inválida da cabeça" - -#: src/libslic3r/PrintConfig.cpp:3581 -msgid "How much the pinhead has to penetrate the model surface" -msgstr "Quanto a cabeça de alfinete tem de penetrar na superfície do modelo" - -#: src/libslic3r/PrintConfig.cpp:3588 -msgid "Pinhead width" -msgstr "Largura da cabeça de suporte" - -#: src/libslic3r/PrintConfig.cpp:3590 -msgid "Width from the back sphere center to the front sphere center" -msgstr "Largura do centro da esfera traseira ao centro da esfera dianteira" - -#: src/libslic3r/PrintConfig.cpp:3598 -msgid "Pillar diameter" -msgstr "Diâmetro do pilar do suporte" - -#: src/libslic3r/PrintConfig.cpp:3600 -msgid "Diameter in mm of the support pillars" -msgstr "Diâmetro em mm dos pilares de suporte" - -#: src/libslic3r/PrintConfig.cpp:3608 -msgid "Small pillar diameter percent" -msgstr "Diâmetro do pilar do suporte" - -#: src/libslic3r/PrintConfig.cpp:3610 -msgid "" -"The percentage of smaller pillars compared to the normal pillar diameter " -"which are used in problematic areas where a normal pilla cannot fit." -msgstr "" -"A porcentagem de pilares menores em comparação com o diâmetro de pilar " -"normal que são usados ​​em áreas problemáticas onde um pilar normal não pode " -"caber." - -#: src/libslic3r/PrintConfig.cpp:3619 -msgid "Max bridges on a pillar" -msgstr "Distância máxima de conexão entre pilares" - -#: src/libslic3r/PrintConfig.cpp:3621 -msgid "" -"Maximum number of bridges that can be placed on a pillar. Bridges hold " -"support point pinheads and connect to pillars as small branches." -msgstr "" -"Número máximo de pontes que podem ser colocadas em um pilar. As pontes " -"seguram pinças de ponto de apoio e se conectam a pilares como pequenos ramos." - -#: src/libslic3r/PrintConfig.cpp:3629 -msgid "Pillar connection mode" -msgstr "Modalidade da conexão da coluna da sustentação" - -#: src/libslic3r/PrintConfig.cpp:3630 -msgid "" -"Controls the bridge type between two neighboring pillars. Can be zig-zag, " -"cross (double zig-zag) or dynamic which will automatically switch between " -"the first two depending on the distance of the two pillars." +#: src/libslic3r/PrintConfig.cpp:3847 +msgid "Support tree type" msgstr "" -"Controla o tipo de ponte entre dois pilares vizinhos. Pode ser zig-zag, Cruz " -"(zig-zag dobro) ou dinâmico que comutará automaticamente entre os primeiros " -"dois dependendo da distância dos dois pilares." - -#: src/libslic3r/PrintConfig.cpp:3638 -msgid "Zig-Zag" -msgstr "Zig-Zag" - -#: src/libslic3r/PrintConfig.cpp:3639 -msgid "Cross" -msgstr "Cruz" - -#: src/libslic3r/PrintConfig.cpp:3640 -msgid "Dynamic" -msgstr "Dinâmico" - -#: src/libslic3r/PrintConfig.cpp:3652 -msgid "Pillar widening factor" -msgstr "Fator de alargamento da coluna" -#: src/libslic3r/PrintConfig.cpp:3654 -msgid "" -"Merging bridges or pillars into another pillars can increase the radius. " -"Zero means no increase, one means full increase." +#: src/libslic3r/PrintConfig.cpp:3848 +msgid "Support tree building strategy" msgstr "" -"Mesclar pontes ou pilares em outros pilares pode aumentar o raio. Zero " -"significa que não há aumento, um significa aumento total." - -#: src/libslic3r/PrintConfig.cpp:3663 -msgid "Support base diameter" -msgstr "Diâmetro base do suporte" - -#: src/libslic3r/PrintConfig.cpp:3665 -msgid "Diameter in mm of the pillar base" -msgstr "Diâmetro em mm da base do pilar" - -#: src/libslic3r/PrintConfig.cpp:3673 -msgid "Support base height" -msgstr "Altura base do suporte" - -#: src/libslic3r/PrintConfig.cpp:3675 -msgid "The height of the pillar base cone" -msgstr "A altura do cone da base da coluna" -#: src/libslic3r/PrintConfig.cpp:3682 -msgid "Support base safety distance" -msgstr "Distância da segurança da base da sustentação" - -#: src/libslic3r/PrintConfig.cpp:3685 -msgid "" -"The minimum distance of the pillar base from the model in mm. Makes sense in " -"zero elevation mode where a gap according to this parameter is inserted " -"between the model and the pad." +#: src/libslic3r/PrintConfig.cpp:3851 +msgid "Branching (experimental)" msgstr "" -"A distância mínima da base do pilar do modelo em mm. faz sentido no modo de " -"elevação zero, onde uma lacuna de acordo com este parâmetro é inserida entre " -"o modelo e o pad." - -#: src/libslic3r/PrintConfig.cpp:3695 -msgid "Critical angle" -msgstr "Ângulo crítico" - -#: src/libslic3r/PrintConfig.cpp:3697 -msgid "The default angle for connecting support sticks and junctions." -msgstr "O ângulo padrão para conectar suportes e junções." - -#: src/libslic3r/PrintConfig.cpp:3705 -msgid "Max bridge length" -msgstr "Comprimento máximo da ponte" - -#: src/libslic3r/PrintConfig.cpp:3707 -msgid "The max length of a bridge" -msgstr "O comprimento máximo de uma ponte" -#: src/libslic3r/PrintConfig.cpp:3714 -msgid "Max pillar linking distance" -msgstr "Distância máxima de conexão entre pilares" - -#: src/libslic3r/PrintConfig.cpp:3716 -msgid "" -"The max distance of two pillars to get linked with each other. A zero value " -"will prohibit pillar cascading." +#: src/libslic3r/PrintConfig.cpp:3860 +msgid "Support only in enforced regions" msgstr "" -"A distância máxima de dois pilares para ficar ligado uns com os outros. Um " -"valor zero irá proibir o pilar em cascata." -#: src/libslic3r/PrintConfig.cpp:3726 -msgid "" -"How much the supports should lift up the supported object. If \"Pad around " -"object\" is enabled, this value is ignored." +#: src/libslic3r/PrintConfig.cpp:3862 +msgid "Only create support if it lies in a support enforcer." msgstr "" -"Quanto os suportes devem levantar o objecto suportado. Se \"pad em torno do " -"objeto\" estiver habilitado, esse valor será ignorado." -#: src/libslic3r/PrintConfig.cpp:3737 +#: src/libslic3r/PrintConfig.cpp:3869 msgid "This is a relative measure of support points density." msgstr "Esta é uma medida relativa de densidade de pontos de suporte." -#: src/libslic3r/PrintConfig.cpp:3743 +#: src/libslic3r/PrintConfig.cpp:3875 msgid "Minimal distance of the support points" msgstr "Distância mínima dos pontos de suporte" -#: src/libslic3r/PrintConfig.cpp:3745 +#: src/libslic3r/PrintConfig.cpp:3877 msgid "No support points will be placed closer than this threshold." msgstr "Nenhum ponto de apoio será colocado mais perto do que este limiar." -#: src/libslic3r/PrintConfig.cpp:3751 +#: src/libslic3r/PrintConfig.cpp:3883 msgid "Use pad" msgstr "Use pad" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3885 msgid "Add a pad underneath the supported model" msgstr "Adicionar um pad por baixo do modelo suportado" -#: src/libslic3r/PrintConfig.cpp:3758 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "Pad wall thickness" msgstr "Espessura da parede do pad" -#: src/libslic3r/PrintConfig.cpp:3760 +#: src/libslic3r/PrintConfig.cpp:3892 msgid "The thickness of the pad and its optional cavity walls." msgstr "A espessura da pad e suas paredes de cavidade opcionais." -#: src/libslic3r/PrintConfig.cpp:3768 +#: src/libslic3r/PrintConfig.cpp:3900 msgid "Pad wall height" msgstr "Altura da parede do pad" -#: src/libslic3r/PrintConfig.cpp:3769 +#: src/libslic3r/PrintConfig.cpp:3901 msgid "" "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " "when enabling this feature, as some resins may produce an extreme suction " @@ -15124,19 +17078,19 @@ msgstr "" "produzir um efeito de sucção extrema dentro da cavidade, o que torna a " "descascar a impressão fora da folha de IVA difícil." -#: src/libslic3r/PrintConfig.cpp:3782 +#: src/libslic3r/PrintConfig.cpp:3914 msgid "Pad brim size" msgstr "Tamanho da borda do bloco" -#: src/libslic3r/PrintConfig.cpp:3783 +#: src/libslic3r/PrintConfig.cpp:3915 msgid "How far should the pad extend around the contained geometry" msgstr "Até onde o bloco deve se estender em torno da geometria contida" -#: src/libslic3r/PrintConfig.cpp:3793 +#: src/libslic3r/PrintConfig.cpp:3925 msgid "Max merge distance" msgstr "Distância máxima da fusão" -#: src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3927 msgid "" "Some objects can get along with a few smaller pads instead of a single big " "one. This parameter defines how far the center of two smaller pads should " @@ -15146,11 +17100,11 @@ msgstr "" "grande. Este parâmetro define até que ponto o centro de duas pads menores " "deve ser. Se eles estão mais perto, eles vão se fundir em uma pad." -#: src/libslic3r/PrintConfig.cpp:3815 +#: src/libslic3r/PrintConfig.cpp:3947 msgid "Pad wall slope" msgstr "Inclinação da parede da pad" -#: src/libslic3r/PrintConfig.cpp:3817 +#: src/libslic3r/PrintConfig.cpp:3949 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." @@ -15158,23 +17112,23 @@ msgstr "" "A inclinação da parede da pad em relação ao plano da mesa. 90 graus " "significa paredes retas." -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3960 msgid "Create pad around object and ignore the support elevation" msgstr "Criar pad ao redor do objeto e ignorar a elevação de suporte" -#: src/libslic3r/PrintConfig.cpp:3833 +#: src/libslic3r/PrintConfig.cpp:3965 msgid "Pad around object everywhere" msgstr "Pad em torno do objeto em todo lugar" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3967 msgid "Force pad around object everywhere" msgstr "Forçar Pad em torno do objeto em todo lugar" -#: src/libslic3r/PrintConfig.cpp:3840 +#: src/libslic3r/PrintConfig.cpp:3972 msgid "Pad object gap" msgstr "Vão entre o pad e o objeto" -#: src/libslic3r/PrintConfig.cpp:3842 +#: src/libslic3r/PrintConfig.cpp:3974 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." @@ -15182,55 +17136,55 @@ msgstr "" "A lacuna entre a parte inferior do objeto e o pad gerado no modo de elevação " "zero." -#: src/libslic3r/PrintConfig.cpp:3851 +#: src/libslic3r/PrintConfig.cpp:3983 msgid "Pad object connector stride" msgstr "Inserir pad entre o objeto" -#: src/libslic3r/PrintConfig.cpp:3853 +#: src/libslic3r/PrintConfig.cpp:3985 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "" "Distância entre duas varas do conector que conectam o objeto e a pad gerada." -#: src/libslic3r/PrintConfig.cpp:3860 +#: src/libslic3r/PrintConfig.cpp:3992 msgid "Pad object connector width" msgstr "Largura do conector do objeto pad" -#: src/libslic3r/PrintConfig.cpp:3862 +#: src/libslic3r/PrintConfig.cpp:3994 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "Largura das varas do conector que conectam o objeto e a pad gerada." -#: src/libslic3r/PrintConfig.cpp:3869 +#: src/libslic3r/PrintConfig.cpp:4001 msgid "Pad object connector penetration" msgstr "Pad objeto conector de penetração" -#: src/libslic3r/PrintConfig.cpp:3872 +#: src/libslic3r/PrintConfig.cpp:4004 msgid "How much should the tiny connectors penetrate into the model body." msgstr "Quanto deve os conectores minúsculos penetrar no corpo do modelo." -#: src/libslic3r/PrintConfig.cpp:3879 +#: src/libslic3r/PrintConfig.cpp:4011 msgid "Enable hollowing" msgstr "Ativar o modo oco" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:4013 msgid "Hollow out a model to have an empty interior" msgstr "Deixar o modelo oco para ter um interior vazio" -#: src/libslic3r/PrintConfig.cpp:3886 +#: src/libslic3r/PrintConfig.cpp:4018 msgid "Wall thickness" msgstr "Espessura da parede" -#: src/libslic3r/PrintConfig.cpp:3888 +#: src/libslic3r/PrintConfig.cpp:4020 msgid "Minimum wall thickness of a hollowed model." msgstr "Espessura mínima da parede de um modelo oco." -#: src/libslic3r/PrintConfig.cpp:3896 +#: src/libslic3r/PrintConfig.cpp:4028 msgid "Accuracy" msgstr "Precisão" -#: src/libslic3r/PrintConfig.cpp:3898 +#: src/libslic3r/PrintConfig.cpp:4030 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." @@ -15238,7 +17192,7 @@ msgstr "" "Desempenho versus precisão do cálculo. Valores mais baixos podem produzir " "artefatos indesejados." -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:4040 msgid "" "Hollowing is done in two steps: first, an imaginary interior is calculated " "deeper (offset plus the closing distance) in the object and then it's " @@ -15252,11 +17206,11 @@ msgstr "" "distância de fechamento torna o interior mais arredondado. Ao zero, o " "interior será o mais parecido com o exterior." -#: src/libslic3r/PrintConfig.cpp:3920 +#: src/libslic3r/PrintConfig.cpp:4052 msgid "Print speed" msgstr "Velocidade de impressão" -#: src/libslic3r/PrintConfig.cpp:3922 +#: src/libslic3r/PrintConfig.cpp:4054 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " @@ -15266,63 +17220,91 @@ msgstr "" "maior viscosidade ou com algumas peças ocas. Ele diminui o movimento de " "inclinação e adiciona um atraso antes da exposição." -#: src/libslic3r/PrintConfig.cpp:4390 +#: src/libslic3r/PrintConfig.cpp:4065 +msgid "Format of the output SLA archive" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4070 +msgid "SLA output precision" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4071 +msgid "Minimum resolution in nanometers" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4542 msgid "Export OBJ" msgstr "Exportar OBJ" -#: src/libslic3r/PrintConfig.cpp:4391 +#: src/libslic3r/PrintConfig.cpp:4543 msgid "Export the model(s) as OBJ." msgstr "Exportar modelo(s) como OBJ." -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4554 msgid "Export SLA" msgstr "Exportar SLA" -#: src/libslic3r/PrintConfig.cpp:4403 +#: src/libslic3r/PrintConfig.cpp:4555 msgid "Slice the model and export SLA printing layers as PNG." msgstr "Fatiar o modelo e exportar as camadas de impressão SLA como PNG." -#: src/libslic3r/PrintConfig.cpp:4408 +#: src/libslic3r/PrintConfig.cpp:4560 msgid "Export 3MF" msgstr "Exportar 3MF" -#: src/libslic3r/PrintConfig.cpp:4409 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Export the model(s) as 3MF." msgstr "Exportar modelo(s) como 3MF." -#: src/libslic3r/PrintConfig.cpp:4413 +#: src/libslic3r/PrintConfig.cpp:4565 msgid "Export AMF" msgstr "Exportar AMF" -#: src/libslic3r/PrintConfig.cpp:4414 +#: src/libslic3r/PrintConfig.cpp:4566 msgid "Export the model(s) as AMF." msgstr "Exportar modelo(s) como AMF." -#: src/libslic3r/PrintConfig.cpp:4418 +#: src/libslic3r/PrintConfig.cpp:4570 msgid "Export STL" msgstr "Exportar STL" -#: src/libslic3r/PrintConfig.cpp:4419 +#: src/libslic3r/PrintConfig.cpp:4571 msgid "Export the model(s) as STL." msgstr "Exportar modelo(s) como STL." -#: src/libslic3r/PrintConfig.cpp:4424 +#: src/libslic3r/PrintConfig.cpp:4576 msgid "Slice the model and export toolpaths as G-code." msgstr "Fatiar o modelo e exportar o percurso da ferramenta como G-code." -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4581 msgid "G-code viewer" msgstr "Tipo de G-code" -#: src/libslic3r/PrintConfig.cpp:4430 +#: src/libslic3r/PrintConfig.cpp:4582 msgid "Visualize an already sliced and saved G-code" msgstr "Visualize um G-code já fatiado e salvo" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4588 +msgid "OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4589 +msgid "Select the specified OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4594 +msgid "OpenGL debug output" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4595 +msgid "Activate OpenGL debug output on graphic cards which support it" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4601 msgid "Slice" msgstr "Fatiar" -#: src/libslic3r/PrintConfig.cpp:4436 +#: src/libslic3r/PrintConfig.cpp:4602 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." @@ -15330,67 +17312,71 @@ msgstr "" "Divida o modelo como FFF ou SLA com base no valor de config. " "printer_technology." -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4607 msgid "Help" msgstr "Ajuda" -#: src/libslic3r/PrintConfig.cpp:4442 +#: src/libslic3r/PrintConfig.cpp:4608 msgid "Show this help." msgstr "Mostrar esta ajuda." -#: src/libslic3r/PrintConfig.cpp:4447 +#: src/libslic3r/PrintConfig.cpp:4613 msgid "Help (FFF options)" msgstr "Ajuda (opções FDM)" -#: src/libslic3r/PrintConfig.cpp:4448 +#: src/libslic3r/PrintConfig.cpp:4614 msgid "Show the full list of print/G-code configuration options." msgstr "Mostre a lista completa de opções de config. do Print/G-code." -#: src/libslic3r/PrintConfig.cpp:4452 +#: src/libslic3r/PrintConfig.cpp:4618 msgid "Help (SLA options)" msgstr "Ajuda (opções SLA)" -#: src/libslic3r/PrintConfig.cpp:4453 +#: src/libslic3r/PrintConfig.cpp:4619 msgid "Show the full list of SLA print configuration options." msgstr "Mostrar a lista completa de opções de config. de impressão de SLA." -#: src/libslic3r/PrintConfig.cpp:4457 +#: src/libslic3r/PrintConfig.cpp:4623 msgid "Output Model Info" msgstr "Informações do modelo de saída" -#: src/libslic3r/PrintConfig.cpp:4458 +#: src/libslic3r/PrintConfig.cpp:4624 msgid "Write information about the model to the console." msgstr "Escreva informações sobre o modelo para o console." -#: src/libslic3r/PrintConfig.cpp:4462 +#: src/libslic3r/PrintConfig.cpp:4628 msgid "Save config file" msgstr "Salvar arquivo de config" -#: src/libslic3r/PrintConfig.cpp:4463 +#: src/libslic3r/PrintConfig.cpp:4629 msgid "Save configuration to the specified file." msgstr "Salvar config. para o arquivo específico." -#: src/libslic3r/PrintConfig.cpp:4473 +#: src/libslic3r/PrintConfig.cpp:4639 msgid "Align XY" msgstr "Alinhar XY" -#: src/libslic3r/PrintConfig.cpp:4474 +#: src/libslic3r/PrintConfig.cpp:4640 msgid "Align the model to the given point." msgstr "Alinhar modelo de acordo com o ponto inserido." -#: src/libslic3r/PrintConfig.cpp:4479 +#: src/libslic3r/PrintConfig.cpp:4645 msgid "Cut model at the given Z." msgstr "Cortar modelo ao Z fornecido." -#: src/libslic3r/PrintConfig.cpp:4501 +#: src/libslic3r/PrintConfig.cpp:4666 +msgid "Center" +msgstr "Centralizar" + +#: src/libslic3r/PrintConfig.cpp:4667 msgid "Center the print around the given center." msgstr "Centralizar a impressão de acordo com o centro informado." -#: src/libslic3r/PrintConfig.cpp:4505 +#: src/libslic3r/PrintConfig.cpp:4671 msgid "Don't arrange" msgstr "Não organizar" -#: src/libslic3r/PrintConfig.cpp:4506 +#: src/libslic3r/PrintConfig.cpp:4672 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." @@ -15398,11 +17384,11 @@ msgstr "" "Não reorganize os modelos fornecidos antes de Mesclar e manter suas " "coordenadas XY originais." -#: src/libslic3r/PrintConfig.cpp:4509 +#: src/libslic3r/PrintConfig.cpp:4675 msgid "Ensure on bed" msgstr "Garanta na mesa" -#: src/libslic3r/PrintConfig.cpp:4510 +#: src/libslic3r/PrintConfig.cpp:4676 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." @@ -15410,23 +17396,23 @@ msgstr "" "Levante o objeto acima da mesa quando estiver parcialmente abaixo. " "Habilitado por padrão, use --no-ensure-on-bed para desabilitar." -#: src/libslic3r/PrintConfig.cpp:4514 +#: src/libslic3r/PrintConfig.cpp:4680 msgid "Duplicate" msgstr "Duplicar" -#: src/libslic3r/PrintConfig.cpp:4515 +#: src/libslic3r/PrintConfig.cpp:4681 msgid "Multiply copies by this factor." msgstr "Multiplicar cópias por esse fator." -#: src/libslic3r/PrintConfig.cpp:4519 +#: src/libslic3r/PrintConfig.cpp:4685 msgid "Duplicate by grid" msgstr "Duplicar por grade" -#: src/libslic3r/PrintConfig.cpp:4520 +#: src/libslic3r/PrintConfig.cpp:4686 msgid "Multiply copies by creating a grid." msgstr "Multiplique cópias criando uma grade." -#: src/libslic3r/PrintConfig.cpp:4524 +#: src/libslic3r/PrintConfig.cpp:4690 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." @@ -15434,7 +17420,7 @@ msgstr "" "Organize os modelos fornecidos em uma placa e junte-os em um único modelo, a " "fim de executar ações uma só vez." -#: src/libslic3r/PrintConfig.cpp:4529 +#: src/libslic3r/PrintConfig.cpp:4695 msgid "" "Try to repair any non-manifold meshes (this option is implicitly added " "whenever we need to slice the model to perform the requested action)." @@ -15443,31 +17429,31 @@ msgstr "" "adicionada sempre que precisamos cortar o modelo para executar a ação " "solicitada)." -#: src/libslic3r/PrintConfig.cpp:4533 +#: src/libslic3r/PrintConfig.cpp:4699 msgid "Rotation angle around the Z axis in degrees." msgstr "Ângulo de rotação ao redor do eixo Zem graus." -#: src/libslic3r/PrintConfig.cpp:4537 +#: src/libslic3r/PrintConfig.cpp:4703 msgid "Rotate around X" msgstr "Rotacionar no X" -#: src/libslic3r/PrintConfig.cpp:4538 +#: src/libslic3r/PrintConfig.cpp:4704 msgid "Rotation angle around the X axis in degrees." msgstr "Ângulo de rotação ao redor do eixo X em graus." -#: src/libslic3r/PrintConfig.cpp:4542 +#: src/libslic3r/PrintConfig.cpp:4708 msgid "Rotate around Y" msgstr "Rotacionar no Y" -#: src/libslic3r/PrintConfig.cpp:4543 +#: src/libslic3r/PrintConfig.cpp:4709 msgid "Rotation angle around the Y axis in degrees." msgstr "Ângulo de rotação ao redor do eixo Y em graus." -#: src/libslic3r/PrintConfig.cpp:4548 +#: src/libslic3r/PrintConfig.cpp:4714 msgid "Scaling factor or percentage." msgstr "Escalando fator ou porcentagem." -#: src/libslic3r/PrintConfig.cpp:4553 +#: src/libslic3r/PrintConfig.cpp:4719 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." @@ -15475,23 +17461,31 @@ msgstr "" "Detecte peças não conectadas em um determinado modelo (s) e divida-as em " "objetos separados." -#: src/libslic3r/PrintConfig.cpp:4556 +#: src/libslic3r/PrintConfig.cpp:4722 msgid "Scale to Fit" msgstr "Dimensionar para caber" -#: src/libslic3r/PrintConfig.cpp:4557 +#: src/libslic3r/PrintConfig.cpp:4723 msgid "Scale to fit the given volume." msgstr "Escalar para se adequar ao volume informado." -#: src/libslic3r/PrintConfig.cpp:4566 +#: src/libslic3r/PrintConfig.cpp:4727 +msgid "Delete files after loading" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4728 +msgid "Delete files after loading." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4736 msgid "Ignore non-existent config files" msgstr "Ignorar arquivos de config. não existentes" -#: src/libslic3r/PrintConfig.cpp:4567 +#: src/libslic3r/PrintConfig.cpp:4737 msgid "Do not fail if a file supplied to --load does not exist." msgstr "Não falhe se um arquivo fornecido para--carregamento não existe." -#: src/libslic3r/PrintConfig.cpp:4570 +#: src/libslic3r/PrintConfig.cpp:4740 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." @@ -15499,7 +17493,7 @@ msgstr "" "Regra de compatibilidade de encaminhamento ao carregar configurações de " "arquivos de configuração e arquivos de projeto (3MF, AMF)." -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4741 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -15512,11 +17506,11 @@ msgstr "" "decidir sair ou substitua um valor desconhecido por um padrão de forma " "silenciosa ou detalhada." -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4745 msgid "Bail out on unknown configuration values" msgstr "Resgate em valores de configuração desconhecidos" -#: src/libslic3r/PrintConfig.cpp:4579 +#: src/libslic3r/PrintConfig.cpp:4746 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." @@ -15524,7 +17518,7 @@ msgstr "" "Habilite a leitura de valores de configuração desconhecidos substituindo-os " "detalhadamente por padrões." -#: src/libslic3r/PrintConfig.cpp:4580 +#: src/libslic3r/PrintConfig.cpp:4747 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." @@ -15532,11 +17526,11 @@ msgstr "" "Habilite a leitura de valores de configuração desconhecidos substituindo-os " "silenciosamente por padrões." -#: src/libslic3r/PrintConfig.cpp:4584 +#: src/libslic3r/PrintConfig.cpp:4752 msgid "Load config file" msgstr "Carregar arquivo de config" -#: src/libslic3r/PrintConfig.cpp:4585 +#: src/libslic3r/PrintConfig.cpp:4753 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -15544,11 +17538,11 @@ msgstr "" "Carregar a config. do arquivo especificado. Ele pode ser usado mais de uma " "vez para carregar opções de vários arquivos." -#: src/libslic3r/PrintConfig.cpp:4588 +#: src/libslic3r/PrintConfig.cpp:4756 msgid "Output File" msgstr "Arquivo de saída" -#: src/libslic3r/PrintConfig.cpp:4589 +#: src/libslic3r/PrintConfig.cpp:4757 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." @@ -15556,11 +17550,11 @@ msgstr "" "O arquivo onde a saída será gravada (se não for especificado, ele será " "baseado no arquivo de entrada)." -#: src/libslic3r/PrintConfig.cpp:4593 +#: src/libslic3r/PrintConfig.cpp:4761 msgid "Single instance mode" msgstr "Modo instancia única" -#: src/libslic3r/PrintConfig.cpp:4594 +#: src/libslic3r/PrintConfig.cpp:4762 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -15571,11 +17565,11 @@ msgstr "" "existente é ativada. Substitui o valor de configuração \"single_instance\" " "das preferências do aplicativo." -#: src/libslic3r/PrintConfig.cpp:4605 +#: src/libslic3r/PrintConfig.cpp:4767 msgid "Data directory" msgstr "Diretório de dados" -#: src/libslic3r/PrintConfig.cpp:4606 +#: src/libslic3r/PrintConfig.cpp:4768 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -15584,11 +17578,11 @@ msgstr "" "Carregar e armazenar as config. no diretório especificado. Isso é útil para " "manter perfis diferentes ou incluir config. de um armazenamento de rede." -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4771 msgid "Logging level" msgstr "Nível de registro" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4772 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -15599,11 +17593,11 @@ msgstr "" "Por exemplo. loglevel=2 logs de mensagens fatais, de nível de erro e de " "aviso." -#: src/libslic3r/PrintConfig.cpp:4616 +#: src/libslic3r/PrintConfig.cpp:4778 msgid "Render with a software renderer" msgstr "Renderizar com um software renderizador" -#: src/libslic3r/PrintConfig.cpp:4617 +#: src/libslic3r/PrintConfig.cpp:4779 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -15615,18 +17609,30 @@ msgstr "" msgid "Error with zip archive" msgstr "Erro com arquivo zip" -#: src/libslic3r/PrintObject.cpp:126 +#: src/libslic3r/PrintObject.cpp:152 msgid "Generating perimeters" msgstr "Gerando perímetros" -#: src/libslic3r/PrintObject.cpp:229 +#: src/libslic3r/PrintObject.cpp:257 msgid "Preparing infill" msgstr "Preparando o preenchimento" -#: src/libslic3r/PrintObject.cpp:403 +#: src/libslic3r/PrintObject.cpp:402 +msgid "making infill" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:449 +msgid "Searching support spots" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:474 msgid "Generating support material" msgstr "Gerando material de suporte" +#: src/libslic3r/PrintObject.cpp:495 +msgid "Estimating curled extrusions" +msgstr "" + #: resources/data/hints.ini: [hint:Fuzzy skin] msgid "" "Fuzzy skin\n" @@ -16041,6 +18047,36 @@ msgstr "" "Você sabia que pode alternar o PrusaSlicer para o modo de tela cheia? Use a " "Tecla de atalho F11." +#: resources/data/hints.ini: [hint:Printables integration] +msgid "" +"Printables.com integration\n" +"Did you know that when you are browsing Printables.com, you can send 3D " +"model files to PrusaSlicer with a single click? Learn more in the " +"documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Cut tool] +msgid "" +"Cut tool\n" +"Did you know that you can cut a model at any angle and even create aligning " +"pins with the updated Cut tool? Learn more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Measurement tool] +msgid "" +"Measurement tool\n" +"Did you know that you can measure the distances between points, edges " +"and planes, the radius of a hole or the angle between edges or planes? Learn " +"more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Text tool] +msgid "" +"Text tool\n" +"Did you know that you can add custom text labels to your models or even use " +"the text as a modifier? Learn more in the documentation." +msgstr "" + #: ../src/common/debugrpt.cpp:586 msgid "" "\n" @@ -17195,6 +19231,10 @@ msgstr "Alinhar a Esquerda" msgid "Align Right" msgstr "Alinhar a Direita" +#: ../src/richtext/richtextsizepage.cpp:266 +msgid "Alignment" +msgstr "Alinhamento" + #: ../src/generic/filectrlg.cpp:1197 ../src/common/fldlgcmn.cpp:107 #, c-format msgid "All files (%s)|%s" @@ -18496,10 +20536,6 @@ msgstr "Decorativo" msgid "Default encoding" msgstr "Codificação padrão" -#: ../src/dfb/fontmgr.cpp:180 -msgid "Default font" -msgstr "Fonte padrão" - #: ../src/generic/prntdlgg.cpp:510 msgid "Default printer" msgstr "Impressora padrão" @@ -18861,11 +20897,6 @@ msgstr "Erro enquanto imprimia: " msgid "Error: " msgstr "Erro: " -#. TRANSLATORS: Name of keyboard key -#: ../src/common/accelcmn.cpp:69 -msgid "Esc" -msgstr "Esc" - #. TRANSLATORS: Name of keyboard key #: ../src/common/accelcmn.cpp:70 msgid "Escape" @@ -19614,11 +21645,6 @@ msgstr "Disquete" msgid "Folio, 8 1/2 x 13 in" msgstr "Folio, 8 1/2 x 13 em" -#: ../src/richtext/richtextformatdlg.cpp:344 ../src/osx/carbon/fontdlg.cpp:287 -#: ../src/common/stockitem.cpp:194 -msgid "Font" -msgstr "Fonte" - #: ../src/richtext/richtextfontpage.cpp:221 msgid "Font &weight:" msgstr "Peso da &fonte:" @@ -20735,10 +22761,6 @@ msgstr "A memória VFS já contém o arquivo '%s'!" msgid "Menu" msgstr "Menu" -#: ../src/common/msgout.cpp:124 -msgid "Message" -msgstr "Mensagem" - #: ../src/univ/themes/metal.cpp:168 msgid "Metal theme" msgstr "Tema Metal" @@ -20772,10 +22794,6 @@ msgstr "Está faltando um parâmetro requerido." msgid "Modern" msgstr "Moderno" -#: ../src/generic/filectrlg.cpp:427 -msgid "Modified" -msgstr "Modificado" - #: ../src/common/module.cpp:133 #, c-format msgid "Module \"%s\" initialization failed" @@ -20866,11 +22884,6 @@ msgstr "NovoNome" msgid "Next page" msgstr "Próxima página" -#: ../include/wx/msgdlg.h:277 ../src/common/stockitem.cpp:177 -#: ../src/motif/msgdlg.cpp:196 -msgid "No" -msgstr "Não" - #. TRANSLATORS: System cursor name #: ../src/propgrid/advprops.cpp:1764 msgid "No Entry" @@ -21106,12 +23119,6 @@ msgstr "Num_lock" msgid "Numbered outline" msgstr "Contornos numerados" -#: ../include/wx/msgdlg.h:278 ../src/richtext/richtextstyledlg.cpp:297 -#: ../src/common/stockitem.cpp:178 ../src/msw/msgdlg.cpp:454 -#: ../src/msw/msgdlg.cpp:747 ../src/gtk1/fontdlg.cpp:138 -msgid "OK" -msgstr "OK" - #: ../src/msw/ole/automtn.cpp:692 #, c-format msgid "OLE Automation error in %s: %s" @@ -21182,6 +23189,10 @@ msgstr "A opção '%s' requer um valor." msgid "Option '%s': '%s' cannot be converted to a date." msgstr "A opção '%s': '%s' não pode ser convertida para uma data." +#: ../src/generic/prntdlgg.cpp:618 +msgid "Options" +msgstr "Opções" + #: ../src/propgrid/advprops.cpp:1606 msgid "Orange" msgstr "Laranja" @@ -21967,10 +23978,6 @@ msgstr "Selecione o estilo regular ou itálico." msgid "Select underlining or no underlining." msgstr "Selecione sublinhado ou sem sublinhado." -#: ../src/motif/filedlg.cpp:220 -msgid "Selection" -msgstr "Seleção" - #: ../src/richtext/richtextliststylepage.cpp:187 #: ../src/richtext/richtextliststylepage.cpp:189 msgid "Selects the list level to edit." @@ -22864,10 +24871,6 @@ msgstr "" msgid "Turkish (ISO-8859-9)" msgstr "Turco (ISO-8859-9)" -#: ../src/generic/filectrlg.cpp:426 -msgid "Type" -msgstr "Tipo" - #: ../src/richtext/richtextfontpage.cpp:151 #: ../src/richtext/richtextfontpage.cpp:153 msgid "Type a font name." @@ -23354,10 +25357,6 @@ msgstr "Usar a configuração de alinhamento atual." msgid "Validation conflict" msgstr "Conflito de validação" -#: ../src/propgrid/manager.cpp:238 -msgid "Value" -msgstr "Valor" - #: ../src/propgrid/props.cpp:386 ../src/propgrid/props.cpp:500 #, c-format msgid "Value must be %s or higher." @@ -23587,11 +25586,6 @@ msgstr "XPM: dados da imagem truncados na linha %d!" msgid "Yellow" msgstr "Amarelo" -#: ../include/wx/msgdlg.h:276 ../src/common/stockitem.cpp:206 -#: ../src/motif/msgdlg.cpp:196 -msgid "Yes" -msgstr "Sim" - #: ../src/osx/carbon/overlay.cpp:155 msgid "You cannot Clear an overlay that is not inited" msgstr "Você não pode limpar um overlay que não está iniciado" diff --git a/resources/localization/ru/PrusaSlicer.mo b/resources/localization/ru/PrusaSlicer.mo index ee483d8ee0bb0cc32db2e65124c3dc5369545e84..efdf1de538b8901f219fd529070bd0c307e75100 100644 GIT binary patch delta 102197 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 U?|eU_x7n|Lc4Koczs;5Z58ADb9smFU delta 109578 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 z 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\n" "Language-Team: \n" @@ -19,16 +19,16 @@ msgstr "" "%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" "X-Generator: Poedit 3.0.1\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 +#: src/slic3r/GUI/AboutDialog.cpp:46 src/slic3r/GUI/AboutDialog.cpp:306 msgid "Portions copyright" msgstr "С использованием разработок" -#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 +#: src/slic3r/GUI/AboutDialog.cpp:143 src/slic3r/GUI/AboutDialog.cpp:270 msgid "Copyright" msgstr "Copyright" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:143 +#: src/slic3r/GUI/AboutDialog.cpp:145 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -36,26 +36,26 @@ msgstr "" "Лицензионные соглашения всех следующих программ (библиотек) являются частью " "лицензионного соглашения" -#: src/slic3r/GUI/AboutDialog.cpp:212 +#: src/slic3r/GUI/AboutDialog.cpp:214 #, c-format, boost-format msgid "About %s" msgstr "О %s" -#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 -#: src/slic3r/GUI/GUI_App.cpp:262 +#: src/slic3r/GUI/AboutDialog.cpp:245 src/slic3r/GUI/AboutDialog.cpp:370 +#: src/slic3r/GUI/GUI_App.cpp:271 msgid "Version" msgstr "Версия" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:277 msgid "is licensed under the" msgstr "лицензирован в соответствии с" -#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:273 src/slic3r/GUI/GUI_App.cpp:277 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero General Public License, version 3" -#: src/slic3r/GUI/AboutDialog.cpp:273 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -63,7 +63,7 @@ msgstr "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." -#: src/slic3r/GUI/AboutDialog.cpp:274 +#: src/slic3r/GUI/AboutDialog.cpp:275 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -74,7 +74,7 @@ msgstr "" "numerous others. Если вы нашли ошибки в русском переводе пишите на " "andylg@yandex.ru." -#: src/slic3r/GUI/AboutDialog.cpp:310 +#: src/slic3r/GUI/AboutDialog.cpp:311 msgid "Copy Version Info" msgstr "Скопировать информацию о версии" @@ -103,54 +103,54 @@ msgstr "" "благодарны, если вы сообщите о вашей проблеме." #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:162 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:204 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:188 msgid "Slicing complete" msgstr "Нарезка завершена" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:199 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183 #, boost-format msgid "Masked SLA file exported to %1%" msgstr "MSLA файл экспортирован в %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:286 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:279 msgid "Access violation" msgstr "Нарушение прав доступа" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:288 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:281 msgid "Illegal instruction" msgstr "Недопустима инструкция" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:283 msgid "Divide by zero" msgstr "Деление на ноль не допускается" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:292 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:285 msgid "Overflow" msgstr "Переполнение" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:294 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:287 msgid "Underflow" msgstr "Недополнение" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:297 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 msgid "Floating reserved operand" msgstr "Плавающий зарезервированный операнд" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:300 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:293 msgid "Stack overflow" msgstr "Переполнение стека" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:659 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:726 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:652 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:719 msgid "Running post-processing scripts" msgstr "Запуск скриптов постобработки" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:690 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:710 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:683 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:703 msgid "Unknown error occured during exporting G-code." msgstr "При экспорте G-кода произошла неизвестная ошибка." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:695 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:688 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. Maybe the SD " @@ -161,7 +161,7 @@ msgstr "" "файла. Может ваша SD карта защищена от записи?\n" "Сообщение об ошибке: %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:698 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:691 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. There might be " @@ -173,7 +173,7 @@ msgstr "" "выполнить экспорт или использовать другое устройство. Повреждённый выходной " "G-код файл находится в %1%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:701 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:694 #, boost-format msgid "" "Renaming of the G-code after copying to the selected destination folder has " @@ -183,7 +183,7 @@ msgstr "" "назначения. Текущий путь %1%.tmp. Пожалуйста, попробуйте экспортировать ещё " "раз." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:704 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:697 #, boost-format msgid "" "Copying of the temporary G-code has finished but the original code at %1% " @@ -192,7 +192,7 @@ msgstr "" "Копирование временного G-кода завершено, но исходный код в %1% не удалось " "открыть во время проверки копии. Выходной G-код находится в %2%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:707 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:700 #, boost-format msgid "" "Copying of the temporary G-code has finished but the exported code couldn't " @@ -201,18 +201,18 @@ msgstr "" "Копирование временного G-кода завершено, но экспортированный код не удалось " "открыть во время проверки копии. Выходной G-код находится в %1%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:715 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:708 #, boost-format msgid "G-code file exported to %1%" msgstr "Файл G-кода экспортирован в %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:729 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:722 msgid "Copying of the temporary G-code to the output G-code failed" msgstr "" "Не удалось скопировать временный G-код в местонахождение выходного G-код " "файла" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:751 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:738 #, boost-format msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" @@ -220,8 +220,9 @@ msgstr "" "печати" #: src/slic3r/GUI/BedShapeDialog.cpp:31 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2765 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1576 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:241 src/slic3r/GUI/Plater.cpp:220 +#: src/slic3r/GUI/Tab.cpp:2697 msgid "Size" msgstr "Размер" @@ -229,7 +230,9 @@ msgstr "Размер" msgid "Origin" msgstr "Начало координат" -#: src/slic3r/GUI/BedShapeDialog.cpp:33 src/libslic3r/PrintConfig.cpp:1020 +#: src/slic3r/GUI/BedShapeDialog.cpp:33 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1994 +#: src/libslic3r/PrintConfig.cpp:1109 msgid "Diameter" msgstr "Диаметр" @@ -245,54 +248,62 @@ msgstr "" "Расстояние до точки начало координат. Отсчёт от левого переднего угла " "прямоугольного стола." -#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:262 -#: src/slic3r/GUI/ConfigWizard.cpp:1476 src/slic3r/GUI/ConfigWizard.cpp:1490 +#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:291 +#: src/slic3r/GUI/ConfigWizard.cpp:1796 src/slic3r/GUI/ConfigWizard.cpp:1832 +#: src/slic3r/GUI/ConfigWizard.cpp:1846 #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:100 -#: src/slic3r/GUI/GCodeViewer.cpp:3181 src/slic3r/GUI/GCodeViewer.cpp:3187 -#: src/slic3r/GUI/GCodeViewer.cpp:3195 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 src/slic3r/GUI/GCodeViewer.cpp:3455 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 #: src/slic3r/GUI/GUI_ObjectLayers.cpp:145 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 src/libslic3r/PrintConfig.cpp:263 -#: src/libslic3r/PrintConfig.cpp:290 src/libslic3r/PrintConfig.cpp:297 -#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:520 -#: src/libslic3r/PrintConfig.cpp:546 src/libslic3r/PrintConfig.cpp:621 -#: src/libslic3r/PrintConfig.cpp:629 src/libslic3r/PrintConfig.cpp:679 -#: src/libslic3r/PrintConfig.cpp:813 src/libslic3r/PrintConfig.cpp:824 -#: src/libslic3r/PrintConfig.cpp:842 src/libslic3r/PrintConfig.cpp:1023 -#: src/libslic3r/PrintConfig.cpp:1235 src/libslic3r/PrintConfig.cpp:1302 -#: src/libslic3r/PrintConfig.cpp:1312 src/libslic3r/PrintConfig.cpp:1611 -#: src/libslic3r/PrintConfig.cpp:1805 src/libslic3r/PrintConfig.cpp:1866 -#: src/libslic3r/PrintConfig.cpp:1884 src/libslic3r/PrintConfig.cpp:1902 -#: src/libslic3r/PrintConfig.cpp:1965 src/libslic3r/PrintConfig.cpp:1975 -#: src/libslic3r/PrintConfig.cpp:2097 src/libslic3r/PrintConfig.cpp:2106 -#: src/libslic3r/PrintConfig.cpp:2125 src/libslic3r/PrintConfig.cpp:2146 -#: src/libslic3r/PrintConfig.cpp:2158 src/libslic3r/PrintConfig.cpp:2166 -#: src/libslic3r/PrintConfig.cpp:2207 src/libslic3r/PrintConfig.cpp:2215 -#: src/libslic3r/PrintConfig.cpp:2225 src/libslic3r/PrintConfig.cpp:2233 -#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2303 -#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2603 -#: src/libslic3r/PrintConfig.cpp:2620 src/libslic3r/PrintConfig.cpp:2721 -#: src/libslic3r/PrintConfig.cpp:2730 src/libslic3r/PrintConfig.cpp:2780 -#: src/libslic3r/PrintConfig.cpp:2932 src/libslic3r/PrintConfig.cpp:3020 -#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3034 -#: src/libslic3r/PrintConfig.cpp:3048 src/libslic3r/PrintConfig.cpp:3072 -#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3092 -#: src/libslic3r/PrintConfig.cpp:3372 src/libslic3r/PrintConfig.cpp:3413 -#: src/libslic3r/PrintConfig.cpp:3573 src/libslic3r/PrintConfig.cpp:3582 -#: src/libslic3r/PrintConfig.cpp:3591 src/libslic3r/PrintConfig.cpp:3601 -#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3676 -#: src/libslic3r/PrintConfig.cpp:3688 src/libslic3r/PrintConfig.cpp:3708 -#: src/libslic3r/PrintConfig.cpp:3718 src/libslic3r/PrintConfig.cpp:3728 -#: src/libslic3r/PrintConfig.cpp:3746 src/libslic3r/PrintConfig.cpp:3761 -#: src/libslic3r/PrintConfig.cpp:3775 src/libslic3r/PrintConfig.cpp:3786 -#: src/libslic3r/PrintConfig.cpp:3799 src/libslic3r/PrintConfig.cpp:3844 -#: src/libslic3r/PrintConfig.cpp:3854 src/libslic3r/PrintConfig.cpp:3863 -#: src/libslic3r/PrintConfig.cpp:3873 src/libslic3r/PrintConfig.cpp:3889 -#: src/libslic3r/PrintConfig.cpp:3913 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 src/libslic3r/PrintConfig.cpp:279 +#: src/libslic3r/PrintConfig.cpp:303 src/libslic3r/PrintConfig.cpp:310 +#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:657 src/libslic3r/PrintConfig.cpp:724 +#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:782 +#: src/libslic3r/PrintConfig.cpp:902 src/libslic3r/PrintConfig.cpp:913 +#: src/libslic3r/PrintConfig.cpp:931 src/libslic3r/PrintConfig.cpp:1112 +#: src/libslic3r/PrintConfig.cpp:1295 src/libslic3r/PrintConfig.cpp:1359 +#: src/libslic3r/PrintConfig.cpp:1369 src/libslic3r/PrintConfig.cpp:1650 +#: src/libslic3r/PrintConfig.cpp:1842 src/libslic3r/PrintConfig.cpp:1903 +#: src/libslic3r/PrintConfig.cpp:1921 src/libslic3r/PrintConfig.cpp:1939 +#: src/libslic3r/PrintConfig.cpp:1995 src/libslic3r/PrintConfig.cpp:2005 +#: src/libslic3r/PrintConfig.cpp:2127 src/libslic3r/PrintConfig.cpp:2136 +#: src/libslic3r/PrintConfig.cpp:2155 src/libslic3r/PrintConfig.cpp:2176 +#: src/libslic3r/PrintConfig.cpp:2188 src/libslic3r/PrintConfig.cpp:2196 +#: src/libslic3r/PrintConfig.cpp:2237 src/libslic3r/PrintConfig.cpp:2245 +#: src/libslic3r/PrintConfig.cpp:2255 src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2271 src/libslic3r/PrintConfig.cpp:2336 +#: src/libslic3r/PrintConfig.cpp:2565 src/libslic3r/PrintConfig.cpp:2632 +#: src/libslic3r/PrintConfig.cpp:2647 src/libslic3r/PrintConfig.cpp:2746 +#: src/libslic3r/PrintConfig.cpp:2755 src/libslic3r/PrintConfig.cpp:2801 +#: src/libslic3r/PrintConfig.cpp:2886 src/libslic3r/PrintConfig.cpp:2896 +#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3108 +#: src/libslic3r/PrintConfig.cpp:3115 src/libslic3r/PrintConfig.cpp:3122 +#: src/libslic3r/PrintConfig.cpp:3136 src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3170 src/libslic3r/PrintConfig.cpp:3180 +#: src/libslic3r/PrintConfig.cpp:3330 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3391 src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3444 src/libslic3r/PrintConfig.cpp:3456 +#: src/libslic3r/PrintConfig.cpp:3476 src/libslic3r/PrintConfig.cpp:3491 +#: src/libslic3r/PrintConfig.cpp:3501 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3681 src/libslic3r/PrintConfig.cpp:3878 +#: src/libslic3r/PrintConfig.cpp:3893 src/libslic3r/PrintConfig.cpp:3907 +#: src/libslic3r/PrintConfig.cpp:3918 src/libslic3r/PrintConfig.cpp:3931 +#: src/libslic3r/PrintConfig.cpp:3976 src/libslic3r/PrintConfig.cpp:3986 +#: src/libslic3r/PrintConfig.cpp:3995 src/libslic3r/PrintConfig.cpp:4005 +#: src/libslic3r/PrintConfig.cpp:4021 src/libslic3r/PrintConfig.cpp:4045 +#: src/libslic3r/PrintConfig.cpp:4072 msgid "mm" msgstr "мм" @@ -311,13 +322,13 @@ msgstr "Прямоугольная" msgid "Circular" msgstr "Круглая" -#: src/slic3r/GUI/BedShapeDialog.cpp:81 src/slic3r/GUI/GUI_Preview.cpp:252 -#: src/libslic3r/ExtrusionEntity.cpp:343 src/libslic3r/ExtrusionEntity.cpp:378 +#: src/slic3r/GUI/BedShapeDialog.cpp:81 msgid "Custom" msgstr "Пользовательская" #: src/slic3r/GUI/BedShapeDialog.cpp:104 src/slic3r/GUI/BedShapeDialog.cpp:179 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1701 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1565 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1798 msgid "Shape" msgstr "Форма" @@ -325,8 +336,8 @@ msgstr "Форма" msgid "Load shape from STL..." msgstr "Загрузка формы стола из STL файла..." -#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2147 +#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3914 +#: src/slic3r/GUI/MainFrame.cpp:2240 msgid "Settings" msgstr "Настройки" @@ -339,7 +350,7 @@ msgid "Load..." msgstr "Загрузить..." #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/Tab.cpp:3973 msgid "Remove" msgstr "Удалить" @@ -351,79 +362,122 @@ msgstr "Не найдено:" msgid "Model" msgstr "Модель" -#: src/slic3r/GUI/BedShapeDialog.cpp:508 +#: src/slic3r/GUI/BedShapeDialog.cpp:506 msgid "Choose an STL file to import bed shape from:" msgstr "Выберите STL файл для импорта формы стола из:" -#: src/slic3r/GUI/BedShapeDialog.cpp:514 src/slic3r/GUI/BedShapeDialog.cpp:562 -#: src/slic3r/GUI/BedShapeDialog.cpp:584 +#: src/slic3r/GUI/BedShapeDialog.cpp:512 src/slic3r/GUI/BedShapeDialog.cpp:560 +#: src/slic3r/GUI/BedShapeDialog.cpp:582 msgid "Invalid file format." msgstr "Неверный формат файла." -#: src/slic3r/GUI/BedShapeDialog.cpp:525 +#: src/slic3r/GUI/BedShapeDialog.cpp:523 msgid "Error! Invalid model" msgstr "Ошибка! Недопустимая модель" -#: src/slic3r/GUI/BedShapeDialog.cpp:533 +#: src/slic3r/GUI/BedShapeDialog.cpp:531 msgid "The selected file contains no geometry." msgstr "Выбранный файл не содержит геометрии." -#: src/slic3r/GUI/BedShapeDialog.cpp:537 +#: src/slic3r/GUI/BedShapeDialog.cpp:535 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "" "Выбранный файл содержит несколько не пересекающихся областей. Такие файлы не " "поддерживаются." -#: src/slic3r/GUI/BedShapeDialog.cpp:552 +#: src/slic3r/GUI/BedShapeDialog.cpp:550 msgid "Choose a file to import bed texture from (PNG/SVG):" msgstr "Выберите файл для импорта текстуры стола из PNG/SVG:" -#: src/slic3r/GUI/BedShapeDialog.cpp:574 +#: src/slic3r/GUI/BedShapeDialog.cpp:572 msgid "Choose an STL file to import bed model from:" msgstr "Выберите STL файл для импорта формы стола из:" -#: src/slic3r/GUI/BedShapeDialog.hpp:95 src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/BedShapeDialog.hpp:96 src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape" msgstr "Форма и размеры стола" -#: src/slic3r/GUI/BonjourDialog.cpp:55 +#: src/slic3r/GUI/BonjourDialog.cpp:58 msgid "Network lookup" msgstr "Поиск по сети" -#: src/slic3r/GUI/BonjourDialog.cpp:72 +#: src/slic3r/GUI/BonjourDialog.cpp:75 src/slic3r/GUI/BonjourDialog.cpp:253 msgid "Address" msgstr "Адрес" -#: src/slic3r/GUI/BonjourDialog.cpp:73 +#: src/slic3r/GUI/BonjourDialog.cpp:76 msgid "Hostname" msgstr "Имя хоста" -#: src/slic3r/GUI/BonjourDialog.cpp:74 +#: src/slic3r/GUI/BonjourDialog.cpp:77 msgid "Service name" msgstr "Имя службы" -#: src/slic3r/GUI/BonjourDialog.cpp:76 +#: src/slic3r/GUI/BonjourDialog.cpp:79 msgid "OctoPrint version" msgstr "Версия OctoPrint" -#: src/slic3r/GUI/BonjourDialog.cpp:224 +#: src/slic3r/GUI/BonjourDialog.cpp:227 msgid "Searching for devices" msgstr "Поиск устройств" -#: src/slic3r/GUI/BonjourDialog.cpp:231 +#: src/slic3r/GUI/BonjourDialog.cpp:234 msgid "Finished" msgstr "Завершено" -#: src/slic3r/GUI/ButtonsDescription.cpp:42 +#: src/slic3r/GUI/BonjourDialog.cpp:240 +msgid "Multiple resolved IP addresses" +msgstr "" + +#: src/slic3r/GUI/BonjourDialog.cpp:249 +#, boost-format +msgid "" +"There are several IP addresses resolving to hostname %1%.\n" +"Please select one that should be used." +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:21 +msgid "Palette 1 (default)" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:22 +msgid "Palette 2" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:23 +msgid "Palette 3" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:24 +msgid "Palette 4" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:25 +msgid "Palette 5" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:26 +msgid "Palette 6" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:27 +msgid "Palette 7" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:28 +msgid "Palette 8" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:112 msgid "Revert color to default" msgstr "Вернуть цвет к стандартному" -#: src/slic3r/GUI/ButtonsDescription.cpp:57 +#: src/slic3r/GUI/ButtonsDescription.cpp:127 msgid "Value is the same as the system value" msgstr "Значение совпадает с системным значением" -#: src/slic3r/GUI/ButtonsDescription.cpp:58 +#: src/slic3r/GUI/ButtonsDescription.cpp:128 msgid "" "Value was changed and is not equal to the system value or the last saved " "preset" @@ -431,11 +485,35 @@ msgstr "" "Значение изменено и не равно системному значению или последнему сохранённому " "профилю" -#: src/slic3r/GUI/ButtonsDescription.cpp:62 +#: src/slic3r/GUI/ButtonsDescription.cpp:155 +msgid "Default palette for mode markers" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2422 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Simple" +msgstr "Простой" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2424 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgctxt "Mode" +msgid "Advanced" +msgstr "Расширенный" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2425 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Expert" +msgstr "Продвинутый" + +#: src/slic3r/GUI/ButtonsDescription.cpp:182 +msgid "Revert color" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:200 msgid "Buttons And Text Colors Description" msgstr "Описание кнопок и цвет текста" -#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/ConfigManipulation.cpp:50 msgid "" "Layer height is not valid.\n" "\n" @@ -445,13 +523,13 @@ msgstr "" "\n" "Высота первого слоя будет сброшена на 0.01." -#: src/slic3r/GUI/ConfigManipulation.cpp:50 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1449 -#: src/libslic3r/PrintConfig.cpp:286 +#: src/slic3r/GUI/ConfigManipulation.cpp:51 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1394 +#: src/libslic3r/PrintConfig.cpp:299 msgid "Layer height" msgstr "Высота слоя" -#: src/slic3r/GUI/ConfigManipulation.cpp:61 +#: src/slic3r/GUI/ConfigManipulation.cpp:62 msgid "" "First layer height is not valid.\n" "\n" @@ -461,7 +539,7 @@ msgstr "" "\n" "Высота первого слоя будет сброшена на 0.01." -#: src/slic3r/GUI/ConfigManipulation.cpp:62 src/libslic3r/PrintConfig.cpp:1231 +#: src/slic3r/GUI/ConfigManipulation.cpp:63 src/libslic3r/PrintConfig.cpp:1291 msgid "First layer height" msgstr "Высота первого слоя" @@ -472,7 +550,6 @@ msgid "" "- no top solid layers\n" "- 0% fill density\n" "- no support material\n" -"- Ensure vertical shell thickness enabled\n" "- Detect thin walls disabled" msgstr "" "Требования для режима «Спиральная ваза» - т.е. печати внешнего контура по " @@ -481,54 +558,51 @@ msgstr "" "- отсутствие верхних сплошных слоёв\n" "- плотность заполнения 0%\n" "- отсутствие поддержки\n" -"- включено «Обеспечивать вертикальную толщину оболочки»\n" "- отключено «Обнаружение тонких стенок»" -#: src/slic3r/GUI/ConfigManipulation.cpp:90 +#: src/slic3r/GUI/ConfigManipulation.cpp:89 msgid "Shall I adjust those settings in order to enable Spiral Vase?" msgstr "Изменить эти настройки, чтобы включить режим «Спиральная ваза»?" -#: src/slic3r/GUI/ConfigManipulation.cpp:91 +#: src/slic3r/GUI/ConfigManipulation.cpp:90 msgid "Spiral Vase" msgstr "Спиральная ваза" -#: src/slic3r/GUI/ConfigManipulation.cpp:121 +#: src/slic3r/GUI/ConfigManipulation.cpp:123 msgid "" -"The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool " -"change.\n" -"(both support_material_extruder and support_material_interface_extruder need " -"to be set to 0)." +"For the Wipe Tower to work with the soluble supports, the support layers\n" +"need to be synchronized with the object layers." msgstr "" -"В настоящее время режим черновой башни поддерживает нерастворимую поддержку\n" -"только в том случае, если она печатается текущим экструдером, без запуска\n" -"смены инструмента. (Значения «Экструдер, печатающий поддержки/подложки/" -"юбки»\n" -"и «Экструдер, печатающий связующий слой поддержки/подложки» должны быть\n" -"установлены в 0)." - -#: src/slic3r/GUI/ConfigManipulation.cpp:125 -msgid "Shall I adjust those settings in order to enable the Wipe Tower?" -msgstr "Изменить эти настройки, чтобы включить черновую башню?" +"Для того, чтобы режим черновой башни работал с растворимой поддержкой, \n" +"слои поддержки должны быть синхронизированы со слоями модели." #: src/slic3r/GUI/ConfigManipulation.cpp:126 -#: src/slic3r/GUI/ConfigManipulation.cpp:146 +msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" +msgstr "Синхронизировать слои поддержки, чтобы включить черновую башню?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:127 +#: src/slic3r/GUI/ConfigManipulation.cpp:145 msgid "Wipe Tower" msgstr "Черновой башни" -#: src/slic3r/GUI/ConfigManipulation.cpp:142 +#: src/slic3r/GUI/ConfigManipulation.cpp:140 src/libslic3r/Print.cpp:672 msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers\n" -"need to be synchronized with the object layers." +"The Wipe Tower currently supports the non-soluble supports only if they are " +"printed with the current extruder without triggering a tool change. (both " +"support_material_extruder and support_material_interface_extruder need to be " +"set to 0)." msgstr "" -"Для того, чтобы режим черновой башни работал с растворимой поддержкой, \n" -"слои поддержки должны быть синхронизированы со слоями модели." +"В настоящее время режим черновой башни поддерживает нерастворимую поддержку " +"только в том случае, если они печатаются текущим экструдером, без запуска " +"смены инструмента. (Значения «Экструдер, печатающий поддержки/подложки/юбки» " +"и «Экструдер, печатающий связующий слой поддержки/подложки» должны быть " +"установлены в 0)." -#: src/slic3r/GUI/ConfigManipulation.cpp:145 -msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" -msgstr "Синхронизировать слои поддержки, чтобы включить черновую башню?" +#: src/slic3r/GUI/ConfigManipulation.cpp:144 +msgid "Shall I adjust those settings in order to enable the Wipe Tower?" +msgstr "Изменить эти настройки, чтобы включить черновую башню?" -#: src/slic3r/GUI/ConfigManipulation.cpp:164 +#: src/slic3r/GUI/ConfigManipulation.cpp:166 msgid "" "Supports work better, if the following feature is enabled:\n" "- Detect bridging perimeters" @@ -536,184 +610,188 @@ msgstr "" "Поддержки работают лучше, если включена следующая функция:\n" "- Определять нависающие периметры" -#: src/slic3r/GUI/ConfigManipulation.cpp:167 +#: src/slic3r/GUI/ConfigManipulation.cpp:169 msgid "Shall I adjust those settings for supports?" msgstr "Включить данный параметр для поддержки?" -#: src/slic3r/GUI/ConfigManipulation.cpp:168 +#: src/slic3r/GUI/ConfigManipulation.cpp:170 msgid "Support Generator" msgstr "Генератор поддержки" -#: src/slic3r/GUI/ConfigManipulation.cpp:195 +#: src/slic3r/GUI/ConfigManipulation.cpp:194 #, boost-format msgid "The %1% infill pattern is not supposed to work at 100%% density." msgstr "Шаблон заполнения %1% не поддерживает 100%% заполнение." -#: src/slic3r/GUI/ConfigManipulation.cpp:198 +#: src/slic3r/GUI/ConfigManipulation.cpp:196 msgid "Shall I switch to rectilinear fill pattern?" msgstr "Заменить его на прямолинейный (Rectilinear)?" -#: src/slic3r/GUI/ConfigManipulation.cpp:199 +#: src/slic3r/GUI/ConfigManipulation.cpp:197 #: src/slic3r/GUI/GUI_Factories.cpp:55 src/slic3r/GUI/GUI_Factories.cpp:128 -#: src/slic3r/GUI/Plater.cpp:460 src/slic3r/GUI/Tab.cpp:1503 -#: src/slic3r/GUI/Tab.cpp:1505 src/libslic3r/PrintConfig.cpp:475 -#: src/libslic3r/PrintConfig.cpp:716 src/libslic3r/PrintConfig.cpp:743 -#: src/libslic3r/PrintConfig.cpp:1098 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1149 src/libslic3r/PrintConfig.cpp:1398 -#: src/libslic3r/PrintConfig.cpp:1427 src/libslic3r/PrintConfig.cpp:1496 -#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1535 -#: src/libslic3r/PrintConfig.cpp:2364 src/libslic3r/PrintConfig.cpp:2381 +#: src/slic3r/GUI/Plater.cpp:468 src/slic3r/GUI/Tab.cpp:1450 +#: src/slic3r/GUI/Tab.cpp:1452 src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:811 src/libslic3r/PrintConfig.cpp:831 +#: src/libslic3r/PrintConfig.cpp:1187 src/libslic3r/PrintConfig.cpp:1200 +#: src/libslic3r/PrintConfig.cpp:1225 src/libslic3r/PrintConfig.cpp:1444 +#: src/libslic3r/PrintConfig.cpp:1473 src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1557 src/libslic3r/PrintConfig.cpp:1576 +#: src/libslic3r/PrintConfig.cpp:2395 src/libslic3r/PrintConfig.cpp:2412 msgid "Infill" msgstr "Заполнение" -#: src/slic3r/GUI/ConfigManipulation.cpp:337 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Head penetration should not be greater than the head width." msgstr "Глубина проникновения носика поддержки не должна превышать его длину." -#: src/slic3r/GUI/ConfigManipulation.cpp:339 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid Head penetration" msgstr "Недопустимая глубина проникновения носика поддержки" -#: src/slic3r/GUI/ConfigManipulation.cpp:350 +#: src/slic3r/GUI/ConfigManipulation.cpp:362 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "Диаметр носика поддержки должен быть меньше диаметра тела поддержки." -#: src/slic3r/GUI/ConfigManipulation.cpp:352 +#: src/slic3r/GUI/ConfigManipulation.cpp:364 msgid "Invalid pinhead diameter" msgstr "Недопустимый диаметр носика поддержки" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20 msgid "Upgrade" msgstr "Обновить" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22 msgid "Downgrade" msgstr "Понизить версию" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 msgid "Before roll back" msgstr "Перед откатом к прежнему" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:340 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:26 src/libslic3r/PrintConfig.cpp:353 msgid "User" msgstr "Пользователь" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:329 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:29 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1135 msgid "Unknown" msgstr "Неизвестно" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 msgid "Active" msgstr "Активный" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 msgid "PrusaSlicer version" msgstr "Версия PrusaSlicer" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 src/libslic3r/Preset.cpp:1341 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 src/libslic3r/Preset.cpp:1480 msgid "print" msgstr "печать" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:65 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 msgid "filaments" msgstr "пруток" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 src/libslic3r/Preset.cpp:1343 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:67 src/libslic3r/Preset.cpp:1482 msgid "SLA print" msgstr "Профиль SLA печати" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69 -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/slic3r/GUI/GUI.cpp:340 -#: src/slic3r/GUI/Plater.cpp:821 src/libslic3r/Preset.cpp:1344 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/slic3r/GUI/GUI.cpp:331 +#: src/slic3r/GUI/Plater.cpp:851 src/libslic3r/Preset.cpp:1483 msgid "SLA material" msgstr "Профиль SLA материала" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:71 src/libslic3r/Preset.cpp:1345 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 src/libslic3r/Preset.cpp:1484 msgid "printer" msgstr "принтер" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 src/slic3r/GUI/Tab.cpp:1366 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 src/slic3r/GUI/Tab.cpp:1311 msgid "vendor" msgstr "производитель" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 msgid "version" msgstr "версия" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:76 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 msgid "min PrusaSlicer version" msgstr "минимальная версия PrusaSlicer" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:77 msgid "max PrusaSlicer version" msgstr "максимальная версия PrusaSlicer" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "model" msgstr "модель" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "variants" msgstr "модификация" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:93 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:92 #, c-format, boost-format msgid "Incompatible with this %s" msgstr "Несовместимо с этой версией %s" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:96 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:95 msgid "Activate" msgstr "Активировать" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:123 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:122 msgid "Configuration Snapshots" msgstr "Резервные копии конфигурации (снапшот)" -#: src/slic3r/GUI/ConfigWizard.cpp:262 +#: src/slic3r/GUI/ConfigWizard.cpp:291 msgid "nozzle" msgstr "сопло" -#: src/slic3r/GUI/ConfigWizard.cpp:266 +#: src/slic3r/GUI/ConfigWizard.cpp:295 msgid "Alternate nozzles:" msgstr "Альтернативные сопла:" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "All standard" msgstr "Все стандартные" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "Standard" msgstr "Стандартные" -#: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3833 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 +#: src/slic3r/GUI/ConfigWizard.cpp:360 src/slic3r/GUI/ConfigWizard.cpp:681 +#: src/slic3r/GUI/FileArchiveDialog.cpp:261 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 src/slic3r/GUI/Preferences.cpp:550 +#: src/slic3r/GUI/Tab.cpp:4058 src/slic3r/GUI/UnsavedChangesDialog.cpp:1161 msgid "All" msgstr "Все" -#: src/slic3r/GUI/ConfigWizard.cpp:332 src/slic3r/GUI/ConfigWizard.cpp:652 -#: src/slic3r/GUI/DoubleSlider.cpp:2030 src/slic3r/GUI/Plater.cpp:432 -#: src/slic3r/GUI/Plater.cpp:579 src/slic3r/GUI/Preferences.cpp:436 -#: src/libslic3r/PrintConfig.cpp:1291 +#: src/slic3r/GUI/ConfigWizard.cpp:361 src/slic3r/GUI/ConfigWizard.cpp:682 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 +#: src/slic3r/GUI/FileArchiveDialog.cpp:265 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1984 src/slic3r/GUI/Plater.cpp:439 +#: src/slic3r/GUI/Plater.cpp:594 src/slic3r/GUI/Preferences.cpp:552 +#: src/libslic3r/PrintConfig.cpp:1347 msgid "None" msgstr "Нет" -#: src/slic3r/GUI/ConfigWizard.cpp:484 +#: src/slic3r/GUI/ConfigWizard.cpp:513 #, c-format, boost-format msgid "Welcome to the %s Configuration Assistant" msgstr "Приветствуем вас в мастере настройки %s" -#: src/slic3r/GUI/ConfigWizard.cpp:486 +#: src/slic3r/GUI/ConfigWizard.cpp:515 #, c-format, boost-format msgid "Welcome to the %s Configuration Wizard" msgstr "Приветствуем вас в мастере настройки %s" -#: src/slic3r/GUI/ConfigWizard.cpp:488 +#: src/slic3r/GUI/ConfigWizard.cpp:517 msgid "Welcome" msgstr "Начало" -#: src/slic3r/GUI/ConfigWizard.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:519 #, c-format, boost-format msgid "" "Hello, welcome to %s! This %s helps you with the initial configuration; just " @@ -721,11 +799,11 @@ msgid "" msgstr "" "Приветствуем вас в %s! Этот %s поможет вам с начальной настройкой программы." -#: src/slic3r/GUI/ConfigWizard.cpp:495 +#: src/slic3r/GUI/ConfigWizard.cpp:524 msgid "Remove user profiles (a snapshot will be taken beforehand)" msgstr "Удалить профили пользователя (снапшот будет сделан заранее)" -#: src/slic3r/GUI/ConfigWizard.cpp:498 +#: src/slic3r/GUI/ConfigWizard.cpp:527 msgid "" "Perform desktop integration (Sets this binary to be searchable by the " "system)." @@ -733,56 +811,67 @@ msgstr "" "Выполнить интеграцию с рабочим столом (делает этот двоичный файл доступным " "для поиска системой)." -#: src/slic3r/GUI/ConfigWizard.cpp:550 +#: src/slic3r/GUI/ConfigWizard.cpp:579 #, c-format, boost-format msgid "%s Family" msgstr "Семейство принтеров %s" -#: src/slic3r/GUI/ConfigWizard.cpp:640 +#: src/slic3r/GUI/ConfigWizard.cpp:670 msgid "Printer:" msgstr "Принтер:" -#: src/slic3r/GUI/ConfigWizard.cpp:642 +#: src/slic3r/GUI/ConfigWizard.cpp:672 msgid "Vendor:" msgstr "Производитель:" -#: src/slic3r/GUI/ConfigWizard.cpp:643 +#: src/slic3r/GUI/ConfigWizard.cpp:673 msgid "Profile:" msgstr "Профиль:" -#: src/slic3r/GUI/ConfigWizard.cpp:720 src/slic3r/GUI/ConfigWizard.cpp:892 -#: src/slic3r/GUI/ConfigWizard.cpp:952 src/slic3r/GUI/ConfigWizard.cpp:1088 +#: src/slic3r/GUI/ConfigWizard.cpp:750 src/slic3r/GUI/ConfigWizard.cpp:938 +#: src/slic3r/GUI/ConfigWizard.cpp:1024 src/slic3r/GUI/ConfigWizard.cpp:1163 msgid "(All)" msgstr "(Все)" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:754 src/slic3r/GUI/ConfigWizard.cpp:1165 +msgid "(Templates)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:789 #, boost-format msgid "" -"%1% marked with * are not compatible with some installed " -"printers." +"%1% visible for (\"Template\") printer are universal profiles " +"available for all printers. These might not be compatible with your printer." msgstr "" -"%1% помеченные знаком *, не несовместимы с некоторыми " -"установленными принтерами." -#: src/slic3r/GUI/ConfigWizard.cpp:752 src/slic3r/GUI/ConfigWizard.cpp:2043 -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filaments" msgstr "Пластиковые нити (прутки)" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 msgid "SLA materials" msgstr "SLA материалы (фотополимерная смола)" -#: src/slic3r/GUI/ConfigWizard.cpp:755 +#: src/slic3r/GUI/ConfigWizard.cpp:791 +#, boost-format +msgid "" +"%1% marked with * are not compatible with some installed " +"printers." +msgstr "" +"%1% помеченные знаком *, не несовместимы с некоторыми " +"установленными принтерами." + +#: src/slic3r/GUI/ConfigWizard.cpp:794 #, boost-format msgid "All installed printers are compatible with the selected %1%." msgstr "Все установленные принтеры совместимы с выбранным прутком %1%." -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/libslic3r/Preset.cpp:1342 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/libslic3r/Preset.cpp:1481 msgid "filament" msgstr "пруток" -#: src/slic3r/GUI/ConfigWizard.cpp:778 +#: src/slic3r/GUI/ConfigWizard.cpp:818 msgid "" "Only the following installed printers are compatible with the selected " "filaments" @@ -790,7 +879,7 @@ msgstr "" "Только следующие установленные принтеры совместимы с выбранными пластиковыми " "нитями." -#: src/slic3r/GUI/ConfigWizard.cpp:779 +#: src/slic3r/GUI/ConfigWizard.cpp:819 msgid "" "Only the following installed printers are compatible with the selected SLA " "materials" @@ -798,35 +887,53 @@ msgstr "" "Только следующие установленные принтеры совместимы с выбранными SLA " "материалами" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1213 +msgid "" +"You have selected template filament. Please note that these filaments are " +"available for all printers but are NOT certain to be compatible with your " +"printer. Do you still wish to have this filament selected?\n" +"(This message won't be displayed again.)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1214 src/slic3r/GUI/ConfigWizard.cpp:2720 +#: src/slic3r/GUI/ConfigWizard.cpp:2860 src/slic3r/GUI/DoubleSlider.cpp:2591 +#: src/slic3r/GUI/DoubleSlider.cpp:2612 src/slic3r/GUI/GUI.cpp:245 +#: src/slic3r/GUI/GUI_App.cpp:3458 src/slic3r/GUI/UpdateDialogs.cpp:204 +#: src/slic3r/GUI/UpdateDialogs.cpp:212 src/slic3r/GUI/UpdateDialogs.cpp:217 +#: src/slic3r/GUI/UpdateDialogs.cpp:222 src/slic3r/GUI/UpdateDialogs.cpp:229 +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +msgid "Notice" +msgstr "Примечание" + +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer Setup" msgstr "Настройка пользовательского принтера" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer" msgstr "Пользовательский принтер" -#: src/slic3r/GUI/ConfigWizard.cpp:1177 +#: src/slic3r/GUI/ConfigWizard.cpp:1264 msgid "Define a custom printer profile" msgstr "Задать имя пользовательского профиля" -#: src/slic3r/GUI/ConfigWizard.cpp:1179 +#: src/slic3r/GUI/ConfigWizard.cpp:1265 msgid "Custom profile name:" msgstr "Имя пользовательского профиля:" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Automatic updates" msgstr "Автоматическое обновление" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Updates" msgstr "Обновления" -#: src/slic3r/GUI/ConfigWizard.cpp:1214 +#: src/slic3r/GUI/ConfigWizard.cpp:1290 msgid "Check for application updates" msgstr "Проверка обновлений" -#: src/slic3r/GUI/ConfigWizard.cpp:1218 +#: src/slic3r/GUI/ConfigWizard.cpp:1294 #, c-format, boost-format msgid "" "If enabled, %s checks for new application versions online. When a new " @@ -839,11 +946,11 @@ msgstr "" "время работы программы). Автоматическая установка не производится. Вы " "увидите только уведомление." -#: src/slic3r/GUI/ConfigWizard.cpp:1224 src/slic3r/GUI/Preferences.cpp:175 +#: src/slic3r/GUI/ConfigWizard.cpp:1300 src/slic3r/GUI/Preferences.cpp:306 msgid "Update built-in Presets automatically" msgstr "Обновлять встроенные профили автоматически" -#: src/slic3r/GUI/ConfigWizard.cpp:1228 +#: src/slic3r/GUI/ConfigWizard.cpp:1304 #, c-format, boost-format msgid "" "If enabled, %s downloads updates of built-in system presets in the " @@ -856,7 +963,7 @@ msgstr "" "Когда новые профили становятся доступны, они предлагаются при запуске " "приложения." -#: src/slic3r/GUI/ConfigWizard.cpp:1231 +#: src/slic3r/GUI/ConfigWizard.cpp:1307 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." @@ -864,7 +971,7 @@ msgstr "" "Обновления никогда не применяются без согласия пользователя и никогда не " "перезаписывают пользовательские настройки." -#: src/slic3r/GUI/ConfigWizard.cpp:1236 +#: src/slic3r/GUI/ConfigWizard.cpp:1312 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." @@ -872,17 +979,61 @@ msgstr "" "Кроме того, перед обновлением создаётся резервная копия всей конфигурации " "(снапшот)." -#: src/slic3r/GUI/ConfigWizard.cpp:1243 src/slic3r/GUI/GUI_Factories.cpp:726 -#: src/slic3r/GUI/Plater.cpp:3582 +#: src/slic3r/GUI/ConfigWizard.cpp:1361 src/slic3r/GUI/Preferences.cpp:1076 +msgid "Download path" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1366 src/slic3r/GUI/FirmwareDialog.cpp:815 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:300 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +msgid "Browse" +msgstr "Обзор" + +#: src/slic3r/GUI/ConfigWizard.cpp:1371 +msgid "Choose folder:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads from URL" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1417 +msgid "Allow built-in downloader" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1424 +#, c-format, boost-format +msgid "" +"If enabled, %s registers to start on custom URL on www.printables.com. You " +"will be able to use button with %s logo to open models in this %s. The model " +"will be downloaded into folder you choose bellow." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1431 +msgid "" +"On Linux systems the process of registration also creates desktop " +"integration files for this version of application." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1458 +msgid "Chosen directory for downloads does not Exists." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1545 src/slic3r/GUI/GUI_Factories.cpp:810 +#: src/slic3r/GUI/Plater.cpp:3732 msgid "Reload from disk" msgstr "Перезагрузить с диска" -#: src/slic3r/GUI/ConfigWizard.cpp:1246 +#: src/slic3r/GUI/ConfigWizard.cpp:1548 msgid "" "Export full pathnames of models and parts sources into 3mf and amf files" msgstr "При экспорте в 3mf и amf, сохранять полные пути к исходным файлам" -#: src/slic3r/GUI/ConfigWizard.cpp:1250 +#: src/slic3r/GUI/ConfigWizard.cpp:1552 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked.\n" @@ -894,23 +1045,23 @@ msgstr "" "В противном случае, будет предложено выбрать каждый файл с помощью " "диалогового окна открытия файла." -#: src/slic3r/GUI/ConfigWizard.cpp:1259 +#: src/slic3r/GUI/ConfigWizard.cpp:1561 msgid "Files association" msgstr "Ассоциация файлов" -#: src/slic3r/GUI/ConfigWizard.cpp:1261 src/slic3r/GUI/Preferences.cpp:157 +#: src/slic3r/GUI/ConfigWizard.cpp:1563 src/slic3r/GUI/Preferences.cpp:292 msgid "Associate .3mf files to PrusaSlicer" msgstr "Ассоциировать файлы .3mf с PrusaSlicer" -#: src/slic3r/GUI/ConfigWizard.cpp:1262 src/slic3r/GUI/Preferences.cpp:164 +#: src/slic3r/GUI/ConfigWizard.cpp:1564 src/slic3r/GUI/Preferences.cpp:297 msgid "Associate .stl files to PrusaSlicer" msgstr "Ассоциировать файлы .stl с PrusaSlicer" -#: src/slic3r/GUI/ConfigWizard.cpp:1272 +#: src/slic3r/GUI/ConfigWizard.cpp:1574 msgid "View mode" msgstr "Режим просмотра" -#: src/slic3r/GUI/ConfigWizard.cpp:1274 +#: src/slic3r/GUI/ConfigWizard.cpp:1576 msgid "" "PrusaSlicer's user interfaces comes in three variants:\n" "Simple, Advanced, and Expert.\n" @@ -924,82 +1075,96 @@ msgstr "" "3D-печати. Два других предлагают более тонкую расширенную настройку. Они " "подходят для продвинутых и опытных пользователей." -#: src/slic3r/GUI/ConfigWizard.cpp:1279 +#: src/slic3r/GUI/ConfigWizard.cpp:1581 msgid "Simple mode" msgstr "Простой" -#: src/slic3r/GUI/ConfigWizard.cpp:1280 +#: src/slic3r/GUI/ConfigWizard.cpp:1582 msgid "Advanced mode" msgstr "Расширенный" -#: src/slic3r/GUI/ConfigWizard.cpp:1281 +#: src/slic3r/GUI/ConfigWizard.cpp:1583 msgid "Expert mode" msgstr "Продвинутый" -#: src/slic3r/GUI/ConfigWizard.cpp:1287 +#: src/slic3r/GUI/ConfigWizard.cpp:1596 msgid "The size of the object can be specified in inches" msgstr "Размер модели может быть указан в дюймах" -#: src/slic3r/GUI/ConfigWizard.cpp:1288 +#: src/slic3r/GUI/ConfigWizard.cpp:1597 msgid "Use inches" msgstr "Использовать дюймы" -#: src/slic3r/GUI/ConfigWizard.cpp:1322 +#: src/slic3r/GUI/ConfigWizard.cpp:1617 msgid "Other Vendors" msgstr "Другие производители" -#: src/slic3r/GUI/ConfigWizard.cpp:1326 +#: src/slic3r/GUI/ConfigWizard.cpp:1621 #, c-format, boost-format msgid "Pick another vendor supported by %s" msgstr "Выберите другого производителя, поддерживающего %s" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 msgid "Firmware Type" msgstr "Тип прошивки" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2366 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 src/slic3r/GUI/Tab.cpp:2354 msgid "Firmware" msgstr "Прошивка" -#: src/slic3r/GUI/ConfigWizard.cpp:1361 +#: src/slic3r/GUI/ConfigWizard.cpp:1658 msgid "Choose the type of firmware used by your printer." msgstr "Выберите тип прошивки вашего принтера." -#: src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/ConfigWizard.cpp:1707 src/slic3r/GUI/ConfigWizard.cpp:1778 +#: src/slic3r/GUI/ConfigWizard.cpp:1783 src/slic3r/GUI/ConfigWizard.cpp:1788 +#: src/slic3r/GUI/Field.cpp:258 src/slic3r/GUI/Field.cpp:328 +#: src/slic3r/GUI/Field.cpp:1585 src/slic3r/GUI/GUI_ObjectLayers.cpp:435 +msgid "Invalid numeric input." +msgstr "Неправильное числовое значение." + +#: src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape and Size" msgstr "Форма и размеры стола" -#: src/slic3r/GUI/ConfigWizard.cpp:1399 +#: src/slic3r/GUI/ConfigWizard.cpp:1735 msgid "Set the shape of your printer's bed." msgstr "Задайте форму и размеры вашего стола." -#: src/slic3r/GUI/ConfigWizard.cpp:1433 src/slic3r/GUI/Field.cpp:255 -#: src/slic3r/GUI/Field.cpp:324 src/slic3r/GUI/Field.cpp:1561 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:435 -msgid "Invalid numeric input." -msgstr "Неправильное числовое значение." +#: src/slic3r/GUI/ConfigWizard.cpp:1755 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1610 +msgid "Build Volume" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1758 +msgid "Set vertical size of your printer." +msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1795 +msgid "Max print height:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Filament and Nozzle Diameters" msgstr "Диаметр прутка и сопла" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Print Diameters" msgstr "Диаметры печати" -#: src/slic3r/GUI/ConfigWizard.cpp:1472 +#: src/slic3r/GUI/ConfigWizard.cpp:1828 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "Введите диаметр сопла." -#: src/slic3r/GUI/ConfigWizard.cpp:1475 +#: src/slic3r/GUI/ConfigWizard.cpp:1831 msgid "Nozzle Diameter:" msgstr "Диаметр сопла:" -#: src/slic3r/GUI/ConfigWizard.cpp:1485 +#: src/slic3r/GUI/ConfigWizard.cpp:1841 msgid "Enter the diameter of your filament." msgstr "Введите диаметр прутка." -#: src/slic3r/GUI/ConfigWizard.cpp:1486 +#: src/slic3r/GUI/ConfigWizard.cpp:1842 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." @@ -1007,37 +1172,38 @@ msgstr "" "Необходима хорошая точность, поэтому используйте штангенциркуль и выполните " "несколько измерений вдоль прутка, а затем вычислите среднее значение." -#: src/slic3r/GUI/ConfigWizard.cpp:1489 +#: src/slic3r/GUI/ConfigWizard.cpp:1845 msgid "Filament Diameter:" msgstr "Диаметр прутка:" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Nozzle and Bed Temperatures" msgstr "Температуры сопла и стола" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Temperatures" msgstr "Температура" -#: src/slic3r/GUI/ConfigWizard.cpp:1563 +#: src/slic3r/GUI/ConfigWizard.cpp:1919 msgid "Enter the temperature needed for extruding your filament." msgstr "Введите температуру, требуемую для экструзии прутка." -#: src/slic3r/GUI/ConfigWizard.cpp:1564 +#: src/slic3r/GUI/ConfigWizard.cpp:1920 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "Как правило для PLA это 160-230 °C, а для ABS 215-250 °C." -#: src/slic3r/GUI/ConfigWizard.cpp:1567 +#: src/slic3r/GUI/ConfigWizard.cpp:1923 msgid "Extrusion Temperature:" msgstr "Температура экструзии:" -#: src/slic3r/GUI/ConfigWizard.cpp:1568 src/slic3r/GUI/ConfigWizard.cpp:1582 -#: src/libslic3r/PrintConfig.cpp:418 src/libslic3r/PrintConfig.cpp:1211 -#: src/libslic3r/PrintConfig.cpp:1266 src/libslic3r/PrintConfig.cpp:2842 +#: src/slic3r/GUI/ConfigWizard.cpp:1924 src/slic3r/GUI/ConfigWizard.cpp:1938 +#: src/libslic3r/PrintConfig.cpp:437 src/libslic3r/PrintConfig.cpp:1271 +#: src/libslic3r/PrintConfig.cpp:1326 src/libslic3r/PrintConfig.cpp:2930 +#: src/libslic3r/PrintConfig.cpp:3689 msgid "°C" msgstr "°C" -#: src/slic3r/GUI/ConfigWizard.cpp:1577 +#: src/slic3r/GUI/ConfigWizard.cpp:1933 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." @@ -1045,7 +1211,7 @@ msgstr "" "Введите температуру стола, необходимую для того, чтобы пруток прилипал к " "нему." -#: src/slic3r/GUI/ConfigWizard.cpp:1578 +#: src/slic3r/GUI/ConfigWizard.cpp:1934 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." @@ -1053,23 +1219,23 @@ msgstr "" "Как правило для PLA это 60 °C, а для ABS 110 °С. Если у вас не подогреваемый " "стол, установите 0." -#: src/slic3r/GUI/ConfigWizard.cpp:1581 +#: src/slic3r/GUI/ConfigWizard.cpp:1937 msgid "Bed Temperature:" msgstr "Температура стола:" -#: src/slic3r/GUI/ConfigWizard.cpp:2043 src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Materials" msgstr "SLA материалы (фотополимерная смола)" -#: src/slic3r/GUI/ConfigWizard.cpp:2097 +#: src/slic3r/GUI/ConfigWizard.cpp:2464 msgid "FFF Technology Printers" msgstr "Принтеры, печатающие по технологии методом наплавления нитей (FFF)" -#: src/slic3r/GUI/ConfigWizard.cpp:2102 +#: src/slic3r/GUI/ConfigWizard.cpp:2469 msgid "SLA Technology Printers" msgstr "Принтеры, печатающие по технологии масочной ЖК-стереолитографии (SLA)" -#: src/slic3r/GUI/ConfigWizard.cpp:2338 +#: src/slic3r/GUI/ConfigWizard.cpp:2718 #, boost-format msgid "" "Following printer profiles has no default filament: %1%Please select one " @@ -1078,7 +1244,7 @@ msgstr "" "В следующих профилях принтера отсутствует пруток по умолчанию: " "%1%Пожалуйста, выберите его вручную." -#: src/slic3r/GUI/ConfigWizard.cpp:2339 +#: src/slic3r/GUI/ConfigWizard.cpp:2719 #, boost-format msgid "" "Following printer profiles has no default material: %1%Please select one " @@ -1087,38 +1253,32 @@ msgstr "" "В следующих профилях принтера отсутствует материал по умолчанию: " "%1%Пожалуйста, выберите его вручную." -#: src/slic3r/GUI/ConfigWizard.cpp:2340 src/slic3r/GUI/ConfigWizard.cpp:2438 -#: src/slic3r/GUI/DoubleSlider.cpp:2522 src/slic3r/GUI/DoubleSlider.cpp:2543 -#: src/slic3r/GUI/GUI.cpp:232 -msgid "Notice" -msgstr "Примечание" - -#: src/slic3r/GUI/ConfigWizard.cpp:2459 +#: src/slic3r/GUI/ConfigWizard.cpp:2883 msgid "The following FFF printer models have no filament selected:" msgstr "В следующих моделях FFF принтеров не выбран пруток:" -#: src/slic3r/GUI/ConfigWizard.cpp:2463 +#: src/slic3r/GUI/ConfigWizard.cpp:2887 msgid "Do you want to select default filaments for these FFF printer models?" msgstr "Выбрать прутки по умолчанию для этих моделей FFF принтеров?" -#: src/slic3r/GUI/ConfigWizard.cpp:2477 +#: src/slic3r/GUI/ConfigWizard.cpp:2901 msgid "The following SLA printer models have no materials selected:" msgstr "В следующих моделях SLA принтеров не выбрана фотополимерная смола:" -#: src/slic3r/GUI/ConfigWizard.cpp:2481 +#: src/slic3r/GUI/ConfigWizard.cpp:2905 msgid "Do you want to select default SLA materials for these printer models?" msgstr "" "Выбрать фотополимерный смолы по умолчанию для этих моделей SLA принтеров?" -#: src/slic3r/GUI/ConfigWizard.cpp:2523 +#: src/slic3r/GUI/ConfigWizard.cpp:2947 msgid "Configuration is edited in ConfigWizard" msgstr "Редактирование конфигурации с помощью мастера настроек" -#: src/slic3r/GUI/ConfigWizard.cpp:2566 +#: src/slic3r/GUI/ConfigWizard.cpp:3000 msgid "All user presets will be deleted." msgstr "Все пользовательские профили будут удалены." -#: src/slic3r/GUI/ConfigWizard.cpp:2596 +#: src/slic3r/GUI/ConfigWizard.cpp:3037 msgid "A new vendor was installed and one of its printers will be activated" msgid_plural "" "New vendors were installed and one of theirs printers will be activated" @@ -1129,100 +1289,105 @@ msgstr[1] "" msgstr[2] "" "Новые производители установлены, и один из их принтеров будет активирован." -#: src/slic3r/GUI/ConfigWizard.cpp:2625 +#: src/slic3r/GUI/ConfigWizard.cpp:3069 msgid "Do you want to continue changing the configuration?" msgstr "Вы хотите внести изменение в конфигурацию?" -#: src/slic3r/GUI/ConfigWizard.cpp:2691 +#: src/slic3r/GUI/ConfigWizard.cpp:3136 msgid "A new Printer was installed and it will be activated." msgstr "Новый принтер установлен и будет активирован." -#: src/slic3r/GUI/ConfigWizard.cpp:2696 +#: src/slic3r/GUI/ConfigWizard.cpp:3141 msgid "Some Printers were uninstalled." msgstr "Было удалено несколько принтеров." -#: src/slic3r/GUI/ConfigWizard.cpp:2717 +#: src/slic3r/GUI/ConfigWizard.cpp:3162 msgid "A new filament was installed and it will be activated." msgstr "Новая пластиковая нить установлена и будет активирована." -#: src/slic3r/GUI/ConfigWizard.cpp:2718 +#: src/slic3r/GUI/ConfigWizard.cpp:3163 msgid "A new SLA material was installed and it will be activated." msgstr "Новый SLA материал установлен и будет активирован." -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some filaments were uninstalled." msgstr "Некоторые пластиковые нити были удалены." -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some SLA materials were uninstalled." msgstr "Некоторые SLA материалы были удалены." -#: src/slic3r/GUI/ConfigWizard.cpp:2773 +#: src/slic3r/GUI/ConfigWizard.cpp:3218 msgid "Custom printer was installed and it will be activated." msgstr "Пользовательский принтер установлен и будет активирован." -#: src/slic3r/GUI/ConfigWizard.cpp:2858 +#: src/slic3r/GUI/ConfigWizard.cpp:3306 msgid "Select all standard printers" msgstr "Выбрать все стандартные принтеры" -#: src/slic3r/GUI/ConfigWizard.cpp:2861 +#: src/slic3r/GUI/ConfigWizard.cpp:3309 msgid "< &Back" msgstr "< &Назад" -#: src/slic3r/GUI/ConfigWizard.cpp:2862 +#: src/slic3r/GUI/ConfigWizard.cpp:3310 msgid "&Next >" msgstr "&Далее >" -#: src/slic3r/GUI/ConfigWizard.cpp:2863 +#: src/slic3r/GUI/ConfigWizard.cpp:3311 msgid "&Finish" msgstr "&Завершить" -#: src/slic3r/GUI/ConfigWizard.cpp:2864 -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:3312 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:657 +#: src/slic3r/GUI/FileArchiveDialog.cpp:274 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 #: src/slic3r/GUI/FirmwareDialog.cpp:153 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1593 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1365 #: src/slic3r/GUI/ProgressStatusBar.cpp:26 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:93 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:879 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:96 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:907 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1606 msgid "Cancel" msgstr "Отмена" -#: src/slic3r/GUI/ConfigWizard.cpp:2884 +#: src/slic3r/GUI/ConfigWizard.cpp:3332 msgid "Prusa FFF Technology Printers" msgstr "" "Принтеры Prusa, печатающие по технологии методом наплавления нитей (FFF)" -#: src/slic3r/GUI/ConfigWizard.cpp:2892 +#: src/slic3r/GUI/ConfigWizard.cpp:3340 msgid "Prusa MSLA Technology Printers" msgstr "" "Принтеры Prusa, печатающие по технологии масочной ЖК-стереолитографии (MSLA)" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filament Profiles Selection" msgstr "Выбор профилей прутка" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 src/slic3r/GUI/ConfigWizard.cpp:2915 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 src/slic3r/GUI/ConfigWizard.cpp:3363 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Type:" msgstr "Тип:" -#: src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Material Profiles Selection" msgstr "Выбор профилей фотополимерной смолы (SLA)" -#: src/slic3r/GUI/ConfigWizard.cpp:3036 +#: src/slic3r/GUI/ConfigWizard.cpp:3486 msgid "Configuration Assistant" msgstr "Помощник по настройке" -#: src/slic3r/GUI/ConfigWizard.cpp:3037 +#: src/slic3r/GUI/ConfigWizard.cpp:3487 msgid "Configuration &Assistant" msgstr "Помощник по &настройке" -#: src/slic3r/GUI/ConfigWizard.cpp:3039 +#: src/slic3r/GUI/ConfigWizard.cpp:3489 msgid "Configuration Wizard" msgstr "Мастер настройки" -#: src/slic3r/GUI/ConfigWizard.cpp:3040 +#: src/slic3r/GUI/ConfigWizard.cpp:3490 msgid "Configuration &Wizard" msgstr "&Мастер настройки" @@ -1240,7 +1405,7 @@ msgstr "" "Не удалось выполнить интеграцию с рабочим столом - не удалось найти " "исполняемый файл." -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:378 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:383 msgid "" "Performing desktop integration failed because the application directory was " "not found." @@ -1248,7 +1413,7 @@ msgstr "" "Не удалось выполнить интеграцию с рабочим столом - не найден каталог " "приложения." -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:419 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:423 msgid "" "Performing desktop integration failed - could not create Gcodeviewer desktop " "file. PrusaSlicer desktop file was probably created successfully." @@ -1257,12 +1422,29 @@ msgstr "" "ссылку на Gcodeviewer на рабочем столе. Ссылка на PrusaSlicer, вероятно, " "была успешно создана на рабочем столе." -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:459 -#: src/slic3r/GUI/GUI_App.cpp:2245 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:472 +msgid "" +"Performing downloader desktop integration failed - boost::filesystem::" +"canonical did not return appimage path." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:484 +msgid "" +"Performing downloader desktop integration failed - Could not find executable." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:602 +msgid "" +"Performing downloader desktop integration failed because the application " +"directory was not found." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:626 +#: src/slic3r/GUI/GUI_App.cpp:2407 msgid "Desktop Integration" msgstr "Интеграция с рабочим столом" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:466 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:633 msgid "" "Desktop Integration sets this binary to be searchable by the system.\n" "\n" @@ -1273,13 +1455,13 @@ msgstr "" "\n" "Нажмите «Выполнить», чтобы продолжить." -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:480 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:647 msgid "Perform" msgstr "Выполнить" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1342 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:653 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/KBShortcutsDialog.cpp:106 +#: src/slic3r/GUI/MainFrame.cpp:1426 msgid "Undo" msgstr "Отмена действия" @@ -1287,19 +1469,19 @@ msgstr "Отмена действия" msgid "Place bearings in slots and resume printing" msgstr "Поместите в посадочное место необходимую деталь и возобновите печать" -#: src/slic3r/GUI/DoubleSlider.cpp:1379 +#: src/slic3r/GUI/DoubleSlider.cpp:1448 msgid "One layer mode" msgstr "Режим одного слоя" -#: src/slic3r/GUI/DoubleSlider.cpp:1381 +#: src/slic3r/GUI/DoubleSlider.cpp:1450 msgid "Discard all custom changes" msgstr "Отменить все пользовательские изменения" -#: src/slic3r/GUI/DoubleSlider.cpp:1385 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:1454 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to move" msgstr "Перейти к заданному перемещению" -#: src/slic3r/GUI/DoubleSlider.cpp:1388 +#: src/slic3r/GUI/DoubleSlider.cpp:1457 #, c-format, boost-format msgid "" "Jump to height %s\n" @@ -1310,7 +1492,7 @@ msgstr "" "Задать режимы линейки\n" "или задать последовательность экструдеров для всей печати" -#: src/slic3r/GUI/DoubleSlider.cpp:1391 +#: src/slic3r/GUI/DoubleSlider.cpp:1460 #, c-format, boost-format msgid "" "Jump to height %s\n" @@ -1319,16 +1501,16 @@ msgstr "" "Перейти к заданной высоте %s\n" "или задать режимы линейки" -#: src/slic3r/GUI/DoubleSlider.cpp:1396 +#: src/slic3r/GUI/DoubleSlider.cpp:1465 msgid "Edit current color - Right click the colored slider segment" msgstr "" "Изменить текущий цвет - Правая кнопка мыши по цветному сегменту ползунка" -#: src/slic3r/GUI/DoubleSlider.cpp:1398 +#: src/slic3r/GUI/DoubleSlider.cpp:1467 msgid "This is wipe tower layer" msgstr "Это слой черновой башни" -#: src/slic3r/GUI/DoubleSlider.cpp:1408 +#: src/slic3r/GUI/DoubleSlider.cpp:1477 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing sequentually." @@ -1337,15 +1519,15 @@ msgstr "" "При последовательной печати, невозможно применение какого-либо " "пользовательского G-кода." -#: src/slic3r/GUI/DoubleSlider.cpp:1412 +#: src/slic3r/GUI/DoubleSlider.cpp:1481 msgid "Print mode" msgstr "Режим печати" -#: src/slic3r/GUI/DoubleSlider.cpp:1426 +#: src/slic3r/GUI/DoubleSlider.cpp:1495 msgid "Add extruder change - Left click" msgstr "Добавить маркер смены экструдера - Левая кнопка мыши" -#: src/slic3r/GUI/DoubleSlider.cpp:1428 +#: src/slic3r/GUI/DoubleSlider.cpp:1497 msgid "" "Add color change - Left click for predefined color or Shift + Left click for " "custom color selection" @@ -1353,23 +1535,23 @@ msgstr "" "Добавить маркер смены цвета - Левая кнопка мыши для цвета из списка цветов " "по умолчанию или Shift + Левая кнопка мыши для выбора своего цвета" -#: src/slic3r/GUI/DoubleSlider.cpp:1430 +#: src/slic3r/GUI/DoubleSlider.cpp:1499 msgid "Add color change - Left click" msgstr "Добавить маркер смены цвета - Левая кнопка мыши" -#: src/slic3r/GUI/DoubleSlider.cpp:1431 +#: src/slic3r/GUI/DoubleSlider.cpp:1500 msgid "or press \"+\" key" msgstr "или клавиша \"+\"" -#: src/slic3r/GUI/DoubleSlider.cpp:1433 +#: src/slic3r/GUI/DoubleSlider.cpp:1502 msgid "Add another code - Ctrl + Left click" msgstr "Для добавления другого кода - Ctrl + левая кнопка мыши" -#: src/slic3r/GUI/DoubleSlider.cpp:1434 +#: src/slic3r/GUI/DoubleSlider.cpp:1503 msgid "Add another code - Right click" msgstr "Для добавления другого кода - Правая кнопка мыши" -#: src/slic3r/GUI/DoubleSlider.cpp:1440 +#: src/slic3r/GUI/DoubleSlider.cpp:1509 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing " @@ -1381,40 +1563,40 @@ msgstr "" "пользовательского G-кода.\n" "Этот код не будет обрабатываться во время генерации G-кода." -#: src/slic3r/GUI/DoubleSlider.cpp:1458 +#: src/slic3r/GUI/DoubleSlider.cpp:1527 msgid "continue" msgstr "продолжить" -#: src/slic3r/GUI/DoubleSlider.cpp:1466 +#: src/slic3r/GUI/DoubleSlider.cpp:1535 #, boost-format msgid "Color change (\"%1%\")" msgstr "Маркер смены цвета (\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1467 +#: src/slic3r/GUI/DoubleSlider.cpp:1536 #, boost-format msgid "Color change (\"%1%\") for Extruder %2%" msgstr "Смена цвета (\"%1%\") для экструдера %2%" -#: src/slic3r/GUI/DoubleSlider.cpp:1469 +#: src/slic3r/GUI/DoubleSlider.cpp:1538 #, boost-format msgid "Pause print (\"%1%\")" msgstr "Пауза печати (\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1471 +#: src/slic3r/GUI/DoubleSlider.cpp:1540 #, boost-format msgid "Custom template (\"%1%\")" msgstr "Пользовательский шаблон (\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1473 +#: src/slic3r/GUI/DoubleSlider.cpp:1542 #, boost-format msgid "Extruder (tool) is changed to Extruder \"%1%\"" msgstr "Экструдер (инструмент) заменён на экструдер \"%1%\"" -#: src/slic3r/GUI/DoubleSlider.cpp:1480 +#: src/slic3r/GUI/DoubleSlider.cpp:1549 msgid "Note" msgstr "Примечание" -#: src/slic3r/GUI/DoubleSlider.cpp:1482 +#: src/slic3r/GUI/DoubleSlider.cpp:1551 msgid "" "G-code associated to this tick mark is in a conflict with print mode.\n" "Editing it will cause changes of Slider data." @@ -1422,7 +1604,7 @@ msgstr "" "G-код, связанный с этим маркером, конфликтует с режимом печати.\n" "Его редактирование приведёт к изменениям данных ползунка." -#: src/slic3r/GUI/DoubleSlider.cpp:1485 +#: src/slic3r/GUI/DoubleSlider.cpp:1554 msgid "" "There is a color change for extruder that won't be used till the end of " "print job.\n" @@ -1432,7 +1614,7 @@ msgstr "" "конца печати.\n" "Этот код не будет обрабатываться во время генерации G-кода." -#: src/slic3r/GUI/DoubleSlider.cpp:1488 +#: src/slic3r/GUI/DoubleSlider.cpp:1557 msgid "" "There is an extruder change set to the same extruder.\n" "This code won't be processed during G-code generation." @@ -1440,7 +1622,7 @@ msgstr "" "Существующий экструдер заменён на тот же экструдер.\n" "Этот код не будет обрабатываться во время генерации G-кода." -#: src/slic3r/GUI/DoubleSlider.cpp:1491 +#: src/slic3r/GUI/DoubleSlider.cpp:1560 msgid "" "There is a color change for extruder that has not been used before.\n" "Check your settings to avoid redundant color changes." @@ -1448,213 +1630,215 @@ msgstr "" "Произведена смена цвета для экструдера, который ранее не использовался.\n" "Проверьте настройки, чтобы избежать лишней смены цвета." -#: src/slic3r/GUI/DoubleSlider.cpp:1496 +#: src/slic3r/GUI/DoubleSlider.cpp:1565 msgid "Delete tick mark - Left click or press \"-\" key" msgstr "" "Удалить маркер - Левая кнопка мыши \n" "или клавиша \"-\"" -#: src/slic3r/GUI/DoubleSlider.cpp:1498 +#: src/slic3r/GUI/DoubleSlider.cpp:1567 msgid "Edit tick mark - Ctrl + Left click" msgstr "Редактировать маркер - Ctrl + левая кнопка мыши" -#: src/slic3r/GUI/DoubleSlider.cpp:1499 +#: src/slic3r/GUI/DoubleSlider.cpp:1568 msgid "Edit tick mark - Right click" msgstr "Редактировать маркер - Правая кнопка мыши" -#: src/slic3r/GUI/DoubleSlider.cpp:1602 src/slic3r/GUI/DoubleSlider.cpp:1633 -#: src/slic3r/GUI/GUI_Factories.cpp:778 +#: src/slic3r/GUI/DoubleSlider.cpp:1671 src/slic3r/GUI/DoubleSlider.cpp:1702 +#: src/slic3r/GUI/GUI_Factories.cpp:862 #, c-format, boost-format msgid "Extruder %d" msgstr "Экструдер %d" -#: src/slic3r/GUI/DoubleSlider.cpp:1603 src/slic3r/GUI/GUI_Factories.cpp:779 +#: src/slic3r/GUI/DoubleSlider.cpp:1672 src/slic3r/GUI/GUI_Factories.cpp:863 msgid "active" msgstr "активный" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 msgid "Switch code to Change extruder" msgstr "Переключить код на смену экструдера" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Change extruder" msgstr "Маркер смены экструдера" -#: src/slic3r/GUI/DoubleSlider.cpp:1613 +#: src/slic3r/GUI/DoubleSlider.cpp:1682 msgid "Change extruder (N/A)" msgstr "Маркер смены экструдера (Нет данных)" -#: src/slic3r/GUI/DoubleSlider.cpp:1615 src/slic3r/GUI/GUI_Factories.cpp:787 +#: src/slic3r/GUI/DoubleSlider.cpp:1684 src/slic3r/GUI/GUI_Factories.cpp:871 msgid "Use another extruder" msgstr "Использовать другой экструдер" -#: src/slic3r/GUI/DoubleSlider.cpp:1634 +#: src/slic3r/GUI/DoubleSlider.cpp:1703 msgid "used" msgstr "используется" -#: src/slic3r/GUI/DoubleSlider.cpp:1642 +#: src/slic3r/GUI/DoubleSlider.cpp:1711 #, boost-format msgid "Switch code to Color change (%1%) for:" msgstr "Переключить код на смену цвета (%1%) для:" -#: src/slic3r/GUI/DoubleSlider.cpp:1643 +#: src/slic3r/GUI/DoubleSlider.cpp:1712 #, boost-format msgid "Add color change (%1%) for:" msgstr "Добавить маркер смены цвета (%1%) для:" -#: src/slic3r/GUI/DoubleSlider.cpp:1968 +#: src/slic3r/GUI/DoubleSlider.cpp:2037 msgid "Add color change" msgstr "Добавить маркер смены цвета" -#: src/slic3r/GUI/DoubleSlider.cpp:1979 +#: src/slic3r/GUI/DoubleSlider.cpp:2048 msgid "Add pause print" msgstr "Добавить маркер паузы печати" -#: src/slic3r/GUI/DoubleSlider.cpp:1983 +#: src/slic3r/GUI/DoubleSlider.cpp:2052 msgid "Add custom template" msgstr "Добавить пользовательский шаблон" -#: src/slic3r/GUI/DoubleSlider.cpp:1986 +#: src/slic3r/GUI/DoubleSlider.cpp:2055 msgid "Add custom G-code" msgstr "Добавить маркер пользовательского G-кода" -#: src/slic3r/GUI/DoubleSlider.cpp:2004 +#: src/slic3r/GUI/DoubleSlider.cpp:2073 msgid "Edit color" msgstr "Изменить цвет" -#: src/slic3r/GUI/DoubleSlider.cpp:2005 +#: src/slic3r/GUI/DoubleSlider.cpp:2074 msgid "Edit pause print message" msgstr "Изменить сообщение при приостановке печати" -#: src/slic3r/GUI/DoubleSlider.cpp:2006 +#: src/slic3r/GUI/DoubleSlider.cpp:2075 msgid "Edit custom G-code" msgstr "Изменить пользовательский G-код" -#: src/slic3r/GUI/DoubleSlider.cpp:2012 +#: src/slic3r/GUI/DoubleSlider.cpp:2081 msgid "Delete color change" msgstr "Удалить маркер смены цвета" -#: src/slic3r/GUI/DoubleSlider.cpp:2013 +#: src/slic3r/GUI/DoubleSlider.cpp:2082 msgid "Delete tool change" msgstr "Удалить маркер смены инструмента" -#: src/slic3r/GUI/DoubleSlider.cpp:2014 +#: src/slic3r/GUI/DoubleSlider.cpp:2083 msgid "Delete pause print" msgstr "Удалить паузу печати" -#: src/slic3r/GUI/DoubleSlider.cpp:2015 +#: src/slic3r/GUI/DoubleSlider.cpp:2084 msgid "Delete custom G-code" msgstr "Удалить пользовательский G-код" -#: src/slic3r/GUI/DoubleSlider.cpp:2025 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:2094 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to height" msgstr "Перейти на заданную высоту" -#: src/slic3r/GUI/DoubleSlider.cpp:2030 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 msgid "Hide ruler" msgstr "Скрыть линейку" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height" msgstr "Показывать высоту модели" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height on the ruler" msgstr "Показывать высоту модели на линейке" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time" msgstr "Показывать расчётное время печати" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time on the ruler" msgstr "Показать расчётное время печати на линейке" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Ruler mode" msgstr "Режим линейки" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Set ruler mode" msgstr "Задать режим линейки" -#: src/slic3r/GUI/DoubleSlider.cpp:2047 +#: src/slic3r/GUI/DoubleSlider.cpp:2116 msgid "Set extruder sequence for the entire print" msgstr "Задать последовательность экструдеров для всей печати" -#: src/slic3r/GUI/DoubleSlider.cpp:2051 +#: src/slic3r/GUI/DoubleSlider.cpp:2120 msgid "Set auto color changes" msgstr "Выполнить авторасстановку маркеров смены цвета" -#: src/slic3r/GUI/DoubleSlider.cpp:2086 +#: src/slic3r/GUI/DoubleSlider.cpp:2155 msgid "This action will cause deletion of all ticks on vertical slider." msgstr "" "Это действие приведет к удалению всех маркеров на вертикальном ползунке." -#: src/slic3r/GUI/DoubleSlider.cpp:2087 src/slic3r/GUI/Tab.cpp:1318 +#: src/slic3r/GUI/DoubleSlider.cpp:2156 src/slic3r/GUI/Tab.cpp:1263 msgid "" "This action is not revertible.\n" "Do you want to proceed?" msgstr "Это действие необратимо. Продолжить?" -#: src/slic3r/GUI/DoubleSlider.cpp:2088 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1133 src/slic3r/GUI/GUI.cpp:245 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:649 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:679 -#: src/slic3r/GUI/WipeTowerDialog.cpp:58 src/slic3r/GUI/WipeTowerDialog.cpp:443 +#: src/slic3r/GUI/DoubleSlider.cpp:2157 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:537 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1119 src/slic3r/GUI/GUI.cpp:258 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:721 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:751 +#: src/slic3r/GUI/WipeTowerDialog.cpp:60 src/slic3r/GUI/WipeTowerDialog.cpp:445 msgid "Warning" msgstr "Предупреждение" -#: src/slic3r/GUI/DoubleSlider.cpp:2216 +#: src/slic3r/GUI/DoubleSlider.cpp:2285 msgid "Enter custom G-code used on current layer" msgstr "Введите пользовательский G-код для текущего слоя" -#: src/slic3r/GUI/DoubleSlider.cpp:2217 +#: src/slic3r/GUI/DoubleSlider.cpp:2286 #, boost-format msgid "Custom G-code on current layer (%1% mm)." msgstr "Пользовательский G-код для текущего слоя (%1% мм)." -#: src/slic3r/GUI/DoubleSlider.cpp:2238 +#: src/slic3r/GUI/DoubleSlider.cpp:2307 msgid "Enter short message shown on Printer display when a print is paused" msgstr "" "Введите короткое сообщение, которое будет отображаться на экране принтера " "при паузе печати" -#: src/slic3r/GUI/DoubleSlider.cpp:2239 +#: src/slic3r/GUI/DoubleSlider.cpp:2308 #, boost-format msgid "Message for pause print on current layer (%1% mm)." msgstr "Сообщение при паузе печати на текущем слое (%1% мм)." -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the move you want to jump to" msgstr "Введите нужное перемещение, на который хотите перейти" -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the height you want to jump to" msgstr "Введите значение для перехода на нужную высоту" -#: src/slic3r/GUI/DoubleSlider.cpp:2515 +#: src/slic3r/GUI/DoubleSlider.cpp:2584 msgid "The last color change data was saved for a single extruder printing." msgstr "" "Последние данные об изменении цвета были сохранены для одноэкструдерной " "печати." -#: src/slic3r/GUI/DoubleSlider.cpp:2516 src/slic3r/GUI/DoubleSlider.cpp:2532 +#: src/slic3r/GUI/DoubleSlider.cpp:2585 src/slic3r/GUI/DoubleSlider.cpp:2601 msgid "The last color change data was saved for a multi extruder printing." msgstr "" "Последние данные об изменении цвета были сохранены для многоэкструдерной " "печати." -#: src/slic3r/GUI/DoubleSlider.cpp:2518 +#: src/slic3r/GUI/DoubleSlider.cpp:2587 msgid "Your current changes will delete all saved color changes." msgstr "" "Текущие изменения приведут к удалению всех сохранённых изменений цвета." -#: src/slic3r/GUI/DoubleSlider.cpp:2519 src/slic3r/GUI/DoubleSlider.cpp:2540 +#: src/slic3r/GUI/DoubleSlider.cpp:2588 src/slic3r/GUI/DoubleSlider.cpp:2609 msgid "Are you sure you want to continue?" msgstr "Вы действительно хотите продолжить?" -#: src/slic3r/GUI/DoubleSlider.cpp:2533 +#: src/slic3r/GUI/DoubleSlider.cpp:2602 msgid "" "Select YES if you want to delete all saved tool changes, \n" "NO if you want all tool changes switch to color changes, \n" @@ -1664,11 +1848,11 @@ msgstr "" "Если хотите переключить смену инструмента на изменение цвета, нажмите НЕТ \n" "или ОТМЕНА, чтобы оставить всё без изменений." -#: src/slic3r/GUI/DoubleSlider.cpp:2536 +#: src/slic3r/GUI/DoubleSlider.cpp:2605 msgid "Do you want to delete all saved tool changes?" msgstr "Удалить все сохранённые данные о смене инструмента?" -#: src/slic3r/GUI/DoubleSlider.cpp:2538 +#: src/slic3r/GUI/DoubleSlider.cpp:2607 msgid "" "The last color change data was saved for a multi extruder printing with tool " "changes for whole print." @@ -1676,20 +1860,34 @@ msgstr "" "Последние данные об изменении цвета были сохранены для многоэкструдерной " "печати со сменой инструмента для всей печати." -#: src/slic3r/GUI/DoubleSlider.cpp:2539 +#: src/slic3r/GUI/DoubleSlider.cpp:2608 msgid "Your current changes will delete all saved extruder (tool) changes." msgstr "" "Текущие изменения приведут к удалению всех сохранённых изменений экструдера " "(инструмента)." -#: src/slic3r/GUI/ExtraRenderers.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:538 -#: src/slic3r/GUI/GUI_ObjectList.cpp:550 src/slic3r/GUI/GUI_ObjectList.cpp:979 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4291 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:250 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:352 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:376 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:607 src/libslic3r/PrintConfig.cpp:800 +#: src/slic3r/GUI/Downloader.cpp:150 +#, boost-format +msgid "" +"Download won't start. Download URL doesn't point to https://files.printables." +"com : %1%" +msgstr "" + +#: src/slic3r/GUI/Downloader.cpp:181 +msgid "The download has failed:" +msgstr "" + +#: src/slic3r/GUI/DownloaderFileGet.cpp:193 +#, boost-format +msgid "Can't create file at %1%." +msgstr "" + +#: src/slic3r/GUI/ExtraRenderers.cpp:323 src/slic3r/GUI/GUI_ObjectList.cpp:571 +#: src/slic3r/GUI/GUI_ObjectList.cpp:583 src/slic3r/GUI/GUI_ObjectList.cpp:1043 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2125 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3013 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4884 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:259 src/libslic3r/PrintConfig.cpp:894 msgid "default" msgstr "по умолчанию" @@ -1702,10 +1900,10 @@ msgid "Set extruder change for every" msgstr "Смена экструдера на каждом" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:60 -#: src/libslic3r/PrintConfig.cpp:662 src/libslic3r/PrintConfig.cpp:1430 -#: src/libslic3r/PrintConfig.cpp:2135 src/libslic3r/PrintConfig.cpp:2310 -#: src/libslic3r/PrintConfig.cpp:2386 src/libslic3r/PrintConfig.cpp:2639 -#: src/libslic3r/PrintConfig.cpp:2687 src/libslic3r/PrintConfig.cpp:2706 +#: src/libslic3r/PrintConfig.cpp:765 src/libslic3r/PrintConfig.cpp:1476 +#: src/libslic3r/PrintConfig.cpp:2165 src/libslic3r/PrintConfig.cpp:2343 +#: src/libslic3r/PrintConfig.cpp:2417 src/libslic3r/PrintConfig.cpp:2665 +#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2728 msgid "layers" msgstr "слой(-я)" @@ -1739,26 +1937,26 @@ msgstr "Удалить экструдер из последовательнос msgid "Add extruder to sequence" msgstr "Добавить экструдер в последовательность" -#: src/slic3r/GUI/Field.cpp:190 +#: src/slic3r/GUI/Field.cpp:188 msgid "default value" msgstr "значение по умолчанию" -#: src/slic3r/GUI/Field.cpp:193 +#: src/slic3r/GUI/Field.cpp:191 msgid "parameter name" msgstr "имя параметра" -#: src/slic3r/GUI/Field.cpp:204 src/slic3r/GUI/OptionsGroup.cpp:827 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1067 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1079 +#: src/slic3r/GUI/Field.cpp:206 src/slic3r/GUI/OptionsGroup.cpp:852 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1074 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1086 msgid "N/A" msgstr "Н/Д" -#: src/slic3r/GUI/Field.cpp:226 src/slic3r/GUI/Field.cpp:298 +#: src/slic3r/GUI/Field.cpp:229 src/slic3r/GUI/Field.cpp:302 #, c-format, boost-format msgid "%s doesn't support percentage" msgstr "%s не поддерживает проценты" -#: src/slic3r/GUI/Field.cpp:266 +#: src/slic3r/GUI/Field.cpp:269 #, c-format, boost-format msgid "" "Input value is out of range\n" @@ -1767,16 +1965,16 @@ msgstr "" "Введённое значение вне диапазона\n" "Вы уверены, что %s является правильным значением и что вы хотите продолжить?" -#: src/slic3r/GUI/Field.cpp:269 src/slic3r/GUI/Field.cpp:343 +#: src/slic3r/GUI/Field.cpp:272 src/slic3r/GUI/Field.cpp:347 msgid "Parameter validation" msgstr "Проверка правильности параметра" -#: src/slic3r/GUI/Field.cpp:282 src/slic3r/GUI/Field.cpp:390 -#: src/slic3r/GUI/Field.cpp:1573 +#: src/slic3r/GUI/Field.cpp:285 src/slic3r/GUI/Field.cpp:394 +#: src/slic3r/GUI/Field.cpp:1597 msgid "Input value is out of range" msgstr "Введённое значение вне диапазона" -#: src/slic3r/GUI/Field.cpp:340 +#: src/slic3r/GUI/Field.cpp:344 #, c-format, boost-format msgid "" "Do you mean %s%% instead of %s %s?\n" @@ -1787,7 +1985,7 @@ msgstr "" "Выберите Да, если вы хотите изменить это значение на %s%%, \n" "или Нет, если уверены, что %s %s является правильным значением." -#: src/slic3r/GUI/Field.cpp:397 +#: src/slic3r/GUI/Field.cpp:401 #, boost-format msgid "" "Invalid input format. Expected vector of dimensions in the following format: " @@ -1796,6 +1994,15 @@ msgstr "" "Неверный входной формат. Ожидаемый вектор размеров в следующем формате: \"%1%" "\"" +#: src/slic3r/GUI/FileArchiveDialog.cpp:170 +msgid "Archive preview" +msgstr "" + +#: src/slic3r/GUI/FileArchiveDialog.cpp:270 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +msgid "Open" +msgstr "" + #: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flash!" msgstr "Прошить!" @@ -1882,12 +2089,6 @@ msgstr "Файл прошивки (*.hex):" msgid "Select a file" msgstr "Выберите файл" -#: src/slic3r/GUI/FirmwareDialog.cpp:815 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:297 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:372 -msgid "Browse" -msgstr "Обзор" - #: src/slic3r/GUI/FirmwareDialog.cpp:817 msgid "Serial port:" msgstr "Последовательный порт:" @@ -1917,10 +2118,10 @@ msgid "Advanced: Output log" msgstr "Дополнительно: журнал вывода" #: src/slic3r/GUI/FirmwareDialog.cpp:862 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:310 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:358 #: src/slic3r/GUI/Mouse3DController.cpp:543 -#: src/slic3r/GUI/PrintHostDialogs.cpp:261 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:122 +#: src/slic3r/GUI/PrintHostDialogs.cpp:313 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:125 msgid "Close" msgstr "Закрыть" @@ -1940,7 +2141,7 @@ msgstr "Подтверждение" msgid "Cancelling..." msgstr "Отмена..." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1488 msgid "Shape Gallery" msgstr "Библиотека фигур" @@ -1948,39 +2149,44 @@ msgstr "Библиотека фигур" msgid "Select shape from the gallery" msgstr "Выберите фигуру из библиотеки" -#: src/slic3r/GUI/GalleryDialog.cpp:100 -msgid "Add to bed" -msgstr "Добавить на стол" - -#: src/slic3r/GUI/GalleryDialog.cpp:101 -msgid "Add selected shape(s) to the bed" -msgstr "Добавьте выбранную фигуру(-ы) на стол" - -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4152 +#: src/slic3r/GUI/GalleryDialog.cpp:114 src/slic3r/GUI/Tab.cpp:4377 msgid "Add" msgstr "Добавить в библиотеку" -#: src/slic3r/GUI/GalleryDialog.cpp:117 +#: src/slic3r/GUI/GalleryDialog.cpp:114 msgid "Add one or more custom shapes" msgstr "Добавьте одну или несколько пользовательских фигур" -#: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:506 -#: src/slic3r/GUI/GLCanvas3D.cpp:4547 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/GalleryDialog.cpp:115 src/slic3r/GUI/GalleryDialog.cpp:528 +#: src/slic3r/GUI/GLCanvas3D.cpp:4638 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/GUI_Factories.cpp:460 src/slic3r/GUI/Tab.cpp:3973 msgid "Delete" msgstr "Удалить" -#: src/slic3r/GUI/GalleryDialog.cpp:118 +#: src/slic3r/GUI/GalleryDialog.cpp:115 msgid "Delete one or more custom shape. You can't delete system shapes" msgstr "" "Удалить одну или несколько пользовательских фигур. Системные фигуры нельзя " "удалить" -#: src/slic3r/GUI/GalleryDialog.cpp:400 +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "Add to bed" +msgstr "Добавить на стол" + +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "OK" +msgstr "OK" + +#: src/slic3r/GUI/GalleryDialog.cpp:143 +msgid "Add selected shape(s) to the bed" +msgstr "Добавьте выбранную фигуру(-ы) на стол" + +#: src/slic3r/GUI/GalleryDialog.cpp:422 msgid "Choose one or more files (STL, OBJ):" msgstr "Выберите один или несколько файлов (STL, OBJ):" -#: src/slic3r/GUI/GalleryDialog.cpp:440 +#: src/slic3r/GUI/GalleryDialog.cpp:462 #, boost-format msgid "" "It looks like selected %1%-file has an error or is destructed.\n" @@ -1989,398 +2195,399 @@ msgstr "" "Похоже, что выбранный %1% файл содержит ошибку или уничтожен.\n" "Загрузка файла невозможна." -#: src/slic3r/GUI/GalleryDialog.cpp:451 +#: src/slic3r/GUI/GalleryDialog.cpp:473 msgid "Choose one PNG file:" msgstr "Выберите один *.png файл:" -#: src/slic3r/GUI/GalleryDialog.cpp:464 +#: src/slic3r/GUI/GalleryDialog.cpp:486 msgid "Replacing of the PNG" msgstr "Замена PNG" -#: src/slic3r/GUI/GalleryDialog.cpp:508 +#: src/slic3r/GUI/GalleryDialog.cpp:530 msgid "Change thumbnail" msgstr "Изменить эскиз" -#: src/slic3r/GUI/GalleryDialog.cpp:549 src/slic3r/GUI/GalleryDialog.cpp:554 +#: src/slic3r/GUI/GalleryDialog.cpp:571 src/slic3r/GUI/GalleryDialog.cpp:576 #, boost-format msgid "Loading of the \"%1%\"" msgstr "Загрузка \"%1%\"" -#: src/slic3r/GUI/GCodeViewer.cpp:274 +#: src/slic3r/GUI/GCodeViewer.cpp:343 msgid "Tool position" msgstr "Положение инструмента" -#: src/slic3r/GUI/GCodeViewer.cpp:1457 +#: src/slic3r/GUI/GCodeViewer.cpp:1547 msgid "Generating toolpaths" msgstr "Создание траекторий инструмента" -#: src/slic3r/GUI/GCodeViewer.cpp:1517 +#: src/slic3r/GUI/GCodeViewer.cpp:1619 msgid "Generating vertex buffer" msgstr "Генерация буфера вершин" -#: src/slic3r/GUI/GCodeViewer.cpp:1857 +#: src/slic3r/GUI/GCodeViewer.cpp:1979 msgid "Generating index buffers" msgstr "Генерация буферов индекса" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to hide" msgstr "Нажмите, чтобы скрыть" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to show" msgstr "Нажмите, чтобы отобразить" -#: src/slic3r/GUI/GCodeViewer.cpp:3181 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 msgid "up to" msgstr "до" -#: src/slic3r/GUI/GCodeViewer.cpp:3187 +#: src/slic3r/GUI/GCodeViewer.cpp:3455 msgid "above" msgstr "после" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "from" msgstr "с" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "to" msgstr "до" -#: src/slic3r/GUI/GCodeViewer.cpp:3245 src/slic3r/GUI/GCodeViewer.cpp:3246 -#: src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3513 src/slic3r/GUI/GCodeViewer.cpp:3514 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 msgid "Percentage" msgstr "Процент" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3570 msgid "Feature type" msgstr "Типы линий" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3592 #: src/slic3r/GUI/RammingChart.cpp:90 msgid "Time" msgstr "Время" -#: src/slic3r/GUI/GCodeViewer.cpp:3295 src/slic3r/GUI/GCodeViewer.cpp:3306 -#: src/slic3r/GUI/GCodeViewer.cpp:3566 -msgid "Used filament" -msgstr "Использовано прутка" - -#: src/slic3r/GUI/GCodeViewer.cpp:3298 +#: src/slic3r/GUI/GCodeViewer.cpp:3571 msgid "Height (mm)" msgstr "Высота (мм)" -#: src/slic3r/GUI/GCodeViewer.cpp:3299 +#: src/slic3r/GUI/GCodeViewer.cpp:3572 msgid "Width (mm)" msgstr "Ширина (мм)" -#: src/slic3r/GUI/GCodeViewer.cpp:3300 +#: src/slic3r/GUI/GCodeViewer.cpp:3573 msgid "Speed (mm/s)" msgstr "Скорость (мм/с)" -#: src/slic3r/GUI/GCodeViewer.cpp:3301 -msgid "Fan Speed (%)" -msgstr "Скорость вентилятора (%)" +#: src/slic3r/GUI/GCodeViewer.cpp:3574 +msgid "Fan speed (%)" +msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3302 +#: src/slic3r/GUI/GCodeViewer.cpp:3575 msgid "Temperature (°C)" msgstr "Температура (°C)" -#: src/slic3r/GUI/GCodeViewer.cpp:3303 +#: src/slic3r/GUI/GCodeViewer.cpp:3576 msgid "Volumetric flow rate (mm³/s)" msgstr "Объёмный расход (мм³/с)" -#: src/slic3r/GUI/GCodeViewer.cpp:3306 src/slic3r/GUI/GUI_Preview.cpp:224 -#: src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3577 +msgid "Layer time (linear)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3578 +msgid "Layer time (logarithmic)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3579 msgid "Tool" msgstr "Инструмент" -#: src/slic3r/GUI/GCodeViewer.cpp:3309 src/slic3r/GUI/GUI_Preview.cpp:225 -#: src/slic3r/GUI/GUI_Preview.cpp:957 +#: src/slic3r/GUI/GCodeViewer.cpp:3580 msgid "Color Print" msgstr "Цвет печати" -#: src/slic3r/GUI/GCodeViewer.cpp:3347 src/slic3r/GUI/GCodeViewer.cpp:3393 -#: src/slic3r/GUI/GCodeViewer.cpp:3398 src/slic3r/GUI/GUI_ObjectList.cpp:312 -#: src/slic3r/GUI/wxExtensions.cpp:536 src/libslic3r/PrintConfig.cpp:795 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 src/slic3r/GUI/GCodeViewer.cpp:3594 +#: src/slic3r/GUI/GCodeViewer.cpp:3860 +msgid "Used filament" +msgstr "Использовано прутка" + +#: src/slic3r/GUI/GCodeViewer.cpp:3623 src/slic3r/GUI/GCodeViewer.cpp:4067 +#: src/libslic3r/PrintConfig.cpp:3025 +msgid "Travel" +msgstr "Скорость перемещение по XY" + +#: src/slic3r/GUI/GCodeViewer.cpp:3640 src/slic3r/GUI/GCodeViewer.cpp:3685 +#: src/slic3r/GUI/GCodeViewer.cpp:3689 src/slic3r/GUI/GUI_ObjectList.cpp:338 +#: src/slic3r/GUI/wxExtensions.cpp:547 src/libslic3r/PrintConfig.cpp:888 msgid "Extruder" msgstr "Экструдер" -#: src/slic3r/GUI/GCodeViewer.cpp:3370 +#: src/slic3r/GUI/GCodeViewer.cpp:3662 msgid "Default color" msgstr "Цвет по умолчанию" -#: src/slic3r/GUI/GCodeViewer.cpp:3393 +#: src/slic3r/GUI/GCodeViewer.cpp:3685 msgid "default color" msgstr "цвет по умолчанию" -#: src/slic3r/GUI/GCodeViewer.cpp:3491 src/slic3r/GUI/GCodeViewer.cpp:3547 +#: src/slic3r/GUI/GCodeViewer.cpp:3785 src/slic3r/GUI/GCodeViewer.cpp:3841 msgid "Color change" msgstr "Смена цвета" -#: src/slic3r/GUI/GCodeViewer.cpp:3510 src/slic3r/GUI/GCodeViewer.cpp:3545 +#: src/slic3r/GUI/GCodeViewer.cpp:3804 src/slic3r/GUI/GCodeViewer.cpp:3839 msgid "Print" msgstr "Печать" -#: src/slic3r/GUI/GCodeViewer.cpp:3546 src/slic3r/GUI/GCodeViewer.cpp:3580 +#: src/slic3r/GUI/GCodeViewer.cpp:3840 src/slic3r/GUI/GCodeViewer.cpp:3874 msgid "Pause" msgstr "Пауза" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Event" msgstr "Событие" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Remaining time" msgstr "Точное время печати" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Duration" msgstr "Продолжительность" -#: src/slic3r/GUI/GCodeViewer.cpp:3609 src/slic3r/GUI/GUI_Preview.cpp:1049 -#: src/libslic3r/PrintConfig.cpp:2937 -msgid "Travel" -msgstr "Скорость перемещение по XY" - -#: src/slic3r/GUI/GCodeViewer.cpp:3612 -msgid "Movement" -msgstr "Перемещение" - -#: src/slic3r/GUI/GCodeViewer.cpp:3613 -msgid "Extrusion" -msgstr "Экструзия" - -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1870 -#: src/slic3r/GUI/Tab.cpp:2812 -msgid "Retraction" -msgstr "Ретракт (втягивание)" - -#: src/slic3r/GUI/GCodeViewer.cpp:3631 src/slic3r/GUI/GCodeViewer.cpp:3634 -#: src/slic3r/GUI/GUI_Preview.cpp:1050 -msgid "Wipe" -msgstr "Очистка" - -#: src/slic3r/GUI/GCodeViewer.cpp:3666 src/slic3r/GUI/GUI_Preview.cpp:257 -#: src/slic3r/GUI/GUI_Preview.cpp:272 -msgid "Options" -msgstr "Опции" - -#: src/slic3r/GUI/GCodeViewer.cpp:3669 src/slic3r/GUI/GUI_Preview.cpp:1051 -msgid "Retractions" -msgstr "Ретракт" - -#: src/slic3r/GUI/GCodeViewer.cpp:3670 src/slic3r/GUI/GUI_Preview.cpp:1052 -msgid "Deretractions" -msgstr "Подача (выдавливание)" - -#: src/slic3r/GUI/GCodeViewer.cpp:3671 src/slic3r/GUI/GUI_Preview.cpp:1053 -msgid "Seams" -msgstr "Швы" - -#: src/slic3r/GUI/GCodeViewer.cpp:3672 src/slic3r/GUI/GUI_Preview.cpp:1054 -msgid "Tool changes" -msgstr "Смена инструмента" - -#: src/slic3r/GUI/GCodeViewer.cpp:3673 src/slic3r/GUI/GUI_Preview.cpp:1055 -msgid "Color changes" -msgstr "Смена цвета" - -#: src/slic3r/GUI/GCodeViewer.cpp:3674 src/slic3r/GUI/GUI_Preview.cpp:1056 -msgid "Print pauses" -msgstr "Паузы печати" - -#: src/slic3r/GUI/GCodeViewer.cpp:3675 src/slic3r/GUI/GUI_Preview.cpp:1057 -msgid "Custom G-codes" -msgstr "Пользовательский G-код" - -#: src/slic3r/GUI/GCodeViewer.cpp:3695 src/slic3r/GUI/GCodeViewer.cpp:3714 -#: src/slic3r/GUI/GUI.cpp:341 src/slic3r/GUI/Plater.cpp:822 -#: src/libslic3r/PrintConfig.cpp:322 +#: src/slic3r/GUI/GCodeViewer.cpp:3928 src/slic3r/GUI/GUI.cpp:332 +#: src/slic3r/GUI/Plater.cpp:852 src/libslic3r/PrintConfig.cpp:335 msgid "Printer" msgstr "Профиль принтера" -#: src/slic3r/GUI/GCodeViewer.cpp:3697 src/slic3r/GUI/GCodeViewer.cpp:3719 -#: src/slic3r/GUI/GUI.cpp:337 src/slic3r/GUI/Plater.cpp:818 +#: src/slic3r/GUI/GCodeViewer.cpp:3931 src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/Plater.cpp:848 msgid "Print settings" msgstr "Профиль печати" -#: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 -#: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1970 src/slic3r/GUI/Tab.cpp:1971 +#: src/slic3r/GUI/GCodeViewer.cpp:3936 src/slic3r/GUI/GUI.cpp:330 +#: src/slic3r/GUI/Plater.cpp:849 src/slic3r/GUI/Tab.cpp:1930 +#: src/slic3r/GUI/Tab.cpp:1931 msgid "Filament" msgstr "Профиль прутка" -#: src/slic3r/GUI/GCodeViewer.cpp:3739 +#: src/slic3r/GUI/GCodeViewer.cpp:3950 msgid "Estimated printing times" msgstr "Расчётное время печати" -#: src/slic3r/GUI/GCodeViewer.cpp:3758 +#: src/slic3r/GUI/GCodeViewer.cpp:3969 msgid "Normal mode" msgstr "Нормальный режим" -#: src/slic3r/GUI/GCodeViewer.cpp:3759 +#: src/slic3r/GUI/GCodeViewer.cpp:3970 msgid "Stealth mode" msgstr "Тихий режим" -#: src/slic3r/GUI/GCodeViewer.cpp:3766 src/libslic3r/PrintConfig.cpp:1189 -#: src/libslic3r/PrintConfig.cpp:1207 src/libslic3r/PrintConfig.cpp:1217 -#: src/libslic3r/PrintConfig.cpp:1262 +#: src/slic3r/GUI/GCodeViewer.cpp:3979 src/libslic3r/PrintConfig.cpp:1249 +#: src/libslic3r/PrintConfig.cpp:1267 src/libslic3r/PrintConfig.cpp:1277 +#: src/libslic3r/PrintConfig.cpp:1322 msgid "First layer" msgstr "Первый слой" -#: src/slic3r/GUI/GCodeViewer.cpp:3767 +#: src/slic3r/GUI/GCodeViewer.cpp:3983 msgid "Total" msgstr "Общее" -#: src/slic3r/GUI/GCodeViewer.cpp:3796 +#: src/slic3r/GUI/GCodeViewer.cpp:4002 msgid "Show stealth mode" msgstr "Показать в тихом режиме" -#: src/slic3r/GUI/GCodeViewer.cpp:3800 +#: src/slic3r/GUI/GCodeViewer.cpp:4006 msgid "Show normal mode" msgstr "Показать в нормальном режиме" -#: src/slic3r/GUI/GLCanvas3D.cpp:225 src/slic3r/GUI/GLCanvas3D.cpp:4694 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:53 -msgid "Variable layer height" -msgstr "Переменная высота слоёв" +#: src/slic3r/GUI/GCodeViewer.cpp:4071 +msgid "Wipe" +msgstr "Очистка" -#: src/slic3r/GUI/GLCanvas3D.cpp:227 -msgid "Left mouse button:" -msgstr "Левая кнопка мыши:" +#: src/slic3r/GUI/GCodeViewer.cpp:4075 +msgid "Retractions" +msgstr "Ретракт" -#: src/slic3r/GUI/GLCanvas3D.cpp:229 -msgid "Add detail" -msgstr "Увеличить детализацию" +#: src/slic3r/GUI/GCodeViewer.cpp:4079 +msgid "Deretractions" +msgstr "Подача (выдавливание)" -#: src/slic3r/GUI/GLCanvas3D.cpp:231 -msgid "Right mouse button:" -msgstr "Правая кнопка мыши:" +#: src/slic3r/GUI/GCodeViewer.cpp:4083 +msgid "Seams" +msgstr "Швы" -#: src/slic3r/GUI/GLCanvas3D.cpp:233 +#: src/slic3r/GUI/GCodeViewer.cpp:4087 +msgid "Tool changes" +msgstr "Смена инструмента" + +#: src/slic3r/GUI/GCodeViewer.cpp:4091 +msgid "Color changes" +msgstr "Смена цвета" + +#: src/slic3r/GUI/GCodeViewer.cpp:4095 +msgid "Print pauses" +msgstr "Паузы печати" + +#: src/slic3r/GUI/GCodeViewer.cpp:4099 +msgid "Custom G-codes" +msgstr "Пользовательский G-код" + +#: src/slic3r/GUI/GCodeViewer.cpp:4103 +msgid "Center of gravity" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:4108 +msgid "Shells" +msgstr "Оболочка" + +#: src/slic3r/GUI/GCodeViewer.cpp:4113 +msgid "Tool marker" +msgstr "Маркер инструмента" + +#: src/slic3r/GUI/GLCanvas3D.cpp:185 src/slic3r/GUI/GLCanvas3D.cpp:4784 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:71 +msgid "Variable layer height" +msgstr "Переменная высота слоёв" + +#: src/slic3r/GUI/GLCanvas3D.cpp:187 +msgid "Left mouse button:" +msgstr "Левая кнопка мыши:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:189 +msgid "Add detail" +msgstr "Увеличить детализацию" + +#: src/slic3r/GUI/GLCanvas3D.cpp:191 +msgid "Right mouse button:" +msgstr "Правая кнопка мыши:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:193 msgid "Remove detail" msgstr "Уменьшить детализацию" -#: src/slic3r/GUI/GLCanvas3D.cpp:235 +#: src/slic3r/GUI/GLCanvas3D.cpp:195 msgid "Shift + Left mouse button:" msgstr "Shift + Левая кнопка мыши:" -#: src/slic3r/GUI/GLCanvas3D.cpp:237 +#: src/slic3r/GUI/GLCanvas3D.cpp:197 msgid "Reset to base" msgstr "Сброс до базовой высоты слоя" -#: src/slic3r/GUI/GLCanvas3D.cpp:239 +#: src/slic3r/GUI/GLCanvas3D.cpp:199 msgid "Shift + Right mouse button:" msgstr "Shift + Правая кнопка мыши:" -#: src/slic3r/GUI/GLCanvas3D.cpp:241 +#: src/slic3r/GUI/GLCanvas3D.cpp:201 msgid "Smoothing" msgstr "Сглаживание" -#: src/slic3r/GUI/GLCanvas3D.cpp:243 +#: src/slic3r/GUI/GLCanvas3D.cpp:203 msgid "Mouse wheel:" msgstr "Колесо мыши:" -#: src/slic3r/GUI/GLCanvas3D.cpp:245 +#: src/slic3r/GUI/GLCanvas3D.cpp:205 msgid "Increase/decrease edit area" msgstr "Увелич. /уменьш. области редактирования" -#: src/slic3r/GUI/GLCanvas3D.cpp:248 +#: src/slic3r/GUI/GLCanvas3D.cpp:208 msgid "Adaptive" msgstr "Адаптивная" -#: src/slic3r/GUI/GLCanvas3D.cpp:254 +#: src/slic3r/GUI/GLCanvas3D.cpp:214 msgid "Quality / Speed" msgstr "Качество / Скорость" -#: src/slic3r/GUI/GLCanvas3D.cpp:257 +#: src/slic3r/GUI/GLCanvas3D.cpp:217 msgid "Higher print quality versus higher print speed." msgstr "Выбор между высоким качеством печати или высокой скоростью." -#: src/slic3r/GUI/GLCanvas3D.cpp:268 +#: src/slic3r/GUI/GLCanvas3D.cpp:228 msgid "Smooth" msgstr "Сгладить" -#: src/slic3r/GUI/GLCanvas3D.cpp:274 src/libslic3r/PrintConfig.cpp:819 +#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/libslic3r/PrintConfig.cpp:908 msgid "Radius" msgstr "Радиус" -#: src/slic3r/GUI/GLCanvas3D.cpp:286 +#: src/slic3r/GUI/GLCanvas3D.cpp:246 msgid "Keep min" msgstr "Сохранять минимумы" -#: src/slic3r/GUI/GLCanvas3D.cpp:295 src/slic3r/GUI/GLCanvas3D.cpp:4123 +#: src/slic3r/GUI/GLCanvas3D.cpp:255 src/slic3r/GUI/GLCanvas3D.cpp:4217 msgid "Reset" msgstr "Сброс" -#: src/slic3r/GUI/GLCanvas3D.cpp:561 +#: src/slic3r/GUI/GLCanvas3D.cpp:602 msgid "Variable layer height - Manual edit" msgstr "Переменная высота слоёв - Ручное редактирование" -#: src/slic3r/GUI/GLCanvas3D.cpp:676 +#: src/slic3r/GUI/GLCanvas3D.cpp:717 msgid "Seq." msgstr "Очерёдность печати" -#: src/slic3r/GUI/GLCanvas3D.cpp:1310 +#: src/slic3r/GUI/GLCanvas3D.cpp:1319 msgid "Variable layer height - Reset" msgstr "Переменная высота слоёв - Сброс" -#: src/slic3r/GUI/GLCanvas3D.cpp:1318 +#: src/slic3r/GUI/GLCanvas3D.cpp:1327 msgid "Variable layer height - Adaptive" msgstr "Переменная высота слоёв - Адаптивная" -#: src/slic3r/GUI/GLCanvas3D.cpp:1326 +#: src/slic3r/GUI/GLCanvas3D.cpp:1335 msgid "Variable layer height - Smooth all" msgstr "Переменная высота слоёв - Сгладить всё" -#: src/slic3r/GUI/GLCanvas3D.cpp:1733 +#: src/slic3r/GUI/GLCanvas3D.cpp:1778 msgid "Mirror Object" msgstr "Отражение модели" -#: src/slic3r/GUI/GLCanvas3D.cpp:2612 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:560 +#: src/slic3r/GUI/GLCanvas3D.cpp:2542 src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:117 msgid "Gizmo-Move" msgstr "Гизмо перемещения" -#: src/slic3r/GUI/GLCanvas3D.cpp:2695 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562 +#: src/slic3r/GUI/GLCanvas3D.cpp:2638 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:661 msgid "Gizmo-Rotate" msgstr "Гизмо поворота" -#: src/slic3r/GUI/GLCanvas3D.cpp:3300 +#: src/slic3r/GUI/GLCanvas3D.cpp:3263 msgid "Move Object" msgstr "Перемещение модели" -#: src/slic3r/GUI/GLCanvas3D.cpp:3821 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3513 +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:40 +msgid "Gizmo-Place on Face" +msgstr "Гизмо поверхностью на стол" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3904 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Switch to Settings" msgstr "Переключение настроек" -#: src/slic3r/GUI/GLCanvas3D.cpp:3822 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3905 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Print Settings Tab" msgstr "Вкладка настройки печати" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Filament Settings Tab" msgstr "Вкладка настройки прутка" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Material Settings Tab" msgstr "Вкладка настройки материала" -#: src/slic3r/GUI/GLCanvas3D.cpp:3824 src/slic3r/GUI/GLCanvas3D.cpp:4657 +#: src/slic3r/GUI/GLCanvas3D.cpp:3907 src/slic3r/GUI/GLCanvas3D.cpp:4746 msgid "Printer Settings Tab" msgstr "Вкладка настройки принтера" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Undo History" msgstr "История отмен" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Redo History" msgstr "История повторов" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" @@ -2388,7 +2595,7 @@ msgstr[0] "Отмена %1$d действия" msgstr[1] "Отмена %1$d действий" msgstr[2] "Отмена %1$d действий" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" @@ -2396,144 +2603,120 @@ msgstr[0] "Повтор %1$d действия" msgstr[1] "Повтор %1$d действий" msgstr[2] "Повтор %1$d действий" -#: src/slic3r/GUI/GLCanvas3D.cpp:4011 src/slic3r/GUI/GLCanvas3D.cpp:4673 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 src/slic3r/GUI/Search.cpp:426 +#: src/slic3r/GUI/GLCanvas3D.cpp:4106 src/slic3r/GUI/GLCanvas3D.cpp:4762 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/Search.cpp:482 msgid "Search" msgstr "Поиск" -#: src/slic3r/GUI/GLCanvas3D.cpp:4025 src/slic3r/GUI/GLCanvas3D.cpp:4033 -#: src/slic3r/GUI/Search.cpp:432 +#: src/slic3r/GUI/GLCanvas3D.cpp:4120 src/slic3r/GUI/GLCanvas3D.cpp:4128 +#: src/slic3r/GUI/Search.cpp:488 msgid "Enter a search term" msgstr "Ввод поискового запроса" -#: src/slic3r/GUI/GLCanvas3D.cpp:4064 +#: src/slic3r/GUI/GLCanvas3D.cpp:4160 msgid "Arrange options" msgstr "Параметры расстановки" -#: src/slic3r/GUI/GLCanvas3D.cpp:4097 +#: src/slic3r/GUI/GLCanvas3D.cpp:4193 #, boost-format msgid "Press %1%left mouse button to enter the exact value" msgstr "Нажмите %1% левую кнопку мыши для ввода точного значения" -#: src/slic3r/GUI/GLCanvas3D.cpp:4099 +#: src/slic3r/GUI/GLCanvas3D.cpp:4195 msgid "Spacing" msgstr "Расстояние" -#: src/slic3r/GUI/GLCanvas3D.cpp:4106 -msgid "Enable rotations (slow)" -msgstr "Разрешить вращение (замедление)" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Alignment" -msgstr "Выравнивание" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:4500 -msgid "Center" -msgstr "По центру" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear left" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front left" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front right" +#: src/slic3r/GUI/GLCanvas3D.cpp:4202 +msgid "Spacing from bed" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear right" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:2271 -msgid "Random" -msgstr "Случайно" +#: src/slic3r/GUI/GLCanvas3D.cpp:4209 +msgid "Enable rotations (slow)" +msgstr "Разрешить вращение (замедление)" -#: src/slic3r/GUI/GLCanvas3D.cpp:4133 src/slic3r/GUI/GLCanvas3D.cpp:4565 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Plater.cpp:1664 +#: src/slic3r/GUI/GLCanvas3D.cpp:4228 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 src/slic3r/GUI/Plater.cpp:7118 msgid "Arrange" msgstr "Расставить" -#: src/slic3r/GUI/GLCanvas3D.cpp:4539 +#: src/slic3r/GUI/GLCanvas3D.cpp:4630 msgid "Add..." msgstr "Добавить..." -#: src/slic3r/GUI/GLCanvas3D.cpp:4556 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5509 src/slic3r/GUI/Tab.cpp:4158 +#: src/slic3r/GUI/GLCanvas3D.cpp:4647 src/slic3r/GUI/KBShortcutsDialog.cpp:105 +#: src/slic3r/GUI/Plater.cpp:6047 src/slic3r/GUI/Tab.cpp:4383 msgid "Delete all" msgstr "Удалить всё" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 src/slic3r/GUI/KBShortcutsDialog.cpp:133 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 src/slic3r/GUI/KBShortcutsDialog.cpp:142 msgid "Arrange selection" msgstr "Расставить только выбранные модели" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 msgid "Click right mouse button to show arrangement options" msgstr "Правая кнопку мыши, чтобы отобразить параметры расстановки" -#: src/slic3r/GUI/GLCanvas3D.cpp:4587 +#: src/slic3r/GUI/GLCanvas3D.cpp:4676 msgid "Copy" msgstr "Копировать" -#: src/slic3r/GUI/GLCanvas3D.cpp:4596 +#: src/slic3r/GUI/GLCanvas3D.cpp:4685 msgid "Paste" msgstr "Вставить" -#: src/slic3r/GUI/GLCanvas3D.cpp:4608 src/slic3r/GUI/GUI_Factories.cpp:1084 -#: src/slic3r/GUI/GUI_Factories.cpp:1108 src/slic3r/GUI/GUI_Factories.cpp:1119 +#: src/slic3r/GUI/GLCanvas3D.cpp:4697 src/slic3r/GUI/GUI_Factories.cpp:1237 +#: src/slic3r/GUI/GUI_Factories.cpp:1261 src/slic3r/GUI/GUI_Factories.cpp:1272 msgid "Add instance" msgstr "Добавить копию" -#: src/slic3r/GUI/GLCanvas3D.cpp:4619 src/slic3r/GUI/GUI_Factories.cpp:1087 +#: src/slic3r/GUI/GLCanvas3D.cpp:4708 src/slic3r/GUI/GUI_Factories.cpp:1240 msgid "Remove instance" msgstr "Удалить копию" -#: src/slic3r/GUI/GLCanvas3D.cpp:4632 +#: src/slic3r/GUI/GLCanvas3D.cpp:4721 msgid "Split to objects" msgstr "Разделить на модели" -#: src/slic3r/GUI/GLCanvas3D.cpp:4642 +#: src/slic3r/GUI/GLCanvas3D.cpp:4731 msgid "Split to parts" msgstr "Разделить на части" -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/GLCanvas3D.cpp:4795 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/GLCanvas3D.cpp:4874 msgid "Click right mouse button to open/close History" msgstr "Правая кнопку мыши, чтобы показать/скрыть историю действий" -#: src/slic3r/GUI/GLCanvas3D.cpp:4779 +#: src/slic3r/GUI/GLCanvas3D.cpp:4859 #, boost-format msgid "Next Undo action: %1%" msgstr "Следующее действие отмены: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:4795 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/GLCanvas3D.cpp:4874 src/slic3r/GUI/KBShortcutsDialog.cpp:107 +#: src/slic3r/GUI/MainFrame.cpp:1429 msgid "Redo" msgstr "Повтор действия" -#: src/slic3r/GUI/GLCanvas3D.cpp:4817 +#: src/slic3r/GUI/GLCanvas3D.cpp:4895 #, boost-format msgid "Next Redo action: %1%" msgstr "Следующее действие повтора: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:6434 +#: src/slic3r/GUI/GLCanvas3D.cpp:6784 msgid "An object outside the print area was detected." msgstr "Обнаружена модель вне области печати." -#: src/slic3r/GUI/GLCanvas3D.cpp:6435 +#: src/slic3r/GUI/GLCanvas3D.cpp:6785 msgid "A toolpath outside the print area was detected." msgstr "Траектория движения инструмента выходит за пределы области печати." -#: src/slic3r/GUI/GLCanvas3D.cpp:6436 +#: src/slic3r/GUI/GLCanvas3D.cpp:6786 msgid "SLA supports outside the print area were detected." msgstr "Обнаружены SLA поддержки вне области печати." -#: src/slic3r/GUI/GLCanvas3D.cpp:6437 +#: src/slic3r/GUI/GLCanvas3D.cpp:6787 msgid "Some objects are not visible during editing." msgstr "При редактировании, те модели с которыми вы не работаете скрываются." -#: src/slic3r/GUI/GLCanvas3D.cpp:6439 +#: src/slic3r/GUI/GLCanvas3D.cpp:6789 msgid "" "An object outside the print area was detected.\n" "Resolve the current problem to continue slicing." @@ -2541,324 +2724,1348 @@ msgstr "" "Обнаружена модель вне области печати. \n" "Решите текущую проблему, чтобы продолжить нарезку." -#: src/slic3r/GUI/GLCanvas3D.cpp:6513 +#: src/slic3r/GUI/GLCanvas3D.cpp:6864 msgid "Selection-Add from rectangle" msgstr "Выбор\\Добавление из прямоугольника" -#: src/slic3r/GUI/GLCanvas3D.cpp:6528 +#: src/slic3r/GUI/GLCanvas3D.cpp:6879 msgid "Selection-Remove from rectangle" msgstr "Выбор\\Удаление из прямоугольника" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4478 -msgid "Cut" -msgstr "Разрезать" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:206 +msgid "Planar" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -msgid "in" -msgstr "дюйм" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Auto" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 -msgid "Keep upper part" -msgstr "Оставить верхнюю часть" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Manual" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 -msgid "Keep lower part" -msgstr "Оставить нижнюю часть" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:213 +msgid "Plug" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:196 -msgid "Rotate lower part upwards" -msgstr "Развернуть нижнюю часть" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:214 +msgid "Dowel" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:201 -msgid "Perform cut" -msgstr "Выполнить разрез" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Prism" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:49 -msgid "Paint-on supports" -msgstr "Рисование поддержек" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Frustum" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 -msgid "Clipping of view" -msgstr "Отсечение вида" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Triangle" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 -msgid "Reset direction" -msgstr "Сброс направления" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Square" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 -msgid "Brush size" -msgstr "Размер кисти" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Hexagon" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 -msgid "Brush shape" -msgstr "Форма кисти" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:59 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 +msgid "Circle" +msgstr "Круг" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 -msgid "Left mouse button" -msgstr "Левая кнопка мыши" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:233 +msgid "Keep orientation" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 -msgid "Enforce supports" -msgstr "Принудительная поддержка" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:234 +msgid "Place on cut" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 -msgid "Right mouse button" -msgstr "Правая кнопка мыши" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:235 +msgid "Flip upside down" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:434 -msgid "Block supports" -msgstr "Блокировка поддержки" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +msgid "inch" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 -msgid "Shift + Left mouse button" -msgstr "Shift + Левая кнопка мыши" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 +msgid "Part" +msgstr "Элемент" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:429 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 -msgid "Remove selection" -msgstr "Удалить выделенное" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 src/libslic3r/Print.cpp:1236 +msgid "Object" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 -msgid "Remove all selection" -msgstr "Удалить всё выделенное" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:264 +msgid "" +"Click to flip the cut plane\n" +"Drag to move the cut plane" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 -msgid "Circle" -msgstr "Круг" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:269 src/libslic3r/PrintConfig.cpp:498 +#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2325 src/libslic3r/PrintConfig.cpp:2613 +#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2876 src/libslic3r/PrintConfig.cpp:2907 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3231 +#: src/libslic3r/PrintConfig.cpp:3466 src/libslic3r/PrintConfig.cpp:3951 +msgid "°" +msgstr "°" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 -#: src/slic3r/GUI/GUI_Factories.cpp:461 -msgid "Sphere" -msgstr "Сфера" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:367 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:571 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1232 +msgid "Move cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +msgid "in" +msgstr "дюйм" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:68 -#: src/libslic3r/PrintConfig.cpp:1172 -msgid "Triangles" -msgstr "Треугольники" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:544 +msgid "Value" +msgstr "Значение" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 -msgid "Highlight overhang by angle" -msgstr "Выделение свеса по углу" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:549 +msgid "Tolerance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 -msgid "Enforce" -msgstr "Зафиксировать выделенный угол" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 +msgid "Left click" +msgstr "Левая кнопка мыши" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 -msgid "Tool type" -msgstr "Тип инструмента" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2348 +msgid "Add connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 -msgid "Brush" -msgstr "Кисть" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 +msgid "Right click" +msgstr "Правая кнопка мыши" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:128 -msgid "Smart fill" -msgstr "Умная заливка" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +msgid "Remove connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:131 -msgid "Smart fill angle" -msgstr "Угол для умной заливки" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 +msgid "Drag" +msgstr "Перетащить мышь" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:132 -msgid "Split triangles" -msgstr "Делить треугольную сетку" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1216 +msgid "Move connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 -msgid "On overhangs only" -msgstr "Только на свесах" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +msgid "Add connector to selection" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:174 -#, boost-format -msgid "" -"Preselects faces by overhang angle. It is possible to restrict paintable " -"facets to only preselected faces when the option \"%1%\" is enabled." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +msgid "Remove connector from selection" msgstr "" -"Предварительно выбирает грани по углу свеса. Можно ограничить окрашиваемые " -"грани только предварительно выбранными гранями, если включён параметр \"%1%" -"\"." -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:217 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:378 -msgid "Paints facets according to the chosen painting brush." -msgstr "Окрашивает грани в соответствии с выбранной кистью." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:870 +msgid "Select all connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:391 -msgid "" -"Paints neighboring facets whose relative angle is less or equal to set angle." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:894 src/libslic3r/PrintConfig.cpp:4644 +msgid "Cut" +msgstr "Разрезать" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1227 +msgid "Rotate cut plane" msgstr "" -"Окрашивает соседние грани, относительный угол которых меньше или равен " -"заданному ниже углу." -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:229 -#, boost-format -msgid "Allows painting only on facets selected by: \"%1%\"" -msgstr "Позволяет рисовать на выбранных гранях, используя: \"%1%\"" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1448 +msgid "Render cut plane as circle" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:244 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:419 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:144 -msgid "Paints all facets inside, regardless of their orientation." -msgstr "Окрашивает все грани внутри, независимо от их ориентации." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1537 +msgid "Connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:253 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:428 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:152 -msgid "Ignores facets facing away from the camera." -msgstr "Игнорирует грани, обращённые в сторону от камеры." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1541 +msgid "Remove connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:262 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:437 -msgid "Paints only one facet." -msgstr "Окрашивает только одну грань." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1550 +msgid "Type" +msgstr "Тип" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:270 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:285 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:445 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:462 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:132 -msgid "Alt + Mouse wheel" -msgstr "Alt + Колесо мыши" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1561 src/libslic3r/PrintConfig.cpp:2816 +msgid "Style" +msgstr "Стиль" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 -msgid "Splits bigger facets into smaller ones while the object is painted." -msgstr "Во время окрашивания модели, делит большие грани на более мелкие." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1568 +msgid "Depth ratio" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:308 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:483 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:170 -msgid "Ctrl + Mouse wheel" -msgstr "Ctrl + Колесо мыши" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1586 +msgid "Confirm connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:313 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:488 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:175 -msgid "Reset selection" -msgstr "Сброс выбранного" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1652 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1666 +msgid "Flip cut plane" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:364 -msgid "Block supports by angle" -msgstr "Блокировка поддержек по углу" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1710 +msgid "Hold SHIFT key to draw a cut line" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:365 -msgid "Add supports by angle" -msgstr "Добавление поддержек по углу" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1716 +msgid "Cut position: " +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:432 -msgid "Add supports" -msgstr "Добавление поддержек" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1725 +msgid "Reset cutting plane" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:41 -msgid "Place on face" -msgstr "Поверхностью на стол" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Edit connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 -msgid "Hollow this object" -msgstr "Пустотелая модель" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Add connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 -msgid "Preview hollowed and drilled model" -msgstr "Предпросмотр полости и отверстий в модели" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1744 +msgid "Reset cut" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1745 +msgid "Reset cutting plane and remove connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1800 +msgid "After cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1820 +msgid "Cut to" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1823 +msgid "Objects" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1826 +msgid "Parts" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1840 +msgid "Perform cut" +msgstr "Выполнить разрез" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1930 +msgid "Invalid connectors detected" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1932 +#, c-format, boost-format +msgid "%1$d connector is out of cut contour" +msgid_plural "%1$d connectors are out of cut contour" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1935 +#, c-format, boost-format +msgid "%1$d connector is out of object" +msgid_plural "%1$d connectors are out of object" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1938 +msgid "Some connectors are overlapped" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1942 +msgid "" +"Invalid state. \n" +"No one part is selected for keep after cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1944 +msgid "" +"Warning state. \n" +"Cut plane is placed out of object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2153 +msgid "Connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2183 +msgid "Cut by Plane" +msgstr "Разрез по плоскости" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2323 +msgid "Cut by line" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2373 +msgid "Delete connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:252 +msgid "Entering Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:253 +msgid "Leaving Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:254 +msgid "Cut gizmo editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:601 +msgid "Emboss" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:866 +msgid "ERROR: Wait until ends or Cancel process." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:921 +msgid "Text-Rotate" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:953 +msgid "Font" +msgstr "Шрифт" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:954 +#: src/libslic3r/PrintConfig.cpp:897 +msgid "Height" +msgstr "Высота" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:955 +msgid "Depth" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:963 +msgid "Use surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:964 +msgid "Char gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:965 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Line gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:966 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:967 +msgid "Skew ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:968 +msgid "Z-move" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:969 +msgid "Z-rot" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:970 +msgid "Collection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1047 +msgid "NORMAL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1048 +msgid "SMALL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1049 +msgid "ITALIC" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1050 +msgid "SWISS" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1051 +msgid "MODERN" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1088 +msgid "First font" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1093 +msgid "Default font" +msgstr "Шрифт по умолчанию" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1098 +msgid "Embossed text" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1513 +msgid "Warning: No font is selected. Select correct one." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1531 +#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1437 +#: src/slic3r/GUI/Tab.cpp:1472 src/slic3r/GUI/Tab.cpp:1607 +#: src/slic3r/GUI/Tab.cpp:1611 src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:2390 src/slic3r/GUI/Tab.cpp:4985 +#: src/libslic3r/PrintConfig.cpp:276 src/libslic3r/PrintConfig.cpp:514 +#: src/libslic3r/PrintConfig.cpp:1484 src/libslic3r/PrintConfig.cpp:1566 +#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:2562 +#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:3166 +#: src/libslic3r/PrintConfig.cpp:3200 src/libslic3r/PrintConfig.cpp:3211 +#: src/libslic3r/PrintConfig.cpp:3226 src/libslic3r/PrintConfig.cpp:3239 +#: src/libslic3r/PrintConfig.cpp:3248 src/libslic3r/PrintConfig.cpp:3260 +#: src/libslic3r/PrintConfig.cpp:3642 +msgid "Advanced" +msgstr "Дополнительно" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1631 +msgid "Can't write text by selected font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1632 +msgid "Try to choose another font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Empty" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Embossed text can NOT contain only white spaces." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Bad symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Text contain character glyph (represented by '?') unknown by font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:535 +msgid "Skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +msgid "Unsupported visualization of font skew for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Unsupported visualization of font boldness for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Unsupported visualization of gap between lines inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Too tall" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Diminished font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Too small" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Enlarged font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1660 +#, boost-format +msgid "%1% is NOT shown." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1964 +msgid " No symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1965 +msgid " ... Loading" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2015 +msgid " ... In queue" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2132 +#, boost-format +msgid "Font face \"%1%\" can't be selected." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2180 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:754 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:367 +msgid "Apply" +msgstr "Применить" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2192 +msgid "add file with font(.ttf, .ttc)" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2202 +msgid "Open dialog for choose from fonts." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2210 +msgid "Text is to object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2224 +msgid "Added" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2227 +msgid "Click to change text into object part." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2230 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4321 +msgid "You can't change a type of the last solid part of the object." +msgstr "Вы не можете изменить тип последнего твердотельного элемента модели." + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2231 +msgid "Subtracted" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2237 +msgid "Click to change part type into negative volume." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2243 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4338 +msgid "Modifier" +msgstr "Модификатор" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2249 +msgid "Click to change part type into modifier." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2256 +msgid "Change Text Type" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2287 +#, boost-format +msgid "Rename style(%1%) for embossing text: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2299 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2384 +msgid "Name can't be empty." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2301 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2386 +msgid "Name has to be unique." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2310 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2397 +msgid "ok" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2312 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2401 +msgid "cancel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2337 +msgid "Rename style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2344 +msgid "Rename current style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2345 +msgid "Can't rename temporary style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2362 +msgid "First Add style to list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2364 +#, boost-format +msgid "Save %1% style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2366 +msgid "No changes to save." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2373 +msgid "New name of style: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2422 +msgid "Save as new style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2434 +msgid "Only valid font can be added to style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2436 +msgid "Add style to my list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2438 +msgid "Add as new named style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2454 +msgid "Remove style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2485 +#, boost-format +msgid "Delete \"%1%\" style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2486 +#, boost-format +msgid "Can't delete \"%1%\". It is last style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2487 +#, boost-format +msgid "Can't delete temporary style \"%1%\"." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2494 +#, boost-format +msgid "" +"Are you sure,\n" +"that you want permanently and unrecoverable \n" +"remove style \"%1%\"?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2496 +msgid "Yes" +msgstr "Да" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2505 +msgid "No" +msgstr "Нет" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2555 +msgid "Presets" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2564 src/slic3r/GUI/GUI_App.cpp:2324 +msgid "modified" +msgstr "изменено" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2617 +#, boost-format +msgid "Modified style \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2618 +#, boost-format +msgid "Current style is \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2625 +msgid "Style modification will be lost." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2627 +#, boost-format +msgid "" +"Changing style to '%1%' will discard current style modification.\n" +"\n" +" Would you like to continue anyway?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2643 +msgid "Not valid style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2644 +#, boost-format +msgid "Style '%1%' can't be used and will be removed from list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2691 +msgid "Unset italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2708 +msgid "Set italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2738 +msgid "Unset bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2756 +msgid "Set bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2922 +msgid "WxFont is not loaded properly." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2957 +msgid "Revert font changes." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2991 +msgid "wx Make bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3002 +msgid "Revert text size." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3029 +msgid "Revert embossed depth." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3178 +msgid "" +"Advanced font options could be changed only for correct font.\n" +"Start with select correct font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3219 +msgid "Revert using of model surface." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3232 +msgid "font points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3241 +msgid "Revert gap between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3242 +msgid "Distance between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3257 +msgid "Revert gap between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3258 +msgid "Distance between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3272 +msgid "Undo boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3273 +msgid "Tiny / Wide glyphs" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3283 +msgid "Undo letter's skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3284 +msgid "Italic strength ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3304 +msgid "Undo translation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3305 +msgid "Distance of the center of text from model surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3350 +msgid "Undo rotation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3352 +msgid "Rotate text Clock-wise." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3386 +msgid "Select from True Type Collection." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3395 +msgid "Set text to face camera" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3402 +msgid "Use camera direction for text orientation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3486 +#, boost-format +msgid "Font '%1%' can't be used. Please select another." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3488 +msgid "Selected font is NOT True-type." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3512 +msgid "Choose one or more files (TTF, TTC):" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3539 +msgid "Choose SVG file:" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3600 +#, boost-format +msgid "" +"Can't load exactly same font(\"%1%\"), Aplication selected a similar " +"one(\"%2%\"). You have to specify font for enable edit text." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:81 +msgid "Enter emboss gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:82 +msgid "Leave emboss gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:83 +msgid "Embossing actions" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:37 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:66 +msgid "Paint-on supports" +msgstr "Рисование поддержек" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 +msgid "Automatic painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 +msgid "painting..." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:107 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +msgid "Clipping of view" +msgstr "Отсечение вида" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:106 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 +msgid "Reset direction" +msgstr "Сброс направления" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:108 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 +msgid "Brush size" +msgstr "Размер кисти" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:109 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 +msgid "Brush shape" +msgstr "Форма кисти" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1816 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:110 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 +msgid "Left mouse button" +msgstr "Левая кнопка мыши" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 +msgid "Enforce supports" +msgstr "Принудительная поддержка" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 +msgid "Right mouse button" +msgstr "Правая кнопка мыши" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:573 +msgid "Block supports" +msgstr "Блокировка поддержки" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 +msgid "Shift + Left mouse button" +msgstr "Shift + Левая кнопка мыши" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:568 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:247 +msgid "Remove selection" +msgstr "Удалить выделенное" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 +msgid "Remove all selection" +msgstr "Удалить всё выделенное" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 +#: src/slic3r/GUI/GUI_Factories.cpp:481 +msgid "Sphere" +msgstr "Сфера" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:106 +#: src/libslic3r/PrintConfig.cpp:1231 +msgid "Triangles" +msgstr "Треугольники" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 +msgid "Highlight overhang by angle" +msgstr "Выделение свеса по углу" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:63 +msgid "Enforce" +msgstr "Зафиксировать выделенный угол" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +msgid "Tool type" +msgstr "Тип инструмента" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 +msgid "Brush" +msgstr "Кисть" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:68 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 +msgid "Smart fill" +msgstr "Умная заливка" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 +msgid "Smart fill angle" +msgstr "Угол для умной заливки" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:72 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 +msgid "Split triangles" +msgstr "Делить треугольную сетку" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:73 +msgid "On overhangs only" +msgstr "Только на свесах" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:187 +#, boost-format +msgid "" +"Preselects faces by overhang angle. It is possible to restrict paintable " +"facets to only preselected faces when the option \"%1%\" is enabled." +msgstr "" +"Предварительно выбирает грани по углу свеса. Можно ограничить окрашиваемые " +"грани только предварительно выбранными гранями, если включён параметр \"%1%" +"\"." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:230 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:371 +msgid "Paints facets according to the chosen painting brush." +msgstr "Окрашивает грани в соответствии с выбранной кистью." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:238 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:384 +msgid "" +"Paints neighboring facets whose relative angle is less or equal to set angle." +msgstr "" +"Окрашивает соседние грани, относительный угол которых меньше или равен " +"заданному ниже углу." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242 +#, boost-format +msgid "Allows painting only on facets selected by: \"%1%\"" +msgstr "Позволяет рисовать на выбранных гранях, используя: \"%1%\"" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:257 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:412 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141 +msgid "Paints all facets inside, regardless of their orientation." +msgstr "Окрашивает все грани внутри, независимо от их ориентации." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:266 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:421 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:149 +msgid "Ignores facets facing away from the camera." +msgstr "Игнорирует грани, обращённые в сторону от камеры." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:430 +msgid "Paints only one facet." +msgstr "Окрашивает только одну грань." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:298 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:438 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:455 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:129 +msgid "Alt + Mouse wheel" +msgstr "Alt + Колесо мыши" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:288 +msgid "Splits bigger facets into smaller ones while the object is painted." +msgstr "Во время окрашивания модели, делит большие грани на более мелкие." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:321 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:476 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:167 +msgid "Ctrl + Mouse wheel" +msgstr "Ctrl + Колесо мыши" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:326 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:481 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:172 +msgid "Reset selection" +msgstr "Сброс выбранного" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:382 +msgid "Block supports by angle" +msgstr "Блокировка поддержек по углу" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:383 +msgid "Add supports by angle" +msgstr "Добавление поддержек по углу" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +msgid "Automatic painting requires valid print setup." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:535 +msgid "Automatic painting will erase all currently painted areas." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:536 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1118 +msgid "Are you sure you want to do it?" +msgstr "Вы уверены, что хотите это сделать?" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:540 +msgid "Automatic painting support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:571 +msgid "Add supports" +msgstr "Добавление поддержек" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:22 +msgid "Entering Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:23 +msgid "Leaving Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:24 +msgid "Paint-on supports editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:88 +msgid "Place on face" +msgstr "Поверхностью на стол" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:29 +msgid "Hollow this object" +msgstr "Пустотелая модель" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 +msgid "Preview hollowed and drilled model" +msgstr "Предпросмотр полости и отверстий в модели" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 msgid "Offset" msgstr "Смещение" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 msgid "Quality" msgstr "Качество" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3905 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 +#: src/libslic3r/PrintConfig.cpp:4037 msgid "Closing distance" msgstr "Расстояние смыкания полости" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 msgid "Hole diameter" msgstr "Диаметр отверстия" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 msgid "Hole depth" msgstr "Глубина отверстия" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 msgid "Remove selected holes" msgstr "Удалить выбранные отверстия" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 msgid "Remove all holes" msgstr "Удалить все отверстия" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 msgid "Show supports" msgstr "Отображать поддержку" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:287 -msgid "Add drainage hole" -msgstr "Добавление отверстия" +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:242 +msgid "Add drainage hole" +msgstr "Добавление отверстия" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:361 +msgid "Delete drainage hole" +msgstr "Удаление отверстия" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:655 +msgid "Hollowing parameter change" +msgstr "Изменение параметров пустотелой модели" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:739 +msgid "Change drainage hole diameter" +msgstr "Изменение диаметра отверстия" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:827 +msgid "Hollow and drill" +msgstr "Пустотелая модель и отверстия" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:869 +msgid "Move drainage hole" +msgstr "Перемещение отверстия" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:64 +msgid "No feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:65 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:76 +msgid "Vertex" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:66 +msgid "Edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:68 +msgid "Plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:77 +msgid "Point on edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:78 +msgid "Point on circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:79 +msgid "Point on plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:89 +msgid "Center of edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:90 +msgid "Center of circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:554 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2029 +msgid "Measure" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1236 +msgid "Edit to scale" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1258 +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:161 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:236 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:776 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:794 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:817 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:831 +#: src/libslic3r/PrintConfig.cpp:4713 +msgid "Scale" +msgstr "Масштаб" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1362 +msgctxt "Verb" +msgid "Scale" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1541 +msgid "##angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1740 +msgid "Measure tool debug" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1824 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1851 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1857 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1886 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1893 +msgid "Unselect feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1830 +msgid "Unselect center" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1835 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1862 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1898 +msgid "Select center" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1840 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1867 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1903 +msgid "Unselect point" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1846 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1873 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1910 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select point" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Shift" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Enable point selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2007 +msgid "Restart selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1952 +msgid "Esc" +msgstr "ESC" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1955 +msgid "Unselect" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1999 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2001 +msgid "Selection" +msgstr "Выделение" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2021 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +msgid "Copy to clipboard" +msgstr "Копировать в буфер" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2038 +msgid "Angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Perpendicular distance" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:403 -msgid "Delete drainage hole" -msgstr "Удаление отверстия" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2062 +msgid "Direct distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:590 -msgid "Hollowing parameter change" -msgstr "Изменение параметров пустотелой модели" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2072 +msgid "Distance XYZ" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:667 -msgid "Change drainage hole diameter" -msgstr "Изменение диаметра отверстия" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:163 +msgid "Entering Measure gizmo" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:761 -msgid "Hollow and drill" -msgstr "Пустотелая модель и отверстия" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:164 +msgid "Leaving Measure gizmo" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:811 -msgid "Move drainage hole" -msgstr "Перемещение отверстия" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:165 +msgid "Measure gizmo editing" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:27 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:28 #, boost-format msgid "" "Your printer has more extruders than the multi-material painting gizmo " @@ -2869,81 +4076,85 @@ msgstr "" "покраской. По этой причине только первые %1% экструдера могут быть " "использованы для покраски." -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:45 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:46 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 msgid "Multimaterial painting" msgstr "Мультиматериальная покраска" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 msgid "First color" msgstr "Первый цвет" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 msgid "Second color" msgstr "Второй цвет" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:120 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:671 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:642 msgid "Remove painted color" msgstr "Удаление окрашенного участка" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 msgid "Clear all" msgstr "Очистить всё" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:129 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 msgid "Bucket fill" msgstr "Заливка" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:404 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:397 msgid "Paints neighboring facets that have the same color." msgstr "Окрашивает соседние грани, имеющие одинаковый цвет." -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:450 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:443 msgid "Split bigger facets into smaller ones while the object is painted." msgstr "Во время окрашивания модели делит большие грани на более мелкие." -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:674 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:645 #, boost-format msgid "Painted using: Extruder %1%" msgstr "Окрашено с помощью экструдера %1%" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:118 +msgid "Entering Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:119 +msgid "Leaving Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:120 +msgid "Multimaterial painting editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:76 msgid "Move" msgstr "Перемещение" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:466 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4532 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:643 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:745 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:775 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:813 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:830 +#: src/libslic3r/PrintConfig.cpp:4698 msgid "Rotate" msgstr "Поворот" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:505 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:707 msgid "Optimize orientation" msgstr "Оптимизация положения модели" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:552 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:319 -msgid "Apply" -msgstr "Применить" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:79 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4547 -msgid "Scale" -msgstr "Масштаб" +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:194 +msgid "Gizmo-Scale" +msgstr "Гизмо масштаба" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 msgid "Enforce seam" msgstr "Принудительный шов" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:38 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:255 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:252 msgid "Block seam" msgstr "Блокировка шва" @@ -2951,276 +4162,278 @@ msgstr "Блокировка шва" msgid "Seam painting" msgstr "Рисование шва" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:23 +msgid "Entering Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:24 +msgid "Leaving Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:25 +msgid "Paint-on seam editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:105 msgid "Mesh name" msgstr "Имя сетки" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:69 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:107 msgid "Detail level" msgstr "Уровень детализации" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:108 msgid "Decimate ratio" msgstr "Коэффициент упрощения" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:113 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:147 #, boost-format msgid "" "Processing model '%1%' with more than 1M triangles could be slow. It is " -"highly recommend to reduce amount of triangles." +"highly recommended to reduce amount of triangles." msgstr "" -"Обработка модели '%1%' с более чем 1 млн треугольников может быть медленной. " -"Настоятельно рекомендуется уменьшить количество треугольников." -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:116 -#: src/slic3r/GUI/GUI_Factories.cpp:705 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:150 +#: src/slic3r/GUI/GUI_Factories.cpp:789 msgid "Simplify model" msgstr "Упростить полигональную сетку" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:143 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:177 msgid "Simplify" msgstr "Упрощение полигональной сетки" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:156 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:190 msgid "Simplification is currently only allowed when a single part is selected" msgstr "В настоящее время упрощение работает только при выборе одной модели" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 -#: src/slic3r/GUI/PrintHostDialogs.cpp:373 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:191 +#: src/slic3r/GUI/MainFrame.cpp:1246 src/slic3r/GUI/MainFrame.cpp:1716 +#: src/slic3r/GUI/PrintHostDialogs.cpp:425 msgid "Error" msgstr "Ошибка" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:250 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:294 msgid "Extra high" msgstr "Очень высокий" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:251 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:295 msgid "High" msgstr "Высокий" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:252 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:296 msgid "Medium" msgstr "Средний" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:297 msgid "Low" msgstr "Низкий" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:254 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:298 msgid "Extra low" msgstr "Очень низкий" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:304 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#, boost-format +msgid "" +"Multipart object can be simplified only by %1%. If you want specify %2% " +"process it separately." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:352 #, c-format, boost-format msgid "%d triangles" msgstr "Треугольников: %d" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:307 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:355 msgid "Show wireframe" msgstr "Показывать каркас" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:313 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:361 msgid "Operation already cancelling. Please wait few seconds." msgstr "Операция уже отменена. Пожалуйста, подождите несколько секунд." -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:370 msgid "Can't apply when proccess preview." msgstr "Невозможно применить при предпросмотре." -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:329 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:377 #, boost-format msgid "Process %1% / 100" msgstr "Обработка %1% / 100" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:479 -#, boost-format -msgid "Simplify %1%" -msgstr "Упрощение %1%" +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:542 +msgid "Simplify " +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:543 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"simplifying the mesh." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:67 +msgid "Entering SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:68 +msgid "Leaving SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:35 msgid "Head diameter" msgstr "Диаметр носика поддержки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:36 msgid "Lock supports under new islands" msgstr "Блокировка поддержки под новые острова" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:37 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268 msgid "Remove selected points" msgstr "Удалить выбранные точки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:38 msgid "Remove all points" msgstr "Удалить все точки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1226 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1271 msgid "Apply changes" msgstr "Применить изменения" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1227 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1272 msgid "Discard changes" msgstr "Отменить изменения" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 msgid "Minimal points distance" msgstr "Мин. расстояние м/у точками" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3735 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/libslic3r/PrintConfig.cpp:3867 msgid "Support points density" msgstr "Плотность точек поддержки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1229 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1274 msgid "Auto-generate points" msgstr "Сгенерировать точки автоматически" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 msgid "Manual editing" msgstr "Ручное редактирование" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:372 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:307 msgid "Add support point" msgstr "Добавить точку поддержки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:522 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:460 msgid "Delete support point" msgstr "Удалить точку поддержки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:702 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:626 msgid "Change point head diameter" msgstr "Изменение диаметра носика поддержки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:770 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:696 msgid "Support parameter change" msgstr "Изменение параметра поддержки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:876 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:806 msgid "SLA Support Points" msgstr "Точки SLA поддержки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:814 msgid "Do you want to save your manually edited support points?" msgstr "Сохранить отредактированные вручную точки поддержки?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:898 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:815 msgid "Save support points?" msgstr "Сохранить точки поддержки?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:958 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:880 msgid "Move support point" msgstr "Перемещение точки поддержки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1051 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:987 msgid "Support points edit" msgstr "Редактирование точек поддержки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1131 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1117 msgid "Autogeneration will erase all manually edited points." msgstr "Автогенерация сотрёт все опорные точки, отредактированные вручную." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1132 -msgid "Are you sure you want to do it?" -msgstr "Вы уверены, что хотите это сделать?" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1138 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1124 msgid "Autogenerate support points" msgstr "Автогенерация точек поддержки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1186 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 msgid "SLA gizmo keyboard shortcuts" msgstr "Горячие клавиши «Гизмо SLA»" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1197 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1242 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "" "Примечание: некоторые сочетания клавиш работают только в режиме " "(не)редактирования." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 -msgid "Left click" -msgstr "Левая кнопка мыши" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 msgid "Add point" msgstr "Добавить точку" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 -msgid "Right click" -msgstr "Правая кнопка мыши" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 msgid "Remove point" msgstr "Удалить точку" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 -msgid "Drag" -msgstr "Перетащить мышь" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 msgid "Move point" msgstr "Передвинуть точку" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 msgid "Add point to selection" msgstr "Добавить точку к выбранным точкам" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 msgid "Remove point from selection" msgstr "Удалить точку из выбранных точек" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 msgid "Select by rectangle" msgstr "Выбрать точки прямоугольником" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 msgid "Deselect by rectangle" msgstr "Убрать выбранные точки прямоугольником" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1267 msgid "Select all points" msgstr "Выбрать все точки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Mouse wheel" msgstr "Колесо мыши" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Move clipping plane" msgstr "Переместить плоскость отсечения" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1225 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1270 msgid "Reset clipping plane" msgstr "Сброс плоскости отсечения" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1228 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273 msgid "Switch to editing mode" msgstr "Переключиться в режим редактирования" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:196 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:204 msgid "" "ERROR: Please close all manipulators available from the left toolbar first" msgstr "" "ОШИБКА: Пожалуйста, сначала завершите все манипуляции на левой панели " "инструментов" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:561 -msgid "Gizmo-Scale" -msgstr "Гизмо масштаба" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:673 -msgid "Gizmo-Place on Face" -msgstr "Гизмо поверхностью на стол" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:1270 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:998 msgid "" "You are currently editing SLA support points. Please, apply or discard your " "changes first." @@ -3228,16 +4441,16 @@ msgstr "" "Сейчас вы редактируете точки SLA поддержки. Пожалуйста, сначала примените " "или отмените ваши изменения." -#: src/slic3r/GUI/GUI.cpp:292 +#: src/slic3r/GUI/GUI.cpp:287 msgid "Undefined" msgstr "Не распознан" -#: src/slic3r/GUI/GUI.cpp:317 +#: src/slic3r/GUI/GUI.cpp:308 #, boost-format msgid "%1% was substituted with %2%" msgstr "%1% была заменена на %2%" -#: src/slic3r/GUI/GUI.cpp:326 +#: src/slic3r/GUI/GUI.cpp:317 msgid "" "Most likely the configuration was produced by a newer version of PrusaSlicer " "or by some PrusaSlicer fork." @@ -3245,23 +4458,23 @@ msgstr "" "Скорее всего, конфигурация была создана более новой версией PrusaSlicer или " "каким-нибудь форком PrusaSlicer." -#: src/slic3r/GUI/GUI.cpp:327 +#: src/slic3r/GUI/GUI.cpp:318 msgid "The following values were substituted:" msgstr "Следующие значения были заменены:" -#: src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/GUI.cpp:319 msgid "Review the substitutions and adjust them if needed." msgstr "Просмотрите замену и при необходимости скорректируйте." -#: src/slic3r/GUI/GUI.cpp:338 src/slic3r/GUI/Plater.cpp:820 +#: src/slic3r/GUI/GUI.cpp:329 src/slic3r/GUI/Plater.cpp:850 msgid "SLA print settings" msgstr "Профиль SLA печати" -#: src/slic3r/GUI/GUI.cpp:342 src/slic3r/GUI/PhysicalPrinterDialog.cpp:157 +#: src/slic3r/GUI/GUI.cpp:333 src/slic3r/GUI/PhysicalPrinterDialog.cpp:158 msgid "Physical Printer" msgstr "Физический принтер" -#: src/slic3r/GUI/GUI.cpp:355 +#: src/slic3r/GUI/GUI.cpp:346 msgid "" "Configuration bundle was loaded, however some configuration values were not " "recognized." @@ -3269,7 +4482,7 @@ msgstr "" "Пакет конфигурации был загружен, однако некоторые значения конфигурации не " "были распознаны." -#: src/slic3r/GUI/GUI.cpp:365 +#: src/slic3r/GUI/GUI.cpp:356 #, boost-format msgid "" "Configuration file \"%1%\" was loaded, however some configuration values " @@ -3278,15 +4491,15 @@ msgstr "" "Файл конфигурации \"%1%\" был загружен, однако некоторые значения " "конфигурации не были распознаны." -#: src/slic3r/GUI/GUI_App.cpp:266 +#: src/slic3r/GUI/GUI_App.cpp:275 msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." msgstr "is based on Slic3r by Alessandro Ranellucci and the RepRap community." -#: src/slic3r/GUI/GUI_App.cpp:267 +#: src/slic3r/GUI/GUI_App.cpp:276 msgid "Developed by Prusa Research." msgstr "Разработано Prusa Research." -#: src/slic3r/GUI/GUI_App.cpp:269 +#: src/slic3r/GUI/GUI_App.cpp:278 msgid "" "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." @@ -3294,11 +4507,11 @@ msgstr "" "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." -#: src/slic3r/GUI/GUI_App.cpp:270 -msgid "Artwork model by Leslie Ing" +#: src/slic3r/GUI/GUI_App.cpp:279 +msgid "Artwork model by Creative Tools" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:411 +#: src/slic3r/GUI/GUI_App.cpp:420 #, boost-format msgid "" "Starting with %1% 2.3, configuration directory on Linux has changed " @@ -3332,20 +4545,20 @@ msgstr "" "\n" "Что вы хотите сейчас сделать?" -#: src/slic3r/GUI/GUI_App.cpp:419 +#: src/slic3r/GUI/GUI_App.cpp:428 #, c-format, boost-format msgid "%s - BREAKING CHANGE" msgstr "%s - КРИТИЧЕСКОЕ ИЗМЕНЕНИЕ" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Quit, I will move my data now" msgstr "Выйти и перенести свои данные" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Start the application" msgstr "Запустить приложение" -#: src/slic3r/GUI/GUI_App.cpp:699 +#: src/slic3r/GUI/GUI_App.cpp:725 #, c-format, boost-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -3360,11 +4573,11 @@ msgstr "" "\n" "Приложение будет закрыто." -#: src/slic3r/GUI/GUI_App.cpp:702 +#: src/slic3r/GUI/GUI_App.cpp:728 msgid "Fatal error" msgstr "Критическая ошибка" -#: src/slic3r/GUI/GUI_App.cpp:706 +#: src/slic3r/GUI/GUI_App.cpp:732 msgid "" "PrusaSlicer has encountered a localization error. Please report to " "PrusaSlicer team, what language was active and in which scenario this issue " @@ -3377,16 +4590,16 @@ msgstr "" "сценарии произошла эта ошибка.\n" "Теперь приложение будет закрыто." -#: src/slic3r/GUI/GUI_App.cpp:709 +#: src/slic3r/GUI/GUI_App.cpp:735 msgid "Critical error" msgstr "Критическая ошибка" -#: src/slic3r/GUI/GUI_App.cpp:714 +#: src/slic3r/GUI/GUI_App.cpp:740 #, boost-format msgid "Internal error: %1%" msgstr "Внутренняя ошибка: %1%" -#: src/slic3r/GUI/GUI_App.cpp:909 src/slic3r/GUI/GUI_App.cpp:1007 +#: src/slic3r/GUI/GUI_App.cpp:954 src/slic3r/GUI/GUI_App.cpp:1051 msgid "" "Error parsing PrusaSlicer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error. Your user profiles will " @@ -3397,7 +4610,7 @@ msgstr "" "Попробуйте вручную удалить файл для восстановления после ошибки. " "Пользовательские профили не будут затронуты." -#: src/slic3r/GUI/GUI_App.cpp:915 src/slic3r/GUI/GUI_App.cpp:1013 +#: src/slic3r/GUI/GUI_App.cpp:960 src/slic3r/GUI/GUI_App.cpp:1057 msgid "" "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error." @@ -3405,12 +4618,12 @@ msgstr "" "Ошибка обработки конфигурационного файла PrusaGCodeViewer. Вероятно, он " "повреждён. Попробуйте вручную удалить файл для восстановления после ошибки." -#: src/slic3r/GUI/GUI_App.cpp:962 +#: src/slic3r/GUI/GUI_App.cpp:1006 #, boost-format msgid "You are opening %1% version %2%." msgstr "Вы запустили %1% версии %2%." -#: src/slic3r/GUI/GUI_App.cpp:965 +#: src/slic3r/GUI/GUI_App.cpp:1009 #, boost-format msgid "" "The active configuration was created by %1% %2%,\n" @@ -3428,7 +4641,7 @@ msgstr "" "Если да, то перед импортом новой конфигурации будет создана резервная копия " "активной конфигурации." -#: src/slic3r/GUI/GUI_App.cpp:973 +#: src/slic3r/GUI/GUI_App.cpp:1017 #, boost-format msgid "" "An existing configuration was found in %3%\n" @@ -3441,19 +4654,19 @@ msgstr "" "\n" "Следует ли импортировать эту конфигурацию?" -#: src/slic3r/GUI/GUI_App.cpp:981 +#: src/slic3r/GUI/GUI_App.cpp:1025 msgid "Import" msgstr "Импорт" -#: src/slic3r/GUI/GUI_App.cpp:982 +#: src/slic3r/GUI/GUI_App.cpp:1026 msgid "Don't import" msgstr "Не импортировать" -#: src/slic3r/GUI/GUI_App.cpp:990 +#: src/slic3r/GUI/GUI_App.cpp:1034 msgid "Continue and import newer configuration?" msgstr "Продолжить и импортировать новую конфигурацию?" -#: src/slic3r/GUI/GUI_App.cpp:1051 +#: src/slic3r/GUI/GUI_App.cpp:1095 msgid "" "You are running a 32 bit build of PrusaSlicer on 64-bit Windows.\n" "32 bit build of PrusaSlicer will likely not be able to utilize all the RAM " @@ -3469,7 +4682,7 @@ msgstr "" "https://www.prusa3d.cz/prusaslicer/.\n" "Продолжить?" -#: src/slic3r/GUI/GUI_App.cpp:1134 +#: src/slic3r/GUI/GUI_App.cpp:1182 #, c-format, boost-format msgid "" "%s\n" @@ -3478,46 +4691,37 @@ msgstr "" "%s\n" "Хотите продолжить?" -#: src/slic3r/GUI/GUI_App.cpp:1136 src/slic3r/GUI/GUI_App.cpp:3101 -#: src/slic3r/GUI/Plater.cpp:1726 src/slic3r/GUI/UnsavedChangesDialog.cpp:889 +#: src/slic3r/GUI/GUI_App.cpp:1184 src/slic3r/GUI/GUI_App.cpp:3302 +#: src/slic3r/GUI/Plater.cpp:1736 src/slic3r/GUI/UnsavedChangesDialog.cpp:917 msgid "Remember my choice" msgstr "Запомнить мой выбор" -#: src/slic3r/GUI/GUI_App.cpp:1178 +#: src/slic3r/GUI/GUI_App.cpp:1226 msgid "Loading configuration" msgstr "Загрузка конфигурации" -#: src/slic3r/GUI/GUI_App.cpp:1209 -#, boost-format -msgid "New release version %1% is available." -msgstr "Доступна новый релиз программы %1%." - -#: src/slic3r/GUI/GUI_App.cpp:1210 -msgid "See Download page." -msgstr "Смотреть страницы загрузки." - -#: src/slic3r/GUI/GUI_App.cpp:1224 +#: src/slic3r/GUI/GUI_App.cpp:1257 #, boost-format msgid "New prerelease version %1% is available." msgstr "Доступна новая предрелизная версия %1%." -#: src/slic3r/GUI/GUI_App.cpp:1225 +#: src/slic3r/GUI/GUI_App.cpp:1258 msgid "See Releases page." msgstr "Смотрите страницу релизов." -#: src/slic3r/GUI/GUI_App.cpp:1262 +#: src/slic3r/GUI/GUI_App.cpp:1313 msgid "Preparing settings tabs" msgstr "Подготовка вкладок настроек" -#: src/slic3r/GUI/GUI_App.cpp:1336 src/slic3r/GUI/Preferences.cpp:287 +#: src/slic3r/GUI/GUI_App.cpp:1393 src/slic3r/GUI/Preferences.cpp:405 msgid "Restore window position on start" msgstr "Восстанавливать положение окна при запуске" -#: src/slic3r/GUI/GUI_App.cpp:1338 +#: src/slic3r/GUI/GUI_App.cpp:1395 msgid "PrusaSlicer started after a crash" msgstr "PrusaSlicer запустился после аварийного завершения" -#: src/slic3r/GUI/GUI_App.cpp:1339 +#: src/slic3r/GUI/GUI_App.cpp:1396 #, boost-format msgid "" "PrusaSlicer crashed last time when attempting to set window position.\n" @@ -3541,24 +4745,24 @@ msgstr "" "противном случае приложение, скорее всего, снова аварийно завершил свою " "работу." -#: src/slic3r/GUI/GUI_App.cpp:1351 +#: src/slic3r/GUI/GUI_App.cpp:1408 #, boost-format msgid "Disable \"%1%\"" msgstr "Отключите \"%1%\"" -#: src/slic3r/GUI/GUI_App.cpp:1352 +#: src/slic3r/GUI/GUI_App.cpp:1409 #, boost-format msgid "Leave \"%1%\" enabled" msgstr "Оставьте \"%1%\" включённым" -#: src/slic3r/GUI/GUI_App.cpp:1679 +#: src/slic3r/GUI/GUI_App.cpp:1780 msgid "" "You have the following presets with saved options for \"Print Host upload\"" msgstr "" "У вас имеются следующие профили с сохраненными параметрами для загрузки на " "хост печати" -#: src/slic3r/GUI/GUI_App.cpp:1683 +#: src/slic3r/GUI/GUI_App.cpp:1784 msgid "" "But since this version of PrusaSlicer we don't show this information in " "Printer Settings anymore.\n" @@ -3568,7 +4772,7 @@ msgstr "" "настройках принтера.\n" "Теперь эти настройки будут доступны в разделе настройки физических принтеров." -#: src/slic3r/GUI/GUI_App.cpp:1685 +#: src/slic3r/GUI/GUI_App.cpp:1786 msgid "" "By default new Printer devices will be named as \"Printer N\" during its " "creation.\n" @@ -3577,138 +4781,147 @@ msgstr "" "При создании новых принтеров они будут именоваться как «Принтер N».\n" "Примечание: это имя можно изменить позже в настройках физических принтеров" -#: src/slic3r/GUI/GUI_App.cpp:1689 src/slic3r/GUI/PhysicalPrinterDialog.cpp:726 +#: src/slic3r/GUI/GUI_App.cpp:1790 src/slic3r/GUI/PhysicalPrinterDialog.cpp:798 msgid "Information" msgstr "Информация" -#: src/slic3r/GUI/GUI_App.cpp:1702 src/slic3r/GUI/GUI_App.cpp:1713 +#: src/slic3r/GUI/GUI_App.cpp:1803 src/slic3r/GUI/GUI_App.cpp:1814 msgid "Recreating" msgstr "Воссоздание" -#: src/slic3r/GUI/GUI_App.cpp:1716 +#: src/slic3r/GUI/GUI_App.cpp:1817 msgid "Loading of current presets" msgstr "Загрузка текущих профилей" -#: src/slic3r/GUI/GUI_App.cpp:1721 +#: src/slic3r/GUI/GUI_App.cpp:1822 msgid "Loading of a mode view" msgstr "Загрузка режима просмотра" -#: src/slic3r/GUI/GUI_App.cpp:1859 +#: src/slic3r/GUI/GUI_App.cpp:1961 msgid "Choose one file (3MF/AMF):" msgstr "Выберите один файл (3MF/AMF):" -#: src/slic3r/GUI/GUI_App.cpp:1871 +#: src/slic3r/GUI/GUI_App.cpp:1973 msgid "Choose one or more files (STL/3MF/STEP/OBJ/AMF/PRUSA):" msgstr "Выберите один или несколько файлов (STL/3MF/STEP/OBJ/AMF/PRUSA):" -#: src/slic3r/GUI/GUI_App.cpp:1883 +#: src/slic3r/GUI/GUI_App.cpp:1984 +msgid "Choose ZIP file:" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1996 msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" msgstr "Выберите один файл (GCODE/.GCO/.G/.ngc/NGC):" -#: src/slic3r/GUI/GUI_App.cpp:1894 +#: src/slic3r/GUI/GUI_App.cpp:2007 msgid "Changing of an application language" msgstr "Изменение языка приложения" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Select the language" msgstr "Выбор языка" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Language" msgstr "Язык" -#: src/slic3r/GUI/GUI_App.cpp:2182 -msgid "modified" -msgstr "изменено" +#: src/slic3r/GUI/GUI_App.cpp:2363 +msgid "" +"Simple mode supports manipulation with single-part object(s)\n" +"or object(s) with support modifiers only." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2365 +msgid "Please check your object list before mode changing." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2366 +msgid "Change application mode" +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2236 +#: src/slic3r/GUI/GUI_App.cpp:2397 #, c-format, boost-format msgid "Run %s" msgstr "Запустить %s" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "&Configuration Snapshots" msgstr "&Резервные копии конфигурации (снапшот)" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "Inspect / activate configuration snapshots" msgstr "Проверка и активация резервных копий конфигурации" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Take Configuration &Snapshot" msgstr "Сделать &снапшот" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Capture a configuration snapshot" msgstr "Сделать резервную копию конфигурации (снапшот)" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for Configuration Updates" msgstr "Проверка наличие обновлений конфигурации" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for configuration updates" msgstr "Проверка наличие обновлений конфигурации" -#: src/slic3r/GUI/GUI_App.cpp:2249 +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for Application Updates" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for new version of application" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2411 msgid "&Preferences" msgstr "&Настройки приложения" -#: src/slic3r/GUI/GUI_App.cpp:2255 +#: src/slic3r/GUI/GUI_App.cpp:2417 msgid "Application preferences" msgstr "Настройки приложения" -#: src/slic3r/GUI/GUI_App.cpp:2260 src/slic3r/GUI/wxExtensions.cpp:708 -msgid "Simple" -msgstr "Простой" - -#: src/slic3r/GUI/GUI_App.cpp:2260 +#: src/slic3r/GUI/GUI_App.cpp:2422 msgid "Simple View Mode" msgstr "Простой режим просмотра интерфейса приложения" -#: src/slic3r/GUI/GUI_App.cpp:2262 src/slic3r/GUI/wxExtensions.cpp:710 -msgctxt "Mode" -msgid "Advanced" -msgstr "Расширенный" - -#: src/slic3r/GUI/GUI_App.cpp:2262 +#: src/slic3r/GUI/GUI_App.cpp:2424 msgid "Advanced View Mode" msgstr "Расширенный режим просмотра интерфейса приложения" -#: src/slic3r/GUI/GUI_App.cpp:2263 src/slic3r/GUI/wxExtensions.cpp:711 -msgid "Expert" -msgstr "Продвинутый" - -#: src/slic3r/GUI/GUI_App.cpp:2263 +#: src/slic3r/GUI/GUI_App.cpp:2425 msgid "Expert View Mode" msgstr "Продвинутый режим просмотра интерфейса приложения" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 msgid "Mode" msgstr "Режим интерфейса" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 #, c-format, boost-format msgid "%s View Mode" msgstr "%s режим просмотра" -#: src/slic3r/GUI/GUI_App.cpp:2271 +#: src/slic3r/GUI/GUI_App.cpp:2433 msgid "&Language" msgstr "&Язык программы" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Flash Printer &Firmware" msgstr "&Прошивка принтера" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Upload a firmware image into an Arduino based printer" msgstr "Загрузить прошивку в принтер на основе Arduino" -#: src/slic3r/GUI/GUI_App.cpp:2294 +#: src/slic3r/GUI/GUI_App.cpp:2459 msgid "Taking a configuration snapshot" msgstr "Создание резервной копии конфигурации (снапшот)" -#: src/slic3r/GUI/GUI_App.cpp:2295 +#: src/slic3r/GUI/GUI_App.cpp:2460 msgid "" "Some presets are modified and the unsaved changes will not be captured by " "the configuration snapshot." @@ -3716,32 +4929,28 @@ msgstr "" "В некоторых профилях имеются изменения. Несохранённые изменения в них не " "будут записаны в снапшот." -#: src/slic3r/GUI/GUI_App.cpp:2296 +#: src/slic3r/GUI/GUI_App.cpp:2461 msgid "Snapshot name" msgstr "Имя снапшота" -#: src/slic3r/GUI/GUI_App.cpp:2312 +#: src/slic3r/GUI/GUI_App.cpp:2477 msgid "Loading a configuration snapshot" msgstr "Загрузка резервной копии конфигурации (снапшот)" -#: src/slic3r/GUI/GUI_App.cpp:2321 +#: src/slic3r/GUI/GUI_App.cpp:2486 #, boost-format msgid "Continue to activate a configuration snapshot %1%?" msgstr "Активировать резервную копию конфигурации %1%?" -#: src/slic3r/GUI/GUI_App.cpp:2335 +#: src/slic3r/GUI/GUI_App.cpp:2500 msgid "Failed to activate configuration snapshot." msgstr "Сбой активации снапшота." -#: src/slic3r/GUI/GUI_App.cpp:2354 -msgid "Restart application" -msgstr "Перезапустить приложение" - -#: src/slic3r/GUI/GUI_App.cpp:2388 +#: src/slic3r/GUI/GUI_App.cpp:2520 msgid "Language selection" msgstr "Выбор языка" -#: src/slic3r/GUI/GUI_App.cpp:2391 +#: src/slic3r/GUI/GUI_App.cpp:2523 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." @@ -3749,87 +4958,101 @@ msgstr "" "Смена языка вызовет перезапуск приложения.\n" "Вы потеряете содержимое стола." -#: src/slic3r/GUI/GUI_App.cpp:2393 src/slic3r/GUI/Preferences.cpp:582 +#: src/slic3r/GUI/GUI_App.cpp:2525 src/slic3r/GUI/Preferences.cpp:730 +#: src/slic3r/GUI/Selection.cpp:1695 msgid "Do you want to proceed?" msgstr "Хотите продолжить?" -#: src/slic3r/GUI/GUI_App.cpp:2420 +#: src/slic3r/GUI/GUI_App.cpp:2552 msgid "&Configuration" msgstr "&Настройки" -#: src/slic3r/GUI/GUI_App.cpp:2534 src/slic3r/GUI/GUI_App.cpp:2595 -msgid "The preset modifications are successfully saved" -msgid_plural "The presets modifications are successfully saved" -msgstr[0] "Изменённый профиль успешно сохранён" -msgstr[1] "Изменённые профили успешно сохранёны" -msgstr[2] "Изменённые профили успешно сохранёны" +#: src/slic3r/GUI/GUI_App.cpp:2560 +msgid "Restart application" +msgstr "Перезапустить приложение" -#: src/slic3r/GUI/GUI_App.cpp:2598 +#: src/slic3r/GUI/GUI_App.cpp:2726 msgid "For new project all modifications will be reseted" msgstr "Для нового проекта все изменения будут сброшены" -#: src/slic3r/GUI/GUI_App.cpp:2636 +#: src/slic3r/GUI/GUI_App.cpp:2764 msgid "Loading a new project while the current project is modified." msgstr "Загрузка нового проекта при существующих изменениях в текущем проекте." -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Project is loading" msgstr "Загрузка проекта" -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Opening new project while some presets are unsaved." msgstr "Открытие нового проекта при несохранении некоторых профилей." -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "The uploads are still ongoing" msgstr "Загрузки всё ещё продолжаются" -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "Stop them and continue anyway?" msgstr "Остановить их и продолжить?" -#: src/slic3r/GUI/GUI_App.cpp:2662 +#: src/slic3r/GUI/GUI_App.cpp:2790 msgid "Ongoing uploads" msgstr "Текущие загрузки" -#: src/slic3r/GUI/GUI_App.cpp:2876 -msgid "It's impossible to print multi-part object(s) with SLA technology." -msgstr "По технологии SLA невозможно напечатать составную модель(и)." +#: src/slic3r/GUI/GUI_App.cpp:3026 +msgid "" +"It's impossible to print object(s) which contains parameter modifiers with " +"SLA technology." +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2877 src/slic3r/GUI/Jobs/SLAImportJob.cpp:235 -#: src/slic3r/GUI/Plater.cpp:2459 +#: src/slic3r/GUI/GUI_App.cpp:3027 src/slic3r/GUI/Jobs/SLAImportJob.cpp:149 +#: src/slic3r/GUI/Plater.cpp:2536 msgid "Please check your object list before preset changing." msgstr "Пожалуйста, проверьте список моделей перед изменением профиля." -#: src/slic3r/GUI/GUI_App.cpp:2901 +#: src/slic3r/GUI/GUI_App.cpp:3070 msgid "Configuration is editing from ConfigWizard" msgstr "Редактирование конфигурации с помощью мастера настроек" -#: src/slic3r/GUI/GUI_App.cpp:2926 +#: src/slic3r/GUI/GUI_App.cpp:3088 +#, boost-format +msgid "Welcome to %1% version %2%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3090 +#, boost-format +msgid "" +"Do you wish to register downloads from Printables.com\n" +"for this %1% %2% executable?\n" +"\n" +"Downloads can be registered for only 1 executable at time." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3118 msgid "Select a gcode file:" msgstr "Выбрать файл G-кода:" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "Open hyperlink in default browser?" msgstr "Открыть гиперссылку в браузере по умолчанию?" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "PrusaSlicer: Open hyperlink" msgstr "PrusaSlicer: Открытие гиперссылки" -#: src/slic3r/GUI/GUI_App.cpp:3105 src/slic3r/GUI/Preferences.cpp:382 +#: src/slic3r/GUI/GUI_App.cpp:3306 src/slic3r/GUI/Preferences.cpp:593 msgid "Suppress to open hyperlink in browser" msgstr "Запретить открытие гиперссылок в браузере" -#: src/slic3r/GUI/GUI_App.cpp:3107 src/slic3r/GUI/Plater.cpp:1732 +#: src/slic3r/GUI/GUI_App.cpp:3308 src/slic3r/GUI/Plater.cpp:1742 msgid "PrusaSlicer will remember your choice." msgstr "PrusaSlicer запомнит ваш выбор." -#: src/slic3r/GUI/GUI_App.cpp:3108 +#: src/slic3r/GUI/GUI_App.cpp:3309 msgid "You will not be asked about it again on hyperlinks hovering." msgstr "Вас больше не спросят об этом при наведении курсора на гиперссылки." -#: src/slic3r/GUI/GUI_App.cpp:3109 src/slic3r/GUI/Plater.cpp:1736 +#: src/slic3r/GUI/GUI_App.cpp:3310 src/slic3r/GUI/Plater.cpp:1746 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" @@ -3838,57 +5061,71 @@ msgstr "" "Зайдите в «Настройки приложения» и установите флажок \"%1%\", чтобы изменить " "свой выбор." -#: src/slic3r/GUI/GUI_App.cpp:3111 src/slic3r/GUI/Plater.cpp:1738 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:906 +#: src/slic3r/GUI/GUI_App.cpp:3312 src/slic3r/GUI/Plater.cpp:1748 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:934 msgid "PrusaSlicer: Don't ask me again" msgstr "PrusaSlicer: Не спрашивать снова" -#: src/slic3r/GUI/GUI_Init.cpp:57 src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_App.cpp:3386 +msgid "Check for application update has failed." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3387 +#, boost-format +msgid "No new version is available. Latest release version is %1%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3458 +msgid "Download of new version is already ongoing. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/GUI_Init.cpp:64 src/slic3r/GUI/GUI_Init.cpp:67 msgid "PrusaSlicer GUI initialization failed" msgstr "Ошибка инициализации графического интерфейса PrusaSlicer" -#: src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_Init.cpp:67 #, boost-format msgid "Fatal error, exception catched: %1%" msgstr "Критическая ошибка, обнаружено исключение: %1%" #: src/slic3r/GUI/GUI_Factories.cpp:54 src/slic3r/GUI/GUI_Factories.cpp:127 -#: src/libslic3r/PrintConfig.cpp:287 src/libslic3r/PrintConfig.cpp:404 -#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:456 -#: src/libslic3r/PrintConfig.cpp:708 src/libslic3r/PrintConfig.cpp:778 -#: src/libslic3r/PrintConfig.cpp:786 src/libslic3r/PrintConfig.cpp:1232 -#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1563 -#: src/libslic3r/PrintConfig.cpp:1955 src/libslic3r/PrintConfig.cpp:2030 -#: src/libslic3r/PrintConfig.cpp:2264 src/libslic3r/PrintConfig.cpp:2850 -#: src/libslic3r/PrintConfig.cpp:2858 src/libslic3r/PrintConfig.cpp:2918 -#: src/libslic3r/PrintConfig.cpp:2927 src/libslic3r/PrintConfig.cpp:3098 +#: src/libslic3r/PrintConfig.cpp:300 src/libslic3r/PrintConfig.cpp:423 +#: src/libslic3r/PrintConfig.cpp:466 src/libslic3r/PrintConfig.cpp:475 +#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:872 +#: src/libslic3r/PrintConfig.cpp:881 src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1376 src/libslic3r/PrintConfig.cpp:1604 +#: src/libslic3r/PrintConfig.cpp:1985 src/libslic3r/PrintConfig.cpp:2060 +#: src/libslic3r/PrintConfig.cpp:2294 src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:2946 src/libslic3r/PrintConfig.cpp:3006 +#: src/libslic3r/PrintConfig.cpp:3015 src/libslic3r/PrintConfig.cpp:3186 msgid "Layers and Perimeters" msgstr "Слои и периметры" #: src/slic3r/GUI/GUI_Factories.cpp:56 src/slic3r/GUI/GUI_Factories.cpp:131 -#: src/slic3r/GUI/GUI_Preview.cpp:249 src/slic3r/GUI/Tab.cpp:1547 -#: src/slic3r/GUI/Tab.cpp:1549 src/libslic3r/ExtrusionEntity.cpp:340 -#: src/libslic3r/ExtrusionEntity.cpp:372 src/libslic3r/PrintConfig.cpp:670 -#: src/libslic3r/PrintConfig.cpp:2095 src/libslic3r/PrintConfig.cpp:2104 -#: src/libslic3r/PrintConfig.cpp:2113 src/libslic3r/PrintConfig.cpp:2123 -#: src/libslic3r/PrintConfig.cpp:2132 src/libslic3r/PrintConfig.cpp:2554 -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2568 -#: src/libslic3r/PrintConfig.cpp:2581 src/libslic3r/PrintConfig.cpp:2591 -#: src/libslic3r/PrintConfig.cpp:2599 src/libslic3r/PrintConfig.cpp:2617 -#: src/libslic3r/PrintConfig.cpp:2634 src/libslic3r/PrintConfig.cpp:2655 -#: src/libslic3r/PrintConfig.cpp:2668 src/libslic3r/PrintConfig.cpp:2685 -#: src/libslic3r/PrintConfig.cpp:2703 src/libslic3r/PrintConfig.cpp:2718 -#: src/libslic3r/PrintConfig.cpp:2728 src/libslic3r/PrintConfig.cpp:2737 -#: src/libslic3r/PrintConfig.cpp:2748 src/libslic3r/PrintConfig.cpp:2762 -#: src/libslic3r/PrintConfig.cpp:2778 src/libslic3r/PrintConfig.cpp:2786 -#: src/libslic3r/PrintConfig.cpp:2787 src/libslic3r/PrintConfig.cpp:2796 -#: src/libslic3r/PrintConfig.cpp:2810 src/libslic3r/PrintConfig.cpp:2818 -#: src/libslic3r/PrintConfig.cpp:2832 +#: src/slic3r/GUI/Tab.cpp:1494 src/slic3r/GUI/Tab.cpp:1496 +#: src/libslic3r/PrintConfig.cpp:773 src/libslic3r/PrintConfig.cpp:2125 +#: src/libslic3r/PrintConfig.cpp:2134 src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2153 src/libslic3r/PrintConfig.cpp:2162 +#: src/libslic3r/PrintConfig.cpp:2584 src/libslic3r/PrintConfig.cpp:2590 +#: src/libslic3r/PrintConfig.cpp:2598 src/libslic3r/PrintConfig.cpp:2611 +#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2628 +#: src/libslic3r/PrintConfig.cpp:2644 src/libslic3r/PrintConfig.cpp:2660 +#: src/libslic3r/PrintConfig.cpp:2681 src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2725 +#: src/libslic3r/PrintConfig.cpp:2743 src/libslic3r/PrintConfig.cpp:2753 +#: src/libslic3r/PrintConfig.cpp:2762 src/libslic3r/PrintConfig.cpp:2773 +#: src/libslic3r/PrintConfig.cpp:2785 src/libslic3r/PrintConfig.cpp:2799 +#: src/libslic3r/PrintConfig.cpp:2807 src/libslic3r/PrintConfig.cpp:2808 +#: src/libslic3r/PrintConfig.cpp:2817 src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2840 src/libslic3r/PrintConfig.cpp:2854 +#: src/libslic3r/PrintConfig.cpp:2862 src/libslic3r/PrintConfig.cpp:2873 +#: src/libslic3r/PrintConfig.cpp:2884 src/libslic3r/PrintConfig.cpp:2893 +#: src/libslic3r/PrintConfig.cpp:2903 src/libslic3r/PrintConfig.cpp:2915 msgid "Support material" msgstr "Поддержка" #: src/slic3r/GUI/GUI_Factories.cpp:59 src/slic3r/GUI/GUI_Factories.cpp:135 -#: src/libslic3r/PrintConfig.cpp:3054 src/libslic3r/PrintConfig.cpp:3062 +#: src/libslic3r/PrintConfig.cpp:3142 src/libslic3r/PrintConfig.cpp:3150 msgid "Wipe options" msgstr "Параметры очистки" @@ -3896,330 +5133,351 @@ msgstr "Параметры очистки" msgid "Pad and Support" msgstr "Подложка и Поддержка" -#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/GUI_Preview.cpp:245 -#: src/slic3r/GUI/Tab.cpp:1513 src/libslic3r/ExtrusionEntity.cpp:336 -#: src/libslic3r/ExtrusionEntity.cpp:364 src/libslic3r/PrintConfig.cpp:1579 -#: src/libslic3r/PrintConfig.cpp:1585 src/libslic3r/PrintConfig.cpp:1599 -#: src/libslic3r/PrintConfig.cpp:1609 src/libslic3r/PrintConfig.cpp:1617 -#: src/libslic3r/PrintConfig.cpp:1619 +#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/Tab.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1620 src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1638 src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1656 src/libslic3r/PrintConfig.cpp:1658 msgid "Ironing" msgstr "Разглаживание" -#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1283 -#: src/libslic3r/PrintConfig.cpp:1284 src/libslic3r/PrintConfig.cpp:1299 -#: src/libslic3r/PrintConfig.cpp:1309 +#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1344 src/libslic3r/PrintConfig.cpp:1356 +#: src/libslic3r/PrintConfig.cpp:1366 msgid "Fuzzy Skin" msgstr "Нечёткая оболочка" -#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/GUI_Preview.cpp:220 -#: src/slic3r/GUI/Tab.cpp:1581 src/libslic3r/PrintConfig.cpp:507 -#: src/libslic3r/PrintConfig.cpp:766 src/libslic3r/PrintConfig.cpp:1326 -#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1618 -#: src/libslic3r/PrintConfig.cpp:2020 src/libslic3r/PrintConfig.cpp:2352 -#: src/libslic3r/PrintConfig.cpp:2405 src/libslic3r/PrintConfig.cpp:2903 +#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/Tab.cpp:1536 +#: src/libslic3r/PrintConfig.cpp:526 src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:548 src/libslic3r/PrintConfig.cpp:557 +#: src/libslic3r/PrintConfig.cpp:566 src/libslic3r/PrintConfig.cpp:575 +#: src/libslic3r/PrintConfig.cpp:852 src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1657 +#: src/libslic3r/PrintConfig.cpp:2050 src/libslic3r/PrintConfig.cpp:2383 +#: src/libslic3r/PrintConfig.cpp:2436 src/libslic3r/PrintConfig.cpp:2991 msgid "Speed" msgstr "Скорость" -#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1623 -#: src/slic3r/GUI/Tab.cpp:2304 src/libslic3r/PrintConfig.cpp:796 -#: src/libslic3r/PrintConfig.cpp:1489 src/libslic3r/PrintConfig.cpp:1997 -#: src/libslic3r/PrintConfig.cpp:2373 src/libslic3r/PrintConfig.cpp:2647 -#: src/libslic3r/PrintConfig.cpp:2675 +#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1585 +#: src/slic3r/GUI/Tab.cpp:2288 src/libslic3r/PrintConfig.cpp:889 +#: src/libslic3r/PrintConfig.cpp:1530 src/libslic3r/PrintConfig.cpp:2027 +#: src/libslic3r/PrintConfig.cpp:2404 src/libslic3r/PrintConfig.cpp:2673 +#: src/libslic3r/PrintConfig.cpp:2701 msgid "Extruders" msgstr "Экструдеры" -#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:754 -#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:1218 -#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:2006 -#: src/libslic3r/PrintConfig.cpp:2393 src/libslic3r/PrintConfig.cpp:2656 -#: src/libslic3r/PrintConfig.cpp:2890 +#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:840 +#: src/libslic3r/PrintConfig.cpp:953 src/libslic3r/PrintConfig.cpp:1278 +#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:2036 +#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2682 +#: src/libslic3r/PrintConfig.cpp:2978 msgid "Extrusion Width" msgstr "Ширина экструзии" -#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1533 -#: src/libslic3r/PrintConfig.cpp:517 src/libslic3r/PrintConfig.cpp:528 -#: src/libslic3r/PrintConfig.cpp:544 +#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:631 src/libslic3r/PrintConfig.cpp:642 +#: src/libslic3r/PrintConfig.cpp:655 msgid "Skirt and brim" msgstr "Юбка и кайма" -#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 -#: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1645 -#: src/slic3r/GUI/Tab.cpp:1649 src/slic3r/GUI/Tab.cpp:2031 -#: src/slic3r/GUI/Tab.cpp:2402 src/slic3r/GUI/Tab.cpp:4729 -#: src/libslic3r/PrintConfig.cpp:260 src/libslic3r/PrintConfig.cpp:495 -#: src/libslic3r/PrintConfig.cpp:1438 src/libslic3r/PrintConfig.cpp:1525 -#: src/libslic3r/PrintConfig.cpp:1572 src/libslic3r/PrintConfig.cpp:2530 -#: src/libslic3r/PrintConfig.cpp:2540 src/libslic3r/PrintConfig.cpp:3078 -#: src/libslic3r/PrintConfig.cpp:3113 src/libslic3r/PrintConfig.cpp:3124 -#: src/libslic3r/PrintConfig.cpp:3139 src/libslic3r/PrintConfig.cpp:3152 -#: src/libslic3r/PrintConfig.cpp:3161 src/libslic3r/PrintConfig.cpp:3173 -#: src/libslic3r/PrintConfig.cpp:3370 -msgid "Advanced" -msgstr "Дополнительно" - -#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4663 src/slic3r/GUI/Tab.cpp:4664 -#: src/libslic3r/PrintConfig.cpp:3564 src/libslic3r/PrintConfig.cpp:3571 -#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3589 -#: src/libslic3r/PrintConfig.cpp:3599 src/libslic3r/PrintConfig.cpp:3609 -#: src/libslic3r/PrintConfig.cpp:3646 src/libslic3r/PrintConfig.cpp:3653 -#: src/libslic3r/PrintConfig.cpp:3664 src/libslic3r/PrintConfig.cpp:3674 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3696 -#: src/libslic3r/PrintConfig.cpp:3706 src/libslic3r/PrintConfig.cpp:3715 -#: src/libslic3r/PrintConfig.cpp:3725 src/libslic3r/PrintConfig.cpp:3736 -#: src/libslic3r/PrintConfig.cpp:3744 +#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Tab.cpp:4946 src/slic3r/GUI/Tab.cpp:4948 +#: src/libslic3r/PrintConfig.cpp:3328 src/libslic3r/PrintConfig.cpp:3337 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3356 +#: src/libslic3r/PrintConfig.cpp:3366 src/libslic3r/PrintConfig.cpp:3387 +#: src/libslic3r/PrintConfig.cpp:3410 src/libslic3r/PrintConfig.cpp:3417 +#: src/libslic3r/PrintConfig.cpp:3432 src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3464 +#: src/libslic3r/PrintConfig.cpp:3474 src/libslic3r/PrintConfig.cpp:3488 +#: src/libslic3r/PrintConfig.cpp:3498 src/libslic3r/PrintConfig.cpp:3841 +#: src/libslic3r/PrintConfig.cpp:3861 src/libslic3r/PrintConfig.cpp:3868 +#: src/libslic3r/PrintConfig.cpp:3876 msgid "Supports" msgstr "Поддержка" -#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4704 src/slic3r/GUI/Tab.cpp:4705 -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3752 -#: src/libslic3r/PrintConfig.cpp:3759 src/libslic3r/PrintConfig.cpp:3773 -#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3794 -#: src/libslic3r/PrintConfig.cpp:3816 src/libslic3r/PrintConfig.cpp:3827 -#: src/libslic3r/PrintConfig.cpp:3834 src/libslic3r/PrintConfig.cpp:3841 -#: src/libslic3r/PrintConfig.cpp:3852 src/libslic3r/PrintConfig.cpp:3861 -#: src/libslic3r/PrintConfig.cpp:3870 +#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:590 +#: src/slic3r/GUI/Tab.cpp:4960 src/slic3r/GUI/Tab.cpp:4961 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3884 +#: src/libslic3r/PrintConfig.cpp:3891 src/libslic3r/PrintConfig.cpp:3905 +#: src/libslic3r/PrintConfig.cpp:3916 src/libslic3r/PrintConfig.cpp:3926 +#: src/libslic3r/PrintConfig.cpp:3948 src/libslic3r/PrintConfig.cpp:3959 +#: src/libslic3r/PrintConfig.cpp:3966 src/libslic3r/PrintConfig.cpp:3973 +#: src/libslic3r/PrintConfig.cpp:3984 src/libslic3r/PrintConfig.cpp:3993 +#: src/libslic3r/PrintConfig.cpp:4002 msgid "Pad" msgstr "Подложка" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4722 -#: src/slic3r/GUI/Tab.cpp:4723 src/libslic3r/SLA/Hollowing.cpp:73 -#: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3880 -#: src/libslic3r/PrintConfig.cpp:3887 src/libslic3r/PrintConfig.cpp:3897 -#: src/libslic3r/PrintConfig.cpp:3906 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4978 +#: src/slic3r/GUI/Tab.cpp:4979 src/libslic3r/SLA/Hollowing.cpp:86 +#: src/libslic3r/SLA/Hollowing.cpp:91 src/libslic3r/SLA/Hollowing.cpp:106 +#: src/libslic3r/SLA/Hollowing.cpp:115 src/libslic3r/PrintConfig.cpp:4012 +#: src/libslic3r/PrintConfig.cpp:4019 src/libslic3r/PrintConfig.cpp:4029 +#: src/libslic3r/PrintConfig.cpp:4038 msgid "Hollowing" msgstr "Полость" -#: src/slic3r/GUI/GUI_Factories.cpp:160 +#: src/slic3r/GUI/GUI_Factories.cpp:159 msgid "Add part" msgstr "Добавить элемент" -#: src/slic3r/GUI/GUI_Factories.cpp:161 +#: src/slic3r/GUI/GUI_Factories.cpp:160 msgid "Add negative volume" msgstr "Добавить объём для исключения" -#: src/slic3r/GUI/GUI_Factories.cpp:162 +#: src/slic3r/GUI/GUI_Factories.cpp:161 msgid "Add modifier" msgstr "Добавить модификатор" -#: src/slic3r/GUI/GUI_Factories.cpp:163 +#: src/slic3r/GUI/GUI_Factories.cpp:162 msgid "Add support blocker" msgstr "Блокировщик поддержки" -#: src/slic3r/GUI/GUI_Factories.cpp:164 +#: src/slic3r/GUI/GUI_Factories.cpp:163 msgid "Add support enforcer" msgstr "Принудительная поддержка" -#: src/slic3r/GUI/GUI_Factories.cpp:300 +#: src/slic3r/GUI/GUI_Factories.cpp:169 +msgid "Add text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:170 +msgid "Add negative text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:171 +msgid "Add text modifier" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:307 msgid "Select showing settings" msgstr "Выбор параметров отображения" -#: src/slic3r/GUI/GUI_Factories.cpp:407 src/slic3r/GUI/GUI_Factories.cpp:412 -#: src/slic3r/GUI/GUI_Factories.cpp:556 src/slic3r/GUI/GUI_Factories.cpp:562 +#: src/slic3r/GUI/GUI_Factories.cpp:414 src/slic3r/GUI/GUI_Factories.cpp:419 +#: src/slic3r/GUI/GUI_Factories.cpp:625 src/slic3r/GUI/GUI_Factories.cpp:631 #, c-format, boost-format msgid "Quick Add Settings (%s)" msgstr "Быстрое добавление настроек (%s)" -#: src/slic3r/GUI/GUI_Factories.cpp:444 +#: src/slic3r/GUI/GUI_Factories.cpp:460 msgid "Remove the selected object" msgstr "Удалить выбранную модель" -#: src/slic3r/GUI/GUI_Factories.cpp:456 +#: src/slic3r/GUI/GUI_Factories.cpp:475 msgid "Load" msgstr "Загрузить" -#: src/slic3r/GUI/GUI_Factories.cpp:461 src/slic3r/GUI/GUI_Factories.cpp:501 -#: src/slic3r/GUI/GUI_Factories.cpp:505 +#: src/slic3r/GUI/GUI_Factories.cpp:481 src/slic3r/GUI/GUI_Factories.cpp:566 +#: src/slic3r/GUI/GUI_Factories.cpp:570 msgid "Box" msgstr "Куб" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Cylinder" msgstr "Цилиндр" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Slab" msgstr "Плита" -#: src/slic3r/GUI/GUI_Factories.cpp:471 +#: src/slic3r/GUI/GUI_Factories.cpp:493 msgid "Gallery" msgstr "Библиотека" -#: src/slic3r/GUI/GUI_Factories.cpp:488 src/slic3r/GUI/GUI_Factories.cpp:526 +#: src/slic3r/GUI/GUI_Factories.cpp:529 src/slic3r/GUI/GUI_Factories.cpp:549 +#: src/slic3r/GUI/GUI_ObjectList.cpp:660 +msgid "Text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:555 src/slic3r/GUI/GUI_Factories.cpp:558 +#: src/slic3r/GUI/GUI_Factories.cpp:595 msgid "Height range Modifier" msgstr "Модификатор диапазона высоты слоёв" -#: src/slic3r/GUI/GUI_Factories.cpp:535 +#: src/slic3r/GUI/GUI_Factories.cpp:604 msgid "Add settings" msgstr "Добавить настройки" -#: src/slic3r/GUI/GUI_Factories.cpp:626 +#: src/slic3r/GUI/GUI_Factories.cpp:695 msgid "Change type" msgstr "Изменить тип" -#: src/slic3r/GUI/GUI_Factories.cpp:636 src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:705 src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Object" msgstr "Превратить в отдельную модель" -#: src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Objects" msgstr "Превратить в отдельные модели" -#: src/slic3r/GUI/GUI_Factories.cpp:658 +#: src/slic3r/GUI/GUI_Factories.cpp:727 msgid "Printable" msgstr "Для печати" -#: src/slic3r/GUI/GUI_Factories.cpp:686 +#: src/slic3r/GUI/GUI_Factories.cpp:755 src/slic3r/GUI/GUI_ObjectList.cpp:2070 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2582 +msgid "Invalidate cut info" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:770 msgid "Rename" msgstr "Переименовать" -#: src/slic3r/GUI/GUI_Factories.cpp:696 +#: src/slic3r/GUI/GUI_Factories.cpp:780 msgid "Fix through the Netfabb" msgstr "Ремонт модели службой Netfabb" -#: src/slic3r/GUI/GUI_Factories.cpp:715 -msgid "Export as STL" -msgstr "Экспорт в STL" +#: src/slic3r/GUI/GUI_Factories.cpp:799 +msgid "Export as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:726 +#: src/slic3r/GUI/GUI_Factories.cpp:810 msgid "Reload the selected volumes from disk" msgstr "Перезагрузить выбранные объёмы с диска" -#: src/slic3r/GUI/GUI_Factories.cpp:733 src/slic3r/GUI/Plater.cpp:3568 +#: src/slic3r/GUI/GUI_Factories.cpp:817 src/slic3r/GUI/Plater.cpp:3602 msgid "Replace with STL" msgstr "Заменить STL" -#: src/slic3r/GUI/GUI_Factories.cpp:733 +#: src/slic3r/GUI/GUI_Factories.cpp:817 msgid "Replace the selected volume with new STL" msgstr "Заменить выбранный объём новым STL файлом" -#: src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Set extruder for selected items" msgstr "Задать экструдер для выбранных частей" -#: src/slic3r/GUI/GUI_Factories.cpp:778 src/slic3r/Utils/Repetier.cpp:126 -#: src/slic3r/Utils/Repetier.cpp:209 src/libslic3r/PrintConfig.cpp:635 -#: src/libslic3r/PrintConfig.cpp:2770 +#: src/slic3r/GUI/GUI_Factories.cpp:862 src/slic3r/Utils/Repetier.cpp:145 +#: src/slic3r/Utils/Repetier.cpp:226 src/libslic3r/PrintConfig.cpp:738 +#: src/libslic3r/PrintConfig.cpp:2790 src/libslic3r/PrintConfig.cpp:3851 msgid "Default" msgstr "По умолчанию" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale to print volume" msgstr "Отмасштабировать под область печати" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale the selected object to fit the print volume" msgstr "Отмасштабировать выбранную модель до объёма стола" -#: src/slic3r/GUI/GUI_Factories.cpp:835 src/slic3r/GUI/Plater.cpp:5655 +#: src/slic3r/GUI/GUI_Factories.cpp:921 src/slic3r/GUI/Plater.cpp:6213 msgid "Convert from imperial units" msgstr "Преобразовать размер из английской системы мер" -#: src/slic3r/GUI/GUI_Factories.cpp:836 src/slic3r/GUI/Plater.cpp:5656 +#: src/slic3r/GUI/GUI_Factories.cpp:922 src/slic3r/GUI/Plater.cpp:6214 msgid "Revert conversion from imperial units" msgstr "Отменить преобразование размера из английской системы мер" -#: src/slic3r/GUI/GUI_Factories.cpp:837 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:923 src/slic3r/GUI/Plater.cpp:6215 msgid "Convert from meters" msgstr "Преобразовать размер из метрической системы мер" -#: src/slic3r/GUI/GUI_Factories.cpp:838 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:924 src/slic3r/GUI/Plater.cpp:6215 msgid "Revert conversion from meters" msgstr "Отменить преобразование размера из метрической системы мер" -#: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2135 -#: src/libslic3r/PrintConfig.cpp:4523 +#: src/slic3r/GUI/GUI_Factories.cpp:945 src/slic3r/GUI/GUI_ObjectList.cpp:2290 +#: src/libslic3r/PrintConfig.cpp:4689 msgid "Merge" msgstr "Объединить" -#: src/slic3r/GUI/GUI_Factories.cpp:859 +#: src/slic3r/GUI/GUI_Factories.cpp:945 msgid "Merge objects to the one multipart object" msgstr "Объединить модели в одну составную модель" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Along X axis" msgstr "Вдоль оси X" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Mirror the selected object along the X axis" msgstr "Отразить выбранную модель вдоль оси X" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Along Y axis" msgstr "Вдоль оси Y" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Mirror the selected object along the Y axis" msgstr "Отразить выбранную модель вдоль оси Y" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Along Z axis" msgstr "Вдоль оси Z" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Mirror the selected object along the Z axis" msgstr "Отразить выбранную модель вдоль оси Z" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror" msgstr "Отразить" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror the selected object" msgstr "Отразить выбранную модель" -#: src/slic3r/GUI/GUI_Factories.cpp:901 src/slic3r/GUI/GUI_ObjectList.cpp:1696 +#: src/slic3r/GUI/GUI_Factories.cpp:977 +msgid "Edit text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:999 +msgid "Ability to change text, font, size, ..." +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1021 src/slic3r/GUI/GUI_ObjectList.cpp:1793 msgid "Add Shape" msgstr "Добавить фигуру" -#: src/slic3r/GUI/GUI_Factories.cpp:937 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "To objects" msgstr "На модели" -#: src/slic3r/GUI/GUI_Factories.cpp:937 src/slic3r/GUI/GUI_Factories.cpp:954 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "Split the selected object into individual objects" msgstr "Разделить выбранную модель на отдельные модели" -#: src/slic3r/GUI/GUI_Factories.cpp:940 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 msgid "To parts" msgstr "На части" -#: src/slic3r/GUI/GUI_Factories.cpp:940 src/slic3r/GUI/GUI_Factories.cpp:975 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 src/slic3r/GUI/GUI_Factories.cpp:1097 msgid "Split the selected object into individual parts" msgstr "Разделить выбранную модель на отдельные части" -#: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4552 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 src/slic3r/GUI/GUI_Factories.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:4718 msgid "Split" msgstr "Разделить" -#: src/slic3r/GUI/GUI_Factories.cpp:944 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 msgid "Split the selected object" msgstr "Разделить выбранную модель" -#: src/slic3r/GUI/GUI_Factories.cpp:1084 +#: src/slic3r/GUI/GUI_Factories.cpp:1225 src/slic3r/GUI/GUI_Factories.cpp:1243 +msgid "Set number of instances" +msgstr "Задать количество копий" + +#: src/slic3r/GUI/GUI_Factories.cpp:1225 +msgid "Change the number of instances of the selected objects" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1237 msgid "Add one more instance of the selected object" msgstr "Добавить ещё одну копию выбранной модели" -#: src/slic3r/GUI/GUI_Factories.cpp:1087 +#: src/slic3r/GUI/GUI_Factories.cpp:1240 msgid "Remove one instance of the selected object" msgstr "Удалить одну копию выбранной модели" -#: src/slic3r/GUI/GUI_Factories.cpp:1090 -msgid "Set number of instances" -msgstr "Задать количество копий" - -#: src/slic3r/GUI/GUI_Factories.cpp:1090 +#: src/slic3r/GUI/GUI_Factories.cpp:1243 msgid "Change the number of instances of the selected object" msgstr "Изменить количества копий выбранной модели" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill bed with instances" msgstr "Заполнить весь стол копиями" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill the remaining area of bed with instances of the selected object" msgstr "Заполнить оставшуюся область печатного стола копиями выбранной модели" @@ -4239,20 +5497,24 @@ msgstr "Удалить диапазон слоёв" msgid "Add layer range" msgstr "Добавить диапазон слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:297 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:323 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 msgid "Name" msgstr "Файл" -#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:480 +#: src/slic3r/GUI/GUI_ObjectList.cpp:342 src/slic3r/GUI/GUI_ObjectList.cpp:513 msgid "Editing" msgstr "Правка" -#: src/slic3r/GUI/GUI_ObjectList.cpp:400 +#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +msgid "Wrong volume index " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:433 msgid "No errors detected" msgstr "Ошибок не обнаружено" -#: src/slic3r/GUI/GUI_ObjectList.cpp:409 +#: src/slic3r/GUI/GUI_ObjectList.cpp:442 #, c-format, boost-format msgid "Auto-repaired %1$d error" msgid_plural "Auto-repaired %1$d errors" @@ -4260,7 +5522,7 @@ msgstr[0] "Исправлена %1$d ошибка" msgstr[1] "Исправлено %1$d ошибки" msgstr[2] "Исправлено %1$d ошибок" -#: src/slic3r/GUI/GUI_ObjectList.cpp:415 +#: src/slic3r/GUI/GUI_ObjectList.cpp:448 #, c-format, boost-format msgid "%1$d degenerate facet" msgid_plural "%1$d degenerate facets" @@ -4268,7 +5530,7 @@ msgstr[0] "%1$d вырожденная грань" msgstr[1] "%1$d вырожденных граней" msgstr[2] "%1$d вырожденных граней" -#: src/slic3r/GUI/GUI_ObjectList.cpp:417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:450 #, c-format, boost-format msgid "%1$d edge fixed" msgid_plural "%1$d edges fixed" @@ -4276,7 +5538,7 @@ msgstr[0] "%1$d ребро починено" msgstr[1] "%1$d ребра починено" msgstr[2] "%1$d рёбер починено" -#: src/slic3r/GUI/GUI_ObjectList.cpp:419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:452 #, c-format, boost-format msgid "%1$d facet removed" msgid_plural "%1$d facets removed" @@ -4284,7 +5546,7 @@ msgstr[0] "%1$d грань удалена" msgstr[1] "%1$d грани удалено" msgstr[2] "%1$d граней удалено" -#: src/slic3r/GUI/GUI_ObjectList.cpp:421 +#: src/slic3r/GUI/GUI_ObjectList.cpp:454 #, c-format, boost-format msgid "%1$d facet reversed" msgid_plural "%1$d facets reversed" @@ -4292,7 +5554,7 @@ msgstr[0] "%1$d грань реверсирована" msgstr[1] "%1$d грани реверсировано" msgstr[2] "%1$d граней реверсировано" -#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +#: src/slic3r/GUI/GUI_ObjectList.cpp:456 #, c-format, boost-format msgid "%1$d backward edge" msgid_plural "%1$d backward edges" @@ -4300,7 +5562,7 @@ msgstr[0] "%1$d вывернутое рёберо" msgstr[1] "%1$d вывернутых рёбер" msgstr[2] "%1$d вывернутых рёбер" -#: src/slic3r/GUI/GUI_ObjectList.cpp:426 src/slic3r/GUI/GUI_ObjectList.cpp:429 +#: src/slic3r/GUI/GUI_ObjectList.cpp:459 src/slic3r/GUI/GUI_ObjectList.cpp:462 #, c-format, boost-format msgid "%1$d open edge" msgid_plural "%1$d open edges" @@ -4308,244 +5570,288 @@ msgstr[0] "%1$d открытое ребро" msgstr[1] "%1$d открытых ребра" msgstr[2] "%1$d открытых рёбер" -#: src/slic3r/GUI/GUI_ObjectList.cpp:428 +#: src/slic3r/GUI/GUI_ObjectList.cpp:461 msgid "Remaining errors" msgstr "Осталось ошибок" -#: src/slic3r/GUI/GUI_ObjectList.cpp:436 +#: src/slic3r/GUI/GUI_ObjectList.cpp:469 msgid "Right button click the icon to fix STL through Netfabb" msgstr "" "Щёлкните правой кнопкой мыши на восклицательный знак, чтобы исправить STL с " "помощью сервиса Netfabb." -#: src/slic3r/GUI/GUI_ObjectList.cpp:482 +#: src/slic3r/GUI/GUI_ObjectList.cpp:515 msgid "Right button click the icon to change the object settings" msgstr "" "Щёлкните правой кнопкой мыши на значок, чтобы изменить настройки модели." -#: src/slic3r/GUI/GUI_ObjectList.cpp:484 +#: src/slic3r/GUI/GUI_ObjectList.cpp:517 msgid "Click the icon to change the object settings" msgstr "Щёлкните кнопкой мыши на значок, чтобы изменить настройки модели." -#: src/slic3r/GUI/GUI_ObjectList.cpp:488 +#: src/slic3r/GUI/GUI_ObjectList.cpp:521 msgid "Right button click the icon to change the object printable property" msgstr "" "Щёлкните правой кнопкой мыши на значок, чтобы разрешить/запретить печать " "модели." -#: src/slic3r/GUI/GUI_ObjectList.cpp:490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:523 msgid "Click the icon to change the object printable property" msgstr "" "Щёлкните кнопкой мыши на значок, чтобы разрешить/запретить печать модели." -#: src/slic3r/GUI/GUI_ObjectList.cpp:616 +#: src/slic3r/GUI/GUI_ObjectList.cpp:649 msgid "Change Extruder" msgstr "Смена экструдера" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Object" msgstr "Переименование модели" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Sub-object" msgstr "Переименование подобъекта" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1242 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4006 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1307 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4589 msgid "Instances to Separated Objects" msgstr "Копия как отдельная модель" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Volumes in Object reordered" msgstr "Объёмы в модели переупорядочены" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Object reordered" msgstr "Модель переупорядочена" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1298 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1363 msgid "Add Settings for Layers" msgstr "Добавление параметров для слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1299 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1364 msgid "Add Settings for Sub-object" msgstr "Добавление параметров для подобъекта" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1300 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1365 msgid "Add Settings for Object" msgstr "Добавление параметров для модели" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1339 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1404 msgid "Add Settings Bundle for Height range" msgstr "Добавление набора настроек для диапазона высот слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1340 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1405 msgid "Add Settings Bundle for Sub-object" msgstr "Добавление набора параметров для подобъекта" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1341 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1406 msgid "Add Settings Bundle for Object" msgstr "Добавление набора параметров для модели" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Part" msgstr "Загрузка элемента" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Modifier" msgstr "Загрузить модификатор" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1509 src/slic3r/GUI/Plater.cpp:2380 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1582 src/slic3r/GUI/Plater.cpp:2453 msgid "Loading" msgstr "Загрузка" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1540 src/slic3r/GUI/Plater.cpp:2417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1617 src/slic3r/GUI/Plater.cpp:2494 msgid "Loading file" msgstr "Загрузка файла" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1548 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1625 msgid "Error!" msgstr "Ошибка!" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1638 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1721 msgid "Add Generic Subobject" msgstr "Добавление сгенерированного элемента" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1663 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1761 msgid "Generic" msgstr "Сгенерирован" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shape from Gallery" msgstr "Добавление фигуры из библиотеки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shapes from Gallery" msgstr "Добавление фигур из библиотеки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1830 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1945 msgid "Remove paint-on supports" msgstr "Удаление нарисованных поддержек" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1837 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 msgid "Remove paint-on seam" msgstr "Удаление нарисованных швов" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1844 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 msgid "Remove Multi Material painting" msgstr "Удаление мультиматериальной покраски" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1850 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1972 msgid "Shift objects to bed" msgstr "Перемещение модели на столе" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1856 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1978 msgid "Remove variable layer height" msgstr "Удаление переменной высоты слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1877 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1999 msgid "Delete Settings" msgstr "Удаление настроек" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1901 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2023 msgid "Delete All Instances from Object" msgstr "Удаление всех копий из модели" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1917 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2039 msgid "Delete Height Range" msgstr "Удаление диапазона высот слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1949 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2057 +msgid "Delete connector from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2058 +msgid "Delete solid part from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2059 +msgid "Delete negative volume from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2061 +msgid "" +"To save cut information you can delete all connectors from all related " +"objects." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2064 +msgid "" +"This action will break a cut information.\n" +"After that PrusaSlicer can't guarantee model consistency.\n" +"\n" +"To manipulate with solid parts or negative volumes you have to invalidate " +"cut infornation first." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2072 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2612 +msgid "Delete all connectors" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2103 msgid "From Object List You can't delete the last solid part from object." msgstr "" "Вы не можете удалить из списка моделей последний твердотельный элемент " "модели." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1953 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2112 msgid "Delete Subobject" msgstr "Удаление части" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1976 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2138 msgid "Last instance of an object cannot be deleted." msgstr "Последняя копия модели не может быть удалена." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1980 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +msgid "Instance cannot be deleted from cut object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2146 msgid "Delete Instance" msgstr "Удаление копии" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2004 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2170 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" "Выбранная модель не может быть разделена, так как она состоит из одной части." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2008 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2174 msgid "Split to Parts" msgstr "Разделение на части" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2177 src/slic3r/GUI/Plater.cpp:3133 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"splitting the object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2297 msgid "Merged" msgstr "Объединённые" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2237 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2392 msgid "Merge all parts to the one single object" msgstr "Объединить все части в одну единую модель" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2269 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2424 msgid "Add Layers" msgstr "Добавление слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2438 -msgid "Group manipulation" -msgstr "Групповые манипуляции" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2695 +msgid "Cut Connectors information" +msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2453 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2705 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2768 msgid "Object manipulation" msgstr "Манипуляция над моделями" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2486 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2714 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1472 +msgid "Group manipulation" +msgstr "Групповые манипуляции" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2802 msgid "Object Settings to modify" msgstr "Параметры модели для изменения" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2806 msgid "Part Settings to modify" msgstr "Параметры элемента для изменения" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2495 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2811 msgid "Layer range Settings to modify" msgstr "Изменение параметров диапазона слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2501 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2817 msgid "Part manipulation" msgstr "Манипуляция над элементом" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2825 msgid "Instance manipulation" msgstr "Манипуляция с копиями" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Height ranges" msgstr "Диапазон высот слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Settings for height range" msgstr "Настройки для диапазона высот слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2750 -msgid "Delete Selected Item" -msgstr "Удаление выбранных частей" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2943 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3363 msgid "Delete Selected" msgstr "Удаление выбранного" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3019 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3047 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3067 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3441 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3469 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3489 msgid "Add Height Range" msgstr "Добавить диапазон высот слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3113 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3535 msgid "" "Cannot insert a new layer range after the current layer range.\n" "The next layer range is too thin to be split to two\n" @@ -4556,7 +5862,7 @@ msgstr "" "чтобы его можно было разделить на два слоя \n" "без нарушения минимальной высоты слоя." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3117 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3539 msgid "" "Cannot insert a new layer range between the current and the next layer " "range.\n" @@ -4568,7 +5874,7 @@ msgstr "" "диапазоном слоёв и следующим диапазоном слоёв меньше \n" "минимально допустимой высоты слоя." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3122 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3544 msgid "" "Cannot insert a new layer range after the current layer range.\n" "Current layer range overlaps with the next layer range." @@ -4577,240 +5883,291 @@ msgstr "" "текущего диапазона слоёв. Текущий диапазон слоёв \n" "перекрывается со следующим диапазоном слоёв." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3603 msgid "Edit Height Range" msgstr "Редактирование диапазона высот слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3500 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3989 msgid "Selection-Remove from list" msgstr "Выбор\\Удаление из списка" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4001 msgid "Selection-Add from list" msgstr "Выбор\\Добавление из списка" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3649 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4138 msgid "Object or Instance" msgstr "Модель или копия" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Part" -msgstr "Элемент" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 msgid "Layer" msgstr "Слои" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3652 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4141 msgid "Unsupported selection" msgstr "Неподдерживаемый выбор" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3653 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 #, c-format, boost-format msgid "You started your selection with %s Item." msgstr "Вы начали свой выбор с сущности %s." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3654 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4143 #, c-format, boost-format msgid "In this mode you can select only other %s Items%s" msgstr "В этом режиме можно выбирать только сущности %s%s" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3657 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4146 msgid "of a current Object" msgstr "текущей модели" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3662 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3737 src/slic3r/GUI/Plater.cpp:181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4151 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4226 src/slic3r/GUI/Plater.cpp:197 msgid "Info" msgstr "Информация" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3784 -msgid "You can't change a type of the last solid part of the object." -msgstr "Вы не можете изменить тип последнего твердотельного элемента модели." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 msgid "Negative Volume" msgstr "Объём для исключения" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Modifier" -msgstr "Модификатор" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Blocker" msgstr "Блокировщик поддержки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Enforcer" msgstr "Принудительная поддержка" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Select type of part" msgstr "Выбор типа элемента" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3795 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4359 msgid "Change Part Type" msgstr "Изменение типа элемента" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Enter new name" msgstr "Введите новое имя" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Renaming" msgstr "Переименование" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4091 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4681 msgid "Repairing model" msgstr "Ремонт модели" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4120 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4691 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"repairing the mesh." +msgstr "" +"После починки сетки были удалены пользовательские поддержки, швы и " +"мультиматериальная покраска." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4711 msgid "Fix through NetFabb" msgstr "Ремонт модели службой Netfabb" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4123 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4714 msgid "Fixing through NetFabb" msgstr "Ремонт модели службой Netfabb" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4153 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4744 msgid "The following model was repaired successfully" msgid_plural "The following models were repaired successfully" msgstr[0] "Следующая модель успешно отремонтирована" msgstr[1] "Следующие модели успешно отремонтированы" msgstr[2] "Следующие модели успешно отремонтированы" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4159 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4750 msgid "Folowing model repair failed" msgid_plural "Folowing models repair failed" msgstr[0] "Не удалось починить модель" msgstr[1] "Не удалось починить модели" msgstr[2] "Не удалось починить модели" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4164 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4755 msgid "Repairing was canceled" msgstr "Ремонт был отменён" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4276 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4869 msgid "Change Extruders" msgstr "Смена экструдеров" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Printable group" msgstr "Задать «Для печати»" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Unprintable group" msgstr "Задать «Не для печати»" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Printable" msgstr "Задать «Для печати»" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Unprintable" msgstr "Задать «Не для печати»" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Printable Instance" msgstr "Копия для печати" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Unprintable Instance" msgstr "Копия не для печати" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:55 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:84 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:61 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:96 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1132 msgid "World coordinates" msgstr "Мировая СК" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:56 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:85 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:97 msgid "Local coordinates" msgstr "Локальная СК" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:60 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:67 msgid "Select coordinate space, in which the transformation will be performed." msgstr "" "Выберите координатное пространство, в котором будет выполняться " "преобразование." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:141 src/libslic3r/GCode.cpp:540 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:157 src/libslic3r/GCode.cpp:491 msgid "Object name" msgstr "Имя модели" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:201 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:521 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:221 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:710 msgid "Position" msgstr "Позиция" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:202 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:522 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:222 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:711 #: src/slic3r/GUI/Mouse3DController.cpp:478 #: src/slic3r/GUI/Mouse3DController.cpp:499 msgid "Rotation" msgstr "Вращение" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:250 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:239 +msgid "Size [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "Mirror along" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +#, c-format, boost-format +msgid " %c " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "axis" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:279 #, c-format, boost-format msgid "Toggle %c axis mirroring" msgstr "Отразить вдоль оси %c" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:284 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:329 msgid "Set Mirror" msgstr "Задание отражения" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:324 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:336 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:348 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:374 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:387 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:393 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:401 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:428 msgid "Drop to bed" msgstr "Положить на стол" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:445 msgid "Reset rotation" msgstr "Сброс вращения" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 msgid "Reset Rotation" msgstr "Сброс вращения" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:398 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:400 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:490 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:519 msgid "Reset scale" msgstr "Сброс масштаба" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:539 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546 +msgid "Reset skew" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:553 msgid "Inches" msgstr "Дюймы" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:523 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:712 msgid "Scale factors" msgstr "Масштаб" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:577 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:740 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:752 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:793 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:801 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +msgid "Rotate (relative)" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:751 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:800 +msgid "Translate (relative) [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:829 msgid "Translate" msgstr "Перемещение" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:640 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:905 msgid "" "You cannot use non-uniform scaling mode for multiple objects/parts selection" msgstr "" "Нельзя использовать режим неравномерного масштабирования, когда выбрано " "несколько моделей/частей." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:820 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +msgid "Left handed" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1133 +msgid "Object coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1134 +msgid "Part coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1176 msgid "Set Position" msgstr "Задание позиции" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:852 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1220 msgid "Set Orientation" msgstr "Задание поворота" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:931 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1351 msgid "Set Scale" msgstr "Задание масштаба" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1368 +msgid "Set Size" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1427 msgid "" "The currently manipulated object is tilted (rotation angles are not " "multiples of 90°).\n" @@ -4823,7 +6180,7 @@ msgstr "" "системе координат, когда информация о вращении записывается в координаты " "модели." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:983 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1430 msgid "" "This operation is irreversible.\n" "Do you want to proceed?" @@ -4849,170 +6206,69 @@ msgstr "Удаление параметра %s" msgid "Change Option %s" msgstr "Изменение параметра %s" -#: src/slic3r/GUI/GUI_Preview.cpp:211 -msgid "View" -msgstr "Вид" - -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/libslic3r/PrintConfig.cpp:808 -msgid "Height" -msgstr "Высота" - -#: src/slic3r/GUI/GUI_Preview.cpp:219 src/libslic3r/PrintConfig.cpp:3032 -msgid "Width" -msgstr "Ширина" - -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2016 -msgid "Fan speed" -msgstr "Скорость вентилятора" - -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1991 -msgid "Temperature" -msgstr "Температура" - -#: src/slic3r/GUI/GUI_Preview.cpp:223 -msgid "Volumetric flow rate" -msgstr "Объёмный расход" - -#: src/slic3r/GUI/GUI_Preview.cpp:228 -msgid "Show" -msgstr "Отображать" - -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/GUI_Preview.cpp:254 -msgid "Feature types" -msgstr "Типы линий" - -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:330 -#: src/libslic3r/ExtrusionEntity.cpp:352 -msgid "Perimeter" -msgstr "Внутренний периметр" - -#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:331 -#: src/libslic3r/ExtrusionEntity.cpp:354 -msgid "External perimeter" -msgstr "Внешний периметр" - -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:332 -#: src/libslic3r/ExtrusionEntity.cpp:356 -msgid "Overhang perimeter" -msgstr "Нависающий периметр" - -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:333 -#: src/libslic3r/ExtrusionEntity.cpp:358 -msgid "Internal infill" -msgstr "Заполнение" - -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:334 -#: src/libslic3r/ExtrusionEntity.cpp:360 src/libslic3r/PrintConfig.cpp:1407 -#: src/libslic3r/PrintConfig.cpp:2392 src/libslic3r/PrintConfig.cpp:2404 -msgid "Solid infill" -msgstr "Сплошное заполнение" - -#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:335 -#: src/libslic3r/ExtrusionEntity.cpp:362 src/libslic3r/PrintConfig.cpp:1416 -#: src/libslic3r/PrintConfig.cpp:2889 src/libslic3r/PrintConfig.cpp:2902 -msgid "Top solid infill" -msgstr "Верхний сплошной слой" - -#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:337 -#: src/libslic3r/ExtrusionEntity.cpp:366 -msgid "Bridge infill" -msgstr "Мосты" - -#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:338 -#: src/libslic3r/ExtrusionEntity.cpp:368 src/libslic3r/PrintConfig.cpp:1325 -msgid "Gap fill" -msgstr "Заполнение пробелов" - -#: src/slic3r/GUI/GUI_Preview.cpp:248 src/libslic3r/ExtrusionEntity.cpp:339 -#: src/libslic3r/ExtrusionEntity.cpp:370 -msgid "Skirt/Brim" -msgstr "Юбка/Кайма" - -#: src/slic3r/GUI/GUI_Preview.cpp:250 src/libslic3r/ExtrusionEntity.cpp:341 -#: src/libslic3r/ExtrusionEntity.cpp:374 src/libslic3r/PrintConfig.cpp:2736 -msgid "Support material interface" -msgstr "Связующий слой поддержки" - -#: src/slic3r/GUI/GUI_Preview.cpp:251 src/slic3r/GUI/Tab.cpp:1634 -#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/ExtrusionEntity.cpp:376 -msgid "Wipe tower" -msgstr "Черновая башня" - -#: src/slic3r/GUI/GUI_Preview.cpp:728 +#: src/slic3r/GUI/GUI_Preview.cpp:581 msgid "NOTE:" msgstr "Примечание:" -#: src/slic3r/GUI/GUI_Preview.cpp:729 +#: src/slic3r/GUI/GUI_Preview.cpp:582 #, boost-format msgid "Sliced object \"%1%\" looks like a logo or a sign" msgstr "Нарезанная модель \"%1%\" похожа на логотип или знак." -#: src/slic3r/GUI/GUI_Preview.cpp:730 +#: src/slic3r/GUI/GUI_Preview.cpp:583 msgid "Apply color change automatically" msgstr "Автоматически применять изменение цвета" -#: src/slic3r/GUI/GUI_Preview.cpp:1058 -msgid "Shells" -msgstr "Оболочка" - -#: src/slic3r/GUI/GUI_Preview.cpp:1059 -msgid "Tool marker" -msgstr "Маркер инструмента" - -#: src/slic3r/GUI/GUI_Preview.cpp:1060 -msgid "Legend/Estimated printing time" -msgstr "Условные обозначения/Расчётное время печати" - -#: src/slic3r/GUI/HintNotification.cpp:771 -#: src/slic3r/GUI/HintNotification.cpp:797 -#: src/slic3r/GUI/NotificationManager.cpp:374 -#: src/slic3r/GUI/NotificationManager.cpp:391 +#: src/slic3r/GUI/HintNotification.cpp:773 +#: src/slic3r/GUI/HintNotification.cpp:799 +#: src/slic3r/GUI/NotificationManager.cpp:457 +#: src/slic3r/GUI/NotificationManager.cpp:474 msgid "More" msgstr "Подробнее" -#: src/slic3r/GUI/HintNotification.cpp:912 +#: src/slic3r/GUI/HintNotification.cpp:914 msgid "Open Preferences." msgstr "Открыть настройки приложения." -#: src/slic3r/GUI/HintNotification.cpp:1004 +#: src/slic3r/GUI/HintNotification.cpp:1006 msgid "Open Documentation in web browser." msgstr "Открыть документацию в браузере." -#: src/slic3r/GUI/ImGuiWrapper.cpp:527 +#: src/slic3r/GUI/ImGuiWrapper.cpp:666 msgid "Edit" msgstr "Изменить" -#: src/slic3r/GUI/ImGuiWrapper.cpp:960 src/slic3r/GUI/Search.cpp:470 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1166 src/slic3r/GUI/Search.cpp:531 msgid "Use for search" msgstr "Использовать для поиска" -#: src/slic3r/GUI/ImGuiWrapper.cpp:961 src/slic3r/GUI/Search.cpp:463 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1167 src/slic3r/GUI/Search.cpp:524 msgid "Category" msgstr "Категория" -#: src/slic3r/GUI/ImGuiWrapper.cpp:963 src/slic3r/GUI/Search.cpp:465 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1169 src/slic3r/GUI/Search.cpp:526 msgid "Search in English" msgstr "Искать на английском языке" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:174 -msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "" -"Не удалось расставить части модели! Некоторые геометрии могут быть " -"недопустимыми." - -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:183 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:168 msgid "Arranging" msgstr "Расстановка" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:207 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:204 msgid "Arranging canceled." msgstr "Расстановка отменена." -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:208 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:205 msgid "Arranging done." msgstr "Расстановка выполнена." -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:253 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:225 +msgid "Could not arrange model objects! Some geometries may be invalid." +msgstr "" +"Не удалось расставить части модели! Некоторые геометрии могут быть " +"недопустимыми." + +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:265 #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -5023,40 +6279,83 @@ msgstr "" "на одном столе:\n" "%s" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:119 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:108 msgid "Filling bed" msgstr "Заполнение стола" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:130 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:140 msgid "Bed filling canceled." msgstr "Заполнение стола отменено." -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:131 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:141 msgid "Bed filling done." msgstr "Заполнение стола закончено." -#: src/slic3r/GUI/Jobs/Job.cpp:111 -msgid "ERROR: not enough resources to execute a new job." -msgstr "ОШИБКА: недостаточно ресурсов для выполнения нового задания." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:148 src/slic3r/GUI/Jobs/EmbossJob.cpp:596 +msgid "Can't create empty volume." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:201 +msgid "Can't create empty object." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:208 +msgid "Add Emboss text object" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:247 +msgid "Created text volume is empty. Change text or font." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:465 +msgid "" +"It is used default volume for embossed text, try to change text or font to " +"fix it." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:549 +#, boost-format +msgid "Text: %1%" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:593 +msgid "Bad object to create volume." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:598 +msgid "Add Emboss text Volume" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:698 +msgid "Font doesn't have any shape for given text." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:738 +msgid "There is no volume in projection direction." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:787 +msgid "There is no valid surface for text projection." +msgstr "" -#: src/slic3r/GUI/Jobs/PlaterJob.cpp:13 -msgid "An unexpected error occured" -msgstr "Произошла непредвиденная ошибка:" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:823 +msgid "Issue during embossing the text." +msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:21 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:22 msgid "Best surface quality" msgstr "Лучшее качество поверхности" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:23 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 msgid "Optimize object rotation for best surface quality." msgstr "" "Поиск оптимального поворота для достижения наилучшего качества поверхности." -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:25 msgid "Reduced overhang slopes" msgstr "Уменьшение свесов" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:26 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:27 msgid "" "Optimize object rotation to have minimum amount of overhangs needing support " "structures.\n" @@ -5068,65 +6367,33 @@ msgstr "" "Обратите внимание, если высота подъёма модели не задана, то будет найдено " "положение модели для лучшего контакта её с печатной платформой." -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:30 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:31 msgid "Lowest Z height" msgstr "Минимальный подъём" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:32 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:33 msgid "Rotate the model to have the lowest z height for faster print time." msgstr "" "Поворот модели так, чтобы она имела наименьшую высоту по оси Z для " "уменьшения времени печати." -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:59 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:53 msgid "Searching for optimal orientation" msgstr "Поиск оптимального положения" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:77 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:83 msgid "Orientation search canceled." msgstr "Поиск оптимального положения отменён." -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:78 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:84 msgid "Orientation found." msgstr "Оптимальное положения найдено." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:36 -msgid "Choose SLA archive:" -msgstr "Выберите SLA архив:" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:40 -msgid "Import file" -msgstr "Файл для импорта" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47 -msgid "Import model and profile" -msgstr "Импортировать модель и профиль" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48 -msgid "Import profile only" -msgstr "Импортировать только профиль" - #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:49 -msgid "Import model only" -msgstr "Импортировать только модель" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60 -msgid "Accurate" -msgstr "Точность" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61 -msgid "Balanced" -msgstr "Баланс" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:62 -msgid "Quick" -msgstr "Скорость" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:140 msgid "Importing SLA archive" msgstr "Импорт SLA архива" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:158 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:77 msgid "" "The SLA archive doesn't contain any presets. Please activate some SLA " "printer preset first before importing that SLA archive." @@ -5134,19 +6401,23 @@ msgstr "" "Архив SLA не содержит никаких профилей. Пожалуйста, сначала активируйте " "какой-нибудь профиль SLA принтера , прежде чем импортировать этот SLA архив." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:164 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:81 +msgid "Import is unavailable for this archive format." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:86 msgid "Importing canceled." msgstr "Импорт отменен." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:165 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:87 msgid "Importing done." msgstr "Импорт завершён." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:187 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:108 msgid "The file does not exist." msgstr "Файл не существует." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:221 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135 msgid "" "The imported SLA archive did not contain any presets. The current SLA " "presets were used as fallback." @@ -5154,161 +6425,169 @@ msgstr "" "Импортированный SLA архив не содержит никаких профилей. Текущие SLA профили " "использовались в качестве резервных." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:234 src/slic3r/GUI/Plater.cpp:2458 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:148 src/slic3r/GUI/Plater.cpp:2535 msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "Вы не можете загрузить SLA проект с составной моделью на столе" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:236 src/slic3r/GUI/Plater.cpp:2460 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:150 src/slic3r/GUI/Plater.cpp:2537 msgid "Attention!" msgstr "Внимание!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:166 +msgid "The profile in the imported archive is corrupt and will not be loaded." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:178 +msgid "" +"No object could be retrieved from the archive. The slices might be corrupted " +"or missing." +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1184 msgid "Keyboard Shortcuts" msgstr "Горячие клавиши" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:77 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:86 msgid "New project, clear plater" msgstr "Новый проект, пустой стол" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:78 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 msgid "Open project AMF/3MF with config, clear plater" msgstr "Открыть AMF/3MF проект с конфигурацией, очистив стол" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 msgid "Save project (3mf)" msgstr "Сохранить проект (3mf)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 msgid "Save project as (3mf)" msgstr "Сохранить проект (3MF)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:81 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 msgid "(Re)slice" msgstr "(Пере)Нарезать" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:83 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:92 msgid "Import STL/3MF/STEP/OBJ/AMF without config, keep plater" msgstr "Загрузить STL/3MF/STEP/OBJ/AMF проект с конфигурацией, не очищая стол" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:84 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 msgid "Import Config from ini/amf/3mf/gcode" msgstr "Загрузить конфигурацию из ini/amf/3mf/g-кода" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:85 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "Загрузить конфигурацию из ini/amf/3mf/g-кода и объединить" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6543 src/libslic3r/PrintConfig.cpp:4423 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:96 src/slic3r/GUI/Plater.cpp:948 +#: src/slic3r/GUI/Plater.cpp:7161 src/libslic3r/PrintConfig.cpp:4575 msgid "Export G-code" msgstr "Экспорт в G-код" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:97 src/slic3r/GUI/Plater.cpp:7162 msgid "Send G-code" msgstr "Отправить G-код" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 msgid "Export config" msgstr "Сохранить текущую конфигурацию" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 src/slic3r/GUI/Plater.cpp:896 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 src/slic3r/GUI/Plater.cpp:931 msgid "Export to SD card / Flash drive" msgstr "Экспорт на SD-карту / USB-накопитель" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:91 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 msgid "Eject SD card / Flash drive" msgstr "Извлечь SD-карту / USB-накопитель" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 msgid "Select all objects" msgstr "Выбрать все модели" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 msgid "Deselect all" msgstr "Снять выбор со всего" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:95 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 msgid "Delete selected" msgstr "Удалить выбранные" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 -msgid "Copy to clipboard" -msgstr "Копировать в буфер" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 msgid "Paste from clipboard" msgstr "Вставить из буфера обмена" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Reload plater from disk" msgstr "Перезагрузить стол с диска" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 msgid "Select Plater Tab" msgstr "Вкладка стола" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 msgid "Select Print Settings Tab" msgstr "Вкладка настройки печати" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 msgid "Select Filament Settings Tab" msgstr "Вкладка настройки прутка" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 msgid "Select Printer Settings Tab" msgstr "Вкладка настройки принтера" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 msgid "Switch to 3D" msgstr "Переключиться на 3D вид" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 msgid "Switch to Preview" msgstr "Переключиться на предпросмотр" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 -#: src/slic3r/GUI/PrintHostDialogs.cpp:217 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +#: src/slic3r/GUI/PrintHostDialogs.cpp:267 msgid "Print host upload queue" msgstr "Очередь загрузки на хост печати" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/MainFrame.cpp:75 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 src/slic3r/GUI/MainFrame.cpp:77 msgid "Open new instance" msgstr "Запустить новый экземпляр программы" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 msgid "Camera view" msgstr "Позиция камеры" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 msgid "Show/Hide object/instance labels" msgstr "Показать/Скрыть имена файлов модели/копии" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Preferences.cpp:46 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Preferences.cpp:57 +#: src/slic3r/GUI/Preferences.cpp:165 src/slic3r/GUI/Preferences.cpp:188 +#: src/slic3r/GUI/Preferences.cpp:207 src/slic3r/GUI/Preferences.cpp:215 msgid "Preferences" msgstr "Настройки приложения" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 msgid "Show keyboard shortcuts list" msgstr "Показать список сочетаний клавиш" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 msgid "Commands" msgstr "Команды" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 msgid "Add Instance of the selected object" msgstr "Сделать копию выбранной модели" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Remove Instance of the selected object" msgstr "Удалить копию выбранной модели" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 msgid "" "Press to select multiple objects\n" "or move multiple objects with mouse" @@ -5316,140 +6595,144 @@ msgstr "" "Выбор нескольких моделей или перемещение \n" "нескольких моделей с помощью мышки" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 msgid "Press to activate selection rectangle" msgstr "Активация прямоугольника выделения" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 msgid "Press to activate deselection rectangle" msgstr "Активация прямоугольника отмены выделения" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Arrow Up" msgstr "Стрелка вверх" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 msgid "Move selection 10 mm in positive Y direction" msgstr "Перемещение выбранного на 10 мм по оси Y+" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Arrow Down" msgstr "Стрелка вниз" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 msgid "Move selection 10 mm in negative Y direction" msgstr "Перемещение выбранного на 10 мм по оси Y-" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Arrow Left" msgstr "Стрелка влево" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 msgid "Move selection 10 mm in negative X direction" msgstr "Перемещение выбранного на 10 мм по оси X-" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Arrow Right" msgstr "Стрелка вправо" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 msgid "Move selection 10 mm in positive X direction" msgstr "Перемещение выбранного на 10 мм по оси X+" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Any arrow" msgstr "Любая стрелка" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 msgid "Movement step set to 1 mm" msgstr "Зафиксировать шаг перемещения на 1 мм" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Movement in camera space" msgstr "Перемещение выбранного по отношению к камере" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Page Up" msgstr "Page Up" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Rotate selection 45 degrees CCW" msgstr "Поворот выбранного на 45° против часовой стрелки" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Page Down" msgstr "Page Down" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Rotate selection 45 degrees CW" msgstr "Поворот выбранного на 45° по часовой стрелки" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 msgid "Gizmo move" msgstr "Гизмо перемещения" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 msgid "Gizmo scale" msgstr "Гизмо масштаба" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Gizmo rotate" msgstr "Гизмо поворота" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Gizmo cut" msgstr "Гизмо разреза" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 msgid "Gizmo Place face on bed" msgstr "Гизмо поверхностью на стол" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 msgid "Gizmo SLA hollow" msgstr "Гизмо полости" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 msgid "Gizmo SLA support points" msgstr "Гизмо точки SLA поддержки" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 msgid "Gizmo FDM paint-on supports" msgstr "Гизмо рисования поддержек (FDM)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 msgid "Gizmo FDM paint-on seam" msgstr "Гизмо рисования шва (FDM)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 msgid "Gizmo Multi Material painting" msgstr "Гизмо мультиматериальный покраски" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +msgid "Gizmo Text emboss / engrave" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 msgid "Unselect gizmo or clear selection" msgstr "Убрать гизмо выделение или очистить выбор" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 msgid "Change camera type (perspective, orthographic)" msgstr "Тип камеры (вид в перспективе или ортогональный)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 msgid "Zoom to Bed" msgstr "Приблизить до размера стола" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 msgid "" "Zoom to selected object\n" "or all objects in scene, if none selected" @@ -5457,177 +6740,177 @@ msgstr "" "Приближение камеры к выбранной модели \n" "или всем моделям в сцене, если ничего не выбрано" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 msgid "Zoom in" msgstr "Приблизить" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Zoom out" msgstr "Отдалить" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Switch between Editor/Preview" msgstr "Переключение между редактором/предпросмотром" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Collapse/Expand the sidebar" msgstr "Свернуть/Развернуть боковую панель" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled" msgstr "" "Показать/скрыть диалоговое окно настроек устройств 3Dconnexion (если " "включено)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "" "Показать/Скрыть диалоговое окно настроек \n" "устройств 3Dconnexion" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 msgid "Minimize application" msgstr "Свернуть приложение" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 src/slic3r/GUI/MainFrame.cpp:284 -#: src/slic3r/GUI/MainFrame.cpp:333 src/slic3r/GUI/MainFrame.cpp:445 -#: src/slic3r/GUI/MainFrame.cpp:448 src/slic3r/GUI/MainFrame.cpp:470 -#: src/slic3r/GUI/MainFrame.cpp:473 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 src/slic3r/GUI/MainFrame.cpp:329 +#: src/slic3r/GUI/MainFrame.cpp:378 src/slic3r/GUI/MainFrame.cpp:490 +#: src/slic3r/GUI/MainFrame.cpp:493 src/slic3r/GUI/MainFrame.cpp:515 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Plater" msgstr "Стол" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button" msgstr "" "Все гизмо: Вращение камеры - левая кнопка мыши; Перемещение камеры - правая " "кнопка мыши" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 msgid "Gizmo move: Press to snap by 1mm" msgstr "Гизмо перемещения: Фиксации перемещения на 1 мм" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 msgid "Gizmo scale: Press to snap by 5%" msgstr "Гизмо масштаба: Фиксация увеличения на 5%" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 msgid "Gizmo scale: Scale selection to fit print volume" msgstr "Гизмо масштаба: Масштабирование модели под область печати" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 msgid "Gizmo scale: Press to activate one direction scaling" msgstr "Гизмо масштаба: Активация масштабирования в одном направлении" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 msgid "Gizmo scale: Press to scale selected objects around their own center" msgstr "Гизмо масштаба: Масштабирование выбранных моделей вокруг своего центра" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 msgid "Gizmo rotate: Press to rotate selected objects around their own center" msgstr "Гизмо поворота: Поворот выбранных моделей вокруг своего центра" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "Gizmos" msgstr "Гизмо" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "" "The following shortcuts are applicable when the specified gizmo is active" msgstr "Следующие сочетания клавиш применимы, когда активна выбранная гизмо" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 msgid "Set selected items as Printable/Unprintable" msgstr "Задать «Для печати»/«Не для печати» для выбранных частей" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:203 msgid "Set default extruder for the selected items" msgstr "Задать экструдер по умолчанию для выбранных частей" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 msgid "Set extruder number for the selected items" msgstr "Задать номер экструдера для выбранных частей" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 msgid "Objects List" msgstr "Список моделей" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/MainFrame.cpp:1611 msgid "Open a G-code file" msgstr "Выберите G-код файл" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 -#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 -#: src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 src/slic3r/GUI/MainFrame.cpp:1443 +#: src/slic3r/GUI/MainFrame.cpp:1447 src/slic3r/GUI/MainFrame.cpp:1616 +#: src/slic3r/GUI/MainFrame.cpp:1620 msgid "Reload the plater from disk" msgstr "Перезагрузить стол с диска" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 msgid "Vertical slider - Move active thumb Up" msgstr "Вертикальный ползунок - Сдвинуть активный ползунок вверх" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:228 msgid "Vertical slider - Move active thumb Down" msgstr "Вертикальный ползунок - Сдвинуть активный ползунок вниз" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 msgid "Horizontal slider - Move active thumb Left" msgstr "Горизонтальный ползунок - Сдвинуть активный ползунок влево" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 msgid "Horizontal slider - Move active thumb Right" msgstr "Горизонтальный ползунок - Сдвинуть активный ползунок вправо" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:231 msgid "On/Off one layer mode of the vertical slider" msgstr "" "Включение/Отключение функции «Режим одного слоя» у вертикального ползунка" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 -msgid "Show/Hide Legend and Estimated printing time" -msgstr "Показать/Скрыть условные обозначения/расчётное время печати" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:232 +msgid "Show/Hide legend" +msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 msgid "Show/Hide G-code window" msgstr "Показать/скрыть окно отображения G-кода" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4480 -#: src/slic3r/GUI/Tab.cpp:2832 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 src/slic3r/GUI/Plater.cpp:4562 +#: src/slic3r/GUI/Tab.cpp:2736 msgid "Preview" msgstr "Предпросмотр нарезки" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 msgid "Move active thumb Up" msgstr "Сдвинуть активный ползунок вверх" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 msgid "Move active thumb Down" msgstr "Сдвинуть активный ползунок вниз" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 msgid "Set upper thumb as active" msgstr "Переместить ползунок в верхнее положение" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 msgid "Set lower thumb as active" msgstr "Переместить ползунок в нижнее положение" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 msgid "Add color change marker for current layer" msgstr "Добавить маркер смены цвета для текущего слоя" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:238 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:244 msgid "Delete color change marker for current layer" msgstr "Удалить маркер смены цвета для текущего слоя" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:250 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:251 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:245 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:256 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:257 msgid "" "Press to speed up 5 times while moving thumb\n" "with arrow keys or mouse wheel" @@ -5635,11 +6918,11 @@ msgstr "" "Ускорить перемещение ползунка в 5 раз с помощью \n" "стрелок на клавиатуре или колесом мыши" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "Vertical Slider" msgstr "Вертикальный ползунок" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "" "The following shortcuts are applicable in G-code preview when the vertical " "slider is active" @@ -5647,27 +6930,27 @@ msgstr "" "Следующие сочетания клавиш применимы в окне предпросмотра G-кода, когда " "вертикальный ползунок активен" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Move active thumb Left" msgstr "Сдвинуть активный ползунок влево" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Move active thumb Right" msgstr "Сдвинуть активный ползунок вправо" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Set left thumb as active" msgstr "Переместить ползунок в левое положение" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Set right thumb as active" msgstr "Переместить ползунок в правое положение" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "Horizontal Slider" msgstr "Горизонтальный ползунок" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "" "The following shortcuts are applicable in G-code preview when the horizontal " "slider is active" @@ -5675,139 +6958,139 @@ msgstr "" "Следующие сочетания клавиш применимы в окне предпросмотра G-кода, когда " "горизонтальный ползунок активен" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:278 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:284 msgid "Keyboard shortcuts" msgstr "Горячие клавиши" -#: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:77 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open a new PrusaSlicer instance" msgstr "Запустить новый экземпляр PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:93 msgid "G-code preview" msgstr "Предпросмотр G-кода" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:1388 msgid "Open G-code viewer" msgstr "Открыть просмотрщик G-кода" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:91 src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open PrusaSlicer" msgstr "Открыть PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:93 msgid "Open new G-code viewer" msgstr "Открыть новый просмотрщик G-кода" -#: src/slic3r/GUI/MainFrame.cpp:225 +#: src/slic3r/GUI/MainFrame.cpp:227 msgid "Closing PrusaSlicer. Current project is modified." msgstr "Закрытие PrusaSlicer. Текущий проект был изменён." -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "PrusaSlicer is closing" msgstr "Закрытие PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "Closing PrusaSlicer while some presets are modified." msgstr "Закрытие PrusaSlicer, при имеющихся изменениях в профилях." -#: src/slic3r/GUI/MainFrame.cpp:285 src/slic3r/GUI/MainFrame.cpp:335 -#: src/slic3r/GUI/Tab.hpp:427 src/slic3r/GUI/Tab.hpp:550 +#: src/slic3r/GUI/MainFrame.cpp:330 src/slic3r/GUI/MainFrame.cpp:380 +#: src/slic3r/GUI/Tab.hpp:413 src/slic3r/GUI/Tab.hpp:539 msgid "Print Settings" msgstr "Настройки печати" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:535 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:384 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:520 msgid "Material Settings" msgstr "Настройка материала" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:461 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:382 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:448 msgid "Filament Settings" msgstr "Настройки прутка" -#: src/slic3r/GUI/MainFrame.cpp:287 src/slic3r/GUI/MainFrame.cpp:341 -#: src/slic3r/GUI/Tab.hpp:503 +#: src/slic3r/GUI/MainFrame.cpp:332 src/slic3r/GUI/MainFrame.cpp:386 +#: src/slic3r/GUI/Tab.hpp:488 msgid "Printer Settings" msgstr "Настройки принтера" -#: src/slic3r/GUI/MainFrame.cpp:632 src/slic3r/GUI/Plater.cpp:1719 -#: src/slic3r/GUI/Plater.cpp:2850 +#: src/slic3r/GUI/MainFrame.cpp:685 src/slic3r/GUI/Plater.cpp:1728 +#: src/slic3r/GUI/Plater.cpp:2879 msgid "Untitled" msgstr "Без названия" -#: src/slic3r/GUI/MainFrame.cpp:655 +#: src/slic3r/GUI/MainFrame.cpp:710 msgid "based on Slic3r" msgstr "созданная на остове Slic3r" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Prusa 3D &Drivers" msgstr "&Драйверы Prusa 3D" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Open the Prusa3D drivers download page in your browser" msgstr "Открыть страницу загрузки драйверов Prusa3D" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Software &Releases" msgstr "PrusaSlicer на Github" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open the software releases page in your browser" msgstr "Открыть страницу программы PrusaSlicer на Github" -#: src/slic3r/GUI/MainFrame.cpp:1081 +#: src/slic3r/GUI/MainFrame.cpp:1158 #, c-format, boost-format msgid "%s &Website" msgstr "Сайт %s" -#: src/slic3r/GUI/MainFrame.cpp:1082 +#: src/slic3r/GUI/MainFrame.cpp:1159 #, c-format, boost-format msgid "Open the %s website in your browser" msgstr "Открыть сайт %s" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "System &Info" msgstr "&Информация о системе" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "Show system information" msgstr "Показать системную информацию" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show &Configuration Folder" msgstr "Показать &конфигурационную папку" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show user configuration folder (datadir)" msgstr "Показать папку конфигурации пользователя (datadir)" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "Report an I&ssue" msgstr "Сообщить о &проблеме" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 #, c-format, boost-format msgid "Report an issue on %s" msgstr "Сообщить о проблеме в %s" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 #, c-format, boost-format msgid "&About %s" msgstr "&O программе %s" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 msgid "Show about dialog" msgstr "Показать окно с информацией о программе" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1177 msgid "Show Tip of the Day" msgstr "Показать полезный совет" -#: src/slic3r/GUI/MainFrame.cpp:1104 +#: src/slic3r/GUI/MainFrame.cpp:1181 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." @@ -5815,94 +7098,94 @@ msgstr "" "Открывает уведомление о полезном совете в правом нижнем углу или показывает " "другой совет, если уведомление уже открыто." -#: src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/MainFrame.cpp:1184 msgid "Show the list of the keyboard shortcuts" msgstr "Показать список сочетаний клавиш" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso" msgstr "Изометрия" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso View" msgstr "Изометрическая проекция" #. TRN To be shown in the main menu View->Top #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2917 -#: src/libslic3r/PrintConfig.cpp:2926 +#: src/slic3r/GUI/MainFrame.cpp:1202 src/libslic3r/PrintConfig.cpp:3005 +#: src/libslic3r/PrintConfig.cpp:3014 msgid "Top" msgstr "Сверху" -#: src/slic3r/GUI/MainFrame.cpp:1125 +#: src/slic3r/GUI/MainFrame.cpp:1202 msgid "Top View" msgstr "Вид сверху" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:446 -#: src/libslic3r/PrintConfig.cpp:455 +#: src/slic3r/GUI/MainFrame.cpp:1205 src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:474 msgid "Bottom" msgstr "Снизу" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1205 msgid "Bottom View" msgstr "Вид снизу" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front" msgstr "Спереди" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front View" msgstr "Вид спереди" -#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2274 +#: src/slic3r/GUI/MainFrame.cpp:1209 src/libslic3r/PrintConfig.cpp:2300 msgid "Rear" msgstr "Сзади" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1209 msgid "Rear View" msgstr "Вид сзади" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left" msgstr "Слева" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left View" msgstr "Вид слева" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right" msgstr "Справа" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right View" msgstr "Вид справа" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "&New Project" msgstr "&Новый проект" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "Start a new project" msgstr "Начать новый проект" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "&Open Project" msgstr "&Открыть проект" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "Open a project file" msgstr "Открыть файл проекта" -#: src/slic3r/GUI/MainFrame.cpp:1157 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Recent projects" msgstr "Недавние проекты" -#: src/slic3r/GUI/MainFrame.cpp:1169 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -5910,510 +7193,544 @@ msgstr "" "Выбранный проект больше недоступен.\n" "Удалить его из списка последних проектов?" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Save Project" msgstr "&Сохранить проект" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "Save current project file" msgstr "Сохранить текущий файл проекта" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save Project &as" msgstr "Сохранить проект &как" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save current project file as" msgstr "Сохранить текущий файл проекта как" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Import STL/3MF/STEP/OBJ/AM&F" msgstr "Загру&зить STL/3MF/STEP/OBJ/AMF" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Load a model" msgstr "Загрузить модель" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Import STL (Imperial Units)" msgstr "За&грузить STL (английская система мер)" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Load an model saved with imperial units" msgstr "Загрузить модель, сохраненную с размерами в английской системе мер" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Import SL1 / SL1S Archive" -msgstr "Загрузить SL1 / SL1S &архив" +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Import SLA Archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Load an SLA archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Import ZIP Achive" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Load an SL1 / Sl1S archive" -msgstr "Загрузить SL1 / Sl1S архив" +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Load a zip achive" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Import &Config" msgstr "Импортировать &конфигурацию" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Load exported configuration file" msgstr "Загрузить сохранённый файл конфигурации" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Import Config from &Project" msgstr "Импортировать конфигурацию из &проекта" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Load configuration from project file" msgstr "Загрузить конфигурацию из файла проекта" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Import Config &Bundle" msgstr "Импортировать &пакет конфигураций" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Load presets from a bundle" msgstr "Импортировать пакет конфигураций из файла" -#: src/slic3r/GUI/MainFrame.cpp:1231 +#: src/slic3r/GUI/MainFrame.cpp:1311 msgid "&Import" msgstr "&Импорт" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1314 src/slic3r/GUI/MainFrame.cpp:1676 msgid "Export &G-code" msgstr "Экспорт в G-&код" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1314 msgid "Export current plate as G-code" msgstr "Экспортировать текущие модели со стола в G-код" -#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1318 src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end G-code" msgstr "&Отправить G-код" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1318 msgid "Send to print current plate as G-code" msgstr "Отправить на печать текущий стол как G-код" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export G-code to SD Card / Flash Drive" msgstr "Экспорт G-кода на SD-карту / USB-накопитель" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "" "Экспортировать текущие модели со стола в G-код на SD-карту / USB-накопитель" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export Plate as &STL" -msgstr "Экспорт &стола в STL" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export Plate as &STL/OBJ" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export current plate as STL" -msgstr "Экспортировать текущие модели со стола в STL" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export current plate as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export Plate as STL &Including Supports" -msgstr "Экспорт стола в STL вместе с &поддержками" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export Plate as STL/OBJ &Including Supports" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export current plate as STL including supports" -msgstr "Экспортировать текущий стол в STL, включая поддержки" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export current plate as STL/OBJ including supports" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export &Toolpaths as OBJ" msgstr "Экспорт траектории &инструмента в OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export toolpaths as OBJ" msgstr "Экспортировать траекторию инструмента в OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export &Config" msgstr "Экспорт &текущей конфигурации" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export current configuration to file" msgstr "Экспортировать текущую конфигурацию в файл" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export Config &Bundle" msgstr "Экспорт &всех конфигураций" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export all presets to file" msgstr "Экспортировать все конфигурации в единый файл" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export Config Bundle With Physical Printers" msgstr "Экспорт всех конфигураций с физическими принтерами" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export all presets including physical printers to file" msgstr "Экспорт всех профилей в файл, включая физические принтеры" -#: src/slic3r/GUI/MainFrame.cpp:1270 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "&Export" msgstr "&Экспорт" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Ejec&t SD Card / Flash Drive" msgstr "Из&влечь SD-карту / USB-накопитель" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "" "Извлечение SD-карты / USB-накопителя (после экспорта G-кода на носитель)" -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Quick Slice" msgstr "Быстро нарезать" -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Slice a file into a G-code" msgstr "Нарезать файл" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Quick Slice and Save As" msgstr "Быстро нарезать и сохранить как" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Slice a file into a G-code, save as" msgstr "Нарезать файл и сохранить как" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat Last Quick Slice" msgstr "Повторить последнюю быструю нарезку" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat last quick slice" msgstr "Повтор последней быстрой нарезки" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "(Re)Slice No&w" msgstr "(&Пере)Нарезать" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "Start new slicing process" msgstr "Начать новый процесс нарезки" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "&Repair STL file" msgstr "По&чинить STL файл" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "Automatically repair an STL file" msgstr "Автоматическая починка STL файла" -#: src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:1388 msgid "&G-code Preview" msgstr "Пр&едпросмотр G-кода" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1392 +msgid "E&xit" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1392 src/slic3r/GUI/UpdateDialogs.cpp:376 +#: src/slic3r/GUI/UpdateDialogs.cpp:423 +#, c-format, boost-format +msgid "Exit %s" +msgstr "Выйти из %s" + +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 msgid "&Quit" msgstr "В&ыход" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 #, c-format, boost-format msgid "Quit %s" msgstr "Выйти из %s" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1410 msgid "&Select All" msgstr "Выбрать &всё" -#: src/slic3r/GUI/MainFrame.cpp:1327 +#: src/slic3r/GUI/MainFrame.cpp:1411 msgid "Selects all objects" msgstr "Выбрать все модели" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1413 msgid "D&eselect All" msgstr "Снять в&ыбор со всего" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1414 msgid "Deselects all objects" msgstr "Выбрать все модели" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1417 msgid "&Delete Selected" msgstr "&Удалить выбранные" -#: src/slic3r/GUI/MainFrame.cpp:1334 +#: src/slic3r/GUI/MainFrame.cpp:1418 msgid "Deletes the current selection" msgstr "Удалить текущие выбранные модели" -#: src/slic3r/GUI/MainFrame.cpp:1336 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Delete &All" msgstr "Уд&алить всё" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1421 msgid "Deletes all objects" msgstr "Удалить все модели" -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1425 msgid "&Undo" msgstr "&Отмена" -#: src/slic3r/GUI/MainFrame.cpp:1344 +#: src/slic3r/GUI/MainFrame.cpp:1428 msgid "&Redo" msgstr "&Повтор" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1433 msgid "&Copy" msgstr "С&копировать" -#: src/slic3r/GUI/MainFrame.cpp:1350 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Copy selection to clipboard" msgstr "Скопировать выделенное в буфер обмена" -#: src/slic3r/GUI/MainFrame.cpp:1352 +#: src/slic3r/GUI/MainFrame.cpp:1436 msgid "&Paste" msgstr "Вс&тавить" -#: src/slic3r/GUI/MainFrame.cpp:1353 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "Paste clipboard" msgstr "Вставить из буфера обмена" -#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 -#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 +#: src/slic3r/GUI/MainFrame.cpp:1442 src/slic3r/GUI/MainFrame.cpp:1446 +#: src/slic3r/GUI/MainFrame.cpp:1615 src/slic3r/GUI/MainFrame.cpp:1619 msgid "Re&load from Disk" msgstr "Пере&загрузить с диска" -#: src/slic3r/GUI/MainFrame.cpp:1368 +#: src/slic3r/GUI/MainFrame.cpp:1452 msgid "Searc&h" msgstr "Пои&ск" -#: src/slic3r/GUI/MainFrame.cpp:1369 +#: src/slic3r/GUI/MainFrame.cpp:1453 msgid "Search in settings" msgstr "Поиск в настройках" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "&Plater Tab" msgstr "Вкладка &стола" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "Show the plater" msgstr "Показать вкладку стола" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "P&rint Settings Tab" msgstr "Вкладка настройки &печати" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "Show the print settings" msgstr "Показать настройки печати" -#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1469 src/slic3r/GUI/MainFrame.cpp:1679 msgid "&Filament Settings Tab" msgstr "Вкладка настройки п&рутка" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1469 msgid "Show the filament settings" msgstr "Показать настройки прутка" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Print&er Settings Tab" msgstr "Вкладка настройки прин&тера" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Show the printer settings" msgstr "Показать настройки принтера" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "3&D" msgstr "&3D-вид" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "Show the 3D editing view" msgstr "Показать вкладку 3D-вид" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Pre&view" msgstr "Предпр&осмотр нарезки" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Show the 3D slices preview" msgstr "Показать предпросмотр нарезки" -#: src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/MainFrame.cpp:1488 msgid "Open the dialog to modify shape gallery" msgstr "Открытие диалогового окна для редактирования библиотеки фигур." -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Print &Host Upload Queue" msgstr "Очередь загрузки на &хост печати" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Display the Print Host Upload Queue window" msgstr "Показать очередь загрузки на хост печати" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open New Instance" msgstr "Запустить новый экземпляр программы" -#: src/slic3r/GUI/MainFrame.cpp:1424 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 +#: src/slic3r/GUI/MainFrame.cpp:1507 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1727 msgid "Compare Presets" msgstr "Сравнение профилей" -#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/MainFrame.cpp:1507 msgid "Compare presets" msgstr "Сравнение профилей" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show &Labels" msgstr "Показать &имена файлов" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show object/instance labels in 3D scene" msgstr "Отображать имена файлов моделей\\копий в окне 3D-вида" -#: src/slic3r/GUI/MainFrame.cpp:1437 +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show Legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show legend in preview" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1523 msgid "&Collapse Sidebar" msgstr "&Свернуть боковую панель" -#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1523 src/slic3r/GUI/Plater.cpp:2347 msgid "Collapse sidebar" msgstr "Свернуть боковую панель" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "&Fullscreen" msgstr "Полно&экранный режим" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "Fullscreen" msgstr "Полноэкранный режим" -#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1543 src/slic3r/GUI/MainFrame.cpp:1650 msgid "&File" msgstr "&Файл" -#: src/slic3r/GUI/MainFrame.cpp:1458 +#: src/slic3r/GUI/MainFrame.cpp:1544 msgid "&Edit" msgstr "&Правка" -#: src/slic3r/GUI/MainFrame.cpp:1459 +#: src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Window" msgstr "&Окна" -#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 +#: src/slic3r/GUI/MainFrame.cpp:1546 src/slic3r/GUI/MainFrame.cpp:1651 msgid "&View" msgstr "&Вид" -#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 +#: src/slic3r/GUI/MainFrame.cpp:1549 src/slic3r/GUI/MainFrame.cpp:1654 msgid "&Help" msgstr "&Помощь" -#: src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/MainFrame.cpp:1611 msgid "&Open G-code" msgstr "&Открыть G-код файл" -#: src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open &PrusaSlicer" msgstr "Открыть &PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legend" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1676 msgid "E&xport" msgstr "&Экспорт" -#: src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end to print" msgstr "&Отправить на печать" -#: src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1679 msgid "Mate&rial Settings Tab" msgstr "Вкладка настройки материала" -#: src/slic3r/GUI/MainFrame.cpp:1613 +#: src/slic3r/GUI/MainFrame.cpp:1703 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Выберите файл для нарезки (STL/OBJ/AMF/3MF/PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1625 +#: src/slic3r/GUI/MainFrame.cpp:1715 msgid "No previously sliced file." msgstr "Нет ранее нарезанного файла." -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid "Previously sliced file (" msgstr "Ранее нарезанный файл" -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid ") not found." msgstr ") не найден." -#: src/slic3r/GUI/MainFrame.cpp:1633 +#: src/slic3r/GUI/MainFrame.cpp:1723 msgid "File Not Found" msgstr "Файл не найден" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 #, c-format, boost-format msgid "Save %s file as:" msgstr "Сохранить %s файл как:" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "G-code" msgstr "G-код" -#: src/slic3r/GUI/MainFrame.cpp:1680 +#: src/slic3r/GUI/MainFrame.cpp:1770 msgid "Save zip file as:" msgstr "Сохранить .zip файл как:" -#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6064 src/slic3r/GUI/Tab.cpp:1666 -#: src/slic3r/GUI/Tab.cpp:4730 +#: src/slic3r/GUI/MainFrame.cpp:1779 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6654 src/slic3r/GUI/Tab.cpp:1628 +#: src/slic3r/GUI/Tab.cpp:4986 msgid "Slicing" msgstr "Нарезка" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1691 +#: src/slic3r/GUI/MainFrame.cpp:1781 #, c-format, boost-format msgid "Processing %s" msgstr "Обработка %s" -#: src/slic3r/GUI/MainFrame.cpp:1714 +#: src/slic3r/GUI/MainFrame.cpp:1804 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% успешно нарезан." -#: src/slic3r/GUI/MainFrame.cpp:1717 +#: src/slic3r/GUI/MainFrame.cpp:1807 msgid "Slicing Done!" msgstr "Нарезка завершена!" -#: src/slic3r/GUI/MainFrame.cpp:1733 +#: src/slic3r/GUI/MainFrame.cpp:1823 msgid "Select the STL file to repair:" msgstr "Выберите STL файл для починки:" -#: src/slic3r/GUI/MainFrame.cpp:1743 +#: src/slic3r/GUI/MainFrame.cpp:1833 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "Сохранить в OBJ как (меньше подвержен ошибкам в координатах, чем STL):" -#: src/slic3r/GUI/MainFrame.cpp:1754 +#: src/slic3r/GUI/MainFrame.cpp:1844 msgid "Your file was repaired." msgstr "Ваш файл был починен." -#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4528 +#: src/slic3r/GUI/MainFrame.cpp:1844 src/libslic3r/PrintConfig.cpp:4694 msgid "Repair" msgstr "Ремонт" -#: src/slic3r/GUI/MainFrame.cpp:1768 +#: src/slic3r/GUI/MainFrame.cpp:1858 msgid "Save configuration as:" msgstr "Сохранить конфигурацию в файл как:" -#: src/slic3r/GUI/MainFrame.cpp:1785 +#: src/slic3r/GUI/MainFrame.cpp:1875 msgid "Loading of a configuration file" msgstr "Загрузка файла конфигурации" -#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 +#: src/slic3r/GUI/MainFrame.cpp:1877 src/slic3r/GUI/MainFrame.cpp:1944 msgid "Select configuration to load:" msgstr "Выберите файл конфигурации для загрузки:" -#: src/slic3r/GUI/MainFrame.cpp:1816 +#: src/slic3r/GUI/MainFrame.cpp:1908 msgid "Exporting configuration bundle" msgstr "Экспорт пакета конфигураций" -#: src/slic3r/GUI/MainFrame.cpp:1817 +#: src/slic3r/GUI/MainFrame.cpp:1909 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." @@ -6421,15 +7738,15 @@ msgstr "" "Некоторые профили изменены, и несохранённые изменения не будут " "экспортированы в пакет конфигурации." -#: src/slic3r/GUI/MainFrame.cpp:1826 +#: src/slic3r/GUI/MainFrame.cpp:1918 msgid "Save presets bundle as:" msgstr "Сохранить все конфигурации в файл как:" -#: src/slic3r/GUI/MainFrame.cpp:1849 +#: src/slic3r/GUI/MainFrame.cpp:1941 msgid "Loading of a configuration bundle" msgstr "Загрузка пакета конфигураций" -#: src/slic3r/GUI/MainFrame.cpp:1879 +#: src/slic3r/GUI/MainFrame.cpp:1971 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "Успешно импортировано профилей: %d шт." @@ -6498,19 +7815,19 @@ msgstr "Информация %s" msgid "%s information" msgstr "Информация %s" -#: src/slic3r/GUI/NotificationManager.hpp:752 +#: src/slic3r/GUI/NotificationManager.hpp:899 msgid "3D Mouse disconnected." msgstr "3D-мышь отключена." -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "Configuration update is available." msgstr "Доступно обновление конфигурации." -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "See more." msgstr "Подробнее." -#: src/slic3r/GUI/NotificationManager.hpp:761 +#: src/slic3r/GUI/NotificationManager.hpp:908 msgid "" "You have just added a G-code for color change, but its value is empty.\n" "To export the G-code correctly, check the \"Color Change G-code\" in " @@ -6521,58 +7838,75 @@ msgstr "" "Для правильного экспорта G-кода, проверьте пункт «G-код смены цвета» в " "разделе Настройки принтера > Пользовательский G-код." -#: src/slic3r/GUI/NotificationManager.hpp:764 +#: src/slic3r/GUI/NotificationManager.hpp:911 msgid "" "No color change event was added to the print. The print does not look like a " "sign." msgstr "" "К печати не были добавлены маркеры смены цвета. Модель не похожа на знак." -#: src/slic3r/GUI/NotificationManager.hpp:766 +#: src/slic3r/GUI/NotificationManager.hpp:913 msgid "Desktop integration was successful." msgstr "Интеграция с рабочим столом прошла успешно." -#: src/slic3r/GUI/NotificationManager.hpp:768 +#: src/slic3r/GUI/NotificationManager.hpp:915 msgid "Desktop integration failed." msgstr "Не удалось выполнить интеграцию с рабочим столом." -#: src/slic3r/GUI/NotificationManager.hpp:770 +#: src/slic3r/GUI/NotificationManager.hpp:917 msgid "Undo desktop integration was successful." msgstr "Отмена интеграции с рабочим столом прошла успешно." -#: src/slic3r/GUI/NotificationManager.hpp:772 +#: src/slic3r/GUI/NotificationManager.hpp:919 msgid "Undo desktop integration failed." msgstr "Не удалось отменить интеграцию с рабочим столом." -#: src/slic3r/GUI/NotificationManager.hpp:773 +#: src/slic3r/GUI/NotificationManager.hpp:920 msgid "Exporting." msgstr "Экспорт..." -#: src/slic3r/GUI/NotificationManager.cpp:664 +#: src/slic3r/GUI/NotificationManager.hpp:924 +msgid "" +"PrusaSlicer recieved a download request from Printables.com, but it's not " +"allowed. You can allow it" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:925 +msgid "here." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:773 msgid "Open Folder." msgstr "Открыть папку." -#: src/slic3r/GUI/NotificationManager.cpp:701 +#: src/slic3r/GUI/NotificationManager.cpp:811 msgid "Eject drive" msgstr "Извлечь диск" -#: src/slic3r/GUI/NotificationManager.cpp:885 +#: src/slic3r/GUI/NotificationManager.cpp:1054 +#: src/slic3r/GUI/NotificationManager.cpp:1267 +#: src/slic3r/GUI/NotificationManager.cpp:1472 msgid "ERROR" msgstr "ОШИБКА" -#: src/slic3r/GUI/NotificationManager.cpp:890 -msgid "CANCELED" -msgstr "ОТМЕНЕНО" - -#: src/slic3r/GUI/NotificationManager.cpp:895 +#: src/slic3r/GUI/NotificationManager.cpp:1269 +#: src/slic3r/GUI/NotificationManager.cpp:1377 msgid "COMPLETED" msgstr "ЗАВЕРШЕНО" -#: src/slic3r/GUI/NotificationManager.cpp:937 +#: src/slic3r/GUI/NotificationManager.cpp:1467 +msgid "RESOLVING ADDRESS" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:1477 +msgid "CANCELED" +msgstr "ОТМЕНЕНО" + +#: src/slic3r/GUI/NotificationManager.cpp:1539 msgid "Cancel upload" msgstr "Отменить отправку" -#: src/slic3r/GUI/NotificationManager.cpp:996 +#: src/slic3r/GUI/NotificationManager.cpp:1648 #, c-format, boost-format msgid "%1$d object was loaded with custom supports." msgid_plural "%1$d objects were loaded with custom supports." @@ -6580,7 +7914,7 @@ msgstr[0] "Загружена %1$d модель с пользовательск msgstr[1] "Загружено %1$d модели с пользовательскими поддержками." msgstr[2] "Загружено %1$d моделей с пользовательскими поддержками." -#: src/slic3r/GUI/NotificationManager.cpp:997 +#: src/slic3r/GUI/NotificationManager.cpp:1649 #, c-format, boost-format msgid "%1$d object was loaded with custom seam." msgid_plural "%1$d objects were loaded with custom seam." @@ -6588,7 +7922,7 @@ msgstr[0] "Загружена %1$d модель с пользовательск msgstr[1] "Загружено %1$d модели с пользовательским швом." msgstr[2] "Загружено %1$d моделей с пользовательским швом." -#: src/slic3r/GUI/NotificationManager.cpp:998 +#: src/slic3r/GUI/NotificationManager.cpp:1650 #, c-format, boost-format msgid "%1$d object was loaded with multimaterial painting." msgid_plural "%1$d objects were loaded with multimaterial painting." @@ -6596,7 +7930,7 @@ msgstr[0] "Загружена %1$d модель с мультиматериал msgstr[1] "Загружено %1$d модели с мультиматериальной покраской." msgstr[2] "Загружено %1$d моделей с мультиматериальной покраской." -#: src/slic3r/GUI/NotificationManager.cpp:999 +#: src/slic3r/GUI/NotificationManager.cpp:1651 #, c-format, boost-format msgid "%1$d object was loaded with variable layer height." msgid_plural "%1$d objects were loaded with variable layer height." @@ -6604,7 +7938,7 @@ msgstr[0] "Загружена %1$d модель с переменной высо msgstr[1] "Загружено %1$d модели с переменной высотой слоёв." msgstr[2] "Загружено %1$d моделей с переменной высотой слоёв." -#: src/slic3r/GUI/NotificationManager.cpp:1000 +#: src/slic3r/GUI/NotificationManager.cpp:1652 #, c-format, boost-format msgid "%1$d object was loaded with partial sinking." msgid_plural "%1$d objects were loaded with partial sinking." @@ -6612,65 +7946,92 @@ msgstr[0] "%1$d модель была загружена с частичным msgstr[1] "%1$d модели были загружены с частичным погружением в стол." msgstr[2] "%1$d моделей были загружены с частичным погружением в стол." -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1653 +#, c-format, boost-format +msgid "%1$d object was loaded as a part of cut object." +msgid_plural "%1$d objects were loaded as parts of cut object" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Slicing finished." msgstr "Нарезка завершена." -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export G-Code." msgstr "Экспорт в G-код." -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export." msgstr "Экспорт." -#: src/slic3r/GUI/NotificationManager.cpp:1447 -#: src/slic3r/GUI/NotificationManager.cpp:1454 -#: src/slic3r/GUI/NotificationManager.cpp:1470 -#: src/slic3r/GUI/NotificationManager.cpp:1476 -#: src/slic3r/GUI/NotificationManager.cpp:1547 +#: src/slic3r/GUI/NotificationManager.cpp:2101 +#: src/slic3r/GUI/NotificationManager.cpp:2108 +#: src/slic3r/GUI/NotificationManager.cpp:2124 +#: src/slic3r/GUI/NotificationManager.cpp:2130 +#: src/slic3r/GUI/NotificationManager.cpp:2201 msgid "ERROR:" msgstr "ОШИБКА:" -#: src/slic3r/GUI/NotificationManager.cpp:1459 -#: src/slic3r/GUI/NotificationManager.cpp:1486 -#: src/slic3r/GUI/NotificationManager.cpp:1494 -#: src/slic3r/GUI/NotificationManager.cpp:1505 src/slic3r/GUI/Plater.cpp:3197 +#: src/slic3r/GUI/NotificationManager.cpp:2113 +#: src/slic3r/GUI/NotificationManager.cpp:2140 +#: src/slic3r/GUI/NotificationManager.cpp:2148 +#: src/slic3r/GUI/NotificationManager.cpp:2159 src/slic3r/GUI/Plater.cpp:3220 msgid "WARNING:" msgstr "ПРЕДУПРЕЖДЕНИЕ:" -#: src/slic3r/GUI/NotificationManager.cpp:1598 +#: src/slic3r/GUI/NotificationManager.cpp:2275 msgid "Exporting finished." msgstr "Экспорт завершён." -#: src/slic3r/GUI/ObjectDataViewModel.cpp:50 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 msgid "Paint-on seam" msgstr "Рисование шва" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:52 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:68 +msgid "Cut connectors" +msgstr "" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:70 msgid "Sinking" msgstr "Погружение" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:110 msgid "Instances" msgstr "Копии" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:98 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:266 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:114 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:275 #, c-format, boost-format msgid "Instance %d" msgstr "Копия %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4568 -#: src/slic3r/GUI/Tab.cpp:4659 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:121 src/slic3r/GUI/Tab.cpp:4805 +#: src/slic3r/GUI/Tab.cpp:4942 msgid "Layers" msgstr "Слои" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 msgid "Range" msgstr "Диапазон" -#: src/slic3r/GUI/OpenGLManager.cpp:258 +#: src/slic3r/GUI/OpenGLManager.cpp:376 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL ES 2.0 capable graphics driver to run " +"correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:379 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL %s capable graphics driver to run correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:382 #, c-format, boost-format msgid "" "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" @@ -6681,11 +8042,11 @@ msgstr "" "Для правильной же работы PrusaSlicer требуется драйвер графической " "подсистемы, поддерживающий OpenGL 2.0." -#: src/slic3r/GUI/OpenGLManager.cpp:261 +#: src/slic3r/GUI/OpenGLManager.cpp:386 msgid "You may need to update your graphics card driver." msgstr "Возможно, вам потребуется обновить драйвер видеокарты." -#: src/slic3r/GUI/OpenGLManager.cpp:264 +#: src/slic3r/GUI/OpenGLManager.cpp:389 msgid "" "As a workaround, you may run PrusaSlicer with a software rendered 3D " "graphics by running prusa-slicer.exe with the --sw-renderer parameter." @@ -6693,11 +8054,11 @@ msgstr "" "В качестве обходного пути вы можете запустить PrusaSlicer с программной " "рендерингом 3D-графики, запустив prusa-sler.exe с параметром --sw-renderer." -#: src/slic3r/GUI/OpenGLManager.cpp:266 +#: src/slic3r/GUI/OpenGLManager.cpp:391 msgid "Unsupported OpenGL version" msgstr "Неподдерживаемая версия OpenGL" -#: src/slic3r/GUI/OpenGLManager.cpp:274 +#: src/slic3r/GUI/OpenGLManager.cpp:399 #, c-format, boost-format msgid "" "Unable to load the following shaders:\n" @@ -6706,16 +8067,20 @@ msgstr "" "Не удалось загрузить следующие шейдеры:\n" "%s" -#: src/slic3r/GUI/OpenGLManager.cpp:275 +#: src/slic3r/GUI/OpenGLManager.cpp:400 msgid "Error loading shaders" msgstr "Ошибка загрузки шейдеров" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:126 +msgid "Unavailable for this method." +msgstr "" + +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Top" msgstr "Сверху" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Bottom" msgstr "Снизу" @@ -6724,7 +8089,7 @@ msgstr "Снизу" msgid "Delete this preset from this printer device" msgstr "Удалить этот профиль у данного принтера" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:83 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:84 msgid "This printer will be shown in the presets list as" msgstr "Этот принтер будет отображаться в списке профилей как" @@ -6740,32 +8105,32 @@ msgstr "Имя принтера" msgid "Add preset for this printer device" msgstr "Добавить профиль для этого принтера" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2255 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2239 msgid "Print Host upload" msgstr "Загрузка на хост печати" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:268 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:271 msgid "Connection to printers connected via the print host failed." msgstr "" "Не удалось подключиться к принтерам, подключенным через через хост печати." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:310 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:313 msgid "Test" msgstr "Тест" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:315 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:318 msgid "Could not get a valid Printer Host reference" msgstr "Не удалось получить действительную ссылку на хост принтера" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:330 msgid "Success!" msgstr "Успешно!" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:337 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:340 msgid "Refresh Printers" msgstr "Обновить принтеры" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:367 msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." @@ -6773,20 +8138,20 @@ msgstr "" "Файл HTTPS CA не обязателен. Он необходим только при использовании HTTPS с " "самоподписанным сертификатом." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:374 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:377 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "Файлы сертификатов (*.crt, *.pem)|*.crt;*.pem|Все файлы|*.*" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:378 msgid "Open CA certificate file" msgstr "Открыть файл сертификата CA" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:404 -#: src/libslic3r/PrintConfig.cpp:330 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:407 +#: src/libslic3r/PrintConfig.cpp:343 msgid "HTTPS CA File" msgstr "Файл HTTPS CA сертификата" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:405 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:408 #, c-format, boost-format msgid "" "On this system, %s uses HTTPS certificates from the system Certificate Store " @@ -6795,7 +8160,7 @@ msgstr "" "В этой системе %s использует HTTPS сертификаты из системного хранилища " "сертификатов/Keychain." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:406 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:409 msgid "" "To use a custom CA file, please import your CA file into Certificate Store / " "Keychain." @@ -6803,24 +8168,24 @@ msgstr "" "Чтобы использовать пользовательский файл CA, импортируйте его в хранилище " "сертификатов/Keychain." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:634 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:706 msgid "The supplied name is empty. It can't be saved." msgstr "Имя не задано. Невозможно сохранить." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:638 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:710 msgid "You have to enter a printer name." msgstr "Введите имя принтера." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:646 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:718 #, boost-format msgid "Printer with name \"%1%\" already exists." msgstr "Принтер с именем \"%1%\" уже существует." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:647 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:719 msgid "Replace?" msgstr "Заменить?" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:674 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:746 #, boost-format msgid "" "Following printer preset is duplicated:%1%The above preset for printer \"%2%" @@ -6838,19 +8203,19 @@ msgstr[2] "" "Следующие профили принтера дублируются:%1%Вышеупомянутые профили для " "принтера \\\"%2%\\\" будут использоваться только один раз." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:724 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:796 msgid "It's not possible to delete the last related preset for the printer." msgstr "Невозможно удалить последний связанный профиль принтера." -#: src/slic3r/GUI/Plater.cpp:141 +#: src/slic3r/GUI/Plater.cpp:158 msgid "The provided name is not valid;" msgstr "Указано недопустимое имя файла;" -#: src/slic3r/GUI/Plater.cpp:142 src/slic3r/GUI/SavePresetDialog.cpp:102 +#: src/slic3r/GUI/Plater.cpp:159 src/slic3r/GUI/SavePresetDialog.cpp:166 msgid "the following characters are not allowed:" msgstr "следующие знаки не разрешаются:" -#: src/slic3r/GUI/Plater.cpp:207 +#: src/slic3r/GUI/Plater.cpp:223 msgid "" "For a multipart object, this value isn't accurate.\n" "It doesn't take account of intersections and negative volumes." @@ -6859,69 +8224,69 @@ msgstr "" "точным.\n" "Оно не учитывает пересечения и отрицательные объёмы." -#: src/slic3r/GUI/Plater.cpp:211 +#: src/slic3r/GUI/Plater.cpp:227 msgid "Volume" msgstr "Объём" -#: src/slic3r/GUI/Plater.cpp:213 +#: src/slic3r/GUI/Plater.cpp:229 msgid "Facets" msgstr "Граней" -#: src/slic3r/GUI/Plater.cpp:276 +#: src/slic3r/GUI/Plater.cpp:286 msgid "Sliced Info" msgstr "Информация о нарезке" -#: src/slic3r/GUI/Plater.cpp:296 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:306 src/slic3r/GUI/Plater.cpp:1414 msgid "Used Filament (g)" msgstr "Использовано прутка (г)" -#: src/slic3r/GUI/Plater.cpp:297 src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:307 src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (m)" msgstr "Использовано прутка в метрах" -#: src/slic3r/GUI/Plater.cpp:298 src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:308 src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (mm³)" msgstr "Использовано прутка (мм³)" -#: src/slic3r/GUI/Plater.cpp:299 +#: src/slic3r/GUI/Plater.cpp:309 msgid "Used Material (unit)" msgstr "Использовано материала (единиц)" -#: src/slic3r/GUI/Plater.cpp:300 +#: src/slic3r/GUI/Plater.cpp:310 msgid "Cost (money)" msgstr "Стоимость" -#: src/slic3r/GUI/Plater.cpp:301 src/slic3r/GUI/Plater.cpp:1340 -#: src/slic3r/GUI/Plater.cpp:1427 +#: src/slic3r/GUI/Plater.cpp:311 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:1464 msgid "Estimated printing time" msgstr "Расчётное время печати" -#: src/slic3r/GUI/Plater.cpp:302 +#: src/slic3r/GUI/Plater.cpp:312 msgid "Number of tool changes" msgstr "Количество инструментов" -#: src/slic3r/GUI/Plater.cpp:431 +#: src/slic3r/GUI/Plater.cpp:437 msgid "Select what kind of support do you need" msgstr "Выбор варианта поддержки" -#: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2590 -#: src/libslic3r/PrintConfig.cpp:3645 +#: src/slic3r/GUI/Plater.cpp:440 src/libslic3r/PrintConfig.cpp:2620 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "Support on build plate only" msgstr "Только от стола" -#: src/slic3r/GUI/Plater.cpp:434 src/slic3r/GUI/Plater.cpp:564 +#: src/slic3r/GUI/Plater.cpp:441 msgid "For support enforcers only" msgstr "Только принудительная" -#: src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Plater.cpp:442 msgid "Everywhere" msgstr "Везде" -#: src/slic3r/GUI/Plater.cpp:467 src/slic3r/GUI/Tab.cpp:1542 +#: src/slic3r/GUI/Plater.cpp:475 src/slic3r/GUI/Tab.cpp:1489 msgid "Brim" msgstr "Кайма" -#: src/slic3r/GUI/Plater.cpp:469 +#: src/slic3r/GUI/Plater.cpp:477 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." @@ -6931,36 +8296,36 @@ msgstr "" "параметра очень важно для моделей с маленькой площадью контакта со столом и " "особенно важно при печати ABS пластиком." -#: src/slic3r/GUI/Plater.cpp:477 +#: src/slic3r/GUI/Plater.cpp:485 msgid "Purging volumes" msgstr "Объём очистки" -#: src/slic3r/GUI/Plater.cpp:578 +#: src/slic3r/GUI/Plater.cpp:592 msgid "Select what kind of pad do you need" msgstr "Выбор варианта подложки" -#: src/slic3r/GUI/Plater.cpp:580 +#: src/slic3r/GUI/Plater.cpp:595 msgid "Below object" msgstr "Под моделью" -#: src/slic3r/GUI/Plater.cpp:581 +#: src/slic3r/GUI/Plater.cpp:596 msgid "Around object" msgstr "Вокруг модели" -#: src/slic3r/GUI/Plater.cpp:894 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/Plater.cpp:929 src/slic3r/GUI/Plater.cpp:7162 msgid "Send to printer" msgstr "На принтер" -#: src/slic3r/GUI/Plater.cpp:914 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6067 +#: src/slic3r/GUI/Plater.cpp:949 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6657 msgid "Slice now" msgstr "НАРЕЗАТЬ" -#: src/slic3r/GUI/Plater.cpp:1087 +#: src/slic3r/GUI/Plater.cpp:1127 msgid "Hold Shift to Slice & Export G-code" msgstr "Удерживайте клавишу Shift, чтобы нарезать и экспортировать в G-код" -#: src/slic3r/GUI/Plater.cpp:1287 +#: src/slic3r/GUI/Plater.cpp:1324 #, boost-format msgid "%1% (%2$d shell)" msgid_plural "%1% (%2$d shells)" @@ -6968,81 +8333,78 @@ msgstr[0] "%1% (%2$d оболочка)" msgstr[1] "%1% (%2$d оболочки)" msgstr[2] "%1% (%2$d оболочек)" -#: src/slic3r/GUI/Plater.cpp:1315 +#: src/slic3r/GUI/Plater.cpp:1352 msgid "Used Material (ml)" msgstr "Использовано материала (мл)" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "object" msgid_plural "objects" msgstr[0] "модель" msgstr[1] "модели" msgstr[2] "моделей" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "supports and pad" msgstr "поддержка и подложка" -#: src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (in)" msgstr "Использовано прутка (дюймы)" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "objects" msgstr "модели" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "wipe tower" msgstr "черновой башни" -#: src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (in³)" msgstr "Использовано прутка (дюймы³)" -#: src/slic3r/GUI/Plater.cpp:1396 +#: src/slic3r/GUI/Plater.cpp:1433 #, boost-format msgid "Filament at extruder %1%" msgstr "Прутка в экструдере %1%" -#: src/slic3r/GUI/Plater.cpp:1402 +#: src/slic3r/GUI/Plater.cpp:1439 msgid "(including spool)" msgstr "(включая катушку)" -#: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1072 -#: src/libslic3r/PrintConfig.cpp:3439 src/libslic3r/PrintConfig.cpp:3440 +#: src/slic3r/GUI/Plater.cpp:1448 src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:3716 src/libslic3r/PrintConfig.cpp:3717 msgid "Cost" msgstr "Стоимость" -#: src/slic3r/GUI/Plater.cpp:1429 +#: src/slic3r/GUI/Plater.cpp:1466 msgid "normal mode" msgstr "нормальный режим" -#: src/slic3r/GUI/Plater.cpp:1436 +#: src/slic3r/GUI/Plater.cpp:1473 msgid "stealth mode" msgstr "тихий режим" -#: src/slic3r/GUI/Plater.cpp:1670 -msgid "Fill bed" -msgstr "Заполнение всего стола копиями" - -#: src/slic3r/GUI/Plater.cpp:1676 -msgid "Optimize Rotation" -msgstr "Оптимизация положения" - -#: src/slic3r/GUI/Plater.cpp:1682 -msgid "Import SLA archive" -msgstr "Загрузить SLA архив" - -#: src/slic3r/GUI/Plater.cpp:1725 +#: src/slic3r/GUI/Plater.cpp:1734 #, boost-format msgid "Do you want to save the changes to \"%1%\"?" msgstr "Вы хотите сохранить изменения в \"%1%\"?" -#: src/slic3r/GUI/Plater.cpp:1730 src/slic3r/GUI/Preferences.cpp:222 +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:905 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1599 +msgid "Save" +msgstr "Сохранить" + +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +msgid "Discard" +msgstr "Не сохранять" + +#: src/slic3r/GUI/Plater.cpp:1740 src/slic3r/GUI/Preferences.cpp:354 msgid "Ask for unsaved changes in project" msgstr "Спрашивать о несохранённых изменениях в проекте" -#: src/slic3r/GUI/Plater.cpp:1733 +#: src/slic3r/GUI/Plater.cpp:1743 msgid "" "You will not be asked about it again, when: \n" "- Closing PrusaSlicer,\n" @@ -7052,7 +8414,7 @@ msgstr "" "- Закрытии PrusaSlicer\n" "- Загрузке или создании нового проекта" -#: src/slic3r/GUI/Plater.cpp:2198 +#: src/slic3r/GUI/Plater.cpp:2214 #, c-format, boost-format msgid "" "Successfully unmounted. The device %s(%s) can now be safely removed from the " @@ -7061,20 +8423,20 @@ msgstr "" "Размонтирование прошло успешно. Теперь устройство %s(%s) может быть " "безопасно извлечено из компьютера." -#: src/slic3r/GUI/Plater.cpp:2203 +#: src/slic3r/GUI/Plater.cpp:2220 #, c-format, boost-format msgid "Ejecting of device %s(%s) has failed." msgstr "Не удалось извлечь устройство %s(%s)." -#: src/slic3r/GUI/Plater.cpp:2222 src/slic3r/GUI/Plater.cpp:5108 +#: src/slic3r/GUI/Plater.cpp:2239 src/slic3r/GUI/Plater.cpp:5199 msgid "New Project" msgstr "Новый проект" -#: src/slic3r/GUI/Plater.cpp:2319 +#: src/slic3r/GUI/Plater.cpp:2346 msgid "Expand sidebar" msgstr "Развернуть боковую панель" -#: src/slic3r/GUI/Plater.cpp:2518 +#: src/slic3r/GUI/Plater.cpp:2428 msgid "" "The preset below was temporarily installed on the active instance of " "PrusaSlicer" @@ -7091,12 +8453,12 @@ msgstr[2] "" "Приведённые ниже профили были временно установлены на активной копии " "PrusaSlicer" -#: src/slic3r/GUI/Plater.cpp:2548 +#: src/slic3r/GUI/Plater.cpp:2583 #, boost-format msgid "Failed loading file \"%1%\" due to an invalid configuration." msgstr "Не удалось загрузить файл \"%1%\" из-за недопустимой конфигурации." -#: src/slic3r/GUI/Plater.cpp:2568 +#: src/slic3r/GUI/Plater.cpp:2603 #, c-format, boost-format msgid "" "Object size from file %s appears to be zero.\n" @@ -7114,11 +8476,11 @@ msgstr[2] "" "Похоже у объектов из файла %s нулевой размер.\n" "Они были удалены из модели." -#: src/slic3r/GUI/Plater.cpp:2572 +#: src/slic3r/GUI/Plater.cpp:2607 msgid "The size of the object is zero" msgstr "Размер модели равен нулю" -#: src/slic3r/GUI/Plater.cpp:2585 +#: src/slic3r/GUI/Plater.cpp:2620 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in meters.\n" @@ -7141,15 +8503,15 @@ msgstr[2] "" "Внутренней единицей измерения PrusaSlicer являются миллиметры. Пересчитать " "размеры моделей?" -#: src/slic3r/GUI/Plater.cpp:2589 src/slic3r/GUI/Plater.cpp:2611 +#: src/slic3r/GUI/Plater.cpp:2624 src/slic3r/GUI/Plater.cpp:2646 msgid "The object is too small" msgstr "Модель слишком мала" -#: src/slic3r/GUI/Plater.cpp:2590 src/slic3r/GUI/Plater.cpp:2612 +#: src/slic3r/GUI/Plater.cpp:2625 src/slic3r/GUI/Plater.cpp:2647 msgid "Apply to all the remaining small objects being loaded." msgstr "Применить ко всем загружаемым мелким моделям." -#: src/slic3r/GUI/Plater.cpp:2607 +#: src/slic3r/GUI/Plater.cpp:2642 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in inches.\n" @@ -7172,7 +8534,7 @@ msgstr[2] "" "Внутренней единицей измерения PrusaSlicer являются миллиметры. Пересчитать " "размеры моделей?" -#: src/slic3r/GUI/Plater.cpp:2625 +#: src/slic3r/GUI/Plater.cpp:2659 msgid "" "This file contains several objects positioned at multiple heights.\n" "Instead of considering them as multiple objects, should \n" @@ -7182,11 +8544,11 @@ msgstr "" "Следует ли загружать файл как единую модель, состоящий из нескольких\n" "частей (вместо того, чтобы рассматривать их как несколько моделей)?" -#: src/slic3r/GUI/Plater.cpp:2628 src/slic3r/GUI/Plater.cpp:2683 +#: src/slic3r/GUI/Plater.cpp:2662 src/slic3r/GUI/Plater.cpp:2711 msgid "Multi-part object detected" msgstr "Обнаружена модель, состоящая из нескольких частей" -#: src/slic3r/GUI/Plater.cpp:2636 +#: src/slic3r/GUI/Plater.cpp:2669 msgid "" "This file cannot be loaded in a simple mode. Do you want to switch to an " "advanced mode?" @@ -7194,20 +8556,11 @@ msgstr "" "Этот файл не может быть загружен в простом режиме. Хотите перейти в " "расширенный режим?" -#: src/slic3r/GUI/Plater.cpp:2637 +#: src/slic3r/GUI/Plater.cpp:2670 msgid "Detected advanced data" msgstr "Обнаружены расширенные данные" -#: src/slic3r/GUI/Plater.cpp:2657 -#, c-format, boost-format -msgid "" -"You can't to add the object(s) from %s because of one or some of them " -"is(are) multi-part" -msgstr "" -"Вы не можете добавить модель(и) из %s, потому что одна или несколько из них " -"являются составными (состоят из нескольких частей)" - -#: src/slic3r/GUI/Plater.cpp:2680 +#: src/slic3r/GUI/Plater.cpp:2708 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" @@ -7217,7 +8570,7 @@ msgstr "" "Вместо того, чтобы рассматривать их как несколько моделей, следует ли " "рассматривать их как одну модель, состоящую из несколько частей?" -#: src/slic3r/GUI/Plater.cpp:2799 +#: src/slic3r/GUI/Plater.cpp:2827 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." @@ -7225,54 +8578,69 @@ msgstr "" "Ваша модель слишком большая, поэтому она была автоматически уменьшена до " "размера вашего печатного стола." -#: src/slic3r/GUI/Plater.cpp:2800 +#: src/slic3r/GUI/Plater.cpp:2828 msgid "Object too large?" msgstr "Модель слишком большая?" -#: src/slic3r/GUI/Plater.cpp:2878 +#: src/slic3r/GUI/Plater.cpp:2908 msgid "Export STL file:" msgstr "Экспорт в STL файл:" -#: src/slic3r/GUI/Plater.cpp:2885 +#: src/slic3r/GUI/Plater.cpp:2915 msgid "Export AMF file:" msgstr "Экспорт в AMF файл:" -#: src/slic3r/GUI/Plater.cpp:2891 +#: src/slic3r/GUI/Plater.cpp:2921 msgid "Save file as:" msgstr "Сохранить файл как:" -#: src/slic3r/GUI/Plater.cpp:2897 +#: src/slic3r/GUI/Plater.cpp:2927 msgid "Export OBJ file:" msgstr "Экспорт в OBJ файл:" -#: src/slic3r/GUI/Plater.cpp:2995 +#: src/slic3r/GUI/Plater.cpp:3030 +msgid "Delete object which is a part of cut object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3031 +msgid "" +"You try to delete an object which is a part of a cut object.\n" +"This action will break a cut correspondence.\n" +"After that PrusaSlicer can't guarantee model consistency" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3035 +msgid "Delete object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3040 msgid "Delete Object" msgstr "Удаление модели" -#: src/slic3r/GUI/Plater.cpp:3007 +#: src/slic3r/GUI/Plater.cpp:3057 msgid "Delete All Objects" msgstr "Удаление всех моделей" -#: src/slic3r/GUI/Plater.cpp:3035 +#: src/slic3r/GUI/Plater.cpp:3086 msgid "Reset Project" msgstr "Обнуление проекта" -#: src/slic3r/GUI/Plater.cpp:3118 +#: src/slic3r/GUI/Plater.cpp:3141 msgid "" "The selected object couldn't be split because it contains only one solid " "part." msgstr "" "Выбранная модель не может быть разделена, так как она состоит из одной части." -#: src/slic3r/GUI/Plater.cpp:3125 +#: src/slic3r/GUI/Plater.cpp:3148 msgid "All non-solid parts (modifiers) were deleted" msgstr "Все модификаторы были удалены" -#: src/slic3r/GUI/Plater.cpp:3127 +#: src/slic3r/GUI/Plater.cpp:3150 msgid "Split to Objects" msgstr "Разделить на модели" -#: src/slic3r/GUI/Plater.cpp:3179 +#: src/slic3r/GUI/Plater.cpp:3202 msgid "" "An object has custom support enforcers which will not be used because " "supports are disabled." @@ -7280,87 +8648,88 @@ msgstr "" "Модель имеет пользовательские принудительные поддержки, которые не будут " "использоваться, так как поддержки отключены." -#: src/slic3r/GUI/Plater.cpp:3181 +#: src/slic3r/GUI/Plater.cpp:3204 msgid "Enable supports for enforcers only" msgstr "Разрешить только принудительную поддержку" -#: src/slic3r/GUI/Plater.cpp:3310 src/slic3r/GUI/Plater.cpp:4176 +#: src/slic3r/GUI/Plater.cpp:3339 src/slic3r/GUI/Plater.cpp:4238 msgid "Invalid data" msgstr "Неверные данные" -#: src/slic3r/GUI/Plater.cpp:3380 +#: src/slic3r/GUI/Plater.cpp:3410 msgid "Another export job is currently running." msgstr "Уже идёт другой процесс экспорта." -#: src/slic3r/GUI/Plater.cpp:3466 +#: src/slic3r/GUI/Plater.cpp:3496 msgid "Replace from:" msgstr "Заменить из:" -#: src/slic3r/GUI/Plater.cpp:3484 +#: src/slic3r/GUI/Plater.cpp:3514 msgid "Unable to replace with more than one volume" msgstr "Невозможно заменить более чем одним объём" -#: src/slic3r/GUI/Plater.cpp:3484 src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3514 src/slic3r/GUI/Plater.cpp:3597 msgid "Error during replace" msgstr "Ошибка при выполнении замены" -#: src/slic3r/GUI/Plater.cpp:3555 +#: src/slic3r/GUI/Plater.cpp:3589 msgid "Select the new file" msgstr "Выберите новый файл" -#: src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3597 msgid "File for the replace wasn't selected" msgstr "Файл для замены не выбран" -#: src/slic3r/GUI/Plater.cpp:3654 +#: src/slic3r/GUI/Plater.cpp:3684 msgid "Please select the file to reload" msgstr "Пожалуйста, выберите файл для перезагрузки" -#: src/slic3r/GUI/Plater.cpp:3685 src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:3715 src/slic3r/GUI/Plater.cpp:5355 +#: src/slic3r/GUI/Plater.cpp:5365 msgid "The selected file" msgstr "В выбранном файле" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "differs from the original file" msgstr "отличается от исходного файла" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "Do you want to replace it" msgstr "Хотите заменить его" -#: src/slic3r/GUI/Plater.cpp:3703 src/slic3r/GUI/Plater.cpp:3709 +#: src/slic3r/GUI/Plater.cpp:3736 src/slic3r/GUI/Plater.cpp:3742 msgid "Reload from:" msgstr "Перезагрузка из:" -#: src/slic3r/GUI/Plater.cpp:3812 +#: src/slic3r/GUI/Plater.cpp:3864 msgid "Unable to reload:" msgstr "Не удалось перезагрузить:" -#: src/slic3r/GUI/Plater.cpp:3817 +#: src/slic3r/GUI/Plater.cpp:3869 msgid "Error during reload" msgstr "Ошибка во время перезагрузки" -#: src/slic3r/GUI/Plater.cpp:3835 +#: src/slic3r/GUI/Plater.cpp:3887 msgid "Reload all from disk" msgstr "Перезагрузить всё с диска" -#: src/slic3r/GUI/Plater.cpp:4130 +#: src/slic3r/GUI/Plater.cpp:4191 msgid "There are active warnings concerning sliced models:" msgstr "Имеются активные предупреждения о нарезанных моделях:" -#: src/slic3r/GUI/Plater.cpp:4141 +#: src/slic3r/GUI/Plater.cpp:4202 msgid "generated warnings" msgstr "вызвала предупреждения" -#: src/slic3r/GUI/Plater.cpp:4472 +#: src/slic3r/GUI/Plater.cpp:4554 msgid "3D editor view" msgstr "3D-вид" -#: src/slic3r/GUI/Plater.cpp:4893 +#: src/slic3r/GUI/Plater.cpp:4980 msgid "Undo / Redo is processing" msgstr "Отмена / Повтор в процессе выполнения" -#: src/slic3r/GUI/Plater.cpp:4895 +#: src/slic3r/GUI/Plater.cpp:4982 #, boost-format msgid "" "Switching the printer technology from %1% to %2%.\n" @@ -7371,21 +8740,21 @@ msgstr "" "Некоторые профили %1% были изменены и будут потеряны после переключения " "технологии печати." -#: src/slic3r/GUI/Plater.cpp:5092 +#: src/slic3r/GUI/Plater.cpp:5184 msgid "Creating a new project while the current project is modified." msgstr "Создание нового проекта при изменении в текущем проекте." -#: src/slic3r/GUI/Plater.cpp:5095 +#: src/slic3r/GUI/Plater.cpp:5187 msgid "Creating a new project while some presets are modified." msgstr "" "Создание нового проекта при имеющихся изменениях в нескольких профилях." -#: src/slic3r/GUI/Plater.cpp:5096 +#: src/slic3r/GUI/Plater.cpp:5188 msgid "You can keep presets modifications to the new project or discard them" msgstr "" "Вы можете сохранить изменения в профилях в новом проекте или отменить их." -#: src/slic3r/GUI/Plater.cpp:5097 +#: src/slic3r/GUI/Plater.cpp:5189 msgid "" "You can keep presets modifications to the new project, discard them or save " "changes as new presets.\n" @@ -7395,125 +8764,172 @@ msgstr "" "сохранить изменения как новые профили.\n" "Примечание: При сохранении изменений они не переносятся в новый проект." -#: src/slic3r/GUI/Plater.cpp:5103 +#: src/slic3r/GUI/Plater.cpp:5194 msgid "Creating a new project" msgstr "Создание нового проекта" -#: src/slic3r/GUI/Plater.cpp:5137 +#: src/slic3r/GUI/Plater.cpp:5228 msgid "Load Project" msgstr "Загрузка проекта" -#: src/slic3r/GUI/Plater.cpp:5167 src/slic3r/GUI/Plater.cpp:5432 +#: src/slic3r/GUI/Plater.cpp:5258 msgid "Import Object" msgstr "Импорт модели" -#: src/slic3r/GUI/Plater.cpp:5171 +#: src/slic3r/GUI/Plater.cpp:5262 msgid "Import Objects" msgstr "Импорт моделей" -#: src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:5291 +msgid "Import SLA archive" +msgstr "Загрузить SLA архив" + +#: src/slic3r/GUI/Plater.cpp:5355 src/slic3r/GUI/Plater.cpp:5365 msgid "does not contain valid gcode." msgstr "G-кода содержатся недопустимые данные." -#: src/slic3r/GUI/Plater.cpp:5244 +#: src/slic3r/GUI/Plater.cpp:5356 src/slic3r/GUI/Plater.cpp:5366 msgid "Error while loading .gcode file" msgstr "Ошибка при загрузке .gcode файла" -#: src/slic3r/GUI/Plater.cpp:5297 +#: src/slic3r/GUI/Plater.cpp:5433 +#, c-format, boost-format +msgid "%s - Multiple projects file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 +msgid "There are several files being loaded, including Project files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 src/slic3r/GUI/Plater.cpp:5446 +msgid "Select an action to apply to all files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5446 +msgid "There are several files being loaded." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5448 src/slic3r/GUI/Plater.cpp:5842 +msgid "Action" +msgstr "Действие" + +#: src/slic3r/GUI/Plater.cpp:5469 +msgid "Import geometry" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5482 src/slic3r/GUI/Plater.cpp:5834 +msgid "Start new PrusaSlicer instance" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5496 +msgid "Select one to load as project" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5507 +msgid "Select one to load config only" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5609 +#, boost-format +msgid "Failed to unzip file to %1%: %2% " +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5618 +#, boost-format +msgid "Failed to find unzipped file at %1%. Unzipping of file has failed." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5821 #, c-format, boost-format -msgid "%s - Drop project file" -msgstr "%s - Перетаскивание файла-проекта" +msgid "%s - Load project file" +msgstr "" -#: src/slic3r/GUI/Plater.cpp:5304 +#: src/slic3r/GUI/Plater.cpp:5830 msgid "Open as project" msgstr "Открыть как проект" -#: src/slic3r/GUI/Plater.cpp:5305 +#: src/slic3r/GUI/Plater.cpp:5831 msgid "Import geometry only" msgstr "Импортировать только геометрию" -#: src/slic3r/GUI/Plater.cpp:5306 +#: src/slic3r/GUI/Plater.cpp:5832 msgid "Import config only" msgstr "Импортировать только конфигурацию" -#: src/slic3r/GUI/Plater.cpp:5309 +#: src/slic3r/GUI/Plater.cpp:5837 msgid "Select an action to apply to the file" msgstr "Выберите действие для применения к файлу" -#: src/slic3r/GUI/Plater.cpp:5314 -msgid "Action" -msgstr "Действие" - -#: src/slic3r/GUI/Plater.cpp:5330 +#: src/slic3r/GUI/Plater.cpp:5858 msgid "Don't show again" msgstr "Больше не показывать" -#: src/slic3r/GUI/Plater.cpp:5371 +#: src/slic3r/GUI/Plater.cpp:5899 msgid "You can open only one .gcode file at a time." msgstr "За раз вы можете открыть только один .gcode файл." -#: src/slic3r/GUI/Plater.cpp:5372 +#: src/slic3r/GUI/Plater.cpp:5900 msgid "Drag and drop G-code file" msgstr "Перетащите G-код файл" -#: src/slic3r/GUI/Plater.cpp:5454 +#: src/slic3r/GUI/Plater.cpp:5992 msgid "Load File" msgstr "Загрузить файл" -#: src/slic3r/GUI/Plater.cpp:5459 +#: src/slic3r/GUI/Plater.cpp:5997 msgid "Load Files" msgstr "Загрузить файлы" -#: src/slic3r/GUI/Plater.cpp:5509 +#: src/slic3r/GUI/Plater.cpp:6047 msgid "All objects will be removed, continue?" msgstr "Все модели будут удалены, продолжить?" -#: src/slic3r/GUI/Plater.cpp:5520 +#: src/slic3r/GUI/Plater.cpp:6058 msgid "Delete Selected Objects" msgstr "Удаление выбранных моделей" -#: src/slic3r/GUI/Plater.cpp:5529 +#: src/slic3r/GUI/Plater.cpp:6067 msgid "Increase Instances" msgstr "Добавление копии" -#: src/slic3r/GUI/Plater.cpp:5563 +#: src/slic3r/GUI/Plater.cpp:6109 msgid "Decrease Instances" msgstr "Удаление копии" -#: src/slic3r/GUI/Plater.cpp:5614 +#: src/slic3r/GUI/Plater.cpp:6167 msgid "Enter the number of copies:" msgstr "Введите количество копий:" -#: src/slic3r/GUI/Plater.cpp:5615 +#: src/slic3r/GUI/Plater.cpp:6168 msgid "Copies of the selected object" msgstr "Количество копий выбранной модели" -#: src/slic3r/GUI/Plater.cpp:5619 +#: src/slic3r/GUI/Plater.cpp:6171 #, c-format, boost-format msgid "Set numbers of copies to %d" msgstr "Задать количество копий: %d" -#: src/slic3r/GUI/Plater.cpp:5697 -msgid "Cut by Plane" -msgstr "Разрез по плоскости" +#: src/slic3r/GUI/Plater.cpp:6187 +msgid "Fill bed" +msgstr "Заполнение всего стола копиями" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save G-code file as:" msgstr "Сохранить файл G-кода как:" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save SL1 / SL1S file as:" msgstr "Сохранить SL1 / SL1S файл как:" -#: src/slic3r/GUI/Plater.cpp:5766 +#: src/slic3r/GUI/Plater.cpp:6336 msgid "The provided file name is not valid." msgstr "Указано недопустимое имя файла." -#: src/slic3r/GUI/Plater.cpp:5767 +#: src/slic3r/GUI/Plater.cpp:6337 msgid "The following characters are not allowed by a FAT file system:" msgstr "Следующие символы не разрешены файловой системой FAT:" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "" "The plater is empty.\n" "Do you want to save the project?" @@ -7521,38 +8937,38 @@ msgstr "" "На столе ничего нет.\n" "Всё равно сохранить проект?" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "Save project" msgstr "Сохранение проекта" -#: src/slic3r/GUI/Plater.cpp:6543 +#: src/slic3r/GUI/Plater.cpp:6766 +msgid "Is the printer ready? Is the print sheet in place, empty and clean?" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:6766 src/slic3r/GUI/PrintHostDialogs.cpp:132 +msgid "Upload and Print" +msgstr "Загрузить и напечатать" + +#: src/slic3r/GUI/Plater.cpp:7161 msgid "Export" msgstr "Экспорт" -#: src/slic3r/GUI/Plater.cpp:6575 -msgid "" -"Custom supports, seams and multimaterial painting were removed after " -"repairing the mesh." -msgstr "" -"После починки сетки были удалены пользовательские поддержки, швы и " -"мультиматериальная покраска." - -#: src/slic3r/GUI/Plater.cpp:6689 +#: src/slic3r/GUI/Plater.cpp:7306 msgid "Paste From Clipboard" msgstr "Вставка из буфера обмена" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2290 -#: src/slic3r/GUI/Tab.cpp:2517 src/slic3r/GUI/Tab.cpp:2624 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Preferences.cpp:240 src/slic3r/GUI/Tab.cpp:2274 +#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2617 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "General" msgstr "Общие" -#: src/slic3r/GUI/Preferences.cpp:121 +#: src/slic3r/GUI/Preferences.cpp:258 msgid "Remember output directory" msgstr "Запоминать папку сохранения" -#: src/slic3r/GUI/Preferences.cpp:123 +#: src/slic3r/GUI/Preferences.cpp:259 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." @@ -7560,22 +8976,22 @@ msgstr "" "Если включено, при сохранении G-кода PrusaSlicer откроет последний " "использованный выходной каталог вместо того, где лежит исходный файл." -#: src/slic3r/GUI/Preferences.cpp:129 +#: src/slic3r/GUI/Preferences.cpp:263 msgid "Auto-center parts" msgstr "Автоцентровка моделей" -#: src/slic3r/GUI/Preferences.cpp:131 +#: src/slic3r/GUI/Preferences.cpp:264 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." msgstr "" "Если включено, PrusaSlicer будет автоматически центрировать модели на столе." -#: src/slic3r/GUI/Preferences.cpp:137 +#: src/slic3r/GUI/Preferences.cpp:268 msgid "Background processing" msgstr "Фоновая обработка" -#: src/slic3r/GUI/Preferences.cpp:139 +#: src/slic3r/GUI/Preferences.cpp:269 msgid "" "If this is enabled, Slic3r will pre-process objects as soon as they're " "loaded in order to save time when exporting G-code." @@ -7583,11 +8999,23 @@ msgstr "" "Если включено, PrusaSlicer будет предварительно просчитывать модели при " "загрузке, чтобы сэкономить время при экспорте G-кода." -#: src/slic3r/GUI/Preferences.cpp:148 +#: src/slic3r/GUI/Preferences.cpp:274 +msgid "Alert when supports needed" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:275 +msgid "" +"If this is enabled, Slic3r will raise alerts when it detects issues in the " +"sliced object, that can be resolved with supports (and brim). Examples of " +"such issues are floating object parts, unsupported extrusions and low bed " +"adhesion." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:285 msgid "Export sources full pathnames to 3mf and amf" msgstr "При экспорте в 3mf, amf, сохранять полные пути к исходным файлам" -#: src/slic3r/GUI/Preferences.cpp:150 +#: src/slic3r/GUI/Preferences.cpp:286 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked." @@ -7595,19 +9023,19 @@ msgstr "" "Если включено, при выполнении команды «Перезагрузить с диска» программа " "будут автоматически находить и загружать файлы проекта." -#: src/slic3r/GUI/Preferences.cpp:159 +#: src/slic3r/GUI/Preferences.cpp:293 msgid "If enabled, sets PrusaSlicer as default application to open .3mf files." msgstr "" "Если включено, назначает PrusaSlicer в качестве приложения по умолчанию для " "открытия .3mf файлов." -#: src/slic3r/GUI/Preferences.cpp:166 +#: src/slic3r/GUI/Preferences.cpp:298 msgid "If enabled, sets PrusaSlicer as default application to open .stl files." msgstr "" "Если включено, назначает PrusaSlicer в качестве приложения по умолчанию для " "открытия .stl файлов." -#: src/slic3r/GUI/Preferences.cpp:177 +#: src/slic3r/GUI/Preferences.cpp:307 msgid "" "If enabled, Slic3r downloads updates of built-in system presets in the " "background. These updates are downloaded into a separate temporary location. " @@ -7619,11 +9047,11 @@ msgstr "" "временную папку. Когда новые профили становятся доступны, они предлагаются " "при запуске приложения." -#: src/slic3r/GUI/Preferences.cpp:182 +#: src/slic3r/GUI/Preferences.cpp:312 msgid "Suppress \" - default - \" presets" msgstr "Подавлять профили по умолчанию" -#: src/slic3r/GUI/Preferences.cpp:184 +#: src/slic3r/GUI/Preferences.cpp:313 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." @@ -7631,11 +9059,21 @@ msgstr "" "Подавлять профили по умолчанию во вкладках Настройки печати/Настройки прутка/" "Настройки принтера, при наличии других допустимых профилей." -#: src/slic3r/GUI/Preferences.cpp:190 +#: src/slic3r/GUI/Preferences.cpp:317 +msgid "Suppress \" Template \" filament presets" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:318 +msgid "" +"Suppress \" Template \" filament presets in configuration wizard and sidebar " +"visibility." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:322 msgid "Show incompatible print and filament presets" msgstr "Показывать несовместимые профили печати и прутка" -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:323 msgid "" "When checked, the print and filament presets are shown in the preset editor " "even if they are marked as incompatible with the active printer" @@ -7643,11 +9081,22 @@ msgstr "" "Если включено, то профили печати и прутка отображаются в редакторе профилей, " "даже если они помечены как несовместимые с активным принтером" -#: src/slic3r/GUI/Preferences.cpp:200 +#: src/slic3r/GUI/Preferences.cpp:331 +msgid "Show load project dialog" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:332 +msgid "" +"When checked, whenever dragging and dropping a project file on the " +"application or open it from a browser, shows a dialog asking to select the " +"action to take on the file to load." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:335 msgid "Show drop project dialog" msgstr "Диалоговое окно при перетаскивании файла-проекта" -#: src/slic3r/GUI/Preferences.cpp:202 +#: src/slic3r/GUI/Preferences.cpp:336 msgid "" "When checked, whenever dragging and dropping a project file on the " "application, shows a dialog asking to select the action to take on the file " @@ -7657,18 +9106,18 @@ msgstr "" "отображается диалоговое окно с просьбой выбрать действие, которое необходимо " "выполнить с файлом." -#: src/slic3r/GUI/Preferences.cpp:208 src/slic3r/GUI/Preferences.cpp:212 +#: src/slic3r/GUI/Preferences.cpp:342 src/slic3r/GUI/Preferences.cpp:346 msgid "Allow just a single PrusaSlicer instance" msgstr "Только одни экземпляр программы" -#: src/slic3r/GUI/Preferences.cpp:210 +#: src/slic3r/GUI/Preferences.cpp:343 msgid "" "On OSX there is always only one instance of app running by default. However " "it is allowed to run multiple instances of same app from the command line. " "In such case this settings will allow only one instance." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:214 +#: src/slic3r/GUI/Preferences.cpp:347 msgid "" "If this is enabled, when starting PrusaSlicer and another instance of the " "same PrusaSlicer is already running, that instance will be reactivated " @@ -7677,7 +9126,7 @@ msgstr "" "Если включено, разрешена работа только одного экземпляра той же самой версии " "программы." -#: src/slic3r/GUI/Preferences.cpp:224 +#: src/slic3r/GUI/Preferences.cpp:355 msgid "" "Always ask for unsaved changes in project, when: \n" "- Closing PrusaSlicer,\n" @@ -7687,8 +9136,8 @@ msgstr "" "- Закрытии PrusaSlicer\n" "- Загрузки или создании нового проекта" -#: src/slic3r/GUI/Preferences.cpp:233 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:897 +#: src/slic3r/GUI/Preferences.cpp:363 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:925 msgid "" "Ask to save unsaved changes in presets when closing the application or when " "loading a new project" @@ -7696,7 +9145,7 @@ msgstr "" "Спрашивать о несохранённых изменениях в профилях при закрытии приложения или " "загрузке нового проекта" -#: src/slic3r/GUI/Preferences.cpp:235 +#: src/slic3r/GUI/Preferences.cpp:364 msgid "" "Always ask for unsaved changes in presets, when: \n" "- Closing PrusaSlicer while some presets are modified,\n" @@ -7706,13 +9155,13 @@ msgstr "" "- Закрытии PrusaSlicer, при имеющихся изменениях в профилях\n" "- Загрузки нового проекта при существующих изменениях в профилях" -#: src/slic3r/GUI/Preferences.cpp:242 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:896 +#: src/slic3r/GUI/Preferences.cpp:370 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:924 msgid "Ask for unsaved changes in presets when selecting new preset" msgstr "" "Спрашивать о несохранённых изменениях в профилях при выборе нового профиля" -#: src/slic3r/GUI/Preferences.cpp:244 +#: src/slic3r/GUI/Preferences.cpp:371 msgid "" "Always ask for unsaved changes in presets when selecting new preset or " "resetting a preset" @@ -7720,23 +9169,23 @@ msgstr "" "Всегда спрашивать о несохранённых изменениях в профилях при выборе нового " "профиля или сбросе профиля." -#: src/slic3r/GUI/Preferences.cpp:249 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 +#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:923 msgid "Ask for unsaved changes in presets when creating new project" msgstr "" "Спрашивать о несохранённых изменениях в профилях при создании нового проекта" -#: src/slic3r/GUI/Preferences.cpp:251 +#: src/slic3r/GUI/Preferences.cpp:376 msgid "Always ask for unsaved changes in presets when creating new project" msgstr "" "Всегда спрашивать о несохранённых изменениях в профилях при создании нового " "проекта." -#: src/slic3r/GUI/Preferences.cpp:258 +#: src/slic3r/GUI/Preferences.cpp:382 msgid "Associate .gcode files to PrusaSlicer G-code Viewer" msgstr "Ассоциировать файлы .gcode с PrusaSlicer G-code Viewer" -#: src/slic3r/GUI/Preferences.cpp:260 +#: src/slic3r/GUI/Preferences.cpp:383 msgid "" "If enabled, sets PrusaSlicer G-code Viewer as default application to open ." "gcode files." @@ -7744,11 +9193,11 @@ msgstr "" "Если включено, назначает PrusaSlicer G-code Viewer в качестве приложения по " "умолчанию для открытия .gcode файлов." -#: src/slic3r/GUI/Preferences.cpp:268 +#: src/slic3r/GUI/Preferences.cpp:390 msgid "Use Retina resolution for the 3D scene" msgstr "Использовать разрешение дисплея Retina для окна 3D-вида" -#: src/slic3r/GUI/Preferences.cpp:270 +#: src/slic3r/GUI/Preferences.cpp:391 msgid "" "If enabled, the 3D scene will be rendered in Retina resolution. If you are " "experiencing 3D performance problems, disabling this option may help." @@ -7757,32 +9206,32 @@ msgstr "" "Если у вас возникают проблемы с производительностью 3D, отключение этой " "опции может помочь." -#: src/slic3r/GUI/Preferences.cpp:280 src/slic3r/GUI/Preferences.cpp:282 +#: src/slic3r/GUI/Preferences.cpp:400 src/slic3r/GUI/Preferences.cpp:401 msgid "Show splash screen" msgstr "Показывать заставку при запуске программы" -#: src/slic3r/GUI/Preferences.cpp:289 +#: src/slic3r/GUI/Preferences.cpp:406 msgid "If enabled, PrusaSlicer will be open at the position it was closed" msgstr "" "Если включено, окно приложения будет открыто в том положении, в котором было " "закрыто." -#: src/slic3r/GUI/Preferences.cpp:295 +#: src/slic3r/GUI/Preferences.cpp:411 msgid "Clear Undo / Redo stack on new project" msgstr "Очищать стек Отмены / Повтора при создании нового проекта" -#: src/slic3r/GUI/Preferences.cpp:297 +#: src/slic3r/GUI/Preferences.cpp:412 msgid "" "Clear Undo / Redo stack on new project or when an existing project is loaded." msgstr "" "Очищать стек Отмены / Повтора при создании нового проекта или при загрузке " "существующего проекта." -#: src/slic3r/GUI/Preferences.cpp:303 +#: src/slic3r/GUI/Preferences.cpp:417 msgid "Enable support for legacy 3DConnexion devices" msgstr "Включить поддержку устаревших устройств 3DConnexion" -#: src/slic3r/GUI/Preferences.cpp:305 +#: src/slic3r/GUI/Preferences.cpp:418 msgid "" "If enabled, the legacy 3DConnexion devices settings dialog is available by " "pressing CTRL+M" @@ -7790,63 +9239,58 @@ msgstr "" "Если включено, диалоговое окно настроек устаревших устройств 3DConnexion " "будет доступно при нажатии CTRL+M." -#: src/slic3r/GUI/Preferences.cpp:314 +#: src/slic3r/GUI/Preferences.cpp:425 msgid "Camera" msgstr "Камера" -#: src/slic3r/GUI/Preferences.cpp:319 +#: src/slic3r/GUI/Preferences.cpp:435 msgid "Use perspective camera" msgstr "Использовать вид в перспективе" -#: src/slic3r/GUI/Preferences.cpp:321 +#: src/slic3r/GUI/Preferences.cpp:436 msgid "" "If enabled, use perspective camera. If not enabled, use orthographic camera." msgstr "Если включено, используется вид в перспективе, иначе - ортогональный." -#: src/slic3r/GUI/Preferences.cpp:326 +#: src/slic3r/GUI/Preferences.cpp:440 msgid "Use free camera" msgstr "Использовать свободную камеру" -#: src/slic3r/GUI/Preferences.cpp:328 +#: src/slic3r/GUI/Preferences.cpp:441 msgid "If enabled, use free camera. If not enabled, use constrained camera." msgstr "" "Если включено, используется свободное вращение камеры. Если выключено, " "используется вращение камера с ограничениями." -#: src/slic3r/GUI/Preferences.cpp:333 +#: src/slic3r/GUI/Preferences.cpp:445 msgid "Reverse direction of zoom with mouse wheel" msgstr "Обратное направление масштабирования колесиком мыши" -#: src/slic3r/GUI/Preferences.cpp:335 +#: src/slic3r/GUI/Preferences.cpp:446 msgid "If enabled, reverses the direction of zoom with mouse wheel" msgstr "" "Если включено, меняется направление масштабирования с помощью колеса мыши." -#: src/slic3r/GUI/Preferences.cpp:343 +#: src/slic3r/GUI/Preferences.cpp:452 msgid "GUI" msgstr "Интерфейс программы" -#: src/slic3r/GUI/Preferences.cpp:366 +#: src/slic3r/GUI/Preferences.cpp:492 msgid "Sequential slider applied only to top layer" msgstr "Ползунок положения инструмента применяется только к верхнему слою" -#: src/slic3r/GUI/Preferences.cpp:368 +#: src/slic3r/GUI/Preferences.cpp:493 msgid "" "If enabled, changes made using the sequential slider, in preview, apply only " -"to gcode top layer. If disabled, changes made using the sequential slider, " -"in preview, apply to the whole gcode." +"to gcode top layer.If disabled, changes made using the sequential slider, in " +"preview, apply to the whole gcode." msgstr "" -"Если включено, изменения, сделанные с помощью ползунка положения " -"инструмента, в окне предпросмотра нарезки, применяются только к верхнему " -"слою G-коду. Если отключено, изменения, сделанные с помощью ползунка " -"положения инструмента, в окне предпросмотра нарезки, применяются ко всему G-" -"коду." -#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/Preferences.cpp:499 msgid "Show sidebar collapse/expand button" msgstr "Показать кнопку свертывания/раскрытия боковой панели" -#: src/slic3r/GUI/Preferences.cpp:377 +#: src/slic3r/GUI/Preferences.cpp:500 msgid "" "If enabled, the button for the collapse sidebar will be appeared in top " "right corner of the 3D Scene" @@ -7854,17 +9298,11 @@ msgstr "" "Если включено, в правом верхнем углу 3D-сцены появится кнопка свертывания " "боковой панели." -#: src/slic3r/GUI/Preferences.cpp:384 -msgid "If enabled, PrusaSlicer will not open hyperlinks in your browser." -msgstr "" -"Если включено, то работа гиперссылок описаний параметров во вкладках " -"настроек будет отключена." - -#: src/slic3r/GUI/Preferences.cpp:391 +#: src/slic3r/GUI/Preferences.cpp:511 msgid "Use colors for axes values in Manipulation panel" msgstr "Раскрашивать значения осей на панели манипуляций" -#: src/slic3r/GUI/Preferences.cpp:393 +#: src/slic3r/GUI/Preferences.cpp:512 msgid "" "If enabled, the axes names and axes values will be colorized according to " "the axes colors. If disabled, old UI will be used." @@ -7872,11 +9310,11 @@ msgstr "" "Если включено, имена осей и значения осей будут раскрашены в соответствии с " "цветами осей." -#: src/slic3r/GUI/Preferences.cpp:399 +#: src/slic3r/GUI/Preferences.cpp:517 msgid "Order object volumes by types" msgstr "Упорядочить объёмы моделей по типам" -#: src/slic3r/GUI/Preferences.cpp:401 +#: src/slic3r/GUI/Preferences.cpp:518 msgid "" "If enabled, volumes will be always ordered inside the object. Correct order " "is Model Part, Negative Volume, Modifier, Support Blocker and Support " @@ -7889,11 +9327,29 @@ msgstr "" "отключён, вы можете изменить порядок частей модели, объёма для исключения и " "модификаторов. Но одна из частей модели должна быть на первом месте." -#: src/slic3r/GUI/Preferences.cpp:408 +#: src/slic3r/GUI/Preferences.cpp:523 +msgid "Show non-manifold edges" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:524 +msgid "If enabled, shows non-manifold edges." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:528 +msgid "Allow automatically color change" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:529 +msgid "" +"If enabled, related notification will be shown, when sliced object looks " +"like a logo or a sign." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:534 msgid "Set settings tabs as menu items (experimental)" msgstr "Установить вкладки настроек как пункты меню (экспериментально)" -#: src/slic3r/GUI/Preferences.cpp:410 +#: src/slic3r/GUI/Preferences.cpp:535 msgid "" "If enabled, Settings Tabs will be placed as menu items. If disabled, old UI " "will be used." @@ -7901,21 +9357,21 @@ msgstr "" "Если включено, вкладки настроек будут размещены как пункты меню. Если " "отключено, будет использоваться старый интерфейс." -#: src/slic3r/GUI/Preferences.cpp:419 +#: src/slic3r/GUI/Preferences.cpp:542 msgid "Show \"Tip of the day\" notification after start" msgstr "Показывать уведомление с полезным советом при запуске приложения" -#: src/slic3r/GUI/Preferences.cpp:421 +#: src/slic3r/GUI/Preferences.cpp:543 msgid "If enabled, useful hints are displayed at startup." msgstr "" "Если включено, будут показываться уведомления с полезном советом при запуске " "приложения." -#: src/slic3r/GUI/Preferences.cpp:427 +#: src/slic3r/GUI/Preferences.cpp:547 msgid "Notify about new releases" msgstr "Уведомлять о новых версиях программы" -#: src/slic3r/GUI/Preferences.cpp:429 +#: src/slic3r/GUI/Preferences.cpp:548 msgid "" "You will be notified about new release after startup acordingly: All = " "Regular release and alpha / beta releases. Release only = regular release." @@ -7924,67 +9380,79 @@ msgstr "" "программы. Выберите, Все = последняя релизная версия и альфа/бета версия " "программы или только последний релиз." -#: src/slic3r/GUI/Preferences.cpp:435 +#: src/slic3r/GUI/Preferences.cpp:551 msgid "Release only" msgstr "Только последний релиз" -#: src/slic3r/GUI/Preferences.cpp:444 +#: src/slic3r/GUI/Preferences.cpp:558 msgid "Use custom size for toolbar icons" msgstr "Использовать нестандартный размер значков панели инструментов" -#: src/slic3r/GUI/Preferences.cpp:446 +#: src/slic3r/GUI/Preferences.cpp:559 msgid "If enabled, you can change size of toolbar icons manually." msgstr "" "Если включено, вы можете изменить размер значков панели инструментов вручную." -#: src/slic3r/GUI/Preferences.cpp:471 +#: src/slic3r/GUI/Preferences.cpp:577 src/slic3r/GUI/Tab.cpp:1659 +msgid "Other" +msgstr "Прочее" + +#: src/slic3r/GUI/Preferences.cpp:594 +msgid "If enabled, PrusaSlicer will not open a hyperlinks in your browser." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:600 +msgid "Allow downloads from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:601 +msgid "If enabled, PrusaSlicer will be allowed to download from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:610 msgid "Render" msgstr "Визуализация" -#: src/slic3r/GUI/Preferences.cpp:476 +#: src/slic3r/GUI/Preferences.cpp:620 msgid "Use environment map" msgstr "Использовать карты окружения" -#: src/slic3r/GUI/Preferences.cpp:478 +#: src/slic3r/GUI/Preferences.cpp:621 msgid "If enabled, renders object using the environment map." msgstr "" "Если включено, визуализация моделей выполняется с помощью карты окружения." -#: src/slic3r/GUI/Preferences.cpp:491 +#: src/slic3r/GUI/Preferences.cpp:629 msgid "Dark mode (experimental)" msgstr "Тёмная тема (экспериментально)" -#: src/slic3r/GUI/Preferences.cpp:496 +#: src/slic3r/GUI/Preferences.cpp:639 msgid "Enable dark mode" msgstr "Включить тёмную тему" -#: src/slic3r/GUI/Preferences.cpp:498 +#: src/slic3r/GUI/Preferences.cpp:640 msgid "" "If enabled, UI will use Dark mode colors. If disabled, old UI will be used." msgstr "" "Если включено, используется тёмная тема интерфейса программы. Если отключено " "- обычная стандартная тема интерфейса." -#: src/slic3r/GUI/Preferences.cpp:507 +#: src/slic3r/GUI/Preferences.cpp:647 msgid "Use system menu for application" msgstr "Меню приложения в стиле стандартного системного меню Windows" -#: src/slic3r/GUI/Preferences.cpp:509 +#: src/slic3r/GUI/Preferences.cpp:648 msgid "" "If enabled, application will use the standard Windows system menu,\n" -"but on some combination of display scales it can looks ugly. If disabled, " -"old UI will be used." +"but on some combination od display scales it can look ugly. If disabled, old " +"UI will be used." msgstr "" -"Если включено, меню приложения будет использовать стиль стандартного " -"системного меню Windows. Но при некоторых комбинациях масштабов отображения, " -"а также с тёмной темой это может выглядеть некрасиво. Если отключено, будет " -"использоваться старый стиль пользовательского интерфейса." -#: src/slic3r/GUI/Preferences.cpp:578 +#: src/slic3r/GUI/Preferences.cpp:726 msgid "Changes for the critical options" msgstr "Изменения важных настроек" -#: src/slic3r/GUI/Preferences.cpp:580 +#: src/slic3r/GUI/Preferences.cpp:728 msgid "" "Changing some options will trigger application restart.\n" "You will lose the content of the plater." @@ -7992,109 +9460,122 @@ msgstr "" "Изменение некоторых настроек приведёт к перезапуску приложения.\n" "Содержимое печатного стола будет утеряно." -#: src/slic3r/GUI/Preferences.cpp:694 +#: src/slic3r/GUI/Preferences.cpp:921 msgid "Icon size in a respect to the default size" msgstr "Размер значка относительно размера по умолчанию" -#: src/slic3r/GUI/Preferences.cpp:709 +#: src/slic3r/GUI/Preferences.cpp:936 msgid "Select toolbar icon size in respect to the default one." msgstr "" "Выбор размера значка панели инструментов по отношению к значению по " "умолчанию." -#: src/slic3r/GUI/Preferences.cpp:743 src/slic3r/GUI/Preferences.cpp:754 +#: src/slic3r/GUI/Preferences.cpp:972 +msgid "Layout Options" +msgstr "Настройка внешнего вида" + +#: src/slic3r/GUI/Preferences.cpp:981 msgid "Old regular layout with the tab bar" msgstr "Старая обычная компоновка с вкладками на столе" -#: src/slic3r/GUI/Preferences.cpp:744 +#: src/slic3r/GUI/Preferences.cpp:982 msgid "New layout, access via settings button in the top menu" msgstr "Новая компоновка с кнопкой настроек в верхнем меню" -#: src/slic3r/GUI/Preferences.cpp:745 src/slic3r/GUI/Preferences.cpp:755 +#: src/slic3r/GUI/Preferences.cpp:983 msgid "Settings in non-modal window" -msgstr "Настройки будут отображаться в отдельном окне" - -#: src/slic3r/GUI/Preferences.cpp:763 -msgid "Layout Options" -msgstr "Настройка внешнего вида" +msgstr "Настройки будут отображаться в отдельном окне" -#: src/slic3r/GUI/Preferences.cpp:806 +#: src/slic3r/GUI/Preferences.cpp:1025 msgid "Text colors" msgstr "Цвета текста" -#: src/slic3r/GUI/PresetComboBoxes.cpp:249 -#: src/slic3r/GUI/PresetComboBoxes.cpp:287 -#: src/slic3r/GUI/PresetComboBoxes.cpp:794 -#: src/slic3r/GUI/PresetComboBoxes.cpp:849 -#: src/slic3r/GUI/PresetComboBoxes.cpp:989 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1033 +#: src/slic3r/GUI/Preferences.cpp:1049 +msgid "Mode markers" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:254 +#: src/slic3r/GUI/PresetComboBoxes.cpp:306 +#: src/slic3r/GUI/PresetComboBoxes.cpp:846 +#: src/slic3r/GUI/PresetComboBoxes.cpp:909 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1073 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1125 msgid "System presets" msgstr "Системные профили" -#: src/slic3r/GUI/PresetComboBoxes.cpp:291 -#: src/slic3r/GUI/PresetComboBoxes.cpp:853 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1037 +#: src/slic3r/GUI/PresetComboBoxes.cpp:310 +#: src/slic3r/GUI/PresetComboBoxes.cpp:915 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1130 msgid "User presets" msgstr "Пользовательские профили" -#: src/slic3r/GUI/PresetComboBoxes.cpp:302 +#: src/slic3r/GUI/PresetComboBoxes.cpp:321 msgid "Incompatible presets" msgstr "Несовместимые профили" -#: src/slic3r/GUI/PresetComboBoxes.cpp:337 +#: src/slic3r/GUI/PresetComboBoxes.cpp:364 #, boost-format msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "Вы уверены, что хотите удалить принтер \"%1%\"?" -#: src/slic3r/GUI/PresetComboBoxes.cpp:340 +#: src/slic3r/GUI/PresetComboBoxes.cpp:366 msgid "Delete Physical Printer" msgstr "Удалить физический принтер" -#: src/slic3r/GUI/PresetComboBoxes.cpp:581 +#: src/slic3r/GUI/PresetComboBoxes.cpp:612 msgid "Click to edit preset" msgstr "Нажмите, чтобы изменить профиль" -#: src/slic3r/GUI/PresetComboBoxes.cpp:697 -#: src/slic3r/GUI/PresetComboBoxes.cpp:737 +#: src/slic3r/GUI/PresetComboBoxes.cpp:740 +#: src/slic3r/GUI/PresetComboBoxes.cpp:788 msgid "Add/Remove presets" msgstr "Добавить/удалить профиль" -#: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:745 +#: src/slic3r/GUI/PresetComboBoxes.cpp:793 src/slic3r/GUI/Tab.cpp:3312 msgid "Add physical printer" msgstr "Добавить физический профиль" -#: src/slic3r/GUI/PresetComboBoxes.cpp:716 +#: src/slic3r/GUI/PresetComboBoxes.cpp:759 msgid "Edit preset" msgstr "Изменить профиль" -#: src/slic3r/GUI/PresetComboBoxes.cpp:722 +#: src/slic3r/GUI/PresetComboBoxes.cpp:765 msgid "Change extruder color" msgstr "Изменить цвет экструдера" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:773 src/slic3r/GUI/Tab.cpp:3312 msgid "Edit physical printer" msgstr "Изменить физический профиль" -#: src/slic3r/GUI/PresetComboBoxes.cpp:733 +#: src/slic3r/GUI/PresetComboBoxes.cpp:779 +msgid "Open physical printer URL" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:784 msgid "Delete physical printer" msgstr "Удалить физический принтер" -#: src/slic3r/GUI/PresetComboBoxes.cpp:864 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1051 +#: src/slic3r/GUI/PresetComboBoxes.cpp:924 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1142 +msgid "Template presets" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:935 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1156 msgid "Physical printers" msgstr "Физические принтеры" -#: src/slic3r/GUI/PresetComboBoxes.cpp:888 +#: src/slic3r/GUI/PresetComboBoxes.cpp:959 msgid "Add/Remove filaments" msgstr "Добавить/удалить пруток" -#: src/slic3r/GUI/PresetComboBoxes.cpp:890 +#: src/slic3r/GUI/PresetComboBoxes.cpp:961 msgid "Add/Remove materials" msgstr "Добавить/удалить материал" -#: src/slic3r/GUI/PresetComboBoxes.cpp:892 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1075 +#: src/slic3r/GUI/PresetComboBoxes.cpp:963 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1180 msgid "Add/Remove printers" msgstr "Добавить/удалить принтер" @@ -8285,100 +9766,108 @@ msgstr "Минимальная толщина оболочки снизу сос msgid "Bottom is open." msgstr "Оболочки снизу (дно) отсутствуют." -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Send G-Code to printer host" msgstr "Отправить G-кода на хост принтера" -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Upload to Printer Host with the following filename:" msgstr "Загрузить на хост принтера со следующим именем:" -#: src/slic3r/GUI/PrintHostDialogs.cpp:51 +#: src/slic3r/GUI/PrintHostDialogs.cpp:55 msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "" "При необходимости используйте косую черту ( / ) в качестве разделителя " "каталогов." -#: src/slic3r/GUI/PrintHostDialogs.cpp:60 +#: src/slic3r/GUI/PrintHostDialogs.cpp:64 msgid "Group" msgstr "Группа" -#: src/slic3r/GUI/PrintHostDialogs.cpp:84 +#: src/slic3r/GUI/PrintHostDialogs.cpp:74 +msgid "Upload to storage:" +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:83 +msgid "Upload to storage: " +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:105 #, c-format, boost-format msgid "Upload filename doesn't end with \"%s\". Do you wish to continue?" msgstr "Имя загружаемого файла не заканчивается на \"%s\". Хотите продолжить?" -#: src/slic3r/GUI/PrintHostDialogs.cpp:91 +#: src/slic3r/GUI/PrintHostDialogs.cpp:112 msgid "Upload" msgstr "Загрузить" -#: src/slic3r/GUI/PrintHostDialogs.cpp:101 -msgid "Upload and Print" -msgstr "Загрузить и напечатать" +#: src/slic3r/GUI/PrintHostDialogs.cpp:122 +msgid "Upload to Queue" +msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:112 +#: src/slic3r/GUI/PrintHostDialogs.cpp:143 msgid "Upload and Simulate" msgstr "Загрузить и сэмулировать" -#: src/slic3r/GUI/PrintHostDialogs.cpp:247 +#: src/slic3r/GUI/PrintHostDialogs.cpp:298 msgid "ID" msgstr "ID" -#: src/slic3r/GUI/PrintHostDialogs.cpp:248 +#: src/slic3r/GUI/PrintHostDialogs.cpp:299 msgid "Progress" msgstr "Прогресс" -#: src/slic3r/GUI/PrintHostDialogs.cpp:249 +#: src/slic3r/GUI/PrintHostDialogs.cpp:300 msgid "Status" msgstr "Статус" -#: src/slic3r/GUI/PrintHostDialogs.cpp:250 +#: src/slic3r/GUI/PrintHostDialogs.cpp:301 msgid "Host" msgstr "Хост" -#: src/slic3r/GUI/PrintHostDialogs.cpp:251 +#: src/slic3r/GUI/PrintHostDialogs.cpp:302 msgctxt "OfFile" msgid "Size" msgstr "Размер" -#: src/slic3r/GUI/PrintHostDialogs.cpp:252 +#: src/slic3r/GUI/PrintHostDialogs.cpp:303 msgid "Filename" msgstr "Имя файла" -#: src/slic3r/GUI/PrintHostDialogs.cpp:253 -msgid "Error Message" -msgstr "Сообщение об ошибке" +#: src/slic3r/GUI/PrintHostDialogs.cpp:304 +msgid "Message" +msgstr "Сообщение" -#: src/slic3r/GUI/PrintHostDialogs.cpp:256 +#: src/slic3r/GUI/PrintHostDialogs.cpp:308 msgid "Cancel selected" msgstr "Отменить выбранное" -#: src/slic3r/GUI/PrintHostDialogs.cpp:258 +#: src/slic3r/GUI/PrintHostDialogs.cpp:310 msgid "Show error message" msgstr "Показать сообщение об ошибке" -#: src/slic3r/GUI/PrintHostDialogs.cpp:316 -#: src/slic3r/GUI/PrintHostDialogs.cpp:371 +#: src/slic3r/GUI/PrintHostDialogs.cpp:368 +#: src/slic3r/GUI/PrintHostDialogs.cpp:423 msgid "Enqueued" msgstr "Поставлено в очередь" -#: src/slic3r/GUI/PrintHostDialogs.cpp:372 +#: src/slic3r/GUI/PrintHostDialogs.cpp:424 msgid "Uploading" msgstr "Отправка" -#: src/slic3r/GUI/PrintHostDialogs.cpp:374 +#: src/slic3r/GUI/PrintHostDialogs.cpp:426 msgid "Cancelling" msgstr "Отмена" -#: src/slic3r/GUI/PrintHostDialogs.cpp:375 +#: src/slic3r/GUI/PrintHostDialogs.cpp:427 msgid "Cancelled" msgstr "Отменено" -#: src/slic3r/GUI/PrintHostDialogs.cpp:376 +#: src/slic3r/GUI/PrintHostDialogs.cpp:428 msgid "Completed" msgstr "Завершено" -#: src/slic3r/GUI/PrintHostDialogs.cpp:424 +#: src/slic3r/GUI/PrintHostDialogs.cpp:476 msgid "Error uploading to print host:" msgstr "Ошибка при отправке на хост печати:" @@ -8386,13 +9875,13 @@ msgstr "Ошибка при отправке на хост печати:" msgid "NO RAMMING AT ALL" msgstr "НЕ ДОПУСКАТЬ РЭММИНГ" -#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 -#: src/libslic3r/PrintConfig.cpp:955 src/libslic3r/PrintConfig.cpp:999 -#: src/libslic3r/PrintConfig.cpp:1014 src/libslic3r/PrintConfig.cpp:3297 -#: src/libslic3r/PrintConfig.cpp:3306 src/libslic3r/PrintConfig.cpp:3315 -#: src/libslic3r/PrintConfig.cpp:3456 src/libslic3r/PrintConfig.cpp:3464 -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3479 -#: src/libslic3r/PrintConfig.cpp:3487 src/libslic3r/PrintConfig.cpp:3495 +#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/libslic3r/PrintConfig.cpp:1044 src/libslic3r/PrintConfig.cpp:1088 +#: src/libslic3r/PrintConfig.cpp:1103 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3578 src/libslic3r/PrintConfig.cpp:3587 +#: src/libslic3r/PrintConfig.cpp:3733 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3749 src/libslic3r/PrintConfig.cpp:3756 +#: src/libslic3r/PrintConfig.cpp:3764 src/libslic3r/PrintConfig.cpp:3772 msgid "s" msgstr "с" @@ -8400,43 +9889,64 @@ msgstr "с" msgid "Volumetric speed" msgstr "Объёмная скорость подачи" -#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:912 -#: src/libslic3r/PrintConfig.cpp:1824 +#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:1001 +#: src/libslic3r/PrintConfig.cpp:1861 msgid "mm³/s" msgstr "мм³/с" -#: src/slic3r/GUI/SavePresetDialog.cpp:57 +#: src/slic3r/GUI/SavePresetDialog.cpp:90 +#, c-format, boost-format +msgid "Rename %s to:" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:90 #, c-format, boost-format msgid "Save %s as:" msgstr "Сохранить %s как:" -#: src/slic3r/GUI/SavePresetDialog.cpp:101 -#: src/slic3r/GUI/SavePresetDialog.cpp:109 +#: src/slic3r/GUI/SavePresetDialog.cpp:165 +#: src/slic3r/GUI/SavePresetDialog.cpp:173 msgid "The supplied name is not valid;" msgstr "Заданное имя недопустимо;" -#: src/slic3r/GUI/SavePresetDialog.cpp:110 +#: src/slic3r/GUI/SavePresetDialog.cpp:174 msgid "the following suffix is not allowed:" msgstr "следующий суффикс не разрешается:" -#: src/slic3r/GUI/SavePresetDialog.cpp:116 +#: src/slic3r/GUI/SavePresetDialog.cpp:180 msgid "The supplied name is not available." msgstr "Введённое имя недоступно." -#: src/slic3r/GUI/SavePresetDialog.cpp:122 +#: src/slic3r/GUI/SavePresetDialog.cpp:186 +msgid "The supplied name is used for a system profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:187 msgid "Cannot overwrite a system profile." msgstr "Невозможно перезаписать системный профиль." -#: src/slic3r/GUI/SavePresetDialog.cpp:127 +#: src/slic3r/GUI/SavePresetDialog.cpp:192 +msgid "The supplied name is used for a external profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:193 msgid "Cannot overwrite an external profile." msgstr "Невозможно перезаписать внешний профиль." -#: src/slic3r/GUI/SavePresetDialog.cpp:134 +#: src/slic3r/GUI/SavePresetDialog.cpp:203 +msgid "Save preset modifications to existing user profile" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:205 +msgid "Nothing changed" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:210 #, boost-format msgid "Preset with name \"%1%\" already exists." msgstr "Профиль с именем \"%1%\" уже существует." -#: src/slic3r/GUI/SavePresetDialog.cpp:136 +#: src/slic3r/GUI/SavePresetDialog.cpp:212 #, boost-format msgid "" "Preset with name \"%1%\" already exists and is incompatible with selected " @@ -8444,37 +9954,52 @@ msgid "" msgstr "" "Профиль с именем \"%1%\" уже существует и несовместим с выбранным принтером." -#: src/slic3r/GUI/SavePresetDialog.cpp:137 +#: src/slic3r/GUI/SavePresetDialog.cpp:213 msgid "Note: This preset will be replaced after saving" msgstr "Примечание: этот профиль будет заменён после сохранения" -#: src/slic3r/GUI/SavePresetDialog.cpp:142 +#: src/slic3r/GUI/SavePresetDialog.cpp:219 msgid "The name cannot be empty." msgstr "Данное имя не может быть пустым." -#: src/slic3r/GUI/SavePresetDialog.cpp:147 +#: src/slic3r/GUI/SavePresetDialog.cpp:230 +msgid "The name is too long." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:235 msgid "The name cannot start with space character." msgstr "Имя не должно начитаться с пробела." -#: src/slic3r/GUI/SavePresetDialog.cpp:152 +#: src/slic3r/GUI/SavePresetDialog.cpp:240 msgid "The name cannot end with space character." msgstr "Имя не должно заканчиваться пробелом." -#: src/slic3r/GUI/SavePresetDialog.cpp:157 +#: src/slic3r/GUI/SavePresetDialog.cpp:245 msgid "The name cannot be the same as a preset alias name." msgstr "Имя не должно совпадать с именем предустановленного профиля." -#: src/slic3r/GUI/SavePresetDialog.cpp:191 -#: src/slic3r/GUI/SavePresetDialog.cpp:197 +#: src/slic3r/GUI/SavePresetDialog.cpp:289 msgid "Save preset" msgstr "Сохранение профиля" -#: src/slic3r/GUI/SavePresetDialog.cpp:221 +#: src/slic3r/GUI/SavePresetDialog.cpp:295 +msgid "Save presets" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:302 +msgid "Rename preset" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:327 msgctxt "PresetName" msgid "Copy" msgstr "Копия" -#: src/slic3r/GUI/SavePresetDialog.cpp:283 +#: src/slic3r/GUI/SavePresetDialog.cpp:347 +msgid "Save as profile derived from current printer only." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:407 #, boost-format msgid "" "You have selected physical printer \"%1%\" \n" @@ -8483,84 +10008,96 @@ msgstr "" "Выбран физический принтер \"%1%\" со \n" "связанным профилем принтера \"%2%\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:322 +#: src/slic3r/GUI/SavePresetDialog.cpp:446 #, boost-format msgid "What would you like to do with \"%1%\" preset after saving?" msgstr "Что вы хотите сделать с профилем \"%1%\" после сохранения?" -#: src/slic3r/GUI/SavePresetDialog.cpp:325 +#: src/slic3r/GUI/SavePresetDialog.cpp:449 #, boost-format msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" msgstr "Сменить \"%1%\" на \"%2%\" для этого физического принтера \"%3%\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:326 +#: src/slic3r/GUI/SavePresetDialog.cpp:450 #, boost-format msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" msgstr "" "Добавить \"%1%\" в качестве следующего профиля для физического принтера \"%2%" "\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:327 +#: src/slic3r/GUI/SavePresetDialog.cpp:451 #, boost-format msgid "Just switch to \"%1%\" preset" msgstr "Просто переключиться на профиль \"%1%\"" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2652 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2645 msgid "Stealth" msgstr "Тихий режим" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2646 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2639 msgid "Normal" msgstr "Нормальный режим" -#: src/slic3r/GUI/Selection.cpp:168 +#: src/slic3r/GUI/Selection.cpp:180 msgid "Selection-Add" msgstr "Выбор\\Добавление" -#: src/slic3r/GUI/Selection.cpp:209 +#: src/slic3r/GUI/Selection.cpp:221 msgid "Selection-Remove" msgstr "Выбор\\Удаление" -#: src/slic3r/GUI/Selection.cpp:241 +#: src/slic3r/GUI/Selection.cpp:253 msgid "Selection-Add Object" msgstr "Выбор\\Добавление модели" -#: src/slic3r/GUI/Selection.cpp:260 +#: src/slic3r/GUI/Selection.cpp:272 msgid "Selection-Remove Object" msgstr "Выбор\\Удаление модели" -#: src/slic3r/GUI/Selection.cpp:278 +#: src/slic3r/GUI/Selection.cpp:290 msgid "Selection-Add Instance" msgstr "Выбор\\Добавление копии" -#: src/slic3r/GUI/Selection.cpp:297 +#: src/slic3r/GUI/Selection.cpp:309 msgid "Selection-Remove Instance" msgstr "Выбор\\Удаление копии" -#: src/slic3r/GUI/Selection.cpp:394 +#: src/slic3r/GUI/Selection.cpp:406 msgid "Selection-Add All" msgstr "Выбор\\Добавление всего" -#: src/slic3r/GUI/Selection.cpp:419 +#: src/slic3r/GUI/Selection.cpp:431 msgid "Selection-Remove All" msgstr "Выбор\\Удаление всего" -#: src/slic3r/GUI/Selection.cpp:950 +#: src/slic3r/GUI/Selection.cpp:1309 msgid "Scale To Fit" msgstr "Отмасштабировать под область печати" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:114 +#: src/slic3r/GUI/Selection.cpp:1691 +msgid "" +"The currently manipulated object is tilted or contains tilted parts " +"(rotation angles are not multiples of 90°). Non-uniform scaling of tilted " +"objects is only possible in non-local coordinate systems, once the rotation " +"is embedded into the object coordinates." +msgstr "" + +#: src/slic3r/GUI/Selection.cpp:1694 +msgid "This operation is irreversible." +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:117 msgid "Data to send" msgstr "Отправляемые данные" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:550 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:618 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:557 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:624 msgid "Send system info" msgstr "Отправить информацию о системе" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:581 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:587 #, boost-format msgid "" "This is the first time you are running %1%. We would like to ask you to send " @@ -8572,7 +10109,7 @@ msgstr "" "информацию о вашей системе. Это произойдет только один раз, и мы не будем " "просить вас делать это снова (только после обновления до следующей версии)." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:585 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:591 msgid "" "If we know your hardware, operating system, etc., it will greatly help us in " "development and prioritization, because we will be able to focus our effort " @@ -8583,11 +10120,11 @@ msgstr "" "эффективно сфокусировать наши усилия и время на функции, которые нужны " "больше всего." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:588 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:594 msgid "Is it safe?" msgstr "Это безопасно?" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:590 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:596 #, boost-format msgid "" "We do not send any personal information nor anything that would allow us to " @@ -8605,81 +10142,86 @@ msgstr "" "PrusaSlicer имеет открытый исходный код, если вы хотите проверить код, " "отвечающий за обмен данными, смотрите %1%." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:614 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:620 msgid "Show verbatim data that will be sent" msgstr "Показать данные, которые будут отправлены" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:616 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:622 msgid "Ask me next time" msgstr "Спросить в следующий раз" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:617 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:623 msgid "Do not send anything" msgstr "Ничего не отправлять" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:703 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:709 msgid "System info sent successfully. Thank you." msgstr "Информация о системе успешно отправлена. Спасибо." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:706 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:712 msgid "Sending system info failed!" msgstr "Не удалось отправить информацию о системе!" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:713 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:719 msgid "Sending system info was cancelled." msgstr "Отправка информации о системе отменена." -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:720 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:726 msgid "Sending system info..." msgstr "Отправка информации о системе..." -#: src/slic3r/GUI/SysInfoDialog.cpp:84 +#: src/slic3r/GUI/SysInfoDialog.cpp:92 msgid "System Information" msgstr "Системная информация" -#: src/slic3r/GUI/SysInfoDialog.cpp:150 +#: src/slic3r/GUI/SysInfoDialog.cpp:160 msgid "Blacklisted libraries loaded into PrusaSlicer process:" msgstr "Библиотеки из черного списка загружены в процесс PrusaSlicer:" -#: src/slic3r/GUI/SysInfoDialog.cpp:162 +#: src/slic3r/GUI/SysInfoDialog.cpp:172 msgid "Eigen vectorization supported:" msgstr "Внутренняя векторизация поддерживается:" -#: src/slic3r/GUI/SysInfoDialog.cpp:169 +#: src/slic3r/GUI/SysInfoDialog.cpp:179 msgid "Copy to Clipboard" msgstr "Скопировать в буфер обмена" -#: src/slic3r/GUI/Tab.cpp:114 src/libslic3r/PrintConfig.cpp:565 +#: src/slic3r/GUI/Tab.cpp:68 src/libslic3r/PrintConfig.cpp:668 msgid "Compatible printers" msgstr "Совместимые принтеры" -#: src/slic3r/GUI/Tab.cpp:115 +#: src/slic3r/GUI/Tab.cpp:69 msgid "Select the printers this profile is compatible with." msgstr "Выберите принтеры, совместимые с данным профилем." -#: src/slic3r/GUI/Tab.cpp:120 src/libslic3r/PrintConfig.cpp:580 +#: src/slic3r/GUI/Tab.cpp:74 src/libslic3r/PrintConfig.cpp:683 msgid "Compatible print profiles" msgstr "Совместимые профили печати" -#: src/slic3r/GUI/Tab.cpp:121 +#: src/slic3r/GUI/Tab.cpp:75 msgid "Select the print profiles this profile is compatible with." msgstr "Выберите профили печати, с которыми этот профиль совместим." -#: src/slic3r/GUI/Tab.cpp:216 +#: src/slic3r/GUI/Tab.cpp:165 msgid "Compare this preset with some another" msgstr "Сравнить этот профиль с другим" #. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:218 +#: src/slic3r/GUI/Tab.cpp:167 #, c-format, boost-format msgid "Save current %s" msgstr "Сохранить текущие %s" -#: src/slic3r/GUI/Tab.cpp:219 +#: src/slic3r/GUI/Tab.cpp:168 +#, c-format, boost-format +msgid "Rename current %s" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:170 msgid "Delete this preset" msgstr "Удалить этот профиль" -#: src/slic3r/GUI/Tab.cpp:223 +#: src/slic3r/GUI/Tab.cpp:174 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." @@ -8687,16 +10229,16 @@ msgstr "" "Наведите курсор на кнопки для получения дополнительной информации или " "нажмите эту кнопку." -#: src/slic3r/GUI/Tab.cpp:227 +#: src/slic3r/GUI/Tab.cpp:178 #, boost-format msgid "Search in settings [%1%]" msgstr "Поиск в настройках [%1%]" -#: src/slic3r/GUI/Tab.cpp:1298 +#: src/slic3r/GUI/Tab.cpp:1243 msgid "Detach from system preset" msgstr "Отсоединить от системного профиля" -#: src/slic3r/GUI/Tab.cpp:1311 +#: src/slic3r/GUI/Tab.cpp:1256 msgid "" "A copy of the current system preset will be created, which will be detached " "from the system preset." @@ -8704,226 +10246,234 @@ msgstr "" "Будет создана копия текущего системного профиля, который будет отсоединён от " "системного профиля." -#: src/slic3r/GUI/Tab.cpp:1312 +#: src/slic3r/GUI/Tab.cpp:1257 msgid "" "The current custom preset will be detached from the parent system preset." msgstr "" "Текущий пользовательский профиль будет отсоединён от родительского " "системного профиля." -#: src/slic3r/GUI/Tab.cpp:1315 +#: src/slic3r/GUI/Tab.cpp:1260 msgid "Modifications to the current profile will be saved." msgstr "Изменения будут сохранены в текущем профиле." -#: src/slic3r/GUI/Tab.cpp:1321 +#: src/slic3r/GUI/Tab.cpp:1266 msgid "Detach preset" msgstr "Отсоединить профиль" -#: src/slic3r/GUI/Tab.cpp:1347 +#: src/slic3r/GUI/Tab.cpp:1292 msgid "This is a default preset." msgstr "Это профиль по умолчанию." -#: src/slic3r/GUI/Tab.cpp:1349 +#: src/slic3r/GUI/Tab.cpp:1294 msgid "This is a system preset." msgstr "Это системный профиль." -#: src/slic3r/GUI/Tab.cpp:1351 +#: src/slic3r/GUI/Tab.cpp:1296 msgid "Current preset is inherited from the default preset." msgstr "Текущий профиль наследуется от профиля по умолчанию." -#: src/slic3r/GUI/Tab.cpp:1355 +#: src/slic3r/GUI/Tab.cpp:1300 msgid "Current preset is inherited from" msgstr "Текущий профиль наследуется от" -#: src/slic3r/GUI/Tab.cpp:1359 +#: src/slic3r/GUI/Tab.cpp:1304 msgid "It can't be deleted or modified." msgstr "Его нельзя удалить или изменить." -#: src/slic3r/GUI/Tab.cpp:1360 +#: src/slic3r/GUI/Tab.cpp:1305 msgid "" "Any modifications should be saved as a new preset inherited from this one." msgstr "" "Любые изменения должны быть сохранены как новый профиль, унаследованный от " "текущего." -#: src/slic3r/GUI/Tab.cpp:1361 +#: src/slic3r/GUI/Tab.cpp:1306 msgid "To do that please specify a new name for the preset." msgstr "Для этого укажите новое имя для профиля." -#: src/slic3r/GUI/Tab.cpp:1365 +#: src/slic3r/GUI/Tab.cpp:1310 msgid "Additional information:" msgstr "Дополнительная информация:" -#: src/slic3r/GUI/Tab.cpp:1371 +#: src/slic3r/GUI/Tab.cpp:1316 msgid "printer model" msgstr "модель принтера" -#: src/slic3r/GUI/Tab.cpp:1379 +#: src/slic3r/GUI/Tab.cpp:1324 msgid "default print profile" msgstr "профиль печати по умолчанию" -#: src/slic3r/GUI/Tab.cpp:1382 +#: src/slic3r/GUI/Tab.cpp:1327 msgid "default filament profile" msgstr "профиль прутка по умолчанию" -#: src/slic3r/GUI/Tab.cpp:1396 +#: src/slic3r/GUI/Tab.cpp:1341 msgid "default SLA material profile" msgstr "профиль SLA материала по умолчанию" -#: src/slic3r/GUI/Tab.cpp:1400 +#: src/slic3r/GUI/Tab.cpp:1345 msgid "default SLA print profile" msgstr "профиль SLA печати по умолчанию" -#: src/slic3r/GUI/Tab.cpp:1408 +#: src/slic3r/GUI/Tab.cpp:1353 msgid "full profile name" msgstr "полное имя профиля" -#: src/slic3r/GUI/Tab.cpp:1409 +#: src/slic3r/GUI/Tab.cpp:1354 msgid "symbolic profile name" msgstr "символическое имя профиля" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4657 +#: src/slic3r/GUI/Tab.cpp:1392 src/slic3r/GUI/Tab.cpp:4940 msgid "Layers and perimeters" msgstr "Слои и периметры" -#: src/slic3r/GUI/Tab.cpp:1453 +#: src/slic3r/GUI/Tab.cpp:1398 msgid "Vertical shells" msgstr "Вертикальные оболочки" -#: src/slic3r/GUI/Tab.cpp:1465 +#: src/slic3r/GUI/Tab.cpp:1410 msgid "Horizontal shells" msgstr "Горизонтальные оболочки (слои сверху и снизу модели)" -#: src/slic3r/GUI/Tab.cpp:1466 src/libslic3r/PrintConfig.cpp:2417 +#: src/slic3r/GUI/Tab.cpp:1411 src/libslic3r/PrintConfig.cpp:2448 msgid "Solid layers" msgstr "Сплошных слоёв" -#: src/slic3r/GUI/Tab.cpp:1471 +#: src/slic3r/GUI/Tab.cpp:1416 msgid "Minimum shell thickness" msgstr "Минимальная толщина оболочки" -#: src/slic3r/GUI/Tab.cpp:1482 +#: src/slic3r/GUI/Tab.cpp:1427 msgid "Quality (slower slicing)" msgstr "Качество (замедляет нарезку)" -#: src/slic3r/GUI/Tab.cpp:1497 +#: src/slic3r/GUI/Tab.cpp:1444 msgid "Fuzzy skin (experimental)" msgstr "Нечёткая оболочка (экспериментально)" -#: src/slic3r/GUI/Tab.cpp:1520 +#: src/slic3r/GUI/Tab.cpp:1467 msgid "Reducing printing time" msgstr "Сокращение времени печати" -#: src/slic3r/GUI/Tab.cpp:1535 src/libslic3r/ExtrusionEntity.cpp:370 +#: src/slic3r/GUI/Tab.cpp:1482 msgid "Skirt" msgstr "Юбка" -#: src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1504 msgid "Raft" msgstr "Подложка" -#: src/slic3r/GUI/Tab.cpp:1562 +#: src/slic3r/GUI/Tab.cpp:1509 msgid "Options for support material and raft" msgstr "Опции для поддержки и подложки" -#: src/slic3r/GUI/Tab.cpp:1582 +#: src/slic3r/GUI/Tab.cpp:1528 +msgid "Organic supports" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1537 msgid "Speed for print moves" msgstr "Скорость перемещения при печати" -#: src/slic3r/GUI/Tab.cpp:1595 +#: src/slic3r/GUI/Tab.cpp:1550 +msgid "Dynamic overhang speed" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1557 msgid "Speed for non-print moves" msgstr "Скорость перемещения без печати" -#: src/slic3r/GUI/Tab.cpp:1599 +#: src/slic3r/GUI/Tab.cpp:1561 msgid "Modifiers" msgstr "Модификаторы" -#: src/slic3r/GUI/Tab.cpp:1603 +#: src/slic3r/GUI/Tab.cpp:1565 msgid "Acceleration control (advanced)" msgstr "Управление ускорением (дополнительно)" -#: src/slic3r/GUI/Tab.cpp:1614 +#: src/slic3r/GUI/Tab.cpp:1576 msgid "Autospeed (advanced)" msgstr "Автоматическое управление скоростью (дополнительно)" -#: src/slic3r/GUI/Tab.cpp:1618 +#: src/slic3r/GUI/Tab.cpp:1580 msgid "Pressure equalizer (experimental)" msgstr "Выравнивание давления (экспериментально)" -#: src/slic3r/GUI/Tab.cpp:1622 +#: src/slic3r/GUI/Tab.cpp:1584 msgid "Multiple Extruders" msgstr "Несколько экструдеров" -#: src/slic3r/GUI/Tab.cpp:1630 +#: src/slic3r/GUI/Tab.cpp:1592 msgid "Ooze prevention" msgstr "Предотвращение течи материала" -#: src/slic3r/GUI/Tab.cpp:1650 +#: src/slic3r/GUI/Tab.cpp:1596 +msgid "Wipe tower" +msgstr "Черновая башня" + +#: src/slic3r/GUI/Tab.cpp:1612 msgid "Extrusion width" msgstr "Ширина экструзии" -#: src/slic3r/GUI/Tab.cpp:1660 +#: src/slic3r/GUI/Tab.cpp:1622 msgid "Overlap" msgstr "Перекрытие" -#: src/slic3r/GUI/Tab.cpp:1663 +#: src/slic3r/GUI/Tab.cpp:1625 msgid "Flow" msgstr "Поток" -#: src/slic3r/GUI/Tab.cpp:1674 src/slic3r/GUI/Tab.cpp:1700 -msgid "Other" -msgstr "Прочее" - -#: src/slic3r/GUI/Tab.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:1636 msgid "Arachne perimeter generator" msgstr "Генератор периметра на движке Arachne" -#: src/slic3r/GUI/Tab.cpp:1685 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1644 src/slic3r/GUI/Tab.cpp:4990 msgid "Output options" msgstr "Выходные параметры" -#: src/slic3r/GUI/Tab.cpp:1686 +#: src/slic3r/GUI/Tab.cpp:1645 msgid "Sequential printing" msgstr "Последовательная печать" -#: src/slic3r/GUI/Tab.cpp:1688 +#: src/slic3r/GUI/Tab.cpp:1647 msgid "Extruder clearance" msgstr "Радиус безопасной зоны экструдера" -#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:4735 +#: src/slic3r/GUI/Tab.cpp:1652 src/slic3r/GUI/Tab.cpp:4991 msgid "Output file" msgstr "Выходной файл" -#: src/slic3r/GUI/Tab.cpp:1712 src/libslic3r/PrintConfig.cpp:2042 +#: src/slic3r/GUI/Tab.cpp:1671 src/libslic3r/PrintConfig.cpp:2072 msgid "Post-processing scripts" msgstr "Скрипты постобработки" -#: src/slic3r/GUI/Tab.cpp:1724 src/slic3r/GUI/Tab.cpp:1725 -#: src/slic3r/GUI/Tab.cpp:2110 src/slic3r/GUI/Tab.cpp:2111 -#: src/slic3r/GUI/Tab.cpp:2498 src/slic3r/GUI/Tab.cpp:2499 -#: src/slic3r/GUI/Tab.cpp:2571 src/slic3r/GUI/Tab.cpp:2572 -#: src/slic3r/GUI/Tab.cpp:3957 src/slic3r/GUI/Tab.cpp:4585 -#: src/slic3r/GUI/Tab.cpp:4586 +#: src/slic3r/GUI/Tab.cpp:1683 src/slic3r/GUI/Tab.cpp:1684 +#: src/slic3r/GUI/Tab.cpp:2080 src/slic3r/GUI/Tab.cpp:2081 +#: src/slic3r/GUI/Tab.cpp:2486 src/slic3r/GUI/Tab.cpp:2487 +#: src/slic3r/GUI/Tab.cpp:2564 src/slic3r/GUI/Tab.cpp:2565 +#: src/slic3r/GUI/Tab.cpp:4182 src/slic3r/GUI/Tab.cpp:4822 +#: src/slic3r/GUI/Tab.cpp:4823 msgid "Notes" msgstr "Заметки" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:2088 +#: src/slic3r/GUI/Tab.cpp:2493 src/slic3r/GUI/Tab.cpp:2571 +#: src/slic3r/GUI/Tab.cpp:4830 src/slic3r/GUI/Tab.cpp:4996 msgid "Dependencies" msgstr "Зависимости" -#: src/slic3r/GUI/Tab.cpp:1732 src/slic3r/GUI/Tab.cpp:2119 -#: src/slic3r/GUI/Tab.cpp:2506 src/slic3r/GUI/Tab.cpp:2579 -#: src/slic3r/GUI/Tab.cpp:4594 src/slic3r/GUI/Tab.cpp:4741 +#: src/slic3r/GUI/Tab.cpp:1691 src/slic3r/GUI/Tab.cpp:2089 +#: src/slic3r/GUI/Tab.cpp:2494 src/slic3r/GUI/Tab.cpp:2572 +#: src/slic3r/GUI/Tab.cpp:4831 src/slic3r/GUI/Tab.cpp:4997 msgid "Profile dependencies" msgstr "Зависимости профиля" -#: src/slic3r/GUI/Tab.cpp:1771 +#: src/slic3r/GUI/Tab.cpp:1723 msgid "Post processing scripts shall modify G-code file in place." msgstr "Скрипты постобработки модифицируют файл G-кода так как вам нужно." -#: src/slic3r/GUI/Tab.cpp:1850 +#: src/slic3r/GUI/Tab.cpp:1802 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8946,7 +10496,7 @@ msgstr[2] "" "Удалите их, так как это может вызвать проблемы при визуализации G-кода и " "оценке времени печати." -#: src/slic3r/GUI/Tab.cpp:1855 +#: src/slic3r/GUI/Tab.cpp:1807 msgid "Found reserved keywords in" msgstr "Найдены зарезервированные ключевые слова в" @@ -8954,75 +10504,91 @@ msgstr "Найдены зарезервированные ключевые сл msgid "Filament Overrides" msgstr "Переопределение парам. прутка" -#: src/slic3r/GUI/Tab.cpp:1992 +#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2827 +msgid "Retraction" +msgstr "Ретракт (втягивание)" + +#: src/slic3r/GUI/Tab.cpp:1951 +msgid "Temperature" +msgstr "Температура" + +#: src/slic3r/GUI/Tab.cpp:1955 msgid "Nozzle" msgstr "Сопло" -#: src/slic3r/GUI/Tab.cpp:1997 +#: src/slic3r/GUI/Tab.cpp:1960 msgid "Bed" msgstr "Стол" -#: src/slic3r/GUI/Tab.cpp:2002 +#: src/slic3r/GUI/Tab.cpp:1965 msgid "Cooling" msgstr "Охлаждение" -#: src/slic3r/GUI/Tab.cpp:2004 src/libslic3r/PrintConfig.cpp:1936 -#: src/libslic3r/PrintConfig.cpp:2994 +#: src/slic3r/GUI/Tab.cpp:1967 src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "Enable" msgstr "Вкл." -#: src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/Tab.cpp:1978 msgid "Fan settings" msgstr "Настройки вентилятора" -#: src/slic3r/GUI/Tab.cpp:2026 +#: src/slic3r/GUI/Tab.cpp:1979 +msgid "Fan speed" +msgstr "Скорость вентилятора" + +#: src/slic3r/GUI/Tab.cpp:1989 +msgid "Dynamic fan speeds" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1996 msgid "Cooling thresholds" msgstr "Пороги включения обдува" -#: src/slic3r/GUI/Tab.cpp:2032 +#: src/slic3r/GUI/Tab.cpp:2002 msgid "Filament properties" msgstr "Настройки прутка" -#: src/slic3r/GUI/Tab.cpp:2039 +#: src/slic3r/GUI/Tab.cpp:2009 msgid "Print speed override" msgstr "Ограничение скорости печати" -#: src/slic3r/GUI/Tab.cpp:2049 +#: src/slic3r/GUI/Tab.cpp:2019 msgid "Wipe tower parameters" msgstr "Параметры черновой башни" -#: src/slic3r/GUI/Tab.cpp:2052 +#: src/slic3r/GUI/Tab.cpp:2022 msgid "Toolchange parameters with single extruder MM printers" msgstr "" "Параметры смены инструмента в одноэкструдерных мультиматериальных принтерах" -#: src/slic3r/GUI/Tab.cpp:2065 +#: src/slic3r/GUI/Tab.cpp:2035 msgid "Ramming settings" msgstr "Настройки рэмминга" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 -#: src/slic3r/GUI/Tab.cpp:4264 src/libslic3r/GCode.cpp:733 -#: src/libslic3r/PrintConfig.cpp:2500 +#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:2398 +#: src/slic3r/GUI/Tab.cpp:4493 src/libslic3r/GCode.cpp:684 +#: src/libslic3r/PrintConfig.cpp:2532 msgid "Custom G-code" msgstr "Пользовательский G-код" -#: src/slic3r/GUI/Tab.cpp:2090 src/slic3r/GUI/Tab.cpp:2411 -#: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2450 -#: src/libslic3r/PrintConfig.cpp:2465 +#: src/slic3r/GUI/Tab.cpp:2060 src/slic3r/GUI/Tab.cpp:2399 +#: src/libslic3r/GCode.cpp:658 src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2497 msgid "Start G-code" msgstr "Стартовый G-код" -#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:2421 -#: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:685 -#: src/libslic3r/PrintConfig.cpp:695 +#: src/slic3r/GUI/Tab.cpp:2070 src/slic3r/GUI/Tab.cpp:2409 +#: src/libslic3r/GCode.cpp:659 src/libslic3r/PrintConfig.cpp:788 +#: src/libslic3r/PrintConfig.cpp:798 msgid "End G-code" msgstr "Завершающий G-код" -#: src/slic3r/GUI/Tab.cpp:2153 +#: src/slic3r/GUI/Tab.cpp:2115 msgid "Volumetric flow hints not available" msgstr "Подсказки об объёмном расходе недоступны." -#: src/slic3r/GUI/Tab.cpp:2257 +#: src/slic3r/GUI/Tab.cpp:2241 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -9043,20 +10609,20 @@ msgstr "" "нажатии на значок шестеренки на вкладке настройки принтера. Профили " "физического принтера сохраняются в папке PrusaSlicer/physical_printer." -#: src/slic3r/GUI/Tab.cpp:2291 src/slic3r/GUI/Tab.cpp:2518 +#: src/slic3r/GUI/Tab.cpp:2275 src/slic3r/GUI/Tab.cpp:2506 msgid "Size and coordinates" msgstr "Размер и координаты" -#: src/slic3r/GUI/Tab.cpp:2300 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:2284 src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "Capabilities" msgstr "Характеристики принтера" -#: src/slic3r/GUI/Tab.cpp:2305 +#: src/slic3r/GUI/Tab.cpp:2289 msgid "Number of extruders of the printer." msgstr "Количество экструдеров у принтера." -#: src/slic3r/GUI/Tab.cpp:2334 +#: src/slic3r/GUI/Tab.cpp:2322 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -9068,110 +10634,105 @@ msgstr "" "Изменить диаметр всех экструдеров на значение диаметра сопла первого " "экструдера?" -#: src/slic3r/GUI/Tab.cpp:2338 src/slic3r/GUI/Tab.cpp:2782 -#: src/libslic3r/PrintConfig.cpp:1900 +#: src/slic3r/GUI/Tab.cpp:2326 src/slic3r/GUI/Tab.cpp:2714 +#: src/libslic3r/PrintConfig.cpp:1937 msgid "Nozzle diameter" msgstr "Диаметр сопла" -#: src/slic3r/GUI/Tab.cpp:2431 src/libslic3r/GCode.cpp:709 -#: src/libslic3r/PrintConfig.cpp:425 +#: src/slic3r/GUI/Tab.cpp:2419 src/libslic3r/GCode.cpp:660 +#: src/libslic3r/PrintConfig.cpp:444 msgid "Before layer change G-code" msgstr "G-код, выполняемый перед сменой слоя" -#: src/slic3r/GUI/Tab.cpp:2441 src/libslic3r/GCode.cpp:710 -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/slic3r/GUI/Tab.cpp:2429 src/libslic3r/GCode.cpp:661 +#: src/libslic3r/PrintConfig.cpp:1665 msgid "After layer change G-code" msgstr "G-код выполняемый после смены слоя" -#: src/slic3r/GUI/Tab.cpp:2451 src/libslic3r/GCode.cpp:711 -#: src/libslic3r/PrintConfig.cpp:2877 +#: src/slic3r/GUI/Tab.cpp:2439 src/libslic3r/GCode.cpp:662 +#: src/libslic3r/PrintConfig.cpp:2965 msgid "Tool change G-code" msgstr "G-код выполняемый при смене инструмента" -#: src/slic3r/GUI/Tab.cpp:2461 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2449 src/libslic3r/GCode.cpp:663 msgid "Between objects G-code (for sequential printing)" msgstr "G-код выполняемый между моделями (для последовательной печати)" -#: src/slic3r/GUI/Tab.cpp:2471 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2459 src/libslic3r/GCode.cpp:664 msgid "Color Change G-code" msgstr "G-код смены цвета" -#: src/slic3r/GUI/Tab.cpp:2480 src/libslic3r/GCode.cpp:714 -#: src/libslic3r/PrintConfig.cpp:2491 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:665 +#: src/libslic3r/PrintConfig.cpp:2523 msgid "Pause Print G-code" msgstr "G-код паузы печати" -#: src/slic3r/GUI/Tab.cpp:2489 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:666 msgid "Template Custom G-code" msgstr "Пользовательский шаблон G-кода" -#: src/slic3r/GUI/Tab.cpp:2525 +#: src/slic3r/GUI/Tab.cpp:2513 msgid "Display" msgstr "Дисплей" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2528 msgid "Tilt" msgstr "Наклон ванночки" -#: src/slic3r/GUI/Tab.cpp:2541 +#: src/slic3r/GUI/Tab.cpp:2529 msgid "Tilt time" msgstr "Время наклона ванночки" -#: src/slic3r/GUI/Tab.cpp:2548 src/slic3r/GUI/Tab.cpp:4575 +#: src/slic3r/GUI/Tab.cpp:2536 src/slic3r/GUI/Tab.cpp:4812 msgid "Corrections" msgstr "Корректировка" -#: src/slic3r/GUI/Tab.cpp:2561 src/slic3r/GUI/Tab.cpp:4571 +#: src/slic3r/GUI/Tab.cpp:2549 src/slic3r/GUI/Tab.cpp:4808 msgid "Exposure" msgstr "Экспозиция" -#: src/slic3r/GUI/Tab.cpp:2622 src/slic3r/GUI/Tab.cpp:2709 -#: src/libslic3r/PrintConfig.cpp:1655 src/libslic3r/PrintConfig.cpp:1690 -#: src/libslic3r/PrintConfig.cpp:1707 src/libslic3r/PrintConfig.cpp:1724 -#: src/libslic3r/PrintConfig.cpp:1740 src/libslic3r/PrintConfig.cpp:1750 -#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1773 -#: src/libslic3r/PrintConfig.cpp:1783 +#: src/slic3r/GUI/Tab.cpp:2556 +msgid "Output" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2615 src/slic3r/GUI/Tab.cpp:2875 +#: src/libslic3r/PrintConfig.cpp:1694 src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1744 src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1777 src/libslic3r/PrintConfig.cpp:1787 +#: src/libslic3r/PrintConfig.cpp:1797 src/libslic3r/PrintConfig.cpp:1810 +#: src/libslic3r/PrintConfig.cpp:1820 msgid "Machine limits" msgstr "Ограничения принтера" -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2638 msgid "Values in this column are for Normal mode" msgstr "Значения в этой колонке для нормального режима" -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2644 msgid "Values in this column are for Stealth mode" msgstr "Значения в этой колонке для тихого режима" -#: src/slic3r/GUI/Tab.cpp:2660 +#: src/slic3r/GUI/Tab.cpp:2653 msgid "Maximum feedrates" msgstr "Максимальная скорость (#define DEFAULT_MAX_FEEDRATE {X, Y, Z, E})" -#: src/slic3r/GUI/Tab.cpp:2665 +#: src/slic3r/GUI/Tab.cpp:2658 msgid "Maximum accelerations" msgstr "" "Максимальное ускорение (#define DEFAULT_MAX_ACCELERATION {X,Y,Z,E}, #define " "DEFAULT_RETRACT_ACCELERATION, )" -#: src/slic3r/GUI/Tab.cpp:2674 +#: src/slic3r/GUI/Tab.cpp:2667 msgid "Jerk limits" msgstr "Ограничение рывка (#define DEFAULT_{X,Y,Z,E}JERK)" -#: src/slic3r/GUI/Tab.cpp:2680 +#: src/slic3r/GUI/Tab.cpp:2673 msgid "Minimum feedrates" msgstr "" "Минимальная скорость (#define DEFAULT_MINIMUMFEEDRATE и #define " "DEFAULT_MINTRAVELFEEDRATE)" -#: src/slic3r/GUI/Tab.cpp:2734 src/slic3r/GUI/Tab.cpp:2743 -msgid "Single extruder MM setup" -msgstr "Экструдер в ММ принтере" - -#: src/slic3r/GUI/Tab.cpp:2744 -msgid "Single extruder multimaterial parameters" -msgstr "" -"Параметры экструдера в одноэкструдерном мультиматериальном (ММ) принтере" - -#: src/slic3r/GUI/Tab.cpp:2779 +#: src/slic3r/GUI/Tab.cpp:2711 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -9179,19 +10740,27 @@ msgstr "" "Это одноэкструдерный мультиматериальный принтер, диаметры всех экструдеров " "будут установлены на новое значение. Вы хотите продолжить?" -#: src/slic3r/GUI/Tab.cpp:2804 +#: src/slic3r/GUI/Tab.cpp:2739 +msgid "Reset to Filament Color" +msgstr "Сброс в цвет прутка" + +#: src/slic3r/GUI/Tab.cpp:2775 +msgid "Apply below setting to other extruders" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2820 msgid "Layer height limits" msgstr "Ограничение высоты слоя" -#: src/slic3r/GUI/Tab.cpp:2809 +#: src/slic3r/GUI/Tab.cpp:2824 msgid "Position (for multi-extruder printers)" msgstr "Позиция экструдера (для многоэкструдерных принтеров)" -#: src/slic3r/GUI/Tab.cpp:2815 +#: src/slic3r/GUI/Tab.cpp:2830 msgid "Only lift Z" msgstr "Приподнимать сопло только" -#: src/slic3r/GUI/Tab.cpp:2828 +#: src/slic3r/GUI/Tab.cpp:2843 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -9199,11 +10768,16 @@ msgstr "" "Ретракт, при отключении сопла (дополнительные настройки для " "многоэкструдерных принтеров)" -#: src/slic3r/GUI/Tab.cpp:2835 -msgid "Reset to Filament Color" -msgstr "Сброс в цвет прутка" +#: src/slic3r/GUI/Tab.cpp:2900 src/slic3r/GUI/Tab.cpp:2909 +msgid "Single extruder MM setup" +msgstr "Экструдер в ММ принтере" + +#: src/slic3r/GUI/Tab.cpp:2910 +msgid "Single extruder multimaterial parameters" +msgstr "" +"Параметры экструдера в одноэкструдерном мультиматериальном (ММ) принтере" -#: src/slic3r/GUI/Tab.cpp:3012 +#: src/slic3r/GUI/Tab.cpp:3074 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -9213,31 +10787,48 @@ msgstr "" "\n" "Отключить его для включения ретракта из прошивки?" -#: src/slic3r/GUI/Tab.cpp:3014 +#: src/slic3r/GUI/Tab.cpp:3076 msgid "Firmware Retraction" msgstr "Ретракт из прошивки" -#: src/slic3r/GUI/Tab.cpp:3319 +#: src/slic3r/GUI/Tab.cpp:3384 msgid "New printer preset selected" msgstr "Выбран новый профиль принтера" -#: src/slic3r/GUI/Tab.cpp:3625 +#: src/slic3r/GUI/Tab.cpp:3758 msgid "Detached" msgstr "Отсоединён" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3857 +msgid "" +"The physical printer below is based on the preset, you are going to rename." +msgid_plural "" +"The physical printers below are based on the preset, you are going to rename." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: src/slic3r/GUI/Tab.cpp:3862 +msgid "Note, that the selected preset will be renamed in this printer too." +msgid_plural "" +"Note, that the selected preset will be renamed in these printers too." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: src/slic3r/GUI/Tab.cpp:3924 msgid "remove" msgstr "убрать" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3924 msgid "delete" msgstr "удалить" -#: src/slic3r/GUI/Tab.cpp:3711 +#: src/slic3r/GUI/Tab.cpp:3933 msgid "It's a last preset for this physical printer." msgstr "Это последний профиль для этого физического принтера." -#: src/slic3r/GUI/Tab.cpp:3716 +#: src/slic3r/GUI/Tab.cpp:3938 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " @@ -9246,7 +10837,7 @@ msgstr "" "Вы действительно хотите удалить профиль \"%1%\" из физического принтера \"%2%" "\"?" -#: src/slic3r/GUI/Tab.cpp:3728 +#: src/slic3r/GUI/Tab.cpp:3950 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -9261,7 +10852,7 @@ msgstr[2] "" "Физические принтеры расположенные ниже, основаны на профиле, который вы " "собираетесь удалить." -#: src/slic3r/GUI/Tab.cpp:3733 +#: src/slic3r/GUI/Tab.cpp:3955 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." @@ -9272,7 +10863,7 @@ msgstr[1] "" msgstr[2] "" "Обратите внимание, что выбранный профиль будет удалён и из этих принтеров." -#: src/slic3r/GUI/Tab.cpp:3738 +#: src/slic3r/GUI/Tab.cpp:3960 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -9289,7 +10880,7 @@ msgstr[2] "" "Приведенные ниже физические принтеры основаны только на профиле, который вы " "собираетесь удалить." -#: src/slic3r/GUI/Tab.cpp:3743 +#: src/slic3r/GUI/Tab.cpp:3965 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -9304,57 +10895,57 @@ msgstr[2] "" "Обратите внимание, что эти принтеры будут удалены после удаления выбранного " "профиля." -#: src/slic3r/GUI/Tab.cpp:3748 +#: src/slic3r/GUI/Tab.cpp:3970 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "Вы уверены, что хотите %1% выбранный профиль?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3753 +#: src/slic3r/GUI/Tab.cpp:3975 #, boost-format msgid "%1% Preset" msgstr "Профиль %1%" -#: src/slic3r/GUI/Tab.cpp:3836 src/slic3r/GUI/Tab.cpp:4198 +#: src/slic3r/GUI/Tab.cpp:4061 src/slic3r/GUI/Tab.cpp:4423 msgid "Set" msgstr "Выбор" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:4180 msgid "Find" msgstr "Найти" -#: src/slic3r/GUI/Tab.cpp:3956 +#: src/slic3r/GUI/Tab.cpp:4181 msgid "Replace with" msgstr "Заменить на" -#: src/slic3r/GUI/Tab.cpp:4045 +#: src/slic3r/GUI/Tab.cpp:4270 msgid "Regular expression" msgstr "Регулярное выражение" -#: src/slic3r/GUI/Tab.cpp:4049 +#: src/slic3r/GUI/Tab.cpp:4274 msgid "Case insensitive" msgstr "Не учитывать регистр" -#: src/slic3r/GUI/Tab.cpp:4053 +#: src/slic3r/GUI/Tab.cpp:4278 msgid "Whole word" msgstr "Слово целиком" -#: src/slic3r/GUI/Tab.cpp:4057 +#: src/slic3r/GUI/Tab.cpp:4282 msgid "Match single line" msgstr "Совпадение в одной строке" -#: src/slic3r/GUI/Tab.cpp:4160 +#: src/slic3r/GUI/Tab.cpp:4385 msgid "Are you sure you want to delete all substitutions?" msgstr "Вы действительно хотите удалить все замены?" -#: src/slic3r/GUI/Tab.cpp:4292 +#: src/slic3r/GUI/Tab.cpp:4521 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" "Ограничения принтера будут передаваться в G-код и использоваться для оценки " "времени печати." -#: src/slic3r/GUI/Tab.cpp:4295 +#: src/slic3r/GUI/Tab.cpp:4524 msgid "" "Machine limits will NOT be emitted to G-code, however they will be used to " "estimate print time, which may therefore not be accurate as the printer may " @@ -9364,7 +10955,7 @@ msgstr "" "используются для оценки времени печати, которое может быть неточным, " "поскольку принтер может применять другой набор ограничений для принтера." -#: src/slic3r/GUI/Tab.cpp:4299 +#: src/slic3r/GUI/Tab.cpp:4528 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." @@ -9372,12 +10963,12 @@ msgstr "" "Ограничения принтера не заданы, поэтому оценка времени печати может быть " "неточной." -#: src/slic3r/GUI/Tab.cpp:4321 +#: src/slic3r/GUI/Tab.cpp:4550 msgid "LOCKED LOCK" msgstr "ЗАКРЫТЫЙ ЗАМОЧЕК" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4323 +#: src/slic3r/GUI/Tab.cpp:4552 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" @@ -9385,12 +10976,12 @@ msgstr "" "указывает, что настройки совпадают с системными значениями (или значениями " "по умолчанию) для текущей группы." -#: src/slic3r/GUI/Tab.cpp:4325 +#: src/slic3r/GUI/Tab.cpp:4554 msgid "UNLOCKED LOCK" msgstr "ОТКРЫТЫЙ ЗАМОЧЕК" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4327 +#: src/slic3r/GUI/Tab.cpp:4556 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -9402,12 +10993,12 @@ msgstr "" "Нажмите, чтобы сбросить все настройки текущей группы до системных значений " "(или значений по умолчанию)." -#: src/slic3r/GUI/Tab.cpp:4332 +#: src/slic3r/GUI/Tab.cpp:4561 msgid "WHITE BULLET" msgstr "БЕЛЫЙ МАРКЕР" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4334 +#: src/slic3r/GUI/Tab.cpp:4563 msgid "" "for the left button: indicates a non-system (or non-default) preset,\n" "for the right button: indicates that the settings hasn't been modified." @@ -9415,12 +11006,12 @@ msgstr "" "слева: указывает на не системный профиль (или профиль не по умолчанию),\n" "справа: указывает, что параметры не были изменены." -#: src/slic3r/GUI/Tab.cpp:4337 +#: src/slic3r/GUI/Tab.cpp:4566 msgid "BACK ARROW" msgstr "ЗНАЧОК СО СТРЕЛКОЙ" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4339 +#: src/slic3r/GUI/Tab.cpp:4568 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -9433,7 +11024,7 @@ msgstr "" "настройки для текущей группы до последнего\n" "сохранённого значения профиля." -#: src/slic3r/GUI/Tab.cpp:4349 +#: src/slic3r/GUI/Tab.cpp:4578 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -9441,7 +11032,7 @@ msgstr "" "ЗАКРЫТЫЙ ЗАМОЧЕК указывает, что настройки совпадают с системными значениями " "(или значениями по умолчанию) для текущей группы." -#: src/slic3r/GUI/Tab.cpp:4351 +#: src/slic3r/GUI/Tab.cpp:4580 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " "equal to the system (or default) values for the current option group.\n" @@ -9453,12 +11044,12 @@ msgstr "" "Нажмите, чтобы сбросить все настройки текущей группы до системных значений " "(или значений по умолчанию)." -#: src/slic3r/GUI/Tab.cpp:4354 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" "БЕЛЫЙ МАРКЕР указывает на не системный профиль (или профиль не по умолчанию)." -#: src/slic3r/GUI/Tab.cpp:4357 +#: src/slic3r/GUI/Tab.cpp:4586 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -9466,7 +11057,7 @@ msgstr "" "БЕЛЫЙ МАРКЕР означает, что настройки совпадают с настройками в последнем " "сохранённом профиле для текущей группы." -#: src/slic3r/GUI/Tab.cpp:4359 +#: src/slic3r/GUI/Tab.cpp:4588 msgid "" "BACK ARROW icon indicates that the settings were changed and are not equal " "to the last saved preset for the current option group.\n" @@ -9478,7 +11069,7 @@ msgstr "" "Нажмите, чтобы сбросить все настройки для текущей группы до последнего " "сохранённого значения профиля." -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4594 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." @@ -9486,7 +11077,7 @@ msgstr "" "ЗАКРЫТЫЙ ЗАМОЧЕК указывает, что значение совпадает с системным значением " "(или значение по умолчанию)." -#: src/slic3r/GUI/Tab.cpp:4366 +#: src/slic3r/GUI/Tab.cpp:4595 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -9497,7 +11088,7 @@ msgstr "" "Нажмите, чтобы сбросить текущее значение к системному значению (или значению " "по умолчанию)." -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4601 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -9505,7 +11096,7 @@ msgstr "" "БЕЛЫЙ МАРКЕР указывает, что значение совпадает со значением в последнем " "сохранённом профиле." -#: src/slic3r/GUI/Tab.cpp:4373 +#: src/slic3r/GUI/Tab.cpp:4602 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -9515,31 +11106,31 @@ msgstr "" "значением в последнем сохранённом профиле для текущей группы.\n" "Нажмите, чтобы сбросить значение до последнего сохранённого значения профиля." -#: src/slic3r/GUI/Tab.cpp:4527 src/slic3r/GUI/Tab.cpp:4529 +#: src/slic3r/GUI/Tab.cpp:4764 src/slic3r/GUI/Tab.cpp:4766 msgid "Material" msgstr "Материал" -#: src/slic3r/GUI/Tab.cpp:4614 src/slic3r/GUI/Tab.cpp:4615 +#: src/slic3r/GUI/Tab.cpp:4851 src/slic3r/GUI/Tab.cpp:4852 msgid "Material printing profile" msgstr "Профиль печати материалами" -#: src/slic3r/GUI/Tab.cpp:4667 +#: src/slic3r/GUI/Tab.cpp:4901 msgid "Support head" msgstr "Носик поддержки" -#: src/slic3r/GUI/Tab.cpp:4672 +#: src/slic3r/GUI/Tab.cpp:4906 msgid "Support pillar" msgstr "Тело поддержки" -#: src/slic3r/GUI/Tab.cpp:4695 +#: src/slic3r/GUI/Tab.cpp:4929 msgid "Connection of the support sticks and junctions" msgstr "Соединения опор поддержки со связующим узлом" -#: src/slic3r/GUI/Tab.cpp:4700 +#: src/slic3r/GUI/Tab.cpp:4956 msgid "Automatic generation" msgstr "Автоматическая генерация" -#: src/slic3r/GUI/Tab.cpp:4775 +#: src/slic3r/GUI/Tab.cpp:5024 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -9548,62 +11139,60 @@ msgstr "" "\"%1%\" отключена, так как \"%2%\" находится в категории \"%3%\".\n" "Чтобы включить \"%1%\", отключите \"%2%\"" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3724 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3497 msgid "Object elevation" msgstr "Высота подъёма модели" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3826 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3958 msgid "Pad around object" msgstr "Подложка вокруг модели" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:153 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:162 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1047 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1100 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1115 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1130 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1145 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:147 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:156 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:165 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1107 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1122 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1137 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1152 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1197 msgid "Undef" msgstr "Не задано" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:772 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:792 msgid "Unsaved Changes" msgstr "Несохранённые изменения" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:790 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:810 msgid "Switching Presets: Unsaved Changes" msgstr "Смена профилей: несохранённые изменения" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:832 -msgid "Old Value" -msgstr "Старое значение" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:858 +msgid "Original Value" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:859 +msgid "Modified Value" +msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:833 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:861 msgid "New Value" msgstr "Новое значение" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:867 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 msgid "Keep" msgstr "Запомнить" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1569 msgid "Transfer" msgstr "Перенести" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 msgid "Don't save" msgstr "Не сохранять" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 -msgid "Discard" -msgstr "Не сохранять" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:877 -msgid "Save" -msgstr "Сохранить" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:898 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:926 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "create new project" @@ -9611,7 +11200,7 @@ msgstr "" "В следующий раз не будут появляться запросы о несохранённых изменениях в " "профилях при создании нового профиля" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:927 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "switch a preset" @@ -9619,7 +11208,7 @@ msgstr "" "В следующий раз не будут появляться запросы о несохранённых изменениях в " "профилях при переключении профиля" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:900 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:928 msgid "" "You will not be asked about the unsaved changes in presets the next time " "you: \n" @@ -9631,11 +11220,11 @@ msgstr "" "- Закрытие PrusaSlicer, при имеющихся изменениях в профилях\n" "- Загрузки нового проекта, если имеются изменения в профилях" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:903 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:931 msgid "PrusaSlicer will remember your action." msgstr "PrusaSlicer запомнит ваш выбор." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:904 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:932 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" @@ -9644,57 +11233,57 @@ msgstr "" "Зайдите в настройки приложения и установите флажок \"%1%\",\n" "чтобы вернуть запрос о несохранённых изменениях." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:964 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1772 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" "Некоторые поля слишком длинные. Щёлкните правой кнопкой мыши, чтобы показать " "полный текст." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will not be saved" msgstr "Все изменения в настройках не будут сохранены" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will be discarded." msgstr "Все изменённые параметры будут потеряны." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:941 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:969 msgid "Save the selected options." msgstr "Сохранить выбранные параметры." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:942 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:970 msgid "Keep the selected settings." msgstr "Запомнить выбранные настройки." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:943 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:971 msgid "Transfer the selected settings to the newly selected preset." msgstr "Перенести выбранные параметры во вновь выбранный профиль." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:947 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:975 #, boost-format msgid "Save the selected options to preset \"%1%\"." msgstr "Сохранить выбранные параметры в профиле \"%1%\"." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:948 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:976 #, boost-format msgid "Transfer the selected options to the newly selected preset \"%1%\"." msgstr "Перенести выбранные параметры во вновь выбранный профиль \"%1%\"." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1224 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1237 msgid "The following preset was modified" msgid_plural "The following presets were modified" msgstr[0] "Был изменён следующий профиль" msgstr[1] "Были изменены следующие профиля" msgstr[2] "Были изменены следующие профилей" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1230 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1243 #, boost-format msgid "Preset \"%1%\" has the following unsaved changes:" msgstr "Профиль \"%1%\" имеет следующие несохранённые изменения:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1234 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1247 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new printer profile and it has the " @@ -9703,7 +11292,7 @@ msgstr "" "Профиль \"%1%\" несовместим с новым профилем принтера, и в нём есть " "следующие несохранённые изменения:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1235 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1248 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new print profile and it has the " @@ -9712,40 +11301,68 @@ msgstr "" "Профиль \"%1%\" несовместим с новым профилем печати, и имеет следующие " "несохранённые изменения:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1297 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1850 msgid "Extruders count" msgstr "Количество экструдеров" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 -msgid "Select presets to compare" -msgstr "Выберите профили для сравнения" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1326 +msgid "The preset modifications are successfully saved" +msgid_plural "The presets modifications are successfully saved" +msgstr[0] "Изменённый профиль успешно сохранён" +msgstr[1] "Изменённые профили успешно сохранёны" +msgstr[2] "Изменённые профили успешно сохранёны" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1515 msgid "Show all presets (including incompatible)" msgstr "Показать все профили (включая несовместимые)" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1533 +msgid "Select presets to compare" +msgstr "Выберите профили для сравнения" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1545 msgid "Left Preset Value" msgstr "Значение в левом профиле" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1546 msgid "Right Preset Value" msgstr "Значение в правом профиле" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1595 +msgid "" +"Transfer the selected options from left preset to the right.\n" +"Note: New modified presets will be selected in settings tabs after close " +"this dialog." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1603 +msgid "Save the selected options from left preset to the right." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1621 +msgid "Transfer values from left to right" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1622 +msgid "" +"If enabled, this dialog can be used for transver selected values from left " +"to right preset." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1807 msgid "One of the presets doesn't found" msgstr "Не найден один из профилей" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1818 msgid "Compared presets has different printer technology" msgstr "Сравниваемые профили имеют различную технологию печати" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1832 msgid "Presets are the same" msgstr "Отличия в профилях отсутствуют" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1840 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." @@ -9753,57 +11370,133 @@ msgstr "" "Профили отличаются.\n" "Нажмите эту кнопку, чтобы выставить в правый профиль тоже что и в левом." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef category" msgstr "Неопределённая категория" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef group" msgstr "Неопределённая группа" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:2016 +msgid "Modified" +msgstr "Изменён" + +#: src/slic3r/GUI/UpdateDialogs.cpp:41 msgid "Update available" msgstr "Доступно обновление" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UpdateDialogs.cpp:41 #, c-format, boost-format msgid "New version of %s is available" msgstr "Доступна новая версия %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:42 +#: src/slic3r/GUI/UpdateDialogs.cpp:46 src/slic3r/GUI/UpdateDialogs.cpp:101 msgid "Current version:" msgstr "Текущая версия:" -#: src/slic3r/GUI/UpdateDialogs.cpp:44 +#: src/slic3r/GUI/UpdateDialogs.cpp:48 src/slic3r/GUI/UpdateDialogs.cpp:103 +#: src/slic3r/GUI/UpdateDialogs.cpp:141 msgid "New version:" msgstr "Новая версия:" -#: src/slic3r/GUI/UpdateDialogs.cpp:52 +#: src/slic3r/GUI/UpdateDialogs.cpp:56 msgid "Changelog & Download" msgstr "Журнал изменений и загрузка" -#: src/slic3r/GUI/UpdateDialogs.cpp:59 src/slic3r/GUI/UpdateDialogs.cpp:133 -#: src/slic3r/GUI/UpdateDialogs.cpp:191 +#: src/slic3r/GUI/UpdateDialogs.cpp:63 src/slic3r/GUI/UpdateDialogs.cpp:309 +#: src/slic3r/GUI/UpdateDialogs.cpp:367 msgid "Open changelog page" msgstr "Открыть страницу истории изменений" -#: src/slic3r/GUI/UpdateDialogs.cpp:65 +#: src/slic3r/GUI/UpdateDialogs.cpp:69 msgid "Open download page" msgstr "Открыть страницу загрузки" -#: src/slic3r/GUI/UpdateDialogs.cpp:72 +#: src/slic3r/GUI/UpdateDialogs.cpp:76 src/slic3r/GUI/UpdateDialogs.cpp:109 msgid "Don't notify about new releases any more" msgstr "Больше не уведомлять о новых релизах" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +msgid "App Update available" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +#, c-format, boost-format +msgid "" +"New version of %s is available.\n" +"Do you wish to download it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:120 +msgid "Next" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +msgid "App Update download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +#, c-format, boost-format +msgid "New version of %s is available." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:146 +msgid "Run installer after download. (Otherwise file explorer will be opened)" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:151 +msgid "Target directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:158 +msgid "Select directory" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:176 +msgid "Select directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:193 +msgid "Download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:204 +msgid "Directory path is empty." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:212 +msgid "Directory path is incorrect." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:217 +#, boost-format +msgid "Directory %1% doesn't exists. Do you wish to create it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:222 +msgid "Failed to create directory." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:229 +#, boost-format +msgid "File %1% already exists. Do you wish to overwrite it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +#, boost-format +msgid "Download path is %1%. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:270 msgid "Opening Configuration Wizard" msgstr "Открытие мастера настройки" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 src/slic3r/GUI/UpdateDialogs.cpp:261 +#: src/slic3r/GUI/UpdateDialogs.cpp:270 src/slic3r/GUI/UpdateDialogs.cpp:437 msgid "Configuration update" msgstr "Обновление конфигурации" -#: src/slic3r/GUI/UpdateDialogs.cpp:95 +#: src/slic3r/GUI/UpdateDialogs.cpp:271 msgid "" "PrusaSlicer is not using the newest configuration available.\n" "Configuration Wizard may not offer the latest printers, filaments and SLA " @@ -9813,11 +11506,11 @@ msgstr "" "Если хотите, мастер настройки может не предлагать установку новейших " "принтеров, пластиковых нитей и SLA материалов." -#: src/slic3r/GUI/UpdateDialogs.cpp:97 +#: src/slic3r/GUI/UpdateDialogs.cpp:273 msgid "Configuration update is available" msgstr "Доступно обновление конфигурации" -#: src/slic3r/GUI/UpdateDialogs.cpp:100 +#: src/slic3r/GUI/UpdateDialogs.cpp:276 msgid "" "Would you like to install it?\n" "\n" @@ -9833,28 +11526,28 @@ msgstr "" "\n" "Обновлённые пакеты конфигурации:" -#: src/slic3r/GUI/UpdateDialogs.cpp:121 src/slic3r/GUI/UpdateDialogs.cpp:181 +#: src/slic3r/GUI/UpdateDialogs.cpp:297 src/slic3r/GUI/UpdateDialogs.cpp:357 msgid "Comment:" msgstr "Комментарий:" -#: src/slic3r/GUI/UpdateDialogs.cpp:142 +#: src/slic3r/GUI/UpdateDialogs.cpp:318 msgid "Install" msgstr "Установить" -#: src/slic3r/GUI/UpdateDialogs.cpp:144 +#: src/slic3r/GUI/UpdateDialogs.cpp:320 msgid "Don't install" msgstr "Не устанавливать" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 src/slic3r/GUI/UpdateDialogs.cpp:212 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 src/slic3r/GUI/UpdateDialogs.cpp:388 #, c-format, boost-format msgid "%s incompatibility" msgstr "Несовместимость с %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 msgid "You must install a configuration update." msgstr "Необходимо установить обновление конфигурации." -#: src/slic3r/GUI/UpdateDialogs.cpp:160 +#: src/slic3r/GUI/UpdateDialogs.cpp:336 #, c-format, boost-format msgid "" "%s will now start updates. Otherwise it won't be able to start.\n" @@ -9871,17 +11564,12 @@ msgstr "" "\n" "Обновлённые пакеты конфигурации:" -#: src/slic3r/GUI/UpdateDialogs.cpp:200 src/slic3r/GUI/UpdateDialogs.cpp:247 -#, c-format, boost-format -msgid "Exit %s" -msgstr "Выйти из %s" - -#: src/slic3r/GUI/UpdateDialogs.cpp:213 +#: src/slic3r/GUI/UpdateDialogs.cpp:389 #, c-format, boost-format msgid "%s configuration is incompatible" msgstr "Несовместимая конфигурация %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:216 +#: src/slic3r/GUI/UpdateDialogs.cpp:392 #, c-format, boost-format msgid "" "This version of %s is not compatible with currently installed configuration " @@ -9901,20 +11589,20 @@ msgstr "" "запустить начальную конфигурацию. Это создаст резервную копию существующей " "конфигурации перед установкой файлов, совместимых с этой версией %s." -#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#: src/slic3r/GUI/UpdateDialogs.cpp:401 #, c-format, boost-format msgid "This %s version: %s" msgstr "Версия %s: %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:230 +#: src/slic3r/GUI/UpdateDialogs.cpp:406 msgid "Incompatible bundles:" msgstr "Несовместимые пакеты конфигурации:" -#: src/slic3r/GUI/UpdateDialogs.cpp:246 +#: src/slic3r/GUI/UpdateDialogs.cpp:422 msgid "Re-configure" msgstr "Перенастроить" -#: src/slic3r/GUI/UpdateDialogs.cpp:265 +#: src/slic3r/GUI/UpdateDialogs.cpp:441 #, c-format, boost-format msgid "" "%s now uses an updated configuration structure.\n" @@ -9941,28 +11629,37 @@ msgstr "" "Перейдите к %s, чтобы настроить новые профили и выбрать, следует ли включить " "автоматическое обновление системных профилей." -#: src/slic3r/GUI/UpdateDialogs.cpp:282 +#: src/slic3r/GUI/UpdateDialogs.cpp:458 msgid "For more information please visit our wiki page:" msgstr "Для получения дополнительной информации, посетите нашу вики-страницу:" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 msgid "Configuration updates" msgstr "Обновление конфигурации" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 src/slic3r/GUI/UpdateDialogs.cpp:495 msgid "No updates available" msgstr "Обновления отсутствуют" -#: src/slic3r/GUI/UpdateDialogs.cpp:304 +#: src/slic3r/GUI/UpdateDialogs.cpp:480 #, c-format, boost-format msgid "%s has no configuration updates available." msgstr "Обновления конфигурации для %s отсутствуют." -#: src/slic3r/GUI/WipeTowerDialog.cpp:21 +#: src/slic3r/GUI/UpdateDialogs.cpp:495 +msgid "App update" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:500 +#, c-format, boost-format +msgid "%s has no version updates available." +msgstr "" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:23 msgid "Ramming customization" msgstr "Настройки рэмминга" -#: src/slic3r/GUI/WipeTowerDialog.cpp:54 +#: src/slic3r/GUI/WipeTowerDialog.cpp:56 msgid "" "Ramming denotes the rapid extrusion just before a tool change in a single-" "extruder MM printer. Its purpose is to properly shape the end of the " @@ -9985,27 +11682,27 @@ msgstr "" "Эта опция для опытных пользователей, неправильная настройка может привести к " "замятию, протиранию прутка приводом экструдера и т.д." -#: src/slic3r/GUI/WipeTowerDialog.cpp:114 +#: src/slic3r/GUI/WipeTowerDialog.cpp:116 msgid "Total ramming time" msgstr "Общее время рэмминга" -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 msgid "Total rammed volume" msgstr "Общий объём при рэмминге" -#: src/slic3r/GUI/WipeTowerDialog.cpp:120 +#: src/slic3r/GUI/WipeTowerDialog.cpp:122 msgid "Ramming line width" msgstr "Ширина линии при рэмминге" -#: src/slic3r/GUI/WipeTowerDialog.cpp:122 +#: src/slic3r/GUI/WipeTowerDialog.cpp:124 msgid "Ramming line spacing" msgstr "Расстояние между линиями при рэмминге" -#: src/slic3r/GUI/WipeTowerDialog.cpp:173 +#: src/slic3r/GUI/WipeTowerDialog.cpp:175 msgid "Wipe tower - Purging volume adjustment" msgstr "Черновая башня - регулировка объёма сброса пластика" -#: src/slic3r/GUI/WipeTowerDialog.cpp:299 +#: src/slic3r/GUI/WipeTowerDialog.cpp:301 msgid "" "Here you can adjust required purging volume (mm³) for any given pair of " "tools." @@ -10013,23 +11710,23 @@ msgstr "" "Здесь вы можете отрегулировать требуемый объём очистки (мм³) для любой пары " "инструментов." -#: src/slic3r/GUI/WipeTowerDialog.cpp:300 +#: src/slic3r/GUI/WipeTowerDialog.cpp:302 msgid "Extruder changed to" msgstr "Экструдер перешёл на - " -#: src/slic3r/GUI/WipeTowerDialog.cpp:308 +#: src/slic3r/GUI/WipeTowerDialog.cpp:310 msgid "unloaded" msgstr "выгрузка" -#: src/slic3r/GUI/WipeTowerDialog.cpp:309 +#: src/slic3r/GUI/WipeTowerDialog.cpp:311 msgid "loaded" msgstr "загрузка" -#: src/slic3r/GUI/WipeTowerDialog.cpp:352 +#: src/slic3r/GUI/WipeTowerDialog.cpp:354 msgid "Tool #" msgstr "Инструмент #" -#: src/slic3r/GUI/WipeTowerDialog.cpp:361 +#: src/slic3r/GUI/WipeTowerDialog.cpp:363 msgid "" "Total purging volume is calculated by summing two values below, depending on " "which tools are loaded/unloaded." @@ -10037,15 +11734,15 @@ msgstr "" "Общий объём прочистки вычисляется путём суммирования двух нижеуказанных " "значений, в зависимости от того, какие инструменты предзагружены/выгружены." -#: src/slic3r/GUI/WipeTowerDialog.cpp:362 +#: src/slic3r/GUI/WipeTowerDialog.cpp:364 msgid "Volume to purge (mm³) when the filament is being" msgstr "Объём прочистки (мм³) при выдавливании прутка" -#: src/slic3r/GUI/WipeTowerDialog.cpp:376 +#: src/slic3r/GUI/WipeTowerDialog.cpp:378 msgid "From" msgstr "Из" -#: src/slic3r/GUI/WipeTowerDialog.cpp:442 +#: src/slic3r/GUI/WipeTowerDialog.cpp:444 msgid "" "Switching to simple settings will discard changes done in the advanced " "mode!\n" @@ -10057,26 +11754,28 @@ msgstr "" "\n" "Хотите продолжить?" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show simplified settings" msgstr "Показать упрощённые настройки" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show advanced settings" msgstr "Показать расширенные настройки" -#: src/slic3r/GUI/wxExtensions.cpp:644 +#: src/slic3r/GUI/wxExtensions.cpp:672 #, c-format, boost-format msgid "Switch to the %s mode" msgstr "Переключиться в режим %s" -#: src/slic3r/GUI/wxExtensions.cpp:645 +#: src/slic3r/GUI/wxExtensions.cpp:673 #, c-format, boost-format msgid "Current mode is %s" msgstr "Текущий режим %s" -#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:141 -#: src/slic3r/Utils/Repetier.cpp:69 +#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:206 +#: src/slic3r/Utils/OctoPrint.cpp:255 src/slic3r/Utils/OctoPrint.cpp:666 +#: src/slic3r/Utils/OctoPrint.cpp:824 src/slic3r/Utils/OctoPrint.cpp:897 +#: src/slic3r/Utils/Repetier.cpp:88 #, c-format, boost-format msgid "Mismatched type of print host: %s" msgstr "Несоответствующий тип хоста печати: %s" @@ -10195,71 +11894,100 @@ msgstr "" "Примечание: для активации функцией загрузки, требуется FlashAir с прошивкой " "2.00.02 и выше." -#: src/slic3r/Utils/OctoPrint.cpp:164 +#: src/slic3r/Utils/OctoPrint.cpp:278 msgid "Connection to OctoPrint works correctly." msgstr "Подключение к OctoPrint установлено." -#: src/slic3r/Utils/OctoPrint.cpp:170 +#: src/slic3r/Utils/OctoPrint.cpp:284 msgid "Could not connect to OctoPrint" msgstr "Не удалось подключиться к OctoPrint" -#: src/slic3r/Utils/OctoPrint.cpp:172 +#: src/slic3r/Utils/OctoPrint.cpp:286 msgid "Note: OctoPrint version at least 1.1.0 is required." msgstr "Примечание: требуется версия OctoPrint не ниже 1.1.0." -#: src/slic3r/Utils/OctoPrint.cpp:292 +#: src/slic3r/Utils/OctoPrint.cpp:528 msgid "Connection to Prusa SL1 / SL1S works correctly." msgstr "Подключение к Prusa SL1 / SL1S установлено." -#: src/slic3r/Utils/OctoPrint.cpp:298 +#: src/slic3r/Utils/OctoPrint.cpp:534 msgid "Could not connect to Prusa SLA" msgstr "Не удалось подключиться к Prusa SLA" -#: src/slic3r/Utils/OctoPrint.cpp:336 +#: src/slic3r/Utils/OctoPrint.cpp:573 msgid "Connection to PrusaLink works correctly." msgstr "Подключение к PrusaLink установлено." -#: src/slic3r/Utils/OctoPrint.cpp:342 +#: src/slic3r/Utils/OctoPrint.cpp:579 msgid "Could not connect to PrusaLink" msgstr "Не удалось подключиться к PrusaLink" -#: src/slic3r/Utils/PresetUpdater.cpp:61 +#: src/slic3r/Utils/OctoPrint.cpp:776 +msgid "Storages found:" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "read only" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "no free space" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:781 +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%.%2%" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:64 #, boost-format msgid "Copying of file %1% to %2% failed: %3%" msgstr "Не удалось скопировать файл %1% в %2%: %3%" -#: src/slic3r/Utils/PresetUpdater.cpp:645 -#: src/slic3r/Utils/PresetUpdater.cpp:662 +#: src/slic3r/Utils/PresetUpdater.cpp:998 +#: src/slic3r/Utils/PresetUpdater.cpp:1015 msgid "Continue and install configuration updates?" msgstr "Продолжить и установить обновления конфигурации?" -#: src/slic3r/Utils/PresetUpdater.cpp:777 +#: src/slic3r/Utils/PresetUpdater.cpp:1021 +msgid "Installing profiles" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1071 +#, boost-format +msgid "Downloading resources for %1%." +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1171 msgid "" -"Configuration Updates causes a lost of preset modification.\n" +"Configuration Update will cause the preset modification to be lost.\n" "So, check unsaved changes and save them if necessary." msgstr "" -"Обновление конфигурации приводит к потере изменённых профилей.\n" -"Поэтому проверьте несохранённые изменения и при необходимости сохраните их." -#: src/slic3r/Utils/PresetUpdater.cpp:779 +#: src/slic3r/Utils/PresetUpdater.cpp:1173 msgid "Updating" msgstr "Обновление" -#: src/slic3r/Utils/PresetUpdater.cpp:808 +#: src/slic3r/Utils/PresetUpdater.cpp:1202 #, c-format, boost-format msgid "requires min. %s and max. %s" msgstr "требуется мин. %s и макс. %s" -#: src/slic3r/Utils/PresetUpdater.cpp:812 +#: src/slic3r/Utils/PresetUpdater.cpp:1206 #, c-format, boost-format msgid "requires min. %s" msgstr "требуется мин. %s" -#: src/slic3r/Utils/PresetUpdater.cpp:815 +#: src/slic3r/Utils/PresetUpdater.cpp:1209 #, c-format, boost-format msgid "requires max. %s" msgstr "требуется макс. %s" +#: src/slic3r/Utils/PresetUpdater.cpp:1362 +#, boost-format +msgid "Couldn't locate idx file %1% when performing updates." +msgstr "" + #: src/slic3r/Utils/Http.cpp:73 msgid "" "Could not detect system SSL certificate store. PrusaSlicer will be unable to " @@ -10290,23 +12018,23 @@ msgstr "" "Ошибка инициализации URL-адреса клиента. PrusaSlicer не сможет установить " "сетевые подключения. Смотрите журнал для дополнительные информации." -#: src/slic3r/Utils/Process.cpp:157 +#: src/slic3r/Utils/Process.cpp:164 msgid "Open G-code file:" msgstr "Выберите G-код файл:" -#: src/slic3r/Utils/Repetier.cpp:84 +#: src/slic3r/Utils/Repetier.cpp:103 msgid "Connection to Repetier works correctly." msgstr "Подключение к Repetier установлено." -#: src/slic3r/Utils/Repetier.cpp:90 +#: src/slic3r/Utils/Repetier.cpp:109 msgid "Could not connect to Repetier" msgstr "Не удалось подключиться к Repetier" -#: src/slic3r/Utils/Repetier.cpp:92 +#: src/slic3r/Utils/Repetier.cpp:111 msgid "Note: Repetier version at least 0.90.0 is required." msgstr "Примечание: Требуется версия Repetier не ниже 0.90.0." -#: src/slic3r/Utils/Repetier.cpp:246 +#: src/slic3r/Utils/Repetier.cpp:263 #, boost-format msgid "" "HTTP status: %1%\n" @@ -10315,7 +12043,7 @@ msgstr "" "Статус HTTP: %1%\n" "Текст сообщения: \"%2%\"" -#: src/slic3r/Utils/Repetier.cpp:253 +#: src/slic3r/Utils/Repetier.cpp:270 #, boost-format msgid "" "Parsing of host response failed.\n" @@ -10326,7 +12054,7 @@ msgstr "" "Текст сообщения: \"%1%\"\n" "Ошибка: \"%2%\"" -#: src/slic3r/Utils/Repetier.cpp:266 +#: src/slic3r/Utils/Repetier.cpp:283 #, boost-format msgid "" "Enumeration of host printers failed.\n" @@ -10359,25 +12087,25 @@ msgstr "Продолжить" msgid "Abort" msgstr "Прервать" -#: src/libslic3r/GCode.cpp:539 +#: src/libslic3r/GCode.cpp:490 msgid "There is an object with no extrusions in the first layer." msgstr "На первом слое модели имеется слой без экструзии." -#: src/libslic3r/GCode.cpp:570 +#: src/libslic3r/GCode.cpp:521 #, boost-format msgid "Empty layer between %1% and %2%." msgstr "Пустой слой между %1% и %2%." -#: src/libslic3r/GCode.cpp:573 +#: src/libslic3r/GCode.cpp:524 msgid "(Some lines not shown)" msgstr "(Некоторые строки не показаны)" -#: src/libslic3r/GCode.cpp:575 +#: src/libslic3r/GCode.cpp:526 #, boost-format msgid "Object name: %1%" msgstr "Имя модели: %1%" -#: src/libslic3r/GCode.cpp:576 +#: src/libslic3r/GCode.cpp:527 msgid "" "Make sure the object is printable. This is usually caused by negligibly " "small extrusions or by a faulty model. Try to repair the model or change its " @@ -10387,30 +12115,30 @@ msgstr "" "ничтожно малой экструзии или из-за повреждённой модели. Попробуйте " "отремонтировать модель или изменить её ориентацию на столе." -#: src/libslic3r/GCode.cpp:718 +#: src/libslic3r/GCode.cpp:669 msgid "Filament Start G-code" msgstr "Стартовый G-код прутка" -#: src/libslic3r/GCode.cpp:725 +#: src/libslic3r/GCode.cpp:676 msgid "Filament End G-code" msgstr "Завершающий G-код прутка" -#: src/libslic3r/GCode.cpp:764 +#: src/libslic3r/GCode.cpp:717 msgid "In the custom G-code were found reserved keywords:" msgstr "" "В пользовательском G-коде были обнаружены зарезервированные ключевые слова:" -#: src/libslic3r/GCode.cpp:766 +#: src/libslic3r/GCode.cpp:719 msgid "" "This may cause problems in g-code visualization and printing time estimation." msgstr "" "Это может вызвать проблемы с визуализацией g-кода и оценкой времени печати." -#: src/libslic3r/GCode.cpp:1200 src/libslic3r/GCode.cpp:1211 +#: src/libslic3r/GCode.cpp:1124 src/libslic3r/GCode.cpp:1135 msgid "No extrusions were generated for objects." msgstr "Экструзия для моделей не была сгенерирована." -#: src/libslic3r/GCode.cpp:1406 +#: src/libslic3r/GCode.cpp:1328 msgid "" "Your print is very close to the priming regions. Make sure there is no " "collision." @@ -10418,10 +12146,6 @@ msgstr "" "Модель(-и) находится очень близко к области предзарядки (область подготовки " "экструдера). Убедитесь, что не произойдёт столкновения." -#: src/libslic3r/ExtrusionEntity.cpp:344 src/libslic3r/ExtrusionEntity.cpp:380 -msgid "Mixed" -msgstr "Смешанный" - #: src/libslic3r/Flow.cpp:61 #, boost-format msgid "" @@ -10430,7 +12154,7 @@ msgstr "" "Не удаётся рассчитать ширину экструзии для %1%: Переменная \"%2%\" " "недоступна." -#: src/libslic3r/Format/3mf.cpp:1735 +#: src/libslic3r/Format/3mf.cpp:1880 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " @@ -10439,7 +12163,7 @@ msgstr "" "Выбранный 3mf файл не совместим, так как был сохранён в более новой версии " "%1%." -#: src/libslic3r/Format/3mf.cpp:1746 +#: src/libslic3r/Format/3mf.cpp:1891 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." @@ -10447,7 +12171,7 @@ msgstr "" "Выбранный 3MF файл содержит модель с нарисованными поддержками созданными с " "использованием более новой версии PrusaSlicer и несовместим." -#: src/libslic3r/Format/3mf.cpp:1750 +#: src/libslic3r/Format/3mf.cpp:1895 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." @@ -10455,7 +12179,7 @@ msgstr "" "Выбранный 3MF файл содержит модель с нарисованным швом созданным с " "использованием более новой версии PrusaSlicer и несовместим." -#: src/libslic3r/Format/3mf.cpp:1754 +#: src/libslic3r/Format/3mf.cpp:1899 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -10463,7 +12187,7 @@ msgstr "" "Выбранный 3MF файл содержит модель с мультиматериальной покраской созданной " "с использованием более новой версии PrusaSlicer и несовместим." -#: src/libslic3r/Format/AMF.cpp:993 +#: src/libslic3r/Format/AMF.cpp:1000 #, boost-format msgid "" "The selected amf file has been saved with a newer version of %1% and is not " @@ -10615,27 +12339,33 @@ msgstr "ошибка проверки" msgid "write calledback failed" msgstr "ошибка записи обратного вызова" -#: src/libslic3r/Print.cpp:454 +#: src/libslic3r/Print.cpp:473 msgid "All objects are outside of the print volume." msgstr "Все модели находятся за пределами области печати." -#: src/libslic3r/Print.cpp:457 +#: src/libslic3r/Print.cpp:476 msgid "The supplied settings will cause an empty print." msgstr "Заданные настройки приведут к пустой печати." -#: src/libslic3r/Print.cpp:461 +#: src/libslic3r/Print.cpp:480 msgid "Some objects are too close; your extruder will collide with them." msgstr "" "Некоторые модели находятся слишком близко друг к другу. Экструдер при печати " "столкнётся с ними." -#: src/libslic3r/Print.cpp:463 +#: src/libslic3r/Print.cpp:482 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." msgstr "" "Некоторые модели слишком высокие и при печати экструдер столкнётся с ними." -#: src/libslic3r/Print.cpp:472 +#: src/libslic3r/Print.cpp:486 +msgid "" +"Avoid crossing perimeters option and avoid crossing curled overhangs option " +"cannot be both enabled together." +msgstr "" + +#: src/libslic3r/Print.cpp:495 msgid "" "Only a single object may be printed at a time in Spiral Vase mode. Either " "remove all but the last object, or enable sequential mode by " @@ -10645,13 +12375,23 @@ msgstr "" "Либо оставьте на столе одну модель или включите последовательную печать с " "помощью \"complete_objects\"." -#: src/libslic3r/Print.cpp:476 +#: src/libslic3r/Print.cpp:499 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." msgstr "В режиме «Спиральная ваза» можно печатать только одним материалом." -#: src/libslic3r/Print.cpp:489 +#: src/libslic3r/Print.cpp:523 +msgid "" +"The print is taller than the maximum allowed height. You might want to " +"reduce the size of your model or change current print settings and retry." +msgstr "" + +#: src/libslic3r/Print.cpp:540 +msgid "Variable layer height is not supported with Organic supports." +msgstr "" + +#: src/libslic3r/Print.cpp:553 msgid "" "The wipe tower is only supported if all extruders have the same nozzle " "diameter and use filaments of the same diameter." @@ -10659,7 +12399,7 @@ msgstr "" "Режим черновой башни применим только в том случае, если все экструдеры имеют " "одинаковый диаметр сопла и используется пруток одного диаметра." -#: src/libslic3r/Print.cpp:495 +#: src/libslic3r/Print.cpp:559 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, " "RepRapFirmware and Repetier G-code flavors." @@ -10667,7 +12407,7 @@ msgstr "" "В настоящее время режим черновой башни поддерживается только следующими " "типами G-кода: Marlin, RepRap/Sprinter, RepRapFirmware, Repetier." -#: src/libslic3r/Print.cpp:497 +#: src/libslic3r/Print.cpp:561 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." @@ -10675,20 +12415,20 @@ msgstr "" "В настоящее время для режима черновой башни поддерживается только " "относительная адресация экструдера (use_relative_e_distances=1)." -#: src/libslic3r/Print.cpp:499 -msgid "Ooze prevention is currently not supported with the wipe tower enabled." +#: src/libslic3r/Print.cpp:563 +msgid "" +"Ooze prevention is only supported with the wipe tower when " +"'single_extruder_multi_material' is off." msgstr "" -"«Предотвращение течи материала» в настоящее время не поддерживается при " -"включённой черновой башне." -#: src/libslic3r/Print.cpp:501 +#: src/libslic3r/Print.cpp:565 msgid "" "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." msgstr "" "Черновая башня в настоящее время не поддерживает объёмные значения E " "(use_volumetric_e=0)." -#: src/libslic3r/Print.cpp:503 +#: src/libslic3r/Print.cpp:567 msgid "" "The Wipe Tower is currently not supported for multimaterial sequential " "prints." @@ -10696,7 +12436,7 @@ msgstr "" "В настоящее время режим черновой башни не поддерживает последовательную " "печать для мультиматериальных принтеров." -#: src/libslic3r/Print.cpp:524 +#: src/libslic3r/Print.cpp:577 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " "layer heights" @@ -10704,7 +12444,7 @@ msgstr "" "Режим черновой башни применим для нескольких моделей только в том случае, " "если они имеют одинаковую высоту слоя." -#: src/libslic3r/Print.cpp:526 +#: src/libslic3r/Print.cpp:579 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "over an equal number of raft layers" @@ -10712,7 +12452,7 @@ msgstr "" "Режим черновой башни применим для нескольких моделей только в том случае, " "если они имеют одинаковое число слоёв подложки." -#: src/libslic3r/Print.cpp:529 +#: src/libslic3r/Print.cpp:582 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "with the same support_material_contact_distance" @@ -10721,7 +12461,7 @@ msgstr "" "если они печатаются с одинаковым support_material_contact_distance " "(расстояние от поддержки до модели по вертикали)." -#: src/libslic3r/Print.cpp:531 +#: src/libslic3r/Print.cpp:584 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." @@ -10729,7 +12469,7 @@ msgstr "" "Режим черновой башни применим для нескольких моделей только в том случае, " "если они нарезаны одинаково." -#: src/libslic3r/Print.cpp:555 +#: src/libslic3r/Print.cpp:609 msgid "" "The Wipe tower is only supported if all objects have the same variable layer " "height" @@ -10737,26 +12477,26 @@ msgstr "" "Режим черновой башни применим только в том случае, если все модели имеют " "одну и туже переменную высоту слоя." -#: src/libslic3r/Print.cpp:579 +#: src/libslic3r/Print.cpp:633 msgid "" "One or more object were assigned an extruder that the printer does not have." msgstr "" "Для одного или нескольких моделей был назначен экструдер, который у принтера " "отсутствует." -#: src/libslic3r/Print.cpp:592 +#: src/libslic3r/Print.cpp:646 #, boost-format msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" msgstr "" "Значение параметра %1%=%2% мм слишком мало для печати при высоте слоя %3% мм" -#: src/libslic3r/Print.cpp:595 +#: src/libslic3r/Print.cpp:649 #, boost-format msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" msgstr "" "Чрезмерное значение параметра %1%=%2% мм для печати при диаметре сопла %3% мм" -#: src/libslic3r/Print.cpp:606 +#: src/libslic3r/Print.cpp:660 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " @@ -10768,36 +12508,23 @@ msgstr "" "(support_material_extruder == 0 или support_material_interface_extruder == " "0), все сопла должны иметь одинаковый диаметр." -#: src/libslic3r/Print.cpp:614 -msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers " -"need to be synchronized with the object layers." -msgstr "" -"Для того, чтобы режим черновой башни работал с растворимой поддержкой, слои " -"поддержки должны быть синхронизированы со слоями модели." - -#: src/libslic3r/Print.cpp:618 +#: src/libslic3r/Print.cpp:668 msgid "" -"The Wipe Tower currently supports the non-soluble supports only if they are " -"printed with the current extruder without triggering a tool change. (both " -"support_material_extruder and support_material_interface_extruder need to be " -"set to 0)." -msgstr "" -"В настоящее время режим черновой башни поддерживает нерастворимую поддержку " -"только в том случае, если они печатаются текущим экструдером, без запуска " -"смены инструмента. (Значения «Экструдер, печатающий поддержки/подложки/юбки» " -"и «Экструдер, печатающий связующий слой поддержки/подложки» должны быть " -"установлены в 0)." +"For the Wipe Tower to work with the soluble supports, the support layers " +"need to be synchronized with the object layers." +msgstr "" +"Для того, чтобы режим черновой башни работал с растворимой поддержкой, слои " +"поддержки должны быть синхронизированы со слоями модели." -#: src/libslic3r/Print.cpp:654 +#: src/libslic3r/Print.cpp:708 msgid "First layer height can't be greater than nozzle diameter" msgstr "Высота первого слоя не может быть больше диаметра сопла." -#: src/libslic3r/Print.cpp:659 +#: src/libslic3r/Print.cpp:713 msgid "Layer height can't be greater than nozzle diameter" msgstr "Высота слоя не может быть больше диаметра сопла" -#: src/libslic3r/Print.cpp:680 +#: src/libslic3r/Print.cpp:734 msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " @@ -10807,7 +12534,7 @@ msgstr "" "корректировать на каждом слое, чтобы предотвратить потерю точности с " "плавающей запятой. Добавьте \"G92 E0\" в layer_gcode." -#: src/libslic3r/Print.cpp:682 +#: src/libslic3r/Print.cpp:736 msgid "" "\"G92 E0\" was found in before_layer_gcode, which is incompatible with " "absolute extruder addressing." @@ -10815,7 +12542,7 @@ msgstr "" "В before_layer_gcode была найдена команда \"G92 E0\", которая несовместима с " "абсолютной адресацией экструдера." -#: src/libslic3r/Print.cpp:684 +#: src/libslic3r/Print.cpp:738 msgid "" "\"G92 E0\" was found in layer_gcode, which is incompatible with absolute " "extruder addressing." @@ -10823,27 +12550,79 @@ msgstr "" "В layer_gcode была найдена команда \"G92 E0\", которая несовместима с " "абсолютной адресацией экструдера." -#: src/libslic3r/Print.cpp:826 +#: src/libslic3r/Print.cpp:880 msgid "Infilling layers" msgstr "Заполнение слоёв" -#: src/libslic3r/Print.cpp:848 +#: src/libslic3r/Print.cpp:908 msgid "Generating skirt and brim" msgstr "Генерация юбки и каймы" -#: src/libslic3r/Print.cpp:896 +#: src/libslic3r/Print.cpp:956 msgid "Exporting G-code" msgstr "Экспорт в G-код" -#: src/libslic3r/Print.cpp:900 +#: src/libslic3r/Print.cpp:960 msgid "Generating G-code" msgstr "Генерация G-кода" +#: src/libslic3r/Print.cpp:1169 +msgid "Alert if supports needed" +msgstr "" + +#: src/libslic3r/Print.cpp:1174 +msgid "long bridging extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1175 +msgid "floating bridge anchors" +msgstr "" + +#: src/libslic3r/Print.cpp:1178 +msgid "collapsing overhang" +msgstr "" + +#: src/libslic3r/Print.cpp:1180 +msgid "loose extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1183 +msgid "low bed adhesion" +msgstr "" + +#: src/libslic3r/Print.cpp:1184 +msgid "floating object part" +msgstr "" + +#: src/libslic3r/Print.cpp:1185 +msgid "thin fragile section" +msgstr "" + +#: src/libslic3r/Print.cpp:1221 +msgid "Detected print stability issues" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "or" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "and" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "brim" +msgstr "" + +#: src/libslic3r/Print.cpp:1248 +msgid "Consider enabling supports" +msgstr "" + #: src/libslic3r/SLA/Pad.cpp:533 msgid "Pad brim size is too small for the current configuration." msgstr "Размер каймы подложки слишком мал для текущих настроек." -#: src/libslic3r/SLAPrint.cpp:628 +#: src/libslic3r/SLAPrint.cpp:546 msgid "" "Cannot proceed without support points! Add support points or disable support " "generation." @@ -10851,7 +12630,7 @@ msgstr "" "Невозможно продолжить без точек поддержки! Добавьте точки поддержки или " "отключите генерацию поддержки." -#: src/libslic3r/SLAPrint.cpp:640 +#: src/libslic3r/SLAPrint.cpp:558 msgid "" "Elevation is too low for object. Use the \"Pad around object\" feature to " "print the object without elevation." @@ -10859,7 +12638,7 @@ msgstr "" "Высота подъёма слишком низкая для модели. Используйте «Подложка вокруг " "модели», чтобы напечатать модель без подъёма." -#: src/libslic3r/SLAPrint.cpp:646 +#: src/libslic3r/SLAPrint.cpp:564 msgid "" "The endings of the support pillars will be deployed on the gap between the " "object and the pad. 'Support base safety distance' has to be greater than " @@ -10869,70 +12648,70 @@ msgstr "" "Чтобы избежать этого, «Безопасное расстояние основания поддержки» должно " "быть больше, чем параметр «Зазор между дном модели и подложкой»." -#: src/libslic3r/SLAPrint.cpp:661 +#: src/libslic3r/SLAPrint.cpp:579 msgid "Exposition time is out of printer profile bounds." msgstr "Время засветки основных слоёв выходит за пределы профиля принтера." -#: src/libslic3r/SLAPrint.cpp:668 +#: src/libslic3r/SLAPrint.cpp:586 msgid "Initial exposition time is out of printer profile bounds." msgstr "Время засветки начальных слоёв выходит за пределы профиля принтера." -#: src/libslic3r/SLAPrint.cpp:784 +#: src/libslic3r/SLAPrint.cpp:693 msgid "Slicing done" msgstr "Нарезка завершена" -#: src/libslic3r/SLAPrintSteps.cpp:47 +#: src/libslic3r/SLAPrintSteps.cpp:57 +msgid "Assembling model from parts" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:58 msgid "Hollowing model" msgstr "Создание полости в модели" -#: src/libslic3r/SLAPrintSteps.cpp:48 +#: src/libslic3r/SLAPrintSteps.cpp:59 msgid "Drilling holes into model." msgstr "Создание отверстий в модели." -#: src/libslic3r/SLAPrintSteps.cpp:49 +#: src/libslic3r/SLAPrintSteps.cpp:60 msgid "Slicing model" msgstr "Нарезка модели" -#: src/libslic3r/SLAPrintSteps.cpp:50 src/libslic3r/SLAPrintSteps.cpp:639 +#: src/libslic3r/SLAPrintSteps.cpp:61 src/libslic3r/SLAPrintSteps.cpp:691 msgid "Generating support points" msgstr "Генерация точек поддержки" -#: src/libslic3r/SLAPrintSteps.cpp:51 +#: src/libslic3r/SLAPrintSteps.cpp:62 msgid "Generating support tree" msgstr "Генерация древовидной поддержки" -#: src/libslic3r/SLAPrintSteps.cpp:52 +#: src/libslic3r/SLAPrintSteps.cpp:63 msgid "Generating pad" msgstr "Генерация подложки" -#: src/libslic3r/SLAPrintSteps.cpp:53 +#: src/libslic3r/SLAPrintSteps.cpp:64 msgid "Slicing supports" msgstr "Нарезка поддержки" -#: src/libslic3r/SLAPrintSteps.cpp:68 +#: src/libslic3r/SLAPrintSteps.cpp:79 msgid "Merging slices and calculating statistics" msgstr "Объединение срезов и подсчёт статистики" -#: src/libslic3r/SLAPrintSteps.cpp:69 +#: src/libslic3r/SLAPrintSteps.cpp:80 msgid "Rasterizing layers" msgstr "Растрирование слоёв" -#: src/libslic3r/SLAPrintSteps.cpp:435 -msgid "Too many overlapping holes." -msgstr "Слишком много пересекающихся отверстий." - -#: src/libslic3r/SLAPrintSteps.cpp:442 +#: src/libslic3r/SLAPrintSteps.cpp:255 msgid "" "Mesh to be hollowed is not suitable for hollowing (does not bound a volume)." msgstr "" "Сетка, для создания полости, не подходит для этого (она не ограничивает " "объём)." -#: src/libslic3r/SLAPrintSteps.cpp:450 +#: src/libslic3r/SLAPrintSteps.cpp:262 msgid "Unable to drill the current configuration of holes into the model." msgstr "Невозможно просверлить отверстия в модели с текущими настройками." -#: src/libslic3r/SLAPrintSteps.cpp:470 +#: src/libslic3r/SLAPrintSteps.cpp:271 msgid "" "Drilling holes into the mesh failed. This is usually caused by broken model. " "Try to fix it first." @@ -10940,27 +12719,34 @@ msgstr "" "Не удалось проделать отверстия в сетке модели. Обычно это связано с " "проблемой в самой модели. Попробуйте сначала починить её." -#: src/libslic3r/SLAPrintSteps.cpp:476 +#: src/libslic3r/SLAPrintSteps.cpp:279 msgid "Failed to drill some holes into the model" msgstr "Не удалось просверлить несколько отверстий в модели" -#: src/libslic3r/SLAPrintSteps.cpp:520 +#: src/libslic3r/SLAPrintSteps.cpp:289 +msgid "" +"Can't perform full mesh booleans! Some parts of the print will be previewed " +"with approximated meshes. This does not affect the quality of slices or the " +"physical print in any way." +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:510 msgid "" "Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "" "Нарезку пришлось остановить из-за внутренней ошибки: несоответствие индекса " "среза." -#: src/libslic3r/SLAPrintSteps.cpp:691 src/libslic3r/SLAPrintSteps.cpp:700 -#: src/libslic3r/SLAPrintSteps.cpp:738 +#: src/libslic3r/SLAPrintSteps.cpp:740 src/libslic3r/SLAPrintSteps.cpp:749 +#: src/libslic3r/SLAPrintSteps.cpp:787 msgid "Visualizing supports" msgstr "Визуализация поддержек" -#: src/libslic3r/SLAPrintSteps.cpp:730 +#: src/libslic3r/SLAPrintSteps.cpp:779 msgid "No pad can be generated for this model with the current configuration" msgstr "Для этой модели с текущими настройками нельзя создать подложку." -#: src/libslic3r/SLAPrintSteps.cpp:854 +#: src/libslic3r/SLAPrintSteps.cpp:908 msgid "" "There are unprintable objects. Try to adjust support settings to make the " "objects printable." @@ -10972,27 +12758,27 @@ msgstr "" msgid "Failed processing of the output_filename_format template." msgstr "Ошибка обработки шаблона output_filename_format." -#: src/libslic3r/PrintConfig.cpp:236 src/libslic3r/PrintConfig.cpp:237 +#: src/libslic3r/PrintConfig.cpp:254 src/libslic3r/PrintConfig.cpp:255 msgid "Printer technology" msgstr "Технология принтера" -#: src/libslic3r/PrintConfig.cpp:244 +#: src/libslic3r/PrintConfig.cpp:260 msgid "Bed shape" msgstr "Форма и размеры стола" -#: src/libslic3r/PrintConfig.cpp:249 +#: src/libslic3r/PrintConfig.cpp:265 msgid "Bed custom texture" msgstr "Пользовательская текстура стола" -#: src/libslic3r/PrintConfig.cpp:254 +#: src/libslic3r/PrintConfig.cpp:270 msgid "Bed custom model" msgstr "Пользовательская модель стола" -#: src/libslic3r/PrintConfig.cpp:259 +#: src/libslic3r/PrintConfig.cpp:275 msgid "Elephant foot compensation" msgstr "Компенсация расширения первого слоя" -#: src/libslic3r/PrintConfig.cpp:261 +#: src/libslic3r/PrintConfig.cpp:277 msgid "" "The first layer will be shrunk in the XY plane by the configured value to " "compensate for the 1st layer squish aka an Elephant Foot effect." @@ -11001,11 +12787,11 @@ msgstr "" "компенсировать эффект сплющивания первого слоя, известное как «слоновья " "нога»." -#: src/libslic3r/PrintConfig.cpp:269 +#: src/libslic3r/PrintConfig.cpp:285 msgid "G-code thumbnails" msgstr "Эскизы G-код" -#: src/libslic3r/PrintConfig.cpp:270 +#: src/libslic3r/PrintConfig.cpp:286 msgid "" "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " "following format: \"XxY, XxY, ...\"" @@ -11013,11 +12799,11 @@ msgstr "" "Размеры изображения, которые будут сохранены в файлах .sl1 / .sl1s в " "следующем формате: \"XxY, XxY, ...\"" -#: src/libslic3r/PrintConfig.cpp:276 +#: src/libslic3r/PrintConfig.cpp:292 msgid "Format of G-code thumbnails" msgstr "Формат эскизов G-кода" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:293 msgid "" "Format of G-code thumbnails: PNG for best quality, JPG for smallest size, " "QOI for low memory firmware" @@ -11025,7 +12811,7 @@ msgstr "" "Формат эскизов G-кода: PNG для наилучшего качества, JPG для наименьшего " "размера, QOI для прошивки с малым объемом памяти." -#: src/libslic3r/PrintConfig.cpp:288 +#: src/libslic3r/PrintConfig.cpp:301 msgid "" "This setting controls the height (and thus the total number) of the slices/" "layers. Thinner layers give better accuracy but take more time to print." @@ -11035,11 +12821,11 @@ msgstr "" "диаметр используемого сопла (желательно ставить не больше ¾ от этого " "диаметра)." -#: src/libslic3r/PrintConfig.cpp:295 +#: src/libslic3r/PrintConfig.cpp:308 msgid "Max print height" msgstr "Максимальная высота печати" -#: src/libslic3r/PrintConfig.cpp:296 +#: src/libslic3r/PrintConfig.cpp:309 msgid "" "Set this to the maximum height that can be reached by your extruder while " "printing." @@ -11047,11 +12833,11 @@ msgstr "" "Задаётся максимальная высота, которую может достичь ваш экструдер во время " "печати." -#: src/libslic3r/PrintConfig.cpp:304 +#: src/libslic3r/PrintConfig.cpp:317 msgid "Hostname, IP or URL" msgstr "Имя хоста, IP или URL" -#: src/libslic3r/PrintConfig.cpp:305 +#: src/libslic3r/PrintConfig.cpp:318 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the hostname, IP address or URL of the printer host instance. Print host " @@ -11065,11 +12851,11 @@ msgstr "" "получить, указав имя пользователя и пароль в поле URL-адрес в следующем " "формате: https://username:password@your-octopi-address" -#: src/libslic3r/PrintConfig.cpp:314 +#: src/libslic3r/PrintConfig.cpp:327 msgid "API Key / Password" msgstr "API-ключ / Пароль" -#: src/libslic3r/PrintConfig.cpp:315 +#: src/libslic3r/PrintConfig.cpp:328 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the API Key or the password required for authentication." @@ -11077,11 +12863,11 @@ msgstr "" "PrusaSlicer может загружать G-код файлы на хост принтера. Это поле должно " "содержать API ключ или пароль, необходимые для проверки подлинности." -#: src/libslic3r/PrintConfig.cpp:323 +#: src/libslic3r/PrintConfig.cpp:336 msgid "Name of the printer" msgstr "Название принтера" -#: src/libslic3r/PrintConfig.cpp:331 +#: src/libslic3r/PrintConfig.cpp:344 msgid "" "Custom CA certificate file can be specified for HTTPS OctoPrint connections, " "in crt/pem format. If left blank, the default OS CA certificate repository " @@ -11091,15 +12877,15 @@ msgstr "" "HTTPS к OctoPrint в формате crt/pem. Если оставить поле пустым, будет " "использоваться хранилище сертификатов ОС по умолчанию." -#: src/libslic3r/PrintConfig.cpp:347 +#: src/libslic3r/PrintConfig.cpp:360 msgid "Password" msgstr "Пароль" -#: src/libslic3r/PrintConfig.cpp:355 +#: src/libslic3r/PrintConfig.cpp:368 msgid "Ignore HTTPS certificate revocation checks" msgstr "Игнорировать проверки отзыва HTTPS сертификата" -#: src/libslic3r/PrintConfig.cpp:356 +#: src/libslic3r/PrintConfig.cpp:369 msgid "" "Ignore HTTPS certificate revocation checks in case of missing or offline " "distribution points. One may want to enable this option for self signed " @@ -11109,31 +12895,43 @@ msgstr "" "автономности точек распространения. Можно включить эту опцию для " "самоподписанных сертификатов в случае сбоя подключения." -#: src/libslic3r/PrintConfig.cpp:363 +#: src/libslic3r/PrintConfig.cpp:376 msgid "Printer preset names" msgstr "Имена профиля принтера" -#: src/libslic3r/PrintConfig.cpp:364 +#: src/libslic3r/PrintConfig.cpp:377 msgid "Names of presets related to the physical printer" msgstr "Имена профилей, связанных с физическим принтером" -#: src/libslic3r/PrintConfig.cpp:369 +#: src/libslic3r/PrintConfig.cpp:382 msgid "Authorization Type" msgstr "Тип авторизации" -#: src/libslic3r/PrintConfig.cpp:374 +#: src/libslic3r/PrintConfig.cpp:385 msgid "API key" msgstr "API-ключ" -#: src/libslic3r/PrintConfig.cpp:375 +#: src/libslic3r/PrintConfig.cpp:386 msgid "HTTP digest" msgstr "HTTP digest-авторизация" -#: src/libslic3r/PrintConfig.cpp:395 +#: src/libslic3r/PrintConfig.cpp:406 +msgid "Avoid crossing curled overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:407 +msgid "" +"Plan travel moves such that the extruder avoids areas where the filament may " +"be curled up. This is mostly happening on steeper rounded overhangs and may " +"cause a crash with the nozzle. This feature slows down both the print and " +"the G-code generation." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:414 msgid "Avoid crossing perimeters" msgstr "Избегать пересечения периметров" -#: src/libslic3r/PrintConfig.cpp:396 +#: src/libslic3r/PrintConfig.cpp:415 msgid "" "Optimize travel moves in order to minimize the crossing of perimeters. This " "is mostly useful with Bowden extruders which suffer from oozing. This " @@ -11145,11 +12943,11 @@ msgstr "" "расплавленного материала. Эта функция замедляет как печать, так и генерацию " "G-кода." -#: src/libslic3r/PrintConfig.cpp:403 +#: src/libslic3r/PrintConfig.cpp:422 msgid "Avoid crossing perimeters - Max detour length" msgstr "Избегать пересечения периметров - Макс. длина обхода" -#: src/libslic3r/PrintConfig.cpp:405 +#: src/libslic3r/PrintConfig.cpp:424 msgid "" "The maximum detour length for avoid crossing perimeters. If the detour is " "longer than this value, avoid crossing perimeters is not applied for this " @@ -11162,15 +12960,15 @@ msgstr "" "задана как в абсолютном значении, так и в процентах (например, 50%) от " "прямого пути перемещения." -#: src/libslic3r/PrintConfig.cpp:408 +#: src/libslic3r/PrintConfig.cpp:427 msgid "mm or % (zero to disable)" msgstr "мм или % (0 - отключено)" -#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:2839 +#: src/libslic3r/PrintConfig.cpp:434 src/libslic3r/PrintConfig.cpp:2927 msgid "Other layers" msgstr "Последующие слои" -#: src/libslic3r/PrintConfig.cpp:416 +#: src/libslic3r/PrintConfig.cpp:435 msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." @@ -11178,11 +12976,11 @@ msgstr "" "Температура подогреваемого стола для слоёв после первого. Установите 0, " "чтобы отключить команды управления температурой стола на выходе." -#: src/libslic3r/PrintConfig.cpp:419 +#: src/libslic3r/PrintConfig.cpp:438 msgid "Bed temperature" msgstr "Температура стола" -#: src/libslic3r/PrintConfig.cpp:426 +#: src/libslic3r/PrintConfig.cpp:445 msgid "" "This custom code is inserted at every layer change, right before the Z move. " "Note that you can use placeholder variables for all Slic3r settings as well " @@ -11193,11 +12991,11 @@ msgstr "" "шаблонные переменные для всех параметров PrusaSlicer, в том числе " "[layer_num] и [layer_z]." -#: src/libslic3r/PrintConfig.cpp:436 +#: src/libslic3r/PrintConfig.cpp:455 msgid "Between objects G-code" msgstr "G-код между моделями" -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:456 msgid "" "This code is inserted between objects when using sequential printing. By " "default extruder and bed temperature are reset using non-wait command; " @@ -11214,15 +13012,15 @@ msgstr "" "переменные для всех параметров PrusaSlicer, поэтому вы можете вставить " "команду \"M109 S[first_layer_temperature]\" где угодно." -#: src/libslic3r/PrintConfig.cpp:448 +#: src/libslic3r/PrintConfig.cpp:467 msgid "Number of solid layers to generate on bottom surfaces." msgstr "Количество сплошных слоёв при печати нижней поверхности модели." -#: src/libslic3r/PrintConfig.cpp:449 +#: src/libslic3r/PrintConfig.cpp:468 msgid "Bottom solid layers" msgstr "Нижних сплошных слоёв" -#: src/libslic3r/PrintConfig.cpp:457 +#: src/libslic3r/PrintConfig.cpp:476 msgid "" "The number of bottom solid layers is increased above bottom_solid_layers if " "necessary to satisfy minimum thickness of bottom shell." @@ -11231,15 +13029,15 @@ msgstr "" "значения bottom_solid_layers («Сплошных слоёв снизу») для удовлетворения " "минимальной толщины оболочки снизу." -#: src/libslic3r/PrintConfig.cpp:459 +#: src/libslic3r/PrintConfig.cpp:478 msgid "Minimum bottom shell thickness" msgstr "Минимальная толщина оболочки снизу" -#: src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:484 msgid "Bridge" msgstr "Мосты" -#: src/libslic3r/PrintConfig.cpp:466 +#: src/libslic3r/PrintConfig.cpp:485 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." @@ -11247,21 +13045,21 @@ msgstr "" "Ускорение, которое принтер будет использовать для печати мостов. Установить " "0, чтобы отключить управление ускорением для мостов." -#: src/libslic3r/PrintConfig.cpp:468 src/libslic3r/PrintConfig.cpp:639 -#: src/libslic3r/PrintConfig.cpp:1192 src/libslic3r/PrintConfig.cpp:1201 -#: src/libslic3r/PrintConfig.cpp:1401 src/libslic3r/PrintConfig.cpp:1410 -#: src/libslic3r/PrintConfig.cpp:1419 src/libslic3r/PrintConfig.cpp:1713 -#: src/libslic3r/PrintConfig.cpp:1764 src/libslic3r/PrintConfig.cpp:1775 -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1983 -#: src/libslic3r/PrintConfig.cpp:1991 +#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:1252 src/libslic3r/PrintConfig.cpp:1261 +#: src/libslic3r/PrintConfig.cpp:1447 src/libslic3r/PrintConfig.cpp:1456 +#: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1750 +#: src/libslic3r/PrintConfig.cpp:1801 src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1822 src/libslic3r/PrintConfig.cpp:2013 +#: src/libslic3r/PrintConfig.cpp:2021 msgid "mm/s²" msgstr "мм/с²" -#: src/libslic3r/PrintConfig.cpp:474 +#: src/libslic3r/PrintConfig.cpp:493 msgid "Bridging angle" msgstr "Угол (направление) печати мостов" -#: src/libslic3r/PrintConfig.cpp:476 +#: src/libslic3r/PrintConfig.cpp:495 msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for all " @@ -11271,36 +13069,31 @@ msgstr "" "угол печати мостов рассчитывается автоматически. В противном случае заданный " "угол будет использоваться для всех мостов. Для нулевого угла установите 180°." -#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:1102 -#: src/libslic3r/PrintConfig.cpp:2282 src/libslic3r/PrintConfig.cpp:2292 -#: src/libslic3r/PrintConfig.cpp:2583 src/libslic3r/PrintConfig.cpp:2824 -#: src/libslic3r/PrintConfig.cpp:3041 src/libslic3r/PrintConfig.cpp:3144 -#: src/libslic3r/PrintConfig.cpp:3698 src/libslic3r/PrintConfig.cpp:3819 -msgid "°" -msgstr "°" - -#: src/libslic3r/PrintConfig.cpp:485 +#: src/libslic3r/PrintConfig.cpp:504 msgid "Bridges fan speed" msgstr "Скорость вентилятора при печати мостов" -#: src/libslic3r/PrintConfig.cpp:486 +#: src/libslic3r/PrintConfig.cpp:505 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "" "Скорость вращения вентилятора при печати мостов и нависающих частей модели." -#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:1114 -#: src/libslic3r/PrintConfig.cpp:1601 src/libslic3r/PrintConfig.cpp:1793 -#: src/libslic3r/PrintConfig.cpp:1856 src/libslic3r/PrintConfig.cpp:2115 -#: src/libslic3r/PrintConfig.cpp:2174 src/libslic3r/PrintConfig.cpp:3323 -#: src/libslic3r/PrintConfig.cpp:3612 src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:596 +#: src/libslic3r/PrintConfig.cpp:605 src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:623 src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1893 src/libslic3r/PrintConfig.cpp:2145 +#: src/libslic3r/PrintConfig.cpp:2204 src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3369 src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3870 msgid "%" msgstr "%" -#: src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:513 msgid "Bridge flow ratio" msgstr "Коэффициент подачи пластика при печати мостов" -#: src/libslic3r/PrintConfig.cpp:496 +#: src/libslic3r/PrintConfig.cpp:515 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -11315,33 +13108,91 @@ msgstr "" "редактированием этого параметра не забывайте, что регулировать качество " "натяжки мостов можно и при помощи обдува модели." -#: src/libslic3r/PrintConfig.cpp:506 +#: src/libslic3r/PrintConfig.cpp:525 msgid "Bridges" msgstr "Мосты" -#: src/libslic3r/PrintConfig.cpp:508 +#: src/libslic3r/PrintConfig.cpp:527 msgid "Speed for printing bridges." msgstr "Скорость печати мостов." -#: src/libslic3r/PrintConfig.cpp:509 src/libslic3r/PrintConfig.cpp:920 -#: src/libslic3r/PrintConfig.cpp:928 src/libslic3r/PrintConfig.cpp:937 -#: src/libslic3r/PrintConfig.cpp:945 src/libslic3r/PrintConfig.cpp:972 -#: src/libslic3r/PrintConfig.cpp:991 src/libslic3r/PrintConfig.cpp:1329 -#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1620 -#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1730 -#: src/libslic3r/PrintConfig.cpp:1742 src/libslic3r/PrintConfig.cpp:1752 -#: src/libslic3r/PrintConfig.cpp:1815 src/libslic3r/PrintConfig.cpp:1874 -#: src/libslic3r/PrintConfig.cpp:2022 src/libslic3r/PrintConfig.cpp:2249 -#: src/libslic3r/PrintConfig.cpp:2258 src/libslic3r/PrintConfig.cpp:2789 -#: src/libslic3r/PrintConfig.cpp:2939 src/libslic3r/PrintConfig.cpp:2949 +#: src/libslic3r/PrintConfig.cpp:528 src/libslic3r/PrintConfig.cpp:1009 +#: src/libslic3r/PrintConfig.cpp:1017 src/libslic3r/PrintConfig.cpp:1026 +#: src/libslic3r/PrintConfig.cpp:1034 src/libslic3r/PrintConfig.cpp:1061 +#: src/libslic3r/PrintConfig.cpp:1080 src/libslic3r/PrintConfig.cpp:1386 +#: src/libslic3r/PrintConfig.cpp:1579 src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1733 src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1779 src/libslic3r/PrintConfig.cpp:1789 +#: src/libslic3r/PrintConfig.cpp:1852 src/libslic3r/PrintConfig.cpp:1911 +#: src/libslic3r/PrintConfig.cpp:2052 src/libslic3r/PrintConfig.cpp:2279 +#: src/libslic3r/PrintConfig.cpp:2288 src/libslic3r/PrintConfig.cpp:2810 +#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3037 msgid "mm/s" msgstr "мм/с" -#: src/libslic3r/PrintConfig.cpp:516 +#: src/libslic3r/PrintConfig.cpp:535 +msgid "Enable dynamic overhang speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:537 +msgid "This setting enables dynamic speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:541 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Speeds for overhang " +"sizes in between are calculated via linear interpolation. If set as " +"percentage, the speed is calculated over the external perimeter speed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:547 src/libslic3r/PrintConfig.cpp:594 +msgid "speed for 0% overlap (bridge)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:550 src/libslic3r/PrintConfig.cpp:559 +#: src/libslic3r/PrintConfig.cpp:568 src/libslic3r/PrintConfig.cpp:577 +#: src/libslic3r/PrintConfig.cpp:856 src/libslic3r/PrintConfig.cpp:1305 +#: src/libslic3r/PrintConfig.cpp:1316 src/libslic3r/PrintConfig.cpp:2387 +#: src/libslic3r/PrintConfig.cpp:2440 src/libslic3r/PrintConfig.cpp:2765 +#: src/libslic3r/PrintConfig.cpp:2997 +msgid "mm/s or %" +msgstr "мм/с или %" + +#: src/libslic3r/PrintConfig.cpp:556 src/libslic3r/PrintConfig.cpp:603 +msgid "speed for 25% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:612 +msgid "speed for 50% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:574 src/libslic3r/PrintConfig.cpp:621 +msgid "speed for 75% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:583 +msgid "Enable dynamic fan speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:584 +msgid "This setting enables dynamic fan speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:589 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Fan speeds for " +"overhang sizes in between are calculated via linear interpolation. " +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:630 msgid "Brim width" msgstr "Ширина каймы" -#: src/libslic3r/PrintConfig.cpp:518 +#: src/libslic3r/PrintConfig.cpp:632 msgid "" "The horizontal width of the brim that will be printed around each object on " "the first layer. When raft is used, no brim is generated (use " @@ -11351,37 +13202,37 @@ msgstr "" "на первом слое. При использовании подложки, кайма не создаётся (используйте " "raft_first_layer_expansion)." -#: src/libslic3r/PrintConfig.cpp:527 +#: src/libslic3r/PrintConfig.cpp:641 msgid "Brim type" msgstr "Тип каймы" -#: src/libslic3r/PrintConfig.cpp:529 +#: src/libslic3r/PrintConfig.cpp:643 msgid "" "The places where the brim will be printed around each object on the first " "layer." msgstr "Выбор места печати каймы вокруг каждой модели на первом слое." -#: src/libslic3r/PrintConfig.cpp:535 +#: src/libslic3r/PrintConfig.cpp:645 msgid "No brim" msgstr "Без каймы" -#: src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:646 msgid "Outer brim only" msgstr "Кайма только снаружи" -#: src/libslic3r/PrintConfig.cpp:537 +#: src/libslic3r/PrintConfig.cpp:647 msgid "Inner brim only" msgstr "Кайма только внутри" -#: src/libslic3r/PrintConfig.cpp:538 +#: src/libslic3r/PrintConfig.cpp:648 msgid "Outer and inner brim" msgstr "Кайма снаружи и внутри" -#: src/libslic3r/PrintConfig.cpp:543 +#: src/libslic3r/PrintConfig.cpp:654 msgid "Brim separation gap" msgstr "Смещение каймы" -#: src/libslic3r/PrintConfig.cpp:545 +#: src/libslic3r/PrintConfig.cpp:656 msgid "" "Offset of brim from the printed object. The offset is applied after the " "elephant foot compensation." @@ -11389,33 +13240,19 @@ msgstr "" "Смещение каймы от печатаемой модели. Смещение применяется после компенсации " "слоновьей ноги." -#: src/libslic3r/PrintConfig.cpp:552 -msgid "Clip multi-part objects" -msgstr "Обрезать составные модели (состоящие из нескольких частей)" - -#: src/libslic3r/PrintConfig.cpp:553 -msgid "" -"When printing multi-material objects, this settings will make Slic3r to clip " -"the overlapping object parts one by the other (2nd part will be clipped by " -"the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -msgstr "" -"При печати моделей несколькими материалами эта настройка заставляет " -"PrusaSlicer обрезать части, которые перекрываются друг другом (вторая часть " -"будет обрезана первой, третья - первой и второй и т.д.)." - -#: src/libslic3r/PrintConfig.cpp:560 +#: src/libslic3r/PrintConfig.cpp:663 msgid "Colorprint height" msgstr "Высота смены цвета" -#: src/libslic3r/PrintConfig.cpp:561 +#: src/libslic3r/PrintConfig.cpp:664 msgid "Heights at which a filament change is to occur." msgstr "Высота, на которой должна происходить смена прутка." -#: src/libslic3r/PrintConfig.cpp:571 +#: src/libslic3r/PrintConfig.cpp:674 msgid "Compatible printers condition" msgstr "Условия совместимости с принтером" -#: src/libslic3r/PrintConfig.cpp:572 +#: src/libslic3r/PrintConfig.cpp:675 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " @@ -11425,11 +13262,11 @@ msgstr "" "принтера. Если это выражение имеет значение true, этот профиль считается " "совместимым с активным профилем принтера." -#: src/libslic3r/PrintConfig.cpp:586 +#: src/libslic3r/PrintConfig.cpp:689 msgid "Compatible print profiles condition" msgstr "Условия совместимости профилей печати" -#: src/libslic3r/PrintConfig.cpp:587 +#: src/libslic3r/PrintConfig.cpp:690 msgid "" "A boolean expression using the configuration values of an active print " "profile. If this expression evaluates to true, this profile is considered " @@ -11439,11 +13276,11 @@ msgstr "" "печати. Если это выражение имеет значение true, этот профиль считается " "совместимым с активным профилем принтера." -#: src/libslic3r/PrintConfig.cpp:604 +#: src/libslic3r/PrintConfig.cpp:707 msgid "Complete individual objects" msgstr "Печатать модели по очереди" -#: src/libslic3r/PrintConfig.cpp:605 +#: src/libslic3r/PrintConfig.cpp:708 msgid "" "When printing multiple objects or copies, this feature will complete each " "object before moving onto next one (and starting it from its bottom layer). " @@ -11456,11 +13293,11 @@ msgstr "" "разнесены таким образом, что вся печатающая головка может перемещаться между " "ними." -#: src/libslic3r/PrintConfig.cpp:613 +#: src/libslic3r/PrintConfig.cpp:716 msgid "Enable auto cooling" msgstr "Автоматическое управление охлаждением" -#: src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:717 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." @@ -11468,26 +13305,26 @@ msgstr "" "Программа задействует алгоритм автоматического охлаждения и сама регулирует " "скорость печати и скорость вентилятора в зависимости от времени печати слоя." -#: src/libslic3r/PrintConfig.cpp:619 +#: src/libslic3r/PrintConfig.cpp:722 msgid "Cooling tube position" msgstr "Позиция охлаждающей трубки" -#: src/libslic3r/PrintConfig.cpp:620 +#: src/libslic3r/PrintConfig.cpp:723 msgid "Distance of the center-point of the cooling tube from the extruder tip." msgstr "" "Расстояние между центральной точкой охлаждающей трубки и кончиком экструдера." -#: src/libslic3r/PrintConfig.cpp:627 +#: src/libslic3r/PrintConfig.cpp:730 msgid "Cooling tube length" msgstr "Длина охлаждающей трубки" -#: src/libslic3r/PrintConfig.cpp:628 +#: src/libslic3r/PrintConfig.cpp:731 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "" "Длина трубки охлаждения для ограничения перемещения при охлаждающих " "движениях." -#: src/libslic3r/PrintConfig.cpp:636 +#: src/libslic3r/PrintConfig.cpp:739 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " @@ -11497,11 +13334,11 @@ msgstr "" "определённых настроек ускорения, например установленных для печати периметра/" "заполнения. Установите 0, чтобы предотвратить сброс ускорения вообще." -#: src/libslic3r/PrintConfig.cpp:645 +#: src/libslic3r/PrintConfig.cpp:748 msgid "Default filament profile" msgstr "Профиль прутка по умолчанию" -#: src/libslic3r/PrintConfig.cpp:646 +#: src/libslic3r/PrintConfig.cpp:749 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " @@ -11510,12 +13347,12 @@ msgstr "" "Профиль прутка по умолчанию, связанный с текущим профилем принтера. При " "выборе текущего профиля принтера, будет активирован этот профиль прутка." -#: src/libslic3r/PrintConfig.cpp:652 +#: src/libslic3r/PrintConfig.cpp:755 msgid "Default print profile" msgstr "Профиль печати по умолчанию" -#: src/libslic3r/PrintConfig.cpp:653 src/libslic3r/PrintConfig.cpp:3542 -#: src/libslic3r/PrintConfig.cpp:3553 +#: src/libslic3r/PrintConfig.cpp:756 src/libslic3r/PrintConfig.cpp:3819 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -11524,11 +13361,11 @@ msgstr "" "Профиль печати по умолчанию, связанный с текущим профилем принтера. При " "выборе текущего профиля принтера, будет активирован этот профиль печати." -#: src/libslic3r/PrintConfig.cpp:659 +#: src/libslic3r/PrintConfig.cpp:762 msgid "Disable fan for the first" msgstr "Не включать вентилятор на первых" -#: src/libslic3r/PrintConfig.cpp:660 +#: src/libslic3r/PrintConfig.cpp:763 msgid "" "You can set this to a positive value to disable fan at all during the first " "layers, so that it does not make adhesion worse." @@ -11536,25 +13373,25 @@ msgstr "" "Вы можете задать положительное значение, чтобы отключить вентилятор при " "печати первых слоёв, чтобы не ухудшить адгезию к столу." -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:772 msgid "Don't support bridges" msgstr "Не печатать поддержку под мостами" -#: src/libslic3r/PrintConfig.cpp:671 +#: src/libslic3r/PrintConfig.cpp:774 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." msgstr "Экспериментальная опция препятствующая печати поддержки под мостами." -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:780 msgid "Distance between copies" msgstr "Расстояние между копиями" -#: src/libslic3r/PrintConfig.cpp:678 +#: src/libslic3r/PrintConfig.cpp:781 msgid "Distance used for the auto-arrange feature of the plater." msgstr "Расстояние, между моделям при авторасстановке их на столе." -#: src/libslic3r/PrintConfig.cpp:686 +#: src/libslic3r/PrintConfig.cpp:789 msgid "" "This end procedure is inserted at the end of the output file. Note that you " "can use placeholder variables for all PrusaSlicer settings." @@ -11563,7 +13400,7 @@ msgstr "" "Обратите внимание, что вы можете использовать шаблонные переменные для всех " "параметров PrusaSlicer." -#: src/libslic3r/PrintConfig.cpp:696 +#: src/libslic3r/PrintConfig.cpp:799 msgid "" "This end procedure is inserted at the end of the output file, before the " "printer end gcode (and before any toolchange from this filament in case of " @@ -11578,24 +13415,11 @@ msgstr "" "PrusaSlicer. Если у вас несколько экструдеров, G-код обрабатывается в " "соответствии с порядковым номером экструдера." -#: src/libslic3r/PrintConfig.cpp:707 -msgid "Ensure vertical shell thickness" -msgstr "Обеспечивать вертикальную толщину оболочки" - -#: src/libslic3r/PrintConfig.cpp:709 -msgid "" -"Add solid infill near sloping surfaces to guarantee the vertical shell " -"thickness (top+bottom solid layers)." -msgstr "" -"Добавляет сплошные опоры у наклонных поверхностей для того, чтобы " -"гарантировать вертикальную толщину оболочки (верхние+нижние сплошные слои). " -"Это помогает избежать дыр на наклонной поверхности." - -#: src/libslic3r/PrintConfig.cpp:715 +#: src/libslic3r/PrintConfig.cpp:810 msgid "Top fill pattern" msgstr "Шаблон заполнения верхней поверхности" -#: src/libslic3r/PrintConfig.cpp:717 +#: src/libslic3r/PrintConfig.cpp:812 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." @@ -11603,45 +13427,45 @@ msgstr "" "Тип сетки, которой закрывается верхняя поверхность. Это влияет только на " "внешний видимый слой, а не на прилегающие к нему твёрдые оболочки." -#: src/libslic3r/PrintConfig.cpp:728 src/libslic3r/PrintConfig.cpp:1169 -#: src/libslic3r/PrintConfig.cpp:2754 src/libslic3r/PrintConfig.cpp:2771 +#: src/libslic3r/PrintConfig.cpp:815 src/libslic3r/PrintConfig.cpp:1228 +#: src/libslic3r/PrintConfig.cpp:2776 src/libslic3r/PrintConfig.cpp:2791 msgid "Rectilinear" msgstr "Прямолинейный" -#: src/libslic3r/PrintConfig.cpp:729 +#: src/libslic3r/PrintConfig.cpp:816 msgid "Monotonic" msgstr "Монотонный" -#: src/libslic3r/PrintConfig.cpp:730 +#: src/libslic3r/PrintConfig.cpp:817 msgid "Monotonic Lines" msgstr "" -#: src/libslic3r/PrintConfig.cpp:731 src/libslic3r/PrintConfig.cpp:1170 +#: src/libslic3r/PrintConfig.cpp:818 src/libslic3r/PrintConfig.cpp:1229 msgid "Aligned Rectilinear" msgstr "Выровн. прямолинейн." -#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:1176 -#: src/libslic3r/PrintConfig.cpp:2772 +#: src/libslic3r/PrintConfig.cpp:819 src/libslic3r/PrintConfig.cpp:1235 +#: src/libslic3r/PrintConfig.cpp:2792 msgid "Concentric" msgstr "Концентрический" -#: src/libslic3r/PrintConfig.cpp:733 src/libslic3r/PrintConfig.cpp:1180 +#: src/libslic3r/PrintConfig.cpp:820 src/libslic3r/PrintConfig.cpp:1239 msgid "Hilbert Curve" msgstr "Кривая Гильберта" -#: src/libslic3r/PrintConfig.cpp:734 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:821 src/libslic3r/PrintConfig.cpp:1240 msgid "Archimedean Chords" msgstr "Хорды Архимеда" -#: src/libslic3r/PrintConfig.cpp:735 src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:822 src/libslic3r/PrintConfig.cpp:1241 msgid "Octagram Spiral" msgstr "Спиральная октаграмма" -#: src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:830 msgid "Bottom fill pattern" msgstr "Шаблон заполнения нижней поверхности" -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:832 msgid "" "Fill pattern for bottom infill. This only affects the bottom external " "visible layer, and not its adjacent solid shells." @@ -11649,12 +13473,12 @@ msgstr "" "Тип сетки, которой закрывается нижняя поверхность. Это влияет только на " "нижний внешний видимый слой, а не на прилегающие к нему твёрдые оболочки." -#: src/libslic3r/PrintConfig.cpp:753 src/libslic3r/PrintConfig.cpp:765 -#: src/libslic3r/PrintConfig.cpp:1988 +#: src/libslic3r/PrintConfig.cpp:839 src/libslic3r/PrintConfig.cpp:851 +#: src/libslic3r/PrintConfig.cpp:2018 msgid "External perimeters" msgstr "Внешние периметры" -#: src/libslic3r/PrintConfig.cpp:755 +#: src/libslic3r/PrintConfig.cpp:841 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " "perimeters. If left zero, default extrusion width will be used if set, " @@ -11667,18 +13491,18 @@ msgstr "" "1,125 x диаметра сопла. Если задано в процентах, параметр вычисляется " "относительно высоты слоя." -#: src/libslic3r/PrintConfig.cpp:758 src/libslic3r/PrintConfig.cpp:869 -#: src/libslic3r/PrintConfig.cpp:1223 src/libslic3r/PrintConfig.cpp:1445 -#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1529 -#: src/libslic3r/PrintConfig.cpp:2011 src/libslic3r/PrintConfig.cpp:2397 -#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2660 -#: src/libslic3r/PrintConfig.cpp:2895 src/libslic3r/PrintConfig.cpp:3117 -#: src/libslic3r/PrintConfig.cpp:3132 src/libslic3r/PrintConfig.cpp:3166 -#: src/libslic3r/PrintConfig.cpp:3178 +#: src/libslic3r/PrintConfig.cpp:844 src/libslic3r/PrintConfig.cpp:958 +#: src/libslic3r/PrintConfig.cpp:1283 src/libslic3r/PrintConfig.cpp:1491 +#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1570 +#: src/libslic3r/PrintConfig.cpp:2041 src/libslic3r/PrintConfig.cpp:2428 +#: src/libslic3r/PrintConfig.cpp:2601 src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2983 src/libslic3r/PrintConfig.cpp:3204 +#: src/libslic3r/PrintConfig.cpp:3219 src/libslic3r/PrintConfig.cpp:3253 +#: src/libslic3r/PrintConfig.cpp:3265 msgid "mm or %" msgstr "мм или %" -#: src/libslic3r/PrintConfig.cpp:767 +#: src/libslic3r/PrintConfig.cpp:853 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " @@ -11688,18 +13512,11 @@ msgstr "" "задано в процентах, параметр вычисляется относительно скорости печати " "внутренних периметров. Установите 0 для автонастройки." -#: src/libslic3r/PrintConfig.cpp:770 src/libslic3r/PrintConfig.cpp:1245 -#: src/libslic3r/PrintConfig.cpp:1256 src/libslic3r/PrintConfig.cpp:2356 -#: src/libslic3r/PrintConfig.cpp:2409 src/libslic3r/PrintConfig.cpp:2740 -#: src/libslic3r/PrintConfig.cpp:2909 -msgid "mm/s or %" -msgstr "мм/с или %" - -#: src/libslic3r/PrintConfig.cpp:777 +#: src/libslic3r/PrintConfig.cpp:863 msgid "External perimeters first" msgstr "Внешние периметры печатать первыми" -#: src/libslic3r/PrintConfig.cpp:779 +#: src/libslic3r/PrintConfig.cpp:865 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." @@ -11709,11 +13526,12 @@ msgstr "" "параметр, печать будет идти в следующем порядке: сначала внешний, потом " "средний, потом внутренний слой." -#: src/libslic3r/PrintConfig.cpp:785 +#: src/libslic3r/PrintConfig.cpp:871 msgid "Extra perimeters if needed" msgstr "Дополнительные периметры при необходимости" -#: src/libslic3r/PrintConfig.cpp:787 +#: src/libslic3r/PrintConfig.cpp:873 +#, fuzzy msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " "keeps adding perimeters, until more than 70% of the loop immediately above " @@ -11723,7 +13541,18 @@ msgstr "" "пробелов в наклонных стенках. PrusaSlicer продолжит добавлять периметры пока " "в следующем слое не будет поддерживаться более 70% периметра." -#: src/libslic3r/PrintConfig.cpp:797 +#: src/libslic3r/PrintConfig.cpp:880 +msgid "Extra perimeters on overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:882 +msgid "" +"Detect overhang areas where bridges cannot be anchored, and fill them with " +"extra perimeter paths. These paths are anchored to the nearby non-overhang " +"area when possible." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:890 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " @@ -11733,7 +13562,7 @@ msgstr "" "экструдера). Это значение переопределяет экструдеры периметра и заполнения, " "но не экструдеры поддержки." -#: src/libslic3r/PrintConfig.cpp:809 +#: src/libslic3r/PrintConfig.cpp:898 msgid "" "Set this to the vertical distance between your nozzle tip and (usually) the " "X carriage rods. In other words, this is the height of the clearance " @@ -11745,7 +13574,7 @@ msgstr "" "вокруг экструдера, которая определяет максимальную глубину, до которой " "экструдер может опуститься, чтобы не столкнуться с моделью." -#: src/libslic3r/PrintConfig.cpp:820 +#: src/libslic3r/PrintConfig.cpp:909 msgid "" "Set this to the clearance radius around your extruder. If the extruder is " "not centered, choose the largest value for safety. This setting is used to " @@ -11756,22 +13585,22 @@ msgstr "" "используется для предотвращения столкновения экструдера с моделью и " "графического отображения на столе." -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:919 msgid "Extruder Color" msgstr "Цвет экструдера" -#: src/libslic3r/PrintConfig.cpp:831 src/libslic3r/PrintConfig.cpp:894 -#: src/libslic3r/PrintConfig.cpp:3394 +#: src/libslic3r/PrintConfig.cpp:920 src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:3666 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" "Этот параметр используется только в интерфейсе PrusaSlicer в качестве " "визуальной помощи." -#: src/libslic3r/PrintConfig.cpp:837 +#: src/libslic3r/PrintConfig.cpp:926 msgid "Extruder offset" msgstr "Смещение экструдера по осям X/Y" -#: src/libslic3r/PrintConfig.cpp:838 +#: src/libslic3r/PrintConfig.cpp:927 msgid "" "If your firmware doesn't handle the extruder displacement you need the G-" "code to take it into account. This option lets you specify the displacement " @@ -11784,11 +13613,11 @@ msgstr "" "экструдера относительно первого. Вводятся положительные координаты (они " "будут вычтены из XY координат)." -#: src/libslic3r/PrintConfig.cpp:847 +#: src/libslic3r/PrintConfig.cpp:936 msgid "Extrusion axis" msgstr "Экструзионные оси" -#: src/libslic3r/PrintConfig.cpp:848 +#: src/libslic3r/PrintConfig.cpp:937 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." @@ -11796,11 +13625,11 @@ msgstr "" "Используйте эту опцию, чтобы задать букву оси, связанную с экструдером " "вашего принтера (обычно это E, но на некоторых принтерах A)." -#: src/libslic3r/PrintConfig.cpp:853 +#: src/libslic3r/PrintConfig.cpp:942 msgid "Extrusion multiplier" msgstr "Экструзионный множитель" -#: src/libslic3r/PrintConfig.cpp:854 +#: src/libslic3r/PrintConfig.cpp:943 msgid "" "This factor changes the amount of flow proportionally. You may need to tweak " "this setting to get nice surface finish and correct single wall widths. " @@ -11814,11 +13643,11 @@ msgstr "" "1.1. Если вы считаете, что вам требуется большее значение, проверьте диаметр " "прутка и шаги экструдера в вашей прошивке." -#: src/libslic3r/PrintConfig.cpp:863 +#: src/libslic3r/PrintConfig.cpp:952 msgid "Default extrusion width" msgstr "Ширина экструзии по умолчанию" -#: src/libslic3r/PrintConfig.cpp:865 +#: src/libslic3r/PrintConfig.cpp:954 msgid "" "Set this to a non-zero value to allow a manual extrusion width. If left to " "zero, Slic3r derives extrusion widths from the nozzle diameter (see the " @@ -11830,11 +13659,11 @@ msgstr "" "заполнения. Если оставить 0, будет использоваться заданный диаметр сопла. " "Если задано в процентах, параметр вычисляется относительно высоты слоя." -#: src/libslic3r/PrintConfig.cpp:877 +#: src/libslic3r/PrintConfig.cpp:966 msgid "Keep fan always on" msgstr "Вентилятор включён всегда" -#: src/libslic3r/PrintConfig.cpp:878 +#: src/libslic3r/PrintConfig.cpp:967 msgid "" "If this is enabled, fan will never be disabled and will be kept running at " "least at its minimum speed. Useful for PLA, harmful for ABS." @@ -11842,11 +13671,11 @@ msgstr "" "Если эта опция включена, вентилятор никогда не будет отключаться и будет " "работать хотя бы на минимальной скорости. Полезно для PLA, вредно для ABS." -#: src/libslic3r/PrintConfig.cpp:883 +#: src/libslic3r/PrintConfig.cpp:972 msgid "Enable fan if layer print time is below" msgstr "Включить обдув, если время печати слоя менее" -#: src/libslic3r/PrintConfig.cpp:884 +#: src/libslic3r/PrintConfig.cpp:973 msgid "" "If layer print time is estimated below this number of seconds, fan will be " "enabled and its speed will be calculated by interpolating the minimum and " @@ -11856,27 +13685,27 @@ msgstr "" "включён вентилятор, и его скорость будет рассчитываться путём интерполяции " "минимальных и максимальных скоростей." -#: src/libslic3r/PrintConfig.cpp:886 src/libslic3r/PrintConfig.cpp:2344 +#: src/libslic3r/PrintConfig.cpp:975 src/libslic3r/PrintConfig.cpp:2375 msgid "approximate seconds" msgstr "приблизительно секунд" -#: src/libslic3r/PrintConfig.cpp:893 src/libslic3r/PrintConfig.cpp:3393 +#: src/libslic3r/PrintConfig.cpp:982 src/libslic3r/PrintConfig.cpp:3665 msgid "Color" msgstr "Цвет" -#: src/libslic3r/PrintConfig.cpp:899 +#: src/libslic3r/PrintConfig.cpp:988 msgid "Filament notes" msgstr "Примечание о прутке" -#: src/libslic3r/PrintConfig.cpp:900 +#: src/libslic3r/PrintConfig.cpp:989 msgid "You can put your notes regarding the filament here." msgstr "Здесь вы можете написать свои примечания относительно прутка." -#: src/libslic3r/PrintConfig.cpp:908 src/libslic3r/PrintConfig.cpp:1821 +#: src/libslic3r/PrintConfig.cpp:997 src/libslic3r/PrintConfig.cpp:1858 msgid "Max volumetric speed" msgstr "Максимальная объёмная скорость" -#: src/libslic3r/PrintConfig.cpp:909 +#: src/libslic3r/PrintConfig.cpp:998 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " @@ -11887,27 +13716,27 @@ msgstr "" "минимальной для этого принтера и прутка. Установите 0, чтобы убрать " "ограничения." -#: src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:1007 msgid "Loading speed" msgstr "Скорость загрузки" -#: src/libslic3r/PrintConfig.cpp:919 +#: src/libslic3r/PrintConfig.cpp:1008 msgid "Speed used for loading the filament on the wipe tower." msgstr "Скорость загрузки прутка при печати черновой башни." -#: src/libslic3r/PrintConfig.cpp:926 +#: src/libslic3r/PrintConfig.cpp:1015 msgid "Loading speed at the start" msgstr "Начальная скорость загрузки" -#: src/libslic3r/PrintConfig.cpp:927 +#: src/libslic3r/PrintConfig.cpp:1016 msgid "Speed used at the very beginning of loading phase." msgstr "Скорость в начальной фазе загрузки прутка." -#: src/libslic3r/PrintConfig.cpp:934 +#: src/libslic3r/PrintConfig.cpp:1023 msgid "Unloading speed" msgstr "Скорость выгрузки" -#: src/libslic3r/PrintConfig.cpp:935 +#: src/libslic3r/PrintConfig.cpp:1024 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." @@ -11915,20 +13744,20 @@ msgstr "" "Скорость выгрузки прутка на черновую башню. (не влияет на начальную фазу " "выгрузки сразу после рэмминга)." -#: src/libslic3r/PrintConfig.cpp:943 +#: src/libslic3r/PrintConfig.cpp:1032 msgid "Unloading speed at the start" msgstr "Начальная скорость выгрузки" -#: src/libslic3r/PrintConfig.cpp:944 +#: src/libslic3r/PrintConfig.cpp:1033 msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "Скорость выгрузки кончика прутка сразу после рэмминга." -#: src/libslic3r/PrintConfig.cpp:951 +#: src/libslic3r/PrintConfig.cpp:1040 msgid "Delay after unloading" msgstr "Задержка после выгрузки" -#: src/libslic3r/PrintConfig.cpp:952 +#: src/libslic3r/PrintConfig.cpp:1041 msgid "" "Time to wait after the filament is unloaded. May help to get reliable " "toolchanges with flexible materials that may need more time to shrink to " @@ -11938,11 +13767,11 @@ msgstr "" "сопло при печати гибкими материалами, которым требуется больше времени, " "чтобы вернуться к своим первоначальным размерам." -#: src/libslic3r/PrintConfig.cpp:961 +#: src/libslic3r/PrintConfig.cpp:1050 msgid "Number of cooling moves" msgstr "Количество охлаждающих движений" -#: src/libslic3r/PrintConfig.cpp:962 +#: src/libslic3r/PrintConfig.cpp:1051 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " "Specify desired number of these moves." @@ -11950,19 +13779,19 @@ msgstr "" "Пруток охлаждается в охлаждающих трубках путём перемещения назад и вперёд. " "Укажите желаемое количество таких движений." -#: src/libslic3r/PrintConfig.cpp:970 +#: src/libslic3r/PrintConfig.cpp:1059 msgid "Speed of the first cooling move" msgstr "Скорость первого охлаждающего движения" -#: src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:1060 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "Охлаждающие движения постепенно ускоряются, начиная с этой скорости." -#: src/libslic3r/PrintConfig.cpp:978 +#: src/libslic3r/PrintConfig.cpp:1067 msgid "Minimal purge on wipe tower" msgstr "Мин. объём сброса на черновой башне" -#: src/libslic3r/PrintConfig.cpp:979 +#: src/libslic3r/PrintConfig.cpp:1068 msgid "" "After a tool change, the exact position of the newly loaded filament inside " "the nozzle may not be known, and the filament pressure is likely not yet " @@ -11977,23 +13806,23 @@ msgstr "" "черновую башню, чтобы обеспечить надёжную печать заполнения или «жертвенной» " "модели." -#: src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:1072 msgid "mm³" msgstr "мм³" -#: src/libslic3r/PrintConfig.cpp:989 +#: src/libslic3r/PrintConfig.cpp:1078 msgid "Speed of the last cooling move" msgstr "Скорость последнего охлаждающего движения" -#: src/libslic3r/PrintConfig.cpp:990 +#: src/libslic3r/PrintConfig.cpp:1079 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "Охлаждающие движения постепенно ускоряют до этой скорости." -#: src/libslic3r/PrintConfig.cpp:997 +#: src/libslic3r/PrintConfig.cpp:1086 msgid "Filament load time" msgstr "Время загрузки пластика" -#: src/libslic3r/PrintConfig.cpp:998 +#: src/libslic3r/PrintConfig.cpp:1087 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " "filament during a tool change (when executing the T code). This time is " @@ -12004,11 +13833,11 @@ msgstr "" "добавляется к общему времени печати с помощью алгоритма оценки времени " "выполнения G-кода." -#: src/libslic3r/PrintConfig.cpp:1005 +#: src/libslic3r/PrintConfig.cpp:1094 msgid "Ramming parameters" msgstr "Параметры рэмминга" -#: src/libslic3r/PrintConfig.cpp:1006 +#: src/libslic3r/PrintConfig.cpp:1095 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." @@ -12016,11 +13845,11 @@ msgstr "" "Эта строка редактируется диалоговым окном рэмминга и содержит его конкретные " "параметры." -#: src/libslic3r/PrintConfig.cpp:1012 +#: src/libslic3r/PrintConfig.cpp:1101 msgid "Filament unload time" msgstr "Время выгрузки пластика" -#: src/libslic3r/PrintConfig.cpp:1013 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " "filament during a tool change (when executing the T code). This time is " @@ -12031,7 +13860,7 @@ msgstr "" "добавляется к общему времени печати с помощью алгоритма оценки времени " "выполнения G-кода." -#: src/libslic3r/PrintConfig.cpp:1021 +#: src/libslic3r/PrintConfig.cpp:1110 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " @@ -12041,12 +13870,12 @@ msgstr "" "используйте штангенциркуль, чтобы сделать несколько измерений вдоль прутка и " "вычислить среднее значение." -#: src/libslic3r/PrintConfig.cpp:1028 src/libslic3r/PrintConfig.cpp:3432 -#: src/libslic3r/PrintConfig.cpp:3433 +#: src/libslic3r/PrintConfig.cpp:1117 src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3710 msgid "Density" msgstr "Плотность" -#: src/libslic3r/PrintConfig.cpp:1029 +#: src/libslic3r/PrintConfig.cpp:1118 msgid "" "Enter your filament density here. This is only for statistical information. " "A decent way is to weigh a known length of filament and compute the ratio of " @@ -12059,27 +13888,27 @@ msgstr "" "его объёму. Объём же лучше вычислять непосредственно путём вытеснения " "жидкости." -#: src/libslic3r/PrintConfig.cpp:1032 +#: src/libslic3r/PrintConfig.cpp:1121 msgid "g/cm³" msgstr "г/см³" -#: src/libslic3r/PrintConfig.cpp:1037 +#: src/libslic3r/PrintConfig.cpp:1126 msgid "Filament type" msgstr "Тип прутка" -#: src/libslic3r/PrintConfig.cpp:1038 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "The filament material type for use in custom G-codes." msgstr "Тип прутка для использования в пользовательских G-кодах." -#: src/libslic3r/PrintConfig.cpp:1066 +#: src/libslic3r/PrintConfig.cpp:1155 msgid "Soluble material" msgstr "Растворимый материал" -#: src/libslic3r/PrintConfig.cpp:1067 +#: src/libslic3r/PrintConfig.cpp:1156 msgid "Soluble material is most likely used for a soluble support." msgstr "Растворимый материал, чаше всего используют для растворимой поддержки." -#: src/libslic3r/PrintConfig.cpp:1073 +#: src/libslic3r/PrintConfig.cpp:1162 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." @@ -12087,15 +13916,15 @@ msgstr "" "Введите стоимость прутка за 1 кг. Это необходимо только для статистической " "информации." -#: src/libslic3r/PrintConfig.cpp:1074 +#: src/libslic3r/PrintConfig.cpp:1163 msgid "money/kg" msgstr "цена/кг" -#: src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1168 msgid "Spool weight" msgstr "Вес пустой катушки" -#: src/libslic3r/PrintConfig.cpp:1080 +#: src/libslic3r/PrintConfig.cpp:1169 msgid "" "Enter weight of the empty filament spool. One may weigh a partially consumed " "filament spool before printing and one may compare the measured weight with " @@ -12107,19 +13936,19 @@ msgstr "" "израсходованную катушку с прутком и сравнить этот вес с весом прутка (с " "катушкой), рассчитанным в процессе нарезки модели." -#: src/libslic3r/PrintConfig.cpp:1084 +#: src/libslic3r/PrintConfig.cpp:1173 msgid "g" msgstr "г" -#: src/libslic3r/PrintConfig.cpp:1093 src/libslic3r/PrintConfig.cpp:3537 +#: src/libslic3r/PrintConfig.cpp:1182 src/libslic3r/PrintConfig.cpp:3814 msgid "(Unknown)" msgstr "(Неизвестно)" -#: src/libslic3r/PrintConfig.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:1186 msgid "Fill angle" msgstr "Угол печати заполнения" -#: src/libslic3r/PrintConfig.cpp:1099 +#: src/libslic3r/PrintConfig.cpp:1188 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " @@ -12129,66 +13958,66 @@ msgstr "" "штриховка крест-накрест. Для мостов будет использоваться лучший тип " "заполнения, так что этот параметр не влияет на них." -#: src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1199 msgid "Fill density" msgstr "Плотность заполнения" -#: src/libslic3r/PrintConfig.cpp:1113 +#: src/libslic3r/PrintConfig.cpp:1201 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "" "Плотность внутреннего заполнения, выраженная в диапазоне 0% - 100%. Чем выше " "процент заполнения, тем крепче получается модель, но печатается она при этом " "гораздо дольше." -#: src/libslic3r/PrintConfig.cpp:1148 +#: src/libslic3r/PrintConfig.cpp:1224 msgid "Fill pattern" msgstr "Шаблон заполнения" -#: src/libslic3r/PrintConfig.cpp:1150 +#: src/libslic3r/PrintConfig.cpp:1226 msgid "Fill pattern for general low-density infill." msgstr "Задаёт то каким рисунком будет напечатано заполнение." -#: src/libslic3r/PrintConfig.cpp:1171 src/libslic3r/PrintConfig.cpp:2803 +#: src/libslic3r/PrintConfig.cpp:1230 src/libslic3r/PrintConfig.cpp:2822 msgid "Grid" msgstr "Сетка" -#: src/libslic3r/PrintConfig.cpp:1173 +#: src/libslic3r/PrintConfig.cpp:1232 msgid "Stars" msgstr "Звезды" -#: src/libslic3r/PrintConfig.cpp:1174 +#: src/libslic3r/PrintConfig.cpp:1233 msgid "Cubic" msgstr "Кубический" -#: src/libslic3r/PrintConfig.cpp:1175 +#: src/libslic3r/PrintConfig.cpp:1234 msgid "Line" msgstr "Линии" -#: src/libslic3r/PrintConfig.cpp:1177 src/libslic3r/PrintConfig.cpp:2756 +#: src/libslic3r/PrintConfig.cpp:1236 src/libslic3r/PrintConfig.cpp:2778 msgid "Honeycomb" msgstr "Медовые соты" -#: src/libslic3r/PrintConfig.cpp:1178 +#: src/libslic3r/PrintConfig.cpp:1237 msgid "3D Honeycomb" msgstr "3D соты" -#: src/libslic3r/PrintConfig.cpp:1179 +#: src/libslic3r/PrintConfig.cpp:1238 msgid "Gyroid" msgstr "Гироидный" -#: src/libslic3r/PrintConfig.cpp:1183 +#: src/libslic3r/PrintConfig.cpp:1242 msgid "Adaptive Cubic" msgstr "Динамический куб" -#: src/libslic3r/PrintConfig.cpp:1184 +#: src/libslic3r/PrintConfig.cpp:1243 msgid "Support Cubic" msgstr "Динам. куб. поддержка" -#: src/libslic3r/PrintConfig.cpp:1185 +#: src/libslic3r/PrintConfig.cpp:1244 msgid "Lightning" msgstr "Молния" -#: src/libslic3r/PrintConfig.cpp:1190 +#: src/libslic3r/PrintConfig.cpp:1250 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." @@ -12196,11 +14025,11 @@ msgstr "" "Ускорение, которое принтер будет использовать для печати первого слоя. " "Установить 0, чтобы отключить управление ускорением для первого слоя." -#: src/libslic3r/PrintConfig.cpp:1198 +#: src/libslic3r/PrintConfig.cpp:1258 msgid "First object layer over raft interface" msgstr "Первый слой модели на подложке" -#: src/libslic3r/PrintConfig.cpp:1199 +#: src/libslic3r/PrintConfig.cpp:1259 msgid "" "This is the acceleration your printer will use for first layer of object " "above raft interface. Set zero to disable acceleration control for first " @@ -12210,11 +14039,11 @@ msgstr "" "по подложке. Установите ноль, чтобы отключить управление ускорением для " "печати первого слоя модели по подложке." -#: src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "First layer bed temperature" msgstr "Температура стола на первом слое" -#: src/libslic3r/PrintConfig.cpp:1209 +#: src/libslic3r/PrintConfig.cpp:1269 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." @@ -12222,7 +14051,7 @@ msgstr "" "Температура подогреваемого стола для первого слоя. Установите 0, чтобы " "отключить команды управления температурой стола на выходе." -#: src/libslic3r/PrintConfig.cpp:1219 +#: src/libslic3r/PrintConfig.cpp:1279 msgid "" "Set this to a non-zero value to set a manual extrusion width for first " "layer. You can use this to force fatter extrudates for better adhesion. If " @@ -12234,7 +14063,7 @@ msgstr "" "лучшей адгезии. Если задано в процентах, параметр вычисляется относительно " "высоты слоя. При 0, будет использоваться «Ширина экструзии по умолчанию»." -#: src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1293 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " @@ -12244,11 +14073,11 @@ msgstr "" "«Высота слоя» для лучшего закрепления (адгезии) модели на столе. Эта " "величина так же не может быть больше диаметра сопла." -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1301 msgid "First layer speed" msgstr "Скорость печати первого слоя" -#: src/libslic3r/PrintConfig.cpp:1242 +#: src/libslic3r/PrintConfig.cpp:1302 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " @@ -12260,11 +14089,11 @@ msgstr "" "по умолчанию. Как правило, для лучшего прилипания модели к столу задаётся " "меньше остальных на 30-50%." -#: src/libslic3r/PrintConfig.cpp:1252 +#: src/libslic3r/PrintConfig.cpp:1312 msgid "Speed of object first layer over raft interface" msgstr "Скорость печати первого слоя модели на подложке" -#: src/libslic3r/PrintConfig.cpp:1253 +#: src/libslic3r/PrintConfig.cpp:1313 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first object layer above raft interface, regardless " @@ -12277,11 +14106,11 @@ msgstr "" "выставленных скоростей по умолчанию. Как правило, для лучшего прилипания " "модели к столу задаётся меньше остальных на 30-50%." -#: src/libslic3r/PrintConfig.cpp:1263 +#: src/libslic3r/PrintConfig.cpp:1323 msgid "First layer nozzle temperature" msgstr "Температура сопла на первом слое" -#: src/libslic3r/PrintConfig.cpp:1264 +#: src/libslic3r/PrintConfig.cpp:1324 msgid "" "Nozzle temperature for the first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " @@ -12291,11 +14120,11 @@ msgstr "" "температуру во время печати вручную, установите 0 для отключения команд " "управления температурой в выходном G-коде." -#: src/libslic3r/PrintConfig.cpp:1272 +#: src/libslic3r/PrintConfig.cpp:1332 msgid "Full fan speed at layer" msgstr "Полная скорость вентилятора на слое" -#: src/libslic3r/PrintConfig.cpp:1273 +#: src/libslic3r/PrintConfig.cpp:1333 msgid "" "Fan speed will be ramped up linearly from zero at layer " "\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". " @@ -12309,23 +14138,23 @@ msgstr "" "\"disable_fan_first_layers\", и в этом случае вентилятор будет работать с " "максимально допустимой скоростью на слое \"disable_fan_first_layers\" +1." -#: src/libslic3r/PrintConfig.cpp:1285 +#: src/libslic3r/PrintConfig.cpp:1345 msgid "Fuzzy skin type." msgstr "Печать текстурированной оболочки." -#: src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1348 msgid "Outside walls" msgstr "Внешние стенки" -#: src/libslic3r/PrintConfig.cpp:1293 +#: src/libslic3r/PrintConfig.cpp:1349 msgid "All walls" msgstr "Все стенки" -#: src/libslic3r/PrintConfig.cpp:1298 +#: src/libslic3r/PrintConfig.cpp:1355 msgid "Fuzzy skin thickness" msgstr "Толщина нечёткой оболочки" -#: src/libslic3r/PrintConfig.cpp:1300 +#: src/libslic3r/PrintConfig.cpp:1357 msgid "" "The maximum distance that each skin point can be offset (both ways), " "measured perpendicular to the perimeter wall." @@ -12333,11 +14162,11 @@ msgstr "" "Максимальное расстояние смещения каждой точки оболочки (в обоих " "направлениях), измеряемое перпендикулярно стенке периметра." -#: src/libslic3r/PrintConfig.cpp:1308 +#: src/libslic3r/PrintConfig.cpp:1365 msgid "Fuzzy skin point distance" msgstr "Расстояние «дрожания» при печати нечёткой оболочки" -#: src/libslic3r/PrintConfig.cpp:1310 +#: src/libslic3r/PrintConfig.cpp:1367 msgid "" "Perimeters will be split into multiple segments by inserting Fuzzy skin " "points. Lowering the Fuzzy skin point distance will increase the number of " @@ -12347,11 +14176,11 @@ msgstr "" "оболочки. Уменьшение расстояния между точками нечёткой оболочки, увеличит " "число случайно смещенных точек на стенке периметра." -#: src/libslic3r/PrintConfig.cpp:1318 +#: src/libslic3r/PrintConfig.cpp:1375 msgid "Fill gaps" msgstr "Заполнения пробелов" -#: src/libslic3r/PrintConfig.cpp:1320 +#: src/libslic3r/PrintConfig.cpp:1377 msgid "" "Enables filling of gaps between perimeters and between the inner most " "perimeters and infill." @@ -12359,7 +14188,11 @@ msgstr "" "Позволяет заполнять пробелы между периметрами, и внутренними периметрами и " "заполнением." -#: src/libslic3r/PrintConfig.cpp:1327 +#: src/libslic3r/PrintConfig.cpp:1382 +msgid "Gap fill" +msgstr "Заполнение пробелов" + +#: src/libslic3r/PrintConfig.cpp:1384 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " @@ -12370,11 +14203,11 @@ msgstr "" "прилично трясти. Задавайте низкие значения, чтобы избежать этого. Установите " "0, чтобы отключить заполнение пробелов." -#: src/libslic3r/PrintConfig.cpp:1335 +#: src/libslic3r/PrintConfig.cpp:1392 msgid "Verbose G-code" msgstr "Подробный G-код" -#: src/libslic3r/PrintConfig.cpp:1336 +#: src/libslic3r/PrintConfig.cpp:1393 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " @@ -12384,11 +14217,11 @@ msgstr "" "комментарий с поясняющим текстом. При печати с SD-карты, скорость чтение " "данных вашей прошивкой может снизится за счёт увеличения размера файла." -#: src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1400 msgid "G-code flavor" msgstr "Тип G-кода" -#: src/libslic3r/PrintConfig.cpp:1344 +#: src/libslic3r/PrintConfig.cpp:1401 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " @@ -12400,15 +14233,15 @@ msgstr "" "получить совместимость. Параметр «Без экструзии» не позволяет PrusaSlicer " "экспортировать какие-либо значения экструзии." -#: src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1416 msgid "No extrusion" msgstr "Без экструзии" -#: src/libslic3r/PrintConfig.cpp:1376 +#: src/libslic3r/PrintConfig.cpp:1422 msgid "Label objects" msgstr "Название моделей" -#: src/libslic3r/PrintConfig.cpp:1377 +#: src/libslic3r/PrintConfig.cpp:1423 msgid "" "Enable this to add comments into the G-Code labeling print moves with what " "object they belong to, which is useful for the Octoprint CancelObject " @@ -12420,19 +14253,19 @@ msgstr "" "Эта настройка не совместима с настройкой «Мультиматериальный одиночный " "экструдер» и «Очистка в модель» / «Очистка в заполнение модели»." -#: src/libslic3r/PrintConfig.cpp:1384 +#: src/libslic3r/PrintConfig.cpp:1430 msgid "G-code substitutions" msgstr "Замена G-кода" -#: src/libslic3r/PrintConfig.cpp:1385 +#: src/libslic3r/PrintConfig.cpp:1431 msgid "Find / replace patterns in G-code lines and substitute them." msgstr "Поиск и замена кода в строках G-кода." -#: src/libslic3r/PrintConfig.cpp:1390 +#: src/libslic3r/PrintConfig.cpp:1436 msgid "High extruder current on filament swap" msgstr "Повышение тока экструдера при замене прутка" -#: src/libslic3r/PrintConfig.cpp:1391 +#: src/libslic3r/PrintConfig.cpp:1437 msgid "" "It may be beneficial to increase the extruder motor current during the " "filament exchange sequence to allow for rapid ramming feed rates and to " @@ -12442,7 +14275,7 @@ msgstr "" "замены прутка, чтобы быстро увеличить скорость подачи и преодолеть " "сопротивление при загрузке прутка с плохой формой кончика." -#: src/libslic3r/PrintConfig.cpp:1399 +#: src/libslic3r/PrintConfig.cpp:1445 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." @@ -12450,23 +14283,33 @@ msgstr "" "Ускорение, которое принтер будет использовать для заполнения. Установить 0, " "чтобы отключить управление ускорением для заполнения." -#: src/libslic3r/PrintConfig.cpp:1408 +#: src/libslic3r/PrintConfig.cpp:1453 src/libslic3r/PrintConfig.cpp:2423 +#: src/libslic3r/PrintConfig.cpp:2435 +msgid "Solid infill" +msgstr "Сплошное заполнение" + +#: src/libslic3r/PrintConfig.cpp:1454 msgid "" "This is the acceleration your printer will use for solid infill. Set zero to " "use the value for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:2977 +#: src/libslic3r/PrintConfig.cpp:2990 +msgid "Top solid infill" +msgstr "Верхний сплошной слой" + +#: src/libslic3r/PrintConfig.cpp:1463 msgid "" "This is the acceleration your printer will use for top solid infill. Set " "zero to use the value for solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1426 +#: src/libslic3r/PrintConfig.cpp:1472 msgid "Combine infill every" msgstr "Объединять заполнение каждые" -#: src/libslic3r/PrintConfig.cpp:1428 +#: src/libslic3r/PrintConfig.cpp:1474 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." @@ -12477,15 +14320,15 @@ msgstr "" "тогда на два слоя периметра будет печататься один слой заполнения удвоенной " "толщины. При этом сохраняются тонкие периметры, и тем самым точность." -#: src/libslic3r/PrintConfig.cpp:1431 +#: src/libslic3r/PrintConfig.cpp:1477 msgid "Combine infill every n layers" msgstr "Объединять заполнение каждые" -#: src/libslic3r/PrintConfig.cpp:1437 +#: src/libslic3r/PrintConfig.cpp:1483 msgid "Length of the infill anchor" msgstr "Длина привязок разреженного заполнения" -#: src/libslic3r/PrintConfig.cpp:1439 +#: src/libslic3r/PrintConfig.cpp:1485 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -12509,35 +14352,35 @@ msgstr "" "Установите этот параметр равным нулю для отключения привязок периметров, " "соединённых к одной линии заполнения." -#: src/libslic3r/PrintConfig.cpp:1455 +#: src/libslic3r/PrintConfig.cpp:1495 msgid "0 (no open anchors)" msgstr "0 (нет открытых привязок)" -#: src/libslic3r/PrintConfig.cpp:1456 src/libslic3r/PrintConfig.cpp:1479 +#: src/libslic3r/PrintConfig.cpp:1496 src/libslic3r/PrintConfig.cpp:1519 msgid "1 mm" msgstr "1 мм" -#: src/libslic3r/PrintConfig.cpp:1457 src/libslic3r/PrintConfig.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:1520 msgid "2 mm" msgstr "2 мм" -#: src/libslic3r/PrintConfig.cpp:1458 src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1498 src/libslic3r/PrintConfig.cpp:1521 msgid "5 mm" msgstr "5 мм" -#: src/libslic3r/PrintConfig.cpp:1459 src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1499 src/libslic3r/PrintConfig.cpp:1522 msgid "10 mm" msgstr "10 мм" -#: src/libslic3r/PrintConfig.cpp:1460 src/libslic3r/PrintConfig.cpp:1483 +#: src/libslic3r/PrintConfig.cpp:1500 src/libslic3r/PrintConfig.cpp:1523 msgid "1000 (unlimited)" msgstr "1000 (неограниченно)" -#: src/libslic3r/PrintConfig.cpp:1465 +#: src/libslic3r/PrintConfig.cpp:1506 msgid "Maximum length of the infill anchor" msgstr "Максимальная длина привязок разреженного заполнения" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1508 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -12558,19 +14401,19 @@ msgstr "" "заполнения» (infill_anchor), но не больше этого параметра. Установите этот " "параметр равным нулю для отключения привязок." -#: src/libslic3r/PrintConfig.cpp:1478 +#: src/libslic3r/PrintConfig.cpp:1518 msgid "0 (not anchored)" msgstr "0 (без привязок)" -#: src/libslic3r/PrintConfig.cpp:1488 +#: src/libslic3r/PrintConfig.cpp:1529 msgid "Infill extruder" msgstr "Экструдер заполнения" -#: src/libslic3r/PrintConfig.cpp:1490 +#: src/libslic3r/PrintConfig.cpp:1531 msgid "The extruder to use when printing infill." msgstr "Номер экструдера, которым печатается заполнение." -#: src/libslic3r/PrintConfig.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:1539 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill. If " "left zero, default extrusion width will be used if set, otherwise 1.125 x " @@ -12585,11 +14428,11 @@ msgstr "" "ускорить заполнение и сделать ваши детали прочнее. Если задано в процентах, " "параметр вычисляется относительно высоты слоя." -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1550 msgid "Infill before perimeters" msgstr "Сначала печатать заполнение" -#: src/libslic3r/PrintConfig.cpp:1510 +#: src/libslic3r/PrintConfig.cpp:1551 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." @@ -12598,11 +14441,11 @@ msgstr "" "заполнение. Включив этот параметр, сначала будет печататься заполнение, а " "потом периметр. Имеет смысл, если периметр печатается в один слой." -#: src/libslic3r/PrintConfig.cpp:1515 +#: src/libslic3r/PrintConfig.cpp:1556 msgid "Only infill where needed" msgstr "Заполнение только там, где нужно" -#: src/libslic3r/PrintConfig.cpp:1517 +#: src/libslic3r/PrintConfig.cpp:1558 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " @@ -12614,11 +14457,11 @@ msgstr "" "модели, поэтому пользоваться надо с осторожностью. Если включено, замедляет " "генерацию G-кода из-за многочисленных расчётов." -#: src/libslic3r/PrintConfig.cpp:1524 +#: src/libslic3r/PrintConfig.cpp:1565 msgid "Infill/perimeters overlap" msgstr "Перекрытие линий заполнения с линиями периметра" -#: src/libslic3r/PrintConfig.cpp:1526 +#: src/libslic3r/PrintConfig.cpp:1567 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -12631,25 +14474,25 @@ msgstr "" "задано в процентах, параметр вычисляется относительно ширины экструзии " "периметра." -#: src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "" "Скорость печати внутреннего заполнения. Если установлено 0, то слайсер " "автоматически настраивает этот параметр." -#: src/libslic3r/PrintConfig.cpp:1545 +#: src/libslic3r/PrintConfig.cpp:1586 msgid "Inherits profile" msgstr "Наследует профиль" -#: src/libslic3r/PrintConfig.cpp:1546 +#: src/libslic3r/PrintConfig.cpp:1587 msgid "Name of the profile, from which this profile inherits." msgstr "Имя профиля, от которого наследуется данный профиль." -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1600 msgid "Interface shells" msgstr "Связующие оболочки" -#: src/libslic3r/PrintConfig.cpp:1560 +#: src/libslic3r/PrintConfig.cpp:1601 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " @@ -12660,65 +14503,65 @@ msgstr "" "полупрозрачными материалами или растворимой поддержкой. Помогает избежать " "диффузию материалов." -#: src/libslic3r/PrintConfig.cpp:1568 +#: src/libslic3r/PrintConfig.cpp:1609 msgid "Maximum width of a segmented region" msgstr "Максимальная ширина сегментированной области" -#: src/libslic3r/PrintConfig.cpp:1569 +#: src/libslic3r/PrintConfig.cpp:1610 msgid "Maximum width of a segmented region. Zero disables this feature." msgstr "" "Максимальная ширина сегментированной области. Ноль отключает эту функцию." -#: src/libslic3r/PrintConfig.cpp:1570 src/libslic3r/PrintConfig.cpp:2189 -#: src/libslic3r/PrintConfig.cpp:2198 +#: src/libslic3r/PrintConfig.cpp:1611 src/libslic3r/PrintConfig.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2228 msgid "mm (zero to disable)" msgstr "мм (0 - отключено)" -#: src/libslic3r/PrintConfig.cpp:1577 +#: src/libslic3r/PrintConfig.cpp:1618 msgid "Enable ironing" msgstr "Вкл. разглаживание" -#: src/libslic3r/PrintConfig.cpp:1578 +#: src/libslic3r/PrintConfig.cpp:1619 msgid "" "Enable ironing of the top layers with the hot print head for smooth surface" msgstr "" "Включение разглаживания верхних слоёв с помощью горячего сопла для получения " "гладкой поверхности." -#: src/libslic3r/PrintConfig.cpp:1584 src/libslic3r/PrintConfig.cpp:1586 +#: src/libslic3r/PrintConfig.cpp:1625 src/libslic3r/PrintConfig.cpp:1627 msgid "Ironing Type" msgstr "Тип разглаживания" -#: src/libslic3r/PrintConfig.cpp:1591 +#: src/libslic3r/PrintConfig.cpp:1629 msgid "All top surfaces" msgstr "Все верхние поверхности" -#: src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Topmost surface only" msgstr "Самая верхняя поверхность" -#: src/libslic3r/PrintConfig.cpp:1593 +#: src/libslic3r/PrintConfig.cpp:1631 msgid "All solid surfaces" msgstr "Все сплошные поверхности" -#: src/libslic3r/PrintConfig.cpp:1598 +#: src/libslic3r/PrintConfig.cpp:1637 msgid "Flow rate" msgstr "Поток" -#: src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Percent of a flow rate relative to object's normal layer height." msgstr "" "Процент потока разглаживания относительно нормальной высоты слоя модели." -#: src/libslic3r/PrintConfig.cpp:1608 +#: src/libslic3r/PrintConfig.cpp:1647 msgid "Spacing between ironing passes" msgstr "Расстояние между линиями разглаживания" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1649 msgid "Distance between ironing lines" msgstr "Расстояние между линиями разглаживания." -#: src/libslic3r/PrintConfig.cpp:1627 +#: src/libslic3r/PrintConfig.cpp:1666 msgid "" "This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can " @@ -12730,11 +14573,11 @@ msgstr "" "Обратите внимание, что вы можете использовать шаблонные переменные для всех " "параметров PrusaSlicer в том числе [layer_num] и [layer_z]." -#: src/libslic3r/PrintConfig.cpp:1638 +#: src/libslic3r/PrintConfig.cpp:1677 msgid "Supports remaining times" msgstr "Поддержка точного времени печати" -#: src/libslic3r/PrintConfig.cpp:1639 +#: src/libslic3r/PrintConfig.cpp:1678 msgid "" "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " "intervals into the G-code to let the firmware show accurate remaining time. " @@ -12747,155 +14590,155 @@ msgstr "" "только прошивка Prusa i3 MK3 распознает команду M73. Также прошивка i3 MK3 " "поддерживает команду M73 Qxx Sxx для тихого режима печати." -#: src/libslic3r/PrintConfig.cpp:1647 +#: src/libslic3r/PrintConfig.cpp:1686 msgid "Supports stealth mode" msgstr "Поддержка тихого режима" -#: src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1687 msgid "The firmware supports stealth mode" msgstr "Прошивка должна поддерживать тихий режим" -#: src/libslic3r/PrintConfig.cpp:1653 +#: src/libslic3r/PrintConfig.cpp:1692 msgid "How to apply limits" msgstr "Как применять ограничения принтера" -#: src/libslic3r/PrintConfig.cpp:1654 +#: src/libslic3r/PrintConfig.cpp:1693 msgid "Purpose of Machine Limits" msgstr "Назначение ограничений принтера" -#: src/libslic3r/PrintConfig.cpp:1656 +#: src/libslic3r/PrintConfig.cpp:1695 msgid "How to apply the Machine Limits" msgstr "Как применять ограничения принтера" -#: src/libslic3r/PrintConfig.cpp:1661 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "Emit to G-code" msgstr "Отправлять в G-код" -#: src/libslic3r/PrintConfig.cpp:1662 +#: src/libslic3r/PrintConfig.cpp:1698 msgid "Use for time estimate" msgstr "Испол. для оценки времени" -#: src/libslic3r/PrintConfig.cpp:1663 +#: src/libslic3r/PrintConfig.cpp:1699 msgid "Ignore" msgstr "Игнорировать" -#: src/libslic3r/PrintConfig.cpp:1686 +#: src/libslic3r/PrintConfig.cpp:1723 msgid "Maximum feedrate X" msgstr "Максимальная скорость перемещения по X" -#: src/libslic3r/PrintConfig.cpp:1687 +#: src/libslic3r/PrintConfig.cpp:1724 msgid "Maximum feedrate Y" msgstr "Максимальная скорость перемещения по Y" -#: src/libslic3r/PrintConfig.cpp:1688 +#: src/libslic3r/PrintConfig.cpp:1725 msgid "Maximum feedrate Z" msgstr "Максимальная скорость перемещения по Z" -#: src/libslic3r/PrintConfig.cpp:1689 +#: src/libslic3r/PrintConfig.cpp:1726 msgid "Maximum feedrate E" msgstr "Максимальная скорость подачи у экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:1692 +#: src/libslic3r/PrintConfig.cpp:1729 msgid "Maximum feedrate of the X axis" msgstr "Максимальная скорость перемещения по оси X" -#: src/libslic3r/PrintConfig.cpp:1693 +#: src/libslic3r/PrintConfig.cpp:1730 msgid "Maximum feedrate of the Y axis" msgstr "Максимальная скорость перемещения по оси Y" -#: src/libslic3r/PrintConfig.cpp:1694 +#: src/libslic3r/PrintConfig.cpp:1731 msgid "Maximum feedrate of the Z axis" msgstr "Максимальная скорость перемещения по оси Z" -#: src/libslic3r/PrintConfig.cpp:1695 +#: src/libslic3r/PrintConfig.cpp:1732 msgid "Maximum feedrate of the E axis" msgstr "Максимальная скорость подачи у экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:1703 +#: src/libslic3r/PrintConfig.cpp:1740 msgid "Maximum acceleration X" msgstr "Максимальное ускорение по X" -#: src/libslic3r/PrintConfig.cpp:1704 +#: src/libslic3r/PrintConfig.cpp:1741 msgid "Maximum acceleration Y" msgstr "Максимальное ускорение по Y" -#: src/libslic3r/PrintConfig.cpp:1705 +#: src/libslic3r/PrintConfig.cpp:1742 msgid "Maximum acceleration Z" msgstr "Максимальное ускорение по Z" -#: src/libslic3r/PrintConfig.cpp:1706 +#: src/libslic3r/PrintConfig.cpp:1743 msgid "Maximum acceleration E" msgstr "Максимальное ускорение подачи у экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:1709 +#: src/libslic3r/PrintConfig.cpp:1746 msgid "Maximum acceleration of the X axis" msgstr "Максимальное ускорение при перемещении по оси X" -#: src/libslic3r/PrintConfig.cpp:1710 +#: src/libslic3r/PrintConfig.cpp:1747 msgid "Maximum acceleration of the Y axis" msgstr "Максимальное ускорение при перемещении по оси Y" -#: src/libslic3r/PrintConfig.cpp:1711 +#: src/libslic3r/PrintConfig.cpp:1748 msgid "Maximum acceleration of the Z axis" msgstr "Максимальное ускорение при перемещении по оси Z" -#: src/libslic3r/PrintConfig.cpp:1712 +#: src/libslic3r/PrintConfig.cpp:1749 msgid "Maximum acceleration of the E axis" msgstr "Максимальное ускорение подачи у экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:1720 +#: src/libslic3r/PrintConfig.cpp:1757 msgid "Maximum jerk X" msgstr "Максимальный рывок по X" -#: src/libslic3r/PrintConfig.cpp:1721 +#: src/libslic3r/PrintConfig.cpp:1758 msgid "Maximum jerk Y" msgstr "Максимальный рывок по Y" -#: src/libslic3r/PrintConfig.cpp:1722 +#: src/libslic3r/PrintConfig.cpp:1759 msgid "Maximum jerk Z" msgstr "Максимальный рывок по Z" -#: src/libslic3r/PrintConfig.cpp:1723 +#: src/libslic3r/PrintConfig.cpp:1760 msgid "Maximum jerk E" msgstr "Максимальный рывок у экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:1763 msgid "Maximum jerk of the X axis" msgstr "Максимальный рывок по оси X" -#: src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1764 msgid "Maximum jerk of the Y axis" msgstr "Максимальный рывок по оси Y" -#: src/libslic3r/PrintConfig.cpp:1728 +#: src/libslic3r/PrintConfig.cpp:1765 msgid "Maximum jerk of the Z axis" msgstr "Максимальный рывок по оси Z" -#: src/libslic3r/PrintConfig.cpp:1729 +#: src/libslic3r/PrintConfig.cpp:1766 msgid "Maximum jerk of the E axis" msgstr "Максимальный рывок у экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:1739 +#: src/libslic3r/PrintConfig.cpp:1776 msgid "Minimum feedrate when extruding" msgstr "Минимальная скорость перемещения при печати" -#: src/libslic3r/PrintConfig.cpp:1741 +#: src/libslic3r/PrintConfig.cpp:1778 msgid "Minimum feedrate when extruding (M205 S)" msgstr "Минимальная скорость перемещения при печати (M205 S)" -#: src/libslic3r/PrintConfig.cpp:1749 +#: src/libslic3r/PrintConfig.cpp:1786 msgid "Minimum travel feedrate" msgstr "Минимальная скорость перемещения без печати" -#: src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:1788 msgid "Minimum travel feedrate (M205 T)" msgstr "Минимальная скорость перемещения без печати (M205 T)" -#: src/libslic3r/PrintConfig.cpp:1759 +#: src/libslic3r/PrintConfig.cpp:1796 msgid "Maximum acceleration when extruding" msgstr "Максимальное ускорение при печати" -#: src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1798 msgid "" "Maximum acceleration when extruding (M204 P)\n" "\n" @@ -12907,31 +14750,31 @@ msgstr "" "В прошивке Marlin (legacy) это будет использоваться также в качестве " "ускорения при перемещении (M204T)." -#: src/libslic3r/PrintConfig.cpp:1772 +#: src/libslic3r/PrintConfig.cpp:1809 msgid "Maximum acceleration when retracting" msgstr "Максимальное ускорение ретракта" -#: src/libslic3r/PrintConfig.cpp:1774 +#: src/libslic3r/PrintConfig.cpp:1811 msgid "Maximum acceleration when retracting (M204 R)" msgstr "Максимальное ускорение ретракта (M204 R)" -#: src/libslic3r/PrintConfig.cpp:1782 +#: src/libslic3r/PrintConfig.cpp:1819 msgid "Maximum acceleration for travel moves" msgstr "Максимальное ускорение при перемещении" -#: src/libslic3r/PrintConfig.cpp:1784 +#: src/libslic3r/PrintConfig.cpp:1821 msgid "Maximum acceleration for travel moves (M204 T)" msgstr "Максимальное ускорение при перемещении (M204 T)" -#: src/libslic3r/PrintConfig.cpp:1791 src/libslic3r/PrintConfig.cpp:1800 +#: src/libslic3r/PrintConfig.cpp:1828 src/libslic3r/PrintConfig.cpp:1837 msgid "Max" msgstr "Макс." -#: src/libslic3r/PrintConfig.cpp:1792 +#: src/libslic3r/PrintConfig.cpp:1829 msgid "This setting represents the maximum speed of your fan." msgstr "Этот параметр регулирует максимальную скорость вращения вентилятора." -#: src/libslic3r/PrintConfig.cpp:1801 +#: src/libslic3r/PrintConfig.cpp:1838 msgid "" "This is the highest printable layer height for this extruder, used to cap " "the variable layer height and support layer height. Maximum recommended " @@ -12944,11 +14787,11 @@ msgstr "" "рекомендуемая высота слоя составляет 75% ширины экструзии. Если установлено " "0, высота слоя ограничивается 75% диаметра сопла." -#: src/libslic3r/PrintConfig.cpp:1811 +#: src/libslic3r/PrintConfig.cpp:1848 msgid "Max print speed" msgstr "Максимальная скорость печати" -#: src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1849 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " @@ -12959,7 +14802,7 @@ msgstr "" "экструдере. Этот экспериментальный параметр используется для задания " "желаемой вами максимальной скорости печати." -#: src/libslic3r/PrintConfig.cpp:1822 +#: src/libslic3r/PrintConfig.cpp:1859 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." @@ -12968,11 +14811,11 @@ msgstr "" "скорости подачи (выдавливания) материала, которую поддерживает ваш " "экструдер. 0 - без ограничений." -#: src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1867 msgid "Max volumetric slope positive" msgstr "Макс. положительное объёмное нависание" -#: src/libslic3r/PrintConfig.cpp:1831 +#: src/libslic3r/PrintConfig.cpp:1868 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from lower speed to higher speed. A value of 1.8 mm³/" @@ -12986,15 +14829,15 @@ msgstr "" "с (ширина экструзии 0.45 мм, высота экструзии 0.2 мм, скорость подачи 20 мм/" "с) до 5.4 мм³/с (скорость подачи 60 мм/с) займёт не менее 2-х секунд." -#: src/libslic3r/PrintConfig.cpp:1836 src/libslic3r/PrintConfig.cpp:1848 +#: src/libslic3r/PrintConfig.cpp:1873 src/libslic3r/PrintConfig.cpp:1885 msgid "mm³/s²" msgstr "мм³/с²" -#: src/libslic3r/PrintConfig.cpp:1842 +#: src/libslic3r/PrintConfig.cpp:1879 msgid "Max volumetric slope negative" msgstr "Макс. отрицательное объёмное нависание" -#: src/libslic3r/PrintConfig.cpp:1843 +#: src/libslic3r/PrintConfig.cpp:1880 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from higher speed to lower speed. A value of 1.8 mm³/" @@ -13008,15 +14851,15 @@ msgstr "" "с (ширина экструзии 0.45 мм, высота экструзии 0.2 мм, скорость подачи 60 мм/" "с) до 1.8 мм³/с (скорость подачи 20 мм/с) займёт не менее 2-х секунд." -#: src/libslic3r/PrintConfig.cpp:1854 src/libslic3r/PrintConfig.cpp:1863 +#: src/libslic3r/PrintConfig.cpp:1891 src/libslic3r/PrintConfig.cpp:1900 msgid "Min" msgstr "Мин." -#: src/libslic3r/PrintConfig.cpp:1855 +#: src/libslic3r/PrintConfig.cpp:1892 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "Этот параметр регулирует минимальную скорость вращения вентилятора." -#: src/libslic3r/PrintConfig.cpp:1864 +#: src/libslic3r/PrintConfig.cpp:1901 msgid "" "This is the lowest printable layer height for this extruder and limits the " "resolution for variable layer height. Typical values are between 0.05 mm and " @@ -13026,21 +14869,21 @@ msgstr "" "время нижний предел для функции «Переменная высота слоёв». Обычно это 0.05 " "или 0.1 мм." -#: src/libslic3r/PrintConfig.cpp:1872 +#: src/libslic3r/PrintConfig.cpp:1909 msgid "Min print speed" msgstr "Минимальная скорость печати" -#: src/libslic3r/PrintConfig.cpp:1873 +#: src/libslic3r/PrintConfig.cpp:1910 msgid "Slic3r will not scale speed down below this speed." msgstr "" "Нижний предел того, как медленно слой может быть напечатан. Slic3 не будет " "снижать скорость ниже этой." -#: src/libslic3r/PrintConfig.cpp:1880 +#: src/libslic3r/PrintConfig.cpp:1917 msgid "Minimal filament extrusion length" msgstr "Минимальная длина экструзии" -#: src/libslic3r/PrintConfig.cpp:1881 +#: src/libslic3r/PrintConfig.cpp:1918 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " @@ -13050,11 +14893,11 @@ msgstr "" "печати юбки в миллиметрах. Для принтеров с несколькими экструдерами этот " "минимум относится к каждому экструдеру." -#: src/libslic3r/PrintConfig.cpp:1890 +#: src/libslic3r/PrintConfig.cpp:1927 msgid "Configuration notes" msgstr "Примечание конфигурации" -#: src/libslic3r/PrintConfig.cpp:1891 +#: src/libslic3r/PrintConfig.cpp:1928 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." @@ -13062,16 +14905,16 @@ msgstr "" "Здесь вы можете оставить свои замечания для текущего профиля. Этот текст " "будет добавлен к комментариям в заголовок G-кода." -#: src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:1938 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "Диаметр используемого сопла (например: 0.5, 0.35 и др.)" -#: src/libslic3r/PrintConfig.cpp:1906 +#: src/libslic3r/PrintConfig.cpp:1943 msgid "Host Type" msgstr "Тип хоста" -#: src/libslic3r/PrintConfig.cpp:1907 +#: src/libslic3r/PrintConfig.cpp:1944 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." @@ -13079,11 +14922,11 @@ msgstr "" "PrusaSlicer может загружать G-код файлы на хост принтера. Это поле должно " "содержать тип хоста." -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:1961 msgid "Only retract when crossing perimeters" msgstr "Ретракт только при пересечении периметров" -#: src/libslic3r/PrintConfig.cpp:1930 +#: src/libslic3r/PrintConfig.cpp:1962 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." @@ -13091,21 +14934,17 @@ msgstr "" "При включённом параметре процесс ретракта включается только тогда, когда " "сопло выходит за внешний контур." -#: src/libslic3r/PrintConfig.cpp:1937 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "" "This option will drop the temperature of the inactive extruders to prevent " -"oozing. It will enable a tall skirt automatically and move extruders outside " -"such skirt when changing temperatures." +"oozing. " msgstr "" -"Этот параметр снижает температуру неактивных экструдеров для предотвращения " -"просачивания расплавленного материала из сопла. Это автоматически активирует " -"генерацию юбки и перемещает экструдеры на эту юбки при изменении температуры." -#: src/libslic3r/PrintConfig.cpp:1944 +#: src/libslic3r/PrintConfig.cpp:1974 msgid "Output filename format" msgstr "Формат выходного файла" -#: src/libslic3r/PrintConfig.cpp:1945 +#: src/libslic3r/PrintConfig.cpp:1975 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -13118,11 +14957,11 @@ msgstr "" "[day], [hour], [minute], [second], [version], [input_filename], " "[input_filename_base]." -#: src/libslic3r/PrintConfig.cpp:1954 +#: src/libslic3r/PrintConfig.cpp:1984 msgid "Detect bridging perimeters" msgstr "Определять нависающие периметры" -#: src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:1986 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." @@ -13131,11 +14970,11 @@ msgstr "" "рассчитает возможность их печати без поддержки, при этом увеличит обдув " "модели и выставит скорость печати, как при печати мостов." -#: src/libslic3r/PrintConfig.cpp:1962 +#: src/libslic3r/PrintConfig.cpp:1992 msgid "Filament parking position" msgstr "Положение парковки прутка" -#: src/libslic3r/PrintConfig.cpp:1963 +#: src/libslic3r/PrintConfig.cpp:1993 msgid "" "Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware." @@ -13143,11 +14982,11 @@ msgstr "" "Расстояние от кончика экструдера до точки, где размещается пруток при " "выгрузке. Расстояние должно соответствовать значению в прошивке принтера." -#: src/libslic3r/PrintConfig.cpp:1971 +#: src/libslic3r/PrintConfig.cpp:2001 msgid "Extra loading distance" msgstr "Дополнительная длина загрузки" -#: src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:2002 msgid "" "When set to zero, the distance the filament is moved from parking position " "during load is exactly the same as it was moved back during unload. When " @@ -13159,12 +14998,12 @@ msgstr "" "При положительном значении, она загружается дальше; при отрицательном, ход " "загрузки короче (по сравнению с выгрузкой)." -#: src/libslic3r/PrintConfig.cpp:1980 src/libslic3r/PrintConfig.cpp:2005 -#: src/libslic3r/PrintConfig.cpp:2019 src/libslic3r/PrintConfig.cpp:2029 +#: src/libslic3r/PrintConfig.cpp:2010 src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2049 src/libslic3r/PrintConfig.cpp:2059 msgid "Perimeters" msgstr "Периметры" -#: src/libslic3r/PrintConfig.cpp:1981 +#: src/libslic3r/PrintConfig.cpp:2011 msgid "" "This is the acceleration your printer will use for perimeters. Set zero to " "disable acceleration control for perimeters." @@ -13172,24 +15011,24 @@ msgstr "" "Это ускорение, которое ваш принтер будет использовать для печати периметров. " "Установите ноль, чтобы отключить управление ускорением по периметру." -#: src/libslic3r/PrintConfig.cpp:1989 +#: src/libslic3r/PrintConfig.cpp:2019 msgid "" "This is the acceleration your printer will use for external perimeters. Set " "zero to use the value for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1996 +#: src/libslic3r/PrintConfig.cpp:2026 msgid "Perimeter extruder" msgstr "Экструдер, печатающий внешние периметры" -#: src/libslic3r/PrintConfig.cpp:1998 +#: src/libslic3r/PrintConfig.cpp:2028 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" "Номер экструдера, которым печатаются внешние периметры модели и кайма. " "Первый экструдер - 1." -#: src/libslic3r/PrintConfig.cpp:2007 +#: src/libslic3r/PrintConfig.cpp:2037 msgid "" "Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. If " @@ -13204,14 +15043,14 @@ msgstr "" "1,125 x диаметра сопла. Если задано в процентах, параметр вычисляется " "относительно высоты слоя." -#: src/libslic3r/PrintConfig.cpp:2021 +#: src/libslic3r/PrintConfig.cpp:2051 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "" "Скорость печати периметров (контуров, иначе вертикальных стенок). Установите " "0 для автонастройки." -#: src/libslic3r/PrintConfig.cpp:2031 +#: src/libslic3r/PrintConfig.cpp:2061 msgid "" "This option sets the number of perimeters to generate for each layer. Note " "that Slic3r may increase this number automatically when it detects sloping " @@ -13224,11 +15063,11 @@ msgstr "" "«Дополнительные периметры при необходимости», PrusaSlicer может " "автоматически увеличить это значение, если обнаружит наклонные поверхности." -#: src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2065 msgid "(minimum)" msgstr "(минимум)" -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "" "If you want to process the output G-code through custom scripts, just list " "their absolute paths here. Separate multiple scripts with a semicolon. " @@ -13242,35 +15081,35 @@ msgstr "" "качестве первого аргумента, и они смогут получить доступ к настройкам " "конфигурации PrusaSlicer, читая переменные окружения." -#: src/libslic3r/PrintConfig.cpp:2055 +#: src/libslic3r/PrintConfig.cpp:2085 msgid "Printer type" msgstr "Тип принтера" -#: src/libslic3r/PrintConfig.cpp:2056 +#: src/libslic3r/PrintConfig.cpp:2086 msgid "Type of the printer." msgstr "Тип принтера." -#: src/libslic3r/PrintConfig.cpp:2061 +#: src/libslic3r/PrintConfig.cpp:2091 msgid "Printer notes" msgstr "Примечания к принтеру" -#: src/libslic3r/PrintConfig.cpp:2062 +#: src/libslic3r/PrintConfig.cpp:2092 msgid "You can put your notes regarding the printer here." msgstr "Здесь вы можете разместить свои заметки о принтере." -#: src/libslic3r/PrintConfig.cpp:2070 +#: src/libslic3r/PrintConfig.cpp:2100 msgid "Printer vendor" msgstr "Производитель принтера" -#: src/libslic3r/PrintConfig.cpp:2071 +#: src/libslic3r/PrintConfig.cpp:2101 msgid "Name of the printer vendor." msgstr "Название производителя принтера." -#: src/libslic3r/PrintConfig.cpp:2076 +#: src/libslic3r/PrintConfig.cpp:2106 msgid "Printer variant" msgstr "Модификация принтера" -#: src/libslic3r/PrintConfig.cpp:2077 +#: src/libslic3r/PrintConfig.cpp:2107 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." @@ -13278,38 +15117,38 @@ msgstr "" "Название модификации принтера. Например, это можно различать по диаметру " "сопла." -#: src/libslic3r/PrintConfig.cpp:2094 +#: src/libslic3r/PrintConfig.cpp:2124 msgid "Raft contact Z distance" msgstr "Расстояние от подложки до модели по вертикали" -#: src/libslic3r/PrintConfig.cpp:2096 +#: src/libslic3r/PrintConfig.cpp:2126 msgid "" "The vertical distance between object and raft. Ignored for soluble interface." msgstr "" "Вертикальное расстояние между подложкой и моделью. Значение игнорируется при " "выборе растворимого материала." -#: src/libslic3r/PrintConfig.cpp:2103 +#: src/libslic3r/PrintConfig.cpp:2133 msgid "Raft expansion" msgstr "Расширение подложки" -#: src/libslic3r/PrintConfig.cpp:2105 +#: src/libslic3r/PrintConfig.cpp:2135 msgid "Expansion of the raft in XY plane for better stability." msgstr "Расширение подложки в плоскости XY для лучшей устойчивости." -#: src/libslic3r/PrintConfig.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:2142 msgid "First layer density" msgstr "Плотность первого слоя" -#: src/libslic3r/PrintConfig.cpp:2114 +#: src/libslic3r/PrintConfig.cpp:2144 msgid "Density of the first raft or support layer." msgstr "Плотность первого слоя подложки или первого слоя поддержки." -#: src/libslic3r/PrintConfig.cpp:2122 +#: src/libslic3r/PrintConfig.cpp:2152 msgid "First layer expansion" msgstr "Расширение первого слоя" -#: src/libslic3r/PrintConfig.cpp:2124 +#: src/libslic3r/PrintConfig.cpp:2154 msgid "" "Expansion of the first raft or support layer to improve adhesion to print " "bed." @@ -13317,11 +15156,11 @@ msgstr "" "Расширение первого слоя подложки или первого слоя поддержки для улучшения " "адгезии к печатному столу." -#: src/libslic3r/PrintConfig.cpp:2131 +#: src/libslic3r/PrintConfig.cpp:2161 msgid "Raft layers" msgstr "Слоёв в подложке" -#: src/libslic3r/PrintConfig.cpp:2133 +#: src/libslic3r/PrintConfig.cpp:2163 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." @@ -13329,11 +15168,11 @@ msgstr "" "Параметр устанавливает высоту подложки в слоях. Ноль - отключает создание " "подложки." -#: src/libslic3r/PrintConfig.cpp:2141 +#: src/libslic3r/PrintConfig.cpp:2171 msgid "Slice resolution" msgstr "Разрешение нарезки" -#: src/libslic3r/PrintConfig.cpp:2142 +#: src/libslic3r/PrintConfig.cpp:2172 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -13346,11 +15185,11 @@ msgstr "" "могут выдать. Установите 0, чтобы отключить любое упрощение и использовать " "полное разрешение для входного файла." -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:2182 msgid "G-code resolution" msgstr "Разрешение G-кода" -#: src/libslic3r/PrintConfig.cpp:2153 +#: src/libslic3r/PrintConfig.cpp:2183 msgid "" "Maximum deviation of exported G-code paths from their full resolution " "counterparts. Very high resolution G-code requires huge amount of RAM to " @@ -13368,22 +15207,22 @@ msgstr "" "создавать низкополигональный эффект, и поскольку сокращение G-кода " "выполняется на каждом слое независимо, могут создаваться видимые артефакты." -#: src/libslic3r/PrintConfig.cpp:2164 +#: src/libslic3r/PrintConfig.cpp:2194 msgid "Minimum travel after retraction" msgstr "Минимальное расстояние перемещения для ретракта" -#: src/libslic3r/PrintConfig.cpp:2165 +#: src/libslic3r/PrintConfig.cpp:2195 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "" "Ретракт не будет срабатывать, если расстояние между точками печати меньше " "заданного значения." -#: src/libslic3r/PrintConfig.cpp:2171 +#: src/libslic3r/PrintConfig.cpp:2201 msgid "Retract amount before wipe" msgstr "Величина ретракта перед очисткой" -#: src/libslic3r/PrintConfig.cpp:2172 +#: src/libslic3r/PrintConfig.cpp:2202 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." @@ -13391,23 +15230,23 @@ msgstr "" "При использовании боуден-экструдеров, будет разумно сделать небольшое " "втягивание прутка перед тем, как совершить движение очистки." -#: src/libslic3r/PrintConfig.cpp:2179 +#: src/libslic3r/PrintConfig.cpp:2209 msgid "Retract on layer change" msgstr "Ретракт при смене слоя" -#: src/libslic3r/PrintConfig.cpp:2180 +#: src/libslic3r/PrintConfig.cpp:2210 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "Эта опция включает ретракт при переходе со слоя на слой." -#: src/libslic3r/PrintConfig.cpp:2185 src/libslic3r/PrintConfig.cpp:2193 +#: src/libslic3r/PrintConfig.cpp:2215 src/libslic3r/PrintConfig.cpp:2223 msgid "Length" msgstr "Длина" -#: src/libslic3r/PrintConfig.cpp:2186 +#: src/libslic3r/PrintConfig.cpp:2216 msgid "Retraction Length" msgstr "Длина ретракта" -#: src/libslic3r/PrintConfig.cpp:2187 +#: src/libslic3r/PrintConfig.cpp:2217 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " @@ -13416,11 +15255,11 @@ msgstr "" "Когда срабатывает ретракт, пруток втягивается назад на указанную величину " "(длина измеряется по «сырому» прутку, то есть до попадания её в экструдер)." -#: src/libslic3r/PrintConfig.cpp:2194 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Retraction Length (Toolchange)" msgstr "Длина ретракта (при смене инструмента)" -#: src/libslic3r/PrintConfig.cpp:2195 +#: src/libslic3r/PrintConfig.cpp:2225 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " @@ -13430,11 +15269,11 @@ msgstr "" "указанную величину (длина измеряется по «сырому» прутку, то есть до " "попадания его в экструдер)." -#: src/libslic3r/PrintConfig.cpp:2203 +#: src/libslic3r/PrintConfig.cpp:2233 msgid "Lift Z" msgstr "Приподнимать сопло на" -#: src/libslic3r/PrintConfig.cpp:2204 +#: src/libslic3r/PrintConfig.cpp:2234 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " @@ -13444,15 +15283,15 @@ msgstr "" "когда срабатывает ретракт. При использовании нескольких экструдеров будут " "учитываться настройки только первого экструдера." -#: src/libslic3r/PrintConfig.cpp:2211 +#: src/libslic3r/PrintConfig.cpp:2241 msgid "Above Z" msgstr "Выше" -#: src/libslic3r/PrintConfig.cpp:2212 +#: src/libslic3r/PrintConfig.cpp:2242 msgid "Only lift Z above" msgstr "Приподнимать сопло только выше" -#: src/libslic3r/PrintConfig.cpp:2213 +#: src/libslic3r/PrintConfig.cpp:2243 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " @@ -13462,15 +15301,15 @@ msgstr "" "(после) заданной здесь высоты (высота считается от стола). Таким образом вы " "можете отключить подъём сопла при печати на первых слоях (в начале печати)." -#: src/libslic3r/PrintConfig.cpp:2220 +#: src/libslic3r/PrintConfig.cpp:2250 msgid "Below Z" msgstr "Ниже" -#: src/libslic3r/PrintConfig.cpp:2221 +#: src/libslic3r/PrintConfig.cpp:2251 msgid "Only lift Z below" msgstr "Приподнимать сопло только ниже" -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2252 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " @@ -13480,11 +15319,11 @@ msgstr "" "(до) заданной здесь высоты (высота считается от стола). Таким образом вы " "можете запретить подъём сопла выше установленной высоты." -#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2238 +#: src/libslic3r/PrintConfig.cpp:2260 src/libslic3r/PrintConfig.cpp:2268 msgid "Extra length on restart" msgstr "Дополнительная длина подачи перед возобновлением печати" -#: src/libslic3r/PrintConfig.cpp:2231 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." @@ -13496,7 +15335,7 @@ msgstr "" "(например 0.5 мм), для уменьшения - отрицательное. Этот параметр редко " "необходим." -#: src/libslic3r/PrintConfig.cpp:2239 +#: src/libslic3r/PrintConfig.cpp:2269 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." @@ -13504,21 +15343,21 @@ msgstr "" "Компенсация длины выдавливаемого пластика перед возобновлением печати после " "смены сопла." -#: src/libslic3r/PrintConfig.cpp:2246 src/libslic3r/PrintConfig.cpp:2247 +#: src/libslic3r/PrintConfig.cpp:2276 src/libslic3r/PrintConfig.cpp:2277 msgid "Retraction Speed" msgstr "Скорость ретракта" -#: src/libslic3r/PrintConfig.cpp:2248 +#: src/libslic3r/PrintConfig.cpp:2278 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "" "Скорость с которой происходит ретракт - втягивание прутка (относится только " "к двигателю экструдера)." -#: src/libslic3r/PrintConfig.cpp:2254 src/libslic3r/PrintConfig.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:2284 src/libslic3r/PrintConfig.cpp:2285 msgid "Deretraction Speed" msgstr "Скорость компенсирующего ретракта" -#: src/libslic3r/PrintConfig.cpp:2256 +#: src/libslic3r/PrintConfig.cpp:2286 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " @@ -13528,73 +15367,87 @@ msgstr "" "двигателю экструдера). Если оставить ноль, будет использоваться скорость " "ретракта." -#: src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2293 msgid "Seam position" msgstr "Позиция шва" -#: src/libslic3r/PrintConfig.cpp:2265 +#: src/libslic3r/PrintConfig.cpp:2295 msgid "Position of perimeters starting points." msgstr "" "Этот параметр позволяет выбрать начальную точку каждого слоя в направлении " "Z, и таким образом определяет, где будет шов модели. Изменяя этот параметр " "можно уменьшить видимость шва." -#: src/libslic3r/PrintConfig.cpp:2272 +#: src/libslic3r/PrintConfig.cpp:2297 +msgid "Random" +msgstr "Случайно" + +#: src/libslic3r/PrintConfig.cpp:2298 msgid "Nearest" msgstr "Ближайшая" -#: src/libslic3r/PrintConfig.cpp:2273 +#: src/libslic3r/PrintConfig.cpp:2299 msgid "Aligned" msgstr "По краю" -#: src/libslic3r/PrintConfig.cpp:2281 +#: src/libslic3r/PrintConfig.cpp:2306 +msgid "Staggered inner seams" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2307 +msgid "" +"This option causes the inner seams to be shifted backwards based on their " +"depth, forming a zigzag pattern." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2314 msgid "Direction" msgstr "Направление" -#: src/libslic3r/PrintConfig.cpp:2283 +#: src/libslic3r/PrintConfig.cpp:2316 msgid "Preferred direction of the seam" msgstr "Предпочтительное направление шва" -#: src/libslic3r/PrintConfig.cpp:2284 +#: src/libslic3r/PrintConfig.cpp:2317 msgid "Seam preferred direction" msgstr "Предпочтительное направление шва" -#: src/libslic3r/PrintConfig.cpp:2291 +#: src/libslic3r/PrintConfig.cpp:2324 msgid "Jitter" msgstr "Разброс шва" -#: src/libslic3r/PrintConfig.cpp:2293 +#: src/libslic3r/PrintConfig.cpp:2326 msgid "Seam preferred direction jitter" msgstr "Предпочтительное направление разброса шва (в градусах)" -#: src/libslic3r/PrintConfig.cpp:2294 +#: src/libslic3r/PrintConfig.cpp:2327 msgid "Preferred direction of the seam - jitter" msgstr "Предпочтительное направление разброса шва (в градусах)" -#: src/libslic3r/PrintConfig.cpp:2301 +#: src/libslic3r/PrintConfig.cpp:2334 msgid "Distance from brim/object" msgstr "Расстояние между юбкой/каймой" -#: src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2335 msgid "" "Distance between skirt and brim (when draft shield is not used) or objects." msgstr "" "Расстояние между юбкой и каймой (если не используется защита от сквозняка) " "или моделью." -#: src/libslic3r/PrintConfig.cpp:2308 +#: src/libslic3r/PrintConfig.cpp:2341 msgid "Skirt height" msgstr "Слоёв юбки" -#: src/libslic3r/PrintConfig.cpp:2309 +#: src/libslic3r/PrintConfig.cpp:2342 msgid "Height of skirt expressed in layers." msgstr "Высота юбки в слоях." -#: src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2348 msgid "Draft shield" msgstr "Защитный кожух" -#: src/libslic3r/PrintConfig.cpp:2316 +#: src/libslic3r/PrintConfig.cpp:2349 msgid "" "With draft shield active, the skirt will be printed skirt_distance from the " "object, possibly intersecting brim.\n" @@ -13611,27 +15464,27 @@ msgstr "" "Это полезно для защиты материалов типа ABS или ASA от деформации и отрыва от " "стола из-за внешнего воздушного потока." -#: src/libslic3r/PrintConfig.cpp:2324 +#: src/libslic3r/PrintConfig.cpp:2354 msgid "Disabled" msgstr "Отключено" -#: src/libslic3r/PrintConfig.cpp:2325 +#: src/libslic3r/PrintConfig.cpp:2355 msgid "Limited" msgstr "Ограничено" -#: src/libslic3r/PrintConfig.cpp:2326 +#: src/libslic3r/PrintConfig.cpp:2356 msgid "Enabled" msgstr "Включено" -#: src/libslic3r/PrintConfig.cpp:2331 +#: src/libslic3r/PrintConfig.cpp:2362 msgid "Loops (minimum)" msgstr "Юбок вокруг модели (минимум)" -#: src/libslic3r/PrintConfig.cpp:2332 +#: src/libslic3r/PrintConfig.cpp:2363 msgid "Skirt Loops" msgstr "Петель юбки" -#: src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2364 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " @@ -13641,11 +15494,11 @@ msgstr "" "экструзии», количество юбок может быть больше, чем задано здесь. Чтобы " "полностью отключить юбку, установите 0." -#: src/libslic3r/PrintConfig.cpp:2341 +#: src/libslic3r/PrintConfig.cpp:2372 msgid "Slow down if layer print time is below" msgstr "Замедление при печати слоя менее" -#: src/libslic3r/PrintConfig.cpp:2342 +#: src/libslic3r/PrintConfig.cpp:2373 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." @@ -13654,11 +15507,11 @@ msgstr "" "печати будет пропорционально уменьшена, чтобы увеличить продолжительность до " "этого значения." -#: src/libslic3r/PrintConfig.cpp:2351 +#: src/libslic3r/PrintConfig.cpp:2382 msgid "Small perimeters" msgstr "Маленькие периметры" -#: src/libslic3r/PrintConfig.cpp:2353 +#: src/libslic3r/PrintConfig.cpp:2384 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " @@ -13669,11 +15522,11 @@ msgstr "" "вычисляется относительно скорости печати периметров указанной выше. " "Установите 0 для автонастройки." -#: src/libslic3r/PrintConfig.cpp:2363 +#: src/libslic3r/PrintConfig.cpp:2394 msgid "Solid infill threshold area" msgstr "Заполнение площади, меньше указанной" -#: src/libslic3r/PrintConfig.cpp:2365 +#: src/libslic3r/PrintConfig.cpp:2396 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." @@ -13681,23 +15534,23 @@ msgstr "" "Заполнение площади меньше указанной будет производиться \n" "100% (сплошным) заполнением." -#: src/libslic3r/PrintConfig.cpp:2366 +#: src/libslic3r/PrintConfig.cpp:2397 msgid "mm²" msgstr "мм²" -#: src/libslic3r/PrintConfig.cpp:2372 +#: src/libslic3r/PrintConfig.cpp:2403 msgid "Solid infill extruder" msgstr "Экструдер, печатающий сплошные слои заполнения" -#: src/libslic3r/PrintConfig.cpp:2374 +#: src/libslic3r/PrintConfig.cpp:2405 msgid "The extruder to use when printing solid infill." msgstr "Номер экструдера, которым печатаются сплошные слои заполнения." -#: src/libslic3r/PrintConfig.cpp:2380 +#: src/libslic3r/PrintConfig.cpp:2411 msgid "Solid infill every" msgstr "Сплошное заполнение каждые" -#: src/libslic3r/PrintConfig.cpp:2382 +#: src/libslic3r/PrintConfig.cpp:2413 msgid "" "This feature allows to force a solid layer every given number of layers. " "Zero to disable. You can set this to any value (for example 9999); Slic3r " @@ -13709,7 +15562,7 @@ msgstr "" "любое значение, PrusaSlicer автоматически выберет максимально возможное " "количество слоёв в зависимости от диаметра сопла и высоты слоя." -#: src/libslic3r/PrintConfig.cpp:2394 +#: src/libslic3r/PrintConfig.cpp:2425 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "solid surfaces. If left zero, default extrusion width will be used if set, " @@ -13722,7 +15575,7 @@ msgstr "" "использоваться 1,125 x диаметра сопла. Если задано в процентах, параметр " "вычисляется относительно высоты слоя." -#: src/libslic3r/PrintConfig.cpp:2406 +#: src/libslic3r/PrintConfig.cpp:2437 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " @@ -13732,20 +15585,20 @@ msgstr "" "оболочек). Если задано в процентах, параметр вычисляется относительно " "скорости заполнения указанной выше. Установите 0 для автонастройки." -#: src/libslic3r/PrintConfig.cpp:2418 +#: src/libslic3r/PrintConfig.cpp:2449 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "" "Количество сплошных слоёв при печати верхней и нижней поверхности модели." -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2455 src/libslic3r/PrintConfig.cpp:2456 msgid "Minimum thickness of a top / bottom shell" msgstr "Минимальная толщина оболочки сверху/снизу" -#: src/libslic3r/PrintConfig.cpp:2431 +#: src/libslic3r/PrintConfig.cpp:2462 msgid "Spiral vase" msgstr "Спиральная ваза" -#: src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2463 msgid "" "This feature will raise Z gradually while printing a single-walled object in " "order to remove any visible seam. This option requires a single perimeter, " @@ -13761,21 +15614,17 @@ msgstr "" "также печать юбки/каймы. При включении этого параметра невозможно напечатать " "горизонтальную плоскость - горизонтальные слои без поддержки будут провисать." -#: src/libslic3r/PrintConfig.cpp:2440 +#: src/libslic3r/PrintConfig.cpp:2471 msgid "Temperature variation" msgstr "Колебания температуры" -#: src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:2472 msgid "" -"Temperature difference to be applied when an extruder is not active. Enables " -"a full-height \"sacrificial\" skirt on which the nozzles are periodically " -"wiped." +"Temperature difference to be applied when an extruder is not active. The " +"value is not used when 'idle_temperature' in filament settings is defined." msgstr "" -"Разность температур, которая применяется, когда экструдер не используется. " -"Включает печать «жертвенной» юбки с высотой, равной высоте модели, об " -"которую сопла будут время от времени очищаться." -#: src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2483 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -13794,7 +15643,7 @@ msgstr "" "параметров PrusaSlicer, поэтому вы можете вставить команду \"M109 " "S[first_layer_temperature]\" где угодно." -#: src/libslic3r/PrintConfig.cpp:2466 +#: src/libslic3r/PrintConfig.cpp:2498 msgid "" "This start procedure is inserted at the beginning, after any printer start " "gcode (and after any toolchange to this filament in case of multi-material " @@ -13818,37 +15667,37 @@ msgstr "" "экструдеров, G-код обрабатывается в соответствии с порядковым номером " "экструдера." -#: src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2514 msgid "Color change G-code" msgstr "G-код смены цвета" -#: src/libslic3r/PrintConfig.cpp:2483 +#: src/libslic3r/PrintConfig.cpp:2515 msgid "This G-code will be used as a code for the color change" msgstr "Этот G-код будет использоваться для изменения цвета." -#: src/libslic3r/PrintConfig.cpp:2492 +#: src/libslic3r/PrintConfig.cpp:2524 msgid "This G-code will be used as a code for the pause print" msgstr "Этот G-код будет использоваться для паузы печати." -#: src/libslic3r/PrintConfig.cpp:2501 +#: src/libslic3r/PrintConfig.cpp:2533 msgid "This G-code will be used as a custom code" msgstr "Этот G-код будет использоваться для пользовательского кода." -#: src/libslic3r/PrintConfig.cpp:2509 +#: src/libslic3r/PrintConfig.cpp:2541 msgid "Single Extruder Multi Material" msgstr "Мультиматериальный одиночный экструдер" -#: src/libslic3r/PrintConfig.cpp:2510 +#: src/libslic3r/PrintConfig.cpp:2542 msgid "The printer multiplexes filaments into a single hot end." msgstr "" "Принтер способный печатать несколькими видами/цветами пластика (соединяя их " "в однин пруток) с одной экструзионной головкой." -#: src/libslic3r/PrintConfig.cpp:2515 +#: src/libslic3r/PrintConfig.cpp:2547 msgid "Prime all printing extruders" msgstr "Подготовка всех печатающих экструдеров" -#: src/libslic3r/PrintConfig.cpp:2516 +#: src/libslic3r/PrintConfig.cpp:2548 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." @@ -13856,11 +15705,11 @@ msgstr "" "Если этот параметр включён, все печатающие экструдеры в начале печати будут " "подготавливаться на переднем крае стола." -#: src/libslic3r/PrintConfig.cpp:2521 +#: src/libslic3r/PrintConfig.cpp:2553 msgid "No sparse layers (EXPERIMENTAL)" msgstr "Отсутствие разреженных слоёв (экспериментально)" -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2554 msgid "" "If enabled, the wipe tower will not be printed on layers with no " "toolchanges. On layers with a toolchange, extruder will travel downward to " @@ -13876,11 +15725,11 @@ msgstr "" "Пользователь несёт ответственность за то, чтобы избежать столкновения с " "напечатанным." -#: src/libslic3r/PrintConfig.cpp:2529 +#: src/libslic3r/PrintConfig.cpp:2561 msgid "Slice gap closing radius" msgstr "Радиус закрытия пробелов при нарезке" -#: src/libslic3r/PrintConfig.cpp:2531 +#: src/libslic3r/PrintConfig.cpp:2563 msgid "" "Cracks smaller than 2x gap closing radius are being filled during the " "triangle mesh slicing. The gap closing operation may reduce the final print " @@ -13891,11 +15740,11 @@ msgstr "" "окончательное разрешение печати, поэтому рекомендуется выставлять это " "значение достаточно низким." -#: src/libslic3r/PrintConfig.cpp:2539 +#: src/libslic3r/PrintConfig.cpp:2571 msgid "Slicing Mode" msgstr "Режим нарезки" -#: src/libslic3r/PrintConfig.cpp:2541 +#: src/libslic3r/PrintConfig.cpp:2573 msgid "" "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " "close all holes in the model." @@ -13903,33 +15752,33 @@ msgstr "" "Режим нарезки «чётный-нечётный» используется для моделей самолетов с ресурса " "3DLabPrint. А «Закрытие отверстий» для закрытия всех отверстий в модели." -#: src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2575 msgid "Regular" msgstr "Обычный" -#: src/libslic3r/PrintConfig.cpp:2547 +#: src/libslic3r/PrintConfig.cpp:2576 msgid "Even-odd" msgstr "Чётный-нечётный" -#: src/libslic3r/PrintConfig.cpp:2548 +#: src/libslic3r/PrintConfig.cpp:2577 msgid "Close holes" msgstr "Закрытие отверстий" -#: src/libslic3r/PrintConfig.cpp:2553 +#: src/libslic3r/PrintConfig.cpp:2583 msgid "Generate support material" msgstr "Генерация вспомогательных структур" -#: src/libslic3r/PrintConfig.cpp:2555 +#: src/libslic3r/PrintConfig.cpp:2585 msgid "Enable support material generation." msgstr "" "Включение печати вспомогательных структур, поддерживающих выступающие и " "свисающие элементы печатаемой модели." -#: src/libslic3r/PrintConfig.cpp:2559 +#: src/libslic3r/PrintConfig.cpp:2589 msgid "Auto generated supports" msgstr "Автоматически созданные поддержки" -#: src/libslic3r/PrintConfig.cpp:2561 +#: src/libslic3r/PrintConfig.cpp:2591 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " @@ -13940,11 +15789,11 @@ msgstr "" "не установлен, поддержка будет генерироваться только внутри значения " "принудительной поддержки заданной ниже." -#: src/libslic3r/PrintConfig.cpp:2567 +#: src/libslic3r/PrintConfig.cpp:2597 msgid "XY separation between an object and its support" msgstr "Зазор между моделью и поддержкой по осям XY" -#: src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2599 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." @@ -13953,11 +15802,11 @@ msgstr "" "процентах, то расстояние будет рассчитано исходя от ширины внешнего " "периметра." -#: src/libslic3r/PrintConfig.cpp:2580 +#: src/libslic3r/PrintConfig.cpp:2610 msgid "Pattern angle" msgstr "Угол печати поддержки и подложки" -#: src/libslic3r/PrintConfig.cpp:2582 +#: src/libslic3r/PrintConfig.cpp:2612 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." @@ -13965,18 +15814,18 @@ msgstr "" "Используйте этот параметр для поворота рисунка поддержки в горизонтальной " "плоскости." -#: src/libslic3r/PrintConfig.cpp:2592 src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:2622 src/libslic3r/PrintConfig.cpp:3411 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." msgstr "" "Создавать поддержки только от стола. Поддержки от модели построены не будут." -#: src/libslic3r/PrintConfig.cpp:2598 +#: src/libslic3r/PrintConfig.cpp:2627 msgid "Top contact Z distance" msgstr "Зазор поддержки сверху (по оси Z)" -#: src/libslic3r/PrintConfig.cpp:2600 +#: src/libslic3r/PrintConfig.cpp:2629 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " @@ -13986,23 +15835,23 @@ msgstr "" "установить 0, то PrusaSlicer не будет использовать функцию «Соотношение " "потока при печати мостов» и «Скорость печати первого слоя» модели." -#: src/libslic3r/PrintConfig.cpp:2608 +#: src/libslic3r/PrintConfig.cpp:2635 msgid "0 (soluble)" msgstr "0 (растворимые)" -#: src/libslic3r/PrintConfig.cpp:2609 +#: src/libslic3r/PrintConfig.cpp:2636 msgid "0.1 (detachable)" msgstr "0.1 (отделяемые)" -#: src/libslic3r/PrintConfig.cpp:2610 +#: src/libslic3r/PrintConfig.cpp:2637 msgid "0.2 (detachable)" msgstr "0.2 (нерастворимые)" -#: src/libslic3r/PrintConfig.cpp:2616 +#: src/libslic3r/PrintConfig.cpp:2643 msgid "Bottom contact Z distance" msgstr "Зазор поддержки снизу (по оси Z)" -#: src/libslic3r/PrintConfig.cpp:2618 +#: src/libslic3r/PrintConfig.cpp:2645 msgid "" "The vertical distance between the object top surface and the support " "material interface. If set to zero, support_material_contact_distance will " @@ -14012,17 +15861,15 @@ msgstr "" "support_material_contact_distance будет использоваться как для верхнего, так " "и для нижнего контакта." -#. TRN To be shown in Print Settings "Bottom contact Z distance". Have to be as short as possible -#. TRN To be shown in Print Settings "Bottom interface layers". Have to be as short as possible -#: src/libslic3r/PrintConfig.cpp:2626 src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2651 src/libslic3r/PrintConfig.cpp:2732 msgid "Same as top" msgstr "Как и сверху" -#: src/libslic3r/PrintConfig.cpp:2633 +#: src/libslic3r/PrintConfig.cpp:2659 msgid "Enforce support for the first" msgstr "Принудительная поддержка для первых" -#: src/libslic3r/PrintConfig.cpp:2635 +#: src/libslic3r/PrintConfig.cpp:2661 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -14034,15 +15881,15 @@ msgstr "" "полезно для получения лучшего прилипания моделей, имеющих очень тонкий или " "плохой контакт со столом." -#: src/libslic3r/PrintConfig.cpp:2640 +#: src/libslic3r/PrintConfig.cpp:2666 msgid "Enforce support for the first n layers" msgstr "Принудительная поддержка для первых n слоёв" -#: src/libslic3r/PrintConfig.cpp:2646 +#: src/libslic3r/PrintConfig.cpp:2672 msgid "Support material/raft/skirt extruder" msgstr "Экструдер, печатающий поддержки/подложки/юбки" -#: src/libslic3r/PrintConfig.cpp:2648 +#: src/libslic3r/PrintConfig.cpp:2674 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." @@ -14050,7 +15897,7 @@ msgstr "" "Номер экструдера, которым печатаются поддержка, подложка и юбка (1+, 0 для " "использования текущего экструдера для минимизации смены инструмента)." -#: src/libslic3r/PrintConfig.cpp:2657 +#: src/libslic3r/PrintConfig.cpp:2683 msgid "" "Set this to a non-zero value to set a manual extrusion width for support " "material. If left zero, default extrusion width will be used if set, " @@ -14063,22 +15910,22 @@ msgstr "" "диаметр сопла. Если задано в процентах, параметр вычисляется относительно " "высоты слоя." -#: src/libslic3r/PrintConfig.cpp:2667 +#: src/libslic3r/PrintConfig.cpp:2693 msgid "Interface loops" msgstr "Связующий слой петлями" -#: src/libslic3r/PrintConfig.cpp:2669 +#: src/libslic3r/PrintConfig.cpp:2695 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "Печатать верхний связующий слой петлями. По умолчанию отключено." -#: src/libslic3r/PrintConfig.cpp:2674 +#: src/libslic3r/PrintConfig.cpp:2700 msgid "Support material/raft interface extruder" msgstr "" "Экструдер, печатающий связующий\n" "слой поддержки/подложки" -#: src/libslic3r/PrintConfig.cpp:2676 +#: src/libslic3r/PrintConfig.cpp:2702 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." @@ -14087,37 +15934,37 @@ msgstr "" "использования текущего экструдера для минимизации смены инструмента). Это " "также влияет на печать подложки." -#: src/libslic3r/PrintConfig.cpp:2684 +#: src/libslic3r/PrintConfig.cpp:2709 msgid "Top interface layers" msgstr "Количество связующих слоёв сверху" -#: src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2711 msgid "" "Number of interface layers to insert between the object(s) and support " "material." msgstr "Количество связующих слоёв между моделью и материалом поддержки." -#: src/libslic3r/PrintConfig.cpp:2693 +#: src/libslic3r/PrintConfig.cpp:2715 src/libslic3r/PrintConfig.cpp:2733 msgid "0 (off)" msgstr "0 (откл.)" -#: src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2716 src/libslic3r/PrintConfig.cpp:2734 msgid "1 (light)" msgstr "слабые" -#: src/libslic3r/PrintConfig.cpp:2695 +#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2735 msgid "2 (default)" msgstr "2 (по умолчанию)" -#: src/libslic3r/PrintConfig.cpp:2696 +#: src/libslic3r/PrintConfig.cpp:2718 src/libslic3r/PrintConfig.cpp:2736 msgid "3 (heavy)" msgstr "3 (крепкие)" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:2724 msgid "Bottom interface layers" msgstr "Количество связующих слоёв снизу" -#: src/libslic3r/PrintConfig.cpp:2704 +#: src/libslic3r/PrintConfig.cpp:2726 msgid "" "Number of interface layers to insert between the object(s) and support " "material. Set to -1 to use support_material_interface_layers" @@ -14125,11 +15972,11 @@ msgstr "" "Количество связующих слоёв между моделью и материалом поддержки. Установите " "значение -1 чтобы использовать support_material_interface_layers" -#: src/libslic3r/PrintConfig.cpp:2717 +#: src/libslic3r/PrintConfig.cpp:2742 msgid "Closing radius" msgstr "Радиус закрытия пробелов" -#: src/libslic3r/PrintConfig.cpp:2719 +#: src/libslic3r/PrintConfig.cpp:2744 msgid "" "For snug supports, the support regions will be merged using morphological " "closing operation. Gaps smaller than the closing radius will be filled in." @@ -14138,17 +15985,21 @@ msgstr "" "использованием операции морфологического закрытия. Зазоры, меньшие радиуса " "закрытия, будут заполнены." -#: src/libslic3r/PrintConfig.cpp:2727 +#: src/libslic3r/PrintConfig.cpp:2752 msgid "Interface pattern spacing" msgstr "Расстояние между линиями связующей поддержки" -#: src/libslic3r/PrintConfig.cpp:2729 +#: src/libslic3r/PrintConfig.cpp:2754 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" "Расстояние между линиями связующей поддержки. Установите 0, чтобы получить " "сплошной слой." -#: src/libslic3r/PrintConfig.cpp:2738 +#: src/libslic3r/PrintConfig.cpp:2761 +msgid "Support material interface" +msgstr "Связующий слой поддержки" + +#: src/libslic3r/PrintConfig.cpp:2763 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " @@ -14157,23 +16008,23 @@ msgstr "" "Скорость печати связующих слоёв поддержки. Если она выражена в процентах, то " "будет рассчитана относительно скорости печати поддержки указанной выше." -#: src/libslic3r/PrintConfig.cpp:2747 +#: src/libslic3r/PrintConfig.cpp:2772 msgid "Pattern" msgstr "Шаблон поддержки и подложки" -#: src/libslic3r/PrintConfig.cpp:2749 +#: src/libslic3r/PrintConfig.cpp:2774 msgid "Pattern used to generate support material." msgstr "Шаблон, по которому будет происходить печать поддержки." -#: src/libslic3r/PrintConfig.cpp:2755 +#: src/libslic3r/PrintConfig.cpp:2777 msgid "Rectilinear grid" msgstr "Прямолинейная сетка" -#: src/libslic3r/PrintConfig.cpp:2761 +#: src/libslic3r/PrintConfig.cpp:2784 msgid "Interface pattern" msgstr "Шаблон связующего слоя поддержки" -#: src/libslic3r/PrintConfig.cpp:2763 +#: src/libslic3r/PrintConfig.cpp:2786 msgid "" "Pattern used to generate support material interface. Default pattern for non-" "soluble support interface is Rectilinear, while default pattern for soluble " @@ -14183,23 +16034,19 @@ msgstr "" "выборе по умолчанию, шаблон для нерастворимых поддержек - прямолинейный, для " "растворимых - концентрический." -#: src/libslic3r/PrintConfig.cpp:2777 +#: src/libslic3r/PrintConfig.cpp:2798 msgid "Pattern spacing" msgstr "Плотность поддержки" -#: src/libslic3r/PrintConfig.cpp:2779 +#: src/libslic3r/PrintConfig.cpp:2800 msgid "Spacing between support material lines." msgstr "Расстояние между линиями поддержки." -#: src/libslic3r/PrintConfig.cpp:2788 +#: src/libslic3r/PrintConfig.cpp:2809 msgid "Speed for printing support material." msgstr "Скорость печати поддержки." -#: src/libslic3r/PrintConfig.cpp:2795 -msgid "Style" -msgstr "Стиль" - -#: src/libslic3r/PrintConfig.cpp:2797 +#: src/libslic3r/PrintConfig.cpp:2818 msgid "" "Style and shape of the support towers. Projecting the supports into a " "regular grid will create more stable supports, while snug support towers " @@ -14209,28 +16056,30 @@ msgstr "" "более устойчивые опоры, а стиль «Аккуратный» экономит материал и уменьшает " "образование царапин на моделях." -#: src/libslic3r/PrintConfig.cpp:2804 +#: src/libslic3r/PrintConfig.cpp:2823 msgid "Snug" msgstr "Аккуратный" -#: src/libslic3r/PrintConfig.cpp:2809 +#: src/libslic3r/PrintConfig.cpp:2824 +msgid "Organic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2830 msgid "Synchronize with object layers" msgstr "Синхронизация со слоями модели" -#: src/libslic3r/PrintConfig.cpp:2811 +#: src/libslic3r/PrintConfig.cpp:2832 msgid "" "Synchronize support layers with the object print layers. This is useful with " -"multi-material printers, where the extruder switch is expensive." +"multi-material printers, where the extruder switch is expensive. This option " +"is only available when top contact Z distance is set to zero." msgstr "" -"Синхронизирует слои поддержки со слоями печатаемой модели. Это полезно для " -"мультиматериальных принтеров, которые требуют больших затрат на смену одного " -"экструдера на другой." -#: src/libslic3r/PrintConfig.cpp:2817 +#: src/libslic3r/PrintConfig.cpp:2839 msgid "Overhang threshold" msgstr "Угол нависания поддержки" -#: src/libslic3r/PrintConfig.cpp:2819 +#: src/libslic3r/PrintConfig.cpp:2841 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -14242,11 +16091,11 @@ msgstr "" "поддержки (угол задаётся относительно вертикальной оси). Установите 0 для " "формирования поддержки в автоматическом режиме." -#: src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2853 msgid "With sheath around the support" msgstr "Оболочка вокруг поддержки" -#: src/libslic3r/PrintConfig.cpp:2833 +#: src/libslic3r/PrintConfig.cpp:2855 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." @@ -14254,7 +16103,72 @@ msgstr "" "Добавить оболочку (одну линию периметра) вокруг базовой поддержки. Это " "делает поддержку более надёжной, но её труднее удалить." -#: src/libslic3r/PrintConfig.cpp:2840 +#: src/libslic3r/PrintConfig.cpp:2861 +msgid "Maximum Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2863 +msgid "" +"The maximum angle of the branches, when the branches have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle to be able to have more reach." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2872 +msgid "Preferred Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2874 +msgid "" +"The preferred angle of the branches, when they do not have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle for branches to merge faster." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2883 +msgid "Tip Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2885 +msgid "The diameter of the top of the tip of the branches of organic support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2892 +msgid "Branch Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2894 +msgid "" +"The diameter of the thinnest branches of organic support. Thicker branches " +"are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2902 +msgid "Branch Diameter Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2904 +msgid "" +"The angle of the branches' diameter as they gradually become thicker towards " +"the bottom. An angle of 0 will cause the branches to have uniform thickness " +"over their length. A bit of an angle can increase stability of the organic " +"support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2914 +msgid "Branch Density" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2916 +msgid "" +"Adjusts the density of the support structure used to generate the tips of " +"the branches. A higher value results in better overhangs but the supports " +"are harder to remove, thus it is recommended to enable top support " +"interfaces instead of a high branch density value if dense interfaces are " +"needed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2928 msgid "" "Nozzle temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output G-code." @@ -14262,15 +16176,15 @@ msgstr "" "Температура сопла при печати для слоёв после первого. Установите 0 для " "отключения команд управления температурой в выходом G-коде." -#: src/libslic3r/PrintConfig.cpp:2843 +#: src/libslic3r/PrintConfig.cpp:2931 msgid "Nozzle temperature" msgstr "Температура сопла" -#: src/libslic3r/PrintConfig.cpp:2849 +#: src/libslic3r/PrintConfig.cpp:2937 msgid "Thick bridges" msgstr "Толстые мосты" -#: src/libslic3r/PrintConfig.cpp:2851 +#: src/libslic3r/PrintConfig.cpp:2939 msgid "" "If enabled, bridges are more reliable, can bridge longer distances, but may " "look worse. If disabled, bridges look better but are reliable just for " @@ -14280,11 +16194,11 @@ msgstr "" "отключено, мосты выглядят лучше, но они надежны только на коротких " "расстояниях." -#: src/libslic3r/PrintConfig.cpp:2857 +#: src/libslic3r/PrintConfig.cpp:2945 msgid "Detect thin walls" msgstr "Обнаружение тонких стенок" -#: src/libslic3r/PrintConfig.cpp:2859 +#: src/libslic3r/PrintConfig.cpp:2947 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." @@ -14292,11 +16206,11 @@ msgstr "" "Данный параметр ищет тонкие стенки (стенки одинарной ширины), которые можно " "напечатать только в один проход экструдера, и производит нарезку правильно." -#: src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2953 msgid "Threads" msgstr "Потоков" -#: src/libslic3r/PrintConfig.cpp:2866 +#: src/libslic3r/PrintConfig.cpp:2954 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." @@ -14304,7 +16218,7 @@ msgstr "" "Количество потоков для распараллеливания длительных задач. Оптимальное " "количество потоков несколько превышает количество доступных ядер/процессоров." -#: src/libslic3r/PrintConfig.cpp:2878 +#: src/libslic3r/PrintConfig.cpp:2966 msgid "" "This custom code is inserted before every toolchange. Placeholder variables " "for all PrusaSlicer settings as well as {toolchange_z}, {previous_extruder} " @@ -14321,7 +16235,7 @@ msgstr "" "Таким образом, можно создать сценарии пользовательского поведения как до, " "так и после смены инструмента." -#: src/libslic3r/PrintConfig.cpp:2891 +#: src/libslic3r/PrintConfig.cpp:2979 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "top surfaces. You may want to use thinner extrudates to fill all narrow " @@ -14336,7 +16250,7 @@ msgstr "" "задана, в противном случае будет использоваться диаметр сопла. Если задано в " "процентах, параметр вычисляется относительно высоты слоя." -#: src/libslic3r/PrintConfig.cpp:2904 +#: src/libslic3r/PrintConfig.cpp:2992 msgid "" "Speed for printing top solid layers (it only applies to the uppermost " "external layers and not to their internal solid layers). You may want to " @@ -14349,15 +16263,15 @@ msgstr "" "вычисляется относительно скорости сплошного заполнения указанной выше. " "Установите 0 для автонастройки." -#: src/libslic3r/PrintConfig.cpp:2919 +#: src/libslic3r/PrintConfig.cpp:3007 msgid "Number of solid layers to generate on top surfaces." msgstr "Количество сплошных слоёв при печати верхней поверхности модели." -#: src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3008 msgid "Top solid layers" msgstr "Верхних сплошных слоёв" -#: src/libslic3r/PrintConfig.cpp:2928 +#: src/libslic3r/PrintConfig.cpp:3016 msgid "" "The number of top solid layers is increased above top_solid_layers if " "necessary to satisfy minimum thickness of top shell. This is useful to " @@ -14369,19 +16283,19 @@ msgstr "" "«дырявой подушки» (верхняя поверхность не полностью закрыта или имеет " "неровности) при печати с переменной высотой слоя." -#: src/libslic3r/PrintConfig.cpp:2931 +#: src/libslic3r/PrintConfig.cpp:3019 msgid "Minimum top shell thickness" msgstr "Минимальная толщина оболочки сверху" -#: src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:3026 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "Скорость перемещения экструдера при позиционировании без печати." -#: src/libslic3r/PrintConfig.cpp:2946 +#: src/libslic3r/PrintConfig.cpp:3034 msgid "Z travel" msgstr "Скорость перемещений по Z" -#: src/libslic3r/PrintConfig.cpp:2947 +#: src/libslic3r/PrintConfig.cpp:3035 msgid "" "Speed for movements along the Z axis.\n" "When set to zero, the value is ignored and regular travel speed is used " @@ -14391,11 +16305,11 @@ msgstr "" "Если установлено 0, то значение игнорируется и вместо него используется " "обычная скорость перемещений." -#: src/libslic3r/PrintConfig.cpp:2955 +#: src/libslic3r/PrintConfig.cpp:3043 msgid "Use firmware retraction" msgstr "Использовать ретракт из прошивки" -#: src/libslic3r/PrintConfig.cpp:2956 +#: src/libslic3r/PrintConfig.cpp:3044 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." @@ -14403,11 +16317,11 @@ msgstr "" "Эта экспериментальная опция использует команды G10 и G11, чтобы прошивка " "обрабатывала ретракт. Поддерживается только в последних версиях Marlin." -#: src/libslic3r/PrintConfig.cpp:2962 +#: src/libslic3r/PrintConfig.cpp:3050 msgid "Use relative E distances" msgstr "Использовать относительные координаты для экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:2963 +#: src/libslic3r/PrintConfig.cpp:3051 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." @@ -14417,11 +16331,11 @@ msgstr "" "значения при позиционировании. Если вы не знаете - использует ли ваша " "прошивка эту функцию, то не отмечайте это значение." -#: src/libslic3r/PrintConfig.cpp:2969 +#: src/libslic3r/PrintConfig.cpp:3057 msgid "Use volumetric E" msgstr "Использовать объёмные значения для экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:2970 +#: src/libslic3r/PrintConfig.cpp:3058 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -14437,11 +16351,11 @@ msgstr "" "включить объёмный режим и использовать диаметр прутка указанный в " "PrusaSlicer. Это функция поддерживается только в последних версиях Marlin." -#: src/libslic3r/PrintConfig.cpp:2980 +#: src/libslic3r/PrintConfig.cpp:3068 msgid "Enable variable layer height feature" msgstr "Включить функцию переменной высоты слоёв" -#: src/libslic3r/PrintConfig.cpp:2981 +#: src/libslic3r/PrintConfig.cpp:3069 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." @@ -14449,11 +16363,11 @@ msgstr "" "Некоторые принтеры (или из-за настроек принтера) могут испытывать трудности " "при печати с функцией переменной высотой слоёв. По умолчанию включено." -#: src/libslic3r/PrintConfig.cpp:2987 +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Wipe while retracting" msgstr "Очистка сопла при ретракте" -#: src/libslic3r/PrintConfig.cpp:2988 +#: src/libslic3r/PrintConfig.cpp:3076 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." @@ -14462,7 +16376,7 @@ msgstr "" "свести к минимуму возможное образование пупырышек в начале/конце слоя на " "экструдерах, которые имеют тенденцию к течи." -#: src/libslic3r/PrintConfig.cpp:2995 +#: src/libslic3r/PrintConfig.cpp:3083 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." @@ -14470,11 +16384,11 @@ msgstr "" "Для мультиматериальных принтеров может потребоваться предзарядка и смена " "инструмента. Избыточный материал будет выдавливаться на черновую башню." -#: src/libslic3r/PrintConfig.cpp:3001 +#: src/libslic3r/PrintConfig.cpp:3089 msgid "Purging volumes - load/unload volumes" msgstr "Очищающие объёмы - загрузка/выгрузка объёмов" -#: src/libslic3r/PrintConfig.cpp:3002 +#: src/libslic3r/PrintConfig.cpp:3090 msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " @@ -14484,11 +16398,11 @@ msgstr "" "башню для прочистки сопла при смене экструдеров/инструментов. Эти значения " "используются для упрощения создания полноты объёмов очистки указанной ниже." -#: src/libslic3r/PrintConfig.cpp:3008 +#: src/libslic3r/PrintConfig.cpp:3096 msgid "Purging volumes - matrix" msgstr "Таблица очищающих объёмов" -#: src/libslic3r/PrintConfig.cpp:3009 +#: src/libslic3r/PrintConfig.cpp:3097 msgid "" "This matrix describes volumes (in cubic milimetres) required to purge the " "new filament on the wipe tower for any given pair of tools." @@ -14496,43 +16410,47 @@ msgstr "" "Эта таблица описывает объёмы (в кубических миллиметрах), необходимые для " "прочистки нового прутка на черновой башне для любой пары сопел\\экструдеров." -#: src/libslic3r/PrintConfig.cpp:3018 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Position X" msgstr "Х позиция башни" -#: src/libslic3r/PrintConfig.cpp:3019 +#: src/libslic3r/PrintConfig.cpp:3107 msgid "X coordinate of the left front corner of a wipe tower" msgstr "X координата левого переднего угла черновой башни" -#: src/libslic3r/PrintConfig.cpp:3025 +#: src/libslic3r/PrintConfig.cpp:3113 msgid "Position Y" msgstr "Y позиция башни" -#: src/libslic3r/PrintConfig.cpp:3026 +#: src/libslic3r/PrintConfig.cpp:3114 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "Y координата левого переднего угла черновой башне" -#: src/libslic3r/PrintConfig.cpp:3033 +#: src/libslic3r/PrintConfig.cpp:3120 +msgid "Width" +msgstr "Ширина" + +#: src/libslic3r/PrintConfig.cpp:3121 msgid "Width of a wipe tower" msgstr "Ширина черновой башни" -#: src/libslic3r/PrintConfig.cpp:3039 +#: src/libslic3r/PrintConfig.cpp:3127 msgid "Wipe tower rotation angle" msgstr "Угол поворота черновой башни" -#: src/libslic3r/PrintConfig.cpp:3040 +#: src/libslic3r/PrintConfig.cpp:3128 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "Угол поворота черновой башни относительно оси X." -#: src/libslic3r/PrintConfig.cpp:3046 src/libslic3r/PrintConfig.cpp:3047 +#: src/libslic3r/PrintConfig.cpp:3134 src/libslic3r/PrintConfig.cpp:3135 msgid "Wipe tower brim width" msgstr "Ширина каймы черновой башни" -#: src/libslic3r/PrintConfig.cpp:3055 +#: src/libslic3r/PrintConfig.cpp:3143 msgid "Wipe into this object's infill" msgstr "Очистка в заполнение модели" -#: src/libslic3r/PrintConfig.cpp:3056 +#: src/libslic3r/PrintConfig.cpp:3144 msgid "" "Purging after toolchange will be done inside this object's infills. This " "lowers the amount of waste but may result in longer print time due to " @@ -14542,11 +16460,11 @@ msgstr "" "модели. Это уменьшает количество отходов, но может привести к увеличению " "времени печати из-за дополнительных перемещений." -#: src/libslic3r/PrintConfig.cpp:3063 +#: src/libslic3r/PrintConfig.cpp:3151 msgid "Wipe into this object" msgstr "Очистка в модель" -#: src/libslic3r/PrintConfig.cpp:3064 +#: src/libslic3r/PrintConfig.cpp:3152 msgid "" "Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " @@ -14556,20 +16474,20 @@ msgstr "" "сохранить материал (который иначе попал бы на черновую башню) и сократить " "время печати. В результате цвета моделей будут смешаны." -#: src/libslic3r/PrintConfig.cpp:3070 +#: src/libslic3r/PrintConfig.cpp:3158 msgid "Maximal bridging distance" msgstr "Максимальное длина моста" -#: src/libslic3r/PrintConfig.cpp:3071 +#: src/libslic3r/PrintConfig.cpp:3159 msgid "Maximal distance between supports on sparse infill sections." msgstr "" "Максимальное расстояние между опорами на разряженных участках заполнения." -#: src/libslic3r/PrintConfig.cpp:3077 +#: src/libslic3r/PrintConfig.cpp:3165 msgid "XY Size Compensation" msgstr "Коррекция горизонтальных размеров модели" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3167 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" @@ -14580,11 +16498,11 @@ msgstr "" "наружу. Может быть полезно для точной настройки размеров отверстий при " "печати шевронных подшипников." -#: src/libslic3r/PrintConfig.cpp:3087 +#: src/libslic3r/PrintConfig.cpp:3175 msgid "Z offset" msgstr "Смещение стола по оси Z" -#: src/libslic3r/PrintConfig.cpp:3088 +#: src/libslic3r/PrintConfig.cpp:3176 msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " "output G-code. It is used to compensate for bad Z endstop position: for " @@ -14595,11 +16513,11 @@ msgstr "" "Это значение будет прибавлено (или вычтено) из всех Z координат в выходном G-" "коде." -#: src/libslic3r/PrintConfig.cpp:3097 +#: src/libslic3r/PrintConfig.cpp:3185 msgid "Perimeter generator" msgstr "Генератор периметров" -#: src/libslic3r/PrintConfig.cpp:3099 +#: src/libslic3r/PrintConfig.cpp:3187 msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " @@ -14607,19 +16525,19 @@ msgid "" "Concentric infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3192 msgid "Classic" msgstr "Классический движок" -#: src/libslic3r/PrintConfig.cpp:3107 +#: src/libslic3r/PrintConfig.cpp:3193 msgid "Arachne" msgstr "Движок Arachne" -#: src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3199 msgid "Perimeter transition length" msgstr "Длина перехода к периметру" -#: src/libslic3r/PrintConfig.cpp:3114 +#: src/libslic3r/PrintConfig.cpp:3201 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " @@ -14627,11 +16545,11 @@ msgid "" "be computed based on the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3123 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Perimeter transitioning filter margin" msgstr "Поле фильтра при переходе между периметрами" -#: src/libslic3r/PrintConfig.cpp:3125 +#: src/libslic3r/PrintConfig.cpp:3212 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -14652,11 +16570,11 @@ msgstr "" "переэкструзии материала. Если задано в процентах, то расчёт производится " "относительно диаметра сопла." -#: src/libslic3r/PrintConfig.cpp:3138 +#: src/libslic3r/PrintConfig.cpp:3225 msgid "Perimeter transitioning threshold angle" msgstr "Пороговый угол перехода между периметрами" -#: src/libslic3r/PrintConfig.cpp:3140 +#: src/libslic3r/PrintConfig.cpp:3227 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -14671,11 +16589,11 @@ msgstr "" "сократить количество и длину этих центральных периметров, но при этом могут " "остаться зазоры или произойти чрезмерное экструдирование." -#: src/libslic3r/PrintConfig.cpp:3151 +#: src/libslic3r/PrintConfig.cpp:3238 msgid "Perimeter distribution count" msgstr "Счетчик распределений по периметрам" -#: src/libslic3r/PrintConfig.cpp:3153 +#: src/libslic3r/PrintConfig.cpp:3240 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " @@ -14685,11 +16603,11 @@ msgstr "" "распространить изменения. Более низкое значение означает, что ширина внешних " "периметров не изменяется." -#: src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3247 msgid "Minimum feature size" msgstr "Минимальный размер элемента" -#: src/libslic3r/PrintConfig.cpp:3162 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " @@ -14698,11 +16616,11 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3172 +#: src/libslic3r/PrintConfig.cpp:3259 msgid "Minimum perimeter width" msgstr "Минимальная ширина периметра" -#: src/libslic3r/PrintConfig.cpp:3174 +#: src/libslic3r/PrintConfig.cpp:3261 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -14710,69 +16628,244 @@ msgid "" "thick as the feature itself. If expressed as a percentage (for example 85%), " "it will be computed based on the nozzle diameter." msgstr "" -"Ширина периметра, которая заменит тонкие элементы (в соответствии с " -"минимальным размера элемента) модели. Если минимальная ширина периметра " -"меньше толщины элемента, толщина периметра будет приведена к толщине самого " -"элемента. Если задано в процентах, то расчёт производится относительно " -"диаметра сопла." +"Ширина периметра, которая заменит тонкие элементы (в соответствии с " +"минимальным размера элемента) модели. Если минимальная ширина периметра " +"меньше толщины элемента, толщина периметра будет приведена к толщине самого " +"элемента. Если задано в процентах, то расчёт производится относительно " +"диаметра сопла." + +#: src/libslic3r/PrintConfig.cpp:3327 +msgid "Pinhead front diameter" +msgstr "Диаметр носика поддержки" + +#: src/libslic3r/PrintConfig.cpp:3329 +msgid "Diameter of the pointing side of the head" +msgstr "Диаметр носика поддержки." + +#: src/libslic3r/PrintConfig.cpp:3336 +msgid "Head penetration" +msgstr "Глубина проникновения носика поддержки" + +#: src/libslic3r/PrintConfig.cpp:3338 +msgid "How much the pinhead has to penetrate the model surface" +msgstr "Задаёт, как глубоко носик поддержки будет проникать в модель." + +#: src/libslic3r/PrintConfig.cpp:3345 +msgid "Pinhead width" +msgstr "Длина носика поддержки" + +#: src/libslic3r/PrintConfig.cpp:3347 +msgid "Width from the back sphere center to the front sphere center" +msgstr "" +"Длина носика поддержки (ширина от центра задней сферы до центра передней " +"сферы)." + +#: src/libslic3r/PrintConfig.cpp:3355 +msgid "Pillar diameter" +msgstr "Диаметр тела поддержки" + +#: src/libslic3r/PrintConfig.cpp:3357 +msgid "Diameter in mm of the support pillars" +msgstr "Диаметр тела поддержки в мм." + +#: src/libslic3r/PrintConfig.cpp:3365 +msgid "Small pillar diameter percent" +msgstr "Диаметр маленьких тел поддержки в процентах" + +#: src/libslic3r/PrintConfig.cpp:3367 +msgid "" +"The percentage of smaller pillars compared to the normal pillar diameter " +"which are used in problematic areas where a normal pilla cannot fit." +msgstr "" +"Размер тел поддержки меньшего размера в процентах по сравнению с обычным " +"диаметром тел поддержки, которые используются в проблемных областях, где " +"нормальный столбик поддержки не может поместиться." + +#: src/libslic3r/PrintConfig.cpp:3376 +msgid "Max bridges on a pillar" +msgstr "Макс. количество мостов на теле поддержки" + +#: src/libslic3r/PrintConfig.cpp:3378 +msgid "" +"Maximum number of bridges that can be placed on a pillar. Bridges hold " +"support point pinheads and connect to pillars as small branches." +msgstr "" +"Максимальное количество мостов, которые можно разместить на теле поддержки. " +"Мосты удерживают носики поддержки и соединяются с телами поддержки в виде " +"небольших ветвей." + +#: src/libslic3r/PrintConfig.cpp:3386 +msgid "Max weight on model" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3389 +msgid "" +"Maximum weight of sub-trees that terminate on the model instead of the print " +"bed. The weight is the sum of the lenghts of all branches emanating from the " +"endpoint." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3397 +msgid "Pillar connection mode" +msgstr "Тип соединения тела поддержки" + +#: src/libslic3r/PrintConfig.cpp:3398 +msgid "" +"Controls the bridge type between two neighboring pillars. Can be zig-zag, " +"cross (double zig-zag) or dynamic which will automatically switch between " +"the first two depending on the distance of the two pillars." +msgstr "" +"Управляет типом мостов, которые соединяют соседние тела поддержки. Может " +"быть зигзагообразным, перекрёстным (двойной зигзаг) или динамическим, " +"который автоматически переключается между первыми двумя, в зависимости от " +"расстояния между телами поддержки." + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Zig-Zag" +msgstr "Зигзагообразный" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Cross" +msgstr "Перекрёстный" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Dynamic" +msgstr "Динамический" + +#: src/libslic3r/PrintConfig.cpp:3416 +msgid "Pillar widening factor" +msgstr "Коэффициент расширения тела поддержки" + +#: src/libslic3r/PrintConfig.cpp:3420 +msgid "" +"Merging bridges or pillars into another pillars can increase the radius. " +"Zero means no increase, one means full increase. The exact amount of " +"increase is unspecified and can change in the future." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3431 +msgid "Support base diameter" +msgstr "Диаметр основания поддержки" + +#: src/libslic3r/PrintConfig.cpp:3433 +msgid "Diameter in mm of the pillar base" +msgstr "Диаметр основания поддержки в мм." + +#: src/libslic3r/PrintConfig.cpp:3441 +msgid "Support base height" +msgstr "Высота основания поддержки" + +#: src/libslic3r/PrintConfig.cpp:3443 +msgid "The height of the pillar base cone" +msgstr "Высота конусообразного основания поддержки." + +#: src/libslic3r/PrintConfig.cpp:3450 +msgid "Support base safety distance" +msgstr "Безопасное расстояние основания поддержки" + +#: src/libslic3r/PrintConfig.cpp:3453 +msgid "" +"The minimum distance of the pillar base from the model in mm. Makes sense in " +"zero elevation mode where a gap according to this parameter is inserted " +"between the model and the pad." +msgstr "" +"Минимальное расстояние между основанием поддержки и моделью в мм. Имеет " +"смысл в режиме нулевой высоты подъёма, когда между моделью и подложкой " +"вставляется зазор заданный этим параметром." + +#: src/libslic3r/PrintConfig.cpp:3463 +msgid "Critical angle" +msgstr "Критический угол" + +#: src/libslic3r/PrintConfig.cpp:3465 +msgid "The default angle for connecting support sticks and junctions." +msgstr "Угол соединения опор поддержки со связующим узлом." + +#: src/libslic3r/PrintConfig.cpp:3473 +msgid "Max bridge length" +msgstr "Максимальная длина моста" + +#: src/libslic3r/PrintConfig.cpp:3475 +msgid "The max length of a bridge" +msgstr "Максимальная длина моста." + +#: src/libslic3r/PrintConfig.cpp:3487 +msgid "Max pillar linking distance" +msgstr "Максимальное расстояние между телом поддержки" + +#: src/libslic3r/PrintConfig.cpp:3489 +msgid "" +"The max distance of two pillars to get linked with each other. A zero value " +"will prohibit pillar cascading." +msgstr "" +"Максимальное расстояние между двумя телами поддержки для связи друг с " +"другом. Нулевое значение - запрет на соединение тел поддержки каскадом." + +#: src/libslic3r/PrintConfig.cpp:3499 +msgid "" +"How much the supports should lift up the supported object. If \"Pad around " +"object\" is enabled, this value is ignored." +msgstr "" +"Определяет насколько опоры должны поднимать поддерживаемую модель. Если " +"включёно «Подложка вокруг модели», это значение игнорируется." -#: src/libslic3r/PrintConfig.cpp:3242 +#: src/libslic3r/PrintConfig.cpp:3515 msgid "Display width" msgstr "Ширина дисплея" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3516 msgid "Width of the display" msgstr "Высота дисплея." -#: src/libslic3r/PrintConfig.cpp:3248 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "Display height" msgstr "Высота дисплея" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3522 msgid "Height of the display" msgstr "Высота дисплея." -#: src/libslic3r/PrintConfig.cpp:3254 +#: src/libslic3r/PrintConfig.cpp:3527 msgid "Number of pixels in" msgstr "Количество пикселей" -#: src/libslic3r/PrintConfig.cpp:3256 +#: src/libslic3r/PrintConfig.cpp:3529 msgid "Number of pixels in X" msgstr "Количество пикселей по X." -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3535 msgid "Number of pixels in Y" msgstr "Количество пикселей по Y." -#: src/libslic3r/PrintConfig.cpp:3267 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Display horizontal mirroring" msgstr "Горизонтальное зеркалирование дисплея" -#: src/libslic3r/PrintConfig.cpp:3268 +#: src/libslic3r/PrintConfig.cpp:3541 msgid "Mirror horizontally" msgstr "Зеркалировать по горизонтали" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3542 msgid "Enable horizontal mirroring of output images" msgstr "Включение горизонтального зеркалирования выходных изображений." -#: src/libslic3r/PrintConfig.cpp:3274 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Display vertical mirroring" msgstr "Вертикальное зеркалирование дисплея" -#: src/libslic3r/PrintConfig.cpp:3275 +#: src/libslic3r/PrintConfig.cpp:3548 msgid "Mirror vertically" msgstr "Зеркалировать по вертикали" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "Enable vertical mirroring of output images" msgstr "Включение вертикального зеркалирования выходных изображений." -#: src/libslic3r/PrintConfig.cpp:3281 +#: src/libslic3r/PrintConfig.cpp:3554 msgid "Display orientation" msgstr "Ориентация дисплея" -#: src/libslic3r/PrintConfig.cpp:3282 +#: src/libslic3r/PrintConfig.cpp:3555 msgid "" "Set the actual LCD display orientation inside the SLA printer. Portrait mode " "will flip the meaning of display width and height parameters and the output " @@ -14782,55 +16875,55 @@ msgstr "" "режим перевернёт значения параметров ширины и высоты дисплея, а выходные " "изображения будут повёрнуты на 90 градусов." -#: src/libslic3r/PrintConfig.cpp:3288 +#: src/libslic3r/PrintConfig.cpp:3559 msgid "Landscape" msgstr "Альбомная" -#: src/libslic3r/PrintConfig.cpp:3289 +#: src/libslic3r/PrintConfig.cpp:3560 msgid "Portrait" msgstr "Портретная" -#: src/libslic3r/PrintConfig.cpp:3294 src/libslic3r/PrintConfig.cpp:3929 +#: src/libslic3r/PrintConfig.cpp:3566 src/libslic3r/PrintConfig.cpp:4058 msgid "Fast" msgstr "Быстро" -#: src/libslic3r/PrintConfig.cpp:3295 +#: src/libslic3r/PrintConfig.cpp:3567 msgid "Fast tilt" msgstr "Быстрый наклон" -#: src/libslic3r/PrintConfig.cpp:3296 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Time of the fast tilt" msgstr "Время быстрого наклона." -#: src/libslic3r/PrintConfig.cpp:3303 src/libslic3r/PrintConfig.cpp:3928 +#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:4057 msgid "Slow" msgstr "Медленно" -#: src/libslic3r/PrintConfig.cpp:3304 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Slow tilt" msgstr "Медленный наклон" -#: src/libslic3r/PrintConfig.cpp:3305 +#: src/libslic3r/PrintConfig.cpp:3577 msgid "Time of the slow tilt" msgstr "Время медленного наклона." -#: src/libslic3r/PrintConfig.cpp:3312 src/libslic3r/PrintConfig.cpp:3930 +#: src/libslic3r/PrintConfig.cpp:3584 src/libslic3r/PrintConfig.cpp:4059 msgid "High viscosity" msgstr "Высокая вязкость" -#: src/libslic3r/PrintConfig.cpp:3313 +#: src/libslic3r/PrintConfig.cpp:3585 msgid "Tilt for high viscosity resin" msgstr "Наклон ванночки для смолы с высокой вязкостью" -#: src/libslic3r/PrintConfig.cpp:3314 +#: src/libslic3r/PrintConfig.cpp:3586 msgid "Time of the super slow tilt" msgstr "Время очень медленного наклона ванночки." -#: src/libslic3r/PrintConfig.cpp:3321 +#: src/libslic3r/PrintConfig.cpp:3593 msgid "Area fill" msgstr "Площадь заполнения" -#: src/libslic3r/PrintConfig.cpp:3322 +#: src/libslic3r/PrintConfig.cpp:3594 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -14840,40 +16933,40 @@ msgstr "" "то будет использоваться медленный наклон, в противном случае - быстрый " "наклон." -#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 -#: src/libslic3r/PrintConfig.cpp:3331 +#: src/libslic3r/PrintConfig.cpp:3601 src/libslic3r/PrintConfig.cpp:3602 +#: src/libslic3r/PrintConfig.cpp:3603 msgid "Printer scaling correction" msgstr "Корректировка масштабирования" -#: src/libslic3r/PrintConfig.cpp:3337 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3609 src/libslic3r/PrintConfig.cpp:3611 msgid "Printer scaling correction in X axis" msgstr "Корректировка масштабирования принтера по оси X" -#: src/libslic3r/PrintConfig.cpp:3338 +#: src/libslic3r/PrintConfig.cpp:3610 msgid "Printer scaling X axis correction" msgstr "Корректировка масштабирования принтера по оси X" -#: src/libslic3r/PrintConfig.cpp:3345 src/libslic3r/PrintConfig.cpp:3347 +#: src/libslic3r/PrintConfig.cpp:3617 src/libslic3r/PrintConfig.cpp:3619 msgid "Printer scaling correction in Y axis" msgstr "Корректировка масштабирования принтера по оси Y" -#: src/libslic3r/PrintConfig.cpp:3346 +#: src/libslic3r/PrintConfig.cpp:3618 msgid "Printer scaling Y axis correction" msgstr "Корректировка масштабирования принтера по оси Y" -#: src/libslic3r/PrintConfig.cpp:3353 src/libslic3r/PrintConfig.cpp:3355 +#: src/libslic3r/PrintConfig.cpp:3625 src/libslic3r/PrintConfig.cpp:3627 msgid "Printer scaling correction in Z axis" msgstr "Корректировка масштабирования принтера по оси Z" -#: src/libslic3r/PrintConfig.cpp:3354 +#: src/libslic3r/PrintConfig.cpp:3626 msgid "Printer scaling Z axis correction" msgstr "Корректировка масштабирования принтера по оси Z" -#: src/libslic3r/PrintConfig.cpp:3361 src/libslic3r/PrintConfig.cpp:3362 +#: src/libslic3r/PrintConfig.cpp:3633 src/libslic3r/PrintConfig.cpp:3634 msgid "Printer absolute correction" msgstr "Абсолютная корректировка принтера" -#: src/libslic3r/PrintConfig.cpp:3363 +#: src/libslic3r/PrintConfig.cpp:3635 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." @@ -14881,22 +16974,22 @@ msgstr "" "Будет надувать или сдувать нарезанные 2D-полигоны в соответствии со знаком " "коррекции." -#: src/libslic3r/PrintConfig.cpp:3369 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Elephant foot minimum width" msgstr "Минимальная ширина «слоновьей ноги»" -#: src/libslic3r/PrintConfig.cpp:3371 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" "Минимальная ширина, которую нужно поддерживать для компенсации «слоновьей " "ноги»." -#: src/libslic3r/PrintConfig.cpp:3378 src/libslic3r/PrintConfig.cpp:3379 +#: src/libslic3r/PrintConfig.cpp:3650 src/libslic3r/PrintConfig.cpp:3651 msgid "Printer gamma correction" msgstr "Корректировка гаммы-коррекции" -#: src/libslic3r/PrintConfig.cpp:3380 +#: src/libslic3r/PrintConfig.cpp:3652 msgid "" "This will apply a gamma correction to the rasterized 2D polygons. A gamma " "value of zero means thresholding with the threshold in the middle. This " @@ -14906,43 +16999,53 @@ msgstr "" "значение гаммы означает пороговое значение с порогом посередине. Такое " "поведение убирает сглаживание без потери отверстий в полигонах." -#: src/libslic3r/PrintConfig.cpp:3399 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3671 src/libslic3r/PrintConfig.cpp:3672 msgid "SLA material type" msgstr "Тип SLA материала" -#: src/libslic3r/PrintConfig.cpp:3411 src/libslic3r/PrintConfig.cpp:3412 +#: src/libslic3r/PrintConfig.cpp:3679 src/libslic3r/PrintConfig.cpp:3680 msgid "Initial layer height" msgstr "Начальная высота слоя" -#: src/libslic3r/PrintConfig.cpp:3418 src/libslic3r/PrintConfig.cpp:3419 +#: src/libslic3r/PrintConfig.cpp:3686 +msgid "Idle temperature" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3687 +msgid "" +"Nozzle temperature when the tool is currently not used in multi-tool setups." +"This is only used when 'Ooze prevention' is active in Print Settings." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3695 src/libslic3r/PrintConfig.cpp:3696 msgid "Bottle volume" msgstr "Объём бутылки" -#: src/libslic3r/PrintConfig.cpp:3420 +#: src/libslic3r/PrintConfig.cpp:3697 msgid "ml" msgstr "мл" -#: src/libslic3r/PrintConfig.cpp:3425 src/libslic3r/PrintConfig.cpp:3426 +#: src/libslic3r/PrintConfig.cpp:3702 src/libslic3r/PrintConfig.cpp:3703 msgid "Bottle weight" msgstr "Вес бутылки" -#: src/libslic3r/PrintConfig.cpp:3427 +#: src/libslic3r/PrintConfig.cpp:3704 msgid "kg" msgstr "кг" -#: src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "g/ml" msgstr "г/мл" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3718 msgid "money/bottle" msgstr "цена/бутылка" -#: src/libslic3r/PrintConfig.cpp:3446 +#: src/libslic3r/PrintConfig.cpp:3723 msgid "Faded layers" msgstr "Начальных слоёв" -#: src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3724 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" @@ -14950,266 +17053,121 @@ msgstr "" "Количество начальных слоёв, необходимых для изменения времени засветки от " "«Время засветки начальных слоёв» до «Время засветки основных слоёв»." -#: src/libslic3r/PrintConfig.cpp:3454 src/libslic3r/PrintConfig.cpp:3455 +#: src/libslic3r/PrintConfig.cpp:3731 src/libslic3r/PrintConfig.cpp:3732 msgid "Minimum exposure time" msgstr "Мин. время засветки основных слоёв" -#: src/libslic3r/PrintConfig.cpp:3462 src/libslic3r/PrintConfig.cpp:3463 +#: src/libslic3r/PrintConfig.cpp:3739 src/libslic3r/PrintConfig.cpp:3740 msgid "Maximum exposure time" msgstr "Макс. время засветки основных слоёв" -#: src/libslic3r/PrintConfig.cpp:3470 src/libslic3r/PrintConfig.cpp:3471 +#: src/libslic3r/PrintConfig.cpp:3747 src/libslic3r/PrintConfig.cpp:3748 msgid "Exposure time" msgstr "Время засветки обычных слоёв" -#: src/libslic3r/PrintConfig.cpp:3477 src/libslic3r/PrintConfig.cpp:3478 +#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3755 msgid "Minimum initial exposure time" msgstr "Мин. время засветки начальных слоёв" -#: src/libslic3r/PrintConfig.cpp:3485 src/libslic3r/PrintConfig.cpp:3486 +#: src/libslic3r/PrintConfig.cpp:3762 src/libslic3r/PrintConfig.cpp:3763 msgid "Maximum initial exposure time" msgstr "Макс. время засветки начальных слоёв" -#: src/libslic3r/PrintConfig.cpp:3493 src/libslic3r/PrintConfig.cpp:3494 +#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3771 msgid "Initial exposure time" msgstr "Время засветки начальных слоёв" -#: src/libslic3r/PrintConfig.cpp:3500 src/libslic3r/PrintConfig.cpp:3501 +#: src/libslic3r/PrintConfig.cpp:3777 src/libslic3r/PrintConfig.cpp:3778 msgid "Correction for expansion" msgstr "Коррекция расширения" -#: src/libslic3r/PrintConfig.cpp:3507 src/libslic3r/PrintConfig.cpp:3508 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3785 msgid "Correction for expansion in X axis" msgstr "Корректировка расширения по оси X" -#: src/libslic3r/PrintConfig.cpp:3514 src/libslic3r/PrintConfig.cpp:3515 +#: src/libslic3r/PrintConfig.cpp:3791 src/libslic3r/PrintConfig.cpp:3792 msgid "Correction for expansion in Y axis" msgstr "Корректировка расширения по оси Y" -#: src/libslic3r/PrintConfig.cpp:3521 src/libslic3r/PrintConfig.cpp:3522 +#: src/libslic3r/PrintConfig.cpp:3798 src/libslic3r/PrintConfig.cpp:3799 msgid "Correction for expansion in Z axis" msgstr "Корректировка расширения по оси Z" -#: src/libslic3r/PrintConfig.cpp:3528 +#: src/libslic3r/PrintConfig.cpp:3805 msgid "SLA print material notes" msgstr "Примечание к SLA материалу" -#: src/libslic3r/PrintConfig.cpp:3529 +#: src/libslic3r/PrintConfig.cpp:3806 msgid "You can put your notes regarding the SLA print material here." msgstr "" "Здесь вы можете разместить свои заметки относительно SLA материала для " "печати." -#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3552 +#: src/libslic3r/PrintConfig.cpp:3818 src/libslic3r/PrintConfig.cpp:3829 msgid "Default SLA material profile" msgstr "Профиль SLA материала по умолчанию" -#: src/libslic3r/PrintConfig.cpp:3563 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "Generate supports" msgstr "Генерировать поддержку" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3842 msgid "Generate supports for the models" msgstr "Генерация поддержки для моделей." -#: src/libslic3r/PrintConfig.cpp:3570 -msgid "Pinhead front diameter" -msgstr "Диаметр носика поддержки" - -#: src/libslic3r/PrintConfig.cpp:3572 -msgid "Diameter of the pointing side of the head" -msgstr "Диаметр носика поддержки." - -#: src/libslic3r/PrintConfig.cpp:3579 -msgid "Head penetration" -msgstr "Глубина проникновения носика поддержки" - -#: src/libslic3r/PrintConfig.cpp:3581 -msgid "How much the pinhead has to penetrate the model surface" -msgstr "Задаёт, как глубоко носик поддержки будет проникать в модель." - -#: src/libslic3r/PrintConfig.cpp:3588 -msgid "Pinhead width" -msgstr "Длина носика поддержки" - -#: src/libslic3r/PrintConfig.cpp:3590 -msgid "Width from the back sphere center to the front sphere center" -msgstr "" -"Длина носика поддержки (ширина от центра задней сферы до центра передней " -"сферы)." - -#: src/libslic3r/PrintConfig.cpp:3598 -msgid "Pillar diameter" -msgstr "Диаметр тела поддержки" - -#: src/libslic3r/PrintConfig.cpp:3600 -msgid "Diameter in mm of the support pillars" -msgstr "Диаметр тела поддержки в мм." - -#: src/libslic3r/PrintConfig.cpp:3608 -msgid "Small pillar diameter percent" -msgstr "Диаметр маленьких тел поддержки в процентах" - -#: src/libslic3r/PrintConfig.cpp:3610 -msgid "" -"The percentage of smaller pillars compared to the normal pillar diameter " -"which are used in problematic areas where a normal pilla cannot fit." -msgstr "" -"Размер тел поддержки меньшего размера в процентах по сравнению с обычным " -"диаметром тел поддержки, которые используются в проблемных областях, где " -"нормальный столбик поддержки не может поместиться." - -#: src/libslic3r/PrintConfig.cpp:3619 -msgid "Max bridges on a pillar" -msgstr "Макс. количество мостов на теле поддержки" - -#: src/libslic3r/PrintConfig.cpp:3621 -msgid "" -"Maximum number of bridges that can be placed on a pillar. Bridges hold " -"support point pinheads and connect to pillars as small branches." -msgstr "" -"Максимальное количество мостов, которые можно разместить на теле поддержки. " -"Мосты удерживают носики поддержки и соединяются с телами поддержки в виде " -"небольших ветвей." - -#: src/libslic3r/PrintConfig.cpp:3629 -msgid "Pillar connection mode" -msgstr "Тип соединения тела поддержки" - -#: src/libslic3r/PrintConfig.cpp:3630 -msgid "" -"Controls the bridge type between two neighboring pillars. Can be zig-zag, " -"cross (double zig-zag) or dynamic which will automatically switch between " -"the first two depending on the distance of the two pillars." +#: src/libslic3r/PrintConfig.cpp:3847 +msgid "Support tree type" msgstr "" -"Управляет типом мостов, которые соединяют соседние тела поддержки. Может " -"быть зигзагообразным, перекрёстным (двойной зигзаг) или динамическим, " -"который автоматически переключается между первыми двумя, в зависимости от " -"расстояния между телами поддержки." - -#: src/libslic3r/PrintConfig.cpp:3638 -msgid "Zig-Zag" -msgstr "Зигзагообразный" - -#: src/libslic3r/PrintConfig.cpp:3639 -msgid "Cross" -msgstr "Перекрёстный" - -#: src/libslic3r/PrintConfig.cpp:3640 -msgid "Dynamic" -msgstr "Динамический" - -#: src/libslic3r/PrintConfig.cpp:3652 -msgid "Pillar widening factor" -msgstr "Коэффициент расширения тела поддержки" -#: src/libslic3r/PrintConfig.cpp:3654 -msgid "" -"Merging bridges or pillars into another pillars can increase the radius. " -"Zero means no increase, one means full increase." +#: src/libslic3r/PrintConfig.cpp:3848 +msgid "Support tree building strategy" msgstr "" -"Слияние мостов или тел поддержки в другие тела поддержки может увеличить их " -"радиус. 0 - отсутствие увеличения, 1 - полное увеличение." - -#: src/libslic3r/PrintConfig.cpp:3663 -msgid "Support base diameter" -msgstr "Диаметр основания поддержки" - -#: src/libslic3r/PrintConfig.cpp:3665 -msgid "Diameter in mm of the pillar base" -msgstr "Диаметр основания поддержки в мм." - -#: src/libslic3r/PrintConfig.cpp:3673 -msgid "Support base height" -msgstr "Высота основания поддержки" - -#: src/libslic3r/PrintConfig.cpp:3675 -msgid "The height of the pillar base cone" -msgstr "Высота конусообразного основания поддержки." -#: src/libslic3r/PrintConfig.cpp:3682 -msgid "Support base safety distance" -msgstr "Безопасное расстояние основания поддержки" - -#: src/libslic3r/PrintConfig.cpp:3685 -msgid "" -"The minimum distance of the pillar base from the model in mm. Makes sense in " -"zero elevation mode where a gap according to this parameter is inserted " -"between the model and the pad." +#: src/libslic3r/PrintConfig.cpp:3851 +msgid "Branching (experimental)" msgstr "" -"Минимальное расстояние между основанием поддержки и моделью в мм. Имеет " -"смысл в режиме нулевой высоты подъёма, когда между моделью и подложкой " -"вставляется зазор заданный этим параметром." - -#: src/libslic3r/PrintConfig.cpp:3695 -msgid "Critical angle" -msgstr "Критический угол" - -#: src/libslic3r/PrintConfig.cpp:3697 -msgid "The default angle for connecting support sticks and junctions." -msgstr "Угол соединения опор поддержки со связующим узлом." - -#: src/libslic3r/PrintConfig.cpp:3705 -msgid "Max bridge length" -msgstr "Максимальная длина моста" - -#: src/libslic3r/PrintConfig.cpp:3707 -msgid "The max length of a bridge" -msgstr "Максимальная длина моста." -#: src/libslic3r/PrintConfig.cpp:3714 -msgid "Max pillar linking distance" -msgstr "Максимальное расстояние между телом поддержки" - -#: src/libslic3r/PrintConfig.cpp:3716 -msgid "" -"The max distance of two pillars to get linked with each other. A zero value " -"will prohibit pillar cascading." +#: src/libslic3r/PrintConfig.cpp:3860 +msgid "Support only in enforced regions" msgstr "" -"Максимальное расстояние между двумя телами поддержки для связи друг с " -"другом. Нулевое значение - запрет на соединение тел поддержки каскадом." -#: src/libslic3r/PrintConfig.cpp:3726 -msgid "" -"How much the supports should lift up the supported object. If \"Pad around " -"object\" is enabled, this value is ignored." +#: src/libslic3r/PrintConfig.cpp:3862 +msgid "Only create support if it lies in a support enforcer." msgstr "" -"Определяет насколько опоры должны поднимать поддерживаемую модель. Если " -"включёно «Подложка вокруг модели», это значение игнорируется." -#: src/libslic3r/PrintConfig.cpp:3737 +#: src/libslic3r/PrintConfig.cpp:3869 msgid "This is a relative measure of support points density." msgstr "Относительный показатель плотности точек поддержки." -#: src/libslic3r/PrintConfig.cpp:3743 +#: src/libslic3r/PrintConfig.cpp:3875 msgid "Minimal distance of the support points" msgstr "Минимальное расстояние между точками поддержки" -#: src/libslic3r/PrintConfig.cpp:3745 +#: src/libslic3r/PrintConfig.cpp:3877 msgid "No support points will be placed closer than this threshold." msgstr "Точки поддержки не будут размещены ближе этого порогового значения." -#: src/libslic3r/PrintConfig.cpp:3751 +#: src/libslic3r/PrintConfig.cpp:3883 msgid "Use pad" msgstr "Использовать подложку" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3885 msgid "Add a pad underneath the supported model" msgstr "Добавляет подложку под поддерживаемую модель." -#: src/libslic3r/PrintConfig.cpp:3758 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "Pad wall thickness" msgstr "Толщина стенки подложки" -#: src/libslic3r/PrintConfig.cpp:3760 +#: src/libslic3r/PrintConfig.cpp:3892 msgid "The thickness of the pad and its optional cavity walls." msgstr "Толщина подложки и её дополнительных стенок полости." -#: src/libslic3r/PrintConfig.cpp:3768 +#: src/libslic3r/PrintConfig.cpp:3900 msgid "Pad wall height" msgstr "Высота стенки подложки" -#: src/libslic3r/PrintConfig.cpp:3769 +#: src/libslic3r/PrintConfig.cpp:3901 msgid "" "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " "when enabling this feature, as some resins may produce an extreme suction " @@ -15221,19 +17179,19 @@ msgstr "" "некоторые смолы могут создавать чрезмерный эффект всасывания внутри полости, " "что затрудняет снятие модели." -#: src/libslic3r/PrintConfig.cpp:3782 +#: src/libslic3r/PrintConfig.cpp:3914 msgid "Pad brim size" msgstr "Размер каймы подложки" -#: src/libslic3r/PrintConfig.cpp:3783 +#: src/libslic3r/PrintConfig.cpp:3915 msgid "How far should the pad extend around the contained geometry" msgstr "Как далеко должна простираться подложка вокруг существующей геометрии." -#: src/libslic3r/PrintConfig.cpp:3793 +#: src/libslic3r/PrintConfig.cpp:3925 msgid "Max merge distance" msgstr "Максимальное расстояние слияния" -#: src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3927 msgid "" "Some objects can get along with a few smaller pads instead of a single big " "one. This parameter defines how far the center of two smaller pads should " @@ -15244,11 +17202,11 @@ msgstr "" "двух меньших подложек. Если они находятся слишком близко, то будут " "объединены в одну подложку." -#: src/libslic3r/PrintConfig.cpp:3815 +#: src/libslic3r/PrintConfig.cpp:3947 msgid "Pad wall slope" msgstr "Наклон стенки подложки" -#: src/libslic3r/PrintConfig.cpp:3817 +#: src/libslic3r/PrintConfig.cpp:3949 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." @@ -15256,23 +17214,23 @@ msgstr "" "Наклон стенки подложки относительно плоскости стола. 90 градусов означает " "прямые стены." -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3960 msgid "Create pad around object and ignore the support elevation" msgstr "Создаёт подложку вокруг модели, игнорируя высоту подъёма поддержкой." -#: src/libslic3r/PrintConfig.cpp:3833 +#: src/libslic3r/PrintConfig.cpp:3965 msgid "Pad around object everywhere" msgstr "Подложка вокруг модели везде" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3967 msgid "Force pad around object everywhere" msgstr "Принудительное создание подложки вокруг модели везде." -#: src/libslic3r/PrintConfig.cpp:3840 +#: src/libslic3r/PrintConfig.cpp:3972 msgid "Pad object gap" msgstr "Зазор между дном модели и подложкой" -#: src/libslic3r/PrintConfig.cpp:3842 +#: src/libslic3r/PrintConfig.cpp:3974 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." @@ -15280,11 +17238,11 @@ msgstr "" "Зазор между дном модели и сгенерированной подложкой в режиме нулевой высоты " "подъёма." -#: src/libslic3r/PrintConfig.cpp:3851 +#: src/libslic3r/PrintConfig.cpp:3983 msgid "Pad object connector stride" msgstr "Шаг соединительного элемента подложки модели" -#: src/libslic3r/PrintConfig.cpp:3853 +#: src/libslic3r/PrintConfig.cpp:3985 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." @@ -15292,47 +17250,47 @@ msgstr "" "Расстояние между двумя соединительными опорами, которые соединяют модель и " "сгенерированную подложку." -#: src/libslic3r/PrintConfig.cpp:3860 +#: src/libslic3r/PrintConfig.cpp:3992 msgid "Pad object connector width" msgstr "Ширина соединительного элемента подложки модели" -#: src/libslic3r/PrintConfig.cpp:3862 +#: src/libslic3r/PrintConfig.cpp:3994 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "" "Ширина соединительных опор, которые соединяют модель со сгенерированной " "подложкой." -#: src/libslic3r/PrintConfig.cpp:3869 +#: src/libslic3r/PrintConfig.cpp:4001 msgid "Pad object connector penetration" msgstr "Глубина проникновения соединительного элемента в модель" -#: src/libslic3r/PrintConfig.cpp:3872 +#: src/libslic3r/PrintConfig.cpp:4004 msgid "How much should the tiny connectors penetrate into the model body." msgstr "" "Задаёт как глубоко соединительные элементы должны проникают в тело модели." -#: src/libslic3r/PrintConfig.cpp:3879 +#: src/libslic3r/PrintConfig.cpp:4011 msgid "Enable hollowing" msgstr "Создавать полость" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:4013 msgid "Hollow out a model to have an empty interior" msgstr "Создание пустотелой модели." -#: src/libslic3r/PrintConfig.cpp:3886 +#: src/libslic3r/PrintConfig.cpp:4018 msgid "Wall thickness" msgstr "Толщина стенки" -#: src/libslic3r/PrintConfig.cpp:3888 +#: src/libslic3r/PrintConfig.cpp:4020 msgid "Minimum wall thickness of a hollowed model." msgstr "Минимальная толщина стенки полой модели." -#: src/libslic3r/PrintConfig.cpp:3896 +#: src/libslic3r/PrintConfig.cpp:4028 msgid "Accuracy" msgstr "Точность" -#: src/libslic3r/PrintConfig.cpp:3898 +#: src/libslic3r/PrintConfig.cpp:4030 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." @@ -15340,7 +17298,7 @@ msgstr "" "Быстродействие расчёта против точности расчёта. \n" "Низкие значения этого параметра могут привести к нежелательным артефактам." -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:4040 msgid "" "Hollowing is done in two steps: first, an imaginary interior is calculated " "deeper (offset plus the closing distance) in the object and then it's " @@ -15355,11 +17313,11 @@ msgstr "" "При нулевом значении внутреннее пространство будет больше всего напоминать " "наружную сторону модели." -#: src/libslic3r/PrintConfig.cpp:3920 +#: src/libslic3r/PrintConfig.cpp:4052 msgid "Print speed" msgstr "Скорость печати" -#: src/libslic3r/PrintConfig.cpp:3922 +#: src/libslic3r/PrintConfig.cpp:4054 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " @@ -15369,65 +17327,93 @@ msgstr "" "материалов с повышенной вязкостью или для некоторых полых деталей. Это " "замедляет наклон ванночки и добавляет задержку перед засветкой." -#: src/libslic3r/PrintConfig.cpp:4390 +#: src/libslic3r/PrintConfig.cpp:4065 +msgid "Format of the output SLA archive" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4070 +msgid "SLA output precision" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4071 +msgid "Minimum resolution in nanometers" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4542 msgid "Export OBJ" msgstr "Экспорт в OBJ" -#: src/libslic3r/PrintConfig.cpp:4391 +#: src/libslic3r/PrintConfig.cpp:4543 msgid "Export the model(s) as OBJ." msgstr "Экспортировать модель(и) в формат OBJ." -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4554 msgid "Export SLA" msgstr "Экспорт для SLA печати" -#: src/libslic3r/PrintConfig.cpp:4403 +#: src/libslic3r/PrintConfig.cpp:4555 msgid "Slice the model and export SLA printing layers as PNG." msgstr "Нарезать модель и экспортировать слои печати для SLA в формат PNG." -#: src/libslic3r/PrintConfig.cpp:4408 +#: src/libslic3r/PrintConfig.cpp:4560 msgid "Export 3MF" msgstr "Экспорт в 3MF" -#: src/libslic3r/PrintConfig.cpp:4409 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Export the model(s) as 3MF." msgstr "Экспортировать модель(и) в формат 3MF." -#: src/libslic3r/PrintConfig.cpp:4413 +#: src/libslic3r/PrintConfig.cpp:4565 msgid "Export AMF" msgstr "Экспорт в AMF" -#: src/libslic3r/PrintConfig.cpp:4414 +#: src/libslic3r/PrintConfig.cpp:4566 msgid "Export the model(s) as AMF." msgstr "Экспортировать модель(и) в формат AMF." -#: src/libslic3r/PrintConfig.cpp:4418 +#: src/libslic3r/PrintConfig.cpp:4570 msgid "Export STL" msgstr "Экспорт в STL" -#: src/libslic3r/PrintConfig.cpp:4419 +#: src/libslic3r/PrintConfig.cpp:4571 msgid "Export the model(s) as STL." msgstr "Экспортировать модель(и) в формат STL." -#: src/libslic3r/PrintConfig.cpp:4424 +#: src/libslic3r/PrintConfig.cpp:4576 msgid "Slice the model and export toolpaths as G-code." msgstr "" "Нарезать модель и экспортировать траекторию движения инструмента в G-код " "файл." -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4581 msgid "G-code viewer" msgstr "Просмотрщик G-кода" -#: src/libslic3r/PrintConfig.cpp:4430 +#: src/libslic3r/PrintConfig.cpp:4582 msgid "Visualize an already sliced and saved G-code" msgstr "Визуализация уже нарезанного и сохраненного G-кода" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4588 +msgid "OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4589 +msgid "Select the specified OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4594 +msgid "OpenGL debug output" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4595 +msgid "Activate OpenGL debug output on graphic cards which support it" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4601 msgid "Slice" msgstr "Нарезать" -#: src/libslic3r/PrintConfig.cpp:4436 +#: src/libslic3r/PrintConfig.cpp:4602 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." @@ -15435,67 +17421,71 @@ msgstr "" "Нарезает модель в зависимости от типа печати (FFF или SLA) на основе " "значения конфигурации printer_technology." -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4607 msgid "Help" msgstr "Помощь" -#: src/libslic3r/PrintConfig.cpp:4442 +#: src/libslic3r/PrintConfig.cpp:4608 msgid "Show this help." msgstr "Показать помощь." -#: src/libslic3r/PrintConfig.cpp:4447 +#: src/libslic3r/PrintConfig.cpp:4613 msgid "Help (FFF options)" msgstr "Помощь (FFF настройки)" -#: src/libslic3r/PrintConfig.cpp:4448 +#: src/libslic3r/PrintConfig.cpp:4614 msgid "Show the full list of print/G-code configuration options." msgstr "Показать полный список параметров конфигурации печати/G-кода." -#: src/libslic3r/PrintConfig.cpp:4452 +#: src/libslic3r/PrintConfig.cpp:4618 msgid "Help (SLA options)" msgstr "Помощь (SLA настройки)" -#: src/libslic3r/PrintConfig.cpp:4453 +#: src/libslic3r/PrintConfig.cpp:4619 msgid "Show the full list of SLA print configuration options." msgstr "Показать полный список параметров конфигурации SLA печати." -#: src/libslic3r/PrintConfig.cpp:4457 +#: src/libslic3r/PrintConfig.cpp:4623 msgid "Output Model Info" msgstr "Информация о выходной модели" -#: src/libslic3r/PrintConfig.cpp:4458 +#: src/libslic3r/PrintConfig.cpp:4624 msgid "Write information about the model to the console." msgstr "Записать информацию о модели в консоль." -#: src/libslic3r/PrintConfig.cpp:4462 +#: src/libslic3r/PrintConfig.cpp:4628 msgid "Save config file" msgstr "Сохранить конфигурацию" -#: src/libslic3r/PrintConfig.cpp:4463 +#: src/libslic3r/PrintConfig.cpp:4629 msgid "Save configuration to the specified file." msgstr "Сохраните конфигурацию в указанный файл." -#: src/libslic3r/PrintConfig.cpp:4473 +#: src/libslic3r/PrintConfig.cpp:4639 msgid "Align XY" msgstr "Выровнять по XY" -#: src/libslic3r/PrintConfig.cpp:4474 +#: src/libslic3r/PrintConfig.cpp:4640 msgid "Align the model to the given point." msgstr "Выровнять модель по заданной точке." -#: src/libslic3r/PrintConfig.cpp:4479 +#: src/libslic3r/PrintConfig.cpp:4645 msgid "Cut model at the given Z." msgstr "Разрезать модель по Z." -#: src/libslic3r/PrintConfig.cpp:4501 +#: src/libslic3r/PrintConfig.cpp:4666 +msgid "Center" +msgstr "По центру" + +#: src/libslic3r/PrintConfig.cpp:4667 msgid "Center the print around the given center." msgstr "Центрировать печать вокруг данного центра." -#: src/libslic3r/PrintConfig.cpp:4505 +#: src/libslic3r/PrintConfig.cpp:4671 msgid "Don't arrange" msgstr "Не расставлять" -#: src/libslic3r/PrintConfig.cpp:4506 +#: src/libslic3r/PrintConfig.cpp:4672 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." @@ -15503,11 +17493,11 @@ msgstr "" "Не переставлять данные модели перед объединением и сохранять их исходные XY " "координаты." -#: src/libslic3r/PrintConfig.cpp:4509 +#: src/libslic3r/PrintConfig.cpp:4675 msgid "Ensure on bed" msgstr "Обеспечивать размещение на столе" -#: src/libslic3r/PrintConfig.cpp:4510 +#: src/libslic3r/PrintConfig.cpp:4676 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." @@ -15515,23 +17505,23 @@ msgstr "" "Поднимает модель над столом, когда она частично находится внизу. Включено по " "умолчанию. Для отключения используйте --no-ensure-on-bed to disable." -#: src/libslic3r/PrintConfig.cpp:4514 +#: src/libslic3r/PrintConfig.cpp:4680 msgid "Duplicate" msgstr "Дубликат" -#: src/libslic3r/PrintConfig.cpp:4515 +#: src/libslic3r/PrintConfig.cpp:4681 msgid "Multiply copies by this factor." msgstr "Увеличить количество копий на этот коэффициент." -#: src/libslic3r/PrintConfig.cpp:4519 +#: src/libslic3r/PrintConfig.cpp:4685 msgid "Duplicate by grid" msgstr "Дублировать по сетке" -#: src/libslic3r/PrintConfig.cpp:4520 +#: src/libslic3r/PrintConfig.cpp:4686 msgid "Multiply copies by creating a grid." msgstr "Увеличить количество копий путём создания сетки." -#: src/libslic3r/PrintConfig.cpp:4524 +#: src/libslic3r/PrintConfig.cpp:4690 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." @@ -15539,7 +17529,7 @@ msgstr "" "Расставьте представленные модели на столе и объединить их в одну модель, " "чтобы выполнить действия один раз." -#: src/libslic3r/PrintConfig.cpp:4529 +#: src/libslic3r/PrintConfig.cpp:4695 msgid "" "Try to repair any non-manifold meshes (this option is implicitly added " "whenever we need to slice the model to perform the requested action)." @@ -15548,31 +17538,31 @@ msgstr "" "всякий раз, когда нужно нарезать модель для выполнения запрошенного " "действия)." -#: src/libslic3r/PrintConfig.cpp:4533 +#: src/libslic3r/PrintConfig.cpp:4699 msgid "Rotation angle around the Z axis in degrees." msgstr "Угол поворота вокруг оси Z в градусах." -#: src/libslic3r/PrintConfig.cpp:4537 +#: src/libslic3r/PrintConfig.cpp:4703 msgid "Rotate around X" msgstr "Поворот вокруг оси X" -#: src/libslic3r/PrintConfig.cpp:4538 +#: src/libslic3r/PrintConfig.cpp:4704 msgid "Rotation angle around the X axis in degrees." msgstr "Угол поворота вокруг оси X в градусах." -#: src/libslic3r/PrintConfig.cpp:4542 +#: src/libslic3r/PrintConfig.cpp:4708 msgid "Rotate around Y" msgstr "Поворот вокруг оси Y" -#: src/libslic3r/PrintConfig.cpp:4543 +#: src/libslic3r/PrintConfig.cpp:4709 msgid "Rotation angle around the Y axis in degrees." msgstr "Угол поворота вокруг оси Y в градусах." -#: src/libslic3r/PrintConfig.cpp:4548 +#: src/libslic3r/PrintConfig.cpp:4714 msgid "Scaling factor or percentage." msgstr "Коэффициент масштабирования или процент." -#: src/libslic3r/PrintConfig.cpp:4553 +#: src/libslic3r/PrintConfig.cpp:4719 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." @@ -15580,24 +17570,32 @@ msgstr "" "Обнаружение несвязанных частей в выбранных моделях и разделение их на " "отдельные объекты." -#: src/libslic3r/PrintConfig.cpp:4556 +#: src/libslic3r/PrintConfig.cpp:4722 msgid "Scale to Fit" msgstr "Отмасштабировать под область печати" -#: src/libslic3r/PrintConfig.cpp:4557 +#: src/libslic3r/PrintConfig.cpp:4723 msgid "Scale to fit the given volume." msgstr "Масштабировать в соответствии с заданным объёмом." -#: src/libslic3r/PrintConfig.cpp:4566 +#: src/libslic3r/PrintConfig.cpp:4727 +msgid "Delete files after loading" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4728 +msgid "Delete files after loading." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4736 msgid "Ignore non-existent config files" msgstr "Игнорировать несуществующие конфигурационные файлы" -#: src/libslic3r/PrintConfig.cpp:4567 +#: src/libslic3r/PrintConfig.cpp:4737 msgid "Do not fail if a file supplied to --load does not exist." msgstr "" "Не терпеть неудачу, если файла, предоставленного для --load, не существует." -#: src/libslic3r/PrintConfig.cpp:4570 +#: src/libslic3r/PrintConfig.cpp:4740 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." @@ -15605,7 +17603,7 @@ msgstr "" "Правило прямой совместимости при загрузке конфигураций из файлов " "конфигурации и файлов проекта (3MF, AMF)." -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4741 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -15618,11 +17616,11 @@ msgstr "" "неизвестное значение значением по умолчанию автоматически или путем их " "полной замены." -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4745 msgid "Bail out on unknown configuration values" msgstr "Отмена неизвестных значений конфигурации" -#: src/libslic3r/PrintConfig.cpp:4579 +#: src/libslic3r/PrintConfig.cpp:4746 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." @@ -15630,7 +17628,7 @@ msgstr "" "Позволяет считывать неизвестные значения конфигурации путем их полной замены " "значениями по умолчанию." -#: src/libslic3r/PrintConfig.cpp:4580 +#: src/libslic3r/PrintConfig.cpp:4747 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." @@ -15638,11 +17636,11 @@ msgstr "" "Позволяет считывать неизвестные значения конфигурации, автоматически заменяя " "их значениями по умолчанию." -#: src/libslic3r/PrintConfig.cpp:4584 +#: src/libslic3r/PrintConfig.cpp:4752 msgid "Load config file" msgstr "Загрузить конфигурацию" -#: src/libslic3r/PrintConfig.cpp:4585 +#: src/libslic3r/PrintConfig.cpp:4753 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -15650,11 +17648,11 @@ msgstr "" "Загрузить конфигурацию из указанного файла. Его можно использовать более " "одного раза для загрузки параметров из нескольких файлов." -#: src/libslic3r/PrintConfig.cpp:4588 +#: src/libslic3r/PrintConfig.cpp:4756 msgid "Output File" msgstr "Выходной файл" -#: src/libslic3r/PrintConfig.cpp:4589 +#: src/libslic3r/PrintConfig.cpp:4757 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." @@ -15662,11 +17660,11 @@ msgstr "" "Файл, в который будут записываться выходные данные (если он не указан, то " "будет основан на входном файле)." -#: src/libslic3r/PrintConfig.cpp:4593 +#: src/libslic3r/PrintConfig.cpp:4761 msgid "Single instance mode" msgstr "Одни экземпляр программы" -#: src/libslic3r/PrintConfig.cpp:4594 +#: src/libslic3r/PrintConfig.cpp:4762 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -15677,11 +17675,11 @@ msgstr "" "Переопределяет значение конфигурации \"single_instance\" из настроек " "приложения." -#: src/libslic3r/PrintConfig.cpp:4605 +#: src/libslic3r/PrintConfig.cpp:4767 msgid "Data directory" msgstr "Папка конфигурации пользователя" -#: src/libslic3r/PrintConfig.cpp:4606 +#: src/libslic3r/PrintConfig.cpp:4768 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -15690,11 +17688,11 @@ msgstr "" "Загрузите и сохраните настройки в данном каталоге. Это полезно для " "сохранения различных профилей или конфигураций из сетевого хранилища." -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4771 msgid "Logging level" msgstr "Уровень ведения журнала" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4772 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -15706,11 +17704,11 @@ msgstr "" "Например, loglevel=2 регистрирует неустранимые ошибки, ошибки и " "предупреждения." -#: src/libslic3r/PrintConfig.cpp:4616 +#: src/libslic3r/PrintConfig.cpp:4778 msgid "Render with a software renderer" msgstr "Визуализация с помощью программного рендеринга" -#: src/libslic3r/PrintConfig.cpp:4617 +#: src/libslic3r/PrintConfig.cpp:4779 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -15722,18 +17720,30 @@ msgstr "" msgid "Error with zip archive" msgstr "Ошибка с zip-архивом" -#: src/libslic3r/PrintObject.cpp:126 +#: src/libslic3r/PrintObject.cpp:152 msgid "Generating perimeters" msgstr "Генерация периметров" -#: src/libslic3r/PrintObject.cpp:229 +#: src/libslic3r/PrintObject.cpp:257 msgid "Preparing infill" msgstr "Подготовка к заполнению" -#: src/libslic3r/PrintObject.cpp:403 +#: src/libslic3r/PrintObject.cpp:402 +msgid "making infill" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:449 +msgid "Searching support spots" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:474 msgid "Generating support material" msgstr "Генерация поддержек" +#: src/libslic3r/PrintObject.cpp:495 +msgid "Estimating curled extrusions" +msgstr "" + #: resources/data/hints.ini: [hint:Fuzzy skin] msgid "" "Fuzzy skin\n" @@ -16150,6 +18160,36 @@ msgstr "" "Знаете ли вы, что PrusaSlicer можно переключить в полноэкранный режим? " "Используйте для этого горячую клавишу F11." +#: resources/data/hints.ini: [hint:Printables integration] +msgid "" +"Printables.com integration\n" +"Did you know that when you are browsing Printables.com, you can send 3D " +"model files to PrusaSlicer with a single click? Learn more in the " +"documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Cut tool] +msgid "" +"Cut tool\n" +"Did you know that you can cut a model at any angle and even create aligning " +"pins with the updated Cut tool? Learn more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Measurement tool] +msgid "" +"Measurement tool\n" +"Did you know that you can measure the distances between points, edges " +"and planes, the radius of a hole or the angle between edges or planes? Learn " +"more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Text tool] +msgid "" +"Text tool\n" +"Did you know that you can add custom text labels to your models or even use " +"the text as a modifier? Learn more in the documentation." +msgstr "" + #: ../src/common/debugrpt.cpp:586 msgid "" "\n" @@ -17305,6 +19345,10 @@ msgstr "Выровнять слева" msgid "Align Right" msgstr "Выровнять справа" +#: ../src/richtext/richtextsizepage.cpp:266 +msgid "Alignment" +msgstr "Выравнивание" + #: ../src/generic/filectrlg.cpp:1197 ../src/common/fldlgcmn.cpp:107 #, c-format msgid "All files (%s)|%s" @@ -18601,10 +20645,6 @@ msgstr "Декоративный" msgid "Default encoding" msgstr "Кодировка по-умолчанию" -#: ../src/dfb/fontmgr.cpp:180 -msgid "Default font" -msgstr "Шрифт по умолчанию" - #: ../src/generic/prntdlgg.cpp:510 msgid "Default printer" msgstr "Принтер по-умолчанию" @@ -18965,11 +21005,6 @@ msgstr "Ошибка при печати: " msgid "Error: " msgstr "Ошибка: " -#. TRANSLATORS: Name of keyboard key -#: ../src/common/accelcmn.cpp:69 -msgid "Esc" -msgstr "ESC" - #. TRANSLATORS: Name of keyboard key #: ../src/common/accelcmn.cpp:70 msgid "Escape" @@ -19716,11 +21751,6 @@ msgstr "Дискета" msgid "Folio, 8 1/2 x 13 in" msgstr "Фолио, 8 1/2 x 13 дюймов" -#: ../src/richtext/richtextformatdlg.cpp:344 ../src/osx/carbon/fontdlg.cpp:287 -#: ../src/common/stockitem.cpp:194 -msgid "Font" -msgstr "Шрифт" - #: ../src/richtext/richtextfontpage.cpp:221 msgid "Font &weight:" msgstr "&Толщина шрифта:" @@ -20839,10 +22869,6 @@ msgstr "Память VFS уже содержит файл '%s'!" msgid "Menu" msgstr "Меню" -#: ../src/common/msgout.cpp:124 -msgid "Message" -msgstr "Сообщение" - #: ../src/univ/themes/metal.cpp:168 msgid "Metal theme" msgstr "Тема Metal" @@ -20876,10 +22902,6 @@ msgstr "Отсутствует обязательный параметр." msgid "Modern" msgstr "Современный" -#: ../src/generic/filectrlg.cpp:427 -msgid "Modified" -msgstr "Изменён" - #: ../src/common/module.cpp:133 #, c-format msgid "Module \"%s\" initialization failed" @@ -20970,11 +22992,6 @@ msgstr "НовоеИмя" msgid "Next page" msgstr "Следующая станица" -#: ../include/wx/msgdlg.h:277 ../src/common/stockitem.cpp:177 -#: ../src/motif/msgdlg.cpp:196 -msgid "No" -msgstr "Нет" - #. TRANSLATORS: System cursor name #: ../src/propgrid/advprops.cpp:1764 msgid "No Entry" @@ -21210,12 +23227,6 @@ msgstr "Num_lock" msgid "Numbered outline" msgstr "Пронумерованный контур" -#: ../include/wx/msgdlg.h:278 ../src/richtext/richtextstyledlg.cpp:297 -#: ../src/common/stockitem.cpp:178 ../src/msw/msgdlg.cpp:454 -#: ../src/msw/msgdlg.cpp:747 ../src/gtk1/fontdlg.cpp:138 -msgid "OK" -msgstr "OK" - #: ../src/msw/ole/automtn.cpp:692 #, c-format msgid "OLE Automation error in %s: %s" @@ -21287,6 +23298,10 @@ msgstr "Параметр '%s' требует значение." msgid "Option '%s': '%s' cannot be converted to a date." msgstr "Параметр '%s': '%s' не может быть преобразован в дату." +#: ../src/generic/prntdlgg.cpp:618 +msgid "Options" +msgstr "Параметры" + #: ../src/propgrid/advprops.cpp:1606 msgid "Orange" msgstr "Оранжевый" @@ -22068,10 +24083,6 @@ msgstr "Выбрать регулярный или курсив." msgid "Select underlining or no underlining." msgstr "Выбрать подчёркивание или без подчёркивания." -#: ../src/motif/filedlg.cpp:220 -msgid "Selection" -msgstr "Выделение" - #: ../src/richtext/richtextliststylepage.cpp:187 #: ../src/richtext/richtextliststylepage.cpp:189 msgid "Selects the list level to edit." @@ -22963,10 +24974,6 @@ msgstr "Попытка удаления файла '%s' из памяти VFS, msgid "Turkish (ISO-8859-9)" msgstr "Турецкий (ISO-8859-9)" -#: ../src/generic/filectrlg.cpp:426 -msgid "Type" -msgstr "Тип" - #: ../src/richtext/richtextfontpage.cpp:151 #: ../src/richtext/richtextfontpage.cpp:153 msgid "Type a font name." @@ -23452,10 +25459,6 @@ msgstr "Использовать текущий параметр выравни msgid "Validation conflict" msgstr "Конфликт проверки" -#: ../src/propgrid/manager.cpp:238 -msgid "Value" -msgstr "Значение" - #: ../src/propgrid/props.cpp:386 ../src/propgrid/props.cpp:500 #, c-format msgid "Value must be %s or higher." @@ -23685,11 +25688,6 @@ msgstr "XPM: усечённые данные изображения в стро msgid "Yellow" msgstr "Жёлтый" -#: ../include/wx/msgdlg.h:276 ../src/common/stockitem.cpp:206 -#: ../src/motif/msgdlg.cpp:196 -msgid "Yes" -msgstr "Да" - #: ../src/osx/carbon/overlay.cpp:155 msgid "You cannot Clear an overlay that is not inited" msgstr "Нельзя очистить наложение на изображение без инициализации" diff --git a/resources/localization/tr/PrusaSlicer.mo b/resources/localization/tr/PrusaSlicer.mo index e61d56c07b9cd0b1e47915b2facbf4063d804c68..3494a2681335380c5de9683a77da9c17a6c6d406 100644 GIT binary patch delta 70031 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 O9Pdj#AMLzV?Ee5He+Q-j diff --git a/resources/localization/tr/PrusaSlicer_tr.po b/resources/localization/tr/PrusaSlicer_tr.po index 5638281cf94..89b56924ed3 100644 --- a/resources/localization/tr/PrusaSlicer_tr.po +++ b/resources/localization/tr/PrusaSlicer_tr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-01 16:30+0100\n" +"POT-Creation-Date: 2023-03-03 14:25+0100\n" "PO-Revision-Date: 2019-05-23 00:37+0300\n" "Last-Translator: \n" "Language-Team: \n" @@ -18,16 +18,16 @@ msgstr "" "X-Generator: Poedit 2.2.3\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 +#: src/slic3r/GUI/AboutDialog.cpp:46 src/slic3r/GUI/AboutDialog.cpp:306 msgid "Portions copyright" msgstr "Bölümler telif hakkı" -#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 +#: src/slic3r/GUI/AboutDialog.cpp:143 src/slic3r/GUI/AboutDialog.cpp:270 msgid "Copyright" msgstr "Telif Hakkı" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:143 +#: src/slic3r/GUI/AboutDialog.cpp:145 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -35,26 +35,26 @@ msgstr "" "İlgili tüm programların (kütüphanelerin) lisans sözleşmeleri, ana uygulama " "lisans sözleşmesinin bir parçasıdır" -#: src/slic3r/GUI/AboutDialog.cpp:212 +#: src/slic3r/GUI/AboutDialog.cpp:214 #, c-format, boost-format msgid "About %s" msgstr "%s Hakkında" -#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 -#: src/slic3r/GUI/GUI_App.cpp:262 +#: src/slic3r/GUI/AboutDialog.cpp:245 src/slic3r/GUI/AboutDialog.cpp:370 +#: src/slic3r/GUI/GUI_App.cpp:271 msgid "Version" msgstr "Sürüm" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:277 msgid "is licensed under the" msgstr "lisans türü" -#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:273 src/slic3r/GUI/GUI_App.cpp:277 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero Genel Kamu Lisansı, sürüm 3" -#: src/slic3r/GUI/AboutDialog.cpp:273 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -62,7 +62,7 @@ msgstr "" "PrusaSlicer, Alessandro Ranellucci ve RepRap topluluğuna ait olan Slic3r alt " "yapısına sahiptir." -#: src/slic3r/GUI/AboutDialog.cpp:274 +#: src/slic3r/GUI/AboutDialog.cpp:275 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -72,7 +72,7 @@ msgstr "" "Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik ve diğerlerinin katkıları " "ile." -#: src/slic3r/GUI/AboutDialog.cpp:310 +#: src/slic3r/GUI/AboutDialog.cpp:311 msgid "Copy Version Info" msgstr "" @@ -96,54 +96,54 @@ msgid "" msgstr "" #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:162 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:204 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:188 msgid "Slicing complete" msgstr "Dilimleme tamamlandı" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:199 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183 #, boost-format msgid "Masked SLA file exported to %1%" msgstr "Dışa aktarılan maskelenmiş SLA dosyası %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:286 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:279 msgid "Access violation" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:288 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:281 msgid "Illegal instruction" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:283 msgid "Divide by zero" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:292 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:285 msgid "Overflow" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:294 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:287 msgid "Underflow" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:297 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 msgid "Floating reserved operand" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:300 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:293 msgid "Stack overflow" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:659 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:726 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:652 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:719 msgid "Running post-processing scripts" msgstr "İşlem sonrası komutlar çalıştırılıyor" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:690 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:710 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:683 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:703 msgid "Unknown error occured during exporting G-code." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:695 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:688 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. Maybe the SD " @@ -151,7 +151,7 @@ msgid "" "Error message: %1%" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:698 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:691 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. There might be " @@ -159,39 +159,39 @@ msgid "" "device. The corrupted output G-code is at %1%.tmp." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:701 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:694 #, boost-format msgid "" "Renaming of the G-code after copying to the selected destination folder has " "failed. Current path is %1%.tmp. Please try exporting again." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:704 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:697 #, boost-format msgid "" "Copying of the temporary G-code has finished but the original code at %1% " "couldn't be opened during copy check. The output G-code is at %2%.tmp." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:707 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:700 #, boost-format msgid "" "Copying of the temporary G-code has finished but the exported code couldn't " "be opened during copy check. The output G-code is at %1%.tmp." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:715 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:708 #, boost-format msgid "G-code file exported to %1%" msgstr "Dışa aktarılan G-code dosyası %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:729 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:722 msgid "Copying of the temporary G-code to the output G-code failed" msgstr "" "Geçici G-code bilgilerinin kalıcı G-code çıktısına kopyalanma işlemiş " "başarısız oldu" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:751 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:738 #, boost-format msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" @@ -199,8 +199,9 @@ msgstr "" "Sırası" #: src/slic3r/GUI/BedShapeDialog.cpp:31 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2765 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1576 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:241 src/slic3r/GUI/Plater.cpp:220 +#: src/slic3r/GUI/Tab.cpp:2697 msgid "Size" msgstr "Boyut" @@ -208,7 +209,9 @@ msgstr "Boyut" msgid "Origin" msgstr "Başlangıç Noktası" -#: src/slic3r/GUI/BedShapeDialog.cpp:33 src/libslic3r/PrintConfig.cpp:1020 +#: src/slic3r/GUI/BedShapeDialog.cpp:33 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1994 +#: src/libslic3r/PrintConfig.cpp:1109 msgid "Diameter" msgstr "Çap" @@ -222,54 +225,62 @@ msgid "" "rectangle." msgstr "0,0 G-code koordinatının dikdörtgenin sol ön köşesine olan mesafesi." -#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:262 -#: src/slic3r/GUI/ConfigWizard.cpp:1476 src/slic3r/GUI/ConfigWizard.cpp:1490 +#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:291 +#: src/slic3r/GUI/ConfigWizard.cpp:1796 src/slic3r/GUI/ConfigWizard.cpp:1832 +#: src/slic3r/GUI/ConfigWizard.cpp:1846 #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:100 -#: src/slic3r/GUI/GCodeViewer.cpp:3181 src/slic3r/GUI/GCodeViewer.cpp:3187 -#: src/slic3r/GUI/GCodeViewer.cpp:3195 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 src/slic3r/GUI/GCodeViewer.cpp:3455 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 #: src/slic3r/GUI/GUI_ObjectLayers.cpp:145 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 src/libslic3r/PrintConfig.cpp:263 -#: src/libslic3r/PrintConfig.cpp:290 src/libslic3r/PrintConfig.cpp:297 -#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:520 -#: src/libslic3r/PrintConfig.cpp:546 src/libslic3r/PrintConfig.cpp:621 -#: src/libslic3r/PrintConfig.cpp:629 src/libslic3r/PrintConfig.cpp:679 -#: src/libslic3r/PrintConfig.cpp:813 src/libslic3r/PrintConfig.cpp:824 -#: src/libslic3r/PrintConfig.cpp:842 src/libslic3r/PrintConfig.cpp:1023 -#: src/libslic3r/PrintConfig.cpp:1235 src/libslic3r/PrintConfig.cpp:1302 -#: src/libslic3r/PrintConfig.cpp:1312 src/libslic3r/PrintConfig.cpp:1611 -#: src/libslic3r/PrintConfig.cpp:1805 src/libslic3r/PrintConfig.cpp:1866 -#: src/libslic3r/PrintConfig.cpp:1884 src/libslic3r/PrintConfig.cpp:1902 -#: src/libslic3r/PrintConfig.cpp:1965 src/libslic3r/PrintConfig.cpp:1975 -#: src/libslic3r/PrintConfig.cpp:2097 src/libslic3r/PrintConfig.cpp:2106 -#: src/libslic3r/PrintConfig.cpp:2125 src/libslic3r/PrintConfig.cpp:2146 -#: src/libslic3r/PrintConfig.cpp:2158 src/libslic3r/PrintConfig.cpp:2166 -#: src/libslic3r/PrintConfig.cpp:2207 src/libslic3r/PrintConfig.cpp:2215 -#: src/libslic3r/PrintConfig.cpp:2225 src/libslic3r/PrintConfig.cpp:2233 -#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2303 -#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2603 -#: src/libslic3r/PrintConfig.cpp:2620 src/libslic3r/PrintConfig.cpp:2721 -#: src/libslic3r/PrintConfig.cpp:2730 src/libslic3r/PrintConfig.cpp:2780 -#: src/libslic3r/PrintConfig.cpp:2932 src/libslic3r/PrintConfig.cpp:3020 -#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3034 -#: src/libslic3r/PrintConfig.cpp:3048 src/libslic3r/PrintConfig.cpp:3072 -#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3092 -#: src/libslic3r/PrintConfig.cpp:3372 src/libslic3r/PrintConfig.cpp:3413 -#: src/libslic3r/PrintConfig.cpp:3573 src/libslic3r/PrintConfig.cpp:3582 -#: src/libslic3r/PrintConfig.cpp:3591 src/libslic3r/PrintConfig.cpp:3601 -#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3676 -#: src/libslic3r/PrintConfig.cpp:3688 src/libslic3r/PrintConfig.cpp:3708 -#: src/libslic3r/PrintConfig.cpp:3718 src/libslic3r/PrintConfig.cpp:3728 -#: src/libslic3r/PrintConfig.cpp:3746 src/libslic3r/PrintConfig.cpp:3761 -#: src/libslic3r/PrintConfig.cpp:3775 src/libslic3r/PrintConfig.cpp:3786 -#: src/libslic3r/PrintConfig.cpp:3799 src/libslic3r/PrintConfig.cpp:3844 -#: src/libslic3r/PrintConfig.cpp:3854 src/libslic3r/PrintConfig.cpp:3863 -#: src/libslic3r/PrintConfig.cpp:3873 src/libslic3r/PrintConfig.cpp:3889 -#: src/libslic3r/PrintConfig.cpp:3913 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 src/libslic3r/PrintConfig.cpp:279 +#: src/libslic3r/PrintConfig.cpp:303 src/libslic3r/PrintConfig.cpp:310 +#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:657 src/libslic3r/PrintConfig.cpp:724 +#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:782 +#: src/libslic3r/PrintConfig.cpp:902 src/libslic3r/PrintConfig.cpp:913 +#: src/libslic3r/PrintConfig.cpp:931 src/libslic3r/PrintConfig.cpp:1112 +#: src/libslic3r/PrintConfig.cpp:1295 src/libslic3r/PrintConfig.cpp:1359 +#: src/libslic3r/PrintConfig.cpp:1369 src/libslic3r/PrintConfig.cpp:1650 +#: src/libslic3r/PrintConfig.cpp:1842 src/libslic3r/PrintConfig.cpp:1903 +#: src/libslic3r/PrintConfig.cpp:1921 src/libslic3r/PrintConfig.cpp:1939 +#: src/libslic3r/PrintConfig.cpp:1995 src/libslic3r/PrintConfig.cpp:2005 +#: src/libslic3r/PrintConfig.cpp:2127 src/libslic3r/PrintConfig.cpp:2136 +#: src/libslic3r/PrintConfig.cpp:2155 src/libslic3r/PrintConfig.cpp:2176 +#: src/libslic3r/PrintConfig.cpp:2188 src/libslic3r/PrintConfig.cpp:2196 +#: src/libslic3r/PrintConfig.cpp:2237 src/libslic3r/PrintConfig.cpp:2245 +#: src/libslic3r/PrintConfig.cpp:2255 src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2271 src/libslic3r/PrintConfig.cpp:2336 +#: src/libslic3r/PrintConfig.cpp:2565 src/libslic3r/PrintConfig.cpp:2632 +#: src/libslic3r/PrintConfig.cpp:2647 src/libslic3r/PrintConfig.cpp:2746 +#: src/libslic3r/PrintConfig.cpp:2755 src/libslic3r/PrintConfig.cpp:2801 +#: src/libslic3r/PrintConfig.cpp:2886 src/libslic3r/PrintConfig.cpp:2896 +#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3108 +#: src/libslic3r/PrintConfig.cpp:3115 src/libslic3r/PrintConfig.cpp:3122 +#: src/libslic3r/PrintConfig.cpp:3136 src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3170 src/libslic3r/PrintConfig.cpp:3180 +#: src/libslic3r/PrintConfig.cpp:3330 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3391 src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3444 src/libslic3r/PrintConfig.cpp:3456 +#: src/libslic3r/PrintConfig.cpp:3476 src/libslic3r/PrintConfig.cpp:3491 +#: src/libslic3r/PrintConfig.cpp:3501 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3681 src/libslic3r/PrintConfig.cpp:3878 +#: src/libslic3r/PrintConfig.cpp:3893 src/libslic3r/PrintConfig.cpp:3907 +#: src/libslic3r/PrintConfig.cpp:3918 src/libslic3r/PrintConfig.cpp:3931 +#: src/libslic3r/PrintConfig.cpp:3976 src/libslic3r/PrintConfig.cpp:3986 +#: src/libslic3r/PrintConfig.cpp:3995 src/libslic3r/PrintConfig.cpp:4005 +#: src/libslic3r/PrintConfig.cpp:4021 src/libslic3r/PrintConfig.cpp:4045 +#: src/libslic3r/PrintConfig.cpp:4072 msgid "mm" msgstr "mm" @@ -289,13 +300,13 @@ msgstr "Dikdörtgen" msgid "Circular" msgstr "Dairesel" -#: src/slic3r/GUI/BedShapeDialog.cpp:81 src/slic3r/GUI/GUI_Preview.cpp:252 -#: src/libslic3r/ExtrusionEntity.cpp:343 src/libslic3r/ExtrusionEntity.cpp:378 +#: src/slic3r/GUI/BedShapeDialog.cpp:81 msgid "Custom" msgstr "Özel" #: src/slic3r/GUI/BedShapeDialog.cpp:104 src/slic3r/GUI/BedShapeDialog.cpp:179 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1701 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1565 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1798 msgid "Shape" msgstr "Şekil" @@ -303,8 +314,8 @@ msgstr "Şekil" msgid "Load shape from STL..." msgstr "STL dosyadan şekil yükle..." -#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2147 +#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3914 +#: src/slic3r/GUI/MainFrame.cpp:2240 msgid "Settings" msgstr "Ayarlar" @@ -317,7 +328,7 @@ msgid "Load..." msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/Tab.cpp:3973 msgid "Remove" msgstr "Kaldır" @@ -329,77 +340,120 @@ msgstr "" msgid "Model" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:508 +#: src/slic3r/GUI/BedShapeDialog.cpp:506 msgid "Choose an STL file to import bed shape from:" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:514 src/slic3r/GUI/BedShapeDialog.cpp:562 -#: src/slic3r/GUI/BedShapeDialog.cpp:584 +#: src/slic3r/GUI/BedShapeDialog.cpp:512 src/slic3r/GUI/BedShapeDialog.cpp:560 +#: src/slic3r/GUI/BedShapeDialog.cpp:582 msgid "Invalid file format." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:525 +#: src/slic3r/GUI/BedShapeDialog.cpp:523 msgid "Error! Invalid model" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:533 +#: src/slic3r/GUI/BedShapeDialog.cpp:531 msgid "The selected file contains no geometry." msgstr "Seçilen dosya geometri içermiyor." -#: src/slic3r/GUI/BedShapeDialog.cpp:537 +#: src/slic3r/GUI/BedShapeDialog.cpp:535 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "Seçilen dosya birçok ayrı alan içerir. Bu durum desteklennozülktedir." -#: src/slic3r/GUI/BedShapeDialog.cpp:552 +#: src/slic3r/GUI/BedShapeDialog.cpp:550 msgid "Choose a file to import bed texture from (PNG/SVG):" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:574 +#: src/slic3r/GUI/BedShapeDialog.cpp:572 msgid "Choose an STL file to import bed model from:" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.hpp:95 src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/BedShapeDialog.hpp:96 src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape" msgstr "Tabla Şekli" -#: src/slic3r/GUI/BonjourDialog.cpp:55 +#: src/slic3r/GUI/BonjourDialog.cpp:58 msgid "Network lookup" msgstr "Ağ araması" -#: src/slic3r/GUI/BonjourDialog.cpp:72 +#: src/slic3r/GUI/BonjourDialog.cpp:75 src/slic3r/GUI/BonjourDialog.cpp:253 msgid "Address" msgstr "Adres" -#: src/slic3r/GUI/BonjourDialog.cpp:73 +#: src/slic3r/GUI/BonjourDialog.cpp:76 msgid "Hostname" msgstr "Ana bilgisayar adı" -#: src/slic3r/GUI/BonjourDialog.cpp:74 +#: src/slic3r/GUI/BonjourDialog.cpp:77 msgid "Service name" msgstr "Servis ismi" -#: src/slic3r/GUI/BonjourDialog.cpp:76 +#: src/slic3r/GUI/BonjourDialog.cpp:79 msgid "OctoPrint version" msgstr "OctoPrint sürümü" -#: src/slic3r/GUI/BonjourDialog.cpp:224 +#: src/slic3r/GUI/BonjourDialog.cpp:227 msgid "Searching for devices" msgstr "Cihazlar aranıyor" -#: src/slic3r/GUI/BonjourDialog.cpp:231 +#: src/slic3r/GUI/BonjourDialog.cpp:234 msgid "Finished" msgstr "Bitti" -#: src/slic3r/GUI/ButtonsDescription.cpp:42 +#: src/slic3r/GUI/BonjourDialog.cpp:240 +msgid "Multiple resolved IP addresses" +msgstr "" + +#: src/slic3r/GUI/BonjourDialog.cpp:249 +#, boost-format +msgid "" +"There are several IP addresses resolving to hostname %1%.\n" +"Please select one that should be used." +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:21 +msgid "Palette 1 (default)" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:22 +msgid "Palette 2" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:23 +msgid "Palette 3" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:24 +msgid "Palette 4" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:25 +msgid "Palette 5" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:26 +msgid "Palette 6" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:27 +msgid "Palette 7" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:28 +msgid "Palette 8" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:112 msgid "Revert color to default" msgstr "" -#: src/slic3r/GUI/ButtonsDescription.cpp:57 +#: src/slic3r/GUI/ButtonsDescription.cpp:127 msgid "Value is the same as the system value" msgstr "Girilen değer sistem değeriyle aynıdır" -#: src/slic3r/GUI/ButtonsDescription.cpp:58 +#: src/slic3r/GUI/ButtonsDescription.cpp:128 msgid "" "Value was changed and is not equal to the system value or the last saved " "preset" @@ -407,31 +461,55 @@ msgstr "" "Değer değiştirildi ve sistem değerine ya da son kaydedilen ön ayara eşit " "değil" -#: src/slic3r/GUI/ButtonsDescription.cpp:62 +#: src/slic3r/GUI/ButtonsDescription.cpp:155 +msgid "Default palette for mode markers" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2422 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Simple" +msgstr "Basit" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2424 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgctxt "Mode" +msgid "Advanced" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2425 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Expert" +msgstr "Uzman" + +#: src/slic3r/GUI/ButtonsDescription.cpp:182 +msgid "Revert color" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:200 msgid "Buttons And Text Colors Description" msgstr "Düğme ve Metin Renk Açıklamaları" -#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/ConfigManipulation.cpp:50 msgid "" "Layer height is not valid.\n" "\n" "The layer height will be reset to 0.01." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:50 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1449 -#: src/libslic3r/PrintConfig.cpp:286 +#: src/slic3r/GUI/ConfigManipulation.cpp:51 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1394 +#: src/libslic3r/PrintConfig.cpp:299 msgid "Layer height" msgstr "Katman yüksekliği" -#: src/slic3r/GUI/ConfigManipulation.cpp:61 +#: src/slic3r/GUI/ConfigManipulation.cpp:62 msgid "" "First layer height is not valid.\n" "\n" "The first layer height will be reset to 0.01." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:62 src/libslic3r/PrintConfig.cpp:1231 +#: src/slic3r/GUI/ConfigManipulation.cpp:63 src/libslic3r/PrintConfig.cpp:1291 msgid "First layer height" msgstr "İlk katman yüksekliği" @@ -442,230 +520,236 @@ msgid "" "- no top solid layers\n" "- 0% fill density\n" "- no support material\n" -"- Ensure vertical shell thickness enabled\n" "- Detect thin walls disabled" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:90 +#: src/slic3r/GUI/ConfigManipulation.cpp:89 msgid "Shall I adjust those settings in order to enable Spiral Vase?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:91 +#: src/slic3r/GUI/ConfigManipulation.cpp:90 msgid "Spiral Vase" msgstr "Spiral Vazo" -#: src/slic3r/GUI/ConfigManipulation.cpp:121 +#: src/slic3r/GUI/ConfigManipulation.cpp:123 msgid "" -"The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool " -"change.\n" -"(both support_material_extruder and support_material_interface_extruder need " -"to be set to 0)." +"For the Wipe Tower to work with the soluble supports, the support layers\n" +"need to be synchronized with the object layers." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:125 -msgid "Shall I adjust those settings in order to enable the Wipe Tower?" +#: src/slic3r/GUI/ConfigManipulation.cpp:126 +msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:126 -#: src/slic3r/GUI/ConfigManipulation.cpp:146 +#: src/slic3r/GUI/ConfigManipulation.cpp:127 +#: src/slic3r/GUI/ConfigManipulation.cpp:145 msgid "Wipe Tower" msgstr "Kule Sil" -#: src/slic3r/GUI/ConfigManipulation.cpp:142 +#: src/slic3r/GUI/ConfigManipulation.cpp:140 src/libslic3r/Print.cpp:672 msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers\n" -"need to be synchronized with the object layers." +"The Wipe Tower currently supports the non-soluble supports only if they are " +"printed with the current extruder without triggering a tool change. (both " +"support_material_extruder and support_material_interface_extruder need to be " +"set to 0)." msgstr "" +"Temizleme Kulesi şu anda çözülemeyen destekleri sadece bir takım " +"değişikliğini tetiklemeden mevcut ekstrüder ile basıldıysa desteklemektedir. " +"(Hem support_material_ekstrüder hem de support_material_interface_ekstrüder " +"0 olarak ayarlanmalıdır)." -#: src/slic3r/GUI/ConfigManipulation.cpp:145 -msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" +#: src/slic3r/GUI/ConfigManipulation.cpp:144 +msgid "Shall I adjust those settings in order to enable the Wipe Tower?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:164 +#: src/slic3r/GUI/ConfigManipulation.cpp:166 msgid "" "Supports work better, if the following feature is enabled:\n" "- Detect bridging perimeters" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:167 +#: src/slic3r/GUI/ConfigManipulation.cpp:169 msgid "Shall I adjust those settings for supports?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:168 +#: src/slic3r/GUI/ConfigManipulation.cpp:170 msgid "Support Generator" msgstr "Destek Üreticisi" -#: src/slic3r/GUI/ConfigManipulation.cpp:195 +#: src/slic3r/GUI/ConfigManipulation.cpp:194 #, boost-format msgid "The %1% infill pattern is not supposed to work at 100%% density." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:198 +#: src/slic3r/GUI/ConfigManipulation.cpp:196 msgid "Shall I switch to rectilinear fill pattern?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:199 +#: src/slic3r/GUI/ConfigManipulation.cpp:197 #: src/slic3r/GUI/GUI_Factories.cpp:55 src/slic3r/GUI/GUI_Factories.cpp:128 -#: src/slic3r/GUI/Plater.cpp:460 src/slic3r/GUI/Tab.cpp:1503 -#: src/slic3r/GUI/Tab.cpp:1505 src/libslic3r/PrintConfig.cpp:475 -#: src/libslic3r/PrintConfig.cpp:716 src/libslic3r/PrintConfig.cpp:743 -#: src/libslic3r/PrintConfig.cpp:1098 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1149 src/libslic3r/PrintConfig.cpp:1398 -#: src/libslic3r/PrintConfig.cpp:1427 src/libslic3r/PrintConfig.cpp:1496 -#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1535 -#: src/libslic3r/PrintConfig.cpp:2364 src/libslic3r/PrintConfig.cpp:2381 +#: src/slic3r/GUI/Plater.cpp:468 src/slic3r/GUI/Tab.cpp:1450 +#: src/slic3r/GUI/Tab.cpp:1452 src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:811 src/libslic3r/PrintConfig.cpp:831 +#: src/libslic3r/PrintConfig.cpp:1187 src/libslic3r/PrintConfig.cpp:1200 +#: src/libslic3r/PrintConfig.cpp:1225 src/libslic3r/PrintConfig.cpp:1444 +#: src/libslic3r/PrintConfig.cpp:1473 src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1557 src/libslic3r/PrintConfig.cpp:1576 +#: src/libslic3r/PrintConfig.cpp:2395 src/libslic3r/PrintConfig.cpp:2412 msgid "Infill" msgstr "Dolgu" -#: src/slic3r/GUI/ConfigManipulation.cpp:337 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Head penetration should not be greater than the head width." msgstr "Kafa penetrasyonu kafa genişliğinden daha büyük olmamalıdır." -#: src/slic3r/GUI/ConfigManipulation.cpp:339 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid Head penetration" msgstr "Geçersiz kafa penetrasyonu" -#: src/slic3r/GUI/ConfigManipulation.cpp:350 +#: src/slic3r/GUI/ConfigManipulation.cpp:362 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "Pinhead çapı, sütun çapından daha küçük olmalıdır." -#: src/slic3r/GUI/ConfigManipulation.cpp:352 +#: src/slic3r/GUI/ConfigManipulation.cpp:364 msgid "Invalid pinhead diameter" msgstr "Geçersiz iğne başı çapı" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20 msgid "Upgrade" msgstr "Sürüm yükselt" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22 msgid "Downgrade" msgstr "Sürüm düşür" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 msgid "Before roll back" msgstr "Geri almadan önce" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:340 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:26 src/libslic3r/PrintConfig.cpp:353 msgid "User" msgstr "Kullanıcı" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:329 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:29 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1135 msgid "Unknown" msgstr "Bilinmiyor" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 msgid "Active" msgstr "Aktif" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 msgid "PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 src/libslic3r/Preset.cpp:1341 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 src/libslic3r/Preset.cpp:1480 msgid "print" msgstr "yazdır" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:65 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 msgid "filaments" msgstr "filamentler" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 src/libslic3r/Preset.cpp:1343 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:67 src/libslic3r/Preset.cpp:1482 msgid "SLA print" msgstr "SLA baskısı" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69 -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/slic3r/GUI/GUI.cpp:340 -#: src/slic3r/GUI/Plater.cpp:821 src/libslic3r/Preset.cpp:1344 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/slic3r/GUI/GUI.cpp:331 +#: src/slic3r/GUI/Plater.cpp:851 src/libslic3r/Preset.cpp:1483 msgid "SLA material" msgstr "SLA malzemesi" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:71 src/libslic3r/Preset.cpp:1345 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 src/libslic3r/Preset.cpp:1484 msgid "printer" msgstr "yazıcı" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 src/slic3r/GUI/Tab.cpp:1366 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 src/slic3r/GUI/Tab.cpp:1311 msgid "vendor" msgstr "üretici" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 msgid "version" msgstr "sürüm" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:76 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 msgid "min PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:77 msgid "max PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "model" msgstr "model" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "variants" msgstr "varyantlar" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:93 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:92 #, c-format, boost-format msgid "Incompatible with this %s" msgstr "%s ile uyumsuz" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:96 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:95 msgid "Activate" msgstr "Etkinleştir" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:123 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:122 msgid "Configuration Snapshots" msgstr "Yapılandırma Anlık Görüntüleri" -#: src/slic3r/GUI/ConfigWizard.cpp:262 +#: src/slic3r/GUI/ConfigWizard.cpp:291 msgid "nozzle" msgstr "nozül" -#: src/slic3r/GUI/ConfigWizard.cpp:266 +#: src/slic3r/GUI/ConfigWizard.cpp:295 msgid "Alternate nozzles:" msgstr "Alternatif nozüller:" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "All standard" msgstr "Tüm standartlar" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "Standard" msgstr "Standart" -#: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3833 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 +#: src/slic3r/GUI/ConfigWizard.cpp:360 src/slic3r/GUI/ConfigWizard.cpp:681 +#: src/slic3r/GUI/FileArchiveDialog.cpp:261 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 src/slic3r/GUI/Preferences.cpp:550 +#: src/slic3r/GUI/Tab.cpp:4058 src/slic3r/GUI/UnsavedChangesDialog.cpp:1161 msgid "All" msgstr "Tümü" -#: src/slic3r/GUI/ConfigWizard.cpp:332 src/slic3r/GUI/ConfigWizard.cpp:652 -#: src/slic3r/GUI/DoubleSlider.cpp:2030 src/slic3r/GUI/Plater.cpp:432 -#: src/slic3r/GUI/Plater.cpp:579 src/slic3r/GUI/Preferences.cpp:436 -#: src/libslic3r/PrintConfig.cpp:1291 +#: src/slic3r/GUI/ConfigWizard.cpp:361 src/slic3r/GUI/ConfigWizard.cpp:682 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 +#: src/slic3r/GUI/FileArchiveDialog.cpp:265 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1984 src/slic3r/GUI/Plater.cpp:439 +#: src/slic3r/GUI/Plater.cpp:594 src/slic3r/GUI/Preferences.cpp:552 +#: src/libslic3r/PrintConfig.cpp:1347 msgid "None" msgstr "Hiçbiri" -#: src/slic3r/GUI/ConfigWizard.cpp:484 +#: src/slic3r/GUI/ConfigWizard.cpp:513 #, c-format, boost-format msgid "Welcome to the %s Configuration Assistant" msgstr "%s Yapılandırma Asistanına Hoş Geldiniz" -#: src/slic3r/GUI/ConfigWizard.cpp:486 +#: src/slic3r/GUI/ConfigWizard.cpp:515 #, c-format, boost-format msgid "Welcome to the %s Configuration Wizard" msgstr "%s Yapılandırma Sihirbazına Hoş Geldiniz" -#: src/slic3r/GUI/ConfigWizard.cpp:488 +#: src/slic3r/GUI/ConfigWizard.cpp:517 msgid "Welcome" msgstr "Hoşgeldiniz" -#: src/slic3r/GUI/ConfigWizard.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:519 #, c-format, boost-format msgid "" "Hello, welcome to %s! This %s helps you with the initial configuration; just " @@ -675,104 +759,133 @@ msgstr "" "yardımcı olacak ve sadece birkaç ayar yaptıktan sonra yazdırmaya hazır " "olacaksınız." -#: src/slic3r/GUI/ConfigWizard.cpp:495 +#: src/slic3r/GUI/ConfigWizard.cpp:524 msgid "Remove user profiles (a snapshot will be taken beforehand)" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:498 +#: src/slic3r/GUI/ConfigWizard.cpp:527 msgid "" "Perform desktop integration (Sets this binary to be searchable by the " "system)." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:550 +#: src/slic3r/GUI/ConfigWizard.cpp:579 #, c-format, boost-format msgid "%s Family" msgstr "%s Ailesi" -#: src/slic3r/GUI/ConfigWizard.cpp:640 +#: src/slic3r/GUI/ConfigWizard.cpp:670 msgid "Printer:" msgstr "Yazıcı:" -#: src/slic3r/GUI/ConfigWizard.cpp:642 +#: src/slic3r/GUI/ConfigWizard.cpp:672 msgid "Vendor:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:643 +#: src/slic3r/GUI/ConfigWizard.cpp:673 msgid "Profile:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:720 src/slic3r/GUI/ConfigWizard.cpp:892 -#: src/slic3r/GUI/ConfigWizard.cpp:952 src/slic3r/GUI/ConfigWizard.cpp:1088 +#: src/slic3r/GUI/ConfigWizard.cpp:750 src/slic3r/GUI/ConfigWizard.cpp:938 +#: src/slic3r/GUI/ConfigWizard.cpp:1024 src/slic3r/GUI/ConfigWizard.cpp:1163 msgid "(All)" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:754 src/slic3r/GUI/ConfigWizard.cpp:1165 +msgid "(Templates)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:789 #, boost-format msgid "" -"%1% marked with * are not compatible with some installed " -"printers." +"%1% visible for (\"Template\") printer are universal profiles " +"available for all printers. These might not be compatible with your printer." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:752 src/slic3r/GUI/ConfigWizard.cpp:2043 -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filaments" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 msgid "SLA materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:755 +#: src/slic3r/GUI/ConfigWizard.cpp:791 +#, boost-format +msgid "" +"%1% marked with * are not compatible with some installed " +"printers." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:794 #, boost-format msgid "All installed printers are compatible with the selected %1%." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/libslic3r/Preset.cpp:1342 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/libslic3r/Preset.cpp:1481 msgid "filament" msgstr "filaman" -#: src/slic3r/GUI/ConfigWizard.cpp:778 +#: src/slic3r/GUI/ConfigWizard.cpp:818 msgid "" "Only the following installed printers are compatible with the selected " "filaments" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:779 +#: src/slic3r/GUI/ConfigWizard.cpp:819 msgid "" "Only the following installed printers are compatible with the selected SLA " "materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1213 +msgid "" +"You have selected template filament. Please note that these filaments are " +"available for all printers but are NOT certain to be compatible with your " +"printer. Do you still wish to have this filament selected?\n" +"(This message won't be displayed again.)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1214 src/slic3r/GUI/ConfigWizard.cpp:2720 +#: src/slic3r/GUI/ConfigWizard.cpp:2860 src/slic3r/GUI/DoubleSlider.cpp:2591 +#: src/slic3r/GUI/DoubleSlider.cpp:2612 src/slic3r/GUI/GUI.cpp:245 +#: src/slic3r/GUI/GUI_App.cpp:3458 src/slic3r/GUI/UpdateDialogs.cpp:204 +#: src/slic3r/GUI/UpdateDialogs.cpp:212 src/slic3r/GUI/UpdateDialogs.cpp:217 +#: src/slic3r/GUI/UpdateDialogs.cpp:222 src/slic3r/GUI/UpdateDialogs.cpp:229 +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +msgid "Notice" +msgstr "Bilgilendirme" + +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer Setup" msgstr "Özel Yazıcı Ayarı" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer" msgstr "Özel Yazıcı" -#: src/slic3r/GUI/ConfigWizard.cpp:1177 +#: src/slic3r/GUI/ConfigWizard.cpp:1264 msgid "Define a custom printer profile" msgstr "Özel bir yazıcı profili tanımla" -#: src/slic3r/GUI/ConfigWizard.cpp:1179 +#: src/slic3r/GUI/ConfigWizard.cpp:1265 msgid "Custom profile name:" msgstr "Özel profil ismi:" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Automatic updates" msgstr "Otomatik güncelleme" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Updates" msgstr "Güncellemeler" -#: src/slic3r/GUI/ConfigWizard.cpp:1214 +#: src/slic3r/GUI/ConfigWizard.cpp:1290 msgid "Check for application updates" msgstr "Güncellemeleri kontrol et" -#: src/slic3r/GUI/ConfigWizard.cpp:1218 +#: src/slic3r/GUI/ConfigWizard.cpp:1294 #, c-format, boost-format msgid "" "If enabled, %s checks for new application versions online. When a new " @@ -785,11 +898,11 @@ msgstr "" "(hiçbir zaman program kullanımı sırasında değil) bir bildirim görüntülenir. " "Bu sadece bir bildirim mekanizmasıdır, otomatik kurulum yapılmaz." -#: src/slic3r/GUI/ConfigWizard.cpp:1224 src/slic3r/GUI/Preferences.cpp:175 +#: src/slic3r/GUI/ConfigWizard.cpp:1300 src/slic3r/GUI/Preferences.cpp:306 msgid "Update built-in Presets automatically" msgstr "Yerleşik Hazır Ayarları otomatik olarak güncelle" -#: src/slic3r/GUI/ConfigWizard.cpp:1228 +#: src/slic3r/GUI/ConfigWizard.cpp:1304 #, c-format, boost-format msgid "" "If enabled, %s downloads updates of built-in system presets in the " @@ -802,7 +915,7 @@ msgstr "" "indirilir. Yeni bir ön ayar sürümü kullanılabilir olduğunda, uygulama " "başlangıcında sunulur." -#: src/slic3r/GUI/ConfigWizard.cpp:1231 +#: src/slic3r/GUI/ConfigWizard.cpp:1307 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." @@ -810,7 +923,7 @@ msgstr "" "Güncellemeler, kullanıcının izni olmadan asla uygulanmaz ve asla " "kullanıcının kişisel ayarlarının üzerine yazılmaz." -#: src/slic3r/GUI/ConfigWizard.cpp:1236 +#: src/slic3r/GUI/ConfigWizard.cpp:1312 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." @@ -818,17 +931,61 @@ msgstr "" "Ek olarak, bir güncelleme uygulanmadan önce tüm konfigürasyonun bir yedeği " "oluşturulur." -#: src/slic3r/GUI/ConfigWizard.cpp:1243 src/slic3r/GUI/GUI_Factories.cpp:726 -#: src/slic3r/GUI/Plater.cpp:3582 +#: src/slic3r/GUI/ConfigWizard.cpp:1361 src/slic3r/GUI/Preferences.cpp:1076 +msgid "Download path" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1366 src/slic3r/GUI/FirmwareDialog.cpp:815 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:300 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +msgid "Browse" +msgstr "Gözat" + +#: src/slic3r/GUI/ConfigWizard.cpp:1371 +msgid "Choose folder:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads from URL" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1417 +msgid "Allow built-in downloader" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1424 +#, c-format, boost-format +msgid "" +"If enabled, %s registers to start on custom URL on www.printables.com. You " +"will be able to use button with %s logo to open models in this %s. The model " +"will be downloaded into folder you choose bellow." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1431 +msgid "" +"On Linux systems the process of registration also creates desktop " +"integration files for this version of application." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1458 +msgid "Chosen directory for downloads does not Exists." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1545 src/slic3r/GUI/GUI_Factories.cpp:810 +#: src/slic3r/GUI/Plater.cpp:3732 msgid "Reload from disk" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1246 +#: src/slic3r/GUI/ConfigWizard.cpp:1548 msgid "" "Export full pathnames of models and parts sources into 3mf and amf files" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1250 +#: src/slic3r/GUI/ConfigWizard.cpp:1552 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked.\n" @@ -836,23 +993,23 @@ msgid "" "using an open file dialog." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1259 +#: src/slic3r/GUI/ConfigWizard.cpp:1561 msgid "Files association" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1261 src/slic3r/GUI/Preferences.cpp:157 +#: src/slic3r/GUI/ConfigWizard.cpp:1563 src/slic3r/GUI/Preferences.cpp:292 msgid "Associate .3mf files to PrusaSlicer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1262 src/slic3r/GUI/Preferences.cpp:164 +#: src/slic3r/GUI/ConfigWizard.cpp:1564 src/slic3r/GUI/Preferences.cpp:297 msgid "Associate .stl files to PrusaSlicer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1272 +#: src/slic3r/GUI/ConfigWizard.cpp:1574 msgid "View mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1274 +#: src/slic3r/GUI/ConfigWizard.cpp:1576 msgid "" "PrusaSlicer's user interfaces comes in three variants:\n" "Simple, Advanced, and Expert.\n" @@ -861,82 +1018,96 @@ msgid "" "fine-tuning, they are suitable for advanced and expert users, respectively." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1279 +#: src/slic3r/GUI/ConfigWizard.cpp:1581 msgid "Simple mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1280 +#: src/slic3r/GUI/ConfigWizard.cpp:1582 msgid "Advanced mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1281 +#: src/slic3r/GUI/ConfigWizard.cpp:1583 msgid "Expert mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1287 +#: src/slic3r/GUI/ConfigWizard.cpp:1596 msgid "The size of the object can be specified in inches" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1288 +#: src/slic3r/GUI/ConfigWizard.cpp:1597 msgid "Use inches" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1322 +#: src/slic3r/GUI/ConfigWizard.cpp:1617 msgid "Other Vendors" msgstr "Diğer Üreticiler" -#: src/slic3r/GUI/ConfigWizard.cpp:1326 +#: src/slic3r/GUI/ConfigWizard.cpp:1621 #, c-format, boost-format msgid "Pick another vendor supported by %s" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 msgid "Firmware Type" msgstr "Yazılım Türü" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2366 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 src/slic3r/GUI/Tab.cpp:2354 msgid "Firmware" msgstr "Yazılım" -#: src/slic3r/GUI/ConfigWizard.cpp:1361 +#: src/slic3r/GUI/ConfigWizard.cpp:1658 msgid "Choose the type of firmware used by your printer." msgstr "Yazıcınız tarafından kullanılan yazılım türünü seçin." -#: src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/ConfigWizard.cpp:1707 src/slic3r/GUI/ConfigWizard.cpp:1778 +#: src/slic3r/GUI/ConfigWizard.cpp:1783 src/slic3r/GUI/ConfigWizard.cpp:1788 +#: src/slic3r/GUI/Field.cpp:258 src/slic3r/GUI/Field.cpp:328 +#: src/slic3r/GUI/Field.cpp:1585 src/slic3r/GUI/GUI_ObjectLayers.cpp:435 +msgid "Invalid numeric input." +msgstr "Geçersiz nümerik giriş." + +#: src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape and Size" msgstr "Tabla Şekil ve Ölçüsü" -#: src/slic3r/GUI/ConfigWizard.cpp:1399 +#: src/slic3r/GUI/ConfigWizard.cpp:1735 msgid "Set the shape of your printer's bed." msgstr "Yazıcı tablasının şeklini ayarlayın." -#: src/slic3r/GUI/ConfigWizard.cpp:1433 src/slic3r/GUI/Field.cpp:255 -#: src/slic3r/GUI/Field.cpp:324 src/slic3r/GUI/Field.cpp:1561 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:435 -msgid "Invalid numeric input." -msgstr "Geçersiz nümerik giriş." +#: src/slic3r/GUI/ConfigWizard.cpp:1755 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1610 +msgid "Build Volume" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1758 +msgid "Set vertical size of your printer." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1795 +msgid "Max print height:" +msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Filament and Nozzle Diameters" msgstr "Filament ve Nozül Çapları" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Print Diameters" msgstr "Baskı Çapları" -#: src/slic3r/GUI/ConfigWizard.cpp:1472 +#: src/slic3r/GUI/ConfigWizard.cpp:1828 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "Yazıcınızın nozül çapını girin." -#: src/slic3r/GUI/ConfigWizard.cpp:1475 +#: src/slic3r/GUI/ConfigWizard.cpp:1831 msgid "Nozzle Diameter:" msgstr "Nozül Çapı:" -#: src/slic3r/GUI/ConfigWizard.cpp:1485 +#: src/slic3r/GUI/ConfigWizard.cpp:1841 msgid "Enter the diameter of your filament." msgstr "Filament çapını girin." -#: src/slic3r/GUI/ConfigWizard.cpp:1486 +#: src/slic3r/GUI/ConfigWizard.cpp:1842 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." @@ -944,37 +1115,38 @@ msgstr "" "İyi bir hassasiyet gereklidir, bu nedenle bir kumpas kullanın ve filament " "boyunca birçok ölçüm yapın, ardından ortalama değeri girin." -#: src/slic3r/GUI/ConfigWizard.cpp:1489 +#: src/slic3r/GUI/ConfigWizard.cpp:1845 msgid "Filament Diameter:" msgstr "Filament Çapı:" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Nozzle and Bed Temperatures" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Temperatures" msgstr "Sıcaklıklar" -#: src/slic3r/GUI/ConfigWizard.cpp:1563 +#: src/slic3r/GUI/ConfigWizard.cpp:1919 msgid "Enter the temperature needed for extruding your filament." msgstr "Filament ilerletmek için gereken sıcaklığı girin." -#: src/slic3r/GUI/ConfigWizard.cpp:1564 +#: src/slic3r/GUI/ConfigWizard.cpp:1920 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "Temel kural PLA için 160 ila 230 °C ve ABS için 215 ila 250 °C'dir." -#: src/slic3r/GUI/ConfigWizard.cpp:1567 +#: src/slic3r/GUI/ConfigWizard.cpp:1923 msgid "Extrusion Temperature:" msgstr "Ekstrüder Sıcaklığı:" -#: src/slic3r/GUI/ConfigWizard.cpp:1568 src/slic3r/GUI/ConfigWizard.cpp:1582 -#: src/libslic3r/PrintConfig.cpp:418 src/libslic3r/PrintConfig.cpp:1211 -#: src/libslic3r/PrintConfig.cpp:1266 src/libslic3r/PrintConfig.cpp:2842 +#: src/slic3r/GUI/ConfigWizard.cpp:1924 src/slic3r/GUI/ConfigWizard.cpp:1938 +#: src/libslic3r/PrintConfig.cpp:437 src/libslic3r/PrintConfig.cpp:1271 +#: src/libslic3r/PrintConfig.cpp:1326 src/libslic3r/PrintConfig.cpp:2930 +#: src/libslic3r/PrintConfig.cpp:3689 msgid "°C" msgstr "°C" -#: src/slic3r/GUI/ConfigWizard.cpp:1577 +#: src/slic3r/GUI/ConfigWizard.cpp:1933 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." @@ -982,7 +1154,7 @@ msgstr "" "Filamentin ısıtılmış tablaya yapışmasını sağlamak için gereken sıcaklığı " "girin." -#: src/slic3r/GUI/ConfigWizard.cpp:1578 +#: src/slic3r/GUI/ConfigWizard.cpp:1934 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." @@ -990,165 +1162,164 @@ msgstr "" "Genel kural PLA için 60 °C ve ABS için 110 °C'dir. Isıtılmış tabla yoksa " "sıfır girin." -#: src/slic3r/GUI/ConfigWizard.cpp:1581 +#: src/slic3r/GUI/ConfigWizard.cpp:1937 msgid "Bed Temperature:" msgstr "Tabla Sıcaklığı:" -#: src/slic3r/GUI/ConfigWizard.cpp:2043 src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2097 +#: src/slic3r/GUI/ConfigWizard.cpp:2464 msgid "FFF Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2102 +#: src/slic3r/GUI/ConfigWizard.cpp:2469 msgid "SLA Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2338 +#: src/slic3r/GUI/ConfigWizard.cpp:2718 #, boost-format msgid "" "Following printer profiles has no default filament: %1%Please select one " "manually." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2339 +#: src/slic3r/GUI/ConfigWizard.cpp:2719 #, boost-format msgid "" "Following printer profiles has no default material: %1%Please select one " "manually." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2340 src/slic3r/GUI/ConfigWizard.cpp:2438 -#: src/slic3r/GUI/DoubleSlider.cpp:2522 src/slic3r/GUI/DoubleSlider.cpp:2543 -#: src/slic3r/GUI/GUI.cpp:232 -msgid "Notice" -msgstr "Bilgilendirme" - -#: src/slic3r/GUI/ConfigWizard.cpp:2459 +#: src/slic3r/GUI/ConfigWizard.cpp:2883 msgid "The following FFF printer models have no filament selected:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2463 +#: src/slic3r/GUI/ConfigWizard.cpp:2887 msgid "Do you want to select default filaments for these FFF printer models?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2477 +#: src/slic3r/GUI/ConfigWizard.cpp:2901 msgid "The following SLA printer models have no materials selected:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2481 +#: src/slic3r/GUI/ConfigWizard.cpp:2905 msgid "Do you want to select default SLA materials for these printer models?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2523 +#: src/slic3r/GUI/ConfigWizard.cpp:2947 msgid "Configuration is edited in ConfigWizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2566 +#: src/slic3r/GUI/ConfigWizard.cpp:3000 msgid "All user presets will be deleted." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2596 +#: src/slic3r/GUI/ConfigWizard.cpp:3037 msgid "A new vendor was installed and one of its printers will be activated" msgid_plural "" "New vendors were installed and one of theirs printers will be activated" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/ConfigWizard.cpp:2625 +#: src/slic3r/GUI/ConfigWizard.cpp:3069 msgid "Do you want to continue changing the configuration?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2691 +#: src/slic3r/GUI/ConfigWizard.cpp:3136 msgid "A new Printer was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2696 +#: src/slic3r/GUI/ConfigWizard.cpp:3141 msgid "Some Printers were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2717 +#: src/slic3r/GUI/ConfigWizard.cpp:3162 msgid "A new filament was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2718 +#: src/slic3r/GUI/ConfigWizard.cpp:3163 msgid "A new SLA material was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some filaments were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some SLA materials were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2773 +#: src/slic3r/GUI/ConfigWizard.cpp:3218 msgid "Custom printer was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2858 +#: src/slic3r/GUI/ConfigWizard.cpp:3306 msgid "Select all standard printers" msgstr "Tüm standart yazıcıları seç" -#: src/slic3r/GUI/ConfigWizard.cpp:2861 +#: src/slic3r/GUI/ConfigWizard.cpp:3309 msgid "< &Back" msgstr "< &Geri" -#: src/slic3r/GUI/ConfigWizard.cpp:2862 +#: src/slic3r/GUI/ConfigWizard.cpp:3310 msgid "&Next >" msgstr "&İleri >" -#: src/slic3r/GUI/ConfigWizard.cpp:2863 +#: src/slic3r/GUI/ConfigWizard.cpp:3311 msgid "&Finish" msgstr "&Bitti" -#: src/slic3r/GUI/ConfigWizard.cpp:2864 -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:3312 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:657 +#: src/slic3r/GUI/FileArchiveDialog.cpp:274 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 #: src/slic3r/GUI/FirmwareDialog.cpp:153 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1593 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1365 #: src/slic3r/GUI/ProgressStatusBar.cpp:26 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:93 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:879 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:96 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:907 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1606 msgid "Cancel" msgstr "İptal" -#: src/slic3r/GUI/ConfigWizard.cpp:2884 +#: src/slic3r/GUI/ConfigWizard.cpp:3332 msgid "Prusa FFF Technology Printers" msgstr "Prusa FFF Teknoloji Yazıcılar" -#: src/slic3r/GUI/ConfigWizard.cpp:2892 +#: src/slic3r/GUI/ConfigWizard.cpp:3340 msgid "Prusa MSLA Technology Printers" msgstr "Prusa MSLA Teknoloji Yazıcılar" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filament Profiles Selection" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 src/slic3r/GUI/ConfigWizard.cpp:2915 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 src/slic3r/GUI/ConfigWizard.cpp:3363 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Type:" msgstr "Tür:" -#: src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Material Profiles Selection" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:3036 +#: src/slic3r/GUI/ConfigWizard.cpp:3486 msgid "Configuration Assistant" msgstr "Yapılandırma Asistanı" -#: src/slic3r/GUI/ConfigWizard.cpp:3037 +#: src/slic3r/GUI/ConfigWizard.cpp:3487 msgid "Configuration &Assistant" msgstr "Yapılandırma &Asistanı" -#: src/slic3r/GUI/ConfigWizard.cpp:3039 +#: src/slic3r/GUI/ConfigWizard.cpp:3489 msgid "Configuration Wizard" msgstr "Yapılandırma Sihirbazını" -#: src/slic3r/GUI/ConfigWizard.cpp:3040 +#: src/slic3r/GUI/ConfigWizard.cpp:3490 msgid "Configuration &Wizard" msgstr "Yapılandırma Sihirbazı" @@ -1162,37 +1333,54 @@ msgstr "" msgid "Performing desktop integration failed - Could not find executable." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:378 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:383 msgid "" "Performing desktop integration failed because the application directory was " "not found." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:419 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:423 msgid "" "Performing desktop integration failed - could not create Gcodeviewer desktop " "file. PrusaSlicer desktop file was probably created successfully." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:459 -#: src/slic3r/GUI/GUI_App.cpp:2245 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:472 +msgid "" +"Performing downloader desktop integration failed - boost::filesystem::" +"canonical did not return appimage path." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:484 +msgid "" +"Performing downloader desktop integration failed - Could not find executable." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:602 +msgid "" +"Performing downloader desktop integration failed because the application " +"directory was not found." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:626 +#: src/slic3r/GUI/GUI_App.cpp:2407 msgid "Desktop Integration" msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:466 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:633 msgid "" "Desktop Integration sets this binary to be searchable by the system.\n" "\n" "Press \"Perform\" to proceed." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:480 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:647 msgid "Perform" msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1342 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:653 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/KBShortcutsDialog.cpp:106 +#: src/slic3r/GUI/MainFrame.cpp:1426 msgid "Undo" msgstr "Geri Al" @@ -1200,19 +1388,19 @@ msgstr "Geri Al" msgid "Place bearings in slots and resume printing" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1379 +#: src/slic3r/GUI/DoubleSlider.cpp:1448 msgid "One layer mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1381 +#: src/slic3r/GUI/DoubleSlider.cpp:1450 msgid "Discard all custom changes" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1385 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:1454 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to move" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1388 +#: src/slic3r/GUI/DoubleSlider.cpp:1457 #, c-format, boost-format msgid "" "Jump to height %s\n" @@ -1220,58 +1408,58 @@ msgid "" "or Set extruder sequence for the entire print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1391 +#: src/slic3r/GUI/DoubleSlider.cpp:1460 #, c-format, boost-format msgid "" "Jump to height %s\n" "or Set ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1396 +#: src/slic3r/GUI/DoubleSlider.cpp:1465 msgid "Edit current color - Right click the colored slider segment" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1398 +#: src/slic3r/GUI/DoubleSlider.cpp:1467 msgid "This is wipe tower layer" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1408 +#: src/slic3r/GUI/DoubleSlider.cpp:1477 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing sequentually." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1412 +#: src/slic3r/GUI/DoubleSlider.cpp:1481 msgid "Print mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1426 +#: src/slic3r/GUI/DoubleSlider.cpp:1495 msgid "Add extruder change - Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1428 +#: src/slic3r/GUI/DoubleSlider.cpp:1497 msgid "" "Add color change - Left click for predefined color or Shift + Left click for " "custom color selection" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1430 +#: src/slic3r/GUI/DoubleSlider.cpp:1499 msgid "Add color change - Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1431 +#: src/slic3r/GUI/DoubleSlider.cpp:1500 msgid "or press \"+\" key" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1433 +#: src/slic3r/GUI/DoubleSlider.cpp:1502 msgid "Add another code - Ctrl + Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1434 +#: src/slic3r/GUI/DoubleSlider.cpp:1503 msgid "Add another code - Right click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1440 +#: src/slic3r/GUI/DoubleSlider.cpp:1509 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing " @@ -1279,289 +1467,305 @@ msgid "" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1458 +#: src/slic3r/GUI/DoubleSlider.cpp:1527 msgid "continue" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1466 +#: src/slic3r/GUI/DoubleSlider.cpp:1535 #, boost-format msgid "Color change (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1467 +#: src/slic3r/GUI/DoubleSlider.cpp:1536 #, boost-format msgid "Color change (\"%1%\") for Extruder %2%" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1469 +#: src/slic3r/GUI/DoubleSlider.cpp:1538 #, boost-format msgid "Pause print (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1471 +#: src/slic3r/GUI/DoubleSlider.cpp:1540 #, boost-format msgid "Custom template (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1473 +#: src/slic3r/GUI/DoubleSlider.cpp:1542 #, boost-format msgid "Extruder (tool) is changed to Extruder \"%1%\"" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1480 +#: src/slic3r/GUI/DoubleSlider.cpp:1549 msgid "Note" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1482 +#: src/slic3r/GUI/DoubleSlider.cpp:1551 msgid "" "G-code associated to this tick mark is in a conflict with print mode.\n" "Editing it will cause changes of Slider data." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1485 +#: src/slic3r/GUI/DoubleSlider.cpp:1554 msgid "" "There is a color change for extruder that won't be used till the end of " "print job.\n" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1488 +#: src/slic3r/GUI/DoubleSlider.cpp:1557 msgid "" "There is an extruder change set to the same extruder.\n" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1491 +#: src/slic3r/GUI/DoubleSlider.cpp:1560 msgid "" "There is a color change for extruder that has not been used before.\n" "Check your settings to avoid redundant color changes." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1496 +#: src/slic3r/GUI/DoubleSlider.cpp:1565 msgid "Delete tick mark - Left click or press \"-\" key" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1498 +#: src/slic3r/GUI/DoubleSlider.cpp:1567 msgid "Edit tick mark - Ctrl + Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1499 +#: src/slic3r/GUI/DoubleSlider.cpp:1568 msgid "Edit tick mark - Right click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1602 src/slic3r/GUI/DoubleSlider.cpp:1633 -#: src/slic3r/GUI/GUI_Factories.cpp:778 +#: src/slic3r/GUI/DoubleSlider.cpp:1671 src/slic3r/GUI/DoubleSlider.cpp:1702 +#: src/slic3r/GUI/GUI_Factories.cpp:862 #, c-format, boost-format msgid "Extruder %d" msgstr "Ekstrüder %d" -#: src/slic3r/GUI/DoubleSlider.cpp:1603 src/slic3r/GUI/GUI_Factories.cpp:779 +#: src/slic3r/GUI/DoubleSlider.cpp:1672 src/slic3r/GUI/GUI_Factories.cpp:863 msgid "active" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 msgid "Switch code to Change extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Change extruder" msgstr "Ekstrüder değiştir" -#: src/slic3r/GUI/DoubleSlider.cpp:1613 +#: src/slic3r/GUI/DoubleSlider.cpp:1682 msgid "Change extruder (N/A)" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1615 src/slic3r/GUI/GUI_Factories.cpp:787 +#: src/slic3r/GUI/DoubleSlider.cpp:1684 src/slic3r/GUI/GUI_Factories.cpp:871 msgid "Use another extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1634 +#: src/slic3r/GUI/DoubleSlider.cpp:1703 msgid "used" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1642 +#: src/slic3r/GUI/DoubleSlider.cpp:1711 #, boost-format msgid "Switch code to Color change (%1%) for:" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1643 +#: src/slic3r/GUI/DoubleSlider.cpp:1712 #, boost-format msgid "Add color change (%1%) for:" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1968 +#: src/slic3r/GUI/DoubleSlider.cpp:2037 msgid "Add color change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1979 +#: src/slic3r/GUI/DoubleSlider.cpp:2048 msgid "Add pause print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1983 +#: src/slic3r/GUI/DoubleSlider.cpp:2052 msgid "Add custom template" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1986 +#: src/slic3r/GUI/DoubleSlider.cpp:2055 msgid "Add custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2004 +#: src/slic3r/GUI/DoubleSlider.cpp:2073 msgid "Edit color" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2005 +#: src/slic3r/GUI/DoubleSlider.cpp:2074 msgid "Edit pause print message" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2006 +#: src/slic3r/GUI/DoubleSlider.cpp:2075 msgid "Edit custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2012 +#: src/slic3r/GUI/DoubleSlider.cpp:2081 msgid "Delete color change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2013 +#: src/slic3r/GUI/DoubleSlider.cpp:2082 msgid "Delete tool change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2014 +#: src/slic3r/GUI/DoubleSlider.cpp:2083 msgid "Delete pause print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2015 +#: src/slic3r/GUI/DoubleSlider.cpp:2084 msgid "Delete custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2025 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:2094 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to height" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2030 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 msgid "Hide ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height on the ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time on the ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Set ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2047 +#: src/slic3r/GUI/DoubleSlider.cpp:2116 msgid "Set extruder sequence for the entire print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2051 +#: src/slic3r/GUI/DoubleSlider.cpp:2120 msgid "Set auto color changes" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2086 +#: src/slic3r/GUI/DoubleSlider.cpp:2155 msgid "This action will cause deletion of all ticks on vertical slider." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2087 src/slic3r/GUI/Tab.cpp:1318 +#: src/slic3r/GUI/DoubleSlider.cpp:2156 src/slic3r/GUI/Tab.cpp:1263 msgid "" "This action is not revertible.\n" "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2088 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1133 src/slic3r/GUI/GUI.cpp:245 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:649 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:679 -#: src/slic3r/GUI/WipeTowerDialog.cpp:58 src/slic3r/GUI/WipeTowerDialog.cpp:443 +#: src/slic3r/GUI/DoubleSlider.cpp:2157 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:537 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1119 src/slic3r/GUI/GUI.cpp:258 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:721 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:751 +#: src/slic3r/GUI/WipeTowerDialog.cpp:60 src/slic3r/GUI/WipeTowerDialog.cpp:445 msgid "Warning" msgstr "Uyarı" -#: src/slic3r/GUI/DoubleSlider.cpp:2216 +#: src/slic3r/GUI/DoubleSlider.cpp:2285 msgid "Enter custom G-code used on current layer" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2217 +#: src/slic3r/GUI/DoubleSlider.cpp:2286 #, boost-format msgid "Custom G-code on current layer (%1% mm)." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2238 +#: src/slic3r/GUI/DoubleSlider.cpp:2307 msgid "Enter short message shown on Printer display when a print is paused" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2239 +#: src/slic3r/GUI/DoubleSlider.cpp:2308 #, boost-format msgid "Message for pause print on current layer (%1% mm)." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the move you want to jump to" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the height you want to jump to" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2515 +#: src/slic3r/GUI/DoubleSlider.cpp:2584 msgid "The last color change data was saved for a single extruder printing." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2516 src/slic3r/GUI/DoubleSlider.cpp:2532 +#: src/slic3r/GUI/DoubleSlider.cpp:2585 src/slic3r/GUI/DoubleSlider.cpp:2601 msgid "The last color change data was saved for a multi extruder printing." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2518 +#: src/slic3r/GUI/DoubleSlider.cpp:2587 msgid "Your current changes will delete all saved color changes." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2519 src/slic3r/GUI/DoubleSlider.cpp:2540 +#: src/slic3r/GUI/DoubleSlider.cpp:2588 src/slic3r/GUI/DoubleSlider.cpp:2609 msgid "Are you sure you want to continue?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2533 +#: src/slic3r/GUI/DoubleSlider.cpp:2602 msgid "" "Select YES if you want to delete all saved tool changes, \n" "NO if you want all tool changes switch to color changes, \n" "or CANCEL to leave it unchanged." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2536 +#: src/slic3r/GUI/DoubleSlider.cpp:2605 msgid "Do you want to delete all saved tool changes?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2538 +#: src/slic3r/GUI/DoubleSlider.cpp:2607 msgid "" "The last color change data was saved for a multi extruder printing with tool " "changes for whole print." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2539 +#: src/slic3r/GUI/DoubleSlider.cpp:2608 msgid "Your current changes will delete all saved extruder (tool) changes." msgstr "" -#: src/slic3r/GUI/ExtraRenderers.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:538 -#: src/slic3r/GUI/GUI_ObjectList.cpp:550 src/slic3r/GUI/GUI_ObjectList.cpp:979 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4291 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:250 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:352 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:376 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:607 src/libslic3r/PrintConfig.cpp:800 +#: src/slic3r/GUI/Downloader.cpp:150 +#, boost-format +msgid "" +"Download won't start. Download URL doesn't point to https://files.printables." +"com : %1%" +msgstr "" + +#: src/slic3r/GUI/Downloader.cpp:181 +msgid "The download has failed:" +msgstr "" + +#: src/slic3r/GUI/DownloaderFileGet.cpp:193 +#, boost-format +msgid "Can't create file at %1%." +msgstr "" + +#: src/slic3r/GUI/ExtraRenderers.cpp:323 src/slic3r/GUI/GUI_ObjectList.cpp:571 +#: src/slic3r/GUI/GUI_ObjectList.cpp:583 src/slic3r/GUI/GUI_ObjectList.cpp:1043 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2125 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3013 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4884 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:259 src/libslic3r/PrintConfig.cpp:894 msgid "default" msgstr "varsayılan" @@ -1574,10 +1778,10 @@ msgid "Set extruder change for every" msgstr "" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:60 -#: src/libslic3r/PrintConfig.cpp:662 src/libslic3r/PrintConfig.cpp:1430 -#: src/libslic3r/PrintConfig.cpp:2135 src/libslic3r/PrintConfig.cpp:2310 -#: src/libslic3r/PrintConfig.cpp:2386 src/libslic3r/PrintConfig.cpp:2639 -#: src/libslic3r/PrintConfig.cpp:2687 src/libslic3r/PrintConfig.cpp:2706 +#: src/libslic3r/PrintConfig.cpp:765 src/libslic3r/PrintConfig.cpp:1476 +#: src/libslic3r/PrintConfig.cpp:2165 src/libslic3r/PrintConfig.cpp:2343 +#: src/libslic3r/PrintConfig.cpp:2417 src/libslic3r/PrintConfig.cpp:2665 +#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2728 msgid "layers" msgstr "katman" @@ -1609,42 +1813,42 @@ msgstr "" msgid "Add extruder to sequence" msgstr "" -#: src/slic3r/GUI/Field.cpp:190 +#: src/slic3r/GUI/Field.cpp:188 msgid "default value" msgstr "varsayılan değer" -#: src/slic3r/GUI/Field.cpp:193 +#: src/slic3r/GUI/Field.cpp:191 msgid "parameter name" msgstr "parametre ismi" -#: src/slic3r/GUI/Field.cpp:204 src/slic3r/GUI/OptionsGroup.cpp:827 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1067 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1079 +#: src/slic3r/GUI/Field.cpp:206 src/slic3r/GUI/OptionsGroup.cpp:852 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1074 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1086 msgid "N/A" msgstr "" -#: src/slic3r/GUI/Field.cpp:226 src/slic3r/GUI/Field.cpp:298 +#: src/slic3r/GUI/Field.cpp:229 src/slic3r/GUI/Field.cpp:302 #, c-format, boost-format msgid "%s doesn't support percentage" msgstr "%s yüzde değer desteklemiyor" -#: src/slic3r/GUI/Field.cpp:266 +#: src/slic3r/GUI/Field.cpp:269 #, c-format, boost-format msgid "" "Input value is out of range\n" "Are you sure that %s is a correct value and that you want to continue?" msgstr "" -#: src/slic3r/GUI/Field.cpp:269 src/slic3r/GUI/Field.cpp:343 +#: src/slic3r/GUI/Field.cpp:272 src/slic3r/GUI/Field.cpp:347 msgid "Parameter validation" msgstr "Parametre doğrulama" -#: src/slic3r/GUI/Field.cpp:282 src/slic3r/GUI/Field.cpp:390 -#: src/slic3r/GUI/Field.cpp:1573 +#: src/slic3r/GUI/Field.cpp:285 src/slic3r/GUI/Field.cpp:394 +#: src/slic3r/GUI/Field.cpp:1597 msgid "Input value is out of range" msgstr "Girilen değer limit dışı" -#: src/slic3r/GUI/Field.cpp:340 +#: src/slic3r/GUI/Field.cpp:344 #, c-format, boost-format msgid "" "Do you mean %s%% instead of %s %s?\n" @@ -1652,13 +1856,22 @@ msgid "" "or NO if you are sure that %s %s is a correct value." msgstr "" -#: src/slic3r/GUI/Field.cpp:397 +#: src/slic3r/GUI/Field.cpp:401 #, boost-format msgid "" "Invalid input format. Expected vector of dimensions in the following format: " "\"%1%\"" msgstr "" +#: src/slic3r/GUI/FileArchiveDialog.cpp:170 +msgid "Archive preview" +msgstr "" + +#: src/slic3r/GUI/FileArchiveDialog.cpp:270 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +msgid "Open" +msgstr "" + #: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flash!" msgstr "Yükle!" @@ -1745,12 +1958,6 @@ msgstr "Yazılım dosyası:" msgid "Select a file" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:815 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:297 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:372 -msgid "Browse" -msgstr "Gözat" - #: src/slic3r/GUI/FirmwareDialog.cpp:817 msgid "Serial port:" msgstr "Bağlantı noktası:" @@ -1780,10 +1987,10 @@ msgid "Advanced: Output log" msgstr "Gelişmiş: Çıktı günlüğü" #: src/slic3r/GUI/FirmwareDialog.cpp:862 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:310 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:358 #: src/slic3r/GUI/Mouse3DController.cpp:543 -#: src/slic3r/GUI/PrintHostDialogs.cpp:261 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:122 +#: src/slic3r/GUI/PrintHostDialogs.cpp:313 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:125 msgid "Close" msgstr "Kapat" @@ -1803,7 +2010,7 @@ msgstr "Onaylama" msgid "Cancelling..." msgstr "İptal ediliyor..." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1488 msgid "Shape Gallery" msgstr "" @@ -1811,904 +2018,1908 @@ msgstr "" msgid "Select shape from the gallery" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:100 -msgid "Add to bed" -msgstr "" - -#: src/slic3r/GUI/GalleryDialog.cpp:101 -msgid "Add selected shape(s) to the bed" -msgstr "" - -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4152 +#: src/slic3r/GUI/GalleryDialog.cpp:114 src/slic3r/GUI/Tab.cpp:4377 msgid "Add" msgstr "Ekle" -#: src/slic3r/GUI/GalleryDialog.cpp:117 +#: src/slic3r/GUI/GalleryDialog.cpp:114 msgid "Add one or more custom shapes" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:506 -#: src/slic3r/GUI/GLCanvas3D.cpp:4547 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/GalleryDialog.cpp:115 src/slic3r/GUI/GalleryDialog.cpp:528 +#: src/slic3r/GUI/GLCanvas3D.cpp:4638 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/GUI_Factories.cpp:460 src/slic3r/GUI/Tab.cpp:3973 msgid "Delete" msgstr "Sil" -#: src/slic3r/GUI/GalleryDialog.cpp:118 +#: src/slic3r/GUI/GalleryDialog.cpp:115 msgid "Delete one or more custom shape. You can't delete system shapes" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:400 +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "Add to bed" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "OK" +msgstr "Tamam" + +#: src/slic3r/GUI/GalleryDialog.cpp:143 +msgid "Add selected shape(s) to the bed" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:422 msgid "Choose one or more files (STL, OBJ):" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:440 +#: src/slic3r/GUI/GalleryDialog.cpp:462 #, boost-format msgid "" "It looks like selected %1%-file has an error or is destructed.\n" "We can't load this file" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:451 +#: src/slic3r/GUI/GalleryDialog.cpp:473 msgid "Choose one PNG file:" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:464 +#: src/slic3r/GUI/GalleryDialog.cpp:486 msgid "Replacing of the PNG" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:508 +#: src/slic3r/GUI/GalleryDialog.cpp:530 msgid "Change thumbnail" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:549 src/slic3r/GUI/GalleryDialog.cpp:554 +#: src/slic3r/GUI/GalleryDialog.cpp:571 src/slic3r/GUI/GalleryDialog.cpp:576 #, boost-format msgid "Loading of the \"%1%\"" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:274 +#: src/slic3r/GUI/GCodeViewer.cpp:343 msgid "Tool position" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1457 +#: src/slic3r/GUI/GCodeViewer.cpp:1547 msgid "Generating toolpaths" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1517 +#: src/slic3r/GUI/GCodeViewer.cpp:1619 msgid "Generating vertex buffer" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1857 +#: src/slic3r/GUI/GCodeViewer.cpp:1979 msgid "Generating index buffers" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to hide" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to show" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3181 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 msgid "up to" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3187 +#: src/slic3r/GUI/GCodeViewer.cpp:3455 msgid "above" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "from" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "to" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3245 src/slic3r/GUI/GCodeViewer.cpp:3246 -#: src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3513 src/slic3r/GUI/GCodeViewer.cpp:3514 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 msgid "Percentage" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3570 msgid "Feature type" msgstr "Özellikler" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3592 #: src/slic3r/GUI/RammingChart.cpp:90 msgid "Time" msgstr "Zaman" -#: src/slic3r/GUI/GCodeViewer.cpp:3295 src/slic3r/GUI/GCodeViewer.cpp:3306 -#: src/slic3r/GUI/GCodeViewer.cpp:3566 -msgid "Used filament" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3298 +#: src/slic3r/GUI/GCodeViewer.cpp:3571 msgid "Height (mm)" msgstr "Yükseklik (mm)" -#: src/slic3r/GUI/GCodeViewer.cpp:3299 +#: src/slic3r/GUI/GCodeViewer.cpp:3572 msgid "Width (mm)" msgstr "Genişlik (mm)" -#: src/slic3r/GUI/GCodeViewer.cpp:3300 +#: src/slic3r/GUI/GCodeViewer.cpp:3573 msgid "Speed (mm/s)" msgstr "Hız (mm / s)" -#: src/slic3r/GUI/GCodeViewer.cpp:3301 -msgid "Fan Speed (%)" +#: src/slic3r/GUI/GCodeViewer.cpp:3574 +msgid "Fan speed (%)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3302 +#: src/slic3r/GUI/GCodeViewer.cpp:3575 msgid "Temperature (°C)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3303 +#: src/slic3r/GUI/GCodeViewer.cpp:3576 msgid "Volumetric flow rate (mm³/s)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3306 src/slic3r/GUI/GUI_Preview.cpp:224 -#: src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3577 +msgid "Layer time (linear)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3578 +msgid "Layer time (logarithmic)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3579 msgid "Tool" msgstr "Araç" -#: src/slic3r/GUI/GCodeViewer.cpp:3309 src/slic3r/GUI/GUI_Preview.cpp:225 -#: src/slic3r/GUI/GUI_Preview.cpp:957 +#: src/slic3r/GUI/GCodeViewer.cpp:3580 msgid "Color Print" msgstr "Renkli baskı" -#: src/slic3r/GUI/GCodeViewer.cpp:3347 src/slic3r/GUI/GCodeViewer.cpp:3393 -#: src/slic3r/GUI/GCodeViewer.cpp:3398 src/slic3r/GUI/GUI_ObjectList.cpp:312 -#: src/slic3r/GUI/wxExtensions.cpp:536 src/libslic3r/PrintConfig.cpp:795 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 src/slic3r/GUI/GCodeViewer.cpp:3594 +#: src/slic3r/GUI/GCodeViewer.cpp:3860 +msgid "Used filament" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3623 src/slic3r/GUI/GCodeViewer.cpp:4067 +#: src/libslic3r/PrintConfig.cpp:3025 +msgid "Travel" +msgstr "Boşta ilerleme" + +#: src/slic3r/GUI/GCodeViewer.cpp:3640 src/slic3r/GUI/GCodeViewer.cpp:3685 +#: src/slic3r/GUI/GCodeViewer.cpp:3689 src/slic3r/GUI/GUI_ObjectList.cpp:338 +#: src/slic3r/GUI/wxExtensions.cpp:547 src/libslic3r/PrintConfig.cpp:888 msgid "Extruder" msgstr "Ekstrüder" -#: src/slic3r/GUI/GCodeViewer.cpp:3370 +#: src/slic3r/GUI/GCodeViewer.cpp:3662 msgid "Default color" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3393 +#: src/slic3r/GUI/GCodeViewer.cpp:3685 msgid "default color" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3491 src/slic3r/GUI/GCodeViewer.cpp:3547 +#: src/slic3r/GUI/GCodeViewer.cpp:3785 src/slic3r/GUI/GCodeViewer.cpp:3841 msgid "Color change" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3510 src/slic3r/GUI/GCodeViewer.cpp:3545 +#: src/slic3r/GUI/GCodeViewer.cpp:3804 src/slic3r/GUI/GCodeViewer.cpp:3839 msgid "Print" msgstr "Yazdır" -#: src/slic3r/GUI/GCodeViewer.cpp:3546 src/slic3r/GUI/GCodeViewer.cpp:3580 +#: src/slic3r/GUI/GCodeViewer.cpp:3840 src/slic3r/GUI/GCodeViewer.cpp:3874 msgid "Pause" msgstr "Duraklat" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Event" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Remaining time" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Duration" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3609 src/slic3r/GUI/GUI_Preview.cpp:1049 -#: src/libslic3r/PrintConfig.cpp:2937 -msgid "Travel" -msgstr "Boşta ilerleme" +#: src/slic3r/GUI/GCodeViewer.cpp:3928 src/slic3r/GUI/GUI.cpp:332 +#: src/slic3r/GUI/Plater.cpp:852 src/libslic3r/PrintConfig.cpp:335 +msgid "Printer" +msgstr "Yazıcı" + +#: src/slic3r/GUI/GCodeViewer.cpp:3931 src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/Plater.cpp:848 +msgid "Print settings" +msgstr "Baskı ayarları" + +#: src/slic3r/GUI/GCodeViewer.cpp:3936 src/slic3r/GUI/GUI.cpp:330 +#: src/slic3r/GUI/Plater.cpp:849 src/slic3r/GUI/Tab.cpp:1930 +#: src/slic3r/GUI/Tab.cpp:1931 +msgid "Filament" +msgstr "Filament" -#: src/slic3r/GUI/GCodeViewer.cpp:3612 -msgid "Movement" +#: src/slic3r/GUI/GCodeViewer.cpp:3950 +msgid "Estimated printing times" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3613 -msgid "Extrusion" +#: src/slic3r/GUI/GCodeViewer.cpp:3969 +msgid "Normal mode" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1870 -#: src/slic3r/GUI/Tab.cpp:2812 -msgid "Retraction" -msgstr "Geri çekme" +#: src/slic3r/GUI/GCodeViewer.cpp:3970 +msgid "Stealth mode" +msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3631 src/slic3r/GUI/GCodeViewer.cpp:3634 -#: src/slic3r/GUI/GUI_Preview.cpp:1050 -msgid "Wipe" +#: src/slic3r/GUI/GCodeViewer.cpp:3979 src/libslic3r/PrintConfig.cpp:1249 +#: src/libslic3r/PrintConfig.cpp:1267 src/libslic3r/PrintConfig.cpp:1277 +#: src/libslic3r/PrintConfig.cpp:1322 +msgid "First layer" +msgstr "İlk katman" + +#: src/slic3r/GUI/GCodeViewer.cpp:3983 +msgid "Total" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3666 src/slic3r/GUI/GUI_Preview.cpp:257 -#: src/slic3r/GUI/GUI_Preview.cpp:272 -msgid "Options" -msgstr "Ayarlar" +#: src/slic3r/GUI/GCodeViewer.cpp:4002 +msgid "Show stealth mode" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:4006 +msgid "Show normal mode" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:4071 +msgid "Wipe" +msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3669 src/slic3r/GUI/GUI_Preview.cpp:1051 +#: src/slic3r/GUI/GCodeViewer.cpp:4075 msgid "Retractions" msgstr "Geri Çekme" -#: src/slic3r/GUI/GCodeViewer.cpp:3670 src/slic3r/GUI/GUI_Preview.cpp:1052 +#: src/slic3r/GUI/GCodeViewer.cpp:4079 msgid "Deretractions" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3671 src/slic3r/GUI/GUI_Preview.cpp:1053 +#: src/slic3r/GUI/GCodeViewer.cpp:4083 msgid "Seams" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3672 src/slic3r/GUI/GUI_Preview.cpp:1054 +#: src/slic3r/GUI/GCodeViewer.cpp:4087 msgid "Tool changes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3673 src/slic3r/GUI/GUI_Preview.cpp:1055 +#: src/slic3r/GUI/GCodeViewer.cpp:4091 msgid "Color changes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3674 src/slic3r/GUI/GUI_Preview.cpp:1056 +#: src/slic3r/GUI/GCodeViewer.cpp:4095 msgid "Print pauses" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3675 src/slic3r/GUI/GUI_Preview.cpp:1057 +#: src/slic3r/GUI/GCodeViewer.cpp:4099 msgid "Custom G-codes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3695 src/slic3r/GUI/GCodeViewer.cpp:3714 -#: src/slic3r/GUI/GUI.cpp:341 src/slic3r/GUI/Plater.cpp:822 -#: src/libslic3r/PrintConfig.cpp:322 -msgid "Printer" -msgstr "Yazıcı" - -#: src/slic3r/GUI/GCodeViewer.cpp:3697 src/slic3r/GUI/GCodeViewer.cpp:3719 -#: src/slic3r/GUI/GUI.cpp:337 src/slic3r/GUI/Plater.cpp:818 -msgid "Print settings" -msgstr "Baskı ayarları" - -#: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 -#: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1970 src/slic3r/GUI/Tab.cpp:1971 -msgid "Filament" -msgstr "Filament" - -#: src/slic3r/GUI/GCodeViewer.cpp:3739 -msgid "Estimated printing times" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3758 -msgid "Normal mode" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3759 -msgid "Stealth mode" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3766 src/libslic3r/PrintConfig.cpp:1189 -#: src/libslic3r/PrintConfig.cpp:1207 src/libslic3r/PrintConfig.cpp:1217 -#: src/libslic3r/PrintConfig.cpp:1262 -msgid "First layer" -msgstr "İlk katman" - -#: src/slic3r/GUI/GCodeViewer.cpp:3767 -msgid "Total" +#: src/slic3r/GUI/GCodeViewer.cpp:4103 +msgid "Center of gravity" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3796 -msgid "Show stealth mode" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:4108 +msgid "Shells" +msgstr "Duvarlar" -#: src/slic3r/GUI/GCodeViewer.cpp:3800 -msgid "Show normal mode" +#: src/slic3r/GUI/GCodeViewer.cpp:4113 +msgid "Tool marker" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:225 src/slic3r/GUI/GLCanvas3D.cpp:4694 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:53 +#: src/slic3r/GUI/GLCanvas3D.cpp:185 src/slic3r/GUI/GLCanvas3D.cpp:4784 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:71 msgid "Variable layer height" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:227 +#: src/slic3r/GUI/GLCanvas3D.cpp:187 msgid "Left mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:229 +#: src/slic3r/GUI/GLCanvas3D.cpp:189 msgid "Add detail" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:231 +#: src/slic3r/GUI/GLCanvas3D.cpp:191 msgid "Right mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:233 +#: src/slic3r/GUI/GLCanvas3D.cpp:193 msgid "Remove detail" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:235 +#: src/slic3r/GUI/GLCanvas3D.cpp:195 msgid "Shift + Left mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:237 +#: src/slic3r/GUI/GLCanvas3D.cpp:197 msgid "Reset to base" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:239 +#: src/slic3r/GUI/GLCanvas3D.cpp:199 msgid "Shift + Right mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:241 +#: src/slic3r/GUI/GLCanvas3D.cpp:201 msgid "Smoothing" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:243 +#: src/slic3r/GUI/GLCanvas3D.cpp:203 msgid "Mouse wheel:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:245 +#: src/slic3r/GUI/GLCanvas3D.cpp:205 msgid "Increase/decrease edit area" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:248 +#: src/slic3r/GUI/GLCanvas3D.cpp:208 msgid "Adaptive" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:254 +#: src/slic3r/GUI/GLCanvas3D.cpp:214 msgid "Quality / Speed" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:257 +#: src/slic3r/GUI/GLCanvas3D.cpp:217 msgid "Higher print quality versus higher print speed." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:268 +#: src/slic3r/GUI/GLCanvas3D.cpp:228 msgid "Smooth" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:274 src/libslic3r/PrintConfig.cpp:819 +#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/libslic3r/PrintConfig.cpp:908 msgid "Radius" msgstr "Yarıçap" -#: src/slic3r/GUI/GLCanvas3D.cpp:286 +#: src/slic3r/GUI/GLCanvas3D.cpp:246 msgid "Keep min" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:295 src/slic3r/GUI/GLCanvas3D.cpp:4123 +#: src/slic3r/GUI/GLCanvas3D.cpp:255 src/slic3r/GUI/GLCanvas3D.cpp:4217 msgid "Reset" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:561 +#: src/slic3r/GUI/GLCanvas3D.cpp:602 msgid "Variable layer height - Manual edit" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:676 +#: src/slic3r/GUI/GLCanvas3D.cpp:717 msgid "Seq." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1310 +#: src/slic3r/GUI/GLCanvas3D.cpp:1319 msgid "Variable layer height - Reset" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1318 +#: src/slic3r/GUI/GLCanvas3D.cpp:1327 msgid "Variable layer height - Adaptive" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1326 +#: src/slic3r/GUI/GLCanvas3D.cpp:1335 msgid "Variable layer height - Smooth all" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1733 +#: src/slic3r/GUI/GLCanvas3D.cpp:1778 msgid "Mirror Object" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:2612 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:560 +#: src/slic3r/GUI/GLCanvas3D.cpp:2542 src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:117 msgid "Gizmo-Move" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:2695 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562 +#: src/slic3r/GUI/GLCanvas3D.cpp:2638 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:661 msgid "Gizmo-Rotate" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3300 +#: src/slic3r/GUI/GLCanvas3D.cpp:3263 msgid "Move Object" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3821 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3513 +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:40 +msgid "Gizmo-Place on Face" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3904 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Switch to Settings" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3822 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3905 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Print Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Filament Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Material Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3824 src/slic3r/GUI/GLCanvas3D.cpp:4657 +#: src/slic3r/GUI/GLCanvas3D.cpp:3907 src/slic3r/GUI/GLCanvas3D.cpp:4746 msgid "Printer Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Undo History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Redo History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4011 src/slic3r/GUI/GLCanvas3D.cpp:4673 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 src/slic3r/GUI/Search.cpp:426 +#: src/slic3r/GUI/GLCanvas3D.cpp:4106 src/slic3r/GUI/GLCanvas3D.cpp:4762 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/Search.cpp:482 msgid "Search" msgstr "Ara" -#: src/slic3r/GUI/GLCanvas3D.cpp:4025 src/slic3r/GUI/GLCanvas3D.cpp:4033 -#: src/slic3r/GUI/Search.cpp:432 +#: src/slic3r/GUI/GLCanvas3D.cpp:4120 src/slic3r/GUI/GLCanvas3D.cpp:4128 +#: src/slic3r/GUI/Search.cpp:488 msgid "Enter a search term" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4064 +#: src/slic3r/GUI/GLCanvas3D.cpp:4160 msgid "Arrange options" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4097 +#: src/slic3r/GUI/GLCanvas3D.cpp:4193 #, boost-format msgid "Press %1%left mouse button to enter the exact value" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4099 +#: src/slic3r/GUI/GLCanvas3D.cpp:4195 msgid "Spacing" msgstr "Aralık" -#: src/slic3r/GUI/GLCanvas3D.cpp:4106 +#: src/slic3r/GUI/GLCanvas3D.cpp:4202 +msgid "Spacing from bed" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4209 msgid "Enable rotations (slow)" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Alignment" -msgstr "Hizalama" +#: src/slic3r/GUI/GLCanvas3D.cpp:4228 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 src/slic3r/GUI/Plater.cpp:7118 +msgid "Arrange" +msgstr "Hizala" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:4500 -msgid "Center" -msgstr "Merkez" +#: src/slic3r/GUI/GLCanvas3D.cpp:4630 +msgid "Add..." +msgstr "Ekle..." + +#: src/slic3r/GUI/GLCanvas3D.cpp:4647 src/slic3r/GUI/KBShortcutsDialog.cpp:105 +#: src/slic3r/GUI/Plater.cpp:6047 src/slic3r/GUI/Tab.cpp:4383 +msgid "Delete all" +msgstr "Tümünü sil" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 src/slic3r/GUI/KBShortcutsDialog.cpp:142 +msgid "Arrange selection" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 +msgid "Click right mouse button to show arrangement options" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4676 +msgid "Copy" +msgstr "Kopyala" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4685 +msgid "Paste" +msgstr "Yapıştır" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4697 src/slic3r/GUI/GUI_Factories.cpp:1237 +#: src/slic3r/GUI/GUI_Factories.cpp:1261 src/slic3r/GUI/GUI_Factories.cpp:1272 +msgid "Add instance" +msgstr "Kopyasını ekle" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4708 src/slic3r/GUI/GUI_Factories.cpp:1240 +msgid "Remove instance" +msgstr "Kopyayı sil" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4721 +msgid "Split to objects" +msgstr "Nesnelere böl" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4731 +msgid "Split to parts" +msgstr "Paçalara böl" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/GLCanvas3D.cpp:4874 +msgid "Click right mouse button to open/close History" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4859 +#, boost-format +msgid "Next Undo action: %1%" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4874 src/slic3r/GUI/KBShortcutsDialog.cpp:107 +#: src/slic3r/GUI/MainFrame.cpp:1429 +msgid "Redo" +msgstr "Yinele" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4895 +#, boost-format +msgid "Next Redo action: %1%" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6784 +msgid "An object outside the print area was detected." +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6785 +msgid "A toolpath outside the print area was detected." +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6786 +msgid "SLA supports outside the print area were detected." +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6787 +msgid "Some objects are not visible during editing." +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6789 +msgid "" +"An object outside the print area was detected.\n" +"Resolve the current problem to continue slicing." +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6864 +msgid "Selection-Add from rectangle" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6879 +msgid "Selection-Remove from rectangle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:206 +msgid "Planar" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Auto" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Manual" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:213 +msgid "Plug" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:214 +msgid "Dowel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Prism" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Frustum" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Triangle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Square" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Hexagon" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:59 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 +msgid "Circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:233 +msgid "Keep orientation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:234 +msgid "Place on cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:235 +msgid "Flip upside down" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +msgid "inch" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 +msgid "Part" +msgstr "Bölüm" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 src/libslic3r/Print.cpp:1236 +msgid "Object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:264 +msgid "" +"Click to flip the cut plane\n" +"Drag to move the cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:269 src/libslic3r/PrintConfig.cpp:498 +#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2325 src/libslic3r/PrintConfig.cpp:2613 +#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2876 src/libslic3r/PrintConfig.cpp:2907 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3231 +#: src/libslic3r/PrintConfig.cpp:3466 src/libslic3r/PrintConfig.cpp:3951 +msgid "°" +msgstr "°" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:367 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:571 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1232 +msgid "Move cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +msgid "in" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:544 +msgid "Value" +msgstr "Değer" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:549 +msgid "Tolerance" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 +msgid "Left click" +msgstr "Sol tık" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2348 +msgid "Add connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 +msgid "Right click" +msgstr "Sağ tık" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +msgid "Remove connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 +msgid "Drag" +msgstr "Sürükle" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1216 +msgid "Move connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +msgid "Add connector to selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +msgid "Remove connector from selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:870 +msgid "Select all connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:894 src/libslic3r/PrintConfig.cpp:4644 +msgid "Cut" +msgstr "Kes" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1227 +msgid "Rotate cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1448 +msgid "Render cut plane as circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1537 +msgid "Connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1541 +msgid "Remove connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1550 +msgid "Type" +msgstr "Tür" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1561 src/libslic3r/PrintConfig.cpp:2816 +msgid "Style" +msgstr "Biçem" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1568 +msgid "Depth ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1586 +msgid "Confirm connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1652 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1666 +msgid "Flip cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1710 +msgid "Hold SHIFT key to draw a cut line" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1716 +msgid "Cut position: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1725 +msgid "Reset cutting plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Edit connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Add connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1744 +msgid "Reset cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1745 +msgid "Reset cutting plane and remove connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1800 +msgid "After cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1820 +msgid "Cut to" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1823 +msgid "Objects" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1826 +msgid "Parts" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1840 +msgid "Perform cut" +msgstr "Kesme islemini uygula" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1930 +msgid "Invalid connectors detected" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1932 +#, c-format, boost-format +msgid "%1$d connector is out of cut contour" +msgid_plural "%1$d connectors are out of cut contour" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1935 +#, c-format, boost-format +msgid "%1$d connector is out of object" +msgid_plural "%1$d connectors are out of object" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1938 +msgid "Some connectors are overlapped" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1942 +msgid "" +"Invalid state. \n" +"No one part is selected for keep after cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1944 +msgid "" +"Warning state. \n" +"Cut plane is placed out of object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2153 +msgid "Connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2183 +msgid "Cut by Plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2323 +msgid "Cut by line" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2373 +msgid "Delete connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:252 +msgid "Entering Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:253 +msgid "Leaving Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:254 +msgid "Cut gizmo editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:601 +msgid "Emboss" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:866 +msgid "ERROR: Wait until ends or Cancel process." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:921 +msgid "Text-Rotate" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:953 +msgid "Font" +msgstr "Yazı türü" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:954 +#: src/libslic3r/PrintConfig.cpp:897 +msgid "Height" +msgstr "Yükseklik" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:955 +msgid "Depth" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:963 +msgid "Use surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:964 +msgid "Char gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:965 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Line gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:966 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:967 +msgid "Skew ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:968 +msgid "Z-move" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:969 +msgid "Z-rot" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:970 +msgid "Collection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1047 +msgid "NORMAL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1048 +msgid "SMALL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1049 +msgid "ITALIC" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1050 +msgid "SWISS" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1051 +msgid "MODERN" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1088 +msgid "First font" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1093 +msgid "Default font" +msgstr "Varsayılan yazı türü" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1098 +msgid "Embossed text" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1513 +msgid "Warning: No font is selected. Select correct one." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1531 +#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1437 +#: src/slic3r/GUI/Tab.cpp:1472 src/slic3r/GUI/Tab.cpp:1607 +#: src/slic3r/GUI/Tab.cpp:1611 src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:2390 src/slic3r/GUI/Tab.cpp:4985 +#: src/libslic3r/PrintConfig.cpp:276 src/libslic3r/PrintConfig.cpp:514 +#: src/libslic3r/PrintConfig.cpp:1484 src/libslic3r/PrintConfig.cpp:1566 +#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:2562 +#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:3166 +#: src/libslic3r/PrintConfig.cpp:3200 src/libslic3r/PrintConfig.cpp:3211 +#: src/libslic3r/PrintConfig.cpp:3226 src/libslic3r/PrintConfig.cpp:3239 +#: src/libslic3r/PrintConfig.cpp:3248 src/libslic3r/PrintConfig.cpp:3260 +#: src/libslic3r/PrintConfig.cpp:3642 +msgid "Advanced" +msgstr "Gelişmiş" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1631 +msgid "Can't write text by selected font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1632 +msgid "Try to choose another font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Empty" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Embossed text can NOT contain only white spaces." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Bad symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Text contain character glyph (represented by '?') unknown by font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:535 +msgid "Skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +msgid "Unsupported visualization of font skew for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Unsupported visualization of font boldness for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Unsupported visualization of gap between lines inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Too tall" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Diminished font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Too small" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Enlarged font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1660 +#, boost-format +msgid "%1% is NOT shown." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1964 +msgid " No symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1965 +msgid " ... Loading" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2015 +msgid " ... In queue" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2132 +#, boost-format +msgid "Font face \"%1%\" can't be selected." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2180 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:754 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:367 +msgid "Apply" +msgstr "Uygula" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2192 +msgid "add file with font(.ttf, .ttc)" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2202 +msgid "Open dialog for choose from fonts." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2210 +msgid "Text is to object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2224 +msgid "Added" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2227 +msgid "Click to change text into object part." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2230 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4321 +msgid "You can't change a type of the last solid part of the object." +msgstr "Nesnenin son katı kısmının türünü değiştiremezsiniz." + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2231 +msgid "Subtracted" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2237 +msgid "Click to change part type into negative volume." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2243 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4338 +msgid "Modifier" +msgstr "Niteleyici" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2249 +msgid "Click to change part type into modifier." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2256 +msgid "Change Text Type" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2287 +#, boost-format +msgid "Rename style(%1%) for embossing text: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2299 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2384 +msgid "Name can't be empty." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2301 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2386 +msgid "Name has to be unique." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2310 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2397 +msgid "ok" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2312 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2401 +msgid "cancel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2337 +msgid "Rename style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2344 +msgid "Rename current style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2345 +msgid "Can't rename temporary style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2362 +msgid "First Add style to list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2364 +#, boost-format +msgid "Save %1% style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2366 +msgid "No changes to save." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2373 +msgid "New name of style: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2422 +msgid "Save as new style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2434 +msgid "Only valid font can be added to style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2436 +msgid "Add style to my list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2438 +msgid "Add as new named style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2454 +msgid "Remove style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2485 +#, boost-format +msgid "Delete \"%1%\" style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2486 +#, boost-format +msgid "Can't delete \"%1%\". It is last style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2487 +#, boost-format +msgid "Can't delete temporary style \"%1%\"." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2494 +#, boost-format +msgid "" +"Are you sure,\n" +"that you want permanently and unrecoverable \n" +"remove style \"%1%\"?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2496 +msgid "Yes" +msgstr "Evet" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2505 +msgid "No" +msgstr "Hayır" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2555 +msgid "Presets" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2564 src/slic3r/GUI/GUI_App.cpp:2324 +msgid "modified" +msgstr "değiştirilmiş" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2617 +#, boost-format +msgid "Modified style \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2618 +#, boost-format +msgid "Current style is \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2625 +msgid "Style modification will be lost." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2627 +#, boost-format +msgid "" +"Changing style to '%1%' will discard current style modification.\n" +"\n" +" Would you like to continue anyway?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2643 +msgid "Not valid style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2644 +#, boost-format +msgid "Style '%1%' can't be used and will be removed from list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2691 +msgid "Unset italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2708 +msgid "Set italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2738 +msgid "Unset bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2756 +msgid "Set bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2922 +msgid "WxFont is not loaded properly." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2957 +msgid "Revert font changes." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2991 +msgid "wx Make bold" +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear left" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3002 +msgid "Revert text size." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front left" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3029 +msgid "Revert embossed depth." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front right" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3178 +msgid "" +"Advanced font options could be changed only for correct font.\n" +"Start with select correct font." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear right" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3219 +msgid "Revert using of model surface." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:2271 -msgid "Random" -msgstr "Rasgele" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3232 +msgid "font points" +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4133 src/slic3r/GUI/GLCanvas3D.cpp:4565 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Plater.cpp:1664 -msgid "Arrange" -msgstr "Hizala" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3241 +msgid "Revert gap between letters" +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4539 -msgid "Add..." -msgstr "Ekle..." +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3242 +msgid "Distance between letters" +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4556 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5509 src/slic3r/GUI/Tab.cpp:4158 -msgid "Delete all" -msgstr "Tümünü sil" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3257 +msgid "Revert gap between lines" +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 src/slic3r/GUI/KBShortcutsDialog.cpp:133 -msgid "Arrange selection" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3258 +msgid "Distance between lines" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 -msgid "Click right mouse button to show arrangement options" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3272 +msgid "Undo boldness" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4587 -msgid "Copy" -msgstr "Kopyala" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3273 +msgid "Tiny / Wide glyphs" +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4596 -msgid "Paste" -msgstr "Yapıştır" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3283 +msgid "Undo letter's skew" +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4608 src/slic3r/GUI/GUI_Factories.cpp:1084 -#: src/slic3r/GUI/GUI_Factories.cpp:1108 src/slic3r/GUI/GUI_Factories.cpp:1119 -msgid "Add instance" -msgstr "Kopyasını ekle" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3284 +msgid "Italic strength ratio" +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4619 src/slic3r/GUI/GUI_Factories.cpp:1087 -msgid "Remove instance" -msgstr "Kopyayı sil" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3304 +msgid "Undo translation" +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4632 -msgid "Split to objects" -msgstr "Nesnelere böl" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3305 +msgid "Distance of the center of text from model surface" +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4642 -msgid "Split to parts" -msgstr "Paçalara böl" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3350 +msgid "Undo rotation" +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/GLCanvas3D.cpp:4795 -msgid "Click right mouse button to open/close History" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3352 +msgid "Rotate text Clock-wise." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4779 -#, boost-format -msgid "Next Undo action: %1%" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3386 +msgid "Select from True Type Collection." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4795 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1345 -msgid "Redo" -msgstr "Yinele" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3395 +msgid "Set text to face camera" +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4817 -#, boost-format -msgid "Next Redo action: %1%" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3402 +msgid "Use camera direction for text orientation" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6434 -msgid "An object outside the print area was detected." +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3486 +#, boost-format +msgid "Font '%1%' can't be used. Please select another." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6435 -msgid "A toolpath outside the print area was detected." +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3488 +msgid "Selected font is NOT True-type." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6436 -msgid "SLA supports outside the print area were detected." +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3512 +msgid "Choose one or more files (TTF, TTC):" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6437 -msgid "Some objects are not visible during editing." +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3539 +msgid "Choose SVG file:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6439 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3600 +#, boost-format msgid "" -"An object outside the print area was detected.\n" -"Resolve the current problem to continue slicing." +"Can't load exactly same font(\"%1%\"), Aplication selected a similar " +"one(\"%2%\"). You have to specify font for enable edit text." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6513 -msgid "Selection-Add from rectangle" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:81 +msgid "Enter emboss gizmo" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6528 -msgid "Selection-Remove from rectangle" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:82 +msgid "Leave emboss gizmo" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4478 -msgid "Cut" -msgstr "Kes" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -msgid "in" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:83 +msgid "Embossing actions" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 -msgid "Keep upper part" -msgstr "Üst parçayi koru" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 -msgid "Keep lower part" -msgstr "Alt parçayi koru" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:196 -msgid "Rotate lower part upwards" -msgstr "Alt kismi yukari dogru çevir" +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:37 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:66 +msgid "Paint-on supports" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:201 -msgid "Perform cut" -msgstr "Kesme islemini uygula" +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 +msgid "Automatic painting" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:49 -msgid "Paint-on supports" +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 +msgid "painting..." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:107 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 msgid "Clipping of view" msgstr "Görünüm kırpma" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:106 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 msgid "Reset direction" msgstr "Yönü sıfırla" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:108 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 msgid "Brush size" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:109 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 msgid "Brush shape" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1816 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:110 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 msgid "Left mouse button" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 msgid "Enforce supports" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 msgid "Right mouse button" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:434 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:573 msgid "Block supports" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 msgid "Shift + Left mouse button" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:429 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:568 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:247 msgid "Remove selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 msgid "Remove all selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 -msgid "Circle" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Sphere" msgstr "Küre" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:68 -#: src/libslic3r/PrintConfig.cpp:1172 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:106 +#: src/libslic3r/PrintConfig.cpp:1231 msgid "Triangles" msgstr "Üçgenler" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 msgid "Highlight overhang by angle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:63 msgid "Enforce" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 msgid "Tool type" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 msgid "Brush" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:128 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:68 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 msgid "Smart fill" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:131 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 msgid "Smart fill angle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:132 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:72 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 msgid "Split triangles" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 -msgid "On overhangs only" +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:73 +msgid "On overhangs only" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:187 +#, boost-format +msgid "" +"Preselects faces by overhang angle. It is possible to restrict paintable " +"facets to only preselected faces when the option \"%1%\" is enabled." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:230 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:371 +msgid "Paints facets according to the chosen painting brush." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:238 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:384 +msgid "" +"Paints neighboring facets whose relative angle is less or equal to set angle." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242 +#, boost-format +msgid "Allows painting only on facets selected by: \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:257 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:412 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141 +msgid "Paints all facets inside, regardless of their orientation." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:266 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:421 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:149 +msgid "Ignores facets facing away from the camera." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:430 +msgid "Paints only one facet." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:298 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:438 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:455 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:129 +msgid "Alt + Mouse wheel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:288 +msgid "Splits bigger facets into smaller ones while the object is painted." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:321 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:476 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:167 +msgid "Ctrl + Mouse wheel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:326 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:481 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:172 +msgid "Reset selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:382 +msgid "Block supports by angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:383 +msgid "Add supports by angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +msgid "Automatic painting requires valid print setup." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:535 +msgid "Automatic painting will erase all currently painted areas." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:536 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1118 +msgid "Are you sure you want to do it?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:540 +msgid "Automatic painting support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:571 +msgid "Add supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:22 +msgid "Entering Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:23 +msgid "Leaving Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:24 +msgid "Paint-on supports editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:88 +msgid "Place on face" +msgstr "Yüzeye yerleştir" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:29 +msgid "Hollow this object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 +msgid "Preview hollowed and drilled model" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 +msgid "Offset" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 +msgid "Quality" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 +#: src/libslic3r/PrintConfig.cpp:4037 +msgid "Closing distance" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 +msgid "Hole diameter" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 +msgid "Hole depth" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 +msgid "Remove selected holes" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 +msgid "Remove all holes" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 +msgid "Show supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:242 +msgid "Add drainage hole" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:361 +msgid "Delete drainage hole" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:655 +msgid "Hollowing parameter change" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:739 +msgid "Change drainage hole diameter" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:827 +msgid "Hollow and drill" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:869 +msgid "Move drainage hole" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:64 +msgid "No feature" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:174 -#, boost-format -msgid "" -"Preselects faces by overhang angle. It is possible to restrict paintable " -"facets to only preselected faces when the option \"%1%\" is enabled." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:65 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:76 +msgid "Vertex" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:217 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:378 -msgid "Paints facets according to the chosen painting brush." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:66 +msgid "Edge" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:391 -msgid "" -"Paints neighboring facets whose relative angle is less or equal to set angle." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:68 +msgid "Plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:229 -#, boost-format -msgid "Allows painting only on facets selected by: \"%1%\"" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:77 +msgid "Point on edge" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:244 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:419 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:144 -msgid "Paints all facets inside, regardless of their orientation." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:78 +msgid "Point on circle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:253 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:428 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:152 -msgid "Ignores facets facing away from the camera." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:79 +msgid "Point on plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:262 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:437 -msgid "Paints only one facet." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:89 +msgid "Center of edge" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:270 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:285 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:445 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:462 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:132 -msgid "Alt + Mouse wheel" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:90 +msgid "Center of circle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 -msgid "Splits bigger facets into smaller ones while the object is painted." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:554 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2029 +msgid "Measure" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:308 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:483 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:170 -msgid "Ctrl + Mouse wheel" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1236 +msgid "Edit to scale" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:313 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:488 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:175 -msgid "Reset selection" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1258 +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:161 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:236 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:776 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:794 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:817 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:831 +#: src/libslic3r/PrintConfig.cpp:4713 +msgid "Scale" +msgstr "Ölçek" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1362 +msgctxt "Verb" +msgid "Scale" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:364 -msgid "Block supports by angle" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1541 +msgid "##angle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:365 -msgid "Add supports by angle" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1740 +msgid "Measure tool debug" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:432 -msgid "Add supports" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1824 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1851 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1857 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1886 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1893 +msgid "Unselect feature" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:41 -msgid "Place on face" -msgstr "Yüzeye yerleştir" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1830 +msgid "Unselect center" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 -msgid "Hollow this object" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1835 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1862 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1898 +msgid "Select center" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 -msgid "Preview hollowed and drilled model" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1840 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1867 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1903 +msgid "Unselect point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 -msgid "Offset" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1846 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1873 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1910 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select feature" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:57 -msgid "Quality" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3905 -msgid "Closing distance" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Shift" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 -msgid "Hole diameter" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Enable point selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 -msgid "Hole depth" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2007 +msgid "Restart selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 -msgid "Remove selected holes" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1952 +msgid "Esc" +msgstr "Esc" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1955 +msgid "Unselect" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 -msgid "Remove all holes" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1999 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2001 +msgid "Selection" +msgstr "Seçim" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2021 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +msgid "Copy to clipboard" +msgstr "Panoya kopyala" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2038 +msgid "Angle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 -msgid "Show supports" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Perpendicular distance" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:287 -msgid "Add drainage hole" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Distance" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:403 -msgid "Delete drainage hole" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2062 +msgid "Direct distance" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:590 -msgid "Hollowing parameter change" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2072 +msgid "Distance XYZ" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:667 -msgid "Change drainage hole diameter" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:163 +msgid "Entering Measure gizmo" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:761 -msgid "Hollow and drill" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:164 +msgid "Leaving Measure gizmo" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:811 -msgid "Move drainage hole" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:165 +msgid "Measure gizmo editing" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:27 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:28 #, boost-format msgid "" "Your printer has more extruders than the multi-material painting gizmo " @@ -2716,81 +3927,85 @@ msgid "" "used for painting." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:45 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:46 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 msgid "Multimaterial painting" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 msgid "First color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 msgid "Second color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:120 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:671 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:642 msgid "Remove painted color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 msgid "Clear all" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:129 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 msgid "Bucket fill" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:404 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:397 msgid "Paints neighboring facets that have the same color." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:450 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:443 msgid "Split bigger facets into smaller ones while the object is painted." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:674 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:645 #, boost-format msgid "Painted using: Extruder %1%" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:118 +msgid "Entering Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:119 +msgid "Leaving Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:120 +msgid "Multimaterial painting editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:76 msgid "Move" msgstr "Taşı" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:466 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4532 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:643 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:745 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:775 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:813 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:830 +#: src/libslic3r/PrintConfig.cpp:4698 msgid "Rotate" msgstr "Çevir" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:505 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:707 msgid "Optimize orientation" msgstr "Yönlendirmeyi optimize et" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:552 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:319 -msgid "Apply" -msgstr "Uygula" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:79 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4547 -msgid "Scale" -msgstr "Ölçek" +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:194 +msgid "Gizmo-Scale" +msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 msgid "Enforce seam" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:38 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:255 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:252 msgid "Block seam" msgstr "" @@ -2798,338 +4013,342 @@ msgstr "" msgid "Seam painting" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:23 +msgid "Entering Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:24 +msgid "Leaving Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:25 +msgid "Paint-on seam editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:105 msgid "Mesh name" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:69 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:107 msgid "Detail level" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:108 msgid "Decimate ratio" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:113 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:147 #, boost-format msgid "" "Processing model '%1%' with more than 1M triangles could be slow. It is " -"highly recommend to reduce amount of triangles." +"highly recommended to reduce amount of triangles." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:116 -#: src/slic3r/GUI/GUI_Factories.cpp:705 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:150 +#: src/slic3r/GUI/GUI_Factories.cpp:789 msgid "Simplify model" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:143 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:177 msgid "Simplify" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:156 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:190 msgid "Simplification is currently only allowed when a single part is selected" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 -#: src/slic3r/GUI/PrintHostDialogs.cpp:373 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:191 +#: src/slic3r/GUI/MainFrame.cpp:1246 src/slic3r/GUI/MainFrame.cpp:1716 +#: src/slic3r/GUI/PrintHostDialogs.cpp:425 msgid "Error" msgstr "Hata" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:250 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:294 msgid "Extra high" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:251 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:295 msgid "High" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:252 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:296 msgid "Medium" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:297 msgid "Low" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:254 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:298 msgid "Extra low" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:304 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#, boost-format +msgid "" +"Multipart object can be simplified only by %1%. If you want specify %2% " +"process it separately." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:352 #, c-format, boost-format msgid "%d triangles" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:307 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:355 msgid "Show wireframe" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:313 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:361 msgid "Operation already cancelling. Please wait few seconds." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:370 msgid "Can't apply when proccess preview." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:329 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:377 #, boost-format msgid "Process %1% / 100" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:479 -#, boost-format -msgid "Simplify %1%" +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:542 +msgid "Simplify " msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:543 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"simplifying the mesh." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:67 +msgid "Entering SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:68 +msgid "Leaving SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:35 msgid "Head diameter" msgstr "Başlık çapı" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:36 msgid "Lock supports under new islands" msgstr "Yeni adalardaki destekleri kilitle" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:37 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268 msgid "Remove selected points" msgstr "Seçilen noktaları kaldır" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:38 msgid "Remove all points" msgstr "Tüm noktaları kaldır" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1226 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1271 msgid "Apply changes" msgstr "Değişiklikleri uygula" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1227 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1272 msgid "Discard changes" msgstr "Değişiklikleri iptal et" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 msgid "Minimal points distance" msgstr "En düşük nokta mesafesi" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3735 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/libslic3r/PrintConfig.cpp:3867 msgid "Support points density" msgstr "Destek noktaları yoğunluğu" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1229 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1274 msgid "Auto-generate points" msgstr "Noktaları otomatik oluştur" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 msgid "Manual editing" msgstr "Manuel düzenleme" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:372 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:307 msgid "Add support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:522 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:460 msgid "Delete support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:702 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:626 msgid "Change point head diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:770 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:696 msgid "Support parameter change" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:876 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:806 msgid "SLA Support Points" msgstr "SLA Destek Noktaları" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:814 msgid "Do you want to save your manually edited support points?" msgstr "El ile düzenlenen destek noktalarınızı kaydetmek ister misiniz?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:898 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:815 msgid "Save support points?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:958 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:880 msgid "Move support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1051 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:987 msgid "Support points edit" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1131 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1117 msgid "Autogeneration will erase all manually edited points." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1132 -msgid "Are you sure you want to do it?" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1138 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1124 msgid "Autogenerate support points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1186 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 msgid "SLA gizmo keyboard shortcuts" msgstr "SLA gizmo klavye kısayolları" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1197 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1242 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "Not: Bazı kısayollar yalnızca düzenleme modunda çalışır." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 -msgid "Left click" -msgstr "Sol tık" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 msgid "Add point" msgstr "Nokta ekle" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 -msgid "Right click" -msgstr "Sağ tık" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 msgid "Remove point" msgstr "Noktayı kaldır" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 -msgid "Drag" -msgstr "Sürükle" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 msgid "Move point" msgstr "Hareket noktası" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 msgid "Add point to selection" msgstr "Seçime nokta ekle" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 msgid "Remove point from selection" msgstr "Seçimden noktayı kaldır" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 msgid "Select by rectangle" msgstr "Dikdörtgene göre seç" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 msgid "Deselect by rectangle" msgstr "Dikdörtgene göre seçimi kaldır" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1267 msgid "Select all points" msgstr "Tüm noktaları seç" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Mouse wheel" msgstr "Fare tekerleği" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Move clipping plane" msgstr "Kırpma düzlemini taşı" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1225 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1270 msgid "Reset clipping plane" msgstr "Kırpma düzlemini sıfırla" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1228 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273 msgid "Switch to editing mode" msgstr "Düzenleme moduna geç" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:196 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:204 msgid "" "ERROR: Please close all manipulators available from the left toolbar first" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:561 -msgid "Gizmo-Scale" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:673 -msgid "Gizmo-Place on Face" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:1270 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:998 msgid "" "You are currently editing SLA support points. Please, apply or discard your " "changes first." msgstr "" -#: src/slic3r/GUI/GUI.cpp:292 +#: src/slic3r/GUI/GUI.cpp:287 msgid "Undefined" msgstr "" -#: src/slic3r/GUI/GUI.cpp:317 +#: src/slic3r/GUI/GUI.cpp:308 #, boost-format msgid "%1% was substituted with %2%" msgstr "" -#: src/slic3r/GUI/GUI.cpp:326 +#: src/slic3r/GUI/GUI.cpp:317 msgid "" "Most likely the configuration was produced by a newer version of PrusaSlicer " "or by some PrusaSlicer fork." msgstr "" -#: src/slic3r/GUI/GUI.cpp:327 +#: src/slic3r/GUI/GUI.cpp:318 msgid "The following values were substituted:" msgstr "" -#: src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/GUI.cpp:319 msgid "Review the substitutions and adjust them if needed." msgstr "" -#: src/slic3r/GUI/GUI.cpp:338 src/slic3r/GUI/Plater.cpp:820 +#: src/slic3r/GUI/GUI.cpp:329 src/slic3r/GUI/Plater.cpp:850 msgid "SLA print settings" msgstr "SLA yazdırma ayarları" -#: src/slic3r/GUI/GUI.cpp:342 src/slic3r/GUI/PhysicalPrinterDialog.cpp:157 +#: src/slic3r/GUI/GUI.cpp:333 src/slic3r/GUI/PhysicalPrinterDialog.cpp:158 msgid "Physical Printer" msgstr "" -#: src/slic3r/GUI/GUI.cpp:355 +#: src/slic3r/GUI/GUI.cpp:346 msgid "" "Configuration bundle was loaded, however some configuration values were not " "recognized." msgstr "" -#: src/slic3r/GUI/GUI.cpp:365 +#: src/slic3r/GUI/GUI.cpp:356 #, boost-format msgid "" "Configuration file \"%1%\" was loaded, however some configuration values " "were not recognized." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:266 +#: src/slic3r/GUI/GUI_App.cpp:275 msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:267 +#: src/slic3r/GUI/GUI_App.cpp:276 msgid "Developed by Prusa Research." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:269 +#: src/slic3r/GUI/GUI_App.cpp:278 msgid "" "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:270 -msgid "Artwork model by Leslie Ing" +#: src/slic3r/GUI/GUI_App.cpp:279 +msgid "Artwork model by Creative Tools" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:411 +#: src/slic3r/GUI/GUI_App.cpp:420 #, boost-format msgid "" "Starting with %1% 2.3, configuration directory on Linux has changed " @@ -3149,20 +4368,20 @@ msgid "" "What do you want to do now?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:419 +#: src/slic3r/GUI/GUI_App.cpp:428 #, c-format, boost-format msgid "%s - BREAKING CHANGE" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Quit, I will move my data now" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Start the application" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:699 +#: src/slic3r/GUI/GUI_App.cpp:725 #, c-format, boost-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -3172,11 +4391,11 @@ msgid "" "The application will now terminate." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:702 +#: src/slic3r/GUI/GUI_App.cpp:728 msgid "Fatal error" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:706 +#: src/slic3r/GUI/GUI_App.cpp:732 msgid "" "PrusaSlicer has encountered a localization error. Please report to " "PrusaSlicer team, what language was active and in which scenario this issue " @@ -3185,34 +4404,34 @@ msgid "" "The application will now terminate." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:709 +#: src/slic3r/GUI/GUI_App.cpp:735 msgid "Critical error" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:714 +#: src/slic3r/GUI/GUI_App.cpp:740 #, boost-format msgid "Internal error: %1%" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:909 src/slic3r/GUI/GUI_App.cpp:1007 +#: src/slic3r/GUI/GUI_App.cpp:954 src/slic3r/GUI/GUI_App.cpp:1051 msgid "" "Error parsing PrusaSlicer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error. Your user profiles will " "not be affected." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:915 src/slic3r/GUI/GUI_App.cpp:1013 +#: src/slic3r/GUI/GUI_App.cpp:960 src/slic3r/GUI/GUI_App.cpp:1057 msgid "" "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:962 +#: src/slic3r/GUI/GUI_App.cpp:1006 #, boost-format msgid "You are opening %1% version %2%." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:965 +#: src/slic3r/GUI/GUI_App.cpp:1009 #, boost-format msgid "" "The active configuration was created by %1% %2%,\n" @@ -3224,7 +4443,7 @@ msgid "" "configuration." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:973 +#: src/slic3r/GUI/GUI_App.cpp:1017 #, boost-format msgid "" "An existing configuration was found in %3%\n" @@ -3233,19 +4452,19 @@ msgid "" "Shall this configuration be imported?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:981 +#: src/slic3r/GUI/GUI_App.cpp:1025 msgid "Import" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:982 +#: src/slic3r/GUI/GUI_App.cpp:1026 msgid "Don't import" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:990 +#: src/slic3r/GUI/GUI_App.cpp:1034 msgid "Continue and import newer configuration?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1051 +#: src/slic3r/GUI/GUI_App.cpp:1095 msgid "" "You are running a 32 bit build of PrusaSlicer on 64-bit Windows.\n" "32 bit build of PrusaSlicer will likely not be able to utilize all the RAM " @@ -3255,53 +4474,44 @@ msgid "" "Do you wish to continue?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1134 +#: src/slic3r/GUI/GUI_App.cpp:1182 #, c-format, boost-format msgid "" "%s\n" "Do you want to continue?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1136 src/slic3r/GUI/GUI_App.cpp:3101 -#: src/slic3r/GUI/Plater.cpp:1726 src/slic3r/GUI/UnsavedChangesDialog.cpp:889 +#: src/slic3r/GUI/GUI_App.cpp:1184 src/slic3r/GUI/GUI_App.cpp:3302 +#: src/slic3r/GUI/Plater.cpp:1736 src/slic3r/GUI/UnsavedChangesDialog.cpp:917 msgid "Remember my choice" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1178 +#: src/slic3r/GUI/GUI_App.cpp:1226 msgid "Loading configuration" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1209 -#, boost-format -msgid "New release version %1% is available." -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:1210 -msgid "See Download page." -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:1224 +#: src/slic3r/GUI/GUI_App.cpp:1257 #, boost-format msgid "New prerelease version %1% is available." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1225 +#: src/slic3r/GUI/GUI_App.cpp:1258 msgid "See Releases page." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1262 +#: src/slic3r/GUI/GUI_App.cpp:1313 msgid "Preparing settings tabs" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1336 src/slic3r/GUI/Preferences.cpp:287 +#: src/slic3r/GUI/GUI_App.cpp:1393 src/slic3r/GUI/Preferences.cpp:405 msgid "Restore window position on start" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1338 +#: src/slic3r/GUI/GUI_App.cpp:1395 msgid "PrusaSlicer started after a crash" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1339 +#: src/slic3r/GUI/GUI_App.cpp:1396 #, boost-format msgid "" "PrusaSlicer crashed last time when attempting to set window position.\n" @@ -3314,199 +4524,204 @@ msgid "" "Otherwise, the application will most likely crash again next time." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1351 +#: src/slic3r/GUI/GUI_App.cpp:1408 #, boost-format msgid "Disable \"%1%\"" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1352 +#: src/slic3r/GUI/GUI_App.cpp:1409 #, boost-format msgid "Leave \"%1%\" enabled" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1679 +#: src/slic3r/GUI/GUI_App.cpp:1780 msgid "" "You have the following presets with saved options for \"Print Host upload\"" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1683 +#: src/slic3r/GUI/GUI_App.cpp:1784 msgid "" "But since this version of PrusaSlicer we don't show this information in " "Printer Settings anymore.\n" "Settings will be available in physical printers settings." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1685 +#: src/slic3r/GUI/GUI_App.cpp:1786 msgid "" "By default new Printer devices will be named as \"Printer N\" during its " "creation.\n" "Note: This name can be changed later from the physical printers settings" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1689 src/slic3r/GUI/PhysicalPrinterDialog.cpp:726 +#: src/slic3r/GUI/GUI_App.cpp:1790 src/slic3r/GUI/PhysicalPrinterDialog.cpp:798 msgid "Information" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1702 src/slic3r/GUI/GUI_App.cpp:1713 +#: src/slic3r/GUI/GUI_App.cpp:1803 src/slic3r/GUI/GUI_App.cpp:1814 msgid "Recreating" msgstr "Yeniden oluşturma" -#: src/slic3r/GUI/GUI_App.cpp:1716 +#: src/slic3r/GUI/GUI_App.cpp:1817 msgid "Loading of current presets" msgstr "Geçerli hazır ayarlar yükleniyor" -#: src/slic3r/GUI/GUI_App.cpp:1721 +#: src/slic3r/GUI/GUI_App.cpp:1822 msgid "Loading of a mode view" msgstr "Mod görünümü yükleniyor" -#: src/slic3r/GUI/GUI_App.cpp:1859 +#: src/slic3r/GUI/GUI_App.cpp:1961 msgid "Choose one file (3MF/AMF):" msgstr "Bir dosya seçin (3MF/AMF):" -#: src/slic3r/GUI/GUI_App.cpp:1871 +#: src/slic3r/GUI/GUI_App.cpp:1973 msgid "Choose one or more files (STL/3MF/STEP/OBJ/AMF/PRUSA):" msgstr "" "Bir veya daha fazla dosya seçin (STL / OBJ / AMF / 3MF / PRUSA / STEP):" -#: src/slic3r/GUI/GUI_App.cpp:1883 +#: src/slic3r/GUI/GUI_App.cpp:1984 +msgid "Choose ZIP file:" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1996 msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1894 +#: src/slic3r/GUI/GUI_App.cpp:2007 msgid "Changing of an application language" msgstr "Bir uygulama dilinin değiştirilmesi" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Select the language" msgstr "Dil seçiniz" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Language" msgstr "Dil" -#: src/slic3r/GUI/GUI_App.cpp:2182 -msgid "modified" -msgstr "değiştirilmiş" +#: src/slic3r/GUI/GUI_App.cpp:2363 +msgid "" +"Simple mode supports manipulation with single-part object(s)\n" +"or object(s) with support modifiers only." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2365 +msgid "Please check your object list before mode changing." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2366 +msgid "Change application mode" +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2236 +#: src/slic3r/GUI/GUI_App.cpp:2397 #, c-format, boost-format msgid "Run %s" msgstr "%s başlat" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "&Configuration Snapshots" msgstr "&Yapılandırma Anlık Görüntüleri" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "Inspect / activate configuration snapshots" msgstr "Yapılandırma anlık görüntülerini inceleme/etkinleştirme" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Take Configuration &Snapshot" msgstr "Yapılandırma &Anlık Görüntüsü Al" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Capture a configuration snapshot" msgstr "Yapılandırma anlık görüntüsünü kaydet" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for Configuration Updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for configuration updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2249 +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for Application Updates" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for new version of application" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2411 msgid "&Preferences" msgstr "&Tercihler" -#: src/slic3r/GUI/GUI_App.cpp:2255 +#: src/slic3r/GUI/GUI_App.cpp:2417 msgid "Application preferences" msgstr "Uygulama tercihleri" -#: src/slic3r/GUI/GUI_App.cpp:2260 src/slic3r/GUI/wxExtensions.cpp:708 -msgid "Simple" -msgstr "Basit" - -#: src/slic3r/GUI/GUI_App.cpp:2260 +#: src/slic3r/GUI/GUI_App.cpp:2422 msgid "Simple View Mode" msgstr "Basit görünüm modu" -#: src/slic3r/GUI/GUI_App.cpp:2262 src/slic3r/GUI/wxExtensions.cpp:710 -msgctxt "Mode" -msgid "Advanced" -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:2262 +#: src/slic3r/GUI/GUI_App.cpp:2424 msgid "Advanced View Mode" msgstr "Gelişmiş Görünüm Modu" -#: src/slic3r/GUI/GUI_App.cpp:2263 src/slic3r/GUI/wxExtensions.cpp:711 -msgid "Expert" -msgstr "Uzman" - -#: src/slic3r/GUI/GUI_App.cpp:2263 +#: src/slic3r/GUI/GUI_App.cpp:2425 msgid "Expert View Mode" msgstr "Uzman Modu" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 msgid "Mode" msgstr "Mod" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 #, c-format, boost-format msgid "%s View Mode" msgstr "%s Görüntüleme Modu" -#: src/slic3r/GUI/GUI_App.cpp:2271 +#: src/slic3r/GUI/GUI_App.cpp:2433 msgid "&Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Flash Printer &Firmware" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Upload a firmware image into an Arduino based printer" msgstr "Arduino tabanlı bir yazıcıya yazılım yükle" -#: src/slic3r/GUI/GUI_App.cpp:2294 +#: src/slic3r/GUI/GUI_App.cpp:2459 msgid "Taking a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2295 +#: src/slic3r/GUI/GUI_App.cpp:2460 msgid "" "Some presets are modified and the unsaved changes will not be captured by " "the configuration snapshot." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2296 +#: src/slic3r/GUI/GUI_App.cpp:2461 msgid "Snapshot name" msgstr "Anlık görüntü adı" -#: src/slic3r/GUI/GUI_App.cpp:2312 +#: src/slic3r/GUI/GUI_App.cpp:2477 msgid "Loading a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2321 +#: src/slic3r/GUI/GUI_App.cpp:2486 #, boost-format msgid "Continue to activate a configuration snapshot %1%?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2335 +#: src/slic3r/GUI/GUI_App.cpp:2500 msgid "Failed to activate configuration snapshot." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2354 -msgid "Restart application" -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:2388 +#: src/slic3r/GUI/GUI_App.cpp:2520 msgid "Language selection" msgstr "Dil seçimi" -#: src/slic3r/GUI/GUI_App.cpp:2391 +#: src/slic3r/GUI/GUI_App.cpp:2523 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." @@ -3514,145 +4729,174 @@ msgstr "" "Dilin değiştirilmesi uygulamanın yeniden başlatılmasını tetikler.\n" "Tabla içeriğini kaybedeceksiniz." -#: src/slic3r/GUI/GUI_App.cpp:2393 src/slic3r/GUI/Preferences.cpp:582 +#: src/slic3r/GUI/GUI_App.cpp:2525 src/slic3r/GUI/Preferences.cpp:730 +#: src/slic3r/GUI/Selection.cpp:1695 msgid "Do you want to proceed?" msgstr "Devam etmek istiyor musunuz?" -#: src/slic3r/GUI/GUI_App.cpp:2420 +#: src/slic3r/GUI/GUI_App.cpp:2552 msgid "&Configuration" msgstr "&Ayarlar" -#: src/slic3r/GUI/GUI_App.cpp:2534 src/slic3r/GUI/GUI_App.cpp:2595 -msgid "The preset modifications are successfully saved" -msgid_plural "The presets modifications are successfully saved" -msgstr[0] "" -msgstr[1] "" +#: src/slic3r/GUI/GUI_App.cpp:2560 +msgid "Restart application" +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2598 +#: src/slic3r/GUI/GUI_App.cpp:2726 msgid "For new project all modifications will be reseted" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2636 +#: src/slic3r/GUI/GUI_App.cpp:2764 msgid "Loading a new project while the current project is modified." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Project is loading" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Opening new project while some presets are unsaved." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "The uploads are still ongoing" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "Stop them and continue anyway?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2662 +#: src/slic3r/GUI/GUI_App.cpp:2790 msgid "Ongoing uploads" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2876 -msgid "It's impossible to print multi-part object(s) with SLA technology." -msgstr "SLA teknolojisi ile çok parçalı nesnelerin basılması mümkün değildir." +#: src/slic3r/GUI/GUI_App.cpp:3026 +msgid "" +"It's impossible to print object(s) which contains parameter modifiers with " +"SLA technology." +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2877 src/slic3r/GUI/Jobs/SLAImportJob.cpp:235 -#: src/slic3r/GUI/Plater.cpp:2459 +#: src/slic3r/GUI/GUI_App.cpp:3027 src/slic3r/GUI/Jobs/SLAImportJob.cpp:149 +#: src/slic3r/GUI/Plater.cpp:2536 msgid "Please check your object list before preset changing." msgstr "" "Lütfen önceden ayarlanmış değişiklik yapmadan önce nesne listenizi kontrol " "edin." -#: src/slic3r/GUI/GUI_App.cpp:2901 +#: src/slic3r/GUI/GUI_App.cpp:3070 msgid "Configuration is editing from ConfigWizard" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2926 +#: src/slic3r/GUI/GUI_App.cpp:3088 +#, boost-format +msgid "Welcome to %1% version %2%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3090 +#, boost-format +msgid "" +"Do you wish to register downloads from Printables.com\n" +"for this %1% %2% executable?\n" +"\n" +"Downloads can be registered for only 1 executable at time." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3118 msgid "Select a gcode file:" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "Open hyperlink in default browser?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "PrusaSlicer: Open hyperlink" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3105 src/slic3r/GUI/Preferences.cpp:382 +#: src/slic3r/GUI/GUI_App.cpp:3306 src/slic3r/GUI/Preferences.cpp:593 msgid "Suppress to open hyperlink in browser" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3107 src/slic3r/GUI/Plater.cpp:1732 +#: src/slic3r/GUI/GUI_App.cpp:3308 src/slic3r/GUI/Plater.cpp:1742 msgid "PrusaSlicer will remember your choice." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3108 +#: src/slic3r/GUI/GUI_App.cpp:3309 msgid "You will not be asked about it again on hyperlinks hovering." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3109 src/slic3r/GUI/Plater.cpp:1736 +#: src/slic3r/GUI/GUI_App.cpp:3310 src/slic3r/GUI/Plater.cpp:1746 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" "to changes your choice." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3111 src/slic3r/GUI/Plater.cpp:1738 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:906 +#: src/slic3r/GUI/GUI_App.cpp:3312 src/slic3r/GUI/Plater.cpp:1748 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:934 msgid "PrusaSlicer: Don't ask me again" msgstr "" -#: src/slic3r/GUI/GUI_Init.cpp:57 src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_App.cpp:3386 +msgid "Check for application update has failed." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3387 +#, boost-format +msgid "No new version is available. Latest release version is %1%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3458 +msgid "Download of new version is already ongoing. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/GUI_Init.cpp:64 src/slic3r/GUI/GUI_Init.cpp:67 msgid "PrusaSlicer GUI initialization failed" msgstr "" -#: src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_Init.cpp:67 #, boost-format msgid "Fatal error, exception catched: %1%" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:54 src/slic3r/GUI/GUI_Factories.cpp:127 -#: src/libslic3r/PrintConfig.cpp:287 src/libslic3r/PrintConfig.cpp:404 -#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:456 -#: src/libslic3r/PrintConfig.cpp:708 src/libslic3r/PrintConfig.cpp:778 -#: src/libslic3r/PrintConfig.cpp:786 src/libslic3r/PrintConfig.cpp:1232 -#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1563 -#: src/libslic3r/PrintConfig.cpp:1955 src/libslic3r/PrintConfig.cpp:2030 -#: src/libslic3r/PrintConfig.cpp:2264 src/libslic3r/PrintConfig.cpp:2850 -#: src/libslic3r/PrintConfig.cpp:2858 src/libslic3r/PrintConfig.cpp:2918 -#: src/libslic3r/PrintConfig.cpp:2927 src/libslic3r/PrintConfig.cpp:3098 +#: src/libslic3r/PrintConfig.cpp:300 src/libslic3r/PrintConfig.cpp:423 +#: src/libslic3r/PrintConfig.cpp:466 src/libslic3r/PrintConfig.cpp:475 +#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:872 +#: src/libslic3r/PrintConfig.cpp:881 src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1376 src/libslic3r/PrintConfig.cpp:1604 +#: src/libslic3r/PrintConfig.cpp:1985 src/libslic3r/PrintConfig.cpp:2060 +#: src/libslic3r/PrintConfig.cpp:2294 src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:2946 src/libslic3r/PrintConfig.cpp:3006 +#: src/libslic3r/PrintConfig.cpp:3015 src/libslic3r/PrintConfig.cpp:3186 msgid "Layers and Perimeters" msgstr "Katmanlar ve Duvarlar" #: src/slic3r/GUI/GUI_Factories.cpp:56 src/slic3r/GUI/GUI_Factories.cpp:131 -#: src/slic3r/GUI/GUI_Preview.cpp:249 src/slic3r/GUI/Tab.cpp:1547 -#: src/slic3r/GUI/Tab.cpp:1549 src/libslic3r/ExtrusionEntity.cpp:340 -#: src/libslic3r/ExtrusionEntity.cpp:372 src/libslic3r/PrintConfig.cpp:670 -#: src/libslic3r/PrintConfig.cpp:2095 src/libslic3r/PrintConfig.cpp:2104 -#: src/libslic3r/PrintConfig.cpp:2113 src/libslic3r/PrintConfig.cpp:2123 -#: src/libslic3r/PrintConfig.cpp:2132 src/libslic3r/PrintConfig.cpp:2554 -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2568 -#: src/libslic3r/PrintConfig.cpp:2581 src/libslic3r/PrintConfig.cpp:2591 -#: src/libslic3r/PrintConfig.cpp:2599 src/libslic3r/PrintConfig.cpp:2617 -#: src/libslic3r/PrintConfig.cpp:2634 src/libslic3r/PrintConfig.cpp:2655 -#: src/libslic3r/PrintConfig.cpp:2668 src/libslic3r/PrintConfig.cpp:2685 -#: src/libslic3r/PrintConfig.cpp:2703 src/libslic3r/PrintConfig.cpp:2718 -#: src/libslic3r/PrintConfig.cpp:2728 src/libslic3r/PrintConfig.cpp:2737 -#: src/libslic3r/PrintConfig.cpp:2748 src/libslic3r/PrintConfig.cpp:2762 -#: src/libslic3r/PrintConfig.cpp:2778 src/libslic3r/PrintConfig.cpp:2786 -#: src/libslic3r/PrintConfig.cpp:2787 src/libslic3r/PrintConfig.cpp:2796 -#: src/libslic3r/PrintConfig.cpp:2810 src/libslic3r/PrintConfig.cpp:2818 -#: src/libslic3r/PrintConfig.cpp:2832 +#: src/slic3r/GUI/Tab.cpp:1494 src/slic3r/GUI/Tab.cpp:1496 +#: src/libslic3r/PrintConfig.cpp:773 src/libslic3r/PrintConfig.cpp:2125 +#: src/libslic3r/PrintConfig.cpp:2134 src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2153 src/libslic3r/PrintConfig.cpp:2162 +#: src/libslic3r/PrintConfig.cpp:2584 src/libslic3r/PrintConfig.cpp:2590 +#: src/libslic3r/PrintConfig.cpp:2598 src/libslic3r/PrintConfig.cpp:2611 +#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2628 +#: src/libslic3r/PrintConfig.cpp:2644 src/libslic3r/PrintConfig.cpp:2660 +#: src/libslic3r/PrintConfig.cpp:2681 src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2725 +#: src/libslic3r/PrintConfig.cpp:2743 src/libslic3r/PrintConfig.cpp:2753 +#: src/libslic3r/PrintConfig.cpp:2762 src/libslic3r/PrintConfig.cpp:2773 +#: src/libslic3r/PrintConfig.cpp:2785 src/libslic3r/PrintConfig.cpp:2799 +#: src/libslic3r/PrintConfig.cpp:2807 src/libslic3r/PrintConfig.cpp:2808 +#: src/libslic3r/PrintConfig.cpp:2817 src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2840 src/libslic3r/PrintConfig.cpp:2854 +#: src/libslic3r/PrintConfig.cpp:2862 src/libslic3r/PrintConfig.cpp:2873 +#: src/libslic3r/PrintConfig.cpp:2884 src/libslic3r/PrintConfig.cpp:2893 +#: src/libslic3r/PrintConfig.cpp:2903 src/libslic3r/PrintConfig.cpp:2915 msgid "Support material" msgstr "Destek" #: src/slic3r/GUI/GUI_Factories.cpp:59 src/slic3r/GUI/GUI_Factories.cpp:135 -#: src/libslic3r/PrintConfig.cpp:3054 src/libslic3r/PrintConfig.cpp:3062 +#: src/libslic3r/PrintConfig.cpp:3142 src/libslic3r/PrintConfig.cpp:3150 msgid "Wipe options" msgstr "" @@ -3660,330 +4904,351 @@ msgstr "" msgid "Pad and Support" msgstr "Ped ve Destek" -#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/GUI_Preview.cpp:245 -#: src/slic3r/GUI/Tab.cpp:1513 src/libslic3r/ExtrusionEntity.cpp:336 -#: src/libslic3r/ExtrusionEntity.cpp:364 src/libslic3r/PrintConfig.cpp:1579 -#: src/libslic3r/PrintConfig.cpp:1585 src/libslic3r/PrintConfig.cpp:1599 -#: src/libslic3r/PrintConfig.cpp:1609 src/libslic3r/PrintConfig.cpp:1617 -#: src/libslic3r/PrintConfig.cpp:1619 +#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/Tab.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1620 src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1638 src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1656 src/libslic3r/PrintConfig.cpp:1658 msgid "Ironing" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1283 -#: src/libslic3r/PrintConfig.cpp:1284 src/libslic3r/PrintConfig.cpp:1299 -#: src/libslic3r/PrintConfig.cpp:1309 +#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1344 src/libslic3r/PrintConfig.cpp:1356 +#: src/libslic3r/PrintConfig.cpp:1366 msgid "Fuzzy Skin" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/GUI_Preview.cpp:220 -#: src/slic3r/GUI/Tab.cpp:1581 src/libslic3r/PrintConfig.cpp:507 -#: src/libslic3r/PrintConfig.cpp:766 src/libslic3r/PrintConfig.cpp:1326 -#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1618 -#: src/libslic3r/PrintConfig.cpp:2020 src/libslic3r/PrintConfig.cpp:2352 -#: src/libslic3r/PrintConfig.cpp:2405 src/libslic3r/PrintConfig.cpp:2903 +#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/Tab.cpp:1536 +#: src/libslic3r/PrintConfig.cpp:526 src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:548 src/libslic3r/PrintConfig.cpp:557 +#: src/libslic3r/PrintConfig.cpp:566 src/libslic3r/PrintConfig.cpp:575 +#: src/libslic3r/PrintConfig.cpp:852 src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1657 +#: src/libslic3r/PrintConfig.cpp:2050 src/libslic3r/PrintConfig.cpp:2383 +#: src/libslic3r/PrintConfig.cpp:2436 src/libslic3r/PrintConfig.cpp:2991 msgid "Speed" msgstr "Hız" -#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1623 -#: src/slic3r/GUI/Tab.cpp:2304 src/libslic3r/PrintConfig.cpp:796 -#: src/libslic3r/PrintConfig.cpp:1489 src/libslic3r/PrintConfig.cpp:1997 -#: src/libslic3r/PrintConfig.cpp:2373 src/libslic3r/PrintConfig.cpp:2647 -#: src/libslic3r/PrintConfig.cpp:2675 +#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1585 +#: src/slic3r/GUI/Tab.cpp:2288 src/libslic3r/PrintConfig.cpp:889 +#: src/libslic3r/PrintConfig.cpp:1530 src/libslic3r/PrintConfig.cpp:2027 +#: src/libslic3r/PrintConfig.cpp:2404 src/libslic3r/PrintConfig.cpp:2673 +#: src/libslic3r/PrintConfig.cpp:2701 msgid "Extruders" msgstr "Ekstrüder sayısı" -#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:754 -#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:1218 -#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:2006 -#: src/libslic3r/PrintConfig.cpp:2393 src/libslic3r/PrintConfig.cpp:2656 -#: src/libslic3r/PrintConfig.cpp:2890 +#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:840 +#: src/libslic3r/PrintConfig.cpp:953 src/libslic3r/PrintConfig.cpp:1278 +#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:2036 +#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2682 +#: src/libslic3r/PrintConfig.cpp:2978 msgid "Extrusion Width" msgstr "Ekstrüzyon genişliği" -#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1533 -#: src/libslic3r/PrintConfig.cpp:517 src/libslic3r/PrintConfig.cpp:528 -#: src/libslic3r/PrintConfig.cpp:544 +#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:631 src/libslic3r/PrintConfig.cpp:642 +#: src/libslic3r/PrintConfig.cpp:655 msgid "Skirt and brim" msgstr "Etek ve kenar" -#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 -#: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1645 -#: src/slic3r/GUI/Tab.cpp:1649 src/slic3r/GUI/Tab.cpp:2031 -#: src/slic3r/GUI/Tab.cpp:2402 src/slic3r/GUI/Tab.cpp:4729 -#: src/libslic3r/PrintConfig.cpp:260 src/libslic3r/PrintConfig.cpp:495 -#: src/libslic3r/PrintConfig.cpp:1438 src/libslic3r/PrintConfig.cpp:1525 -#: src/libslic3r/PrintConfig.cpp:1572 src/libslic3r/PrintConfig.cpp:2530 -#: src/libslic3r/PrintConfig.cpp:2540 src/libslic3r/PrintConfig.cpp:3078 -#: src/libslic3r/PrintConfig.cpp:3113 src/libslic3r/PrintConfig.cpp:3124 -#: src/libslic3r/PrintConfig.cpp:3139 src/libslic3r/PrintConfig.cpp:3152 -#: src/libslic3r/PrintConfig.cpp:3161 src/libslic3r/PrintConfig.cpp:3173 -#: src/libslic3r/PrintConfig.cpp:3370 -msgid "Advanced" -msgstr "Gelişmiş" - -#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4663 src/slic3r/GUI/Tab.cpp:4664 -#: src/libslic3r/PrintConfig.cpp:3564 src/libslic3r/PrintConfig.cpp:3571 -#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3589 -#: src/libslic3r/PrintConfig.cpp:3599 src/libslic3r/PrintConfig.cpp:3609 -#: src/libslic3r/PrintConfig.cpp:3646 src/libslic3r/PrintConfig.cpp:3653 -#: src/libslic3r/PrintConfig.cpp:3664 src/libslic3r/PrintConfig.cpp:3674 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3696 -#: src/libslic3r/PrintConfig.cpp:3706 src/libslic3r/PrintConfig.cpp:3715 -#: src/libslic3r/PrintConfig.cpp:3725 src/libslic3r/PrintConfig.cpp:3736 -#: src/libslic3r/PrintConfig.cpp:3744 +#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Tab.cpp:4946 src/slic3r/GUI/Tab.cpp:4948 +#: src/libslic3r/PrintConfig.cpp:3328 src/libslic3r/PrintConfig.cpp:3337 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3356 +#: src/libslic3r/PrintConfig.cpp:3366 src/libslic3r/PrintConfig.cpp:3387 +#: src/libslic3r/PrintConfig.cpp:3410 src/libslic3r/PrintConfig.cpp:3417 +#: src/libslic3r/PrintConfig.cpp:3432 src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3464 +#: src/libslic3r/PrintConfig.cpp:3474 src/libslic3r/PrintConfig.cpp:3488 +#: src/libslic3r/PrintConfig.cpp:3498 src/libslic3r/PrintConfig.cpp:3841 +#: src/libslic3r/PrintConfig.cpp:3861 src/libslic3r/PrintConfig.cpp:3868 +#: src/libslic3r/PrintConfig.cpp:3876 msgid "Supports" msgstr "Destekler" -#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4704 src/slic3r/GUI/Tab.cpp:4705 -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3752 -#: src/libslic3r/PrintConfig.cpp:3759 src/libslic3r/PrintConfig.cpp:3773 -#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3794 -#: src/libslic3r/PrintConfig.cpp:3816 src/libslic3r/PrintConfig.cpp:3827 -#: src/libslic3r/PrintConfig.cpp:3834 src/libslic3r/PrintConfig.cpp:3841 -#: src/libslic3r/PrintConfig.cpp:3852 src/libslic3r/PrintConfig.cpp:3861 -#: src/libslic3r/PrintConfig.cpp:3870 +#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:590 +#: src/slic3r/GUI/Tab.cpp:4960 src/slic3r/GUI/Tab.cpp:4961 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3884 +#: src/libslic3r/PrintConfig.cpp:3891 src/libslic3r/PrintConfig.cpp:3905 +#: src/libslic3r/PrintConfig.cpp:3916 src/libslic3r/PrintConfig.cpp:3926 +#: src/libslic3r/PrintConfig.cpp:3948 src/libslic3r/PrintConfig.cpp:3959 +#: src/libslic3r/PrintConfig.cpp:3966 src/libslic3r/PrintConfig.cpp:3973 +#: src/libslic3r/PrintConfig.cpp:3984 src/libslic3r/PrintConfig.cpp:3993 +#: src/libslic3r/PrintConfig.cpp:4002 msgid "Pad" msgstr "Altlık" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4722 -#: src/slic3r/GUI/Tab.cpp:4723 src/libslic3r/SLA/Hollowing.cpp:73 -#: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3880 -#: src/libslic3r/PrintConfig.cpp:3887 src/libslic3r/PrintConfig.cpp:3897 -#: src/libslic3r/PrintConfig.cpp:3906 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4978 +#: src/slic3r/GUI/Tab.cpp:4979 src/libslic3r/SLA/Hollowing.cpp:86 +#: src/libslic3r/SLA/Hollowing.cpp:91 src/libslic3r/SLA/Hollowing.cpp:106 +#: src/libslic3r/SLA/Hollowing.cpp:115 src/libslic3r/PrintConfig.cpp:4012 +#: src/libslic3r/PrintConfig.cpp:4019 src/libslic3r/PrintConfig.cpp:4029 +#: src/libslic3r/PrintConfig.cpp:4038 msgid "Hollowing" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:160 +#: src/slic3r/GUI/GUI_Factories.cpp:159 msgid "Add part" msgstr "Bölüm ekle" -#: src/slic3r/GUI/GUI_Factories.cpp:161 +#: src/slic3r/GUI/GUI_Factories.cpp:160 msgid "Add negative volume" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:162 +#: src/slic3r/GUI/GUI_Factories.cpp:161 msgid "Add modifier" msgstr "Niteleyici ekle" -#: src/slic3r/GUI/GUI_Factories.cpp:163 +#: src/slic3r/GUI/GUI_Factories.cpp:162 msgid "Add support blocker" msgstr "Destek engelleyici ekle" -#: src/slic3r/GUI/GUI_Factories.cpp:164 +#: src/slic3r/GUI/GUI_Factories.cpp:163 msgid "Add support enforcer" msgstr "Destek uygulayıcısı ekle" -#: src/slic3r/GUI/GUI_Factories.cpp:300 +#: src/slic3r/GUI/GUI_Factories.cpp:169 +msgid "Add text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:170 +msgid "Add negative text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:171 +msgid "Add text modifier" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:307 msgid "Select showing settings" msgstr "Gösterme ayarlarını seç" -#: src/slic3r/GUI/GUI_Factories.cpp:407 src/slic3r/GUI/GUI_Factories.cpp:412 -#: src/slic3r/GUI/GUI_Factories.cpp:556 src/slic3r/GUI/GUI_Factories.cpp:562 +#: src/slic3r/GUI/GUI_Factories.cpp:414 src/slic3r/GUI/GUI_Factories.cpp:419 +#: src/slic3r/GUI/GUI_Factories.cpp:625 src/slic3r/GUI/GUI_Factories.cpp:631 #, c-format, boost-format msgid "Quick Add Settings (%s)" msgstr "Hızlı Ekleme Ayarları ( %s )" -#: src/slic3r/GUI/GUI_Factories.cpp:444 +#: src/slic3r/GUI/GUI_Factories.cpp:460 msgid "Remove the selected object" msgstr "Seçilen nesneyi kaldır" -#: src/slic3r/GUI/GUI_Factories.cpp:456 +#: src/slic3r/GUI/GUI_Factories.cpp:475 msgid "Load" msgstr "Yükle" -#: src/slic3r/GUI/GUI_Factories.cpp:461 src/slic3r/GUI/GUI_Factories.cpp:501 -#: src/slic3r/GUI/GUI_Factories.cpp:505 +#: src/slic3r/GUI/GUI_Factories.cpp:481 src/slic3r/GUI/GUI_Factories.cpp:566 +#: src/slic3r/GUI/GUI_Factories.cpp:570 msgid "Box" msgstr "Kutu" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Cylinder" msgstr "Silindir" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Slab" msgstr "Levha" -#: src/slic3r/GUI/GUI_Factories.cpp:471 +#: src/slic3r/GUI/GUI_Factories.cpp:493 msgid "Gallery" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:488 src/slic3r/GUI/GUI_Factories.cpp:526 +#: src/slic3r/GUI/GUI_Factories.cpp:529 src/slic3r/GUI/GUI_Factories.cpp:549 +#: src/slic3r/GUI/GUI_ObjectList.cpp:660 +msgid "Text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:555 src/slic3r/GUI/GUI_Factories.cpp:558 +#: src/slic3r/GUI/GUI_Factories.cpp:595 msgid "Height range Modifier" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:535 +#: src/slic3r/GUI/GUI_Factories.cpp:604 msgid "Add settings" msgstr "Ekleme ayarları" -#: src/slic3r/GUI/GUI_Factories.cpp:626 +#: src/slic3r/GUI/GUI_Factories.cpp:695 msgid "Change type" msgstr "Türünü değiştir" -#: src/slic3r/GUI/GUI_Factories.cpp:636 src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:705 src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Object" msgstr "Ayrılmış Nesne Olarak Ayarla" -#: src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Objects" msgstr "Ayrılmış Nesneler Olarak Ayarla" -#: src/slic3r/GUI/GUI_Factories.cpp:658 +#: src/slic3r/GUI/GUI_Factories.cpp:727 msgid "Printable" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:686 +#: src/slic3r/GUI/GUI_Factories.cpp:755 src/slic3r/GUI/GUI_ObjectList.cpp:2070 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2582 +msgid "Invalidate cut info" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:770 msgid "Rename" msgstr "Adını değiştirmek" -#: src/slic3r/GUI/GUI_Factories.cpp:696 +#: src/slic3r/GUI/GUI_Factories.cpp:780 msgid "Fix through the Netfabb" msgstr "Netfabb ile düzelt" -#: src/slic3r/GUI/GUI_Factories.cpp:715 -msgid "Export as STL" -msgstr "STL Olarak Dışa Aktar" +#: src/slic3r/GUI/GUI_Factories.cpp:799 +msgid "Export as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:726 +#: src/slic3r/GUI/GUI_Factories.cpp:810 msgid "Reload the selected volumes from disk" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:733 src/slic3r/GUI/Plater.cpp:3568 +#: src/slic3r/GUI/GUI_Factories.cpp:817 src/slic3r/GUI/Plater.cpp:3602 msgid "Replace with STL" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:733 +#: src/slic3r/GUI/GUI_Factories.cpp:817 msgid "Replace the selected volume with new STL" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Set extruder for selected items" msgstr "Seçilen ürünler için ekstrüder seti" -#: src/slic3r/GUI/GUI_Factories.cpp:778 src/slic3r/Utils/Repetier.cpp:126 -#: src/slic3r/Utils/Repetier.cpp:209 src/libslic3r/PrintConfig.cpp:635 -#: src/libslic3r/PrintConfig.cpp:2770 +#: src/slic3r/GUI/GUI_Factories.cpp:862 src/slic3r/Utils/Repetier.cpp:145 +#: src/slic3r/Utils/Repetier.cpp:226 src/libslic3r/PrintConfig.cpp:738 +#: src/libslic3r/PrintConfig.cpp:2790 src/libslic3r/PrintConfig.cpp:3851 msgid "Default" msgstr "Varsayılan" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale to print volume" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale the selected object to fit the print volume" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:835 src/slic3r/GUI/Plater.cpp:5655 +#: src/slic3r/GUI/GUI_Factories.cpp:921 src/slic3r/GUI/Plater.cpp:6213 msgid "Convert from imperial units" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:836 src/slic3r/GUI/Plater.cpp:5656 +#: src/slic3r/GUI/GUI_Factories.cpp:922 src/slic3r/GUI/Plater.cpp:6214 msgid "Revert conversion from imperial units" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:837 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:923 src/slic3r/GUI/Plater.cpp:6215 msgid "Convert from meters" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:838 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:924 src/slic3r/GUI/Plater.cpp:6215 msgid "Revert conversion from meters" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2135 -#: src/libslic3r/PrintConfig.cpp:4523 +#: src/slic3r/GUI/GUI_Factories.cpp:945 src/slic3r/GUI/GUI_ObjectList.cpp:2290 +#: src/libslic3r/PrintConfig.cpp:4689 msgid "Merge" msgstr "Birleştir" -#: src/slic3r/GUI/GUI_Factories.cpp:859 +#: src/slic3r/GUI/GUI_Factories.cpp:945 msgid "Merge objects to the one multipart object" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Along X axis" msgstr "X ekseni boyunca" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Mirror the selected object along the X axis" msgstr "Seçilen nesneyi X ekseni boyunca yansıt" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Along Y axis" msgstr "Y ekseni boyunca" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Mirror the selected object along the Y axis" msgstr "Seçilen nesneyi Y ekseni boyunca aynala" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Along Z axis" msgstr "Z ekseni boyunca" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Mirror the selected object along the Z axis" msgstr "Seçilen nesneyi Z ekseni boyunca aynalayın" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror" msgstr "Ayna" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror the selected object" msgstr "Seçilen nesneyi yansıtma" -#: src/slic3r/GUI/GUI_Factories.cpp:901 src/slic3r/GUI/GUI_ObjectList.cpp:1696 +#: src/slic3r/GUI/GUI_Factories.cpp:977 +msgid "Edit text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:999 +msgid "Ability to change text, font, size, ..." +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1021 src/slic3r/GUI/GUI_ObjectList.cpp:1793 msgid "Add Shape" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:937 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "To objects" msgstr "Nesnelere" -#: src/slic3r/GUI/GUI_Factories.cpp:937 src/slic3r/GUI/GUI_Factories.cpp:954 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "Split the selected object into individual objects" msgstr "Seçilen nesneyi ayrı nesnelere bölme" -#: src/slic3r/GUI/GUI_Factories.cpp:940 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 msgid "To parts" msgstr "Parçalara" -#: src/slic3r/GUI/GUI_Factories.cpp:940 src/slic3r/GUI/GUI_Factories.cpp:975 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 src/slic3r/GUI/GUI_Factories.cpp:1097 msgid "Split the selected object into individual parts" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4552 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 src/slic3r/GUI/GUI_Factories.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:4718 msgid "Split" msgstr "Bölünmüş" -#: src/slic3r/GUI/GUI_Factories.cpp:944 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 msgid "Split the selected object" msgstr "Seçili nesneyi böl" -#: src/slic3r/GUI/GUI_Factories.cpp:1084 -msgid "Add one more instance of the selected object" +#: src/slic3r/GUI/GUI_Factories.cpp:1225 src/slic3r/GUI/GUI_Factories.cpp:1243 +msgid "Set number of instances" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:1087 -msgid "Remove one instance of the selected object" +#: src/slic3r/GUI/GUI_Factories.cpp:1225 +msgid "Change the number of instances of the selected objects" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:1090 -msgid "Set number of instances" +#: src/slic3r/GUI/GUI_Factories.cpp:1237 +msgid "Add one more instance of the selected object" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1240 +msgid "Remove one instance of the selected object" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:1090 +#: src/slic3r/GUI/GUI_Factories.cpp:1243 msgid "Change the number of instances of the selected object" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill bed with instances" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill the remaining area of bed with instances of the selected object" msgstr "" @@ -4003,304 +5268,352 @@ msgstr "" msgid "Add layer range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:297 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:323 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 msgid "Name" msgstr "İsim" -#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:480 +#: src/slic3r/GUI/GUI_ObjectList.cpp:342 src/slic3r/GUI/GUI_ObjectList.cpp:513 msgid "Editing" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:400 +#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +msgid "Wrong volume index " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:433 msgid "No errors detected" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:409 +#: src/slic3r/GUI/GUI_ObjectList.cpp:442 #, c-format, boost-format msgid "Auto-repaired %1$d error" msgid_plural "Auto-repaired %1$d errors" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:415 +#: src/slic3r/GUI/GUI_ObjectList.cpp:448 #, c-format, boost-format msgid "%1$d degenerate facet" msgid_plural "%1$d degenerate facets" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:450 #, c-format, boost-format msgid "%1$d edge fixed" msgid_plural "%1$d edges fixed" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:452 #, c-format, boost-format msgid "%1$d facet removed" msgid_plural "%1$d facets removed" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:421 +#: src/slic3r/GUI/GUI_ObjectList.cpp:454 #, c-format, boost-format msgid "%1$d facet reversed" msgid_plural "%1$d facets reversed" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +#: src/slic3r/GUI/GUI_ObjectList.cpp:456 #, c-format, boost-format msgid "%1$d backward edge" msgid_plural "%1$d backward edges" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:426 src/slic3r/GUI/GUI_ObjectList.cpp:429 +#: src/slic3r/GUI/GUI_ObjectList.cpp:459 src/slic3r/GUI/GUI_ObjectList.cpp:462 #, c-format, boost-format msgid "%1$d open edge" msgid_plural "%1$d open edges" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:428 +#: src/slic3r/GUI/GUI_ObjectList.cpp:461 msgid "Remaining errors" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:436 +#: src/slic3r/GUI/GUI_ObjectList.cpp:469 msgid "Right button click the icon to fix STL through Netfabb" msgstr "STL'yi Netfabb ile düzeltmek için simgeye sağ tıklayın" -#: src/slic3r/GUI/GUI_ObjectList.cpp:482 +#: src/slic3r/GUI/GUI_ObjectList.cpp:515 msgid "Right button click the icon to change the object settings" msgstr "Nesne ayarlarını değiştirmek için simgeye sağ tıklayın" -#: src/slic3r/GUI/GUI_ObjectList.cpp:484 +#: src/slic3r/GUI/GUI_ObjectList.cpp:517 msgid "Click the icon to change the object settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:488 +#: src/slic3r/GUI/GUI_ObjectList.cpp:521 msgid "Right button click the icon to change the object printable property" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:523 msgid "Click the icon to change the object printable property" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:616 +#: src/slic3r/GUI/GUI_ObjectList.cpp:649 msgid "Change Extruder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1242 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4006 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1307 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4589 msgid "Instances to Separated Objects" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Volumes in Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1298 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1363 msgid "Add Settings for Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1299 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1364 msgid "Add Settings for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1300 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1365 msgid "Add Settings for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1339 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1404 msgid "Add Settings Bundle for Height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1340 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1405 msgid "Add Settings Bundle for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1341 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1406 msgid "Add Settings Bundle for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1509 src/slic3r/GUI/Plater.cpp:2380 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1582 src/slic3r/GUI/Plater.cpp:2453 msgid "Loading" msgstr "Yükleniyor" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1540 src/slic3r/GUI/Plater.cpp:2417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1617 src/slic3r/GUI/Plater.cpp:2494 msgid "Loading file" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1548 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1625 msgid "Error!" msgstr "Hata!" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1638 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1721 msgid "Add Generic Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1663 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1761 msgid "Generic" msgstr "Genel" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shape from Gallery" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shapes from Gallery" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1830 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1945 msgid "Remove paint-on supports" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1837 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 msgid "Remove paint-on seam" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1844 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 msgid "Remove Multi Material painting" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1850 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1972 msgid "Shift objects to bed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1856 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1978 msgid "Remove variable layer height" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1877 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1999 msgid "Delete Settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1901 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2023 msgid "Delete All Instances from Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1917 -msgid "Delete Height Range" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2039 +msgid "Delete Height Range" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2057 +msgid "Delete connector from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2058 +msgid "Delete solid part from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2059 +msgid "Delete negative volume from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2061 +msgid "" +"To save cut information you can delete all connectors from all related " +"objects." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2064 +msgid "" +"This action will break a cut information.\n" +"After that PrusaSlicer can't guarantee model consistency.\n" +"\n" +"To manipulate with solid parts or negative volumes you have to invalidate " +"cut infornation first." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2072 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2612 +msgid "Delete all connectors" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1949 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2103 msgid "From Object List You can't delete the last solid part from object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1953 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2112 msgid "Delete Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1976 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2138 msgid "Last instance of an object cannot be deleted." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1980 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +msgid "Instance cannot be deleted from cut object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2146 msgid "Delete Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2004 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2170 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "Seçilen nesne bölünemedi çünkü yalnızca bir parça içeriyordu." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2008 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2174 msgid "Split to Parts" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2177 src/slic3r/GUI/Plater.cpp:3133 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"splitting the object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2297 msgid "Merged" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2237 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2392 msgid "Merge all parts to the one single object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2269 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2424 msgid "Add Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2438 -msgid "Group manipulation" -msgstr "Grup manipülasyonu" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2695 +msgid "Cut Connectors information" +msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2453 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2705 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2768 msgid "Object manipulation" msgstr "Nesne yönetimi" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2486 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2714 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1472 +msgid "Group manipulation" +msgstr "Grup manipülasyonu" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2802 msgid "Object Settings to modify" msgstr "Değiştirilecek Nesne Ayarları" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2806 msgid "Part Settings to modify" msgstr "Değiştirilecek Parça Ayarları" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2495 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2811 msgid "Layer range Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2501 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2817 msgid "Part manipulation" msgstr "Bölüm manipülasyon" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2825 msgid "Instance manipulation" msgstr "Kopya yönetimi" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Height ranges" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Settings for height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2750 -msgid "Delete Selected Item" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2943 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3363 msgid "Delete Selected" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3019 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3047 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3067 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3441 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3469 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3489 msgid "Add Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3113 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3535 msgid "" "Cannot insert a new layer range after the current layer range.\n" "The next layer range is too thin to be split to two\n" "without violating the minimum layer height." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3117 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3539 msgid "" "Cannot insert a new layer range between the current and the next layer " "range.\n" @@ -4308,240 +5621,289 @@ msgid "" "is thinner than the minimum layer height allowed." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3122 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3544 msgid "" "Cannot insert a new layer range after the current layer range.\n" "Current layer range overlaps with the next layer range." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3603 msgid "Edit Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3500 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3989 msgid "Selection-Remove from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4001 msgid "Selection-Add from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3649 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4138 msgid "Object or Instance" msgstr "Nesne veya Örnek" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Part" -msgstr "Bölüm" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 msgid "Layer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3652 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4141 msgid "Unsupported selection" msgstr "Desteklenmeyen seçim" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3653 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 #, c-format, boost-format msgid "You started your selection with %s Item." msgstr "Seçiminize %s öğe ile başladınız." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3654 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4143 #, c-format, boost-format msgid "In this mode you can select only other %s Items%s" msgstr "Bu modda sadece diğer %s maddeleri seçebilirsiniz. %s" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3657 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4146 msgid "of a current Object" msgstr "geçerli bir Nesnenin" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3662 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3737 src/slic3r/GUI/Plater.cpp:181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4151 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4226 src/slic3r/GUI/Plater.cpp:197 msgid "Info" msgstr "Bilgi" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3784 -msgid "You can't change a type of the last solid part of the object." -msgstr "Nesnenin son katı kısmının türünü değiştiremezsiniz." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 msgid "Negative Volume" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Modifier" -msgstr "Niteleyici" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Blocker" msgstr "Destek Engelleyici" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Enforcer" msgstr "Destek Uygulayıcı" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Select type of part" msgstr "Parça türünü seçin" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3795 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4359 msgid "Change Part Type" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Enter new name" msgstr "Yeni isim girin" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Renaming" msgstr "Yeniden adlandırma" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4091 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4681 msgid "Repairing model" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4120 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4691 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"repairing the mesh." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4711 msgid "Fix through NetFabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4123 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4714 msgid "Fixing through NetFabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4153 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4744 msgid "The following model was repaired successfully" msgid_plural "The following models were repaired successfully" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4159 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4750 msgid "Folowing model repair failed" msgid_plural "Folowing models repair failed" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4164 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4755 msgid "Repairing was canceled" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4276 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4869 msgid "Change Extruders" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Printable group" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Unprintable group" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Printable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Unprintable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Printable Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Unprintable Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:55 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:84 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:61 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:96 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1132 msgid "World coordinates" msgstr "Dünya koordinatları" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:56 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:85 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:97 msgid "Local coordinates" msgstr "Yerel koordinatlar" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:60 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:67 msgid "Select coordinate space, in which the transformation will be performed." msgstr "Dönüşümün gerçekleştirileceği koordinat alanını seçin." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:141 src/libslic3r/GCode.cpp:540 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:157 src/libslic3r/GCode.cpp:491 msgid "Object name" msgstr "Nesne adı" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:201 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:521 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:221 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:710 msgid "Position" msgstr "Pozisyon" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:202 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:522 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:222 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:711 #: src/slic3r/GUI/Mouse3DController.cpp:478 #: src/slic3r/GUI/Mouse3DController.cpp:499 msgid "Rotation" msgstr "Rotasyon" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:250 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:239 +msgid "Size [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "Mirror along" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +#, c-format, boost-format +msgid " %c " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "axis" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:279 #, c-format, boost-format msgid "Toggle %c axis mirroring" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:284 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:329 msgid "Set Mirror" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:324 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:336 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:348 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:374 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:387 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:393 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:401 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:428 msgid "Drop to bed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:445 msgid "Reset rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 msgid "Reset Rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:398 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:400 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:490 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:519 msgid "Reset scale" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:539 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546 +msgid "Reset skew" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:553 msgid "Inches" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:523 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:712 msgid "Scale factors" msgstr "Ölçek" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:577 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:740 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:752 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:793 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:801 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +msgid "Rotate (relative)" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:751 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:800 +msgid "Translate (relative) [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:829 msgid "Translate" msgstr "Çeviri" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:640 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:905 msgid "" "You cannot use non-uniform scaling mode for multiple objects/parts selection" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:820 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +msgid "Left handed" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1133 +msgid "Object coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1134 +msgid "Part coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1176 msgid "Set Position" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:852 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1220 msgid "Set Orientation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:931 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1351 msgid "Set Scale" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1368 +msgid "Set Size" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1427 msgid "" "The currently manipulated object is tilted (rotation angles are not " "multiples of 90°).\n" @@ -4555,7 +5917,7 @@ msgstr "" "koordinat sisteminde mümkündür, çünkü rotasyon nesne koordinatlarına gömülü " "değildir." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:983 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1430 msgid "" "This operation is irreversible.\n" "Do you want to proceed?" @@ -4581,168 +5943,67 @@ msgstr "" msgid "Change Option %s" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:211 -msgid "View" -msgstr "Görünüm" - -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/libslic3r/PrintConfig.cpp:808 -msgid "Height" -msgstr "Yükseklik" - -#: src/slic3r/GUI/GUI_Preview.cpp:219 src/libslic3r/PrintConfig.cpp:3032 -msgid "Width" -msgstr "Genişlik" - -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2016 -msgid "Fan speed" -msgstr "Fan hızı" - -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1991 -msgid "Temperature" -msgstr "Sıcaklık" - -#: src/slic3r/GUI/GUI_Preview.cpp:223 -msgid "Volumetric flow rate" -msgstr "Hacimsel akış hızı" - -#: src/slic3r/GUI/GUI_Preview.cpp:228 -msgid "Show" -msgstr "Göster" - -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/GUI_Preview.cpp:254 -msgid "Feature types" -msgstr "Özellik türleri" - -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:330 -#: src/libslic3r/ExtrusionEntity.cpp:352 -msgid "Perimeter" -msgstr "Duvar" - -#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:331 -#: src/libslic3r/ExtrusionEntity.cpp:354 -msgid "External perimeter" -msgstr "Dış duvar" - -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:332 -#: src/libslic3r/ExtrusionEntity.cpp:356 -msgid "Overhang perimeter" -msgstr "Çıkıntı duvar" - -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:333 -#: src/libslic3r/ExtrusionEntity.cpp:358 -msgid "Internal infill" -msgstr "İç dolgu" - -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:334 -#: src/libslic3r/ExtrusionEntity.cpp:360 src/libslic3r/PrintConfig.cpp:1407 -#: src/libslic3r/PrintConfig.cpp:2392 src/libslic3r/PrintConfig.cpp:2404 -msgid "Solid infill" -msgstr "Katı dolgu" - -#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:335 -#: src/libslic3r/ExtrusionEntity.cpp:362 src/libslic3r/PrintConfig.cpp:1416 -#: src/libslic3r/PrintConfig.cpp:2889 src/libslic3r/PrintConfig.cpp:2902 -msgid "Top solid infill" -msgstr "Üst katı dolgu" - -#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:337 -#: src/libslic3r/ExtrusionEntity.cpp:366 -msgid "Bridge infill" -msgstr "Köprü dolgusu" - -#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:338 -#: src/libslic3r/ExtrusionEntity.cpp:368 src/libslic3r/PrintConfig.cpp:1325 -msgid "Gap fill" -msgstr "Boşluk doldurma" - -#: src/slic3r/GUI/GUI_Preview.cpp:248 src/libslic3r/ExtrusionEntity.cpp:339 -#: src/libslic3r/ExtrusionEntity.cpp:370 -msgid "Skirt/Brim" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:250 src/libslic3r/ExtrusionEntity.cpp:341 -#: src/libslic3r/ExtrusionEntity.cpp:374 src/libslic3r/PrintConfig.cpp:2736 -msgid "Support material interface" -msgstr "Destek ara bağlantısı" - -#: src/slic3r/GUI/GUI_Preview.cpp:251 src/slic3r/GUI/Tab.cpp:1634 -#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/ExtrusionEntity.cpp:376 -msgid "Wipe tower" -msgstr "Temizleme kulesi" - -#: src/slic3r/GUI/GUI_Preview.cpp:728 +#: src/slic3r/GUI/GUI_Preview.cpp:581 msgid "NOTE:" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:729 +#: src/slic3r/GUI/GUI_Preview.cpp:582 #, boost-format msgid "Sliced object \"%1%\" looks like a logo or a sign" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:730 +#: src/slic3r/GUI/GUI_Preview.cpp:583 msgid "Apply color change automatically" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:1058 -msgid "Shells" -msgstr "Duvarlar" - -#: src/slic3r/GUI/GUI_Preview.cpp:1059 -msgid "Tool marker" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:1060 -msgid "Legend/Estimated printing time" -msgstr "" - -#: src/slic3r/GUI/HintNotification.cpp:771 -#: src/slic3r/GUI/HintNotification.cpp:797 -#: src/slic3r/GUI/NotificationManager.cpp:374 -#: src/slic3r/GUI/NotificationManager.cpp:391 +#: src/slic3r/GUI/HintNotification.cpp:773 +#: src/slic3r/GUI/HintNotification.cpp:799 +#: src/slic3r/GUI/NotificationManager.cpp:457 +#: src/slic3r/GUI/NotificationManager.cpp:474 msgid "More" msgstr "" -#: src/slic3r/GUI/HintNotification.cpp:912 +#: src/slic3r/GUI/HintNotification.cpp:914 msgid "Open Preferences." msgstr "" -#: src/slic3r/GUI/HintNotification.cpp:1004 +#: src/slic3r/GUI/HintNotification.cpp:1006 msgid "Open Documentation in web browser." msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:527 +#: src/slic3r/GUI/ImGuiWrapper.cpp:666 msgid "Edit" msgstr "Düzenle" -#: src/slic3r/GUI/ImGuiWrapper.cpp:960 src/slic3r/GUI/Search.cpp:470 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1166 src/slic3r/GUI/Search.cpp:531 msgid "Use for search" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:961 src/slic3r/GUI/Search.cpp:463 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1167 src/slic3r/GUI/Search.cpp:524 msgid "Category" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:963 src/slic3r/GUI/Search.cpp:465 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1169 src/slic3r/GUI/Search.cpp:526 msgid "Search in English" msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:174 -msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "Model nesneleri düzenlenemedi! Bazı geometriler geçersiz olabilir." - -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:183 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:168 msgid "Arranging" msgstr "Düzenleme" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:207 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:204 msgid "Arranging canceled." msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:208 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:205 msgid "Arranging done." msgstr "Düzenleme yapıldı." -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:253 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:225 +msgid "Could not arrange model objects! Some geometries may be invalid." +msgstr "Model nesneleri düzenlenemedi! Bazı geometriler geçersiz olabilir." + +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:265 #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -4750,1384 +6011,1445 @@ msgid "" "%s" msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:119 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:108 msgid "Filling bed" msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:130 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:140 msgid "Bed filling canceled." msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:131 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:141 msgid "Bed filling done." msgstr "" -#: src/slic3r/GUI/Jobs/Job.cpp:111 -msgid "ERROR: not enough resources to execute a new job." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:148 src/slic3r/GUI/Jobs/EmbossJob.cpp:596 +msgid "Can't create empty volume." msgstr "" -#: src/slic3r/GUI/Jobs/PlaterJob.cpp:13 -msgid "An unexpected error occured" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:201 +msgid "Can't create empty object." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:21 -msgid "Best surface quality" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:208 +msgid "Add Emboss text object" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:23 -msgid "Optimize object rotation for best surface quality." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:247 +msgid "Created text volume is empty. Change text or font." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 -msgid "Reduced overhang slopes" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:465 +msgid "" +"It is used default volume for embossed text, try to change text or font to " +"fix it." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:26 -msgid "" -"Optimize object rotation to have minimum amount of overhangs needing support " -"structures.\n" -"Note that this method will try to find the best surface of the object for " -"touching the print bed if no elevation is set." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:549 +#, boost-format +msgid "Text: %1%" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:30 -msgid "Lowest Z height" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:593 +msgid "Bad object to create volume." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:32 -msgid "Rotate the model to have the lowest z height for faster print time." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:598 +msgid "Add Emboss text Volume" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:59 -msgid "Searching for optimal orientation" -msgstr "Optimum yönlendirme aranıyor" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:698 +msgid "Font doesn't have any shape for given text." +msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:77 -msgid "Orientation search canceled." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:738 +msgid "There is no volume in projection direction." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:78 -msgid "Orientation found." -msgstr "Oryantasyon bulundu." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:787 +msgid "There is no valid surface for text projection." +msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:36 -msgid "Choose SLA archive:" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:823 +msgid "Issue during embossing the text." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:40 -msgid "Import file" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:22 +msgid "Best surface quality" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47 -msgid "Import model and profile" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 +msgid "Optimize object rotation for best surface quality." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48 -msgid "Import profile only" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:25 +msgid "Reduced overhang slopes" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:49 -msgid "Import model only" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:27 +msgid "" +"Optimize object rotation to have minimum amount of overhangs needing support " +"structures.\n" +"Note that this method will try to find the best surface of the object for " +"touching the print bed if no elevation is set." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60 -msgid "Accurate" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:31 +msgid "Lowest Z height" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61 -msgid "Balanced" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:33 +msgid "Rotate the model to have the lowest z height for faster print time." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:62 -msgid "Quick" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:53 +msgid "Searching for optimal orientation" +msgstr "Optimum yönlendirme aranıyor" + +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:83 +msgid "Orientation search canceled." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:140 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:84 +msgid "Orientation found." +msgstr "Oryantasyon bulundu." + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:49 msgid "Importing SLA archive" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:158 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:77 msgid "" "The SLA archive doesn't contain any presets. Please activate some SLA " "printer preset first before importing that SLA archive." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:164 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:81 +msgid "Import is unavailable for this archive format." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:86 msgid "Importing canceled." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:165 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:87 msgid "Importing done." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:187 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:108 msgid "The file does not exist." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:221 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135 msgid "" "The imported SLA archive did not contain any presets. The current SLA " "presets were used as fallback." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:234 src/slic3r/GUI/Plater.cpp:2458 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:148 src/slic3r/GUI/Plater.cpp:2535 msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:236 src/slic3r/GUI/Plater.cpp:2460 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:150 src/slic3r/GUI/Plater.cpp:2537 msgid "Attention!" msgstr "Dikkat!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:166 +msgid "The profile in the imported archive is corrupt and will not be loaded." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:178 +msgid "" +"No object could be retrieved from the archive. The slices might be corrupted " +"or missing." +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1184 msgid "Keyboard Shortcuts" msgstr "Klavye kısayolları" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:77 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:86 msgid "New project, clear plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:78 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 msgid "Open project AMF/3MF with config, clear plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 msgid "Save project (3mf)" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 msgid "Save project as (3mf)" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:81 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 msgid "(Re)slice" msgstr "(Tekrar) dilimle" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:83 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:92 msgid "Import STL/3MF/STEP/OBJ/AMF without config, keep plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:84 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 msgid "Import Config from ini/amf/3mf/gcode" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:85 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6543 src/libslic3r/PrintConfig.cpp:4423 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:96 src/slic3r/GUI/Plater.cpp:948 +#: src/slic3r/GUI/Plater.cpp:7161 src/libslic3r/PrintConfig.cpp:4575 msgid "Export G-code" msgstr "G-code Dışa Aktar" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:97 src/slic3r/GUI/Plater.cpp:7162 msgid "Send G-code" msgstr "G kodunu gönder" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 msgid "Export config" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 src/slic3r/GUI/Plater.cpp:896 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 src/slic3r/GUI/Plater.cpp:931 msgid "Export to SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:91 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 msgid "Eject SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 msgid "Select all objects" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 msgid "Deselect all" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:95 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 msgid "Delete selected" msgstr "Seçileni sil" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 -msgid "Copy to clipboard" -msgstr "Panoya kopyala" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 msgid "Paste from clipboard" msgstr "Panodan yapıştır" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Reload plater from disk" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 msgid "Select Plater Tab" msgstr "Tabla Sekmesini Seç" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 msgid "Select Print Settings Tab" msgstr "Yazdırma Ayarları Sekmesi" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 msgid "Select Filament Settings Tab" msgstr "Filament Ayarları Sekmesi" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 msgid "Select Printer Settings Tab" msgstr "Yazıcı Ayarları Sekmesi" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 msgid "Switch to 3D" msgstr "3B görünüme geç" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 msgid "Switch to Preview" msgstr "Ön izleme" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 -#: src/slic3r/GUI/PrintHostDialogs.cpp:217 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +#: src/slic3r/GUI/PrintHostDialogs.cpp:267 msgid "Print host upload queue" msgstr "Ana bilgisayar yükleme kuyruğunu yazdır" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/MainFrame.cpp:75 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 src/slic3r/GUI/MainFrame.cpp:77 msgid "Open new instance" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 msgid "Camera view" msgstr "Kamera görünümü" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 msgid "Show/Hide object/instance labels" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Preferences.cpp:46 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Preferences.cpp:57 +#: src/slic3r/GUI/Preferences.cpp:165 src/slic3r/GUI/Preferences.cpp:188 +#: src/slic3r/GUI/Preferences.cpp:207 src/slic3r/GUI/Preferences.cpp:215 msgid "Preferences" msgstr "Tercihler" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 msgid "Show keyboard shortcuts list" msgstr "Klavye kısayolları listesini göster" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 msgid "Commands" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 msgid "Add Instance of the selected object" msgstr "Seçilen nesnenin örneğini ekle" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Remove Instance of the selected object" msgstr "Seçilen nesnenin örneğini kaldır" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 msgid "" "Press to select multiple objects\n" "or move multiple objects with mouse" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 msgid "Press to activate selection rectangle" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 msgid "Press to activate deselection rectangle" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Arrow Up" msgstr "Yukarı ok" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 msgid "Move selection 10 mm in positive Y direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Arrow Down" msgstr "Aşağı ok" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 msgid "Move selection 10 mm in negative Y direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Arrow Left" msgstr "Sol ok" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 msgid "Move selection 10 mm in negative X direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Arrow Right" msgstr "Sağ Ok" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 msgid "Move selection 10 mm in positive X direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Any arrow" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 msgid "Movement step set to 1 mm" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Movement in camera space" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Page Up" msgstr "Page Up" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Rotate selection 45 degrees CCW" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Page Down" msgstr "Page Down" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Rotate selection 45 degrees CW" msgstr "" # What is Gizmo? Didn't find suitable word in Turkish. -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 msgid "Gizmo move" msgstr "Gizmo hareketi" # What is Gizmo? Didn't find suitable word in Turkish. -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 msgid "Gizmo scale" msgstr "Gizmo ölçeği" # What is Gizmo? Didn't find suitable word in Turkish. -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Gizmo rotate" msgstr "Gizmo döndürme" # What is Gizmo? Didn't find suitable word in Turkish. -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Gizmo cut" msgstr "Gizmo kesim" # What is Gizmo? Didn't find suitable word in Turkish. -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 msgid "Gizmo Place face on bed" msgstr "Gizmo yüzeyini tablaya yerleştir" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 msgid "Gizmo SLA hollow" msgstr "" # What is Gizmo? Didn't find suitable word in Turkish. -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 msgid "Gizmo SLA support points" msgstr "Gizmo SLA destek noktaları" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 msgid "Gizmo FDM paint-on supports" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 msgid "Gizmo FDM paint-on seam" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 -msgid "Gizmo Multi Material painting" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 +msgid "Gizmo Multi Material painting" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +msgid "Gizmo Text emboss / engrave" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 msgid "Unselect gizmo or clear selection" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 msgid "Change camera type (perspective, orthographic)" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 msgid "Zoom to Bed" msgstr "Tablaya Yakınlaştır" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 msgid "" "Zoom to selected object\n" "or all objects in scene, if none selected" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 msgid "Zoom in" msgstr "Yaklaş" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Zoom out" msgstr "Uzaklaş" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Switch between Editor/Preview" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Collapse/Expand the sidebar" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 msgid "Minimize application" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 src/slic3r/GUI/MainFrame.cpp:284 -#: src/slic3r/GUI/MainFrame.cpp:333 src/slic3r/GUI/MainFrame.cpp:445 -#: src/slic3r/GUI/MainFrame.cpp:448 src/slic3r/GUI/MainFrame.cpp:470 -#: src/slic3r/GUI/MainFrame.cpp:473 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 src/slic3r/GUI/MainFrame.cpp:329 +#: src/slic3r/GUI/MainFrame.cpp:378 src/slic3r/GUI/MainFrame.cpp:490 +#: src/slic3r/GUI/MainFrame.cpp:493 src/slic3r/GUI/MainFrame.cpp:515 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Plater" msgstr "Tabla" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 msgid "Gizmo move: Press to snap by 1mm" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 msgid "Gizmo scale: Press to snap by 5%" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 msgid "Gizmo scale: Scale selection to fit print volume" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 msgid "Gizmo scale: Press to activate one direction scaling" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 msgid "Gizmo scale: Press to scale selected objects around their own center" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 msgid "Gizmo rotate: Press to rotate selected objects around their own center" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "Gizmos" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "" "The following shortcuts are applicable when the specified gizmo is active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 msgid "Set selected items as Printable/Unprintable" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:203 msgid "Set default extruder for the selected items" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 msgid "Set extruder number for the selected items" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 msgid "Objects List" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/MainFrame.cpp:1611 msgid "Open a G-code file" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 -#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 -#: src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 src/slic3r/GUI/MainFrame.cpp:1443 +#: src/slic3r/GUI/MainFrame.cpp:1447 src/slic3r/GUI/MainFrame.cpp:1616 +#: src/slic3r/GUI/MainFrame.cpp:1620 msgid "Reload the plater from disk" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 msgid "Vertical slider - Move active thumb Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:228 msgid "Vertical slider - Move active thumb Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 msgid "Horizontal slider - Move active thumb Left" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 msgid "Horizontal slider - Move active thumb Right" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:231 msgid "On/Off one layer mode of the vertical slider" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 -msgid "Show/Hide Legend and Estimated printing time" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:232 +msgid "Show/Hide legend" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 msgid "Show/Hide G-code window" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4480 -#: src/slic3r/GUI/Tab.cpp:2832 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 src/slic3r/GUI/Plater.cpp:4562 +#: src/slic3r/GUI/Tab.cpp:2736 msgid "Preview" msgstr "Ön izleme" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 msgid "Move active thumb Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 msgid "Move active thumb Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 msgid "Set upper thumb as active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 msgid "Set lower thumb as active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 msgid "Add color change marker for current layer" msgstr "Mevcut katman için renk değiştirme işaretçisini ekle" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:238 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:244 msgid "Delete color change marker for current layer" msgstr "Geçerli katman için renk değişikliği işaretçisini sil" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:250 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:251 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:245 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:256 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:257 msgid "" "Press to speed up 5 times while moving thumb\n" "with arrow keys or mouse wheel" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "Vertical Slider" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "" "The following shortcuts are applicable in G-code preview when the vertical " "slider is active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Move active thumb Left" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Move active thumb Right" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Set left thumb as active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Set right thumb as active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "Horizontal Slider" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "" "The following shortcuts are applicable in G-code preview when the horizontal " "slider is active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:278 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:284 msgid "Keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:77 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open a new PrusaSlicer instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:93 msgid "G-code preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:1388 msgid "Open G-code viewer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:91 src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open PrusaSlicer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:93 msgid "Open new G-code viewer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:225 +#: src/slic3r/GUI/MainFrame.cpp:227 msgid "Closing PrusaSlicer. Current project is modified." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "PrusaSlicer is closing" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "Closing PrusaSlicer while some presets are modified." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:285 src/slic3r/GUI/MainFrame.cpp:335 -#: src/slic3r/GUI/Tab.hpp:427 src/slic3r/GUI/Tab.hpp:550 +#: src/slic3r/GUI/MainFrame.cpp:330 src/slic3r/GUI/MainFrame.cpp:380 +#: src/slic3r/GUI/Tab.hpp:413 src/slic3r/GUI/Tab.hpp:539 msgid "Print Settings" msgstr "Baskı Ayarları" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:535 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:384 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:520 msgid "Material Settings" msgstr "Malzeme Ayarları" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:461 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:382 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:448 msgid "Filament Settings" msgstr "Filament Ayarları" -#: src/slic3r/GUI/MainFrame.cpp:287 src/slic3r/GUI/MainFrame.cpp:341 -#: src/slic3r/GUI/Tab.hpp:503 +#: src/slic3r/GUI/MainFrame.cpp:332 src/slic3r/GUI/MainFrame.cpp:386 +#: src/slic3r/GUI/Tab.hpp:488 msgid "Printer Settings" msgstr "Yazıcı ayarları" -#: src/slic3r/GUI/MainFrame.cpp:632 src/slic3r/GUI/Plater.cpp:1719 -#: src/slic3r/GUI/Plater.cpp:2850 +#: src/slic3r/GUI/MainFrame.cpp:685 src/slic3r/GUI/Plater.cpp:1728 +#: src/slic3r/GUI/Plater.cpp:2879 msgid "Untitled" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:655 +#: src/slic3r/GUI/MainFrame.cpp:710 msgid "based on Slic3r" msgstr "slic3r uygulamasına dayalı" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Prusa 3D &Drivers" msgstr "Prusa 3D ve Sürücüler" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Open the Prusa3D drivers download page in your browser" msgstr "Prusa3D sürücüleri indirme sayfasını tarayıcınızda açar" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Software &Releases" msgstr "Yazılım ve Bültenler" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open the software releases page in your browser" msgstr "Tarayıcınızda yazılım sürümleri sayfasını açar" -#: src/slic3r/GUI/MainFrame.cpp:1081 +#: src/slic3r/GUI/MainFrame.cpp:1158 #, c-format, boost-format msgid "%s &Website" msgstr "%s &Web Sitesi" -#: src/slic3r/GUI/MainFrame.cpp:1082 +#: src/slic3r/GUI/MainFrame.cpp:1159 #, c-format, boost-format msgid "Open the %s website in your browser" msgstr "Tarayıcınızda %s web sitesini açar" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "System &Info" msgstr "Sistem bilgisi" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "Show system information" msgstr "Sistem bilgisini göster" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show &Configuration Folder" msgstr "&Yapılandırma Klasörünü Göster" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show user configuration folder (datadir)" msgstr "Kullanıcı konfigürasyon klasörünü göster" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "Report an I&ssue" msgstr "Bir Görüş Bildirin" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 #, c-format, boost-format msgid "Report an issue on %s" msgstr "%s ile ilgili görüş bildirin" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 #, c-format, boost-format msgid "&About %s" msgstr "%s &Hakkında" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 msgid "Show about dialog" msgstr "Hakkında" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1177 msgid "Show Tip of the Day" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1104 +#: src/slic3r/GUI/MainFrame.cpp:1181 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/MainFrame.cpp:1184 msgid "Show the list of the keyboard shortcuts" msgstr "Klavye kısayollarının listesini göster" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso" msgstr "Perspektif" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso View" msgstr "Perspektif görünümü" #. TRN To be shown in the main menu View->Top #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2917 -#: src/libslic3r/PrintConfig.cpp:2926 +#: src/slic3r/GUI/MainFrame.cpp:1202 src/libslic3r/PrintConfig.cpp:3005 +#: src/libslic3r/PrintConfig.cpp:3014 msgid "Top" msgstr "Üst" -#: src/slic3r/GUI/MainFrame.cpp:1125 +#: src/slic3r/GUI/MainFrame.cpp:1202 msgid "Top View" msgstr "Üst Görünüm" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:446 -#: src/libslic3r/PrintConfig.cpp:455 +#: src/slic3r/GUI/MainFrame.cpp:1205 src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:474 msgid "Bottom" msgstr "Alt" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1205 msgid "Bottom View" msgstr "Alt Görünüm" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front" msgstr "Ön" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front View" msgstr "Ön görünüm" -#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2274 +#: src/slic3r/GUI/MainFrame.cpp:1209 src/libslic3r/PrintConfig.cpp:2300 msgid "Rear" msgstr "Arka" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1209 msgid "Rear View" msgstr "Arka görünüm" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left" msgstr "Sol" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left View" msgstr "Sol görünüm" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right" msgstr "Sağ" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right View" msgstr "Sağ görünüm" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "&New Project" msgstr "&Yeni Proje" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "Start a new project" msgstr "Yeni bir proje başlat" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "&Open Project" msgstr "& Proje Aç" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "Open a project file" msgstr "Bir proje dosyası açın" -#: src/slic3r/GUI/MainFrame.cpp:1157 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Recent projects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1169 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Save Project" msgstr "& Projeyi Kaydet" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "Save current project file" msgstr "Mevcut proje dosyasını kaydet" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save Project &as" msgstr "Projeyi farklı kaydet" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save current project file as" msgstr "Mevcut proje dosyasını farklı kaydet" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Import STL/3MF/STEP/OBJ/AM&F" msgstr "STL/3MF/STEP/OBJ/AM&F" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Load a model" msgstr "Bir model yükle" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Import STL (Imperial Units)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Load an model saved with imperial units" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Import SL1 / SL1S Archive" +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Import SLA Archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Load an SLA archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Import ZIP Achive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Load an SL1 / Sl1S archive" +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Load a zip achive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Import &Config" msgstr "&Ayarları İçe Aktar" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Load exported configuration file" msgstr "Dışa aktarılan yapılandırma dosyasını yükle" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Import Config from &Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Load configuration from project file" msgstr "Proje dosyasından yapılandırmayı yükle" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Import Config &Bundle" msgstr "Ha&zır Ayarları İçe Aktar" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Load presets from a bundle" msgstr "Paketten hazır ayarları yükleme" -#: src/slic3r/GUI/MainFrame.cpp:1231 +#: src/slic3r/GUI/MainFrame.cpp:1311 msgid "&Import" msgstr "&İçe Aktarma" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1314 src/slic3r/GUI/MainFrame.cpp:1676 msgid "Export &G-code" msgstr "&G-code Dışa Aktar" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1314 msgid "Export current plate as G-code" msgstr "Geçerli tablayı G-code olarak dışa aktar" -#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1318 src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1318 msgid "Send to print current plate as G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export G-code to SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export Plate as &STL" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export Plate as &STL/OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export current plate as STL" -msgstr "Geçerli tablayı STL olarak dışa aktar" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export current plate as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export Plate as STL &Including Supports" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export Plate as STL/OBJ &Including Supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export current plate as STL including supports" -msgstr "Geçerli tablayı destekler ile STL olarak dışa aktar" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export current plate as STL/OBJ including supports" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export &Toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export &Config" msgstr "Ayarları &Dışa Aktar" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export current configuration to file" msgstr "Geçerli yapılandırmayı dışa aktar" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export Config &Bundle" msgstr "&Hazır Ayarları Dışa Aktar" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export all presets to file" msgstr "Tüm hazır ayarları dışa aktar" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export Config Bundle With Physical Printers" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export all presets including physical printers to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1270 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "&Export" msgstr "&Dışa Aktar" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Ejec&t SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Quick Slice" msgstr "Hızlı Dilim" -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Slice a file into a G-code" msgstr "Bir dosyayı G koduna dilimleme" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Quick Slice and Save As" msgstr "Hızlı Dilim ve Farklı Kaydet" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Slice a file into a G-code, save as" msgstr "Bir dosyayı dilimle ve farklı kaydet" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat Last Quick Slice" msgstr "Son Hızlı Dilimi Tekrarla" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat last quick slice" msgstr "Son hızlı dilimi tekrarla" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "(Re)Slice No&w" msgstr "(Tekrar)Dilimle" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "Start new slicing process" msgstr "Yeni dilimleme işlemine başla" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "&Repair STL file" msgstr "& STL dosyasını onar" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "Automatically repair an STL file" msgstr "Bir STL dosyasını otomatik olarak onar" -#: src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:1388 msgid "&G-code Preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1392 +msgid "E&xit" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1392 src/slic3r/GUI/UpdateDialogs.cpp:376 +#: src/slic3r/GUI/UpdateDialogs.cpp:423 +#, c-format, boost-format +msgid "Exit %s" +msgstr "%s Çıkış" + +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 msgid "&Quit" msgstr "&Çıkış" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 #, c-format, boost-format msgid "Quit %s" msgstr "%s uygulamasını kapat" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1410 msgid "&Select All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1327 +#: src/slic3r/GUI/MainFrame.cpp:1411 msgid "Selects all objects" msgstr "Tüm nesneleri seçer" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1413 msgid "D&eselect All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1414 msgid "Deselects all objects" msgstr "Tüm nesnelerin seçimini kaldırır" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1417 msgid "&Delete Selected" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1334 +#: src/slic3r/GUI/MainFrame.cpp:1418 msgid "Deletes the current selection" msgstr "Mevcut seçimi siler" -#: src/slic3r/GUI/MainFrame.cpp:1336 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Delete &All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1421 msgid "Deletes all objects" msgstr "Tüm nesneleri sil" -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1425 msgid "&Undo" msgstr "&Geri Al" -#: src/slic3r/GUI/MainFrame.cpp:1344 +#: src/slic3r/GUI/MainFrame.cpp:1428 msgid "&Redo" msgstr "&Yinele" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1433 msgid "&Copy" msgstr "&Kopyala" -#: src/slic3r/GUI/MainFrame.cpp:1350 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Copy selection to clipboard" msgstr "Seçimi panoya kopyala" -#: src/slic3r/GUI/MainFrame.cpp:1352 +#: src/slic3r/GUI/MainFrame.cpp:1436 msgid "&Paste" msgstr "&Yapıştır" -#: src/slic3r/GUI/MainFrame.cpp:1353 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "Paste clipboard" msgstr "Panodan yapıştır" -#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 -#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 +#: src/slic3r/GUI/MainFrame.cpp:1442 src/slic3r/GUI/MainFrame.cpp:1446 +#: src/slic3r/GUI/MainFrame.cpp:1615 src/slic3r/GUI/MainFrame.cpp:1619 msgid "Re&load from Disk" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1368 +#: src/slic3r/GUI/MainFrame.cpp:1452 msgid "Searc&h" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1369 +#: src/slic3r/GUI/MainFrame.cpp:1453 msgid "Search in settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "&Plater Tab" msgstr "&Tabla Sekmesi" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "Show the plater" msgstr "Tablayı göster" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "P&rint Settings Tab" msgstr "B&askı Ayarları Sekmesi" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "Show the print settings" msgstr "Baskı ayarlarını göster" -#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1469 src/slic3r/GUI/MainFrame.cpp:1679 msgid "&Filament Settings Tab" msgstr "& Filament Ayarları Sekmesi" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1469 msgid "Show the filament settings" msgstr "Filament ayarlarını göster" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Print&er Settings Tab" msgstr "Yazıcı Ayarları S&ekmesi" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Show the printer settings" msgstr "Yazıcı ayarlarını göster" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "3&D" msgstr "3&B" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "Show the 3D editing view" msgstr "3B düzenleme görünümünü göster" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Pre&view" msgstr "Ön izleme" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Show the 3D slices preview" msgstr "3B dilimleme ön izlemesini göster" -#: src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/MainFrame.cpp:1488 msgid "Open the dialog to modify shape gallery" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Print &Host Upload Queue" msgstr "Yazdırma ve Ana Bilgisayar Yükleme Kuyruğu" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Display the Print Host Upload Queue window" msgstr "Ana Bilgisayar Yükleme Sırasını Yazdır penceresini görüntüle" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open New Instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1424 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 +#: src/slic3r/GUI/MainFrame.cpp:1507 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1727 msgid "Compare Presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/MainFrame.cpp:1507 msgid "Compare presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show &Labels" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show object/instance labels in 3D scene" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1437 +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show Legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show legend in preview" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1523 msgid "&Collapse Sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1523 src/slic3r/GUI/Plater.cpp:2347 msgid "Collapse sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "&Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1543 src/slic3r/GUI/MainFrame.cpp:1650 msgid "&File" msgstr "&Dosya" -#: src/slic3r/GUI/MainFrame.cpp:1458 +#: src/slic3r/GUI/MainFrame.cpp:1544 msgid "&Edit" msgstr "&Düzenle" -#: src/slic3r/GUI/MainFrame.cpp:1459 +#: src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Window" msgstr "&Pencere" -#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 +#: src/slic3r/GUI/MainFrame.cpp:1546 src/slic3r/GUI/MainFrame.cpp:1651 msgid "&View" msgstr "&Görünüm" -#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 +#: src/slic3r/GUI/MainFrame.cpp:1549 src/slic3r/GUI/MainFrame.cpp:1654 msgid "&Help" msgstr "&Yardım" -#: src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/MainFrame.cpp:1611 msgid "&Open G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open &PrusaSlicer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legend" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1676 msgid "E&xport" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end to print" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1679 msgid "Mate&rial Settings Tab" msgstr "Mate&ryal Ayarları Sekmesi" -#: src/slic3r/GUI/MainFrame.cpp:1613 +#: src/slic3r/GUI/MainFrame.cpp:1703 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Dilimlemek için bir dosya seçin (STL / OBJ / AMF / 3MF / PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1625 +#: src/slic3r/GUI/MainFrame.cpp:1715 msgid "No previously sliced file." msgstr "Daha önce dilimlenmiş dosya yok." -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid "Previously sliced file (" msgstr "Önceden dilimlenmiş dosya (" -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid ") not found." msgstr ") bulunamadı." -#: src/slic3r/GUI/MainFrame.cpp:1633 +#: src/slic3r/GUI/MainFrame.cpp:1723 msgid "File Not Found" msgstr "Dosya bulunamadı" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 #, c-format, boost-format msgid "Save %s file as:" msgstr "%s dosyasını farklı kaydet:" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "G-code" msgstr "G-kod" -#: src/slic3r/GUI/MainFrame.cpp:1680 +#: src/slic3r/GUI/MainFrame.cpp:1770 msgid "Save zip file as:" msgstr "Zip dosyasını farklı kaydet:" -#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6064 src/slic3r/GUI/Tab.cpp:1666 -#: src/slic3r/GUI/Tab.cpp:4730 +#: src/slic3r/GUI/MainFrame.cpp:1779 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6654 src/slic3r/GUI/Tab.cpp:1628 +#: src/slic3r/GUI/Tab.cpp:4986 msgid "Slicing" msgstr "Dilimleme" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1691 +#: src/slic3r/GUI/MainFrame.cpp:1781 #, c-format, boost-format msgid "Processing %s" msgstr "%s" -#: src/slic3r/GUI/MainFrame.cpp:1714 +#: src/slic3r/GUI/MainFrame.cpp:1804 #, boost-format msgid "%1% was successfully sliced." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1717 +#: src/slic3r/GUI/MainFrame.cpp:1807 msgid "Slicing Done!" msgstr "Dilimleme Yapıldı!" -#: src/slic3r/GUI/MainFrame.cpp:1733 +#: src/slic3r/GUI/MainFrame.cpp:1823 msgid "Select the STL file to repair:" msgstr "Onarılacak STL dosyasını seçin:" -#: src/slic3r/GUI/MainFrame.cpp:1743 +#: src/slic3r/GUI/MainFrame.cpp:1833 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "" "OBJ dosyasını kaydet (hataları STL'den koordine etmeye daha az eğilimli):" -#: src/slic3r/GUI/MainFrame.cpp:1754 +#: src/slic3r/GUI/MainFrame.cpp:1844 msgid "Your file was repaired." msgstr "Dosyanız onarıldı." -#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4528 +#: src/slic3r/GUI/MainFrame.cpp:1844 src/libslic3r/PrintConfig.cpp:4694 msgid "Repair" msgstr "Onar" -#: src/slic3r/GUI/MainFrame.cpp:1768 +#: src/slic3r/GUI/MainFrame.cpp:1858 msgid "Save configuration as:" msgstr "Yapılandırmayı farklı kaydet:" -#: src/slic3r/GUI/MainFrame.cpp:1785 +#: src/slic3r/GUI/MainFrame.cpp:1875 msgid "Loading of a configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 +#: src/slic3r/GUI/MainFrame.cpp:1877 src/slic3r/GUI/MainFrame.cpp:1944 msgid "Select configuration to load:" msgstr "Yüklenecek yapılandırmayı seçin:" -#: src/slic3r/GUI/MainFrame.cpp:1816 +#: src/slic3r/GUI/MainFrame.cpp:1908 msgid "Exporting configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1817 +#: src/slic3r/GUI/MainFrame.cpp:1909 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1826 +#: src/slic3r/GUI/MainFrame.cpp:1918 msgid "Save presets bundle as:" msgstr "Ön ayar paketini farklı kaydet:" -#: src/slic3r/GUI/MainFrame.cpp:1849 +#: src/slic3r/GUI/MainFrame.cpp:1941 msgid "Loading of a configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1879 +#: src/slic3r/GUI/MainFrame.cpp:1971 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d ön ayar başarıyla içe aktarıldı." @@ -6196,206 +7518,253 @@ msgstr "" msgid "%s information" msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:752 +#: src/slic3r/GUI/NotificationManager.hpp:899 msgid "3D Mouse disconnected." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "Configuration update is available." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "See more." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:761 +#: src/slic3r/GUI/NotificationManager.hpp:908 msgid "" "You have just added a G-code for color change, but its value is empty.\n" "To export the G-code correctly, check the \"Color Change G-code\" in " "\"Printer Settings > Custom G-code\"" msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:764 +#: src/slic3r/GUI/NotificationManager.hpp:911 msgid "" "No color change event was added to the print. The print does not look like a " "sign." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:766 +#: src/slic3r/GUI/NotificationManager.hpp:913 msgid "Desktop integration was successful." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:768 +#: src/slic3r/GUI/NotificationManager.hpp:915 msgid "Desktop integration failed." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:770 +#: src/slic3r/GUI/NotificationManager.hpp:917 msgid "Undo desktop integration was successful." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:772 +#: src/slic3r/GUI/NotificationManager.hpp:919 msgid "Undo desktop integration failed." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:773 +#: src/slic3r/GUI/NotificationManager.hpp:920 msgid "Exporting." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:664 +#: src/slic3r/GUI/NotificationManager.hpp:924 +msgid "" +"PrusaSlicer recieved a download request from Printables.com, but it's not " +"allowed. You can allow it" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:925 +msgid "here." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:773 msgid "Open Folder." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:701 +#: src/slic3r/GUI/NotificationManager.cpp:811 msgid "Eject drive" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:885 +#: src/slic3r/GUI/NotificationManager.cpp:1054 +#: src/slic3r/GUI/NotificationManager.cpp:1267 +#: src/slic3r/GUI/NotificationManager.cpp:1472 msgid "ERROR" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:890 -msgid "CANCELED" +#: src/slic3r/GUI/NotificationManager.cpp:1269 +#: src/slic3r/GUI/NotificationManager.cpp:1377 +msgid "COMPLETED" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:895 -msgid "COMPLETED" +#: src/slic3r/GUI/NotificationManager.cpp:1467 +msgid "RESOLVING ADDRESS" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:1477 +msgid "CANCELED" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:937 +#: src/slic3r/GUI/NotificationManager.cpp:1539 msgid "Cancel upload" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:996 +#: src/slic3r/GUI/NotificationManager.cpp:1648 #, c-format, boost-format msgid "%1$d object was loaded with custom supports." msgid_plural "%1$d objects were loaded with custom supports." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/NotificationManager.cpp:997 +#: src/slic3r/GUI/NotificationManager.cpp:1649 #, c-format, boost-format msgid "%1$d object was loaded with custom seam." msgid_plural "%1$d objects were loaded with custom seam." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/NotificationManager.cpp:998 +#: src/slic3r/GUI/NotificationManager.cpp:1650 #, c-format, boost-format msgid "%1$d object was loaded with multimaterial painting." msgid_plural "%1$d objects were loaded with multimaterial painting." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/NotificationManager.cpp:999 +#: src/slic3r/GUI/NotificationManager.cpp:1651 #, c-format, boost-format msgid "%1$d object was loaded with variable layer height." msgid_plural "%1$d objects were loaded with variable layer height." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/NotificationManager.cpp:1000 +#: src/slic3r/GUI/NotificationManager.cpp:1652 #, c-format, boost-format msgid "%1$d object was loaded with partial sinking." msgid_plural "%1$d objects were loaded with partial sinking." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1653 +#, c-format, boost-format +msgid "%1$d object was loaded as a part of cut object." +msgid_plural "%1$d objects were loaded as parts of cut object" +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Slicing finished." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export G-Code." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1447 -#: src/slic3r/GUI/NotificationManager.cpp:1454 -#: src/slic3r/GUI/NotificationManager.cpp:1470 -#: src/slic3r/GUI/NotificationManager.cpp:1476 -#: src/slic3r/GUI/NotificationManager.cpp:1547 +#: src/slic3r/GUI/NotificationManager.cpp:2101 +#: src/slic3r/GUI/NotificationManager.cpp:2108 +#: src/slic3r/GUI/NotificationManager.cpp:2124 +#: src/slic3r/GUI/NotificationManager.cpp:2130 +#: src/slic3r/GUI/NotificationManager.cpp:2201 msgid "ERROR:" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1459 -#: src/slic3r/GUI/NotificationManager.cpp:1486 -#: src/slic3r/GUI/NotificationManager.cpp:1494 -#: src/slic3r/GUI/NotificationManager.cpp:1505 src/slic3r/GUI/Plater.cpp:3197 +#: src/slic3r/GUI/NotificationManager.cpp:2113 +#: src/slic3r/GUI/NotificationManager.cpp:2140 +#: src/slic3r/GUI/NotificationManager.cpp:2148 +#: src/slic3r/GUI/NotificationManager.cpp:2159 src/slic3r/GUI/Plater.cpp:3220 msgid "WARNING:" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1598 +#: src/slic3r/GUI/NotificationManager.cpp:2275 msgid "Exporting finished." msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:50 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 msgid "Paint-on seam" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:52 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:68 +msgid "Cut connectors" +msgstr "" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:70 msgid "Sinking" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:110 msgid "Instances" msgstr "Örnekleri" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:98 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:266 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:114 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:275 #, c-format, boost-format msgid "Instance %d" msgstr "Kopya %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4568 -#: src/slic3r/GUI/Tab.cpp:4659 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:121 src/slic3r/GUI/Tab.cpp:4805 +#: src/slic3r/GUI/Tab.cpp:4942 msgid "Layers" msgstr "Katmanlar" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 msgid "Range" msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:258 +#: src/slic3r/GUI/OpenGLManager.cpp:376 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL ES 2.0 capable graphics driver to run " +"correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:379 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL %s capable graphics driver to run correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:382 #, c-format, boost-format msgid "" "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" "while OpenGL version %s, render %s, vendor %s was detected." msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:261 +#: src/slic3r/GUI/OpenGLManager.cpp:386 msgid "You may need to update your graphics card driver." msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:264 +#: src/slic3r/GUI/OpenGLManager.cpp:389 msgid "" "As a workaround, you may run PrusaSlicer with a software rendered 3D " "graphics by running prusa-slicer.exe with the --sw-renderer parameter." msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:266 +#: src/slic3r/GUI/OpenGLManager.cpp:391 msgid "Unsupported OpenGL version" msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:274 +#: src/slic3r/GUI/OpenGLManager.cpp:399 #, c-format, boost-format msgid "" "Unable to load the following shaders:\n" "%s" msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:275 +#: src/slic3r/GUI/OpenGLManager.cpp:400 msgid "Error loading shaders" msgstr "" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:126 +msgid "Unavailable for this method." +msgstr "" + +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Top" msgstr "Üst" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Bottom" msgstr "Alt" @@ -6404,7 +7773,7 @@ msgstr "Alt" msgid "Delete this preset from this printer device" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:83 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:84 msgid "This printer will be shown in the presets list as" msgstr "" @@ -6420,31 +7789,31 @@ msgstr "" msgid "Add preset for this printer device" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2255 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2239 msgid "Print Host upload" msgstr "Ana Bilgisayar yüklemesini yazdır" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:268 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:271 msgid "Connection to printers connected via the print host failed." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:310 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:313 msgid "Test" msgstr "Ölçek" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:315 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:318 msgid "Could not get a valid Printer Host reference" msgstr "Geçerli bir Yazıcı Ana Bilgisayar başvurusu alınamadı" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:330 msgid "Success!" msgstr "Başarı!" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:337 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:340 msgid "Refresh Printers" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:367 msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." @@ -6452,20 +7821,20 @@ msgstr "" "HTTPS CA dosyası isteğe bağlıdır. HTTPS'yi kendinden imzalı bir sertifika " "ile kullanıyorsanız gereklidir." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:374 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:377 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "Sertifika dosyaları (*.crt, *.pem) | *.crt; * Pem | Tüm dosyalar | *.*" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:378 msgid "Open CA certificate file" msgstr "CA sertifika dosyasını aç" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:404 -#: src/libslic3r/PrintConfig.cpp:330 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:407 +#: src/libslic3r/PrintConfig.cpp:343 msgid "HTTPS CA File" msgstr "HTTPS CA Dosyası" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:405 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:408 #, c-format, boost-format msgid "" "On this system, %s uses HTTPS certificates from the system Certificate Store " @@ -6474,7 +7843,7 @@ msgstr "" "Bu sistemde, %s , sistem Sertifika Deposu veya Anahtarlıktan HTTPS " "sertifikaları kullanır." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:406 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:409 msgid "" "To use a custom CA file, please import your CA file into Certificate Store / " "Keychain." @@ -6482,24 +7851,24 @@ msgstr "" "Özel bir CA dosyası kullanmak için, lütfen CA dosyanızı Sertifika Deposu/" "Anahtarlık içine aktarın." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:634 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:706 msgid "The supplied name is empty. It can't be saved." msgstr "Sağlanan ad boş. Kurtarılamaz." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:638 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:710 msgid "You have to enter a printer name." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:646 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:718 #, boost-format msgid "Printer with name \"%1%\" already exists." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:647 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:719 msgid "Replace?" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:674 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:746 #, boost-format msgid "" "Following printer preset is duplicated:%1%The above preset for printer \"%2%" @@ -6510,87 +7879,87 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:724 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:796 msgid "It's not possible to delete the last related preset for the printer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:141 +#: src/slic3r/GUI/Plater.cpp:158 msgid "The provided name is not valid;" msgstr "" -#: src/slic3r/GUI/Plater.cpp:142 src/slic3r/GUI/SavePresetDialog.cpp:102 +#: src/slic3r/GUI/Plater.cpp:159 src/slic3r/GUI/SavePresetDialog.cpp:166 msgid "the following characters are not allowed:" msgstr "aşağıdaki karakterlere izin verilmez:" -#: src/slic3r/GUI/Plater.cpp:207 +#: src/slic3r/GUI/Plater.cpp:223 msgid "" "For a multipart object, this value isn't accurate.\n" "It doesn't take account of intersections and negative volumes." msgstr "" -#: src/slic3r/GUI/Plater.cpp:211 +#: src/slic3r/GUI/Plater.cpp:227 msgid "Volume" msgstr "Hacim" -#: src/slic3r/GUI/Plater.cpp:213 +#: src/slic3r/GUI/Plater.cpp:229 msgid "Facets" msgstr "Yüzey Sayısı" -#: src/slic3r/GUI/Plater.cpp:276 +#: src/slic3r/GUI/Plater.cpp:286 msgid "Sliced Info" msgstr "Dilimlenmiş Bilgi" -#: src/slic3r/GUI/Plater.cpp:296 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:306 src/slic3r/GUI/Plater.cpp:1414 msgid "Used Filament (g)" msgstr "Kullanılan Filament (g)" -#: src/slic3r/GUI/Plater.cpp:297 src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:307 src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (m)" msgstr "Kullanılan Filament (m)" -#: src/slic3r/GUI/Plater.cpp:298 src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:308 src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (mm³)" msgstr "Kullanılan Filament (mm³)" -#: src/slic3r/GUI/Plater.cpp:299 +#: src/slic3r/GUI/Plater.cpp:309 msgid "Used Material (unit)" msgstr "Kullanılan Malzeme (birim)" -#: src/slic3r/GUI/Plater.cpp:300 +#: src/slic3r/GUI/Plater.cpp:310 msgid "Cost (money)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:301 src/slic3r/GUI/Plater.cpp:1340 -#: src/slic3r/GUI/Plater.cpp:1427 +#: src/slic3r/GUI/Plater.cpp:311 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:1464 msgid "Estimated printing time" msgstr "Tahmini baskı süresi" -#: src/slic3r/GUI/Plater.cpp:302 +#: src/slic3r/GUI/Plater.cpp:312 msgid "Number of tool changes" msgstr "Takım değişikliği sayısı" -#: src/slic3r/GUI/Plater.cpp:431 +#: src/slic3r/GUI/Plater.cpp:437 msgid "Select what kind of support do you need" msgstr "Ne tür bir desteğe ihtiyacınız olduğunu seçin" -#: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2590 -#: src/libslic3r/PrintConfig.cpp:3645 +#: src/slic3r/GUI/Plater.cpp:440 src/libslic3r/PrintConfig.cpp:2620 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "Support on build plate only" msgstr "Yalnızca tablada destek" -#: src/slic3r/GUI/Plater.cpp:434 src/slic3r/GUI/Plater.cpp:564 +#: src/slic3r/GUI/Plater.cpp:441 msgid "For support enforcers only" msgstr "Yalnızca destek uygulayıcıları için" -#: src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Plater.cpp:442 msgid "Everywhere" msgstr "Her yerde" -#: src/slic3r/GUI/Plater.cpp:467 src/slic3r/GUI/Tab.cpp:1542 +#: src/slic3r/GUI/Plater.cpp:475 src/slic3r/GUI/Tab.cpp:1489 msgid "Brim" msgstr "Kenar (Brim)" -#: src/slic3r/GUI/Plater.cpp:469 +#: src/slic3r/GUI/Plater.cpp:477 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." @@ -6598,145 +7967,142 @@ msgstr "" "Bu bayrak, ilk katmandaki her nesnenin etrafına basılacak kenarı (brim) " "etkinleştirir." -#: src/slic3r/GUI/Plater.cpp:477 +#: src/slic3r/GUI/Plater.cpp:485 msgid "Purging volumes" msgstr "Boşaltma hacimleri" -#: src/slic3r/GUI/Plater.cpp:578 +#: src/slic3r/GUI/Plater.cpp:592 msgid "Select what kind of pad do you need" msgstr "" -#: src/slic3r/GUI/Plater.cpp:580 +#: src/slic3r/GUI/Plater.cpp:595 msgid "Below object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:581 +#: src/slic3r/GUI/Plater.cpp:596 msgid "Around object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:894 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/Plater.cpp:929 src/slic3r/GUI/Plater.cpp:7162 msgid "Send to printer" msgstr "Yazıcıya gönder" -#: src/slic3r/GUI/Plater.cpp:914 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6067 +#: src/slic3r/GUI/Plater.cpp:949 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6657 msgid "Slice now" msgstr "Şimdi dilimle" -#: src/slic3r/GUI/Plater.cpp:1087 +#: src/slic3r/GUI/Plater.cpp:1127 msgid "Hold Shift to Slice & Export G-code" msgstr "" "Dilimlemek ve G-code olarak Dışa Aktarmak için Üst Karakter(Shift) tuşunu " "basılı tutun" -#: src/slic3r/GUI/Plater.cpp:1287 +#: src/slic3r/GUI/Plater.cpp:1324 #, boost-format msgid "%1% (%2$d shell)" msgid_plural "%1% (%2$d shells)" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:1315 +#: src/slic3r/GUI/Plater.cpp:1352 msgid "Used Material (ml)" msgstr "Kullanılan Malzeme (ml)" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "object" msgid_plural "objects" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "supports and pad" msgstr "destekler ve ped" -#: src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (in)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "objects" msgstr "nesneleri" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "wipe tower" msgstr "temizleme kulesi" -#: src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (in³)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1396 +#: src/slic3r/GUI/Plater.cpp:1433 #, boost-format msgid "Filament at extruder %1%" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1402 +#: src/slic3r/GUI/Plater.cpp:1439 msgid "(including spool)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1072 -#: src/libslic3r/PrintConfig.cpp:3439 src/libslic3r/PrintConfig.cpp:3440 +#: src/slic3r/GUI/Plater.cpp:1448 src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:3716 src/libslic3r/PrintConfig.cpp:3717 msgid "Cost" msgstr "Maliyet" -#: src/slic3r/GUI/Plater.cpp:1429 +#: src/slic3r/GUI/Plater.cpp:1466 msgid "normal mode" msgstr "normal mod" -#: src/slic3r/GUI/Plater.cpp:1436 +#: src/slic3r/GUI/Plater.cpp:1473 msgid "stealth mode" msgstr "gizli mod" -#: src/slic3r/GUI/Plater.cpp:1670 -msgid "Fill bed" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1676 -msgid "Optimize Rotation" +#: src/slic3r/GUI/Plater.cpp:1734 +#, boost-format +msgid "Do you want to save the changes to \"%1%\"?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1682 -msgid "Import SLA archive" -msgstr "" +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:905 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1599 +msgid "Save" +msgstr "Kaydet" -#: src/slic3r/GUI/Plater.cpp:1725 -#, boost-format -msgid "Do you want to save the changes to \"%1%\"?" +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +msgid "Discard" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1730 src/slic3r/GUI/Preferences.cpp:222 +#: src/slic3r/GUI/Plater.cpp:1740 src/slic3r/GUI/Preferences.cpp:354 msgid "Ask for unsaved changes in project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1733 +#: src/slic3r/GUI/Plater.cpp:1743 msgid "" "You will not be asked about it again, when: \n" "- Closing PrusaSlicer,\n" "- Loading or creating a new project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2198 +#: src/slic3r/GUI/Plater.cpp:2214 #, c-format, boost-format msgid "" "Successfully unmounted. The device %s(%s) can now be safely removed from the " "computer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2203 +#: src/slic3r/GUI/Plater.cpp:2220 #, c-format, boost-format msgid "Ejecting of device %s(%s) has failed." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2222 src/slic3r/GUI/Plater.cpp:5108 +#: src/slic3r/GUI/Plater.cpp:2239 src/slic3r/GUI/Plater.cpp:5199 msgid "New Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2319 +#: src/slic3r/GUI/Plater.cpp:2346 msgid "Expand sidebar" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2518 +#: src/slic3r/GUI/Plater.cpp:2428 msgid "" "The preset below was temporarily installed on the active instance of " "PrusaSlicer" @@ -6746,12 +8112,12 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:2548 +#: src/slic3r/GUI/Plater.cpp:2583 #, boost-format msgid "Failed loading file \"%1%\" due to an invalid configuration." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2568 +#: src/slic3r/GUI/Plater.cpp:2603 #, c-format, boost-format msgid "" "Object size from file %s appears to be zero.\n" @@ -6762,11 +8128,11 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:2572 +#: src/slic3r/GUI/Plater.cpp:2607 msgid "The size of the object is zero" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2585 +#: src/slic3r/GUI/Plater.cpp:2620 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in meters.\n" @@ -6779,15 +8145,15 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:2589 src/slic3r/GUI/Plater.cpp:2611 +#: src/slic3r/GUI/Plater.cpp:2624 src/slic3r/GUI/Plater.cpp:2646 msgid "The object is too small" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2590 src/slic3r/GUI/Plater.cpp:2612 +#: src/slic3r/GUI/Plater.cpp:2625 src/slic3r/GUI/Plater.cpp:2647 msgid "Apply to all the remaining small objects being loaded." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2607 +#: src/slic3r/GUI/Plater.cpp:2642 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in inches.\n" @@ -6800,44 +8166,35 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:2625 +#: src/slic3r/GUI/Plater.cpp:2659 msgid "" "This file contains several objects positioned at multiple heights.\n" "Instead of considering them as multiple objects, should \n" "the file be loaded as a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2628 src/slic3r/GUI/Plater.cpp:2683 +#: src/slic3r/GUI/Plater.cpp:2662 src/slic3r/GUI/Plater.cpp:2711 msgid "Multi-part object detected" msgstr "Çok parçalı nesne algılandı" -#: src/slic3r/GUI/Plater.cpp:2636 +#: src/slic3r/GUI/Plater.cpp:2669 msgid "" "This file cannot be loaded in a simple mode. Do you want to switch to an " "advanced mode?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2637 +#: src/slic3r/GUI/Plater.cpp:2670 msgid "Detected advanced data" msgstr "Gelişmiş veriler tespit edildi" -#: src/slic3r/GUI/Plater.cpp:2657 -#, c-format, boost-format -msgid "" -"You can't to add the object(s) from %s because of one or some of them " -"is(are) multi-part" -msgstr "" -"%s öğesinden nesne ekleyemezsiniz çünkü bir yada bir kaçı çoklu parçadan " -"oluşuyor" - -#: src/slic3r/GUI/Plater.cpp:2680 +#: src/slic3r/GUI/Plater.cpp:2708 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" "these files to represent a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2799 +#: src/slic3r/GUI/Plater.cpp:2827 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." @@ -6845,139 +8202,155 @@ msgstr "" "Nesneniz çok büyük görünüyor, bu nedenle baskı tablanıza uyacak şekilde " "otomatik olarak küçültüldü." -#: src/slic3r/GUI/Plater.cpp:2800 +#: src/slic3r/GUI/Plater.cpp:2828 msgid "Object too large?" msgstr "Nesne çok mu büyük?" -#: src/slic3r/GUI/Plater.cpp:2878 +#: src/slic3r/GUI/Plater.cpp:2908 msgid "Export STL file:" msgstr "Dışa aktarılacak STL dosya:" -#: src/slic3r/GUI/Plater.cpp:2885 +#: src/slic3r/GUI/Plater.cpp:2915 msgid "Export AMF file:" msgstr "AMF dosyasını dışa aktar:" -#: src/slic3r/GUI/Plater.cpp:2891 +#: src/slic3r/GUI/Plater.cpp:2921 msgid "Save file as:" msgstr "Farklı kaydet:" -#: src/slic3r/GUI/Plater.cpp:2897 +#: src/slic3r/GUI/Plater.cpp:2927 msgid "Export OBJ file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2995 +#: src/slic3r/GUI/Plater.cpp:3030 +msgid "Delete object which is a part of cut object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3031 +msgid "" +"You try to delete an object which is a part of a cut object.\n" +"This action will break a cut correspondence.\n" +"After that PrusaSlicer can't guarantee model consistency" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3035 +msgid "Delete object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3040 msgid "Delete Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3007 +#: src/slic3r/GUI/Plater.cpp:3057 msgid "Delete All Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3035 +#: src/slic3r/GUI/Plater.cpp:3086 msgid "Reset Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3118 +#: src/slic3r/GUI/Plater.cpp:3141 msgid "" "The selected object couldn't be split because it contains only one solid " "part." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3125 +#: src/slic3r/GUI/Plater.cpp:3148 msgid "All non-solid parts (modifiers) were deleted" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3127 +#: src/slic3r/GUI/Plater.cpp:3150 msgid "Split to Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3179 +#: src/slic3r/GUI/Plater.cpp:3202 msgid "" "An object has custom support enforcers which will not be used because " "supports are disabled." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3181 +#: src/slic3r/GUI/Plater.cpp:3204 msgid "Enable supports for enforcers only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3310 src/slic3r/GUI/Plater.cpp:4176 +#: src/slic3r/GUI/Plater.cpp:3339 src/slic3r/GUI/Plater.cpp:4238 msgid "Invalid data" msgstr "Geçersiz veri" -#: src/slic3r/GUI/Plater.cpp:3380 +#: src/slic3r/GUI/Plater.cpp:3410 msgid "Another export job is currently running." msgstr "Şu anda başka bir dışa aktarma işlemi çalışıyor." -#: src/slic3r/GUI/Plater.cpp:3466 +#: src/slic3r/GUI/Plater.cpp:3496 msgid "Replace from:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3484 +#: src/slic3r/GUI/Plater.cpp:3514 msgid "Unable to replace with more than one volume" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3484 src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3514 src/slic3r/GUI/Plater.cpp:3597 msgid "Error during replace" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3555 +#: src/slic3r/GUI/Plater.cpp:3589 msgid "Select the new file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3597 msgid "File for the replace wasn't selected" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3654 +#: src/slic3r/GUI/Plater.cpp:3684 msgid "Please select the file to reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3685 src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:3715 src/slic3r/GUI/Plater.cpp:5355 +#: src/slic3r/GUI/Plater.cpp:5365 msgid "The selected file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "differs from the original file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "Do you want to replace it" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3703 src/slic3r/GUI/Plater.cpp:3709 +#: src/slic3r/GUI/Plater.cpp:3736 src/slic3r/GUI/Plater.cpp:3742 msgid "Reload from:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3812 +#: src/slic3r/GUI/Plater.cpp:3864 msgid "Unable to reload:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3817 +#: src/slic3r/GUI/Plater.cpp:3869 msgid "Error during reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3835 +#: src/slic3r/GUI/Plater.cpp:3887 msgid "Reload all from disk" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4130 +#: src/slic3r/GUI/Plater.cpp:4191 msgid "There are active warnings concerning sliced models:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4141 +#: src/slic3r/GUI/Plater.cpp:4202 msgid "generated warnings" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4472 +#: src/slic3r/GUI/Plater.cpp:4554 msgid "3D editor view" msgstr "3B düzenleme görünümü" -#: src/slic3r/GUI/Plater.cpp:4893 +#: src/slic3r/GUI/Plater.cpp:4980 msgid "Undo / Redo is processing" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4895 +#: src/slic3r/GUI/Plater.cpp:4982 #, boost-format msgid "" "Switching the printer technology from %1% to %2%.\n" @@ -6985,179 +8358,228 @@ msgid "" "printer technology." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5092 +#: src/slic3r/GUI/Plater.cpp:5184 msgid "Creating a new project while the current project is modified." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5095 +#: src/slic3r/GUI/Plater.cpp:5187 msgid "Creating a new project while some presets are modified." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5096 +#: src/slic3r/GUI/Plater.cpp:5188 msgid "You can keep presets modifications to the new project or discard them" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5097 +#: src/slic3r/GUI/Plater.cpp:5189 msgid "" "You can keep presets modifications to the new project, discard them or save " "changes as new presets.\n" "Note, if changes will be saved then new project wouldn't keep them" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5103 +#: src/slic3r/GUI/Plater.cpp:5194 msgid "Creating a new project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5137 +#: src/slic3r/GUI/Plater.cpp:5228 msgid "Load Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5167 src/slic3r/GUI/Plater.cpp:5432 +#: src/slic3r/GUI/Plater.cpp:5258 msgid "Import Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5171 +#: src/slic3r/GUI/Plater.cpp:5262 msgid "Import Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:5291 +msgid "Import SLA archive" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5355 src/slic3r/GUI/Plater.cpp:5365 msgid "does not contain valid gcode." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5244 +#: src/slic3r/GUI/Plater.cpp:5356 src/slic3r/GUI/Plater.cpp:5366 msgid "Error while loading .gcode file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5297 +#: src/slic3r/GUI/Plater.cpp:5433 +#, c-format, boost-format +msgid "%s - Multiple projects file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 +msgid "There are several files being loaded, including Project files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 src/slic3r/GUI/Plater.cpp:5446 +msgid "Select an action to apply to all files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5446 +msgid "There are several files being loaded." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5448 src/slic3r/GUI/Plater.cpp:5842 +msgid "Action" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5469 +msgid "Import geometry" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5482 src/slic3r/GUI/Plater.cpp:5834 +msgid "Start new PrusaSlicer instance" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5496 +msgid "Select one to load as project" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5507 +msgid "Select one to load config only" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5609 +#, boost-format +msgid "Failed to unzip file to %1%: %2% " +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5618 +#, boost-format +msgid "Failed to find unzipped file at %1%. Unzipping of file has failed." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5821 #, c-format, boost-format -msgid "%s - Drop project file" +msgid "%s - Load project file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5304 +#: src/slic3r/GUI/Plater.cpp:5830 msgid "Open as project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5305 +#: src/slic3r/GUI/Plater.cpp:5831 msgid "Import geometry only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5306 +#: src/slic3r/GUI/Plater.cpp:5832 msgid "Import config only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5309 +#: src/slic3r/GUI/Plater.cpp:5837 msgid "Select an action to apply to the file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5314 -msgid "Action" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:5330 +#: src/slic3r/GUI/Plater.cpp:5858 msgid "Don't show again" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5371 +#: src/slic3r/GUI/Plater.cpp:5899 msgid "You can open only one .gcode file at a time." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5372 +#: src/slic3r/GUI/Plater.cpp:5900 msgid "Drag and drop G-code file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5454 +#: src/slic3r/GUI/Plater.cpp:5992 msgid "Load File" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5459 +#: src/slic3r/GUI/Plater.cpp:5997 msgid "Load Files" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5509 +#: src/slic3r/GUI/Plater.cpp:6047 msgid "All objects will be removed, continue?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5520 +#: src/slic3r/GUI/Plater.cpp:6058 msgid "Delete Selected Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5529 +#: src/slic3r/GUI/Plater.cpp:6067 msgid "Increase Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5563 +#: src/slic3r/GUI/Plater.cpp:6109 msgid "Decrease Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5614 +#: src/slic3r/GUI/Plater.cpp:6167 msgid "Enter the number of copies:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5615 +#: src/slic3r/GUI/Plater.cpp:6168 msgid "Copies of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5619 +#: src/slic3r/GUI/Plater.cpp:6171 #, c-format, boost-format msgid "Set numbers of copies to %d" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5697 -msgid "Cut by Plane" +#: src/slic3r/GUI/Plater.cpp:6187 +msgid "Fill bed" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save G-code file as:" msgstr "G kodu dosyasını farklı kaydet:" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save SL1 / SL1S file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5766 +#: src/slic3r/GUI/Plater.cpp:6336 msgid "The provided file name is not valid." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5767 +#: src/slic3r/GUI/Plater.cpp:6337 msgid "The following characters are not allowed by a FAT file system:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "" "The plater is empty.\n" "Do you want to save the project?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "Save project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:6543 -msgid "Export" -msgstr "Dışa Aktar" +#: src/slic3r/GUI/Plater.cpp:6766 +msgid "Is the printer ready? Is the print sheet in place, empty and clean?" +msgstr "" -#: src/slic3r/GUI/Plater.cpp:6575 -msgid "" -"Custom supports, seams and multimaterial painting were removed after " -"repairing the mesh." +#: src/slic3r/GUI/Plater.cpp:6766 src/slic3r/GUI/PrintHostDialogs.cpp:132 +msgid "Upload and Print" msgstr "" -#: src/slic3r/GUI/Plater.cpp:6689 +#: src/slic3r/GUI/Plater.cpp:7161 +msgid "Export" +msgstr "Dışa Aktar" + +#: src/slic3r/GUI/Plater.cpp:7306 msgid "Paste From Clipboard" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2290 -#: src/slic3r/GUI/Tab.cpp:2517 src/slic3r/GUI/Tab.cpp:2624 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Preferences.cpp:240 src/slic3r/GUI/Tab.cpp:2274 +#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2617 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "General" msgstr "Genel" -#: src/slic3r/GUI/Preferences.cpp:121 +#: src/slic3r/GUI/Preferences.cpp:258 msgid "Remember output directory" msgstr "Çıkış dizinini hatırla" -#: src/slic3r/GUI/Preferences.cpp:123 +#: src/slic3r/GUI/Preferences.cpp:259 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." @@ -7165,22 +8587,22 @@ msgstr "" "Bu etkinse, Slic3r giriş dosyalarını içeren yerine son çıkış dizinini " "soracaktır." -#: src/slic3r/GUI/Preferences.cpp:129 +#: src/slic3r/GUI/Preferences.cpp:263 msgid "Auto-center parts" msgstr "Parçaları otomatik ortala" -#: src/slic3r/GUI/Preferences.cpp:131 +#: src/slic3r/GUI/Preferences.cpp:264 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." msgstr "" "Bu etkinse, Slic3r nesneleri tabla merkezinin çevresinde otomatik ortalar." -#: src/slic3r/GUI/Preferences.cpp:137 +#: src/slic3r/GUI/Preferences.cpp:268 msgid "Background processing" msgstr "Arkaplan işleme" -#: src/slic3r/GUI/Preferences.cpp:139 +#: src/slic3r/GUI/Preferences.cpp:269 msgid "" "If this is enabled, Slic3r will pre-process objects as soon as they're " "loaded in order to save time when exporting G-code." @@ -7188,25 +8610,37 @@ msgstr "" "Bu etkinse, Slic3r, G kodunu dışa aktarırken zaman kazanmak için nesneleri " "yüklendikleri anda işleme koyar." -#: src/slic3r/GUI/Preferences.cpp:148 +#: src/slic3r/GUI/Preferences.cpp:274 +msgid "Alert when supports needed" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:275 +msgid "" +"If this is enabled, Slic3r will raise alerts when it detects issues in the " +"sliced object, that can be resolved with supports (and brim). Examples of " +"such issues are floating object parts, unsupported extrusions and low bed " +"adhesion." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:285 msgid "Export sources full pathnames to 3mf and amf" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:150 +#: src/slic3r/GUI/Preferences.cpp:286 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:159 +#: src/slic3r/GUI/Preferences.cpp:293 msgid "If enabled, sets PrusaSlicer as default application to open .3mf files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:166 +#: src/slic3r/GUI/Preferences.cpp:298 msgid "If enabled, sets PrusaSlicer as default application to open .stl files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:177 +#: src/slic3r/GUI/Preferences.cpp:307 msgid "" "If enabled, Slic3r downloads updates of built-in system presets in the " "background. These updates are downloaded into a separate temporary location. " @@ -7218,11 +8652,11 @@ msgstr "" "indirilir. Yeni önceden ayarlanmış bir sürüm kullanıma sunulduğunda, " "uygulama başlangıcında sunulur." -#: src/slic3r/GUI/Preferences.cpp:182 +#: src/slic3r/GUI/Preferences.cpp:312 msgid "Suppress \" - default - \" presets" msgstr "\\ \"- varsayılan - \" ön ayarları bastır" -#: src/slic3r/GUI/Preferences.cpp:184 +#: src/slic3r/GUI/Preferences.cpp:313 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." @@ -7230,11 +8664,21 @@ msgstr "" "Kullanılabilir başka geçerli hazır ayarlar bulunduğunda, Yazdır / Filament / " "Yazıcı seçimlerinde \\ \"- varsayılan - \" hazır ayarlarını bastırın." -#: src/slic3r/GUI/Preferences.cpp:190 +#: src/slic3r/GUI/Preferences.cpp:317 +msgid "Suppress \" Template \" filament presets" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:318 +msgid "" +"Suppress \" Template \" filament presets in configuration wizard and sidebar " +"visibility." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:322 msgid "Show incompatible print and filament presets" msgstr "Uyumsuz baskı ve filament hazır ayarları göster" -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:323 msgid "" "When checked, the print and filament presets are shown in the preset editor " "even if they are marked as incompatible with the active printer" @@ -7243,91 +8687,102 @@ msgstr "" "uyumsuz olarak işaretlenmiş olsalar bile hazır ayar düzenleyicisinde " "gösterilir" -#: src/slic3r/GUI/Preferences.cpp:200 +#: src/slic3r/GUI/Preferences.cpp:331 +msgid "Show load project dialog" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:332 +msgid "" +"When checked, whenever dragging and dropping a project file on the " +"application or open it from a browser, shows a dialog asking to select the " +"action to take on the file to load." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:335 msgid "Show drop project dialog" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:202 +#: src/slic3r/GUI/Preferences.cpp:336 msgid "" "When checked, whenever dragging and dropping a project file on the " "application, shows a dialog asking to select the action to take on the file " "to load." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:208 src/slic3r/GUI/Preferences.cpp:212 +#: src/slic3r/GUI/Preferences.cpp:342 src/slic3r/GUI/Preferences.cpp:346 msgid "Allow just a single PrusaSlicer instance" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:210 +#: src/slic3r/GUI/Preferences.cpp:343 msgid "" "On OSX there is always only one instance of app running by default. However " "it is allowed to run multiple instances of same app from the command line. " "In such case this settings will allow only one instance." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:214 +#: src/slic3r/GUI/Preferences.cpp:347 msgid "" "If this is enabled, when starting PrusaSlicer and another instance of the " "same PrusaSlicer is already running, that instance will be reactivated " "instead." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:224 +#: src/slic3r/GUI/Preferences.cpp:355 msgid "" "Always ask for unsaved changes in project, when: \n" "- Closing PrusaSlicer,\n" "- Loading or creating a new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:233 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:897 +#: src/slic3r/GUI/Preferences.cpp:363 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:925 msgid "" "Ask to save unsaved changes in presets when closing the application or when " "loading a new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:235 +#: src/slic3r/GUI/Preferences.cpp:364 msgid "" "Always ask for unsaved changes in presets, when: \n" "- Closing PrusaSlicer while some presets are modified,\n" "- Loading a new project while some presets are modified" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:242 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:896 +#: src/slic3r/GUI/Preferences.cpp:370 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:924 msgid "Ask for unsaved changes in presets when selecting new preset" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:244 +#: src/slic3r/GUI/Preferences.cpp:371 msgid "" "Always ask for unsaved changes in presets when selecting new preset or " "resetting a preset" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:249 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 +#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:923 msgid "Ask for unsaved changes in presets when creating new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:251 +#: src/slic3r/GUI/Preferences.cpp:376 msgid "Always ask for unsaved changes in presets when creating new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:258 +#: src/slic3r/GUI/Preferences.cpp:382 msgid "Associate .gcode files to PrusaSlicer G-code Viewer" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:260 +#: src/slic3r/GUI/Preferences.cpp:383 msgid "" "If enabled, sets PrusaSlicer G-code Viewer as default application to open ." "gcode files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:268 +#: src/slic3r/GUI/Preferences.cpp:390 msgid "Use Retina resolution for the 3D scene" msgstr "3B sahne için Retina çözünürlüğünü kullan" -#: src/slic3r/GUI/Preferences.cpp:270 +#: src/slic3r/GUI/Preferences.cpp:391 msgid "" "If enabled, the 3D scene will be rendered in Retina resolution. If you are " "experiencing 3D performance problems, disabling this option may help." @@ -7336,106 +8791,102 @@ msgstr "" "sorunları yaşıyorsanız, bu seçeneğin devre dışı bırakılması yardımcı " "olabilir." -#: src/slic3r/GUI/Preferences.cpp:280 src/slic3r/GUI/Preferences.cpp:282 +#: src/slic3r/GUI/Preferences.cpp:400 src/slic3r/GUI/Preferences.cpp:401 msgid "Show splash screen" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:289 +#: src/slic3r/GUI/Preferences.cpp:406 msgid "If enabled, PrusaSlicer will be open at the position it was closed" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:295 +#: src/slic3r/GUI/Preferences.cpp:411 msgid "Clear Undo / Redo stack on new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:297 +#: src/slic3r/GUI/Preferences.cpp:412 msgid "" "Clear Undo / Redo stack on new project or when an existing project is loaded." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:303 +#: src/slic3r/GUI/Preferences.cpp:417 msgid "Enable support for legacy 3DConnexion devices" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:305 +#: src/slic3r/GUI/Preferences.cpp:418 msgid "" "If enabled, the legacy 3DConnexion devices settings dialog is available by " "pressing CTRL+M" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:314 +#: src/slic3r/GUI/Preferences.cpp:425 msgid "Camera" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:319 +#: src/slic3r/GUI/Preferences.cpp:435 msgid "Use perspective camera" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:321 +#: src/slic3r/GUI/Preferences.cpp:436 msgid "" "If enabled, use perspective camera. If not enabled, use orthographic camera." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:326 +#: src/slic3r/GUI/Preferences.cpp:440 msgid "Use free camera" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:328 +#: src/slic3r/GUI/Preferences.cpp:441 msgid "If enabled, use free camera. If not enabled, use constrained camera." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:333 +#: src/slic3r/GUI/Preferences.cpp:445 msgid "Reverse direction of zoom with mouse wheel" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:335 +#: src/slic3r/GUI/Preferences.cpp:446 msgid "If enabled, reverses the direction of zoom with mouse wheel" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:343 +#: src/slic3r/GUI/Preferences.cpp:452 msgid "GUI" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:366 +#: src/slic3r/GUI/Preferences.cpp:492 msgid "Sequential slider applied only to top layer" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:368 +#: src/slic3r/GUI/Preferences.cpp:493 msgid "" "If enabled, changes made using the sequential slider, in preview, apply only " -"to gcode top layer. If disabled, changes made using the sequential slider, " -"in preview, apply to the whole gcode." +"to gcode top layer.If disabled, changes made using the sequential slider, in " +"preview, apply to the whole gcode." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/Preferences.cpp:499 msgid "Show sidebar collapse/expand button" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:377 +#: src/slic3r/GUI/Preferences.cpp:500 msgid "" "If enabled, the button for the collapse sidebar will be appeared in top " "right corner of the 3D Scene" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:384 -msgid "If enabled, PrusaSlicer will not open hyperlinks in your browser." -msgstr "" - -#: src/slic3r/GUI/Preferences.cpp:391 +#: src/slic3r/GUI/Preferences.cpp:511 msgid "Use colors for axes values in Manipulation panel" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:393 +#: src/slic3r/GUI/Preferences.cpp:512 msgid "" "If enabled, the axes names and axes values will be colorized according to " "the axes colors. If disabled, old UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:399 +#: src/slic3r/GUI/Preferences.cpp:517 msgid "Order object volumes by types" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:401 +#: src/slic3r/GUI/Preferences.cpp:518 msgid "" "If enabled, volumes will be always ordered inside the object. Correct order " "is Model Part, Negative Volume, Modifier, Support Blocker and Support " @@ -7443,193 +8894,240 @@ msgid "" "Modifiers. But one of the model parts have to be on the first place." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:408 +#: src/slic3r/GUI/Preferences.cpp:523 +msgid "Show non-manifold edges" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:524 +msgid "If enabled, shows non-manifold edges." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:528 +msgid "Allow automatically color change" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:529 +msgid "" +"If enabled, related notification will be shown, when sliced object looks " +"like a logo or a sign." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:534 msgid "Set settings tabs as menu items (experimental)" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:410 +#: src/slic3r/GUI/Preferences.cpp:535 msgid "" "If enabled, Settings Tabs will be placed as menu items. If disabled, old UI " "will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:419 +#: src/slic3r/GUI/Preferences.cpp:542 msgid "Show \"Tip of the day\" notification after start" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:421 +#: src/slic3r/GUI/Preferences.cpp:543 msgid "If enabled, useful hints are displayed at startup." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:427 +#: src/slic3r/GUI/Preferences.cpp:547 msgid "Notify about new releases" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:429 +#: src/slic3r/GUI/Preferences.cpp:548 msgid "" "You will be notified about new release after startup acordingly: All = " "Regular release and alpha / beta releases. Release only = regular release." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:435 +#: src/slic3r/GUI/Preferences.cpp:551 msgid "Release only" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:444 +#: src/slic3r/GUI/Preferences.cpp:558 msgid "Use custom size for toolbar icons" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:446 +#: src/slic3r/GUI/Preferences.cpp:559 msgid "If enabled, you can change size of toolbar icons manually." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:471 +#: src/slic3r/GUI/Preferences.cpp:577 src/slic3r/GUI/Tab.cpp:1659 +msgid "Other" +msgstr "Diğer" + +#: src/slic3r/GUI/Preferences.cpp:594 +msgid "If enabled, PrusaSlicer will not open a hyperlinks in your browser." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:600 +msgid "Allow downloads from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:601 +msgid "If enabled, PrusaSlicer will be allowed to download from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:610 msgid "Render" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:476 +#: src/slic3r/GUI/Preferences.cpp:620 msgid "Use environment map" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:478 +#: src/slic3r/GUI/Preferences.cpp:621 msgid "If enabled, renders object using the environment map." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:491 +#: src/slic3r/GUI/Preferences.cpp:629 msgid "Dark mode (experimental)" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:496 +#: src/slic3r/GUI/Preferences.cpp:639 msgid "Enable dark mode" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:498 +#: src/slic3r/GUI/Preferences.cpp:640 msgid "" "If enabled, UI will use Dark mode colors. If disabled, old UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:507 +#: src/slic3r/GUI/Preferences.cpp:647 msgid "Use system menu for application" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:509 +#: src/slic3r/GUI/Preferences.cpp:648 msgid "" "If enabled, application will use the standard Windows system menu,\n" -"but on some combination of display scales it can looks ugly. If disabled, " -"old UI will be used." +"but on some combination od display scales it can look ugly. If disabled, old " +"UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:578 +#: src/slic3r/GUI/Preferences.cpp:726 msgid "Changes for the critical options" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:580 +#: src/slic3r/GUI/Preferences.cpp:728 msgid "" "Changing some options will trigger application restart.\n" "You will lose the content of the plater." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:694 +#: src/slic3r/GUI/Preferences.cpp:921 msgid "Icon size in a respect to the default size" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:709 +#: src/slic3r/GUI/Preferences.cpp:936 msgid "Select toolbar icon size in respect to the default one." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:743 src/slic3r/GUI/Preferences.cpp:754 +#: src/slic3r/GUI/Preferences.cpp:972 +msgid "Layout Options" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:981 msgid "Old regular layout with the tab bar" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:744 +#: src/slic3r/GUI/Preferences.cpp:982 msgid "New layout, access via settings button in the top menu" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:745 src/slic3r/GUI/Preferences.cpp:755 +#: src/slic3r/GUI/Preferences.cpp:983 msgid "Settings in non-modal window" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:763 -msgid "Layout Options" +#: src/slic3r/GUI/Preferences.cpp:1025 +msgid "Text colors" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:806 -msgid "Text colors" +#: src/slic3r/GUI/Preferences.cpp:1049 +msgid "Mode markers" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:249 -#: src/slic3r/GUI/PresetComboBoxes.cpp:287 -#: src/slic3r/GUI/PresetComboBoxes.cpp:794 -#: src/slic3r/GUI/PresetComboBoxes.cpp:849 -#: src/slic3r/GUI/PresetComboBoxes.cpp:989 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1033 +#: src/slic3r/GUI/PresetComboBoxes.cpp:254 +#: src/slic3r/GUI/PresetComboBoxes.cpp:306 +#: src/slic3r/GUI/PresetComboBoxes.cpp:846 +#: src/slic3r/GUI/PresetComboBoxes.cpp:909 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1073 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1125 msgid "System presets" msgstr "Sistem ön ayarları" -#: src/slic3r/GUI/PresetComboBoxes.cpp:291 -#: src/slic3r/GUI/PresetComboBoxes.cpp:853 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1037 +#: src/slic3r/GUI/PresetComboBoxes.cpp:310 +#: src/slic3r/GUI/PresetComboBoxes.cpp:915 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1130 msgid "User presets" msgstr "Kullanıcı ön ayarları" -#: src/slic3r/GUI/PresetComboBoxes.cpp:302 +#: src/slic3r/GUI/PresetComboBoxes.cpp:321 msgid "Incompatible presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:337 +#: src/slic3r/GUI/PresetComboBoxes.cpp:364 #, boost-format msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:340 +#: src/slic3r/GUI/PresetComboBoxes.cpp:366 msgid "Delete Physical Printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:581 +#: src/slic3r/GUI/PresetComboBoxes.cpp:612 msgid "Click to edit preset" msgstr "Hazır ayarı düzenlemek için tıklayın" -#: src/slic3r/GUI/PresetComboBoxes.cpp:697 -#: src/slic3r/GUI/PresetComboBoxes.cpp:737 +#: src/slic3r/GUI/PresetComboBoxes.cpp:740 +#: src/slic3r/GUI/PresetComboBoxes.cpp:788 msgid "Add/Remove presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:745 +#: src/slic3r/GUI/PresetComboBoxes.cpp:793 src/slic3r/GUI/Tab.cpp:3312 msgid "Add physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:716 +#: src/slic3r/GUI/PresetComboBoxes.cpp:759 msgid "Edit preset" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:722 +#: src/slic3r/GUI/PresetComboBoxes.cpp:765 msgid "Change extruder color" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:773 src/slic3r/GUI/Tab.cpp:3312 msgid "Edit physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:733 +#: src/slic3r/GUI/PresetComboBoxes.cpp:779 +msgid "Open physical printer URL" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:784 msgid "Delete physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:864 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1051 +#: src/slic3r/GUI/PresetComboBoxes.cpp:924 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1142 +msgid "Template presets" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:935 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1156 msgid "Physical printers" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:888 +#: src/slic3r/GUI/PresetComboBoxes.cpp:959 msgid "Add/Remove filaments" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:890 +#: src/slic3r/GUI/PresetComboBoxes.cpp:961 msgid "Add/Remove materials" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:892 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1075 +#: src/slic3r/GUI/PresetComboBoxes.cpp:963 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1180 msgid "Add/Remove printers" msgstr "" @@ -7808,98 +9306,106 @@ msgstr "" msgid "Bottom is open." msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Send G-Code to printer host" msgstr "G-Kodunu yazıcı ana bilgisayarına gönderin" -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Upload to Printer Host with the following filename:" msgstr "Aşağıdaki dosya adıyla Yazıcı Ana Bilgisayarına yükleyin:" -#: src/slic3r/GUI/PrintHostDialogs.cpp:51 +#: src/slic3r/GUI/PrintHostDialogs.cpp:55 msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "Gerekirse, eğik çizgi (/) işlevini dizin ayırıcı olarak kullanın." -#: src/slic3r/GUI/PrintHostDialogs.cpp:60 +#: src/slic3r/GUI/PrintHostDialogs.cpp:64 msgid "Group" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:84 +#: src/slic3r/GUI/PrintHostDialogs.cpp:74 +msgid "Upload to storage:" +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:83 +msgid "Upload to storage: " +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:105 #, c-format, boost-format msgid "Upload filename doesn't end with \"%s\". Do you wish to continue?" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:91 +#: src/slic3r/GUI/PrintHostDialogs.cpp:112 msgid "Upload" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:101 -msgid "Upload and Print" +#: src/slic3r/GUI/PrintHostDialogs.cpp:122 +msgid "Upload to Queue" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:112 +#: src/slic3r/GUI/PrintHostDialogs.cpp:143 msgid "Upload and Simulate" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:247 +#: src/slic3r/GUI/PrintHostDialogs.cpp:298 msgid "ID" msgstr "İD" -#: src/slic3r/GUI/PrintHostDialogs.cpp:248 +#: src/slic3r/GUI/PrintHostDialogs.cpp:299 msgid "Progress" msgstr "İlerleme" -#: src/slic3r/GUI/PrintHostDialogs.cpp:249 +#: src/slic3r/GUI/PrintHostDialogs.cpp:300 msgid "Status" msgstr "Durum" -#: src/slic3r/GUI/PrintHostDialogs.cpp:250 +#: src/slic3r/GUI/PrintHostDialogs.cpp:301 msgid "Host" msgstr "Sunucu" -#: src/slic3r/GUI/PrintHostDialogs.cpp:251 +#: src/slic3r/GUI/PrintHostDialogs.cpp:302 msgctxt "OfFile" msgid "Size" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:252 +#: src/slic3r/GUI/PrintHostDialogs.cpp:303 msgid "Filename" msgstr "Dosya adı" -#: src/slic3r/GUI/PrintHostDialogs.cpp:253 -msgid "Error Message" -msgstr "Hata mesajı" +#: src/slic3r/GUI/PrintHostDialogs.cpp:304 +msgid "Message" +msgstr "İleti" -#: src/slic3r/GUI/PrintHostDialogs.cpp:256 +#: src/slic3r/GUI/PrintHostDialogs.cpp:308 msgid "Cancel selected" msgstr "Seçileni iptal et" -#: src/slic3r/GUI/PrintHostDialogs.cpp:258 +#: src/slic3r/GUI/PrintHostDialogs.cpp:310 msgid "Show error message" msgstr "Hata mesajını göster" -#: src/slic3r/GUI/PrintHostDialogs.cpp:316 -#: src/slic3r/GUI/PrintHostDialogs.cpp:371 +#: src/slic3r/GUI/PrintHostDialogs.cpp:368 +#: src/slic3r/GUI/PrintHostDialogs.cpp:423 msgid "Enqueued" msgstr "Sıraya alındı" -#: src/slic3r/GUI/PrintHostDialogs.cpp:372 +#: src/slic3r/GUI/PrintHostDialogs.cpp:424 msgid "Uploading" msgstr "Yükleme" -#: src/slic3r/GUI/PrintHostDialogs.cpp:374 +#: src/slic3r/GUI/PrintHostDialogs.cpp:426 msgid "Cancelling" msgstr "İptal ediliyor" -#: src/slic3r/GUI/PrintHostDialogs.cpp:375 +#: src/slic3r/GUI/PrintHostDialogs.cpp:427 msgid "Cancelled" msgstr "İptal edildi" -#: src/slic3r/GUI/PrintHostDialogs.cpp:376 +#: src/slic3r/GUI/PrintHostDialogs.cpp:428 msgid "Completed" msgstr "Tamamlandı" -#: src/slic3r/GUI/PrintHostDialogs.cpp:424 +#: src/slic3r/GUI/PrintHostDialogs.cpp:476 msgid "Error uploading to print host:" msgstr "Ana makineye yüklerken hata oluştu:" @@ -7907,13 +9413,13 @@ msgstr "Ana makineye yüklerken hata oluştu:" msgid "NO RAMMING AT ALL" msgstr "TÜMÜNDE SIKIŞTIRMA YOK" -#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 -#: src/libslic3r/PrintConfig.cpp:955 src/libslic3r/PrintConfig.cpp:999 -#: src/libslic3r/PrintConfig.cpp:1014 src/libslic3r/PrintConfig.cpp:3297 -#: src/libslic3r/PrintConfig.cpp:3306 src/libslic3r/PrintConfig.cpp:3315 -#: src/libslic3r/PrintConfig.cpp:3456 src/libslic3r/PrintConfig.cpp:3464 -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3479 -#: src/libslic3r/PrintConfig.cpp:3487 src/libslic3r/PrintConfig.cpp:3495 +#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/libslic3r/PrintConfig.cpp:1044 src/libslic3r/PrintConfig.cpp:1088 +#: src/libslic3r/PrintConfig.cpp:1103 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3578 src/libslic3r/PrintConfig.cpp:3587 +#: src/libslic3r/PrintConfig.cpp:3733 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3749 src/libslic3r/PrintConfig.cpp:3756 +#: src/libslic3r/PrintConfig.cpp:3764 src/libslic3r/PrintConfig.cpp:3772 msgid "s" msgstr "s" @@ -7921,162 +9427,210 @@ msgstr "s" msgid "Volumetric speed" msgstr "Hacimsel hız" -#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:912 -#: src/libslic3r/PrintConfig.cpp:1824 +#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:1001 +#: src/libslic3r/PrintConfig.cpp:1861 msgid "mm³/s" msgstr "mm³/sn" -#: src/slic3r/GUI/SavePresetDialog.cpp:57 +#: src/slic3r/GUI/SavePresetDialog.cpp:90 +#, c-format, boost-format +msgid "Rename %s to:" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:90 #, c-format, boost-format msgid "Save %s as:" msgstr "%s şu şekilde kaydet:" -#: src/slic3r/GUI/SavePresetDialog.cpp:101 -#: src/slic3r/GUI/SavePresetDialog.cpp:109 +#: src/slic3r/GUI/SavePresetDialog.cpp:165 +#: src/slic3r/GUI/SavePresetDialog.cpp:173 msgid "The supplied name is not valid;" msgstr "Sağlanan ad geçerli değil;" -#: src/slic3r/GUI/SavePresetDialog.cpp:110 +#: src/slic3r/GUI/SavePresetDialog.cpp:174 msgid "the following suffix is not allowed:" msgstr "aşağıdaki son eke izin verilmiyor:" -#: src/slic3r/GUI/SavePresetDialog.cpp:116 +#: src/slic3r/GUI/SavePresetDialog.cpp:180 msgid "The supplied name is not available." msgstr "Verilen isim mevcut değil." -#: src/slic3r/GUI/SavePresetDialog.cpp:122 +#: src/slic3r/GUI/SavePresetDialog.cpp:186 +msgid "The supplied name is used for a system profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:187 msgid "Cannot overwrite a system profile." msgstr "Bir sistem profilinin üzerine yazılamaz." -#: src/slic3r/GUI/SavePresetDialog.cpp:127 +#: src/slic3r/GUI/SavePresetDialog.cpp:192 +msgid "The supplied name is used for a external profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:193 msgid "Cannot overwrite an external profile." msgstr "Harici bir profilin üzerine yazılamaz." -#: src/slic3r/GUI/SavePresetDialog.cpp:134 +#: src/slic3r/GUI/SavePresetDialog.cpp:203 +msgid "Save preset modifications to existing user profile" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:205 +msgid "Nothing changed" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:210 #, boost-format msgid "Preset with name \"%1%\" already exists." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:136 +#: src/slic3r/GUI/SavePresetDialog.cpp:212 #, boost-format msgid "" "Preset with name \"%1%\" already exists and is incompatible with selected " "printer." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:137 +#: src/slic3r/GUI/SavePresetDialog.cpp:213 msgid "Note: This preset will be replaced after saving" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:142 +#: src/slic3r/GUI/SavePresetDialog.cpp:219 msgid "The name cannot be empty." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:147 +#: src/slic3r/GUI/SavePresetDialog.cpp:230 +msgid "The name is too long." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:235 msgid "The name cannot start with space character." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:152 +#: src/slic3r/GUI/SavePresetDialog.cpp:240 msgid "The name cannot end with space character." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:157 +#: src/slic3r/GUI/SavePresetDialog.cpp:245 msgid "The name cannot be the same as a preset alias name." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:191 -#: src/slic3r/GUI/SavePresetDialog.cpp:197 +#: src/slic3r/GUI/SavePresetDialog.cpp:289 msgid "Save preset" msgstr "Ön ayarı kaydet" -#: src/slic3r/GUI/SavePresetDialog.cpp:221 +#: src/slic3r/GUI/SavePresetDialog.cpp:295 +msgid "Save presets" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:302 +msgid "Rename preset" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:327 msgctxt "PresetName" msgid "Copy" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:283 +#: src/slic3r/GUI/SavePresetDialog.cpp:347 +msgid "Save as profile derived from current printer only." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:407 #, boost-format msgid "" "You have selected physical printer \"%1%\" \n" "with related printer preset \"%2%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:322 +#: src/slic3r/GUI/SavePresetDialog.cpp:446 #, boost-format msgid "What would you like to do with \"%1%\" preset after saving?" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:325 +#: src/slic3r/GUI/SavePresetDialog.cpp:449 #, boost-format msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:326 +#: src/slic3r/GUI/SavePresetDialog.cpp:450 #, boost-format msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:327 +#: src/slic3r/GUI/SavePresetDialog.cpp:451 #, boost-format msgid "Just switch to \"%1%\" preset" msgstr "" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2652 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2645 msgid "Stealth" msgstr "Gizli" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2646 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2639 msgid "Normal" msgstr "Normal" -#: src/slic3r/GUI/Selection.cpp:168 +#: src/slic3r/GUI/Selection.cpp:180 msgid "Selection-Add" msgstr "" -#: src/slic3r/GUI/Selection.cpp:209 +#: src/slic3r/GUI/Selection.cpp:221 msgid "Selection-Remove" msgstr "" -#: src/slic3r/GUI/Selection.cpp:241 +#: src/slic3r/GUI/Selection.cpp:253 msgid "Selection-Add Object" msgstr "" -#: src/slic3r/GUI/Selection.cpp:260 +#: src/slic3r/GUI/Selection.cpp:272 msgid "Selection-Remove Object" msgstr "" -#: src/slic3r/GUI/Selection.cpp:278 +#: src/slic3r/GUI/Selection.cpp:290 msgid "Selection-Add Instance" msgstr "" -#: src/slic3r/GUI/Selection.cpp:297 +#: src/slic3r/GUI/Selection.cpp:309 msgid "Selection-Remove Instance" msgstr "" -#: src/slic3r/GUI/Selection.cpp:394 +#: src/slic3r/GUI/Selection.cpp:406 msgid "Selection-Add All" msgstr "" -#: src/slic3r/GUI/Selection.cpp:419 +#: src/slic3r/GUI/Selection.cpp:431 msgid "Selection-Remove All" msgstr "" -#: src/slic3r/GUI/Selection.cpp:950 +#: src/slic3r/GUI/Selection.cpp:1309 msgid "Scale To Fit" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:114 +#: src/slic3r/GUI/Selection.cpp:1691 +msgid "" +"The currently manipulated object is tilted or contains tilted parts " +"(rotation angles are not multiples of 90°). Non-uniform scaling of tilted " +"objects is only possible in non-local coordinate systems, once the rotation " +"is embedded into the object coordinates." +msgstr "" + +#: src/slic3r/GUI/Selection.cpp:1694 +msgid "This operation is irreversible." +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:117 msgid "Data to send" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:550 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:618 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:557 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:624 msgid "Send system info" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:581 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:587 #, boost-format msgid "" "This is the first time you are running %1%. We would like to ask you to send " @@ -8085,18 +9639,18 @@ msgid "" "version)." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:585 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:591 msgid "" "If we know your hardware, operating system, etc., it will greatly help us in " "development and prioritization, because we will be able to focus our effort " "more efficiently and spend time on features that are needed the most." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:588 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:594 msgid "Is it safe?" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:590 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:596 #, boost-format msgid "" "We do not send any personal information nor anything that would allow us to " @@ -8107,81 +9661,86 @@ msgid "" "inspect the code actually performing the communication, see %1%." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:614 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:620 msgid "Show verbatim data that will be sent" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:616 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:622 msgid "Ask me next time" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:617 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:623 msgid "Do not send anything" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:703 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:709 msgid "System info sent successfully. Thank you." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:706 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:712 msgid "Sending system info failed!" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:713 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:719 msgid "Sending system info was cancelled." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:720 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:726 msgid "Sending system info..." msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:84 +#: src/slic3r/GUI/SysInfoDialog.cpp:92 msgid "System Information" msgstr "Sistem bilgisi" -#: src/slic3r/GUI/SysInfoDialog.cpp:150 +#: src/slic3r/GUI/SysInfoDialog.cpp:160 msgid "Blacklisted libraries loaded into PrusaSlicer process:" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:162 +#: src/slic3r/GUI/SysInfoDialog.cpp:172 msgid "Eigen vectorization supported:" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:169 +#: src/slic3r/GUI/SysInfoDialog.cpp:179 msgid "Copy to Clipboard" msgstr "Panoya Kopyala" -#: src/slic3r/GUI/Tab.cpp:114 src/libslic3r/PrintConfig.cpp:565 +#: src/slic3r/GUI/Tab.cpp:68 src/libslic3r/PrintConfig.cpp:668 msgid "Compatible printers" msgstr "Uyumlu yazıcılar" -#: src/slic3r/GUI/Tab.cpp:115 +#: src/slic3r/GUI/Tab.cpp:69 msgid "Select the printers this profile is compatible with." msgstr "Bu profilin uyumlu olduğu yazıcıları seç." -#: src/slic3r/GUI/Tab.cpp:120 src/libslic3r/PrintConfig.cpp:580 +#: src/slic3r/GUI/Tab.cpp:74 src/libslic3r/PrintConfig.cpp:683 msgid "Compatible print profiles" msgstr "Uyumlu baskı profilleri" -#: src/slic3r/GUI/Tab.cpp:121 +#: src/slic3r/GUI/Tab.cpp:75 msgid "Select the print profiles this profile is compatible with." msgstr "Bu profilin uyumlu olduğu baskı profillerini seçin." -#: src/slic3r/GUI/Tab.cpp:216 +#: src/slic3r/GUI/Tab.cpp:165 msgid "Compare this preset with some another" msgstr "" #. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:218 +#: src/slic3r/GUI/Tab.cpp:167 #, c-format, boost-format msgid "Save current %s" msgstr "Mevcut %s değerini kaydet" -#: src/slic3r/GUI/Tab.cpp:219 +#: src/slic3r/GUI/Tab.cpp:168 +#, c-format, boost-format +msgid "Rename current %s" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:170 msgid "Delete this preset" msgstr "Bu hazır ayarı sil" -#: src/slic3r/GUI/Tab.cpp:223 +#: src/slic3r/GUI/Tab.cpp:174 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." @@ -8189,239 +9748,247 @@ msgstr "" "Daha fazla bilgi bulmak için imleci düğmelerin üzerine getirin \\ veya bu " "düğmeye tıklayın." -#: src/slic3r/GUI/Tab.cpp:227 +#: src/slic3r/GUI/Tab.cpp:178 #, boost-format msgid "Search in settings [%1%]" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1298 +#: src/slic3r/GUI/Tab.cpp:1243 msgid "Detach from system preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1311 +#: src/slic3r/GUI/Tab.cpp:1256 msgid "" "A copy of the current system preset will be created, which will be detached " "from the system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1312 +#: src/slic3r/GUI/Tab.cpp:1257 msgid "" "The current custom preset will be detached from the parent system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1315 +#: src/slic3r/GUI/Tab.cpp:1260 msgid "Modifications to the current profile will be saved." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1321 +#: src/slic3r/GUI/Tab.cpp:1266 msgid "Detach preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1347 +#: src/slic3r/GUI/Tab.cpp:1292 msgid "This is a default preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1349 +#: src/slic3r/GUI/Tab.cpp:1294 msgid "This is a system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1351 +#: src/slic3r/GUI/Tab.cpp:1296 msgid "Current preset is inherited from the default preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1355 +#: src/slic3r/GUI/Tab.cpp:1300 msgid "Current preset is inherited from" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1359 +#: src/slic3r/GUI/Tab.cpp:1304 msgid "It can't be deleted or modified." msgstr "Silinemez veya değiştirilemez." -#: src/slic3r/GUI/Tab.cpp:1360 +#: src/slic3r/GUI/Tab.cpp:1305 msgid "" "Any modifications should be saved as a new preset inherited from this one." msgstr "" "Herhangi bir değişiklik, bundan devralınan yeni bir ön ayar olarak " "kaydedilmelidir." -#: src/slic3r/GUI/Tab.cpp:1361 +#: src/slic3r/GUI/Tab.cpp:1306 msgid "To do that please specify a new name for the preset." msgstr "Bunu yapmak için lütfen hazır ayar için yeni bir ad belirtin." -#: src/slic3r/GUI/Tab.cpp:1365 +#: src/slic3r/GUI/Tab.cpp:1310 msgid "Additional information:" msgstr "Ek bilgi:" -#: src/slic3r/GUI/Tab.cpp:1371 +#: src/slic3r/GUI/Tab.cpp:1316 msgid "printer model" msgstr "yazıcı modeli" -#: src/slic3r/GUI/Tab.cpp:1379 +#: src/slic3r/GUI/Tab.cpp:1324 msgid "default print profile" msgstr "varsayılan yazdırma profili" -#: src/slic3r/GUI/Tab.cpp:1382 +#: src/slic3r/GUI/Tab.cpp:1327 msgid "default filament profile" msgstr "varsayılan filament profili" -#: src/slic3r/GUI/Tab.cpp:1396 +#: src/slic3r/GUI/Tab.cpp:1341 msgid "default SLA material profile" msgstr "varsayılan SLA malzeme profili" -#: src/slic3r/GUI/Tab.cpp:1400 +#: src/slic3r/GUI/Tab.cpp:1345 msgid "default SLA print profile" msgstr "varsayılan SLA yazdırma profili" -#: src/slic3r/GUI/Tab.cpp:1408 +#: src/slic3r/GUI/Tab.cpp:1353 msgid "full profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1409 +#: src/slic3r/GUI/Tab.cpp:1354 msgid "symbolic profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4657 +#: src/slic3r/GUI/Tab.cpp:1392 src/slic3r/GUI/Tab.cpp:4940 msgid "Layers and perimeters" msgstr "Katmanlar ve duvarlar" -#: src/slic3r/GUI/Tab.cpp:1453 +#: src/slic3r/GUI/Tab.cpp:1398 msgid "Vertical shells" msgstr "Duvar sayısı" -#: src/slic3r/GUI/Tab.cpp:1465 +#: src/slic3r/GUI/Tab.cpp:1410 msgid "Horizontal shells" msgstr "Yatay katmanlar" -#: src/slic3r/GUI/Tab.cpp:1466 src/libslic3r/PrintConfig.cpp:2417 +#: src/slic3r/GUI/Tab.cpp:1411 src/libslic3r/PrintConfig.cpp:2448 msgid "Solid layers" msgstr "Katı katmanlar" -#: src/slic3r/GUI/Tab.cpp:1471 +#: src/slic3r/GUI/Tab.cpp:1416 msgid "Minimum shell thickness" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1482 +#: src/slic3r/GUI/Tab.cpp:1427 msgid "Quality (slower slicing)" msgstr "Kalite (daha yavaş dilimleme)" -#: src/slic3r/GUI/Tab.cpp:1497 +#: src/slic3r/GUI/Tab.cpp:1444 msgid "Fuzzy skin (experimental)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1520 +#: src/slic3r/GUI/Tab.cpp:1467 msgid "Reducing printing time" msgstr "Baskı süresine etki eden ayarlar" -#: src/slic3r/GUI/Tab.cpp:1535 src/libslic3r/ExtrusionEntity.cpp:370 +#: src/slic3r/GUI/Tab.cpp:1482 msgid "Skirt" msgstr "Etek (Skirt)" -#: src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1504 msgid "Raft" msgstr "Alt Destek (Raft)" -#: src/slic3r/GUI/Tab.cpp:1562 +#: src/slic3r/GUI/Tab.cpp:1509 msgid "Options for support material and raft" msgstr "Destek ve alt destek (raft) için seçenekler" -#: src/slic3r/GUI/Tab.cpp:1582 +#: src/slic3r/GUI/Tab.cpp:1528 +msgid "Organic supports" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1537 msgid "Speed for print moves" msgstr "Baskı esnasında kullanılacak hızlar" -#: src/slic3r/GUI/Tab.cpp:1595 +#: src/slic3r/GUI/Tab.cpp:1550 +msgid "Dynamic overhang speed" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1557 msgid "Speed for non-print moves" msgstr "Baskı haricinde kullanılacak hızlar" -#: src/slic3r/GUI/Tab.cpp:1599 +#: src/slic3r/GUI/Tab.cpp:1561 msgid "Modifiers" msgstr "Düzenleyiciler" -#: src/slic3r/GUI/Tab.cpp:1603 +#: src/slic3r/GUI/Tab.cpp:1565 msgid "Acceleration control (advanced)" msgstr "Hızlanma kontrolü (gelişmiş)" -#: src/slic3r/GUI/Tab.cpp:1614 +#: src/slic3r/GUI/Tab.cpp:1576 msgid "Autospeed (advanced)" msgstr "Otomatik hız (gelişmiş)" -#: src/slic3r/GUI/Tab.cpp:1618 +#: src/slic3r/GUI/Tab.cpp:1580 msgid "Pressure equalizer (experimental)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1622 +#: src/slic3r/GUI/Tab.cpp:1584 msgid "Multiple Extruders" msgstr "Çoklu Ekstrüder" -#: src/slic3r/GUI/Tab.cpp:1630 +#: src/slic3r/GUI/Tab.cpp:1592 msgid "Ooze prevention" msgstr "Sızıntı önleme" -#: src/slic3r/GUI/Tab.cpp:1650 +#: src/slic3r/GUI/Tab.cpp:1596 +msgid "Wipe tower" +msgstr "Temizleme kulesi" + +#: src/slic3r/GUI/Tab.cpp:1612 msgid "Extrusion width" msgstr "Ekstrüzyon genişliği" -#: src/slic3r/GUI/Tab.cpp:1660 +#: src/slic3r/GUI/Tab.cpp:1622 msgid "Overlap" msgstr "Üzerine bindirme" -#: src/slic3r/GUI/Tab.cpp:1663 +#: src/slic3r/GUI/Tab.cpp:1625 msgid "Flow" msgstr "Akış" -#: src/slic3r/GUI/Tab.cpp:1674 src/slic3r/GUI/Tab.cpp:1700 -msgid "Other" -msgstr "Diğer" - -#: src/slic3r/GUI/Tab.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:1636 msgid "Arachne perimeter generator" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1685 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1644 src/slic3r/GUI/Tab.cpp:4990 msgid "Output options" msgstr "Çıktı seçenekleri" -#: src/slic3r/GUI/Tab.cpp:1686 +#: src/slic3r/GUI/Tab.cpp:1645 msgid "Sequential printing" msgstr "Sıralı baskı" -#: src/slic3r/GUI/Tab.cpp:1688 +#: src/slic3r/GUI/Tab.cpp:1647 msgid "Extruder clearance" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:4735 +#: src/slic3r/GUI/Tab.cpp:1652 src/slic3r/GUI/Tab.cpp:4991 msgid "Output file" msgstr "Çıktı dosyası" -#: src/slic3r/GUI/Tab.cpp:1712 src/libslic3r/PrintConfig.cpp:2042 +#: src/slic3r/GUI/Tab.cpp:1671 src/libslic3r/PrintConfig.cpp:2072 msgid "Post-processing scripts" msgstr "İşlem sonrası komut dosyaları" -#: src/slic3r/GUI/Tab.cpp:1724 src/slic3r/GUI/Tab.cpp:1725 -#: src/slic3r/GUI/Tab.cpp:2110 src/slic3r/GUI/Tab.cpp:2111 -#: src/slic3r/GUI/Tab.cpp:2498 src/slic3r/GUI/Tab.cpp:2499 -#: src/slic3r/GUI/Tab.cpp:2571 src/slic3r/GUI/Tab.cpp:2572 -#: src/slic3r/GUI/Tab.cpp:3957 src/slic3r/GUI/Tab.cpp:4585 -#: src/slic3r/GUI/Tab.cpp:4586 +#: src/slic3r/GUI/Tab.cpp:1683 src/slic3r/GUI/Tab.cpp:1684 +#: src/slic3r/GUI/Tab.cpp:2080 src/slic3r/GUI/Tab.cpp:2081 +#: src/slic3r/GUI/Tab.cpp:2486 src/slic3r/GUI/Tab.cpp:2487 +#: src/slic3r/GUI/Tab.cpp:2564 src/slic3r/GUI/Tab.cpp:2565 +#: src/slic3r/GUI/Tab.cpp:4182 src/slic3r/GUI/Tab.cpp:4822 +#: src/slic3r/GUI/Tab.cpp:4823 msgid "Notes" msgstr "Notlar" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:2088 +#: src/slic3r/GUI/Tab.cpp:2493 src/slic3r/GUI/Tab.cpp:2571 +#: src/slic3r/GUI/Tab.cpp:4830 src/slic3r/GUI/Tab.cpp:4996 msgid "Dependencies" msgstr "Bağımlılıklar" -#: src/slic3r/GUI/Tab.cpp:1732 src/slic3r/GUI/Tab.cpp:2119 -#: src/slic3r/GUI/Tab.cpp:2506 src/slic3r/GUI/Tab.cpp:2579 -#: src/slic3r/GUI/Tab.cpp:4594 src/slic3r/GUI/Tab.cpp:4741 +#: src/slic3r/GUI/Tab.cpp:1691 src/slic3r/GUI/Tab.cpp:2089 +#: src/slic3r/GUI/Tab.cpp:2494 src/slic3r/GUI/Tab.cpp:2572 +#: src/slic3r/GUI/Tab.cpp:4831 src/slic3r/GUI/Tab.cpp:4997 msgid "Profile dependencies" msgstr "Profil bağımlılıkları" -#: src/slic3r/GUI/Tab.cpp:1771 +#: src/slic3r/GUI/Tab.cpp:1723 msgid "Post processing scripts shall modify G-code file in place." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1850 +#: src/slic3r/GUI/Tab.cpp:1802 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8434,7 +10001,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:1855 +#: src/slic3r/GUI/Tab.cpp:1807 msgid "Found reserved keywords in" msgstr "" @@ -8442,75 +10009,91 @@ msgstr "" msgid "Filament Overrides" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1992 +#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2827 +msgid "Retraction" +msgstr "Geri çekme" + +#: src/slic3r/GUI/Tab.cpp:1951 +msgid "Temperature" +msgstr "Sıcaklık" + +#: src/slic3r/GUI/Tab.cpp:1955 msgid "Nozzle" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1997 +#: src/slic3r/GUI/Tab.cpp:1960 msgid "Bed" msgstr "Tabla" -#: src/slic3r/GUI/Tab.cpp:2002 +#: src/slic3r/GUI/Tab.cpp:1965 msgid "Cooling" msgstr "Soğutma" -#: src/slic3r/GUI/Tab.cpp:2004 src/libslic3r/PrintConfig.cpp:1936 -#: src/libslic3r/PrintConfig.cpp:2994 +#: src/slic3r/GUI/Tab.cpp:1967 src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "Enable" msgstr "Etkin" -#: src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/Tab.cpp:1978 msgid "Fan settings" msgstr "Fan ayarları" -#: src/slic3r/GUI/Tab.cpp:2026 +#: src/slic3r/GUI/Tab.cpp:1979 +msgid "Fan speed" +msgstr "Fan hızı" + +#: src/slic3r/GUI/Tab.cpp:1989 +msgid "Dynamic fan speeds" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1996 msgid "Cooling thresholds" msgstr "Soğutma eşikleri" -#: src/slic3r/GUI/Tab.cpp:2032 +#: src/slic3r/GUI/Tab.cpp:2002 msgid "Filament properties" msgstr "Filament özellikleri" -#: src/slic3r/GUI/Tab.cpp:2039 +#: src/slic3r/GUI/Tab.cpp:2009 msgid "Print speed override" msgstr "Baskı hızı geçersiz kılma" -#: src/slic3r/GUI/Tab.cpp:2049 +#: src/slic3r/GUI/Tab.cpp:2019 msgid "Wipe tower parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2052 +#: src/slic3r/GUI/Tab.cpp:2022 msgid "Toolchange parameters with single extruder MM printers" msgstr "" "Tek ekstrüder Çoklu Filament (MM) yazıcılarla takım değiştirme parametreleri" -#: src/slic3r/GUI/Tab.cpp:2065 +#: src/slic3r/GUI/Tab.cpp:2035 msgid "Ramming settings" msgstr "Sıkıştırma ayarları" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 -#: src/slic3r/GUI/Tab.cpp:4264 src/libslic3r/GCode.cpp:733 -#: src/libslic3r/PrintConfig.cpp:2500 +#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:2398 +#: src/slic3r/GUI/Tab.cpp:4493 src/libslic3r/GCode.cpp:684 +#: src/libslic3r/PrintConfig.cpp:2532 msgid "Custom G-code" msgstr "Özel G-code" -#: src/slic3r/GUI/Tab.cpp:2090 src/slic3r/GUI/Tab.cpp:2411 -#: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2450 -#: src/libslic3r/PrintConfig.cpp:2465 +#: src/slic3r/GUI/Tab.cpp:2060 src/slic3r/GUI/Tab.cpp:2399 +#: src/libslic3r/GCode.cpp:658 src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2497 msgid "Start G-code" msgstr "Başlangıç G-code" -#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:2421 -#: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:685 -#: src/libslic3r/PrintConfig.cpp:695 +#: src/slic3r/GUI/Tab.cpp:2070 src/slic3r/GUI/Tab.cpp:2409 +#: src/libslic3r/GCode.cpp:659 src/libslic3r/PrintConfig.cpp:788 +#: src/libslic3r/PrintConfig.cpp:798 msgid "End G-code" msgstr "Bitiş G-code" -#: src/slic3r/GUI/Tab.cpp:2153 +#: src/slic3r/GUI/Tab.cpp:2115 msgid "Volumetric flow hints not available" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2257 +#: src/slic3r/GUI/Tab.cpp:2241 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -8523,20 +10106,20 @@ msgid "" "physical_printer directory." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2291 src/slic3r/GUI/Tab.cpp:2518 +#: src/slic3r/GUI/Tab.cpp:2275 src/slic3r/GUI/Tab.cpp:2506 msgid "Size and coordinates" msgstr "Boyut ve koordinatlar" -#: src/slic3r/GUI/Tab.cpp:2300 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:2284 src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "Capabilities" msgstr "Kabiliyetler" -#: src/slic3r/GUI/Tab.cpp:2305 +#: src/slic3r/GUI/Tab.cpp:2289 msgid "Number of extruders of the printer." msgstr "Yazıcının ekstrüder sayısı." -#: src/slic3r/GUI/Tab.cpp:2334 +#: src/slic3r/GUI/Tab.cpp:2322 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -8544,123 +10127,127 @@ msgid "" "nozzle diameter value?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2338 src/slic3r/GUI/Tab.cpp:2782 -#: src/libslic3r/PrintConfig.cpp:1900 +#: src/slic3r/GUI/Tab.cpp:2326 src/slic3r/GUI/Tab.cpp:2714 +#: src/libslic3r/PrintConfig.cpp:1937 msgid "Nozzle diameter" msgstr "Nozül çapı" -#: src/slic3r/GUI/Tab.cpp:2431 src/libslic3r/GCode.cpp:709 -#: src/libslic3r/PrintConfig.cpp:425 +#: src/slic3r/GUI/Tab.cpp:2419 src/libslic3r/GCode.cpp:660 +#: src/libslic3r/PrintConfig.cpp:444 msgid "Before layer change G-code" msgstr "Katman değiştirmeden önce G-code" -#: src/slic3r/GUI/Tab.cpp:2441 src/libslic3r/GCode.cpp:710 -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/slic3r/GUI/Tab.cpp:2429 src/libslic3r/GCode.cpp:661 +#: src/libslic3r/PrintConfig.cpp:1665 msgid "After layer change G-code" msgstr "Katman değişiminden sonra G-code" -#: src/slic3r/GUI/Tab.cpp:2451 src/libslic3r/GCode.cpp:711 -#: src/libslic3r/PrintConfig.cpp:2877 +#: src/slic3r/GUI/Tab.cpp:2439 src/libslic3r/GCode.cpp:662 +#: src/libslic3r/PrintConfig.cpp:2965 msgid "Tool change G-code" msgstr "Takım değiştirme G kodu" -#: src/slic3r/GUI/Tab.cpp:2461 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2449 src/libslic3r/GCode.cpp:663 msgid "Between objects G-code (for sequential printing)" msgstr "Nesneler arasında Gcode (sıralı baskı için)" -#: src/slic3r/GUI/Tab.cpp:2471 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2459 src/libslic3r/GCode.cpp:664 msgid "Color Change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2480 src/libslic3r/GCode.cpp:714 -#: src/libslic3r/PrintConfig.cpp:2491 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:665 +#: src/libslic3r/PrintConfig.cpp:2523 msgid "Pause Print G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2489 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:666 msgid "Template Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2525 +#: src/slic3r/GUI/Tab.cpp:2513 msgid "Display" msgstr "Ekran" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2528 msgid "Tilt" msgstr "Eğim" -#: src/slic3r/GUI/Tab.cpp:2541 +#: src/slic3r/GUI/Tab.cpp:2529 msgid "Tilt time" msgstr "Yatırma zamanı" -#: src/slic3r/GUI/Tab.cpp:2548 src/slic3r/GUI/Tab.cpp:4575 +#: src/slic3r/GUI/Tab.cpp:2536 src/slic3r/GUI/Tab.cpp:4812 msgid "Corrections" msgstr "Düzeltmeler" -#: src/slic3r/GUI/Tab.cpp:2561 src/slic3r/GUI/Tab.cpp:4571 +#: src/slic3r/GUI/Tab.cpp:2549 src/slic3r/GUI/Tab.cpp:4808 msgid "Exposure" msgstr "Poz" -#: src/slic3r/GUI/Tab.cpp:2622 src/slic3r/GUI/Tab.cpp:2709 -#: src/libslic3r/PrintConfig.cpp:1655 src/libslic3r/PrintConfig.cpp:1690 -#: src/libslic3r/PrintConfig.cpp:1707 src/libslic3r/PrintConfig.cpp:1724 -#: src/libslic3r/PrintConfig.cpp:1740 src/libslic3r/PrintConfig.cpp:1750 -#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1773 -#: src/libslic3r/PrintConfig.cpp:1783 +#: src/slic3r/GUI/Tab.cpp:2556 +msgid "Output" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2615 src/slic3r/GUI/Tab.cpp:2875 +#: src/libslic3r/PrintConfig.cpp:1694 src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1744 src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1777 src/libslic3r/PrintConfig.cpp:1787 +#: src/libslic3r/PrintConfig.cpp:1797 src/libslic3r/PrintConfig.cpp:1810 +#: src/libslic3r/PrintConfig.cpp:1820 msgid "Machine limits" msgstr "Makine sınırları" -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2638 msgid "Values in this column are for Normal mode" msgstr "Bu sütundaki değerler Normal mod içindir" -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2644 msgid "Values in this column are for Stealth mode" msgstr "Bu sütundaki değerler Gizli mod içindir" -#: src/slic3r/GUI/Tab.cpp:2660 +#: src/slic3r/GUI/Tab.cpp:2653 msgid "Maximum feedrates" msgstr "En yüksek hızlar" -#: src/slic3r/GUI/Tab.cpp:2665 +#: src/slic3r/GUI/Tab.cpp:2658 msgid "Maximum accelerations" msgstr "En yüksek ivme (Acceleration)" -#: src/slic3r/GUI/Tab.cpp:2674 +#: src/slic3r/GUI/Tab.cpp:2667 msgid "Jerk limits" msgstr "Ani Hareket (Jerk) sınırları" -#: src/slic3r/GUI/Tab.cpp:2680 +#: src/slic3r/GUI/Tab.cpp:2673 msgid "Minimum feedrates" msgstr "En düşük besleme hızı" -#: src/slic3r/GUI/Tab.cpp:2734 src/slic3r/GUI/Tab.cpp:2743 -msgid "Single extruder MM setup" -msgstr "Tek ekstrüder çoklu filament kurulumu" - -#: src/slic3r/GUI/Tab.cpp:2744 -msgid "Single extruder multimaterial parameters" -msgstr "Tek ekstrüder çok yönlü parametreler" - -#: src/slic3r/GUI/Tab.cpp:2779 +#: src/slic3r/GUI/Tab.cpp:2711 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2804 +#: src/slic3r/GUI/Tab.cpp:2739 +msgid "Reset to Filament Color" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2775 +msgid "Apply below setting to other extruders" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2820 msgid "Layer height limits" msgstr "Katman yüksekliği sınırları" -#: src/slic3r/GUI/Tab.cpp:2809 +#: src/slic3r/GUI/Tab.cpp:2824 msgid "Position (for multi-extruder printers)" msgstr "Konum (çoklu ekstrüder yazıcıları için)" -#: src/slic3r/GUI/Tab.cpp:2815 +#: src/slic3r/GUI/Tab.cpp:2830 msgid "Only lift Z" msgstr "Koşullu Z kaldırma" -#: src/slic3r/GUI/Tab.cpp:2828 +#: src/slic3r/GUI/Tab.cpp:2843 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -8668,11 +10255,15 @@ msgstr "" "Takım devre dışı bırakıldığında geri çekme (çoklu ekstrüder ayarları için " "gelişmiş ayarlar)" -#: src/slic3r/GUI/Tab.cpp:2835 -msgid "Reset to Filament Color" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:2900 src/slic3r/GUI/Tab.cpp:2909 +msgid "Single extruder MM setup" +msgstr "Tek ekstrüder çoklu filament kurulumu" -#: src/slic3r/GUI/Tab.cpp:3012 +#: src/slic3r/GUI/Tab.cpp:2910 +msgid "Single extruder multimaterial parameters" +msgstr "Tek ekstrüder çok yönlü parametreler" + +#: src/slic3r/GUI/Tab.cpp:3074 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -8683,38 +10274,53 @@ msgstr "" "Donanımsal Geri Çekmeyi etkinleştirmek için Temizleme seçeneğini kapatmamı " "iste misiniz?" -#: src/slic3r/GUI/Tab.cpp:3014 +#: src/slic3r/GUI/Tab.cpp:3076 msgid "Firmware Retraction" msgstr "Firmware Retraction" -#: src/slic3r/GUI/Tab.cpp:3319 +#: src/slic3r/GUI/Tab.cpp:3384 msgid "New printer preset selected" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3625 +#: src/slic3r/GUI/Tab.cpp:3758 msgid "Detached" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3857 +msgid "" +"The physical printer below is based on the preset, you are going to rename." +msgid_plural "" +"The physical printers below are based on the preset, you are going to rename." +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Tab.cpp:3862 +msgid "Note, that the selected preset will be renamed in this printer too." +msgid_plural "" +"Note, that the selected preset will be renamed in these printers too." +msgstr[0] "" +msgstr[1] "" + +#: src/slic3r/GUI/Tab.cpp:3924 msgid "remove" msgstr "kaldır" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3924 msgid "delete" msgstr "sil" -#: src/slic3r/GUI/Tab.cpp:3711 +#: src/slic3r/GUI/Tab.cpp:3933 msgid "It's a last preset for this physical printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3716 +#: src/slic3r/GUI/Tab.cpp:3938 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " "\"%2%\"?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3728 +#: src/slic3r/GUI/Tab.cpp:3950 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -8722,14 +10328,14 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3733 +#: src/slic3r/GUI/Tab.cpp:3955 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3738 +#: src/slic3r/GUI/Tab.cpp:3960 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -8739,7 +10345,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3743 +#: src/slic3r/GUI/Tab.cpp:3965 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -8747,84 +10353,84 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3748 +#: src/slic3r/GUI/Tab.cpp:3970 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "%1% ayarını seçili ön ayar yapmak istediğinizden emin misiniz?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3753 +#: src/slic3r/GUI/Tab.cpp:3975 #, boost-format msgid "%1% Preset" msgstr "%1% Ön Ayar" -#: src/slic3r/GUI/Tab.cpp:3836 src/slic3r/GUI/Tab.cpp:4198 +#: src/slic3r/GUI/Tab.cpp:4061 src/slic3r/GUI/Tab.cpp:4423 msgid "Set" msgstr "Ayarla" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:4180 msgid "Find" msgstr "Bul" -#: src/slic3r/GUI/Tab.cpp:3956 +#: src/slic3r/GUI/Tab.cpp:4181 msgid "Replace with" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4045 +#: src/slic3r/GUI/Tab.cpp:4270 msgid "Regular expression" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4049 +#: src/slic3r/GUI/Tab.cpp:4274 msgid "Case insensitive" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4053 +#: src/slic3r/GUI/Tab.cpp:4278 msgid "Whole word" msgstr "Tam kelime" -#: src/slic3r/GUI/Tab.cpp:4057 +#: src/slic3r/GUI/Tab.cpp:4282 msgid "Match single line" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4160 +#: src/slic3r/GUI/Tab.cpp:4385 msgid "Are you sure you want to delete all substitutions?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4292 +#: src/slic3r/GUI/Tab.cpp:4521 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4295 +#: src/slic3r/GUI/Tab.cpp:4524 msgid "" "Machine limits will NOT be emitted to G-code, however they will be used to " "estimate print time, which may therefore not be accurate as the printer may " "apply a different set of machine limits." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4299 +#: src/slic3r/GUI/Tab.cpp:4528 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4321 +#: src/slic3r/GUI/Tab.cpp:4550 msgid "LOCKED LOCK" msgstr "KAPALI KİLİT" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4323 +#: src/slic3r/GUI/Tab.cpp:4552 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4325 +#: src/slic3r/GUI/Tab.cpp:4554 msgid "UNLOCKED LOCK" msgstr "AÇIK KİLİT" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4327 +#: src/slic3r/GUI/Tab.cpp:4556 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -8832,23 +10438,23 @@ msgid "" "to the system (or default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4332 +#: src/slic3r/GUI/Tab.cpp:4561 msgid "WHITE BULLET" msgstr "BEYAZ NOKTA" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4334 +#: src/slic3r/GUI/Tab.cpp:4563 msgid "" "for the left button: indicates a non-system (or non-default) preset,\n" "for the right button: indicates that the settings hasn't been modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4337 +#: src/slic3r/GUI/Tab.cpp:4566 msgid "BACK ARROW" msgstr "GERİ OK" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4339 +#: src/slic3r/GUI/Tab.cpp:4568 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -8860,13 +10466,13 @@ msgstr "" "Geçerli seçenek grubunun tüm ayarlarını en son kaydedilen ön ayara " "sıfırlamak için GERİ OK tuşuna basın." -#: src/slic3r/GUI/Tab.cpp:4349 +#: src/slic3r/GUI/Tab.cpp:4578 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4351 +#: src/slic3r/GUI/Tab.cpp:4580 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " "equal to the system (or default) values for the current option group.\n" @@ -8874,11 +10480,11 @@ msgid "" "default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4354 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4357 +#: src/slic3r/GUI/Tab.cpp:4586 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -8886,7 +10492,7 @@ msgstr "" "BEYAZ NOKTA simgesi ayarların geçerli seçenek grubu için en son kaydedilen " "ön ayardakiyle aynı olduğunu gösterir." -#: src/slic3r/GUI/Tab.cpp:4359 +#: src/slic3r/GUI/Tab.cpp:4588 msgid "" "BACK ARROW icon indicates that the settings were changed and are not equal " "to the last saved preset for the current option group.\n" @@ -8898,20 +10504,20 @@ msgstr "" "Geçerli seçenek grubunun tüm ayarlarını en son kaydedilen ön ayara " "sıfırlamak için tıklayın." -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4594 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4366 +#: src/slic3r/GUI/Tab.cpp:4595 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" "Click to reset current value to the system (or default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4601 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -8919,7 +10525,7 @@ msgstr "" "BEYAZ NOKTA simgesi, değerin son kaydedilen ön ayardakiyle aynı olduğunu " "gösterir." -#: src/slic3r/GUI/Tab.cpp:4373 +#: src/slic3r/GUI/Tab.cpp:4602 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -8929,105 +10535,103 @@ msgstr "" "olmadığını gösterir.\n" "Geçerli değeri son kaydedilen ön ayara sıfırlamak için tıklayın." -#: src/slic3r/GUI/Tab.cpp:4527 src/slic3r/GUI/Tab.cpp:4529 +#: src/slic3r/GUI/Tab.cpp:4764 src/slic3r/GUI/Tab.cpp:4766 msgid "Material" msgstr "Malzeme" -#: src/slic3r/GUI/Tab.cpp:4614 src/slic3r/GUI/Tab.cpp:4615 +#: src/slic3r/GUI/Tab.cpp:4851 src/slic3r/GUI/Tab.cpp:4852 msgid "Material printing profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4667 +#: src/slic3r/GUI/Tab.cpp:4901 msgid "Support head" msgstr "Destek kafa" -#: src/slic3r/GUI/Tab.cpp:4672 +#: src/slic3r/GUI/Tab.cpp:4906 msgid "Support pillar" msgstr "Destek ayağı" -#: src/slic3r/GUI/Tab.cpp:4695 +#: src/slic3r/GUI/Tab.cpp:4929 msgid "Connection of the support sticks and junctions" msgstr "Destek çubuklarının ve birleşimlerinin bağlantısı" -#: src/slic3r/GUI/Tab.cpp:4700 +#: src/slic3r/GUI/Tab.cpp:4956 msgid "Automatic generation" msgstr "Otomatik oluşturma" -#: src/slic3r/GUI/Tab.cpp:4775 +#: src/slic3r/GUI/Tab.cpp:5024 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" "To enable \"%1%\", please switch off \"%2%\"" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3724 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3497 msgid "Object elevation" msgstr "Nesne yüksekliği" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3826 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3958 msgid "Pad around object" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:153 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:162 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1047 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1100 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1115 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1130 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1145 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:147 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:156 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:165 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1107 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1122 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1137 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1152 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1197 msgid "Undef" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:772 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:792 msgid "Unsaved Changes" msgstr "Kaydedilmemiş Değişiklikler" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:790 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:810 msgid "Switching Presets: Unsaved Changes" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:832 -msgid "Old Value" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:858 +msgid "Original Value" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:859 +msgid "Modified Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:833 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:861 msgid "New Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:867 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 msgid "Keep" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1569 msgid "Transfer" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 msgid "Don't save" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 -msgid "Discard" -msgstr "" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:877 -msgid "Save" -msgstr "Kaydet" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:898 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:926 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "create new project" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:927 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "switch a preset" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:900 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:928 msgid "" "You will not be asked about the unsaved changes in presets the next time " "you: \n" @@ -9035,179 +10639,278 @@ msgid "" "- Loading a new project while some presets are modified" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:903 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:931 msgid "PrusaSlicer will remember your action." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:904 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:932 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" "to be asked about unsaved changes again." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:964 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1772 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will not be saved" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will be discarded." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:941 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:969 msgid "Save the selected options." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:942 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:970 msgid "Keep the selected settings." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:943 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:971 msgid "Transfer the selected settings to the newly selected preset." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:947 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:975 #, boost-format msgid "Save the selected options to preset \"%1%\"." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:948 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:976 #, boost-format msgid "Transfer the selected options to the newly selected preset \"%1%\"." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1224 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1237 msgid "The following preset was modified" msgid_plural "The following presets were modified" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1230 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1243 #, boost-format msgid "Preset \"%1%\" has the following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1234 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1247 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new printer profile and it has the " "following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1235 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1248 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new print profile and it has the " "following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1297 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1850 msgid "Extruders count" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 -msgid "Select presets to compare" -msgstr "" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1326 +msgid "The preset modifications are successfully saved" +msgid_plural "The presets modifications are successfully saved" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1515 msgid "Show all presets (including incompatible)" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1533 +msgid "Select presets to compare" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1545 msgid "Left Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1546 msgid "Right Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1595 +msgid "" +"Transfer the selected options from left preset to the right.\n" +"Note: New modified presets will be selected in settings tabs after close " +"this dialog." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1603 +msgid "Save the selected options from left preset to the right." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1621 +msgid "Transfer values from left to right" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1622 +msgid "" +"If enabled, this dialog can be used for transver selected values from left " +"to right preset." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1807 msgid "One of the presets doesn't found" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1818 msgid "Compared presets has different printer technology" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1832 msgid "Presets are the same" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1840 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef category" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef group" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:2016 +msgid "Modified" +msgstr "Değişiklik" + +#: src/slic3r/GUI/UpdateDialogs.cpp:41 msgid "Update available" msgstr "Güncelleme uygun" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UpdateDialogs.cpp:41 #, c-format, boost-format msgid "New version of %s is available" msgstr "%s yeni sürümü mevcut" -#: src/slic3r/GUI/UpdateDialogs.cpp:42 +#: src/slic3r/GUI/UpdateDialogs.cpp:46 src/slic3r/GUI/UpdateDialogs.cpp:101 msgid "Current version:" msgstr "Mevcut sürüm:" -#: src/slic3r/GUI/UpdateDialogs.cpp:44 +#: src/slic3r/GUI/UpdateDialogs.cpp:48 src/slic3r/GUI/UpdateDialogs.cpp:103 +#: src/slic3r/GUI/UpdateDialogs.cpp:141 msgid "New version:" msgstr "Yeni sürüm:" -#: src/slic3r/GUI/UpdateDialogs.cpp:52 +#: src/slic3r/GUI/UpdateDialogs.cpp:56 msgid "Changelog & Download" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:59 src/slic3r/GUI/UpdateDialogs.cpp:133 -#: src/slic3r/GUI/UpdateDialogs.cpp:191 +#: src/slic3r/GUI/UpdateDialogs.cpp:63 src/slic3r/GUI/UpdateDialogs.cpp:309 +#: src/slic3r/GUI/UpdateDialogs.cpp:367 msgid "Open changelog page" msgstr "Değişiklik sayfasını aç" -#: src/slic3r/GUI/UpdateDialogs.cpp:65 +#: src/slic3r/GUI/UpdateDialogs.cpp:69 msgid "Open download page" msgstr "İndirme sayfasını aç" -#: src/slic3r/GUI/UpdateDialogs.cpp:72 +#: src/slic3r/GUI/UpdateDialogs.cpp:76 src/slic3r/GUI/UpdateDialogs.cpp:109 msgid "Don't notify about new releases any more" msgstr "Artık yeni sürümlerden haberdar etme" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +msgid "App Update available" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +#, c-format, boost-format +msgid "" +"New version of %s is available.\n" +"Do you wish to download it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +msgid "App Update download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +#, c-format, boost-format +msgid "New version of %s is available." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:146 +msgid "Run installer after download. (Otherwise file explorer will be opened)" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:151 +msgid "Target directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:158 +msgid "Select directory" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:176 +msgid "Select directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:193 +msgid "Download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:204 +msgid "Directory path is empty." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:212 +msgid "Directory path is incorrect." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:217 +#, boost-format +msgid "Directory %1% doesn't exists. Do you wish to create it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:222 +msgid "Failed to create directory." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:229 +#, boost-format +msgid "File %1% already exists. Do you wish to overwrite it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +#, boost-format +msgid "Download path is %1%. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:270 msgid "Opening Configuration Wizard" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 src/slic3r/GUI/UpdateDialogs.cpp:261 +#: src/slic3r/GUI/UpdateDialogs.cpp:270 src/slic3r/GUI/UpdateDialogs.cpp:437 msgid "Configuration update" msgstr "Yapılandırma güncelleme" -#: src/slic3r/GUI/UpdateDialogs.cpp:95 +#: src/slic3r/GUI/UpdateDialogs.cpp:271 msgid "" "PrusaSlicer is not using the newest configuration available.\n" "Configuration Wizard may not offer the latest printers, filaments and SLA " "materials to be installed." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:97 +#: src/slic3r/GUI/UpdateDialogs.cpp:273 msgid "Configuration update is available" msgstr "Yapılandırma güncellemesi var" -#: src/slic3r/GUI/UpdateDialogs.cpp:100 +#: src/slic3r/GUI/UpdateDialogs.cpp:276 msgid "" "Would you like to install it?\n" "\n" @@ -9223,28 +10926,28 @@ msgstr "" "\n" "Güncelleme yapılandırma paketleri:" -#: src/slic3r/GUI/UpdateDialogs.cpp:121 src/slic3r/GUI/UpdateDialogs.cpp:181 +#: src/slic3r/GUI/UpdateDialogs.cpp:297 src/slic3r/GUI/UpdateDialogs.cpp:357 msgid "Comment:" msgstr "Yorum:" -#: src/slic3r/GUI/UpdateDialogs.cpp:142 +#: src/slic3r/GUI/UpdateDialogs.cpp:318 msgid "Install" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:144 +#: src/slic3r/GUI/UpdateDialogs.cpp:320 msgid "Don't install" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 src/slic3r/GUI/UpdateDialogs.cpp:212 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 src/slic3r/GUI/UpdateDialogs.cpp:388 #, c-format, boost-format msgid "%s incompatibility" msgstr "%s uyumsuzluğu" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 msgid "You must install a configuration update." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:160 +#: src/slic3r/GUI/UpdateDialogs.cpp:336 #, c-format, boost-format msgid "" "%s will now start updates. Otherwise it won't be able to start.\n" @@ -9255,17 +10958,12 @@ msgid "" "Updated configuration bundles:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:200 src/slic3r/GUI/UpdateDialogs.cpp:247 -#, c-format, boost-format -msgid "Exit %s" -msgstr "%s Çıkış" - -#: src/slic3r/GUI/UpdateDialogs.cpp:213 +#: src/slic3r/GUI/UpdateDialogs.cpp:389 #, c-format, boost-format msgid "%s configuration is incompatible" msgstr "%s yapılandırması uyumlu değil" -#: src/slic3r/GUI/UpdateDialogs.cpp:216 +#: src/slic3r/GUI/UpdateDialogs.cpp:392 #, c-format, boost-format msgid "" "This version of %s is not compatible with currently installed configuration " @@ -9278,20 +10976,20 @@ msgid "" "existing configuration before installing files compatible with this %s." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#: src/slic3r/GUI/UpdateDialogs.cpp:401 #, c-format, boost-format msgid "This %s version: %s" msgstr "Bu %s versiyonu: %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:230 +#: src/slic3r/GUI/UpdateDialogs.cpp:406 msgid "Incompatible bundles:" msgstr "Uyumsuz paketler:" -#: src/slic3r/GUI/UpdateDialogs.cpp:246 +#: src/slic3r/GUI/UpdateDialogs.cpp:422 msgid "Re-configure" msgstr "Yeniden yapılandır" -#: src/slic3r/GUI/UpdateDialogs.cpp:265 +#: src/slic3r/GUI/UpdateDialogs.cpp:441 #, c-format, boost-format msgid "" "%s now uses an updated configuration structure.\n" @@ -9319,28 +11017,37 @@ msgstr "" "güncellemelerinin etkinleştirilip etkinleştirilmeyeceğini seçmek için %s ile " "devam edin." -#: src/slic3r/GUI/UpdateDialogs.cpp:282 +#: src/slic3r/GUI/UpdateDialogs.cpp:458 msgid "For more information please visit our wiki page:" msgstr "Daha fazla bilgi için lütfen wiki sayfamızı ziyaret edin:" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 msgid "Configuration updates" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 src/slic3r/GUI/UpdateDialogs.cpp:495 msgid "No updates available" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:304 +#: src/slic3r/GUI/UpdateDialogs.cpp:480 #, c-format, boost-format msgid "%s has no configuration updates available." msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:21 +#: src/slic3r/GUI/UpdateDialogs.cpp:495 +msgid "App update" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:500 +#, c-format, boost-format +msgid "%s has no version updates available." +msgstr "" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:23 msgid "Ramming customization" msgstr "Sıkıştırma özelleştirme" -#: src/slic3r/GUI/WipeTowerDialog.cpp:54 +#: src/slic3r/GUI/WipeTowerDialog.cpp:56 msgid "" "Ramming denotes the rapid extrusion just before a tool change in a single-" "extruder MM printer. Its purpose is to properly shape the end of the " @@ -9363,27 +11070,27 @@ msgstr "" "Bu uzman düzeyinde bir ayardır, yanlış ayarlamalar sıkışmalara, ekstrüder " "çarkının filamenti taşlanmasına vb. sebep olabilir." -#: src/slic3r/GUI/WipeTowerDialog.cpp:114 +#: src/slic3r/GUI/WipeTowerDialog.cpp:116 msgid "Total ramming time" msgstr "Toplam sıkıştırma süresi" -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 msgid "Total rammed volume" msgstr "Toplam sıkıştırma hacmi" -#: src/slic3r/GUI/WipeTowerDialog.cpp:120 +#: src/slic3r/GUI/WipeTowerDialog.cpp:122 msgid "Ramming line width" msgstr "Sıkıştırma genişliği" -#: src/slic3r/GUI/WipeTowerDialog.cpp:122 +#: src/slic3r/GUI/WipeTowerDialog.cpp:124 msgid "Ramming line spacing" msgstr "Sıkıştırma satır boşluğu" -#: src/slic3r/GUI/WipeTowerDialog.cpp:173 +#: src/slic3r/GUI/WipeTowerDialog.cpp:175 msgid "Wipe tower - Purging volume adjustment" msgstr "Temizleme kulesi - Boşaltma hacmi ayarı" -#: src/slic3r/GUI/WipeTowerDialog.cpp:299 +#: src/slic3r/GUI/WipeTowerDialog.cpp:301 msgid "" "Here you can adjust required purging volume (mm³) for any given pair of " "tools." @@ -9391,23 +11098,23 @@ msgstr "" "Burada, herhangi bir takım çifti için gerekli temizleme hacmini (mm³) " "ayarlayabilirsiniz." -#: src/slic3r/GUI/WipeTowerDialog.cpp:300 +#: src/slic3r/GUI/WipeTowerDialog.cpp:302 msgid "Extruder changed to" msgstr "Ekstrüder şuna değiştirildi" -#: src/slic3r/GUI/WipeTowerDialog.cpp:308 +#: src/slic3r/GUI/WipeTowerDialog.cpp:310 msgid "unloaded" msgstr "kaldırıldı" -#: src/slic3r/GUI/WipeTowerDialog.cpp:309 +#: src/slic3r/GUI/WipeTowerDialog.cpp:311 msgid "loaded" msgstr "yüklü" -#: src/slic3r/GUI/WipeTowerDialog.cpp:352 +#: src/slic3r/GUI/WipeTowerDialog.cpp:354 msgid "Tool #" msgstr "Araç #" -#: src/slic3r/GUI/WipeTowerDialog.cpp:361 +#: src/slic3r/GUI/WipeTowerDialog.cpp:363 msgid "" "Total purging volume is calculated by summing two values below, depending on " "which tools are loaded/unloaded." @@ -9415,15 +11122,15 @@ msgstr "" "Toplam temizleme hacmi, hangi araçların yüklü / boşaltıldığına bağlı olarak " "aşağıdaki iki değer toplanarak hesaplanır." -#: src/slic3r/GUI/WipeTowerDialog.cpp:362 +#: src/slic3r/GUI/WipeTowerDialog.cpp:364 msgid "Volume to purge (mm³) when the filament is being" msgstr "Filament olurken temizlenecek hacim (mm³)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:376 +#: src/slic3r/GUI/WipeTowerDialog.cpp:378 msgid "From" msgstr "From" -#: src/slic3r/GUI/WipeTowerDialog.cpp:442 +#: src/slic3r/GUI/WipeTowerDialog.cpp:444 msgid "" "Switching to simple settings will discard changes done in the advanced " "mode!\n" @@ -9434,26 +11141,28 @@ msgstr "" "\n" "Devam etmek ister misiniz?" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show simplified settings" msgstr "Basitleştirilmiş ayarları göster" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show advanced settings" msgstr "Gelişmiş ayarları göster" -#: src/slic3r/GUI/wxExtensions.cpp:644 +#: src/slic3r/GUI/wxExtensions.cpp:672 #, c-format, boost-format msgid "Switch to the %s mode" msgstr "%s moda geç" -#: src/slic3r/GUI/wxExtensions.cpp:645 +#: src/slic3r/GUI/wxExtensions.cpp:673 #, c-format, boost-format msgid "Current mode is %s" msgstr "Geçerli mod %s" -#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:141 -#: src/slic3r/Utils/Repetier.cpp:69 +#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:206 +#: src/slic3r/Utils/OctoPrint.cpp:255 src/slic3r/Utils/OctoPrint.cpp:666 +#: src/slic3r/Utils/OctoPrint.cpp:824 src/slic3r/Utils/OctoPrint.cpp:897 +#: src/slic3r/Utils/Repetier.cpp:88 #, c-format, boost-format msgid "Mismatched type of print host: %s" msgstr "Eşleşmeyen baskı sunucusu türü: %s" @@ -9570,69 +11279,100 @@ msgid "" "is required." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:164 +#: src/slic3r/Utils/OctoPrint.cpp:278 msgid "Connection to OctoPrint works correctly." msgstr "OctoPrint ile bağlantı düzgün çalışıyor." -#: src/slic3r/Utils/OctoPrint.cpp:170 +#: src/slic3r/Utils/OctoPrint.cpp:284 msgid "Could not connect to OctoPrint" msgstr "OctoPrint ile bağlantı kurulamadı" -#: src/slic3r/Utils/OctoPrint.cpp:172 +#: src/slic3r/Utils/OctoPrint.cpp:286 msgid "Note: OctoPrint version at least 1.1.0 is required." msgstr "Not: OctoPrint sürümü en az 1.1.0 gereklidir." -#: src/slic3r/Utils/OctoPrint.cpp:292 +#: src/slic3r/Utils/OctoPrint.cpp:528 msgid "Connection to Prusa SL1 / SL1S works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:298 +#: src/slic3r/Utils/OctoPrint.cpp:534 msgid "Could not connect to Prusa SLA" msgstr "Prusa SLA ile bağlantı kurulamadı" -#: src/slic3r/Utils/OctoPrint.cpp:336 +#: src/slic3r/Utils/OctoPrint.cpp:573 msgid "Connection to PrusaLink works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:342 +#: src/slic3r/Utils/OctoPrint.cpp:579 msgid "Could not connect to PrusaLink" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:61 +#: src/slic3r/Utils/OctoPrint.cpp:776 +msgid "Storages found:" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "read only" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "no free space" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:781 +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%.%2%" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:64 #, boost-format msgid "Copying of file %1% to %2% failed: %3%" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:645 -#: src/slic3r/Utils/PresetUpdater.cpp:662 +#: src/slic3r/Utils/PresetUpdater.cpp:998 +#: src/slic3r/Utils/PresetUpdater.cpp:1015 msgid "Continue and install configuration updates?" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:777 +#: src/slic3r/Utils/PresetUpdater.cpp:1021 +msgid "Installing profiles" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1071 +#, boost-format +msgid "Downloading resources for %1%." +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1171 msgid "" -"Configuration Updates causes a lost of preset modification.\n" +"Configuration Update will cause the preset modification to be lost.\n" "So, check unsaved changes and save them if necessary." msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:779 +#: src/slic3r/Utils/PresetUpdater.cpp:1173 msgid "Updating" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:808 +#: src/slic3r/Utils/PresetUpdater.cpp:1202 #, c-format, boost-format msgid "requires min. %s and max. %s" msgstr "en az %s ve en çok %s gerektirir" -#: src/slic3r/Utils/PresetUpdater.cpp:812 +#: src/slic3r/Utils/PresetUpdater.cpp:1206 #, c-format, boost-format msgid "requires min. %s" msgstr "en az %s gerektirir" -#: src/slic3r/Utils/PresetUpdater.cpp:815 +#: src/slic3r/Utils/PresetUpdater.cpp:1209 #, c-format, boost-format msgid "requires max. %s" msgstr "en çok %s gerektirir" +#: src/slic3r/Utils/PresetUpdater.cpp:1362 +#, boost-format +msgid "Couldn't locate idx file %1% when performing updates." +msgstr "" + #: src/slic3r/Utils/Http.cpp:73 msgid "" "Could not detect system SSL certificate store. PrusaSlicer will be unable to " @@ -9657,30 +11397,30 @@ msgid "" "connections. See logs for additional details." msgstr "" -#: src/slic3r/Utils/Process.cpp:157 +#: src/slic3r/Utils/Process.cpp:164 msgid "Open G-code file:" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:84 +#: src/slic3r/Utils/Repetier.cpp:103 msgid "Connection to Repetier works correctly." msgstr "" -#: src/slic3r/Utils/Repetier.cpp:90 +#: src/slic3r/Utils/Repetier.cpp:109 msgid "Could not connect to Repetier" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:92 +#: src/slic3r/Utils/Repetier.cpp:111 msgid "Note: Repetier version at least 0.90.0 is required." msgstr "" -#: src/slic3r/Utils/Repetier.cpp:246 +#: src/slic3r/Utils/Repetier.cpp:263 #, boost-format msgid "" "HTTP status: %1%\n" "Message body: \"%2%\"" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:253 +#: src/slic3r/Utils/Repetier.cpp:270 #, boost-format msgid "" "Parsing of host response failed.\n" @@ -9688,7 +11428,7 @@ msgid "" "Error: \"%2%\"" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:266 +#: src/slic3r/Utils/Repetier.cpp:283 #, boost-format msgid "" "Enumeration of host printers failed.\n" @@ -9717,94 +11457,90 @@ msgstr "" msgid "Abort" msgstr "" -#: src/libslic3r/GCode.cpp:539 +#: src/libslic3r/GCode.cpp:490 msgid "There is an object with no extrusions in the first layer." msgstr "" -#: src/libslic3r/GCode.cpp:570 +#: src/libslic3r/GCode.cpp:521 #, boost-format msgid "Empty layer between %1% and %2%." msgstr "" -#: src/libslic3r/GCode.cpp:573 +#: src/libslic3r/GCode.cpp:524 msgid "(Some lines not shown)" msgstr "" -#: src/libslic3r/GCode.cpp:575 +#: src/libslic3r/GCode.cpp:526 #, boost-format msgid "Object name: %1%" msgstr "" -#: src/libslic3r/GCode.cpp:576 +#: src/libslic3r/GCode.cpp:527 msgid "" "Make sure the object is printable. This is usually caused by negligibly " "small extrusions or by a faulty model. Try to repair the model or change its " "orientation on the bed." msgstr "" -#: src/libslic3r/GCode.cpp:718 +#: src/libslic3r/GCode.cpp:669 msgid "Filament Start G-code" msgstr "" -#: src/libslic3r/GCode.cpp:725 +#: src/libslic3r/GCode.cpp:676 msgid "Filament End G-code" msgstr "" -#: src/libslic3r/GCode.cpp:764 +#: src/libslic3r/GCode.cpp:717 msgid "In the custom G-code were found reserved keywords:" msgstr "" -#: src/libslic3r/GCode.cpp:766 +#: src/libslic3r/GCode.cpp:719 msgid "" "This may cause problems in g-code visualization and printing time estimation." msgstr "" -#: src/libslic3r/GCode.cpp:1200 src/libslic3r/GCode.cpp:1211 +#: src/libslic3r/GCode.cpp:1124 src/libslic3r/GCode.cpp:1135 msgid "No extrusions were generated for objects." msgstr "" -#: src/libslic3r/GCode.cpp:1406 +#: src/libslic3r/GCode.cpp:1328 msgid "" "Your print is very close to the priming regions. Make sure there is no " "collision." msgstr "" -#: src/libslic3r/ExtrusionEntity.cpp:344 src/libslic3r/ExtrusionEntity.cpp:380 -msgid "Mixed" -msgstr "Karışık" - #: src/libslic3r/Flow.cpp:61 #, boost-format msgid "" "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1735 +#: src/libslic3r/Format/3mf.cpp:1880 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1746 +#: src/libslic3r/Format/3mf.cpp:1891 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1750 +#: src/libslic3r/Format/3mf.cpp:1895 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1754 +#: src/libslic3r/Format/3mf.cpp:1899 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/AMF.cpp:993 +#: src/libslic3r/Format/AMF.cpp:1000 #, boost-format msgid "" "The selected amf file has been saved with a newer version of %1% and is not " @@ -9947,31 +11683,37 @@ msgstr "doğrulama başarısız" msgid "write calledback failed" msgstr "geri arama yazma başarısız oldu" -#: src/libslic3r/Print.cpp:454 +#: src/libslic3r/Print.cpp:473 msgid "All objects are outside of the print volume." msgstr "Tüm nesneler baskı hacminin dışında." -#: src/libslic3r/Print.cpp:457 +#: src/libslic3r/Print.cpp:476 msgid "The supplied settings will cause an empty print." msgstr "Verilen ayarlar boş yazdırmaya neden olur." -#: src/libslic3r/Print.cpp:461 +#: src/libslic3r/Print.cpp:480 msgid "Some objects are too close; your extruder will collide with them." msgstr "Bazı nesneler çok yakın; Ekstrüderiniz onlarla çarpışacaktır." -#: src/libslic3r/Print.cpp:463 +#: src/libslic3r/Print.cpp:482 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." msgstr "Bazı nesneler çok uzun ve ekstrüder çarpışmaları olmadan basılamaz." -#: src/libslic3r/Print.cpp:472 +#: src/libslic3r/Print.cpp:486 +msgid "" +"Avoid crossing perimeters option and avoid crossing curled overhangs option " +"cannot be both enabled together." +msgstr "" + +#: src/libslic3r/Print.cpp:495 msgid "" "Only a single object may be printed at a time in Spiral Vase mode. Either " "remove all but the last object, or enable sequential mode by " "\"complete_objects\"." msgstr "" -#: src/libslic3r/Print.cpp:476 +#: src/libslic3r/Print.cpp:499 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." @@ -9979,19 +11721,29 @@ msgstr "" "Spiral Vazo seçeneği, yalnızca tek malzeme nesnelerini yazdırırken " "kullanılabilir." -#: src/libslic3r/Print.cpp:489 +#: src/libslic3r/Print.cpp:523 +msgid "" +"The print is taller than the maximum allowed height. You might want to " +"reduce the size of your model or change current print settings and retry." +msgstr "" + +#: src/libslic3r/Print.cpp:540 +msgid "Variable layer height is not supported with Organic supports." +msgstr "" + +#: src/libslic3r/Print.cpp:553 msgid "" "The wipe tower is only supported if all extruders have the same nozzle " "diameter and use filaments of the same diameter." msgstr "" -#: src/libslic3r/Print.cpp:495 +#: src/libslic3r/Print.cpp:559 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, " "RepRapFirmware and Repetier G-code flavors." msgstr "" -#: src/libslic3r/Print.cpp:497 +#: src/libslic3r/Print.cpp:561 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." @@ -9999,22 +11751,24 @@ msgstr "" "Temizleme Kulesi şu anda yalnızca göreceli ekstrüder adreslemesi ile " "desteklenmektedir (use_relative_e_distances = 1)." -#: src/libslic3r/Print.cpp:499 -msgid "Ooze prevention is currently not supported with the wipe tower enabled." +#: src/libslic3r/Print.cpp:563 +msgid "" +"Ooze prevention is only supported with the wipe tower when " +"'single_extruder_multi_material' is off." msgstr "" -#: src/libslic3r/Print.cpp:501 +#: src/libslic3r/Print.cpp:565 msgid "" "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." msgstr "" -#: src/libslic3r/Print.cpp:503 +#: src/libslic3r/Print.cpp:567 msgid "" "The Wipe Tower is currently not supported for multimaterial sequential " "prints." msgstr "" -#: src/libslic3r/Print.cpp:524 +#: src/libslic3r/Print.cpp:577 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " "layer heights" @@ -10022,7 +11776,7 @@ msgstr "" "Temizleme Kulesi, yalnızca eşit katman yüksekliğine sahipse birden çok nesne " "için desteklenir" -#: src/libslic3r/Print.cpp:526 +#: src/libslic3r/Print.cpp:579 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "over an equal number of raft layers" @@ -10030,7 +11784,7 @@ msgstr "" "Temizleme Kulesi, yalnızca eşit sayıda sal katmanın üzerine basıldıysa, " "yalnızca birden çok nesne için desteklenir" -#: src/libslic3r/Print.cpp:529 +#: src/libslic3r/Print.cpp:582 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "with the same support_material_contact_distance" @@ -10038,7 +11792,7 @@ msgstr "" "Temizleme Kulesi, yalnızca aynı support_material_contact_distance ile " "yazdırılıyorsa, birden çok nesne için desteklenir" -#: src/libslic3r/Print.cpp:531 +#: src/libslic3r/Print.cpp:584 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." @@ -10046,30 +11800,30 @@ msgstr "" "Temizleme Kulesi, yalnızca eşit şekilde dilimlenmeleri durumunda birden çok " "nesne için desteklenir." -#: src/libslic3r/Print.cpp:555 +#: src/libslic3r/Print.cpp:609 msgid "" "The Wipe tower is only supported if all objects have the same variable layer " "height" msgstr "" -#: src/libslic3r/Print.cpp:579 +#: src/libslic3r/Print.cpp:633 msgid "" "One or more object were assigned an extruder that the printer does not have." msgstr "" "Bir veya daha fazla nesneye, yazıcının sahip olmadığı bir ekstrüder " "verilmiştir." -#: src/libslic3r/Print.cpp:592 +#: src/libslic3r/Print.cpp:646 #, boost-format msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" msgstr "" -#: src/libslic3r/Print.cpp:595 +#: src/libslic3r/Print.cpp:649 #, boost-format msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" msgstr "" -#: src/libslic3r/Print.cpp:606 +#: src/libslic3r/Print.cpp:660 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " @@ -10081,7 +11835,7 @@ msgstr "" "support_material_interface_ekstrüder == 0), tüm nozullar aynı çapta " "olmalıdır." -#: src/libslic3r/Print.cpp:614 +#: src/libslic3r/Print.cpp:668 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers " "need to be synchronized with the object layers." @@ -10089,66 +11843,106 @@ msgstr "" "Temizleme Kulesi'nin çözülebilir desteklerle çalışması için, destek " "katmanlarının nesne katmanları ile senkronize edilmesi gerekir." -#: src/libslic3r/Print.cpp:618 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only if they are " -"printed with the current extruder without triggering a tool change. (both " -"support_material_extruder and support_material_interface_extruder need to be " -"set to 0)." -msgstr "" -"Temizleme Kulesi şu anda çözülemeyen destekleri sadece bir takım " -"değişikliğini tetiklemeden mevcut ekstrüder ile basıldıysa desteklemektedir. " -"(Hem support_material_ekstrüder hem de support_material_interface_ekstrüder " -"0 olarak ayarlanmalıdır)." - -#: src/libslic3r/Print.cpp:654 +#: src/libslic3r/Print.cpp:708 msgid "First layer height can't be greater than nozzle diameter" msgstr "İlk katman yüksekliği nozül çapından büyük olamaz" -#: src/libslic3r/Print.cpp:659 +#: src/libslic3r/Print.cpp:713 msgid "Layer height can't be greater than nozzle diameter" msgstr "Katman yüksekliği nozül çapından büyük olamaz" -#: src/libslic3r/Print.cpp:680 +#: src/libslic3r/Print.cpp:734 msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " "layer_gcode." msgstr "" -#: src/libslic3r/Print.cpp:682 +#: src/libslic3r/Print.cpp:736 msgid "" "\"G92 E0\" was found in before_layer_gcode, which is incompatible with " "absolute extruder addressing." msgstr "" -#: src/libslic3r/Print.cpp:684 +#: src/libslic3r/Print.cpp:738 msgid "" "\"G92 E0\" was found in layer_gcode, which is incompatible with absolute " "extruder addressing." msgstr "" -#: src/libslic3r/Print.cpp:826 +#: src/libslic3r/Print.cpp:880 msgid "Infilling layers" msgstr "Dolgu katmanları" -#: src/libslic3r/Print.cpp:848 +#: src/libslic3r/Print.cpp:908 msgid "Generating skirt and brim" msgstr "" -#: src/libslic3r/Print.cpp:896 +#: src/libslic3r/Print.cpp:956 msgid "Exporting G-code" msgstr "G-code dışa aktarılıyor" -#: src/libslic3r/Print.cpp:900 +#: src/libslic3r/Print.cpp:960 msgid "Generating G-code" msgstr "G kodu oluşturma" +#: src/libslic3r/Print.cpp:1169 +msgid "Alert if supports needed" +msgstr "" + +#: src/libslic3r/Print.cpp:1174 +msgid "long bridging extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1175 +msgid "floating bridge anchors" +msgstr "" + +#: src/libslic3r/Print.cpp:1178 +msgid "collapsing overhang" +msgstr "" + +#: src/libslic3r/Print.cpp:1180 +msgid "loose extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1183 +msgid "low bed adhesion" +msgstr "" + +#: src/libslic3r/Print.cpp:1184 +msgid "floating object part" +msgstr "" + +#: src/libslic3r/Print.cpp:1185 +msgid "thin fragile section" +msgstr "" + +#: src/libslic3r/Print.cpp:1221 +msgid "Detected print stability issues" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "or" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "and" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "brim" +msgstr "" + +#: src/libslic3r/Print.cpp:1248 +msgid "Consider enabling supports" +msgstr "" + #: src/libslic3r/SLA/Pad.cpp:533 msgid "Pad brim size is too small for the current configuration." msgstr "" -#: src/libslic3r/SLAPrint.cpp:628 +#: src/libslic3r/SLAPrint.cpp:546 msgid "" "Cannot proceed without support points! Add support points or disable support " "generation." @@ -10156,105 +11950,112 @@ msgstr "" "Destek noktaları olmadan devam edemezsiniz! Destek noktaları ekleyin veya " "destek oluşturmayı devre dışı bırakın." -#: src/libslic3r/SLAPrint.cpp:640 +#: src/libslic3r/SLAPrint.cpp:558 msgid "" "Elevation is too low for object. Use the \"Pad around object\" feature to " "print the object without elevation." msgstr "" -#: src/libslic3r/SLAPrint.cpp:646 +#: src/libslic3r/SLAPrint.cpp:564 msgid "" "The endings of the support pillars will be deployed on the gap between the " "object and the pad. 'Support base safety distance' has to be greater than " "the 'Pad object gap' parameter to avoid this." msgstr "" -#: src/libslic3r/SLAPrint.cpp:661 +#: src/libslic3r/SLAPrint.cpp:579 msgid "Exposition time is out of printer profile bounds." msgstr "" -#: src/libslic3r/SLAPrint.cpp:668 +#: src/libslic3r/SLAPrint.cpp:586 msgid "Initial exposition time is out of printer profile bounds." msgstr "" -#: src/libslic3r/SLAPrint.cpp:784 +#: src/libslic3r/SLAPrint.cpp:693 msgid "Slicing done" msgstr "Dilimleme yapıldı" -#: src/libslic3r/SLAPrintSteps.cpp:47 +#: src/libslic3r/SLAPrintSteps.cpp:57 +msgid "Assembling model from parts" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:58 msgid "Hollowing model" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:48 +#: src/libslic3r/SLAPrintSteps.cpp:59 msgid "Drilling holes into model." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:49 +#: src/libslic3r/SLAPrintSteps.cpp:60 msgid "Slicing model" msgstr "Dilimleme modeli" -#: src/libslic3r/SLAPrintSteps.cpp:50 src/libslic3r/SLAPrintSteps.cpp:639 +#: src/libslic3r/SLAPrintSteps.cpp:61 src/libslic3r/SLAPrintSteps.cpp:691 msgid "Generating support points" msgstr "Destek noktaları oluşturmak" -#: src/libslic3r/SLAPrintSteps.cpp:51 +#: src/libslic3r/SLAPrintSteps.cpp:62 msgid "Generating support tree" msgstr "Destek ağacı oluşturma" -#: src/libslic3r/SLAPrintSteps.cpp:52 +#: src/libslic3r/SLAPrintSteps.cpp:63 msgid "Generating pad" msgstr "Üreten ped" -#: src/libslic3r/SLAPrintSteps.cpp:53 +#: src/libslic3r/SLAPrintSteps.cpp:64 msgid "Slicing supports" msgstr "Dilimleme destekleri" -#: src/libslic3r/SLAPrintSteps.cpp:68 +#: src/libslic3r/SLAPrintSteps.cpp:79 msgid "Merging slices and calculating statistics" msgstr "Dilimleri birleştirme ve istatistik hesaplama" -#: src/libslic3r/SLAPrintSteps.cpp:69 +#: src/libslic3r/SLAPrintSteps.cpp:80 msgid "Rasterizing layers" msgstr "Rasterleştirme katmanları" -#: src/libslic3r/SLAPrintSteps.cpp:435 -msgid "Too many overlapping holes." -msgstr "" - -#: src/libslic3r/SLAPrintSteps.cpp:442 +#: src/libslic3r/SLAPrintSteps.cpp:255 msgid "" "Mesh to be hollowed is not suitable for hollowing (does not bound a volume)." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:450 +#: src/libslic3r/SLAPrintSteps.cpp:262 msgid "Unable to drill the current configuration of holes into the model." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:470 +#: src/libslic3r/SLAPrintSteps.cpp:271 msgid "" "Drilling holes into the mesh failed. This is usually caused by broken model. " "Try to fix it first." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:476 +#: src/libslic3r/SLAPrintSteps.cpp:279 msgid "Failed to drill some holes into the model" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:520 +#: src/libslic3r/SLAPrintSteps.cpp:289 +msgid "" +"Can't perform full mesh booleans! Some parts of the print will be previewed " +"with approximated meshes. This does not affect the quality of slices or the " +"physical print in any way." +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:510 msgid "" "Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:691 src/libslic3r/SLAPrintSteps.cpp:700 -#: src/libslic3r/SLAPrintSteps.cpp:738 +#: src/libslic3r/SLAPrintSteps.cpp:740 src/libslic3r/SLAPrintSteps.cpp:749 +#: src/libslic3r/SLAPrintSteps.cpp:787 msgid "Visualizing supports" msgstr "Görselleştirme destekleri" -#: src/libslic3r/SLAPrintSteps.cpp:730 +#: src/libslic3r/SLAPrintSteps.cpp:779 msgid "No pad can be generated for this model with the current configuration" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:854 +#: src/libslic3r/SLAPrintSteps.cpp:908 msgid "" "There are unprintable objects. Try to adjust support settings to make the " "objects printable." @@ -10264,27 +12065,27 @@ msgstr "" msgid "Failed processing of the output_filename_format template." msgstr "Output_filename_format şablonunun işlenmesi başarısız oldu." -#: src/libslic3r/PrintConfig.cpp:236 src/libslic3r/PrintConfig.cpp:237 +#: src/libslic3r/PrintConfig.cpp:254 src/libslic3r/PrintConfig.cpp:255 msgid "Printer technology" msgstr "Yazıcı teknolojisi" -#: src/libslic3r/PrintConfig.cpp:244 +#: src/libslic3r/PrintConfig.cpp:260 msgid "Bed shape" msgstr "Tabla şekli" -#: src/libslic3r/PrintConfig.cpp:249 +#: src/libslic3r/PrintConfig.cpp:265 msgid "Bed custom texture" msgstr "" -#: src/libslic3r/PrintConfig.cpp:254 +#: src/libslic3r/PrintConfig.cpp:270 msgid "Bed custom model" msgstr "" -#: src/libslic3r/PrintConfig.cpp:259 +#: src/libslic3r/PrintConfig.cpp:275 msgid "Elephant foot compensation" msgstr "Fil ayağı koruması" -#: src/libslic3r/PrintConfig.cpp:261 +#: src/libslic3r/PrintConfig.cpp:277 msgid "" "The first layer will be shrunk in the XY plane by the configured value to " "compensate for the 1st layer squish aka an Elephant Foot effect." @@ -10292,27 +12093,27 @@ msgstr "" "İlk katmanda ezilme, bir diğer ismiyle fil ayağı etkisini önlemek için ilk " "katman XY düzleminde bu değer kadar küçültülecektir." -#: src/libslic3r/PrintConfig.cpp:269 +#: src/libslic3r/PrintConfig.cpp:285 msgid "G-code thumbnails" msgstr "" -#: src/libslic3r/PrintConfig.cpp:270 +#: src/libslic3r/PrintConfig.cpp:286 msgid "" "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " "following format: \"XxY, XxY, ...\"" msgstr "" -#: src/libslic3r/PrintConfig.cpp:276 +#: src/libslic3r/PrintConfig.cpp:292 msgid "Format of G-code thumbnails" msgstr "" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:293 msgid "" "Format of G-code thumbnails: PNG for best quality, JPG for smallest size, " "QOI for low memory firmware" msgstr "" -#: src/libslic3r/PrintConfig.cpp:288 +#: src/libslic3r/PrintConfig.cpp:301 msgid "" "This setting controls the height (and thus the total number) of the slices/" "layers. Thinner layers give better accuracy but take more time to print." @@ -10321,11 +12122,11 @@ msgstr "" "kontrol eder. Daha ince katmanlar daha iyi doğruluk sağlar ancak yazdırması " "daha uzun sürer." -#: src/libslic3r/PrintConfig.cpp:295 +#: src/libslic3r/PrintConfig.cpp:308 msgid "Max print height" msgstr "En fazla baskı yüksekliği" -#: src/libslic3r/PrintConfig.cpp:296 +#: src/libslic3r/PrintConfig.cpp:309 msgid "" "Set this to the maximum height that can be reached by your extruder while " "printing." @@ -10333,11 +12134,11 @@ msgstr "" "Bunu, yazdırma sırasında ekstrüderinizin ulaşabileceği en fazla yüksekliğe " "ayarlayın." -#: src/libslic3r/PrintConfig.cpp:304 +#: src/libslic3r/PrintConfig.cpp:317 msgid "Hostname, IP or URL" msgstr "Ana bilgisayar adı, IP veya URL" -#: src/libslic3r/PrintConfig.cpp:305 +#: src/libslic3r/PrintConfig.cpp:318 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the hostname, IP address or URL of the printer host instance. Print host " @@ -10346,11 +12147,11 @@ msgid "" "password@your-octopi-address/" msgstr "" -#: src/libslic3r/PrintConfig.cpp:314 +#: src/libslic3r/PrintConfig.cpp:327 msgid "API Key / Password" msgstr "API Anahtarı / Şifre" -#: src/libslic3r/PrintConfig.cpp:315 +#: src/libslic3r/PrintConfig.cpp:328 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the API Key or the password required for authentication." @@ -10358,11 +12159,11 @@ msgstr "" "Slic3r, G kodu dosyalarını bir yazıcı ana bilgisayarına yükleyebilir. Bu " "alan, API Anahtarını veya kimlik doğrulama için gereken şifreyi içermelidir." -#: src/libslic3r/PrintConfig.cpp:323 +#: src/libslic3r/PrintConfig.cpp:336 msgid "Name of the printer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:331 +#: src/libslic3r/PrintConfig.cpp:344 msgid "" "Custom CA certificate file can be specified for HTTPS OctoPrint connections, " "in crt/pem format. If left blank, the default OS CA certificate repository " @@ -10372,46 +12173,58 @@ msgstr "" "dosyası belirtilebilir. Boş bırakılırsa, varsayılan OS CA sertifika " "kullanılır." -#: src/libslic3r/PrintConfig.cpp:347 +#: src/libslic3r/PrintConfig.cpp:360 msgid "Password" msgstr "" -#: src/libslic3r/PrintConfig.cpp:355 +#: src/libslic3r/PrintConfig.cpp:368 msgid "Ignore HTTPS certificate revocation checks" msgstr "" -#: src/libslic3r/PrintConfig.cpp:356 +#: src/libslic3r/PrintConfig.cpp:369 msgid "" "Ignore HTTPS certificate revocation checks in case of missing or offline " "distribution points. One may want to enable this option for self signed " "certificates if connection fails." msgstr "" -#: src/libslic3r/PrintConfig.cpp:363 +#: src/libslic3r/PrintConfig.cpp:376 msgid "Printer preset names" msgstr "" -#: src/libslic3r/PrintConfig.cpp:364 +#: src/libslic3r/PrintConfig.cpp:377 msgid "Names of presets related to the physical printer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:369 +#: src/libslic3r/PrintConfig.cpp:382 msgid "Authorization Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:374 +#: src/libslic3r/PrintConfig.cpp:385 msgid "API key" msgstr "" -#: src/libslic3r/PrintConfig.cpp:375 +#: src/libslic3r/PrintConfig.cpp:386 msgid "HTTP digest" msgstr "" -#: src/libslic3r/PrintConfig.cpp:395 +#: src/libslic3r/PrintConfig.cpp:406 +msgid "Avoid crossing curled overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:407 +msgid "" +"Plan travel moves such that the extruder avoids areas where the filament may " +"be curled up. This is mostly happening on steeper rounded overhangs and may " +"cause a crash with the nozzle. This feature slows down both the print and " +"the G-code generation." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:414 msgid "Avoid crossing perimeters" msgstr "Yan duvarların üzerinden geçme" -#: src/libslic3r/PrintConfig.cpp:396 +#: src/libslic3r/PrintConfig.cpp:415 msgid "" "Optimize travel moves in order to minimize the crossing of perimeters. This " "is mostly useful with Bowden extruders which suffer from oozing. This " @@ -10421,11 +12234,11 @@ msgstr "" "optimize eder. Bu çoğunlukla sızmaya maruz kalan Bowden ekstrüderleri ile " "faydalıdır. Bu özellik hem yazdırmayı hem de G-code oluşumunu yavaşlatır." -#: src/libslic3r/PrintConfig.cpp:403 +#: src/libslic3r/PrintConfig.cpp:422 msgid "Avoid crossing perimeters - Max detour length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:405 +#: src/libslic3r/PrintConfig.cpp:424 msgid "" "The maximum detour length for avoid crossing perimeters. If the detour is " "longer than this value, avoid crossing perimeters is not applied for this " @@ -10433,15 +12246,15 @@ msgid "" "as percentage (for example 50%) of a direct travel path." msgstr "" -#: src/libslic3r/PrintConfig.cpp:408 +#: src/libslic3r/PrintConfig.cpp:427 msgid "mm or % (zero to disable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:2839 +#: src/libslic3r/PrintConfig.cpp:434 src/libslic3r/PrintConfig.cpp:2927 msgid "Other layers" msgstr "Diğer katmanlar" -#: src/libslic3r/PrintConfig.cpp:416 +#: src/libslic3r/PrintConfig.cpp:435 msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." @@ -10449,11 +12262,11 @@ msgstr "" "İlk katman sonrasındaki katmanlar için tabla sıcaklığı. Tabla ısı kontrol " "komutlarını devre dışı bırakmak için bunu sıfıra ayarlayın." -#: src/libslic3r/PrintConfig.cpp:419 +#: src/libslic3r/PrintConfig.cpp:438 msgid "Bed temperature" msgstr "Tabla sıcaklığı" -#: src/libslic3r/PrintConfig.cpp:426 +#: src/libslic3r/PrintConfig.cpp:445 msgid "" "This custom code is inserted at every layer change, right before the Z move. " "Note that you can use placeholder variables for all Slic3r settings as well " @@ -10463,11 +12276,11 @@ msgstr "" "Yer tutucu değişkenlerini tüm Slic3r ayarlarının yanı sıra [layer_num] ve " "[layer_z] için kullanabileceğinizi unutmayın." -#: src/libslic3r/PrintConfig.cpp:436 +#: src/libslic3r/PrintConfig.cpp:455 msgid "Between objects G-code" msgstr "Nesneler arasında G-code" -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:456 msgid "" "This code is inserted between objects when using sequential printing. By " "default extruder and bed temperature are reset using non-wait command; " @@ -10483,29 +12296,29 @@ msgstr "" "tutucu değişkenleri kullanabileceğinizi unutmayın, böylece istediğiniz yere " "\\ \"M109 S [first_layer_temperature] \" komutunu koyabilirsiniz." -#: src/libslic3r/PrintConfig.cpp:448 +#: src/libslic3r/PrintConfig.cpp:467 msgid "Number of solid layers to generate on bottom surfaces." msgstr "Alt yüzeylerde üretilecek katı katmanların sayısı." -#: src/libslic3r/PrintConfig.cpp:449 +#: src/libslic3r/PrintConfig.cpp:468 msgid "Bottom solid layers" msgstr "Alt katı katman" -#: src/libslic3r/PrintConfig.cpp:457 +#: src/libslic3r/PrintConfig.cpp:476 msgid "" "The number of bottom solid layers is increased above bottom_solid_layers if " "necessary to satisfy minimum thickness of bottom shell." msgstr "" -#: src/libslic3r/PrintConfig.cpp:459 +#: src/libslic3r/PrintConfig.cpp:478 msgid "Minimum bottom shell thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:484 msgid "Bridge" msgstr "Köprü" -#: src/libslic3r/PrintConfig.cpp:466 +#: src/libslic3r/PrintConfig.cpp:485 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." @@ -10513,21 +12326,21 @@ msgstr "" "Bu, yazıcınızın köprüler için kullanacağı hızlanmadır. Köprüler için " "hızlanma kontrolünü devre dışı bırakmak için sıfıra ayarlayın." -#: src/libslic3r/PrintConfig.cpp:468 src/libslic3r/PrintConfig.cpp:639 -#: src/libslic3r/PrintConfig.cpp:1192 src/libslic3r/PrintConfig.cpp:1201 -#: src/libslic3r/PrintConfig.cpp:1401 src/libslic3r/PrintConfig.cpp:1410 -#: src/libslic3r/PrintConfig.cpp:1419 src/libslic3r/PrintConfig.cpp:1713 -#: src/libslic3r/PrintConfig.cpp:1764 src/libslic3r/PrintConfig.cpp:1775 -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1983 -#: src/libslic3r/PrintConfig.cpp:1991 +#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:1252 src/libslic3r/PrintConfig.cpp:1261 +#: src/libslic3r/PrintConfig.cpp:1447 src/libslic3r/PrintConfig.cpp:1456 +#: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1750 +#: src/libslic3r/PrintConfig.cpp:1801 src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1822 src/libslic3r/PrintConfig.cpp:2013 +#: src/libslic3r/PrintConfig.cpp:2021 msgid "mm/s²" msgstr "mm/s²" -#: src/libslic3r/PrintConfig.cpp:474 +#: src/libslic3r/PrintConfig.cpp:493 msgid "Bridging angle" msgstr "Köprü açısı" -#: src/libslic3r/PrintConfig.cpp:476 +#: src/libslic3r/PrintConfig.cpp:495 msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for all " @@ -10537,35 +12350,30 @@ msgstr "" "olarak hesaplanır. Aksi takdirde, verilen açı tüm köprüler için " "kullanılacaktır. Sıfır açı için 180° kullanın." -#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:1102 -#: src/libslic3r/PrintConfig.cpp:2282 src/libslic3r/PrintConfig.cpp:2292 -#: src/libslic3r/PrintConfig.cpp:2583 src/libslic3r/PrintConfig.cpp:2824 -#: src/libslic3r/PrintConfig.cpp:3041 src/libslic3r/PrintConfig.cpp:3144 -#: src/libslic3r/PrintConfig.cpp:3698 src/libslic3r/PrintConfig.cpp:3819 -msgid "°" -msgstr "°" - -#: src/libslic3r/PrintConfig.cpp:485 +#: src/libslic3r/PrintConfig.cpp:504 msgid "Bridges fan speed" msgstr "Köprü fan hızı" -#: src/libslic3r/PrintConfig.cpp:486 +#: src/libslic3r/PrintConfig.cpp:505 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "Bu fan hızı tüm köprüler ve çıkıntılar sırasında uygulanır." -#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:1114 -#: src/libslic3r/PrintConfig.cpp:1601 src/libslic3r/PrintConfig.cpp:1793 -#: src/libslic3r/PrintConfig.cpp:1856 src/libslic3r/PrintConfig.cpp:2115 -#: src/libslic3r/PrintConfig.cpp:2174 src/libslic3r/PrintConfig.cpp:3323 -#: src/libslic3r/PrintConfig.cpp:3612 src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:596 +#: src/libslic3r/PrintConfig.cpp:605 src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:623 src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1893 src/libslic3r/PrintConfig.cpp:2145 +#: src/libslic3r/PrintConfig.cpp:2204 src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3369 src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3870 msgid "%" msgstr "%" -#: src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:513 msgid "Bridge flow ratio" msgstr "Köprü akış oranı" -#: src/libslic3r/PrintConfig.cpp:496 +#: src/libslic3r/PrintConfig.cpp:515 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -10577,102 +12385,146 @@ msgstr "" "varsayılan ayarlar genellikle iyidir ve ince ayar yapmadan önce soğutma (bir " "fan kullanın) denemelisiniz." -#: src/libslic3r/PrintConfig.cpp:506 +#: src/libslic3r/PrintConfig.cpp:525 msgid "Bridges" msgstr "Köprüler" -#: src/libslic3r/PrintConfig.cpp:508 +#: src/libslic3r/PrintConfig.cpp:527 msgid "Speed for printing bridges." msgstr "Köprü yazdırma hızı." -#: src/libslic3r/PrintConfig.cpp:509 src/libslic3r/PrintConfig.cpp:920 -#: src/libslic3r/PrintConfig.cpp:928 src/libslic3r/PrintConfig.cpp:937 -#: src/libslic3r/PrintConfig.cpp:945 src/libslic3r/PrintConfig.cpp:972 -#: src/libslic3r/PrintConfig.cpp:991 src/libslic3r/PrintConfig.cpp:1329 -#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1620 -#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1730 -#: src/libslic3r/PrintConfig.cpp:1742 src/libslic3r/PrintConfig.cpp:1752 -#: src/libslic3r/PrintConfig.cpp:1815 src/libslic3r/PrintConfig.cpp:1874 -#: src/libslic3r/PrintConfig.cpp:2022 src/libslic3r/PrintConfig.cpp:2249 -#: src/libslic3r/PrintConfig.cpp:2258 src/libslic3r/PrintConfig.cpp:2789 -#: src/libslic3r/PrintConfig.cpp:2939 src/libslic3r/PrintConfig.cpp:2949 +#: src/libslic3r/PrintConfig.cpp:528 src/libslic3r/PrintConfig.cpp:1009 +#: src/libslic3r/PrintConfig.cpp:1017 src/libslic3r/PrintConfig.cpp:1026 +#: src/libslic3r/PrintConfig.cpp:1034 src/libslic3r/PrintConfig.cpp:1061 +#: src/libslic3r/PrintConfig.cpp:1080 src/libslic3r/PrintConfig.cpp:1386 +#: src/libslic3r/PrintConfig.cpp:1579 src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1733 src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1779 src/libslic3r/PrintConfig.cpp:1789 +#: src/libslic3r/PrintConfig.cpp:1852 src/libslic3r/PrintConfig.cpp:1911 +#: src/libslic3r/PrintConfig.cpp:2052 src/libslic3r/PrintConfig.cpp:2279 +#: src/libslic3r/PrintConfig.cpp:2288 src/libslic3r/PrintConfig.cpp:2810 +#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3037 msgid "mm/s" msgstr "mm/s" -#: src/libslic3r/PrintConfig.cpp:516 +#: src/libslic3r/PrintConfig.cpp:535 +msgid "Enable dynamic overhang speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:537 +msgid "This setting enables dynamic speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:541 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Speeds for overhang " +"sizes in between are calculated via linear interpolation. If set as " +"percentage, the speed is calculated over the external perimeter speed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:547 src/libslic3r/PrintConfig.cpp:594 +msgid "speed for 0% overlap (bridge)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:550 src/libslic3r/PrintConfig.cpp:559 +#: src/libslic3r/PrintConfig.cpp:568 src/libslic3r/PrintConfig.cpp:577 +#: src/libslic3r/PrintConfig.cpp:856 src/libslic3r/PrintConfig.cpp:1305 +#: src/libslic3r/PrintConfig.cpp:1316 src/libslic3r/PrintConfig.cpp:2387 +#: src/libslic3r/PrintConfig.cpp:2440 src/libslic3r/PrintConfig.cpp:2765 +#: src/libslic3r/PrintConfig.cpp:2997 +msgid "mm/s or %" +msgstr "mm/s veya %" + +#: src/libslic3r/PrintConfig.cpp:556 src/libslic3r/PrintConfig.cpp:603 +msgid "speed for 25% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:612 +msgid "speed for 50% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:574 src/libslic3r/PrintConfig.cpp:621 +msgid "speed for 75% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:583 +msgid "Enable dynamic fan speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:584 +msgid "This setting enables dynamic fan speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:589 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Fan speeds for " +"overhang sizes in between are calculated via linear interpolation. " +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:630 msgid "Brim width" msgstr "Kenar genişliği" -#: src/libslic3r/PrintConfig.cpp:518 +#: src/libslic3r/PrintConfig.cpp:632 msgid "" "The horizontal width of the brim that will be printed around each object on " "the first layer. When raft is used, no brim is generated (use " "raft_first_layer_expansion)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:527 +#: src/libslic3r/PrintConfig.cpp:641 msgid "Brim type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:529 +#: src/libslic3r/PrintConfig.cpp:643 msgid "" "The places where the brim will be printed around each object on the first " "layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:535 +#: src/libslic3r/PrintConfig.cpp:645 msgid "No brim" msgstr "" -#: src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:646 msgid "Outer brim only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:537 +#: src/libslic3r/PrintConfig.cpp:647 msgid "Inner brim only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:538 +#: src/libslic3r/PrintConfig.cpp:648 msgid "Outer and inner brim" msgstr "" -#: src/libslic3r/PrintConfig.cpp:543 +#: src/libslic3r/PrintConfig.cpp:654 msgid "Brim separation gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:545 +#: src/libslic3r/PrintConfig.cpp:656 msgid "" "Offset of brim from the printed object. The offset is applied after the " "elephant foot compensation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:552 -msgid "Clip multi-part objects" -msgstr "Çok parçalı nesneleri kırp" - -#: src/libslic3r/PrintConfig.cpp:553 -msgid "" -"When printing multi-material objects, this settings will make Slic3r to clip " -"the overlapping object parts one by the other (2nd part will be clipped by " -"the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -msgstr "" -"Çok malzemeli nesneler yazdırırken, Slic3r çakışan nesne parçalarını birbiri " -"ardına kırpacaktır (ikinci parça birinci ile, üçüncü parça birinci ve ikinci " -"vb. ile kırpılacaktır)." - -#: src/libslic3r/PrintConfig.cpp:560 +#: src/libslic3r/PrintConfig.cpp:663 msgid "Colorprint height" msgstr "Renkli baskı yüksekliği" -#: src/libslic3r/PrintConfig.cpp:561 +#: src/libslic3r/PrintConfig.cpp:664 msgid "Heights at which a filament change is to occur." msgstr "Bir filament değişiminin meydana geldiği yükseklikler." -#: src/libslic3r/PrintConfig.cpp:571 +#: src/libslic3r/PrintConfig.cpp:674 msgid "Compatible printers condition" msgstr "Uyumlu yazıcılar durumu" -#: src/libslic3r/PrintConfig.cpp:572 +#: src/libslic3r/PrintConfig.cpp:675 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " @@ -10682,11 +12534,11 @@ msgstr "" "ifadesi. Bu ifade doğru olarak değerlendirilirse, bu profil etkin yazıcı " "profiliyle uyumlu olarak kabul edilir." -#: src/libslic3r/PrintConfig.cpp:586 +#: src/libslic3r/PrintConfig.cpp:689 msgid "Compatible print profiles condition" msgstr "Uyumlu baskı profilleri koşulu" -#: src/libslic3r/PrintConfig.cpp:587 +#: src/libslic3r/PrintConfig.cpp:690 msgid "" "A boolean expression using the configuration values of an active print " "profile. If this expression evaluates to true, this profile is considered " @@ -10696,11 +12548,11 @@ msgstr "" "ifadesi. Bu ifade doğru olarak değerlendirilirse, bu profil aktif yazdırma " "profiliyle uyumlu olarak kabul edilir." -#: src/libslic3r/PrintConfig.cpp:604 +#: src/libslic3r/PrintConfig.cpp:707 msgid "Complete individual objects" msgstr "Tek tek nesneleri tamamla" -#: src/libslic3r/PrintConfig.cpp:605 +#: src/libslic3r/PrintConfig.cpp:708 msgid "" "When printing multiple objects or copies, this feature will complete each " "object before moving onto next one (and starting it from its bottom layer). " @@ -10713,11 +12565,11 @@ msgstr "" "ekstrüder çarpmalarına karşı uyarır ve önlem alır fakat yine de dikkatli " "olun." -#: src/libslic3r/PrintConfig.cpp:613 +#: src/libslic3r/PrintConfig.cpp:716 msgid "Enable auto cooling" msgstr "Otomatik soğutmayı etkinleştir" -#: src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:717 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." @@ -10725,25 +12577,25 @@ msgstr "" "Bu bayrak, baskı hızını ve fan hızını katman baskı zamanına göre ayarlayan " "otomatik soğutma mantığını etkinleştirir." -#: src/libslic3r/PrintConfig.cpp:619 +#: src/libslic3r/PrintConfig.cpp:722 msgid "Cooling tube position" msgstr "Soğutma tüpü konumu" -#: src/libslic3r/PrintConfig.cpp:620 +#: src/libslic3r/PrintConfig.cpp:723 msgid "Distance of the center-point of the cooling tube from the extruder tip." msgstr "Soğutma tüpünün merkez noktasının ekstrüder ucundan mesafesi." -#: src/libslic3r/PrintConfig.cpp:627 +#: src/libslic3r/PrintConfig.cpp:730 msgid "Cooling tube length" msgstr "Soğutma tüpü uzunluğu" -#: src/libslic3r/PrintConfig.cpp:628 +#: src/libslic3r/PrintConfig.cpp:731 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "" "Soğutma tüpünün içindeki hareketleri sınırlamak için soğutma tüpünün " "uzunluğu." -#: src/libslic3r/PrintConfig.cpp:636 +#: src/libslic3r/PrintConfig.cpp:739 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " @@ -10752,11 +12604,11 @@ msgstr "" "Özel hızlandırma değerleri kullanıldıktan sonra (duvar / dolgu) sıfırlanacak " "olan ivmedir. Hızlanmayı sıfırlamayı önlemek için sıfıra ayarlayın." -#: src/libslic3r/PrintConfig.cpp:645 +#: src/libslic3r/PrintConfig.cpp:748 msgid "Default filament profile" msgstr "Varsayılan filament profili" -#: src/libslic3r/PrintConfig.cpp:646 +#: src/libslic3r/PrintConfig.cpp:749 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " @@ -10766,12 +12618,12 @@ msgstr "" "Geçerli yazıcı profilinin seçilmesinde bu filament profili " "etkinleştirilecektir." -#: src/libslic3r/PrintConfig.cpp:652 +#: src/libslic3r/PrintConfig.cpp:755 msgid "Default print profile" msgstr "Varsayılan yazdırma profili" -#: src/libslic3r/PrintConfig.cpp:653 src/libslic3r/PrintConfig.cpp:3542 -#: src/libslic3r/PrintConfig.cpp:3553 +#: src/libslic3r/PrintConfig.cpp:756 src/libslic3r/PrintConfig.cpp:3819 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -10780,11 +12632,11 @@ msgstr "" "Geçerli yazıcı profiliyle ilişkilendirilmiş varsayılan yazdırma profili. " "Geçerli yazıcı profili seçildiğinde, bu baskı profili etkinleştirilecektir." -#: src/libslic3r/PrintConfig.cpp:659 +#: src/libslic3r/PrintConfig.cpp:762 msgid "Disable fan for the first" msgstr "Fanın devre dışı bırakılacağı katman sayısı" -#: src/libslic3r/PrintConfig.cpp:660 +#: src/libslic3r/PrintConfig.cpp:763 msgid "" "You can set this to a positive value to disable fan at all during the first " "layers, so that it does not make adhesion worse." @@ -10792,11 +12644,11 @@ msgstr "" "Bunu, ilk katmanlar sırasında fanı devre dışı bırakmak için pozitif bir " "değere ayarlayabilirsiniz, böylece yapışma daha kötü olmaz." -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:772 msgid "Don't support bridges" msgstr "Köprüleri destekleme" -#: src/libslic3r/PrintConfig.cpp:671 +#: src/libslic3r/PrintConfig.cpp:774 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." @@ -10804,21 +12656,21 @@ msgstr "" "Desteklerin köprülü alanlar altında oluşturulmasını önlemek için deneysel " "seçenek." -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:780 msgid "Distance between copies" msgstr "Kopyalar arasındaki mesafe" -#: src/libslic3r/PrintConfig.cpp:678 +#: src/libslic3r/PrintConfig.cpp:781 msgid "Distance used for the auto-arrange feature of the plater." msgstr "Tablanın otomatik düzenleme özelliği için kullanılan mesafesi." -#: src/libslic3r/PrintConfig.cpp:686 +#: src/libslic3r/PrintConfig.cpp:789 msgid "" "This end procedure is inserted at the end of the output file. Note that you " "can use placeholder variables for all PrusaSlicer settings." msgstr "" -#: src/libslic3r/PrintConfig.cpp:696 +#: src/libslic3r/PrintConfig.cpp:799 msgid "" "This end procedure is inserted at the end of the output file, before the " "printer end gcode (and before any toolchange from this filament in case of " @@ -10827,23 +12679,11 @@ msgid "" "in extruder order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:707 -msgid "Ensure vertical shell thickness" -msgstr "Dikey kabuk kalınlığını sağlamlaştır" - -#: src/libslic3r/PrintConfig.cpp:709 -msgid "" -"Add solid infill near sloping surfaces to guarantee the vertical shell " -"thickness (top+bottom solid layers)." -msgstr "" -"Dikey kabuk kalınlığını (üst + alt katı katmanlar) garanti altına almak için " -"eğimli yüzeylerin yanına katı dolgu ekler." - -#: src/libslic3r/PrintConfig.cpp:715 +#: src/libslic3r/PrintConfig.cpp:810 msgid "Top fill pattern" msgstr "Üst dolgu deseni" -#: src/libslic3r/PrintConfig.cpp:717 +#: src/libslic3r/PrintConfig.cpp:812 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." @@ -10851,45 +12691,45 @@ msgstr "" "Üst dolgu deseni. Bu sadece üstteki görünür katmanı etkiler, bitişik katı " "katmanları etkilemez." -#: src/libslic3r/PrintConfig.cpp:728 src/libslic3r/PrintConfig.cpp:1169 -#: src/libslic3r/PrintConfig.cpp:2754 src/libslic3r/PrintConfig.cpp:2771 +#: src/libslic3r/PrintConfig.cpp:815 src/libslic3r/PrintConfig.cpp:1228 +#: src/libslic3r/PrintConfig.cpp:2776 src/libslic3r/PrintConfig.cpp:2791 msgid "Rectilinear" msgstr "Düz çizgili" -#: src/libslic3r/PrintConfig.cpp:729 +#: src/libslic3r/PrintConfig.cpp:816 msgid "Monotonic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:730 +#: src/libslic3r/PrintConfig.cpp:817 msgid "Monotonic Lines" msgstr "" -#: src/libslic3r/PrintConfig.cpp:731 src/libslic3r/PrintConfig.cpp:1170 +#: src/libslic3r/PrintConfig.cpp:818 src/libslic3r/PrintConfig.cpp:1229 msgid "Aligned Rectilinear" msgstr "" -#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:1176 -#: src/libslic3r/PrintConfig.cpp:2772 +#: src/libslic3r/PrintConfig.cpp:819 src/libslic3r/PrintConfig.cpp:1235 +#: src/libslic3r/PrintConfig.cpp:2792 msgid "Concentric" msgstr "Ortak merkezli" -#: src/libslic3r/PrintConfig.cpp:733 src/libslic3r/PrintConfig.cpp:1180 +#: src/libslic3r/PrintConfig.cpp:820 src/libslic3r/PrintConfig.cpp:1239 msgid "Hilbert Curve" msgstr "Hilbert Eğrisi" -#: src/libslic3r/PrintConfig.cpp:734 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:821 src/libslic3r/PrintConfig.cpp:1240 msgid "Archimedean Chords" msgstr "Arşimet Akorları" -#: src/libslic3r/PrintConfig.cpp:735 src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:822 src/libslic3r/PrintConfig.cpp:1241 msgid "Octagram Spiral" msgstr "Octagram Spiral" -#: src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:830 msgid "Bottom fill pattern" msgstr "Alt dolgu deseni" -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:832 msgid "" "Fill pattern for bottom infill. This only affects the bottom external " "visible layer, and not its adjacent solid shells." @@ -10897,12 +12737,12 @@ msgstr "" "Alt dolgu deseni. Bu sadece alt dış görünür tabakayı etkiler, bitişik katı " "katmanları etkilemez." -#: src/libslic3r/PrintConfig.cpp:753 src/libslic3r/PrintConfig.cpp:765 -#: src/libslic3r/PrintConfig.cpp:1988 +#: src/libslic3r/PrintConfig.cpp:839 src/libslic3r/PrintConfig.cpp:851 +#: src/libslic3r/PrintConfig.cpp:2018 msgid "External perimeters" msgstr "Dış duvar" -#: src/libslic3r/PrintConfig.cpp:755 +#: src/libslic3r/PrintConfig.cpp:841 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " "perimeters. If left zero, default extrusion width will be used if set, " @@ -10915,18 +12755,18 @@ msgstr "" "çapı kullanılacaktır. Yüzde olarak ifade edilirse (örneğin% 200), katman " "yüksekliği üzerinden hesaplanır." -#: src/libslic3r/PrintConfig.cpp:758 src/libslic3r/PrintConfig.cpp:869 -#: src/libslic3r/PrintConfig.cpp:1223 src/libslic3r/PrintConfig.cpp:1445 -#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1529 -#: src/libslic3r/PrintConfig.cpp:2011 src/libslic3r/PrintConfig.cpp:2397 -#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2660 -#: src/libslic3r/PrintConfig.cpp:2895 src/libslic3r/PrintConfig.cpp:3117 -#: src/libslic3r/PrintConfig.cpp:3132 src/libslic3r/PrintConfig.cpp:3166 -#: src/libslic3r/PrintConfig.cpp:3178 +#: src/libslic3r/PrintConfig.cpp:844 src/libslic3r/PrintConfig.cpp:958 +#: src/libslic3r/PrintConfig.cpp:1283 src/libslic3r/PrintConfig.cpp:1491 +#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1570 +#: src/libslic3r/PrintConfig.cpp:2041 src/libslic3r/PrintConfig.cpp:2428 +#: src/libslic3r/PrintConfig.cpp:2601 src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2983 src/libslic3r/PrintConfig.cpp:3204 +#: src/libslic3r/PrintConfig.cpp:3219 src/libslic3r/PrintConfig.cpp:3253 +#: src/libslic3r/PrintConfig.cpp:3265 msgid "mm or %" msgstr "mm veya %" -#: src/libslic3r/PrintConfig.cpp:767 +#: src/libslic3r/PrintConfig.cpp:853 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " @@ -10936,28 +12776,22 @@ msgstr "" "ifade edilirse (örneğin:% 80), yukarıdaki duvar hız ayarında hesaplanır. " "Otomatik için sıfıra ayarlayın." -#: src/libslic3r/PrintConfig.cpp:770 src/libslic3r/PrintConfig.cpp:1245 -#: src/libslic3r/PrintConfig.cpp:1256 src/libslic3r/PrintConfig.cpp:2356 -#: src/libslic3r/PrintConfig.cpp:2409 src/libslic3r/PrintConfig.cpp:2740 -#: src/libslic3r/PrintConfig.cpp:2909 -msgid "mm/s or %" -msgstr "mm/s veya %" - -#: src/libslic3r/PrintConfig.cpp:777 +#: src/libslic3r/PrintConfig.cpp:863 msgid "External perimeters first" msgstr "Önce dış duvarlar" -#: src/libslic3r/PrintConfig.cpp:779 +#: src/libslic3r/PrintConfig.cpp:865 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." msgstr "Duvarları önce en dıştan başlayarak en içe doğru basar." -#: src/libslic3r/PrintConfig.cpp:785 +#: src/libslic3r/PrintConfig.cpp:871 msgid "Extra perimeters if needed" msgstr "Gerekirse fazladan duvar ekle" -#: src/libslic3r/PrintConfig.cpp:787 +#: src/libslic3r/PrintConfig.cpp:873 +#, fuzzy msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " "keeps adding perimeters, until more than 70% of the loop immediately above " @@ -10967,7 +12801,18 @@ msgstr "" "ekler. Slic3r, hemen üstteki döngünün %70'inden fazlası desteklenene kadar " "duvar eklemeye devam eder." -#: src/libslic3r/PrintConfig.cpp:797 +#: src/libslic3r/PrintConfig.cpp:880 +msgid "Extra perimeters on overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:882 +msgid "" +"Detect overhang areas where bridges cannot be anchored, and fill them with " +"extra perimeter paths. These paths are anchored to the nearby non-overhang " +"area when possible." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:890 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " @@ -10977,7 +12822,7 @@ msgstr "" "Bu değer, duvar ve dolgu ekstrüderlerini geçersiz kılar, ancak destek " "ekstrüderlerini etkilemez." -#: src/libslic3r/PrintConfig.cpp:809 +#: src/libslic3r/PrintConfig.cpp:898 msgid "" "Set this to the vertical distance between your nozzle tip and (usually) the " "X carriage rods. In other words, this is the height of the clearance " @@ -10989,7 +12834,7 @@ msgstr "" "silindirinin yüksekliğidir ve ekstrüderin diğer basılı nesnelerle " "çarpışmadan önce gözetebileceği en fazla derinliği temsil eder." -#: src/libslic3r/PrintConfig.cpp:820 +#: src/libslic3r/PrintConfig.cpp:909 msgid "" "Set this to the clearance radius around your extruder. If the extruder is " "not centered, choose the largest value for safety. This setting is used to " @@ -10999,20 +12844,20 @@ msgstr "" "ortalanmamışsa, güvenlik için en büyük değeri seçin. Bu ayar, çarpışmaları " "kontrol etmek ve grafiksel ön izlemeyi tablada görüntülemek için kullanılır." -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:919 msgid "Extruder Color" msgstr "Ekstrüder Rengi" -#: src/libslic3r/PrintConfig.cpp:831 src/libslic3r/PrintConfig.cpp:894 -#: src/libslic3r/PrintConfig.cpp:3394 +#: src/libslic3r/PrintConfig.cpp:920 src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:3666 msgid "This is only used in the Slic3r interface as a visual help." msgstr "Bu sadece Slic3r arayüzünde görsel bir yardım olarak kullanılır." -#: src/libslic3r/PrintConfig.cpp:837 +#: src/libslic3r/PrintConfig.cpp:926 msgid "Extruder offset" msgstr "Ekstrüder ofset" -#: src/libslic3r/PrintConfig.cpp:838 +#: src/libslic3r/PrintConfig.cpp:927 msgid "" "If your firmware doesn't handle the extruder displacement you need the G-" "code to take it into account. This option lets you specify the displacement " @@ -11024,11 +12869,11 @@ msgstr "" "göre yer değiştirmesini belirtmenizi sağlar. Pozitif koordinatlar " "girilmelidir (XY koordinatından çıkarılacaklar)." -#: src/libslic3r/PrintConfig.cpp:847 +#: src/libslic3r/PrintConfig.cpp:936 msgid "Extrusion axis" msgstr "Ekstrüzyon ekseni" -#: src/libslic3r/PrintConfig.cpp:848 +#: src/libslic3r/PrintConfig.cpp:937 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." @@ -11036,11 +12881,11 @@ msgstr "" "Yazıcınızın ekstrüderiyle ilişkili eksen harfini ayarlamak için bu seçeneği " "kullanın (genellikle E ancak bazı yazıcılar A kullanır)." -#: src/libslic3r/PrintConfig.cpp:853 +#: src/libslic3r/PrintConfig.cpp:942 msgid "Extrusion multiplier" msgstr "Ekstrüzyon çarpanı" -#: src/libslic3r/PrintConfig.cpp:854 +#: src/libslic3r/PrintConfig.cpp:943 msgid "" "This factor changes the amount of flow proportionally. You may need to tweak " "this setting to get nice surface finish and correct single wall widths. " @@ -11053,11 +12898,11 @@ msgstr "" "daha fazla değiştirmeniz gerektiğini düşünüyorsanız, filament çapını ve ürün " "yazılımı E adımlarınızı kontrol edin." -#: src/libslic3r/PrintConfig.cpp:863 +#: src/libslic3r/PrintConfig.cpp:952 msgid "Default extrusion width" msgstr "Varsayılan ekstrüzyon genişliği" -#: src/libslic3r/PrintConfig.cpp:865 +#: src/libslic3r/PrintConfig.cpp:954 msgid "" "Set this to a non-zero value to allow a manual extrusion width. If left to " "zero, Slic3r derives extrusion widths from the nozzle diameter (see the " @@ -11071,11 +12916,11 @@ msgstr "" "genişliği vb. İçin araç ipuçlarına bakın). Yüzde olarak ifade edilirse " "(örneğin:% 230), katman yüksekliği üzerinden hesaplanır." -#: src/libslic3r/PrintConfig.cpp:877 +#: src/libslic3r/PrintConfig.cpp:966 msgid "Keep fan always on" msgstr "Fanı daima açık tut" -#: src/libslic3r/PrintConfig.cpp:878 +#: src/libslic3r/PrintConfig.cpp:967 msgid "" "If this is enabled, fan will never be disabled and will be kept running at " "least at its minimum speed. Useful for PLA, harmful for ABS." @@ -11083,11 +12928,11 @@ msgstr "" "Bu etkinleştirilirse, fan hiçbir zaman devre dışı bırakılmaz ve en azından " "en düşük hızında çalışmaya devam eder. PLA için faydalı, ABS için zararlı." -#: src/libslic3r/PrintConfig.cpp:883 +#: src/libslic3r/PrintConfig.cpp:972 msgid "Enable fan if layer print time is below" msgstr "Katman yazdırma süresi bu değerin altındaysa fanı etkinleştir" -#: src/libslic3r/PrintConfig.cpp:884 +#: src/libslic3r/PrintConfig.cpp:973 msgid "" "If layer print time is estimated below this number of seconds, fan will be " "enabled and its speed will be calculated by interpolating the minimum and " @@ -11096,27 +12941,27 @@ msgstr "" "Katman baskı süresi bu sürenin altında tahmin edilirse, fan etkinleşecek ve " "hızı en az ve en fazla hızları kullanılarak hesaplanacaktır." -#: src/libslic3r/PrintConfig.cpp:886 src/libslic3r/PrintConfig.cpp:2344 +#: src/libslic3r/PrintConfig.cpp:975 src/libslic3r/PrintConfig.cpp:2375 msgid "approximate seconds" msgstr "yaklaşık saniye" -#: src/libslic3r/PrintConfig.cpp:893 src/libslic3r/PrintConfig.cpp:3393 +#: src/libslic3r/PrintConfig.cpp:982 src/libslic3r/PrintConfig.cpp:3665 msgid "Color" msgstr "Renk" -#: src/libslic3r/PrintConfig.cpp:899 +#: src/libslic3r/PrintConfig.cpp:988 msgid "Filament notes" msgstr "Filament notları" -#: src/libslic3r/PrintConfig.cpp:900 +#: src/libslic3r/PrintConfig.cpp:989 msgid "You can put your notes regarding the filament here." msgstr "Filament ile ilgili notlarınızı buraya yazabilirsiniz." -#: src/libslic3r/PrintConfig.cpp:908 src/libslic3r/PrintConfig.cpp:1821 +#: src/libslic3r/PrintConfig.cpp:997 src/libslic3r/PrintConfig.cpp:1858 msgid "Max volumetric speed" msgstr "En yüksek hacimsel hız" -#: src/libslic3r/PrintConfig.cpp:909 +#: src/libslic3r/PrintConfig.cpp:998 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " @@ -11126,27 +12971,27 @@ msgstr "" "hacimsel hızını en düşük baskı ve filament hacimsel hızıyla sınırlandırır. " "Limitsiz olarak sıfıra ayarlayın." -#: src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:1007 msgid "Loading speed" msgstr "Yükleme hızı" -#: src/libslic3r/PrintConfig.cpp:919 +#: src/libslic3r/PrintConfig.cpp:1008 msgid "Speed used for loading the filament on the wipe tower." msgstr "Filamenti temizleme kulesi üzerinde yüklemek için kullanılan hız." -#: src/libslic3r/PrintConfig.cpp:926 +#: src/libslic3r/PrintConfig.cpp:1015 msgid "Loading speed at the start" msgstr "Başlangıçta yükleme hızı" -#: src/libslic3r/PrintConfig.cpp:927 +#: src/libslic3r/PrintConfig.cpp:1016 msgid "Speed used at the very beginning of loading phase." msgstr "Yükleme aşamasının başında kullanılan hız." -#: src/libslic3r/PrintConfig.cpp:934 +#: src/libslic3r/PrintConfig.cpp:1023 msgid "Unloading speed" msgstr "Boşaltma hızı" -#: src/libslic3r/PrintConfig.cpp:935 +#: src/libslic3r/PrintConfig.cpp:1024 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." @@ -11154,22 +12999,22 @@ msgstr "" "Temizleme kulesinde filamenti boşaltmak için kullanılan hız (boşaltmanın ilk " "kısmını etkilemez)." -#: src/libslic3r/PrintConfig.cpp:943 +#: src/libslic3r/PrintConfig.cpp:1032 msgid "Unloading speed at the start" msgstr "Başlangıçta boşaltma hızı" -#: src/libslic3r/PrintConfig.cpp:944 +#: src/libslic3r/PrintConfig.cpp:1033 msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "" "Sıkıştırma işleminden hemen sonra filamentin ucunu boşaltmak için kullanılan " "hız." -#: src/libslic3r/PrintConfig.cpp:951 +#: src/libslic3r/PrintConfig.cpp:1040 msgid "Delay after unloading" msgstr "Boşaltma işleminden sonra gecikme" -#: src/libslic3r/PrintConfig.cpp:952 +#: src/libslic3r/PrintConfig.cpp:1041 msgid "" "Time to wait after the filament is unloaded. May help to get reliable " "toolchanges with flexible materials that may need more time to shrink to " @@ -11179,11 +13024,11 @@ msgstr "" "için daha fazla zamana ihtiyaç duyan esnek malzemelerle güvenilir takım " "değişimleri elde etmenize yardımcı olabilir." -#: src/libslic3r/PrintConfig.cpp:961 +#: src/libslic3r/PrintConfig.cpp:1050 msgid "Number of cooling moves" msgstr "Soğutma hareketi sayısı" -#: src/libslic3r/PrintConfig.cpp:962 +#: src/libslic3r/PrintConfig.cpp:1051 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " "Specify desired number of these moves." @@ -11191,19 +13036,19 @@ msgstr "" "Filament, soğutma tüplerinde ileri geri hareket ettirilerek soğutulur. Bu " "hareketlerin istediğiniz sayısını belirtin." -#: src/libslic3r/PrintConfig.cpp:970 +#: src/libslic3r/PrintConfig.cpp:1059 msgid "Speed of the first cooling move" msgstr "İlk soğutma hareketinin hızı" -#: src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:1060 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "Soğutma hızı bu seviyeden başlayarak kademeli olarak artacaktır." -#: src/libslic3r/PrintConfig.cpp:978 +#: src/libslic3r/PrintConfig.cpp:1067 msgid "Minimal purge on wipe tower" msgstr "Temizleme kulesinde en düşük temizleme" -#: src/libslic3r/PrintConfig.cpp:979 +#: src/libslic3r/PrintConfig.cpp:1068 msgid "" "After a tool change, the exact position of the newly loaded filament inside " "the nozzle may not be known, and the filament pressure is likely not yet " @@ -11218,23 +13063,23 @@ msgstr "" "şekilde üretmek için her zaman bu miktardaki malzemeyi temizleme kulesine " "doldurur." -#: src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:1072 msgid "mm³" msgstr "mm³" -#: src/libslic3r/PrintConfig.cpp:989 +#: src/libslic3r/PrintConfig.cpp:1078 msgid "Speed of the last cooling move" msgstr "Son soğutma hareketinin hızı" -#: src/libslic3r/PrintConfig.cpp:990 +#: src/libslic3r/PrintConfig.cpp:1079 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "Soğutma hızı yavaş yavaş bu hıza doğru artacaktır." -#: src/libslic3r/PrintConfig.cpp:997 +#: src/libslic3r/PrintConfig.cpp:1086 msgid "Filament load time" msgstr "Filament yükleme süresi" -#: src/libslic3r/PrintConfig.cpp:998 +#: src/libslic3r/PrintConfig.cpp:1087 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " "filament during a tool change (when executing the T code). This time is " @@ -11244,11 +13089,11 @@ msgstr "" "(T kodu yürütülürken) yeni bir filament yükleme zamanı. Bu süre, G-code " "zaman tahmincisi tarafından toplam yazdırma zamanına eklenir." -#: src/libslic3r/PrintConfig.cpp:1005 +#: src/libslic3r/PrintConfig.cpp:1094 msgid "Ramming parameters" msgstr "Sıkıştırma parametreleri" -#: src/libslic3r/PrintConfig.cpp:1006 +#: src/libslic3r/PrintConfig.cpp:1095 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." @@ -11256,11 +13101,11 @@ msgstr "" "Bu dize RammingDialog tarafından düzenlenmiştir ve sıkıştırma özel " "parametrelerini içerir." -#: src/libslic3r/PrintConfig.cpp:1012 +#: src/libslic3r/PrintConfig.cpp:1101 msgid "Filament unload time" msgstr "Filament boşaltma süresi" -#: src/libslic3r/PrintConfig.cpp:1013 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " "filament during a tool change (when executing the T code). This time is " @@ -11270,7 +13115,7 @@ msgstr "" "sırasında (T kodunu yürütürken) bir filamenti boşaltma süresi. Bu süre, G-" "code zaman tahmincisi tarafından toplam yazdırma zamanına eklenir." -#: src/libslic3r/PrintConfig.cpp:1021 +#: src/libslic3r/PrintConfig.cpp:1110 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " @@ -11280,12 +13125,12 @@ msgstr "" "bir kumpas kullanın ve filament boyunca birçok ölçüm yapın, ardından " "ortalamayı hesaplayın." -#: src/libslic3r/PrintConfig.cpp:1028 src/libslic3r/PrintConfig.cpp:3432 -#: src/libslic3r/PrintConfig.cpp:3433 +#: src/libslic3r/PrintConfig.cpp:1117 src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3710 msgid "Density" msgstr "Yoğunluk" -#: src/libslic3r/PrintConfig.cpp:1029 +#: src/libslic3r/PrintConfig.cpp:1118 msgid "" "Enter your filament density here. This is only for statistical information. " "A decent way is to weigh a known length of filament and compute the ratio of " @@ -11297,27 +13142,27 @@ msgstr "" "oranını hesaplamaktır. Daha iyisi, hacmi doğrudan yer değiştirme yoluyla " "hesaplamaktır." -#: src/libslic3r/PrintConfig.cpp:1032 +#: src/libslic3r/PrintConfig.cpp:1121 msgid "g/cm³" msgstr "g/cm³" -#: src/libslic3r/PrintConfig.cpp:1037 +#: src/libslic3r/PrintConfig.cpp:1126 msgid "Filament type" msgstr "Filament tipi" -#: src/libslic3r/PrintConfig.cpp:1038 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "The filament material type for use in custom G-codes." msgstr "Özel G kodlarında kullanım için filament malzeme tipi." -#: src/libslic3r/PrintConfig.cpp:1066 +#: src/libslic3r/PrintConfig.cpp:1155 msgid "Soluble material" msgstr "Çözünür malzeme" -#: src/libslic3r/PrintConfig.cpp:1067 +#: src/libslic3r/PrintConfig.cpp:1156 msgid "Soluble material is most likely used for a soluble support." msgstr "Çözünebilir malzeme genellikle destekler için kullanılır." -#: src/libslic3r/PrintConfig.cpp:1073 +#: src/libslic3r/PrintConfig.cpp:1162 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." @@ -11325,15 +13170,15 @@ msgstr "" "Buraya kg başına filament maliyetinizi girin. Bu sadece istatistiksel bilgi " "içindir." -#: src/libslic3r/PrintConfig.cpp:1074 +#: src/libslic3r/PrintConfig.cpp:1163 msgid "money/kg" msgstr "fiyat/kg" -#: src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1168 msgid "Spool weight" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1080 +#: src/libslic3r/PrintConfig.cpp:1169 msgid "" "Enter weight of the empty filament spool. One may weigh a partially consumed " "filament spool before printing and one may compare the measured weight with " @@ -11341,19 +13186,19 @@ msgid "" "amount of filament on the spool is sufficient to finish the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1084 +#: src/libslic3r/PrintConfig.cpp:1173 msgid "g" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1093 src/libslic3r/PrintConfig.cpp:3537 +#: src/libslic3r/PrintConfig.cpp:1182 src/libslic3r/PrintConfig.cpp:3814 msgid "(Unknown)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:1186 msgid "Fill angle" msgstr "Doldurma açısı" -#: src/libslic3r/PrintConfig.cpp:1099 +#: src/libslic3r/PrintConfig.cpp:1188 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " @@ -11363,63 +13208,63 @@ msgstr "" "uygulanacaktır. Köprüler, Slic3r uygulamasının algılayabileceği en iyi yön " "kullanılarak doldurulur, bu nedenle bu ayar onları etkilemez." -#: src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1199 msgid "Fill density" msgstr "Dolgu yoğunluğu" -#: src/libslic3r/PrintConfig.cpp:1113 +#: src/libslic3r/PrintConfig.cpp:1201 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "İç dolgu yoğunluğu, %0 - %100 aralığında ifade edilir." -#: src/libslic3r/PrintConfig.cpp:1148 +#: src/libslic3r/PrintConfig.cpp:1224 msgid "Fill pattern" msgstr "Dolgu deseni" -#: src/libslic3r/PrintConfig.cpp:1150 +#: src/libslic3r/PrintConfig.cpp:1226 msgid "Fill pattern for general low-density infill." msgstr "Genel düşük yoğunluklu dolgu için dolgu deseni." -#: src/libslic3r/PrintConfig.cpp:1171 src/libslic3r/PrintConfig.cpp:2803 +#: src/libslic3r/PrintConfig.cpp:1230 src/libslic3r/PrintConfig.cpp:2822 msgid "Grid" msgstr "Kafes" -#: src/libslic3r/PrintConfig.cpp:1173 +#: src/libslic3r/PrintConfig.cpp:1232 msgid "Stars" msgstr "Yıldızlar" -#: src/libslic3r/PrintConfig.cpp:1174 +#: src/libslic3r/PrintConfig.cpp:1233 msgid "Cubic" msgstr "Kübik" -#: src/libslic3r/PrintConfig.cpp:1175 +#: src/libslic3r/PrintConfig.cpp:1234 msgid "Line" msgstr "Hat" -#: src/libslic3r/PrintConfig.cpp:1177 src/libslic3r/PrintConfig.cpp:2756 +#: src/libslic3r/PrintConfig.cpp:1236 src/libslic3r/PrintConfig.cpp:2778 msgid "Honeycomb" msgstr "Bal peteği" -#: src/libslic3r/PrintConfig.cpp:1178 +#: src/libslic3r/PrintConfig.cpp:1237 msgid "3D Honeycomb" msgstr "3B Petek" -#: src/libslic3r/PrintConfig.cpp:1179 +#: src/libslic3r/PrintConfig.cpp:1238 msgid "Gyroid" msgstr "Gyroid" -#: src/libslic3r/PrintConfig.cpp:1183 +#: src/libslic3r/PrintConfig.cpp:1242 msgid "Adaptive Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1184 +#: src/libslic3r/PrintConfig.cpp:1243 msgid "Support Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1185 +#: src/libslic3r/PrintConfig.cpp:1244 msgid "Lightning" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1190 +#: src/libslic3r/PrintConfig.cpp:1250 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." @@ -11427,22 +13272,22 @@ msgstr "" "Bu, yazıcınızın ilk katman için kullanacağı hızlanmadır. İlk katman için " "hızlanma kontrolünü devre dışı bırakmak için sıfıra ayarlayın." -#: src/libslic3r/PrintConfig.cpp:1198 +#: src/libslic3r/PrintConfig.cpp:1258 msgid "First object layer over raft interface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1199 +#: src/libslic3r/PrintConfig.cpp:1259 msgid "" "This is the acceleration your printer will use for first layer of object " "above raft interface. Set zero to disable acceleration control for first " "layer of object above raft interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "First layer bed temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1209 +#: src/libslic3r/PrintConfig.cpp:1269 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." @@ -11450,7 +13295,7 @@ msgstr "" "İlk katman için ısıtılmış tabla sıcaklığı. G-code dosyası tabla sıcaklığı " "kontrol komutlarını devre dışı bırakmak için bunu sıfıra ayarlayın." -#: src/libslic3r/PrintConfig.cpp:1219 +#: src/libslic3r/PrintConfig.cpp:1279 msgid "" "Set this to a non-zero value to set a manual extrusion width for first " "layer. You can use this to force fatter extrudates for better adhesion. If " @@ -11463,18 +13308,18 @@ msgstr "" "(örneğin% 120), ilk katman yüksekliği üzerinden hesaplanır. Sıfıra " "ayarlanırsa, varsayılan ekstrüzyon genişliğini kullanır." -#: src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1293 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " "plates." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1301 msgid "First layer speed" msgstr "İlk katman hızı" -#: src/libslic3r/PrintConfig.cpp:1242 +#: src/libslic3r/PrintConfig.cpp:1302 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " @@ -11484,11 +13329,11 @@ msgstr "" "bakılmaksızın, ilk katmanın tüm yazdırma hareketlerine uygulanır. Yüzde " "olarak ifade edilirse (örneğin:% 40), varsayılan hızları ölçeklendirir." -#: src/libslic3r/PrintConfig.cpp:1252 +#: src/libslic3r/PrintConfig.cpp:1312 msgid "Speed of object first layer over raft interface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1253 +#: src/libslic3r/PrintConfig.cpp:1313 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first object layer above raft interface, regardless " @@ -11496,22 +13341,22 @@ msgid "" "the default speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1263 +#: src/libslic3r/PrintConfig.cpp:1323 msgid "First layer nozzle temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1264 +#: src/libslic3r/PrintConfig.cpp:1324 msgid "" "Nozzle temperature for the first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " "commands in the output G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1272 +#: src/libslic3r/PrintConfig.cpp:1332 msgid "Full fan speed at layer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1273 +#: src/libslic3r/PrintConfig.cpp:1333 msgid "" "Fan speed will be ramped up linearly from zero at layer " "\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". " @@ -11520,50 +13365,54 @@ msgid "" "maximum allowed speed at layer \"disable_fan_first_layers\" + 1." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1285 +#: src/libslic3r/PrintConfig.cpp:1345 msgid "Fuzzy skin type." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1348 msgid "Outside walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1293 +#: src/libslic3r/PrintConfig.cpp:1349 msgid "All walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1298 +#: src/libslic3r/PrintConfig.cpp:1355 msgid "Fuzzy skin thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1300 +#: src/libslic3r/PrintConfig.cpp:1357 msgid "" "The maximum distance that each skin point can be offset (both ways), " "measured perpendicular to the perimeter wall." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1308 +#: src/libslic3r/PrintConfig.cpp:1365 msgid "Fuzzy skin point distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1310 +#: src/libslic3r/PrintConfig.cpp:1367 msgid "" "Perimeters will be split into multiple segments by inserting Fuzzy skin " "points. Lowering the Fuzzy skin point distance will increase the number of " "randomly offset points on the perimeter wall." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1318 +#: src/libslic3r/PrintConfig.cpp:1375 msgid "Fill gaps" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1320 +#: src/libslic3r/PrintConfig.cpp:1377 msgid "" "Enables filling of gaps between perimeters and between the inner most " "perimeters and infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1327 +#: src/libslic3r/PrintConfig.cpp:1382 +msgid "Gap fill" +msgstr "Boşluk doldurma" + +#: src/libslic3r/PrintConfig.cpp:1384 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " @@ -11573,11 +13422,11 @@ msgstr "" "titreme ve rezonans sorunlarından kaçınmak için bunu oldukça düşük tutun. " "Boşluk doldurmayı devre dışı bırakmak için sıfıra ayarlayın." -#: src/libslic3r/PrintConfig.cpp:1335 +#: src/libslic3r/PrintConfig.cpp:1392 msgid "Verbose G-code" msgstr "Ayrıntılı G-kodu" -#: src/libslic3r/PrintConfig.cpp:1336 +#: src/libslic3r/PrintConfig.cpp:1393 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " @@ -11587,11 +13436,11 @@ msgstr "" "etkinleştirin. SD karttan yazdırma işleminde dosya büyüklüğü artacağından " "yazılıma ek bir yük getirebilir." -#: src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1400 msgid "G-code flavor" msgstr "G-code derleyici" -#: src/libslic3r/PrintConfig.cpp:1344 +#: src/libslic3r/PrintConfig.cpp:1401 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " @@ -11599,15 +13448,15 @@ msgid "" "extrusion value at all." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1416 msgid "No extrusion" msgstr "Ekstrüzyon yok" -#: src/libslic3r/PrintConfig.cpp:1376 +#: src/libslic3r/PrintConfig.cpp:1422 msgid "Label objects" msgstr "Nesneleri etiketle" -#: src/libslic3r/PrintConfig.cpp:1377 +#: src/libslic3r/PrintConfig.cpp:1423 msgid "" "Enable this to add comments into the G-Code labeling print moves with what " "object they belong to, which is useful for the Octoprint CancelObject " @@ -11619,19 +13468,19 @@ msgstr "" "Nesne İptal (CancelObject) eklentisi için kullanışlıdır. Bu ayarlar, Tek " "Ekstrüder Çoklu Malzeme ayarları ile uyumlu DEĞİLDİR." -#: src/libslic3r/PrintConfig.cpp:1384 +#: src/libslic3r/PrintConfig.cpp:1430 msgid "G-code substitutions" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1385 +#: src/libslic3r/PrintConfig.cpp:1431 msgid "Find / replace patterns in G-code lines and substitute them." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1390 +#: src/libslic3r/PrintConfig.cpp:1436 msgid "High extruder current on filament swap" msgstr "Filament değişiminde yüksek ekstrüder akımı" -#: src/libslic3r/PrintConfig.cpp:1391 +#: src/libslic3r/PrintConfig.cpp:1437 msgid "" "It may be beneficial to increase the extruder motor current during the " "filament exchange sequence to allow for rapid ramming feed rates and to " @@ -11641,7 +13490,7 @@ msgstr "" "hızlı sıkıştırma hızlarını sağlamak ve çirkin şekilli bir ucu olan bir " "filament yüklenirken direncin üstesinden gelmek için faydalı olabilir." -#: src/libslic3r/PrintConfig.cpp:1399 +#: src/libslic3r/PrintConfig.cpp:1445 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." @@ -11649,23 +13498,33 @@ msgstr "" "Bu, yazıcınızın dolgu için kullanacağı hızlanmadır. Dolgu için hızlanma " "kontrolünü devre dışı bırakmak için sıfıra ayarlayın." -#: src/libslic3r/PrintConfig.cpp:1408 +#: src/libslic3r/PrintConfig.cpp:1453 src/libslic3r/PrintConfig.cpp:2423 +#: src/libslic3r/PrintConfig.cpp:2435 +msgid "Solid infill" +msgstr "Katı dolgu" + +#: src/libslic3r/PrintConfig.cpp:1454 msgid "" "This is the acceleration your printer will use for solid infill. Set zero to " "use the value for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:2977 +#: src/libslic3r/PrintConfig.cpp:2990 +msgid "Top solid infill" +msgstr "Üst katı dolgu" + +#: src/libslic3r/PrintConfig.cpp:1463 msgid "" "This is the acceleration your printer will use for top solid infill. Set " "zero to use the value for solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1426 +#: src/libslic3r/PrintConfig.cpp:1472 msgid "Combine infill every" msgstr "Her n katmanda bir dolgu yap" -#: src/libslic3r/PrintConfig.cpp:1428 +#: src/libslic3r/PrintConfig.cpp:1474 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." @@ -11674,15 +13533,15 @@ msgstr "" "dolgu katmanlarını sıkıştırarak baskınızı hızlandırır, böylece doğruluk " "sağlar." -#: src/libslic3r/PrintConfig.cpp:1431 +#: src/libslic3r/PrintConfig.cpp:1477 msgid "Combine infill every n layers" msgstr "Her n katmanındaki dolgu yap" -#: src/libslic3r/PrintConfig.cpp:1437 +#: src/libslic3r/PrintConfig.cpp:1483 msgid "Length of the infill anchor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1439 +#: src/libslic3r/PrintConfig.cpp:1485 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -11695,35 +13554,35 @@ msgid "" "perimeters connected to a single infill line." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1455 +#: src/libslic3r/PrintConfig.cpp:1495 msgid "0 (no open anchors)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1456 src/libslic3r/PrintConfig.cpp:1479 +#: src/libslic3r/PrintConfig.cpp:1496 src/libslic3r/PrintConfig.cpp:1519 msgid "1 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1457 src/libslic3r/PrintConfig.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:1520 msgid "2 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1458 src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1498 src/libslic3r/PrintConfig.cpp:1521 msgid "5 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1459 src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1499 src/libslic3r/PrintConfig.cpp:1522 msgid "10 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1460 src/libslic3r/PrintConfig.cpp:1483 +#: src/libslic3r/PrintConfig.cpp:1500 src/libslic3r/PrintConfig.cpp:1523 msgid "1000 (unlimited)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1465 +#: src/libslic3r/PrintConfig.cpp:1506 msgid "Maximum length of the infill anchor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1508 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -11735,19 +13594,19 @@ msgid "" "parameter. Set this parameter to zero to disable anchoring." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1478 +#: src/libslic3r/PrintConfig.cpp:1518 msgid "0 (not anchored)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1488 +#: src/libslic3r/PrintConfig.cpp:1529 msgid "Infill extruder" msgstr "Dolgu" -#: src/libslic3r/PrintConfig.cpp:1490 +#: src/libslic3r/PrintConfig.cpp:1531 msgid "The extruder to use when printing infill." msgstr "Dolgu yazdırırken kullanılacak ekstrüder." -#: src/libslic3r/PrintConfig.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:1539 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill. If " "left zero, default extrusion width will be used if set, otherwise 1.125 x " @@ -11762,11 +13621,11 @@ msgstr "" "getirmek için yağlı ekstrüdatlar kullanmak isteyebilirsiniz. Yüzde olarak " "ifade edilirse (örneğin% 90), katman yüksekliği üzerinden hesaplanır." -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1550 msgid "Infill before perimeters" msgstr "Duvarlardan önce dolgu yap" -#: src/libslic3r/PrintConfig.cpp:1510 +#: src/libslic3r/PrintConfig.cpp:1551 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." @@ -11774,11 +13633,11 @@ msgstr "" "Bu seçenek, varsayılanın aksine önce dolguyu yapıp daha sonra duvarların " "basılmasını sağlar." -#: src/libslic3r/PrintConfig.cpp:1515 +#: src/libslic3r/PrintConfig.cpp:1556 msgid "Only infill where needed" msgstr "Sadece ihtiyaç duyulan yerlerde dolgu yap" -#: src/libslic3r/PrintConfig.cpp:1517 +#: src/libslic3r/PrintConfig.cpp:1558 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " @@ -11789,11 +13648,11 @@ msgstr "" "Etkinleştirilirse, söz konusu birden fazla kontrol nedeniyle G kodu " "oluşumunu yavaşlatır." -#: src/libslic3r/PrintConfig.cpp:1524 +#: src/libslic3r/PrintConfig.cpp:1565 msgid "Infill/perimeters overlap" msgstr "Dolgu/duvar üst üste binme" -#: src/libslic3r/PrintConfig.cpp:1526 +#: src/libslic3r/PrintConfig.cpp:1567 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -11805,23 +13664,23 @@ msgstr "" "boşluklara neden olabilir. Yüzde olarak ifade edilirse (örnek:% 15), duvar " "ekstrüzyon genişliği üzerinden hesaplanır." -#: src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "Dahili dolguyu yazdırma hızı. Otomatik için sıfıra ayarlayın." -#: src/libslic3r/PrintConfig.cpp:1545 +#: src/libslic3r/PrintConfig.cpp:1586 msgid "Inherits profile" msgstr "Miras profil" -#: src/libslic3r/PrintConfig.cpp:1546 +#: src/libslic3r/PrintConfig.cpp:1587 msgid "Name of the profile, from which this profile inherits." msgstr "Bu profilin devraldığı profilin adı." -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1600 msgid "Interface shells" msgstr "Ara bağlantı duvarları" -#: src/libslic3r/PrintConfig.cpp:1560 +#: src/libslic3r/PrintConfig.cpp:1601 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " @@ -11831,61 +13690,61 @@ msgstr "" "saydam malzemelerle veya çözülebilir destek malzemeleriyle çoklu ekstrüder " "baskıları için kullanışlıdır." -#: src/libslic3r/PrintConfig.cpp:1568 +#: src/libslic3r/PrintConfig.cpp:1609 msgid "Maximum width of a segmented region" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1569 +#: src/libslic3r/PrintConfig.cpp:1610 msgid "Maximum width of a segmented region. Zero disables this feature." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1570 src/libslic3r/PrintConfig.cpp:2189 -#: src/libslic3r/PrintConfig.cpp:2198 +#: src/libslic3r/PrintConfig.cpp:1611 src/libslic3r/PrintConfig.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2228 msgid "mm (zero to disable)" msgstr "mm (devre dışı bırakmak için sıfır)" -#: src/libslic3r/PrintConfig.cpp:1577 +#: src/libslic3r/PrintConfig.cpp:1618 msgid "Enable ironing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1578 +#: src/libslic3r/PrintConfig.cpp:1619 msgid "" "Enable ironing of the top layers with the hot print head for smooth surface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1584 src/libslic3r/PrintConfig.cpp:1586 +#: src/libslic3r/PrintConfig.cpp:1625 src/libslic3r/PrintConfig.cpp:1627 msgid "Ironing Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1591 +#: src/libslic3r/PrintConfig.cpp:1629 msgid "All top surfaces" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Topmost surface only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1593 +#: src/libslic3r/PrintConfig.cpp:1631 msgid "All solid surfaces" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1598 +#: src/libslic3r/PrintConfig.cpp:1637 msgid "Flow rate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Percent of a flow rate relative to object's normal layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1608 +#: src/libslic3r/PrintConfig.cpp:1647 msgid "Spacing between ironing passes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1649 msgid "Distance between ironing lines" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1627 +#: src/libslic3r/PrintConfig.cpp:1666 msgid "" "This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can " @@ -11897,11 +13756,11 @@ msgstr "" "değişkenlerini tüm Slic3r ayarlarının yanı sıra [layer_num] ve [layer_z] " "için kullanabileceğinizi unutmayın." -#: src/libslic3r/PrintConfig.cpp:1638 +#: src/libslic3r/PrintConfig.cpp:1677 msgid "Supports remaining times" msgstr "Kalan süreleri destekler" -#: src/libslic3r/PrintConfig.cpp:1639 +#: src/libslic3r/PrintConfig.cpp:1678 msgid "" "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " "intervals into the G-code to let the firmware show accurate remaining time. " @@ -11913,155 +13772,155 @@ msgstr "" "uygulanır. Şu an itibariyle sadece Prusa i3 MK3 yazılımı M73'ü tanıyor. " "Ayrıca i3 MK3 üretici yazılımı sessiz mod için M73 Qxx Sxx'i destekler." -#: src/libslic3r/PrintConfig.cpp:1647 +#: src/libslic3r/PrintConfig.cpp:1686 msgid "Supports stealth mode" msgstr "Gizli modu destekler" -#: src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1687 msgid "The firmware supports stealth mode" msgstr "Üretici yazılımı gizli modu destekliyor" -#: src/libslic3r/PrintConfig.cpp:1653 +#: src/libslic3r/PrintConfig.cpp:1692 msgid "How to apply limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1654 +#: src/libslic3r/PrintConfig.cpp:1693 msgid "Purpose of Machine Limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1656 +#: src/libslic3r/PrintConfig.cpp:1695 msgid "How to apply the Machine Limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1661 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "Emit to G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1662 +#: src/libslic3r/PrintConfig.cpp:1698 msgid "Use for time estimate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1663 +#: src/libslic3r/PrintConfig.cpp:1699 msgid "Ignore" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1686 +#: src/libslic3r/PrintConfig.cpp:1723 msgid "Maximum feedrate X" msgstr "En yüksek hız X" -#: src/libslic3r/PrintConfig.cpp:1687 +#: src/libslic3r/PrintConfig.cpp:1724 msgid "Maximum feedrate Y" msgstr "En yüksek hız Y" -#: src/libslic3r/PrintConfig.cpp:1688 +#: src/libslic3r/PrintConfig.cpp:1725 msgid "Maximum feedrate Z" msgstr "En yüksek hız Z" -#: src/libslic3r/PrintConfig.cpp:1689 +#: src/libslic3r/PrintConfig.cpp:1726 msgid "Maximum feedrate E" msgstr "En yüksek hız E" -#: src/libslic3r/PrintConfig.cpp:1692 +#: src/libslic3r/PrintConfig.cpp:1729 msgid "Maximum feedrate of the X axis" msgstr "X ekseninin en fazla ilerleme hızı" -#: src/libslic3r/PrintConfig.cpp:1693 +#: src/libslic3r/PrintConfig.cpp:1730 msgid "Maximum feedrate of the Y axis" msgstr "Y ekseninin en fazla ilerleme hızı" -#: src/libslic3r/PrintConfig.cpp:1694 +#: src/libslic3r/PrintConfig.cpp:1731 msgid "Maximum feedrate of the Z axis" msgstr "Z ekseninin en fazla ilerleme hızı" -#: src/libslic3r/PrintConfig.cpp:1695 +#: src/libslic3r/PrintConfig.cpp:1732 msgid "Maximum feedrate of the E axis" msgstr "E ekseninin en fazla ilerleme hızı" -#: src/libslic3r/PrintConfig.cpp:1703 +#: src/libslic3r/PrintConfig.cpp:1740 msgid "Maximum acceleration X" msgstr "En yüksek hızlanma X" -#: src/libslic3r/PrintConfig.cpp:1704 +#: src/libslic3r/PrintConfig.cpp:1741 msgid "Maximum acceleration Y" msgstr "En yüksek hızlanma Y" -#: src/libslic3r/PrintConfig.cpp:1705 +#: src/libslic3r/PrintConfig.cpp:1742 msgid "Maximum acceleration Z" msgstr "En yüksek hızlanma Z" -#: src/libslic3r/PrintConfig.cpp:1706 +#: src/libslic3r/PrintConfig.cpp:1743 msgid "Maximum acceleration E" msgstr "En yüksek hızlanma E" -#: src/libslic3r/PrintConfig.cpp:1709 +#: src/libslic3r/PrintConfig.cpp:1746 msgid "Maximum acceleration of the X axis" msgstr "X ekseninin en yüksek ivmesi" -#: src/libslic3r/PrintConfig.cpp:1710 +#: src/libslic3r/PrintConfig.cpp:1747 msgid "Maximum acceleration of the Y axis" msgstr "Y ekseninin en yüksek ivmesi" -#: src/libslic3r/PrintConfig.cpp:1711 +#: src/libslic3r/PrintConfig.cpp:1748 msgid "Maximum acceleration of the Z axis" msgstr "Z ekseninin en yüksek ivmesi" -#: src/libslic3r/PrintConfig.cpp:1712 +#: src/libslic3r/PrintConfig.cpp:1749 msgid "Maximum acceleration of the E axis" msgstr "E ekseninin en yüksek ivmesi" -#: src/libslic3r/PrintConfig.cpp:1720 +#: src/libslic3r/PrintConfig.cpp:1757 msgid "Maximum jerk X" msgstr "En yüksek ani hareket X" -#: src/libslic3r/PrintConfig.cpp:1721 +#: src/libslic3r/PrintConfig.cpp:1758 msgid "Maximum jerk Y" msgstr "En yüksek ani hareket Y" -#: src/libslic3r/PrintConfig.cpp:1722 +#: src/libslic3r/PrintConfig.cpp:1759 msgid "Maximum jerk Z" msgstr "En yüksek ani hareket Z" -#: src/libslic3r/PrintConfig.cpp:1723 +#: src/libslic3r/PrintConfig.cpp:1760 msgid "Maximum jerk E" msgstr "En yüksek ani hareket E" -#: src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:1763 msgid "Maximum jerk of the X axis" msgstr "X ekseninin en yüksek ani hareketi" -#: src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1764 msgid "Maximum jerk of the Y axis" msgstr "Y ekseninin en yüksek ani hareketi" -#: src/libslic3r/PrintConfig.cpp:1728 +#: src/libslic3r/PrintConfig.cpp:1765 msgid "Maximum jerk of the Z axis" msgstr "Z ekseni en yüksek ani hareketi" -#: src/libslic3r/PrintConfig.cpp:1729 +#: src/libslic3r/PrintConfig.cpp:1766 msgid "Maximum jerk of the E axis" msgstr "E ekseninin en yüksek ani hareketi" -#: src/libslic3r/PrintConfig.cpp:1739 +#: src/libslic3r/PrintConfig.cpp:1776 msgid "Minimum feedrate when extruding" msgstr "Ekstrüzyon sırasında en düşük ilerleme hızı" -#: src/libslic3r/PrintConfig.cpp:1741 +#: src/libslic3r/PrintConfig.cpp:1778 msgid "Minimum feedrate when extruding (M205 S)" msgstr "Ekstrüzyon sırasında en düşük ilerleme hızı (M205 S)" -#: src/libslic3r/PrintConfig.cpp:1749 +#: src/libslic3r/PrintConfig.cpp:1786 msgid "Minimum travel feedrate" msgstr "En düşük boşta ilerleme hızı" -#: src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:1788 msgid "Minimum travel feedrate (M205 T)" msgstr "En düşük hareket hızı (M205 T)" -#: src/libslic3r/PrintConfig.cpp:1759 +#: src/libslic3r/PrintConfig.cpp:1796 msgid "Maximum acceleration when extruding" msgstr "Ekstrüzyon sırasında en yüksek hızlanma" -#: src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1798 msgid "" "Maximum acceleration when extruding (M204 P)\n" "\n" @@ -12069,31 +13928,31 @@ msgid "" "(M204 T)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1772 +#: src/libslic3r/PrintConfig.cpp:1809 msgid "Maximum acceleration when retracting" msgstr "Geri çekilirken en yüksek hızlanma" -#: src/libslic3r/PrintConfig.cpp:1774 +#: src/libslic3r/PrintConfig.cpp:1811 msgid "Maximum acceleration when retracting (M204 R)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1782 +#: src/libslic3r/PrintConfig.cpp:1819 msgid "Maximum acceleration for travel moves" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1784 +#: src/libslic3r/PrintConfig.cpp:1821 msgid "Maximum acceleration for travel moves (M204 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1791 src/libslic3r/PrintConfig.cpp:1800 +#: src/libslic3r/PrintConfig.cpp:1828 src/libslic3r/PrintConfig.cpp:1837 msgid "Max" msgstr "En fazla" -#: src/libslic3r/PrintConfig.cpp:1792 +#: src/libslic3r/PrintConfig.cpp:1829 msgid "This setting represents the maximum speed of your fan." msgstr "Bu ayar, fanınızın en fazla hızını gösterir." -#: src/libslic3r/PrintConfig.cpp:1801 +#: src/libslic3r/PrintConfig.cpp:1838 msgid "" "This is the highest printable layer height for this extruder, used to cap " "the variable layer height and support layer height. Maximum recommended " @@ -12106,11 +13965,11 @@ msgstr "" "ekstrüzyon genişliğinin %75'idir. Eğer 0 olarak girilirse katman yüksekliği " "nozül çapının %75'i ile sınırlandırılır." -#: src/libslic3r/PrintConfig.cpp:1811 +#: src/libslic3r/PrintConfig.cpp:1848 msgid "Max print speed" msgstr "En yüksek baskı hızı" -#: src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1849 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " @@ -12120,7 +13979,7 @@ msgstr "" "korumak için optimum hızı otomatik olarak hesaplayacaktır. Bu deneysel ayar, " "izin vermek istediğiniz en yüksek baskı hızını ayarlamak için kullanılır." -#: src/libslic3r/PrintConfig.cpp:1822 +#: src/libslic3r/PrintConfig.cpp:1859 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." @@ -12128,11 +13987,11 @@ msgstr "" "Bu deneysel ayar, ekstrüderinizin desteklediği en fazla hacimsel hızı " "ayarlamak için kullanılır." -#: src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1867 msgid "Max volumetric slope positive" msgstr "Max hacimsel eğim pozitif" -#: src/libslic3r/PrintConfig.cpp:1831 +#: src/libslic3r/PrintConfig.cpp:1868 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from lower speed to higher speed. A value of 1.8 mm³/" @@ -12141,15 +14000,15 @@ msgid "" "(feedrate 60 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1836 src/libslic3r/PrintConfig.cpp:1848 +#: src/libslic3r/PrintConfig.cpp:1873 src/libslic3r/PrintConfig.cpp:1885 msgid "mm³/s²" msgstr "mm³/s²" -#: src/libslic3r/PrintConfig.cpp:1842 +#: src/libslic3r/PrintConfig.cpp:1879 msgid "Max volumetric slope negative" msgstr "En yüksek hacimsel eğim negatif" -#: src/libslic3r/PrintConfig.cpp:1843 +#: src/libslic3r/PrintConfig.cpp:1880 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from higher speed to lower speed. A value of 1.8 mm³/" @@ -12158,16 +14017,16 @@ msgid "" "(feedrate 20 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1854 src/libslic3r/PrintConfig.cpp:1863 +#: src/libslic3r/PrintConfig.cpp:1891 src/libslic3r/PrintConfig.cpp:1900 msgid "Min" msgstr "Min" -#: src/libslic3r/PrintConfig.cpp:1855 +#: src/libslic3r/PrintConfig.cpp:1892 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "" "Bu ayar, fanınızın çalışması için gereken en düşük PWM değerini gösterir." -#: src/libslic3r/PrintConfig.cpp:1864 +#: src/libslic3r/PrintConfig.cpp:1901 msgid "" "This is the lowest printable layer height for this extruder and limits the " "resolution for variable layer height. Typical values are between 0.05 mm and " @@ -12177,19 +14036,19 @@ msgstr "" "katman yüksekliği için çözünürlüğü sınırlar. Tipik değerler 0,05 mm ile 0,1 " "mm arasındadır." -#: src/libslic3r/PrintConfig.cpp:1872 +#: src/libslic3r/PrintConfig.cpp:1909 msgid "Min print speed" msgstr "En düşük baskı hızı" -#: src/libslic3r/PrintConfig.cpp:1873 +#: src/libslic3r/PrintConfig.cpp:1910 msgid "Slic3r will not scale speed down below this speed." msgstr "Slic3r, hızı bu değerin altına düşürmez." -#: src/libslic3r/PrintConfig.cpp:1880 +#: src/libslic3r/PrintConfig.cpp:1917 msgid "Minimal filament extrusion length" msgstr "En düşük filament ekstrüzyon uzunluğu" -#: src/libslic3r/PrintConfig.cpp:1881 +#: src/libslic3r/PrintConfig.cpp:1918 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " @@ -12199,11 +14058,11 @@ msgstr "" "en az bu değer kadar filament kullanılarak etek basılır. Çoklu ekstrüder " "yazıcılarda bu her ekstrüder için geçerlidir." -#: src/libslic3r/PrintConfig.cpp:1890 +#: src/libslic3r/PrintConfig.cpp:1927 msgid "Configuration notes" msgstr "Yapılandırma notları" -#: src/libslic3r/PrintConfig.cpp:1891 +#: src/libslic3r/PrintConfig.cpp:1928 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." @@ -12211,16 +14070,16 @@ msgstr "" "Kişisel notlarınızı buraya yazabilirsiniz. Bu metin G-kod başlığı " "yorumlarına eklenecektir." -#: src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:1938 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "Nozül çapı (örneğin: 0,5, 0,35 vb.)" -#: src/libslic3r/PrintConfig.cpp:1906 +#: src/libslic3r/PrintConfig.cpp:1943 msgid "Host Type" msgstr "Ana bilgisayar türü" -#: src/libslic3r/PrintConfig.cpp:1907 +#: src/libslic3r/PrintConfig.cpp:1944 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." @@ -12228,11 +14087,11 @@ msgstr "" "Slic3r, G kodu dosyalarını bir yazıcı ana bilgisayarına yükleyebilir. Bu " "alan, ana bilgisayarın türünü içermelidir." -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:1961 msgid "Only retract when crossing perimeters" msgstr "Yalnızca duvarların üzerinden geçerken geri çekme uygula" -#: src/libslic3r/PrintConfig.cpp:1930 +#: src/libslic3r/PrintConfig.cpp:1962 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." @@ -12240,21 +14099,17 @@ msgstr "" "Üst katmanın duvarları üzerinden geçilmeyecek ise geri çekmeyi devre dışı " "bırak. (böylece herhangi bir sızıntı muhtemelen görünmez olacaktır)." -#: src/libslic3r/PrintConfig.cpp:1937 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "" "This option will drop the temperature of the inactive extruders to prevent " -"oozing. It will enable a tall skirt automatically and move extruders outside " -"such skirt when changing temperatures." +"oozing. " msgstr "" -"Bu seçenek sızmayı önlemek için aktif olmayan ekstrüderlerin sıcaklığını " -"düşürecektir. Otomatik olarak uzun bir eteğe izin verecek ve sıcaklık " -"değiştirirken ekstrüderleri bu eteklerin dışına taşıyacaktır." -#: src/libslic3r/PrintConfig.cpp:1944 +#: src/libslic3r/PrintConfig.cpp:1974 msgid "Output filename format" msgstr "Çıktı dosya adı ve türü" -#: src/libslic3r/PrintConfig.cpp:1945 +#: src/libslic3r/PrintConfig.cpp:1975 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -12266,11 +14121,11 @@ msgstr "" "[year], [month], [day], [hour], [minute], [second], [version], " "[input_filename], [input_filename_base]." -#: src/libslic3r/PrintConfig.cpp:1954 +#: src/libslic3r/PrintConfig.cpp:1984 msgid "Detect bridging perimeters" msgstr "Köprüleme duvarlarını algıla" -#: src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:1986 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." @@ -12279,11 +14134,11 @@ msgstr "" "(köprü akışı kullanılacaktır). Köprü işleminde geçerli hız uygulanır ve fan " "etkinleştirilir." -#: src/libslic3r/PrintConfig.cpp:1962 +#: src/libslic3r/PrintConfig.cpp:1992 msgid "Filament parking position" msgstr "Filament park yeri" -#: src/libslic3r/PrintConfig.cpp:1963 +#: src/libslic3r/PrintConfig.cpp:1993 msgid "" "Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware." @@ -12291,11 +14146,11 @@ msgstr "" "Nozülün, filamentin boşaltıldığında park edildiği pozisyondan uzaklığı. Bu " "değer yazıcı yazılımındaki değerle eşleşmelidir." -#: src/libslic3r/PrintConfig.cpp:1971 +#: src/libslic3r/PrintConfig.cpp:2001 msgid "Extra loading distance" msgstr "Fazladan yükleme mesafesi" -#: src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:2002 msgid "" "When set to zero, the distance the filament is moved from parking position " "during load is exactly the same as it was moved back during unload. When " @@ -12307,35 +14162,35 @@ msgstr "" "Pozitif olduğunda, eklenirse, negatifse, yükleme hareketi boşaltmadan daha " "kısadır." -#: src/libslic3r/PrintConfig.cpp:1980 src/libslic3r/PrintConfig.cpp:2005 -#: src/libslic3r/PrintConfig.cpp:2019 src/libslic3r/PrintConfig.cpp:2029 +#: src/libslic3r/PrintConfig.cpp:2010 src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2049 src/libslic3r/PrintConfig.cpp:2059 msgid "Perimeters" msgstr "Duvarlar" -#: src/libslic3r/PrintConfig.cpp:1981 +#: src/libslic3r/PrintConfig.cpp:2011 msgid "" "This is the acceleration your printer will use for perimeters. Set zero to " "disable acceleration control for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1989 +#: src/libslic3r/PrintConfig.cpp:2019 msgid "" "This is the acceleration your printer will use for external perimeters. Set " "zero to use the value for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1996 +#: src/libslic3r/PrintConfig.cpp:2026 msgid "Perimeter extruder" msgstr "Duvar" -#: src/libslic3r/PrintConfig.cpp:1998 +#: src/libslic3r/PrintConfig.cpp:2028 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" "Duvar ve kenarları (brim) yazdırırken kullanılacak ekstrüder. İlk ekstrüder " "1'dir." -#: src/libslic3r/PrintConfig.cpp:2007 +#: src/libslic3r/PrintConfig.cpp:2037 msgid "" "Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. If " @@ -12350,12 +14205,12 @@ msgstr "" "1.125 x nozül çapı kullanılacaktır. Yüzde olarak ifade edilirse (örneğin% " "200) katman yüksekliği üzerinden hesaplanır." -#: src/libslic3r/PrintConfig.cpp:2021 +#: src/libslic3r/PrintConfig.cpp:2051 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "Duvarlar için hız. Otomatik için sıfıra ayarlayın." -#: src/libslic3r/PrintConfig.cpp:2031 +#: src/libslic3r/PrintConfig.cpp:2061 msgid "" "This option sets the number of perimeters to generate for each layer. Note " "that Slic3r may increase this number automatically when it detects sloping " @@ -12367,11 +14222,11 @@ msgstr "" "yararlanan eğimli yüzeyleri tespit ettiğinde bu sayıyı otomatik olarak " "artırabileceğini unutmayın." -#: src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2065 msgid "(minimum)" msgstr "(En az)" -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "" "If you want to process the output G-code through custom scripts, just list " "their absolute paths here. Separate multiple scripts with a semicolon. " @@ -12385,35 +14240,35 @@ msgstr "" "argüman olarak geçirir ve ortam değişkenlerini okuyarak Slic3r ayarlarına " "erişebilirler." -#: src/libslic3r/PrintConfig.cpp:2055 +#: src/libslic3r/PrintConfig.cpp:2085 msgid "Printer type" msgstr "Yazıcı tipi" -#: src/libslic3r/PrintConfig.cpp:2056 +#: src/libslic3r/PrintConfig.cpp:2086 msgid "Type of the printer." msgstr "Yazıcının tipi." -#: src/libslic3r/PrintConfig.cpp:2061 +#: src/libslic3r/PrintConfig.cpp:2091 msgid "Printer notes" msgstr "Yazıcı notları" -#: src/libslic3r/PrintConfig.cpp:2062 +#: src/libslic3r/PrintConfig.cpp:2092 msgid "You can put your notes regarding the printer here." msgstr "Yazıcıyla ilgili notlarınızı buraya yazabilirsiniz." -#: src/libslic3r/PrintConfig.cpp:2070 +#: src/libslic3r/PrintConfig.cpp:2100 msgid "Printer vendor" msgstr "Yazıcı satıcısı" -#: src/libslic3r/PrintConfig.cpp:2071 +#: src/libslic3r/PrintConfig.cpp:2101 msgid "Name of the printer vendor." msgstr "Yazıcı satıcısının adı." -#: src/libslic3r/PrintConfig.cpp:2076 +#: src/libslic3r/PrintConfig.cpp:2106 msgid "Printer variant" msgstr "Yazıcı varyantı" -#: src/libslic3r/PrintConfig.cpp:2077 +#: src/libslic3r/PrintConfig.cpp:2107 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." @@ -12421,57 +14276,57 @@ msgstr "" "Yazıcı varyantının adı. Örneğin, yazıcı varyantları bir nozül çapı ile ayırt " "edilebilir." -#: src/libslic3r/PrintConfig.cpp:2094 +#: src/libslic3r/PrintConfig.cpp:2124 msgid "Raft contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2096 +#: src/libslic3r/PrintConfig.cpp:2126 msgid "" "The vertical distance between object and raft. Ignored for soluble interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2103 +#: src/libslic3r/PrintConfig.cpp:2133 msgid "Raft expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2105 +#: src/libslic3r/PrintConfig.cpp:2135 msgid "Expansion of the raft in XY plane for better stability." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:2142 msgid "First layer density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2114 +#: src/libslic3r/PrintConfig.cpp:2144 msgid "Density of the first raft or support layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2122 +#: src/libslic3r/PrintConfig.cpp:2152 msgid "First layer expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2124 +#: src/libslic3r/PrintConfig.cpp:2154 msgid "" "Expansion of the first raft or support layer to improve adhesion to print " "bed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2131 +#: src/libslic3r/PrintConfig.cpp:2161 msgid "Raft layers" msgstr "Alt destek katman sayısı" -#: src/libslic3r/PrintConfig.cpp:2133 +#: src/libslic3r/PrintConfig.cpp:2163 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." msgstr "" "Nesne bu sayıda katman kadar yükseltilecek ve altında destek üretilecektir." -#: src/libslic3r/PrintConfig.cpp:2141 +#: src/libslic3r/PrintConfig.cpp:2171 msgid "Slice resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2142 +#: src/libslic3r/PrintConfig.cpp:2172 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -12484,11 +14339,11 @@ msgstr "" "ayrıntı taşır. Herhangi bir basitleştirmeyi devre dışı bırakmak ve girişten " "gelen tam çözünürlüğü kullanmak için sıfıra ayarlayın." -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:2182 msgid "G-code resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2153 +#: src/libslic3r/PrintConfig.cpp:2183 msgid "" "Maximum deviation of exported G-code paths from their full resolution " "counterparts. Very high resolution G-code requires huge amount of RAM to " @@ -12499,20 +14354,20 @@ msgid "" "produced." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2164 +#: src/libslic3r/PrintConfig.cpp:2194 msgid "Minimum travel after retraction" msgstr "Geri çekmeden sonra en düşük hareket" -#: src/libslic3r/PrintConfig.cpp:2165 +#: src/libslic3r/PrintConfig.cpp:2195 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "Boşta hareket bu uzunluktan kısa olduğunda geri çekme tetiklenmez." -#: src/libslic3r/PrintConfig.cpp:2171 +#: src/libslic3r/PrintConfig.cpp:2201 msgid "Retract amount before wipe" msgstr "Temizleme işleminden önce geri çekilecek miktar" -#: src/libslic3r/PrintConfig.cpp:2172 +#: src/libslic3r/PrintConfig.cpp:2202 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." @@ -12520,23 +14375,23 @@ msgstr "" "Bowden ekstrüderleri ile, temizleme hareketini yapmadan önce bir miktar " "hızlı geri çekme yapmak akıllıca olabilir." -#: src/libslic3r/PrintConfig.cpp:2179 +#: src/libslic3r/PrintConfig.cpp:2209 msgid "Retract on layer change" msgstr "Katman değişiminde geri çek" -#: src/libslic3r/PrintConfig.cpp:2180 +#: src/libslic3r/PrintConfig.cpp:2210 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "Bir Z hareketi yapıldığında bu seçenek geri çekmeye zorlar." -#: src/libslic3r/PrintConfig.cpp:2185 src/libslic3r/PrintConfig.cpp:2193 +#: src/libslic3r/PrintConfig.cpp:2215 src/libslic3r/PrintConfig.cpp:2223 msgid "Length" msgstr "Uzunluk" -#: src/libslic3r/PrintConfig.cpp:2186 +#: src/libslic3r/PrintConfig.cpp:2216 msgid "Retraction Length" msgstr "Geri çekme uzunluğu" -#: src/libslic3r/PrintConfig.cpp:2187 +#: src/libslic3r/PrintConfig.cpp:2217 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " @@ -12545,11 +14400,11 @@ msgstr "" "Geri çekme tetiklendiğinde, filament belirtilen miktarda geri çekilir " "(uzunluk, ekstrüzyona girmeden önce ham filament üzerinde ölçülür)." -#: src/libslic3r/PrintConfig.cpp:2194 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Retraction Length (Toolchange)" msgstr "Geri Çekme Uzunluğu (Takım Değişimi)" -#: src/libslic3r/PrintConfig.cpp:2195 +#: src/libslic3r/PrintConfig.cpp:2225 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " @@ -12559,11 +14414,11 @@ msgstr "" "miktarda geri çekilir (uzunluk, ham filament üzerinde, ekstrüdere girmeden " "önce ölçülür)." -#: src/libslic3r/PrintConfig.cpp:2203 +#: src/libslic3r/PrintConfig.cpp:2233 msgid "Lift Z" msgstr "Z kaldırma" -#: src/libslic3r/PrintConfig.cpp:2204 +#: src/libslic3r/PrintConfig.cpp:2234 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " @@ -12573,15 +14428,15 @@ msgstr "" "bir şekilde yükselir. Birden fazla ekstrüder kullanıldığında, yalnızca ilk " "ekstrüder için ayar dikkate alınacaktır." -#: src/libslic3r/PrintConfig.cpp:2211 +#: src/libslic3r/PrintConfig.cpp:2241 msgid "Above Z" msgstr "Z'nin üstünde" -#: src/libslic3r/PrintConfig.cpp:2212 +#: src/libslic3r/PrintConfig.cpp:2242 msgid "Only lift Z above" msgstr "Sadece yukarıdaki Z kaldıracı" -#: src/libslic3r/PrintConfig.cpp:2213 +#: src/libslic3r/PrintConfig.cpp:2243 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " @@ -12591,15 +14446,15 @@ msgstr "" "Z'nin üzerinde gerçekleşir. Bu ayarı, ilk katlarda kaldırmayı atlamak için " "ayarlayabilirsiniz." -#: src/libslic3r/PrintConfig.cpp:2220 +#: src/libslic3r/PrintConfig.cpp:2250 msgid "Below Z" msgstr "Z altında" -#: src/libslic3r/PrintConfig.cpp:2221 +#: src/libslic3r/PrintConfig.cpp:2251 msgid "Only lift Z below" msgstr "Sadece aşağıda Z kaldırarak" -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2252 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " @@ -12609,11 +14464,11 @@ msgstr "" "Z'nin altında gerçekleşir. Bu ayarı, asansörü ilk katmanlara sınırlamak için " "ayarlayabilirsiniz." -#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2238 +#: src/libslic3r/PrintConfig.cpp:2260 src/libslic3r/PrintConfig.cpp:2268 msgid "Extra length on restart" msgstr "Yeniden başlatma sırasında fazladan uzunluk" -#: src/libslic3r/PrintConfig.cpp:2231 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." @@ -12621,7 +14476,7 @@ msgstr "" "Geri çekme işlemi boşta hareketten sonra telafi edildiğinde, ekstrüder bu " "ilave filament miktarını iter. Bu ayara nadiren ihtiyaç duyulur." -#: src/libslic3r/PrintConfig.cpp:2239 +#: src/libslic3r/PrintConfig.cpp:2269 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." @@ -12629,19 +14484,19 @@ msgstr "" "Alet değiştirildikten sonra geri çekme telafi edildiğinde, ekstrüder bu " "ilave filament miktarını itecektir." -#: src/libslic3r/PrintConfig.cpp:2246 src/libslic3r/PrintConfig.cpp:2247 +#: src/libslic3r/PrintConfig.cpp:2276 src/libslic3r/PrintConfig.cpp:2277 msgid "Retraction Speed" msgstr "Geri çekme hızı" -#: src/libslic3r/PrintConfig.cpp:2248 +#: src/libslic3r/PrintConfig.cpp:2278 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "Geri çekme hızı (sadece ekstrüder motoru için geçerlidir)." -#: src/libslic3r/PrintConfig.cpp:2254 src/libslic3r/PrintConfig.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:2284 src/libslic3r/PrintConfig.cpp:2285 msgid "Deretraction Speed" msgstr "İleri İtme Hızı" -#: src/libslic3r/PrintConfig.cpp:2256 +#: src/libslic3r/PrintConfig.cpp:2286 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " @@ -12651,68 +14506,82 @@ msgstr "" "ekstrüder motoru için geçerlidir). Sıfır bırakılırsa, geri çekme hızı " "kullanılır." -#: src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2293 msgid "Seam position" msgstr "Katman başlangıç konumu" -#: src/libslic3r/PrintConfig.cpp:2265 +#: src/libslic3r/PrintConfig.cpp:2295 msgid "Position of perimeters starting points." msgstr "Katman başlangıç noktalarının konumu." -#: src/libslic3r/PrintConfig.cpp:2272 +#: src/libslic3r/PrintConfig.cpp:2297 +msgid "Random" +msgstr "Rasgele" + +#: src/libslic3r/PrintConfig.cpp:2298 msgid "Nearest" msgstr "En yakın" -#: src/libslic3r/PrintConfig.cpp:2273 +#: src/libslic3r/PrintConfig.cpp:2299 msgid "Aligned" msgstr "Hizalı" -#: src/libslic3r/PrintConfig.cpp:2281 +#: src/libslic3r/PrintConfig.cpp:2306 +msgid "Staggered inner seams" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2307 +msgid "" +"This option causes the inner seams to be shifted backwards based on their " +"depth, forming a zigzag pattern." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2314 msgid "Direction" msgstr "Yön" -#: src/libslic3r/PrintConfig.cpp:2283 +#: src/libslic3r/PrintConfig.cpp:2316 msgid "Preferred direction of the seam" msgstr "Tercih edilen dikiş yönü" -#: src/libslic3r/PrintConfig.cpp:2284 +#: src/libslic3r/PrintConfig.cpp:2317 msgid "Seam preferred direction" msgstr "Dikiş yönü tercih" -#: src/libslic3r/PrintConfig.cpp:2291 +#: src/libslic3r/PrintConfig.cpp:2324 msgid "Jitter" msgstr "Değişimi" -#: src/libslic3r/PrintConfig.cpp:2293 +#: src/libslic3r/PrintConfig.cpp:2326 msgid "Seam preferred direction jitter" msgstr "Dikiş tercih edilen yön titreşimi" -#: src/libslic3r/PrintConfig.cpp:2294 +#: src/libslic3r/PrintConfig.cpp:2327 msgid "Preferred direction of the seam - jitter" msgstr "Dikişin tercih edilen yönü - titreme" -#: src/libslic3r/PrintConfig.cpp:2301 +#: src/libslic3r/PrintConfig.cpp:2334 msgid "Distance from brim/object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2335 msgid "" "Distance between skirt and brim (when draft shield is not used) or objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2308 +#: src/libslic3r/PrintConfig.cpp:2341 msgid "Skirt height" msgstr "Etek yüksekliği" -#: src/libslic3r/PrintConfig.cpp:2309 +#: src/libslic3r/PrintConfig.cpp:2342 msgid "Height of skirt expressed in layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2348 msgid "Draft shield" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2316 +#: src/libslic3r/PrintConfig.cpp:2349 msgid "" "With draft shield active, the skirt will be printed skirt_distance from the " "object, possibly intersecting brim.\n" @@ -12722,27 +14591,27 @@ msgid "" "from print bed due to wind draft." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2324 +#: src/libslic3r/PrintConfig.cpp:2354 msgid "Disabled" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2325 +#: src/libslic3r/PrintConfig.cpp:2355 msgid "Limited" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2326 +#: src/libslic3r/PrintConfig.cpp:2356 msgid "Enabled" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2331 +#: src/libslic3r/PrintConfig.cpp:2362 msgid "Loops (minimum)" msgstr "Etek sayısı (en az)" -#: src/libslic3r/PrintConfig.cpp:2332 +#: src/libslic3r/PrintConfig.cpp:2363 msgid "Skirt Loops" msgstr "Etek Sayısı" -#: src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2364 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " @@ -12752,11 +14621,11 @@ msgstr "" "döngü sayısı burada yapılandırılandan daha büyük olabilir. Eteği tamamen " "devre dışı bırakmak için bunu sıfıra ayarlayın." -#: src/libslic3r/PrintConfig.cpp:2341 +#: src/libslic3r/PrintConfig.cpp:2372 msgid "Slow down if layer print time is below" msgstr "Katman yazdırma süresi bu değerden düşükse yavaşla" -#: src/libslic3r/PrintConfig.cpp:2342 +#: src/libslic3r/PrintConfig.cpp:2373 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." @@ -12764,11 +14633,11 @@ msgstr "" "Katman yazdırma süresi bu sürenin altında tahmin edilirse, süreyi bu değere " "uzatmak için yazdırma hızı düşürülür." -#: src/libslic3r/PrintConfig.cpp:2351 +#: src/libslic3r/PrintConfig.cpp:2382 msgid "Small perimeters" msgstr "Küçük duvarlar" -#: src/libslic3r/PrintConfig.cpp:2353 +#: src/libslic3r/PrintConfig.cpp:2384 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " @@ -12778,11 +14647,11 @@ msgstr "" "Yüzde olarak ifade edilirse (örneğin:% 80), yukarıdaki duvar hız ayarında " "hesaplanır. Otomatik için sıfıra ayarlayın." -#: src/libslic3r/PrintConfig.cpp:2363 +#: src/libslic3r/PrintConfig.cpp:2394 msgid "Solid infill threshold area" msgstr "Katı dolgu eşik alanı" -#: src/libslic3r/PrintConfig.cpp:2365 +#: src/libslic3r/PrintConfig.cpp:2396 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." @@ -12790,23 +14659,23 @@ msgstr "" "Belirtilen eşikten daha küçük bir alana sahip bölgeler için katı dolgu " "yapılmasına zorlar." -#: src/libslic3r/PrintConfig.cpp:2366 +#: src/libslic3r/PrintConfig.cpp:2397 msgid "mm²" msgstr "mm²" -#: src/libslic3r/PrintConfig.cpp:2372 +#: src/libslic3r/PrintConfig.cpp:2403 msgid "Solid infill extruder" msgstr "Katı dolgu" -#: src/libslic3r/PrintConfig.cpp:2374 +#: src/libslic3r/PrintConfig.cpp:2405 msgid "The extruder to use when printing solid infill." msgstr "Katı dolguyu yazdırırken kullanılacak ekstrüder." -#: src/libslic3r/PrintConfig.cpp:2380 +#: src/libslic3r/PrintConfig.cpp:2411 msgid "Solid infill every" msgstr "Her n katmanda bir katı dolgu yap" -#: src/libslic3r/PrintConfig.cpp:2382 +#: src/libslic3r/PrintConfig.cpp:2413 msgid "" "This feature allows to force a solid layer every given number of layers. " "Zero to disable. You can set this to any value (for example 9999); Slic3r " @@ -12819,7 +14688,7 @@ msgstr "" "birleştirilecek mümkün olan en fazla katman sayısını otomatik olarak " "seçecektir." -#: src/libslic3r/PrintConfig.cpp:2394 +#: src/libslic3r/PrintConfig.cpp:2425 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "solid surfaces. If left zero, default extrusion width will be used if set, " @@ -12832,7 +14701,7 @@ msgstr "" "1.125 x nozül çapı kullanılacaktır. Yüzde olarak ifade edilirse (örneğin% " "90), katman yüksekliği üzerinden hesaplanır." -#: src/libslic3r/PrintConfig.cpp:2406 +#: src/libslic3r/PrintConfig.cpp:2437 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " @@ -12842,19 +14711,19 @@ msgstr "" "yukarıdaki varsayılan doldurma hızına göre yüzde olarak ifade edilebilir " "(örneğin:% 80). Otomatik için sıfıra ayarlayın." -#: src/libslic3r/PrintConfig.cpp:2418 +#: src/libslic3r/PrintConfig.cpp:2449 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "Üst ve alt yüzeylerde üretilecek katı katmanların sayısı." -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2455 src/libslic3r/PrintConfig.cpp:2456 msgid "Minimum thickness of a top / bottom shell" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2431 +#: src/libslic3r/PrintConfig.cpp:2462 msgid "Spiral vase" msgstr "Spiral vazo" -#: src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2463 msgid "" "This feature will raise Z gradually while printing a single-walled object in " "order to remove any visible seam. This option requires a single perimeter, " @@ -12863,20 +14732,17 @@ msgid "" "when printing more than one single object." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2440 +#: src/libslic3r/PrintConfig.cpp:2471 msgid "Temperature variation" msgstr "Sıcaklık değişimi" -#: src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:2472 msgid "" -"Temperature difference to be applied when an extruder is not active. Enables " -"a full-height \"sacrificial\" skirt on which the nozzles are periodically " -"wiped." +"Temperature difference to be applied when an extruder is not active. The " +"value is not used when 'idle_temperature' in filament settings is defined." msgstr "" -"Bir ekstrüder aktif olmadığında uygulanacak sıcaklık farkı. Nozülün düzenli " -"olarak silindiği tam yükseklikte bir \"temizlik\" eteği oluşturur." -#: src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2483 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -12887,7 +14753,7 @@ msgid "" "put a \"M109 S[first_layer_temperature]\" command wherever you want." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2466 +#: src/libslic3r/PrintConfig.cpp:2498 msgid "" "This start procedure is inserted at the beginning, after any printer start " "gcode (and after any toolchange to this filament in case of multi-material " @@ -12900,35 +14766,35 @@ msgid "" "extruders, the gcode is processed in extruder order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2514 msgid "Color change G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2483 +#: src/libslic3r/PrintConfig.cpp:2515 msgid "This G-code will be used as a code for the color change" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2492 +#: src/libslic3r/PrintConfig.cpp:2524 msgid "This G-code will be used as a code for the pause print" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2501 +#: src/libslic3r/PrintConfig.cpp:2533 msgid "This G-code will be used as a custom code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2509 +#: src/libslic3r/PrintConfig.cpp:2541 msgid "Single Extruder Multi Material" msgstr "Tek Ekstrüder Çoklu Filament" -#: src/libslic3r/PrintConfig.cpp:2510 +#: src/libslic3r/PrintConfig.cpp:2542 msgid "The printer multiplexes filaments into a single hot end." msgstr "Tek nozül çok extruder ile çoklu filament kullanan yazıcı türüdür." -#: src/libslic3r/PrintConfig.cpp:2515 +#: src/libslic3r/PrintConfig.cpp:2547 msgid "Prime all printing extruders" msgstr "Tüm ekstrüderleri temizle" -#: src/libslic3r/PrintConfig.cpp:2516 +#: src/libslic3r/PrintConfig.cpp:2548 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." @@ -12936,11 +14802,11 @@ msgstr "" "Etkinleştirildiğinde, tüm yazdırma ekstrüderleri, baskının başlangıcında " "tablanın ön kenarından temizlenir." -#: src/libslic3r/PrintConfig.cpp:2521 +#: src/libslic3r/PrintConfig.cpp:2553 msgid "No sparse layers (EXPERIMENTAL)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2554 msgid "" "If enabled, the wipe tower will not be printed on layers with no " "toolchanges. On layers with a toolchange, extruder will travel downward to " @@ -12948,11 +14814,11 @@ msgid "" "with the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2529 +#: src/libslic3r/PrintConfig.cpp:2561 msgid "Slice gap closing radius" msgstr "Dilimleme boşluğu kapatma yarı çapı" -#: src/libslic3r/PrintConfig.cpp:2531 +#: src/libslic3r/PrintConfig.cpp:2563 msgid "" "Cracks smaller than 2x gap closing radius are being filled during the " "triangle mesh slicing. The gap closing operation may reduce the final print " @@ -12962,41 +14828,41 @@ msgstr "" "küçük çatlaklar doldurulur. Aralık kapatma işlemi, nihai baskı çözünürlüğünü " "azaltabilir, bu nedenle değerin makul derecede düşük tutulması önerilir." -#: src/libslic3r/PrintConfig.cpp:2539 +#: src/libslic3r/PrintConfig.cpp:2571 msgid "Slicing Mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2541 +#: src/libslic3r/PrintConfig.cpp:2573 msgid "" "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " "close all holes in the model." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2575 msgid "Regular" msgstr "Normal" -#: src/libslic3r/PrintConfig.cpp:2547 +#: src/libslic3r/PrintConfig.cpp:2576 msgid "Even-odd" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2548 +#: src/libslic3r/PrintConfig.cpp:2577 msgid "Close holes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2553 +#: src/libslic3r/PrintConfig.cpp:2583 msgid "Generate support material" msgstr "Destekleri aktif et" -#: src/libslic3r/PrintConfig.cpp:2555 +#: src/libslic3r/PrintConfig.cpp:2585 msgid "Enable support material generation." msgstr "Destekleri aktif et." -#: src/libslic3r/PrintConfig.cpp:2559 +#: src/libslic3r/PrintConfig.cpp:2589 msgid "Auto generated supports" msgstr "Destekleri otomatik oluştur" -#: src/libslic3r/PrintConfig.cpp:2561 +#: src/libslic3r/PrintConfig.cpp:2591 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " @@ -13006,11 +14872,11 @@ msgstr "" "Denetlenmezse, yalnızca \"Destek Uygulayıcı\" birimleri içinde destekler " "oluşturulur." -#: src/libslic3r/PrintConfig.cpp:2567 +#: src/libslic3r/PrintConfig.cpp:2597 msgid "XY separation between an object and its support" msgstr "Bir nesne ve destek arasındaki XY eksenlerdeki ayrım" -#: src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2599 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." @@ -13018,28 +14884,28 @@ msgstr "" "Bir nesne ve desteği arasındaki XY ayrımı. Yüzde olarak ifade edilirse " "(örneğin% 50), dış duvar genişliği üzerinden hesaplanır." -#: src/libslic3r/PrintConfig.cpp:2580 +#: src/libslic3r/PrintConfig.cpp:2610 msgid "Pattern angle" msgstr "Desen açısı" -#: src/libslic3r/PrintConfig.cpp:2582 +#: src/libslic3r/PrintConfig.cpp:2612 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." msgstr "Destek desenini yatay düzlemde döndürmek için bu ayarı kullanın." -#: src/libslic3r/PrintConfig.cpp:2592 src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:2622 src/libslic3r/PrintConfig.cpp:3411 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." msgstr "" "Yalnızca tablaya yerleştirilmiş ise destek oluştur. Baskıda destek oluşturma." -#: src/libslic3r/PrintConfig.cpp:2598 +#: src/libslic3r/PrintConfig.cpp:2627 msgid "Top contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2600 +#: src/libslic3r/PrintConfig.cpp:2629 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " @@ -13049,40 +14915,38 @@ msgstr "" "ayrıca Slic3r'nin birinci nesne katmanı için köprü akışı ve hız kullanmasını " "önleyecektir." -#: src/libslic3r/PrintConfig.cpp:2608 +#: src/libslic3r/PrintConfig.cpp:2635 msgid "0 (soluble)" msgstr "0 (çözülebilir)" -#: src/libslic3r/PrintConfig.cpp:2609 +#: src/libslic3r/PrintConfig.cpp:2636 msgid "0.1 (detachable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2610 +#: src/libslic3r/PrintConfig.cpp:2637 msgid "0.2 (detachable)" msgstr "0.2 (çıkarılabilir)" -#: src/libslic3r/PrintConfig.cpp:2616 +#: src/libslic3r/PrintConfig.cpp:2643 msgid "Bottom contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2618 +#: src/libslic3r/PrintConfig.cpp:2645 msgid "" "The vertical distance between the object top surface and the support " "material interface. If set to zero, support_material_contact_distance will " "be used for both top and bottom contact Z distances." msgstr "" -#. TRN To be shown in Print Settings "Bottom contact Z distance". Have to be as short as possible -#. TRN To be shown in Print Settings "Bottom interface layers". Have to be as short as possible -#: src/libslic3r/PrintConfig.cpp:2626 src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2651 src/libslic3r/PrintConfig.cpp:2732 msgid "Same as top" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2633 +#: src/libslic3r/PrintConfig.cpp:2659 msgid "Enforce support for the first" msgstr "İlk katman için desteğe zorla" -#: src/libslic3r/PrintConfig.cpp:2635 +#: src/libslic3r/PrintConfig.cpp:2661 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -13094,15 +14958,15 @@ msgstr "" "için destek oluştur. Bu, tablada çok ince veya zayıf bir kaplama alanına " "sahip nesnelerin daha fazla yapışmasını sağlamak için kullanışlıdır." -#: src/libslic3r/PrintConfig.cpp:2640 +#: src/libslic3r/PrintConfig.cpp:2666 msgid "Enforce support for the first n layers" msgstr "İlk n katman için desteğe zorla" -#: src/libslic3r/PrintConfig.cpp:2646 +#: src/libslic3r/PrintConfig.cpp:2672 msgid "Support material/raft/skirt extruder" msgstr "Destek/sal (raft)/etek (skirt) ekstrüder" -#: src/libslic3r/PrintConfig.cpp:2648 +#: src/libslic3r/PrintConfig.cpp:2674 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." @@ -13110,7 +14974,7 @@ msgstr "" "Destek, sal (raft) ve etek (skirt) yazdırırken kullanılacak ekstrüder (takım " "değişimlerini en aza indirmek için mevcut ekstrüder kullanmak için 1+, 0)." -#: src/libslic3r/PrintConfig.cpp:2657 +#: src/libslic3r/PrintConfig.cpp:2683 msgid "" "Set this to a non-zero value to set a manual extrusion width for support " "material. If left zero, default extrusion width will be used if set, " @@ -13123,22 +14987,22 @@ msgstr "" "kullanılacaktır. Yüzde olarak ifade edilirse (örneğin% 90), katman " "yüksekliği üzerinden hesaplanır." -#: src/libslic3r/PrintConfig.cpp:2667 +#: src/libslic3r/PrintConfig.cpp:2693 msgid "Interface loops" msgstr "Ara bağlantı döngüsü" -#: src/libslic3r/PrintConfig.cpp:2669 +#: src/libslic3r/PrintConfig.cpp:2695 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" "Desteklerin üst temas katmanını spiral şeklinde kapat. Varsayılan olarak " "devre dışı bırakılmıştır." -#: src/libslic3r/PrintConfig.cpp:2674 +#: src/libslic3r/PrintConfig.cpp:2700 msgid "Support material/raft interface extruder" msgstr "Destek/sal (raft) bağlantı ekstrüder" -#: src/libslic3r/PrintConfig.cpp:2676 +#: src/libslic3r/PrintConfig.cpp:2702 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." @@ -13147,64 +15011,68 @@ msgstr "" "değişimlerini en aza indirmek için mevcut ekstrüder kullanmak için 1+, 0). " "Bu da salı (raft) etkiler." -#: src/libslic3r/PrintConfig.cpp:2684 +#: src/libslic3r/PrintConfig.cpp:2709 msgid "Top interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2711 msgid "" "Number of interface layers to insert between the object(s) and support " "material." msgstr "" "Nesneler ve destek arasına eklenecek ara bağlantı katmanlarının sayısı." -#: src/libslic3r/PrintConfig.cpp:2693 +#: src/libslic3r/PrintConfig.cpp:2715 src/libslic3r/PrintConfig.cpp:2733 msgid "0 (off)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2716 src/libslic3r/PrintConfig.cpp:2734 msgid "1 (light)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2695 +#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2735 msgid "2 (default)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2696 +#: src/libslic3r/PrintConfig.cpp:2718 src/libslic3r/PrintConfig.cpp:2736 msgid "3 (heavy)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:2724 msgid "Bottom interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2704 +#: src/libslic3r/PrintConfig.cpp:2726 msgid "" "Number of interface layers to insert between the object(s) and support " "material. Set to -1 to use support_material_interface_layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2717 +#: src/libslic3r/PrintConfig.cpp:2742 msgid "Closing radius" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2719 +#: src/libslic3r/PrintConfig.cpp:2744 msgid "" "For snug supports, the support regions will be merged using morphological " "closing operation. Gaps smaller than the closing radius will be filled in." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2727 +#: src/libslic3r/PrintConfig.cpp:2752 msgid "Interface pattern spacing" msgstr "Ara bağlantı deseni aralığı" -#: src/libslic3r/PrintConfig.cpp:2729 +#: src/libslic3r/PrintConfig.cpp:2754 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" "Ara bağlantı çizgileri arasındaki boşluk. Sağlam bir ara bağlantı elde etmek " "için sıfıra ayarlayın." -#: src/libslic3r/PrintConfig.cpp:2738 +#: src/libslic3r/PrintConfig.cpp:2761 +msgid "Support material interface" +msgstr "Destek ara bağlantısı" + +#: src/libslic3r/PrintConfig.cpp:2763 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " @@ -13213,73 +15081,72 @@ msgstr "" "Destek ara bağlantı katmanlarını yazdırma hızı. Yüzde olarak ifade edilirse " "(örneğin% 50) destek baskı hızı üzerinden hesaplanır." -#: src/libslic3r/PrintConfig.cpp:2747 +#: src/libslic3r/PrintConfig.cpp:2772 msgid "Pattern" msgstr "Desen" -#: src/libslic3r/PrintConfig.cpp:2749 +#: src/libslic3r/PrintConfig.cpp:2774 msgid "Pattern used to generate support material." msgstr "Destek için kullanılan desen." -#: src/libslic3r/PrintConfig.cpp:2755 +#: src/libslic3r/PrintConfig.cpp:2777 msgid "Rectilinear grid" msgstr "Doğrusal ızgara" -#: src/libslic3r/PrintConfig.cpp:2761 +#: src/libslic3r/PrintConfig.cpp:2784 msgid "Interface pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2763 +#: src/libslic3r/PrintConfig.cpp:2786 msgid "" "Pattern used to generate support material interface. Default pattern for non-" "soluble support interface is Rectilinear, while default pattern for soluble " "support interface is Concentric." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2777 +#: src/libslic3r/PrintConfig.cpp:2798 msgid "Pattern spacing" msgstr "Desen aralığı" -#: src/libslic3r/PrintConfig.cpp:2779 +#: src/libslic3r/PrintConfig.cpp:2800 msgid "Spacing between support material lines." msgstr "Destek hatları arasındaki boşluk." -#: src/libslic3r/PrintConfig.cpp:2788 +#: src/libslic3r/PrintConfig.cpp:2809 msgid "Speed for printing support material." msgstr "Destek baskısı için hız." -#: src/libslic3r/PrintConfig.cpp:2795 -msgid "Style" -msgstr "Biçem" - -#: src/libslic3r/PrintConfig.cpp:2797 +#: src/libslic3r/PrintConfig.cpp:2818 msgid "" "Style and shape of the support towers. Projecting the supports into a " "regular grid will create more stable supports, while snug support towers " "will save material and reduce object scarring." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2804 +#: src/libslic3r/PrintConfig.cpp:2823 msgid "Snug" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2809 +#: src/libslic3r/PrintConfig.cpp:2824 +msgid "Organic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2830 msgid "Synchronize with object layers" msgstr "Nesne katmanları ile senkronize et" -#: src/libslic3r/PrintConfig.cpp:2811 +#: src/libslic3r/PrintConfig.cpp:2832 msgid "" "Synchronize support layers with the object print layers. This is useful with " -"multi-material printers, where the extruder switch is expensive." +"multi-material printers, where the extruder switch is expensive. This option " +"is only available when top contact Z distance is set to zero." msgstr "" -"Nesne yazdırma katmanlarıyla destek katmanlarını senkronize et. Bu, çoklu " -"extrüder sistemlerde maliyeti düşürmek için kullanışlı bir yöntemdir." -#: src/libslic3r/PrintConfig.cpp:2817 +#: src/libslic3r/PrintConfig.cpp:2839 msgid "Overhang threshold" msgstr "Destek konulacak açı" -#: src/libslic3r/PrintConfig.cpp:2819 +#: src/libslic3r/PrintConfig.cpp:2841 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -13292,11 +15159,11 @@ msgstr "" "yatay eğimi (yatay düzlemden ölçülen) temsil eder. Otomatik algılama için " "sıfıra ayarlayın (önerilir)." -#: src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2853 msgid "With sheath around the support" msgstr "Destek etrafında kılıf" -#: src/libslic3r/PrintConfig.cpp:2833 +#: src/libslic3r/PrintConfig.cpp:2855 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." @@ -13304,32 +15171,97 @@ msgstr "" "Taban desteğinin etrafına bir kılıf (tek bir duvar çizgisi) ekler. Bu, " "desteği daha güvenilir hale getirir, ancak kaldırılması da zorlaştırır." -#: src/libslic3r/PrintConfig.cpp:2840 +#: src/libslic3r/PrintConfig.cpp:2861 +msgid "Maximum Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2863 +msgid "" +"The maximum angle of the branches, when the branches have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle to be able to have more reach." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2872 +msgid "Preferred Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2874 +msgid "" +"The preferred angle of the branches, when they do not have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle for branches to merge faster." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2883 +msgid "Tip Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2885 +msgid "The diameter of the top of the tip of the branches of organic support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2892 +msgid "Branch Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2894 +msgid "" +"The diameter of the thinnest branches of organic support. Thicker branches " +"are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2902 +msgid "Branch Diameter Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2904 +msgid "" +"The angle of the branches' diameter as they gradually become thicker towards " +"the bottom. An angle of 0 will cause the branches to have uniform thickness " +"over their length. A bit of an angle can increase stability of the organic " +"support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2914 +msgid "Branch Density" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2916 +msgid "" +"Adjusts the density of the support structure used to generate the tips of " +"the branches. A higher value results in better overhangs but the supports " +"are harder to remove, thus it is recommended to enable top support " +"interfaces instead of a high branch density value if dense interfaces are " +"needed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2928 msgid "" "Nozzle temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2843 +#: src/libslic3r/PrintConfig.cpp:2931 msgid "Nozzle temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2849 +#: src/libslic3r/PrintConfig.cpp:2937 msgid "Thick bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2851 +#: src/libslic3r/PrintConfig.cpp:2939 msgid "" "If enabled, bridges are more reliable, can bridge longer distances, but may " "look worse. If disabled, bridges look better but are reliable just for " "shorter bridged distances." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2857 +#: src/libslic3r/PrintConfig.cpp:2945 msgid "Detect thin walls" msgstr "İnce duvarları algıla" -#: src/libslic3r/PrintConfig.cpp:2859 +#: src/libslic3r/PrintConfig.cpp:2947 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." @@ -13337,11 +15269,11 @@ msgstr "" "Tek duvarları tespit et (iki sıra duvarın sığmadığı ve bunların tek bir ize " "daraltılması gereken parçalar)." -#: src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2953 msgid "Threads" msgstr "İş Parçacığı" -#: src/libslic3r/PrintConfig.cpp:2866 +#: src/libslic3r/PrintConfig.cpp:2954 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." @@ -13350,7 +15282,7 @@ msgstr "" "parçacığı sayısı, kullanılabilir çekirdek / işlemci sayısının biraz " "üzerindedir." -#: src/libslic3r/PrintConfig.cpp:2878 +#: src/libslic3r/PrintConfig.cpp:2966 msgid "" "This custom code is inserted before every toolchange. Placeholder variables " "for all PrusaSlicer settings as well as {toolchange_z}, {previous_extruder} " @@ -13360,7 +15292,7 @@ msgid "" "behaviour both before and after the toolchange." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2891 +#: src/libslic3r/PrintConfig.cpp:2979 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "top surfaces. You may want to use thinner extrudates to fill all narrow " @@ -13376,7 +15308,7 @@ msgstr "" "kullanılacaktır. Yüzde olarak ifade edilirse (örneğin% 90), katman " "yüksekliği üzerinden hesaplanır." -#: src/libslic3r/PrintConfig.cpp:2904 +#: src/libslic3r/PrintConfig.cpp:2992 msgid "" "Speed for printing top solid layers (it only applies to the uppermost " "external layers and not to their internal solid layers). You may want to " @@ -13390,45 +15322,45 @@ msgstr "" "göre yüzde (örneğin:% 80) olarak ifade edilebilir. Otomatik için sıfıra " "ayarlayın." -#: src/libslic3r/PrintConfig.cpp:2919 +#: src/libslic3r/PrintConfig.cpp:3007 msgid "Number of solid layers to generate on top surfaces." msgstr "Üst yüzeylerde üretilecek katı katmanların sayısı." -#: src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3008 msgid "Top solid layers" msgstr "Üst katı katmanlar" -#: src/libslic3r/PrintConfig.cpp:2928 +#: src/libslic3r/PrintConfig.cpp:3016 msgid "" "The number of top solid layers is increased above top_solid_layers if " "necessary to satisfy minimum thickness of top shell. This is useful to " "prevent pillowing effect when printing with variable layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2931 +#: src/libslic3r/PrintConfig.cpp:3019 msgid "Minimum top shell thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:3026 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "Boşta hareket için hız (uzak ekstrüzyon noktaları arasında atlar)." -#: src/libslic3r/PrintConfig.cpp:2946 +#: src/libslic3r/PrintConfig.cpp:3034 msgid "Z travel" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2947 +#: src/libslic3r/PrintConfig.cpp:3035 msgid "" "Speed for movements along the Z axis.\n" "When set to zero, the value is ignored and regular travel speed is used " "instead." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2955 +#: src/libslic3r/PrintConfig.cpp:3043 msgid "Use firmware retraction" msgstr "Yazılım geri çekme özelliğini kullan" -#: src/libslic3r/PrintConfig.cpp:2956 +#: src/libslic3r/PrintConfig.cpp:3044 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." @@ -13436,11 +15368,11 @@ msgstr "" "Bu deneysel ayar, üretici yazılımının geri çekmeyi ele alması için G10 ve " "G11 komutlarını kullanır. Bu sadece son Marlin'de desteklenir." -#: src/libslic3r/PrintConfig.cpp:2962 +#: src/libslic3r/PrintConfig.cpp:3050 msgid "Use relative E distances" msgstr "Bağıl E mesafeleri kullan" -#: src/libslic3r/PrintConfig.cpp:2963 +#: src/libslic3r/PrintConfig.cpp:3051 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." @@ -13448,11 +15380,11 @@ msgstr "" "Yazılımınız göreceli E değerleri gerektiriyorsa, bunu kontrol edin, aksi " "halde işaretlemeden bırakın. Çoğu yazılım mutlak değerleri kullanır." -#: src/libslic3r/PrintConfig.cpp:2969 +#: src/libslic3r/PrintConfig.cpp:3057 msgid "Use volumetric E" msgstr "Hacimsel E kullan" -#: src/libslic3r/PrintConfig.cpp:2970 +#: src/libslic3r/PrintConfig.cpp:3058 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -13467,11 +15399,11 @@ msgstr "" "kullanmak için başlangıç kodunuzda 'M200 D [filament çapı] T0' gibi komutlar " "ekleyebilirsiniz. Bu sadece son sürüm Marlin'de desteklenir." -#: src/libslic3r/PrintConfig.cpp:2980 +#: src/libslic3r/PrintConfig.cpp:3068 msgid "Enable variable layer height feature" msgstr "Değişken katman yüksekliği özelliğini etkinleştir" -#: src/libslic3r/PrintConfig.cpp:2981 +#: src/libslic3r/PrintConfig.cpp:3069 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." @@ -13479,11 +15411,11 @@ msgstr "" "Bazı yazıcılarda veya yazıcı ayarlarında, değişken katman yüksekliğinde " "yazdırmakta zorluk olabilir. Varsayılan olarak etkindir." -#: src/libslic3r/PrintConfig.cpp:2987 +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Wipe while retracting" msgstr "Geri çekerken temizlik de yap" -#: src/libslic3r/PrintConfig.cpp:2988 +#: src/libslic3r/PrintConfig.cpp:3076 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." @@ -13491,7 +15423,7 @@ msgstr "" "Bu seçenek sızdıran ekstrüderlerde olası kabarcıkları en aza indirmek için " "geri çekme esnasında nozülü hareket ettirecektir." -#: src/libslic3r/PrintConfig.cpp:2995 +#: src/libslic3r/PrintConfig.cpp:3083 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." @@ -13499,11 +15431,11 @@ msgstr "" "Çok malzemeli yazıcıların ekstrüderleri takım değişikliklerinde doldurması " "veya boşaltması gerekebilir. Fazla malzemeyi temizleme kulesine boşaltır." -#: src/libslic3r/PrintConfig.cpp:3001 +#: src/libslic3r/PrintConfig.cpp:3089 msgid "Purging volumes - load/unload volumes" msgstr "Boşaltma hacimleri - hacimleri yükleme / boşaltma" -#: src/libslic3r/PrintConfig.cpp:3002 +#: src/libslic3r/PrintConfig.cpp:3090 msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " @@ -13513,11 +15445,11 @@ msgstr "" "gereken hacimleri kaydeder. Bu değerler aşağıdaki tüm temizleme hacimlerinin " "oluşturulmasını kolaylaştırmak için kullanılır." -#: src/libslic3r/PrintConfig.cpp:3008 +#: src/libslic3r/PrintConfig.cpp:3096 msgid "Purging volumes - matrix" msgstr "Boşaltma hacimleri - matris" -#: src/libslic3r/PrintConfig.cpp:3009 +#: src/libslic3r/PrintConfig.cpp:3097 msgid "" "This matrix describes volumes (in cubic milimetres) required to purge the " "new filament on the wipe tower for any given pair of tools." @@ -13525,54 +15457,58 @@ msgstr "" "Bu matris, temizleme kulesinde yeni filamenti herhangi bir takım çifti için " "temizlemek için gereken hacimleri (kübik milimetre cinsinden) açıklar." -#: src/libslic3r/PrintConfig.cpp:3018 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Position X" msgstr "X Konumu" -#: src/libslic3r/PrintConfig.cpp:3019 +#: src/libslic3r/PrintConfig.cpp:3107 msgid "X coordinate of the left front corner of a wipe tower" msgstr "Temizleme kulesinin sol ön köşesinin X koordinatı" -#: src/libslic3r/PrintConfig.cpp:3025 +#: src/libslic3r/PrintConfig.cpp:3113 msgid "Position Y" msgstr "Y konumu" -#: src/libslic3r/PrintConfig.cpp:3026 +#: src/libslic3r/PrintConfig.cpp:3114 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "Temizleme kulesinin sol ön köşesinin Y koordinatı" -#: src/libslic3r/PrintConfig.cpp:3033 +#: src/libslic3r/PrintConfig.cpp:3120 +msgid "Width" +msgstr "Genişlik" + +#: src/libslic3r/PrintConfig.cpp:3121 msgid "Width of a wipe tower" msgstr "Temizleme kulesinin genişliği" -#: src/libslic3r/PrintConfig.cpp:3039 +#: src/libslic3r/PrintConfig.cpp:3127 msgid "Wipe tower rotation angle" msgstr "Temizleme Kulesi dönme açısı" -#: src/libslic3r/PrintConfig.cpp:3040 +#: src/libslic3r/PrintConfig.cpp:3128 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "X eksenine göre temizleme kulesi dönme açısı." -#: src/libslic3r/PrintConfig.cpp:3046 src/libslic3r/PrintConfig.cpp:3047 +#: src/libslic3r/PrintConfig.cpp:3134 src/libslic3r/PrintConfig.cpp:3135 msgid "Wipe tower brim width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3055 +#: src/libslic3r/PrintConfig.cpp:3143 msgid "Wipe into this object's infill" msgstr "Bu nesnenin dolgusu içinde temizlik işlemi yap" -#: src/libslic3r/PrintConfig.cpp:3056 +#: src/libslic3r/PrintConfig.cpp:3144 msgid "" "Purging after toolchange will be done inside this object's infills. This " "lowers the amount of waste but may result in longer print time due to " "additional travel moves." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3063 +#: src/libslic3r/PrintConfig.cpp:3151 msgid "Wipe into this object" msgstr "Bu nesneye sil" -#: src/libslic3r/PrintConfig.cpp:3064 +#: src/libslic3r/PrintConfig.cpp:3152 msgid "" "Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " @@ -13582,19 +15518,19 @@ msgstr "" "azaltacak malzemeden tasarruf etmek üzere nozülü temizlemek için nesne " "kullanılacaktır. Sonuç olarak nesnelerin renkleri karışacaktır." -#: src/libslic3r/PrintConfig.cpp:3070 +#: src/libslic3r/PrintConfig.cpp:3158 msgid "Maximal bridging distance" msgstr "En fazla köprüleme mesafesi" -#: src/libslic3r/PrintConfig.cpp:3071 +#: src/libslic3r/PrintConfig.cpp:3159 msgid "Maximal distance between supports on sparse infill sections." msgstr "Seyrek dolgu bölümlerinde destekler arasındaki azami mesafe." -#: src/libslic3r/PrintConfig.cpp:3077 +#: src/libslic3r/PrintConfig.cpp:3165 msgid "XY Size Compensation" msgstr "XY Boyut Telafisi" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3167 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" @@ -13604,11 +15540,11 @@ msgstr "" "(negatif = içe, pozitif = dışarı doğru). Bu, ince ayar delik boyutları için " "yararlı olabilir." -#: src/libslic3r/PrintConfig.cpp:3087 +#: src/libslic3r/PrintConfig.cpp:3175 msgid "Z offset" msgstr "Z ofset" -#: src/libslic3r/PrintConfig.cpp:3088 +#: src/libslic3r/PrintConfig.cpp:3176 msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " "output G-code. It is used to compensate for bad Z endstop position: for " @@ -13621,11 +15557,11 @@ msgstr "" "bırakırsa, bunu -0.3 olarak ayarlayın (veya bu değeri 0 yapıp limit " "anahtarınızı ayarlayın)." -#: src/libslic3r/PrintConfig.cpp:3097 +#: src/libslic3r/PrintConfig.cpp:3185 msgid "Perimeter generator" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3099 +#: src/libslic3r/PrintConfig.cpp:3187 msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " @@ -13633,19 +15569,19 @@ msgid "" "Concentric infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3192 msgid "Classic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3107 +#: src/libslic3r/PrintConfig.cpp:3193 msgid "Arachne" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3199 msgid "Perimeter transition length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3114 +#: src/libslic3r/PrintConfig.cpp:3201 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " @@ -13653,11 +15589,11 @@ msgid "" "be computed based on the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3123 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Perimeter transitioning filter margin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3125 +#: src/libslic3r/PrintConfig.cpp:3212 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -13669,11 +15605,11 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3138 +#: src/libslic3r/PrintConfig.cpp:3225 msgid "Perimeter transitioning threshold angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3140 +#: src/libslic3r/PrintConfig.cpp:3227 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -13682,100 +15618,261 @@ msgid "" "these center perimeters, but may leave gaps or overextrude." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3151 +#: src/libslic3r/PrintConfig.cpp:3238 msgid "Perimeter distribution count" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3153 +#: src/libslic3r/PrintConfig.cpp:3240 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " "in width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3247 msgid "Minimum feature size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3162 -msgid "" -"Minimum thickness of thin features. Model features that are thinner than " -"this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width. If expressed as " -"a percentage (for example 25%), it will be computed based on the nozzle " -"diameter." -msgstr "" +#: src/libslic3r/PrintConfig.cpp:3249 +msgid "" +"Minimum thickness of thin features. Model features that are thinner than " +"this value will not be printed, while features thicker than the Minimum " +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3259 +msgid "Minimum perimeter width" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3261 +msgid "" +"Width of the perimeter that will replace thin features (according to the " +"Minimum feature size) of the model. If the Minimum perimeter width is " +"thinner than the thickness of the feature, the perimeter will become as " +"thick as the feature itself. If expressed as a percentage (for example 85%), " +"it will be computed based on the nozzle diameter." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3327 +msgid "Pinhead front diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3329 +msgid "Diameter of the pointing side of the head" +msgstr "Başın gösterdiği tarafın çapı" + +#: src/libslic3r/PrintConfig.cpp:3336 +msgid "Head penetration" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3338 +msgid "How much the pinhead has to penetrate the model surface" +msgstr "Pinheadin model yüzeyine ne kadar nüfuz etmesi gerektiği" + +#: src/libslic3r/PrintConfig.cpp:3345 +msgid "Pinhead width" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3347 +msgid "Width from the back sphere center to the front sphere center" +msgstr "Arka küre merkezinden ön küre merkezine genişlik" + +#: src/libslic3r/PrintConfig.cpp:3355 +msgid "Pillar diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3357 +msgid "Diameter in mm of the support pillars" +msgstr "Destek direklerinin mm cinsinden çapı" + +#: src/libslic3r/PrintConfig.cpp:3365 +msgid "Small pillar diameter percent" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3367 +msgid "" +"The percentage of smaller pillars compared to the normal pillar diameter " +"which are used in problematic areas where a normal pilla cannot fit." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3376 +msgid "Max bridges on a pillar" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3378 +msgid "" +"Maximum number of bridges that can be placed on a pillar. Bridges hold " +"support point pinheads and connect to pillars as small branches." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3386 +msgid "Max weight on model" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3389 +msgid "" +"Maximum weight of sub-trees that terminate on the model instead of the print " +"bed. The weight is the sum of the lenghts of all branches emanating from the " +"endpoint." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3397 +msgid "Pillar connection mode" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3398 +msgid "" +"Controls the bridge type between two neighboring pillars. Can be zig-zag, " +"cross (double zig-zag) or dynamic which will automatically switch between " +"the first two depending on the distance of the two pillars." +msgstr "" +"İki komşu sütun arasındaki köprü tipini kontrol eder. İki sütunun mesafesine " +"bağlı olarak otomatik olarak ilk ikisi arasında geçiş yapacak zig-zag, " +"çapraz (çift zig-zag) veya dinamik olabilir." + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Zig-Zag" +msgstr "Zikzaklı" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Cross" +msgstr "Çapraz" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Dynamic" +msgstr "Dinamik" + +#: src/libslic3r/PrintConfig.cpp:3416 +msgid "Pillar widening factor" +msgstr "Ayağı genişletme faktörü" + +#: src/libslic3r/PrintConfig.cpp:3420 +msgid "" +"Merging bridges or pillars into another pillars can increase the radius. " +"Zero means no increase, one means full increase. The exact amount of " +"increase is unspecified and can change in the future." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3431 +msgid "Support base diameter" +msgstr "Destek taban çapı" + +#: src/libslic3r/PrintConfig.cpp:3433 +msgid "Diameter in mm of the pillar base" +msgstr "Sütun tabanının mm cinsinden çapı" + +#: src/libslic3r/PrintConfig.cpp:3441 +msgid "Support base height" +msgstr "Destek taban yüksekliği" + +#: src/libslic3r/PrintConfig.cpp:3443 +msgid "The height of the pillar base cone" +msgstr "Sütun tabanı konisinin yüksekliği" + +#: src/libslic3r/PrintConfig.cpp:3450 +msgid "Support base safety distance" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3453 +msgid "" +"The minimum distance of the pillar base from the model in mm. Makes sense in " +"zero elevation mode where a gap according to this parameter is inserted " +"between the model and the pad." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3463 +msgid "Critical angle" +msgstr "Kritik açı" + +#: src/libslic3r/PrintConfig.cpp:3465 +msgid "The default angle for connecting support sticks and junctions." +msgstr "Destek çubuklarını ve bağlantılarını bağlamak için varsayılan açı." + +#: src/libslic3r/PrintConfig.cpp:3473 +msgid "Max bridge length" +msgstr "En fazla köprü uzunluğu" + +#: src/libslic3r/PrintConfig.cpp:3475 +msgid "The max length of a bridge" +msgstr "Bir köprünün en fazla uzunluğu" + +#: src/libslic3r/PrintConfig.cpp:3487 +msgid "Max pillar linking distance" +msgstr "Max sütun bağlama mesafesi" -#: src/libslic3r/PrintConfig.cpp:3172 -msgid "Minimum perimeter width" +#: src/libslic3r/PrintConfig.cpp:3489 +msgid "" +"The max distance of two pillars to get linked with each other. A zero value " +"will prohibit pillar cascading." msgstr "" +"Birbiriyle bağlantı kurması için iki sütunun en fazla mesafesi. Sıfır " +"değeri, direk basamaklandırmasını yasaklar." -#: src/libslic3r/PrintConfig.cpp:3174 +#: src/libslic3r/PrintConfig.cpp:3499 msgid "" -"Width of the perimeter that will replace thin features (according to the " -"Minimum feature size) of the model. If the Minimum perimeter width is " -"thinner than the thickness of the feature, the perimeter will become as " -"thick as the feature itself. If expressed as a percentage (for example 85%), " -"it will be computed based on the nozzle diameter." +"How much the supports should lift up the supported object. If \"Pad around " +"object\" is enabled, this value is ignored." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3242 +#: src/libslic3r/PrintConfig.cpp:3515 msgid "Display width" msgstr "Ekran genişliği" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3516 msgid "Width of the display" msgstr "Ekranın genişliği" -#: src/libslic3r/PrintConfig.cpp:3248 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "Display height" msgstr "Ekran yüksekliği" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3522 msgid "Height of the display" msgstr "Ekran yüksekliği" -#: src/libslic3r/PrintConfig.cpp:3254 +#: src/libslic3r/PrintConfig.cpp:3527 msgid "Number of pixels in" msgstr "Piksel sayısı" -#: src/libslic3r/PrintConfig.cpp:3256 +#: src/libslic3r/PrintConfig.cpp:3529 msgid "Number of pixels in X" msgstr "X'teki piksel sayısı" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3535 msgid "Number of pixels in Y" msgstr "Y cinsinden piksel sayısı" -#: src/libslic3r/PrintConfig.cpp:3267 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Display horizontal mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3268 +#: src/libslic3r/PrintConfig.cpp:3541 msgid "Mirror horizontally" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3542 msgid "Enable horizontal mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3274 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Display vertical mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3275 +#: src/libslic3r/PrintConfig.cpp:3548 msgid "Mirror vertically" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "Enable vertical mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3281 +#: src/libslic3r/PrintConfig.cpp:3554 msgid "Display orientation" msgstr "Ekran yönü" -#: src/libslic3r/PrintConfig.cpp:3282 +#: src/libslic3r/PrintConfig.cpp:3555 msgid "" "Set the actual LCD display orientation inside the SLA printer. Portrait mode " "will flip the meaning of display width and height parameters and the output " @@ -13785,55 +15882,55 @@ msgstr "" "genişliği ve yükseklik parametrelerinin anlamını değiştirecek ve çıkış " "görüntüleri 90 derece döndürülecektir." -#: src/libslic3r/PrintConfig.cpp:3288 +#: src/libslic3r/PrintConfig.cpp:3559 msgid "Landscape" msgstr "Peyzaj" -#: src/libslic3r/PrintConfig.cpp:3289 +#: src/libslic3r/PrintConfig.cpp:3560 msgid "Portrait" msgstr "Portre" -#: src/libslic3r/PrintConfig.cpp:3294 src/libslic3r/PrintConfig.cpp:3929 +#: src/libslic3r/PrintConfig.cpp:3566 src/libslic3r/PrintConfig.cpp:4058 msgid "Fast" msgstr "Hızlı" -#: src/libslic3r/PrintConfig.cpp:3295 +#: src/libslic3r/PrintConfig.cpp:3567 msgid "Fast tilt" msgstr "Hızlı eğim" -#: src/libslic3r/PrintConfig.cpp:3296 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Time of the fast tilt" msgstr "Hızlı yatırma zamanı" -#: src/libslic3r/PrintConfig.cpp:3303 src/libslic3r/PrintConfig.cpp:3928 +#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:4057 msgid "Slow" msgstr "Yavaş" -#: src/libslic3r/PrintConfig.cpp:3304 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Slow tilt" msgstr "Yavaş eğim" -#: src/libslic3r/PrintConfig.cpp:3305 +#: src/libslic3r/PrintConfig.cpp:3577 msgid "Time of the slow tilt" msgstr "Yavaş yatırma zamanı" -#: src/libslic3r/PrintConfig.cpp:3312 src/libslic3r/PrintConfig.cpp:3930 +#: src/libslic3r/PrintConfig.cpp:3584 src/libslic3r/PrintConfig.cpp:4059 msgid "High viscosity" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3313 +#: src/libslic3r/PrintConfig.cpp:3585 msgid "Tilt for high viscosity resin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3314 +#: src/libslic3r/PrintConfig.cpp:3586 msgid "Time of the super slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3321 +#: src/libslic3r/PrintConfig.cpp:3593 msgid "Area fill" msgstr "Alan dolgusu" -#: src/libslic3r/PrintConfig.cpp:3322 +#: src/libslic3r/PrintConfig.cpp:3594 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -13843,40 +15940,40 @@ msgstr "" "Baskı alanı belirtilen değeri aşarsa,\n" "yavaş eğim kullanılır, aksi takdirde - hızlı eğim kullanılır" -#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 -#: src/libslic3r/PrintConfig.cpp:3331 +#: src/libslic3r/PrintConfig.cpp:3601 src/libslic3r/PrintConfig.cpp:3602 +#: src/libslic3r/PrintConfig.cpp:3603 msgid "Printer scaling correction" msgstr "Yazıcı ölçeklendirme düzeltmesi" -#: src/libslic3r/PrintConfig.cpp:3337 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3609 src/libslic3r/PrintConfig.cpp:3611 msgid "Printer scaling correction in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3338 +#: src/libslic3r/PrintConfig.cpp:3610 msgid "Printer scaling X axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3345 src/libslic3r/PrintConfig.cpp:3347 +#: src/libslic3r/PrintConfig.cpp:3617 src/libslic3r/PrintConfig.cpp:3619 msgid "Printer scaling correction in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3346 +#: src/libslic3r/PrintConfig.cpp:3618 msgid "Printer scaling Y axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3353 src/libslic3r/PrintConfig.cpp:3355 +#: src/libslic3r/PrintConfig.cpp:3625 src/libslic3r/PrintConfig.cpp:3627 msgid "Printer scaling correction in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3354 +#: src/libslic3r/PrintConfig.cpp:3626 msgid "Printer scaling Z axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3361 src/libslic3r/PrintConfig.cpp:3362 +#: src/libslic3r/PrintConfig.cpp:3633 src/libslic3r/PrintConfig.cpp:3634 msgid "Printer absolute correction" msgstr "Yazıcı mutlak düzeltme" -#: src/libslic3r/PrintConfig.cpp:3363 +#: src/libslic3r/PrintConfig.cpp:3635 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." @@ -13884,20 +15981,20 @@ msgstr "" "Dilimlenen 2D poligonları düzeltme işaretine göre şişirecek veya " "söndürecektir." -#: src/libslic3r/PrintConfig.cpp:3369 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Elephant foot minimum width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3371 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3378 src/libslic3r/PrintConfig.cpp:3379 +#: src/libslic3r/PrintConfig.cpp:3650 src/libslic3r/PrintConfig.cpp:3651 msgid "Printer gamma correction" msgstr "Yazıcı gama düzeltmesi" -#: src/libslic3r/PrintConfig.cpp:3380 +#: src/libslic3r/PrintConfig.cpp:3652 msgid "" "This will apply a gamma correction to the rasterized 2D polygons. A gamma " "value of zero means thresholding with the threshold in the middle. This " @@ -13907,43 +16004,53 @@ msgstr "" "gamma değeri, ortadaki eşik ile eşik anlamına gelir. Bu davranış, " "çokgenlerde delik kaybetmeden kenar bozulmalarını ortadan kaldırır." -#: src/libslic3r/PrintConfig.cpp:3399 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3671 src/libslic3r/PrintConfig.cpp:3672 msgid "SLA material type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3411 src/libslic3r/PrintConfig.cpp:3412 +#: src/libslic3r/PrintConfig.cpp:3679 src/libslic3r/PrintConfig.cpp:3680 msgid "Initial layer height" msgstr "İlk katman yüksekliği" -#: src/libslic3r/PrintConfig.cpp:3418 src/libslic3r/PrintConfig.cpp:3419 +#: src/libslic3r/PrintConfig.cpp:3686 +msgid "Idle temperature" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3687 +msgid "" +"Nozzle temperature when the tool is currently not used in multi-tool setups." +"This is only used when 'Ooze prevention' is active in Print Settings." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3695 src/libslic3r/PrintConfig.cpp:3696 msgid "Bottle volume" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3420 +#: src/libslic3r/PrintConfig.cpp:3697 msgid "ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3425 src/libslic3r/PrintConfig.cpp:3426 +#: src/libslic3r/PrintConfig.cpp:3702 src/libslic3r/PrintConfig.cpp:3703 msgid "Bottle weight" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3427 +#: src/libslic3r/PrintConfig.cpp:3704 msgid "kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "g/ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3718 msgid "money/bottle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3446 +#: src/libslic3r/PrintConfig.cpp:3723 msgid "Faded layers" msgstr "Soluk katmanlar" -#: src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3724 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" @@ -13951,250 +16058,119 @@ msgstr "" "Maruz kalma süresi için gereken katman sayısı, ilk maruz kalma süresinden " "maruz kalma süresine kadar kaybolur" -#: src/libslic3r/PrintConfig.cpp:3454 src/libslic3r/PrintConfig.cpp:3455 +#: src/libslic3r/PrintConfig.cpp:3731 src/libslic3r/PrintConfig.cpp:3732 msgid "Minimum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3462 src/libslic3r/PrintConfig.cpp:3463 +#: src/libslic3r/PrintConfig.cpp:3739 src/libslic3r/PrintConfig.cpp:3740 msgid "Maximum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3470 src/libslic3r/PrintConfig.cpp:3471 +#: src/libslic3r/PrintConfig.cpp:3747 src/libslic3r/PrintConfig.cpp:3748 msgid "Exposure time" msgstr "Pozlama süresi" -#: src/libslic3r/PrintConfig.cpp:3477 src/libslic3r/PrintConfig.cpp:3478 +#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3755 msgid "Minimum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3485 src/libslic3r/PrintConfig.cpp:3486 +#: src/libslic3r/PrintConfig.cpp:3762 src/libslic3r/PrintConfig.cpp:3763 msgid "Maximum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3493 src/libslic3r/PrintConfig.cpp:3494 +#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3771 msgid "Initial exposure time" msgstr "İlk maruz kalma süresi" -#: src/libslic3r/PrintConfig.cpp:3500 src/libslic3r/PrintConfig.cpp:3501 +#: src/libslic3r/PrintConfig.cpp:3777 src/libslic3r/PrintConfig.cpp:3778 msgid "Correction for expansion" msgstr "Genişleme için düzeltme" -#: src/libslic3r/PrintConfig.cpp:3507 src/libslic3r/PrintConfig.cpp:3508 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3785 msgid "Correction for expansion in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3514 src/libslic3r/PrintConfig.cpp:3515 +#: src/libslic3r/PrintConfig.cpp:3791 src/libslic3r/PrintConfig.cpp:3792 msgid "Correction for expansion in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3521 src/libslic3r/PrintConfig.cpp:3522 +#: src/libslic3r/PrintConfig.cpp:3798 src/libslic3r/PrintConfig.cpp:3799 msgid "Correction for expansion in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3528 +#: src/libslic3r/PrintConfig.cpp:3805 msgid "SLA print material notes" msgstr "SLA baskı malzemesi notları" -#: src/libslic3r/PrintConfig.cpp:3529 +#: src/libslic3r/PrintConfig.cpp:3806 msgid "You can put your notes regarding the SLA print material here." msgstr "SLA baskı malzemesi ile ilgili notlarınızı buraya yazabilirsiniz." -#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3552 +#: src/libslic3r/PrintConfig.cpp:3818 src/libslic3r/PrintConfig.cpp:3829 msgid "Default SLA material profile" msgstr "Varsayılan SLA malzeme profili" -#: src/libslic3r/PrintConfig.cpp:3563 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "Generate supports" msgstr "Destek üret" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3842 msgid "Generate supports for the models" msgstr "Modeller için destek oluşturun" -#: src/libslic3r/PrintConfig.cpp:3570 -msgid "Pinhead front diameter" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3572 -msgid "Diameter of the pointing side of the head" -msgstr "Başın gösterdiği tarafın çapı" - -#: src/libslic3r/PrintConfig.cpp:3579 -msgid "Head penetration" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3581 -msgid "How much the pinhead has to penetrate the model surface" -msgstr "Pinheadin model yüzeyine ne kadar nüfuz etmesi gerektiği" - -#: src/libslic3r/PrintConfig.cpp:3588 -msgid "Pinhead width" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3590 -msgid "Width from the back sphere center to the front sphere center" -msgstr "Arka küre merkezinden ön küre merkezine genişlik" - -#: src/libslic3r/PrintConfig.cpp:3598 -msgid "Pillar diameter" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3600 -msgid "Diameter in mm of the support pillars" -msgstr "Destek direklerinin mm cinsinden çapı" - -#: src/libslic3r/PrintConfig.cpp:3608 -msgid "Small pillar diameter percent" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3610 -msgid "" -"The percentage of smaller pillars compared to the normal pillar diameter " -"which are used in problematic areas where a normal pilla cannot fit." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3619 -msgid "Max bridges on a pillar" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3621 -msgid "" -"Maximum number of bridges that can be placed on a pillar. Bridges hold " -"support point pinheads and connect to pillars as small branches." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3629 -msgid "Pillar connection mode" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3630 -msgid "" -"Controls the bridge type between two neighboring pillars. Can be zig-zag, " -"cross (double zig-zag) or dynamic which will automatically switch between " -"the first two depending on the distance of the two pillars." -msgstr "" -"İki komşu sütun arasındaki köprü tipini kontrol eder. İki sütunun mesafesine " -"bağlı olarak otomatik olarak ilk ikisi arasında geçiş yapacak zig-zag, " -"çapraz (çift zig-zag) veya dinamik olabilir." - -#: src/libslic3r/PrintConfig.cpp:3638 -msgid "Zig-Zag" -msgstr "Zikzaklı" - -#: src/libslic3r/PrintConfig.cpp:3639 -msgid "Cross" -msgstr "Çapraz" - -#: src/libslic3r/PrintConfig.cpp:3640 -msgid "Dynamic" -msgstr "Dinamik" - -#: src/libslic3r/PrintConfig.cpp:3652 -msgid "Pillar widening factor" -msgstr "Ayağı genişletme faktörü" - -#: src/libslic3r/PrintConfig.cpp:3654 -msgid "" -"Merging bridges or pillars into another pillars can increase the radius. " -"Zero means no increase, one means full increase." +#: src/libslic3r/PrintConfig.cpp:3847 +msgid "Support tree type" msgstr "" -"Köprüler veya sütunların başka bir sütunla birleştirilmesi yarıçapı " -"artırabilir. Sıfır, artış yok demektir, biri tam artış demektir." - -#: src/libslic3r/PrintConfig.cpp:3663 -msgid "Support base diameter" -msgstr "Destek taban çapı" - -#: src/libslic3r/PrintConfig.cpp:3665 -msgid "Diameter in mm of the pillar base" -msgstr "Sütun tabanının mm cinsinden çapı" -#: src/libslic3r/PrintConfig.cpp:3673 -msgid "Support base height" -msgstr "Destek taban yüksekliği" - -#: src/libslic3r/PrintConfig.cpp:3675 -msgid "The height of the pillar base cone" -msgstr "Sütun tabanı konisinin yüksekliği" - -#: src/libslic3r/PrintConfig.cpp:3682 -msgid "Support base safety distance" +#: src/libslic3r/PrintConfig.cpp:3848 +msgid "Support tree building strategy" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3685 -msgid "" -"The minimum distance of the pillar base from the model in mm. Makes sense in " -"zero elevation mode where a gap according to this parameter is inserted " -"between the model and the pad." +#: src/libslic3r/PrintConfig.cpp:3851 +msgid "Branching (experimental)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3695 -msgid "Critical angle" -msgstr "Kritik açı" - -#: src/libslic3r/PrintConfig.cpp:3697 -msgid "The default angle for connecting support sticks and junctions." -msgstr "Destek çubuklarını ve bağlantılarını bağlamak için varsayılan açı." - -#: src/libslic3r/PrintConfig.cpp:3705 -msgid "Max bridge length" -msgstr "En fazla köprü uzunluğu" - -#: src/libslic3r/PrintConfig.cpp:3707 -msgid "The max length of a bridge" -msgstr "Bir köprünün en fazla uzunluğu" - -#: src/libslic3r/PrintConfig.cpp:3714 -msgid "Max pillar linking distance" -msgstr "Max sütun bağlama mesafesi" - -#: src/libslic3r/PrintConfig.cpp:3716 -msgid "" -"The max distance of two pillars to get linked with each other. A zero value " -"will prohibit pillar cascading." +#: src/libslic3r/PrintConfig.cpp:3860 +msgid "Support only in enforced regions" msgstr "" -"Birbiriyle bağlantı kurması için iki sütunun en fazla mesafesi. Sıfır " -"değeri, direk basamaklandırmasını yasaklar." -#: src/libslic3r/PrintConfig.cpp:3726 -msgid "" -"How much the supports should lift up the supported object. If \"Pad around " -"object\" is enabled, this value is ignored." +#: src/libslic3r/PrintConfig.cpp:3862 +msgid "Only create support if it lies in a support enforcer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3737 +#: src/libslic3r/PrintConfig.cpp:3869 msgid "This is a relative measure of support points density." msgstr "Bu, destek noktalarının yoğunluğunun göreceli bir ölçüsüdür." -#: src/libslic3r/PrintConfig.cpp:3743 +#: src/libslic3r/PrintConfig.cpp:3875 msgid "Minimal distance of the support points" msgstr "Destek noktalarının en düşük mesafesi" -#: src/libslic3r/PrintConfig.cpp:3745 +#: src/libslic3r/PrintConfig.cpp:3877 msgid "No support points will be placed closer than this threshold." msgstr "Bu eşikten daha yakın hiçbir destek noktası yerleştirilmeyecektir." -#: src/libslic3r/PrintConfig.cpp:3751 +#: src/libslic3r/PrintConfig.cpp:3883 msgid "Use pad" msgstr "Ped kullan" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3885 msgid "Add a pad underneath the supported model" msgstr "Desteklenen modelin altına bir ped ekler" -#: src/libslic3r/PrintConfig.cpp:3758 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "Pad wall thickness" msgstr "Ped duvar kalınlığı" -#: src/libslic3r/PrintConfig.cpp:3760 +#: src/libslic3r/PrintConfig.cpp:3892 msgid "The thickness of the pad and its optional cavity walls." msgstr "Pedin kalınlığı ve isteğe bağlı boşluk duvarları." -#: src/libslic3r/PrintConfig.cpp:3768 +#: src/libslic3r/PrintConfig.cpp:3900 msgid "Pad wall height" msgstr "Ped duvar yüksekliği" -#: src/libslic3r/PrintConfig.cpp:3769 +#: src/libslic3r/PrintConfig.cpp:3901 msgid "" "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " "when enabling this feature, as some resins may produce an extreme suction " @@ -14206,19 +16182,19 @@ msgstr "" "boşluğun içinde aşırı bir emme etkisi oluşturabilir ve bu da baskıyı " "ayırmayı zorlaştırır." -#: src/libslic3r/PrintConfig.cpp:3782 +#: src/libslic3r/PrintConfig.cpp:3914 msgid "Pad brim size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3783 +#: src/libslic3r/PrintConfig.cpp:3915 msgid "How far should the pad extend around the contained geometry" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3793 +#: src/libslic3r/PrintConfig.cpp:3925 msgid "Max merge distance" msgstr "En fazla birleştirme mesafesi" -#: src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3927 msgid "" "Some objects can get along with a few smaller pads instead of a single big " "one. This parameter defines how far the center of two smaller pads should " @@ -14228,11 +16204,11 @@ msgstr "" "birlikte olabilir. Bu parametre iki küçük pedin ortasının ne kadar uzakta " "olması gerektiğini tanımlar. Yaklaşırlarsa, bir pede birleştirilirler." -#: src/libslic3r/PrintConfig.cpp:3815 +#: src/libslic3r/PrintConfig.cpp:3947 msgid "Pad wall slope" msgstr "Ped duvar eğimi" -#: src/libslic3r/PrintConfig.cpp:3817 +#: src/libslic3r/PrintConfig.cpp:3949 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." @@ -14240,82 +16216,82 @@ msgstr "" "Ped duvarının tabla düzlemine göre eğimi. 90 derece, düz duvarlar anlamına " "gelir." -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3960 msgid "Create pad around object and ignore the support elevation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3833 +#: src/libslic3r/PrintConfig.cpp:3965 msgid "Pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3967 msgid "Force pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3840 +#: src/libslic3r/PrintConfig.cpp:3972 msgid "Pad object gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3842 +#: src/libslic3r/PrintConfig.cpp:3974 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3851 +#: src/libslic3r/PrintConfig.cpp:3983 msgid "Pad object connector stride" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3853 +#: src/libslic3r/PrintConfig.cpp:3985 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3860 +#: src/libslic3r/PrintConfig.cpp:3992 msgid "Pad object connector width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3862 +#: src/libslic3r/PrintConfig.cpp:3994 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3869 +#: src/libslic3r/PrintConfig.cpp:4001 msgid "Pad object connector penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3872 +#: src/libslic3r/PrintConfig.cpp:4004 msgid "How much should the tiny connectors penetrate into the model body." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3879 +#: src/libslic3r/PrintConfig.cpp:4011 msgid "Enable hollowing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:4013 msgid "Hollow out a model to have an empty interior" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3886 +#: src/libslic3r/PrintConfig.cpp:4018 msgid "Wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3888 +#: src/libslic3r/PrintConfig.cpp:4020 msgid "Minimum wall thickness of a hollowed model." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3896 +#: src/libslic3r/PrintConfig.cpp:4028 msgid "Accuracy" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3898 +#: src/libslic3r/PrintConfig.cpp:4030 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:4040 msgid "" "Hollowing is done in two steps: first, an imaginary interior is calculated " "deeper (offset plus the closing distance) in the object and then it's " @@ -14324,75 +16300,103 @@ msgid "" "most." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3920 +#: src/libslic3r/PrintConfig.cpp:4052 msgid "Print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3922 +#: src/libslic3r/PrintConfig.cpp:4054 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " "movement and adds a delay before exposure." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4390 +#: src/libslic3r/PrintConfig.cpp:4065 +msgid "Format of the output SLA archive" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4070 +msgid "SLA output precision" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4071 +msgid "Minimum resolution in nanometers" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4542 msgid "Export OBJ" msgstr "OBJ olarak Dışa Aktar" -#: src/libslic3r/PrintConfig.cpp:4391 +#: src/libslic3r/PrintConfig.cpp:4543 msgid "Export the model(s) as OBJ." msgstr "Model(ler)i OBJ olarak dışa aktar." -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4554 msgid "Export SLA" msgstr "SLA olarak Dışa Aktar" -#: src/libslic3r/PrintConfig.cpp:4403 +#: src/libslic3r/PrintConfig.cpp:4555 msgid "Slice the model and export SLA printing layers as PNG." msgstr "" "Modeli dilimleyin ve SLA yazdırma katmanlarını PNG olarak dışa aktarın." -#: src/libslic3r/PrintConfig.cpp:4408 +#: src/libslic3r/PrintConfig.cpp:4560 msgid "Export 3MF" msgstr "3MF Olarak Dışa Aktar" -#: src/libslic3r/PrintConfig.cpp:4409 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Export the model(s) as 3MF." msgstr "Model(ler)i 3MF olarak dışa aktar." -#: src/libslic3r/PrintConfig.cpp:4413 +#: src/libslic3r/PrintConfig.cpp:4565 msgid "Export AMF" msgstr "AMF Olarak Dışa Aktar" -#: src/libslic3r/PrintConfig.cpp:4414 +#: src/libslic3r/PrintConfig.cpp:4566 msgid "Export the model(s) as AMF." msgstr "Model(ler)i AMF olarak dışa aktar." -#: src/libslic3r/PrintConfig.cpp:4418 +#: src/libslic3r/PrintConfig.cpp:4570 msgid "Export STL" msgstr "STL olarak Dışa Aktar" -#: src/libslic3r/PrintConfig.cpp:4419 +#: src/libslic3r/PrintConfig.cpp:4571 msgid "Export the model(s) as STL." msgstr "Model(ler)i STL olarak dışa aktar." -#: src/libslic3r/PrintConfig.cpp:4424 +#: src/libslic3r/PrintConfig.cpp:4576 msgid "Slice the model and export toolpaths as G-code." msgstr "Modeli dilimleyin ve takım yollarını G kodu olarak dışa aktarın." -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4581 msgid "G-code viewer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4430 +#: src/libslic3r/PrintConfig.cpp:4582 msgid "Visualize an already sliced and saved G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4588 +msgid "OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4589 +msgid "Select the specified OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4594 +msgid "OpenGL debug output" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4595 +msgid "Activate OpenGL debug output on graphic cards which support it" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4601 msgid "Slice" msgstr "Dilim" -#: src/libslic3r/PrintConfig.cpp:4436 +#: src/libslic3r/PrintConfig.cpp:4602 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." @@ -14400,67 +16404,71 @@ msgstr "" "Modeli, printer_technology yapılandırma değerine göre FFF veya SLA olarak " "dilimleyin." -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4607 msgid "Help" msgstr "Yardım" -#: src/libslic3r/PrintConfig.cpp:4442 +#: src/libslic3r/PrintConfig.cpp:4608 msgid "Show this help." msgstr "Bu yardımı göster." -#: src/libslic3r/PrintConfig.cpp:4447 +#: src/libslic3r/PrintConfig.cpp:4613 msgid "Help (FFF options)" msgstr "Yardım (FFF seçenekleri)" -#: src/libslic3r/PrintConfig.cpp:4448 +#: src/libslic3r/PrintConfig.cpp:4614 msgid "Show the full list of print/G-code configuration options." msgstr "Baskı/G-code yapılandırma seçeneklerinin tam listesini göster." -#: src/libslic3r/PrintConfig.cpp:4452 +#: src/libslic3r/PrintConfig.cpp:4618 msgid "Help (SLA options)" msgstr "Yardım (SLA seçenekleri)" -#: src/libslic3r/PrintConfig.cpp:4453 +#: src/libslic3r/PrintConfig.cpp:4619 msgid "Show the full list of SLA print configuration options." msgstr "SLA yazdırma yapılandırma seçeneklerinin tam listesini göster." -#: src/libslic3r/PrintConfig.cpp:4457 +#: src/libslic3r/PrintConfig.cpp:4623 msgid "Output Model Info" msgstr "Çıktı Model Bilgisi" -#: src/libslic3r/PrintConfig.cpp:4458 +#: src/libslic3r/PrintConfig.cpp:4624 msgid "Write information about the model to the console." msgstr "Modelle ilgili bilgileri konsola yazın." -#: src/libslic3r/PrintConfig.cpp:4462 +#: src/libslic3r/PrintConfig.cpp:4628 msgid "Save config file" msgstr "Konfigürasyon dosyasını kaydet" -#: src/libslic3r/PrintConfig.cpp:4463 +#: src/libslic3r/PrintConfig.cpp:4629 msgid "Save configuration to the specified file." msgstr "Yapılandırmayı belirtilen dosyaya kaydeder." -#: src/libslic3r/PrintConfig.cpp:4473 +#: src/libslic3r/PrintConfig.cpp:4639 msgid "Align XY" msgstr "XY'yi Hizala" -#: src/libslic3r/PrintConfig.cpp:4474 +#: src/libslic3r/PrintConfig.cpp:4640 msgid "Align the model to the given point." msgstr "Modeli verilen noktaya hizala." -#: src/libslic3r/PrintConfig.cpp:4479 +#: src/libslic3r/PrintConfig.cpp:4645 msgid "Cut model at the given Z." msgstr "Modeli belirtilen Z seviyesinden kes." -#: src/libslic3r/PrintConfig.cpp:4501 +#: src/libslic3r/PrintConfig.cpp:4666 +msgid "Center" +msgstr "Merkez" + +#: src/libslic3r/PrintConfig.cpp:4667 msgid "Center the print around the given center." msgstr "Baskıyı verilen merkezin çevresine ortala." -#: src/libslic3r/PrintConfig.cpp:4505 +#: src/libslic3r/PrintConfig.cpp:4671 msgid "Don't arrange" msgstr "Düzenleme" -#: src/libslic3r/PrintConfig.cpp:4506 +#: src/libslic3r/PrintConfig.cpp:4672 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." @@ -14468,33 +16476,33 @@ msgstr "" "Birleştirmeden ve orijinal XY koordinatlarını saklamadan modelleri yeniden " "düzenleme." -#: src/libslic3r/PrintConfig.cpp:4509 +#: src/libslic3r/PrintConfig.cpp:4675 msgid "Ensure on bed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4510 +#: src/libslic3r/PrintConfig.cpp:4676 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4514 +#: src/libslic3r/PrintConfig.cpp:4680 msgid "Duplicate" msgstr "Çoğalt" -#: src/libslic3r/PrintConfig.cpp:4515 +#: src/libslic3r/PrintConfig.cpp:4681 msgid "Multiply copies by this factor." msgstr "Kopyaları bu faktörle çarpın." -#: src/libslic3r/PrintConfig.cpp:4519 +#: src/libslic3r/PrintConfig.cpp:4685 msgid "Duplicate by grid" msgstr "Kılavuza göre çoğalt" -#: src/libslic3r/PrintConfig.cpp:4520 +#: src/libslic3r/PrintConfig.cpp:4686 msgid "Multiply copies by creating a grid." msgstr "Izgara oluşturarak kopyaları çarpın." -#: src/libslic3r/PrintConfig.cpp:4524 +#: src/libslic3r/PrintConfig.cpp:4690 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." @@ -14502,7 +16510,7 @@ msgstr "" "Tedarik edilen modelleri bir plaka içinde düzenleyin ve bir kez işlem yapmak " "için bunları tek bir modelde birleştirin." -#: src/libslic3r/PrintConfig.cpp:4529 +#: src/libslic3r/PrintConfig.cpp:4695 msgid "" "Try to repair any non-manifold meshes (this option is implicitly added " "whenever we need to slice the model to perform the requested action)." @@ -14511,60 +16519,68 @@ msgstr "" "eylemi gerçekleştirmek için modeli dilimlememiz gerektiğinde dolaylı olarak " "eklenir)." -#: src/libslic3r/PrintConfig.cpp:4533 +#: src/libslic3r/PrintConfig.cpp:4699 msgid "Rotation angle around the Z axis in degrees." msgstr "Z ekseni etrafındaki dönüş açısı, derece olarak." -#: src/libslic3r/PrintConfig.cpp:4537 +#: src/libslic3r/PrintConfig.cpp:4703 msgid "Rotate around X" msgstr "X etrafında döndür" -#: src/libslic3r/PrintConfig.cpp:4538 +#: src/libslic3r/PrintConfig.cpp:4704 msgid "Rotation angle around the X axis in degrees." msgstr "X ekseni etrafındaki dönüş açısı, derece olarak." -#: src/libslic3r/PrintConfig.cpp:4542 +#: src/libslic3r/PrintConfig.cpp:4708 msgid "Rotate around Y" msgstr "Y etrafında döndür" -#: src/libslic3r/PrintConfig.cpp:4543 +#: src/libslic3r/PrintConfig.cpp:4709 msgid "Rotation angle around the Y axis in degrees." msgstr "Y ekseni etrafındaki dönüş açısı, derece olarak." -#: src/libslic3r/PrintConfig.cpp:4548 +#: src/libslic3r/PrintConfig.cpp:4714 msgid "Scaling factor or percentage." msgstr "Ölçekleme faktörü veya yüzdesi." -#: src/libslic3r/PrintConfig.cpp:4553 +#: src/libslic3r/PrintConfig.cpp:4719 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "" "Modellerde bağlı olmayan parçaları tespit et ve bunları ayrı nesnelere böl." -#: src/libslic3r/PrintConfig.cpp:4556 +#: src/libslic3r/PrintConfig.cpp:4722 msgid "Scale to Fit" msgstr "Uygun ölçek" -#: src/libslic3r/PrintConfig.cpp:4557 +#: src/libslic3r/PrintConfig.cpp:4723 msgid "Scale to fit the given volume." msgstr "Verilen hacme uyması için ölçeklendirin." -#: src/libslic3r/PrintConfig.cpp:4566 +#: src/libslic3r/PrintConfig.cpp:4727 +msgid "Delete files after loading" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4728 +msgid "Delete files after loading." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4736 msgid "Ignore non-existent config files" msgstr "Var olmayan config dosyalarını yoksay" -#: src/libslic3r/PrintConfig.cpp:4567 +#: src/libslic3r/PrintConfig.cpp:4737 msgid "Do not fail if a file supplied to --load does not exist." msgstr "Do not fail if a file supplied to --load does not exist." -#: src/libslic3r/PrintConfig.cpp:4570 +#: src/libslic3r/PrintConfig.cpp:4740 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4741 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -14572,27 +16588,27 @@ msgid "" "substitute an unknown value with a default silently or verbosely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4745 msgid "Bail out on unknown configuration values" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4579 +#: src/libslic3r/PrintConfig.cpp:4746 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4580 +#: src/libslic3r/PrintConfig.cpp:4747 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4584 +#: src/libslic3r/PrintConfig.cpp:4752 msgid "Load config file" msgstr "Konfigürasyon dosyası yükle" -#: src/libslic3r/PrintConfig.cpp:4585 +#: src/libslic3r/PrintConfig.cpp:4753 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -14600,33 +16616,33 @@ msgstr "" "Belirtilen dosyadan yapılandırmayı yükle. Seçenekleri birden fazla dosyadan " "yüklemek için birden fazla kez kullanılabilir." -#: src/libslic3r/PrintConfig.cpp:4588 +#: src/libslic3r/PrintConfig.cpp:4756 msgid "Output File" msgstr "Çıktı dosyası" -#: src/libslic3r/PrintConfig.cpp:4589 +#: src/libslic3r/PrintConfig.cpp:4757 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." msgstr "" "Çıktının yazılacağı dosya (belirtilmemişse girdi dosyasına dayanacaktır)." -#: src/libslic3r/PrintConfig.cpp:4593 +#: src/libslic3r/PrintConfig.cpp:4761 msgid "Single instance mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4594 +#: src/libslic3r/PrintConfig.cpp:4762 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " "the \"single_instance\" configuration value from application preferences." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4605 +#: src/libslic3r/PrintConfig.cpp:4767 msgid "Data directory" msgstr "Veri dizini" -#: src/libslic3r/PrintConfig.cpp:4606 +#: src/libslic3r/PrintConfig.cpp:4768 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -14636,22 +16652,22 @@ msgstr "" "için veya bir ağ depolama birimindeki yapılandırmaları dahil etmek için " "kullanışlıdır." -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4771 msgid "Logging level" msgstr "Günlük seviyesi" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4772 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" "For example. loglevel=2 logs fatal, error and warning level messages." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4616 +#: src/libslic3r/PrintConfig.cpp:4778 msgid "Render with a software renderer" msgstr "Bir yazılım oluşturucuyla işleme" -#: src/libslic3r/PrintConfig.cpp:4617 +#: src/libslic3r/PrintConfig.cpp:4779 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -14663,18 +16679,30 @@ msgstr "" msgid "Error with zip archive" msgstr "Zip arşivinde hata" -#: src/libslic3r/PrintObject.cpp:126 +#: src/libslic3r/PrintObject.cpp:152 msgid "Generating perimeters" msgstr "Duvar oluşturma" -#: src/libslic3r/PrintObject.cpp:229 +#: src/libslic3r/PrintObject.cpp:257 msgid "Preparing infill" msgstr "Dolgu hazırlama" -#: src/libslic3r/PrintObject.cpp:403 +#: src/libslic3r/PrintObject.cpp:402 +msgid "making infill" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:449 +msgid "Searching support spots" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:474 msgid "Generating support material" msgstr "Destek oluşturma" +#: src/libslic3r/PrintObject.cpp:495 +msgid "Estimating curled extrusions" +msgstr "" + #: resources/data/hints.ini: [hint:Fuzzy skin] msgid "" "Fuzzy skin\n" @@ -14945,6 +16973,36 @@ msgid "" "F11 hotkey." msgstr "" +#: resources/data/hints.ini: [hint:Printables integration] +msgid "" +"Printables.com integration\n" +"Did you know that when you are browsing Printables.com, you can send 3D " +"model files to PrusaSlicer with a single click? Learn more in the " +"documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Cut tool] +msgid "" +"Cut tool\n" +"Did you know that you can cut a model at any angle and even create aligning " +"pins with the updated Cut tool? Learn more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Measurement tool] +msgid "" +"Measurement tool\n" +"Did you know that you can measure the distances between points, edges " +"and planes, the radius of a hole or the angle between edges or planes? Learn " +"more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Text tool] +msgid "" +"Text tool\n" +"Did you know that you can add custom text labels to your models or even use " +"the text as a modifier? Learn more in the documentation." +msgstr "" + #: ../src/common/debugrpt.cpp:586 msgid "" "\n" @@ -16098,6 +18156,10 @@ msgstr "Sola Hizala" msgid "Align Right" msgstr "Sağa Hizala" +#: ../src/richtext/richtextsizepage.cpp:266 +msgid "Alignment" +msgstr "Hizalama" + #: ../src/generic/filectrlg.cpp:1197 ../src/common/fldlgcmn.cpp:107 #, c-format msgid "All files (%s)|%s" @@ -17389,10 +19451,6 @@ msgstr "Süslü" msgid "Default encoding" msgstr "Varsayılan kodlama" -#: ../src/dfb/fontmgr.cpp:180 -msgid "Default font" -msgstr "Varsayılan yazı türü" - #: ../src/generic/prntdlgg.cpp:510 msgid "Default printer" msgstr "Varsayılan yazıcı" @@ -17752,11 +19810,6 @@ msgstr "Yazdırma sorunu: " msgid "Error: " msgstr "Hata: " -#. TRANSLATORS: Name of keyboard key -#: ../src/common/accelcmn.cpp:69 -msgid "Esc" -msgstr "Esc" - #. TRANSLATORS: Name of keyboard key #: ../src/common/accelcmn.cpp:70 msgid "Escape" @@ -18503,11 +20556,6 @@ msgstr "Esnek" msgid "Folio, 8 1/2 x 13 in" msgstr "Kitap yaprağı, 8 1/2 x 13 inç" -#: ../src/richtext/richtextformatdlg.cpp:344 ../src/osx/carbon/fontdlg.cpp:287 -#: ../src/common/stockitem.cpp:194 -msgid "Font" -msgstr "Yazı türü" - #: ../src/richtext/richtextfontpage.cpp:221 msgid "Font &weight:" msgstr "Yazı &koyuluğu:" @@ -19620,10 +21668,6 @@ msgstr "'%s' dosyası zaten VFS belleğinde yer alıyor!" msgid "Menu" msgstr "Menü" -#: ../src/common/msgout.cpp:124 -msgid "Message" -msgstr "İleti" - #: ../src/univ/themes/metal.cpp:168 msgid "Metal theme" msgstr "Metal tema" @@ -19657,10 +21701,6 @@ msgstr "Gereken bir parametre eksik." msgid "Modern" msgstr "Modern" -#: ../src/generic/filectrlg.cpp:427 -msgid "Modified" -msgstr "Değişiklik" - #: ../src/common/module.cpp:133 #, c-format msgid "Module \"%s\" initialization failed" @@ -19750,11 +21790,6 @@ msgstr "YeniAd" msgid "Next page" msgstr "Sonraki sayfa" -#: ../include/wx/msgdlg.h:277 ../src/common/stockitem.cpp:177 -#: ../src/motif/msgdlg.cpp:196 -msgid "No" -msgstr "Hayır" - #. TRANSLATORS: System cursor name #: ../src/propgrid/advprops.cpp:1764 msgid "No Entry" @@ -19991,12 +22026,6 @@ msgstr "Num_lock" msgid "Numbered outline" msgstr "Numaralı taslak" -#: ../include/wx/msgdlg.h:278 ../src/richtext/richtextstyledlg.cpp:297 -#: ../src/common/stockitem.cpp:178 ../src/msw/msgdlg.cpp:454 -#: ../src/msw/msgdlg.cpp:747 ../src/gtk1/fontdlg.cpp:138 -msgid "OK" -msgstr "Tamam" - #: ../src/msw/ole/automtn.cpp:692 #, c-format msgid "OLE Automation error in %s: %s" @@ -20068,6 +22097,10 @@ msgstr "'%s' seçeneğinin bir değeri olması gerekiyor." msgid "Option '%s': '%s' cannot be converted to a date." msgstr "'%s' seçeneği: '%s' tarihe dönüştürülemiyor." +#: ../src/generic/prntdlgg.cpp:618 +msgid "Options" +msgstr "Ayarlar" + #: ../src/propgrid/advprops.cpp:1606 msgid "Orange" msgstr "Turuncu" @@ -20849,10 +22882,6 @@ msgstr "Normal ya da yatık biçemi seçin." msgid "Select underlining or no underlining." msgstr "Altı çizili ya da normal biçemi seçin." -#: ../src/motif/filedlg.cpp:220 -msgid "Selection" -msgstr "Seçim" - #: ../src/richtext/richtextliststylepage.cpp:187 #: ../src/richtext/richtextliststylepage.cpp:189 msgid "Selects the list level to edit." @@ -21734,10 +23763,6 @@ msgstr "" msgid "Turkish (ISO-8859-9)" msgstr "Türkçe (ISO-8859-9)" -#: ../src/generic/filectrlg.cpp:426 -msgid "Type" -msgstr "Tür" - #: ../src/richtext/richtextfontpage.cpp:151 #: ../src/richtext/richtextfontpage.cpp:153 msgid "Type a font name." @@ -22222,10 +24247,6 @@ msgstr "Geçerli hizalama ayarları kullanılsın." msgid "Validation conflict" msgstr "Doğrulama çelişkisi" -#: ../src/propgrid/manager.cpp:238 -msgid "Value" -msgstr "Değer" - #: ../src/propgrid/props.cpp:386 ../src/propgrid/props.cpp:500 #, c-format msgid "Value must be %s or higher." @@ -22455,11 +24476,6 @@ msgstr "XPM: %d satırında budanmış görüntü verisi!" msgid "Yellow" msgstr "Sarı" -#: ../include/wx/msgdlg.h:276 ../src/common/stockitem.cpp:206 -#: ../src/motif/msgdlg.cpp:196 -msgid "Yes" -msgstr "Evet" - #: ../src/osx/carbon/overlay.cpp:155 msgid "You cannot Clear an overlay that is not inited" msgstr "Hazırlanmamış bir örtüşmeyi temizleyemezsiniz" diff --git a/resources/localization/uk/PrusaSlicer.mo b/resources/localization/uk/PrusaSlicer.mo index 3036f74def405bbbb46d895cb6970ed74b5609c7..b3567abf8828e5c07c0d45a45e407ba2dc652325 100644 GIT binary patch delta 85837 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\n" "Language-Team: \n" @@ -14,16 +14,16 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 +#: src/slic3r/GUI/AboutDialog.cpp:46 src/slic3r/GUI/AboutDialog.cpp:306 msgid "Portions copyright" msgstr "Використані розробки" -#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 +#: src/slic3r/GUI/AboutDialog.cpp:143 src/slic3r/GUI/AboutDialog.cpp:270 msgid "Copyright" msgstr "Копірайт" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:143 +#: src/slic3r/GUI/AboutDialog.cpp:145 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -31,26 +31,26 @@ msgstr "" "Ліцензійні угоди всіх наступних програм (бібліотек) є частиною ліцензійної " "угоди програми" -#: src/slic3r/GUI/AboutDialog.cpp:212 +#: src/slic3r/GUI/AboutDialog.cpp:214 #, c-format, boost-format msgid "About %s" msgstr "О %s" -#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 -#: src/slic3r/GUI/GUI_App.cpp:262 +#: src/slic3r/GUI/AboutDialog.cpp:245 src/slic3r/GUI/AboutDialog.cpp:370 +#: src/slic3r/GUI/GUI_App.cpp:271 msgid "Version" msgstr "Версія" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:277 msgid "is licensed under the" msgstr "ліцензовано згідно" -#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:273 src/slic3r/GUI/GUI_App.cpp:277 msgid "GNU Affero General Public License, version 3" msgstr "Загальна публічна ліцензія GNU Affero, версія 3" -#: src/slic3r/GUI/AboutDialog.cpp:273 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -58,7 +58,7 @@ msgstr "" "PrusaSlicer заснований на Slic3r від Alessandro Ranellucci та спільноти " "RepRap." -#: src/slic3r/GUI/AboutDialog.cpp:274 +#: src/slic3r/GUI/AboutDialog.cpp:275 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -68,7 +68,7 @@ msgstr "" "Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik та багатьох " "інших." -#: src/slic3r/GUI/AboutDialog.cpp:310 +#: src/slic3r/GUI/AboutDialog.cpp:311 msgid "Copy Version Info" msgstr "Скопіювати інформацію про версію" @@ -95,54 +95,54 @@ msgid "" msgstr "" #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:162 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:204 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:188 msgid "Slicing complete" msgstr "Нарізання завершено" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:199 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183 #, boost-format msgid "Masked SLA file exported to %1%" msgstr "Файл SLA експортовано до %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:286 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:279 msgid "Access violation" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:288 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:281 msgid "Illegal instruction" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:283 msgid "Divide by zero" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:292 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:285 msgid "Overflow" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:294 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:287 msgid "Underflow" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:297 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 msgid "Floating reserved operand" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:300 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:293 msgid "Stack overflow" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:659 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:726 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:652 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:719 msgid "Running post-processing scripts" msgstr "Запуск скриптів пост-обробки" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:690 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:710 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:683 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:703 msgid "Unknown error occured during exporting G-code." msgstr "Під час експорту G-коду сталася невідома помилка." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:695 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:688 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. Maybe the SD " @@ -153,7 +153,7 @@ msgstr "" "заблокована?\n" "Повідомлення про помилку: %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:698 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:691 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. There might be " @@ -164,7 +164,7 @@ msgstr "" "цільовим пристроєм, спробуйте експортувати ще раз або використати інший " "пристрій. Пошкоджений вихідний G-код - %1% .tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:701 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:694 #, boost-format msgid "" "Renaming of the G-code after copying to the selected destination folder has " @@ -173,7 +173,7 @@ msgstr "" "Не вдалося перейменувати G-код після копіювання у вибрану папку призначення. " "Поточний шлях - %1%.tmp. Спробуйте експортувати ще раз." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:704 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:697 #, boost-format msgid "" "Copying of the temporary G-code has finished but the original code at %1% " @@ -182,7 +182,7 @@ msgstr "" "Копіювання тимчасового G-коду закінчено, але оригінальний код на рівні %1% " "не вдалося відкрити під час перевірки копії. Вихідний G-код - %2% .tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:707 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:700 #, boost-format msgid "" "Copying of the temporary G-code has finished but the exported code couldn't " @@ -191,16 +191,16 @@ msgstr "" "Копіювання тимчасового G-коду завершено, але експортований код не вдалося " "відкрити під час перевірки копії. Вихідний G-код - %1% .tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:715 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:708 #, boost-format msgid "G-code file exported to %1%" msgstr "Файл G-коду експортується до %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:729 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:722 msgid "Copying of the temporary G-code to the output G-code failed" msgstr "Не вдалося скопіювати тимчасовий G-код у вихідний G-код" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:751 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:738 #, boost-format msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" @@ -208,8 +208,9 @@ msgstr "" "друку" #: src/slic3r/GUI/BedShapeDialog.cpp:31 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2765 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1576 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:241 src/slic3r/GUI/Plater.cpp:220 +#: src/slic3r/GUI/Tab.cpp:2697 msgid "Size" msgstr "Розмір" @@ -217,7 +218,9 @@ msgstr "Розмір" msgid "Origin" msgstr "Початок координат" -#: src/slic3r/GUI/BedShapeDialog.cpp:33 src/libslic3r/PrintConfig.cpp:1020 +#: src/slic3r/GUI/BedShapeDialog.cpp:33 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1994 +#: src/libslic3r/PrintConfig.cpp:1109 msgid "Diameter" msgstr "Діаметр" @@ -231,54 +234,62 @@ msgid "" "rectangle." msgstr "Відстань координат 0,0 G-коду від нижнього лівого кута прямокутника." -#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:262 -#: src/slic3r/GUI/ConfigWizard.cpp:1476 src/slic3r/GUI/ConfigWizard.cpp:1490 +#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:291 +#: src/slic3r/GUI/ConfigWizard.cpp:1796 src/slic3r/GUI/ConfigWizard.cpp:1832 +#: src/slic3r/GUI/ConfigWizard.cpp:1846 #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:100 -#: src/slic3r/GUI/GCodeViewer.cpp:3181 src/slic3r/GUI/GCodeViewer.cpp:3187 -#: src/slic3r/GUI/GCodeViewer.cpp:3195 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 src/slic3r/GUI/GCodeViewer.cpp:3455 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 #: src/slic3r/GUI/GUI_ObjectLayers.cpp:145 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 src/libslic3r/PrintConfig.cpp:263 -#: src/libslic3r/PrintConfig.cpp:290 src/libslic3r/PrintConfig.cpp:297 -#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:520 -#: src/libslic3r/PrintConfig.cpp:546 src/libslic3r/PrintConfig.cpp:621 -#: src/libslic3r/PrintConfig.cpp:629 src/libslic3r/PrintConfig.cpp:679 -#: src/libslic3r/PrintConfig.cpp:813 src/libslic3r/PrintConfig.cpp:824 -#: src/libslic3r/PrintConfig.cpp:842 src/libslic3r/PrintConfig.cpp:1023 -#: src/libslic3r/PrintConfig.cpp:1235 src/libslic3r/PrintConfig.cpp:1302 -#: src/libslic3r/PrintConfig.cpp:1312 src/libslic3r/PrintConfig.cpp:1611 -#: src/libslic3r/PrintConfig.cpp:1805 src/libslic3r/PrintConfig.cpp:1866 -#: src/libslic3r/PrintConfig.cpp:1884 src/libslic3r/PrintConfig.cpp:1902 -#: src/libslic3r/PrintConfig.cpp:1965 src/libslic3r/PrintConfig.cpp:1975 -#: src/libslic3r/PrintConfig.cpp:2097 src/libslic3r/PrintConfig.cpp:2106 -#: src/libslic3r/PrintConfig.cpp:2125 src/libslic3r/PrintConfig.cpp:2146 -#: src/libslic3r/PrintConfig.cpp:2158 src/libslic3r/PrintConfig.cpp:2166 -#: src/libslic3r/PrintConfig.cpp:2207 src/libslic3r/PrintConfig.cpp:2215 -#: src/libslic3r/PrintConfig.cpp:2225 src/libslic3r/PrintConfig.cpp:2233 -#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2303 -#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2603 -#: src/libslic3r/PrintConfig.cpp:2620 src/libslic3r/PrintConfig.cpp:2721 -#: src/libslic3r/PrintConfig.cpp:2730 src/libslic3r/PrintConfig.cpp:2780 -#: src/libslic3r/PrintConfig.cpp:2932 src/libslic3r/PrintConfig.cpp:3020 -#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3034 -#: src/libslic3r/PrintConfig.cpp:3048 src/libslic3r/PrintConfig.cpp:3072 -#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3092 -#: src/libslic3r/PrintConfig.cpp:3372 src/libslic3r/PrintConfig.cpp:3413 -#: src/libslic3r/PrintConfig.cpp:3573 src/libslic3r/PrintConfig.cpp:3582 -#: src/libslic3r/PrintConfig.cpp:3591 src/libslic3r/PrintConfig.cpp:3601 -#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3676 -#: src/libslic3r/PrintConfig.cpp:3688 src/libslic3r/PrintConfig.cpp:3708 -#: src/libslic3r/PrintConfig.cpp:3718 src/libslic3r/PrintConfig.cpp:3728 -#: src/libslic3r/PrintConfig.cpp:3746 src/libslic3r/PrintConfig.cpp:3761 -#: src/libslic3r/PrintConfig.cpp:3775 src/libslic3r/PrintConfig.cpp:3786 -#: src/libslic3r/PrintConfig.cpp:3799 src/libslic3r/PrintConfig.cpp:3844 -#: src/libslic3r/PrintConfig.cpp:3854 src/libslic3r/PrintConfig.cpp:3863 -#: src/libslic3r/PrintConfig.cpp:3873 src/libslic3r/PrintConfig.cpp:3889 -#: src/libslic3r/PrintConfig.cpp:3913 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 src/libslic3r/PrintConfig.cpp:279 +#: src/libslic3r/PrintConfig.cpp:303 src/libslic3r/PrintConfig.cpp:310 +#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:657 src/libslic3r/PrintConfig.cpp:724 +#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:782 +#: src/libslic3r/PrintConfig.cpp:902 src/libslic3r/PrintConfig.cpp:913 +#: src/libslic3r/PrintConfig.cpp:931 src/libslic3r/PrintConfig.cpp:1112 +#: src/libslic3r/PrintConfig.cpp:1295 src/libslic3r/PrintConfig.cpp:1359 +#: src/libslic3r/PrintConfig.cpp:1369 src/libslic3r/PrintConfig.cpp:1650 +#: src/libslic3r/PrintConfig.cpp:1842 src/libslic3r/PrintConfig.cpp:1903 +#: src/libslic3r/PrintConfig.cpp:1921 src/libslic3r/PrintConfig.cpp:1939 +#: src/libslic3r/PrintConfig.cpp:1995 src/libslic3r/PrintConfig.cpp:2005 +#: src/libslic3r/PrintConfig.cpp:2127 src/libslic3r/PrintConfig.cpp:2136 +#: src/libslic3r/PrintConfig.cpp:2155 src/libslic3r/PrintConfig.cpp:2176 +#: src/libslic3r/PrintConfig.cpp:2188 src/libslic3r/PrintConfig.cpp:2196 +#: src/libslic3r/PrintConfig.cpp:2237 src/libslic3r/PrintConfig.cpp:2245 +#: src/libslic3r/PrintConfig.cpp:2255 src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2271 src/libslic3r/PrintConfig.cpp:2336 +#: src/libslic3r/PrintConfig.cpp:2565 src/libslic3r/PrintConfig.cpp:2632 +#: src/libslic3r/PrintConfig.cpp:2647 src/libslic3r/PrintConfig.cpp:2746 +#: src/libslic3r/PrintConfig.cpp:2755 src/libslic3r/PrintConfig.cpp:2801 +#: src/libslic3r/PrintConfig.cpp:2886 src/libslic3r/PrintConfig.cpp:2896 +#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3108 +#: src/libslic3r/PrintConfig.cpp:3115 src/libslic3r/PrintConfig.cpp:3122 +#: src/libslic3r/PrintConfig.cpp:3136 src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3170 src/libslic3r/PrintConfig.cpp:3180 +#: src/libslic3r/PrintConfig.cpp:3330 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3391 src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3444 src/libslic3r/PrintConfig.cpp:3456 +#: src/libslic3r/PrintConfig.cpp:3476 src/libslic3r/PrintConfig.cpp:3491 +#: src/libslic3r/PrintConfig.cpp:3501 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3681 src/libslic3r/PrintConfig.cpp:3878 +#: src/libslic3r/PrintConfig.cpp:3893 src/libslic3r/PrintConfig.cpp:3907 +#: src/libslic3r/PrintConfig.cpp:3918 src/libslic3r/PrintConfig.cpp:3931 +#: src/libslic3r/PrintConfig.cpp:3976 src/libslic3r/PrintConfig.cpp:3986 +#: src/libslic3r/PrintConfig.cpp:3995 src/libslic3r/PrintConfig.cpp:4005 +#: src/libslic3r/PrintConfig.cpp:4021 src/libslic3r/PrintConfig.cpp:4045 +#: src/libslic3r/PrintConfig.cpp:4072 msgid "mm" msgstr "мм" @@ -298,13 +309,13 @@ msgstr "Прямокутний" msgid "Circular" msgstr "Круговий" -#: src/slic3r/GUI/BedShapeDialog.cpp:81 src/slic3r/GUI/GUI_Preview.cpp:252 -#: src/libslic3r/ExtrusionEntity.cpp:343 src/libslic3r/ExtrusionEntity.cpp:378 +#: src/slic3r/GUI/BedShapeDialog.cpp:81 msgid "Custom" msgstr "Користувацький" #: src/slic3r/GUI/BedShapeDialog.cpp:104 src/slic3r/GUI/BedShapeDialog.cpp:179 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1701 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1565 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1798 msgid "Shape" msgstr "Форма" @@ -312,8 +323,8 @@ msgstr "Форма" msgid "Load shape from STL..." msgstr "Завантажте форму з STL ..." -#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2147 +#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3914 +#: src/slic3r/GUI/MainFrame.cpp:2240 msgid "Settings" msgstr "Налаштування" @@ -326,7 +337,7 @@ msgid "Load..." msgstr "Завантажити..." #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/Tab.cpp:3973 msgid "Remove" msgstr "Видалити" @@ -338,77 +349,120 @@ msgstr "Не знайдено:" msgid "Model" msgstr "Модель" -#: src/slic3r/GUI/BedShapeDialog.cpp:508 +#: src/slic3r/GUI/BedShapeDialog.cpp:506 msgid "Choose an STL file to import bed shape from:" msgstr "Виберіть STL-файл для імпорту форми столу з:" -#: src/slic3r/GUI/BedShapeDialog.cpp:514 src/slic3r/GUI/BedShapeDialog.cpp:562 -#: src/slic3r/GUI/BedShapeDialog.cpp:584 +#: src/slic3r/GUI/BedShapeDialog.cpp:512 src/slic3r/GUI/BedShapeDialog.cpp:560 +#: src/slic3r/GUI/BedShapeDialog.cpp:582 msgid "Invalid file format." msgstr "Недійсний формат файлу." -#: src/slic3r/GUI/BedShapeDialog.cpp:525 +#: src/slic3r/GUI/BedShapeDialog.cpp:523 msgid "Error! Invalid model" msgstr "Помилка! Недійсна модель" -#: src/slic3r/GUI/BedShapeDialog.cpp:533 +#: src/slic3r/GUI/BedShapeDialog.cpp:531 msgid "The selected file contains no geometry." msgstr "Обраний файл не містить геометрії." -#: src/slic3r/GUI/BedShapeDialog.cpp:537 +#: src/slic3r/GUI/BedShapeDialog.cpp:535 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "Обраний файл містить декілька непересічних областей. Не підтримується." -#: src/slic3r/GUI/BedShapeDialog.cpp:552 +#: src/slic3r/GUI/BedShapeDialog.cpp:550 msgid "Choose a file to import bed texture from (PNG/SVG):" msgstr "Виберіть файл для імпорту текстури столу (PNG / SVG):" -#: src/slic3r/GUI/BedShapeDialog.cpp:574 +#: src/slic3r/GUI/BedShapeDialog.cpp:572 msgid "Choose an STL file to import bed model from:" msgstr "Виберіть STL-файл для імпорту моделі столу з:" -#: src/slic3r/GUI/BedShapeDialog.hpp:95 src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/BedShapeDialog.hpp:96 src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape" msgstr "Форма столу" -#: src/slic3r/GUI/BonjourDialog.cpp:55 +#: src/slic3r/GUI/BonjourDialog.cpp:58 msgid "Network lookup" msgstr "Пошук мережі" -#: src/slic3r/GUI/BonjourDialog.cpp:72 +#: src/slic3r/GUI/BonjourDialog.cpp:75 src/slic3r/GUI/BonjourDialog.cpp:253 msgid "Address" msgstr "Адреса" -#: src/slic3r/GUI/BonjourDialog.cpp:73 +#: src/slic3r/GUI/BonjourDialog.cpp:76 msgid "Hostname" msgstr "Назва хоста" -#: src/slic3r/GUI/BonjourDialog.cpp:74 +#: src/slic3r/GUI/BonjourDialog.cpp:77 msgid "Service name" msgstr "Назва сервісу" -#: src/slic3r/GUI/BonjourDialog.cpp:76 +#: src/slic3r/GUI/BonjourDialog.cpp:79 msgid "OctoPrint version" msgstr "Версія OctoPrint" -#: src/slic3r/GUI/BonjourDialog.cpp:224 +#: src/slic3r/GUI/BonjourDialog.cpp:227 msgid "Searching for devices" msgstr "Пошук пристроїв" -#: src/slic3r/GUI/BonjourDialog.cpp:231 +#: src/slic3r/GUI/BonjourDialog.cpp:234 msgid "Finished" msgstr "Завершено" -#: src/slic3r/GUI/ButtonsDescription.cpp:42 +#: src/slic3r/GUI/BonjourDialog.cpp:240 +msgid "Multiple resolved IP addresses" +msgstr "" + +#: src/slic3r/GUI/BonjourDialog.cpp:249 +#, boost-format +msgid "" +"There are several IP addresses resolving to hostname %1%.\n" +"Please select one that should be used." +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:21 +msgid "Palette 1 (default)" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:22 +msgid "Palette 2" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:23 +msgid "Palette 3" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:24 +msgid "Palette 4" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:25 +msgid "Palette 5" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:26 +msgid "Palette 6" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:27 +msgid "Palette 7" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:28 +msgid "Palette 8" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:112 msgid "Revert color to default" msgstr "" -#: src/slic3r/GUI/ButtonsDescription.cpp:57 +#: src/slic3r/GUI/ButtonsDescription.cpp:127 msgid "Value is the same as the system value" msgstr "Значення таке ж, як системне" -#: src/slic3r/GUI/ButtonsDescription.cpp:58 +#: src/slic3r/GUI/ButtonsDescription.cpp:128 msgid "" "Value was changed and is not equal to the system value or the last saved " "preset" @@ -416,31 +470,55 @@ msgstr "" "Значення було змінено і не дорівнює системному значенню або останньому " "збереженому пресету" -#: src/slic3r/GUI/ButtonsDescription.cpp:62 +#: src/slic3r/GUI/ButtonsDescription.cpp:155 +msgid "Default palette for mode markers" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2422 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Simple" +msgstr "Простий" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2424 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgctxt "Mode" +msgid "Advanced" +msgstr "Розширений" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2425 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Expert" +msgstr "Експерт" + +#: src/slic3r/GUI/ButtonsDescription.cpp:182 +msgid "Revert color" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:200 msgid "Buttons And Text Colors Description" msgstr "Опис кнопок та кольорів тексту" -#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/ConfigManipulation.cpp:50 msgid "" "Layer height is not valid.\n" "\n" "The layer height will be reset to 0.01." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:50 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1449 -#: src/libslic3r/PrintConfig.cpp:286 +#: src/slic3r/GUI/ConfigManipulation.cpp:51 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1394 +#: src/libslic3r/PrintConfig.cpp:299 msgid "Layer height" msgstr "Висота шару" -#: src/slic3r/GUI/ConfigManipulation.cpp:61 +#: src/slic3r/GUI/ConfigManipulation.cpp:62 msgid "" "First layer height is not valid.\n" "\n" "The first layer height will be reset to 0.01." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:62 src/libslic3r/PrintConfig.cpp:1231 +#: src/slic3r/GUI/ConfigManipulation.cpp:63 src/libslic3r/PrintConfig.cpp:1291 msgid "First layer height" msgstr "Висота першого шару" @@ -451,7 +529,6 @@ msgid "" "- no top solid layers\n" "- 0% fill density\n" "- no support material\n" -"- Ensure vertical shell thickness enabled\n" "- Detect thin walls disabled" msgstr "" "Режим спіральної вази вимагає:\n" @@ -459,42 +536,18 @@ msgstr "" "- немає верхніх щільних шарів\n" "- щільність заповнення 0%\n" "- немає підтримуючого матеріалу\n" -"- \"Забезпечення товщини вертикальної оболонки\" увімкнено\n" "- \"Виявлення тонких стінок\" вимкнено" -#: src/slic3r/GUI/ConfigManipulation.cpp:90 +#: src/slic3r/GUI/ConfigManipulation.cpp:89 msgid "Shall I adjust those settings in order to enable Spiral Vase?" msgstr "" "Чи потрібно змінити ці налаштування, щоб увімкнути режим Спіральної вази?" -#: src/slic3r/GUI/ConfigManipulation.cpp:91 +#: src/slic3r/GUI/ConfigManipulation.cpp:90 msgid "Spiral Vase" msgstr "Спіральна ваза" -#: src/slic3r/GUI/ConfigManipulation.cpp:121 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool " -"change.\n" -"(both support_material_extruder and support_material_interface_extruder need " -"to be set to 0)." -msgstr "" -"Вежа витирання в даний момент підтримує лише нерозчинні підтримки,\n" -"якщо вони друкуються з поточним екструдером, не запускаючи зміну " -"інструменту.\n" -"(обидва значення support_material_extruder і " -"support_material_interface_extruder повинні бути встановлені на 0)." - -#: src/slic3r/GUI/ConfigManipulation.cpp:125 -msgid "Shall I adjust those settings in order to enable the Wipe Tower?" -msgstr "Чи потрібно коригувати ці налаштування, щоб увімкнути вежу витирання?" - -#: src/slic3r/GUI/ConfigManipulation.cpp:126 -#: src/slic3r/GUI/ConfigManipulation.cpp:146 -msgid "Wipe Tower" -msgstr "Вежа витирання" - -#: src/slic3r/GUI/ConfigManipulation.cpp:142 +#: src/slic3r/GUI/ConfigManipulation.cpp:123 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers\n" "need to be synchronized with the object layers." @@ -503,12 +556,33 @@ msgstr "" "підтримки\n" "повинні бути синхронізовані з шаром об'єкта." -#: src/slic3r/GUI/ConfigManipulation.cpp:145 +#: src/slic3r/GUI/ConfigManipulation.cpp:126 msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" msgstr "" "Чи потрібно синхронізувати шари підтримки, щоб увімкнути вежу витирання?" -#: src/slic3r/GUI/ConfigManipulation.cpp:164 +#: src/slic3r/GUI/ConfigManipulation.cpp:127 +#: src/slic3r/GUI/ConfigManipulation.cpp:145 +msgid "Wipe Tower" +msgstr "Вежа витирання" + +#: src/slic3r/GUI/ConfigManipulation.cpp:140 src/libslic3r/Print.cpp:672 +msgid "" +"The Wipe Tower currently supports the non-soluble supports only if they are " +"printed with the current extruder without triggering a tool change. (both " +"support_material_extruder and support_material_interface_extruder need to be " +"set to 0)." +msgstr "" +"Вежа витирання в даний момент підтримує лише нерозчинні підтримки, якщо вони " +"друкуються з поточним екструдером, не запускаючи зміну інструменту. (Обидва " +"значення support_material_extruder і support_material_interface_extruder " +"повинні бути встановлені на 0)." + +#: src/slic3r/GUI/ConfigManipulation.cpp:144 +msgid "Shall I adjust those settings in order to enable the Wipe Tower?" +msgstr "Чи потрібно коригувати ці налаштування, щоб увімкнути вежу витирання?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:166 msgid "" "Supports work better, if the following feature is enabled:\n" "- Detect bridging perimeters" @@ -516,184 +590,188 @@ msgstr "" "Підтримка працює краще, якщо ввімкнена така функція:\n" "- Виявлення нависаючих периметрів(перемичок)" -#: src/slic3r/GUI/ConfigManipulation.cpp:167 +#: src/slic3r/GUI/ConfigManipulation.cpp:169 msgid "Shall I adjust those settings for supports?" msgstr "Чи потрібно змінити ці налаштування для підтримки?" -#: src/slic3r/GUI/ConfigManipulation.cpp:168 +#: src/slic3r/GUI/ConfigManipulation.cpp:170 msgid "Support Generator" msgstr "Створення підтримки" -#: src/slic3r/GUI/ConfigManipulation.cpp:195 +#: src/slic3r/GUI/ConfigManipulation.cpp:194 #, boost-format msgid "The %1% infill pattern is not supposed to work at 100%% density." msgstr "Шаблон заповнення %1% не підтримується при щільності 100%%." -#: src/slic3r/GUI/ConfigManipulation.cpp:198 +#: src/slic3r/GUI/ConfigManipulation.cpp:196 msgid "Shall I switch to rectilinear fill pattern?" msgstr "Чи потрібно змінити його на прямолінійний шаблон заповнення?" -#: src/slic3r/GUI/ConfigManipulation.cpp:199 +#: src/slic3r/GUI/ConfigManipulation.cpp:197 #: src/slic3r/GUI/GUI_Factories.cpp:55 src/slic3r/GUI/GUI_Factories.cpp:128 -#: src/slic3r/GUI/Plater.cpp:460 src/slic3r/GUI/Tab.cpp:1503 -#: src/slic3r/GUI/Tab.cpp:1505 src/libslic3r/PrintConfig.cpp:475 -#: src/libslic3r/PrintConfig.cpp:716 src/libslic3r/PrintConfig.cpp:743 -#: src/libslic3r/PrintConfig.cpp:1098 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1149 src/libslic3r/PrintConfig.cpp:1398 -#: src/libslic3r/PrintConfig.cpp:1427 src/libslic3r/PrintConfig.cpp:1496 -#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1535 -#: src/libslic3r/PrintConfig.cpp:2364 src/libslic3r/PrintConfig.cpp:2381 +#: src/slic3r/GUI/Plater.cpp:468 src/slic3r/GUI/Tab.cpp:1450 +#: src/slic3r/GUI/Tab.cpp:1452 src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:811 src/libslic3r/PrintConfig.cpp:831 +#: src/libslic3r/PrintConfig.cpp:1187 src/libslic3r/PrintConfig.cpp:1200 +#: src/libslic3r/PrintConfig.cpp:1225 src/libslic3r/PrintConfig.cpp:1444 +#: src/libslic3r/PrintConfig.cpp:1473 src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1557 src/libslic3r/PrintConfig.cpp:1576 +#: src/libslic3r/PrintConfig.cpp:2395 src/libslic3r/PrintConfig.cpp:2412 msgid "Infill" msgstr "Заповнення" -#: src/slic3r/GUI/ConfigManipulation.cpp:337 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Head penetration should not be greater than the head width." msgstr "Проникнення головки не повинно бути більше її ширини." -#: src/slic3r/GUI/ConfigManipulation.cpp:339 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid Head penetration" msgstr "Неприпустиме проникнення головки" -#: src/slic3r/GUI/ConfigManipulation.cpp:350 +#: src/slic3r/GUI/ConfigManipulation.cpp:362 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "Діаметр головки стовпа повинен бути менше діаметра стовпа." -#: src/slic3r/GUI/ConfigManipulation.cpp:352 +#: src/slic3r/GUI/ConfigManipulation.cpp:364 msgid "Invalid pinhead diameter" msgstr "Неприпустимий діаметр головки" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20 msgid "Upgrade" msgstr "Оновити" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22 msgid "Downgrade" msgstr "Повернути до попередньої версії" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 msgid "Before roll back" msgstr "Перед відкатом" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:340 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:26 src/libslic3r/PrintConfig.cpp:353 msgid "User" msgstr "Користувацький" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:329 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:29 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1135 msgid "Unknown" msgstr "Невідомий" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 msgid "Active" msgstr "Активний" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 msgid "PrusaSlicer version" msgstr "Версія PrusaSlicer" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 src/libslic3r/Preset.cpp:1341 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 src/libslic3r/Preset.cpp:1480 msgid "print" msgstr "друк" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:65 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 msgid "filaments" msgstr "філаменти" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 src/libslic3r/Preset.cpp:1343 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:67 src/libslic3r/Preset.cpp:1482 msgid "SLA print" msgstr "SLA-друк" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69 -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/slic3r/GUI/GUI.cpp:340 -#: src/slic3r/GUI/Plater.cpp:821 src/libslic3r/Preset.cpp:1344 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/slic3r/GUI/GUI.cpp:331 +#: src/slic3r/GUI/Plater.cpp:851 src/libslic3r/Preset.cpp:1483 msgid "SLA material" msgstr "SLA-матеріал" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:71 src/libslic3r/Preset.cpp:1345 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 src/libslic3r/Preset.cpp:1484 msgid "printer" msgstr "принтер" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 src/slic3r/GUI/Tab.cpp:1366 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 src/slic3r/GUI/Tab.cpp:1311 msgid "vendor" msgstr "виробник" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 msgid "version" msgstr "версія" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:76 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 msgid "min PrusaSlicer version" msgstr "мінімальна версія PrusaSlicer" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:77 msgid "max PrusaSlicer version" msgstr "максимальна версія PrusaSlicer" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "model" msgstr "модель" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "variants" msgstr "варіанти" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:93 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:92 #, c-format, boost-format msgid "Incompatible with this %s" msgstr "Є несумісним з цією версією %s" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:96 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:95 msgid "Activate" msgstr "Активувати" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:123 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:122 msgid "Configuration Snapshots" msgstr "Знімки конфігурації" -#: src/slic3r/GUI/ConfigWizard.cpp:262 +#: src/slic3r/GUI/ConfigWizard.cpp:291 msgid "nozzle" msgstr "сопло" -#: src/slic3r/GUI/ConfigWizard.cpp:266 +#: src/slic3r/GUI/ConfigWizard.cpp:295 msgid "Alternate nozzles:" msgstr "Альтернативні сопла:" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "All standard" msgstr "Всі стандартні" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "Standard" msgstr "Стандартний" -#: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3833 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 +#: src/slic3r/GUI/ConfigWizard.cpp:360 src/slic3r/GUI/ConfigWizard.cpp:681 +#: src/slic3r/GUI/FileArchiveDialog.cpp:261 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 src/slic3r/GUI/Preferences.cpp:550 +#: src/slic3r/GUI/Tab.cpp:4058 src/slic3r/GUI/UnsavedChangesDialog.cpp:1161 msgid "All" msgstr "Всі" -#: src/slic3r/GUI/ConfigWizard.cpp:332 src/slic3r/GUI/ConfigWizard.cpp:652 -#: src/slic3r/GUI/DoubleSlider.cpp:2030 src/slic3r/GUI/Plater.cpp:432 -#: src/slic3r/GUI/Plater.cpp:579 src/slic3r/GUI/Preferences.cpp:436 -#: src/libslic3r/PrintConfig.cpp:1291 +#: src/slic3r/GUI/ConfigWizard.cpp:361 src/slic3r/GUI/ConfigWizard.cpp:682 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 +#: src/slic3r/GUI/FileArchiveDialog.cpp:265 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1984 src/slic3r/GUI/Plater.cpp:439 +#: src/slic3r/GUI/Plater.cpp:594 src/slic3r/GUI/Preferences.cpp:552 +#: src/libslic3r/PrintConfig.cpp:1347 msgid "None" msgstr "Жодне" -#: src/slic3r/GUI/ConfigWizard.cpp:484 +#: src/slic3r/GUI/ConfigWizard.cpp:513 #, c-format, boost-format msgid "Welcome to the %s Configuration Assistant" msgstr "Ласкаво просимо до Асистента конфігурації %s" -#: src/slic3r/GUI/ConfigWizard.cpp:486 +#: src/slic3r/GUI/ConfigWizard.cpp:515 #, c-format, boost-format msgid "Welcome to the %s Configuration Wizard" msgstr "Ласкаво просимо до Майстру конфігурації %s" -#: src/slic3r/GUI/ConfigWizard.cpp:488 +#: src/slic3r/GUI/ConfigWizard.cpp:517 msgid "Welcome" msgstr "Ласкаво просимо" -#: src/slic3r/GUI/ConfigWizard.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:519 #, c-format, boost-format msgid "" "Hello, welcome to %s! This %s helps you with the initial configuration; just " @@ -702,104 +780,133 @@ msgstr "" "Вітаємо, ласкаво просимо до %s! Цей %s допоможе вам в початковій " "конфігурації; лише кілька налаштувань, і ви будете готові до друку." -#: src/slic3r/GUI/ConfigWizard.cpp:495 +#: src/slic3r/GUI/ConfigWizard.cpp:524 msgid "Remove user profiles (a snapshot will be taken beforehand)" msgstr "Видалити профілі користувачів (знімок буде зроблено заздалегідь)" -#: src/slic3r/GUI/ConfigWizard.cpp:498 +#: src/slic3r/GUI/ConfigWizard.cpp:527 msgid "" "Perform desktop integration (Sets this binary to be searchable by the " "system)." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:550 +#: src/slic3r/GUI/ConfigWizard.cpp:579 #, c-format, boost-format msgid "%s Family" msgstr "%s Родина" -#: src/slic3r/GUI/ConfigWizard.cpp:640 +#: src/slic3r/GUI/ConfigWizard.cpp:670 msgid "Printer:" msgstr "Принтер:" -#: src/slic3r/GUI/ConfigWizard.cpp:642 +#: src/slic3r/GUI/ConfigWizard.cpp:672 msgid "Vendor:" msgstr "Виробник:" -#: src/slic3r/GUI/ConfigWizard.cpp:643 +#: src/slic3r/GUI/ConfigWizard.cpp:673 msgid "Profile:" msgstr "Профіль:" -#: src/slic3r/GUI/ConfigWizard.cpp:720 src/slic3r/GUI/ConfigWizard.cpp:892 -#: src/slic3r/GUI/ConfigWizard.cpp:952 src/slic3r/GUI/ConfigWizard.cpp:1088 +#: src/slic3r/GUI/ConfigWizard.cpp:750 src/slic3r/GUI/ConfigWizard.cpp:938 +#: src/slic3r/GUI/ConfigWizard.cpp:1024 src/slic3r/GUI/ConfigWizard.cpp:1163 msgid "(All)" msgstr "(Всі)" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:754 src/slic3r/GUI/ConfigWizard.cpp:1165 +msgid "(Templates)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:789 #, boost-format msgid "" -"%1% marked with * are not compatible with some installed " -"printers." +"%1% visible for (\"Template\") printer are universal profiles " +"available for all printers. These might not be compatible with your printer." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:752 src/slic3r/GUI/ConfigWizard.cpp:2043 -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filaments" msgstr "Філаменти" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 msgid "SLA materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:755 +#: src/slic3r/GUI/ConfigWizard.cpp:791 +#, boost-format +msgid "" +"%1% marked with * are not compatible with some installed " +"printers." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:794 #, boost-format msgid "All installed printers are compatible with the selected %1%." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/libslic3r/Preset.cpp:1342 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/libslic3r/Preset.cpp:1481 msgid "filament" msgstr "філамент" -#: src/slic3r/GUI/ConfigWizard.cpp:778 +#: src/slic3r/GUI/ConfigWizard.cpp:818 msgid "" "Only the following installed printers are compatible with the selected " "filaments" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:779 +#: src/slic3r/GUI/ConfigWizard.cpp:819 msgid "" "Only the following installed printers are compatible with the selected SLA " "materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1213 +msgid "" +"You have selected template filament. Please note that these filaments are " +"available for all printers but are NOT certain to be compatible with your " +"printer. Do you still wish to have this filament selected?\n" +"(This message won't be displayed again.)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1214 src/slic3r/GUI/ConfigWizard.cpp:2720 +#: src/slic3r/GUI/ConfigWizard.cpp:2860 src/slic3r/GUI/DoubleSlider.cpp:2591 +#: src/slic3r/GUI/DoubleSlider.cpp:2612 src/slic3r/GUI/GUI.cpp:245 +#: src/slic3r/GUI/GUI_App.cpp:3458 src/slic3r/GUI/UpdateDialogs.cpp:204 +#: src/slic3r/GUI/UpdateDialogs.cpp:212 src/slic3r/GUI/UpdateDialogs.cpp:217 +#: src/slic3r/GUI/UpdateDialogs.cpp:222 src/slic3r/GUI/UpdateDialogs.cpp:229 +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +msgid "Notice" +msgstr "Зауваження" + +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer Setup" msgstr "Користувацьке налаштування принтера" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer" msgstr "Користувацький принтер" -#: src/slic3r/GUI/ConfigWizard.cpp:1177 +#: src/slic3r/GUI/ConfigWizard.cpp:1264 msgid "Define a custom printer profile" msgstr "Визначте власний профіль принтера" -#: src/slic3r/GUI/ConfigWizard.cpp:1179 +#: src/slic3r/GUI/ConfigWizard.cpp:1265 msgid "Custom profile name:" msgstr "Користувацьке ім'я пресету:" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Automatic updates" msgstr "Автоматичні оновлення" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Updates" msgstr "Оновлення" -#: src/slic3r/GUI/ConfigWizard.cpp:1214 +#: src/slic3r/GUI/ConfigWizard.cpp:1290 msgid "Check for application updates" msgstr "Перевірте наявність оновлень програми" -#: src/slic3r/GUI/ConfigWizard.cpp:1218 +#: src/slic3r/GUI/ConfigWizard.cpp:1294 #, c-format, boost-format msgid "" "If enabled, %s checks for new application versions online. When a new " @@ -812,11 +919,11 @@ msgstr "" "наступного запуску застосування (ніколи не під час використання програми). " "Це лише механізми сповіщення, автоматична інсталяція не виконується." -#: src/slic3r/GUI/ConfigWizard.cpp:1224 src/slic3r/GUI/Preferences.cpp:175 +#: src/slic3r/GUI/ConfigWizard.cpp:1300 src/slic3r/GUI/Preferences.cpp:306 msgid "Update built-in Presets automatically" msgstr "Автоматично оновлювати вбудовані пресети" -#: src/slic3r/GUI/ConfigWizard.cpp:1228 +#: src/slic3r/GUI/ConfigWizard.cpp:1304 #, c-format, boost-format msgid "" "If enabled, %s downloads updates of built-in system presets in the " @@ -829,7 +936,7 @@ msgstr "" "з’являється нова попередньо встановлена версія, вона пропонується під час " "запуску програми." -#: src/slic3r/GUI/ConfigWizard.cpp:1231 +#: src/slic3r/GUI/ConfigWizard.cpp:1307 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." @@ -837,7 +944,7 @@ msgstr "" "Оновлення ніколи не застосовуються без згоди користувача та ніколи не " "перезаписують власні налаштування користувача." -#: src/slic3r/GUI/ConfigWizard.cpp:1236 +#: src/slic3r/GUI/ConfigWizard.cpp:1312 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." @@ -845,18 +952,62 @@ msgstr "" "Крім того, перед застосуванням оновлення створюється резервний знімок всієї " "конфігурації." -#: src/slic3r/GUI/ConfigWizard.cpp:1243 src/slic3r/GUI/GUI_Factories.cpp:726 -#: src/slic3r/GUI/Plater.cpp:3582 +#: src/slic3r/GUI/ConfigWizard.cpp:1361 src/slic3r/GUI/Preferences.cpp:1076 +msgid "Download path" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1366 src/slic3r/GUI/FirmwareDialog.cpp:815 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:300 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +msgid "Browse" +msgstr "Переглянути" + +#: src/slic3r/GUI/ConfigWizard.cpp:1371 +msgid "Choose folder:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads from URL" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1417 +msgid "Allow built-in downloader" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1424 +#, c-format, boost-format +msgid "" +"If enabled, %s registers to start on custom URL on www.printables.com. You " +"will be able to use button with %s logo to open models in this %s. The model " +"will be downloaded into folder you choose bellow." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1431 +msgid "" +"On Linux systems the process of registration also creates desktop " +"integration files for this version of application." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1458 +msgid "Chosen directory for downloads does not Exists." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1545 src/slic3r/GUI/GUI_Factories.cpp:810 +#: src/slic3r/GUI/Plater.cpp:3732 msgid "Reload from disk" msgstr "Перезавантажити з диска" -#: src/slic3r/GUI/ConfigWizard.cpp:1246 +#: src/slic3r/GUI/ConfigWizard.cpp:1548 msgid "" "Export full pathnames of models and parts sources into 3mf and amf files" msgstr "" "Експортуйте повні назви шляхів джерел моделей та частей у файли 3MF та AMF" -#: src/slic3r/GUI/ConfigWizard.cpp:1250 +#: src/slic3r/GUI/ConfigWizard.cpp:1552 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked.\n" @@ -868,23 +1019,23 @@ msgstr "" "Якщо не ввімкнено, команда «Перезавантажити з диска» попросить вибрати кожен " "файл за допомогою діалогового вікна відкритого файлу." -#: src/slic3r/GUI/ConfigWizard.cpp:1259 +#: src/slic3r/GUI/ConfigWizard.cpp:1561 msgid "Files association" msgstr "Асоціація файлів" -#: src/slic3r/GUI/ConfigWizard.cpp:1261 src/slic3r/GUI/Preferences.cpp:157 +#: src/slic3r/GUI/ConfigWizard.cpp:1563 src/slic3r/GUI/Preferences.cpp:292 msgid "Associate .3mf files to PrusaSlicer" msgstr "Асоціювати 3MF-файли з PrusaSlicer" -#: src/slic3r/GUI/ConfigWizard.cpp:1262 src/slic3r/GUI/Preferences.cpp:164 +#: src/slic3r/GUI/ConfigWizard.cpp:1564 src/slic3r/GUI/Preferences.cpp:297 msgid "Associate .stl files to PrusaSlicer" msgstr "Асоціювати stl-файли з PrusaSlicer" -#: src/slic3r/GUI/ConfigWizard.cpp:1272 +#: src/slic3r/GUI/ConfigWizard.cpp:1574 msgid "View mode" msgstr "Режим перегляду" -#: src/slic3r/GUI/ConfigWizard.cpp:1274 +#: src/slic3r/GUI/ConfigWizard.cpp:1576 msgid "" "PrusaSlicer's user interfaces comes in three variants:\n" "Simple, Advanced, and Expert.\n" @@ -899,82 +1050,96 @@ msgstr "" "поступово більш досконалу точну настройку, вони підходять для більш " "досвідчених користувачів." -#: src/slic3r/GUI/ConfigWizard.cpp:1279 +#: src/slic3r/GUI/ConfigWizard.cpp:1581 msgid "Simple mode" msgstr "Простий режим" -#: src/slic3r/GUI/ConfigWizard.cpp:1280 +#: src/slic3r/GUI/ConfigWizard.cpp:1582 msgid "Advanced mode" msgstr "Розширений режим" -#: src/slic3r/GUI/ConfigWizard.cpp:1281 +#: src/slic3r/GUI/ConfigWizard.cpp:1583 msgid "Expert mode" msgstr "Експертний режим" -#: src/slic3r/GUI/ConfigWizard.cpp:1287 +#: src/slic3r/GUI/ConfigWizard.cpp:1596 msgid "The size of the object can be specified in inches" msgstr "Розмір предмета можна вказати в дюймах" -#: src/slic3r/GUI/ConfigWizard.cpp:1288 +#: src/slic3r/GUI/ConfigWizard.cpp:1597 msgid "Use inches" msgstr "Використовувати дюйми" -#: src/slic3r/GUI/ConfigWizard.cpp:1322 +#: src/slic3r/GUI/ConfigWizard.cpp:1617 msgid "Other Vendors" msgstr "Інші постачальники" -#: src/slic3r/GUI/ConfigWizard.cpp:1326 +#: src/slic3r/GUI/ConfigWizard.cpp:1621 #, c-format, boost-format msgid "Pick another vendor supported by %s" msgstr "Виберіть іншого постачальника, який підтримує %s" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 msgid "Firmware Type" msgstr "Тип прошивки" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2366 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 src/slic3r/GUI/Tab.cpp:2354 msgid "Firmware" msgstr "Прошивка" -#: src/slic3r/GUI/ConfigWizard.cpp:1361 +#: src/slic3r/GUI/ConfigWizard.cpp:1658 msgid "Choose the type of firmware used by your printer." msgstr "Виберіть тип прошивки, що використовуються вашим принтером." -#: src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/ConfigWizard.cpp:1707 src/slic3r/GUI/ConfigWizard.cpp:1778 +#: src/slic3r/GUI/ConfigWizard.cpp:1783 src/slic3r/GUI/ConfigWizard.cpp:1788 +#: src/slic3r/GUI/Field.cpp:258 src/slic3r/GUI/Field.cpp:328 +#: src/slic3r/GUI/Field.cpp:1585 src/slic3r/GUI/GUI_ObjectLayers.cpp:435 +msgid "Invalid numeric input." +msgstr "Недійсне числове значення." + +#: src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape and Size" msgstr "Форма та розмір столу" -#: src/slic3r/GUI/ConfigWizard.cpp:1399 +#: src/slic3r/GUI/ConfigWizard.cpp:1735 msgid "Set the shape of your printer's bed." msgstr "Встановіть форму столу свого принтеру." -#: src/slic3r/GUI/ConfigWizard.cpp:1433 src/slic3r/GUI/Field.cpp:255 -#: src/slic3r/GUI/Field.cpp:324 src/slic3r/GUI/Field.cpp:1561 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:435 -msgid "Invalid numeric input." -msgstr "Недійсне числове значення." +#: src/slic3r/GUI/ConfigWizard.cpp:1755 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1610 +msgid "Build Volume" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1758 +msgid "Set vertical size of your printer." +msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1795 +msgid "Max print height:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Filament and Nozzle Diameters" msgstr "Діаметри філатенту та сопла" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Print Diameters" msgstr "Діаметри друку" -#: src/slic3r/GUI/ConfigWizard.cpp:1472 +#: src/slic3r/GUI/ConfigWizard.cpp:1828 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "Введіть діаметр кінчику екструдерного сопла." -#: src/slic3r/GUI/ConfigWizard.cpp:1475 +#: src/slic3r/GUI/ConfigWizard.cpp:1831 msgid "Nozzle Diameter:" msgstr "Діаметр сопла:" -#: src/slic3r/GUI/ConfigWizard.cpp:1485 +#: src/slic3r/GUI/ConfigWizard.cpp:1841 msgid "Enter the diameter of your filament." msgstr "Введіть діаметр вашого філаметну." -#: src/slic3r/GUI/ConfigWizard.cpp:1486 +#: src/slic3r/GUI/ConfigWizard.cpp:1842 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." @@ -982,37 +1147,38 @@ msgstr "" "Необхідна висока точність, тому використовуйте калібрувальник і виконайте " "декілька вимірювань вздовж філаменту, потім обчисліть середнє значення." -#: src/slic3r/GUI/ConfigWizard.cpp:1489 +#: src/slic3r/GUI/ConfigWizard.cpp:1845 msgid "Filament Diameter:" msgstr "Діаметр філаменту:" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Nozzle and Bed Temperatures" msgstr "Температура сопла та столу" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Temperatures" msgstr "Температури" -#: src/slic3r/GUI/ConfigWizard.cpp:1563 +#: src/slic3r/GUI/ConfigWizard.cpp:1919 msgid "Enter the temperature needed for extruding your filament." msgstr "Введіть температуру, необхідну для екструдування вашого філаменту." -#: src/slic3r/GUI/ConfigWizard.cpp:1564 +#: src/slic3r/GUI/ConfigWizard.cpp:1920 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "Зазвичай - 160-230°C для PLA та 215-250°C для ABS." -#: src/slic3r/GUI/ConfigWizard.cpp:1567 +#: src/slic3r/GUI/ConfigWizard.cpp:1923 msgid "Extrusion Temperature:" msgstr "Температура екструзії:" -#: src/slic3r/GUI/ConfigWizard.cpp:1568 src/slic3r/GUI/ConfigWizard.cpp:1582 -#: src/libslic3r/PrintConfig.cpp:418 src/libslic3r/PrintConfig.cpp:1211 -#: src/libslic3r/PrintConfig.cpp:1266 src/libslic3r/PrintConfig.cpp:2842 +#: src/slic3r/GUI/ConfigWizard.cpp:1924 src/slic3r/GUI/ConfigWizard.cpp:1938 +#: src/libslic3r/PrintConfig.cpp:437 src/libslic3r/PrintConfig.cpp:1271 +#: src/libslic3r/PrintConfig.cpp:1326 src/libslic3r/PrintConfig.cpp:2930 +#: src/libslic3r/PrintConfig.cpp:3689 msgid "°C" msgstr "°C" -#: src/slic3r/GUI/ConfigWizard.cpp:1577 +#: src/slic3r/GUI/ConfigWizard.cpp:1933 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." @@ -1020,7 +1186,7 @@ msgstr "" "Введіть температуру столу, необхідну для того, щоб ваш філамент добре " "кріпився до нагрітого столу." -#: src/slic3r/GUI/ConfigWizard.cpp:1578 +#: src/slic3r/GUI/ConfigWizard.cpp:1934 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." @@ -1028,69 +1194,63 @@ msgstr "" "Зазвичай - 60°C для PLA та 110°C для ABS. Залиште рівним нулю, якщо стіл " "нерозігрітий." -#: src/slic3r/GUI/ConfigWizard.cpp:1581 +#: src/slic3r/GUI/ConfigWizard.cpp:1937 msgid "Bed Temperature:" msgstr "Температура столу:" -#: src/slic3r/GUI/ConfigWizard.cpp:2043 src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Materials" msgstr "SLA-матеріали" -#: src/slic3r/GUI/ConfigWizard.cpp:2097 +#: src/slic3r/GUI/ConfigWizard.cpp:2464 msgid "FFF Technology Printers" msgstr "Принтери технології FFF" -#: src/slic3r/GUI/ConfigWizard.cpp:2102 +#: src/slic3r/GUI/ConfigWizard.cpp:2469 msgid "SLA Technology Printers" msgstr "Принтери технології SLA" -#: src/slic3r/GUI/ConfigWizard.cpp:2338 +#: src/slic3r/GUI/ConfigWizard.cpp:2718 #, boost-format msgid "" "Following printer profiles has no default filament: %1%Please select one " "manually." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2339 +#: src/slic3r/GUI/ConfigWizard.cpp:2719 #, boost-format msgid "" "Following printer profiles has no default material: %1%Please select one " "manually." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2340 src/slic3r/GUI/ConfigWizard.cpp:2438 -#: src/slic3r/GUI/DoubleSlider.cpp:2522 src/slic3r/GUI/DoubleSlider.cpp:2543 -#: src/slic3r/GUI/GUI.cpp:232 -msgid "Notice" -msgstr "Зауваження" - -#: src/slic3r/GUI/ConfigWizard.cpp:2459 +#: src/slic3r/GUI/ConfigWizard.cpp:2883 msgid "The following FFF printer models have no filament selected:" msgstr "Наступні моделі FFF-принтерів не мають вибраного філаменту:" -#: src/slic3r/GUI/ConfigWizard.cpp:2463 +#: src/slic3r/GUI/ConfigWizard.cpp:2887 msgid "Do you want to select default filaments for these FFF printer models?" msgstr "" "Ви хочете вибрати філаменти за замовчуванням для цих моделей FFF-принтерів?" -#: src/slic3r/GUI/ConfigWizard.cpp:2477 +#: src/slic3r/GUI/ConfigWizard.cpp:2901 msgid "The following SLA printer models have no materials selected:" msgstr "Наступні моделі SLA-принтерів не мають вибраного матеріалу:" -#: src/slic3r/GUI/ConfigWizard.cpp:2481 +#: src/slic3r/GUI/ConfigWizard.cpp:2905 msgid "Do you want to select default SLA materials for these printer models?" msgstr "" "Ви хочете вибрати матеріали за замовчуванням для цих моделей SLA-принтерів?" -#: src/slic3r/GUI/ConfigWizard.cpp:2523 +#: src/slic3r/GUI/ConfigWizard.cpp:2947 msgid "Configuration is edited in ConfigWizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2566 +#: src/slic3r/GUI/ConfigWizard.cpp:3000 msgid "All user presets will be deleted." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2596 +#: src/slic3r/GUI/ConfigWizard.cpp:3037 msgid "A new vendor was installed and one of its printers will be activated" msgid_plural "" "New vendors were installed and one of theirs printers will be activated" @@ -1098,98 +1258,103 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/ConfigWizard.cpp:2625 +#: src/slic3r/GUI/ConfigWizard.cpp:3069 msgid "Do you want to continue changing the configuration?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2691 +#: src/slic3r/GUI/ConfigWizard.cpp:3136 msgid "A new Printer was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2696 +#: src/slic3r/GUI/ConfigWizard.cpp:3141 msgid "Some Printers were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2717 +#: src/slic3r/GUI/ConfigWizard.cpp:3162 msgid "A new filament was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2718 +#: src/slic3r/GUI/ConfigWizard.cpp:3163 msgid "A new SLA material was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some filaments were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some SLA materials were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2773 +#: src/slic3r/GUI/ConfigWizard.cpp:3218 msgid "Custom printer was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2858 +#: src/slic3r/GUI/ConfigWizard.cpp:3306 msgid "Select all standard printers" msgstr "Виберіть усі стандартні принтери" -#: src/slic3r/GUI/ConfigWizard.cpp:2861 +#: src/slic3r/GUI/ConfigWizard.cpp:3309 msgid "< &Back" msgstr "< Назад" -#: src/slic3r/GUI/ConfigWizard.cpp:2862 +#: src/slic3r/GUI/ConfigWizard.cpp:3310 msgid "&Next >" msgstr "Далі >" -#: src/slic3r/GUI/ConfigWizard.cpp:2863 +#: src/slic3r/GUI/ConfigWizard.cpp:3311 msgid "&Finish" msgstr "Завершити" -#: src/slic3r/GUI/ConfigWizard.cpp:2864 -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:3312 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:657 +#: src/slic3r/GUI/FileArchiveDialog.cpp:274 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 #: src/slic3r/GUI/FirmwareDialog.cpp:153 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1593 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1365 #: src/slic3r/GUI/ProgressStatusBar.cpp:26 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:93 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:879 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:96 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:907 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1606 msgid "Cancel" msgstr "Скасувати" -#: src/slic3r/GUI/ConfigWizard.cpp:2884 +#: src/slic3r/GUI/ConfigWizard.cpp:3332 msgid "Prusa FFF Technology Printers" msgstr "Принтери технології FFF" -#: src/slic3r/GUI/ConfigWizard.cpp:2892 +#: src/slic3r/GUI/ConfigWizard.cpp:3340 msgid "Prusa MSLA Technology Printers" msgstr "Принтери технології MSLA" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filament Profiles Selection" msgstr "Вибір профілів філаменту" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 src/slic3r/GUI/ConfigWizard.cpp:2915 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 src/slic3r/GUI/ConfigWizard.cpp:3363 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Type:" msgstr "Тип:" -#: src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Material Profiles Selection" msgstr "Вибір профілів SLA-матеріалу" -#: src/slic3r/GUI/ConfigWizard.cpp:3036 +#: src/slic3r/GUI/ConfigWizard.cpp:3486 msgid "Configuration Assistant" msgstr "Асистент конфігурації" -#: src/slic3r/GUI/ConfigWizard.cpp:3037 +#: src/slic3r/GUI/ConfigWizard.cpp:3487 msgid "Configuration &Assistant" msgstr "Асистент конфігурації" -#: src/slic3r/GUI/ConfigWizard.cpp:3039 +#: src/slic3r/GUI/ConfigWizard.cpp:3489 msgid "Configuration Wizard" msgstr "Майстер конфігурації" -#: src/slic3r/GUI/ConfigWizard.cpp:3040 +#: src/slic3r/GUI/ConfigWizard.cpp:3490 msgid "Configuration &Wizard" msgstr "Майстер конфігурації" @@ -1203,37 +1368,54 @@ msgstr "" msgid "Performing desktop integration failed - Could not find executable." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:378 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:383 msgid "" "Performing desktop integration failed because the application directory was " "not found." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:419 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:423 msgid "" "Performing desktop integration failed - could not create Gcodeviewer desktop " "file. PrusaSlicer desktop file was probably created successfully." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:459 -#: src/slic3r/GUI/GUI_App.cpp:2245 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:472 +msgid "" +"Performing downloader desktop integration failed - boost::filesystem::" +"canonical did not return appimage path." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:484 +msgid "" +"Performing downloader desktop integration failed - Could not find executable." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:602 +msgid "" +"Performing downloader desktop integration failed because the application " +"directory was not found." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:626 +#: src/slic3r/GUI/GUI_App.cpp:2407 msgid "Desktop Integration" msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:466 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:633 msgid "" "Desktop Integration sets this binary to be searchable by the system.\n" "\n" "Press \"Perform\" to proceed." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:480 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:647 msgid "Perform" msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1342 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:653 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/KBShortcutsDialog.cpp:106 +#: src/slic3r/GUI/MainFrame.cpp:1426 msgid "Undo" msgstr "Скасувати" @@ -1241,19 +1423,19 @@ msgstr "Скасувати" msgid "Place bearings in slots and resume printing" msgstr "Розмістіть необхідні деталі в гніздах і відновіть друк" -#: src/slic3r/GUI/DoubleSlider.cpp:1379 +#: src/slic3r/GUI/DoubleSlider.cpp:1448 msgid "One layer mode" msgstr "Одношаровий режим" -#: src/slic3r/GUI/DoubleSlider.cpp:1381 +#: src/slic3r/GUI/DoubleSlider.cpp:1450 msgid "Discard all custom changes" msgstr "Відхилити всі користувацькі зміни" -#: src/slic3r/GUI/DoubleSlider.cpp:1385 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:1454 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to move" msgstr "Перейти до руху" -#: src/slic3r/GUI/DoubleSlider.cpp:1388 +#: src/slic3r/GUI/DoubleSlider.cpp:1457 #, c-format, boost-format msgid "" "Jump to height %s\n" @@ -1264,7 +1446,7 @@ msgstr "" "Налаштувати режим лінійки\n" "або Налаштувати послідовність екструдерів для поточного тіску" -#: src/slic3r/GUI/DoubleSlider.cpp:1391 +#: src/slic3r/GUI/DoubleSlider.cpp:1460 #, c-format, boost-format msgid "" "Jump to height %s\n" @@ -1273,31 +1455,31 @@ msgstr "" "Перейти на висоту %s\n" "або Налаштувати режим лінійки" -#: src/slic3r/GUI/DoubleSlider.cpp:1396 +#: src/slic3r/GUI/DoubleSlider.cpp:1465 msgid "Edit current color - Right click the colored slider segment" msgstr "" "Редагувати поточний колір - Клацніть правою кнопкою миші на кольоровий " "сегмент повзунка" -#: src/slic3r/GUI/DoubleSlider.cpp:1398 +#: src/slic3r/GUI/DoubleSlider.cpp:1467 msgid "This is wipe tower layer" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1408 +#: src/slic3r/GUI/DoubleSlider.cpp:1477 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing sequentually." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1412 +#: src/slic3r/GUI/DoubleSlider.cpp:1481 msgid "Print mode" msgstr "Режим друку" -#: src/slic3r/GUI/DoubleSlider.cpp:1426 +#: src/slic3r/GUI/DoubleSlider.cpp:1495 msgid "Add extruder change - Left click" msgstr "Додати зміну екструдеру - ліва кнопка миші" -#: src/slic3r/GUI/DoubleSlider.cpp:1428 +#: src/slic3r/GUI/DoubleSlider.cpp:1497 msgid "" "Add color change - Left click for predefined color or Shift + Left click for " "custom color selection" @@ -1305,23 +1487,23 @@ msgstr "" "Додати зміну кольору - ліва кнопка миші для попередньо визначеного кольору " "або Shift + ліва кнопка миші для властного вибору кольору" -#: src/slic3r/GUI/DoubleSlider.cpp:1430 +#: src/slic3r/GUI/DoubleSlider.cpp:1499 msgid "Add color change - Left click" msgstr "Додати зміну кольору - ліва кнопка миші" -#: src/slic3r/GUI/DoubleSlider.cpp:1431 +#: src/slic3r/GUI/DoubleSlider.cpp:1500 msgid "or press \"+\" key" msgstr "або натисніть клавішу \"+\"" -#: src/slic3r/GUI/DoubleSlider.cpp:1433 +#: src/slic3r/GUI/DoubleSlider.cpp:1502 msgid "Add another code - Ctrl + Left click" msgstr "Додайте інший код - Ctrl + ліва кнопка миші" -#: src/slic3r/GUI/DoubleSlider.cpp:1434 +#: src/slic3r/GUI/DoubleSlider.cpp:1503 msgid "Add another code - Right click" msgstr "Додайте інший код - права кнопка миші" -#: src/slic3r/GUI/DoubleSlider.cpp:1440 +#: src/slic3r/GUI/DoubleSlider.cpp:1509 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing " @@ -1333,40 +1515,40 @@ msgstr "" "об'єктів.\n" "Цей код не буде оброблятися під час створення G-коду." -#: src/slic3r/GUI/DoubleSlider.cpp:1458 +#: src/slic3r/GUI/DoubleSlider.cpp:1527 msgid "continue" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1466 +#: src/slic3r/GUI/DoubleSlider.cpp:1535 #, boost-format msgid "Color change (\"%1%\")" msgstr "Зміну кольору (\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1467 +#: src/slic3r/GUI/DoubleSlider.cpp:1536 #, boost-format msgid "Color change (\"%1%\") for Extruder %2%" msgstr "Зміну кольору (\"%1%\") для екструдеру %2%" -#: src/slic3r/GUI/DoubleSlider.cpp:1469 +#: src/slic3r/GUI/DoubleSlider.cpp:1538 #, boost-format msgid "Pause print (\"%1%\")" msgstr "Пауза друку (\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1471 +#: src/slic3r/GUI/DoubleSlider.cpp:1540 #, boost-format msgid "Custom template (\"%1%\")" msgstr "Користувацький шаблон (\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1473 +#: src/slic3r/GUI/DoubleSlider.cpp:1542 #, boost-format msgid "Extruder (tool) is changed to Extruder \"%1%\"" msgstr "Екструдер (інструмент) змінено на Екструдер \"%1%\"" -#: src/slic3r/GUI/DoubleSlider.cpp:1480 +#: src/slic3r/GUI/DoubleSlider.cpp:1549 msgid "Note" msgstr "Примітка" -#: src/slic3r/GUI/DoubleSlider.cpp:1482 +#: src/slic3r/GUI/DoubleSlider.cpp:1551 msgid "" "G-code associated to this tick mark is in a conflict with print mode.\n" "Editing it will cause changes of Slider data." @@ -1374,7 +1556,7 @@ msgstr "" "G-код, пов'язаний з цим маркером, суперечить режиму друку.\n" "Редагування призведе до змін даних повзунка." -#: src/slic3r/GUI/DoubleSlider.cpp:1485 +#: src/slic3r/GUI/DoubleSlider.cpp:1554 msgid "" "There is a color change for extruder that won't be used till the end of " "print job.\n" @@ -1384,7 +1566,7 @@ msgstr "" "друку.\n" "Цей код не буде оброблятися під час створення G-коду." -#: src/slic3r/GUI/DoubleSlider.cpp:1488 +#: src/slic3r/GUI/DoubleSlider.cpp:1557 msgid "" "There is an extruder change set to the same extruder.\n" "This code won't be processed during G-code generation." @@ -1392,7 +1574,7 @@ msgstr "" "Існує зміна екструдера, встановлена на той самий екструдер.\n" "Цей код не буде оброблятися під час створення G-коду." -#: src/slic3r/GUI/DoubleSlider.cpp:1491 +#: src/slic3r/GUI/DoubleSlider.cpp:1560 msgid "" "There is a color change for extruder that has not been used before.\n" "Check your settings to avoid redundant color changes." @@ -1400,208 +1582,210 @@ msgstr "" "Змінюється колір екструдера, який раніше не застосовувався.\n" "Перевірте свої налаштування, щоб уникнути зайвих змін кольору." -#: src/slic3r/GUI/DoubleSlider.cpp:1496 +#: src/slic3r/GUI/DoubleSlider.cpp:1565 msgid "Delete tick mark - Left click or press \"-\" key" msgstr "" "Видалити маркер - клацніть лівою кнопкою миші або натисніть клавішу \"-\"" -#: src/slic3r/GUI/DoubleSlider.cpp:1498 +#: src/slic3r/GUI/DoubleSlider.cpp:1567 msgid "Edit tick mark - Ctrl + Left click" msgstr "Змінити маркер - Ctrl+Ліва кнопка миші" -#: src/slic3r/GUI/DoubleSlider.cpp:1499 +#: src/slic3r/GUI/DoubleSlider.cpp:1568 msgid "Edit tick mark - Right click" msgstr "Змінити маркер - Права кнопка миші" -#: src/slic3r/GUI/DoubleSlider.cpp:1602 src/slic3r/GUI/DoubleSlider.cpp:1633 -#: src/slic3r/GUI/GUI_Factories.cpp:778 +#: src/slic3r/GUI/DoubleSlider.cpp:1671 src/slic3r/GUI/DoubleSlider.cpp:1702 +#: src/slic3r/GUI/GUI_Factories.cpp:862 #, c-format, boost-format msgid "Extruder %d" msgstr "Екструдер %d" -#: src/slic3r/GUI/DoubleSlider.cpp:1603 src/slic3r/GUI/GUI_Factories.cpp:779 +#: src/slic3r/GUI/DoubleSlider.cpp:1672 src/slic3r/GUI/GUI_Factories.cpp:863 msgid "active" msgstr "активний" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 msgid "Switch code to Change extruder" msgstr "Переключити код на \"Змінити екструдер\"" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Change extruder" msgstr "Змінити екструдер" -#: src/slic3r/GUI/DoubleSlider.cpp:1613 +#: src/slic3r/GUI/DoubleSlider.cpp:1682 msgid "Change extruder (N/A)" msgstr "Змінити екструдер (Недоступний)" -#: src/slic3r/GUI/DoubleSlider.cpp:1615 src/slic3r/GUI/GUI_Factories.cpp:787 +#: src/slic3r/GUI/DoubleSlider.cpp:1684 src/slic3r/GUI/GUI_Factories.cpp:871 msgid "Use another extruder" msgstr "Використати інший екструдер" -#: src/slic3r/GUI/DoubleSlider.cpp:1634 +#: src/slic3r/GUI/DoubleSlider.cpp:1703 msgid "used" msgstr "використовується" -#: src/slic3r/GUI/DoubleSlider.cpp:1642 +#: src/slic3r/GUI/DoubleSlider.cpp:1711 #, boost-format msgid "Switch code to Color change (%1%) for:" msgstr "Переключити код на \"Змінити колір\" (%1%) для:" -#: src/slic3r/GUI/DoubleSlider.cpp:1643 +#: src/slic3r/GUI/DoubleSlider.cpp:1712 #, boost-format msgid "Add color change (%1%) for:" msgstr "Додати зміну кольору (%1%) для:" -#: src/slic3r/GUI/DoubleSlider.cpp:1968 +#: src/slic3r/GUI/DoubleSlider.cpp:2037 msgid "Add color change" msgstr "Додати зміну кольору" -#: src/slic3r/GUI/DoubleSlider.cpp:1979 +#: src/slic3r/GUI/DoubleSlider.cpp:2048 msgid "Add pause print" msgstr "Додати паузу друку" -#: src/slic3r/GUI/DoubleSlider.cpp:1983 +#: src/slic3r/GUI/DoubleSlider.cpp:2052 msgid "Add custom template" msgstr "Додати власний шаблон" -#: src/slic3r/GUI/DoubleSlider.cpp:1986 +#: src/slic3r/GUI/DoubleSlider.cpp:2055 msgid "Add custom G-code" msgstr "Додати власний G-код" -#: src/slic3r/GUI/DoubleSlider.cpp:2004 +#: src/slic3r/GUI/DoubleSlider.cpp:2073 msgid "Edit color" msgstr "Редагувати колір" -#: src/slic3r/GUI/DoubleSlider.cpp:2005 +#: src/slic3r/GUI/DoubleSlider.cpp:2074 msgid "Edit pause print message" msgstr "Редагувати повідомлення під час паузи друку" -#: src/slic3r/GUI/DoubleSlider.cpp:2006 +#: src/slic3r/GUI/DoubleSlider.cpp:2075 msgid "Edit custom G-code" msgstr "Редагувати власний G-код" -#: src/slic3r/GUI/DoubleSlider.cpp:2012 +#: src/slic3r/GUI/DoubleSlider.cpp:2081 msgid "Delete color change" msgstr "Видалити зміну кольору" -#: src/slic3r/GUI/DoubleSlider.cpp:2013 +#: src/slic3r/GUI/DoubleSlider.cpp:2082 msgid "Delete tool change" msgstr "Видалити зміну інструменту" -#: src/slic3r/GUI/DoubleSlider.cpp:2014 +#: src/slic3r/GUI/DoubleSlider.cpp:2083 msgid "Delete pause print" msgstr "Видалити паузу друку" -#: src/slic3r/GUI/DoubleSlider.cpp:2015 +#: src/slic3r/GUI/DoubleSlider.cpp:2084 msgid "Delete custom G-code" msgstr "Видалити власний G-код" -#: src/slic3r/GUI/DoubleSlider.cpp:2025 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:2094 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to height" msgstr "Перейти на висоту" -#: src/slic3r/GUI/DoubleSlider.cpp:2030 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 msgid "Hide ruler" msgstr "Сховати лінійку" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height" msgstr "Показувати висоту об’єкта" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height on the ruler" msgstr "Показувати висоту об’єкта на лінійці" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time" msgstr "Показувати приблизний час друку" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time on the ruler" msgstr "Показувати приблизний час друку на лінійці" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Ruler mode" msgstr "Режим лінійки" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Set ruler mode" msgstr "Встановити режим лінійки" -#: src/slic3r/GUI/DoubleSlider.cpp:2047 +#: src/slic3r/GUI/DoubleSlider.cpp:2116 msgid "Set extruder sequence for the entire print" msgstr "Встановити послідовність екструдерів для всього друку" -#: src/slic3r/GUI/DoubleSlider.cpp:2051 +#: src/slic3r/GUI/DoubleSlider.cpp:2120 msgid "Set auto color changes" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2086 +#: src/slic3r/GUI/DoubleSlider.cpp:2155 msgid "This action will cause deletion of all ticks on vertical slider." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2087 src/slic3r/GUI/Tab.cpp:1318 +#: src/slic3r/GUI/DoubleSlider.cpp:2156 src/slic3r/GUI/Tab.cpp:1263 msgid "" "This action is not revertible.\n" "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2088 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1133 src/slic3r/GUI/GUI.cpp:245 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:649 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:679 -#: src/slic3r/GUI/WipeTowerDialog.cpp:58 src/slic3r/GUI/WipeTowerDialog.cpp:443 +#: src/slic3r/GUI/DoubleSlider.cpp:2157 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:537 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1119 src/slic3r/GUI/GUI.cpp:258 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:721 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:751 +#: src/slic3r/GUI/WipeTowerDialog.cpp:60 src/slic3r/GUI/WipeTowerDialog.cpp:445 msgid "Warning" msgstr "Застереження" -#: src/slic3r/GUI/DoubleSlider.cpp:2216 +#: src/slic3r/GUI/DoubleSlider.cpp:2285 msgid "Enter custom G-code used on current layer" msgstr "Введіть власний G-код, для використання на поточному шарі" -#: src/slic3r/GUI/DoubleSlider.cpp:2217 +#: src/slic3r/GUI/DoubleSlider.cpp:2286 #, boost-format msgid "Custom G-code on current layer (%1% mm)." msgstr "Користувацький G-код на поточному шарі (%1% мм)." -#: src/slic3r/GUI/DoubleSlider.cpp:2238 +#: src/slic3r/GUI/DoubleSlider.cpp:2307 msgid "Enter short message shown on Printer display when a print is paused" msgstr "" "Введіть коротке повідомлення, що відображатиметься на дисплеї принтера піж " "час паузи друку" -#: src/slic3r/GUI/DoubleSlider.cpp:2239 +#: src/slic3r/GUI/DoubleSlider.cpp:2308 #, boost-format msgid "Message for pause print on current layer (%1% mm)." msgstr "Повідомлення для паузи друку на поточному шарі (%1% мм)." -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the move you want to jump to" msgstr "Введіть рух, до якого ви хочете перейти" -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the height you want to jump to" msgstr "Введіть висоту, на яку ви хочете перейти" -#: src/slic3r/GUI/DoubleSlider.cpp:2515 +#: src/slic3r/GUI/DoubleSlider.cpp:2584 msgid "The last color change data was saved for a single extruder printing." msgstr "" "Дані про останню зміну кольору були збережені для одно-екструдерного друку." -#: src/slic3r/GUI/DoubleSlider.cpp:2516 src/slic3r/GUI/DoubleSlider.cpp:2532 +#: src/slic3r/GUI/DoubleSlider.cpp:2585 src/slic3r/GUI/DoubleSlider.cpp:2601 msgid "The last color change data was saved for a multi extruder printing." msgstr "" "Дані про останню зміну кольору були збережені для багато-екструдерного друку." -#: src/slic3r/GUI/DoubleSlider.cpp:2518 +#: src/slic3r/GUI/DoubleSlider.cpp:2587 msgid "Your current changes will delete all saved color changes." msgstr "Ваші поточні зміни видалять усі збережені зміни кольору." -#: src/slic3r/GUI/DoubleSlider.cpp:2519 src/slic3r/GUI/DoubleSlider.cpp:2540 +#: src/slic3r/GUI/DoubleSlider.cpp:2588 src/slic3r/GUI/DoubleSlider.cpp:2609 msgid "Are you sure you want to continue?" msgstr "Ви впевнені, що хочете продовжити?" -#: src/slic3r/GUI/DoubleSlider.cpp:2533 +#: src/slic3r/GUI/DoubleSlider.cpp:2602 msgid "" "Select YES if you want to delete all saved tool changes, \n" "NO if you want all tool changes switch to color changes, \n" @@ -1612,11 +1796,11 @@ msgstr "" "кольору,\n" "або СКАСУВАТИ, щоб залишити це без змін." -#: src/slic3r/GUI/DoubleSlider.cpp:2536 +#: src/slic3r/GUI/DoubleSlider.cpp:2605 msgid "Do you want to delete all saved tool changes?" msgstr "Ви хочете видалити всі збережені зміни інструменту?" -#: src/slic3r/GUI/DoubleSlider.cpp:2538 +#: src/slic3r/GUI/DoubleSlider.cpp:2607 msgid "" "The last color change data was saved for a multi extruder printing with tool " "changes for whole print." @@ -1624,19 +1808,33 @@ msgstr "" "Дані про останню зміну кольору були збережені для багато-екструдерного друку " "зі зміною інструменту для цілого друку." -#: src/slic3r/GUI/DoubleSlider.cpp:2539 +#: src/slic3r/GUI/DoubleSlider.cpp:2608 msgid "Your current changes will delete all saved extruder (tool) changes." msgstr "" "Ваші поточні зміни видалять усі збережені зміни екструдера (інструменту)." -#: src/slic3r/GUI/ExtraRenderers.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:538 -#: src/slic3r/GUI/GUI_ObjectList.cpp:550 src/slic3r/GUI/GUI_ObjectList.cpp:979 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4291 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:250 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:352 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:376 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:607 src/libslic3r/PrintConfig.cpp:800 +#: src/slic3r/GUI/Downloader.cpp:150 +#, boost-format +msgid "" +"Download won't start. Download URL doesn't point to https://files.printables." +"com : %1%" +msgstr "" + +#: src/slic3r/GUI/Downloader.cpp:181 +msgid "The download has failed:" +msgstr "" + +#: src/slic3r/GUI/DownloaderFileGet.cpp:193 +#, boost-format +msgid "Can't create file at %1%." +msgstr "" + +#: src/slic3r/GUI/ExtraRenderers.cpp:323 src/slic3r/GUI/GUI_ObjectList.cpp:571 +#: src/slic3r/GUI/GUI_ObjectList.cpp:583 src/slic3r/GUI/GUI_ObjectList.cpp:1043 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2125 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3013 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4884 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:259 src/libslic3r/PrintConfig.cpp:894 msgid "default" msgstr "за замовчанням" @@ -1649,10 +1847,10 @@ msgid "Set extruder change for every" msgstr "Встановіть зміну екструдера для кожних" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:60 -#: src/libslic3r/PrintConfig.cpp:662 src/libslic3r/PrintConfig.cpp:1430 -#: src/libslic3r/PrintConfig.cpp:2135 src/libslic3r/PrintConfig.cpp:2310 -#: src/libslic3r/PrintConfig.cpp:2386 src/libslic3r/PrintConfig.cpp:2639 -#: src/libslic3r/PrintConfig.cpp:2687 src/libslic3r/PrintConfig.cpp:2706 +#: src/libslic3r/PrintConfig.cpp:765 src/libslic3r/PrintConfig.cpp:1476 +#: src/libslic3r/PrintConfig.cpp:2165 src/libslic3r/PrintConfig.cpp:2343 +#: src/libslic3r/PrintConfig.cpp:2417 src/libslic3r/PrintConfig.cpp:2665 +#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2728 msgid "layers" msgstr "шару(ів)" @@ -1684,26 +1882,26 @@ msgstr "Видалити екструдер з послідовності" msgid "Add extruder to sequence" msgstr "Додати екструдер до послідовності" -#: src/slic3r/GUI/Field.cpp:190 +#: src/slic3r/GUI/Field.cpp:188 msgid "default value" msgstr "значення за замовчанням" -#: src/slic3r/GUI/Field.cpp:193 +#: src/slic3r/GUI/Field.cpp:191 msgid "parameter name" msgstr "назва параметра" -#: src/slic3r/GUI/Field.cpp:204 src/slic3r/GUI/OptionsGroup.cpp:827 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1067 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1079 +#: src/slic3r/GUI/Field.cpp:206 src/slic3r/GUI/OptionsGroup.cpp:852 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1074 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1086 msgid "N/A" msgstr "Н/Д" -#: src/slic3r/GUI/Field.cpp:226 src/slic3r/GUI/Field.cpp:298 +#: src/slic3r/GUI/Field.cpp:229 src/slic3r/GUI/Field.cpp:302 #, c-format, boost-format msgid "%s doesn't support percentage" msgstr "%s не підтримує відсотки" -#: src/slic3r/GUI/Field.cpp:266 +#: src/slic3r/GUI/Field.cpp:269 #, c-format, boost-format msgid "" "Input value is out of range\n" @@ -1712,16 +1910,16 @@ msgstr "" "Вхідне значення виходить за межі діапазону\n" "Ви впевнені, що %s є правильним значенням і хочете продовжити?" -#: src/slic3r/GUI/Field.cpp:269 src/slic3r/GUI/Field.cpp:343 +#: src/slic3r/GUI/Field.cpp:272 src/slic3r/GUI/Field.cpp:347 msgid "Parameter validation" msgstr "Перевірка параметрів" -#: src/slic3r/GUI/Field.cpp:282 src/slic3r/GUI/Field.cpp:390 -#: src/slic3r/GUI/Field.cpp:1573 +#: src/slic3r/GUI/Field.cpp:285 src/slic3r/GUI/Field.cpp:394 +#: src/slic3r/GUI/Field.cpp:1597 msgid "Input value is out of range" msgstr "Вхідне значення виходить за межі діапазону" -#: src/slic3r/GUI/Field.cpp:340 +#: src/slic3r/GUI/Field.cpp:344 #, c-format, boost-format msgid "" "Do you mean %s%% instead of %s %s?\n" @@ -1732,7 +1930,7 @@ msgstr "" "Виберіть ТАК, якщо ви хочете змінити це значення на %s%%,\n" "або НІ, якщо ви впевнені, що %s %s є правильним значенням." -#: src/slic3r/GUI/Field.cpp:397 +#: src/slic3r/GUI/Field.cpp:401 #, boost-format msgid "" "Invalid input format. Expected vector of dimensions in the following format: " @@ -1741,6 +1939,15 @@ msgstr "" "Недійсний формат введення. Очікується вектор розмірів у наступному форматі: " "\"%1%\"" +#: src/slic3r/GUI/FileArchiveDialog.cpp:170 +msgid "Archive preview" +msgstr "" + +#: src/slic3r/GUI/FileArchiveDialog.cpp:270 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +msgid "Open" +msgstr "" + #: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flash!" msgstr "Прошити!" @@ -1827,12 +2034,6 @@ msgstr "Імідж прошивки:" msgid "Select a file" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:815 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:297 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:372 -msgid "Browse" -msgstr "Переглянути" - #: src/slic3r/GUI/FirmwareDialog.cpp:817 msgid "Serial port:" msgstr "Послідовний порт:" @@ -1862,10 +2063,10 @@ msgid "Advanced: Output log" msgstr "Розширений: журнал виводу" #: src/slic3r/GUI/FirmwareDialog.cpp:862 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:310 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:358 #: src/slic3r/GUI/Mouse3DController.cpp:543 -#: src/slic3r/GUI/PrintHostDialogs.cpp:261 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:122 +#: src/slic3r/GUI/PrintHostDialogs.cpp:313 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:125 msgid "Close" msgstr "Закрити" @@ -1885,7 +2086,7 @@ msgstr "Підтвердження" msgid "Cancelling..." msgstr "Скасування..." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1488 msgid "Shape Gallery" msgstr "" @@ -1893,435 +2094,441 @@ msgstr "" msgid "Select shape from the gallery" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:100 -msgid "Add to bed" -msgstr "" - -#: src/slic3r/GUI/GalleryDialog.cpp:101 -msgid "Add selected shape(s) to the bed" -msgstr "" - -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4152 +#: src/slic3r/GUI/GalleryDialog.cpp:114 src/slic3r/GUI/Tab.cpp:4377 msgid "Add" msgstr "Додати" -#: src/slic3r/GUI/GalleryDialog.cpp:117 +#: src/slic3r/GUI/GalleryDialog.cpp:114 msgid "Add one or more custom shapes" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:506 -#: src/slic3r/GUI/GLCanvas3D.cpp:4547 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/GalleryDialog.cpp:115 src/slic3r/GUI/GalleryDialog.cpp:528 +#: src/slic3r/GUI/GLCanvas3D.cpp:4638 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/GUI_Factories.cpp:460 src/slic3r/GUI/Tab.cpp:3973 msgid "Delete" msgstr "Видалити" -#: src/slic3r/GUI/GalleryDialog.cpp:118 +#: src/slic3r/GUI/GalleryDialog.cpp:115 msgid "Delete one or more custom shape. You can't delete system shapes" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:400 +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "Add to bed" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "OK" +msgstr "Гаразд" + +#: src/slic3r/GUI/GalleryDialog.cpp:143 +msgid "Add selected shape(s) to the bed" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:422 msgid "Choose one or more files (STL, OBJ):" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:440 +#: src/slic3r/GUI/GalleryDialog.cpp:462 #, boost-format msgid "" "It looks like selected %1%-file has an error or is destructed.\n" "We can't load this file" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:451 +#: src/slic3r/GUI/GalleryDialog.cpp:473 msgid "Choose one PNG file:" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:464 +#: src/slic3r/GUI/GalleryDialog.cpp:486 msgid "Replacing of the PNG" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:508 +#: src/slic3r/GUI/GalleryDialog.cpp:530 msgid "Change thumbnail" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:549 src/slic3r/GUI/GalleryDialog.cpp:554 +#: src/slic3r/GUI/GalleryDialog.cpp:571 src/slic3r/GUI/GalleryDialog.cpp:576 #, boost-format msgid "Loading of the \"%1%\"" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:274 +#: src/slic3r/GUI/GCodeViewer.cpp:343 msgid "Tool position" msgstr "Позиція інструменту" -#: src/slic3r/GUI/GCodeViewer.cpp:1457 +#: src/slic3r/GUI/GCodeViewer.cpp:1547 msgid "Generating toolpaths" msgstr "Створення траєкторій" -#: src/slic3r/GUI/GCodeViewer.cpp:1517 +#: src/slic3r/GUI/GCodeViewer.cpp:1619 msgid "Generating vertex buffer" msgstr "Створення буфера вершин" -#: src/slic3r/GUI/GCodeViewer.cpp:1857 +#: src/slic3r/GUI/GCodeViewer.cpp:1979 msgid "Generating index buffers" msgstr "Формування буферів індексів" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to hide" msgstr "Клацніть, щоб сховати" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to show" msgstr "Клацніть, щоб показати" -#: src/slic3r/GUI/GCodeViewer.cpp:3181 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 msgid "up to" msgstr "аж до" -#: src/slic3r/GUI/GCodeViewer.cpp:3187 +#: src/slic3r/GUI/GCodeViewer.cpp:3455 msgid "above" msgstr "вище" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "from" msgstr "від" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "to" msgstr "до" -#: src/slic3r/GUI/GCodeViewer.cpp:3245 src/slic3r/GUI/GCodeViewer.cpp:3246 -#: src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3513 src/slic3r/GUI/GCodeViewer.cpp:3514 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 msgid "Percentage" msgstr "Процент" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3570 msgid "Feature type" msgstr "Тип ознаки" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3592 #: src/slic3r/GUI/RammingChart.cpp:90 msgid "Time" msgstr "Час" -#: src/slic3r/GUI/GCodeViewer.cpp:3295 src/slic3r/GUI/GCodeViewer.cpp:3306 -#: src/slic3r/GUI/GCodeViewer.cpp:3566 -msgid "Used filament" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3298 +#: src/slic3r/GUI/GCodeViewer.cpp:3571 msgid "Height (mm)" msgstr "Висота (мм)" -#: src/slic3r/GUI/GCodeViewer.cpp:3299 +#: src/slic3r/GUI/GCodeViewer.cpp:3572 msgid "Width (mm)" msgstr "Ширина (мм)" -#: src/slic3r/GUI/GCodeViewer.cpp:3300 +#: src/slic3r/GUI/GCodeViewer.cpp:3573 msgid "Speed (mm/s)" msgstr "Швидкість (мм/с)" -#: src/slic3r/GUI/GCodeViewer.cpp:3301 -msgid "Fan Speed (%)" -msgstr "Швидкість вентилятора (%)" +#: src/slic3r/GUI/GCodeViewer.cpp:3574 +msgid "Fan speed (%)" +msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3302 +#: src/slic3r/GUI/GCodeViewer.cpp:3575 msgid "Temperature (°C)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3303 +#: src/slic3r/GUI/GCodeViewer.cpp:3576 msgid "Volumetric flow rate (mm³/s)" msgstr "Об'ємна швидкість потоку (мм³/с)" -#: src/slic3r/GUI/GCodeViewer.cpp:3306 src/slic3r/GUI/GUI_Preview.cpp:224 -#: src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3577 +msgid "Layer time (linear)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3578 +msgid "Layer time (logarithmic)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3579 msgid "Tool" msgstr "Інструмент" -#: src/slic3r/GUI/GCodeViewer.cpp:3309 src/slic3r/GUI/GUI_Preview.cpp:225 -#: src/slic3r/GUI/GUI_Preview.cpp:957 +#: src/slic3r/GUI/GCodeViewer.cpp:3580 msgid "Color Print" msgstr "Кольоровий друк" -#: src/slic3r/GUI/GCodeViewer.cpp:3347 src/slic3r/GUI/GCodeViewer.cpp:3393 -#: src/slic3r/GUI/GCodeViewer.cpp:3398 src/slic3r/GUI/GUI_ObjectList.cpp:312 -#: src/slic3r/GUI/wxExtensions.cpp:536 src/libslic3r/PrintConfig.cpp:795 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 src/slic3r/GUI/GCodeViewer.cpp:3594 +#: src/slic3r/GUI/GCodeViewer.cpp:3860 +msgid "Used filament" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3623 src/slic3r/GUI/GCodeViewer.cpp:4067 +#: src/libslic3r/PrintConfig.cpp:3025 +msgid "Travel" +msgstr "Пересування" + +#: src/slic3r/GUI/GCodeViewer.cpp:3640 src/slic3r/GUI/GCodeViewer.cpp:3685 +#: src/slic3r/GUI/GCodeViewer.cpp:3689 src/slic3r/GUI/GUI_ObjectList.cpp:338 +#: src/slic3r/GUI/wxExtensions.cpp:547 src/libslic3r/PrintConfig.cpp:888 msgid "Extruder" msgstr "Екструдер" -#: src/slic3r/GUI/GCodeViewer.cpp:3370 +#: src/slic3r/GUI/GCodeViewer.cpp:3662 msgid "Default color" msgstr "Колір за замовчуванням" -#: src/slic3r/GUI/GCodeViewer.cpp:3393 +#: src/slic3r/GUI/GCodeViewer.cpp:3685 msgid "default color" msgstr "колір за замовчуванням" -#: src/slic3r/GUI/GCodeViewer.cpp:3491 src/slic3r/GUI/GCodeViewer.cpp:3547 +#: src/slic3r/GUI/GCodeViewer.cpp:3785 src/slic3r/GUI/GCodeViewer.cpp:3841 msgid "Color change" msgstr "Зміна кольору" -#: src/slic3r/GUI/GCodeViewer.cpp:3510 src/slic3r/GUI/GCodeViewer.cpp:3545 +#: src/slic3r/GUI/GCodeViewer.cpp:3804 src/slic3r/GUI/GCodeViewer.cpp:3839 msgid "Print" msgstr "Друк" -#: src/slic3r/GUI/GCodeViewer.cpp:3546 src/slic3r/GUI/GCodeViewer.cpp:3580 +#: src/slic3r/GUI/GCodeViewer.cpp:3840 src/slic3r/GUI/GCodeViewer.cpp:3874 msgid "Pause" msgstr "Пауза" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Event" msgstr "Подія" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Remaining time" msgstr "Час, що залишився" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Duration" msgstr "Тривалість" -#: src/slic3r/GUI/GCodeViewer.cpp:3609 src/slic3r/GUI/GUI_Preview.cpp:1049 -#: src/libslic3r/PrintConfig.cpp:2937 -msgid "Travel" -msgstr "Пересування" - -#: src/slic3r/GUI/GCodeViewer.cpp:3612 -msgid "Movement" -msgstr "Переміщення" - -#: src/slic3r/GUI/GCodeViewer.cpp:3613 -msgid "Extrusion" -msgstr "Екструзія" - -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1870 -#: src/slic3r/GUI/Tab.cpp:2812 -msgid "Retraction" -msgstr "Переривання" - -#: src/slic3r/GUI/GCodeViewer.cpp:3631 src/slic3r/GUI/GCodeViewer.cpp:3634 -#: src/slic3r/GUI/GUI_Preview.cpp:1050 -msgid "Wipe" -msgstr "Витирання" - -#: src/slic3r/GUI/GCodeViewer.cpp:3666 src/slic3r/GUI/GUI_Preview.cpp:257 -#: src/slic3r/GUI/GUI_Preview.cpp:272 -msgid "Options" -msgstr "Параметри" - -#: src/slic3r/GUI/GCodeViewer.cpp:3669 src/slic3r/GUI/GUI_Preview.cpp:1051 -msgid "Retractions" -msgstr "Переривання" - -#: src/slic3r/GUI/GCodeViewer.cpp:3670 src/slic3r/GUI/GUI_Preview.cpp:1052 -msgid "Deretractions" -msgstr "Зниження" - -#: src/slic3r/GUI/GCodeViewer.cpp:3671 src/slic3r/GUI/GUI_Preview.cpp:1053 -msgid "Seams" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3672 src/slic3r/GUI/GUI_Preview.cpp:1054 -msgid "Tool changes" -msgstr "Зміна інструменту" - -#: src/slic3r/GUI/GCodeViewer.cpp:3673 src/slic3r/GUI/GUI_Preview.cpp:1055 -msgid "Color changes" -msgstr "Зміни кольору" - -#: src/slic3r/GUI/GCodeViewer.cpp:3674 src/slic3r/GUI/GUI_Preview.cpp:1056 -msgid "Print pauses" -msgstr "Паузи друку" - -#: src/slic3r/GUI/GCodeViewer.cpp:3675 src/slic3r/GUI/GUI_Preview.cpp:1057 -msgid "Custom G-codes" -msgstr "Користувацькі G-коди" - -#: src/slic3r/GUI/GCodeViewer.cpp:3695 src/slic3r/GUI/GCodeViewer.cpp:3714 -#: src/slic3r/GUI/GUI.cpp:341 src/slic3r/GUI/Plater.cpp:822 -#: src/libslic3r/PrintConfig.cpp:322 +#: src/slic3r/GUI/GCodeViewer.cpp:3928 src/slic3r/GUI/GUI.cpp:332 +#: src/slic3r/GUI/Plater.cpp:852 src/libslic3r/PrintConfig.cpp:335 msgid "Printer" msgstr "Принтер" -#: src/slic3r/GUI/GCodeViewer.cpp:3697 src/slic3r/GUI/GCodeViewer.cpp:3719 -#: src/slic3r/GUI/GUI.cpp:337 src/slic3r/GUI/Plater.cpp:818 +#: src/slic3r/GUI/GCodeViewer.cpp:3931 src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/Plater.cpp:848 msgid "Print settings" msgstr "Параметри друку" -#: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 -#: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1970 src/slic3r/GUI/Tab.cpp:1971 +#: src/slic3r/GUI/GCodeViewer.cpp:3936 src/slic3r/GUI/GUI.cpp:330 +#: src/slic3r/GUI/Plater.cpp:849 src/slic3r/GUI/Tab.cpp:1930 +#: src/slic3r/GUI/Tab.cpp:1931 msgid "Filament" msgstr "Філамент" -#: src/slic3r/GUI/GCodeViewer.cpp:3739 +#: src/slic3r/GUI/GCodeViewer.cpp:3950 msgid "Estimated printing times" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3758 +#: src/slic3r/GUI/GCodeViewer.cpp:3969 msgid "Normal mode" msgstr "Нормальний режим" -#: src/slic3r/GUI/GCodeViewer.cpp:3759 +#: src/slic3r/GUI/GCodeViewer.cpp:3970 msgid "Stealth mode" msgstr "Тихий режим" -#: src/slic3r/GUI/GCodeViewer.cpp:3766 src/libslic3r/PrintConfig.cpp:1189 -#: src/libslic3r/PrintConfig.cpp:1207 src/libslic3r/PrintConfig.cpp:1217 -#: src/libslic3r/PrintConfig.cpp:1262 +#: src/slic3r/GUI/GCodeViewer.cpp:3979 src/libslic3r/PrintConfig.cpp:1249 +#: src/libslic3r/PrintConfig.cpp:1267 src/libslic3r/PrintConfig.cpp:1277 +#: src/libslic3r/PrintConfig.cpp:1322 msgid "First layer" msgstr "Перший шар" -#: src/slic3r/GUI/GCodeViewer.cpp:3767 +#: src/slic3r/GUI/GCodeViewer.cpp:3983 msgid "Total" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3796 +#: src/slic3r/GUI/GCodeViewer.cpp:4002 msgid "Show stealth mode" msgstr "Показати тихий режим" -#: src/slic3r/GUI/GCodeViewer.cpp:3800 +#: src/slic3r/GUI/GCodeViewer.cpp:4006 msgid "Show normal mode" msgstr "Показати нормальний режим" -#: src/slic3r/GUI/GLCanvas3D.cpp:225 src/slic3r/GUI/GLCanvas3D.cpp:4694 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:53 -msgid "Variable layer height" -msgstr "Змінна висота шарів" - -#: src/slic3r/GUI/GLCanvas3D.cpp:227 -msgid "Left mouse button:" -msgstr "Ліва кнопка миші:" +#: src/slic3r/GUI/GCodeViewer.cpp:4071 +msgid "Wipe" +msgstr "Витирання" -#: src/slic3r/GUI/GLCanvas3D.cpp:229 -msgid "Add detail" -msgstr "Додати деталь" +#: src/slic3r/GUI/GCodeViewer.cpp:4075 +msgid "Retractions" +msgstr "Переривання" -#: src/slic3r/GUI/GLCanvas3D.cpp:231 -msgid "Right mouse button:" -msgstr "Права кнопка миші:" +#: src/slic3r/GUI/GCodeViewer.cpp:4079 +msgid "Deretractions" +msgstr "Зниження" -#: src/slic3r/GUI/GLCanvas3D.cpp:233 -msgid "Remove detail" -msgstr "Видалити деталь" +#: src/slic3r/GUI/GCodeViewer.cpp:4083 +msgid "Seams" +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:235 +#: src/slic3r/GUI/GCodeViewer.cpp:4087 +msgid "Tool changes" +msgstr "Зміна інструменту" + +#: src/slic3r/GUI/GCodeViewer.cpp:4091 +msgid "Color changes" +msgstr "Зміни кольору" + +#: src/slic3r/GUI/GCodeViewer.cpp:4095 +msgid "Print pauses" +msgstr "Паузи друку" + +#: src/slic3r/GUI/GCodeViewer.cpp:4099 +msgid "Custom G-codes" +msgstr "Користувацькі G-коди" + +#: src/slic3r/GUI/GCodeViewer.cpp:4103 +msgid "Center of gravity" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:4108 +msgid "Shells" +msgstr "Оболонки" + +#: src/slic3r/GUI/GCodeViewer.cpp:4113 +msgid "Tool marker" +msgstr "Маркер інструменту" + +#: src/slic3r/GUI/GLCanvas3D.cpp:185 src/slic3r/GUI/GLCanvas3D.cpp:4784 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:71 +msgid "Variable layer height" +msgstr "Змінна висота шарів" + +#: src/slic3r/GUI/GLCanvas3D.cpp:187 +msgid "Left mouse button:" +msgstr "Ліва кнопка миші:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:189 +msgid "Add detail" +msgstr "Додати деталь" + +#: src/slic3r/GUI/GLCanvas3D.cpp:191 +msgid "Right mouse button:" +msgstr "Права кнопка миші:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:193 +msgid "Remove detail" +msgstr "Видалити деталь" + +#: src/slic3r/GUI/GLCanvas3D.cpp:195 msgid "Shift + Left mouse button:" msgstr "Shift + Ліва кнопка миші:" -#: src/slic3r/GUI/GLCanvas3D.cpp:237 +#: src/slic3r/GUI/GLCanvas3D.cpp:197 msgid "Reset to base" msgstr "Скинути до базової висоти шару" -#: src/slic3r/GUI/GLCanvas3D.cpp:239 +#: src/slic3r/GUI/GLCanvas3D.cpp:199 msgid "Shift + Right mouse button:" msgstr "Shift + Права кнопка миші:" -#: src/slic3r/GUI/GLCanvas3D.cpp:241 +#: src/slic3r/GUI/GLCanvas3D.cpp:201 msgid "Smoothing" msgstr "Згладжування" -#: src/slic3r/GUI/GLCanvas3D.cpp:243 +#: src/slic3r/GUI/GLCanvas3D.cpp:203 msgid "Mouse wheel:" msgstr "Колесо миші:" -#: src/slic3r/GUI/GLCanvas3D.cpp:245 +#: src/slic3r/GUI/GLCanvas3D.cpp:205 msgid "Increase/decrease edit area" msgstr "Збільшити/зменшити області редагування" -#: src/slic3r/GUI/GLCanvas3D.cpp:248 +#: src/slic3r/GUI/GLCanvas3D.cpp:208 msgid "Adaptive" msgstr "Адаптивний" -#: src/slic3r/GUI/GLCanvas3D.cpp:254 +#: src/slic3r/GUI/GLCanvas3D.cpp:214 msgid "Quality / Speed" msgstr "Якість / Швидкість" -#: src/slic3r/GUI/GLCanvas3D.cpp:257 +#: src/slic3r/GUI/GLCanvas3D.cpp:217 msgid "Higher print quality versus higher print speed." msgstr "Вища якість друку порівняно з вищою швидкістю друку." -#: src/slic3r/GUI/GLCanvas3D.cpp:268 +#: src/slic3r/GUI/GLCanvas3D.cpp:228 msgid "Smooth" msgstr "Згладити" -#: src/slic3r/GUI/GLCanvas3D.cpp:274 src/libslic3r/PrintConfig.cpp:819 +#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/libslic3r/PrintConfig.cpp:908 msgid "Radius" msgstr "Радіус" -#: src/slic3r/GUI/GLCanvas3D.cpp:286 +#: src/slic3r/GUI/GLCanvas3D.cpp:246 msgid "Keep min" msgstr "Залишити мін" -#: src/slic3r/GUI/GLCanvas3D.cpp:295 src/slic3r/GUI/GLCanvas3D.cpp:4123 +#: src/slic3r/GUI/GLCanvas3D.cpp:255 src/slic3r/GUI/GLCanvas3D.cpp:4217 msgid "Reset" msgstr "Скинути" -#: src/slic3r/GUI/GLCanvas3D.cpp:561 +#: src/slic3r/GUI/GLCanvas3D.cpp:602 msgid "Variable layer height - Manual edit" msgstr "Змінна висота шарів - Ручне редагування" -#: src/slic3r/GUI/GLCanvas3D.cpp:676 +#: src/slic3r/GUI/GLCanvas3D.cpp:717 msgid "Seq." msgstr "Послід." -#: src/slic3r/GUI/GLCanvas3D.cpp:1310 +#: src/slic3r/GUI/GLCanvas3D.cpp:1319 msgid "Variable layer height - Reset" msgstr "Змінна висота шарів - Скасувати" -#: src/slic3r/GUI/GLCanvas3D.cpp:1318 +#: src/slic3r/GUI/GLCanvas3D.cpp:1327 msgid "Variable layer height - Adaptive" msgstr "Змінна висота шарів - Адаптивний" -#: src/slic3r/GUI/GLCanvas3D.cpp:1326 +#: src/slic3r/GUI/GLCanvas3D.cpp:1335 msgid "Variable layer height - Smooth all" msgstr "Змінна висота шарів - Згладити все" -#: src/slic3r/GUI/GLCanvas3D.cpp:1733 +#: src/slic3r/GUI/GLCanvas3D.cpp:1778 msgid "Mirror Object" msgstr "Віддзеркалити об'єкт" -#: src/slic3r/GUI/GLCanvas3D.cpp:2612 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:560 +#: src/slic3r/GUI/GLCanvas3D.cpp:2542 src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:117 msgid "Gizmo-Move" msgstr "Gizmo переміщення" -#: src/slic3r/GUI/GLCanvas3D.cpp:2695 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562 +#: src/slic3r/GUI/GLCanvas3D.cpp:2638 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:661 msgid "Gizmo-Rotate" msgstr "Gizmo обертання" -#: src/slic3r/GUI/GLCanvas3D.cpp:3300 +#: src/slic3r/GUI/GLCanvas3D.cpp:3263 msgid "Move Object" msgstr "Перемістити об'єкт" -#: src/slic3r/GUI/GLCanvas3D.cpp:3821 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3513 +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:40 +msgid "Gizmo-Place on Face" +msgstr "Gizmo \"Поверхнею на стіл\"" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3904 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Switch to Settings" msgstr "Перейдіть до налаштувань" -#: src/slic3r/GUI/GLCanvas3D.cpp:3822 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3905 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Print Settings Tab" msgstr "Вкладка параметрів друку" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Filament Settings Tab" msgstr "Вкладка параметрів філаменту" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Material Settings Tab" msgstr "Вкладка параметрів матеріалу" -#: src/slic3r/GUI/GLCanvas3D.cpp:3824 src/slic3r/GUI/GLCanvas3D.cpp:4657 +#: src/slic3r/GUI/GLCanvas3D.cpp:3907 src/slic3r/GUI/GLCanvas3D.cpp:4746 msgid "Printer Settings Tab" msgstr "Вкладка параметрів принтеру" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Undo History" msgstr "Скасувати історію" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Redo History" msgstr "Повторити історію" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" @@ -2329,7 +2536,7 @@ msgstr[0] "Скасувати %1$d дію" msgstr[1] "Скасувати %1$d дії" msgstr[2] "Скасувати %1$d дій" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" @@ -2337,144 +2544,120 @@ msgstr[0] "Повторити %1$d дію" msgstr[1] "Повторити %1$d дії" msgstr[2] "Повторити %1$d дій" -#: src/slic3r/GUI/GLCanvas3D.cpp:4011 src/slic3r/GUI/GLCanvas3D.cpp:4673 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 src/slic3r/GUI/Search.cpp:426 +#: src/slic3r/GUI/GLCanvas3D.cpp:4106 src/slic3r/GUI/GLCanvas3D.cpp:4762 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/Search.cpp:482 msgid "Search" msgstr "Пошук" -#: src/slic3r/GUI/GLCanvas3D.cpp:4025 src/slic3r/GUI/GLCanvas3D.cpp:4033 -#: src/slic3r/GUI/Search.cpp:432 +#: src/slic3r/GUI/GLCanvas3D.cpp:4120 src/slic3r/GUI/GLCanvas3D.cpp:4128 +#: src/slic3r/GUI/Search.cpp:488 msgid "Enter a search term" msgstr "Введіть пошуковий термін" -#: src/slic3r/GUI/GLCanvas3D.cpp:4064 +#: src/slic3r/GUI/GLCanvas3D.cpp:4160 msgid "Arrange options" msgstr "Параметри розташування" -#: src/slic3r/GUI/GLCanvas3D.cpp:4097 +#: src/slic3r/GUI/GLCanvas3D.cpp:4193 #, boost-format msgid "Press %1%left mouse button to enter the exact value" msgstr "Натисніть %1%ліву кнопку миші, щоб ввести точне значення" -#: src/slic3r/GUI/GLCanvas3D.cpp:4099 +#: src/slic3r/GUI/GLCanvas3D.cpp:4195 msgid "Spacing" msgstr "Відстань" -#: src/slic3r/GUI/GLCanvas3D.cpp:4106 -msgid "Enable rotations (slow)" -msgstr "Увімкнути обертання (повільно)" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Alignment" -msgstr "Вирівнювання" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:4500 -msgid "Center" -msgstr "Центр" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear left" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front left" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front right" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear right" +#: src/slic3r/GUI/GLCanvas3D.cpp:4202 +msgid "Spacing from bed" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:2271 -msgid "Random" -msgstr "Випадкова" +#: src/slic3r/GUI/GLCanvas3D.cpp:4209 +msgid "Enable rotations (slow)" +msgstr "Увімкнути обертання (повільно)" -#: src/slic3r/GUI/GLCanvas3D.cpp:4133 src/slic3r/GUI/GLCanvas3D.cpp:4565 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Plater.cpp:1664 +#: src/slic3r/GUI/GLCanvas3D.cpp:4228 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 src/slic3r/GUI/Plater.cpp:7118 msgid "Arrange" msgstr "Розташувати" -#: src/slic3r/GUI/GLCanvas3D.cpp:4539 +#: src/slic3r/GUI/GLCanvas3D.cpp:4630 msgid "Add..." msgstr "Додати..." -#: src/slic3r/GUI/GLCanvas3D.cpp:4556 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5509 src/slic3r/GUI/Tab.cpp:4158 +#: src/slic3r/GUI/GLCanvas3D.cpp:4647 src/slic3r/GUI/KBShortcutsDialog.cpp:105 +#: src/slic3r/GUI/Plater.cpp:6047 src/slic3r/GUI/Tab.cpp:4383 msgid "Delete all" msgstr "Видалити все" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 src/slic3r/GUI/KBShortcutsDialog.cpp:133 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 src/slic3r/GUI/KBShortcutsDialog.cpp:142 msgid "Arrange selection" msgstr "Розташувати вибране" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 msgid "Click right mouse button to show arrangement options" msgstr "Клацніть правою кнопкою миші, щоб показати параметри розташування" -#: src/slic3r/GUI/GLCanvas3D.cpp:4587 +#: src/slic3r/GUI/GLCanvas3D.cpp:4676 msgid "Copy" msgstr "Копіювати" -#: src/slic3r/GUI/GLCanvas3D.cpp:4596 +#: src/slic3r/GUI/GLCanvas3D.cpp:4685 msgid "Paste" msgstr "Вставити" -#: src/slic3r/GUI/GLCanvas3D.cpp:4608 src/slic3r/GUI/GUI_Factories.cpp:1084 -#: src/slic3r/GUI/GUI_Factories.cpp:1108 src/slic3r/GUI/GUI_Factories.cpp:1119 +#: src/slic3r/GUI/GLCanvas3D.cpp:4697 src/slic3r/GUI/GUI_Factories.cpp:1237 +#: src/slic3r/GUI/GUI_Factories.cpp:1261 src/slic3r/GUI/GUI_Factories.cpp:1272 msgid "Add instance" msgstr "Додати екземпляр" -#: src/slic3r/GUI/GLCanvas3D.cpp:4619 src/slic3r/GUI/GUI_Factories.cpp:1087 +#: src/slic3r/GUI/GLCanvas3D.cpp:4708 src/slic3r/GUI/GUI_Factories.cpp:1240 msgid "Remove instance" msgstr "Видалити екземпляр" -#: src/slic3r/GUI/GLCanvas3D.cpp:4632 +#: src/slic3r/GUI/GLCanvas3D.cpp:4721 msgid "Split to objects" msgstr "Розділити на об'єкти" -#: src/slic3r/GUI/GLCanvas3D.cpp:4642 +#: src/slic3r/GUI/GLCanvas3D.cpp:4731 msgid "Split to parts" msgstr "Розділити на частини" -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/GLCanvas3D.cpp:4795 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/GLCanvas3D.cpp:4874 msgid "Click right mouse button to open/close History" msgstr "Клацніть правою кнопкою миші, щоб відкрити/закрити історію" -#: src/slic3r/GUI/GLCanvas3D.cpp:4779 +#: src/slic3r/GUI/GLCanvas3D.cpp:4859 #, boost-format msgid "Next Undo action: %1%" msgstr "Скасувати дію: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:4795 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/GLCanvas3D.cpp:4874 src/slic3r/GUI/KBShortcutsDialog.cpp:107 +#: src/slic3r/GUI/MainFrame.cpp:1429 msgid "Redo" msgstr "Повторити" -#: src/slic3r/GUI/GLCanvas3D.cpp:4817 +#: src/slic3r/GUI/GLCanvas3D.cpp:4895 #, boost-format msgid "Next Redo action: %1%" msgstr "Повторити дію: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:6434 +#: src/slic3r/GUI/GLCanvas3D.cpp:6784 msgid "An object outside the print area was detected." msgstr "Виявлено об'єкт за межами області друку." -#: src/slic3r/GUI/GLCanvas3D.cpp:6435 +#: src/slic3r/GUI/GLCanvas3D.cpp:6785 msgid "A toolpath outside the print area was detected." msgstr "Виявлено траєкторію за межами області друку." -#: src/slic3r/GUI/GLCanvas3D.cpp:6436 +#: src/slic3r/GUI/GLCanvas3D.cpp:6786 msgid "SLA supports outside the print area were detected." msgstr "Виявлено SLA-підтримки за межами області друку." -#: src/slic3r/GUI/GLCanvas3D.cpp:6437 +#: src/slic3r/GUI/GLCanvas3D.cpp:6787 msgid "Some objects are not visible during editing." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6439 +#: src/slic3r/GUI/GLCanvas3D.cpp:6789 msgid "" "An object outside the print area was detected.\n" "Resolve the current problem to continue slicing." @@ -2482,319 +2665,1343 @@ msgstr "" "Виявлено об’єкт за межами області друку.\n" "Вирішіть поточну проблему, щоб продовжувати нарізання." -#: src/slic3r/GUI/GLCanvas3D.cpp:6513 +#: src/slic3r/GUI/GLCanvas3D.cpp:6864 msgid "Selection-Add from rectangle" msgstr "Виділення - Додано прямокутником" -#: src/slic3r/GUI/GLCanvas3D.cpp:6528 +#: src/slic3r/GUI/GLCanvas3D.cpp:6879 msgid "Selection-Remove from rectangle" msgstr "Виділення - Видалено прямокутником" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4478 -msgid "Cut" -msgstr "Розрізати" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:206 +msgid "Planar" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -msgid "in" -msgstr "дюйм" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Auto" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 -msgid "Keep upper part" -msgstr "Залишити верхню частину" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Manual" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 -msgid "Keep lower part" -msgstr "Залишити нижню частину" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:213 +msgid "Plug" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:196 -msgid "Rotate lower part upwards" -msgstr "Повернути нижню частину вгору" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:214 +msgid "Dowel" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:201 -msgid "Perform cut" -msgstr "Виконати розріз" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Prism" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:49 -msgid "Paint-on supports" -msgstr "Малювання підтримок" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Frustum" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 -msgid "Clipping of view" -msgstr "Відсікання площиною" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Triangle" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 -msgid "Reset direction" -msgstr "Скинути напрямок" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Square" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 -msgid "Brush size" -msgstr "Розмір пензля" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Hexagon" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 -msgid "Brush shape" -msgstr "Форма пензля" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:59 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 +msgid "Circle" +msgstr "Коло" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 -msgid "Left mouse button" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:233 +msgid "Keep orientation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:234 +msgid "Place on cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:235 +msgid "Flip upside down" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +msgid "inch" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 +msgid "Part" +msgstr "\"Частина\"" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 src/libslic3r/Print.cpp:1236 +msgid "Object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:264 +msgid "" +"Click to flip the cut plane\n" +"Drag to move the cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:269 src/libslic3r/PrintConfig.cpp:498 +#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2325 src/libslic3r/PrintConfig.cpp:2613 +#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2876 src/libslic3r/PrintConfig.cpp:2907 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3231 +#: src/libslic3r/PrintConfig.cpp:3466 src/libslic3r/PrintConfig.cpp:3951 +msgid "°" +msgstr "°" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:367 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:571 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1232 +msgid "Move cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +msgid "in" +msgstr "дюйм" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:544 +msgid "Value" +msgstr "Значення" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:549 +msgid "Tolerance" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 +msgid "Left click" msgstr "Ліва кнопка миші" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 -msgid "Enforce supports" -msgstr "Забезпечити підтримки" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2348 +msgid "Add connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 -msgid "Right mouse button" -msgstr "Права кнопка миші" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 +msgid "Right click" +msgstr "Клік на праву кнопку миші" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:434 -msgid "Block supports" -msgstr "Блокувати підтрики" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +msgid "Remove connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 -msgid "Shift + Left mouse button" -msgstr "Shift + Ліва кнопка миші" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 +msgid "Drag" +msgstr "Перетягування" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:429 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 -msgid "Remove selection" -msgstr "Видалити виділене" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1216 +msgid "Move connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 -msgid "Remove all selection" -msgstr "Видалити все, що виділено" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +msgid "Add connector to selection" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 -msgid "Circle" -msgstr "Коло" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +msgid "Remove connector from selection" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 -#: src/slic3r/GUI/GUI_Factories.cpp:461 -msgid "Sphere" -msgstr "Сфера" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:870 +msgid "Select all connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:68 -#: src/libslic3r/PrintConfig.cpp:1172 -msgid "Triangles" -msgstr "Трикутники" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:894 src/libslic3r/PrintConfig.cpp:4644 +msgid "Cut" +msgstr "Розрізати" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 -msgid "Highlight overhang by angle" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1227 +msgid "Rotate cut plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 -msgid "Enforce" -msgstr "Забезпечити" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1448 +msgid "Render cut plane as circle" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 -msgid "Tool type" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1537 +msgid "Connectors" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 -msgid "Brush" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1541 +msgid "Remove connectors" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:128 -msgid "Smart fill" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1550 +msgid "Type" +msgstr "Тип" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1561 src/libslic3r/PrintConfig.cpp:2816 +msgid "Style" +msgstr "Стиль" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1568 +msgid "Depth ratio" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:131 -msgid "Smart fill angle" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1586 +msgid "Confirm connectors" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:132 -msgid "Split triangles" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1652 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1666 +msgid "Flip cut plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 -msgid "On overhangs only" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1710 +msgid "Hold SHIFT key to draw a cut line" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:174 -#, boost-format -msgid "" -"Preselects faces by overhang angle. It is possible to restrict paintable " -"facets to only preselected faces when the option \"%1%\" is enabled." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1716 +msgid "Cut position: " msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:217 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:378 -msgid "Paints facets according to the chosen painting brush." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1725 +msgid "Reset cutting plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:391 -msgid "" -"Paints neighboring facets whose relative angle is less or equal to set angle." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Edit connectors" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:229 -#, boost-format -msgid "Allows painting only on facets selected by: \"%1%\"" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Add connectors" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:244 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:419 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:144 -msgid "Paints all facets inside, regardless of their orientation." -msgstr "Малює всі грані всередині, незалежно від їх орієнтації." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1744 +msgid "Reset cut" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:253 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:428 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:152 -msgid "Ignores facets facing away from the camera." -msgstr "Ігнорує грані, відвернуті від камери." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1745 +msgid "Reset cutting plane and remove connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:262 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:437 -msgid "Paints only one facet." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1800 +msgid "After cut" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:270 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:285 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:445 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:462 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:132 -msgid "Alt + Mouse wheel" -msgstr "Alt + Колесо миші" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1820 +msgid "Cut to" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 -msgid "Splits bigger facets into smaller ones while the object is painted." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1823 +msgid "Objects" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:308 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:483 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:170 -msgid "Ctrl + Mouse wheel" -msgstr "Ctrl + Колесо миші" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1826 +msgid "Parts" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:313 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:488 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:175 -msgid "Reset selection" -msgstr "Скинути вибір" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1840 +msgid "Perform cut" +msgstr "Виконати розріз" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:364 -msgid "Block supports by angle" -msgstr "Блокувати підтрики під кутом" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1930 +msgid "Invalid connectors detected" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:365 -msgid "Add supports by angle" -msgstr "Додати підтримки під кутом" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1932 +#, c-format, boost-format +msgid "%1$d connector is out of cut contour" +msgid_plural "%1$d connectors are out of cut contour" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:432 -msgid "Add supports" -msgstr "Додати підтримки" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1935 +#, c-format, boost-format +msgid "%1$d connector is out of object" +msgid_plural "%1$d connectors are out of object" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1938 +msgid "Some connectors are overlapped" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1942 +msgid "" +"Invalid state. \n" +"No one part is selected for keep after cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1944 +msgid "" +"Warning state. \n" +"Cut plane is placed out of object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2153 +msgid "Connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2183 +msgid "Cut by Plane" +msgstr "Вирізати площиною" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2323 +msgid "Cut by line" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2373 +msgid "Delete connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:252 +msgid "Entering Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:253 +msgid "Leaving Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:254 +msgid "Cut gizmo editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:601 +msgid "Emboss" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:866 +msgid "ERROR: Wait until ends or Cancel process." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:921 +msgid "Text-Rotate" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:953 +msgid "Font" +msgstr "Шрифт" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:954 +#: src/libslic3r/PrintConfig.cpp:897 +msgid "Height" +msgstr "Висота" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:955 +msgid "Depth" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:963 +msgid "Use surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:964 +msgid "Char gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:965 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Line gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:966 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:967 +msgid "Skew ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:968 +msgid "Z-move" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:969 +msgid "Z-rot" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:970 +msgid "Collection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1047 +msgid "NORMAL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1048 +msgid "SMALL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1049 +msgid "ITALIC" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1050 +msgid "SWISS" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1051 +msgid "MODERN" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1088 +msgid "First font" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1093 +msgid "Default font" +msgstr "Типовий шрифт" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1098 +msgid "Embossed text" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1513 +msgid "Warning: No font is selected. Select correct one." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1531 +#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1437 +#: src/slic3r/GUI/Tab.cpp:1472 src/slic3r/GUI/Tab.cpp:1607 +#: src/slic3r/GUI/Tab.cpp:1611 src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:2390 src/slic3r/GUI/Tab.cpp:4985 +#: src/libslic3r/PrintConfig.cpp:276 src/libslic3r/PrintConfig.cpp:514 +#: src/libslic3r/PrintConfig.cpp:1484 src/libslic3r/PrintConfig.cpp:1566 +#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:2562 +#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:3166 +#: src/libslic3r/PrintConfig.cpp:3200 src/libslic3r/PrintConfig.cpp:3211 +#: src/libslic3r/PrintConfig.cpp:3226 src/libslic3r/PrintConfig.cpp:3239 +#: src/libslic3r/PrintConfig.cpp:3248 src/libslic3r/PrintConfig.cpp:3260 +#: src/libslic3r/PrintConfig.cpp:3642 +msgid "Advanced" +msgstr "Розширений" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1631 +msgid "Can't write text by selected font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1632 +msgid "Try to choose another font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Empty" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Embossed text can NOT contain only white spaces." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Bad symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Text contain character glyph (represented by '?') unknown by font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:535 +msgid "Skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +msgid "Unsupported visualization of font skew for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Unsupported visualization of font boldness for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Unsupported visualization of gap between lines inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Too tall" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Diminished font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Too small" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Enlarged font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1660 +#, boost-format +msgid "%1% is NOT shown." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1964 +msgid " No symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1965 +msgid " ... Loading" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2015 +msgid " ... In queue" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2132 +#, boost-format +msgid "Font face \"%1%\" can't be selected." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2180 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:754 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:367 +msgid "Apply" +msgstr "Застосувати" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2192 +msgid "add file with font(.ttf, .ttc)" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2202 +msgid "Open dialog for choose from fonts." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2210 +msgid "Text is to object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2224 +msgid "Added" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2227 +msgid "Click to change text into object part." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2230 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4321 +msgid "You can't change a type of the last solid part of the object." +msgstr "Ви не можете змінити тип останньої твердої частини об’єкта." + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2231 +msgid "Subtracted" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2237 +msgid "Click to change part type into negative volume." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2243 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4338 +msgid "Modifier" +msgstr "Модифікатор" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2249 +msgid "Click to change part type into modifier." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2256 +msgid "Change Text Type" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2287 +#, boost-format +msgid "Rename style(%1%) for embossing text: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2299 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2384 +msgid "Name can't be empty." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2301 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2386 +msgid "Name has to be unique." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2310 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2397 +msgid "ok" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2312 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2401 +msgid "cancel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2337 +msgid "Rename style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2344 +msgid "Rename current style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2345 +msgid "Can't rename temporary style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2362 +msgid "First Add style to list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2364 +#, boost-format +msgid "Save %1% style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2366 +msgid "No changes to save." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2373 +msgid "New name of style: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2422 +msgid "Save as new style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2434 +msgid "Only valid font can be added to style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2436 +msgid "Add style to my list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2438 +msgid "Add as new named style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2454 +msgid "Remove style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2485 +#, boost-format +msgid "Delete \"%1%\" style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2486 +#, boost-format +msgid "Can't delete \"%1%\". It is last style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2487 +#, boost-format +msgid "Can't delete temporary style \"%1%\"." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2494 +#, boost-format +msgid "" +"Are you sure,\n" +"that you want permanently and unrecoverable \n" +"remove style \"%1%\"?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2496 +msgid "Yes" +msgstr "Так" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2505 +msgid "No" +msgstr "Ні" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2555 +msgid "Presets" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2564 src/slic3r/GUI/GUI_App.cpp:2324 +msgid "modified" +msgstr "модифікований" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2617 +#, boost-format +msgid "Modified style \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2618 +#, boost-format +msgid "Current style is \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2625 +msgid "Style modification will be lost." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2627 +#, boost-format +msgid "" +"Changing style to '%1%' will discard current style modification.\n" +"\n" +" Would you like to continue anyway?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2643 +msgid "Not valid style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2644 +#, boost-format +msgid "Style '%1%' can't be used and will be removed from list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2691 +msgid "Unset italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2708 +msgid "Set italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2738 +msgid "Unset bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2756 +msgid "Set bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2922 +msgid "WxFont is not loaded properly." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2957 +msgid "Revert font changes." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2991 +msgid "wx Make bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3002 +msgid "Revert text size." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3029 +msgid "Revert embossed depth." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3178 +msgid "" +"Advanced font options could be changed only for correct font.\n" +"Start with select correct font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3219 +msgid "Revert using of model surface." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3232 +msgid "font points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3241 +msgid "Revert gap between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3242 +msgid "Distance between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3257 +msgid "Revert gap between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3258 +msgid "Distance between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3272 +msgid "Undo boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3273 +msgid "Tiny / Wide glyphs" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3283 +msgid "Undo letter's skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3284 +msgid "Italic strength ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3304 +msgid "Undo translation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3305 +msgid "Distance of the center of text from model surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3350 +msgid "Undo rotation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3352 +msgid "Rotate text Clock-wise." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3386 +msgid "Select from True Type Collection." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3395 +msgid "Set text to face camera" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3402 +msgid "Use camera direction for text orientation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3486 +#, boost-format +msgid "Font '%1%' can't be used. Please select another." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3488 +msgid "Selected font is NOT True-type." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3512 +msgid "Choose one or more files (TTF, TTC):" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3539 +msgid "Choose SVG file:" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3600 +#, boost-format +msgid "" +"Can't load exactly same font(\"%1%\"), Aplication selected a similar " +"one(\"%2%\"). You have to specify font for enable edit text." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:81 +msgid "Enter emboss gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:82 +msgid "Leave emboss gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:83 +msgid "Embossing actions" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:37 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:66 +msgid "Paint-on supports" +msgstr "Малювання підтримок" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 +msgid "Automatic painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 +msgid "painting..." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:107 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +msgid "Clipping of view" +msgstr "Відсікання площиною" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:106 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 +msgid "Reset direction" +msgstr "Скинути напрямок" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:108 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 +msgid "Brush size" +msgstr "Розмір пензля" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:109 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 +msgid "Brush shape" +msgstr "Форма пензля" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1816 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:110 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 +msgid "Left mouse button" +msgstr "Ліва кнопка миші" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 +msgid "Enforce supports" +msgstr "Забезпечити підтримки" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 +msgid "Right mouse button" +msgstr "Права кнопка миші" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:573 +msgid "Block supports" +msgstr "Блокувати підтрики" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 +msgid "Shift + Left mouse button" +msgstr "Shift + Ліва кнопка миші" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:568 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:247 +msgid "Remove selection" +msgstr "Видалити виділене" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 +msgid "Remove all selection" +msgstr "Видалити все, що виділено" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 +#: src/slic3r/GUI/GUI_Factories.cpp:481 +msgid "Sphere" +msgstr "Сфера" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:106 +#: src/libslic3r/PrintConfig.cpp:1231 +msgid "Triangles" +msgstr "Трикутники" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 +msgid "Highlight overhang by angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:63 +msgid "Enforce" +msgstr "Забезпечити" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +msgid "Tool type" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 +msgid "Brush" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:68 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 +msgid "Smart fill" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 +msgid "Smart fill angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:72 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 +msgid "Split triangles" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:73 +msgid "On overhangs only" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:187 +#, boost-format +msgid "" +"Preselects faces by overhang angle. It is possible to restrict paintable " +"facets to only preselected faces when the option \"%1%\" is enabled." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:230 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:371 +msgid "Paints facets according to the chosen painting brush." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:238 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:384 +msgid "" +"Paints neighboring facets whose relative angle is less or equal to set angle." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242 +#, boost-format +msgid "Allows painting only on facets selected by: \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:257 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:412 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141 +msgid "Paints all facets inside, regardless of their orientation." +msgstr "Малює всі грані всередині, незалежно від їх орієнтації." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:266 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:421 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:149 +msgid "Ignores facets facing away from the camera." +msgstr "Ігнорує грані, відвернуті від камери." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:430 +msgid "Paints only one facet." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:298 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:438 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:455 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:129 +msgid "Alt + Mouse wheel" +msgstr "Alt + Колесо миші" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:288 +msgid "Splits bigger facets into smaller ones while the object is painted." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:321 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:476 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:167 +msgid "Ctrl + Mouse wheel" +msgstr "Ctrl + Колесо миші" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:326 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:481 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:172 +msgid "Reset selection" +msgstr "Скинути вибір" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:382 +msgid "Block supports by angle" +msgstr "Блокувати підтрики під кутом" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:383 +msgid "Add supports by angle" +msgstr "Додати підтримки під кутом" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +msgid "Automatic painting requires valid print setup." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:535 +msgid "Automatic painting will erase all currently painted areas." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:536 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1118 +msgid "Are you sure you want to do it?" +msgstr "Ви впевнені, що хочете це зробити?" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:540 +msgid "Automatic painting support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:571 +msgid "Add supports" +msgstr "Додати підтримки" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:22 +msgid "Entering Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:23 +msgid "Leaving Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:24 +msgid "Paint-on supports editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:88 +msgid "Place on face" +msgstr "Поверхнею на стіл" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:29 +msgid "Hollow this object" +msgstr "Випорожнити цей об'єкт" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 +msgid "Preview hollowed and drilled model" +msgstr "Попередній перегляд порожнистої та просвердленої моделі" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 +msgid "Offset" +msgstr "Зміщення" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 +msgid "Quality" +msgstr "Якість" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 +#: src/libslic3r/PrintConfig.cpp:4037 +msgid "Closing distance" +msgstr "Відстань закриття" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 +msgid "Hole diameter" +msgstr "Діаметр отвору" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 +msgid "Hole depth" +msgstr "Глибина отвору" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 +msgid "Remove selected holes" +msgstr "Видалити вибрані отвори" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 +msgid "Remove all holes" +msgstr "Видалити всі отвори" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 +msgid "Show supports" +msgstr "Показувати підтримки" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:242 +msgid "Add drainage hole" +msgstr "Додати дренажний отвір" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:361 +msgid "Delete drainage hole" +msgstr "Видалити дренажний отвір" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:655 +msgid "Hollowing parameter change" +msgstr "Зміна параметру порожнистості" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:739 +msgid "Change drainage hole diameter" +msgstr "Змініть діаметр дренажного отвору" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:827 +msgid "Hollow and drill" +msgstr "Порожнистість та свердління" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:869 +msgid "Move drainage hole" +msgstr "Перемістити дренажний отвір" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:64 +msgid "No feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:65 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:76 +msgid "Vertex" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:66 +msgid "Edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:68 +msgid "Plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:77 +msgid "Point on edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:78 +msgid "Point on circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:79 +msgid "Point on plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:89 +msgid "Center of edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:90 +msgid "Center of circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:554 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2029 +msgid "Measure" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1236 +msgid "Edit to scale" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1258 +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:161 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:236 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:776 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:794 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:817 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:831 +#: src/libslic3r/PrintConfig.cpp:4713 +msgid "Scale" +msgstr "Масштаб" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1362 +msgctxt "Verb" +msgid "Scale" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1541 +msgid "##angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1740 +msgid "Measure tool debug" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1824 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1851 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1857 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1886 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1893 +msgid "Unselect feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1830 +msgid "Unselect center" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1835 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1862 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1898 +msgid "Select center" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:41 -msgid "Place on face" -msgstr "Поверхнею на стіл" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1840 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1867 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1903 +msgid "Unselect point" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 -msgid "Hollow this object" -msgstr "Випорожнити цей об'єкт" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1846 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1873 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1910 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select feature" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 -msgid "Preview hollowed and drilled model" -msgstr "Попередній перегляд порожнистої та просвердленої моделі" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select point" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 -msgid "Offset" -msgstr "Зміщення" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Shift" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:57 -msgid "Quality" -msgstr "Якість" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Enable point selection" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3905 -msgid "Closing distance" -msgstr "Відстань закриття" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2007 +msgid "Restart selection" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 -msgid "Hole diameter" -msgstr "Діаметр отвору" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1952 +msgid "Esc" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 -msgid "Hole depth" -msgstr "Глибина отвору" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1955 +msgid "Unselect" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 -msgid "Remove selected holes" -msgstr "Видалити вибрані отвори" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1999 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2001 +msgid "Selection" +msgstr "Позначене" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 -msgid "Remove all holes" -msgstr "Видалити всі отвори" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2021 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +msgid "Copy to clipboard" +msgstr "Скопіювати в буфер обміну" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 -msgid "Show supports" -msgstr "Показувати підтримки" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2038 +msgid "Angle" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:287 -msgid "Add drainage hole" -msgstr "Додати дренажний отвір" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Perpendicular distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:403 -msgid "Delete drainage hole" -msgstr "Видалити дренажний отвір" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:590 -msgid "Hollowing parameter change" -msgstr "Зміна параметру порожнистості" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2062 +msgid "Direct distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:667 -msgid "Change drainage hole diameter" -msgstr "Змініть діаметр дренажного отвору" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2072 +msgid "Distance XYZ" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:761 -msgid "Hollow and drill" -msgstr "Порожнистість та свердління" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:163 +msgid "Entering Measure gizmo" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:811 -msgid "Move drainage hole" -msgstr "Перемістити дренажний отвір" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:164 +msgid "Leaving Measure gizmo" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:27 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:165 +msgid "Measure gizmo editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:28 #, boost-format msgid "" "Your printer has more extruders than the multi-material painting gizmo " @@ -2802,81 +4009,85 @@ msgid "" "used for painting." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:45 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:46 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 msgid "Multimaterial painting" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 msgid "First color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 msgid "Second color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:120 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:671 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:642 msgid "Remove painted color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 msgid "Clear all" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:129 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 msgid "Bucket fill" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:404 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:397 msgid "Paints neighboring facets that have the same color." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:450 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:443 msgid "Split bigger facets into smaller ones while the object is painted." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:674 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:645 #, boost-format msgid "Painted using: Extruder %1%" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:118 +msgid "Entering Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:119 +msgid "Leaving Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:120 +msgid "Multimaterial painting editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:76 msgid "Move" msgstr "Пересунути" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:466 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4532 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:643 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:745 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:775 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:813 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:830 +#: src/libslic3r/PrintConfig.cpp:4698 msgid "Rotate" msgstr "Обертати" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:505 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:707 msgid "Optimize orientation" msgstr "Оптимізувати орієнтацію" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:552 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:319 -msgid "Apply" -msgstr "Застосувати" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:79 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4547 -msgid "Scale" -msgstr "Масштаб" +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:194 +msgid "Gizmo-Scale" +msgstr "Gizmo масштабування" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 msgid "Enforce seam" msgstr "Забезпечити шов" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:38 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:255 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:252 msgid "Block seam" msgstr "Блокувати шов" @@ -2884,328 +4095,332 @@ msgstr "Блокувати шов" msgid "Seam painting" msgstr "Малювання шва" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:23 +msgid "Entering Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:24 +msgid "Leaving Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:25 +msgid "Paint-on seam editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:105 msgid "Mesh name" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:69 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:107 msgid "Detail level" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:108 msgid "Decimate ratio" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:113 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:147 #, boost-format msgid "" "Processing model '%1%' with more than 1M triangles could be slow. It is " -"highly recommend to reduce amount of triangles." +"highly recommended to reduce amount of triangles." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:116 -#: src/slic3r/GUI/GUI_Factories.cpp:705 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:150 +#: src/slic3r/GUI/GUI_Factories.cpp:789 msgid "Simplify model" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:143 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:177 msgid "Simplify" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:156 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:190 msgid "Simplification is currently only allowed when a single part is selected" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 -#: src/slic3r/GUI/PrintHostDialogs.cpp:373 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:191 +#: src/slic3r/GUI/MainFrame.cpp:1246 src/slic3r/GUI/MainFrame.cpp:1716 +#: src/slic3r/GUI/PrintHostDialogs.cpp:425 msgid "Error" msgstr "Помилка" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:250 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:294 msgid "Extra high" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:251 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:295 msgid "High" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:252 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:296 msgid "Medium" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:297 msgid "Low" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:254 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:298 msgid "Extra low" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:304 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#, boost-format +msgid "" +"Multipart object can be simplified only by %1%. If you want specify %2% " +"process it separately." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:352 #, c-format, boost-format msgid "%d triangles" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:307 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:355 msgid "Show wireframe" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:313 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:361 msgid "Operation already cancelling. Please wait few seconds." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:370 msgid "Can't apply when proccess preview." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:329 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:377 #, boost-format msgid "Process %1% / 100" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:479 -#, boost-format -msgid "Simplify %1%" +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:542 +msgid "Simplify " msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:543 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"simplifying the mesh." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:67 +msgid "Entering SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:68 +msgid "Leaving SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:35 msgid "Head diameter" msgstr "Діаметр головки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:36 msgid "Lock supports under new islands" msgstr "Зафіксувати підтримки під новими островами" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:37 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268 msgid "Remove selected points" msgstr "Видалити вибрані точки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:38 msgid "Remove all points" msgstr "Видалити всі точки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1226 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1271 msgid "Apply changes" msgstr "Застосувати зміни" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1227 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1272 msgid "Discard changes" msgstr "Відхилити зміни" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 msgid "Minimal points distance" msgstr "Мінімальна відстань точок" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3735 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/libslic3r/PrintConfig.cpp:3867 msgid "Support points density" msgstr "Щільність точок підтримки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1229 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1274 msgid "Auto-generate points" msgstr "Генерувати точки автоматично" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 msgid "Manual editing" msgstr "Ручне редагування" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:372 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:307 msgid "Add support point" msgstr "Додати точку підтримки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:522 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:460 msgid "Delete support point" msgstr "Видалити точку підтримки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:702 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:626 msgid "Change point head diameter" msgstr "Змінити діаметр головки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:770 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:696 msgid "Support parameter change" msgstr "Зміна параметрів підтримки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:876 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:806 msgid "SLA Support Points" msgstr "Точки SLA-підтримки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:814 msgid "Do you want to save your manually edited support points?" msgstr "Ви хочете зберегти відредаговані вручну точки підтримки?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:898 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:815 msgid "Save support points?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:958 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:880 msgid "Move support point" msgstr "Перемістити точку підтримки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1051 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:987 msgid "Support points edit" msgstr "Редагування точок підтримки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1131 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1117 msgid "Autogeneration will erase all manually edited points." msgstr "Автогенерація видалить всі відредаговані вручну точки." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1132 -msgid "Are you sure you want to do it?" -msgstr "Ви впевнені, що хочете це зробити?" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1138 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1124 msgid "Autogenerate support points" msgstr "Автогенерувати точки підтримки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1186 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 msgid "SLA gizmo keyboard shortcuts" msgstr "Комбінації клавіш для SLA гізма" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1197 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1242 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "Примітка: деякі скорочення працюють лише в режимі (не)редагування." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 -msgid "Left click" -msgstr "Ліва кнопка миші" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 msgid "Add point" msgstr "Додати точку" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 -msgid "Right click" -msgstr "Клік на праву кнопку миші" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 msgid "Remove point" msgstr "Видалити точку" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 -msgid "Drag" -msgstr "Перетягування" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 msgid "Move point" msgstr "Перемістити точку" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 msgid "Add point to selection" msgstr "Додати точку до виділення" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 msgid "Remove point from selection" msgstr "Видалити точку з виділення" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 msgid "Select by rectangle" msgstr "Виділення прямокутником" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 msgid "Deselect by rectangle" msgstr "Скасування вибору прямокутником" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1267 msgid "Select all points" msgstr "Виділити усі точки" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Mouse wheel" msgstr "Колесо миші" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Move clipping plane" msgstr "Перемістити площину відсікання" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1225 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1270 msgid "Reset clipping plane" msgstr "Скинути площину відсікання" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1228 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273 msgid "Switch to editing mode" msgstr "Перейти в режим редагування" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:196 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:204 msgid "" "ERROR: Please close all manipulators available from the left toolbar first" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:561 -msgid "Gizmo-Scale" -msgstr "Gizmo масштабування" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:673 -msgid "Gizmo-Place on Face" -msgstr "Gizmo \"Поверхнею на стіл\"" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:1270 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:998 msgid "" "You are currently editing SLA support points. Please, apply or discard your " "changes first." msgstr "" -#: src/slic3r/GUI/GUI.cpp:292 +#: src/slic3r/GUI/GUI.cpp:287 msgid "Undefined" msgstr "" -#: src/slic3r/GUI/GUI.cpp:317 +#: src/slic3r/GUI/GUI.cpp:308 #, boost-format msgid "%1% was substituted with %2%" msgstr "" -#: src/slic3r/GUI/GUI.cpp:326 +#: src/slic3r/GUI/GUI.cpp:317 msgid "" "Most likely the configuration was produced by a newer version of PrusaSlicer " "or by some PrusaSlicer fork." msgstr "" -#: src/slic3r/GUI/GUI.cpp:327 +#: src/slic3r/GUI/GUI.cpp:318 msgid "The following values were substituted:" msgstr "" -#: src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/GUI.cpp:319 msgid "Review the substitutions and adjust them if needed." msgstr "" -#: src/slic3r/GUI/GUI.cpp:338 src/slic3r/GUI/Plater.cpp:820 +#: src/slic3r/GUI/GUI.cpp:329 src/slic3r/GUI/Plater.cpp:850 msgid "SLA print settings" msgstr "Параметри SLA-друку" -#: src/slic3r/GUI/GUI.cpp:342 src/slic3r/GUI/PhysicalPrinterDialog.cpp:157 +#: src/slic3r/GUI/GUI.cpp:333 src/slic3r/GUI/PhysicalPrinterDialog.cpp:158 msgid "Physical Printer" msgstr "Фізичний принтер" -#: src/slic3r/GUI/GUI.cpp:355 +#: src/slic3r/GUI/GUI.cpp:346 msgid "" "Configuration bundle was loaded, however some configuration values were not " "recognized." msgstr "" -#: src/slic3r/GUI/GUI.cpp:365 +#: src/slic3r/GUI/GUI.cpp:356 #, boost-format msgid "" "Configuration file \"%1%\" was loaded, however some configuration values " "were not recognized." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:266 +#: src/slic3r/GUI/GUI_App.cpp:275 msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." msgstr "заснований на Slic3r від Alessandro Ranellucci та спільноти RepRap." -#: src/slic3r/GUI/GUI_App.cpp:267 +#: src/slic3r/GUI/GUI_App.cpp:276 msgid "Developed by Prusa Research." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:269 +#: src/slic3r/GUI/GUI_App.cpp:278 msgid "" "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." @@ -3214,11 +4429,11 @@ msgstr "" "Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik та багатьох " "інших." -#: src/slic3r/GUI/GUI_App.cpp:270 -msgid "Artwork model by Leslie Ing" +#: src/slic3r/GUI/GUI_App.cpp:279 +msgid "Artwork model by Creative Tools" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:411 +#: src/slic3r/GUI/GUI_App.cpp:420 #, boost-format msgid "" "Starting with %1% 2.3, configuration directory on Linux has changed " @@ -3251,20 +4466,20 @@ msgstr "" "\n" "Що ви хочете робити зараз?" -#: src/slic3r/GUI/GUI_App.cpp:419 +#: src/slic3r/GUI/GUI_App.cpp:428 #, c-format, boost-format msgid "%s - BREAKING CHANGE" msgstr "%s - ЗЛАМАНА ЗМІНА" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Quit, I will move my data now" msgstr "Вийти, я зараз перенесу свої дані" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Start the application" msgstr "Запустити програму" -#: src/slic3r/GUI/GUI_App.cpp:699 +#: src/slic3r/GUI/GUI_App.cpp:725 #, c-format, boost-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -3279,11 +4494,11 @@ msgstr "" "\n" "Тепер застосування буде припинено." -#: src/slic3r/GUI/GUI_App.cpp:702 +#: src/slic3r/GUI/GUI_App.cpp:728 msgid "Fatal error" msgstr "Критична помилка" -#: src/slic3r/GUI/GUI_App.cpp:706 +#: src/slic3r/GUI/GUI_App.cpp:732 msgid "" "PrusaSlicer has encountered a localization error. Please report to " "PrusaSlicer team, what language was active and in which scenario this issue " @@ -3296,16 +4511,16 @@ msgstr "" "\n" "Тепер застосування буде припинено." -#: src/slic3r/GUI/GUI_App.cpp:709 +#: src/slic3r/GUI/GUI_App.cpp:735 msgid "Critical error" msgstr "Критична помилка" -#: src/slic3r/GUI/GUI_App.cpp:714 +#: src/slic3r/GUI/GUI_App.cpp:740 #, boost-format msgid "Internal error: %1%" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:909 src/slic3r/GUI/GUI_App.cpp:1007 +#: src/slic3r/GUI/GUI_App.cpp:954 src/slic3r/GUI/GUI_App.cpp:1051 msgid "" "Error parsing PrusaSlicer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error. Your user profiles will " @@ -3315,7 +4530,7 @@ msgstr "" "пошкоджений. Спробуйте вручну видалити файл, щоб оговтатися від помилки. Це " "не вплине на профілі користувачів." -#: src/slic3r/GUI/GUI_App.cpp:915 src/slic3r/GUI/GUI_App.cpp:1013 +#: src/slic3r/GUI/GUI_App.cpp:960 src/slic3r/GUI/GUI_App.cpp:1057 msgid "" "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error." @@ -3323,12 +4538,12 @@ msgstr "" "Помилка під час розбору файлу конфігурації PrusaGCodeViewer, можливо, він " "пошкоджений. Спробуйте вручну видалити файл, щоб оговтатися від помилки." -#: src/slic3r/GUI/GUI_App.cpp:962 +#: src/slic3r/GUI/GUI_App.cpp:1006 #, boost-format msgid "You are opening %1% version %2%." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:965 +#: src/slic3r/GUI/GUI_App.cpp:1009 #, boost-format msgid "" "The active configuration was created by %1% %2%,\n" @@ -3340,7 +4555,7 @@ msgid "" "configuration." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:973 +#: src/slic3r/GUI/GUI_App.cpp:1017 #, boost-format msgid "" "An existing configuration was found in %3%\n" @@ -3349,19 +4564,19 @@ msgid "" "Shall this configuration be imported?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:981 +#: src/slic3r/GUI/GUI_App.cpp:1025 msgid "Import" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:982 +#: src/slic3r/GUI/GUI_App.cpp:1026 msgid "Don't import" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:990 +#: src/slic3r/GUI/GUI_App.cpp:1034 msgid "Continue and import newer configuration?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1051 +#: src/slic3r/GUI/GUI_App.cpp:1095 msgid "" "You are running a 32 bit build of PrusaSlicer on 64-bit Windows.\n" "32 bit build of PrusaSlicer will likely not be able to utilize all the RAM " @@ -3371,7 +4586,7 @@ msgid "" "Do you wish to continue?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1134 +#: src/slic3r/GUI/GUI_App.cpp:1182 #, c-format, boost-format msgid "" "%s\n" @@ -3380,46 +4595,37 @@ msgstr "" "%s\n" "Бажаєте продовжити?" -#: src/slic3r/GUI/GUI_App.cpp:1136 src/slic3r/GUI/GUI_App.cpp:3101 -#: src/slic3r/GUI/Plater.cpp:1726 src/slic3r/GUI/UnsavedChangesDialog.cpp:889 +#: src/slic3r/GUI/GUI_App.cpp:1184 src/slic3r/GUI/GUI_App.cpp:3302 +#: src/slic3r/GUI/Plater.cpp:1736 src/slic3r/GUI/UnsavedChangesDialog.cpp:917 msgid "Remember my choice" msgstr "Пам'ятати мій вибір" -#: src/slic3r/GUI/GUI_App.cpp:1178 +#: src/slic3r/GUI/GUI_App.cpp:1226 msgid "Loading configuration" msgstr "Завантаження конфігурації" -#: src/slic3r/GUI/GUI_App.cpp:1209 -#, boost-format -msgid "New release version %1% is available." -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:1210 -msgid "See Download page." -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:1224 +#: src/slic3r/GUI/GUI_App.cpp:1257 #, boost-format msgid "New prerelease version %1% is available." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1225 +#: src/slic3r/GUI/GUI_App.cpp:1258 msgid "See Releases page." msgstr "Див. Сторінку випусків." -#: src/slic3r/GUI/GUI_App.cpp:1262 +#: src/slic3r/GUI/GUI_App.cpp:1313 msgid "Preparing settings tabs" msgstr "Підготовка вкладок параметрів" -#: src/slic3r/GUI/GUI_App.cpp:1336 src/slic3r/GUI/Preferences.cpp:287 +#: src/slic3r/GUI/GUI_App.cpp:1393 src/slic3r/GUI/Preferences.cpp:405 msgid "Restore window position on start" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1338 +#: src/slic3r/GUI/GUI_App.cpp:1395 msgid "PrusaSlicer started after a crash" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1339 +#: src/slic3r/GUI/GUI_App.cpp:1396 #, boost-format msgid "" "PrusaSlicer crashed last time when attempting to set window position.\n" @@ -3432,24 +4638,24 @@ msgid "" "Otherwise, the application will most likely crash again next time." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1351 +#: src/slic3r/GUI/GUI_App.cpp:1408 #, boost-format msgid "Disable \"%1%\"" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1352 +#: src/slic3r/GUI/GUI_App.cpp:1409 #, boost-format msgid "Leave \"%1%\" enabled" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1679 +#: src/slic3r/GUI/GUI_App.cpp:1780 msgid "" "You have the following presets with saved options for \"Print Host upload\"" msgstr "" "У вас є наступні пресети із збереженими параметрами для \"Завантаження хоста " "друку(\"Print Host upload\")\"" -#: src/slic3r/GUI/GUI_App.cpp:1683 +#: src/slic3r/GUI/GUI_App.cpp:1784 msgid "" "But since this version of PrusaSlicer we don't show this information in " "Printer Settings anymore.\n" @@ -3459,7 +4665,7 @@ msgstr "" "параметрах принтера.\n" "Ці параметри будуть доступні у налаштуваннях фізичних принтерів." -#: src/slic3r/GUI/GUI_App.cpp:1685 +#: src/slic3r/GUI/GUI_App.cpp:1786 msgid "" "By default new Printer devices will be named as \"Printer N\" during its " "creation.\n" @@ -3469,169 +4675,174 @@ msgstr "" "їх створення.\n" "Примітка: Цю назву можна змінити пізніше в налаштуваннях фізичних принтерів" -#: src/slic3r/GUI/GUI_App.cpp:1689 src/slic3r/GUI/PhysicalPrinterDialog.cpp:726 +#: src/slic3r/GUI/GUI_App.cpp:1790 src/slic3r/GUI/PhysicalPrinterDialog.cpp:798 msgid "Information" msgstr "Інформація" -#: src/slic3r/GUI/GUI_App.cpp:1702 src/slic3r/GUI/GUI_App.cpp:1713 +#: src/slic3r/GUI/GUI_App.cpp:1803 src/slic3r/GUI/GUI_App.cpp:1814 msgid "Recreating" msgstr "Пере-створення" -#: src/slic3r/GUI/GUI_App.cpp:1716 +#: src/slic3r/GUI/GUI_App.cpp:1817 msgid "Loading of current presets" msgstr "Завантаження поточних пресетів" -#: src/slic3r/GUI/GUI_App.cpp:1721 +#: src/slic3r/GUI/GUI_App.cpp:1822 msgid "Loading of a mode view" msgstr "Завантаження режиму перегляду" -#: src/slic3r/GUI/GUI_App.cpp:1859 +#: src/slic3r/GUI/GUI_App.cpp:1961 msgid "Choose one file (3MF/AMF):" msgstr "Виберіть один файл (3MF/AMF):" -#: src/slic3r/GUI/GUI_App.cpp:1871 +#: src/slic3r/GUI/GUI_App.cpp:1973 msgid "Choose one or more files (STL/3MF/STEP/OBJ/AMF/PRUSA):" msgstr "Виберіть один чи кілька файлів (STL/3MF/STEP/OBJ/AMF/PRUSA):" -#: src/slic3r/GUI/GUI_App.cpp:1883 +#: src/slic3r/GUI/GUI_App.cpp:1984 +msgid "Choose ZIP file:" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1996 msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" msgstr "Виберіть один файл (GCODE/.GCO/.G/.ngc/NGC):" -#: src/slic3r/GUI/GUI_App.cpp:1894 +#: src/slic3r/GUI/GUI_App.cpp:2007 msgid "Changing of an application language" msgstr "Зміна мови застосування" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Select the language" msgstr "Оберіть мову" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Language" msgstr "Мова" -#: src/slic3r/GUI/GUI_App.cpp:2182 -msgid "modified" -msgstr "модифікований" +#: src/slic3r/GUI/GUI_App.cpp:2363 +msgid "" +"Simple mode supports manipulation with single-part object(s)\n" +"or object(s) with support modifiers only." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2365 +msgid "Please check your object list before mode changing." +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2236 +#: src/slic3r/GUI/GUI_App.cpp:2366 +msgid "Change application mode" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2397 #, c-format, boost-format msgid "Run %s" msgstr "Запустити %s" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "&Configuration Snapshots" msgstr "Знімки конфігурації" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "Inspect / activate configuration snapshots" msgstr "Перегляньте / активізуйте знімки конфігурації" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Take Configuration &Snapshot" msgstr "Зробіть знімок конфігурації" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Capture a configuration snapshot" msgstr "Зробіть знімок конфігурації" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for Configuration Updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for configuration updates" msgstr "Перевірити наявність оновлень конфігурації" -#: src/slic3r/GUI/GUI_App.cpp:2249 +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for Application Updates" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for new version of application" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2411 msgid "&Preferences" msgstr "&Преференції" -#: src/slic3r/GUI/GUI_App.cpp:2255 +#: src/slic3r/GUI/GUI_App.cpp:2417 msgid "Application preferences" msgstr "Преференції застосування" -#: src/slic3r/GUI/GUI_App.cpp:2260 src/slic3r/GUI/wxExtensions.cpp:708 -msgid "Simple" -msgstr "Простий" - -#: src/slic3r/GUI/GUI_App.cpp:2260 +#: src/slic3r/GUI/GUI_App.cpp:2422 msgid "Simple View Mode" msgstr "Простий режим перегляду" -#: src/slic3r/GUI/GUI_App.cpp:2262 src/slic3r/GUI/wxExtensions.cpp:710 -msgctxt "Mode" -msgid "Advanced" -msgstr "Розширений" - -#: src/slic3r/GUI/GUI_App.cpp:2262 +#: src/slic3r/GUI/GUI_App.cpp:2424 msgid "Advanced View Mode" msgstr "Розширений режим перегляду" -#: src/slic3r/GUI/GUI_App.cpp:2263 src/slic3r/GUI/wxExtensions.cpp:711 -msgid "Expert" -msgstr "Експерт" - -#: src/slic3r/GUI/GUI_App.cpp:2263 +#: src/slic3r/GUI/GUI_App.cpp:2425 msgid "Expert View Mode" msgstr "Режим перегляду Експерт" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 msgid "Mode" msgstr "Режим" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 #, c-format, boost-format msgid "%s View Mode" msgstr "Режим перегляду %s" -#: src/slic3r/GUI/GUI_App.cpp:2271 +#: src/slic3r/GUI/GUI_App.cpp:2433 msgid "&Language" msgstr "Мова" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Flash Printer &Firmware" msgstr "Прошити принтер" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Upload a firmware image into an Arduino based printer" msgstr "Завантажте імідж прошивки на Arduino-принтер" -#: src/slic3r/GUI/GUI_App.cpp:2294 +#: src/slic3r/GUI/GUI_App.cpp:2459 msgid "Taking a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2295 +#: src/slic3r/GUI/GUI_App.cpp:2460 msgid "" "Some presets are modified and the unsaved changes will not be captured by " "the configuration snapshot." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2296 +#: src/slic3r/GUI/GUI_App.cpp:2461 msgid "Snapshot name" msgstr "Назва знімку" -#: src/slic3r/GUI/GUI_App.cpp:2312 +#: src/slic3r/GUI/GUI_App.cpp:2477 msgid "Loading a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2321 +#: src/slic3r/GUI/GUI_App.cpp:2486 #, boost-format msgid "Continue to activate a configuration snapshot %1%?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2335 +#: src/slic3r/GUI/GUI_App.cpp:2500 msgid "Failed to activate configuration snapshot." msgstr "Не вдалося активувати знімок конфігурації." -#: src/slic3r/GUI/GUI_App.cpp:2354 -msgid "Restart application" -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:2388 +#: src/slic3r/GUI/GUI_App.cpp:2520 msgid "Language selection" msgstr "Вибір мови" -#: src/slic3r/GUI/GUI_App.cpp:2391 +#: src/slic3r/GUI/GUI_App.cpp:2523 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." @@ -3639,147 +4850,173 @@ msgstr "" "Переключення мови спричинить перезапуск програми.\n" "Ви втратите вміст платеру." -#: src/slic3r/GUI/GUI_App.cpp:2393 src/slic3r/GUI/Preferences.cpp:582 +#: src/slic3r/GUI/GUI_App.cpp:2525 src/slic3r/GUI/Preferences.cpp:730 +#: src/slic3r/GUI/Selection.cpp:1695 msgid "Do you want to proceed?" msgstr "Ви хочете продовжити?" -#: src/slic3r/GUI/GUI_App.cpp:2420 +#: src/slic3r/GUI/GUI_App.cpp:2552 msgid "&Configuration" msgstr "&Конфігурація" -#: src/slic3r/GUI/GUI_App.cpp:2534 src/slic3r/GUI/GUI_App.cpp:2595 -msgid "The preset modifications are successfully saved" -msgid_plural "The presets modifications are successfully saved" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +#: src/slic3r/GUI/GUI_App.cpp:2560 +msgid "Restart application" +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2598 +#: src/slic3r/GUI/GUI_App.cpp:2726 msgid "For new project all modifications will be reseted" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2636 +#: src/slic3r/GUI/GUI_App.cpp:2764 msgid "Loading a new project while the current project is modified." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Project is loading" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Opening new project while some presets are unsaved." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "The uploads are still ongoing" msgstr "Завантаження все ще триває" -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "Stop them and continue anyway?" msgstr "Зупинити їх і продовжувати в будь-якому випадку?" -#: src/slic3r/GUI/GUI_App.cpp:2662 +#: src/slic3r/GUI/GUI_App.cpp:2790 msgid "Ongoing uploads" msgstr "Триває завантаження" -#: src/slic3r/GUI/GUI_App.cpp:2876 -msgid "It's impossible to print multi-part object(s) with SLA technology." +#: src/slic3r/GUI/GUI_App.cpp:3026 +msgid "" +"It's impossible to print object(s) which contains parameter modifiers with " +"SLA technology." msgstr "" -"За технологією SLA неможливо надрукувати об'єкти, що складаються з декількох " -"частин." -#: src/slic3r/GUI/GUI_App.cpp:2877 src/slic3r/GUI/Jobs/SLAImportJob.cpp:235 -#: src/slic3r/GUI/Plater.cpp:2459 +#: src/slic3r/GUI/GUI_App.cpp:3027 src/slic3r/GUI/Jobs/SLAImportJob.cpp:149 +#: src/slic3r/GUI/Plater.cpp:2536 msgid "Please check your object list before preset changing." msgstr "" "Будь ласка, перевірте свій список об'єктів перед тим, як змінити пресет." -#: src/slic3r/GUI/GUI_App.cpp:2901 +#: src/slic3r/GUI/GUI_App.cpp:3070 msgid "Configuration is editing from ConfigWizard" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2926 +#: src/slic3r/GUI/GUI_App.cpp:3088 +#, boost-format +msgid "Welcome to %1% version %2%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3090 +#, boost-format +msgid "" +"Do you wish to register downloads from Printables.com\n" +"for this %1% %2% executable?\n" +"\n" +"Downloads can be registered for only 1 executable at time." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3118 msgid "Select a gcode file:" msgstr "Виберіть файл G-коду:" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "Open hyperlink in default browser?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "PrusaSlicer: Open hyperlink" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3105 src/slic3r/GUI/Preferences.cpp:382 +#: src/slic3r/GUI/GUI_App.cpp:3306 src/slic3r/GUI/Preferences.cpp:593 msgid "Suppress to open hyperlink in browser" msgstr "Заборонити відкриття гіперпосилань у браузері" -#: src/slic3r/GUI/GUI_App.cpp:3107 src/slic3r/GUI/Plater.cpp:1732 +#: src/slic3r/GUI/GUI_App.cpp:3308 src/slic3r/GUI/Plater.cpp:1742 msgid "PrusaSlicer will remember your choice." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3108 +#: src/slic3r/GUI/GUI_App.cpp:3309 msgid "You will not be asked about it again on hyperlinks hovering." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3109 src/slic3r/GUI/Plater.cpp:1736 +#: src/slic3r/GUI/GUI_App.cpp:3310 src/slic3r/GUI/Plater.cpp:1746 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" "to changes your choice." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3111 src/slic3r/GUI/Plater.cpp:1738 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:906 +#: src/slic3r/GUI/GUI_App.cpp:3312 src/slic3r/GUI/Plater.cpp:1748 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:934 msgid "PrusaSlicer: Don't ask me again" msgstr "PrusaSlicer: Не питай мене більше" -#: src/slic3r/GUI/GUI_Init.cpp:57 src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_App.cpp:3386 +msgid "Check for application update has failed." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3387 +#, boost-format +msgid "No new version is available. Latest release version is %1%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3458 +msgid "Download of new version is already ongoing. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/GUI_Init.cpp:64 src/slic3r/GUI/GUI_Init.cpp:67 msgid "PrusaSlicer GUI initialization failed" msgstr "Помилка ініціалізації графічного інтерфейсу PrusaSlicer" -#: src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_Init.cpp:67 #, boost-format msgid "Fatal error, exception catched: %1%" msgstr "Фатальна помилка, вилучений виняток: %1%" #: src/slic3r/GUI/GUI_Factories.cpp:54 src/slic3r/GUI/GUI_Factories.cpp:127 -#: src/libslic3r/PrintConfig.cpp:287 src/libslic3r/PrintConfig.cpp:404 -#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:456 -#: src/libslic3r/PrintConfig.cpp:708 src/libslic3r/PrintConfig.cpp:778 -#: src/libslic3r/PrintConfig.cpp:786 src/libslic3r/PrintConfig.cpp:1232 -#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1563 -#: src/libslic3r/PrintConfig.cpp:1955 src/libslic3r/PrintConfig.cpp:2030 -#: src/libslic3r/PrintConfig.cpp:2264 src/libslic3r/PrintConfig.cpp:2850 -#: src/libslic3r/PrintConfig.cpp:2858 src/libslic3r/PrintConfig.cpp:2918 -#: src/libslic3r/PrintConfig.cpp:2927 src/libslic3r/PrintConfig.cpp:3098 +#: src/libslic3r/PrintConfig.cpp:300 src/libslic3r/PrintConfig.cpp:423 +#: src/libslic3r/PrintConfig.cpp:466 src/libslic3r/PrintConfig.cpp:475 +#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:872 +#: src/libslic3r/PrintConfig.cpp:881 src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1376 src/libslic3r/PrintConfig.cpp:1604 +#: src/libslic3r/PrintConfig.cpp:1985 src/libslic3r/PrintConfig.cpp:2060 +#: src/libslic3r/PrintConfig.cpp:2294 src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:2946 src/libslic3r/PrintConfig.cpp:3006 +#: src/libslic3r/PrintConfig.cpp:3015 src/libslic3r/PrintConfig.cpp:3186 msgid "Layers and Perimeters" msgstr "Шари та периметри" #: src/slic3r/GUI/GUI_Factories.cpp:56 src/slic3r/GUI/GUI_Factories.cpp:131 -#: src/slic3r/GUI/GUI_Preview.cpp:249 src/slic3r/GUI/Tab.cpp:1547 -#: src/slic3r/GUI/Tab.cpp:1549 src/libslic3r/ExtrusionEntity.cpp:340 -#: src/libslic3r/ExtrusionEntity.cpp:372 src/libslic3r/PrintConfig.cpp:670 -#: src/libslic3r/PrintConfig.cpp:2095 src/libslic3r/PrintConfig.cpp:2104 -#: src/libslic3r/PrintConfig.cpp:2113 src/libslic3r/PrintConfig.cpp:2123 -#: src/libslic3r/PrintConfig.cpp:2132 src/libslic3r/PrintConfig.cpp:2554 -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2568 -#: src/libslic3r/PrintConfig.cpp:2581 src/libslic3r/PrintConfig.cpp:2591 -#: src/libslic3r/PrintConfig.cpp:2599 src/libslic3r/PrintConfig.cpp:2617 -#: src/libslic3r/PrintConfig.cpp:2634 src/libslic3r/PrintConfig.cpp:2655 -#: src/libslic3r/PrintConfig.cpp:2668 src/libslic3r/PrintConfig.cpp:2685 -#: src/libslic3r/PrintConfig.cpp:2703 src/libslic3r/PrintConfig.cpp:2718 -#: src/libslic3r/PrintConfig.cpp:2728 src/libslic3r/PrintConfig.cpp:2737 -#: src/libslic3r/PrintConfig.cpp:2748 src/libslic3r/PrintConfig.cpp:2762 -#: src/libslic3r/PrintConfig.cpp:2778 src/libslic3r/PrintConfig.cpp:2786 -#: src/libslic3r/PrintConfig.cpp:2787 src/libslic3r/PrintConfig.cpp:2796 -#: src/libslic3r/PrintConfig.cpp:2810 src/libslic3r/PrintConfig.cpp:2818 -#: src/libslic3r/PrintConfig.cpp:2832 +#: src/slic3r/GUI/Tab.cpp:1494 src/slic3r/GUI/Tab.cpp:1496 +#: src/libslic3r/PrintConfig.cpp:773 src/libslic3r/PrintConfig.cpp:2125 +#: src/libslic3r/PrintConfig.cpp:2134 src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2153 src/libslic3r/PrintConfig.cpp:2162 +#: src/libslic3r/PrintConfig.cpp:2584 src/libslic3r/PrintConfig.cpp:2590 +#: src/libslic3r/PrintConfig.cpp:2598 src/libslic3r/PrintConfig.cpp:2611 +#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2628 +#: src/libslic3r/PrintConfig.cpp:2644 src/libslic3r/PrintConfig.cpp:2660 +#: src/libslic3r/PrintConfig.cpp:2681 src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2725 +#: src/libslic3r/PrintConfig.cpp:2743 src/libslic3r/PrintConfig.cpp:2753 +#: src/libslic3r/PrintConfig.cpp:2762 src/libslic3r/PrintConfig.cpp:2773 +#: src/libslic3r/PrintConfig.cpp:2785 src/libslic3r/PrintConfig.cpp:2799 +#: src/libslic3r/PrintConfig.cpp:2807 src/libslic3r/PrintConfig.cpp:2808 +#: src/libslic3r/PrintConfig.cpp:2817 src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2840 src/libslic3r/PrintConfig.cpp:2854 +#: src/libslic3r/PrintConfig.cpp:2862 src/libslic3r/PrintConfig.cpp:2873 +#: src/libslic3r/PrintConfig.cpp:2884 src/libslic3r/PrintConfig.cpp:2893 +#: src/libslic3r/PrintConfig.cpp:2903 src/libslic3r/PrintConfig.cpp:2915 msgid "Support material" msgstr "Підтримка" #: src/slic3r/GUI/GUI_Factories.cpp:59 src/slic3r/GUI/GUI_Factories.cpp:135 -#: src/libslic3r/PrintConfig.cpp:3054 src/libslic3r/PrintConfig.cpp:3062 +#: src/libslic3r/PrintConfig.cpp:3142 src/libslic3r/PrintConfig.cpp:3150 msgid "Wipe options" msgstr "Параметри витирання" @@ -3787,330 +5024,351 @@ msgstr "Параметри витирання" msgid "Pad and Support" msgstr "Подушка та підтримки" -#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/GUI_Preview.cpp:245 -#: src/slic3r/GUI/Tab.cpp:1513 src/libslic3r/ExtrusionEntity.cpp:336 -#: src/libslic3r/ExtrusionEntity.cpp:364 src/libslic3r/PrintConfig.cpp:1579 -#: src/libslic3r/PrintConfig.cpp:1585 src/libslic3r/PrintConfig.cpp:1599 -#: src/libslic3r/PrintConfig.cpp:1609 src/libslic3r/PrintConfig.cpp:1617 -#: src/libslic3r/PrintConfig.cpp:1619 +#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/Tab.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1620 src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1638 src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1656 src/libslic3r/PrintConfig.cpp:1658 msgid "Ironing" msgstr "Прасування" -#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1283 -#: src/libslic3r/PrintConfig.cpp:1284 src/libslic3r/PrintConfig.cpp:1299 -#: src/libslic3r/PrintConfig.cpp:1309 +#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1344 src/libslic3r/PrintConfig.cpp:1356 +#: src/libslic3r/PrintConfig.cpp:1366 msgid "Fuzzy Skin" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/GUI_Preview.cpp:220 -#: src/slic3r/GUI/Tab.cpp:1581 src/libslic3r/PrintConfig.cpp:507 -#: src/libslic3r/PrintConfig.cpp:766 src/libslic3r/PrintConfig.cpp:1326 -#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1618 -#: src/libslic3r/PrintConfig.cpp:2020 src/libslic3r/PrintConfig.cpp:2352 -#: src/libslic3r/PrintConfig.cpp:2405 src/libslic3r/PrintConfig.cpp:2903 +#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/Tab.cpp:1536 +#: src/libslic3r/PrintConfig.cpp:526 src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:548 src/libslic3r/PrintConfig.cpp:557 +#: src/libslic3r/PrintConfig.cpp:566 src/libslic3r/PrintConfig.cpp:575 +#: src/libslic3r/PrintConfig.cpp:852 src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1657 +#: src/libslic3r/PrintConfig.cpp:2050 src/libslic3r/PrintConfig.cpp:2383 +#: src/libslic3r/PrintConfig.cpp:2436 src/libslic3r/PrintConfig.cpp:2991 msgid "Speed" msgstr "Швидкість" -#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1623 -#: src/slic3r/GUI/Tab.cpp:2304 src/libslic3r/PrintConfig.cpp:796 -#: src/libslic3r/PrintConfig.cpp:1489 src/libslic3r/PrintConfig.cpp:1997 -#: src/libslic3r/PrintConfig.cpp:2373 src/libslic3r/PrintConfig.cpp:2647 -#: src/libslic3r/PrintConfig.cpp:2675 +#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1585 +#: src/slic3r/GUI/Tab.cpp:2288 src/libslic3r/PrintConfig.cpp:889 +#: src/libslic3r/PrintConfig.cpp:1530 src/libslic3r/PrintConfig.cpp:2027 +#: src/libslic3r/PrintConfig.cpp:2404 src/libslic3r/PrintConfig.cpp:2673 +#: src/libslic3r/PrintConfig.cpp:2701 msgid "Extruders" msgstr "Екструдери" -#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:754 -#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:1218 -#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:2006 -#: src/libslic3r/PrintConfig.cpp:2393 src/libslic3r/PrintConfig.cpp:2656 -#: src/libslic3r/PrintConfig.cpp:2890 +#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:840 +#: src/libslic3r/PrintConfig.cpp:953 src/libslic3r/PrintConfig.cpp:1278 +#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:2036 +#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2682 +#: src/libslic3r/PrintConfig.cpp:2978 msgid "Extrusion Width" msgstr "Ширина екструзії" -#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1533 -#: src/libslic3r/PrintConfig.cpp:517 src/libslic3r/PrintConfig.cpp:528 -#: src/libslic3r/PrintConfig.cpp:544 +#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:631 src/libslic3r/PrintConfig.cpp:642 +#: src/libslic3r/PrintConfig.cpp:655 msgid "Skirt and brim" msgstr "Плінтус та край" -#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 -#: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1645 -#: src/slic3r/GUI/Tab.cpp:1649 src/slic3r/GUI/Tab.cpp:2031 -#: src/slic3r/GUI/Tab.cpp:2402 src/slic3r/GUI/Tab.cpp:4729 -#: src/libslic3r/PrintConfig.cpp:260 src/libslic3r/PrintConfig.cpp:495 -#: src/libslic3r/PrintConfig.cpp:1438 src/libslic3r/PrintConfig.cpp:1525 -#: src/libslic3r/PrintConfig.cpp:1572 src/libslic3r/PrintConfig.cpp:2530 -#: src/libslic3r/PrintConfig.cpp:2540 src/libslic3r/PrintConfig.cpp:3078 -#: src/libslic3r/PrintConfig.cpp:3113 src/libslic3r/PrintConfig.cpp:3124 -#: src/libslic3r/PrintConfig.cpp:3139 src/libslic3r/PrintConfig.cpp:3152 -#: src/libslic3r/PrintConfig.cpp:3161 src/libslic3r/PrintConfig.cpp:3173 -#: src/libslic3r/PrintConfig.cpp:3370 -msgid "Advanced" -msgstr "Розширений" - -#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4663 src/slic3r/GUI/Tab.cpp:4664 -#: src/libslic3r/PrintConfig.cpp:3564 src/libslic3r/PrintConfig.cpp:3571 -#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3589 -#: src/libslic3r/PrintConfig.cpp:3599 src/libslic3r/PrintConfig.cpp:3609 -#: src/libslic3r/PrintConfig.cpp:3646 src/libslic3r/PrintConfig.cpp:3653 -#: src/libslic3r/PrintConfig.cpp:3664 src/libslic3r/PrintConfig.cpp:3674 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3696 -#: src/libslic3r/PrintConfig.cpp:3706 src/libslic3r/PrintConfig.cpp:3715 -#: src/libslic3r/PrintConfig.cpp:3725 src/libslic3r/PrintConfig.cpp:3736 -#: src/libslic3r/PrintConfig.cpp:3744 +#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Tab.cpp:4946 src/slic3r/GUI/Tab.cpp:4948 +#: src/libslic3r/PrintConfig.cpp:3328 src/libslic3r/PrintConfig.cpp:3337 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3356 +#: src/libslic3r/PrintConfig.cpp:3366 src/libslic3r/PrintConfig.cpp:3387 +#: src/libslic3r/PrintConfig.cpp:3410 src/libslic3r/PrintConfig.cpp:3417 +#: src/libslic3r/PrintConfig.cpp:3432 src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3464 +#: src/libslic3r/PrintConfig.cpp:3474 src/libslic3r/PrintConfig.cpp:3488 +#: src/libslic3r/PrintConfig.cpp:3498 src/libslic3r/PrintConfig.cpp:3841 +#: src/libslic3r/PrintConfig.cpp:3861 src/libslic3r/PrintConfig.cpp:3868 +#: src/libslic3r/PrintConfig.cpp:3876 msgid "Supports" msgstr "Підтримки" -#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4704 src/slic3r/GUI/Tab.cpp:4705 -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3752 -#: src/libslic3r/PrintConfig.cpp:3759 src/libslic3r/PrintConfig.cpp:3773 -#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3794 -#: src/libslic3r/PrintConfig.cpp:3816 src/libslic3r/PrintConfig.cpp:3827 -#: src/libslic3r/PrintConfig.cpp:3834 src/libslic3r/PrintConfig.cpp:3841 -#: src/libslic3r/PrintConfig.cpp:3852 src/libslic3r/PrintConfig.cpp:3861 -#: src/libslic3r/PrintConfig.cpp:3870 +#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:590 +#: src/slic3r/GUI/Tab.cpp:4960 src/slic3r/GUI/Tab.cpp:4961 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3884 +#: src/libslic3r/PrintConfig.cpp:3891 src/libslic3r/PrintConfig.cpp:3905 +#: src/libslic3r/PrintConfig.cpp:3916 src/libslic3r/PrintConfig.cpp:3926 +#: src/libslic3r/PrintConfig.cpp:3948 src/libslic3r/PrintConfig.cpp:3959 +#: src/libslic3r/PrintConfig.cpp:3966 src/libslic3r/PrintConfig.cpp:3973 +#: src/libslic3r/PrintConfig.cpp:3984 src/libslic3r/PrintConfig.cpp:3993 +#: src/libslic3r/PrintConfig.cpp:4002 msgid "Pad" msgstr "Подушка" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4722 -#: src/slic3r/GUI/Tab.cpp:4723 src/libslic3r/SLA/Hollowing.cpp:73 -#: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3880 -#: src/libslic3r/PrintConfig.cpp:3887 src/libslic3r/PrintConfig.cpp:3897 -#: src/libslic3r/PrintConfig.cpp:3906 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4978 +#: src/slic3r/GUI/Tab.cpp:4979 src/libslic3r/SLA/Hollowing.cpp:86 +#: src/libslic3r/SLA/Hollowing.cpp:91 src/libslic3r/SLA/Hollowing.cpp:106 +#: src/libslic3r/SLA/Hollowing.cpp:115 src/libslic3r/PrintConfig.cpp:4012 +#: src/libslic3r/PrintConfig.cpp:4019 src/libslic3r/PrintConfig.cpp:4029 +#: src/libslic3r/PrintConfig.cpp:4038 msgid "Hollowing" msgstr "Випорожнення" -#: src/slic3r/GUI/GUI_Factories.cpp:160 +#: src/slic3r/GUI/GUI_Factories.cpp:159 msgid "Add part" msgstr "Додати частину" -#: src/slic3r/GUI/GUI_Factories.cpp:161 +#: src/slic3r/GUI/GUI_Factories.cpp:160 msgid "Add negative volume" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:162 +#: src/slic3r/GUI/GUI_Factories.cpp:161 msgid "Add modifier" msgstr "Додати модифікатор" -#: src/slic3r/GUI/GUI_Factories.cpp:163 +#: src/slic3r/GUI/GUI_Factories.cpp:162 msgid "Add support blocker" msgstr "Додати блокувальник підтримок" -#: src/slic3r/GUI/GUI_Factories.cpp:164 +#: src/slic3r/GUI/GUI_Factories.cpp:163 msgid "Add support enforcer" msgstr "Додати примусову підтримку" -#: src/slic3r/GUI/GUI_Factories.cpp:300 +#: src/slic3r/GUI/GUI_Factories.cpp:169 +msgid "Add text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:170 +msgid "Add negative text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:171 +msgid "Add text modifier" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:307 msgid "Select showing settings" msgstr "Виберіть налаштування для показу" -#: src/slic3r/GUI/GUI_Factories.cpp:407 src/slic3r/GUI/GUI_Factories.cpp:412 -#: src/slic3r/GUI/GUI_Factories.cpp:556 src/slic3r/GUI/GUI_Factories.cpp:562 +#: src/slic3r/GUI/GUI_Factories.cpp:414 src/slic3r/GUI/GUI_Factories.cpp:419 +#: src/slic3r/GUI/GUI_Factories.cpp:625 src/slic3r/GUI/GUI_Factories.cpp:631 #, c-format, boost-format msgid "Quick Add Settings (%s)" msgstr "Швидке додання налаштувань (%s)" -#: src/slic3r/GUI/GUI_Factories.cpp:444 +#: src/slic3r/GUI/GUI_Factories.cpp:460 msgid "Remove the selected object" msgstr "Видалити вибраний об'єкт" -#: src/slic3r/GUI/GUI_Factories.cpp:456 +#: src/slic3r/GUI/GUI_Factories.cpp:475 msgid "Load" msgstr "Завантажити" -#: src/slic3r/GUI/GUI_Factories.cpp:461 src/slic3r/GUI/GUI_Factories.cpp:501 -#: src/slic3r/GUI/GUI_Factories.cpp:505 +#: src/slic3r/GUI/GUI_Factories.cpp:481 src/slic3r/GUI/GUI_Factories.cpp:566 +#: src/slic3r/GUI/GUI_Factories.cpp:570 msgid "Box" msgstr "Коробка" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Cylinder" msgstr "Циліндр" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Slab" msgstr "Плита" -#: src/slic3r/GUI/GUI_Factories.cpp:471 +#: src/slic3r/GUI/GUI_Factories.cpp:493 msgid "Gallery" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:488 src/slic3r/GUI/GUI_Factories.cpp:526 +#: src/slic3r/GUI/GUI_Factories.cpp:529 src/slic3r/GUI/GUI_Factories.cpp:549 +#: src/slic3r/GUI/GUI_ObjectList.cpp:660 +msgid "Text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:555 src/slic3r/GUI/GUI_Factories.cpp:558 +#: src/slic3r/GUI/GUI_Factories.cpp:595 msgid "Height range Modifier" msgstr "Модифікатор діапазону висот" -#: src/slic3r/GUI/GUI_Factories.cpp:535 +#: src/slic3r/GUI/GUI_Factories.cpp:604 msgid "Add settings" msgstr "Додати налаштування" -#: src/slic3r/GUI/GUI_Factories.cpp:626 +#: src/slic3r/GUI/GUI_Factories.cpp:695 msgid "Change type" msgstr "Змінити тип" -#: src/slic3r/GUI/GUI_Factories.cpp:636 src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:705 src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Object" msgstr "Встановити як окремий об’єкт" -#: src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Objects" msgstr "Встановити як окремі об’єкти" -#: src/slic3r/GUI/GUI_Factories.cpp:658 +#: src/slic3r/GUI/GUI_Factories.cpp:727 msgid "Printable" msgstr "Для друку" -#: src/slic3r/GUI/GUI_Factories.cpp:686 +#: src/slic3r/GUI/GUI_Factories.cpp:755 src/slic3r/GUI/GUI_ObjectList.cpp:2070 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2582 +msgid "Invalidate cut info" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:770 msgid "Rename" msgstr "Перейменувати" -#: src/slic3r/GUI/GUI_Factories.cpp:696 +#: src/slic3r/GUI/GUI_Factories.cpp:780 msgid "Fix through the Netfabb" msgstr "Виправити за допомогою NetFabb" -#: src/slic3r/GUI/GUI_Factories.cpp:715 -msgid "Export as STL" -msgstr "Експортувати як STL" +#: src/slic3r/GUI/GUI_Factories.cpp:799 +msgid "Export as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:726 +#: src/slic3r/GUI/GUI_Factories.cpp:810 msgid "Reload the selected volumes from disk" msgstr "Перезавантажити вибрані часті з диска" -#: src/slic3r/GUI/GUI_Factories.cpp:733 src/slic3r/GUI/Plater.cpp:3568 +#: src/slic3r/GUI/GUI_Factories.cpp:817 src/slic3r/GUI/Plater.cpp:3602 msgid "Replace with STL" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:733 +#: src/slic3r/GUI/GUI_Factories.cpp:817 msgid "Replace the selected volume with new STL" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Set extruder for selected items" msgstr "Встановити екструдер для вибраних елементів" -#: src/slic3r/GUI/GUI_Factories.cpp:778 src/slic3r/Utils/Repetier.cpp:126 -#: src/slic3r/Utils/Repetier.cpp:209 src/libslic3r/PrintConfig.cpp:635 -#: src/libslic3r/PrintConfig.cpp:2770 +#: src/slic3r/GUI/GUI_Factories.cpp:862 src/slic3r/Utils/Repetier.cpp:145 +#: src/slic3r/Utils/Repetier.cpp:226 src/libslic3r/PrintConfig.cpp:738 +#: src/libslic3r/PrintConfig.cpp:2790 src/libslic3r/PrintConfig.cpp:3851 msgid "Default" msgstr "За замовчуванням" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale to print volume" msgstr "Масштабувати під область друку" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale the selected object to fit the print volume" msgstr "Масштабуйте вибраний об'єкт відповідно до об'єму столу" -#: src/slic3r/GUI/GUI_Factories.cpp:835 src/slic3r/GUI/Plater.cpp:5655 +#: src/slic3r/GUI/GUI_Factories.cpp:921 src/slic3r/GUI/Plater.cpp:6213 msgid "Convert from imperial units" msgstr "Конвертувати з імперських одиниць" -#: src/slic3r/GUI/GUI_Factories.cpp:836 src/slic3r/GUI/Plater.cpp:5656 +#: src/slic3r/GUI/GUI_Factories.cpp:922 src/slic3r/GUI/Plater.cpp:6214 msgid "Revert conversion from imperial units" msgstr "Повернути конвертацію з імперських одиниць" -#: src/slic3r/GUI/GUI_Factories.cpp:837 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:923 src/slic3r/GUI/Plater.cpp:6215 msgid "Convert from meters" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:838 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:924 src/slic3r/GUI/Plater.cpp:6215 msgid "Revert conversion from meters" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2135 -#: src/libslic3r/PrintConfig.cpp:4523 +#: src/slic3r/GUI/GUI_Factories.cpp:945 src/slic3r/GUI/GUI_ObjectList.cpp:2290 +#: src/libslic3r/PrintConfig.cpp:4689 msgid "Merge" msgstr "Об’єднати" -#: src/slic3r/GUI/GUI_Factories.cpp:859 +#: src/slic3r/GUI/GUI_Factories.cpp:945 msgid "Merge objects to the one multipart object" msgstr "Об'єднати об'єкти в один багаточастковий об'єкт" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Along X axis" msgstr "Уздовж осі X" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Mirror the selected object along the X axis" msgstr "Віддзеркалити виділений об'єкт уздовж осі Х" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Along Y axis" msgstr "Уздовж осі Y" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Mirror the selected object along the Y axis" msgstr "Віддзеркалити виділений об'єкт уздовж осі Y" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Along Z axis" msgstr "Уздовж осі Z" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Mirror the selected object along the Z axis" msgstr "Віддзеркалити виділений об'єкт уздовж осі Z" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror" msgstr "Віддзеркалити" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror the selected object" msgstr "Віддзеркалити виділений об'єкт" -#: src/slic3r/GUI/GUI_Factories.cpp:901 src/slic3r/GUI/GUI_ObjectList.cpp:1696 +#: src/slic3r/GUI/GUI_Factories.cpp:977 +msgid "Edit text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:999 +msgid "Ability to change text, font, size, ..." +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1021 src/slic3r/GUI/GUI_ObjectList.cpp:1793 msgid "Add Shape" msgstr "Додати форму" -#: src/slic3r/GUI/GUI_Factories.cpp:937 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "To objects" msgstr "На об'єкти" -#: src/slic3r/GUI/GUI_Factories.cpp:937 src/slic3r/GUI/GUI_Factories.cpp:954 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "Split the selected object into individual objects" msgstr "Розділити вибраний об'єкт на окремі об'єкти" -#: src/slic3r/GUI/GUI_Factories.cpp:940 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 msgid "To parts" msgstr "На частини" -#: src/slic3r/GUI/GUI_Factories.cpp:940 src/slic3r/GUI/GUI_Factories.cpp:975 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 src/slic3r/GUI/GUI_Factories.cpp:1097 msgid "Split the selected object into individual parts" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4552 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 src/slic3r/GUI/GUI_Factories.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:4718 msgid "Split" msgstr "Розділити" -#: src/slic3r/GUI/GUI_Factories.cpp:944 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 msgid "Split the selected object" msgstr "Розділити вибраний об'єкт" -#: src/slic3r/GUI/GUI_Factories.cpp:1084 +#: src/slic3r/GUI/GUI_Factories.cpp:1225 src/slic3r/GUI/GUI_Factories.cpp:1243 +msgid "Set number of instances" +msgstr "Встановити кількість екземплярів" + +#: src/slic3r/GUI/GUI_Factories.cpp:1225 +msgid "Change the number of instances of the selected objects" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1237 msgid "Add one more instance of the selected object" msgstr "Додати ще один екземпляр вибраного об’єкта" -#: src/slic3r/GUI/GUI_Factories.cpp:1087 +#: src/slic3r/GUI/GUI_Factories.cpp:1240 msgid "Remove one instance of the selected object" msgstr "Видалити один екземпляр вибраного об’єкта" -#: src/slic3r/GUI/GUI_Factories.cpp:1090 -msgid "Set number of instances" -msgstr "Встановити кількість екземплярів" - -#: src/slic3r/GUI/GUI_Factories.cpp:1090 +#: src/slic3r/GUI/GUI_Factories.cpp:1243 msgid "Change the number of instances of the selected object" msgstr "Змінити кількість екземплярів виділеного об'єкта" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill bed with instances" msgstr "Заповнити стіл екземплярами" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill the remaining area of bed with instances of the selected object" msgstr "Заповнити залишок столу екземплярами обраного об'єкта" @@ -4130,20 +5388,24 @@ msgstr "Видалити діапазон шарів" msgid "Add layer range" msgstr "Додати діапазон шарів" -#: src/slic3r/GUI/GUI_ObjectList.cpp:297 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:323 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 msgid "Name" msgstr "Ім'я" -#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:480 +#: src/slic3r/GUI/GUI_ObjectList.cpp:342 src/slic3r/GUI/GUI_ObjectList.cpp:513 msgid "Editing" msgstr "Редагування" -#: src/slic3r/GUI/GUI_ObjectList.cpp:400 +#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +msgid "Wrong volume index " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:433 msgid "No errors detected" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:409 +#: src/slic3r/GUI/GUI_ObjectList.cpp:442 #, c-format, boost-format msgid "Auto-repaired %1$d error" msgid_plural "Auto-repaired %1$d errors" @@ -4151,7 +5413,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:415 +#: src/slic3r/GUI/GUI_ObjectList.cpp:448 #, c-format, boost-format msgid "%1$d degenerate facet" msgid_plural "%1$d degenerate facets" @@ -4159,7 +5421,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:450 #, c-format, boost-format msgid "%1$d edge fixed" msgid_plural "%1$d edges fixed" @@ -4167,7 +5429,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:452 #, c-format, boost-format msgid "%1$d facet removed" msgid_plural "%1$d facets removed" @@ -4175,7 +5437,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:421 +#: src/slic3r/GUI/GUI_ObjectList.cpp:454 #, c-format, boost-format msgid "%1$d facet reversed" msgid_plural "%1$d facets reversed" @@ -4183,7 +5445,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +#: src/slic3r/GUI/GUI_ObjectList.cpp:456 #, c-format, boost-format msgid "%1$d backward edge" msgid_plural "%1$d backward edges" @@ -4191,7 +5453,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:426 src/slic3r/GUI/GUI_ObjectList.cpp:429 +#: src/slic3r/GUI/GUI_ObjectList.cpp:459 src/slic3r/GUI/GUI_ObjectList.cpp:462 #, c-format, boost-format msgid "%1$d open edge" msgid_plural "%1$d open edges" @@ -4199,240 +5461,284 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:428 +#: src/slic3r/GUI/GUI_ObjectList.cpp:461 msgid "Remaining errors" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:436 +#: src/slic3r/GUI/GUI_ObjectList.cpp:469 msgid "Right button click the icon to fix STL through Netfabb" msgstr "Клацніть правою кнопкою миші, щоб виправити STL за допомогою Netfabb" -#: src/slic3r/GUI/GUI_ObjectList.cpp:482 +#: src/slic3r/GUI/GUI_ObjectList.cpp:515 msgid "Right button click the icon to change the object settings" msgstr "" "Клацніть правою кнопкою миші на піктограмі, щоб змінити налаштування об'єкта" -#: src/slic3r/GUI/GUI_ObjectList.cpp:484 +#: src/slic3r/GUI/GUI_ObjectList.cpp:517 msgid "Click the icon to change the object settings" msgstr "Клацніть на піктограмі, щоб змінити налаштування об'єкта" -#: src/slic3r/GUI/GUI_ObjectList.cpp:488 +#: src/slic3r/GUI/GUI_ObjectList.cpp:521 msgid "Right button click the icon to change the object printable property" msgstr "" "Клацніть правою кнопкою миші на піктограмі, щоб змінити властивість друку " "для об'єкта" -#: src/slic3r/GUI/GUI_ObjectList.cpp:490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:523 msgid "Click the icon to change the object printable property" msgstr "Клацніть на піктограмі, щоб змінити властивість друку для об'єкта" -#: src/slic3r/GUI/GUI_ObjectList.cpp:616 +#: src/slic3r/GUI/GUI_ObjectList.cpp:649 msgid "Change Extruder" msgstr "Змінити екструдер" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Object" msgstr "Перейменувати об'єкт" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Sub-object" msgstr "Перейменувати підоб'єкт" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1242 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4006 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1307 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4589 msgid "Instances to Separated Objects" msgstr "Змінити екземпляри на окремі об'єкти" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Volumes in Object reordered" msgstr "Об’єкт впорядковано" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Object reordered" msgstr "Об’єкт впорядковано" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1298 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1363 msgid "Add Settings for Layers" msgstr "Додати налаштування для шарів" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1299 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1364 msgid "Add Settings for Sub-object" msgstr "Додати налаштування для підоб'єкту" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1300 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1365 msgid "Add Settings for Object" msgstr "Додати налаштування для об'єкту" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1339 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1404 msgid "Add Settings Bundle for Height range" msgstr "Додати пакет налаштувань для діапазону висот" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1340 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1405 msgid "Add Settings Bundle for Sub-object" msgstr "Додати пакет налаштувань для підоб'єкту" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1341 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1406 msgid "Add Settings Bundle for Object" msgstr "Додати пакет налаштувань для об'єкту" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Part" msgstr "Завантажити частину" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1509 src/slic3r/GUI/Plater.cpp:2380 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1582 src/slic3r/GUI/Plater.cpp:2453 msgid "Loading" msgstr "Завантаження" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1540 src/slic3r/GUI/Plater.cpp:2417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1617 src/slic3r/GUI/Plater.cpp:2494 msgid "Loading file" msgstr "Завантаження файлу" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1548 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1625 msgid "Error!" msgstr "Помилка!" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1638 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1721 msgid "Add Generic Subobject" msgstr "Додати загальний підоб'єкт" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1663 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1761 msgid "Generic" msgstr "Загальний" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shape from Gallery" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shapes from Gallery" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1830 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1945 msgid "Remove paint-on supports" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1837 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 msgid "Remove paint-on seam" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1844 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 msgid "Remove Multi Material painting" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1850 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1972 msgid "Shift objects to bed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1856 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1978 msgid "Remove variable layer height" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1877 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1999 msgid "Delete Settings" msgstr "Видалити налаштування" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1901 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2023 msgid "Delete All Instances from Object" msgstr "Видалити всі екземпляри з об’єкта" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1917 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2039 msgid "Delete Height Range" msgstr "Видалити діапазон висот" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1949 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2057 +msgid "Delete connector from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2058 +msgid "Delete solid part from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2059 +msgid "Delete negative volume from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2061 +msgid "" +"To save cut information you can delete all connectors from all related " +"objects." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2064 +msgid "" +"This action will break a cut information.\n" +"After that PrusaSlicer can't guarantee model consistency.\n" +"\n" +"To manipulate with solid parts or negative volumes you have to invalidate " +"cut infornation first." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2072 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2612 +msgid "Delete all connectors" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2103 msgid "From Object List You can't delete the last solid part from object." msgstr "" "Зі списку об’єктів Ви не можете видалити останню суцільну частину з об’єкта." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1953 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2112 msgid "Delete Subobject" msgstr "Видалити підоб'єкт" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1976 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2138 msgid "Last instance of an object cannot be deleted." msgstr "Не можна видалити останній екземпляр з об'єкту." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1980 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +msgid "Instance cannot be deleted from cut object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2146 msgid "Delete Instance" msgstr "Видалити екземпляр" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2004 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2170 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" "Вибраний об'єкт не можна розділити, оскільки він містить лише одну частину." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2008 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2174 msgid "Split to Parts" msgstr "Розділити на частини" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2177 src/slic3r/GUI/Plater.cpp:3133 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"splitting the object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2297 msgid "Merged" msgstr "Об’єднано" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2237 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2392 msgid "Merge all parts to the one single object" msgstr "Об’єднати всі частини в єдиний об’єкт" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2269 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2424 msgid "Add Layers" msgstr "Додати шари" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2438 -msgid "Group manipulation" -msgstr "Маніпулювання групою" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2695 +msgid "Cut Connectors information" +msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2453 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2705 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2768 msgid "Object manipulation" msgstr "Маніпулювання об'єктом" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2486 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2714 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1472 +msgid "Group manipulation" +msgstr "Маніпулювання групою" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2802 msgid "Object Settings to modify" msgstr "Параметри об'єкту, які можна змінювати" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2806 msgid "Part Settings to modify" msgstr "Параметри частини, які можна змінювати" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2495 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2811 msgid "Layer range Settings to modify" msgstr "Пакет налаштувань для діапазону висот" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2501 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2817 msgid "Part manipulation" msgstr "Маніпулювання частиною" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2825 msgid "Instance manipulation" msgstr "Маніпулювання екземпляром" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Height ranges" msgstr "Діапазони висот" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Settings for height range" msgstr "Налаштування діапазону висот" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2750 -msgid "Delete Selected Item" -msgstr "Видалити вибраний елемент" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2943 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3363 msgid "Delete Selected" msgstr "Видалити вибране" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3019 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3047 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3067 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3441 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3469 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3489 msgid "Add Height Range" msgstr "Додати діапазон висот" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3113 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3535 msgid "" "Cannot insert a new layer range after the current layer range.\n" "The next layer range is too thin to be split to two\n" @@ -4443,7 +5749,7 @@ msgstr "" "два\n" "без порушення мінімальної висоти шару." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3117 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3539 msgid "" "Cannot insert a new layer range between the current and the next layer " "range.\n" @@ -4455,7 +5761,7 @@ msgstr "" "Розрив між діапазоном поточного шару та діапазоном наступного шару\n" "тонше мінімально допустимої висоти шару." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3122 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3544 msgid "" "Cannot insert a new layer range after the current layer range.\n" "Current layer range overlaps with the next layer range." @@ -4463,238 +5769,287 @@ msgstr "" "Не вдається вставити новий діапазон шарів після поточного діапазону шарів.\n" "Діапазон поточного шару перекривається з діапазоном наступного шару." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3603 msgid "Edit Height Range" msgstr "Редагування діапазону висот" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3500 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3989 msgid "Selection-Remove from list" msgstr "Виділення - Видалено зі списку" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4001 msgid "Selection-Add from list" msgstr "Виділення - Додано зі списку" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3649 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4138 msgid "Object or Instance" msgstr "\"Об’єкт\" або \"Екземпляр\"" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Part" -msgstr "\"Частина\"" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 msgid "Layer" msgstr "\"Шар\"" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3652 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4141 msgid "Unsupported selection" msgstr "Непідтримуваний вибір" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3653 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 #, c-format, boost-format msgid "You started your selection with %s Item." msgstr "Ви розпочали свій вибір з елемента %s." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3654 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4143 #, c-format, boost-format msgid "In this mode you can select only other %s Items%s" msgstr "В цьому режимі ви можете вибирати тільки інші %s %s" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3657 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4146 msgid "of a current Object" msgstr "поточного \"Об'єкта\"" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3662 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3737 src/slic3r/GUI/Plater.cpp:181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4151 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4226 src/slic3r/GUI/Plater.cpp:197 msgid "Info" msgstr "Інфо" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3784 -msgid "You can't change a type of the last solid part of the object." -msgstr "Ви не можете змінити тип останньої твердої частини об’єкта." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 msgid "Negative Volume" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Modifier" -msgstr "Модифікатор" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Blocker" msgstr "Блокувальник підтримок" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Enforcer" msgstr "Примусова підтримка" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Select type of part" msgstr "Змінити тип частини" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3795 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4359 msgid "Change Part Type" msgstr "Змінити тип деталі" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Enter new name" msgstr "Введіть нову назву" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Renaming" msgstr "Перейменування" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4091 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4681 msgid "Repairing model" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4120 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4691 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"repairing the mesh." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4711 msgid "Fix through NetFabb" msgstr "Виправити за допомогою NetFabb" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4123 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4714 msgid "Fixing through NetFabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4153 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4744 msgid "The following model was repaired successfully" msgid_plural "The following models were repaired successfully" msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4159 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4750 msgid "Folowing model repair failed" msgid_plural "Folowing models repair failed" msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4164 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4755 msgid "Repairing was canceled" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4276 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4869 msgid "Change Extruders" msgstr "Змінити екструдери" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Printable group" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Unprintable group" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Printable" msgstr "Встановити \"Для друку\"" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Unprintable" msgstr "Встановити \"Не для друку\"" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Printable Instance" msgstr "Встановити екземпляр \"Для друку\"" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Unprintable Instance" msgstr "Встановити екземпляр \"Не для друку\"" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:55 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:84 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:61 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:96 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1132 msgid "World coordinates" msgstr "Світові координати" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:56 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:85 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:97 msgid "Local coordinates" msgstr "Локальні координати" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:60 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:67 msgid "Select coordinate space, in which the transformation will be performed." msgstr "Виберіть простір координат, в якому буде виконуватися перетворення." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:141 src/libslic3r/GCode.cpp:540 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:157 src/libslic3r/GCode.cpp:491 msgid "Object name" msgstr "Назва об'єкту" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:201 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:521 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:221 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:710 msgid "Position" msgstr "Позиція" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:202 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:522 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:222 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:711 #: src/slic3r/GUI/Mouse3DController.cpp:478 #: src/slic3r/GUI/Mouse3DController.cpp:499 msgid "Rotation" msgstr "Обертання" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:250 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:239 +msgid "Size [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "Mirror along" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +#, c-format, boost-format +msgid " %c " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "axis" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:279 #, c-format, boost-format msgid "Toggle %c axis mirroring" msgstr "Переключити дзеркальне відображення за осею %c" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:284 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:329 msgid "Set Mirror" msgstr "Встановити віддзеркалення" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:324 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:336 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:348 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:374 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:387 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:393 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:401 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:428 msgid "Drop to bed" msgstr "Поставити на стіл" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:445 msgid "Reset rotation" msgstr "Скинути обертання" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 msgid "Reset Rotation" msgstr "Скинути обертання" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:398 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:400 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:490 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:519 msgid "Reset scale" msgstr "Скинути масштаб" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:539 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546 +msgid "Reset skew" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:553 msgid "Inches" msgstr "Дюймів" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:523 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:712 msgid "Scale factors" msgstr "Масштаб" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:577 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:740 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:752 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:793 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:801 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +msgid "Rotate (relative)" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:751 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:800 +msgid "Translate (relative) [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:829 msgid "Translate" msgstr "Перемістити" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:640 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:905 msgid "" "You cannot use non-uniform scaling mode for multiple objects/parts selection" msgstr "" "Не можна використовувати нерівномірний режим масштабування, коли вибрано " "кілька об’єктів/частей" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:820 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +msgid "Left handed" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1133 +msgid "Object coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1134 +msgid "Part coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1176 msgid "Set Position" msgstr "Встановити позицію" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:852 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1220 msgid "Set Orientation" msgstr "Встановити орієнтацію" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:931 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1351 msgid "Set Scale" msgstr "Встановити масштаб" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1368 +msgid "Set Size" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1427 msgid "" "The currently manipulated object is tilted (rotation angles are not " "multiples of 90°).\n" @@ -4707,7 +6062,7 @@ msgstr "" "системі координат,\n" "як тільки обертання буде вбудовано в координати об’єкта." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:983 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1430 msgid "" "This operation is irreversible.\n" "Do you want to proceed?" @@ -4733,169 +6088,68 @@ msgstr "Видалити параметр %s" msgid "Change Option %s" msgstr "Змінити параметр %s" -#: src/slic3r/GUI/GUI_Preview.cpp:211 -msgid "View" -msgstr "Вид" - -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/libslic3r/PrintConfig.cpp:808 -msgid "Height" -msgstr "Висота" - -#: src/slic3r/GUI/GUI_Preview.cpp:219 src/libslic3r/PrintConfig.cpp:3032 -msgid "Width" -msgstr "Ширина" - -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2016 -msgid "Fan speed" -msgstr "Швидкість вентилятора" - -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1991 -msgid "Temperature" -msgstr "Температура" - -#: src/slic3r/GUI/GUI_Preview.cpp:223 -msgid "Volumetric flow rate" -msgstr "Об'ємна швидкість потоку" - -#: src/slic3r/GUI/GUI_Preview.cpp:228 -msgid "Show" -msgstr "Показати" - -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/GUI_Preview.cpp:254 -msgid "Feature types" -msgstr "Типи ознак" - -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:330 -#: src/libslic3r/ExtrusionEntity.cpp:352 -msgid "Perimeter" -msgstr "Периметр" - -#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:331 -#: src/libslic3r/ExtrusionEntity.cpp:354 -msgid "External perimeter" -msgstr "Зовнішній периметр" - -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:332 -#: src/libslic3r/ExtrusionEntity.cpp:356 -msgid "Overhang perimeter" -msgstr "Нависаючий периметр" - -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:333 -#: src/libslic3r/ExtrusionEntity.cpp:358 -msgid "Internal infill" -msgstr "Внутрішнє наповнення" - -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:334 -#: src/libslic3r/ExtrusionEntity.cpp:360 src/libslic3r/PrintConfig.cpp:1407 -#: src/libslic3r/PrintConfig.cpp:2392 src/libslic3r/PrintConfig.cpp:2404 -msgid "Solid infill" -msgstr "Суцільне наповнення" - -#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:335 -#: src/libslic3r/ExtrusionEntity.cpp:362 src/libslic3r/PrintConfig.cpp:1416 -#: src/libslic3r/PrintConfig.cpp:2889 src/libslic3r/PrintConfig.cpp:2902 -msgid "Top solid infill" -msgstr "Верхнє суцільне наповнення" - -#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:337 -#: src/libslic3r/ExtrusionEntity.cpp:366 -msgid "Bridge infill" -msgstr "Мостове наповнення" - -#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:338 -#: src/libslic3r/ExtrusionEntity.cpp:368 src/libslic3r/PrintConfig.cpp:1325 -msgid "Gap fill" -msgstr "Заповнення розриву" - -#: src/slic3r/GUI/GUI_Preview.cpp:248 src/libslic3r/ExtrusionEntity.cpp:339 -#: src/libslic3r/ExtrusionEntity.cpp:370 -msgid "Skirt/Brim" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:250 src/libslic3r/ExtrusionEntity.cpp:341 -#: src/libslic3r/ExtrusionEntity.cpp:374 src/libslic3r/PrintConfig.cpp:2736 -msgid "Support material interface" -msgstr "Інтерфейс підтримуючого матеріалу" - -#: src/slic3r/GUI/GUI_Preview.cpp:251 src/slic3r/GUI/Tab.cpp:1634 -#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/ExtrusionEntity.cpp:376 -msgid "Wipe tower" -msgstr "Вежа витирання" - -#: src/slic3r/GUI/GUI_Preview.cpp:728 +#: src/slic3r/GUI/GUI_Preview.cpp:581 msgid "NOTE:" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:729 +#: src/slic3r/GUI/GUI_Preview.cpp:582 #, boost-format msgid "Sliced object \"%1%\" looks like a logo or a sign" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:730 +#: src/slic3r/GUI/GUI_Preview.cpp:583 msgid "Apply color change automatically" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:1058 -msgid "Shells" -msgstr "Оболонки" - -#: src/slic3r/GUI/GUI_Preview.cpp:1059 -msgid "Tool marker" -msgstr "Маркер інструменту" - -#: src/slic3r/GUI/GUI_Preview.cpp:1060 -msgid "Legend/Estimated printing time" -msgstr "Легенда / Приблизний час друку" - -#: src/slic3r/GUI/HintNotification.cpp:771 -#: src/slic3r/GUI/HintNotification.cpp:797 -#: src/slic3r/GUI/NotificationManager.cpp:374 -#: src/slic3r/GUI/NotificationManager.cpp:391 +#: src/slic3r/GUI/HintNotification.cpp:773 +#: src/slic3r/GUI/HintNotification.cpp:799 +#: src/slic3r/GUI/NotificationManager.cpp:457 +#: src/slic3r/GUI/NotificationManager.cpp:474 msgid "More" msgstr "Більше" -#: src/slic3r/GUI/HintNotification.cpp:912 +#: src/slic3r/GUI/HintNotification.cpp:914 msgid "Open Preferences." msgstr "" -#: src/slic3r/GUI/HintNotification.cpp:1004 +#: src/slic3r/GUI/HintNotification.cpp:1006 msgid "Open Documentation in web browser." msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:527 +#: src/slic3r/GUI/ImGuiWrapper.cpp:666 msgid "Edit" msgstr "Змінити" -#: src/slic3r/GUI/ImGuiWrapper.cpp:960 src/slic3r/GUI/Search.cpp:470 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1166 src/slic3r/GUI/Search.cpp:531 msgid "Use for search" msgstr "Використовуйте для пошуку" -#: src/slic3r/GUI/ImGuiWrapper.cpp:961 src/slic3r/GUI/Search.cpp:463 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1167 src/slic3r/GUI/Search.cpp:524 msgid "Category" msgstr "Категорія" -#: src/slic3r/GUI/ImGuiWrapper.cpp:963 src/slic3r/GUI/Search.cpp:465 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1169 src/slic3r/GUI/Search.cpp:526 msgid "Search in English" msgstr "Шукати англійською мовою" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:174 -msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "" -"Не вдалося розташувати об’єкти моделі! Деякі геометрії можуть бути невірними." - -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:183 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:168 msgid "Arranging" msgstr "Розташування" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:207 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:204 msgid "Arranging canceled." msgstr "Розташування скасовано." -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:208 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:205 msgid "Arranging done." msgstr "Розташування виконано." -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:253 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:225 +msgid "Could not arrange model objects! Some geometries may be invalid." +msgstr "" +"Не вдалося розташувати об’єкти моделі! Деякі геометрії можуть бути невірними." + +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:265 #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -4903,39 +6157,82 @@ msgid "" "%s" msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:119 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:108 msgid "Filling bed" msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:130 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:140 msgid "Bed filling canceled." msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:131 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:141 msgid "Bed filling done." msgstr "" -#: src/slic3r/GUI/Jobs/Job.cpp:111 -msgid "ERROR: not enough resources to execute a new job." -msgstr "ПОМИЛКА: недостатньо ресурсів для виконання нового завдання." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:148 src/slic3r/GUI/Jobs/EmbossJob.cpp:596 +msgid "Can't create empty volume." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:201 +msgid "Can't create empty object." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:208 +msgid "Add Emboss text object" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:247 +msgid "Created text volume is empty. Change text or font." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:465 +msgid "" +"It is used default volume for embossed text, try to change text or font to " +"fix it." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:549 +#, boost-format +msgid "Text: %1%" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:593 +msgid "Bad object to create volume." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:598 +msgid "Add Emboss text Volume" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:698 +msgid "Font doesn't have any shape for given text." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:738 +msgid "There is no volume in projection direction." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:787 +msgid "There is no valid surface for text projection." +msgstr "" -#: src/slic3r/GUI/Jobs/PlaterJob.cpp:13 -msgid "An unexpected error occured" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:823 +msgid "Issue during embossing the text." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:21 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:22 msgid "Best surface quality" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:23 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 msgid "Optimize object rotation for best surface quality." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:25 msgid "Reduced overhang slopes" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:26 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:27 msgid "" "Optimize object rotation to have minimum amount of overhangs needing support " "structures.\n" @@ -4943,243 +6240,223 @@ msgid "" "touching the print bed if no elevation is set." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:30 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:31 msgid "Lowest Z height" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:32 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:33 msgid "Rotate the model to have the lowest z height for faster print time." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:59 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:53 msgid "Searching for optimal orientation" msgstr "Пошук оптимальної орієнтації" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:77 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:83 msgid "Orientation search canceled." msgstr "Пошук орієнтації скасовано." -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:78 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:84 msgid "Orientation found." msgstr "Орієнтація знайдена." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:36 -msgid "Choose SLA archive:" -msgstr "Виберіть SLA-архів:" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:40 -msgid "Import file" -msgstr "Імпорт файлу" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47 -msgid "Import model and profile" -msgstr "Імпорт моделі та профілю" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48 -msgid "Import profile only" -msgstr "Імпорт тільки профілю" - #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:49 -msgid "Import model only" -msgstr "Імпорт тільки моделі" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60 -msgid "Accurate" -msgstr "Точний" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61 -msgid "Balanced" -msgstr "Збалансований" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:62 -msgid "Quick" -msgstr "Швидко" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:140 msgid "Importing SLA archive" msgstr "Імпорт SLA-архіву" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:158 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:77 msgid "" "The SLA archive doesn't contain any presets. Please activate some SLA " "printer preset first before importing that SLA archive." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:164 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:81 +msgid "Import is unavailable for this archive format." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:86 msgid "Importing canceled." msgstr "Імпорт скасовано." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:165 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:87 msgid "Importing done." msgstr "Імпорт виконано." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:187 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:108 msgid "The file does not exist." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:221 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135 msgid "" "The imported SLA archive did not contain any presets. The current SLA " "presets were used as fallback." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:234 src/slic3r/GUI/Plater.cpp:2458 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:148 src/slic3r/GUI/Plater.cpp:2535 msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "" "Ви не можете завантажувати SLA-проект, що містить об'єкт, який складається з " "кількох частин" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:236 src/slic3r/GUI/Plater.cpp:2460 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:150 src/slic3r/GUI/Plater.cpp:2537 msgid "Attention!" msgstr "Увага!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:166 +msgid "The profile in the imported archive is corrupt and will not be loaded." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:178 +msgid "" +"No object could be retrieved from the archive. The slices might be corrupted " +"or missing." +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1184 msgid "Keyboard Shortcuts" msgstr "Гарячі клавіши" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:77 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:86 msgid "New project, clear plater" msgstr "Новий проект, очистити платер" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:78 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 msgid "Open project AMF/3MF with config, clear plater" msgstr "Відкрити проект AMF / 3MF з конфігурацією, очистити стіл" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 msgid "Save project (3mf)" msgstr "Зберегти проект (3mf)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 msgid "Save project as (3mf)" msgstr "Зберегти проект як (3mf)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:81 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 msgid "(Re)slice" msgstr "(Пере)Нарізати" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:83 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:92 msgid "Import STL/3MF/STEP/OBJ/AMF without config, keep plater" msgstr "Імпорт STL/3MF/STEP/OBJ/AMF без конфігурації зі збереженням платеру" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:84 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 msgid "Import Config from ini/amf/3mf/gcode" msgstr "Імпорт конфігурації з INI/AMF/3MF/GCODE" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:85 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "Завантажити конфігурацію з INI/AMF/3MF/GCODE та об’єднати" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6543 src/libslic3r/PrintConfig.cpp:4423 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:96 src/slic3r/GUI/Plater.cpp:948 +#: src/slic3r/GUI/Plater.cpp:7161 src/libslic3r/PrintConfig.cpp:4575 msgid "Export G-code" msgstr "Експорт G-коду" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:97 src/slic3r/GUI/Plater.cpp:7162 msgid "Send G-code" msgstr "Надіслання G-коду" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 msgid "Export config" msgstr "Експорт конфігурації" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 src/slic3r/GUI/Plater.cpp:896 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 src/slic3r/GUI/Plater.cpp:931 msgid "Export to SD card / Flash drive" msgstr "Експорт на SD-карту/флешку" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:91 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 msgid "Eject SD card / Flash drive" msgstr "Від'єднати SD-карту/флешку" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 msgid "Select all objects" msgstr "Вибрати всі об'єкти" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 msgid "Deselect all" msgstr "Скасувати весь вибір" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:95 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 msgid "Delete selected" msgstr "Видалити вибране" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 -msgid "Copy to clipboard" -msgstr "Скопіювати в буфер обміну" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 msgid "Paste from clipboard" msgstr "Вставити з буферу обміну" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Reload plater from disk" msgstr "Перезавантажити стіл з диска" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 msgid "Select Plater Tab" msgstr "Вибрати вкладку Plater" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 msgid "Select Print Settings Tab" msgstr "Вибрати вкладку параметрів друку" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 msgid "Select Filament Settings Tab" msgstr "Вибрати вкладку параметрів філаменту" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 msgid "Select Printer Settings Tab" msgstr "Вибрати вкладку параметрів принтеру" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 msgid "Switch to 3D" msgstr "Переключити на 3D" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 msgid "Switch to Preview" msgstr "Переключити на Перегляд" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 -#: src/slic3r/GUI/PrintHostDialogs.cpp:217 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +#: src/slic3r/GUI/PrintHostDialogs.cpp:267 msgid "Print host upload queue" msgstr "Черга завантаження хоста друку" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/MainFrame.cpp:75 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 src/slic3r/GUI/MainFrame.cpp:77 msgid "Open new instance" msgstr "Відкрити новий екземпляр" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 msgid "Camera view" msgstr "Вид камери" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 msgid "Show/Hide object/instance labels" msgstr "Показати/сховати мітки об’єктів/екземплярів" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Preferences.cpp:46 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Preferences.cpp:57 +#: src/slic3r/GUI/Preferences.cpp:165 src/slic3r/GUI/Preferences.cpp:188 +#: src/slic3r/GUI/Preferences.cpp:207 src/slic3r/GUI/Preferences.cpp:215 msgid "Preferences" msgstr "Преференції" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 msgid "Show keyboard shortcuts list" msgstr "Показати список гарячих клавіш" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 msgid "Commands" msgstr "Команди" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 msgid "Add Instance of the selected object" msgstr "Додати екземпляр вибраного об’єкта" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Remove Instance of the selected object" msgstr "Видалити екземпляр вибраного об’єкта" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 msgid "" "Press to select multiple objects\n" "or move multiple objects with mouse" @@ -5187,140 +6464,144 @@ msgstr "" "Натисніть, щоб вибрати кілька об'єктів\n" "або переміщуйте кілька об’єктів за допомогою миші" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 msgid "Press to activate selection rectangle" msgstr "Натисніть, щоб активувати прямокутник виділення" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 msgid "Press to activate deselection rectangle" msgstr "Натисніть, щоб активувати прямокутник скасування вибору" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Arrow Up" msgstr "Стрілка вгору" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 msgid "Move selection 10 mm in positive Y direction" msgstr "Перемістити виділення на 10 мм у позитивному напрямку за Y" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Arrow Down" msgstr "Стрілка вниз" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 msgid "Move selection 10 mm in negative Y direction" msgstr "Перемістити виділення на 10 мм у негативному напрямку за Y" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Arrow Left" msgstr "Стрілка вліво" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 msgid "Move selection 10 mm in negative X direction" msgstr "Перемістити виділення на 10 мм у негативному напрямку за X" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Arrow Right" msgstr "Стрілка вправо" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 msgid "Move selection 10 mm in positive X direction" msgstr "Перемістити виділення на 10 мм у позитивному напрямку за X" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Any arrow" msgstr "Будь-яка стрілка" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 msgid "Movement step set to 1 mm" msgstr "Встановити крок переміщення на 1 мм" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Movement in camera space" msgstr "Переміщення відносно камери" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Page Up" msgstr "Попередня сторінка" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Rotate selection 45 degrees CCW" msgstr "Повернути вибране на 45 градусів за годинниковою стрілкою" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Page Down" msgstr "Наступна сторінка" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Rotate selection 45 degrees CW" msgstr "Повернути вибране на 45 градусів проти годинникової стрілки" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 msgid "Gizmo move" msgstr "Gizmo переміщення" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 msgid "Gizmo scale" msgstr "Gizmo масштабування" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Gizmo rotate" msgstr "Gizmo обертання" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Gizmo cut" msgstr "Gizmo розрізання" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 msgid "Gizmo Place face on bed" msgstr "Gizmo \"Поверхнею на стіл\"" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 msgid "Gizmo SLA hollow" msgstr "Gizmo SLA-порожнистість" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 msgid "Gizmo SLA support points" msgstr "Gizmo точки SLA-підтримок" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 msgid "Gizmo FDM paint-on supports" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 msgid "Gizmo FDM paint-on seam" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 msgid "Gizmo Multi Material painting" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +msgid "Gizmo Text emboss / engrave" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 msgid "Unselect gizmo or clear selection" msgstr "Скасуйте вибір gizmo або очистіть виділення" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 msgid "Change camera type (perspective, orthographic)" msgstr "Зміна типу камери (перспективна, орфографічна)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 msgid "Zoom to Bed" msgstr "Приблизити до розміру столу" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 msgid "" "Zoom to selected object\n" "or all objects in scene, if none selected" @@ -5328,179 +6609,179 @@ msgstr "" "Приблизити до розміру об'єкту\n" "або до всіх об'єктів сцени, якщо жоден не вибрано" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 msgid "Zoom in" msgstr "Приблизити" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Zoom out" msgstr "Віддалити" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Switch between Editor/Preview" msgstr "Перемикання між Редактором та Попереднім переглядом" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Collapse/Expand the sidebar" msgstr "Згорнути/Розгорнути бічну панель" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled" msgstr "" "Показати/сховати діалогове вікно налаштувань пристроїв 3Dconnexion, якщо " "такі існують" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "Показати/сховати діалогове вікно налаштувань пристроїв 3Dconnexion" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 msgid "Minimize application" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 src/slic3r/GUI/MainFrame.cpp:284 -#: src/slic3r/GUI/MainFrame.cpp:333 src/slic3r/GUI/MainFrame.cpp:445 -#: src/slic3r/GUI/MainFrame.cpp:448 src/slic3r/GUI/MainFrame.cpp:470 -#: src/slic3r/GUI/MainFrame.cpp:473 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 src/slic3r/GUI/MainFrame.cpp:329 +#: src/slic3r/GUI/MainFrame.cpp:378 src/slic3r/GUI/MainFrame.cpp:490 +#: src/slic3r/GUI/MainFrame.cpp:493 src/slic3r/GUI/MainFrame.cpp:515 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Plater" msgstr "Платер" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button" msgstr "" "Всі gizmos: Обертати — ліва кнопка миші; Панорамування — права кнопка миші" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 msgid "Gizmo move: Press to snap by 1mm" msgstr "Gizmo переміщення: Натисніть, щоб зафіксувати переміщення через 1 мм" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 msgid "Gizmo scale: Press to snap by 5%" msgstr "Gizmo масштабування: Натисніть, щоб зафіксувати обертання на 5%" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 msgid "Gizmo scale: Scale selection to fit print volume" msgstr "Gizmo масштабування: Масштабуйте вибране відповідно до об'єму столу" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 msgid "Gizmo scale: Press to activate one direction scaling" msgstr "" "Gizmo масштабування: Натисніть, щоб активувати масштабування в одному " "напрямку" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 msgid "Gizmo scale: Press to scale selected objects around their own center" msgstr "" "Gizmo масштабування: Натисніть, щоб масштабувати вибрані об'єкти навколо їх " "власного центру" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 msgid "Gizmo rotate: Press to rotate selected objects around their own center" msgstr "" "Gizmo обертання: Натисніть, щоб обертати вибрані об'єкти навколо їх власного " "центру" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "Gizmos" msgstr "Всі gizmos" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "" "The following shortcuts are applicable when the specified gizmo is active" msgstr "Наступні гарячі клавіші застосовуються, коли активне вказане gizmo" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 msgid "Set selected items as Printable/Unprintable" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:203 msgid "Set default extruder for the selected items" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 msgid "Set extruder number for the selected items" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 msgid "Objects List" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/MainFrame.cpp:1611 msgid "Open a G-code file" msgstr "Відкрити файл G-кода" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 -#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 -#: src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 src/slic3r/GUI/MainFrame.cpp:1443 +#: src/slic3r/GUI/MainFrame.cpp:1447 src/slic3r/GUI/MainFrame.cpp:1616 +#: src/slic3r/GUI/MainFrame.cpp:1620 msgid "Reload the plater from disk" msgstr "Перезавантажити стіл з диска" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 msgid "Vertical slider - Move active thumb Up" msgstr "Вертикальний повзунок - Перемістити активний повзунок вгору" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:228 msgid "Vertical slider - Move active thumb Down" msgstr "Вертикальний повзунок - Перемістити активний повзунок вниз" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 msgid "Horizontal slider - Move active thumb Left" msgstr "Горизонтальний повзунок - Перемістити активний повзунок вліво" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 msgid "Horizontal slider - Move active thumb Right" msgstr "Горизонтальний повзунок - Перемістити активний повзунок вправо" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:231 msgid "On/Off one layer mode of the vertical slider" msgstr "Увімкнути/Вимкнути одношаровий режим вертикального повзунка" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 -msgid "Show/Hide Legend and Estimated printing time" -msgstr "Показати / Сховати легенду та приблизний час друку" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:232 +msgid "Show/Hide legend" +msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 msgid "Show/Hide G-code window" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4480 -#: src/slic3r/GUI/Tab.cpp:2832 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 src/slic3r/GUI/Plater.cpp:4562 +#: src/slic3r/GUI/Tab.cpp:2736 msgid "Preview" msgstr "Попередній перегляд" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 msgid "Move active thumb Up" msgstr "Перемістити активний повзунок вгору" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 msgid "Move active thumb Down" msgstr "Перемістити активний повзунок вниз" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 msgid "Set upper thumb as active" msgstr "Встановити активним верхній повзунок" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 msgid "Set lower thumb as active" msgstr "Встановити активним нижній повзунок" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 msgid "Add color change marker for current layer" msgstr "Додати маркер зміни кольору для поточного шару" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:238 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:244 msgid "Delete color change marker for current layer" msgstr "Видалити маркер зміни кольору для поточного шару" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:250 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:251 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:245 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:256 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:257 msgid "" "Press to speed up 5 times while moving thumb\n" "with arrow keys or mouse wheel" @@ -5508,11 +6789,11 @@ msgstr "" "Натисніть, щоб мати 5-кратне прискорення під час руху повзунка\n" "за допомогою клавіш зі стрілками або колеса миші" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "Vertical Slider" msgstr "Вертикальний повзунок" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "" "The following shortcuts are applicable in G-code preview when the vertical " "slider is active" @@ -5520,27 +6801,27 @@ msgstr "" "Наведені нижче гарячі клавіші застосовуються у перегляді G-коду, коли " "вертикальний повзунок активний" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Move active thumb Left" msgstr "Перемістити активний повзунок вліво" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Move active thumb Right" msgstr "Перемістити активний повзунок вправо" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Set left thumb as active" msgstr "Встановити активним лівий повзунок" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Set right thumb as active" msgstr "Встановити активним правий повзунок" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "Horizontal Slider" msgstr "Горизонтальний повзунок" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "" "The following shortcuts are applicable in G-code preview when the horizontal " "slider is active" @@ -5548,232 +6829,232 @@ msgstr "" "Наведені нижче гарячі клавіші застосовуються у перегляді G-коду, коли " "горизонтальний повзунок активний" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:278 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:284 msgid "Keyboard shortcuts" msgstr "Гарячі клавіши" -#: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:77 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open a new PrusaSlicer instance" msgstr "Відкрити новий екземпляр PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:93 msgid "G-code preview" msgstr "Перегляд G-коду" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:1388 msgid "Open G-code viewer" msgstr "Відкрити переглядач G-коду" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:91 src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open PrusaSlicer" msgstr "Відкрити PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:93 msgid "Open new G-code viewer" msgstr "Відкрити новий переглядач G-коду" -#: src/slic3r/GUI/MainFrame.cpp:225 +#: src/slic3r/GUI/MainFrame.cpp:227 msgid "Closing PrusaSlicer. Current project is modified." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "PrusaSlicer is closing" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "Closing PrusaSlicer while some presets are modified." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:285 src/slic3r/GUI/MainFrame.cpp:335 -#: src/slic3r/GUI/Tab.hpp:427 src/slic3r/GUI/Tab.hpp:550 +#: src/slic3r/GUI/MainFrame.cpp:330 src/slic3r/GUI/MainFrame.cpp:380 +#: src/slic3r/GUI/Tab.hpp:413 src/slic3r/GUI/Tab.hpp:539 msgid "Print Settings" msgstr "Параметри друку" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:535 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:384 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:520 msgid "Material Settings" msgstr "Параметри матеріалу" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:461 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:382 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:448 msgid "Filament Settings" msgstr "Параметри філаменту" -#: src/slic3r/GUI/MainFrame.cpp:287 src/slic3r/GUI/MainFrame.cpp:341 -#: src/slic3r/GUI/Tab.hpp:503 +#: src/slic3r/GUI/MainFrame.cpp:332 src/slic3r/GUI/MainFrame.cpp:386 +#: src/slic3r/GUI/Tab.hpp:488 msgid "Printer Settings" msgstr "Параметри принтеру" -#: src/slic3r/GUI/MainFrame.cpp:632 src/slic3r/GUI/Plater.cpp:1719 -#: src/slic3r/GUI/Plater.cpp:2850 +#: src/slic3r/GUI/MainFrame.cpp:685 src/slic3r/GUI/Plater.cpp:1728 +#: src/slic3r/GUI/Plater.cpp:2879 msgid "Untitled" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:655 +#: src/slic3r/GUI/MainFrame.cpp:710 msgid "based on Slic3r" msgstr "на основі Slic3r" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Prusa 3D &Drivers" msgstr "Драйвери Prusa3D" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Open the Prusa3D drivers download page in your browser" msgstr "Відкрити сторінку завантаження драйверів Prusa3D у своєму браузері" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Software &Releases" msgstr "Релізи ПЗ" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open the software releases page in your browser" msgstr "Відкрити сторінку релізів PrusaEdition у своєму браузері" -#: src/slic3r/GUI/MainFrame.cpp:1081 +#: src/slic3r/GUI/MainFrame.cpp:1158 #, c-format, boost-format msgid "%s &Website" msgstr "Веб-сайт %s" -#: src/slic3r/GUI/MainFrame.cpp:1082 +#: src/slic3r/GUI/MainFrame.cpp:1159 #, c-format, boost-format msgid "Open the %s website in your browser" msgstr "Відкрити сторінку %s у своєму браузері" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "System &Info" msgstr "Інформація про систему" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "Show system information" msgstr "Показати інформацію про систему" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show &Configuration Folder" msgstr "Показати папку конфігурації" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show user configuration folder (datadir)" msgstr "Показати папку користувацької конфігурації (datadir)" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "Report an I&ssue" msgstr "Повідомити про проблему" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 #, c-format, boost-format msgid "Report an issue on %s" msgstr "Повідомити про проблему на %s" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 #, c-format, boost-format msgid "&About %s" msgstr "О %s" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 msgid "Show about dialog" msgstr "Показати діалог Про Slic3r" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1177 msgid "Show Tip of the Day" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1104 +#: src/slic3r/GUI/MainFrame.cpp:1181 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/MainFrame.cpp:1184 msgid "Show the list of the keyboard shortcuts" msgstr "Показати список гарячих клавіш" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso" msgstr "Iso" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso View" msgstr "Вид Iso" #. TRN To be shown in the main menu View->Top #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2917 -#: src/libslic3r/PrintConfig.cpp:2926 +#: src/slic3r/GUI/MainFrame.cpp:1202 src/libslic3r/PrintConfig.cpp:3005 +#: src/libslic3r/PrintConfig.cpp:3014 msgid "Top" msgstr "Зверху" -#: src/slic3r/GUI/MainFrame.cpp:1125 +#: src/slic3r/GUI/MainFrame.cpp:1202 msgid "Top View" msgstr "Вид зверху" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:446 -#: src/libslic3r/PrintConfig.cpp:455 +#: src/slic3r/GUI/MainFrame.cpp:1205 src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:474 msgid "Bottom" msgstr "Знизу" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1205 msgid "Bottom View" msgstr "Вид знизу" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front" msgstr "Спереду" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front View" msgstr "Вид спереду" -#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2274 +#: src/slic3r/GUI/MainFrame.cpp:1209 src/libslic3r/PrintConfig.cpp:2300 msgid "Rear" msgstr "Ззаду" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1209 msgid "Rear View" msgstr "Вид ззаду" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left" msgstr "З лівого боку" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left View" msgstr "Вид з лівого боку" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right" msgstr "З правого боку" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right View" msgstr "Вид з правого боку" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "&New Project" msgstr "Новий проект" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "Start a new project" msgstr "Почати новий проект" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "&Open Project" msgstr "Відкрити проект" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "Open a project file" msgstr "Відкрити файл проекту" -#: src/slic3r/GUI/MainFrame.cpp:1157 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Recent projects" msgstr "Останні проекти" -#: src/slic3r/GUI/MainFrame.cpp:1169 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -5781,523 +7062,557 @@ msgstr "" "Вибраний проект більше не доступний.\n" "Видалити його зі списку останніх проектів?" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Save Project" msgstr "Зберегти проект" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "Save current project file" msgstr "Зберегти файл поточного проекту" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save Project &as" msgstr "Зберегти проект як" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save current project file as" msgstr "Зберегти файл поточного проекту як" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Import STL/3MF/STEP/OBJ/AM&F" msgstr "Імпорт STL/3MF/STEP/OBJ/AMF" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Load a model" msgstr "Завантажити модель" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Import STL (Imperial Units)" msgstr "Імпорт SТL (в імперських одиницях)" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Load an model saved with imperial units" msgstr "Завантажити модель, збережену в імперських одиницях" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Import SL1 / SL1S Archive" +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Import SLA Archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Load an SLA archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Import ZIP Achive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Load an SL1 / Sl1S archive" +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Load a zip achive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Import &Config" msgstr "Імпорт конфігурації" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Load exported configuration file" msgstr "Завантажити експортований файл конфігурації" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Import Config from &Project" msgstr "Імпорт конфігурації з проекту" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Load configuration from project file" msgstr "Завантажити конфігурацію з файлу проекту" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Import Config &Bundle" msgstr "Імпорт пакету конфігурацій" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Load presets from a bundle" msgstr "Завантажити налаштування з пакету" -#: src/slic3r/GUI/MainFrame.cpp:1231 +#: src/slic3r/GUI/MainFrame.cpp:1311 msgid "&Import" msgstr "Імпорт" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1314 src/slic3r/GUI/MainFrame.cpp:1676 msgid "Export &G-code" msgstr "Експортувати G-код" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1314 msgid "Export current plate as G-code" msgstr "Експорт поточної пластини як G-код" -#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1318 src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end G-code" msgstr "Надіслати G-код" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1318 msgid "Send to print current plate as G-code" msgstr "Надіслати на принтер поточний стіл як G-код" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export G-code to SD Card / Flash Drive" msgstr "Експорт G-коду на SD-карту / Флешку" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "Експорт поточного столу як G-код на SD-карту / Флешку" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export Plate as &STL" -msgstr "Експорт столу як STL" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export Plate as &STL/OBJ" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export current plate as STL" -msgstr "Експорт поточної пластини як STL" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export current plate as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export Plate as STL &Including Supports" -msgstr "Експорт столу як STL, включаючи підтримку" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export Plate as STL/OBJ &Including Supports" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export current plate as STL including supports" -msgstr "Експорт поточного столу як STL, включаючи підтримку" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export current plate as STL/OBJ including supports" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export &Toolpaths as OBJ" msgstr "Експорт шляхів інструментів як OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export toolpaths as OBJ" msgstr "Експорт шляхів інструментів як OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export &Config" msgstr "Експортувати конфігурацію" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export current configuration to file" msgstr "Експортувати поточну конфігурацію в файл" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export Config &Bundle" msgstr "Експортувати пакет конфігурації" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export all presets to file" msgstr "Експортувати всі налаштування у файл" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export Config Bundle With Physical Printers" msgstr "Експортувати пакет конфігурації, включаючи фізичні принтери" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export all presets including physical printers to file" msgstr "Експортуйте всі пресети, включаючи фізичні принтери, у файл" -#: src/slic3r/GUI/MainFrame.cpp:1270 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "&Export" msgstr "Експорт" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Ejec&t SD Card / Flash Drive" msgstr "Від'єднати SD-карту/флешку" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "" "Від'єднати SD-карту / Флешку після того, як на неї був експортований G-код." -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Quick Slice" msgstr "Швидке нарізання" -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Slice a file into a G-code" msgstr "Нарізати файл у G-код" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Quick Slice and Save As" msgstr "Швидко нарізати та зберегти як" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Slice a file into a G-code, save as" msgstr "Нарізати файл у G-код, зберегти як" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat Last Quick Slice" msgstr "Повторити останнє швидке нарізання" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat last quick slice" msgstr "Повторити останнє швидке нарізання" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "(Re)Slice No&w" msgstr "(Пере)Нарізати зараз" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "Start new slicing process" msgstr "Почати новий процес нарізання" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "&Repair STL file" msgstr "Відновити STL-файл" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "Automatically repair an STL file" msgstr "Автоматично відновити як STL-файл" -#: src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:1388 msgid "&G-code Preview" msgstr "Перегляд G-коду" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1392 +msgid "E&xit" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1392 src/slic3r/GUI/UpdateDialogs.cpp:376 +#: src/slic3r/GUI/UpdateDialogs.cpp:423 +#, c-format, boost-format +msgid "Exit %s" +msgstr "Вихід %s" + +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 msgid "&Quit" msgstr "Вихід" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 #, c-format, boost-format msgid "Quit %s" msgstr "Вийти з %s" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1410 msgid "&Select All" msgstr "Вибрати все" -#: src/slic3r/GUI/MainFrame.cpp:1327 +#: src/slic3r/GUI/MainFrame.cpp:1411 msgid "Selects all objects" msgstr "Видалити всі об'єкти" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1413 msgid "D&eselect All" msgstr "Скасувати вибір усіх" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1414 msgid "Deselects all objects" msgstr "Скасовує вибір усіх об’єктів" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1417 msgid "&Delete Selected" msgstr "Видалити вибране" -#: src/slic3r/GUI/MainFrame.cpp:1334 +#: src/slic3r/GUI/MainFrame.cpp:1418 msgid "Deletes the current selection" msgstr "Видаляє поточний вибір" -#: src/slic3r/GUI/MainFrame.cpp:1336 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Delete &All" msgstr "Видалити все" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1421 msgid "Deletes all objects" msgstr "Видалити всі об'єкти" -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1425 msgid "&Undo" msgstr "Відмінити" -#: src/slic3r/GUI/MainFrame.cpp:1344 +#: src/slic3r/GUI/MainFrame.cpp:1428 msgid "&Redo" msgstr "Повторити" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1433 msgid "&Copy" msgstr "Копіювати" -#: src/slic3r/GUI/MainFrame.cpp:1350 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Copy selection to clipboard" msgstr "Скопіювати вибране в буфер обміну" -#: src/slic3r/GUI/MainFrame.cpp:1352 +#: src/slic3r/GUI/MainFrame.cpp:1436 msgid "&Paste" msgstr "Вставити" -#: src/slic3r/GUI/MainFrame.cpp:1353 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "Paste clipboard" msgstr "Вставити буфер обміну" -#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 -#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 +#: src/slic3r/GUI/MainFrame.cpp:1442 src/slic3r/GUI/MainFrame.cpp:1446 +#: src/slic3r/GUI/MainFrame.cpp:1615 src/slic3r/GUI/MainFrame.cpp:1619 msgid "Re&load from Disk" msgstr "Перезавантажити з диска" -#: src/slic3r/GUI/MainFrame.cpp:1368 +#: src/slic3r/GUI/MainFrame.cpp:1452 msgid "Searc&h" msgstr "Пошук" -#: src/slic3r/GUI/MainFrame.cpp:1369 +#: src/slic3r/GUI/MainFrame.cpp:1453 msgid "Search in settings" msgstr "Шукайте в налаштуваннях" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "&Plater Tab" msgstr "Вкладка Платер" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "Show the plater" msgstr "Показати plater" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "P&rint Settings Tab" msgstr "Вкладка параметрів друку" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "Show the print settings" msgstr "Показати параметри друку" -#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1469 src/slic3r/GUI/MainFrame.cpp:1679 msgid "&Filament Settings Tab" msgstr "Вкладка параметрів філаменту" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1469 msgid "Show the filament settings" msgstr "Показати параметри філаменту" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Print&er Settings Tab" msgstr "Вкладка параметрів принтеру" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Show the printer settings" msgstr "Показати параметри принтеру" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "3&D" msgstr "3&D" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "Show the 3D editing view" msgstr "Показати режим 3D-редагування" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Pre&view" msgstr "Попередній перегляд" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Show the 3D slices preview" msgstr "Показати попередній перегляд 3D нарізки" -#: src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/MainFrame.cpp:1488 msgid "Open the dialog to modify shape gallery" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Print &Host Upload Queue" msgstr "Черга завантаження хоста друку" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Display the Print Host Upload Queue window" msgstr "Показати вікна черги завантаження хоста друку" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open New Instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1424 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 +#: src/slic3r/GUI/MainFrame.cpp:1507 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1727 msgid "Compare Presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/MainFrame.cpp:1507 msgid "Compare presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show &Labels" msgstr "Показувати мітки" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show object/instance labels in 3D scene" msgstr "Показувати мітки об’єктів/екземплярів у 3D-сцені" -#: src/slic3r/GUI/MainFrame.cpp:1437 +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show Legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show legend in preview" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1523 msgid "&Collapse Sidebar" msgstr "Згорнути бічну панель" -#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1523 src/slic3r/GUI/Plater.cpp:2347 msgid "Collapse sidebar" msgstr "Згорнути бічну панель" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "&Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1543 src/slic3r/GUI/MainFrame.cpp:1650 msgid "&File" msgstr "Файл" -#: src/slic3r/GUI/MainFrame.cpp:1458 +#: src/slic3r/GUI/MainFrame.cpp:1544 msgid "&Edit" msgstr "&Редагування" -#: src/slic3r/GUI/MainFrame.cpp:1459 +#: src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Window" msgstr "Вікно" -#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 +#: src/slic3r/GUI/MainFrame.cpp:1546 src/slic3r/GUI/MainFrame.cpp:1651 msgid "&View" msgstr "Вид" -#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 +#: src/slic3r/GUI/MainFrame.cpp:1549 src/slic3r/GUI/MainFrame.cpp:1654 msgid "&Help" msgstr "Допомога" -#: src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/MainFrame.cpp:1611 msgid "&Open G-code" msgstr "Відкрити G-код" -#: src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open &PrusaSlicer" msgstr "Відкрити PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legend" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1676 msgid "E&xport" msgstr "Експорт" -#: src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end to print" msgstr "Надіслати на принтер" -#: src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1679 msgid "Mate&rial Settings Tab" msgstr "Вкладка параметрів матеріалу" -#: src/slic3r/GUI/MainFrame.cpp:1613 +#: src/slic3r/GUI/MainFrame.cpp:1703 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Вибрати файл для нарізання (STL/OBJ/AMF/3MF/PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1625 +#: src/slic3r/GUI/MainFrame.cpp:1715 msgid "No previously sliced file." msgstr "Немає попередньо нарізаного файлу." -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid "Previously sliced file (" msgstr "Попередньо нарізаний файл (" -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid ") not found." msgstr ") не знайдено." -#: src/slic3r/GUI/MainFrame.cpp:1633 +#: src/slic3r/GUI/MainFrame.cpp:1723 msgid "File Not Found" msgstr "Файл не знайдено" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 #, c-format, boost-format msgid "Save %s file as:" msgstr "Зберегти файл %s як:" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "G-code" msgstr "G-код" -#: src/slic3r/GUI/MainFrame.cpp:1680 +#: src/slic3r/GUI/MainFrame.cpp:1770 msgid "Save zip file as:" msgstr "Зберегти zip-файл як:" -#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6064 src/slic3r/GUI/Tab.cpp:1666 -#: src/slic3r/GUI/Tab.cpp:4730 +#: src/slic3r/GUI/MainFrame.cpp:1779 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6654 src/slic3r/GUI/Tab.cpp:1628 +#: src/slic3r/GUI/Tab.cpp:4986 msgid "Slicing" msgstr "Нарізання" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1691 +#: src/slic3r/GUI/MainFrame.cpp:1781 #, c-format, boost-format msgid "Processing %s" msgstr "Обробка %s" -#: src/slic3r/GUI/MainFrame.cpp:1714 +#: src/slic3r/GUI/MainFrame.cpp:1804 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% був успішно нарізаний." -#: src/slic3r/GUI/MainFrame.cpp:1717 +#: src/slic3r/GUI/MainFrame.cpp:1807 msgid "Slicing Done!" msgstr "Нарізання завершено!" -#: src/slic3r/GUI/MainFrame.cpp:1733 +#: src/slic3r/GUI/MainFrame.cpp:1823 msgid "Select the STL file to repair:" msgstr "Вибрати STL-файл для відновлення:" -#: src/slic3r/GUI/MainFrame.cpp:1743 +#: src/slic3r/GUI/MainFrame.cpp:1833 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "Зберегти OBJ-файл (менш схильний координувати помилки, ніж STL) як:" -#: src/slic3r/GUI/MainFrame.cpp:1754 +#: src/slic3r/GUI/MainFrame.cpp:1844 msgid "Your file was repaired." msgstr "Ваш файл було відновлено." -#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4528 +#: src/slic3r/GUI/MainFrame.cpp:1844 src/libslic3r/PrintConfig.cpp:4694 msgid "Repair" msgstr "Відновити" -#: src/slic3r/GUI/MainFrame.cpp:1768 +#: src/slic3r/GUI/MainFrame.cpp:1858 msgid "Save configuration as:" msgstr "Зберегти конфігурацію як:" -#: src/slic3r/GUI/MainFrame.cpp:1785 +#: src/slic3r/GUI/MainFrame.cpp:1875 msgid "Loading of a configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 +#: src/slic3r/GUI/MainFrame.cpp:1877 src/slic3r/GUI/MainFrame.cpp:1944 msgid "Select configuration to load:" msgstr "Вибрати конфігурацію для завантаження:" -#: src/slic3r/GUI/MainFrame.cpp:1816 +#: src/slic3r/GUI/MainFrame.cpp:1908 msgid "Exporting configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1817 +#: src/slic3r/GUI/MainFrame.cpp:1909 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1826 +#: src/slic3r/GUI/MainFrame.cpp:1918 msgid "Save presets bundle as:" msgstr "Зберегти набір налаштувань як:" -#: src/slic3r/GUI/MainFrame.cpp:1849 +#: src/slic3r/GUI/MainFrame.cpp:1941 msgid "Loading of a configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1879 +#: src/slic3r/GUI/MainFrame.cpp:1971 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d налаштувань успішно імпортовано." @@ -6366,19 +7681,19 @@ msgstr "" msgid "%s information" msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:752 +#: src/slic3r/GUI/NotificationManager.hpp:899 msgid "3D Mouse disconnected." msgstr "3D миша відключена." -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "Configuration update is available." msgstr "Доступне оновлення конфігурації." -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "See more." msgstr "Див. докладніше." -#: src/slic3r/GUI/NotificationManager.hpp:761 +#: src/slic3r/GUI/NotificationManager.hpp:908 msgid "" "You have just added a G-code for color change, but its value is empty.\n" "To export the G-code correctly, check the \"Color Change G-code\" in " @@ -6388,57 +7703,74 @@ msgstr "" "Щоб правильно експортувати G-код, перевірте значення параметру «G-коду зміни " "кольору» в «Параметри принтера > Користувацький G-код»" -#: src/slic3r/GUI/NotificationManager.hpp:764 +#: src/slic3r/GUI/NotificationManager.hpp:911 msgid "" "No color change event was added to the print. The print does not look like a " "sign." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:766 +#: src/slic3r/GUI/NotificationManager.hpp:913 msgid "Desktop integration was successful." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:768 +#: src/slic3r/GUI/NotificationManager.hpp:915 msgid "Desktop integration failed." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:770 +#: src/slic3r/GUI/NotificationManager.hpp:917 msgid "Undo desktop integration was successful." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:772 +#: src/slic3r/GUI/NotificationManager.hpp:919 msgid "Undo desktop integration failed." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:773 +#: src/slic3r/GUI/NotificationManager.hpp:920 msgid "Exporting." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:664 +#: src/slic3r/GUI/NotificationManager.hpp:924 +msgid "" +"PrusaSlicer recieved a download request from Printables.com, but it's not " +"allowed. You can allow it" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:925 +msgid "here." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:773 msgid "Open Folder." msgstr "Відкрити папку." -#: src/slic3r/GUI/NotificationManager.cpp:701 +#: src/slic3r/GUI/NotificationManager.cpp:811 msgid "Eject drive" msgstr "Від'єднати диск" -#: src/slic3r/GUI/NotificationManager.cpp:885 +#: src/slic3r/GUI/NotificationManager.cpp:1054 +#: src/slic3r/GUI/NotificationManager.cpp:1267 +#: src/slic3r/GUI/NotificationManager.cpp:1472 msgid "ERROR" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:890 -msgid "CANCELED" +#: src/slic3r/GUI/NotificationManager.cpp:1269 +#: src/slic3r/GUI/NotificationManager.cpp:1377 +msgid "COMPLETED" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:895 -msgid "COMPLETED" +#: src/slic3r/GUI/NotificationManager.cpp:1467 +msgid "RESOLVING ADDRESS" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:1477 +msgid "CANCELED" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:937 +#: src/slic3r/GUI/NotificationManager.cpp:1539 msgid "Cancel upload" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:996 +#: src/slic3r/GUI/NotificationManager.cpp:1648 #, c-format, boost-format msgid "%1$d object was loaded with custom supports." msgid_plural "%1$d objects were loaded with custom supports." @@ -6446,7 +7778,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/NotificationManager.cpp:997 +#: src/slic3r/GUI/NotificationManager.cpp:1649 #, c-format, boost-format msgid "%1$d object was loaded with custom seam." msgid_plural "%1$d objects were loaded with custom seam." @@ -6454,7 +7786,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/NotificationManager.cpp:998 +#: src/slic3r/GUI/NotificationManager.cpp:1650 #, c-format, boost-format msgid "%1$d object was loaded with multimaterial painting." msgid_plural "%1$d objects were loaded with multimaterial painting." @@ -6462,7 +7794,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/NotificationManager.cpp:999 +#: src/slic3r/GUI/NotificationManager.cpp:1651 #, c-format, boost-format msgid "%1$d object was loaded with variable layer height." msgid_plural "%1$d objects were loaded with variable layer height." @@ -6470,7 +7802,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/NotificationManager.cpp:1000 +#: src/slic3r/GUI/NotificationManager.cpp:1652 #, c-format, boost-format msgid "%1$d object was loaded with partial sinking." msgid_plural "%1$d objects were loaded with partial sinking." @@ -6478,65 +7810,92 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1653 +#, c-format, boost-format +msgid "%1$d object was loaded as a part of cut object." +msgid_plural "%1$d objects were loaded as parts of cut object" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Slicing finished." msgstr "Нарізання завершено." -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export G-Code." msgstr "Експортувати G-код." -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1447 -#: src/slic3r/GUI/NotificationManager.cpp:1454 -#: src/slic3r/GUI/NotificationManager.cpp:1470 -#: src/slic3r/GUI/NotificationManager.cpp:1476 -#: src/slic3r/GUI/NotificationManager.cpp:1547 +#: src/slic3r/GUI/NotificationManager.cpp:2101 +#: src/slic3r/GUI/NotificationManager.cpp:2108 +#: src/slic3r/GUI/NotificationManager.cpp:2124 +#: src/slic3r/GUI/NotificationManager.cpp:2130 +#: src/slic3r/GUI/NotificationManager.cpp:2201 msgid "ERROR:" msgstr "ПОМИЛКА:" -#: src/slic3r/GUI/NotificationManager.cpp:1459 -#: src/slic3r/GUI/NotificationManager.cpp:1486 -#: src/slic3r/GUI/NotificationManager.cpp:1494 -#: src/slic3r/GUI/NotificationManager.cpp:1505 src/slic3r/GUI/Plater.cpp:3197 +#: src/slic3r/GUI/NotificationManager.cpp:2113 +#: src/slic3r/GUI/NotificationManager.cpp:2140 +#: src/slic3r/GUI/NotificationManager.cpp:2148 +#: src/slic3r/GUI/NotificationManager.cpp:2159 src/slic3r/GUI/Plater.cpp:3220 msgid "WARNING:" msgstr "ЗАСТЕРЕЖЕННЯ:" -#: src/slic3r/GUI/NotificationManager.cpp:1598 +#: src/slic3r/GUI/NotificationManager.cpp:2275 msgid "Exporting finished." msgstr "Експорт завершено." -#: src/slic3r/GUI/ObjectDataViewModel.cpp:50 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 msgid "Paint-on seam" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:52 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:68 +msgid "Cut connectors" +msgstr "" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:70 msgid "Sinking" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:110 msgid "Instances" msgstr "Екземпляри" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:98 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:266 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:114 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:275 #, c-format, boost-format msgid "Instance %d" msgstr "Екземпляр %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4568 -#: src/slic3r/GUI/Tab.cpp:4659 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:121 src/slic3r/GUI/Tab.cpp:4805 +#: src/slic3r/GUI/Tab.cpp:4942 msgid "Layers" msgstr "Шари" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 msgid "Range" msgstr "Діапазон" -#: src/slic3r/GUI/OpenGLManager.cpp:258 +#: src/slic3r/GUI/OpenGLManager.cpp:376 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL ES 2.0 capable graphics driver to run " +"correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:379 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL %s capable graphics driver to run correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:382 #, c-format, boost-format msgid "" "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" @@ -6546,21 +7905,21 @@ msgstr "" "працював правильно,\n" "але було виявлено OpenGL версії %s, відтворення %s, постачальника %s." -#: src/slic3r/GUI/OpenGLManager.cpp:261 +#: src/slic3r/GUI/OpenGLManager.cpp:386 msgid "You may need to update your graphics card driver." msgstr "Можливо, вам доведеться оновити драйвер відеокарти." -#: src/slic3r/GUI/OpenGLManager.cpp:264 +#: src/slic3r/GUI/OpenGLManager.cpp:389 msgid "" "As a workaround, you may run PrusaSlicer with a software rendered 3D " "graphics by running prusa-slicer.exe with the --sw-renderer parameter." msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:266 +#: src/slic3r/GUI/OpenGLManager.cpp:391 msgid "Unsupported OpenGL version" msgstr "Непідтримувана версія OpenGL" -#: src/slic3r/GUI/OpenGLManager.cpp:274 +#: src/slic3r/GUI/OpenGLManager.cpp:399 #, c-format, boost-format msgid "" "Unable to load the following shaders:\n" @@ -6569,16 +7928,20 @@ msgstr "" "Не вдається завантажити такі шейдери:\n" "%s" -#: src/slic3r/GUI/OpenGLManager.cpp:275 +#: src/slic3r/GUI/OpenGLManager.cpp:400 msgid "Error loading shaders" msgstr "Помилка завантаження шейдерів" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:126 +msgid "Unavailable for this method." +msgstr "" + +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Top" msgstr "Верхні" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Bottom" msgstr "Нижні" @@ -6587,7 +7950,7 @@ msgstr "Нижні" msgid "Delete this preset from this printer device" msgstr "Видаліть цей пресет з цього принтера" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:83 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:84 msgid "This printer will be shown in the presets list as" msgstr "Цей принтер буде відображатися у списку пресетів як" @@ -6603,31 +7966,31 @@ msgstr "Описова назва принтера" msgid "Add preset for this printer device" msgstr "Додати пресет для цього пристрою принтера" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2255 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2239 msgid "Print Host upload" msgstr "Завантаження хоста друку" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:268 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:271 msgid "Connection to printers connected via the print host failed." msgstr "Помилка підключення до принтерів, підключених через хост друку." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:310 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:313 msgid "Test" msgstr "Перевірити" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:315 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:318 msgid "Could not get a valid Printer Host reference" msgstr "Не вдалося отримати дійсне посилання на хост принтера" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:330 msgid "Success!" msgstr "Успіх!" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:337 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:340 msgid "Refresh Printers" msgstr "Оновити принтери" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:367 msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." @@ -6635,20 +7998,20 @@ msgstr "" "Файл HTTPS CA не є обов'язковим. Це потрібно, лише якщо ви використовуєте " "HTTPS із самопідписаним сертифікатом." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:374 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:377 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "Файли сертифікатів (*.crt, *.pem)|*.crt;*.pem|Усі файли|*.*" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:378 msgid "Open CA certificate file" msgstr "Відкрити файл CA сертифікату" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:404 -#: src/libslic3r/PrintConfig.cpp:330 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:407 +#: src/libslic3r/PrintConfig.cpp:343 msgid "HTTPS CA File" msgstr "Файл CA сертифікату" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:405 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:408 #, c-format, boost-format msgid "" "On this system, %s uses HTTPS certificates from the system Certificate Store " @@ -6657,7 +8020,7 @@ msgstr "" "На цій системі, %s використовує HTTPS-сертифікати з системного сховища " "сертифікатів або Keychain." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:406 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:409 msgid "" "To use a custom CA file, please import your CA file into Certificate Store / " "Keychain." @@ -6665,24 +8028,24 @@ msgstr "" "Щоб використовувати власний CA файл, будь-ласка, імпортуйте його у сховища " "сертифікатів / Keychain." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:634 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:706 msgid "The supplied name is empty. It can't be saved." msgstr "Надане ім'я порожнє. Не вдається зберегти." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:638 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:710 msgid "You have to enter a printer name." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:646 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:718 #, boost-format msgid "Printer with name \"%1%\" already exists." msgstr "Принтер з ім'ям \"%1%\" вже існує." -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:647 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:719 msgid "Replace?" msgstr "Замінити?" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:674 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:746 #, boost-format msgid "" "Following printer preset is duplicated:%1%The above preset for printer \"%2%" @@ -6694,87 +8057,87 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:724 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:796 msgid "It's not possible to delete the last related preset for the printer." msgstr "Неможливо видалити останній пресет для принтера." -#: src/slic3r/GUI/Plater.cpp:141 +#: src/slic3r/GUI/Plater.cpp:158 msgid "The provided name is not valid;" msgstr "" -#: src/slic3r/GUI/Plater.cpp:142 src/slic3r/GUI/SavePresetDialog.cpp:102 +#: src/slic3r/GUI/Plater.cpp:159 src/slic3r/GUI/SavePresetDialog.cpp:166 msgid "the following characters are not allowed:" msgstr "такі символи не допускаються:" -#: src/slic3r/GUI/Plater.cpp:207 +#: src/slic3r/GUI/Plater.cpp:223 msgid "" "For a multipart object, this value isn't accurate.\n" "It doesn't take account of intersections and negative volumes." msgstr "" -#: src/slic3r/GUI/Plater.cpp:211 +#: src/slic3r/GUI/Plater.cpp:227 msgid "Volume" msgstr "Обсяг" -#: src/slic3r/GUI/Plater.cpp:213 +#: src/slic3r/GUI/Plater.cpp:229 msgid "Facets" msgstr "Грані" -#: src/slic3r/GUI/Plater.cpp:276 +#: src/slic3r/GUI/Plater.cpp:286 msgid "Sliced Info" msgstr "Інформація з нарізання" -#: src/slic3r/GUI/Plater.cpp:296 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:306 src/slic3r/GUI/Plater.cpp:1414 msgid "Used Filament (g)" msgstr "Використано філаметну (г)" -#: src/slic3r/GUI/Plater.cpp:297 src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:307 src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (m)" msgstr "Використано філаметну (м)" -#: src/slic3r/GUI/Plater.cpp:298 src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:308 src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (mm³)" msgstr "Використано філаметну (мм³)" -#: src/slic3r/GUI/Plater.cpp:299 +#: src/slic3r/GUI/Plater.cpp:309 msgid "Used Material (unit)" msgstr "Використано матеріалу (одиниць)" -#: src/slic3r/GUI/Plater.cpp:300 +#: src/slic3r/GUI/Plater.cpp:310 msgid "Cost (money)" msgstr "Вартість (г.о.)" -#: src/slic3r/GUI/Plater.cpp:301 src/slic3r/GUI/Plater.cpp:1340 -#: src/slic3r/GUI/Plater.cpp:1427 +#: src/slic3r/GUI/Plater.cpp:311 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:1464 msgid "Estimated printing time" msgstr "Приблизний час друку" -#: src/slic3r/GUI/Plater.cpp:302 +#: src/slic3r/GUI/Plater.cpp:312 msgid "Number of tool changes" msgstr "Кількість змін інструменту" -#: src/slic3r/GUI/Plater.cpp:431 +#: src/slic3r/GUI/Plater.cpp:437 msgid "Select what kind of support do you need" msgstr "Виберіть необхідну вам підтримку" -#: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2590 -#: src/libslic3r/PrintConfig.cpp:3645 +#: src/slic3r/GUI/Plater.cpp:440 src/libslic3r/PrintConfig.cpp:2620 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "Support on build plate only" msgstr "Підтримки тільки на столі" -#: src/slic3r/GUI/Plater.cpp:434 src/slic3r/GUI/Plater.cpp:564 +#: src/slic3r/GUI/Plater.cpp:441 msgid "For support enforcers only" msgstr "Тільки примусові підтримки" -#: src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Plater.cpp:442 msgid "Everywhere" msgstr "Всюди" -#: src/slic3r/GUI/Plater.cpp:467 src/slic3r/GUI/Tab.cpp:1542 +#: src/slic3r/GUI/Plater.cpp:475 src/slic3r/GUI/Tab.cpp:1489 msgid "Brim" msgstr "Край" -#: src/slic3r/GUI/Plater.cpp:469 +#: src/slic3r/GUI/Plater.cpp:477 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." @@ -6782,36 +8145,36 @@ msgstr "" "Цей прапорець дозволяє позначити край, який буде надруковано навколо кожного " "об'єкта на першому шарі." -#: src/slic3r/GUI/Plater.cpp:477 +#: src/slic3r/GUI/Plater.cpp:485 msgid "Purging volumes" msgstr "Обсяги очищення" -#: src/slic3r/GUI/Plater.cpp:578 +#: src/slic3r/GUI/Plater.cpp:592 msgid "Select what kind of pad do you need" msgstr "Виберіть необхідну вам подушку" -#: src/slic3r/GUI/Plater.cpp:580 +#: src/slic3r/GUI/Plater.cpp:595 msgid "Below object" msgstr "Під об’єктем" -#: src/slic3r/GUI/Plater.cpp:581 +#: src/slic3r/GUI/Plater.cpp:596 msgid "Around object" msgstr "Навколо об'єкта" -#: src/slic3r/GUI/Plater.cpp:894 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/Plater.cpp:929 src/slic3r/GUI/Plater.cpp:7162 msgid "Send to printer" msgstr "Надіслати на принтер" -#: src/slic3r/GUI/Plater.cpp:914 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6067 +#: src/slic3r/GUI/Plater.cpp:949 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6657 msgid "Slice now" msgstr "Нарізати зараз" -#: src/slic3r/GUI/Plater.cpp:1087 +#: src/slic3r/GUI/Plater.cpp:1127 msgid "Hold Shift to Slice & Export G-code" msgstr "Утримуйте Shift, щоб нарізати та експортувати G-код" -#: src/slic3r/GUI/Plater.cpp:1287 +#: src/slic3r/GUI/Plater.cpp:1324 #, boost-format msgid "%1% (%2$d shell)" msgid_plural "%1% (%2$d shells)" @@ -6819,88 +8182,85 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/Plater.cpp:1315 +#: src/slic3r/GUI/Plater.cpp:1352 msgid "Used Material (ml)" msgstr "Використано матеріалу (мл)" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "object" msgid_plural "objects" msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "supports and pad" msgstr "підтримки та подушка" -#: src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (in)" msgstr "Використано філаметну (дюйми)" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "objects" msgstr "об'єкти" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "wipe tower" msgstr "вежа витирання" -#: src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (in³)" msgstr "Використано філаметну (дюйми³)" -#: src/slic3r/GUI/Plater.cpp:1396 +#: src/slic3r/GUI/Plater.cpp:1433 #, boost-format msgid "Filament at extruder %1%" msgstr "Філамент екструдеру %1%" -#: src/slic3r/GUI/Plater.cpp:1402 +#: src/slic3r/GUI/Plater.cpp:1439 msgid "(including spool)" msgstr "(включаючи котушку)" -#: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1072 -#: src/libslic3r/PrintConfig.cpp:3439 src/libslic3r/PrintConfig.cpp:3440 +#: src/slic3r/GUI/Plater.cpp:1448 src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:3716 src/libslic3r/PrintConfig.cpp:3717 msgid "Cost" msgstr "Вартість" -#: src/slic3r/GUI/Plater.cpp:1429 +#: src/slic3r/GUI/Plater.cpp:1466 msgid "normal mode" msgstr "нормальний режим" -#: src/slic3r/GUI/Plater.cpp:1436 +#: src/slic3r/GUI/Plater.cpp:1473 msgid "stealth mode" msgstr "тихий режим" -#: src/slic3r/GUI/Plater.cpp:1670 -msgid "Fill bed" -msgstr "Заповнити стіл" - -#: src/slic3r/GUI/Plater.cpp:1676 -msgid "Optimize Rotation" -msgstr "Оптимізувати обертання" - -#: src/slic3r/GUI/Plater.cpp:1682 -msgid "Import SLA archive" -msgstr "Імпорт SLА-архіву" - -#: src/slic3r/GUI/Plater.cpp:1725 +#: src/slic3r/GUI/Plater.cpp:1734 #, boost-format msgid "Do you want to save the changes to \"%1%\"?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1730 src/slic3r/GUI/Preferences.cpp:222 +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:905 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1599 +msgid "Save" +msgstr "Зберегти" + +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +msgid "Discard" +msgstr "Відхилити" + +#: src/slic3r/GUI/Plater.cpp:1740 src/slic3r/GUI/Preferences.cpp:354 msgid "Ask for unsaved changes in project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1733 +#: src/slic3r/GUI/Plater.cpp:1743 msgid "" "You will not be asked about it again, when: \n" "- Closing PrusaSlicer,\n" "- Loading or creating a new project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2198 +#: src/slic3r/GUI/Plater.cpp:2214 #, c-format, boost-format msgid "" "Successfully unmounted. The device %s(%s) can now be safely removed from the " @@ -6909,20 +8269,20 @@ msgstr "" "Успішно від'єднано. Пристрій %s(%s) тепер можна безпечно вилучити з " "комп’ютера." -#: src/slic3r/GUI/Plater.cpp:2203 +#: src/slic3r/GUI/Plater.cpp:2220 #, c-format, boost-format msgid "Ejecting of device %s(%s) has failed." msgstr "Не вдалося від'єднати пристрій %s (%s)." -#: src/slic3r/GUI/Plater.cpp:2222 src/slic3r/GUI/Plater.cpp:5108 +#: src/slic3r/GUI/Plater.cpp:2239 src/slic3r/GUI/Plater.cpp:5199 msgid "New Project" msgstr "Новий проект" -#: src/slic3r/GUI/Plater.cpp:2319 +#: src/slic3r/GUI/Plater.cpp:2346 msgid "Expand sidebar" msgstr "Розгорнути бічну панель" -#: src/slic3r/GUI/Plater.cpp:2518 +#: src/slic3r/GUI/Plater.cpp:2428 msgid "" "The preset below was temporarily installed on the active instance of " "PrusaSlicer" @@ -6933,12 +8293,12 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/Plater.cpp:2548 +#: src/slic3r/GUI/Plater.cpp:2583 #, boost-format msgid "Failed loading file \"%1%\" due to an invalid configuration." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2568 +#: src/slic3r/GUI/Plater.cpp:2603 #, c-format, boost-format msgid "" "Object size from file %s appears to be zero.\n" @@ -6950,11 +8310,11 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/Plater.cpp:2572 +#: src/slic3r/GUI/Plater.cpp:2607 msgid "The size of the object is zero" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2585 +#: src/slic3r/GUI/Plater.cpp:2620 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in meters.\n" @@ -6968,15 +8328,15 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/Plater.cpp:2589 src/slic3r/GUI/Plater.cpp:2611 +#: src/slic3r/GUI/Plater.cpp:2624 src/slic3r/GUI/Plater.cpp:2646 msgid "The object is too small" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2590 src/slic3r/GUI/Plater.cpp:2612 +#: src/slic3r/GUI/Plater.cpp:2625 src/slic3r/GUI/Plater.cpp:2647 msgid "Apply to all the remaining small objects being loaded." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2607 +#: src/slic3r/GUI/Plater.cpp:2642 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in inches.\n" @@ -6990,18 +8350,18 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/Plater.cpp:2625 +#: src/slic3r/GUI/Plater.cpp:2659 msgid "" "This file contains several objects positioned at multiple heights.\n" "Instead of considering them as multiple objects, should \n" "the file be loaded as a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2628 src/slic3r/GUI/Plater.cpp:2683 +#: src/slic3r/GUI/Plater.cpp:2662 src/slic3r/GUI/Plater.cpp:2711 msgid "Multi-part object detected" msgstr "Виявлено об'єкт, що складається з кількох частин" -#: src/slic3r/GUI/Plater.cpp:2636 +#: src/slic3r/GUI/Plater.cpp:2669 msgid "" "This file cannot be loaded in a simple mode. Do you want to switch to an " "advanced mode?" @@ -7009,20 +8369,11 @@ msgstr "" "Цей файл не можна завантажити у простому режимі. Ви хочете перейти в " "розширений режим?" -#: src/slic3r/GUI/Plater.cpp:2637 +#: src/slic3r/GUI/Plater.cpp:2670 msgid "Detected advanced data" msgstr "Виявлено розширені дані" -#: src/slic3r/GUI/Plater.cpp:2657 -#, c-format, boost-format -msgid "" -"You can't to add the object(s) from %s because of one or some of them " -"is(are) multi-part" -msgstr "" -"Ви не можете додати об’єкт(и) із %s через те, що один або деякі з них " -"складається з декількох частин" - -#: src/slic3r/GUI/Plater.cpp:2680 +#: src/slic3r/GUI/Plater.cpp:2708 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" @@ -7032,7 +8383,7 @@ msgstr "" "Замість того, щоб розглядати їх як кілька об'єктів, чи потрібно розглянути\n" "ці файл як єдиний об'єкт, що має декілька частин?" -#: src/slic3r/GUI/Plater.cpp:2799 +#: src/slic3r/GUI/Plater.cpp:2827 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." @@ -7040,139 +8391,155 @@ msgstr "" "Ваш об'єкт видався занадто великим, тому він автоматично зменшився " "відповідно до вашої полотна друку." -#: src/slic3r/GUI/Plater.cpp:2800 +#: src/slic3r/GUI/Plater.cpp:2828 msgid "Object too large?" msgstr "Об'єкт занадто великий?" -#: src/slic3r/GUI/Plater.cpp:2878 +#: src/slic3r/GUI/Plater.cpp:2908 msgid "Export STL file:" msgstr "Експорт STL-файлу:" -#: src/slic3r/GUI/Plater.cpp:2885 +#: src/slic3r/GUI/Plater.cpp:2915 msgid "Export AMF file:" msgstr "Експортувати AMF-файл:" -#: src/slic3r/GUI/Plater.cpp:2891 +#: src/slic3r/GUI/Plater.cpp:2921 msgid "Save file as:" msgstr "Зберегти файл як:" -#: src/slic3r/GUI/Plater.cpp:2897 +#: src/slic3r/GUI/Plater.cpp:2927 msgid "Export OBJ file:" msgstr "Експорт OBJ-файлу:" -#: src/slic3r/GUI/Plater.cpp:2995 +#: src/slic3r/GUI/Plater.cpp:3030 +msgid "Delete object which is a part of cut object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3031 +msgid "" +"You try to delete an object which is a part of a cut object.\n" +"This action will break a cut correspondence.\n" +"After that PrusaSlicer can't guarantee model consistency" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3035 +msgid "Delete object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3040 msgid "Delete Object" msgstr "Видалити об'єкт" -#: src/slic3r/GUI/Plater.cpp:3007 +#: src/slic3r/GUI/Plater.cpp:3057 msgid "Delete All Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3035 +#: src/slic3r/GUI/Plater.cpp:3086 msgid "Reset Project" msgstr "Скинути проект" -#: src/slic3r/GUI/Plater.cpp:3118 +#: src/slic3r/GUI/Plater.cpp:3141 msgid "" "The selected object couldn't be split because it contains only one solid " "part." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3125 +#: src/slic3r/GUI/Plater.cpp:3148 msgid "All non-solid parts (modifiers) were deleted" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3127 +#: src/slic3r/GUI/Plater.cpp:3150 msgid "Split to Objects" msgstr "Розділити на об'єкти" -#: src/slic3r/GUI/Plater.cpp:3179 +#: src/slic3r/GUI/Plater.cpp:3202 msgid "" "An object has custom support enforcers which will not be used because " "supports are disabled." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3181 +#: src/slic3r/GUI/Plater.cpp:3204 msgid "Enable supports for enforcers only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3310 src/slic3r/GUI/Plater.cpp:4176 +#: src/slic3r/GUI/Plater.cpp:3339 src/slic3r/GUI/Plater.cpp:4238 msgid "Invalid data" msgstr "Некоректні дані" -#: src/slic3r/GUI/Plater.cpp:3380 +#: src/slic3r/GUI/Plater.cpp:3410 msgid "Another export job is currently running." msgstr "На даний час виконується інший експорт." -#: src/slic3r/GUI/Plater.cpp:3466 +#: src/slic3r/GUI/Plater.cpp:3496 msgid "Replace from:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3484 +#: src/slic3r/GUI/Plater.cpp:3514 msgid "Unable to replace with more than one volume" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3484 src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3514 src/slic3r/GUI/Plater.cpp:3597 msgid "Error during replace" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3555 +#: src/slic3r/GUI/Plater.cpp:3589 msgid "Select the new file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3597 msgid "File for the replace wasn't selected" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3654 +#: src/slic3r/GUI/Plater.cpp:3684 msgid "Please select the file to reload" msgstr "Будь ласка, виберіть файл для перезавантаження" -#: src/slic3r/GUI/Plater.cpp:3685 src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:3715 src/slic3r/GUI/Plater.cpp:5355 +#: src/slic3r/GUI/Plater.cpp:5365 msgid "The selected file" msgstr "Вибраний файл" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "differs from the original file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "Do you want to replace it" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3703 src/slic3r/GUI/Plater.cpp:3709 +#: src/slic3r/GUI/Plater.cpp:3736 src/slic3r/GUI/Plater.cpp:3742 msgid "Reload from:" msgstr "Перезавантажити з:" -#: src/slic3r/GUI/Plater.cpp:3812 +#: src/slic3r/GUI/Plater.cpp:3864 msgid "Unable to reload:" msgstr "Не вдається перезавантажити:" -#: src/slic3r/GUI/Plater.cpp:3817 +#: src/slic3r/GUI/Plater.cpp:3869 msgid "Error during reload" msgstr "Помилка під час перезавантаження" -#: src/slic3r/GUI/Plater.cpp:3835 +#: src/slic3r/GUI/Plater.cpp:3887 msgid "Reload all from disk" msgstr "Перезавантажити все з диска" -#: src/slic3r/GUI/Plater.cpp:4130 +#: src/slic3r/GUI/Plater.cpp:4191 msgid "There are active warnings concerning sliced models:" msgstr "Існують активні попередження щодо нарізаних моделей:" -#: src/slic3r/GUI/Plater.cpp:4141 +#: src/slic3r/GUI/Plater.cpp:4202 msgid "generated warnings" msgstr "згенеровані попередження" -#: src/slic3r/GUI/Plater.cpp:4472 +#: src/slic3r/GUI/Plater.cpp:4554 msgid "3D editor view" msgstr "Перегляд у 3D-редакторі" -#: src/slic3r/GUI/Plater.cpp:4893 +#: src/slic3r/GUI/Plater.cpp:4980 msgid "Undo / Redo is processing" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4895 +#: src/slic3r/GUI/Plater.cpp:4982 #, boost-format msgid "" "Switching the printer technology from %1% to %2%.\n" @@ -7180,179 +8547,228 @@ msgid "" "printer technology." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5092 +#: src/slic3r/GUI/Plater.cpp:5184 msgid "Creating a new project while the current project is modified." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5095 +#: src/slic3r/GUI/Plater.cpp:5187 msgid "Creating a new project while some presets are modified." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5096 +#: src/slic3r/GUI/Plater.cpp:5188 msgid "You can keep presets modifications to the new project or discard them" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5097 +#: src/slic3r/GUI/Plater.cpp:5189 msgid "" "You can keep presets modifications to the new project, discard them or save " "changes as new presets.\n" "Note, if changes will be saved then new project wouldn't keep them" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5103 +#: src/slic3r/GUI/Plater.cpp:5194 msgid "Creating a new project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5137 +#: src/slic3r/GUI/Plater.cpp:5228 msgid "Load Project" msgstr "Завантажити проект" -#: src/slic3r/GUI/Plater.cpp:5167 src/slic3r/GUI/Plater.cpp:5432 +#: src/slic3r/GUI/Plater.cpp:5258 msgid "Import Object" msgstr "Імпорт об'єкту" -#: src/slic3r/GUI/Plater.cpp:5171 +#: src/slic3r/GUI/Plater.cpp:5262 msgid "Import Objects" msgstr "Імпорт об'єктів" -#: src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:5291 +msgid "Import SLA archive" +msgstr "Імпорт SLА-архіву" + +#: src/slic3r/GUI/Plater.cpp:5355 src/slic3r/GUI/Plater.cpp:5365 msgid "does not contain valid gcode." msgstr "не містить дійсного G-коду." -#: src/slic3r/GUI/Plater.cpp:5244 +#: src/slic3r/GUI/Plater.cpp:5356 src/slic3r/GUI/Plater.cpp:5366 msgid "Error while loading .gcode file" msgstr "Помилка під час завантаження GCODE-файлу" -#: src/slic3r/GUI/Plater.cpp:5297 +#: src/slic3r/GUI/Plater.cpp:5433 +#, c-format, boost-format +msgid "%s - Multiple projects file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 +msgid "There are several files being loaded, including Project files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 src/slic3r/GUI/Plater.cpp:5446 +msgid "Select an action to apply to all files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5446 +msgid "There are several files being loaded." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5448 src/slic3r/GUI/Plater.cpp:5842 +msgid "Action" +msgstr "Дія" + +#: src/slic3r/GUI/Plater.cpp:5469 +msgid "Import geometry" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5482 src/slic3r/GUI/Plater.cpp:5834 +msgid "Start new PrusaSlicer instance" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5496 +msgid "Select one to load as project" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5507 +msgid "Select one to load config only" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5609 +#, boost-format +msgid "Failed to unzip file to %1%: %2% " +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5618 +#, boost-format +msgid "Failed to find unzipped file at %1%. Unzipping of file has failed." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5821 #, c-format, boost-format -msgid "%s - Drop project file" -msgstr "%s - Перетягнути файл проекту" +msgid "%s - Load project file" +msgstr "" -#: src/slic3r/GUI/Plater.cpp:5304 +#: src/slic3r/GUI/Plater.cpp:5830 msgid "Open as project" msgstr "Відкрити як проект" -#: src/slic3r/GUI/Plater.cpp:5305 +#: src/slic3r/GUI/Plater.cpp:5831 msgid "Import geometry only" msgstr "Імпорт тільки геометрії" -#: src/slic3r/GUI/Plater.cpp:5306 +#: src/slic3r/GUI/Plater.cpp:5832 msgid "Import config only" msgstr "Імпорт тільки конфігурації" -#: src/slic3r/GUI/Plater.cpp:5309 +#: src/slic3r/GUI/Plater.cpp:5837 msgid "Select an action to apply to the file" msgstr "Виберіть дію, яку потрібно застосувати до файлу" -#: src/slic3r/GUI/Plater.cpp:5314 -msgid "Action" -msgstr "Дія" - -#: src/slic3r/GUI/Plater.cpp:5330 +#: src/slic3r/GUI/Plater.cpp:5858 msgid "Don't show again" msgstr "Не показувати знову" -#: src/slic3r/GUI/Plater.cpp:5371 +#: src/slic3r/GUI/Plater.cpp:5899 msgid "You can open only one .gcode file at a time." msgstr "Одночасно можна відкрити лише один файл .gcode." -#: src/slic3r/GUI/Plater.cpp:5372 +#: src/slic3r/GUI/Plater.cpp:5900 msgid "Drag and drop G-code file" msgstr "Перетягування файлу G-коду" -#: src/slic3r/GUI/Plater.cpp:5454 +#: src/slic3r/GUI/Plater.cpp:5992 msgid "Load File" msgstr "Завантажити файл" -#: src/slic3r/GUI/Plater.cpp:5459 +#: src/slic3r/GUI/Plater.cpp:5997 msgid "Load Files" msgstr "Завантажити файли" -#: src/slic3r/GUI/Plater.cpp:5509 +#: src/slic3r/GUI/Plater.cpp:6047 msgid "All objects will be removed, continue?" msgstr "Усі об’єкти буде видалено, продовжити?" -#: src/slic3r/GUI/Plater.cpp:5520 +#: src/slic3r/GUI/Plater.cpp:6058 msgid "Delete Selected Objects" msgstr "Видалити вибрані об'єкти" -#: src/slic3r/GUI/Plater.cpp:5529 +#: src/slic3r/GUI/Plater.cpp:6067 msgid "Increase Instances" msgstr "Збільшити кількість копій" -#: src/slic3r/GUI/Plater.cpp:5563 +#: src/slic3r/GUI/Plater.cpp:6109 msgid "Decrease Instances" msgstr "Зменшити кількість копій" -#: src/slic3r/GUI/Plater.cpp:5614 +#: src/slic3r/GUI/Plater.cpp:6167 msgid "Enter the number of copies:" msgstr "Введіть кількість копій об'єкта:" -#: src/slic3r/GUI/Plater.cpp:5615 +#: src/slic3r/GUI/Plater.cpp:6168 msgid "Copies of the selected object" msgstr "Кількість копій обраного об'єкта" -#: src/slic3r/GUI/Plater.cpp:5619 +#: src/slic3r/GUI/Plater.cpp:6171 #, c-format, boost-format msgid "Set numbers of copies to %d" msgstr "Встановити кількість копій на %d" -#: src/slic3r/GUI/Plater.cpp:5697 -msgid "Cut by Plane" -msgstr "Вирізати площиною" +#: src/slic3r/GUI/Plater.cpp:6187 +msgid "Fill bed" +msgstr "Заповнити стіл" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save G-code file as:" msgstr "Зберегти G-код файл як:" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save SL1 / SL1S file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5766 +#: src/slic3r/GUI/Plater.cpp:6336 msgid "The provided file name is not valid." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5767 +#: src/slic3r/GUI/Plater.cpp:6337 msgid "The following characters are not allowed by a FAT file system:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "" "The plater is empty.\n" "Do you want to save the project?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "Save project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:6543 -msgid "Export" -msgstr "Експорт" +#: src/slic3r/GUI/Plater.cpp:6766 +msgid "Is the printer ready? Is the print sheet in place, empty and clean?" +msgstr "" -#: src/slic3r/GUI/Plater.cpp:6575 -msgid "" -"Custom supports, seams and multimaterial painting were removed after " -"repairing the mesh." +#: src/slic3r/GUI/Plater.cpp:6766 src/slic3r/GUI/PrintHostDialogs.cpp:132 +msgid "Upload and Print" msgstr "" -#: src/slic3r/GUI/Plater.cpp:6689 +#: src/slic3r/GUI/Plater.cpp:7161 +msgid "Export" +msgstr "Експорт" + +#: src/slic3r/GUI/Plater.cpp:7306 msgid "Paste From Clipboard" msgstr "Вставити з буферу обміну" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2290 -#: src/slic3r/GUI/Tab.cpp:2517 src/slic3r/GUI/Tab.cpp:2624 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Preferences.cpp:240 src/slic3r/GUI/Tab.cpp:2274 +#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2617 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "General" msgstr "Загальне" -#: src/slic3r/GUI/Preferences.cpp:121 +#: src/slic3r/GUI/Preferences.cpp:258 msgid "Remember output directory" msgstr "Пам'ятати вихідний каталог" -#: src/slic3r/GUI/Preferences.cpp:123 +#: src/slic3r/GUI/Preferences.cpp:259 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." @@ -7360,22 +8776,22 @@ msgstr "" "Якщо вибрано, Slic3r запропонує останню вихідну директорію замість тої, що " "вказана у вхідному файлі." -#: src/slic3r/GUI/Preferences.cpp:129 +#: src/slic3r/GUI/Preferences.cpp:263 msgid "Auto-center parts" msgstr "Автоцентрувати частини" -#: src/slic3r/GUI/Preferences.cpp:131 +#: src/slic3r/GUI/Preferences.cpp:264 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." msgstr "" "Якщо вибрано, Slic3r автоматично орієнтує об'єкти навколо центру друку." -#: src/slic3r/GUI/Preferences.cpp:137 +#: src/slic3r/GUI/Preferences.cpp:268 msgid "Background processing" msgstr "Фонова обробка" -#: src/slic3r/GUI/Preferences.cpp:139 +#: src/slic3r/GUI/Preferences.cpp:269 msgid "" "If this is enabled, Slic3r will pre-process objects as soon as they're " "loaded in order to save time when exporting G-code." @@ -7383,11 +8799,23 @@ msgstr "" "Якщо вибрано, Slic3r буде попередньо обробляти об'єкти, як тільки вони " "будуть завантажені, щоб заощадити час при експорті G-коду." -#: src/slic3r/GUI/Preferences.cpp:148 +#: src/slic3r/GUI/Preferences.cpp:274 +msgid "Alert when supports needed" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:275 +msgid "" +"If this is enabled, Slic3r will raise alerts when it detects issues in the " +"sliced object, that can be resolved with supports (and brim). Examples of " +"such issues are floating object parts, unsupported extrusions and low bed " +"adhesion." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:285 msgid "Export sources full pathnames to 3mf and amf" msgstr "Експортувати повні назви шляхів до 3MF та amf" -#: src/slic3r/GUI/Preferences.cpp:150 +#: src/slic3r/GUI/Preferences.cpp:286 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked." @@ -7395,18 +8823,18 @@ msgstr "" "Якщо увімкнено, дозволяє команді Перезавантажити з диска автоматично " "знаходити і завантажувати файли під час виклику." -#: src/slic3r/GUI/Preferences.cpp:159 +#: src/slic3r/GUI/Preferences.cpp:293 msgid "If enabled, sets PrusaSlicer as default application to open .3mf files." msgstr "" "Якщо увімкнено, встановлює PrusaSlicer як типову програму для відкриття 3MF-" "файлів." -#: src/slic3r/GUI/Preferences.cpp:166 +#: src/slic3r/GUI/Preferences.cpp:298 msgid "If enabled, sets PrusaSlicer as default application to open .stl files." msgstr "" "Якщо ввімкнено, програма PrusaSlicer за промовчанням відкриває STL-файли." -#: src/slic3r/GUI/Preferences.cpp:177 +#: src/slic3r/GUI/Preferences.cpp:307 msgid "" "If enabled, Slic3r downloads updates of built-in system presets in the " "background. These updates are downloaded into a separate temporary location. " @@ -7418,11 +8846,11 @@ msgstr "" "місце розташування. Коли нова версія пресетів стає доступною, вона " "пропонується під час запуску додатка." -#: src/slic3r/GUI/Preferences.cpp:182 +#: src/slic3r/GUI/Preferences.cpp:312 msgid "Suppress \" - default - \" presets" msgstr "Заборонити налаштування \"- за замовчуванням -\"" -#: src/slic3r/GUI/Preferences.cpp:184 +#: src/slic3r/GUI/Preferences.cpp:313 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." @@ -7430,11 +8858,21 @@ msgstr "" "Заборонити налаштування \"- за замовчуванням -\" у параметрах Друк / " "Філамент / Принтер, якщо доступні інші діючі налаштування." -#: src/slic3r/GUI/Preferences.cpp:190 +#: src/slic3r/GUI/Preferences.cpp:317 +msgid "Suppress \" Template \" filament presets" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:318 +msgid "" +"Suppress \" Template \" filament presets in configuration wizard and sidebar " +"visibility." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:322 msgid "Show incompatible print and filament presets" msgstr "Показувати несумісні налаштування друку та філаменту" -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:323 msgid "" "When checked, the print and filament presets are shown in the preset editor " "even if they are marked as incompatible with the active printer" @@ -7442,11 +8880,22 @@ msgstr "" "Якщо вибрано, пресети для друку та філаменту відображаються у списку " "пресетів, навіть якщо вони позначені як несумісні з активним принтером" -#: src/slic3r/GUI/Preferences.cpp:200 +#: src/slic3r/GUI/Preferences.cpp:331 +msgid "Show load project dialog" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:332 +msgid "" +"When checked, whenever dragging and dropping a project file on the " +"application or open it from a browser, shows a dialog asking to select the " +"action to take on the file to load." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:335 msgid "Show drop project dialog" msgstr "Показати діалогове вікно при перетягуванні проекту" -#: src/slic3r/GUI/Preferences.cpp:202 +#: src/slic3r/GUI/Preferences.cpp:336 msgid "" "When checked, whenever dragging and dropping a project file on the " "application, shows a dialog asking to select the action to take on the file " @@ -7455,11 +8904,11 @@ msgstr "" "Якщо вибрано, при перетягуванні файлу проекту у програмі відображається " "діалогове вікно із запитом вибрати дію щодо файлу, який потрібно завантажити." -#: src/slic3r/GUI/Preferences.cpp:208 src/slic3r/GUI/Preferences.cpp:212 +#: src/slic3r/GUI/Preferences.cpp:342 src/slic3r/GUI/Preferences.cpp:346 msgid "Allow just a single PrusaSlicer instance" msgstr "Дозволити лише один екземпляр PrusaSlicer" -#: src/slic3r/GUI/Preferences.cpp:210 +#: src/slic3r/GUI/Preferences.cpp:343 msgid "" "On OSX there is always only one instance of app running by default. However " "it is allowed to run multiple instances of same app from the command line. " @@ -7469,7 +8918,7 @@ msgstr "" "Однак дозволяється запускати кілька екземплярів одного додатка з командного " "рядка. У такому випадку ці налаштування дозволять лише один екземпляр." -#: src/slic3r/GUI/Preferences.cpp:214 +#: src/slic3r/GUI/Preferences.cpp:347 msgid "" "If this is enabled, when starting PrusaSlicer and another instance of the " "same PrusaSlicer is already running, that instance will be reactivated " @@ -7479,52 +8928,52 @@ msgstr "" "наявності вже запущеного того самого PrusaSlicer, буде тільки повторно " "активовано старий екземпляр." -#: src/slic3r/GUI/Preferences.cpp:224 +#: src/slic3r/GUI/Preferences.cpp:355 msgid "" "Always ask for unsaved changes in project, when: \n" "- Closing PrusaSlicer,\n" "- Loading or creating a new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:233 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:897 +#: src/slic3r/GUI/Preferences.cpp:363 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:925 msgid "" "Ask to save unsaved changes in presets when closing the application or when " "loading a new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:235 +#: src/slic3r/GUI/Preferences.cpp:364 msgid "" "Always ask for unsaved changes in presets, when: \n" "- Closing PrusaSlicer while some presets are modified,\n" "- Loading a new project while some presets are modified" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:242 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:896 +#: src/slic3r/GUI/Preferences.cpp:370 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:924 msgid "Ask for unsaved changes in presets when selecting new preset" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:244 +#: src/slic3r/GUI/Preferences.cpp:371 msgid "" "Always ask for unsaved changes in presets when selecting new preset or " "resetting a preset" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:249 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 +#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:923 msgid "Ask for unsaved changes in presets when creating new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:251 +#: src/slic3r/GUI/Preferences.cpp:376 msgid "Always ask for unsaved changes in presets when creating new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:258 +#: src/slic3r/GUI/Preferences.cpp:382 msgid "Associate .gcode files to PrusaSlicer G-code Viewer" msgstr "Зв’язати gcode-файли з PrusaSlicer Переглядачем G-коду" -#: src/slic3r/GUI/Preferences.cpp:260 +#: src/slic3r/GUI/Preferences.cpp:383 msgid "" "If enabled, sets PrusaSlicer G-code Viewer as default application to open ." "gcode files." @@ -7532,11 +8981,11 @@ msgstr "" "Якщо увімкнено, встановлює \"PrusaSlicer Переглядач G-коду\" як програму за " "замовчуванням для відкриття GCODE-файлів." -#: src/slic3r/GUI/Preferences.cpp:268 +#: src/slic3r/GUI/Preferences.cpp:390 msgid "Use Retina resolution for the 3D scene" msgstr "Використовувати роздільну здатність Retina для 3D сцени" -#: src/slic3r/GUI/Preferences.cpp:270 +#: src/slic3r/GUI/Preferences.cpp:391 msgid "" "If enabled, the 3D scene will be rendered in Retina resolution. If you are " "experiencing 3D performance problems, disabling this option may help." @@ -7545,28 +8994,28 @@ msgstr "" "Якщо у вас виникають проблеми з продуктивністю 3D, вимкнення цієї опції може " "допомогти." -#: src/slic3r/GUI/Preferences.cpp:280 src/slic3r/GUI/Preferences.cpp:282 +#: src/slic3r/GUI/Preferences.cpp:400 src/slic3r/GUI/Preferences.cpp:401 msgid "Show splash screen" msgstr "Показувати заставку" -#: src/slic3r/GUI/Preferences.cpp:289 +#: src/slic3r/GUI/Preferences.cpp:406 msgid "If enabled, PrusaSlicer will be open at the position it was closed" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:295 +#: src/slic3r/GUI/Preferences.cpp:411 msgid "Clear Undo / Redo stack on new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:297 +#: src/slic3r/GUI/Preferences.cpp:412 msgid "" "Clear Undo / Redo stack on new project or when an existing project is loaded." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:303 +#: src/slic3r/GUI/Preferences.cpp:417 msgid "Enable support for legacy 3DConnexion devices" msgstr "Увімкнути підтримку застарілих пристроїв 3DConnexion" -#: src/slic3r/GUI/Preferences.cpp:305 +#: src/slic3r/GUI/Preferences.cpp:418 msgid "" "If enabled, the legacy 3DConnexion devices settings dialog is available by " "pressing CTRL+M" @@ -7574,63 +9023,59 @@ msgstr "" "Якщо увімкнено, діалогове вікно налаштувань пристроїв 3DConnexion доступне, " "натиснувши CTRL+M" -#: src/slic3r/GUI/Preferences.cpp:314 +#: src/slic3r/GUI/Preferences.cpp:425 msgid "Camera" msgstr "Камера" -#: src/slic3r/GUI/Preferences.cpp:319 +#: src/slic3r/GUI/Preferences.cpp:435 msgid "Use perspective camera" msgstr "Використовувати перспективну камеру" -#: src/slic3r/GUI/Preferences.cpp:321 +#: src/slic3r/GUI/Preferences.cpp:436 msgid "" "If enabled, use perspective camera. If not enabled, use orthographic camera." msgstr "" "Якщо увімкнено, використовуватиметься перспективна камера. Якщо вимкнено, " "використовуватиметься ортографічна камера." -#: src/slic3r/GUI/Preferences.cpp:326 +#: src/slic3r/GUI/Preferences.cpp:440 msgid "Use free camera" msgstr "Використовувати вільну камеру" -#: src/slic3r/GUI/Preferences.cpp:328 +#: src/slic3r/GUI/Preferences.cpp:441 msgid "If enabled, use free camera. If not enabled, use constrained camera." msgstr "" "Якщо увімкнено, використовуватиметься вільна камера. Якщо вимкнено, " "використовуватиметься камера з обмеженими можливостями." -#: src/slic3r/GUI/Preferences.cpp:333 +#: src/slic3r/GUI/Preferences.cpp:445 msgid "Reverse direction of zoom with mouse wheel" msgstr "Зворотний напрямок масштабування за допомогою колеса миші" -#: src/slic3r/GUI/Preferences.cpp:335 +#: src/slic3r/GUI/Preferences.cpp:446 msgid "If enabled, reverses the direction of zoom with mouse wheel" msgstr "Якщо увімкнено, змінює напрямок масштабування за допомогою колеса миші" -#: src/slic3r/GUI/Preferences.cpp:343 +#: src/slic3r/GUI/Preferences.cpp:452 msgid "GUI" msgstr "Графічний інтерфейс" -#: src/slic3r/GUI/Preferences.cpp:366 +#: src/slic3r/GUI/Preferences.cpp:492 msgid "Sequential slider applied only to top layer" msgstr "Послідовний повзунок застосовується лише до верхнього шару" -#: src/slic3r/GUI/Preferences.cpp:368 +#: src/slic3r/GUI/Preferences.cpp:493 msgid "" "If enabled, changes made using the sequential slider, in preview, apply only " -"to gcode top layer. If disabled, changes made using the sequential slider, " -"in preview, apply to the whole gcode." +"to gcode top layer.If disabled, changes made using the sequential slider, in " +"preview, apply to the whole gcode." msgstr "" -"Якщо увімкнено, зміни, внесені за допомогою послідовного повзунка, у " -"попередньому перегляді застосовуються лише до верхнього шару G-коду. Якщо " -"вимкнено, зміни, внесені за допомогою послідовного повзунка, у попередньому " -"перегляді застосовуються до цілого G-коду." -#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/Preferences.cpp:499 msgid "Show sidebar collapse/expand button" msgstr "Показувати кнопку згортання/розгортання бічної панелі" -#: src/slic3r/GUI/Preferences.cpp:377 +#: src/slic3r/GUI/Preferences.cpp:500 msgid "" "If enabled, the button for the collapse sidebar will be appeared in top " "right corner of the 3D Scene" @@ -7638,25 +9083,21 @@ msgstr "" "Якщо увімкнено, у верхньому правому куті 3D-сцени з’явиться кнопка згортання " "бічної панелі" -#: src/slic3r/GUI/Preferences.cpp:384 -msgid "If enabled, PrusaSlicer will not open hyperlinks in your browser." -msgstr "" - -#: src/slic3r/GUI/Preferences.cpp:391 +#: src/slic3r/GUI/Preferences.cpp:511 msgid "Use colors for axes values in Manipulation panel" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:393 +#: src/slic3r/GUI/Preferences.cpp:512 msgid "" "If enabled, the axes names and axes values will be colorized according to " "the axes colors. If disabled, old UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:399 +#: src/slic3r/GUI/Preferences.cpp:517 msgid "Order object volumes by types" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:401 +#: src/slic3r/GUI/Preferences.cpp:518 msgid "" "If enabled, volumes will be always ordered inside the object. Correct order " "is Model Part, Negative Volume, Modifier, Support Blocker and Support " @@ -7664,197 +9105,244 @@ msgid "" "Modifiers. But one of the model parts have to be on the first place." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:408 +#: src/slic3r/GUI/Preferences.cpp:523 +msgid "Show non-manifold edges" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:524 +msgid "If enabled, shows non-manifold edges." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:528 +msgid "Allow automatically color change" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:529 +msgid "" +"If enabled, related notification will be shown, when sliced object looks " +"like a logo or a sign." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:534 msgid "Set settings tabs as menu items (experimental)" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:410 +#: src/slic3r/GUI/Preferences.cpp:535 msgid "" "If enabled, Settings Tabs will be placed as menu items. If disabled, old UI " "will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:419 +#: src/slic3r/GUI/Preferences.cpp:542 msgid "Show \"Tip of the day\" notification after start" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:421 +#: src/slic3r/GUI/Preferences.cpp:543 msgid "If enabled, useful hints are displayed at startup." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:427 +#: src/slic3r/GUI/Preferences.cpp:547 msgid "Notify about new releases" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:429 +#: src/slic3r/GUI/Preferences.cpp:548 msgid "" "You will be notified about new release after startup acordingly: All = " "Regular release and alpha / beta releases. Release only = regular release." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:435 +#: src/slic3r/GUI/Preferences.cpp:551 msgid "Release only" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:444 +#: src/slic3r/GUI/Preferences.cpp:558 msgid "Use custom size for toolbar icons" msgstr "" "Використовуйте користувацький розмір для піктограм на панелі інструментів" -#: src/slic3r/GUI/Preferences.cpp:446 +#: src/slic3r/GUI/Preferences.cpp:559 msgid "If enabled, you can change size of toolbar icons manually." msgstr "" "Якщо увімкнено, ви можете змінювати розмір піктограм на панелі інструментів " "вручну." -#: src/slic3r/GUI/Preferences.cpp:471 +#: src/slic3r/GUI/Preferences.cpp:577 src/slic3r/GUI/Tab.cpp:1659 +msgid "Other" +msgstr "Інше" + +#: src/slic3r/GUI/Preferences.cpp:594 +msgid "If enabled, PrusaSlicer will not open a hyperlinks in your browser." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:600 +msgid "Allow downloads from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:601 +msgid "If enabled, PrusaSlicer will be allowed to download from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:610 msgid "Render" msgstr "Візуалізувати" -#: src/slic3r/GUI/Preferences.cpp:476 +#: src/slic3r/GUI/Preferences.cpp:620 msgid "Use environment map" msgstr "Використовуйте карту середовища" -#: src/slic3r/GUI/Preferences.cpp:478 +#: src/slic3r/GUI/Preferences.cpp:621 msgid "If enabled, renders object using the environment map." msgstr "Якщо увімкнено, візуалізує об’єкт за допомогою карти середовища." -#: src/slic3r/GUI/Preferences.cpp:491 +#: src/slic3r/GUI/Preferences.cpp:629 msgid "Dark mode (experimental)" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:496 +#: src/slic3r/GUI/Preferences.cpp:639 msgid "Enable dark mode" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:498 +#: src/slic3r/GUI/Preferences.cpp:640 msgid "" "If enabled, UI will use Dark mode colors. If disabled, old UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:507 +#: src/slic3r/GUI/Preferences.cpp:647 msgid "Use system menu for application" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:509 +#: src/slic3r/GUI/Preferences.cpp:648 msgid "" "If enabled, application will use the standard Windows system menu,\n" -"but on some combination of display scales it can looks ugly. If disabled, " -"old UI will be used." +"but on some combination od display scales it can look ugly. If disabled, old " +"UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:578 +#: src/slic3r/GUI/Preferences.cpp:726 msgid "Changes for the critical options" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:580 +#: src/slic3r/GUI/Preferences.cpp:728 msgid "" "Changing some options will trigger application restart.\n" "You will lose the content of the plater." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:694 +#: src/slic3r/GUI/Preferences.cpp:921 msgid "Icon size in a respect to the default size" msgstr "Розмір піктограми відносно розміру за промовчанням" -#: src/slic3r/GUI/Preferences.cpp:709 +#: src/slic3r/GUI/Preferences.cpp:936 msgid "Select toolbar icon size in respect to the default one." msgstr "" "Виберіть розмір піктограми панелі інструментів щодо розміру за замовчуванням." -#: src/slic3r/GUI/Preferences.cpp:743 src/slic3r/GUI/Preferences.cpp:754 +#: src/slic3r/GUI/Preferences.cpp:972 +msgid "Layout Options" +msgstr "Параметри розташування" + +#: src/slic3r/GUI/Preferences.cpp:981 msgid "Old regular layout with the tab bar" msgstr "Старий звичайний макет із панеллю вкладок" -#: src/slic3r/GUI/Preferences.cpp:744 +#: src/slic3r/GUI/Preferences.cpp:982 msgid "New layout, access via settings button in the top menu" msgstr "Нове розташування, доступ через кнопку налаштувань у верхньому меню" -#: src/slic3r/GUI/Preferences.cpp:745 src/slic3r/GUI/Preferences.cpp:755 +#: src/slic3r/GUI/Preferences.cpp:983 msgid "Settings in non-modal window" msgstr "Налаштування у немодальному вікні" -#: src/slic3r/GUI/Preferences.cpp:763 -msgid "Layout Options" -msgstr "Параметри розташування" - -#: src/slic3r/GUI/Preferences.cpp:806 +#: src/slic3r/GUI/Preferences.cpp:1025 msgid "Text colors" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:249 -#: src/slic3r/GUI/PresetComboBoxes.cpp:287 -#: src/slic3r/GUI/PresetComboBoxes.cpp:794 -#: src/slic3r/GUI/PresetComboBoxes.cpp:849 -#: src/slic3r/GUI/PresetComboBoxes.cpp:989 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1033 +#: src/slic3r/GUI/Preferences.cpp:1049 +msgid "Mode markers" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:254 +#: src/slic3r/GUI/PresetComboBoxes.cpp:306 +#: src/slic3r/GUI/PresetComboBoxes.cpp:846 +#: src/slic3r/GUI/PresetComboBoxes.cpp:909 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1073 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1125 msgid "System presets" msgstr "Системні налаштування" -#: src/slic3r/GUI/PresetComboBoxes.cpp:291 -#: src/slic3r/GUI/PresetComboBoxes.cpp:853 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1037 +#: src/slic3r/GUI/PresetComboBoxes.cpp:310 +#: src/slic3r/GUI/PresetComboBoxes.cpp:915 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1130 msgid "User presets" msgstr "Налаштування користувача" -#: src/slic3r/GUI/PresetComboBoxes.cpp:302 +#: src/slic3r/GUI/PresetComboBoxes.cpp:321 msgid "Incompatible presets" msgstr "Несумісні пресети" -#: src/slic3r/GUI/PresetComboBoxes.cpp:337 +#: src/slic3r/GUI/PresetComboBoxes.cpp:364 #, boost-format msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "Ви впевнені, що хочете видалити принтер \"%1%\"?" -#: src/slic3r/GUI/PresetComboBoxes.cpp:340 +#: src/slic3r/GUI/PresetComboBoxes.cpp:366 msgid "Delete Physical Printer" msgstr "Видалити фізичний принтер" -#: src/slic3r/GUI/PresetComboBoxes.cpp:581 +#: src/slic3r/GUI/PresetComboBoxes.cpp:612 msgid "Click to edit preset" msgstr "Клацніть, щоб змінити пресет" -#: src/slic3r/GUI/PresetComboBoxes.cpp:697 -#: src/slic3r/GUI/PresetComboBoxes.cpp:737 +#: src/slic3r/GUI/PresetComboBoxes.cpp:740 +#: src/slic3r/GUI/PresetComboBoxes.cpp:788 msgid "Add/Remove presets" msgstr "Додати/Видалити пресети" -#: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:745 +#: src/slic3r/GUI/PresetComboBoxes.cpp:793 src/slic3r/GUI/Tab.cpp:3312 msgid "Add physical printer" msgstr "Додати фізичний принтер" -#: src/slic3r/GUI/PresetComboBoxes.cpp:716 +#: src/slic3r/GUI/PresetComboBoxes.cpp:759 msgid "Edit preset" msgstr "Редагувати пресет" -#: src/slic3r/GUI/PresetComboBoxes.cpp:722 +#: src/slic3r/GUI/PresetComboBoxes.cpp:765 msgid "Change extruder color" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:773 src/slic3r/GUI/Tab.cpp:3312 msgid "Edit physical printer" msgstr "Редагувати фізичний принтер" -#: src/slic3r/GUI/PresetComboBoxes.cpp:733 +#: src/slic3r/GUI/PresetComboBoxes.cpp:779 +msgid "Open physical printer URL" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:784 msgid "Delete physical printer" msgstr "Видалити фізичний принтер" -#: src/slic3r/GUI/PresetComboBoxes.cpp:864 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1051 +#: src/slic3r/GUI/PresetComboBoxes.cpp:924 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1142 +msgid "Template presets" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:935 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1156 msgid "Physical printers" msgstr "Фізичний принтер" -#: src/slic3r/GUI/PresetComboBoxes.cpp:888 +#: src/slic3r/GUI/PresetComboBoxes.cpp:959 msgid "Add/Remove filaments" msgstr "Додати/Видалити філаменти" -#: src/slic3r/GUI/PresetComboBoxes.cpp:890 +#: src/slic3r/GUI/PresetComboBoxes.cpp:961 msgid "Add/Remove materials" msgstr "Додати/Видалити матеріали" -#: src/slic3r/GUI/PresetComboBoxes.cpp:892 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1075 +#: src/slic3r/GUI/PresetComboBoxes.cpp:963 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1180 msgid "Add/Remove printers" msgstr "Додати/Видалити прінтери" @@ -8040,98 +9528,106 @@ msgstr "Мінімальна товщина нижньої оболонки ст msgid "Bottom is open." msgstr "Внизу відкрито." -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Send G-Code to printer host" msgstr "Надіслання G-коду на хост друку" -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Upload to Printer Host with the following filename:" msgstr "Завантажити на хост принтера з таким ім’ям файлу:" -#: src/slic3r/GUI/PrintHostDialogs.cpp:51 +#: src/slic3r/GUI/PrintHostDialogs.cpp:55 msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "За потреби використовуйте скісні риски (/) як роздільник каталогів." -#: src/slic3r/GUI/PrintHostDialogs.cpp:60 +#: src/slic3r/GUI/PrintHostDialogs.cpp:64 msgid "Group" msgstr "Group" -#: src/slic3r/GUI/PrintHostDialogs.cpp:84 +#: src/slic3r/GUI/PrintHostDialogs.cpp:74 +msgid "Upload to storage:" +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:83 +msgid "Upload to storage: " +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:105 #, c-format, boost-format msgid "Upload filename doesn't end with \"%s\". Do you wish to continue?" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:91 +#: src/slic3r/GUI/PrintHostDialogs.cpp:112 msgid "Upload" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:101 -msgid "Upload and Print" +#: src/slic3r/GUI/PrintHostDialogs.cpp:122 +msgid "Upload to Queue" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:112 +#: src/slic3r/GUI/PrintHostDialogs.cpp:143 msgid "Upload and Simulate" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:247 +#: src/slic3r/GUI/PrintHostDialogs.cpp:298 msgid "ID" msgstr "ID" -#: src/slic3r/GUI/PrintHostDialogs.cpp:248 +#: src/slic3r/GUI/PrintHostDialogs.cpp:299 msgid "Progress" msgstr "Прогрес" -#: src/slic3r/GUI/PrintHostDialogs.cpp:249 +#: src/slic3r/GUI/PrintHostDialogs.cpp:300 msgid "Status" msgstr "Статус" -#: src/slic3r/GUI/PrintHostDialogs.cpp:250 +#: src/slic3r/GUI/PrintHostDialogs.cpp:301 msgid "Host" msgstr "Хост" -#: src/slic3r/GUI/PrintHostDialogs.cpp:251 +#: src/slic3r/GUI/PrintHostDialogs.cpp:302 msgctxt "OfFile" msgid "Size" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:252 +#: src/slic3r/GUI/PrintHostDialogs.cpp:303 msgid "Filename" msgstr "Ім'я файлу" -#: src/slic3r/GUI/PrintHostDialogs.cpp:253 -msgid "Error Message" -msgstr "Повідомлення про помилку" +#: src/slic3r/GUI/PrintHostDialogs.cpp:304 +msgid "Message" +msgstr "Повідомлення" -#: src/slic3r/GUI/PrintHostDialogs.cpp:256 +#: src/slic3r/GUI/PrintHostDialogs.cpp:308 msgid "Cancel selected" msgstr "Скасувати вибране" -#: src/slic3r/GUI/PrintHostDialogs.cpp:258 +#: src/slic3r/GUI/PrintHostDialogs.cpp:310 msgid "Show error message" msgstr "Показати повідомлення про помилку" -#: src/slic3r/GUI/PrintHostDialogs.cpp:316 -#: src/slic3r/GUI/PrintHostDialogs.cpp:371 +#: src/slic3r/GUI/PrintHostDialogs.cpp:368 +#: src/slic3r/GUI/PrintHostDialogs.cpp:423 msgid "Enqueued" msgstr "У черзі" -#: src/slic3r/GUI/PrintHostDialogs.cpp:372 +#: src/slic3r/GUI/PrintHostDialogs.cpp:424 msgid "Uploading" msgstr "Завантаження" -#: src/slic3r/GUI/PrintHostDialogs.cpp:374 +#: src/slic3r/GUI/PrintHostDialogs.cpp:426 msgid "Cancelling" msgstr "Скасування" -#: src/slic3r/GUI/PrintHostDialogs.cpp:375 +#: src/slic3r/GUI/PrintHostDialogs.cpp:427 msgid "Cancelled" msgstr "Скасовано" -#: src/slic3r/GUI/PrintHostDialogs.cpp:376 +#: src/slic3r/GUI/PrintHostDialogs.cpp:428 msgid "Completed" msgstr "Завершено" -#: src/slic3r/GUI/PrintHostDialogs.cpp:424 +#: src/slic3r/GUI/PrintHostDialogs.cpp:476 msgid "Error uploading to print host:" msgstr "Помилка завантаження на хост друку:" @@ -8139,13 +9635,13 @@ msgstr "Помилка завантаження на хост друку:" msgid "NO RAMMING AT ALL" msgstr "ВЗАГАЛІ БЕЗ раммінгу" -#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 -#: src/libslic3r/PrintConfig.cpp:955 src/libslic3r/PrintConfig.cpp:999 -#: src/libslic3r/PrintConfig.cpp:1014 src/libslic3r/PrintConfig.cpp:3297 -#: src/libslic3r/PrintConfig.cpp:3306 src/libslic3r/PrintConfig.cpp:3315 -#: src/libslic3r/PrintConfig.cpp:3456 src/libslic3r/PrintConfig.cpp:3464 -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3479 -#: src/libslic3r/PrintConfig.cpp:3487 src/libslic3r/PrintConfig.cpp:3495 +#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/libslic3r/PrintConfig.cpp:1044 src/libslic3r/PrintConfig.cpp:1088 +#: src/libslic3r/PrintConfig.cpp:1103 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3578 src/libslic3r/PrintConfig.cpp:3587 +#: src/libslic3r/PrintConfig.cpp:3733 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3749 src/libslic3r/PrintConfig.cpp:3756 +#: src/libslic3r/PrintConfig.cpp:3764 src/libslic3r/PrintConfig.cpp:3772 msgid "s" msgstr "с" @@ -8153,80 +9649,116 @@ msgstr "с" msgid "Volumetric speed" msgstr "Об'ємна швидкість" -#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:912 -#: src/libslic3r/PrintConfig.cpp:1824 +#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:1001 +#: src/libslic3r/PrintConfig.cpp:1861 msgid "mm³/s" msgstr "мм³/с" -#: src/slic3r/GUI/SavePresetDialog.cpp:57 +#: src/slic3r/GUI/SavePresetDialog.cpp:90 +#, c-format, boost-format +msgid "Rename %s to:" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:90 #, c-format, boost-format msgid "Save %s as:" msgstr "Зберегти %s як:" -#: src/slic3r/GUI/SavePresetDialog.cpp:101 -#: src/slic3r/GUI/SavePresetDialog.cpp:109 +#: src/slic3r/GUI/SavePresetDialog.cpp:165 +#: src/slic3r/GUI/SavePresetDialog.cpp:173 msgid "The supplied name is not valid;" msgstr "Надане ім'я недійсне;" -#: src/slic3r/GUI/SavePresetDialog.cpp:110 +#: src/slic3r/GUI/SavePresetDialog.cpp:174 msgid "the following suffix is not allowed:" msgstr "такий суфікс не допускається:" -#: src/slic3r/GUI/SavePresetDialog.cpp:116 +#: src/slic3r/GUI/SavePresetDialog.cpp:180 msgid "The supplied name is not available." msgstr "Надане ім'я недоступне." -#: src/slic3r/GUI/SavePresetDialog.cpp:122 +#: src/slic3r/GUI/SavePresetDialog.cpp:186 +msgid "The supplied name is used for a system profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:187 msgid "Cannot overwrite a system profile." msgstr "Неможливо замінити системний профіль." -#: src/slic3r/GUI/SavePresetDialog.cpp:127 +#: src/slic3r/GUI/SavePresetDialog.cpp:192 +msgid "The supplied name is used for a external profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:193 msgid "Cannot overwrite an external profile." msgstr "Неможливо замінити сторонній профіль." -#: src/slic3r/GUI/SavePresetDialog.cpp:134 +#: src/slic3r/GUI/SavePresetDialog.cpp:203 +msgid "Save preset modifications to existing user profile" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:205 +msgid "Nothing changed" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:210 #, boost-format msgid "Preset with name \"%1%\" already exists." msgstr "Пресет з ім'ям \"%1%\" вже існує." -#: src/slic3r/GUI/SavePresetDialog.cpp:136 +#: src/slic3r/GUI/SavePresetDialog.cpp:212 #, boost-format msgid "" "Preset with name \"%1%\" already exists and is incompatible with selected " "printer." msgstr "Пресет з ім'ям \"%1%\" вже існує і несумісний з вибраним принтером." -#: src/slic3r/GUI/SavePresetDialog.cpp:137 +#: src/slic3r/GUI/SavePresetDialog.cpp:213 msgid "Note: This preset will be replaced after saving" msgstr "Примітка: Цей пресет буде замінено після збереження" -#: src/slic3r/GUI/SavePresetDialog.cpp:142 +#: src/slic3r/GUI/SavePresetDialog.cpp:219 msgid "The name cannot be empty." msgstr "Ім'я не може бути порожнім." -#: src/slic3r/GUI/SavePresetDialog.cpp:147 +#: src/slic3r/GUI/SavePresetDialog.cpp:230 +msgid "The name is too long." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:235 msgid "The name cannot start with space character." msgstr "Ім'я не може починатися з пробілу." -#: src/slic3r/GUI/SavePresetDialog.cpp:152 +#: src/slic3r/GUI/SavePresetDialog.cpp:240 msgid "The name cannot end with space character." msgstr "Ім'я не може закінчуватися пробілом." -#: src/slic3r/GUI/SavePresetDialog.cpp:157 +#: src/slic3r/GUI/SavePresetDialog.cpp:245 msgid "The name cannot be the same as a preset alias name." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:191 -#: src/slic3r/GUI/SavePresetDialog.cpp:197 +#: src/slic3r/GUI/SavePresetDialog.cpp:289 msgid "Save preset" msgstr "Зберегти налаштування" -#: src/slic3r/GUI/SavePresetDialog.cpp:221 +#: src/slic3r/GUI/SavePresetDialog.cpp:295 +msgid "Save presets" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:302 +msgid "Rename preset" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:327 msgctxt "PresetName" msgid "Copy" msgstr "Копія" -#: src/slic3r/GUI/SavePresetDialog.cpp:283 +#: src/slic3r/GUI/SavePresetDialog.cpp:347 +msgid "Save as profile derived from current printer only." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:407 #, boost-format msgid "" "You have selected physical printer \"%1%\" \n" @@ -8235,82 +9767,94 @@ msgstr "" "Ви вибрали фізичний принтер \"%1%\"\n" "із пов'язаним пресетом \"%2%\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:322 +#: src/slic3r/GUI/SavePresetDialog.cpp:446 #, boost-format msgid "What would you like to do with \"%1%\" preset after saving?" msgstr "Що ви хочете зробити із пресетом \"%1%\" після збереження?" -#: src/slic3r/GUI/SavePresetDialog.cpp:325 +#: src/slic3r/GUI/SavePresetDialog.cpp:449 #, boost-format msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" msgstr "Для цього фізичного принтера \"%3%\" змінити \"%1%\" на \"%2%\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:326 +#: src/slic3r/GUI/SavePresetDialog.cpp:450 #, boost-format msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" msgstr "Додати \"%1%\" як наступний пресет для фізичного принтера \"%2%\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:327 +#: src/slic3r/GUI/SavePresetDialog.cpp:451 #, boost-format msgid "Just switch to \"%1%\" preset" msgstr "Просто переключитися до пресету \"%1%\"" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2652 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2645 msgid "Stealth" msgstr "Тихий" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2646 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2639 msgid "Normal" msgstr "Нормальний" -#: src/slic3r/GUI/Selection.cpp:168 +#: src/slic3r/GUI/Selection.cpp:180 msgid "Selection-Add" msgstr "Виділення - Додано" -#: src/slic3r/GUI/Selection.cpp:209 +#: src/slic3r/GUI/Selection.cpp:221 msgid "Selection-Remove" msgstr "Виділення - Видалено" -#: src/slic3r/GUI/Selection.cpp:241 +#: src/slic3r/GUI/Selection.cpp:253 msgid "Selection-Add Object" msgstr "Виділення - Додано об'єкт" -#: src/slic3r/GUI/Selection.cpp:260 +#: src/slic3r/GUI/Selection.cpp:272 msgid "Selection-Remove Object" msgstr "Виділення - Видалено об'єкт" -#: src/slic3r/GUI/Selection.cpp:278 +#: src/slic3r/GUI/Selection.cpp:290 msgid "Selection-Add Instance" msgstr "Виділення - Додано екземпляр" -#: src/slic3r/GUI/Selection.cpp:297 +#: src/slic3r/GUI/Selection.cpp:309 msgid "Selection-Remove Instance" msgstr "Виділення - Видалено екземпляр" -#: src/slic3r/GUI/Selection.cpp:394 +#: src/slic3r/GUI/Selection.cpp:406 msgid "Selection-Add All" msgstr "Виділення - Додано все" -#: src/slic3r/GUI/Selection.cpp:419 +#: src/slic3r/GUI/Selection.cpp:431 msgid "Selection-Remove All" msgstr "Виділення - Видалено все" -#: src/slic3r/GUI/Selection.cpp:950 +#: src/slic3r/GUI/Selection.cpp:1309 msgid "Scale To Fit" msgstr "Масштабувати під область друку" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:114 +#: src/slic3r/GUI/Selection.cpp:1691 +msgid "" +"The currently manipulated object is tilted or contains tilted parts " +"(rotation angles are not multiples of 90°). Non-uniform scaling of tilted " +"objects is only possible in non-local coordinate systems, once the rotation " +"is embedded into the object coordinates." +msgstr "" + +#: src/slic3r/GUI/Selection.cpp:1694 +msgid "This operation is irreversible." +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:117 msgid "Data to send" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:550 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:618 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:557 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:624 msgid "Send system info" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:581 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:587 #, boost-format msgid "" "This is the first time you are running %1%. We would like to ask you to send " @@ -8319,18 +9863,18 @@ msgid "" "version)." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:585 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:591 msgid "" "If we know your hardware, operating system, etc., it will greatly help us in " "development and prioritization, because we will be able to focus our effort " "more efficiently and spend time on features that are needed the most." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:588 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:594 msgid "Is it safe?" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:590 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:596 #, boost-format msgid "" "We do not send any personal information nor anything that would allow us to " @@ -8341,81 +9885,86 @@ msgid "" "inspect the code actually performing the communication, see %1%." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:614 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:620 msgid "Show verbatim data that will be sent" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:616 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:622 msgid "Ask me next time" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:617 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:623 msgid "Do not send anything" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:703 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:709 msgid "System info sent successfully. Thank you." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:706 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:712 msgid "Sending system info failed!" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:713 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:719 msgid "Sending system info was cancelled." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:720 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:726 msgid "Sending system info..." msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:84 +#: src/slic3r/GUI/SysInfoDialog.cpp:92 msgid "System Information" msgstr "Інформація про систему" -#: src/slic3r/GUI/SysInfoDialog.cpp:150 +#: src/slic3r/GUI/SysInfoDialog.cpp:160 msgid "Blacklisted libraries loaded into PrusaSlicer process:" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:162 +#: src/slic3r/GUI/SysInfoDialog.cpp:172 msgid "Eigen vectorization supported:" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:169 +#: src/slic3r/GUI/SysInfoDialog.cpp:179 msgid "Copy to Clipboard" msgstr "Скопіювати в буфер обміну" -#: src/slic3r/GUI/Tab.cpp:114 src/libslic3r/PrintConfig.cpp:565 +#: src/slic3r/GUI/Tab.cpp:68 src/libslic3r/PrintConfig.cpp:668 msgid "Compatible printers" msgstr "Сумісні принтери" -#: src/slic3r/GUI/Tab.cpp:115 +#: src/slic3r/GUI/Tab.cpp:69 msgid "Select the printers this profile is compatible with." msgstr "Оберіть принтери, сумісні з цим профілем." -#: src/slic3r/GUI/Tab.cpp:120 src/libslic3r/PrintConfig.cpp:580 +#: src/slic3r/GUI/Tab.cpp:74 src/libslic3r/PrintConfig.cpp:683 msgid "Compatible print profiles" msgstr "Сумісні пресети друку" -#: src/slic3r/GUI/Tab.cpp:121 +#: src/slic3r/GUI/Tab.cpp:75 msgid "Select the print profiles this profile is compatible with." msgstr "Оберіть профілі друку, з якими цей профіль сумісний." -#: src/slic3r/GUI/Tab.cpp:216 +#: src/slic3r/GUI/Tab.cpp:165 msgid "Compare this preset with some another" msgstr "" #. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:218 +#: src/slic3r/GUI/Tab.cpp:167 #, c-format, boost-format msgid "Save current %s" msgstr "Зберегти поточний %s" -#: src/slic3r/GUI/Tab.cpp:219 +#: src/slic3r/GUI/Tab.cpp:168 +#, c-format, boost-format +msgid "Rename current %s" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:170 msgid "Delete this preset" msgstr "Видалити це налаштування" -#: src/slic3r/GUI/Tab.cpp:223 +#: src/slic3r/GUI/Tab.cpp:174 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." @@ -8423,16 +9972,16 @@ msgstr "" "Наведіть курсор на кнопки, щоб знайти додаткову інформацію\n" "або натисніть цю кнопку." -#: src/slic3r/GUI/Tab.cpp:227 +#: src/slic3r/GUI/Tab.cpp:178 #, boost-format msgid "Search in settings [%1%]" msgstr "Шукайте в налаштуваннях [%1%]" -#: src/slic3r/GUI/Tab.cpp:1298 +#: src/slic3r/GUI/Tab.cpp:1243 msgid "Detach from system preset" msgstr "Від'єднати від системного пресету" -#: src/slic3r/GUI/Tab.cpp:1311 +#: src/slic3r/GUI/Tab.cpp:1256 msgid "" "A copy of the current system preset will be created, which will be detached " "from the system preset." @@ -8440,225 +9989,233 @@ msgstr "" "Буде створено копію поточного системного пресету, який буде від'єднано від " "системного пресету." -#: src/slic3r/GUI/Tab.cpp:1312 +#: src/slic3r/GUI/Tab.cpp:1257 msgid "" "The current custom preset will be detached from the parent system preset." msgstr "" "Поточний власний пресет буде від'єднаний від батьківського системного " "пресету." -#: src/slic3r/GUI/Tab.cpp:1315 +#: src/slic3r/GUI/Tab.cpp:1260 msgid "Modifications to the current profile will be saved." msgstr "Зміни до поточного профілю буде збережено." -#: src/slic3r/GUI/Tab.cpp:1321 +#: src/slic3r/GUI/Tab.cpp:1266 msgid "Detach preset" msgstr "Від'єднати пресет" -#: src/slic3r/GUI/Tab.cpp:1347 +#: src/slic3r/GUI/Tab.cpp:1292 msgid "This is a default preset." msgstr "Цей пресет є пресетом за-замовчуванням." -#: src/slic3r/GUI/Tab.cpp:1349 +#: src/slic3r/GUI/Tab.cpp:1294 msgid "This is a system preset." msgstr "Цей пресет є системним пресетом." -#: src/slic3r/GUI/Tab.cpp:1351 +#: src/slic3r/GUI/Tab.cpp:1296 msgid "Current preset is inherited from the default preset." msgstr "Поточний пресет успадковується від пресету за замовчуванням." -#: src/slic3r/GUI/Tab.cpp:1355 +#: src/slic3r/GUI/Tab.cpp:1300 msgid "Current preset is inherited from" msgstr "Поточний пресет успадковується від" -#: src/slic3r/GUI/Tab.cpp:1359 +#: src/slic3r/GUI/Tab.cpp:1304 msgid "It can't be deleted or modified." msgstr "Його не можна видалити або змінити." -#: src/slic3r/GUI/Tab.cpp:1360 +#: src/slic3r/GUI/Tab.cpp:1305 msgid "" "Any modifications should be saved as a new preset inherited from this one." msgstr "" "Будь-які модифікації слід зберігати як новий пресет, успадкований від цього." -#: src/slic3r/GUI/Tab.cpp:1361 +#: src/slic3r/GUI/Tab.cpp:1306 msgid "To do that please specify a new name for the preset." msgstr "Для цього вкажіть нову назву пресету." -#: src/slic3r/GUI/Tab.cpp:1365 +#: src/slic3r/GUI/Tab.cpp:1310 msgid "Additional information:" msgstr "Додаткова інформація:" -#: src/slic3r/GUI/Tab.cpp:1371 +#: src/slic3r/GUI/Tab.cpp:1316 msgid "printer model" msgstr "модель принтеру" -#: src/slic3r/GUI/Tab.cpp:1379 +#: src/slic3r/GUI/Tab.cpp:1324 msgid "default print profile" msgstr "профіль друку за замовчанням" -#: src/slic3r/GUI/Tab.cpp:1382 +#: src/slic3r/GUI/Tab.cpp:1327 msgid "default filament profile" msgstr "профіль філаметну за замовчанням" -#: src/slic3r/GUI/Tab.cpp:1396 +#: src/slic3r/GUI/Tab.cpp:1341 msgid "default SLA material profile" msgstr "профіль SLA-матеріалу за замовчанням" -#: src/slic3r/GUI/Tab.cpp:1400 +#: src/slic3r/GUI/Tab.cpp:1345 msgid "default SLA print profile" msgstr "профіль SLA-друку за замовчанням" -#: src/slic3r/GUI/Tab.cpp:1408 +#: src/slic3r/GUI/Tab.cpp:1353 msgid "full profile name" msgstr "повне ім'я профілю" -#: src/slic3r/GUI/Tab.cpp:1409 +#: src/slic3r/GUI/Tab.cpp:1354 msgid "symbolic profile name" msgstr "символічне ім'я профілю" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4657 +#: src/slic3r/GUI/Tab.cpp:1392 src/slic3r/GUI/Tab.cpp:4940 msgid "Layers and perimeters" msgstr "Шари та периметри" -#: src/slic3r/GUI/Tab.cpp:1453 +#: src/slic3r/GUI/Tab.cpp:1398 msgid "Vertical shells" msgstr "Вертикальні оболонки" -#: src/slic3r/GUI/Tab.cpp:1465 +#: src/slic3r/GUI/Tab.cpp:1410 msgid "Horizontal shells" msgstr "Горизонтальні оболонки" -#: src/slic3r/GUI/Tab.cpp:1466 src/libslic3r/PrintConfig.cpp:2417 +#: src/slic3r/GUI/Tab.cpp:1411 src/libslic3r/PrintConfig.cpp:2448 msgid "Solid layers" msgstr "Суцільні шари" -#: src/slic3r/GUI/Tab.cpp:1471 +#: src/slic3r/GUI/Tab.cpp:1416 msgid "Minimum shell thickness" msgstr "Мінімальна товщина оболонки" -#: src/slic3r/GUI/Tab.cpp:1482 +#: src/slic3r/GUI/Tab.cpp:1427 msgid "Quality (slower slicing)" msgstr "Якість (повільне нарізання)" -#: src/slic3r/GUI/Tab.cpp:1497 +#: src/slic3r/GUI/Tab.cpp:1444 msgid "Fuzzy skin (experimental)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1520 +#: src/slic3r/GUI/Tab.cpp:1467 msgid "Reducing printing time" msgstr "Зниження часу друку" -#: src/slic3r/GUI/Tab.cpp:1535 src/libslic3r/ExtrusionEntity.cpp:370 +#: src/slic3r/GUI/Tab.cpp:1482 msgid "Skirt" msgstr "Плінтус" -#: src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1504 msgid "Raft" msgstr "Пліт" -#: src/slic3r/GUI/Tab.cpp:1562 +#: src/slic3r/GUI/Tab.cpp:1509 msgid "Options for support material and raft" msgstr "Варіанти для опорного матеріалу та плоту" -#: src/slic3r/GUI/Tab.cpp:1582 +#: src/slic3r/GUI/Tab.cpp:1528 +msgid "Organic supports" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1537 msgid "Speed for print moves" msgstr "Швидкість друкарських рухів" -#: src/slic3r/GUI/Tab.cpp:1595 +#: src/slic3r/GUI/Tab.cpp:1550 +msgid "Dynamic overhang speed" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1557 msgid "Speed for non-print moves" msgstr "Швидкість недрукарських рухів" -#: src/slic3r/GUI/Tab.cpp:1599 +#: src/slic3r/GUI/Tab.cpp:1561 msgid "Modifiers" msgstr "Модифікатори" -#: src/slic3r/GUI/Tab.cpp:1603 +#: src/slic3r/GUI/Tab.cpp:1565 msgid "Acceleration control (advanced)" msgstr "Контроль прискорення (розширений)" -#: src/slic3r/GUI/Tab.cpp:1614 +#: src/slic3r/GUI/Tab.cpp:1576 msgid "Autospeed (advanced)" msgstr "Автоматична швидкість (розширена)" -#: src/slic3r/GUI/Tab.cpp:1618 +#: src/slic3r/GUI/Tab.cpp:1580 msgid "Pressure equalizer (experimental)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1622 +#: src/slic3r/GUI/Tab.cpp:1584 msgid "Multiple Extruders" msgstr "Кілька екструдерів" -#: src/slic3r/GUI/Tab.cpp:1630 +#: src/slic3r/GUI/Tab.cpp:1592 msgid "Ooze prevention" msgstr "Запобігання просочування" -#: src/slic3r/GUI/Tab.cpp:1650 +#: src/slic3r/GUI/Tab.cpp:1596 +msgid "Wipe tower" +msgstr "Вежа витирання" + +#: src/slic3r/GUI/Tab.cpp:1612 msgid "Extrusion width" msgstr "Ширина екструзії" -#: src/slic3r/GUI/Tab.cpp:1660 +#: src/slic3r/GUI/Tab.cpp:1622 msgid "Overlap" msgstr "Перекриття" -#: src/slic3r/GUI/Tab.cpp:1663 +#: src/slic3r/GUI/Tab.cpp:1625 msgid "Flow" msgstr "Потік" -#: src/slic3r/GUI/Tab.cpp:1674 src/slic3r/GUI/Tab.cpp:1700 -msgid "Other" -msgstr "Інше" - -#: src/slic3r/GUI/Tab.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:1636 msgid "Arachne perimeter generator" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1685 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1644 src/slic3r/GUI/Tab.cpp:4990 msgid "Output options" msgstr "Параметри виводу" -#: src/slic3r/GUI/Tab.cpp:1686 +#: src/slic3r/GUI/Tab.cpp:1645 msgid "Sequential printing" msgstr "Послідовне друкування" -#: src/slic3r/GUI/Tab.cpp:1688 +#: src/slic3r/GUI/Tab.cpp:1647 msgid "Extruder clearance" msgstr "Область зіткнення екструдера" -#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:4735 +#: src/slic3r/GUI/Tab.cpp:1652 src/slic3r/GUI/Tab.cpp:4991 msgid "Output file" msgstr "Вихідний файл" -#: src/slic3r/GUI/Tab.cpp:1712 src/libslic3r/PrintConfig.cpp:2042 +#: src/slic3r/GUI/Tab.cpp:1671 src/libslic3r/PrintConfig.cpp:2072 msgid "Post-processing scripts" msgstr "Скрипти пост-обробки" -#: src/slic3r/GUI/Tab.cpp:1724 src/slic3r/GUI/Tab.cpp:1725 -#: src/slic3r/GUI/Tab.cpp:2110 src/slic3r/GUI/Tab.cpp:2111 -#: src/slic3r/GUI/Tab.cpp:2498 src/slic3r/GUI/Tab.cpp:2499 -#: src/slic3r/GUI/Tab.cpp:2571 src/slic3r/GUI/Tab.cpp:2572 -#: src/slic3r/GUI/Tab.cpp:3957 src/slic3r/GUI/Tab.cpp:4585 -#: src/slic3r/GUI/Tab.cpp:4586 +#: src/slic3r/GUI/Tab.cpp:1683 src/slic3r/GUI/Tab.cpp:1684 +#: src/slic3r/GUI/Tab.cpp:2080 src/slic3r/GUI/Tab.cpp:2081 +#: src/slic3r/GUI/Tab.cpp:2486 src/slic3r/GUI/Tab.cpp:2487 +#: src/slic3r/GUI/Tab.cpp:2564 src/slic3r/GUI/Tab.cpp:2565 +#: src/slic3r/GUI/Tab.cpp:4182 src/slic3r/GUI/Tab.cpp:4822 +#: src/slic3r/GUI/Tab.cpp:4823 msgid "Notes" msgstr "Примітки" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:2088 +#: src/slic3r/GUI/Tab.cpp:2493 src/slic3r/GUI/Tab.cpp:2571 +#: src/slic3r/GUI/Tab.cpp:4830 src/slic3r/GUI/Tab.cpp:4996 msgid "Dependencies" msgstr "Залежності" -#: src/slic3r/GUI/Tab.cpp:1732 src/slic3r/GUI/Tab.cpp:2119 -#: src/slic3r/GUI/Tab.cpp:2506 src/slic3r/GUI/Tab.cpp:2579 -#: src/slic3r/GUI/Tab.cpp:4594 src/slic3r/GUI/Tab.cpp:4741 +#: src/slic3r/GUI/Tab.cpp:1691 src/slic3r/GUI/Tab.cpp:2089 +#: src/slic3r/GUI/Tab.cpp:2494 src/slic3r/GUI/Tab.cpp:2572 +#: src/slic3r/GUI/Tab.cpp:4831 src/slic3r/GUI/Tab.cpp:4997 msgid "Profile dependencies" msgstr "Залежності профілю" -#: src/slic3r/GUI/Tab.cpp:1771 +#: src/slic3r/GUI/Tab.cpp:1723 msgid "Post processing scripts shall modify G-code file in place." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1850 +#: src/slic3r/GUI/Tab.cpp:1802 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8672,7 +10229,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/Tab.cpp:1855 +#: src/slic3r/GUI/Tab.cpp:1807 msgid "Found reserved keywords in" msgstr "" @@ -8680,74 +10237,90 @@ msgstr "" msgid "Filament Overrides" msgstr "Переписування глобальних змінних" -#: src/slic3r/GUI/Tab.cpp:1992 +#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2827 +msgid "Retraction" +msgstr "Переривання" + +#: src/slic3r/GUI/Tab.cpp:1951 +msgid "Temperature" +msgstr "Температура" + +#: src/slic3r/GUI/Tab.cpp:1955 msgid "Nozzle" msgstr "Сопло" -#: src/slic3r/GUI/Tab.cpp:1997 +#: src/slic3r/GUI/Tab.cpp:1960 msgid "Bed" msgstr "Стіл" -#: src/slic3r/GUI/Tab.cpp:2002 +#: src/slic3r/GUI/Tab.cpp:1965 msgid "Cooling" msgstr "Охолодження" -#: src/slic3r/GUI/Tab.cpp:2004 src/libslic3r/PrintConfig.cpp:1936 -#: src/libslic3r/PrintConfig.cpp:2994 +#: src/slic3r/GUI/Tab.cpp:1967 src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "Enable" msgstr "Увімкнути" -#: src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/Tab.cpp:1978 msgid "Fan settings" msgstr "Налаштування вентилятора" -#: src/slic3r/GUI/Tab.cpp:2026 +#: src/slic3r/GUI/Tab.cpp:1979 +msgid "Fan speed" +msgstr "Швидкість вентилятора" + +#: src/slic3r/GUI/Tab.cpp:1989 +msgid "Dynamic fan speeds" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1996 msgid "Cooling thresholds" msgstr "Пороги охолодження" -#: src/slic3r/GUI/Tab.cpp:2032 +#: src/slic3r/GUI/Tab.cpp:2002 msgid "Filament properties" msgstr "Властивості філаменту" -#: src/slic3r/GUI/Tab.cpp:2039 +#: src/slic3r/GUI/Tab.cpp:2009 msgid "Print speed override" msgstr "Перевизначення швидкості друку" -#: src/slic3r/GUI/Tab.cpp:2049 +#: src/slic3r/GUI/Tab.cpp:2019 msgid "Wipe tower parameters" msgstr "Параметри вежі витирання" -#: src/slic3r/GUI/Tab.cpp:2052 +#: src/slic3r/GUI/Tab.cpp:2022 msgid "Toolchange parameters with single extruder MM printers" msgstr "Параметри зміни інструменту в одно-екструдерному ММ-принтері" -#: src/slic3r/GUI/Tab.cpp:2065 +#: src/slic3r/GUI/Tab.cpp:2035 msgid "Ramming settings" msgstr "Налаштування раммінгу" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 -#: src/slic3r/GUI/Tab.cpp:4264 src/libslic3r/GCode.cpp:733 -#: src/libslic3r/PrintConfig.cpp:2500 +#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:2398 +#: src/slic3r/GUI/Tab.cpp:4493 src/libslic3r/GCode.cpp:684 +#: src/libslic3r/PrintConfig.cpp:2532 msgid "Custom G-code" msgstr "Користувацький G-код" -#: src/slic3r/GUI/Tab.cpp:2090 src/slic3r/GUI/Tab.cpp:2411 -#: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2450 -#: src/libslic3r/PrintConfig.cpp:2465 +#: src/slic3r/GUI/Tab.cpp:2060 src/slic3r/GUI/Tab.cpp:2399 +#: src/libslic3r/GCode.cpp:658 src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2497 msgid "Start G-code" msgstr "Початок G-коду" -#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:2421 -#: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:685 -#: src/libslic3r/PrintConfig.cpp:695 +#: src/slic3r/GUI/Tab.cpp:2070 src/slic3r/GUI/Tab.cpp:2409 +#: src/libslic3r/GCode.cpp:659 src/libslic3r/PrintConfig.cpp:788 +#: src/libslic3r/PrintConfig.cpp:798 msgid "End G-code" msgstr "Закінчення G-коду" -#: src/slic3r/GUI/Tab.cpp:2153 +#: src/slic3r/GUI/Tab.cpp:2115 msgid "Volumetric flow hints not available" msgstr "Підказки об'ємного потоку відсутні" -#: src/slic3r/GUI/Tab.cpp:2257 +#: src/slic3r/GUI/Tab.cpp:2241 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -8769,20 +10342,20 @@ msgstr "" "вкладці \"Параметри принтеру\". Профілі фізичного принтера зберігаються в " "каталозі \"PrusaSlicer/physical_printer\"." -#: src/slic3r/GUI/Tab.cpp:2291 src/slic3r/GUI/Tab.cpp:2518 +#: src/slic3r/GUI/Tab.cpp:2275 src/slic3r/GUI/Tab.cpp:2506 msgid "Size and coordinates" msgstr "Розмір і координати" -#: src/slic3r/GUI/Tab.cpp:2300 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:2284 src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "Capabilities" msgstr "Можливості" -#: src/slic3r/GUI/Tab.cpp:2305 +#: src/slic3r/GUI/Tab.cpp:2289 msgid "Number of extruders of the printer." msgstr "Кількість екструдерів у принтері." -#: src/slic3r/GUI/Tab.cpp:2334 +#: src/slic3r/GUI/Tab.cpp:2322 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -8794,105 +10367,101 @@ msgstr "" "Хочете змінити діаметр для всіх екструдерів на значення діаметра сопла " "першого екструдера?" -#: src/slic3r/GUI/Tab.cpp:2338 src/slic3r/GUI/Tab.cpp:2782 -#: src/libslic3r/PrintConfig.cpp:1900 +#: src/slic3r/GUI/Tab.cpp:2326 src/slic3r/GUI/Tab.cpp:2714 +#: src/libslic3r/PrintConfig.cpp:1937 msgid "Nozzle diameter" msgstr "Діаметр сопла" -#: src/slic3r/GUI/Tab.cpp:2431 src/libslic3r/GCode.cpp:709 -#: src/libslic3r/PrintConfig.cpp:425 +#: src/slic3r/GUI/Tab.cpp:2419 src/libslic3r/GCode.cpp:660 +#: src/libslic3r/PrintConfig.cpp:444 msgid "Before layer change G-code" msgstr "G-код перед зміною шару" -#: src/slic3r/GUI/Tab.cpp:2441 src/libslic3r/GCode.cpp:710 -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/slic3r/GUI/Tab.cpp:2429 src/libslic3r/GCode.cpp:661 +#: src/libslic3r/PrintConfig.cpp:1665 msgid "After layer change G-code" msgstr "G-код після зміни шару" -#: src/slic3r/GUI/Tab.cpp:2451 src/libslic3r/GCode.cpp:711 -#: src/libslic3r/PrintConfig.cpp:2877 +#: src/slic3r/GUI/Tab.cpp:2439 src/libslic3r/GCode.cpp:662 +#: src/libslic3r/PrintConfig.cpp:2965 msgid "Tool change G-code" msgstr "G-код зміни інструменту" -#: src/slic3r/GUI/Tab.cpp:2461 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2449 src/libslic3r/GCode.cpp:663 msgid "Between objects G-code (for sequential printing)" msgstr "G-код між об'єктами (для послідовного друку)" -#: src/slic3r/GUI/Tab.cpp:2471 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2459 src/libslic3r/GCode.cpp:664 msgid "Color Change G-code" msgstr "G-код зміни кольору" -#: src/slic3r/GUI/Tab.cpp:2480 src/libslic3r/GCode.cpp:714 -#: src/libslic3r/PrintConfig.cpp:2491 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:665 +#: src/libslic3r/PrintConfig.cpp:2523 msgid "Pause Print G-code" msgstr "G-код для паузи друку" -#: src/slic3r/GUI/Tab.cpp:2489 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:666 msgid "Template Custom G-code" msgstr "Шаблон власного G-коду" -#: src/slic3r/GUI/Tab.cpp:2525 +#: src/slic3r/GUI/Tab.cpp:2513 msgid "Display" msgstr "Дисплей" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2528 msgid "Tilt" msgstr "Нахил" -#: src/slic3r/GUI/Tab.cpp:2541 +#: src/slic3r/GUI/Tab.cpp:2529 msgid "Tilt time" msgstr "Час нахилу" -#: src/slic3r/GUI/Tab.cpp:2548 src/slic3r/GUI/Tab.cpp:4575 +#: src/slic3r/GUI/Tab.cpp:2536 src/slic3r/GUI/Tab.cpp:4812 msgid "Corrections" msgstr "Поправки" -#: src/slic3r/GUI/Tab.cpp:2561 src/slic3r/GUI/Tab.cpp:4571 +#: src/slic3r/GUI/Tab.cpp:2549 src/slic3r/GUI/Tab.cpp:4808 msgid "Exposure" msgstr "Експозиція" -#: src/slic3r/GUI/Tab.cpp:2622 src/slic3r/GUI/Tab.cpp:2709 -#: src/libslic3r/PrintConfig.cpp:1655 src/libslic3r/PrintConfig.cpp:1690 -#: src/libslic3r/PrintConfig.cpp:1707 src/libslic3r/PrintConfig.cpp:1724 -#: src/libslic3r/PrintConfig.cpp:1740 src/libslic3r/PrintConfig.cpp:1750 -#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1773 -#: src/libslic3r/PrintConfig.cpp:1783 +#: src/slic3r/GUI/Tab.cpp:2556 +msgid "Output" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2615 src/slic3r/GUI/Tab.cpp:2875 +#: src/libslic3r/PrintConfig.cpp:1694 src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1744 src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1777 src/libslic3r/PrintConfig.cpp:1787 +#: src/libslic3r/PrintConfig.cpp:1797 src/libslic3r/PrintConfig.cpp:1810 +#: src/libslic3r/PrintConfig.cpp:1820 msgid "Machine limits" msgstr "Механічних обмеження" -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2638 msgid "Values in this column are for Normal mode" msgstr "Значення в цьому стовпці для нормального режиму" -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2644 msgid "Values in this column are for Stealth mode" msgstr "Значення в цьому стовпці для тихого режиму" -#: src/slic3r/GUI/Tab.cpp:2660 +#: src/slic3r/GUI/Tab.cpp:2653 msgid "Maximum feedrates" msgstr "Максимальна швидкість подачі" -#: src/slic3r/GUI/Tab.cpp:2665 +#: src/slic3r/GUI/Tab.cpp:2658 msgid "Maximum accelerations" msgstr "Максимальні прискорення" -#: src/slic3r/GUI/Tab.cpp:2674 +#: src/slic3r/GUI/Tab.cpp:2667 msgid "Jerk limits" msgstr "Обмеження ривку" -#: src/slic3r/GUI/Tab.cpp:2680 +#: src/slic3r/GUI/Tab.cpp:2673 msgid "Minimum feedrates" msgstr "Мінімальна швидкість подачі" -#: src/slic3r/GUI/Tab.cpp:2734 src/slic3r/GUI/Tab.cpp:2743 -msgid "Single extruder MM setup" -msgstr "Налаштування MM екструдера" - -#: src/slic3r/GUI/Tab.cpp:2744 -msgid "Single extruder multimaterial parameters" -msgstr "Параметри екструдеру в багато-екструдерному принтері" - -#: src/slic3r/GUI/Tab.cpp:2779 +#: src/slic3r/GUI/Tab.cpp:2711 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -8900,19 +10469,27 @@ msgstr "" "Це одно-екструдерний багато-матеріальний принтер, діаметри всіх екструдерів " "будуть встановлені на нове значення. Ви хочете продовжити?" -#: src/slic3r/GUI/Tab.cpp:2804 +#: src/slic3r/GUI/Tab.cpp:2739 +msgid "Reset to Filament Color" +msgstr "Скинути до кольору філаменту" + +#: src/slic3r/GUI/Tab.cpp:2775 +msgid "Apply below setting to other extruders" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2820 msgid "Layer height limits" msgstr "Межі висоти шару" -#: src/slic3r/GUI/Tab.cpp:2809 +#: src/slic3r/GUI/Tab.cpp:2824 msgid "Position (for multi-extruder printers)" msgstr "Позиція (для мульти-екструдерних принтерів)" -#: src/slic3r/GUI/Tab.cpp:2815 +#: src/slic3r/GUI/Tab.cpp:2830 msgid "Only lift Z" msgstr "Межі підняття Z" -#: src/slic3r/GUI/Tab.cpp:2828 +#: src/slic3r/GUI/Tab.cpp:2843 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -8920,11 +10497,15 @@ msgstr "" "Переривання при відключенні інструмента (додаткові налаштування для " "налагодження мульти-екструдерів)" -#: src/slic3r/GUI/Tab.cpp:2835 -msgid "Reset to Filament Color" -msgstr "Скинути до кольору філаменту" +#: src/slic3r/GUI/Tab.cpp:2900 src/slic3r/GUI/Tab.cpp:2909 +msgid "Single extruder MM setup" +msgstr "Налаштування MM екструдера" + +#: src/slic3r/GUI/Tab.cpp:2910 +msgid "Single extruder multimaterial parameters" +msgstr "Параметри екструдеру в багато-екструдерному принтері" -#: src/slic3r/GUI/Tab.cpp:3012 +#: src/slic3r/GUI/Tab.cpp:3074 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -8935,31 +10516,48 @@ msgstr "" "\n" "Відключити його для увімкнення програмного переривання?" -#: src/slic3r/GUI/Tab.cpp:3014 +#: src/slic3r/GUI/Tab.cpp:3076 msgid "Firmware Retraction" msgstr "Програмне переривання" -#: src/slic3r/GUI/Tab.cpp:3319 +#: src/slic3r/GUI/Tab.cpp:3384 msgid "New printer preset selected" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3625 +#: src/slic3r/GUI/Tab.cpp:3758 msgid "Detached" msgstr "Від'єднаний" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3857 +msgid "" +"The physical printer below is based on the preset, you are going to rename." +msgid_plural "" +"The physical printers below are based on the preset, you are going to rename." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: src/slic3r/GUI/Tab.cpp:3862 +msgid "Note, that the selected preset will be renamed in this printer too." +msgid_plural "" +"Note, that the selected preset will be renamed in these printers too." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: src/slic3r/GUI/Tab.cpp:3924 msgid "remove" msgstr "видалити" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3924 msgid "delete" msgstr "видалити" -#: src/slic3r/GUI/Tab.cpp:3711 +#: src/slic3r/GUI/Tab.cpp:3933 msgid "It's a last preset for this physical printer." msgstr "Це останній пресет для цього фізичного принтера." -#: src/slic3r/GUI/Tab.cpp:3716 +#: src/slic3r/GUI/Tab.cpp:3938 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " @@ -8967,7 +10565,7 @@ msgid "" msgstr "" "Ви впевнені, що хочете видалити пресет \"%1%\" із фізичного принтера \"%2%\"?" -#: src/slic3r/GUI/Tab.cpp:3728 +#: src/slic3r/GUI/Tab.cpp:3950 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -8976,7 +10574,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/Tab.cpp:3733 +#: src/slic3r/GUI/Tab.cpp:3955 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." @@ -8984,7 +10582,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/Tab.cpp:3738 +#: src/slic3r/GUI/Tab.cpp:3960 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -8995,7 +10593,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/Tab.cpp:3743 +#: src/slic3r/GUI/Tab.cpp:3965 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -9004,57 +10602,57 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/Tab.cpp:3748 +#: src/slic3r/GUI/Tab.cpp:3970 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "Ви впевнені, що хочете %1% вибраний пресет?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3753 +#: src/slic3r/GUI/Tab.cpp:3975 #, boost-format msgid "%1% Preset" msgstr "%1% пресет" -#: src/slic3r/GUI/Tab.cpp:3836 src/slic3r/GUI/Tab.cpp:4198 +#: src/slic3r/GUI/Tab.cpp:4061 src/slic3r/GUI/Tab.cpp:4423 msgid "Set" msgstr "Встановити" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:4180 msgid "Find" msgstr "Знайти" -#: src/slic3r/GUI/Tab.cpp:3956 +#: src/slic3r/GUI/Tab.cpp:4181 msgid "Replace with" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4045 +#: src/slic3r/GUI/Tab.cpp:4270 msgid "Regular expression" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4049 +#: src/slic3r/GUI/Tab.cpp:4274 msgid "Case insensitive" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4053 +#: src/slic3r/GUI/Tab.cpp:4278 msgid "Whole word" msgstr "Тільки цілі слова" -#: src/slic3r/GUI/Tab.cpp:4057 +#: src/slic3r/GUI/Tab.cpp:4282 msgid "Match single line" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4160 +#: src/slic3r/GUI/Tab.cpp:4385 msgid "Are you sure you want to delete all substitutions?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4292 +#: src/slic3r/GUI/Tab.cpp:4521 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" "Механічних обмеження публікуватимуться в G-код і використовуватимуться для " "розрахунку часу друку." -#: src/slic3r/GUI/Tab.cpp:4295 +#: src/slic3r/GUI/Tab.cpp:4524 msgid "" "Machine limits will NOT be emitted to G-code, however they will be used to " "estimate print time, which may therefore not be accurate as the printer may " @@ -9064,7 +10662,7 @@ msgstr "" "використовуватися для оцінки часу друку, що, отже, може бути неточним, " "оскільки принтер може застосовувати інший набір механічних обмежень." -#: src/slic3r/GUI/Tab.cpp:4299 +#: src/slic3r/GUI/Tab.cpp:4528 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." @@ -9072,12 +10670,12 @@ msgstr "" "Механічних обмеження не встановлені, тому оцінка часу друку може бути " "неточною." -#: src/slic3r/GUI/Tab.cpp:4321 +#: src/slic3r/GUI/Tab.cpp:4550 msgid "LOCKED LOCK" msgstr "ЗАКРИТИЙ ЗАМОК" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4323 +#: src/slic3r/GUI/Tab.cpp:4552 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" @@ -9085,12 +10683,12 @@ msgstr "" "вказує на те, що параметри збігаються із системними (або за замовчуванням) " "значеннями для поточної групи опцій" -#: src/slic3r/GUI/Tab.cpp:4325 +#: src/slic3r/GUI/Tab.cpp:4554 msgid "UNLOCKED LOCK" msgstr "ВІДКРИТИЙ ЗАМОК" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4327 +#: src/slic3r/GUI/Tab.cpp:4556 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -9102,12 +10700,12 @@ msgstr "" "Клацніть, щоб скинути всі налаштування для поточної групи опцій до системних " "значень (або за замовчуванням)." -#: src/slic3r/GUI/Tab.cpp:4332 +#: src/slic3r/GUI/Tab.cpp:4561 msgid "WHITE BULLET" msgstr "БІЛА КУЛЯ" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4334 +#: src/slic3r/GUI/Tab.cpp:4563 msgid "" "for the left button: indicates a non-system (or non-default) preset,\n" "for the right button: indicates that the settings hasn't been modified." @@ -9115,12 +10713,12 @@ msgstr "" "для лівої кнопки: вказує на несистемний (або не за замовчуванням) пресет,\n" "для правої кнопки: вказує на те, що параметри не були змінені." -#: src/slic3r/GUI/Tab.cpp:4337 +#: src/slic3r/GUI/Tab.cpp:4566 msgid "BACK ARROW" msgstr "СТРІЛКА НАЗАД" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4339 +#: src/slic3r/GUI/Tab.cpp:4568 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -9132,7 +10730,7 @@ msgstr "" "Клацніть, щоб скинути всі параметри для поточної групи параметрів до " "останнього збереженого пресету." -#: src/slic3r/GUI/Tab.cpp:4349 +#: src/slic3r/GUI/Tab.cpp:4578 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -9140,7 +10738,7 @@ msgstr "" "Значок \"ЗАКРИТИЙ ЗАМОК\" вказує на те, що параметри збігаються із " "системними (або за замовчуванням) значеннями для поточної групи опцій" -#: src/slic3r/GUI/Tab.cpp:4351 +#: src/slic3r/GUI/Tab.cpp:4580 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " "equal to the system (or default) values for the current option group.\n" @@ -9153,12 +10751,12 @@ msgstr "" "Клацніть, щоб скинути всі налаштування для поточної групи опцій до системних " "значень (або за замовчуванням)." -#: src/slic3r/GUI/Tab.cpp:4354 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" "Значок \"БІЛА КУЛЯ\" вказує на несистемний (або не за замовчуванням) пресет." -#: src/slic3r/GUI/Tab.cpp:4357 +#: src/slic3r/GUI/Tab.cpp:4586 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -9166,7 +10764,7 @@ msgstr "" "Значок \"БІЛА КУЛЯ\" вказує на те, що параметри збігаються тими, які є в " "останньому збереженому пресеті для поточної групи опцій." -#: src/slic3r/GUI/Tab.cpp:4359 +#: src/slic3r/GUI/Tab.cpp:4588 msgid "" "BACK ARROW icon indicates that the settings were changed and are not equal " "to the last saved preset for the current option group.\n" @@ -9178,7 +10776,7 @@ msgstr "" "Клацніть, щоб скинути всі параметри для поточної групи параметрів до " "останнього збереженого пресету." -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4594 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." @@ -9186,7 +10784,7 @@ msgstr "" "Значок \"ЗАКРИТИЙ ЗАМОК\" вказує на те, що значення збігається із системним " "(або за замовчуванням)." -#: src/slic3r/GUI/Tab.cpp:4366 +#: src/slic3r/GUI/Tab.cpp:4595 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -9196,7 +10794,7 @@ msgstr "" "дорівнює системному (або за замовчуванням) значенню.\n" "Клацніть, щоб скинути поточне значення до системного (або за замовчуванням)." -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4601 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -9204,7 +10802,7 @@ msgstr "" "Значок \"БІЛА КУЛЯ\" вказує на те, що значення збігається з значенням " "збереженого пресету." -#: src/slic3r/GUI/Tab.cpp:4373 +#: src/slic3r/GUI/Tab.cpp:4602 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -9214,31 +10812,31 @@ msgstr "" "дорівнює останньому збереженому пресету.\n" "Клацніть, щоб скинути поточне значення до останнього збереженого пресету." -#: src/slic3r/GUI/Tab.cpp:4527 src/slic3r/GUI/Tab.cpp:4529 +#: src/slic3r/GUI/Tab.cpp:4764 src/slic3r/GUI/Tab.cpp:4766 msgid "Material" msgstr "Матеріал" -#: src/slic3r/GUI/Tab.cpp:4614 src/slic3r/GUI/Tab.cpp:4615 +#: src/slic3r/GUI/Tab.cpp:4851 src/slic3r/GUI/Tab.cpp:4852 msgid "Material printing profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4667 +#: src/slic3r/GUI/Tab.cpp:4901 msgid "Support head" msgstr "Головка підтримки" -#: src/slic3r/GUI/Tab.cpp:4672 +#: src/slic3r/GUI/Tab.cpp:4906 msgid "Support pillar" msgstr "Стовп підтримки" -#: src/slic3r/GUI/Tab.cpp:4695 +#: src/slic3r/GUI/Tab.cpp:4929 msgid "Connection of the support sticks and junctions" msgstr "З'єднання опорних стовпів і стиків" -#: src/slic3r/GUI/Tab.cpp:4700 +#: src/slic3r/GUI/Tab.cpp:4956 msgid "Automatic generation" msgstr "Автоматичне згенерування" -#: src/slic3r/GUI/Tab.cpp:4775 +#: src/slic3r/GUI/Tab.cpp:5024 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -9247,74 +10845,72 @@ msgstr "" "\"%1%\" вимкнено, оскільки в категорії \"%3%\" увімкнено \"%2%\".\n" "Щоб увімкнути \"%1%\", вимкніть \"%2%\"" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3724 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3497 msgid "Object elevation" msgstr "Підняття об’єкта" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3826 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3958 msgid "Pad around object" msgstr "Подушка навколо об’єкта" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:153 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:162 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1047 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1100 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1115 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1130 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1145 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:147 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:156 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:165 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1107 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1122 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1137 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1152 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1197 msgid "Undef" msgstr "Невизначений" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:772 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:792 msgid "Unsaved Changes" msgstr "Незбережені зміни" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:790 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:810 msgid "Switching Presets: Unsaved Changes" msgstr "Перемикання пресетів: незбережені зміни" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:832 -msgid "Old Value" -msgstr "Старе значення" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:858 +msgid "Original Value" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:859 +msgid "Modified Value" +msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:833 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:861 msgid "New Value" msgstr "Нове значення" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:867 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 msgid "Keep" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1569 msgid "Transfer" msgstr "Перенести" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 msgid "Don't save" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 -msgid "Discard" -msgstr "Відхилити" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:877 -msgid "Save" -msgstr "Зберегти" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:898 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:926 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "create new project" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:927 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "switch a preset" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:900 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:928 msgid "" "You will not be asked about the unsaved changes in presets the next time " "you: \n" @@ -9322,11 +10918,11 @@ msgid "" "- Loading a new project while some presets are modified" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:903 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:931 msgid "PrusaSlicer will remember your action." msgstr "PrusaSlicer запам'ятає ваші дії." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:904 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:932 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" @@ -9335,57 +10931,57 @@ msgstr "" "Відвідайте \"Преференції\" та встановіть прапорець \"%1%\"\n" "щоб знову запитати про незбережені зміни." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:964 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1772 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" "Деякі поля занадто довгі, щоб вміститися у чарунку. Клацніть правою кнопкою " "миші, щоб відкрити повний текст." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will not be saved" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will be discarded." msgstr "Усі зміни параметрів буде відхилено." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:941 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:969 msgid "Save the selected options." msgstr "Зберегти вибрані параметри." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:942 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:970 msgid "Keep the selected settings." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:943 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:971 msgid "Transfer the selected settings to the newly selected preset." msgstr "Перенести вибрані параметри до нещодавно вибраного пресету." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:947 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:975 #, boost-format msgid "Save the selected options to preset \"%1%\"." msgstr "Зберегти вибрані параметри до пресету \"%1%\"." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:948 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:976 #, boost-format msgid "Transfer the selected options to the newly selected preset \"%1%\"." msgstr "Перенести вибрані параметри до нещодавно вибраного пресету \"%1%\"." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1224 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1237 msgid "The following preset was modified" msgid_plural "The following presets were modified" msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1230 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1243 #, boost-format msgid "Preset \"%1%\" has the following unsaved changes:" msgstr "Пресет \"%1%\" має такі незбережені зміни:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1234 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1247 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new printer profile and it has the " @@ -9394,7 +10990,7 @@ msgstr "" "Пресет \"%1%\" несумісний з новим профілем принтера, і він має такі " "незбережені зміни:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1235 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1248 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new print profile and it has the " @@ -9403,107 +10999,207 @@ msgstr "" "Пресет \"%1%\" несумісний з новим профілем друку, і він має такі незбережені " "зміни:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1297 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1850 msgid "Extruders count" msgstr "Кількість екструдерів" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 -msgid "Select presets to compare" -msgstr "" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1326 +msgid "The preset modifications are successfully saved" +msgid_plural "The presets modifications are successfully saved" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1515 msgid "Show all presets (including incompatible)" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1533 +msgid "Select presets to compare" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1545 msgid "Left Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1546 msgid "Right Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1595 +msgid "" +"Transfer the selected options from left preset to the right.\n" +"Note: New modified presets will be selected in settings tabs after close " +"this dialog." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1603 +msgid "Save the selected options from left preset to the right." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1621 +msgid "Transfer values from left to right" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1622 +msgid "" +"If enabled, this dialog can be used for transver selected values from left " +"to right preset." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1807 msgid "One of the presets doesn't found" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1818 msgid "Compared presets has different printer technology" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1832 msgid "Presets are the same" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1840 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef category" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef group" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:2016 +msgid "Modified" +msgstr "Змінено" + +#: src/slic3r/GUI/UpdateDialogs.cpp:41 msgid "Update available" msgstr "Доступне оновлення" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UpdateDialogs.cpp:41 #, c-format, boost-format msgid "New version of %s is available" msgstr "Доступна нова версія %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:42 +#: src/slic3r/GUI/UpdateDialogs.cpp:46 src/slic3r/GUI/UpdateDialogs.cpp:101 msgid "Current version:" msgstr "Поточна версія:" -#: src/slic3r/GUI/UpdateDialogs.cpp:44 +#: src/slic3r/GUI/UpdateDialogs.cpp:48 src/slic3r/GUI/UpdateDialogs.cpp:103 +#: src/slic3r/GUI/UpdateDialogs.cpp:141 msgid "New version:" msgstr "Нова версія:" -#: src/slic3r/GUI/UpdateDialogs.cpp:52 +#: src/slic3r/GUI/UpdateDialogs.cpp:56 msgid "Changelog & Download" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:59 src/slic3r/GUI/UpdateDialogs.cpp:133 -#: src/slic3r/GUI/UpdateDialogs.cpp:191 +#: src/slic3r/GUI/UpdateDialogs.cpp:63 src/slic3r/GUI/UpdateDialogs.cpp:309 +#: src/slic3r/GUI/UpdateDialogs.cpp:367 msgid "Open changelog page" msgstr "Відкрийте сторінку журналу змін" -#: src/slic3r/GUI/UpdateDialogs.cpp:65 +#: src/slic3r/GUI/UpdateDialogs.cpp:69 msgid "Open download page" msgstr "Відкрити сторінку завантаження" -#: src/slic3r/GUI/UpdateDialogs.cpp:72 +#: src/slic3r/GUI/UpdateDialogs.cpp:76 src/slic3r/GUI/UpdateDialogs.cpp:109 msgid "Don't notify about new releases any more" msgstr "Більше не сповіщати про нові випуски" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +msgid "App Update available" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +#, c-format, boost-format +msgid "" +"New version of %s is available.\n" +"Do you wish to download it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +msgid "App Update download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +#, c-format, boost-format +msgid "New version of %s is available." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:146 +msgid "Run installer after download. (Otherwise file explorer will be opened)" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:151 +msgid "Target directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:158 +msgid "Select directory" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:176 +msgid "Select directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:193 +msgid "Download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:204 +msgid "Directory path is empty." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:212 +msgid "Directory path is incorrect." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:217 +#, boost-format +msgid "Directory %1% doesn't exists. Do you wish to create it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:222 +msgid "Failed to create directory." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:229 +#, boost-format +msgid "File %1% already exists. Do you wish to overwrite it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +#, boost-format +msgid "Download path is %1%. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:270 msgid "Opening Configuration Wizard" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 src/slic3r/GUI/UpdateDialogs.cpp:261 +#: src/slic3r/GUI/UpdateDialogs.cpp:270 src/slic3r/GUI/UpdateDialogs.cpp:437 msgid "Configuration update" msgstr "Оновлення конфігурації" -#: src/slic3r/GUI/UpdateDialogs.cpp:95 +#: src/slic3r/GUI/UpdateDialogs.cpp:271 msgid "" "PrusaSlicer is not using the newest configuration available.\n" "Configuration Wizard may not offer the latest printers, filaments and SLA " "materials to be installed." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:97 +#: src/slic3r/GUI/UpdateDialogs.cpp:273 msgid "Configuration update is available" msgstr "Доступне оновлення конфігурації" -#: src/slic3r/GUI/UpdateDialogs.cpp:100 +#: src/slic3r/GUI/UpdateDialogs.cpp:276 msgid "" "Would you like to install it?\n" "\n" @@ -9519,28 +11215,28 @@ msgstr "" "\n" "Оновлені пакети конфігурації:" -#: src/slic3r/GUI/UpdateDialogs.cpp:121 src/slic3r/GUI/UpdateDialogs.cpp:181 +#: src/slic3r/GUI/UpdateDialogs.cpp:297 src/slic3r/GUI/UpdateDialogs.cpp:357 msgid "Comment:" msgstr "Коментар:" -#: src/slic3r/GUI/UpdateDialogs.cpp:142 +#: src/slic3r/GUI/UpdateDialogs.cpp:318 msgid "Install" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:144 +#: src/slic3r/GUI/UpdateDialogs.cpp:320 msgid "Don't install" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 src/slic3r/GUI/UpdateDialogs.cpp:212 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 src/slic3r/GUI/UpdateDialogs.cpp:388 #, c-format, boost-format msgid "%s incompatibility" msgstr "Несумісність з %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 msgid "You must install a configuration update." msgstr "Потрібно встановити оновлення конфігурації." -#: src/slic3r/GUI/UpdateDialogs.cpp:160 +#: src/slic3r/GUI/UpdateDialogs.cpp:336 #, c-format, boost-format msgid "" "%s will now start updates. Otherwise it won't be able to start.\n" @@ -9558,17 +11254,12 @@ msgstr "" "\n" "Оновлені пакети конфігурації:" -#: src/slic3r/GUI/UpdateDialogs.cpp:200 src/slic3r/GUI/UpdateDialogs.cpp:247 -#, c-format, boost-format -msgid "Exit %s" -msgstr "Вихід %s" - -#: src/slic3r/GUI/UpdateDialogs.cpp:213 +#: src/slic3r/GUI/UpdateDialogs.cpp:389 #, c-format, boost-format msgid "%s configuration is incompatible" msgstr "конфігурація %s є несумісна" -#: src/slic3r/GUI/UpdateDialogs.cpp:216 +#: src/slic3r/GUI/UpdateDialogs.cpp:392 #, c-format, boost-format msgid "" "This version of %s is not compatible with currently installed configuration " @@ -9588,20 +11279,20 @@ msgstr "" "запустити початкову конфігурацію. Це створить резервний знімок існуючої " "конфігурації перед встановленням файлів, сумісних із цим %s." -#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#: src/slic3r/GUI/UpdateDialogs.cpp:401 #, c-format, boost-format msgid "This %s version: %s" msgstr "%s версії %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:230 +#: src/slic3r/GUI/UpdateDialogs.cpp:406 msgid "Incompatible bundles:" msgstr "Несумісні комплекти:" -#: src/slic3r/GUI/UpdateDialogs.cpp:246 +#: src/slic3r/GUI/UpdateDialogs.cpp:422 msgid "Re-configure" msgstr "Пере-налаштувати" -#: src/slic3r/GUI/UpdateDialogs.cpp:265 +#: src/slic3r/GUI/UpdateDialogs.cpp:441 #, c-format, boost-format msgid "" "%s now uses an updated configuration structure.\n" @@ -9628,28 +11319,37 @@ msgstr "" "Будь ласка, перейдіть до %s, щоб налаштувати нові пресети та вибрати, чи " "вмикати їх автоматичне оновлення." -#: src/slic3r/GUI/UpdateDialogs.cpp:282 +#: src/slic3r/GUI/UpdateDialogs.cpp:458 msgid "For more information please visit our wiki page:" msgstr "Для отримання додаткової інформації відвідайте нашу wiki-сторінку:" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 msgid "Configuration updates" msgstr "Оновлення конфігурацій" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 src/slic3r/GUI/UpdateDialogs.cpp:495 msgid "No updates available" msgstr "Немає оновлень" -#: src/slic3r/GUI/UpdateDialogs.cpp:304 +#: src/slic3r/GUI/UpdateDialogs.cpp:480 #, c-format, boost-format msgid "%s has no configuration updates available." msgstr "%s не має оновлень конфігурації." -#: src/slic3r/GUI/WipeTowerDialog.cpp:21 +#: src/slic3r/GUI/UpdateDialogs.cpp:495 +msgid "App update" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:500 +#, c-format, boost-format +msgid "%s has no version updates available." +msgstr "" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:23 msgid "Ramming customization" msgstr "Налаштування раммінгу" -#: src/slic3r/GUI/WipeTowerDialog.cpp:54 +#: src/slic3r/GUI/WipeTowerDialog.cpp:56 msgid "" "Ramming denotes the rapid extrusion just before a tool change in a single-" "extruder MM printer. Its purpose is to properly shape the end of the " @@ -9671,27 +11371,27 @@ msgstr "" "Це налаштування на рівні експерта, неправильне регулювання, ймовірно, " "призведе до заклинювання, подрібнення екструдерного колеса до філаменту тощо." -#: src/slic3r/GUI/WipeTowerDialog.cpp:114 +#: src/slic3r/GUI/WipeTowerDialog.cpp:116 msgid "Total ramming time" msgstr "Загальний час швидкої екструзії" -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 msgid "Total rammed volume" msgstr "Загальний обсяг швидкої екструзії" -#: src/slic3r/GUI/WipeTowerDialog.cpp:120 +#: src/slic3r/GUI/WipeTowerDialog.cpp:122 msgid "Ramming line width" msgstr "Ширина ліній раммінгу" -#: src/slic3r/GUI/WipeTowerDialog.cpp:122 +#: src/slic3r/GUI/WipeTowerDialog.cpp:124 msgid "Ramming line spacing" msgstr "Проміжки між лініями раммінгу" -#: src/slic3r/GUI/WipeTowerDialog.cpp:173 +#: src/slic3r/GUI/WipeTowerDialog.cpp:175 msgid "Wipe tower - Purging volume adjustment" msgstr "Вежа витирання - Регулювання об'єму продувки" -#: src/slic3r/GUI/WipeTowerDialog.cpp:299 +#: src/slic3r/GUI/WipeTowerDialog.cpp:301 msgid "" "Here you can adjust required purging volume (mm³) for any given pair of " "tools." @@ -9699,23 +11399,23 @@ msgstr "" "Тут ви можете відрегулювати необхідний об'єм витирання (мм³) для будь-якої " "пари інструментів." -#: src/slic3r/GUI/WipeTowerDialog.cpp:300 +#: src/slic3r/GUI/WipeTowerDialog.cpp:302 msgid "Extruder changed to" msgstr "Екструдер змінено на" -#: src/slic3r/GUI/WipeTowerDialog.cpp:308 +#: src/slic3r/GUI/WipeTowerDialog.cpp:310 msgid "unloaded" msgstr "виведено" -#: src/slic3r/GUI/WipeTowerDialog.cpp:309 +#: src/slic3r/GUI/WipeTowerDialog.cpp:311 msgid "loaded" msgstr "заведено" -#: src/slic3r/GUI/WipeTowerDialog.cpp:352 +#: src/slic3r/GUI/WipeTowerDialog.cpp:354 msgid "Tool #" msgstr "Інструмент №" -#: src/slic3r/GUI/WipeTowerDialog.cpp:361 +#: src/slic3r/GUI/WipeTowerDialog.cpp:363 msgid "" "Total purging volume is calculated by summing two values below, depending on " "which tools are loaded/unloaded." @@ -9723,15 +11423,15 @@ msgstr "" "Загальний об'єм витирання обчислюється шляхом підсумовування двох значень " "нижче, залежно від того, який інструмент заведено/виведено." -#: src/slic3r/GUI/WipeTowerDialog.cpp:362 +#: src/slic3r/GUI/WipeTowerDialog.cpp:364 msgid "Volume to purge (mm³) when the filament is being" msgstr "Об'єм для витирання (мм³) при наявності філаменту" -#: src/slic3r/GUI/WipeTowerDialog.cpp:376 +#: src/slic3r/GUI/WipeTowerDialog.cpp:378 msgid "From" msgstr "Від" -#: src/slic3r/GUI/WipeTowerDialog.cpp:442 +#: src/slic3r/GUI/WipeTowerDialog.cpp:444 msgid "" "Switching to simple settings will discard changes done in the advanced " "mode!\n" @@ -9743,26 +11443,28 @@ msgstr "" "\n" "Хочете продовжити?" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show simplified settings" msgstr "Показати спрощені налаштування" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show advanced settings" msgstr "Показати розширені налаштування" -#: src/slic3r/GUI/wxExtensions.cpp:644 +#: src/slic3r/GUI/wxExtensions.cpp:672 #, c-format, boost-format msgid "Switch to the %s mode" msgstr "Перейти до режиму %s" -#: src/slic3r/GUI/wxExtensions.cpp:645 +#: src/slic3r/GUI/wxExtensions.cpp:673 #, c-format, boost-format msgid "Current mode is %s" msgstr "Поточний режим - %s" -#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:141 -#: src/slic3r/Utils/Repetier.cpp:69 +#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:206 +#: src/slic3r/Utils/OctoPrint.cpp:255 src/slic3r/Utils/OctoPrint.cpp:666 +#: src/slic3r/Utils/OctoPrint.cpp:824 src/slic3r/Utils/OctoPrint.cpp:897 +#: src/slic3r/Utils/Repetier.cpp:88 #, c-format, boost-format msgid "Mismatched type of print host: %s" msgstr "Несумісний тип хосту друку: %s" @@ -9881,69 +11583,100 @@ msgstr "" "Примітка: Потрібна FlashAir із прошивкою 2.00.02 або новішою та активованою " "функцією завантаження." -#: src/slic3r/Utils/OctoPrint.cpp:164 +#: src/slic3r/Utils/OctoPrint.cpp:278 msgid "Connection to OctoPrint works correctly." msgstr "Підключення до OctoPrint працює правильно." -#: src/slic3r/Utils/OctoPrint.cpp:170 +#: src/slic3r/Utils/OctoPrint.cpp:284 msgid "Could not connect to OctoPrint" msgstr "Не можливо підключитися до OctoPrint" -#: src/slic3r/Utils/OctoPrint.cpp:172 +#: src/slic3r/Utils/OctoPrint.cpp:286 msgid "Note: OctoPrint version at least 1.1.0 is required." msgstr "Зауважте: Необхідна версія OctoPrint - принаймні 1.1.0." -#: src/slic3r/Utils/OctoPrint.cpp:292 +#: src/slic3r/Utils/OctoPrint.cpp:528 msgid "Connection to Prusa SL1 / SL1S works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:298 +#: src/slic3r/Utils/OctoPrint.cpp:534 msgid "Could not connect to Prusa SLA" msgstr "Не можливо підключитися до Prusa SLA" -#: src/slic3r/Utils/OctoPrint.cpp:336 +#: src/slic3r/Utils/OctoPrint.cpp:573 msgid "Connection to PrusaLink works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:342 +#: src/slic3r/Utils/OctoPrint.cpp:579 msgid "Could not connect to PrusaLink" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:61 +#: src/slic3r/Utils/OctoPrint.cpp:776 +msgid "Storages found:" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "read only" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "no free space" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:781 +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%.%2%" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:64 #, boost-format msgid "Copying of file %1% to %2% failed: %3%" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:645 -#: src/slic3r/Utils/PresetUpdater.cpp:662 +#: src/slic3r/Utils/PresetUpdater.cpp:998 +#: src/slic3r/Utils/PresetUpdater.cpp:1015 msgid "Continue and install configuration updates?" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:777 +#: src/slic3r/Utils/PresetUpdater.cpp:1021 +msgid "Installing profiles" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1071 +#, boost-format +msgid "Downloading resources for %1%." +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1171 msgid "" -"Configuration Updates causes a lost of preset modification.\n" +"Configuration Update will cause the preset modification to be lost.\n" "So, check unsaved changes and save them if necessary." msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:779 +#: src/slic3r/Utils/PresetUpdater.cpp:1173 msgid "Updating" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:808 +#: src/slic3r/Utils/PresetUpdater.cpp:1202 #, c-format, boost-format msgid "requires min. %s and max. %s" msgstr "вимагається мін. %s та макс. %s" -#: src/slic3r/Utils/PresetUpdater.cpp:812 +#: src/slic3r/Utils/PresetUpdater.cpp:1206 #, c-format, boost-format msgid "requires min. %s" msgstr "вимагається мін. %s" -#: src/slic3r/Utils/PresetUpdater.cpp:815 +#: src/slic3r/Utils/PresetUpdater.cpp:1209 #, c-format, boost-format msgid "requires max. %s" msgstr "вимагається макс. %s" +#: src/slic3r/Utils/PresetUpdater.cpp:1362 +#, boost-format +msgid "Couldn't locate idx file %1% when performing updates." +msgstr "" + #: src/slic3r/Utils/Http.cpp:73 msgid "" "Could not detect system SSL certificate store. PrusaSlicer will be unable to " @@ -9974,30 +11707,30 @@ msgstr "" "Curl init зазнав невдачі. PrusaSlicer не зможе встановити мережні " "підключення. Додаткові відомості див." -#: src/slic3r/Utils/Process.cpp:157 +#: src/slic3r/Utils/Process.cpp:164 msgid "Open G-code file:" msgstr "Відкрити файл G-кода:" -#: src/slic3r/Utils/Repetier.cpp:84 +#: src/slic3r/Utils/Repetier.cpp:103 msgid "Connection to Repetier works correctly." msgstr "" -#: src/slic3r/Utils/Repetier.cpp:90 +#: src/slic3r/Utils/Repetier.cpp:109 msgid "Could not connect to Repetier" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:92 +#: src/slic3r/Utils/Repetier.cpp:111 msgid "Note: Repetier version at least 0.90.0 is required." msgstr "" -#: src/slic3r/Utils/Repetier.cpp:246 +#: src/slic3r/Utils/Repetier.cpp:263 #, boost-format msgid "" "HTTP status: %1%\n" "Message body: \"%2%\"" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:253 +#: src/slic3r/Utils/Repetier.cpp:270 #, boost-format msgid "" "Parsing of host response failed.\n" @@ -10005,7 +11738,7 @@ msgid "" "Error: \"%2%\"" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:266 +#: src/slic3r/Utils/Repetier.cpp:283 #, boost-format msgid "" "Enumeration of host printers failed.\n" @@ -10034,53 +11767,53 @@ msgstr "" msgid "Abort" msgstr "" -#: src/libslic3r/GCode.cpp:539 +#: src/libslic3r/GCode.cpp:490 msgid "There is an object with no extrusions in the first layer." msgstr "" -#: src/libslic3r/GCode.cpp:570 +#: src/libslic3r/GCode.cpp:521 #, boost-format msgid "Empty layer between %1% and %2%." msgstr "" -#: src/libslic3r/GCode.cpp:573 +#: src/libslic3r/GCode.cpp:524 msgid "(Some lines not shown)" msgstr "" -#: src/libslic3r/GCode.cpp:575 +#: src/libslic3r/GCode.cpp:526 #, boost-format msgid "Object name: %1%" msgstr "" -#: src/libslic3r/GCode.cpp:576 +#: src/libslic3r/GCode.cpp:527 msgid "" "Make sure the object is printable. This is usually caused by negligibly " "small extrusions or by a faulty model. Try to repair the model or change its " "orientation on the bed." msgstr "" -#: src/libslic3r/GCode.cpp:718 +#: src/libslic3r/GCode.cpp:669 msgid "Filament Start G-code" msgstr "" -#: src/libslic3r/GCode.cpp:725 +#: src/libslic3r/GCode.cpp:676 msgid "Filament End G-code" msgstr "" -#: src/libslic3r/GCode.cpp:764 +#: src/libslic3r/GCode.cpp:717 msgid "In the custom G-code were found reserved keywords:" msgstr "" -#: src/libslic3r/GCode.cpp:766 +#: src/libslic3r/GCode.cpp:719 msgid "" "This may cause problems in g-code visualization and printing time estimation." msgstr "" -#: src/libslic3r/GCode.cpp:1200 src/libslic3r/GCode.cpp:1211 +#: src/libslic3r/GCode.cpp:1124 src/libslic3r/GCode.cpp:1135 msgid "No extrusions were generated for objects." msgstr "" -#: src/libslic3r/GCode.cpp:1406 +#: src/libslic3r/GCode.cpp:1328 msgid "" "Your print is very close to the priming regions. Make sure there is no " "collision." @@ -10088,10 +11821,6 @@ msgstr "" "Ваша модель для друку розташована дуже близький до основних областей. " "Переконайтесь, що немає зіткнення." -#: src/libslic3r/ExtrusionEntity.cpp:344 src/libslic3r/ExtrusionEntity.cpp:380 -msgid "Mixed" -msgstr "Змішаний" - #: src/libslic3r/Flow.cpp:61 #, boost-format msgid "" @@ -10099,32 +11828,32 @@ msgid "" msgstr "" "Не вдається розрахувати ширину екструзії для %1%: Змінна \"%2%\" недоступна." -#: src/libslic3r/Format/3mf.cpp:1735 +#: src/libslic3r/Format/3mf.cpp:1880 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "Вибраний 3MF-файл було збережено з новою версією %1% і не сумісний." -#: src/libslic3r/Format/3mf.cpp:1746 +#: src/libslic3r/Format/3mf.cpp:1891 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1750 +#: src/libslic3r/Format/3mf.cpp:1895 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1754 +#: src/libslic3r/Format/3mf.cpp:1899 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/AMF.cpp:993 +#: src/libslic3r/Format/AMF.cpp:1000 #, boost-format msgid "" "The selected amf file has been saved with a newer version of %1% and is not " @@ -10267,27 +11996,33 @@ msgstr "не вдалося перевірити" msgid "write calledback failed" msgstr "помилка запису зворотного виклику" -#: src/libslic3r/Print.cpp:454 +#: src/libslic3r/Print.cpp:473 msgid "All objects are outside of the print volume." msgstr "Усі об'єкти знаходяться поза просторем друку." -#: src/libslic3r/Print.cpp:457 +#: src/libslic3r/Print.cpp:476 msgid "The supplied settings will cause an empty print." msgstr "Надані параметри спричинять порожній друк." -#: src/libslic3r/Print.cpp:461 +#: src/libslic3r/Print.cpp:480 msgid "Some objects are too close; your extruder will collide with them." msgstr "" "Деякі предмети розташовано занадто близько; ваш екструдер зіткнеться з ними." -#: src/libslic3r/Print.cpp:463 +#: src/libslic3r/Print.cpp:482 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." msgstr "" "Деякі предмети занадто високі, і їх неможливо надрукувати без зіткнення " "екструдера." -#: src/libslic3r/Print.cpp:472 +#: src/libslic3r/Print.cpp:486 +msgid "" +"Avoid crossing perimeters option and avoid crossing curled overhangs option " +"cannot be both enabled together." +msgstr "" + +#: src/libslic3r/Print.cpp:495 msgid "" "Only a single object may be printed at a time in Spiral Vase mode. Either " "remove all but the last object, or enable sequential mode by " @@ -10297,7 +12032,7 @@ msgstr "" "видаліть усі, крім останнього об'єкта, або ввімкніть послідовний режим за " "допомогою \"повних об'єктів\" (\"complete_objects\")." -#: src/libslic3r/Print.cpp:476 +#: src/libslic3r/Print.cpp:499 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." @@ -10305,7 +12040,17 @@ msgstr "" "Варіант спіральної вази можна використовувати лише під час друку одно-" "матеріальних об’єктів." -#: src/libslic3r/Print.cpp:489 +#: src/libslic3r/Print.cpp:523 +msgid "" +"The print is taller than the maximum allowed height. You might want to " +"reduce the size of your model or change current print settings and retry." +msgstr "" + +#: src/libslic3r/Print.cpp:540 +msgid "Variable layer height is not supported with Organic supports." +msgstr "" + +#: src/libslic3r/Print.cpp:553 msgid "" "The wipe tower is only supported if all extruders have the same nozzle " "diameter and use filaments of the same diameter." @@ -10313,7 +12058,7 @@ msgstr "" "Вежа витирання підтримується лише в тому випадку, якщо всі екструдери мають " "однаковий діаметр сопла і використовують філаменти одинакового діаметру." -#: src/libslic3r/Print.cpp:495 +#: src/libslic3r/Print.cpp:559 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, " "RepRapFirmware and Repetier G-code flavors." @@ -10321,7 +12066,7 @@ msgstr "" "Наразі вежа витирання підтримується лише для G-кодів, сумісних з Marlin, " "RepRap/Sprinter, RepRapFirmware та Repetier ." -#: src/libslic3r/Print.cpp:497 +#: src/libslic3r/Print.cpp:561 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." @@ -10329,18 +12074,18 @@ msgstr "" "Наразі вежа витирання підтримує лише відносну адресацію екструдерів " "(use_relative_e_distances = 1)." -#: src/libslic3r/Print.cpp:499 -msgid "Ooze prevention is currently not supported with the wipe tower enabled." +#: src/libslic3r/Print.cpp:563 +msgid "" +"Ooze prevention is only supported with the wipe tower when " +"'single_extruder_multi_material' is off." msgstr "" -"Наразі запобігання просочування не підтримується з увімкненою вежею " -"витирання." -#: src/libslic3r/Print.cpp:501 +#: src/libslic3r/Print.cpp:565 msgid "" "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." msgstr "Наразі вежа витирання не підтримує об'ємне E (use_volumetric_e = 0)." -#: src/libslic3r/Print.cpp:503 +#: src/libslic3r/Print.cpp:567 msgid "" "The Wipe Tower is currently not supported for multimaterial sequential " "prints." @@ -10348,7 +12093,7 @@ msgstr "" "Наразі вежа витирання не підтримується для багато-матеріального послідовного " "друку." -#: src/libslic3r/Print.cpp:524 +#: src/libslic3r/Print.cpp:577 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " "layer heights" @@ -10356,7 +12101,7 @@ msgstr "" "Вежа витирання для кількох об’єктів підтримується лише у випадку, коли вони " "мають однакову висоту шару" -#: src/libslic3r/Print.cpp:526 +#: src/libslic3r/Print.cpp:579 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "over an equal number of raft layers" @@ -10364,7 +12109,7 @@ msgstr "" "Вежа витирання для кількох об’єктів підтримується лише у випадку, коли вони " "надруковані на рівній кількості шарів плоту" -#: src/libslic3r/Print.cpp:529 +#: src/libslic3r/Print.cpp:582 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "with the same support_material_contact_distance" @@ -10372,7 +12117,7 @@ msgstr "" "Вежа витирання для кількох об’єктів підтримується лише у випадку, коли вони " "надруковані з однаковою відстанню support_material_contact_distance" -#: src/libslic3r/Print.cpp:531 +#: src/libslic3r/Print.cpp:584 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." @@ -10380,7 +12125,7 @@ msgstr "" "Вежа витирання для кількох об’єктів підтримується лише у випадку, коли вони " "нарізані однаково." -#: src/libslic3r/Print.cpp:555 +#: src/libslic3r/Print.cpp:609 msgid "" "The Wipe tower is only supported if all objects have the same variable layer " "height" @@ -10388,24 +12133,24 @@ msgstr "" "Вежа витирання підтримується лише в тому випадку, якщо всі об’єкти мають " "однакову висоту змінного шару" -#: src/libslic3r/Print.cpp:579 +#: src/libslic3r/Print.cpp:633 msgid "" "One or more object were assigned an extruder that the printer does not have." msgstr "" "Одному або декільком об’єктам було призначено екструдер, якого принтер не " "має." -#: src/libslic3r/Print.cpp:592 +#: src/libslic3r/Print.cpp:646 #, boost-format msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" msgstr "%1%=%2% мм є занадто низьким для друку на висоті шару %3% мм" -#: src/libslic3r/Print.cpp:595 +#: src/libslic3r/Print.cpp:649 #, boost-format msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" msgstr "%1% = %2% мм є надмірно для друку з діаметром сопла %3% мм" -#: src/libslic3r/Print.cpp:606 +#: src/libslic3r/Print.cpp:660 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " @@ -10417,7 +12162,7 @@ msgstr "" "0 або support_material_interface_extruder == 0), усі сопла повинні мати " "однаковий діаметр." -#: src/libslic3r/Print.cpp:614 +#: src/libslic3r/Print.cpp:668 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers " "need to be synchronized with the object layers." @@ -10425,66 +12170,106 @@ msgstr "" "Для того, щоб вежа витирання працювала з розчинними підтримками, шари " "підтримки повинні бути синхронізовані з шарами об'єкта." -#: src/libslic3r/Print.cpp:618 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only if they are " -"printed with the current extruder without triggering a tool change. (both " -"support_material_extruder and support_material_interface_extruder need to be " -"set to 0)." -msgstr "" -"Вежа витирання в даний момент підтримує лише нерозчинні підтримки, якщо вони " -"друкуються з поточним екструдером, не запускаючи зміну інструменту. (Обидва " -"значення support_material_extruder і support_material_interface_extruder " -"повинні бути встановлені на 0)." - -#: src/libslic3r/Print.cpp:654 +#: src/libslic3r/Print.cpp:708 msgid "First layer height can't be greater than nozzle diameter" msgstr "Висота першого шару не може перевищувати діаметр сопла" -#: src/libslic3r/Print.cpp:659 +#: src/libslic3r/Print.cpp:713 msgid "Layer height can't be greater than nozzle diameter" msgstr "Висота шару не може перевищувати діаметр сопла" -#: src/libslic3r/Print.cpp:680 +#: src/libslic3r/Print.cpp:734 msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " "layer_gcode." msgstr "" -#: src/libslic3r/Print.cpp:682 +#: src/libslic3r/Print.cpp:736 msgid "" "\"G92 E0\" was found in before_layer_gcode, which is incompatible with " "absolute extruder addressing." msgstr "" -#: src/libslic3r/Print.cpp:684 +#: src/libslic3r/Print.cpp:738 msgid "" "\"G92 E0\" was found in layer_gcode, which is incompatible with absolute " "extruder addressing." msgstr "" -#: src/libslic3r/Print.cpp:826 +#: src/libslic3r/Print.cpp:880 msgid "Infilling layers" msgstr "Шари наповнення" -#: src/libslic3r/Print.cpp:848 +#: src/libslic3r/Print.cpp:908 msgid "Generating skirt and brim" msgstr "" -#: src/libslic3r/Print.cpp:896 +#: src/libslic3r/Print.cpp:956 msgid "Exporting G-code" msgstr "Експортування G-коду" -#: src/libslic3r/Print.cpp:900 +#: src/libslic3r/Print.cpp:960 msgid "Generating G-code" msgstr "Генерування G-коду" +#: src/libslic3r/Print.cpp:1169 +msgid "Alert if supports needed" +msgstr "" + +#: src/libslic3r/Print.cpp:1174 +msgid "long bridging extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1175 +msgid "floating bridge anchors" +msgstr "" + +#: src/libslic3r/Print.cpp:1178 +msgid "collapsing overhang" +msgstr "" + +#: src/libslic3r/Print.cpp:1180 +msgid "loose extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1183 +msgid "low bed adhesion" +msgstr "" + +#: src/libslic3r/Print.cpp:1184 +msgid "floating object part" +msgstr "" + +#: src/libslic3r/Print.cpp:1185 +msgid "thin fragile section" +msgstr "" + +#: src/libslic3r/Print.cpp:1221 +msgid "Detected print stability issues" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "or" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "and" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "brim" +msgstr "" + +#: src/libslic3r/Print.cpp:1248 +msgid "Consider enabling supports" +msgstr "" + #: src/libslic3r/SLA/Pad.cpp:533 msgid "Pad brim size is too small for the current configuration." msgstr "Розмір краю подушки замалий для поточної конфігурації." -#: src/libslic3r/SLAPrint.cpp:628 +#: src/libslic3r/SLAPrint.cpp:546 msgid "" "Cannot proceed without support points! Add support points or disable support " "generation." @@ -10492,7 +12277,7 @@ msgstr "" "Не можливо продовжувати без точок підтримки! Додайте точки підтримки або " "вимкніть генерацію підтримки." -#: src/libslic3r/SLAPrint.cpp:640 +#: src/libslic3r/SLAPrint.cpp:558 msgid "" "Elevation is too low for object. Use the \"Pad around object\" feature to " "print the object without elevation." @@ -10500,7 +12285,7 @@ msgstr "" "Підняття занадто мале для об'єкта. Використовуйте функцію \"Подушка навколо " "об'єкта\" для друку об'єкта без підняття." -#: src/libslic3r/SLAPrint.cpp:646 +#: src/libslic3r/SLAPrint.cpp:564 msgid "" "The endings of the support pillars will be deployed on the gap between the " "object and the pad. 'Support base safety distance' has to be greater than " @@ -10510,68 +12295,68 @@ msgstr "" "\"Безпечна відстань між основами підтримки\" повинна бути більшою за " "параметр \"Розрив Подушка-Об'єкт\", щоб уникнути цього." -#: src/libslic3r/SLAPrint.cpp:661 +#: src/libslic3r/SLAPrint.cpp:579 msgid "Exposition time is out of printer profile bounds." msgstr "Час експозиції виходить за межі профілю принтера." -#: src/libslic3r/SLAPrint.cpp:668 +#: src/libslic3r/SLAPrint.cpp:586 msgid "Initial exposition time is out of printer profile bounds." msgstr "Початковий час експозиції виходить за межі профілю принтера." -#: src/libslic3r/SLAPrint.cpp:784 +#: src/libslic3r/SLAPrint.cpp:693 msgid "Slicing done" msgstr "Нарізання завершено" -#: src/libslic3r/SLAPrintSteps.cpp:47 +#: src/libslic3r/SLAPrintSteps.cpp:57 +msgid "Assembling model from parts" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:58 msgid "Hollowing model" msgstr "Випорожнення моделі" -#: src/libslic3r/SLAPrintSteps.cpp:48 +#: src/libslic3r/SLAPrintSteps.cpp:59 msgid "Drilling holes into model." msgstr "Свердління отворів в моделі." -#: src/libslic3r/SLAPrintSteps.cpp:49 +#: src/libslic3r/SLAPrintSteps.cpp:60 msgid "Slicing model" msgstr "Нарізання моделі" -#: src/libslic3r/SLAPrintSteps.cpp:50 src/libslic3r/SLAPrintSteps.cpp:639 +#: src/libslic3r/SLAPrintSteps.cpp:61 src/libslic3r/SLAPrintSteps.cpp:691 msgid "Generating support points" msgstr "Генерування точок підтримки" -#: src/libslic3r/SLAPrintSteps.cpp:51 +#: src/libslic3r/SLAPrintSteps.cpp:62 msgid "Generating support tree" msgstr "Генерування дерева підтримки" -#: src/libslic3r/SLAPrintSteps.cpp:52 +#: src/libslic3r/SLAPrintSteps.cpp:63 msgid "Generating pad" msgstr "Генерування подушки" -#: src/libslic3r/SLAPrintSteps.cpp:53 +#: src/libslic3r/SLAPrintSteps.cpp:64 msgid "Slicing supports" msgstr "Нарізання підтримок" -#: src/libslic3r/SLAPrintSteps.cpp:68 +#: src/libslic3r/SLAPrintSteps.cpp:79 msgid "Merging slices and calculating statistics" msgstr "Об'єднання шарів друку та обчислення статистики" -#: src/libslic3r/SLAPrintSteps.cpp:69 +#: src/libslic3r/SLAPrintSteps.cpp:80 msgid "Rasterizing layers" msgstr "Растеризуючі шари" -#: src/libslic3r/SLAPrintSteps.cpp:435 -msgid "Too many overlapping holes." -msgstr "Забагато отворів, що перекриваються." - -#: src/libslic3r/SLAPrintSteps.cpp:442 +#: src/libslic3r/SLAPrintSteps.cpp:255 msgid "" "Mesh to be hollowed is not suitable for hollowing (does not bound a volume)." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:450 +#: src/libslic3r/SLAPrintSteps.cpp:262 msgid "Unable to drill the current configuration of holes into the model." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:470 +#: src/libslic3r/SLAPrintSteps.cpp:271 msgid "" "Drilling holes into the mesh failed. This is usually caused by broken model. " "Try to fix it first." @@ -10579,28 +12364,35 @@ msgstr "" "Не вдалося висвердлити отвори. Зазвичай це викликано зламаною моделлю. " "Спершу спробуйте її виправити." -#: src/libslic3r/SLAPrintSteps.cpp:476 +#: src/libslic3r/SLAPrintSteps.cpp:279 msgid "Failed to drill some holes into the model" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:520 +#: src/libslic3r/SLAPrintSteps.cpp:289 +msgid "" +"Can't perform full mesh booleans! Some parts of the print will be previewed " +"with approximated meshes. This does not affect the quality of slices or the " +"physical print in any way." +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:510 msgid "" "Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "" "Нарізання довелося зупинити через внутрішню помилку: Невідповідний індекс " "зрізу." -#: src/libslic3r/SLAPrintSteps.cpp:691 src/libslic3r/SLAPrintSteps.cpp:700 -#: src/libslic3r/SLAPrintSteps.cpp:738 +#: src/libslic3r/SLAPrintSteps.cpp:740 src/libslic3r/SLAPrintSteps.cpp:749 +#: src/libslic3r/SLAPrintSteps.cpp:787 msgid "Visualizing supports" msgstr "Візуалізація підтримки" -#: src/libslic3r/SLAPrintSteps.cpp:730 +#: src/libslic3r/SLAPrintSteps.cpp:779 msgid "No pad can be generated for this model with the current configuration" msgstr "" "Для цієї моделі з поточною конфігурацією неможливо створити жодну подушку" -#: src/libslic3r/SLAPrintSteps.cpp:854 +#: src/libslic3r/SLAPrintSteps.cpp:908 msgid "" "There are unprintable objects. Try to adjust support settings to make the " "objects printable." @@ -10612,27 +12404,27 @@ msgstr "" msgid "Failed processing of the output_filename_format template." msgstr "Помилка обробки шаблону output_filename_format." -#: src/libslic3r/PrintConfig.cpp:236 src/libslic3r/PrintConfig.cpp:237 +#: src/libslic3r/PrintConfig.cpp:254 src/libslic3r/PrintConfig.cpp:255 msgid "Printer technology" msgstr "Технологія друку" -#: src/libslic3r/PrintConfig.cpp:244 +#: src/libslic3r/PrintConfig.cpp:260 msgid "Bed shape" msgstr "Форма столу" -#: src/libslic3r/PrintConfig.cpp:249 +#: src/libslic3r/PrintConfig.cpp:265 msgid "Bed custom texture" msgstr "Власна текстура столу" -#: src/libslic3r/PrintConfig.cpp:254 +#: src/libslic3r/PrintConfig.cpp:270 msgid "Bed custom model" msgstr "Власна модель столу" -#: src/libslic3r/PrintConfig.cpp:259 +#: src/libslic3r/PrintConfig.cpp:275 msgid "Elephant foot compensation" msgstr "Зрівноваження Стопи слона" -#: src/libslic3r/PrintConfig.cpp:261 +#: src/libslic3r/PrintConfig.cpp:277 msgid "" "The first layer will be shrunk in the XY plane by the configured value to " "compensate for the 1st layer squish aka an Elephant Foot effect." @@ -10640,27 +12432,27 @@ msgstr "" "Перший шар буде зменшено в площині XY завдяки налаштованому значенню, щоб " "компенсувати ефект Ноги Слона для 1-го шару." -#: src/libslic3r/PrintConfig.cpp:269 +#: src/libslic3r/PrintConfig.cpp:285 msgid "G-code thumbnails" msgstr "Ескізи G-коду" -#: src/libslic3r/PrintConfig.cpp:270 +#: src/libslic3r/PrintConfig.cpp:286 msgid "" "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " "following format: \"XxY, XxY, ...\"" msgstr "" -#: src/libslic3r/PrintConfig.cpp:276 +#: src/libslic3r/PrintConfig.cpp:292 msgid "Format of G-code thumbnails" msgstr "" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:293 msgid "" "Format of G-code thumbnails: PNG for best quality, JPG for smallest size, " "QOI for low memory firmware" msgstr "" -#: src/libslic3r/PrintConfig.cpp:288 +#: src/libslic3r/PrintConfig.cpp:301 msgid "" "This setting controls the height (and thus the total number) of the slices/" "layers. Thinner layers give better accuracy but take more time to print." @@ -10668,11 +12460,11 @@ msgstr "" "Цей параметр визначає висоту (і, таким чином, загальну кількість) шарів. " "Тонкі шари забезпечують більшу точність, але для друку потрібно більше часу." -#: src/libslic3r/PrintConfig.cpp:295 +#: src/libslic3r/PrintConfig.cpp:308 msgid "Max print height" msgstr "Максимальна висота друку" -#: src/libslic3r/PrintConfig.cpp:296 +#: src/libslic3r/PrintConfig.cpp:309 msgid "" "Set this to the maximum height that can be reached by your extruder while " "printing." @@ -10680,11 +12472,11 @@ msgstr "" "Встановіть це значення на максимальну висоту, якої може досягти ваш " "екструдер під час друку." -#: src/libslic3r/PrintConfig.cpp:304 +#: src/libslic3r/PrintConfig.cpp:317 msgid "Hostname, IP or URL" msgstr "Ім'я хоста, IP або URL" -#: src/libslic3r/PrintConfig.cpp:305 +#: src/libslic3r/PrintConfig.cpp:318 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the hostname, IP address or URL of the printer host instance. Print host " @@ -10698,11 +12490,11 @@ msgstr "" "отримати, ввівши ім’я користувача та пароль у URL-адресу у такому форматі: " "https://username:password@your-octopi-address/" -#: src/libslic3r/PrintConfig.cpp:314 +#: src/libslic3r/PrintConfig.cpp:327 msgid "API Key / Password" msgstr "Ключ API / Пароль" -#: src/libslic3r/PrintConfig.cpp:315 +#: src/libslic3r/PrintConfig.cpp:328 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the API Key or the password required for authentication." @@ -10710,11 +12502,11 @@ msgstr "" "Slic3r може завантажувати файли G-коду на хост принтера. Це поле повинно " "містити ключ API або пароль, необхідний для автентифікації." -#: src/libslic3r/PrintConfig.cpp:323 +#: src/libslic3r/PrintConfig.cpp:336 msgid "Name of the printer" msgstr "Назва принтера" -#: src/libslic3r/PrintConfig.cpp:331 +#: src/libslic3r/PrintConfig.cpp:344 msgid "" "Custom CA certificate file can be specified for HTTPS OctoPrint connections, " "in crt/pem format. If left blank, the default OS CA certificate repository " @@ -10724,46 +12516,58 @@ msgstr "" "у форматі crt/pem. Якщо залишити це поле порожнім, буде використано типове " "сховище сертифікатів OS CA." -#: src/libslic3r/PrintConfig.cpp:347 +#: src/libslic3r/PrintConfig.cpp:360 msgid "Password" msgstr "Пароль" -#: src/libslic3r/PrintConfig.cpp:355 +#: src/libslic3r/PrintConfig.cpp:368 msgid "Ignore HTTPS certificate revocation checks" msgstr "" -#: src/libslic3r/PrintConfig.cpp:356 +#: src/libslic3r/PrintConfig.cpp:369 msgid "" "Ignore HTTPS certificate revocation checks in case of missing or offline " "distribution points. One may want to enable this option for self signed " "certificates if connection fails." msgstr "" -#: src/libslic3r/PrintConfig.cpp:363 +#: src/libslic3r/PrintConfig.cpp:376 msgid "Printer preset names" msgstr "" -#: src/libslic3r/PrintConfig.cpp:364 +#: src/libslic3r/PrintConfig.cpp:377 msgid "Names of presets related to the physical printer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:369 +#: src/libslic3r/PrintConfig.cpp:382 msgid "Authorization Type" msgstr "Тип авторизації" -#: src/libslic3r/PrintConfig.cpp:374 +#: src/libslic3r/PrintConfig.cpp:385 msgid "API key" msgstr "Ключ API" -#: src/libslic3r/PrintConfig.cpp:375 +#: src/libslic3r/PrintConfig.cpp:386 msgid "HTTP digest" msgstr "Дайджест HTTP" -#: src/libslic3r/PrintConfig.cpp:395 +#: src/libslic3r/PrintConfig.cpp:406 +msgid "Avoid crossing curled overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:407 +msgid "" +"Plan travel moves such that the extruder avoids areas where the filament may " +"be curled up. This is mostly happening on steeper rounded overhangs and may " +"cause a crash with the nozzle. This feature slows down both the print and " +"the G-code generation." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:414 msgid "Avoid crossing perimeters" msgstr "Уникати перетинання периметрів" -#: src/libslic3r/PrintConfig.cpp:396 +#: src/libslic3r/PrintConfig.cpp:415 msgid "" "Optimize travel moves in order to minimize the crossing of perimeters. This " "is mostly useful with Bowden extruders which suffer from oozing. This " @@ -10773,11 +12577,11 @@ msgstr "" "основному це корисно для екструдерів Bowden, які страждають від протікання. " "Ця функція уповільнює як друк, так і генерацію G-коду." -#: src/libslic3r/PrintConfig.cpp:403 +#: src/libslic3r/PrintConfig.cpp:422 msgid "Avoid crossing perimeters - Max detour length" msgstr "Уникати перетинання периметрів - Макс. довжина обходу" -#: src/libslic3r/PrintConfig.cpp:405 +#: src/libslic3r/PrintConfig.cpp:424 msgid "" "The maximum detour length for avoid crossing perimeters. If the detour is " "longer than this value, avoid crossing perimeters is not applied for this " @@ -10789,15 +12593,15 @@ msgstr "" "застосовується. Довжина обходу може бути вказана або як абсолютне значення, " "або як відсоток (наприклад, 50%) від прямого шляху проходу." -#: src/libslic3r/PrintConfig.cpp:408 +#: src/libslic3r/PrintConfig.cpp:427 msgid "mm or % (zero to disable)" msgstr "мм або % (0, щоб вимкнути)" -#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:2839 +#: src/libslic3r/PrintConfig.cpp:434 src/libslic3r/PrintConfig.cpp:2927 msgid "Other layers" msgstr "Інші шари" -#: src/libslic3r/PrintConfig.cpp:416 +#: src/libslic3r/PrintConfig.cpp:435 msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." @@ -10805,11 +12609,11 @@ msgstr "" "Температура столу для останніх шарів після першого. Установіть 0, щоб " "відключити команди керування температурою столу на виході." -#: src/libslic3r/PrintConfig.cpp:419 +#: src/libslic3r/PrintConfig.cpp:438 msgid "Bed temperature" msgstr "Температура столу" -#: src/libslic3r/PrintConfig.cpp:426 +#: src/libslic3r/PrintConfig.cpp:445 msgid "" "This custom code is inserted at every layer change, right before the Z move. " "Note that you can use placeholder variables for all Slic3r settings as well " @@ -10819,11 +12623,11 @@ msgstr "" "переміщення Z. Зауважте, що ви можете використовувати шаблонні змінні для " "всіх параметрів Slic3r, а також [layer_num] і [layer_z]." -#: src/libslic3r/PrintConfig.cpp:436 +#: src/libslic3r/PrintConfig.cpp:455 msgid "Between objects G-code" msgstr "G-код між об'єктами" -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:456 msgid "" "This code is inserted between objects when using sequential printing. By " "default extruder and bed temperature are reset using non-wait command; " @@ -10840,15 +12644,15 @@ msgstr "" "Slic3r, то ж ви можете вставити команду \"M109 S [first_layer_temperature]\" " "де завгодно." -#: src/libslic3r/PrintConfig.cpp:448 +#: src/libslic3r/PrintConfig.cpp:467 msgid "Number of solid layers to generate on bottom surfaces." msgstr "Кількість суцільних шарів, генерованих на нижніх поверхнях." -#: src/libslic3r/PrintConfig.cpp:449 +#: src/libslic3r/PrintConfig.cpp:468 msgid "Bottom solid layers" msgstr "Нижні суцільні шари" -#: src/libslic3r/PrintConfig.cpp:457 +#: src/libslic3r/PrintConfig.cpp:476 msgid "" "The number of bottom solid layers is increased above bottom_solid_layers if " "necessary to satisfy minimum thickness of bottom shell." @@ -10856,15 +12660,15 @@ msgstr "" "Кількість твердих шарів знизу збільшується над нижчими твердими шарами, якщо " "це необхідно для задоволення мінімальної товщини донної оболонки." -#: src/libslic3r/PrintConfig.cpp:459 +#: src/libslic3r/PrintConfig.cpp:478 msgid "Minimum bottom shell thickness" msgstr "Мінімальна товщина нижньої оболонки" -#: src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:484 msgid "Bridge" msgstr "Міст" -#: src/libslic3r/PrintConfig.cpp:466 +#: src/libslic3r/PrintConfig.cpp:485 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." @@ -10872,21 +12676,21 @@ msgstr "" "Це прискорення, яке ваш принтер використовуватиме для мостів. Встановити 0, " "щоб відключити управління прискоренням для мостів." -#: src/libslic3r/PrintConfig.cpp:468 src/libslic3r/PrintConfig.cpp:639 -#: src/libslic3r/PrintConfig.cpp:1192 src/libslic3r/PrintConfig.cpp:1201 -#: src/libslic3r/PrintConfig.cpp:1401 src/libslic3r/PrintConfig.cpp:1410 -#: src/libslic3r/PrintConfig.cpp:1419 src/libslic3r/PrintConfig.cpp:1713 -#: src/libslic3r/PrintConfig.cpp:1764 src/libslic3r/PrintConfig.cpp:1775 -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1983 -#: src/libslic3r/PrintConfig.cpp:1991 +#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:1252 src/libslic3r/PrintConfig.cpp:1261 +#: src/libslic3r/PrintConfig.cpp:1447 src/libslic3r/PrintConfig.cpp:1456 +#: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1750 +#: src/libslic3r/PrintConfig.cpp:1801 src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1822 src/libslic3r/PrintConfig.cpp:2013 +#: src/libslic3r/PrintConfig.cpp:2021 msgid "mm/s²" msgstr "мм/с²" -#: src/libslic3r/PrintConfig.cpp:474 +#: src/libslic3r/PrintConfig.cpp:493 msgid "Bridging angle" msgstr "Кут моста" -#: src/libslic3r/PrintConfig.cpp:476 +#: src/libslic3r/PrintConfig.cpp:495 msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for all " @@ -10896,35 +12700,30 @@ msgstr "" "автоматично. Інакше передбачений кут буде використаний для всіх мостів. " "Використовуйте 180° для нульового кута." -#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:1102 -#: src/libslic3r/PrintConfig.cpp:2282 src/libslic3r/PrintConfig.cpp:2292 -#: src/libslic3r/PrintConfig.cpp:2583 src/libslic3r/PrintConfig.cpp:2824 -#: src/libslic3r/PrintConfig.cpp:3041 src/libslic3r/PrintConfig.cpp:3144 -#: src/libslic3r/PrintConfig.cpp:3698 src/libslic3r/PrintConfig.cpp:3819 -msgid "°" -msgstr "°" - -#: src/libslic3r/PrintConfig.cpp:485 +#: src/libslic3r/PrintConfig.cpp:504 msgid "Bridges fan speed" msgstr "Швидкість вентилятора для мостів" -#: src/libslic3r/PrintConfig.cpp:486 +#: src/libslic3r/PrintConfig.cpp:505 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "Ця швидкість вентилятора виконується для всіх мостів і виступів." -#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:1114 -#: src/libslic3r/PrintConfig.cpp:1601 src/libslic3r/PrintConfig.cpp:1793 -#: src/libslic3r/PrintConfig.cpp:1856 src/libslic3r/PrintConfig.cpp:2115 -#: src/libslic3r/PrintConfig.cpp:2174 src/libslic3r/PrintConfig.cpp:3323 -#: src/libslic3r/PrintConfig.cpp:3612 src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:596 +#: src/libslic3r/PrintConfig.cpp:605 src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:623 src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1893 src/libslic3r/PrintConfig.cpp:2145 +#: src/libslic3r/PrintConfig.cpp:2204 src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3369 src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3870 msgid "%" msgstr "%" -#: src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:513 msgid "Bridge flow ratio" msgstr "Співвідношення мостового потоку" -#: src/libslic3r/PrintConfig.cpp:496 +#: src/libslic3r/PrintConfig.cpp:515 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -10936,102 +12735,146 @@ msgstr "" "стандартні налаштування зазвичай добрі, тому ви маете по-експериментувати з " "охолодженням (використовуйте вентилятор), перш ніж їх налаштувати." -#: src/libslic3r/PrintConfig.cpp:506 +#: src/libslic3r/PrintConfig.cpp:525 msgid "Bridges" msgstr "Мости" -#: src/libslic3r/PrintConfig.cpp:508 +#: src/libslic3r/PrintConfig.cpp:527 msgid "Speed for printing bridges." msgstr "Швидкість друку мостів." -#: src/libslic3r/PrintConfig.cpp:509 src/libslic3r/PrintConfig.cpp:920 -#: src/libslic3r/PrintConfig.cpp:928 src/libslic3r/PrintConfig.cpp:937 -#: src/libslic3r/PrintConfig.cpp:945 src/libslic3r/PrintConfig.cpp:972 -#: src/libslic3r/PrintConfig.cpp:991 src/libslic3r/PrintConfig.cpp:1329 -#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1620 -#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1730 -#: src/libslic3r/PrintConfig.cpp:1742 src/libslic3r/PrintConfig.cpp:1752 -#: src/libslic3r/PrintConfig.cpp:1815 src/libslic3r/PrintConfig.cpp:1874 -#: src/libslic3r/PrintConfig.cpp:2022 src/libslic3r/PrintConfig.cpp:2249 -#: src/libslic3r/PrintConfig.cpp:2258 src/libslic3r/PrintConfig.cpp:2789 -#: src/libslic3r/PrintConfig.cpp:2939 src/libslic3r/PrintConfig.cpp:2949 +#: src/libslic3r/PrintConfig.cpp:528 src/libslic3r/PrintConfig.cpp:1009 +#: src/libslic3r/PrintConfig.cpp:1017 src/libslic3r/PrintConfig.cpp:1026 +#: src/libslic3r/PrintConfig.cpp:1034 src/libslic3r/PrintConfig.cpp:1061 +#: src/libslic3r/PrintConfig.cpp:1080 src/libslic3r/PrintConfig.cpp:1386 +#: src/libslic3r/PrintConfig.cpp:1579 src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1733 src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1779 src/libslic3r/PrintConfig.cpp:1789 +#: src/libslic3r/PrintConfig.cpp:1852 src/libslic3r/PrintConfig.cpp:1911 +#: src/libslic3r/PrintConfig.cpp:2052 src/libslic3r/PrintConfig.cpp:2279 +#: src/libslic3r/PrintConfig.cpp:2288 src/libslic3r/PrintConfig.cpp:2810 +#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3037 msgid "mm/s" msgstr "мм/с" -#: src/libslic3r/PrintConfig.cpp:516 +#: src/libslic3r/PrintConfig.cpp:535 +msgid "Enable dynamic overhang speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:537 +msgid "This setting enables dynamic speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:541 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Speeds for overhang " +"sizes in between are calculated via linear interpolation. If set as " +"percentage, the speed is calculated over the external perimeter speed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:547 src/libslic3r/PrintConfig.cpp:594 +msgid "speed for 0% overlap (bridge)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:550 src/libslic3r/PrintConfig.cpp:559 +#: src/libslic3r/PrintConfig.cpp:568 src/libslic3r/PrintConfig.cpp:577 +#: src/libslic3r/PrintConfig.cpp:856 src/libslic3r/PrintConfig.cpp:1305 +#: src/libslic3r/PrintConfig.cpp:1316 src/libslic3r/PrintConfig.cpp:2387 +#: src/libslic3r/PrintConfig.cpp:2440 src/libslic3r/PrintConfig.cpp:2765 +#: src/libslic3r/PrintConfig.cpp:2997 +msgid "mm/s or %" +msgstr "мм/с або %" + +#: src/libslic3r/PrintConfig.cpp:556 src/libslic3r/PrintConfig.cpp:603 +msgid "speed for 25% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:612 +msgid "speed for 50% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:574 src/libslic3r/PrintConfig.cpp:621 +msgid "speed for 75% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:583 +msgid "Enable dynamic fan speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:584 +msgid "This setting enables dynamic fan speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:589 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Fan speeds for " +"overhang sizes in between are calculated via linear interpolation. " +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:630 msgid "Brim width" msgstr "Ширина краю" -#: src/libslic3r/PrintConfig.cpp:518 +#: src/libslic3r/PrintConfig.cpp:632 msgid "" "The horizontal width of the brim that will be printed around each object on " "the first layer. When raft is used, no brim is generated (use " "raft_first_layer_expansion)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:527 +#: src/libslic3r/PrintConfig.cpp:641 msgid "Brim type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:529 +#: src/libslic3r/PrintConfig.cpp:643 msgid "" "The places where the brim will be printed around each object on the first " "layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:535 +#: src/libslic3r/PrintConfig.cpp:645 msgid "No brim" msgstr "" -#: src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:646 msgid "Outer brim only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:537 +#: src/libslic3r/PrintConfig.cpp:647 msgid "Inner brim only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:538 +#: src/libslic3r/PrintConfig.cpp:648 msgid "Outer and inner brim" msgstr "" -#: src/libslic3r/PrintConfig.cpp:543 +#: src/libslic3r/PrintConfig.cpp:654 msgid "Brim separation gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:545 +#: src/libslic3r/PrintConfig.cpp:656 msgid "" "Offset of brim from the printed object. The offset is applied after the " "elephant foot compensation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:552 -msgid "Clip multi-part objects" -msgstr "Обрізати об'єкти, що складаються з кількох частин" - -#: src/libslic3r/PrintConfig.cpp:553 -msgid "" -"When printing multi-material objects, this settings will make Slic3r to clip " -"the overlapping object parts one by the other (2nd part will be clipped by " -"the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -msgstr "" -"Під час друку багато-матеріальних об'єктів ці налаштування дозволять Slic3r " -"відсікати накладені частини об'єкта одна за одною (друга частина буде " -"відсічена першою, третя частина буде відсічена першою та другою тощо)." - -#: src/libslic3r/PrintConfig.cpp:560 +#: src/libslic3r/PrintConfig.cpp:663 msgid "Colorprint height" msgstr "Висота кольорового друку" -#: src/libslic3r/PrintConfig.cpp:561 +#: src/libslic3r/PrintConfig.cpp:664 msgid "Heights at which a filament change is to occur." msgstr "Висоти, на яких має відбуватися зміна філаменту." -#: src/libslic3r/PrintConfig.cpp:571 +#: src/libslic3r/PrintConfig.cpp:674 msgid "Compatible printers condition" msgstr "Умови сумісності принтерів" -#: src/libslic3r/PrintConfig.cpp:572 +#: src/libslic3r/PrintConfig.cpp:675 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " @@ -11041,11 +12884,11 @@ msgstr "" "принтера. Якщо цей вираз оцінюється як Правда, цей профіль вважається " "сумісним з активним профілем принтера." -#: src/libslic3r/PrintConfig.cpp:586 +#: src/libslic3r/PrintConfig.cpp:689 msgid "Compatible print profiles condition" msgstr "Умови сумісності пресетів друку" -#: src/libslic3r/PrintConfig.cpp:587 +#: src/libslic3r/PrintConfig.cpp:690 msgid "" "A boolean expression using the configuration values of an active print " "profile. If this expression evaluates to true, this profile is considered " @@ -11055,11 +12898,11 @@ msgstr "" "друку. Якщо цей вираз оцінюється як Правда, цей профіль вважається сумісним " "з активним профілем друку." -#: src/libslic3r/PrintConfig.cpp:604 +#: src/libslic3r/PrintConfig.cpp:707 msgid "Complete individual objects" msgstr "Закінчити окремі об'єкти" -#: src/libslic3r/PrintConfig.cpp:605 +#: src/libslic3r/PrintConfig.cpp:708 msgid "" "When printing multiple objects or copies, this feature will complete each " "object before moving onto next one (and starting it from its bottom layer). " @@ -11071,11 +12914,11 @@ msgstr "" "шару). Ця функція корисна для уникнення ризику зіпсованих відбитків. Slic3r " "має попередити та запобігти зіткненню екструдера, але будьте обережні." -#: src/libslic3r/PrintConfig.cpp:613 +#: src/libslic3r/PrintConfig.cpp:716 msgid "Enable auto cooling" msgstr "Увімкнути автоматичне охолодження" -#: src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:717 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." @@ -11083,26 +12926,26 @@ msgstr "" "Цей прапорець дозволяє автоматичну логіку охолодження, яка регулює швидкість " "друку та швидкість вентиляції відповідно до часу друку шару." -#: src/libslic3r/PrintConfig.cpp:619 +#: src/libslic3r/PrintConfig.cpp:722 msgid "Cooling tube position" msgstr "Позиція охолоджувальної трубки" -#: src/libslic3r/PrintConfig.cpp:620 +#: src/libslic3r/PrintConfig.cpp:723 msgid "Distance of the center-point of the cooling tube from the extruder tip." msgstr "" "Відстань центральної точки охолоджувальної трубки від наконечника екструдера." -#: src/libslic3r/PrintConfig.cpp:627 +#: src/libslic3r/PrintConfig.cpp:730 msgid "Cooling tube length" msgstr "Довжина охолоджувальної трубки" -#: src/libslic3r/PrintConfig.cpp:628 +#: src/libslic3r/PrintConfig.cpp:731 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "" "Довжина охолоджувальної трубки для обмеження простору для охолоджуючих рухів " "всередині неї." -#: src/libslic3r/PrintConfig.cpp:636 +#: src/libslic3r/PrintConfig.cpp:739 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " @@ -11112,11 +12955,11 @@ msgstr "" "використані конкретні визначені прискорення (периметру / заповнення). " "Встановити 0, щоб запобігти скиданням прискорення взагалі." -#: src/libslic3r/PrintConfig.cpp:645 +#: src/libslic3r/PrintConfig.cpp:748 msgid "Default filament profile" msgstr "Профіль філаметну за замовчанням" -#: src/libslic3r/PrintConfig.cpp:646 +#: src/libslic3r/PrintConfig.cpp:749 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " @@ -11125,12 +12968,12 @@ msgstr "" "Профіль філаметну за замовчанням, пов'язаний з поточним профілем принтера. " "При виборі поточного профілю принтера цей профіль філаметну буде активовано." -#: src/libslic3r/PrintConfig.cpp:652 +#: src/libslic3r/PrintConfig.cpp:755 msgid "Default print profile" msgstr "Профіль друку за замовчанням" -#: src/libslic3r/PrintConfig.cpp:653 src/libslic3r/PrintConfig.cpp:3542 -#: src/libslic3r/PrintConfig.cpp:3553 +#: src/libslic3r/PrintConfig.cpp:756 src/libslic3r/PrintConfig.cpp:3819 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -11139,11 +12982,11 @@ msgstr "" "Профіль друку за промовчанням, пов'язаний із поточним профілем принтера. При " "виборі поточного профілю принтера цей профіль друку буде активовано." -#: src/libslic3r/PrintConfig.cpp:659 +#: src/libslic3r/PrintConfig.cpp:762 msgid "Disable fan for the first" msgstr "Вимкнути вентилятор для першого(их)" -#: src/libslic3r/PrintConfig.cpp:660 +#: src/libslic3r/PrintConfig.cpp:763 msgid "" "You can set this to a positive value to disable fan at all during the first " "layers, so that it does not make adhesion worse." @@ -11152,11 +12995,11 @@ msgstr "" "протягом друку декількох перших шарів, щоб це не призвело до гіршого " "зчеплення." -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:772 msgid "Don't support bridges" msgstr "Не підтримувати мости" -#: src/libslic3r/PrintConfig.cpp:671 +#: src/libslic3r/PrintConfig.cpp:774 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." @@ -11164,15 +13007,15 @@ msgstr "" "Експериментальний варіант для запобігання утворенню допоміжного матеріалу в " "областях під мостами." -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:780 msgid "Distance between copies" msgstr "Відстань між копіями" -#: src/libslic3r/PrintConfig.cpp:678 +#: src/libslic3r/PrintConfig.cpp:781 msgid "Distance used for the auto-arrange feature of the plater." msgstr "Відстань використовується для автоматичного розташування платеру." -#: src/libslic3r/PrintConfig.cpp:686 +#: src/libslic3r/PrintConfig.cpp:789 msgid "" "This end procedure is inserted at the end of the output file. Note that you " "can use placeholder variables for all PrusaSlicer settings." @@ -11181,7 +13024,7 @@ msgstr "" "увагу, що ви можете використовувати шаблонні змінні для всіх налаштувань " "PrusaSlicer." -#: src/libslic3r/PrintConfig.cpp:696 +#: src/libslic3r/PrintConfig.cpp:799 msgid "" "This end procedure is inserted at the end of the output file, before the " "printer end gcode (and before any toolchange from this filament in case of " @@ -11195,23 +13038,11 @@ msgstr "" "використовувати шаблонні змінні для всіх налаштувань PrusaSlicer. Якщо у вас " "кілька екструдерів, G-код обробляється в порядку екструдера." -#: src/libslic3r/PrintConfig.cpp:707 -msgid "Ensure vertical shell thickness" -msgstr "Забезпечення товщини вертикальної оболонки" - -#: src/libslic3r/PrintConfig.cpp:709 -msgid "" -"Add solid infill near sloping surfaces to guarantee the vertical shell " -"thickness (top+bottom solid layers)." -msgstr "" -"Додайте суцільні наповнювачі біля нахилених поверхонь, щоб гарантувати " -"товщину вертикальної оболонки (верхній і нижній суцільні шари)." - -#: src/libslic3r/PrintConfig.cpp:715 +#: src/libslic3r/PrintConfig.cpp:810 msgid "Top fill pattern" msgstr "Верхній шаблон наповнення" -#: src/libslic3r/PrintConfig.cpp:717 +#: src/libslic3r/PrintConfig.cpp:812 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." @@ -11219,45 +13050,45 @@ msgstr "" "Шаблон для верхнього наповнення. Це впливає лише на зовнішній видимий шар, а " "не на сусідні суцільні оболонки." -#: src/libslic3r/PrintConfig.cpp:728 src/libslic3r/PrintConfig.cpp:1169 -#: src/libslic3r/PrintConfig.cpp:2754 src/libslic3r/PrintConfig.cpp:2771 +#: src/libslic3r/PrintConfig.cpp:815 src/libslic3r/PrintConfig.cpp:1228 +#: src/libslic3r/PrintConfig.cpp:2776 src/libslic3r/PrintConfig.cpp:2791 msgid "Rectilinear" msgstr "Прямолінійний" -#: src/libslic3r/PrintConfig.cpp:729 +#: src/libslic3r/PrintConfig.cpp:816 msgid "Monotonic" msgstr "Монотонне" -#: src/libslic3r/PrintConfig.cpp:730 +#: src/libslic3r/PrintConfig.cpp:817 msgid "Monotonic Lines" msgstr "" -#: src/libslic3r/PrintConfig.cpp:731 src/libslic3r/PrintConfig.cpp:1170 +#: src/libslic3r/PrintConfig.cpp:818 src/libslic3r/PrintConfig.cpp:1229 msgid "Aligned Rectilinear" msgstr "Вирівняний прямолінійний" -#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:1176 -#: src/libslic3r/PrintConfig.cpp:2772 +#: src/libslic3r/PrintConfig.cpp:819 src/libslic3r/PrintConfig.cpp:1235 +#: src/libslic3r/PrintConfig.cpp:2792 msgid "Concentric" msgstr "Концентричний" -#: src/libslic3r/PrintConfig.cpp:733 src/libslic3r/PrintConfig.cpp:1180 +#: src/libslic3r/PrintConfig.cpp:820 src/libslic3r/PrintConfig.cpp:1239 msgid "Hilbert Curve" msgstr "Крива Гільберта" -#: src/libslic3r/PrintConfig.cpp:734 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:821 src/libslic3r/PrintConfig.cpp:1240 msgid "Archimedean Chords" msgstr "Архімедові акорди" -#: src/libslic3r/PrintConfig.cpp:735 src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:822 src/libslic3r/PrintConfig.cpp:1241 msgid "Octagram Spiral" msgstr "Спіраль октаграм" -#: src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:830 msgid "Bottom fill pattern" msgstr "Нижній шаблон наповнення" -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:832 msgid "" "Fill pattern for bottom infill. This only affects the bottom external " "visible layer, and not its adjacent solid shells." @@ -11265,12 +13096,12 @@ msgstr "" "Шаблон для нижнього наповнення. Це впливає лише на зовнішній видимий шар, а " "не на сусідні суцільні оболонки." -#: src/libslic3r/PrintConfig.cpp:753 src/libslic3r/PrintConfig.cpp:765 -#: src/libslic3r/PrintConfig.cpp:1988 +#: src/libslic3r/PrintConfig.cpp:839 src/libslic3r/PrintConfig.cpp:851 +#: src/libslic3r/PrintConfig.cpp:2018 msgid "External perimeters" msgstr "Зовнішні периметри" -#: src/libslic3r/PrintConfig.cpp:755 +#: src/libslic3r/PrintConfig.cpp:841 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " "perimeters. If left zero, default extrusion width will be used if set, " @@ -11283,18 +13114,18 @@ msgstr "" "сопла. Якщо він виражений у відсотках (наприклад, 200%), він буде " "обчислюватися за висотою шару." -#: src/libslic3r/PrintConfig.cpp:758 src/libslic3r/PrintConfig.cpp:869 -#: src/libslic3r/PrintConfig.cpp:1223 src/libslic3r/PrintConfig.cpp:1445 -#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1529 -#: src/libslic3r/PrintConfig.cpp:2011 src/libslic3r/PrintConfig.cpp:2397 -#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2660 -#: src/libslic3r/PrintConfig.cpp:2895 src/libslic3r/PrintConfig.cpp:3117 -#: src/libslic3r/PrintConfig.cpp:3132 src/libslic3r/PrintConfig.cpp:3166 -#: src/libslic3r/PrintConfig.cpp:3178 +#: src/libslic3r/PrintConfig.cpp:844 src/libslic3r/PrintConfig.cpp:958 +#: src/libslic3r/PrintConfig.cpp:1283 src/libslic3r/PrintConfig.cpp:1491 +#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1570 +#: src/libslic3r/PrintConfig.cpp:2041 src/libslic3r/PrintConfig.cpp:2428 +#: src/libslic3r/PrintConfig.cpp:2601 src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2983 src/libslic3r/PrintConfig.cpp:3204 +#: src/libslic3r/PrintConfig.cpp:3219 src/libslic3r/PrintConfig.cpp:3253 +#: src/libslic3r/PrintConfig.cpp:3265 msgid "mm or %" msgstr "мм або %" -#: src/libslic3r/PrintConfig.cpp:767 +#: src/libslic3r/PrintConfig.cpp:853 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " @@ -11305,18 +13136,11 @@ msgstr "" "налаштування швидкості периметра вище. Встановити 0 для автоматичного " "використання." -#: src/libslic3r/PrintConfig.cpp:770 src/libslic3r/PrintConfig.cpp:1245 -#: src/libslic3r/PrintConfig.cpp:1256 src/libslic3r/PrintConfig.cpp:2356 -#: src/libslic3r/PrintConfig.cpp:2409 src/libslic3r/PrintConfig.cpp:2740 -#: src/libslic3r/PrintConfig.cpp:2909 -msgid "mm/s or %" -msgstr "мм/с або %" - -#: src/libslic3r/PrintConfig.cpp:777 +#: src/libslic3r/PrintConfig.cpp:863 msgid "External perimeters first" msgstr "Спочатку зовнішні периметри" -#: src/libslic3r/PrintConfig.cpp:779 +#: src/libslic3r/PrintConfig.cpp:865 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." @@ -11324,11 +13148,12 @@ msgstr "" "Друкувати контури периметра від найзовнішнього до найвнутрішнього, замість " "інверсного порядку за замовчанням." -#: src/libslic3r/PrintConfig.cpp:785 +#: src/libslic3r/PrintConfig.cpp:871 msgid "Extra perimeters if needed" msgstr "Додаткові периметри, якщо необхідно" -#: src/libslic3r/PrintConfig.cpp:787 +#: src/libslic3r/PrintConfig.cpp:873 +#, fuzzy msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " "keeps adding perimeters, until more than 70% of the loop immediately above " @@ -11338,7 +13163,18 @@ msgstr "" "Slic3r продовжує додавати периметри, поки підтримується більше 70% петель " "безпосередньо вище." -#: src/libslic3r/PrintConfig.cpp:797 +#: src/libslic3r/PrintConfig.cpp:880 +msgid "Extra perimeters on overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:882 +msgid "" +"Detect overhang areas where bridges cannot be anchored, and fill them with " +"extra perimeter paths. These paths are anchored to the nearby non-overhang " +"area when possible." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:890 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " @@ -11348,7 +13184,7 @@ msgstr "" "екструдера). Це значення перевизначає екструдери периметра та наповнювача, " "але не екструдери підтримки." -#: src/libslic3r/PrintConfig.cpp:809 +#: src/libslic3r/PrintConfig.cpp:898 msgid "" "Set this to the vertical distance between your nozzle tip and (usually) the " "X carriage rods. In other words, this is the height of the clearance " @@ -11360,7 +13196,7 @@ msgstr "" "навколо вашого екструдера, і це являє собою максимальну глибину, яку " "екструдер може розглядати до зіткнення з іншими друкованими предметами." -#: src/libslic3r/PrintConfig.cpp:820 +#: src/libslic3r/PrintConfig.cpp:909 msgid "" "Set this to the clearance radius around your extruder. If the extruder is " "not centered, choose the largest value for safety. This setting is used to " @@ -11371,21 +13207,21 @@ msgstr "" "параметр використовується для перевірки зіткнень та відображення графічного " "попереднього перегляду в панелі." -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:919 msgid "Extruder Color" msgstr "Колір екструдера" -#: src/libslic3r/PrintConfig.cpp:831 src/libslic3r/PrintConfig.cpp:894 -#: src/libslic3r/PrintConfig.cpp:3394 +#: src/libslic3r/PrintConfig.cpp:920 src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:3666 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" "Ця опція використовується лише у інтерфейсі Slic3r як візуальна допомога." -#: src/libslic3r/PrintConfig.cpp:837 +#: src/libslic3r/PrintConfig.cpp:926 msgid "Extruder offset" msgstr "Зміщення екструдеру" -#: src/libslic3r/PrintConfig.cpp:838 +#: src/libslic3r/PrintConfig.cpp:927 msgid "" "If your firmware doesn't handle the extruder displacement you need the G-" "code to take it into account. This option lets you specify the displacement " @@ -11397,11 +13233,11 @@ msgstr "" "відносно першого. Він очікує позитивних координат (вони будуть віднімані від " "координати XY)." -#: src/libslic3r/PrintConfig.cpp:847 +#: src/libslic3r/PrintConfig.cpp:936 msgid "Extrusion axis" msgstr "Ось екструзії" -#: src/libslic3r/PrintConfig.cpp:848 +#: src/libslic3r/PrintConfig.cpp:937 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." @@ -11409,11 +13245,11 @@ msgstr "" "Використовуйте цю опцію, щоб встановити букву осей, пов'язану з екструдером " "принтера (зазвичай E, але деякі принтери використовують A)." -#: src/libslic3r/PrintConfig.cpp:853 +#: src/libslic3r/PrintConfig.cpp:942 msgid "Extrusion multiplier" msgstr "Коефіцієнт екструзії" -#: src/libslic3r/PrintConfig.cpp:854 +#: src/libslic3r/PrintConfig.cpp:943 msgid "" "This factor changes the amount of flow proportionally. You may need to tweak " "this setting to get nice surface finish and correct single wall widths. " @@ -11426,11 +13262,11 @@ msgstr "" "вважаєте, що його потрібно більше змінити, перевірте діаметр філаменту та E " "кроки прошивки ." -#: src/libslic3r/PrintConfig.cpp:863 +#: src/libslic3r/PrintConfig.cpp:952 msgid "Default extrusion width" msgstr "Ширина екструзії за замовчанням" -#: src/libslic3r/PrintConfig.cpp:865 +#: src/libslic3r/PrintConfig.cpp:954 msgid "" "Set this to a non-zero value to allow a manual extrusion width. If left to " "zero, Slic3r derives extrusion widths from the nozzle diameter (see the " @@ -11444,11 +13280,11 @@ msgstr "" "наповнювача тощо). Якщо значення виражене у відсотках (наприклад: 230%), " "воно буде обчислюватися за висотою шару." -#: src/libslic3r/PrintConfig.cpp:877 +#: src/libslic3r/PrintConfig.cpp:966 msgid "Keep fan always on" msgstr "Тримайте вентилятор завжди" -#: src/libslic3r/PrintConfig.cpp:878 +#: src/libslic3r/PrintConfig.cpp:967 msgid "" "If this is enabled, fan will never be disabled and will be kept running at " "least at its minimum speed. Useful for PLA, harmful for ABS." @@ -11457,11 +13293,11 @@ msgstr "" "триматися, як мінімум, на мінімальній швидкості. Корисно для PLA, шкідливо " "для ABS." -#: src/libslic3r/PrintConfig.cpp:883 +#: src/libslic3r/PrintConfig.cpp:972 msgid "Enable fan if layer print time is below" msgstr "Увімкнути вентилятор, якщо час друку шару нижче" -#: src/libslic3r/PrintConfig.cpp:884 +#: src/libslic3r/PrintConfig.cpp:973 msgid "" "If layer print time is estimated below this number of seconds, fan will be " "enabled and its speed will be calculated by interpolating the minimum and " @@ -11471,27 +13307,27 @@ msgstr "" "активований, а його швидкість буде розрахована шляхом інтерполяції " "мінімальної та максимальної швидкості." -#: src/libslic3r/PrintConfig.cpp:886 src/libslic3r/PrintConfig.cpp:2344 +#: src/libslic3r/PrintConfig.cpp:975 src/libslic3r/PrintConfig.cpp:2375 msgid "approximate seconds" msgstr "приблизні секунди" -#: src/libslic3r/PrintConfig.cpp:893 src/libslic3r/PrintConfig.cpp:3393 +#: src/libslic3r/PrintConfig.cpp:982 src/libslic3r/PrintConfig.cpp:3665 msgid "Color" msgstr "Колір" -#: src/libslic3r/PrintConfig.cpp:899 +#: src/libslic3r/PrintConfig.cpp:988 msgid "Filament notes" msgstr "Примітки до філаменту" -#: src/libslic3r/PrintConfig.cpp:900 +#: src/libslic3r/PrintConfig.cpp:989 msgid "You can put your notes regarding the filament here." msgstr "Тут ви можете помістити свої нотатки щодо філаменту." -#: src/libslic3r/PrintConfig.cpp:908 src/libslic3r/PrintConfig.cpp:1821 +#: src/libslic3r/PrintConfig.cpp:997 src/libslic3r/PrintConfig.cpp:1858 msgid "Max volumetric speed" msgstr "Максимальна об'ємна швидкість" -#: src/libslic3r/PrintConfig.cpp:909 +#: src/libslic3r/PrintConfig.cpp:998 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " @@ -11501,28 +13337,28 @@ msgstr "" "максимальну об'ємну швидкість друку до мінімуму об'ємної швидкості друку та " "філаметну. Встановити 0 для відсутності обмежень." -#: src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:1007 msgid "Loading speed" msgstr "Швидкість заведення" -#: src/libslic3r/PrintConfig.cpp:919 +#: src/libslic3r/PrintConfig.cpp:1008 msgid "Speed used for loading the filament on the wipe tower." msgstr "" "Швидкість, що використовується для заведення філаменту на вежі витирання." -#: src/libslic3r/PrintConfig.cpp:926 +#: src/libslic3r/PrintConfig.cpp:1015 msgid "Loading speed at the start" msgstr "Швидкість заведення на старті" -#: src/libslic3r/PrintConfig.cpp:927 +#: src/libslic3r/PrintConfig.cpp:1016 msgid "Speed used at the very beginning of loading phase." msgstr "Швидкість, що використовується на самому початку фази заведення." -#: src/libslic3r/PrintConfig.cpp:934 +#: src/libslic3r/PrintConfig.cpp:1023 msgid "Unloading speed" msgstr "Швидкість виведення" -#: src/libslic3r/PrintConfig.cpp:935 +#: src/libslic3r/PrintConfig.cpp:1024 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." @@ -11530,22 +13366,22 @@ msgstr "" "Швидкість, яка використовується для виведення філаменту на вежі витирання " "(не впливає на початкову частину виведення безпосередньо після раммінгу)." -#: src/libslic3r/PrintConfig.cpp:943 +#: src/libslic3r/PrintConfig.cpp:1032 msgid "Unloading speed at the start" msgstr "Швидкість виведення на старті" -#: src/libslic3r/PrintConfig.cpp:944 +#: src/libslic3r/PrintConfig.cpp:1033 msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "" "Швидкість, яка використовується для виведення кінчику філаменту " "безпосередньо після раммінгу." -#: src/libslic3r/PrintConfig.cpp:951 +#: src/libslic3r/PrintConfig.cpp:1040 msgid "Delay after unloading" msgstr "Затримка після виведення" -#: src/libslic3r/PrintConfig.cpp:952 +#: src/libslic3r/PrintConfig.cpp:1041 msgid "" "Time to wait after the filament is unloaded. May help to get reliable " "toolchanges with flexible materials that may need more time to shrink to " @@ -11555,11 +13391,11 @@ msgstr "" "заміну інструменту для гнучких матеріалів, яким може знадобитися більше " "часу, щоб зменшитись до початкових розмірів." -#: src/libslic3r/PrintConfig.cpp:961 +#: src/libslic3r/PrintConfig.cpp:1050 msgid "Number of cooling moves" msgstr "Кількість охолоджуючих рухів" -#: src/libslic3r/PrintConfig.cpp:962 +#: src/libslic3r/PrintConfig.cpp:1051 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " "Specify desired number of these moves." @@ -11567,20 +13403,20 @@ msgstr "" "Філамент охолоджується шляхом переміщення вперед-назад у охолоджувальних " "трубках. Вкажіть бажану кількість цих рухів." -#: src/libslic3r/PrintConfig.cpp:970 +#: src/libslic3r/PrintConfig.cpp:1059 msgid "Speed of the first cooling move" msgstr "Швидкість першого охолоджуючого руху" -#: src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:1060 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "" "Охолоджувальні рухи поступово прискорюються, починаючи з цієї швидкості." -#: src/libslic3r/PrintConfig.cpp:978 +#: src/libslic3r/PrintConfig.cpp:1067 msgid "Minimal purge on wipe tower" msgstr "Мінімальний екструдований об'єм на очисній вежі" -#: src/libslic3r/PrintConfig.cpp:979 +#: src/libslic3r/PrintConfig.cpp:1068 msgid "" "After a tool change, the exact position of the newly loaded filament inside " "the nozzle may not be known, and the filament pressure is likely not yet " @@ -11594,23 +13430,23 @@ msgstr "" "очищувальної вежі, Slic3r завжди продавлює цю кількість матеріалу до " "очищувальної вежі, щоб отримати послідовне заповнення." -#: src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:1072 msgid "mm³" msgstr "мм³" -#: src/libslic3r/PrintConfig.cpp:989 +#: src/libslic3r/PrintConfig.cpp:1078 msgid "Speed of the last cooling move" msgstr "Швидкість останнього охолоджуючого руху" -#: src/libslic3r/PrintConfig.cpp:990 +#: src/libslic3r/PrintConfig.cpp:1079 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "Охолоджувальні рухи поступово прискорюються до цієї швидкості." -#: src/libslic3r/PrintConfig.cpp:997 +#: src/libslic3r/PrintConfig.cpp:1086 msgid "Filament load time" msgstr "Час заведення філаменту" -#: src/libslic3r/PrintConfig.cpp:998 +#: src/libslic3r/PrintConfig.cpp:1087 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " "filament during a tool change (when executing the T code). This time is " @@ -11620,11 +13456,11 @@ msgstr "" "філамент під час заміни інструменту (під час виконання коду Т). Цей час " "додається до загального часу друку за допомогою оцінювача часу G-коду." -#: src/libslic3r/PrintConfig.cpp:1005 +#: src/libslic3r/PrintConfig.cpp:1094 msgid "Ramming parameters" msgstr "Параметри раммінгу" -#: src/libslic3r/PrintConfig.cpp:1006 +#: src/libslic3r/PrintConfig.cpp:1095 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." @@ -11632,11 +13468,11 @@ msgstr "" "Цей рядок відредаговано у діалогу налаштувань раммінгу та містить певні " "параметри раммінгу." -#: src/libslic3r/PrintConfig.cpp:1012 +#: src/libslic3r/PrintConfig.cpp:1101 msgid "Filament unload time" msgstr "Час виведення філаменту" -#: src/libslic3r/PrintConfig.cpp:1013 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " "filament during a tool change (when executing the T code). This time is " @@ -11646,7 +13482,7 @@ msgstr "" "філамент під час заміни інструменту (під час виконання коду Т). Цей час " "додається до загального часу друку за допомогою оцінювача часу G-коду." -#: src/libslic3r/PrintConfig.cpp:1021 +#: src/libslic3r/PrintConfig.cpp:1110 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " @@ -11656,12 +13492,12 @@ msgstr "" "використовуйте суматор і виконайте декілька вимірювань вздовж філаменту, " "потім обчисліть середнє значення." -#: src/libslic3r/PrintConfig.cpp:1028 src/libslic3r/PrintConfig.cpp:3432 -#: src/libslic3r/PrintConfig.cpp:3433 +#: src/libslic3r/PrintConfig.cpp:1117 src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3710 msgid "Density" msgstr "Щільність" -#: src/libslic3r/PrintConfig.cpp:1029 +#: src/libslic3r/PrintConfig.cpp:1118 msgid "" "Enter your filament density here. This is only for statistical information. " "A decent way is to weigh a known length of filament and compute the ratio of " @@ -11673,27 +13509,27 @@ msgstr "" "обчислення співвідношення довжини до обсягу. Краще обчислити об'єм " "безпосередньо через зміщення." -#: src/libslic3r/PrintConfig.cpp:1032 +#: src/libslic3r/PrintConfig.cpp:1121 msgid "g/cm³" msgstr "г/см³" -#: src/libslic3r/PrintConfig.cpp:1037 +#: src/libslic3r/PrintConfig.cpp:1126 msgid "Filament type" msgstr "Тип філаменту" -#: src/libslic3r/PrintConfig.cpp:1038 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "The filament material type for use in custom G-codes." msgstr "Тип матеріалу філаменту для використання в користувацьких G-кодах." -#: src/libslic3r/PrintConfig.cpp:1066 +#: src/libslic3r/PrintConfig.cpp:1155 msgid "Soluble material" msgstr "Розчинний матеріал" -#: src/libslic3r/PrintConfig.cpp:1067 +#: src/libslic3r/PrintConfig.cpp:1156 msgid "Soluble material is most likely used for a soluble support." msgstr "Розчинний матеріал переважно використовується для розчинної підтримки." -#: src/libslic3r/PrintConfig.cpp:1073 +#: src/libslic3r/PrintConfig.cpp:1162 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." @@ -11701,15 +13537,15 @@ msgstr "" "Введіть тут свою вартість філаменту на кг. Це тільки для статистичної " "інформації." -#: src/libslic3r/PrintConfig.cpp:1074 +#: src/libslic3r/PrintConfig.cpp:1163 msgid "money/kg" msgstr "грошових одиниць/кг" -#: src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1168 msgid "Spool weight" msgstr "Вага котушки" -#: src/libslic3r/PrintConfig.cpp:1080 +#: src/libslic3r/PrintConfig.cpp:1169 msgid "" "Enter weight of the empty filament spool. One may weigh a partially consumed " "filament spool before printing and one may compare the measured weight with " @@ -11721,19 +13557,19 @@ msgstr "" "розрахунковою вагою філаменту з котушкою, щоб з’ясувати, чи достатньо " "кількості філаменту на котушці для закінчення друку." -#: src/libslic3r/PrintConfig.cpp:1084 +#: src/libslic3r/PrintConfig.cpp:1173 msgid "g" msgstr "г" -#: src/libslic3r/PrintConfig.cpp:1093 src/libslic3r/PrintConfig.cpp:3537 +#: src/libslic3r/PrintConfig.cpp:1182 src/libslic3r/PrintConfig.cpp:3814 msgid "(Unknown)" msgstr "(Невідомий)" -#: src/libslic3r/PrintConfig.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:1186 msgid "Fill angle" msgstr "Кут наповнення" -#: src/libslic3r/PrintConfig.cpp:1099 +#: src/libslic3r/PrintConfig.cpp:1188 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " @@ -11743,63 +13579,63 @@ msgstr "" "застосовуватися крос-штрих. Мости будуть заповнені, використовуючи найкращий " "напрям, який може виявити Slic3r, тому цей параметр на них не впливає." -#: src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1199 msgid "Fill density" msgstr "Щільність заповнення" -#: src/libslic3r/PrintConfig.cpp:1113 +#: src/libslic3r/PrintConfig.cpp:1201 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "Щільність внутрішнього заповнення, виражена в діапазоні 0% - 100%." -#: src/libslic3r/PrintConfig.cpp:1148 +#: src/libslic3r/PrintConfig.cpp:1224 msgid "Fill pattern" msgstr "Шаблон заповнення" -#: src/libslic3r/PrintConfig.cpp:1150 +#: src/libslic3r/PrintConfig.cpp:1226 msgid "Fill pattern for general low-density infill." msgstr "Шаблон заповнення для загального низько-швидкісного наповнення." -#: src/libslic3r/PrintConfig.cpp:1171 src/libslic3r/PrintConfig.cpp:2803 +#: src/libslic3r/PrintConfig.cpp:1230 src/libslic3r/PrintConfig.cpp:2822 msgid "Grid" msgstr "Сітка" -#: src/libslic3r/PrintConfig.cpp:1173 +#: src/libslic3r/PrintConfig.cpp:1232 msgid "Stars" msgstr "Зірки" -#: src/libslic3r/PrintConfig.cpp:1174 +#: src/libslic3r/PrintConfig.cpp:1233 msgid "Cubic" msgstr "Кубічний" -#: src/libslic3r/PrintConfig.cpp:1175 +#: src/libslic3r/PrintConfig.cpp:1234 msgid "Line" msgstr "Лінії" -#: src/libslic3r/PrintConfig.cpp:1177 src/libslic3r/PrintConfig.cpp:2756 +#: src/libslic3r/PrintConfig.cpp:1236 src/libslic3r/PrintConfig.cpp:2778 msgid "Honeycomb" msgstr "Стільниковий" -#: src/libslic3r/PrintConfig.cpp:1178 +#: src/libslic3r/PrintConfig.cpp:1237 msgid "3D Honeycomb" msgstr "3D стільник" -#: src/libslic3r/PrintConfig.cpp:1179 +#: src/libslic3r/PrintConfig.cpp:1238 msgid "Gyroid" msgstr "Гіроїд" -#: src/libslic3r/PrintConfig.cpp:1183 +#: src/libslic3r/PrintConfig.cpp:1242 msgid "Adaptive Cubic" msgstr "Адаптивний кубічний" -#: src/libslic3r/PrintConfig.cpp:1184 +#: src/libslic3r/PrintConfig.cpp:1243 msgid "Support Cubic" msgstr "Кубічна підтримка" -#: src/libslic3r/PrintConfig.cpp:1185 +#: src/libslic3r/PrintConfig.cpp:1244 msgid "Lightning" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1190 +#: src/libslic3r/PrintConfig.cpp:1250 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." @@ -11807,22 +13643,22 @@ msgstr "" "Це прискорення, яке ваш принтер використовуватиме для першого шару. " "Встановити 0, щоб вимкнути керування прискоренням для першого шару." -#: src/libslic3r/PrintConfig.cpp:1198 +#: src/libslic3r/PrintConfig.cpp:1258 msgid "First object layer over raft interface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1199 +#: src/libslic3r/PrintConfig.cpp:1259 msgid "" "This is the acceleration your printer will use for first layer of object " "above raft interface. Set zero to disable acceleration control for first " "layer of object above raft interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "First layer bed temperature" msgstr "Температура столу на першому шарі" -#: src/libslic3r/PrintConfig.cpp:1209 +#: src/libslic3r/PrintConfig.cpp:1269 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." @@ -11830,7 +13666,7 @@ msgstr "" "Температура підігрітої збірної пластини для першого шару. Установіть 0, щоб " "відключити команди керування температурою полотна на виході." -#: src/libslic3r/PrintConfig.cpp:1219 +#: src/libslic3r/PrintConfig.cpp:1279 msgid "" "Set this to a non-zero value to set a manual extrusion width for first " "layer. You can use this to force fatter extrudates for better adhesion. If " @@ -11843,18 +13679,18 @@ msgstr "" "(наприклад, 120%), вона буде обчислена за висотою першого шару. Якщо " "встановлено на 0 - використовуватиме стандартну ширину екструзії." -#: src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1293 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " "plates." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1301 msgid "First layer speed" msgstr "Швидкість першого шару" -#: src/libslic3r/PrintConfig.cpp:1242 +#: src/libslic3r/PrintConfig.cpp:1302 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " @@ -11865,11 +13701,11 @@ msgstr "" "вона виражена у відсотках (наприклад: 40%), вона буде масштабувати швидкість " "за замовчуванням." -#: src/libslic3r/PrintConfig.cpp:1252 +#: src/libslic3r/PrintConfig.cpp:1312 msgid "Speed of object first layer over raft interface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1253 +#: src/libslic3r/PrintConfig.cpp:1313 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first object layer above raft interface, regardless " @@ -11877,11 +13713,11 @@ msgid "" "the default speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1263 +#: src/libslic3r/PrintConfig.cpp:1323 msgid "First layer nozzle temperature" msgstr "Температура сопла на першому шарі" -#: src/libslic3r/PrintConfig.cpp:1264 +#: src/libslic3r/PrintConfig.cpp:1324 msgid "" "Nozzle temperature for the first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " @@ -11891,11 +13727,11 @@ msgstr "" "вручну під час друку, встановіть її на нуль, щоб вимкнути команди контролю " "температури у вихідному G-коді." -#: src/libslic3r/PrintConfig.cpp:1272 +#: src/libslic3r/PrintConfig.cpp:1332 msgid "Full fan speed at layer" msgstr "Повна швидкість вентилятора на шарі" -#: src/libslic3r/PrintConfig.cpp:1273 +#: src/libslic3r/PrintConfig.cpp:1333 msgid "" "Fan speed will be ramped up linearly from zero at layer " "\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". " @@ -11909,50 +13745,54 @@ msgstr "" "\"disable_fan_first_layers\", і в цьому випадку вентилятор буде працювати з " "максимально дозволеною швидкістю на рівні \"disable_fan_first_layers\" + 1." -#: src/libslic3r/PrintConfig.cpp:1285 +#: src/libslic3r/PrintConfig.cpp:1345 msgid "Fuzzy skin type." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1348 msgid "Outside walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1293 +#: src/libslic3r/PrintConfig.cpp:1349 msgid "All walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1298 +#: src/libslic3r/PrintConfig.cpp:1355 msgid "Fuzzy skin thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1300 +#: src/libslic3r/PrintConfig.cpp:1357 msgid "" "The maximum distance that each skin point can be offset (both ways), " "measured perpendicular to the perimeter wall." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1308 +#: src/libslic3r/PrintConfig.cpp:1365 msgid "Fuzzy skin point distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1310 +#: src/libslic3r/PrintConfig.cpp:1367 msgid "" "Perimeters will be split into multiple segments by inserting Fuzzy skin " "points. Lowering the Fuzzy skin point distance will increase the number of " "randomly offset points on the perimeter wall." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1318 +#: src/libslic3r/PrintConfig.cpp:1375 msgid "Fill gaps" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1320 +#: src/libslic3r/PrintConfig.cpp:1377 msgid "" "Enables filling of gaps between perimeters and between the inner most " "perimeters and infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1327 +#: src/libslic3r/PrintConfig.cpp:1382 +msgid "Gap fill" +msgstr "Заповнення розриву" + +#: src/libslic3r/PrintConfig.cpp:1384 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " @@ -11963,11 +13803,11 @@ msgstr "" "надмірних потрясінь та резонансних проблем. Встановити 0, щоб вимкнути " "заповнення розривів." -#: src/libslic3r/PrintConfig.cpp:1335 +#: src/libslic3r/PrintConfig.cpp:1392 msgid "Verbose G-code" msgstr "Докладний G-код" -#: src/libslic3r/PrintConfig.cpp:1336 +#: src/libslic3r/PrintConfig.cpp:1393 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " @@ -11977,11 +13817,11 @@ msgstr "" "пояснюється описовим текстом. Якщо ви друкуєте з SD-карти, додаткова вага " "файлу може призвести до уповільнення прошивки." -#: src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1400 msgid "G-code flavor" msgstr "Особливість G-коду" -#: src/libslic3r/PrintConfig.cpp:1344 +#: src/libslic3r/PrintConfig.cpp:1401 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " @@ -11993,15 +13833,15 @@ msgstr "" "отримати сумісний вихід. Наявність вибору \"Без екструзії\" захищаюсь " "PrusaSlicer від експорту взагалі будь-яких екструзійних значень." -#: src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1416 msgid "No extrusion" msgstr "Без екструзії" -#: src/libslic3r/PrintConfig.cpp:1376 +#: src/libslic3r/PrintConfig.cpp:1422 msgid "Label objects" msgstr "Маркувати об'єкти" -#: src/libslic3r/PrintConfig.cpp:1377 +#: src/libslic3r/PrintConfig.cpp:1423 msgid "" "Enable this to add comments into the G-Code labeling print moves with what " "object they belong to, which is useful for the Octoprint CancelObject " @@ -12013,19 +13853,19 @@ msgstr "" "налаштування НЕ сумісні з параметрами \"Мульти-матеріальний (ММ) друк з " "одним екструдером\" та \"Витирати в об'єкт\" / \"Витирати в заповнення\"." -#: src/libslic3r/PrintConfig.cpp:1384 +#: src/libslic3r/PrintConfig.cpp:1430 msgid "G-code substitutions" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1385 +#: src/libslic3r/PrintConfig.cpp:1431 msgid "Find / replace patterns in G-code lines and substitute them." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1390 +#: src/libslic3r/PrintConfig.cpp:1436 msgid "High extruder current on filament swap" msgstr "Звищення струму екструдера на заміні філамента" -#: src/libslic3r/PrintConfig.cpp:1391 +#: src/libslic3r/PrintConfig.cpp:1437 msgid "" "It may be beneficial to increase the extruder motor current during the " "filament exchange sequence to allow for rapid ramming feed rates and to " @@ -12035,7 +13875,7 @@ msgstr "" "філаменту, щоб забезпечити швидкий раммінг та подолати опір при заведенні " "філаменту з кінчиком потворної форми." -#: src/libslic3r/PrintConfig.cpp:1399 +#: src/libslic3r/PrintConfig.cpp:1445 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." @@ -12043,23 +13883,33 @@ msgstr "" "Це прискорення, яке ваш принтер використовуватиме для наповнення. Встановити " "0, щоб вимкнути регулятор прискорення для заповнення." -#: src/libslic3r/PrintConfig.cpp:1408 +#: src/libslic3r/PrintConfig.cpp:1453 src/libslic3r/PrintConfig.cpp:2423 +#: src/libslic3r/PrintConfig.cpp:2435 +msgid "Solid infill" +msgstr "Суцільне наповнення" + +#: src/libslic3r/PrintConfig.cpp:1454 msgid "" "This is the acceleration your printer will use for solid infill. Set zero to " "use the value for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:2977 +#: src/libslic3r/PrintConfig.cpp:2990 +msgid "Top solid infill" +msgstr "Верхнє суцільне наповнення" + +#: src/libslic3r/PrintConfig.cpp:1463 msgid "" "This is the acceleration your printer will use for top solid infill. Set " "zero to use the value for solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1426 +#: src/libslic3r/PrintConfig.cpp:1472 msgid "Combine infill every" msgstr "Об'єднати наповнення кожні" -#: src/libslic3r/PrintConfig.cpp:1428 +#: src/libslic3r/PrintConfig.cpp:1474 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." @@ -12067,15 +13917,15 @@ msgstr "" "Ця функція дозволяє поєднувати наповнення та прискорити друк, екструдуючи " "більш товсті шари наповнення, зберігаючи тонкі периметри, а отже, і точністю." -#: src/libslic3r/PrintConfig.cpp:1431 +#: src/libslic3r/PrintConfig.cpp:1477 msgid "Combine infill every n layers" msgstr "Об'єднати наповнення кожні n шарів" -#: src/libslic3r/PrintConfig.cpp:1437 +#: src/libslic3r/PrintConfig.cpp:1483 msgid "Length of the infill anchor" msgstr "Довжина якоря заповнення" -#: src/libslic3r/PrintConfig.cpp:1439 +#: src/libslic3r/PrintConfig.cpp:1485 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -12098,35 +13948,35 @@ msgstr "" "нуль, щоб вимкнути периметри закріплення, підключені до однієї лінії " "заповнення." -#: src/libslic3r/PrintConfig.cpp:1455 +#: src/libslic3r/PrintConfig.cpp:1495 msgid "0 (no open anchors)" msgstr "0 (без відкритих якорів)" -#: src/libslic3r/PrintConfig.cpp:1456 src/libslic3r/PrintConfig.cpp:1479 +#: src/libslic3r/PrintConfig.cpp:1496 src/libslic3r/PrintConfig.cpp:1519 msgid "1 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1457 src/libslic3r/PrintConfig.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:1520 msgid "2 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1458 src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1498 src/libslic3r/PrintConfig.cpp:1521 msgid "5 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1459 src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1499 src/libslic3r/PrintConfig.cpp:1522 msgid "10 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1460 src/libslic3r/PrintConfig.cpp:1483 +#: src/libslic3r/PrintConfig.cpp:1500 src/libslic3r/PrintConfig.cpp:1523 msgid "1000 (unlimited)" msgstr "1000 (необмежено)" -#: src/libslic3r/PrintConfig.cpp:1465 +#: src/libslic3r/PrintConfig.cpp:1506 msgid "Maximum length of the infill anchor" msgstr "Максимальна довжина якоря заповнення" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1508 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -12147,19 +13997,19 @@ msgstr "" "infill_anchor, але не довше за цей параметр. Встановіть для цього параметра " "нуль, щоб вимкнути закріплення." -#: src/libslic3r/PrintConfig.cpp:1478 +#: src/libslic3r/PrintConfig.cpp:1518 msgid "0 (not anchored)" msgstr "0 (не закріплено)" -#: src/libslic3r/PrintConfig.cpp:1488 +#: src/libslic3r/PrintConfig.cpp:1529 msgid "Infill extruder" msgstr "Наповнювач екструдера" -#: src/libslic3r/PrintConfig.cpp:1490 +#: src/libslic3r/PrintConfig.cpp:1531 msgid "The extruder to use when printing infill." msgstr "Екструдер, використовуваний під час друку наповнення." -#: src/libslic3r/PrintConfig.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:1539 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill. If " "left zero, default extrusion width will be used if set, otherwise 1.125 x " @@ -12174,11 +14024,11 @@ msgstr "" "прискорити наповнення та зміцнити свої деталі. Якщо він виражений у " "відсотках (наприклад, 90%), він буде обчислюватися за висотою шару." -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1550 msgid "Infill before perimeters" msgstr "Заповнення перед периметрами" -#: src/libslic3r/PrintConfig.cpp:1510 +#: src/libslic3r/PrintConfig.cpp:1551 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." @@ -12186,11 +14036,11 @@ msgstr "" "За допомогою цього параметра можна буде змінити порядок друку периметрів та " "наповнювачів, зробивши останнє першим." -#: src/libslic3r/PrintConfig.cpp:1515 +#: src/libslic3r/PrintConfig.cpp:1556 msgid "Only infill where needed" msgstr "Заповнити тільки там, де потрібно" -#: src/libslic3r/PrintConfig.cpp:1517 +#: src/libslic3r/PrintConfig.cpp:1558 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " @@ -12200,11 +14050,11 @@ msgstr "" "стель (це буде діяти як внутрішній матеріал підтримки). Якщо це ввімкнено, " "сповільнюється генерація G-коду через декілька перевірок." -#: src/libslic3r/PrintConfig.cpp:1524 +#: src/libslic3r/PrintConfig.cpp:1565 msgid "Infill/perimeters overlap" msgstr "Перекриття наповнення/периметрів" -#: src/libslic3r/PrintConfig.cpp:1526 +#: src/libslic3r/PrintConfig.cpp:1567 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -12216,25 +14066,25 @@ msgstr "" "може спричинити розриви. Якщо він виражений у відсотках (приклад: 15%), його " "розраховують за шириною екструзії по периметру." -#: src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "" "Швидкість друку внутрішнього заповнення. Встановити 0 для автоматичного " "обчислення." -#: src/libslic3r/PrintConfig.cpp:1545 +#: src/libslic3r/PrintConfig.cpp:1586 msgid "Inherits profile" msgstr "Успадковує профіль" -#: src/libslic3r/PrintConfig.cpp:1546 +#: src/libslic3r/PrintConfig.cpp:1587 msgid "Name of the profile, from which this profile inherits." msgstr "Ім'я профілю, від якого цей профіль успадковується." -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1600 msgid "Interface shells" msgstr "Інтерфейсні оболонки" -#: src/libslic3r/PrintConfig.cpp:1560 +#: src/libslic3r/PrintConfig.cpp:1601 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " @@ -12244,63 +14094,63 @@ msgstr "" "Корисно для друку з багатьма екструдерами з напівпрозорими матеріалами або " "ручним розчинним матеріалом для підтримки." -#: src/libslic3r/PrintConfig.cpp:1568 +#: src/libslic3r/PrintConfig.cpp:1609 msgid "Maximum width of a segmented region" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1569 +#: src/libslic3r/PrintConfig.cpp:1610 msgid "Maximum width of a segmented region. Zero disables this feature." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1570 src/libslic3r/PrintConfig.cpp:2189 -#: src/libslic3r/PrintConfig.cpp:2198 +#: src/libslic3r/PrintConfig.cpp:1611 src/libslic3r/PrintConfig.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2228 msgid "mm (zero to disable)" msgstr "мм (0, щоб вимкнути)" -#: src/libslic3r/PrintConfig.cpp:1577 +#: src/libslic3r/PrintConfig.cpp:1618 msgid "Enable ironing" msgstr "Увімкнути прасування" -#: src/libslic3r/PrintConfig.cpp:1578 +#: src/libslic3r/PrintConfig.cpp:1619 msgid "" "Enable ironing of the top layers with the hot print head for smooth surface" msgstr "" "Для гладкої поверхні увімкніть прасування верхніх шарів гарячою друкуючою " "головкою" -#: src/libslic3r/PrintConfig.cpp:1584 src/libslic3r/PrintConfig.cpp:1586 +#: src/libslic3r/PrintConfig.cpp:1625 src/libslic3r/PrintConfig.cpp:1627 msgid "Ironing Type" msgstr "Тип прасування" -#: src/libslic3r/PrintConfig.cpp:1591 +#: src/libslic3r/PrintConfig.cpp:1629 msgid "All top surfaces" msgstr "Всі верхні поверхні" -#: src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Topmost surface only" msgstr "Тільки верхня поверхня" -#: src/libslic3r/PrintConfig.cpp:1593 +#: src/libslic3r/PrintConfig.cpp:1631 msgid "All solid surfaces" msgstr "Всі тверді поверхні" -#: src/libslic3r/PrintConfig.cpp:1598 +#: src/libslic3r/PrintConfig.cpp:1637 msgid "Flow rate" msgstr "Швидкість потоку" -#: src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Percent of a flow rate relative to object's normal layer height." msgstr "Відсоток швидкість потоку відносно нормальної висоти шару об'єкта." -#: src/libslic3r/PrintConfig.cpp:1608 +#: src/libslic3r/PrintConfig.cpp:1647 msgid "Spacing between ironing passes" msgstr "Відстань між лініями прасування" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1649 msgid "Distance between ironing lines" msgstr "Відстань між прасувальними лініями" -#: src/libslic3r/PrintConfig.cpp:1627 +#: src/libslic3r/PrintConfig.cpp:1666 msgid "" "This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can " @@ -12312,11 +14162,11 @@ msgstr "" "Зауважте, що ви можете використовувати шаблонні змінні для всіх параметрів " "Slic3r, а також [layer_num] і [layer_z]." -#: src/libslic3r/PrintConfig.cpp:1638 +#: src/libslic3r/PrintConfig.cpp:1677 msgid "Supports remaining times" msgstr "Підтримує час, що залишився" -#: src/libslic3r/PrintConfig.cpp:1639 +#: src/libslic3r/PrintConfig.cpp:1678 msgid "" "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " "intervals into the G-code to let the firmware show accurate remaining time. " @@ -12328,155 +14178,155 @@ msgstr "" "залишився. На сьогоднішній день лише прошивка Prusa i3 MK3 розпізнає M73. " "Також прошивка i3 MK3 підтримує M73 Qxx Sxx для тихого режиму." -#: src/libslic3r/PrintConfig.cpp:1647 +#: src/libslic3r/PrintConfig.cpp:1686 msgid "Supports stealth mode" msgstr "Підтримує тихий режим" -#: src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1687 msgid "The firmware supports stealth mode" msgstr "Прошивка підтримує тихий режим" -#: src/libslic3r/PrintConfig.cpp:1653 +#: src/libslic3r/PrintConfig.cpp:1692 msgid "How to apply limits" msgstr "Як застосовувати обмеження" -#: src/libslic3r/PrintConfig.cpp:1654 +#: src/libslic3r/PrintConfig.cpp:1693 msgid "Purpose of Machine Limits" msgstr "Призначення механічних обмежень" -#: src/libslic3r/PrintConfig.cpp:1656 +#: src/libslic3r/PrintConfig.cpp:1695 msgid "How to apply the Machine Limits" msgstr "Призначення механічних обмежень" -#: src/libslic3r/PrintConfig.cpp:1661 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "Emit to G-code" msgstr "Публікувати в G-код" -#: src/libslic3r/PrintConfig.cpp:1662 +#: src/libslic3r/PrintConfig.cpp:1698 msgid "Use for time estimate" msgstr "Для оцінки часу" -#: src/libslic3r/PrintConfig.cpp:1663 +#: src/libslic3r/PrintConfig.cpp:1699 msgid "Ignore" msgstr "Ігнорувати" -#: src/libslic3r/PrintConfig.cpp:1686 +#: src/libslic3r/PrintConfig.cpp:1723 msgid "Maximum feedrate X" msgstr "Максимальна швидкість подачі за X" -#: src/libslic3r/PrintConfig.cpp:1687 +#: src/libslic3r/PrintConfig.cpp:1724 msgid "Maximum feedrate Y" msgstr "Максимальна швидкість подачі за Y" -#: src/libslic3r/PrintConfig.cpp:1688 +#: src/libslic3r/PrintConfig.cpp:1725 msgid "Maximum feedrate Z" msgstr "Максимальна швидкість подачі за Y" -#: src/libslic3r/PrintConfig.cpp:1689 +#: src/libslic3r/PrintConfig.cpp:1726 msgid "Maximum feedrate E" msgstr "Максимальна швидкість подачі за Е" -#: src/libslic3r/PrintConfig.cpp:1692 +#: src/libslic3r/PrintConfig.cpp:1729 msgid "Maximum feedrate of the X axis" msgstr "Максимальна швидкість подачі за віссю X" -#: src/libslic3r/PrintConfig.cpp:1693 +#: src/libslic3r/PrintConfig.cpp:1730 msgid "Maximum feedrate of the Y axis" msgstr "Максимальна швидкість подачі за віссю Y" -#: src/libslic3r/PrintConfig.cpp:1694 +#: src/libslic3r/PrintConfig.cpp:1731 msgid "Maximum feedrate of the Z axis" msgstr "Максимальна швидкість подачі за віссю Z" -#: src/libslic3r/PrintConfig.cpp:1695 +#: src/libslic3r/PrintConfig.cpp:1732 msgid "Maximum feedrate of the E axis" msgstr "Максимальна швидкість подачі за віссю Е" -#: src/libslic3r/PrintConfig.cpp:1703 +#: src/libslic3r/PrintConfig.cpp:1740 msgid "Maximum acceleration X" msgstr "Максимальне прискорення X" -#: src/libslic3r/PrintConfig.cpp:1704 +#: src/libslic3r/PrintConfig.cpp:1741 msgid "Maximum acceleration Y" msgstr "Максимальне прискорення Y" -#: src/libslic3r/PrintConfig.cpp:1705 +#: src/libslic3r/PrintConfig.cpp:1742 msgid "Maximum acceleration Z" msgstr "Максимальне прискорення Z" -#: src/libslic3r/PrintConfig.cpp:1706 +#: src/libslic3r/PrintConfig.cpp:1743 msgid "Maximum acceleration E" msgstr "Максимальне прискорення E" -#: src/libslic3r/PrintConfig.cpp:1709 +#: src/libslic3r/PrintConfig.cpp:1746 msgid "Maximum acceleration of the X axis" msgstr "Максимальне прискорення за віссю X" -#: src/libslic3r/PrintConfig.cpp:1710 +#: src/libslic3r/PrintConfig.cpp:1747 msgid "Maximum acceleration of the Y axis" msgstr "Максимальне прискорення за віссю Y" -#: src/libslic3r/PrintConfig.cpp:1711 +#: src/libslic3r/PrintConfig.cpp:1748 msgid "Maximum acceleration of the Z axis" msgstr "Максимальне прискорення за віссю Z" -#: src/libslic3r/PrintConfig.cpp:1712 +#: src/libslic3r/PrintConfig.cpp:1749 msgid "Maximum acceleration of the E axis" msgstr "Максимальне прискорення за віссю E" -#: src/libslic3r/PrintConfig.cpp:1720 +#: src/libslic3r/PrintConfig.cpp:1757 msgid "Maximum jerk X" msgstr "Максимальний ривок за X" -#: src/libslic3r/PrintConfig.cpp:1721 +#: src/libslic3r/PrintConfig.cpp:1758 msgid "Maximum jerk Y" msgstr "Максимальний ривок за Y" -#: src/libslic3r/PrintConfig.cpp:1722 +#: src/libslic3r/PrintConfig.cpp:1759 msgid "Maximum jerk Z" msgstr "Максимальний ривок за Z" -#: src/libslic3r/PrintConfig.cpp:1723 +#: src/libslic3r/PrintConfig.cpp:1760 msgid "Maximum jerk E" msgstr "Максимальний ривок за E" -#: src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:1763 msgid "Maximum jerk of the X axis" msgstr "Максимальний ривок за віссю X" -#: src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1764 msgid "Maximum jerk of the Y axis" msgstr "Максимальний ривок за віссю Y" -#: src/libslic3r/PrintConfig.cpp:1728 +#: src/libslic3r/PrintConfig.cpp:1765 msgid "Maximum jerk of the Z axis" msgstr "Максимальний ривок за віссю Z" -#: src/libslic3r/PrintConfig.cpp:1729 +#: src/libslic3r/PrintConfig.cpp:1766 msgid "Maximum jerk of the E axis" msgstr "Максимальний ривок за віссю E" -#: src/libslic3r/PrintConfig.cpp:1739 +#: src/libslic3r/PrintConfig.cpp:1776 msgid "Minimum feedrate when extruding" msgstr "Мінімальне прискорення при екструзії" -#: src/libslic3r/PrintConfig.cpp:1741 +#: src/libslic3r/PrintConfig.cpp:1778 msgid "Minimum feedrate when extruding (M205 S)" msgstr "Мінімальне прискорення при екструзії (M205 S)" -#: src/libslic3r/PrintConfig.cpp:1749 +#: src/libslic3r/PrintConfig.cpp:1786 msgid "Minimum travel feedrate" msgstr "Мінімальна швидкість подачі" -#: src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:1788 msgid "Minimum travel feedrate (M205 T)" msgstr "Мінімальна швидкість подачі (M205 T)" -#: src/libslic3r/PrintConfig.cpp:1759 +#: src/libslic3r/PrintConfig.cpp:1796 msgid "Maximum acceleration when extruding" msgstr "Максимальне прискорення при екструзії" -#: src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1798 msgid "" "Maximum acceleration when extruding (M204 P)\n" "\n" @@ -12484,31 +14334,31 @@ msgid "" "(M204 T)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1772 +#: src/libslic3r/PrintConfig.cpp:1809 msgid "Maximum acceleration when retracting" msgstr "Максимальне прискорення при втягуванні" -#: src/libslic3r/PrintConfig.cpp:1774 +#: src/libslic3r/PrintConfig.cpp:1811 msgid "Maximum acceleration when retracting (M204 R)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1782 +#: src/libslic3r/PrintConfig.cpp:1819 msgid "Maximum acceleration for travel moves" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1784 +#: src/libslic3r/PrintConfig.cpp:1821 msgid "Maximum acceleration for travel moves (M204 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1791 src/libslic3r/PrintConfig.cpp:1800 +#: src/libslic3r/PrintConfig.cpp:1828 src/libslic3r/PrintConfig.cpp:1837 msgid "Max" msgstr "Максимально" -#: src/libslic3r/PrintConfig.cpp:1792 +#: src/libslic3r/PrintConfig.cpp:1829 msgid "This setting represents the maximum speed of your fan." msgstr "Цей параметр відображає максимальну швидкість вашого вентилятора." -#: src/libslic3r/PrintConfig.cpp:1801 +#: src/libslic3r/PrintConfig.cpp:1838 msgid "" "This is the highest printable layer height for this extruder, used to cap " "the variable layer height and support layer height. Maximum recommended " @@ -12521,11 +14371,11 @@ msgstr "" "для досягнення розумної міжшарової адгезії. Якщо встановлено 0, висота шару " "обмежена 75% діаметра сопла." -#: src/libslic3r/PrintConfig.cpp:1811 +#: src/libslic3r/PrintConfig.cpp:1848 msgid "Max print speed" msgstr "Максимальна швидкість друку" -#: src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1849 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " @@ -12536,7 +14386,7 @@ msgstr "" "екструдера. Цей експериментальний параметр використовується для встановлення " "максимальної швидкості друку, яку ви хочете дозволити." -#: src/libslic3r/PrintConfig.cpp:1822 +#: src/libslic3r/PrintConfig.cpp:1859 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." @@ -12544,11 +14394,11 @@ msgstr "" "Цей експериментальний параметр використовується для встановлення " "максимальної об'ємної швидкості, яку підтримує екструдер." -#: src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1867 msgid "Max volumetric slope positive" msgstr "Максимальний об'ємний нахил позитивний" -#: src/libslic3r/PrintConfig.cpp:1831 +#: src/libslic3r/PrintConfig.cpp:1868 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from lower speed to higher speed. A value of 1.8 mm³/" @@ -12557,15 +14407,15 @@ msgid "" "(feedrate 60 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1836 src/libslic3r/PrintConfig.cpp:1848 +#: src/libslic3r/PrintConfig.cpp:1873 src/libslic3r/PrintConfig.cpp:1885 msgid "mm³/s²" msgstr "мм³/с²" -#: src/libslic3r/PrintConfig.cpp:1842 +#: src/libslic3r/PrintConfig.cpp:1879 msgid "Max volumetric slope negative" msgstr "Максимальний об'ємний схил негативний" -#: src/libslic3r/PrintConfig.cpp:1843 +#: src/libslic3r/PrintConfig.cpp:1880 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from higher speed to lower speed. A value of 1.8 mm³/" @@ -12574,17 +14424,17 @@ msgid "" "(feedrate 20 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1854 src/libslic3r/PrintConfig.cpp:1863 +#: src/libslic3r/PrintConfig.cpp:1891 src/libslic3r/PrintConfig.cpp:1900 msgid "Min" msgstr "Мінімально" -#: src/libslic3r/PrintConfig.cpp:1855 +#: src/libslic3r/PrintConfig.cpp:1892 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "" "Цей параметр відповідає мінімальній ШІМ, на якій повинен працювати ваш " "вентилятор." -#: src/libslic3r/PrintConfig.cpp:1864 +#: src/libslic3r/PrintConfig.cpp:1901 msgid "" "This is the lowest printable layer height for this extruder and limits the " "resolution for variable layer height. Typical values are between 0.05 mm and " @@ -12594,19 +14444,19 @@ msgstr "" "роздільну здатність для висоти змінного шару. Типові значення - від 0,05 мм " "до 0,1 мм." -#: src/libslic3r/PrintConfig.cpp:1872 +#: src/libslic3r/PrintConfig.cpp:1909 msgid "Min print speed" msgstr "Мінімальна швидкість друку" -#: src/libslic3r/PrintConfig.cpp:1873 +#: src/libslic3r/PrintConfig.cpp:1910 msgid "Slic3r will not scale speed down below this speed." msgstr "Slic3r не буде масштабувати швидкість нижче цієї швидкості." -#: src/libslic3r/PrintConfig.cpp:1880 +#: src/libslic3r/PrintConfig.cpp:1917 msgid "Minimal filament extrusion length" msgstr "Мінімальна довжина екструзії філаменту" -#: src/libslic3r/PrintConfig.cpp:1881 +#: src/libslic3r/PrintConfig.cpp:1918 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " @@ -12616,11 +14466,11 @@ msgstr "" "зазначеної кількості філаменту на нижньому шарі. Для машин із декількома " "екструдерами цей мінімум застосовується до кожного екструдера." -#: src/libslic3r/PrintConfig.cpp:1890 +#: src/libslic3r/PrintConfig.cpp:1927 msgid "Configuration notes" msgstr "Примітки до конфігурації" -#: src/libslic3r/PrintConfig.cpp:1891 +#: src/libslic3r/PrintConfig.cpp:1928 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." @@ -12628,16 +14478,16 @@ msgstr "" "Ви можете додати тут свої особисті примітки. Цей текст буде додано до " "коментарів заголовка G-коду." -#: src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:1938 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "Це діаметр сопла вашого екструдера (наприклад: 0.5, 0.35 тощо)" -#: src/libslic3r/PrintConfig.cpp:1906 +#: src/libslic3r/PrintConfig.cpp:1943 msgid "Host Type" msgstr "Тип хосту" -#: src/libslic3r/PrintConfig.cpp:1907 +#: src/libslic3r/PrintConfig.cpp:1944 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." @@ -12645,11 +14495,11 @@ msgstr "" "Slic3r може завантажувати файли G-коду на хост принтера. Це поле повинно " "містити тип хоста." -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:1961 msgid "Only retract when crossing perimeters" msgstr "Перервати тільки у разі перетину периметрів" -#: src/libslic3r/PrintConfig.cpp:1930 +#: src/libslic3r/PrintConfig.cpp:1962 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." @@ -12657,21 +14507,17 @@ msgstr "" "Вимикає переривання, коли шлях не перевищує периметри верхніх шарів (і, " "таким чином, будь-який розрядник буде, мабуть, невидимим)." -#: src/libslic3r/PrintConfig.cpp:1937 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "" "This option will drop the temperature of the inactive extruders to prevent " -"oozing. It will enable a tall skirt automatically and move extruders outside " -"such skirt when changing temperatures." +"oozing. " msgstr "" -"Цей параметр знизить температуру неактивних екструдерів, щоб запобігти " -"протіканню. Це дозволить автоматично ввімкнути високий плінтус та " -"перемістить екструдери за межі такого плінтуса у разі зміни температури." -#: src/libslic3r/PrintConfig.cpp:1944 +#: src/libslic3r/PrintConfig.cpp:1974 msgid "Output filename format" msgstr "Формат вихідного файлу" -#: src/libslic3r/PrintConfig.cpp:1945 +#: src/libslic3r/PrintConfig.cpp:1975 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -12683,11 +14529,11 @@ msgstr "" "можете використовувати [timestamp], [year], [month], [day], [hour], " "[minute], [second], [version], [input_filename] ], [input_filename_base]." -#: src/libslic3r/PrintConfig.cpp:1954 +#: src/libslic3r/PrintConfig.cpp:1984 msgid "Detect bridging perimeters" msgstr "Виявлення висячих периметрів" -#: src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:1986 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." @@ -12696,11 +14542,11 @@ msgstr "" "використано мостовий потік), щоб застосувати до них швидкість мосту та " "увімкнути вентилятор." -#: src/libslic3r/PrintConfig.cpp:1962 +#: src/libslic3r/PrintConfig.cpp:1992 msgid "Filament parking position" msgstr "Позиція паркування філаменту" -#: src/libslic3r/PrintConfig.cpp:1963 +#: src/libslic3r/PrintConfig.cpp:1993 msgid "" "Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware." @@ -12708,11 +14554,11 @@ msgstr "" "Відстань наконечника екструдера від місця паркування філаменту при " "виведенні. Це має відповідати значенню в мікропрограмі принтера." -#: src/libslic3r/PrintConfig.cpp:1971 +#: src/libslic3r/PrintConfig.cpp:2001 msgid "Extra loading distance" msgstr "Додаткова відстань заведення" -#: src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:2002 msgid "" "When set to zero, the distance the filament is moved from parking position " "during load is exactly the same as it was moved back during unload. When " @@ -12724,12 +14570,12 @@ msgstr "" "назад під час виведення. Якщо позитивне, воно заводеться далі, якщо " "негативне, рух заведення коротший, ніж виведення." -#: src/libslic3r/PrintConfig.cpp:1980 src/libslic3r/PrintConfig.cpp:2005 -#: src/libslic3r/PrintConfig.cpp:2019 src/libslic3r/PrintConfig.cpp:2029 +#: src/libslic3r/PrintConfig.cpp:2010 src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2049 src/libslic3r/PrintConfig.cpp:2059 msgid "Perimeters" msgstr "Периметри" -#: src/libslic3r/PrintConfig.cpp:1981 +#: src/libslic3r/PrintConfig.cpp:2011 msgid "" "This is the acceleration your printer will use for perimeters. Set zero to " "disable acceleration control for perimeters." @@ -12737,24 +14583,24 @@ msgstr "" "Це прискорення, яке ваш принтер використовуватиме для периметрів. Встановити " "0, щоб відключити управління прискоренням для периметрів." -#: src/libslic3r/PrintConfig.cpp:1989 +#: src/libslic3r/PrintConfig.cpp:2019 msgid "" "This is the acceleration your printer will use for external perimeters. Set " "zero to use the value for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1996 +#: src/libslic3r/PrintConfig.cpp:2026 msgid "Perimeter extruder" msgstr "Екструдер периметру" -#: src/libslic3r/PrintConfig.cpp:1998 +#: src/libslic3r/PrintConfig.cpp:2028 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" "Екструдер, що використовується при друці периметрів і краю. Перший екструдер " "- 1." -#: src/libslic3r/PrintConfig.cpp:2007 +#: src/libslic3r/PrintConfig.cpp:2037 msgid "" "Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. If " @@ -12769,14 +14615,14 @@ msgstr "" "діаметр сопла. Якщо він виражений у відсотках (наприклад, 200%), він буде " "обчислюватися за висотою шару." -#: src/libslic3r/PrintConfig.cpp:2021 +#: src/libslic3r/PrintConfig.cpp:2051 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "" "Швидкість для периметрів (контури, вертикальні оболонки). Встановити 0 для " "автоматичного використання." -#: src/libslic3r/PrintConfig.cpp:2031 +#: src/libslic3r/PrintConfig.cpp:2061 msgid "" "This option sets the number of perimeters to generate for each layer. Note " "that Slic3r may increase this number automatically when it detects sloping " @@ -12788,11 +14634,11 @@ msgstr "" "які отримують вигоду від більшої кількості периметрів, якщо опція «Додаткові " "периметри» увімкнена." -#: src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2065 msgid "(minimum)" msgstr "(мінімум)" -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "" "If you want to process the output G-code through custom scripts, just list " "their absolute paths here. Separate multiple scripts with a semicolon. " @@ -12806,35 +14652,35 @@ msgstr "" "аргумент, і вони можуть отримати доступ до параметрів конфігурації Slic3r, " "прочитавши змінні середовища." -#: src/libslic3r/PrintConfig.cpp:2055 +#: src/libslic3r/PrintConfig.cpp:2085 msgid "Printer type" msgstr "Тип принтеру" -#: src/libslic3r/PrintConfig.cpp:2056 +#: src/libslic3r/PrintConfig.cpp:2086 msgid "Type of the printer." msgstr "Тип принтеру." -#: src/libslic3r/PrintConfig.cpp:2061 +#: src/libslic3r/PrintConfig.cpp:2091 msgid "Printer notes" msgstr "Примітки принтера" -#: src/libslic3r/PrintConfig.cpp:2062 +#: src/libslic3r/PrintConfig.cpp:2092 msgid "You can put your notes regarding the printer here." msgstr "Тут ви можете помістити свої нотатки щодо принтера." -#: src/libslic3r/PrintConfig.cpp:2070 +#: src/libslic3r/PrintConfig.cpp:2100 msgid "Printer vendor" msgstr "Виробник принтера" -#: src/libslic3r/PrintConfig.cpp:2071 +#: src/libslic3r/PrintConfig.cpp:2101 msgid "Name of the printer vendor." msgstr "Назва виробника принтера." -#: src/libslic3r/PrintConfig.cpp:2076 +#: src/libslic3r/PrintConfig.cpp:2106 msgid "Printer variant" msgstr "Варіант принтера" -#: src/libslic3r/PrintConfig.cpp:2077 +#: src/libslic3r/PrintConfig.cpp:2107 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." @@ -12842,46 +14688,46 @@ msgstr "" "Назва варіанту принтера. Наприклад, варіанти принтера можуть відрізнятися за " "діаметром сопла." -#: src/libslic3r/PrintConfig.cpp:2094 +#: src/libslic3r/PrintConfig.cpp:2124 msgid "Raft contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2096 +#: src/libslic3r/PrintConfig.cpp:2126 msgid "" "The vertical distance between object and raft. Ignored for soluble interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2103 +#: src/libslic3r/PrintConfig.cpp:2133 msgid "Raft expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2105 +#: src/libslic3r/PrintConfig.cpp:2135 msgid "Expansion of the raft in XY plane for better stability." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:2142 msgid "First layer density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2114 +#: src/libslic3r/PrintConfig.cpp:2144 msgid "Density of the first raft or support layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2122 +#: src/libslic3r/PrintConfig.cpp:2152 msgid "First layer expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2124 +#: src/libslic3r/PrintConfig.cpp:2154 msgid "" "Expansion of the first raft or support layer to improve adhesion to print " "bed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2131 +#: src/libslic3r/PrintConfig.cpp:2161 msgid "Raft layers" msgstr "Плоскі шари" -#: src/libslic3r/PrintConfig.cpp:2133 +#: src/libslic3r/PrintConfig.cpp:2163 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." @@ -12889,11 +14735,11 @@ msgstr "" "Об'єкт буде піднятий цією кількістю шарів, і під ним буде згенерований " "матеріал підтримки." -#: src/libslic3r/PrintConfig.cpp:2141 +#: src/libslic3r/PrintConfig.cpp:2171 msgid "Slice resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2142 +#: src/libslic3r/PrintConfig.cpp:2172 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -12907,11 +14753,11 @@ msgstr "" "вимкнути будь-яке спрощення та використовувати повну роздільну здатність від " "введення." -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:2182 msgid "G-code resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2153 +#: src/libslic3r/PrintConfig.cpp:2183 msgid "" "Maximum deviation of exported G-code paths from their full resolution " "counterparts. Very high resolution G-code requires huge amount of RAM to " @@ -12922,20 +14768,20 @@ msgid "" "produced." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2164 +#: src/libslic3r/PrintConfig.cpp:2194 msgid "Minimum travel after retraction" msgstr "Мінімальне переміщення після переривання" -#: src/libslic3r/PrintConfig.cpp:2165 +#: src/libslic3r/PrintConfig.cpp:2195 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "Переривання не спрацьовує, коли переміщення коротше за цю довжину." -#: src/libslic3r/PrintConfig.cpp:2171 +#: src/libslic3r/PrintConfig.cpp:2201 msgid "Retract amount before wipe" msgstr "Кількість переривань перед чищенням" -#: src/libslic3r/PrintConfig.cpp:2172 +#: src/libslic3r/PrintConfig.cpp:2202 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." @@ -12943,25 +14789,25 @@ msgstr "" "Завдяки екструдерам з бандами, має зміст зробити певну кількість переривань " "перед рухами очищення." -#: src/libslic3r/PrintConfig.cpp:2179 +#: src/libslic3r/PrintConfig.cpp:2209 msgid "Retract on layer change" msgstr "Переривання на зміну шарів" -#: src/libslic3r/PrintConfig.cpp:2180 +#: src/libslic3r/PrintConfig.cpp:2210 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "" "Цей прапор забезпечує переривання кожного разу, коли виконується переміщення " "Z." -#: src/libslic3r/PrintConfig.cpp:2185 src/libslic3r/PrintConfig.cpp:2193 +#: src/libslic3r/PrintConfig.cpp:2215 src/libslic3r/PrintConfig.cpp:2223 msgid "Length" msgstr "Довжина" -#: src/libslic3r/PrintConfig.cpp:2186 +#: src/libslic3r/PrintConfig.cpp:2216 msgid "Retraction Length" msgstr "Довжина переривання" -#: src/libslic3r/PrintConfig.cpp:2187 +#: src/libslic3r/PrintConfig.cpp:2217 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " @@ -12971,11 +14817,11 @@ msgstr "" "кількості (довжина вимірюється на сирого філаменту перед тим, як вона " "надходить у екструдер)." -#: src/libslic3r/PrintConfig.cpp:2194 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Retraction Length (Toolchange)" msgstr "Довжина переривання (зміна інструмента)" -#: src/libslic3r/PrintConfig.cpp:2195 +#: src/libslic3r/PrintConfig.cpp:2225 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " @@ -12985,11 +14831,11 @@ msgstr "" "назад до вказаної кількості (довжина вимірюється на сирого філаменту перед " "тим, як вона надходить у екструдер)." -#: src/libslic3r/PrintConfig.cpp:2203 +#: src/libslic3r/PrintConfig.cpp:2233 msgid "Lift Z" msgstr "Підняти Z" -#: src/libslic3r/PrintConfig.cpp:2204 +#: src/libslic3r/PrintConfig.cpp:2234 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " @@ -12999,15 +14845,15 @@ msgstr "" "коли спрацьовує переривання. При використанні декількох екструдерів буде " "розглянуто налаштування лише першого екструдера." -#: src/libslic3r/PrintConfig.cpp:2211 +#: src/libslic3r/PrintConfig.cpp:2241 msgid "Above Z" msgstr "Вище Z" -#: src/libslic3r/PrintConfig.cpp:2212 +#: src/libslic3r/PrintConfig.cpp:2242 msgid "Only lift Z above" msgstr "Тільки піднімати Z" -#: src/libslic3r/PrintConfig.cpp:2213 +#: src/libslic3r/PrintConfig.cpp:2243 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " @@ -13017,15 +14863,15 @@ msgstr "" "вказаним абсолютним Z. Ви можете налаштувати цей параметр так, що підняття " "буде пропускатися на перших шарах." -#: src/libslic3r/PrintConfig.cpp:2220 +#: src/libslic3r/PrintConfig.cpp:2250 msgid "Below Z" msgstr "Нижче Z" -#: src/libslic3r/PrintConfig.cpp:2221 +#: src/libslic3r/PrintConfig.cpp:2251 msgid "Only lift Z below" msgstr "Тільки опускати Z" -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2252 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " @@ -13035,11 +14881,11 @@ msgstr "" "вказаного абсолютного Z. Ви можете налаштувати цей параметр так, що підняття " "буде обмежене на перших шарах." -#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2238 +#: src/libslic3r/PrintConfig.cpp:2260 src/libslic3r/PrintConfig.cpp:2268 msgid "Extra length on restart" msgstr "Додаткова довжина при перезапуску" -#: src/libslic3r/PrintConfig.cpp:2231 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." @@ -13047,7 +14893,7 @@ msgstr "" "Коли переривання компенсується після руху переміщення, екструдер буде " "проштовхувати цю додаткову кількість філамента. Цей параметр рідко потрібний." -#: src/libslic3r/PrintConfig.cpp:2239 +#: src/libslic3r/PrintConfig.cpp:2269 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." @@ -13055,19 +14901,19 @@ msgstr "" "Коли переривання компенсується після зміни інструмента, екструдер буде " "проштовхувати цю додаткову кількість філамента." -#: src/libslic3r/PrintConfig.cpp:2246 src/libslic3r/PrintConfig.cpp:2247 +#: src/libslic3r/PrintConfig.cpp:2276 src/libslic3r/PrintConfig.cpp:2277 msgid "Retraction Speed" msgstr "Швидкість переривання" -#: src/libslic3r/PrintConfig.cpp:2248 +#: src/libslic3r/PrintConfig.cpp:2278 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "Швидкість переривання (це стосується лише двигуна екструдера)." -#: src/libslic3r/PrintConfig.cpp:2254 src/libslic3r/PrintConfig.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:2284 src/libslic3r/PrintConfig.cpp:2285 msgid "Deretraction Speed" msgstr "Швидкість після-переривання" -#: src/libslic3r/PrintConfig.cpp:2256 +#: src/libslic3r/PrintConfig.cpp:2286 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " @@ -13077,68 +14923,82 @@ msgstr "" "лише двигуна екструдера ). Якщо залишити 0, використовується швидкість " "переривання ." -#: src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2293 msgid "Seam position" msgstr "Позиція шва" -#: src/libslic3r/PrintConfig.cpp:2265 +#: src/libslic3r/PrintConfig.cpp:2295 msgid "Position of perimeters starting points." msgstr "Позиція стартових точок периметра." -#: src/libslic3r/PrintConfig.cpp:2272 +#: src/libslic3r/PrintConfig.cpp:2297 +msgid "Random" +msgstr "Випадкова" + +#: src/libslic3r/PrintConfig.cpp:2298 msgid "Nearest" msgstr "Найближча" -#: src/libslic3r/PrintConfig.cpp:2273 +#: src/libslic3r/PrintConfig.cpp:2299 msgid "Aligned" msgstr "Вирівняно" -#: src/libslic3r/PrintConfig.cpp:2281 +#: src/libslic3r/PrintConfig.cpp:2306 +msgid "Staggered inner seams" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2307 +msgid "" +"This option causes the inner seams to be shifted backwards based on their " +"depth, forming a zigzag pattern." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2314 msgid "Direction" msgstr "Напрямок" -#: src/libslic3r/PrintConfig.cpp:2283 +#: src/libslic3r/PrintConfig.cpp:2316 msgid "Preferred direction of the seam" msgstr "Бажаний напрямок шва" -#: src/libslic3r/PrintConfig.cpp:2284 +#: src/libslic3r/PrintConfig.cpp:2317 msgid "Seam preferred direction" msgstr "Бажаний напрямок шва" -#: src/libslic3r/PrintConfig.cpp:2291 +#: src/libslic3r/PrintConfig.cpp:2324 msgid "Jitter" msgstr "Джиттер" -#: src/libslic3r/PrintConfig.cpp:2293 +#: src/libslic3r/PrintConfig.cpp:2326 msgid "Seam preferred direction jitter" msgstr "Бажаний напрямок шва джитера" -#: src/libslic3r/PrintConfig.cpp:2294 +#: src/libslic3r/PrintConfig.cpp:2327 msgid "Preferred direction of the seam - jitter" msgstr "Бажаний напрямок шва - джитера" -#: src/libslic3r/PrintConfig.cpp:2301 +#: src/libslic3r/PrintConfig.cpp:2334 msgid "Distance from brim/object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2335 msgid "" "Distance between skirt and brim (when draft shield is not used) or objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2308 +#: src/libslic3r/PrintConfig.cpp:2341 msgid "Skirt height" msgstr "Висота плінтусу" -#: src/libslic3r/PrintConfig.cpp:2309 +#: src/libslic3r/PrintConfig.cpp:2342 msgid "Height of skirt expressed in layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2348 msgid "Draft shield" msgstr "Чорновий щит" -#: src/libslic3r/PrintConfig.cpp:2316 +#: src/libslic3r/PrintConfig.cpp:2349 msgid "" "With draft shield active, the skirt will be printed skirt_distance from the " "object, possibly intersecting brim.\n" @@ -13148,27 +15008,27 @@ msgid "" "from print bed due to wind draft." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2324 +#: src/libslic3r/PrintConfig.cpp:2354 msgid "Disabled" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2325 +#: src/libslic3r/PrintConfig.cpp:2355 msgid "Limited" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2326 +#: src/libslic3r/PrintConfig.cpp:2356 msgid "Enabled" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2331 +#: src/libslic3r/PrintConfig.cpp:2362 msgid "Loops (minimum)" msgstr "Петлі (мінімум)" -#: src/libslic3r/PrintConfig.cpp:2332 +#: src/libslic3r/PrintConfig.cpp:2363 msgid "Skirt Loops" msgstr "Петлі плінтусу" -#: src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2364 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " @@ -13178,11 +15038,11 @@ msgstr "" "довжина екструзії\", кількість петель може бути більшою, ніж налаштована " "тут. Установіть 0, щоб повністю вимкнути плінтус." -#: src/libslic3r/PrintConfig.cpp:2341 +#: src/libslic3r/PrintConfig.cpp:2372 msgid "Slow down if layer print time is below" msgstr "Уповільнення, якщо час друку шару нижче" -#: src/libslic3r/PrintConfig.cpp:2342 +#: src/libslic3r/PrintConfig.cpp:2373 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." @@ -13190,11 +15050,11 @@ msgstr "" "Якщо час друку шару оцінюється нижче цієї кількості секунд, швидкість друку " "рухів зменшуватиметься, щоб збільшити тривалість до цього значення." -#: src/libslic3r/PrintConfig.cpp:2351 +#: src/libslic3r/PrintConfig.cpp:2382 msgid "Small perimeters" msgstr "Маленькі периметри" -#: src/libslic3r/PrintConfig.cpp:2353 +#: src/libslic3r/PrintConfig.cpp:2384 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " @@ -13205,11 +15065,11 @@ msgstr "" "вона буде розрахована за наведеним вище параметром швидкості. Встановити 0 " "для автоматичного використання." -#: src/libslic3r/PrintConfig.cpp:2363 +#: src/libslic3r/PrintConfig.cpp:2394 msgid "Solid infill threshold area" msgstr "Порогова площа суцільного наповнення" -#: src/libslic3r/PrintConfig.cpp:2365 +#: src/libslic3r/PrintConfig.cpp:2396 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." @@ -13217,23 +15077,23 @@ msgstr "" "Встановити суцільне заповнення для регіонів, що мають площу, меншу " "зазначеного порогу." -#: src/libslic3r/PrintConfig.cpp:2366 +#: src/libslic3r/PrintConfig.cpp:2397 msgid "mm²" msgstr "мм²" -#: src/libslic3r/PrintConfig.cpp:2372 +#: src/libslic3r/PrintConfig.cpp:2403 msgid "Solid infill extruder" msgstr "Екструдер суцільних наповнень" -#: src/libslic3r/PrintConfig.cpp:2374 +#: src/libslic3r/PrintConfig.cpp:2405 msgid "The extruder to use when printing solid infill." msgstr "Екструдер для друку суцільних наповнень." -#: src/libslic3r/PrintConfig.cpp:2380 +#: src/libslic3r/PrintConfig.cpp:2411 msgid "Solid infill every" msgstr "Суцільне наповнення кожні" -#: src/libslic3r/PrintConfig.cpp:2382 +#: src/libslic3r/PrintConfig.cpp:2413 msgid "" "This feature allows to force a solid layer every given number of layers. " "Zero to disable. You can set this to any value (for example 9999); Slic3r " @@ -13245,7 +15105,7 @@ msgstr "" "Slic3r автоматично вибере максимально можливу кількість шарів для " "комбінування відповідно до діаметра сопла та висоти шару." -#: src/libslic3r/PrintConfig.cpp:2394 +#: src/libslic3r/PrintConfig.cpp:2425 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "solid surfaces. If left zero, default extrusion width will be used if set, " @@ -13258,7 +15118,7 @@ msgstr "" "діаметр сопла. Якщо він виражений у відсотках (наприклад, 90%), він буде " "обчислюватися за висотою шару." -#: src/libslic3r/PrintConfig.cpp:2406 +#: src/libslic3r/PrintConfig.cpp:2437 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " @@ -13269,20 +15129,20 @@ msgstr "" "швидкості заповнення за замовчуванням. Встановити 0 для автоматичного " "використання." -#: src/libslic3r/PrintConfig.cpp:2418 +#: src/libslic3r/PrintConfig.cpp:2449 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "" "Кількість суцільних шарів для генерування на верхній і нижній поверхні." -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2455 src/libslic3r/PrintConfig.cpp:2456 msgid "Minimum thickness of a top / bottom shell" msgstr "Мінімальна товщина верхньої / нижньої оболонки" -#: src/libslic3r/PrintConfig.cpp:2431 +#: src/libslic3r/PrintConfig.cpp:2462 msgid "Spiral vase" msgstr "Спіральна ваза" -#: src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2463 msgid "" "This feature will raise Z gradually while printing a single-walled object in " "order to remove any visible seam. This option requires a single perimeter, " @@ -13297,20 +15157,17 @@ msgstr "" "яку кількість нижніх твердих шарів, а також спідниці краю. Це не спрацює при " "друку більше, ніж одного об'єкта." -#: src/libslic3r/PrintConfig.cpp:2440 +#: src/libslic3r/PrintConfig.cpp:2471 msgid "Temperature variation" msgstr "Варіація температури" -#: src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:2472 msgid "" -"Temperature difference to be applied when an extruder is not active. Enables " -"a full-height \"sacrificial\" skirt on which the nozzles are periodically " -"wiped." +"Temperature difference to be applied when an extruder is not active. The " +"value is not used when 'idle_temperature' in filament settings is defined." msgstr "" -"Відмітка температури, яка застосовується, коли екструдер не активний. Вмикає " -"\"жертовний\" плінтус на повній висоті, на які періодично очищуються сопла." -#: src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2483 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -13329,7 +15186,7 @@ msgstr "" "параметрів Slic3r, щоб ви могли поставити команду \"M109 S " "[first_layer_temperature]\" де завгодно." -#: src/libslic3r/PrintConfig.cpp:2466 +#: src/libslic3r/PrintConfig.cpp:2498 msgid "" "This start procedure is inserted at the beginning, after any printer start " "gcode (and after any toolchange to this filament in case of multi-material " @@ -13352,35 +15209,35 @@ msgstr "" "[first_layer_temperature]\" де завгодно. Якщо у вас кілька екструдерів, G-" "код обробляється в порядку екструдера." -#: src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2514 msgid "Color change G-code" msgstr "G-код зміни кольору" -#: src/libslic3r/PrintConfig.cpp:2483 +#: src/libslic3r/PrintConfig.cpp:2515 msgid "This G-code will be used as a code for the color change" msgstr "Цей G-код буде використовуватися як код для зміни кольору" -#: src/libslic3r/PrintConfig.cpp:2492 +#: src/libslic3r/PrintConfig.cpp:2524 msgid "This G-code will be used as a code for the pause print" msgstr "Цей G-код буде використовуватися як код для паузи друку" -#: src/libslic3r/PrintConfig.cpp:2501 +#: src/libslic3r/PrintConfig.cpp:2533 msgid "This G-code will be used as a custom code" msgstr "Цей G-код буде використовуватися як власний код" -#: src/libslic3r/PrintConfig.cpp:2509 +#: src/libslic3r/PrintConfig.cpp:2541 msgid "Single Extruder Multi Material" msgstr "Мульти-матеріальний (ММ) друк з одним екструдером" -#: src/libslic3r/PrintConfig.cpp:2510 +#: src/libslic3r/PrintConfig.cpp:2542 msgid "The printer multiplexes filaments into a single hot end." msgstr "Принтер змішує філаменту в єдиний гарячий кінець." -#: src/libslic3r/PrintConfig.cpp:2515 +#: src/libslic3r/PrintConfig.cpp:2547 msgid "Prime all printing extruders" msgstr "Підготовка всіх друкуючих екструдерів" -#: src/libslic3r/PrintConfig.cpp:2516 +#: src/libslic3r/PrintConfig.cpp:2548 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." @@ -13388,11 +15245,11 @@ msgstr "" "Якщо увімкнено, усі друкуючі екструдери будуть отестовані на передньому краї " "друкарського столу перед початком друку." -#: src/libslic3r/PrintConfig.cpp:2521 +#: src/libslic3r/PrintConfig.cpp:2553 msgid "No sparse layers (EXPERIMENTAL)" msgstr "Немає розріджених шарів (ЕКСПЕРИМЕНТАЛЬНИЙ)" -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2554 msgid "" "If enabled, the wipe tower will not be printed on layers with no " "toolchanges. On layers with a toolchange, extruder will travel downward to " @@ -13404,11 +15261,11 @@ msgstr "" "вежу витирання. Користувач несе відповідальність за те, щоб не було " "зіткнення з друком." -#: src/libslic3r/PrintConfig.cpp:2529 +#: src/libslic3r/PrintConfig.cpp:2561 msgid "Slice gap closing radius" msgstr "Радіус закриття зазору зрізу" -#: src/libslic3r/PrintConfig.cpp:2531 +#: src/libslic3r/PrintConfig.cpp:2563 msgid "" "Cracks smaller than 2x gap closing radius are being filled during the " "triangle mesh slicing. The gap closing operation may reduce the final print " @@ -13419,41 +15276,41 @@ msgstr "" "остаточну роздільну здатність друку, тому доцільно підтримувати значення на " "досить низькому рівні." -#: src/libslic3r/PrintConfig.cpp:2539 +#: src/libslic3r/PrintConfig.cpp:2571 msgid "Slicing Mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2541 +#: src/libslic3r/PrintConfig.cpp:2573 msgid "" "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " "close all holes in the model." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2575 msgid "Regular" msgstr "Звичайний" -#: src/libslic3r/PrintConfig.cpp:2547 +#: src/libslic3r/PrintConfig.cpp:2576 msgid "Even-odd" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2548 +#: src/libslic3r/PrintConfig.cpp:2577 msgid "Close holes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2553 +#: src/libslic3r/PrintConfig.cpp:2583 msgid "Generate support material" msgstr "Створити підтримуючий матеріал" -#: src/libslic3r/PrintConfig.cpp:2555 +#: src/libslic3r/PrintConfig.cpp:2585 msgid "Enable support material generation." msgstr "Увімкнути генерацію матеріалів підтримки." -#: src/libslic3r/PrintConfig.cpp:2559 +#: src/libslic3r/PrintConfig.cpp:2589 msgid "Auto generated supports" msgstr "Автоматично згенеровані підтримки" -#: src/libslic3r/PrintConfig.cpp:2561 +#: src/libslic3r/PrintConfig.cpp:2591 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " @@ -13463,11 +15320,11 @@ msgstr "" "значення звису. Якщо вимкнено, підтримка буде генеруватися лише для " "\"Примусових підтримок\"." -#: src/libslic3r/PrintConfig.cpp:2567 +#: src/libslic3r/PrintConfig.cpp:2597 msgid "XY separation between an object and its support" msgstr "Розподіл XY між об'єктом та його підтримкою" -#: src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2599 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." @@ -13475,11 +15332,11 @@ msgstr "" "Розподіл XY між об'єктом та його підтримкою. Якщо вона виражена у відсотках " "(наприклад, 50%), вона буде розрахована за зовнішньою шириною периметру." -#: src/libslic3r/PrintConfig.cpp:2580 +#: src/libslic3r/PrintConfig.cpp:2610 msgid "Pattern angle" msgstr "Кут шаблону" -#: src/libslic3r/PrintConfig.cpp:2582 +#: src/libslic3r/PrintConfig.cpp:2612 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." @@ -13487,7 +15344,7 @@ msgstr "" "Використовуйте цей параметр, щоб повернути шаблон підтримуючого матеріалу на " "горизонтальній площині." -#: src/libslic3r/PrintConfig.cpp:2592 src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:2622 src/libslic3r/PrintConfig.cpp:3411 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -13495,11 +15352,11 @@ msgstr "" "Створити підтримку лише, для того, що лежить на збірній пластині. Не " "створювати підтримку на друк." -#: src/libslic3r/PrintConfig.cpp:2598 +#: src/libslic3r/PrintConfig.cpp:2627 msgid "Top contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2600 +#: src/libslic3r/PrintConfig.cpp:2629 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " @@ -13509,40 +15366,38 @@ msgstr "" "Встановлення значення 0 також захистить Slic3r від використання потоку " "мостів та швидкості для першого шару об'єктну." -#: src/libslic3r/PrintConfig.cpp:2608 +#: src/libslic3r/PrintConfig.cpp:2635 msgid "0 (soluble)" msgstr "0 (розчинний)" -#: src/libslic3r/PrintConfig.cpp:2609 +#: src/libslic3r/PrintConfig.cpp:2636 msgid "0.1 (detachable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2610 +#: src/libslic3r/PrintConfig.cpp:2637 msgid "0.2 (detachable)" msgstr "0,2 (відривний)" -#: src/libslic3r/PrintConfig.cpp:2616 +#: src/libslic3r/PrintConfig.cpp:2643 msgid "Bottom contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2618 +#: src/libslic3r/PrintConfig.cpp:2645 msgid "" "The vertical distance between the object top surface and the support " "material interface. If set to zero, support_material_contact_distance will " "be used for both top and bottom contact Z distances." msgstr "" -#. TRN To be shown in Print Settings "Bottom contact Z distance". Have to be as short as possible -#. TRN To be shown in Print Settings "Bottom interface layers". Have to be as short as possible -#: src/libslic3r/PrintConfig.cpp:2626 src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2651 src/libslic3r/PrintConfig.cpp:2732 msgid "Same as top" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2633 +#: src/libslic3r/PrintConfig.cpp:2659 msgid "Enforce support for the first" msgstr "Забезпечити підтримку першого(их)" -#: src/libslic3r/PrintConfig.cpp:2635 +#: src/libslic3r/PrintConfig.cpp:2661 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -13555,15 +15410,15 @@ msgstr "" "більшої адгезії об'єктів, що мають дуже тонкий або поганий слід на збірній " "пластині." -#: src/libslic3r/PrintConfig.cpp:2640 +#: src/libslic3r/PrintConfig.cpp:2666 msgid "Enforce support for the first n layers" msgstr "Забезпечити підтримку перших n шарів" -#: src/libslic3r/PrintConfig.cpp:2646 +#: src/libslic3r/PrintConfig.cpp:2672 msgid "Support material/raft/skirt extruder" msgstr "Підтримуючий матеріал / пліт / плінтус екструдеру" -#: src/libslic3r/PrintConfig.cpp:2648 +#: src/libslic3r/PrintConfig.cpp:2674 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." @@ -13571,7 +15426,7 @@ msgstr "" "Екструдер для друку підтримуючого матеріалу, плоту та плінтусу (1+, 0 для " "використання поточного екструдера, щоб мінімізувати зміни інструменту)." -#: src/libslic3r/PrintConfig.cpp:2657 +#: src/libslic3r/PrintConfig.cpp:2683 msgid "" "Set this to a non-zero value to set a manual extrusion width for support " "material. If left zero, default extrusion width will be used if set, " @@ -13584,21 +15439,21 @@ msgstr "" "Якщо він виражений у відсотках (наприклад, 90%), він буде обчислюватися за " "висотою шару." -#: src/libslic3r/PrintConfig.cpp:2667 +#: src/libslic3r/PrintConfig.cpp:2693 msgid "Interface loops" msgstr "Інтерфейсні петлі" -#: src/libslic3r/PrintConfig.cpp:2669 +#: src/libslic3r/PrintConfig.cpp:2695 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" "Закрити петлями верхній контактний шар підтримки. За замовчанням вимкнено." -#: src/libslic3r/PrintConfig.cpp:2674 +#: src/libslic3r/PrintConfig.cpp:2700 msgid "Support material/raft interface extruder" msgstr "Екструдер інтерфейсу підтримуючого матеріалу / плоту" -#: src/libslic3r/PrintConfig.cpp:2676 +#: src/libslic3r/PrintConfig.cpp:2702 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." @@ -13607,11 +15462,11 @@ msgstr "" "(1+, 0 для використання поточного екструдера, щоб звести до мінімуму зміни " "інструменту). Це також впливає на плот." -#: src/libslic3r/PrintConfig.cpp:2684 +#: src/libslic3r/PrintConfig.cpp:2709 msgid "Top interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2711 msgid "" "Number of interface layers to insert between the object(s) and support " "material." @@ -13619,53 +15474,57 @@ msgstr "" "Кількість шарів інтерфейсу для вставки між об'єктом(ами) та підтримуючим " "матеріалом." -#: src/libslic3r/PrintConfig.cpp:2693 +#: src/libslic3r/PrintConfig.cpp:2715 src/libslic3r/PrintConfig.cpp:2733 msgid "0 (off)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2716 src/libslic3r/PrintConfig.cpp:2734 msgid "1 (light)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2695 +#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2735 msgid "2 (default)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2696 +#: src/libslic3r/PrintConfig.cpp:2718 src/libslic3r/PrintConfig.cpp:2736 msgid "3 (heavy)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:2724 msgid "Bottom interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2704 +#: src/libslic3r/PrintConfig.cpp:2726 msgid "" "Number of interface layers to insert between the object(s) and support " "material. Set to -1 to use support_material_interface_layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2717 +#: src/libslic3r/PrintConfig.cpp:2742 msgid "Closing radius" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2719 +#: src/libslic3r/PrintConfig.cpp:2744 msgid "" "For snug supports, the support regions will be merged using morphological " "closing operation. Gaps smaller than the closing radius will be filled in." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2727 +#: src/libslic3r/PrintConfig.cpp:2752 msgid "Interface pattern spacing" msgstr "Відстань між шаблонами інтерфейсу" -#: src/libslic3r/PrintConfig.cpp:2729 +#: src/libslic3r/PrintConfig.cpp:2754 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" "Відстань між інтерфейсними лініями. Встановити 0, щоб отримати надійний " "інтерфейс." -#: src/libslic3r/PrintConfig.cpp:2738 +#: src/libslic3r/PrintConfig.cpp:2761 +msgid "Support material interface" +msgstr "Інтерфейс підтримуючого матеріалу" + +#: src/libslic3r/PrintConfig.cpp:2763 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " @@ -13675,74 +15534,72 @@ msgstr "" "виражена у відсотках (наприклад, 50%), вона буде розрахована за швидкістю " "матеріалу підтримки." -#: src/libslic3r/PrintConfig.cpp:2747 +#: src/libslic3r/PrintConfig.cpp:2772 msgid "Pattern" msgstr "Шаблон" -#: src/libslic3r/PrintConfig.cpp:2749 +#: src/libslic3r/PrintConfig.cpp:2774 msgid "Pattern used to generate support material." msgstr "Шаблон, що використовується для створення матеріалу підтримки." -#: src/libslic3r/PrintConfig.cpp:2755 +#: src/libslic3r/PrintConfig.cpp:2777 msgid "Rectilinear grid" msgstr "Прямолінійна сітка" -#: src/libslic3r/PrintConfig.cpp:2761 +#: src/libslic3r/PrintConfig.cpp:2784 msgid "Interface pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2763 +#: src/libslic3r/PrintConfig.cpp:2786 msgid "" "Pattern used to generate support material interface. Default pattern for non-" "soluble support interface is Rectilinear, while default pattern for soluble " "support interface is Concentric." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2777 +#: src/libslic3r/PrintConfig.cpp:2798 msgid "Pattern spacing" msgstr "Відстань між шаблонами" -#: src/libslic3r/PrintConfig.cpp:2779 +#: src/libslic3r/PrintConfig.cpp:2800 msgid "Spacing between support material lines." msgstr "Відстань між лініями підтримуючого матеріалу." -#: src/libslic3r/PrintConfig.cpp:2788 +#: src/libslic3r/PrintConfig.cpp:2809 msgid "Speed for printing support material." msgstr "Швидкість друку підтримуючого матеріалу." -#: src/libslic3r/PrintConfig.cpp:2795 -msgid "Style" -msgstr "Стиль" - -#: src/libslic3r/PrintConfig.cpp:2797 +#: src/libslic3r/PrintConfig.cpp:2818 msgid "" "Style and shape of the support towers. Projecting the supports into a " "regular grid will create more stable supports, while snug support towers " "will save material and reduce object scarring." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2804 +#: src/libslic3r/PrintConfig.cpp:2823 msgid "Snug" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2809 +#: src/libslic3r/PrintConfig.cpp:2824 +msgid "Organic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2830 msgid "Synchronize with object layers" msgstr "Синхронізувати з шарами об'єкту" -#: src/libslic3r/PrintConfig.cpp:2811 +#: src/libslic3r/PrintConfig.cpp:2832 msgid "" "Synchronize support layers with the object print layers. This is useful with " -"multi-material printers, where the extruder switch is expensive." +"multi-material printers, where the extruder switch is expensive. This option " +"is only available when top contact Z distance is set to zero." msgstr "" -"Синхронізувати шари підтримки з шарами друку об'єкта. Це корисно " -"використовувати з багато-матеріальними принтерами, де перемикання " -"екструдерів -затратна процедура." -#: src/libslic3r/PrintConfig.cpp:2817 +#: src/libslic3r/PrintConfig.cpp:2839 msgid "Overhang threshold" msgstr "Порог нависання" -#: src/libslic3r/PrintConfig.cpp:2819 +#: src/libslic3r/PrintConfig.cpp:2841 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -13756,11 +15613,11 @@ msgstr "" "площини), який ви можете надрукувати без підтримуючого матеріалу. Встановити " "0 для автоматичного визначення (рекомендовано)." -#: src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2853 msgid "With sheath around the support" msgstr "З оболонкою навколо підтримки" -#: src/libslic3r/PrintConfig.cpp:2833 +#: src/libslic3r/PrintConfig.cpp:2855 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." @@ -13768,7 +15625,72 @@ msgstr "" "Додати оболонку (одну лінію периметра) навколо базової підтримки. Це робить " "підтримку більш надійною, але її важче видалити." -#: src/libslic3r/PrintConfig.cpp:2840 +#: src/libslic3r/PrintConfig.cpp:2861 +msgid "Maximum Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2863 +msgid "" +"The maximum angle of the branches, when the branches have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle to be able to have more reach." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2872 +msgid "Preferred Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2874 +msgid "" +"The preferred angle of the branches, when they do not have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle for branches to merge faster." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2883 +msgid "Tip Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2885 +msgid "The diameter of the top of the tip of the branches of organic support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2892 +msgid "Branch Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2894 +msgid "" +"The diameter of the thinnest branches of organic support. Thicker branches " +"are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2902 +msgid "Branch Diameter Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2904 +msgid "" +"The angle of the branches' diameter as they gradually become thicker towards " +"the bottom. An angle of 0 will cause the branches to have uniform thickness " +"over their length. A bit of an angle can increase stability of the organic " +"support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2914 +msgid "Branch Density" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2916 +msgid "" +"Adjusts the density of the support structure used to generate the tips of " +"the branches. A higher value results in better overhangs but the supports " +"are harder to remove, thus it is recommended to enable top support " +"interfaces instead of a high branch density value if dense interfaces are " +"needed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2928 msgid "" "Nozzle temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output G-code." @@ -13776,26 +15698,26 @@ msgstr "" "Температура сопла для шарів після першого. Встановіть значення нуля, щоб " "вимкнути команди регулювання температури у вихідному G-коді." -#: src/libslic3r/PrintConfig.cpp:2843 +#: src/libslic3r/PrintConfig.cpp:2931 msgid "Nozzle temperature" msgstr "Температура сопла" -#: src/libslic3r/PrintConfig.cpp:2849 +#: src/libslic3r/PrintConfig.cpp:2937 msgid "Thick bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2851 +#: src/libslic3r/PrintConfig.cpp:2939 msgid "" "If enabled, bridges are more reliable, can bridge longer distances, but may " "look worse. If disabled, bridges look better but are reliable just for " "shorter bridged distances." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2857 +#: src/libslic3r/PrintConfig.cpp:2945 msgid "Detect thin walls" msgstr "Виявлення тонких стінок" -#: src/libslic3r/PrintConfig.cpp:2859 +#: src/libslic3r/PrintConfig.cpp:2947 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." @@ -13803,11 +15725,11 @@ msgstr "" "Визначення одношарової стінки (частини, де два екструзії не підходять, і нам " "потрібно згорнути їх у єдиний слід)." -#: src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2953 msgid "Threads" msgstr "Нитки" -#: src/libslic3r/PrintConfig.cpp:2866 +#: src/libslic3r/PrintConfig.cpp:2954 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." @@ -13815,7 +15737,7 @@ msgstr "" "Нитки використовуються для паралелізації довготривалих завдань. Оптимальна " "кількість ниток трохи перевищує кількість доступних ядер / процесорів." -#: src/libslic3r/PrintConfig.cpp:2878 +#: src/libslic3r/PrintConfig.cpp:2966 msgid "" "This custom code is inserted before every toolchange. Placeholder variables " "for all PrusaSlicer settings as well as {toolchange_z}, {previous_extruder} " @@ -13825,7 +15747,7 @@ msgid "" "behaviour both before and after the toolchange." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2891 +#: src/libslic3r/PrintConfig.cpp:2979 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "top surfaces. You may want to use thinner extrudates to fill all narrow " @@ -13841,7 +15763,7 @@ msgstr "" "виражена у відсотках (наприклад, 90%), вона буде обчислюватися за висотою " "шару." -#: src/libslic3r/PrintConfig.cpp:2904 +#: src/libslic3r/PrintConfig.cpp:2992 msgid "" "Speed for printing top solid layers (it only applies to the uppermost " "external layers and not to their internal solid layers). You may want to " @@ -13855,15 +15777,15 @@ msgstr "" "відсотком (наприклад, 80%) звищення швидкості щільного наповнення . " "Встановити 0 для автоматичного обчислення." -#: src/libslic3r/PrintConfig.cpp:2919 +#: src/libslic3r/PrintConfig.cpp:3007 msgid "Number of solid layers to generate on top surfaces." msgstr "Кількість суцільних шарів, генерованих на верхніх поверхнях." -#: src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3008 msgid "Top solid layers" msgstr "Верхні суцільні шари" -#: src/libslic3r/PrintConfig.cpp:2928 +#: src/libslic3r/PrintConfig.cpp:3016 msgid "" "The number of top solid layers is increased above top_solid_layers if " "necessary to satisfy minimum thickness of top shell. This is useful to " @@ -13873,30 +15795,30 @@ msgstr "" "необхідно для задоволення мінімальної товщини верхньої оболонки. Це корисно " "для запобігання ефекту подушки під час друку зі змінною висотою шару." -#: src/libslic3r/PrintConfig.cpp:2931 +#: src/libslic3r/PrintConfig.cpp:3019 msgid "Minimum top shell thickness" msgstr "Мінімальна товщина верхньої оболонки" -#: src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:3026 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "Швидкість рухів пересування (стрибки між далекими точками екструзії)." -#: src/libslic3r/PrintConfig.cpp:2946 +#: src/libslic3r/PrintConfig.cpp:3034 msgid "Z travel" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2947 +#: src/libslic3r/PrintConfig.cpp:3035 msgid "" "Speed for movements along the Z axis.\n" "When set to zero, the value is ignored and regular travel speed is used " "instead." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2955 +#: src/libslic3r/PrintConfig.cpp:3043 msgid "Use firmware retraction" msgstr "Використовувати відмову прошивки" -#: src/libslic3r/PrintConfig.cpp:2956 +#: src/libslic3r/PrintConfig.cpp:3044 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." @@ -13904,11 +15826,11 @@ msgstr "" "Цей експериментальний параметр використовує команди G10 і G11 для обробки " "відмови прошивки. Останнім часом це підтримується лише Marlin-ом." -#: src/libslic3r/PrintConfig.cpp:2962 +#: src/libslic3r/PrintConfig.cpp:3050 msgid "Use relative E distances" msgstr "Використовувати відносні E відстані" -#: src/libslic3r/PrintConfig.cpp:2963 +#: src/libslic3r/PrintConfig.cpp:3051 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." @@ -13916,11 +15838,11 @@ msgstr "" "Якщо ваша прошивка потребує відносне значення E, зазначте це, інакше залиште " "його незазначеним. Більшість прошивок використовують абсолютні значення." -#: src/libslic3r/PrintConfig.cpp:2969 +#: src/libslic3r/PrintConfig.cpp:3057 msgid "Use volumetric E" msgstr "Використовувати об'ємний Е" -#: src/libslic3r/PrintConfig.cpp:2970 +#: src/libslic3r/PrintConfig.cpp:3058 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -13936,11 +15858,11 @@ msgstr "" "режим і використовувати діаметр філаменту, пов'язаний з вибраним філаментем " "у Slic3r. Останнім часом це підтримується лише Marlin-ом." -#: src/libslic3r/PrintConfig.cpp:2980 +#: src/libslic3r/PrintConfig.cpp:3068 msgid "Enable variable layer height feature" msgstr "Увімкнути функцію шарів змінної висоти" -#: src/libslic3r/PrintConfig.cpp:2981 +#: src/libslic3r/PrintConfig.cpp:3069 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." @@ -13948,11 +15870,11 @@ msgstr "" "Деякі принтери або налаштування принтера можуть мати труднощі з друкуванням " "шарів змінної висоти. Увімкнено за умовчанням." -#: src/libslic3r/PrintConfig.cpp:2987 +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Wipe while retracting" msgstr "Витирання протягом ретракту" -#: src/libslic3r/PrintConfig.cpp:2988 +#: src/libslic3r/PrintConfig.cpp:3076 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." @@ -13960,7 +15882,7 @@ msgstr "" "Цей прапорець перемістить сопло під час відмови, щоб мінімізувати можливість " "утворення краплі на витікаючих екструдерах." -#: src/libslic3r/PrintConfig.cpp:2995 +#: src/libslic3r/PrintConfig.cpp:3083 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." @@ -13969,11 +15891,11 @@ msgstr "" "екструдерів при зміні інструмента. Екструдуйте надлишок матеріалу до " "вичищуючої вежі." -#: src/libslic3r/PrintConfig.cpp:3001 +#: src/libslic3r/PrintConfig.cpp:3089 msgid "Purging volumes - load/unload volumes" msgstr "Обсяги витирання - обсяги заведення/виведення" -#: src/libslic3r/PrintConfig.cpp:3002 +#: src/libslic3r/PrintConfig.cpp:3090 msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " @@ -13983,11 +15905,11 @@ msgstr "" "інструменту, що використовується на вежі витирання. Ці значення " "використовуються для спрощення створення повних обсягів продувки нижче." -#: src/libslic3r/PrintConfig.cpp:3008 +#: src/libslic3r/PrintConfig.cpp:3096 msgid "Purging volumes - matrix" msgstr "Таблиця обсягів очищення" -#: src/libslic3r/PrintConfig.cpp:3009 +#: src/libslic3r/PrintConfig.cpp:3097 msgid "" "This matrix describes volumes (in cubic milimetres) required to purge the " "new filament on the wipe tower for any given pair of tools." @@ -13995,54 +15917,58 @@ msgstr "" "Ця матриця описує обсяги (у кубічних міліметрах), необхідні для витирання " "нового філаменту на вежі витирання для будь-якої пари інструментів." -#: src/libslic3r/PrintConfig.cpp:3018 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Position X" msgstr "Позиція X" -#: src/libslic3r/PrintConfig.cpp:3019 +#: src/libslic3r/PrintConfig.cpp:3107 msgid "X coordinate of the left front corner of a wipe tower" msgstr "X координата лівого переднього кута вичищуючої вежі" -#: src/libslic3r/PrintConfig.cpp:3025 +#: src/libslic3r/PrintConfig.cpp:3113 msgid "Position Y" msgstr "Позиція Y" -#: src/libslic3r/PrintConfig.cpp:3026 +#: src/libslic3r/PrintConfig.cpp:3114 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "Y координата лівого переднього кута вичищуючої вежі" -#: src/libslic3r/PrintConfig.cpp:3033 +#: src/libslic3r/PrintConfig.cpp:3120 +msgid "Width" +msgstr "Ширина" + +#: src/libslic3r/PrintConfig.cpp:3121 msgid "Width of a wipe tower" msgstr "Ширина вичищуючої вежі" -#: src/libslic3r/PrintConfig.cpp:3039 +#: src/libslic3r/PrintConfig.cpp:3127 msgid "Wipe tower rotation angle" msgstr "Кут повороту вежі витирання" -#: src/libslic3r/PrintConfig.cpp:3040 +#: src/libslic3r/PrintConfig.cpp:3128 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "Кут повороту вежі витирання за віссю Х." -#: src/libslic3r/PrintConfig.cpp:3046 src/libslic3r/PrintConfig.cpp:3047 +#: src/libslic3r/PrintConfig.cpp:3134 src/libslic3r/PrintConfig.cpp:3135 msgid "Wipe tower brim width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3055 +#: src/libslic3r/PrintConfig.cpp:3143 msgid "Wipe into this object's infill" msgstr "Витирати до наповнення цього об'єкту" -#: src/libslic3r/PrintConfig.cpp:3056 +#: src/libslic3r/PrintConfig.cpp:3144 msgid "" "Purging after toolchange will be done inside this object's infills. This " "lowers the amount of waste but may result in longer print time due to " "additional travel moves." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3063 +#: src/libslic3r/PrintConfig.cpp:3151 msgid "Wipe into this object" msgstr "Витирати до цього об'єкту" -#: src/libslic3r/PrintConfig.cpp:3064 +#: src/libslic3r/PrintConfig.cpp:3152 msgid "" "Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " @@ -14052,19 +15978,19 @@ msgstr "" "заощадити матеріал, який інакше потрапив би до вежі витирання, і зменшити " "час друку. В результаті кольори предметів будуть змішані." -#: src/libslic3r/PrintConfig.cpp:3070 +#: src/libslic3r/PrintConfig.cpp:3158 msgid "Maximal bridging distance" msgstr "Максимальна мостова відстань" -#: src/libslic3r/PrintConfig.cpp:3071 +#: src/libslic3r/PrintConfig.cpp:3159 msgid "Maximal distance between supports on sparse infill sections." msgstr "Максимальна відстань між підтримками на рідкісних ділянках заповнення." -#: src/libslic3r/PrintConfig.cpp:3077 +#: src/libslic3r/PrintConfig.cpp:3165 msgid "XY Size Compensation" msgstr "Зрівноваження розміру за XY" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3167 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" @@ -14074,11 +16000,11 @@ msgstr "" "(негативний - внутрішній, позитивний - ззовнішній). Це може бути корисним " "для точного налаштування розмірів отворів." -#: src/libslic3r/PrintConfig.cpp:3087 +#: src/libslic3r/PrintConfig.cpp:3175 msgid "Z offset" msgstr "Зміщення Z" -#: src/libslic3r/PrintConfig.cpp:3088 +#: src/libslic3r/PrintConfig.cpp:3176 msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " "output G-code. It is used to compensate for bad Z endstop position: for " @@ -14090,11 +16016,11 @@ msgstr "" "наприклад, якщо ваш кінцевий нуль фактично залишає сопло на 0,3 мм від " "полотна друку, встановіть його на значення -0,3 (або виправте ваш endstop)." -#: src/libslic3r/PrintConfig.cpp:3097 +#: src/libslic3r/PrintConfig.cpp:3185 msgid "Perimeter generator" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3099 +#: src/libslic3r/PrintConfig.cpp:3187 msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " @@ -14102,19 +16028,19 @@ msgid "" "Concentric infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3192 msgid "Classic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3107 +#: src/libslic3r/PrintConfig.cpp:3193 msgid "Arachne" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3199 msgid "Perimeter transition length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3114 +#: src/libslic3r/PrintConfig.cpp:3201 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " @@ -14122,11 +16048,11 @@ msgid "" "be computed based on the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3123 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Perimeter transitioning filter margin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3125 +#: src/libslic3r/PrintConfig.cpp:3212 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -14138,11 +16064,11 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3138 +#: src/libslic3r/PrintConfig.cpp:3225 msgid "Perimeter transitioning threshold angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3140 +#: src/libslic3r/PrintConfig.cpp:3227 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -14151,22 +16077,22 @@ msgid "" "these center perimeters, but may leave gaps or overextrude." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3151 +#: src/libslic3r/PrintConfig.cpp:3238 msgid "Perimeter distribution count" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3153 +#: src/libslic3r/PrintConfig.cpp:3240 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " "in width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3247 msgid "Minimum feature size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3162 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " @@ -14175,76 +16101,246 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3172 +#: src/libslic3r/PrintConfig.cpp:3259 msgid "Minimum perimeter width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3174 +#: src/libslic3r/PrintConfig.cpp:3261 +msgid "" +"Width of the perimeter that will replace thin features (according to the " +"Minimum feature size) of the model. If the Minimum perimeter width is " +"thinner than the thickness of the feature, the perimeter will become as " +"thick as the feature itself. If expressed as a percentage (for example 85%), " +"it will be computed based on the nozzle diameter." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3327 +msgid "Pinhead front diameter" +msgstr "Діаметр головки стовпа" + +#: src/libslic3r/PrintConfig.cpp:3329 +msgid "Diameter of the pointing side of the head" +msgstr "Діаметр носику головки" + +#: src/libslic3r/PrintConfig.cpp:3336 +msgid "Head penetration" +msgstr "Проникнення головки" + +#: src/libslic3r/PrintConfig.cpp:3338 +msgid "How much the pinhead has to penetrate the model surface" +msgstr "На скільки носики повинні проникати в поверхню моделі" + +#: src/libslic3r/PrintConfig.cpp:3345 +msgid "Pinhead width" +msgstr "Ширина головки стовпа" + +#: src/libslic3r/PrintConfig.cpp:3347 +msgid "Width from the back sphere center to the front sphere center" +msgstr "Ширина від центру задньої кулі до передньої кулі" + +#: src/libslic3r/PrintConfig.cpp:3355 +msgid "Pillar diameter" +msgstr "Діаметр стовпів" + +#: src/libslic3r/PrintConfig.cpp:3357 +msgid "Diameter in mm of the support pillars" +msgstr "Діаметр стовпів підтримки у мм" + +#: src/libslic3r/PrintConfig.cpp:3365 +msgid "Small pillar diameter percent" +msgstr "Процентний діаметр малих стовпів" + +#: src/libslic3r/PrintConfig.cpp:3367 +msgid "" +"The percentage of smaller pillars compared to the normal pillar diameter " +"which are used in problematic areas where a normal pilla cannot fit." +msgstr "" +"Відсоток менших стовпів порівняно з нормальним діаметром стовпа, які " +"використовуються в проблемних зонах, де нормальний стовп не може поміститися." + +#: src/libslic3r/PrintConfig.cpp:3376 +msgid "Max bridges on a pillar" +msgstr "Макс. мостів на стовпі" + +#: src/libslic3r/PrintConfig.cpp:3378 +msgid "" +"Maximum number of bridges that can be placed on a pillar. Bridges hold " +"support point pinheads and connect to pillars as small branches." +msgstr "" +"Максимальна кількість мостів, які можна розмістити на тримаючому стовпі. " +"Мости утримують верхівки опор і з'єднуються зі стовпами як гілочки." + +#: src/libslic3r/PrintConfig.cpp:3386 +msgid "Max weight on model" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3389 +msgid "" +"Maximum weight of sub-trees that terminate on the model instead of the print " +"bed. The weight is the sum of the lenghts of all branches emanating from the " +"endpoint." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3397 +msgid "Pillar connection mode" +msgstr "Режим з'єднання стовпів" + +#: src/libslic3r/PrintConfig.cpp:3398 +msgid "" +"Controls the bridge type between two neighboring pillars. Can be zig-zag, " +"cross (double zig-zag) or dynamic which will automatically switch between " +"the first two depending on the distance of the two pillars." +msgstr "" +"Керує типом мосту між двома сусідніми стовпами. Може бути зигзагоподібним, " +"поперечним (подвійний зигзагоподібний) або динамічним, який автоматично " +"перемикається між першими двома залежно від відстані двох стовпів." + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Zig-Zag" +msgstr "Зіг-Заг" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Cross" +msgstr "Перехресний" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Dynamic" +msgstr "Динамічний" + +#: src/libslic3r/PrintConfig.cpp:3416 +msgid "Pillar widening factor" +msgstr "Коефіцієнт розширення стовпа" + +#: src/libslic3r/PrintConfig.cpp:3420 +msgid "" +"Merging bridges or pillars into another pillars can increase the radius. " +"Zero means no increase, one means full increase. The exact amount of " +"increase is unspecified and can change in the future." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3431 +msgid "Support base diameter" +msgstr "Діаметр основи підтримки" + +#: src/libslic3r/PrintConfig.cpp:3433 +msgid "Diameter in mm of the pillar base" +msgstr "Діаметр основи стовпа у мм" + +#: src/libslic3r/PrintConfig.cpp:3441 +msgid "Support base height" +msgstr "Висота основи підтримки" + +#: src/libslic3r/PrintConfig.cpp:3443 +msgid "The height of the pillar base cone" +msgstr "Висота конуса основи стовпа" + +#: src/libslic3r/PrintConfig.cpp:3450 +msgid "Support base safety distance" +msgstr "Безпечна відстань між основами підтримки" + +#: src/libslic3r/PrintConfig.cpp:3453 +msgid "" +"The minimum distance of the pillar base from the model in mm. Makes sense in " +"zero elevation mode where a gap according to this parameter is inserted " +"between the model and the pad." +msgstr "" +"Мінімальна відстань основи стовпа від моделі в мм. Має сенс у режимі " +"нульового підняття, коли між моделлю та майданчиком вставляється зазор " +"відповідно до цього параметра." + +#: src/libslic3r/PrintConfig.cpp:3463 +msgid "Critical angle" +msgstr "Критичний кут" + +#: src/libslic3r/PrintConfig.cpp:3465 +msgid "The default angle for connecting support sticks and junctions." +msgstr "Кут за замовчуванням для з'єднання опорних палочок і з'єднань." + +#: src/libslic3r/PrintConfig.cpp:3473 +msgid "Max bridge length" +msgstr "Максимальна довжина мосту" + +#: src/libslic3r/PrintConfig.cpp:3475 +msgid "The max length of a bridge" +msgstr "Максимальна довжина мосту" + +#: src/libslic3r/PrintConfig.cpp:3487 +msgid "Max pillar linking distance" +msgstr "Макс. відстань між стовпами" + +#: src/libslic3r/PrintConfig.cpp:3489 +msgid "" +"The max distance of two pillars to get linked with each other. A zero value " +"will prohibit pillar cascading." +msgstr "" +"Максимальна відстань двох стовпів для з'єднання між собою. Нульове значення " +"забороняє каскадування стовпів." + +#: src/libslic3r/PrintConfig.cpp:3499 msgid "" -"Width of the perimeter that will replace thin features (according to the " -"Minimum feature size) of the model. If the Minimum perimeter width is " -"thinner than the thickness of the feature, the perimeter will become as " -"thick as the feature itself. If expressed as a percentage (for example 85%), " -"it will be computed based on the nozzle diameter." +"How much the supports should lift up the supported object. If \"Pad around " +"object\" is enabled, this value is ignored." msgstr "" +"Скільки опор повинно піднімати підтримуваний об’єкт. Якщо ввімкнено функцію " +"\"Подушка навколо об’єкта\", це значення ігнорується." -#: src/libslic3r/PrintConfig.cpp:3242 +#: src/libslic3r/PrintConfig.cpp:3515 msgid "Display width" msgstr "Ширина дисплея" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3516 msgid "Width of the display" msgstr "Ширина дисплея" -#: src/libslic3r/PrintConfig.cpp:3248 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "Display height" msgstr "Висота дисплея" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3522 msgid "Height of the display" msgstr "Висота дисплею" -#: src/libslic3r/PrintConfig.cpp:3254 +#: src/libslic3r/PrintConfig.cpp:3527 msgid "Number of pixels in" msgstr "Кількість пікселів за віссю" -#: src/libslic3r/PrintConfig.cpp:3256 +#: src/libslic3r/PrintConfig.cpp:3529 msgid "Number of pixels in X" msgstr "Кількість пікселів за віссю X" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3535 msgid "Number of pixels in Y" msgstr "Кількість пікселів за віссю Y" -#: src/libslic3r/PrintConfig.cpp:3267 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Display horizontal mirroring" msgstr "Горизонтальне віддзеркалення дисплея" -#: src/libslic3r/PrintConfig.cpp:3268 +#: src/libslic3r/PrintConfig.cpp:3541 msgid "Mirror horizontally" msgstr "Віддзеркалити горизонтально" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3542 msgid "Enable horizontal mirroring of output images" msgstr "Увімкнути горизонтальне віддзеркалення вихідних зображень" -#: src/libslic3r/PrintConfig.cpp:3274 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Display vertical mirroring" msgstr "Вертикальне віддзеркалення дисплея" -#: src/libslic3r/PrintConfig.cpp:3275 +#: src/libslic3r/PrintConfig.cpp:3548 msgid "Mirror vertically" msgstr "Віддзеркалити вертикально" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "Enable vertical mirroring of output images" msgstr "Увімкнути вертикальне віддзеркалення вихідних зображень" -#: src/libslic3r/PrintConfig.cpp:3281 +#: src/libslic3r/PrintConfig.cpp:3554 msgid "Display orientation" msgstr "Орієнтація дисплея" -#: src/libslic3r/PrintConfig.cpp:3282 +#: src/libslic3r/PrintConfig.cpp:3555 msgid "" "Set the actual LCD display orientation inside the SLA printer. Portrait mode " "will flip the meaning of display width and height parameters and the output " @@ -14254,55 +16350,55 @@ msgstr "" "Портретний режим переверне значення параметрів ширини та висоти дисплея, а " "вихідні зображення повернуть на 90 градусів." -#: src/libslic3r/PrintConfig.cpp:3288 +#: src/libslic3r/PrintConfig.cpp:3559 msgid "Landscape" msgstr "Альбомна" -#: src/libslic3r/PrintConfig.cpp:3289 +#: src/libslic3r/PrintConfig.cpp:3560 msgid "Portrait" msgstr "Книжкова" -#: src/libslic3r/PrintConfig.cpp:3294 src/libslic3r/PrintConfig.cpp:3929 +#: src/libslic3r/PrintConfig.cpp:3566 src/libslic3r/PrintConfig.cpp:4058 msgid "Fast" msgstr "Швидкий" -#: src/libslic3r/PrintConfig.cpp:3295 +#: src/libslic3r/PrintConfig.cpp:3567 msgid "Fast tilt" msgstr "Швидкий нахил" -#: src/libslic3r/PrintConfig.cpp:3296 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Time of the fast tilt" msgstr "Час швидкого нахилу" -#: src/libslic3r/PrintConfig.cpp:3303 src/libslic3r/PrintConfig.cpp:3928 +#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:4057 msgid "Slow" msgstr "Повільний" -#: src/libslic3r/PrintConfig.cpp:3304 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Slow tilt" msgstr "Повільний нахил" -#: src/libslic3r/PrintConfig.cpp:3305 +#: src/libslic3r/PrintConfig.cpp:3577 msgid "Time of the slow tilt" msgstr "Час повільного нахилу" -#: src/libslic3r/PrintConfig.cpp:3312 src/libslic3r/PrintConfig.cpp:3930 +#: src/libslic3r/PrintConfig.cpp:3584 src/libslic3r/PrintConfig.cpp:4059 msgid "High viscosity" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3313 +#: src/libslic3r/PrintConfig.cpp:3585 msgid "Tilt for high viscosity resin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3314 +#: src/libslic3r/PrintConfig.cpp:3586 msgid "Time of the super slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3321 +#: src/libslic3r/PrintConfig.cpp:3593 msgid "Area fill" msgstr "Заповнена область" -#: src/libslic3r/PrintConfig.cpp:3322 +#: src/libslic3r/PrintConfig.cpp:3594 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -14312,61 +16408,61 @@ msgstr "" "Якщо область друку перевищує вказане значення,\n" "тоді буде використовуватися повільний нахил, інакше - швидкий нахил" -#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 -#: src/libslic3r/PrintConfig.cpp:3331 +#: src/libslic3r/PrintConfig.cpp:3601 src/libslic3r/PrintConfig.cpp:3602 +#: src/libslic3r/PrintConfig.cpp:3603 msgid "Printer scaling correction" msgstr "Корекція масштабування принтера" -#: src/libslic3r/PrintConfig.cpp:3337 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3609 src/libslic3r/PrintConfig.cpp:3611 msgid "Printer scaling correction in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3338 +#: src/libslic3r/PrintConfig.cpp:3610 msgid "Printer scaling X axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3345 src/libslic3r/PrintConfig.cpp:3347 +#: src/libslic3r/PrintConfig.cpp:3617 src/libslic3r/PrintConfig.cpp:3619 msgid "Printer scaling correction in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3346 +#: src/libslic3r/PrintConfig.cpp:3618 msgid "Printer scaling Y axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3353 src/libslic3r/PrintConfig.cpp:3355 +#: src/libslic3r/PrintConfig.cpp:3625 src/libslic3r/PrintConfig.cpp:3627 msgid "Printer scaling correction in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3354 +#: src/libslic3r/PrintConfig.cpp:3626 msgid "Printer scaling Z axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3361 src/libslic3r/PrintConfig.cpp:3362 +#: src/libslic3r/PrintConfig.cpp:3633 src/libslic3r/PrintConfig.cpp:3634 msgid "Printer absolute correction" msgstr "Абсолютна корекція принтера" -#: src/libslic3r/PrintConfig.cpp:3363 +#: src/libslic3r/PrintConfig.cpp:3635 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "Надує або спустить нарізані 2D-полігони відповідно до знака корекції." -#: src/libslic3r/PrintConfig.cpp:3369 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Elephant foot minimum width" msgstr "Мінімальна ширина слонової стопи" -#: src/libslic3r/PrintConfig.cpp:3371 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" "Мінімальна ширина частей, яку слід підтримувати, виконуючи компенсацію стопи " "слона." -#: src/libslic3r/PrintConfig.cpp:3378 src/libslic3r/PrintConfig.cpp:3379 +#: src/libslic3r/PrintConfig.cpp:3650 src/libslic3r/PrintConfig.cpp:3651 msgid "Printer gamma correction" msgstr "Гамма - корекція принтера" -#: src/libslic3r/PrintConfig.cpp:3380 +#: src/libslic3r/PrintConfig.cpp:3652 msgid "" "This will apply a gamma correction to the rasterized 2D polygons. A gamma " "value of zero means thresholding with the threshold in the middle. This " @@ -14376,43 +16472,53 @@ msgstr "" "гамми означає порогове значення з порогом посередині. Така поведінка усуває " "згладжування, не втрачаючи дірок у полігонах." -#: src/libslic3r/PrintConfig.cpp:3399 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3671 src/libslic3r/PrintConfig.cpp:3672 msgid "SLA material type" msgstr "Тип SLA-матеріалу" -#: src/libslic3r/PrintConfig.cpp:3411 src/libslic3r/PrintConfig.cpp:3412 +#: src/libslic3r/PrintConfig.cpp:3679 src/libslic3r/PrintConfig.cpp:3680 msgid "Initial layer height" msgstr "Висота першого шару" -#: src/libslic3r/PrintConfig.cpp:3418 src/libslic3r/PrintConfig.cpp:3419 +#: src/libslic3r/PrintConfig.cpp:3686 +msgid "Idle temperature" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3687 +msgid "" +"Nozzle temperature when the tool is currently not used in multi-tool setups." +"This is only used when 'Ooze prevention' is active in Print Settings." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3695 src/libslic3r/PrintConfig.cpp:3696 msgid "Bottle volume" msgstr "Об’єм пляшки" -#: src/libslic3r/PrintConfig.cpp:3420 +#: src/libslic3r/PrintConfig.cpp:3697 msgid "ml" msgstr "мл" -#: src/libslic3r/PrintConfig.cpp:3425 src/libslic3r/PrintConfig.cpp:3426 +#: src/libslic3r/PrintConfig.cpp:3702 src/libslic3r/PrintConfig.cpp:3703 msgid "Bottle weight" msgstr "Вага пляшки" -#: src/libslic3r/PrintConfig.cpp:3427 +#: src/libslic3r/PrintConfig.cpp:3704 msgid "kg" msgstr "кг" -#: src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "g/ml" msgstr "г/мл" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3718 msgid "money/bottle" msgstr "грошових одиниць/пляшку" -#: src/libslic3r/PrintConfig.cpp:3446 +#: src/libslic3r/PrintConfig.cpp:3723 msgid "Faded layers" msgstr "Шари початкового контакту" -#: src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3724 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" @@ -14420,259 +16526,119 @@ msgstr "" "Кількість шарів, необхідних для часу експозиції, зменшується від початкового " "часу експозиції до часу експозиції" -#: src/libslic3r/PrintConfig.cpp:3454 src/libslic3r/PrintConfig.cpp:3455 +#: src/libslic3r/PrintConfig.cpp:3731 src/libslic3r/PrintConfig.cpp:3732 msgid "Minimum exposure time" msgstr "Мінімальний час експозиції" -#: src/libslic3r/PrintConfig.cpp:3462 src/libslic3r/PrintConfig.cpp:3463 +#: src/libslic3r/PrintConfig.cpp:3739 src/libslic3r/PrintConfig.cpp:3740 msgid "Maximum exposure time" msgstr "Максимальний час експозиції" -#: src/libslic3r/PrintConfig.cpp:3470 src/libslic3r/PrintConfig.cpp:3471 +#: src/libslic3r/PrintConfig.cpp:3747 src/libslic3r/PrintConfig.cpp:3748 msgid "Exposure time" msgstr "Час експозиції" -#: src/libslic3r/PrintConfig.cpp:3477 src/libslic3r/PrintConfig.cpp:3478 +#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3755 msgid "Minimum initial exposure time" msgstr "Мінімальний час початкової експозиції" -#: src/libslic3r/PrintConfig.cpp:3485 src/libslic3r/PrintConfig.cpp:3486 +#: src/libslic3r/PrintConfig.cpp:3762 src/libslic3r/PrintConfig.cpp:3763 msgid "Maximum initial exposure time" msgstr "Максимальний час початкової експозиції" -#: src/libslic3r/PrintConfig.cpp:3493 src/libslic3r/PrintConfig.cpp:3494 +#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3771 msgid "Initial exposure time" msgstr "Час початкової експозиції" -#: src/libslic3r/PrintConfig.cpp:3500 src/libslic3r/PrintConfig.cpp:3501 +#: src/libslic3r/PrintConfig.cpp:3777 src/libslic3r/PrintConfig.cpp:3778 msgid "Correction for expansion" msgstr "Поправка на розширення" -#: src/libslic3r/PrintConfig.cpp:3507 src/libslic3r/PrintConfig.cpp:3508 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3785 msgid "Correction for expansion in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3514 src/libslic3r/PrintConfig.cpp:3515 +#: src/libslic3r/PrintConfig.cpp:3791 src/libslic3r/PrintConfig.cpp:3792 msgid "Correction for expansion in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3521 src/libslic3r/PrintConfig.cpp:3522 +#: src/libslic3r/PrintConfig.cpp:3798 src/libslic3r/PrintConfig.cpp:3799 msgid "Correction for expansion in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3528 +#: src/libslic3r/PrintConfig.cpp:3805 msgid "SLA print material notes" msgstr "Примітки до друкованих SLA-матеріалів" -#: src/libslic3r/PrintConfig.cpp:3529 +#: src/libslic3r/PrintConfig.cpp:3806 msgid "You can put your notes regarding the SLA print material here." msgstr "Тут ви можете помістити свої нотатки щодо SLA-матеріалу." -#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3552 +#: src/libslic3r/PrintConfig.cpp:3818 src/libslic3r/PrintConfig.cpp:3829 msgid "Default SLA material profile" msgstr "Профіль SLA-матеріалу за замовчанням" -#: src/libslic3r/PrintConfig.cpp:3563 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "Generate supports" msgstr "Генерувати підтримки" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3842 msgid "Generate supports for the models" msgstr "Генерувати підтримки для моделей" -#: src/libslic3r/PrintConfig.cpp:3570 -msgid "Pinhead front diameter" -msgstr "Діаметр головки стовпа" - -#: src/libslic3r/PrintConfig.cpp:3572 -msgid "Diameter of the pointing side of the head" -msgstr "Діаметр носику головки" - -#: src/libslic3r/PrintConfig.cpp:3579 -msgid "Head penetration" -msgstr "Проникнення головки" - -#: src/libslic3r/PrintConfig.cpp:3581 -msgid "How much the pinhead has to penetrate the model surface" -msgstr "На скільки носики повинні проникати в поверхню моделі" - -#: src/libslic3r/PrintConfig.cpp:3588 -msgid "Pinhead width" -msgstr "Ширина головки стовпа" - -#: src/libslic3r/PrintConfig.cpp:3590 -msgid "Width from the back sphere center to the front sphere center" -msgstr "Ширина від центру задньої кулі до передньої кулі" - -#: src/libslic3r/PrintConfig.cpp:3598 -msgid "Pillar diameter" -msgstr "Діаметр стовпів" - -#: src/libslic3r/PrintConfig.cpp:3600 -msgid "Diameter in mm of the support pillars" -msgstr "Діаметр стовпів підтримки у мм" - -#: src/libslic3r/PrintConfig.cpp:3608 -msgid "Small pillar diameter percent" -msgstr "Процентний діаметр малих стовпів" - -#: src/libslic3r/PrintConfig.cpp:3610 -msgid "" -"The percentage of smaller pillars compared to the normal pillar diameter " -"which are used in problematic areas where a normal pilla cannot fit." -msgstr "" -"Відсоток менших стовпів порівняно з нормальним діаметром стовпа, які " -"використовуються в проблемних зонах, де нормальний стовп не може поміститися." - -#: src/libslic3r/PrintConfig.cpp:3619 -msgid "Max bridges on a pillar" -msgstr "Макс. мостів на стовпі" - -#: src/libslic3r/PrintConfig.cpp:3621 -msgid "" -"Maximum number of bridges that can be placed on a pillar. Bridges hold " -"support point pinheads and connect to pillars as small branches." -msgstr "" -"Максимальна кількість мостів, які можна розмістити на тримаючому стовпі. " -"Мости утримують верхівки опор і з'єднуються зі стовпами як гілочки." - -#: src/libslic3r/PrintConfig.cpp:3629 -msgid "Pillar connection mode" -msgstr "Режим з'єднання стовпів" - -#: src/libslic3r/PrintConfig.cpp:3630 -msgid "" -"Controls the bridge type between two neighboring pillars. Can be zig-zag, " -"cross (double zig-zag) or dynamic which will automatically switch between " -"the first two depending on the distance of the two pillars." +#: src/libslic3r/PrintConfig.cpp:3847 +msgid "Support tree type" msgstr "" -"Керує типом мосту між двома сусідніми стовпами. Може бути зигзагоподібним, " -"поперечним (подвійний зигзагоподібний) або динамічним, який автоматично " -"перемикається між першими двома залежно від відстані двох стовпів." - -#: src/libslic3r/PrintConfig.cpp:3638 -msgid "Zig-Zag" -msgstr "Зіг-Заг" - -#: src/libslic3r/PrintConfig.cpp:3639 -msgid "Cross" -msgstr "Перехресний" - -#: src/libslic3r/PrintConfig.cpp:3640 -msgid "Dynamic" -msgstr "Динамічний" - -#: src/libslic3r/PrintConfig.cpp:3652 -msgid "Pillar widening factor" -msgstr "Коефіцієнт розширення стовпа" -#: src/libslic3r/PrintConfig.cpp:3654 -msgid "" -"Merging bridges or pillars into another pillars can increase the radius. " -"Zero means no increase, one means full increase." +#: src/libslic3r/PrintConfig.cpp:3848 +msgid "Support tree building strategy" msgstr "" -"Злиття мостів або стовпів в інші стовпи може збільшити радіус. Нуль означає " -"відсутність збільшення, один означає повне збільшення." - -#: src/libslic3r/PrintConfig.cpp:3663 -msgid "Support base diameter" -msgstr "Діаметр основи підтримки" - -#: src/libslic3r/PrintConfig.cpp:3665 -msgid "Diameter in mm of the pillar base" -msgstr "Діаметр основи стовпа у мм" - -#: src/libslic3r/PrintConfig.cpp:3673 -msgid "Support base height" -msgstr "Висота основи підтримки" - -#: src/libslic3r/PrintConfig.cpp:3675 -msgid "The height of the pillar base cone" -msgstr "Висота конуса основи стовпа" - -#: src/libslic3r/PrintConfig.cpp:3682 -msgid "Support base safety distance" -msgstr "Безпечна відстань між основами підтримки" -#: src/libslic3r/PrintConfig.cpp:3685 -msgid "" -"The minimum distance of the pillar base from the model in mm. Makes sense in " -"zero elevation mode where a gap according to this parameter is inserted " -"between the model and the pad." +#: src/libslic3r/PrintConfig.cpp:3851 +msgid "Branching (experimental)" msgstr "" -"Мінімальна відстань основи стовпа від моделі в мм. Має сенс у режимі " -"нульового підняття, коли між моделлю та майданчиком вставляється зазор " -"відповідно до цього параметра." - -#: src/libslic3r/PrintConfig.cpp:3695 -msgid "Critical angle" -msgstr "Критичний кут" - -#: src/libslic3r/PrintConfig.cpp:3697 -msgid "The default angle for connecting support sticks and junctions." -msgstr "Кут за замовчуванням для з'єднання опорних палочок і з'єднань." - -#: src/libslic3r/PrintConfig.cpp:3705 -msgid "Max bridge length" -msgstr "Максимальна довжина мосту" - -#: src/libslic3r/PrintConfig.cpp:3707 -msgid "The max length of a bridge" -msgstr "Максимальна довжина мосту" - -#: src/libslic3r/PrintConfig.cpp:3714 -msgid "Max pillar linking distance" -msgstr "Макс. відстань між стовпами" -#: src/libslic3r/PrintConfig.cpp:3716 -msgid "" -"The max distance of two pillars to get linked with each other. A zero value " -"will prohibit pillar cascading." +#: src/libslic3r/PrintConfig.cpp:3860 +msgid "Support only in enforced regions" msgstr "" -"Максимальна відстань двох стовпів для з'єднання між собою. Нульове значення " -"забороняє каскадування стовпів." -#: src/libslic3r/PrintConfig.cpp:3726 -msgid "" -"How much the supports should lift up the supported object. If \"Pad around " -"object\" is enabled, this value is ignored." +#: src/libslic3r/PrintConfig.cpp:3862 +msgid "Only create support if it lies in a support enforcer." msgstr "" -"Скільки опор повинно піднімати підтримуваний об’єкт. Якщо ввімкнено функцію " -"\"Подушка навколо об’єкта\", це значення ігнорується." -#: src/libslic3r/PrintConfig.cpp:3737 +#: src/libslic3r/PrintConfig.cpp:3869 msgid "This is a relative measure of support points density." msgstr "Відносний показних щільності точок підтримки." -#: src/libslic3r/PrintConfig.cpp:3743 +#: src/libslic3r/PrintConfig.cpp:3875 msgid "Minimal distance of the support points" msgstr "Мінімальна відстань опорних точок" -#: src/libslic3r/PrintConfig.cpp:3745 +#: src/libslic3r/PrintConfig.cpp:3877 msgid "No support points will be placed closer than this threshold." msgstr "Жодні точки підтримки не будуть розміщені ближче цього порогу." -#: src/libslic3r/PrintConfig.cpp:3751 +#: src/libslic3r/PrintConfig.cpp:3883 msgid "Use pad" msgstr "Використовувати полушку" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3885 msgid "Add a pad underneath the supported model" msgstr "Додати подушечку під підтримувану модель" -#: src/libslic3r/PrintConfig.cpp:3758 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "Pad wall thickness" msgstr "Товщина стінки подушки" -#: src/libslic3r/PrintConfig.cpp:3760 +#: src/libslic3r/PrintConfig.cpp:3892 msgid "The thickness of the pad and its optional cavity walls." msgstr "Товщина подушки та її додаткових стінок порожнини." -#: src/libslic3r/PrintConfig.cpp:3768 +#: src/libslic3r/PrintConfig.cpp:3900 msgid "Pad wall height" msgstr "Висота стінки подушки" -#: src/libslic3r/PrintConfig.cpp:3769 +#: src/libslic3r/PrintConfig.cpp:3901 msgid "" "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " "when enabling this feature, as some resins may produce an extreme suction " @@ -14684,19 +16650,19 @@ msgstr "" "можуть мати надзвичайний ефект всмоктування всередині порожнини, що " "ускладнює відшарування відбитка з фольги." -#: src/libslic3r/PrintConfig.cpp:3782 +#: src/libslic3r/PrintConfig.cpp:3914 msgid "Pad brim size" msgstr "Розмір краю подушки" -#: src/libslic3r/PrintConfig.cpp:3783 +#: src/libslic3r/PrintConfig.cpp:3915 msgid "How far should the pad extend around the contained geometry" msgstr "Як далеко повинна розширюватися подушка навколо вміщуваної геометрії" -#: src/libslic3r/PrintConfig.cpp:3793 +#: src/libslic3r/PrintConfig.cpp:3925 msgid "Max merge distance" msgstr "Макс. відстань об'єднання" -#: src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3927 msgid "" "Some objects can get along with a few smaller pads instead of a single big " "one. This parameter defines how far the center of two smaller pads should " @@ -14706,45 +16672,45 @@ msgstr "" "великої. Цей параметр визначає, наскільки далеко повинен бути центр двох " "менших подушок. Якщо вони стануть ближче, вони об’єднаються в одну велику." -#: src/libslic3r/PrintConfig.cpp:3815 +#: src/libslic3r/PrintConfig.cpp:3947 msgid "Pad wall slope" msgstr "Нахил стінки подушки" -#: src/libslic3r/PrintConfig.cpp:3817 +#: src/libslic3r/PrintConfig.cpp:3949 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "" "Нахил стінки подушки відносно площини столу. 90 градусів означає прямі стіни." -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3960 msgid "Create pad around object and ignore the support elevation" msgstr "Створити подушку навколо об’єкта та ігнорувати підняття підтримки" -#: src/libslic3r/PrintConfig.cpp:3833 +#: src/libslic3r/PrintConfig.cpp:3965 msgid "Pad around object everywhere" msgstr "Подушка скрізь навколо об’єкта" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3967 msgid "Force pad around object everywhere" msgstr "Створити подушку навколо об’єкта" -#: src/libslic3r/PrintConfig.cpp:3840 +#: src/libslic3r/PrintConfig.cpp:3972 msgid "Pad object gap" msgstr "Розрив Подушка-Об'єкт" -#: src/libslic3r/PrintConfig.cpp:3842 +#: src/libslic3r/PrintConfig.cpp:3974 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "" "Розрив між дном об’єкта та генерованою подушкою в режимі нульового підняття." -#: src/libslic3r/PrintConfig.cpp:3851 +#: src/libslic3r/PrintConfig.cpp:3983 msgid "Pad object connector stride" msgstr "Крок з'єднувача Подушка-Об'єкт" -#: src/libslic3r/PrintConfig.cpp:3853 +#: src/libslic3r/PrintConfig.cpp:3985 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." @@ -14752,45 +16718,45 @@ msgstr "" "Відстань між двома з'єднувальними паличками, які з'єднують об'єкт та " "генеровану подушку." -#: src/libslic3r/PrintConfig.cpp:3860 +#: src/libslic3r/PrintConfig.cpp:3992 msgid "Pad object connector width" msgstr "Ширина з'єднувача Подушка-Об'єкт" -#: src/libslic3r/PrintConfig.cpp:3862 +#: src/libslic3r/PrintConfig.cpp:3994 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "" "Ширина з'єднувальної паличками, що з'єднує об'єкт та генеровану подушку." -#: src/libslic3r/PrintConfig.cpp:3869 +#: src/libslic3r/PrintConfig.cpp:4001 msgid "Pad object connector penetration" msgstr "Глибина проникнення з'єднувача Подушка-Об'єкт" -#: src/libslic3r/PrintConfig.cpp:3872 +#: src/libslic3r/PrintConfig.cpp:4004 msgid "How much should the tiny connectors penetrate into the model body." msgstr "На скільки крихітні з'єднувачі повинні проникати в тіло моделі." -#: src/libslic3r/PrintConfig.cpp:3879 +#: src/libslic3r/PrintConfig.cpp:4011 msgid "Enable hollowing" msgstr "Увімкнути формування порожнин" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:4013 msgid "Hollow out a model to have an empty interior" msgstr "Випорожнити модель, щоб мати порожній інтер’єр" -#: src/libslic3r/PrintConfig.cpp:3886 +#: src/libslic3r/PrintConfig.cpp:4018 msgid "Wall thickness" msgstr "Товщина стінки" -#: src/libslic3r/PrintConfig.cpp:3888 +#: src/libslic3r/PrintConfig.cpp:4020 msgid "Minimum wall thickness of a hollowed model." msgstr "Мінімальна товщина стінки порожнистої моделі." -#: src/libslic3r/PrintConfig.cpp:3896 +#: src/libslic3r/PrintConfig.cpp:4028 msgid "Accuracy" msgstr "Точність" -#: src/libslic3r/PrintConfig.cpp:3898 +#: src/libslic3r/PrintConfig.cpp:4030 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." @@ -14798,7 +16764,7 @@ msgstr "" "Продуктивність проти точності розрахунку. Менші значення можуть спричинити " "небажані артефакти." -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:4040 msgid "" "Hollowing is done in two steps: first, an imaginary interior is calculated " "deeper (offset plus the closing distance) in the object and then it's " @@ -14811,74 +16777,102 @@ msgstr "" "назад до заданого зміщення. Більша відстань до закриття робить інтер’єр " "більш округлим. При нулі інтер’єр найбільше буде нагадувати екстер’єр." -#: src/libslic3r/PrintConfig.cpp:3920 +#: src/libslic3r/PrintConfig.cpp:4052 msgid "Print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3922 +#: src/libslic3r/PrintConfig.cpp:4054 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " "movement and adds a delay before exposure." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4390 +#: src/libslic3r/PrintConfig.cpp:4065 +msgid "Format of the output SLA archive" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4070 +msgid "SLA output precision" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4071 +msgid "Minimum resolution in nanometers" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4542 msgid "Export OBJ" msgstr "Експорт OBJ" -#: src/libslic3r/PrintConfig.cpp:4391 +#: src/libslic3r/PrintConfig.cpp:4543 msgid "Export the model(s) as OBJ." msgstr "Експорт моделі як OBJ." -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4554 msgid "Export SLA" msgstr "Експорт SLA" -#: src/libslic3r/PrintConfig.cpp:4403 +#: src/libslic3r/PrintConfig.cpp:4555 msgid "Slice the model and export SLA printing layers as PNG." msgstr "Нарізати модель та експортувати шари SLA-друку до PNG." -#: src/libslic3r/PrintConfig.cpp:4408 +#: src/libslic3r/PrintConfig.cpp:4560 msgid "Export 3MF" msgstr "Експортувати 3MF" -#: src/libslic3r/PrintConfig.cpp:4409 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Export the model(s) as 3MF." msgstr "Експорт моделі як 3MF." -#: src/libslic3r/PrintConfig.cpp:4413 +#: src/libslic3r/PrintConfig.cpp:4565 msgid "Export AMF" msgstr "Експортувати AMF" -#: src/libslic3r/PrintConfig.cpp:4414 +#: src/libslic3r/PrintConfig.cpp:4566 msgid "Export the model(s) as AMF." msgstr "Експорт моделі як АMF." -#: src/libslic3r/PrintConfig.cpp:4418 +#: src/libslic3r/PrintConfig.cpp:4570 msgid "Export STL" msgstr "Експорт STL" -#: src/libslic3r/PrintConfig.cpp:4419 +#: src/libslic3r/PrintConfig.cpp:4571 msgid "Export the model(s) as STL." msgstr "Експорт моделі як STL." -#: src/libslic3r/PrintConfig.cpp:4424 +#: src/libslic3r/PrintConfig.cpp:4576 msgid "Slice the model and export toolpaths as G-code." msgstr "Нарізати та експортувати G-код." -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4581 msgid "G-code viewer" msgstr "Переглядач G-коду" -#: src/libslic3r/PrintConfig.cpp:4430 +#: src/libslic3r/PrintConfig.cpp:4582 msgid "Visualize an already sliced and saved G-code" msgstr "Візуалізувати вже нарізаний та збережений G-код" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4588 +msgid "OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4589 +msgid "Select the specified OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4594 +msgid "OpenGL debug output" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4595 +msgid "Activate OpenGL debug output on graphic cards which support it" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4601 msgid "Slice" msgstr "Нарізати" -#: src/libslic3r/PrintConfig.cpp:4436 +#: src/libslic3r/PrintConfig.cpp:4602 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." @@ -14886,67 +16880,71 @@ msgstr "" "Нарізати модель як FFF або SLA на основі значення printer_technology, " "зазначеного у конфігурації." -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4607 msgid "Help" msgstr "Допомога" -#: src/libslic3r/PrintConfig.cpp:4442 +#: src/libslic3r/PrintConfig.cpp:4608 msgid "Show this help." msgstr "Показати цю підказку." -#: src/libslic3r/PrintConfig.cpp:4447 +#: src/libslic3r/PrintConfig.cpp:4613 msgid "Help (FFF options)" msgstr "Допомога (FFF параметри)" -#: src/libslic3r/PrintConfig.cpp:4448 +#: src/libslic3r/PrintConfig.cpp:4614 msgid "Show the full list of print/G-code configuration options." msgstr "Показати повний список параметрів конфігурації друку / G-коду." -#: src/libslic3r/PrintConfig.cpp:4452 +#: src/libslic3r/PrintConfig.cpp:4618 msgid "Help (SLA options)" msgstr "Допомога (SLA параметри)" -#: src/libslic3r/PrintConfig.cpp:4453 +#: src/libslic3r/PrintConfig.cpp:4619 msgid "Show the full list of SLA print configuration options." msgstr "Показати повний перелік параметрів конфігурації SLA-друку." -#: src/libslic3r/PrintConfig.cpp:4457 +#: src/libslic3r/PrintConfig.cpp:4623 msgid "Output Model Info" msgstr "Інформація про вихідну модель" -#: src/libslic3r/PrintConfig.cpp:4458 +#: src/libslic3r/PrintConfig.cpp:4624 msgid "Write information about the model to the console." msgstr "Писати інформацію про модель на консолі." -#: src/libslic3r/PrintConfig.cpp:4462 +#: src/libslic3r/PrintConfig.cpp:4628 msgid "Save config file" msgstr "Зберегти файл конфігурації" -#: src/libslic3r/PrintConfig.cpp:4463 +#: src/libslic3r/PrintConfig.cpp:4629 msgid "Save configuration to the specified file." msgstr "Зберегти конфігурацію у вказаному файлі." -#: src/libslic3r/PrintConfig.cpp:4473 +#: src/libslic3r/PrintConfig.cpp:4639 msgid "Align XY" msgstr "Вирівняти XY" -#: src/libslic3r/PrintConfig.cpp:4474 +#: src/libslic3r/PrintConfig.cpp:4640 msgid "Align the model to the given point." msgstr "Вирівняйте модель за заданою точкою." -#: src/libslic3r/PrintConfig.cpp:4479 +#: src/libslic3r/PrintConfig.cpp:4645 msgid "Cut model at the given Z." msgstr "Розрізати модель за заданим Z." -#: src/libslic3r/PrintConfig.cpp:4501 +#: src/libslic3r/PrintConfig.cpp:4666 +msgid "Center" +msgstr "Центр" + +#: src/libslic3r/PrintConfig.cpp:4667 msgid "Center the print around the given center." msgstr "Відцентруйте друк навколо заданого центру." -#: src/libslic3r/PrintConfig.cpp:4505 +#: src/libslic3r/PrintConfig.cpp:4671 msgid "Don't arrange" msgstr "Не впорядковувати" -#: src/libslic3r/PrintConfig.cpp:4506 +#: src/libslic3r/PrintConfig.cpp:4672 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." @@ -14954,33 +16952,33 @@ msgstr "" "Не переставляйте дані моделі перед об’єднанням та зберігайте їх початкові " "координати XY." -#: src/libslic3r/PrintConfig.cpp:4509 +#: src/libslic3r/PrintConfig.cpp:4675 msgid "Ensure on bed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4510 +#: src/libslic3r/PrintConfig.cpp:4676 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4514 +#: src/libslic3r/PrintConfig.cpp:4680 msgid "Duplicate" msgstr "Дублювати" -#: src/libslic3r/PrintConfig.cpp:4515 +#: src/libslic3r/PrintConfig.cpp:4681 msgid "Multiply copies by this factor." msgstr "Збільшить кількість копій на цей коефіцієнт." -#: src/libslic3r/PrintConfig.cpp:4519 +#: src/libslic3r/PrintConfig.cpp:4685 msgid "Duplicate by grid" msgstr "Дублювати за сіткою" -#: src/libslic3r/PrintConfig.cpp:4520 +#: src/libslic3r/PrintConfig.cpp:4686 msgid "Multiply copies by creating a grid." msgstr "Збільшить кількість копій, створивши сітку." -#: src/libslic3r/PrintConfig.cpp:4524 +#: src/libslic3r/PrintConfig.cpp:4690 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." @@ -14988,7 +16986,7 @@ msgstr "" "Розташувати поставлені моделі на платформі та об’єднати їх в одну модель, " "щоб виконати дії один раз." -#: src/libslic3r/PrintConfig.cpp:4529 +#: src/libslic3r/PrintConfig.cpp:4695 msgid "" "Try to repair any non-manifold meshes (this option is implicitly added " "whenever we need to slice the model to perform the requested action)." @@ -14997,31 +16995,31 @@ msgstr "" "кожного разу, коли нам потрібно нарізати модель для виконання запитуваної " "дії)." -#: src/libslic3r/PrintConfig.cpp:4533 +#: src/libslic3r/PrintConfig.cpp:4699 msgid "Rotation angle around the Z axis in degrees." msgstr "Кут обертання навколо осі Z у градусах." -#: src/libslic3r/PrintConfig.cpp:4537 +#: src/libslic3r/PrintConfig.cpp:4703 msgid "Rotate around X" msgstr "Обертати навколо осі X" -#: src/libslic3r/PrintConfig.cpp:4538 +#: src/libslic3r/PrintConfig.cpp:4704 msgid "Rotation angle around the X axis in degrees." msgstr "Кут обертання навколо осі Х у градусах." -#: src/libslic3r/PrintConfig.cpp:4542 +#: src/libslic3r/PrintConfig.cpp:4708 msgid "Rotate around Y" msgstr "Обертати навколо осі Y" -#: src/libslic3r/PrintConfig.cpp:4543 +#: src/libslic3r/PrintConfig.cpp:4709 msgid "Rotation angle around the Y axis in degrees." msgstr "Кут обертання навколо осі Y у градусах." -#: src/libslic3r/PrintConfig.cpp:4548 +#: src/libslic3r/PrintConfig.cpp:4714 msgid "Scaling factor or percentage." msgstr "Коефіцієнт масштабування або відсоток." -#: src/libslic3r/PrintConfig.cpp:4553 +#: src/libslic3r/PrintConfig.cpp:4719 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." @@ -15029,29 +17027,37 @@ msgstr "" "Визначити непоєднані частини у даній моделі (моделях) та розділити їх на " "окремі об’єкти." -#: src/libslic3r/PrintConfig.cpp:4556 +#: src/libslic3r/PrintConfig.cpp:4722 msgid "Scale to Fit" msgstr "Масштабувати під область друку" -#: src/libslic3r/PrintConfig.cpp:4557 +#: src/libslic3r/PrintConfig.cpp:4723 msgid "Scale to fit the given volume." msgstr "Масштабувати під задану область друку." -#: src/libslic3r/PrintConfig.cpp:4566 +#: src/libslic3r/PrintConfig.cpp:4727 +msgid "Delete files after loading" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4728 +msgid "Delete files after loading." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4736 msgid "Ignore non-existent config files" msgstr "Ігнорувати неіснуючі конфігураційні файли" -#: src/libslic3r/PrintConfig.cpp:4567 +#: src/libslic3r/PrintConfig.cpp:4737 msgid "Do not fail if a file supplied to --load does not exist." msgstr "Не відмовляти, якщо файл, який подається до --load, не існує." -#: src/libslic3r/PrintConfig.cpp:4570 +#: src/libslic3r/PrintConfig.cpp:4740 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4741 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -15059,27 +17065,27 @@ msgid "" "substitute an unknown value with a default silently or verbosely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4745 msgid "Bail out on unknown configuration values" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4579 +#: src/libslic3r/PrintConfig.cpp:4746 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4580 +#: src/libslic3r/PrintConfig.cpp:4747 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4584 +#: src/libslic3r/PrintConfig.cpp:4752 msgid "Load config file" msgstr "Завантажити файл конфігурації" -#: src/libslic3r/PrintConfig.cpp:4585 +#: src/libslic3r/PrintConfig.cpp:4753 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -15087,11 +17093,11 @@ msgstr "" "Завантажити конфігурацію із зазначеного файлу. Його можна використовувати " "більше одного разу для завантаження опцій з декількох файлів." -#: src/libslic3r/PrintConfig.cpp:4588 +#: src/libslic3r/PrintConfig.cpp:4756 msgid "Output File" msgstr "Вихідний файл" -#: src/libslic3r/PrintConfig.cpp:4589 +#: src/libslic3r/PrintConfig.cpp:4757 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." @@ -15099,11 +17105,11 @@ msgstr "" "Файл, в який буде записано вихідні дані (якщо не вказано, він базуватиметься " "на вхідному файлі)." -#: src/libslic3r/PrintConfig.cpp:4593 +#: src/libslic3r/PrintConfig.cpp:4761 msgid "Single instance mode" msgstr "Режим одного екземпляру PrusaSlicer" -#: src/libslic3r/PrintConfig.cpp:4594 +#: src/libslic3r/PrintConfig.cpp:4762 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -15114,11 +17120,11 @@ msgstr "" "вікно PrusaSlicer. Замінює значення конфігурації \"single_instance\" у " "налаштуваннях програми." -#: src/libslic3r/PrintConfig.cpp:4605 +#: src/libslic3r/PrintConfig.cpp:4767 msgid "Data directory" msgstr "Каталог даних" -#: src/libslic3r/PrintConfig.cpp:4606 +#: src/libslic3r/PrintConfig.cpp:4768 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -15127,11 +17133,11 @@ msgstr "" "Завантажити та зберегти налаштування у вказаному каталозі. Це корисно для " "ведення різних профілів або включення конфігурацій із мережевого сховища." -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4771 msgid "Logging level" msgstr "Рівень журналізації" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4772 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -15142,11 +17148,11 @@ msgstr "" "Наприклад. loglevel=2 журнали фатальних, помилок і повідомлень рівня " "попередження." -#: src/libslic3r/PrintConfig.cpp:4616 +#: src/libslic3r/PrintConfig.cpp:4778 msgid "Render with a software renderer" msgstr "Візуалізувати за допомогою програмного засобу візуалізації" -#: src/libslic3r/PrintConfig.cpp:4617 +#: src/libslic3r/PrintConfig.cpp:4779 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -15159,18 +17165,30 @@ msgstr "" msgid "Error with zip archive" msgstr "Помилка ZIP-архіву" -#: src/libslic3r/PrintObject.cpp:126 +#: src/libslic3r/PrintObject.cpp:152 msgid "Generating perimeters" msgstr "Створення периметрів" -#: src/libslic3r/PrintObject.cpp:229 +#: src/libslic3r/PrintObject.cpp:257 msgid "Preparing infill" msgstr "Підготовка заповнення" -#: src/libslic3r/PrintObject.cpp:403 +#: src/libslic3r/PrintObject.cpp:402 +msgid "making infill" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:449 +msgid "Searching support spots" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:474 msgid "Generating support material" msgstr "Створення підтримок" +#: src/libslic3r/PrintObject.cpp:495 +msgid "Estimating curled extrusions" +msgstr "" + #: resources/data/hints.ini: [hint:Fuzzy skin] msgid "" "Fuzzy skin\n" @@ -15441,6 +17459,36 @@ msgid "" "F11 hotkey." msgstr "" +#: resources/data/hints.ini: [hint:Printables integration] +msgid "" +"Printables.com integration\n" +"Did you know that when you are browsing Printables.com, you can send 3D " +"model files to PrusaSlicer with a single click? Learn more in the " +"documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Cut tool] +msgid "" +"Cut tool\n" +"Did you know that you can cut a model at any angle and even create aligning " +"pins with the updated Cut tool? Learn more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Measurement tool] +msgid "" +"Measurement tool\n" +"Did you know that you can measure the distances between points, edges " +"and planes, the radius of a hole or the angle between edges or planes? Learn " +"more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Text tool] +msgid "" +"Text tool\n" +"Did you know that you can add custom text labels to your models or even use " +"the text as a modifier? Learn more in the documentation." +msgstr "" + #: ../src/common/debugrpt.cpp:586 msgid "" "\n" @@ -16599,6 +18647,10 @@ msgstr "Вирівняти ліворуч" msgid "Align Right" msgstr "Вирівняти праворуч" +#: ../src/richtext/richtextsizepage.cpp:266 +msgid "Alignment" +msgstr "Вирівнювання" + #: ../src/generic/filectrlg.cpp:1197 ../src/common/fldlgcmn.cpp:107 #, c-format msgid "All files (%s)|%s" @@ -17907,10 +19959,6 @@ msgstr "Декоративний" msgid "Default encoding" msgstr "Типове кодування" -#: ../src/dfb/fontmgr.cpp:180 -msgid "Default font" -msgstr "Типовий шрифт" - #: ../src/generic/prntdlgg.cpp:510 msgid "Default printer" msgstr "Типова друкарка" @@ -18279,11 +20327,6 @@ msgstr "Помилка під час друку: " msgid "Error: " msgstr "Помилка: " -#. TRANSLATORS: Name of keyboard key -#: ../src/common/accelcmn.cpp:69 -msgid "Esc" -msgstr "" - #. TRANSLATORS: Name of keyboard key #: ../src/common/accelcmn.cpp:70 #, fuzzy @@ -19038,11 +21081,6 @@ msgstr "Дискета" msgid "Folio, 8 1/2 x 13 in" msgstr "Folio, 8 1/2 x 13 дюйм" -#: ../src/richtext/richtextformatdlg.cpp:344 ../src/osx/carbon/fontdlg.cpp:287 -#: ../src/common/stockitem.cpp:194 -msgid "Font" -msgstr "Шрифт" - #: ../src/richtext/richtextfontpage.cpp:221 msgid "Font &weight:" msgstr "Вага шри&фту:" @@ -20179,10 +22217,6 @@ msgstr "Пам'ять VFS вже має файл «%s»!" msgid "Menu" msgstr "Меню" -#: ../src/common/msgout.cpp:124 -msgid "Message" -msgstr "Повідомлення" - #: ../src/univ/themes/metal.cpp:168 msgid "Metal theme" msgstr "Металічний мотив" @@ -20216,10 +22250,6 @@ msgstr "Не виявлено потрібного параметра." msgid "Modern" msgstr "Модерний" -#: ../src/generic/filectrlg.cpp:427 -msgid "Modified" -msgstr "Змінено" - #: ../src/common/module.cpp:133 #, c-format msgid "Module \"%s\" initialization failed" @@ -20310,11 +22340,6 @@ msgstr "НоваНазва" msgid "Next page" msgstr "Наступна сторінка" -#: ../include/wx/msgdlg.h:277 ../src/common/stockitem.cpp:177 -#: ../src/motif/msgdlg.cpp:196 -msgid "No" -msgstr "Ні" - #. TRANSLATORS: System cursor name #: ../src/propgrid/advprops.cpp:1764 msgid "No Entry" @@ -20555,12 +22580,6 @@ msgstr "" msgid "Numbered outline" msgstr "Нумерована структура" -#: ../include/wx/msgdlg.h:278 ../src/richtext/richtextstyledlg.cpp:297 -#: ../src/common/stockitem.cpp:178 ../src/msw/msgdlg.cpp:454 -#: ../src/msw/msgdlg.cpp:747 ../src/gtk1/fontdlg.cpp:138 -msgid "OK" -msgstr "Гаразд" - #: ../src/msw/ole/automtn.cpp:692 #, c-format msgid "OLE Automation error in %s: %s" @@ -20632,6 +22651,10 @@ msgstr "Параметр «%s» потребує значення." msgid "Option '%s': '%s' cannot be converted to a date." msgstr "Параметр «%s»: «%s» не може бути конвертована у дату." +#: ../src/generic/prntdlgg.cpp:618 +msgid "Options" +msgstr "Параметри" + #: ../src/propgrid/advprops.cpp:1606 msgid "Orange" msgstr "Помаранчевий" @@ -21423,10 +23446,6 @@ msgstr "Оберіть звичайний або курсивний стиль." msgid "Select underlining or no underlining." msgstr "Виберіть, чи буде текст підкреслено." -#: ../src/motif/filedlg.cpp:220 -msgid "Selection" -msgstr "Позначене" - #: ../src/richtext/richtextliststylepage.cpp:187 #: ../src/richtext/richtextliststylepage.cpp:189 msgid "Selects the list level to edit." @@ -22324,10 +24343,6 @@ msgstr "" msgid "Turkish (ISO-8859-9)" msgstr "Turkish (ISO-8859-9)" -#: ../src/generic/filectrlg.cpp:426 -msgid "Type" -msgstr "Тип" - #: ../src/richtext/richtextfontpage.cpp:151 #: ../src/richtext/richtextfontpage.cpp:153 msgid "Type a font name." @@ -22815,10 +24830,6 @@ msgstr "Використовувати поточні параметри вир msgid "Validation conflict" msgstr "Конфлікт перевірки" -#: ../src/propgrid/manager.cpp:238 -msgid "Value" -msgstr "Значення" - #: ../src/propgrid/props.cpp:386 ../src/propgrid/props.cpp:500 #, c-format msgid "Value must be %s or higher." @@ -23054,11 +25065,6 @@ msgstr "XPM: обрізані дані картинки у рядку %d!" msgid "Yellow" msgstr "Жовтий" -#: ../include/wx/msgdlg.h:276 ../src/common/stockitem.cpp:206 -#: ../src/motif/msgdlg.cpp:196 -msgid "Yes" -msgstr "Так" - #: ../src/osx/carbon/overlay.cpp:155 msgid "You cannot Clear an overlay that is not inited" msgstr "Ви не можете спорожнити оверлей, який не ініційовано" diff --git a/resources/localization/zh_CN/PrusaSlicer.mo b/resources/localization/zh_CN/PrusaSlicer.mo index 5937155e3d59bf89b7a67202a87fe6e8e1cbf14f..797d7b00550fab53bf82ed13e71043013d753d31 100644 GIT binary patch delta 97018 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

y>+JzPReo(Gl4 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%0D=dQ$>wijLVgjgO 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 F{ttAr;gJ9U diff --git a/resources/localization/zh_CN/PrusaSlicer_zh_CN.po b/resources/localization/zh_CN/PrusaSlicer_zh_CN.po index c0daf13e7d1..631d9836256 100644 --- a/resources/localization/zh_CN/PrusaSlicer_zh_CN.po +++ b/resources/localization/zh_CN/PrusaSlicer_zh_CN.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-01 16:30+0100\n" +"POT-Creation-Date: 2023-03-03 14:25+0100\n" "PO-Revision-Date: 2022-08-22 12:37+0800\n" "Last-Translator: Bral@qq.com\n" "Language-Team: \n" @@ -18,48 +18,48 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 3.1\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 +#: src/slic3r/GUI/AboutDialog.cpp:46 src/slic3r/GUI/AboutDialog.cpp:306 msgid "Portions copyright" msgstr "部分版权" -#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 +#: src/slic3r/GUI/AboutDialog.cpp:143 src/slic3r/GUI/AboutDialog.cpp:270 msgid "Copyright" msgstr "版权所有" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:143 +#: src/slic3r/GUI/AboutDialog.cpp:145 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" msgstr "所有以下程序(库)的许可协议是应用程序许可协议的一部分" -#: src/slic3r/GUI/AboutDialog.cpp:212 +#: src/slic3r/GUI/AboutDialog.cpp:214 #, c-format, boost-format msgid "About %s" msgstr "关于 %s" -#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 -#: src/slic3r/GUI/GUI_App.cpp:262 +#: src/slic3r/GUI/AboutDialog.cpp:245 src/slic3r/GUI/AboutDialog.cpp:370 +#: src/slic3r/GUI/GUI_App.cpp:271 msgid "Version" msgstr "版本" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:277 msgid "is licensed under the" msgstr "根据" -#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:273 src/slic3r/GUI/GUI_App.cpp:277 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero 通用公共许可证,第 3 版" -#: src/slic3r/GUI/AboutDialog.cpp:273 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." msgstr "" "PrusaSlicer 是以 Alessandro Ranellucci 和 RepRap 社区的 Slic3r 为基础的。" -#: src/slic3r/GUI/AboutDialog.cpp:274 +#: src/slic3r/GUI/AboutDialog.cpp:275 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -68,7 +68,7 @@ msgstr "" "Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph " "Lenox, Y.Sapir, Mike Sheldrake, Vojtech Bubnik 等人的贡献。" -#: src/slic3r/GUI/AboutDialog.cpp:310 +#: src/slic3r/GUI/AboutDialog.cpp:311 msgid "Copy Version Info" msgstr "复制版本信息" @@ -95,54 +95,54 @@ msgstr "" "请保存项目并重新启动 PrusaSlicer。如果你能报告这个问题,我们会很高兴的。" #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:162 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:204 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:188 msgid "Slicing complete" msgstr "切片完成" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:199 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183 #, boost-format msgid "Masked SLA file exported to %1%" msgstr "已将掩蔽 SLA 文件导出到 %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:286 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:279 msgid "Access violation" msgstr "访问冲突" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:288 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:281 msgid "Illegal instruction" msgstr "非法指令" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:283 msgid "Divide by zero" msgstr "除以零" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:292 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:285 msgid "Overflow" msgstr "溢出" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:294 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:287 msgid "Underflow" msgstr "下溢" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:297 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 msgid "Floating reserved operand" msgstr "浮动保留操作数" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:300 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:293 msgid "Stack overflow" msgstr "栈溢出" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:659 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:726 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:652 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:719 msgid "Running post-processing scripts" msgstr "运行后处理脚本" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:690 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:710 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:683 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:703 msgid "Unknown error occured during exporting G-code." msgstr "导出 G-Code 时出现未知错误。" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:695 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:688 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. Maybe the SD " @@ -152,7 +152,7 @@ msgstr "" "将临时 G-Code 复制到输出 G-Code 失败。也许 SD 卡被写锁定了?\n" "错误消息:%1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:698 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:691 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. There might be " @@ -162,7 +162,7 @@ msgstr "" "将临时 G-Code 复制到输出 G-Code 失败。目标设备可能有问题,请再次尝试导出或使" "用其他设备。损坏的输出 G-Code 在 %1%.tmp。" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:701 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:694 #, boost-format msgid "" "Renaming of the G-code after copying to the selected destination folder has " @@ -171,7 +171,7 @@ msgstr "" "复制到所选目标文件夹后重命名 G-Code 失败。当前路径为 %1%.tmp。请再次尝试导" "出。" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:704 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:697 #, boost-format msgid "" "Copying of the temporary G-code has finished but the original code at %1% " @@ -180,7 +180,7 @@ msgstr "" "临时 G-Code 的复制已完成,但在复制检查期间无法打开位于 %1% 的原始代码。输出 " "G-Code 为 %2%.tmp。" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:707 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:700 #, boost-format msgid "" "Copying of the temporary G-code has finished but the exported code couldn't " @@ -189,23 +189,24 @@ msgstr "" "临时 G-Code 的复制已完成,但在复制检查期间无法打开导出的代码。输出 G-Code 为 " "%1%.tmp。" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:715 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:708 #, boost-format msgid "G-code file exported to %1%" msgstr "G-Code 文件导出到 %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:729 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:722 msgid "Copying of the temporary G-code to the output G-code failed" msgstr "将临时 G-Code 复制到输出 G-Code 失败" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:751 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:738 #, boost-format msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "计划上传到 `%1%`。请参阅窗口-> 打印主机上传队列" #: src/slic3r/GUI/BedShapeDialog.cpp:31 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2765 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1576 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:241 src/slic3r/GUI/Plater.cpp:220 +#: src/slic3r/GUI/Tab.cpp:2697 msgid "Size" msgstr "大小" @@ -213,7 +214,9 @@ msgstr "大小" msgid "Origin" msgstr "起源" -#: src/slic3r/GUI/BedShapeDialog.cpp:33 src/libslic3r/PrintConfig.cpp:1020 +#: src/slic3r/GUI/BedShapeDialog.cpp:33 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1994 +#: src/libslic3r/PrintConfig.cpp:1109 msgid "Diameter" msgstr "直径" @@ -227,54 +230,62 @@ msgid "" "rectangle." msgstr "G-Code 0,0 坐标相对于矩形框左前角的距离。" -#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:262 -#: src/slic3r/GUI/ConfigWizard.cpp:1476 src/slic3r/GUI/ConfigWizard.cpp:1490 +#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:291 +#: src/slic3r/GUI/ConfigWizard.cpp:1796 src/slic3r/GUI/ConfigWizard.cpp:1832 +#: src/slic3r/GUI/ConfigWizard.cpp:1846 #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:100 -#: src/slic3r/GUI/GCodeViewer.cpp:3181 src/slic3r/GUI/GCodeViewer.cpp:3187 -#: src/slic3r/GUI/GCodeViewer.cpp:3195 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 src/slic3r/GUI/GCodeViewer.cpp:3455 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 #: src/slic3r/GUI/GUI_ObjectLayers.cpp:145 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 src/libslic3r/PrintConfig.cpp:263 -#: src/libslic3r/PrintConfig.cpp:290 src/libslic3r/PrintConfig.cpp:297 -#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:520 -#: src/libslic3r/PrintConfig.cpp:546 src/libslic3r/PrintConfig.cpp:621 -#: src/libslic3r/PrintConfig.cpp:629 src/libslic3r/PrintConfig.cpp:679 -#: src/libslic3r/PrintConfig.cpp:813 src/libslic3r/PrintConfig.cpp:824 -#: src/libslic3r/PrintConfig.cpp:842 src/libslic3r/PrintConfig.cpp:1023 -#: src/libslic3r/PrintConfig.cpp:1235 src/libslic3r/PrintConfig.cpp:1302 -#: src/libslic3r/PrintConfig.cpp:1312 src/libslic3r/PrintConfig.cpp:1611 -#: src/libslic3r/PrintConfig.cpp:1805 src/libslic3r/PrintConfig.cpp:1866 -#: src/libslic3r/PrintConfig.cpp:1884 src/libslic3r/PrintConfig.cpp:1902 -#: src/libslic3r/PrintConfig.cpp:1965 src/libslic3r/PrintConfig.cpp:1975 -#: src/libslic3r/PrintConfig.cpp:2097 src/libslic3r/PrintConfig.cpp:2106 -#: src/libslic3r/PrintConfig.cpp:2125 src/libslic3r/PrintConfig.cpp:2146 -#: src/libslic3r/PrintConfig.cpp:2158 src/libslic3r/PrintConfig.cpp:2166 -#: src/libslic3r/PrintConfig.cpp:2207 src/libslic3r/PrintConfig.cpp:2215 -#: src/libslic3r/PrintConfig.cpp:2225 src/libslic3r/PrintConfig.cpp:2233 -#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2303 -#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2603 -#: src/libslic3r/PrintConfig.cpp:2620 src/libslic3r/PrintConfig.cpp:2721 -#: src/libslic3r/PrintConfig.cpp:2730 src/libslic3r/PrintConfig.cpp:2780 -#: src/libslic3r/PrintConfig.cpp:2932 src/libslic3r/PrintConfig.cpp:3020 -#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3034 -#: src/libslic3r/PrintConfig.cpp:3048 src/libslic3r/PrintConfig.cpp:3072 -#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3092 -#: src/libslic3r/PrintConfig.cpp:3372 src/libslic3r/PrintConfig.cpp:3413 -#: src/libslic3r/PrintConfig.cpp:3573 src/libslic3r/PrintConfig.cpp:3582 -#: src/libslic3r/PrintConfig.cpp:3591 src/libslic3r/PrintConfig.cpp:3601 -#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3676 -#: src/libslic3r/PrintConfig.cpp:3688 src/libslic3r/PrintConfig.cpp:3708 -#: src/libslic3r/PrintConfig.cpp:3718 src/libslic3r/PrintConfig.cpp:3728 -#: src/libslic3r/PrintConfig.cpp:3746 src/libslic3r/PrintConfig.cpp:3761 -#: src/libslic3r/PrintConfig.cpp:3775 src/libslic3r/PrintConfig.cpp:3786 -#: src/libslic3r/PrintConfig.cpp:3799 src/libslic3r/PrintConfig.cpp:3844 -#: src/libslic3r/PrintConfig.cpp:3854 src/libslic3r/PrintConfig.cpp:3863 -#: src/libslic3r/PrintConfig.cpp:3873 src/libslic3r/PrintConfig.cpp:3889 -#: src/libslic3r/PrintConfig.cpp:3913 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 src/libslic3r/PrintConfig.cpp:279 +#: src/libslic3r/PrintConfig.cpp:303 src/libslic3r/PrintConfig.cpp:310 +#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:657 src/libslic3r/PrintConfig.cpp:724 +#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:782 +#: src/libslic3r/PrintConfig.cpp:902 src/libslic3r/PrintConfig.cpp:913 +#: src/libslic3r/PrintConfig.cpp:931 src/libslic3r/PrintConfig.cpp:1112 +#: src/libslic3r/PrintConfig.cpp:1295 src/libslic3r/PrintConfig.cpp:1359 +#: src/libslic3r/PrintConfig.cpp:1369 src/libslic3r/PrintConfig.cpp:1650 +#: src/libslic3r/PrintConfig.cpp:1842 src/libslic3r/PrintConfig.cpp:1903 +#: src/libslic3r/PrintConfig.cpp:1921 src/libslic3r/PrintConfig.cpp:1939 +#: src/libslic3r/PrintConfig.cpp:1995 src/libslic3r/PrintConfig.cpp:2005 +#: src/libslic3r/PrintConfig.cpp:2127 src/libslic3r/PrintConfig.cpp:2136 +#: src/libslic3r/PrintConfig.cpp:2155 src/libslic3r/PrintConfig.cpp:2176 +#: src/libslic3r/PrintConfig.cpp:2188 src/libslic3r/PrintConfig.cpp:2196 +#: src/libslic3r/PrintConfig.cpp:2237 src/libslic3r/PrintConfig.cpp:2245 +#: src/libslic3r/PrintConfig.cpp:2255 src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2271 src/libslic3r/PrintConfig.cpp:2336 +#: src/libslic3r/PrintConfig.cpp:2565 src/libslic3r/PrintConfig.cpp:2632 +#: src/libslic3r/PrintConfig.cpp:2647 src/libslic3r/PrintConfig.cpp:2746 +#: src/libslic3r/PrintConfig.cpp:2755 src/libslic3r/PrintConfig.cpp:2801 +#: src/libslic3r/PrintConfig.cpp:2886 src/libslic3r/PrintConfig.cpp:2896 +#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3108 +#: src/libslic3r/PrintConfig.cpp:3115 src/libslic3r/PrintConfig.cpp:3122 +#: src/libslic3r/PrintConfig.cpp:3136 src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3170 src/libslic3r/PrintConfig.cpp:3180 +#: src/libslic3r/PrintConfig.cpp:3330 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3391 src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3444 src/libslic3r/PrintConfig.cpp:3456 +#: src/libslic3r/PrintConfig.cpp:3476 src/libslic3r/PrintConfig.cpp:3491 +#: src/libslic3r/PrintConfig.cpp:3501 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3681 src/libslic3r/PrintConfig.cpp:3878 +#: src/libslic3r/PrintConfig.cpp:3893 src/libslic3r/PrintConfig.cpp:3907 +#: src/libslic3r/PrintConfig.cpp:3918 src/libslic3r/PrintConfig.cpp:3931 +#: src/libslic3r/PrintConfig.cpp:3976 src/libslic3r/PrintConfig.cpp:3986 +#: src/libslic3r/PrintConfig.cpp:3995 src/libslic3r/PrintConfig.cpp:4005 +#: src/libslic3r/PrintConfig.cpp:4021 src/libslic3r/PrintConfig.cpp:4045 +#: src/libslic3r/PrintConfig.cpp:4072 msgid "mm" msgstr "mm" @@ -292,13 +303,13 @@ msgstr "矩形" msgid "Circular" msgstr "圆形" -#: src/slic3r/GUI/BedShapeDialog.cpp:81 src/slic3r/GUI/GUI_Preview.cpp:252 -#: src/libslic3r/ExtrusionEntity.cpp:343 src/libslic3r/ExtrusionEntity.cpp:378 +#: src/slic3r/GUI/BedShapeDialog.cpp:81 msgid "Custom" msgstr "自定义" #: src/slic3r/GUI/BedShapeDialog.cpp:104 src/slic3r/GUI/BedShapeDialog.cpp:179 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1701 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1565 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1798 msgid "Shape" msgstr "形状" @@ -306,8 +317,8 @@ msgstr "形状" msgid "Load shape from STL..." msgstr "从 STL 文件加载形状..." -#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2147 +#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3914 +#: src/slic3r/GUI/MainFrame.cpp:2240 msgid "Settings" msgstr "设置" @@ -320,7 +331,7 @@ msgid "Load..." msgstr "加载..." #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/Tab.cpp:3973 msgid "Remove" msgstr "移除" @@ -332,87 +343,154 @@ msgstr "没有找到:" msgid "Model" msgstr "模型" -#: src/slic3r/GUI/BedShapeDialog.cpp:508 +#: src/slic3r/GUI/BedShapeDialog.cpp:506 msgid "Choose an STL file to import bed shape from:" msgstr "选择 STL 文件以从以下对象导入床形:" -#: src/slic3r/GUI/BedShapeDialog.cpp:514 src/slic3r/GUI/BedShapeDialog.cpp:562 -#: src/slic3r/GUI/BedShapeDialog.cpp:584 +#: src/slic3r/GUI/BedShapeDialog.cpp:512 src/slic3r/GUI/BedShapeDialog.cpp:560 +#: src/slic3r/GUI/BedShapeDialog.cpp:582 msgid "Invalid file format." msgstr "无效的文件格式。" -#: src/slic3r/GUI/BedShapeDialog.cpp:525 +#: src/slic3r/GUI/BedShapeDialog.cpp:523 msgid "Error! Invalid model" msgstr "错误!无效模型" -#: src/slic3r/GUI/BedShapeDialog.cpp:533 +#: src/slic3r/GUI/BedShapeDialog.cpp:531 msgid "The selected file contains no geometry." msgstr "所选文件不包含任何几何图形。" -#: src/slic3r/GUI/BedShapeDialog.cpp:537 +#: src/slic3r/GUI/BedShapeDialog.cpp:535 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "所选文件包含多个不重合的区域。暂不支持这种类型。" -#: src/slic3r/GUI/BedShapeDialog.cpp:552 +#: src/slic3r/GUI/BedShapeDialog.cpp:550 msgid "Choose a file to import bed texture from (PNG/SVG):" msgstr "选择文件 (PNG/SVG) 导入床纹理:" -#: src/slic3r/GUI/BedShapeDialog.cpp:574 +#: src/slic3r/GUI/BedShapeDialog.cpp:572 msgid "Choose an STL file to import bed model from:" msgstr "选择 STL 文件来导入床模型:" -#: src/slic3r/GUI/BedShapeDialog.hpp:95 src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/BedShapeDialog.hpp:96 src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape" msgstr "热床形状" -#: src/slic3r/GUI/BonjourDialog.cpp:55 +#: src/slic3r/GUI/BonjourDialog.cpp:58 msgid "Network lookup" msgstr "从网络查找" -#: src/slic3r/GUI/BonjourDialog.cpp:72 +#: src/slic3r/GUI/BonjourDialog.cpp:75 src/slic3r/GUI/BonjourDialog.cpp:253 msgid "Address" msgstr "地址" -#: src/slic3r/GUI/BonjourDialog.cpp:73 +#: src/slic3r/GUI/BonjourDialog.cpp:76 msgid "Hostname" msgstr "主机名" -#: src/slic3r/GUI/BonjourDialog.cpp:74 +#: src/slic3r/GUI/BonjourDialog.cpp:77 msgid "Service name" msgstr "服务名称" -#: src/slic3r/GUI/BonjourDialog.cpp:76 +#: src/slic3r/GUI/BonjourDialog.cpp:79 msgid "OctoPrint version" msgstr "OctoPrint 版本" -#: src/slic3r/GUI/BonjourDialog.cpp:224 +#: src/slic3r/GUI/BonjourDialog.cpp:227 msgid "Searching for devices" msgstr "正在查找设备" -#: src/slic3r/GUI/BonjourDialog.cpp:231 +#: src/slic3r/GUI/BonjourDialog.cpp:234 msgid "Finished" msgstr "已完成" -#: src/slic3r/GUI/ButtonsDescription.cpp:42 +#: src/slic3r/GUI/BonjourDialog.cpp:240 +msgid "Multiple resolved IP addresses" +msgstr "" + +#: src/slic3r/GUI/BonjourDialog.cpp:249 +#, boost-format +msgid "" +"There are several IP addresses resolving to hostname %1%.\n" +"Please select one that should be used." +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:21 +msgid "Palette 1 (default)" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:22 +msgid "Palette 2" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:23 +msgid "Palette 3" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:24 +msgid "Palette 4" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:25 +msgid "Palette 5" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:26 +msgid "Palette 6" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:27 +msgid "Palette 7" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:28 +msgid "Palette 8" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:112 msgid "Revert color to default" msgstr "将颜色恢复为默认值" -#: src/slic3r/GUI/ButtonsDescription.cpp:57 +#: src/slic3r/GUI/ButtonsDescription.cpp:127 msgid "Value is the same as the system value" msgstr "值与系统值相同" -#: src/slic3r/GUI/ButtonsDescription.cpp:58 +#: src/slic3r/GUI/ButtonsDescription.cpp:128 msgid "" "Value was changed and is not equal to the system value or the last saved " "preset" msgstr "值已更改, 不等于系统值或上次保存的预设值" -#: src/slic3r/GUI/ButtonsDescription.cpp:62 +#: src/slic3r/GUI/ButtonsDescription.cpp:155 +msgid "Default palette for mode markers" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2422 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Simple" +msgstr "简单" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2424 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgctxt "Mode" +msgid "Advanced" +msgstr "高级" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2425 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Expert" +msgstr "专家" + +#: src/slic3r/GUI/ButtonsDescription.cpp:182 +msgid "Revert color" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:200 msgid "Buttons And Text Colors Description" msgstr "按钮和文本颜色描述" -#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/ConfigManipulation.cpp:50 msgid "" "Layer height is not valid.\n" "\n" @@ -422,13 +500,13 @@ msgstr "" "\n" "层高度将重置为 0.01。" -#: src/slic3r/GUI/ConfigManipulation.cpp:50 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1449 -#: src/libslic3r/PrintConfig.cpp:286 +#: src/slic3r/GUI/ConfigManipulation.cpp:51 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1394 +#: src/libslic3r/PrintConfig.cpp:299 msgid "Layer height" msgstr "层高度" -#: src/slic3r/GUI/ConfigManipulation.cpp:61 +#: src/slic3r/GUI/ConfigManipulation.cpp:62 msgid "" "First layer height is not valid.\n" "\n" @@ -438,7 +516,7 @@ msgstr "" "\n" "第一层高度将重置为 0.01。" -#: src/slic3r/GUI/ConfigManipulation.cpp:62 src/libslic3r/PrintConfig.cpp:1231 +#: src/slic3r/GUI/ConfigManipulation.cpp:63 src/libslic3r/PrintConfig.cpp:1291 msgid "First layer height" msgstr "第一层高度" @@ -449,7 +527,6 @@ msgid "" "- no top solid layers\n" "- 0% fill density\n" "- no support material\n" -"- Ensure vertical shell thickness enabled\n" "- Detect thin walls disabled" msgstr "" "螺旋花瓶模式需要:\n" @@ -457,49 +534,47 @@ msgstr "" "- 无顶部固体层\n" "- 0% 填充密度\n" "- 无支撑材料\n" -"- 确保启用垂直外壳厚度\n" "- 禁用检测薄壁" -#: src/slic3r/GUI/ConfigManipulation.cpp:90 +#: src/slic3r/GUI/ConfigManipulation.cpp:89 msgid "Shall I adjust those settings in order to enable Spiral Vase?" msgstr "要我调整这些设置以启用螺旋花瓶吗?" -#: src/slic3r/GUI/ConfigManipulation.cpp:91 +#: src/slic3r/GUI/ConfigManipulation.cpp:90 msgid "Spiral Vase" msgstr "螺旋花瓶" -#: src/slic3r/GUI/ConfigManipulation.cpp:121 +#: src/slic3r/GUI/ConfigManipulation.cpp:123 msgid "" -"The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool " -"change.\n" -"(both support_material_extruder and support_material_interface_extruder need " -"to be set to 0)." -msgstr "" -"擦拭塔目前仅支持使用当前挤出机打印的不可溶支架\n" -"如果它们是用当前的挤出机打印而不触发工具更换。\n" -"(需要将 支撑材料挤出机 和 支撑材料界面挤出机 设置为0)。" - -#: src/slic3r/GUI/ConfigManipulation.cpp:125 -msgid "Shall I adjust those settings in order to enable the Wipe Tower?" -msgstr "我要调整这些设置以启用擦拭塔吗?" +"For the Wipe Tower to work with the soluble supports, the support layers\n" +"need to be synchronized with the object layers." +msgstr "为了使擦拭塔与可溶支架一起工作,支架层需要与对象层同步。" #: src/slic3r/GUI/ConfigManipulation.cpp:126 -#: src/slic3r/GUI/ConfigManipulation.cpp:146 +msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" +msgstr "我要同步支撑层以启用擦拭塔吗?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:127 +#: src/slic3r/GUI/ConfigManipulation.cpp:145 msgid "Wipe Tower" msgstr "擦拭塔" -#: src/slic3r/GUI/ConfigManipulation.cpp:142 +#: src/slic3r/GUI/ConfigManipulation.cpp:140 src/libslic3r/Print.cpp:672 msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers\n" -"need to be synchronized with the object layers." -msgstr "为了使擦拭塔与可溶支架一起工作,支架层需要与对象层同步。" +"The Wipe Tower currently supports the non-soluble supports only if they are " +"printed with the current extruder without triggering a tool change. (both " +"support_material_extruder and support_material_interface_extruder need to be " +"set to 0)." +msgstr "" +"只有在不触发工具更改的情况下, 使用当前挤出机打印的未溶性支撑塔目前才支持不可" +"溶支撑于的支架。(support_material_extruder 和 " +"support_material_interface_extruder 都需要设置为 0)。" -#: src/slic3r/GUI/ConfigManipulation.cpp:145 -msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" -msgstr "我要同步支撑层以启用擦拭塔吗?" +#: src/slic3r/GUI/ConfigManipulation.cpp:144 +msgid "Shall I adjust those settings in order to enable the Wipe Tower?" +msgstr "我要调整这些设置以启用擦拭塔吗?" -#: src/slic3r/GUI/ConfigManipulation.cpp:164 +#: src/slic3r/GUI/ConfigManipulation.cpp:166 msgid "" "Supports work better, if the following feature is enabled:\n" "- Detect bridging perimeters" @@ -507,184 +582,188 @@ msgstr "" "如果启用以下功能,则支撑工作得更好:\n" "- 检测桥接周长" -#: src/slic3r/GUI/ConfigManipulation.cpp:167 +#: src/slic3r/GUI/ConfigManipulation.cpp:169 msgid "Shall I adjust those settings for supports?" msgstr "我要调整这些设置以获得支撑吗?" -#: src/slic3r/GUI/ConfigManipulation.cpp:168 +#: src/slic3r/GUI/ConfigManipulation.cpp:170 msgid "Support Generator" msgstr "支撑生成器" -#: src/slic3r/GUI/ConfigManipulation.cpp:195 +#: src/slic3r/GUI/ConfigManipulation.cpp:194 #, boost-format msgid "The %1% infill pattern is not supposed to work at 100%% density." msgstr "%1% 填充图案不支持在 100%% 密度下使用。" -#: src/slic3r/GUI/ConfigManipulation.cpp:198 +#: src/slic3r/GUI/ConfigManipulation.cpp:196 msgid "Shall I switch to rectilinear fill pattern?" msgstr "我要换成直线填充模式吗?" -#: src/slic3r/GUI/ConfigManipulation.cpp:199 +#: src/slic3r/GUI/ConfigManipulation.cpp:197 #: src/slic3r/GUI/GUI_Factories.cpp:55 src/slic3r/GUI/GUI_Factories.cpp:128 -#: src/slic3r/GUI/Plater.cpp:460 src/slic3r/GUI/Tab.cpp:1503 -#: src/slic3r/GUI/Tab.cpp:1505 src/libslic3r/PrintConfig.cpp:475 -#: src/libslic3r/PrintConfig.cpp:716 src/libslic3r/PrintConfig.cpp:743 -#: src/libslic3r/PrintConfig.cpp:1098 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1149 src/libslic3r/PrintConfig.cpp:1398 -#: src/libslic3r/PrintConfig.cpp:1427 src/libslic3r/PrintConfig.cpp:1496 -#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1535 -#: src/libslic3r/PrintConfig.cpp:2364 src/libslic3r/PrintConfig.cpp:2381 +#: src/slic3r/GUI/Plater.cpp:468 src/slic3r/GUI/Tab.cpp:1450 +#: src/slic3r/GUI/Tab.cpp:1452 src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:811 src/libslic3r/PrintConfig.cpp:831 +#: src/libslic3r/PrintConfig.cpp:1187 src/libslic3r/PrintConfig.cpp:1200 +#: src/libslic3r/PrintConfig.cpp:1225 src/libslic3r/PrintConfig.cpp:1444 +#: src/libslic3r/PrintConfig.cpp:1473 src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1557 src/libslic3r/PrintConfig.cpp:1576 +#: src/libslic3r/PrintConfig.cpp:2395 src/libslic3r/PrintConfig.cpp:2412 msgid "Infill" msgstr "填充" -#: src/slic3r/GUI/ConfigManipulation.cpp:337 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Head penetration should not be greater than the head width." msgstr "头部穿透不应大于头部宽度。" -#: src/slic3r/GUI/ConfigManipulation.cpp:339 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid Head penetration" msgstr "无效头部穿透" -#: src/slic3r/GUI/ConfigManipulation.cpp:350 +#: src/slic3r/GUI/ConfigManipulation.cpp:362 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "针头直径应小于支柱直径。" -#: src/slic3r/GUI/ConfigManipulation.cpp:352 +#: src/slic3r/GUI/ConfigManipulation.cpp:364 msgid "Invalid pinhead diameter" msgstr "无效的针头直径" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20 msgid "Upgrade" msgstr "升级" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22 msgid "Downgrade" msgstr "降级" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 msgid "Before roll back" msgstr "回滚前" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:340 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:26 src/libslic3r/PrintConfig.cpp:353 msgid "User" msgstr "用户" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:329 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:29 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1135 msgid "Unknown" msgstr "未知" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 msgid "Active" msgstr "激活" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 msgid "PrusaSlicer version" msgstr "PrusaSlicer 版本" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 src/libslic3r/Preset.cpp:1341 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 src/libslic3r/Preset.cpp:1480 msgid "print" msgstr "打印" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:65 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 msgid "filaments" msgstr "耗材" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 src/libslic3r/Preset.cpp:1343 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:67 src/libslic3r/Preset.cpp:1482 msgid "SLA print" msgstr "SLA 打印" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69 -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/slic3r/GUI/GUI.cpp:340 -#: src/slic3r/GUI/Plater.cpp:821 src/libslic3r/Preset.cpp:1344 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/slic3r/GUI/GUI.cpp:331 +#: src/slic3r/GUI/Plater.cpp:851 src/libslic3r/Preset.cpp:1483 msgid "SLA material" msgstr "SLA 材料" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:71 src/libslic3r/Preset.cpp:1345 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 src/libslic3r/Preset.cpp:1484 msgid "printer" msgstr "打印机" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 src/slic3r/GUI/Tab.cpp:1366 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 src/slic3r/GUI/Tab.cpp:1311 msgid "vendor" msgstr "供应商" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 msgid "version" msgstr "版本" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:76 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 msgid "min PrusaSlicer version" msgstr "最低 PrusaSlicer 版本" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:77 msgid "max PrusaSlicer version" msgstr "最高 PrusaSlicer 版本" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "model" msgstr "模型" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "variants" msgstr "变种" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:93 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:92 #, c-format, boost-format msgid "Incompatible with this %s" msgstr "与此 %s 不兼容" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:96 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:95 msgid "Activate" msgstr "激活" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:123 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:122 msgid "Configuration Snapshots" msgstr "配置快照" -#: src/slic3r/GUI/ConfigWizard.cpp:262 +#: src/slic3r/GUI/ConfigWizard.cpp:291 msgid "nozzle" msgstr "喷嘴" -#: src/slic3r/GUI/ConfigWizard.cpp:266 +#: src/slic3r/GUI/ConfigWizard.cpp:295 msgid "Alternate nozzles:" msgstr "备用喷嘴:" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "All standard" msgstr "所有标准" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "Standard" msgstr "标准" -#: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3833 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 +#: src/slic3r/GUI/ConfigWizard.cpp:360 src/slic3r/GUI/ConfigWizard.cpp:681 +#: src/slic3r/GUI/FileArchiveDialog.cpp:261 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 src/slic3r/GUI/Preferences.cpp:550 +#: src/slic3r/GUI/Tab.cpp:4058 src/slic3r/GUI/UnsavedChangesDialog.cpp:1161 msgid "All" msgstr "所有" -#: src/slic3r/GUI/ConfigWizard.cpp:332 src/slic3r/GUI/ConfigWizard.cpp:652 -#: src/slic3r/GUI/DoubleSlider.cpp:2030 src/slic3r/GUI/Plater.cpp:432 -#: src/slic3r/GUI/Plater.cpp:579 src/slic3r/GUI/Preferences.cpp:436 -#: src/libslic3r/PrintConfig.cpp:1291 +#: src/slic3r/GUI/ConfigWizard.cpp:361 src/slic3r/GUI/ConfigWizard.cpp:682 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 +#: src/slic3r/GUI/FileArchiveDialog.cpp:265 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1984 src/slic3r/GUI/Plater.cpp:439 +#: src/slic3r/GUI/Plater.cpp:594 src/slic3r/GUI/Preferences.cpp:552 +#: src/libslic3r/PrintConfig.cpp:1347 msgid "None" msgstr "无" -#: src/slic3r/GUI/ConfigWizard.cpp:484 +#: src/slic3r/GUI/ConfigWizard.cpp:513 #, c-format, boost-format msgid "Welcome to the %s Configuration Assistant" msgstr "欢迎访问 %s 配置助手" -#: src/slic3r/GUI/ConfigWizard.cpp:486 +#: src/slic3r/GUI/ConfigWizard.cpp:515 #, c-format, boost-format msgid "Welcome to the %s Configuration Wizard" msgstr "欢迎访问 %s 配置向导" -#: src/slic3r/GUI/ConfigWizard.cpp:488 +#: src/slic3r/GUI/ConfigWizard.cpp:517 msgid "Welcome" msgstr "欢迎" -#: src/slic3r/GUI/ConfigWizard.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:519 #, c-format, boost-format msgid "" "Hello, welcome to %s! This %s helps you with the initial configuration; just " @@ -692,104 +771,133 @@ msgid "" msgstr "" "您好,欢迎来到 %s!此 %s 可帮助您进行初始配置;只需几个设置,您就可以打印。" -#: src/slic3r/GUI/ConfigWizard.cpp:495 +#: src/slic3r/GUI/ConfigWizard.cpp:524 msgid "Remove user profiles (a snapshot will be taken beforehand)" msgstr "删除用户配置文件(事先将生成快照)" -#: src/slic3r/GUI/ConfigWizard.cpp:498 +#: src/slic3r/GUI/ConfigWizard.cpp:527 msgid "" "Perform desktop integration (Sets this binary to be searchable by the " "system)." msgstr "执行桌面集成(将此二进制文件设置为可被系统搜索)。" -#: src/slic3r/GUI/ConfigWizard.cpp:550 +#: src/slic3r/GUI/ConfigWizard.cpp:579 #, c-format, boost-format msgid "%s Family" msgstr "%s 系列" -#: src/slic3r/GUI/ConfigWizard.cpp:640 +#: src/slic3r/GUI/ConfigWizard.cpp:670 msgid "Printer:" msgstr "打印机:" -#: src/slic3r/GUI/ConfigWizard.cpp:642 +#: src/slic3r/GUI/ConfigWizard.cpp:672 msgid "Vendor:" msgstr "供应商:" -#: src/slic3r/GUI/ConfigWizard.cpp:643 +#: src/slic3r/GUI/ConfigWizard.cpp:673 msgid "Profile:" msgstr "配置:" -#: src/slic3r/GUI/ConfigWizard.cpp:720 src/slic3r/GUI/ConfigWizard.cpp:892 -#: src/slic3r/GUI/ConfigWizard.cpp:952 src/slic3r/GUI/ConfigWizard.cpp:1088 +#: src/slic3r/GUI/ConfigWizard.cpp:750 src/slic3r/GUI/ConfigWizard.cpp:938 +#: src/slic3r/GUI/ConfigWizard.cpp:1024 src/slic3r/GUI/ConfigWizard.cpp:1163 msgid "(All)" msgstr "(全部)" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:754 src/slic3r/GUI/ConfigWizard.cpp:1165 +msgid "(Templates)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:789 #, boost-format msgid "" -"%1% marked with * are not compatible with some installed " -"printers." -msgstr "%1% 被 * 标记的项与某些已安装的打印机不兼容。" +"%1% visible for (\"Template\") printer are universal profiles " +"available for all printers. These might not be compatible with your printer." +msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:752 src/slic3r/GUI/ConfigWizard.cpp:2043 -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filaments" msgstr "耗材" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 msgid "SLA materials" msgstr "SLA 材料" -#: src/slic3r/GUI/ConfigWizard.cpp:755 +#: src/slic3r/GUI/ConfigWizard.cpp:791 +#, boost-format +msgid "" +"%1% marked with * are not compatible with some installed " +"printers." +msgstr "%1% 被 * 标记的项与某些已安装的打印机不兼容。" + +#: src/slic3r/GUI/ConfigWizard.cpp:794 #, boost-format msgid "All installed printers are compatible with the selected %1%." msgstr "所有安装的打印机都与选定的 %1% 兼容。" -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/libslic3r/Preset.cpp:1342 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/libslic3r/Preset.cpp:1481 msgid "filament" msgstr "耗材" -#: src/slic3r/GUI/ConfigWizard.cpp:778 +#: src/slic3r/GUI/ConfigWizard.cpp:818 msgid "" "Only the following installed printers are compatible with the selected " "filaments" msgstr "只有以下安装的打印机与选定的耗材兼容" -#: src/slic3r/GUI/ConfigWizard.cpp:779 +#: src/slic3r/GUI/ConfigWizard.cpp:819 msgid "" "Only the following installed printers are compatible with the selected SLA " "materials" msgstr "只有以下安装的打印机与选定的 SLA 材料兼容" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1213 +msgid "" +"You have selected template filament. Please note that these filaments are " +"available for all printers but are NOT certain to be compatible with your " +"printer. Do you still wish to have this filament selected?\n" +"(This message won't be displayed again.)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1214 src/slic3r/GUI/ConfigWizard.cpp:2720 +#: src/slic3r/GUI/ConfigWizard.cpp:2860 src/slic3r/GUI/DoubleSlider.cpp:2591 +#: src/slic3r/GUI/DoubleSlider.cpp:2612 src/slic3r/GUI/GUI.cpp:245 +#: src/slic3r/GUI/GUI_App.cpp:3458 src/slic3r/GUI/UpdateDialogs.cpp:204 +#: src/slic3r/GUI/UpdateDialogs.cpp:212 src/slic3r/GUI/UpdateDialogs.cpp:217 +#: src/slic3r/GUI/UpdateDialogs.cpp:222 src/slic3r/GUI/UpdateDialogs.cpp:229 +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +msgid "Notice" +msgstr "通知" + +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer Setup" msgstr "自定义打印机设置" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer" msgstr "自定义打印机" -#: src/slic3r/GUI/ConfigWizard.cpp:1177 +#: src/slic3r/GUI/ConfigWizard.cpp:1264 msgid "Define a custom printer profile" msgstr "定义自定义打印机配置文件" -#: src/slic3r/GUI/ConfigWizard.cpp:1179 +#: src/slic3r/GUI/ConfigWizard.cpp:1265 msgid "Custom profile name:" msgstr "自定义配置文件名称:" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Automatic updates" msgstr "自动更新" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Updates" msgstr "更新" -#: src/slic3r/GUI/ConfigWizard.cpp:1214 +#: src/slic3r/GUI/ConfigWizard.cpp:1290 msgid "Check for application updates" msgstr "检查应用程序更新" -#: src/slic3r/GUI/ConfigWizard.cpp:1218 +#: src/slic3r/GUI/ConfigWizard.cpp:1294 #, c-format, boost-format msgid "" "If enabled, %s checks for new application versions online. When a new " @@ -801,11 +909,11 @@ msgstr "" "将会显示通知(在程序使用期间从不显示通知)。这只是一个通知机制,不会自动安" "装。" -#: src/slic3r/GUI/ConfigWizard.cpp:1224 src/slic3r/GUI/Preferences.cpp:175 +#: src/slic3r/GUI/ConfigWizard.cpp:1300 src/slic3r/GUI/Preferences.cpp:306 msgid "Update built-in Presets automatically" msgstr "自动更新内置预设" -#: src/slic3r/GUI/ConfigWizard.cpp:1228 +#: src/slic3r/GUI/ConfigWizard.cpp:1304 #, c-format, boost-format msgid "" "If enabled, %s downloads updates of built-in system presets in the " @@ -816,29 +924,73 @@ msgstr "" "如果启用,%s 会在后台下载内置系统预设的更新。这些更新将下载到单独的临时位置。" "当新的预设版本可用时,它会在应用程序启动时提示。" -#: src/slic3r/GUI/ConfigWizard.cpp:1231 +#: src/slic3r/GUI/ConfigWizard.cpp:1307 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." msgstr "未经用户同意,绝不会应用更新,也绝不会覆盖用户的自定义设置。" -#: src/slic3r/GUI/ConfigWizard.cpp:1236 +#: src/slic3r/GUI/ConfigWizard.cpp:1312 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." msgstr "此外,在应用更新之前,将创建整个配置的备份快照。" -#: src/slic3r/GUI/ConfigWizard.cpp:1243 src/slic3r/GUI/GUI_Factories.cpp:726 -#: src/slic3r/GUI/Plater.cpp:3582 +#: src/slic3r/GUI/ConfigWizard.cpp:1361 src/slic3r/GUI/Preferences.cpp:1076 +msgid "Download path" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1366 src/slic3r/GUI/FirmwareDialog.cpp:815 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:300 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +msgid "Browse" +msgstr "浏览" + +#: src/slic3r/GUI/ConfigWizard.cpp:1371 +msgid "Choose folder:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads from URL" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1417 +msgid "Allow built-in downloader" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1424 +#, c-format, boost-format +msgid "" +"If enabled, %s registers to start on custom URL on www.printables.com. You " +"will be able to use button with %s logo to open models in this %s. The model " +"will be downloaded into folder you choose bellow." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1431 +msgid "" +"On Linux systems the process of registration also creates desktop " +"integration files for this version of application." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1458 +msgid "Chosen directory for downloads does not Exists." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1545 src/slic3r/GUI/GUI_Factories.cpp:810 +#: src/slic3r/GUI/Plater.cpp:3732 msgid "Reload from disk" msgstr "从磁盘重新加载" -#: src/slic3r/GUI/ConfigWizard.cpp:1246 +#: src/slic3r/GUI/ConfigWizard.cpp:1548 msgid "" "Export full pathnames of models and parts sources into 3mf and amf files" msgstr "将模型和零件源的完整路径名导出到 3mf 和 amf 文件中" -#: src/slic3r/GUI/ConfigWizard.cpp:1250 +#: src/slic3r/GUI/ConfigWizard.cpp:1552 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked.\n" @@ -848,23 +1000,23 @@ msgstr "" "如果启用,则允许从磁盘重新加载命令在调用时自动查找和加载文件。\n" "如果未启用,则从磁盘重新加载命令将要求使用打开文件对话框选择每个文件。" -#: src/slic3r/GUI/ConfigWizard.cpp:1259 +#: src/slic3r/GUI/ConfigWizard.cpp:1561 msgid "Files association" msgstr "文件关联" -#: src/slic3r/GUI/ConfigWizard.cpp:1261 src/slic3r/GUI/Preferences.cpp:157 +#: src/slic3r/GUI/ConfigWizard.cpp:1563 src/slic3r/GUI/Preferences.cpp:292 msgid "Associate .3mf files to PrusaSlicer" msgstr "将 .3mf 文件关联到 PrusaSlicer" -#: src/slic3r/GUI/ConfigWizard.cpp:1262 src/slic3r/GUI/Preferences.cpp:164 +#: src/slic3r/GUI/ConfigWizard.cpp:1564 src/slic3r/GUI/Preferences.cpp:297 msgid "Associate .stl files to PrusaSlicer" msgstr "将 .stl 文件关联到 PrusaSlicer" -#: src/slic3r/GUI/ConfigWizard.cpp:1272 +#: src/slic3r/GUI/ConfigWizard.cpp:1574 msgid "View mode" msgstr "查看模式" -#: src/slic3r/GUI/ConfigWizard.cpp:1274 +#: src/slic3r/GUI/ConfigWizard.cpp:1576 msgid "" "PrusaSlicer's user interfaces comes in three variants:\n" "Simple, Advanced, and Expert.\n" @@ -877,288 +1029,302 @@ msgstr "" "简单模式仅显示与常规 3D 打印相关的最常用设置。另外两个提供了越来越复杂的微调" "功能,分别适用于高级用户和专家用户。" -#: src/slic3r/GUI/ConfigWizard.cpp:1279 +#: src/slic3r/GUI/ConfigWizard.cpp:1581 msgid "Simple mode" msgstr "简单模式" -#: src/slic3r/GUI/ConfigWizard.cpp:1280 +#: src/slic3r/GUI/ConfigWizard.cpp:1582 msgid "Advanced mode" msgstr "高级模式" -#: src/slic3r/GUI/ConfigWizard.cpp:1281 +#: src/slic3r/GUI/ConfigWizard.cpp:1583 msgid "Expert mode" msgstr "专家模式" -#: src/slic3r/GUI/ConfigWizard.cpp:1287 +#: src/slic3r/GUI/ConfigWizard.cpp:1596 msgid "The size of the object can be specified in inches" msgstr "对象的大小可以以英寸为单位指定" -#: src/slic3r/GUI/ConfigWizard.cpp:1288 +#: src/slic3r/GUI/ConfigWizard.cpp:1597 msgid "Use inches" msgstr "使用英寸" -#: src/slic3r/GUI/ConfigWizard.cpp:1322 +#: src/slic3r/GUI/ConfigWizard.cpp:1617 msgid "Other Vendors" msgstr "其他供应商" -#: src/slic3r/GUI/ConfigWizard.cpp:1326 +#: src/slic3r/GUI/ConfigWizard.cpp:1621 #, c-format, boost-format msgid "Pick another vendor supported by %s" msgstr "选择 %s 支持的其他供应商" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 msgid "Firmware Type" msgstr "固件类型" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2366 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 src/slic3r/GUI/Tab.cpp:2354 msgid "Firmware" msgstr "固件" -#: src/slic3r/GUI/ConfigWizard.cpp:1361 +#: src/slic3r/GUI/ConfigWizard.cpp:1658 msgid "Choose the type of firmware used by your printer." msgstr "选择打印机使用的固件类型。" -#: src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/ConfigWizard.cpp:1707 src/slic3r/GUI/ConfigWizard.cpp:1778 +#: src/slic3r/GUI/ConfigWizard.cpp:1783 src/slic3r/GUI/ConfigWizard.cpp:1788 +#: src/slic3r/GUI/Field.cpp:258 src/slic3r/GUI/Field.cpp:328 +#: src/slic3r/GUI/Field.cpp:1585 src/slic3r/GUI/GUI_ObjectLayers.cpp:435 +msgid "Invalid numeric input." +msgstr "无效的数字输入。" + +#: src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape and Size" msgstr "热床形状和大小" -#: src/slic3r/GUI/ConfigWizard.cpp:1399 +#: src/slic3r/GUI/ConfigWizard.cpp:1735 msgid "Set the shape of your printer's bed." msgstr "设置打印机热床的形状。" -#: src/slic3r/GUI/ConfigWizard.cpp:1433 src/slic3r/GUI/Field.cpp:255 -#: src/slic3r/GUI/Field.cpp:324 src/slic3r/GUI/Field.cpp:1561 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:435 -msgid "Invalid numeric input." -msgstr "无效的数字输入。" +#: src/slic3r/GUI/ConfigWizard.cpp:1755 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1610 +msgid "Build Volume" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1758 +msgid "Set vertical size of your printer." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1795 +msgid "Max print height:" +msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Filament and Nozzle Diameters" msgstr "耗材和喷嘴直径" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Print Diameters" msgstr "打印直径" -#: src/slic3r/GUI/ConfigWizard.cpp:1472 +#: src/slic3r/GUI/ConfigWizard.cpp:1828 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "输入打印机热端喷嘴的直径。" -#: src/slic3r/GUI/ConfigWizard.cpp:1475 +#: src/slic3r/GUI/ConfigWizard.cpp:1831 msgid "Nozzle Diameter:" msgstr "喷嘴直径:" -#: src/slic3r/GUI/ConfigWizard.cpp:1485 +#: src/slic3r/GUI/ConfigWizard.cpp:1841 msgid "Enter the diameter of your filament." msgstr "输入耗材的直径。" -#: src/slic3r/GUI/ConfigWizard.cpp:1486 +#: src/slic3r/GUI/ConfigWizard.cpp:1842 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." msgstr "" "需要良好的精度, 因此请使用游标卡尺, 沿耗材进行多次测量, 然后计算平均值。" -#: src/slic3r/GUI/ConfigWizard.cpp:1489 +#: src/slic3r/GUI/ConfigWizard.cpp:1845 msgid "Filament Diameter:" msgstr "耗材直径:" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Nozzle and Bed Temperatures" msgstr "喷嘴和床层温度" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Temperatures" msgstr "温度" -#: src/slic3r/GUI/ConfigWizard.cpp:1563 +#: src/slic3r/GUI/ConfigWizard.cpp:1919 msgid "Enter the temperature needed for extruding your filament." msgstr "输入挤出耗材所需的温度。" -#: src/slic3r/GUI/ConfigWizard.cpp:1564 +#: src/slic3r/GUI/ConfigWizard.cpp:1920 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "根据经验, PLA 为 160 至 230°C, ABS 为 215 至 250°C。" -#: src/slic3r/GUI/ConfigWizard.cpp:1567 +#: src/slic3r/GUI/ConfigWizard.cpp:1923 msgid "Extrusion Temperature:" msgstr "挤出温度:" -#: src/slic3r/GUI/ConfigWizard.cpp:1568 src/slic3r/GUI/ConfigWizard.cpp:1582 -#: src/libslic3r/PrintConfig.cpp:418 src/libslic3r/PrintConfig.cpp:1211 -#: src/libslic3r/PrintConfig.cpp:1266 src/libslic3r/PrintConfig.cpp:2842 +#: src/slic3r/GUI/ConfigWizard.cpp:1924 src/slic3r/GUI/ConfigWizard.cpp:1938 +#: src/libslic3r/PrintConfig.cpp:437 src/libslic3r/PrintConfig.cpp:1271 +#: src/libslic3r/PrintConfig.cpp:1326 src/libslic3r/PrintConfig.cpp:2930 +#: src/libslic3r/PrintConfig.cpp:3689 msgid "°C" msgstr "°C" -#: src/slic3r/GUI/ConfigWizard.cpp:1577 +#: src/slic3r/GUI/ConfigWizard.cpp:1933 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." msgstr "输入让你的耗材粘在热床上所需的床温。" -#: src/slic3r/GUI/ConfigWizard.cpp:1578 +#: src/slic3r/GUI/ConfigWizard.cpp:1934 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." msgstr "根据经验, PLA 为 60°C, ABS 为 110°C. 如果没有加热床, 请保留零。" -#: src/slic3r/GUI/ConfigWizard.cpp:1581 +#: src/slic3r/GUI/ConfigWizard.cpp:1937 msgid "Bed Temperature:" msgstr "热床温度:" -#: src/slic3r/GUI/ConfigWizard.cpp:2043 src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Materials" msgstr "SLA 材料" -#: src/slic3r/GUI/ConfigWizard.cpp:2097 +#: src/slic3r/GUI/ConfigWizard.cpp:2464 msgid "FFF Technology Printers" msgstr "FFF 技术打印机" -#: src/slic3r/GUI/ConfigWizard.cpp:2102 +#: src/slic3r/GUI/ConfigWizard.cpp:2469 msgid "SLA Technology Printers" msgstr "SLA 技术打印机" -#: src/slic3r/GUI/ConfigWizard.cpp:2338 +#: src/slic3r/GUI/ConfigWizard.cpp:2718 #, boost-format msgid "" "Following printer profiles has no default filament: %1%Please select one " "manually." msgstr "以下打印机配置文件没有默认耗材:%1% 请手动选择一个。" -#: src/slic3r/GUI/ConfigWizard.cpp:2339 +#: src/slic3r/GUI/ConfigWizard.cpp:2719 #, boost-format msgid "" "Following printer profiles has no default material: %1%Please select one " "manually." msgstr "以下打印机配置文件没有默认材料:%1% 请手动选择一种。" -#: src/slic3r/GUI/ConfigWizard.cpp:2340 src/slic3r/GUI/ConfigWizard.cpp:2438 -#: src/slic3r/GUI/DoubleSlider.cpp:2522 src/slic3r/GUI/DoubleSlider.cpp:2543 -#: src/slic3r/GUI/GUI.cpp:232 -msgid "Notice" -msgstr "通知" - -#: src/slic3r/GUI/ConfigWizard.cpp:2459 +#: src/slic3r/GUI/ConfigWizard.cpp:2883 msgid "The following FFF printer models have no filament selected:" msgstr "以下 FFF 打印机型号未选择耗材:" -#: src/slic3r/GUI/ConfigWizard.cpp:2463 +#: src/slic3r/GUI/ConfigWizard.cpp:2887 msgid "Do you want to select default filaments for these FFF printer models?" msgstr "是否要为这些 FFF 打印机型号选择默认耗材?" -#: src/slic3r/GUI/ConfigWizard.cpp:2477 +#: src/slic3r/GUI/ConfigWizard.cpp:2901 msgid "The following SLA printer models have no materials selected:" msgstr "以下 SLA 打印机型号未选择任何材料:" -#: src/slic3r/GUI/ConfigWizard.cpp:2481 +#: src/slic3r/GUI/ConfigWizard.cpp:2905 msgid "Do you want to select default SLA materials for these printer models?" msgstr "是否要为这些打印机型号选择默认 SLA 材料?" -#: src/slic3r/GUI/ConfigWizard.cpp:2523 +#: src/slic3r/GUI/ConfigWizard.cpp:2947 msgid "Configuration is edited in ConfigWizard" msgstr "在 ConfigWizard 中编辑配置" -#: src/slic3r/GUI/ConfigWizard.cpp:2566 +#: src/slic3r/GUI/ConfigWizard.cpp:3000 msgid "All user presets will be deleted." msgstr "所有用户预设都将被删除。" -#: src/slic3r/GUI/ConfigWizard.cpp:2596 +#: src/slic3r/GUI/ConfigWizard.cpp:3037 msgid "A new vendor was installed and one of its printers will be activated" msgid_plural "" "New vendors were installed and one of theirs printers will be activated" msgstr[0] "新供应商被安装,一个他们的打印机将被激活" -#: src/slic3r/GUI/ConfigWizard.cpp:2625 +#: src/slic3r/GUI/ConfigWizard.cpp:3069 msgid "Do you want to continue changing the configuration?" msgstr "是否要继续更改配置?" -#: src/slic3r/GUI/ConfigWizard.cpp:2691 +#: src/slic3r/GUI/ConfigWizard.cpp:3136 msgid "A new Printer was installed and it will be activated." msgstr "安装了一台新打印机,它将被激活。" -#: src/slic3r/GUI/ConfigWizard.cpp:2696 +#: src/slic3r/GUI/ConfigWizard.cpp:3141 msgid "Some Printers were uninstalled." msgstr "一些打印机被卸载。" -#: src/slic3r/GUI/ConfigWizard.cpp:2717 +#: src/slic3r/GUI/ConfigWizard.cpp:3162 msgid "A new filament was installed and it will be activated." msgstr "安装了一种新的耗材,它将被激活。" -#: src/slic3r/GUI/ConfigWizard.cpp:2718 +#: src/slic3r/GUI/ConfigWizard.cpp:3163 msgid "A new SLA material was installed and it will be activated." msgstr "已安装新的 SLA 材料,并将其激活。" -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some filaments were uninstalled." msgstr "一些耗材被卸载。" -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some SLA materials were uninstalled." msgstr "一些 SLA 材料已卸载。" -#: src/slic3r/GUI/ConfigWizard.cpp:2773 +#: src/slic3r/GUI/ConfigWizard.cpp:3218 msgid "Custom printer was installed and it will be activated." msgstr "已安装自定义打印机,它将被激活。" -#: src/slic3r/GUI/ConfigWizard.cpp:2858 +#: src/slic3r/GUI/ConfigWizard.cpp:3306 msgid "Select all standard printers" msgstr "选择所有标准打印机" -#: src/slic3r/GUI/ConfigWizard.cpp:2861 +#: src/slic3r/GUI/ConfigWizard.cpp:3309 msgid "< &Back" msgstr "< 上一步(&B)" -#: src/slic3r/GUI/ConfigWizard.cpp:2862 +#: src/slic3r/GUI/ConfigWizard.cpp:3310 msgid "&Next >" msgstr "下一步(&N) >" -#: src/slic3r/GUI/ConfigWizard.cpp:2863 +#: src/slic3r/GUI/ConfigWizard.cpp:3311 msgid "&Finish" msgstr "完成(&F)" -#: src/slic3r/GUI/ConfigWizard.cpp:2864 -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:3312 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:657 +#: src/slic3r/GUI/FileArchiveDialog.cpp:274 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 #: src/slic3r/GUI/FirmwareDialog.cpp:153 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1593 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1365 #: src/slic3r/GUI/ProgressStatusBar.cpp:26 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:93 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:879 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:96 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:907 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1606 msgid "Cancel" msgstr "取消" -#: src/slic3r/GUI/ConfigWizard.cpp:2884 +#: src/slic3r/GUI/ConfigWizard.cpp:3332 msgid "Prusa FFF Technology Printers" msgstr "Prusa FFF 技术打印机" -#: src/slic3r/GUI/ConfigWizard.cpp:2892 +#: src/slic3r/GUI/ConfigWizard.cpp:3340 msgid "Prusa MSLA Technology Printers" msgstr "Prusa MSLA 技术打印机" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filament Profiles Selection" msgstr "耗材配置选择" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 src/slic3r/GUI/ConfigWizard.cpp:2915 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 src/slic3r/GUI/ConfigWizard.cpp:3363 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Type:" msgstr "类型:" -#: src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Material Profiles Selection" msgstr "SLA 材料配置文件选择" -#: src/slic3r/GUI/ConfigWizard.cpp:3036 +#: src/slic3r/GUI/ConfigWizard.cpp:3486 msgid "Configuration Assistant" msgstr "配置助手" -#: src/slic3r/GUI/ConfigWizard.cpp:3037 +#: src/slic3r/GUI/ConfigWizard.cpp:3487 msgid "Configuration &Assistant" msgstr "配置助手(&A)" -#: src/slic3r/GUI/ConfigWizard.cpp:3039 +#: src/slic3r/GUI/ConfigWizard.cpp:3489 msgid "Configuration Wizard" msgstr "配置向导" -#: src/slic3r/GUI/ConfigWizard.cpp:3040 +#: src/slic3r/GUI/ConfigWizard.cpp:3490 msgid "Configuration &Wizard" msgstr "配置向导(&W)" @@ -1172,13 +1338,13 @@ msgstr "执行桌面集成失败-boost::filesystem::canonical 未返回 appi msgid "Performing desktop integration failed - Could not find executable." msgstr "执行桌面集成失败-找不到可执行文件。" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:378 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:383 msgid "" "Performing desktop integration failed because the application directory was " "not found." msgstr "由于找不到应用程序目录,执行桌面集成失败。" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:419 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:423 msgid "" "Performing desktop integration failed - could not create Gcodeviewer desktop " "file. PrusaSlicer desktop file was probably created successfully." @@ -1186,12 +1352,29 @@ msgstr "" "执行桌面集成失败-无法创建 Gcodeviewer 桌面文件。PrusaSlicer 桌面文件可能已成" "功创建。" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:459 -#: src/slic3r/GUI/GUI_App.cpp:2245 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:472 +msgid "" +"Performing downloader desktop integration failed - boost::filesystem::" +"canonical did not return appimage path." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:484 +msgid "" +"Performing downloader desktop integration failed - Could not find executable." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:602 +msgid "" +"Performing downloader desktop integration failed because the application " +"directory was not found." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:626 +#: src/slic3r/GUI/GUI_App.cpp:2407 msgid "Desktop Integration" msgstr "桌面集成" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:466 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:633 msgid "" "Desktop Integration sets this binary to be searchable by the system.\n" "\n" @@ -1201,13 +1384,13 @@ msgstr "" "\n" "按“执行”继续。" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:480 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:647 msgid "Perform" msgstr "执行" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1342 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:653 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/KBShortcutsDialog.cpp:106 +#: src/slic3r/GUI/MainFrame.cpp:1426 msgid "Undo" msgstr "撤销" @@ -1215,19 +1398,19 @@ msgstr "撤销" msgid "Place bearings in slots and resume printing" msgstr "将轴承放入槽中,然后继续打印" -#: src/slic3r/GUI/DoubleSlider.cpp:1379 +#: src/slic3r/GUI/DoubleSlider.cpp:1448 msgid "One layer mode" msgstr "单层模式" -#: src/slic3r/GUI/DoubleSlider.cpp:1381 +#: src/slic3r/GUI/DoubleSlider.cpp:1450 msgid "Discard all custom changes" msgstr "放弃所有自定义更改" -#: src/slic3r/GUI/DoubleSlider.cpp:1385 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:1454 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to move" msgstr "跳转移动" -#: src/slic3r/GUI/DoubleSlider.cpp:1388 +#: src/slic3r/GUI/DoubleSlider.cpp:1457 #, c-format, boost-format msgid "" "Jump to height %s\n" @@ -1238,7 +1421,7 @@ msgstr "" "设置标尺模式\n" "或设置整个打印的挤出机顺序" -#: src/slic3r/GUI/DoubleSlider.cpp:1391 +#: src/slic3r/GUI/DoubleSlider.cpp:1460 #, c-format, boost-format msgid "" "Jump to height %s\n" @@ -1247,15 +1430,15 @@ msgstr "" "跳转到高度 %s\n" "或设置标尺模式" -#: src/slic3r/GUI/DoubleSlider.cpp:1396 +#: src/slic3r/GUI/DoubleSlider.cpp:1465 msgid "Edit current color - Right click the colored slider segment" msgstr "编辑当前颜色-在彩色滑块段上单击鼠标右键" -#: src/slic3r/GUI/DoubleSlider.cpp:1398 +#: src/slic3r/GUI/DoubleSlider.cpp:1467 msgid "This is wipe tower layer" msgstr "这是擦拭塔层" -#: src/slic3r/GUI/DoubleSlider.cpp:1408 +#: src/slic3r/GUI/DoubleSlider.cpp:1477 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing sequentually." @@ -1263,15 +1446,15 @@ msgstr "" "顺序打印已打开。\n" "无法为连续打印的对象应用任何自定义 G-Code。" -#: src/slic3r/GUI/DoubleSlider.cpp:1412 +#: src/slic3r/GUI/DoubleSlider.cpp:1481 msgid "Print mode" msgstr "打印模式" -#: src/slic3r/GUI/DoubleSlider.cpp:1426 +#: src/slic3r/GUI/DoubleSlider.cpp:1495 msgid "Add extruder change - Left click" msgstr "添加挤出机更改-左键单击" -#: src/slic3r/GUI/DoubleSlider.cpp:1428 +#: src/slic3r/GUI/DoubleSlider.cpp:1497 msgid "" "Add color change - Left click for predefined color or Shift + Left click for " "custom color selection" @@ -1279,23 +1462,23 @@ msgstr "" "添加颜色更改-单击鼠标左键可选择预定义颜色,或按住 Shift 键并单击鼠标左键可选" "择自定义颜色" -#: src/slic3r/GUI/DoubleSlider.cpp:1430 +#: src/slic3r/GUI/DoubleSlider.cpp:1499 msgid "Add color change - Left click" msgstr "添加颜色更改-左键单击" -#: src/slic3r/GUI/DoubleSlider.cpp:1431 +#: src/slic3r/GUI/DoubleSlider.cpp:1500 msgid "or press \"+\" key" msgstr "或者按“+”键" -#: src/slic3r/GUI/DoubleSlider.cpp:1433 +#: src/slic3r/GUI/DoubleSlider.cpp:1502 msgid "Add another code - Ctrl + Left click" msgstr "添加另一个代码-按住 Ctrl 键并单击鼠标左键" -#: src/slic3r/GUI/DoubleSlider.cpp:1434 +#: src/slic3r/GUI/DoubleSlider.cpp:1503 msgid "Add another code - Right click" msgstr "添加另一个代码-右键单击" -#: src/slic3r/GUI/DoubleSlider.cpp:1440 +#: src/slic3r/GUI/DoubleSlider.cpp:1509 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing " @@ -1306,40 +1489,40 @@ msgstr "" "无法为连续打印的对象应用任何自定义 G-Code。\n" "G-Code 生成期间不会处理此代码。" -#: src/slic3r/GUI/DoubleSlider.cpp:1458 +#: src/slic3r/GUI/DoubleSlider.cpp:1527 msgid "continue" msgstr "继续" -#: src/slic3r/GUI/DoubleSlider.cpp:1466 +#: src/slic3r/GUI/DoubleSlider.cpp:1535 #, boost-format msgid "Color change (\"%1%\")" msgstr "更改颜色(\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1467 +#: src/slic3r/GUI/DoubleSlider.cpp:1536 #, boost-format msgid "Color change (\"%1%\") for Extruder %2%" msgstr "为挤出机 %2% 更改颜色(\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1469 +#: src/slic3r/GUI/DoubleSlider.cpp:1538 #, boost-format msgid "Pause print (\"%1%\")" msgstr "暂停打印(\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1471 +#: src/slic3r/GUI/DoubleSlider.cpp:1540 #, boost-format msgid "Custom template (\"%1%\")" msgstr "自定义模板(“%1%”)" -#: src/slic3r/GUI/DoubleSlider.cpp:1473 +#: src/slic3r/GUI/DoubleSlider.cpp:1542 #, boost-format msgid "Extruder (tool) is changed to Extruder \"%1%\"" msgstr "挤出机(工具)更改为挤出机 \"%1%\"" -#: src/slic3r/GUI/DoubleSlider.cpp:1480 +#: src/slic3r/GUI/DoubleSlider.cpp:1549 msgid "Note" msgstr "笔记" -#: src/slic3r/GUI/DoubleSlider.cpp:1482 +#: src/slic3r/GUI/DoubleSlider.cpp:1551 msgid "" "G-code associated to this tick mark is in a conflict with print mode.\n" "Editing it will cause changes of Slider data." @@ -1347,7 +1530,7 @@ msgstr "" "与此记号关联的 G-Code 与打印模式冲突。\n" "编辑它将导致滑块数据的更改。" -#: src/slic3r/GUI/DoubleSlider.cpp:1485 +#: src/slic3r/GUI/DoubleSlider.cpp:1554 msgid "" "There is a color change for extruder that won't be used till the end of " "print job.\n" @@ -1356,7 +1539,7 @@ msgstr "" "有一个挤出机的颜色更改,直到打印作业结束才会使用。\n" "G-Code 生成期间不会处理此代码。" -#: src/slic3r/GUI/DoubleSlider.cpp:1488 +#: src/slic3r/GUI/DoubleSlider.cpp:1557 msgid "" "There is an extruder change set to the same extruder.\n" "This code won't be processed during G-code generation." @@ -1364,7 +1547,7 @@ msgstr "" "同一台挤出机上有一台挤出机更换装置。\n" "G-Code 生成期间不会处理此代码。" -#: src/slic3r/GUI/DoubleSlider.cpp:1491 +#: src/slic3r/GUI/DoubleSlider.cpp:1560 msgid "" "There is a color change for extruder that has not been used before.\n" "Check your settings to avoid redundant color changes." @@ -1372,147 +1555,147 @@ msgstr "" "挤出机有一个以前从未使用过的颜色更改。\n" "检查设置以避免重复的颜色更改。" -#: src/slic3r/GUI/DoubleSlider.cpp:1496 +#: src/slic3r/GUI/DoubleSlider.cpp:1565 msgid "Delete tick mark - Left click or press \"-\" key" msgstr "删除刻度线-左键单击或按 “-” 键" -#: src/slic3r/GUI/DoubleSlider.cpp:1498 +#: src/slic3r/GUI/DoubleSlider.cpp:1567 msgid "Edit tick mark - Ctrl + Left click" msgstr "编辑刻度线-按住 Ctrl 键并单击鼠标左键" -#: src/slic3r/GUI/DoubleSlider.cpp:1499 +#: src/slic3r/GUI/DoubleSlider.cpp:1568 msgid "Edit tick mark - Right click" msgstr "编辑刻度线-单击鼠标右键" -#: src/slic3r/GUI/DoubleSlider.cpp:1602 src/slic3r/GUI/DoubleSlider.cpp:1633 -#: src/slic3r/GUI/GUI_Factories.cpp:778 +#: src/slic3r/GUI/DoubleSlider.cpp:1671 src/slic3r/GUI/DoubleSlider.cpp:1702 +#: src/slic3r/GUI/GUI_Factories.cpp:862 #, c-format, boost-format msgid "Extruder %d" msgstr "挤出机 %d" -#: src/slic3r/GUI/DoubleSlider.cpp:1603 src/slic3r/GUI/GUI_Factories.cpp:779 +#: src/slic3r/GUI/DoubleSlider.cpp:1672 src/slic3r/GUI/GUI_Factories.cpp:863 msgid "active" msgstr "活跃" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 msgid "Switch code to Change extruder" msgstr "切换代码以更换挤出机" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Change extruder" msgstr "更换挤出机" -#: src/slic3r/GUI/DoubleSlider.cpp:1613 +#: src/slic3r/GUI/DoubleSlider.cpp:1682 msgid "Change extruder (N/A)" msgstr "更换挤出机(不适用)" -#: src/slic3r/GUI/DoubleSlider.cpp:1615 src/slic3r/GUI/GUI_Factories.cpp:787 +#: src/slic3r/GUI/DoubleSlider.cpp:1684 src/slic3r/GUI/GUI_Factories.cpp:871 msgid "Use another extruder" msgstr "使用另一台挤出机" -#: src/slic3r/GUI/DoubleSlider.cpp:1634 +#: src/slic3r/GUI/DoubleSlider.cpp:1703 msgid "used" msgstr "已用" -#: src/slic3r/GUI/DoubleSlider.cpp:1642 +#: src/slic3r/GUI/DoubleSlider.cpp:1711 #, boost-format msgid "Switch code to Color change (%1%) for:" msgstr "将代码切换为颜色更改(%1%):" -#: src/slic3r/GUI/DoubleSlider.cpp:1643 +#: src/slic3r/GUI/DoubleSlider.cpp:1712 #, boost-format msgid "Add color change (%1%) for:" msgstr "为以下各项添加颜色更改(%1%):" -#: src/slic3r/GUI/DoubleSlider.cpp:1968 +#: src/slic3r/GUI/DoubleSlider.cpp:2037 msgid "Add color change" msgstr "添加颜色更改" -#: src/slic3r/GUI/DoubleSlider.cpp:1979 +#: src/slic3r/GUI/DoubleSlider.cpp:2048 msgid "Add pause print" msgstr "添加暂停打印" -#: src/slic3r/GUI/DoubleSlider.cpp:1983 +#: src/slic3r/GUI/DoubleSlider.cpp:2052 msgid "Add custom template" msgstr "添加自定义模板" -#: src/slic3r/GUI/DoubleSlider.cpp:1986 +#: src/slic3r/GUI/DoubleSlider.cpp:2055 msgid "Add custom G-code" msgstr "添加自定义 G-Code" -#: src/slic3r/GUI/DoubleSlider.cpp:2004 +#: src/slic3r/GUI/DoubleSlider.cpp:2073 msgid "Edit color" msgstr "编辑颜色" -#: src/slic3r/GUI/DoubleSlider.cpp:2005 +#: src/slic3r/GUI/DoubleSlider.cpp:2074 msgid "Edit pause print message" msgstr "编辑暂停打印消息" -#: src/slic3r/GUI/DoubleSlider.cpp:2006 +#: src/slic3r/GUI/DoubleSlider.cpp:2075 msgid "Edit custom G-code" msgstr "编辑自定义 G-Code" -#: src/slic3r/GUI/DoubleSlider.cpp:2012 +#: src/slic3r/GUI/DoubleSlider.cpp:2081 msgid "Delete color change" msgstr "删除颜色更改" -#: src/slic3r/GUI/DoubleSlider.cpp:2013 +#: src/slic3r/GUI/DoubleSlider.cpp:2082 msgid "Delete tool change" msgstr "删除换刀" -#: src/slic3r/GUI/DoubleSlider.cpp:2014 +#: src/slic3r/GUI/DoubleSlider.cpp:2083 msgid "Delete pause print" msgstr "删除暂停打印" -#: src/slic3r/GUI/DoubleSlider.cpp:2015 +#: src/slic3r/GUI/DoubleSlider.cpp:2084 msgid "Delete custom G-code" msgstr "删除自定义 G-Code" -#: src/slic3r/GUI/DoubleSlider.cpp:2025 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:2094 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to height" msgstr "跳转到高度" -#: src/slic3r/GUI/DoubleSlider.cpp:2030 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 msgid "Hide ruler" msgstr "隐藏标尺" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height" msgstr "显示对象高度" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height on the ruler" msgstr "在标尺上显示物体高度" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time" msgstr "显示预计打印时间" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time on the ruler" msgstr "在标尺上显示估计的打印时间" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Ruler mode" msgstr "标尺模式" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Set ruler mode" msgstr "设置标尺模式" -#: src/slic3r/GUI/DoubleSlider.cpp:2047 +#: src/slic3r/GUI/DoubleSlider.cpp:2116 msgid "Set extruder sequence for the entire print" msgstr "设置整个打印的挤出机顺序" -#: src/slic3r/GUI/DoubleSlider.cpp:2051 +#: src/slic3r/GUI/DoubleSlider.cpp:2120 msgid "Set auto color changes" msgstr "设置自动颜色更改" -#: src/slic3r/GUI/DoubleSlider.cpp:2086 +#: src/slic3r/GUI/DoubleSlider.cpp:2155 msgid "This action will cause deletion of all ticks on vertical slider." msgstr "此操作将导致删除垂直滑块上的所有标记。" -#: src/slic3r/GUI/DoubleSlider.cpp:2087 src/slic3r/GUI/Tab.cpp:1318 +#: src/slic3r/GUI/DoubleSlider.cpp:2156 src/slic3r/GUI/Tab.cpp:1263 msgid "" "This action is not revertible.\n" "Do you want to proceed?" @@ -1520,57 +1703,59 @@ msgstr "" "此操作不可恢复。\n" "你想继续吗?" -#: src/slic3r/GUI/DoubleSlider.cpp:2088 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1133 src/slic3r/GUI/GUI.cpp:245 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:649 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:679 -#: src/slic3r/GUI/WipeTowerDialog.cpp:58 src/slic3r/GUI/WipeTowerDialog.cpp:443 +#: src/slic3r/GUI/DoubleSlider.cpp:2157 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:537 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1119 src/slic3r/GUI/GUI.cpp:258 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:721 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:751 +#: src/slic3r/GUI/WipeTowerDialog.cpp:60 src/slic3r/GUI/WipeTowerDialog.cpp:445 msgid "Warning" msgstr "警告" -#: src/slic3r/GUI/DoubleSlider.cpp:2216 +#: src/slic3r/GUI/DoubleSlider.cpp:2285 msgid "Enter custom G-code used on current layer" msgstr "输入当前图层上使用的自定义 G-Code" -#: src/slic3r/GUI/DoubleSlider.cpp:2217 +#: src/slic3r/GUI/DoubleSlider.cpp:2286 #, boost-format msgid "Custom G-code on current layer (%1% mm)." msgstr "当前图层上的自定义 G-Code (%1%mm)。" -#: src/slic3r/GUI/DoubleSlider.cpp:2238 +#: src/slic3r/GUI/DoubleSlider.cpp:2307 msgid "Enter short message shown on Printer display when a print is paused" msgstr "输入暂停打印时打印机显示屏上显示的短消息" -#: src/slic3r/GUI/DoubleSlider.cpp:2239 +#: src/slic3r/GUI/DoubleSlider.cpp:2308 #, boost-format msgid "Message for pause print on current layer (%1% mm)." msgstr "在当前图层(%1%mm)上暂停打印的消息。" -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the move you want to jump to" msgstr "输入要跳转到的移动" -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the height you want to jump to" msgstr "输入要跳到的高度" -#: src/slic3r/GUI/DoubleSlider.cpp:2515 +#: src/slic3r/GUI/DoubleSlider.cpp:2584 msgid "The last color change data was saved for a single extruder printing." msgstr "最后的颜色变化数据保存在一台挤出机上进行打印。" -#: src/slic3r/GUI/DoubleSlider.cpp:2516 src/slic3r/GUI/DoubleSlider.cpp:2532 +#: src/slic3r/GUI/DoubleSlider.cpp:2585 src/slic3r/GUI/DoubleSlider.cpp:2601 msgid "The last color change data was saved for a multi extruder printing." msgstr "最后的颜色变化数据保存在多台挤出机上进行打印。" -#: src/slic3r/GUI/DoubleSlider.cpp:2518 +#: src/slic3r/GUI/DoubleSlider.cpp:2587 msgid "Your current changes will delete all saved color changes." msgstr "当前更改将删除所有保存的颜色更改。" -#: src/slic3r/GUI/DoubleSlider.cpp:2519 src/slic3r/GUI/DoubleSlider.cpp:2540 +#: src/slic3r/GUI/DoubleSlider.cpp:2588 src/slic3r/GUI/DoubleSlider.cpp:2609 msgid "Are you sure you want to continue?" msgstr "你确定要继续吗?" -#: src/slic3r/GUI/DoubleSlider.cpp:2533 +#: src/slic3r/GUI/DoubleSlider.cpp:2602 msgid "" "Select YES if you want to delete all saved tool changes, \n" "NO if you want all tool changes switch to color changes, \n" @@ -1580,28 +1765,42 @@ msgstr "" "如果要将所有刀具更改切换为颜色更改,请选择“否”, \n" "或者选择“取消”以保持其不变。" -#: src/slic3r/GUI/DoubleSlider.cpp:2536 +#: src/slic3r/GUI/DoubleSlider.cpp:2605 msgid "Do you want to delete all saved tool changes?" msgstr "是否要删除所有保存的工具更改?" -#: src/slic3r/GUI/DoubleSlider.cpp:2538 +#: src/slic3r/GUI/DoubleSlider.cpp:2607 msgid "" "The last color change data was saved for a multi extruder printing with tool " "changes for whole print." msgstr "最后一次颜色变化数据保存在多台挤出机打印中,整个打印过程中更换了工具。" -#: src/slic3r/GUI/DoubleSlider.cpp:2539 +#: src/slic3r/GUI/DoubleSlider.cpp:2608 msgid "Your current changes will delete all saved extruder (tool) changes." msgstr "您当前的更改将删除所有保存的挤出机(工具)更改。" -#: src/slic3r/GUI/ExtraRenderers.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:538 -#: src/slic3r/GUI/GUI_ObjectList.cpp:550 src/slic3r/GUI/GUI_ObjectList.cpp:979 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4291 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:250 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:352 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:376 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:607 src/libslic3r/PrintConfig.cpp:800 +#: src/slic3r/GUI/Downloader.cpp:150 +#, boost-format +msgid "" +"Download won't start. Download URL doesn't point to https://files.printables." +"com : %1%" +msgstr "" + +#: src/slic3r/GUI/Downloader.cpp:181 +msgid "The download has failed:" +msgstr "" + +#: src/slic3r/GUI/DownloaderFileGet.cpp:193 +#, boost-format +msgid "Can't create file at %1%." +msgstr "" + +#: src/slic3r/GUI/ExtraRenderers.cpp:323 src/slic3r/GUI/GUI_ObjectList.cpp:571 +#: src/slic3r/GUI/GUI_ObjectList.cpp:583 src/slic3r/GUI/GUI_ObjectList.cpp:1043 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2125 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3013 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4884 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:259 src/libslic3r/PrintConfig.cpp:894 msgid "default" msgstr "默认" @@ -1614,10 +1813,10 @@ msgid "Set extruder change for every" msgstr "设置挤出机每次更换" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:60 -#: src/libslic3r/PrintConfig.cpp:662 src/libslic3r/PrintConfig.cpp:1430 -#: src/libslic3r/PrintConfig.cpp:2135 src/libslic3r/PrintConfig.cpp:2310 -#: src/libslic3r/PrintConfig.cpp:2386 src/libslic3r/PrintConfig.cpp:2639 -#: src/libslic3r/PrintConfig.cpp:2687 src/libslic3r/PrintConfig.cpp:2706 +#: src/libslic3r/PrintConfig.cpp:765 src/libslic3r/PrintConfig.cpp:1476 +#: src/libslic3r/PrintConfig.cpp:2165 src/libslic3r/PrintConfig.cpp:2343 +#: src/libslic3r/PrintConfig.cpp:2417 src/libslic3r/PrintConfig.cpp:2665 +#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2728 msgid "layers" msgstr "层" @@ -1649,26 +1848,26 @@ msgstr "从序列中移除挤出机" msgid "Add extruder to sequence" msgstr "按顺序添加挤出机" -#: src/slic3r/GUI/Field.cpp:190 +#: src/slic3r/GUI/Field.cpp:188 msgid "default value" msgstr "默认值" -#: src/slic3r/GUI/Field.cpp:193 +#: src/slic3r/GUI/Field.cpp:191 msgid "parameter name" msgstr "参数名称" -#: src/slic3r/GUI/Field.cpp:204 src/slic3r/GUI/OptionsGroup.cpp:827 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1067 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1079 +#: src/slic3r/GUI/Field.cpp:206 src/slic3r/GUI/OptionsGroup.cpp:852 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1074 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1086 msgid "N/A" msgstr "N/A" -#: src/slic3r/GUI/Field.cpp:226 src/slic3r/GUI/Field.cpp:298 +#: src/slic3r/GUI/Field.cpp:229 src/slic3r/GUI/Field.cpp:302 #, c-format, boost-format msgid "%s doesn't support percentage" msgstr "%s 不支持百分比" -#: src/slic3r/GUI/Field.cpp:266 +#: src/slic3r/GUI/Field.cpp:269 #, c-format, boost-format msgid "" "Input value is out of range\n" @@ -1677,16 +1876,16 @@ msgstr "" "输入值超出范围\n" "确定 %s 是正确的值并且要继续吗?" -#: src/slic3r/GUI/Field.cpp:269 src/slic3r/GUI/Field.cpp:343 +#: src/slic3r/GUI/Field.cpp:272 src/slic3r/GUI/Field.cpp:347 msgid "Parameter validation" msgstr "参数验证" -#: src/slic3r/GUI/Field.cpp:282 src/slic3r/GUI/Field.cpp:390 -#: src/slic3r/GUI/Field.cpp:1573 +#: src/slic3r/GUI/Field.cpp:285 src/slic3r/GUI/Field.cpp:394 +#: src/slic3r/GUI/Field.cpp:1597 msgid "Input value is out of range" msgstr "输入值超出范围外" -#: src/slic3r/GUI/Field.cpp:340 +#: src/slic3r/GUI/Field.cpp:344 #, c-format, boost-format msgid "" "Do you mean %s%% instead of %s %s?\n" @@ -1697,13 +1896,22 @@ msgstr "" "如果要将此值更改为 %s%%, 请选择\"是\", \n" "或 否,如果您确定 %s %s 是一个正确的值。" -#: src/slic3r/GUI/Field.cpp:397 +#: src/slic3r/GUI/Field.cpp:401 #, boost-format msgid "" "Invalid input format. Expected vector of dimensions in the following format: " "\"%1%\"" msgstr "输入格式无效。应为以下格式的维度向量:“%1%”" +#: src/slic3r/GUI/FileArchiveDialog.cpp:170 +msgid "Archive preview" +msgstr "" + +#: src/slic3r/GUI/FileArchiveDialog.cpp:270 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +msgid "Open" +msgstr "" + #: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flash!" msgstr "写入!" @@ -1788,12 +1996,6 @@ msgstr "固件镜像:" msgid "Select a file" msgstr "选择一个文件" -#: src/slic3r/GUI/FirmwareDialog.cpp:815 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:297 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:372 -msgid "Browse" -msgstr "浏览" - #: src/slic3r/GUI/FirmwareDialog.cpp:817 msgid "Serial port:" msgstr "串行端口:" @@ -1823,10 +2025,10 @@ msgid "Advanced: Output log" msgstr "高级:输出日志" #: src/slic3r/GUI/FirmwareDialog.cpp:862 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:310 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:358 #: src/slic3r/GUI/Mouse3DController.cpp:543 -#: src/slic3r/GUI/PrintHostDialogs.cpp:261 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:122 +#: src/slic3r/GUI/PrintHostDialogs.cpp:313 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:125 msgid "Close" msgstr "关闭" @@ -1846,7 +2048,7 @@ msgstr "确认" msgid "Cancelling..." msgstr "正在取消..." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1488 msgid "Shape Gallery" msgstr "形状画廊" @@ -1854,37 +2056,42 @@ msgstr "形状画廊" msgid "Select shape from the gallery" msgstr "从图库中选择形状" -#: src/slic3r/GUI/GalleryDialog.cpp:100 -msgid "Add to bed" -msgstr "加在床上" - -#: src/slic3r/GUI/GalleryDialog.cpp:101 -msgid "Add selected shape(s) to the bed" -msgstr "将选定形状添加到床上" - -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4152 +#: src/slic3r/GUI/GalleryDialog.cpp:114 src/slic3r/GUI/Tab.cpp:4377 msgid "Add" msgstr "加入" -#: src/slic3r/GUI/GalleryDialog.cpp:117 +#: src/slic3r/GUI/GalleryDialog.cpp:114 msgid "Add one or more custom shapes" msgstr "添加一个或多个自定义形状" -#: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:506 -#: src/slic3r/GUI/GLCanvas3D.cpp:4547 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/GalleryDialog.cpp:115 src/slic3r/GUI/GalleryDialog.cpp:528 +#: src/slic3r/GUI/GLCanvas3D.cpp:4638 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/GUI_Factories.cpp:460 src/slic3r/GUI/Tab.cpp:3973 msgid "Delete" msgstr "删除" -#: src/slic3r/GUI/GalleryDialog.cpp:118 +#: src/slic3r/GUI/GalleryDialog.cpp:115 msgid "Delete one or more custom shape. You can't delete system shapes" msgstr "删除一个或多个自定义形状。不能删除系统形状" -#: src/slic3r/GUI/GalleryDialog.cpp:400 +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "Add to bed" +msgstr "加在床上" + +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "OK" +msgstr "确认" + +#: src/slic3r/GUI/GalleryDialog.cpp:143 +msgid "Add selected shape(s) to the bed" +msgstr "将选定形状添加到床上" + +#: src/slic3r/GUI/GalleryDialog.cpp:422 msgid "Choose one or more files (STL, OBJ):" msgstr "选择一个或多个文件(STL、OBJ):" -#: src/slic3r/GUI/GalleryDialog.cpp:440 +#: src/slic3r/GUI/GalleryDialog.cpp:462 #, boost-format msgid "" "It looks like selected %1%-file has an error or is destructed.\n" @@ -1893,547 +2100,524 @@ msgstr "" "看起来选定的 %1% 文件有错误或已被破坏。\n" "我们无法加载此文件" -#: src/slic3r/GUI/GalleryDialog.cpp:451 +#: src/slic3r/GUI/GalleryDialog.cpp:473 msgid "Choose one PNG file:" msgstr "选择一个 PNG 文件:" -#: src/slic3r/GUI/GalleryDialog.cpp:464 +#: src/slic3r/GUI/GalleryDialog.cpp:486 msgid "Replacing of the PNG" msgstr "替换 PNG" -#: src/slic3r/GUI/GalleryDialog.cpp:508 +#: src/slic3r/GUI/GalleryDialog.cpp:530 msgid "Change thumbnail" msgstr "更改缩略图" -#: src/slic3r/GUI/GalleryDialog.cpp:549 src/slic3r/GUI/GalleryDialog.cpp:554 +#: src/slic3r/GUI/GalleryDialog.cpp:571 src/slic3r/GUI/GalleryDialog.cpp:576 #, boost-format msgid "Loading of the \"%1%\"" msgstr "正在加载 \"%1%\"" -#: src/slic3r/GUI/GCodeViewer.cpp:274 +#: src/slic3r/GUI/GCodeViewer.cpp:343 msgid "Tool position" msgstr "刀具位置" -#: src/slic3r/GUI/GCodeViewer.cpp:1457 +#: src/slic3r/GUI/GCodeViewer.cpp:1547 msgid "Generating toolpaths" msgstr "生成刀具轨迹" -#: src/slic3r/GUI/GCodeViewer.cpp:1517 +#: src/slic3r/GUI/GCodeViewer.cpp:1619 msgid "Generating vertex buffer" msgstr "生成顶点缓冲区" -#: src/slic3r/GUI/GCodeViewer.cpp:1857 +#: src/slic3r/GUI/GCodeViewer.cpp:1979 msgid "Generating index buffers" msgstr "生成索引缓冲区" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to hide" msgstr "单击以隐藏" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to show" msgstr "点击显示" -#: src/slic3r/GUI/GCodeViewer.cpp:3181 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 msgid "up to" msgstr "高达" -#: src/slic3r/GUI/GCodeViewer.cpp:3187 +#: src/slic3r/GUI/GCodeViewer.cpp:3455 msgid "above" msgstr "在上面" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "from" msgstr "从" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "to" msgstr "到" -#: src/slic3r/GUI/GCodeViewer.cpp:3245 src/slic3r/GUI/GCodeViewer.cpp:3246 -#: src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3513 src/slic3r/GUI/GCodeViewer.cpp:3514 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 msgid "Percentage" msgstr "百分率" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3570 msgid "Feature type" msgstr "功能类型" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3592 #: src/slic3r/GUI/RammingChart.cpp:90 msgid "Time" msgstr "时间" -#: src/slic3r/GUI/GCodeViewer.cpp:3295 src/slic3r/GUI/GCodeViewer.cpp:3306 -#: src/slic3r/GUI/GCodeViewer.cpp:3566 -msgid "Used filament" -msgstr "消耗耗材" - -#: src/slic3r/GUI/GCodeViewer.cpp:3298 +#: src/slic3r/GUI/GCodeViewer.cpp:3571 msgid "Height (mm)" msgstr "高度 (mm)" -#: src/slic3r/GUI/GCodeViewer.cpp:3299 +#: src/slic3r/GUI/GCodeViewer.cpp:3572 msgid "Width (mm)" msgstr "宽度 (mm)" -#: src/slic3r/GUI/GCodeViewer.cpp:3300 +#: src/slic3r/GUI/GCodeViewer.cpp:3573 msgid "Speed (mm/s)" msgstr "回退速度 (mm/s)" -#: src/slic3r/GUI/GCodeViewer.cpp:3301 -msgid "Fan Speed (%)" -msgstr "风扇转速 (%)" +#: src/slic3r/GUI/GCodeViewer.cpp:3574 +msgid "Fan speed (%)" +msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3302 +#: src/slic3r/GUI/GCodeViewer.cpp:3575 msgid "Temperature (°C)" msgstr "温度 (摄氏度)" -#: src/slic3r/GUI/GCodeViewer.cpp:3303 +#: src/slic3r/GUI/GCodeViewer.cpp:3576 msgid "Volumetric flow rate (mm³/s)" msgstr "体积流量 (mm³/s)" -#: src/slic3r/GUI/GCodeViewer.cpp:3306 src/slic3r/GUI/GUI_Preview.cpp:224 -#: src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3577 +msgid "Layer time (linear)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3578 +msgid "Layer time (logarithmic)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3579 msgid "Tool" msgstr "工具" -#: src/slic3r/GUI/GCodeViewer.cpp:3309 src/slic3r/GUI/GUI_Preview.cpp:225 -#: src/slic3r/GUI/GUI_Preview.cpp:957 +#: src/slic3r/GUI/GCodeViewer.cpp:3580 msgid "Color Print" msgstr "彩色打印" -#: src/slic3r/GUI/GCodeViewer.cpp:3347 src/slic3r/GUI/GCodeViewer.cpp:3393 -#: src/slic3r/GUI/GCodeViewer.cpp:3398 src/slic3r/GUI/GUI_ObjectList.cpp:312 -#: src/slic3r/GUI/wxExtensions.cpp:536 src/libslic3r/PrintConfig.cpp:795 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 src/slic3r/GUI/GCodeViewer.cpp:3594 +#: src/slic3r/GUI/GCodeViewer.cpp:3860 +msgid "Used filament" +msgstr "消耗耗材" + +#: src/slic3r/GUI/GCodeViewer.cpp:3623 src/slic3r/GUI/GCodeViewer.cpp:4067 +#: src/libslic3r/PrintConfig.cpp:3025 +msgid "Travel" +msgstr "旅行" + +#: src/slic3r/GUI/GCodeViewer.cpp:3640 src/slic3r/GUI/GCodeViewer.cpp:3685 +#: src/slic3r/GUI/GCodeViewer.cpp:3689 src/slic3r/GUI/GUI_ObjectList.cpp:338 +#: src/slic3r/GUI/wxExtensions.cpp:547 src/libslic3r/PrintConfig.cpp:888 msgid "Extruder" msgstr "挤出机" -#: src/slic3r/GUI/GCodeViewer.cpp:3370 +#: src/slic3r/GUI/GCodeViewer.cpp:3662 msgid "Default color" msgstr "默认颜色" -#: src/slic3r/GUI/GCodeViewer.cpp:3393 +#: src/slic3r/GUI/GCodeViewer.cpp:3685 msgid "default color" msgstr "默认颜色" -#: src/slic3r/GUI/GCodeViewer.cpp:3491 src/slic3r/GUI/GCodeViewer.cpp:3547 +#: src/slic3r/GUI/GCodeViewer.cpp:3785 src/slic3r/GUI/GCodeViewer.cpp:3841 msgid "Color change" msgstr "变色" -#: src/slic3r/GUI/GCodeViewer.cpp:3510 src/slic3r/GUI/GCodeViewer.cpp:3545 +#: src/slic3r/GUI/GCodeViewer.cpp:3804 src/slic3r/GUI/GCodeViewer.cpp:3839 msgid "Print" msgstr "打印" -#: src/slic3r/GUI/GCodeViewer.cpp:3546 src/slic3r/GUI/GCodeViewer.cpp:3580 +#: src/slic3r/GUI/GCodeViewer.cpp:3840 src/slic3r/GUI/GCodeViewer.cpp:3874 msgid "Pause" msgstr "暂停" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Event" msgstr "事件" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Remaining time" msgstr "剩余时间" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Duration" msgstr "期间" -#: src/slic3r/GUI/GCodeViewer.cpp:3609 src/slic3r/GUI/GUI_Preview.cpp:1049 -#: src/libslic3r/PrintConfig.cpp:2937 -msgid "Travel" -msgstr "旅行" - -#: src/slic3r/GUI/GCodeViewer.cpp:3612 -msgid "Movement" -msgstr "移动" - -#: src/slic3r/GUI/GCodeViewer.cpp:3613 -msgid "Extrusion" -msgstr "挤压" - -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1870 -#: src/slic3r/GUI/Tab.cpp:2812 -msgid "Retraction" -msgstr "回抽" - -#: src/slic3r/GUI/GCodeViewer.cpp:3631 src/slic3r/GUI/GCodeViewer.cpp:3634 -#: src/slic3r/GUI/GUI_Preview.cpp:1050 -msgid "Wipe" -msgstr "擦" - -#: src/slic3r/GUI/GCodeViewer.cpp:3666 src/slic3r/GUI/GUI_Preview.cpp:257 -#: src/slic3r/GUI/GUI_Preview.cpp:272 -msgid "Options" -msgstr "选项" - -#: src/slic3r/GUI/GCodeViewer.cpp:3669 src/slic3r/GUI/GUI_Preview.cpp:1051 -msgid "Retractions" -msgstr "回抽" - -#: src/slic3r/GUI/GCodeViewer.cpp:3670 src/slic3r/GUI/GUI_Preview.cpp:1052 -msgid "Deretractions" -msgstr "退缩" - -#: src/slic3r/GUI/GCodeViewer.cpp:3671 src/slic3r/GUI/GUI_Preview.cpp:1053 -msgid "Seams" -msgstr "接缝" - -#: src/slic3r/GUI/GCodeViewer.cpp:3672 src/slic3r/GUI/GUI_Preview.cpp:1054 -msgid "Tool changes" -msgstr "工具更换" - -#: src/slic3r/GUI/GCodeViewer.cpp:3673 src/slic3r/GUI/GUI_Preview.cpp:1055 -msgid "Color changes" -msgstr "颜色变化" - -#: src/slic3r/GUI/GCodeViewer.cpp:3674 src/slic3r/GUI/GUI_Preview.cpp:1056 -msgid "Print pauses" -msgstr "打印暂停" - -#: src/slic3r/GUI/GCodeViewer.cpp:3675 src/slic3r/GUI/GUI_Preview.cpp:1057 -msgid "Custom G-codes" -msgstr "自定义 G-Code" - -#: src/slic3r/GUI/GCodeViewer.cpp:3695 src/slic3r/GUI/GCodeViewer.cpp:3714 -#: src/slic3r/GUI/GUI.cpp:341 src/slic3r/GUI/Plater.cpp:822 -#: src/libslic3r/PrintConfig.cpp:322 +#: src/slic3r/GUI/GCodeViewer.cpp:3928 src/slic3r/GUI/GUI.cpp:332 +#: src/slic3r/GUI/Plater.cpp:852 src/libslic3r/PrintConfig.cpp:335 msgid "Printer" msgstr "打印机" -#: src/slic3r/GUI/GCodeViewer.cpp:3697 src/slic3r/GUI/GCodeViewer.cpp:3719 -#: src/slic3r/GUI/GUI.cpp:337 src/slic3r/GUI/Plater.cpp:818 +#: src/slic3r/GUI/GCodeViewer.cpp:3931 src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/Plater.cpp:848 msgid "Print settings" msgstr "打印设置" -#: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 -#: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1970 src/slic3r/GUI/Tab.cpp:1971 +#: src/slic3r/GUI/GCodeViewer.cpp:3936 src/slic3r/GUI/GUI.cpp:330 +#: src/slic3r/GUI/Plater.cpp:849 src/slic3r/GUI/Tab.cpp:1930 +#: src/slic3r/GUI/Tab.cpp:1931 msgid "Filament" msgstr "耗材" -#: src/slic3r/GUI/GCodeViewer.cpp:3739 +#: src/slic3r/GUI/GCodeViewer.cpp:3950 msgid "Estimated printing times" msgstr "估计打印时间" -#: src/slic3r/GUI/GCodeViewer.cpp:3758 +#: src/slic3r/GUI/GCodeViewer.cpp:3969 msgid "Normal mode" msgstr "正常模式" -#: src/slic3r/GUI/GCodeViewer.cpp:3759 +#: src/slic3r/GUI/GCodeViewer.cpp:3970 msgid "Stealth mode" msgstr "隐身模式" -#: src/slic3r/GUI/GCodeViewer.cpp:3766 src/libslic3r/PrintConfig.cpp:1189 -#: src/libslic3r/PrintConfig.cpp:1207 src/libslic3r/PrintConfig.cpp:1217 -#: src/libslic3r/PrintConfig.cpp:1262 +#: src/slic3r/GUI/GCodeViewer.cpp:3979 src/libslic3r/PrintConfig.cpp:1249 +#: src/libslic3r/PrintConfig.cpp:1267 src/libslic3r/PrintConfig.cpp:1277 +#: src/libslic3r/PrintConfig.cpp:1322 msgid "First layer" msgstr "第一层" -#: src/slic3r/GUI/GCodeViewer.cpp:3767 +#: src/slic3r/GUI/GCodeViewer.cpp:3983 msgid "Total" msgstr "全部的" -#: src/slic3r/GUI/GCodeViewer.cpp:3796 +#: src/slic3r/GUI/GCodeViewer.cpp:4002 msgid "Show stealth mode" msgstr "显示隐形模式" -#: src/slic3r/GUI/GCodeViewer.cpp:3800 +#: src/slic3r/GUI/GCodeViewer.cpp:4006 msgid "Show normal mode" msgstr "显示正常模式" -#: src/slic3r/GUI/GLCanvas3D.cpp:225 src/slic3r/GUI/GLCanvas3D.cpp:4694 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:53 -msgid "Variable layer height" -msgstr "可变层高" +#: src/slic3r/GUI/GCodeViewer.cpp:4071 +msgid "Wipe" +msgstr "擦" -#: src/slic3r/GUI/GLCanvas3D.cpp:227 -msgid "Left mouse button:" -msgstr "鼠标左键:" +#: src/slic3r/GUI/GCodeViewer.cpp:4075 +msgid "Retractions" +msgstr "回抽" -#: src/slic3r/GUI/GLCanvas3D.cpp:229 -msgid "Add detail" -msgstr "添加细节" +#: src/slic3r/GUI/GCodeViewer.cpp:4079 +msgid "Deretractions" +msgstr "退缩" -#: src/slic3r/GUI/GLCanvas3D.cpp:231 -msgid "Right mouse button:" -msgstr "鼠标右键:" +#: src/slic3r/GUI/GCodeViewer.cpp:4083 +msgid "Seams" +msgstr "接缝" -#: src/slic3r/GUI/GLCanvas3D.cpp:233 -msgid "Remove detail" -msgstr "删除细节" +#: src/slic3r/GUI/GCodeViewer.cpp:4087 +msgid "Tool changes" +msgstr "工具更换" -#: src/slic3r/GUI/GLCanvas3D.cpp:235 +#: src/slic3r/GUI/GCodeViewer.cpp:4091 +msgid "Color changes" +msgstr "颜色变化" + +#: src/slic3r/GUI/GCodeViewer.cpp:4095 +msgid "Print pauses" +msgstr "打印暂停" + +#: src/slic3r/GUI/GCodeViewer.cpp:4099 +msgid "Custom G-codes" +msgstr "自定义 G-Code" + +#: src/slic3r/GUI/GCodeViewer.cpp:4103 +msgid "Center of gravity" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:4108 +msgid "Shells" +msgstr "壳" + +#: src/slic3r/GUI/GCodeViewer.cpp:4113 +msgid "Tool marker" +msgstr "工具标记" + +#: src/slic3r/GUI/GLCanvas3D.cpp:185 src/slic3r/GUI/GLCanvas3D.cpp:4784 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:71 +msgid "Variable layer height" +msgstr "可变层高" + +#: src/slic3r/GUI/GLCanvas3D.cpp:187 +msgid "Left mouse button:" +msgstr "鼠标左键:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:189 +msgid "Add detail" +msgstr "添加细节" + +#: src/slic3r/GUI/GLCanvas3D.cpp:191 +msgid "Right mouse button:" +msgstr "鼠标右键:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:193 +msgid "Remove detail" +msgstr "删除细节" + +#: src/slic3r/GUI/GLCanvas3D.cpp:195 msgid "Shift + Left mouse button:" msgstr "Shift+鼠标左键:" -#: src/slic3r/GUI/GLCanvas3D.cpp:237 +#: src/slic3r/GUI/GLCanvas3D.cpp:197 msgid "Reset to base" msgstr "重置到基地" -#: src/slic3r/GUI/GLCanvas3D.cpp:239 +#: src/slic3r/GUI/GLCanvas3D.cpp:199 msgid "Shift + Right mouse button:" msgstr "Shift+鼠标右键:" -#: src/slic3r/GUI/GLCanvas3D.cpp:241 +#: src/slic3r/GUI/GLCanvas3D.cpp:201 msgid "Smoothing" msgstr "平滑的" -#: src/slic3r/GUI/GLCanvas3D.cpp:243 +#: src/slic3r/GUI/GLCanvas3D.cpp:203 msgid "Mouse wheel:" msgstr "鼠标滚轮:" -#: src/slic3r/GUI/GLCanvas3D.cpp:245 +#: src/slic3r/GUI/GLCanvas3D.cpp:205 msgid "Increase/decrease edit area" msgstr "增加/减少编辑区域" -#: src/slic3r/GUI/GLCanvas3D.cpp:248 +#: src/slic3r/GUI/GLCanvas3D.cpp:208 msgid "Adaptive" msgstr "适应的" -#: src/slic3r/GUI/GLCanvas3D.cpp:254 +#: src/slic3r/GUI/GLCanvas3D.cpp:214 msgid "Quality / Speed" msgstr "质量/速度" -#: src/slic3r/GUI/GLCanvas3D.cpp:257 +#: src/slic3r/GUI/GLCanvas3D.cpp:217 msgid "Higher print quality versus higher print speed." msgstr "更高的打印质量与更高的打印速度。" -#: src/slic3r/GUI/GLCanvas3D.cpp:268 +#: src/slic3r/GUI/GLCanvas3D.cpp:228 msgid "Smooth" msgstr "平整的" -#: src/slic3r/GUI/GLCanvas3D.cpp:274 src/libslic3r/PrintConfig.cpp:819 +#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/libslic3r/PrintConfig.cpp:908 msgid "Radius" msgstr "半径" -#: src/slic3r/GUI/GLCanvas3D.cpp:286 +#: src/slic3r/GUI/GLCanvas3D.cpp:246 msgid "Keep min" msgstr "保持最小" -#: src/slic3r/GUI/GLCanvas3D.cpp:295 src/slic3r/GUI/GLCanvas3D.cpp:4123 +#: src/slic3r/GUI/GLCanvas3D.cpp:255 src/slic3r/GUI/GLCanvas3D.cpp:4217 msgid "Reset" msgstr "重置" -#: src/slic3r/GUI/GLCanvas3D.cpp:561 +#: src/slic3r/GUI/GLCanvas3D.cpp:602 msgid "Variable layer height - Manual edit" msgstr "可变层高度-手动编辑" -#: src/slic3r/GUI/GLCanvas3D.cpp:676 +#: src/slic3r/GUI/GLCanvas3D.cpp:717 msgid "Seq." msgstr "顺序。" -#: src/slic3r/GUI/GLCanvas3D.cpp:1310 +#: src/slic3r/GUI/GLCanvas3D.cpp:1319 msgid "Variable layer height - Reset" msgstr "可变层高度-重置" -#: src/slic3r/GUI/GLCanvas3D.cpp:1318 +#: src/slic3r/GUI/GLCanvas3D.cpp:1327 msgid "Variable layer height - Adaptive" msgstr "可变层高度-自适应" -#: src/slic3r/GUI/GLCanvas3D.cpp:1326 +#: src/slic3r/GUI/GLCanvas3D.cpp:1335 msgid "Variable layer height - Smooth all" msgstr "可变层高度-平滑所有" -#: src/slic3r/GUI/GLCanvas3D.cpp:1733 +#: src/slic3r/GUI/GLCanvas3D.cpp:1778 msgid "Mirror Object" msgstr "镜像物体" -#: src/slic3r/GUI/GLCanvas3D.cpp:2612 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:560 +#: src/slic3r/GUI/GLCanvas3D.cpp:2542 src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:117 msgid "Gizmo-Move" msgstr "Gizmo-移动" -#: src/slic3r/GUI/GLCanvas3D.cpp:2695 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562 +#: src/slic3r/GUI/GLCanvas3D.cpp:2638 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:661 msgid "Gizmo-Rotate" msgstr "Gizmo-旋转" -#: src/slic3r/GUI/GLCanvas3D.cpp:3300 +#: src/slic3r/GUI/GLCanvas3D.cpp:3263 msgid "Move Object" msgstr "移动对象" -#: src/slic3r/GUI/GLCanvas3D.cpp:3821 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3513 +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:40 +msgid "Gizmo-Place on Face" +msgstr "Gizmo-放在面上" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3904 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Switch to Settings" msgstr "切换到设置" -#: src/slic3r/GUI/GLCanvas3D.cpp:3822 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3905 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Print Settings Tab" msgstr "打印设置选项卡" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Filament Settings Tab" msgstr "耗材设置选项卡" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Material Settings Tab" msgstr "材质设置选项卡" -#: src/slic3r/GUI/GLCanvas3D.cpp:3824 src/slic3r/GUI/GLCanvas3D.cpp:4657 +#: src/slic3r/GUI/GLCanvas3D.cpp:3907 src/slic3r/GUI/GLCanvas3D.cpp:4746 msgid "Printer Settings Tab" msgstr "打印机设置选项卡" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Undo History" msgstr "撤销历史操作" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Redo History" msgstr "重做历史操作" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" msgstr[0] "撤消 %1$d 操作" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" msgstr[0] "重做 %1$d 操作" -#: src/slic3r/GUI/GLCanvas3D.cpp:4011 src/slic3r/GUI/GLCanvas3D.cpp:4673 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 src/slic3r/GUI/Search.cpp:426 +#: src/slic3r/GUI/GLCanvas3D.cpp:4106 src/slic3r/GUI/GLCanvas3D.cpp:4762 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/Search.cpp:482 msgid "Search" msgstr "搜索" -#: src/slic3r/GUI/GLCanvas3D.cpp:4025 src/slic3r/GUI/GLCanvas3D.cpp:4033 -#: src/slic3r/GUI/Search.cpp:432 +#: src/slic3r/GUI/GLCanvas3D.cpp:4120 src/slic3r/GUI/GLCanvas3D.cpp:4128 +#: src/slic3r/GUI/Search.cpp:488 msgid "Enter a search term" msgstr "输入搜索词" -#: src/slic3r/GUI/GLCanvas3D.cpp:4064 +#: src/slic3r/GUI/GLCanvas3D.cpp:4160 msgid "Arrange options" msgstr "安排选项" -#: src/slic3r/GUI/GLCanvas3D.cpp:4097 +#: src/slic3r/GUI/GLCanvas3D.cpp:4193 #, boost-format msgid "Press %1%left mouse button to enter the exact value" msgstr "按鼠标左键 %1% 输入准确值" -#: src/slic3r/GUI/GLCanvas3D.cpp:4099 +#: src/slic3r/GUI/GLCanvas3D.cpp:4195 msgid "Spacing" msgstr "空格" -#: src/slic3r/GUI/GLCanvas3D.cpp:4106 -msgid "Enable rotations (slow)" -msgstr "启用旋转(慢速)" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Alignment" -msgstr "对齐" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:4500 -msgid "Center" -msgstr "居中" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear left" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front left" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front right" +#: src/slic3r/GUI/GLCanvas3D.cpp:4202 +msgid "Spacing from bed" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear right" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:2271 -msgid "Random" -msgstr "随机" +#: src/slic3r/GUI/GLCanvas3D.cpp:4209 +msgid "Enable rotations (slow)" +msgstr "启用旋转(慢速)" -#: src/slic3r/GUI/GLCanvas3D.cpp:4133 src/slic3r/GUI/GLCanvas3D.cpp:4565 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Plater.cpp:1664 +#: src/slic3r/GUI/GLCanvas3D.cpp:4228 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 src/slic3r/GUI/Plater.cpp:7118 msgid "Arrange" msgstr "整理" -#: src/slic3r/GUI/GLCanvas3D.cpp:4539 +#: src/slic3r/GUI/GLCanvas3D.cpp:4630 msgid "Add..." msgstr "添加..." -#: src/slic3r/GUI/GLCanvas3D.cpp:4556 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5509 src/slic3r/GUI/Tab.cpp:4158 +#: src/slic3r/GUI/GLCanvas3D.cpp:4647 src/slic3r/GUI/KBShortcutsDialog.cpp:105 +#: src/slic3r/GUI/Plater.cpp:6047 src/slic3r/GUI/Tab.cpp:4383 msgid "Delete all" msgstr "全部删除" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 src/slic3r/GUI/KBShortcutsDialog.cpp:133 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 src/slic3r/GUI/KBShortcutsDialog.cpp:142 msgid "Arrange selection" msgstr "整理选中的" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 msgid "Click right mouse button to show arrangement options" msgstr "单击鼠标右键以显示排列选项" -#: src/slic3r/GUI/GLCanvas3D.cpp:4587 +#: src/slic3r/GUI/GLCanvas3D.cpp:4676 msgid "Copy" msgstr "复制" -#: src/slic3r/GUI/GLCanvas3D.cpp:4596 +#: src/slic3r/GUI/GLCanvas3D.cpp:4685 msgid "Paste" msgstr "粘贴" -#: src/slic3r/GUI/GLCanvas3D.cpp:4608 src/slic3r/GUI/GUI_Factories.cpp:1084 -#: src/slic3r/GUI/GUI_Factories.cpp:1108 src/slic3r/GUI/GUI_Factories.cpp:1119 +#: src/slic3r/GUI/GLCanvas3D.cpp:4697 src/slic3r/GUI/GUI_Factories.cpp:1237 +#: src/slic3r/GUI/GUI_Factories.cpp:1261 src/slic3r/GUI/GUI_Factories.cpp:1272 msgid "Add instance" msgstr "添加实例" -#: src/slic3r/GUI/GLCanvas3D.cpp:4619 src/slic3r/GUI/GUI_Factories.cpp:1087 +#: src/slic3r/GUI/GLCanvas3D.cpp:4708 src/slic3r/GUI/GUI_Factories.cpp:1240 msgid "Remove instance" msgstr "删除实例" -#: src/slic3r/GUI/GLCanvas3D.cpp:4632 +#: src/slic3r/GUI/GLCanvas3D.cpp:4721 msgid "Split to objects" msgstr "拆分为对象" -#: src/slic3r/GUI/GLCanvas3D.cpp:4642 +#: src/slic3r/GUI/GLCanvas3D.cpp:4731 msgid "Split to parts" msgstr "拆分为零件" -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/GLCanvas3D.cpp:4795 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/GLCanvas3D.cpp:4874 msgid "Click right mouse button to open/close History" msgstr "单击鼠标右键打开/关闭历史记录" -#: src/slic3r/GUI/GLCanvas3D.cpp:4779 +#: src/slic3r/GUI/GLCanvas3D.cpp:4859 #, boost-format msgid "Next Undo action: %1%" msgstr "下一个撤消操作: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:4795 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/GLCanvas3D.cpp:4874 src/slic3r/GUI/KBShortcutsDialog.cpp:107 +#: src/slic3r/GUI/MainFrame.cpp:1429 msgid "Redo" msgstr "重做" -#: src/slic3r/GUI/GLCanvas3D.cpp:4817 +#: src/slic3r/GUI/GLCanvas3D.cpp:4895 #, boost-format msgid "Next Redo action: %1%" msgstr "下一个重做操作: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:6434 +#: src/slic3r/GUI/GLCanvas3D.cpp:6784 msgid "An object outside the print area was detected." msgstr "检测到打印区域外的物体。" -#: src/slic3r/GUI/GLCanvas3D.cpp:6435 +#: src/slic3r/GUI/GLCanvas3D.cpp:6785 msgid "A toolpath outside the print area was detected." msgstr "检测到打印区域外的刀轨。" -#: src/slic3r/GUI/GLCanvas3D.cpp:6436 +#: src/slic3r/GUI/GLCanvas3D.cpp:6786 msgid "SLA supports outside the print area were detected." msgstr "检测到打印区域外的 SLA 支持。" -#: src/slic3r/GUI/GLCanvas3D.cpp:6437 +#: src/slic3r/GUI/GLCanvas3D.cpp:6787 msgid "Some objects are not visible during editing." msgstr "某些对象在编辑期间不可见。" -#: src/slic3r/GUI/GLCanvas3D.cpp:6439 +#: src/slic3r/GUI/GLCanvas3D.cpp:6789 msgid "" "An object outside the print area was detected.\n" "Resolve the current problem to continue slicing." @@ -2441,320 +2625,1340 @@ msgstr "" "检测到打印区域外的物体。\n" "重新解决当前问题以继续切片。" -#: src/slic3r/GUI/GLCanvas3D.cpp:6513 +#: src/slic3r/GUI/GLCanvas3D.cpp:6864 msgid "Selection-Add from rectangle" msgstr "从矩形选择-添加" -#: src/slic3r/GUI/GLCanvas3D.cpp:6528 +#: src/slic3r/GUI/GLCanvas3D.cpp:6879 msgid "Selection-Remove from rectangle" msgstr "从矩形中选择-删除" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4478 -msgid "Cut" -msgstr "剪切" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:206 +msgid "Planar" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -msgid "in" -msgstr "在里面" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Auto" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 -msgid "Keep upper part" -msgstr "保留上半部分" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Manual" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 -msgid "Keep lower part" -msgstr "保留下半部分" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:213 +msgid "Plug" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:196 -msgid "Rotate lower part upwards" -msgstr "旋转下部向上" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:214 +msgid "Dowel" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:201 -msgid "Perform cut" -msgstr "执行切割" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Prism" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:49 -msgid "Paint-on supports" -msgstr "绘制支撑" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Frustum" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 -msgid "Clipping of view" -msgstr "剪切视图" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Triangle" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 -msgid "Reset direction" -msgstr "重置方向" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Square" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 -msgid "Brush size" -msgstr "刷子大小" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Hexagon" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 -msgid "Brush shape" -msgstr "画笔形状" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:59 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 +msgid "Circle" +msgstr "圆圈" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 -msgid "Left mouse button" -msgstr "鼠标左键" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:233 +msgid "Keep orientation" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 -msgid "Enforce supports" -msgstr "强制支持" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:234 +msgid "Place on cut" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 -msgid "Right mouse button" -msgstr "鼠标右键" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:235 +msgid "Flip upside down" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:434 -msgid "Block supports" -msgstr "阻止支撑" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +msgid "inch" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 -msgid "Shift + Left mouse button" -msgstr "Shift+鼠标左键" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 +msgid "Part" +msgstr "部件" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:429 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 -msgid "Remove selection" -msgstr "删除所选内容" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 src/libslic3r/Print.cpp:1236 +msgid "Object" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 -msgid "Remove all selection" -msgstr "删除所有选择" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:264 +msgid "" +"Click to flip the cut plane\n" +"Drag to move the cut plane" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 -msgid "Circle" -msgstr "圆圈" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:269 src/libslic3r/PrintConfig.cpp:498 +#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2325 src/libslic3r/PrintConfig.cpp:2613 +#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2876 src/libslic3r/PrintConfig.cpp:2907 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3231 +#: src/libslic3r/PrintConfig.cpp:3466 src/libslic3r/PrintConfig.cpp:3951 +msgid "°" +msgstr "°" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 -#: src/slic3r/GUI/GUI_Factories.cpp:461 -msgid "Sphere" -msgstr "球形" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:367 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:571 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1232 +msgid "Move cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +msgid "in" +msgstr "在里面" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:68 -#: src/libslic3r/PrintConfig.cpp:1172 -msgid "Triangles" -msgstr "三角形" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:544 +msgid "Value" +msgstr "值" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 -msgid "Highlight overhang by angle" -msgstr "通过角度高亮悬挑" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:549 +msgid "Tolerance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 -msgid "Enforce" -msgstr "执行" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 +msgid "Left click" +msgstr "左鍵單擊" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 -msgid "Tool type" -msgstr "工具类型" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2348 +msgid "Add connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 -msgid "Brush" -msgstr "刷子" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 +msgid "Right click" +msgstr "右键点击" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:128 -msgid "Smart fill" -msgstr "智能填充" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +msgid "Remove connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:131 -msgid "Smart fill angle" -msgstr "智能填充角度" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 +msgid "Drag" +msgstr "拖动" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:132 -msgid "Split triangles" -msgstr "分裂三角形" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1216 +msgid "Move connector" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 -msgid "On overhangs only" -msgstr "只在悬挑上" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +msgid "Add connector to selection" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:174 -#, boost-format -msgid "" -"Preselects faces by overhang angle. It is possible to restrict paintable " -"facets to only preselected faces when the option \"%1%\" is enabled." +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +msgid "Remove connector from selection" msgstr "" -"通过悬垂角度预选面。启用选项 \"%1%\" 时,可以将可绘制的面限制为仅预选的面。" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:217 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:378 -msgid "Paints facets according to the chosen painting brush." -msgstr "根据选择的画笔绘制面。" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:870 +msgid "Select all connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:391 -msgid "" -"Paints neighboring facets whose relative angle is less or equal to set angle." -msgstr "绘制相对角度小于或等于“设置角度”的相邻面。" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:894 src/libslic3r/PrintConfig.cpp:4644 +msgid "Cut" +msgstr "剪切" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:229 -#, boost-format -msgid "Allows painting only on facets selected by: \"%1%\"" -msgstr "仅允许在选择的面上绘制:\"%1%\"" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1227 +msgid "Rotate cut plane" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:244 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:419 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:144 -msgid "Paints all facets inside, regardless of their orientation." -msgstr "绘制内部的所有面,无论其方向如何。" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1448 +msgid "Render cut plane as circle" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:253 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:428 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:152 -msgid "Ignores facets facing away from the camera." -msgstr "忽略背对摄影机的面。" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1537 +msgid "Connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:262 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:437 -msgid "Paints only one facet." -msgstr "只绘制一个面。" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1541 +msgid "Remove connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:270 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:285 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:445 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:462 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:132 -msgid "Alt + Mouse wheel" -msgstr "Alt+鼠标滚轮" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1550 +msgid "Type" +msgstr "类型" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 -msgid "Splits bigger facets into smaller ones while the object is painted." -msgstr "在绘制对象时,将较大的面拆分为较小的面。" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1561 src/libslic3r/PrintConfig.cpp:2816 +msgid "Style" +msgstr "样式" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:308 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:483 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:170 -msgid "Ctrl + Mouse wheel" -msgstr "Ctrl+鼠标滚轮" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1568 +msgid "Depth ratio" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:313 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:488 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:175 -msgid "Reset selection" -msgstr "重置选择" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1586 +msgid "Confirm connectors" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:364 -msgid "Block supports by angle" -msgstr "按角度阻止支撑" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1652 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1666 +msgid "Flip cut plane" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:365 -msgid "Add supports by angle" -msgstr "按角度添加支撑" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1710 +msgid "Hold SHIFT key to draw a cut line" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1716 +msgid "Cut position: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1725 +msgid "Reset cutting plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Edit connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Add connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1744 +msgid "Reset cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1745 +msgid "Reset cutting plane and remove connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1800 +msgid "After cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1820 +msgid "Cut to" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1823 +msgid "Objects" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1826 +msgid "Parts" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1840 +msgid "Perform cut" +msgstr "执行切割" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1930 +msgid "Invalid connectors detected" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1932 +#, c-format, boost-format +msgid "%1$d connector is out of cut contour" +msgid_plural "%1$d connectors are out of cut contour" +msgstr[0] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1935 +#, c-format, boost-format +msgid "%1$d connector is out of object" +msgid_plural "%1$d connectors are out of object" +msgstr[0] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1938 +msgid "Some connectors are overlapped" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1942 +msgid "" +"Invalid state. \n" +"No one part is selected for keep after cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1944 +msgid "" +"Warning state. \n" +"Cut plane is placed out of object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2153 +msgid "Connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2183 +msgid "Cut by Plane" +msgstr "按平面切割" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2323 +msgid "Cut by line" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2373 +msgid "Delete connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:252 +msgid "Entering Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:253 +msgid "Leaving Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:254 +msgid "Cut gizmo editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:601 +msgid "Emboss" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:866 +msgid "ERROR: Wait until ends or Cancel process." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:921 +msgid "Text-Rotate" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:953 +msgid "Font" +msgstr "字体" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:954 +#: src/libslic3r/PrintConfig.cpp:897 +msgid "Height" +msgstr "高度" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:955 +msgid "Depth" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:963 +msgid "Use surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:964 +msgid "Char gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:965 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Line gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:966 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:967 +msgid "Skew ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:968 +msgid "Z-move" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:969 +msgid "Z-rot" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:970 +msgid "Collection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1047 +msgid "NORMAL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1048 +msgid "SMALL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1049 +msgid "ITALIC" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1050 +msgid "SWISS" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1051 +msgid "MODERN" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1088 +msgid "First font" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1093 +msgid "Default font" +msgstr "缺省字体" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1098 +msgid "Embossed text" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1513 +msgid "Warning: No font is selected. Select correct one." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1531 +#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1437 +#: src/slic3r/GUI/Tab.cpp:1472 src/slic3r/GUI/Tab.cpp:1607 +#: src/slic3r/GUI/Tab.cpp:1611 src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:2390 src/slic3r/GUI/Tab.cpp:4985 +#: src/libslic3r/PrintConfig.cpp:276 src/libslic3r/PrintConfig.cpp:514 +#: src/libslic3r/PrintConfig.cpp:1484 src/libslic3r/PrintConfig.cpp:1566 +#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:2562 +#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:3166 +#: src/libslic3r/PrintConfig.cpp:3200 src/libslic3r/PrintConfig.cpp:3211 +#: src/libslic3r/PrintConfig.cpp:3226 src/libslic3r/PrintConfig.cpp:3239 +#: src/libslic3r/PrintConfig.cpp:3248 src/libslic3r/PrintConfig.cpp:3260 +#: src/libslic3r/PrintConfig.cpp:3642 +msgid "Advanced" +msgstr "高级" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1631 +msgid "Can't write text by selected font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1632 +msgid "Try to choose another font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Empty" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Embossed text can NOT contain only white spaces." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Bad symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Text contain character glyph (represented by '?') unknown by font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:535 +msgid "Skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +msgid "Unsupported visualization of font skew for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Unsupported visualization of font boldness for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Unsupported visualization of gap between lines inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Too tall" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Diminished font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Too small" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Enlarged font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1660 +#, boost-format +msgid "%1% is NOT shown." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1964 +msgid " No symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1965 +msgid " ... Loading" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2015 +msgid " ... In queue" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2132 +#, boost-format +msgid "Font face \"%1%\" can't be selected." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2180 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:754 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:367 +msgid "Apply" +msgstr "应用" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2192 +msgid "add file with font(.ttf, .ttc)" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2202 +msgid "Open dialog for choose from fonts." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2210 +msgid "Text is to object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2224 +msgid "Added" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2227 +msgid "Click to change text into object part." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2230 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4321 +msgid "You can't change a type of the last solid part of the object." +msgstr "不能更改对象的最后一个实体部分的类型。" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2231 +msgid "Subtracted" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2237 +msgid "Click to change part type into negative volume." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2243 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4338 +msgid "Modifier" +msgstr "修改器 Modifier" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2249 +msgid "Click to change part type into modifier." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2256 +msgid "Change Text Type" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2287 +#, boost-format +msgid "Rename style(%1%) for embossing text: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2299 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2384 +msgid "Name can't be empty." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2301 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2386 +msgid "Name has to be unique." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2310 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2397 +msgid "ok" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2312 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2401 +msgid "cancel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2337 +msgid "Rename style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2344 +msgid "Rename current style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2345 +msgid "Can't rename temporary style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2362 +msgid "First Add style to list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2364 +#, boost-format +msgid "Save %1% style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2366 +msgid "No changes to save." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2373 +msgid "New name of style: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2422 +msgid "Save as new style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2434 +msgid "Only valid font can be added to style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2436 +msgid "Add style to my list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2438 +msgid "Add as new named style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2454 +msgid "Remove style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2485 +#, boost-format +msgid "Delete \"%1%\" style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2486 +#, boost-format +msgid "Can't delete \"%1%\". It is last style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2487 +#, boost-format +msgid "Can't delete temporary style \"%1%\"." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2494 +#, boost-format +msgid "" +"Are you sure,\n" +"that you want permanently and unrecoverable \n" +"remove style \"%1%\"?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2496 +msgid "Yes" +msgstr "是" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2505 +msgid "No" +msgstr "否" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2555 +msgid "Presets" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2564 src/slic3r/GUI/GUI_App.cpp:2324 +msgid "modified" +msgstr "修改" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2617 +#, boost-format +msgid "Modified style \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2618 +#, boost-format +msgid "Current style is \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2625 +msgid "Style modification will be lost." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2627 +#, boost-format +msgid "" +"Changing style to '%1%' will discard current style modification.\n" +"\n" +" Would you like to continue anyway?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2643 +msgid "Not valid style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2644 +#, boost-format +msgid "Style '%1%' can't be used and will be removed from list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2691 +msgid "Unset italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2708 +msgid "Set italic" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2738 +msgid "Unset bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2756 +msgid "Set bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2922 +msgid "WxFont is not loaded properly." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2957 +msgid "Revert font changes." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2991 +msgid "wx Make bold" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3002 +msgid "Revert text size." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3029 +msgid "Revert embossed depth." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3178 +msgid "" +"Advanced font options could be changed only for correct font.\n" +"Start with select correct font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3219 +msgid "Revert using of model surface." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3232 +msgid "font points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3241 +msgid "Revert gap between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3242 +msgid "Distance between letters" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3257 +msgid "Revert gap between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3258 +msgid "Distance between lines" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3272 +msgid "Undo boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3273 +msgid "Tiny / Wide glyphs" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3283 +msgid "Undo letter's skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3284 +msgid "Italic strength ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3304 +msgid "Undo translation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3305 +msgid "Distance of the center of text from model surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3350 +msgid "Undo rotation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3352 +msgid "Rotate text Clock-wise." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3386 +msgid "Select from True Type Collection." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3395 +msgid "Set text to face camera" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3402 +msgid "Use camera direction for text orientation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3486 +#, boost-format +msgid "Font '%1%' can't be used. Please select another." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3488 +msgid "Selected font is NOT True-type." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3512 +msgid "Choose one or more files (TTF, TTC):" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3539 +msgid "Choose SVG file:" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3600 +#, boost-format +msgid "" +"Can't load exactly same font(\"%1%\"), Aplication selected a similar " +"one(\"%2%\"). You have to specify font for enable edit text." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:81 +msgid "Enter emboss gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:82 +msgid "Leave emboss gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:83 +msgid "Embossing actions" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:37 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:66 +msgid "Paint-on supports" +msgstr "绘制支撑" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 +msgid "Automatic painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 +msgid "painting..." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:107 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +msgid "Clipping of view" +msgstr "剪切视图" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:106 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 +msgid "Reset direction" +msgstr "重置方向" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:108 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 +msgid "Brush size" +msgstr "刷子大小" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:109 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 +msgid "Brush shape" +msgstr "画笔形状" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1816 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:110 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 +msgid "Left mouse button" +msgstr "鼠标左键" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 +msgid "Enforce supports" +msgstr "强制支持" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 +msgid "Right mouse button" +msgstr "鼠标右键" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:573 +msgid "Block supports" +msgstr "阻止支撑" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 +msgid "Shift + Left mouse button" +msgstr "Shift+鼠标左键" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:568 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:247 +msgid "Remove selection" +msgstr "删除所选内容" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 +msgid "Remove all selection" +msgstr "删除所有选择" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 +#: src/slic3r/GUI/GUI_Factories.cpp:481 +msgid "Sphere" +msgstr "球形" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:106 +#: src/libslic3r/PrintConfig.cpp:1231 +msgid "Triangles" +msgstr "三角形" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 +msgid "Highlight overhang by angle" +msgstr "通过角度高亮悬挑" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:63 +msgid "Enforce" +msgstr "执行" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +msgid "Tool type" +msgstr "工具类型" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 +msgid "Brush" +msgstr "刷子" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:68 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 +msgid "Smart fill" +msgstr "智能填充" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 +msgid "Smart fill angle" +msgstr "智能填充角度" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:72 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 +msgid "Split triangles" +msgstr "分裂三角形" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:73 +msgid "On overhangs only" +msgstr "只在悬挑上" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:187 +#, boost-format +msgid "" +"Preselects faces by overhang angle. It is possible to restrict paintable " +"facets to only preselected faces when the option \"%1%\" is enabled." +msgstr "" +"通过悬垂角度预选面。启用选项 \"%1%\" 时,可以将可绘制的面限制为仅预选的面。" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:230 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:371 +msgid "Paints facets according to the chosen painting brush." +msgstr "根据选择的画笔绘制面。" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:238 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:384 +msgid "" +"Paints neighboring facets whose relative angle is less or equal to set angle." +msgstr "绘制相对角度小于或等于“设置角度”的相邻面。" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242 +#, boost-format +msgid "Allows painting only on facets selected by: \"%1%\"" +msgstr "仅允许在选择的面上绘制:\"%1%\"" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:257 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:412 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141 +msgid "Paints all facets inside, regardless of their orientation." +msgstr "绘制内部的所有面,无论其方向如何。" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:266 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:421 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:149 +msgid "Ignores facets facing away from the camera." +msgstr "忽略背对摄影机的面。" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:430 +msgid "Paints only one facet." +msgstr "只绘制一个面。" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:298 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:438 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:455 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:129 +msgid "Alt + Mouse wheel" +msgstr "Alt+鼠标滚轮" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:288 +msgid "Splits bigger facets into smaller ones while the object is painted." +msgstr "在绘制对象时,将较大的面拆分为较小的面。" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:321 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:476 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:167 +msgid "Ctrl + Mouse wheel" +msgstr "Ctrl+鼠标滚轮" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:326 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:481 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:172 +msgid "Reset selection" +msgstr "重置选择" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:382 +msgid "Block supports by angle" +msgstr "按角度阻止支撑" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:383 +msgid "Add supports by angle" +msgstr "按角度添加支撑" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +msgid "Automatic painting requires valid print setup." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:535 +msgid "Automatic painting will erase all currently painted areas." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:536 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1118 +msgid "Are you sure you want to do it?" +msgstr "你确定要这么做吗?" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:540 +msgid "Automatic painting support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:571 +msgid "Add supports" +msgstr "添加支撑" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:22 +msgid "Entering Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:23 +msgid "Leaving Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:24 +msgid "Paint-on supports editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:88 +msgid "Place on face" +msgstr "放置在平面" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:29 +msgid "Hollow this object" +msgstr "把这个东西挖空" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 +msgid "Preview hollowed and drilled model" +msgstr "预览挖空和钻孔模型" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 +msgid "Offset" +msgstr "偏移" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 +msgid "Quality" +msgstr "质量" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 +#: src/libslic3r/PrintConfig.cpp:4037 +msgid "Closing distance" +msgstr "近距离" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 +msgid "Hole diameter" +msgstr "孔径" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 +msgid "Hole depth" +msgstr "孔深" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 +msgid "Remove selected holes" +msgstr "删除选定的孔" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 +msgid "Remove all holes" +msgstr "清除所有孔" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 +msgid "Show supports" +msgstr "显示支撑" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:242 +msgid "Add drainage hole" +msgstr "增加排水孔" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:361 +msgid "Delete drainage hole" +msgstr "删除排水孔" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:655 +msgid "Hollowing parameter change" +msgstr "空化参数变化" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:739 +msgid "Change drainage hole diameter" +msgstr "改变排水孔直径" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:827 +msgid "Hollow and drill" +msgstr "挖洞钻孔" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:869 +msgid "Move drainage hole" +msgstr "移动排水孔" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:64 +msgid "No feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:65 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:76 +msgid "Vertex" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:66 +msgid "Edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:68 +msgid "Plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:77 +msgid "Point on edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:78 +msgid "Point on circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:79 +msgid "Point on plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:89 +msgid "Center of edge" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:90 +msgid "Center of circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:554 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2029 +msgid "Measure" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1236 +msgid "Edit to scale" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1258 +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:161 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:236 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:776 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:794 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:817 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:831 +#: src/libslic3r/PrintConfig.cpp:4713 +msgid "Scale" +msgstr "比例" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1362 +msgctxt "Verb" +msgid "Scale" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1541 +msgid "##angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1740 +msgid "Measure tool debug" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1824 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1851 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1857 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1886 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1893 +msgid "Unselect feature" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1830 +msgid "Unselect center" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1835 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1862 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1898 +msgid "Select center" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:432 -msgid "Add supports" -msgstr "添加支撑" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1840 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1867 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1903 +msgid "Unselect point" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:41 -msgid "Place on face" -msgstr "放置在平面" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1846 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1873 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1910 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select feature" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 -msgid "Hollow this object" -msgstr "把这个东西挖空" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select point" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 -msgid "Preview hollowed and drilled model" -msgstr "预览挖空和钻孔模型" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Shift" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 -msgid "Offset" -msgstr "偏移" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Enable point selection" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:57 -msgid "Quality" -msgstr "质量" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2007 +msgid "Restart selection" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3905 -msgid "Closing distance" -msgstr "近距离" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1952 +msgid "Esc" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 -msgid "Hole diameter" -msgstr "孔径" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1955 +msgid "Unselect" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 -msgid "Hole depth" -msgstr "孔深" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1999 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2001 +msgid "Selection" +msgstr "选区" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 -msgid "Remove selected holes" -msgstr "删除选定的孔" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2021 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +msgid "Copy to clipboard" +msgstr "复制到剪贴板" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 -msgid "Remove all holes" -msgstr "清除所有孔" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2038 +msgid "Angle" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 -msgid "Show supports" -msgstr "显示支撑" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Perpendicular distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:287 -msgid "Add drainage hole" -msgstr "增加排水孔" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:403 -msgid "Delete drainage hole" -msgstr "删除排水孔" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2062 +msgid "Direct distance" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:590 -msgid "Hollowing parameter change" -msgstr "空化参数变化" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2072 +msgid "Distance XYZ" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:667 -msgid "Change drainage hole diameter" -msgstr "改变排水孔直径" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:163 +msgid "Entering Measure gizmo" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:761 -msgid "Hollow and drill" -msgstr "挖洞钻孔" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:164 +msgid "Leaving Measure gizmo" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:811 -msgid "Move drainage hole" -msgstr "移动排水孔" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:165 +msgid "Measure gizmo editing" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:27 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:28 #, boost-format msgid "" "Your printer has more extruders than the multi-material painting gizmo " @@ -2764,81 +3968,85 @@ msgstr "" "打印机的挤出机数量超过了多材质绘画 gizmo 支持的数量。因此,只有前 %1% 的挤出" "机才能用于绘制。" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:45 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:46 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 msgid "Multimaterial painting" msgstr "多材料绘画" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 msgid "First color" msgstr "第一种颜色" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 msgid "Second color" msgstr "第二种颜色" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:120 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:671 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:642 msgid "Remove painted color" msgstr "去除油漆颜色" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 msgid "Clear all" msgstr "全部清除" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:129 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 msgid "Bucket fill" msgstr "桶填充" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:404 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:397 msgid "Paints neighboring facets that have the same color." msgstr "绘制具有相同颜色的相邻面。" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:450 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:443 msgid "Split bigger facets into smaller ones while the object is painted." msgstr "在绘制对象时,将较大的面拆分为较小的面。" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:674 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:645 #, boost-format msgid "Painted using: Extruder %1%" msgstr "涂漆使用:挤出机 %1%" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:118 +msgid "Entering Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:119 +msgid "Leaving Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:120 +msgid "Multimaterial painting editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:76 msgid "Move" msgstr "移动" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:466 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4532 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:643 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:745 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:775 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:813 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:830 +#: src/libslic3r/PrintConfig.cpp:4698 msgid "Rotate" msgstr "旋转" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:505 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:707 msgid "Optimize orientation" msgstr "优化方向" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:552 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:319 -msgid "Apply" -msgstr "应用" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:79 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4547 -msgid "Scale" -msgstr "比例" +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:194 +msgid "Gizmo-Scale" +msgstr "Gizmo-缩放" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 msgid "Enforce seam" msgstr "强制接缝" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:38 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:255 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:252 msgid "Block seam" msgstr "阻止接缝" @@ -2846,330 +4054,333 @@ msgstr "阻止接缝" msgid "Seam painting" msgstr "接缝绘制" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:23 +msgid "Entering Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:24 +msgid "Leaving Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:25 +msgid "Paint-on seam editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:105 msgid "Mesh name" msgstr "网格名称" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:69 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:107 msgid "Detail level" msgstr "详细程度" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:108 msgid "Decimate ratio" msgstr "抽取比" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:113 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:147 #, boost-format msgid "" "Processing model '%1%' with more than 1M triangles could be slow. It is " -"highly recommend to reduce amount of triangles." +"highly recommended to reduce amount of triangles." msgstr "" -"处理超过 1M 个三角形的模型 “%1%” 可能会很慢。强烈建议减少三角形的数量。" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:116 -#: src/slic3r/GUI/GUI_Factories.cpp:705 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:150 +#: src/slic3r/GUI/GUI_Factories.cpp:789 msgid "Simplify model" msgstr "简化模型" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:143 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:177 msgid "Simplify" msgstr "简化" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:156 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:190 msgid "Simplification is currently only allowed when a single part is selected" msgstr "当前仅当选择单个零件时才允许简化" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 -#: src/slic3r/GUI/PrintHostDialogs.cpp:373 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:191 +#: src/slic3r/GUI/MainFrame.cpp:1246 src/slic3r/GUI/MainFrame.cpp:1716 +#: src/slic3r/GUI/PrintHostDialogs.cpp:425 msgid "Error" msgstr "错误" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:250 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:294 msgid "Extra high" msgstr "超高" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:251 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:295 msgid "High" msgstr "高的" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:252 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:296 msgid "Medium" msgstr "中等的" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:297 msgid "Low" msgstr "低的" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:254 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:298 msgid "Extra low" msgstr "超低" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:304 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#, boost-format +msgid "" +"Multipart object can be simplified only by %1%. If you want specify %2% " +"process it separately." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:352 #, c-format, boost-format msgid "%d triangles" msgstr "%d 三角形" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:307 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:355 msgid "Show wireframe" msgstr "显示线框" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:313 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:361 msgid "Operation already cancelling. Please wait few seconds." msgstr "操作已经取消。请稍等几秒钟。" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:370 msgid "Can't apply when proccess preview." msgstr "进程预览时无法应用。" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:329 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:377 #, boost-format msgid "Process %1% / 100" msgstr "进程 %1%/100" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:479 -#, boost-format -msgid "Simplify %1%" -msgstr "简化 %1%" +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:542 +msgid "Simplify " +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:543 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"simplifying the mesh." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:67 +msgid "Entering SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:68 +msgid "Leaving SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:35 msgid "Head diameter" msgstr "头直径" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:36 msgid "Lock supports under new islands" msgstr "新岛屿下的锁支撑" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:37 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268 msgid "Remove selected points" msgstr "删除所选点" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:38 msgid "Remove all points" msgstr "删除所有点" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1226 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1271 msgid "Apply changes" msgstr "应用更改" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1227 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1272 msgid "Discard changes" msgstr "放弃更改" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 msgid "Minimal points distance" msgstr "最小点距离" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3735 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/libslic3r/PrintConfig.cpp:3867 msgid "Support points density" msgstr "支撑点密度" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1229 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1274 msgid "Auto-generate points" msgstr "自动生成点" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 msgid "Manual editing" msgstr "手动编辑" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:372 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:307 msgid "Add support point" msgstr "添加支撑点" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:522 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:460 msgid "Delete support point" msgstr "删除支撑点" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:702 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:626 msgid "Change point head diameter" msgstr "改变支撑点的头直径" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:770 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:696 msgid "Support parameter change" msgstr "支撑参数更改" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:876 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:806 msgid "SLA Support Points" msgstr "SLA 支撑点" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:814 msgid "Do you want to save your manually edited support points?" msgstr "是否要保存手动编辑的支撑点?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:898 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:815 msgid "Save support points?" msgstr "保存支持点?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:958 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:880 msgid "Move support point" msgstr "移动支撑点" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1051 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:987 msgid "Support points edit" msgstr "支撑点编辑" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1131 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1117 msgid "Autogeneration will erase all manually edited points." msgstr "自动生成将删除所有手动编辑的点。" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1132 -msgid "Are you sure you want to do it?" -msgstr "你确定要这么做吗?" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1138 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1124 msgid "Autogenerate support points" msgstr "自动生成支撑点" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1186 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 msgid "SLA gizmo keyboard shortcuts" msgstr "SLA Gizmo 键盘快捷键" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1197 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1242 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "注意:某些快捷方式仅在(非)编辑模式下工作。" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 -msgid "Left click" -msgstr "左鍵單擊" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 msgid "Add point" msgstr "添加点" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 -msgid "Right click" -msgstr "右键点击" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 msgid "Remove point" msgstr "移除点" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 -msgid "Drag" -msgstr "拖动" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 msgid "Move point" msgstr "移动点" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 msgid "Add point to selection" msgstr "将点添加到选择" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 msgid "Remove point from selection" msgstr "从选择中删除点" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 msgid "Select by rectangle" msgstr "按矩形选择" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 msgid "Deselect by rectangle" msgstr "按矩形取消选择" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1267 msgid "Select all points" msgstr "选择所有点" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Mouse wheel" msgstr "鼠标滚动" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Move clipping plane" msgstr "移动剪切平面" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1225 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1270 msgid "Reset clipping plane" msgstr "重置剪切平面" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1228 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273 msgid "Switch to editing mode" msgstr "切换到编辑模式" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:196 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:204 msgid "" "ERROR: Please close all manipulators available from the left toolbar first" msgstr "错误:请先关闭左侧工具栏上的所有可用操纵器" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:561 -msgid "Gizmo-Scale" -msgstr "Gizmo-缩放" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:673 -msgid "Gizmo-Place on Face" -msgstr "Gizmo-放在面上" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:1270 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:998 msgid "" "You are currently editing SLA support points. Please, apply or discard your " "changes first." msgstr "您当前正在编辑 SLA 支持点。请先应用或放弃您的更改。" -#: src/slic3r/GUI/GUI.cpp:292 +#: src/slic3r/GUI/GUI.cpp:287 msgid "Undefined" msgstr "未定义" -#: src/slic3r/GUI/GUI.cpp:317 +#: src/slic3r/GUI/GUI.cpp:308 #, boost-format msgid "%1% was substituted with %2%" msgstr "%1% 被 %2% 取代" -#: src/slic3r/GUI/GUI.cpp:326 +#: src/slic3r/GUI/GUI.cpp:317 msgid "" "Most likely the configuration was produced by a newer version of PrusaSlicer " "or by some PrusaSlicer fork." msgstr "" "最有可能的配置是由较新版本的 PrusaSlicer 或某些 PrusaSlicer fork 生成的。" -#: src/slic3r/GUI/GUI.cpp:327 +#: src/slic3r/GUI/GUI.cpp:318 msgid "The following values were substituted:" msgstr "替换了以下值:" -#: src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/GUI.cpp:319 msgid "Review the substitutions and adjust them if needed." msgstr "检查替代品,必要时进行调整。" -#: src/slic3r/GUI/GUI.cpp:338 src/slic3r/GUI/Plater.cpp:820 +#: src/slic3r/GUI/GUI.cpp:329 src/slic3r/GUI/Plater.cpp:850 msgid "SLA print settings" msgstr "SLA 打印设置" -#: src/slic3r/GUI/GUI.cpp:342 src/slic3r/GUI/PhysicalPrinterDialog.cpp:157 +#: src/slic3r/GUI/GUI.cpp:333 src/slic3r/GUI/PhysicalPrinterDialog.cpp:158 msgid "Physical Printer" msgstr "物理打印机" -#: src/slic3r/GUI/GUI.cpp:355 +#: src/slic3r/GUI/GUI.cpp:346 msgid "" "Configuration bundle was loaded, however some configuration values were not " "recognized." msgstr "已加载配置包,但无法识别某些配置值。" -#: src/slic3r/GUI/GUI.cpp:365 +#: src/slic3r/GUI/GUI.cpp:356 #, boost-format msgid "" "Configuration file \"%1%\" was loaded, however some configuration values " "were not recognized." msgstr "已加载配置文件 \"%1%\",但无法识别某些配置值。" -#: src/slic3r/GUI/GUI_App.cpp:266 +#: src/slic3r/GUI/GUI_App.cpp:275 msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." msgstr "基于 Alessandro Ranellucci 和 RepRap 社区的 Slic3r。" -#: src/slic3r/GUI/GUI_App.cpp:267 +#: src/slic3r/GUI/GUI_App.cpp:276 msgid "Developed by Prusa Research." msgstr "由 Prusa Research 开发。" -#: src/slic3r/GUI/GUI_App.cpp:269 +#: src/slic3r/GUI/GUI_App.cpp:278 msgid "" "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." @@ -3177,11 +4388,11 @@ msgstr "" "沃伊特·布布布尼克、恩里科·图里、奥列克桑德拉·尤什琴科、塔马斯·梅萨罗斯、卢卡" "斯·马泰纳、沃伊特·克拉尔、大卫·科奇克和其他许多人的贡献。" -#: src/slic3r/GUI/GUI_App.cpp:270 -msgid "Artwork model by Leslie Ing" -msgstr "Leslie Ing 的艺术品模型" +#: src/slic3r/GUI/GUI_App.cpp:279 +msgid "Artwork model by Creative Tools" +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:411 +#: src/slic3r/GUI/GUI_App.cpp:420 #, boost-format msgid "" "Starting with %1% 2.3, configuration directory on Linux has changed " @@ -3211,20 +4422,20 @@ msgstr "" "\n" "您现在想做什么?" -#: src/slic3r/GUI/GUI_App.cpp:419 +#: src/slic3r/GUI/GUI_App.cpp:428 #, c-format, boost-format msgid "%s - BREAKING CHANGE" msgstr "%s - 突破性的改变" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Quit, I will move my data now" msgstr "退出,我现在将移动数据" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Start the application" msgstr "启动应用程序" -#: src/slic3r/GUI/GUI_App.cpp:699 +#: src/slic3r/GUI/GUI_App.cpp:725 #, c-format, boost-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -3238,11 +4449,11 @@ msgstr "" "\n" "应用程序现在将终止。" -#: src/slic3r/GUI/GUI_App.cpp:702 +#: src/slic3r/GUI/GUI_App.cpp:728 msgid "Fatal error" msgstr "致命错误" -#: src/slic3r/GUI/GUI_App.cpp:706 +#: src/slic3r/GUI/GUI_App.cpp:732 msgid "" "PrusaSlicer has encountered a localization error. Please report to " "PrusaSlicer team, what language was active and in which scenario this issue " @@ -3255,16 +4466,16 @@ msgstr "" "\n" "应用程序现在将终止。" -#: src/slic3r/GUI/GUI_App.cpp:709 +#: src/slic3r/GUI/GUI_App.cpp:735 msgid "Critical error" msgstr "严重错误" -#: src/slic3r/GUI/GUI_App.cpp:714 +#: src/slic3r/GUI/GUI_App.cpp:740 #, boost-format msgid "Internal error: %1%" msgstr "内部错误:%1%" -#: src/slic3r/GUI/GUI_App.cpp:909 src/slic3r/GUI/GUI_App.cpp:1007 +#: src/slic3r/GUI/GUI_App.cpp:954 src/slic3r/GUI/GUI_App.cpp:1051 msgid "" "Error parsing PrusaSlicer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error. Your user profiles will " @@ -3273,7 +4484,7 @@ msgstr "" "分析 PrusaSlicer 配置文件时出错,该文件可能已损坏。尝试手动删除该文件以从错误" "中恢复。您的用户配置文件不会受到影响。" -#: src/slic3r/GUI/GUI_App.cpp:915 src/slic3r/GUI/GUI_App.cpp:1013 +#: src/slic3r/GUI/GUI_App.cpp:960 src/slic3r/GUI/GUI_App.cpp:1057 msgid "" "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error." @@ -3281,12 +4492,12 @@ msgstr "" "分析 PrusaGCodeViewer 配置文件时出错,该文件可能已损坏。尝试手动删除该文件以" "从错误中恢复。" -#: src/slic3r/GUI/GUI_App.cpp:962 +#: src/slic3r/GUI/GUI_App.cpp:1006 #, boost-format msgid "You are opening %1% version %2%." msgstr "您正在打开 %1% 版本 %2%。" -#: src/slic3r/GUI/GUI_App.cpp:965 +#: src/slic3r/GUI/GUI_App.cpp:1009 #, boost-format msgid "" "The active configuration was created by %1% %2%,\n" @@ -3304,7 +4515,7 @@ msgstr "" "是否要导入所有较新的配置?\n" "如果是这样,在导入新配置之前,将备份活动配置。" -#: src/slic3r/GUI/GUI_App.cpp:973 +#: src/slic3r/GUI/GUI_App.cpp:1017 #, boost-format msgid "" "An existing configuration was found in %3%\n" @@ -3317,19 +4528,19 @@ msgstr "" "\n" "是否要导入此配置?" -#: src/slic3r/GUI/GUI_App.cpp:981 +#: src/slic3r/GUI/GUI_App.cpp:1025 msgid "Import" msgstr "导入" -#: src/slic3r/GUI/GUI_App.cpp:982 +#: src/slic3r/GUI/GUI_App.cpp:1026 msgid "Don't import" msgstr "不要导入" -#: src/slic3r/GUI/GUI_App.cpp:990 +#: src/slic3r/GUI/GUI_App.cpp:1034 msgid "Continue and import newer configuration?" msgstr "是否继续并导入更新的配置?" -#: src/slic3r/GUI/GUI_App.cpp:1051 +#: src/slic3r/GUI/GUI_App.cpp:1095 msgid "" "You are running a 32 bit build of PrusaSlicer on 64-bit Windows.\n" "32 bit build of PrusaSlicer will likely not be able to utilize all the RAM " @@ -3343,7 +4554,7 @@ msgstr "" "请从下载并安装 64 位版本的 PrusaSlicerhttps://www.prusa3d.cz/prusaslicer/。\n" "你想继续吗?" -#: src/slic3r/GUI/GUI_App.cpp:1134 +#: src/slic3r/GUI/GUI_App.cpp:1182 #, c-format, boost-format msgid "" "%s\n" @@ -3352,46 +4563,37 @@ msgstr "" "%s\n" "要继续吗?" -#: src/slic3r/GUI/GUI_App.cpp:1136 src/slic3r/GUI/GUI_App.cpp:3101 -#: src/slic3r/GUI/Plater.cpp:1726 src/slic3r/GUI/UnsavedChangesDialog.cpp:889 +#: src/slic3r/GUI/GUI_App.cpp:1184 src/slic3r/GUI/GUI_App.cpp:3302 +#: src/slic3r/GUI/Plater.cpp:1736 src/slic3r/GUI/UnsavedChangesDialog.cpp:917 msgid "Remember my choice" msgstr "记住我的选择" -#: src/slic3r/GUI/GUI_App.cpp:1178 +#: src/slic3r/GUI/GUI_App.cpp:1226 msgid "Loading configuration" msgstr "加载配置" -#: src/slic3r/GUI/GUI_App.cpp:1209 -#, boost-format -msgid "New release version %1% is available." -msgstr "新发布版本 %1% 可用。" - -#: src/slic3r/GUI/GUI_App.cpp:1210 -msgid "See Download page." -msgstr "请参阅下载页面。" - -#: src/slic3r/GUI/GUI_App.cpp:1224 +#: src/slic3r/GUI/GUI_App.cpp:1257 #, boost-format msgid "New prerelease version %1% is available." msgstr "新的预发布版本 %1% 可用。" -#: src/slic3r/GUI/GUI_App.cpp:1225 +#: src/slic3r/GUI/GUI_App.cpp:1258 msgid "See Releases page." msgstr "参见发布页面。" -#: src/slic3r/GUI/GUI_App.cpp:1262 +#: src/slic3r/GUI/GUI_App.cpp:1313 msgid "Preparing settings tabs" msgstr "准备设置选项卡" -#: src/slic3r/GUI/GUI_App.cpp:1336 src/slic3r/GUI/Preferences.cpp:287 +#: src/slic3r/GUI/GUI_App.cpp:1393 src/slic3r/GUI/Preferences.cpp:405 msgid "Restore window position on start" msgstr "启动时恢复窗口位置" -#: src/slic3r/GUI/GUI_App.cpp:1338 +#: src/slic3r/GUI/GUI_App.cpp:1395 msgid "PrusaSlicer started after a crash" msgstr "PrusaSlicer 在崩溃后启动" -#: src/slic3r/GUI/GUI_App.cpp:1339 +#: src/slic3r/GUI/GUI_App.cpp:1396 #, boost-format msgid "" "PrusaSlicer crashed last time when attempting to set window position.\n" @@ -3410,22 +4612,22 @@ msgstr "" "\n" "以避免此问题,考虑在“首选项”中禁用“%4%”。否则,下次应用程序很可能再次崩溃。" -#: src/slic3r/GUI/GUI_App.cpp:1351 +#: src/slic3r/GUI/GUI_App.cpp:1408 #, boost-format msgid "Disable \"%1%\"" msgstr "禁用 \"%1%\"" -#: src/slic3r/GUI/GUI_App.cpp:1352 +#: src/slic3r/GUI/GUI_App.cpp:1409 #, boost-format msgid "Leave \"%1%\" enabled" msgstr "保持 \"%1%\" 处于启用状态" -#: src/slic3r/GUI/GUI_App.cpp:1679 +#: src/slic3r/GUI/GUI_App.cpp:1780 msgid "" "You have the following presets with saved options for \"Print Host upload\"" msgstr "“打印主机上载”选项保存了以下预设" -#: src/slic3r/GUI/GUI_App.cpp:1683 +#: src/slic3r/GUI/GUI_App.cpp:1784 msgid "" "But since this version of PrusaSlicer we don't show this information in " "Printer Settings anymore.\n" @@ -3434,7 +4636,7 @@ msgstr "" "但是由于这个版本的 PrusaSlicer,我们不再在打印机设置中显示这些信息。\n" "设置将在物理打印机设置中可用。" -#: src/slic3r/GUI/GUI_App.cpp:1685 +#: src/slic3r/GUI/GUI_App.cpp:1786 msgid "" "By default new Printer devices will be named as \"Printer N\" during its " "creation.\n" @@ -3443,169 +4645,174 @@ msgstr "" "默认情况下,新打印机设备在创建过程中将被命名为“打印机N”。\n" "注意:此名称可以在以后从物理打印机设置中更改" -#: src/slic3r/GUI/GUI_App.cpp:1689 src/slic3r/GUI/PhysicalPrinterDialog.cpp:726 +#: src/slic3r/GUI/GUI_App.cpp:1790 src/slic3r/GUI/PhysicalPrinterDialog.cpp:798 msgid "Information" msgstr "信息" -#: src/slic3r/GUI/GUI_App.cpp:1702 src/slic3r/GUI/GUI_App.cpp:1713 +#: src/slic3r/GUI/GUI_App.cpp:1803 src/slic3r/GUI/GUI_App.cpp:1814 msgid "Recreating" msgstr "重造" -#: src/slic3r/GUI/GUI_App.cpp:1716 +#: src/slic3r/GUI/GUI_App.cpp:1817 msgid "Loading of current presets" msgstr "加载当前预设" -#: src/slic3r/GUI/GUI_App.cpp:1721 +#: src/slic3r/GUI/GUI_App.cpp:1822 msgid "Loading of a mode view" msgstr "加载模式视图" -#: src/slic3r/GUI/GUI_App.cpp:1859 +#: src/slic3r/GUI/GUI_App.cpp:1961 msgid "Choose one file (3MF/AMF):" msgstr "选择一个文件 (3MF/AMF):" -#: src/slic3r/GUI/GUI_App.cpp:1871 +#: src/slic3r/GUI/GUI_App.cpp:1973 msgid "Choose one or more files (STL/3MF/STEP/OBJ/AMF/PRUSA):" msgstr "选择一个或多个文件 (STL/3MF/STEP/OBJ/AMF/PRUSA):" -#: src/slic3r/GUI/GUI_App.cpp:1883 +#: src/slic3r/GUI/GUI_App.cpp:1984 +msgid "Choose ZIP file:" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1996 msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" msgstr "选择一个文件(GCODE/.GCO/.G/.ngc/ngc):" -#: src/slic3r/GUI/GUI_App.cpp:1894 +#: src/slic3r/GUI/GUI_App.cpp:2007 msgid "Changing of an application language" msgstr "更改应用程序语言" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Select the language" msgstr "选择语言" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Language" msgstr "语言" -#: src/slic3r/GUI/GUI_App.cpp:2182 -msgid "modified" -msgstr "修改" +#: src/slic3r/GUI/GUI_App.cpp:2363 +msgid "" +"Simple mode supports manipulation with single-part object(s)\n" +"or object(s) with support modifiers only." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2365 +msgid "Please check your object list before mode changing." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2366 +msgid "Change application mode" +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2236 +#: src/slic3r/GUI/GUI_App.cpp:2397 #, c-format, boost-format msgid "Run %s" msgstr "运行 %s" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "&Configuration Snapshots" msgstr "配置快照(&C)" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "Inspect / activate configuration snapshots" msgstr "检查/激活配置快照" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Take Configuration &Snapshot" msgstr "保存配置快照(&S)" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Capture a configuration snapshot" msgstr "捕获配置快照" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for Configuration Updates" msgstr "检查配置更新" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for configuration updates" msgstr "检查配置更新" -#: src/slic3r/GUI/GUI_App.cpp:2249 +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for Application Updates" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for new version of application" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2411 msgid "&Preferences" msgstr "首选项(&P)" -#: src/slic3r/GUI/GUI_App.cpp:2255 +#: src/slic3r/GUI/GUI_App.cpp:2417 msgid "Application preferences" msgstr "应用程序首选项" -#: src/slic3r/GUI/GUI_App.cpp:2260 src/slic3r/GUI/wxExtensions.cpp:708 -msgid "Simple" -msgstr "简单" - -#: src/slic3r/GUI/GUI_App.cpp:2260 +#: src/slic3r/GUI/GUI_App.cpp:2422 msgid "Simple View Mode" msgstr "简单界面模式" -#: src/slic3r/GUI/GUI_App.cpp:2262 src/slic3r/GUI/wxExtensions.cpp:710 -msgctxt "Mode" -msgid "Advanced" -msgstr "高级" - -#: src/slic3r/GUI/GUI_App.cpp:2262 +#: src/slic3r/GUI/GUI_App.cpp:2424 msgid "Advanced View Mode" msgstr "高级界面模式" -#: src/slic3r/GUI/GUI_App.cpp:2263 src/slic3r/GUI/wxExtensions.cpp:711 -msgid "Expert" -msgstr "专家" - -#: src/slic3r/GUI/GUI_App.cpp:2263 +#: src/slic3r/GUI/GUI_App.cpp:2425 msgid "Expert View Mode" msgstr "专家界面模式" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 msgid "Mode" msgstr "模式" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 #, c-format, boost-format msgid "%s View Mode" msgstr "%s 视图模式" -#: src/slic3r/GUI/GUI_App.cpp:2271 +#: src/slic3r/GUI/GUI_App.cpp:2433 msgid "&Language" msgstr "语言(&L)" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Flash Printer &Firmware" msgstr "烧录打印机固件(&F)" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Upload a firmware image into an Arduino based printer" msgstr "将固件镜像上传到基于 Arduino 的打印机" -#: src/slic3r/GUI/GUI_App.cpp:2294 +#: src/slic3r/GUI/GUI_App.cpp:2459 msgid "Taking a configuration snapshot" msgstr "拍摄配置快照" -#: src/slic3r/GUI/GUI_App.cpp:2295 +#: src/slic3r/GUI/GUI_App.cpp:2460 msgid "" "Some presets are modified and the unsaved changes will not be captured by " "the configuration snapshot." msgstr "一些预设被修改,未保存的更改将不会被配置快照捕获。" -#: src/slic3r/GUI/GUI_App.cpp:2296 +#: src/slic3r/GUI/GUI_App.cpp:2461 msgid "Snapshot name" msgstr "快照名称" -#: src/slic3r/GUI/GUI_App.cpp:2312 +#: src/slic3r/GUI/GUI_App.cpp:2477 msgid "Loading a configuration snapshot" msgstr "加载配置快照" -#: src/slic3r/GUI/GUI_App.cpp:2321 +#: src/slic3r/GUI/GUI_App.cpp:2486 #, boost-format msgid "Continue to activate a configuration snapshot %1%?" msgstr "是否继续激活配置快照 %1%?" -#: src/slic3r/GUI/GUI_App.cpp:2335 +#: src/slic3r/GUI/GUI_App.cpp:2500 msgid "Failed to activate configuration snapshot." msgstr "无法激活配置快照。" -#: src/slic3r/GUI/GUI_App.cpp:2354 -msgid "Restart application" -msgstr "重新启动应用程序" - -#: src/slic3r/GUI/GUI_App.cpp:2388 +#: src/slic3r/GUI/GUI_App.cpp:2520 msgid "Language selection" msgstr "语言选择" -#: src/slic3r/GUI/GUI_App.cpp:2391 +#: src/slic3r/GUI/GUI_App.cpp:2523 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." @@ -3613,142 +4820,172 @@ msgstr "" "切换语言将触发应用程序重新启动。\n" "您将丢失未保存的内容。" -#: src/slic3r/GUI/GUI_App.cpp:2393 src/slic3r/GUI/Preferences.cpp:582 +#: src/slic3r/GUI/GUI_App.cpp:2525 src/slic3r/GUI/Preferences.cpp:730 +#: src/slic3r/GUI/Selection.cpp:1695 msgid "Do you want to proceed?" msgstr "是否继续?" -#: src/slic3r/GUI/GUI_App.cpp:2420 +#: src/slic3r/GUI/GUI_App.cpp:2552 msgid "&Configuration" msgstr "配置(&C)" -#: src/slic3r/GUI/GUI_App.cpp:2534 src/slic3r/GUI/GUI_App.cpp:2595 -msgid "The preset modifications are successfully saved" -msgid_plural "The presets modifications are successfully saved" -msgstr[0] "预设修改已成功保存" +#: src/slic3r/GUI/GUI_App.cpp:2560 +msgid "Restart application" +msgstr "重新启动应用程序" -#: src/slic3r/GUI/GUI_App.cpp:2598 +#: src/slic3r/GUI/GUI_App.cpp:2726 msgid "For new project all modifications will be reseted" msgstr "对于新项目,所有修改都将重置" -#: src/slic3r/GUI/GUI_App.cpp:2636 +#: src/slic3r/GUI/GUI_App.cpp:2764 msgid "Loading a new project while the current project is modified." msgstr "在修改当前项目时加载新项目。" -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Project is loading" msgstr "项目正在加载" -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Opening new project while some presets are unsaved." msgstr "在某些预设未保存时打开新项目。" -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "The uploads are still ongoing" msgstr "上传仍在进行中" -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "Stop them and continue anyway?" msgstr "阻止他们,然后继续?" -#: src/slic3r/GUI/GUI_App.cpp:2662 +#: src/slic3r/GUI/GUI_App.cpp:2790 msgid "Ongoing uploads" msgstr "正在进行的上传" -#: src/slic3r/GUI/GUI_App.cpp:2876 -msgid "It's impossible to print multi-part object(s) with SLA technology." -msgstr "无法使用 SLA 技术打印多部分对象。" +#: src/slic3r/GUI/GUI_App.cpp:3026 +msgid "" +"It's impossible to print object(s) which contains parameter modifiers with " +"SLA technology." +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2877 src/slic3r/GUI/Jobs/SLAImportJob.cpp:235 -#: src/slic3r/GUI/Plater.cpp:2459 +#: src/slic3r/GUI/GUI_App.cpp:3027 src/slic3r/GUI/Jobs/SLAImportJob.cpp:149 +#: src/slic3r/GUI/Plater.cpp:2536 msgid "Please check your object list before preset changing." msgstr "请在预设更改之前检查对象列表。" -#: src/slic3r/GUI/GUI_App.cpp:2901 +#: src/slic3r/GUI/GUI_App.cpp:3070 msgid "Configuration is editing from ConfigWizard" msgstr "正在从 ConfigWizard 编辑配置" -#: src/slic3r/GUI/GUI_App.cpp:2926 +#: src/slic3r/GUI/GUI_App.cpp:3088 +#, boost-format +msgid "Welcome to %1% version %2%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3090 +#, boost-format +msgid "" +"Do you wish to register downloads from Printables.com\n" +"for this %1% %2% executable?\n" +"\n" +"Downloads can be registered for only 1 executable at time." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3118 msgid "Select a gcode file:" msgstr "选择一个 gcode 文件:" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "Open hyperlink in default browser?" msgstr "在默认浏览器中打开超链接?" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "PrusaSlicer: Open hyperlink" msgstr "PrusaSlicer:打开超链接" -#: src/slic3r/GUI/GUI_App.cpp:3105 src/slic3r/GUI/Preferences.cpp:382 +#: src/slic3r/GUI/GUI_App.cpp:3306 src/slic3r/GUI/Preferences.cpp:593 msgid "Suppress to open hyperlink in browser" msgstr "抑制以在浏览器中打开超链接" -#: src/slic3r/GUI/GUI_App.cpp:3107 src/slic3r/GUI/Plater.cpp:1732 +#: src/slic3r/GUI/GUI_App.cpp:3308 src/slic3r/GUI/Plater.cpp:1742 msgid "PrusaSlicer will remember your choice." msgstr "普鲁萨斯勒会记住你的选择。" -#: src/slic3r/GUI/GUI_App.cpp:3108 +#: src/slic3r/GUI/GUI_App.cpp:3309 msgid "You will not be asked about it again on hyperlinks hovering." msgstr "在悬停的超链接上,你不会再被问及此事。" -#: src/slic3r/GUI/GUI_App.cpp:3109 src/slic3r/GUI/Plater.cpp:1736 +#: src/slic3r/GUI/GUI_App.cpp:3310 src/slic3r/GUI/Plater.cpp:1746 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" "to changes your choice." msgstr "访问“首选项”并选中 “%1%”,以更改您的选择。" -#: src/slic3r/GUI/GUI_App.cpp:3111 src/slic3r/GUI/Plater.cpp:1738 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:906 +#: src/slic3r/GUI/GUI_App.cpp:3312 src/slic3r/GUI/Plater.cpp:1748 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:934 msgid "PrusaSlicer: Don't ask me again" msgstr "普鲁萨斯勒:别再问我了" -#: src/slic3r/GUI/GUI_Init.cpp:57 src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_App.cpp:3386 +msgid "Check for application update has failed." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3387 +#, boost-format +msgid "No new version is available. Latest release version is %1%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3458 +msgid "Download of new version is already ongoing. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/GUI_Init.cpp:64 src/slic3r/GUI/GUI_Init.cpp:67 msgid "PrusaSlicer GUI initialization failed" msgstr "PrusaSlicer GUI 初始化失败" -#: src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_Init.cpp:67 #, boost-format msgid "Fatal error, exception catched: %1%" msgstr "致命错误,捕获异常:%1%" #: src/slic3r/GUI/GUI_Factories.cpp:54 src/slic3r/GUI/GUI_Factories.cpp:127 -#: src/libslic3r/PrintConfig.cpp:287 src/libslic3r/PrintConfig.cpp:404 -#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:456 -#: src/libslic3r/PrintConfig.cpp:708 src/libslic3r/PrintConfig.cpp:778 -#: src/libslic3r/PrintConfig.cpp:786 src/libslic3r/PrintConfig.cpp:1232 -#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1563 -#: src/libslic3r/PrintConfig.cpp:1955 src/libslic3r/PrintConfig.cpp:2030 -#: src/libslic3r/PrintConfig.cpp:2264 src/libslic3r/PrintConfig.cpp:2850 -#: src/libslic3r/PrintConfig.cpp:2858 src/libslic3r/PrintConfig.cpp:2918 -#: src/libslic3r/PrintConfig.cpp:2927 src/libslic3r/PrintConfig.cpp:3098 +#: src/libslic3r/PrintConfig.cpp:300 src/libslic3r/PrintConfig.cpp:423 +#: src/libslic3r/PrintConfig.cpp:466 src/libslic3r/PrintConfig.cpp:475 +#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:872 +#: src/libslic3r/PrintConfig.cpp:881 src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1376 src/libslic3r/PrintConfig.cpp:1604 +#: src/libslic3r/PrintConfig.cpp:1985 src/libslic3r/PrintConfig.cpp:2060 +#: src/libslic3r/PrintConfig.cpp:2294 src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:2946 src/libslic3r/PrintConfig.cpp:3006 +#: src/libslic3r/PrintConfig.cpp:3015 src/libslic3r/PrintConfig.cpp:3186 msgid "Layers and Perimeters" msgstr "图层和周长" #: src/slic3r/GUI/GUI_Factories.cpp:56 src/slic3r/GUI/GUI_Factories.cpp:131 -#: src/slic3r/GUI/GUI_Preview.cpp:249 src/slic3r/GUI/Tab.cpp:1547 -#: src/slic3r/GUI/Tab.cpp:1549 src/libslic3r/ExtrusionEntity.cpp:340 -#: src/libslic3r/ExtrusionEntity.cpp:372 src/libslic3r/PrintConfig.cpp:670 -#: src/libslic3r/PrintConfig.cpp:2095 src/libslic3r/PrintConfig.cpp:2104 -#: src/libslic3r/PrintConfig.cpp:2113 src/libslic3r/PrintConfig.cpp:2123 -#: src/libslic3r/PrintConfig.cpp:2132 src/libslic3r/PrintConfig.cpp:2554 -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2568 -#: src/libslic3r/PrintConfig.cpp:2581 src/libslic3r/PrintConfig.cpp:2591 -#: src/libslic3r/PrintConfig.cpp:2599 src/libslic3r/PrintConfig.cpp:2617 -#: src/libslic3r/PrintConfig.cpp:2634 src/libslic3r/PrintConfig.cpp:2655 -#: src/libslic3r/PrintConfig.cpp:2668 src/libslic3r/PrintConfig.cpp:2685 -#: src/libslic3r/PrintConfig.cpp:2703 src/libslic3r/PrintConfig.cpp:2718 -#: src/libslic3r/PrintConfig.cpp:2728 src/libslic3r/PrintConfig.cpp:2737 -#: src/libslic3r/PrintConfig.cpp:2748 src/libslic3r/PrintConfig.cpp:2762 -#: src/libslic3r/PrintConfig.cpp:2778 src/libslic3r/PrintConfig.cpp:2786 -#: src/libslic3r/PrintConfig.cpp:2787 src/libslic3r/PrintConfig.cpp:2796 -#: src/libslic3r/PrintConfig.cpp:2810 src/libslic3r/PrintConfig.cpp:2818 -#: src/libslic3r/PrintConfig.cpp:2832 +#: src/slic3r/GUI/Tab.cpp:1494 src/slic3r/GUI/Tab.cpp:1496 +#: src/libslic3r/PrintConfig.cpp:773 src/libslic3r/PrintConfig.cpp:2125 +#: src/libslic3r/PrintConfig.cpp:2134 src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2153 src/libslic3r/PrintConfig.cpp:2162 +#: src/libslic3r/PrintConfig.cpp:2584 src/libslic3r/PrintConfig.cpp:2590 +#: src/libslic3r/PrintConfig.cpp:2598 src/libslic3r/PrintConfig.cpp:2611 +#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2628 +#: src/libslic3r/PrintConfig.cpp:2644 src/libslic3r/PrintConfig.cpp:2660 +#: src/libslic3r/PrintConfig.cpp:2681 src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2725 +#: src/libslic3r/PrintConfig.cpp:2743 src/libslic3r/PrintConfig.cpp:2753 +#: src/libslic3r/PrintConfig.cpp:2762 src/libslic3r/PrintConfig.cpp:2773 +#: src/libslic3r/PrintConfig.cpp:2785 src/libslic3r/PrintConfig.cpp:2799 +#: src/libslic3r/PrintConfig.cpp:2807 src/libslic3r/PrintConfig.cpp:2808 +#: src/libslic3r/PrintConfig.cpp:2817 src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2840 src/libslic3r/PrintConfig.cpp:2854 +#: src/libslic3r/PrintConfig.cpp:2862 src/libslic3r/PrintConfig.cpp:2873 +#: src/libslic3r/PrintConfig.cpp:2884 src/libslic3r/PrintConfig.cpp:2893 +#: src/libslic3r/PrintConfig.cpp:2903 src/libslic3r/PrintConfig.cpp:2915 msgid "Support material" msgstr "支撑材料" #: src/slic3r/GUI/GUI_Factories.cpp:59 src/slic3r/GUI/GUI_Factories.cpp:135 -#: src/libslic3r/PrintConfig.cpp:3054 src/libslic3r/PrintConfig.cpp:3062 +#: src/libslic3r/PrintConfig.cpp:3142 src/libslic3r/PrintConfig.cpp:3150 msgid "Wipe options" msgstr "擦除选项" @@ -3756,330 +4993,351 @@ msgstr "擦除选项" msgid "Pad and Support" msgstr "垫和支撑" -#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/GUI_Preview.cpp:245 -#: src/slic3r/GUI/Tab.cpp:1513 src/libslic3r/ExtrusionEntity.cpp:336 -#: src/libslic3r/ExtrusionEntity.cpp:364 src/libslic3r/PrintConfig.cpp:1579 -#: src/libslic3r/PrintConfig.cpp:1585 src/libslic3r/PrintConfig.cpp:1599 -#: src/libslic3r/PrintConfig.cpp:1609 src/libslic3r/PrintConfig.cpp:1617 -#: src/libslic3r/PrintConfig.cpp:1619 +#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/Tab.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1620 src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1638 src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1656 src/libslic3r/PrintConfig.cpp:1658 msgid "Ironing" msgstr "熨烫" -#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1283 -#: src/libslic3r/PrintConfig.cpp:1284 src/libslic3r/PrintConfig.cpp:1299 -#: src/libslic3r/PrintConfig.cpp:1309 +#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1344 src/libslic3r/PrintConfig.cpp:1356 +#: src/libslic3r/PrintConfig.cpp:1366 msgid "Fuzzy Skin" msgstr "模糊皮肤" -#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/GUI_Preview.cpp:220 -#: src/slic3r/GUI/Tab.cpp:1581 src/libslic3r/PrintConfig.cpp:507 -#: src/libslic3r/PrintConfig.cpp:766 src/libslic3r/PrintConfig.cpp:1326 -#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1618 -#: src/libslic3r/PrintConfig.cpp:2020 src/libslic3r/PrintConfig.cpp:2352 -#: src/libslic3r/PrintConfig.cpp:2405 src/libslic3r/PrintConfig.cpp:2903 +#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/Tab.cpp:1536 +#: src/libslic3r/PrintConfig.cpp:526 src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:548 src/libslic3r/PrintConfig.cpp:557 +#: src/libslic3r/PrintConfig.cpp:566 src/libslic3r/PrintConfig.cpp:575 +#: src/libslic3r/PrintConfig.cpp:852 src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1657 +#: src/libslic3r/PrintConfig.cpp:2050 src/libslic3r/PrintConfig.cpp:2383 +#: src/libslic3r/PrintConfig.cpp:2436 src/libslic3r/PrintConfig.cpp:2991 msgid "Speed" msgstr "速度" -#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1623 -#: src/slic3r/GUI/Tab.cpp:2304 src/libslic3r/PrintConfig.cpp:796 -#: src/libslic3r/PrintConfig.cpp:1489 src/libslic3r/PrintConfig.cpp:1997 -#: src/libslic3r/PrintConfig.cpp:2373 src/libslic3r/PrintConfig.cpp:2647 -#: src/libslic3r/PrintConfig.cpp:2675 +#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1585 +#: src/slic3r/GUI/Tab.cpp:2288 src/libslic3r/PrintConfig.cpp:889 +#: src/libslic3r/PrintConfig.cpp:1530 src/libslic3r/PrintConfig.cpp:2027 +#: src/libslic3r/PrintConfig.cpp:2404 src/libslic3r/PrintConfig.cpp:2673 +#: src/libslic3r/PrintConfig.cpp:2701 msgid "Extruders" msgstr "挤出机" -#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:754 -#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:1218 -#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:2006 -#: src/libslic3r/PrintConfig.cpp:2393 src/libslic3r/PrintConfig.cpp:2656 -#: src/libslic3r/PrintConfig.cpp:2890 +#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:840 +#: src/libslic3r/PrintConfig.cpp:953 src/libslic3r/PrintConfig.cpp:1278 +#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:2036 +#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2682 +#: src/libslic3r/PrintConfig.cpp:2978 msgid "Extrusion Width" msgstr "挤出宽度" -#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1533 -#: src/libslic3r/PrintConfig.cpp:517 src/libslic3r/PrintConfig.cpp:528 -#: src/libslic3r/PrintConfig.cpp:544 +#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:631 src/libslic3r/PrintConfig.cpp:642 +#: src/libslic3r/PrintConfig.cpp:655 msgid "Skirt and brim" msgstr "环绕和裙边" -#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 -#: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1645 -#: src/slic3r/GUI/Tab.cpp:1649 src/slic3r/GUI/Tab.cpp:2031 -#: src/slic3r/GUI/Tab.cpp:2402 src/slic3r/GUI/Tab.cpp:4729 -#: src/libslic3r/PrintConfig.cpp:260 src/libslic3r/PrintConfig.cpp:495 -#: src/libslic3r/PrintConfig.cpp:1438 src/libslic3r/PrintConfig.cpp:1525 -#: src/libslic3r/PrintConfig.cpp:1572 src/libslic3r/PrintConfig.cpp:2530 -#: src/libslic3r/PrintConfig.cpp:2540 src/libslic3r/PrintConfig.cpp:3078 -#: src/libslic3r/PrintConfig.cpp:3113 src/libslic3r/PrintConfig.cpp:3124 -#: src/libslic3r/PrintConfig.cpp:3139 src/libslic3r/PrintConfig.cpp:3152 -#: src/libslic3r/PrintConfig.cpp:3161 src/libslic3r/PrintConfig.cpp:3173 -#: src/libslic3r/PrintConfig.cpp:3370 -msgid "Advanced" -msgstr "高级" - -#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4663 src/slic3r/GUI/Tab.cpp:4664 -#: src/libslic3r/PrintConfig.cpp:3564 src/libslic3r/PrintConfig.cpp:3571 -#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3589 -#: src/libslic3r/PrintConfig.cpp:3599 src/libslic3r/PrintConfig.cpp:3609 -#: src/libslic3r/PrintConfig.cpp:3646 src/libslic3r/PrintConfig.cpp:3653 -#: src/libslic3r/PrintConfig.cpp:3664 src/libslic3r/PrintConfig.cpp:3674 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3696 -#: src/libslic3r/PrintConfig.cpp:3706 src/libslic3r/PrintConfig.cpp:3715 -#: src/libslic3r/PrintConfig.cpp:3725 src/libslic3r/PrintConfig.cpp:3736 -#: src/libslic3r/PrintConfig.cpp:3744 +#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Tab.cpp:4946 src/slic3r/GUI/Tab.cpp:4948 +#: src/libslic3r/PrintConfig.cpp:3328 src/libslic3r/PrintConfig.cpp:3337 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3356 +#: src/libslic3r/PrintConfig.cpp:3366 src/libslic3r/PrintConfig.cpp:3387 +#: src/libslic3r/PrintConfig.cpp:3410 src/libslic3r/PrintConfig.cpp:3417 +#: src/libslic3r/PrintConfig.cpp:3432 src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3464 +#: src/libslic3r/PrintConfig.cpp:3474 src/libslic3r/PrintConfig.cpp:3488 +#: src/libslic3r/PrintConfig.cpp:3498 src/libslic3r/PrintConfig.cpp:3841 +#: src/libslic3r/PrintConfig.cpp:3861 src/libslic3r/PrintConfig.cpp:3868 +#: src/libslic3r/PrintConfig.cpp:3876 msgid "Supports" msgstr "支持" -#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4704 src/slic3r/GUI/Tab.cpp:4705 -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3752 -#: src/libslic3r/PrintConfig.cpp:3759 src/libslic3r/PrintConfig.cpp:3773 -#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3794 -#: src/libslic3r/PrintConfig.cpp:3816 src/libslic3r/PrintConfig.cpp:3827 -#: src/libslic3r/PrintConfig.cpp:3834 src/libslic3r/PrintConfig.cpp:3841 -#: src/libslic3r/PrintConfig.cpp:3852 src/libslic3r/PrintConfig.cpp:3861 -#: src/libslic3r/PrintConfig.cpp:3870 +#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:590 +#: src/slic3r/GUI/Tab.cpp:4960 src/slic3r/GUI/Tab.cpp:4961 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3884 +#: src/libslic3r/PrintConfig.cpp:3891 src/libslic3r/PrintConfig.cpp:3905 +#: src/libslic3r/PrintConfig.cpp:3916 src/libslic3r/PrintConfig.cpp:3926 +#: src/libslic3r/PrintConfig.cpp:3948 src/libslic3r/PrintConfig.cpp:3959 +#: src/libslic3r/PrintConfig.cpp:3966 src/libslic3r/PrintConfig.cpp:3973 +#: src/libslic3r/PrintConfig.cpp:3984 src/libslic3r/PrintConfig.cpp:3993 +#: src/libslic3r/PrintConfig.cpp:4002 msgid "Pad" msgstr "垫" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4722 -#: src/slic3r/GUI/Tab.cpp:4723 src/libslic3r/SLA/Hollowing.cpp:73 -#: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3880 -#: src/libslic3r/PrintConfig.cpp:3887 src/libslic3r/PrintConfig.cpp:3897 -#: src/libslic3r/PrintConfig.cpp:3906 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4978 +#: src/slic3r/GUI/Tab.cpp:4979 src/libslic3r/SLA/Hollowing.cpp:86 +#: src/libslic3r/SLA/Hollowing.cpp:91 src/libslic3r/SLA/Hollowing.cpp:106 +#: src/libslic3r/SLA/Hollowing.cpp:115 src/libslic3r/PrintConfig.cpp:4012 +#: src/libslic3r/PrintConfig.cpp:4019 src/libslic3r/PrintConfig.cpp:4029 +#: src/libslic3r/PrintConfig.cpp:4038 msgid "Hollowing" msgstr "掏空" -#: src/slic3r/GUI/GUI_Factories.cpp:160 +#: src/slic3r/GUI/GUI_Factories.cpp:159 msgid "Add part" msgstr "添加部件" -#: src/slic3r/GUI/GUI_Factories.cpp:161 +#: src/slic3r/GUI/GUI_Factories.cpp:160 msgid "Add negative volume" msgstr "增加负体积" -#: src/slic3r/GUI/GUI_Factories.cpp:162 +#: src/slic3r/GUI/GUI_Factories.cpp:161 msgid "Add modifier" msgstr "添加修改器" -#: src/slic3r/GUI/GUI_Factories.cpp:163 +#: src/slic3r/GUI/GUI_Factories.cpp:162 msgid "Add support blocker" msgstr "添加支撑屏蔽" -#: src/slic3r/GUI/GUI_Factories.cpp:164 +#: src/slic3r/GUI/GUI_Factories.cpp:163 msgid "Add support enforcer" msgstr "添加支撑生成器" -#: src/slic3r/GUI/GUI_Factories.cpp:300 +#: src/slic3r/GUI/GUI_Factories.cpp:169 +msgid "Add text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:170 +msgid "Add negative text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:171 +msgid "Add text modifier" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:307 msgid "Select showing settings" msgstr "选择显示设置" -#: src/slic3r/GUI/GUI_Factories.cpp:407 src/slic3r/GUI/GUI_Factories.cpp:412 -#: src/slic3r/GUI/GUI_Factories.cpp:556 src/slic3r/GUI/GUI_Factories.cpp:562 +#: src/slic3r/GUI/GUI_Factories.cpp:414 src/slic3r/GUI/GUI_Factories.cpp:419 +#: src/slic3r/GUI/GUI_Factories.cpp:625 src/slic3r/GUI/GUI_Factories.cpp:631 #, c-format, boost-format msgid "Quick Add Settings (%s)" msgstr "快速添加设置 (%s)" -#: src/slic3r/GUI/GUI_Factories.cpp:444 +#: src/slic3r/GUI/GUI_Factories.cpp:460 msgid "Remove the selected object" msgstr "删除所选对象" -#: src/slic3r/GUI/GUI_Factories.cpp:456 +#: src/slic3r/GUI/GUI_Factories.cpp:475 msgid "Load" msgstr "加载" -#: src/slic3r/GUI/GUI_Factories.cpp:461 src/slic3r/GUI/GUI_Factories.cpp:501 -#: src/slic3r/GUI/GUI_Factories.cpp:505 +#: src/slic3r/GUI/GUI_Factories.cpp:481 src/slic3r/GUI/GUI_Factories.cpp:566 +#: src/slic3r/GUI/GUI_Factories.cpp:570 msgid "Box" msgstr "盒子" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Cylinder" msgstr "圆柱体" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Slab" msgstr "板坯" -#: src/slic3r/GUI/GUI_Factories.cpp:471 +#: src/slic3r/GUI/GUI_Factories.cpp:493 msgid "Gallery" msgstr "陈列室" -#: src/slic3r/GUI/GUI_Factories.cpp:488 src/slic3r/GUI/GUI_Factories.cpp:526 +#: src/slic3r/GUI/GUI_Factories.cpp:529 src/slic3r/GUI/GUI_Factories.cpp:549 +#: src/slic3r/GUI/GUI_ObjectList.cpp:660 +msgid "Text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:555 src/slic3r/GUI/GUI_Factories.cpp:558 +#: src/slic3r/GUI/GUI_Factories.cpp:595 msgid "Height range Modifier" msgstr "高度范围修改器" -#: src/slic3r/GUI/GUI_Factories.cpp:535 +#: src/slic3r/GUI/GUI_Factories.cpp:604 msgid "Add settings" msgstr "添加设置" -#: src/slic3r/GUI/GUI_Factories.cpp:626 +#: src/slic3r/GUI/GUI_Factories.cpp:695 msgid "Change type" msgstr "更改类型" -#: src/slic3r/GUI/GUI_Factories.cpp:636 src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:705 src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Object" msgstr "设置为独立的对象" -#: src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Objects" msgstr "设置为独立的对象" -#: src/slic3r/GUI/GUI_Factories.cpp:658 +#: src/slic3r/GUI/GUI_Factories.cpp:727 msgid "Printable" msgstr "可打印的" -#: src/slic3r/GUI/GUI_Factories.cpp:686 +#: src/slic3r/GUI/GUI_Factories.cpp:755 src/slic3r/GUI/GUI_ObjectList.cpp:2070 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2582 +msgid "Invalidate cut info" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:770 msgid "Rename" msgstr "重命名" -#: src/slic3r/GUI/GUI_Factories.cpp:696 +#: src/slic3r/GUI/GUI_Factories.cpp:780 msgid "Fix through the Netfabb" msgstr "通过 Netfabb 修复" -#: src/slic3r/GUI/GUI_Factories.cpp:715 -msgid "Export as STL" -msgstr "导出为 STL" +#: src/slic3r/GUI/GUI_Factories.cpp:799 +msgid "Export as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:726 +#: src/slic3r/GUI/GUI_Factories.cpp:810 msgid "Reload the selected volumes from disk" msgstr "从磁盘重新加载所选卷" -#: src/slic3r/GUI/GUI_Factories.cpp:733 src/slic3r/GUI/Plater.cpp:3568 +#: src/slic3r/GUI/GUI_Factories.cpp:817 src/slic3r/GUI/Plater.cpp:3602 msgid "Replace with STL" msgstr "替换为 STL" -#: src/slic3r/GUI/GUI_Factories.cpp:733 +#: src/slic3r/GUI/GUI_Factories.cpp:817 msgid "Replace the selected volume with new STL" msgstr "用新的 STL 替换选定的卷" -#: src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Set extruder for selected items" msgstr "为选定的项设置挤出机" -#: src/slic3r/GUI/GUI_Factories.cpp:778 src/slic3r/Utils/Repetier.cpp:126 -#: src/slic3r/Utils/Repetier.cpp:209 src/libslic3r/PrintConfig.cpp:635 -#: src/libslic3r/PrintConfig.cpp:2770 +#: src/slic3r/GUI/GUI_Factories.cpp:862 src/slic3r/Utils/Repetier.cpp:145 +#: src/slic3r/Utils/Repetier.cpp:226 src/libslic3r/PrintConfig.cpp:738 +#: src/libslic3r/PrintConfig.cpp:2790 src/libslic3r/PrintConfig.cpp:3851 msgid "Default" msgstr "默认" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale to print volume" msgstr "缩放打印体积" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale the selected object to fit the print volume" msgstr "缩放所选对象以适合可打印体积" -#: src/slic3r/GUI/GUI_Factories.cpp:835 src/slic3r/GUI/Plater.cpp:5655 +#: src/slic3r/GUI/GUI_Factories.cpp:921 src/slic3r/GUI/Plater.cpp:6213 msgid "Convert from imperial units" msgstr "换算成英制单位" -#: src/slic3r/GUI/GUI_Factories.cpp:836 src/slic3r/GUI/Plater.cpp:5656 +#: src/slic3r/GUI/GUI_Factories.cpp:922 src/slic3r/GUI/Plater.cpp:6214 msgid "Revert conversion from imperial units" msgstr "恢复英制单位的换算" -#: src/slic3r/GUI/GUI_Factories.cpp:837 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:923 src/slic3r/GUI/Plater.cpp:6215 msgid "Convert from meters" msgstr "从米换算" -#: src/slic3r/GUI/GUI_Factories.cpp:838 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:924 src/slic3r/GUI/Plater.cpp:6215 msgid "Revert conversion from meters" msgstr "从仪表恢复转换" -#: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2135 -#: src/libslic3r/PrintConfig.cpp:4523 +#: src/slic3r/GUI/GUI_Factories.cpp:945 src/slic3r/GUI/GUI_ObjectList.cpp:2290 +#: src/libslic3r/PrintConfig.cpp:4689 msgid "Merge" msgstr "合并" -#: src/slic3r/GUI/GUI_Factories.cpp:859 +#: src/slic3r/GUI/GUI_Factories.cpp:945 msgid "Merge objects to the one multipart object" msgstr "将对象合并到一个多部分对象" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Along X axis" msgstr "沿 X 轴" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Mirror the selected object along the X axis" msgstr "沿 X 轴镜像所选对象" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Along Y axis" msgstr "沿 Y 轴" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Mirror the selected object along the Y axis" msgstr "沿 Y 轴镜像所选对象" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Along Z axis" msgstr "沿 Z 轴" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Mirror the selected object along the Z axis" msgstr "沿 Z 轴镜像所选对象" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror" msgstr "镜像" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror the selected object" msgstr "镜像所选对象" -#: src/slic3r/GUI/GUI_Factories.cpp:901 src/slic3r/GUI/GUI_ObjectList.cpp:1696 +#: src/slic3r/GUI/GUI_Factories.cpp:977 +msgid "Edit text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:999 +msgid "Ability to change text, font, size, ..." +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1021 src/slic3r/GUI/GUI_ObjectList.cpp:1793 msgid "Add Shape" msgstr "添加形状" -#: src/slic3r/GUI/GUI_Factories.cpp:937 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "To objects" msgstr "拆分到对象" -#: src/slic3r/GUI/GUI_Factories.cpp:937 src/slic3r/GUI/GUI_Factories.cpp:954 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "Split the selected object into individual objects" msgstr "将所选对象拆分为单个对象" -#: src/slic3r/GUI/GUI_Factories.cpp:940 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 msgid "To parts" msgstr "到零件" -#: src/slic3r/GUI/GUI_Factories.cpp:940 src/slic3r/GUI/GUI_Factories.cpp:975 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 src/slic3r/GUI/GUI_Factories.cpp:1097 msgid "Split the selected object into individual parts" msgstr "将选定对象拆分为各个部分" -#: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4552 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 src/slic3r/GUI/GUI_Factories.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:4718 msgid "Split" msgstr "分裂" -#: src/slic3r/GUI/GUI_Factories.cpp:944 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 msgid "Split the selected object" msgstr "拆分所选对象" -#: src/slic3r/GUI/GUI_Factories.cpp:1084 +#: src/slic3r/GUI/GUI_Factories.cpp:1225 src/slic3r/GUI/GUI_Factories.cpp:1243 +msgid "Set number of instances" +msgstr "设置实例数" + +#: src/slic3r/GUI/GUI_Factories.cpp:1225 +msgid "Change the number of instances of the selected objects" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1237 msgid "Add one more instance of the selected object" msgstr "再添加一个选定对象的实例" -#: src/slic3r/GUI/GUI_Factories.cpp:1087 +#: src/slic3r/GUI/GUI_Factories.cpp:1240 msgid "Remove one instance of the selected object" msgstr "删除所选对象的一个实例" -#: src/slic3r/GUI/GUI_Factories.cpp:1090 -msgid "Set number of instances" -msgstr "设置实例数" - -#: src/slic3r/GUI/GUI_Factories.cpp:1090 +#: src/slic3r/GUI/GUI_Factories.cpp:1243 msgid "Change the number of instances of the selected object" msgstr "更改所选对象的实例数" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill bed with instances" msgstr "在床上摆满例子" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill the remaining area of bed with instances of the selected object" msgstr "用选定对象的实例填充床的剩余区域" @@ -4099,290 +5357,338 @@ msgstr "移除图层范围" msgid "Add layer range" msgstr "添加图层范围" -#: src/slic3r/GUI/GUI_ObjectList.cpp:297 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:323 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 msgid "Name" msgstr "名称" -#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:480 +#: src/slic3r/GUI/GUI_ObjectList.cpp:342 src/slic3r/GUI/GUI_ObjectList.cpp:513 msgid "Editing" msgstr "编辑" -#: src/slic3r/GUI/GUI_ObjectList.cpp:400 +#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +msgid "Wrong volume index " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:433 msgid "No errors detected" msgstr "未检测到错误" -#: src/slic3r/GUI/GUI_ObjectList.cpp:409 +#: src/slic3r/GUI/GUI_ObjectList.cpp:442 #, c-format, boost-format msgid "Auto-repaired %1$d error" msgid_plural "Auto-repaired %1$d errors" msgstr[0] "已自动修复 %1$d 错误" -#: src/slic3r/GUI/GUI_ObjectList.cpp:415 +#: src/slic3r/GUI/GUI_ObjectList.cpp:448 #, c-format, boost-format msgid "%1$d degenerate facet" msgid_plural "%1$d degenerate facets" msgstr[0] "%1$d 退化面" -#: src/slic3r/GUI/GUI_ObjectList.cpp:417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:450 #, c-format, boost-format msgid "%1$d edge fixed" msgid_plural "%1$d edges fixed" msgstr[0] "%1$d 边缘被修复" -#: src/slic3r/GUI/GUI_ObjectList.cpp:419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:452 #, c-format, boost-format msgid "%1$d facet removed" msgid_plural "%1$d facets removed" msgstr[0] "%1$d 面移除" -#: src/slic3r/GUI/GUI_ObjectList.cpp:421 +#: src/slic3r/GUI/GUI_ObjectList.cpp:454 #, c-format, boost-format msgid "%1$d facet reversed" msgid_plural "%1$d facets reversed" msgstr[0] "%1$d 面反转" -#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +#: src/slic3r/GUI/GUI_ObjectList.cpp:456 #, c-format, boost-format msgid "%1$d backward edge" msgid_plural "%1$d backward edges" msgstr[0] "%1$d 后边缘" -#: src/slic3r/GUI/GUI_ObjectList.cpp:426 src/slic3r/GUI/GUI_ObjectList.cpp:429 +#: src/slic3r/GUI/GUI_ObjectList.cpp:459 src/slic3r/GUI/GUI_ObjectList.cpp:462 #, c-format, boost-format msgid "%1$d open edge" msgid_plural "%1$d open edges" msgstr[0] "%1$d 开放边缘" -#: src/slic3r/GUI/GUI_ObjectList.cpp:428 +#: src/slic3r/GUI/GUI_ObjectList.cpp:461 msgid "Remaining errors" msgstr "剩余错误" -#: src/slic3r/GUI/GUI_ObjectList.cpp:436 +#: src/slic3r/GUI/GUI_ObjectList.cpp:469 msgid "Right button click the icon to fix STL through Netfabb" msgstr "右按钮单击图标, 通过 Netfabb 修复 STL" -#: src/slic3r/GUI/GUI_ObjectList.cpp:482 +#: src/slic3r/GUI/GUI_ObjectList.cpp:515 msgid "Right button click the icon to change the object settings" msgstr "右键单击图标以更改对象设置" -#: src/slic3r/GUI/GUI_ObjectList.cpp:484 +#: src/slic3r/GUI/GUI_ObjectList.cpp:517 msgid "Click the icon to change the object settings" msgstr "单击图标可更改对象设置" -#: src/slic3r/GUI/GUI_ObjectList.cpp:488 +#: src/slic3r/GUI/GUI_ObjectList.cpp:521 msgid "Right button click the icon to change the object printable property" msgstr "右键单击图标以更改对象可打印属性" -#: src/slic3r/GUI/GUI_ObjectList.cpp:490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:523 msgid "Click the icon to change the object printable property" msgstr "单击图标可更改对象可打印属性" -#: src/slic3r/GUI/GUI_ObjectList.cpp:616 +#: src/slic3r/GUI/GUI_ObjectList.cpp:649 msgid "Change Extruder" msgstr "更换挤出机" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Object" msgstr "重命名对象" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Sub-object" msgstr "重命名子对象" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1242 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4006 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1307 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4589 msgid "Instances to Separated Objects" msgstr "分隔对象的实例" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Volumes in Object reordered" msgstr "重新排序的对象中的空间" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Object reordered" msgstr "对象重新排序" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1298 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1363 msgid "Add Settings for Layers" msgstr "添加图层设置" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1299 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1364 msgid "Add Settings for Sub-object" msgstr "添加子对象的设置" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1300 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1365 msgid "Add Settings for Object" msgstr "添加对象的设置" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1339 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1404 msgid "Add Settings Bundle for Height range" msgstr "为高度范围添加配置组" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1340 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1405 msgid "Add Settings Bundle for Sub-object" msgstr "为子对象添加配置组" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1341 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1406 msgid "Add Settings Bundle for Object" msgstr "为对象添加配置组" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Part" msgstr "加载部件" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Modifier" msgstr "加载修改器" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1509 src/slic3r/GUI/Plater.cpp:2380 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1582 src/slic3r/GUI/Plater.cpp:2453 msgid "Loading" msgstr "载入中" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1540 src/slic3r/GUI/Plater.cpp:2417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1617 src/slic3r/GUI/Plater.cpp:2494 msgid "Loading file" msgstr "加载文件" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1548 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1625 msgid "Error!" msgstr "错误!" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1638 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1721 msgid "Add Generic Subobject" msgstr "添加通用子对象" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1663 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1761 msgid "Generic" msgstr "通用" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shape from Gallery" msgstr "从图库添加形状" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shapes from Gallery" msgstr "从图库中添加形状" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1830 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1945 msgid "Remove paint-on supports" msgstr "清除绘制的支撑" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1837 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 msgid "Remove paint-on seam" msgstr "除去绘制的接缝" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1844 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 msgid "Remove Multi Material painting" msgstr "移除多材质绘画" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1850 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1972 msgid "Shift objects to bed" msgstr "把物品转移到床上" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1856 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1978 msgid "Remove variable layer height" msgstr "删除可变层高度" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1877 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1999 msgid "Delete Settings" msgstr "删除设置" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1901 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2023 msgid "Delete All Instances from Object" msgstr "从对象中删除所有实例" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1917 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2039 msgid "Delete Height Range" msgstr "删除高度范围" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1949 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2057 +msgid "Delete connector from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2058 +msgid "Delete solid part from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2059 +msgid "Delete negative volume from object which is a part of cut" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2061 +msgid "" +"To save cut information you can delete all connectors from all related " +"objects." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2064 +msgid "" +"This action will break a cut information.\n" +"After that PrusaSlicer can't guarantee model consistency.\n" +"\n" +"To manipulate with solid parts or negative volumes you have to invalidate " +"cut infornation first." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2072 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2612 +msgid "Delete all connectors" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2103 msgid "From Object List You can't delete the last solid part from object." msgstr "从对象列表中无法从对象中删除最后一个实体零件。" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1953 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2112 msgid "Delete Subobject" msgstr "删除子对象" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1976 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2138 msgid "Last instance of an object cannot be deleted." msgstr "无法删除对象的最后一个实例。" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1980 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +msgid "Instance cannot be deleted from cut object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2146 msgid "Delete Instance" msgstr "删除实例" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2004 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2170 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "无法拆分所选对象,因为它仅包含一个部件。" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2008 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2174 msgid "Split to Parts" msgstr "拆分为零件" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2177 src/slic3r/GUI/Plater.cpp:3133 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"splitting the object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2297 msgid "Merged" msgstr "合并" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2237 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2392 msgid "Merge all parts to the one single object" msgstr "将所有部分合并到一个对象" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2269 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2424 msgid "Add Layers" msgstr "添加图层" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2438 -msgid "Group manipulation" -msgstr "操作组" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2695 +msgid "Cut Connectors information" +msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2453 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2705 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2768 msgid "Object manipulation" msgstr "操作对象" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2486 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2714 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1472 +msgid "Group manipulation" +msgstr "操作组" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2802 msgid "Object Settings to modify" msgstr "要修改的对象设置" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2806 msgid "Part Settings to modify" msgstr "要修改的零件设置" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2495 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2811 msgid "Layer range Settings to modify" msgstr "要修改的图层范围设置" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2501 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2817 msgid "Part manipulation" msgstr "零件操作" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2825 msgid "Instance manipulation" msgstr "实例操作" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Height ranges" msgstr "高度范围" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Settings for height range" msgstr "高度范围设置" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2750 -msgid "Delete Selected Item" -msgstr "删除所选项目" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2943 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3363 msgid "Delete Selected" msgstr "删除所选" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3019 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3047 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3067 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3441 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3469 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3489 msgid "Add Height Range" msgstr "添加高度范围" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3113 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3535 msgid "" "Cannot insert a new layer range after the current layer range.\n" "The next layer range is too thin to be split to two\n" @@ -4391,7 +5697,7 @@ msgstr "" "无法在当前图层范围之后插入新的图层范围。\n" "下一层范围太窄,无法在不违反最小层高度的情况下拆分为两层。" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3117 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3539 msgid "" "Cannot insert a new layer range between the current and the next layer " "range.\n" @@ -4402,7 +5708,7 @@ msgstr "" "当前层范围和下一层范围之间的间隙\n" "小于允许的最小层高度。" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3122 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3544 msgid "" "Cannot insert a new layer range after the current layer range.\n" "Current layer range overlaps with the next layer range." @@ -4410,232 +5716,281 @@ msgstr "" "无法在当前图层范围之后插入新的图层范围。\n" "当前图层范围与下一图层范围重叠。" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3603 msgid "Edit Height Range" msgstr "编辑高度范围" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3500 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3989 msgid "Selection-Remove from list" msgstr "从列表中选择-删除" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4001 msgid "Selection-Add from list" msgstr "从列表中选择-添加" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3649 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4138 msgid "Object or Instance" msgstr "对象或实例" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Part" -msgstr "部件" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 msgid "Layer" msgstr "层" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3652 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4141 msgid "Unsupported selection" msgstr "不支持的选择" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3653 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 #, c-format, boost-format msgid "You started your selection with %s Item." msgstr "你从 %s 项开始选择。" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3654 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4143 #, c-format, boost-format msgid "In this mode you can select only other %s Items%s" msgstr "在此模式下,您只能选择其他 %s 项%s" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3657 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4146 msgid "of a current Object" msgstr "当前对象的" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3662 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3737 src/slic3r/GUI/Plater.cpp:181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4151 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4226 src/slic3r/GUI/Plater.cpp:197 msgid "Info" msgstr "信息" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3784 -msgid "You can't change a type of the last solid part of the object." -msgstr "不能更改对象的最后一个实体部分的类型。" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 msgid "Negative Volume" msgstr "负体积" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Modifier" -msgstr "修改器 Modifier" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Blocker" msgstr "支撑去除器" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Enforcer" msgstr "支撑添加器" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Select type of part" msgstr "选择零件类型" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3795 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4359 msgid "Change Part Type" msgstr "更改零件类型" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Enter new name" msgstr "输入新名称" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Renaming" msgstr "重命名" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4091 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4681 msgid "Repairing model" msgstr "修复模型" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4120 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4691 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"repairing the mesh." +msgstr "修复网格后,移除了定制支架、接缝和多材料喷漆。" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4711 msgid "Fix through NetFabb" msgstr "通过 NetFabb 修复" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4123 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4714 msgid "Fixing through NetFabb" msgstr "通过 NetFabb 进行修复" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4153 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4744 msgid "The following model was repaired successfully" msgid_plural "The following models were repaired successfully" msgstr[0] "以下模型已成功修复" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4159 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4750 msgid "Folowing model repair failed" msgid_plural "Folowing models repair failed" msgstr[0] "以下模型修复失败" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4164 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4755 msgid "Repairing was canceled" msgstr "修理被取消了" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4276 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4869 msgid "Change Extruders" msgstr "更换挤出机" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Printable group" msgstr "设置可打印组" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Unprintable group" msgstr "设置不可打印组" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Printable" msgstr "设置可打印" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Unprintable" msgstr "设置不可打印" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Printable Instance" msgstr "设置可打印实例" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Unprintable Instance" msgstr "设置不可打印的实例" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:55 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:84 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:61 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:96 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1132 msgid "World coordinates" msgstr "世界坐标" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:56 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:85 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:97 msgid "Local coordinates" msgstr "本地坐标" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:60 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:67 msgid "Select coordinate space, in which the transformation will be performed." msgstr "选择坐标空间,将在其中执行转换。" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:141 src/libslic3r/GCode.cpp:540 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:157 src/libslic3r/GCode.cpp:491 msgid "Object name" msgstr "对象名称" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:201 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:521 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:221 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:710 msgid "Position" msgstr "位置" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:202 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:522 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:222 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:711 #: src/slic3r/GUI/Mouse3DController.cpp:478 #: src/slic3r/GUI/Mouse3DController.cpp:499 msgid "Rotation" msgstr "旋转" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:250 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:239 +msgid "Size [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "Mirror along" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +#, c-format, boost-format +msgid " %c " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "axis" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:279 #, c-format, boost-format msgid "Toggle %c axis mirroring" msgstr "切换 %c 轴镜像" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:284 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:329 msgid "Set Mirror" msgstr "设置镜像" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:324 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:336 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:348 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:374 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:387 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:393 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:401 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:428 msgid "Drop to bed" msgstr "放到床上" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:445 msgid "Reset rotation" msgstr "重置旋转" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 msgid "Reset Rotation" msgstr "重置旋转" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:398 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:400 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:490 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:519 msgid "Reset scale" msgstr "重置比例" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:539 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546 +msgid "Reset skew" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:553 msgid "Inches" msgstr "英寸" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:523 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:712 msgid "Scale factors" msgstr "缩放比例因子" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:577 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:740 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:752 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:793 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:801 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +msgid "Rotate (relative)" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:751 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:800 +msgid "Translate (relative) [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:829 msgid "Translate" msgstr "翻译" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:640 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:905 msgid "" "You cannot use non-uniform scaling mode for multiple objects/parts selection" msgstr "不能对多个对象/零件选择使用非均匀缩放模式" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:820 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +msgid "Left handed" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1133 +msgid "Object coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1134 +msgid "Part coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1176 msgid "Set Position" msgstr "设置位置" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:852 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1220 msgid "Set Orientation" msgstr "设置方向" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:931 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1351 msgid "Set Scale" msgstr "设置缩放" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1368 +msgid "Set Size" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1427 msgid "" "The currently manipulated object is tilted (rotation angles are not " "multiples of 90°).\n" @@ -4647,7 +6002,7 @@ msgstr "" "倾斜对象的非均匀缩放只能将旋转嵌入到对象的坐标中后,\n" "在世界坐标系中进行。" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:983 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1430 msgid "" "This operation is irreversible.\n" "Do you want to proceed?" @@ -4673,168 +6028,67 @@ msgstr "删除选项 %s" msgid "Change Option %s" msgstr "更改选项 %s" -#: src/slic3r/GUI/GUI_Preview.cpp:211 -msgid "View" -msgstr "查看" - -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/libslic3r/PrintConfig.cpp:808 -msgid "Height" -msgstr "高度" - -#: src/slic3r/GUI/GUI_Preview.cpp:219 src/libslic3r/PrintConfig.cpp:3032 -msgid "Width" -msgstr "宽度" - -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2016 -msgid "Fan speed" -msgstr "风扇速度" - -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1991 -msgid "Temperature" -msgstr "温度" - -#: src/slic3r/GUI/GUI_Preview.cpp:223 -msgid "Volumetric flow rate" -msgstr "体积流量" - -#: src/slic3r/GUI/GUI_Preview.cpp:228 -msgid "Show" -msgstr "显示" - -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/GUI_Preview.cpp:254 -msgid "Feature types" -msgstr "功能类型" - -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:330 -#: src/libslic3r/ExtrusionEntity.cpp:352 -msgid "Perimeter" -msgstr "周长" - -#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:331 -#: src/libslic3r/ExtrusionEntity.cpp:354 -msgid "External perimeter" -msgstr "外部轮廓" - -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:332 -#: src/libslic3r/ExtrusionEntity.cpp:356 -msgid "Overhang perimeter" -msgstr "悬空轮廓" - -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:333 -#: src/libslic3r/ExtrusionEntity.cpp:358 -msgid "Internal infill" -msgstr "内部填充" - -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:334 -#: src/libslic3r/ExtrusionEntity.cpp:360 src/libslic3r/PrintConfig.cpp:1407 -#: src/libslic3r/PrintConfig.cpp:2392 src/libslic3r/PrintConfig.cpp:2404 -msgid "Solid infill" -msgstr "实心填充" - -#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:335 -#: src/libslic3r/ExtrusionEntity.cpp:362 src/libslic3r/PrintConfig.cpp:1416 -#: src/libslic3r/PrintConfig.cpp:2889 src/libslic3r/PrintConfig.cpp:2902 -msgid "Top solid infill" -msgstr "顶部实心填充" - -#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:337 -#: src/libslic3r/ExtrusionEntity.cpp:366 -msgid "Bridge infill" -msgstr "搭桥填充" - -#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:338 -#: src/libslic3r/ExtrusionEntity.cpp:368 src/libslic3r/PrintConfig.cpp:1325 -msgid "Gap fill" -msgstr "间隙填充" - -#: src/slic3r/GUI/GUI_Preview.cpp:248 src/libslic3r/ExtrusionEntity.cpp:339 -#: src/libslic3r/ExtrusionEntity.cpp:370 -msgid "Skirt/Brim" -msgstr "环绕/裙边" - -#: src/slic3r/GUI/GUI_Preview.cpp:250 src/libslic3r/ExtrusionEntity.cpp:341 -#: src/libslic3r/ExtrusionEntity.cpp:374 src/libslic3r/PrintConfig.cpp:2736 -msgid "Support material interface" -msgstr "支撑材料端口" - -#: src/slic3r/GUI/GUI_Preview.cpp:251 src/slic3r/GUI/Tab.cpp:1634 -#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/ExtrusionEntity.cpp:376 -msgid "Wipe tower" -msgstr "擦料塔" - -#: src/slic3r/GUI/GUI_Preview.cpp:728 +#: src/slic3r/GUI/GUI_Preview.cpp:581 msgid "NOTE:" msgstr "注:" -#: src/slic3r/GUI/GUI_Preview.cpp:729 +#: src/slic3r/GUI/GUI_Preview.cpp:582 #, boost-format msgid "Sliced object \"%1%\" looks like a logo or a sign" msgstr "切片对象 \"%1%\" 看起来像一个徽标或标志" -#: src/slic3r/GUI/GUI_Preview.cpp:730 +#: src/slic3r/GUI/GUI_Preview.cpp:583 msgid "Apply color change automatically" msgstr "自动应用颜色更改" -#: src/slic3r/GUI/GUI_Preview.cpp:1058 -msgid "Shells" -msgstr "壳" - -#: src/slic3r/GUI/GUI_Preview.cpp:1059 -msgid "Tool marker" -msgstr "工具标记" - -#: src/slic3r/GUI/GUI_Preview.cpp:1060 -msgid "Legend/Estimated printing time" -msgstr "图例/预计打印时间" - -#: src/slic3r/GUI/HintNotification.cpp:771 -#: src/slic3r/GUI/HintNotification.cpp:797 -#: src/slic3r/GUI/NotificationManager.cpp:374 -#: src/slic3r/GUI/NotificationManager.cpp:391 +#: src/slic3r/GUI/HintNotification.cpp:773 +#: src/slic3r/GUI/HintNotification.cpp:799 +#: src/slic3r/GUI/NotificationManager.cpp:457 +#: src/slic3r/GUI/NotificationManager.cpp:474 msgid "More" msgstr "更多" -#: src/slic3r/GUI/HintNotification.cpp:912 +#: src/slic3r/GUI/HintNotification.cpp:914 msgid "Open Preferences." msgstr "打开首选项。" -#: src/slic3r/GUI/HintNotification.cpp:1004 +#: src/slic3r/GUI/HintNotification.cpp:1006 msgid "Open Documentation in web browser." msgstr "在 Web 浏览器中打开文档。" -#: src/slic3r/GUI/ImGuiWrapper.cpp:527 +#: src/slic3r/GUI/ImGuiWrapper.cpp:666 msgid "Edit" msgstr "编辑" -#: src/slic3r/GUI/ImGuiWrapper.cpp:960 src/slic3r/GUI/Search.cpp:470 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1166 src/slic3r/GUI/Search.cpp:531 msgid "Use for search" msgstr "用于搜索" -#: src/slic3r/GUI/ImGuiWrapper.cpp:961 src/slic3r/GUI/Search.cpp:463 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1167 src/slic3r/GUI/Search.cpp:524 msgid "Category" msgstr "类别" -#: src/slic3r/GUI/ImGuiWrapper.cpp:963 src/slic3r/GUI/Search.cpp:465 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1169 src/slic3r/GUI/Search.cpp:526 msgid "Search in English" msgstr "用英语搜索" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:174 -msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "无法排列模型对象!某些几何图形可能无效。" - -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:183 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:168 msgid "Arranging" msgstr "自动布局" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:207 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:204 msgid "Arranging canceled." msgstr "排列布局已取消。" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:208 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:205 msgid "Arranging done." msgstr "布局完成。" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:253 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:225 +msgid "Could not arrange model objects! Some geometries may be invalid." +msgstr "无法排列模型对象!某些几何图形可能无效。" + +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:265 #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -4844,39 +6098,82 @@ msgstr "" "排列忽略了下列不能放在一张床上的对象:\n" "%s" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:119 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:108 msgid "Filling bed" msgstr "填充床" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:130 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:140 msgid "Bed filling canceled." msgstr "床位填充取消。" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:131 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:141 msgid "Bed filling done." msgstr "床铺填充完毕。" -#: src/slic3r/GUI/Jobs/Job.cpp:111 -msgid "ERROR: not enough resources to execute a new job." -msgstr "错误: 没有足够的资源来执行新作业。" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:148 src/slic3r/GUI/Jobs/EmbossJob.cpp:596 +msgid "Can't create empty volume." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:201 +msgid "Can't create empty object." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:208 +msgid "Add Emboss text object" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:247 +msgid "Created text volume is empty. Change text or font." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:465 +msgid "" +"It is used default volume for embossed text, try to change text or font to " +"fix it." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:549 +#, boost-format +msgid "Text: %1%" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:593 +msgid "Bad object to create volume." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:598 +msgid "Add Emboss text Volume" +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:698 +msgid "Font doesn't have any shape for given text." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:738 +msgid "There is no volume in projection direction." +msgstr "" + +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:787 +msgid "There is no valid surface for text projection." +msgstr "" -#: src/slic3r/GUI/Jobs/PlaterJob.cpp:13 -msgid "An unexpected error occured" -msgstr "发生了意外错误" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:823 +msgid "Issue during embossing the text." +msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:21 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:22 msgid "Best surface quality" msgstr "最佳表面质量" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:23 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 msgid "Optimize object rotation for best surface quality." msgstr "优化对象旋转以获得最佳表面质量。" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:25 msgid "Reduced overhang slopes" msgstr "减少悬垂斜坡" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:26 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:27 msgid "" "Optimize object rotation to have minimum amount of overhangs needing support " "structures.\n" @@ -4886,242 +6183,222 @@ msgstr "" "优化对象旋转,使需要支撑结构的悬挑数量最少。\n" "请注意,如果未设置标高,此方法将尝试找到接触打印床的对象的最佳表面。" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:30 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:31 msgid "Lowest Z height" msgstr "最低Z高度" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:32 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:33 msgid "Rotate the model to have the lowest z height for faster print time." msgstr "旋转模型,使其具有最低的z高度,以加快打印时间。" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:59 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:53 msgid "Searching for optimal orientation" msgstr "搜索最佳方向" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:77 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:83 msgid "Orientation search canceled." msgstr "方向搜索已取消。" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:78 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:84 msgid "Orientation found." msgstr "找到方向。" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:36 -msgid "Choose SLA archive:" -msgstr "选择 SLA 存档:" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:40 -msgid "Import file" -msgstr "导入文件" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47 -msgid "Import model and profile" -msgstr "导入模型和配置文件" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48 -msgid "Import profile only" -msgstr "仅导入配置文件" - #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:49 -msgid "Import model only" -msgstr "仅导入模型" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60 -msgid "Accurate" -msgstr "精确的" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61 -msgid "Balanced" -msgstr "平衡的" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:62 -msgid "Quick" -msgstr "快的" - -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:140 msgid "Importing SLA archive" msgstr "导入 SLA 存档" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:158 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:77 msgid "" "The SLA archive doesn't contain any presets. Please activate some SLA " "printer preset first before importing that SLA archive." msgstr "" "SLA 存档不包含任何预设。在导入 SLA 存档之前,请先激活一些 SLA 打印机预设。" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:164 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:81 +msgid "Import is unavailable for this archive format." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:86 msgid "Importing canceled." msgstr "导入已取消。" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:165 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:87 msgid "Importing done." msgstr "导入完成。" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:187 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:108 msgid "The file does not exist." msgstr "该文件不存在。" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:221 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135 msgid "" "The imported SLA archive did not contain any presets. The current SLA " "presets were used as fallback." msgstr "导入的 SLA 存档不包含任何预设。当前 SLA 预设被用作备用。" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:234 src/slic3r/GUI/Plater.cpp:2458 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:148 src/slic3r/GUI/Plater.cpp:2535 msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "不能在床上加载包含多部分对象的 SLA 项目" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:236 src/slic3r/GUI/Plater.cpp:2460 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:150 src/slic3r/GUI/Plater.cpp:2537 msgid "Attention!" msgstr "注意!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:166 +msgid "The profile in the imported archive is corrupt and will not be loaded." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:178 +msgid "" +"No object could be retrieved from the archive. The slices might be corrupted " +"or missing." +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1184 msgid "Keyboard Shortcuts" msgstr "键盘快捷键" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:77 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:86 msgid "New project, clear plater" msgstr "新项目,清盘" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:78 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 msgid "Open project AMF/3MF with config, clear plater" msgstr "使用配置打开项目 AMF/3MF,清除模板" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 msgid "Save project (3mf)" msgstr "保存项目 (3mf)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 msgid "Save project as (3mf)" msgstr "将项目另存为 (3mf)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:81 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 msgid "(Re)slice" msgstr "重新切片" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:83 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:92 msgid "Import STL/3MF/STEP/OBJ/AMF without config, keep plater" msgstr "导入 STL/3MF/STEP/OBJ/AMF 而不配置,保留模板" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:84 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 msgid "Import Config from ini/amf/3mf/gcode" msgstr "从这个 /amf/3mf/gcode 导入配置" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:85 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "从 ini/amf/3mf/gcode 加载配置并合并" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6543 src/libslic3r/PrintConfig.cpp:4423 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:96 src/slic3r/GUI/Plater.cpp:948 +#: src/slic3r/GUI/Plater.cpp:7161 src/libslic3r/PrintConfig.cpp:4575 msgid "Export G-code" msgstr "导出 G-Code" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:97 src/slic3r/GUI/Plater.cpp:7162 msgid "Send G-code" msgstr "发送 G-Code" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 msgid "Export config" msgstr "导出配置" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 src/slic3r/GUI/Plater.cpp:896 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 src/slic3r/GUI/Plater.cpp:931 msgid "Export to SD card / Flash drive" msgstr "导出到 SD 卡/闪存驱动器" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:91 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 msgid "Eject SD card / Flash drive" msgstr "弹出 SD 卡/闪存驱动器" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 msgid "Select all objects" msgstr "选择所有对象" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 msgid "Deselect all" msgstr "取消选择" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:95 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 msgid "Delete selected" msgstr "删除所选" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 -msgid "Copy to clipboard" -msgstr "复制到剪贴板" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 msgid "Paste from clipboard" msgstr "從剪貼板粘貼" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Reload plater from disk" msgstr "从磁盘重新加载制版机" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 msgid "Select Plater Tab" msgstr "选择 构建板 选项卡" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 msgid "Select Print Settings Tab" msgstr "选择 打印设置 选项卡" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 msgid "Select Filament Settings Tab" msgstr "选择 耗材设置 选项卡" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 msgid "Select Printer Settings Tab" msgstr "选择 打印机设置 选项卡" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 msgid "Switch to 3D" msgstr "切换到 3D" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 msgid "Switch to Preview" msgstr "切换到预览" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 -#: src/slic3r/GUI/PrintHostDialogs.cpp:217 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +#: src/slic3r/GUI/PrintHostDialogs.cpp:267 msgid "Print host upload queue" msgstr "打印主机上传队列" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/MainFrame.cpp:75 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 src/slic3r/GUI/MainFrame.cpp:77 msgid "Open new instance" msgstr "打开新实例" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 msgid "Camera view" msgstr "摄像机视图" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 msgid "Show/Hide object/instance labels" msgstr "显示/隐藏对象/实例标签" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Preferences.cpp:46 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Preferences.cpp:57 +#: src/slic3r/GUI/Preferences.cpp:165 src/slic3r/GUI/Preferences.cpp:188 +#: src/slic3r/GUI/Preferences.cpp:207 src/slic3r/GUI/Preferences.cpp:215 msgid "Preferences" msgstr "首选项" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 msgid "Show keyboard shortcuts list" msgstr "显示键盘快捷键列表" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 msgid "Commands" msgstr "命令" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 msgid "Add Instance of the selected object" msgstr "添加所选对象的实例" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Remove Instance of the selected object" msgstr "删除所选对象的实例" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 msgid "" "Press to select multiple objects\n" "or move multiple objects with mouse" @@ -5129,140 +6406,144 @@ msgstr "" "按可选择多个对象\n" "或用鼠标移动多个对象" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 msgid "Press to activate selection rectangle" msgstr "按下可激活选择矩形" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 msgid "Press to activate deselection rectangle" msgstr "按下可激活取消选择矩形" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Arrow Up" msgstr "上箭头" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 msgid "Move selection 10 mm in positive Y direction" msgstr "沿Y轴正方向移动选择 10 毫米" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Arrow Down" msgstr "上箭头" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 msgid "Move selection 10 mm in negative Y direction" msgstr "将所选内容沿Y轴负方向移动 10mm" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Arrow Left" msgstr "左箭头" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 msgid "Move selection 10 mm in negative X direction" msgstr "将所选内容沿X轴负方向移动 10 毫米" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Arrow Right" msgstr "右箭头" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 msgid "Move selection 10 mm in positive X direction" msgstr "沿X轴正方向移动所选内容 10 毫米" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Any arrow" msgstr "有箭吗" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 msgid "Movement step set to 1 mm" msgstr "移动步长设置为1毫米" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Movement in camera space" msgstr "摄像机空间中的运动" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Page Up" msgstr "上翻页" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Rotate selection 45 degrees CCW" msgstr "将所选内容逆时针旋转 45 度" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Page Down" msgstr "下翻页" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Rotate selection 45 degrees CW" msgstr "将所选内容顺时针旋转 45 度" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 msgid "Gizmo move" msgstr "线框移动" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 msgid "Gizmo scale" msgstr "线框缩放" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Gizmo rotate" msgstr "Gizmo 旋转" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Gizmo cut" msgstr "Gizmo 剪切" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 msgid "Gizmo Place face on bed" msgstr "放置小物件面到热床" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 msgid "Gizmo SLA hollow" msgstr "Gizmo SLA 空洞" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 msgid "Gizmo SLA support points" msgstr "Gizmo SLA 支撑点" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 msgid "Gizmo FDM paint-on supports" msgstr "Gizmo FDM 绘制支撑" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 msgid "Gizmo FDM paint-on seam" msgstr "Gizmo FDM 绘制接缝" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 msgid "Gizmo Multi Material painting" msgstr "Gizmo 多材质绘画" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +msgid "Gizmo Text emboss / engrave" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 msgid "Unselect gizmo or clear selection" msgstr "取消选择 gizmo 或清除选择" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 msgid "Change camera type (perspective, orthographic)" msgstr "更改摄像机类型(透视、正交)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 msgid "Zoom to Bed" msgstr "缩放至热床" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 msgid "" "Zoom to selected object\n" "or all objects in scene, if none selected" @@ -5270,437 +6551,437 @@ msgstr "" "缩放到选定对象\n" "或场景中的所有对象(如果未选定)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 msgid "Zoom in" msgstr "放大" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Zoom out" msgstr "缩小" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Switch between Editor/Preview" msgstr "在编辑器/预览之间切换" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Collapse/Expand the sidebar" msgstr "折叠/展开侧边栏" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled" msgstr "显示/隐藏 3Dconnexion 设备设置对话框(如果启用)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "显示/隐藏 3Dconnexion 设备设置对话框" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 msgid "Minimize application" msgstr "最小化应用程序" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 src/slic3r/GUI/MainFrame.cpp:284 -#: src/slic3r/GUI/MainFrame.cpp:333 src/slic3r/GUI/MainFrame.cpp:445 -#: src/slic3r/GUI/MainFrame.cpp:448 src/slic3r/GUI/MainFrame.cpp:470 -#: src/slic3r/GUI/MainFrame.cpp:473 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 src/slic3r/GUI/MainFrame.cpp:329 +#: src/slic3r/GUI/MainFrame.cpp:378 src/slic3r/GUI/MainFrame.cpp:490 +#: src/slic3r/GUI/MainFrame.cpp:493 src/slic3r/GUI/MainFrame.cpp:515 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Plater" msgstr "构建板" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button" msgstr "所有小发明:旋转-鼠标左键;平移-鼠标右键" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 msgid "Gizmo move: Press to snap by 1mm" msgstr "Gizmo 移动:按下可捕捉 1mm" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 msgid "Gizmo scale: Press to snap by 5%" msgstr "Gizmo 比例:按下可按 5% 捕捉" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 msgid "Gizmo scale: Scale selection to fit print volume" msgstr "Gizmo 缩放:缩放选择以适应打印体积" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 msgid "Gizmo scale: Press to activate one direction scaling" msgstr "Gizmo 缩放:按下可激活单向缩放" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 msgid "Gizmo scale: Press to scale selected objects around their own center" msgstr "Gizmo 缩放:按此键可围绕其自身中心缩放选定对象" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 msgid "Gizmo rotate: Press to rotate selected objects around their own center" msgstr "Gizmo rotate:按此键可围绕选定对象的中心旋转对象" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "Gizmos" msgstr "小发明" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "" "The following shortcuts are applicable when the specified gizmo is active" msgstr "当指定的 gizmo 处于活动状态时,以下快捷方式适用" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 msgid "Set selected items as Printable/Unprintable" msgstr "将所选项目设置为可打印/不可打印" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:203 msgid "Set default extruder for the selected items" msgstr "为所选项目设置默认挤出机" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 msgid "Set extruder number for the selected items" msgstr "设置所选项目的挤出机编号" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 msgid "Objects List" msgstr "对象列表" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/MainFrame.cpp:1611 msgid "Open a G-code file" msgstr "打开一个 G-Code 文件" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 -#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 -#: src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 src/slic3r/GUI/MainFrame.cpp:1443 +#: src/slic3r/GUI/MainFrame.cpp:1447 src/slic3r/GUI/MainFrame.cpp:1616 +#: src/slic3r/GUI/MainFrame.cpp:1620 msgid "Reload the plater from disk" msgstr "从磁盘重新加载制版机" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 msgid "Vertical slider - Move active thumb Up" msgstr "垂直滑块-向上移动活动拇指" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:228 msgid "Vertical slider - Move active thumb Down" msgstr "垂直滑块-向下移动活动拇指" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 msgid "Horizontal slider - Move active thumb Left" msgstr "水平滑块-将活动拇指向左移动" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 msgid "Horizontal slider - Move active thumb Right" msgstr "水平滑块-将活动拇指向右移动" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:231 msgid "On/Off one layer mode of the vertical slider" msgstr "打开/关闭垂直滑块的单层模式" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 -msgid "Show/Hide Legend and Estimated printing time" -msgstr "显示/隐藏图例和估计打印时间" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:232 +msgid "Show/Hide legend" +msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 msgid "Show/Hide G-code window" msgstr "显示/隐藏 G-Code 窗口" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4480 -#: src/slic3r/GUI/Tab.cpp:2832 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 src/slic3r/GUI/Plater.cpp:4562 +#: src/slic3r/GUI/Tab.cpp:2736 msgid "Preview" msgstr "预览" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 msgid "Move active thumb Up" msgstr "向上移动活动拇指" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 msgid "Move active thumb Down" msgstr "向下移动活动拇指" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 msgid "Set upper thumb as active" msgstr "将上拇指设置为活动" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 msgid "Set lower thumb as active" msgstr "将下拇指设置为活动" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 msgid "Add color change marker for current layer" msgstr "为当前图层添加颜色更改标记" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:238 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:244 msgid "Delete color change marker for current layer" msgstr "删除当前图层的颜色更改标记" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:250 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:251 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:245 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:256 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:257 msgid "" "Press to speed up 5 times while moving thumb\n" "with arrow keys or mouse wheel" msgstr "用箭头键或鼠标滚轮移动拇指时,按可加速5次" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "Vertical Slider" msgstr "垂直滑块" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "" "The following shortcuts are applicable in G-code preview when the vertical " "slider is active" msgstr "当垂直滑块处于活动状态时,以下快捷方式适用于 G-Code 预览" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Move active thumb Left" msgstr "向左移动活动拇指" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Move active thumb Right" msgstr "向右移动活动拇指" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Set left thumb as active" msgstr "将左拇指设置为活动" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Set right thumb as active" msgstr "将右拇指设置为活动" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "Horizontal Slider" msgstr "水平滑块" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "" "The following shortcuts are applicable in G-code preview when the horizontal " "slider is active" msgstr "当水平滑块处于活动状态时,以下快捷方式适用于 G-Code 预览" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:278 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:284 msgid "Keyboard shortcuts" msgstr "键盘快捷键" -#: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:77 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open a new PrusaSlicer instance" msgstr "打开一个新的 PrusaSlicer 实例" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:93 msgid "G-code preview" msgstr "G-Code 预览" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:1388 msgid "Open G-code viewer" msgstr "打开 G-Code 查看器" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:91 src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open PrusaSlicer" msgstr "打开 PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:93 msgid "Open new G-code viewer" msgstr "打开新的 G-Code 查看器" -#: src/slic3r/GUI/MainFrame.cpp:225 +#: src/slic3r/GUI/MainFrame.cpp:227 msgid "Closing PrusaSlicer. Current project is modified." msgstr "关闭 PrusaSlicer。当前项目已修改。" -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "PrusaSlicer is closing" msgstr "PrusaSlicer 快关门了" -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "Closing PrusaSlicer while some presets are modified." msgstr "在修改某些预设时关闭 PrusaSlicer。" -#: src/slic3r/GUI/MainFrame.cpp:285 src/slic3r/GUI/MainFrame.cpp:335 -#: src/slic3r/GUI/Tab.hpp:427 src/slic3r/GUI/Tab.hpp:550 +#: src/slic3r/GUI/MainFrame.cpp:330 src/slic3r/GUI/MainFrame.cpp:380 +#: src/slic3r/GUI/Tab.hpp:413 src/slic3r/GUI/Tab.hpp:539 msgid "Print Settings" msgstr "打印设置" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:535 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:384 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:520 msgid "Material Settings" msgstr "材料设置" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:461 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:382 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:448 msgid "Filament Settings" msgstr "耗材设置" -#: src/slic3r/GUI/MainFrame.cpp:287 src/slic3r/GUI/MainFrame.cpp:341 -#: src/slic3r/GUI/Tab.hpp:503 +#: src/slic3r/GUI/MainFrame.cpp:332 src/slic3r/GUI/MainFrame.cpp:386 +#: src/slic3r/GUI/Tab.hpp:488 msgid "Printer Settings" msgstr "打印机设置" -#: src/slic3r/GUI/MainFrame.cpp:632 src/slic3r/GUI/Plater.cpp:1719 -#: src/slic3r/GUI/Plater.cpp:2850 +#: src/slic3r/GUI/MainFrame.cpp:685 src/slic3r/GUI/Plater.cpp:1728 +#: src/slic3r/GUI/Plater.cpp:2879 msgid "Untitled" msgstr "无标题" -#: src/slic3r/GUI/MainFrame.cpp:655 +#: src/slic3r/GUI/MainFrame.cpp:710 msgid "based on Slic3r" msgstr "基于 Slic3r" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Prusa 3D &Drivers" msgstr "Prusa 3D 驱动程序(&D)" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Open the Prusa3D drivers download page in your browser" msgstr "在浏览器中打开 Prusa3d 驱动程序下载页" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Software &Releases" msgstr "软件发布(&R)" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open the software releases page in your browser" msgstr "在浏览器中打开软件发布页面" -#: src/slic3r/GUI/MainFrame.cpp:1081 +#: src/slic3r/GUI/MainFrame.cpp:1158 #, c-format, boost-format msgid "%s &Website" msgstr "%s 网站(&W)" -#: src/slic3r/GUI/MainFrame.cpp:1082 +#: src/slic3r/GUI/MainFrame.cpp:1159 #, c-format, boost-format msgid "Open the %s website in your browser" msgstr "在浏览器中打开 %s 网站" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "System &Info" msgstr "系统信息(&I)" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "Show system information" msgstr "显示系统信息" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show &Configuration Folder" msgstr "显示配置文件夹(&C)" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show user configuration folder (datadir)" msgstr "显示用户配置文件夹(数据目录)" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "Report an I&ssue" msgstr "报告问题(&S)" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 #, c-format, boost-format msgid "Report an issue on %s" msgstr "报告 %s 上的问题" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 #, c-format, boost-format msgid "&About %s" msgstr "关于 %s(&A)" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 msgid "Show about dialog" msgstr "显示关于对话框" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1177 msgid "Show Tip of the Day" msgstr "显示每日小贴士" -#: src/slic3r/GUI/MainFrame.cpp:1104 +#: src/slic3r/GUI/MainFrame.cpp:1181 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." msgstr "在右下角打开“每日提示”通知,或在已打开的情况下显示另一个提示。" -#: src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/MainFrame.cpp:1184 msgid "Show the list of the keyboard shortcuts" msgstr "显示键盘快捷键的列表" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso" msgstr "等距" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso View" msgstr "等距视图" #. TRN To be shown in the main menu View->Top #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2917 -#: src/libslic3r/PrintConfig.cpp:2926 +#: src/slic3r/GUI/MainFrame.cpp:1202 src/libslic3r/PrintConfig.cpp:3005 +#: src/libslic3r/PrintConfig.cpp:3014 msgid "Top" msgstr "顶部" -#: src/slic3r/GUI/MainFrame.cpp:1125 +#: src/slic3r/GUI/MainFrame.cpp:1202 msgid "Top View" msgstr "顶部视图" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:446 -#: src/libslic3r/PrintConfig.cpp:455 +#: src/slic3r/GUI/MainFrame.cpp:1205 src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:474 msgid "Bottom" msgstr "底部" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1205 msgid "Bottom View" msgstr "底部视图" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front" msgstr "前面" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front View" msgstr "前视图" -#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2274 +#: src/slic3r/GUI/MainFrame.cpp:1209 src/libslic3r/PrintConfig.cpp:2300 msgid "Rear" msgstr "后面" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1209 msgid "Rear View" msgstr "后视图" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left" msgstr "左面" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left View" msgstr "左视图" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right" msgstr "右面" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right View" msgstr "右视图" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "&New Project" msgstr "新建项目(&N)" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "Start a new project" msgstr "启动一个新项目" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "&Open Project" msgstr "打开项目(&O)" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "Open a project file" msgstr "打开项目文件" -#: src/slic3r/GUI/MainFrame.cpp:1157 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Recent projects" msgstr "最近项目" -#: src/slic3r/GUI/MainFrame.cpp:1169 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -5708,522 +6989,556 @@ msgstr "" "所选项目不再可用。\n" "是否要将其从最近的项目列表中删除?" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Save Project" msgstr "保存项目(&S)" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "Save current project file" msgstr "保存当前项目文件" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save Project &as" msgstr "将项目另存为(&A)" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save current project file as" msgstr "将当前项目文件另存为" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Import STL/3MF/STEP/OBJ/AM&F" msgstr "导入 STL/3MF/STEP/OBJ/AM&F" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Load a model" msgstr "加载模型" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Import STL (Imperial Units)" msgstr "导入 STL (英制单位)" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Load an model saved with imperial units" msgstr "加载使用英制单位保存的模型" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Import SL1 / SL1S Archive" -msgstr "导入 SL1 / SL1S 档案" +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Import SLA Archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Load an SLA archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Import ZIP Achive" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Load an SL1 / Sl1S archive" -msgstr "加载 SL1 / Sl1S 存档" +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Load a zip achive" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Import &Config" msgstr "导入配置(&C)" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Load exported configuration file" msgstr "加载导出的配置文件" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Import Config from &Project" msgstr "从项目导入配置(&P)" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Load configuration from project file" msgstr "从项目文件加载配置" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Import Config &Bundle" msgstr "导入配置组(&B)" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Load presets from a bundle" msgstr "从包加载预设" -#: src/slic3r/GUI/MainFrame.cpp:1231 +#: src/slic3r/GUI/MainFrame.cpp:1311 msgid "&Import" msgstr "导入(&I)" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1314 src/slic3r/GUI/MainFrame.cpp:1676 msgid "Export &G-code" msgstr "导出 G-Code(&G)" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1314 msgid "Export current plate as G-code" msgstr "将当构建板导出为 G-Code" -#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1318 src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end G-code" msgstr "发送 G-Code(&E)" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1318 msgid "Send to print current plate as G-code" msgstr "发送以 G-Code 打印当前板" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export G-code to SD Card / Flash Drive" msgstr "将 G-Code 导出到 SD 卡/闪存驱动器" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "将当前板作为 G-Code 导出到 SD 卡/闪存驱动器" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export Plate as &STL" -msgstr "将板材导出为 STL(&S)" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export Plate as &STL/OBJ" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export current plate as STL" -msgstr "将当前构建板导出为 STL" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export current plate as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export Plate as STL &Including Supports" -msgstr "将板材导出为 STL,包括支架(&I)" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export Plate as STL/OBJ &Including Supports" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export current plate as STL including supports" -msgstr "导出当前构建板为 STL,包括支撑" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export current plate as STL/OBJ including supports" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export &Toolpaths as OBJ" msgstr "将工具路径导出为 OBJ(&T)" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export toolpaths as OBJ" msgstr "导出工具路径作为 OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export &Config" msgstr "导出配置(&C)" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export current configuration to file" msgstr "将当前配置导出到文件" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export Config &Bundle" msgstr "导出配置包(&B)" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export all presets to file" msgstr "将所有预设导出到文件" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export Config Bundle With Physical Printers" msgstr "使用物理打印机导出配置包" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export all presets including physical printers to file" msgstr "将包括物理打印机在内的所有预设导出到文件" -#: src/slic3r/GUI/MainFrame.cpp:1270 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "&Export" msgstr "导出(&E)" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Ejec&t SD Card / Flash Drive" msgstr "弹出 SD 卡/闪存驱动器(&T)" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "将 G-Code 导出到 SD 卡/闪存驱动器后将其弹出。" -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Quick Slice" msgstr "快速切片" -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Slice a file into a G-code" msgstr "将文件切片成 G-Code" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Quick Slice and Save As" msgstr "快速切片并另存为" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Slice a file into a G-code, save as" msgstr "将文件切片成 G-Code, 并另存为" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat Last Quick Slice" msgstr "重复上次快速切片" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat last quick slice" msgstr "重复最后一个快速切片" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "(Re)Slice No&w" msgstr "立即重新切片(&W)" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "Start new slicing process" msgstr "开始新的切片流程" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "&Repair STL file" msgstr "修复 STL 文件(&R)" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "Automatically repair an STL file" msgstr "自动修复 STL 文件" -#: src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:1388 msgid "&G-code Preview" msgstr "G-Code 预览(&G)" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1392 +msgid "E&xit" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1392 src/slic3r/GUI/UpdateDialogs.cpp:376 +#: src/slic3r/GUI/UpdateDialogs.cpp:423 +#, c-format, boost-format +msgid "Exit %s" +msgstr "退出 %s" + +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 msgid "&Quit" msgstr "退出(&Q)" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 #, c-format, boost-format msgid "Quit %s" msgstr "退出 %s" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1410 msgid "&Select All" msgstr "全选(&S)" -#: src/slic3r/GUI/MainFrame.cpp:1327 +#: src/slic3r/GUI/MainFrame.cpp:1411 msgid "Selects all objects" msgstr "选择所有对象" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1413 msgid "D&eselect All" msgstr "取消选择(&E)" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1414 msgid "Deselects all objects" msgstr "取消选择所有对象" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1417 msgid "&Delete Selected" msgstr "删除所选内容(&D)" -#: src/slic3r/GUI/MainFrame.cpp:1334 +#: src/slic3r/GUI/MainFrame.cpp:1418 msgid "Deletes the current selection" msgstr "删除当前选择" -#: src/slic3r/GUI/MainFrame.cpp:1336 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Delete &All" msgstr "全部删除(&A)" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1421 msgid "Deletes all objects" msgstr "删除所有对象" -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1425 msgid "&Undo" msgstr "撤销(&U)" -#: src/slic3r/GUI/MainFrame.cpp:1344 +#: src/slic3r/GUI/MainFrame.cpp:1428 msgid "&Redo" msgstr "重做(&R)" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1433 msgid "&Copy" msgstr "复制(&C)" -#: src/slic3r/GUI/MainFrame.cpp:1350 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Copy selection to clipboard" msgstr "将选择复制到剪贴板" -#: src/slic3r/GUI/MainFrame.cpp:1352 +#: src/slic3r/GUI/MainFrame.cpp:1436 msgid "&Paste" msgstr "粘贴(&P)" -#: src/slic3r/GUI/MainFrame.cpp:1353 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "Paste clipboard" msgstr "粘贴剪贴板" -#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 -#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 +#: src/slic3r/GUI/MainFrame.cpp:1442 src/slic3r/GUI/MainFrame.cpp:1446 +#: src/slic3r/GUI/MainFrame.cpp:1615 src/slic3r/GUI/MainFrame.cpp:1619 msgid "Re&load from Disk" msgstr "从磁盘重新加载(&L)" -#: src/slic3r/GUI/MainFrame.cpp:1368 +#: src/slic3r/GUI/MainFrame.cpp:1452 msgid "Searc&h" msgstr "搜索(&H)" -#: src/slic3r/GUI/MainFrame.cpp:1369 +#: src/slic3r/GUI/MainFrame.cpp:1453 msgid "Search in settings" msgstr "在设置中搜索" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "&Plater Tab" msgstr "构建板选项卡(&P)" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "Show the plater" msgstr "显示平台构建板" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "P&rint Settings Tab" msgstr "打印设置选项卡(&R)" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "Show the print settings" msgstr "显示打印设置" -#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1469 src/slic3r/GUI/MainFrame.cpp:1679 msgid "&Filament Settings Tab" msgstr "耗材设置选项卡(&F)" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1469 msgid "Show the filament settings" msgstr "显示耗材设置" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Print&er Settings Tab" msgstr "打印机设置选项卡(&E)" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Show the printer settings" msgstr "显示打印机设置" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "3&D" msgstr "3&D" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "Show the 3D editing view" msgstr "显示 3D 编辑视图" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Pre&view" msgstr "预览(&V)" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Show the 3D slices preview" msgstr "显示 3D 切片预览" -#: src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/MainFrame.cpp:1488 msgid "Open the dialog to modify shape gallery" msgstr "打开对话框以修改形状库" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Print &Host Upload Queue" msgstr "打印主机上传队列(&H)" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Display the Print Host Upload Queue window" msgstr "显示打印主机上传队列窗口" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open New Instance" msgstr "打开新实例" -#: src/slic3r/GUI/MainFrame.cpp:1424 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 +#: src/slic3r/GUI/MainFrame.cpp:1507 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1727 msgid "Compare Presets" msgstr "比较预设" -#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/MainFrame.cpp:1507 msgid "Compare presets" msgstr "比较预设" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show &Labels" msgstr "显示标签(&L)" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show object/instance labels in 3D scene" msgstr "在三维场景中显示对象/实例标签" -#: src/slic3r/GUI/MainFrame.cpp:1437 +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show Legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show legend in preview" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1523 msgid "&Collapse Sidebar" msgstr "折叠边栏(&C)" -#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1523 src/slic3r/GUI/Plater.cpp:2347 msgid "Collapse sidebar" msgstr "折叠边栏" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "&Fullscreen" msgstr "全屏(&F)" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "Fullscreen" msgstr "全屏" -#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1543 src/slic3r/GUI/MainFrame.cpp:1650 msgid "&File" msgstr "文件(&F)" -#: src/slic3r/GUI/MainFrame.cpp:1458 +#: src/slic3r/GUI/MainFrame.cpp:1544 msgid "&Edit" msgstr "编辑(&E)" -#: src/slic3r/GUI/MainFrame.cpp:1459 +#: src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Window" msgstr "窗口(&W)" -#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 +#: src/slic3r/GUI/MainFrame.cpp:1546 src/slic3r/GUI/MainFrame.cpp:1651 msgid "&View" msgstr "视图(&V)" -#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 +#: src/slic3r/GUI/MainFrame.cpp:1549 src/slic3r/GUI/MainFrame.cpp:1654 msgid "&Help" msgstr "帮助(&H)" -#: src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/MainFrame.cpp:1611 msgid "&Open G-code" msgstr "打开 G-Code(&O)" -#: src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open &PrusaSlicer" msgstr "打开 PrusaSlicer(&P)" -#: src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legend" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1676 msgid "E&xport" msgstr "导出(&X)" -#: src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end to print" msgstr "发送到打印机(&E)" -#: src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1679 msgid "Mate&rial Settings Tab" msgstr "配合设置选项卡(&R)" -#: src/slic3r/GUI/MainFrame.cpp:1613 +#: src/slic3r/GUI/MainFrame.cpp:1703 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "选择要切片的文件 (STL/OBJ/AMF/3MF/PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1625 +#: src/slic3r/GUI/MainFrame.cpp:1715 msgid "No previously sliced file." msgstr "没有预切片的文件。" -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid "Previously sliced file (" msgstr "预切片文件 (" -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid ") not found." msgstr ") 无法找到。" -#: src/slic3r/GUI/MainFrame.cpp:1633 +#: src/slic3r/GUI/MainFrame.cpp:1723 msgid "File Not Found" msgstr "文件未找到" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 #, c-format, boost-format msgid "Save %s file as:" msgstr "将 %s 文件另存为:" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "G-code" msgstr "G-Code" -#: src/slic3r/GUI/MainFrame.cpp:1680 +#: src/slic3r/GUI/MainFrame.cpp:1770 msgid "Save zip file as:" msgstr "将 zip 文件另存为:" -#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6064 src/slic3r/GUI/Tab.cpp:1666 -#: src/slic3r/GUI/Tab.cpp:4730 +#: src/slic3r/GUI/MainFrame.cpp:1779 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6654 src/slic3r/GUI/Tab.cpp:1628 +#: src/slic3r/GUI/Tab.cpp:4986 msgid "Slicing" msgstr "切片" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1691 +#: src/slic3r/GUI/MainFrame.cpp:1781 #, c-format, boost-format msgid "Processing %s" msgstr "处理 %s" -#: src/slic3r/GUI/MainFrame.cpp:1714 +#: src/slic3r/GUI/MainFrame.cpp:1804 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% 已成功切片。" -#: src/slic3r/GUI/MainFrame.cpp:1717 +#: src/slic3r/GUI/MainFrame.cpp:1807 msgid "Slicing Done!" msgstr "切片完成!" -#: src/slic3r/GUI/MainFrame.cpp:1733 +#: src/slic3r/GUI/MainFrame.cpp:1823 msgid "Select the STL file to repair:" msgstr "选择要修复的 STL 文件:" -#: src/slic3r/GUI/MainFrame.cpp:1743 +#: src/slic3r/GUI/MainFrame.cpp:1833 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "将 OBJ 文件 (不像 STL 那样容易发生坐标错误) 保存为:" -#: src/slic3r/GUI/MainFrame.cpp:1754 +#: src/slic3r/GUI/MainFrame.cpp:1844 msgid "Your file was repaired." msgstr "您的文件已修复。" -#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4528 +#: src/slic3r/GUI/MainFrame.cpp:1844 src/libslic3r/PrintConfig.cpp:4694 msgid "Repair" msgstr "修复" -#: src/slic3r/GUI/MainFrame.cpp:1768 +#: src/slic3r/GUI/MainFrame.cpp:1858 msgid "Save configuration as:" msgstr "将配置另存为:" -#: src/slic3r/GUI/MainFrame.cpp:1785 +#: src/slic3r/GUI/MainFrame.cpp:1875 msgid "Loading of a configuration file" msgstr "加载配置文件" -#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 +#: src/slic3r/GUI/MainFrame.cpp:1877 src/slic3r/GUI/MainFrame.cpp:1944 msgid "Select configuration to load:" msgstr "选择要加载的配置:" -#: src/slic3r/GUI/MainFrame.cpp:1816 +#: src/slic3r/GUI/MainFrame.cpp:1908 msgid "Exporting configuration bundle" msgstr "导出配置包" -#: src/slic3r/GUI/MainFrame.cpp:1817 +#: src/slic3r/GUI/MainFrame.cpp:1909 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." msgstr "某些预设已修改,未保存的更改将不会导出到配置包中。" -#: src/slic3r/GUI/MainFrame.cpp:1826 +#: src/slic3r/GUI/MainFrame.cpp:1918 msgid "Save presets bundle as:" msgstr "将预设配置组另存为:" -#: src/slic3r/GUI/MainFrame.cpp:1849 +#: src/slic3r/GUI/MainFrame.cpp:1941 msgid "Loading of a configuration bundle" msgstr "加载配置包" -#: src/slic3r/GUI/MainFrame.cpp:1879 +#: src/slic3r/GUI/MainFrame.cpp:1971 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d 预设已成功导入。" @@ -6292,19 +7607,19 @@ msgstr "%s 信息" msgid "%s information" msgstr "%s 信息" -#: src/slic3r/GUI/NotificationManager.hpp:752 +#: src/slic3r/GUI/NotificationManager.hpp:899 msgid "3D Mouse disconnected." msgstr "3D 鼠标断开连接。" -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "Configuration update is available." msgstr "配置更新可用。" -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "See more." msgstr "查看更多。" -#: src/slic3r/GUI/NotificationManager.hpp:761 +#: src/slic3r/GUI/NotificationManager.hpp:908 msgid "" "You have just added a G-code for color change, but its value is empty.\n" "To export the G-code correctly, check the \"Color Change G-code\" in " @@ -6313,145 +7628,187 @@ msgstr "" "您刚刚添加了用于颜色更改的 G-Code,但其值为空。\n" "要正确导出 G-Code,请检查“打印机设置>自定义 G-Code ”中的“颜色更改 G-Code ”" -#: src/slic3r/GUI/NotificationManager.hpp:764 +#: src/slic3r/GUI/NotificationManager.hpp:911 msgid "" "No color change event was added to the print. The print does not look like a " "sign." msgstr "未向打印添加颜色更改事件。这个指纹看起来不像一个标志。" -#: src/slic3r/GUI/NotificationManager.hpp:766 +#: src/slic3r/GUI/NotificationManager.hpp:913 msgid "Desktop integration was successful." msgstr "桌面集成是成功的。" -#: src/slic3r/GUI/NotificationManager.hpp:768 +#: src/slic3r/GUI/NotificationManager.hpp:915 msgid "Desktop integration failed." msgstr "桌面集成失败。" -#: src/slic3r/GUI/NotificationManager.hpp:770 +#: src/slic3r/GUI/NotificationManager.hpp:917 msgid "Undo desktop integration was successful." msgstr "撤销桌面集成成功。" -#: src/slic3r/GUI/NotificationManager.hpp:772 +#: src/slic3r/GUI/NotificationManager.hpp:919 msgid "Undo desktop integration failed." msgstr "撤消桌面集成失败。" -#: src/slic3r/GUI/NotificationManager.hpp:773 +#: src/slic3r/GUI/NotificationManager.hpp:920 msgid "Exporting." msgstr "出口。" -#: src/slic3r/GUI/NotificationManager.cpp:664 +#: src/slic3r/GUI/NotificationManager.hpp:924 +msgid "" +"PrusaSlicer recieved a download request from Printables.com, but it's not " +"allowed. You can allow it" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:925 +msgid "here." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:773 msgid "Open Folder." msgstr "打开文件夹。" -#: src/slic3r/GUI/NotificationManager.cpp:701 +#: src/slic3r/GUI/NotificationManager.cpp:811 msgid "Eject drive" msgstr "弹出驱动器" -#: src/slic3r/GUI/NotificationManager.cpp:885 +#: src/slic3r/GUI/NotificationManager.cpp:1054 +#: src/slic3r/GUI/NotificationManager.cpp:1267 +#: src/slic3r/GUI/NotificationManager.cpp:1472 msgid "ERROR" msgstr "错误" -#: src/slic3r/GUI/NotificationManager.cpp:890 -msgid "CANCELED" -msgstr "已取消" - -#: src/slic3r/GUI/NotificationManager.cpp:895 +#: src/slic3r/GUI/NotificationManager.cpp:1269 +#: src/slic3r/GUI/NotificationManager.cpp:1377 msgid "COMPLETED" msgstr "已完成" -#: src/slic3r/GUI/NotificationManager.cpp:937 +#: src/slic3r/GUI/NotificationManager.cpp:1467 +msgid "RESOLVING ADDRESS" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:1477 +msgid "CANCELED" +msgstr "已取消" + +#: src/slic3r/GUI/NotificationManager.cpp:1539 msgid "Cancel upload" msgstr "取消上传" -#: src/slic3r/GUI/NotificationManager.cpp:996 +#: src/slic3r/GUI/NotificationManager.cpp:1648 #, c-format, boost-format msgid "%1$d object was loaded with custom supports." msgid_plural "%1$d objects were loaded with custom supports." msgstr[0] "%1$d 对象已加载自定义支持。" -#: src/slic3r/GUI/NotificationManager.cpp:997 +#: src/slic3r/GUI/NotificationManager.cpp:1649 #, c-format, boost-format msgid "%1$d object was loaded with custom seam." msgid_plural "%1$d objects were loaded with custom seam." msgstr[0] "%1$d 对象已加载自定义接缝。" -#: src/slic3r/GUI/NotificationManager.cpp:998 +#: src/slic3r/GUI/NotificationManager.cpp:1650 #, c-format, boost-format msgid "%1$d object was loaded with multimaterial painting." msgid_plural "%1$d objects were loaded with multimaterial painting." msgstr[0] "%1$d 对象加载了多材质绘画。" -#: src/slic3r/GUI/NotificationManager.cpp:999 +#: src/slic3r/GUI/NotificationManager.cpp:1651 #, c-format, boost-format msgid "%1$d object was loaded with variable layer height." msgid_plural "%1$d objects were loaded with variable layer height." msgstr[0] "%1$d 对象加载了可变层高度。" -#: src/slic3r/GUI/NotificationManager.cpp:1000 +#: src/slic3r/GUI/NotificationManager.cpp:1652 #, c-format, boost-format msgid "%1$d object was loaded with partial sinking." msgid_plural "%1$d objects were loaded with partial sinking." msgstr[0] "%1$d 物体装载了部分下沉。" -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1653 +#, c-format, boost-format +msgid "%1$d object was loaded as a part of cut object." +msgid_plural "%1$d objects were loaded as parts of cut object" +msgstr[0] "" + +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Slicing finished." msgstr "切片完成了。" -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export G-Code." msgstr "导出 G-Code。" -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export." msgstr "导出。" -#: src/slic3r/GUI/NotificationManager.cpp:1447 -#: src/slic3r/GUI/NotificationManager.cpp:1454 -#: src/slic3r/GUI/NotificationManager.cpp:1470 -#: src/slic3r/GUI/NotificationManager.cpp:1476 -#: src/slic3r/GUI/NotificationManager.cpp:1547 +#: src/slic3r/GUI/NotificationManager.cpp:2101 +#: src/slic3r/GUI/NotificationManager.cpp:2108 +#: src/slic3r/GUI/NotificationManager.cpp:2124 +#: src/slic3r/GUI/NotificationManager.cpp:2130 +#: src/slic3r/GUI/NotificationManager.cpp:2201 msgid "ERROR:" msgstr "错误:" -#: src/slic3r/GUI/NotificationManager.cpp:1459 -#: src/slic3r/GUI/NotificationManager.cpp:1486 -#: src/slic3r/GUI/NotificationManager.cpp:1494 -#: src/slic3r/GUI/NotificationManager.cpp:1505 src/slic3r/GUI/Plater.cpp:3197 +#: src/slic3r/GUI/NotificationManager.cpp:2113 +#: src/slic3r/GUI/NotificationManager.cpp:2140 +#: src/slic3r/GUI/NotificationManager.cpp:2148 +#: src/slic3r/GUI/NotificationManager.cpp:2159 src/slic3r/GUI/Plater.cpp:3220 msgid "WARNING:" msgstr "警告:" -#: src/slic3r/GUI/NotificationManager.cpp:1598 +#: src/slic3r/GUI/NotificationManager.cpp:2275 msgid "Exporting finished." msgstr "导出完成。" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:50 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 msgid "Paint-on seam" msgstr "绘制接缝" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:52 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:68 +msgid "Cut connectors" +msgstr "" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:70 msgid "Sinking" msgstr "下沉" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:110 msgid "Instances" msgstr "实例" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:98 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:266 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:114 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:275 #, c-format, boost-format msgid "Instance %d" msgstr "实例 %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4568 -#: src/slic3r/GUI/Tab.cpp:4659 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:121 src/slic3r/GUI/Tab.cpp:4805 +#: src/slic3r/GUI/Tab.cpp:4942 msgid "Layers" msgstr "图层" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 msgid "Range" msgstr "范围" -#: src/slic3r/GUI/OpenGLManager.cpp:258 +#: src/slic3r/GUI/OpenGLManager.cpp:376 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL ES 2.0 capable graphics driver to run " +"correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:379 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL %s capable graphics driver to run correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:382 #, c-format, boost-format msgid "" "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" @@ -6460,11 +7817,11 @@ msgstr "" "PrusaSlicer 需要支持 OpenGL 2.0 的图形驱动程序才能正确运行, \n" "当检测到 OpenGL 版本 %s、呈现 %s、供应商 %s 时。" -#: src/slic3r/GUI/OpenGLManager.cpp:261 +#: src/slic3r/GUI/OpenGLManager.cpp:386 msgid "You may need to update your graphics card driver." msgstr "您可能需要更新图形卡驱动程序。" -#: src/slic3r/GUI/OpenGLManager.cpp:264 +#: src/slic3r/GUI/OpenGLManager.cpp:389 msgid "" "As a workaround, you may run PrusaSlicer with a software rendered 3D " "graphics by running prusa-slicer.exe with the --sw-renderer parameter." @@ -6472,11 +7829,11 @@ msgstr "" "作为一种解决方法,您可以通过添加 --sw-renderer 参数来运行 prusa-slicer.exe," "以使用软件渲染 3D 图形来运行 PrusaSlicer。" -#: src/slic3r/GUI/OpenGLManager.cpp:266 +#: src/slic3r/GUI/OpenGLManager.cpp:391 msgid "Unsupported OpenGL version" msgstr "不支持的 OpenGL 版本" -#: src/slic3r/GUI/OpenGLManager.cpp:274 +#: src/slic3r/GUI/OpenGLManager.cpp:399 #, c-format, boost-format msgid "" "Unable to load the following shaders:\n" @@ -6485,16 +7842,20 @@ msgstr "" "无法加载以下着色器:\n" "%s" -#: src/slic3r/GUI/OpenGLManager.cpp:275 +#: src/slic3r/GUI/OpenGLManager.cpp:400 msgid "Error loading shaders" msgstr "加载着色器时出错" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:126 +msgid "Unavailable for this method." +msgstr "" + +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Top" msgstr "顶部" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Bottom" msgstr "底部" @@ -6503,7 +7864,7 @@ msgstr "底部" msgid "Delete this preset from this printer device" msgstr "从此打印机设备中删除此预设" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:83 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:84 msgid "This printer will be shown in the presets list as" msgstr "此打印机将在预设列表中显示为" @@ -6519,81 +7880,81 @@ msgstr "打印机的描述性名称" msgid "Add preset for this printer device" msgstr "添加此打印机设备的预设" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2255 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2239 msgid "Print Host upload" msgstr "打印主机上传" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:268 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:271 msgid "Connection to printers connected via the print host failed." msgstr "连接到通过打印主机连接的打印机失败。" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:310 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:313 msgid "Test" msgstr "测试" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:315 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:318 msgid "Could not get a valid Printer Host reference" msgstr "无法获取有效的打印机主机引用" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:330 msgid "Success!" msgstr "成功!" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:337 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:340 msgid "Refresh Printers" msgstr "刷新打印机" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:367 msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." msgstr "" "HTTPS CA 文件是可选的。只有在使用带有自签名证书的 HTTPS 时, 才需要使用它。" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:374 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:377 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "证书文件 (*.crt,*.pem)|*.crt;*.pem|所有文件|*.*" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:378 msgid "Open CA certificate file" msgstr "打开 CA 证书文件" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:404 -#: src/libslic3r/PrintConfig.cpp:330 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:407 +#: src/libslic3r/PrintConfig.cpp:343 msgid "HTTPS CA File" msgstr "HTTPS CA 文件" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:405 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:408 #, c-format, boost-format msgid "" "On this system, %s uses HTTPS certificates from the system Certificate Store " "or Keychain." msgstr "在此系统上, %s 使用来自系统证书存储或钥匙串的 HTTPS 证书。" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:406 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:409 msgid "" "To use a custom CA file, please import your CA file into Certificate Store / " "Keychain." msgstr "要使用自定义 CA 文件,请将 CA 文件导入证书存储/钥匙串。" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:634 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:706 msgid "The supplied name is empty. It can't be saved." msgstr "提供的名称为空。无法保存。" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:638 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:710 msgid "You have to enter a printer name." msgstr "您必须输入打印机名称。" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:646 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:718 #, boost-format msgid "Printer with name \"%1%\" already exists." msgstr "名为 \"%1%\" 的打印机已存在。" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:647 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:719 msgid "Replace?" msgstr "替换?" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:674 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:746 #, boost-format msgid "" "Following printer preset is duplicated:%1%The above preset for printer \"%2%" @@ -6603,19 +7964,19 @@ msgid_plural "" "\"%2%\" will be used just once." msgstr[0] "以下打印机预设重复:%1% 以上打印机 “%2%” 的预设将只使用一次。" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:724 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:796 msgid "It's not possible to delete the last related preset for the printer." msgstr "无法删除打印机的最后一个相关预设。" -#: src/slic3r/GUI/Plater.cpp:141 +#: src/slic3r/GUI/Plater.cpp:158 msgid "The provided name is not valid;" msgstr "提供的名称无效;" -#: src/slic3r/GUI/Plater.cpp:142 src/slic3r/GUI/SavePresetDialog.cpp:102 +#: src/slic3r/GUI/Plater.cpp:159 src/slic3r/GUI/SavePresetDialog.cpp:166 msgid "the following characters are not allowed:" msgstr "不允许使用以下字符:" -#: src/slic3r/GUI/Plater.cpp:207 +#: src/slic3r/GUI/Plater.cpp:223 msgid "" "For a multipart object, this value isn't accurate.\n" "It doesn't take account of intersections and negative volumes." @@ -6623,182 +7984,179 @@ msgstr "" "对于多部分对象,此值不准确。\n" "没有考虑交叉点和负体积。" -#: src/slic3r/GUI/Plater.cpp:211 +#: src/slic3r/GUI/Plater.cpp:227 msgid "Volume" msgstr "体积" -#: src/slic3r/GUI/Plater.cpp:213 +#: src/slic3r/GUI/Plater.cpp:229 msgid "Facets" msgstr "平面" -#: src/slic3r/GUI/Plater.cpp:276 +#: src/slic3r/GUI/Plater.cpp:286 msgid "Sliced Info" msgstr "切片信息" -#: src/slic3r/GUI/Plater.cpp:296 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:306 src/slic3r/GUI/Plater.cpp:1414 msgid "Used Filament (g)" msgstr "消耗耗材 (g)" -#: src/slic3r/GUI/Plater.cpp:297 src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:307 src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (m)" msgstr "消耗耗材 (m)" -#: src/slic3r/GUI/Plater.cpp:298 src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:308 src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (mm³)" msgstr "消耗耗材 (mm³)" -#: src/slic3r/GUI/Plater.cpp:299 +#: src/slic3r/GUI/Plater.cpp:309 msgid "Used Material (unit)" msgstr "消耗材料 (单位)" -#: src/slic3r/GUI/Plater.cpp:300 +#: src/slic3r/GUI/Plater.cpp:310 msgid "Cost (money)" msgstr "成本 (金钱)" -#: src/slic3r/GUI/Plater.cpp:301 src/slic3r/GUI/Plater.cpp:1340 -#: src/slic3r/GUI/Plater.cpp:1427 +#: src/slic3r/GUI/Plater.cpp:311 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:1464 msgid "Estimated printing time" msgstr "预计打印时间" -#: src/slic3r/GUI/Plater.cpp:302 +#: src/slic3r/GUI/Plater.cpp:312 msgid "Number of tool changes" msgstr "工具更换次数" -#: src/slic3r/GUI/Plater.cpp:431 +#: src/slic3r/GUI/Plater.cpp:437 msgid "Select what kind of support do you need" msgstr "选择您需要何种支撑" -#: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2590 -#: src/libslic3r/PrintConfig.cpp:3645 +#: src/slic3r/GUI/Plater.cpp:440 src/libslic3r/PrintConfig.cpp:2620 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "Support on build plate only" msgstr "仅从打印面板支撑" -#: src/slic3r/GUI/Plater.cpp:434 src/slic3r/GUI/Plater.cpp:564 +#: src/slic3r/GUI/Plater.cpp:441 msgid "For support enforcers only" msgstr "仅从支撑生成器支撑" -#: src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Plater.cpp:442 msgid "Everywhere" msgstr "任何地方" -#: src/slic3r/GUI/Plater.cpp:467 src/slic3r/GUI/Tab.cpp:1542 +#: src/slic3r/GUI/Plater.cpp:475 src/slic3r/GUI/Tab.cpp:1489 msgid "Brim" msgstr "裙边" -#: src/slic3r/GUI/Plater.cpp:469 +#: src/slic3r/GUI/Plater.cpp:477 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." msgstr "此标志启用将在第一层上的每个对象周围打印裙边。" -#: src/slic3r/GUI/Plater.cpp:477 +#: src/slic3r/GUI/Plater.cpp:485 msgid "Purging volumes" msgstr "清理量" -#: src/slic3r/GUI/Plater.cpp:578 +#: src/slic3r/GUI/Plater.cpp:592 msgid "Select what kind of pad do you need" msgstr "选择您需要哪种垫子" -#: src/slic3r/GUI/Plater.cpp:580 +#: src/slic3r/GUI/Plater.cpp:595 msgid "Below object" msgstr "对象底部" -#: src/slic3r/GUI/Plater.cpp:581 +#: src/slic3r/GUI/Plater.cpp:596 msgid "Around object" msgstr "对象周围" -#: src/slic3r/GUI/Plater.cpp:894 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/Plater.cpp:929 src/slic3r/GUI/Plater.cpp:7162 msgid "Send to printer" msgstr "发送到打印机" -#: src/slic3r/GUI/Plater.cpp:914 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6067 +#: src/slic3r/GUI/Plater.cpp:949 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6657 msgid "Slice now" msgstr "现在切片" -#: src/slic3r/GUI/Plater.cpp:1087 +#: src/slic3r/GUI/Plater.cpp:1127 msgid "Hold Shift to Slice & Export G-code" msgstr "按住 Shift 来切片并导出 G-Code" -#: src/slic3r/GUI/Plater.cpp:1287 +#: src/slic3r/GUI/Plater.cpp:1324 #, boost-format msgid "%1% (%2$d shell)" msgid_plural "%1% (%2$d shells)" msgstr[0] "%1% (%2$d 壳)" -#: src/slic3r/GUI/Plater.cpp:1315 +#: src/slic3r/GUI/Plater.cpp:1352 msgid "Used Material (ml)" msgstr "消耗材料 (毫升)" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "object" msgid_plural "objects" msgstr[0] "对象" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "supports and pad" msgstr "支撑和垫" -#: src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (in)" msgstr "消耗耗材 (英寸)" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "objects" msgstr "对象" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "wipe tower" msgstr "擦料塔" -#: src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (in³)" msgstr "消耗耗材 (in³)" -#: src/slic3r/GUI/Plater.cpp:1396 +#: src/slic3r/GUI/Plater.cpp:1433 #, boost-format msgid "Filament at extruder %1%" msgstr "挤出机上的长丝 %1%" -#: src/slic3r/GUI/Plater.cpp:1402 +#: src/slic3r/GUI/Plater.cpp:1439 msgid "(including spool)" msgstr "(包括线轴)" -#: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1072 -#: src/libslic3r/PrintConfig.cpp:3439 src/libslic3r/PrintConfig.cpp:3440 +#: src/slic3r/GUI/Plater.cpp:1448 src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:3716 src/libslic3r/PrintConfig.cpp:3717 msgid "Cost" msgstr "费用" -#: src/slic3r/GUI/Plater.cpp:1429 +#: src/slic3r/GUI/Plater.cpp:1466 msgid "normal mode" msgstr "正常模式" -#: src/slic3r/GUI/Plater.cpp:1436 +#: src/slic3r/GUI/Plater.cpp:1473 msgid "stealth mode" msgstr "隐身模式" -#: src/slic3r/GUI/Plater.cpp:1670 -msgid "Fill bed" -msgstr "填充床" - -#: src/slic3r/GUI/Plater.cpp:1676 -msgid "Optimize Rotation" -msgstr "优化旋转" - -#: src/slic3r/GUI/Plater.cpp:1682 -msgid "Import SLA archive" -msgstr "导入 SLA 存档" - -#: src/slic3r/GUI/Plater.cpp:1725 +#: src/slic3r/GUI/Plater.cpp:1734 #, boost-format msgid "Do you want to save the changes to \"%1%\"?" msgstr "是否要将更改保存到 \"%1%\"?" -#: src/slic3r/GUI/Plater.cpp:1730 src/slic3r/GUI/Preferences.cpp:222 +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:905 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1599 +msgid "Save" +msgstr "保存" + +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +msgid "Discard" +msgstr "丢弃" + +#: src/slic3r/GUI/Plater.cpp:1740 src/slic3r/GUI/Preferences.cpp:354 msgid "Ask for unsaved changes in project" msgstr "请求项目中未保存的更改" -#: src/slic3r/GUI/Plater.cpp:1733 +#: src/slic3r/GUI/Plater.cpp:1743 msgid "" "You will not be asked about it again, when: \n" "- Closing PrusaSlicer,\n" @@ -6808,27 +8166,27 @@ msgstr "" "-关闭 PrusaSlicer,\n" "-加载或创建新项目时,将不再询问您" -#: src/slic3r/GUI/Plater.cpp:2198 +#: src/slic3r/GUI/Plater.cpp:2214 #, c-format, boost-format msgid "" "Successfully unmounted. The device %s(%s) can now be safely removed from the " "computer." msgstr "成功卸载。设备 %s(%s) 现在可以安全地从计算机上删除。" -#: src/slic3r/GUI/Plater.cpp:2203 +#: src/slic3r/GUI/Plater.cpp:2220 #, c-format, boost-format msgid "Ejecting of device %s(%s) has failed." msgstr "弹出设备 %s(%s) 失败。" -#: src/slic3r/GUI/Plater.cpp:2222 src/slic3r/GUI/Plater.cpp:5108 +#: src/slic3r/GUI/Plater.cpp:2239 src/slic3r/GUI/Plater.cpp:5199 msgid "New Project" msgstr "新项目" -#: src/slic3r/GUI/Plater.cpp:2319 +#: src/slic3r/GUI/Plater.cpp:2346 msgid "Expand sidebar" msgstr "展开侧边栏" -#: src/slic3r/GUI/Plater.cpp:2518 +#: src/slic3r/GUI/Plater.cpp:2428 msgid "" "The preset below was temporarily installed on the active instance of " "PrusaSlicer" @@ -6837,12 +8195,12 @@ msgid_plural "" "PrusaSlicer" msgstr[0] "以下预设已临时安装在 PrusaSlicer 的活动实例上" -#: src/slic3r/GUI/Plater.cpp:2548 +#: src/slic3r/GUI/Plater.cpp:2583 #, boost-format msgid "Failed loading file \"%1%\" due to an invalid configuration." msgstr "由于配置无效,无法加载文件 \"%1%\"。" -#: src/slic3r/GUI/Plater.cpp:2568 +#: src/slic3r/GUI/Plater.cpp:2603 #, c-format, boost-format msgid "" "Object size from file %s appears to be zero.\n" @@ -6854,11 +8212,11 @@ msgstr[0] "" "文件 %s 中的对象大小似乎为零。\n" "这些对象已从模型中删除" -#: src/slic3r/GUI/Plater.cpp:2572 +#: src/slic3r/GUI/Plater.cpp:2607 msgid "The size of the object is zero" msgstr "对象的大小为零" -#: src/slic3r/GUI/Plater.cpp:2585 +#: src/slic3r/GUI/Plater.cpp:2620 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in meters.\n" @@ -6872,15 +8230,15 @@ msgstr[0] "" "文件 %s 中对象的尺寸似乎是以米为单位定义的。\n" "PrusaSlicer 的内部单位为毫米。是否要重新计算对象的尺寸?" -#: src/slic3r/GUI/Plater.cpp:2589 src/slic3r/GUI/Plater.cpp:2611 +#: src/slic3r/GUI/Plater.cpp:2624 src/slic3r/GUI/Plater.cpp:2646 msgid "The object is too small" msgstr "这个物体太小了" -#: src/slic3r/GUI/Plater.cpp:2590 src/slic3r/GUI/Plater.cpp:2612 +#: src/slic3r/GUI/Plater.cpp:2625 src/slic3r/GUI/Plater.cpp:2647 msgid "Apply to all the remaining small objects being loaded." msgstr "应用于正在加载的所有剩余小对象。" -#: src/slic3r/GUI/Plater.cpp:2607 +#: src/slic3r/GUI/Plater.cpp:2642 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in inches.\n" @@ -6894,7 +8252,7 @@ msgstr[0] "" "文件 %s 中对象的尺寸似乎是以英寸为单位定义的。\n" "PrusaSlicer 的内部单位为毫米。是否要重新计算对象的尺寸?" -#: src/slic3r/GUI/Plater.cpp:2625 +#: src/slic3r/GUI/Plater.cpp:2659 msgid "" "This file contains several objects positioned at multiple heights.\n" "Instead of considering them as multiple objects, should \n" @@ -6904,28 +8262,21 @@ msgstr "" "不应将它们视为多个对象, \n" "文件是否应作为包含多个部分的单个对象加载?" -#: src/slic3r/GUI/Plater.cpp:2628 src/slic3r/GUI/Plater.cpp:2683 +#: src/slic3r/GUI/Plater.cpp:2662 src/slic3r/GUI/Plater.cpp:2711 msgid "Multi-part object detected" msgstr "检测到多部分对象" -#: src/slic3r/GUI/Plater.cpp:2636 +#: src/slic3r/GUI/Plater.cpp:2669 msgid "" "This file cannot be loaded in a simple mode. Do you want to switch to an " "advanced mode?" msgstr "无法以简单模式加载此文件。你想切换到高级模式吗?" -#: src/slic3r/GUI/Plater.cpp:2637 +#: src/slic3r/GUI/Plater.cpp:2670 msgid "Detected advanced data" msgstr "检测到高级数据" -#: src/slic3r/GUI/Plater.cpp:2657 -#, c-format, boost-format -msgid "" -"You can't to add the object(s) from %s because of one or some of them " -"is(are) multi-part" -msgstr "不能从 %s 中添加对象, 因为其中一个或一些有多个部分" - -#: src/slic3r/GUI/Plater.cpp:2680 +#: src/slic3r/GUI/Plater.cpp:2708 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" @@ -6935,145 +8286,161 @@ msgstr "" "除了将它们视为多个对象之外,我是否应该将这些文件视为\n" "表示具有多个部分的单个对象?" -#: src/slic3r/GUI/Plater.cpp:2799 +#: src/slic3r/GUI/Plater.cpp:2827 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." msgstr "对象看起来太大,因此会自动缩小,以适应构建板。" -#: src/slic3r/GUI/Plater.cpp:2800 +#: src/slic3r/GUI/Plater.cpp:2828 msgid "Object too large?" msgstr "对象太大?" -#: src/slic3r/GUI/Plater.cpp:2878 +#: src/slic3r/GUI/Plater.cpp:2908 msgid "Export STL file:" msgstr "导出 STL 文件:" -#: src/slic3r/GUI/Plater.cpp:2885 +#: src/slic3r/GUI/Plater.cpp:2915 msgid "Export AMF file:" msgstr "导出 AMF 文件:" -#: src/slic3r/GUI/Plater.cpp:2891 +#: src/slic3r/GUI/Plater.cpp:2921 msgid "Save file as:" msgstr "将文件另存为:" -#: src/slic3r/GUI/Plater.cpp:2897 +#: src/slic3r/GUI/Plater.cpp:2927 msgid "Export OBJ file:" msgstr "导出 OBJ 文件:" -#: src/slic3r/GUI/Plater.cpp:2995 +#: src/slic3r/GUI/Plater.cpp:3030 +msgid "Delete object which is a part of cut object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3031 +msgid "" +"You try to delete an object which is a part of a cut object.\n" +"This action will break a cut correspondence.\n" +"After that PrusaSlicer can't guarantee model consistency" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3035 +msgid "Delete object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3040 msgid "Delete Object" msgstr "删除对象" -#: src/slic3r/GUI/Plater.cpp:3007 +#: src/slic3r/GUI/Plater.cpp:3057 msgid "Delete All Objects" msgstr "删除所有对象" -#: src/slic3r/GUI/Plater.cpp:3035 +#: src/slic3r/GUI/Plater.cpp:3086 msgid "Reset Project" msgstr "重置项目" -#: src/slic3r/GUI/Plater.cpp:3118 +#: src/slic3r/GUI/Plater.cpp:3141 msgid "" "The selected object couldn't be split because it contains only one solid " "part." msgstr "无法拆分选定对象,因为它只包含一个实体零件。" -#: src/slic3r/GUI/Plater.cpp:3125 +#: src/slic3r/GUI/Plater.cpp:3148 msgid "All non-solid parts (modifiers) were deleted" msgstr "删除了所有非实体零件(修改器)" -#: src/slic3r/GUI/Plater.cpp:3127 +#: src/slic3r/GUI/Plater.cpp:3150 msgid "Split to Objects" msgstr "拆分为对象" -#: src/slic3r/GUI/Plater.cpp:3179 +#: src/slic3r/GUI/Plater.cpp:3202 msgid "" "An object has custom support enforcers which will not be used because " "supports are disabled." msgstr "对象具有自定义支持强制器,由于支持已禁用,因此将不使用这些强制器。" -#: src/slic3r/GUI/Plater.cpp:3181 +#: src/slic3r/GUI/Plater.cpp:3204 msgid "Enable supports for enforcers only" msgstr "仅对实施者启用支持" -#: src/slic3r/GUI/Plater.cpp:3310 src/slic3r/GUI/Plater.cpp:4176 +#: src/slic3r/GUI/Plater.cpp:3339 src/slic3r/GUI/Plater.cpp:4238 msgid "Invalid data" msgstr "无效数据" -#: src/slic3r/GUI/Plater.cpp:3380 +#: src/slic3r/GUI/Plater.cpp:3410 msgid "Another export job is currently running." msgstr "当前正在运行另一个导出作业。" -#: src/slic3r/GUI/Plater.cpp:3466 +#: src/slic3r/GUI/Plater.cpp:3496 msgid "Replace from:" msgstr "替换自:" -#: src/slic3r/GUI/Plater.cpp:3484 +#: src/slic3r/GUI/Plater.cpp:3514 msgid "Unable to replace with more than one volume" msgstr "无法替换为多个卷" -#: src/slic3r/GUI/Plater.cpp:3484 src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3514 src/slic3r/GUI/Plater.cpp:3597 msgid "Error during replace" msgstr "更换过程中出错" -#: src/slic3r/GUI/Plater.cpp:3555 +#: src/slic3r/GUI/Plater.cpp:3589 msgid "Select the new file" msgstr "选择新文件" -#: src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3597 msgid "File for the replace wasn't selected" msgstr "未选择替换文件" -#: src/slic3r/GUI/Plater.cpp:3654 +#: src/slic3r/GUI/Plater.cpp:3684 msgid "Please select the file to reload" msgstr "请选择要重新加载的文件" -#: src/slic3r/GUI/Plater.cpp:3685 src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:3715 src/slic3r/GUI/Plater.cpp:5355 +#: src/slic3r/GUI/Plater.cpp:5365 msgid "The selected file" msgstr "选定的文件" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "differs from the original file" msgstr "与原始文件不同" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "Do you want to replace it" msgstr "你想替换它吗" -#: src/slic3r/GUI/Plater.cpp:3703 src/slic3r/GUI/Plater.cpp:3709 +#: src/slic3r/GUI/Plater.cpp:3736 src/slic3r/GUI/Plater.cpp:3742 msgid "Reload from:" msgstr "从以下位置重新加载:" -#: src/slic3r/GUI/Plater.cpp:3812 +#: src/slic3r/GUI/Plater.cpp:3864 msgid "Unable to reload:" msgstr "无法重新加载:" -#: src/slic3r/GUI/Plater.cpp:3817 +#: src/slic3r/GUI/Plater.cpp:3869 msgid "Error during reload" msgstr "重新加载时出错" -#: src/slic3r/GUI/Plater.cpp:3835 +#: src/slic3r/GUI/Plater.cpp:3887 msgid "Reload all from disk" msgstr "从磁盘重新加载所有" -#: src/slic3r/GUI/Plater.cpp:4130 +#: src/slic3r/GUI/Plater.cpp:4191 msgid "There are active warnings concerning sliced models:" msgstr "存在有关切片模型的活动警告:" -#: src/slic3r/GUI/Plater.cpp:4141 +#: src/slic3r/GUI/Plater.cpp:4202 msgid "generated warnings" msgstr "生成的警告" -#: src/slic3r/GUI/Plater.cpp:4472 +#: src/slic3r/GUI/Plater.cpp:4554 msgid "3D editor view" msgstr "3D 编辑器视图" -#: src/slic3r/GUI/Plater.cpp:4893 +#: src/slic3r/GUI/Plater.cpp:4980 msgid "Undo / Redo is processing" msgstr "撤消/重做正在处理" -#: src/slic3r/GUI/Plater.cpp:4895 +#: src/slic3r/GUI/Plater.cpp:4982 #, boost-format msgid "" "Switching the printer technology from %1% to %2%.\n" @@ -7083,19 +8450,19 @@ msgstr "" "将打印机技术从 %1% 切换到 %2%。\n" "修改了某些 %1% 的预设,切换打印机技术后这些预设将丢失。" -#: src/slic3r/GUI/Plater.cpp:5092 +#: src/slic3r/GUI/Plater.cpp:5184 msgid "Creating a new project while the current project is modified." msgstr "在修改当前项目时创建新项目。" -#: src/slic3r/GUI/Plater.cpp:5095 +#: src/slic3r/GUI/Plater.cpp:5187 msgid "Creating a new project while some presets are modified." msgstr "在修改某些预设时创建新项目。" -#: src/slic3r/GUI/Plater.cpp:5096 +#: src/slic3r/GUI/Plater.cpp:5188 msgid "You can keep presets modifications to the new project or discard them" msgstr "可以保留对新项目的预设修改,也可以放弃它们" -#: src/slic3r/GUI/Plater.cpp:5097 +#: src/slic3r/GUI/Plater.cpp:5189 msgid "" "You can keep presets modifications to the new project, discard them or save " "changes as new presets.\n" @@ -7104,125 +8471,172 @@ msgstr "" "可以保留对新项目的预设修改、放弃它们或将更改另存为新预设。\n" "注意,如果更改将被保存,那么新项目将不会保留它们" -#: src/slic3r/GUI/Plater.cpp:5103 +#: src/slic3r/GUI/Plater.cpp:5194 msgid "Creating a new project" msgstr "创建新项目" -#: src/slic3r/GUI/Plater.cpp:5137 +#: src/slic3r/GUI/Plater.cpp:5228 msgid "Load Project" msgstr "加载项目" -#: src/slic3r/GUI/Plater.cpp:5167 src/slic3r/GUI/Plater.cpp:5432 +#: src/slic3r/GUI/Plater.cpp:5258 msgid "Import Object" msgstr "导入对象" -#: src/slic3r/GUI/Plater.cpp:5171 +#: src/slic3r/GUI/Plater.cpp:5262 msgid "Import Objects" msgstr "导入对象" -#: src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:5291 +msgid "Import SLA archive" +msgstr "导入 SLA 存档" + +#: src/slic3r/GUI/Plater.cpp:5355 src/slic3r/GUI/Plater.cpp:5365 msgid "does not contain valid gcode." msgstr "不包含有效的 gcode。" -#: src/slic3r/GUI/Plater.cpp:5244 +#: src/slic3r/GUI/Plater.cpp:5356 src/slic3r/GUI/Plater.cpp:5366 msgid "Error while loading .gcode file" msgstr "加载 .gcode 文件时出错" -#: src/slic3r/GUI/Plater.cpp:5297 +#: src/slic3r/GUI/Plater.cpp:5433 +#, c-format, boost-format +msgid "%s - Multiple projects file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 +msgid "There are several files being loaded, including Project files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 src/slic3r/GUI/Plater.cpp:5446 +msgid "Select an action to apply to all files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5446 +msgid "There are several files being loaded." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5448 src/slic3r/GUI/Plater.cpp:5842 +msgid "Action" +msgstr "行动" + +#: src/slic3r/GUI/Plater.cpp:5469 +msgid "Import geometry" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5482 src/slic3r/GUI/Plater.cpp:5834 +msgid "Start new PrusaSlicer instance" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5496 +msgid "Select one to load as project" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5507 +msgid "Select one to load config only" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5609 +#, boost-format +msgid "Failed to unzip file to %1%: %2% " +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5618 +#, boost-format +msgid "Failed to find unzipped file at %1%. Unzipping of file has failed." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5821 #, c-format, boost-format -msgid "%s - Drop project file" -msgstr "%s - 删除项目文件" +msgid "%s - Load project file" +msgstr "" -#: src/slic3r/GUI/Plater.cpp:5304 +#: src/slic3r/GUI/Plater.cpp:5830 msgid "Open as project" msgstr "作为项目打开" -#: src/slic3r/GUI/Plater.cpp:5305 +#: src/slic3r/GUI/Plater.cpp:5831 msgid "Import geometry only" msgstr "仅导入几何体" -#: src/slic3r/GUI/Plater.cpp:5306 +#: src/slic3r/GUI/Plater.cpp:5832 msgid "Import config only" msgstr "仅导入配置" -#: src/slic3r/GUI/Plater.cpp:5309 +#: src/slic3r/GUI/Plater.cpp:5837 msgid "Select an action to apply to the file" msgstr "选择要应用于文件的操作" -#: src/slic3r/GUI/Plater.cpp:5314 -msgid "Action" -msgstr "行动" - -#: src/slic3r/GUI/Plater.cpp:5330 +#: src/slic3r/GUI/Plater.cpp:5858 msgid "Don't show again" msgstr "别再出现了" -#: src/slic3r/GUI/Plater.cpp:5371 +#: src/slic3r/GUI/Plater.cpp:5899 msgid "You can open only one .gcode file at a time." msgstr "你一次只能打开一个 .gcode 文件。" -#: src/slic3r/GUI/Plater.cpp:5372 +#: src/slic3r/GUI/Plater.cpp:5900 msgid "Drag and drop G-code file" msgstr "拖放 G-Code 文件" -#: src/slic3r/GUI/Plater.cpp:5454 +#: src/slic3r/GUI/Plater.cpp:5992 msgid "Load File" msgstr "加载文件" -#: src/slic3r/GUI/Plater.cpp:5459 +#: src/slic3r/GUI/Plater.cpp:5997 msgid "Load Files" msgstr "加载文件" -#: src/slic3r/GUI/Plater.cpp:5509 +#: src/slic3r/GUI/Plater.cpp:6047 msgid "All objects will be removed, continue?" msgstr "将删除所有对象,是否继续?" -#: src/slic3r/GUI/Plater.cpp:5520 +#: src/slic3r/GUI/Plater.cpp:6058 msgid "Delete Selected Objects" msgstr "删除选定对象" -#: src/slic3r/GUI/Plater.cpp:5529 +#: src/slic3r/GUI/Plater.cpp:6067 msgid "Increase Instances" msgstr "增加实例" -#: src/slic3r/GUI/Plater.cpp:5563 +#: src/slic3r/GUI/Plater.cpp:6109 msgid "Decrease Instances" msgstr "减少实例" -#: src/slic3r/GUI/Plater.cpp:5614 +#: src/slic3r/GUI/Plater.cpp:6167 msgid "Enter the number of copies:" msgstr "输入副本数:" -#: src/slic3r/GUI/Plater.cpp:5615 +#: src/slic3r/GUI/Plater.cpp:6168 msgid "Copies of the selected object" msgstr "选定对象的副本" -#: src/slic3r/GUI/Plater.cpp:5619 +#: src/slic3r/GUI/Plater.cpp:6171 #, c-format, boost-format msgid "Set numbers of copies to %d" msgstr "将副本数设置为 %d" -#: src/slic3r/GUI/Plater.cpp:5697 -msgid "Cut by Plane" -msgstr "按平面切割" +#: src/slic3r/GUI/Plater.cpp:6187 +msgid "Fill bed" +msgstr "填充床" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save G-code file as:" msgstr "将 G-Code 文件另存为:" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save SL1 / SL1S file as:" msgstr "将 SL1 / SL1S 文件另存为:" -#: src/slic3r/GUI/Plater.cpp:5766 +#: src/slic3r/GUI/Plater.cpp:6336 msgid "The provided file name is not valid." msgstr "提供的文件名无效。" -#: src/slic3r/GUI/Plater.cpp:5767 +#: src/slic3r/GUI/Plater.cpp:6337 msgid "The following characters are not allowed by a FAT file system:" msgstr "FAT 文件系统不允许使用以下字符:" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "" "The plater is empty.\n" "Do you want to save the project?" @@ -7230,57 +8644,59 @@ msgstr "" "盘子是空的。\n" "你想保存这个项目吗?" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "Save project" msgstr "保存项目" -#: src/slic3r/GUI/Plater.cpp:6543 +#: src/slic3r/GUI/Plater.cpp:6766 +msgid "Is the printer ready? Is the print sheet in place, empty and clean?" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:6766 src/slic3r/GUI/PrintHostDialogs.cpp:132 +msgid "Upload and Print" +msgstr "上传和打印" + +#: src/slic3r/GUI/Plater.cpp:7161 msgid "Export" msgstr "导出" -#: src/slic3r/GUI/Plater.cpp:6575 -msgid "" -"Custom supports, seams and multimaterial painting were removed after " -"repairing the mesh." -msgstr "修复网格后,移除了定制支架、接缝和多材料喷漆。" - -#: src/slic3r/GUI/Plater.cpp:6689 +#: src/slic3r/GUI/Plater.cpp:7306 msgid "Paste From Clipboard" msgstr "从剪贴板粘贴" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2290 -#: src/slic3r/GUI/Tab.cpp:2517 src/slic3r/GUI/Tab.cpp:2624 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Preferences.cpp:240 src/slic3r/GUI/Tab.cpp:2274 +#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2617 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "General" msgstr "常规" -#: src/slic3r/GUI/Preferences.cpp:121 +#: src/slic3r/GUI/Preferences.cpp:258 msgid "Remember output directory" msgstr "记住输出目录" -#: src/slic3r/GUI/Preferences.cpp:123 +#: src/slic3r/GUI/Preferences.cpp:259 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." msgstr "" "如果启用此功能,Slic3r 将提示最后一个输出目录,而不是包含输入文件的输出目录。" -#: src/slic3r/GUI/Preferences.cpp:129 +#: src/slic3r/GUI/Preferences.cpp:263 msgid "Auto-center parts" msgstr "自动居中部件" -#: src/slic3r/GUI/Preferences.cpp:131 +#: src/slic3r/GUI/Preferences.cpp:264 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." msgstr "如果启用此功能,Slic3r 将自动将对象集中在构建板中心周围。" -#: src/slic3r/GUI/Preferences.cpp:137 +#: src/slic3r/GUI/Preferences.cpp:268 msgid "Background processing" msgstr "后台处理" -#: src/slic3r/GUI/Preferences.cpp:139 +#: src/slic3r/GUI/Preferences.cpp:269 msgid "" "If this is enabled, Slic3r will pre-process objects as soon as they're " "loaded in order to save time when exporting G-code." @@ -7288,25 +8704,37 @@ msgstr "" "如果启用此功能,Slic3r 将在加载对象后立即对其进行预处理, 以便在导出 G-Code 时" "节省时间。" -#: src/slic3r/GUI/Preferences.cpp:148 +#: src/slic3r/GUI/Preferences.cpp:274 +msgid "Alert when supports needed" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:275 +msgid "" +"If this is enabled, Slic3r will raise alerts when it detects issues in the " +"sliced object, that can be resolved with supports (and brim). Examples of " +"such issues are floating object parts, unsupported extrusions and low bed " +"adhesion." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:285 msgid "Export sources full pathnames to 3mf and amf" msgstr "将源完整路径名导出到 3mf 和 amf" -#: src/slic3r/GUI/Preferences.cpp:150 +#: src/slic3r/GUI/Preferences.cpp:286 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked." msgstr "如果启用,则允许从磁盘重新加载命令在调用时自动查找和加载文件。" -#: src/slic3r/GUI/Preferences.cpp:159 +#: src/slic3r/GUI/Preferences.cpp:293 msgid "If enabled, sets PrusaSlicer as default application to open .3mf files." msgstr "如果启用,将 PrusaSlicer 设置为打开.3mf 文件的默认应用程序。" -#: src/slic3r/GUI/Preferences.cpp:166 +#: src/slic3r/GUI/Preferences.cpp:298 msgid "If enabled, sets PrusaSlicer as default application to open .stl files." msgstr "如果启用,则将 PrusaSlicer 设置为要打开的默认应用程序。stl 文件。" -#: src/slic3r/GUI/Preferences.cpp:177 +#: src/slic3r/GUI/Preferences.cpp:307 msgid "" "If enabled, Slic3r downloads updates of built-in system presets in the " "background. These updates are downloaded into a separate temporary location. " @@ -7316,11 +8744,11 @@ msgstr "" "如果启用,Slic3r 将在后台下载内置系统预设的更新。 这些更新将会下载到一个单独" "的临时文件夹。当一切准备就绪,将在应用启动的时候提供新版本。" -#: src/slic3r/GUI/Preferences.cpp:182 +#: src/slic3r/GUI/Preferences.cpp:312 msgid "Suppress \" - default - \" presets" msgstr "禁止\"- 默认值 -\"预设" -#: src/slic3r/GUI/Preferences.cpp:184 +#: src/slic3r/GUI/Preferences.cpp:313 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." @@ -7328,11 +8756,21 @@ msgstr "" "在 \"打印/耗材/打印机\" 选择中禁止 \"-默认-\" 预设, 一旦有任何其他有效的预设" "可用。" -#: src/slic3r/GUI/Preferences.cpp:190 +#: src/slic3r/GUI/Preferences.cpp:317 +msgid "Suppress \" Template \" filament presets" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:318 +msgid "" +"Suppress \" Template \" filament presets in configuration wizard and sidebar " +"visibility." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:322 msgid "Show incompatible print and filament presets" msgstr "显示不兼容的打印和耗材预设" -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:323 msgid "" "When checked, the print and filament presets are shown in the preset editor " "even if they are marked as incompatible with the active printer" @@ -7340,11 +8778,22 @@ msgstr "" "选中后, 打印和耗材预设将显示在预设编辑器中, 即使它们被标记为与活动打印机不兼" "容" -#: src/slic3r/GUI/Preferences.cpp:200 +#: src/slic3r/GUI/Preferences.cpp:331 +msgid "Show load project dialog" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:332 +msgid "" +"When checked, whenever dragging and dropping a project file on the " +"application or open it from a browser, shows a dialog asking to select the " +"action to take on the file to load." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:335 msgid "Show drop project dialog" msgstr "显示删除项目对话框" -#: src/slic3r/GUI/Preferences.cpp:202 +#: src/slic3r/GUI/Preferences.cpp:336 msgid "" "When checked, whenever dragging and dropping a project file on the " "application, shows a dialog asking to select the action to take on the file " @@ -7353,11 +8802,11 @@ msgstr "" "选中后,无论何时在应用程序上拖放项目文件,都会显示一个对话框,要求选择要加载" "的文件上要执行的操作。" -#: src/slic3r/GUI/Preferences.cpp:208 src/slic3r/GUI/Preferences.cpp:212 +#: src/slic3r/GUI/Preferences.cpp:342 src/slic3r/GUI/Preferences.cpp:346 msgid "Allow just a single PrusaSlicer instance" msgstr "只允许一个 PrusaSlicer 实例" -#: src/slic3r/GUI/Preferences.cpp:210 +#: src/slic3r/GUI/Preferences.cpp:343 msgid "" "On OSX there is always only one instance of app running by default. However " "it is allowed to run multiple instances of same app from the command line. " @@ -7366,7 +8815,7 @@ msgstr "" "在 OSX 上,默认情况下,应用程序始终只有一个实例在运行。但是,它允许从命令行运" "行同一应用程序的多个实例。在这种情况下,此设置只允许一个实例。" -#: src/slic3r/GUI/Preferences.cpp:214 +#: src/slic3r/GUI/Preferences.cpp:347 msgid "" "If this is enabled, when starting PrusaSlicer and another instance of the " "same PrusaSlicer is already running, that instance will be reactivated " @@ -7375,7 +8824,7 @@ msgstr "" "如果启用此选项,则当启动 PrusaSlicer 且同一 PrusaSlicer 的另一个实例已在运行" "时,该实例将被重新激活。" -#: src/slic3r/GUI/Preferences.cpp:224 +#: src/slic3r/GUI/Preferences.cpp:355 msgid "" "Always ask for unsaved changes in project, when: \n" "- Closing PrusaSlicer,\n" @@ -7385,14 +8834,14 @@ msgstr "" "-关闭 PrusaSlicer,\n" "-加载或创建新项目时,始终在项目中请求未保存的更改" -#: src/slic3r/GUI/Preferences.cpp:233 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:897 +#: src/slic3r/GUI/Preferences.cpp:363 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:925 msgid "" "Ask to save unsaved changes in presets when closing the application or when " "loading a new project" msgstr "关闭应用程序或加载新项目时,要求保存预设中未保存的更改" -#: src/slic3r/GUI/Preferences.cpp:235 +#: src/slic3r/GUI/Preferences.cpp:364 msgid "" "Always ask for unsaved changes in presets, when: \n" "- Closing PrusaSlicer while some presets are modified,\n" @@ -7402,31 +8851,31 @@ msgstr "" "-在某些预设被修改时关闭 PrusaSlicer,\n" "-在某些预设被修改时加载一个新项目时,始终要求对预设进行未保存的更改" -#: src/slic3r/GUI/Preferences.cpp:242 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:896 +#: src/slic3r/GUI/Preferences.cpp:370 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:924 msgid "Ask for unsaved changes in presets when selecting new preset" msgstr "选择新预设时,询问预设中未保存的更改" -#: src/slic3r/GUI/Preferences.cpp:244 +#: src/slic3r/GUI/Preferences.cpp:371 msgid "" "Always ask for unsaved changes in presets when selecting new preset or " "resetting a preset" msgstr "选择新预设或重置预设时,始终要求对预设进行未保存的更改" -#: src/slic3r/GUI/Preferences.cpp:249 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 +#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:923 msgid "Ask for unsaved changes in presets when creating new project" msgstr "创建新项目时,要求对预设进行未保存的更改" -#: src/slic3r/GUI/Preferences.cpp:251 +#: src/slic3r/GUI/Preferences.cpp:376 msgid "Always ask for unsaved changes in presets when creating new project" msgstr "创建新项目时,始终要求对预设进行未保存的更改" -#: src/slic3r/GUI/Preferences.cpp:258 +#: src/slic3r/GUI/Preferences.cpp:382 msgid "Associate .gcode files to PrusaSlicer G-code Viewer" msgstr "关联 .gcode 文件到 PrusaSlicer G-Code 查看器" -#: src/slic3r/GUI/Preferences.cpp:260 +#: src/slic3r/GUI/Preferences.cpp:383 msgid "" "If enabled, sets PrusaSlicer G-code Viewer as default application to open ." "gcode files." @@ -7434,11 +8883,11 @@ msgstr "" "如果启用,将 PrusaSlicer G-Code Viewer 设置为要打开的默认应用程序 .gcode 文" "件。" -#: src/slic3r/GUI/Preferences.cpp:268 +#: src/slic3r/GUI/Preferences.cpp:390 msgid "Use Retina resolution for the 3D scene" msgstr "对 3D 场景使用视网膜分辨率" -#: src/slic3r/GUI/Preferences.cpp:270 +#: src/slic3r/GUI/Preferences.cpp:391 msgid "" "If enabled, the 3D scene will be rendered in Retina resolution. If you are " "experiencing 3D performance problems, disabling this option may help." @@ -7446,109 +8895,103 @@ msgstr "" "如果启用,3D 场景将以视网膜分辨率渲染。如果您遇到 3D 性能问题,禁用此选项可能" "会有所帮助。" -#: src/slic3r/GUI/Preferences.cpp:280 src/slic3r/GUI/Preferences.cpp:282 +#: src/slic3r/GUI/Preferences.cpp:400 src/slic3r/GUI/Preferences.cpp:401 msgid "Show splash screen" msgstr "显示启动屏幕" -#: src/slic3r/GUI/Preferences.cpp:289 +#: src/slic3r/GUI/Preferences.cpp:406 msgid "If enabled, PrusaSlicer will be open at the position it was closed" msgstr "如果启用,PrusaSlicer 将在其关闭的位置打开" -#: src/slic3r/GUI/Preferences.cpp:295 +#: src/slic3r/GUI/Preferences.cpp:411 msgid "Clear Undo / Redo stack on new project" msgstr "清除新项目上的撤消/重做堆栈" -#: src/slic3r/GUI/Preferences.cpp:297 +#: src/slic3r/GUI/Preferences.cpp:412 msgid "" "Clear Undo / Redo stack on new project or when an existing project is loaded." msgstr "在新项目上或加载现有项目时清除“撤消/重做堆栈”。" -#: src/slic3r/GUI/Preferences.cpp:303 +#: src/slic3r/GUI/Preferences.cpp:417 msgid "Enable support for legacy 3DConnexion devices" msgstr "启用对传统 3DConnexion 设备的支持" -#: src/slic3r/GUI/Preferences.cpp:305 +#: src/slic3r/GUI/Preferences.cpp:418 msgid "" "If enabled, the legacy 3DConnexion devices settings dialog is available by " "pressing CTRL+M" msgstr "如果启用,按 CTRL+M 键可以使用传统的 3DConnexion 设备设置对话框" -#: src/slic3r/GUI/Preferences.cpp:314 +#: src/slic3r/GUI/Preferences.cpp:425 msgid "Camera" msgstr "照相机" -#: src/slic3r/GUI/Preferences.cpp:319 +#: src/slic3r/GUI/Preferences.cpp:435 msgid "Use perspective camera" msgstr "使用透视摄像机" -#: src/slic3r/GUI/Preferences.cpp:321 +#: src/slic3r/GUI/Preferences.cpp:436 msgid "" "If enabled, use perspective camera. If not enabled, use orthographic camera." msgstr "如果启用,请使用透视摄像机。如果未启用,请使用正交相机。" -#: src/slic3r/GUI/Preferences.cpp:326 +#: src/slic3r/GUI/Preferences.cpp:440 msgid "Use free camera" msgstr "使用自由相机" -#: src/slic3r/GUI/Preferences.cpp:328 +#: src/slic3r/GUI/Preferences.cpp:441 msgid "If enabled, use free camera. If not enabled, use constrained camera." msgstr "如果启用,请使用自由摄像头。如果未启用,请使用受约束的摄影机。" -#: src/slic3r/GUI/Preferences.cpp:333 +#: src/slic3r/GUI/Preferences.cpp:445 msgid "Reverse direction of zoom with mouse wheel" msgstr "使用鼠标滚轮反转缩放方向" -#: src/slic3r/GUI/Preferences.cpp:335 +#: src/slic3r/GUI/Preferences.cpp:446 msgid "If enabled, reverses the direction of zoom with mouse wheel" msgstr "如果启用,则使用鼠标滚轮反转缩放方向" -#: src/slic3r/GUI/Preferences.cpp:343 +#: src/slic3r/GUI/Preferences.cpp:452 msgid "GUI" msgstr "图形界面" -#: src/slic3r/GUI/Preferences.cpp:366 +#: src/slic3r/GUI/Preferences.cpp:492 msgid "Sequential slider applied only to top layer" msgstr "仅应用于顶层的顺序滑块" -#: src/slic3r/GUI/Preferences.cpp:368 +#: src/slic3r/GUI/Preferences.cpp:493 msgid "" "If enabled, changes made using the sequential slider, in preview, apply only " -"to gcode top layer. If disabled, changes made using the sequential slider, " -"in preview, apply to the whole gcode." +"to gcode top layer.If disabled, changes made using the sequential slider, in " +"preview, apply to the whole gcode." msgstr "" -"如果启用,则在预览中使用顺序滑块所做的更改仅适用于 gcode 顶层。如果禁用,则在" -"预览中使用顺序滑块所做的更改将应用于整个 gcode。" -#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/Preferences.cpp:499 msgid "Show sidebar collapse/expand button" msgstr "显示侧边栏折叠/展开按钮" -#: src/slic3r/GUI/Preferences.cpp:377 +#: src/slic3r/GUI/Preferences.cpp:500 msgid "" "If enabled, the button for the collapse sidebar will be appeared in top " "right corner of the 3D Scene" msgstr "如果启用,折叠侧边栏的按钮将出现在 3D 场景的右上角" -#: src/slic3r/GUI/Preferences.cpp:384 -msgid "If enabled, PrusaSlicer will not open hyperlinks in your browser." -msgstr "如果启用,PrusaSlicer 将不会在浏览器中打开超链接。" - -#: src/slic3r/GUI/Preferences.cpp:391 +#: src/slic3r/GUI/Preferences.cpp:511 msgid "Use colors for axes values in Manipulation panel" msgstr "在操纵面板中为轴值使用颜色" -#: src/slic3r/GUI/Preferences.cpp:393 +#: src/slic3r/GUI/Preferences.cpp:512 msgid "" "If enabled, the axes names and axes values will be colorized according to " "the axes colors. If disabled, old UI will be used." msgstr "" "如果启用,轴名称和轴值将根据轴颜色进行着色。如果禁用,将使用旧用户界面。" -#: src/slic3r/GUI/Preferences.cpp:399 +#: src/slic3r/GUI/Preferences.cpp:517 msgid "Order object volumes by types" msgstr "按类型对对象卷进行排序" -#: src/slic3r/GUI/Preferences.cpp:401 +#: src/slic3r/GUI/Preferences.cpp:518 msgid "" "If enabled, volumes will be always ordered inside the object. Correct order " "is Model Part, Negative Volume, Modifier, Support Blocker and Support " @@ -7559,29 +9002,47 @@ msgstr "" "阻止器和支持执行器。如果禁用,可以对模型零件、负体积和修改器重新排序。但其中" "一个模型零件必须放在首位。" -#: src/slic3r/GUI/Preferences.cpp:408 +#: src/slic3r/GUI/Preferences.cpp:523 +msgid "Show non-manifold edges" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:524 +msgid "If enabled, shows non-manifold edges." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:528 +msgid "Allow automatically color change" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:529 +msgid "" +"If enabled, related notification will be shown, when sliced object looks " +"like a logo or a sign." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:534 msgid "Set settings tabs as menu items (experimental)" msgstr "将设置选项卡设置为菜单项(实验)" -#: src/slic3r/GUI/Preferences.cpp:410 +#: src/slic3r/GUI/Preferences.cpp:535 msgid "" "If enabled, Settings Tabs will be placed as menu items. If disabled, old UI " "will be used." msgstr "如果启用,设置选项卡将作为菜单项放置。如果禁用,将使用旧用户界面。" -#: src/slic3r/GUI/Preferences.cpp:419 +#: src/slic3r/GUI/Preferences.cpp:542 msgid "Show \"Tip of the day\" notification after start" msgstr "启动后显示“每日提示”通知" -#: src/slic3r/GUI/Preferences.cpp:421 +#: src/slic3r/GUI/Preferences.cpp:543 msgid "If enabled, useful hints are displayed at startup." msgstr "如果启用,将在启动时显示有用的提示。" -#: src/slic3r/GUI/Preferences.cpp:427 +#: src/slic3r/GUI/Preferences.cpp:547 msgid "Notify about new releases" msgstr "通知新版本" -#: src/slic3r/GUI/Preferences.cpp:429 +#: src/slic3r/GUI/Preferences.cpp:548 msgid "" "You will be notified about new release after startup acordingly: All = " "Regular release and alpha / beta releases. Release only = regular release." @@ -7589,61 +9050,75 @@ msgstr "" "启动后,您将收到关于新版本的通知:所有=常规版本和 alpha/beta 版本。仅发布=定" "期发布。" -#: src/slic3r/GUI/Preferences.cpp:435 +#: src/slic3r/GUI/Preferences.cpp:551 msgid "Release only" msgstr "仅发布" -#: src/slic3r/GUI/Preferences.cpp:444 +#: src/slic3r/GUI/Preferences.cpp:558 msgid "Use custom size for toolbar icons" msgstr "对工具栏图标使用自定义大小" -#: src/slic3r/GUI/Preferences.cpp:446 +#: src/slic3r/GUI/Preferences.cpp:559 msgid "If enabled, you can change size of toolbar icons manually." msgstr "如果启用,您可以手动更改工具栏图标的大小。" -#: src/slic3r/GUI/Preferences.cpp:471 +#: src/slic3r/GUI/Preferences.cpp:577 src/slic3r/GUI/Tab.cpp:1659 +msgid "Other" +msgstr "其他" + +#: src/slic3r/GUI/Preferences.cpp:594 +msgid "If enabled, PrusaSlicer will not open a hyperlinks in your browser." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:600 +msgid "Allow downloads from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:601 +msgid "If enabled, PrusaSlicer will be allowed to download from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:610 msgid "Render" msgstr "提供" -#: src/slic3r/GUI/Preferences.cpp:476 +#: src/slic3r/GUI/Preferences.cpp:620 msgid "Use environment map" msgstr "使用环境地图" -#: src/slic3r/GUI/Preferences.cpp:478 +#: src/slic3r/GUI/Preferences.cpp:621 msgid "If enabled, renders object using the environment map." msgstr "如果启用,则使用环境贴图渲染对象。" -#: src/slic3r/GUI/Preferences.cpp:491 +#: src/slic3r/GUI/Preferences.cpp:629 msgid "Dark mode (experimental)" msgstr "黑暗模式(实验)" -#: src/slic3r/GUI/Preferences.cpp:496 +#: src/slic3r/GUI/Preferences.cpp:639 msgid "Enable dark mode" msgstr "启用黑暗模式" -#: src/slic3r/GUI/Preferences.cpp:498 +#: src/slic3r/GUI/Preferences.cpp:640 msgid "" "If enabled, UI will use Dark mode colors. If disabled, old UI will be used." msgstr "如果启用,UI 将使用黑暗模式颜色。如果禁用,将使用旧用户界面。" -#: src/slic3r/GUI/Preferences.cpp:507 +#: src/slic3r/GUI/Preferences.cpp:647 msgid "Use system menu for application" msgstr "应用程序使用系统菜单" -#: src/slic3r/GUI/Preferences.cpp:509 +#: src/slic3r/GUI/Preferences.cpp:648 msgid "" "If enabled, application will use the standard Windows system menu,\n" -"but on some combination of display scales it can looks ugly. If disabled, " -"old UI will be used." +"but on some combination od display scales it can look ugly. If disabled, old " +"UI will be used." msgstr "" -"如果启用,应用程序将使用标准 Windows 系统菜单,\n" -"但在某些显示比例组合上,它可能看起来很难看。如果禁用,将使用旧用户界面。" -#: src/slic3r/GUI/Preferences.cpp:578 +#: src/slic3r/GUI/Preferences.cpp:726 msgid "Changes for the critical options" msgstr "关键选项的更改" -#: src/slic3r/GUI/Preferences.cpp:580 +#: src/slic3r/GUI/Preferences.cpp:728 msgid "" "Changing some options will trigger application restart.\n" "You will lose the content of the plater." @@ -7651,107 +9126,120 @@ msgstr "" "更改某些选项将触发应用程序重启。\n" "你会失去盘子里的东西。" -#: src/slic3r/GUI/Preferences.cpp:694 +#: src/slic3r/GUI/Preferences.cpp:921 msgid "Icon size in a respect to the default size" msgstr "相对于默认大小的图标大小" -#: src/slic3r/GUI/Preferences.cpp:709 +#: src/slic3r/GUI/Preferences.cpp:936 msgid "Select toolbar icon size in respect to the default one." msgstr "选择与默认工具栏图标大小有关的大小。" -#: src/slic3r/GUI/Preferences.cpp:743 src/slic3r/GUI/Preferences.cpp:754 +#: src/slic3r/GUI/Preferences.cpp:972 +msgid "Layout Options" +msgstr "布局选项" + +#: src/slic3r/GUI/Preferences.cpp:981 msgid "Old regular layout with the tab bar" msgstr "带有选项卡栏的旧常规布局" -#: src/slic3r/GUI/Preferences.cpp:744 +#: src/slic3r/GUI/Preferences.cpp:982 msgid "New layout, access via settings button in the top menu" msgstr "新布局,通过顶部菜单中的设置按钮访问" -#: src/slic3r/GUI/Preferences.cpp:745 src/slic3r/GUI/Preferences.cpp:755 +#: src/slic3r/GUI/Preferences.cpp:983 msgid "Settings in non-modal window" msgstr "非模态窗口中的设置" -#: src/slic3r/GUI/Preferences.cpp:763 -msgid "Layout Options" -msgstr "布局选项" - -#: src/slic3r/GUI/Preferences.cpp:806 +#: src/slic3r/GUI/Preferences.cpp:1025 msgid "Text colors" msgstr "文本颜色" -#: src/slic3r/GUI/PresetComboBoxes.cpp:249 -#: src/slic3r/GUI/PresetComboBoxes.cpp:287 -#: src/slic3r/GUI/PresetComboBoxes.cpp:794 -#: src/slic3r/GUI/PresetComboBoxes.cpp:849 -#: src/slic3r/GUI/PresetComboBoxes.cpp:989 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1033 +#: src/slic3r/GUI/Preferences.cpp:1049 +msgid "Mode markers" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:254 +#: src/slic3r/GUI/PresetComboBoxes.cpp:306 +#: src/slic3r/GUI/PresetComboBoxes.cpp:846 +#: src/slic3r/GUI/PresetComboBoxes.cpp:909 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1073 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1125 msgid "System presets" msgstr "系统预设" -#: src/slic3r/GUI/PresetComboBoxes.cpp:291 -#: src/slic3r/GUI/PresetComboBoxes.cpp:853 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1037 +#: src/slic3r/GUI/PresetComboBoxes.cpp:310 +#: src/slic3r/GUI/PresetComboBoxes.cpp:915 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1130 msgid "User presets" msgstr "用户预设" -#: src/slic3r/GUI/PresetComboBoxes.cpp:302 +#: src/slic3r/GUI/PresetComboBoxes.cpp:321 msgid "Incompatible presets" msgstr "不兼容的预设" -#: src/slic3r/GUI/PresetComboBoxes.cpp:337 +#: src/slic3r/GUI/PresetComboBoxes.cpp:364 #, boost-format msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "确实要删除 \"%1%\" 打印机吗?" -#: src/slic3r/GUI/PresetComboBoxes.cpp:340 +#: src/slic3r/GUI/PresetComboBoxes.cpp:366 msgid "Delete Physical Printer" msgstr "删除物理打印机" -#: src/slic3r/GUI/PresetComboBoxes.cpp:581 +#: src/slic3r/GUI/PresetComboBoxes.cpp:612 msgid "Click to edit preset" msgstr "单击以编辑预设" -#: src/slic3r/GUI/PresetComboBoxes.cpp:697 -#: src/slic3r/GUI/PresetComboBoxes.cpp:737 +#: src/slic3r/GUI/PresetComboBoxes.cpp:740 +#: src/slic3r/GUI/PresetComboBoxes.cpp:788 msgid "Add/Remove presets" msgstr "添加/删除预设" -#: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:745 +#: src/slic3r/GUI/PresetComboBoxes.cpp:793 src/slic3r/GUI/Tab.cpp:3312 msgid "Add physical printer" msgstr "添加物理打印机" -#: src/slic3r/GUI/PresetComboBoxes.cpp:716 +#: src/slic3r/GUI/PresetComboBoxes.cpp:759 msgid "Edit preset" msgstr "编辑预设" -#: src/slic3r/GUI/PresetComboBoxes.cpp:722 +#: src/slic3r/GUI/PresetComboBoxes.cpp:765 msgid "Change extruder color" msgstr "更改挤出机颜色" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:773 src/slic3r/GUI/Tab.cpp:3312 msgid "Edit physical printer" msgstr "编辑物理打印机" -#: src/slic3r/GUI/PresetComboBoxes.cpp:733 +#: src/slic3r/GUI/PresetComboBoxes.cpp:779 +msgid "Open physical printer URL" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:784 msgid "Delete physical printer" msgstr "删除物理打印机" -#: src/slic3r/GUI/PresetComboBoxes.cpp:864 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1051 +#: src/slic3r/GUI/PresetComboBoxes.cpp:924 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1142 +msgid "Template presets" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:935 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1156 msgid "Physical printers" msgstr "物理打印机" -#: src/slic3r/GUI/PresetComboBoxes.cpp:888 +#: src/slic3r/GUI/PresetComboBoxes.cpp:959 msgid "Add/Remove filaments" msgstr "添加/移除耗材" -#: src/slic3r/GUI/PresetComboBoxes.cpp:890 +#: src/slic3r/GUI/PresetComboBoxes.cpp:961 msgid "Add/Remove materials" msgstr "添加/删除材料" -#: src/slic3r/GUI/PresetComboBoxes.cpp:892 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1075 +#: src/slic3r/GUI/PresetComboBoxes.cpp:963 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1180 msgid "Add/Remove printers" msgstr "添加/删除打印机" @@ -7929,98 +9417,106 @@ msgstr "最小底壳厚度为 %1%mm。" msgid "Bottom is open." msgstr "底部是敞开的。" -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Send G-Code to printer host" msgstr "向打印机主机发送 G-Code" -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Upload to Printer Host with the following filename:" msgstr "使用以下文件名上传到打印机主机:" -#: src/slic3r/GUI/PrintHostDialogs.cpp:51 +#: src/slic3r/GUI/PrintHostDialogs.cpp:55 msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "如果需要,请使用正向斜杠 ( / ) 作为目录分隔符。" -#: src/slic3r/GUI/PrintHostDialogs.cpp:60 +#: src/slic3r/GUI/PrintHostDialogs.cpp:64 msgid "Group" msgstr "组" -#: src/slic3r/GUI/PrintHostDialogs.cpp:84 +#: src/slic3r/GUI/PrintHostDialogs.cpp:74 +msgid "Upload to storage:" +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:83 +msgid "Upload to storage: " +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:105 #, c-format, boost-format msgid "Upload filename doesn't end with \"%s\". Do you wish to continue?" msgstr "上传文件名不以 \"%s\" 结尾。你想继续吗?" -#: src/slic3r/GUI/PrintHostDialogs.cpp:91 +#: src/slic3r/GUI/PrintHostDialogs.cpp:112 msgid "Upload" msgstr "上载" -#: src/slic3r/GUI/PrintHostDialogs.cpp:101 -msgid "Upload and Print" -msgstr "上传和打印" +#: src/slic3r/GUI/PrintHostDialogs.cpp:122 +msgid "Upload to Queue" +msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:112 +#: src/slic3r/GUI/PrintHostDialogs.cpp:143 msgid "Upload and Simulate" msgstr "上传并模拟" -#: src/slic3r/GUI/PrintHostDialogs.cpp:247 +#: src/slic3r/GUI/PrintHostDialogs.cpp:298 msgid "ID" msgstr "ID" -#: src/slic3r/GUI/PrintHostDialogs.cpp:248 +#: src/slic3r/GUI/PrintHostDialogs.cpp:299 msgid "Progress" msgstr "进度" -#: src/slic3r/GUI/PrintHostDialogs.cpp:249 +#: src/slic3r/GUI/PrintHostDialogs.cpp:300 msgid "Status" msgstr "状态" -#: src/slic3r/GUI/PrintHostDialogs.cpp:250 +#: src/slic3r/GUI/PrintHostDialogs.cpp:301 msgid "Host" msgstr "主机" -#: src/slic3r/GUI/PrintHostDialogs.cpp:251 +#: src/slic3r/GUI/PrintHostDialogs.cpp:302 msgctxt "OfFile" msgid "Size" msgstr "大小" -#: src/slic3r/GUI/PrintHostDialogs.cpp:252 +#: src/slic3r/GUI/PrintHostDialogs.cpp:303 msgid "Filename" msgstr "文件名" -#: src/slic3r/GUI/PrintHostDialogs.cpp:253 -msgid "Error Message" -msgstr "错误信息" +#: src/slic3r/GUI/PrintHostDialogs.cpp:304 +msgid "Message" +msgstr "消息" -#: src/slic3r/GUI/PrintHostDialogs.cpp:256 +#: src/slic3r/GUI/PrintHostDialogs.cpp:308 msgid "Cancel selected" msgstr "取消选定" -#: src/slic3r/GUI/PrintHostDialogs.cpp:258 +#: src/slic3r/GUI/PrintHostDialogs.cpp:310 msgid "Show error message" msgstr "显示错误消息" -#: src/slic3r/GUI/PrintHostDialogs.cpp:316 -#: src/slic3r/GUI/PrintHostDialogs.cpp:371 +#: src/slic3r/GUI/PrintHostDialogs.cpp:368 +#: src/slic3r/GUI/PrintHostDialogs.cpp:423 msgid "Enqueued" msgstr "加入队列" -#: src/slic3r/GUI/PrintHostDialogs.cpp:372 +#: src/slic3r/GUI/PrintHostDialogs.cpp:424 msgid "Uploading" msgstr "上传中" -#: src/slic3r/GUI/PrintHostDialogs.cpp:374 +#: src/slic3r/GUI/PrintHostDialogs.cpp:426 msgid "Cancelling" msgstr "取消中" -#: src/slic3r/GUI/PrintHostDialogs.cpp:375 +#: src/slic3r/GUI/PrintHostDialogs.cpp:427 msgid "Cancelled" msgstr "已取消" -#: src/slic3r/GUI/PrintHostDialogs.cpp:376 +#: src/slic3r/GUI/PrintHostDialogs.cpp:428 msgid "Completed" msgstr "已完成" -#: src/slic3r/GUI/PrintHostDialogs.cpp:424 +#: src/slic3r/GUI/PrintHostDialogs.cpp:476 msgid "Error uploading to print host:" msgstr "上传到打印主机时出错:" @@ -8028,13 +9524,13 @@ msgstr "上传到打印主机时出错:" msgid "NO RAMMING AT ALL" msgstr "完全不存在" -#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 -#: src/libslic3r/PrintConfig.cpp:955 src/libslic3r/PrintConfig.cpp:999 -#: src/libslic3r/PrintConfig.cpp:1014 src/libslic3r/PrintConfig.cpp:3297 -#: src/libslic3r/PrintConfig.cpp:3306 src/libslic3r/PrintConfig.cpp:3315 -#: src/libslic3r/PrintConfig.cpp:3456 src/libslic3r/PrintConfig.cpp:3464 -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3479 -#: src/libslic3r/PrintConfig.cpp:3487 src/libslic3r/PrintConfig.cpp:3495 +#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/libslic3r/PrintConfig.cpp:1044 src/libslic3r/PrintConfig.cpp:1088 +#: src/libslic3r/PrintConfig.cpp:1103 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3578 src/libslic3r/PrintConfig.cpp:3587 +#: src/libslic3r/PrintConfig.cpp:3733 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3749 src/libslic3r/PrintConfig.cpp:3756 +#: src/libslic3r/PrintConfig.cpp:3764 src/libslic3r/PrintConfig.cpp:3772 msgid "s" msgstr "s" @@ -8042,80 +9538,116 @@ msgstr "s" msgid "Volumetric speed" msgstr "流量速度" -#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:912 -#: src/libslic3r/PrintConfig.cpp:1824 +#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:1001 +#: src/libslic3r/PrintConfig.cpp:1861 msgid "mm³/s" msgstr "mm³/s" -#: src/slic3r/GUI/SavePresetDialog.cpp:57 +#: src/slic3r/GUI/SavePresetDialog.cpp:90 +#, c-format, boost-format +msgid "Rename %s to:" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:90 #, c-format, boost-format msgid "Save %s as:" msgstr "将 %s 另存为:" -#: src/slic3r/GUI/SavePresetDialog.cpp:101 -#: src/slic3r/GUI/SavePresetDialog.cpp:109 +#: src/slic3r/GUI/SavePresetDialog.cpp:165 +#: src/slic3r/GUI/SavePresetDialog.cpp:173 msgid "The supplied name is not valid;" msgstr "提供的名称无效;" -#: src/slic3r/GUI/SavePresetDialog.cpp:110 +#: src/slic3r/GUI/SavePresetDialog.cpp:174 msgid "the following suffix is not allowed:" msgstr "不允许使用以下后缀:" -#: src/slic3r/GUI/SavePresetDialog.cpp:116 +#: src/slic3r/GUI/SavePresetDialog.cpp:180 msgid "The supplied name is not available." msgstr "提供的名称不可用。" -#: src/slic3r/GUI/SavePresetDialog.cpp:122 +#: src/slic3r/GUI/SavePresetDialog.cpp:186 +msgid "The supplied name is used for a system profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:187 msgid "Cannot overwrite a system profile." msgstr "无法覆盖系统配置文件。" -#: src/slic3r/GUI/SavePresetDialog.cpp:127 +#: src/slic3r/GUI/SavePresetDialog.cpp:192 +msgid "The supplied name is used for a external profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:193 msgid "Cannot overwrite an external profile." msgstr "无法覆盖外部配置文件。" -#: src/slic3r/GUI/SavePresetDialog.cpp:134 +#: src/slic3r/GUI/SavePresetDialog.cpp:203 +msgid "Save preset modifications to existing user profile" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:205 +msgid "Nothing changed" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:210 #, boost-format msgid "Preset with name \"%1%\" already exists." msgstr "名为 \"%1%\" 的预设已存在。" -#: src/slic3r/GUI/SavePresetDialog.cpp:136 +#: src/slic3r/GUI/SavePresetDialog.cpp:212 #, boost-format msgid "" "Preset with name \"%1%\" already exists and is incompatible with selected " "printer." msgstr "名为 \"%1%\" 的预设已存在,且与所选打印机不兼容。" -#: src/slic3r/GUI/SavePresetDialog.cpp:137 +#: src/slic3r/GUI/SavePresetDialog.cpp:213 msgid "Note: This preset will be replaced after saving" msgstr "注意:保存后将替换此预设" -#: src/slic3r/GUI/SavePresetDialog.cpp:142 +#: src/slic3r/GUI/SavePresetDialog.cpp:219 msgid "The name cannot be empty." msgstr "名称不能为空。" -#: src/slic3r/GUI/SavePresetDialog.cpp:147 +#: src/slic3r/GUI/SavePresetDialog.cpp:230 +msgid "The name is too long." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:235 msgid "The name cannot start with space character." msgstr "名称不能以空格字符开头。" -#: src/slic3r/GUI/SavePresetDialog.cpp:152 +#: src/slic3r/GUI/SavePresetDialog.cpp:240 msgid "The name cannot end with space character." msgstr "名称不能以空格结尾。" -#: src/slic3r/GUI/SavePresetDialog.cpp:157 +#: src/slic3r/GUI/SavePresetDialog.cpp:245 msgid "The name cannot be the same as a preset alias name." msgstr "该名称不能与预设别名相同。" -#: src/slic3r/GUI/SavePresetDialog.cpp:191 -#: src/slic3r/GUI/SavePresetDialog.cpp:197 +#: src/slic3r/GUI/SavePresetDialog.cpp:289 msgid "Save preset" msgstr "保存预设" -#: src/slic3r/GUI/SavePresetDialog.cpp:221 +#: src/slic3r/GUI/SavePresetDialog.cpp:295 +msgid "Save presets" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:302 +msgid "Rename preset" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:327 msgctxt "PresetName" msgid "Copy" msgstr "复制" -#: src/slic3r/GUI/SavePresetDialog.cpp:283 +#: src/slic3r/GUI/SavePresetDialog.cpp:347 +msgid "Save as profile derived from current printer only." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:407 #, boost-format msgid "" "You have selected physical printer \"%1%\" \n" @@ -8124,82 +9656,94 @@ msgstr "" "您已经选择了物理打印机 \"%1%\" \n" "以及相关的打印机预设 \"%2%\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:322 +#: src/slic3r/GUI/SavePresetDialog.cpp:446 #, boost-format msgid "What would you like to do with \"%1%\" preset after saving?" msgstr "保存后,您想对 \"%1%\" 预设做什么?" -#: src/slic3r/GUI/SavePresetDialog.cpp:325 +#: src/slic3r/GUI/SavePresetDialog.cpp:449 #, boost-format msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" msgstr "将此物理打印机 \"%3%\" 的 \"%1%\" 更改为 \"%2%\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:326 +#: src/slic3r/GUI/SavePresetDialog.cpp:450 #, boost-format msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" msgstr "添加 \"%1%\" 作为物理打印机 \"%2%\" 的下一个预设值" -#: src/slic3r/GUI/SavePresetDialog.cpp:327 +#: src/slic3r/GUI/SavePresetDialog.cpp:451 #, boost-format msgid "Just switch to \"%1%\" preset" msgstr "只需切换到 \"%1%\" 预设" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2652 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2645 msgid "Stealth" msgstr "隐形" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2646 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2639 msgid "Normal" msgstr "正常" -#: src/slic3r/GUI/Selection.cpp:168 +#: src/slic3r/GUI/Selection.cpp:180 msgid "Selection-Add" msgstr "选择-添加" -#: src/slic3r/GUI/Selection.cpp:209 +#: src/slic3r/GUI/Selection.cpp:221 msgid "Selection-Remove" msgstr "选择-删除" -#: src/slic3r/GUI/Selection.cpp:241 +#: src/slic3r/GUI/Selection.cpp:253 msgid "Selection-Add Object" msgstr "选择-添加对象" -#: src/slic3r/GUI/Selection.cpp:260 +#: src/slic3r/GUI/Selection.cpp:272 msgid "Selection-Remove Object" msgstr "选择-删除对象" -#: src/slic3r/GUI/Selection.cpp:278 +#: src/slic3r/GUI/Selection.cpp:290 msgid "Selection-Add Instance" msgstr "选择-添加实例" -#: src/slic3r/GUI/Selection.cpp:297 +#: src/slic3r/GUI/Selection.cpp:309 msgid "Selection-Remove Instance" msgstr "选择-删除实例" -#: src/slic3r/GUI/Selection.cpp:394 +#: src/slic3r/GUI/Selection.cpp:406 msgid "Selection-Add All" msgstr "全部选择添加" -#: src/slic3r/GUI/Selection.cpp:419 +#: src/slic3r/GUI/Selection.cpp:431 msgid "Selection-Remove All" msgstr "选择 - 全部删除" -#: src/slic3r/GUI/Selection.cpp:950 +#: src/slic3r/GUI/Selection.cpp:1309 msgid "Scale To Fit" msgstr "缩放至合适" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:114 +#: src/slic3r/GUI/Selection.cpp:1691 +msgid "" +"The currently manipulated object is tilted or contains tilted parts " +"(rotation angles are not multiples of 90°). Non-uniform scaling of tilted " +"objects is only possible in non-local coordinate systems, once the rotation " +"is embedded into the object coordinates." +msgstr "" + +#: src/slic3r/GUI/Selection.cpp:1694 +msgid "This operation is irreversible." +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:117 msgid "Data to send" msgstr "要发送的数据" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:550 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:618 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:557 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:624 msgid "Send system info" msgstr "发送系统信息" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:581 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:587 #, boost-format msgid "" "This is the first time you are running %1%. We would like to ask you to send " @@ -8210,7 +9754,7 @@ msgstr "" "这是您第一次运行 %1%。我们希望您将一些系统信息发送给我们。这只会发生一次,我" "们不会要求您再次这样做(只有在您升级到下一个版本后)。" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:585 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:591 msgid "" "If we know your hardware, operating system, etc., it will greatly help us in " "development and prioritization, because we will be able to focus our effort " @@ -8219,11 +9763,11 @@ msgstr "" "如果我们了解您的硬件、操作系统等,这将极大地帮助我们进行开发和确定优先级,因" "为我们将能够更高效地集中精力,并将时间花在最需要的功能上。" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:588 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:594 msgid "Is it safe?" msgstr "安全吗?" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:590 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:596 #, boost-format msgid "" "We do not send any personal information nor anything that would allow us to " @@ -8238,81 +9782,86 @@ msgstr "" "关操作系统、硬件和 OpenGL 安装的一般数据。PrusaSlicer 是开源的,如果您想检查" "实际执行通信的代码,请参阅 %1%。" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:614 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:620 msgid "Show verbatim data that will be sent" msgstr "显示将要发送的逐字记录数据" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:616 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:622 msgid "Ask me next time" msgstr "下次再问我" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:617 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:623 msgid "Do not send anything" msgstr "不要发送任何东西" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:703 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:709 msgid "System info sent successfully. Thank you." msgstr "系统信息已成功发送。非常感谢。" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:706 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:712 msgid "Sending system info failed!" msgstr "发送系统信息失败!" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:713 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:719 msgid "Sending system info was cancelled." msgstr "发送系统信息被取消。" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:720 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:726 msgid "Sending system info..." msgstr "正在发送系统信息..." -#: src/slic3r/GUI/SysInfoDialog.cpp:84 +#: src/slic3r/GUI/SysInfoDialog.cpp:92 msgid "System Information" msgstr "系统信息" -#: src/slic3r/GUI/SysInfoDialog.cpp:150 +#: src/slic3r/GUI/SysInfoDialog.cpp:160 msgid "Blacklisted libraries loaded into PrusaSlicer process:" msgstr "加载到 PrusaSlicer 进程的黑名单库:" -#: src/slic3r/GUI/SysInfoDialog.cpp:162 +#: src/slic3r/GUI/SysInfoDialog.cpp:172 msgid "Eigen vectorization supported:" msgstr "支持特征向量化:" -#: src/slic3r/GUI/SysInfoDialog.cpp:169 +#: src/slic3r/GUI/SysInfoDialog.cpp:179 msgid "Copy to Clipboard" msgstr "复制到剪贴板" -#: src/slic3r/GUI/Tab.cpp:114 src/libslic3r/PrintConfig.cpp:565 +#: src/slic3r/GUI/Tab.cpp:68 src/libslic3r/PrintConfig.cpp:668 msgid "Compatible printers" msgstr "兼容打印机" -#: src/slic3r/GUI/Tab.cpp:115 +#: src/slic3r/GUI/Tab.cpp:69 msgid "Select the printers this profile is compatible with." msgstr "选择与此配置文件兼容的打印机。" -#: src/slic3r/GUI/Tab.cpp:120 src/libslic3r/PrintConfig.cpp:580 +#: src/slic3r/GUI/Tab.cpp:74 src/libslic3r/PrintConfig.cpp:683 msgid "Compatible print profiles" msgstr "兼容的打印配置文件" -#: src/slic3r/GUI/Tab.cpp:121 +#: src/slic3r/GUI/Tab.cpp:75 msgid "Select the print profiles this profile is compatible with." msgstr "选择与此配置文件兼容的打印配置文件。" -#: src/slic3r/GUI/Tab.cpp:216 +#: src/slic3r/GUI/Tab.cpp:165 msgid "Compare this preset with some another" msgstr "将此预设与其他预设进行比较" #. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:218 +#: src/slic3r/GUI/Tab.cpp:167 #, c-format, boost-format msgid "Save current %s" msgstr "保存当前 %s" -#: src/slic3r/GUI/Tab.cpp:219 +#: src/slic3r/GUI/Tab.cpp:168 +#, c-format, boost-format +msgid "Rename current %s" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:170 msgid "Delete this preset" msgstr "删除该预设" -#: src/slic3r/GUI/Tab.cpp:223 +#: src/slic3r/GUI/Tab.cpp:174 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." @@ -8320,237 +9869,245 @@ msgstr "" "将光标悬停在按钮上以查找详细信息 \n" "或单击此按钮。" -#: src/slic3r/GUI/Tab.cpp:227 +#: src/slic3r/GUI/Tab.cpp:178 #, boost-format msgid "Search in settings [%1%]" msgstr "在设置 [%1%] 中搜索" -#: src/slic3r/GUI/Tab.cpp:1298 +#: src/slic3r/GUI/Tab.cpp:1243 msgid "Detach from system preset" msgstr "从系统预设中分离" -#: src/slic3r/GUI/Tab.cpp:1311 +#: src/slic3r/GUI/Tab.cpp:1256 msgid "" "A copy of the current system preset will be created, which will be detached " "from the system preset." msgstr "将创建当前系统预设的副本,该副本将与系统预设分离。" -#: src/slic3r/GUI/Tab.cpp:1312 +#: src/slic3r/GUI/Tab.cpp:1257 msgid "" "The current custom preset will be detached from the parent system preset." msgstr "当前自定义预设将与父系统预设分离。" -#: src/slic3r/GUI/Tab.cpp:1315 +#: src/slic3r/GUI/Tab.cpp:1260 msgid "Modifications to the current profile will be saved." msgstr "将保存对当前配置文件的修改。" -#: src/slic3r/GUI/Tab.cpp:1321 +#: src/slic3r/GUI/Tab.cpp:1266 msgid "Detach preset" msgstr "分离预设" -#: src/slic3r/GUI/Tab.cpp:1347 +#: src/slic3r/GUI/Tab.cpp:1292 msgid "This is a default preset." msgstr "这是默认预设。" -#: src/slic3r/GUI/Tab.cpp:1349 +#: src/slic3r/GUI/Tab.cpp:1294 msgid "This is a system preset." msgstr "这是一个系统预设。" -#: src/slic3r/GUI/Tab.cpp:1351 +#: src/slic3r/GUI/Tab.cpp:1296 msgid "Current preset is inherited from the default preset." msgstr "当前预设从默认预设继承。" -#: src/slic3r/GUI/Tab.cpp:1355 +#: src/slic3r/GUI/Tab.cpp:1300 msgid "Current preset is inherited from" msgstr "当前预设继承自" -#: src/slic3r/GUI/Tab.cpp:1359 +#: src/slic3r/GUI/Tab.cpp:1304 msgid "It can't be deleted or modified." msgstr "无法删除或修改它。" -#: src/slic3r/GUI/Tab.cpp:1360 +#: src/slic3r/GUI/Tab.cpp:1305 msgid "" "Any modifications should be saved as a new preset inherited from this one." msgstr "任何修改都应保存为从此修改继承的新预设。" -#: src/slic3r/GUI/Tab.cpp:1361 +#: src/slic3r/GUI/Tab.cpp:1306 msgid "To do that please specify a new name for the preset." msgstr "为此,请为预设指定新名称。" -#: src/slic3r/GUI/Tab.cpp:1365 +#: src/slic3r/GUI/Tab.cpp:1310 msgid "Additional information:" msgstr "附加信息:" -#: src/slic3r/GUI/Tab.cpp:1371 +#: src/slic3r/GUI/Tab.cpp:1316 msgid "printer model" msgstr "打印机型号" -#: src/slic3r/GUI/Tab.cpp:1379 +#: src/slic3r/GUI/Tab.cpp:1324 msgid "default print profile" msgstr "默认打印配置文件" -#: src/slic3r/GUI/Tab.cpp:1382 +#: src/slic3r/GUI/Tab.cpp:1327 msgid "default filament profile" msgstr "默认耗材配置" -#: src/slic3r/GUI/Tab.cpp:1396 +#: src/slic3r/GUI/Tab.cpp:1341 msgid "default SLA material profile" msgstr "默认 SLA 材料配置文件" -#: src/slic3r/GUI/Tab.cpp:1400 +#: src/slic3r/GUI/Tab.cpp:1345 msgid "default SLA print profile" msgstr "默认 SLA 打印配置文件" -#: src/slic3r/GUI/Tab.cpp:1408 +#: src/slic3r/GUI/Tab.cpp:1353 msgid "full profile name" msgstr "完整配置文件名" -#: src/slic3r/GUI/Tab.cpp:1409 +#: src/slic3r/GUI/Tab.cpp:1354 msgid "symbolic profile name" msgstr "符号配置文件名" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4657 +#: src/slic3r/GUI/Tab.cpp:1392 src/slic3r/GUI/Tab.cpp:4940 msgid "Layers and perimeters" msgstr "层和轮廓" -#: src/slic3r/GUI/Tab.cpp:1453 +#: src/slic3r/GUI/Tab.cpp:1398 msgid "Vertical shells" msgstr "垂直外壳" -#: src/slic3r/GUI/Tab.cpp:1465 +#: src/slic3r/GUI/Tab.cpp:1410 msgid "Horizontal shells" msgstr "水平外壳" -#: src/slic3r/GUI/Tab.cpp:1466 src/libslic3r/PrintConfig.cpp:2417 +#: src/slic3r/GUI/Tab.cpp:1411 src/libslic3r/PrintConfig.cpp:2448 msgid "Solid layers" msgstr "实心层" -#: src/slic3r/GUI/Tab.cpp:1471 +#: src/slic3r/GUI/Tab.cpp:1416 msgid "Minimum shell thickness" msgstr "最小壳体厚度" -#: src/slic3r/GUI/Tab.cpp:1482 +#: src/slic3r/GUI/Tab.cpp:1427 msgid "Quality (slower slicing)" msgstr "质量(较慢的切片)" -#: src/slic3r/GUI/Tab.cpp:1497 +#: src/slic3r/GUI/Tab.cpp:1444 msgid "Fuzzy skin (experimental)" msgstr "模糊皮肤(实验)" -#: src/slic3r/GUI/Tab.cpp:1520 +#: src/slic3r/GUI/Tab.cpp:1467 msgid "Reducing printing time" msgstr "缩短打印时间" -#: src/slic3r/GUI/Tab.cpp:1535 src/libslic3r/ExtrusionEntity.cpp:370 +#: src/slic3r/GUI/Tab.cpp:1482 msgid "Skirt" msgstr "环绕" -#: src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1504 msgid "Raft" msgstr "基座" -#: src/slic3r/GUI/Tab.cpp:1562 +#: src/slic3r/GUI/Tab.cpp:1509 msgid "Options for support material and raft" msgstr "支撑材料和基座的选项" -#: src/slic3r/GUI/Tab.cpp:1582 +#: src/slic3r/GUI/Tab.cpp:1528 +msgid "Organic supports" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1537 msgid "Speed for print moves" msgstr "打印移动速度" -#: src/slic3r/GUI/Tab.cpp:1595 +#: src/slic3r/GUI/Tab.cpp:1550 +msgid "Dynamic overhang speed" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1557 msgid "Speed for non-print moves" msgstr "非打印移动的速度" -#: src/slic3r/GUI/Tab.cpp:1599 +#: src/slic3r/GUI/Tab.cpp:1561 msgid "Modifiers" msgstr "修改器" -#: src/slic3r/GUI/Tab.cpp:1603 +#: src/slic3r/GUI/Tab.cpp:1565 msgid "Acceleration control (advanced)" msgstr "加速控制 (高级)" -#: src/slic3r/GUI/Tab.cpp:1614 +#: src/slic3r/GUI/Tab.cpp:1576 msgid "Autospeed (advanced)" msgstr "自动调速 (高级)" -#: src/slic3r/GUI/Tab.cpp:1618 +#: src/slic3r/GUI/Tab.cpp:1580 msgid "Pressure equalizer (experimental)" msgstr "压力均衡器(实验)" -#: src/slic3r/GUI/Tab.cpp:1622 +#: src/slic3r/GUI/Tab.cpp:1584 msgid "Multiple Extruders" msgstr "多个挤出机" -#: src/slic3r/GUI/Tab.cpp:1630 +#: src/slic3r/GUI/Tab.cpp:1592 msgid "Ooze prevention" msgstr "Ooze 预防" -#: src/slic3r/GUI/Tab.cpp:1650 +#: src/slic3r/GUI/Tab.cpp:1596 +msgid "Wipe tower" +msgstr "擦料塔" + +#: src/slic3r/GUI/Tab.cpp:1612 msgid "Extrusion width" msgstr "挤出宽度" -#: src/slic3r/GUI/Tab.cpp:1660 +#: src/slic3r/GUI/Tab.cpp:1622 msgid "Overlap" msgstr "交叠" -#: src/slic3r/GUI/Tab.cpp:1663 +#: src/slic3r/GUI/Tab.cpp:1625 msgid "Flow" msgstr "流量" -#: src/slic3r/GUI/Tab.cpp:1674 src/slic3r/GUI/Tab.cpp:1700 -msgid "Other" -msgstr "其他" - -#: src/slic3r/GUI/Tab.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:1636 msgid "Arachne perimeter generator" msgstr "Arachne 轮廓生成器" -#: src/slic3r/GUI/Tab.cpp:1685 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1644 src/slic3r/GUI/Tab.cpp:4990 msgid "Output options" msgstr "输出选项" -#: src/slic3r/GUI/Tab.cpp:1686 +#: src/slic3r/GUI/Tab.cpp:1645 msgid "Sequential printing" msgstr "顺序打印" -#: src/slic3r/GUI/Tab.cpp:1688 +#: src/slic3r/GUI/Tab.cpp:1647 msgid "Extruder clearance" msgstr "挤出机间隙" -#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:4735 +#: src/slic3r/GUI/Tab.cpp:1652 src/slic3r/GUI/Tab.cpp:4991 msgid "Output file" msgstr "输出文件" -#: src/slic3r/GUI/Tab.cpp:1712 src/libslic3r/PrintConfig.cpp:2042 +#: src/slic3r/GUI/Tab.cpp:1671 src/libslic3r/PrintConfig.cpp:2072 msgid "Post-processing scripts" msgstr "后处理脚本" -#: src/slic3r/GUI/Tab.cpp:1724 src/slic3r/GUI/Tab.cpp:1725 -#: src/slic3r/GUI/Tab.cpp:2110 src/slic3r/GUI/Tab.cpp:2111 -#: src/slic3r/GUI/Tab.cpp:2498 src/slic3r/GUI/Tab.cpp:2499 -#: src/slic3r/GUI/Tab.cpp:2571 src/slic3r/GUI/Tab.cpp:2572 -#: src/slic3r/GUI/Tab.cpp:3957 src/slic3r/GUI/Tab.cpp:4585 -#: src/slic3r/GUI/Tab.cpp:4586 +#: src/slic3r/GUI/Tab.cpp:1683 src/slic3r/GUI/Tab.cpp:1684 +#: src/slic3r/GUI/Tab.cpp:2080 src/slic3r/GUI/Tab.cpp:2081 +#: src/slic3r/GUI/Tab.cpp:2486 src/slic3r/GUI/Tab.cpp:2487 +#: src/slic3r/GUI/Tab.cpp:2564 src/slic3r/GUI/Tab.cpp:2565 +#: src/slic3r/GUI/Tab.cpp:4182 src/slic3r/GUI/Tab.cpp:4822 +#: src/slic3r/GUI/Tab.cpp:4823 msgid "Notes" msgstr "备注" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:2088 +#: src/slic3r/GUI/Tab.cpp:2493 src/slic3r/GUI/Tab.cpp:2571 +#: src/slic3r/GUI/Tab.cpp:4830 src/slic3r/GUI/Tab.cpp:4996 msgid "Dependencies" msgstr "依赖" -#: src/slic3r/GUI/Tab.cpp:1732 src/slic3r/GUI/Tab.cpp:2119 -#: src/slic3r/GUI/Tab.cpp:2506 src/slic3r/GUI/Tab.cpp:2579 -#: src/slic3r/GUI/Tab.cpp:4594 src/slic3r/GUI/Tab.cpp:4741 +#: src/slic3r/GUI/Tab.cpp:1691 src/slic3r/GUI/Tab.cpp:2089 +#: src/slic3r/GUI/Tab.cpp:2494 src/slic3r/GUI/Tab.cpp:2572 +#: src/slic3r/GUI/Tab.cpp:4831 src/slic3r/GUI/Tab.cpp:4997 msgid "Profile dependencies" msgstr "配置文件依赖" -#: src/slic3r/GUI/Tab.cpp:1771 +#: src/slic3r/GUI/Tab.cpp:1723 msgid "Post processing scripts shall modify G-code file in place." msgstr "后处理脚本应适当修改 G-Code 文件。" -#: src/slic3r/GUI/Tab.cpp:1850 +#: src/slic3r/GUI/Tab.cpp:1802 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8564,7 +10121,7 @@ msgstr[0] "" "下一行 %s 包含保留关键字。\n" "请删除它们,因为它们可能会导致 G-Code 可视化和打印时间估计出现问题。" -#: src/slic3r/GUI/Tab.cpp:1855 +#: src/slic3r/GUI/Tab.cpp:1807 msgid "Found reserved keywords in" msgstr "在中找到保留关键字" @@ -8572,74 +10129,90 @@ msgstr "在中找到保留关键字" msgid "Filament Overrides" msgstr "耗材参数替换" -#: src/slic3r/GUI/Tab.cpp:1992 +#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2827 +msgid "Retraction" +msgstr "回抽" + +#: src/slic3r/GUI/Tab.cpp:1951 +msgid "Temperature" +msgstr "温度" + +#: src/slic3r/GUI/Tab.cpp:1955 msgid "Nozzle" msgstr "喷嘴" -#: src/slic3r/GUI/Tab.cpp:1997 +#: src/slic3r/GUI/Tab.cpp:1960 msgid "Bed" msgstr "热床" -#: src/slic3r/GUI/Tab.cpp:2002 +#: src/slic3r/GUI/Tab.cpp:1965 msgid "Cooling" msgstr "冷却" -#: src/slic3r/GUI/Tab.cpp:2004 src/libslic3r/PrintConfig.cpp:1936 -#: src/libslic3r/PrintConfig.cpp:2994 +#: src/slic3r/GUI/Tab.cpp:1967 src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "Enable" msgstr "启用" -#: src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/Tab.cpp:1978 msgid "Fan settings" msgstr "风扇设置" -#: src/slic3r/GUI/Tab.cpp:2026 +#: src/slic3r/GUI/Tab.cpp:1979 +msgid "Fan speed" +msgstr "风扇速度" + +#: src/slic3r/GUI/Tab.cpp:1989 +msgid "Dynamic fan speeds" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1996 msgid "Cooling thresholds" msgstr "冷却阈值" -#: src/slic3r/GUI/Tab.cpp:2032 +#: src/slic3r/GUI/Tab.cpp:2002 msgid "Filament properties" msgstr "耗材特性" -#: src/slic3r/GUI/Tab.cpp:2039 +#: src/slic3r/GUI/Tab.cpp:2009 msgid "Print speed override" msgstr "打印速度覆盖" -#: src/slic3r/GUI/Tab.cpp:2049 +#: src/slic3r/GUI/Tab.cpp:2019 msgid "Wipe tower parameters" msgstr "擦料塔参数" -#: src/slic3r/GUI/Tab.cpp:2052 +#: src/slic3r/GUI/Tab.cpp:2022 msgid "Toolchange parameters with single extruder MM printers" msgstr "单挤出机 多色 打印机的工具更换参数" -#: src/slic3r/GUI/Tab.cpp:2065 +#: src/slic3r/GUI/Tab.cpp:2035 msgid "Ramming settings" msgstr "冲击设置" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 -#: src/slic3r/GUI/Tab.cpp:4264 src/libslic3r/GCode.cpp:733 -#: src/libslic3r/PrintConfig.cpp:2500 +#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:2398 +#: src/slic3r/GUI/Tab.cpp:4493 src/libslic3r/GCode.cpp:684 +#: src/libslic3r/PrintConfig.cpp:2532 msgid "Custom G-code" msgstr "自定义 G-Code" -#: src/slic3r/GUI/Tab.cpp:2090 src/slic3r/GUI/Tab.cpp:2411 -#: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2450 -#: src/libslic3r/PrintConfig.cpp:2465 +#: src/slic3r/GUI/Tab.cpp:2060 src/slic3r/GUI/Tab.cpp:2399 +#: src/libslic3r/GCode.cpp:658 src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2497 msgid "Start G-code" msgstr "起始 G-Code" -#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:2421 -#: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:685 -#: src/libslic3r/PrintConfig.cpp:695 +#: src/slic3r/GUI/Tab.cpp:2070 src/slic3r/GUI/Tab.cpp:2409 +#: src/libslic3r/GCode.cpp:659 src/libslic3r/PrintConfig.cpp:788 +#: src/libslic3r/PrintConfig.cpp:798 msgid "End G-code" msgstr "结尾 G-Code" -#: src/slic3r/GUI/Tab.cpp:2153 +#: src/slic3r/GUI/Tab.cpp:2115 msgid "Volumetric flow hints not available" msgstr "容积流量提示不可用" -#: src/slic3r/GUI/Tab.cpp:2257 +#: src/slic3r/GUI/Tab.cpp:2241 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -8658,20 +10231,20 @@ msgstr "" "物理打印机配置文件编辑器也会打开。\n" "物理打印机配置文件存储在 PrusaSlicer/Physical_Printer 目录中。" -#: src/slic3r/GUI/Tab.cpp:2291 src/slic3r/GUI/Tab.cpp:2518 +#: src/slic3r/GUI/Tab.cpp:2275 src/slic3r/GUI/Tab.cpp:2506 msgid "Size and coordinates" msgstr "大小和坐标" -#: src/slic3r/GUI/Tab.cpp:2300 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:2284 src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "Capabilities" msgstr "功能" -#: src/slic3r/GUI/Tab.cpp:2305 +#: src/slic3r/GUI/Tab.cpp:2289 msgid "Number of extruders of the printer." msgstr "打印机的挤出机数。" -#: src/slic3r/GUI/Tab.cpp:2334 +#: src/slic3r/GUI/Tab.cpp:2322 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -8682,134 +10255,142 @@ msgstr "" "和所有挤出机必须具有相同的直径。\n" "是否要将所有挤出机的直径更改为第一挤出机喷嘴直径值?" -#: src/slic3r/GUI/Tab.cpp:2338 src/slic3r/GUI/Tab.cpp:2782 -#: src/libslic3r/PrintConfig.cpp:1900 +#: src/slic3r/GUI/Tab.cpp:2326 src/slic3r/GUI/Tab.cpp:2714 +#: src/libslic3r/PrintConfig.cpp:1937 msgid "Nozzle diameter" msgstr "喷嘴直径" -#: src/slic3r/GUI/Tab.cpp:2431 src/libslic3r/GCode.cpp:709 -#: src/libslic3r/PrintConfig.cpp:425 +#: src/slic3r/GUI/Tab.cpp:2419 src/libslic3r/GCode.cpp:660 +#: src/libslic3r/PrintConfig.cpp:444 msgid "Before layer change G-code" msgstr "图层更改前 G-Code" -#: src/slic3r/GUI/Tab.cpp:2441 src/libslic3r/GCode.cpp:710 -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/slic3r/GUI/Tab.cpp:2429 src/libslic3r/GCode.cpp:661 +#: src/libslic3r/PrintConfig.cpp:1665 msgid "After layer change G-code" msgstr "图层更改后 G-Code" -#: src/slic3r/GUI/Tab.cpp:2451 src/libslic3r/GCode.cpp:711 -#: src/libslic3r/PrintConfig.cpp:2877 +#: src/slic3r/GUI/Tab.cpp:2439 src/libslic3r/GCode.cpp:662 +#: src/libslic3r/PrintConfig.cpp:2965 msgid "Tool change G-code" msgstr "工具更改 G-Code" -#: src/slic3r/GUI/Tab.cpp:2461 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2449 src/libslic3r/GCode.cpp:663 msgid "Between objects G-code (for sequential printing)" msgstr "模型对象之间的 G-Code (用于顺序打印)" -#: src/slic3r/GUI/Tab.cpp:2471 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2459 src/libslic3r/GCode.cpp:664 msgid "Color Change G-code" msgstr "颜色更改 G-Code" -#: src/slic3r/GUI/Tab.cpp:2480 src/libslic3r/GCode.cpp:714 -#: src/libslic3r/PrintConfig.cpp:2491 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:665 +#: src/libslic3r/PrintConfig.cpp:2523 msgid "Pause Print G-code" msgstr "暂停打印 G-Code" -#: src/slic3r/GUI/Tab.cpp:2489 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:666 msgid "Template Custom G-code" msgstr "模板自定义 G-Code" -#: src/slic3r/GUI/Tab.cpp:2525 +#: src/slic3r/GUI/Tab.cpp:2513 msgid "Display" msgstr "显示" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2528 msgid "Tilt" msgstr "倾斜" -#: src/slic3r/GUI/Tab.cpp:2541 +#: src/slic3r/GUI/Tab.cpp:2529 msgid "Tilt time" msgstr "倾斜时间" -#: src/slic3r/GUI/Tab.cpp:2548 src/slic3r/GUI/Tab.cpp:4575 +#: src/slic3r/GUI/Tab.cpp:2536 src/slic3r/GUI/Tab.cpp:4812 msgid "Corrections" msgstr "修正" -#: src/slic3r/GUI/Tab.cpp:2561 src/slic3r/GUI/Tab.cpp:4571 +#: src/slic3r/GUI/Tab.cpp:2549 src/slic3r/GUI/Tab.cpp:4808 msgid "Exposure" msgstr "曝光" -#: src/slic3r/GUI/Tab.cpp:2622 src/slic3r/GUI/Tab.cpp:2709 -#: src/libslic3r/PrintConfig.cpp:1655 src/libslic3r/PrintConfig.cpp:1690 -#: src/libslic3r/PrintConfig.cpp:1707 src/libslic3r/PrintConfig.cpp:1724 -#: src/libslic3r/PrintConfig.cpp:1740 src/libslic3r/PrintConfig.cpp:1750 -#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1773 -#: src/libslic3r/PrintConfig.cpp:1783 +#: src/slic3r/GUI/Tab.cpp:2556 +msgid "Output" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2615 src/slic3r/GUI/Tab.cpp:2875 +#: src/libslic3r/PrintConfig.cpp:1694 src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1744 src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1777 src/libslic3r/PrintConfig.cpp:1787 +#: src/libslic3r/PrintConfig.cpp:1797 src/libslic3r/PrintConfig.cpp:1810 +#: src/libslic3r/PrintConfig.cpp:1820 msgid "Machine limits" msgstr "机器限制" -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2638 msgid "Values in this column are for Normal mode" msgstr "此列中的值用于正常模式" -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2644 msgid "Values in this column are for Stealth mode" msgstr "此列中的值用于隐身模式" -#: src/slic3r/GUI/Tab.cpp:2660 +#: src/slic3r/GUI/Tab.cpp:2653 msgid "Maximum feedrates" msgstr "最大进给率" -#: src/slic3r/GUI/Tab.cpp:2665 +#: src/slic3r/GUI/Tab.cpp:2658 msgid "Maximum accelerations" msgstr "最大加速度" -#: src/slic3r/GUI/Tab.cpp:2674 +#: src/slic3r/GUI/Tab.cpp:2667 msgid "Jerk limits" msgstr "抖动限制" -#: src/slic3r/GUI/Tab.cpp:2680 +#: src/slic3r/GUI/Tab.cpp:2673 msgid "Minimum feedrates" msgstr "最小进给率" -#: src/slic3r/GUI/Tab.cpp:2734 src/slic3r/GUI/Tab.cpp:2743 -msgid "Single extruder MM setup" -msgstr "单挤出机 MM 设置" - -#: src/slic3r/GUI/Tab.cpp:2744 -msgid "Single extruder multimaterial parameters" -msgstr "单挤出机多材料参数" - -#: src/slic3r/GUI/Tab.cpp:2779 +#: src/slic3r/GUI/Tab.cpp:2711 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" msgstr "" "这是一台单挤出机多材料打印机,所有挤出机的直径都将设置为新的值。是否要继续?" -#: src/slic3r/GUI/Tab.cpp:2804 +#: src/slic3r/GUI/Tab.cpp:2739 +msgid "Reset to Filament Color" +msgstr "重置为耗材颜色" + +#: src/slic3r/GUI/Tab.cpp:2775 +msgid "Apply below setting to other extruders" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2820 msgid "Layer height limits" msgstr "层高度限制" -#: src/slic3r/GUI/Tab.cpp:2809 +#: src/slic3r/GUI/Tab.cpp:2824 msgid "Position (for multi-extruder printers)" msgstr "位置(适用于多挤出打印机)" -#: src/slic3r/GUI/Tab.cpp:2815 +#: src/slic3r/GUI/Tab.cpp:2830 msgid "Only lift Z" msgstr "仅提升 Z" -#: src/slic3r/GUI/Tab.cpp:2828 +#: src/slic3r/GUI/Tab.cpp:2843 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "工具禁用时的回抽 (多挤出机设置的高级设置)" -#: src/slic3r/GUI/Tab.cpp:2835 -msgid "Reset to Filament Color" -msgstr "重置为耗材颜色" +#: src/slic3r/GUI/Tab.cpp:2900 src/slic3r/GUI/Tab.cpp:2909 +msgid "Single extruder MM setup" +msgstr "单挤出机 MM 设置" + +#: src/slic3r/GUI/Tab.cpp:2910 +msgid "Single extruder multimaterial parameters" +msgstr "单挤出机多材料参数" -#: src/slic3r/GUI/Tab.cpp:3012 +#: src/slic3r/GUI/Tab.cpp:3074 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -8819,51 +10400,64 @@ msgstr "" "\n" "我应禁用它,以便启用固件回抽?" -#: src/slic3r/GUI/Tab.cpp:3014 +#: src/slic3r/GUI/Tab.cpp:3076 msgid "Firmware Retraction" msgstr "固件回抽" -#: src/slic3r/GUI/Tab.cpp:3319 +#: src/slic3r/GUI/Tab.cpp:3384 msgid "New printer preset selected" msgstr "已选择新打印机预设" -#: src/slic3r/GUI/Tab.cpp:3625 +#: src/slic3r/GUI/Tab.cpp:3758 msgid "Detached" msgstr "独立的" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3857 +msgid "" +"The physical printer below is based on the preset, you are going to rename." +msgid_plural "" +"The physical printers below are based on the preset, you are going to rename." +msgstr[0] "" + +#: src/slic3r/GUI/Tab.cpp:3862 +msgid "Note, that the selected preset will be renamed in this printer too." +msgid_plural "" +"Note, that the selected preset will be renamed in these printers too." +msgstr[0] "" + +#: src/slic3r/GUI/Tab.cpp:3924 msgid "remove" msgstr "移除" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3924 msgid "delete" msgstr "删除" -#: src/slic3r/GUI/Tab.cpp:3711 +#: src/slic3r/GUI/Tab.cpp:3933 msgid "It's a last preset for this physical printer." msgstr "这是这台物理打印机的最后一次预设。" -#: src/slic3r/GUI/Tab.cpp:3716 +#: src/slic3r/GUI/Tab.cpp:3938 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " "\"%2%\"?" msgstr "是否确实要从物理打印机 \"%2%\" 中删除 \"%1%\" 预设?" -#: src/slic3r/GUI/Tab.cpp:3728 +#: src/slic3r/GUI/Tab.cpp:3950 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" "The physical printers below are based on the preset, you are going to delete." msgstr[0] "下面的物理打印机基于此预设,您将要删除。" -#: src/slic3r/GUI/Tab.cpp:3733 +#: src/slic3r/GUI/Tab.cpp:3955 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." msgstr[0] "请注意,选定的预设也将从这些打印机中删除。" -#: src/slic3r/GUI/Tab.cpp:3738 +#: src/slic3r/GUI/Tab.cpp:3960 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -8872,62 +10466,62 @@ msgid_plural "" "delete." msgstr[0] "下面的物理打印机仅基于此预设,您将要删除。" -#: src/slic3r/GUI/Tab.cpp:3743 +#: src/slic3r/GUI/Tab.cpp:3965 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" "Note, that these printers will be deleted after deleting the selected preset." msgstr[0] "请注意,删除选定预设后,这些打印机将被删除。" -#: src/slic3r/GUI/Tab.cpp:3748 +#: src/slic3r/GUI/Tab.cpp:3970 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "是否确实要将所选预设 %1%?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3753 +#: src/slic3r/GUI/Tab.cpp:3975 #, boost-format msgid "%1% Preset" msgstr "%1% 预设" -#: src/slic3r/GUI/Tab.cpp:3836 src/slic3r/GUI/Tab.cpp:4198 +#: src/slic3r/GUI/Tab.cpp:4061 src/slic3r/GUI/Tab.cpp:4423 msgid "Set" msgstr "设置" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:4180 msgid "Find" msgstr "查找" -#: src/slic3r/GUI/Tab.cpp:3956 +#: src/slic3r/GUI/Tab.cpp:4181 msgid "Replace with" msgstr "替换为" -#: src/slic3r/GUI/Tab.cpp:4045 +#: src/slic3r/GUI/Tab.cpp:4270 msgid "Regular expression" msgstr "正则表达式" -#: src/slic3r/GUI/Tab.cpp:4049 +#: src/slic3r/GUI/Tab.cpp:4274 msgid "Case insensitive" msgstr "不区分大小写" -#: src/slic3r/GUI/Tab.cpp:4053 +#: src/slic3r/GUI/Tab.cpp:4278 msgid "Whole word" msgstr "整字" -#: src/slic3r/GUI/Tab.cpp:4057 +#: src/slic3r/GUI/Tab.cpp:4282 msgid "Match single line" msgstr "匹配单线" -#: src/slic3r/GUI/Tab.cpp:4160 +#: src/slic3r/GUI/Tab.cpp:4385 msgid "Are you sure you want to delete all substitutions?" msgstr "是否确实要删除所有替换?" -#: src/slic3r/GUI/Tab.cpp:4292 +#: src/slic3r/GUI/Tab.cpp:4521 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "机器限制将发送到 G-Code,并用于估计打印时间。" -#: src/slic3r/GUI/Tab.cpp:4295 +#: src/slic3r/GUI/Tab.cpp:4524 msgid "" "Machine limits will NOT be emitted to G-code, however they will be used to " "estimate print time, which may therefore not be accurate as the printer may " @@ -8936,29 +10530,29 @@ msgstr "" "机器限制不会发送到 G-Code,但它们将用于估计打印时间,因此可能不准确,因为打印" "机可能会应用不同的机器限制集。" -#: src/slic3r/GUI/Tab.cpp:4299 +#: src/slic3r/GUI/Tab.cpp:4528 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." msgstr "未设置机器限制,因此打印时间估计可能不准确。" -#: src/slic3r/GUI/Tab.cpp:4321 +#: src/slic3r/GUI/Tab.cpp:4550 msgid "LOCKED LOCK" msgstr "锁定锁" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4323 +#: src/slic3r/GUI/Tab.cpp:4552 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" msgstr "指示设置与当前选项组的系统(或默认值)值相同" -#: src/slic3r/GUI/Tab.cpp:4325 +#: src/slic3r/GUI/Tab.cpp:4554 msgid "UNLOCKED LOCK" msgstr "解锁锁" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4327 +#: src/slic3r/GUI/Tab.cpp:4556 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -8968,12 +10562,12 @@ msgstr "" "指示某些设置已更改,并且不等于当前选项组的系统(或默认值)值。\n" "单击\"锁定锁定\"图标可将当前选项组的所有设置重置为系统(或默认值)值。" -#: src/slic3r/GUI/Tab.cpp:4332 +#: src/slic3r/GUI/Tab.cpp:4561 msgid "WHITE BULLET" msgstr "灰色点" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4334 +#: src/slic3r/GUI/Tab.cpp:4563 msgid "" "for the left button: indicates a non-system (or non-default) preset,\n" "for the right button: indicates that the settings hasn't been modified." @@ -8981,12 +10575,12 @@ msgstr "" "对于左侧按钮:指示非系统(或非默认)预设,\n" "对于右侧按钮:指示设置尚未修改。" -#: src/slic3r/GUI/Tab.cpp:4337 +#: src/slic3r/GUI/Tab.cpp:4566 msgid "BACK ARROW" msgstr "后箭头" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4339 +#: src/slic3r/GUI/Tab.cpp:4568 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -8996,13 +10590,13 @@ msgstr "" "指示设置已更改,不等于当前选项组的最后一个保存预设。\n" "单击\"后退箭头\"图标可将当前选项组的所有设置重置为上次保存的预设。" -#: src/slic3r/GUI/Tab.cpp:4349 +#: src/slic3r/GUI/Tab.cpp:4578 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" msgstr "锁定锁定图标表示设置与当前选项组的系统(或默认值)值相同" -#: src/slic3r/GUI/Tab.cpp:4351 +#: src/slic3r/GUI/Tab.cpp:4580 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " "equal to the system (or default) values for the current option group.\n" @@ -9012,17 +10606,17 @@ msgstr "" "锁定的锁图标指示某些设置已更改,并且不等于当前选项组的系统(或默认值)值。\n" "单击此处可将当前选项组的所有设置重置为系统(或默认值)值。" -#: src/slic3r/GUI/Tab.cpp:4354 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "灰色点图标表示非系统(或非默认)预设。" -#: src/slic3r/GUI/Tab.cpp:4357 +#: src/slic3r/GUI/Tab.cpp:4586 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." msgstr "灰色点图标表示设置与当前选项组上次保存的预设中的设置相同。" -#: src/slic3r/GUI/Tab.cpp:4359 +#: src/slic3r/GUI/Tab.cpp:4588 msgid "" "BACK ARROW icon indicates that the settings were changed and are not equal " "to the last saved preset for the current option group.\n" @@ -9032,13 +10626,13 @@ msgstr "" "后退箭头图标表示设置已更改,不等于当前选项组的最后保存预设。\n" "单击此处可将当前选项组的所有设置重置为上次保存的预设。" -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4594 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "锁定锁定图标表示该值与系统(或默认值)值相同。" -#: src/slic3r/GUI/Tab.cpp:4366 +#: src/slic3r/GUI/Tab.cpp:4595 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -9047,13 +10641,13 @@ msgstr "" "锁定的锁 图标指示该值已更改,不等于系统(或默认值)值。\n" "单击以将当前值重置为系统(或默认值)值。" -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4601 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." msgstr "灰色点图标表示该值与上次保存的预设中的值相同。" -#: src/slic3r/GUI/Tab.cpp:4373 +#: src/slic3r/GUI/Tab.cpp:4602 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -9062,31 +10656,31 @@ msgstr "" "后退箭头图标指示该值已更改,不等于上次保存的预设。\n" "单击以将当前值重置为上次保存的预设。" -#: src/slic3r/GUI/Tab.cpp:4527 src/slic3r/GUI/Tab.cpp:4529 +#: src/slic3r/GUI/Tab.cpp:4764 src/slic3r/GUI/Tab.cpp:4766 msgid "Material" msgstr "材料" -#: src/slic3r/GUI/Tab.cpp:4614 src/slic3r/GUI/Tab.cpp:4615 +#: src/slic3r/GUI/Tab.cpp:4851 src/slic3r/GUI/Tab.cpp:4852 msgid "Material printing profile" msgstr "材料打印配置文件" -#: src/slic3r/GUI/Tab.cpp:4667 +#: src/slic3r/GUI/Tab.cpp:4901 msgid "Support head" msgstr "支撑头" -#: src/slic3r/GUI/Tab.cpp:4672 +#: src/slic3r/GUI/Tab.cpp:4906 msgid "Support pillar" msgstr "支撑支柱" -#: src/slic3r/GUI/Tab.cpp:4695 +#: src/slic3r/GUI/Tab.cpp:4929 msgid "Connection of the support sticks and junctions" msgstr "支撑杆和接头的连接" -#: src/slic3r/GUI/Tab.cpp:4700 +#: src/slic3r/GUI/Tab.cpp:4956 msgid "Automatic generation" msgstr "自动生成" -#: src/slic3r/GUI/Tab.cpp:4775 +#: src/slic3r/GUI/Tab.cpp:5024 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -9095,74 +10689,72 @@ msgstr "" "\"%1%\" 被禁用,因为 \"%2%\" 在 \"%3%\" 类别中处于启用状态。\n" "要启用 \"%1%\",请关闭 \"%2%\"" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3724 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3497 msgid "Object elevation" msgstr "对象高程" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3826 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3958 msgid "Pad around object" msgstr "对象周围填充" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:153 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:162 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1047 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1100 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1115 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1130 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1145 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:147 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:156 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:165 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1107 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1122 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1137 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1152 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1197 msgid "Undef" msgstr "未定义" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:772 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:792 msgid "Unsaved Changes" msgstr "未保存的修改" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:790 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:810 msgid "Switching Presets: Unsaved Changes" msgstr "切换预设:未保存的更改" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:832 -msgid "Old Value" -msgstr "旧值" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:858 +msgid "Original Value" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:859 +msgid "Modified Value" +msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:833 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:861 msgid "New Value" msgstr "新值" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:867 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 msgid "Keep" msgstr "保持" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1569 msgid "Transfer" msgstr "转移" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 msgid "Don't save" msgstr "不要存钱" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 -msgid "Discard" -msgstr "丢弃" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:877 -msgid "Save" -msgstr "保存" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:898 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:926 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "create new project" msgstr "下次创建新项目时,不会询问预设中未保存的更改" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:927 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "switch a preset" msgstr "下次切换预设时,不会询问预设中未保存的更改" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:900 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:928 msgid "" "You will not be asked about the unsaved changes in presets the next time " "you: \n" @@ -9173,111 +10765,137 @@ msgstr "" "-在修改某些预设时关闭 PrusaSlicer,\n" "-在修改某些预设时加载新项目时,将不会询问预设中未保存的更改" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:903 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:931 msgid "PrusaSlicer will remember your action." msgstr "普鲁萨斯勒会记住你的行为。" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:904 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:932 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" "to be asked about unsaved changes again." msgstr "访问 “首选项” 并选中 \"%1%\",再次询问未保存的更改。" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:964 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1772 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "有些字段太长,无法容纳。鼠标右键单击显示全文。" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will not be saved" msgstr "不会保存所有设置更改" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will be discarded." msgstr "所有设置更改都将被放弃。" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:941 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:969 msgid "Save the selected options." msgstr "保存所选选项。" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:942 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:970 msgid "Keep the selected settings." msgstr "保留选定的设置。" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:943 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:971 msgid "Transfer the selected settings to the newly selected preset." msgstr "将选定的设置转换为新选定的预设。" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:947 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:975 #, boost-format msgid "Save the selected options to preset \"%1%\"." msgstr "将所选选项保存到预设 \"%1%\"。" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:948 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:976 #, boost-format msgid "Transfer the selected options to the newly selected preset \"%1%\"." msgstr "将所选选项转移到新选择的预设 \"%1%\"。" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1224 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1237 msgid "The following preset was modified" msgid_plural "The following presets were modified" msgstr[0] "修改了以下预设" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1230 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1243 #, boost-format msgid "Preset \"%1%\" has the following unsaved changes:" msgstr "预设 \"%1%\" 有以下未保存的更改:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1234 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1247 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new printer profile and it has the " "following unsaved changes:" msgstr "预设 \"%1%\" 与新打印机配置文件不兼容,它有以下未保存的更改:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1235 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1248 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new print profile and it has the " "following unsaved changes:" msgstr "预设 \"%1%\" 与新的打印配置文件不兼容,它有以下未保存的更改:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1297 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1850 msgid "Extruders count" msgstr "挤出机计数" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 -msgid "Select presets to compare" -msgstr "选择要比较的预设" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1326 +msgid "The preset modifications are successfully saved" +msgid_plural "The presets modifications are successfully saved" +msgstr[0] "预设修改已成功保存" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1515 msgid "Show all presets (including incompatible)" msgstr "显示所有预设(包括不兼容)" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1533 +msgid "Select presets to compare" +msgstr "选择要比较的预设" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1545 msgid "Left Preset Value" msgstr "左预设值" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1546 msgid "Right Preset Value" msgstr "右预设值" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1595 +msgid "" +"Transfer the selected options from left preset to the right.\n" +"Note: New modified presets will be selected in settings tabs after close " +"this dialog." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1603 +msgid "Save the selected options from left preset to the right." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1621 +msgid "Transfer values from left to right" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1622 +msgid "" +"If enabled, this dialog can be used for transver selected values from left " +"to right preset." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1807 msgid "One of the presets doesn't found" msgstr "其中一个预设未找到" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1818 msgid "Compared presets has different printer technology" msgstr "不同的预设有不同的打印机技术" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1832 msgid "Presets are the same" msgstr "预设是一样的" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1840 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." @@ -9285,57 +10903,129 @@ msgstr "" "预设是不同的。\n" "单击此按钮为左右预设选择相同的预设。" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef category" msgstr "未定义类别" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef group" msgstr "未定义组" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:2016 +msgid "Modified" +msgstr "修改日期" + +#: src/slic3r/GUI/UpdateDialogs.cpp:41 msgid "Update available" msgstr "更新可用" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UpdateDialogs.cpp:41 #, c-format, boost-format msgid "New version of %s is available" msgstr "新版本 %s 可用" -#: src/slic3r/GUI/UpdateDialogs.cpp:42 +#: src/slic3r/GUI/UpdateDialogs.cpp:46 src/slic3r/GUI/UpdateDialogs.cpp:101 msgid "Current version:" msgstr "当前版本:" -#: src/slic3r/GUI/UpdateDialogs.cpp:44 +#: src/slic3r/GUI/UpdateDialogs.cpp:48 src/slic3r/GUI/UpdateDialogs.cpp:103 +#: src/slic3r/GUI/UpdateDialogs.cpp:141 msgid "New version:" msgstr "新版本:" -#: src/slic3r/GUI/UpdateDialogs.cpp:52 +#: src/slic3r/GUI/UpdateDialogs.cpp:56 msgid "Changelog & Download" msgstr "更改日志 & 下载" -#: src/slic3r/GUI/UpdateDialogs.cpp:59 src/slic3r/GUI/UpdateDialogs.cpp:133 -#: src/slic3r/GUI/UpdateDialogs.cpp:191 +#: src/slic3r/GUI/UpdateDialogs.cpp:63 src/slic3r/GUI/UpdateDialogs.cpp:309 +#: src/slic3r/GUI/UpdateDialogs.cpp:367 msgid "Open changelog page" msgstr "打开更改日志页面" -#: src/slic3r/GUI/UpdateDialogs.cpp:65 +#: src/slic3r/GUI/UpdateDialogs.cpp:69 msgid "Open download page" msgstr "打开下载页面" -#: src/slic3r/GUI/UpdateDialogs.cpp:72 +#: src/slic3r/GUI/UpdateDialogs.cpp:76 src/slic3r/GUI/UpdateDialogs.cpp:109 msgid "Don't notify about new releases any more" msgstr "不再通知新版本" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +msgid "App Update available" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +#, c-format, boost-format +msgid "" +"New version of %s is available.\n" +"Do you wish to download it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +msgid "App Update download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +#, c-format, boost-format +msgid "New version of %s is available." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:146 +msgid "Run installer after download. (Otherwise file explorer will be opened)" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:151 +msgid "Target directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:158 +msgid "Select directory" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:176 +msgid "Select directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:193 +msgid "Download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:204 +msgid "Directory path is empty." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:212 +msgid "Directory path is incorrect." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:217 +#, boost-format +msgid "Directory %1% doesn't exists. Do you wish to create it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:222 +msgid "Failed to create directory." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:229 +#, boost-format +msgid "File %1% already exists. Do you wish to overwrite it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +#, boost-format +msgid "Download path is %1%. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:270 msgid "Opening Configuration Wizard" msgstr "打开配置向导" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 src/slic3r/GUI/UpdateDialogs.cpp:261 +#: src/slic3r/GUI/UpdateDialogs.cpp:270 src/slic3r/GUI/UpdateDialogs.cpp:437 msgid "Configuration update" msgstr "配置更新" -#: src/slic3r/GUI/UpdateDialogs.cpp:95 +#: src/slic3r/GUI/UpdateDialogs.cpp:271 msgid "" "PrusaSlicer is not using the newest configuration available.\n" "Configuration Wizard may not offer the latest printers, filaments and SLA " @@ -9344,11 +11034,11 @@ msgstr "" "PrusaSlicer 未使用可用的最新配置。\n" "配置向导可能不提供要安装的最新打印机、耗材和 SLA 材料。" -#: src/slic3r/GUI/UpdateDialogs.cpp:97 +#: src/slic3r/GUI/UpdateDialogs.cpp:273 msgid "Configuration update is available" msgstr "配置更新可用" -#: src/slic3r/GUI/UpdateDialogs.cpp:100 +#: src/slic3r/GUI/UpdateDialogs.cpp:276 msgid "" "Would you like to install it?\n" "\n" @@ -9364,28 +11054,28 @@ msgstr "" "\n" "更新的配置捆绑包:" -#: src/slic3r/GUI/UpdateDialogs.cpp:121 src/slic3r/GUI/UpdateDialogs.cpp:181 +#: src/slic3r/GUI/UpdateDialogs.cpp:297 src/slic3r/GUI/UpdateDialogs.cpp:357 msgid "Comment:" msgstr "评论:" -#: src/slic3r/GUI/UpdateDialogs.cpp:142 +#: src/slic3r/GUI/UpdateDialogs.cpp:318 msgid "Install" msgstr "安装" -#: src/slic3r/GUI/UpdateDialogs.cpp:144 +#: src/slic3r/GUI/UpdateDialogs.cpp:320 msgid "Don't install" msgstr "不要安装" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 src/slic3r/GUI/UpdateDialogs.cpp:212 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 src/slic3r/GUI/UpdateDialogs.cpp:388 #, c-format, boost-format msgid "%s incompatibility" msgstr "%s 不兼容" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 msgid "You must install a configuration update." msgstr "您必须安装配置更新。" -#: src/slic3r/GUI/UpdateDialogs.cpp:160 +#: src/slic3r/GUI/UpdateDialogs.cpp:336 #, c-format, boost-format msgid "" "%s will now start updates. Otherwise it won't be able to start.\n" @@ -9401,17 +11091,12 @@ msgstr "" "\n" "更新的配置包:" -#: src/slic3r/GUI/UpdateDialogs.cpp:200 src/slic3r/GUI/UpdateDialogs.cpp:247 -#, c-format, boost-format -msgid "Exit %s" -msgstr "退出 %s" - -#: src/slic3r/GUI/UpdateDialogs.cpp:213 +#: src/slic3r/GUI/UpdateDialogs.cpp:389 #, c-format, boost-format msgid "%s configuration is incompatible" msgstr "%s 配置不兼容" -#: src/slic3r/GUI/UpdateDialogs.cpp:216 +#: src/slic3r/GUI/UpdateDialogs.cpp:392 #, c-format, boost-format msgid "" "This version of %s is not compatible with currently installed configuration " @@ -9429,20 +11114,20 @@ msgstr "" "您可以退出 %s 并使用较新版本重试,也可以重新运行初始配置。这样做将在安装与此 " "%s 兼容的文件之前创建现有配置的备份快照。" -#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#: src/slic3r/GUI/UpdateDialogs.cpp:401 #, c-format, boost-format msgid "This %s version: %s" msgstr "此 %s 版本: %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:230 +#: src/slic3r/GUI/UpdateDialogs.cpp:406 msgid "Incompatible bundles:" msgstr "不兼容的包:" -#: src/slic3r/GUI/UpdateDialogs.cpp:246 +#: src/slic3r/GUI/UpdateDialogs.cpp:422 msgid "Re-configure" msgstr "重新配置" -#: src/slic3r/GUI/UpdateDialogs.cpp:265 +#: src/slic3r/GUI/UpdateDialogs.cpp:441 #, c-format, boost-format msgid "" "%s now uses an updated configuration structure.\n" @@ -9465,28 +11150,37 @@ msgstr "" "\n" "请继续以下 %s 以设置新预设并选择是否启用自动预设更新。" -#: src/slic3r/GUI/UpdateDialogs.cpp:282 +#: src/slic3r/GUI/UpdateDialogs.cpp:458 msgid "For more information please visit our wiki page:" msgstr "欲了解更多信息,请访问我们的维基页面:" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 msgid "Configuration updates" msgstr "配置更新" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 src/slic3r/GUI/UpdateDialogs.cpp:495 msgid "No updates available" msgstr "没有可用的更新" -#: src/slic3r/GUI/UpdateDialogs.cpp:304 +#: src/slic3r/GUI/UpdateDialogs.cpp:480 #, c-format, boost-format msgid "%s has no configuration updates available." msgstr "%s 没有可用的配置更新。" -#: src/slic3r/GUI/WipeTowerDialog.cpp:21 +#: src/slic3r/GUI/UpdateDialogs.cpp:495 +msgid "App update" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:500 +#, c-format, boost-format +msgid "%s has no version updates available." +msgstr "" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:23 msgid "Ramming customization" msgstr "冲击自定义" -#: src/slic3r/GUI/WipeTowerDialog.cpp:54 +#: src/slic3r/GUI/WipeTowerDialog.cpp:56 msgid "" "Ramming denotes the rapid extrusion just before a tool change in a single-" "extruder MM printer. Its purpose is to properly shape the end of the " @@ -9505,63 +11199,63 @@ msgstr "" "\n" "这是一个专家级设置, 不正确的调整很可能会导致卡料, 挤出机砂轮磨耗材等。" -#: src/slic3r/GUI/WipeTowerDialog.cpp:114 +#: src/slic3r/GUI/WipeTowerDialog.cpp:116 msgid "Total ramming time" msgstr "总冲击时间" -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 msgid "Total rammed volume" msgstr "总冲击量" -#: src/slic3r/GUI/WipeTowerDialog.cpp:120 +#: src/slic3r/GUI/WipeTowerDialog.cpp:122 msgid "Ramming line width" msgstr "冲击线宽度" -#: src/slic3r/GUI/WipeTowerDialog.cpp:122 +#: src/slic3r/GUI/WipeTowerDialog.cpp:124 msgid "Ramming line spacing" msgstr "冲击线行距" -#: src/slic3r/GUI/WipeTowerDialog.cpp:173 +#: src/slic3r/GUI/WipeTowerDialog.cpp:175 msgid "Wipe tower - Purging volume adjustment" msgstr "擦料塔 - 清除体积调整" -#: src/slic3r/GUI/WipeTowerDialog.cpp:299 +#: src/slic3r/GUI/WipeTowerDialog.cpp:301 msgid "" "Here you can adjust required purging volume (mm³) for any given pair of " "tools." msgstr "在这里, 您可以调整任何给定的对工具所需的清除体积 (mm³)。" -#: src/slic3r/GUI/WipeTowerDialog.cpp:300 +#: src/slic3r/GUI/WipeTowerDialog.cpp:302 msgid "Extruder changed to" msgstr "挤出机更改为" -#: src/slic3r/GUI/WipeTowerDialog.cpp:308 +#: src/slic3r/GUI/WipeTowerDialog.cpp:310 msgid "unloaded" msgstr "卸载" -#: src/slic3r/GUI/WipeTowerDialog.cpp:309 +#: src/slic3r/GUI/WipeTowerDialog.cpp:311 msgid "loaded" msgstr "装载" -#: src/slic3r/GUI/WipeTowerDialog.cpp:352 +#: src/slic3r/GUI/WipeTowerDialog.cpp:354 msgid "Tool #" msgstr "工具 #" -#: src/slic3r/GUI/WipeTowerDialog.cpp:361 +#: src/slic3r/GUI/WipeTowerDialog.cpp:363 msgid "" "Total purging volume is calculated by summing two values below, depending on " "which tools are loaded/unloaded." msgstr "总清除量是通过求和下面的两个值来计算的, 具体取决于装载/卸载的工具。" -#: src/slic3r/GUI/WipeTowerDialog.cpp:362 +#: src/slic3r/GUI/WipeTowerDialog.cpp:364 msgid "Volume to purge (mm³) when the filament is being" msgstr "要清除的体积 (mm³) 当耗材正在被" -#: src/slic3r/GUI/WipeTowerDialog.cpp:376 +#: src/slic3r/GUI/WipeTowerDialog.cpp:378 msgid "From" msgstr "从" -#: src/slic3r/GUI/WipeTowerDialog.cpp:442 +#: src/slic3r/GUI/WipeTowerDialog.cpp:444 msgid "" "Switching to simple settings will discard changes done in the advanced " "mode!\n" @@ -9572,26 +11266,28 @@ msgstr "" "\n" "是否要继续?" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show simplified settings" msgstr "显示简单设置" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show advanced settings" msgstr "显示高级设置" -#: src/slic3r/GUI/wxExtensions.cpp:644 +#: src/slic3r/GUI/wxExtensions.cpp:672 #, c-format, boost-format msgid "Switch to the %s mode" msgstr "切换到 %s 模式" -#: src/slic3r/GUI/wxExtensions.cpp:645 +#: src/slic3r/GUI/wxExtensions.cpp:673 #, c-format, boost-format msgid "Current mode is %s" msgstr "当前模式为 %s" -#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:141 -#: src/slic3r/Utils/Repetier.cpp:69 +#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:206 +#: src/slic3r/Utils/OctoPrint.cpp:255 src/slic3r/Utils/OctoPrint.cpp:666 +#: src/slic3r/Utils/OctoPrint.cpp:824 src/slic3r/Utils/OctoPrint.cpp:897 +#: src/slic3r/Utils/Repetier.cpp:88 #, c-format, boost-format msgid "Mismatched type of print host: %s" msgstr "不匹配的打印主机类型:%s" @@ -9708,71 +11404,100 @@ msgid "" "is required." msgstr "注:需要固件为 2.00.02 或更新版本的 FlashAir,并激活上传功能。" -#: src/slic3r/Utils/OctoPrint.cpp:164 +#: src/slic3r/Utils/OctoPrint.cpp:278 msgid "Connection to OctoPrint works correctly." msgstr "与 OctoPrint 的连接工作正常。" -#: src/slic3r/Utils/OctoPrint.cpp:170 +#: src/slic3r/Utils/OctoPrint.cpp:284 msgid "Could not connect to OctoPrint" msgstr "无法连接到 OctoPrint" -#: src/slic3r/Utils/OctoPrint.cpp:172 +#: src/slic3r/Utils/OctoPrint.cpp:286 msgid "Note: OctoPrint version at least 1.1.0 is required." msgstr "注意: 至少需要1.1.0 版本的 OctoPrint。" -#: src/slic3r/Utils/OctoPrint.cpp:292 +#: src/slic3r/Utils/OctoPrint.cpp:528 msgid "Connection to Prusa SL1 / SL1S works correctly." msgstr "与 Prusa SL1/SL1S 的连接工作正常。" -#: src/slic3r/Utils/OctoPrint.cpp:298 +#: src/slic3r/Utils/OctoPrint.cpp:534 msgid "Could not connect to Prusa SLA" msgstr "无法连接到 Prusa SLA" -#: src/slic3r/Utils/OctoPrint.cpp:336 +#: src/slic3r/Utils/OctoPrint.cpp:573 msgid "Connection to PrusaLink works correctly." msgstr "与 PrusaLink 的连接工作正常。" -#: src/slic3r/Utils/OctoPrint.cpp:342 +#: src/slic3r/Utils/OctoPrint.cpp:579 msgid "Could not connect to PrusaLink" msgstr "无法连接到 PrusaLink" -#: src/slic3r/Utils/PresetUpdater.cpp:61 +#: src/slic3r/Utils/OctoPrint.cpp:776 +msgid "Storages found:" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "read only" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "no free space" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:781 +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%.%2%" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:64 #, boost-format msgid "Copying of file %1% to %2% failed: %3%" msgstr "将文件 %1% 复制到 %2% 失败:%3%" -#: src/slic3r/Utils/PresetUpdater.cpp:645 -#: src/slic3r/Utils/PresetUpdater.cpp:662 +#: src/slic3r/Utils/PresetUpdater.cpp:998 +#: src/slic3r/Utils/PresetUpdater.cpp:1015 msgid "Continue and install configuration updates?" msgstr "是否继续并安装配置更新?" -#: src/slic3r/Utils/PresetUpdater.cpp:777 +#: src/slic3r/Utils/PresetUpdater.cpp:1021 +msgid "Installing profiles" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1071 +#, boost-format +msgid "Downloading resources for %1%." +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1171 msgid "" -"Configuration Updates causes a lost of preset modification.\n" +"Configuration Update will cause the preset modification to be lost.\n" "So, check unsaved changes and save them if necessary." msgstr "" -"配置更新会导致预设修改丢失。\n" -"So,检查未保存的更改,必要时保存。" -#: src/slic3r/Utils/PresetUpdater.cpp:779 +#: src/slic3r/Utils/PresetUpdater.cpp:1173 msgid "Updating" msgstr "更新" -#: src/slic3r/Utils/PresetUpdater.cpp:808 +#: src/slic3r/Utils/PresetUpdater.cpp:1202 #, c-format, boost-format msgid "requires min. %s and max. %s" msgstr "需要最小 %s 和最大 %s" -#: src/slic3r/Utils/PresetUpdater.cpp:812 +#: src/slic3r/Utils/PresetUpdater.cpp:1206 #, c-format, boost-format msgid "requires min. %s" msgstr "需要最小 %s" -#: src/slic3r/Utils/PresetUpdater.cpp:815 +#: src/slic3r/Utils/PresetUpdater.cpp:1209 #, c-format, boost-format msgid "requires max. %s" msgstr "需要最大 %s" +#: src/slic3r/Utils/PresetUpdater.cpp:1362 +#, boost-format +msgid "Couldn't locate idx file %1% when performing updates." +msgstr "" + #: src/slic3r/Utils/Http.cpp:73 msgid "" "Could not detect system SSL certificate store. PrusaSlicer will be unable to " @@ -9801,23 +11526,23 @@ msgstr "" "CURL init 失败了。PrusaSlicer 将无法建立网络连接。有关更多详细信息,请参阅日" "志。" -#: src/slic3r/Utils/Process.cpp:157 +#: src/slic3r/Utils/Process.cpp:164 msgid "Open G-code file:" msgstr "打开 G-Code 文件:" -#: src/slic3r/Utils/Repetier.cpp:84 +#: src/slic3r/Utils/Repetier.cpp:103 msgid "Connection to Repetier works correctly." msgstr "与 Repetier 的连接正常工作。" -#: src/slic3r/Utils/Repetier.cpp:90 +#: src/slic3r/Utils/Repetier.cpp:109 msgid "Could not connect to Repetier" msgstr "无法连接到 Repetier" -#: src/slic3r/Utils/Repetier.cpp:92 +#: src/slic3r/Utils/Repetier.cpp:111 msgid "Note: Repetier version at least 0.90.0 is required." msgstr "注:需要至少 0.90.0 的 Repetier 版本。" -#: src/slic3r/Utils/Repetier.cpp:246 +#: src/slic3r/Utils/Repetier.cpp:263 #, boost-format msgid "" "HTTP status: %1%\n" @@ -9826,7 +11551,7 @@ msgstr "" "HTTP 状态:%1%\n" "消息正文:\"%2%\"" -#: src/slic3r/Utils/Repetier.cpp:253 +#: src/slic3r/Utils/Repetier.cpp:270 #, boost-format msgid "" "Parsing of host response failed.\n" @@ -9837,7 +11562,7 @@ msgstr "" "消息正文:\"%1%\"\n" "错误:\"%2%\"" -#: src/slic3r/Utils/Repetier.cpp:266 +#: src/slic3r/Utils/Repetier.cpp:283 #, boost-format msgid "" "Enumeration of host printers failed.\n" @@ -9869,25 +11594,25 @@ msgstr "持续" msgid "Abort" msgstr "中止" -#: src/libslic3r/GCode.cpp:539 +#: src/libslic3r/GCode.cpp:490 msgid "There is an object with no extrusions in the first layer." msgstr "第一层中有一个没有拉伸的对象。" -#: src/libslic3r/GCode.cpp:570 +#: src/libslic3r/GCode.cpp:521 #, boost-format msgid "Empty layer between %1% and %2%." msgstr "空层介于 %1% 和 %2% 之间。" -#: src/libslic3r/GCode.cpp:573 +#: src/libslic3r/GCode.cpp:524 msgid "(Some lines not shown)" msgstr "(某些行未显示)" -#: src/libslic3r/GCode.cpp:575 +#: src/libslic3r/GCode.cpp:526 #, boost-format msgid "Object name: %1%" msgstr "对象名称:%1%" -#: src/libslic3r/GCode.cpp:576 +#: src/libslic3r/GCode.cpp:527 msgid "" "Make sure the object is printable. This is usually caused by negligibly " "small extrusions or by a faulty model. Try to repair the model or change its " @@ -9896,69 +11621,65 @@ msgstr "" "确保对象是可打印的。这通常是由可忽略的小挤压或故障模型造成的。尝试修复模型或" "更改其在床上的方向。" -#: src/libslic3r/GCode.cpp:718 +#: src/libslic3r/GCode.cpp:669 msgid "Filament Start G-code" msgstr "耗材启动 G-Code" -#: src/libslic3r/GCode.cpp:725 +#: src/libslic3r/GCode.cpp:676 msgid "Filament End G-code" msgstr "耗材结束 G-Code" -#: src/libslic3r/GCode.cpp:764 +#: src/libslic3r/GCode.cpp:717 msgid "In the custom G-code were found reserved keywords:" msgstr "在自定义 G-Code 中找到保留关键字:" -#: src/libslic3r/GCode.cpp:766 +#: src/libslic3r/GCode.cpp:719 msgid "" "This may cause problems in g-code visualization and printing time estimation." msgstr "这可能会导致 G-Code 可视化和打印时间估计出现问题。" -#: src/libslic3r/GCode.cpp:1200 src/libslic3r/GCode.cpp:1211 +#: src/libslic3r/GCode.cpp:1124 src/libslic3r/GCode.cpp:1135 msgid "No extrusions were generated for objects." msgstr "没有为对象生成拉伸。" -#: src/libslic3r/GCode.cpp:1406 +#: src/libslic3r/GCode.cpp:1328 msgid "" "Your print is very close to the priming regions. Make sure there is no " "collision." msgstr "你的指纹非常接近启动区域。确保没有碰撞。" -#: src/libslic3r/ExtrusionEntity.cpp:344 src/libslic3r/ExtrusionEntity.cpp:380 -msgid "Mixed" -msgstr "混合" - #: src/libslic3r/Flow.cpp:61 #, boost-format msgid "" "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." msgstr "无法计算 %1% 的拉伸宽度:无法访问变量 \"%2%\"。" -#: src/libslic3r/Format/3mf.cpp:1735 +#: src/libslic3r/Format/3mf.cpp:1880 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "所选 3mf 文件已使用较新版本的 %1% 保存,不兼容。" -#: src/libslic3r/Format/3mf.cpp:1746 +#: src/libslic3r/Format/3mf.cpp:1891 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." msgstr "所选 3MF 包含 FDM,支持使用较新版本的 PrusaSlicer 绘制对象,不兼容。" -#: src/libslic3r/Format/3mf.cpp:1750 +#: src/libslic3r/Format/3mf.cpp:1895 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." msgstr "所选 3MF 包含使用较新版本的 PrusaSlicer 的接缝绘制对象,不兼容。" -#: src/libslic3r/Format/3mf.cpp:1754 +#: src/libslic3r/Format/3mf.cpp:1899 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." msgstr "所选 3MF 包含使用较新版本的 PrusaSlicer 绘制的多材质对象,不兼容。" -#: src/libslic3r/Format/AMF.cpp:993 +#: src/libslic3r/Format/AMF.cpp:1000 #, boost-format msgid "" "The selected amf file has been saved with a newer version of %1% and is not " @@ -10107,24 +11828,30 @@ msgstr "验证失败" msgid "write calledback failed" msgstr "写入回叫失败" -#: src/libslic3r/Print.cpp:454 +#: src/libslic3r/Print.cpp:473 msgid "All objects are outside of the print volume." msgstr "所有对象都在打印范围之外。" -#: src/libslic3r/Print.cpp:457 +#: src/libslic3r/Print.cpp:476 msgid "The supplied settings will cause an empty print." msgstr "当前提供的设置将导致空打印。" -#: src/libslic3r/Print.cpp:461 +#: src/libslic3r/Print.cpp:480 msgid "Some objects are too close; your extruder will collide with them." msgstr "有些对象太近; 你的挤出机会和他们相撞。" -#: src/libslic3r/Print.cpp:463 +#: src/libslic3r/Print.cpp:482 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." msgstr "某些对象太高, 无法在挤出机不冲突的情况下打印。" -#: src/libslic3r/Print.cpp:472 +#: src/libslic3r/Print.cpp:486 +msgid "" +"Avoid crossing perimeters option and avoid crossing curled overhangs option " +"cannot be both enabled together." +msgstr "" + +#: src/libslic3r/Print.cpp:495 msgid "" "Only a single object may be printed at a time in Spiral Vase mode. Either " "remove all but the last object, or enable sequential mode by " @@ -10133,19 +11860,29 @@ msgstr "" "在螺旋花瓶模式下,一次只能打印一个对象。移除除最后一个对象外的所有对象,或通" "过“完成对象”启用顺序模式。" -#: src/libslic3r/Print.cpp:476 +#: src/libslic3r/Print.cpp:499 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." msgstr "螺旋花瓶选项只能在打印单个材质对象时使用。" -#: src/libslic3r/Print.cpp:489 +#: src/libslic3r/Print.cpp:523 +msgid "" +"The print is taller than the maximum allowed height. You might want to " +"reduce the size of your model or change current print settings and retry." +msgstr "" + +#: src/libslic3r/Print.cpp:540 +msgid "Variable layer height is not supported with Organic supports." +msgstr "" + +#: src/libslic3r/Print.cpp:553 msgid "" "The wipe tower is only supported if all extruders have the same nozzle " "diameter and use filaments of the same diameter." msgstr "仅当所有挤出机具有相同的喷嘴直径并使用相同直径的耗材时,才支持擦料塔。" -#: src/libslic3r/Print.cpp:495 +#: src/libslic3r/Print.cpp:559 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, " "RepRapFirmware and Repetier G-code flavors." @@ -10153,40 +11890,42 @@ msgstr "" "擦拭塔目前仅支持 Marlin、RepRap/Sprinter、RepRap 固件和 Repetier G-Code 版" "本。" -#: src/libslic3r/Print.cpp:497 +#: src/libslic3r/Print.cpp:561 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." msgstr "擦料塔目前仅支持相对挤出机寻址 (use_relative_e_distances=1)。" -#: src/libslic3r/Print.cpp:499 -msgid "Ooze prevention is currently not supported with the wipe tower enabled." -msgstr "启用擦料塔时,当前不支持 Ooze 预防。" +#: src/libslic3r/Print.cpp:563 +msgid "" +"Ooze prevention is only supported with the wipe tower when " +"'single_extruder_multi_material' is off." +msgstr "" -#: src/libslic3r/Print.cpp:501 +#: src/libslic3r/Print.cpp:565 msgid "" "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." msgstr "擦拭塔目前不支持体积E(使用体积E=0)。" -#: src/libslic3r/Print.cpp:503 +#: src/libslic3r/Print.cpp:567 msgid "" "The Wipe Tower is currently not supported for multimaterial sequential " "prints." msgstr "擦拭塔目前不支持多材质连续打印。" -#: src/libslic3r/Print.cpp:524 +#: src/libslic3r/Print.cpp:577 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " "layer heights" msgstr "仅当多个对象具有相等的图层高度时,才支持擦料塔" -#: src/libslic3r/Print.cpp:526 +#: src/libslic3r/Print.cpp:579 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "over an equal number of raft layers" msgstr "只有在相同数量的基座层上打印的对象时, 才支持擦料塔" -#: src/libslic3r/Print.cpp:529 +#: src/libslic3r/Print.cpp:582 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "with the same support_material_contact_distance" @@ -10194,34 +11933,34 @@ msgstr "" "只有在使用相同的 support_material_contact_distance(支撑材料距离)打印多个对" "象时, 才支持擦料塔" -#: src/libslic3r/Print.cpp:531 +#: src/libslic3r/Print.cpp:584 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." msgstr "只有在多个对象被平均切割的情况下, 才支持擦料塔。" -#: src/libslic3r/Print.cpp:555 +#: src/libslic3r/Print.cpp:609 msgid "" "The Wipe tower is only supported if all objects have the same variable layer " "height" msgstr "只有当所有对象具有相同的可变层高度时,才支持擦拭塔" -#: src/libslic3r/Print.cpp:579 +#: src/libslic3r/Print.cpp:633 msgid "" "One or more object were assigned an extruder that the printer does not have." msgstr "为一个或多个对象分配了打印机没有的挤出机。" -#: src/libslic3r/Print.cpp:592 +#: src/libslic3r/Print.cpp:646 #, boost-format msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" msgstr "%1%=%2%mm 太低,在图层高度 %3%mm 时无法打印" -#: src/libslic3r/Print.cpp:595 +#: src/libslic3r/Print.cpp:649 #, boost-format msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" msgstr "过量 %1%=%2%mm 可打印,使用喷嘴直径 %3%mm" -#: src/libslic3r/Print.cpp:606 +#: src/libslic3r/Print.cpp:660 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " @@ -10232,32 +11971,21 @@ msgstr "" "(support_material_extruder ==0 或 support_material_interface_extruder ==0)打" "印支撑物, 则所有喷嘴的直径必须相同。" -#: src/libslic3r/Print.cpp:614 +#: src/libslic3r/Print.cpp:668 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers " "need to be synchronized with the object layers." msgstr "要使擦料塔与可溶性支撑配合使用, 支撑层需要与对象图层同步。" -#: src/libslic3r/Print.cpp:618 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only if they are " -"printed with the current extruder without triggering a tool change. (both " -"support_material_extruder and support_material_interface_extruder need to be " -"set to 0)." -msgstr "" -"只有在不触发工具更改的情况下, 使用当前挤出机打印的未溶性支撑塔目前才支持不可" -"溶支撑于的支架。(support_material_extruder 和 " -"support_material_interface_extruder 都需要设置为 0)。" - -#: src/libslic3r/Print.cpp:654 +#: src/libslic3r/Print.cpp:708 msgid "First layer height can't be greater than nozzle diameter" msgstr "第一层高度不能大于喷嘴直径" -#: src/libslic3r/Print.cpp:659 +#: src/libslic3r/Print.cpp:713 msgid "Layer height can't be greater than nozzle diameter" msgstr "层高度不能大于喷嘴直径" -#: src/libslic3r/Print.cpp:680 +#: src/libslic3r/Print.cpp:734 msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " @@ -10266,51 +11994,103 @@ msgstr "" "相对挤出机寻址要求在每层重置挤出机位置,以防止浮点精度损失。将 \"G92E0\" 添加" "到图层代码中。" -#: src/libslic3r/Print.cpp:682 +#: src/libslic3r/Print.cpp:736 msgid "" "\"G92 E0\" was found in before_layer_gcode, which is incompatible with " "absolute extruder addressing." msgstr "\"G92E0\" 出现在 before_layer_gcode 中,与绝对挤出机寻址不兼容。" -#: src/libslic3r/Print.cpp:684 +#: src/libslic3r/Print.cpp:738 msgid "" "\"G92 E0\" was found in layer_gcode, which is incompatible with absolute " "extruder addressing." msgstr "\"G92E0\" 出现在 layer_gcode 中,这与绝对挤出机寻址不兼容。" -#: src/libslic3r/Print.cpp:826 +#: src/libslic3r/Print.cpp:880 msgid "Infilling layers" msgstr "填充图层" -#: src/libslic3r/Print.cpp:848 +#: src/libslic3r/Print.cpp:908 msgid "Generating skirt and brim" msgstr "生成环绕和裙边" -#: src/libslic3r/Print.cpp:896 +#: src/libslic3r/Print.cpp:956 msgid "Exporting G-code" msgstr "导出 G-Code" -#: src/libslic3r/Print.cpp:900 +#: src/libslic3r/Print.cpp:960 msgid "Generating G-code" msgstr "生成 G-Code" +#: src/libslic3r/Print.cpp:1169 +msgid "Alert if supports needed" +msgstr "" + +#: src/libslic3r/Print.cpp:1174 +msgid "long bridging extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1175 +msgid "floating bridge anchors" +msgstr "" + +#: src/libslic3r/Print.cpp:1178 +msgid "collapsing overhang" +msgstr "" + +#: src/libslic3r/Print.cpp:1180 +msgid "loose extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1183 +msgid "low bed adhesion" +msgstr "" + +#: src/libslic3r/Print.cpp:1184 +msgid "floating object part" +msgstr "" + +#: src/libslic3r/Print.cpp:1185 +msgid "thin fragile section" +msgstr "" + +#: src/libslic3r/Print.cpp:1221 +msgid "Detected print stability issues" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "or" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "and" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "brim" +msgstr "" + +#: src/libslic3r/Print.cpp:1248 +msgid "Consider enabling supports" +msgstr "" + #: src/libslic3r/SLA/Pad.cpp:533 msgid "Pad brim size is too small for the current configuration." msgstr "对于当前配置,焊盘边缘尺寸太小。" -#: src/libslic3r/SLAPrint.cpp:628 +#: src/libslic3r/SLAPrint.cpp:546 msgid "" "Cannot proceed without support points! Add support points or disable support " "generation." msgstr "没有支撑点就无法继续!添加支撑点或禁用支撑生成。" -#: src/libslic3r/SLAPrint.cpp:640 +#: src/libslic3r/SLAPrint.cpp:558 msgid "" "Elevation is too low for object. Use the \"Pad around object\" feature to " "print the object without elevation." msgstr "标高对于对象来说太低。使用“对象周围填充”功能打印不带高程的对象。" -#: src/libslic3r/SLAPrint.cpp:646 +#: src/libslic3r/SLAPrint.cpp:564 msgid "" "The endings of the support pillars will be deployed on the gap between the " "object and the pad. 'Support base safety distance' has to be greater than " @@ -10319,92 +12099,99 @@ msgstr "" "支撑柱的尾数将部署在物体和垫子之间的间隙上。\"支撑基基安全距离\"必须大于\"垫" "对象间隙\"参数,以避免这种情况。" -#: src/libslic3r/SLAPrint.cpp:661 +#: src/libslic3r/SLAPrint.cpp:579 msgid "Exposition time is out of printer profile bounds." msgstr "曝光时间超出打印机配置文件限制。" -#: src/libslic3r/SLAPrint.cpp:668 +#: src/libslic3r/SLAPrint.cpp:586 msgid "Initial exposition time is out of printer profile bounds." msgstr "初始曝光时间超出打印机配置文件边界。" -#: src/libslic3r/SLAPrint.cpp:784 +#: src/libslic3r/SLAPrint.cpp:693 msgid "Slicing done" msgstr "切片完成" -#: src/libslic3r/SLAPrintSteps.cpp:47 +#: src/libslic3r/SLAPrintSteps.cpp:57 +msgid "Assembling model from parts" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:58 msgid "Hollowing model" msgstr "空心模型" -#: src/libslic3r/SLAPrintSteps.cpp:48 +#: src/libslic3r/SLAPrintSteps.cpp:59 msgid "Drilling holes into model." msgstr "在模型上钻孔。" -#: src/libslic3r/SLAPrintSteps.cpp:49 +#: src/libslic3r/SLAPrintSteps.cpp:60 msgid "Slicing model" msgstr "切片模型" -#: src/libslic3r/SLAPrintSteps.cpp:50 src/libslic3r/SLAPrintSteps.cpp:639 +#: src/libslic3r/SLAPrintSteps.cpp:61 src/libslic3r/SLAPrintSteps.cpp:691 msgid "Generating support points" msgstr "生成支撑点" -#: src/libslic3r/SLAPrintSteps.cpp:51 +#: src/libslic3r/SLAPrintSteps.cpp:62 msgid "Generating support tree" msgstr "生成支撑树" -#: src/libslic3r/SLAPrintSteps.cpp:52 +#: src/libslic3r/SLAPrintSteps.cpp:63 msgid "Generating pad" msgstr "生成垫" -#: src/libslic3r/SLAPrintSteps.cpp:53 +#: src/libslic3r/SLAPrintSteps.cpp:64 msgid "Slicing supports" msgstr "切片支撑" -#: src/libslic3r/SLAPrintSteps.cpp:68 +#: src/libslic3r/SLAPrintSteps.cpp:79 msgid "Merging slices and calculating statistics" msgstr "合并切片并计算统计信息" -#: src/libslic3r/SLAPrintSteps.cpp:69 +#: src/libslic3r/SLAPrintSteps.cpp:80 msgid "Rasterizing layers" msgstr "栅格化层" -#: src/libslic3r/SLAPrintSteps.cpp:435 -msgid "Too many overlapping holes." -msgstr "重叠的洞太多了。" - -#: src/libslic3r/SLAPrintSteps.cpp:442 +#: src/libslic3r/SLAPrintSteps.cpp:255 msgid "" "Mesh to be hollowed is not suitable for hollowing (does not bound a volume)." msgstr "要挖空的网格不适合挖空(不绑定卷)。" -#: src/libslic3r/SLAPrintSteps.cpp:450 +#: src/libslic3r/SLAPrintSteps.cpp:262 msgid "Unable to drill the current configuration of holes into the model." msgstr "无法在模型中钻取孔的当前配置。" -#: src/libslic3r/SLAPrintSteps.cpp:470 +#: src/libslic3r/SLAPrintSteps.cpp:271 msgid "" "Drilling holes into the mesh failed. This is usually caused by broken model. " "Try to fix it first." msgstr "在网格上钻孔失败了。这通常是由模型损坏引起的。试着先把它修好。" -#: src/libslic3r/SLAPrintSteps.cpp:476 +#: src/libslic3r/SLAPrintSteps.cpp:279 msgid "Failed to drill some holes into the model" msgstr "未能在模型上钻一些孔" -#: src/libslic3r/SLAPrintSteps.cpp:520 +#: src/libslic3r/SLAPrintSteps.cpp:289 +msgid "" +"Can't perform full mesh booleans! Some parts of the print will be previewed " +"with approximated meshes. This does not affect the quality of slices or the " +"physical print in any way." +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:510 msgid "" "Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "由于内部错误:切片索引不一致,必须停止切片。" -#: src/libslic3r/SLAPrintSteps.cpp:691 src/libslic3r/SLAPrintSteps.cpp:700 -#: src/libslic3r/SLAPrintSteps.cpp:738 +#: src/libslic3r/SLAPrintSteps.cpp:740 src/libslic3r/SLAPrintSteps.cpp:749 +#: src/libslic3r/SLAPrintSteps.cpp:787 msgid "Visualizing supports" msgstr "可视化支撑" -#: src/libslic3r/SLAPrintSteps.cpp:730 +#: src/libslic3r/SLAPrintSteps.cpp:779 msgid "No pad can be generated for this model with the current configuration" msgstr "无法使用当前配置为该型号生成焊盘" -#: src/libslic3r/SLAPrintSteps.cpp:854 +#: src/libslic3r/SLAPrintSteps.cpp:908 msgid "" "There are unprintable objects. Try to adjust support settings to make the " "objects printable." @@ -10414,27 +12201,27 @@ msgstr "存在无法打印的对象。尝试调整支持设置以使对象可打 msgid "Failed processing of the output_filename_format template." msgstr "模板 output_filename_format 处理失败。" -#: src/libslic3r/PrintConfig.cpp:236 src/libslic3r/PrintConfig.cpp:237 +#: src/libslic3r/PrintConfig.cpp:254 src/libslic3r/PrintConfig.cpp:255 msgid "Printer technology" msgstr "打印机技术" -#: src/libslic3r/PrintConfig.cpp:244 +#: src/libslic3r/PrintConfig.cpp:260 msgid "Bed shape" msgstr "打印平台形状" -#: src/libslic3r/PrintConfig.cpp:249 +#: src/libslic3r/PrintConfig.cpp:265 msgid "Bed custom texture" msgstr "床自定义纹理" -#: src/libslic3r/PrintConfig.cpp:254 +#: src/libslic3r/PrintConfig.cpp:270 msgid "Bed custom model" msgstr "床自定义模型" -#: src/libslic3r/PrintConfig.cpp:259 +#: src/libslic3r/PrintConfig.cpp:275 msgid "Elephant foot compensation" msgstr "大象脚补偿" -#: src/libslic3r/PrintConfig.cpp:261 +#: src/libslic3r/PrintConfig.cpp:277 msgid "" "The first layer will be shrunk in the XY plane by the configured value to " "compensate for the 1st layer squish aka an Elephant Foot effect." @@ -10442,11 +12229,11 @@ msgstr "" "第一层将被相对于配置的值在 XY 平面上缩小, 以补偿第一层斜视, 也就是大象脚的效" "果。" -#: src/libslic3r/PrintConfig.cpp:269 +#: src/libslic3r/PrintConfig.cpp:285 msgid "G-code thumbnails" msgstr "G-Code 缩略图" -#: src/libslic3r/PrintConfig.cpp:270 +#: src/libslic3r/PrintConfig.cpp:286 msgid "" "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " "following format: \"XxY, XxY, ...\"" @@ -10454,17 +12241,17 @@ msgstr "" "图片大小要存储到一个文件夹中。gcode 和。sl1/。sl1s 文件,格式如下:“ XxY," "XxY,…”" -#: src/libslic3r/PrintConfig.cpp:276 +#: src/libslic3r/PrintConfig.cpp:292 msgid "Format of G-code thumbnails" msgstr "G-Code 缩略图格式" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:293 msgid "" "Format of G-code thumbnails: PNG for best quality, JPG for smallest size, " "QOI for low memory firmware" msgstr "G-Code 缩略图格式: PNG 质量最佳,JPG 尺寸最小,QOI 用于低内存固件" -#: src/libslic3r/PrintConfig.cpp:288 +#: src/libslic3r/PrintConfig.cpp:301 msgid "" "This setting controls the height (and thus the total number) of the slices/" "layers. Thinner layers give better accuracy but take more time to print." @@ -10472,21 +12259,21 @@ msgstr "" "此设置控制切片/图层的高度(以及总数)。较薄的图层具有更高的精度,但打印时间更" "长。" -#: src/libslic3r/PrintConfig.cpp:295 +#: src/libslic3r/PrintConfig.cpp:308 msgid "Max print height" msgstr "最大打印高度" -#: src/libslic3r/PrintConfig.cpp:296 +#: src/libslic3r/PrintConfig.cpp:309 msgid "" "Set this to the maximum height that can be reached by your extruder while " "printing." msgstr "将此设置为挤出头在打印时可以达到的最大高度。" -#: src/libslic3r/PrintConfig.cpp:304 +#: src/libslic3r/PrintConfig.cpp:317 msgid "Hostname, IP or URL" msgstr "主机名,IP 或 URL" -#: src/libslic3r/PrintConfig.cpp:305 +#: src/libslic3r/PrintConfig.cpp:318 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the hostname, IP address or URL of the printer host instance. Print host " @@ -10498,11 +12285,11 @@ msgstr "" "名、IP 地址或 URL。通过将用户名和密码按以下格式输入 URL,可以访问启用基本身份" "验证的 HAProxy 背后的打印主机:https://username:password@你的章鱼地址/" -#: src/libslic3r/PrintConfig.cpp:314 +#: src/libslic3r/PrintConfig.cpp:327 msgid "API Key / Password" msgstr "API 密钥/密码" -#: src/libslic3r/PrintConfig.cpp:315 +#: src/libslic3r/PrintConfig.cpp:328 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the API Key or the password required for authentication." @@ -10510,11 +12297,11 @@ msgstr "" "Slic3r 可以将 G-Code 文件上传到打印机主机。此字段应包含 API 密钥或身份验证所" "需的密码。" -#: src/libslic3r/PrintConfig.cpp:323 +#: src/libslic3r/PrintConfig.cpp:336 msgid "Name of the printer" msgstr "打印机名称" -#: src/libslic3r/PrintConfig.cpp:331 +#: src/libslic3r/PrintConfig.cpp:344 msgid "" "Custom CA certificate file can be specified for HTTPS OctoPrint connections, " "in crt/pem format. If left blank, the default OS CA certificate repository " @@ -10523,15 +12310,15 @@ msgstr "" "可以为 HTTPS OctoPrint 连接指定自定义 CA 证书文件,格式为 crt/pem 格式。如果留" "空,则使用默认的 OS CA 证书存储库。" -#: src/libslic3r/PrintConfig.cpp:347 +#: src/libslic3r/PrintConfig.cpp:360 msgid "Password" msgstr "密码" -#: src/libslic3r/PrintConfig.cpp:355 +#: src/libslic3r/PrintConfig.cpp:368 msgid "Ignore HTTPS certificate revocation checks" msgstr "忽略 HTTPS 证书撤销检查" -#: src/libslic3r/PrintConfig.cpp:356 +#: src/libslic3r/PrintConfig.cpp:369 msgid "" "Ignore HTTPS certificate revocation checks in case of missing or offline " "distribution points. One may want to enable this option for self signed " @@ -10540,31 +12327,43 @@ msgstr "" "忽略 HTTPS 证书吊销检查,以防丢失或脱机分发点。如果连接失败,可能需要为自签名" "证书启用此选项。" -#: src/libslic3r/PrintConfig.cpp:363 +#: src/libslic3r/PrintConfig.cpp:376 msgid "Printer preset names" msgstr "打印机预设名称" -#: src/libslic3r/PrintConfig.cpp:364 +#: src/libslic3r/PrintConfig.cpp:377 msgid "Names of presets related to the physical printer" msgstr "与物理打印机相关的预设名称" -#: src/libslic3r/PrintConfig.cpp:369 +#: src/libslic3r/PrintConfig.cpp:382 msgid "Authorization Type" msgstr "授权类型" -#: src/libslic3r/PrintConfig.cpp:374 +#: src/libslic3r/PrintConfig.cpp:385 msgid "API key" msgstr "API 密钥" -#: src/libslic3r/PrintConfig.cpp:375 +#: src/libslic3r/PrintConfig.cpp:386 msgid "HTTP digest" msgstr "HTTP 摘要" -#: src/libslic3r/PrintConfig.cpp:395 +#: src/libslic3r/PrintConfig.cpp:406 +msgid "Avoid crossing curled overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:407 +msgid "" +"Plan travel moves such that the extruder avoids areas where the filament may " +"be curled up. This is mostly happening on steeper rounded overhangs and may " +"cause a crash with the nozzle. This feature slows down both the print and " +"the G-code generation." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:414 msgid "Avoid crossing perimeters" msgstr "避免跨越轮廓边界" -#: src/libslic3r/PrintConfig.cpp:396 +#: src/libslic3r/PrintConfig.cpp:415 msgid "" "Optimize travel moves in order to minimize the crossing of perimeters. This " "is mostly useful with Bowden extruders which suffer from oozing. This " @@ -10573,11 +12372,11 @@ msgstr "" "优化移动移动,以尽量减少周界交叉。这在鲍登挤出机中最有用,它们容易渗漏。此功" "能可降低打印和 G-Code 生成速度。" -#: src/libslic3r/PrintConfig.cpp:403 +#: src/libslic3r/PrintConfig.cpp:422 msgid "Avoid crossing perimeters - Max detour length" msgstr "避免穿越周长-最大绕行长度" -#: src/libslic3r/PrintConfig.cpp:405 +#: src/libslic3r/PrintConfig.cpp:424 msgid "" "The maximum detour length for avoid crossing perimeters. If the detour is " "longer than this value, avoid crossing perimeters is not applied for this " @@ -10587,25 +12386,25 @@ msgstr "" "避免穿越周长的最大绕行长度。如果绕道长度超过该值,则避免穿越周长不适用于该行" "驶路径。迂回长度可以指定为绝对值或直接行驶路径的百分比(例如 50%)。" -#: src/libslic3r/PrintConfig.cpp:408 +#: src/libslic3r/PrintConfig.cpp:427 msgid "mm or % (zero to disable)" msgstr "毫米或 %(零表示禁用)" -#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:2839 +#: src/libslic3r/PrintConfig.cpp:434 src/libslic3r/PrintConfig.cpp:2927 msgid "Other layers" msgstr "其他层" -#: src/libslic3r/PrintConfig.cpp:416 +#: src/libslic3r/PrintConfig.cpp:435 msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." msgstr "第一层之后层的床温。将此设置为零以禁用输出中的床温控制命令。" -#: src/libslic3r/PrintConfig.cpp:419 +#: src/libslic3r/PrintConfig.cpp:438 msgid "Bed temperature" msgstr "热床温度" -#: src/libslic3r/PrintConfig.cpp:426 +#: src/libslic3r/PrintConfig.cpp:445 msgid "" "This custom code is inserted at every layer change, right before the Z move. " "Note that you can use placeholder variables for all Slic3r settings as well " @@ -10614,11 +12413,11 @@ msgstr "" "此自定义代码在 Z 移动之前,每次图层更改时都会插入。请注意,您可以将占位符变量" "用于所有 Slic3r 设置以及 [layer_num] 和 [layer_z]。" -#: src/libslic3r/PrintConfig.cpp:436 +#: src/libslic3r/PrintConfig.cpp:455 msgid "Between objects G-code" msgstr "对象之间的 G-Code" -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:456 msgid "" "This code is inserted between objects when using sequential printing. By " "default extruder and bed temperature are reset using non-wait command; " @@ -10632,50 +12431,50 @@ msgstr "" "添加温度命令。请注意, 您可以对所有 Slic3r 设置使用占位符变量, 因此您可以将 " "\"M109S[first_layer_temperature]\" 命令放在任何需要的地方。" -#: src/libslic3r/PrintConfig.cpp:448 +#: src/libslic3r/PrintConfig.cpp:467 msgid "Number of solid layers to generate on bottom surfaces." msgstr "要在底部曲面上生成的实心图层数。" -#: src/libslic3r/PrintConfig.cpp:449 +#: src/libslic3r/PrintConfig.cpp:468 msgid "Bottom solid layers" msgstr "底部实心层" -#: src/libslic3r/PrintConfig.cpp:457 +#: src/libslic3r/PrintConfig.cpp:476 msgid "" "The number of bottom solid layers is increased above bottom_solid_layers if " "necessary to satisfy minimum thickness of bottom shell." msgstr "" "如果有必要满足底部壳体的最小厚度,底部实体层的数量将增加到底部实体层之上。" -#: src/libslic3r/PrintConfig.cpp:459 +#: src/libslic3r/PrintConfig.cpp:478 msgid "Minimum bottom shell thickness" msgstr "最小底壳厚度" -#: src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:484 msgid "Bridge" msgstr "网桥" -#: src/libslic3r/PrintConfig.cpp:466 +#: src/libslic3r/PrintConfig.cpp:485 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." msgstr "这是打印机用于搭桥的加速。设置为零以禁用搭桥的加速度控制。" -#: src/libslic3r/PrintConfig.cpp:468 src/libslic3r/PrintConfig.cpp:639 -#: src/libslic3r/PrintConfig.cpp:1192 src/libslic3r/PrintConfig.cpp:1201 -#: src/libslic3r/PrintConfig.cpp:1401 src/libslic3r/PrintConfig.cpp:1410 -#: src/libslic3r/PrintConfig.cpp:1419 src/libslic3r/PrintConfig.cpp:1713 -#: src/libslic3r/PrintConfig.cpp:1764 src/libslic3r/PrintConfig.cpp:1775 -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1983 -#: src/libslic3r/PrintConfig.cpp:1991 +#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:1252 src/libslic3r/PrintConfig.cpp:1261 +#: src/libslic3r/PrintConfig.cpp:1447 src/libslic3r/PrintConfig.cpp:1456 +#: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1750 +#: src/libslic3r/PrintConfig.cpp:1801 src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1822 src/libslic3r/PrintConfig.cpp:2013 +#: src/libslic3r/PrintConfig.cpp:2021 msgid "mm/s²" msgstr "mm/s²" -#: src/libslic3r/PrintConfig.cpp:474 +#: src/libslic3r/PrintConfig.cpp:493 msgid "Bridging angle" msgstr "桥接角度" -#: src/libslic3r/PrintConfig.cpp:476 +#: src/libslic3r/PrintConfig.cpp:495 msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for all " @@ -10684,35 +12483,30 @@ msgstr "" "桥接角度覆盖。如果设为零,将自动计算桥接角度。否则,提供的角度将用于所有桥" "接。使用 180° 实现零角度。" -#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:1102 -#: src/libslic3r/PrintConfig.cpp:2282 src/libslic3r/PrintConfig.cpp:2292 -#: src/libslic3r/PrintConfig.cpp:2583 src/libslic3r/PrintConfig.cpp:2824 -#: src/libslic3r/PrintConfig.cpp:3041 src/libslic3r/PrintConfig.cpp:3144 -#: src/libslic3r/PrintConfig.cpp:3698 src/libslic3r/PrintConfig.cpp:3819 -msgid "°" -msgstr "°" - -#: src/libslic3r/PrintConfig.cpp:485 +#: src/libslic3r/PrintConfig.cpp:504 msgid "Bridges fan speed" msgstr "桥接风扇速度" -#: src/libslic3r/PrintConfig.cpp:486 +#: src/libslic3r/PrintConfig.cpp:505 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "此风扇速度在所有桥和悬空期间强制执行。" -#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:1114 -#: src/libslic3r/PrintConfig.cpp:1601 src/libslic3r/PrintConfig.cpp:1793 -#: src/libslic3r/PrintConfig.cpp:1856 src/libslic3r/PrintConfig.cpp:2115 -#: src/libslic3r/PrintConfig.cpp:2174 src/libslic3r/PrintConfig.cpp:3323 -#: src/libslic3r/PrintConfig.cpp:3612 src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:596 +#: src/libslic3r/PrintConfig.cpp:605 src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:623 src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1893 src/libslic3r/PrintConfig.cpp:2145 +#: src/libslic3r/PrintConfig.cpp:2204 src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3369 src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3870 msgid "%" msgstr "%" -#: src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:513 msgid "Bridge flow ratio" msgstr "桥接流量比" -#: src/libslic3r/PrintConfig.cpp:496 +#: src/libslic3r/PrintConfig.cpp:515 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -10722,33 +12516,91 @@ msgstr "" "此因子影响用于桥接的耗材量。您可以稍微减小它挤出和防止下垂,虽然默认设置通常" "很好,您应该尝试冷却(使用风扇),然后再调整它。" -#: src/libslic3r/PrintConfig.cpp:506 +#: src/libslic3r/PrintConfig.cpp:525 msgid "Bridges" msgstr "桥接" -#: src/libslic3r/PrintConfig.cpp:508 +#: src/libslic3r/PrintConfig.cpp:527 msgid "Speed for printing bridges." msgstr "打印桥接的速度。" -#: src/libslic3r/PrintConfig.cpp:509 src/libslic3r/PrintConfig.cpp:920 -#: src/libslic3r/PrintConfig.cpp:928 src/libslic3r/PrintConfig.cpp:937 -#: src/libslic3r/PrintConfig.cpp:945 src/libslic3r/PrintConfig.cpp:972 -#: src/libslic3r/PrintConfig.cpp:991 src/libslic3r/PrintConfig.cpp:1329 -#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1620 -#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1730 -#: src/libslic3r/PrintConfig.cpp:1742 src/libslic3r/PrintConfig.cpp:1752 -#: src/libslic3r/PrintConfig.cpp:1815 src/libslic3r/PrintConfig.cpp:1874 -#: src/libslic3r/PrintConfig.cpp:2022 src/libslic3r/PrintConfig.cpp:2249 -#: src/libslic3r/PrintConfig.cpp:2258 src/libslic3r/PrintConfig.cpp:2789 -#: src/libslic3r/PrintConfig.cpp:2939 src/libslic3r/PrintConfig.cpp:2949 +#: src/libslic3r/PrintConfig.cpp:528 src/libslic3r/PrintConfig.cpp:1009 +#: src/libslic3r/PrintConfig.cpp:1017 src/libslic3r/PrintConfig.cpp:1026 +#: src/libslic3r/PrintConfig.cpp:1034 src/libslic3r/PrintConfig.cpp:1061 +#: src/libslic3r/PrintConfig.cpp:1080 src/libslic3r/PrintConfig.cpp:1386 +#: src/libslic3r/PrintConfig.cpp:1579 src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1733 src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1779 src/libslic3r/PrintConfig.cpp:1789 +#: src/libslic3r/PrintConfig.cpp:1852 src/libslic3r/PrintConfig.cpp:1911 +#: src/libslic3r/PrintConfig.cpp:2052 src/libslic3r/PrintConfig.cpp:2279 +#: src/libslic3r/PrintConfig.cpp:2288 src/libslic3r/PrintConfig.cpp:2810 +#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3037 msgid "mm/s" msgstr "mm/s" -#: src/libslic3r/PrintConfig.cpp:516 +#: src/libslic3r/PrintConfig.cpp:535 +msgid "Enable dynamic overhang speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:537 +msgid "This setting enables dynamic speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:541 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Speeds for overhang " +"sizes in between are calculated via linear interpolation. If set as " +"percentage, the speed is calculated over the external perimeter speed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:547 src/libslic3r/PrintConfig.cpp:594 +msgid "speed for 0% overlap (bridge)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:550 src/libslic3r/PrintConfig.cpp:559 +#: src/libslic3r/PrintConfig.cpp:568 src/libslic3r/PrintConfig.cpp:577 +#: src/libslic3r/PrintConfig.cpp:856 src/libslic3r/PrintConfig.cpp:1305 +#: src/libslic3r/PrintConfig.cpp:1316 src/libslic3r/PrintConfig.cpp:2387 +#: src/libslic3r/PrintConfig.cpp:2440 src/libslic3r/PrintConfig.cpp:2765 +#: src/libslic3r/PrintConfig.cpp:2997 +msgid "mm/s or %" +msgstr "mm/s 或 %" + +#: src/libslic3r/PrintConfig.cpp:556 src/libslic3r/PrintConfig.cpp:603 +msgid "speed for 25% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:612 +msgid "speed for 50% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:574 src/libslic3r/PrintConfig.cpp:621 +msgid "speed for 75% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:583 +msgid "Enable dynamic fan speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:584 +msgid "This setting enables dynamic fan speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:589 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Fan speeds for " +"overhang sizes in between are calculated via linear interpolation. " +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:630 msgid "Brim width" msgstr "裙边宽度" -#: src/libslic3r/PrintConfig.cpp:518 +#: src/libslic3r/PrintConfig.cpp:632 msgid "" "The horizontal width of the brim that will be printed around each object on " "the first layer. When raft is used, no brim is generated (use " @@ -10757,68 +12609,55 @@ msgstr "" "边缘的水平宽度,将围绕第一层上的每个对象打印。使用筏板时,不会产生边缘(使用" "筏板_第一层_扩展)。" -#: src/libslic3r/PrintConfig.cpp:527 +#: src/libslic3r/PrintConfig.cpp:641 msgid "Brim type" msgstr "裙边类型" -#: src/libslic3r/PrintConfig.cpp:529 +#: src/libslic3r/PrintConfig.cpp:643 msgid "" "The places where the brim will be printed around each object on the first " "layer." msgstr "边缘将在第一层上的每个对象周围打印的位置。" -#: src/libslic3r/PrintConfig.cpp:535 +#: src/libslic3r/PrintConfig.cpp:645 msgid "No brim" msgstr "没有裙边" -#: src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:646 msgid "Outer brim only" msgstr "仅外部裙边" -#: src/libslic3r/PrintConfig.cpp:537 +#: src/libslic3r/PrintConfig.cpp:647 msgid "Inner brim only" msgstr "仅内部裙边" -#: src/libslic3r/PrintConfig.cpp:538 +#: src/libslic3r/PrintConfig.cpp:648 msgid "Outer and inner brim" msgstr "内部和外部裙边" -#: src/libslic3r/PrintConfig.cpp:543 +#: src/libslic3r/PrintConfig.cpp:654 msgid "Brim separation gap" msgstr "裙边分离间隙" -#: src/libslic3r/PrintConfig.cpp:545 +#: src/libslic3r/PrintConfig.cpp:656 msgid "" "Offset of brim from the printed object. The offset is applied after the " "elephant foot compensation." msgstr "裙边与印刷品的偏移量。偏移在大象脚补偿后应用。" -#: src/libslic3r/PrintConfig.cpp:552 -msgid "Clip multi-part objects" -msgstr "剪切多部分对象" - -#: src/libslic3r/PrintConfig.cpp:553 -msgid "" -"When printing multi-material objects, this settings will make Slic3r to clip " -"the overlapping object parts one by the other (2nd part will be clipped by " -"the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -msgstr "" -"打印多材质对象时,此设置将使 Slic3r 将重叠对象部件逐一裁剪(第 2 部分将在第 " -"1 部分中剪切,第 3 部分由第 1 部分和第 2 部分剪切等)。" - -#: src/libslic3r/PrintConfig.cpp:560 +#: src/libslic3r/PrintConfig.cpp:663 msgid "Colorprint height" msgstr "彩色打印高度" -#: src/libslic3r/PrintConfig.cpp:561 +#: src/libslic3r/PrintConfig.cpp:664 msgid "Heights at which a filament change is to occur." msgstr "发生耗材变化的高度。" -#: src/libslic3r/PrintConfig.cpp:571 +#: src/libslic3r/PrintConfig.cpp:674 msgid "Compatible printers condition" msgstr "兼容打印机条件" -#: src/libslic3r/PrintConfig.cpp:572 +#: src/libslic3r/PrintConfig.cpp:675 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " @@ -10827,11 +12666,11 @@ msgstr "" "使用活动打印机配置文件的配置值的布尔表达式。如果此表达式计算为 true,则此配置" "文件将被视为与活动打印机配置文件兼容。" -#: src/libslic3r/PrintConfig.cpp:586 +#: src/libslic3r/PrintConfig.cpp:689 msgid "Compatible print profiles condition" msgstr "兼容的打印配置文件条件" -#: src/libslic3r/PrintConfig.cpp:587 +#: src/libslic3r/PrintConfig.cpp:690 msgid "" "A boolean expression using the configuration values of an active print " "profile. If this expression evaluates to true, this profile is considered " @@ -10840,11 +12679,11 @@ msgstr "" "使用活动打印配置文件的配置值的布尔表达式。如果此表达式计算为 true,则此配置文" "件将被视为与活动打印配置文件兼容。" -#: src/libslic3r/PrintConfig.cpp:604 +#: src/libslic3r/PrintConfig.cpp:707 msgid "Complete individual objects" msgstr "完成单个对象" -#: src/libslic3r/PrintConfig.cpp:605 +#: src/libslic3r/PrintConfig.cpp:708 msgid "" "When printing multiple objects or copies, this feature will complete each " "object before moving onto next one (and starting it from its bottom layer). " @@ -10855,33 +12694,33 @@ msgstr "" "层开始)。此功能可用于避免打印损坏的风险。Slic3r 应警告并防止挤出机碰撞,但要" "小心。" -#: src/libslic3r/PrintConfig.cpp:613 +#: src/libslic3r/PrintConfig.cpp:716 msgid "Enable auto cooling" msgstr "启用自动冷却" -#: src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:717 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." msgstr "此标志启用自动冷却逻辑,可根据图层打印时间调整打印速度和风扇速度。" -#: src/libslic3r/PrintConfig.cpp:619 +#: src/libslic3r/PrintConfig.cpp:722 msgid "Cooling tube position" msgstr "冷却管位置" -#: src/libslic3r/PrintConfig.cpp:620 +#: src/libslic3r/PrintConfig.cpp:723 msgid "Distance of the center-point of the cooling tube from the extruder tip." msgstr "冷却管中心点与挤出机尖端的距离。" -#: src/libslic3r/PrintConfig.cpp:627 +#: src/libslic3r/PrintConfig.cpp:730 msgid "Cooling tube length" msgstr "冷却管长度" -#: src/libslic3r/PrintConfig.cpp:628 +#: src/libslic3r/PrintConfig.cpp:731 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "冷却管的长度,以限制冷却管内部的冷却移动空间。" -#: src/libslic3r/PrintConfig.cpp:636 +#: src/libslic3r/PrintConfig.cpp:739 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " @@ -10890,11 +12729,11 @@ msgstr "" "这是打印机在使用特定于角色的加速值(周长/填充)后将重置为的加速。设置零以防止" "重置加速度。" -#: src/libslic3r/PrintConfig.cpp:645 +#: src/libslic3r/PrintConfig.cpp:748 msgid "Default filament profile" msgstr "默认耗材配置文件" -#: src/libslic3r/PrintConfig.cpp:646 +#: src/libslic3r/PrintConfig.cpp:749 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " @@ -10903,12 +12742,12 @@ msgstr "" "与当前打印机配置文件关联的默认耗材配置文件。在选择当前打印机配置文件时, 将激" "活此耗材丝配置文件。" -#: src/libslic3r/PrintConfig.cpp:652 +#: src/libslic3r/PrintConfig.cpp:755 msgid "Default print profile" msgstr "默认打印配置文件" -#: src/libslic3r/PrintConfig.cpp:653 src/libslic3r/PrintConfig.cpp:3542 -#: src/libslic3r/PrintConfig.cpp:3553 +#: src/libslic3r/PrintConfig.cpp:756 src/libslic3r/PrintConfig.cpp:3819 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -10917,36 +12756,36 @@ msgstr "" "与当前打印机配置文件关联的默认打印配置文件。选择当前打印机配置文件时,将激活" "此打印配置文件。" -#: src/libslic3r/PrintConfig.cpp:659 +#: src/libslic3r/PrintConfig.cpp:762 msgid "Disable fan for the first" msgstr "禁用风扇在前" -#: src/libslic3r/PrintConfig.cpp:660 +#: src/libslic3r/PrintConfig.cpp:763 msgid "" "You can set this to a positive value to disable fan at all during the first " "layers, so that it does not make adhesion worse." msgstr "" "您可以将此值设置为正值,以便在初始图层期间完全禁用风扇,以免使粘附性恶化。" -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:772 msgid "Don't support bridges" msgstr "不支持桥接" -#: src/libslic3r/PrintConfig.cpp:671 +#: src/libslic3r/PrintConfig.cpp:774 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." msgstr "防止在桥接区域下生成支撑材料的实验选项。" -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:780 msgid "Distance between copies" msgstr "副本之间的距离" -#: src/libslic3r/PrintConfig.cpp:678 +#: src/libslic3r/PrintConfig.cpp:781 msgid "Distance used for the auto-arrange feature of the plater." msgstr "用于构建板自动排列功能的距离。" -#: src/libslic3r/PrintConfig.cpp:686 +#: src/libslic3r/PrintConfig.cpp:789 msgid "" "This end procedure is inserted at the end of the output file. Note that you " "can use placeholder variables for all PrusaSlicer settings." @@ -10954,7 +12793,7 @@ msgstr "" "此结束过程插入到输出文件的末尾。请注意,您可以将占位符变量用于所有 " "PrusaSlicer 设置。" -#: src/libslic3r/PrintConfig.cpp:696 +#: src/libslic3r/PrintConfig.cpp:799 msgid "" "This end procedure is inserted at the end of the output file, before the " "printer end gcode (and before any toolchange from this filament in case of " @@ -10966,77 +12805,66 @@ msgstr "" "从该耗材换出任何工具之前)。请注意,您可以将占位符变量用于所有 PrusaSlicer 设" "置。如果您有多个挤出机,则按挤出机顺序处理 G-Code。" -#: src/libslic3r/PrintConfig.cpp:707 -msgid "Ensure vertical shell thickness" -msgstr "确保垂直外壳厚度" - -#: src/libslic3r/PrintConfig.cpp:709 -msgid "" -"Add solid infill near sloping surfaces to guarantee the vertical shell " -"thickness (top+bottom solid layers)." -msgstr "" -"在靠近倾斜表面附近添加实体填充,以保证垂直壳体厚度(顶部+底部实心层)。" - -#: src/libslic3r/PrintConfig.cpp:715 +#: src/libslic3r/PrintConfig.cpp:810 msgid "Top fill pattern" msgstr "顶部填充模式" -#: src/libslic3r/PrintConfig.cpp:717 +#: src/libslic3r/PrintConfig.cpp:812 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." msgstr "填充顶部填充的模式。这仅影响顶部可见图层,而不影响其相邻的实体壳。" -#: src/libslic3r/PrintConfig.cpp:728 src/libslic3r/PrintConfig.cpp:1169 -#: src/libslic3r/PrintConfig.cpp:2754 src/libslic3r/PrintConfig.cpp:2771 +#: src/libslic3r/PrintConfig.cpp:815 src/libslic3r/PrintConfig.cpp:1228 +#: src/libslic3r/PrintConfig.cpp:2776 src/libslic3r/PrintConfig.cpp:2791 msgid "Rectilinear" msgstr "直线" -#: src/libslic3r/PrintConfig.cpp:729 +#: src/libslic3r/PrintConfig.cpp:816 msgid "Monotonic" msgstr "单调的" -#: src/libslic3r/PrintConfig.cpp:730 +#: src/libslic3r/PrintConfig.cpp:817 msgid "Monotonic Lines" msgstr "" -#: src/libslic3r/PrintConfig.cpp:731 src/libslic3r/PrintConfig.cpp:1170 +#: src/libslic3r/PrintConfig.cpp:818 src/libslic3r/PrintConfig.cpp:1229 msgid "Aligned Rectilinear" msgstr "直线排列" -#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:1176 -#: src/libslic3r/PrintConfig.cpp:2772 +#: src/libslic3r/PrintConfig.cpp:819 src/libslic3r/PrintConfig.cpp:1235 +#: src/libslic3r/PrintConfig.cpp:2792 msgid "Concentric" msgstr "回环" -#: src/libslic3r/PrintConfig.cpp:733 src/libslic3r/PrintConfig.cpp:1180 +#: src/libslic3r/PrintConfig.cpp:820 src/libslic3r/PrintConfig.cpp:1239 msgid "Hilbert Curve" msgstr "希尔伯特曲线" -#: src/libslic3r/PrintConfig.cpp:734 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:821 src/libslic3r/PrintConfig.cpp:1240 msgid "Archimedean Chords" msgstr "阿基米德和弦" -#: src/libslic3r/PrintConfig.cpp:735 src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:822 src/libslic3r/PrintConfig.cpp:1241 msgid "Octagram Spiral" msgstr "八角螺旋" -#: src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:830 msgid "Bottom fill pattern" msgstr "底部填充模式" -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:832 msgid "" "Fill pattern for bottom infill. This only affects the bottom external " "visible layer, and not its adjacent solid shells." msgstr "填充底部填充的模式。这仅影响底部外部可见图层,而不影响其相邻的实体壳。" -#: src/libslic3r/PrintConfig.cpp:753 src/libslic3r/PrintConfig.cpp:765 -#: src/libslic3r/PrintConfig.cpp:1988 +#: src/libslic3r/PrintConfig.cpp:839 src/libslic3r/PrintConfig.cpp:851 +#: src/libslic3r/PrintConfig.cpp:2018 msgid "External perimeters" msgstr "外部轮廓" -#: src/libslic3r/PrintConfig.cpp:755 +#: src/libslic3r/PrintConfig.cpp:841 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " "perimeters. If left zero, default extrusion width will be used if set, " @@ -11047,18 +12875,18 @@ msgstr "" "度, 如果没有设置默认值将使用 1.125x 喷嘴直径。如果以百分比表示 (例如 200%), " "则将根据图层高度计算。" -#: src/libslic3r/PrintConfig.cpp:758 src/libslic3r/PrintConfig.cpp:869 -#: src/libslic3r/PrintConfig.cpp:1223 src/libslic3r/PrintConfig.cpp:1445 -#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1529 -#: src/libslic3r/PrintConfig.cpp:2011 src/libslic3r/PrintConfig.cpp:2397 -#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2660 -#: src/libslic3r/PrintConfig.cpp:2895 src/libslic3r/PrintConfig.cpp:3117 -#: src/libslic3r/PrintConfig.cpp:3132 src/libslic3r/PrintConfig.cpp:3166 -#: src/libslic3r/PrintConfig.cpp:3178 +#: src/libslic3r/PrintConfig.cpp:844 src/libslic3r/PrintConfig.cpp:958 +#: src/libslic3r/PrintConfig.cpp:1283 src/libslic3r/PrintConfig.cpp:1491 +#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1570 +#: src/libslic3r/PrintConfig.cpp:2041 src/libslic3r/PrintConfig.cpp:2428 +#: src/libslic3r/PrintConfig.cpp:2601 src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2983 src/libslic3r/PrintConfig.cpp:3204 +#: src/libslic3r/PrintConfig.cpp:3219 src/libslic3r/PrintConfig.cpp:3253 +#: src/libslic3r/PrintConfig.cpp:3265 msgid "mm or %" msgstr "mm 或 %" -#: src/libslic3r/PrintConfig.cpp:767 +#: src/libslic3r/PrintConfig.cpp:853 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " @@ -11067,28 +12895,22 @@ msgstr "" "此单独的设置将影响外部轮廓(可见轮廓)的速度。如果以百分比表示(例如:80%)它" "将在上述周界速度设置上计算。为自动设置为零。" -#: src/libslic3r/PrintConfig.cpp:770 src/libslic3r/PrintConfig.cpp:1245 -#: src/libslic3r/PrintConfig.cpp:1256 src/libslic3r/PrintConfig.cpp:2356 -#: src/libslic3r/PrintConfig.cpp:2409 src/libslic3r/PrintConfig.cpp:2740 -#: src/libslic3r/PrintConfig.cpp:2909 -msgid "mm/s or %" -msgstr "mm/s 或 %" - -#: src/libslic3r/PrintConfig.cpp:777 +#: src/libslic3r/PrintConfig.cpp:863 msgid "External perimeters first" msgstr "首先打印外部轮廓" -#: src/libslic3r/PrintConfig.cpp:779 +#: src/libslic3r/PrintConfig.cpp:865 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." msgstr "将轮廓周长从最外层的轮廓打印到最里面的轮廓,而不是默认的反向顺序。" -#: src/libslic3r/PrintConfig.cpp:785 +#: src/libslic3r/PrintConfig.cpp:871 msgid "Extra perimeters if needed" msgstr "如果需要,打印额外轮廓" -#: src/libslic3r/PrintConfig.cpp:787 +#: src/libslic3r/PrintConfig.cpp:873 +#, fuzzy msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " "keeps adding perimeters, until more than 70% of the loop immediately above " @@ -11097,7 +12919,18 @@ msgstr "" "在需要时添加更多轮廓,以避免倾斜的墙壁出现间隙,Slic3r 不断添加轮廓,直到支撑超" "过 70% 的正上方循环。" -#: src/libslic3r/PrintConfig.cpp:797 +#: src/libslic3r/PrintConfig.cpp:880 +msgid "Extra perimeters on overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:882 +msgid "" +"Detect overhang areas where bridges cannot be anchored, and fill them with " +"extra perimeter paths. These paths are anchored to the nearby non-overhang " +"area when possible." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:890 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " @@ -11106,7 +12939,7 @@ msgstr "" "要使用的挤出机(除非指定了更具体的挤出机设置)。此值覆盖轮廓和填充挤出机,但" "不覆盖支撑挤出机。" -#: src/libslic3r/PrintConfig.cpp:809 +#: src/libslic3r/PrintConfig.cpp:898 msgid "" "Set this to the vertical distance between your nozzle tip and (usually) the " "X carriage rods. In other words, this is the height of the clearance " @@ -11116,7 +12949,7 @@ msgstr "" "将此设置为喷嘴尖端和(通常)X 滑杆之间的垂直距离。换句话说,这是挤出机周围的" "间隙圆柱体的高度,它表示挤出机在与其他打印对象碰撞之前可以窥视的最大深度。" -#: src/libslic3r/PrintConfig.cpp:820 +#: src/libslic3r/PrintConfig.cpp:909 msgid "" "Set this to the clearance radius around your extruder. If the extruder is " "not centered, choose the largest value for safety. This setting is used to " @@ -11125,20 +12958,20 @@ msgstr "" "将此设置为挤出机周围的间隙半径。如果挤出机未居中,请选择最大安全值。此设置用" "于检查碰撞并在板中显示图形预览。" -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:919 msgid "Extruder Color" msgstr "挤出头颜色" -#: src/libslic3r/PrintConfig.cpp:831 src/libslic3r/PrintConfig.cpp:894 -#: src/libslic3r/PrintConfig.cpp:3394 +#: src/libslic3r/PrintConfig.cpp:920 src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:3666 msgid "This is only used in the Slic3r interface as a visual help." msgstr "这仅在 Slic3r 界面中用作视觉帮助。" -#: src/libslic3r/PrintConfig.cpp:837 +#: src/libslic3r/PrintConfig.cpp:926 msgid "Extruder offset" msgstr "挤出机偏移" -#: src/libslic3r/PrintConfig.cpp:838 +#: src/libslic3r/PrintConfig.cpp:927 msgid "" "If your firmware doesn't handle the extruder displacement you need the G-" "code to take it into account. This option lets you specify the displacement " @@ -11148,22 +12981,22 @@ msgstr "" "如果您的固件不处理挤出机位移位,则需要 G-Code 来考虑它。此选项允许您指定每个" "挤出机相对于第一个挤出机的位移。需要填写正坐标(它们将从 XY 坐标中减去)。" -#: src/libslic3r/PrintConfig.cpp:847 +#: src/libslic3r/PrintConfig.cpp:936 msgid "Extrusion axis" msgstr "挤出轴" -#: src/libslic3r/PrintConfig.cpp:848 +#: src/libslic3r/PrintConfig.cpp:937 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." msgstr "" "使用此选项可设置与打印机挤出机关联的轴字母(通常为 E,但某些打印机使用 A)。" -#: src/libslic3r/PrintConfig.cpp:853 +#: src/libslic3r/PrintConfig.cpp:942 msgid "Extrusion multiplier" msgstr "挤出乘数" -#: src/libslic3r/PrintConfig.cpp:854 +#: src/libslic3r/PrintConfig.cpp:943 msgid "" "This factor changes the amount of flow proportionally. You may need to tweak " "this setting to get nice surface finish and correct single wall widths. " @@ -11174,11 +13007,11 @@ msgstr "" "壁宽度。通常值介于 0.9 和 1.1 之间。如果您认为需要更改更多,请检查耗材直径和" "固件 E 步骤。" -#: src/libslic3r/PrintConfig.cpp:863 +#: src/libslic3r/PrintConfig.cpp:952 msgid "Default extrusion width" msgstr "默认挤出宽度" -#: src/libslic3r/PrintConfig.cpp:865 +#: src/libslic3r/PrintConfig.cpp:954 msgid "" "Set this to a non-zero value to allow a manual extrusion width. If left to " "zero, Slic3r derives extrusion widths from the nozzle diameter (see the " @@ -11190,11 +13023,11 @@ msgstr "" "挤出宽度(参见工具尖,了解周长挤出宽度、填充挤出宽度等)。如果以百分比表示" "(例如:230%),则将在图层高度上计算。" -#: src/libslic3r/PrintConfig.cpp:877 +#: src/libslic3r/PrintConfig.cpp:966 msgid "Keep fan always on" msgstr "始终保持风扇打开" -#: src/libslic3r/PrintConfig.cpp:878 +#: src/libslic3r/PrintConfig.cpp:967 msgid "" "If this is enabled, fan will never be disabled and will be kept running at " "least at its minimum speed. Useful for PLA, harmful for ABS." @@ -11202,11 +13035,11 @@ msgstr "" "如果启用此功能,风扇将永远不会被禁用,并且将保持至少以最低速度运行。对 PLA 有" "用,对 ABS 有害。" -#: src/libslic3r/PrintConfig.cpp:883 +#: src/libslic3r/PrintConfig.cpp:972 msgid "Enable fan if layer print time is below" msgstr "启用风扇,如果图层打印时间低于" -#: src/libslic3r/PrintConfig.cpp:884 +#: src/libslic3r/PrintConfig.cpp:973 msgid "" "If layer print time is estimated below this number of seconds, fan will be " "enabled and its speed will be calculated by interpolating the minimum and " @@ -11215,27 +13048,27 @@ msgstr "" "如果图层打印时间估计低于此秒数,则将启用风扇,并通过插值最小和最大速度来计算" "其速度。" -#: src/libslic3r/PrintConfig.cpp:886 src/libslic3r/PrintConfig.cpp:2344 +#: src/libslic3r/PrintConfig.cpp:975 src/libslic3r/PrintConfig.cpp:2375 msgid "approximate seconds" msgstr "近似秒" -#: src/libslic3r/PrintConfig.cpp:893 src/libslic3r/PrintConfig.cpp:3393 +#: src/libslic3r/PrintConfig.cpp:982 src/libslic3r/PrintConfig.cpp:3665 msgid "Color" msgstr "颜色" -#: src/libslic3r/PrintConfig.cpp:899 +#: src/libslic3r/PrintConfig.cpp:988 msgid "Filament notes" msgstr "耗材备注" -#: src/libslic3r/PrintConfig.cpp:900 +#: src/libslic3r/PrintConfig.cpp:989 msgid "You can put your notes regarding the filament here." msgstr "你可以把关于耗材的笔记放在这里。" -#: src/libslic3r/PrintConfig.cpp:908 src/libslic3r/PrintConfig.cpp:1821 +#: src/libslic3r/PrintConfig.cpp:997 src/libslic3r/PrintConfig.cpp:1858 msgid "Max volumetric speed" msgstr "最大体积速度" -#: src/libslic3r/PrintConfig.cpp:909 +#: src/libslic3r/PrintConfig.cpp:998 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " @@ -11244,46 +13077,46 @@ msgstr "" "此耗材允许的最大体积速度。将打印的最大体积速度限制为最小打印和耗材体积速度。" "设置为零,无限制。" -#: src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:1007 msgid "Loading speed" msgstr "加载速度" -#: src/libslic3r/PrintConfig.cpp:919 +#: src/libslic3r/PrintConfig.cpp:1008 msgid "Speed used for loading the filament on the wipe tower." msgstr "用于在擦料塔上装载耗材的速度。" -#: src/libslic3r/PrintConfig.cpp:926 +#: src/libslic3r/PrintConfig.cpp:1015 msgid "Loading speed at the start" msgstr "开始时加载速度" -#: src/libslic3r/PrintConfig.cpp:927 +#: src/libslic3r/PrintConfig.cpp:1016 msgid "Speed used at the very beginning of loading phase." msgstr "在加载阶段开始时使用的速度。" -#: src/libslic3r/PrintConfig.cpp:934 +#: src/libslic3r/PrintConfig.cpp:1023 msgid "Unloading speed" msgstr "卸载速度" -#: src/libslic3r/PrintConfig.cpp:935 +#: src/libslic3r/PrintConfig.cpp:1024 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." msgstr "用于卸载擦聊塔上的耗材的速度(不影响冲压后卸载的初始部分)。" -#: src/libslic3r/PrintConfig.cpp:943 +#: src/libslic3r/PrintConfig.cpp:1032 msgid "Unloading speed at the start" msgstr "开始时卸载速度" -#: src/libslic3r/PrintConfig.cpp:944 +#: src/libslic3r/PrintConfig.cpp:1033 msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "冲压后立即卸载耗材尖端的速度。" -#: src/libslic3r/PrintConfig.cpp:951 +#: src/libslic3r/PrintConfig.cpp:1040 msgid "Delay after unloading" msgstr "卸载后延迟" -#: src/libslic3r/PrintConfig.cpp:952 +#: src/libslic3r/PrintConfig.cpp:1041 msgid "" "Time to wait after the filament is unloaded. May help to get reliable " "toolchanges with flexible materials that may need more time to shrink to " @@ -11292,29 +13125,29 @@ msgstr "" "卸下耗材后等待的时间。通过弹性材料,可能需要更多时间缩小到原始尺寸,有助于获" "得可靠的挤出机更换。" -#: src/libslic3r/PrintConfig.cpp:961 +#: src/libslic3r/PrintConfig.cpp:1050 msgid "Number of cooling moves" msgstr "冷却移动次数" -#: src/libslic3r/PrintConfig.cpp:962 +#: src/libslic3r/PrintConfig.cpp:1051 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " "Specify desired number of these moves." msgstr "在冷却管中来回移动,使耗材冷却。指定这些移动的所需数量。" -#: src/libslic3r/PrintConfig.cpp:970 +#: src/libslic3r/PrintConfig.cpp:1059 msgid "Speed of the first cooling move" msgstr "第一次冷却移动的速度" -#: src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:1060 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "冷却运动正逐渐以这个速度加速。" -#: src/libslic3r/PrintConfig.cpp:978 +#: src/libslic3r/PrintConfig.cpp:1067 msgid "Minimal purge on wipe tower" msgstr "擦料塔上的最小清理量" -#: src/libslic3r/PrintConfig.cpp:979 +#: src/libslic3r/PrintConfig.cpp:1068 msgid "" "After a tool change, the exact position of the newly loaded filament inside " "the nozzle may not be known, and the filament pressure is likely not yet " @@ -11326,23 +13159,23 @@ msgstr "" "定。在将打印头清洗成填充物或填充对象之前,Slic3r 将始终将这些数量的材料放入擦" "料塔中, 以可靠地产生连续的填充物或填充对象。" -#: src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:1072 msgid "mm³" msgstr "mm³" -#: src/libslic3r/PrintConfig.cpp:989 +#: src/libslic3r/PrintConfig.cpp:1078 msgid "Speed of the last cooling move" msgstr "上次冷却移动的速度" -#: src/libslic3r/PrintConfig.cpp:990 +#: src/libslic3r/PrintConfig.cpp:1079 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "冷却移动正逐渐加速向此速度。" -#: src/libslic3r/PrintConfig.cpp:997 +#: src/libslic3r/PrintConfig.cpp:1086 msgid "Filament load time" msgstr "耗材加载时间" -#: src/libslic3r/PrintConfig.cpp:998 +#: src/libslic3r/PrintConfig.cpp:1087 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " "filament during a tool change (when executing the T code). This time is " @@ -11351,21 +13184,21 @@ msgstr "" "打印机固件 (或 Multi Material Unit 2.0) 在工具更换期间 (执行 T 代码时) 加载新" "耗材的时间。 G-Code 时间估计器将此时间添加到总打印时间中。" -#: src/libslic3r/PrintConfig.cpp:1005 +#: src/libslic3r/PrintConfig.cpp:1094 msgid "Ramming parameters" msgstr "冲击参数" -#: src/libslic3r/PrintConfig.cpp:1006 +#: src/libslic3r/PrintConfig.cpp:1095 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." msgstr "此字符串由 RammingDialog 编辑,包含冲压特定参数。" -#: src/libslic3r/PrintConfig.cpp:1012 +#: src/libslic3r/PrintConfig.cpp:1101 msgid "Filament unload time" msgstr "耗材卸载时间" -#: src/libslic3r/PrintConfig.cpp:1013 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " "filament during a tool change (when executing the T code). This time is " @@ -11374,7 +13207,7 @@ msgstr "" "打印机固件 (或 Multi Material Unit 2.0) 在工具更换期间 (执行 T 代码时) 卸载耗" "材的时间。 G-Code 时间估计器将此时间添加到总打印时间中。" -#: src/libslic3r/PrintConfig.cpp:1021 +#: src/libslic3r/PrintConfig.cpp:1110 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " @@ -11383,12 +13216,12 @@ msgstr "" "在此处输入您的耗材直径。需要比较好的精度,建议使用卡钳沿耗材进行多次测量,然" "后计算平均值。" -#: src/libslic3r/PrintConfig.cpp:1028 src/libslic3r/PrintConfig.cpp:3432 -#: src/libslic3r/PrintConfig.cpp:3433 +#: src/libslic3r/PrintConfig.cpp:1117 src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3710 msgid "Density" msgstr "密度" -#: src/libslic3r/PrintConfig.cpp:1029 +#: src/libslic3r/PrintConfig.cpp:1118 msgid "" "Enter your filament density here. This is only for statistical information. " "A decent way is to weigh a known length of filament and compute the ratio of " @@ -11398,41 +13231,41 @@ msgstr "" "在此处输入您的耗材密度。这仅用于统计信息。一个方法是称量已知长度的耗材,并计" "算长度与体积的比率。最好通过位移直接计算体积。" -#: src/libslic3r/PrintConfig.cpp:1032 +#: src/libslic3r/PrintConfig.cpp:1121 msgid "g/cm³" msgstr "g/cm³" -#: src/libslic3r/PrintConfig.cpp:1037 +#: src/libslic3r/PrintConfig.cpp:1126 msgid "Filament type" msgstr "耗材类型" -#: src/libslic3r/PrintConfig.cpp:1038 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "The filament material type for use in custom G-codes." msgstr "用于自定义 G-Codes 的耗材材料类型。" -#: src/libslic3r/PrintConfig.cpp:1066 +#: src/libslic3r/PrintConfig.cpp:1155 msgid "Soluble material" msgstr "可溶性材料" -#: src/libslic3r/PrintConfig.cpp:1067 +#: src/libslic3r/PrintConfig.cpp:1156 msgid "Soluble material is most likely used for a soluble support." msgstr "可溶性材料最有可能用于可溶性支撑。" -#: src/libslic3r/PrintConfig.cpp:1073 +#: src/libslic3r/PrintConfig.cpp:1162 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." msgstr "在此处输入每公斤耗材成本。这仅用于统计信息。" -#: src/libslic3r/PrintConfig.cpp:1074 +#: src/libslic3r/PrintConfig.cpp:1163 msgid "money/kg" msgstr "元/公斤" -#: src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1168 msgid "Spool weight" msgstr "线轴重量" -#: src/libslic3r/PrintConfig.cpp:1080 +#: src/libslic3r/PrintConfig.cpp:1169 msgid "" "Enter weight of the empty filament spool. One may weigh a partially consumed " "filament spool before printing and one may compare the measured weight with " @@ -11442,19 +13275,19 @@ msgstr "" "输入空耗材滑阀的重量。打印前,可以对部分消耗的耗材线轴进行称重,并将测量重量" "与耗材与线轴的计算重量进行比较,以确定线轴上的耗材量是否足以完成打印。" -#: src/libslic3r/PrintConfig.cpp:1084 +#: src/libslic3r/PrintConfig.cpp:1173 msgid "g" msgstr "g" -#: src/libslic3r/PrintConfig.cpp:1093 src/libslic3r/PrintConfig.cpp:3537 +#: src/libslic3r/PrintConfig.cpp:1182 src/libslic3r/PrintConfig.cpp:3814 msgid "(Unknown)" msgstr "(未知)" -#: src/libslic3r/PrintConfig.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:1186 msgid "Fill angle" msgstr "填充角度" -#: src/libslic3r/PrintConfig.cpp:1099 +#: src/libslic3r/PrintConfig.cpp:1188 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " @@ -11463,73 +13296,73 @@ msgstr "" "填充方向的默认基本角度。交叉阴影将应用于此。网桥将使用 Slic3r 可以检测到的最" "佳方向填充,因此此设置不会影响它们。" -#: src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1199 msgid "Fill density" msgstr "填充密度" -#: src/libslic3r/PrintConfig.cpp:1113 +#: src/libslic3r/PrintConfig.cpp:1201 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "内部填充的密度,表示在 0% - 100% 的范围内。" -#: src/libslic3r/PrintConfig.cpp:1148 +#: src/libslic3r/PrintConfig.cpp:1224 msgid "Fill pattern" msgstr "填充图案" -#: src/libslic3r/PrintConfig.cpp:1150 +#: src/libslic3r/PrintConfig.cpp:1226 msgid "Fill pattern for general low-density infill." msgstr "用于一般低密度填充的填充模式。" -#: src/libslic3r/PrintConfig.cpp:1171 src/libslic3r/PrintConfig.cpp:2803 +#: src/libslic3r/PrintConfig.cpp:1230 src/libslic3r/PrintConfig.cpp:2822 msgid "Grid" msgstr "网格" -#: src/libslic3r/PrintConfig.cpp:1173 +#: src/libslic3r/PrintConfig.cpp:1232 msgid "Stars" msgstr "星形" -#: src/libslic3r/PrintConfig.cpp:1174 +#: src/libslic3r/PrintConfig.cpp:1233 msgid "Cubic" msgstr "立方体" -#: src/libslic3r/PrintConfig.cpp:1175 +#: src/libslic3r/PrintConfig.cpp:1234 msgid "Line" msgstr "线" -#: src/libslic3r/PrintConfig.cpp:1177 src/libslic3r/PrintConfig.cpp:2756 +#: src/libslic3r/PrintConfig.cpp:1236 src/libslic3r/PrintConfig.cpp:2778 msgid "Honeycomb" msgstr "蜂窝" -#: src/libslic3r/PrintConfig.cpp:1178 +#: src/libslic3r/PrintConfig.cpp:1237 msgid "3D Honeycomb" msgstr "3D 蜂窝" -#: src/libslic3r/PrintConfig.cpp:1179 +#: src/libslic3r/PrintConfig.cpp:1238 msgid "Gyroid" msgstr "螺旋形" -#: src/libslic3r/PrintConfig.cpp:1183 +#: src/libslic3r/PrintConfig.cpp:1242 msgid "Adaptive Cubic" msgstr "自适应立方" -#: src/libslic3r/PrintConfig.cpp:1184 +#: src/libslic3r/PrintConfig.cpp:1243 msgid "Support Cubic" msgstr "支撑立方体" -#: src/libslic3r/PrintConfig.cpp:1185 +#: src/libslic3r/PrintConfig.cpp:1244 msgid "Lightning" msgstr "闪电" -#: src/libslic3r/PrintConfig.cpp:1190 +#: src/libslic3r/PrintConfig.cpp:1250 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." msgstr "这是打印机用于第一层的加速。设置为零以禁用第一层的加速度控制。" -#: src/libslic3r/PrintConfig.cpp:1198 +#: src/libslic3r/PrintConfig.cpp:1258 msgid "First object layer over raft interface" msgstr "筏接口上的第一个对象层" -#: src/libslic3r/PrintConfig.cpp:1199 +#: src/libslic3r/PrintConfig.cpp:1259 msgid "" "This is the acceleration your printer will use for first layer of object " "above raft interface. Set zero to disable acceleration control for first " @@ -11538,17 +13371,17 @@ msgstr "" "这是打印机将用于 raft 界面上方第一层对象的加速度。设置为零可禁用筏接口上方第" "一层物体的加速度控制。" -#: src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "First layer bed temperature" msgstr "第一层床温" -#: src/libslic3r/PrintConfig.cpp:1209 +#: src/libslic3r/PrintConfig.cpp:1269 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." msgstr "第一层加热构建板温度。将此设置为零以禁用输出中的床温控制命令。" -#: src/libslic3r/PrintConfig.cpp:1219 +#: src/libslic3r/PrintConfig.cpp:1279 msgid "" "Set this to a non-zero value to set a manual extrusion width for first " "layer. You can use this to force fatter extrudates for better adhesion. If " @@ -11559,7 +13392,7 @@ msgstr "" "以得到更好的附着力。如果以百分比表示 (例如 120%), 则将在第一层高度上计算。如" "果设置为零, 它将使用默认的挤出宽度。" -#: src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1293 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " @@ -11568,11 +13401,11 @@ msgstr "" "当以非常低的层高度打印时,您可能仍然希望打印较厚的底层,以提高非完美版的附着" "力和公差。" -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1301 msgid "First layer speed" msgstr "第一层速度" -#: src/libslic3r/PrintConfig.cpp:1242 +#: src/libslic3r/PrintConfig.cpp:1302 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " @@ -11581,11 +13414,11 @@ msgstr "" "如果以 mm/s 表示为绝对值,则此速度将应用于第一层的所有打印移动,而不管其类型" "如何。如果以百分比表示(例如:40%)它将缩放默认速度。" -#: src/libslic3r/PrintConfig.cpp:1252 +#: src/libslic3r/PrintConfig.cpp:1312 msgid "Speed of object first layer over raft interface" msgstr "第一层物体在筏板界面上的速度" -#: src/libslic3r/PrintConfig.cpp:1253 +#: src/libslic3r/PrintConfig.cpp:1313 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first object layer above raft interface, regardless " @@ -11595,11 +13428,11 @@ msgstr "" "如果以毫米/秒的绝对值表示,该速度将应用于 raft 界面上方第一个对象层的所有打印" "移动,无论其类型如何。如果以百分比(例如:40%)表示,它将缩放默认速度。" -#: src/libslic3r/PrintConfig.cpp:1263 +#: src/libslic3r/PrintConfig.cpp:1323 msgid "First layer nozzle temperature" msgstr "第一层喷嘴温度" -#: src/libslic3r/PrintConfig.cpp:1264 +#: src/libslic3r/PrintConfig.cpp:1324 msgid "" "Nozzle temperature for the first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " @@ -11608,11 +13441,11 @@ msgstr "" "第一层的喷嘴温度。如果要在打印期间手动控制温度,请将其设置为零,以禁用输出 G-" "Code 中的温度控制命令。" -#: src/libslic3r/PrintConfig.cpp:1272 +#: src/libslic3r/PrintConfig.cpp:1332 msgid "Full fan speed at layer" msgstr "层的全风扇速度" -#: src/libslic3r/PrintConfig.cpp:1273 +#: src/libslic3r/PrintConfig.cpp:1333 msgid "" "Fan speed will be ramped up linearly from zero at layer " "\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". " @@ -11624,33 +13457,33 @@ msgstr "" "第一层”,则“全风扇速度第一层”将被忽略,在这种情况下,风扇将在“禁用风扇第一" "层”+1层以最大允许速度运行。" -#: src/libslic3r/PrintConfig.cpp:1285 +#: src/libslic3r/PrintConfig.cpp:1345 msgid "Fuzzy skin type." msgstr "模糊皮肤类型。" -#: src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1348 msgid "Outside walls" msgstr "外墙" -#: src/libslic3r/PrintConfig.cpp:1293 +#: src/libslic3r/PrintConfig.cpp:1349 msgid "All walls" msgstr "所有的墙" -#: src/libslic3r/PrintConfig.cpp:1298 +#: src/libslic3r/PrintConfig.cpp:1355 msgid "Fuzzy skin thickness" msgstr "模糊皮肤厚度" -#: src/libslic3r/PrintConfig.cpp:1300 +#: src/libslic3r/PrintConfig.cpp:1357 msgid "" "The maximum distance that each skin point can be offset (both ways), " "measured perpendicular to the perimeter wall." msgstr "每个蒙皮点可以偏移的最大距离(双向),垂直于周界墙测量。" -#: src/libslic3r/PrintConfig.cpp:1308 +#: src/libslic3r/PrintConfig.cpp:1365 msgid "Fuzzy skin point distance" msgstr "模糊皮肤点距离" -#: src/libslic3r/PrintConfig.cpp:1310 +#: src/libslic3r/PrintConfig.cpp:1367 msgid "" "Perimeters will be split into multiple segments by inserting Fuzzy skin " "points. Lowering the Fuzzy skin point distance will increase the number of " @@ -11659,17 +13492,21 @@ msgstr "" "通过插入模糊皮肤点,周长将被分割成多个部分。降低“模糊皮肤点距离”(Fuzzy skin " "point distance)将增加周界墙上随机偏移的点的数量。" -#: src/libslic3r/PrintConfig.cpp:1318 +#: src/libslic3r/PrintConfig.cpp:1375 msgid "Fill gaps" msgstr "填补空白" -#: src/libslic3r/PrintConfig.cpp:1320 +#: src/libslic3r/PrintConfig.cpp:1377 msgid "" "Enables filling of gaps between perimeters and between the inner most " "perimeters and infill." msgstr "允许填充周长之间以及最内侧周长和填充之间的间隙。" -#: src/libslic3r/PrintConfig.cpp:1327 +#: src/libslic3r/PrintConfig.cpp:1382 +msgid "Gap fill" +msgstr "间隙填充" + +#: src/libslic3r/PrintConfig.cpp:1384 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " @@ -11678,11 +13515,11 @@ msgstr "" "使用短锯齿形移动来填补小缝隙的速度。保持合理的低值, 以避免过多的晃动和共振问" "题。设置为零, 以禁用间隙填充。" -#: src/libslic3r/PrintConfig.cpp:1335 +#: src/libslic3r/PrintConfig.cpp:1392 msgid "Verbose G-code" msgstr "详细 G-Code" -#: src/libslic3r/PrintConfig.cpp:1336 +#: src/libslic3r/PrintConfig.cpp:1393 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " @@ -11691,11 +13528,11 @@ msgstr "" "启用此选项可获取注释的 G-Code 文件,每行都由描述性文本解释。如果从 SD 卡打" "印,文件的额外权重可能会降低固件速度。" -#: src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1400 msgid "G-code flavor" msgstr "G-Code 风格" -#: src/libslic3r/PrintConfig.cpp:1344 +#: src/libslic3r/PrintConfig.cpp:1401 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " @@ -11705,15 +13542,15 @@ msgstr "" "某些 G/M 代码命令(包括温度控制和其他命令)并不通用。将此选项设置为打印机固件" "以获取兼容输出。\"无挤出\"风格可防止 PrusaSlicer 导出任何挤出值。" -#: src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1416 msgid "No extrusion" msgstr "无挤出" -#: src/libslic3r/PrintConfig.cpp:1376 +#: src/libslic3r/PrintConfig.cpp:1422 msgid "Label objects" msgstr "标记对象" -#: src/libslic3r/PrintConfig.cpp:1377 +#: src/libslic3r/PrintConfig.cpp:1423 msgid "" "Enable this to add comments into the G-Code labeling print moves with what " "object they belong to, which is useful for the Octoprint CancelObject " @@ -11724,19 +13561,19 @@ msgstr "" "的 CancelObject 插件很有用。此设置与单挤出机多材质设置和擦除到对象/擦除填充不" "兼容。" -#: src/libslic3r/PrintConfig.cpp:1384 +#: src/libslic3r/PrintConfig.cpp:1430 msgid "G-code substitutions" msgstr "G-Code 替换" -#: src/libslic3r/PrintConfig.cpp:1385 +#: src/libslic3r/PrintConfig.cpp:1431 msgid "Find / replace patterns in G-code lines and substitute them." msgstr "查找/替换 G-Code 行中的模式并替换它们。" -#: src/libslic3r/PrintConfig.cpp:1390 +#: src/libslic3r/PrintConfig.cpp:1436 msgid "High extruder current on filament swap" msgstr "耗材切换时的高挤出机电流" -#: src/libslic3r/PrintConfig.cpp:1391 +#: src/libslic3r/PrintConfig.cpp:1437 msgid "" "It may be beneficial to increase the extruder motor current during the " "filament exchange sequence to allow for rapid ramming feed rates and to " @@ -11745,29 +13582,39 @@ msgstr "" "在耗材切换序列中增加挤出机电机电流可能是有益的, 这样可以快速冲击进料速度, 并" "在用不良形状的尖端加载耗材时克服阻力。" -#: src/libslic3r/PrintConfig.cpp:1399 +#: src/libslic3r/PrintConfig.cpp:1445 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." msgstr "这是打印机用于填充的加速。设置为零以禁用填充的加速度控制。" -#: src/libslic3r/PrintConfig.cpp:1408 +#: src/libslic3r/PrintConfig.cpp:1453 src/libslic3r/PrintConfig.cpp:2423 +#: src/libslic3r/PrintConfig.cpp:2435 +msgid "Solid infill" +msgstr "实心填充" + +#: src/libslic3r/PrintConfig.cpp:1454 msgid "" "This is the acceleration your printer will use for solid infill. Set zero to " "use the value for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:2977 +#: src/libslic3r/PrintConfig.cpp:2990 +msgid "Top solid infill" +msgstr "顶部实心填充" + +#: src/libslic3r/PrintConfig.cpp:1463 msgid "" "This is the acceleration your printer will use for top solid infill. Set " "zero to use the value for solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1426 +#: src/libslic3r/PrintConfig.cpp:1472 msgid "Combine infill every" msgstr "合并填充层数" -#: src/libslic3r/PrintConfig.cpp:1428 +#: src/libslic3r/PrintConfig.cpp:1474 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." @@ -11775,15 +13622,15 @@ msgstr "" "此功能允许通过挤出较厚的填充层来组合填充并加快打印速度,同时保持薄轮廓,从而" "保持精度。" -#: src/libslic3r/PrintConfig.cpp:1431 +#: src/libslic3r/PrintConfig.cpp:1477 msgid "Combine infill every n layers" msgstr "混合填充每 n 个层" -#: src/libslic3r/PrintConfig.cpp:1437 +#: src/libslic3r/PrintConfig.cpp:1483 msgid "Length of the infill anchor" msgstr "填充锚点的长度" -#: src/libslic3r/PrintConfig.cpp:1439 +#: src/libslic3r/PrintConfig.cpp:1485 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -11801,35 +13648,35 @@ msgstr "" "且所取周长线段的长度仅限于此参数,但不超过“锚点长度”最大值。将此参数设置为" "零,以禁用连接到单个填充线的锚点周长。" -#: src/libslic3r/PrintConfig.cpp:1455 +#: src/libslic3r/PrintConfig.cpp:1495 msgid "0 (no open anchors)" msgstr "0 (没有锚点)" -#: src/libslic3r/PrintConfig.cpp:1456 src/libslic3r/PrintConfig.cpp:1479 +#: src/libslic3r/PrintConfig.cpp:1496 src/libslic3r/PrintConfig.cpp:1519 msgid "1 mm" msgstr "1 毫米" -#: src/libslic3r/PrintConfig.cpp:1457 src/libslic3r/PrintConfig.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:1520 msgid "2 mm" msgstr "2 毫米" -#: src/libslic3r/PrintConfig.cpp:1458 src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1498 src/libslic3r/PrintConfig.cpp:1521 msgid "5 mm" msgstr "5 毫米" -#: src/libslic3r/PrintConfig.cpp:1459 src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1499 src/libslic3r/PrintConfig.cpp:1522 msgid "10 mm" msgstr "10 毫米" -#: src/libslic3r/PrintConfig.cpp:1460 src/libslic3r/PrintConfig.cpp:1483 +#: src/libslic3r/PrintConfig.cpp:1500 src/libslic3r/PrintConfig.cpp:1523 msgid "1000 (unlimited)" msgstr "1000 (不限)" -#: src/libslic3r/PrintConfig.cpp:1465 +#: src/libslic3r/PrintConfig.cpp:1506 msgid "Maximum length of the infill anchor" msgstr "填充锚点的最大长度" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1508 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -11845,19 +13692,19 @@ msgstr "" "找不到比此参数短的周长线段,则填充线仅在一侧连接到周长线段,并且所采用的周长" "线段的长度仅限于 infl_anchor,但不超过此参数。将此参数设置为零以禁用锚点。" -#: src/libslic3r/PrintConfig.cpp:1478 +#: src/libslic3r/PrintConfig.cpp:1518 msgid "0 (not anchored)" msgstr "0 (没有锚点)" -#: src/libslic3r/PrintConfig.cpp:1488 +#: src/libslic3r/PrintConfig.cpp:1529 msgid "Infill extruder" msgstr "填充挤出机" -#: src/libslic3r/PrintConfig.cpp:1490 +#: src/libslic3r/PrintConfig.cpp:1531 msgid "The extruder to use when printing infill." msgstr "打印填充时要使用的挤出机。" -#: src/libslic3r/PrintConfig.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:1539 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill. If " "left zero, default extrusion width will be used if set, otherwise 1.125 x " @@ -11869,21 +13716,21 @@ msgstr "" "挤出宽度, 否则将使用 1.125x 喷嘴直径。你可能想使用更多的挤出物来加速填充, 使" "你的部件更结实。如果以百分比表示 (例如 90%), 则将在图层高度上计算。" -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1550 msgid "Infill before perimeters" msgstr "在填充前先打印轮廓" -#: src/libslic3r/PrintConfig.cpp:1510 +#: src/libslic3r/PrintConfig.cpp:1551 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." msgstr "此选项将切换轮廓和填充的打印顺序,使后者首先进行。" -#: src/libslic3r/PrintConfig.cpp:1515 +#: src/libslic3r/PrintConfig.cpp:1556 msgid "Only infill where needed" msgstr "仅在需要时填充" -#: src/libslic3r/PrintConfig.cpp:1517 +#: src/libslic3r/PrintConfig.cpp:1558 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " @@ -11892,11 +13739,11 @@ msgstr "" "此选项将填充限制为支撑顶部的实际需要区域(它将作为内部支撑材料)。如果启用," "由于涉及多个检查,将减慢 G-Code 的生成速度。" -#: src/libslic3r/PrintConfig.cpp:1524 +#: src/libslic3r/PrintConfig.cpp:1565 msgid "Infill/perimeters overlap" msgstr "填充/轮廓重叠" -#: src/libslic3r/PrintConfig.cpp:1526 +#: src/libslic3r/PrintConfig.cpp:1567 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -11907,23 +13754,23 @@ msgstr "" "要的,但反弹可能会导致差距。如果以百分比表示(例如:15%)它是在轮廓挤出宽度上" "计算的。" -#: src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "打印内部填充的速度。零为自动设置。" -#: src/libslic3r/PrintConfig.cpp:1545 +#: src/libslic3r/PrintConfig.cpp:1586 msgid "Inherits profile" msgstr "继承配置文件" -#: src/libslic3r/PrintConfig.cpp:1546 +#: src/libslic3r/PrintConfig.cpp:1587 msgid "Name of the profile, from which this profile inherits." msgstr "此配置文件从中继承的配置文件的名称。" -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1600 msgid "Interface shells" msgstr "接触面外壳" -#: src/libslic3r/PrintConfig.cpp:1560 +#: src/libslic3r/PrintConfig.cpp:1601 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " @@ -11932,61 +13779,61 @@ msgstr "" "强制在相邻材料/体积之间生成固体壳。适用于具有半透明材料或手动可溶性支撑材料的" "多挤出机打印。" -#: src/libslic3r/PrintConfig.cpp:1568 +#: src/libslic3r/PrintConfig.cpp:1609 msgid "Maximum width of a segmented region" msgstr "分段区域的最大宽度" -#: src/libslic3r/PrintConfig.cpp:1569 +#: src/libslic3r/PrintConfig.cpp:1610 msgid "Maximum width of a segmented region. Zero disables this feature." msgstr "分段区域的最大宽度。零将禁用此功能。" -#: src/libslic3r/PrintConfig.cpp:1570 src/libslic3r/PrintConfig.cpp:2189 -#: src/libslic3r/PrintConfig.cpp:2198 +#: src/libslic3r/PrintConfig.cpp:1611 src/libslic3r/PrintConfig.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2228 msgid "mm (zero to disable)" msgstr "mm (0 禁用)" -#: src/libslic3r/PrintConfig.cpp:1577 +#: src/libslic3r/PrintConfig.cpp:1618 msgid "Enable ironing" msgstr "启用熨烫" -#: src/libslic3r/PrintConfig.cpp:1578 +#: src/libslic3r/PrintConfig.cpp:1619 msgid "" "Enable ironing of the top layers with the hot print head for smooth surface" msgstr "使用热打印头熨烫顶层,使表面光滑" -#: src/libslic3r/PrintConfig.cpp:1584 src/libslic3r/PrintConfig.cpp:1586 +#: src/libslic3r/PrintConfig.cpp:1625 src/libslic3r/PrintConfig.cpp:1627 msgid "Ironing Type" msgstr "熨烫类型" -#: src/libslic3r/PrintConfig.cpp:1591 +#: src/libslic3r/PrintConfig.cpp:1629 msgid "All top surfaces" msgstr "所有顶面" -#: src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Topmost surface only" msgstr "仅最上面的表面" -#: src/libslic3r/PrintConfig.cpp:1593 +#: src/libslic3r/PrintConfig.cpp:1631 msgid "All solid surfaces" msgstr "所有实心表面" -#: src/libslic3r/PrintConfig.cpp:1598 +#: src/libslic3r/PrintConfig.cpp:1637 msgid "Flow rate" msgstr "流量" -#: src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Percent of a flow rate relative to object's normal layer height." msgstr "相对于对象正常层高度的流速百分比。" -#: src/libslic3r/PrintConfig.cpp:1608 +#: src/libslic3r/PrintConfig.cpp:1647 msgid "Spacing between ironing passes" msgstr "熨烫工序之间的间距" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1649 msgid "Distance between ironing lines" msgstr "熨烫线之间的距离" -#: src/libslic3r/PrintConfig.cpp:1627 +#: src/libslic3r/PrintConfig.cpp:1666 msgid "" "This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can " @@ -11997,11 +13844,11 @@ msgstr "" "前。请注意,您可以将占位符变量用于所有 Slic3r 设置以及 [layer_num] 和 " "[layer_z]。" -#: src/libslic3r/PrintConfig.cpp:1638 +#: src/libslic3r/PrintConfig.cpp:1677 msgid "Supports remaining times" msgstr "支持剩余时间" -#: src/libslic3r/PrintConfig.cpp:1639 +#: src/libslic3r/PrintConfig.cpp:1678 msgid "" "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " "intervals into the G-code to let the firmware show accurate remaining time. " @@ -12012,155 +13859,155 @@ msgstr "" "Code , 让固件显示准确的剩余时间。到目前为止, 只有 Prusa i3MK3 固件识别 M73。" "此外,i3MK3 固件支持 M73Qxx Sxx 的静音模式。" -#: src/libslic3r/PrintConfig.cpp:1647 +#: src/libslic3r/PrintConfig.cpp:1686 msgid "Supports stealth mode" msgstr "支持隐身模式" -#: src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1687 msgid "The firmware supports stealth mode" msgstr "固件支持隐身模式" -#: src/libslic3r/PrintConfig.cpp:1653 +#: src/libslic3r/PrintConfig.cpp:1692 msgid "How to apply limits" msgstr "如何应用限制" -#: src/libslic3r/PrintConfig.cpp:1654 +#: src/libslic3r/PrintConfig.cpp:1693 msgid "Purpose of Machine Limits" msgstr "机器限制的目的" -#: src/libslic3r/PrintConfig.cpp:1656 +#: src/libslic3r/PrintConfig.cpp:1695 msgid "How to apply the Machine Limits" msgstr "如何应用机器限制" -#: src/libslic3r/PrintConfig.cpp:1661 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "Emit to G-code" msgstr "发射到 G-Code" -#: src/libslic3r/PrintConfig.cpp:1662 +#: src/libslic3r/PrintConfig.cpp:1698 msgid "Use for time estimate" msgstr "用于时间估计" -#: src/libslic3r/PrintConfig.cpp:1663 +#: src/libslic3r/PrintConfig.cpp:1699 msgid "Ignore" msgstr "忽视" -#: src/libslic3r/PrintConfig.cpp:1686 +#: src/libslic3r/PrintConfig.cpp:1723 msgid "Maximum feedrate X" msgstr "最大进给率 X" -#: src/libslic3r/PrintConfig.cpp:1687 +#: src/libslic3r/PrintConfig.cpp:1724 msgid "Maximum feedrate Y" msgstr "最大进给率 Y" -#: src/libslic3r/PrintConfig.cpp:1688 +#: src/libslic3r/PrintConfig.cpp:1725 msgid "Maximum feedrate Z" msgstr "最大进给率 Z" -#: src/libslic3r/PrintConfig.cpp:1689 +#: src/libslic3r/PrintConfig.cpp:1726 msgid "Maximum feedrate E" msgstr "最大进给率 E" -#: src/libslic3r/PrintConfig.cpp:1692 +#: src/libslic3r/PrintConfig.cpp:1729 msgid "Maximum feedrate of the X axis" msgstr "X 轴的最大进给率" -#: src/libslic3r/PrintConfig.cpp:1693 +#: src/libslic3r/PrintConfig.cpp:1730 msgid "Maximum feedrate of the Y axis" msgstr "Y 轴的最大进给率" -#: src/libslic3r/PrintConfig.cpp:1694 +#: src/libslic3r/PrintConfig.cpp:1731 msgid "Maximum feedrate of the Z axis" msgstr "Z 轴的最大进给率" -#: src/libslic3r/PrintConfig.cpp:1695 +#: src/libslic3r/PrintConfig.cpp:1732 msgid "Maximum feedrate of the E axis" msgstr "E 轴的最大进给率" -#: src/libslic3r/PrintConfig.cpp:1703 +#: src/libslic3r/PrintConfig.cpp:1740 msgid "Maximum acceleration X" msgstr "最大加速度 X" -#: src/libslic3r/PrintConfig.cpp:1704 +#: src/libslic3r/PrintConfig.cpp:1741 msgid "Maximum acceleration Y" msgstr "最大加速度 Y" -#: src/libslic3r/PrintConfig.cpp:1705 +#: src/libslic3r/PrintConfig.cpp:1742 msgid "Maximum acceleration Z" msgstr "最大加速度 Z" -#: src/libslic3r/PrintConfig.cpp:1706 +#: src/libslic3r/PrintConfig.cpp:1743 msgid "Maximum acceleration E" msgstr "最大加速度 E" -#: src/libslic3r/PrintConfig.cpp:1709 +#: src/libslic3r/PrintConfig.cpp:1746 msgid "Maximum acceleration of the X axis" msgstr "X 轴的最大加速度" -#: src/libslic3r/PrintConfig.cpp:1710 +#: src/libslic3r/PrintConfig.cpp:1747 msgid "Maximum acceleration of the Y axis" msgstr "Y 轴的最大加速度" -#: src/libslic3r/PrintConfig.cpp:1711 +#: src/libslic3r/PrintConfig.cpp:1748 msgid "Maximum acceleration of the Z axis" msgstr "Z 轴的最大加速度" -#: src/libslic3r/PrintConfig.cpp:1712 +#: src/libslic3r/PrintConfig.cpp:1749 msgid "Maximum acceleration of the E axis" msgstr "E 轴的最大加速度" -#: src/libslic3r/PrintConfig.cpp:1720 +#: src/libslic3r/PrintConfig.cpp:1757 msgid "Maximum jerk X" msgstr "最大抖动 X" -#: src/libslic3r/PrintConfig.cpp:1721 +#: src/libslic3r/PrintConfig.cpp:1758 msgid "Maximum jerk Y" msgstr "最大抖动 Y" -#: src/libslic3r/PrintConfig.cpp:1722 +#: src/libslic3r/PrintConfig.cpp:1759 msgid "Maximum jerk Z" msgstr "最大抖动 Z" -#: src/libslic3r/PrintConfig.cpp:1723 +#: src/libslic3r/PrintConfig.cpp:1760 msgid "Maximum jerk E" msgstr "最大抖动 E" -#: src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:1763 msgid "Maximum jerk of the X axis" msgstr "X 轴的最大抖动" -#: src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1764 msgid "Maximum jerk of the Y axis" msgstr "Y 轴的最大抖动" -#: src/libslic3r/PrintConfig.cpp:1728 +#: src/libslic3r/PrintConfig.cpp:1765 msgid "Maximum jerk of the Z axis" msgstr "Z 轴的最大抖动" -#: src/libslic3r/PrintConfig.cpp:1729 +#: src/libslic3r/PrintConfig.cpp:1766 msgid "Maximum jerk of the E axis" msgstr "E 轴的最大抖动" -#: src/libslic3r/PrintConfig.cpp:1739 +#: src/libslic3r/PrintConfig.cpp:1776 msgid "Minimum feedrate when extruding" msgstr "挤出时的最小进给率" -#: src/libslic3r/PrintConfig.cpp:1741 +#: src/libslic3r/PrintConfig.cpp:1778 msgid "Minimum feedrate when extruding (M205 S)" msgstr "挤出时的最小进给率 (M205S)" -#: src/libslic3r/PrintConfig.cpp:1749 +#: src/libslic3r/PrintConfig.cpp:1786 msgid "Minimum travel feedrate" msgstr "最小移动进给率" -#: src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:1788 msgid "Minimum travel feedrate (M205 T)" msgstr "最小移动进给率 (M205T)" -#: src/libslic3r/PrintConfig.cpp:1759 +#: src/libslic3r/PrintConfig.cpp:1796 msgid "Maximum acceleration when extruding" msgstr "挤出时的最大加速度" -#: src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1798 msgid "" "Maximum acceleration when extruding (M204 P)\n" "\n" @@ -12171,31 +14018,31 @@ msgstr "" "\n" "Marlin(旧版)固件版本也将使用它作为行程加速度(M204T)。" -#: src/libslic3r/PrintConfig.cpp:1772 +#: src/libslic3r/PrintConfig.cpp:1809 msgid "Maximum acceleration when retracting" msgstr "回抽时的最大加速度" -#: src/libslic3r/PrintConfig.cpp:1774 +#: src/libslic3r/PrintConfig.cpp:1811 msgid "Maximum acceleration when retracting (M204 R)" msgstr "收回时的最大加速度(M204R)" -#: src/libslic3r/PrintConfig.cpp:1782 +#: src/libslic3r/PrintConfig.cpp:1819 msgid "Maximum acceleration for travel moves" msgstr "移动时的最大加速度" -#: src/libslic3r/PrintConfig.cpp:1784 +#: src/libslic3r/PrintConfig.cpp:1821 msgid "Maximum acceleration for travel moves (M204 T)" msgstr "行程移动的最大加速度(M204T)" -#: src/libslic3r/PrintConfig.cpp:1791 src/libslic3r/PrintConfig.cpp:1800 +#: src/libslic3r/PrintConfig.cpp:1828 src/libslic3r/PrintConfig.cpp:1837 msgid "Max" msgstr "最大" -#: src/libslic3r/PrintConfig.cpp:1792 +#: src/libslic3r/PrintConfig.cpp:1829 msgid "This setting represents the maximum speed of your fan." msgstr "此设置表示风扇的最大速度。" -#: src/libslic3r/PrintConfig.cpp:1801 +#: src/libslic3r/PrintConfig.cpp:1838 msgid "" "This is the highest printable layer height for this extruder, used to cap " "the variable layer height and support layer height. Maximum recommended " @@ -12206,11 +14053,11 @@ msgstr "" "层高度为挤出宽度的 75%,以实现合理的层间粘附。如果设置为 0,则层高度限制为喷" "嘴直径的 75%。" -#: src/libslic3r/PrintConfig.cpp:1811 +#: src/libslic3r/PrintConfig.cpp:1848 msgid "Max print speed" msgstr "最大打印速度" -#: src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1849 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " @@ -12219,17 +14066,17 @@ msgstr "" "将其他速度设置设置为 0 时,Slic3r 将自动计算最佳速度,以保持恒定的挤出压力。" "此实验设置用于设置您希望允许的最高打印速度。" -#: src/libslic3r/PrintConfig.cpp:1822 +#: src/libslic3r/PrintConfig.cpp:1859 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." msgstr "此实验设置用于设置挤出机支持的最大体积速度。" -#: src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1867 msgid "Max volumetric slope positive" msgstr "最大流量增加率" -#: src/libslic3r/PrintConfig.cpp:1831 +#: src/libslic3r/PrintConfig.cpp:1868 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from lower speed to higher speed. A value of 1.8 mm³/" @@ -12241,15 +14088,15 @@ msgstr "" "s² 的值可确保挤出速率从 1.8 mm³/s(挤出宽度 0.45 mm,挤出高度 0.2 mm,进给速" "率 20 mm/s)变为 5.4 mm³/s(进给速率 60 mm/s) 至少需要 2 秒。" -#: src/libslic3r/PrintConfig.cpp:1836 src/libslic3r/PrintConfig.cpp:1848 +#: src/libslic3r/PrintConfig.cpp:1873 src/libslic3r/PrintConfig.cpp:1885 msgid "mm³/s²" msgstr "mm³/s²" -#: src/libslic3r/PrintConfig.cpp:1842 +#: src/libslic3r/PrintConfig.cpp:1879 msgid "Max volumetric slope negative" msgstr "最大流量减少率" -#: src/libslic3r/PrintConfig.cpp:1843 +#: src/libslic3r/PrintConfig.cpp:1880 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from higher speed to lower speed. A value of 1.8 mm³/" @@ -12261,15 +14108,15 @@ msgstr "" "s² 的值可确保挤出速率从 5.4 mm³/s(挤出宽度 0.45 mm,挤出高度 0.2 mm,进给速" "率 60 mm/s)变为 1.8 mm³/s(进给速率 20 mm/s) 至少需要 2 秒。" -#: src/libslic3r/PrintConfig.cpp:1854 src/libslic3r/PrintConfig.cpp:1863 +#: src/libslic3r/PrintConfig.cpp:1891 src/libslic3r/PrintConfig.cpp:1900 msgid "Min" msgstr "最小" -#: src/libslic3r/PrintConfig.cpp:1855 +#: src/libslic3r/PrintConfig.cpp:1892 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "此设置表示风扇工作所需的最小 PWM。" -#: src/libslic3r/PrintConfig.cpp:1864 +#: src/libslic3r/PrintConfig.cpp:1901 msgid "" "This is the lowest printable layer height for this extruder and limits the " "resolution for variable layer height. Typical values are between 0.05 mm and " @@ -12278,19 +14125,19 @@ msgstr "" "这是此挤出机的最低可打印图层高度,并限制了可变图层高度的分辨率。典型值介于 " "0.05mm 和 0.1mm 之间。" -#: src/libslic3r/PrintConfig.cpp:1872 +#: src/libslic3r/PrintConfig.cpp:1909 msgid "Min print speed" msgstr "最小打印速度" -#: src/libslic3r/PrintConfig.cpp:1873 +#: src/libslic3r/PrintConfig.cpp:1910 msgid "Slic3r will not scale speed down below this speed." msgstr "Slic3r 不会将速度降低到低于此速度。" -#: src/libslic3r/PrintConfig.cpp:1880 +#: src/libslic3r/PrintConfig.cpp:1917 msgid "Minimal filament extrusion length" msgstr "最小耗材挤出长度" -#: src/libslic3r/PrintConfig.cpp:1881 +#: src/libslic3r/PrintConfig.cpp:1918 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " @@ -12299,55 +14146,52 @@ msgstr "" "生成不低于在底层消耗指定数量的耗材所需的裙圈数。对于多挤出机,此最小值适用于每" "个挤出机。" -#: src/libslic3r/PrintConfig.cpp:1890 +#: src/libslic3r/PrintConfig.cpp:1927 msgid "Configuration notes" msgstr "配置说明" -#: src/libslic3r/PrintConfig.cpp:1891 +#: src/libslic3r/PrintConfig.cpp:1928 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." msgstr "你可以把个人笔记放在这里。此文本将添加到 G-Code 标题注释中。" -#: src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:1938 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "这是挤出机喷嘴的直径(例如:0.5、0.35 等)" -#: src/libslic3r/PrintConfig.cpp:1906 +#: src/libslic3r/PrintConfig.cpp:1943 msgid "Host Type" msgstr "主机类型" -#: src/libslic3r/PrintConfig.cpp:1907 +#: src/libslic3r/PrintConfig.cpp:1944 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." msgstr "Slic3r 可以将 G-Code 文件上传到打印机主机。此字段必须包含主机的类型。" -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:1961 msgid "Only retract when crossing perimeters" msgstr "仅在跨越轮廓时回抽" -#: src/libslic3r/PrintConfig.cpp:1930 +#: src/libslic3r/PrintConfig.cpp:1962 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." msgstr "当打印路径不超出前一层的轮廓时(此时任何渗出物不可见),禁用回抽。" -#: src/libslic3r/PrintConfig.cpp:1937 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "" "This option will drop the temperature of the inactive extruders to prevent " -"oozing. It will enable a tall skirt automatically and move extruders outside " -"such skirt when changing temperatures." +"oozing. " msgstr "" -"此选项将降低不活动挤出机的温度, 以防止渗出。它将自动启用一条高大的裙边, 并在" -"温度变化时将挤出机移到这种裙边之外。" -#: src/libslic3r/PrintConfig.cpp:1944 +#: src/libslic3r/PrintConfig.cpp:1974 msgid "Output filename format" msgstr "输出文件名格式" -#: src/libslic3r/PrintConfig.cpp:1945 +#: src/libslic3r/PrintConfig.cpp:1975 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -12358,31 +14202,31 @@ msgstr "" "[fill_density] 密度等。您还可以使用 [timestamp],[year],[month],[day]," "[hour],[minute],[second],[version],[input_filename],[input_filename_base]。" -#: src/libslic3r/PrintConfig.cpp:1954 +#: src/libslic3r/PrintConfig.cpp:1984 msgid "Detect bridging perimeters" msgstr "检测桥接轮廓" -#: src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:1986 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." msgstr "用于调整悬伸的流量(将使用桥流)的实验选项,以应用桥速并启用风扇。" -#: src/libslic3r/PrintConfig.cpp:1962 +#: src/libslic3r/PrintConfig.cpp:1992 msgid "Filament parking position" msgstr "耗材停车位" -#: src/libslic3r/PrintConfig.cpp:1963 +#: src/libslic3r/PrintConfig.cpp:1993 msgid "" "Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware." msgstr "卸载时,挤出机尖端与耗材停放位置的距离。这应该与打印机固件中的值匹配。" -#: src/libslic3r/PrintConfig.cpp:1971 +#: src/libslic3r/PrintConfig.cpp:2001 msgid "Extra loading distance" msgstr "额外装载距离" -#: src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:2002 msgid "" "When set to zero, the distance the filament is moved from parking position " "during load is exactly the same as it was moved back during unload. When " @@ -12392,33 +14236,33 @@ msgstr "" "当设置为零时,耗材在负载期间与停车位置移动的距离与卸载期间移回的距离完全相" "同。当为正时,它进一步加载,如果为负,加载移动比卸载短。" -#: src/libslic3r/PrintConfig.cpp:1980 src/libslic3r/PrintConfig.cpp:2005 -#: src/libslic3r/PrintConfig.cpp:2019 src/libslic3r/PrintConfig.cpp:2029 +#: src/libslic3r/PrintConfig.cpp:2010 src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2049 src/libslic3r/PrintConfig.cpp:2059 msgid "Perimeters" msgstr "轮廓" -#: src/libslic3r/PrintConfig.cpp:1981 +#: src/libslic3r/PrintConfig.cpp:2011 msgid "" "This is the acceleration your printer will use for perimeters. Set zero to " "disable acceleration control for perimeters." msgstr "这是打印机将用于周长的加速度。设置为零可禁用周长的加速控制。" -#: src/libslic3r/PrintConfig.cpp:1989 +#: src/libslic3r/PrintConfig.cpp:2019 msgid "" "This is the acceleration your printer will use for external perimeters. Set " "zero to use the value for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1996 +#: src/libslic3r/PrintConfig.cpp:2026 msgid "Perimeter extruder" msgstr "轮廓挤出机" -#: src/libslic3r/PrintConfig.cpp:1998 +#: src/libslic3r/PrintConfig.cpp:2028 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "打印轮廓和外围裙边时使用的挤出机。第一个挤出机为 1。" -#: src/libslic3r/PrintConfig.cpp:2007 +#: src/libslic3r/PrintConfig.cpp:2037 msgid "" "Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. If " @@ -12430,12 +14274,12 @@ msgstr "" "更精确的表面。如果为零, 则如果设置, 将使用默认挤出宽度, 否则将使用 1.125x 喷" "嘴直径。如果以百分比表示 (例如 200%), 则将在图层高度上计算。" -#: src/libslic3r/PrintConfig.cpp:2021 +#: src/libslic3r/PrintConfig.cpp:2051 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "边界的速度 (等高线, 也称为垂直壳)。自动设置为零。" -#: src/libslic3r/PrintConfig.cpp:2031 +#: src/libslic3r/PrintConfig.cpp:2061 msgid "" "This option sets the number of perimeters to generate for each layer. Note " "that Slic3r may increase this number automatically when it detects sloping " @@ -12445,11 +14289,11 @@ msgstr "" "此选项设置要为每个图层生成的轮廓数。请注意,Slic3r 在检测到倾斜曲面时可能会自" "动增加此数字,如果启用了\"额外轮廓\"选项,则这些坡度曲面受益于较高的轮廓数。" -#: src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2065 msgid "(minimum)" msgstr "(最小)" -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "" "If you want to process the output G-code through custom scripts, just list " "their absolute paths here. Separate multiple scripts with a semicolon. " @@ -12461,90 +14305,90 @@ msgstr "" "号分隔多个脚本。脚本将作为第一个参数传递到 G-Code 文件的绝对路径, 并且它们可" "以通过读取环境变量访问 Slic3r 配置设置。" -#: src/libslic3r/PrintConfig.cpp:2055 +#: src/libslic3r/PrintConfig.cpp:2085 msgid "Printer type" msgstr "打印机类型" -#: src/libslic3r/PrintConfig.cpp:2056 +#: src/libslic3r/PrintConfig.cpp:2086 msgid "Type of the printer." msgstr "打印机的类型。" -#: src/libslic3r/PrintConfig.cpp:2061 +#: src/libslic3r/PrintConfig.cpp:2091 msgid "Printer notes" msgstr "打印机备注" -#: src/libslic3r/PrintConfig.cpp:2062 +#: src/libslic3r/PrintConfig.cpp:2092 msgid "You can put your notes regarding the printer here." msgstr "您可以在此处放置有关打印机的备注。" -#: src/libslic3r/PrintConfig.cpp:2070 +#: src/libslic3r/PrintConfig.cpp:2100 msgid "Printer vendor" msgstr "打印机供应商" -#: src/libslic3r/PrintConfig.cpp:2071 +#: src/libslic3r/PrintConfig.cpp:2101 msgid "Name of the printer vendor." msgstr "打印机供应商的名称。" -#: src/libslic3r/PrintConfig.cpp:2076 +#: src/libslic3r/PrintConfig.cpp:2106 msgid "Printer variant" msgstr "打印机版本" -#: src/libslic3r/PrintConfig.cpp:2077 +#: src/libslic3r/PrintConfig.cpp:2107 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." msgstr "打印机变体的版本。例如, 打印机版本可以通过喷嘴直径进行区分。" -#: src/libslic3r/PrintConfig.cpp:2094 +#: src/libslic3r/PrintConfig.cpp:2124 msgid "Raft contact Z distance" msgstr "筏板接触Z距离" -#: src/libslic3r/PrintConfig.cpp:2096 +#: src/libslic3r/PrintConfig.cpp:2126 msgid "" "The vertical distance between object and raft. Ignored for soluble interface." msgstr "物体与木筏之间的垂直距离。对于可溶解的界面忽略。" -#: src/libslic3r/PrintConfig.cpp:2103 +#: src/libslic3r/PrintConfig.cpp:2133 msgid "Raft expansion" msgstr "筏式膨胀" -#: src/libslic3r/PrintConfig.cpp:2105 +#: src/libslic3r/PrintConfig.cpp:2135 msgid "Expansion of the raft in XY plane for better stability." msgstr "在 XY 平面上扩展筏板,以获得更好的稳定性。" -#: src/libslic3r/PrintConfig.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:2142 msgid "First layer density" msgstr "第一层密度" -#: src/libslic3r/PrintConfig.cpp:2114 +#: src/libslic3r/PrintConfig.cpp:2144 msgid "Density of the first raft or support layer." msgstr "第一个筏板或支撑层的密度。" -#: src/libslic3r/PrintConfig.cpp:2122 +#: src/libslic3r/PrintConfig.cpp:2152 msgid "First layer expansion" msgstr "第一层扩展" -#: src/libslic3r/PrintConfig.cpp:2124 +#: src/libslic3r/PrintConfig.cpp:2154 msgid "" "Expansion of the first raft or support layer to improve adhesion to print " "bed." msgstr "扩展第一层筏板或支撑层,以提高与印刷床的附着力。" -#: src/libslic3r/PrintConfig.cpp:2131 +#: src/libslic3r/PrintConfig.cpp:2161 msgid "Raft layers" msgstr "筏层" -#: src/libslic3r/PrintConfig.cpp:2133 +#: src/libslic3r/PrintConfig.cpp:2163 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." msgstr "对象将相对此层数抬高,并在其下生成支撑材料。" -#: src/libslic3r/PrintConfig.cpp:2141 +#: src/libslic3r/PrintConfig.cpp:2171 msgid "Slice resolution" msgstr "切片分辨率" -#: src/libslic3r/PrintConfig.cpp:2142 +#: src/libslic3r/PrintConfig.cpp:2172 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -12554,11 +14398,11 @@ msgstr "" "最小细节分辨率,用于简化输入文件以加快切片作业和减少内存使用量。高分辨率模型" "通常携带比打印机渲染更多的细节。设置为零以禁用任何简化并使用输入的全分辨率。" -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:2182 msgid "G-code resolution" msgstr "G-Code 解析" -#: src/libslic3r/PrintConfig.cpp:2153 +#: src/libslic3r/PrintConfig.cpp:2183 msgid "" "Maximum deviation of exported G-code paths from their full resolution " "counterparts. Very high resolution G-code requires huge amount of RAM to " @@ -12573,53 +14417,53 @@ msgstr "" "Code 而结巴。另一方面,低分辨率 G-Code 将产生低多边形效果,并且由于 G-Code 缩" "减在每一层独立地执行,因此可能会产生可见的伪影。" -#: src/libslic3r/PrintConfig.cpp:2164 +#: src/libslic3r/PrintConfig.cpp:2194 msgid "Minimum travel after retraction" msgstr "回抽最小行程" -#: src/libslic3r/PrintConfig.cpp:2165 +#: src/libslic3r/PrintConfig.cpp:2195 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "当打印移动短于此长度时,不会触发回抽。" -#: src/libslic3r/PrintConfig.cpp:2171 +#: src/libslic3r/PrintConfig.cpp:2201 msgid "Retract amount before wipe" msgstr "擦拭前的回抽量" -#: src/libslic3r/PrintConfig.cpp:2172 +#: src/libslic3r/PrintConfig.cpp:2202 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." msgstr "对于远程挤出机, 在做擦拭动作之前, 做一些快速的收回可能是明智的。" -#: src/libslic3r/PrintConfig.cpp:2179 +#: src/libslic3r/PrintConfig.cpp:2209 msgid "Retract on layer change" msgstr "在图层更改时回抽" -#: src/libslic3r/PrintConfig.cpp:2180 +#: src/libslic3r/PrintConfig.cpp:2210 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "每当完成 Z 移动时,都会强制回抽。" -#: src/libslic3r/PrintConfig.cpp:2185 src/libslic3r/PrintConfig.cpp:2193 +#: src/libslic3r/PrintConfig.cpp:2215 src/libslic3r/PrintConfig.cpp:2223 msgid "Length" msgstr "长度" -#: src/libslic3r/PrintConfig.cpp:2186 +#: src/libslic3r/PrintConfig.cpp:2216 msgid "Retraction Length" msgstr "回抽长度" -#: src/libslic3r/PrintConfig.cpp:2187 +#: src/libslic3r/PrintConfig.cpp:2217 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " "extruder)." msgstr "触发回抽时,耗材按指定量拉回(长度在进入挤出机之前在原始耗材上测量)。" -#: src/libslic3r/PrintConfig.cpp:2194 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Retraction Length (Toolchange)" msgstr "回抽长度 (工具更换)" -#: src/libslic3r/PrintConfig.cpp:2195 +#: src/libslic3r/PrintConfig.cpp:2225 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " @@ -12628,11 +14472,11 @@ msgstr "" "在更换热头之前触发回抽时,耗材按指定量拉回(长度在进入挤出机之前在原始耗材上" "测量)。" -#: src/libslic3r/PrintConfig.cpp:2203 +#: src/libslic3r/PrintConfig.cpp:2233 msgid "Lift Z" msgstr "提升 Z" -#: src/libslic3r/PrintConfig.cpp:2204 +#: src/libslic3r/PrintConfig.cpp:2234 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " @@ -12641,15 +14485,15 @@ msgstr "" "如果将此值设置为正值,则每次触发回抽时都会快速引发 Z。使用多个挤出机时,仅考" "虑第一个挤出机的设置。" -#: src/libslic3r/PrintConfig.cpp:2211 +#: src/libslic3r/PrintConfig.cpp:2241 msgid "Above Z" msgstr "Z 高于" -#: src/libslic3r/PrintConfig.cpp:2212 +#: src/libslic3r/PrintConfig.cpp:2242 msgid "Only lift Z above" msgstr "仅提升 Z 高于" -#: src/libslic3r/PrintConfig.cpp:2213 +#: src/libslic3r/PrintConfig.cpp:2243 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " @@ -12658,15 +14502,15 @@ msgstr "" "如果将此值设置为正值,则 Z 提升将仅发生在指定的绝对 Z 上方。您可以调整此设置" "以跳过第一个图层上的提升。" -#: src/libslic3r/PrintConfig.cpp:2220 +#: src/libslic3r/PrintConfig.cpp:2250 msgid "Below Z" msgstr "Z 低于" -#: src/libslic3r/PrintConfig.cpp:2221 +#: src/libslic3r/PrintConfig.cpp:2251 msgid "Only lift Z below" msgstr "仅提升 Z 低于" -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2252 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " @@ -12675,36 +14519,36 @@ msgstr "" "如果将此值设置为正值,则 Z 提升将仅发生在指定的绝对 Z 以下。您可以调整此设" "置,将提升限制为第一个图层。" -#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2238 +#: src/libslic3r/PrintConfig.cpp:2260 src/libslic3r/PrintConfig.cpp:2268 msgid "Extra length on restart" msgstr "重新启动时的额外长度" -#: src/libslic3r/PrintConfig.cpp:2231 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." msgstr "" "当回抽在打印后得到补偿时,挤出机将推进这个额外的耗材量。很少需要此设置。" -#: src/libslic3r/PrintConfig.cpp:2239 +#: src/libslic3r/PrintConfig.cpp:2269 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." msgstr "当更换热头后补偿回抽时,挤出机将推进这额外的耗材量。" -#: src/libslic3r/PrintConfig.cpp:2246 src/libslic3r/PrintConfig.cpp:2247 +#: src/libslic3r/PrintConfig.cpp:2276 src/libslic3r/PrintConfig.cpp:2277 msgid "Retraction Speed" msgstr "回抽速度" -#: src/libslic3r/PrintConfig.cpp:2248 +#: src/libslic3r/PrintConfig.cpp:2278 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "回抽速度 (仅适用于挤出机电机)。" -#: src/libslic3r/PrintConfig.cpp:2254 src/libslic3r/PrintConfig.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:2284 src/libslic3r/PrintConfig.cpp:2285 msgid "Deretraction Speed" msgstr "减速速度" -#: src/libslic3r/PrintConfig.cpp:2256 +#: src/libslic3r/PrintConfig.cpp:2286 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " @@ -12713,68 +14557,82 @@ msgstr "" "收回后将耗材装入挤出机的速度 (仅适用于挤出机电机)。如果保持为零, 则使用回抽速" "度。" -#: src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2293 msgid "Seam position" msgstr "接缝位置" -#: src/libslic3r/PrintConfig.cpp:2265 +#: src/libslic3r/PrintConfig.cpp:2295 msgid "Position of perimeters starting points." msgstr "轮廓起点的位置。" -#: src/libslic3r/PrintConfig.cpp:2272 +#: src/libslic3r/PrintConfig.cpp:2297 +msgid "Random" +msgstr "随机" + +#: src/libslic3r/PrintConfig.cpp:2298 msgid "Nearest" msgstr "最近的" -#: src/libslic3r/PrintConfig.cpp:2273 +#: src/libslic3r/PrintConfig.cpp:2299 msgid "Aligned" msgstr "对齐" -#: src/libslic3r/PrintConfig.cpp:2281 +#: src/libslic3r/PrintConfig.cpp:2306 +msgid "Staggered inner seams" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2307 +msgid "" +"This option causes the inner seams to be shifted backwards based on their " +"depth, forming a zigzag pattern." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2314 msgid "Direction" msgstr "方向" -#: src/libslic3r/PrintConfig.cpp:2283 +#: src/libslic3r/PrintConfig.cpp:2316 msgid "Preferred direction of the seam" msgstr "接缝的首选方向" -#: src/libslic3r/PrintConfig.cpp:2284 +#: src/libslic3r/PrintConfig.cpp:2317 msgid "Seam preferred direction" msgstr "接缝首选方向" -#: src/libslic3r/PrintConfig.cpp:2291 +#: src/libslic3r/PrintConfig.cpp:2324 msgid "Jitter" msgstr "抖动" -#: src/libslic3r/PrintConfig.cpp:2293 +#: src/libslic3r/PrintConfig.cpp:2326 msgid "Seam preferred direction jitter" msgstr "接缝首选方向抖动" -#: src/libslic3r/PrintConfig.cpp:2294 +#: src/libslic3r/PrintConfig.cpp:2327 msgid "Preferred direction of the seam - jitter" msgstr "接缝的首选方向 - 抖动" -#: src/libslic3r/PrintConfig.cpp:2301 +#: src/libslic3r/PrintConfig.cpp:2334 msgid "Distance from brim/object" msgstr "与裙边/物体的距离" -#: src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2335 msgid "" "Distance between skirt and brim (when draft shield is not used) or objects." msgstr "环绕和裙边之间的距离(不使用导流板时)或物体。" -#: src/libslic3r/PrintConfig.cpp:2308 +#: src/libslic3r/PrintConfig.cpp:2341 msgid "Skirt height" msgstr "环绕高度" -#: src/libslic3r/PrintConfig.cpp:2309 +#: src/libslic3r/PrintConfig.cpp:2342 msgid "Height of skirt expressed in layers." msgstr "环绕的高度以层表示。" -#: src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2348 msgid "Draft shield" msgstr "风挡" -#: src/libslic3r/PrintConfig.cpp:2316 +#: src/libslic3r/PrintConfig.cpp:2349 msgid "" "With draft shield active, the skirt will be printed skirt_distance from the " "object, possibly intersecting brim.\n" @@ -12789,27 +14647,27 @@ msgstr "" "Limited=裙摆的高度与裙摆高度相同。\n" "这有助于保护 ABS 或 ASA 印刷品不因风的牵伸而翘曲或从打印床上脱落。" -#: src/libslic3r/PrintConfig.cpp:2324 +#: src/libslic3r/PrintConfig.cpp:2354 msgid "Disabled" msgstr "禁用" -#: src/libslic3r/PrintConfig.cpp:2325 +#: src/libslic3r/PrintConfig.cpp:2355 msgid "Limited" msgstr "限制" -#: src/libslic3r/PrintConfig.cpp:2326 +#: src/libslic3r/PrintConfig.cpp:2356 msgid "Enabled" msgstr "启用" -#: src/libslic3r/PrintConfig.cpp:2331 +#: src/libslic3r/PrintConfig.cpp:2362 msgid "Loops (minimum)" msgstr "圈数(最小值)" -#: src/libslic3r/PrintConfig.cpp:2332 +#: src/libslic3r/PrintConfig.cpp:2363 msgid "Skirt Loops" msgstr "裙边圈数" -#: src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2364 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " @@ -12818,22 +14676,22 @@ msgstr "" "裙边的循环数。如果设置了\"最小挤出长度\"选项,则循环数可能大于此处配置的循环" "数。设置为零以完全禁用裙边。" -#: src/libslic3r/PrintConfig.cpp:2341 +#: src/libslic3r/PrintConfig.cpp:2372 msgid "Slow down if layer print time is below" msgstr "如果图层打印时间低于" -#: src/libslic3r/PrintConfig.cpp:2342 +#: src/libslic3r/PrintConfig.cpp:2373 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." msgstr "" "如果图层打印时间估计低于此秒数,则打印移动速度将缩小以将持续时间扩展到此值。" -#: src/libslic3r/PrintConfig.cpp:2351 +#: src/libslic3r/PrintConfig.cpp:2382 msgid "Small perimeters" msgstr "小边界" -#: src/libslic3r/PrintConfig.cpp:2353 +#: src/libslic3r/PrintConfig.cpp:2384 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " @@ -12842,33 +14700,33 @@ msgstr "" "此单独设置将影响半径为 <= 6.5mm (通常为孔) 的边界的速度。如果以百分比表示 (例" "如: 80%), 则将根据上面的边界速度设置进行计算。自动设置为零。" -#: src/libslic3r/PrintConfig.cpp:2363 +#: src/libslic3r/PrintConfig.cpp:2394 msgid "Solid infill threshold area" msgstr "实心填充阈值区域" -#: src/libslic3r/PrintConfig.cpp:2365 +#: src/libslic3r/PrintConfig.cpp:2396 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." msgstr "对面积小于指定阈值的区域强制实心填充。" -#: src/libslic3r/PrintConfig.cpp:2366 +#: src/libslic3r/PrintConfig.cpp:2397 msgid "mm²" msgstr "mm²" -#: src/libslic3r/PrintConfig.cpp:2372 +#: src/libslic3r/PrintConfig.cpp:2403 msgid "Solid infill extruder" msgstr "实心填充挤出机" -#: src/libslic3r/PrintConfig.cpp:2374 +#: src/libslic3r/PrintConfig.cpp:2405 msgid "The extruder to use when printing solid infill." msgstr "打印实体填充时使用的挤出机。" -#: src/libslic3r/PrintConfig.cpp:2380 +#: src/libslic3r/PrintConfig.cpp:2411 msgid "Solid infill every" msgstr "固体填充每个" -#: src/libslic3r/PrintConfig.cpp:2382 +#: src/libslic3r/PrintConfig.cpp:2413 msgid "" "This feature allows to force a solid layer every given number of layers. " "Zero to disable. You can set this to any value (for example 9999); Slic3r " @@ -12878,7 +14736,7 @@ msgstr "" "此功能允许强制每个给定数量的图层的实心图层。要禁用的零。您可以将其设置为任何" "值(例如 9999);Slic3r 将根据喷嘴直径和层高度自动选择要合并的最大层数。" -#: src/libslic3r/PrintConfig.cpp:2394 +#: src/libslic3r/PrintConfig.cpp:2425 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "solid surfaces. If left zero, default extrusion width will be used if set, " @@ -12889,7 +14747,7 @@ msgstr "" "将使用默认挤出宽度,否则将使用 1.125x 喷嘴直径。如果以百分比表示(例如 90%)" "它将在层高度上计算。" -#: src/libslic3r/PrintConfig.cpp:2406 +#: src/libslic3r/PrintConfig.cpp:2437 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " @@ -12898,19 +14756,19 @@ msgstr "" "打印实体区域的速度(顶部/底部/内部水平壳体)。这可以表示为百分比(例如:80%)" "超过上述默认填充速度。为自动设置为零。" -#: src/libslic3r/PrintConfig.cpp:2418 +#: src/libslic3r/PrintConfig.cpp:2449 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "要在顶部和底部曲面上生成的实心图层数。" -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2455 src/libslic3r/PrintConfig.cpp:2456 msgid "Minimum thickness of a top / bottom shell" msgstr "顶部/底部外壳的最小厚度" -#: src/libslic3r/PrintConfig.cpp:2431 +#: src/libslic3r/PrintConfig.cpp:2462 msgid "Spiral vase" msgstr "螺旋花瓶" -#: src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2463 msgid "" "This feature will raise Z gradually while printing a single-walled object in " "order to remove any visible seam. This option requires a single perimeter, " @@ -12922,20 +14780,17 @@ msgstr "" "填充、无顶部实体层和无支撑材料。您仍然可以设置任意数量的底部实体层以及裙子/帽" "檐环。当打印多个对象时,它将不起作用。" -#: src/libslic3r/PrintConfig.cpp:2440 +#: src/libslic3r/PrintConfig.cpp:2471 msgid "Temperature variation" msgstr "温度变化" -#: src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:2472 msgid "" -"Temperature difference to be applied when an extruder is not active. Enables " -"a full-height \"sacrificial\" skirt on which the nozzles are periodically " -"wiped." +"Temperature difference to be applied when an extruder is not active. The " +"value is not used when 'idle_temperature' in filament settings is defined." msgstr "" -"当挤出机处于非活动状态时, 要应用温差。启用全高的 \"牺牲\" 裙边, 定期擦拭喷" -"嘴。" -#: src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2483 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -12951,7 +14806,7 @@ msgstr "" "位符变量用于所有 PrusaSlicer 设置,因此您可以将" "\"M109S[first_layer_temperature]\"命令放在任何所需的位置。" -#: src/libslic3r/PrintConfig.cpp:2466 +#: src/libslic3r/PrintConfig.cpp:2498 msgid "" "This start procedure is inserted at the beginning, after any printer start " "gcode (and after any toolchange to this filament in case of multi-material " @@ -12970,45 +14825,45 @@ msgstr "" "PrusaSlicer 设置,因此您可以将\"S[first_layer_temperature]\"命令放在任何所需" "的位置。如果您有多个挤出机,则按挤出机顺序处理 gcode。" -#: src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2514 msgid "Color change G-code" msgstr "颜色更改 G-Code" -#: src/libslic3r/PrintConfig.cpp:2483 +#: src/libslic3r/PrintConfig.cpp:2515 msgid "This G-code will be used as a code for the color change" msgstr "此 G-Code 将用作颜色更改的代码" -#: src/libslic3r/PrintConfig.cpp:2492 +#: src/libslic3r/PrintConfig.cpp:2524 msgid "This G-code will be used as a code for the pause print" msgstr "此 G-Code 将用作暂停打印的代码" -#: src/libslic3r/PrintConfig.cpp:2501 +#: src/libslic3r/PrintConfig.cpp:2533 msgid "This G-code will be used as a custom code" msgstr "此 G-Code 将用作自定义代码" -#: src/libslic3r/PrintConfig.cpp:2509 +#: src/libslic3r/PrintConfig.cpp:2541 msgid "Single Extruder Multi Material" msgstr "单挤出机多材料" -#: src/libslic3r/PrintConfig.cpp:2510 +#: src/libslic3r/PrintConfig.cpp:2542 msgid "The printer multiplexes filaments into a single hot end." msgstr "打印机将耗材多路复用到一个热端。" -#: src/libslic3r/PrintConfig.cpp:2515 +#: src/libslic3r/PrintConfig.cpp:2547 msgid "Prime all printing extruders" msgstr "装填所有印刷挤出机" -#: src/libslic3r/PrintConfig.cpp:2516 +#: src/libslic3r/PrintConfig.cpp:2548 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." msgstr "如果启用, 所有打印挤出机都将在打印开始时在构建板的前缘进行装填。" -#: src/libslic3r/PrintConfig.cpp:2521 +#: src/libslic3r/PrintConfig.cpp:2553 msgid "No sparse layers (EXPERIMENTAL)" msgstr "无稀疏层(实验)" -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2554 msgid "" "If enabled, the wipe tower will not be printed on layers with no " "toolchanges. On layers with a toolchange, extruder will travel downward to " @@ -13018,11 +14873,11 @@ msgstr "" "如果启用,擦拭塔将不会打印在没有工具更改的图层上。在更换工具的图层上,挤出机" "将向下移动以打印擦拭塔。用户有责任确保不与打印冲突。" -#: src/libslic3r/PrintConfig.cpp:2529 +#: src/libslic3r/PrintConfig.cpp:2561 msgid "Slice gap closing radius" msgstr "切片间隙闭合半径" -#: src/libslic3r/PrintConfig.cpp:2531 +#: src/libslic3r/PrintConfig.cpp:2563 msgid "" "Cracks smaller than 2x gap closing radius are being filled during the " "triangle mesh slicing. The gap closing operation may reduce the final print " @@ -13031,41 +14886,41 @@ msgstr "" "在三角形网格切片过程中,小于 2 倍间隙闭合半径的裂纹将被填充。间隙闭合操作可能" "会降低最终打印分辨率,因此建议将值保持在合理的较低水平。" -#: src/libslic3r/PrintConfig.cpp:2539 +#: src/libslic3r/PrintConfig.cpp:2571 msgid "Slicing Mode" msgstr "切片模式" -#: src/libslic3r/PrintConfig.cpp:2541 +#: src/libslic3r/PrintConfig.cpp:2573 msgid "" "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " "close all holes in the model." msgstr "3DLabPrint 飞机模型使用“奇偶”。使用“关闭孔”关闭模型中的所有孔。" -#: src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2575 msgid "Regular" msgstr "一般" -#: src/libslic3r/PrintConfig.cpp:2547 +#: src/libslic3r/PrintConfig.cpp:2576 msgid "Even-odd" msgstr "奇偶" -#: src/libslic3r/PrintConfig.cpp:2548 +#: src/libslic3r/PrintConfig.cpp:2577 msgid "Close holes" msgstr "闭眼" -#: src/libslic3r/PrintConfig.cpp:2553 +#: src/libslic3r/PrintConfig.cpp:2583 msgid "Generate support material" msgstr "生成支撑材料" -#: src/libslic3r/PrintConfig.cpp:2555 +#: src/libslic3r/PrintConfig.cpp:2585 msgid "Enable support material generation." msgstr "启用支撑材料生成。" -#: src/libslic3r/PrintConfig.cpp:2559 +#: src/libslic3r/PrintConfig.cpp:2589 msgid "Auto generated supports" msgstr "自动生成支撑" -#: src/libslic3r/PrintConfig.cpp:2561 +#: src/libslic3r/PrintConfig.cpp:2591 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " @@ -13074,11 +14929,11 @@ msgstr "" "如果选中, 将根据悬垂阈值自动生成支撑。如果未选中, 则仅在 \"支撑执行器\" 空间" "内生成支撑。" -#: src/libslic3r/PrintConfig.cpp:2567 +#: src/libslic3r/PrintConfig.cpp:2597 msgid "XY separation between an object and its support" msgstr "对象与其支撑之间的 XY 分离距离" -#: src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2599 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." @@ -13086,27 +14941,27 @@ msgstr "" "对象与其支撑之间的 XY 分离距离。如果表示为百分比 (例如 50%), 则将根据外部外围" "宽度计算。" -#: src/libslic3r/PrintConfig.cpp:2580 +#: src/libslic3r/PrintConfig.cpp:2610 msgid "Pattern angle" msgstr "模式角度" -#: src/libslic3r/PrintConfig.cpp:2582 +#: src/libslic3r/PrintConfig.cpp:2612 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." msgstr "使用此设置可旋转水平平面上的支撑材料模式。" -#: src/libslic3r/PrintConfig.cpp:2592 src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:2622 src/libslic3r/PrintConfig.cpp:3411 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." msgstr "仅当支撑位于构建板上时,才能创建支撑。不要在打印上创建支撑。" -#: src/libslic3r/PrintConfig.cpp:2598 +#: src/libslic3r/PrintConfig.cpp:2627 msgid "Top contact Z distance" msgstr "顶部接触 Z 距离" -#: src/libslic3r/PrintConfig.cpp:2600 +#: src/libslic3r/PrintConfig.cpp:2629 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " @@ -13115,23 +14970,23 @@ msgstr "" "对象与支撑材料界面之间的垂直距离。将此设置为 0 还会防止 Slic3r 对第一个对象层" "使用桥流和速度。" -#: src/libslic3r/PrintConfig.cpp:2608 +#: src/libslic3r/PrintConfig.cpp:2635 msgid "0 (soluble)" msgstr "0 (可溶性)" -#: src/libslic3r/PrintConfig.cpp:2609 +#: src/libslic3r/PrintConfig.cpp:2636 msgid "0.1 (detachable)" msgstr "0.1 (可拆卸)" -#: src/libslic3r/PrintConfig.cpp:2610 +#: src/libslic3r/PrintConfig.cpp:2637 msgid "0.2 (detachable)" msgstr "0.2 (可拆卸)" -#: src/libslic3r/PrintConfig.cpp:2616 +#: src/libslic3r/PrintConfig.cpp:2643 msgid "Bottom contact Z distance" msgstr "底部接触 Z 距离" -#: src/libslic3r/PrintConfig.cpp:2618 +#: src/libslic3r/PrintConfig.cpp:2645 msgid "" "The vertical distance between the object top surface and the support " "material interface. If set to zero, support_material_contact_distance will " @@ -13140,17 +14995,15 @@ msgstr "" "对象顶面和支撑材质界面之间的垂直距离。如果设置为零,则支架材料接触距离将用于" "顶部和底部接触Z距离。" -#. TRN To be shown in Print Settings "Bottom contact Z distance". Have to be as short as possible -#. TRN To be shown in Print Settings "Bottom interface layers". Have to be as short as possible -#: src/libslic3r/PrintConfig.cpp:2626 src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2651 src/libslic3r/PrintConfig.cpp:2732 msgid "Same as top" msgstr "和上面一样" -#: src/libslic3r/PrintConfig.cpp:2633 +#: src/libslic3r/PrintConfig.cpp:2659 msgid "Enforce support for the first" msgstr "强制支撑前" -#: src/libslic3r/PrintConfig.cpp:2635 +#: src/libslic3r/PrintConfig.cpp:2661 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -13160,15 +15013,15 @@ msgstr "" "从底部为指定数量的图层生成支撑材料,无论是否启用了普通支撑材料,也无论角度阈值" "如何。这对于在构建板上具有非常薄或差的封装的物体的粘附性非常有用。" -#: src/libslic3r/PrintConfig.cpp:2640 +#: src/libslic3r/PrintConfig.cpp:2666 msgid "Enforce support for the first n layers" msgstr "强制支撑前 n 层" -#: src/libslic3r/PrintConfig.cpp:2646 +#: src/libslic3r/PrintConfig.cpp:2672 msgid "Support material/raft/skirt extruder" msgstr "支撑材料/基座/环绕 挤出机" -#: src/libslic3r/PrintConfig.cpp:2648 +#: src/libslic3r/PrintConfig.cpp:2674 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." @@ -13176,7 +15029,7 @@ msgstr "" "打印支撑材料、基座和裙边时使用的挤出机 (1+,0 用于使用当前挤出机以最大限度地减" "少工具切换)。" -#: src/libslic3r/PrintConfig.cpp:2657 +#: src/libslic3r/PrintConfig.cpp:2683 msgid "" "Set this to a non-zero value to set a manual extrusion width for support " "material. If left zero, default extrusion width will be used if set, " @@ -13187,20 +15040,20 @@ msgstr "" "用默认挤出宽度,否则将使用喷嘴直径。如果以百分比表示(例如 90%)它将在层高度" "上计算。" -#: src/libslic3r/PrintConfig.cpp:2667 +#: src/libslic3r/PrintConfig.cpp:2693 msgid "Interface loops" msgstr "接触面圈数" -#: src/libslic3r/PrintConfig.cpp:2669 +#: src/libslic3r/PrintConfig.cpp:2695 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "用循环盖住支架的顶层接触层。默认情况下禁用。" -#: src/libslic3r/PrintConfig.cpp:2674 +#: src/libslic3r/PrintConfig.cpp:2700 msgid "Support material/raft interface extruder" msgstr "支撑材料/筏 接触面挤出机" -#: src/libslic3r/PrintConfig.cpp:2676 +#: src/libslic3r/PrintConfig.cpp:2702 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." @@ -13208,63 +15061,67 @@ msgstr "" "打印支撑材料界面时要使用的挤出机 (1+,0 用于使用当前挤出机以最大限度地减少工具" "切换)。这也会影响基座。" -#: src/libslic3r/PrintConfig.cpp:2684 +#: src/libslic3r/PrintConfig.cpp:2709 msgid "Top interface layers" msgstr "顶层接口层" -#: src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2711 msgid "" "Number of interface layers to insert between the object(s) and support " "material." msgstr "要在对象和支撑材料之间插入的接触面层数。" -#: src/libslic3r/PrintConfig.cpp:2693 +#: src/libslic3r/PrintConfig.cpp:2715 src/libslic3r/PrintConfig.cpp:2733 msgid "0 (off)" msgstr "0 (关)" -#: src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2716 src/libslic3r/PrintConfig.cpp:2734 msgid "1 (light)" msgstr "1 (轻)" -#: src/libslic3r/PrintConfig.cpp:2695 +#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2735 msgid "2 (default)" msgstr "2 (默认)" -#: src/libslic3r/PrintConfig.cpp:2696 +#: src/libslic3r/PrintConfig.cpp:2718 src/libslic3r/PrintConfig.cpp:2736 msgid "3 (heavy)" msgstr "3 (重)" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:2724 msgid "Bottom interface layers" msgstr "底部界面层" -#: src/libslic3r/PrintConfig.cpp:2704 +#: src/libslic3r/PrintConfig.cpp:2726 msgid "" "Number of interface layers to insert between the object(s) and support " "material. Set to -1 to use support_material_interface_layers" msgstr "" "要在对象和支撑材料之间插入的界面层数。设置为-1以使用支撑层、材质层、界面层" -#: src/libslic3r/PrintConfig.cpp:2717 +#: src/libslic3r/PrintConfig.cpp:2742 msgid "Closing radius" msgstr "闭合半径" -#: src/libslic3r/PrintConfig.cpp:2719 +#: src/libslic3r/PrintConfig.cpp:2744 msgid "" "For snug supports, the support regions will be merged using morphological " "closing operation. Gaps smaller than the closing radius will be filled in." msgstr "" "对于紧贴支撑,将使用形态闭合操作合并支撑区域。小于闭合半径的间隙将被填充。" -#: src/libslic3r/PrintConfig.cpp:2727 +#: src/libslic3r/PrintConfig.cpp:2752 msgid "Interface pattern spacing" msgstr "接触面模式间距" -#: src/libslic3r/PrintConfig.cpp:2729 +#: src/libslic3r/PrintConfig.cpp:2754 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "接触面行之间的间距。设置为零以获得实心接触面。" -#: src/libslic3r/PrintConfig.cpp:2738 +#: src/libslic3r/PrintConfig.cpp:2761 +msgid "Support material interface" +msgstr "支撑材料端口" + +#: src/libslic3r/PrintConfig.cpp:2763 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " @@ -13273,23 +15130,23 @@ msgstr "" "打印支撑材料接触面图层的速度。如果以百分比表示(例如 50%)它将在支撑材料速度" "上计算。" -#: src/libslic3r/PrintConfig.cpp:2747 +#: src/libslic3r/PrintConfig.cpp:2772 msgid "Pattern" msgstr "模式" -#: src/libslic3r/PrintConfig.cpp:2749 +#: src/libslic3r/PrintConfig.cpp:2774 msgid "Pattern used to generate support material." msgstr "用于生成支撑材料的模式。" -#: src/libslic3r/PrintConfig.cpp:2755 +#: src/libslic3r/PrintConfig.cpp:2777 msgid "Rectilinear grid" msgstr "直线网格" -#: src/libslic3r/PrintConfig.cpp:2761 +#: src/libslic3r/PrintConfig.cpp:2784 msgid "Interface pattern" msgstr "界面模式" -#: src/libslic3r/PrintConfig.cpp:2763 +#: src/libslic3r/PrintConfig.cpp:2786 msgid "" "Pattern used to generate support material interface. Default pattern for non-" "soluble support interface is Rectilinear, while default pattern for soluble " @@ -13298,23 +15155,19 @@ msgstr "" "用于生成支撑材料界面的图案。非可溶性支架界面的默认模式为直线,而可溶性支架界" "面的默认模式为同心。" -#: src/libslic3r/PrintConfig.cpp:2777 +#: src/libslic3r/PrintConfig.cpp:2798 msgid "Pattern spacing" msgstr "模式间距" -#: src/libslic3r/PrintConfig.cpp:2779 +#: src/libslic3r/PrintConfig.cpp:2800 msgid "Spacing between support material lines." msgstr "支撑材料线之间的间距。" -#: src/libslic3r/PrintConfig.cpp:2788 +#: src/libslic3r/PrintConfig.cpp:2809 msgid "Speed for printing support material." msgstr "打印支撑材料的速度。" -#: src/libslic3r/PrintConfig.cpp:2795 -msgid "Style" -msgstr "样式" - -#: src/libslic3r/PrintConfig.cpp:2797 +#: src/libslic3r/PrintConfig.cpp:2818 msgid "" "Style and shape of the support towers. Projecting the supports into a " "regular grid will create more stable supports, while snug support towers " @@ -13323,27 +15176,30 @@ msgstr "" "支撑塔的样式和形状。将支架投影到规则的网格中将创建更稳定的支架,而舒适的支撑" "塔将节省材料并减少物体疤痕。" -#: src/libslic3r/PrintConfig.cpp:2804 +#: src/libslic3r/PrintConfig.cpp:2823 msgid "Snug" msgstr "舒适的" -#: src/libslic3r/PrintConfig.cpp:2809 +#: src/libslic3r/PrintConfig.cpp:2824 +msgid "Organic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2830 msgid "Synchronize with object layers" msgstr "与对象图层同步" -#: src/libslic3r/PrintConfig.cpp:2811 +#: src/libslic3r/PrintConfig.cpp:2832 msgid "" "Synchronize support layers with the object print layers. This is useful with " -"multi-material printers, where the extruder switch is expensive." +"multi-material printers, where the extruder switch is expensive. This option " +"is only available when top contact Z distance is set to zero." msgstr "" -"将支撑图层与对象打印图层同步。这对于多材料打印机非常有用, 因为在这种打印机" -"中, 挤出机切换非常不划算。" -#: src/libslic3r/PrintConfig.cpp:2817 +#: src/libslic3r/PrintConfig.cpp:2839 msgid "Overhang threshold" msgstr "悬垂阈值" -#: src/libslic3r/PrintConfig.cpp:2819 +#: src/libslic3r/PrintConfig.cpp:2841 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -13355,33 +15211,98 @@ msgstr "" "无需支撑材料即可打印的最水平斜率(从水平平面测量)。设置为零以进行自动检测" "(建议)。" -#: src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2853 msgid "With sheath around the support" msgstr "用护套围绕支撑" -#: src/libslic3r/PrintConfig.cpp:2833 +#: src/libslic3r/PrintConfig.cpp:2855 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." msgstr "" "在基础支架周围添加护套 (一条外围线)。这使得支撑更可靠, 但也更难以移除。" -#: src/libslic3r/PrintConfig.cpp:2840 +#: src/libslic3r/PrintConfig.cpp:2861 +msgid "Maximum Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2863 +msgid "" +"The maximum angle of the branches, when the branches have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle to be able to have more reach." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2872 +msgid "Preferred Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2874 +msgid "" +"The preferred angle of the branches, when they do not have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle for branches to merge faster." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2883 +msgid "Tip Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2885 +msgid "The diameter of the top of the tip of the branches of organic support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2892 +msgid "Branch Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2894 +msgid "" +"The diameter of the thinnest branches of organic support. Thicker branches " +"are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2902 +msgid "Branch Diameter Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2904 +msgid "" +"The angle of the branches' diameter as they gradually become thicker towards " +"the bottom. An angle of 0 will cause the branches to have uniform thickness " +"over their length. A bit of an angle can increase stability of the organic " +"support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2914 +msgid "Branch Density" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2916 +msgid "" +"Adjusts the density of the support structure used to generate the tips of " +"the branches. A higher value results in better overhangs but the supports " +"are harder to remove, thus it is recommended to enable top support " +"interfaces instead of a high branch density value if dense interfaces are " +"needed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2928 msgid "" "Nozzle temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output G-code." msgstr "" "第一层之后各层的喷嘴温度。将其设置为零可禁用输出 G-Code 中的温度控制命令。" -#: src/libslic3r/PrintConfig.cpp:2843 +#: src/libslic3r/PrintConfig.cpp:2931 msgid "Nozzle temperature" msgstr "喷嘴温度" -#: src/libslic3r/PrintConfig.cpp:2849 +#: src/libslic3r/PrintConfig.cpp:2937 msgid "Thick bridges" msgstr "厚桥" -#: src/libslic3r/PrintConfig.cpp:2851 +#: src/libslic3r/PrintConfig.cpp:2939 msgid "" "If enabled, bridges are more reliable, can bridge longer distances, but may " "look worse. If disabled, bridges look better but are reliable just for " @@ -13390,29 +15311,29 @@ msgstr "" "如果启用,桥接器更可靠,可以桥接更长的距离,但可能看起来更糟。如果禁用,桥梁" "看起来更好,但仅在较短的桥梁距离内更可靠。" -#: src/libslic3r/PrintConfig.cpp:2857 +#: src/libslic3r/PrintConfig.cpp:2945 msgid "Detect thin walls" msgstr "检测薄壁" -#: src/libslic3r/PrintConfig.cpp:2859 +#: src/libslic3r/PrintConfig.cpp:2947 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." msgstr "" "检测单宽度壁(无法容纳两个挤出线的零件,我们需要将它们折叠成单个轨迹)。" -#: src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2953 msgid "Threads" msgstr "线程" -#: src/libslic3r/PrintConfig.cpp:2866 +#: src/libslic3r/PrintConfig.cpp:2954 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." msgstr "" "线程用于并行化长时间运行的任务。最佳线程数略高于可用内核/处理器的数量。" -#: src/libslic3r/PrintConfig.cpp:2878 +#: src/libslic3r/PrintConfig.cpp:2966 msgid "" "This custom code is inserted before every toolchange. Placeholder variables " "for all PrusaSlicer settings as well as {toolchange_z}, {previous_extruder} " @@ -13426,7 +15347,7 @@ msgstr "" "挤出机的换刀命令时(如 T{next_extruder}),PrusaSlicer 不会发出其他此类命令。" "因此,可以在工具更改前后编写自定义行为脚本。" -#: src/libslic3r/PrintConfig.cpp:2891 +#: src/libslic3r/PrintConfig.cpp:2979 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "top surfaces. You may want to use thinner extrudates to fill all narrow " @@ -13439,7 +15360,7 @@ msgstr "" "认挤出宽度,否则将使用喷嘴直径。如果以百分比表示(例如 90%)它将在层高度上计" "算。" -#: src/libslic3r/PrintConfig.cpp:2904 +#: src/libslic3r/PrintConfig.cpp:2992 msgid "" "Speed for printing top solid layers (it only applies to the uppermost " "external layers and not to their internal solid layers). You may want to " @@ -13451,15 +15372,15 @@ msgstr "" "层)。您可能需要减慢速度,以获得更好的表面光洁度。这可以表示为百分比(例如:" "80%)超过上面的固体填充速度。为自动设置为零。" -#: src/libslic3r/PrintConfig.cpp:2919 +#: src/libslic3r/PrintConfig.cpp:3007 msgid "Number of solid layers to generate on top surfaces." msgstr "要在顶部曲面上生成的实心图层数。" -#: src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3008 msgid "Top solid layers" msgstr "顶部实心层" -#: src/libslic3r/PrintConfig.cpp:2928 +#: src/libslic3r/PrintConfig.cpp:3016 msgid "" "The number of top solid layers is increased above top_solid_layers if " "necessary to satisfy minimum thickness of top shell. This is useful to " @@ -13468,19 +15389,19 @@ msgstr "" "如果需要满足顶部外壳的最小厚度,顶部实体层的数量将增加到顶部实体层之上。这有" "助于防止在使用可变层高打印时出现起球效应。" -#: src/libslic3r/PrintConfig.cpp:2931 +#: src/libslic3r/PrintConfig.cpp:3019 msgid "Minimum top shell thickness" msgstr "最小顶壳厚度" -#: src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:3026 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "打印移动的速度(在远处挤出点之间跳跃)。" -#: src/libslic3r/PrintConfig.cpp:2946 +#: src/libslic3r/PrintConfig.cpp:3034 msgid "Z travel" msgstr "行程" -#: src/libslic3r/PrintConfig.cpp:2947 +#: src/libslic3r/PrintConfig.cpp:3035 msgid "" "Speed for movements along the Z axis.\n" "When set to zero, the value is ignored and regular travel speed is used " @@ -13489,22 +15410,22 @@ msgstr "" "沿 Z 轴移动的速度。\n" "当设置为零时,该值将被忽略,而使用常规行驶速度。" -#: src/libslic3r/PrintConfig.cpp:2955 +#: src/libslic3r/PrintConfig.cpp:3043 msgid "Use firmware retraction" msgstr "使用固件回抽" -#: src/libslic3r/PrintConfig.cpp:2956 +#: src/libslic3r/PrintConfig.cpp:3044 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." msgstr "" "此实验设置使用 G10 和 G11 命令让固件处理回抽。这在最近 Marlin 中才得到支持。" -#: src/libslic3r/PrintConfig.cpp:2962 +#: src/libslic3r/PrintConfig.cpp:3050 msgid "Use relative E distances" msgstr "使用相对 E 距离" -#: src/libslic3r/PrintConfig.cpp:2963 +#: src/libslic3r/PrintConfig.cpp:3051 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." @@ -13512,11 +15433,11 @@ msgstr "" "如果您的固件需要相对的 E 值,请检查这一点,否则不要选中它。大多数固件使用绝对" "值。" -#: src/libslic3r/PrintConfig.cpp:2969 +#: src/libslic3r/PrintConfig.cpp:3057 msgid "Use volumetric E" msgstr "使用体积 E" -#: src/libslic3r/PrintConfig.cpp:2970 +#: src/libslic3r/PrintConfig.cpp:3058 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -13530,28 +15451,28 @@ msgstr "" "中,以便打开体积模式并使用与 Slic3r 中选择的耗材相关的耗材直径。这在最近 " "Marlin 中才得到支持。" -#: src/libslic3r/PrintConfig.cpp:2980 +#: src/libslic3r/PrintConfig.cpp:3068 msgid "Enable variable layer height feature" msgstr "启用可变图层高度特征" -#: src/libslic3r/PrintConfig.cpp:2981 +#: src/libslic3r/PrintConfig.cpp:3069 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." msgstr "" "某些打印机或打印机设置在打印图层高度可变时可能遇到问题。默认情况下启用。" -#: src/libslic3r/PrintConfig.cpp:2987 +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Wipe while retracting" msgstr "回抽时擦拭" -#: src/libslic3r/PrintConfig.cpp:2988 +#: src/libslic3r/PrintConfig.cpp:3076 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." msgstr "此标志将在回抽时移动喷嘴,以尽量减少泄漏挤出器上可能出现的斑点。" -#: src/libslic3r/PrintConfig.cpp:2995 +#: src/libslic3r/PrintConfig.cpp:3083 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." @@ -13559,11 +15480,11 @@ msgstr "" "多材料打印机可能需要对工具更换进行填充清洗或清除挤出机。将多余的材料挤出到擦" "料塔中。" -#: src/libslic3r/PrintConfig.cpp:3001 +#: src/libslic3r/PrintConfig.cpp:3089 msgid "Purging volumes - load/unload volumes" msgstr "清除量-加载/卸载量" -#: src/libslic3r/PrintConfig.cpp:3002 +#: src/libslic3r/PrintConfig.cpp:3090 msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " @@ -13572,54 +15493,58 @@ msgstr "" "此矢量保存所需的体积,以便从/到擦料塔上使用的每个工具。这些值用于简化以下完整" "清除量的创建。" -#: src/libslic3r/PrintConfig.cpp:3008 +#: src/libslic3r/PrintConfig.cpp:3096 msgid "Purging volumes - matrix" msgstr "清除量-矩阵" -#: src/libslic3r/PrintConfig.cpp:3009 +#: src/libslic3r/PrintConfig.cpp:3097 msgid "" "This matrix describes volumes (in cubic milimetres) required to purge the " "new filament on the wipe tower for any given pair of tools." msgstr "" "此矩阵描述清除擦料塔上任何给定工具对的新耗材所需的体积(以立方米为单位)。" -#: src/libslic3r/PrintConfig.cpp:3018 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Position X" msgstr "横向位置 X" -#: src/libslic3r/PrintConfig.cpp:3019 +#: src/libslic3r/PrintConfig.cpp:3107 msgid "X coordinate of the left front corner of a wipe tower" msgstr "擦料塔左前角的 X 坐标" -#: src/libslic3r/PrintConfig.cpp:3025 +#: src/libslic3r/PrintConfig.cpp:3113 msgid "Position Y" msgstr "纵向位置 Y" -#: src/libslic3r/PrintConfig.cpp:3026 +#: src/libslic3r/PrintConfig.cpp:3114 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "擦料塔左前角的 Y 坐标" -#: src/libslic3r/PrintConfig.cpp:3033 +#: src/libslic3r/PrintConfig.cpp:3120 +msgid "Width" +msgstr "宽度" + +#: src/libslic3r/PrintConfig.cpp:3121 msgid "Width of a wipe tower" msgstr "擦料塔的宽度" -#: src/libslic3r/PrintConfig.cpp:3039 +#: src/libslic3r/PrintConfig.cpp:3127 msgid "Wipe tower rotation angle" msgstr "擦料塔旋转角度" -#: src/libslic3r/PrintConfig.cpp:3040 +#: src/libslic3r/PrintConfig.cpp:3128 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "相对于 x 轴擦料塔旋转角度。" -#: src/libslic3r/PrintConfig.cpp:3046 src/libslic3r/PrintConfig.cpp:3047 +#: src/libslic3r/PrintConfig.cpp:3134 src/libslic3r/PrintConfig.cpp:3135 msgid "Wipe tower brim width" msgstr "擦拭塔裙边宽度" -#: src/libslic3r/PrintConfig.cpp:3055 +#: src/libslic3r/PrintConfig.cpp:3143 msgid "Wipe into this object's infill" msgstr "擦入此物体的填充" -#: src/libslic3r/PrintConfig.cpp:3056 +#: src/libslic3r/PrintConfig.cpp:3144 msgid "" "Purging after toolchange will be done inside this object's infills. This " "lowers the amount of waste but may result in longer print time due to " @@ -13628,11 +15553,11 @@ msgstr "" "工具更改后的清除将在该对象的填充内完成。这降低了浪费量,但由于额外的行程移" "动,可能会导致更长的打印时间。" -#: src/libslic3r/PrintConfig.cpp:3063 +#: src/libslic3r/PrintConfig.cpp:3151 msgid "Wipe into this object" msgstr "擦除到此对象" -#: src/libslic3r/PrintConfig.cpp:3064 +#: src/libslic3r/PrintConfig.cpp:3152 msgid "" "Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " @@ -13641,19 +15566,19 @@ msgstr "" "对象将用于在工具更改后清除喷嘴, 以节省在擦料塔中浪费的材料并减少打印时间。因" "此, 对象的颜色将混合在一起。" -#: src/libslic3r/PrintConfig.cpp:3070 +#: src/libslic3r/PrintConfig.cpp:3158 msgid "Maximal bridging distance" msgstr "最大桥接距离" -#: src/libslic3r/PrintConfig.cpp:3071 +#: src/libslic3r/PrintConfig.cpp:3159 msgid "Maximal distance between supports on sparse infill sections." msgstr "稀疏填充部分上支撑之间的最大距离。" -#: src/libslic3r/PrintConfig.cpp:3077 +#: src/libslic3r/PrintConfig.cpp:3165 msgid "XY Size Compensation" msgstr "XY 尺寸补偿" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3167 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" @@ -13662,11 +15587,11 @@ msgstr "" "对象将在 XY 平面中按配置的值(负 = 向内、正 = 向外)进行增长/收缩。这对于微调" "孔大小可能很有用。" -#: src/libslic3r/PrintConfig.cpp:3087 +#: src/libslic3r/PrintConfig.cpp:3175 msgid "Z offset" msgstr "Z 偏移" -#: src/libslic3r/PrintConfig.cpp:3088 +#: src/libslic3r/PrintConfig.cpp:3176 msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " "output G-code. It is used to compensate for bad Z endstop position: for " @@ -13677,11 +15602,11 @@ msgstr "" "器置:例如,如果限位器零实际离开喷嘴 0.3mm 远离构建板(打印床),将其设置为 " "-0.3(或调整限位器)。" -#: src/libslic3r/PrintConfig.cpp:3097 +#: src/libslic3r/PrintConfig.cpp:3185 msgid "Perimeter generator" msgstr "轮廓生成器" -#: src/libslic3r/PrintConfig.cpp:3099 +#: src/libslic3r/PrintConfig.cpp:3187 msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " @@ -13691,19 +15616,19 @@ msgstr "" "经典轮廓生成器产生具有恒定挤出宽度的轮廓,并且对于非常薄的区域使用间隙填充。 " "Arachne 引擎产生具有可变挤出宽度的轮廓。这个设置也会影响回环填充。" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3192 msgid "Classic" msgstr "经典" -#: src/libslic3r/PrintConfig.cpp:3107 +#: src/libslic3r/PrintConfig.cpp:3193 msgid "Arachne" msgstr "Arachne" -#: src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3199 msgid "Perimeter transition length" msgstr "轮廓过渡长度" -#: src/libslic3r/PrintConfig.cpp:3114 +#: src/libslic3r/PrintConfig.cpp:3201 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " @@ -13713,11 +15638,11 @@ msgstr "" "当随着零件变薄而在不同数量的轮廓之间过渡时,会分配出一定的空间来分割或连接轮" "廓段。如果用百分比表示(例如 100%),它将根据喷嘴直径计算出来。" -#: src/libslic3r/PrintConfig.cpp:3123 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Perimeter transitioning filter margin" msgstr "轮廓过渡过滤器余量" -#: src/libslic3r/PrintConfig.cpp:3125 +#: src/libslic3r/PrintConfig.cpp:3212 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -13733,11 +15658,11 @@ msgstr "" "少挤压开始/停止的次数和移动时间。然而,大的挤出宽度变化会导致挤出不足或过度挤" "出的问题。如果用百分比表示(例如25%),将根据喷嘴直径计算。" -#: src/libslic3r/PrintConfig.cpp:3138 +#: src/libslic3r/PrintConfig.cpp:3225 msgid "Perimeter transitioning threshold angle" msgstr "轮廓过渡阈值角度" -#: src/libslic3r/PrintConfig.cpp:3140 +#: src/libslic3r/PrintConfig.cpp:3227 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -13749,11 +15674,11 @@ msgstr "" "中心打印轮廓以填充剩余空间。 减少此设置会减少这些中心轮廓的数量和长度,但可能" "会留下间隙或过度拉伸。" -#: src/libslic3r/PrintConfig.cpp:3151 +#: src/libslic3r/PrintConfig.cpp:3238 msgid "Perimeter distribution count" msgstr "轮廓分布计数" -#: src/libslic3r/PrintConfig.cpp:3153 +#: src/libslic3r/PrintConfig.cpp:3240 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " @@ -13762,11 +15687,11 @@ msgstr "" "从中心开始计算的轮廓数量,变化需要在这些轮廓上展开。较低的值意味着外部轮廓的" "宽度不发生变化。" -#: src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3247 msgid "Minimum feature size" msgstr "最小特征尺寸" -#: src/libslic3r/PrintConfig.cpp:3162 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " @@ -13778,79 +15703,241 @@ msgstr "" "将被加宽到最小轮廓的宽度。如果以百分比表示(例如 25%),它将根据喷嘴直径计" "算。" -#: src/libslic3r/PrintConfig.cpp:3172 -msgid "Minimum perimeter width" -msgstr "最小轮廓宽度" +#: src/libslic3r/PrintConfig.cpp:3259 +msgid "Minimum perimeter width" +msgstr "最小轮廓宽度" + +#: src/libslic3r/PrintConfig.cpp:3261 +msgid "" +"Width of the perimeter that will replace thin features (according to the " +"Minimum feature size) of the model. If the Minimum perimeter width is " +"thinner than the thickness of the feature, the perimeter will become as " +"thick as the feature itself. If expressed as a percentage (for example 85%), " +"it will be computed based on the nozzle diameter." +msgstr "" +"将替换模型的细特征(根据最小特征尺寸)的轮廓宽度。 如果最小轮廓宽度小于特征的" +"厚度,则轮廓将变得与特征本身一样厚。 如果以百分比表示(例如 85%),它将根据喷" +"嘴直径计算。" + +#: src/libslic3r/PrintConfig.cpp:3327 +msgid "Pinhead front diameter" +msgstr "针头前端直径" + +#: src/libslic3r/PrintConfig.cpp:3329 +msgid "Diameter of the pointing side of the head" +msgstr "头部指向侧的直径" + +#: src/libslic3r/PrintConfig.cpp:3336 +msgid "Head penetration" +msgstr "头部穿透" + +#: src/libslic3r/PrintConfig.cpp:3338 +msgid "How much the pinhead has to penetrate the model surface" +msgstr "针头穿透模型表面的程度" + +#: src/libslic3r/PrintConfig.cpp:3345 +msgid "Pinhead width" +msgstr "针头宽度" + +#: src/libslic3r/PrintConfig.cpp:3347 +msgid "Width from the back sphere center to the front sphere center" +msgstr "从后球体中心到前球体中心的宽度" + +#: src/libslic3r/PrintConfig.cpp:3355 +msgid "Pillar diameter" +msgstr "立柱直径" + +#: src/libslic3r/PrintConfig.cpp:3357 +msgid "Diameter in mm of the support pillars" +msgstr "支撑柱的直径以 mm 为单位" + +#: src/libslic3r/PrintConfig.cpp:3365 +msgid "Small pillar diameter percent" +msgstr "小矿柱直径百分比" + +#: src/libslic3r/PrintConfig.cpp:3367 +msgid "" +"The percentage of smaller pillars compared to the normal pillar diameter " +"which are used in problematic areas where a normal pilla cannot fit." +msgstr "与正常支柱直径相比,较小支柱的百分比,用于正常支柱无法安装的问题区域。" + +#: src/libslic3r/PrintConfig.cpp:3376 +msgid "Max bridges on a pillar" +msgstr "麦克斯在柱子上架桥" + +#: src/libslic3r/PrintConfig.cpp:3378 +msgid "" +"Maximum number of bridges that can be placed on a pillar. Bridges hold " +"support point pinheads and connect to pillars as small branches." +msgstr "" +"可放置在支柱上的桥梁的最大数量。桥上有支撑点针头,并以小树枝的形式连接到柱子" +"上。" + +#: src/libslic3r/PrintConfig.cpp:3386 +msgid "Max weight on model" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3389 +msgid "" +"Maximum weight of sub-trees that terminate on the model instead of the print " +"bed. The weight is the sum of the lenghts of all branches emanating from the " +"endpoint." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3397 +msgid "Pillar connection mode" +msgstr "立柱连接方式" + +#: src/libslic3r/PrintConfig.cpp:3398 +msgid "" +"Controls the bridge type between two neighboring pillars. Can be zig-zag, " +"cross (double zig-zag) or dynamic which will automatically switch between " +"the first two depending on the distance of the two pillars." +msgstr "" +"控制两个相邻支柱之间的桥接类型。可以是锯齿形、交叉(双锯齿形)或动态,根据两" +"个支柱的距离,在前两个柱之间自动切换。" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Zig-Zag" +msgstr "锯齿形" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Cross" +msgstr "交叉" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Dynamic" +msgstr "动态" + +#: src/libslic3r/PrintConfig.cpp:3416 +msgid "Pillar widening factor" +msgstr "支柱加宽系数" + +#: src/libslic3r/PrintConfig.cpp:3420 +msgid "" +"Merging bridges or pillars into another pillars can increase the radius. " +"Zero means no increase, one means full increase. The exact amount of " +"increase is unspecified and can change in the future." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3431 +msgid "Support base diameter" +msgstr "支撑基直径" + +#: src/libslic3r/PrintConfig.cpp:3433 +msgid "Diameter in mm of the pillar base" +msgstr "柱底直径以 mm 为单位" + +#: src/libslic3r/PrintConfig.cpp:3441 +msgid "Support base height" +msgstr "支撑基座高度" + +#: src/libslic3r/PrintConfig.cpp:3443 +msgid "The height of the pillar base cone" +msgstr "柱底锥的高度" + +#: src/libslic3r/PrintConfig.cpp:3450 +msgid "Support base safety distance" +msgstr "支撑基部安全距离" + +#: src/libslic3r/PrintConfig.cpp:3453 +msgid "" +"The minimum distance of the pillar base from the model in mm. Makes sense in " +"zero elevation mode where a gap according to this parameter is inserted " +"between the model and the pad." +msgstr "" +"柱基与模型的最小距离 (以 mm 为单位) 在零高程模式下有意义,在模型和焊盘之间插入" +"根据此参数的间隙。" + +#: src/libslic3r/PrintConfig.cpp:3463 +msgid "Critical angle" +msgstr "临界角度" + +#: src/libslic3r/PrintConfig.cpp:3465 +msgid "The default angle for connecting support sticks and junctions." +msgstr "用于连接支撑杆和结的默认角度。" + +#: src/libslic3r/PrintConfig.cpp:3473 +msgid "Max bridge length" +msgstr "最大桥长" + +#: src/libslic3r/PrintConfig.cpp:3475 +msgid "The max length of a bridge" +msgstr "搭桥的最大长度" + +#: src/libslic3r/PrintConfig.cpp:3487 +msgid "Max pillar linking distance" +msgstr "最大柱线链接距离" + +#: src/libslic3r/PrintConfig.cpp:3489 +msgid "" +"The max distance of two pillars to get linked with each other. A zero value " +"will prohibit pillar cascading." +msgstr "两根柱子相互连接的最大距离。零值将禁止柱级联。" -#: src/libslic3r/PrintConfig.cpp:3174 +#: src/libslic3r/PrintConfig.cpp:3499 msgid "" -"Width of the perimeter that will replace thin features (according to the " -"Minimum feature size) of the model. If the Minimum perimeter width is " -"thinner than the thickness of the feature, the perimeter will become as " -"thick as the feature itself. If expressed as a percentage (for example 85%), " -"it will be computed based on the nozzle diameter." -msgstr "" -"将替换模型的细特征(根据最小特征尺寸)的轮廓宽度。 如果最小轮廓宽度小于特征的" -"厚度,则轮廓将变得与特征本身一样厚。 如果以百分比表示(例如 85%),它将根据喷" -"嘴直径计算。" +"How much the supports should lift up the supported object. If \"Pad around " +"object\" is enabled, this value is ignored." +msgstr "支撑应提升受支撑的对象。如果启用了\"对象周围的键盘\",则忽略此值。" -#: src/libslic3r/PrintConfig.cpp:3242 +#: src/libslic3r/PrintConfig.cpp:3515 msgid "Display width" msgstr "显示宽度" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3516 msgid "Width of the display" msgstr "显示宽度" -#: src/libslic3r/PrintConfig.cpp:3248 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "Display height" msgstr "显示高度" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3522 msgid "Height of the display" msgstr "显示高度" -#: src/libslic3r/PrintConfig.cpp:3254 +#: src/libslic3r/PrintConfig.cpp:3527 msgid "Number of pixels in" msgstr "像素点的数量" -#: src/libslic3r/PrintConfig.cpp:3256 +#: src/libslic3r/PrintConfig.cpp:3529 msgid "Number of pixels in X" msgstr "X 中的像素数" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3535 msgid "Number of pixels in Y" msgstr "Y 中的像素数" -#: src/libslic3r/PrintConfig.cpp:3267 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Display horizontal mirroring" msgstr "显示水平镜像" -#: src/libslic3r/PrintConfig.cpp:3268 +#: src/libslic3r/PrintConfig.cpp:3541 msgid "Mirror horizontally" msgstr "水平镜像" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3542 msgid "Enable horizontal mirroring of output images" msgstr "启用输出图像的水平镜像" -#: src/libslic3r/PrintConfig.cpp:3274 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Display vertical mirroring" msgstr "显示垂直镜像" -#: src/libslic3r/PrintConfig.cpp:3275 +#: src/libslic3r/PrintConfig.cpp:3548 msgid "Mirror vertically" msgstr "垂直镜像" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "Enable vertical mirroring of output images" msgstr "启用输出图像的垂直镜像" -#: src/libslic3r/PrintConfig.cpp:3281 +#: src/libslic3r/PrintConfig.cpp:3554 msgid "Display orientation" msgstr "显示方向" -#: src/libslic3r/PrintConfig.cpp:3282 +#: src/libslic3r/PrintConfig.cpp:3555 msgid "" "Set the actual LCD display orientation inside the SLA printer. Portrait mode " "will flip the meaning of display width and height parameters and the output " @@ -13859,55 +15946,55 @@ msgstr "" "在 SLA 打印机内设置实际的 LCD 显示方向。人像模式将翻转显示宽度和高度参数的含" "义, 输出图像将旋转 90 度。" -#: src/libslic3r/PrintConfig.cpp:3288 +#: src/libslic3r/PrintConfig.cpp:3559 msgid "Landscape" msgstr "景观" -#: src/libslic3r/PrintConfig.cpp:3289 +#: src/libslic3r/PrintConfig.cpp:3560 msgid "Portrait" msgstr "肖像" -#: src/libslic3r/PrintConfig.cpp:3294 src/libslic3r/PrintConfig.cpp:3929 +#: src/libslic3r/PrintConfig.cpp:3566 src/libslic3r/PrintConfig.cpp:4058 msgid "Fast" msgstr "快" -#: src/libslic3r/PrintConfig.cpp:3295 +#: src/libslic3r/PrintConfig.cpp:3567 msgid "Fast tilt" msgstr "快速倾斜" -#: src/libslic3r/PrintConfig.cpp:3296 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Time of the fast tilt" msgstr "快速倾斜的时间" -#: src/libslic3r/PrintConfig.cpp:3303 src/libslic3r/PrintConfig.cpp:3928 +#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:4057 msgid "Slow" msgstr "慢" -#: src/libslic3r/PrintConfig.cpp:3304 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Slow tilt" msgstr "缓慢倾斜" -#: src/libslic3r/PrintConfig.cpp:3305 +#: src/libslic3r/PrintConfig.cpp:3577 msgid "Time of the slow tilt" msgstr "缓慢倾斜的时间" -#: src/libslic3r/PrintConfig.cpp:3312 src/libslic3r/PrintConfig.cpp:3930 +#: src/libslic3r/PrintConfig.cpp:3584 src/libslic3r/PrintConfig.cpp:4059 msgid "High viscosity" msgstr "高粘性" -#: src/libslic3r/PrintConfig.cpp:3313 +#: src/libslic3r/PrintConfig.cpp:3585 msgid "Tilt for high viscosity resin" msgstr "高粘性树脂倾斜" -#: src/libslic3r/PrintConfig.cpp:3314 +#: src/libslic3r/PrintConfig.cpp:3586 msgid "Time of the super slow tilt" msgstr "超慢倾斜的时间" -#: src/libslic3r/PrintConfig.cpp:3321 +#: src/libslic3r/PrintConfig.cpp:3593 msgid "Area fill" msgstr "区域填充" -#: src/libslic3r/PrintConfig.cpp:3322 +#: src/libslic3r/PrintConfig.cpp:3594 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -13917,59 +16004,59 @@ msgstr "" "如果打印区域超过指定值, \n" "然后缓慢倾斜将被使用,否则 - 快速倾斜" -#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 -#: src/libslic3r/PrintConfig.cpp:3331 +#: src/libslic3r/PrintConfig.cpp:3601 src/libslic3r/PrintConfig.cpp:3602 +#: src/libslic3r/PrintConfig.cpp:3603 msgid "Printer scaling correction" msgstr "打印机缩放校正" -#: src/libslic3r/PrintConfig.cpp:3337 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3609 src/libslic3r/PrintConfig.cpp:3611 msgid "Printer scaling correction in X axis" msgstr "X 轴上的打印机缩放校正" -#: src/libslic3r/PrintConfig.cpp:3338 +#: src/libslic3r/PrintConfig.cpp:3610 msgid "Printer scaling X axis correction" msgstr "打印机缩放 X 轴校正" -#: src/libslic3r/PrintConfig.cpp:3345 src/libslic3r/PrintConfig.cpp:3347 +#: src/libslic3r/PrintConfig.cpp:3617 src/libslic3r/PrintConfig.cpp:3619 msgid "Printer scaling correction in Y axis" msgstr "Y 轴上的打印机缩放校正" -#: src/libslic3r/PrintConfig.cpp:3346 +#: src/libslic3r/PrintConfig.cpp:3618 msgid "Printer scaling Y axis correction" msgstr "打印机缩放 Y 轴校正" -#: src/libslic3r/PrintConfig.cpp:3353 src/libslic3r/PrintConfig.cpp:3355 +#: src/libslic3r/PrintConfig.cpp:3625 src/libslic3r/PrintConfig.cpp:3627 msgid "Printer scaling correction in Z axis" msgstr "Z 轴上的打印机缩放校正" -#: src/libslic3r/PrintConfig.cpp:3354 +#: src/libslic3r/PrintConfig.cpp:3626 msgid "Printer scaling Z axis correction" msgstr "打印机缩放 Z 轴校正" -#: src/libslic3r/PrintConfig.cpp:3361 src/libslic3r/PrintConfig.cpp:3362 +#: src/libslic3r/PrintConfig.cpp:3633 src/libslic3r/PrintConfig.cpp:3634 msgid "Printer absolute correction" msgstr "打印机绝对校正" -#: src/libslic3r/PrintConfig.cpp:3363 +#: src/libslic3r/PrintConfig.cpp:3635 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "将根据校正的符号放大或收缩切片的 2D 多边形。" -#: src/libslic3r/PrintConfig.cpp:3369 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Elephant foot minimum width" msgstr "象脚最小宽度" -#: src/libslic3r/PrintConfig.cpp:3371 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "大象脚补偿时要保持的最小特征宽度。" -#: src/libslic3r/PrintConfig.cpp:3378 src/libslic3r/PrintConfig.cpp:3379 +#: src/libslic3r/PrintConfig.cpp:3650 src/libslic3r/PrintConfig.cpp:3651 msgid "Printer gamma correction" msgstr "打印机伽玛校正" -#: src/libslic3r/PrintConfig.cpp:3380 +#: src/libslic3r/PrintConfig.cpp:3652 msgid "" "This will apply a gamma correction to the rasterized 2D polygons. A gamma " "value of zero means thresholding with the threshold in the middle. This " @@ -13978,292 +16065,171 @@ msgstr "" "这将对栅格化的 2D 多边形应用伽玛校正。伽玛值为零表示在中间的阈值阈值。此行为" "消除了抗锯齿,而不会丢失多边形中的孔。" -#: src/libslic3r/PrintConfig.cpp:3399 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3671 src/libslic3r/PrintConfig.cpp:3672 msgid "SLA material type" msgstr "SLA 材料类型" -#: src/libslic3r/PrintConfig.cpp:3411 src/libslic3r/PrintConfig.cpp:3412 +#: src/libslic3r/PrintConfig.cpp:3679 src/libslic3r/PrintConfig.cpp:3680 msgid "Initial layer height" msgstr "初始层高度" -#: src/libslic3r/PrintConfig.cpp:3418 src/libslic3r/PrintConfig.cpp:3419 +#: src/libslic3r/PrintConfig.cpp:3686 +msgid "Idle temperature" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3687 +msgid "" +"Nozzle temperature when the tool is currently not used in multi-tool setups." +"This is only used when 'Ooze prevention' is active in Print Settings." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3695 src/libslic3r/PrintConfig.cpp:3696 msgid "Bottle volume" msgstr "瓶容量" -#: src/libslic3r/PrintConfig.cpp:3420 +#: src/libslic3r/PrintConfig.cpp:3697 msgid "ml" msgstr "毫升" -#: src/libslic3r/PrintConfig.cpp:3425 src/libslic3r/PrintConfig.cpp:3426 +#: src/libslic3r/PrintConfig.cpp:3702 src/libslic3r/PrintConfig.cpp:3703 msgid "Bottle weight" msgstr "瓶重" -#: src/libslic3r/PrintConfig.cpp:3427 +#: src/libslic3r/PrintConfig.cpp:3704 msgid "kg" msgstr "公斤" -#: src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "g/ml" msgstr "克/毫升" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3718 msgid "money/bottle" msgstr "钱/瓶" -#: src/libslic3r/PrintConfig.cpp:3446 +#: src/libslic3r/PrintConfig.cpp:3723 msgid "Faded layers" msgstr "褪色图层" -#: src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3724 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "曝光时间所需的图层数从初始曝光时间到曝光时间逐渐淡入淡出" -#: src/libslic3r/PrintConfig.cpp:3454 src/libslic3r/PrintConfig.cpp:3455 +#: src/libslic3r/PrintConfig.cpp:3731 src/libslic3r/PrintConfig.cpp:3732 msgid "Minimum exposure time" msgstr "最短曝光时间" -#: src/libslic3r/PrintConfig.cpp:3462 src/libslic3r/PrintConfig.cpp:3463 +#: src/libslic3r/PrintConfig.cpp:3739 src/libslic3r/PrintConfig.cpp:3740 msgid "Maximum exposure time" msgstr "最大曝光时间" -#: src/libslic3r/PrintConfig.cpp:3470 src/libslic3r/PrintConfig.cpp:3471 +#: src/libslic3r/PrintConfig.cpp:3747 src/libslic3r/PrintConfig.cpp:3748 msgid "Exposure time" msgstr "曝光时间" -#: src/libslic3r/PrintConfig.cpp:3477 src/libslic3r/PrintConfig.cpp:3478 +#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3755 msgid "Minimum initial exposure time" msgstr "最短初始暴露时间" -#: src/libslic3r/PrintConfig.cpp:3485 src/libslic3r/PrintConfig.cpp:3486 +#: src/libslic3r/PrintConfig.cpp:3762 src/libslic3r/PrintConfig.cpp:3763 msgid "Maximum initial exposure time" msgstr "最大初始曝光时间" -#: src/libslic3r/PrintConfig.cpp:3493 src/libslic3r/PrintConfig.cpp:3494 +#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3771 msgid "Initial exposure time" msgstr "初始暴露时间" -#: src/libslic3r/PrintConfig.cpp:3500 src/libslic3r/PrintConfig.cpp:3501 +#: src/libslic3r/PrintConfig.cpp:3777 src/libslic3r/PrintConfig.cpp:3778 msgid "Correction for expansion" msgstr "扩展校正" -#: src/libslic3r/PrintConfig.cpp:3507 src/libslic3r/PrintConfig.cpp:3508 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3785 msgid "Correction for expansion in X axis" msgstr "X 轴膨胀修正" -#: src/libslic3r/PrintConfig.cpp:3514 src/libslic3r/PrintConfig.cpp:3515 +#: src/libslic3r/PrintConfig.cpp:3791 src/libslic3r/PrintConfig.cpp:3792 msgid "Correction for expansion in Y axis" msgstr "Y 轴膨胀修正" -#: src/libslic3r/PrintConfig.cpp:3521 src/libslic3r/PrintConfig.cpp:3522 +#: src/libslic3r/PrintConfig.cpp:3798 src/libslic3r/PrintConfig.cpp:3799 msgid "Correction for expansion in Z axis" msgstr "Z 轴膨胀修正" -#: src/libslic3r/PrintConfig.cpp:3528 +#: src/libslic3r/PrintConfig.cpp:3805 msgid "SLA print material notes" msgstr "SLA 打印材料注释" -#: src/libslic3r/PrintConfig.cpp:3529 +#: src/libslic3r/PrintConfig.cpp:3806 msgid "You can put your notes regarding the SLA print material here." msgstr "您可以在此处放置有关 SLA 打印材料的注释。" -#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3552 +#: src/libslic3r/PrintConfig.cpp:3818 src/libslic3r/PrintConfig.cpp:3829 msgid "Default SLA material profile" msgstr "默认 SLA 材料配置文件" -#: src/libslic3r/PrintConfig.cpp:3563 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "Generate supports" msgstr "生成支撑" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3842 msgid "Generate supports for the models" msgstr "生成模型的支撑" -#: src/libslic3r/PrintConfig.cpp:3570 -msgid "Pinhead front diameter" -msgstr "针头前端直径" - -#: src/libslic3r/PrintConfig.cpp:3572 -msgid "Diameter of the pointing side of the head" -msgstr "头部指向侧的直径" - -#: src/libslic3r/PrintConfig.cpp:3579 -msgid "Head penetration" -msgstr "头部穿透" - -#: src/libslic3r/PrintConfig.cpp:3581 -msgid "How much the pinhead has to penetrate the model surface" -msgstr "针头穿透模型表面的程度" - -#: src/libslic3r/PrintConfig.cpp:3588 -msgid "Pinhead width" -msgstr "针头宽度" - -#: src/libslic3r/PrintConfig.cpp:3590 -msgid "Width from the back sphere center to the front sphere center" -msgstr "从后球体中心到前球体中心的宽度" - -#: src/libslic3r/PrintConfig.cpp:3598 -msgid "Pillar diameter" -msgstr "立柱直径" - -#: src/libslic3r/PrintConfig.cpp:3600 -msgid "Diameter in mm of the support pillars" -msgstr "支撑柱的直径以 mm 为单位" - -#: src/libslic3r/PrintConfig.cpp:3608 -msgid "Small pillar diameter percent" -msgstr "小矿柱直径百分比" - -#: src/libslic3r/PrintConfig.cpp:3610 -msgid "" -"The percentage of smaller pillars compared to the normal pillar diameter " -"which are used in problematic areas where a normal pilla cannot fit." -msgstr "与正常支柱直径相比,较小支柱的百分比,用于正常支柱无法安装的问题区域。" - -#: src/libslic3r/PrintConfig.cpp:3619 -msgid "Max bridges on a pillar" -msgstr "麦克斯在柱子上架桥" - -#: src/libslic3r/PrintConfig.cpp:3621 -msgid "" -"Maximum number of bridges that can be placed on a pillar. Bridges hold " -"support point pinheads and connect to pillars as small branches." +#: src/libslic3r/PrintConfig.cpp:3847 +msgid "Support tree type" msgstr "" -"可放置在支柱上的桥梁的最大数量。桥上有支撑点针头,并以小树枝的形式连接到柱子" -"上。" -#: src/libslic3r/PrintConfig.cpp:3629 -msgid "Pillar connection mode" -msgstr "立柱连接方式" - -#: src/libslic3r/PrintConfig.cpp:3630 -msgid "" -"Controls the bridge type between two neighboring pillars. Can be zig-zag, " -"cross (double zig-zag) or dynamic which will automatically switch between " -"the first two depending on the distance of the two pillars." +#: src/libslic3r/PrintConfig.cpp:3848 +msgid "Support tree building strategy" msgstr "" -"控制两个相邻支柱之间的桥接类型。可以是锯齿形、交叉(双锯齿形)或动态,根据两" -"个支柱的距离,在前两个柱之间自动切换。" - -#: src/libslic3r/PrintConfig.cpp:3638 -msgid "Zig-Zag" -msgstr "锯齿形" - -#: src/libslic3r/PrintConfig.cpp:3639 -msgid "Cross" -msgstr "交叉" - -#: src/libslic3r/PrintConfig.cpp:3640 -msgid "Dynamic" -msgstr "动态" - -#: src/libslic3r/PrintConfig.cpp:3652 -msgid "Pillar widening factor" -msgstr "支柱加宽系数" -#: src/libslic3r/PrintConfig.cpp:3654 -msgid "" -"Merging bridges or pillars into another pillars can increase the radius. " -"Zero means no increase, one means full increase." +#: src/libslic3r/PrintConfig.cpp:3851 +msgid "Branching (experimental)" msgstr "" -"将桥梁或柱子合并到另一个柱子中可以增加半径。零意味着没有增加,1意味着全增加。" - -#: src/libslic3r/PrintConfig.cpp:3663 -msgid "Support base diameter" -msgstr "支撑基直径" - -#: src/libslic3r/PrintConfig.cpp:3665 -msgid "Diameter in mm of the pillar base" -msgstr "柱底直径以 mm 为单位" - -#: src/libslic3r/PrintConfig.cpp:3673 -msgid "Support base height" -msgstr "支撑基座高度" - -#: src/libslic3r/PrintConfig.cpp:3675 -msgid "The height of the pillar base cone" -msgstr "柱底锥的高度" - -#: src/libslic3r/PrintConfig.cpp:3682 -msgid "Support base safety distance" -msgstr "支撑基部安全距离" -#: src/libslic3r/PrintConfig.cpp:3685 -msgid "" -"The minimum distance of the pillar base from the model in mm. Makes sense in " -"zero elevation mode where a gap according to this parameter is inserted " -"between the model and the pad." +#: src/libslic3r/PrintConfig.cpp:3860 +msgid "Support only in enforced regions" msgstr "" -"柱基与模型的最小距离 (以 mm 为单位) 在零高程模式下有意义,在模型和焊盘之间插入" -"根据此参数的间隙。" - -#: src/libslic3r/PrintConfig.cpp:3695 -msgid "Critical angle" -msgstr "临界角度" - -#: src/libslic3r/PrintConfig.cpp:3697 -msgid "The default angle for connecting support sticks and junctions." -msgstr "用于连接支撑杆和结的默认角度。" - -#: src/libslic3r/PrintConfig.cpp:3705 -msgid "Max bridge length" -msgstr "最大桥长" - -#: src/libslic3r/PrintConfig.cpp:3707 -msgid "The max length of a bridge" -msgstr "搭桥的最大长度" - -#: src/libslic3r/PrintConfig.cpp:3714 -msgid "Max pillar linking distance" -msgstr "最大柱线链接距离" - -#: src/libslic3r/PrintConfig.cpp:3716 -msgid "" -"The max distance of two pillars to get linked with each other. A zero value " -"will prohibit pillar cascading." -msgstr "两根柱子相互连接的最大距离。零值将禁止柱级联。" -#: src/libslic3r/PrintConfig.cpp:3726 -msgid "" -"How much the supports should lift up the supported object. If \"Pad around " -"object\" is enabled, this value is ignored." -msgstr "支撑应提升受支撑的对象。如果启用了\"对象周围的键盘\",则忽略此值。" +#: src/libslic3r/PrintConfig.cpp:3862 +msgid "Only create support if it lies in a support enforcer." +msgstr "" -#: src/libslic3r/PrintConfig.cpp:3737 +#: src/libslic3r/PrintConfig.cpp:3869 msgid "This is a relative measure of support points density." msgstr "这是支撑点密度的相对度量。" -#: src/libslic3r/PrintConfig.cpp:3743 +#: src/libslic3r/PrintConfig.cpp:3875 msgid "Minimal distance of the support points" msgstr "支撑点的最小距离" -#: src/libslic3r/PrintConfig.cpp:3745 +#: src/libslic3r/PrintConfig.cpp:3877 msgid "No support points will be placed closer than this threshold." msgstr "不会将任何支撑点放置在比此阈值更近的位置。" -#: src/libslic3r/PrintConfig.cpp:3751 +#: src/libslic3r/PrintConfig.cpp:3883 msgid "Use pad" msgstr "使用垫" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3885 msgid "Add a pad underneath the supported model" msgstr "在支撑模型下添加一个垫" -#: src/libslic3r/PrintConfig.cpp:3758 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "Pad wall thickness" msgstr "垫壁厚度" -#: src/libslic3r/PrintConfig.cpp:3760 +#: src/libslic3r/PrintConfig.cpp:3892 msgid "The thickness of the pad and its optional cavity walls." msgstr "垫的厚度及其可选的腔壁。" -#: src/libslic3r/PrintConfig.cpp:3768 +#: src/libslic3r/PrintConfig.cpp:3900 msgid "Pad wall height" msgstr "垫墙高度" -#: src/libslic3r/PrintConfig.cpp:3769 +#: src/libslic3r/PrintConfig.cpp:3901 msgid "" "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " "when enabling this feature, as some resins may produce an extreme suction " @@ -14273,19 +16239,19 @@ msgstr "" "定义垫腔深度。设置为零以禁用型腔。启用此功能时要小心,因为某些树脂可能在腔内产" "生极端的吸力效果,这使得从桶箔上剥下打印件变得困难。" -#: src/libslic3r/PrintConfig.cpp:3782 +#: src/libslic3r/PrintConfig.cpp:3914 msgid "Pad brim size" msgstr "垫裙边尺寸" -#: src/libslic3r/PrintConfig.cpp:3783 +#: src/libslic3r/PrintConfig.cpp:3915 msgid "How far should the pad extend around the contained geometry" msgstr "焊盘应在包含的几何体周围延伸多远" -#: src/libslic3r/PrintConfig.cpp:3793 +#: src/libslic3r/PrintConfig.cpp:3925 msgid "Max merge distance" msgstr "最大合并距离" -#: src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3927 msgid "" "Some objects can get along with a few smaller pads instead of a single big " "one. This parameter defines how far the center of two smaller pads should " @@ -14294,92 +16260,92 @@ msgstr "" "某些对象可以使用几个较小的焊盘而不是单个大垫来配合。此参数定义两个较小焊盘的" "中心应有多远。如果他们更近,他们将被合并到一个垫子。" -#: src/libslic3r/PrintConfig.cpp:3815 +#: src/libslic3r/PrintConfig.cpp:3947 msgid "Pad wall slope" msgstr "垫壁斜率" -#: src/libslic3r/PrintConfig.cpp:3817 +#: src/libslic3r/PrintConfig.cpp:3949 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "垫壁相对于床平面的斜率。90 度表示直壁。" -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3960 msgid "Create pad around object and ignore the support elevation" msgstr "在对象周围创建垫盘并忽略支撑高程" -#: src/libslic3r/PrintConfig.cpp:3833 +#: src/libslic3r/PrintConfig.cpp:3965 msgid "Pad around object everywhere" msgstr "到处都是物体" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3967 msgid "Force pad around object everywhere" msgstr "物体周围的力垫无处不在" -#: src/libslic3r/PrintConfig.cpp:3840 +#: src/libslic3r/PrintConfig.cpp:3972 msgid "Pad object gap" msgstr "垫对象间隙" -#: src/libslic3r/PrintConfig.cpp:3842 +#: src/libslic3r/PrintConfig.cpp:3974 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "在零高程模式下,对象底部和生成的垫盘之间的间隙。" -#: src/libslic3r/PrintConfig.cpp:3851 +#: src/libslic3r/PrintConfig.cpp:3983 msgid "Pad object connector stride" msgstr "垫对象连接器步长" -#: src/libslic3r/PrintConfig.cpp:3853 +#: src/libslic3r/PrintConfig.cpp:3985 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "连接对象和生成的焊盘的两个连接器杆之间的距离。" -#: src/libslic3r/PrintConfig.cpp:3860 +#: src/libslic3r/PrintConfig.cpp:3992 msgid "Pad object connector width" msgstr "垫对象连接器宽度" -#: src/libslic3r/PrintConfig.cpp:3862 +#: src/libslic3r/PrintConfig.cpp:3994 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "连接对象和生成的焊盘的连接器杆的宽度。" -#: src/libslic3r/PrintConfig.cpp:3869 +#: src/libslic3r/PrintConfig.cpp:4001 msgid "Pad object connector penetration" msgstr "垫对象连接器穿透" -#: src/libslic3r/PrintConfig.cpp:3872 +#: src/libslic3r/PrintConfig.cpp:4004 msgid "How much should the tiny connectors penetrate into the model body." msgstr "微型连接器应该渗透到模型主体中多少。" -#: src/libslic3r/PrintConfig.cpp:3879 +#: src/libslic3r/PrintConfig.cpp:4011 msgid "Enable hollowing" msgstr "启用空心化" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:4013 msgid "Hollow out a model to have an empty interior" msgstr "挖空模型使其内部空旷" -#: src/libslic3r/PrintConfig.cpp:3886 +#: src/libslic3r/PrintConfig.cpp:4018 msgid "Wall thickness" msgstr "壁厚" -#: src/libslic3r/PrintConfig.cpp:3888 +#: src/libslic3r/PrintConfig.cpp:4020 msgid "Minimum wall thickness of a hollowed model." msgstr "中空模型的最小壁厚。" -#: src/libslic3r/PrintConfig.cpp:3896 +#: src/libslic3r/PrintConfig.cpp:4028 msgid "Accuracy" msgstr "精确" -#: src/libslic3r/PrintConfig.cpp:3898 +#: src/libslic3r/PrintConfig.cpp:4030 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." msgstr "性能与计算精度。较低的值可能会产生不需要的瑕疵。" -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:4040 msgid "" "Hollowing is done in two steps: first, an imaginary interior is calculated " "deeper (offset plus the closing distance) in the object and then it's " @@ -14391,11 +16357,11 @@ msgstr "" "离),然后将其充气回指定的偏移量。更大的闭合距离使内部更圆。零度时,内部与外" "部最为相似。" -#: src/libslic3r/PrintConfig.cpp:3920 +#: src/libslic3r/PrintConfig.cpp:4052 msgid "Print speed" msgstr "打印速度" -#: src/libslic3r/PrintConfig.cpp:3922 +#: src/libslic3r/PrintConfig.cpp:4054 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " @@ -14404,139 +16370,171 @@ msgstr "" "当使用粘度更高的材料或一些中空零件时,可能需要较慢的打印速度。它会减缓倾斜运" "动,并在曝光前增加延迟。" -#: src/libslic3r/PrintConfig.cpp:4390 +#: src/libslic3r/PrintConfig.cpp:4065 +msgid "Format of the output SLA archive" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4070 +msgid "SLA output precision" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4071 +msgid "Minimum resolution in nanometers" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4542 msgid "Export OBJ" msgstr "导出 OBJ" -#: src/libslic3r/PrintConfig.cpp:4391 +#: src/libslic3r/PrintConfig.cpp:4543 msgid "Export the model(s) as OBJ." msgstr "将模型导出为 OBJ。" -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4554 msgid "Export SLA" msgstr "导出 SLA" -#: src/libslic3r/PrintConfig.cpp:4403 +#: src/libslic3r/PrintConfig.cpp:4555 msgid "Slice the model and export SLA printing layers as PNG." msgstr "将模型切片并导出 SLA 打印图层为 PNG。" -#: src/libslic3r/PrintConfig.cpp:4408 +#: src/libslic3r/PrintConfig.cpp:4560 msgid "Export 3MF" msgstr "导出 3MF" -#: src/libslic3r/PrintConfig.cpp:4409 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Export the model(s) as 3MF." msgstr "将模型导出为 3MF。" -#: src/libslic3r/PrintConfig.cpp:4413 +#: src/libslic3r/PrintConfig.cpp:4565 msgid "Export AMF" msgstr "导出 AMF" -#: src/libslic3r/PrintConfig.cpp:4414 +#: src/libslic3r/PrintConfig.cpp:4566 msgid "Export the model(s) as AMF." msgstr "将模型导出为 AMF。" -#: src/libslic3r/PrintConfig.cpp:4418 +#: src/libslic3r/PrintConfig.cpp:4570 msgid "Export STL" msgstr "导出 STL" -#: src/libslic3r/PrintConfig.cpp:4419 +#: src/libslic3r/PrintConfig.cpp:4571 msgid "Export the model(s) as STL." msgstr "将模型导出为 STL。" -#: src/libslic3r/PrintConfig.cpp:4424 +#: src/libslic3r/PrintConfig.cpp:4576 msgid "Slice the model and export toolpaths as G-code." msgstr "切片模型并导出工具路径为 G-Code。" -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4581 msgid "G-code viewer" msgstr "G-Code 查看器" -#: src/libslic3r/PrintConfig.cpp:4430 +#: src/libslic3r/PrintConfig.cpp:4582 msgid "Visualize an already sliced and saved G-code" msgstr "可视化已经切片并保存的 G-Code" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4588 +msgid "OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4589 +msgid "Select the specified OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4594 +msgid "OpenGL debug output" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4595 +msgid "Activate OpenGL debug output on graphic cards which support it" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4601 msgid "Slice" msgstr "切片" -#: src/libslic3r/PrintConfig.cpp:4436 +#: src/libslic3r/PrintConfig.cpp:4602 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "根据 printer_technology 值将模型切片为 FFF 或 SLA。" -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4607 msgid "Help" msgstr "帮助" -#: src/libslic3r/PrintConfig.cpp:4442 +#: src/libslic3r/PrintConfig.cpp:4608 msgid "Show this help." msgstr "显示此帮助。" -#: src/libslic3r/PrintConfig.cpp:4447 +#: src/libslic3r/PrintConfig.cpp:4613 msgid "Help (FFF options)" msgstr "帮助(FFF 选项)" -#: src/libslic3r/PrintConfig.cpp:4448 +#: src/libslic3r/PrintConfig.cpp:4614 msgid "Show the full list of print/G-code configuration options." msgstr "显示打印/G-Code 配置选项的完整列表。" -#: src/libslic3r/PrintConfig.cpp:4452 +#: src/libslic3r/PrintConfig.cpp:4618 msgid "Help (SLA options)" msgstr "帮助(SLA 选项)" -#: src/libslic3r/PrintConfig.cpp:4453 +#: src/libslic3r/PrintConfig.cpp:4619 msgid "Show the full list of SLA print configuration options." msgstr "显示 SLA 打印配置选项的完整列表。" -#: src/libslic3r/PrintConfig.cpp:4457 +#: src/libslic3r/PrintConfig.cpp:4623 msgid "Output Model Info" msgstr "输出模型信息" -#: src/libslic3r/PrintConfig.cpp:4458 +#: src/libslic3r/PrintConfig.cpp:4624 msgid "Write information about the model to the console." msgstr "将有关模型的信息写入控制台。" -#: src/libslic3r/PrintConfig.cpp:4462 +#: src/libslic3r/PrintConfig.cpp:4628 msgid "Save config file" msgstr "保存配置文件" -#: src/libslic3r/PrintConfig.cpp:4463 +#: src/libslic3r/PrintConfig.cpp:4629 msgid "Save configuration to the specified file." msgstr "将配置保存到指定文件。" -#: src/libslic3r/PrintConfig.cpp:4473 +#: src/libslic3r/PrintConfig.cpp:4639 msgid "Align XY" msgstr "对齐 XY" -#: src/libslic3r/PrintConfig.cpp:4474 +#: src/libslic3r/PrintConfig.cpp:4640 msgid "Align the model to the given point." msgstr "将模型与给定点对齐。" -#: src/libslic3r/PrintConfig.cpp:4479 +#: src/libslic3r/PrintConfig.cpp:4645 msgid "Cut model at the given Z." msgstr "在给定的 Z 处切割模型。" -#: src/libslic3r/PrintConfig.cpp:4501 +#: src/libslic3r/PrintConfig.cpp:4666 +msgid "Center" +msgstr "居中" + +#: src/libslic3r/PrintConfig.cpp:4667 msgid "Center the print around the given center." msgstr "将打印居中,以给定的中心为中心。" -#: src/libslic3r/PrintConfig.cpp:4505 +#: src/libslic3r/PrintConfig.cpp:4671 msgid "Don't arrange" msgstr "不自动布局" -#: src/libslic3r/PrintConfig.cpp:4506 +#: src/libslic3r/PrintConfig.cpp:4672 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "在合并之前,不要重新布局给定的模型并保留其原始 XY 坐标。" -#: src/libslic3r/PrintConfig.cpp:4509 +#: src/libslic3r/PrintConfig.cpp:4675 msgid "Ensure on bed" msgstr "确保在床上" -#: src/libslic3r/PrintConfig.cpp:4510 +#: src/libslic3r/PrintConfig.cpp:4676 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." @@ -14544,89 +16542,97 @@ msgstr "" "当物体部分位于床下方时,将其抬到床上方。默认情况下,使用 --no-sure-on-bed 禁" "用。" -#: src/libslic3r/PrintConfig.cpp:4514 +#: src/libslic3r/PrintConfig.cpp:4680 msgid "Duplicate" msgstr "复制" -#: src/libslic3r/PrintConfig.cpp:4515 +#: src/libslic3r/PrintConfig.cpp:4681 msgid "Multiply copies by this factor." msgstr "生成乘以此数量的副本。" -#: src/libslic3r/PrintConfig.cpp:4519 +#: src/libslic3r/PrintConfig.cpp:4685 msgid "Duplicate by grid" msgstr "按网格复制" -#: src/libslic3r/PrintConfig.cpp:4520 +#: src/libslic3r/PrintConfig.cpp:4686 msgid "Multiply copies by creating a grid." msgstr "通过创建网格来创建副本。" -#: src/libslic3r/PrintConfig.cpp:4524 +#: src/libslic3r/PrintConfig.cpp:4690 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." msgstr "" "将提供的模型排列在一个板中,并将它们合并到单个模型中,以便执行一次操作。" -#: src/libslic3r/PrintConfig.cpp:4529 +#: src/libslic3r/PrintConfig.cpp:4695 msgid "" "Try to repair any non-manifold meshes (this option is implicitly added " "whenever we need to slice the model to perform the requested action)." msgstr "" "尝试修复面(每当我们需要执行模型切片请求的操作时,都会隐式添加此选项)。" -#: src/libslic3r/PrintConfig.cpp:4533 +#: src/libslic3r/PrintConfig.cpp:4699 msgid "Rotation angle around the Z axis in degrees." msgstr "围绕 Z 轴的旋转角度(以度表示)。" -#: src/libslic3r/PrintConfig.cpp:4537 +#: src/libslic3r/PrintConfig.cpp:4703 msgid "Rotate around X" msgstr "围绕 X 旋转" -#: src/libslic3r/PrintConfig.cpp:4538 +#: src/libslic3r/PrintConfig.cpp:4704 msgid "Rotation angle around the X axis in degrees." msgstr "围绕 X 轴的旋转角度(以度表示)。" -#: src/libslic3r/PrintConfig.cpp:4542 +#: src/libslic3r/PrintConfig.cpp:4708 msgid "Rotate around Y" msgstr "围绕 Y 旋转" -#: src/libslic3r/PrintConfig.cpp:4543 +#: src/libslic3r/PrintConfig.cpp:4709 msgid "Rotation angle around the Y axis in degrees." msgstr "围绕 Y 轴的旋转角度(以度表示)。" -#: src/libslic3r/PrintConfig.cpp:4548 +#: src/libslic3r/PrintConfig.cpp:4714 msgid "Scaling factor or percentage." msgstr "缩放因子或百分比。" -#: src/libslic3r/PrintConfig.cpp:4553 +#: src/libslic3r/PrintConfig.cpp:4719 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "检测给定模型中的未连接部件,并将它们拆分为单独的对象。" -#: src/libslic3r/PrintConfig.cpp:4556 +#: src/libslic3r/PrintConfig.cpp:4722 msgid "Scale to Fit" msgstr "缩放至合适" -#: src/libslic3r/PrintConfig.cpp:4557 +#: src/libslic3r/PrintConfig.cpp:4723 msgid "Scale to fit the given volume." msgstr "缩放以适合给定的空间。" -#: src/libslic3r/PrintConfig.cpp:4566 +#: src/libslic3r/PrintConfig.cpp:4727 +msgid "Delete files after loading" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4728 +msgid "Delete files after loading." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4736 msgid "Ignore non-existent config files" msgstr "忽略不存在的配置文件" -#: src/libslic3r/PrintConfig.cpp:4567 +#: src/libslic3r/PrintConfig.cpp:4737 msgid "Do not fail if a file supplied to --load does not exist." msgstr "如果提供给 --load 的文件不存在,不会报错失败。" -#: src/libslic3r/PrintConfig.cpp:4570 +#: src/libslic3r/PrintConfig.cpp:4740 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." msgstr "从配置文件和项目文件(3MF、AMF)加载配置时的转发兼容性规则。" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4741 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -14637,47 +16643,47 @@ msgstr "" "的 PrusaSlicer 可能会扩展支持的固件版本列表。人们可能会决定退出,或者用默认值" "悄悄地或详细地替换未知值。" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4745 msgid "Bail out on unknown configuration values" msgstr "对未知的配置值进行保护" -#: src/libslic3r/PrintConfig.cpp:4579 +#: src/libslic3r/PrintConfig.cpp:4746 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." msgstr "通过用默认值详细替换未知配置值来启用读取。" -#: src/libslic3r/PrintConfig.cpp:4580 +#: src/libslic3r/PrintConfig.cpp:4747 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." msgstr "通过用默认值替换未知配置值来启用读取。" -#: src/libslic3r/PrintConfig.cpp:4584 +#: src/libslic3r/PrintConfig.cpp:4752 msgid "Load config file" msgstr "加载配置文件" -#: src/libslic3r/PrintConfig.cpp:4585 +#: src/libslic3r/PrintConfig.cpp:4753 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." msgstr "从指定文件加载配置。可以加载多次来从多个文件加载选项。" -#: src/libslic3r/PrintConfig.cpp:4588 +#: src/libslic3r/PrintConfig.cpp:4756 msgid "Output File" msgstr "输出文件" -#: src/libslic3r/PrintConfig.cpp:4589 +#: src/libslic3r/PrintConfig.cpp:4757 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." msgstr "将写入输出的文件(如果未指定,则基于输入文件)。" -#: src/libslic3r/PrintConfig.cpp:4593 +#: src/libslic3r/PrintConfig.cpp:4761 msgid "Single instance mode" msgstr "单实例模式" -#: src/libslic3r/PrintConfig.cpp:4594 +#: src/libslic3r/PrintConfig.cpp:4762 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -14686,11 +16692,11 @@ msgstr "" "如果启用,命令行参数将发送到 GUI PrusaSlicer 的现有实例,或者激活现有的 " "PrusaSlicer 窗口。覆盖应用程序首选项中的“单实例”配置值。" -#: src/libslic3r/PrintConfig.cpp:4605 +#: src/libslic3r/PrintConfig.cpp:4767 msgid "Data directory" msgstr "数据目录" -#: src/libslic3r/PrintConfig.cpp:4606 +#: src/libslic3r/PrintConfig.cpp:4768 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -14699,11 +16705,11 @@ msgstr "" "在给定目录加载和存储设置。这对于维护不同的配置文件或包括网络存储中的配置非常" "有用。" -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4771 msgid "Logging level" msgstr "日志级别" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4772 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -14712,11 +16718,11 @@ msgstr "" "设置日志敏感度。0:致命、1:错误、2:警告、3:信息、4:调试、5:跟踪\n" "例如。loglevel=2 记录致命、错误和警告级别的消息。" -#: src/libslic3r/PrintConfig.cpp:4616 +#: src/libslic3r/PrintConfig.cpp:4778 msgid "Render with a software renderer" msgstr "使用软件渲染器渲染" -#: src/libslic3r/PrintConfig.cpp:4617 +#: src/libslic3r/PrintConfig.cpp:4779 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -14728,18 +16734,30 @@ msgstr "" msgid "Error with zip archive" msgstr "使用 zip 存档时出错" -#: src/libslic3r/PrintObject.cpp:126 +#: src/libslic3r/PrintObject.cpp:152 msgid "Generating perimeters" msgstr "生成轮廓" -#: src/libslic3r/PrintObject.cpp:229 +#: src/libslic3r/PrintObject.cpp:257 msgid "Preparing infill" msgstr "准备填充" -#: src/libslic3r/PrintObject.cpp:403 +#: src/libslic3r/PrintObject.cpp:402 +msgid "making infill" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:449 +msgid "Searching support spots" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:474 msgid "Generating support material" msgstr "生成支撑材料" +#: src/libslic3r/PrintObject.cpp:495 +msgid "Estimating curled extrusions" +msgstr "" + #: resources/data/hints.ini: [hint:Fuzzy skin] msgid "" "Fuzzy skin\n" @@ -15113,6 +17131,36 @@ msgstr "" "全屏模式\n" "您知道可以将 PrusaSlicer 切换到全屏模式吗?使用F11热键。" +#: resources/data/hints.ini: [hint:Printables integration] +msgid "" +"Printables.com integration\n" +"Did you know that when you are browsing Printables.com, you can send 3D " +"model files to PrusaSlicer with a single click? Learn more in the " +"documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Cut tool] +msgid "" +"Cut tool\n" +"Did you know that you can cut a model at any angle and even create aligning " +"pins with the updated Cut tool? Learn more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Measurement tool] +msgid "" +"Measurement tool\n" +"Did you know that you can measure the distances between points, edges " +"and planes, the radius of a hole or the angle between edges or planes? Learn " +"more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Text tool] +msgid "" +"Text tool\n" +"Did you know that you can add custom text labels to your models or even use " +"the text as a modifier? Learn more in the documentation." +msgstr "" + #: ../src/common/debugrpt.cpp:586 msgid "" "\n" @@ -16271,6 +18319,10 @@ msgstr "左对齐" msgid "Align Right" msgstr "右对齐" +#: ../src/richtext/richtextsizepage.cpp:266 +msgid "Alignment" +msgstr "对齐" + #: ../src/generic/filectrlg.cpp:1197 ../src/common/fldlgcmn.cpp:107 #, c-format msgid "All files (%s)|%s" @@ -17568,10 +19620,6 @@ msgstr "修饰" msgid "Default encoding" msgstr "缺省编码" -#: ../src/dfb/fontmgr.cpp:180 -msgid "Default font" -msgstr "缺省字体" - #: ../src/generic/prntdlgg.cpp:510 msgid "Default printer" msgstr "缺省的打印机" @@ -17936,11 +19984,6 @@ msgstr "打印时出错: " msgid "Error: " msgstr "错误: " -#. TRANSLATORS: Name of keyboard key -#: ../src/common/accelcmn.cpp:69 -msgid "Esc" -msgstr "" - #. TRANSLATORS: Name of keyboard key #: ../src/common/accelcmn.cpp:70 #, fuzzy @@ -18685,11 +20728,6 @@ msgstr "软盘" msgid "Folio, 8 1/2 x 13 in" msgstr "对开纸, 8 1/2 x 13 英寸" -#: ../src/richtext/richtextformatdlg.cpp:344 ../src/osx/carbon/fontdlg.cpp:287 -#: ../src/common/stockitem.cpp:194 -msgid "Font" -msgstr "字体" - #: ../src/richtext/richtextfontpage.cpp:221 msgid "Font &weight:" msgstr "字体粗细(&w):" @@ -19813,10 +21851,6 @@ msgstr "内存 VFS 已包含文件 '%s'!" msgid "Menu" msgstr "菜单" -#: ../src/common/msgout.cpp:124 -msgid "Message" -msgstr "消息" - #: ../src/univ/themes/metal.cpp:168 msgid "Metal theme" msgstr "金属主题" @@ -19850,10 +21884,6 @@ msgstr "缺少必要参数。" msgid "Modern" msgstr "现代" -#: ../src/generic/filectrlg.cpp:427 -msgid "Modified" -msgstr "修改日期" - #: ../src/common/module.cpp:133 #, c-format msgid "Module \"%s\" initialization failed" @@ -19943,11 +21973,6 @@ msgstr "新名称" msgid "Next page" msgstr "下一页" -#: ../include/wx/msgdlg.h:277 ../src/common/stockitem.cpp:177 -#: ../src/motif/msgdlg.cpp:196 -msgid "No" -msgstr "否" - #. TRANSLATORS: System cursor name #: ../src/propgrid/advprops.cpp:1764 msgid "No Entry" @@ -20188,12 +22213,6 @@ msgstr "" msgid "Numbered outline" msgstr "大纲标号" -#: ../include/wx/msgdlg.h:278 ../src/richtext/richtextstyledlg.cpp:297 -#: ../src/common/stockitem.cpp:178 ../src/msw/msgdlg.cpp:454 -#: ../src/msw/msgdlg.cpp:747 ../src/gtk1/fontdlg.cpp:138 -msgid "OK" -msgstr "确认" - #: ../src/msw/ole/automtn.cpp:692 #, c-format msgid "OLE Automation error in %s: %s" @@ -20264,6 +22283,10 @@ msgstr "选项 '%s' 需要值。" msgid "Option '%s': '%s' cannot be converted to a date." msgstr "选项 '%s': '%s' 无法转成日期。" +#: ../src/generic/prntdlgg.cpp:618 +msgid "Options" +msgstr "选项" + #: ../src/propgrid/advprops.cpp:1606 msgid "Orange" msgstr "" @@ -21053,10 +23076,6 @@ msgstr "选择是否斜体。" msgid "Select underlining or no underlining." msgstr "选择是否下划线" -#: ../src/motif/filedlg.cpp:220 -msgid "Selection" -msgstr "选区" - #: ../src/richtext/richtextliststylepage.cpp:187 #: ../src/richtext/richtextliststylepage.cpp:189 msgid "Selects the list level to edit." @@ -21935,10 +23954,6 @@ msgstr "试图从内存 VFS 中移去文件 '%s',但它并没有被装入内 msgid "Turkish (ISO-8859-9)" msgstr "土耳其语 (ISO-8859-9)" -#: ../src/generic/filectrlg.cpp:426 -msgid "Type" -msgstr "类型" - #: ../src/richtext/richtextfontpage.cpp:151 #: ../src/richtext/richtextfontpage.cpp:153 msgid "Type a font name." @@ -22423,10 +24438,6 @@ msgstr "使用当前的对齐设置。" msgid "Validation conflict" msgstr "验证冲突" -#: ../src/propgrid/manager.cpp:238 -msgid "Value" -msgstr "值" - #: ../src/propgrid/props.cpp:386 ../src/propgrid/props.cpp:500 #, c-format msgid "Value must be %s or higher." @@ -22662,11 +24673,6 @@ msgstr "XPM: 图像数据被截断,位于行 %d!" msgid "Yellow" msgstr "" -#: ../include/wx/msgdlg.h:276 ../src/common/stockitem.cpp:206 -#: ../src/motif/msgdlg.cpp:196 -msgid "Yes" -msgstr "是" - #: ../src/osx/carbon/overlay.cpp:155 msgid "You cannot Clear an overlay that is not inited" msgstr "你无法清除未初始化的 overlay。" diff --git a/resources/localization/zh_TW/PrusaSlicer.mo b/resources/localization/zh_TW/PrusaSlicer.mo index 727b1edb26fc4a0c8e92d6c0fe4039aa2a43fdfa..92f8496657a797327528daf3aa6392cbea074c4f 100644 GIT binary patch delta 66571 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%0D*@b=u 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 , patched traditional " "chinese by Cheng-Hsien Ho \n" @@ -20,54 +20,54 @@ msgstr "" "X-Poedit-SearchPath-1: xs/xrc/slic3r/GUI\n" "X-Poedit-SearchPath-2: xs/xrc/slic3r\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 +#: src/slic3r/GUI/AboutDialog.cpp:46 src/slic3r/GUI/AboutDialog.cpp:306 msgid "Portions copyright" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 +#: src/slic3r/GUI/AboutDialog.cpp:143 src/slic3r/GUI/AboutDialog.cpp:270 msgid "Copyright" msgstr "" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:143 +#: src/slic3r/GUI/AboutDialog.cpp:145 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:212 +#: src/slic3r/GUI/AboutDialog.cpp:214 #, c-format, boost-format msgid "About %s" msgstr "關於 %s" -#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 -#: src/slic3r/GUI/GUI_App.cpp:262 +#: src/slic3r/GUI/AboutDialog.cpp:245 src/slic3r/GUI/AboutDialog.cpp:370 +#: src/slic3r/GUI/GUI_App.cpp:271 msgid "Version" msgstr "版本" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:277 msgid "is licensed under the" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:273 src/slic3r/GUI/GUI_App.cpp:277 msgid "GNU Affero General Public License, version 3" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:273 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:274 +#: src/slic3r/GUI/AboutDialog.cpp:275 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " "numerous others." msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:310 +#: src/slic3r/GUI/AboutDialog.cpp:311 msgid "Copy Version Info" msgstr "" @@ -91,54 +91,54 @@ msgid "" msgstr "" #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:162 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:204 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:188 msgid "Slicing complete" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:199 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183 #, boost-format msgid "Masked SLA file exported to %1%" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:286 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:279 msgid "Access violation" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:288 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:281 msgid "Illegal instruction" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:283 msgid "Divide by zero" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:292 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:285 msgid "Overflow" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:294 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:287 msgid "Underflow" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:297 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:290 msgid "Floating reserved operand" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:300 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:293 msgid "Stack overflow" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:659 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:726 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:652 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:719 msgid "Running post-processing scripts" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:690 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:710 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:683 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:703 msgid "Unknown error occured during exporting G-code." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:695 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:688 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. Maybe the SD " @@ -146,7 +146,7 @@ msgid "" "Error message: %1%" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:698 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:691 #, boost-format msgid "" "Copying of the temporary G-code to the output G-code failed. There might be " @@ -154,44 +154,45 @@ msgid "" "device. The corrupted output G-code is at %1%.tmp." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:701 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:694 #, boost-format msgid "" "Renaming of the G-code after copying to the selected destination folder has " "failed. Current path is %1%.tmp. Please try exporting again." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:704 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:697 #, boost-format msgid "" "Copying of the temporary G-code has finished but the original code at %1% " "couldn't be opened during copy check. The output G-code is at %2%.tmp." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:707 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:700 #, boost-format msgid "" "Copying of the temporary G-code has finished but the exported code couldn't " "be opened during copy check. The output G-code is at %1%.tmp." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:715 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:708 #, boost-format msgid "G-code file exported to %1%" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:729 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:722 msgid "Copying of the temporary G-code to the output G-code failed" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:751 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:738 #, boost-format msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:31 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2765 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1576 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:241 src/slic3r/GUI/Plater.cpp:220 +#: src/slic3r/GUI/Tab.cpp:2697 msgid "Size" msgstr "尺寸" @@ -199,7 +200,9 @@ msgstr "尺寸" msgid "Origin" msgstr "原點" -#: src/slic3r/GUI/BedShapeDialog.cpp:33 src/libslic3r/PrintConfig.cpp:1020 +#: src/slic3r/GUI/BedShapeDialog.cpp:33 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1994 +#: src/libslic3r/PrintConfig.cpp:1109 msgid "Diameter" msgstr "直徑" @@ -213,54 +216,62 @@ msgid "" "rectangle." msgstr "G-code 0,0 座標相對於矩形框左前角落的距離。" -#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:262 -#: src/slic3r/GUI/ConfigWizard.cpp:1476 src/slic3r/GUI/ConfigWizard.cpp:1490 +#: src/slic3r/GUI/BedShapeDialog.cpp:64 src/slic3r/GUI/ConfigWizard.cpp:291 +#: src/slic3r/GUI/ConfigWizard.cpp:1796 src/slic3r/GUI/ConfigWizard.cpp:1832 +#: src/slic3r/GUI/ConfigWizard.cpp:1846 #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:100 -#: src/slic3r/GUI/GCodeViewer.cpp:3181 src/slic3r/GUI/GCodeViewer.cpp:3187 -#: src/slic3r/GUI/GCodeViewer.cpp:3195 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 src/slic3r/GUI/GCodeViewer.cpp:3455 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 #: src/slic3r/GUI/GUI_ObjectLayers.cpp:145 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 src/libslic3r/PrintConfig.cpp:263 -#: src/libslic3r/PrintConfig.cpp:290 src/libslic3r/PrintConfig.cpp:297 -#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:520 -#: src/libslic3r/PrintConfig.cpp:546 src/libslic3r/PrintConfig.cpp:621 -#: src/libslic3r/PrintConfig.cpp:629 src/libslic3r/PrintConfig.cpp:679 -#: src/libslic3r/PrintConfig.cpp:813 src/libslic3r/PrintConfig.cpp:824 -#: src/libslic3r/PrintConfig.cpp:842 src/libslic3r/PrintConfig.cpp:1023 -#: src/libslic3r/PrintConfig.cpp:1235 src/libslic3r/PrintConfig.cpp:1302 -#: src/libslic3r/PrintConfig.cpp:1312 src/libslic3r/PrintConfig.cpp:1611 -#: src/libslic3r/PrintConfig.cpp:1805 src/libslic3r/PrintConfig.cpp:1866 -#: src/libslic3r/PrintConfig.cpp:1884 src/libslic3r/PrintConfig.cpp:1902 -#: src/libslic3r/PrintConfig.cpp:1965 src/libslic3r/PrintConfig.cpp:1975 -#: src/libslic3r/PrintConfig.cpp:2097 src/libslic3r/PrintConfig.cpp:2106 -#: src/libslic3r/PrintConfig.cpp:2125 src/libslic3r/PrintConfig.cpp:2146 -#: src/libslic3r/PrintConfig.cpp:2158 src/libslic3r/PrintConfig.cpp:2166 -#: src/libslic3r/PrintConfig.cpp:2207 src/libslic3r/PrintConfig.cpp:2215 -#: src/libslic3r/PrintConfig.cpp:2225 src/libslic3r/PrintConfig.cpp:2233 -#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2303 -#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2603 -#: src/libslic3r/PrintConfig.cpp:2620 src/libslic3r/PrintConfig.cpp:2721 -#: src/libslic3r/PrintConfig.cpp:2730 src/libslic3r/PrintConfig.cpp:2780 -#: src/libslic3r/PrintConfig.cpp:2932 src/libslic3r/PrintConfig.cpp:3020 -#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3034 -#: src/libslic3r/PrintConfig.cpp:3048 src/libslic3r/PrintConfig.cpp:3072 -#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3092 -#: src/libslic3r/PrintConfig.cpp:3372 src/libslic3r/PrintConfig.cpp:3413 -#: src/libslic3r/PrintConfig.cpp:3573 src/libslic3r/PrintConfig.cpp:3582 -#: src/libslic3r/PrintConfig.cpp:3591 src/libslic3r/PrintConfig.cpp:3601 -#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3676 -#: src/libslic3r/PrintConfig.cpp:3688 src/libslic3r/PrintConfig.cpp:3708 -#: src/libslic3r/PrintConfig.cpp:3718 src/libslic3r/PrintConfig.cpp:3728 -#: src/libslic3r/PrintConfig.cpp:3746 src/libslic3r/PrintConfig.cpp:3761 -#: src/libslic3r/PrintConfig.cpp:3775 src/libslic3r/PrintConfig.cpp:3786 -#: src/libslic3r/PrintConfig.cpp:3799 src/libslic3r/PrintConfig.cpp:3844 -#: src/libslic3r/PrintConfig.cpp:3854 src/libslic3r/PrintConfig.cpp:3863 -#: src/libslic3r/PrintConfig.cpp:3873 src/libslic3r/PrintConfig.cpp:3889 -#: src/libslic3r/PrintConfig.cpp:3913 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 src/libslic3r/PrintConfig.cpp:279 +#: src/libslic3r/PrintConfig.cpp:303 src/libslic3r/PrintConfig.cpp:310 +#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:657 src/libslic3r/PrintConfig.cpp:724 +#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:782 +#: src/libslic3r/PrintConfig.cpp:902 src/libslic3r/PrintConfig.cpp:913 +#: src/libslic3r/PrintConfig.cpp:931 src/libslic3r/PrintConfig.cpp:1112 +#: src/libslic3r/PrintConfig.cpp:1295 src/libslic3r/PrintConfig.cpp:1359 +#: src/libslic3r/PrintConfig.cpp:1369 src/libslic3r/PrintConfig.cpp:1650 +#: src/libslic3r/PrintConfig.cpp:1842 src/libslic3r/PrintConfig.cpp:1903 +#: src/libslic3r/PrintConfig.cpp:1921 src/libslic3r/PrintConfig.cpp:1939 +#: src/libslic3r/PrintConfig.cpp:1995 src/libslic3r/PrintConfig.cpp:2005 +#: src/libslic3r/PrintConfig.cpp:2127 src/libslic3r/PrintConfig.cpp:2136 +#: src/libslic3r/PrintConfig.cpp:2155 src/libslic3r/PrintConfig.cpp:2176 +#: src/libslic3r/PrintConfig.cpp:2188 src/libslic3r/PrintConfig.cpp:2196 +#: src/libslic3r/PrintConfig.cpp:2237 src/libslic3r/PrintConfig.cpp:2245 +#: src/libslic3r/PrintConfig.cpp:2255 src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2271 src/libslic3r/PrintConfig.cpp:2336 +#: src/libslic3r/PrintConfig.cpp:2565 src/libslic3r/PrintConfig.cpp:2632 +#: src/libslic3r/PrintConfig.cpp:2647 src/libslic3r/PrintConfig.cpp:2746 +#: src/libslic3r/PrintConfig.cpp:2755 src/libslic3r/PrintConfig.cpp:2801 +#: src/libslic3r/PrintConfig.cpp:2886 src/libslic3r/PrintConfig.cpp:2896 +#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3108 +#: src/libslic3r/PrintConfig.cpp:3115 src/libslic3r/PrintConfig.cpp:3122 +#: src/libslic3r/PrintConfig.cpp:3136 src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3170 src/libslic3r/PrintConfig.cpp:3180 +#: src/libslic3r/PrintConfig.cpp:3330 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3391 src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3444 src/libslic3r/PrintConfig.cpp:3456 +#: src/libslic3r/PrintConfig.cpp:3476 src/libslic3r/PrintConfig.cpp:3491 +#: src/libslic3r/PrintConfig.cpp:3501 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3681 src/libslic3r/PrintConfig.cpp:3878 +#: src/libslic3r/PrintConfig.cpp:3893 src/libslic3r/PrintConfig.cpp:3907 +#: src/libslic3r/PrintConfig.cpp:3918 src/libslic3r/PrintConfig.cpp:3931 +#: src/libslic3r/PrintConfig.cpp:3976 src/libslic3r/PrintConfig.cpp:3986 +#: src/libslic3r/PrintConfig.cpp:3995 src/libslic3r/PrintConfig.cpp:4005 +#: src/libslic3r/PrintConfig.cpp:4021 src/libslic3r/PrintConfig.cpp:4045 +#: src/libslic3r/PrintConfig.cpp:4072 msgid "mm" msgstr "毫米" @@ -278,13 +289,13 @@ msgstr "矩形" msgid "Circular" msgstr "圓形" -#: src/slic3r/GUI/BedShapeDialog.cpp:81 src/slic3r/GUI/GUI_Preview.cpp:252 -#: src/libslic3r/ExtrusionEntity.cpp:343 src/libslic3r/ExtrusionEntity.cpp:378 +#: src/slic3r/GUI/BedShapeDialog.cpp:81 msgid "Custom" msgstr "自定義" #: src/slic3r/GUI/BedShapeDialog.cpp:104 src/slic3r/GUI/BedShapeDialog.cpp:179 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1701 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1565 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1798 msgid "Shape" msgstr "形狀" @@ -292,8 +303,8 @@ msgstr "形狀" msgid "Load shape from STL..." msgstr "從STL文件加載形狀..." -#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2147 +#: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3914 +#: src/slic3r/GUI/MainFrame.cpp:2240 msgid "Settings" msgstr "設置" @@ -306,7 +317,7 @@ msgid "Load..." msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/Tab.cpp:3973 msgid "Remove" msgstr "移除" @@ -318,107 +329,174 @@ msgstr "" msgid "Model" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:508 +#: src/slic3r/GUI/BedShapeDialog.cpp:506 msgid "Choose an STL file to import bed shape from:" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:514 src/slic3r/GUI/BedShapeDialog.cpp:562 -#: src/slic3r/GUI/BedShapeDialog.cpp:584 +#: src/slic3r/GUI/BedShapeDialog.cpp:512 src/slic3r/GUI/BedShapeDialog.cpp:560 +#: src/slic3r/GUI/BedShapeDialog.cpp:582 msgid "Invalid file format." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:525 +#: src/slic3r/GUI/BedShapeDialog.cpp:523 msgid "Error! Invalid model" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:533 +#: src/slic3r/GUI/BedShapeDialog.cpp:531 msgid "The selected file contains no geometry." msgstr "所選文件不包含任何幾何圖形。" -#: src/slic3r/GUI/BedShapeDialog.cpp:537 +#: src/slic3r/GUI/BedShapeDialog.cpp:535 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "所選文件包含多個不重合的區域。暫不支持這種類型。" -#: src/slic3r/GUI/BedShapeDialog.cpp:552 +#: src/slic3r/GUI/BedShapeDialog.cpp:550 msgid "Choose a file to import bed texture from (PNG/SVG):" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:574 +#: src/slic3r/GUI/BedShapeDialog.cpp:572 msgid "Choose an STL file to import bed model from:" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.hpp:95 src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/BedShapeDialog.hpp:96 src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape" msgstr "熱牀形狀" -#: src/slic3r/GUI/BonjourDialog.cpp:55 +#: src/slic3r/GUI/BonjourDialog.cpp:58 msgid "Network lookup" msgstr "從網絡查找" -#: src/slic3r/GUI/BonjourDialog.cpp:72 +#: src/slic3r/GUI/BonjourDialog.cpp:75 src/slic3r/GUI/BonjourDialog.cpp:253 msgid "Address" msgstr "地址" -#: src/slic3r/GUI/BonjourDialog.cpp:73 +#: src/slic3r/GUI/BonjourDialog.cpp:76 msgid "Hostname" msgstr "主機名" -#: src/slic3r/GUI/BonjourDialog.cpp:74 +#: src/slic3r/GUI/BonjourDialog.cpp:77 msgid "Service name" msgstr "服務名稱" -#: src/slic3r/GUI/BonjourDialog.cpp:76 +#: src/slic3r/GUI/BonjourDialog.cpp:79 msgid "OctoPrint version" msgstr "OctoPrint 版本" -#: src/slic3r/GUI/BonjourDialog.cpp:224 +#: src/slic3r/GUI/BonjourDialog.cpp:227 msgid "Searching for devices" msgstr "正在查找設備" -#: src/slic3r/GUI/BonjourDialog.cpp:231 +#: src/slic3r/GUI/BonjourDialog.cpp:234 msgid "Finished" msgstr "已完成" -#: src/slic3r/GUI/ButtonsDescription.cpp:42 +#: src/slic3r/GUI/BonjourDialog.cpp:240 +msgid "Multiple resolved IP addresses" +msgstr "" + +#: src/slic3r/GUI/BonjourDialog.cpp:249 +#, boost-format +msgid "" +"There are several IP addresses resolving to hostname %1%.\n" +"Please select one that should be used." +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:21 +msgid "Palette 1 (default)" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:22 +msgid "Palette 2" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:23 +msgid "Palette 3" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:24 +msgid "Palette 4" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:25 +msgid "Palette 5" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:26 +msgid "Palette 6" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:27 +msgid "Palette 7" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:28 +msgid "Palette 8" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:112 msgid "Revert color to default" msgstr "" -#: src/slic3r/GUI/ButtonsDescription.cpp:57 +#: src/slic3r/GUI/ButtonsDescription.cpp:127 msgid "Value is the same as the system value" msgstr "值與系統值相同" -#: src/slic3r/GUI/ButtonsDescription.cpp:58 +#: src/slic3r/GUI/ButtonsDescription.cpp:128 msgid "" "Value was changed and is not equal to the system value or the last saved " "preset" msgstr "值已更改, 不等於系統值或上次保存的預設值" -#: src/slic3r/GUI/ButtonsDescription.cpp:62 +#: src/slic3r/GUI/ButtonsDescription.cpp:155 +msgid "Default palette for mode markers" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2422 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Simple" +msgstr "簡單" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2424 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgctxt "Mode" +msgid "Advanced" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:163 src/slic3r/GUI/GUI_App.cpp:2425 +#: src/slic3r/GUI/wxExtensions.cpp:759 +msgid "Expert" +msgstr "專家" + +#: src/slic3r/GUI/ButtonsDescription.cpp:182 +msgid "Revert color" +msgstr "" + +#: src/slic3r/GUI/ButtonsDescription.cpp:200 msgid "Buttons And Text Colors Description" msgstr "按鈕和文本顏色描述" -#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/ConfigManipulation.cpp:50 msgid "" "Layer height is not valid.\n" "\n" "The layer height will be reset to 0.01." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:50 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1449 -#: src/libslic3r/PrintConfig.cpp:286 +#: src/slic3r/GUI/ConfigManipulation.cpp:51 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1394 +#: src/libslic3r/PrintConfig.cpp:299 msgid "Layer height" msgstr "層高" -#: src/slic3r/GUI/ConfigManipulation.cpp:61 +#: src/slic3r/GUI/ConfigManipulation.cpp:62 msgid "" "First layer height is not valid.\n" "\n" "The first layer height will be reset to 0.01." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:62 src/libslic3r/PrintConfig.cpp:1231 +#: src/slic3r/GUI/ConfigManipulation.cpp:63 src/libslic3r/PrintConfig.cpp:1291 msgid "First layer height" msgstr "首層高度" @@ -429,334 +507,368 @@ msgid "" "- no top solid layers\n" "- 0% fill density\n" "- no support material\n" -"- Ensure vertical shell thickness enabled\n" "- Detect thin walls disabled" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:90 +#: src/slic3r/GUI/ConfigManipulation.cpp:89 msgid "Shall I adjust those settings in order to enable Spiral Vase?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:91 +#: src/slic3r/GUI/ConfigManipulation.cpp:90 msgid "Spiral Vase" msgstr "螺旋式容器" -#: src/slic3r/GUI/ConfigManipulation.cpp:121 +#: src/slic3r/GUI/ConfigManipulation.cpp:123 msgid "" -"The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool " -"change.\n" -"(both support_material_extruder and support_material_interface_extruder need " -"to be set to 0)." +"For the Wipe Tower to work with the soluble supports, the support layers\n" +"need to be synchronized with the object layers." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:125 -msgid "Shall I adjust those settings in order to enable the Wipe Tower?" +#: src/slic3r/GUI/ConfigManipulation.cpp:126 +msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:126 -#: src/slic3r/GUI/ConfigManipulation.cpp:146 +#: src/slic3r/GUI/ConfigManipulation.cpp:127 +#: src/slic3r/GUI/ConfigManipulation.cpp:145 msgid "Wipe Tower" msgstr "擦料塔" -#: src/slic3r/GUI/ConfigManipulation.cpp:142 +#: src/slic3r/GUI/ConfigManipulation.cpp:140 src/libslic3r/Print.cpp:672 msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers\n" -"need to be synchronized with the object layers." +"The Wipe Tower currently supports the non-soluble supports only if they are " +"printed with the current extruder without triggering a tool change. (both " +"support_material_extruder and support_material_interface_extruder need to be " +"set to 0)." msgstr "" +"只有在不觸發工具更改的情況下, 使用當前擠出機列印的未溶性支撐塔目前才支持不溶" +"於的支架。(support_material_extruder 和support_material_interface_extruder " +"都需要設置爲 0)。" -#: src/slic3r/GUI/ConfigManipulation.cpp:145 -msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" +#: src/slic3r/GUI/ConfigManipulation.cpp:144 +msgid "Shall I adjust those settings in order to enable the Wipe Tower?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:164 +#: src/slic3r/GUI/ConfigManipulation.cpp:166 msgid "" "Supports work better, if the following feature is enabled:\n" "- Detect bridging perimeters" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:167 +#: src/slic3r/GUI/ConfigManipulation.cpp:169 msgid "Shall I adjust those settings for supports?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:168 +#: src/slic3r/GUI/ConfigManipulation.cpp:170 msgid "Support Generator" msgstr "支撐生成器" -#: src/slic3r/GUI/ConfigManipulation.cpp:195 +#: src/slic3r/GUI/ConfigManipulation.cpp:194 #, boost-format msgid "The %1% infill pattern is not supposed to work at 100%% density." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:198 +#: src/slic3r/GUI/ConfigManipulation.cpp:196 msgid "Shall I switch to rectilinear fill pattern?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:199 +#: src/slic3r/GUI/ConfigManipulation.cpp:197 #: src/slic3r/GUI/GUI_Factories.cpp:55 src/slic3r/GUI/GUI_Factories.cpp:128 -#: src/slic3r/GUI/Plater.cpp:460 src/slic3r/GUI/Tab.cpp:1503 -#: src/slic3r/GUI/Tab.cpp:1505 src/libslic3r/PrintConfig.cpp:475 -#: src/libslic3r/PrintConfig.cpp:716 src/libslic3r/PrintConfig.cpp:743 -#: src/libslic3r/PrintConfig.cpp:1098 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1149 src/libslic3r/PrintConfig.cpp:1398 -#: src/libslic3r/PrintConfig.cpp:1427 src/libslic3r/PrintConfig.cpp:1496 -#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1535 -#: src/libslic3r/PrintConfig.cpp:2364 src/libslic3r/PrintConfig.cpp:2381 +#: src/slic3r/GUI/Plater.cpp:468 src/slic3r/GUI/Tab.cpp:1450 +#: src/slic3r/GUI/Tab.cpp:1452 src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:811 src/libslic3r/PrintConfig.cpp:831 +#: src/libslic3r/PrintConfig.cpp:1187 src/libslic3r/PrintConfig.cpp:1200 +#: src/libslic3r/PrintConfig.cpp:1225 src/libslic3r/PrintConfig.cpp:1444 +#: src/libslic3r/PrintConfig.cpp:1473 src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1557 src/libslic3r/PrintConfig.cpp:1576 +#: src/libslic3r/PrintConfig.cpp:2395 src/libslic3r/PrintConfig.cpp:2412 msgid "Infill" msgstr "填充" -#: src/slic3r/GUI/ConfigManipulation.cpp:337 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Head penetration should not be greater than the head width." msgstr "頭部滲透不應大於頭部寬度。" -#: src/slic3r/GUI/ConfigManipulation.cpp:339 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid Head penetration" msgstr "無效的頭部滲透" -#: src/slic3r/GUI/ConfigManipulation.cpp:350 +#: src/slic3r/GUI/ConfigManipulation.cpp:362 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "針頭直徑應小於柱直徑。" -#: src/slic3r/GUI/ConfigManipulation.cpp:352 +#: src/slic3r/GUI/ConfigManipulation.cpp:364 msgid "Invalid pinhead diameter" msgstr "針頭直徑無效" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20 msgid "Upgrade" msgstr "升級" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22 msgid "Downgrade" msgstr "降級" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 msgid "Before roll back" msgstr "回滾之前" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:340 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:26 src/libslic3r/PrintConfig.cpp:353 msgid "User" msgstr "用戶" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:329 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:29 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1135 msgid "Unknown" msgstr "未知" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 msgid "Active" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 msgid "PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 src/libslic3r/Preset.cpp:1341 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 src/libslic3r/Preset.cpp:1480 msgid "print" msgstr "列印" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:65 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 msgid "filaments" msgstr "耗材" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 src/libslic3r/Preset.cpp:1343 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:67 src/libslic3r/Preset.cpp:1482 msgid "SLA print" msgstr "SLA 列印" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69 -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/slic3r/GUI/GUI.cpp:340 -#: src/slic3r/GUI/Plater.cpp:821 src/libslic3r/Preset.cpp:1344 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/slic3r/GUI/GUI.cpp:331 +#: src/slic3r/GUI/Plater.cpp:851 src/libslic3r/Preset.cpp:1483 msgid "SLA material" msgstr "SLA 材料" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:71 src/libslic3r/Preset.cpp:1345 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 src/libslic3r/Preset.cpp:1484 msgid "printer" msgstr "印表機" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 src/slic3r/GUI/Tab.cpp:1366 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 src/slic3r/GUI/Tab.cpp:1311 msgid "vendor" msgstr "供應商" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:74 msgid "version" msgstr "版本" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:76 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 msgid "min PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:77 msgid "max PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "model" msgstr "模型" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:81 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:80 msgid "variants" msgstr "變種" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:93 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:92 #, c-format, boost-format msgid "Incompatible with this %s" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:96 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:95 msgid "Activate" msgstr "啟用" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:123 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:122 msgid "Configuration Snapshots" msgstr "配置快照" -#: src/slic3r/GUI/ConfigWizard.cpp:262 +#: src/slic3r/GUI/ConfigWizard.cpp:291 msgid "nozzle" msgstr "噴嘴" -#: src/slic3r/GUI/ConfigWizard.cpp:266 +#: src/slic3r/GUI/ConfigWizard.cpp:295 msgid "Alternate nozzles:" msgstr "備用噴嘴:" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "All standard" msgstr "所有標準" -#: src/slic3r/GUI/ConfigWizard.cpp:330 +#: src/slic3r/GUI/ConfigWizard.cpp:359 msgid "Standard" msgstr "標準" -#: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3833 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 +#: src/slic3r/GUI/ConfigWizard.cpp:360 src/slic3r/GUI/ConfigWizard.cpp:681 +#: src/slic3r/GUI/FileArchiveDialog.cpp:261 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 src/slic3r/GUI/Preferences.cpp:550 +#: src/slic3r/GUI/Tab.cpp:4058 src/slic3r/GUI/UnsavedChangesDialog.cpp:1161 msgid "All" msgstr "所有" -#: src/slic3r/GUI/ConfigWizard.cpp:332 src/slic3r/GUI/ConfigWizard.cpp:652 -#: src/slic3r/GUI/DoubleSlider.cpp:2030 src/slic3r/GUI/Plater.cpp:432 -#: src/slic3r/GUI/Plater.cpp:579 src/slic3r/GUI/Preferences.cpp:436 -#: src/libslic3r/PrintConfig.cpp:1291 +#: src/slic3r/GUI/ConfigWizard.cpp:361 src/slic3r/GUI/ConfigWizard.cpp:682 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 +#: src/slic3r/GUI/FileArchiveDialog.cpp:265 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1984 src/slic3r/GUI/Plater.cpp:439 +#: src/slic3r/GUI/Plater.cpp:594 src/slic3r/GUI/Preferences.cpp:552 +#: src/libslic3r/PrintConfig.cpp:1347 msgid "None" msgstr "無" -#: src/slic3r/GUI/ConfigWizard.cpp:484 +#: src/slic3r/GUI/ConfigWizard.cpp:513 #, c-format, boost-format msgid "Welcome to the %s Configuration Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:486 +#: src/slic3r/GUI/ConfigWizard.cpp:515 #, c-format, boost-format msgid "Welcome to the %s Configuration Wizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:488 +#: src/slic3r/GUI/ConfigWizard.cpp:517 msgid "Welcome" msgstr "歡迎" -#: src/slic3r/GUI/ConfigWizard.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:519 #, c-format, boost-format msgid "" "Hello, welcome to %s! This %s helps you with the initial configuration; just " "a few settings and you will be ready to print." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:495 +#: src/slic3r/GUI/ConfigWizard.cpp:524 msgid "Remove user profiles (a snapshot will be taken beforehand)" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:498 +#: src/slic3r/GUI/ConfigWizard.cpp:527 msgid "" "Perform desktop integration (Sets this binary to be searchable by the " "system)." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:550 +#: src/slic3r/GUI/ConfigWizard.cpp:579 #, c-format, boost-format msgid "%s Family" msgstr "%s 家庭" -#: src/slic3r/GUI/ConfigWizard.cpp:640 +#: src/slic3r/GUI/ConfigWizard.cpp:670 msgid "Printer:" msgstr "印表機:" -#: src/slic3r/GUI/ConfigWizard.cpp:642 +#: src/slic3r/GUI/ConfigWizard.cpp:672 msgid "Vendor:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:643 +#: src/slic3r/GUI/ConfigWizard.cpp:673 msgid "Profile:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:720 src/slic3r/GUI/ConfigWizard.cpp:892 -#: src/slic3r/GUI/ConfigWizard.cpp:952 src/slic3r/GUI/ConfigWizard.cpp:1088 +#: src/slic3r/GUI/ConfigWizard.cpp:750 src/slic3r/GUI/ConfigWizard.cpp:938 +#: src/slic3r/GUI/ConfigWizard.cpp:1024 src/slic3r/GUI/ConfigWizard.cpp:1163 msgid "(All)" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:754 src/slic3r/GUI/ConfigWizard.cpp:1165 +msgid "(Templates)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:789 #, boost-format msgid "" -"%1% marked with * are not compatible with some installed " -"printers." +"%1% visible for (\"Template\") printer are universal profiles " +"available for all printers. These might not be compatible with your printer." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:752 src/slic3r/GUI/ConfigWizard.cpp:2043 -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filaments" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:752 +#: src/slic3r/GUI/ConfigWizard.cpp:789 src/slic3r/GUI/ConfigWizard.cpp:791 msgid "SLA materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:755 +#: src/slic3r/GUI/ConfigWizard.cpp:791 +#, boost-format +msgid "" +"%1% marked with * are not compatible with some installed " +"printers." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:794 #, boost-format msgid "All installed printers are compatible with the selected %1%." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:755 src/libslic3r/Preset.cpp:1342 +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/libslic3r/Preset.cpp:1481 msgid "filament" msgstr "耗材" -#: src/slic3r/GUI/ConfigWizard.cpp:778 +#: src/slic3r/GUI/ConfigWizard.cpp:818 msgid "" "Only the following installed printers are compatible with the selected " "filaments" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:779 +#: src/slic3r/GUI/ConfigWizard.cpp:819 msgid "" "Only the following installed printers are compatible with the selected SLA " "materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1213 +msgid "" +"You have selected template filament. Please note that these filaments are " +"available for all printers but are NOT certain to be compatible with your " +"printer. Do you still wish to have this filament selected?\n" +"(This message won't be displayed again.)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1214 src/slic3r/GUI/ConfigWizard.cpp:2720 +#: src/slic3r/GUI/ConfigWizard.cpp:2860 src/slic3r/GUI/DoubleSlider.cpp:2591 +#: src/slic3r/GUI/DoubleSlider.cpp:2612 src/slic3r/GUI/GUI.cpp:245 +#: src/slic3r/GUI/GUI_App.cpp:3458 src/slic3r/GUI/UpdateDialogs.cpp:204 +#: src/slic3r/GUI/UpdateDialogs.cpp:212 src/slic3r/GUI/UpdateDialogs.cpp:217 +#: src/slic3r/GUI/UpdateDialogs.cpp:222 src/slic3r/GUI/UpdateDialogs.cpp:229 +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +msgid "Notice" +msgstr "通知" + +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer Setup" msgstr "自定義印表機設置" -#: src/slic3r/GUI/ConfigWizard.cpp:1175 +#: src/slic3r/GUI/ConfigWizard.cpp:1262 msgid "Custom Printer" msgstr "自定義印表機" -#: src/slic3r/GUI/ConfigWizard.cpp:1177 +#: src/slic3r/GUI/ConfigWizard.cpp:1264 msgid "Define a custom printer profile" msgstr "定義自定義印表機配置文件" -#: src/slic3r/GUI/ConfigWizard.cpp:1179 +#: src/slic3r/GUI/ConfigWizard.cpp:1265 msgid "Custom profile name:" msgstr "自定義配置文件名稱:" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Automatic updates" msgstr "自動更新" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1282 msgid "Updates" msgstr "更新" -#: src/slic3r/GUI/ConfigWizard.cpp:1214 +#: src/slic3r/GUI/ConfigWizard.cpp:1290 msgid "Check for application updates" msgstr "檢查應用程序更新" -#: src/slic3r/GUI/ConfigWizard.cpp:1218 +#: src/slic3r/GUI/ConfigWizard.cpp:1294 #, c-format, boost-format msgid "" "If enabled, %s checks for new application versions online. When a new " @@ -765,11 +877,11 @@ msgid "" "notification mechanisms, no automatic installation is done." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1224 src/slic3r/GUI/Preferences.cpp:175 +#: src/slic3r/GUI/ConfigWizard.cpp:1300 src/slic3r/GUI/Preferences.cpp:306 msgid "Update built-in Presets automatically" msgstr "自動更新內置預設" -#: src/slic3r/GUI/ConfigWizard.cpp:1228 +#: src/slic3r/GUI/ConfigWizard.cpp:1304 #, c-format, boost-format msgid "" "If enabled, %s downloads updates of built-in system presets in the " @@ -778,29 +890,73 @@ msgid "" "startup." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1231 +#: src/slic3r/GUI/ConfigWizard.cpp:1307 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." msgstr "未經用戶同意, 永遠不會應用更新, 也永遠不會覆蓋用戶的自定義設置。" -#: src/slic3r/GUI/ConfigWizard.cpp:1236 +#: src/slic3r/GUI/ConfigWizard.cpp:1312 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." msgstr "此外, 在應用更新之前, 將創建整個配置的備份快照。" -#: src/slic3r/GUI/ConfigWizard.cpp:1243 src/slic3r/GUI/GUI_Factories.cpp:726 -#: src/slic3r/GUI/Plater.cpp:3582 +#: src/slic3r/GUI/ConfigWizard.cpp:1361 src/slic3r/GUI/Preferences.cpp:1076 +msgid "Download path" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1366 src/slic3r/GUI/FirmwareDialog.cpp:815 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:300 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +msgid "Browse" +msgstr "瀏覽" + +#: src/slic3r/GUI/ConfigWizard.cpp:1371 +msgid "Choose folder:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads from URL" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1409 +msgid "Downloads" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1417 +msgid "Allow built-in downloader" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1424 +#, c-format, boost-format +msgid "" +"If enabled, %s registers to start on custom URL on www.printables.com. You " +"will be able to use button with %s logo to open models in this %s. The model " +"will be downloaded into folder you choose bellow." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1431 +msgid "" +"On Linux systems the process of registration also creates desktop " +"integration files for this version of application." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1458 +msgid "Chosen directory for downloads does not Exists." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1545 src/slic3r/GUI/GUI_Factories.cpp:810 +#: src/slic3r/GUI/Plater.cpp:3732 msgid "Reload from disk" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1246 +#: src/slic3r/GUI/ConfigWizard.cpp:1548 msgid "" "Export full pathnames of models and parts sources into 3mf and amf files" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1250 +#: src/slic3r/GUI/ConfigWizard.cpp:1552 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked.\n" @@ -808,23 +964,23 @@ msgid "" "using an open file dialog." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1259 +#: src/slic3r/GUI/ConfigWizard.cpp:1561 msgid "Files association" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1261 src/slic3r/GUI/Preferences.cpp:157 +#: src/slic3r/GUI/ConfigWizard.cpp:1563 src/slic3r/GUI/Preferences.cpp:292 msgid "Associate .3mf files to PrusaSlicer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1262 src/slic3r/GUI/Preferences.cpp:164 +#: src/slic3r/GUI/ConfigWizard.cpp:1564 src/slic3r/GUI/Preferences.cpp:297 msgid "Associate .stl files to PrusaSlicer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1272 +#: src/slic3r/GUI/ConfigWizard.cpp:1574 msgid "View mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1274 +#: src/slic3r/GUI/ConfigWizard.cpp:1576 msgid "" "PrusaSlicer's user interfaces comes in three variants:\n" "Simple, Advanced, and Expert.\n" @@ -833,288 +989,302 @@ msgid "" "fine-tuning, they are suitable for advanced and expert users, respectively." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1279 +#: src/slic3r/GUI/ConfigWizard.cpp:1581 msgid "Simple mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1280 +#: src/slic3r/GUI/ConfigWizard.cpp:1582 msgid "Advanced mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1281 +#: src/slic3r/GUI/ConfigWizard.cpp:1583 msgid "Expert mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1287 +#: src/slic3r/GUI/ConfigWizard.cpp:1596 msgid "The size of the object can be specified in inches" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1288 +#: src/slic3r/GUI/ConfigWizard.cpp:1597 msgid "Use inches" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1322 +#: src/slic3r/GUI/ConfigWizard.cpp:1617 msgid "Other Vendors" msgstr "其他供應商" -#: src/slic3r/GUI/ConfigWizard.cpp:1326 +#: src/slic3r/GUI/ConfigWizard.cpp:1621 #, c-format, boost-format msgid "Pick another vendor supported by %s" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 msgid "Firmware Type" msgstr "固件類型" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2366 +#: src/slic3r/GUI/ConfigWizard.cpp:1654 src/slic3r/GUI/Tab.cpp:2354 msgid "Firmware" msgstr "固件" -#: src/slic3r/GUI/ConfigWizard.cpp:1361 +#: src/slic3r/GUI/ConfigWizard.cpp:1658 msgid "Choose the type of firmware used by your printer." msgstr "選擇印表機使用的固件類型。" -#: src/slic3r/GUI/ConfigWizard.cpp:1396 +#: src/slic3r/GUI/ConfigWizard.cpp:1707 src/slic3r/GUI/ConfigWizard.cpp:1778 +#: src/slic3r/GUI/ConfigWizard.cpp:1783 src/slic3r/GUI/ConfigWizard.cpp:1788 +#: src/slic3r/GUI/Field.cpp:258 src/slic3r/GUI/Field.cpp:328 +#: src/slic3r/GUI/Field.cpp:1585 src/slic3r/GUI/GUI_ObjectLayers.cpp:435 +msgid "Invalid numeric input." +msgstr "無效的數字輸入。" + +#: src/slic3r/GUI/ConfigWizard.cpp:1732 msgid "Bed Shape and Size" msgstr "熱牀形狀和大小" -#: src/slic3r/GUI/ConfigWizard.cpp:1399 +#: src/slic3r/GUI/ConfigWizard.cpp:1735 msgid "Set the shape of your printer's bed." msgstr "設置印表機熱牀的形狀。" -#: src/slic3r/GUI/ConfigWizard.cpp:1433 src/slic3r/GUI/Field.cpp:255 -#: src/slic3r/GUI/Field.cpp:324 src/slic3r/GUI/Field.cpp:1561 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:435 -msgid "Invalid numeric input." -msgstr "無效的數字輸入。" +#: src/slic3r/GUI/ConfigWizard.cpp:1755 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1610 +msgid "Build Volume" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1758 +msgid "Set vertical size of your printer." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1795 +msgid "Max print height:" +msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Filament and Nozzle Diameters" msgstr "耗材絲和噴嘴直徑" -#: src/slic3r/GUI/ConfigWizard.cpp:1457 +#: src/slic3r/GUI/ConfigWizard.cpp:1813 msgid "Print Diameters" msgstr "列印直徑" -#: src/slic3r/GUI/ConfigWizard.cpp:1472 +#: src/slic3r/GUI/ConfigWizard.cpp:1828 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "輸入印表機熱端噴嘴的直徑。" -#: src/slic3r/GUI/ConfigWizard.cpp:1475 +#: src/slic3r/GUI/ConfigWizard.cpp:1831 msgid "Nozzle Diameter:" msgstr "噴嘴直徑:" -#: src/slic3r/GUI/ConfigWizard.cpp:1485 +#: src/slic3r/GUI/ConfigWizard.cpp:1841 msgid "Enter the diameter of your filament." msgstr "輸入耗材絲的直徑。" -#: src/slic3r/GUI/ConfigWizard.cpp:1486 +#: src/slic3r/GUI/ConfigWizard.cpp:1842 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." msgstr "" "需要良好的精度, 因此請使用遊標卡尺, 沿耗材絲進行多次測量, 然後計算平均值。" -#: src/slic3r/GUI/ConfigWizard.cpp:1489 +#: src/slic3r/GUI/ConfigWizard.cpp:1845 msgid "Filament Diameter:" msgstr "耗材絲直徑:" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Nozzle and Bed Temperatures" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1547 +#: src/slic3r/GUI/ConfigWizard.cpp:1903 msgid "Temperatures" msgstr "溫度" -#: src/slic3r/GUI/ConfigWizard.cpp:1563 +#: src/slic3r/GUI/ConfigWizard.cpp:1919 msgid "Enter the temperature needed for extruding your filament." msgstr "輸入擠出耗材絲所需的溫度。" -#: src/slic3r/GUI/ConfigWizard.cpp:1564 +#: src/slic3r/GUI/ConfigWizard.cpp:1920 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "根據經驗, PLA 爲160至 230°C, ABS 爲215至250°C。" -#: src/slic3r/GUI/ConfigWizard.cpp:1567 +#: src/slic3r/GUI/ConfigWizard.cpp:1923 msgid "Extrusion Temperature:" msgstr "擠出溫度:" -#: src/slic3r/GUI/ConfigWizard.cpp:1568 src/slic3r/GUI/ConfigWizard.cpp:1582 -#: src/libslic3r/PrintConfig.cpp:418 src/libslic3r/PrintConfig.cpp:1211 -#: src/libslic3r/PrintConfig.cpp:1266 src/libslic3r/PrintConfig.cpp:2842 +#: src/slic3r/GUI/ConfigWizard.cpp:1924 src/slic3r/GUI/ConfigWizard.cpp:1938 +#: src/libslic3r/PrintConfig.cpp:437 src/libslic3r/PrintConfig.cpp:1271 +#: src/libslic3r/PrintConfig.cpp:1326 src/libslic3r/PrintConfig.cpp:2930 +#: src/libslic3r/PrintConfig.cpp:3689 msgid "°C" msgstr "°C" -#: src/slic3r/GUI/ConfigWizard.cpp:1577 +#: src/slic3r/GUI/ConfigWizard.cpp:1933 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." msgstr "輸入讓你的耗材粘在熱牀上所需的牀溫。" -#: src/slic3r/GUI/ConfigWizard.cpp:1578 +#: src/slic3r/GUI/ConfigWizard.cpp:1934 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." msgstr "根據經驗, PLA 爲 60°C, ABS 爲 110°C. 如果沒有加熱牀, 請保留零。" -#: src/slic3r/GUI/ConfigWizard.cpp:1581 +#: src/slic3r/GUI/ConfigWizard.cpp:1937 msgid "Bed Temperature:" msgstr "熱牀溫度:" -#: src/slic3r/GUI/ConfigWizard.cpp:2043 src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:2410 src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2097 +#: src/slic3r/GUI/ConfigWizard.cpp:2464 msgid "FFF Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2102 +#: src/slic3r/GUI/ConfigWizard.cpp:2469 msgid "SLA Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2338 +#: src/slic3r/GUI/ConfigWizard.cpp:2718 #, boost-format msgid "" "Following printer profiles has no default filament: %1%Please select one " "manually." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2339 +#: src/slic3r/GUI/ConfigWizard.cpp:2719 #, boost-format msgid "" "Following printer profiles has no default material: %1%Please select one " "manually." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2340 src/slic3r/GUI/ConfigWizard.cpp:2438 -#: src/slic3r/GUI/DoubleSlider.cpp:2522 src/slic3r/GUI/DoubleSlider.cpp:2543 -#: src/slic3r/GUI/GUI.cpp:232 -msgid "Notice" -msgstr "通知" - -#: src/slic3r/GUI/ConfigWizard.cpp:2459 +#: src/slic3r/GUI/ConfigWizard.cpp:2883 msgid "The following FFF printer models have no filament selected:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2463 +#: src/slic3r/GUI/ConfigWizard.cpp:2887 msgid "Do you want to select default filaments for these FFF printer models?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2477 +#: src/slic3r/GUI/ConfigWizard.cpp:2901 msgid "The following SLA printer models have no materials selected:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2481 +#: src/slic3r/GUI/ConfigWizard.cpp:2905 msgid "Do you want to select default SLA materials for these printer models?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2523 +#: src/slic3r/GUI/ConfigWizard.cpp:2947 msgid "Configuration is edited in ConfigWizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2566 +#: src/slic3r/GUI/ConfigWizard.cpp:3000 msgid "All user presets will be deleted." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2596 +#: src/slic3r/GUI/ConfigWizard.cpp:3037 msgid "A new vendor was installed and one of its printers will be activated" msgid_plural "" "New vendors were installed and one of theirs printers will be activated" msgstr[0] "" -#: src/slic3r/GUI/ConfigWizard.cpp:2625 +#: src/slic3r/GUI/ConfigWizard.cpp:3069 msgid "Do you want to continue changing the configuration?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2691 +#: src/slic3r/GUI/ConfigWizard.cpp:3136 msgid "A new Printer was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2696 +#: src/slic3r/GUI/ConfigWizard.cpp:3141 msgid "Some Printers were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2717 +#: src/slic3r/GUI/ConfigWizard.cpp:3162 msgid "A new filament was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2718 +#: src/slic3r/GUI/ConfigWizard.cpp:3163 msgid "A new SLA material was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some filaments were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2729 +#: src/slic3r/GUI/ConfigWizard.cpp:3174 msgid "Some SLA materials were uninstalled." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2773 +#: src/slic3r/GUI/ConfigWizard.cpp:3218 msgid "Custom printer was installed and it will be activated." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2858 +#: src/slic3r/GUI/ConfigWizard.cpp:3306 msgid "Select all standard printers" msgstr "選擇所有標準印表機" -#: src/slic3r/GUI/ConfigWizard.cpp:2861 +#: src/slic3r/GUI/ConfigWizard.cpp:3309 msgid "< &Back" msgstr "< &返回" -#: src/slic3r/GUI/ConfigWizard.cpp:2862 +#: src/slic3r/GUI/ConfigWizard.cpp:3310 msgid "&Next >" msgstr "&繼續 >" -#: src/slic3r/GUI/ConfigWizard.cpp:2863 +#: src/slic3r/GUI/ConfigWizard.cpp:3311 msgid "&Finish" msgstr "&結束" -#: src/slic3r/GUI/ConfigWizard.cpp:2864 -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:3312 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:657 +#: src/slic3r/GUI/FileArchiveDialog.cpp:274 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 #: src/slic3r/GUI/FirmwareDialog.cpp:153 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1593 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1365 #: src/slic3r/GUI/ProgressStatusBar.cpp:26 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:93 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:879 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:96 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:907 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1606 msgid "Cancel" msgstr "取消" -#: src/slic3r/GUI/ConfigWizard.cpp:2884 +#: src/slic3r/GUI/ConfigWizard.cpp:3332 msgid "Prusa FFF Technology Printers" msgstr "Prusa FFF 技術印表機" -#: src/slic3r/GUI/ConfigWizard.cpp:2892 +#: src/slic3r/GUI/ConfigWizard.cpp:3340 msgid "Prusa MSLA Technology Printers" msgstr "Prusa MSLA 技術印表機" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 msgid "Filament Profiles Selection" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2912 src/slic3r/GUI/ConfigWizard.cpp:2915 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/ConfigWizard.cpp:3360 src/slic3r/GUI/ConfigWizard.cpp:3363 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Type:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2915 +#: src/slic3r/GUI/ConfigWizard.cpp:3363 msgid "SLA Material Profiles Selection" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:3036 +#: src/slic3r/GUI/ConfigWizard.cpp:3486 msgid "Configuration Assistant" msgstr "配置助手" -#: src/slic3r/GUI/ConfigWizard.cpp:3037 +#: src/slic3r/GUI/ConfigWizard.cpp:3487 msgid "Configuration &Assistant" msgstr "配置 &助手" -#: src/slic3r/GUI/ConfigWizard.cpp:3039 +#: src/slic3r/GUI/ConfigWizard.cpp:3489 msgid "Configuration Wizard" msgstr "配置嚮導" -#: src/slic3r/GUI/ConfigWizard.cpp:3040 +#: src/slic3r/GUI/ConfigWizard.cpp:3490 msgid "Configuration &Wizard" msgstr "配置 &嚮導" @@ -1128,37 +1298,54 @@ msgstr "" msgid "Performing desktop integration failed - Could not find executable." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:378 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:383 msgid "" "Performing desktop integration failed because the application directory was " "not found." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:419 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:423 msgid "" "Performing desktop integration failed - could not create Gcodeviewer desktop " "file. PrusaSlicer desktop file was probably created successfully." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:459 -#: src/slic3r/GUI/GUI_App.cpp:2245 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:472 +msgid "" +"Performing downloader desktop integration failed - boost::filesystem::" +"canonical did not return appimage path." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:484 +msgid "" +"Performing downloader desktop integration failed - Could not find executable." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:602 +msgid "" +"Performing downloader desktop integration failed because the application " +"directory was not found." +msgstr "" + +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:626 +#: src/slic3r/GUI/GUI_App.cpp:2407 msgid "Desktop Integration" msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:466 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:633 msgid "" "Desktop Integration sets this binary to be searchable by the system.\n" "\n" "Press \"Perform\" to proceed." msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:480 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:647 msgid "Perform" msgstr "" -#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1342 +#: src/slic3r/GUI/DesktopIntegrationDialog.cpp:653 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/KBShortcutsDialog.cpp:106 +#: src/slic3r/GUI/MainFrame.cpp:1426 msgid "Undo" msgstr "回復" @@ -1166,19 +1353,19 @@ msgstr "回復" msgid "Place bearings in slots and resume printing" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1379 +#: src/slic3r/GUI/DoubleSlider.cpp:1448 msgid "One layer mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1381 +#: src/slic3r/GUI/DoubleSlider.cpp:1450 msgid "Discard all custom changes" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1385 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:1454 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to move" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1388 +#: src/slic3r/GUI/DoubleSlider.cpp:1457 #, c-format, boost-format msgid "" "Jump to height %s\n" @@ -1186,58 +1373,58 @@ msgid "" "or Set extruder sequence for the entire print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1391 +#: src/slic3r/GUI/DoubleSlider.cpp:1460 #, c-format, boost-format msgid "" "Jump to height %s\n" "or Set ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1396 +#: src/slic3r/GUI/DoubleSlider.cpp:1465 msgid "Edit current color - Right click the colored slider segment" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1398 +#: src/slic3r/GUI/DoubleSlider.cpp:1467 msgid "This is wipe tower layer" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1408 +#: src/slic3r/GUI/DoubleSlider.cpp:1477 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing sequentually." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1412 +#: src/slic3r/GUI/DoubleSlider.cpp:1481 msgid "Print mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1426 +#: src/slic3r/GUI/DoubleSlider.cpp:1495 msgid "Add extruder change - Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1428 +#: src/slic3r/GUI/DoubleSlider.cpp:1497 msgid "" "Add color change - Left click for predefined color or Shift + Left click for " "custom color selection" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1430 +#: src/slic3r/GUI/DoubleSlider.cpp:1499 msgid "Add color change - Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1431 +#: src/slic3r/GUI/DoubleSlider.cpp:1500 msgid "or press \"+\" key" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1433 +#: src/slic3r/GUI/DoubleSlider.cpp:1502 msgid "Add another code - Ctrl + Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1434 +#: src/slic3r/GUI/DoubleSlider.cpp:1503 msgid "Add another code - Right click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1440 +#: src/slic3r/GUI/DoubleSlider.cpp:1509 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing " @@ -1245,289 +1432,305 @@ msgid "" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1458 +#: src/slic3r/GUI/DoubleSlider.cpp:1527 msgid "continue" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1466 +#: src/slic3r/GUI/DoubleSlider.cpp:1535 #, boost-format msgid "Color change (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1467 +#: src/slic3r/GUI/DoubleSlider.cpp:1536 #, boost-format msgid "Color change (\"%1%\") for Extruder %2%" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1469 +#: src/slic3r/GUI/DoubleSlider.cpp:1538 #, boost-format msgid "Pause print (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1471 +#: src/slic3r/GUI/DoubleSlider.cpp:1540 #, boost-format msgid "Custom template (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1473 +#: src/slic3r/GUI/DoubleSlider.cpp:1542 #, boost-format msgid "Extruder (tool) is changed to Extruder \"%1%\"" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1480 +#: src/slic3r/GUI/DoubleSlider.cpp:1549 msgid "Note" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1482 +#: src/slic3r/GUI/DoubleSlider.cpp:1551 msgid "" "G-code associated to this tick mark is in a conflict with print mode.\n" "Editing it will cause changes of Slider data." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1485 +#: src/slic3r/GUI/DoubleSlider.cpp:1554 msgid "" "There is a color change for extruder that won't be used till the end of " "print job.\n" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1488 +#: src/slic3r/GUI/DoubleSlider.cpp:1557 msgid "" "There is an extruder change set to the same extruder.\n" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1491 +#: src/slic3r/GUI/DoubleSlider.cpp:1560 msgid "" "There is a color change for extruder that has not been used before.\n" "Check your settings to avoid redundant color changes." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1496 +#: src/slic3r/GUI/DoubleSlider.cpp:1565 msgid "Delete tick mark - Left click or press \"-\" key" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1498 +#: src/slic3r/GUI/DoubleSlider.cpp:1567 msgid "Edit tick mark - Ctrl + Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1499 +#: src/slic3r/GUI/DoubleSlider.cpp:1568 msgid "Edit tick mark - Right click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1602 src/slic3r/GUI/DoubleSlider.cpp:1633 -#: src/slic3r/GUI/GUI_Factories.cpp:778 +#: src/slic3r/GUI/DoubleSlider.cpp:1671 src/slic3r/GUI/DoubleSlider.cpp:1702 +#: src/slic3r/GUI/GUI_Factories.cpp:862 #, c-format, boost-format msgid "Extruder %d" msgstr "擠出頭 %d" -#: src/slic3r/GUI/DoubleSlider.cpp:1603 src/slic3r/GUI/GUI_Factories.cpp:779 +#: src/slic3r/GUI/DoubleSlider.cpp:1672 src/slic3r/GUI/GUI_Factories.cpp:863 msgid "active" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 msgid "Switch code to Change extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1612 src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/DoubleSlider.cpp:1681 src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Change extruder" msgstr "更換擠出機" -#: src/slic3r/GUI/DoubleSlider.cpp:1613 +#: src/slic3r/GUI/DoubleSlider.cpp:1682 msgid "Change extruder (N/A)" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1615 src/slic3r/GUI/GUI_Factories.cpp:787 +#: src/slic3r/GUI/DoubleSlider.cpp:1684 src/slic3r/GUI/GUI_Factories.cpp:871 msgid "Use another extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1634 +#: src/slic3r/GUI/DoubleSlider.cpp:1703 msgid "used" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1642 +#: src/slic3r/GUI/DoubleSlider.cpp:1711 #, boost-format msgid "Switch code to Color change (%1%) for:" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1643 +#: src/slic3r/GUI/DoubleSlider.cpp:1712 #, boost-format msgid "Add color change (%1%) for:" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1968 +#: src/slic3r/GUI/DoubleSlider.cpp:2037 msgid "Add color change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1979 +#: src/slic3r/GUI/DoubleSlider.cpp:2048 msgid "Add pause print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1983 +#: src/slic3r/GUI/DoubleSlider.cpp:2052 msgid "Add custom template" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1986 +#: src/slic3r/GUI/DoubleSlider.cpp:2055 msgid "Add custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2004 +#: src/slic3r/GUI/DoubleSlider.cpp:2073 msgid "Edit color" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2005 +#: src/slic3r/GUI/DoubleSlider.cpp:2074 msgid "Edit pause print message" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2006 +#: src/slic3r/GUI/DoubleSlider.cpp:2075 msgid "Edit custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2012 +#: src/slic3r/GUI/DoubleSlider.cpp:2081 msgid "Delete color change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2013 +#: src/slic3r/GUI/DoubleSlider.cpp:2082 msgid "Delete tool change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2014 +#: src/slic3r/GUI/DoubleSlider.cpp:2083 msgid "Delete pause print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2015 +#: src/slic3r/GUI/DoubleSlider.cpp:2084 msgid "Delete custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2025 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:2094 src/slic3r/GUI/DoubleSlider.cpp:2324 msgid "Jump to height" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2030 +#: src/slic3r/GUI/DoubleSlider.cpp:2099 msgid "Hide ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2034 +#: src/slic3r/GUI/DoubleSlider.cpp:2103 msgid "Show object height on the ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2038 +#: src/slic3r/GUI/DoubleSlider.cpp:2107 msgid "Show estimated print time on the ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2042 +#: src/slic3r/GUI/DoubleSlider.cpp:2111 msgid "Set ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2047 +#: src/slic3r/GUI/DoubleSlider.cpp:2116 msgid "Set extruder sequence for the entire print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2051 +#: src/slic3r/GUI/DoubleSlider.cpp:2120 msgid "Set auto color changes" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2086 +#: src/slic3r/GUI/DoubleSlider.cpp:2155 msgid "This action will cause deletion of all ticks on vertical slider." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2087 src/slic3r/GUI/Tab.cpp:1318 +#: src/slic3r/GUI/DoubleSlider.cpp:2156 src/slic3r/GUI/Tab.cpp:1263 msgid "" "This action is not revertible.\n" "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2088 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1133 src/slic3r/GUI/GUI.cpp:245 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:649 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:679 -#: src/slic3r/GUI/WipeTowerDialog.cpp:58 src/slic3r/GUI/WipeTowerDialog.cpp:443 +#: src/slic3r/GUI/DoubleSlider.cpp:2157 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:537 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1119 src/slic3r/GUI/GUI.cpp:258 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:721 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:751 +#: src/slic3r/GUI/WipeTowerDialog.cpp:60 src/slic3r/GUI/WipeTowerDialog.cpp:445 msgid "Warning" msgstr "警告" -#: src/slic3r/GUI/DoubleSlider.cpp:2216 +#: src/slic3r/GUI/DoubleSlider.cpp:2285 msgid "Enter custom G-code used on current layer" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2217 +#: src/slic3r/GUI/DoubleSlider.cpp:2286 #, boost-format msgid "Custom G-code on current layer (%1% mm)." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2238 +#: src/slic3r/GUI/DoubleSlider.cpp:2307 msgid "Enter short message shown on Printer display when a print is paused" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2239 +#: src/slic3r/GUI/DoubleSlider.cpp:2308 #, boost-format msgid "Message for pause print on current layer (%1% mm)." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the move you want to jump to" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2254 +#: src/slic3r/GUI/DoubleSlider.cpp:2323 msgid "Enter the height you want to jump to" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2515 +#: src/slic3r/GUI/DoubleSlider.cpp:2584 msgid "The last color change data was saved for a single extruder printing." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2516 src/slic3r/GUI/DoubleSlider.cpp:2532 +#: src/slic3r/GUI/DoubleSlider.cpp:2585 src/slic3r/GUI/DoubleSlider.cpp:2601 msgid "The last color change data was saved for a multi extruder printing." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2518 +#: src/slic3r/GUI/DoubleSlider.cpp:2587 msgid "Your current changes will delete all saved color changes." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2519 src/slic3r/GUI/DoubleSlider.cpp:2540 +#: src/slic3r/GUI/DoubleSlider.cpp:2588 src/slic3r/GUI/DoubleSlider.cpp:2609 msgid "Are you sure you want to continue?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2533 +#: src/slic3r/GUI/DoubleSlider.cpp:2602 msgid "" "Select YES if you want to delete all saved tool changes, \n" "NO if you want all tool changes switch to color changes, \n" "or CANCEL to leave it unchanged." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2536 +#: src/slic3r/GUI/DoubleSlider.cpp:2605 msgid "Do you want to delete all saved tool changes?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2538 +#: src/slic3r/GUI/DoubleSlider.cpp:2607 msgid "" "The last color change data was saved for a multi extruder printing with tool " "changes for whole print." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2539 +#: src/slic3r/GUI/DoubleSlider.cpp:2608 msgid "Your current changes will delete all saved extruder (tool) changes." msgstr "" -#: src/slic3r/GUI/ExtraRenderers.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:538 -#: src/slic3r/GUI/GUI_ObjectList.cpp:550 src/slic3r/GUI/GUI_ObjectList.cpp:979 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4291 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:250 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:352 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:376 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:607 src/libslic3r/PrintConfig.cpp:800 +#: src/slic3r/GUI/Downloader.cpp:150 +#, boost-format +msgid "" +"Download won't start. Download URL doesn't point to https://files.printables." +"com : %1%" +msgstr "" + +#: src/slic3r/GUI/Downloader.cpp:181 +msgid "The download has failed:" +msgstr "" + +#: src/slic3r/GUI/DownloaderFileGet.cpp:193 +#, boost-format +msgid "Can't create file at %1%." +msgstr "" + +#: src/slic3r/GUI/ExtraRenderers.cpp:323 src/slic3r/GUI/GUI_ObjectList.cpp:571 +#: src/slic3r/GUI/GUI_ObjectList.cpp:583 src/slic3r/GUI/GUI_ObjectList.cpp:1043 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2125 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3013 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4884 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:259 src/libslic3r/PrintConfig.cpp:894 msgid "default" msgstr "預設值" @@ -1540,10 +1743,10 @@ msgid "Set extruder change for every" msgstr "" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:60 -#: src/libslic3r/PrintConfig.cpp:662 src/libslic3r/PrintConfig.cpp:1430 -#: src/libslic3r/PrintConfig.cpp:2135 src/libslic3r/PrintConfig.cpp:2310 -#: src/libslic3r/PrintConfig.cpp:2386 src/libslic3r/PrintConfig.cpp:2639 -#: src/libslic3r/PrintConfig.cpp:2687 src/libslic3r/PrintConfig.cpp:2706 +#: src/libslic3r/PrintConfig.cpp:765 src/libslic3r/PrintConfig.cpp:1476 +#: src/libslic3r/PrintConfig.cpp:2165 src/libslic3r/PrintConfig.cpp:2343 +#: src/libslic3r/PrintConfig.cpp:2417 src/libslic3r/PrintConfig.cpp:2665 +#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2728 msgid "layers" msgstr "層" @@ -1575,42 +1778,42 @@ msgstr "" msgid "Add extruder to sequence" msgstr "" -#: src/slic3r/GUI/Field.cpp:190 +#: src/slic3r/GUI/Field.cpp:188 msgid "default value" msgstr "默認值" -#: src/slic3r/GUI/Field.cpp:193 +#: src/slic3r/GUI/Field.cpp:191 msgid "parameter name" msgstr "參數名稱" -#: src/slic3r/GUI/Field.cpp:204 src/slic3r/GUI/OptionsGroup.cpp:827 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1067 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1079 +#: src/slic3r/GUI/Field.cpp:206 src/slic3r/GUI/OptionsGroup.cpp:852 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1074 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1086 msgid "N/A" msgstr "" -#: src/slic3r/GUI/Field.cpp:226 src/slic3r/GUI/Field.cpp:298 +#: src/slic3r/GUI/Field.cpp:229 src/slic3r/GUI/Field.cpp:302 #, c-format, boost-format msgid "%s doesn't support percentage" msgstr "%s 不支持百分比" -#: src/slic3r/GUI/Field.cpp:266 +#: src/slic3r/GUI/Field.cpp:269 #, c-format, boost-format msgid "" "Input value is out of range\n" "Are you sure that %s is a correct value and that you want to continue?" msgstr "" -#: src/slic3r/GUI/Field.cpp:269 src/slic3r/GUI/Field.cpp:343 +#: src/slic3r/GUI/Field.cpp:272 src/slic3r/GUI/Field.cpp:347 msgid "Parameter validation" msgstr "參數驗證" -#: src/slic3r/GUI/Field.cpp:282 src/slic3r/GUI/Field.cpp:390 -#: src/slic3r/GUI/Field.cpp:1573 +#: src/slic3r/GUI/Field.cpp:285 src/slic3r/GUI/Field.cpp:394 +#: src/slic3r/GUI/Field.cpp:1597 msgid "Input value is out of range" msgstr "輸入值超出範圍" -#: src/slic3r/GUI/Field.cpp:340 +#: src/slic3r/GUI/Field.cpp:344 #, c-format, boost-format msgid "" "Do you mean %s%% instead of %s %s?\n" @@ -1618,13 +1821,22 @@ msgid "" "or NO if you are sure that %s %s is a correct value." msgstr "" -#: src/slic3r/GUI/Field.cpp:397 +#: src/slic3r/GUI/Field.cpp:401 #, boost-format msgid "" "Invalid input format. Expected vector of dimensions in the following format: " "\"%1%\"" msgstr "" +#: src/slic3r/GUI/FileArchiveDialog.cpp:170 +msgid "Archive preview" +msgstr "" + +#: src/slic3r/GUI/FileArchiveDialog.cpp:270 +#: src/slic3r/GUI/FileArchiveDialog.cpp:283 +msgid "Open" +msgstr "" + #: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flash!" msgstr "燒錄!" @@ -1709,12 +1921,6 @@ msgstr "固件鏡像:" msgid "Select a file" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:815 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:297 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:372 -msgid "Browse" -msgstr "瀏覽" - #: src/slic3r/GUI/FirmwareDialog.cpp:817 msgid "Serial port:" msgstr "串行端口:" @@ -1744,10 +1950,10 @@ msgid "Advanced: Output log" msgstr "高級: 輸出log日誌" #: src/slic3r/GUI/FirmwareDialog.cpp:862 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:310 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:358 #: src/slic3r/GUI/Mouse3DController.cpp:543 -#: src/slic3r/GUI/PrintHostDialogs.cpp:261 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:122 +#: src/slic3r/GUI/PrintHostDialogs.cpp:313 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:125 msgid "Close" msgstr "關閉" @@ -1767,7 +1973,7 @@ msgstr "確認" msgid "Cancelling..." msgstr "正在取消...." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1488 msgid "Shape Gallery" msgstr "" @@ -1775,902 +1981,1904 @@ msgstr "" msgid "Select shape from the gallery" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:100 -msgid "Add to bed" -msgstr "" - -#: src/slic3r/GUI/GalleryDialog.cpp:101 -msgid "Add selected shape(s) to the bed" -msgstr "" - -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4152 +#: src/slic3r/GUI/GalleryDialog.cpp:114 src/slic3r/GUI/Tab.cpp:4377 msgid "Add" msgstr "加入" -#: src/slic3r/GUI/GalleryDialog.cpp:117 +#: src/slic3r/GUI/GalleryDialog.cpp:114 msgid "Add one or more custom shapes" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:506 -#: src/slic3r/GUI/GLCanvas3D.cpp:4547 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3751 +#: src/slic3r/GUI/GalleryDialog.cpp:115 src/slic3r/GUI/GalleryDialog.cpp:528 +#: src/slic3r/GUI/GLCanvas3D.cpp:4638 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/GUI_Factories.cpp:460 src/slic3r/GUI/Tab.cpp:3973 msgid "Delete" msgstr "刪除" -#: src/slic3r/GUI/GalleryDialog.cpp:118 +#: src/slic3r/GUI/GalleryDialog.cpp:115 msgid "Delete one or more custom shape. You can't delete system shapes" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:400 +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "Add to bed" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:142 +msgid "OK" +msgstr "確認" + +#: src/slic3r/GUI/GalleryDialog.cpp:143 +msgid "Add selected shape(s) to the bed" +msgstr "" + +#: src/slic3r/GUI/GalleryDialog.cpp:422 msgid "Choose one or more files (STL, OBJ):" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:440 +#: src/slic3r/GUI/GalleryDialog.cpp:462 #, boost-format msgid "" "It looks like selected %1%-file has an error or is destructed.\n" "We can't load this file" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:451 +#: src/slic3r/GUI/GalleryDialog.cpp:473 msgid "Choose one PNG file:" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:464 +#: src/slic3r/GUI/GalleryDialog.cpp:486 msgid "Replacing of the PNG" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:508 +#: src/slic3r/GUI/GalleryDialog.cpp:530 msgid "Change thumbnail" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:549 src/slic3r/GUI/GalleryDialog.cpp:554 +#: src/slic3r/GUI/GalleryDialog.cpp:571 src/slic3r/GUI/GalleryDialog.cpp:576 #, boost-format msgid "Loading of the \"%1%\"" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:274 +#: src/slic3r/GUI/GCodeViewer.cpp:343 msgid "Tool position" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1457 +#: src/slic3r/GUI/GCodeViewer.cpp:1547 msgid "Generating toolpaths" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1517 +#: src/slic3r/GUI/GCodeViewer.cpp:1619 msgid "Generating vertex buffer" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1857 +#: src/slic3r/GUI/GCodeViewer.cpp:1979 msgid "Generating index buffers" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to hide" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3052 +#: src/slic3r/GUI/GCodeViewer.cpp:3271 msgid "Click to show" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3181 +#: src/slic3r/GUI/GCodeViewer.cpp:3449 msgid "up to" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3187 +#: src/slic3r/GUI/GCodeViewer.cpp:3455 msgid "above" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "from" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3195 +#: src/slic3r/GUI/GCodeViewer.cpp:3463 msgid "to" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3245 src/slic3r/GUI/GCodeViewer.cpp:3246 -#: src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3513 src/slic3r/GUI/GCodeViewer.cpp:3514 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 msgid "Percentage" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3570 msgid "Feature type" msgstr "功能類型" -#: src/slic3r/GUI/GCodeViewer.cpp:3256 src/slic3r/GUI/GCodeViewer.cpp:3295 +#: src/slic3r/GUI/GCodeViewer.cpp:3524 src/slic3r/GUI/GCodeViewer.cpp:3592 #: src/slic3r/GUI/RammingChart.cpp:90 msgid "Time" msgstr "時間" -#: src/slic3r/GUI/GCodeViewer.cpp:3295 src/slic3r/GUI/GCodeViewer.cpp:3306 -#: src/slic3r/GUI/GCodeViewer.cpp:3566 -msgid "Used filament" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3298 +#: src/slic3r/GUI/GCodeViewer.cpp:3571 msgid "Height (mm)" msgstr "高度(毫米)" -#: src/slic3r/GUI/GCodeViewer.cpp:3299 +#: src/slic3r/GUI/GCodeViewer.cpp:3572 msgid "Width (mm)" msgstr "寬度 (mm)" -#: src/slic3r/GUI/GCodeViewer.cpp:3300 +#: src/slic3r/GUI/GCodeViewer.cpp:3573 msgid "Speed (mm/s)" msgstr "回退速度(mm/s)" -#: src/slic3r/GUI/GCodeViewer.cpp:3301 -msgid "Fan Speed (%)" +#: src/slic3r/GUI/GCodeViewer.cpp:3574 +msgid "Fan speed (%)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3302 +#: src/slic3r/GUI/GCodeViewer.cpp:3575 msgid "Temperature (°C)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3303 +#: src/slic3r/GUI/GCodeViewer.cpp:3576 msgid "Volumetric flow rate (mm³/s)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3306 src/slic3r/GUI/GUI_Preview.cpp:224 -#: src/slic3r/GUI/GUI_Preview.cpp:958 +#: src/slic3r/GUI/GCodeViewer.cpp:3577 +msgid "Layer time (linear)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3578 +msgid "Layer time (logarithmic)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3579 msgid "Tool" msgstr "工具" -#: src/slic3r/GUI/GCodeViewer.cpp:3309 src/slic3r/GUI/GUI_Preview.cpp:225 -#: src/slic3r/GUI/GUI_Preview.cpp:957 +#: src/slic3r/GUI/GCodeViewer.cpp:3580 msgid "Color Print" msgstr "彩色列印" -#: src/slic3r/GUI/GCodeViewer.cpp:3347 src/slic3r/GUI/GCodeViewer.cpp:3393 -#: src/slic3r/GUI/GCodeViewer.cpp:3398 src/slic3r/GUI/GUI_ObjectList.cpp:312 -#: src/slic3r/GUI/wxExtensions.cpp:536 src/libslic3r/PrintConfig.cpp:795 +#: src/slic3r/GUI/GCodeViewer.cpp:3592 src/slic3r/GUI/GCodeViewer.cpp:3594 +#: src/slic3r/GUI/GCodeViewer.cpp:3860 +msgid "Used filament" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:3623 src/slic3r/GUI/GCodeViewer.cpp:4067 +#: src/libslic3r/PrintConfig.cpp:3025 +msgid "Travel" +msgstr "空程" + +#: src/slic3r/GUI/GCodeViewer.cpp:3640 src/slic3r/GUI/GCodeViewer.cpp:3685 +#: src/slic3r/GUI/GCodeViewer.cpp:3689 src/slic3r/GUI/GUI_ObjectList.cpp:338 +#: src/slic3r/GUI/wxExtensions.cpp:547 src/libslic3r/PrintConfig.cpp:888 msgid "Extruder" msgstr "擠出頭" -#: src/slic3r/GUI/GCodeViewer.cpp:3370 +#: src/slic3r/GUI/GCodeViewer.cpp:3662 msgid "Default color" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3393 +#: src/slic3r/GUI/GCodeViewer.cpp:3685 msgid "default color" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3491 src/slic3r/GUI/GCodeViewer.cpp:3547 +#: src/slic3r/GUI/GCodeViewer.cpp:3785 src/slic3r/GUI/GCodeViewer.cpp:3841 msgid "Color change" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3510 src/slic3r/GUI/GCodeViewer.cpp:3545 +#: src/slic3r/GUI/GCodeViewer.cpp:3804 src/slic3r/GUI/GCodeViewer.cpp:3839 msgid "Print" msgstr "列印" -#: src/slic3r/GUI/GCodeViewer.cpp:3546 src/slic3r/GUI/GCodeViewer.cpp:3580 +#: src/slic3r/GUI/GCodeViewer.cpp:3840 src/slic3r/GUI/GCodeViewer.cpp:3874 msgid "Pause" msgstr "Pause" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Event" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Remaining time" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3563 src/slic3r/GUI/GCodeViewer.cpp:3566 +#: src/slic3r/GUI/GCodeViewer.cpp:3857 src/slic3r/GUI/GCodeViewer.cpp:3860 msgid "Duration" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3609 src/slic3r/GUI/GUI_Preview.cpp:1049 -#: src/libslic3r/PrintConfig.cpp:2937 -msgid "Travel" -msgstr "空程" +#: src/slic3r/GUI/GCodeViewer.cpp:3928 src/slic3r/GUI/GUI.cpp:332 +#: src/slic3r/GUI/Plater.cpp:852 src/libslic3r/PrintConfig.cpp:335 +msgid "Printer" +msgstr "印表機" + +#: src/slic3r/GUI/GCodeViewer.cpp:3931 src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/Plater.cpp:848 +msgid "Print settings" +msgstr "列印設置" -#: src/slic3r/GUI/GCodeViewer.cpp:3612 -msgid "Movement" +#: src/slic3r/GUI/GCodeViewer.cpp:3936 src/slic3r/GUI/GUI.cpp:330 +#: src/slic3r/GUI/Plater.cpp:849 src/slic3r/GUI/Tab.cpp:1930 +#: src/slic3r/GUI/Tab.cpp:1931 +msgid "Filament" +msgstr "線材" + +#: src/slic3r/GUI/GCodeViewer.cpp:3950 +msgid "Estimated printing times" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3613 -msgid "Extrusion" +#: src/slic3r/GUI/GCodeViewer.cpp:3969 +msgid "Normal mode" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1870 -#: src/slic3r/GUI/Tab.cpp:2812 -msgid "Retraction" -msgstr "回縮" +#: src/slic3r/GUI/GCodeViewer.cpp:3970 +msgid "Stealth mode" +msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3631 src/slic3r/GUI/GCodeViewer.cpp:3634 -#: src/slic3r/GUI/GUI_Preview.cpp:1050 -msgid "Wipe" +#: src/slic3r/GUI/GCodeViewer.cpp:3979 src/libslic3r/PrintConfig.cpp:1249 +#: src/libslic3r/PrintConfig.cpp:1267 src/libslic3r/PrintConfig.cpp:1277 +#: src/libslic3r/PrintConfig.cpp:1322 +msgid "First layer" +msgstr "首層" + +#: src/slic3r/GUI/GCodeViewer.cpp:3983 +msgid "Total" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3666 src/slic3r/GUI/GUI_Preview.cpp:257 -#: src/slic3r/GUI/GUI_Preview.cpp:272 -msgid "Options" -msgstr "選項" +#: src/slic3r/GUI/GCodeViewer.cpp:4002 +msgid "Show stealth mode" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:4006 +msgid "Show normal mode" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:4071 +msgid "Wipe" +msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3669 src/slic3r/GUI/GUI_Preview.cpp:1051 +#: src/slic3r/GUI/GCodeViewer.cpp:4075 msgid "Retractions" msgstr "回抽" -#: src/slic3r/GUI/GCodeViewer.cpp:3670 src/slic3r/GUI/GUI_Preview.cpp:1052 +#: src/slic3r/GUI/GCodeViewer.cpp:4079 msgid "Deretractions" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3671 src/slic3r/GUI/GUI_Preview.cpp:1053 +#: src/slic3r/GUI/GCodeViewer.cpp:4083 msgid "Seams" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3672 src/slic3r/GUI/GUI_Preview.cpp:1054 +#: src/slic3r/GUI/GCodeViewer.cpp:4087 msgid "Tool changes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3673 src/slic3r/GUI/GUI_Preview.cpp:1055 +#: src/slic3r/GUI/GCodeViewer.cpp:4091 msgid "Color changes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3674 src/slic3r/GUI/GUI_Preview.cpp:1056 +#: src/slic3r/GUI/GCodeViewer.cpp:4095 msgid "Print pauses" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3675 src/slic3r/GUI/GUI_Preview.cpp:1057 +#: src/slic3r/GUI/GCodeViewer.cpp:4099 msgid "Custom G-codes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3695 src/slic3r/GUI/GCodeViewer.cpp:3714 -#: src/slic3r/GUI/GUI.cpp:341 src/slic3r/GUI/Plater.cpp:822 -#: src/libslic3r/PrintConfig.cpp:322 -msgid "Printer" -msgstr "印表機" - -#: src/slic3r/GUI/GCodeViewer.cpp:3697 src/slic3r/GUI/GCodeViewer.cpp:3719 -#: src/slic3r/GUI/GUI.cpp:337 src/slic3r/GUI/Plater.cpp:818 -msgid "Print settings" -msgstr "列印設置" - -#: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 -#: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1970 src/slic3r/GUI/Tab.cpp:1971 -msgid "Filament" -msgstr "線材" - -#: src/slic3r/GUI/GCodeViewer.cpp:3739 -msgid "Estimated printing times" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3758 -msgid "Normal mode" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3759 -msgid "Stealth mode" -msgstr "" - -#: src/slic3r/GUI/GCodeViewer.cpp:3766 src/libslic3r/PrintConfig.cpp:1189 -#: src/libslic3r/PrintConfig.cpp:1207 src/libslic3r/PrintConfig.cpp:1217 -#: src/libslic3r/PrintConfig.cpp:1262 -msgid "First layer" -msgstr "首層" - -#: src/slic3r/GUI/GCodeViewer.cpp:3767 -msgid "Total" +#: src/slic3r/GUI/GCodeViewer.cpp:4103 +msgid "Center of gravity" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3796 -msgid "Show stealth mode" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:4108 +msgid "Shells" +msgstr "殼" -#: src/slic3r/GUI/GCodeViewer.cpp:3800 -msgid "Show normal mode" +#: src/slic3r/GUI/GCodeViewer.cpp:4113 +msgid "Tool marker" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:225 src/slic3r/GUI/GLCanvas3D.cpp:4694 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:53 +#: src/slic3r/GUI/GLCanvas3D.cpp:185 src/slic3r/GUI/GLCanvas3D.cpp:4784 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:71 msgid "Variable layer height" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:227 +#: src/slic3r/GUI/GLCanvas3D.cpp:187 msgid "Left mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:229 +#: src/slic3r/GUI/GLCanvas3D.cpp:189 msgid "Add detail" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:231 +#: src/slic3r/GUI/GLCanvas3D.cpp:191 msgid "Right mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:233 +#: src/slic3r/GUI/GLCanvas3D.cpp:193 msgid "Remove detail" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:235 +#: src/slic3r/GUI/GLCanvas3D.cpp:195 msgid "Shift + Left mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:237 +#: src/slic3r/GUI/GLCanvas3D.cpp:197 msgid "Reset to base" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:239 +#: src/slic3r/GUI/GLCanvas3D.cpp:199 msgid "Shift + Right mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:241 +#: src/slic3r/GUI/GLCanvas3D.cpp:201 msgid "Smoothing" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:243 +#: src/slic3r/GUI/GLCanvas3D.cpp:203 msgid "Mouse wheel:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:245 +#: src/slic3r/GUI/GLCanvas3D.cpp:205 msgid "Increase/decrease edit area" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:248 +#: src/slic3r/GUI/GLCanvas3D.cpp:208 msgid "Adaptive" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:254 +#: src/slic3r/GUI/GLCanvas3D.cpp:214 msgid "Quality / Speed" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:257 +#: src/slic3r/GUI/GLCanvas3D.cpp:217 msgid "Higher print quality versus higher print speed." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:268 +#: src/slic3r/GUI/GLCanvas3D.cpp:228 msgid "Smooth" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:274 src/libslic3r/PrintConfig.cpp:819 +#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/libslic3r/PrintConfig.cpp:908 msgid "Radius" msgstr "半徑" -#: src/slic3r/GUI/GLCanvas3D.cpp:286 +#: src/slic3r/GUI/GLCanvas3D.cpp:246 msgid "Keep min" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:295 src/slic3r/GUI/GLCanvas3D.cpp:4123 +#: src/slic3r/GUI/GLCanvas3D.cpp:255 src/slic3r/GUI/GLCanvas3D.cpp:4217 msgid "Reset" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:561 +#: src/slic3r/GUI/GLCanvas3D.cpp:602 msgid "Variable layer height - Manual edit" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:676 +#: src/slic3r/GUI/GLCanvas3D.cpp:717 msgid "Seq." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1310 +#: src/slic3r/GUI/GLCanvas3D.cpp:1319 msgid "Variable layer height - Reset" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1318 +#: src/slic3r/GUI/GLCanvas3D.cpp:1327 msgid "Variable layer height - Adaptive" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1326 +#: src/slic3r/GUI/GLCanvas3D.cpp:1335 msgid "Variable layer height - Smooth all" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1733 +#: src/slic3r/GUI/GLCanvas3D.cpp:1778 msgid "Mirror Object" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:2612 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:560 +#: src/slic3r/GUI/GLCanvas3D.cpp:2542 src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:117 msgid "Gizmo-Move" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:2695 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562 +#: src/slic3r/GUI/GLCanvas3D.cpp:2638 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:661 msgid "Gizmo-Rotate" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3300 +#: src/slic3r/GUI/GLCanvas3D.cpp:3263 msgid "Move Object" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3821 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3513 +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:40 +msgid "Gizmo-Place on Face" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3904 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Switch to Settings" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3822 src/slic3r/GUI/GLCanvas3D.cpp:4655 +#: src/slic3r/GUI/GLCanvas3D.cpp:3905 src/slic3r/GUI/GLCanvas3D.cpp:4744 msgid "Print Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Filament Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3823 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/GLCanvas3D.cpp:3906 src/slic3r/GUI/GLCanvas3D.cpp:4745 msgid "Material Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3824 src/slic3r/GUI/GLCanvas3D.cpp:4657 +#: src/slic3r/GUI/GLCanvas3D.cpp:3907 src/slic3r/GUI/GLCanvas3D.cpp:4746 msgid "Printer Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Undo History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3971 +#: src/slic3r/GUI/GLCanvas3D.cpp:4067 msgid "Redo History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" msgstr[0] "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3991 +#: src/slic3r/GUI/GLCanvas3D.cpp:4087 #, c-format, boost-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" msgstr[0] "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4011 src/slic3r/GUI/GLCanvas3D.cpp:4673 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 src/slic3r/GUI/Search.cpp:426 +#: src/slic3r/GUI/GLCanvas3D.cpp:4106 src/slic3r/GUI/GLCanvas3D.cpp:4762 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/Search.cpp:482 msgid "Search" msgstr "搜尋" -#: src/slic3r/GUI/GLCanvas3D.cpp:4025 src/slic3r/GUI/GLCanvas3D.cpp:4033 -#: src/slic3r/GUI/Search.cpp:432 +#: src/slic3r/GUI/GLCanvas3D.cpp:4120 src/slic3r/GUI/GLCanvas3D.cpp:4128 +#: src/slic3r/GUI/Search.cpp:488 msgid "Enter a search term" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4064 +#: src/slic3r/GUI/GLCanvas3D.cpp:4160 msgid "Arrange options" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4097 +#: src/slic3r/GUI/GLCanvas3D.cpp:4193 #, boost-format msgid "Press %1%left mouse button to enter the exact value" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4099 +#: src/slic3r/GUI/GLCanvas3D.cpp:4195 msgid "Spacing" msgstr "間距" -#: src/slic3r/GUI/GLCanvas3D.cpp:4106 -msgid "Enable rotations (slow)" +#: src/slic3r/GUI/GLCanvas3D.cpp:4202 +msgid "Spacing from bed" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Alignment" -msgstr "對齊" +#: src/slic3r/GUI/GLCanvas3D.cpp:4209 +msgid "Enable rotations (slow)" +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:4500 -msgid "Center" -msgstr "居中" +#: src/slic3r/GUI/GLCanvas3D.cpp:4228 src/slic3r/GUI/GLCanvas3D.cpp:4656 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 src/slic3r/GUI/Plater.cpp:7118 +msgid "Arrange" +msgstr "整理" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4630 +msgid "Add..." +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4647 src/slic3r/GUI/KBShortcutsDialog.cpp:105 +#: src/slic3r/GUI/Plater.cpp:6047 src/slic3r/GUI/Tab.cpp:4383 +msgid "Delete all" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 src/slic3r/GUI/KBShortcutsDialog.cpp:142 +msgid "Arrange selection" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4656 +msgid "Click right mouse button to show arrangement options" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4676 +msgid "Copy" +msgstr "複製" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4685 +msgid "Paste" +msgstr "貼上" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4697 src/slic3r/GUI/GUI_Factories.cpp:1237 +#: src/slic3r/GUI/GUI_Factories.cpp:1261 src/slic3r/GUI/GUI_Factories.cpp:1272 +msgid "Add instance" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4708 src/slic3r/GUI/GUI_Factories.cpp:1240 +msgid "Remove instance" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4721 +msgid "Split to objects" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4731 +msgid "Split to parts" +msgstr "拆分到零件" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/GLCanvas3D.cpp:4874 +msgid "Click right mouse button to open/close History" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4859 +#, boost-format +msgid "Next Undo action: %1%" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4874 src/slic3r/GUI/KBShortcutsDialog.cpp:107 +#: src/slic3r/GUI/MainFrame.cpp:1429 +msgid "Redo" +msgstr "重做" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4895 +#, boost-format +msgid "Next Redo action: %1%" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6784 +msgid "An object outside the print area was detected." +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6785 +msgid "A toolpath outside the print area was detected." +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6786 +msgid "SLA supports outside the print area were detected." +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6787 +msgid "Some objects are not visible during editing." +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6789 +msgid "" +"An object outside the print area was detected.\n" +"Resolve the current problem to continue slicing." +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6864 +msgid "Selection-Add from rectangle" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6879 +msgid "Selection-Remove from rectangle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:206 +msgid "Planar" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Auto" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:210 +msgid "Manual" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:213 +msgid "Plug" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:214 +msgid "Dowel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Prism" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:222 +msgid "Frustum" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Triangle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Square" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +msgid "Hexagon" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:226 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:59 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 +msgid "Circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:233 +msgid "Keep orientation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:234 +msgid "Place on cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:235 +msgid "Flip upside down" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:246 +msgid "inch" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 +msgid "Part" +msgstr "部件" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:249 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1770 src/libslic3r/Print.cpp:1236 +msgid "Object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:264 +msgid "" +"Click to flip the cut plane\n" +"Drag to move the cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:269 src/libslic3r/PrintConfig.cpp:498 +#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2325 src/libslic3r/PrintConfig.cpp:2613 +#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2876 src/libslic3r/PrintConfig.cpp:2907 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3231 +#: src/libslic3r/PrintConfig.cpp:3466 src/libslic3r/PrintConfig.cpp:3951 +msgid "°" +msgstr "°" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:367 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:571 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1232 +msgid "Move cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:508 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:528 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1602 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1977 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:370 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:529 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:664 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:665 +msgid "in" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:544 +msgid "Value" +msgstr "值" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:549 +msgid "Tolerance" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 +msgid "Left click" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:865 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2348 +msgid "Add connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 +msgid "Right click" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:866 +msgid "Remove connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 +msgid "Drag" +msgstr "拖曳" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:867 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1216 +msgid "Move connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:868 +msgid "Add connector to selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:869 +msgid "Remove connector from selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:870 +msgid "Select all connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:894 src/libslic3r/PrintConfig.cpp:4644 +msgid "Cut" +msgstr "切割" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1227 +msgid "Rotate cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1448 +msgid "Render cut plane as circle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1537 +msgid "Connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1541 +msgid "Remove connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1550 +msgid "Type" +msgstr "類型" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1561 src/libslic3r/PrintConfig.cpp:2816 +msgid "Style" +msgstr "樣式" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1568 +msgid "Depth ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1586 +msgid "Confirm connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1652 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1666 +msgid "Flip cut plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1710 +msgid "Hold SHIFT key to draw a cut line" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1716 +msgid "Cut position: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1725 +msgid "Reset cutting plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Edit connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1737 +msgid "Add connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1744 +msgid "Reset cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1745 +msgid "Reset cutting plane and remove connectors" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1800 +msgid "After cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1820 +msgid "Cut to" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1823 +msgid "Objects" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1826 +msgid "Parts" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1840 +msgid "Perform cut" +msgstr "執行切割" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1930 +msgid "Invalid connectors detected" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1932 +#, c-format, boost-format +msgid "%1$d connector is out of cut contour" +msgid_plural "%1$d connectors are out of cut contour" +msgstr[0] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1935 +#, c-format, boost-format +msgid "%1$d connector is out of object" +msgid_plural "%1$d connectors are out of object" +msgstr[0] "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1938 +msgid "Some connectors are overlapped" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1942 +msgid "" +"Invalid state. \n" +"No one part is selected for keep after cut" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:1944 +msgid "" +"Warning state. \n" +"Cut plane is placed out of object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2153 +msgid "Connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2183 +msgid "Cut by Plane" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2323 +msgid "Cut by line" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:2373 +msgid "Delete connector" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:252 +msgid "Entering Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:253 +msgid "Leaving Cut gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.hpp:254 +msgid "Cut gizmo editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:601 +msgid "Emboss" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:866 +msgid "ERROR: Wait until ends or Cancel process." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:921 +msgid "Text-Rotate" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:953 +msgid "Font" +msgstr "字型" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:954 +#: src/libslic3r/PrintConfig.cpp:897 +msgid "Height" +msgstr "高度" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:955 +msgid "Depth" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:963 +msgid "Use surface" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:964 +msgid "Char gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:965 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Line gap" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:966 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Boldness" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:967 +msgid "Skew ratio" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:968 +msgid "Z-move" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:969 +msgid "Z-rot" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:970 +msgid "Collection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1047 +msgid "NORMAL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1048 +msgid "SMALL" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1049 +msgid "ITALIC" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1050 +msgid "SWISS" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1051 +msgid "MODERN" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1088 +msgid "First font" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1093 +msgid "Default font" +msgstr "預設字型" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1098 +msgid "Embossed text" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1513 +msgid "Warning: No font is selected. Select correct one." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1531 +#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1437 +#: src/slic3r/GUI/Tab.cpp:1472 src/slic3r/GUI/Tab.cpp:1607 +#: src/slic3r/GUI/Tab.cpp:1611 src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:2390 src/slic3r/GUI/Tab.cpp:4985 +#: src/libslic3r/PrintConfig.cpp:276 src/libslic3r/PrintConfig.cpp:514 +#: src/libslic3r/PrintConfig.cpp:1484 src/libslic3r/PrintConfig.cpp:1566 +#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:2562 +#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:3166 +#: src/libslic3r/PrintConfig.cpp:3200 src/libslic3r/PrintConfig.cpp:3211 +#: src/libslic3r/PrintConfig.cpp:3226 src/libslic3r/PrintConfig.cpp:3239 +#: src/libslic3r/PrintConfig.cpp:3248 src/libslic3r/PrintConfig.cpp:3260 +#: src/libslic3r/PrintConfig.cpp:3642 +msgid "Advanced" +msgstr "進階" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1631 +msgid "Can't write text by selected font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1632 +msgid "Try to choose another font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Empty" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1645 +msgid "Embossed text can NOT contain only white spaces." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Bad symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1647 +msgid "Text contain character glyph (represented by '?') unknown by font." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:535 +msgid "Skew" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1650 +msgid "Unsupported visualization of font skew for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1651 +msgid "Unsupported visualization of font boldness for text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1653 +msgid "Unsupported visualization of gap between lines inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Too tall" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1657 +msgid "Diminished font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Too small" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1659 +msgid "Enlarged font height inside text input." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1660 +#, boost-format +msgid "%1% is NOT shown." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1964 +msgid " No symbol" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:1965 +msgid " ... Loading" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2015 +msgid " ... In queue" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2132 +#, boost-format +msgid "Font face \"%1%\" can't be selected." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2180 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:754 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:367 +msgid "Apply" +msgstr "套用" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2192 +msgid "add file with font(.ttf, .ttc)" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2202 +msgid "Open dialog for choose from fonts." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2210 +msgid "Text is to object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2224 +msgid "Added" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2227 +msgid "Click to change text into object part." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2230 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4321 +msgid "You can't change a type of the last solid part of the object." +msgstr "不能更改對象的最後一個實體部分的類型。" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2231 +msgid "Subtracted" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2237 +msgid "Click to change part type into negative volume." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2243 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4338 +msgid "Modifier" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2249 +msgid "Click to change part type into modifier." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2256 +msgid "Change Text Type" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2287 +#, boost-format +msgid "Rename style(%1%) for embossing text: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2299 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2384 +msgid "Name can't be empty." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2301 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2386 +msgid "Name has to be unique." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2310 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2397 +msgid "ok" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2312 +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2401 +msgid "cancel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2337 +msgid "Rename style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2344 +msgid "Rename current style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2345 +msgid "Can't rename temporary style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2362 +msgid "First Add style to list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2364 +#, boost-format +msgid "Save %1% style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2366 +msgid "No changes to save." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2373 +msgid "New name of style: " +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2422 +msgid "Save as new style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2434 +msgid "Only valid font can be added to style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2436 +msgid "Add style to my list." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2438 +msgid "Add as new named style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2454 +msgid "Remove style" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2485 +#, boost-format +msgid "Delete \"%1%\" style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2486 +#, boost-format +msgid "Can't delete \"%1%\". It is last style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2487 +#, boost-format +msgid "Can't delete temporary style \"%1%\"." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2494 +#, boost-format +msgid "" +"Are you sure,\n" +"that you want permanently and unrecoverable \n" +"remove style \"%1%\"?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2496 +msgid "Yes" +msgstr "是" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2505 +msgid "No" +msgstr "否" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2555 +msgid "Presets" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2564 src/slic3r/GUI/GUI_App.cpp:2324 +msgid "modified" +msgstr "修改" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2617 +#, boost-format +msgid "Modified style \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2618 +#, boost-format +msgid "Current style is \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2625 +msgid "Style modification will be lost." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2627 +#, boost-format +msgid "" +"Changing style to '%1%' will discard current style modification.\n" +"\n" +" Would you like to continue anyway?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2643 +msgid "Not valid style." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2644 +#, boost-format +msgid "Style '%1%' can't be used and will be removed from list." +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear left" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2691 +msgid "Unset italic" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front left" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2708 +msgid "Set italic" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Front right" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2738 +msgid "Unset bold" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 -msgid "Rear right" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2756 +msgid "Set bold" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4115 src/libslic3r/PrintConfig.cpp:2271 -msgid "Random" -msgstr "隨機" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2922 +msgid "WxFont is not loaded properly." +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4133 src/slic3r/GUI/GLCanvas3D.cpp:4565 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Plater.cpp:1664 -msgid "Arrange" -msgstr "整理" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2957 +msgid "Revert font changes." +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4539 -msgid "Add..." +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:2991 +msgid "wx Make bold" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4556 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5509 src/slic3r/GUI/Tab.cpp:4158 -msgid "Delete all" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3002 +msgid "Revert text size." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 src/slic3r/GUI/KBShortcutsDialog.cpp:133 -msgid "Arrange selection" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3029 +msgid "Revert embossed depth." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4565 -msgid "Click right mouse button to show arrangement options" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3178 +msgid "" +"Advanced font options could be changed only for correct font.\n" +"Start with select correct font." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4587 -msgid "Copy" -msgstr "複製" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3219 +msgid "Revert using of model surface." +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4596 -msgid "Paste" -msgstr "貼上" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3232 +msgid "font points" +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4608 src/slic3r/GUI/GUI_Factories.cpp:1084 -#: src/slic3r/GUI/GUI_Factories.cpp:1108 src/slic3r/GUI/GUI_Factories.cpp:1119 -msgid "Add instance" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3241 +msgid "Revert gap between letters" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4619 src/slic3r/GUI/GUI_Factories.cpp:1087 -msgid "Remove instance" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3242 +msgid "Distance between letters" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4632 -msgid "Split to objects" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3257 +msgid "Revert gap between lines" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4642 -msgid "Split to parts" -msgstr "拆分到零件" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3258 +msgid "Distance between lines" +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4756 src/slic3r/GUI/GLCanvas3D.cpp:4795 -msgid "Click right mouse button to open/close History" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3272 +msgid "Undo boldness" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4779 -#, boost-format -msgid "Next Undo action: %1%" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3273 +msgid "Tiny / Wide glyphs" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4795 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1345 -msgid "Redo" -msgstr "重做" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3283 +msgid "Undo letter's skew" +msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4817 -#, boost-format -msgid "Next Redo action: %1%" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3284 +msgid "Italic strength ratio" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6434 -msgid "An object outside the print area was detected." +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3304 +msgid "Undo translation" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6435 -msgid "A toolpath outside the print area was detected." +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3305 +msgid "Distance of the center of text from model surface" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6436 -msgid "SLA supports outside the print area were detected." +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3350 +msgid "Undo rotation" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6437 -msgid "Some objects are not visible during editing." +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3352 +msgid "Rotate text Clock-wise." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6439 -msgid "" -"An object outside the print area was detected.\n" -"Resolve the current problem to continue slicing." +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3386 +msgid "Select from True Type Collection." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6513 -msgid "Selection-Add from rectangle" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3395 +msgid "Set text to face camera" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6528 -msgid "Selection-Remove from rectangle" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3402 +msgid "Use camera direction for text orientation" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4478 -msgid "Cut" -msgstr "切割" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3486 +#, boost-format +msgid "Font '%1%' can't be used. Please select another." +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:320 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:478 -msgid "in" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3488 +msgid "Selected font is NOT True-type." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3512 +msgid "Choose one or more files (TTF, TTC):" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 -msgid "Keep upper part" -msgstr "保留上半部分" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3539 +msgid "Choose SVG file:" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 -msgid "Keep lower part" -msgstr "保留下半部分" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp:3600 +#, boost-format +msgid "" +"Can't load exactly same font(\"%1%\"), Aplication selected a similar " +"one(\"%2%\"). You have to specify font for enable edit text." +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:196 -msgid "Rotate lower part upwards" -msgstr "旋轉下部向上" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:81 +msgid "Enter emboss gizmo" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:201 -msgid "Perform cut" -msgstr "執行切割" +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:82 +msgid "Leave emboss gizmo" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp:83 +msgid "Embossing actions" +msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:37 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:66 msgid "Paint-on supports" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 +msgid "Automatic painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 +msgid "painting..." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:107 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 msgid "Clipping of view" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:106 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 msgid "Reset direction" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:108 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 msgid "Brush size" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:109 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 msgid "Brush shape" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1816 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:110 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 msgid "Left mouse button" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 msgid "Enforce supports" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:117 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:112 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 msgid "Right mouse button" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:434 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:573 msgid "Block supports" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:114 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:39 msgid "Shift + Left mouse button" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:429 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:568 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:247 msgid "Remove selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:58 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:41 msgid "Remove all selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:42 -msgid "Circle" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:43 -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Sphere" msgstr "球" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:55 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:68 -#: src/libslic3r/PrintConfig.cpp:1172 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:119 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:106 +#: src/libslic3r/PrintConfig.cpp:1231 msgid "Triangles" msgstr "三角形" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 msgid "Highlight overhang by angle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:57 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:63 msgid "Enforce" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:60 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 msgid "Tool type" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:61 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:122 msgid "Brush" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:62 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:128 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:68 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:123 msgid "Smart fill" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:64 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:131 -msgid "Smart fill angle" +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:126 +msgid "Smart fill angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:72 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:127 +msgid "Split triangles" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:73 +msgid "On overhangs only" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:187 +#, boost-format +msgid "" +"Preselects faces by overhang angle. It is possible to restrict paintable " +"facets to only preselected faces when the option \"%1%\" is enabled." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:230 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:371 +msgid "Paints facets according to the chosen painting brush." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:238 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:384 +msgid "" +"Paints neighboring facets whose relative angle is less or equal to set angle." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242 +#, boost-format +msgid "Allows painting only on facets selected by: \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:257 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:412 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141 +msgid "Paints all facets inside, regardless of their orientation." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:266 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:421 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:149 +msgid "Ignores facets facing away from the camera." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:430 +msgid "Paints only one facet." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:283 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:298 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:438 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:455 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:129 +msgid "Alt + Mouse wheel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:288 +msgid "Splits bigger facets into smaller ones while the object is painted." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:321 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:476 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:167 +msgid "Ctrl + Mouse wheel" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:326 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:481 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:172 +msgid "Reset selection" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:382 +msgid "Block supports by angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:383 +msgid "Add supports by angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:524 +msgid "Automatic painting requires valid print setup." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:535 +msgid "Automatic painting will erase all currently painted areas." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:536 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1118 +msgid "Are you sure you want to do it?" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:540 +msgid "Automatic painting support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:571 +msgid "Add supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:22 +msgid "Entering Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:23 +msgid "Leaving Paint-on supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp:24 +msgid "Paint-on supports editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:88 +msgid "Place on face" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:29 +msgid "Hollow this object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 +msgid "Preview hollowed and drilled model" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 +msgid "Offset" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 +msgid "Quality" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 +#: src/libslic3r/PrintConfig.cpp:4037 +msgid "Closing distance" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 +msgid "Hole diameter" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 +msgid "Hole depth" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 +msgid "Remove selected holes" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 +msgid "Remove all holes" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 +msgid "Show supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:242 +msgid "Add drainage hole" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:361 +msgid "Delete drainage hole" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:655 +msgid "Hollowing parameter change" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:739 +msgid "Change drainage hole diameter" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:827 +msgid "Hollow and drill" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:869 +msgid "Move drainage hole" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:66 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:132 -msgid "Split triangles" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:64 +msgid "No feature" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:67 -msgid "On overhangs only" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:65 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:76 +msgid "Vertex" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:174 -#, boost-format -msgid "" -"Preselects faces by overhang angle. It is possible to restrict paintable " -"facets to only preselected faces when the option \"%1%\" is enabled." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:66 +msgid "Edge" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:217 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:378 -msgid "Paints facets according to the chosen painting brush." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:68 +msgid "Plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:391 -msgid "" -"Paints neighboring facets whose relative angle is less or equal to set angle." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:77 +msgid "Point on edge" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:229 -#, boost-format -msgid "Allows painting only on facets selected by: \"%1%\"" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:78 +msgid "Point on circle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:244 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:419 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:144 -msgid "Paints all facets inside, regardless of their orientation." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:79 +msgid "Point on plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:253 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:428 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:152 -msgid "Ignores facets facing away from the camera." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:89 +msgid "Center of edge" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:262 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:437 -msgid "Paints only one facet." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:90 +msgid "Center of circle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:270 -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:285 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:445 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:462 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:132 -msgid "Alt + Mouse wheel" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:554 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2029 +msgid "Measure" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:275 -msgid "Splits bigger facets into smaller ones while the object is painted." +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1236 +msgid "Edit to scale" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:308 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:483 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:170 -msgid "Ctrl + Mouse wheel" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1258 +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:161 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:236 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:776 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:794 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:817 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:831 +#: src/libslic3r/PrintConfig.cpp:4713 +msgid "Scale" +msgstr "縮放" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1362 +msgctxt "Verb" +msgid "Scale" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:313 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:488 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:175 -msgid "Reset selection" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1541 +msgid "##angle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:364 -msgid "Block supports by angle" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1740 +msgid "Measure tool debug" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:365 -msgid "Add supports by angle" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1824 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1851 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1857 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1886 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1893 +msgid "Unselect feature" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:432 -msgid "Add supports" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1830 +msgid "Unselect center" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:41 -msgid "Place on face" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1835 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1862 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1898 +msgid "Select center" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:30 -msgid "Hollow this object" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1840 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1867 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1903 +msgid "Unselect point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:31 -msgid "Preview hollowed and drilled model" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1846 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1873 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1910 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select feature" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:32 -msgid "Offset" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1878 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1915 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1923 +msgid "Select point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:33 -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:57 -msgid "Quality" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Shift" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3905 -msgid "Closing distance" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1940 +msgid "Enable point selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:35 -msgid "Hole diameter" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1945 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2007 +msgid "Restart selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:36 -msgid "Hole depth" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1952 +msgid "Esc" +msgstr "Esc" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1955 +msgid "Unselect" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:37 -msgid "Remove selected holes" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:1999 +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2001 +msgid "Selection" +msgstr "所選項目" + +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2021 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +msgid "Copy to clipboard" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 -msgid "Remove all holes" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2038 +msgid "Angle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 -msgid "Show supports" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Perpendicular distance" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:287 -msgid "Add drainage hole" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2052 +msgid "Distance" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:403 -msgid "Delete drainage hole" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2062 +msgid "Direct distance" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:590 -msgid "Hollowing parameter change" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp:2072 +msgid "Distance XYZ" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:667 -msgid "Change drainage hole diameter" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:163 +msgid "Entering Measure gizmo" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:761 -msgid "Hollow and drill" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:164 +msgid "Leaving Measure gizmo" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:811 -msgid "Move drainage hole" +#: src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp:165 +msgid "Measure gizmo editing" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:27 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:28 #, boost-format msgid "" "Your printer has more extruders than the multi-material painting gizmo " @@ -2678,81 +3886,85 @@ msgid "" "used for painting." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:45 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:46 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 msgid "Multimaterial painting" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:111 msgid "First color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:118 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:113 msgid "Second color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:120 -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:671 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:115 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:642 msgid "Remove painted color" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:121 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:116 msgid "Clear all" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:129 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:124 msgid "Bucket fill" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:404 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:397 msgid "Paints neighboring facets that have the same color." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:450 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:443 msgid "Split bigger facets into smaller ones while the object is painted." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:674 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp:645 #, boost-format msgid "Painted using: Extruder %1%" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:118 +msgid "Entering Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:119 +msgid "Leaving Multimaterial painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp:120 +msgid "Multimaterial painting editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:76 msgid "Move" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:466 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4532 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:643 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:745 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:775 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:813 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:830 +#: src/libslic3r/PrintConfig.cpp:4698 msgid "Rotate" msgstr "旋轉" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:505 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:707 msgid "Optimize orientation" msgstr "優化方向" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:552 -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:319 -msgid "Apply" -msgstr "套用" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:79 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4547 -msgid "Scale" -msgstr "縮放" +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:194 +msgid "Gizmo-Scale" +msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:250 msgid "Enforce seam" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:38 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:255 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:252 msgid "Block seam" msgstr "" @@ -2760,338 +3972,342 @@ msgstr "" msgid "Seam painting" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:67 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:23 +msgid "Entering Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:24 +msgid "Leaving Seam painting" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp:25 +msgid "Paint-on seam editing" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:105 msgid "Mesh name" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:69 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:107 msgid "Detail level" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:70 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:108 msgid "Decimate ratio" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:113 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:147 #, boost-format msgid "" "Processing model '%1%' with more than 1M triangles could be slow. It is " -"highly recommend to reduce amount of triangles." +"highly recommended to reduce amount of triangles." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:116 -#: src/slic3r/GUI/GUI_Factories.cpp:705 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:150 +#: src/slic3r/GUI/GUI_Factories.cpp:789 msgid "Simplify model" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:143 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:177 msgid "Simplify" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:156 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:190 msgid "Simplification is currently only allowed when a single part is selected" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 -#: src/slic3r/GUI/PrintHostDialogs.cpp:373 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:191 +#: src/slic3r/GUI/MainFrame.cpp:1246 src/slic3r/GUI/MainFrame.cpp:1716 +#: src/slic3r/GUI/PrintHostDialogs.cpp:425 msgid "Error" msgstr "錯誤" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:250 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:294 msgid "Extra high" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:251 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:295 msgid "High" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:252 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:296 msgid "Medium" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:253 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:297 msgid "Low" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:254 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:298 msgid "Extra low" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:304 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#, boost-format +msgid "" +"Multipart object can be simplified only by %1%. If you want specify %2% " +"process it separately." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:352 #, c-format, boost-format msgid "%d triangles" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:307 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:355 msgid "Show wireframe" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:313 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:361 msgid "Operation already cancelling. Please wait few seconds." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:322 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:370 msgid "Can't apply when proccess preview." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:329 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:377 #, boost-format msgid "Process %1% / 100" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:479 -#, boost-format -msgid "Simplify %1%" +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:542 +msgid "Simplify " msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:543 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"simplifying the mesh." +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:67 +msgid "Entering SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp:68 +msgid "Leaving SLA support points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:35 msgid "Head diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:36 msgid "Lock supports under new islands" msgstr "在新的島之下鎖定支持" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:37 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268 msgid "Remove selected points" msgstr "刪除選定的點" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:38 msgid "Remove all points" msgstr "刪除所有點" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1226 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1271 msgid "Apply changes" msgstr "應用更改" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1227 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1272 msgid "Discard changes" msgstr "放棄更改" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:41 msgid "Minimal points distance" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3735 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:42 +#: src/libslic3r/PrintConfig.cpp:3867 msgid "Support points density" msgstr "支撐點密度" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1229 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:43 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1274 msgid "Auto-generate points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 msgid "Manual editing" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:372 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:307 msgid "Add support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:522 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:460 msgid "Delete support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:702 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:626 msgid "Change point head diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:770 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:696 msgid "Support parameter change" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:876 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:806 msgid "SLA Support Points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:814 msgid "Do you want to save your manually edited support points?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:898 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:815 msgid "Save support points?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:958 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:880 msgid "Move support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1051 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:987 msgid "Support points edit" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1131 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1117 msgid "Autogeneration will erase all manually edited points." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1132 -msgid "Are you sure you want to do it?" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1138 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1124 msgid "Autogenerate support points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1186 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 msgid "SLA gizmo keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1197 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1242 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 -msgid "Left click" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 msgid "Add point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 -msgid "Right click" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1261 msgid "Remove point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 -msgid "Drag" -msgstr "拖曳" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1262 msgid "Move point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 msgid "Add point to selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1264 msgid "Remove point from selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1265 msgid "Select by rectangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1266 msgid "Deselect by rectangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1267 msgid "Select all points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Mouse wheel" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 msgid "Move clipping plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1225 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1270 msgid "Reset clipping plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1228 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273 msgid "Switch to editing mode" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:196 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:204 msgid "" "ERROR: Please close all manipulators available from the left toolbar first" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:561 -msgid "Gizmo-Scale" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:673 -msgid "Gizmo-Place on Face" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:1270 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:998 msgid "" "You are currently editing SLA support points. Please, apply or discard your " "changes first." msgstr "" -#: src/slic3r/GUI/GUI.cpp:292 +#: src/slic3r/GUI/GUI.cpp:287 msgid "Undefined" msgstr "" -#: src/slic3r/GUI/GUI.cpp:317 +#: src/slic3r/GUI/GUI.cpp:308 #, boost-format msgid "%1% was substituted with %2%" msgstr "" -#: src/slic3r/GUI/GUI.cpp:326 +#: src/slic3r/GUI/GUI.cpp:317 msgid "" "Most likely the configuration was produced by a newer version of PrusaSlicer " "or by some PrusaSlicer fork." msgstr "" -#: src/slic3r/GUI/GUI.cpp:327 +#: src/slic3r/GUI/GUI.cpp:318 msgid "The following values were substituted:" msgstr "" -#: src/slic3r/GUI/GUI.cpp:328 +#: src/slic3r/GUI/GUI.cpp:319 msgid "Review the substitutions and adjust them if needed." msgstr "" -#: src/slic3r/GUI/GUI.cpp:338 src/slic3r/GUI/Plater.cpp:820 +#: src/slic3r/GUI/GUI.cpp:329 src/slic3r/GUI/Plater.cpp:850 msgid "SLA print settings" msgstr "" -#: src/slic3r/GUI/GUI.cpp:342 src/slic3r/GUI/PhysicalPrinterDialog.cpp:157 +#: src/slic3r/GUI/GUI.cpp:333 src/slic3r/GUI/PhysicalPrinterDialog.cpp:158 msgid "Physical Printer" msgstr "" -#: src/slic3r/GUI/GUI.cpp:355 +#: src/slic3r/GUI/GUI.cpp:346 msgid "" "Configuration bundle was loaded, however some configuration values were not " "recognized." msgstr "" -#: src/slic3r/GUI/GUI.cpp:365 +#: src/slic3r/GUI/GUI.cpp:356 #, boost-format msgid "" "Configuration file \"%1%\" was loaded, however some configuration values " "were not recognized." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:266 +#: src/slic3r/GUI/GUI_App.cpp:275 msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:267 +#: src/slic3r/GUI/GUI_App.cpp:276 msgid "Developed by Prusa Research." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:269 +#: src/slic3r/GUI/GUI_App.cpp:278 msgid "" "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:270 -msgid "Artwork model by Leslie Ing" +#: src/slic3r/GUI/GUI_App.cpp:279 +msgid "Artwork model by Creative Tools" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:411 +#: src/slic3r/GUI/GUI_App.cpp:420 #, boost-format msgid "" "Starting with %1% 2.3, configuration directory on Linux has changed " @@ -3111,20 +4327,20 @@ msgid "" "What do you want to do now?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:419 +#: src/slic3r/GUI/GUI_App.cpp:428 #, c-format, boost-format msgid "%s - BREAKING CHANGE" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Quit, I will move my data now" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:421 +#: src/slic3r/GUI/GUI_App.cpp:430 msgid "Start the application" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:699 +#: src/slic3r/GUI/GUI_App.cpp:725 #, c-format, boost-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -3134,11 +4350,11 @@ msgid "" "The application will now terminate." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:702 +#: src/slic3r/GUI/GUI_App.cpp:728 msgid "Fatal error" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:706 +#: src/slic3r/GUI/GUI_App.cpp:732 msgid "" "PrusaSlicer has encountered a localization error. Please report to " "PrusaSlicer team, what language was active and in which scenario this issue " @@ -3147,34 +4363,34 @@ msgid "" "The application will now terminate." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:709 +#: src/slic3r/GUI/GUI_App.cpp:735 msgid "Critical error" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:714 +#: src/slic3r/GUI/GUI_App.cpp:740 #, boost-format msgid "Internal error: %1%" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:909 src/slic3r/GUI/GUI_App.cpp:1007 +#: src/slic3r/GUI/GUI_App.cpp:954 src/slic3r/GUI/GUI_App.cpp:1051 msgid "" "Error parsing PrusaSlicer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error. Your user profiles will " "not be affected." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:915 src/slic3r/GUI/GUI_App.cpp:1013 +#: src/slic3r/GUI/GUI_App.cpp:960 src/slic3r/GUI/GUI_App.cpp:1057 msgid "" "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:962 +#: src/slic3r/GUI/GUI_App.cpp:1006 #, boost-format msgid "You are opening %1% version %2%." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:965 +#: src/slic3r/GUI/GUI_App.cpp:1009 #, boost-format msgid "" "The active configuration was created by %1% %2%,\n" @@ -3186,7 +4402,7 @@ msgid "" "configuration." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:973 +#: src/slic3r/GUI/GUI_App.cpp:1017 #, boost-format msgid "" "An existing configuration was found in %3%\n" @@ -3195,19 +4411,19 @@ msgid "" "Shall this configuration be imported?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:981 +#: src/slic3r/GUI/GUI_App.cpp:1025 msgid "Import" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:982 +#: src/slic3r/GUI/GUI_App.cpp:1026 msgid "Don't import" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:990 +#: src/slic3r/GUI/GUI_App.cpp:1034 msgid "Continue and import newer configuration?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1051 +#: src/slic3r/GUI/GUI_App.cpp:1095 msgid "" "You are running a 32 bit build of PrusaSlicer on 64-bit Windows.\n" "32 bit build of PrusaSlicer will likely not be able to utilize all the RAM " @@ -3217,53 +4433,44 @@ msgid "" "Do you wish to continue?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1134 +#: src/slic3r/GUI/GUI_App.cpp:1182 #, c-format, boost-format msgid "" "%s\n" "Do you want to continue?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1136 src/slic3r/GUI/GUI_App.cpp:3101 -#: src/slic3r/GUI/Plater.cpp:1726 src/slic3r/GUI/UnsavedChangesDialog.cpp:889 +#: src/slic3r/GUI/GUI_App.cpp:1184 src/slic3r/GUI/GUI_App.cpp:3302 +#: src/slic3r/GUI/Plater.cpp:1736 src/slic3r/GUI/UnsavedChangesDialog.cpp:917 msgid "Remember my choice" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1178 +#: src/slic3r/GUI/GUI_App.cpp:1226 msgid "Loading configuration" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1209 -#, boost-format -msgid "New release version %1% is available." -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:1210 -msgid "See Download page." -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:1224 +#: src/slic3r/GUI/GUI_App.cpp:1257 #, boost-format msgid "New prerelease version %1% is available." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1225 +#: src/slic3r/GUI/GUI_App.cpp:1258 msgid "See Releases page." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1262 +#: src/slic3r/GUI/GUI_App.cpp:1313 msgid "Preparing settings tabs" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1336 src/slic3r/GUI/Preferences.cpp:287 +#: src/slic3r/GUI/GUI_App.cpp:1393 src/slic3r/GUI/Preferences.cpp:405 msgid "Restore window position on start" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1338 +#: src/slic3r/GUI/GUI_App.cpp:1395 msgid "PrusaSlicer started after a crash" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1339 +#: src/slic3r/GUI/GUI_App.cpp:1396 #, boost-format msgid "" "PrusaSlicer crashed last time when attempting to set window position.\n" @@ -3276,339 +4483,374 @@ msgid "" "Otherwise, the application will most likely crash again next time." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1351 +#: src/slic3r/GUI/GUI_App.cpp:1408 #, boost-format msgid "Disable \"%1%\"" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1352 +#: src/slic3r/GUI/GUI_App.cpp:1409 #, boost-format msgid "Leave \"%1%\" enabled" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1679 +#: src/slic3r/GUI/GUI_App.cpp:1780 msgid "" "You have the following presets with saved options for \"Print Host upload\"" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1683 +#: src/slic3r/GUI/GUI_App.cpp:1784 msgid "" "But since this version of PrusaSlicer we don't show this information in " "Printer Settings anymore.\n" "Settings will be available in physical printers settings." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1685 +#: src/slic3r/GUI/GUI_App.cpp:1786 msgid "" "By default new Printer devices will be named as \"Printer N\" during its " "creation.\n" "Note: This name can be changed later from the physical printers settings" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1689 src/slic3r/GUI/PhysicalPrinterDialog.cpp:726 +#: src/slic3r/GUI/GUI_App.cpp:1790 src/slic3r/GUI/PhysicalPrinterDialog.cpp:798 msgid "Information" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1702 src/slic3r/GUI/GUI_App.cpp:1713 +#: src/slic3r/GUI/GUI_App.cpp:1803 src/slic3r/GUI/GUI_App.cpp:1814 msgid "Recreating" msgstr "再造" -#: src/slic3r/GUI/GUI_App.cpp:1716 +#: src/slic3r/GUI/GUI_App.cpp:1817 msgid "Loading of current presets" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1721 +#: src/slic3r/GUI/GUI_App.cpp:1822 msgid "Loading of a mode view" msgstr "載入模式視圖" -#: src/slic3r/GUI/GUI_App.cpp:1859 +#: src/slic3r/GUI/GUI_App.cpp:1961 msgid "Choose one file (3MF/AMF):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1871 +#: src/slic3r/GUI/GUI_App.cpp:1973 msgid "Choose one or more files (STL/3MF/STEP/OBJ/AMF/PRUSA):" msgstr "選擇一個或多個文件 (STL/3MF/STEP/OBJ/AMF/PRUSA):" -#: src/slic3r/GUI/GUI_App.cpp:1883 +#: src/slic3r/GUI/GUI_App.cpp:1984 +msgid "Choose ZIP file:" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1996 msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1894 +#: src/slic3r/GUI/GUI_App.cpp:2007 msgid "Changing of an application language" msgstr "更改應用程序語言" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Select the language" msgstr "選擇語言" -#: src/slic3r/GUI/GUI_App.cpp:2033 +#: src/slic3r/GUI/GUI_App.cpp:2148 msgid "Language" msgstr "語言" -#: src/slic3r/GUI/GUI_App.cpp:2182 -msgid "modified" -msgstr "修改" +#: src/slic3r/GUI/GUI_App.cpp:2363 +msgid "" +"Simple mode supports manipulation with single-part object(s)\n" +"or object(s) with support modifiers only." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2365 +msgid "Please check your object list before mode changing." +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2236 +#: src/slic3r/GUI/GUI_App.cpp:2366 +msgid "Change application mode" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2397 #, c-format, boost-format msgid "Run %s" msgstr "運行 %s" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "&Configuration Snapshots" msgstr "&配置快照" -#: src/slic3r/GUI/GUI_App.cpp:2240 +#: src/slic3r/GUI/GUI_App.cpp:2401 msgid "Inspect / activate configuration snapshots" msgstr "檢查/啟用配置快照" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Take Configuration &Snapshot" msgstr "獲取配置和快照" -#: src/slic3r/GUI/GUI_App.cpp:2241 +#: src/slic3r/GUI/GUI_App.cpp:2402 msgid "Capture a configuration snapshot" msgstr "擷取配置快照" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for Configuration Updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2242 +#: src/slic3r/GUI/GUI_App.cpp:2403 msgid "Check for configuration updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2249 +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for Application Updates" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2404 +msgid "Check for new version of application" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:2411 msgid "&Preferences" msgstr "&首選項" -#: src/slic3r/GUI/GUI_App.cpp:2255 +#: src/slic3r/GUI/GUI_App.cpp:2417 msgid "Application preferences" msgstr "應用程序首選項" -#: src/slic3r/GUI/GUI_App.cpp:2260 src/slic3r/GUI/wxExtensions.cpp:708 -msgid "Simple" -msgstr "簡單" - -#: src/slic3r/GUI/GUI_App.cpp:2260 +#: src/slic3r/GUI/GUI_App.cpp:2422 msgid "Simple View Mode" msgstr "簡單介面模式" -#: src/slic3r/GUI/GUI_App.cpp:2262 src/slic3r/GUI/wxExtensions.cpp:710 -msgctxt "Mode" -msgid "Advanced" -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:2262 +#: src/slic3r/GUI/GUI_App.cpp:2424 msgid "Advanced View Mode" msgstr "高級介面模式" -#: src/slic3r/GUI/GUI_App.cpp:2263 src/slic3r/GUI/wxExtensions.cpp:711 -msgid "Expert" -msgstr "專家" - -#: src/slic3r/GUI/GUI_App.cpp:2263 +#: src/slic3r/GUI/GUI_App.cpp:2425 msgid "Expert View Mode" msgstr "專家介面模式" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 msgid "Mode" msgstr "模式" -#: src/slic3r/GUI/GUI_App.cpp:2268 +#: src/slic3r/GUI/GUI_App.cpp:2430 #, c-format, boost-format msgid "%s View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2271 +#: src/slic3r/GUI/GUI_App.cpp:2433 msgid "&Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Flash Printer &Firmware" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2274 +#: src/slic3r/GUI/GUI_App.cpp:2436 msgid "Upload a firmware image into an Arduino based printer" msgstr "將韌體鏡像檔上傳到基於 arduino 的印表機" -#: src/slic3r/GUI/GUI_App.cpp:2294 +#: src/slic3r/GUI/GUI_App.cpp:2459 msgid "Taking a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2295 +#: src/slic3r/GUI/GUI_App.cpp:2460 msgid "" "Some presets are modified and the unsaved changes will not be captured by " "the configuration snapshot." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2296 +#: src/slic3r/GUI/GUI_App.cpp:2461 msgid "Snapshot name" msgstr "快照名稱" -#: src/slic3r/GUI/GUI_App.cpp:2312 +#: src/slic3r/GUI/GUI_App.cpp:2477 msgid "Loading a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2321 +#: src/slic3r/GUI/GUI_App.cpp:2486 #, boost-format msgid "Continue to activate a configuration snapshot %1%?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2335 +#: src/slic3r/GUI/GUI_App.cpp:2500 msgid "Failed to activate configuration snapshot." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2354 -msgid "Restart application" -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:2388 +#: src/slic3r/GUI/GUI_App.cpp:2520 msgid "Language selection" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2391 +#: src/slic3r/GUI/GUI_App.cpp:2523 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2393 src/slic3r/GUI/Preferences.cpp:582 +#: src/slic3r/GUI/GUI_App.cpp:2525 src/slic3r/GUI/Preferences.cpp:730 +#: src/slic3r/GUI/Selection.cpp:1695 msgid "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2420 +#: src/slic3r/GUI/GUI_App.cpp:2552 msgid "&Configuration" msgstr "&配置" -#: src/slic3r/GUI/GUI_App.cpp:2534 src/slic3r/GUI/GUI_App.cpp:2595 -msgid "The preset modifications are successfully saved" -msgid_plural "The presets modifications are successfully saved" -msgstr[0] "" +#: src/slic3r/GUI/GUI_App.cpp:2560 +msgid "Restart application" +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2598 +#: src/slic3r/GUI/GUI_App.cpp:2726 msgid "For new project all modifications will be reseted" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2636 +#: src/slic3r/GUI/GUI_App.cpp:2764 msgid "Loading a new project while the current project is modified." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Project is loading" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2639 +#: src/slic3r/GUI/GUI_App.cpp:2767 msgid "Opening new project while some presets are unsaved." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "The uploads are still ongoing" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2658 +#: src/slic3r/GUI/GUI_App.cpp:2786 msgid "Stop them and continue anyway?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2662 +#: src/slic3r/GUI/GUI_App.cpp:2790 msgid "Ongoing uploads" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2876 -msgid "It's impossible to print multi-part object(s) with SLA technology." -msgstr "無法使用 SLA 技術列印多部分對象。" +#: src/slic3r/GUI/GUI_App.cpp:3026 +msgid "" +"It's impossible to print object(s) which contains parameter modifiers with " +"SLA technology." +msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2877 src/slic3r/GUI/Jobs/SLAImportJob.cpp:235 -#: src/slic3r/GUI/Plater.cpp:2459 +#: src/slic3r/GUI/GUI_App.cpp:3027 src/slic3r/GUI/Jobs/SLAImportJob.cpp:149 +#: src/slic3r/GUI/Plater.cpp:2536 msgid "Please check your object list before preset changing." msgstr "在預設更改之前, 請檢查對象列表。" -#: src/slic3r/GUI/GUI_App.cpp:2901 +#: src/slic3r/GUI/GUI_App.cpp:3070 msgid "Configuration is editing from ConfigWizard" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2926 +#: src/slic3r/GUI/GUI_App.cpp:3088 +#, boost-format +msgid "Welcome to %1% version %2%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3090 +#, boost-format +msgid "" +"Do you wish to register downloads from Printables.com\n" +"for this %1% %2% executable?\n" +"\n" +"Downloads can be registered for only 1 executable at time." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3118 msgid "Select a gcode file:" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "Open hyperlink in default browser?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3100 src/slic3r/GUI/GUI_App.cpp:3123 +#: src/slic3r/GUI/GUI_App.cpp:3301 src/slic3r/GUI/GUI_App.cpp:3324 msgid "PrusaSlicer: Open hyperlink" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3105 src/slic3r/GUI/Preferences.cpp:382 +#: src/slic3r/GUI/GUI_App.cpp:3306 src/slic3r/GUI/Preferences.cpp:593 msgid "Suppress to open hyperlink in browser" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3107 src/slic3r/GUI/Plater.cpp:1732 +#: src/slic3r/GUI/GUI_App.cpp:3308 src/slic3r/GUI/Plater.cpp:1742 msgid "PrusaSlicer will remember your choice." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3108 +#: src/slic3r/GUI/GUI_App.cpp:3309 msgid "You will not be asked about it again on hyperlinks hovering." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3109 src/slic3r/GUI/Plater.cpp:1736 +#: src/slic3r/GUI/GUI_App.cpp:3310 src/slic3r/GUI/Plater.cpp:1746 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" "to changes your choice." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:3111 src/slic3r/GUI/Plater.cpp:1738 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:906 +#: src/slic3r/GUI/GUI_App.cpp:3312 src/slic3r/GUI/Plater.cpp:1748 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:934 msgid "PrusaSlicer: Don't ask me again" msgstr "" -#: src/slic3r/GUI/GUI_Init.cpp:57 src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_App.cpp:3386 +msgid "Check for application update has failed." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3387 +#, boost-format +msgid "No new version is available. Latest release version is %1%." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:3458 +msgid "Download of new version is already ongoing. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/GUI_Init.cpp:64 src/slic3r/GUI/GUI_Init.cpp:67 msgid "PrusaSlicer GUI initialization failed" msgstr "" -#: src/slic3r/GUI/GUI_Init.cpp:60 +#: src/slic3r/GUI/GUI_Init.cpp:67 #, boost-format msgid "Fatal error, exception catched: %1%" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:54 src/slic3r/GUI/GUI_Factories.cpp:127 -#: src/libslic3r/PrintConfig.cpp:287 src/libslic3r/PrintConfig.cpp:404 -#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:456 -#: src/libslic3r/PrintConfig.cpp:708 src/libslic3r/PrintConfig.cpp:778 -#: src/libslic3r/PrintConfig.cpp:786 src/libslic3r/PrintConfig.cpp:1232 -#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1563 -#: src/libslic3r/PrintConfig.cpp:1955 src/libslic3r/PrintConfig.cpp:2030 -#: src/libslic3r/PrintConfig.cpp:2264 src/libslic3r/PrintConfig.cpp:2850 -#: src/libslic3r/PrintConfig.cpp:2858 src/libslic3r/PrintConfig.cpp:2918 -#: src/libslic3r/PrintConfig.cpp:2927 src/libslic3r/PrintConfig.cpp:3098 +#: src/libslic3r/PrintConfig.cpp:300 src/libslic3r/PrintConfig.cpp:423 +#: src/libslic3r/PrintConfig.cpp:466 src/libslic3r/PrintConfig.cpp:475 +#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:872 +#: src/libslic3r/PrintConfig.cpp:881 src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1376 src/libslic3r/PrintConfig.cpp:1604 +#: src/libslic3r/PrintConfig.cpp:1985 src/libslic3r/PrintConfig.cpp:2060 +#: src/libslic3r/PrintConfig.cpp:2294 src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:2946 src/libslic3r/PrintConfig.cpp:3006 +#: src/libslic3r/PrintConfig.cpp:3015 src/libslic3r/PrintConfig.cpp:3186 msgid "Layers and Perimeters" msgstr "層和輪廓" #: src/slic3r/GUI/GUI_Factories.cpp:56 src/slic3r/GUI/GUI_Factories.cpp:131 -#: src/slic3r/GUI/GUI_Preview.cpp:249 src/slic3r/GUI/Tab.cpp:1547 -#: src/slic3r/GUI/Tab.cpp:1549 src/libslic3r/ExtrusionEntity.cpp:340 -#: src/libslic3r/ExtrusionEntity.cpp:372 src/libslic3r/PrintConfig.cpp:670 -#: src/libslic3r/PrintConfig.cpp:2095 src/libslic3r/PrintConfig.cpp:2104 -#: src/libslic3r/PrintConfig.cpp:2113 src/libslic3r/PrintConfig.cpp:2123 -#: src/libslic3r/PrintConfig.cpp:2132 src/libslic3r/PrintConfig.cpp:2554 -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2568 -#: src/libslic3r/PrintConfig.cpp:2581 src/libslic3r/PrintConfig.cpp:2591 -#: src/libslic3r/PrintConfig.cpp:2599 src/libslic3r/PrintConfig.cpp:2617 -#: src/libslic3r/PrintConfig.cpp:2634 src/libslic3r/PrintConfig.cpp:2655 -#: src/libslic3r/PrintConfig.cpp:2668 src/libslic3r/PrintConfig.cpp:2685 -#: src/libslic3r/PrintConfig.cpp:2703 src/libslic3r/PrintConfig.cpp:2718 -#: src/libslic3r/PrintConfig.cpp:2728 src/libslic3r/PrintConfig.cpp:2737 -#: src/libslic3r/PrintConfig.cpp:2748 src/libslic3r/PrintConfig.cpp:2762 -#: src/libslic3r/PrintConfig.cpp:2778 src/libslic3r/PrintConfig.cpp:2786 -#: src/libslic3r/PrintConfig.cpp:2787 src/libslic3r/PrintConfig.cpp:2796 -#: src/libslic3r/PrintConfig.cpp:2810 src/libslic3r/PrintConfig.cpp:2818 -#: src/libslic3r/PrintConfig.cpp:2832 +#: src/slic3r/GUI/Tab.cpp:1494 src/slic3r/GUI/Tab.cpp:1496 +#: src/libslic3r/PrintConfig.cpp:773 src/libslic3r/PrintConfig.cpp:2125 +#: src/libslic3r/PrintConfig.cpp:2134 src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2153 src/libslic3r/PrintConfig.cpp:2162 +#: src/libslic3r/PrintConfig.cpp:2584 src/libslic3r/PrintConfig.cpp:2590 +#: src/libslic3r/PrintConfig.cpp:2598 src/libslic3r/PrintConfig.cpp:2611 +#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2628 +#: src/libslic3r/PrintConfig.cpp:2644 src/libslic3r/PrintConfig.cpp:2660 +#: src/libslic3r/PrintConfig.cpp:2681 src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2725 +#: src/libslic3r/PrintConfig.cpp:2743 src/libslic3r/PrintConfig.cpp:2753 +#: src/libslic3r/PrintConfig.cpp:2762 src/libslic3r/PrintConfig.cpp:2773 +#: src/libslic3r/PrintConfig.cpp:2785 src/libslic3r/PrintConfig.cpp:2799 +#: src/libslic3r/PrintConfig.cpp:2807 src/libslic3r/PrintConfig.cpp:2808 +#: src/libslic3r/PrintConfig.cpp:2817 src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2840 src/libslic3r/PrintConfig.cpp:2854 +#: src/libslic3r/PrintConfig.cpp:2862 src/libslic3r/PrintConfig.cpp:2873 +#: src/libslic3r/PrintConfig.cpp:2884 src/libslic3r/PrintConfig.cpp:2893 +#: src/libslic3r/PrintConfig.cpp:2903 src/libslic3r/PrintConfig.cpp:2915 msgid "Support material" msgstr "支撐材料" #: src/slic3r/GUI/GUI_Factories.cpp:59 src/slic3r/GUI/GUI_Factories.cpp:135 -#: src/libslic3r/PrintConfig.cpp:3054 src/libslic3r/PrintConfig.cpp:3062 +#: src/libslic3r/PrintConfig.cpp:3142 src/libslic3r/PrintConfig.cpp:3150 msgid "Wipe options" msgstr "" @@ -3616,330 +4858,351 @@ msgstr "" msgid "Pad and Support" msgstr "墊和支撐" -#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/GUI_Preview.cpp:245 -#: src/slic3r/GUI/Tab.cpp:1513 src/libslic3r/ExtrusionEntity.cpp:336 -#: src/libslic3r/ExtrusionEntity.cpp:364 src/libslic3r/PrintConfig.cpp:1579 -#: src/libslic3r/PrintConfig.cpp:1585 src/libslic3r/PrintConfig.cpp:1599 -#: src/libslic3r/PrintConfig.cpp:1609 src/libslic3r/PrintConfig.cpp:1617 -#: src/libslic3r/PrintConfig.cpp:1619 +#: src/slic3r/GUI/GUI_Factories.cpp:129 src/slic3r/GUI/Tab.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1620 src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1638 src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1656 src/libslic3r/PrintConfig.cpp:1658 msgid "Ironing" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1283 -#: src/libslic3r/PrintConfig.cpp:1284 src/libslic3r/PrintConfig.cpp:1299 -#: src/libslic3r/PrintConfig.cpp:1309 +#: src/slic3r/GUI/GUI_Factories.cpp:130 src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1344 src/libslic3r/PrintConfig.cpp:1356 +#: src/libslic3r/PrintConfig.cpp:1366 msgid "Fuzzy Skin" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/GUI_Preview.cpp:220 -#: src/slic3r/GUI/Tab.cpp:1581 src/libslic3r/PrintConfig.cpp:507 -#: src/libslic3r/PrintConfig.cpp:766 src/libslic3r/PrintConfig.cpp:1326 -#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1618 -#: src/libslic3r/PrintConfig.cpp:2020 src/libslic3r/PrintConfig.cpp:2352 -#: src/libslic3r/PrintConfig.cpp:2405 src/libslic3r/PrintConfig.cpp:2903 +#: src/slic3r/GUI/GUI_Factories.cpp:132 src/slic3r/GUI/Tab.cpp:1536 +#: src/libslic3r/PrintConfig.cpp:526 src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:548 src/libslic3r/PrintConfig.cpp:557 +#: src/libslic3r/PrintConfig.cpp:566 src/libslic3r/PrintConfig.cpp:575 +#: src/libslic3r/PrintConfig.cpp:852 src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1657 +#: src/libslic3r/PrintConfig.cpp:2050 src/libslic3r/PrintConfig.cpp:2383 +#: src/libslic3r/PrintConfig.cpp:2436 src/libslic3r/PrintConfig.cpp:2991 msgid "Speed" msgstr "速度" -#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1623 -#: src/slic3r/GUI/Tab.cpp:2304 src/libslic3r/PrintConfig.cpp:796 -#: src/libslic3r/PrintConfig.cpp:1489 src/libslic3r/PrintConfig.cpp:1997 -#: src/libslic3r/PrintConfig.cpp:2373 src/libslic3r/PrintConfig.cpp:2647 -#: src/libslic3r/PrintConfig.cpp:2675 +#: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1585 +#: src/slic3r/GUI/Tab.cpp:2288 src/libslic3r/PrintConfig.cpp:889 +#: src/libslic3r/PrintConfig.cpp:1530 src/libslic3r/PrintConfig.cpp:2027 +#: src/libslic3r/PrintConfig.cpp:2404 src/libslic3r/PrintConfig.cpp:2673 +#: src/libslic3r/PrintConfig.cpp:2701 msgid "Extruders" msgstr "擠出頭" -#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:754 -#: src/libslic3r/PrintConfig.cpp:864 src/libslic3r/PrintConfig.cpp:1218 -#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:2006 -#: src/libslic3r/PrintConfig.cpp:2393 src/libslic3r/PrintConfig.cpp:2656 -#: src/libslic3r/PrintConfig.cpp:2890 +#: src/slic3r/GUI/GUI_Factories.cpp:134 src/libslic3r/PrintConfig.cpp:840 +#: src/libslic3r/PrintConfig.cpp:953 src/libslic3r/PrintConfig.cpp:1278 +#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:2036 +#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2682 +#: src/libslic3r/PrintConfig.cpp:2978 msgid "Extrusion Width" msgstr "擠出寬度" -#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1533 -#: src/libslic3r/PrintConfig.cpp:517 src/libslic3r/PrintConfig.cpp:528 -#: src/libslic3r/PrintConfig.cpp:544 +#: src/slic3r/GUI/GUI_Factories.cpp:136 src/slic3r/GUI/Tab.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:631 src/libslic3r/PrintConfig.cpp:642 +#: src/libslic3r/PrintConfig.cpp:655 msgid "Skirt and brim" msgstr "環邊和裙邊" -#: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 -#: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1645 -#: src/slic3r/GUI/Tab.cpp:1649 src/slic3r/GUI/Tab.cpp:2031 -#: src/slic3r/GUI/Tab.cpp:2402 src/slic3r/GUI/Tab.cpp:4729 -#: src/libslic3r/PrintConfig.cpp:260 src/libslic3r/PrintConfig.cpp:495 -#: src/libslic3r/PrintConfig.cpp:1438 src/libslic3r/PrintConfig.cpp:1525 -#: src/libslic3r/PrintConfig.cpp:1572 src/libslic3r/PrintConfig.cpp:2530 -#: src/libslic3r/PrintConfig.cpp:2540 src/libslic3r/PrintConfig.cpp:3078 -#: src/libslic3r/PrintConfig.cpp:3113 src/libslic3r/PrintConfig.cpp:3124 -#: src/libslic3r/PrintConfig.cpp:3139 src/libslic3r/PrintConfig.cpp:3152 -#: src/libslic3r/PrintConfig.cpp:3161 src/libslic3r/PrintConfig.cpp:3173 -#: src/libslic3r/PrintConfig.cpp:3370 -msgid "Advanced" -msgstr "進階" - -#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4663 src/slic3r/GUI/Tab.cpp:4664 -#: src/libslic3r/PrintConfig.cpp:3564 src/libslic3r/PrintConfig.cpp:3571 -#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3589 -#: src/libslic3r/PrintConfig.cpp:3599 src/libslic3r/PrintConfig.cpp:3609 -#: src/libslic3r/PrintConfig.cpp:3646 src/libslic3r/PrintConfig.cpp:3653 -#: src/libslic3r/PrintConfig.cpp:3664 src/libslic3r/PrintConfig.cpp:3674 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3696 -#: src/libslic3r/PrintConfig.cpp:3706 src/libslic3r/PrintConfig.cpp:3715 -#: src/libslic3r/PrintConfig.cpp:3725 src/libslic3r/PrintConfig.cpp:3736 -#: src/libslic3r/PrintConfig.cpp:3744 +#: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Tab.cpp:4946 src/slic3r/GUI/Tab.cpp:4948 +#: src/libslic3r/PrintConfig.cpp:3328 src/libslic3r/PrintConfig.cpp:3337 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3356 +#: src/libslic3r/PrintConfig.cpp:3366 src/libslic3r/PrintConfig.cpp:3387 +#: src/libslic3r/PrintConfig.cpp:3410 src/libslic3r/PrintConfig.cpp:3417 +#: src/libslic3r/PrintConfig.cpp:3432 src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3464 +#: src/libslic3r/PrintConfig.cpp:3474 src/libslic3r/PrintConfig.cpp:3488 +#: src/libslic3r/PrintConfig.cpp:3498 src/libslic3r/PrintConfig.cpp:3841 +#: src/libslic3r/PrintConfig.cpp:3861 src/libslic3r/PrintConfig.cpp:3868 +#: src/libslic3r/PrintConfig.cpp:3876 msgid "Supports" msgstr "支撐" -#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4704 src/slic3r/GUI/Tab.cpp:4705 -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3752 -#: src/libslic3r/PrintConfig.cpp:3759 src/libslic3r/PrintConfig.cpp:3773 -#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3794 -#: src/libslic3r/PrintConfig.cpp:3816 src/libslic3r/PrintConfig.cpp:3827 -#: src/libslic3r/PrintConfig.cpp:3834 src/libslic3r/PrintConfig.cpp:3841 -#: src/libslic3r/PrintConfig.cpp:3852 src/libslic3r/PrintConfig.cpp:3861 -#: src/libslic3r/PrintConfig.cpp:3870 +#: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:590 +#: src/slic3r/GUI/Tab.cpp:4960 src/slic3r/GUI/Tab.cpp:4961 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3884 +#: src/libslic3r/PrintConfig.cpp:3891 src/libslic3r/PrintConfig.cpp:3905 +#: src/libslic3r/PrintConfig.cpp:3916 src/libslic3r/PrintConfig.cpp:3926 +#: src/libslic3r/PrintConfig.cpp:3948 src/libslic3r/PrintConfig.cpp:3959 +#: src/libslic3r/PrintConfig.cpp:3966 src/libslic3r/PrintConfig.cpp:3973 +#: src/libslic3r/PrintConfig.cpp:3984 src/libslic3r/PrintConfig.cpp:3993 +#: src/libslic3r/PrintConfig.cpp:4002 msgid "Pad" msgstr "墊" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4722 -#: src/slic3r/GUI/Tab.cpp:4723 src/libslic3r/SLA/Hollowing.cpp:73 -#: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3880 -#: src/libslic3r/PrintConfig.cpp:3887 src/libslic3r/PrintConfig.cpp:3897 -#: src/libslic3r/PrintConfig.cpp:3906 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4978 +#: src/slic3r/GUI/Tab.cpp:4979 src/libslic3r/SLA/Hollowing.cpp:86 +#: src/libslic3r/SLA/Hollowing.cpp:91 src/libslic3r/SLA/Hollowing.cpp:106 +#: src/libslic3r/SLA/Hollowing.cpp:115 src/libslic3r/PrintConfig.cpp:4012 +#: src/libslic3r/PrintConfig.cpp:4019 src/libslic3r/PrintConfig.cpp:4029 +#: src/libslic3r/PrintConfig.cpp:4038 msgid "Hollowing" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:160 +#: src/slic3r/GUI/GUI_Factories.cpp:159 msgid "Add part" msgstr "添加部件" -#: src/slic3r/GUI/GUI_Factories.cpp:161 +#: src/slic3r/GUI/GUI_Factories.cpp:160 msgid "Add negative volume" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:162 +#: src/slic3r/GUI/GUI_Factories.cpp:161 msgid "Add modifier" msgstr "添加修飾器" -#: src/slic3r/GUI/GUI_Factories.cpp:163 +#: src/slic3r/GUI/GUI_Factories.cpp:162 msgid "Add support blocker" msgstr "添加支撐屏蔽" -#: src/slic3r/GUI/GUI_Factories.cpp:164 +#: src/slic3r/GUI/GUI_Factories.cpp:163 msgid "Add support enforcer" msgstr "添加支撐執行者" -#: src/slic3r/GUI/GUI_Factories.cpp:300 +#: src/slic3r/GUI/GUI_Factories.cpp:169 +msgid "Add text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:170 +msgid "Add negative text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:171 +msgid "Add text modifier" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:307 msgid "Select showing settings" msgstr "選擇顯示的設置" -#: src/slic3r/GUI/GUI_Factories.cpp:407 src/slic3r/GUI/GUI_Factories.cpp:412 -#: src/slic3r/GUI/GUI_Factories.cpp:556 src/slic3r/GUI/GUI_Factories.cpp:562 +#: src/slic3r/GUI/GUI_Factories.cpp:414 src/slic3r/GUI/GUI_Factories.cpp:419 +#: src/slic3r/GUI/GUI_Factories.cpp:625 src/slic3r/GUI/GUI_Factories.cpp:631 #, c-format, boost-format msgid "Quick Add Settings (%s)" msgstr "快速添加設置 (%s)" -#: src/slic3r/GUI/GUI_Factories.cpp:444 +#: src/slic3r/GUI/GUI_Factories.cpp:460 msgid "Remove the selected object" msgstr "刪除選定的對象" -#: src/slic3r/GUI/GUI_Factories.cpp:456 +#: src/slic3r/GUI/GUI_Factories.cpp:475 msgid "Load" msgstr "加載" -#: src/slic3r/GUI/GUI_Factories.cpp:461 src/slic3r/GUI/GUI_Factories.cpp:501 -#: src/slic3r/GUI/GUI_Factories.cpp:505 +#: src/slic3r/GUI/GUI_Factories.cpp:481 src/slic3r/GUI/GUI_Factories.cpp:566 +#: src/slic3r/GUI/GUI_Factories.cpp:570 msgid "Box" msgstr "盒子" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Cylinder" msgstr "圓柱體" -#: src/slic3r/GUI/GUI_Factories.cpp:461 +#: src/slic3r/GUI/GUI_Factories.cpp:481 msgid "Slab" msgstr "板坯" -#: src/slic3r/GUI/GUI_Factories.cpp:471 +#: src/slic3r/GUI/GUI_Factories.cpp:493 msgid "Gallery" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:488 src/slic3r/GUI/GUI_Factories.cpp:526 +#: src/slic3r/GUI/GUI_Factories.cpp:529 src/slic3r/GUI/GUI_Factories.cpp:549 +#: src/slic3r/GUI/GUI_ObjectList.cpp:660 +msgid "Text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:555 src/slic3r/GUI/GUI_Factories.cpp:558 +#: src/slic3r/GUI/GUI_Factories.cpp:595 msgid "Height range Modifier" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:535 +#: src/slic3r/GUI/GUI_Factories.cpp:604 msgid "Add settings" msgstr "添加設置" -#: src/slic3r/GUI/GUI_Factories.cpp:626 +#: src/slic3r/GUI/GUI_Factories.cpp:695 msgid "Change type" msgstr "更改類型" -#: src/slic3r/GUI/GUI_Factories.cpp:636 src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:705 src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Object" msgstr "設置爲分隔的對象" -#: src/slic3r/GUI/GUI_Factories.cpp:648 +#: src/slic3r/GUI/GUI_Factories.cpp:717 msgid "Set as a Separated Objects" msgstr "設置爲分隔的對象" -#: src/slic3r/GUI/GUI_Factories.cpp:658 +#: src/slic3r/GUI/GUI_Factories.cpp:727 msgid "Printable" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:686 +#: src/slic3r/GUI/GUI_Factories.cpp:755 src/slic3r/GUI/GUI_ObjectList.cpp:2070 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2582 +msgid "Invalidate cut info" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:770 msgid "Rename" msgstr "重命名" -#: src/slic3r/GUI/GUI_Factories.cpp:696 +#: src/slic3r/GUI/GUI_Factories.cpp:780 msgid "Fix through the Netfabb" msgstr "通過 Netfabb 修復" -#: src/slic3r/GUI/GUI_Factories.cpp:715 -msgid "Export as STL" -msgstr "導出爲 STL" +#: src/slic3r/GUI/GUI_Factories.cpp:799 +msgid "Export as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:726 +#: src/slic3r/GUI/GUI_Factories.cpp:810 msgid "Reload the selected volumes from disk" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:733 src/slic3r/GUI/Plater.cpp:3568 +#: src/slic3r/GUI/GUI_Factories.cpp:817 src/slic3r/GUI/Plater.cpp:3602 msgid "Replace with STL" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:733 +#: src/slic3r/GUI/GUI_Factories.cpp:817 msgid "Replace the selected volume with new STL" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:740 +#: src/slic3r/GUI/GUI_Factories.cpp:824 msgid "Set extruder for selected items" msgstr "爲所選項目設置擠出機" -#: src/slic3r/GUI/GUI_Factories.cpp:778 src/slic3r/Utils/Repetier.cpp:126 -#: src/slic3r/Utils/Repetier.cpp:209 src/libslic3r/PrintConfig.cpp:635 -#: src/libslic3r/PrintConfig.cpp:2770 +#: src/slic3r/GUI/GUI_Factories.cpp:862 src/slic3r/Utils/Repetier.cpp:145 +#: src/slic3r/Utils/Repetier.cpp:226 src/libslic3r/PrintConfig.cpp:738 +#: src/libslic3r/PrintConfig.cpp:2790 src/libslic3r/PrintConfig.cpp:3851 msgid "Default" msgstr "默認" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale to print volume" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:795 +#: src/slic3r/GUI/GUI_Factories.cpp:879 msgid "Scale the selected object to fit the print volume" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:835 src/slic3r/GUI/Plater.cpp:5655 +#: src/slic3r/GUI/GUI_Factories.cpp:921 src/slic3r/GUI/Plater.cpp:6213 msgid "Convert from imperial units" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:836 src/slic3r/GUI/Plater.cpp:5656 +#: src/slic3r/GUI/GUI_Factories.cpp:922 src/slic3r/GUI/Plater.cpp:6214 msgid "Revert conversion from imperial units" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:837 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:923 src/slic3r/GUI/Plater.cpp:6215 msgid "Convert from meters" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:838 src/slic3r/GUI/Plater.cpp:5657 +#: src/slic3r/GUI/GUI_Factories.cpp:924 src/slic3r/GUI/Plater.cpp:6215 msgid "Revert conversion from meters" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2135 -#: src/libslic3r/PrintConfig.cpp:4523 +#: src/slic3r/GUI/GUI_Factories.cpp:945 src/slic3r/GUI/GUI_ObjectList.cpp:2290 +#: src/libslic3r/PrintConfig.cpp:4689 msgid "Merge" msgstr "合併" -#: src/slic3r/GUI/GUI_Factories.cpp:859 +#: src/slic3r/GUI/GUI_Factories.cpp:945 msgid "Merge objects to the one multipart object" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Along X axis" msgstr "沿 X 軸" -#: src/slic3r/GUI/GUI_Factories.cpp:878 +#: src/slic3r/GUI/GUI_Factories.cpp:964 msgid "Mirror the selected object along the X axis" msgstr "沿 X 軸鏡像所選對象" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Along Y axis" msgstr "沿 Y 軸" -#: src/slic3r/GUI/GUI_Factories.cpp:880 +#: src/slic3r/GUI/GUI_Factories.cpp:966 msgid "Mirror the selected object along the Y axis" msgstr "沿 Y 軸鏡像所選對象" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Along Z axis" msgstr "沿 Z 軸" -#: src/slic3r/GUI/GUI_Factories.cpp:882 +#: src/slic3r/GUI/GUI_Factories.cpp:968 msgid "Mirror the selected object along the Z axis" msgstr "沿 Z 軸鏡像所選對象" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror" msgstr "鏡像" -#: src/slic3r/GUI/GUI_Factories.cpp:885 +#: src/slic3r/GUI/GUI_Factories.cpp:971 msgid "Mirror the selected object" msgstr "鏡像所選對象" -#: src/slic3r/GUI/GUI_Factories.cpp:901 src/slic3r/GUI/GUI_ObjectList.cpp:1696 +#: src/slic3r/GUI/GUI_Factories.cpp:977 +msgid "Edit text" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:999 +msgid "Ability to change text, font, size, ..." +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1021 src/slic3r/GUI/GUI_ObjectList.cpp:1793 msgid "Add Shape" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:937 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "To objects" msgstr "拆分到對象" -#: src/slic3r/GUI/GUI_Factories.cpp:937 src/slic3r/GUI/GUI_Factories.cpp:954 +#: src/slic3r/GUI/GUI_Factories.cpp:1059 msgid "Split the selected object into individual objects" msgstr "將所選對象拆分爲單個對象" -#: src/slic3r/GUI/GUI_Factories.cpp:940 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 msgid "To parts" msgstr "到零件" -#: src/slic3r/GUI/GUI_Factories.cpp:940 src/slic3r/GUI/GUI_Factories.cpp:975 +#: src/slic3r/GUI/GUI_Factories.cpp:1062 src/slic3r/GUI/GUI_Factories.cpp:1097 msgid "Split the selected object into individual parts" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4552 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 src/slic3r/GUI/GUI_Factories.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:4718 msgid "Split" msgstr "拆分" -#: src/slic3r/GUI/GUI_Factories.cpp:944 +#: src/slic3r/GUI/GUI_Factories.cpp:1066 msgid "Split the selected object" msgstr "拆分所選對象" -#: src/slic3r/GUI/GUI_Factories.cpp:1084 -msgid "Add one more instance of the selected object" +#: src/slic3r/GUI/GUI_Factories.cpp:1225 src/slic3r/GUI/GUI_Factories.cpp:1243 +msgid "Set number of instances" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:1087 -msgid "Remove one instance of the selected object" +#: src/slic3r/GUI/GUI_Factories.cpp:1225 +msgid "Change the number of instances of the selected objects" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:1090 -msgid "Set number of instances" +#: src/slic3r/GUI/GUI_Factories.cpp:1237 +msgid "Add one more instance of the selected object" +msgstr "" + +#: src/slic3r/GUI/GUI_Factories.cpp:1240 +msgid "Remove one instance of the selected object" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:1090 +#: src/slic3r/GUI/GUI_Factories.cpp:1243 msgid "Change the number of instances of the selected object" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill bed with instances" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:1094 +#: src/slic3r/GUI/GUI_Factories.cpp:1247 msgid "Fill the remaining area of bed with instances of the selected object" msgstr "" @@ -3959,297 +5222,345 @@ msgstr "" msgid "Add layer range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:297 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:323 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 msgid "Name" msgstr "名稱" -#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:480 +#: src/slic3r/GUI/GUI_ObjectList.cpp:342 src/slic3r/GUI/GUI_ObjectList.cpp:513 msgid "Editing" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:400 +#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +msgid "Wrong volume index " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:433 msgid "No errors detected" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:409 +#: src/slic3r/GUI/GUI_ObjectList.cpp:442 #, c-format, boost-format msgid "Auto-repaired %1$d error" msgid_plural "Auto-repaired %1$d errors" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:415 +#: src/slic3r/GUI/GUI_ObjectList.cpp:448 #, c-format, boost-format msgid "%1$d degenerate facet" msgid_plural "%1$d degenerate facets" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:450 #, c-format, boost-format msgid "%1$d edge fixed" msgid_plural "%1$d edges fixed" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:452 #, c-format, boost-format msgid "%1$d facet removed" msgid_plural "%1$d facets removed" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:421 +#: src/slic3r/GUI/GUI_ObjectList.cpp:454 #, c-format, boost-format msgid "%1$d facet reversed" msgid_plural "%1$d facets reversed" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:423 +#: src/slic3r/GUI/GUI_ObjectList.cpp:456 #, c-format, boost-format msgid "%1$d backward edge" msgid_plural "%1$d backward edges" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:426 src/slic3r/GUI/GUI_ObjectList.cpp:429 +#: src/slic3r/GUI/GUI_ObjectList.cpp:459 src/slic3r/GUI/GUI_ObjectList.cpp:462 #, c-format, boost-format msgid "%1$d open edge" msgid_plural "%1$d open edges" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:428 +#: src/slic3r/GUI/GUI_ObjectList.cpp:461 msgid "Remaining errors" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:436 +#: src/slic3r/GUI/GUI_ObjectList.cpp:469 msgid "Right button click the icon to fix STL through Netfabb" msgstr "右按鈕單擊圖標, 通過 Netfabb 修復 STL" -#: src/slic3r/GUI/GUI_ObjectList.cpp:482 +#: src/slic3r/GUI/GUI_ObjectList.cpp:515 msgid "Right button click the icon to change the object settings" msgstr "右鍵單擊圖標以更改對象設置" -#: src/slic3r/GUI/GUI_ObjectList.cpp:484 +#: src/slic3r/GUI/GUI_ObjectList.cpp:517 msgid "Click the icon to change the object settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:488 +#: src/slic3r/GUI/GUI_ObjectList.cpp:521 msgid "Right button click the icon to change the object printable property" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:523 msgid "Click the icon to change the object printable property" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:616 +#: src/slic3r/GUI/GUI_ObjectList.cpp:649 msgid "Change Extruder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:669 msgid "Rename Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1242 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4006 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1307 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4589 msgid "Instances to Separated Objects" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Volumes in Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1248 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1298 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1363 msgid "Add Settings for Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1299 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1364 msgid "Add Settings for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1300 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1365 msgid "Add Settings for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1339 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1404 msgid "Add Settings Bundle for Height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1340 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1405 msgid "Add Settings Bundle for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1341 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1406 msgid "Add Settings Bundle for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1486 msgid "Load Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1509 src/slic3r/GUI/Plater.cpp:2380 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1582 src/slic3r/GUI/Plater.cpp:2453 msgid "Loading" msgstr "載入中" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1540 src/slic3r/GUI/Plater.cpp:2417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1617 src/slic3r/GUI/Plater.cpp:2494 msgid "Loading file" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1548 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1625 msgid "Error!" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1638 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1721 msgid "Add Generic Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1663 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1761 msgid "Generic" msgstr "通用" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shape from Gallery" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1727 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Add Shapes from Gallery" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1830 -msgid "Remove paint-on supports" +#: src/slic3r/GUI/GUI_ObjectList.cpp:1945 +msgid "Remove paint-on supports" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 +msgid "Remove paint-on seam" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1966 +msgid "Remove Multi Material painting" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1972 +msgid "Shift objects to bed" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1978 +msgid "Remove variable layer height" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1999 +msgid "Delete Settings" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2023 +msgid "Delete All Instances from Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1837 -msgid "Remove paint-on seam" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2039 +msgid "Delete Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1844 -msgid "Remove Multi Material painting" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2057 +msgid "Delete connector from object which is a part of cut" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1850 -msgid "Shift objects to bed" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2058 +msgid "Delete solid part from object which is a part of cut" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1856 -msgid "Remove variable layer height" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2059 +msgid "Delete negative volume from object which is a part of cut" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1877 -msgid "Delete Settings" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2061 +msgid "" +"To save cut information you can delete all connectors from all related " +"objects." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1901 -msgid "Delete All Instances from Object" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2064 +msgid "" +"This action will break a cut information.\n" +"After that PrusaSlicer can't guarantee model consistency.\n" +"\n" +"To manipulate with solid parts or negative volumes you have to invalidate " +"cut infornation first." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1917 -msgid "Delete Height Range" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2072 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2612 +msgid "Delete all connectors" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1949 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2103 msgid "From Object List You can't delete the last solid part from object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1953 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2112 msgid "Delete Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1976 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2138 msgid "Last instance of an object cannot be deleted." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1980 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +msgid "Instance cannot be deleted from cut object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2146 msgid "Delete Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2004 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2170 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "無法拆分所選對象, 因爲它只包含一個部分。" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2008 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2174 msgid "Split to Parts" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2177 src/slic3r/GUI/Plater.cpp:3133 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"splitting the object." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2297 msgid "Merged" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2237 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2392 msgid "Merge all parts to the one single object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2269 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2424 msgid "Add Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2438 -msgid "Group manipulation" -msgstr "操作組" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2695 +msgid "Cut Connectors information" +msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2453 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2705 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2768 msgid "Object manipulation" msgstr "操作對象" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2486 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2714 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1472 +msgid "Group manipulation" +msgstr "操作組" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2802 msgid "Object Settings to modify" msgstr "要修改的對象設置" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2490 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2806 msgid "Part Settings to modify" msgstr "要修改的零件設置" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2495 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2811 msgid "Layer range Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2501 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2817 msgid "Part manipulation" msgstr "零件操作" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2825 msgid "Instance manipulation" msgstr "實例操作" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Height ranges" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Settings for height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2750 -msgid "Delete Selected Item" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2943 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3363 msgid "Delete Selected" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3019 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3047 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3067 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3441 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3469 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3489 msgid "Add Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3113 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3535 msgid "" "Cannot insert a new layer range after the current layer range.\n" "The next layer range is too thin to be split to two\n" "without violating the minimum layer height." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3117 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3539 msgid "" "Cannot insert a new layer range between the current and the next layer " "range.\n" @@ -4257,238 +5568,287 @@ msgid "" "is thinner than the minimum layer height allowed." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3122 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3544 msgid "" "Cannot insert a new layer range after the current layer range.\n" "Current layer range overlaps with the next layer range." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3603 msgid "Edit Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3500 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3989 msgid "Selection-Remove from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4001 msgid "Selection-Add from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3649 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4138 msgid "Object or Instance" msgstr "對象或實例" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Part" -msgstr "部件" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3650 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4139 msgid "Layer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3652 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4141 msgid "Unsupported selection" msgstr "不支持的選擇" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3653 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 #, c-format, boost-format msgid "You started your selection with %s Item." msgstr "您使用 %s 項開始選擇。" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3654 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4143 #, c-format, boost-format msgid "In this mode you can select only other %s Items%s" msgstr "在此模式下, 您只能選擇其他 %s 項目 %s" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3657 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4146 msgid "of a current Object" msgstr "當前對象的" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3662 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3737 src/slic3r/GUI/Plater.cpp:181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4151 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4226 src/slic3r/GUI/Plater.cpp:197 msgid "Info" msgstr "信息" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3784 -msgid "You can't change a type of the last solid part of the object." -msgstr "不能更改對象的最後一個實體部分的類型。" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4331 msgid "Negative Volume" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 -msgid "Modifier" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Blocker" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4343 msgid "Support Enforcer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3790 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4353 msgid "Select type of part" msgstr "選擇零件類型" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3795 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4359 msgid "Change Part Type" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Enter new name" msgstr "輸入新名稱" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4028 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4619 msgid "Renaming" msgstr "重命名" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4091 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4681 msgid "Repairing model" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4120 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4691 +msgid "" +"Custom supports, seams and multimaterial painting were removed after " +"repairing the mesh." +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4711 msgid "Fix through NetFabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4123 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4714 msgid "Fixing through NetFabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4153 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4744 msgid "The following model was repaired successfully" msgid_plural "The following models were repaired successfully" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4159 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4750 msgid "Folowing model repair failed" msgid_plural "Folowing models repair failed" msgstr[0] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4164 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4755 msgid "Repairing was canceled" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4276 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4869 msgid "Change Extruders" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Printable group" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4990 msgid "Set Unprintable group" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Printable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4992 msgid "Set Unprintable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Printable Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4993 msgid "Set Unprintable Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:55 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:84 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:61 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:96 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1132 msgid "World coordinates" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:56 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:85 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:97 msgid "Local coordinates" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:60 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:67 msgid "Select coordinate space, in which the transformation will be performed." msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:141 src/libslic3r/GCode.cpp:540 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:157 src/libslic3r/GCode.cpp:491 msgid "Object name" msgstr "對象名稱" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:201 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:521 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:221 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:710 msgid "Position" msgstr "位置" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:202 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:522 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:222 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:711 #: src/slic3r/GUI/Mouse3DController.cpp:478 #: src/slic3r/GUI/Mouse3DController.cpp:499 msgid "Rotation" msgstr "旋轉" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:250 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:239 +msgid "Size [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "Mirror along" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +#, c-format, boost-format +msgid " %c " +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:275 +msgid "axis" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:279 #, c-format, boost-format msgid "Toggle %c axis mirroring" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:284 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:329 msgid "Set Mirror" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:324 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:336 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:348 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:374 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:387 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:393 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:401 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:428 msgid "Drop to bed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:445 msgid "Reset rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 msgid "Reset Rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:398 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:400 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:490 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:519 msgid "Reset scale" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:414 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:539 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546 +msgid "Reset skew" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:553 msgid "Inches" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:523 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:712 msgid "Scale factors" msgstr "縮放比例因子" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:577 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:740 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:752 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:793 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:801 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +msgid "Rotate (relative)" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:751 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:800 +msgid "Translate (relative) [World]" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:829 msgid "Translate" msgstr "翻譯" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:640 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:905 msgid "" "You cannot use non-uniform scaling mode for multiple objects/parts selection" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:820 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +msgid "Left handed" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1133 +msgid "Object coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1134 +msgid "Part coordinates" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1176 msgid "Set Position" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:852 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1220 msgid "Set Orientation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:931 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1351 msgid "Set Scale" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:980 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1368 +msgid "Set Size" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1427 msgid "" "The currently manipulated object is tilted (rotation angles are not " "multiples of 90°).\n" @@ -4497,7 +5857,7 @@ msgid "" "once the rotation is embedded into the object coordinates." msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:983 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:1430 msgid "" "This operation is irreversible.\n" "Do you want to proceed?" @@ -4521,168 +5881,67 @@ msgstr "" msgid "Change Option %s" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:211 -msgid "View" -msgstr "查看" - -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/libslic3r/PrintConfig.cpp:808 -msgid "Height" -msgstr "高度" - -#: src/slic3r/GUI/GUI_Preview.cpp:219 src/libslic3r/PrintConfig.cpp:3032 -msgid "Width" -msgstr "寬度" - -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2016 -msgid "Fan speed" -msgstr "風扇速度" - -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1991 -msgid "Temperature" -msgstr "溫度" - -#: src/slic3r/GUI/GUI_Preview.cpp:223 -msgid "Volumetric flow rate" -msgstr "體積流量" - -#: src/slic3r/GUI/GUI_Preview.cpp:228 -msgid "Show" -msgstr "顯示" - -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/GUI_Preview.cpp:254 -msgid "Feature types" -msgstr "功能類型" - -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:330 -#: src/libslic3r/ExtrusionEntity.cpp:352 -msgid "Perimeter" -msgstr "周長" - -#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:331 -#: src/libslic3r/ExtrusionEntity.cpp:354 -msgid "External perimeter" -msgstr "外部輪廓" - -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:332 -#: src/libslic3r/ExtrusionEntity.cpp:356 -msgid "Overhang perimeter" -msgstr "懸空輪廓" - -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:333 -#: src/libslic3r/ExtrusionEntity.cpp:358 -msgid "Internal infill" -msgstr "內部填充" - -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:334 -#: src/libslic3r/ExtrusionEntity.cpp:360 src/libslic3r/PrintConfig.cpp:1407 -#: src/libslic3r/PrintConfig.cpp:2392 src/libslic3r/PrintConfig.cpp:2404 -msgid "Solid infill" -msgstr "實心填充" - -#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:335 -#: src/libslic3r/ExtrusionEntity.cpp:362 src/libslic3r/PrintConfig.cpp:1416 -#: src/libslic3r/PrintConfig.cpp:2889 src/libslic3r/PrintConfig.cpp:2902 -msgid "Top solid infill" -msgstr "頂部實心填充" - -#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:337 -#: src/libslic3r/ExtrusionEntity.cpp:366 -msgid "Bridge infill" -msgstr "搭橋填充" - -#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:338 -#: src/libslic3r/ExtrusionEntity.cpp:368 src/libslic3r/PrintConfig.cpp:1325 -msgid "Gap fill" -msgstr "間隙填充" - -#: src/slic3r/GUI/GUI_Preview.cpp:248 src/libslic3r/ExtrusionEntity.cpp:339 -#: src/libslic3r/ExtrusionEntity.cpp:370 -msgid "Skirt/Brim" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:250 src/libslic3r/ExtrusionEntity.cpp:341 -#: src/libslic3r/ExtrusionEntity.cpp:374 src/libslic3r/PrintConfig.cpp:2736 -msgid "Support material interface" -msgstr "支持材料端口" - -#: src/slic3r/GUI/GUI_Preview.cpp:251 src/slic3r/GUI/Tab.cpp:1634 -#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/ExtrusionEntity.cpp:376 -msgid "Wipe tower" -msgstr "擦料塔" - -#: src/slic3r/GUI/GUI_Preview.cpp:728 +#: src/slic3r/GUI/GUI_Preview.cpp:581 msgid "NOTE:" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:729 +#: src/slic3r/GUI/GUI_Preview.cpp:582 #, boost-format msgid "Sliced object \"%1%\" looks like a logo or a sign" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:730 +#: src/slic3r/GUI/GUI_Preview.cpp:583 msgid "Apply color change automatically" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:1058 -msgid "Shells" -msgstr "殼" - -#: src/slic3r/GUI/GUI_Preview.cpp:1059 -msgid "Tool marker" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:1060 -msgid "Legend/Estimated printing time" -msgstr "" - -#: src/slic3r/GUI/HintNotification.cpp:771 -#: src/slic3r/GUI/HintNotification.cpp:797 -#: src/slic3r/GUI/NotificationManager.cpp:374 -#: src/slic3r/GUI/NotificationManager.cpp:391 +#: src/slic3r/GUI/HintNotification.cpp:773 +#: src/slic3r/GUI/HintNotification.cpp:799 +#: src/slic3r/GUI/NotificationManager.cpp:457 +#: src/slic3r/GUI/NotificationManager.cpp:474 msgid "More" msgstr "" -#: src/slic3r/GUI/HintNotification.cpp:912 +#: src/slic3r/GUI/HintNotification.cpp:914 msgid "Open Preferences." msgstr "" -#: src/slic3r/GUI/HintNotification.cpp:1004 +#: src/slic3r/GUI/HintNotification.cpp:1006 msgid "Open Documentation in web browser." msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:527 +#: src/slic3r/GUI/ImGuiWrapper.cpp:666 msgid "Edit" msgstr "編輯" -#: src/slic3r/GUI/ImGuiWrapper.cpp:960 src/slic3r/GUI/Search.cpp:470 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1166 src/slic3r/GUI/Search.cpp:531 msgid "Use for search" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:961 src/slic3r/GUI/Search.cpp:463 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1167 src/slic3r/GUI/Search.cpp:524 msgid "Category" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:963 src/slic3r/GUI/Search.cpp:465 +#: src/slic3r/GUI/ImGuiWrapper.cpp:1169 src/slic3r/GUI/Search.cpp:526 msgid "Search in English" msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:174 -msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "無法排列模型對象!某些幾何形狀可能無效。" - -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:183 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:168 msgid "Arranging" msgstr "自動佈局" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:207 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:204 msgid "Arranging canceled." msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:208 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:205 msgid "Arranging done." msgstr "佈局完成." -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:253 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:225 +msgid "Could not arrange model objects! Some geometries may be invalid." +msgstr "無法排列模型對象!某些幾何形狀可能無效。" + +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:265 #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -4690,1377 +5949,1438 @@ msgid "" "%s" msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:119 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:108 msgid "Filling bed" msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:130 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:140 msgid "Bed filling canceled." msgstr "" -#: src/slic3r/GUI/Jobs/FillBedJob.cpp:131 +#: src/slic3r/GUI/Jobs/FillBedJob.cpp:141 msgid "Bed filling done." msgstr "" -#: src/slic3r/GUI/Jobs/Job.cpp:111 -msgid "ERROR: not enough resources to execute a new job." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:148 src/slic3r/GUI/Jobs/EmbossJob.cpp:596 +msgid "Can't create empty volume." msgstr "" -#: src/slic3r/GUI/Jobs/PlaterJob.cpp:13 -msgid "An unexpected error occured" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:201 +msgid "Can't create empty object." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:21 -msgid "Best surface quality" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:208 +msgid "Add Emboss text object" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:23 -msgid "Optimize object rotation for best surface quality." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:247 +msgid "Created text volume is empty. Change text or font." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 -msgid "Reduced overhang slopes" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:465 +msgid "" +"It is used default volume for embossed text, try to change text or font to " +"fix it." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:26 -msgid "" -"Optimize object rotation to have minimum amount of overhangs needing support " -"structures.\n" -"Note that this method will try to find the best surface of the object for " -"touching the print bed if no elevation is set." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:549 +#, boost-format +msgid "Text: %1%" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:30 -msgid "Lowest Z height" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:593 +msgid "Bad object to create volume." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:32 -msgid "Rotate the model to have the lowest z height for faster print time." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:598 +msgid "Add Emboss text Volume" msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:59 -msgid "Searching for optimal orientation" -msgstr "尋找最佳方向" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:698 +msgid "Font doesn't have any shape for given text." +msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:77 -msgid "Orientation search canceled." +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:738 +msgid "There is no volume in projection direction." msgstr "" -#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:78 -msgid "Orientation found." -msgstr "找到方向。" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:787 +msgid "There is no valid surface for text projection." +msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:36 -msgid "Choose SLA archive:" +#: src/slic3r/GUI/Jobs/EmbossJob.cpp:823 +msgid "Issue during embossing the text." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:40 -msgid "Import file" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:22 +msgid "Best surface quality" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47 -msgid "Import model and profile" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 +msgid "Optimize object rotation for best surface quality." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48 -msgid "Import profile only" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:25 +msgid "Reduced overhang slopes" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:49 -msgid "Import model only" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:27 +msgid "" +"Optimize object rotation to have minimum amount of overhangs needing support " +"structures.\n" +"Note that this method will try to find the best surface of the object for " +"touching the print bed if no elevation is set." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60 -msgid "Accurate" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:31 +msgid "Lowest Z height" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61 -msgid "Balanced" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:33 +msgid "Rotate the model to have the lowest z height for faster print time." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:62 -msgid "Quick" +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:53 +msgid "Searching for optimal orientation" +msgstr "尋找最佳方向" + +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:83 +msgid "Orientation search canceled." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:140 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:84 +msgid "Orientation found." +msgstr "找到方向。" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:49 msgid "Importing SLA archive" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:158 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:77 msgid "" "The SLA archive doesn't contain any presets. Please activate some SLA " "printer preset first before importing that SLA archive." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:164 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:81 +msgid "Import is unavailable for this archive format." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:86 msgid "Importing canceled." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:165 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:87 msgid "Importing done." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:187 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:108 msgid "The file does not exist." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:221 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135 msgid "" "The imported SLA archive did not contain any presets. The current SLA " "presets were used as fallback." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:234 src/slic3r/GUI/Plater.cpp:2458 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:148 src/slic3r/GUI/Plater.cpp:2535 msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:236 src/slic3r/GUI/Plater.cpp:2460 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:150 src/slic3r/GUI/Plater.cpp:2537 msgid "Attention!" msgstr "注意!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:166 +msgid "The profile in the imported archive is corrupt and will not be loaded." +msgstr "" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:178 +msgid "" +"No object could be retrieved from the archive. The slices might be corrupted " +"or missing." +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1184 msgid "Keyboard Shortcuts" msgstr "鍵盤快捷鍵" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:77 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:86 msgid "New project, clear plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:78 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 msgid "Open project AMF/3MF with config, clear plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 msgid "Save project (3mf)" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 msgid "Save project as (3mf)" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:81 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 msgid "(Re)slice" msgstr "重新切片" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:83 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:92 msgid "Import STL/3MF/STEP/OBJ/AMF without config, keep plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:84 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 msgid "Import Config from ini/amf/3mf/gcode" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:85 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6543 src/libslic3r/PrintConfig.cpp:4423 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:96 src/slic3r/GUI/Plater.cpp:948 +#: src/slic3r/GUI/Plater.cpp:7161 src/libslic3r/PrintConfig.cpp:4575 msgid "Export G-code" msgstr "導出 G-code" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:88 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:97 src/slic3r/GUI/Plater.cpp:7162 msgid "Send G-code" msgstr "發送 G 代碼" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:89 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 msgid "Export config" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:90 src/slic3r/GUI/Plater.cpp:896 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 src/slic3r/GUI/Plater.cpp:931 msgid "Export to SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:91 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 msgid "Eject SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:93 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 msgid "Select all objects" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 msgid "Deselect all" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:95 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 msgid "Delete selected" msgstr "刪除所選" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 -msgid "Copy to clipboard" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 msgid "Paste from clipboard" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Reload plater from disk" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 msgid "Select Plater Tab" msgstr "選擇 \"佈局器\" 選項卡" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 msgid "Select Print Settings Tab" msgstr "選擇 \"列印設置\" 選項卡" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 msgid "Select Filament Settings Tab" msgstr "選擇 \"耗材設置\" 選項卡" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 msgid "Select Printer Settings Tab" msgstr "選擇 \"印表機設置\" 選項卡" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 msgid "Switch to 3D" msgstr "切換到3D" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 msgid "Switch to Preview" msgstr "切換到預覽" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 -#: src/slic3r/GUI/PrintHostDialogs.cpp:217 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +#: src/slic3r/GUI/PrintHostDialogs.cpp:267 msgid "Print host upload queue" msgstr "列印主機上傳隊列" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/MainFrame.cpp:75 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 src/slic3r/GUI/MainFrame.cpp:77 msgid "Open new instance" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 msgid "Camera view" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 msgid "Show/Hide object/instance labels" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Preferences.cpp:46 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 src/slic3r/GUI/Preferences.cpp:57 +#: src/slic3r/GUI/Preferences.cpp:165 src/slic3r/GUI/Preferences.cpp:188 +#: src/slic3r/GUI/Preferences.cpp:207 src/slic3r/GUI/Preferences.cpp:215 msgid "Preferences" msgstr "首選項" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 msgid "Show keyboard shortcuts list" msgstr "顯示鍵盤快捷鍵列表" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 msgid "Commands" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 msgid "Add Instance of the selected object" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Remove Instance of the selected object" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 msgid "" "Press to select multiple objects\n" "or move multiple objects with mouse" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 msgid "Press to activate selection rectangle" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 msgid "Press to activate deselection rectangle" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Arrow Up" msgstr "上箭頭" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 msgid "Move selection 10 mm in positive Y direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Arrow Down" msgstr "上箭頭" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 msgid "Move selection 10 mm in negative Y direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Arrow Left" msgstr "左箭頭" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 msgid "Move selection 10 mm in negative X direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Arrow Right" msgstr "右箭頭" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 msgid "Move selection 10 mm in positive X direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Any arrow" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 msgid "Movement step set to 1 mm" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Movement in camera space" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Page Up" msgstr "PgUp" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Rotate selection 45 degrees CCW" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Page Down" msgstr "PgDn" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Rotate selection 45 degrees CW" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 msgid "Gizmo move" msgstr "線框移動" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 msgid "Gizmo scale" msgstr "線框縮放" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Gizmo rotate" msgstr "旋轉小物件" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Gizmo cut" msgstr "剪切小物件" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 msgid "Gizmo Place face on bed" msgstr "放置小物件面到熱牀" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 msgid "Gizmo SLA hollow" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 msgid "Gizmo SLA support points" msgstr "小物件SLA支撐點" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 msgid "Gizmo FDM paint-on supports" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 msgid "Gizmo FDM paint-on seam" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 msgid "Gizmo Multi Material painting" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +msgid "Gizmo Text emboss / engrave" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 msgid "Unselect gizmo or clear selection" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 msgid "Change camera type (perspective, orthographic)" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 msgid "Zoom to Bed" msgstr "縮放至熱牀" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 msgid "" "Zoom to selected object\n" "or all objects in scene, if none selected" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 msgid "Zoom in" msgstr "放大" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Zoom out" msgstr "縮小" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Switch between Editor/Preview" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Collapse/Expand the sidebar" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 msgid "Minimize application" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 src/slic3r/GUI/MainFrame.cpp:284 -#: src/slic3r/GUI/MainFrame.cpp:333 src/slic3r/GUI/MainFrame.cpp:445 -#: src/slic3r/GUI/MainFrame.cpp:448 src/slic3r/GUI/MainFrame.cpp:470 -#: src/slic3r/GUI/MainFrame.cpp:473 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 src/slic3r/GUI/MainFrame.cpp:329 +#: src/slic3r/GUI/MainFrame.cpp:378 src/slic3r/GUI/MainFrame.cpp:490 +#: src/slic3r/GUI/MainFrame.cpp:493 src/slic3r/GUI/MainFrame.cpp:515 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Plater" msgstr "佈局器" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 msgid "Gizmo move: Press to snap by 1mm" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 msgid "Gizmo scale: Press to snap by 5%" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 msgid "Gizmo scale: Scale selection to fit print volume" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 msgid "Gizmo scale: Press to activate one direction scaling" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 msgid "Gizmo scale: Press to scale selected objects around their own center" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 msgid "Gizmo rotate: Press to rotate selected objects around their own center" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "Gizmos" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "" "The following shortcuts are applicable when the specified gizmo is active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 msgid "Set selected items as Printable/Unprintable" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:203 msgid "Set default extruder for the selected items" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 msgid "Set extruder number for the selected items" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 msgid "Objects List" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/MainFrame.cpp:1611 msgid "Open a G-code file" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 -#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 -#: src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 src/slic3r/GUI/MainFrame.cpp:1443 +#: src/slic3r/GUI/MainFrame.cpp:1447 src/slic3r/GUI/MainFrame.cpp:1616 +#: src/slic3r/GUI/MainFrame.cpp:1620 msgid "Reload the plater from disk" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 msgid "Vertical slider - Move active thumb Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:228 msgid "Vertical slider - Move active thumb Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 msgid "Horizontal slider - Move active thumb Left" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 msgid "Horizontal slider - Move active thumb Right" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:231 msgid "On/Off one layer mode of the vertical slider" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 -msgid "Show/Hide Legend and Estimated printing time" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:232 +msgid "Show/Hide legend" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 msgid "Show/Hide G-code window" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4480 -#: src/slic3r/GUI/Tab.cpp:2832 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 src/slic3r/GUI/Plater.cpp:4562 +#: src/slic3r/GUI/Tab.cpp:2736 msgid "Preview" msgstr "預覽" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 msgid "Move active thumb Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 msgid "Move active thumb Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 msgid "Set upper thumb as active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 msgid "Set lower thumb as active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 msgid "Add color change marker for current layer" msgstr "添加當前圖層的顏色更改標記" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:238 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:244 msgid "Delete color change marker for current layer" msgstr "刪除當前圖層的顏色更改標記" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:240 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:250 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:251 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:245 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:256 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:257 msgid "" "Press to speed up 5 times while moving thumb\n" "with arrow keys or mouse wheel" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "Vertical Slider" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 msgid "" "The following shortcuts are applicable in G-code preview when the vertical " "slider is active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:252 msgid "Move active thumb Left" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 msgid "Move active thumb Right" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:248 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 msgid "Set left thumb as active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:255 msgid "Set right thumb as active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "Horizontal Slider" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:254 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:260 msgid "" "The following shortcuts are applicable in G-code preview when the horizontal " "slider is active" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:278 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:284 msgid "Keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:77 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open a new PrusaSlicer instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:93 msgid "G-code preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:80 src/slic3r/GUI/MainFrame.cpp:1388 msgid "Open G-code viewer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:91 src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open PrusaSlicer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:91 +#: src/slic3r/GUI/MainFrame.cpp:93 msgid "Open new G-code viewer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:225 +#: src/slic3r/GUI/MainFrame.cpp:227 msgid "Closing PrusaSlicer. Current project is modified." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "PrusaSlicer is closing" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:232 +#: src/slic3r/GUI/MainFrame.cpp:234 msgid "Closing PrusaSlicer while some presets are modified." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:285 src/slic3r/GUI/MainFrame.cpp:335 -#: src/slic3r/GUI/Tab.hpp:427 src/slic3r/GUI/Tab.hpp:550 +#: src/slic3r/GUI/MainFrame.cpp:330 src/slic3r/GUI/MainFrame.cpp:380 +#: src/slic3r/GUI/Tab.hpp:413 src/slic3r/GUI/Tab.hpp:539 msgid "Print Settings" msgstr "列印設置" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:535 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:384 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:520 msgid "Material Settings" msgstr "材料設置" -#: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 -#: src/slic3r/GUI/Tab.hpp:461 +#: src/slic3r/GUI/MainFrame.cpp:331 src/slic3r/GUI/MainFrame.cpp:382 +#: src/slic3r/GUI/MainFrame.cpp:2196 src/slic3r/GUI/MainFrame.cpp:2197 +#: src/slic3r/GUI/Tab.hpp:448 msgid "Filament Settings" msgstr "耗材絲設置" -#: src/slic3r/GUI/MainFrame.cpp:287 src/slic3r/GUI/MainFrame.cpp:341 -#: src/slic3r/GUI/Tab.hpp:503 +#: src/slic3r/GUI/MainFrame.cpp:332 src/slic3r/GUI/MainFrame.cpp:386 +#: src/slic3r/GUI/Tab.hpp:488 msgid "Printer Settings" msgstr "印表機設置" -#: src/slic3r/GUI/MainFrame.cpp:632 src/slic3r/GUI/Plater.cpp:1719 -#: src/slic3r/GUI/Plater.cpp:2850 +#: src/slic3r/GUI/MainFrame.cpp:685 src/slic3r/GUI/Plater.cpp:1728 +#: src/slic3r/GUI/Plater.cpp:2879 msgid "Untitled" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:655 +#: src/slic3r/GUI/MainFrame.cpp:710 msgid "based on Slic3r" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Prusa 3D &Drivers" msgstr "Prusa 3D &驅動程序" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1150 msgid "Open the Prusa3D drivers download page in your browser" msgstr "在瀏覽器中打開Prusa3d 驅動程序下載頁" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Software &Releases" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1075 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open the software releases page in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1081 +#: src/slic3r/GUI/MainFrame.cpp:1158 #, c-format, boost-format msgid "%s &Website" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1082 +#: src/slic3r/GUI/MainFrame.cpp:1159 #, c-format, boost-format msgid "Open the %s website in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "System &Info" msgstr "系統&信息" -#: src/slic3r/GUI/MainFrame.cpp:1088 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "Show system information" msgstr "顯示系統信息" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show &Configuration Folder" msgstr "顯示&配置文件夾" -#: src/slic3r/GUI/MainFrame.cpp:1090 +#: src/slic3r/GUI/MainFrame.cpp:1167 msgid "Show user configuration folder (datadir)" msgstr "顯示用戶配置文件夾 (datadir)" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "Report an I&ssue" msgstr "報告&問題" -#: src/slic3r/GUI/MainFrame.cpp:1092 +#: src/slic3r/GUI/MainFrame.cpp:1169 #, c-format, boost-format msgid "Report an issue on %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 #, c-format, boost-format msgid "&About %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1095 src/slic3r/GUI/MainFrame.cpp:1098 +#: src/slic3r/GUI/MainFrame.cpp:1172 src/slic3r/GUI/MainFrame.cpp:1175 msgid "Show about dialog" msgstr "關於對話框" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1177 msgid "Show Tip of the Day" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1104 +#: src/slic3r/GUI/MainFrame.cpp:1181 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1107 +#: src/slic3r/GUI/MainFrame.cpp:1184 msgid "Show the list of the keyboard shortcuts" msgstr "顯示鍵盤快捷鍵的列表" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso" msgstr "Iso" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Iso View" msgstr "Iso 視圖" #. TRN To be shown in the main menu View->Top #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2917 -#: src/libslic3r/PrintConfig.cpp:2926 +#: src/slic3r/GUI/MainFrame.cpp:1202 src/libslic3r/PrintConfig.cpp:3005 +#: src/libslic3r/PrintConfig.cpp:3014 msgid "Top" msgstr "頂部" -#: src/slic3r/GUI/MainFrame.cpp:1125 +#: src/slic3r/GUI/MainFrame.cpp:1202 msgid "Top View" msgstr "頂視圖" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:446 -#: src/libslic3r/PrintConfig.cpp:455 +#: src/slic3r/GUI/MainFrame.cpp:1205 src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:474 msgid "Bottom" msgstr "底部" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1205 msgid "Bottom View" msgstr "底部視圖" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front" msgstr "前面" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1207 msgid "Front View" msgstr "正視圖" -#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2274 +#: src/slic3r/GUI/MainFrame.cpp:1209 src/libslic3r/PrintConfig.cpp:2300 msgid "Rear" msgstr "背面" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1209 msgid "Rear View" msgstr "後視圖" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left" msgstr "左" -#: src/slic3r/GUI/MainFrame.cpp:1134 +#: src/slic3r/GUI/MainFrame.cpp:1211 msgid "Left View" msgstr "左視圖" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right" msgstr "右" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1213 msgid "Right View" msgstr "右視圖" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "&New Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1226 msgid "Start a new project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "&Open Project" msgstr "&打開項目" -#: src/slic3r/GUI/MainFrame.cpp:1152 +#: src/slic3r/GUI/MainFrame.cpp:1229 msgid "Open a project file" msgstr "打開項目文件" -#: src/slic3r/GUI/MainFrame.cpp:1157 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Recent projects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1169 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Save Project" msgstr "&保存項目" -#: src/slic3r/GUI/MainFrame.cpp:1194 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "Save current project file" msgstr "將當前項目文件另存爲" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save Project &as" msgstr "保存項目 &爲" -#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1274 src/slic3r/GUI/MainFrame.cpp:1276 msgid "Save current project file as" msgstr "將當前項目文件另存爲" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Import STL/3MF/STEP/OBJ/AM&F" msgstr "導入 STL/3MF/STEP/OBJ/AM&F" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1284 msgid "Load a model" msgstr "加載模型" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Import STL (Imperial Units)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1288 msgid "Load an model saved with imperial units" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Import SL1 / SL1S Archive" +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Import SLA Archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1292 +msgid "Load an SLA archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Import ZIP Achive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1216 -msgid "Load an SL1 / Sl1S archive" +#: src/slic3r/GUI/MainFrame.cpp:1296 +msgid "Load a zip achive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Import &Config" msgstr "導入&配置" -#: src/slic3r/GUI/MainFrame.cpp:1221 +#: src/slic3r/GUI/MainFrame.cpp:1301 msgid "Load exported configuration file" msgstr "加載導出的配置文件" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Import Config from &Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Load configuration from project file" msgstr "從項目文件加載配置" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Import Config &Bundle" msgstr "導入配置&組" -#: src/slic3r/GUI/MainFrame.cpp:1228 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Load presets from a bundle" msgstr "從包加載預設" -#: src/slic3r/GUI/MainFrame.cpp:1231 +#: src/slic3r/GUI/MainFrame.cpp:1311 msgid "&Import" msgstr "&導入" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1314 src/slic3r/GUI/MainFrame.cpp:1676 msgid "Export &G-code" msgstr "導出 &G-code" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1314 msgid "Export current plate as G-code" msgstr "將當佈局板導出爲 G-code" -#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1318 src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1318 msgid "Send to print current plate as G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export G-code to SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1322 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export Plate as &STL" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export Plate as &STL/OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1246 -msgid "Export current plate as STL" -msgstr "將當前佈局板導出爲 STL" +#: src/slic3r/GUI/MainFrame.cpp:1326 +msgid "Export current plate as STL/OBJ" +msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export Plate as STL &Including Supports" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export Plate as STL/OBJ &Including Supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1249 -msgid "Export current plate as STL including supports" +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Export current plate as STL/OBJ including supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export &Toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 +#: src/slic3r/GUI/MainFrame.cpp:1337 src/slic3r/GUI/MainFrame.cpp:1624 msgid "Export toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export &Config" msgstr "導出&配置" -#: src/slic3r/GUI/MainFrame.cpp:1261 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "Export current configuration to file" msgstr "將當前配置導出到文件" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export Config &Bundle" msgstr "導出配置&包" -#: src/slic3r/GUI/MainFrame.cpp:1264 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Export all presets to file" msgstr "將所有預設導出到文件" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export Config Bundle With Physical Printers" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1267 +#: src/slic3r/GUI/MainFrame.cpp:1347 msgid "Export all presets including physical printers to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1270 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "&Export" msgstr "導出(&E)" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Ejec&t SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1272 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Quick Slice" msgstr "快速切片" -#: src/slic3r/GUI/MainFrame.cpp:1280 +#: src/slic3r/GUI/MainFrame.cpp:1360 msgid "Slice a file into a G-code" msgstr "將文件切片成 G-code" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Quick Slice and Save As" msgstr "快速切片並另存爲" -#: src/slic3r/GUI/MainFrame.cpp:1286 +#: src/slic3r/GUI/MainFrame.cpp:1366 msgid "Slice a file into a G-code, save as" msgstr "將文件切片成 G-code, 並另存爲" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat Last Quick Slice" msgstr "重複上一個快速切片" -#: src/slic3r/GUI/MainFrame.cpp:1292 +#: src/slic3r/GUI/MainFrame.cpp:1372 msgid "Repeat last quick slice" msgstr "重複上一個快速切片" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "(Re)Slice No&w" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1380 msgid "Start new slicing process" msgstr "開始新的切片流程" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "&Repair STL file" msgstr "&修復 STL 文件" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "Automatically repair an STL file" msgstr "自動修復 STL 文件" -#: src/slic3r/GUI/MainFrame.cpp:1308 +#: src/slic3r/GUI/MainFrame.cpp:1388 msgid "&G-code Preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1392 +msgid "E&xit" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1392 src/slic3r/GUI/UpdateDialogs.cpp:376 +#: src/slic3r/GUI/UpdateDialogs.cpp:423 +#, c-format, boost-format +msgid "Exit %s" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 msgid "&Quit" msgstr "&退出" -#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 +#: src/slic3r/GUI/MainFrame.cpp:1394 src/slic3r/GUI/MainFrame.cpp:1631 #, c-format, boost-format msgid "Quit %s" msgstr "結束 %s" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1410 msgid "&Select All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1327 +#: src/slic3r/GUI/MainFrame.cpp:1411 msgid "Selects all objects" msgstr "選擇所有對象" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1413 msgid "D&eselect All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1414 msgid "Deselects all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1417 msgid "&Delete Selected" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1334 +#: src/slic3r/GUI/MainFrame.cpp:1418 msgid "Deletes the current selection" msgstr "刪除當前所選內容" -#: src/slic3r/GUI/MainFrame.cpp:1336 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Delete &All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1421 msgid "Deletes all objects" msgstr "刪除所有對象" -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1425 msgid "&Undo" msgstr "回復(&U)" -#: src/slic3r/GUI/MainFrame.cpp:1344 +#: src/slic3r/GUI/MainFrame.cpp:1428 msgid "&Redo" msgstr "重做(&R)" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1433 msgid "&Copy" msgstr "複製(&C)" -#: src/slic3r/GUI/MainFrame.cpp:1350 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Copy selection to clipboard" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1352 +#: src/slic3r/GUI/MainFrame.cpp:1436 msgid "&Paste" msgstr "貼上(&P)" -#: src/slic3r/GUI/MainFrame.cpp:1353 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "Paste clipboard" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 -#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 +#: src/slic3r/GUI/MainFrame.cpp:1442 src/slic3r/GUI/MainFrame.cpp:1446 +#: src/slic3r/GUI/MainFrame.cpp:1615 src/slic3r/GUI/MainFrame.cpp:1619 msgid "Re&load from Disk" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1368 +#: src/slic3r/GUI/MainFrame.cpp:1452 msgid "Searc&h" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1369 +#: src/slic3r/GUI/MainFrame.cpp:1453 msgid "Search in settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "&Plater Tab" msgstr "&佈局器 選項卡" -#: src/slic3r/GUI/MainFrame.cpp:1377 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "Show the plater" msgstr "顯示平臺佈局器" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "P&rint Settings Tab" msgstr "&列印設置選項卡" -#: src/slic3r/GUI/MainFrame.cpp:1382 +#: src/slic3r/GUI/MainFrame.cpp:1466 msgid "Show the print settings" msgstr "顯示列印設置" -#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1469 src/slic3r/GUI/MainFrame.cpp:1679 msgid "&Filament Settings Tab" msgstr "&線材設置選項卡" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1469 msgid "Show the filament settings" msgstr "顯示耗材設置" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Print&er Settings Tab" msgstr "&印表機設置選項卡" -#: src/slic3r/GUI/MainFrame.cpp:1389 +#: src/slic3r/GUI/MainFrame.cpp:1473 msgid "Show the printer settings" msgstr "顯示印表機設置" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "3&D" msgstr "3&D" -#: src/slic3r/GUI/MainFrame.cpp:1395 +#: src/slic3r/GUI/MainFrame.cpp:1479 msgid "Show the 3D editing view" msgstr "顯示3D 編輯視圖" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Pre&view" msgstr "預覽" -#: src/slic3r/GUI/MainFrame.cpp:1398 +#: src/slic3r/GUI/MainFrame.cpp:1482 msgid "Show the 3D slices preview" msgstr "顯示3D 切片預覽" -#: src/slic3r/GUI/MainFrame.cpp:1404 +#: src/slic3r/GUI/MainFrame.cpp:1488 msgid "Open the dialog to modify shape gallery" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Print &Host Upload Queue" msgstr "列印&主機上載隊列" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1499 msgid "Display the Print Host Upload Queue window" msgstr "顯示 \"列印主機上載隊列\" 窗口" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Open New Instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1424 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 +#: src/slic3r/GUI/MainFrame.cpp:1507 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1727 msgid "Compare Presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/MainFrame.cpp:1507 msgid "Compare presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show &Labels" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1434 +#: src/slic3r/GUI/MainFrame.cpp:1517 msgid "Show object/instance labels in 3D scene" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1437 +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show Legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1520 +msgid "Show legend in preview" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1523 msgid "&Collapse Sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1523 src/slic3r/GUI/Plater.cpp:2347 msgid "Collapse sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "&Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1442 +#: src/slic3r/GUI/MainFrame.cpp:1528 msgid "Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1543 src/slic3r/GUI/MainFrame.cpp:1650 msgid "&File" msgstr "&文件" -#: src/slic3r/GUI/MainFrame.cpp:1458 +#: src/slic3r/GUI/MainFrame.cpp:1544 msgid "&Edit" msgstr "&編輯" -#: src/slic3r/GUI/MainFrame.cpp:1459 +#: src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Window" msgstr "&窗口" -#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 +#: src/slic3r/GUI/MainFrame.cpp:1546 src/slic3r/GUI/MainFrame.cpp:1651 msgid "&View" msgstr "&視圖" -#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 +#: src/slic3r/GUI/MainFrame.cpp:1549 src/slic3r/GUI/MainFrame.cpp:1654 msgid "&Help" msgstr "&幫助" -#: src/slic3r/GUI/MainFrame.cpp:1525 +#: src/slic3r/GUI/MainFrame.cpp:1611 msgid "&Open G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1627 msgid "Open &PrusaSlicer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1586 +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legen&d" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1641 +msgid "Show legend" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1676 msgid "E&xport" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1587 +#: src/slic3r/GUI/MainFrame.cpp:1677 msgid "S&end to print" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1589 +#: src/slic3r/GUI/MainFrame.cpp:1679 msgid "Mate&rial Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1613 +#: src/slic3r/GUI/MainFrame.cpp:1703 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "選擇要切片的文件(STL/OBJ/AMF/3MF/PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1625 +#: src/slic3r/GUI/MainFrame.cpp:1715 msgid "No previously sliced file." msgstr "沒有預切片的文件。" -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid "Previously sliced file (" msgstr "預切片文件 (" -#: src/slic3r/GUI/MainFrame.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:1722 msgid ") not found." msgstr ") 無法找到。" -#: src/slic3r/GUI/MainFrame.cpp:1633 +#: src/slic3r/GUI/MainFrame.cpp:1723 msgid "File Not Found" msgstr "文件未找到" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 #, c-format, boost-format msgid "Save %s file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/MainFrame.cpp:1668 +#: src/slic3r/GUI/MainFrame.cpp:1758 msgid "G-code" msgstr "G-code" -#: src/slic3r/GUI/MainFrame.cpp:1680 +#: src/slic3r/GUI/MainFrame.cpp:1770 msgid "Save zip file as:" msgstr "將 zip 文件另存爲:" -#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6064 src/slic3r/GUI/Tab.cpp:1666 -#: src/slic3r/GUI/Tab.cpp:4730 +#: src/slic3r/GUI/MainFrame.cpp:1779 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6654 src/slic3r/GUI/Tab.cpp:1628 +#: src/slic3r/GUI/Tab.cpp:4986 msgid "Slicing" msgstr "切片" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1691 +#: src/slic3r/GUI/MainFrame.cpp:1781 #, c-format, boost-format msgid "Processing %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1714 +#: src/slic3r/GUI/MainFrame.cpp:1804 #, boost-format msgid "%1% was successfully sliced." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1717 +#: src/slic3r/GUI/MainFrame.cpp:1807 msgid "Slicing Done!" msgstr "切片完成!" -#: src/slic3r/GUI/MainFrame.cpp:1733 +#: src/slic3r/GUI/MainFrame.cpp:1823 msgid "Select the STL file to repair:" msgstr "選擇要修復的 STL 文件:" -#: src/slic3r/GUI/MainFrame.cpp:1743 +#: src/slic3r/GUI/MainFrame.cpp:1833 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "將 OBJ 文件 (不像 STL 那樣容易發生座標錯誤) 保存爲:" -#: src/slic3r/GUI/MainFrame.cpp:1754 +#: src/slic3r/GUI/MainFrame.cpp:1844 msgid "Your file was repaired." msgstr "您的文件已修復。" -#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4528 +#: src/slic3r/GUI/MainFrame.cpp:1844 src/libslic3r/PrintConfig.cpp:4694 msgid "Repair" msgstr "修復" -#: src/slic3r/GUI/MainFrame.cpp:1768 +#: src/slic3r/GUI/MainFrame.cpp:1858 msgid "Save configuration as:" msgstr "將配置另存爲:" -#: src/slic3r/GUI/MainFrame.cpp:1785 +#: src/slic3r/GUI/MainFrame.cpp:1875 msgid "Loading of a configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 +#: src/slic3r/GUI/MainFrame.cpp:1877 src/slic3r/GUI/MainFrame.cpp:1944 msgid "Select configuration to load:" msgstr "選擇要加載的配置:" -#: src/slic3r/GUI/MainFrame.cpp:1816 +#: src/slic3r/GUI/MainFrame.cpp:1908 msgid "Exporting configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1817 +#: src/slic3r/GUI/MainFrame.cpp:1909 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1826 +#: src/slic3r/GUI/MainFrame.cpp:1918 msgid "Save presets bundle as:" msgstr "將預設包保存爲:" -#: src/slic3r/GUI/MainFrame.cpp:1849 +#: src/slic3r/GUI/MainFrame.cpp:1941 msgid "Loading of a configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1879 +#: src/slic3r/GUI/MainFrame.cpp:1971 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d 預設已成功導入。" @@ -6129,201 +7449,247 @@ msgstr "" msgid "%s information" msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:752 +#: src/slic3r/GUI/NotificationManager.hpp:899 msgid "3D Mouse disconnected." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "Configuration update is available." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:753 +#: src/slic3r/GUI/NotificationManager.hpp:900 msgid "See more." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:761 +#: src/slic3r/GUI/NotificationManager.hpp:908 msgid "" "You have just added a G-code for color change, but its value is empty.\n" "To export the G-code correctly, check the \"Color Change G-code\" in " "\"Printer Settings > Custom G-code\"" msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:764 +#: src/slic3r/GUI/NotificationManager.hpp:911 msgid "" "No color change event was added to the print. The print does not look like a " "sign." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:766 +#: src/slic3r/GUI/NotificationManager.hpp:913 msgid "Desktop integration was successful." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:768 +#: src/slic3r/GUI/NotificationManager.hpp:915 msgid "Desktop integration failed." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:770 +#: src/slic3r/GUI/NotificationManager.hpp:917 msgid "Undo desktop integration was successful." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:772 +#: src/slic3r/GUI/NotificationManager.hpp:919 msgid "Undo desktop integration failed." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:773 +#: src/slic3r/GUI/NotificationManager.hpp:920 msgid "Exporting." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:664 +#: src/slic3r/GUI/NotificationManager.hpp:924 +msgid "" +"PrusaSlicer recieved a download request from Printables.com, but it's not " +"allowed. You can allow it" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:925 +msgid "here." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:773 msgid "Open Folder." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:701 +#: src/slic3r/GUI/NotificationManager.cpp:811 msgid "Eject drive" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:885 +#: src/slic3r/GUI/NotificationManager.cpp:1054 +#: src/slic3r/GUI/NotificationManager.cpp:1267 +#: src/slic3r/GUI/NotificationManager.cpp:1472 msgid "ERROR" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:890 -msgid "CANCELED" +#: src/slic3r/GUI/NotificationManager.cpp:1269 +#: src/slic3r/GUI/NotificationManager.cpp:1377 +msgid "COMPLETED" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:895 -msgid "COMPLETED" +#: src/slic3r/GUI/NotificationManager.cpp:1467 +msgid "RESOLVING ADDRESS" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:1477 +msgid "CANCELED" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:937 +#: src/slic3r/GUI/NotificationManager.cpp:1539 msgid "Cancel upload" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:996 +#: src/slic3r/GUI/NotificationManager.cpp:1648 #, c-format, boost-format msgid "%1$d object was loaded with custom supports." msgid_plural "%1$d objects were loaded with custom supports." msgstr[0] "" -#: src/slic3r/GUI/NotificationManager.cpp:997 +#: src/slic3r/GUI/NotificationManager.cpp:1649 #, c-format, boost-format msgid "%1$d object was loaded with custom seam." msgid_plural "%1$d objects were loaded with custom seam." msgstr[0] "" -#: src/slic3r/GUI/NotificationManager.cpp:998 +#: src/slic3r/GUI/NotificationManager.cpp:1650 #, c-format, boost-format msgid "%1$d object was loaded with multimaterial painting." msgid_plural "%1$d objects were loaded with multimaterial painting." msgstr[0] "" -#: src/slic3r/GUI/NotificationManager.cpp:999 +#: src/slic3r/GUI/NotificationManager.cpp:1651 #, c-format, boost-format msgid "%1$d object was loaded with variable layer height." msgid_plural "%1$d objects were loaded with variable layer height." msgstr[0] "" -#: src/slic3r/GUI/NotificationManager.cpp:1000 +#: src/slic3r/GUI/NotificationManager.cpp:1652 #, c-format, boost-format msgid "%1$d object was loaded with partial sinking." msgid_plural "%1$d objects were loaded with partial sinking." msgstr[0] "" -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1653 +#, c-format, boost-format +msgid "%1$d object was loaded as a part of cut object." +msgid_plural "%1$d objects were loaded as parts of cut object" +msgstr[0] "" + +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Slicing finished." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export G-Code." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1113 +#: src/slic3r/GUI/NotificationManager.cpp:1766 msgid "Export." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1447 -#: src/slic3r/GUI/NotificationManager.cpp:1454 -#: src/slic3r/GUI/NotificationManager.cpp:1470 -#: src/slic3r/GUI/NotificationManager.cpp:1476 -#: src/slic3r/GUI/NotificationManager.cpp:1547 +#: src/slic3r/GUI/NotificationManager.cpp:2101 +#: src/slic3r/GUI/NotificationManager.cpp:2108 +#: src/slic3r/GUI/NotificationManager.cpp:2124 +#: src/slic3r/GUI/NotificationManager.cpp:2130 +#: src/slic3r/GUI/NotificationManager.cpp:2201 msgid "ERROR:" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1459 -#: src/slic3r/GUI/NotificationManager.cpp:1486 -#: src/slic3r/GUI/NotificationManager.cpp:1494 -#: src/slic3r/GUI/NotificationManager.cpp:1505 src/slic3r/GUI/Plater.cpp:3197 +#: src/slic3r/GUI/NotificationManager.cpp:2113 +#: src/slic3r/GUI/NotificationManager.cpp:2140 +#: src/slic3r/GUI/NotificationManager.cpp:2148 +#: src/slic3r/GUI/NotificationManager.cpp:2159 src/slic3r/GUI/Plater.cpp:3220 msgid "WARNING:" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1598 +#: src/slic3r/GUI/NotificationManager.cpp:2275 msgid "Exporting finished." msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:50 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 msgid "Paint-on seam" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:52 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:68 +msgid "Cut connectors" +msgstr "" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:70 msgid "Sinking" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:110 msgid "Instances" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:98 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:266 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:114 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:275 #, c-format, boost-format msgid "Instance %d" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4568 -#: src/slic3r/GUI/Tab.cpp:4659 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:121 src/slic3r/GUI/Tab.cpp:4805 +#: src/slic3r/GUI/Tab.cpp:4942 msgid "Layers" msgstr "圖層" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:134 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:150 msgid "Range" msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:258 +#: src/slic3r/GUI/OpenGLManager.cpp:376 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL ES 2.0 capable graphics driver to run " +"correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:379 +#, c-format, boost-format +msgid "" +"PrusaSlicer requires OpenGL %s capable graphics driver to run correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:382 #, c-format, boost-format msgid "" "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" "while OpenGL version %s, render %s, vendor %s was detected." msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:261 +#: src/slic3r/GUI/OpenGLManager.cpp:386 msgid "You may need to update your graphics card driver." msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:264 +#: src/slic3r/GUI/OpenGLManager.cpp:389 msgid "" "As a workaround, you may run PrusaSlicer with a software rendered 3D " "graphics by running prusa-slicer.exe with the --sw-renderer parameter." msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:266 +#: src/slic3r/GUI/OpenGLManager.cpp:391 msgid "Unsupported OpenGL version" msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:274 +#: src/slic3r/GUI/OpenGLManager.cpp:399 #, c-format, boost-format msgid "" "Unable to load the following shaders:\n" "%s" msgstr "" -#: src/slic3r/GUI/OpenGLManager.cpp:275 +#: src/slic3r/GUI/OpenGLManager.cpp:400 msgid "Error loading shaders" msgstr "" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:126 +msgid "Unavailable for this method." +msgstr "" + +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Top" msgstr "頂部" -#: src/slic3r/GUI/OptionsGroup.cpp:352 +#: src/slic3r/GUI/OptionsGroup.cpp:388 msgctxt "Layers" msgid "Bottom" msgstr "底部" @@ -6332,7 +7698,7 @@ msgstr "底部" msgid "Delete this preset from this printer device" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:83 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:84 msgid "This printer will be shown in the presets list as" msgstr "" @@ -6348,81 +7714,81 @@ msgstr "" msgid "Add preset for this printer device" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2255 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2239 msgid "Print Host upload" msgstr "列印主機上傳隊列" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:268 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:271 msgid "Connection to printers connected via the print host failed." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:310 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:313 msgid "Test" msgstr "測試" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:315 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:318 msgid "Could not get a valid Printer Host reference" msgstr "無法獲取有效的印表機主機引用" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:330 msgid "Success!" msgstr "成功!" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:337 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:340 msgid "Refresh Printers" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:367 msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." msgstr "" "HTTPS CA 文件是可選的。只有在使用帶有自簽名證書的 HTTPS 時, 才需要使用它。" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:374 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:377 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "證書文件 (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:375 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:378 msgid "Open CA certificate file" msgstr "打開 CA 證書文件" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:404 -#: src/libslic3r/PrintConfig.cpp:330 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:407 +#: src/libslic3r/PrintConfig.cpp:343 msgid "HTTPS CA File" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:405 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:408 #, c-format, boost-format msgid "" "On this system, %s uses HTTPS certificates from the system Certificate Store " "or Keychain." msgstr "在此係統上, %s 使用來自系統證書存儲或鑰匙串的 https 證書。" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:406 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:409 msgid "" "To use a custom CA file, please import your CA file into Certificate Store / " "Keychain." msgstr "要使用自定義 CA 文件, 請將 CA 文件導入到證書存儲/鑰匙串。" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:634 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:706 msgid "The supplied name is empty. It can't be saved." msgstr "提供的名稱爲空。無法保存。" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:638 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:710 msgid "You have to enter a printer name." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:646 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:718 #, boost-format msgid "Printer with name \"%1%\" already exists." msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:647 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:719 msgid "Replace?" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:674 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:746 #, boost-format msgid "" "Following printer preset is duplicated:%1%The above preset for printer \"%2%" @@ -6432,227 +7798,224 @@ msgid_plural "" "\"%2%\" will be used just once." msgstr[0] "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:724 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:796 msgid "It's not possible to delete the last related preset for the printer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:141 +#: src/slic3r/GUI/Plater.cpp:158 msgid "The provided name is not valid;" msgstr "" -#: src/slic3r/GUI/Plater.cpp:142 src/slic3r/GUI/SavePresetDialog.cpp:102 +#: src/slic3r/GUI/Plater.cpp:159 src/slic3r/GUI/SavePresetDialog.cpp:166 msgid "the following characters are not allowed:" msgstr "不允許使用以下字符:" -#: src/slic3r/GUI/Plater.cpp:207 +#: src/slic3r/GUI/Plater.cpp:223 msgid "" "For a multipart object, this value isn't accurate.\n" "It doesn't take account of intersections and negative volumes." msgstr "" -#: src/slic3r/GUI/Plater.cpp:211 +#: src/slic3r/GUI/Plater.cpp:227 msgid "Volume" msgstr "體積" -#: src/slic3r/GUI/Plater.cpp:213 +#: src/slic3r/GUI/Plater.cpp:229 msgid "Facets" msgstr "平面" -#: src/slic3r/GUI/Plater.cpp:276 +#: src/slic3r/GUI/Plater.cpp:286 msgid "Sliced Info" msgstr "切片信息" -#: src/slic3r/GUI/Plater.cpp:296 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:306 src/slic3r/GUI/Plater.cpp:1414 msgid "Used Filament (g)" msgstr "消耗耗材絲 (g)" -#: src/slic3r/GUI/Plater.cpp:297 src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:307 src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (m)" msgstr "消耗耗材絲 (m)" -#: src/slic3r/GUI/Plater.cpp:298 src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:308 src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (mm³)" msgstr "消耗耗材絲 (mm³)" -#: src/slic3r/GUI/Plater.cpp:299 +#: src/slic3r/GUI/Plater.cpp:309 msgid "Used Material (unit)" msgstr "消耗材料 (單位)" -#: src/slic3r/GUI/Plater.cpp:300 +#: src/slic3r/GUI/Plater.cpp:310 msgid "Cost (money)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:301 src/slic3r/GUI/Plater.cpp:1340 -#: src/slic3r/GUI/Plater.cpp:1427 +#: src/slic3r/GUI/Plater.cpp:311 src/slic3r/GUI/Plater.cpp:1377 +#: src/slic3r/GUI/Plater.cpp:1464 msgid "Estimated printing time" msgstr "預計列印時間" -#: src/slic3r/GUI/Plater.cpp:302 +#: src/slic3r/GUI/Plater.cpp:312 msgid "Number of tool changes" msgstr "工具更換次數" -#: src/slic3r/GUI/Plater.cpp:431 +#: src/slic3r/GUI/Plater.cpp:437 msgid "Select what kind of support do you need" msgstr "選擇您需要的支持類型" -#: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2590 -#: src/libslic3r/PrintConfig.cpp:3645 +#: src/slic3r/GUI/Plater.cpp:440 src/libslic3r/PrintConfig.cpp:2620 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "Support on build plate only" msgstr "僅在熱牀上生成支撐" -#: src/slic3r/GUI/Plater.cpp:434 src/slic3r/GUI/Plater.cpp:564 +#: src/slic3r/GUI/Plater.cpp:441 msgid "For support enforcers only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:435 +#: src/slic3r/GUI/Plater.cpp:442 msgid "Everywhere" msgstr "任何地方" -#: src/slic3r/GUI/Plater.cpp:467 src/slic3r/GUI/Tab.cpp:1542 +#: src/slic3r/GUI/Plater.cpp:475 src/slic3r/GUI/Tab.cpp:1489 msgid "Brim" msgstr "側裙" -#: src/slic3r/GUI/Plater.cpp:469 +#: src/slic3r/GUI/Plater.cpp:477 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." msgstr "此標誌啓用將在第一層上的每個對象周圍列印裙邊." -#: src/slic3r/GUI/Plater.cpp:477 +#: src/slic3r/GUI/Plater.cpp:485 msgid "Purging volumes" msgstr "清理量" -#: src/slic3r/GUI/Plater.cpp:578 +#: src/slic3r/GUI/Plater.cpp:592 msgid "Select what kind of pad do you need" msgstr "" -#: src/slic3r/GUI/Plater.cpp:580 +#: src/slic3r/GUI/Plater.cpp:595 msgid "Below object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:581 +#: src/slic3r/GUI/Plater.cpp:596 msgid "Around object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:894 src/slic3r/GUI/Plater.cpp:6544 +#: src/slic3r/GUI/Plater.cpp:929 src/slic3r/GUI/Plater.cpp:7162 msgid "Send to printer" msgstr "發送到印表機" -#: src/slic3r/GUI/Plater.cpp:914 src/slic3r/GUI/Plater.cpp:3329 -#: src/slic3r/GUI/Plater.cpp:6067 +#: src/slic3r/GUI/Plater.cpp:949 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:6657 msgid "Slice now" msgstr "立即切片" -#: src/slic3r/GUI/Plater.cpp:1087 +#: src/slic3r/GUI/Plater.cpp:1127 msgid "Hold Shift to Slice & Export G-code" msgstr "按住Shift鍵來切片 並 導出G-code" -#: src/slic3r/GUI/Plater.cpp:1287 +#: src/slic3r/GUI/Plater.cpp:1324 #, boost-format msgid "%1% (%2$d shell)" msgid_plural "%1% (%2$d shells)" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:1315 +#: src/slic3r/GUI/Plater.cpp:1352 msgid "Used Material (ml)" msgstr "使用的材料 (毫升)" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "object" msgid_plural "objects" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:1318 +#: src/slic3r/GUI/Plater.cpp:1355 msgid "supports and pad" msgstr "支撐和墊" -#: src/slic3r/GUI/Plater.cpp:1358 +#: src/slic3r/GUI/Plater.cpp:1395 msgid "Used Filament (in)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "objects" msgstr "對象" -#: src/slic3r/GUI/Plater.cpp:1360 src/slic3r/GUI/Plater.cpp:1413 +#: src/slic3r/GUI/Plater.cpp:1397 src/slic3r/GUI/Plater.cpp:1450 msgid "wipe tower" msgstr "擦料塔" -#: src/slic3r/GUI/Plater.cpp:1370 +#: src/slic3r/GUI/Plater.cpp:1407 msgid "Used Filament (in³)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1396 +#: src/slic3r/GUI/Plater.cpp:1433 #, boost-format msgid "Filament at extruder %1%" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1402 +#: src/slic3r/GUI/Plater.cpp:1439 msgid "(including spool)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1072 -#: src/libslic3r/PrintConfig.cpp:3439 src/libslic3r/PrintConfig.cpp:3440 +#: src/slic3r/GUI/Plater.cpp:1448 src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:3716 src/libslic3r/PrintConfig.cpp:3717 msgid "Cost" msgstr "單價" -#: src/slic3r/GUI/Plater.cpp:1429 +#: src/slic3r/GUI/Plater.cpp:1466 msgid "normal mode" msgstr "正常模式" -#: src/slic3r/GUI/Plater.cpp:1436 +#: src/slic3r/GUI/Plater.cpp:1473 msgid "stealth mode" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1670 -msgid "Fill bed" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1676 -msgid "Optimize Rotation" +#: src/slic3r/GUI/Plater.cpp:1734 +#, boost-format +msgid "Do you want to save the changes to \"%1%\"?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1682 -msgid "Import SLA archive" -msgstr "" +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:905 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1599 +msgid "Save" +msgstr "儲存" -#: src/slic3r/GUI/Plater.cpp:1725 -#, boost-format -msgid "Do you want to save the changes to \"%1%\"?" +#: src/slic3r/GUI/Plater.cpp:1735 src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +msgid "Discard" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1730 src/slic3r/GUI/Preferences.cpp:222 +#: src/slic3r/GUI/Plater.cpp:1740 src/slic3r/GUI/Preferences.cpp:354 msgid "Ask for unsaved changes in project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1733 +#: src/slic3r/GUI/Plater.cpp:1743 msgid "" "You will not be asked about it again, when: \n" "- Closing PrusaSlicer,\n" "- Loading or creating a new project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2198 +#: src/slic3r/GUI/Plater.cpp:2214 #, c-format, boost-format msgid "" "Successfully unmounted. The device %s(%s) can now be safely removed from the " "computer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2203 +#: src/slic3r/GUI/Plater.cpp:2220 #, c-format, boost-format msgid "Ejecting of device %s(%s) has failed." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2222 src/slic3r/GUI/Plater.cpp:5108 +#: src/slic3r/GUI/Plater.cpp:2239 src/slic3r/GUI/Plater.cpp:5199 msgid "New Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2319 +#: src/slic3r/GUI/Plater.cpp:2346 msgid "Expand sidebar" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2518 +#: src/slic3r/GUI/Plater.cpp:2428 msgid "" "The preset below was temporarily installed on the active instance of " "PrusaSlicer" @@ -6661,12 +8024,12 @@ msgid_plural "" "PrusaSlicer" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:2548 +#: src/slic3r/GUI/Plater.cpp:2583 #, boost-format msgid "Failed loading file \"%1%\" due to an invalid configuration." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2568 +#: src/slic3r/GUI/Plater.cpp:2603 #, c-format, boost-format msgid "" "Object size from file %s appears to be zero.\n" @@ -6676,11 +8039,11 @@ msgid_plural "" "These objects have been removed from the model" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:2572 +#: src/slic3r/GUI/Plater.cpp:2607 msgid "The size of the object is zero" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2585 +#: src/slic3r/GUI/Plater.cpp:2620 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in meters.\n" @@ -6692,15 +8055,15 @@ msgid_plural "" "the dimensions of these objects?" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:2589 src/slic3r/GUI/Plater.cpp:2611 +#: src/slic3r/GUI/Plater.cpp:2624 src/slic3r/GUI/Plater.cpp:2646 msgid "The object is too small" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2590 src/slic3r/GUI/Plater.cpp:2612 +#: src/slic3r/GUI/Plater.cpp:2625 src/slic3r/GUI/Plater.cpp:2647 msgid "Apply to all the remaining small objects being loaded." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2607 +#: src/slic3r/GUI/Plater.cpp:2642 #, c-format, boost-format msgid "" "The dimensions of the object from file %s seem to be defined in inches.\n" @@ -6712,180 +8075,189 @@ msgid_plural "" "the dimensions of these objects?" msgstr[0] "" -#: src/slic3r/GUI/Plater.cpp:2625 +#: src/slic3r/GUI/Plater.cpp:2659 msgid "" "This file contains several objects positioned at multiple heights.\n" "Instead of considering them as multiple objects, should \n" "the file be loaded as a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2628 src/slic3r/GUI/Plater.cpp:2683 +#: src/slic3r/GUI/Plater.cpp:2662 src/slic3r/GUI/Plater.cpp:2711 msgid "Multi-part object detected" msgstr "檢測到多部分對象" -#: src/slic3r/GUI/Plater.cpp:2636 +#: src/slic3r/GUI/Plater.cpp:2669 msgid "" "This file cannot be loaded in a simple mode. Do you want to switch to an " "advanced mode?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2637 +#: src/slic3r/GUI/Plater.cpp:2670 msgid "Detected advanced data" msgstr "檢測到的高級數據" -#: src/slic3r/GUI/Plater.cpp:2657 -#, c-format, boost-format -msgid "" -"You can't to add the object(s) from %s because of one or some of them " -"is(are) multi-part" -msgstr "不能從 %s 中添加對象, 因爲其中一個或一些有多個部分" - -#: src/slic3r/GUI/Plater.cpp:2680 +#: src/slic3r/GUI/Plater.cpp:2708 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" "these files to represent a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2799 +#: src/slic3r/GUI/Plater.cpp:2827 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." msgstr "您的對象看起來太大, 因此它被自動縮小以適合您的列印牀。" -#: src/slic3r/GUI/Plater.cpp:2800 +#: src/slic3r/GUI/Plater.cpp:2828 msgid "Object too large?" msgstr "對象太大?" -#: src/slic3r/GUI/Plater.cpp:2878 +#: src/slic3r/GUI/Plater.cpp:2908 msgid "Export STL file:" msgstr "導出 STL 文件:" -#: src/slic3r/GUI/Plater.cpp:2885 +#: src/slic3r/GUI/Plater.cpp:2915 msgid "Export AMF file:" msgstr "導出 AMF 文件:" -#: src/slic3r/GUI/Plater.cpp:2891 +#: src/slic3r/GUI/Plater.cpp:2921 msgid "Save file as:" msgstr "將文件另存爲:" -#: src/slic3r/GUI/Plater.cpp:2897 +#: src/slic3r/GUI/Plater.cpp:2927 msgid "Export OBJ file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2995 +#: src/slic3r/GUI/Plater.cpp:3030 +msgid "Delete object which is a part of cut object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3031 +msgid "" +"You try to delete an object which is a part of a cut object.\n" +"This action will break a cut correspondence.\n" +"After that PrusaSlicer can't guarantee model consistency" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3035 +msgid "Delete object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3040 msgid "Delete Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3007 +#: src/slic3r/GUI/Plater.cpp:3057 msgid "Delete All Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3035 +#: src/slic3r/GUI/Plater.cpp:3086 msgid "Reset Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3118 +#: src/slic3r/GUI/Plater.cpp:3141 msgid "" "The selected object couldn't be split because it contains only one solid " "part." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3125 +#: src/slic3r/GUI/Plater.cpp:3148 msgid "All non-solid parts (modifiers) were deleted" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3127 +#: src/slic3r/GUI/Plater.cpp:3150 msgid "Split to Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3179 +#: src/slic3r/GUI/Plater.cpp:3202 msgid "" "An object has custom support enforcers which will not be used because " "supports are disabled." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3181 +#: src/slic3r/GUI/Plater.cpp:3204 msgid "Enable supports for enforcers only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3310 src/slic3r/GUI/Plater.cpp:4176 +#: src/slic3r/GUI/Plater.cpp:3339 src/slic3r/GUI/Plater.cpp:4238 msgid "Invalid data" msgstr "無效數據" -#: src/slic3r/GUI/Plater.cpp:3380 +#: src/slic3r/GUI/Plater.cpp:3410 msgid "Another export job is currently running." msgstr "另一個導出作業當前正在運行。" -#: src/slic3r/GUI/Plater.cpp:3466 +#: src/slic3r/GUI/Plater.cpp:3496 msgid "Replace from:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3484 +#: src/slic3r/GUI/Plater.cpp:3514 msgid "Unable to replace with more than one volume" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3484 src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3514 src/slic3r/GUI/Plater.cpp:3597 msgid "Error during replace" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3555 +#: src/slic3r/GUI/Plater.cpp:3589 msgid "Select the new file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:3597 msgid "File for the replace wasn't selected" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3654 +#: src/slic3r/GUI/Plater.cpp:3684 msgid "Please select the file to reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3685 src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:3715 src/slic3r/GUI/Plater.cpp:5355 +#: src/slic3r/GUI/Plater.cpp:5365 msgid "The selected file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "differs from the original file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3686 +#: src/slic3r/GUI/Plater.cpp:3716 msgid "Do you want to replace it" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3703 src/slic3r/GUI/Plater.cpp:3709 +#: src/slic3r/GUI/Plater.cpp:3736 src/slic3r/GUI/Plater.cpp:3742 msgid "Reload from:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3812 +#: src/slic3r/GUI/Plater.cpp:3864 msgid "Unable to reload:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3817 +#: src/slic3r/GUI/Plater.cpp:3869 msgid "Error during reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3835 +#: src/slic3r/GUI/Plater.cpp:3887 msgid "Reload all from disk" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4130 +#: src/slic3r/GUI/Plater.cpp:4191 msgid "There are active warnings concerning sliced models:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4141 +#: src/slic3r/GUI/Plater.cpp:4202 msgid "generated warnings" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4472 +#: src/slic3r/GUI/Plater.cpp:4554 msgid "3D editor view" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4893 +#: src/slic3r/GUI/Plater.cpp:4980 msgid "Undo / Redo is processing" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4895 +#: src/slic3r/GUI/Plater.cpp:4982 #, boost-format msgid "" "Switching the printer technology from %1% to %2%.\n" @@ -6893,200 +8265,249 @@ msgid "" "printer technology." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5092 +#: src/slic3r/GUI/Plater.cpp:5184 msgid "Creating a new project while the current project is modified." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5095 +#: src/slic3r/GUI/Plater.cpp:5187 msgid "Creating a new project while some presets are modified." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5096 +#: src/slic3r/GUI/Plater.cpp:5188 msgid "You can keep presets modifications to the new project or discard them" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5097 +#: src/slic3r/GUI/Plater.cpp:5189 msgid "" "You can keep presets modifications to the new project, discard them or save " "changes as new presets.\n" "Note, if changes will be saved then new project wouldn't keep them" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5103 +#: src/slic3r/GUI/Plater.cpp:5194 msgid "Creating a new project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5137 +#: src/slic3r/GUI/Plater.cpp:5228 msgid "Load Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5167 src/slic3r/GUI/Plater.cpp:5432 +#: src/slic3r/GUI/Plater.cpp:5258 msgid "Import Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5171 +#: src/slic3r/GUI/Plater.cpp:5262 msgid "Import Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5243 +#: src/slic3r/GUI/Plater.cpp:5291 +msgid "Import SLA archive" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5355 src/slic3r/GUI/Plater.cpp:5365 msgid "does not contain valid gcode." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5244 +#: src/slic3r/GUI/Plater.cpp:5356 src/slic3r/GUI/Plater.cpp:5366 msgid "Error while loading .gcode file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5297 +#: src/slic3r/GUI/Plater.cpp:5433 +#, c-format, boost-format +msgid "%s - Multiple projects file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 +msgid "There are several files being loaded, including Project files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5443 src/slic3r/GUI/Plater.cpp:5446 +msgid "Select an action to apply to all files." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5446 +msgid "There are several files being loaded." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5448 src/slic3r/GUI/Plater.cpp:5842 +msgid "Action" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5469 +msgid "Import geometry" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5482 src/slic3r/GUI/Plater.cpp:5834 +msgid "Start new PrusaSlicer instance" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5496 +msgid "Select one to load as project" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5507 +msgid "Select one to load config only" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5609 +#, boost-format +msgid "Failed to unzip file to %1%: %2% " +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5618 +#, boost-format +msgid "Failed to find unzipped file at %1%. Unzipping of file has failed." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:5821 #, c-format, boost-format -msgid "%s - Drop project file" +msgid "%s - Load project file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5304 +#: src/slic3r/GUI/Plater.cpp:5830 msgid "Open as project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5305 +#: src/slic3r/GUI/Plater.cpp:5831 msgid "Import geometry only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5306 +#: src/slic3r/GUI/Plater.cpp:5832 msgid "Import config only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5309 +#: src/slic3r/GUI/Plater.cpp:5837 msgid "Select an action to apply to the file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5314 -msgid "Action" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:5330 +#: src/slic3r/GUI/Plater.cpp:5858 msgid "Don't show again" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5371 +#: src/slic3r/GUI/Plater.cpp:5899 msgid "You can open only one .gcode file at a time." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5372 +#: src/slic3r/GUI/Plater.cpp:5900 msgid "Drag and drop G-code file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5454 +#: src/slic3r/GUI/Plater.cpp:5992 msgid "Load File" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5459 +#: src/slic3r/GUI/Plater.cpp:5997 msgid "Load Files" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5509 +#: src/slic3r/GUI/Plater.cpp:6047 msgid "All objects will be removed, continue?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5520 +#: src/slic3r/GUI/Plater.cpp:6058 msgid "Delete Selected Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5529 +#: src/slic3r/GUI/Plater.cpp:6067 msgid "Increase Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5563 +#: src/slic3r/GUI/Plater.cpp:6109 msgid "Decrease Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5614 +#: src/slic3r/GUI/Plater.cpp:6167 msgid "Enter the number of copies:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5615 +#: src/slic3r/GUI/Plater.cpp:6168 msgid "Copies of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5619 +#: src/slic3r/GUI/Plater.cpp:6171 #, c-format, boost-format msgid "Set numbers of copies to %d" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5697 -msgid "Cut by Plane" +#: src/slic3r/GUI/Plater.cpp:6187 +msgid "Fill bed" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save G-code file as:" msgstr "將 G-code 文件另存爲:" -#: src/slic3r/GUI/Plater.cpp:5757 +#: src/slic3r/GUI/Plater.cpp:6323 msgid "Save SL1 / SL1S file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5766 +#: src/slic3r/GUI/Plater.cpp:6336 msgid "The provided file name is not valid." msgstr "" -#: src/slic3r/GUI/Plater.cpp:5767 +#: src/slic3r/GUI/Plater.cpp:6337 msgid "The following characters are not allowed by a FAT file system:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "" "The plater is empty.\n" "Do you want to save the project?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5957 +#: src/slic3r/GUI/Plater.cpp:6531 msgid "Save project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:6543 -msgid "Export" -msgstr "導出" +#: src/slic3r/GUI/Plater.cpp:6766 +msgid "Is the printer ready? Is the print sheet in place, empty and clean?" +msgstr "" -#: src/slic3r/GUI/Plater.cpp:6575 -msgid "" -"Custom supports, seams and multimaterial painting were removed after " -"repairing the mesh." +#: src/slic3r/GUI/Plater.cpp:6766 src/slic3r/GUI/PrintHostDialogs.cpp:132 +msgid "Upload and Print" msgstr "" -#: src/slic3r/GUI/Plater.cpp:6689 +#: src/slic3r/GUI/Plater.cpp:7161 +msgid "Export" +msgstr "導出" + +#: src/slic3r/GUI/Plater.cpp:7306 msgid "Paste From Clipboard" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2290 -#: src/slic3r/GUI/Tab.cpp:2517 src/slic3r/GUI/Tab.cpp:2624 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Preferences.cpp:240 src/slic3r/GUI/Tab.cpp:2274 +#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2617 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "General" msgstr "常規" -#: src/slic3r/GUI/Preferences.cpp:121 +#: src/slic3r/GUI/Preferences.cpp:258 msgid "Remember output directory" msgstr "記住輸出目錄" -#: src/slic3r/GUI/Preferences.cpp:123 +#: src/slic3r/GUI/Preferences.cpp:259 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." msgstr "" "如果啓用此功能, Slic3r 將提示最後一個輸出目錄, 而不是包含輸入文件的目錄。" -#: src/slic3r/GUI/Preferences.cpp:129 +#: src/slic3r/GUI/Preferences.cpp:263 msgid "Auto-center parts" msgstr "自動居中部件" -#: src/slic3r/GUI/Preferences.cpp:131 +#: src/slic3r/GUI/Preferences.cpp:264 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." msgstr "如果啓用此功能, Slic3r 將在列印牀中心周圍自動居中對象。" -#: src/slic3r/GUI/Preferences.cpp:137 +#: src/slic3r/GUI/Preferences.cpp:268 msgid "Background processing" msgstr "後臺處理" -#: src/slic3r/GUI/Preferences.cpp:139 +#: src/slic3r/GUI/Preferences.cpp:269 msgid "" "If this is enabled, Slic3r will pre-process objects as soon as they're " "loaded in order to save time when exporting G-code." @@ -7094,25 +8515,37 @@ msgstr "" "如果啓用此功能, Slic3r 將在加載對象後立即對其進行預處理, 以便在導出 G-code " "時節省時間。" -#: src/slic3r/GUI/Preferences.cpp:148 +#: src/slic3r/GUI/Preferences.cpp:274 +msgid "Alert when supports needed" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:275 +msgid "" +"If this is enabled, Slic3r will raise alerts when it detects issues in the " +"sliced object, that can be resolved with supports (and brim). Examples of " +"such issues are floating object parts, unsupported extrusions and low bed " +"adhesion." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:285 msgid "Export sources full pathnames to 3mf and amf" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:150 +#: src/slic3r/GUI/Preferences.cpp:286 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:159 +#: src/slic3r/GUI/Preferences.cpp:293 msgid "If enabled, sets PrusaSlicer as default application to open .3mf files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:166 +#: src/slic3r/GUI/Preferences.cpp:298 msgid "If enabled, sets PrusaSlicer as default application to open .stl files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:177 +#: src/slic3r/GUI/Preferences.cpp:307 msgid "" "If enabled, Slic3r downloads updates of built-in system presets in the " "background. These updates are downloaded into a separate temporary location. " @@ -7122,11 +8555,11 @@ msgstr "" "如果啓用,Slic3r 將在後臺下載內置系統預設的更新。 這些更新將會下載到一個單獨" "的臨時文件夾。當一切準備就緒,將在應用啓動的時候提供新版本。" -#: src/slic3r/GUI/Preferences.cpp:182 +#: src/slic3r/GUI/Preferences.cpp:312 msgid "Suppress \" - default - \" presets" msgstr "禁止 \"-默認-\" 預設" -#: src/slic3r/GUI/Preferences.cpp:184 +#: src/slic3r/GUI/Preferences.cpp:313 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." @@ -7134,103 +8567,124 @@ msgstr "" "在 \"列印/耗材絲/印表機\" 選擇中禁止 \"-默認-\" 預設, 一旦有任何其他有效的預" "設可用。" -#: src/slic3r/GUI/Preferences.cpp:190 +#: src/slic3r/GUI/Preferences.cpp:317 +msgid "Suppress \" Template \" filament presets" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:318 +msgid "" +"Suppress \" Template \" filament presets in configuration wizard and sidebar " +"visibility." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:322 msgid "Show incompatible print and filament presets" msgstr "顯示不兼容的列印和耗材絲預設" -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:323 msgid "" "When checked, the print and filament presets are shown in the preset editor " "even if they are marked as incompatible with the active printer" msgstr "" -"選中後, 列印和耗材絲預設將顯示在預設編輯器中, 即使它們被標記爲與活動印表機不" -"兼容" +"選中後, 列印和耗材絲預設將顯示在預設編輯器中, 即使它們被標記爲與活動印表機不" +"兼容" + +#: src/slic3r/GUI/Preferences.cpp:331 +msgid "Show load project dialog" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:332 +msgid "" +"When checked, whenever dragging and dropping a project file on the " +"application or open it from a browser, shows a dialog asking to select the " +"action to take on the file to load." +msgstr "" -#: src/slic3r/GUI/Preferences.cpp:200 +#: src/slic3r/GUI/Preferences.cpp:335 msgid "Show drop project dialog" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:202 +#: src/slic3r/GUI/Preferences.cpp:336 msgid "" "When checked, whenever dragging and dropping a project file on the " "application, shows a dialog asking to select the action to take on the file " "to load." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:208 src/slic3r/GUI/Preferences.cpp:212 +#: src/slic3r/GUI/Preferences.cpp:342 src/slic3r/GUI/Preferences.cpp:346 msgid "Allow just a single PrusaSlicer instance" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:210 +#: src/slic3r/GUI/Preferences.cpp:343 msgid "" "On OSX there is always only one instance of app running by default. However " "it is allowed to run multiple instances of same app from the command line. " "In such case this settings will allow only one instance." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:214 +#: src/slic3r/GUI/Preferences.cpp:347 msgid "" "If this is enabled, when starting PrusaSlicer and another instance of the " "same PrusaSlicer is already running, that instance will be reactivated " "instead." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:224 +#: src/slic3r/GUI/Preferences.cpp:355 msgid "" "Always ask for unsaved changes in project, when: \n" "- Closing PrusaSlicer,\n" "- Loading or creating a new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:233 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:897 +#: src/slic3r/GUI/Preferences.cpp:363 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:925 msgid "" "Ask to save unsaved changes in presets when closing the application or when " "loading a new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:235 +#: src/slic3r/GUI/Preferences.cpp:364 msgid "" "Always ask for unsaved changes in presets, when: \n" "- Closing PrusaSlicer while some presets are modified,\n" "- Loading a new project while some presets are modified" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:242 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:896 +#: src/slic3r/GUI/Preferences.cpp:370 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:924 msgid "Ask for unsaved changes in presets when selecting new preset" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:244 +#: src/slic3r/GUI/Preferences.cpp:371 msgid "" "Always ask for unsaved changes in presets when selecting new preset or " "resetting a preset" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:249 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 +#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:923 msgid "Ask for unsaved changes in presets when creating new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:251 +#: src/slic3r/GUI/Preferences.cpp:376 msgid "Always ask for unsaved changes in presets when creating new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:258 +#: src/slic3r/GUI/Preferences.cpp:382 msgid "Associate .gcode files to PrusaSlicer G-code Viewer" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:260 +#: src/slic3r/GUI/Preferences.cpp:383 msgid "" "If enabled, sets PrusaSlicer G-code Viewer as default application to open ." "gcode files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:268 +#: src/slic3r/GUI/Preferences.cpp:390 msgid "Use Retina resolution for the 3D scene" msgstr "對3D 場景使用視網膜分辨率" -#: src/slic3r/GUI/Preferences.cpp:270 +#: src/slic3r/GUI/Preferences.cpp:391 msgid "" "If enabled, the 3D scene will be rendered in Retina resolution. If you are " "experiencing 3D performance problems, disabling this option may help." @@ -7238,106 +8692,102 @@ msgstr "" "如果啓用, 3D 場景將以視網膜分辨率呈現。如果您遇到3D 性能問題, 禁用此選項可能" "會有所幫助。" -#: src/slic3r/GUI/Preferences.cpp:280 src/slic3r/GUI/Preferences.cpp:282 +#: src/slic3r/GUI/Preferences.cpp:400 src/slic3r/GUI/Preferences.cpp:401 msgid "Show splash screen" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:289 +#: src/slic3r/GUI/Preferences.cpp:406 msgid "If enabled, PrusaSlicer will be open at the position it was closed" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:295 +#: src/slic3r/GUI/Preferences.cpp:411 msgid "Clear Undo / Redo stack on new project" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:297 +#: src/slic3r/GUI/Preferences.cpp:412 msgid "" "Clear Undo / Redo stack on new project or when an existing project is loaded." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:303 +#: src/slic3r/GUI/Preferences.cpp:417 msgid "Enable support for legacy 3DConnexion devices" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:305 +#: src/slic3r/GUI/Preferences.cpp:418 msgid "" "If enabled, the legacy 3DConnexion devices settings dialog is available by " "pressing CTRL+M" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:314 +#: src/slic3r/GUI/Preferences.cpp:425 msgid "Camera" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:319 +#: src/slic3r/GUI/Preferences.cpp:435 msgid "Use perspective camera" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:321 +#: src/slic3r/GUI/Preferences.cpp:436 msgid "" "If enabled, use perspective camera. If not enabled, use orthographic camera." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:326 +#: src/slic3r/GUI/Preferences.cpp:440 msgid "Use free camera" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:328 +#: src/slic3r/GUI/Preferences.cpp:441 msgid "If enabled, use free camera. If not enabled, use constrained camera." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:333 +#: src/slic3r/GUI/Preferences.cpp:445 msgid "Reverse direction of zoom with mouse wheel" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:335 +#: src/slic3r/GUI/Preferences.cpp:446 msgid "If enabled, reverses the direction of zoom with mouse wheel" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:343 +#: src/slic3r/GUI/Preferences.cpp:452 msgid "GUI" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:366 +#: src/slic3r/GUI/Preferences.cpp:492 msgid "Sequential slider applied only to top layer" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:368 +#: src/slic3r/GUI/Preferences.cpp:493 msgid "" "If enabled, changes made using the sequential slider, in preview, apply only " -"to gcode top layer. If disabled, changes made using the sequential slider, " -"in preview, apply to the whole gcode." +"to gcode top layer.If disabled, changes made using the sequential slider, in " +"preview, apply to the whole gcode." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:375 +#: src/slic3r/GUI/Preferences.cpp:499 msgid "Show sidebar collapse/expand button" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:377 +#: src/slic3r/GUI/Preferences.cpp:500 msgid "" "If enabled, the button for the collapse sidebar will be appeared in top " "right corner of the 3D Scene" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:384 -msgid "If enabled, PrusaSlicer will not open hyperlinks in your browser." -msgstr "" - -#: src/slic3r/GUI/Preferences.cpp:391 +#: src/slic3r/GUI/Preferences.cpp:511 msgid "Use colors for axes values in Manipulation panel" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:393 +#: src/slic3r/GUI/Preferences.cpp:512 msgid "" "If enabled, the axes names and axes values will be colorized according to " "the axes colors. If disabled, old UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:399 +#: src/slic3r/GUI/Preferences.cpp:517 msgid "Order object volumes by types" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:401 +#: src/slic3r/GUI/Preferences.cpp:518 msgid "" "If enabled, volumes will be always ordered inside the object. Correct order " "is Model Part, Negative Volume, Modifier, Support Blocker and Support " @@ -7345,193 +8795,240 @@ msgid "" "Modifiers. But one of the model parts have to be on the first place." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:408 +#: src/slic3r/GUI/Preferences.cpp:523 +msgid "Show non-manifold edges" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:524 +msgid "If enabled, shows non-manifold edges." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:528 +msgid "Allow automatically color change" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:529 +msgid "" +"If enabled, related notification will be shown, when sliced object looks " +"like a logo or a sign." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:534 msgid "Set settings tabs as menu items (experimental)" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:410 +#: src/slic3r/GUI/Preferences.cpp:535 msgid "" "If enabled, Settings Tabs will be placed as menu items. If disabled, old UI " "will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:419 +#: src/slic3r/GUI/Preferences.cpp:542 msgid "Show \"Tip of the day\" notification after start" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:421 +#: src/slic3r/GUI/Preferences.cpp:543 msgid "If enabled, useful hints are displayed at startup." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:427 +#: src/slic3r/GUI/Preferences.cpp:547 msgid "Notify about new releases" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:429 +#: src/slic3r/GUI/Preferences.cpp:548 msgid "" "You will be notified about new release after startup acordingly: All = " "Regular release and alpha / beta releases. Release only = regular release." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:435 +#: src/slic3r/GUI/Preferences.cpp:551 msgid "Release only" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:444 +#: src/slic3r/GUI/Preferences.cpp:558 msgid "Use custom size for toolbar icons" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:446 +#: src/slic3r/GUI/Preferences.cpp:559 msgid "If enabled, you can change size of toolbar icons manually." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:471 +#: src/slic3r/GUI/Preferences.cpp:577 src/slic3r/GUI/Tab.cpp:1659 +msgid "Other" +msgstr "其他" + +#: src/slic3r/GUI/Preferences.cpp:594 +msgid "If enabled, PrusaSlicer will not open a hyperlinks in your browser." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:600 +msgid "Allow downloads from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:601 +msgid "If enabled, PrusaSlicer will be allowed to download from Printables.com" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:610 msgid "Render" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:476 +#: src/slic3r/GUI/Preferences.cpp:620 msgid "Use environment map" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:478 +#: src/slic3r/GUI/Preferences.cpp:621 msgid "If enabled, renders object using the environment map." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:491 +#: src/slic3r/GUI/Preferences.cpp:629 msgid "Dark mode (experimental)" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:496 +#: src/slic3r/GUI/Preferences.cpp:639 msgid "Enable dark mode" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:498 +#: src/slic3r/GUI/Preferences.cpp:640 msgid "" "If enabled, UI will use Dark mode colors. If disabled, old UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:507 +#: src/slic3r/GUI/Preferences.cpp:647 msgid "Use system menu for application" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:509 +#: src/slic3r/GUI/Preferences.cpp:648 msgid "" "If enabled, application will use the standard Windows system menu,\n" -"but on some combination of display scales it can looks ugly. If disabled, " -"old UI will be used." +"but on some combination od display scales it can look ugly. If disabled, old " +"UI will be used." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:578 +#: src/slic3r/GUI/Preferences.cpp:726 msgid "Changes for the critical options" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:580 +#: src/slic3r/GUI/Preferences.cpp:728 msgid "" "Changing some options will trigger application restart.\n" "You will lose the content of the plater." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:694 +#: src/slic3r/GUI/Preferences.cpp:921 msgid "Icon size in a respect to the default size" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:709 +#: src/slic3r/GUI/Preferences.cpp:936 msgid "Select toolbar icon size in respect to the default one." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:743 src/slic3r/GUI/Preferences.cpp:754 +#: src/slic3r/GUI/Preferences.cpp:972 +msgid "Layout Options" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:981 msgid "Old regular layout with the tab bar" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:744 +#: src/slic3r/GUI/Preferences.cpp:982 msgid "New layout, access via settings button in the top menu" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:745 src/slic3r/GUI/Preferences.cpp:755 +#: src/slic3r/GUI/Preferences.cpp:983 msgid "Settings in non-modal window" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:763 -msgid "Layout Options" +#: src/slic3r/GUI/Preferences.cpp:1025 +msgid "Text colors" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:806 -msgid "Text colors" +#: src/slic3r/GUI/Preferences.cpp:1049 +msgid "Mode markers" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:249 -#: src/slic3r/GUI/PresetComboBoxes.cpp:287 -#: src/slic3r/GUI/PresetComboBoxes.cpp:794 -#: src/slic3r/GUI/PresetComboBoxes.cpp:849 -#: src/slic3r/GUI/PresetComboBoxes.cpp:989 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1033 +#: src/slic3r/GUI/PresetComboBoxes.cpp:254 +#: src/slic3r/GUI/PresetComboBoxes.cpp:306 +#: src/slic3r/GUI/PresetComboBoxes.cpp:846 +#: src/slic3r/GUI/PresetComboBoxes.cpp:909 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1073 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1125 msgid "System presets" msgstr "系統預設" -#: src/slic3r/GUI/PresetComboBoxes.cpp:291 -#: src/slic3r/GUI/PresetComboBoxes.cpp:853 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1037 +#: src/slic3r/GUI/PresetComboBoxes.cpp:310 +#: src/slic3r/GUI/PresetComboBoxes.cpp:915 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1130 msgid "User presets" msgstr "用戶預設" -#: src/slic3r/GUI/PresetComboBoxes.cpp:302 +#: src/slic3r/GUI/PresetComboBoxes.cpp:321 msgid "Incompatible presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:337 +#: src/slic3r/GUI/PresetComboBoxes.cpp:364 #, boost-format msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:340 +#: src/slic3r/GUI/PresetComboBoxes.cpp:366 msgid "Delete Physical Printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:581 +#: src/slic3r/GUI/PresetComboBoxes.cpp:612 msgid "Click to edit preset" msgstr "點擊編輯預設" -#: src/slic3r/GUI/PresetComboBoxes.cpp:697 -#: src/slic3r/GUI/PresetComboBoxes.cpp:737 +#: src/slic3r/GUI/PresetComboBoxes.cpp:740 +#: src/slic3r/GUI/PresetComboBoxes.cpp:788 msgid "Add/Remove presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:745 +#: src/slic3r/GUI/PresetComboBoxes.cpp:793 src/slic3r/GUI/Tab.cpp:3312 msgid "Add physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:716 +#: src/slic3r/GUI/PresetComboBoxes.cpp:759 msgid "Edit preset" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:722 +#: src/slic3r/GUI/PresetComboBoxes.cpp:765 msgid "Change extruder color" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3248 +#: src/slic3r/GUI/PresetComboBoxes.cpp:773 src/slic3r/GUI/Tab.cpp:3312 msgid "Edit physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:733 +#: src/slic3r/GUI/PresetComboBoxes.cpp:779 +msgid "Open physical printer URL" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:784 msgid "Delete physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:864 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1051 +#: src/slic3r/GUI/PresetComboBoxes.cpp:924 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1142 +msgid "Template presets" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:935 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1156 msgid "Physical printers" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:888 +#: src/slic3r/GUI/PresetComboBoxes.cpp:959 msgid "Add/Remove filaments" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:890 +#: src/slic3r/GUI/PresetComboBoxes.cpp:961 msgid "Add/Remove materials" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:892 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1075 +#: src/slic3r/GUI/PresetComboBoxes.cpp:963 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1180 msgid "Add/Remove printers" msgstr "" @@ -7705,98 +9202,106 @@ msgstr "" msgid "Bottom is open." msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Send G-Code to printer host" msgstr "向印表機主機發送 G-Code" -#: src/slic3r/GUI/PrintHostDialogs.cpp:40 +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 msgid "Upload to Printer Host with the following filename:" msgstr "使用以下文件名上載到印表機主機:" -#: src/slic3r/GUI/PrintHostDialogs.cpp:51 +#: src/slic3r/GUI/PrintHostDialogs.cpp:55 msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "如果需要, 使用正向斜槓 (/) 作爲目錄分隔符。" -#: src/slic3r/GUI/PrintHostDialogs.cpp:60 +#: src/slic3r/GUI/PrintHostDialogs.cpp:64 msgid "Group" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:84 +#: src/slic3r/GUI/PrintHostDialogs.cpp:74 +msgid "Upload to storage:" +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:83 +msgid "Upload to storage: " +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:105 #, c-format, boost-format msgid "Upload filename doesn't end with \"%s\". Do you wish to continue?" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:91 +#: src/slic3r/GUI/PrintHostDialogs.cpp:112 msgid "Upload" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:101 -msgid "Upload and Print" +#: src/slic3r/GUI/PrintHostDialogs.cpp:122 +msgid "Upload to Queue" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:112 +#: src/slic3r/GUI/PrintHostDialogs.cpp:143 msgid "Upload and Simulate" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:247 +#: src/slic3r/GUI/PrintHostDialogs.cpp:298 msgid "ID" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:248 +#: src/slic3r/GUI/PrintHostDialogs.cpp:299 msgid "Progress" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:249 +#: src/slic3r/GUI/PrintHostDialogs.cpp:300 msgid "Status" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:250 +#: src/slic3r/GUI/PrintHostDialogs.cpp:301 msgid "Host" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:251 +#: src/slic3r/GUI/PrintHostDialogs.cpp:302 msgctxt "OfFile" msgid "Size" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:252 +#: src/slic3r/GUI/PrintHostDialogs.cpp:303 msgid "Filename" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:253 -msgid "Error Message" -msgstr "" +#: src/slic3r/GUI/PrintHostDialogs.cpp:304 +msgid "Message" +msgstr "訊息" -#: src/slic3r/GUI/PrintHostDialogs.cpp:256 +#: src/slic3r/GUI/PrintHostDialogs.cpp:308 msgid "Cancel selected" msgstr "取消選定" -#: src/slic3r/GUI/PrintHostDialogs.cpp:258 +#: src/slic3r/GUI/PrintHostDialogs.cpp:310 msgid "Show error message" msgstr "顯示錯誤消息" -#: src/slic3r/GUI/PrintHostDialogs.cpp:316 -#: src/slic3r/GUI/PrintHostDialogs.cpp:371 +#: src/slic3r/GUI/PrintHostDialogs.cpp:368 +#: src/slic3r/GUI/PrintHostDialogs.cpp:423 msgid "Enqueued" msgstr "加入隊列" -#: src/slic3r/GUI/PrintHostDialogs.cpp:372 +#: src/slic3r/GUI/PrintHostDialogs.cpp:424 msgid "Uploading" msgstr "上傳中" -#: src/slic3r/GUI/PrintHostDialogs.cpp:374 +#: src/slic3r/GUI/PrintHostDialogs.cpp:426 msgid "Cancelling" msgstr "取消中" -#: src/slic3r/GUI/PrintHostDialogs.cpp:375 +#: src/slic3r/GUI/PrintHostDialogs.cpp:427 msgid "Cancelled" msgstr "已取消" -#: src/slic3r/GUI/PrintHostDialogs.cpp:376 +#: src/slic3r/GUI/PrintHostDialogs.cpp:428 msgid "Completed" msgstr "已完成" -#: src/slic3r/GUI/PrintHostDialogs.cpp:424 +#: src/slic3r/GUI/PrintHostDialogs.cpp:476 msgid "Error uploading to print host:" msgstr "上載到列印主機時出錯:" @@ -7804,13 +9309,13 @@ msgstr "上載到列印主機時出錯:" msgid "NO RAMMING AT ALL" msgstr "完全不存在" -#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 -#: src/libslic3r/PrintConfig.cpp:955 src/libslic3r/PrintConfig.cpp:999 -#: src/libslic3r/PrintConfig.cpp:1014 src/libslic3r/PrintConfig.cpp:3297 -#: src/libslic3r/PrintConfig.cpp:3306 src/libslic3r/PrintConfig.cpp:3315 -#: src/libslic3r/PrintConfig.cpp:3456 src/libslic3r/PrintConfig.cpp:3464 -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3479 -#: src/libslic3r/PrintConfig.cpp:3487 src/libslic3r/PrintConfig.cpp:3495 +#: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/libslic3r/PrintConfig.cpp:1044 src/libslic3r/PrintConfig.cpp:1088 +#: src/libslic3r/PrintConfig.cpp:1103 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3578 src/libslic3r/PrintConfig.cpp:3587 +#: src/libslic3r/PrintConfig.cpp:3733 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3749 src/libslic3r/PrintConfig.cpp:3756 +#: src/libslic3r/PrintConfig.cpp:3764 src/libslic3r/PrintConfig.cpp:3772 msgid "s" msgstr "s" @@ -7818,162 +9323,210 @@ msgstr "s" msgid "Volumetric speed" msgstr "流量速度" -#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:912 -#: src/libslic3r/PrintConfig.cpp:1824 +#: src/slic3r/GUI/RammingChart.cpp:95 src/libslic3r/PrintConfig.cpp:1001 +#: src/libslic3r/PrintConfig.cpp:1861 msgid "mm³/s" msgstr "mm³/s" -#: src/slic3r/GUI/SavePresetDialog.cpp:57 +#: src/slic3r/GUI/SavePresetDialog.cpp:90 +#, c-format, boost-format +msgid "Rename %s to:" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:90 #, c-format, boost-format msgid "Save %s as:" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:101 -#: src/slic3r/GUI/SavePresetDialog.cpp:109 +#: src/slic3r/GUI/SavePresetDialog.cpp:165 +#: src/slic3r/GUI/SavePresetDialog.cpp:173 msgid "The supplied name is not valid;" msgstr "提供的名稱無效;" -#: src/slic3r/GUI/SavePresetDialog.cpp:110 +#: src/slic3r/GUI/SavePresetDialog.cpp:174 msgid "the following suffix is not allowed:" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:116 +#: src/slic3r/GUI/SavePresetDialog.cpp:180 msgid "The supplied name is not available." msgstr "提供的名稱不可用。" -#: src/slic3r/GUI/SavePresetDialog.cpp:122 +#: src/slic3r/GUI/SavePresetDialog.cpp:186 +msgid "The supplied name is used for a system profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:187 msgid "Cannot overwrite a system profile." msgstr "無法覆蓋系統配置文件。" -#: src/slic3r/GUI/SavePresetDialog.cpp:127 +#: src/slic3r/GUI/SavePresetDialog.cpp:192 +msgid "The supplied name is used for a external profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:193 msgid "Cannot overwrite an external profile." msgstr "無法覆蓋外部配置文件。" -#: src/slic3r/GUI/SavePresetDialog.cpp:134 +#: src/slic3r/GUI/SavePresetDialog.cpp:203 +msgid "Save preset modifications to existing user profile" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:205 +msgid "Nothing changed" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:210 #, boost-format msgid "Preset with name \"%1%\" already exists." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:136 +#: src/slic3r/GUI/SavePresetDialog.cpp:212 #, boost-format msgid "" "Preset with name \"%1%\" already exists and is incompatible with selected " "printer." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:137 +#: src/slic3r/GUI/SavePresetDialog.cpp:213 msgid "Note: This preset will be replaced after saving" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:142 +#: src/slic3r/GUI/SavePresetDialog.cpp:219 msgid "The name cannot be empty." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:147 +#: src/slic3r/GUI/SavePresetDialog.cpp:230 +msgid "The name is too long." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:235 msgid "The name cannot start with space character." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:152 +#: src/slic3r/GUI/SavePresetDialog.cpp:240 msgid "The name cannot end with space character." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:157 +#: src/slic3r/GUI/SavePresetDialog.cpp:245 msgid "The name cannot be the same as a preset alias name." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:191 -#: src/slic3r/GUI/SavePresetDialog.cpp:197 +#: src/slic3r/GUI/SavePresetDialog.cpp:289 msgid "Save preset" msgstr "保存預設" -#: src/slic3r/GUI/SavePresetDialog.cpp:221 +#: src/slic3r/GUI/SavePresetDialog.cpp:295 +msgid "Save presets" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:302 +msgid "Rename preset" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:327 msgctxt "PresetName" msgid "Copy" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:283 +#: src/slic3r/GUI/SavePresetDialog.cpp:347 +msgid "Save as profile derived from current printer only." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:407 #, boost-format msgid "" "You have selected physical printer \"%1%\" \n" "with related printer preset \"%2%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:322 +#: src/slic3r/GUI/SavePresetDialog.cpp:446 #, boost-format msgid "What would you like to do with \"%1%\" preset after saving?" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:325 +#: src/slic3r/GUI/SavePresetDialog.cpp:449 #, boost-format msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:326 +#: src/slic3r/GUI/SavePresetDialog.cpp:450 #, boost-format msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:327 +#: src/slic3r/GUI/SavePresetDialog.cpp:451 #, boost-format msgid "Just switch to \"%1%\" preset" msgstr "" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2652 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2645 msgid "Stealth" msgstr "" -#: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2646 +#: src/slic3r/GUI/Search.cpp:97 src/slic3r/GUI/Search.cpp:391 +#: src/slic3r/GUI/Tab.cpp:2639 msgid "Normal" msgstr "正常" -#: src/slic3r/GUI/Selection.cpp:168 +#: src/slic3r/GUI/Selection.cpp:180 msgid "Selection-Add" msgstr "" -#: src/slic3r/GUI/Selection.cpp:209 +#: src/slic3r/GUI/Selection.cpp:221 msgid "Selection-Remove" msgstr "" -#: src/slic3r/GUI/Selection.cpp:241 +#: src/slic3r/GUI/Selection.cpp:253 msgid "Selection-Add Object" msgstr "" -#: src/slic3r/GUI/Selection.cpp:260 +#: src/slic3r/GUI/Selection.cpp:272 msgid "Selection-Remove Object" msgstr "" -#: src/slic3r/GUI/Selection.cpp:278 +#: src/slic3r/GUI/Selection.cpp:290 msgid "Selection-Add Instance" msgstr "" -#: src/slic3r/GUI/Selection.cpp:297 +#: src/slic3r/GUI/Selection.cpp:309 msgid "Selection-Remove Instance" msgstr "" -#: src/slic3r/GUI/Selection.cpp:394 +#: src/slic3r/GUI/Selection.cpp:406 msgid "Selection-Add All" msgstr "" -#: src/slic3r/GUI/Selection.cpp:419 +#: src/slic3r/GUI/Selection.cpp:431 msgid "Selection-Remove All" msgstr "" -#: src/slic3r/GUI/Selection.cpp:950 +#: src/slic3r/GUI/Selection.cpp:1309 msgid "Scale To Fit" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:114 +#: src/slic3r/GUI/Selection.cpp:1691 +msgid "" +"The currently manipulated object is tilted or contains tilted parts " +"(rotation angles are not multiples of 90°). Non-uniform scaling of tilted " +"objects is only possible in non-local coordinate systems, once the rotation " +"is embedded into the object coordinates." +msgstr "" + +#: src/slic3r/GUI/Selection.cpp:1694 +msgid "This operation is irreversible." +msgstr "" + +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:117 msgid "Data to send" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:550 -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:618 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:557 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:624 msgid "Send system info" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:581 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:587 #, boost-format msgid "" "This is the first time you are running %1%. We would like to ask you to send " @@ -7982,18 +9535,18 @@ msgid "" "version)." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:585 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:591 msgid "" "If we know your hardware, operating system, etc., it will greatly help us in " "development and prioritization, because we will be able to focus our effort " "more efficiently and spend time on features that are needed the most." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:588 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:594 msgid "Is it safe?" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:590 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:596 #, boost-format msgid "" "We do not send any personal information nor anything that would allow us to " @@ -8004,81 +9557,86 @@ msgid "" "inspect the code actually performing the communication, see %1%." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:614 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:620 msgid "Show verbatim data that will be sent" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:616 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:622 msgid "Ask me next time" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:617 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:623 msgid "Do not send anything" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:703 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:709 msgid "System info sent successfully. Thank you." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:706 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:712 msgid "Sending system info failed!" msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:713 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:719 msgid "Sending system info was cancelled." msgstr "" -#: src/slic3r/GUI/SendSystemInfoDialog.cpp:720 +#: src/slic3r/GUI/SendSystemInfoDialog.cpp:726 msgid "Sending system info..." msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:84 +#: src/slic3r/GUI/SysInfoDialog.cpp:92 msgid "System Information" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:150 +#: src/slic3r/GUI/SysInfoDialog.cpp:160 msgid "Blacklisted libraries loaded into PrusaSlicer process:" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:162 +#: src/slic3r/GUI/SysInfoDialog.cpp:172 msgid "Eigen vectorization supported:" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:169 +#: src/slic3r/GUI/SysInfoDialog.cpp:179 msgid "Copy to Clipboard" msgstr "" -#: src/slic3r/GUI/Tab.cpp:114 src/libslic3r/PrintConfig.cpp:565 +#: src/slic3r/GUI/Tab.cpp:68 src/libslic3r/PrintConfig.cpp:668 msgid "Compatible printers" msgstr "兼容的印表機" -#: src/slic3r/GUI/Tab.cpp:115 +#: src/slic3r/GUI/Tab.cpp:69 msgid "Select the printers this profile is compatible with." msgstr "選擇與此配置文件兼容的印表機。" -#: src/slic3r/GUI/Tab.cpp:120 src/libslic3r/PrintConfig.cpp:580 +#: src/slic3r/GUI/Tab.cpp:74 src/libslic3r/PrintConfig.cpp:683 msgid "Compatible print profiles" msgstr "兼容的列印配置文件" -#: src/slic3r/GUI/Tab.cpp:121 +#: src/slic3r/GUI/Tab.cpp:75 msgid "Select the print profiles this profile is compatible with." msgstr "選擇與此配置文件兼容的列印配置文件。" -#: src/slic3r/GUI/Tab.cpp:216 +#: src/slic3r/GUI/Tab.cpp:165 msgid "Compare this preset with some another" msgstr "" #. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:218 +#: src/slic3r/GUI/Tab.cpp:167 #, c-format, boost-format msgid "Save current %s" msgstr "" -#: src/slic3r/GUI/Tab.cpp:219 +#: src/slic3r/GUI/Tab.cpp:168 +#, c-format, boost-format +msgid "Rename current %s" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:170 msgid "Delete this preset" msgstr "刪除該預設" -#: src/slic3r/GUI/Tab.cpp:223 +#: src/slic3r/GUI/Tab.cpp:174 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." @@ -8086,237 +9644,245 @@ msgstr "" "將光標懸停在按鈕上以查找更多信息\n" "或單擊此按鈕。" -#: src/slic3r/GUI/Tab.cpp:227 +#: src/slic3r/GUI/Tab.cpp:178 #, boost-format msgid "Search in settings [%1%]" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1298 +#: src/slic3r/GUI/Tab.cpp:1243 msgid "Detach from system preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1311 +#: src/slic3r/GUI/Tab.cpp:1256 msgid "" "A copy of the current system preset will be created, which will be detached " "from the system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1312 +#: src/slic3r/GUI/Tab.cpp:1257 msgid "" "The current custom preset will be detached from the parent system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1315 +#: src/slic3r/GUI/Tab.cpp:1260 msgid "Modifications to the current profile will be saved." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1321 +#: src/slic3r/GUI/Tab.cpp:1266 msgid "Detach preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1347 +#: src/slic3r/GUI/Tab.cpp:1292 msgid "This is a default preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1349 +#: src/slic3r/GUI/Tab.cpp:1294 msgid "This is a system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1351 +#: src/slic3r/GUI/Tab.cpp:1296 msgid "Current preset is inherited from the default preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1355 +#: src/slic3r/GUI/Tab.cpp:1300 msgid "Current preset is inherited from" msgstr "當前預設繼承自" -#: src/slic3r/GUI/Tab.cpp:1359 +#: src/slic3r/GUI/Tab.cpp:1304 msgid "It can't be deleted or modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1360 +#: src/slic3r/GUI/Tab.cpp:1305 msgid "" "Any modifications should be saved as a new preset inherited from this one." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1361 +#: src/slic3r/GUI/Tab.cpp:1306 msgid "To do that please specify a new name for the preset." msgstr "爲此, 請爲預設指定新名稱。" -#: src/slic3r/GUI/Tab.cpp:1365 +#: src/slic3r/GUI/Tab.cpp:1310 msgid "Additional information:" msgstr "附加信息:" -#: src/slic3r/GUI/Tab.cpp:1371 +#: src/slic3r/GUI/Tab.cpp:1316 msgid "printer model" msgstr "印表機型號" -#: src/slic3r/GUI/Tab.cpp:1379 +#: src/slic3r/GUI/Tab.cpp:1324 msgid "default print profile" msgstr "默認 SLA 列印配置文件" -#: src/slic3r/GUI/Tab.cpp:1382 +#: src/slic3r/GUI/Tab.cpp:1327 msgid "default filament profile" msgstr "默認耗材絲配置" -#: src/slic3r/GUI/Tab.cpp:1396 +#: src/slic3r/GUI/Tab.cpp:1341 msgid "default SLA material profile" msgstr "默認 SLA 材料配置文件" -#: src/slic3r/GUI/Tab.cpp:1400 +#: src/slic3r/GUI/Tab.cpp:1345 msgid "default SLA print profile" msgstr "默認 SLA 列印配置文件" -#: src/slic3r/GUI/Tab.cpp:1408 +#: src/slic3r/GUI/Tab.cpp:1353 msgid "full profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1409 +#: src/slic3r/GUI/Tab.cpp:1354 msgid "symbolic profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4657 +#: src/slic3r/GUI/Tab.cpp:1392 src/slic3r/GUI/Tab.cpp:4940 msgid "Layers and perimeters" msgstr "層和輪廓" -#: src/slic3r/GUI/Tab.cpp:1453 +#: src/slic3r/GUI/Tab.cpp:1398 msgid "Vertical shells" msgstr "垂直外殼" -#: src/slic3r/GUI/Tab.cpp:1465 +#: src/slic3r/GUI/Tab.cpp:1410 msgid "Horizontal shells" msgstr "水平外殼" -#: src/slic3r/GUI/Tab.cpp:1466 src/libslic3r/PrintConfig.cpp:2417 +#: src/slic3r/GUI/Tab.cpp:1411 src/libslic3r/PrintConfig.cpp:2448 msgid "Solid layers" msgstr "可靠層數" -#: src/slic3r/GUI/Tab.cpp:1471 +#: src/slic3r/GUI/Tab.cpp:1416 msgid "Minimum shell thickness" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1482 +#: src/slic3r/GUI/Tab.cpp:1427 msgid "Quality (slower slicing)" msgstr "質量 (慢切)" -#: src/slic3r/GUI/Tab.cpp:1497 +#: src/slic3r/GUI/Tab.cpp:1444 msgid "Fuzzy skin (experimental)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1520 +#: src/slic3r/GUI/Tab.cpp:1467 msgid "Reducing printing time" msgstr "縮短列印時間" -#: src/slic3r/GUI/Tab.cpp:1535 src/libslic3r/ExtrusionEntity.cpp:370 +#: src/slic3r/GUI/Tab.cpp:1482 msgid "Skirt" msgstr "裙邊" -#: src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1504 msgid "Raft" msgstr "基座" -#: src/slic3r/GUI/Tab.cpp:1562 +#: src/slic3r/GUI/Tab.cpp:1509 msgid "Options for support material and raft" msgstr "支撐材料和基座的選項" -#: src/slic3r/GUI/Tab.cpp:1582 +#: src/slic3r/GUI/Tab.cpp:1528 +msgid "Organic supports" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1537 msgid "Speed for print moves" msgstr "列印移動的速度" -#: src/slic3r/GUI/Tab.cpp:1595 +#: src/slic3r/GUI/Tab.cpp:1550 +msgid "Dynamic overhang speed" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1557 msgid "Speed for non-print moves" msgstr "非列印移動的速度" -#: src/slic3r/GUI/Tab.cpp:1599 +#: src/slic3r/GUI/Tab.cpp:1561 msgid "Modifiers" msgstr "武器性能修改" -#: src/slic3r/GUI/Tab.cpp:1603 +#: src/slic3r/GUI/Tab.cpp:1565 msgid "Acceleration control (advanced)" msgstr "加速控制 (高級)" -#: src/slic3r/GUI/Tab.cpp:1614 +#: src/slic3r/GUI/Tab.cpp:1576 msgid "Autospeed (advanced)" msgstr "自動調速 (高級)" -#: src/slic3r/GUI/Tab.cpp:1618 +#: src/slic3r/GUI/Tab.cpp:1580 msgid "Pressure equalizer (experimental)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1622 +#: src/slic3r/GUI/Tab.cpp:1584 msgid "Multiple Extruders" msgstr "多個擠出頭" -#: src/slic3r/GUI/Tab.cpp:1630 +#: src/slic3r/GUI/Tab.cpp:1592 msgid "Ooze prevention" msgstr "Ooze 預防" -#: src/slic3r/GUI/Tab.cpp:1650 +#: src/slic3r/GUI/Tab.cpp:1596 +msgid "Wipe tower" +msgstr "擦料塔" + +#: src/slic3r/GUI/Tab.cpp:1612 msgid "Extrusion width" msgstr "擠出寬度" -#: src/slic3r/GUI/Tab.cpp:1660 +#: src/slic3r/GUI/Tab.cpp:1622 msgid "Overlap" msgstr "交疊" -#: src/slic3r/GUI/Tab.cpp:1663 +#: src/slic3r/GUI/Tab.cpp:1625 msgid "Flow" msgstr "流量" -#: src/slic3r/GUI/Tab.cpp:1674 src/slic3r/GUI/Tab.cpp:1700 -msgid "Other" -msgstr "其他" - -#: src/slic3r/GUI/Tab.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:1636 msgid "Arachne perimeter generator" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1685 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1644 src/slic3r/GUI/Tab.cpp:4990 msgid "Output options" msgstr "輸出選項" -#: src/slic3r/GUI/Tab.cpp:1686 +#: src/slic3r/GUI/Tab.cpp:1645 msgid "Sequential printing" msgstr "順序列印" -#: src/slic3r/GUI/Tab.cpp:1688 +#: src/slic3r/GUI/Tab.cpp:1647 msgid "Extruder clearance" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:4735 +#: src/slic3r/GUI/Tab.cpp:1652 src/slic3r/GUI/Tab.cpp:4991 msgid "Output file" msgstr "輸出文件" -#: src/slic3r/GUI/Tab.cpp:1712 src/libslic3r/PrintConfig.cpp:2042 +#: src/slic3r/GUI/Tab.cpp:1671 src/libslic3r/PrintConfig.cpp:2072 msgid "Post-processing scripts" msgstr "後處理腳本" -#: src/slic3r/GUI/Tab.cpp:1724 src/slic3r/GUI/Tab.cpp:1725 -#: src/slic3r/GUI/Tab.cpp:2110 src/slic3r/GUI/Tab.cpp:2111 -#: src/slic3r/GUI/Tab.cpp:2498 src/slic3r/GUI/Tab.cpp:2499 -#: src/slic3r/GUI/Tab.cpp:2571 src/slic3r/GUI/Tab.cpp:2572 -#: src/slic3r/GUI/Tab.cpp:3957 src/slic3r/GUI/Tab.cpp:4585 -#: src/slic3r/GUI/Tab.cpp:4586 +#: src/slic3r/GUI/Tab.cpp:1683 src/slic3r/GUI/Tab.cpp:1684 +#: src/slic3r/GUI/Tab.cpp:2080 src/slic3r/GUI/Tab.cpp:2081 +#: src/slic3r/GUI/Tab.cpp:2486 src/slic3r/GUI/Tab.cpp:2487 +#: src/slic3r/GUI/Tab.cpp:2564 src/slic3r/GUI/Tab.cpp:2565 +#: src/slic3r/GUI/Tab.cpp:4182 src/slic3r/GUI/Tab.cpp:4822 +#: src/slic3r/GUI/Tab.cpp:4823 msgid "Notes" msgstr "備註" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:2088 +#: src/slic3r/GUI/Tab.cpp:2493 src/slic3r/GUI/Tab.cpp:2571 +#: src/slic3r/GUI/Tab.cpp:4830 src/slic3r/GUI/Tab.cpp:4996 msgid "Dependencies" msgstr "依賴" -#: src/slic3r/GUI/Tab.cpp:1732 src/slic3r/GUI/Tab.cpp:2119 -#: src/slic3r/GUI/Tab.cpp:2506 src/slic3r/GUI/Tab.cpp:2579 -#: src/slic3r/GUI/Tab.cpp:4594 src/slic3r/GUI/Tab.cpp:4741 +#: src/slic3r/GUI/Tab.cpp:1691 src/slic3r/GUI/Tab.cpp:2089 +#: src/slic3r/GUI/Tab.cpp:2494 src/slic3r/GUI/Tab.cpp:2572 +#: src/slic3r/GUI/Tab.cpp:4831 src/slic3r/GUI/Tab.cpp:4997 msgid "Profile dependencies" msgstr "配置文件依賴" -#: src/slic3r/GUI/Tab.cpp:1771 +#: src/slic3r/GUI/Tab.cpp:1723 msgid "Post processing scripts shall modify G-code file in place." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1850 +#: src/slic3r/GUI/Tab.cpp:1802 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8328,7 +9894,7 @@ msgid_plural "" "printing time estimation." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:1855 +#: src/slic3r/GUI/Tab.cpp:1807 msgid "Found reserved keywords in" msgstr "" @@ -8336,74 +9902,90 @@ msgstr "" msgid "Filament Overrides" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1992 +#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2827 +msgid "Retraction" +msgstr "回縮" + +#: src/slic3r/GUI/Tab.cpp:1951 +msgid "Temperature" +msgstr "溫度" + +#: src/slic3r/GUI/Tab.cpp:1955 msgid "Nozzle" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1997 +#: src/slic3r/GUI/Tab.cpp:1960 msgid "Bed" msgstr "牀" -#: src/slic3r/GUI/Tab.cpp:2002 +#: src/slic3r/GUI/Tab.cpp:1965 msgid "Cooling" msgstr "冷卻" -#: src/slic3r/GUI/Tab.cpp:2004 src/libslic3r/PrintConfig.cpp:1936 -#: src/libslic3r/PrintConfig.cpp:2994 +#: src/slic3r/GUI/Tab.cpp:1967 src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "Enable" msgstr "使能" -#: src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/Tab.cpp:1978 msgid "Fan settings" msgstr "風扇設置" -#: src/slic3r/GUI/Tab.cpp:2026 +#: src/slic3r/GUI/Tab.cpp:1979 +msgid "Fan speed" +msgstr "風扇速度" + +#: src/slic3r/GUI/Tab.cpp:1989 +msgid "Dynamic fan speeds" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1996 msgid "Cooling thresholds" msgstr "冷卻閾值" -#: src/slic3r/GUI/Tab.cpp:2032 +#: src/slic3r/GUI/Tab.cpp:2002 msgid "Filament properties" msgstr "耗材絲特性" -#: src/slic3r/GUI/Tab.cpp:2039 +#: src/slic3r/GUI/Tab.cpp:2009 msgid "Print speed override" msgstr "列印速度覆蓋" -#: src/slic3r/GUI/Tab.cpp:2049 +#: src/slic3r/GUI/Tab.cpp:2019 msgid "Wipe tower parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2052 +#: src/slic3r/GUI/Tab.cpp:2022 msgid "Toolchange parameters with single extruder MM printers" msgstr "單擠出機 MM 印表機的工具更換參數" -#: src/slic3r/GUI/Tab.cpp:2065 +#: src/slic3r/GUI/Tab.cpp:2035 msgid "Ramming settings" msgstr "衝壓設置" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 -#: src/slic3r/GUI/Tab.cpp:4264 src/libslic3r/GCode.cpp:733 -#: src/libslic3r/PrintConfig.cpp:2500 +#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:2398 +#: src/slic3r/GUI/Tab.cpp:4493 src/libslic3r/GCode.cpp:684 +#: src/libslic3r/PrintConfig.cpp:2532 msgid "Custom G-code" msgstr "自定義 G-code" -#: src/slic3r/GUI/Tab.cpp:2090 src/slic3r/GUI/Tab.cpp:2411 -#: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2450 -#: src/libslic3r/PrintConfig.cpp:2465 +#: src/slic3r/GUI/Tab.cpp:2060 src/slic3r/GUI/Tab.cpp:2399 +#: src/libslic3r/GCode.cpp:658 src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2497 msgid "Start G-code" msgstr "起始G代碼" -#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:2421 -#: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:685 -#: src/libslic3r/PrintConfig.cpp:695 +#: src/slic3r/GUI/Tab.cpp:2070 src/slic3r/GUI/Tab.cpp:2409 +#: src/libslic3r/GCode.cpp:659 src/libslic3r/PrintConfig.cpp:788 +#: src/libslic3r/PrintConfig.cpp:798 msgid "End G-code" msgstr "結尾G代碼" -#: src/slic3r/GUI/Tab.cpp:2153 +#: src/slic3r/GUI/Tab.cpp:2115 msgid "Volumetric flow hints not available" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2257 +#: src/slic3r/GUI/Tab.cpp:2241 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -8416,20 +9998,20 @@ msgid "" "physical_printer directory." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2291 src/slic3r/GUI/Tab.cpp:2518 +#: src/slic3r/GUI/Tab.cpp:2275 src/slic3r/GUI/Tab.cpp:2506 msgid "Size and coordinates" msgstr "尺寸和座標" -#: src/slic3r/GUI/Tab.cpp:2300 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 +#: src/slic3r/GUI/Tab.cpp:2284 src/slic3r/GUI/UnsavedChangesDialog.cpp:1302 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1854 msgid "Capabilities" msgstr "權限" -#: src/slic3r/GUI/Tab.cpp:2305 +#: src/slic3r/GUI/Tab.cpp:2289 msgid "Number of extruders of the printer." msgstr "印表機擠出機的數量。" -#: src/slic3r/GUI/Tab.cpp:2334 +#: src/slic3r/GUI/Tab.cpp:2322 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -8437,133 +10019,141 @@ msgid "" "nozzle diameter value?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2338 src/slic3r/GUI/Tab.cpp:2782 -#: src/libslic3r/PrintConfig.cpp:1900 +#: src/slic3r/GUI/Tab.cpp:2326 src/slic3r/GUI/Tab.cpp:2714 +#: src/libslic3r/PrintConfig.cpp:1937 msgid "Nozzle diameter" msgstr "噴嘴直徑" -#: src/slic3r/GUI/Tab.cpp:2431 src/libslic3r/GCode.cpp:709 -#: src/libslic3r/PrintConfig.cpp:425 +#: src/slic3r/GUI/Tab.cpp:2419 src/libslic3r/GCode.cpp:660 +#: src/libslic3r/PrintConfig.cpp:444 msgid "Before layer change G-code" msgstr "層改變前的G代碼" -#: src/slic3r/GUI/Tab.cpp:2441 src/libslic3r/GCode.cpp:710 -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/slic3r/GUI/Tab.cpp:2429 src/libslic3r/GCode.cpp:661 +#: src/libslic3r/PrintConfig.cpp:1665 msgid "After layer change G-code" msgstr "層變化後G代碼" -#: src/slic3r/GUI/Tab.cpp:2451 src/libslic3r/GCode.cpp:711 -#: src/libslic3r/PrintConfig.cpp:2877 +#: src/slic3r/GUI/Tab.cpp:2439 src/libslic3r/GCode.cpp:662 +#: src/libslic3r/PrintConfig.cpp:2965 msgid "Tool change G-code" msgstr "切換工具G代碼" -#: src/slic3r/GUI/Tab.cpp:2461 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2449 src/libslic3r/GCode.cpp:663 msgid "Between objects G-code (for sequential printing)" msgstr "模型對象之間的 G-code (用於順序列印)" -#: src/slic3r/GUI/Tab.cpp:2471 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2459 src/libslic3r/GCode.cpp:664 msgid "Color Change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2480 src/libslic3r/GCode.cpp:714 -#: src/libslic3r/PrintConfig.cpp:2491 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:665 +#: src/libslic3r/PrintConfig.cpp:2523 msgid "Pause Print G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2489 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:666 msgid "Template Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2525 +#: src/slic3r/GUI/Tab.cpp:2513 msgid "Display" msgstr "顯示" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2528 msgid "Tilt" msgstr "傾斜" -#: src/slic3r/GUI/Tab.cpp:2541 +#: src/slic3r/GUI/Tab.cpp:2529 msgid "Tilt time" msgstr "傾斜時間" -#: src/slic3r/GUI/Tab.cpp:2548 src/slic3r/GUI/Tab.cpp:4575 +#: src/slic3r/GUI/Tab.cpp:2536 src/slic3r/GUI/Tab.cpp:4812 msgid "Corrections" msgstr "修正" -#: src/slic3r/GUI/Tab.cpp:2561 src/slic3r/GUI/Tab.cpp:4571 +#: src/slic3r/GUI/Tab.cpp:2549 src/slic3r/GUI/Tab.cpp:4808 msgid "Exposure" msgstr "曝光" -#: src/slic3r/GUI/Tab.cpp:2622 src/slic3r/GUI/Tab.cpp:2709 -#: src/libslic3r/PrintConfig.cpp:1655 src/libslic3r/PrintConfig.cpp:1690 -#: src/libslic3r/PrintConfig.cpp:1707 src/libslic3r/PrintConfig.cpp:1724 -#: src/libslic3r/PrintConfig.cpp:1740 src/libslic3r/PrintConfig.cpp:1750 -#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1773 -#: src/libslic3r/PrintConfig.cpp:1783 +#: src/slic3r/GUI/Tab.cpp:2556 +msgid "Output" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2615 src/slic3r/GUI/Tab.cpp:2875 +#: src/libslic3r/PrintConfig.cpp:1694 src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1744 src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1777 src/libslic3r/PrintConfig.cpp:1787 +#: src/libslic3r/PrintConfig.cpp:1797 src/libslic3r/PrintConfig.cpp:1810 +#: src/libslic3r/PrintConfig.cpp:1820 msgid "Machine limits" msgstr "機器限制" -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2638 msgid "Values in this column are for Normal mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2644 msgid "Values in this column are for Stealth mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2660 +#: src/slic3r/GUI/Tab.cpp:2653 msgid "Maximum feedrates" msgstr "最大進給率" -#: src/slic3r/GUI/Tab.cpp:2665 +#: src/slic3r/GUI/Tab.cpp:2658 msgid "Maximum accelerations" msgstr "最大加速度" -#: src/slic3r/GUI/Tab.cpp:2674 +#: src/slic3r/GUI/Tab.cpp:2667 msgid "Jerk limits" msgstr "抖動限制" -#: src/slic3r/GUI/Tab.cpp:2680 +#: src/slic3r/GUI/Tab.cpp:2673 msgid "Minimum feedrates" msgstr "最小進給率" -#: src/slic3r/GUI/Tab.cpp:2734 src/slic3r/GUI/Tab.cpp:2743 -msgid "Single extruder MM setup" -msgstr "單擠出機 MM 設置" - -#: src/slic3r/GUI/Tab.cpp:2744 -msgid "Single extruder multimaterial parameters" -msgstr "單擠出機多材料參數" - -#: src/slic3r/GUI/Tab.cpp:2779 +#: src/slic3r/GUI/Tab.cpp:2711 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2804 +#: src/slic3r/GUI/Tab.cpp:2739 +msgid "Reset to Filament Color" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2775 +msgid "Apply below setting to other extruders" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2820 msgid "Layer height limits" msgstr "層高度限制" -#: src/slic3r/GUI/Tab.cpp:2809 +#: src/slic3r/GUI/Tab.cpp:2824 msgid "Position (for multi-extruder printers)" msgstr "位置 (適用於多擠出機印表機)" -#: src/slic3r/GUI/Tab.cpp:2815 +#: src/slic3r/GUI/Tab.cpp:2830 msgid "Only lift Z" msgstr "僅提升 Z" -#: src/slic3r/GUI/Tab.cpp:2828 +#: src/slic3r/GUI/Tab.cpp:2843 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "禁用工具時的回縮 (多擠出機設置的高級設置)" -#: src/slic3r/GUI/Tab.cpp:2835 -msgid "Reset to Filament Color" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:2900 src/slic3r/GUI/Tab.cpp:2909 +msgid "Single extruder MM setup" +msgstr "單擠出機 MM 設置" + +#: src/slic3r/GUI/Tab.cpp:2910 +msgid "Single extruder multimaterial parameters" +msgstr "單擠出機多材料參數" -#: src/slic3r/GUI/Tab.cpp:3012 +#: src/slic3r/GUI/Tab.cpp:3074 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -8573,51 +10163,64 @@ msgstr "" "\n" "要禁用它以啓用固件回抽嗎?" -#: src/slic3r/GUI/Tab.cpp:3014 +#: src/slic3r/GUI/Tab.cpp:3076 msgid "Firmware Retraction" msgstr "固件回縮" -#: src/slic3r/GUI/Tab.cpp:3319 +#: src/slic3r/GUI/Tab.cpp:3384 msgid "New printer preset selected" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3625 +#: src/slic3r/GUI/Tab.cpp:3758 msgid "Detached" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3857 +msgid "" +"The physical printer below is based on the preset, you are going to rename." +msgid_plural "" +"The physical printers below are based on the preset, you are going to rename." +msgstr[0] "" + +#: src/slic3r/GUI/Tab.cpp:3862 +msgid "Note, that the selected preset will be renamed in this printer too." +msgid_plural "" +"Note, that the selected preset will be renamed in these printers too." +msgstr[0] "" + +#: src/slic3r/GUI/Tab.cpp:3924 msgid "remove" msgstr "移除" -#: src/slic3r/GUI/Tab.cpp:3702 +#: src/slic3r/GUI/Tab.cpp:3924 msgid "delete" msgstr "刪除" -#: src/slic3r/GUI/Tab.cpp:3711 +#: src/slic3r/GUI/Tab.cpp:3933 msgid "It's a last preset for this physical printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3716 +#: src/slic3r/GUI/Tab.cpp:3938 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " "\"%2%\"?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3728 +#: src/slic3r/GUI/Tab.cpp:3950 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" "The physical printers below are based on the preset, you are going to delete." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3733 +#: src/slic3r/GUI/Tab.cpp:3955 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3738 +#: src/slic3r/GUI/Tab.cpp:3960 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -8626,91 +10229,91 @@ msgid_plural "" "delete." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3743 +#: src/slic3r/GUI/Tab.cpp:3965 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" "Note, that these printers will be deleted after deleting the selected preset." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3748 +#: src/slic3r/GUI/Tab.cpp:3970 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3753 +#: src/slic3r/GUI/Tab.cpp:3975 #, boost-format msgid "%1% Preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3836 src/slic3r/GUI/Tab.cpp:4198 +#: src/slic3r/GUI/Tab.cpp:4061 src/slic3r/GUI/Tab.cpp:4423 msgid "Set" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:4180 msgid "Find" msgstr "尋找" -#: src/slic3r/GUI/Tab.cpp:3956 +#: src/slic3r/GUI/Tab.cpp:4181 msgid "Replace with" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4045 +#: src/slic3r/GUI/Tab.cpp:4270 msgid "Regular expression" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4049 +#: src/slic3r/GUI/Tab.cpp:4274 msgid "Case insensitive" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4053 +#: src/slic3r/GUI/Tab.cpp:4278 msgid "Whole word" msgstr "整個字" -#: src/slic3r/GUI/Tab.cpp:4057 +#: src/slic3r/GUI/Tab.cpp:4282 msgid "Match single line" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4160 +#: src/slic3r/GUI/Tab.cpp:4385 msgid "Are you sure you want to delete all substitutions?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4292 +#: src/slic3r/GUI/Tab.cpp:4521 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4295 +#: src/slic3r/GUI/Tab.cpp:4524 msgid "" "Machine limits will NOT be emitted to G-code, however they will be used to " "estimate print time, which may therefore not be accurate as the printer may " "apply a different set of machine limits." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4299 +#: src/slic3r/GUI/Tab.cpp:4528 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4321 +#: src/slic3r/GUI/Tab.cpp:4550 msgid "LOCKED LOCK" msgstr "" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4323 +#: src/slic3r/GUI/Tab.cpp:4552 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4325 +#: src/slic3r/GUI/Tab.cpp:4554 msgid "UNLOCKED LOCK" msgstr "" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4327 +#: src/slic3r/GUI/Tab.cpp:4556 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -8718,23 +10321,23 @@ msgid "" "to the system (or default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4332 +#: src/slic3r/GUI/Tab.cpp:4561 msgid "WHITE BULLET" msgstr "" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4334 +#: src/slic3r/GUI/Tab.cpp:4563 msgid "" "for the left button: indicates a non-system (or non-default) preset,\n" "for the right button: indicates that the settings hasn't been modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4337 +#: src/slic3r/GUI/Tab.cpp:4566 msgid "BACK ARROW" msgstr "" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4339 +#: src/slic3r/GUI/Tab.cpp:4568 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -8742,13 +10345,13 @@ msgid "" "to the last saved preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4349 +#: src/slic3r/GUI/Tab.cpp:4578 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4351 +#: src/slic3r/GUI/Tab.cpp:4580 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " "equal to the system (or default) values for the current option group.\n" @@ -8756,17 +10359,17 @@ msgid "" "default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4354 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4357 +#: src/slic3r/GUI/Tab.cpp:4586 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." msgstr "白色子彈圖標表示設置與當前選項組上次保存的預設中的設置相同。" -#: src/slic3r/GUI/Tab.cpp:4359 +#: src/slic3r/GUI/Tab.cpp:4588 msgid "" "BACK ARROW icon indicates that the settings were changed and are not equal " "to the last saved preset for the current option group.\n" @@ -8776,26 +10379,26 @@ msgstr "" "\"後退箭頭\" 圖標表示設置已更改, 與當前選項組的上次保存的預設不相等。\n" "單擊可將當前選項組的所有設置重置爲上次保存的預設。" -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4594 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4366 +#: src/slic3r/GUI/Tab.cpp:4595 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" "Click to reset current value to the system (or default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4601 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." msgstr "白色子彈圖標表示該值與上次保存的預設中的值相同。" -#: src/slic3r/GUI/Tab.cpp:4373 +#: src/slic3r/GUI/Tab.cpp:4602 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -8804,105 +10407,103 @@ msgstr "" "\"後退箭頭\" 圖標表示該值已更改, 不等於上次保存的預設。\n" "單擊可將當前值重置爲上次保存的預設。" -#: src/slic3r/GUI/Tab.cpp:4527 src/slic3r/GUI/Tab.cpp:4529 +#: src/slic3r/GUI/Tab.cpp:4764 src/slic3r/GUI/Tab.cpp:4766 msgid "Material" msgstr "材料" -#: src/slic3r/GUI/Tab.cpp:4614 src/slic3r/GUI/Tab.cpp:4615 +#: src/slic3r/GUI/Tab.cpp:4851 src/slic3r/GUI/Tab.cpp:4852 msgid "Material printing profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4667 +#: src/slic3r/GUI/Tab.cpp:4901 msgid "Support head" msgstr "支撐頭部寬度" -#: src/slic3r/GUI/Tab.cpp:4672 +#: src/slic3r/GUI/Tab.cpp:4906 msgid "Support pillar" msgstr "支撐支柱" -#: src/slic3r/GUI/Tab.cpp:4695 +#: src/slic3r/GUI/Tab.cpp:4929 msgid "Connection of the support sticks and junctions" msgstr "支撐杆和連接點的連接" -#: src/slic3r/GUI/Tab.cpp:4700 +#: src/slic3r/GUI/Tab.cpp:4956 msgid "Automatic generation" msgstr "自動生成" -#: src/slic3r/GUI/Tab.cpp:4775 +#: src/slic3r/GUI/Tab.cpp:5024 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" "To enable \"%1%\", please switch off \"%2%\"" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3724 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3497 msgid "Object elevation" msgstr "對象高程" -#: src/slic3r/GUI/Tab.cpp:4777 src/libslic3r/PrintConfig.cpp:3826 +#: src/slic3r/GUI/Tab.cpp:5026 src/libslic3r/PrintConfig.cpp:3958 msgid "Pad around object" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:153 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:162 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1047 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1100 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1115 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1130 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1145 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:147 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:156 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:165 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1107 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1122 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1137 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1152 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1197 msgid "Undef" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:772 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:792 msgid "Unsaved Changes" msgstr "未保存的更改" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:790 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:810 msgid "Switching Presets: Unsaved Changes" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:832 -msgid "Old Value" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:858 +msgid "Original Value" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:859 +msgid "Modified Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:833 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:861 msgid "New Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:867 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 msgid "Keep" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:864 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:892 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1569 msgid "Transfer" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 msgid "Don't save" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:871 -msgid "Discard" -msgstr "" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:877 -msgid "Save" -msgstr "儲存" - -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:898 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:926 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "create new project" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:927 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "switch a preset" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:900 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:928 msgid "" "You will not be asked about the unsaved changes in presets the next time " "you: \n" @@ -8910,178 +10511,276 @@ msgid "" "- Loading a new project while some presets are modified" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:903 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:931 msgid "PrusaSlicer will remember your action." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:904 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:932 #, boost-format msgid "" "Visit \"Preferences\" and check \"%1%\"\n" "to be asked about unsaved changes again." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:964 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1772 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will not be saved" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:938 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:966 msgid "All settings changes will be discarded." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:941 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:969 msgid "Save the selected options." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:942 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:970 msgid "Keep the selected settings." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:943 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:971 msgid "Transfer the selected settings to the newly selected preset." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:947 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:975 #, boost-format msgid "Save the selected options to preset \"%1%\"." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:948 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:976 #, boost-format msgid "Transfer the selected options to the newly selected preset \"%1%\"." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1224 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1237 msgid "The following preset was modified" msgid_plural "The following presets were modified" msgstr[0] "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1230 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1243 #, boost-format msgid "Preset \"%1%\" has the following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1234 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1247 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new printer profile and it has the " "following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1235 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1248 #, boost-format msgid "" "Preset \"%1%\" is not compatible with the new print profile and it has the " "following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1297 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1850 msgid "Extruders count" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 -msgid "Select presets to compare" -msgstr "" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1326 +msgid "The preset modifications are successfully saved" +msgid_plural "The presets modifications are successfully saved" +msgstr[0] "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1515 msgid "Show all presets (including incompatible)" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1533 +msgid "Select presets to compare" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1545 msgid "Left Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1546 msgid "Right Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1595 +msgid "" +"Transfer the selected options from left preset to the right.\n" +"Note: New modified presets will be selected in settings tabs after close " +"this dialog." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1603 +msgid "Save the selected options from left preset to the right." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1621 +msgid "Transfer values from left to right" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1622 +msgid "" +"If enabled, this dialog can be used for transver selected values from left " +"to right preset." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1807 msgid "One of the presets doesn't found" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1818 msgid "Compared presets has different printer technology" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1832 msgid "Presets are the same" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1840 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef category" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1864 msgid "Undef group" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:2016 +msgid "Modified" +msgstr "修改日期" + +#: src/slic3r/GUI/UpdateDialogs.cpp:41 msgid "Update available" msgstr "更新可用" -#: src/slic3r/GUI/UpdateDialogs.cpp:37 +#: src/slic3r/GUI/UpdateDialogs.cpp:41 #, c-format, boost-format msgid "New version of %s is available" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:42 +#: src/slic3r/GUI/UpdateDialogs.cpp:46 src/slic3r/GUI/UpdateDialogs.cpp:101 msgid "Current version:" msgstr "當前版本:" -#: src/slic3r/GUI/UpdateDialogs.cpp:44 +#: src/slic3r/GUI/UpdateDialogs.cpp:48 src/slic3r/GUI/UpdateDialogs.cpp:103 +#: src/slic3r/GUI/UpdateDialogs.cpp:141 msgid "New version:" msgstr "新版本:" -#: src/slic3r/GUI/UpdateDialogs.cpp:52 +#: src/slic3r/GUI/UpdateDialogs.cpp:56 msgid "Changelog & Download" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:59 src/slic3r/GUI/UpdateDialogs.cpp:133 -#: src/slic3r/GUI/UpdateDialogs.cpp:191 +#: src/slic3r/GUI/UpdateDialogs.cpp:63 src/slic3r/GUI/UpdateDialogs.cpp:309 +#: src/slic3r/GUI/UpdateDialogs.cpp:367 msgid "Open changelog page" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:65 +#: src/slic3r/GUI/UpdateDialogs.cpp:69 msgid "Open download page" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:72 +#: src/slic3r/GUI/UpdateDialogs.cpp:76 src/slic3r/GUI/UpdateDialogs.cpp:109 msgid "Don't notify about new releases any more" msgstr "不再通知有關新版本的信息" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +msgid "App Update available" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:98 +#, c-format, boost-format +msgid "" +"New version of %s is available.\n" +"Do you wish to download it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +msgid "App Update download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:138 +#, c-format, boost-format +msgid "New version of %s is available." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:146 +msgid "Run installer after download. (Otherwise file explorer will be opened)" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:151 +msgid "Target directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:158 +msgid "Select directory" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:176 +msgid "Select directory:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:193 +msgid "Download" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:204 +msgid "Directory path is empty." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:212 +msgid "Directory path is incorrect." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:217 +#, boost-format +msgid "Directory %1% doesn't exists. Do you wish to create it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:222 +msgid "Failed to create directory." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:229 +#, boost-format +msgid "File %1% already exists. Do you wish to overwrite it?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:234 +#, boost-format +msgid "Download path is %1%. Do you wish to continue?" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:270 msgid "Opening Configuration Wizard" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 src/slic3r/GUI/UpdateDialogs.cpp:261 +#: src/slic3r/GUI/UpdateDialogs.cpp:270 src/slic3r/GUI/UpdateDialogs.cpp:437 msgid "Configuration update" msgstr "配置更新" -#: src/slic3r/GUI/UpdateDialogs.cpp:95 +#: src/slic3r/GUI/UpdateDialogs.cpp:271 msgid "" "PrusaSlicer is not using the newest configuration available.\n" "Configuration Wizard may not offer the latest printers, filaments and SLA " "materials to be installed." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:97 +#: src/slic3r/GUI/UpdateDialogs.cpp:273 msgid "Configuration update is available" msgstr "配置更新可用" -#: src/slic3r/GUI/UpdateDialogs.cpp:100 +#: src/slic3r/GUI/UpdateDialogs.cpp:276 msgid "" "Would you like to install it?\n" "\n" @@ -9096,28 +10795,28 @@ msgstr "" "\n" "更新的配置包:" -#: src/slic3r/GUI/UpdateDialogs.cpp:121 src/slic3r/GUI/UpdateDialogs.cpp:181 +#: src/slic3r/GUI/UpdateDialogs.cpp:297 src/slic3r/GUI/UpdateDialogs.cpp:357 msgid "Comment:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:142 +#: src/slic3r/GUI/UpdateDialogs.cpp:318 msgid "Install" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:144 +#: src/slic3r/GUI/UpdateDialogs.cpp:320 msgid "Don't install" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 src/slic3r/GUI/UpdateDialogs.cpp:212 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 src/slic3r/GUI/UpdateDialogs.cpp:388 #, c-format, boost-format msgid "%s incompatibility" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 +#: src/slic3r/GUI/UpdateDialogs.cpp:333 msgid "You must install a configuration update." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:160 +#: src/slic3r/GUI/UpdateDialogs.cpp:336 #, c-format, boost-format msgid "" "%s will now start updates. Otherwise it won't be able to start.\n" @@ -9128,17 +10827,12 @@ msgid "" "Updated configuration bundles:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:200 src/slic3r/GUI/UpdateDialogs.cpp:247 -#, c-format, boost-format -msgid "Exit %s" -msgstr "" - -#: src/slic3r/GUI/UpdateDialogs.cpp:213 +#: src/slic3r/GUI/UpdateDialogs.cpp:389 #, c-format, boost-format msgid "%s configuration is incompatible" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:216 +#: src/slic3r/GUI/UpdateDialogs.cpp:392 #, c-format, boost-format msgid "" "This version of %s is not compatible with currently installed configuration " @@ -9151,20 +10845,20 @@ msgid "" "existing configuration before installing files compatible with this %s." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#: src/slic3r/GUI/UpdateDialogs.cpp:401 #, c-format, boost-format msgid "This %s version: %s" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:230 +#: src/slic3r/GUI/UpdateDialogs.cpp:406 msgid "Incompatible bundles:" msgstr "不兼容的包:" -#: src/slic3r/GUI/UpdateDialogs.cpp:246 +#: src/slic3r/GUI/UpdateDialogs.cpp:422 msgid "Re-configure" msgstr "重新配置" -#: src/slic3r/GUI/UpdateDialogs.cpp:265 +#: src/slic3r/GUI/UpdateDialogs.cpp:441 #, c-format, boost-format msgid "" "%s now uses an updated configuration structure.\n" @@ -9180,28 +10874,37 @@ msgid "" "choose whether to enable automatic preset updates." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:282 +#: src/slic3r/GUI/UpdateDialogs.cpp:458 msgid "For more information please visit our wiki page:" msgstr "欲瞭解更多信息, 請訪問我們的維基頁面:" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 msgid "Configuration updates" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:299 +#: src/slic3r/GUI/UpdateDialogs.cpp:475 src/slic3r/GUI/UpdateDialogs.cpp:495 msgid "No updates available" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:304 +#: src/slic3r/GUI/UpdateDialogs.cpp:480 #, c-format, boost-format msgid "%s has no configuration updates available." msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:21 +#: src/slic3r/GUI/UpdateDialogs.cpp:495 +msgid "App update" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:500 +#, c-format, boost-format +msgid "%s has no version updates available." +msgstr "" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:23 msgid "Ramming customization" msgstr "衝擊自定義" -#: src/slic3r/GUI/WipeTowerDialog.cpp:54 +#: src/slic3r/GUI/WipeTowerDialog.cpp:56 msgid "" "Ramming denotes the rapid extrusion just before a tool change in a single-" "extruder MM printer. Its purpose is to properly shape the end of the " @@ -9220,63 +10923,63 @@ msgstr "" "\n" "這是一個專家級設置, 不正確的調整很可能會導致卡料, 擠出機砂輪磨耗材絲等。" -#: src/slic3r/GUI/WipeTowerDialog.cpp:114 +#: src/slic3r/GUI/WipeTowerDialog.cpp:116 msgid "Total ramming time" msgstr "總衝擊時間" -#: src/slic3r/GUI/WipeTowerDialog.cpp:116 +#: src/slic3r/GUI/WipeTowerDialog.cpp:118 msgid "Total rammed volume" msgstr "總衝擊量" -#: src/slic3r/GUI/WipeTowerDialog.cpp:120 +#: src/slic3r/GUI/WipeTowerDialog.cpp:122 msgid "Ramming line width" msgstr "衝擊線寬度" -#: src/slic3r/GUI/WipeTowerDialog.cpp:122 +#: src/slic3r/GUI/WipeTowerDialog.cpp:124 msgid "Ramming line spacing" msgstr "衝擊線行距" -#: src/slic3r/GUI/WipeTowerDialog.cpp:173 +#: src/slic3r/GUI/WipeTowerDialog.cpp:175 msgid "Wipe tower - Purging volume adjustment" msgstr "擦拭塔-擠出清理體積調整" -#: src/slic3r/GUI/WipeTowerDialog.cpp:299 +#: src/slic3r/GUI/WipeTowerDialog.cpp:301 msgid "" "Here you can adjust required purging volume (mm³) for any given pair of " "tools." msgstr "在這裏, 您可以調整任何給定的對工具所需的清除體積 (mm³) 。" -#: src/slic3r/GUI/WipeTowerDialog.cpp:300 +#: src/slic3r/GUI/WipeTowerDialog.cpp:302 msgid "Extruder changed to" msgstr "擠出機更改爲" -#: src/slic3r/GUI/WipeTowerDialog.cpp:308 +#: src/slic3r/GUI/WipeTowerDialog.cpp:310 msgid "unloaded" msgstr "卸載" -#: src/slic3r/GUI/WipeTowerDialog.cpp:309 +#: src/slic3r/GUI/WipeTowerDialog.cpp:311 msgid "loaded" msgstr "裝載" -#: src/slic3r/GUI/WipeTowerDialog.cpp:352 +#: src/slic3r/GUI/WipeTowerDialog.cpp:354 msgid "Tool #" msgstr "工具 #" -#: src/slic3r/GUI/WipeTowerDialog.cpp:361 +#: src/slic3r/GUI/WipeTowerDialog.cpp:363 msgid "" "Total purging volume is calculated by summing two values below, depending on " "which tools are loaded/unloaded." msgstr "總清除量是通過求和下面的兩個值來計算的, 具體取決於裝載/卸載的工具。" -#: src/slic3r/GUI/WipeTowerDialog.cpp:362 +#: src/slic3r/GUI/WipeTowerDialog.cpp:364 msgid "Volume to purge (mm³) when the filament is being" msgstr "要清除的體積 (mm³) 當耗材正在被" -#: src/slic3r/GUI/WipeTowerDialog.cpp:376 +#: src/slic3r/GUI/WipeTowerDialog.cpp:378 msgid "From" msgstr "從" -#: src/slic3r/GUI/WipeTowerDialog.cpp:442 +#: src/slic3r/GUI/WipeTowerDialog.cpp:444 msgid "" "Switching to simple settings will discard changes done in the advanced " "mode!\n" @@ -9287,26 +10990,28 @@ msgstr "" "\n" "要繼續嗎?" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show simplified settings" msgstr "顯示簡單設置" -#: src/slic3r/GUI/WipeTowerDialog.cpp:454 +#: src/slic3r/GUI/WipeTowerDialog.cpp:456 msgid "Show advanced settings" msgstr "顯示高級設置" -#: src/slic3r/GUI/wxExtensions.cpp:644 +#: src/slic3r/GUI/wxExtensions.cpp:672 #, c-format, boost-format msgid "Switch to the %s mode" msgstr "切換到 %s 模式" -#: src/slic3r/GUI/wxExtensions.cpp:645 +#: src/slic3r/GUI/wxExtensions.cpp:673 #, c-format, boost-format msgid "Current mode is %s" msgstr "當前模式爲 %s" -#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:141 -#: src/slic3r/Utils/Repetier.cpp:69 +#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:206 +#: src/slic3r/Utils/OctoPrint.cpp:255 src/slic3r/Utils/OctoPrint.cpp:666 +#: src/slic3r/Utils/OctoPrint.cpp:824 src/slic3r/Utils/OctoPrint.cpp:897 +#: src/slic3r/Utils/Repetier.cpp:88 #, c-format, boost-format msgid "Mismatched type of print host: %s" msgstr "列印主機類型不匹配: %s" @@ -9423,69 +11128,100 @@ msgid "" "is required." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:164 +#: src/slic3r/Utils/OctoPrint.cpp:278 msgid "Connection to OctoPrint works correctly." msgstr "與OctoPrint的連接工作正常。" -#: src/slic3r/Utils/OctoPrint.cpp:170 +#: src/slic3r/Utils/OctoPrint.cpp:284 msgid "Could not connect to OctoPrint" msgstr "無法連接到 OctoPrint" -#: src/slic3r/Utils/OctoPrint.cpp:172 +#: src/slic3r/Utils/OctoPrint.cpp:286 msgid "Note: OctoPrint version at least 1.1.0 is required." msgstr "注意: 至少需要1.1.0 版本的 OctoPrint." -#: src/slic3r/Utils/OctoPrint.cpp:292 +#: src/slic3r/Utils/OctoPrint.cpp:528 msgid "Connection to Prusa SL1 / SL1S works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:298 +#: src/slic3r/Utils/OctoPrint.cpp:534 msgid "Could not connect to Prusa SLA" msgstr "無法連接到 Prusa SLA" -#: src/slic3r/Utils/OctoPrint.cpp:336 +#: src/slic3r/Utils/OctoPrint.cpp:573 msgid "Connection to PrusaLink works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:342 +#: src/slic3r/Utils/OctoPrint.cpp:579 msgid "Could not connect to PrusaLink" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:61 +#: src/slic3r/Utils/OctoPrint.cpp:776 +msgid "Storages found:" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "read only" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:778 +msgid "no free space" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:781 +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%.%2%" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:64 #, boost-format msgid "Copying of file %1% to %2% failed: %3%" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:645 -#: src/slic3r/Utils/PresetUpdater.cpp:662 +#: src/slic3r/Utils/PresetUpdater.cpp:998 +#: src/slic3r/Utils/PresetUpdater.cpp:1015 msgid "Continue and install configuration updates?" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:777 +#: src/slic3r/Utils/PresetUpdater.cpp:1021 +msgid "Installing profiles" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1071 +#, boost-format +msgid "Downloading resources for %1%." +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:1171 msgid "" -"Configuration Updates causes a lost of preset modification.\n" +"Configuration Update will cause the preset modification to be lost.\n" "So, check unsaved changes and save them if necessary." msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:779 +#: src/slic3r/Utils/PresetUpdater.cpp:1173 msgid "Updating" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:808 +#: src/slic3r/Utils/PresetUpdater.cpp:1202 #, c-format, boost-format msgid "requires min. %s and max. %s" msgstr "需要最小 %s 和最大 %s" -#: src/slic3r/Utils/PresetUpdater.cpp:812 +#: src/slic3r/Utils/PresetUpdater.cpp:1206 #, c-format, boost-format msgid "requires min. %s" msgstr "需要最小 %s" -#: src/slic3r/Utils/PresetUpdater.cpp:815 +#: src/slic3r/Utils/PresetUpdater.cpp:1209 #, c-format, boost-format msgid "requires max. %s" msgstr "需要最大 %s" +#: src/slic3r/Utils/PresetUpdater.cpp:1362 +#, boost-format +msgid "Couldn't locate idx file %1% when performing updates." +msgstr "" + #: src/slic3r/Utils/Http.cpp:73 msgid "" "Could not detect system SSL certificate store. PrusaSlicer will be unable to " @@ -9510,30 +11246,30 @@ msgid "" "connections. See logs for additional details." msgstr "" -#: src/slic3r/Utils/Process.cpp:157 +#: src/slic3r/Utils/Process.cpp:164 msgid "Open G-code file:" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:84 +#: src/slic3r/Utils/Repetier.cpp:103 msgid "Connection to Repetier works correctly." msgstr "" -#: src/slic3r/Utils/Repetier.cpp:90 +#: src/slic3r/Utils/Repetier.cpp:109 msgid "Could not connect to Repetier" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:92 +#: src/slic3r/Utils/Repetier.cpp:111 msgid "Note: Repetier version at least 0.90.0 is required." msgstr "" -#: src/slic3r/Utils/Repetier.cpp:246 +#: src/slic3r/Utils/Repetier.cpp:263 #, boost-format msgid "" "HTTP status: %1%\n" "Message body: \"%2%\"" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:253 +#: src/slic3r/Utils/Repetier.cpp:270 #, boost-format msgid "" "Parsing of host response failed.\n" @@ -9541,7 +11277,7 @@ msgid "" "Error: \"%2%\"" msgstr "" -#: src/slic3r/Utils/Repetier.cpp:266 +#: src/slic3r/Utils/Repetier.cpp:283 #, boost-format msgid "" "Enumeration of host printers failed.\n" @@ -9570,94 +11306,90 @@ msgstr "" msgid "Abort" msgstr "中止" -#: src/libslic3r/GCode.cpp:539 +#: src/libslic3r/GCode.cpp:490 msgid "There is an object with no extrusions in the first layer." msgstr "" -#: src/libslic3r/GCode.cpp:570 +#: src/libslic3r/GCode.cpp:521 #, boost-format msgid "Empty layer between %1% and %2%." msgstr "" -#: src/libslic3r/GCode.cpp:573 +#: src/libslic3r/GCode.cpp:524 msgid "(Some lines not shown)" msgstr "" -#: src/libslic3r/GCode.cpp:575 +#: src/libslic3r/GCode.cpp:526 #, boost-format msgid "Object name: %1%" msgstr "" -#: src/libslic3r/GCode.cpp:576 +#: src/libslic3r/GCode.cpp:527 msgid "" "Make sure the object is printable. This is usually caused by negligibly " "small extrusions or by a faulty model. Try to repair the model or change its " "orientation on the bed." msgstr "" -#: src/libslic3r/GCode.cpp:718 +#: src/libslic3r/GCode.cpp:669 msgid "Filament Start G-code" msgstr "" -#: src/libslic3r/GCode.cpp:725 +#: src/libslic3r/GCode.cpp:676 msgid "Filament End G-code" msgstr "" -#: src/libslic3r/GCode.cpp:764 +#: src/libslic3r/GCode.cpp:717 msgid "In the custom G-code were found reserved keywords:" msgstr "" -#: src/libslic3r/GCode.cpp:766 +#: src/libslic3r/GCode.cpp:719 msgid "" "This may cause problems in g-code visualization and printing time estimation." msgstr "" -#: src/libslic3r/GCode.cpp:1200 src/libslic3r/GCode.cpp:1211 +#: src/libslic3r/GCode.cpp:1124 src/libslic3r/GCode.cpp:1135 msgid "No extrusions were generated for objects." msgstr "" -#: src/libslic3r/GCode.cpp:1406 +#: src/libslic3r/GCode.cpp:1328 msgid "" "Your print is very close to the priming regions. Make sure there is no " "collision." msgstr "" -#: src/libslic3r/ExtrusionEntity.cpp:344 src/libslic3r/ExtrusionEntity.cpp:380 -msgid "Mixed" -msgstr "混合" - #: src/libslic3r/Flow.cpp:61 #, boost-format msgid "" "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1735 +#: src/libslic3r/Format/3mf.cpp:1880 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1746 +#: src/libslic3r/Format/3mf.cpp:1891 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1750 +#: src/libslic3r/Format/3mf.cpp:1895 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1754 +#: src/libslic3r/Format/3mf.cpp:1899 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/AMF.cpp:993 +#: src/libslic3r/Format/AMF.cpp:1000 #, boost-format msgid "" "The selected amf file has been saved with a newer version of %1% and is not " @@ -9800,82 +11532,100 @@ msgstr "驗證失敗" msgid "write calledback failed" msgstr "寫回失敗" -#: src/libslic3r/Print.cpp:454 +#: src/libslic3r/Print.cpp:473 msgid "All objects are outside of the print volume." msgstr "所有對象都在列印範圍之外。" -#: src/libslic3r/Print.cpp:457 +#: src/libslic3r/Print.cpp:476 msgid "The supplied settings will cause an empty print." msgstr "當前提供的設置將導致空列印。" -#: src/libslic3r/Print.cpp:461 +#: src/libslic3r/Print.cpp:480 msgid "Some objects are too close; your extruder will collide with them." msgstr "有些物體太過靠近; 你的擠出頭有機會和他們相撞。" -#: src/libslic3r/Print.cpp:463 +#: src/libslic3r/Print.cpp:482 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." msgstr "有些物體太高, 無法在擠出頭不衝突的情況下列印。" -#: src/libslic3r/Print.cpp:472 +#: src/libslic3r/Print.cpp:486 +msgid "" +"Avoid crossing perimeters option and avoid crossing curled overhangs option " +"cannot be both enabled together." +msgstr "" + +#: src/libslic3r/Print.cpp:495 msgid "" "Only a single object may be printed at a time in Spiral Vase mode. Either " "remove all but the last object, or enable sequential mode by " "\"complete_objects\"." msgstr "" -#: src/libslic3r/Print.cpp:476 +#: src/libslic3r/Print.cpp:499 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." msgstr "\"螺旋花瓶\" 選項只能在列印單個材料對象時使用。" -#: src/libslic3r/Print.cpp:489 +#: src/libslic3r/Print.cpp:523 +msgid "" +"The print is taller than the maximum allowed height. You might want to " +"reduce the size of your model or change current print settings and retry." +msgstr "" + +#: src/libslic3r/Print.cpp:540 +msgid "Variable layer height is not supported with Organic supports." +msgstr "" + +#: src/libslic3r/Print.cpp:553 msgid "" "The wipe tower is only supported if all extruders have the same nozzle " "diameter and use filaments of the same diameter." msgstr "" -#: src/libslic3r/Print.cpp:495 +#: src/libslic3r/Print.cpp:559 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, " "RepRapFirmware and Repetier G-code flavors." msgstr "" -#: src/libslic3r/Print.cpp:497 +#: src/libslic3r/Print.cpp:561 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." msgstr "擦料塔目前僅支持相對擠出機尋址 (use_relative_e_distances=1)。" -#: src/libslic3r/Print.cpp:499 -msgid "Ooze prevention is currently not supported with the wipe tower enabled." +#: src/libslic3r/Print.cpp:563 +msgid "" +"Ooze prevention is only supported with the wipe tower when " +"'single_extruder_multi_material' is off." msgstr "" -#: src/libslic3r/Print.cpp:501 +#: src/libslic3r/Print.cpp:565 msgid "" "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." msgstr "" -#: src/libslic3r/Print.cpp:503 +#: src/libslic3r/Print.cpp:567 msgid "" "The Wipe Tower is currently not supported for multimaterial sequential " "prints." msgstr "" -#: src/libslic3r/Print.cpp:524 +#: src/libslic3r/Print.cpp:577 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " "layer heights" msgstr "" -#: src/libslic3r/Print.cpp:526 +#: src/libslic3r/Print.cpp:579 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "over an equal number of raft layers" msgstr "只有在相同數量的基座層上列印的對象時, 才支持擦料塔" -#: src/libslic3r/Print.cpp:529 +#: src/libslic3r/Print.cpp:582 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "with the same support_material_contact_distance" @@ -9883,34 +11633,34 @@ msgstr "" "只有在使用相同的support_material_contact_distance(支撐材料距離)列印多個對象" "時, 才支持擦料塔" -#: src/libslic3r/Print.cpp:531 +#: src/libslic3r/Print.cpp:584 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." msgstr "只有在多個對象被平均切割的情況下, 才支持擦料塔。" -#: src/libslic3r/Print.cpp:555 +#: src/libslic3r/Print.cpp:609 msgid "" "The Wipe tower is only supported if all objects have the same variable layer " "height" msgstr "" -#: src/libslic3r/Print.cpp:579 +#: src/libslic3r/Print.cpp:633 msgid "" "One or more object were assigned an extruder that the printer does not have." msgstr "爲一個或多個對象分配了印表機不存在的擠出機。" -#: src/libslic3r/Print.cpp:592 +#: src/libslic3r/Print.cpp:646 #, boost-format msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" msgstr "" -#: src/libslic3r/Print.cpp:595 +#: src/libslic3r/Print.cpp:649 #, boost-format msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" msgstr "" -#: src/libslic3r/Print.cpp:606 +#: src/libslic3r/Print.cpp:660 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " @@ -9921,175 +11671,223 @@ msgstr "" "(support_material_extruder == 0 或 support_material_interface_extruder == 0)" "列印支撐物, 則所有噴嘴的直徑必須相同。" -#: src/libslic3r/Print.cpp:614 +#: src/libslic3r/Print.cpp:668 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers " "need to be synchronized with the object layers." msgstr "要使擦料塔與可溶性支撐配合使用, 支持層需要與對象圖層同步。" -#: src/libslic3r/Print.cpp:618 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only if they are " -"printed with the current extruder without triggering a tool change. (both " -"support_material_extruder and support_material_interface_extruder need to be " -"set to 0)." -msgstr "" -"只有在不觸發工具更改的情況下, 使用當前擠出機列印的未溶性支撐塔目前才支持不溶" -"於的支架。(support_material_extruder 和support_material_interface_extruder " -"都需要設置爲 0)。" - -#: src/libslic3r/Print.cpp:654 +#: src/libslic3r/Print.cpp:708 msgid "First layer height can't be greater than nozzle diameter" msgstr "第一層高度不能大於噴嘴直徑" -#: src/libslic3r/Print.cpp:659 +#: src/libslic3r/Print.cpp:713 msgid "Layer height can't be greater than nozzle diameter" msgstr "層高度不能大於噴嘴直徑" -#: src/libslic3r/Print.cpp:680 +#: src/libslic3r/Print.cpp:734 msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " "layer_gcode." msgstr "" -#: src/libslic3r/Print.cpp:682 +#: src/libslic3r/Print.cpp:736 msgid "" "\"G92 E0\" was found in before_layer_gcode, which is incompatible with " "absolute extruder addressing." msgstr "" -#: src/libslic3r/Print.cpp:684 +#: src/libslic3r/Print.cpp:738 msgid "" "\"G92 E0\" was found in layer_gcode, which is incompatible with absolute " "extruder addressing." msgstr "" -#: src/libslic3r/Print.cpp:826 +#: src/libslic3r/Print.cpp:880 msgid "Infilling layers" msgstr "" -#: src/libslic3r/Print.cpp:848 +#: src/libslic3r/Print.cpp:908 msgid "Generating skirt and brim" msgstr "" -#: src/libslic3r/Print.cpp:896 +#: src/libslic3r/Print.cpp:956 msgid "Exporting G-code" msgstr "" -#: src/libslic3r/Print.cpp:900 +#: src/libslic3r/Print.cpp:960 msgid "Generating G-code" msgstr "" +#: src/libslic3r/Print.cpp:1169 +msgid "Alert if supports needed" +msgstr "" + +#: src/libslic3r/Print.cpp:1174 +msgid "long bridging extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1175 +msgid "floating bridge anchors" +msgstr "" + +#: src/libslic3r/Print.cpp:1178 +msgid "collapsing overhang" +msgstr "" + +#: src/libslic3r/Print.cpp:1180 +msgid "loose extrusions" +msgstr "" + +#: src/libslic3r/Print.cpp:1183 +msgid "low bed adhesion" +msgstr "" + +#: src/libslic3r/Print.cpp:1184 +msgid "floating object part" +msgstr "" + +#: src/libslic3r/Print.cpp:1185 +msgid "thin fragile section" +msgstr "" + +#: src/libslic3r/Print.cpp:1221 +msgid "Detected print stability issues" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "or" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "and" +msgstr "" + +#: src/libslic3r/Print.cpp:1247 +msgid "brim" +msgstr "" + +#: src/libslic3r/Print.cpp:1248 +msgid "Consider enabling supports" +msgstr "" + #: src/libslic3r/SLA/Pad.cpp:533 msgid "Pad brim size is too small for the current configuration." msgstr "" -#: src/libslic3r/SLAPrint.cpp:628 +#: src/libslic3r/SLAPrint.cpp:546 msgid "" "Cannot proceed without support points! Add support points or disable support " "generation." msgstr "沒有支持點就無法繼續!添加支持點或禁用支持生成。" -#: src/libslic3r/SLAPrint.cpp:640 +#: src/libslic3r/SLAPrint.cpp:558 msgid "" "Elevation is too low for object. Use the \"Pad around object\" feature to " "print the object without elevation." msgstr "" -#: src/libslic3r/SLAPrint.cpp:646 +#: src/libslic3r/SLAPrint.cpp:564 msgid "" "The endings of the support pillars will be deployed on the gap between the " "object and the pad. 'Support base safety distance' has to be greater than " "the 'Pad object gap' parameter to avoid this." msgstr "" -#: src/libslic3r/SLAPrint.cpp:661 +#: src/libslic3r/SLAPrint.cpp:579 msgid "Exposition time is out of printer profile bounds." msgstr "" -#: src/libslic3r/SLAPrint.cpp:668 +#: src/libslic3r/SLAPrint.cpp:586 msgid "Initial exposition time is out of printer profile bounds." msgstr "" -#: src/libslic3r/SLAPrint.cpp:784 +#: src/libslic3r/SLAPrint.cpp:693 msgid "Slicing done" msgstr "切片完成" -#: src/libslic3r/SLAPrintSteps.cpp:47 +#: src/libslic3r/SLAPrintSteps.cpp:57 +msgid "Assembling model from parts" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:58 msgid "Hollowing model" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:48 +#: src/libslic3r/SLAPrintSteps.cpp:59 msgid "Drilling holes into model." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:49 +#: src/libslic3r/SLAPrintSteps.cpp:60 msgid "Slicing model" msgstr "切片模型" -#: src/libslic3r/SLAPrintSteps.cpp:50 src/libslic3r/SLAPrintSteps.cpp:639 +#: src/libslic3r/SLAPrintSteps.cpp:61 src/libslic3r/SLAPrintSteps.cpp:691 msgid "Generating support points" msgstr "生成支持點" -#: src/libslic3r/SLAPrintSteps.cpp:51 +#: src/libslic3r/SLAPrintSteps.cpp:62 msgid "Generating support tree" msgstr "生成支持樹" -#: src/libslic3r/SLAPrintSteps.cpp:52 +#: src/libslic3r/SLAPrintSteps.cpp:63 msgid "Generating pad" msgstr "生成板" -#: src/libslic3r/SLAPrintSteps.cpp:53 +#: src/libslic3r/SLAPrintSteps.cpp:64 msgid "Slicing supports" msgstr "切片支持" -#: src/libslic3r/SLAPrintSteps.cpp:68 +#: src/libslic3r/SLAPrintSteps.cpp:79 msgid "Merging slices and calculating statistics" msgstr "合併切片和計算統計信息" -#: src/libslic3r/SLAPrintSteps.cpp:69 +#: src/libslic3r/SLAPrintSteps.cpp:80 msgid "Rasterizing layers" msgstr "柵格化圖層" -#: src/libslic3r/SLAPrintSteps.cpp:435 -msgid "Too many overlapping holes." -msgstr "" - -#: src/libslic3r/SLAPrintSteps.cpp:442 +#: src/libslic3r/SLAPrintSteps.cpp:255 msgid "" "Mesh to be hollowed is not suitable for hollowing (does not bound a volume)." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:450 +#: src/libslic3r/SLAPrintSteps.cpp:262 msgid "Unable to drill the current configuration of holes into the model." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:470 +#: src/libslic3r/SLAPrintSteps.cpp:271 msgid "" "Drilling holes into the mesh failed. This is usually caused by broken model. " "Try to fix it first." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:476 +#: src/libslic3r/SLAPrintSteps.cpp:279 msgid "Failed to drill some holes into the model" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:520 +#: src/libslic3r/SLAPrintSteps.cpp:289 +msgid "" +"Can't perform full mesh booleans! Some parts of the print will be previewed " +"with approximated meshes. This does not affect the quality of slices or the " +"physical print in any way." +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:510 msgid "" "Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:691 src/libslic3r/SLAPrintSteps.cpp:700 -#: src/libslic3r/SLAPrintSteps.cpp:738 +#: src/libslic3r/SLAPrintSteps.cpp:740 src/libslic3r/SLAPrintSteps.cpp:749 +#: src/libslic3r/SLAPrintSteps.cpp:787 msgid "Visualizing supports" msgstr "可視化支持" -#: src/libslic3r/SLAPrintSteps.cpp:730 +#: src/libslic3r/SLAPrintSteps.cpp:779 msgid "No pad can be generated for this model with the current configuration" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:854 +#: src/libslic3r/SLAPrintSteps.cpp:908 msgid "" "There are unprintable objects. Try to adjust support settings to make the " "objects printable." @@ -10099,27 +11897,27 @@ msgstr "" msgid "Failed processing of the output_filename_format template." msgstr "處理 output_filename_format 模板失敗。" -#: src/libslic3r/PrintConfig.cpp:236 src/libslic3r/PrintConfig.cpp:237 +#: src/libslic3r/PrintConfig.cpp:254 src/libslic3r/PrintConfig.cpp:255 msgid "Printer technology" msgstr "印表機技術" -#: src/libslic3r/PrintConfig.cpp:244 +#: src/libslic3r/PrintConfig.cpp:260 msgid "Bed shape" msgstr "機牀形狀" -#: src/libslic3r/PrintConfig.cpp:249 +#: src/libslic3r/PrintConfig.cpp:265 msgid "Bed custom texture" msgstr "" -#: src/libslic3r/PrintConfig.cpp:254 +#: src/libslic3r/PrintConfig.cpp:270 msgid "Bed custom model" msgstr "" -#: src/libslic3r/PrintConfig.cpp:259 +#: src/libslic3r/PrintConfig.cpp:275 msgid "Elephant foot compensation" msgstr "大象腳補償" -#: src/libslic3r/PrintConfig.cpp:261 +#: src/libslic3r/PrintConfig.cpp:277 msgid "" "The first layer will be shrunk in the XY plane by the configured value to " "compensate for the 1st layer squish aka an Elephant Foot effect." @@ -10127,27 +11925,27 @@ msgstr "" "第一層將被相對於配置的值在 XY 平面上縮小, 以補償第一層斜視, 也就是大象腳的效" "果。" -#: src/libslic3r/PrintConfig.cpp:269 +#: src/libslic3r/PrintConfig.cpp:285 msgid "G-code thumbnails" msgstr "" -#: src/libslic3r/PrintConfig.cpp:270 +#: src/libslic3r/PrintConfig.cpp:286 msgid "" "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " "following format: \"XxY, XxY, ...\"" msgstr "" -#: src/libslic3r/PrintConfig.cpp:276 +#: src/libslic3r/PrintConfig.cpp:292 msgid "Format of G-code thumbnails" msgstr "" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:293 msgid "" "Format of G-code thumbnails: PNG for best quality, JPG for smallest size, " "QOI for low memory firmware" msgstr "" -#: src/libslic3r/PrintConfig.cpp:288 +#: src/libslic3r/PrintConfig.cpp:301 msgid "" "This setting controls the height (and thus the total number) of the slices/" "layers. Thinner layers give better accuracy but take more time to print." @@ -10155,21 +11953,21 @@ msgstr "" "該參數控制切片的高度(因此也控制總層數)。較薄的切片可以使精度更高,但花費的" "列印時間也更長。" -#: src/libslic3r/PrintConfig.cpp:295 +#: src/libslic3r/PrintConfig.cpp:308 msgid "Max print height" msgstr "最大列印高度" -#: src/libslic3r/PrintConfig.cpp:296 +#: src/libslic3r/PrintConfig.cpp:309 msgid "" "Set this to the maximum height that can be reached by your extruder while " "printing." msgstr "將其設置爲您的擠出機在列印時可以達到的最大高度。" -#: src/libslic3r/PrintConfig.cpp:304 +#: src/libslic3r/PrintConfig.cpp:317 msgid "Hostname, IP or URL" msgstr "主機名, IP 或 URL" -#: src/libslic3r/PrintConfig.cpp:305 +#: src/libslic3r/PrintConfig.cpp:318 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the hostname, IP address or URL of the printer host instance. Print host " @@ -10178,11 +11976,11 @@ msgid "" "password@your-octopi-address/" msgstr "" -#: src/libslic3r/PrintConfig.cpp:314 +#: src/libslic3r/PrintConfig.cpp:327 msgid "API Key / Password" msgstr "API 密鑰/密碼" -#: src/libslic3r/PrintConfig.cpp:315 +#: src/libslic3r/PrintConfig.cpp:328 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the API Key or the password required for authentication." @@ -10190,57 +11988,69 @@ msgstr "" "Slic3r 可以將 G-code 文件上載到印表機主機。此字段應包含 API 密鑰或身份驗證所" "需的密碼。" -#: src/libslic3r/PrintConfig.cpp:323 +#: src/libslic3r/PrintConfig.cpp:336 msgid "Name of the printer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:331 +#: src/libslic3r/PrintConfig.cpp:344 msgid "" "Custom CA certificate file can be specified for HTTPS OctoPrint connections, " "in crt/pem format. If left blank, the default OS CA certificate repository " "is used." msgstr "" -#: src/libslic3r/PrintConfig.cpp:347 +#: src/libslic3r/PrintConfig.cpp:360 msgid "Password" msgstr "" -#: src/libslic3r/PrintConfig.cpp:355 +#: src/libslic3r/PrintConfig.cpp:368 msgid "Ignore HTTPS certificate revocation checks" msgstr "" -#: src/libslic3r/PrintConfig.cpp:356 +#: src/libslic3r/PrintConfig.cpp:369 msgid "" "Ignore HTTPS certificate revocation checks in case of missing or offline " "distribution points. One may want to enable this option for self signed " "certificates if connection fails." msgstr "" -#: src/libslic3r/PrintConfig.cpp:363 +#: src/libslic3r/PrintConfig.cpp:376 msgid "Printer preset names" msgstr "" -#: src/libslic3r/PrintConfig.cpp:364 +#: src/libslic3r/PrintConfig.cpp:377 msgid "Names of presets related to the physical printer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:369 +#: src/libslic3r/PrintConfig.cpp:382 msgid "Authorization Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:374 +#: src/libslic3r/PrintConfig.cpp:385 msgid "API key" msgstr "" -#: src/libslic3r/PrintConfig.cpp:375 +#: src/libslic3r/PrintConfig.cpp:386 msgid "HTTP digest" msgstr "" -#: src/libslic3r/PrintConfig.cpp:395 +#: src/libslic3r/PrintConfig.cpp:406 +msgid "Avoid crossing curled overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:407 +msgid "" +"Plan travel moves such that the extruder avoids areas where the filament may " +"be curled up. This is mostly happening on steeper rounded overhangs and may " +"cause a crash with the nozzle. This feature slows down both the print and " +"the G-code generation." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:414 msgid "Avoid crossing perimeters" msgstr "避免跨越輪廓" -#: src/libslic3r/PrintConfig.cpp:396 +#: src/libslic3r/PrintConfig.cpp:415 msgid "" "Optimize travel moves in order to minimize the crossing of perimeters. This " "is mostly useful with Bowden extruders which suffer from oozing. This " @@ -10249,11 +12059,11 @@ msgstr "" "爲了儘量減少跨越輪廓,優化空程的移動方式。這非常適用於受滲漏問題影響的鮑登擠" "出頭。此功能會減慢列印速度和 G 代碼生成速度。" -#: src/libslic3r/PrintConfig.cpp:403 +#: src/libslic3r/PrintConfig.cpp:422 msgid "Avoid crossing perimeters - Max detour length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:405 +#: src/libslic3r/PrintConfig.cpp:424 msgid "" "The maximum detour length for avoid crossing perimeters. If the detour is " "longer than this value, avoid crossing perimeters is not applied for this " @@ -10261,25 +12071,25 @@ msgid "" "as percentage (for example 50%) of a direct travel path." msgstr "" -#: src/libslic3r/PrintConfig.cpp:408 +#: src/libslic3r/PrintConfig.cpp:427 msgid "mm or % (zero to disable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:2839 +#: src/libslic3r/PrintConfig.cpp:434 src/libslic3r/PrintConfig.cpp:2927 msgid "Other layers" msgstr "其它層" -#: src/libslic3r/PrintConfig.cpp:416 +#: src/libslic3r/PrintConfig.cpp:435 msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." msgstr "第一個圖層後的層的牀溫。將此設置爲零, 以禁用輸出中的牀溫控制命令。" -#: src/libslic3r/PrintConfig.cpp:419 +#: src/libslic3r/PrintConfig.cpp:438 msgid "Bed temperature" msgstr "機牀溫度" -#: src/libslic3r/PrintConfig.cpp:426 +#: src/libslic3r/PrintConfig.cpp:445 msgid "" "This custom code is inserted at every layer change, right before the Z move. " "Note that you can use placeholder variables for all Slic3r settings as well " @@ -10288,11 +12098,11 @@ msgstr "" "這段自定義代碼在層改變,即Z軸移動前插入。注意除了可以使用[layer_num]和" "[layer_z],也可以使用佔位符變量替代所有的slic3r設置。" -#: src/libslic3r/PrintConfig.cpp:436 +#: src/libslic3r/PrintConfig.cpp:455 msgid "Between objects G-code" msgstr "對象之間的 G-code" -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:456 msgid "" "This code is inserted between objects when using sequential printing. By " "default extruder and bed temperature are reset using non-wait command; " @@ -10306,49 +12116,49 @@ msgstr "" "添加溫度命令。請注意, 您可以對所有 Slic3r 設置使用佔位符變量, 因此您可以將 " "\"M109 S[first_layer_temperature]\" 命令放在任何需要的地方。" -#: src/libslic3r/PrintConfig.cpp:448 +#: src/libslic3r/PrintConfig.cpp:467 msgid "Number of solid layers to generate on bottom surfaces." msgstr "底部表面生成的可靠層數。" -#: src/libslic3r/PrintConfig.cpp:449 +#: src/libslic3r/PrintConfig.cpp:468 msgid "Bottom solid layers" msgstr "底部可靠層" -#: src/libslic3r/PrintConfig.cpp:457 +#: src/libslic3r/PrintConfig.cpp:476 msgid "" "The number of bottom solid layers is increased above bottom_solid_layers if " "necessary to satisfy minimum thickness of bottom shell." msgstr "" -#: src/libslic3r/PrintConfig.cpp:459 +#: src/libslic3r/PrintConfig.cpp:478 msgid "Minimum bottom shell thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:484 msgid "Bridge" msgstr "橋" -#: src/libslic3r/PrintConfig.cpp:466 +#: src/libslic3r/PrintConfig.cpp:485 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." msgstr "此項爲印表機在列印橋時的加速度。設爲0可以禁用列印橋的加速度控制。" -#: src/libslic3r/PrintConfig.cpp:468 src/libslic3r/PrintConfig.cpp:639 -#: src/libslic3r/PrintConfig.cpp:1192 src/libslic3r/PrintConfig.cpp:1201 -#: src/libslic3r/PrintConfig.cpp:1401 src/libslic3r/PrintConfig.cpp:1410 -#: src/libslic3r/PrintConfig.cpp:1419 src/libslic3r/PrintConfig.cpp:1713 -#: src/libslic3r/PrintConfig.cpp:1764 src/libslic3r/PrintConfig.cpp:1775 -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1983 -#: src/libslic3r/PrintConfig.cpp:1991 +#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:1252 src/libslic3r/PrintConfig.cpp:1261 +#: src/libslic3r/PrintConfig.cpp:1447 src/libslic3r/PrintConfig.cpp:1456 +#: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1750 +#: src/libslic3r/PrintConfig.cpp:1801 src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1822 src/libslic3r/PrintConfig.cpp:2013 +#: src/libslic3r/PrintConfig.cpp:2021 msgid "mm/s²" msgstr "mm/s²" -#: src/libslic3r/PrintConfig.cpp:474 +#: src/libslic3r/PrintConfig.cpp:493 msgid "Bridging angle" msgstr "橋接角度" -#: src/libslic3r/PrintConfig.cpp:476 +#: src/libslic3r/PrintConfig.cpp:495 msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for all " @@ -10357,35 +12167,30 @@ msgstr "" "橋接角度覆蓋。如果保持爲零, 則將自動計算橋接角度。否則, 所提供的角度將用於所" "有橋樑。使用180°實現零角度。" -#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:1102 -#: src/libslic3r/PrintConfig.cpp:2282 src/libslic3r/PrintConfig.cpp:2292 -#: src/libslic3r/PrintConfig.cpp:2583 src/libslic3r/PrintConfig.cpp:2824 -#: src/libslic3r/PrintConfig.cpp:3041 src/libslic3r/PrintConfig.cpp:3144 -#: src/libslic3r/PrintConfig.cpp:3698 src/libslic3r/PrintConfig.cpp:3819 -msgid "°" -msgstr "°" - -#: src/libslic3r/PrintConfig.cpp:485 +#: src/libslic3r/PrintConfig.cpp:504 msgid "Bridges fan speed" msgstr "橋風扇速度" -#: src/libslic3r/PrintConfig.cpp:486 +#: src/libslic3r/PrintConfig.cpp:505 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "此項爲在列印所有橋和懸垂部位時的風扇速度。" -#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:1114 -#: src/libslic3r/PrintConfig.cpp:1601 src/libslic3r/PrintConfig.cpp:1793 -#: src/libslic3r/PrintConfig.cpp:1856 src/libslic3r/PrintConfig.cpp:2115 -#: src/libslic3r/PrintConfig.cpp:2174 src/libslic3r/PrintConfig.cpp:3323 -#: src/libslic3r/PrintConfig.cpp:3612 src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:596 +#: src/libslic3r/PrintConfig.cpp:605 src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:623 src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1893 src/libslic3r/PrintConfig.cpp:2145 +#: src/libslic3r/PrintConfig.cpp:2204 src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3369 src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3870 msgid "%" msgstr "%" -#: src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:513 msgid "Bridge flow ratio" msgstr "橋流量比" -#: src/libslic3r/PrintConfig.cpp:496 +#: src/libslic3r/PrintConfig.cpp:515 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -10395,99 +12200,146 @@ msgstr "" "此因素影響橋接部位的塑料用量。可以略微減少該值以回撤擠出物避免滴垂。但默認設" "置通常來說已經可以滿足使用,在修改前需通過冷卻(使用風扇)進行測試。" -#: src/libslic3r/PrintConfig.cpp:506 +#: src/libslic3r/PrintConfig.cpp:525 msgid "Bridges" msgstr "橋接處" -#: src/libslic3r/PrintConfig.cpp:508 +#: src/libslic3r/PrintConfig.cpp:527 msgid "Speed for printing bridges." msgstr "列印橋接處的速度。" -#: src/libslic3r/PrintConfig.cpp:509 src/libslic3r/PrintConfig.cpp:920 -#: src/libslic3r/PrintConfig.cpp:928 src/libslic3r/PrintConfig.cpp:937 -#: src/libslic3r/PrintConfig.cpp:945 src/libslic3r/PrintConfig.cpp:972 -#: src/libslic3r/PrintConfig.cpp:991 src/libslic3r/PrintConfig.cpp:1329 -#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1620 -#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1730 -#: src/libslic3r/PrintConfig.cpp:1742 src/libslic3r/PrintConfig.cpp:1752 -#: src/libslic3r/PrintConfig.cpp:1815 src/libslic3r/PrintConfig.cpp:1874 -#: src/libslic3r/PrintConfig.cpp:2022 src/libslic3r/PrintConfig.cpp:2249 -#: src/libslic3r/PrintConfig.cpp:2258 src/libslic3r/PrintConfig.cpp:2789 -#: src/libslic3r/PrintConfig.cpp:2939 src/libslic3r/PrintConfig.cpp:2949 +#: src/libslic3r/PrintConfig.cpp:528 src/libslic3r/PrintConfig.cpp:1009 +#: src/libslic3r/PrintConfig.cpp:1017 src/libslic3r/PrintConfig.cpp:1026 +#: src/libslic3r/PrintConfig.cpp:1034 src/libslic3r/PrintConfig.cpp:1061 +#: src/libslic3r/PrintConfig.cpp:1080 src/libslic3r/PrintConfig.cpp:1386 +#: src/libslic3r/PrintConfig.cpp:1579 src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1733 src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1779 src/libslic3r/PrintConfig.cpp:1789 +#: src/libslic3r/PrintConfig.cpp:1852 src/libslic3r/PrintConfig.cpp:1911 +#: src/libslic3r/PrintConfig.cpp:2052 src/libslic3r/PrintConfig.cpp:2279 +#: src/libslic3r/PrintConfig.cpp:2288 src/libslic3r/PrintConfig.cpp:2810 +#: src/libslic3r/PrintConfig.cpp:3027 src/libslic3r/PrintConfig.cpp:3037 msgid "mm/s" msgstr "mm/s" -#: src/libslic3r/PrintConfig.cpp:516 +#: src/libslic3r/PrintConfig.cpp:535 +msgid "Enable dynamic overhang speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:537 +msgid "This setting enables dynamic speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:541 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Speeds for overhang " +"sizes in between are calculated via linear interpolation. If set as " +"percentage, the speed is calculated over the external perimeter speed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:547 src/libslic3r/PrintConfig.cpp:594 +msgid "speed for 0% overlap (bridge)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:550 src/libslic3r/PrintConfig.cpp:559 +#: src/libslic3r/PrintConfig.cpp:568 src/libslic3r/PrintConfig.cpp:577 +#: src/libslic3r/PrintConfig.cpp:856 src/libslic3r/PrintConfig.cpp:1305 +#: src/libslic3r/PrintConfig.cpp:1316 src/libslic3r/PrintConfig.cpp:2387 +#: src/libslic3r/PrintConfig.cpp:2440 src/libslic3r/PrintConfig.cpp:2765 +#: src/libslic3r/PrintConfig.cpp:2997 +msgid "mm/s or %" +msgstr "mm/s 或 %" + +#: src/libslic3r/PrintConfig.cpp:556 src/libslic3r/PrintConfig.cpp:603 +msgid "speed for 25% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:612 +msgid "speed for 50% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:574 src/libslic3r/PrintConfig.cpp:621 +msgid "speed for 75% overlap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:583 +msgid "Enable dynamic fan speeds" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:584 +msgid "This setting enables dynamic fan speed control on overhangs." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:589 +msgid "" +"Overhang size is expressed as a percentage of overlap of the extrusion with " +"the previous layer: 100% would be full overlap (no overhang), while 0% " +"represents full overhang (floating extrusion, bridge). Fan speeds for " +"overhang sizes in between are calculated via linear interpolation. " +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:630 msgid "Brim width" msgstr "裙邊寬度" -#: src/libslic3r/PrintConfig.cpp:518 +#: src/libslic3r/PrintConfig.cpp:632 msgid "" "The horizontal width of the brim that will be printed around each object on " "the first layer. When raft is used, no brim is generated (use " "raft_first_layer_expansion)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:527 +#: src/libslic3r/PrintConfig.cpp:641 msgid "Brim type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:529 +#: src/libslic3r/PrintConfig.cpp:643 msgid "" "The places where the brim will be printed around each object on the first " "layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:535 +#: src/libslic3r/PrintConfig.cpp:645 msgid "No brim" msgstr "" -#: src/libslic3r/PrintConfig.cpp:536 +#: src/libslic3r/PrintConfig.cpp:646 msgid "Outer brim only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:537 +#: src/libslic3r/PrintConfig.cpp:647 msgid "Inner brim only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:538 +#: src/libslic3r/PrintConfig.cpp:648 msgid "Outer and inner brim" msgstr "" -#: src/libslic3r/PrintConfig.cpp:543 +#: src/libslic3r/PrintConfig.cpp:654 msgid "Brim separation gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:545 +#: src/libslic3r/PrintConfig.cpp:656 msgid "" "Offset of brim from the printed object. The offset is applied after the " "elephant foot compensation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:552 -msgid "Clip multi-part objects" -msgstr "剪切多部分對象" - -#: src/libslic3r/PrintConfig.cpp:553 -msgid "" -"When printing multi-material objects, this settings will make Slic3r to clip " -"the overlapping object parts one by the other (2nd part will be clipped by " -"the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:560 +#: src/libslic3r/PrintConfig.cpp:663 msgid "Colorprint height" msgstr "彩色列印高度" -#: src/libslic3r/PrintConfig.cpp:561 +#: src/libslic3r/PrintConfig.cpp:664 msgid "Heights at which a filament change is to occur." msgstr "" -#: src/libslic3r/PrintConfig.cpp:571 +#: src/libslic3r/PrintConfig.cpp:674 msgid "Compatible printers condition" msgstr "兼容的印表機條件" -#: src/libslic3r/PrintConfig.cpp:572 +#: src/libslic3r/PrintConfig.cpp:675 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " @@ -10496,11 +12348,11 @@ msgstr "" "使用中的印表機配置文件的配置值的布爾表達式。如果此表達式的計算結果爲 true, 則" "此配置文件被視爲與活動印表機配置文件兼容。" -#: src/libslic3r/PrintConfig.cpp:586 +#: src/libslic3r/PrintConfig.cpp:689 msgid "Compatible print profiles condition" msgstr "兼容的列印配置文件條件" -#: src/libslic3r/PrintConfig.cpp:587 +#: src/libslic3r/PrintConfig.cpp:690 msgid "" "A boolean expression using the configuration values of an active print " "profile. If this expression evaluates to true, this profile is considered " @@ -10509,11 +12361,11 @@ msgstr "" "使用中的列印配置文件的配置值的布爾表達式。如果此表達式的計算結果爲 true, 則此" "配置文件被視爲與活動列印配置文件兼容。" -#: src/libslic3r/PrintConfig.cpp:604 +#: src/libslic3r/PrintConfig.cpp:707 msgid "Complete individual objects" msgstr "列印完成單個物體" -#: src/libslic3r/PrintConfig.cpp:605 +#: src/libslic3r/PrintConfig.cpp:708 msgid "" "When printing multiple objects or copies, this feature will complete each " "object before moving onto next one (and starting it from its bottom layer). " @@ -10524,33 +12376,33 @@ msgstr "" "(從底層開始)。此選項利於避免打毀掉物體。Slic3r應該給出警示,避免擠出頭碰" "撞,但請小心。" -#: src/libslic3r/PrintConfig.cpp:613 +#: src/libslic3r/PrintConfig.cpp:716 msgid "Enable auto cooling" msgstr "自動冷卻使能" -#: src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:717 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." msgstr "該選項啓動自動冷卻,使得可根據層列印時間調整列印速度和風扇速度。" -#: src/libslic3r/PrintConfig.cpp:619 +#: src/libslic3r/PrintConfig.cpp:722 msgid "Cooling tube position" msgstr "冷卻管位置" -#: src/libslic3r/PrintConfig.cpp:620 +#: src/libslic3r/PrintConfig.cpp:723 msgid "Distance of the center-point of the cooling tube from the extruder tip." msgstr "" -#: src/libslic3r/PrintConfig.cpp:627 +#: src/libslic3r/PrintConfig.cpp:730 msgid "Cooling tube length" msgstr "冷卻管長度" -#: src/libslic3r/PrintConfig.cpp:628 +#: src/libslic3r/PrintConfig.cpp:731 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "" -#: src/libslic3r/PrintConfig.cpp:636 +#: src/libslic3r/PrintConfig.cpp:739 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " @@ -10559,11 +12411,11 @@ msgstr "" "該值爲印表機在使用了特定的加速度值(如輪廓/填充)後將重置的加速度值。設爲0以" "防止重置加速度。" -#: src/libslic3r/PrintConfig.cpp:645 +#: src/libslic3r/PrintConfig.cpp:748 msgid "Default filament profile" msgstr "默認耗材絲配置" -#: src/libslic3r/PrintConfig.cpp:646 +#: src/libslic3r/PrintConfig.cpp:749 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " @@ -10572,12 +12424,12 @@ msgstr "" "與當前印表機配置文件關聯的默認耗材絲配置文件。在選擇當前印表機配置文件時, 將" "激活此耗材絲絲配置文件。" -#: src/libslic3r/PrintConfig.cpp:652 +#: src/libslic3r/PrintConfig.cpp:755 msgid "Default print profile" msgstr "默認 SLA 列印配置文件" -#: src/libslic3r/PrintConfig.cpp:653 src/libslic3r/PrintConfig.cpp:3542 -#: src/libslic3r/PrintConfig.cpp:3553 +#: src/libslic3r/PrintConfig.cpp:756 src/libslic3r/PrintConfig.cpp:3819 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -10586,11 +12438,11 @@ msgstr "" "與當前印表機配置文件關聯的默認列印配置文件。在選擇當前印表機配置文件時, 將激" "活此列印配置文件。" -#: src/libslic3r/PrintConfig.cpp:659 +#: src/libslic3r/PrintConfig.cpp:762 msgid "Disable fan for the first" msgstr "前幾層禁用風扇" -#: src/libslic3r/PrintConfig.cpp:660 +#: src/libslic3r/PrintConfig.cpp:763 msgid "" "You can set this to a positive value to disable fan at all during the first " "layers, so that it does not make adhesion worse." @@ -10598,31 +12450,31 @@ msgstr "" "您可以將其設置爲正值, 以便在第一層期間完全禁用風扇, 這樣就不會使粘附變得更" "糟。" -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:772 msgid "Don't support bridges" msgstr "不支持橋接" -#: src/libslic3r/PrintConfig.cpp:671 +#: src/libslic3r/PrintConfig.cpp:774 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." msgstr "試驗項,在橋接處禁止生成支撐材料。" -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:780 msgid "Distance between copies" msgstr "複製物體之間的距離" -#: src/libslic3r/PrintConfig.cpp:678 +#: src/libslic3r/PrintConfig.cpp:781 msgid "Distance used for the auto-arrange feature of the plater." msgstr "自動分佈時所使用的距離。" -#: src/libslic3r/PrintConfig.cpp:686 +#: src/libslic3r/PrintConfig.cpp:789 msgid "" "This end procedure is inserted at the end of the output file. Note that you " "can use placeholder variables for all PrusaSlicer settings." msgstr "" -#: src/libslic3r/PrintConfig.cpp:696 +#: src/libslic3r/PrintConfig.cpp:799 msgid "" "This end procedure is inserted at the end of the output file, before the " "printer end gcode (and before any toolchange from this filament in case of " @@ -10631,77 +12483,67 @@ msgid "" "in extruder order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:707 -msgid "Ensure vertical shell thickness" -msgstr "確保垂直外殼厚度" - -#: src/libslic3r/PrintConfig.cpp:709 -msgid "" -"Add solid infill near sloping surfaces to guarantee the vertical shell " -"thickness (top+bottom solid layers)." -msgstr "在傾斜表面附近添加實心填充, 以保證垂直外殼厚度 (頂部 + 底部實心層)。" - -#: src/libslic3r/PrintConfig.cpp:715 +#: src/libslic3r/PrintConfig.cpp:810 msgid "Top fill pattern" msgstr "頂部填充圖案" -#: src/libslic3r/PrintConfig.cpp:717 +#: src/libslic3r/PrintConfig.cpp:812 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." msgstr "填充模式的頂部填充。這隻影響頂部可見層, 而不影響其相鄰的實體外殼。" -#: src/libslic3r/PrintConfig.cpp:728 src/libslic3r/PrintConfig.cpp:1169 -#: src/libslic3r/PrintConfig.cpp:2754 src/libslic3r/PrintConfig.cpp:2771 +#: src/libslic3r/PrintConfig.cpp:815 src/libslic3r/PrintConfig.cpp:1228 +#: src/libslic3r/PrintConfig.cpp:2776 src/libslic3r/PrintConfig.cpp:2791 msgid "Rectilinear" msgstr "折線式" -#: src/libslic3r/PrintConfig.cpp:729 +#: src/libslic3r/PrintConfig.cpp:816 msgid "Monotonic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:730 +#: src/libslic3r/PrintConfig.cpp:817 msgid "Monotonic Lines" msgstr "" -#: src/libslic3r/PrintConfig.cpp:731 src/libslic3r/PrintConfig.cpp:1170 +#: src/libslic3r/PrintConfig.cpp:818 src/libslic3r/PrintConfig.cpp:1229 msgid "Aligned Rectilinear" msgstr "" -#: src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:1176 -#: src/libslic3r/PrintConfig.cpp:2772 +#: src/libslic3r/PrintConfig.cpp:819 src/libslic3r/PrintConfig.cpp:1235 +#: src/libslic3r/PrintConfig.cpp:2792 msgid "Concentric" msgstr "同軸式" -#: src/libslic3r/PrintConfig.cpp:733 src/libslic3r/PrintConfig.cpp:1180 +#: src/libslic3r/PrintConfig.cpp:820 src/libslic3r/PrintConfig.cpp:1239 msgid "Hilbert Curve" msgstr "希爾伯特曲線式" -#: src/libslic3r/PrintConfig.cpp:734 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:821 src/libslic3r/PrintConfig.cpp:1240 msgid "Archimedean Chords" msgstr "阿基米德和鉉式" # Not so sure about how to put "Octagram Spiral" in Chinese. Or maybe "Octagram螺旋“ is good. -#: src/libslic3r/PrintConfig.cpp:735 src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:822 src/libslic3r/PrintConfig.cpp:1241 msgid "Octagram Spiral" msgstr "八角星螺旋式" -#: src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:830 msgid "Bottom fill pattern" msgstr "底部填充圖案" -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:832 msgid "" "Fill pattern for bottom infill. This only affects the bottom external " "visible layer, and not its adjacent solid shells." msgstr "底部填充填充模式。這隻影響底部的外部可見層, 而不影響其相鄰的實體外殼。" -#: src/libslic3r/PrintConfig.cpp:753 src/libslic3r/PrintConfig.cpp:765 -#: src/libslic3r/PrintConfig.cpp:1988 +#: src/libslic3r/PrintConfig.cpp:839 src/libslic3r/PrintConfig.cpp:851 +#: src/libslic3r/PrintConfig.cpp:2018 msgid "External perimeters" msgstr "外圍輪廓" -#: src/libslic3r/PrintConfig.cpp:755 +#: src/libslic3r/PrintConfig.cpp:841 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " "perimeters. If left zero, default extrusion width will be used if set, " @@ -10712,18 +12554,18 @@ msgstr "" "度, 如果沒有設置默認值將使用 1.125 x 噴嘴直徑。如果以百分比表示 (例如 200%), " "則將根據圖層高度計算。" -#: src/libslic3r/PrintConfig.cpp:758 src/libslic3r/PrintConfig.cpp:869 -#: src/libslic3r/PrintConfig.cpp:1223 src/libslic3r/PrintConfig.cpp:1445 -#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1529 -#: src/libslic3r/PrintConfig.cpp:2011 src/libslic3r/PrintConfig.cpp:2397 -#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2660 -#: src/libslic3r/PrintConfig.cpp:2895 src/libslic3r/PrintConfig.cpp:3117 -#: src/libslic3r/PrintConfig.cpp:3132 src/libslic3r/PrintConfig.cpp:3166 -#: src/libslic3r/PrintConfig.cpp:3178 +#: src/libslic3r/PrintConfig.cpp:844 src/libslic3r/PrintConfig.cpp:958 +#: src/libslic3r/PrintConfig.cpp:1283 src/libslic3r/PrintConfig.cpp:1491 +#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1570 +#: src/libslic3r/PrintConfig.cpp:2041 src/libslic3r/PrintConfig.cpp:2428 +#: src/libslic3r/PrintConfig.cpp:2601 src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2983 src/libslic3r/PrintConfig.cpp:3204 +#: src/libslic3r/PrintConfig.cpp:3219 src/libslic3r/PrintConfig.cpp:3253 +#: src/libslic3r/PrintConfig.cpp:3265 msgid "mm or %" msgstr "mm 或 %" -#: src/libslic3r/PrintConfig.cpp:767 +#: src/libslic3r/PrintConfig.cpp:853 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " @@ -10732,28 +12574,22 @@ msgstr "" "此單獨設置將影響外圍輪廓 (可見的表面) 的速度。如果以百分比表示 (例如: 80%)它" "將在上面的周界速度設置上計算。自動設置爲零。" -#: src/libslic3r/PrintConfig.cpp:770 src/libslic3r/PrintConfig.cpp:1245 -#: src/libslic3r/PrintConfig.cpp:1256 src/libslic3r/PrintConfig.cpp:2356 -#: src/libslic3r/PrintConfig.cpp:2409 src/libslic3r/PrintConfig.cpp:2740 -#: src/libslic3r/PrintConfig.cpp:2909 -msgid "mm/s or %" -msgstr "mm/s 或 %" - -#: src/libslic3r/PrintConfig.cpp:777 +#: src/libslic3r/PrintConfig.cpp:863 msgid "External perimeters first" msgstr "先列印外圍輪廓" -#: src/libslic3r/PrintConfig.cpp:779 +#: src/libslic3r/PrintConfig.cpp:865 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." msgstr "從最外圍輪廓向最內部的輪廓列印,而不是反方向。" -#: src/libslic3r/PrintConfig.cpp:785 +#: src/libslic3r/PrintConfig.cpp:871 msgid "Extra perimeters if needed" msgstr "如果需要的話,擴展外圍輪廓" -#: src/libslic3r/PrintConfig.cpp:787 +#: src/libslic3r/PrintConfig.cpp:873 +#, fuzzy msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " "keeps adding perimeters, until more than 70% of the loop immediately above " @@ -10762,7 +12598,18 @@ msgstr "" "在需要時添加更多外圍輪廓, 以避免傾斜牆中的縫隙。Slic3r不斷添加輪廓,直到支持" "上面70%以上的循環。" -#: src/libslic3r/PrintConfig.cpp:797 +#: src/libslic3r/PrintConfig.cpp:880 +msgid "Extra perimeters on overhangs (Experimental)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:882 +msgid "" +"Detect overhang areas where bridges cannot be anchored, and fill them with " +"extra perimeter paths. These paths are anchored to the nearby non-overhang " +"area when possible." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:890 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " @@ -10771,7 +12618,7 @@ msgstr "" "要使用的擠出機 (除非指定了更具體的擠出機設置)。此值覆蓋外圍和填充擠出機, 但不" "覆蓋支持擠出機。" -#: src/libslic3r/PrintConfig.cpp:809 +#: src/libslic3r/PrintConfig.cpp:898 msgid "" "Set this to the vertical distance between your nozzle tip and (usually) the " "X carriage rods. In other words, this is the height of the clearance " @@ -10781,7 +12628,7 @@ msgstr "" "設置爲噴嘴尖端和(通常)X架杆之間的垂直距離。換句話說,這是在你的擠出機周圍的" "空隙氣缸的高度,它代表了擠出頭在與其他印列印物體碰撞前科達到的最大深度。" -#: src/libslic3r/PrintConfig.cpp:820 +#: src/libslic3r/PrintConfig.cpp:909 msgid "" "Set this to the clearance radius around your extruder. If the extruder is " "not centered, choose the largest value for safety. This setting is used to " @@ -10790,20 +12637,20 @@ msgstr "" "設置爲擠出頭周圍的空隙半徑。如果擠出頭未置中,安全起見請選擇最大值。該參數用" "於檢查碰撞,並在界面中顯示圖形預覽。" -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:919 msgid "Extruder Color" msgstr "擠出頭顏色" -#: src/libslic3r/PrintConfig.cpp:831 src/libslic3r/PrintConfig.cpp:894 -#: src/libslic3r/PrintConfig.cpp:3394 +#: src/libslic3r/PrintConfig.cpp:920 src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:3666 msgid "This is only used in the Slic3r interface as a visual help." msgstr "僅提供Slic3r界面的視覺幫助。" -#: src/libslic3r/PrintConfig.cpp:837 +#: src/libslic3r/PrintConfig.cpp:926 msgid "Extruder offset" msgstr "擠出頭偏置" -#: src/libslic3r/PrintConfig.cpp:838 +#: src/libslic3r/PrintConfig.cpp:927 msgid "" "If your firmware doesn't handle the extruder displacement you need the G-" "code to take it into account. This option lets you specify the displacement " @@ -10814,22 +12661,22 @@ msgstr "" "化每個擠出頭相對第一個擠出頭的位移量。一般爲正座標(它們將從XY座標相減得" "到)。" -#: src/libslic3r/PrintConfig.cpp:847 +#: src/libslic3r/PrintConfig.cpp:936 msgid "Extrusion axis" msgstr "擠出軸" -#: src/libslic3r/PrintConfig.cpp:848 +#: src/libslic3r/PrintConfig.cpp:937 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." msgstr "" "使用該項設置你的印表機擠出頭的軸所用字母(一般爲E,但有的印表機使用A)。" -#: src/libslic3r/PrintConfig.cpp:853 +#: src/libslic3r/PrintConfig.cpp:942 msgid "Extrusion multiplier" msgstr "擠出倍數" -#: src/libslic3r/PrintConfig.cpp:854 +#: src/libslic3r/PrintConfig.cpp:943 msgid "" "This factor changes the amount of flow proportionally. You may need to tweak " "this setting to get nice surface finish and correct single wall widths. " @@ -10840,11 +12687,11 @@ msgstr "" "的寬度。通常值範圍在0.9到1.1之間。如果你覺得有必要更改幅度更大,檢查絲料直徑" "和你的固件E步驟。" -#: src/libslic3r/PrintConfig.cpp:863 +#: src/libslic3r/PrintConfig.cpp:952 msgid "Default extrusion width" msgstr "默認擠出寬度" -#: src/libslic3r/PrintConfig.cpp:865 +#: src/libslic3r/PrintConfig.cpp:954 msgid "" "Set this to a non-zero value to allow a manual extrusion width. If left to " "zero, Slic3r derives extrusion widths from the nozzle diameter (see the " @@ -10856,11 +12703,11 @@ msgstr "" "擠出寬度 (請參閱周邊擠出寬度、填充擠出寬度等工具提示)。如果以百分比表示 (例" "如: 230%), 則將根據圖層高度計算。" -#: src/libslic3r/PrintConfig.cpp:877 +#: src/libslic3r/PrintConfig.cpp:966 msgid "Keep fan always on" msgstr "保持風扇總是打開" -#: src/libslic3r/PrintConfig.cpp:878 +#: src/libslic3r/PrintConfig.cpp:967 msgid "" "If this is enabled, fan will never be disabled and will be kept running at " "least at its minimum speed. Useful for PLA, harmful for ABS." @@ -10868,11 +12715,11 @@ msgstr "" "勾選此項,風扇將不會被關閉,在整個列印過程中將持續以不低於最低速開啓。對於PLA" "材料有用,對ABS材料不適用。" -#: src/libslic3r/PrintConfig.cpp:883 +#: src/libslic3r/PrintConfig.cpp:972 msgid "Enable fan if layer print time is below" msgstr "如果列印時間低於該值,則氣動風扇" -#: src/libslic3r/PrintConfig.cpp:884 +#: src/libslic3r/PrintConfig.cpp:973 msgid "" "If layer print time is estimated below this number of seconds, fan will be " "enabled and its speed will be calculated by interpolating the minimum and " @@ -10881,27 +12728,27 @@ msgstr "" "如果估算的列印時間低於該數值(單位爲秒),風扇將啓用,而且速度值根據插補最小" "速度值和最大速度值來計算。" -#: src/libslic3r/PrintConfig.cpp:886 src/libslic3r/PrintConfig.cpp:2344 +#: src/libslic3r/PrintConfig.cpp:975 src/libslic3r/PrintConfig.cpp:2375 msgid "approximate seconds" msgstr "秒(大約)" -#: src/libslic3r/PrintConfig.cpp:893 src/libslic3r/PrintConfig.cpp:3393 +#: src/libslic3r/PrintConfig.cpp:982 src/libslic3r/PrintConfig.cpp:3665 msgid "Color" msgstr "顏色" -#: src/libslic3r/PrintConfig.cpp:899 +#: src/libslic3r/PrintConfig.cpp:988 msgid "Filament notes" msgstr "絲料備註" -#: src/libslic3r/PrintConfig.cpp:900 +#: src/libslic3r/PrintConfig.cpp:989 msgid "You can put your notes regarding the filament here." msgstr "關於材料的備註可放這裏。" -#: src/libslic3r/PrintConfig.cpp:908 src/libslic3r/PrintConfig.cpp:1821 +#: src/libslic3r/PrintConfig.cpp:997 src/libslic3r/PrintConfig.cpp:1858 msgid "Max volumetric speed" msgstr "最大體積速度" -#: src/libslic3r/PrintConfig.cpp:909 +#: src/libslic3r/PrintConfig.cpp:998 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " @@ -10910,75 +12757,75 @@ msgstr "" "該材料所允許的最大體積速度。把最大體積速度限定爲列印速度和材料體積速度的最小" "值。設爲0則無限制。" -#: src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:1007 msgid "Loading speed" msgstr "加載速度" -#: src/libslic3r/PrintConfig.cpp:919 +#: src/libslic3r/PrintConfig.cpp:1008 msgid "Speed used for loading the filament on the wipe tower." msgstr "" -#: src/libslic3r/PrintConfig.cpp:926 +#: src/libslic3r/PrintConfig.cpp:1015 msgid "Loading speed at the start" msgstr "啓動時的加載速度" -#: src/libslic3r/PrintConfig.cpp:927 +#: src/libslic3r/PrintConfig.cpp:1016 msgid "Speed used at the very beginning of loading phase." msgstr "" -#: src/libslic3r/PrintConfig.cpp:934 +#: src/libslic3r/PrintConfig.cpp:1023 msgid "Unloading speed" msgstr "卸載速度" -#: src/libslic3r/PrintConfig.cpp:935 +#: src/libslic3r/PrintConfig.cpp:1024 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:943 +#: src/libslic3r/PrintConfig.cpp:1032 msgid "Unloading speed at the start" msgstr "啓動時卸載速度" -#: src/libslic3r/PrintConfig.cpp:944 +#: src/libslic3r/PrintConfig.cpp:1033 msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "" -#: src/libslic3r/PrintConfig.cpp:951 +#: src/libslic3r/PrintConfig.cpp:1040 msgid "Delay after unloading" msgstr "卸載後的延遲" -#: src/libslic3r/PrintConfig.cpp:952 +#: src/libslic3r/PrintConfig.cpp:1041 msgid "" "Time to wait after the filament is unloaded. May help to get reliable " "toolchanges with flexible materials that may need more time to shrink to " "original dimensions." msgstr "" -#: src/libslic3r/PrintConfig.cpp:961 +#: src/libslic3r/PrintConfig.cpp:1050 msgid "Number of cooling moves" msgstr "冷卻移動次數" -#: src/libslic3r/PrintConfig.cpp:962 +#: src/libslic3r/PrintConfig.cpp:1051 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " "Specify desired number of these moves." msgstr "" -#: src/libslic3r/PrintConfig.cpp:970 +#: src/libslic3r/PrintConfig.cpp:1059 msgid "Speed of the first cooling move" msgstr "第一次冷卻運動的速度" -#: src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:1060 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:978 +#: src/libslic3r/PrintConfig.cpp:1067 msgid "Minimal purge on wipe tower" msgstr "擦拭塔上的最小清理量" -#: src/libslic3r/PrintConfig.cpp:979 +#: src/libslic3r/PrintConfig.cpp:1068 msgid "" "After a tool change, the exact position of the newly loaded filament inside " "the nozzle may not be known, and the filament pressure is likely not yet " @@ -10990,23 +12837,23 @@ msgstr "" "穩定。在將列印頭清洗成填充物或填充對象之前, Slic3r 將始終將這些數量的材料放入" "擦拭塔中, 以可靠地產生連續的填充物或填充對象。" -#: src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:1072 msgid "mm³" msgstr "mm³" -#: src/libslic3r/PrintConfig.cpp:989 +#: src/libslic3r/PrintConfig.cpp:1078 msgid "Speed of the last cooling move" msgstr "最後一次冷卻移動的速度" -#: src/libslic3r/PrintConfig.cpp:990 +#: src/libslic3r/PrintConfig.cpp:1079 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:997 +#: src/libslic3r/PrintConfig.cpp:1086 msgid "Filament load time" msgstr "耗材絲加載時間" -#: src/libslic3r/PrintConfig.cpp:998 +#: src/libslic3r/PrintConfig.cpp:1087 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " "filament during a tool change (when executing the T code). This time is " @@ -11015,21 +12862,21 @@ msgstr "" "印表機固件 (或Multi Material Unit 2.0) 在工具更換期間 (執行 T 代碼時) 加載新" "耗材絲的時間。 G-code時間估計器將此時間添加到總列印時間中。" -#: src/libslic3r/PrintConfig.cpp:1005 +#: src/libslic3r/PrintConfig.cpp:1094 msgid "Ramming parameters" msgstr "衝壓參數" -#: src/libslic3r/PrintConfig.cpp:1006 +#: src/libslic3r/PrintConfig.cpp:1095 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1012 +#: src/libslic3r/PrintConfig.cpp:1101 msgid "Filament unload time" msgstr "耗材絲卸載時間" -#: src/libslic3r/PrintConfig.cpp:1013 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " "filament during a tool change (when executing the T code). This time is " @@ -11038,7 +12885,7 @@ msgstr "" "印表機固件 (或Multi Material Unit 2.0) 在工具更換期間 (執行 T 代碼時) 卸載耗" "材絲的時間。 G-code時間估計器將此時間添加到總列印時間中。" -#: src/libslic3r/PrintConfig.cpp:1021 +#: src/libslic3r/PrintConfig.cpp:1110 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " @@ -11047,12 +12894,12 @@ msgstr "" "在這裏輸入你的材料直徑。需要較高精度,所以請使用卡尺,沿着材料長絲做多次測" "量,計算平均值。" -#: src/libslic3r/PrintConfig.cpp:1028 src/libslic3r/PrintConfig.cpp:3432 -#: src/libslic3r/PrintConfig.cpp:3433 +#: src/libslic3r/PrintConfig.cpp:1117 src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3710 msgid "Density" msgstr "密度" -#: src/libslic3r/PrintConfig.cpp:1029 +#: src/libslic3r/PrintConfig.cpp:1118 msgid "" "Enter your filament density here. This is only for statistical information. " "A decent way is to weigh a known length of filament and compute the ratio of " @@ -11062,42 +12909,42 @@ msgstr "" "在這裏輸入你的絲料密度。此僅爲統計信息。一個不錯的方法是測量一段已知長度絲料" "的重量,然後計算體積。更好的方法式直接通過位移計算體積。" -#: src/libslic3r/PrintConfig.cpp:1032 +#: src/libslic3r/PrintConfig.cpp:1121 msgid "g/cm³" msgstr "g/cm³" -#: src/libslic3r/PrintConfig.cpp:1037 +#: src/libslic3r/PrintConfig.cpp:1126 msgid "Filament type" msgstr "耗材類型" -#: src/libslic3r/PrintConfig.cpp:1038 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "The filament material type for use in custom G-codes." msgstr "用於自定義 G-codes的耗材絲材料類型。" -#: src/libslic3r/PrintConfig.cpp:1066 +#: src/libslic3r/PrintConfig.cpp:1155 msgid "Soluble material" msgstr "可溶性材料" -#: src/libslic3r/PrintConfig.cpp:1067 +#: src/libslic3r/PrintConfig.cpp:1156 msgid "Soluble material is most likely used for a soluble support." msgstr "可溶性材料最可能用於可溶性支撐。" -#: src/libslic3r/PrintConfig.cpp:1073 +#: src/libslic3r/PrintConfig.cpp:1162 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." msgstr "在這裏輸入絲料每公斤的價格。僅用於統計信息。" # Set this to be the local currency symbol. -#: src/libslic3r/PrintConfig.cpp:1074 +#: src/libslic3r/PrintConfig.cpp:1163 msgid "money/kg" msgstr "¥/kg" -#: src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1168 msgid "Spool weight" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1080 +#: src/libslic3r/PrintConfig.cpp:1169 msgid "" "Enter weight of the empty filament spool. One may weigh a partially consumed " "filament spool before printing and one may compare the measured weight with " @@ -11105,19 +12952,19 @@ msgid "" "amount of filament on the spool is sufficient to finish the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1084 +#: src/libslic3r/PrintConfig.cpp:1173 msgid "g" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1093 src/libslic3r/PrintConfig.cpp:3537 +#: src/libslic3r/PrintConfig.cpp:1182 src/libslic3r/PrintConfig.cpp:3814 msgid "(Unknown)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:1186 msgid "Fill angle" msgstr "填充角度" -#: src/libslic3r/PrintConfig.cpp:1099 +#: src/libslic3r/PrintConfig.cpp:1188 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " @@ -11126,90 +12973,90 @@ msgstr "" "填充的默認基礎方向角。交叉引線適用於此。橋接處將使用Slic3r所偵測的最好方向來" "填充,所以此參數不影響它們。" -#: src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1199 msgid "Fill density" msgstr "填充密度" -#: src/libslic3r/PrintConfig.cpp:1113 +#: src/libslic3r/PrintConfig.cpp:1201 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "內部填充的密度,以0% - 100% 表示。" -#: src/libslic3r/PrintConfig.cpp:1148 +#: src/libslic3r/PrintConfig.cpp:1224 msgid "Fill pattern" msgstr "填充樣式" -#: src/libslic3r/PrintConfig.cpp:1150 +#: src/libslic3r/PrintConfig.cpp:1226 msgid "Fill pattern for general low-density infill." msgstr "一般低密度填充的填充樣式。" -#: src/libslic3r/PrintConfig.cpp:1171 src/libslic3r/PrintConfig.cpp:2803 +#: src/libslic3r/PrintConfig.cpp:1230 src/libslic3r/PrintConfig.cpp:2822 msgid "Grid" msgstr "網格" -#: src/libslic3r/PrintConfig.cpp:1173 +#: src/libslic3r/PrintConfig.cpp:1232 msgid "Stars" msgstr "星級" -#: src/libslic3r/PrintConfig.cpp:1174 +#: src/libslic3r/PrintConfig.cpp:1233 msgid "Cubic" msgstr "立方體" -#: src/libslic3r/PrintConfig.cpp:1175 +#: src/libslic3r/PrintConfig.cpp:1234 msgid "Line" msgstr "線" -#: src/libslic3r/PrintConfig.cpp:1177 src/libslic3r/PrintConfig.cpp:2756 +#: src/libslic3r/PrintConfig.cpp:1236 src/libslic3r/PrintConfig.cpp:2778 msgid "Honeycomb" msgstr "蜂窩" -#: src/libslic3r/PrintConfig.cpp:1178 +#: src/libslic3r/PrintConfig.cpp:1237 msgid "3D Honeycomb" msgstr "3D 蜂窩" -#: src/libslic3r/PrintConfig.cpp:1179 +#: src/libslic3r/PrintConfig.cpp:1238 msgid "Gyroid" msgstr "螺旋形" -#: src/libslic3r/PrintConfig.cpp:1183 +#: src/libslic3r/PrintConfig.cpp:1242 msgid "Adaptive Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1184 +#: src/libslic3r/PrintConfig.cpp:1243 msgid "Support Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1185 +#: src/libslic3r/PrintConfig.cpp:1244 msgid "Lightning" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1190 +#: src/libslic3r/PrintConfig.cpp:1250 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." msgstr "此項爲印表機對首層使用的加速度。設爲0則對首層禁用加速控制。" -#: src/libslic3r/PrintConfig.cpp:1198 +#: src/libslic3r/PrintConfig.cpp:1258 msgid "First object layer over raft interface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1199 +#: src/libslic3r/PrintConfig.cpp:1259 msgid "" "This is the acceleration your printer will use for first layer of object " "above raft interface. Set zero to disable acceleration control for first " "layer of object above raft interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "First layer bed temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1209 +#: src/libslic3r/PrintConfig.cpp:1269 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." msgstr "首層的加熱板溫度。設爲0,可在輸出中禁用機牀溫度控制指令。" -#: src/libslic3r/PrintConfig.cpp:1219 +#: src/libslic3r/PrintConfig.cpp:1279 msgid "" "Set this to a non-zero value to set a manual extrusion width for first " "layer. You can use this to force fatter extrudates for better adhesion. If " @@ -11220,18 +13067,18 @@ msgstr "" "以得到更好的附着力。如果以百分比表示 (例如 120%), 則將在第一層高度上計算。如" "果設置爲零, 它將使用默認的擠出寬度。" -#: src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1293 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " "plates." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1301 msgid "First layer speed" msgstr "首層速度" -#: src/libslic3r/PrintConfig.cpp:1242 +#: src/libslic3r/PrintConfig.cpp:1302 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " @@ -11240,11 +13087,11 @@ msgstr "" "如果表示爲mm/s的數值,該值將被用於首層的列印動作,無關動作的類型。如果表示爲" "百分數(如40%),則以默認速度值爲基準。" -#: src/libslic3r/PrintConfig.cpp:1252 +#: src/libslic3r/PrintConfig.cpp:1312 msgid "Speed of object first layer over raft interface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1253 +#: src/libslic3r/PrintConfig.cpp:1313 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first object layer above raft interface, regardless " @@ -11252,22 +13099,22 @@ msgid "" "the default speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1263 +#: src/libslic3r/PrintConfig.cpp:1323 msgid "First layer nozzle temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1264 +#: src/libslic3r/PrintConfig.cpp:1324 msgid "" "Nozzle temperature for the first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " "commands in the output G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1272 +#: src/libslic3r/PrintConfig.cpp:1332 msgid "Full fan speed at layer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1273 +#: src/libslic3r/PrintConfig.cpp:1333 msgid "" "Fan speed will be ramped up linearly from zero at layer " "\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". " @@ -11276,50 +13123,54 @@ msgid "" "maximum allowed speed at layer \"disable_fan_first_layers\" + 1." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1285 +#: src/libslic3r/PrintConfig.cpp:1345 msgid "Fuzzy skin type." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1348 msgid "Outside walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1293 +#: src/libslic3r/PrintConfig.cpp:1349 msgid "All walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1298 +#: src/libslic3r/PrintConfig.cpp:1355 msgid "Fuzzy skin thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1300 +#: src/libslic3r/PrintConfig.cpp:1357 msgid "" "The maximum distance that each skin point can be offset (both ways), " "measured perpendicular to the perimeter wall." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1308 +#: src/libslic3r/PrintConfig.cpp:1365 msgid "Fuzzy skin point distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1310 +#: src/libslic3r/PrintConfig.cpp:1367 msgid "" "Perimeters will be split into multiple segments by inserting Fuzzy skin " "points. Lowering the Fuzzy skin point distance will increase the number of " "randomly offset points on the perimeter wall." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1318 +#: src/libslic3r/PrintConfig.cpp:1375 msgid "Fill gaps" msgstr "填充間隙" -#: src/libslic3r/PrintConfig.cpp:1320 +#: src/libslic3r/PrintConfig.cpp:1377 msgid "" "Enables filling of gaps between perimeters and between the inner most " "perimeters and infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1327 +#: src/libslic3r/PrintConfig.cpp:1382 +msgid "Gap fill" +msgstr "間隙填充" + +#: src/libslic3r/PrintConfig.cpp:1384 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " @@ -11328,11 +13179,11 @@ msgstr "" "使用短鋸齒形移動來填補小縫隙的速度。保持合理的低值, 以避免過多的晃動和共振問" "題。設置爲零, 以禁用間隙填充。" -#: src/libslic3r/PrintConfig.cpp:1335 +#: src/libslic3r/PrintConfig.cpp:1392 msgid "Verbose G-code" msgstr "詳細的G代碼" -#: src/libslic3r/PrintConfig.cpp:1336 +#: src/libslic3r/PrintConfig.cpp:1393 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " @@ -11341,11 +13192,11 @@ msgstr "" "啓動該項可獲得帶註釋的G代碼文件,每一行都有對應的解釋性文字。如果從SD卡列印," "文件冗餘部分可能減緩你的固件運行速度。" -#: src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1400 msgid "G-code flavor" msgstr "G代碼風格" -#: src/libslic3r/PrintConfig.cpp:1344 +#: src/libslic3r/PrintConfig.cpp:1401 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " @@ -11353,15 +13204,15 @@ msgid "" "extrusion value at all." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1416 msgid "No extrusion" msgstr "無擠出" -#: src/libslic3r/PrintConfig.cpp:1376 +#: src/libslic3r/PrintConfig.cpp:1422 msgid "Label objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1377 +#: src/libslic3r/PrintConfig.cpp:1423 msgid "" "Enable this to add comments into the G-Code labeling print moves with what " "object they belong to, which is useful for the Octoprint CancelObject " @@ -11369,19 +13220,19 @@ msgid "" "setup and Wipe into Object / Wipe into Infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1384 +#: src/libslic3r/PrintConfig.cpp:1430 msgid "G-code substitutions" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1385 +#: src/libslic3r/PrintConfig.cpp:1431 msgid "Find / replace patterns in G-code lines and substitute them." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1390 +#: src/libslic3r/PrintConfig.cpp:1436 msgid "High extruder current on filament swap" msgstr "耗材絲切換時的高擠出機電流" -#: src/libslic3r/PrintConfig.cpp:1391 +#: src/libslic3r/PrintConfig.cpp:1437 msgid "" "It may be beneficial to increase the extruder motor current during the " "filament exchange sequence to allow for rapid ramming feed rates and to " @@ -11390,29 +13241,39 @@ msgstr "" "在耗材絲切換序列中增加擠出機電機電流可能是有益的, 這樣可以快速衝擊進料速度, " "並在用不良形狀的尖端加載耗材絲時克服阻力。" -#: src/libslic3r/PrintConfig.cpp:1399 +#: src/libslic3r/PrintConfig.cpp:1445 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." msgstr "印表機填充加速度。設爲0可禁用填充加速控制。" -#: src/libslic3r/PrintConfig.cpp:1408 +#: src/libslic3r/PrintConfig.cpp:1453 src/libslic3r/PrintConfig.cpp:2423 +#: src/libslic3r/PrintConfig.cpp:2435 +msgid "Solid infill" +msgstr "實心填充" + +#: src/libslic3r/PrintConfig.cpp:1454 msgid "" "This is the acceleration your printer will use for solid infill. Set zero to " "use the value for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:2977 +#: src/libslic3r/PrintConfig.cpp:2990 +msgid "Top solid infill" +msgstr "頂部實心填充" + +#: src/libslic3r/PrintConfig.cpp:1463 msgid "" "This is the acceleration your printer will use for top solid infill. Set " "zero to use the value for solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1426 +#: src/libslic3r/PrintConfig.cpp:1472 msgid "Combine infill every" msgstr "每幾層聯合填充" -#: src/libslic3r/PrintConfig.cpp:1428 +#: src/libslic3r/PrintConfig.cpp:1474 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." @@ -11420,15 +13281,15 @@ msgstr "" "該功能可通過擠出更厚的填充層來實現聯合填充,並加速列印,同時保留了薄壁,也就" "保證了精度。" -#: src/libslic3r/PrintConfig.cpp:1431 +#: src/libslic3r/PrintConfig.cpp:1477 msgid "Combine infill every n layers" msgstr "混合填充每 n 個層" -#: src/libslic3r/PrintConfig.cpp:1437 +#: src/libslic3r/PrintConfig.cpp:1483 msgid "Length of the infill anchor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1439 +#: src/libslic3r/PrintConfig.cpp:1485 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -11441,35 +13302,35 @@ msgid "" "perimeters connected to a single infill line." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1455 +#: src/libslic3r/PrintConfig.cpp:1495 msgid "0 (no open anchors)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1456 src/libslic3r/PrintConfig.cpp:1479 +#: src/libslic3r/PrintConfig.cpp:1496 src/libslic3r/PrintConfig.cpp:1519 msgid "1 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1457 src/libslic3r/PrintConfig.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:1520 msgid "2 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1458 src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1498 src/libslic3r/PrintConfig.cpp:1521 msgid "5 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1459 src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1499 src/libslic3r/PrintConfig.cpp:1522 msgid "10 mm" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1460 src/libslic3r/PrintConfig.cpp:1483 +#: src/libslic3r/PrintConfig.cpp:1500 src/libslic3r/PrintConfig.cpp:1523 msgid "1000 (unlimited)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1465 +#: src/libslic3r/PrintConfig.cpp:1506 msgid "Maximum length of the infill anchor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1508 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -11481,19 +13342,19 @@ msgid "" "parameter. Set this parameter to zero to disable anchoring." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1478 +#: src/libslic3r/PrintConfig.cpp:1518 msgid "0 (not anchored)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1488 +#: src/libslic3r/PrintConfig.cpp:1529 msgid "Infill extruder" msgstr "填充擠出頭" -#: src/libslic3r/PrintConfig.cpp:1490 +#: src/libslic3r/PrintConfig.cpp:1531 msgid "The extruder to use when printing infill." msgstr "列印填充時使用的擠出頭。" -#: src/libslic3r/PrintConfig.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:1539 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill. If " "left zero, default extrusion width will be used if set, otherwise 1.125 x " @@ -11505,21 +13366,21 @@ msgstr "" "擠出寬度, 否則將使用 1.125 x 噴嘴直徑。你可能想使用更多的擠出物來加速填充, 使" "你的部件更結實。如果以百分比表示 (例如 90%), 則將在圖層高度上計算。" -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1550 msgid "Infill before perimeters" msgstr "先填充後列印輪廓" -#: src/libslic3r/PrintConfig.cpp:1510 +#: src/libslic3r/PrintConfig.cpp:1551 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." msgstr "該選項將列印輪廓和填充的方式對調,使後者提前。" -#: src/libslic3r/PrintConfig.cpp:1515 +#: src/libslic3r/PrintConfig.cpp:1556 msgid "Only infill where needed" msgstr "僅在需要時填充" -#: src/libslic3r/PrintConfig.cpp:1517 +#: src/libslic3r/PrintConfig.cpp:1558 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " @@ -11528,11 +13389,11 @@ msgstr "" "該選項將把填充限定用於支撐天花板(將充當內部支撐材料的作用)。如果啓用,由於" "多個包含的選項將使G代碼生成速度變慢。" -#: src/libslic3r/PrintConfig.cpp:1524 +#: src/libslic3r/PrintConfig.cpp:1565 msgid "Infill/perimeters overlap" msgstr "填充/輪廓重疊" -#: src/libslic3r/PrintConfig.cpp:1526 +#: src/libslic3r/PrintConfig.cpp:1567 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -11542,23 +13403,23 @@ msgstr "" "使得填充和輪廓間有額外的重疊部分,便於結合。理論上並不需要,但偏移可能會導致" "間隙。如果表示爲百分數(如15%),則以輪廓擠出寬度爲基準。" -#: src/libslic3r/PrintConfig.cpp:1537 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "列印內部填充的速度。零爲自動設置。" -#: src/libslic3r/PrintConfig.cpp:1545 +#: src/libslic3r/PrintConfig.cpp:1586 msgid "Inherits profile" msgstr "繼承配置文件" -#: src/libslic3r/PrintConfig.cpp:1546 +#: src/libslic3r/PrintConfig.cpp:1587 msgid "Name of the profile, from which this profile inherits." msgstr "此配置文件從中繼承的配置文件的名稱。" -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1600 msgid "Interface shells" msgstr "表面外殼" -#: src/libslic3r/PrintConfig.cpp:1560 +#: src/libslic3r/PrintConfig.cpp:1601 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " @@ -11567,61 +13428,61 @@ msgstr "" "在相鄰的材料/包圍體之間強制生成可靠外殼層。適用於使用半透明材料或手工可溶性支" "撐材料的多擠出頭列印。" -#: src/libslic3r/PrintConfig.cpp:1568 +#: src/libslic3r/PrintConfig.cpp:1609 msgid "Maximum width of a segmented region" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1569 +#: src/libslic3r/PrintConfig.cpp:1610 msgid "Maximum width of a segmented region. Zero disables this feature." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1570 src/libslic3r/PrintConfig.cpp:2189 -#: src/libslic3r/PrintConfig.cpp:2198 +#: src/libslic3r/PrintConfig.cpp:1611 src/libslic3r/PrintConfig.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2228 msgid "mm (zero to disable)" msgstr "mm (0禁用)" -#: src/libslic3r/PrintConfig.cpp:1577 +#: src/libslic3r/PrintConfig.cpp:1618 msgid "Enable ironing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1578 +#: src/libslic3r/PrintConfig.cpp:1619 msgid "" "Enable ironing of the top layers with the hot print head for smooth surface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1584 src/libslic3r/PrintConfig.cpp:1586 +#: src/libslic3r/PrintConfig.cpp:1625 src/libslic3r/PrintConfig.cpp:1627 msgid "Ironing Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1591 +#: src/libslic3r/PrintConfig.cpp:1629 msgid "All top surfaces" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Topmost surface only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1593 +#: src/libslic3r/PrintConfig.cpp:1631 msgid "All solid surfaces" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1598 +#: src/libslic3r/PrintConfig.cpp:1637 msgid "Flow rate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Percent of a flow rate relative to object's normal layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1608 +#: src/libslic3r/PrintConfig.cpp:1647 msgid "Spacing between ironing passes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1649 msgid "Distance between ironing lines" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1627 +#: src/libslic3r/PrintConfig.cpp:1666 msgid "" "This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can " @@ -11631,11 +13492,11 @@ msgstr "" "這段G代碼在每一層變化後,即Z軸移動後,擠出頭移動到第一層的點之前插入。注意除" "了使用如[layer_num]和[layer_z],也可以使用佔位符變量來代替Slic3r的參數。" -#: src/libslic3r/PrintConfig.cpp:1638 +#: src/libslic3r/PrintConfig.cpp:1677 msgid "Supports remaining times" msgstr "支撐剩餘時間" -#: src/libslic3r/PrintConfig.cpp:1639 +#: src/libslic3r/PrintConfig.cpp:1678 msgid "" "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " "intervals into the G-code to let the firmware show accurate remaining time. " @@ -11646,155 +13507,155 @@ msgstr "" "code , 讓固件顯示準確的剩餘時間。到目前爲止, 只有 Prusa i3 MK3 固件識別 M73。" "此外, i3 MK3 固件支持 M73 Qxx Sxx 的靜音模式。" -#: src/libslic3r/PrintConfig.cpp:1647 +#: src/libslic3r/PrintConfig.cpp:1686 msgid "Supports stealth mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1687 msgid "The firmware supports stealth mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1653 +#: src/libslic3r/PrintConfig.cpp:1692 msgid "How to apply limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1654 +#: src/libslic3r/PrintConfig.cpp:1693 msgid "Purpose of Machine Limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1656 +#: src/libslic3r/PrintConfig.cpp:1695 msgid "How to apply the Machine Limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1661 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "Emit to G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1662 +#: src/libslic3r/PrintConfig.cpp:1698 msgid "Use for time estimate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1663 +#: src/libslic3r/PrintConfig.cpp:1699 msgid "Ignore" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1686 +#: src/libslic3r/PrintConfig.cpp:1723 msgid "Maximum feedrate X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1687 +#: src/libslic3r/PrintConfig.cpp:1724 msgid "Maximum feedrate Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1688 +#: src/libslic3r/PrintConfig.cpp:1725 msgid "Maximum feedrate Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1689 +#: src/libslic3r/PrintConfig.cpp:1726 msgid "Maximum feedrate E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1692 +#: src/libslic3r/PrintConfig.cpp:1729 msgid "Maximum feedrate of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1693 +#: src/libslic3r/PrintConfig.cpp:1730 msgid "Maximum feedrate of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1694 +#: src/libslic3r/PrintConfig.cpp:1731 msgid "Maximum feedrate of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1695 +#: src/libslic3r/PrintConfig.cpp:1732 msgid "Maximum feedrate of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1703 +#: src/libslic3r/PrintConfig.cpp:1740 msgid "Maximum acceleration X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1704 +#: src/libslic3r/PrintConfig.cpp:1741 msgid "Maximum acceleration Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1705 +#: src/libslic3r/PrintConfig.cpp:1742 msgid "Maximum acceleration Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1706 +#: src/libslic3r/PrintConfig.cpp:1743 msgid "Maximum acceleration E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1709 +#: src/libslic3r/PrintConfig.cpp:1746 msgid "Maximum acceleration of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1710 +#: src/libslic3r/PrintConfig.cpp:1747 msgid "Maximum acceleration of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1711 +#: src/libslic3r/PrintConfig.cpp:1748 msgid "Maximum acceleration of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1712 +#: src/libslic3r/PrintConfig.cpp:1749 msgid "Maximum acceleration of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1720 +#: src/libslic3r/PrintConfig.cpp:1757 msgid "Maximum jerk X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1721 +#: src/libslic3r/PrintConfig.cpp:1758 msgid "Maximum jerk Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1722 +#: src/libslic3r/PrintConfig.cpp:1759 msgid "Maximum jerk Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1723 +#: src/libslic3r/PrintConfig.cpp:1760 msgid "Maximum jerk E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:1763 msgid "Maximum jerk of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1764 msgid "Maximum jerk of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1728 +#: src/libslic3r/PrintConfig.cpp:1765 msgid "Maximum jerk of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1729 +#: src/libslic3r/PrintConfig.cpp:1766 msgid "Maximum jerk of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1739 +#: src/libslic3r/PrintConfig.cpp:1776 msgid "Minimum feedrate when extruding" msgstr "擠出時的最小進給率" -#: src/libslic3r/PrintConfig.cpp:1741 +#: src/libslic3r/PrintConfig.cpp:1778 msgid "Minimum feedrate when extruding (M205 S)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1749 +#: src/libslic3r/PrintConfig.cpp:1786 msgid "Minimum travel feedrate" msgstr "最小移動進給率" -#: src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:1788 msgid "Minimum travel feedrate (M205 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1759 +#: src/libslic3r/PrintConfig.cpp:1796 msgid "Maximum acceleration when extruding" msgstr "擠出時的最大加速度" -#: src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1798 msgid "" "Maximum acceleration when extruding (M204 P)\n" "\n" @@ -11802,31 +13663,31 @@ msgid "" "(M204 T)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1772 +#: src/libslic3r/PrintConfig.cpp:1809 msgid "Maximum acceleration when retracting" msgstr "回縮時的最大加速度" -#: src/libslic3r/PrintConfig.cpp:1774 +#: src/libslic3r/PrintConfig.cpp:1811 msgid "Maximum acceleration when retracting (M204 R)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1782 +#: src/libslic3r/PrintConfig.cpp:1819 msgid "Maximum acceleration for travel moves" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1784 +#: src/libslic3r/PrintConfig.cpp:1821 msgid "Maximum acceleration for travel moves (M204 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1791 src/libslic3r/PrintConfig.cpp:1800 +#: src/libslic3r/PrintConfig.cpp:1828 src/libslic3r/PrintConfig.cpp:1837 msgid "Max" msgstr "最大值" -#: src/libslic3r/PrintConfig.cpp:1792 +#: src/libslic3r/PrintConfig.cpp:1829 msgid "This setting represents the maximum speed of your fan." msgstr "該值表示風扇的最大速度。" -#: src/libslic3r/PrintConfig.cpp:1801 +#: src/libslic3r/PrintConfig.cpp:1838 msgid "" "This is the highest printable layer height for this extruder, used to cap " "the variable layer height and support layer height. Maximum recommended " @@ -11837,11 +13698,11 @@ msgstr "" "層高度爲擠出寬度的 75%, 以實現合理的層間粘附。如果設置爲 0, 圖層高度將限制爲" "噴嘴直徑的75%。" -#: src/libslic3r/PrintConfig.cpp:1811 +#: src/libslic3r/PrintConfig.cpp:1848 msgid "Max print speed" msgstr "最大列印速度" -#: src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1849 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " @@ -11850,17 +13711,17 @@ msgstr "" "當將其他速度參數設爲0時,Slic3r會自動計算最優速度以保證擠出頭壓力穩定。該試驗" "參數用於設置所允許的最大列印速度。" -#: src/libslic3r/PrintConfig.cpp:1822 +#: src/libslic3r/PrintConfig.cpp:1859 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." msgstr "該實驗參數用於設置你的擠出頭所支持的最大體積速度。" -#: src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1867 msgid "Max volumetric slope positive" msgstr "最大流量增加率" -#: src/libslic3r/PrintConfig.cpp:1831 +#: src/libslic3r/PrintConfig.cpp:1868 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from lower speed to higher speed. A value of 1.8 mm³/" @@ -11869,15 +13730,15 @@ msgid "" "(feedrate 60 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1836 src/libslic3r/PrintConfig.cpp:1848 +#: src/libslic3r/PrintConfig.cpp:1873 src/libslic3r/PrintConfig.cpp:1885 msgid "mm³/s²" msgstr "mm³/s²" -#: src/libslic3r/PrintConfig.cpp:1842 +#: src/libslic3r/PrintConfig.cpp:1879 msgid "Max volumetric slope negative" msgstr "最大流量減少率" -#: src/libslic3r/PrintConfig.cpp:1843 +#: src/libslic3r/PrintConfig.cpp:1880 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate for a transition from higher speed to lower speed. A value of 1.8 mm³/" @@ -11886,15 +13747,15 @@ msgid "" "(feedrate 20 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1854 src/libslic3r/PrintConfig.cpp:1863 +#: src/libslic3r/PrintConfig.cpp:1891 src/libslic3r/PrintConfig.cpp:1900 msgid "Min" msgstr "最小值" -#: src/libslic3r/PrintConfig.cpp:1855 +#: src/libslic3r/PrintConfig.cpp:1892 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "該參數表示你的風扇工作的最小PWM。" -#: src/libslic3r/PrintConfig.cpp:1864 +#: src/libslic3r/PrintConfig.cpp:1901 msgid "" "This is the lowest printable layer height for this extruder and limits the " "resolution for variable layer height. Typical values are between 0.05 mm and " @@ -11903,19 +13764,19 @@ msgstr "" "這是此擠出機的最低可列印層高度, 並限制可變圖層高度的分辨率。典型值介於 0.05 " "mm 和 0.1 mm 之間。" -#: src/libslic3r/PrintConfig.cpp:1872 +#: src/libslic3r/PrintConfig.cpp:1909 msgid "Min print speed" msgstr "最小列印速度" -#: src/libslic3r/PrintConfig.cpp:1873 +#: src/libslic3r/PrintConfig.cpp:1910 msgid "Slic3r will not scale speed down below this speed." msgstr "Slic3r的最小列印速度。" -#: src/libslic3r/PrintConfig.cpp:1880 +#: src/libslic3r/PrintConfig.cpp:1917 msgid "Minimal filament extrusion length" msgstr "最小耗材絲擠出長度" -#: src/libslic3r/PrintConfig.cpp:1881 +#: src/libslic3r/PrintConfig.cpp:1918 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " @@ -11924,56 +13785,53 @@ msgstr "" "在底層上消耗指定材料量生成環邊。對於多擠出頭的機器,該最小值適用於每個擠出" "頭。" -#: src/libslic3r/PrintConfig.cpp:1890 +#: src/libslic3r/PrintConfig.cpp:1927 msgid "Configuration notes" msgstr "配置備註" -#: src/libslic3r/PrintConfig.cpp:1891 +#: src/libslic3r/PrintConfig.cpp:1928 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." msgstr "" "你可以在這裏輸入你的個人備註。該段文字內容將被添加到G代碼文件開頭的註釋裏。" -#: src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:1938 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "這是你的擠出頭噴嘴的直徑(比如:0.5,0.35等。)" -#: src/libslic3r/PrintConfig.cpp:1906 +#: src/libslic3r/PrintConfig.cpp:1943 msgid "Host Type" msgstr "主機類型" -#: src/libslic3r/PrintConfig.cpp:1907 +#: src/libslic3r/PrintConfig.cpp:1944 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." msgstr "Slic3r 可以將 G-code 文件上載到印表機主機。此字段必須包含主機的類型。" -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:1961 msgid "Only retract when crossing perimeters" msgstr "僅在越過輪廓時回縮" -#: src/libslic3r/PrintConfig.cpp:1930 +#: src/libslic3r/PrintConfig.cpp:1962 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." msgstr "當空程不超過上層輪廓時禁用回撤(這樣滴垂現象可能會看不見)。" -#: src/libslic3r/PrintConfig.cpp:1937 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "" "This option will drop the temperature of the inactive extruders to prevent " -"oozing. It will enable a tall skirt automatically and move extruders outside " -"such skirt when changing temperatures." +"oozing. " msgstr "" -"此選項將降低不活動擠出機的溫度, 以防止滲出。它將自動啓用一條高大的裙邊, 並在" -"溫度變化時將擠出機移到這種裙邊之外。" -#: src/libslic3r/PrintConfig.cpp:1944 +#: src/libslic3r/PrintConfig.cpp:1974 msgid "Output filename format" msgstr "輸出文件名稱格式" -#: src/libslic3r/PrintConfig.cpp:1945 +#: src/libslic3r/PrintConfig.cpp:1975 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -11984,11 +13842,11 @@ msgstr "" "[timestamp], [year], [month], [day], [hour], [minute], [second], [version], " "[input_filename], [input_filename_base]。" -#: src/libslic3r/PrintConfig.cpp:1954 +#: src/libslic3r/PrintConfig.cpp:1984 msgid "Detect bridging perimeters" msgstr "偵測橋接輪廓" -#: src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:1986 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." @@ -11996,21 +13854,21 @@ msgstr "" "試驗選項,用於調整懸空部位的流量(使用橋接流量),將橋接速度用於它們並啓用風" "扇。" -#: src/libslic3r/PrintConfig.cpp:1962 +#: src/libslic3r/PrintConfig.cpp:1992 msgid "Filament parking position" msgstr "耗材絲停車位" -#: src/libslic3r/PrintConfig.cpp:1963 +#: src/libslic3r/PrintConfig.cpp:1993 msgid "" "Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1971 +#: src/libslic3r/PrintConfig.cpp:2001 msgid "Extra loading distance" msgstr "額外的裝載長度" -#: src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:2002 msgid "" "When set to zero, the distance the filament is moved from parking position " "during load is exactly the same as it was moved back during unload. When " @@ -12018,33 +13876,33 @@ msgid "" "than unloading." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1980 src/libslic3r/PrintConfig.cpp:2005 -#: src/libslic3r/PrintConfig.cpp:2019 src/libslic3r/PrintConfig.cpp:2029 +#: src/libslic3r/PrintConfig.cpp:2010 src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2049 src/libslic3r/PrintConfig.cpp:2059 msgid "Perimeters" msgstr "輪廓" -#: src/libslic3r/PrintConfig.cpp:1981 +#: src/libslic3r/PrintConfig.cpp:2011 msgid "" "This is the acceleration your printer will use for perimeters. Set zero to " "disable acceleration control for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1989 +#: src/libslic3r/PrintConfig.cpp:2019 msgid "" "This is the acceleration your printer will use for external perimeters. Set " "zero to use the value for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1996 +#: src/libslic3r/PrintConfig.cpp:2026 msgid "Perimeter extruder" msgstr "輪廓擠出頭" -#: src/libslic3r/PrintConfig.cpp:1998 +#: src/libslic3r/PrintConfig.cpp:2028 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "列印輪廓和裙邊所使用的擠出頭。第一個擠出頭是1。" -#: src/libslic3r/PrintConfig.cpp:2007 +#: src/libslic3r/PrintConfig.cpp:2037 msgid "" "Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. If " @@ -12056,12 +13914,12 @@ msgstr "" "更精確的表面。如果爲零, 則如果設置, 將使用默認擠出寬度, 否則將使用 1.125 x 噴" "嘴直徑。如果以百分比表示 (例如 200%), 則將在圖層高度上計算。" -#: src/libslic3r/PrintConfig.cpp:2021 +#: src/libslic3r/PrintConfig.cpp:2051 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "邊界的速度 (等高線, 也稱爲垂直殼)。自動設置爲零。" -#: src/libslic3r/PrintConfig.cpp:2031 +#: src/libslic3r/PrintConfig.cpp:2061 msgid "" "This option sets the number of perimeters to generate for each layer. Note " "that Slic3r may increase this number automatically when it detects sloping " @@ -12071,11 +13929,11 @@ msgstr "" "該選項設置每一層生成的輪廓個數。注意,如果”額外輪廓“選項被啓動,Slic3r在偵測" "到斜坡表面時可能會自動增加該數值,因爲較多的輪廓有利於斜坡表面的列印。" -#: src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2065 msgid "(minimum)" msgstr "(最小)" -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "" "If you want to process the output G-code through custom scripts, just list " "their absolute paths here. Separate multiple scripts with a semicolon. " @@ -12087,90 +13945,90 @@ msgstr "" "號分隔多個腳本。腳本將作爲第一個參數傳遞到 G-code 文件的絕對路徑, 並且它們可" "以通過讀取環境變量訪問 Slic3r 配置設置。" -#: src/libslic3r/PrintConfig.cpp:2055 +#: src/libslic3r/PrintConfig.cpp:2085 msgid "Printer type" msgstr "印表機類型" -#: src/libslic3r/PrintConfig.cpp:2056 +#: src/libslic3r/PrintConfig.cpp:2086 msgid "Type of the printer." msgstr "印表機的類型." -#: src/libslic3r/PrintConfig.cpp:2061 +#: src/libslic3r/PrintConfig.cpp:2091 msgid "Printer notes" msgstr "印表機備註" -#: src/libslic3r/PrintConfig.cpp:2062 +#: src/libslic3r/PrintConfig.cpp:2092 msgid "You can put your notes regarding the printer here." msgstr "您可以在此處放置有關印表機的備註." -#: src/libslic3r/PrintConfig.cpp:2070 +#: src/libslic3r/PrintConfig.cpp:2100 msgid "Printer vendor" msgstr "印表機供應商" -#: src/libslic3r/PrintConfig.cpp:2071 +#: src/libslic3r/PrintConfig.cpp:2101 msgid "Name of the printer vendor." msgstr "印表機供應商的名稱." -#: src/libslic3r/PrintConfig.cpp:2076 +#: src/libslic3r/PrintConfig.cpp:2106 msgid "Printer variant" msgstr "印表機版本" -#: src/libslic3r/PrintConfig.cpp:2077 +#: src/libslic3r/PrintConfig.cpp:2107 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." msgstr "印表機變體的版本。例如, 印表機版本可以通過噴嘴直徑進行區分。" -#: src/libslic3r/PrintConfig.cpp:2094 +#: src/libslic3r/PrintConfig.cpp:2124 msgid "Raft contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2096 +#: src/libslic3r/PrintConfig.cpp:2126 msgid "" "The vertical distance between object and raft. Ignored for soluble interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2103 +#: src/libslic3r/PrintConfig.cpp:2133 msgid "Raft expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2105 +#: src/libslic3r/PrintConfig.cpp:2135 msgid "Expansion of the raft in XY plane for better stability." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:2142 msgid "First layer density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2114 +#: src/libslic3r/PrintConfig.cpp:2144 msgid "Density of the first raft or support layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2122 +#: src/libslic3r/PrintConfig.cpp:2152 msgid "First layer expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2124 +#: src/libslic3r/PrintConfig.cpp:2154 msgid "" "Expansion of the first raft or support layer to improve adhesion to print " "bed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2131 +#: src/libslic3r/PrintConfig.cpp:2161 msgid "Raft layers" msgstr "筏板層" -#: src/libslic3r/PrintConfig.cpp:2133 +#: src/libslic3r/PrintConfig.cpp:2163 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." msgstr "物體將被該數目的層數擡起,而支撐材料將在其下方生成。" -#: src/libslic3r/PrintConfig.cpp:2141 +#: src/libslic3r/PrintConfig.cpp:2171 msgid "Slice resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2142 +#: src/libslic3r/PrintConfig.cpp:2172 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -12180,11 +14038,11 @@ msgstr "" "最小細節分辨率,用來簡化輸入文件,加速切片,減少內存佔用。印表機通常很難渲染" "出高精度模型的細節。設爲0則禁用任何簡化,完全依照輸入文件的精度。" -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:2182 msgid "G-code resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2153 +#: src/libslic3r/PrintConfig.cpp:2183 msgid "" "Maximum deviation of exported G-code paths from their full resolution " "counterparts. Very high resolution G-code requires huge amount of RAM to " @@ -12195,42 +14053,42 @@ msgid "" "produced." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2164 +#: src/libslic3r/PrintConfig.cpp:2194 msgid "Minimum travel after retraction" msgstr "回縮後最小空程" -#: src/libslic3r/PrintConfig.cpp:2165 +#: src/libslic3r/PrintConfig.cpp:2195 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "當空程短於此長度時不會觸發回縮。" -#: src/libslic3r/PrintConfig.cpp:2171 +#: src/libslic3r/PrintConfig.cpp:2201 msgid "Retract amount before wipe" msgstr "擦拭前的回縮量" -#: src/libslic3r/PrintConfig.cpp:2172 +#: src/libslic3r/PrintConfig.cpp:2202 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." msgstr "對於遠程擠出機, 在做擦拭動作之前, 做一些快速的收回可能是明智的。" -#: src/libslic3r/PrintConfig.cpp:2179 +#: src/libslic3r/PrintConfig.cpp:2209 msgid "Retract on layer change" msgstr "層變化時回縮" -#: src/libslic3r/PrintConfig.cpp:2180 +#: src/libslic3r/PrintConfig.cpp:2210 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "該項強制在Z軸移動完成時回縮。" -#: src/libslic3r/PrintConfig.cpp:2185 src/libslic3r/PrintConfig.cpp:2193 +#: src/libslic3r/PrintConfig.cpp:2215 src/libslic3r/PrintConfig.cpp:2223 msgid "Length" msgstr "長度" -#: src/libslic3r/PrintConfig.cpp:2186 +#: src/libslic3r/PrintConfig.cpp:2216 msgid "Retraction Length" msgstr "回縮長度" -#: src/libslic3r/PrintConfig.cpp:2187 +#: src/libslic3r/PrintConfig.cpp:2217 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " @@ -12239,11 +14097,11 @@ msgstr "" "當觸發回縮時,絲料以指定值往回收縮(長度以在進入擠出頭之前的原始材料爲基礎進" "行計算)。" -#: src/libslic3r/PrintConfig.cpp:2194 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Retraction Length (Toolchange)" msgstr "回縮長度 (工具更換)" -#: src/libslic3r/PrintConfig.cpp:2195 +#: src/libslic3r/PrintConfig.cpp:2225 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " @@ -12252,11 +14110,11 @@ msgstr "" "當在改變工具前觸發回縮時,絲料以指定值回縮(長度以進入擠出頭前的原始材料爲基" "礎測量)。" -#: src/libslic3r/PrintConfig.cpp:2203 +#: src/libslic3r/PrintConfig.cpp:2233 msgid "Lift Z" msgstr "擡高Z" -#: src/libslic3r/PrintConfig.cpp:2204 +#: src/libslic3r/PrintConfig.cpp:2234 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " @@ -12265,15 +14123,15 @@ msgstr "" "如果設爲正值,每當回縮觸發時Z軸會快速擡升。當使用多個擠出頭時,僅會考慮第一個" "擠出頭的該參數。" -#: src/libslic3r/PrintConfig.cpp:2211 +#: src/libslic3r/PrintConfig.cpp:2241 msgid "Above Z" msgstr "在Z上方" -#: src/libslic3r/PrintConfig.cpp:2212 +#: src/libslic3r/PrintConfig.cpp:2242 msgid "Only lift Z above" msgstr "僅提升 Z 高於" -#: src/libslic3r/PrintConfig.cpp:2213 +#: src/libslic3r/PrintConfig.cpp:2243 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " @@ -12282,15 +14140,15 @@ msgstr "" "如果設爲正值,僅在指定的絕對Z值上方纔會擡高Z。可以調整該參數,用於跳過在前幾" "層時跳過Z擡高的步驟。" -#: src/libslic3r/PrintConfig.cpp:2220 +#: src/libslic3r/PrintConfig.cpp:2250 msgid "Below Z" msgstr "Z下方" -#: src/libslic3r/PrintConfig.cpp:2221 +#: src/libslic3r/PrintConfig.cpp:2251 msgid "Only lift Z below" msgstr "僅提升 Z 低於" -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2252 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " @@ -12299,36 +14157,36 @@ msgstr "" "如果設爲正值,僅在指定的絕對Z值選房可以調整該參數,用於將擡高Z的動作限制在前" "幾層時。" -#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2238 +#: src/libslic3r/PrintConfig.cpp:2260 src/libslic3r/PrintConfig.cpp:2268 msgid "Extra length on restart" msgstr "重啓時額外長度" -#: src/libslic3r/PrintConfig.cpp:2231 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." msgstr "" "當在空程後回縮被補償時,擠出頭會基礎額外的指定量絲料。該參數一般不需設置。" -#: src/libslic3r/PrintConfig.cpp:2239 +#: src/libslic3r/PrintConfig.cpp:2269 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." msgstr "當在切換工具後回縮被補償時,擠出頭會基礎額外的指定量絲料。" -#: src/libslic3r/PrintConfig.cpp:2246 src/libslic3r/PrintConfig.cpp:2247 +#: src/libslic3r/PrintConfig.cpp:2276 src/libslic3r/PrintConfig.cpp:2277 msgid "Retraction Speed" msgstr "回抽速度" -#: src/libslic3r/PrintConfig.cpp:2248 +#: src/libslic3r/PrintConfig.cpp:2278 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "回縮速度 (僅適用於擠出機電機)." -#: src/libslic3r/PrintConfig.cpp:2254 src/libslic3r/PrintConfig.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:2284 src/libslic3r/PrintConfig.cpp:2285 msgid "Deretraction Speed" msgstr "減速速度" -#: src/libslic3r/PrintConfig.cpp:2256 +#: src/libslic3r/PrintConfig.cpp:2286 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " @@ -12337,68 +14195,82 @@ msgstr "" "收回後將耗材絲裝入擠出機的速度 (僅適用於擠出機電機)。如果保持爲零, 則使用回縮" "速度。" -#: src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2293 msgid "Seam position" msgstr "接合位置" -#: src/libslic3r/PrintConfig.cpp:2265 +#: src/libslic3r/PrintConfig.cpp:2295 msgid "Position of perimeters starting points." msgstr "輪廓開始點的位置。" -#: src/libslic3r/PrintConfig.cpp:2272 +#: src/libslic3r/PrintConfig.cpp:2297 +msgid "Random" +msgstr "隨機" + +#: src/libslic3r/PrintConfig.cpp:2298 msgid "Nearest" msgstr "最近的" -#: src/libslic3r/PrintConfig.cpp:2273 +#: src/libslic3r/PrintConfig.cpp:2299 msgid "Aligned" msgstr "對齊" -#: src/libslic3r/PrintConfig.cpp:2281 +#: src/libslic3r/PrintConfig.cpp:2306 +msgid "Staggered inner seams" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2307 +msgid "" +"This option causes the inner seams to be shifted backwards based on their " +"depth, forming a zigzag pattern." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2314 msgid "Direction" msgstr "方向" -#: src/libslic3r/PrintConfig.cpp:2283 +#: src/libslic3r/PrintConfig.cpp:2316 msgid "Preferred direction of the seam" msgstr "接縫的首選方向" -#: src/libslic3r/PrintConfig.cpp:2284 +#: src/libslic3r/PrintConfig.cpp:2317 msgid "Seam preferred direction" msgstr "接縫首選方向" -#: src/libslic3r/PrintConfig.cpp:2291 +#: src/libslic3r/PrintConfig.cpp:2324 msgid "Jitter" msgstr "Jitter" -#: src/libslic3r/PrintConfig.cpp:2293 +#: src/libslic3r/PrintConfig.cpp:2326 msgid "Seam preferred direction jitter" msgstr "接縫首選方向抖動" -#: src/libslic3r/PrintConfig.cpp:2294 +#: src/libslic3r/PrintConfig.cpp:2327 msgid "Preferred direction of the seam - jitter" msgstr "接縫抖動的首選方向" -#: src/libslic3r/PrintConfig.cpp:2301 +#: src/libslic3r/PrintConfig.cpp:2334 msgid "Distance from brim/object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2335 msgid "" "Distance between skirt and brim (when draft shield is not used) or objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2308 +#: src/libslic3r/PrintConfig.cpp:2341 msgid "Skirt height" msgstr "環邊高度" -#: src/libslic3r/PrintConfig.cpp:2309 +#: src/libslic3r/PrintConfig.cpp:2342 msgid "Height of skirt expressed in layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2348 msgid "Draft shield" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2316 +#: src/libslic3r/PrintConfig.cpp:2349 msgid "" "With draft shield active, the skirt will be printed skirt_distance from the " "object, possibly intersecting brim.\n" @@ -12408,27 +14280,27 @@ msgid "" "from print bed due to wind draft." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2324 +#: src/libslic3r/PrintConfig.cpp:2354 msgid "Disabled" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2325 +#: src/libslic3r/PrintConfig.cpp:2355 msgid "Limited" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2326 +#: src/libslic3r/PrintConfig.cpp:2356 msgid "Enabled" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2331 +#: src/libslic3r/PrintConfig.cpp:2362 msgid "Loops (minimum)" msgstr "圈數(最小)" -#: src/libslic3r/PrintConfig.cpp:2332 +#: src/libslic3r/PrintConfig.cpp:2363 msgid "Skirt Loops" msgstr "裙邊圈數" -#: src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2364 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " @@ -12437,11 +14309,11 @@ msgstr "" "環邊的圈數。如果設置了最小擠出長度,那麼圈數必須比這裏設置的值要大。設爲0則完" "全禁用環邊。" -#: src/libslic3r/PrintConfig.cpp:2341 +#: src/libslic3r/PrintConfig.cpp:2372 msgid "Slow down if layer print time is below" msgstr "如果圖層列印時間低於該值則減速" -#: src/libslic3r/PrintConfig.cpp:2342 +#: src/libslic3r/PrintConfig.cpp:2373 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." @@ -12449,11 +14321,11 @@ msgstr "" "如果預計列印時間低於該值(單位爲秒),則列印速度將降低以使列印時間延長到該" "值。" -#: src/libslic3r/PrintConfig.cpp:2351 +#: src/libslic3r/PrintConfig.cpp:2382 msgid "Small perimeters" msgstr "小邊界" -#: src/libslic3r/PrintConfig.cpp:2353 +#: src/libslic3r/PrintConfig.cpp:2384 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " @@ -12462,33 +14334,33 @@ msgstr "" "此單獨設置將影響半徑爲 < = 6.5 mm (通常爲孔) 的邊界的速度。如果以百分比表示 " "(例如: 80%), 則將根據上面的邊界速度設置進行計算。自動設置爲零。" -#: src/libslic3r/PrintConfig.cpp:2363 +#: src/libslic3r/PrintConfig.cpp:2394 msgid "Solid infill threshold area" msgstr "可靠填充閾值區域" -#: src/libslic3r/PrintConfig.cpp:2365 +#: src/libslic3r/PrintConfig.cpp:2396 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." msgstr "對於比指定閾值小的區域強制進行可靠填充。" -#: src/libslic3r/PrintConfig.cpp:2366 +#: src/libslic3r/PrintConfig.cpp:2397 msgid "mm²" msgstr "mm²" -#: src/libslic3r/PrintConfig.cpp:2372 +#: src/libslic3r/PrintConfig.cpp:2403 msgid "Solid infill extruder" msgstr "可靠填充擠出頭" -#: src/libslic3r/PrintConfig.cpp:2374 +#: src/libslic3r/PrintConfig.cpp:2405 msgid "The extruder to use when printing solid infill." msgstr "當列印可靠填充時使用的擠出頭。" -#: src/libslic3r/PrintConfig.cpp:2380 +#: src/libslic3r/PrintConfig.cpp:2411 msgid "Solid infill every" msgstr "每幾層可靠填充" -#: src/libslic3r/PrintConfig.cpp:2382 +#: src/libslic3r/PrintConfig.cpp:2413 msgid "" "This feature allows to force a solid layer every given number of layers. " "Zero to disable. You can set this to any value (for example 9999); Slic3r " @@ -12498,7 +14370,7 @@ msgstr "" "該功能使得每指定數目層強制進行一次可靠填充。設爲0禁用該功能。可以設爲任意值" "(如9999);Slic3r會根據噴嘴直徑和層高來自動選擇圖層的最大可能個數。" -#: src/libslic3r/PrintConfig.cpp:2394 +#: src/libslic3r/PrintConfig.cpp:2425 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "solid surfaces. If left zero, default extrusion width will be used if set, " @@ -12509,7 +14381,7 @@ msgstr "" "使用默認擠出寬度, 否則將使用 1.125 x 噴嘴直徑。如果以百分比表示 (例如 90%)它" "將被計算在層的高度。" -#: src/libslic3r/PrintConfig.cpp:2406 +#: src/libslic3r/PrintConfig.cpp:2437 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " @@ -12518,19 +14390,19 @@ msgstr "" "列印實心區域的速度 (頂部/內部水平外殼)。這可以用百分比表示 (例如: 80%)超過上" "面的默認填充速度。自動設置爲零。" -#: src/libslic3r/PrintConfig.cpp:2418 +#: src/libslic3r/PrintConfig.cpp:2449 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "在頂部和底部表面生成的可靠層數。" -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2455 src/libslic3r/PrintConfig.cpp:2456 msgid "Minimum thickness of a top / bottom shell" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2431 +#: src/libslic3r/PrintConfig.cpp:2462 msgid "Spiral vase" msgstr "螺旋式容器" -#: src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2463 msgid "" "This feature will raise Z gradually while printing a single-walled object in " "order to remove any visible seam. This option requires a single perimeter, " @@ -12539,20 +14411,17 @@ msgid "" "when printing more than one single object." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2440 +#: src/libslic3r/PrintConfig.cpp:2471 msgid "Temperature variation" msgstr "溫度變化" -#: src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:2472 msgid "" -"Temperature difference to be applied when an extruder is not active. Enables " -"a full-height \"sacrificial\" skirt on which the nozzles are periodically " -"wiped." +"Temperature difference to be applied when an extruder is not active. The " +"value is not used when 'idle_temperature' in filament settings is defined." msgstr "" -"當擠出機處於非活動狀態時, 要應用溫差。啓用全高的 \"犧牲\" 裙邊, 定期擦拭噴" -"嘴。" -#: src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2483 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -12563,7 +14432,7 @@ msgid "" "put a \"M109 S[first_layer_temperature]\" command wherever you want." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2466 +#: src/libslic3r/PrintConfig.cpp:2498 msgid "" "This start procedure is inserted at the beginning, after any printer start " "gcode (and after any toolchange to this filament in case of multi-material " @@ -12576,45 +14445,45 @@ msgid "" "extruders, the gcode is processed in extruder order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2514 msgid "Color change G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2483 +#: src/libslic3r/PrintConfig.cpp:2515 msgid "This G-code will be used as a code for the color change" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2492 +#: src/libslic3r/PrintConfig.cpp:2524 msgid "This G-code will be used as a code for the pause print" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2501 +#: src/libslic3r/PrintConfig.cpp:2533 msgid "This G-code will be used as a custom code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2509 +#: src/libslic3r/PrintConfig.cpp:2541 msgid "Single Extruder Multi Material" msgstr "單擠出機多材料" -#: src/libslic3r/PrintConfig.cpp:2510 +#: src/libslic3r/PrintConfig.cpp:2542 msgid "The printer multiplexes filaments into a single hot end." msgstr "印表機將耗材絲多路複用到一個熱端。" -#: src/libslic3r/PrintConfig.cpp:2515 +#: src/libslic3r/PrintConfig.cpp:2547 msgid "Prime all printing extruders" msgstr "裝填所有印刷擠出機" -#: src/libslic3r/PrintConfig.cpp:2516 +#: src/libslic3r/PrintConfig.cpp:2548 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." msgstr "如果啓用, 所有列印擠出機都將在列印開始時在列印牀的前緣進行裝填。" -#: src/libslic3r/PrintConfig.cpp:2521 +#: src/libslic3r/PrintConfig.cpp:2553 msgid "No sparse layers (EXPERIMENTAL)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2554 msgid "" "If enabled, the wipe tower will not be printed on layers with no " "toolchanges. On layers with a toolchange, extruder will travel downward to " @@ -12622,11 +14491,11 @@ msgid "" "with the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2529 +#: src/libslic3r/PrintConfig.cpp:2561 msgid "Slice gap closing radius" msgstr "切片間隙閉合半徑" -#: src/libslic3r/PrintConfig.cpp:2531 +#: src/libslic3r/PrintConfig.cpp:2563 msgid "" "Cracks smaller than 2x gap closing radius are being filled during the " "triangle mesh slicing. The gap closing operation may reduce the final print " @@ -12635,41 +14504,41 @@ msgstr "" "在三角形網格切片過程中, 小於2倍間隙閉合半徑的裂紋將會被填充。間隙閉合操作可能" "會降低最終列印分辨率, 因此最好將該值保持在合理的較低水平。" -#: src/libslic3r/PrintConfig.cpp:2539 +#: src/libslic3r/PrintConfig.cpp:2571 msgid "Slicing Mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2541 +#: src/libslic3r/PrintConfig.cpp:2573 msgid "" "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " "close all holes in the model." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2575 msgid "Regular" msgstr "一般" -#: src/libslic3r/PrintConfig.cpp:2547 +#: src/libslic3r/PrintConfig.cpp:2576 msgid "Even-odd" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2548 +#: src/libslic3r/PrintConfig.cpp:2577 msgid "Close holes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2553 +#: src/libslic3r/PrintConfig.cpp:2583 msgid "Generate support material" msgstr "生成支撐材料" -#: src/libslic3r/PrintConfig.cpp:2555 +#: src/libslic3r/PrintConfig.cpp:2585 msgid "Enable support material generation." msgstr "啓用支撐材料生成功能。" -#: src/libslic3r/PrintConfig.cpp:2559 +#: src/libslic3r/PrintConfig.cpp:2589 msgid "Auto generated supports" msgstr "自動生成支撐" -#: src/libslic3r/PrintConfig.cpp:2561 +#: src/libslic3r/PrintConfig.cpp:2591 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " @@ -12678,11 +14547,11 @@ msgstr "" "如果選中, 將根據懸垂閾值自動生成支持。如果未選中, 則僅在 \"支撐執行器\" 空間" "內生成支持。" -#: src/libslic3r/PrintConfig.cpp:2567 +#: src/libslic3r/PrintConfig.cpp:2597 msgid "XY separation between an object and its support" msgstr "對象與其支撐之間的 XY 分離距離" -#: src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2599 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." @@ -12690,27 +14559,27 @@ msgstr "" "對象與其支撐之間的 xy 分離距離。如果表示爲百分比 (例如 50%), 則將根據外部外圍" "寬度計算。" -#: src/libslic3r/PrintConfig.cpp:2580 +#: src/libslic3r/PrintConfig.cpp:2610 msgid "Pattern angle" msgstr "樣式角度" -#: src/libslic3r/PrintConfig.cpp:2582 +#: src/libslic3r/PrintConfig.cpp:2612 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." msgstr "使用該參數對支撐材料的樣子在水平面上進行旋轉。" -#: src/libslic3r/PrintConfig.cpp:2592 src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:2622 src/libslic3r/PrintConfig.cpp:3411 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." msgstr "僅在熱牀上生成支撐,不在列印出來的物體上生成。" -#: src/libslic3r/PrintConfig.cpp:2598 +#: src/libslic3r/PrintConfig.cpp:2627 msgid "Top contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2600 +#: src/libslic3r/PrintConfig.cpp:2629 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " @@ -12718,40 +14587,38 @@ msgid "" msgstr "" "物體和支撐材料平面之間的垂直距離。設爲0,則表面上第一層不會被當做橋來處理。" -#: src/libslic3r/PrintConfig.cpp:2608 +#: src/libslic3r/PrintConfig.cpp:2635 msgid "0 (soluble)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2609 +#: src/libslic3r/PrintConfig.cpp:2636 msgid "0.1 (detachable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2610 +#: src/libslic3r/PrintConfig.cpp:2637 msgid "0.2 (detachable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2616 +#: src/libslic3r/PrintConfig.cpp:2643 msgid "Bottom contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2618 +#: src/libslic3r/PrintConfig.cpp:2645 msgid "" "The vertical distance between the object top surface and the support " "material interface. If set to zero, support_material_contact_distance will " "be used for both top and bottom contact Z distances." msgstr "" -#. TRN To be shown in Print Settings "Bottom contact Z distance". Have to be as short as possible -#. TRN To be shown in Print Settings "Bottom interface layers". Have to be as short as possible -#: src/libslic3r/PrintConfig.cpp:2626 src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2651 src/libslic3r/PrintConfig.cpp:2732 msgid "Same as top" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2633 +#: src/libslic3r/PrintConfig.cpp:2659 msgid "Enforce support for the first" msgstr "前幾層增強支撐" -#: src/libslic3r/PrintConfig.cpp:2635 +#: src/libslic3r/PrintConfig.cpp:2661 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -12761,15 +14628,15 @@ msgstr "" "從底部開始,對指定數目的圖層生成支撐材料,無論正常的支撐材料是否啓用,也不管" "任何角度閾值。適用於在熱牀上腳太細、站不住的物件,便於更好的粘附。" -#: src/libslic3r/PrintConfig.cpp:2640 +#: src/libslic3r/PrintConfig.cpp:2666 msgid "Enforce support for the first n layers" msgstr "強制支撐前 n 層" -#: src/libslic3r/PrintConfig.cpp:2646 +#: src/libslic3r/PrintConfig.cpp:2672 msgid "Support material/raft/skirt extruder" msgstr "支撐材料/筏/環邊擠出頭" -#: src/libslic3r/PrintConfig.cpp:2648 +#: src/libslic3r/PrintConfig.cpp:2674 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." @@ -12777,7 +14644,7 @@ msgstr "" "列印支撐材料、基座和裙邊時使用的擠出機 (1+, 0 用於使用當前擠出機以最大限度地" "減少工具切換)." -#: src/libslic3r/PrintConfig.cpp:2657 +#: src/libslic3r/PrintConfig.cpp:2683 msgid "" "Set this to a non-zero value to set a manual extrusion width for support " "material. If left zero, default extrusion width will be used if set, " @@ -12788,20 +14655,20 @@ msgstr "" "默認的擠出寬度, 否則將使用噴嘴直徑。如果以百分比表示 (例如 90%)它將根據層的高" "度計算。" -#: src/libslic3r/PrintConfig.cpp:2667 +#: src/libslic3r/PrintConfig.cpp:2693 msgid "Interface loops" msgstr "接觸面圈數" -#: src/libslic3r/PrintConfig.cpp:2669 +#: src/libslic3r/PrintConfig.cpp:2695 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "用循環覆蓋支撐物的頂部接觸層。默認情況下禁用。" -#: src/libslic3r/PrintConfig.cpp:2674 +#: src/libslic3r/PrintConfig.cpp:2700 msgid "Support material/raft interface extruder" msgstr "支撐材料/筏表面擠出頭" -#: src/libslic3r/PrintConfig.cpp:2676 +#: src/libslic3r/PrintConfig.cpp:2702 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." @@ -12809,61 +14676,65 @@ msgstr "" "列印支撐材料界面時要使用的擠出機 (1+, 0 用於使用當前擠出機以最大限度地減少工" "具切換)。這也會影響基座." -#: src/libslic3r/PrintConfig.cpp:2684 +#: src/libslic3r/PrintConfig.cpp:2709 msgid "Top interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2711 msgid "" "Number of interface layers to insert between the object(s) and support " "material." msgstr "在物體和支撐材料中間插入的表面層數。" -#: src/libslic3r/PrintConfig.cpp:2693 +#: src/libslic3r/PrintConfig.cpp:2715 src/libslic3r/PrintConfig.cpp:2733 msgid "0 (off)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2716 src/libslic3r/PrintConfig.cpp:2734 msgid "1 (light)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2695 +#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2735 msgid "2 (default)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2696 +#: src/libslic3r/PrintConfig.cpp:2718 src/libslic3r/PrintConfig.cpp:2736 msgid "3 (heavy)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:2724 msgid "Bottom interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2704 +#: src/libslic3r/PrintConfig.cpp:2726 msgid "" "Number of interface layers to insert between the object(s) and support " "material. Set to -1 to use support_material_interface_layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2717 +#: src/libslic3r/PrintConfig.cpp:2742 msgid "Closing radius" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2719 +#: src/libslic3r/PrintConfig.cpp:2744 msgid "" "For snug supports, the support regions will be merged using morphological " "closing operation. Gaps smaller than the closing radius will be filled in." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2727 +#: src/libslic3r/PrintConfig.cpp:2752 msgid "Interface pattern spacing" msgstr "表面樣式間隔" -#: src/libslic3r/PrintConfig.cpp:2729 +#: src/libslic3r/PrintConfig.cpp:2754 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "表面直線間的間隔。設爲0獲得可靠表面。" -#: src/libslic3r/PrintConfig.cpp:2738 +#: src/libslic3r/PrintConfig.cpp:2761 +msgid "Support material interface" +msgstr "支持材料端口" + +#: src/libslic3r/PrintConfig.cpp:2763 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " @@ -12872,73 +14743,72 @@ msgstr "" "列印支撐材料表面層的速度。若表示爲百分數(如50%),則以支撐材料速度爲基準計" "算。" -#: src/libslic3r/PrintConfig.cpp:2747 +#: src/libslic3r/PrintConfig.cpp:2772 msgid "Pattern" msgstr "樣式" -#: src/libslic3r/PrintConfig.cpp:2749 +#: src/libslic3r/PrintConfig.cpp:2774 msgid "Pattern used to generate support material." msgstr "生成支撐材料的樣式。" -#: src/libslic3r/PrintConfig.cpp:2755 +#: src/libslic3r/PrintConfig.cpp:2777 msgid "Rectilinear grid" msgstr "直線網格" -#: src/libslic3r/PrintConfig.cpp:2761 +#: src/libslic3r/PrintConfig.cpp:2784 msgid "Interface pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2763 +#: src/libslic3r/PrintConfig.cpp:2786 msgid "" "Pattern used to generate support material interface. Default pattern for non-" "soluble support interface is Rectilinear, while default pattern for soluble " "support interface is Concentric." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2777 +#: src/libslic3r/PrintConfig.cpp:2798 msgid "Pattern spacing" msgstr "樣式間隔" -#: src/libslic3r/PrintConfig.cpp:2779 +#: src/libslic3r/PrintConfig.cpp:2800 msgid "Spacing between support material lines." msgstr "支撐材料直線間的間隙。" -#: src/libslic3r/PrintConfig.cpp:2788 +#: src/libslic3r/PrintConfig.cpp:2809 msgid "Speed for printing support material." msgstr "列印支撐材料的速度。" -#: src/libslic3r/PrintConfig.cpp:2795 -msgid "Style" -msgstr "樣式" - -#: src/libslic3r/PrintConfig.cpp:2797 +#: src/libslic3r/PrintConfig.cpp:2818 msgid "" "Style and shape of the support towers. Projecting the supports into a " "regular grid will create more stable supports, while snug support towers " "will save material and reduce object scarring." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2804 +#: src/libslic3r/PrintConfig.cpp:2823 msgid "Snug" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2809 +#: src/libslic3r/PrintConfig.cpp:2824 +msgid "Organic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2830 msgid "Synchronize with object layers" msgstr "與對象圖層同步" -#: src/libslic3r/PrintConfig.cpp:2811 +#: src/libslic3r/PrintConfig.cpp:2832 msgid "" "Synchronize support layers with the object print layers. This is useful with " -"multi-material printers, where the extruder switch is expensive." +"multi-material printers, where the extruder switch is expensive. This option " +"is only available when top contact Z distance is set to zero." msgstr "" -"將支撐圖層與對象列印圖層同步。這對於多材料印表機非常有用, 因爲在這種印表機" -"中, 擠出機切換非常不划算." -#: src/libslic3r/PrintConfig.cpp:2817 +#: src/libslic3r/PrintConfig.cpp:2839 msgid "Overhang threshold" msgstr "懸空閾值" -#: src/libslic3r/PrintConfig.cpp:2819 +#: src/libslic3r/PrintConfig.cpp:2841 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -12950,43 +14820,108 @@ msgstr "" "說, 此值表示在沒有支撐材料的情況下可以列印的最水平坡度 (從水平面測量)。設置爲" "零, 用於自動檢測 (推薦)。" -#: src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:2853 msgid "With sheath around the support" msgstr "用護套圍繞支撐" -#: src/libslic3r/PrintConfig.cpp:2833 +#: src/libslic3r/PrintConfig.cpp:2855 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." msgstr "" "在基礎支架周圍添加護套 (一條外圍線)。這使得支持更可靠, 但也更難以移除。" -#: src/libslic3r/PrintConfig.cpp:2840 +#: src/libslic3r/PrintConfig.cpp:2861 +msgid "Maximum Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2863 +msgid "" +"The maximum angle of the branches, when the branches have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle to be able to have more reach." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2872 +msgid "Preferred Branch Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2874 +msgid "" +"The preferred angle of the branches, when they do not have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle for branches to merge faster." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2883 +msgid "Tip Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2885 +msgid "The diameter of the top of the tip of the branches of organic support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2892 +msgid "Branch Diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2894 +msgid "" +"The diameter of the thinnest branches of organic support. Thicker branches " +"are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2902 +msgid "Branch Diameter Angle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2904 +msgid "" +"The angle of the branches' diameter as they gradually become thicker towards " +"the bottom. An angle of 0 will cause the branches to have uniform thickness " +"over their length. A bit of an angle can increase stability of the organic " +"support." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2914 +msgid "Branch Density" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2916 +msgid "" +"Adjusts the density of the support structure used to generate the tips of " +"the branches. A higher value results in better overhangs but the supports " +"are harder to remove, thus it is recommended to enable top support " +"interfaces instead of a high branch density value if dense interfaces are " +"needed." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2928 msgid "" "Nozzle temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2843 +#: src/libslic3r/PrintConfig.cpp:2931 msgid "Nozzle temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2849 +#: src/libslic3r/PrintConfig.cpp:2937 msgid "Thick bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2851 +#: src/libslic3r/PrintConfig.cpp:2939 msgid "" "If enabled, bridges are more reliable, can bridge longer distances, but may " "look worse. If disabled, bridges look better but are reliable just for " "shorter bridged distances." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2857 +#: src/libslic3r/PrintConfig.cpp:2945 msgid "Detect thin walls" msgstr "檢測薄壁" -#: src/libslic3r/PrintConfig.cpp:2859 +#: src/libslic3r/PrintConfig.cpp:2947 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." @@ -12994,17 +14929,17 @@ msgstr "" "檢測單一厚度的薄壁(兩個擠出量不吻合,以至於需要把它們壓縮成一條軌跡的地" "方)。" -#: src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2953 msgid "Threads" msgstr "線程" -#: src/libslic3r/PrintConfig.cpp:2866 +#: src/libslic3r/PrintConfig.cpp:2954 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." msgstr "線程用於並行處理長時間任務。最優的線程數應比可用核/處理器的數目略多。" -#: src/libslic3r/PrintConfig.cpp:2878 +#: src/libslic3r/PrintConfig.cpp:2966 msgid "" "This custom code is inserted before every toolchange. Placeholder variables " "for all PrusaSlicer settings as well as {toolchange_z}, {previous_extruder} " @@ -13014,7 +14949,7 @@ msgid "" "behaviour both before and after the toolchange." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2891 +#: src/libslic3r/PrintConfig.cpp:2979 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "top surfaces. You may want to use thinner extrudates to fill all narrow " @@ -13027,7 +14962,7 @@ msgstr "" "的擠出寬度, 否則將使用噴嘴直徑。如果以百分比表示 (例如 90%)它將被計算在層的高" "度。" -#: src/libslic3r/PrintConfig.cpp:2904 +#: src/libslic3r/PrintConfig.cpp:2992 msgid "" "Speed for printing top solid layers (it only applies to the uppermost " "external layers and not to their internal solid layers). You may want to " @@ -13039,66 +14974,66 @@ msgstr "" "層)。你可能想放慢速度, 以獲得更好的表面光潔度。這可以用百分比表示 (例如: 80%)" "以上的固體填充速度。自動設置爲零。" -#: src/libslic3r/PrintConfig.cpp:2919 +#: src/libslic3r/PrintConfig.cpp:3007 msgid "Number of solid layers to generate on top surfaces." msgstr "在頂部表面上生成的可靠層數。" -#: src/libslic3r/PrintConfig.cpp:2920 +#: src/libslic3r/PrintConfig.cpp:3008 msgid "Top solid layers" msgstr "頂部實心層" -#: src/libslic3r/PrintConfig.cpp:2928 +#: src/libslic3r/PrintConfig.cpp:3016 msgid "" "The number of top solid layers is increased above top_solid_layers if " "necessary to satisfy minimum thickness of top shell. This is useful to " "prevent pillowing effect when printing with variable layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2931 +#: src/libslic3r/PrintConfig.cpp:3019 msgid "Minimum top shell thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2938 +#: src/libslic3r/PrintConfig.cpp:3026 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "空程移動的速度(從一個擠出點結束調到另一個擠出點開始)。" -#: src/libslic3r/PrintConfig.cpp:2946 +#: src/libslic3r/PrintConfig.cpp:3034 msgid "Z travel" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2947 +#: src/libslic3r/PrintConfig.cpp:3035 msgid "" "Speed for movements along the Z axis.\n" "When set to zero, the value is ignored and regular travel speed is used " "instead." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2955 +#: src/libslic3r/PrintConfig.cpp:3043 msgid "Use firmware retraction" msgstr "使用固件回縮" -#: src/libslic3r/PrintConfig.cpp:2956 +#: src/libslic3r/PrintConfig.cpp:3044 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." msgstr "" "該試驗參數使用G10和G11指令來使固件處理回縮。僅在最新的Marlin中支持該功能。" -#: src/libslic3r/PrintConfig.cpp:2962 +#: src/libslic3r/PrintConfig.cpp:3050 msgid "Use relative E distances" msgstr "使用相對E距離" -#: src/libslic3r/PrintConfig.cpp:2963 +#: src/libslic3r/PrintConfig.cpp:3051 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." msgstr "如果固件需要相對E值,勾選此項,否則不要勾選。大部分固件使用絕對值。" -#: src/libslic3r/PrintConfig.cpp:2969 +#: src/libslic3r/PrintConfig.cpp:3057 msgid "Use volumetric E" msgstr "使用體積E" -#: src/libslic3r/PrintConfig.cpp:2970 +#: src/libslic3r/PrintConfig.cpp:3058 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -13111,28 +15046,28 @@ msgstr "" "起始G代碼中輸入如'M200 D[filament_diameter_0] T0' 以開啓體積模式,並使用在" "Slic3r中已選的絲料直徑。僅在最新Marlin中支持該功能。" -#: src/libslic3r/PrintConfig.cpp:2980 +#: src/libslic3r/PrintConfig.cpp:3068 msgid "Enable variable layer height feature" msgstr "啓用可變圖層高度功能" -#: src/libslic3r/PrintConfig.cpp:2981 +#: src/libslic3r/PrintConfig.cpp:3069 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." msgstr "" "某些印表機或印表機設置可能難以使用可變圖層高度進行列印。默認情況下啓用。" -#: src/libslic3r/PrintConfig.cpp:2987 +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Wipe while retracting" msgstr "回縮時擦拭" -#: src/libslic3r/PrintConfig.cpp:2988 +#: src/libslic3r/PrintConfig.cpp:3076 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." msgstr "在回縮時移動噴嘴以避免擠出頭滴漏。" -#: src/libslic3r/PrintConfig.cpp:2995 +#: src/libslic3r/PrintConfig.cpp:3083 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." @@ -13140,75 +15075,79 @@ msgstr "" "多材料印表機可能需要對工具更換進行填充清洗或清除擠出機。將多餘的材料擠出到擦" "料塔中." -#: src/libslic3r/PrintConfig.cpp:3001 +#: src/libslic3r/PrintConfig.cpp:3089 msgid "Purging volumes - load/unload volumes" msgstr "清除量-加載/卸載卷" -#: src/libslic3r/PrintConfig.cpp:3002 +#: src/libslic3r/PrintConfig.cpp:3090 msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " "volumes below." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3008 +#: src/libslic3r/PrintConfig.cpp:3096 msgid "Purging volumes - matrix" msgstr "清除量-矩陣" -#: src/libslic3r/PrintConfig.cpp:3009 +#: src/libslic3r/PrintConfig.cpp:3097 msgid "" "This matrix describes volumes (in cubic milimetres) required to purge the " "new filament on the wipe tower for any given pair of tools." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3018 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Position X" msgstr "橫向位置X" -#: src/libslic3r/PrintConfig.cpp:3019 +#: src/libslic3r/PrintConfig.cpp:3107 msgid "X coordinate of the left front corner of a wipe tower" msgstr "擦料塔左前角的 X 座標" -#: src/libslic3r/PrintConfig.cpp:3025 +#: src/libslic3r/PrintConfig.cpp:3113 msgid "Position Y" msgstr "縱向位置Y" -#: src/libslic3r/PrintConfig.cpp:3026 +#: src/libslic3r/PrintConfig.cpp:3114 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "擦拭塔左前角的 Y 座標" -#: src/libslic3r/PrintConfig.cpp:3033 +#: src/libslic3r/PrintConfig.cpp:3120 +msgid "Width" +msgstr "寬度" + +#: src/libslic3r/PrintConfig.cpp:3121 msgid "Width of a wipe tower" msgstr "擦料塔的寬度" -#: src/libslic3r/PrintConfig.cpp:3039 +#: src/libslic3r/PrintConfig.cpp:3127 msgid "Wipe tower rotation angle" msgstr "擦料塔旋轉角度" -#: src/libslic3r/PrintConfig.cpp:3040 +#: src/libslic3r/PrintConfig.cpp:3128 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3046 src/libslic3r/PrintConfig.cpp:3047 +#: src/libslic3r/PrintConfig.cpp:3134 src/libslic3r/PrintConfig.cpp:3135 msgid "Wipe tower brim width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3055 +#: src/libslic3r/PrintConfig.cpp:3143 msgid "Wipe into this object's infill" msgstr "擦入此物體的填充" -#: src/libslic3r/PrintConfig.cpp:3056 +#: src/libslic3r/PrintConfig.cpp:3144 msgid "" "Purging after toolchange will be done inside this object's infills. This " "lowers the amount of waste but may result in longer print time due to " "additional travel moves." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3063 +#: src/libslic3r/PrintConfig.cpp:3151 msgid "Wipe into this object" msgstr "擦入此物體的填充" -#: src/libslic3r/PrintConfig.cpp:3064 +#: src/libslic3r/PrintConfig.cpp:3152 msgid "" "Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " @@ -13217,19 +15156,19 @@ msgstr "" "對象將用於在工具更改後清除噴嘴, 以節省在擦除塔中浪費的材料並減少列印時間。因" "此, 對象的顏色將混合在一起。" -#: src/libslic3r/PrintConfig.cpp:3070 +#: src/libslic3r/PrintConfig.cpp:3158 msgid "Maximal bridging distance" msgstr "最大橋接距離" -#: src/libslic3r/PrintConfig.cpp:3071 +#: src/libslic3r/PrintConfig.cpp:3159 msgid "Maximal distance between supports on sparse infill sections." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3077 +#: src/libslic3r/PrintConfig.cpp:3165 msgid "XY Size Compensation" msgstr "XY尺寸補償" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3167 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" @@ -13237,11 +15176,11 @@ msgid "" msgstr "" "該物體將以指定值(負=往內,正=往外)變大/收縮。對於精確調節孔洞尺寸可能有用。" -#: src/libslic3r/PrintConfig.cpp:3087 +#: src/libslic3r/PrintConfig.cpp:3175 msgid "Z offset" msgstr "Z補償" -#: src/libslic3r/PrintConfig.cpp:3088 +#: src/libslic3r/PrintConfig.cpp:3176 msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " "output G-code. It is used to compensate for bad Z endstop position: for " @@ -13252,11 +15191,11 @@ msgstr "" "板位置進行補償,如果你的終點擋板爲零時,噴嘴離列印熱牀還有0.3毫米,將該值設" "爲-0.3(或者調整你的終點擋板)。" -#: src/libslic3r/PrintConfig.cpp:3097 +#: src/libslic3r/PrintConfig.cpp:3185 msgid "Perimeter generator" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3099 +#: src/libslic3r/PrintConfig.cpp:3187 msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " @@ -13264,19 +15203,19 @@ msgid "" "Concentric infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3192 msgid "Classic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3107 +#: src/libslic3r/PrintConfig.cpp:3193 msgid "Arachne" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3199 msgid "Perimeter transition length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3114 +#: src/libslic3r/PrintConfig.cpp:3201 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " @@ -13284,11 +15223,11 @@ msgid "" "be computed based on the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3123 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Perimeter transitioning filter margin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3125 +#: src/libslic3r/PrintConfig.cpp:3212 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -13300,11 +15239,11 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3138 +#: src/libslic3r/PrintConfig.cpp:3225 msgid "Perimeter transitioning threshold angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3140 +#: src/libslic3r/PrintConfig.cpp:3227 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -13313,100 +15252,256 @@ msgid "" "these center perimeters, but may leave gaps or overextrude." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3151 +#: src/libslic3r/PrintConfig.cpp:3238 msgid "Perimeter distribution count" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3153 +#: src/libslic3r/PrintConfig.cpp:3240 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " "in width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3160 -msgid "Minimum feature size" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:3247 +msgid "Minimum feature size" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3249 +msgid "" +"Minimum thickness of thin features. Model features that are thinner than " +"this value will not be printed, while features thicker than the Minimum " +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3259 +msgid "Minimum perimeter width" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3261 +msgid "" +"Width of the perimeter that will replace thin features (according to the " +"Minimum feature size) of the model. If the Minimum perimeter width is " +"thinner than the thickness of the feature, the perimeter will become as " +"thick as the feature itself. If expressed as a percentage (for example 85%), " +"it will be computed based on the nozzle diameter." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3327 +msgid "Pinhead front diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3329 +msgid "Diameter of the pointing side of the head" +msgstr "頭部指向側的直徑" + +#: src/libslic3r/PrintConfig.cpp:3336 +msgid "Head penetration" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3338 +msgid "How much the pinhead has to penetrate the model surface" +msgstr "針頭穿透模型表面的程度" + +#: src/libslic3r/PrintConfig.cpp:3345 +msgid "Pinhead width" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3347 +msgid "Width from the back sphere center to the front sphere center" +msgstr "從後球體中心到前球體中心的寬度" + +#: src/libslic3r/PrintConfig.cpp:3355 +msgid "Pillar diameter" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3357 +msgid "Diameter in mm of the support pillars" +msgstr "支撐柱直徑 (毫米)" + +#: src/libslic3r/PrintConfig.cpp:3365 +msgid "Small pillar diameter percent" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3367 +msgid "" +"The percentage of smaller pillars compared to the normal pillar diameter " +"which are used in problematic areas where a normal pilla cannot fit." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3376 +msgid "Max bridges on a pillar" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3378 +msgid "" +"Maximum number of bridges that can be placed on a pillar. Bridges hold " +"support point pinheads and connect to pillars as small branches." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3386 +msgid "Max weight on model" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3389 +msgid "" +"Maximum weight of sub-trees that terminate on the model instead of the print " +"bed. The weight is the sum of the lenghts of all branches emanating from the " +"endpoint." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3397 +msgid "Pillar connection mode" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3398 +msgid "" +"Controls the bridge type between two neighboring pillars. Can be zig-zag, " +"cross (double zig-zag) or dynamic which will automatically switch between " +"the first two depending on the distance of the two pillars." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Zig-Zag" +msgstr "鋸齒形" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Cross" +msgstr "交叉" + +#: src/libslic3r/PrintConfig.cpp:3404 +msgid "Dynamic" +msgstr "動態" + +#: src/libslic3r/PrintConfig.cpp:3416 +msgid "Pillar widening factor" +msgstr "支柱加寬係數" + +#: src/libslic3r/PrintConfig.cpp:3420 +msgid "" +"Merging bridges or pillars into another pillars can increase the radius. " +"Zero means no increase, one means full increase. The exact amount of " +"increase is unspecified and can change in the future." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3431 +msgid "Support base diameter" +msgstr "支撐底座直徑" + +#: src/libslic3r/PrintConfig.cpp:3433 +msgid "Diameter in mm of the pillar base" +msgstr "柱底座直徑 (毫米)" + +#: src/libslic3r/PrintConfig.cpp:3441 +msgid "Support base height" +msgstr "支撐基座高度" + +#: src/libslic3r/PrintConfig.cpp:3443 +msgid "The height of the pillar base cone" +msgstr "柱基錐的高度" + +#: src/libslic3r/PrintConfig.cpp:3450 +msgid "Support base safety distance" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3453 +msgid "" +"The minimum distance of the pillar base from the model in mm. Makes sense in " +"zero elevation mode where a gap according to this parameter is inserted " +"between the model and the pad." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3463 +msgid "Critical angle" +msgstr "臨界角度" + +#: src/libslic3r/PrintConfig.cpp:3465 +msgid "The default angle for connecting support sticks and junctions." +msgstr "連接支撐杆和連接點的默認角度。" + +#: src/libslic3r/PrintConfig.cpp:3473 +msgid "Max bridge length" +msgstr "最大橋長" + +#: src/libslic3r/PrintConfig.cpp:3475 +msgid "The max length of a bridge" +msgstr "橋的最大長度" -#: src/libslic3r/PrintConfig.cpp:3162 -msgid "" -"Minimum thickness of thin features. Model features that are thinner than " -"this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width. If expressed as " -"a percentage (for example 25%), it will be computed based on the nozzle " -"diameter." -msgstr "" +#: src/libslic3r/PrintConfig.cpp:3487 +msgid "Max pillar linking distance" +msgstr "最大柱連接距離" -#: src/libslic3r/PrintConfig.cpp:3172 -msgid "Minimum perimeter width" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:3489 +msgid "" +"The max distance of two pillars to get linked with each other. A zero value " +"will prohibit pillar cascading." +msgstr "兩個支柱的最大距離, 以相互連接。零值將禁止柱級聯。" -#: src/libslic3r/PrintConfig.cpp:3174 +#: src/libslic3r/PrintConfig.cpp:3499 msgid "" -"Width of the perimeter that will replace thin features (according to the " -"Minimum feature size) of the model. If the Minimum perimeter width is " -"thinner than the thickness of the feature, the perimeter will become as " -"thick as the feature itself. If expressed as a percentage (for example 85%), " -"it will be computed based on the nozzle diameter." +"How much the supports should lift up the supported object. If \"Pad around " +"object\" is enabled, this value is ignored." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3242 +#: src/libslic3r/PrintConfig.cpp:3515 msgid "Display width" msgstr "顯示寬度" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3516 msgid "Width of the display" msgstr "顯示寬度" -#: src/libslic3r/PrintConfig.cpp:3248 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "Display height" msgstr "顯示高度" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3522 msgid "Height of the display" msgstr "顯示高度" -#: src/libslic3r/PrintConfig.cpp:3254 +#: src/libslic3r/PrintConfig.cpp:3527 msgid "Number of pixels in" msgstr "像素點的數量" -#: src/libslic3r/PrintConfig.cpp:3256 +#: src/libslic3r/PrintConfig.cpp:3529 msgid "Number of pixels in X" msgstr "X 中的像素數" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3535 msgid "Number of pixels in Y" msgstr "Y 中的像素數" -#: src/libslic3r/PrintConfig.cpp:3267 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Display horizontal mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3268 +#: src/libslic3r/PrintConfig.cpp:3541 msgid "Mirror horizontally" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3542 msgid "Enable horizontal mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3274 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Display vertical mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3275 +#: src/libslic3r/PrintConfig.cpp:3548 msgid "Mirror vertically" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "Enable vertical mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3281 +#: src/libslic3r/PrintConfig.cpp:3554 msgid "Display orientation" msgstr "顯示方向" -#: src/libslic3r/PrintConfig.cpp:3282 +#: src/libslic3r/PrintConfig.cpp:3555 msgid "" "Set the actual LCD display orientation inside the SLA printer. Portrait mode " "will flip the meaning of display width and height parameters and the output " @@ -13415,55 +15510,55 @@ msgstr "" "在 SLA 印表機內設置實際的 LCD 顯示方向。人像模式將翻轉顯示寬度和高度參數的含" "義, 輸出圖像將旋轉90度。" -#: src/libslic3r/PrintConfig.cpp:3288 +#: src/libslic3r/PrintConfig.cpp:3559 msgid "Landscape" msgstr "景觀" -#: src/libslic3r/PrintConfig.cpp:3289 +#: src/libslic3r/PrintConfig.cpp:3560 msgid "Portrait" msgstr "肖像" -#: src/libslic3r/PrintConfig.cpp:3294 src/libslic3r/PrintConfig.cpp:3929 +#: src/libslic3r/PrintConfig.cpp:3566 src/libslic3r/PrintConfig.cpp:4058 msgid "Fast" msgstr "快" -#: src/libslic3r/PrintConfig.cpp:3295 +#: src/libslic3r/PrintConfig.cpp:3567 msgid "Fast tilt" msgstr "快速傾斜" -#: src/libslic3r/PrintConfig.cpp:3296 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Time of the fast tilt" msgstr "快速傾斜的時間" -#: src/libslic3r/PrintConfig.cpp:3303 src/libslic3r/PrintConfig.cpp:3928 +#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:4057 msgid "Slow" msgstr "慢" -#: src/libslic3r/PrintConfig.cpp:3304 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Slow tilt" msgstr "緩慢傾斜" -#: src/libslic3r/PrintConfig.cpp:3305 +#: src/libslic3r/PrintConfig.cpp:3577 msgid "Time of the slow tilt" msgstr "緩慢傾斜的時間" -#: src/libslic3r/PrintConfig.cpp:3312 src/libslic3r/PrintConfig.cpp:3930 +#: src/libslic3r/PrintConfig.cpp:3584 src/libslic3r/PrintConfig.cpp:4059 msgid "High viscosity" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3313 +#: src/libslic3r/PrintConfig.cpp:3585 msgid "Tilt for high viscosity resin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3314 +#: src/libslic3r/PrintConfig.cpp:3586 msgid "Time of the super slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3321 +#: src/libslic3r/PrintConfig.cpp:3593 msgid "Area fill" msgstr "區域填充" -#: src/libslic3r/PrintConfig.cpp:3322 +#: src/libslic3r/PrintConfig.cpp:3594 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -13473,345 +15568,230 @@ msgstr "" "如果列印區域超過指定的值,\n" "然後一個緩慢的傾斜將被使用, 否則-一個快速傾斜" -#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 -#: src/libslic3r/PrintConfig.cpp:3331 +#: src/libslic3r/PrintConfig.cpp:3601 src/libslic3r/PrintConfig.cpp:3602 +#: src/libslic3r/PrintConfig.cpp:3603 msgid "Printer scaling correction" msgstr "印表機縮放校正" -#: src/libslic3r/PrintConfig.cpp:3337 src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3609 src/libslic3r/PrintConfig.cpp:3611 msgid "Printer scaling correction in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3338 +#: src/libslic3r/PrintConfig.cpp:3610 msgid "Printer scaling X axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3345 src/libslic3r/PrintConfig.cpp:3347 +#: src/libslic3r/PrintConfig.cpp:3617 src/libslic3r/PrintConfig.cpp:3619 msgid "Printer scaling correction in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3346 +#: src/libslic3r/PrintConfig.cpp:3618 msgid "Printer scaling Y axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3353 src/libslic3r/PrintConfig.cpp:3355 +#: src/libslic3r/PrintConfig.cpp:3625 src/libslic3r/PrintConfig.cpp:3627 msgid "Printer scaling correction in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3354 +#: src/libslic3r/PrintConfig.cpp:3626 msgid "Printer scaling Z axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3361 src/libslic3r/PrintConfig.cpp:3362 +#: src/libslic3r/PrintConfig.cpp:3633 src/libslic3r/PrintConfig.cpp:3634 msgid "Printer absolute correction" msgstr "印表機絕對校正" -#: src/libslic3r/PrintConfig.cpp:3363 +#: src/libslic3r/PrintConfig.cpp:3635 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "將根據校正的符號對切片的2D 多邊形進行放大或收縮。" -#: src/libslic3r/PrintConfig.cpp:3369 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Elephant foot minimum width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3371 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3378 src/libslic3r/PrintConfig.cpp:3379 +#: src/libslic3r/PrintConfig.cpp:3650 src/libslic3r/PrintConfig.cpp:3651 msgid "Printer gamma correction" msgstr "印表機伽瑪校正" -#: src/libslic3r/PrintConfig.cpp:3380 +#: src/libslic3r/PrintConfig.cpp:3652 msgid "" "This will apply a gamma correction to the rasterized 2D polygons. A gamma " "value of zero means thresholding with the threshold in the middle. This " "behaviour eliminates antialiasing without losing holes in polygons." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3399 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3671 src/libslic3r/PrintConfig.cpp:3672 msgid "SLA material type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3411 src/libslic3r/PrintConfig.cpp:3412 +#: src/libslic3r/PrintConfig.cpp:3679 src/libslic3r/PrintConfig.cpp:3680 msgid "Initial layer height" msgstr "初始圖層高度" -#: src/libslic3r/PrintConfig.cpp:3418 src/libslic3r/PrintConfig.cpp:3419 +#: src/libslic3r/PrintConfig.cpp:3686 +msgid "Idle temperature" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3687 +msgid "" +"Nozzle temperature when the tool is currently not used in multi-tool setups." +"This is only used when 'Ooze prevention' is active in Print Settings." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3695 src/libslic3r/PrintConfig.cpp:3696 msgid "Bottle volume" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3420 +#: src/libslic3r/PrintConfig.cpp:3697 msgid "ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3425 src/libslic3r/PrintConfig.cpp:3426 +#: src/libslic3r/PrintConfig.cpp:3702 src/libslic3r/PrintConfig.cpp:3703 msgid "Bottle weight" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3427 +#: src/libslic3r/PrintConfig.cpp:3704 msgid "kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "g/ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3718 msgid "money/bottle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3446 +#: src/libslic3r/PrintConfig.cpp:3723 msgid "Faded layers" msgstr "淡入淡出的圖層" -#: src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3724 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "曝光時間所需的層數從最初的曝光時間消失到曝光時間" -#: src/libslic3r/PrintConfig.cpp:3454 src/libslic3r/PrintConfig.cpp:3455 +#: src/libslic3r/PrintConfig.cpp:3731 src/libslic3r/PrintConfig.cpp:3732 msgid "Minimum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3462 src/libslic3r/PrintConfig.cpp:3463 +#: src/libslic3r/PrintConfig.cpp:3739 src/libslic3r/PrintConfig.cpp:3740 msgid "Maximum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3470 src/libslic3r/PrintConfig.cpp:3471 +#: src/libslic3r/PrintConfig.cpp:3747 src/libslic3r/PrintConfig.cpp:3748 msgid "Exposure time" msgstr "曝光時間" -#: src/libslic3r/PrintConfig.cpp:3477 src/libslic3r/PrintConfig.cpp:3478 +#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3755 msgid "Minimum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3485 src/libslic3r/PrintConfig.cpp:3486 +#: src/libslic3r/PrintConfig.cpp:3762 src/libslic3r/PrintConfig.cpp:3763 msgid "Maximum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3493 src/libslic3r/PrintConfig.cpp:3494 +#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3771 msgid "Initial exposure time" msgstr "初始曝光時間" -#: src/libslic3r/PrintConfig.cpp:3500 src/libslic3r/PrintConfig.cpp:3501 +#: src/libslic3r/PrintConfig.cpp:3777 src/libslic3r/PrintConfig.cpp:3778 msgid "Correction for expansion" msgstr "擴展的更正" -#: src/libslic3r/PrintConfig.cpp:3507 src/libslic3r/PrintConfig.cpp:3508 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3785 msgid "Correction for expansion in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3514 src/libslic3r/PrintConfig.cpp:3515 +#: src/libslic3r/PrintConfig.cpp:3791 src/libslic3r/PrintConfig.cpp:3792 msgid "Correction for expansion in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3521 src/libslic3r/PrintConfig.cpp:3522 +#: src/libslic3r/PrintConfig.cpp:3798 src/libslic3r/PrintConfig.cpp:3799 msgid "Correction for expansion in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3528 +#: src/libslic3r/PrintConfig.cpp:3805 msgid "SLA print material notes" msgstr "SLA 列印材料註釋" -#: src/libslic3r/PrintConfig.cpp:3529 +#: src/libslic3r/PrintConfig.cpp:3806 msgid "You can put your notes regarding the SLA print material here." msgstr "您可以在此處放置有關 sla 列印材料的註釋." -#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3552 +#: src/libslic3r/PrintConfig.cpp:3818 src/libslic3r/PrintConfig.cpp:3829 msgid "Default SLA material profile" msgstr "默認 SLA 材料配置文件" -#: src/libslic3r/PrintConfig.cpp:3563 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "Generate supports" msgstr "生成支撐" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3842 msgid "Generate supports for the models" msgstr "生成模型的支撐" -#: src/libslic3r/PrintConfig.cpp:3570 -msgid "Pinhead front diameter" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3572 -msgid "Diameter of the pointing side of the head" -msgstr "頭部指向側的直徑" - -#: src/libslic3r/PrintConfig.cpp:3579 -msgid "Head penetration" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3581 -msgid "How much the pinhead has to penetrate the model surface" -msgstr "針頭穿透模型表面的程度" - -#: src/libslic3r/PrintConfig.cpp:3588 -msgid "Pinhead width" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3590 -msgid "Width from the back sphere center to the front sphere center" -msgstr "從後球體中心到前球體中心的寬度" - -#: src/libslic3r/PrintConfig.cpp:3598 -msgid "Pillar diameter" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3600 -msgid "Diameter in mm of the support pillars" -msgstr "支撐柱直徑 (毫米)" - -#: src/libslic3r/PrintConfig.cpp:3608 -msgid "Small pillar diameter percent" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3610 -msgid "" -"The percentage of smaller pillars compared to the normal pillar diameter " -"which are used in problematic areas where a normal pilla cannot fit." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3619 -msgid "Max bridges on a pillar" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3621 -msgid "" -"Maximum number of bridges that can be placed on a pillar. Bridges hold " -"support point pinheads and connect to pillars as small branches." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3629 -msgid "Pillar connection mode" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3630 -msgid "" -"Controls the bridge type between two neighboring pillars. Can be zig-zag, " -"cross (double zig-zag) or dynamic which will automatically switch between " -"the first two depending on the distance of the two pillars." +#: src/libslic3r/PrintConfig.cpp:3847 +msgid "Support tree type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3638 -msgid "Zig-Zag" -msgstr "鋸齒形" - -#: src/libslic3r/PrintConfig.cpp:3639 -msgid "Cross" -msgstr "交叉" - -#: src/libslic3r/PrintConfig.cpp:3640 -msgid "Dynamic" -msgstr "動態" - -#: src/libslic3r/PrintConfig.cpp:3652 -msgid "Pillar widening factor" -msgstr "支柱加寬係數" - -#: src/libslic3r/PrintConfig.cpp:3654 -msgid "" -"Merging bridges or pillars into another pillars can increase the radius. " -"Zero means no increase, one means full increase." +#: src/libslic3r/PrintConfig.cpp:3848 +msgid "Support tree building strategy" msgstr "" -"將橋樑或柱子合併到另一個柱子中可以增加半徑。零意味着沒有增加,1意味着全增加。" - -#: src/libslic3r/PrintConfig.cpp:3663 -msgid "Support base diameter" -msgstr "支撐底座直徑" - -#: src/libslic3r/PrintConfig.cpp:3665 -msgid "Diameter in mm of the pillar base" -msgstr "柱底座直徑 (毫米)" - -#: src/libslic3r/PrintConfig.cpp:3673 -msgid "Support base height" -msgstr "支撐基座高度" -#: src/libslic3r/PrintConfig.cpp:3675 -msgid "The height of the pillar base cone" -msgstr "柱基錐的高度" - -#: src/libslic3r/PrintConfig.cpp:3682 -msgid "Support base safety distance" +#: src/libslic3r/PrintConfig.cpp:3851 +msgid "Branching (experimental)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3685 -msgid "" -"The minimum distance of the pillar base from the model in mm. Makes sense in " -"zero elevation mode where a gap according to this parameter is inserted " -"between the model and the pad." +#: src/libslic3r/PrintConfig.cpp:3860 +msgid "Support only in enforced regions" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3695 -msgid "Critical angle" -msgstr "臨界角度" - -#: src/libslic3r/PrintConfig.cpp:3697 -msgid "The default angle for connecting support sticks and junctions." -msgstr "連接支撐杆和連接點的默認角度。" - -#: src/libslic3r/PrintConfig.cpp:3705 -msgid "Max bridge length" -msgstr "最大橋長" - -#: src/libslic3r/PrintConfig.cpp:3707 -msgid "The max length of a bridge" -msgstr "橋的最大長度" - -#: src/libslic3r/PrintConfig.cpp:3714 -msgid "Max pillar linking distance" -msgstr "最大柱連接距離" - -#: src/libslic3r/PrintConfig.cpp:3716 -msgid "" -"The max distance of two pillars to get linked with each other. A zero value " -"will prohibit pillar cascading." -msgstr "兩個支柱的最大距離, 以相互連接。零值將禁止柱級聯。" - -#: src/libslic3r/PrintConfig.cpp:3726 -msgid "" -"How much the supports should lift up the supported object. If \"Pad around " -"object\" is enabled, this value is ignored." +#: src/libslic3r/PrintConfig.cpp:3862 +msgid "Only create support if it lies in a support enforcer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3737 +#: src/libslic3r/PrintConfig.cpp:3869 msgid "This is a relative measure of support points density." msgstr "這是支持點密度的相對度量。" -#: src/libslic3r/PrintConfig.cpp:3743 +#: src/libslic3r/PrintConfig.cpp:3875 msgid "Minimal distance of the support points" msgstr "支撐點的最小距離" -#: src/libslic3r/PrintConfig.cpp:3745 +#: src/libslic3r/PrintConfig.cpp:3877 msgid "No support points will be placed closer than this threshold." msgstr "沒有任何支助點將被放置在比這一閾值更近的地方。" -#: src/libslic3r/PrintConfig.cpp:3751 +#: src/libslic3r/PrintConfig.cpp:3883 msgid "Use pad" msgstr "使用墊" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3885 msgid "Add a pad underneath the supported model" msgstr "在支撐模型下添加一個墊" -#: src/libslic3r/PrintConfig.cpp:3758 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "Pad wall thickness" msgstr "墊壁厚度" -#: src/libslic3r/PrintConfig.cpp:3760 +#: src/libslic3r/PrintConfig.cpp:3892 msgid "The thickness of the pad and its optional cavity walls." msgstr "墊片的厚度及其可選的空腔壁。" -#: src/libslic3r/PrintConfig.cpp:3768 +#: src/libslic3r/PrintConfig.cpp:3900 msgid "Pad wall height" msgstr "墊壁高度" -#: src/libslic3r/PrintConfig.cpp:3769 +#: src/libslic3r/PrintConfig.cpp:3901 msgid "" "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " "when enabling this feature, as some resins may produce an extreme suction " @@ -13819,19 +15799,19 @@ msgid "" "difficult." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3782 +#: src/libslic3r/PrintConfig.cpp:3914 msgid "Pad brim size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3783 +#: src/libslic3r/PrintConfig.cpp:3915 msgid "How far should the pad extend around the contained geometry" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3793 +#: src/libslic3r/PrintConfig.cpp:3925 msgid "Max merge distance" msgstr "最大合併距離" -#: src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3927 msgid "" "Some objects can get along with a few smaller pads instead of a single big " "one. This parameter defines how far the center of two smaller pads should " @@ -13840,92 +15820,92 @@ msgstr "" "有些物體可以與幾個較小的墊子在一起, 而不是一個大的墊子。此參數定義兩個較小墊" "的中心應該有多遠。如果它們更接近, 它們將被合併成一個墊子。" -#: src/libslic3r/PrintConfig.cpp:3815 +#: src/libslic3r/PrintConfig.cpp:3947 msgid "Pad wall slope" msgstr "墊壁坡度" -#: src/libslic3r/PrintConfig.cpp:3817 +#: src/libslic3r/PrintConfig.cpp:3949 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "墊壁相對於牀面的斜率。90度意味着直牆。" -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3960 msgid "Create pad around object and ignore the support elevation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3833 +#: src/libslic3r/PrintConfig.cpp:3965 msgid "Pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3967 msgid "Force pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3840 +#: src/libslic3r/PrintConfig.cpp:3972 msgid "Pad object gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3842 +#: src/libslic3r/PrintConfig.cpp:3974 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3851 +#: src/libslic3r/PrintConfig.cpp:3983 msgid "Pad object connector stride" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3853 +#: src/libslic3r/PrintConfig.cpp:3985 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3860 +#: src/libslic3r/PrintConfig.cpp:3992 msgid "Pad object connector width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3862 +#: src/libslic3r/PrintConfig.cpp:3994 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3869 +#: src/libslic3r/PrintConfig.cpp:4001 msgid "Pad object connector penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3872 +#: src/libslic3r/PrintConfig.cpp:4004 msgid "How much should the tiny connectors penetrate into the model body." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3879 +#: src/libslic3r/PrintConfig.cpp:4011 msgid "Enable hollowing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:4013 msgid "Hollow out a model to have an empty interior" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3886 +#: src/libslic3r/PrintConfig.cpp:4018 msgid "Wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3888 +#: src/libslic3r/PrintConfig.cpp:4020 msgid "Minimum wall thickness of a hollowed model." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3896 +#: src/libslic3r/PrintConfig.cpp:4028 msgid "Accuracy" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3898 +#: src/libslic3r/PrintConfig.cpp:4030 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:4040 msgid "" "Hollowing is done in two steps: first, an imaginary interior is calculated " "deeper (offset plus the closing distance) in the object and then it's " @@ -13934,179 +15914,211 @@ msgid "" "most." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3920 +#: src/libslic3r/PrintConfig.cpp:4052 msgid "Print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3922 +#: src/libslic3r/PrintConfig.cpp:4054 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " "movement and adds a delay before exposure." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4390 +#: src/libslic3r/PrintConfig.cpp:4065 +msgid "Format of the output SLA archive" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4070 +msgid "SLA output precision" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4071 +msgid "Minimum resolution in nanometers" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4542 msgid "Export OBJ" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4391 +#: src/libslic3r/PrintConfig.cpp:4543 msgid "Export the model(s) as OBJ." msgstr "將模型導出爲 OBJ。" -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4554 msgid "Export SLA" msgstr "導出 SLA" -#: src/libslic3r/PrintConfig.cpp:4403 +#: src/libslic3r/PrintConfig.cpp:4555 msgid "Slice the model and export SLA printing layers as PNG." msgstr "將模型切片, 並將 SLA 列印圖層導出爲 PNG。" -#: src/libslic3r/PrintConfig.cpp:4408 +#: src/libslic3r/PrintConfig.cpp:4560 msgid "Export 3MF" msgstr "導出 3MF" -#: src/libslic3r/PrintConfig.cpp:4409 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Export the model(s) as 3MF." msgstr "將模型導出爲3MF。" -#: src/libslic3r/PrintConfig.cpp:4413 +#: src/libslic3r/PrintConfig.cpp:4565 msgid "Export AMF" msgstr "導出 AMF" -#: src/libslic3r/PrintConfig.cpp:4414 +#: src/libslic3r/PrintConfig.cpp:4566 msgid "Export the model(s) as AMF." msgstr "將模型導出爲 AMF。" -#: src/libslic3r/PrintConfig.cpp:4418 +#: src/libslic3r/PrintConfig.cpp:4570 msgid "Export STL" msgstr "導出STL Export STL" -#: src/libslic3r/PrintConfig.cpp:4419 +#: src/libslic3r/PrintConfig.cpp:4571 msgid "Export the model(s) as STL." msgstr "將模型導出爲 STL。" -#: src/libslic3r/PrintConfig.cpp:4424 +#: src/libslic3r/PrintConfig.cpp:4576 msgid "Slice the model and export toolpaths as G-code." msgstr "將模型切片並將刀具路徑導出爲 G 代碼。" -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4581 msgid "G-code viewer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4430 +#: src/libslic3r/PrintConfig.cpp:4582 msgid "Visualize an already sliced and saved G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4588 +msgid "OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4589 +msgid "Select the specified OpenGL version" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4594 +msgid "OpenGL debug output" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4595 +msgid "Activate OpenGL debug output on graphic cards which support it" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4601 msgid "Slice" msgstr "切片" -#: src/libslic3r/PrintConfig.cpp:4436 +#: src/libslic3r/PrintConfig.cpp:4602 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "根據印表機技術配置值將模型切片爲 FFF 或 SLA。" -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4607 msgid "Help" msgstr "幫助" -#: src/libslic3r/PrintConfig.cpp:4442 +#: src/libslic3r/PrintConfig.cpp:4608 msgid "Show this help." msgstr "顯示此幫助。" -#: src/libslic3r/PrintConfig.cpp:4447 +#: src/libslic3r/PrintConfig.cpp:4613 msgid "Help (FFF options)" msgstr "幫助 (FFF 選項)" -#: src/libslic3r/PrintConfig.cpp:4448 +#: src/libslic3r/PrintConfig.cpp:4614 msgid "Show the full list of print/G-code configuration options." msgstr "顯示列印代碼配置選項的完整列表。" -#: src/libslic3r/PrintConfig.cpp:4452 +#: src/libslic3r/PrintConfig.cpp:4618 msgid "Help (SLA options)" msgstr "幫助 (SLA 選項)" -#: src/libslic3r/PrintConfig.cpp:4453 +#: src/libslic3r/PrintConfig.cpp:4619 msgid "Show the full list of SLA print configuration options." msgstr "顯示 SLA 列印配置選項的完整列表。" -#: src/libslic3r/PrintConfig.cpp:4457 +#: src/libslic3r/PrintConfig.cpp:4623 msgid "Output Model Info" msgstr "輸出模型信息" -#: src/libslic3r/PrintConfig.cpp:4458 +#: src/libslic3r/PrintConfig.cpp:4624 msgid "Write information about the model to the console." msgstr "給控制檯寫入模型的信息。" -#: src/libslic3r/PrintConfig.cpp:4462 +#: src/libslic3r/PrintConfig.cpp:4628 msgid "Save config file" msgstr "保存配置文件" -#: src/libslic3r/PrintConfig.cpp:4463 +#: src/libslic3r/PrintConfig.cpp:4629 msgid "Save configuration to the specified file." msgstr "將配置參數保存到指定文件。" -#: src/libslic3r/PrintConfig.cpp:4473 +#: src/libslic3r/PrintConfig.cpp:4639 msgid "Align XY" msgstr "對齊 XY" -#: src/libslic3r/PrintConfig.cpp:4474 +#: src/libslic3r/PrintConfig.cpp:4640 msgid "Align the model to the given point." msgstr "將模型對齊到給定點。" -#: src/libslic3r/PrintConfig.cpp:4479 +#: src/libslic3r/PrintConfig.cpp:4645 msgid "Cut model at the given Z." msgstr "在給定Z處切割模型。" -#: src/libslic3r/PrintConfig.cpp:4501 +#: src/libslic3r/PrintConfig.cpp:4666 +msgid "Center" +msgstr "居中" + +#: src/libslic3r/PrintConfig.cpp:4667 msgid "Center the print around the given center." msgstr "將列印內容集中在給定的中心周圍。" -#: src/libslic3r/PrintConfig.cpp:4505 +#: src/libslic3r/PrintConfig.cpp:4671 msgid "Don't arrange" msgstr "不要排列布局" -#: src/libslic3r/PrintConfig.cpp:4506 +#: src/libslic3r/PrintConfig.cpp:4672 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "在合併之前, 不要重新排列給定的模型, 並保留其原始 XY 座標。" -#: src/libslic3r/PrintConfig.cpp:4509 +#: src/libslic3r/PrintConfig.cpp:4675 msgid "Ensure on bed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4510 +#: src/libslic3r/PrintConfig.cpp:4676 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4514 +#: src/libslic3r/PrintConfig.cpp:4680 msgid "Duplicate" msgstr "複製" -#: src/libslic3r/PrintConfig.cpp:4515 +#: src/libslic3r/PrintConfig.cpp:4681 msgid "Multiply copies by this factor." msgstr "按此倍數增加副本。" -#: src/libslic3r/PrintConfig.cpp:4519 +#: src/libslic3r/PrintConfig.cpp:4685 msgid "Duplicate by grid" msgstr "按網格複製" -#: src/libslic3r/PrintConfig.cpp:4520 +#: src/libslic3r/PrintConfig.cpp:4686 msgid "Multiply copies by creating a grid." msgstr "通過創建網格將副本增加。" -#: src/libslic3r/PrintConfig.cpp:4524 +#: src/libslic3r/PrintConfig.cpp:4690 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." msgstr "" "將提供的模型排列在一個平板中, 並將它們合併到一個模型中, 以便執行一次操作。" -#: src/libslic3r/PrintConfig.cpp:4529 +#: src/libslic3r/PrintConfig.cpp:4695 msgid "" "Try to repair any non-manifold meshes (this option is implicitly added " "whenever we need to slice the model to perform the requested action)." @@ -14114,59 +16126,67 @@ msgstr "" "嘗試修復任何非流形網格 (每當我們需要對模型進行切片以執行請求的操作時, 都會隱" "式添加此選項)。" -#: src/libslic3r/PrintConfig.cpp:4533 +#: src/libslic3r/PrintConfig.cpp:4699 msgid "Rotation angle around the Z axis in degrees." msgstr "圍繞 Z 軸的旋轉角度 (以度爲單位)。" -#: src/libslic3r/PrintConfig.cpp:4537 +#: src/libslic3r/PrintConfig.cpp:4703 msgid "Rotate around X" msgstr "繞X軸旋轉" -#: src/libslic3r/PrintConfig.cpp:4538 +#: src/libslic3r/PrintConfig.cpp:4704 msgid "Rotation angle around the X axis in degrees." msgstr "圍繞 X 軸的旋轉角度 (以度爲單位)。" -#: src/libslic3r/PrintConfig.cpp:4542 +#: src/libslic3r/PrintConfig.cpp:4708 msgid "Rotate around Y" msgstr "繞Y軸旋轉" -#: src/libslic3r/PrintConfig.cpp:4543 +#: src/libslic3r/PrintConfig.cpp:4709 msgid "Rotation angle around the Y axis in degrees." msgstr "圍繞 Y 軸的旋轉角度 (以度爲單位)。" -#: src/libslic3r/PrintConfig.cpp:4548 +#: src/libslic3r/PrintConfig.cpp:4714 msgid "Scaling factor or percentage." msgstr "縮放因子或百分比。" -#: src/libslic3r/PrintConfig.cpp:4553 +#: src/libslic3r/PrintConfig.cpp:4719 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "檢測給定模型中未連接的部件, 並將其拆分爲單獨的對象。" -#: src/libslic3r/PrintConfig.cpp:4556 +#: src/libslic3r/PrintConfig.cpp:4722 msgid "Scale to Fit" msgstr "縮放到合適大小" -#: src/libslic3r/PrintConfig.cpp:4557 +#: src/libslic3r/PrintConfig.cpp:4723 msgid "Scale to fit the given volume." msgstr "縮放到適合於給定體積。" -#: src/libslic3r/PrintConfig.cpp:4566 +#: src/libslic3r/PrintConfig.cpp:4727 +msgid "Delete files after loading" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4728 +msgid "Delete files after loading." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:4736 msgid "Ignore non-existent config files" msgstr "忽略不存在的配置文件" -#: src/libslic3r/PrintConfig.cpp:4567 +#: src/libslic3r/PrintConfig.cpp:4737 msgid "Do not fail if a file supplied to --load does not exist." msgstr "如果提供給—load 的文件不存在, 不要報錯。" -#: src/libslic3r/PrintConfig.cpp:4570 +#: src/libslic3r/PrintConfig.cpp:4740 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4741 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -14174,58 +16194,58 @@ msgid "" "substitute an unknown value with a default silently or verbosely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4745 msgid "Bail out on unknown configuration values" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4579 +#: src/libslic3r/PrintConfig.cpp:4746 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4580 +#: src/libslic3r/PrintConfig.cpp:4747 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4584 +#: src/libslic3r/PrintConfig.cpp:4752 msgid "Load config file" msgstr "加載配置文件" -#: src/libslic3r/PrintConfig.cpp:4585 +#: src/libslic3r/PrintConfig.cpp:4753 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." msgstr "從指定文件加載配置。可多次使用以從多個文件中加載參數。" -#: src/libslic3r/PrintConfig.cpp:4588 +#: src/libslic3r/PrintConfig.cpp:4756 msgid "Output File" msgstr "輸出文件" -#: src/libslic3r/PrintConfig.cpp:4589 +#: src/libslic3r/PrintConfig.cpp:4757 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." msgstr "輸出的文件(如果未指定,則將依據輸入文件)。" -#: src/libslic3r/PrintConfig.cpp:4593 +#: src/libslic3r/PrintConfig.cpp:4761 msgid "Single instance mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4594 +#: src/libslic3r/PrintConfig.cpp:4762 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " "the \"single_instance\" configuration value from application preferences." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4605 +#: src/libslic3r/PrintConfig.cpp:4767 msgid "Data directory" msgstr "數據目錄" -#: src/libslic3r/PrintConfig.cpp:4606 +#: src/libslic3r/PrintConfig.cpp:4768 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -14234,22 +16254,22 @@ msgstr "" "在給定目錄中加載和存儲設置。這對於維護不同的配置文件或包括來自網絡存儲的配置" "非常有用。" -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4771 msgid "Logging level" msgstr "日誌級別" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4772 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" "For example. loglevel=2 logs fatal, error and warning level messages." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4616 +#: src/libslic3r/PrintConfig.cpp:4778 msgid "Render with a software renderer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4617 +#: src/libslic3r/PrintConfig.cpp:4779 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -14259,18 +16279,30 @@ msgstr "" msgid "Error with zip archive" msgstr "Zip 存檔出錯" -#: src/libslic3r/PrintObject.cpp:126 +#: src/libslic3r/PrintObject.cpp:152 msgid "Generating perimeters" msgstr "" -#: src/libslic3r/PrintObject.cpp:229 +#: src/libslic3r/PrintObject.cpp:257 msgid "Preparing infill" msgstr "" -#: src/libslic3r/PrintObject.cpp:403 +#: src/libslic3r/PrintObject.cpp:402 +msgid "making infill" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:449 +msgid "Searching support spots" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:474 msgid "Generating support material" msgstr "" +#: src/libslic3r/PrintObject.cpp:495 +msgid "Estimating curled extrusions" +msgstr "" + #: resources/data/hints.ini: [hint:Fuzzy skin] msgid "" "Fuzzy skin\n" @@ -14541,6 +16573,36 @@ msgid "" "F11 hotkey." msgstr "" +#: resources/data/hints.ini: [hint:Printables integration] +msgid "" +"Printables.com integration\n" +"Did you know that when you are browsing Printables.com, you can send 3D " +"model files to PrusaSlicer with a single click? Learn more in the " +"documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Cut tool] +msgid "" +"Cut tool\n" +"Did you know that you can cut a model at any angle and even create aligning " +"pins with the updated Cut tool? Learn more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Measurement tool] +msgid "" +"Measurement tool\n" +"Did you know that you can measure the distances between points, edges " +"and planes, the radius of a hole or the angle between edges or planes? Learn " +"more in the documentation." +msgstr "" + +#: resources/data/hints.ini: [hint:Text tool] +msgid "" +"Text tool\n" +"Did you know that you can add custom text labels to your models or even use " +"the text as a modifier? Learn more in the documentation." +msgstr "" + #: ../src/common/debugrpt.cpp:590 msgid "" "\n" @@ -15689,6 +17751,10 @@ msgstr "靠左對齊" msgid "Align Right" msgstr "靠右對齊" +#: ../src/richtext/richtextsizepage.cpp:266 +msgid "Alignment" +msgstr "對齊" + #: ../src/common/fldlgcmn.cpp:107 ../src/generic/filectrlg.cpp:1197 #, c-format msgid "All files (%s)|%s" @@ -16981,10 +19047,6 @@ msgstr "修飾" msgid "Default encoding" msgstr "預設編碼" -#: ../src/dfb/fontmgr.cpp:180 -msgid "Default font" -msgstr "預設字型" - #: ../src/generic/prntdlgg.cpp:506 msgid "Default printer" msgstr "預設印表機" @@ -17347,11 +19409,6 @@ msgstr "列印時發生錯誤: " msgid "Error: " msgstr "錯誤:" -#. TRANSLATORS: Name of keyboard key -#: ../src/common/accelcmn.cpp:69 -msgid "Esc" -msgstr "Esc" - #. TRANSLATORS: Name of keyboard key #: ../src/common/accelcmn.cpp:70 msgid "Escape" @@ -18165,11 +20222,6 @@ msgstr "軟碟" msgid "Folio, 8 1/2 x 13 in" msgstr "對開紙(Folio),8 1/2 x 13 英吋" -#: ../src/common/stockitem.cpp:194 ../src/osx/carbon/fontdlg.cpp:287 -#: ../src/richtext/richtextformatdlg.cpp:340 -msgid "Font" -msgstr "字型" - #: ../src/richtext/richtextfontpage.cpp:221 msgid "Font &weight:" msgstr "字型粗細(&W):" @@ -19315,10 +21367,6 @@ msgstr "「記憶體虛擬檔案系統」已有「%s」檔案!" msgid "Menu" msgstr "選單" -#: ../src/common/msgout.cpp:124 -msgid "Message" -msgstr "訊息" - #: ../src/univ/themes/metal.cpp:168 msgid "Metal theme" msgstr "金屬佈景主題" @@ -19352,10 +21400,6 @@ msgstr "缺少所需參數。" msgid "Modern" msgstr "現代" -#: ../src/generic/filectrlg.cpp:427 -msgid "Modified" -msgstr "修改日期" - #: ../src/common/module.cpp:133 #, c-format msgid "Module \"%s\" initialization failed" @@ -19451,11 +21495,6 @@ msgstr "新名稱" msgid "Next page" msgstr "下一頁" -#: ../include/wx/msgdlg.h:277 ../src/common/stockitem.cpp:177 -#: ../src/motif/msgdlg.cpp:196 -msgid "No" -msgstr "否" - #. TRANSLATORS: System cursor name #: ../src/propgrid/advprops.cpp:1668 msgid "No Entry" @@ -19691,12 +21730,6 @@ msgstr "Num_lock" msgid "Numbered outline" msgstr "大綱編號" -#: ../include/wx/msgdlg.h:278 ../src/common/stockitem.cpp:178 -#: ../src/gtk1/fontdlg.cpp:138 ../src/msw/msgdlg.cpp:451 -#: ../src/msw/msgdlg.cpp:744 ../src/richtext/richtextstyledlg.cpp:297 -msgid "OK" -msgstr "確認" - #: ../src/msw/ole/automtn.cpp:692 #, c-format msgid "OLE Automation error in %s: %s" @@ -19772,6 +21805,10 @@ msgstr "「%s」選項必須有值。" msgid "Option '%s': '%s' cannot be converted to a date." msgstr "「%s」選項:「%s」無法轉換成日期。" +#: ../src/generic/prntdlgg.cpp:614 +msgid "Options" +msgstr "選項" + #: ../src/propgrid/advprops.cpp:1515 msgid "Orange" msgstr "橙色" @@ -20559,10 +22596,6 @@ msgstr "選擇是否斜體。" msgid "Select underlining or no underlining." msgstr "選擇是否加底線。" -#: ../src/motif/filedlg.cpp:220 -msgid "Selection" -msgstr "所選項目" - #: ../src/richtext/richtextliststylepage.cpp:187 #: ../src/richtext/richtextliststylepage.cpp:189 msgid "Selects the list level to edit." @@ -21435,10 +23468,6 @@ msgstr "嘗試從「記憶體虛擬檔案系統」移除「%s」檔案,但它 msgid "Turkish (ISO-8859-9)" msgstr "土耳其文 (ISO-8859-9)" -#: ../src/generic/filectrlg.cpp:426 -msgid "Type" -msgstr "類型" - #: ../src/richtext/richtextfontpage.cpp:151 #: ../src/richtext/richtextfontpage.cpp:153 msgid "Type a font name." @@ -21932,10 +23961,6 @@ msgstr "不支援在此系統使用私人字型:Pango 函式庫過舊,需要 msgid "Validation conflict" msgstr "驗證衝突" -#: ../src/propgrid/manager.cpp:227 -msgid "Value" -msgstr "值" - #: ../src/propgrid/props.cpp:312 #, c-format msgid "Value must be %s or higher." @@ -22172,11 +24197,6 @@ msgstr "XPM:影像資料於第 %d 列被截斷!" msgid "Yellow" msgstr "黃色" -#: ../include/wx/msgdlg.h:276 ../src/common/stockitem.cpp:206 -#: ../src/motif/msgdlg.cpp:196 -msgid "Yes" -msgstr "是" - #: ../src/osx/carbon/overlay.cpp:155 msgid "You cannot Clear an overlay that is not inited" msgstr "不能清除未初始化的覆蓋" diff --git a/resources/profiles/Anker.idx b/resources/profiles/Anker.idx new file mode 100644 index 00000000000..0cf915db162 --- /dev/null +++ b/resources/profiles/Anker.idx @@ -0,0 +1,5 @@ +min_slic3r_version = 2.6.0-alpha4 +1.1.1 Initial official version +1.0.1 Initial Version +min_slic3r_version = 2.6.0-alpha1 +1.0.0 Initial Version diff --git a/resources/profiles/Anker.ini b/resources/profiles/Anker.ini new file mode 100644 index 00000000000..70cb4dcf14d --- /dev/null +++ b/resources/profiles/Anker.ini @@ -0,0 +1,366 @@ +# Print profiles for the AnkerMake printers. + +[vendor] +# Vendor name will be shown by the Config Wizard. +name = AnkerMake +# Configuration version of this file. Config file will only be installed, if the config_version differs. +# This means, the server may force the PrusaSlicer configuration to be downgraded. +config_version = 1.1.1 +# Where to get the updates from? +config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Anker/ +# changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% + +# The printer models will be shown by the Configuration Wizard in this order, +# also the first model installed & the first nozzle installed will be activated after install. +# Printer model name will be shown by the installation wizard. + +[printer_model:M5] +name = AnkerMake M5 +variants = 0.4 +technology = FFF +family = AnkerMake +bed_model = M5-bed.stl +bed_texture = M5-texture_v2.svg +thumbnail = M5_thumbnail_v2.png +default_materials = Generic PLA+ @ANKER; Generic PLA @ANKER; Generic PET @ANKER; Generic ABS @ANKER; + +# All presets starting with asterisk, for example *common*, are intermediate and they will +# not make it into the user interface. + +# Common print preset +[print:*common*] +avoid_crossing_perimeters = 0 +bridge_acceleration = 2500 +bridge_angle = 0 +bridge_flow_ratio = 1 +bridge_speed = 50 +brim_separation = 0.1 +brim_type = outer_only +brim_width = 0 +clip_multipart_objects = 1 +complete_objects = 0 +default_acceleration = 2500 +dont_support_bridges = 1 +elefant_foot_compensation = 0.2 +ensure_vertical_shell_thickness = 1 +external_perimeter_speed = 150 +external_perimeters_first = 0 +extra_perimeters = 0 +extruder_clearance_height = 30 +extruder_clearance_radius = 45 +extrusion_width = 0.4 +external_perimeter_extrusion_width = 0.44 + +fill_angle = 45 +fill_density = 10% +fill_pattern = grid +first_layer_acceleration = 2500 +first_layer_acceleration_over_raft = 0 +first_layer_extrusion_width = 0.4 +first_layer_speed = 50% +first_layer_speed_over_raft = 30 +gap_fill_enabled = 1 +gap_fill_speed = 150 +gcode_comments = 0 +infill_acceleration = 2500 +infill_anchor = 2.5 +infill_anchor_max = 12 +infill_every_layers = 1 +infill_extruder = 1 +infill_first = 0 +infill_extrusion_width = 0.4 +infill_only_where_needed = 0 +infill_overlap = 10% +infill_speed = 250 +interface_shells = 0 +max_print_speed = 250 +max_volumetric_extrusion_rate_slope_negative = 0 +max_volumetric_extrusion_rate_slope_positive = 0 +max_volumetric_speed = 0 +min_skirt_length = 4 +notes = +only_retract_when_crossing_perimeters = 0 +ooze_prevention = 0 +output_filename_format = {input_filename_base}_{layer_height}mm_{initial_filament_type}_{printer_model}.gcode +overhangs = 1 +perimeter_acceleration = 2500 +perimeter_extruder = 1 +perimeter_extrusion_width = 0.4 +perimeter_generator = classic +perimeter_speed = 250 +perimeters = 3 +post_process = +print_settings_id = +raft_layers = 0 +resolution = 0.01 +seam_position = aligned +single_extruder_multi_material_priming = 0 +skirt_distance = 3 +skirt_height = 1 +skirts = 3 +small_perimeter_speed = 150 +solid_infill_below_area = 0 +solid_infill_every_layers = 0 +solid_infill_extruder = 1 +solid_infill_extrusion_width = 0.4 +solid_infill_speed = 250 +spiral_vase = 0 +standby_temperature_delta = -5 +support_material_auto = 0 +support_material = 0 +support_material_angle = 0 +support_material_buildplate_only = 0 +support_material_contact_distance = 0.1 +support_material_enforce_layers = 0 +support_material_extruder = 0 +support_material_interface_contact_loops = 0 +support_material_interface_extruder = 0 +support_material_interface_layers = 2 +support_material_interface_spacing = 0.2 +support_material_interface_speed = 80% +support_material_pattern = rectilinear +support_material_spacing = 2 +support_material_speed = 150 +support_material_synchronize_layers = 0 +support_material_threshold = 55 +support_material_with_sheath = 0 +support_material_xy_spacing = 50% +thick_bridges = 0 +thin_walls = 0 +top_solid_infill_speed = 150 +top_infill_extrusion_width = 0.4 +top_fill_pattern = rectilinear +bottom_fill_pattern = rectilinear +travel_speed = 250 +travel_speed_z = 0 +wipe_tower = 0 +wipe_tower_bridging = 10 +wipe_tower_rotation_angle = 0 +wipe_tower_width = 60 +wipe_tower_x = 170 +wipe_tower_y = 140 +xy_size_compensation = 0 + +[print:*0.10mm*] +inherits = *common* +layer_height = 0.10 +first_layer_height = 0.10 +bottom_solid_layers = 7 +top_solid_layers = 9 +bridge_flow_ratio = 1 + +[print:*0.20mm*] +inherits = *common* +layer_height = 0.20 +first_layer_height = 0.14 +bottom_solid_layers = 4 +top_solid_layers = 5 + +[print:*0.30mm*] +inherits = *common* +layer_height = 0.30 +first_layer_height = 0.21 +bottom_solid_layers = 3 +top_solid_layers = 4 + + +[print:0.10 mm HIGHDETAIL (0.4 mm nozzle) @ANKER] +inherits = *0.10mm* +compatible_printers_condition = printer_model=~/(M5).*/ and nozzle_diameter[0]==0.4 + +[print:0.20 mm NORMAL (0.4 mm nozzle) @ANKER] +inherits = *0.20mm* +compatible_printers_condition = printer_model=~/(M5).*/ and nozzle_diameter[0]==0.4 + + +[print:0.30 mm SUPERDRAFT (0.4 mm nozzle) @ANKER] +inherits = *0.30mm* +compatible_printers_condition = printer_model=~/(M5).*/ and nozzle_diameter[0]==0.4 + +# When submitting new filaments please print the following temperature tower at 0.1mm layer height: +# https://www.thingiverse.com/thing:2615842 +# Pay particular attention to bridging, overhangs and retractions. +# Also print the following bed adhesion test at 0.1 layer height as well: +# https://www.prusaprinters.org/prints/4634-bed-adhesion-warp-test +# At least for PLA, please keep bed temp at 60, as many Creality printers do not have any ABL +# So having some leeway to get good bed adhesion is not a luxury for many users + +[filament:*common*] +cooling = 0 +compatible_printers = +extrusion_multiplier = 1 +filament_cost = 0 +filament_density = 0 +filament_diameter = 1.75 +filament_notes = "" +filament_settings_id = "" +filament_soluble = 0 +min_print_speed = 30 +slowdown_below_layer_time = 8 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANKERMAKE.*/ + +[filament:*PLA*] +inherits = *common* +bed_temperature = 60 +fan_below_layer_time = 100 +filament_colour = #DDDDDD +filament_type = PLA +filament_density = 1.24 +filament_cost = 20 +first_layer_bed_temperature = 60 +first_layer_temperature = 230 +fan_always_on = 1 +max_fan_speed = 100 +min_fan_speed = 100 +bridge_fan_speed = 100 +disable_fan_first_layers = 1 +temperature = 200 + +[filament:*PLA+*] +inherits = *common* +bed_temperature = 60 +fan_below_layer_time = 100 +filament_colour = #DDDDDD +filament_type = PLA+ +filament_density = 1.24 +filament_cost = 20 +first_layer_bed_temperature = 60 +first_layer_temperature = 230 +fan_always_on = 1 +max_fan_speed = 100 +min_fan_speed = 100 +bridge_fan_speed = 100 +disable_fan_first_layers = 1 +temperature = 200 + +[filament:*PET*] +inherits = *common* +bed_temperature = 80 +disable_fan_first_layers = 2 +fan_below_layer_time = 20 +filament_colour = #DDDDDD +filament_type = PETG +filament_density = 1.27 +filament_cost = 30 +first_layer_bed_temperature = 80 +first_layer_temperature = 260 +fan_always_on = 1 +max_fan_speed = 50 +min_fan_speed = 50 +bridge_fan_speed = 100 +temperature = 260 + +[filament:*ABS*] +inherits = *common* +bed_temperature = 90 +disable_fan_first_layers = 2 +fan_below_layer_time = 20 +filament_colour = #DDDDDD +filament_type = ABS +filament_density = 1.04 +filament_cost = 20 +first_layer_bed_temperature = 90 +first_layer_temperature = 260 +fan_always_on = 0 +max_fan_speed = 0 +min_fan_speed = 0 +bridge_fan_speed = 30 +top_fan_speed = 0 +temperature = 260 + +[filament:Generic PLA @ANKER] +inherits = *PLA* +filament_vendor = Generic + +[filament:Generic PLA+ @ANKER] +inherits = *PLA+* +filament_vendor = Generic + +[filament:Generic PETG @ANKER] +inherits = *PET* +filament_vendor = Generic + +[filament:Generic ABS @ANKER] +inherits = *ABS* +first_layer_bed_temperature = 90 +bed_temperature = 90 +filament_vendor = Generic + + +# Common printer preset +[printer:*common*] +printer_technology = FFF +before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;{layer_z} +between_objects_gcode = +pause_print_gcode = +deretract_speed = 60 +extruder_colour = #FCE94F +extruder_offset = 0x0 +gcode_flavor = marlin +silent_mode = 1 +remaining_times = 1 +machine_max_acceleration_e = 2500 +machine_max_acceleration_extruding = 2500 +machine_max_acceleration_retracting = 2500 +machine_max_acceleration_travel = 1500,1250 +machine_max_acceleration_x = 2500 +machine_max_acceleration_y = 2500 +machine_max_acceleration_z = 2500 +machine_max_feedrate_e = 100 +machine_max_feedrate_x = 300 +machine_max_feedrate_y = 300 +machine_max_feedrate_z = 20 +machine_max_jerk_e = 3 +machine_max_jerk_x = 15 +machine_max_jerk_y = 15 +machine_max_jerk_z = 0.3 +machine_min_extruding_rate = 0 +machine_min_travel_rate = 0 +layer_gcode = ;AFTER_LAYER_CHANGE\n;{layer_z} +max_print_height = 250 +printer_notes = +printer_settings_id = +retract_before_travel = 3 +retract_before_wipe = 0 +retract_layer_change = 1 +retract_length_toolchange = 4 +retract_lift = 0 +retract_lift_above = 0 +retract_lift_below = 0 +retract_restart_extra = 0 +retract_restart_extra_toolchange = 0 +retract_speed = 60 +single_extruder_multi_material = 0 +thumbnails = 64x64,256x256 +thumbnails_format = JPG +toolchange_gcode = +use_firmware_retraction = 0 +use_relative_e_distances = 0 +use_volumetric_e = 0 +variable_layer_height = 1 +wipe = 0 +z_offset = 0 +default_filament_profile = Generic PLA+ @ANKER +start_gcode = M104 S{first_layer_temperature[0]} ; set final nozzle temp\nM190 S{first_layer_bed_temperature[0]} ; set and wait for bed temp to stabilize\nM109 S{first_layer_temperature[0]} ; wait for nozzle temp to stabilize\nG28 ;Home\nM420 S1; restore saved Auto Bed Leveling data\nG1 E10 F3600; push out retracted filament(fix for over retraction after prime) +end_gcode = M104 S0\nM140 S0\n;Retract the filament\nG92 E1\nG1 E-1 F300\nG28 X0 Y0\nM84 + +[printer:*M5*] +inherits = *common* +bed_shape = 0x0,235-0,235x235,0x235 +max_print_height = 250 +printer_model = M5 +retract_length = 3 +retract_speed = 60 +deretract_speed = 60 +retract_before_travel = 3 +retract_before_wipe = 0% +printer_notes = Don not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ANKERMAKE\nPRINTER_MODEL_M5 + +[printer:AnkerMake M5 (0.4 mm nozzle)] +inherits = *M5* +nozzle_diameter = 0.4 +printer_variant = 0.4 +min_layer_height = 0.08 +max_layer_height = 0.32 +retract_lift_above = 0 +default_print_profile = 0.2 mm OPTIMAL (0.4 mm nozzle) @ANKER diff --git a/resources/profiles/Anker/M5-bed.stl b/resources/profiles/Anker/M5-bed.stl new file mode 100644 index 0000000000000000000000000000000000000000..72e12a23cd4624ccca34f1337631111be8b8793d GIT binary patch literal 36084 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 literal 0 HcmV?d00001 diff --git a/resources/profiles/Anker/M5-texture.svg b/resources/profiles/Anker/M5-texture.svg new file mode 100644 index 00000000000..8b04342e3fa --- /dev/null +++ b/resources/profiles/Anker/M5-texture.svg @@ -0,0 +1,1003 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/profiles/Anker/M5-texture_v2.svg b/resources/profiles/Anker/M5-texture_v2.svg new file mode 100644 index 00000000000..4fcf959f669 --- /dev/null +++ b/resources/profiles/Anker/M5-texture_v2.svg @@ -0,0 +1 @@ + diff --git a/resources/profiles/Anker/M5_thumbnail.png b/resources/profiles/Anker/M5_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..e137319201a97ffd20f0b60af13aa928900f02d3 GIT binary patch literal 37200 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 literal 0 HcmV?d00001 diff --git a/resources/profiles/Anycubic.idx b/resources/profiles/Anycubic.idx index 47bdd8c2713..e2cf7b0873e 100644 --- a/resources/profiles/Anycubic.idx +++ b/resources/profiles/Anycubic.idx @@ -1,4 +1,9 @@ +min_slic3r_version = 2.6.0-alpha2 +0.2.1 Added Eolas Prints filaments. +0.2.0 Added Photon Mono X printer. min_slic3r_version = 2.4.1-rc1 +0.1.2 Added VOXELPLA filament profile. +0.1.1 Fixed before layer change g-code for Mega Zero. 0.1.0 Added Anycubic 4Max Pro 2.0 min_slic3r_version = 2.3.2-alpha0 0.0.12 Updated Anycubic i3 MEGA(S) profiles. diff --git a/resources/profiles/Anycubic.ini b/resources/profiles/Anycubic.ini index 40c6b17953d..9bebbbe765e 100644 --- a/resources/profiles/Anycubic.ini +++ b/resources/profiles/Anycubic.ini @@ -5,7 +5,7 @@ name = Anycubic # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 0.1.0 +config_version = 0.2.1 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Anycubic/ # changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% @@ -73,6 +73,13 @@ technology = FFF family = PREDATOR default_materials = Generic PLA @PREDATOR; Generic PETG @PREDATOR; Generic ABS @PREDATOR +[printer_model:PHOTON MONO X] +name = Photon Mono X +variants = default +technology = SLA +family = PHOTON MONO +default_materials = Generic Blue Resin @MONO 0.05 + # All presets starting with asterisk, for example *common*, are intermediate and they will # not make it into the user interface. @@ -731,11 +738,22 @@ first_layer_temperature = 245 filament_cost = 24.99 filament_density = 1.27 +[filament:VOXELPLA PLUS @MEGA0] +inherits = *PLA_mega0* +filament_vendor = VOXELPLA +temperature = 200 +bed_temperature = 55 +first_layer_temperature = 200 +first_layer_bed_temperature = 55 +filament_cost = 16.99 +filament_density = 1.24 +filament_colour = #FF4640 + # Common printer preset [printer:*common_mega0*] printer_technology = FFF bed_shape = 0x0,220x0,220x220,0x220 -before_layer_gcode = ; BEFORE_LAYER_CHANGE [layer_num] @ [layer_z]mm +before_layer_gcode = ; BEFORE_LAYER_CHANGE [layer_num] @ [layer_z]mm\nG92 E0 between_objects_gcode = deretract_speed = 0 extruder_colour = #FFFF00 @@ -1043,6 +1061,68 @@ max_fan_speed = 50 min_fan_speed = 30 temperature = 240 +[filament:Eolas Prints PLA @MEGA] +inherits = *PLA_mega* +filament_vendor = Eolas Prints +filament_cost = 23.50 +filament_density = 1.24 +filament_spool_weight = 0 +filament_colour = #4D9398 +first_layer_bed_temperature = 65 +first_layer_temperature = 212 +temperature = 208 +bed_temperature = 60 + +[filament:Eolas Prints PLA Matte @MEGA] +inherits = Eolas Prints PLA @MEGA +filament_cost = 25.50 +filament_max_volumetric_speed = 14 +temperature = 212 + +[filament:Eolas Prints INGEO 850 @MEGA] +inherits = Eolas Prints PLA @MEGA +filament_cost = 25.90 +temperature = 210 + +[filament:Eolas Prints INGEO 870 @MEGA] +inherits = Eolas Prints PLA @MEGA +filament_cost = 25.90 +temperature = 215 +first_layer_bed_temperature = 68 +first_layer_temperature = 220 +bed_temperature = 65 + +[filament:Eolas Prints PETG @MEGA] +inherits = *PETG_mega* +filament_vendor = Eolas Prints +filament_cost = 29.90 +filament_density = 1.27 +filament_spool_weight = 0 +filament_colour = #4D9398 +temperature = 240 +first_layer_bed_temperature = 85 +first_layer_temperature = 235 +bed_temperature = 90 + +[filament:Eolas Prints PETG - UV Resistant @MEGA] +inherits = Eolas Prints PETG @MEGA +filament_cost = 35.90 +temperature = 242 +first_layer_temperature = 237 + +[filament:Eolas Prints TPU 93A @MEGA] +inherits = *FLEX_mega* +filament_vendor = Eolas Prints +filament_cost = 34.99 +filament_density = 1.21 +filament_colour = #4D9398 +filament_max_volumetric_speed = 1.2 +temperature = 235 +first_layer_bed_temperature = 30 +bed_temperature = 30 +filament_retract_length = 0 +extrusion_multiplier = 1.16 + [filament:Generic PETG @MEGA] inherits = *PETG_mega* @@ -1170,6 +1250,17 @@ inherits = *PLA_mega* filament_vendor = Verbatim filament_cost = 23.88 +[filament:VOXELPLA PLUS @MEGA] +inherits = *PLA_mega* +filament_vendor = VOXELPLA +temperature = 200 +bed_temperature = 55 +first_layer_temperature = 200 +first_layer_bed_temperature = 55 +filament_cost = 16.99 +filament_density = 1.24 +filament_colour = #FF4640 + [printer:*common_mega*] printer_technology = FFF bed_shape = 0x0,210x0,210x210,0x210 @@ -2231,4 +2322,92 @@ use_relative_e_distances = 0 use_volumetric_e = 0 variable_layer_height = 1 wipe = 0 -z_offset = 0 \ No newline at end of file +z_offset = 0 + +## SLA printers + +[sla_print:*common print ANYCUBIC SLA*] +compatible_printers_condition = printer_notes=~/.*PHOTONMONOX.*/ +layer_height = 0.05 +output_filename_format = [input_filename_base].pwmx +pad_edge_radius = 0.5 +pad_enable = 0 +pad_max_merge_distance = 50 +pad_wall_height = 0 +pad_wall_thickness = 1 +pad_wall_slope = 45 +faded_layers = 8 +slice_closing_radius = 0.005 +support_base_diameter = 3 +support_base_height = 1 +support_critical_angle = 45 +support_density_at_45 = 250 +support_density_at_horizontal = 500 +support_head_front_diameter = 0.4 +support_head_penetration = 0.4 +support_head_width = 3 +support_max_bridge_length = 10 +support_minimal_z = 0 +support_object_elevation = 5 +support_pillar_diameter = 1 +support_pillar_connection_mode = zigzag +support_pillar_widening_factor = 0 +supports_enable = 1 +support_small_pillar_diameter_percent = 60% + +[sla_print:0.05 Normal @ANYCUBIC] +inherits = *common print ANYCUBIC SLA* +layer_height = 0.05 + +## SLA materials + +[sla_material:*common ANYCUBIC SLA*] +compatible_printers_condition = printer_notes=~/.*PHOTONMONOX.*/ +compatible_prints_condition = layer_height == 0.05 +exposure_time = 7 +initial_exposure_time = 40 +initial_layer_height = 0.05 +material_correction = 1,1,1 +material_notes = LIFT_DISTANCE=8.0\nLIFT_SPEED=2.5\nRETRACT_SPEED=3.0\nBOTTOM_LIFT_SPEED=2.0\nBOTTOM_LIFT_DISTANCE=9.0\nDELAY_BEFORE_EXPOSURE=0.5 + +[sla_material:*common 0.05 ANYCUBIC SLA*] +inherits = *common ANYCUBIC SLA* + +[sla_material:Generic Blue Resin @MONO 0.05] +inherits = *common 0.05 ANYCUBIC SLA* +exposure_time = 2.5 +initial_exposure_time = 40 +material_type = Tough +material_vendor = Generic +material_colour = #6080EC +compatible_printers_condition = printer_notes=~/.*PHOTONMONOX.*/ + +## Printers + +[printer:Anycubic Photon Mono X] +printer_technology = SLA +printer_model = PHOTON MONO X +printer_variant = default +default_sla_material_profile = Generic Blue Resin @MONO 0.05 +default_sla_print_profile = 0.05 Normal @ANYCUBIC +thumbnails = 224x168 +sla_archive_format = pwmx +bed_shape = 1.48x1.02,193.48x1.02,193.48x121.02,1.48x121.02 +display_height = 120 +display_orientation = landscape +display_mirror_x = 1 +display_mirror_y = 0 +display_pixels_x = 3840 +display_pixels_y = 2400 +display_width = 192 +max_print_height = 245 +elefant_foot_compensation = 0.2 +elefant_foot_min_width = 0.2 +min_exposure_time = 1 +max_exposure_time = 120 +min_initial_exposure_time = 1 +max_initial_exposure_time = 300 +printer_correction = 1,1,1 +gamma_correction = 1 +area_fill = 45 +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.'\nPRINTER_VENDOR_ANYCUBIC\nPRINTER_MODEL_PHOTONMONOX\n \ No newline at end of file diff --git a/resources/profiles/Anycubic/PHOTON MONO X_thumbnail.png b/resources/profiles/Anycubic/PHOTON MONO X_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..70ad47b63defdbd22c913d211d284a1bed729860 GIT binary patch literal 45953 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

?9hL)5+9SL}$(eIdYR*>(Nn1RXY00 z_y?`E?Af!*=GK;9okh|fAvy@noZ}L$pR6G6jMJbHt59MnO^?Eq7+qpai7pC^DKJI+ zDZ@{Xvg}iq;rYf;7KVOV(u+TZp^T3g1-%Afzw|IWdyZ(#3%gZ#&z|K~h>&lh;wH+(bC{MPT{ zS(>Rx;U=5>KfkshS%|mm;E!ehM#=#5AvE{{x>WwFY}3y{V6~G(wq6#Z~IRE z(R03w5B`t$bIZ@af=l-A;|rhrEdS)2zJa>(RvMrD>rb<=xWxP4`)+>bm9ONVJokHe z_IEs&|MBj3@Y-MeIhIyd(zb8K@pJ$B7XJO4-pG4@|6TmiAAW$Jc*QFj42Rjuq~^Cx z=XO(7#}BpRRT(vU99{p$zzS&L&(>cyWEw@>6(2tK@cCPz^Of3(OSzPYAfXsjS(`U* z*HM2X=AP~2A;-)gSN?ek0SS6@Y3oezf%5gFQk4A?0S+8IM1Of7Tk9tQp)3bHc;6j- z@ZG=3bXw8Wj%qUE!|!=J|LP65a_QAK@cl3QC9eP9{vm(#&i~B!{L>%h;rs97@dqE^ z|9JlQ@h9)Too9X9^ZB+Hyp$`h`#b#P>u=>l?|wU58z*`G5B~(c;gDC|{5_mFeuT2W z&=n_h!gM<2H-Gm%-2bJ!x%!Grx%;lWSkkb#xX7)){;T}6AN>(-`jMA%{S9Bot^e)a zyyJI%hf^mvc;#zf&(m(ak!StAujAo|9-ve(7!G*rfBX;p)KC8$FTCj{p7!Z^zlT-EW(Qr#|iJ{FmQ)8~^mCAL1=-~KfV!vWv_W50lH8mzUPI&qu_?z)5F z;ws`iS6aK8UVj+!N}<2Biq@LZ6sDtf8Z46uEG;d2PIOa&cp-ADG=sqcx4!w+yy)hi z=i`6+N4)XX|2NWK@;)lzD*;sfgU~MOrvJPytBA zb9XFEP$GpA=oRG<;Jz>2E9M*u!za2z$H-gPTK|X zryuPl1adJ*t&M-o7?d(-rO{|_Z6-C({MP64vRD5ad-h+3wGAlY#;1Q1|ME4z#^TCe z#5o3w%RJ}#H}Te6Ue4OlNBGb?-^S-Y`4Rr{cfSx@JF0q0caqm5M@ru{Jg%|$FPcR*iXP`YWrr^Yh6HKNRH~r|3 zBO;7}Q)_Gd%rD%+AO67~@VeK$iof~GkMjdB_&$E|mRmr>#`;O_yz7g+@jv}1-uQ+$ zP*-D4ojl2_|DV_Mw%cyy^}l=zfB6?5;YBySh+lm5EuA!QVPTQqzV+AnzVCf5Z+`1- zjMq=_(?9hueaexYV69sGU8~mHTg3-7Db-7c@G7OYfLH9>x9?fkTyxE!wC)tx`IXa$!$hH{OsT z;tMTwmUj`9ptJ;W!aS){?G~Ajf{_q56tJ+k!hu8AQcb6fH`i(E8dDTpas7=nP0i-1 zlkDApkb~EK9pkMHzV{_R$JajnncVrAPw<7m`8Y58rC;HSuX!4y%~M?a)TeXZ)1JX- zYlD3U4)W~hy@=6xlP}+QFW+<1kMq1A`Y}dZ8$9EizmqGj`Wn_w9Os8#`qTWJ;KStqR5z7~}J5 zi%{7HE0P)jKIjxmX>FY?aFRI9nFeigDu|7q*61o{2&xb(s+8QUNGl3sP)cJxaU$t8 zt7w-&+w%9%K%*$dxuEf^0=+fZImaR_Skj3SuaTND+WbhbXi%kJY(=!z!4BHBtEX0M zw|`FZj{bd|Q%dUslooN4Fm`$Hn8~aq+l#Ts$rw7mtg_#pB{}@wj+gJpO-k{C}%O`IChc3wZzl002ovPDHLk FV1nTQC-eXS literal 0 HcmV?d00001 diff --git a/resources/profiles/Artillery.idx b/resources/profiles/Artillery.idx index 181f667e56a..af643b148c6 100644 --- a/resources/profiles/Artillery.idx +++ b/resources/profiles/Artillery.idx @@ -1,4 +1,6 @@ min_slic3r_version = 2.4.1-alpha0 +0.0.7 Added Eolas Prints filaments. +0.0.6 Reduced retract_length for direct extruders 0.0.5 Added Artillery Hornet min_slic3r_version = 2.3.1-beta 0.0.4 Fixed first layer height in 0.28mm profile. diff --git a/resources/profiles/Artillery.ini b/resources/profiles/Artillery.ini index 734c584ef3e..61ffa2b950f 100644 --- a/resources/profiles/Artillery.ini +++ b/resources/profiles/Artillery.ini @@ -12,7 +12,7 @@ name = Artillery # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 0.0.5 +config_version = 0.0.7 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Artillery/ # changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% @@ -89,7 +89,7 @@ remaining_times = 0 retract_before_travel = 1 retract_before_wipe = 0% retract_layer_change = 1 -retract_length = 1.9 +retract_length = 0.8 retract_length_toolchange = 4 retract_lift = 0.6 retract_lift_above = 0 @@ -512,4 +512,65 @@ filament_vendor = Generic [filament:Generic TPU @Artillery] inherits = *TPU* -filament_vendor = Generic \ No newline at end of file +filament_vendor = Generic + +[filament:Eolas Prints PLA @Artillery] +inherits = *PLA* +filament_vendor = Eolas Prints +filament_cost = 23.50 +filament_density = 1.24 +filament_spool_weight = 0 +filament_colour = #4D9398 +first_layer_bed_temperature = 65 +first_layer_temperature = 208 +temperature = 202 + +[filament:Eolas Prints PLA Matte @Artillery] +inherits = Eolas Prints PLA @Artillery +filament_cost = 25.50 +filament_max_volumetric_speed = 14 +temperature = 210 + +[filament:Eolas Prints INGEO 850 @Artillery] +inherits = Eolas Prints PLA @Artillery +filament_cost = 25.90 +temperature = 210 + +[filament:Eolas Prints INGEO 870 @Artillery] +inherits = Eolas Prints PLA @Artillery +filament_cost = 25.90 +temperature = 215 +first_layer_bed_temperature = 68 +first_layer_temperature = 220 +bed_temperature = 65 + +[filament:Eolas Prints PETG @Artillery] +inherits = *PET* +filament_vendor = Eolas Prints +filament_cost = 29.90 +filament_density = 1.27 +filament_spool_weight = 0 +filament_colour = #4D9398 +temperature = 240 +first_layer_bed_temperature = 85 +first_layer_temperature = 235 +bed_temperature = 90 + +[filament:Eolas Prints PETG - UV Resistant @Artillery] +inherits = Eolas Prints PETG @Artillery +filament_cost = 35.90 +temperature = 242 +first_layer_temperature = 237 + +[filament:Eolas Prints TPU 93A @Artillery] +inherits = *TPU* +filament_vendor = Eolas Prints +filament_cost = 34.99 +filament_density = 1.21 +filament_colour = #4D9398 +filament_max_volumetric_speed = 1.2 +temperature = 230 +first_layer_bed_temperature = 30 +bed_temperature = 30 +filament_retract_length = 0 +extrusion_multiplier = 1.16 \ No newline at end of file diff --git a/resources/profiles/BIBO.idx b/resources/profiles/BIBO.idx index 85cc0fd1b07..3d59b7459fc 100644 --- a/resources/profiles/BIBO.idx +++ b/resources/profiles/BIBO.idx @@ -1,4 +1,6 @@ min_slic3r_version = 2.4.1-beta3 +0.0.7 Correct missing profile improvement from 0.0.6 to set ensure_vertical_shell_thickness = 0 (off). +0.0.6 Correct start gcode, match profile and firmware settings, and other profile improvements. 0.0.5 Correct Marlin Error accumulation for Ditto printer profiles. 0.0.4 Correct Marlin Error accumulation min_slic3r_version = 2.3.0-beta2 diff --git a/resources/profiles/BIBO.ini b/resources/profiles/BIBO.ini index 15e9c51a671..1b35166857f 100644 --- a/resources/profiles/BIBO.ini +++ b/resources/profiles/BIBO.ini @@ -5,7 +5,7 @@ name = BIBO # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 0.0.5 +config_version = 0.0.7 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/BIBO/ @@ -37,8 +37,8 @@ clip_multipart_objects = 1 compatible_printers = complete_objects = 0 dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 +elefant_foot_compensation = 0.3 +ensure_vertical_shell_thickness = 0 external_fill_pattern = rectilinear external_perimeters_first = 0 external_perimeter_extrusion_width = 0.40 @@ -48,8 +48,8 @@ extruder_clearance_height = 12 extruder_clearance_radius = 45 extrusion_width = 0.45 fill_angle = 45 -fill_density = 20% -fill_pattern = grid +fill_density = 15% +fill_pattern = cubic first_layer_extrusion_width = 0.42 first_layer_height = 0.2 first_layer_speed = 20 @@ -72,7 +72,7 @@ overhangs = 1 only_retract_when_crossing_perimeters = 0 ooze_prevention = 0 output_filename_format = {input_filename_base}_{layer_height}mm_{if num_extruders==1}{filament_type[0]}{else}E1{filament_type[0]}_E2{filament_type[1]}{endif}_{printer_model}_{print_time}.gcode -perimeters = 2 +perimeters = 3 perimeter_extruder = 1 perimeter_extrusion_width = 0.45 post_process = @@ -389,6 +389,10 @@ support_material_interface_layers = 3 support_material_with_sheath = 0 support_material_xy_spacing = 80% +# XXXXXXXXXXXXXXXXXXXXXX +# XXX--- filament ---XXX +# XXXXXXXXXXXXXXXXXXXXXX + # Common filament preset [filament:*common*] cooling = 0 @@ -494,6 +498,17 @@ inherits = *PLA* filament_vendor = Generic filament_notes = "List of materials which typically use standard PLA print settings:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladec PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" +[filament:BIBO White PLA @BIBO2] +inherits = *PLA* +filament_colour = #FFFFFF +filament_vendor = BIBO +filament_notes = "General Settings for the BIBO White Filament Which is included with the printer" +filament_cost = 20 +first_layer_bed_temperature = 30 +bed_temperature = 30 +first_layer_temperature = 200 +temperature = 190 + [filament:Generic PETG @BIBO2] inherits = *PET* filament_vendor = Generic @@ -690,6 +705,10 @@ min_print_speed = 15 slowdown_below_layer_time = 10 cooling = 1 +# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXX--- Printer settings ---XXX +# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + # Common printer preset [printer:*common*] printer_technology = FFF @@ -702,20 +721,20 @@ extruder_offset = 0x0 gcode_flavor = marlin silent_mode = 0 remaining_times = 0 -machine_max_acceleration_e = 1100 -machine_max_acceleration_extruding = 5000 -machine_max_acceleration_retracting = 1100 -machine_max_acceleration_x = 500 -machine_max_acceleration_y = 500 +machine_max_acceleration_x = 1100 +machine_max_acceleration_y = 1100 machine_max_acceleration_z = 100 -machine_max_feedrate_e = 20 +machine_max_acceleration_e = 5000 +machine_max_acceleration_extruding = 1100 +machine_max_acceleration_retracting = 1100 machine_max_feedrate_x = 350 machine_max_feedrate_y = 350 machine_max_feedrate_z = 2 -machine_max_jerk_e = 5 -machine_max_jerk_x = 8 -machine_max_jerk_y = 8 +machine_max_feedrate_e = 25 +machine_max_jerk_x = 10 +machine_max_jerk_y = 10 machine_max_jerk_z = 0.3 +machine_max_jerk_e = 5 machine_min_extruding_rate = 0 machine_min_travel_rate = 0 layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z] @@ -776,7 +795,7 @@ retract_lift_below = 0,0 retract_restart_extra = 0,0 retract_restart_extra_toolchange = 0,0 retract_speed = 20,20 -start_gcode = ;Start code PrusaSlicer BIBO 2 printers\nG21 ; set units to metric\nG90 ; absolute positioning\nM107 ; start with the fan off\nM190 S{max(first_layer_bed_temperature[0] - 5, first_layer_bed_temperature[1] - 5)} ; wait for bed temp\nM140 S{max(first_layer_bed_temperature[0], first_layer_bed_temperature[1])} ; continue bed heating to full temp while other things are happening\nM104 S{first_layer_temperature[0]} T0; set 1st nozzle heater to first layer temperature\nM104 S{first_layer_temperature[1]} T1; set 2nd nozzle heater to first layer temperature\nM105 ; Report Temperatures\nM109 S{first_layer_temperature[0]} T0; wait for 1st nozzle heat to first layer temperature\nM109 S{first_layer_temperature[1]} T1; wait for 2nd nozzle heat to first layer temperature\nM105 ; Report Temperatures\nG28 X0 Y0 ; move X/Y to min endstops\nG28 Z0 ; move Z to min endstops\nG1 Z2.0 F400 ; move the platform down 2mm\nT[initial_tool]; switch to initial tool position\nG92 E0.0 ; reset extruder\nG28 ; Home all axis\nG1 Y0 F1200 E0 ; move Y to min endstop and extrude 0 filament\nG92 E0.0 ; reset extruder and zero the current extruder coordinate before printing\nM117 BIBO now Printing... ; Put now printing message on screen +start_gcode = ;Start code PrusaSlicer BIBO 2 printers\nG21 ; set units to metric\nG90 ; absolute positioning\nM107 ; start with the fan off\nM190 S{max(first_layer_bed_temperature[0] - 5, first_layer_bed_temperature[1] - 5)} ; wait for bed temp\nM140 S{max(first_layer_bed_temperature[0], first_layer_bed_temperature[1])} ; continue bed heating to full temp while other things are happening\nM104 S{first_layer_temperature[0]} T0; set 1st nozzle heater to first layer temperature\nM104 S{first_layer_temperature[1]} T1; set 2nd nozzle heater to first layer temperature\nM105 ; Report Temperatures\nM109 S{first_layer_temperature[0]} T0; wait for 1st nozzle heat to first layer temperature\nM109 S{first_layer_temperature[1]} T1; wait for 2nd nozzle heat to first layer temperature\nM105 ; Report Temperatures\nT0 ; Start at T0 to avoid extruder nozzle offset issues\nG28 X0 Y0 ; move X/Y to min endstops\nG28 Z0 ; move Z to min endstops\nG1 Z2.0 F400 ; move the platform down 2mm\nG92 E0.0 ; reset extruder\nG1 Y0 F1200 E0 ; move Y to min endstop and extrude 0 filament\nT[initial_tool]; switch to initial tool position\nG92 E0.0 ; reset extruder and zero the current extruder coordinate before printing\nM117 BIBO now Printing... ; Put now printing message on screen end_gcode = ;BIBO End GCode\nM107 ; turn fans off\nG91 ; Relative positioning\nG1 Z1 F100\nM140 S0 ; Disable heated bed\nM104 T0 S0 ; extruder T0 heater off\nM104 T1 S0 ; extruder T1 heater off\nG1 Z+0.5 X-20 Y-20 F300 ; move Z down then move print head a bit out of the way\nG28 X0 Y0 ; move X/Y to min endstops, so the head is out of the way\nG90 ; Absolute positioning\nG92 E0.0 ; Reset extruder position\nM84 ; Turn steppers off\nM117 BIBO Print complete ; Put print complete message on screen thumbnails = toolchange_gcode = @@ -798,7 +817,7 @@ deretract_speed = 0 # Setting this value to 0 uses the retract speed retract_before_wipe = 100% default_print_profile = 0.20mm NORMAL @BIBO2 default_filament_profile = Generic PLA @BIBO2 -start_gcode = ;Start code PrusaSlicer BIBO 2 printers E1 only (i.e. T0)\nG21 ; set units to metric\nG90 ; absolute positioning\nM107 ; start with the fan off\nM190 S{first_layer_bed_temperature[0] - 5} ; wait for bed temp\nM140 S{first_layer_bed_temperature[0]} ; continue bed heating to full temp while other things are happening\nM104 S{first_layer_temperature[0]} T0 ; set 1st nozzle heater to first layer temperature\nM104 S{first_layer_temperature[0] * 0.791} T1 ; set 2nd nozzle heater to 79.1 percent standby temp\nM105 ; Report Temperatures\nM109 S{first_layer_temperature[0]} T0 ; wait for 1st nozzle heat to first layer temperature\nM109 S{first_layer_temperature[0] * 0.791} T1 ; wait for 2nd nozzle heat to 79.1 percent standby temp\nM105 ; Report Temperatures\nG28 X0 Y0 ; move X/Y to min endstops\nG28 Z0 ; move Z to min endstops\nG1 Y0 F1200 E0 ; move Y to min endstop and extrude 0 filament\nT[initial_tool] ; switch to initial tool position\nG92 E0.0 ; reset extruder\nG28 ; Home all axis\nG1 Y0 F1200 E0 ; move Y to min endstop and reset extruder\nG92 E0.0 ; zero the current extruder coordinate\nM117 Cleaning... ; Put Cleaning message on screen, Attempt Nozzle Wipe (for ooze free startup)\nG1 X-15.0 Y-92.9 Z0.3 F2400.0 ; move to start-line position\nG1 X15.0 Y-92.9 Z0.3 F1000.0 E2 ; draw 1st line\nG1 X15.0 Y-92.6 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92.6 Z0.3 F1000.0 E4 ; draw 2nd line\nG1 X-15.0 Y-92.3 Z0.3 F3000.0 ; move to side a little\nG1 X15.0 Y-92.3 Z0.3 F1000.0 E6 ; draw 3rd line\nG1 X15.0 Y-92 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92 Z0.3 F1000.0 E8 ; draw 4th line\nG92 E0.0 ; reset extruder and zero the current extruder coordinate before printing\nM117 BIBO E1 now Printing... ; Put now printing message on screen +start_gcode = ;Start code PrusaSlicer BIBO 2 printers E1 only (i.e. T0)\nG21 ; set units to metric\nG90 ; absolute positioning\nM107 ; start with the fan off\nM190 S{first_layer_bed_temperature[0] - 5} ; wait for bed temp\nM140 S{first_layer_bed_temperature[0]} ; continue bed heating to full temp while other things are happening\nM104 S{first_layer_temperature[0]} T0 ; set 1st nozzle heater to first layer temperature\nM104 S{first_layer_temperature[0] * 0.791} T1 ; set 2nd nozzle heater to 79.1 percent standby temp\nM105 ; Report Temperatures\nM109 S{first_layer_temperature[0]} T0 ; wait for 1st nozzle heat to first layer temperature\nM109 S{first_layer_temperature[0] * 0.791} T1 ; wait for 2nd nozzle heat to 79.1 percent standby temp\nM105 ; Report Temperatures\nT0 ; Start at T0 to avoid extruder nozzle offset issues\nG28 X0 Y0 ; move X/Y to min endstops\nG28 Z0 ; move Z to min endstops\nG1 Y0 F1200 E0 ; move Y to min endstop and extrude 0 filament\nT[initial_tool] ; switch to initial tool position\nG92 E0.0 ; reset extruder\nG1 Y0 F1200 E0 ; move Y to min endstop and reset extruder\nG92 E0.0 ; zero the current extruder coordinate\nM117 Cleaning... ; Put Cleaning message on screen, Attempt Nozzle Wipe (for ooze free startup)\nG1 X-15.0 Y-92.9 Z0.3 F2400.0 ; move to start-line position\nG1 X15.0 Y-92.9 Z0.3 F1000.0 E2 ; draw 1st line\nG1 X15.0 Y-92.6 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92.6 Z0.3 F1000.0 E4 ; draw 2nd line\nG1 X-15.0 Y-92.3 Z0.3 F3000.0 ; move to side a little\nG1 X15.0 Y-92.3 Z0.3 F1000.0 E6 ; draw 3rd line\nG1 X15.0 Y-92 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92 Z0.3 F1000.0 E8 ; draw 4th line\nG92 E0.0 ; reset extruder and zero the current extruder coordinate before printing\nM117 BIBO E1 now Printing... ; Put now printing message on screen end_gcode = ;BIBO End GCode\nM107 ; turn fans off\nG91 ; Relative positioning\nG1 Z1 F100\nM140 S0 ; Disable heated bed\nM104 T0 S0 ; extruder T0 heater off\nM104 T1 S0 ; extruder T1 heater off\nG1 Z+0.5 X-20 Y-20 F300 ; move Z down then move print head a bit out of the way\nG28 X0 Y0 ; move X/Y to min endstops, so the head is out of the way\nG90 ; Absolute positioning\nG92 E0.0 ; Reset extruder position\nM84 ; Turn steppers off\nM117 BIBO Print complete ; Put print complete message on screen thumbnails = toolchange_gcode = @@ -821,7 +840,7 @@ deretract_speed = 0 # Setting this value to 0 uses the retract speed retract_before_wipe = 100% default_print_profile = 0.20mm NORMAL @BIBO2 default_filament_profile = Generic PLA @BIBO2 -start_gcode = ;Start code PrusaSlicer BIBO 2 printers E2 only (i.e. T1)\nG21 ; set units to metric\nG90 ; absolute positioning\nM107 ; start with the fan off\nM140 S{first_layer_bed_temperature[0] - 5} ; set bed temp\nM105 ; Report Temperatures\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp\nM104 S{first_layer_temperature[0] * 0.791} T0 ; set 1st nozzle heater to 79.1 percent standby temp\nM104 S{first_layer_temperature[0]} T1 ; set 2nd nozzle heater to first layer temperature\nM105 ; Report Temperatures\nM109 S{first_layer_temperature[0] * 0.791} T0 ; set 1st nozzle heater to 79.1 percent standby temp\nM109 S{first_layer_temperature[0]} T1 ; Wait for 2nd nozzle heater to first layer temperature\nM105 ; Report Temperatures\nG28 X0 Y0 ; move X/Y to min endstops\nG28 Z0 ; move Z to min endstops\nG1 Z2 F400 ; move the print bed down 2mm\nT0 ; switch to tool position T0\nG90 ; absolute positioning\nG92 E0.0 ; zero the current extruder coordinate\nG28 ; Home all axis\nG1 Y0 F1200 E0 ; move Y to min endstop and reset extruder\nG92 E0.0 ; zero the current extruder coordinate\nT1 ; switch to tool position T1\nG92 E0.0 ; zero the current extruder coordinate\nM117 E2 nozzle wipe... ; Put Nozzle wipe message on screen, Attempt Nozzle Wipe (for ooze free startup)\nG1 X-15.0 Y-92.9 Z0.3 F2400.0 ; move to start-line position\nG1 X15.0 Y-92.9 Z0.3 F1000.0 E2 ; draw 1st line\nG1 X15.0 Y-92.6 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92.6 Z0.3 F1000.0 E4 ; draw 2nd line\nG1 X-15.0 Y-92.3 Z0.3 F3000.0 ; move to side a little\nG1 X15.0 Y-92.3 Z0.3 F1000.0 E6 ; draw 3rd line\nG1 X15.0 Y-92 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92 Z0.3 F1000.0 E8 ; draw 4th line\nG92 E0.0 ; reset extruder coordinate to zero before printing\nM117 BIBO Now Printing from E2... ; Put now printing message on screen +start_gcode = ;Start code PrusaSlicer BIBO 2 printers E2 only (i.e. T1)\nG21 ; set units to metric\nG90 ; absolute positioning\nM107 ; start with the fan off\nM140 S{first_layer_bed_temperature[0] - 5} ; set bed temp\nM105 ; Report Temperatures\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp\nM104 S{first_layer_temperature[0] * 0.791} T0 ; set 1st nozzle heater to 79.1 percent standby temp\nM104 S{first_layer_temperature[0]} T1 ; set 2nd nozzle heater to first layer temperature\nM105 ; Report Temperatures\nM109 S{first_layer_temperature[0] * 0.791} T0 ; set 1st nozzle heater to 79.1 percent standby temp\nM109 S{first_layer_temperature[0]} T1 ; Wait for 2nd nozzle heater to first layer temperature\nM105 ; Report Temperatures\nT0 ; switch to tool position T0\nG28 X0 Y0 ; move X/Y to min endstops\nG28 Z0 ; move Z to min endstops\nG1 Z2 F400 ; move the print bed down 2mm\nG92 E0.0 ; zero the current extruder coordinate\nG1 Y0 F1200 E0 ; move Y to min endstop and reset extruder\nG92 E0.0 ; zero the current extruder coordinate\nT1 ; switch to tool position T1\nG92 E0.0 ; zero the current extruder coordinate\nM117 E2 nozzle wipe... ; Put Nozzle wipe message on screen, Attempt Nozzle Wipe (for ooze free startup)\nG1 X-15.0 Y-92.9 Z0.3 F2400.0 ; move to start-line position\nG1 X15.0 Y-92.9 Z0.3 F1000.0 E2 ; draw 1st line\nG1 X15.0 Y-92.6 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92.6 Z0.3 F1000.0 E4 ; draw 2nd line\nG1 X-15.0 Y-92.3 Z0.3 F3000.0 ; move to side a little\nG1 X15.0 Y-92.3 Z0.3 F1000.0 E6 ; draw 3rd line\nG1 X15.0 Y-92 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92 Z0.3 F1000.0 E8 ; draw 4th line\nG92 E0.0 ; reset extruder coordinate to zero before printing\nM117 BIBO Now Printing from E2... ; Put now printing message on screen end_gcode = ;BIBO End GCode\nM107 ; turn fans off\nG91 ; Relative positioning\nG1 Z1 F100\nM140 S0 ; Disable heated bed\nM104 T0 S0 ; extruder T0 heater off\nM104 T1 S0 ; extruder T1 heater off\nG1 Z+0.5 X-20 Y-20 F300 ; move Z down then move print head a bit out of the way\nG28 X0 Y0 ; move X/Y to min endstops, so the head is out of the way\nG90 ; Absolute positioning\nG92 E0.0 ; Reset extruder position\nM84 ; Turn steppers off\nM117 BIBO Print complete ; Put print complete message on screen thumbnails = toolchange_gcode = @@ -838,7 +857,7 @@ bed_shape = 0x-93,33x-93,33x93,0x93 #bed_model = BIBO2_bed.stl #bed_texture = BIBO2.svg before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;[layer_z]\nM104 S{temperature[0]} T1 ; set 2nd nozzle heater to print temperature\nG92 E0\n -start_gcode = ;Start code PrusaSlicer BIBO 2 printers E1 only (i.e. T0)\nM420 S1 ; Turn on Ditto Printing\nG21 ; set units to metric\nG90 ; absolute positioning\nM107 ; start with the fan off\nM190 S{first_layer_bed_temperature[0] - 5} ; wait for bed temp\nM140 S{first_layer_bed_temperature[0]} ; continue bed heating to full temp while other things are happening\nM104 S{first_layer_temperature[0]} T0 ; set 1st nozzle heater to first layer temperature\nM104 S{first_layer_temperature[0]} T1 ; set 2nd nozzle heater to same first layer temperature\nM105 ; Report Temperatures\nM109 S{first_layer_temperature[0]} T0 ; wait for 1st nozzle heat to first layer temperature\nM109 S{first_layer_temperature[0]} T1 ; wait for 2nd nozzle heat to same first layer temperature\nM105 ; Report Temperatures\nG28 X0 Y0 ; move X/Y to min endstops\nG28 Z0 ; move Z to min endstops\nG1 Y0 F1200 E0 ; move Y to min endstop and extrude 0 filament\nT[initial_tool] ; switch to initial tool position\nG92 E0.0 ; reset extruder\nG28 ; Home all axis\nG1 Y0 F1200 E0 ; move Y to min endstop and reset extruder\nG92 E0.0 ; zero the current extruder coordinate\nM117 Cleaning... ; Put Cleaning message on screen, Attempt Nozzle Wipe (for ooze free startup)\nG1 X-15.0 Y-92.9 Z0.3 F2400.0 ; move to start-line position\nG1 X15.0 Y-92.9 Z0.3 F1000.0 E2 ; draw 1st line\nG1 X15.0 Y-92.6 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92.6 Z0.3 F1000.0 E4 ; draw 2nd line\nG1 X-15.0 Y-92.3 Z0.3 F3000.0 ; move to side a little\nG1 X15.0 Y-92.3 Z0.3 F1000.0 E6 ; draw 3rd line\nG1 X15.0 Y-92 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92 Z0.3 F1000.0 E8 ; draw 4th line\nG92 E0.0 ; reset extruder and zero the current extruder coordinate before printing\nM117 BIBO E1 now Printing... ; Put now printing message on screen +start_gcode = ;Start code PrusaSlicer BIBO 2 printers E1 only (i.e. T0)\nM420 S1 ; Turn on Ditto Printing\nG21 ; set units to metric\nG90 ; absolute positioning\nM107 ; start with the fan off\nM190 S{first_layer_bed_temperature[0] - 5} ; wait for bed temp\nM140 S{first_layer_bed_temperature[0]} ; continue bed heating to full temp while other things are happening\nM104 S{first_layer_temperature[0]} T0 ; set 1st nozzle heater to first layer temperature\nM104 S{first_layer_temperature[0]} T1 ; set 2nd nozzle heater to same first layer temperature\nM105 ; Report Temperatures\nM109 S{first_layer_temperature[0]} T0 ; wait for 1st nozzle heat to first layer temperature\nM109 S{first_layer_temperature[0]} T1 ; wait for 2nd nozzle heat to same first layer temperature\nM105 ; Report Temperatures\nT0 ; Start at T0 to avoid extruder nozzle offset issues\nG28 X0 Y0 ; move X/Y to min endstops\nG28 Z0 ; move Z to min endstops\nG1 Y0 F1200 E0 ; move Y to min endstop and extrude 0 filament\nT[initial_tool] ; switch to initial tool position\nG92 E0.0 ; reset extruder\nG1 Y0 F1200 E0 ; move Y to min endstop and reset extruder\nG92 E0.0 ; zero the current extruder coordinate\nM117 Cleaning... ; Put Cleaning message on screen, Attempt Nozzle Wipe (for ooze free startup)\nG1 X-15.0 Y-92.9 Z0.3 F2400.0 ; move to start-line position\nG1 X15.0 Y-92.9 Z0.3 F1000.0 E2 ; draw 1st line\nG1 X15.0 Y-92.6 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92.6 Z0.3 F1000.0 E4 ; draw 2nd line\nG1 X-15.0 Y-92.3 Z0.3 F3000.0 ; move to side a little\nG1 X15.0 Y-92.3 Z0.3 F1000.0 E6 ; draw 3rd line\nG1 X15.0 Y-92 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92 Z0.3 F1000.0 E8 ; draw 4th line\nG92 E0.0 ; reset extruder and zero the current extruder coordinate before printing\nM117 BIBO E1 now Printing... ; Put now printing message on screen end_gcode = ;BIBO End GCode\nM107 ; turn fans off\nG91 ; Relative positioning\nG1 Z1 F100\nM140 S0 ; Disable heated bed\nM104 T0 S0 ; extruder T0 heater off\nM104 T1 S0 ; extruder T1 heater off\nG1 Z+0.5 X-20 Y-20 F300 ; move Z down then move print head a bit out of the way\nG28 X0 Y0 ; move X/Y to min endstops, so the head is out of the way\nG90 ; Absolute positioning\nG92 E0.0 ; Reset extruder position\nM84 ; Turn steppers off\nM420 S0 ; Turn off Ditto Printing function\nM117 BIBO Print complete ; Put print complete message on screen [printer:BIBO2 E2 left E1 Ditto] @@ -849,5 +868,5 @@ bed_shape = -33x-93,0x-93,0x93,-33x93 #bed_model = BIBO2_bed.stl #bed_texture = BIBO2.svg before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;[layer_z]\nM104 S{temperature[0]} T0 ; set 1st nozzle heater to print temperature\nG92 E0\n -start_gcode = ;Start code PrusaSlicer BIBO 2 printers E2 only (i.e. T1)\nM420 S1 ; Turn on Ditto Printing\nG21 ; set units to metric\nG90 ; absolute positioning\nM107 ; start with the fan off\nM140 S{first_layer_bed_temperature[0] - 5} ; set bed temp\nM105 ; Report Temperatures\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp\nM104 S{first_layer_temperature[0]} T0 ; set 1st nozzle heater to ditto print temperature\nM104 S{first_layer_temperature[0]} T1 ; set 2nd nozzle heater to first layer temperature\nM105 ; Report Temperatures\nM109 S{first_layer_temperature[0]} T0 ; set 1st nozzle heater to ditto printing temperature\nM109 S{first_layer_temperature[0]} T1 ; Wait for 2nd nozzle heater to first layer temperature\nM105 ; Report Temperatures\nG28 X0 Y0 ; move X/Y to min endstops\nG28 Z0 ; move Z to min endstops\nG1 Z2 F400 ; move the print bed down 2mm\nT0 ; switch to tool position T0\nG90 ; absolute positioning\nG92 E0.0 ; zero the current extruder coordinate\nG28 ; Home all axis\nG1 Y0 F1200 E0 ; move Y to min endstop and reset extruder\nG92 E0.0 ; zero the current extruder coordinate\nT1 ; switch to tool position T1\nG92 E0.0 ; zero the current extruder coordinate\nM117 E2 nozzle wipe... ; Put Nozzle wipe message on screen, Attempt Nozzle Wipe (for ooze free startup)\nG1 X-15.0 Y-92.9 Z0.3 F2400.0 ; move to start-line position\nG1 X15.0 Y-92.9 Z0.3 F1000.0 E2 ; draw 1st line\nG1 X15.0 Y-92.6 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92.6 Z0.3 F1000.0 E4 ; draw 2nd line\nG1 X-15.0 Y-92.3 Z0.3 F3000.0 ; move to side a little\nG1 X15.0 Y-92.3 Z0.3 F1000.0 E6 ; draw 3rd line\nG1 X15.0 Y-92 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92 Z0.3 F1000.0 E8 ; draw 4th line\nG92 E0.0 ; reset extruder coordinate to zero before printing\nM117 BIBO Now Printing from E2... ; Put now printing message on screen +start_gcode = ;Start code PrusaSlicer BIBO 2 printers E2 only (i.e. T1)\nM420 S1 ; Turn on Ditto Printing\nG21 ; set units to metric\nG90 ; absolute positioning\nM107 ; start with the fan off\nM140 S{first_layer_bed_temperature[0] - 5} ; set bed temp\nM105 ; Report Temperatures\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp\nM104 S{first_layer_temperature[0]} T0 ; set 1st nozzle heater to ditto print temperature\nM104 S{first_layer_temperature[0]} T1 ; set 2nd nozzle heater to first layer temperature\nM105 ; Report Temperatures\nM109 S{first_layer_temperature[0]} T0 ; set 1st nozzle heater to ditto printing temperature\nM109 S{first_layer_temperature[0]} T1 ; Wait for 2nd nozzle heater to first layer temperature\nM105 ; Report Temperatures\nT0 ; Start at T0 to avoid extruder nozzle offset issues\nG28 X0 Y0 ; move X/Y to min endstops\nG28 Z0 ; move Z to min endstops\nG1 Z2 F400 ; move the print bed down 2mm\nG92 E0.0 ; zero the current extruder coordinate\nG1 Y0 F1200 E0 ; move Y to min endstop and reset extruder\nG92 E0.0 ; zero the current extruder coordinate\nT1 ; switch to tool position T1\nG92 E0.0 ; zero the current extruder coordinate\nM117 E2 nozzle wipe... ; Put Nozzle wipe message on screen, Attempt Nozzle Wipe (for ooze free startup)\nG1 X-15.0 Y-92.9 Z0.3 F2400.0 ; move to start-line position\nG1 X15.0 Y-92.9 Z0.3 F1000.0 E2 ; draw 1st line\nG1 X15.0 Y-92.6 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92.6 Z0.3 F1000.0 E4 ; draw 2nd line\nG1 X-15.0 Y-92.3 Z0.3 F3000.0 ; move to side a little\nG1 X15.0 Y-92.3 Z0.3 F1000.0 E6 ; draw 3rd line\nG1 X15.0 Y-92 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92 Z0.3 F1000.0 E8 ; draw 4th line\nG92 E0.0 ; reset extruder coordinate to zero before printing\nM117 BIBO Now Printing from E2... ; Put now printing message on screen end_gcode = ;BIBO End GCode\nM107 ; turn fans off\nG91 ; Relative positioning\nG1 Z1 F100\nM140 S0 ; Disable heated bed\nM104 T0 S0 ; extruder T0 heater off\nM104 T1 S0 ; extruder T1 heater off\nG1 Z+0.5 X-20 Y-20 F300 ; move Z down then move print head a bit out of the way\nG28 X0 Y0 ; move X/Y to min endstops, so the head is out of the way\nG90 ; Absolute positioning\nG92 E0.0 ; Reset extruder position\nM84 ; Turn steppers off\nM420 S0 ; Turn off Ditto Printing function\nM117 BIBO Print complete ; Put print complete message on screen diff --git a/resources/profiles/BIQU.idx b/resources/profiles/BIQU.idx new file mode 100644 index 00000000000..03c0035afc9 --- /dev/null +++ b/resources/profiles/BIQU.idx @@ -0,0 +1,2 @@ +min_slic3r_version = 2.6.0-alpha1 +0.1.0 Initial version diff --git a/resources/profiles/BIQU.ini b/resources/profiles/BIQU.ini new file mode 100644 index 00000000000..b21d5a27602 --- /dev/null +++ b/resources/profiles/BIQU.ini @@ -0,0 +1,437 @@ +# Print profiles for BIQU printers. +# Based on PR https://github.com/slic3r/slic3r-profiles/pull/32 by @bkonosky + + +[vendor] +name = BIQU +config_version = 0.1.0 +config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/BIQU/ + +# The printer models will be shown by the Configuration Wizard in this order, +# also the first model installed & the first nozzle installed will be activated after install. +# Printer model name will be shown by the installation wizard. + +[printer_model:BIQUBX] +name = BIQU BX +variants = 0.4 +technology = FFF +bed_model = BX_Bed.stl +bed_texture = BX_Texture.png +default_materials = Generic PLA @BIQU; Generic PETG @BIQU; Generic ABS @BIQU + +# All presets starting with asterisk, for example *common*, are intermediate and they will +# not make it into the user interface. + +# Common print preset +[print:*common*] +avoid_crossing_perimeters = 0 +bottom_fill_pattern = monotonic +bridge_angle = 0 +bridge_flow_ratio = 0.95 +bridge_speed = 25 +brim_width = 0 +clip_multipart_objects = 1 +complete_objects = 0 +bridge_acceleration = 250 +perimeter_acceleration = 500 +infill_acceleration = 500 +first_layer_acceleration = 500 +default_acceleration = 500 +dont_support_bridges = 1 +ensure_vertical_shell_thickness = 1 +external_perimeters_first = 0 +external_perimeter_speed = 25 +extra_perimeters = 0 +extruder_clearance_height = 34 +extruder_clearance_radius = 47 +fill_angle = 45 +fill_density = 15% +fill_pattern = gyroid +first_layer_height = 0.2 +elefant_foot_compensation = 0.1 +first_layer_speed = 20 +gap_fill_speed = 30 +gcode_comments = 0 +infill_every_layers = 1 +infill_extruder = 1 +infill_first = 0 +infill_only_where_needed = 0 +infill_overlap = 25% +infill_speed = 50 +interface_shells = 0 +max_print_speed = 100 +max_volumetric_extrusion_rate_slope_negative = 0 +max_volumetric_extrusion_rate_slope_positive = 0 +max_volumetric_speed = 0 +min_skirt_length = 4 +notes = +only_retract_when_crossing_perimeters = 0 +ooze_prevention = 0 +output_filename_format = {input_filename_base}_{print_time}_{digits(layer_height,1,2)}mm_{temperature[0]}C_{filament_type[0]}_{printer_model}.gcode +perimeters = 2 +perimeter_extruder = 1 +perimeter_speed = 40 +raft_layers = 0 +seam_position = nearest +single_extruder_multi_material_priming = 0 +skirts = 1 +skirt_distance = 3 +skirt_height = 2 +small_perimeter_speed = 25 +solid_infill_below_area = 0 +solid_infill_every_layers = 0 +solid_infill_extruder = 1 +solid_infill_speed = 40 +spiral_vase = 0 +standby_temperature_delta = -5 +support_material = 0 +support_material_extruder = 0 +support_material_interface_extruder = 0 +support_material_angle = 0 +support_material_buildplate_only = 0 +support_material_enforce_layers = 0 +support_material_contact_distance = 0.15 +support_material_bottom_contact_distance = 0.15 +support_material_interface_contact_loops = 0 +support_material_interface_layers = 2 +support_material_interface_pattern = rectilinear +support_material_interface_spacing = 0.2 +support_material_interface_speed = 100% +support_material_pattern = rectilinear +support_material_solid_first_layer = 1 +support_material_spacing = 2 +support_material_speed = 40 +support_material_synchronize_layers = 0 +support_material_threshold = 40 +support_material_with_sheath = 0 +support_material_xy_spacing = 60% +thin_perimeters = 1 +thin_walls = 1 +top_fill_pattern = monotonic +top_solid_infill_speed = 30 +travel_speed = 150 +wipe_tower = 1 +wipe_tower_bridging = 10 +wipe_tower_rotation_angle = 0 +wipe_tower_width = 60 +wipe_tower_x = 160 +wipe_tower_y = 160 +xy_size_compensation = 0 +extrusion_width = 0.45 +external_perimeter_extrusion_width = 0.43 +first_layer_extrusion_width = 0.55 +support_material_extrusion_width = 0.38 +top_infill_extrusion_width = 0.43 + +[print:*0.08mm*] +inherits = *common* +layer_height = 0.08 +perimeters = 3 +bottom_solid_layers = 9 +top_solid_layers = 11 +bridge_flow_ratio = 0.7 + +[print:*0.10mm*] +inherits = *common* +layer_height = 0.10 +perimeters = 3 +bottom_solid_layers = 7 +top_solid_layers = 9 +bridge_flow_ratio = 0.7 + +[print:*0.12mm*] +inherits = *common* +layer_height = 0.12 +perimeters = 3 +bottom_solid_layers = 6 +top_solid_layers = 7 +bridge_flow_ratio = 0.7 + +[print:*0.16mm*] +inherits = *common* +layer_height = 0.16 +bottom_solid_layers = 5 +top_solid_layers = 7 +bridge_flow_ratio = 0.85 + +[print:*0.20mm*] +inherits = *common* +layer_height = 0.20 +bottom_solid_layers = 4 +top_solid_layers = 5 + +[print:*0.24mm*] +inherits = *common* +layer_height = 0.24 +bottom_solid_layers = 3 +top_solid_layers = 4 + +[print:*0.28mm*] +inherits = *common* +layer_height = 0.28 +bottom_solid_layers = 3 +top_solid_layers = 4 + +[print:*0.32mm*] +inherits = *common* +layer_height = 0.32 +bottom_solid_layers = 3 +top_solid_layers = 4 + +[print:0.08mm HIGHDETAIL @BIQU] +inherits = *0.08mm* +compatible_printers_condition = printer_model=~/(BIQUBX).*/ + +[print:0.10mm HIGHDETAIL @BIQU] +inherits = *0.10mm* +compatible_printers_condition = printer_model=~/(BIQUBX).*/ + +[print:0.12mm DETAIL @BIQU] +inherits = *0.12mm* +compatible_printers_condition = printer_model=~/(BIQUBX).*/ + +[print:0.16mm OPTIMAL @BIQU] +inherits = *0.16mm* +compatible_printers_condition = printer_model=~/(BIQUBX).*/ + +[print:0.20mm NORMAL @BIQU] +inherits = *0.20mm* +compatible_printers_condition = printer_model=~/(BIQUBX).*/ + +[print:0.24mm DRAFT @BIQU] +inherits = *0.24mm* +compatible_printers_condition = printer_model=~/(BIQUBX).*/ + +[print:0.28mm SUPERDRAFT @BIQU] +inherits = *0.28mm* +compatible_printers_condition = printer_model=~/(BIQUBX).*/ + +[filament:*common*] +cooling = 0 +compatible_printers = +extrusion_multiplier = 1 +filament_cost = 0 +filament_density = 0 +filament_diameter = 1.75 +filament_notes = "" +filament_settings_id = "" +filament_soluble = 0 +min_print_speed = 15 +slowdown_below_layer_time = 20 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_BIQU.*/ + +[filament:*PLA*] +inherits = *common* +bed_temperature = 60 +fan_below_layer_time = 100 +filament_colour = #DDDDDD +filament_max_volumetric_speed = 15 +filament_type = PLA +filament_density = 1.24 +filament_cost = 20 +first_layer_bed_temperature = 60 +first_layer_temperature = 210 +fan_always_on = 1 +cooling = 1 +max_fan_speed = 100 +min_fan_speed = 100 +bridge_fan_speed = 100 +disable_fan_first_layers = 1 +temperature = 205 + +[filament:*PET*] +inherits = *common* +bed_temperature = 70 +cooling = 1 +disable_fan_first_layers = 3 +fan_below_layer_time = 20 +filament_colour = #DDDDDD +filament_max_volumetric_speed = 8 +filament_type = PETG +filament_density = 1.27 +filament_cost = 30 +first_layer_bed_temperature = 70 +first_layer_temperature = 240 +fan_always_on = 1 +max_fan_speed = 50 +min_fan_speed = 20 +bridge_fan_speed = 100 +temperature = 240 + +[filament:*ABS*] +inherits = *common* +bed_temperature = 100 +cooling = 0 +disable_fan_first_layers = 3 +fan_below_layer_time = 20 +filament_colour = #DDDDDD +filament_max_volumetric_speed = 11 +filament_type = ABS +filament_density = 1.04 +filament_cost = 20 +first_layer_bed_temperature = 100 +first_layer_temperature = 245 +fan_always_on = 0 +max_fan_speed = 0 +min_fan_speed = 0 +bridge_fan_speed = 30 +top_fan_speed = 0 +temperature = 245 + +[filament:Generic PLA @BIQU] +inherits = *PLA* +filament_vendor = Generic + +[filament:Generic PETG @BIQU] +inherits = *PET* +filament_vendor = Generic + +[filament:Generic ABS @BIQU] +inherits = *ABS* +first_layer_bed_temperature = 90 +bed_temperature = 90 +filament_vendor = Generic + + + +# Common printer preset +[printer:*common*] +printer_technology = FFF +before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;{layer_z}\n\n +between_objects_gcode = +pause_print_gcode = +deretract_speed = 40 +extruder_colour = #FCE94F +extruder_offset = 0x0 +gcode_flavor = marlin2 +silent_mode = 0 +remaining_times = 0 +machine_max_acceleration_e = 10000 +machine_max_acceleration_extruding = 1000 +machine_max_acceleration_retracting = 1000 +machine_max_acceleration_x = 1000 +machine_max_acceleration_y = 1000 +machine_max_acceleration_z = 100 +machine_max_feedrate_e = 65 +machine_max_feedrate_x = 200 +machine_max_feedrate_y = 200 +machine_max_feedrate_z = 10 +machine_max_jerk_e = 5 +machine_max_jerk_x = 10 +machine_max_jerk_y = 10 +machine_max_jerk_z = 2 +machine_min_extruding_rate = 0 +machine_min_travel_rate = 0 +layer_gcode = ;AFTER_LAYER_CHANGE\n;{layer_z} +max_layer_height = 0.28 +min_layer_height = 0.08 +max_print_height = 250 +nozzle_diameter = 0.4 +printer_notes = +printer_settings_id = +retract_before_travel = 2 +retract_before_wipe = 70% +retract_layer_change = 1 +retract_length = 5 +retract_length_toolchange = 1 +retract_lift = 0 +retract_lift_above = 0 +retract_lift_below = 0 +retract_restart_extra = 0 +retract_restart_extra_toolchange = 0 +retract_speed = 60 +single_extruder_multi_material = 0 +thumbnails = 16x16,220x124 +thumbnails_color = #018aff +thumbnails_custom_color = 0 +thumbnails_end_file = 0 +thumbnails_format = PNG +thumbnails_with_bed = 0 +toolchange_gcode = +use_firmware_retraction = 0 +use_relative_e_distances = 0 +use_volumetric_e = 0 +variable_layer_height = 1 +wipe = 1 +z_offset = 0 +z_step = 0.04 +printer_model = +default_print_profile = 0.16mm OPTIMAL @BIQU +default_filament_profile = Generic PLA @BIQU +start_gcode = M117 Initial homing sequence. ; Home so that the probe is positioned to heat\nG28\n\nM117 Probe heating position\nG0 X65 Y5 Z1 ; Move the probe to the heating position.\n\nM117 Getting the heaters up to temp!\nM104 S140 ; Set Extruder temperature, no wait\nM140 S[first_layer_bed_temperature] ; Set Heat Bed temperature\nM190 S[first_layer_bed_temperature] ; Wait for Heat Bed temperature\n\nM117 Waiting for probe to warm!\nG4 S90 ; Wait another 90s for the probe to absorb heat.\n\nM117 Post warming re-home\nG28 ; Home all axes again after warming\n\nM117 Z-Align\nG34\n\nM117 ABL Probing\nG29\n\nM900 K0 L0 T0 ; Edit the K and L values if you have calibrated a k factor for your filament\nM900 T0 S0\n\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X4.1 Y10 Z0.3 F5000.0 ; Move to start position\n\nM117 Getting the extruder up to temp\nM140 S[first_layer_bed_temperature] ; Set Heat Bed temperature\nM104 S{first_layer_temperature[initial_tool]} ; Set Extruder temperature\nM109 S{first_layer_temperature[initial_tool]} ; Wait for Extruder temperature\nM190 S[first_layer_bed_temperature] ; Wait for Heat Bed temperature\n\nG92 E0 ; Reset Extruder\nM117 Purging\nG1 X4.1 Y200.0 Z0.3 F1500.0 E15 ; Draw the first line\nG1 X4.4 Y200.0 Z0.3 F5000.0 ; Move to side a little\nG1 X4.4 Y20 Z0.3 F1500.0 E30 ; Draw the second line\nG92 E0 ; Reset Extruder\nM117 Printing...\nG1 X8 Y20 Z0.3 F5000.0 ; Move over to prevent blob squish +end_gcode = G91 ;Relative positioning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract a bit more and raise Z\nG1 X5 Y5 F3000 ;Wipe out\nG1 Z10 ;Raise Z by 10mm\nG90 ;Return to absolute positioning\n\nG1 X0 Y{print_bed_max[1]*0.8} ;TaDaaaa\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\n\nM84 X Y E ;Disable all steppers but Z\n + +[printer:*spriteextruder*] +retract_length = 0.6 +retract_speed = 40 +deretract_speed = 40 +retract_before_travel = 1 +retract_before_wipe = 0% + +# Intended for printers with dual extruders and a single hotend/nozzle, like the CR-X series +[printer:*dualextruder*] +single_extruder_multi_material = 1 +cooling_tube_length = 5 +cooling_tube_retraction = 91.5 +extra_loading_move = -2 +parking_pos_retraction = 92 +deretract_speed = 40,40 +extruder_colour = #FCE94F;#729FCF +extruder_offset = 0x0,0x0 +max_layer_height = 0.28,0.28 +min_layer_height = 0.08,0.08 +nozzle_diameter = 0.4,0.4 +retract_before_travel = 2,2 +retract_before_wipe = 70%,70% +retract_layer_change = 1,1 +retract_length = 5,5 +retract_length_toolchange = 1,1 +retract_lift = 0,0 +retract_lift_above = 0,0 +retract_lift_below = 0,0 +retract_restart_extra = 0,0 +retract_restart_extra_toolchange = 0,0 +retract_speed = 60,60 +wipe = 1,1 + +[printer:*SmallBowden*] +inherits = *common* +machine_max_acceleration_e = 5000 +machine_max_acceleration_extruding = 500 +machine_max_acceleration_retracting = 1000 +machine_max_acceleration_x = 500 +machine_max_acceleration_y = 500 +machine_max_acceleration_z = 100 +machine_max_feedrate_e = 60 +machine_max_feedrate_x = 500 +machine_max_feedrate_y = 500 +machine_max_feedrate_z = 10 +machine_max_jerk_e = 5 +machine_max_jerk_x = 8 +machine_max_jerk_y = 8 +machine_max_jerk_z = 0.4 +machine_min_extruding_rate = 0 +machine_min_travel_rate = 0 +retract_before_travel = 2 +retract_length = 5 +retract_speed = 60 +deretract_speed = 40 +retract_before_wipe = 70% +default_filament_profile = Generic PLA @BIQU + +[printer:*0.4nozzle*] +nozzle_diameter = 0.4 +max_layer_height = 0.32 +min_layer_height = 0.04 +printer_variant = 0.4 +default_print_profile = 0.20mm NORMAL @BIQU + +[printer:*BIQU BX*] +inherits = *common*; *spriteextruder* +bed_shape = 0x0,250x0,250x250,0x250 +max_print_height = 250 +printer_model = BIQUBX +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_BIQU\nPRINTER_MODEL_BIQUBX + +[printer:BIQU BX] +inherits = *BIQU BX*; *0.4nozzle* \ No newline at end of file diff --git a/resources/profiles/BIQU/BIQUBX_thumbnail.png b/resources/profiles/BIQU/BIQUBX_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..ee41f3c48e20cdc5971719ee68f3137668282769 GIT binary patch literal 26530 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 literal 0 HcmV?d00001 diff --git a/resources/profiles/BIQU/BX_Bed.stl b/resources/profiles/BIQU/BX_Bed.stl new file mode 100644 index 0000000000000000000000000000000000000000..0499b79bd407dc76d00f1fbb5b9c35991968aa01 GIT binary patch literal 273784 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

iQ*pUeMPstJf1men-}sF~_{&);%Ve&kT| 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 act^u2y6KaiHD`Xe-`Z~8|0L(D??+O% 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 =Xg6r#&AiCW0S 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 literal 0 HcmV?d00001 diff --git a/resources/profiles/Creality.idx b/resources/profiles/Creality.idx index 471ca8c560b..05cf6f72ae4 100644 --- a/resources/profiles/Creality.idx +++ b/resources/profiles/Creality.idx @@ -1,4 +1,10 @@ +min_slic3r_version = 2.6.0-alpha0 +0.2.7 Added Eolas Prints filaments. +0.2.6 Add Ender-5 Pro, Ender-5 S1, Sermoon-V1, Sermoon-V1 Pro. Unlock HIGHSPEED/SUPERSPEED presets for Ender-5 S1/Ender-6/Ender-7. min_slic3r_version = 2.5.0-alpha0 +0.2.4 Add SPEED presets. More conservative extruder clearance. +0.2.3 Improve start_gcode's. Object labeling. MatterHackers filament profiles. +0.2.2 General improvements. 0.2.1 Added Ender 3 Neo and Ender 3 S1 Plus. Various updates. 0.2.0 Added alternative nozzle support 0.1.5 Added Ender-3 S1 Pro diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index 82c1c0bd64a..06373afa209 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -5,7 +5,7 @@ name = Creality # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 0.2.1 +config_version = 0.2.7 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Creality/ # changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% @@ -131,6 +131,15 @@ bed_model = ender3_bed.stl bed_texture = ender3.svg default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY +[printer_model:ENDER5PRO] +name = Creality Ender-5 Pro +variants = 0.4; 0.3; 0.5; 0.6 +technology = FFF +family = ENDER +bed_model = ender3_bed.stl +bed_texture = ender3.svg +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY + [printer_model:ENDER5PLUS] name = Creality Ender-5 Plus variants = 0.4; 0.3; 0.5; 0.6 @@ -140,6 +149,15 @@ bed_model = ender5plus_bed.stl bed_texture = ender5plus.svg default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY +[printer_model:ENDER5S1] +name = Creality Ender-5 S1 +variants = 0.4; 0.3; 0.5; 0.6 +technology = FFF +family = ENDER +bed_model = ender3_bed.stl +bed_texture = ender3.svg +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY + [printer_model:ENDER6] name = Creality Ender-6 variants = 0.4; 0.3; 0.5; 0.6 @@ -385,6 +403,28 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ +[printer_model:SERMOONV1] +name = Creality Sermoon-V1 +variants = 0.4; 0.3; 0.5; 0.6 +technology = FFF +family = SERMOON +bed_model = sermoonv1_bed.stl +bed_texture = sermoonv1.svg +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY + + + +[printer_model:SERMOONV1PRO] +name = Creality Sermoon-V1 Pro +variants = 0.4; 0.3; 0.5; 0.6 +technology = FFF +family = SERMOON +bed_model = sermoonv1_bed.stl +bed_texture = sermoonv1.svg +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY + + + # All presets starting with asterisk, for example *common*, are intermediate and they will # not make it into the user interface. @@ -407,8 +447,8 @@ external_fill_pattern = rectilinear external_perimeters_first = 0 external_perimeter_speed = 25 extra_perimeters = 0 -extruder_clearance_height = 34 -extruder_clearance_radius = 47 +extruder_clearance_height = 25 +extruder_clearance_radius = 55 fill_angle = 45 fill_density = 15% fill_pattern = grid @@ -416,6 +456,7 @@ first_layer_height = 0.2 first_layer_speed = 20 gap_fill_speed = 30 gcode_comments = 0 +gcode_label_objects = 1 infill_every_layers = 1 infill_extruder = 1 infill_first = 0 @@ -480,8 +521,63 @@ wipe_tower_x = 170 wipe_tower_y = 140 xy_size_compensation = 0 +[print:*speed*] +perimeter_speed = 60 +small_perimeter_speed = 30 +external_perimeter_speed = 30 +infill_speed = 60 +solid_infill_speed = 60 +top_solid_infill_speed = 30 +support_material_speed = 40 +support_material_interface_speed = 100% +bridge_speed = 25 +ironing_speed = 15 +travel_speed = 150 +travel_speed_z = 0 +first_layer_speed = 20 +first_layer_speed_over_raft = 30 + +[print:*highspeed*] +perimeter_speed = 120 +small_perimeter_speed = 60 +external_perimeter_speed = 60 +infill_speed = 120 +solid_infill_speed = 120 +top_solid_infill_speed = 60 +support_material_speed = 80 +support_material_interface_speed = 100% +bridge_speed = 50 +ironing_speed = 30 +travel_speed = 150 +travel_speed_z = 0 +first_layer_speed = 40 +first_layer_speed_over_raft = 60 + +[print:*superspeed*] +perimeter_speed = 180 +small_perimeter_speed = 90 +external_perimeter_speed = 90 +infill_speed = 180 +solid_infill_speed = 180 +top_solid_infill_speed = 90 +support_material_speed = 120 +support_material_interface_speed = 100% +bridge_speed = 75 +ironing_speed = 45 +travel_speed = 250 +travel_speed_z = 0 +first_layer_speed = 60 +first_layer_speed_over_raft = 90 + +[print:*0.06mm*] +inherits = *common* +layer_height = 0.06 +bottom_solid_layers = 11 +top_solid_layers = 13 +bridge_flow_ratio = 0.70 + [print:*0.08mm*] inherits = *common* layer_height = 0.08 @@ -600,6 +696,16 @@ support_material_extrusion_width = 0.54 +[print:0.06 mm ULTRADETAIL (0.3 mm nozzle) @CREALITY] +inherits = *0.06mm*; *0.3nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.3 and printer_notes=~/.*PRINTER_HAS_ULTRADETAIL.*/ + +[print:0.06 mm ULTRADETAIL (0.4 mm nozzle) @CREALITY] +inherits = *0.06mm*; *0.4nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.4 and printer_notes=~/.*PRINTER_HAS_ULTRADETAIL.*/ + + + [print:0.08 mm SUPERDETAIL (0.3 mm nozzle) @CREALITY] inherits = *0.08mm*; *0.3nozzle* compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.3 @@ -676,6 +782,60 @@ compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle +[print:0.16 mm OPTIMAL SPEED (0.3 mm nozzle) @CREALITY] +inherits = *0.16mm*; *0.3nozzle*; *speed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.3 + +[print:0.16 mm OPTIMAL SPEED (0.4 mm nozzle) @CREALITY] +inherits = *0.16mm*; *0.4nozzle*; *speed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.4 + +[print:0.16 mm OPTIMAL SPEED (0.5 mm nozzle) @CREALITY] +inherits = *0.16mm*; *0.5nozzle*; *speed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 + +[print:0.16 mm OPTIMAL SPEED (0.6 mm nozzle) @CREALITY] +inherits = *0.16mm*; *0.6nozzle*; *speed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 + + + +[print:0.16 mm OPTIMAL HIGHSPEED (0.3 mm nozzle) @CREALITY] +inherits = *0.16mm*; *0.3nozzle*; *highspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.3 and printer_notes=~/.*PRINTER_HAS_HIGHSPEED.*/ + +[print:0.16 mm OPTIMAL HIGHSPEED (0.4 mm nozzle) @CREALITY] +inherits = *0.16mm*; *0.4nozzle*; *highspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.4 and printer_notes=~/.*PRINTER_HAS_HIGHSPEED.*/ + +[print:0.16 mm OPTIMAL HIGHSPEED (0.5 mm nozzle) @CREALITY] +inherits = *0.16mm*; *0.5nozzle*; *highspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 and printer_notes=~/.*PRINTER_HAS_HIGHSPEED.*/ + +[print:0.16 mm OPTIMAL HIGHSPEED (0.6 mm nozzle) @CREALITY] +inherits = *0.16mm*; *0.6nozzle*; *highspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 and printer_notes=~/.*PRINTER_HAS_HIGHSPEED.*/ + + + +[print:0.16 mm OPTIMAL SUPERSPEED (0.3 mm nozzle) @CREALITY] +inherits = *0.16mm*; *0.3nozzle*; *superspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.3 and printer_notes=~/.*PRINTER_HAS_SUPERSPEED.*/ + +[print:0.16 mm OPTIMAL SUPERSPEED (0.4 mm nozzle) @CREALITY] +inherits = *0.16mm*; *0.4nozzle*; *superspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.4 and printer_notes=~/.*PRINTER_HAS_SUPERSPEED.*/ + +[print:0.16 mm OPTIMAL SUPERSPEED (0.5 mm nozzle) @CREALITY] +inherits = *0.16mm*; *0.5nozzle*; *superspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 and printer_notes=~/.*PRINTER_HAS_SUPERSPEED.*/ + +[print:0.16 mm OPTIMAL SUPERSPEED (0.6 mm nozzle) @CREALITY] +inherits = *0.16mm*; *0.6nozzle*; *superspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 and printer_notes=~/.*PRINTER_HAS_SUPERSPEED.*/ + + + [print:0.20 mm NORMAL (0.3 mm nozzle) @CREALITY] inherits = *0.20mm*; *0.3nozzle* compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.3 @@ -695,6 +855,60 @@ compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle +[print:0.20 mm NORMAL SPEED (0.3 mm nozzle) @CREALITY] +inherits = *0.20mm*; *0.3nozzle*; *speed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.3 + +[print:0.20 mm NORMAL SPEED (0.4 mm nozzle) @CREALITY] +inherits = *0.20mm*; *0.4nozzle*; *speed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.4 + +[print:0.20 mm NORMAL SPEED (0.5 mm nozzle) @CREALITY] +inherits = *0.20mm*; *0.5nozzle*; *speed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 + +[print:0.20 mm NORMAL SPEED (0.6 mm nozzle) @CREALITY] +inherits = *0.20mm*; *0.6nozzle*; *speed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 + + + +[print:0.20 mm NORMAL HIGHSPEED (0.3 mm nozzle) @CREALITY] +inherits = *0.20mm*; *0.3nozzle*; *highspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.3 and printer_notes=~/.*PRINTER_HAS_HIGHSPEED.*/ + +[print:0.20 mm NORMAL HIGHSPEED (0.4 mm nozzle) @CREALITY] +inherits = *0.20mm*; *0.4nozzle*; *highspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.4 and printer_notes=~/.*PRINTER_HAS_HIGHSPEED.*/ + +[print:0.20 mm NORMAL HIGHSPEED (0.5 mm nozzle) @CREALITY] +inherits = *0.20mm*; *0.5nozzle*; *highspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 and printer_notes=~/.*PRINTER_HAS_HIGHSPEED.*/ + +[print:0.20 mm NORMAL HIGHSPEED (0.6 mm nozzle) @CREALITY] +inherits = *0.20mm*; *0.6nozzle*; *highspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 and printer_notes=~/.*PRINTER_HAS_HIGHSPEED.*/ + + + +[print:0.20 mm NORMAL SUPERSPEED (0.3 mm nozzle) @CREALITY] +inherits = *0.20mm*; *0.3nozzle*; *superspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.3 and printer_notes=~/.*PRINTER_HAS_SUPERSPEED.*/ + +[print:0.20 mm NORMAL SUPERSPEED (0.4 mm nozzle) @CREALITY] +inherits = *0.20mm*; *0.4nozzle*; *superspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.4 and printer_notes=~/.*PRINTER_HAS_SUPERSPEED.*/ + +[print:0.20 mm NORMAL SUPERSPEED (0.5 mm nozzle) @CREALITY] +inherits = *0.20mm*; *0.5nozzle*; *superspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 and printer_notes=~/.*PRINTER_HAS_SUPERSPEED.*/ + +[print:0.20 mm NORMAL SUPERSPEED (0.6 mm nozzle) @CREALITY] +inherits = *0.20mm*; *0.6nozzle*; *superspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 and printer_notes=~/.*PRINTER_HAS_SUPERSPEED.*/ + + + [print:0.24 mm DRAFT (0.4 mm nozzle) @CREALITY] inherits = *0.24mm*; *0.4nozzle* renamed_from = "0.24mm DRAFT @CREALITY"; "0.24mm DRAFT @ENDER3" @@ -710,6 +924,48 @@ compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle +[print:0.24 mm DRAFT SPEED (0.4 mm nozzle) @CREALITY] +inherits = *0.24mm*; *0.4nozzle*; *speed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.4 + +[print:0.24 mm DRAFT SPEED (0.5 mm nozzle) @CREALITY] +inherits = *0.24mm*; *0.5nozzle*; *speed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 + +[print:0.24 mm DRAFT SPEED (0.6 mm nozzle) @CREALITY] +inherits = *0.24mm*; *0.6nozzle*; *speed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 + + + +[print:0.24 mm DRAFT HIGHSPEED (0.4 mm nozzle) @CREALITY] +inherits = *0.24mm*; *0.4nozzle*; *highspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.4 and printer_notes=~/.*PRINTER_HAS_HIGHSPEED.*/ + +[print:0.24 mm DRAFT HIGHSPEED (0.5 mm nozzle) @CREALITY] +inherits = *0.24mm*; *0.5nozzle*; *highspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 and printer_notes=~/.*PRINTER_HAS_HIGHSPEED.*/ + +[print:0.24 mm DRAFT HIGHSPEED (0.6 mm nozzle) @CREALITY] +inherits = *0.24mm*; *0.6nozzle*; *highspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 and printer_notes=~/.*PRINTER_HAS_HIGHSPEED.*/ + + + +[print:0.24 mm DRAFT SUPERSPEED (0.4 mm nozzle) @CREALITY] +inherits = *0.24mm*; *0.4nozzle*; *superspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.4 and printer_notes=~/.*PRINTER_HAS_SUPERSPEED.*/ + +[print:0.24 mm DRAFT SUPERSPEED (0.5 mm nozzle) @CREALITY] +inherits = *0.24mm*; *0.5nozzle*; *superspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 and printer_notes=~/.*PRINTER_HAS_SUPERSPEED.*/ + +[print:0.24 mm DRAFT SUPERSPEED (0.6 mm nozzle) @CREALITY] +inherits = *0.24mm*; *0.6nozzle*; *superspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 and printer_notes=~/.*PRINTER_HAS_SUPERSPEED.*/ + + + [print:0.28 mm SUPERDRAFT (0.4 mm nozzle) @CREALITY] inherits = *0.28mm*; *0.4nozzle* renamed_from = "0.28mm SUPERDRAFT @CREALITY" @@ -725,6 +981,48 @@ compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle +[print:0.28 mm SUPERDRAFT SPEED (0.4 mm nozzle) @CREALITY] +inherits = *0.28mm*; *0.4nozzle*; *speed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.4 + +[print:0.28 mm SUPERDRAFT SPEED (0.5 mm nozzle) @CREALITY] +inherits = *0.28mm*; *0.5nozzle*; *speed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 + +[print:0.28 mm SUPERDRAFT SPEED (0.6 mm nozzle) @CREALITY] +inherits = *0.28mm*; *0.6nozzle*; *speed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 + + + +[print:0.28 mm SUPERDRAFT HIGHSPEED (0.4 mm nozzle) @CREALITY] +inherits = *0.28mm*; *0.4nozzle*; *highspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.4 and printer_notes=~/.*PRINTER_HAS_HIGHSPEED.*/ + +[print:0.28 mm SUPERDRAFT HIGHSPEED (0.5 mm nozzle) @CREALITY] +inherits = *0.28mm*; *0.5nozzle*; *highspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 and printer_notes=~/.*PRINTER_HAS_HIGHSPEED.*/ + +[print:0.28 mm SUPERDRAFT HIGHSPEED (0.6 mm nozzle) @CREALITY] +inherits = *0.28mm*; *0.6nozzle*; *highspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 and printer_notes=~/.*PRINTER_HAS_HIGHSPEED.*/ + + + +[print:0.28 mm SUPERDRAFT SUPERSPEED (0.4 mm nozzle) @CREALITY] +inherits = *0.28mm*; *0.4nozzle*; *superspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.4 and printer_notes=~/.*PRINTER_HAS_SUPERSPEED.*/ + +[print:0.28 mm SUPERDRAFT SUPERSPEED (0.5 mm nozzle) @CREALITY] +inherits = *0.28mm*; *0.5nozzle*; *superspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 and printer_notes=~/.*PRINTER_HAS_SUPERSPEED.*/ + +[print:0.28 mm SUPERDRAFT SUPERSPEED (0.6 mm nozzle) @CREALITY] +inherits = *0.28mm*; *0.6nozzle*; *superspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 and printer_notes=~/.*PRINTER_HAS_SUPERSPEED.*/ + + + [print:0.36 mm CHUNKY (0.5 mm nozzle) @CREALITY] inherits = *0.36mm*; *0.5nozzle* compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 @@ -735,12 +1033,60 @@ compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle +[print:0.36 mm CHUNKY SPEED (0.5 mm nozzle) @CREALITY] +inherits = *0.36mm*; *0.5nozzle*; *speed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 + +[print:0.36 mm CHUNKY SPEED (0.6 mm nozzle) @CREALITY] +inherits = *0.36mm*; *0.6nozzle*; *speed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 + + + +[print:0.36 mm CHUNKY HIGHSPEED (0.5 mm nozzle) @CREALITY] +inherits = *0.36mm*; *0.5nozzle*; *highspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 and printer_notes=~/.*PRINTER_HAS_HIGHSPEED.*/ + +[print:0.36 mm CHUNKY HIGHSPEED (0.6 mm nozzle) @CREALITY] +inherits = *0.36mm*; *0.6nozzle*; *highspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 and printer_notes=~/.*PRINTER_HAS_HIGHSPEED.*/ + + + +[print:0.36 mm CHUNKY SUPERSPEED (0.5 mm nozzle) @CREALITY] +inherits = *0.36mm*; *0.5nozzle*; *superspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 and printer_notes=~/.*PRINTER_HAS_SUPERSPEED.*/ + +[print:0.36 mm CHUNKY SUPERSPEED (0.6 mm nozzle) @CREALITY] +inherits = *0.36mm*; *0.6nozzle*; *superspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 and printer_notes=~/.*PRINTER_HAS_SUPERSPEED.*/ + + + [print:0.44 mm SUPERCHUNKY (0.6 mm nozzle) @CREALITY] inherits = *0.44mm*; *0.6nozzle* compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 +[print:0.44 mm SUPERCHUNKY SPEED (0.6 mm nozzle) @CREALITY] +inherits = *0.44mm*; *0.6nozzle*; *speed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 + + + +[print:0.44 mm SUPERCHUNKY HIGHSPEED (0.6 mm nozzle) @CREALITY] +inherits = *0.44mm*; *0.6nozzle*; *highspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 and printer_notes=~/.*PRINTER_HAS_HIGHSPEED.*/ + + + +[print:0.44 mm SUPERCHUNKY SUPERSPEED (0.6 mm nozzle) @CREALITY] +inherits = *0.44mm*; *0.6nozzle*; *superspeed* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 and printer_notes=~/.*PRINTER_HAS_SUPERSPEED.*/ + + + # When submitting new filaments please print the following temperature tower at 0.1mm layer height: # https://www.thingiverse.com/thing:2615842 # Pay particular attention to bridging, overhangs and retractions. @@ -821,6 +1167,26 @@ bridge_fan_speed = 30 top_fan_speed = 0 temperature = 245 +[filament:*TPU*] +inherits = *common* +bed_temperature = 50 +cooling = 0 +disable_fan_first_layers = 3 +fan_below_layer_time = 20 +filament_colour = #DDDDDD +filament_max_volumetric_speed = 11 +filament_type = TPU +filament_density = 1.2 +filament_cost = 30 +first_layer_bed_temperature = 55 +first_layer_temperature = 245 +fan_always_on = 0 +max_fan_speed = 0 +min_fan_speed = 0 +bridge_fan_speed = 30 +top_fan_speed = 0 +temperature = 245 + [filament:Generic PLA @CREALITY] inherits = *PLA* renamed_from = "Generic PLA @ENDER3" @@ -1085,11 +1451,125 @@ bed_temperature = 60 first_layer_temperature = 205 first_layer_bed_temperature = 60 filament_cost = 26.99 -filament_density = 1.36 +filament_density = 1.37 filament_colour = #FF4640 filament_spool_weight = 180 +[filament:VOXELPLA PLA Plus @CREALITY] +inherits = *PLA* +filament_vendor = VOXELPLA +temperature = 200 +bed_temperature = 60 +first_layer_temperature = 200 +first_layer_bed_temperature = 60 +filament_cost = 16.99 +filament_density = 1.24 +filament_colour = #2862C4 + +[filament:MatterHackers MH Build Series PLA @CREALITY] +inherits = *PLA* +filament_vendor = MatterHackers +temperature = 205 +bed_temperature = 60 +first_layer_temperature = 210 +first_layer_bed_temperature = 60 +filament_cost = 20.87 +filament_density = 1.25 +filament_colour = #3598DB + +[filament:MatterHackers MH Build Series PETG @CREALITY] +inherits = *PET* +filament_vendor = MatterHackers +temperature = 245 +bed_temperature = 60 +first_layer_temperature = 250 +first_layer_bed_temperature = 65 +filament_cost = 21.98 +filament_density = 1.27 +filament_colour = #3598DB + +[filament:MatterHackers MH Build Series ABS @CREALITY] +inherits = *ABS* +filament_vendor = MatterHackers +temperature = 230 +bed_temperature = 90 +first_layer_temperature = 240 +first_layer_bed_temperature = 100 +filament_cost = 20.87 +filament_density = 1.07 +filament_colour = #3598DB + +[filament:MatterHackers MH Build Series TPU @CREALITY] +inherits = *TPU* +filament_vendor = MatterHackers +temperature = 240 +bed_temperature = 50 +first_layer_temperature = 250 +first_layer_bed_temperature = 60 +filament_cost = 28.99 +filament_density = 1.12 +filament_colour = #3598DB + +[filament:Eolas Prints PLA @CREALITY] +inherits = *PLA* +filament_vendor = Eolas Prints +filament_cost = 23.50 +filament_density = 1.24 +filament_spool_weight = 0 +filament_colour = #4D9398 +first_layer_bed_temperature = 65 +first_layer_temperature = 208 +temperature = 202 + +[filament:Eolas Prints PLA Matte @CREALITY] +inherits = Eolas Prints PLA @CREALITY +filament_cost = 25.50 +filament_max_volumetric_speed = 14 +temperature = 210 + +[filament:Eolas Prints INGEO 850 @CREALITY] +inherits = Eolas Prints PLA @CREALITY +filament_cost = 25.90 +temperature = 210 + +[filament:Eolas Prints INGEO 870 @CREALITY] +inherits = Eolas Prints PLA @CREALITY +filament_cost = 25.90 +temperature = 215 +first_layer_bed_temperature = 68 +first_layer_temperature = 220 +bed_temperature = 65 +[filament:Eolas Prints PETG @CREALITY] +inherits = *PET* +filament_vendor = Eolas Prints +filament_cost = 29.90 +filament_density = 1.27 +filament_spool_weight = 0 +filament_colour = #4D9398 +temperature = 240 +first_layer_bed_temperature = 85 +first_layer_temperature = 235 +bed_temperature = 90 + +[filament:Eolas Prints PETG - UV Resistant @CREALITY] +inherits = Eolas Prints PETG @CREALITY +filament_cost = 35.90 +temperature = 242 +first_layer_temperature = 237 + +[filament:Eolas Prints TPU 93A @CREALITY] +inherits = *TPU* +filament_vendor = Eolas Prints +filament_cost = 34.99 +filament_density = 1.21 +filament_colour = #4D9398 +filament_max_volumetric_speed = 1.2 +temperature = 235 +first_layer_bed_temperature = 30 +bed_temperature = 30 +filament_retract_length = 0 +extrusion_multiplier = 1.16 # Common printer preset [printer:*common*] @@ -1106,6 +1586,7 @@ remaining_times = 0 machine_max_acceleration_e = 5000 machine_max_acceleration_extruding = 500 machine_max_acceleration_retracting = 1000 +machine_max_acceleration_travel = 500 machine_max_acceleration_x = 500 machine_max_acceleration_y = 500 machine_max_acceleration_z = 100 @@ -1119,6 +1600,7 @@ machine_max_jerk_y = 8 machine_max_jerk_z = 0.4 machine_min_extruding_rate = 0 machine_min_travel_rate = 0 +machine_limits_usage = emit_to_gcode layer_gcode = ;AFTER_LAYER_CHANGE\n;{layer_z} max_print_height = 250 printer_notes = @@ -1143,20 +1625,28 @@ wipe = 1 z_offset = 0 printer_model = default_filament_profile = "Generic PLA @CREALITY" -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM140 S{first_layer_bed_temperature[0]} ; set final bed temp\nM104 S150 ; set temporary nozzle temp to prevent oozing during homing\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S{first_layer_temperature[0]} ; set final nozzle temp\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp to stabilize\nM109 S{first_layer_temperature[0]} ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0 -end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+70, max_print_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < max_print_height*0.6}G1 Z{max_print_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S150 ; set temporary nozzle temp to prevent oozing during homing\nM140 S{first_layer_bed_temperature[0]} ; set final bed temp\nG4 S30 ; allow partial nozzle warmup\nG28 ; home all axis\nG1 Z50 F240\nG1 X2.0 Y10 F3000\nM104 S{first_layer_temperature[0]} ; set final nozzle temp\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp to stabilize\nM109 S{first_layer_temperature[0]} ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 X2.0 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 Y140 F5000\nG92 E0\nG1 X2.3 Y10 E10 F1200 ; prime the nozzle\nG92 E0 +end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.85} F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+70, max_print_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < max_print_height*0.6}G1 Z{max_print_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors + +# Intended for printers that have exclusively shipped with a 32bit mainboard +[printer:*32bitmainboard*] +gcode_flavor = marlin2 # Intended for printers equipped with a strain gauge mechanism, like the CR-6 series [printer:*straingauge*] -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM140 S{first_layer_bed_temperature[0]} ; set final bed temp\nM109 S{first_layer_temperature[0]-50} ; set temporary nozzle temp to prevent oozing during homing\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp to stabilize\nG28 ; home all axis\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S{first_layer_temperature[0]} ; set final nozzle temp\nM109 S{first_layer_temperature[0]} ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0 +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM109 S{first_layer_temperature[0]-50} ; set temporary nozzle temp to prevent oozing during homing\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp to stabilize\nM140 S{first_layer_bed_temperature[0]} ; set final bed temp\nG28 ; home all axis\nG1 Z50 F240\nG1 X2.0 Y10 F3000\nM104 S{first_layer_temperature[0]} ; set final nozzle temp\nM109 S{first_layer_temperature[0]} ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 X2.0 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 Y140 F5000\nG92 E0\nG1 X2.3 Y10 E10 F1200 ; prime the nozzle\nG92 E0 # Intended for printers with a smaller bed, like the Ender-3 series [printer:*fastabl*] -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM140 S{first_layer_bed_temperature[0]} ; set final bed temp\nM104 S150 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S{first_layer_temperature[0]} ; set final nozzle temp\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp to stabilize\nM109 S{first_layer_temperature[0]} ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0 +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S150 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S{first_layer_bed_temperature[0]} ; set final bed temp\nG4 S30 ; allow partial nozzle warmup\nG28 ; home all axis\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2.0 Y10 F3000\nM104 S{first_layer_temperature[0]} ; set final nozzle temp\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp to stabilize\nM109 S{first_layer_temperature[0]} ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 X2.0 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 Y140 F5000\nG92 E0\nG1 X2.3 Y10 E10 F1200 ; prime the nozzle\nG92 E0 # Intended for printers with a larger bed, like the CR-10 series [printer:*slowabl*] -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM140 S{first_layer_bed_temperature[0]} ; set final bed temp\nM104 S150 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp to stabilize\nG28 ; home all axis\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S{first_layer_temperature[0]} ; set final nozzle temp\nM109 S{first_layer_temperature[0]} ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0 +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S150 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S{first_layer_bed_temperature[0]} ; set final bed temp\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp to stabilize\nG28 ; home all axis\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2.0 Y10 F3000\nM104 S{first_layer_temperature[0]} ; set final nozzle temp\nM109 S{first_layer_temperature[0]} ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 X2.0 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 Y140 F5000\nG92 E0\nG1 X2.3 Y10 E10 F1200 ; prime the nozzle\nG92 E0 + +# intended for printers that have RESTORE_LEVELING_AFTER_G28 enabled in firmware +[printer:*storedabl*] +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S150 ; set temporary nozzle temp to prevent oozing during homing\nM140 S{first_layer_bed_temperature[0]} ; set final bed temp\nG4 S30 ; allow partial nozzle warmup\nG28 ; home all axis and restore leveling\nG1 Z50 F240\nG1 X2.0 Y10 F3000\nM104 S{first_layer_temperature[0]} ; set final nozzle temp\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp to stabilize\nM109 S{first_layer_temperature[0]} ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 X2.0 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 Y140 F5000\nG92 E0\nG1 X2.3 Y10 E10 F1200 ; prime the nozzle\nG92 E0 # Intended for printers with vendor official firmware verified to support M25 [printer:*pauseprint*] @@ -1166,16 +1656,31 @@ pause_print_gcode = M25 ; pause print [printer:*descendingz*] end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print bed down\nG1 X50 Y50 F{travel_speed*60} ; move print head out of the way\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+max_print_height-10} F600{endif} ; Move print bed close to the bottom\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors +# Intended for printers with a much larger bed, like the CR-10 S4/S5 series +[printer:*largebedinertia*] +machine_max_acceleration_x = 300 +machine_max_acceleration_y = 300 +machine_max_feedrate_x = 300 +machine_max_feedrate_y = 300 + [printer:*bowdencapricorn*] +#max_volumetric_extrusion_rate_slope_negative = 7 +retract_length = 4 + +[printer:*bowdenshort*] +#max_volumetric_extrusion_rate_slope_negative = 7 retract_length = 4 [printer:*bowden*] +#max_volumetric_extrusion_rate_slope_negative = 6 retract_length = 5 [printer:*bowdenlong*] +#max_volumetric_extrusion_rate_slope_negative = 5 retract_length = 6 [printer:*bowdenallmetalhotend*] +#max_volumetric_extrusion_rate_slope_negative = 6 retract_length = 3 [printer:*directdriveextruder*] @@ -1193,7 +1698,7 @@ retract_before_wipe = 0% [printer:*0.3nozzle*] nozzle_diameter = 0.3 printer_variant = 0.3 -min_layer_height = 0.08 +min_layer_height = 0.06 max_layer_height = 0.24 retract_lift_above = 0.2 default_print_profile = "0.12 mm DETAIL (0.3 mm nozzle) @CREALITY" @@ -1201,7 +1706,7 @@ default_print_profile = "0.12 mm DETAIL (0.3 mm nozzle) @CREALITY" [printer:*0.4nozzle*] nozzle_diameter = 0.4 printer_variant = 0.4 -min_layer_height = 0.08 +min_layer_height = 0.06 max_layer_height = 0.32 retract_lift_above = 0.2 default_print_profile = "0.16 mm OPTIMAL (0.4 mm nozzle) @CREALITY" @@ -1247,8 +1752,11 @@ inherits = *ENDER3*; *0.6nozzle* [printer:*ENDER3BLTOUCH*] -inherits = *ENDER3*; *fastabl* +inherits = *common*; *bowden*; *fastabl* +bed_shape = 3x3,228x3,228x228,3x228 +max_print_height = 250 printer_model = ENDER3BLTOUCH +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER3BLTOUCH\nPRINTER_HAS_BOWDEN [printer:Creality Ender-3 BLTouch (0.3 mm nozzle)] inherits = *ENDER3BLTOUCH*; *0.3nozzle* @@ -1267,7 +1775,9 @@ inherits = *ENDER3BLTOUCH*; *0.6nozzle* [printer:*ENDER3PRO*] -inherits = *ENDER3*; *pauseprint* +inherits = *common*; *bowden*; *pauseprint* +bed_shape = 3x3,228x3,228x228,3x228 +max_print_height = 250 printer_model = ENDER3PRO printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER3PRO\nPRINTER_HAS_BOWDEN @@ -1276,7 +1786,7 @@ inherits = *ENDER3PRO*; *0.3nozzle* [printer:Creality Ender-3 Pro (0.4 mm nozzle)] inherits = *ENDER3PRO*; *0.4nozzle* -renamed_From = "Creality Ender-3 Pro" +renamed_from = "Creality Ender-3 Pro" [printer:Creality Ender-3 Pro (0.5 mm nozzle)] inherits = *ENDER3PRO*; *0.5nozzle* @@ -1287,7 +1797,9 @@ inherits = *ENDER3PRO*; *0.6nozzle* [printer:*ENDER3NEO*] -inherits = *ENDER3*; *fastabl* +inherits = *common*; *bowden*; *fastabl*; *32bitmainboard* +bed_shape = 3x3,228x3,228x228,3x228 +max_print_height = 250 printer_model = ENDER3NEO printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER3NEO\nPRINTER_HAS_BOWDEN @@ -1317,7 +1829,7 @@ inherits = *ENDER3V2*; *0.3nozzle* [printer:Creality Ender-3 V2 (0.4 mm nozzle)] inherits = *ENDER3V2*; *0.4nozzle* -renamed_From = "Creality Ender-3 V2"; "Creality Ender-3V2" +renamed_from = "Creality Ender-3 V2"; "Creality Ender-3V2" [printer:Creality Ender-3 V2 (0.5 mm nozzle)] inherits = *ENDER3V2*; *0.5nozzle* @@ -1328,7 +1840,7 @@ inherits = *ENDER3V2*; *0.6nozzle* [printer:*ENDER3V2NEO*] -inherits = *common*; *bowden*; *fastabl* +inherits = *common*; *bowden*; *fastabl*; *32bitmainboard* bed_shape = 5x0,215x0,215x220,5x220 max_print_height = 250 printer_model = ENDER3V2NEO @@ -1349,18 +1861,18 @@ inherits = *ENDER3V2NEO*; *0.6nozzle* [printer:*ENDER3S1*] -inherits = *common*; *fastabl*; *spriteextruder*; *pauseprint* +inherits = *common*; *storedabl*; *spriteextruder*; *pauseprint* bed_shape = 5x0,215x0,215x220,5x220 max_print_height = 270 printer_model = ENDER3S1 -printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER3S1 +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER3S1\nPRINTER_HAS_ULTRADETAIL [printer:Creality Ender-3 S1 (0.3 mm nozzle)] inherits = *ENDER3S1*; *0.3nozzle* [printer:Creality Ender-3 S1 (0.4 mm nozzle)] inherits = *ENDER3S1*; *0.4nozzle* -renamed_From = "Creality Ender-3 S1" +renamed_from = "Creality Ender-3 S1" [printer:Creality Ender-3 S1 (0.5 mm nozzle)] inherits = *ENDER3S1*; *0.5nozzle* @@ -1371,18 +1883,18 @@ inherits = *ENDER3S1*; *0.6nozzle* [printer:*ENDER3S1PRO*] -inherits = *common*; *fastabl*; *spriteextruder*; *pauseprint* +inherits = *common*; *storedabl*; *spriteextruder*; *pauseprint* bed_shape = 5x0,215x0,215x220,5x220 max_print_height = 270 printer_model = ENDER3S1PRO -printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER3S1PRO +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER3S1PRO\nPRINTER_HAS_ULTRADETAIL [printer:Creality Ender-3 S1 Pro (0.3 mm nozzle)] inherits = *ENDER3S1PRO*; *0.3nozzle* [printer:Creality Ender-3 S1 Pro (0.4 mm nozzle)] inherits = *ENDER3S1PRO*; *0.4nozzle* -renamed_From = "Creality Ender-3 S1 Pro" +renamed_from = "Creality Ender-3 S1 Pro" [printer:Creality Ender-3 S1 Pro (0.5 mm nozzle)] inherits = *ENDER3S1PRO*; *0.5nozzle* @@ -1393,11 +1905,11 @@ inherits = *ENDER3S1PRO*; *0.6nozzle* [printer:*ENDER3S1PLUS*] -inherits = *common*; *slowabl*; *spriteextruder*; *pauseprint* +inherits = *common*; *storedabl*; *spriteextruder*; *pauseprint* bed_shape = 5x5,295x5,295x295,5x295 max_print_height = 300 printer_model = ENDER3S1PLUS -printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER3S1PLUS +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER3S1PLUS\nPRINTER_HAS_ULTRADETAIL [printer:Creality Ender-3 S1 Plus (0.3 mm nozzle)] inherits = *ENDER3S1PLUS*; *0.3nozzle* @@ -1425,7 +1937,7 @@ inherits = *ENDER3MAX*; *0.3nozzle* [printer:Creality Ender-3 Max (0.4 mm nozzle)] inherits = *ENDER3MAX*; *0.4nozzle* -renamed_From = "Creality Ender-3 Max" +renamed_from = "Creality Ender-3 Max" [printer:Creality Ender-3 Max (0.5 mm nozzle)] inherits = *ENDER3MAX*; *0.5nozzle* @@ -1436,7 +1948,7 @@ inherits = *ENDER3MAX*; *0.6nozzle* [printer:*ENDER3MAXNEO*] -inherits = *common*; *bowdenlong*; *slowabl* +inherits = *common*; *bowdenlong*; *slowabl*; *32bitmainboard* bed_shape = 5x5,295x5,295x295,5x295 max_print_height = 320 printer_model = ENDER3MAXNEO @@ -1468,7 +1980,7 @@ inherits = *ENDER4*; *0.3nozzle* [printer:Creality Ender-4 (0.4 mm nozzle)] inherits = *ENDER4*; *0.4nozzle* -renamed_From = "Creality Ender-4" +renamed_from = "Creality Ender-4" [printer:Creality Ender-4 (0.5 mm nozzle)] inherits = *ENDER4*; *0.5nozzle* @@ -1492,7 +2004,7 @@ inherits = *ENDER5*; *0.3nozzle* [printer:Creality Ender-5 (0.4 mm nozzle)] inherits = *ENDER5*; *0.4nozzle* -renamed_From = "Creality Ender-5" +renamed_from = "Creality Ender-5" [printer:Creality Ender-5 (0.5 mm nozzle)] inherits = *ENDER5*; *0.5nozzle* @@ -1502,6 +2014,29 @@ inherits = *ENDER5*; *0.6nozzle* +[printer:*ENDER5PRO*] +inherits = *common*; *bowdencapricorn*; *descendingz* +bed_shape = 5x2.5,225x2.5,225x222.5,5x222.5 +max_print_height = 300 +printer_model = ENDER5PRO +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER5PRO\nPRINTER_HAS_BOWDEN +machine_max_acceleration_e = 1000 +machine_max_feedrate_z = 5 + +[printer:Creality Ender-5 Pro (0.3 mm nozzle)] +inherits = *ENDER5PRO*; *0.3nozzle* + +[printer:Creality Ender-5 Pro (0.4 mm nozzle)] +inherits = *ENDER5PRO*; *0.4nozzle* + +[printer:Creality Ender-5 Pro (0.5 mm nozzle)] +inherits = *ENDER5PRO*; *0.5nozzle* + +[printer:Creality Ender-5 Pro (0.6 mm nozzle)] +inherits = *ENDER5PRO*; *0.6nozzle* + + + [printer:*ENDER5PLUS*] inherits = *common*; *bowdenlong*; *slowabl*; *descendingz* bed_shape = 5x5,355x5,355x355,5x355 @@ -1518,7 +2053,7 @@ inherits = *ENDER5PLUS*; *0.3nozzle* [printer:Creality Ender-5 Plus (0.4 mm nozzle)] inherits = *ENDER5PLUS*; *0.4nozzle* -renamed_From = "Creality Ender-5 Plus" +renamed_from = "Creality Ender-5 Plus" [printer:Creality Ender-5 Plus (0.5 mm nozzle)] inherits = *ENDER5PLUS*; *0.5nozzle* @@ -1528,19 +2063,40 @@ inherits = *ENDER5PLUS*; *0.6nozzle* +[printer:*ENDER5S1*] +inherits = *common*; *descendingz*; *spriteextruder* +bed_shape = 5x0,215x0,215x220,5x220 +max_print_height = 280 +printer_model = ENDER5S1 +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER5S1\nPRINTER_HAS_ULTRADETAIL\nPRINTER_HAS_HIGHSPEED\nPRINTER_HAS_SUPERSPEED + +[printer:Creality Ender-5 S1 (0.3 mm nozzle)] +inherits = *ENDER5S1*; *0.3nozzle* + +[printer:Creality Ender-5 S1 (0.4 mm nozzle)] +inherits = *ENDER5S1*; *0.4nozzle* + +[printer:Creality Ender-5 S1 (0.5 mm nozzle)] +inherits = *ENDER5S1*; *0.5nozzle* + +[printer:Creality Ender-5 S1 (0.6 mm nozzle)] +inherits = *ENDER5S1*; *0.6nozzle* + + + [printer:*ENDER6*] inherits = *common*; *bowden*; *descendingz* bed_shape = 5x5,255x5,255x255,5x255 max_print_height = 400 printer_model = ENDER6 -printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER6\nPRINTER_HAS_BOWDEN +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER6\nPRINTER_HAS_BOWDEN\nPRINTER_HAS_HIGHSPEED [printer:Creality Ender-6 (0.3 mm nozzle)] inherits = *ENDER6*; *0.3nozzle* [printer:Creality Ender-6 (0.4 mm nozzle)] inherits = *ENDER6*; *0.4nozzle* -renamed_From = "Creality Ender-6" +renamed_from = "Creality Ender-6" [printer:Creality Ender-6 (0.5 mm nozzle)] inherits = *ENDER6*; *0.5nozzle* @@ -1555,14 +2111,14 @@ inherits = *common*; *bowden*; *descendingz* bed_shape = 5x5,245x5,245x245,5x245 max_print_height = 300 printer_model = ENDER7 -printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER7\nPRINTER_HAS_BOWDEN +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER7\nPRINTER_HAS_BOWDEN\nPRINTER_HAS_HIGHSPEED\nPRINTER_HAS_SUPERSPEED [printer:Creality Ender-7 (0.3 mm nozzle)] inherits = *ENDER7*; *0.3nozzle* [printer:Creality Ender-7 (0.4 mm nozzle)] inherits = *ENDER7*; *0.4nozzle* -renamed_From = "Creality Ender-7" +renamed_from = "Creality Ender-7" [printer:Creality Ender-7 (0.5 mm nozzle)] inherits = *ENDER7*; *0.5nozzle* @@ -1573,7 +2129,7 @@ inherits = *ENDER7*; *0.6nozzle* [printer:*ENDER2*] -inherits = *common*; *bowden* +inherits = *common*; *bowdenshort* bed_shape = 0x0,150x0,150x150,0x150 max_print_height = 200 printer_model = ENDER2 @@ -1584,7 +2140,7 @@ inherits = *ENDER2*; *0.3nozzle* [printer:Creality Ender-2 (0.4 mm nozzle)] inherits = *ENDER2*; *0.4nozzle* -renamed_From = "Creality Ender-2"; "Creality ENDER-2" +renamed_from = "Creality Ender-2"; "Creality ENDER-2" [printer:Creality Ender-2 (0.5 mm nozzle)] inherits = *ENDER2*; *0.5nozzle* @@ -1595,7 +2151,7 @@ inherits = *ENDER2*; *0.6nozzle* [printer:*ENDER2PRO*] -inherits = *common*; *bowden* +inherits = *common*; *bowdenshort* bed_shape = 2.5x2.5,160x2.5,160x160,2.5x160 max_print_height = 180 printer_model = ENDER2PRO @@ -1606,7 +2162,7 @@ inherits = *ENDER2PRO*; *0.3nozzle* [printer:Creality Ender-2 Pro (0.4 mm nozzle)] inherits = *ENDER2PRO*; *0.4nozzle* -renamed_From = "Creality Ender-2 Pro"; "Creality ENDER-2 Pro" +renamed_from = "Creality Ender-2 Pro"; "Creality ENDER-2 Pro" [printer:Creality Ender-2 Pro (0.5 mm nozzle)] inherits = *ENDER2PRO*; *0.5nozzle* @@ -1628,7 +2184,7 @@ inherits = *CR5PRO*; *0.3nozzle* [printer:Creality CR-5 Pro (0.4 mm nozzle)] inherits = *CR5PRO*; *0.4nozzle* -renamed_From = "Creality CR-5 Pro" +renamed_from = "Creality CR-5 Pro" [printer:Creality CR-5 Pro (0.5 mm nozzle)] inherits = *CR5PRO*; *0.5nozzle* @@ -1650,7 +2206,7 @@ inherits = *CR5PROH*; *0.3nozzle* [printer:Creality CR-5 Pro H (0.4 mm nozzle)] inherits = *CR5PROH*; *0.4nozzle* -renamed_From = "Creality CR-5 Pro H" +renamed_from = "Creality CR-5 Pro H" [printer:Creality CR-5 Pro H (0.5 mm nozzle)] inherits = *CR5PROH*; *0.5nozzle* @@ -1671,7 +2227,7 @@ inherits = *CR6SE*; *0.3nozzle* [printer:Creality CR-6 SE (0.4 mm nozzle)] inherits = *CR6SE*; *0.4nozzle* -renamed_From = "Creality CR-6 SE" +renamed_from = "Creality CR-6 SE" [printer:Creality CR-6 SE (0.5 mm nozzle)] inherits = *CR6SE*; *0.5nozzle* @@ -1693,7 +2249,7 @@ inherits = *CR6MAX*; *0.3nozzle* [printer:Creality CR-6 Max (0.4 mm nozzle)] inherits = *CR6MAX*; *0.4nozzle* -renamed_From = "Creality CR-6 Max" +renamed_from = "Creality CR-6 Max" [printer:Creality CR-6 Max (0.5 mm nozzle)] inherits = *CR6MAX*; *0.5nozzle* @@ -1715,7 +2271,7 @@ inherits = *CR10SMART*; *0.3nozzle* [printer:Creality CR-10 SMART (0.4 mm nozzle)] inherits = *CR10SMART*; *0.4nozzle* -renamed_From = "Creality CR-10 SMART" +renamed_from = "Creality CR-10 SMART" [printer:Creality CR-10 SMART (0.5 mm nozzle)] inherits = *CR10SMART*; *0.5nozzle* @@ -1730,7 +2286,7 @@ inherits = *common*; *slowabl*; *spriteextruder* bed_shape = 5x5,295x5,295x295,5x295 max_print_height = 400 printer_model = CR10SMARTPRO -printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_CR10SMARTPRO\nPRINTER_HAS_BOWDEN +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_CR10SMARTPRO\nPRINTER_HAS_ULTRADETAIL [printer:Creality CR-10 SMART Pro (0.3 mm nozzle)] inherits = *CR10SMARTPRO*; *0.3nozzle* @@ -1758,7 +2314,7 @@ inherits = *CR10MINI*; *0.3nozzle* [printer:Creality CR-10 Mini (0.4 mm nozzle)] inherits = *CR10MINI*; *0.4nozzle* -renamed_From = "Creality CR-10 Mini" +renamed_from = "Creality CR-10 Mini" [printer:Creality CR-10 Mini (0.5 mm nozzle)] inherits = *CR10MINI*; *0.5nozzle* @@ -1780,7 +2336,7 @@ inherits = *CR10MAX*; *0.3nozzle* [printer:Creality CR-10 Max (0.4 mm nozzle)] inherits = *CR10MAX*; *0.4nozzle* -renamed_From = "Creality CR-10 Max" +renamed_from = "Creality CR-10 Max" [printer:Creality CR-10 Max (0.5 mm nozzle)] inherits = *CR10MAX*; *0.5nozzle* @@ -1802,7 +2358,7 @@ inherits = *CR10*; *0.3nozzle* [printer:Creality CR-10 (0.4 mm nozzle)] inherits = *CR10*; *0.4nozzle* -renamed_From = "Creality CR-10" +renamed_from = "Creality CR-10" [printer:Creality CR-10 (0.5 mm nozzle)] inherits = *CR10*; *0.5nozzle* @@ -1824,7 +2380,7 @@ inherits = *CR10V2*; *0.3nozzle* [printer:Creality CR-10 V2 (0.4 mm nozzle)] inherits = *CR10V2*; *0.4nozzle* -renamed_From = "Creality CR-10 V2" +renamed_from = "Creality CR-10 V2" [printer:Creality CR-10 V2 (0.5 mm nozzle)] inherits = *CR10V2*; *0.5nozzle* @@ -1846,7 +2402,7 @@ inherits = *CR10V3*; *0.3nozzle* [printer:Creality CR-10 V3 (0.4 mm nozzle)] inherits = *CR10V3*; *0.4nozzle* -renamed_From = "Creality CR-10 V3" +renamed_from = "Creality CR-10 V3" [printer:Creality CR-10 V3 (0.5 mm nozzle)] inherits = *CR10V3*; *0.5nozzle* @@ -1868,7 +2424,7 @@ inherits = *CR10S*; *0.3nozzle* [printer:Creality CR-10 S (0.4 mm nozzle)] inherits = *CR10S*; *0.4nozzle* -renamed_From = "Creality CR-10 S" +renamed_from = "Creality CR-10 S" [printer:Creality CR-10 S (0.5 mm nozzle)] inherits = *CR10S*; *0.5nozzle* @@ -1890,7 +2446,7 @@ inherits = *CR10SPRO*; *0.3nozzle* [printer:Creality CR-10 S Pro (0.4 mm nozzle)] inherits = *CR10SPRO*; *0.4nozzle* -renamed_From = "Creality CR-10 S Pro" +renamed_from = "Creality CR-10 S Pro" [printer:Creality CR-10 S Pro (0.5 mm nozzle)] inherits = *CR10SPRO*; *0.5nozzle* @@ -1912,7 +2468,7 @@ inherits = *CR10SPROV2*; *0.3nozzle* [printer:Creality CR-10 S Pro V2 (0.4 mm nozzle)] inherits = *CR10SPROV2*; *0.4nozzle* -renamed_From = "Creality CR-10 S Pro V2" +renamed_from = "Creality CR-10 S Pro V2" [printer:Creality CR-10 S Pro V2 (0.5 mm nozzle)] inherits = *CR10SPROV2*; *0.5nozzle* @@ -1923,7 +2479,7 @@ inherits = *CR10SPROV2*; *0.6nozzle* [printer:*CR10S4*] -inherits = *common*; *bowdenlong* +inherits = *common*; *bowdenlong*; *largebedinertia* bed_shape = 5x5,395x5,395x395,5x395 max_print_height = 400 printer_model = CR10S4 @@ -1934,7 +2490,7 @@ inherits = *CR10S4*; *0.3nozzle* [printer:Creality CR-10 S4 (0.4 mm nozzle)] inherits = *CR10S4*; *0.4nozzle* -renamed_From = "Creality CR-10 S4" +renamed_from = "Creality CR-10 S4" [printer:Creality CR-10 S4 (0.5 mm nozzle)] inherits = *CR10S4*; *0.5nozzle* @@ -1945,7 +2501,7 @@ inherits = *CR10S4*; *0.6nozzle* [printer:*CR10S5*] -inherits = *common*; *bowdenlong* +inherits = *common*; *bowdenlong*; *largebedinertia* bed_shape = 5x5,505x5,505x505,5x505 max_print_height = 500 printer_model = CR10S5 @@ -1956,7 +2512,7 @@ inherits = *CR10S5*; *0.3nozzle* [printer:Creality CR-10 S5 (0.4 mm nozzle)] inherits = *CR10S5*; *0.4nozzle* -renamed_From = "Creality CR-10 S5" +renamed_from = "Creality CR-10 S5" [printer:Creality CR-10 S5 (0.5 mm nozzle)] inherits = *CR10S5*; *0.5nozzle* @@ -1976,7 +2532,7 @@ inherits = *CR20*; *0.3nozzle* [printer:Creality CR-20 (0.4 mm nozzle)] inherits = *CR20*; *0.4nozzle* -renamed_From = "Creality CR-20" +renamed_from = "Creality CR-20" [printer:Creality CR-20 (0.5 mm nozzle)] inherits = *CR20*; *0.5nozzle* @@ -1996,7 +2552,7 @@ inherits = *CR20PRO*; *0.3nozzle* [printer:Creality CR-20 Pro (0.4 mm nozzle)] inherits = *CR20PRO*; *0.4nozzle* -renamed_From = "Creality CR-20 Pro" +renamed_from = "Creality CR-20 Pro" [printer:Creality CR-20 Pro (0.5 mm nozzle)] inherits = *CR20PRO*; *0.5nozzle* @@ -2018,7 +2574,7 @@ inherits = *CR200B*; *0.3nozzle* [printer:Creality CR-200B (0.4 mm nozzle)] inherits = *CR200B*; *0.4nozzle* -renamed_From = "Creality CR-200B" +renamed_from = "Creality CR-200B" [printer:Creality CR-200B (0.5 mm nozzle)] inherits = *CR200B*; *0.5nozzle* @@ -2040,7 +2596,7 @@ inherits = *CR8*; *0.3nozzle* [printer:Creality CR-8 (0.4 mm nozzle)] inherits = *CR8*; *0.4nozzle* -renamed_From = "Creality CR-8" +renamed_from = "Creality CR-8" [printer:Creality CR-8 (0.5 mm nozzle)] inherits = *CR8*; *0.5nozzle* @@ -2055,17 +2611,59 @@ inherits = *common*; *directdriveextruder*; *descendingz* bed_shape = 5x5,275x5,275x255,5x255 max_print_height = 310 printer_model = SERMOOND1 -printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_SERMOOND1\nPRINTER_HAS_BOWDEN +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_SERMOOND1 [printer:Creality Sermoon-D1 (0.3 mm nozzle)] inherits = *SERMOOND1*; *0.3nozzle* [printer:Creality Sermoon-D1 (0.4 mm nozzle)] inherits = *SERMOOND1*; *0.4nozzle* -renamed_From = "Creality Sermoon-D1" +renamed_from = "Creality Sermoon-D1" [printer:Creality Sermoon-D1 (0.5 mm nozzle)] inherits = *SERMOOND1*; *0.5nozzle* [printer:Creality Sermoon-D1 (0.6 mm nozzle)] inherits = *SERMOOND1*; *0.6nozzle* + + + +[printer:*SERMOONV1*] +inherits = *common*; *spriteextruder*; *descendingz* +bed_shape = 5x5,170x5,170x170,5x170 +max_print_height = 165 +printer_model = SERMOONV1 +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_SERMOONV1\nPRINTER_HAS_ULTRADETAIL + +[printer:Creality Sermoon-V1 (0.3 mm nozzle)] +inherits = *SERMOONV1*; *0.3nozzle* + +[printer:Creality Sermoon-V1 (0.4 mm nozzle)] +inherits = *SERMOONV1*; *0.4nozzle* + +[printer:Creality Sermoon-V1 (0.5 mm nozzle)] +inherits = *SERMOONV1*; *0.5nozzle* + +[printer:Creality Sermoon-V1 (0.6 mm nozzle)] +inherits = *SERMOONV1*; *0.6nozzle* + + + +[printer:*SERMOONV1PRO*] +inherits = *common*; *spriteextruder*; *descendingz* +bed_shape = 5x5,170x5,170x170,5x170 +max_print_height = 165 +printer_model = SERMOONV1PRO +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_SERMOONV1PRO\nPRINTER_HAS_ULTRADETAIL + +[printer:Creality Sermoon-V1 Pro (0.3 mm nozzle)] +inherits = *SERMOONV1PRO*; *0.3nozzle* + +[printer:Creality Sermoon-V1 Pro (0.4 mm nozzle)] +inherits = *SERMOONV1PRO*; *0.4nozzle* + +[printer:Creality Sermoon-V1 Pro (0.5 mm nozzle)] +inherits = *SERMOONV1PRO*; *0.5nozzle* + +[printer:Creality Sermoon-V1 Pro (0.6 mm nozzle)] +inherits = *SERMOONV1PRO*; *0.6nozzle* diff --git a/resources/profiles/Creality/ENDER5PRO_thumbnail.png b/resources/profiles/Creality/ENDER5PRO_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..ce4e5b044276404175404f51edd975b72923f4fc GIT binary patch literal 28977 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 literal 0 HcmV?d00001 diff --git a/resources/profiles/Creality/ENDER5S1_thumbnail.png b/resources/profiles/Creality/ENDER5S1_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..410c4f3d4c347805ceb136f79103dc8b06039b51 GIT binary patch literal 36850 zcmdQ~Wmi<)+aG%9kuGTg5$W#kl17H^l9ul7P`Voi1?etnkrsw-7?1`9>F3-p{vYCj zVR0B1tbMM%_qBg@Vl~wjaIq+`Kp+sVlA^2@@VyBHLIQ!&fh&qF=pOJxguRT6rjm>d zt*g6>jlGjK2*i>am@1|?AW1c3sy$Q}7cM7D#jV4PZ6QZh9w+xra~bQaa2E6qO^qUr zh*Y7!d2@5bV!nUKP#;5I3i1GQ^K{qpOeJ{EBziySzN?|Af)o$#<3dTHrMVP1w}w-V*0v8I6K(+`z?ilIpT=BoZQElv{Nq2K^PRqRf3QP;Sg^GeK==s0TqVCF1z&n_(iiRE_5H{g| zUr3;wJTef77NjIArQ@@F-0hnO)y)=o5<{Fe>z^6T=Br18=%m1yDyTXnFVQeYq<)!0 z_bW@TehZ!@!_ho-s7B0PeHC81k&i@PjFiMQwDn1X=%N^<4Ui+87`r*-@(YDDtOL_B$C{2rRhYHB{L`A^=6B7A$M+(SBkm9u+Qs~G>*%KU$GIijc-2!8rE zDEe1lh33X+UfaEFb zXevv+CYDX39luP0v4{{EX1hDV9qpYVUXpO@cV#-T1H$ZBZRc@4YbBE(Xd9cts#k6B zvZ_n0VS`BDpP`!~uawqRz&|32b~{daYLD;;q^UxaP713VuzJe5_nK*S>V)_xyNM z*lIa~=XcT!7dOH1H0I>xEi=p@Ce4HH`yS(f>KdKnLpH4^Z`D^?8q*k^(_eX2*^#`V z_GZ?uM!)*0|5dyU{jX^9!@fZ8JMXh4!b8J_IUzybKOOy{p=Gr&=LWXI^f6Wby(^(H zFEQK*Sz_H-e`=X>sQeOJsaAc8>Z_TBg(%{{z=Ko6xXH=Mi;9X0OkLgJTKnbjg!;1ZzL-{(QreEH*~IWG!-iI_&8% zV(+N;)^7ZHzAlJ(t;v2)F0SOu#Gd;R(x3gS+fSE~qH&S*P9srAi=FKdj`W{e*^uuq zN5~gEy9*)QhV?)8+^fHD*SFQ$zmFd2(oOK?GM*zc7Fd2meDrg2Qr&s2+9C~#$NNfC3puCgxPs{PP}SYC+TsIJ?`yJ?MeQ1JMGUj zJ5IZNqtjn5S`;E=fx*Zy2pTj|d6{&!Z zjvmx(Gm-P$epK6eEV18M(EM?2snoKR#_7X{+oRT=zjYRr{7#al8k^8g?SSZEtcXf`T0!elK55Nj$fgwhzO5uA8s7wziV@+}m$Nk_a2w#&dFV`~tXn zZp+=vA4ah`x?ER7%SuZvVb%E^WNBv<;Sbh`#S50h3-&)mwG&;S{f(DLEpYMDdF?;XV&JK*d z*Sz)y2L~rwoCPF9)YR32oUN>O?_P?0Tx7n?^7Qtu^P)od7a+Qo;a*)Q&MpJ<`lcsu zjXVAzV6Z0{QEHm6D0hPCz$~8aUfn9_eKBxb36Su(nh>a2X?1yas5f|k*yeFhaxXbu z4^Rqx=-Sb+hU$HNKc6yTbLM93jRImbY(Rbfm;4-~!rpGBs5|e?%g-;ahw;aasaz|T z2rJSwr{Wg>joz050?gm>CQhDKA;M$x`vAj3;XT- z`}dD@cx1#LC~vG_5{mNSb%3}8gVx6>v6~bHYF}Bb;5r@FKX*rUy+Kn2VmI8A6qs}+ zQ1)P73ybaF_otmxciPmYz*NA?=hQ_`ob&VZHIP6Es$}symfD`X-wNcG7%b(_P@oj_ z!0+<7_`3pbFJV0Y$~gk7y|4Bsj7~exdM+Gm+il*0Rz2s`o_R$@A2<@Y61nz)Jrtam zm-jFTEX>8i0l_uDqpwRqfp;%~N(45rp@5i}m})!z%&NQ^aSO^Ev+Bv4LL>{V|K|T= zzWe>kRAC`Ma33RnXj^T_;$qdvrQ2)dZR_f6liSYl1h9lobMx{BJG_pbUK7MR5lBD8 zdDQX@o8|0B`}zC#Ub#G9yKGN6|6Hgu4VGv6w6xn%+b=7@to6d7`tVfj-a>{NT@?8K0P#_}Y6TP{4OH6yquI=5#HPqxXTk zqqDP-Ip0%DFRe^OY-;Z9c$l@}!NI}e0|IOVS_B4k?IZdmWDJ*j9qGJM545$%a+S;{ z+jgi;tnBtzuTMMpY{3^%0{H^GqD_&Sm(O^3xYbY)?dNrmn{EL-{NyeVS647DZlayb znIhsU(nYahmXlvNin(w#skoR9Sm5wyq2!I_X2;%Y*l%iGT{;>&F+OXU|AQ?FI4INqD>1XpEm?J14??mufRj z(jp)R%iTmUSQrl;+>1+?Kdz#JiF2Pglik>TJ>Pr1eaFXtIP>F4$MMR>?X`V7)MPCSUyg)AkjJbVTz^+rUay|tPQAI1edq<3>o@cAr<2~3?+Jen&2{M!`nclUx|W&$ zqu>=PQaTGud5SgKi~&vrfnwT2rnGBQb1PlCa;Qg=ay#-cIivDcJGJWE;B2`HwLd~+ z6B4s2fE?<{8XF*vPxnm=o)}*kcxp%%b#aLw z{BL0X%y-IvAMJNfPtU#g@!|y)BESoBs)2)#Z#vf+aGQvMj(++J_wfx#Tt`4CDb#88 zpKG17h%H}h6Fo_?4BX2OhNY_wOcqw7T}jqdX=x+jnwXe@@8y`Cv!k59Erwqv$H?F= zqabQUgCXa>afkJI#!bNA8dGDpE-_{Vltda;vjS3d9&sK_Oodv43Vxw*H!|o@Ipx)lz z=khnTZQHP&L!p-=f1#QEZd5vKl;v8O3F+_Ha#=D}i7thRE`1X;tiIWviBlb%DXivZf$RL(-S7Yy6FSs$h{<17R&;M8$nN3*2SU?D*^M$+3%*PF( z4i4fJqKgRGME1WqMgwzlafJ>K%a1l7E5DvSMBlwav#P9cHG39EeILta+VfBcq7rDQ zj4Zhwvf{oa<>+qGW=&`1)WP4l+ke&e+@I+>^74_kC}yz4jt|F*n|#;Z@Obr>fJkmQ zj`+>To~_w<1(M6ax}d)`G)vw7-sF;>wXo=9p>s{tAenS!>-gFuEv8Stf!f-0k6yUl zF_&BT!9MWA%EBOGI;%zq6%?FhgBe*8D_sm~w30@ZuY~kX=8JG~i6g@mH%iZ$NQT4&g}k3BNy;gCb(?Bc=zD+vkP$=CNTt$7pg-Bn7NpU+AQ z>JK$wOY#xLGt7{Bjb=%eVVxa(-+K05^P(Rp-H3MeukZ+n>m*$S$nuyQWKeH`b|ZS` z_<1&Yv8CH?SJqetr43PF+U4kKX7It`1MA+EFR(4lot&tWc0xSx_c_ zm_3I+W@TlCu)R@a+}6~^?d~4$6OG#6w~;NKN$2QkyLtmR4SpmBFfZx&$XF>qQV}wU znLTGE!|W=9fLCVta=o04dJ#W#dOv?X9~6>OIsgUGV#Vh$4?N}9^r?zpUEF#RzR%)( ze8d=*f4UvPiW ztEoF*>9m5Euk~5E9G5TnVyYTj9(NmL)QagH3(=M@bp&LZ z7dNg%hfkM2weOeC$M=qyNRwz}wnaK&FqkGEaYwCEP6dsCP5x%r>%u99bY(h{_+kSq zmh?CfB_H2p1ywls+ORU@VwyF-FOsYg1Xe=oZH~CA%0g%^B4mLQH6|X=;98M)u>~Y6D%(;o2`(<4bh7x_j|p>!NW6uTsoTWeFnXMZxnvBIHGp`qk%P; zOH>qRfD=|X!T(COPw}85$$%{?V}Yb_o^bn*ZHvU;-ObISoH463=@7=U8oeROY zL;;Rrv*GZM?G`8T!zHBi&IfWSQvv%taFw(_8W9jBxRf_SQp5$@Ty$MS6Gx^tVp)Pg&T@*$~isWu{MB-rfSie`XY({l(4j ze)1S*?7_4J{gGZML-*_93x-MhEJm##oK*%1X^5x@B&VCpun#>^C@5wXnY4jpR}%PZ zMy2mPf&M@(P(vc9C1N0o@H0hWbeOP+)LWwrN*BM*p!rj z!exw%{Blf}O4Gw<}M- z#+VDc0`2V1KSgMPC;PL`m|Z8OA|zSUrJqAlvdCx@24iS56s6~RSsD_eJQ?Uy?flD~ zltBCGh_^~=#hcx_`vN9bDBj8r4TpERDR6K;8Rjf{@! zp2?Fc(#jk|;QIZ?%r&WJ(Vz+Hb{s5Kt{9U`tw7h$EV z_O=e{>%P6EKrPQkjqfBc!TaUVuShLmfuV3}D}iSctb}{KzSmbxWWI#Om`zWRC<*uC z98Mjx0v00$C1oME%3d^k@D*{a9h-dG7^=OZz_bA`OjBBSxJz-VVY}SDx}R6Y*?P|D zZMyQHm+|*VP;mrAx>~iG@tqPKDn)dR>!fxS79mR3}*q&MRHWCIwL~s&-L4pf1QKVDL^a%2$Y{V zt%e25TTDMMXgH@>!}PgYZN%#Ss}5Gu(GoK95)>~E76u7c@uVWHJ<>T5gL|QjfN2L? znQu;CeosQ&^ji`|fPsAsoQXht@DUBQsIuqWBcAkW8gDA*?1`|@z#ztetoK)v z88e+-q@++Ex(~g7`3DJ=@>(2-7Ydq5HtyGh%{RvHXV$ujtZTT>0&L)3_Eq^qs}cO9 zpz*z{_*t*RWaNXlMlAt9TUMK&WZYf9(^$LS0F<@0E)n1q1`NI zEBs`ZDU6tDyCP=1(+P~AS{IM|kWxAqk`TR!l_p5aD+wGmMl5MeMUc)uS4tlgi)RH- zE)`&-L?YfjV858E!X3e^ygXT63bb^_rsn4DpUsXlGc&Qxj#I!EaYC}h8Ir!pd#mBZ zWLxNQ`XW0?xm@eziVWyIIHb^fvi&#$_0P)s^|fwkDMKYD_hU#N3XI7zzzL^d99Y(5 zmPOp@L~^l;pSOqdIgF`eW!VLAQ1;?!Vv9>jA?dub^yUEEiDC*0GKCw;NCi+SckRW3+hvVE%$DEVL5KB`t@kT zF@|0kjodrQ*BAX%e)r8Gut)DAw@6Sx7KRQHT~S1z+uEVrD^!+O5Y){CnY33M3ACu6 z@0?WaxFgxnEUDewp+zJ^IG+ZtM8BB!QrGTCr!kVfK&jTD$m7Am`D1xFTfW%hMJWoG zDc4GRTv0QP0|{EVmP6U~g&t(0riQk4YaaWNP6Q_@1qpMi#yD-MF|Npz%iaI>SIfR* zBPu>Z2M{I|De*WKZxO0ohEzH2AF6{l6pIc7<+Pz0WuL<|F&h}et3aFnt2xCxeNQM^ zKh&k(>3~qvh{8))q|PIXzJ4W!!EQUj8s-53IMV+5V)_MTuLJ;IsR7%M3j6O3Y@f%8 zN7JN{pyY}2{bNn;mpmP005hc<$9ivML>JLFJq^K;sY`o)lD++;LwQILrr*zlOH0$$ zY(@~8I3^TrpK-ppldRudVNM1t_S&N`E#yfwUN!tvjVQL#j?D*nMW|@zcg#>B_ySFs z+coM`&w?ss5d-6u!@;+6zb!-nb3(|KEAtJfu<-kdvMV7k^pzI#6%wbFVQmd(g`3$A z57#pabhO`|`+~}}UOzlWKT&Tyo_bTs>DskJvz=TVI}cYjp02yJl)g%0&gXbG4u_&j zEf2X}4+I~tH`YDYb_QKbDch^+rt`ik8*^LBxTtrde}nZ^hm|E$`J0mnC#EPpDj1Qc zr3`fING+uoVMm}6=@>yv=zhX29yX%Km;#S?Fu_n(H@65rrF}UyWMLCw|W_UOZg+OgOR+x&(Phuy-DF z^YZaoEH#(_txxpv&&Q^wrp;S~XkMJ!aC$OZ3cMjO8DLR?&1O=w&5h8 zxS?$+om{qYO(JV`^kRw;29J$oaNg+ewuQwFpy)dDrCs7|QsrsikE* z!zd`?ruX^r-}=oHHqGOKLh6Lg#j3}Y?wKXUFRR+W63pi|C=DN_s4?53JBI&!;JKmC z@p$nosHV!0jEMH>8L5%?6(RlNAxJLu@v|Xos9Th?QLEH^6TSyn9c<`(-A*a59Xr^V zP*3{0T${A#^gBZQ@7R%YG-a;q%*&>6$r6y^Lx7!hj64gPLlcNDr1+@+Bij_Ru}`?? z@L6~D9S%$Ts!T2o{@r$34v?RA zcIXHiVZxfnl-SUf$)iJEFADW@k!cW8)NS`vuf1a`UbCC%#p&LR3WvF)z01b9SweAlH!cH1sbYB=C=JZ$9_5Hb!M~CuCkPIRI&6zT3r|%<`WDE@D#0@`H z5fym-yn?CITH?f&7({(IXt5mNq<3}7HGbL`c-GYWHR0kjP~NMhJFh&ro!rvITW1KU z?0zFJy&s0JM712<4fN3R^F2`fDhL_(n_k<7`z%9W@cc}(r~Lf0K|zUF)PnR?uajXUh=j3f z5~0CL0AyVSLzeJkLXJ!9|9i-}>VMYFLKGM6it|oeZTo5m1jtGu^)p-sdq46Hi^6_o z(PLYU`ly+sZ1prAw&Ah1;KIGOI@mppQRq-%Fx?ToG&^F_2uNFPJODt3$-W1E`66Dv> zy{ge;Z2uAFwA_T*VtqTK0FOKpbQPQO?jWl(5$Mt|%$QkP(&dYlPI}U;P#>LEL>dwE zM~b0+=ddt*nER4efmd5ohB=Dp6}X6iI4q)vD7uz1W$&CCEII|qqDb=xx`{|hoz(X)^k`aL-)U6l}4K~E5C_WTrNmqVfH&=mEaVgAn`Bq9Wywq>ltN}Of$A~FCe z!#P~bv_`J<9Yk8Q+5i$JlR>=LqFcV;X^bz)fJ{A)rwWqz2YFhv1wB0fXxKJwgv!sb zp<|w+*67#C7pEuy5}1<~&2ft}2JOzdC@GlWVE~g*x=4prYEGx^0~!oQUpUq8WlRBR2(4fw7EhtTJ|_3sqKQ*v@f1+dTB&H z9)m1BWLn`bySMjY^T5$J$`C|Af_5POynA(;2^-G5&rvmtIPbiN? z1ajQjgT4r7$zn~(G2XzGh)$C1-dBR8xPqh`YSQ9`sGwSNvYJktgI@59U4i>O3%14X z?;8UxHoy$2si^^I=Fk)CY)Vb!EYSf<7@0=~p9ZlhqEyn=+p`)XnjDLIb)%ltHPL zYp4{GF&y^k)Yn8)Q5jaz2MrC+#)+zO_#kaRzkrudp*Cl3NZeMdJrVhhO=L7zlNRIM zm-F{MC&Mt1H&yToj~Wj+OAr9BA$YR$?dx(fa&mM86<|V13a5u1bu2b|B}EPriMFVZ3B14F25wWDkw8vH21TzH z8mq%f{<+dObV;!$b^6e*q7Vy`D31iLf<>jKnlHAX8N+RL>RtC=NRMr2QT4NY85r?kABc*cMz>Vu?!C!5iNk=L&Du)MA==dd{j6Ja^Q`}gl>W@p0` z8Q-h%Yv~dLo-ph3ipV!dID3{27ih(kN$ahyp~ynC1-1;XI!pDwD|qYvCHN;XcW&{E zAiQXNgDC+TpNX@u0k8Z%r*Cw=K?EdpsM)bNj7su=^dg)eX06L9eyYRJoV25Z9cz2O z6%ocmz^IvOsQaeO0UeWWdVMAou-)HM6v-vtWno%rdBm4Ew5o|%r~YP)IQ!ebmrQR- z)nfnMs~g7j*8|M9*g~kf&ijhADG|Ax2v!n?jWp!}6ds^?PS0yxzOV`Y((EC*U%0;juFTA4#tOLaAQL`o53&C3Xgs+#rrapRPpTG7RY z+wPSwOC0h*Odqe>@lqox02}~S%k;<(*sTQ!^S}0$&S$44Ib1l#GrVtW9ixtUXjt1I zzaQ~ed%1HbW|#AiU2jDhN7p^5NVT;Mfyq!D3}Jj%1;gq`%Q_M%q?+T$Dn<>%){K>w zlq4WZ+UdVC(ACCx%ugNPgT#+aul_;>_>We-WHnJ%YFS4XB2JG04Bqc7-tq@u#JiTx zC~Cgk<#7PCL9sQl`08TBCo{49@y(lWoRH*^8c(gNwaP12LBT5^3J@=xlqg*cUTHxY zmVt4T^|V;)GKHh{Mt{nkA~nk?C(l{yC4K*L(bYV%pp~)S%suZn|A8<2^;t0ac;?M~ zmI!Z_Ch98ZSL9(2F&tccb9k+>lwohE(?_h@Bl`Rgl8%npfLdg}f`^WQ!6_)XNtzR9 zkN8qvUjFU$i&tjwKZallUihf^`Q|XcG29y|W{M-(M)(Isyj;E05;qZ+uL%p0OPnmd z21V3`egEL0T7Kd;Cu~3+r@k^<(rb=YpZC?*N$HFAHhu-7sn+t4b|p&%moQ>Yd8Lk9 zJLbKQv*PC3@e8|hP|7Vl!v$}JdTihuwK$OjHfFu^ksd@E7*mV^V;B%qk)SH79RF8| zf-?UVpK){!OeLZGFdj`IQnXKYRm92-9QC{eQtet&?NF>fd6;i|!xx>S`|qQ)NTJ0? z)5t4tpn}DZq)aOjKSPhAh?lG(+m3)WpJ>G$8XJp4HPU~6&S_Ck2HMzS+r5gBO^|dn zf=Ktlbj~k(0wJg|@|K+OOj(GMx>nMT48$tk-elGT3lqYsFxkO=<3hNAOSoYD-REkc$fprt_S&K*KrgsWy>1i5N)_PI*Ms& z;lFC^IvB9tnXo#AiSm|y_5+>&v+RBB1wEa;%7n^_X=HTzcj({T;5*f`smz8G@Cco~DTqjT?-TC7>(-vgnBtu;jSJh^m4#6wUB!Hrbv=<<9TrYb55H7xlxIBE ziV4(6;)jS3!drQ_T%koY1>@lX$3+l&Pr!wi^Y9?dLfqPDOvj6)D$-_72*tyS@!?Oe z1H^FVkR|C;+aCR&Z`bgH&Ln!V0r`{`4X!&pJe+P@uu=@DoJ0QpnPU6PdfbImmR44> zIEe}LpRyyYPxKTNh85d&!en2u#A$s+HcybkBG{EXmrzP8Vi6ypQ<_cioSohRhfb2o zXlwHT0?0eo?1M8JaFTtl5(7~@nq3b19GkQ@pXbMq(s14{(Dv=hLr-_W+`r$jtuysr z5pe0b%{}wqz$hs=TAOJtxp@nN)pB_Tu7o~?iu6A0adiK=TwnV)=mmeC2O#H^pI?Ug z&8cx=+uxDr$44MPfe-oyBs3V7J<9k6KK3wf{N(Gyq~n2AxwLJeYsVx7(GI^eIa;#x)i>?*KIJ{jB1>3yx8a{z+L{+PQ37b_3=gm1loQM zINmW>hgY7i+_>Kjk(&J5(_SfjPl%o%%`*+3R8CnWLEj8uZtv}-xxYCZ`8SA~HpU3} zVZ!j*Hwf6Be%_S(`KVkaigPnldk-;fo;1ZN%g_C zVltA`X(g^bDc6;X`9u&8bIw$3m{uuBwywAsN%|aiQZTU(^zoU6b@Y`65TpyyeRlV6 z@ZX@u`dvor!&9!nM#6u&fLEZE@WSx2>grhQMj^W#Ea}m(A8`?oXf#jf?>aGC(|@p4 zIwfOt_$S~!hiWbqhetkZ9l5ZSb{lrYc^PPG*Q0Q*=-;tziR z4zteyybHFK?@uTgDIe@4*)xqgpCx+(FUKmu?1DiT@trRRII+|wCMxW6zKREqI9|@# z^C45+(Z|ZJ3RpYjJ#%JR>9S_!@|AO)OpO`g65@*m!Xc8Nq$9~W-oj!6b9E6U z+zggisKhH_He~S_cHsWXY94pZ?RRermBJ28{f$;udj8c3)anrX&bsBPmRk^CwRgRa z_?D~qx*KT#ds;$tgm|yL*kOP)>@AK9nqC9QG8H49-@ol z{^sZ)q^Cz5;B=prUpXq-QeK~}@c1_jOjF>03?;t|#ShrrKP@;t9>=)r-RdxD_7llh zrz41+T&iH@EF@tB*uk{tTh9QJ_iPHuzgqe8l3`0kSx`pB&ELlB@lgJoX%4_}W@wbS zrx6Ig=O_rg&NihMbPchK3#+o)+5M!q9jYL(b%+QI5;Yy&iEHgbD||e*{Z9*s=jb8Z z_;)9eGH#8suUK0_B1``Q7@|axjMB8pPXWX6^veWf)F0n-l#$_ooew#|3NaENF02UB zm4}Q(aZhrQ8tHYn&D3*>awLizexFnp`27~MEM+)hV6dF2pK;^n=a+}VQ$eE*^v&** z{(^`@t?FN!g6bHSs!X!TbehaOJC)gc1dP8CiT^}x(Kx!!k%90cGG4ZYl@)-@X!F(O zI0Sw3`>=Kvr7SHO*c?w6BVe#!8oNNim;fi=Y%lJE z=+nKkxZDr2mJe%DfE}9LzXb#+f`XJ;^MRa+?lNDM0rHiB=C)i|7bRxGEfF(@f``Xd zg5)~`6!NHk87KRk!eH&|Iqz<{rsDnpRy-c%e7qAzEFgh{XL^z85_D|W^KcUEHFikj zbF;TXz4E~L@ho3bL7%imqEXC@;g^FSAZP>b%iynHjLR#_3d$9}6F{&s#qV;Ac_rvP zoMx2N*fSM~4mdhEQ1Ibc4mNzL2TX_8B=KeS^=@CjmUj1+mwO#A*%sQbw0pEx?YR!< z)dekzF2=@yqC;r0F`6pu2Tf^JK`hj7i}00E@?U&?)tL7Dm`OD?V8xF;?q;JIYH4Zt zi&yP#QwIM{hIO%4wIm!DM-?mJ=GwH>;&#L#V%4)6Dy?tJ422Jzu5lDMf5nAWNV>Xf z-h~;m>Q;9G$t1OR=7uD*hrB>EEiN_nolij_6Wh4CdE^n|9)d)G`f+;JskanK=F9w z`!qJ18{BHR*6HH1yO(LIj)Q~K)CKg{j`KZ~``)X;4CZeD@N8=K`tJ51zn>;s1LZ-2 z1@eF-=lK3yU)L_Tx@=fSnUnFgzZSMsWltX;Rke8t_ZF2{{Yh5(DSNDuNbWzuMBjEK z^1onVE&~8}XIOYAHgILXd1=Q=XD})Tv4YH@O?Qa9m#?$5jJ%M0dof5sqN2|aSKq$; zAmw*j)J$Pi>irF?`31nA^5SBtbgOnC?v*xQqpvTtB~6Dv;x@CoiUa?uA7m` z`})}ZSxaN%vt?ouUs;|d*hxs{sEFFffPb4v9~OM{=gtl|B6aDiXLu2xc-SHSyW>ciY)v(Y@(zeYY z$=An${b+h$g>mzEzGr(oA2_;BnrHl^btmJNczWkxE{?W?T%IOW2i|fT`lS47W@UwP zf7YoeG#M~G0SjM@i_1Ly4RM_&?>lz=2xp_xysN6(L(E=2gOo=p&@ed=Qcs!91$3G7 z()KhhHR)VKS4kN51SZUuZ9L3eHULcuWDE}{(vFMrL=hGi?)^Itm|jjh1IY#LCpW#l zTZA;7*F$n@=lFboaPY15J}&*V(Cc*r;y4WeO-E-Qmf!KeIXwYF?8nW{xdhT>25d|U zrSIN;8k4;~S*aAiUbKAQ4pq;pSkkIz+Y(Mnu{JEzeqCmHQKH*&@1Maw@tHy;63Xt} zSvzhqQ?@+{2?P))^3s(qQs=KJ96Z zx&)A!5fC?J*M>uFvg)GGXsP4%`yL4R)+v498)I9II z)CWHY`4liuLj7&FoP!@1wpyVV3&9P}_sCMTg7`3hK_i9;!9>XWw|-eQ;yU2a>gwvE zIhae@XJu<}|BLvc3m_Q@MBG4<-|ppru;2F(Dhv?ZYi)9p-AxtrQqu(EBAgNwv z|2=^hnjb!#Yoohrw%*s**Ozu&|JPqd;g1c@E4yLX><6Np)4hP~4g{ZvQ&kyXB+3IQ z6*^MQ^nR=Xb&{;jz$cm27#?f-ih<+bZdG_A1wtQ(Q(yNVw1kB_-5N7B25It9d7$ul z+je94i+TwnuXC$#eD8<-&nrzfl8V5}9M-IFuve;iM$$<0HxGZ13X+hWhHH}JF>o{gp~i=^bOL{lZTRaBbg=Q!!-nk(m;nBr{eKdV>X*3V2g{yHfZxn;9)Op&Nc z3FplX4v~epG0a=6x99EpE;p35X!?Zq$W9Q&`1Z8E|I3Y!t7eyCql{NsT-W*ZsS|XJ zl|(9g3l<~axOuu6!xwA1aKXU90D7yPql*G}Y6vYV5DYpPwNrERNSWU8HD7=notiY* zg;aPfHbk%fwsD|CMy3$tUp|hD+?_luu;Y;$mv)2;%8TlKW%i1}e@pb%=8+^c)p+ zl~A^1fn->T!;cbbC?AHi!ah>MK#ti+cT|CbD*2Vxr)cosR9Y|hNe@*Ld-DbUL%ORj zeQB0gwC33LL#Sylg}-x07oL~1fGJNSK6Wmh1G zjcCuhk+$v6rWqS3IQ3=QyfGGX%O4!*NRFVHZ^T5VXSwhnn$fqAp*akktDxcR9g+bT zN9es=ANr*{>A9P-0LsyuXgfzmk$zppCZkEu#LOIPPKGjqGmSkzxjiVuDny_OE|#kK zQtB`JB9Ft1Eq_0pA(DswH^4d7k`FAA4-W4|WGT149VUTP=NR)mT)0N$O=2blD?R9+ zJVC~RWbd50I?pQ!70xW#WLGAs0=Vlul);!cILOim{}IKlpC6dW3tU5%7rJTZ7rKE* ztM=Tp2~rlhys#V(D+ati-)y*A)KfJ|iFIN{>$JLJfsvKVB2A$XX;ice=VZCgz2#DY z2Y(#w2;a7lB-NErP2~qwPx}`)5V{DFIqxcCQz<1+=Ndr>I2p5M8v-dyuGSU|mWa}! zyvbKIV^Rp|s1mE#vg7p}^|HLk|DGLZ<7b3VHGP{!rPVAc!v-7MnzSoP%64A+9$FYE zm}adTbL1EQyLi@6WKmR=i|Z3NEi=)c+hFHcwJza1yRARl2GGhBs_&BwS4|HUG>T?3 zE%@h>GVx0vyCGREPNSYY*C7JQ%mjm$>m{{*zWa%8zx2LPIcN?nbDD-;5Mobnk4h5G z&&mc7g-?WI86`zhpAxx`&j}qiGe7@CmT&eE7gP(KLYQRl(kKFkfKijLWnMd2z4z;y z*eF%}dk`coWC!A%goZuDUi|-7Xbp!$yj6#)m3izdw=0oT?Ad)hHVmI=nx7oBJVbu4`b4C zBJA2fZZ5|^|C+?%ArNP{+vhTsm-TAT|Gy9$6A=wLfHPb zlX{OU&nKA>see(6Z)}DS=*W{DI1UcO<%UEv8X3WKs;+D{Z7EnjL>@GXyqzx_pEUp= z#X$e!Yr~>;z~F9K_9hdC^-8`On}U~IoQ%WpA)I8Hr2ogGJ}M6-oLqyM#pHa2y3WvxBIDynv9|ptU5^6Nr`c2EH-&yS2;!+z z3aAJtx0FlUp$+u8oF?EZp2q)d02{4I5J@ctEtirf=9xTq_KgP3 zzUN)J3?wdqtUCa~!;cs>Ol#Khm}OzwcGgn;A}$Nw;y~7I(S0C<9*YpP42zi z4wcXCj!ILsAx8U-GV!;c+)yL(VtlD~IXUsN@bSP>QZbB47VQvqGU(|Y0-YT)EzL%> zXt5q2ib>}NVz-2RX3L4{0TfG9foTZ{Z&~sDKq*m4pC;~TN_|reb_ZX(gJI zJ?e0?c2hIFc8|9TQSu5&ADK>xD{8I7AG5*&{I>=+8C_zsoH(tIL_^1m>CZ=V&oh3q zl<#AfWoGSh`FIt$6E-)$4@h4TC*fC~L#`eF-ad*Zlpc;tp*;|#oZBLO&%zk?<;35P zxm%VPn#Xo$+2_Jf(00W;D&!vK!_@4+Ri(ZaWK9m?CA!ALx%nLjf61>mz0K_Jc zQi-7DNp{fRxbxE3G}ipBw)Ih!&g-xc`dpsW8rS74PcsCQ>w4}+LR1v+5SO`~9b{)` zM^T{6_4n&avvESBZvY#x)@o11-o3_?=Fs3mGpNfAF&MkdZNEi1z zzfBtX(1{r;T39}UmPsoawgWernOF;ce%y@&)MzlBY<)PPw=sMOjnpIrc(_YOn-4I< zRMpk#K4lO7`zJU&Ji^J(A5~mzj+2})Tbyd{R}_rD)^-tW*Hw>eB7`EjS$Roe3pGgebYz#|TvLCIeKm#3r zZOvR=K^55{Y)U~456Wnd7$(F2M#&;TdF~&=zaANb@Tdr;WkCdVMMY25rP18dHL=qK z5k-PCvZ|Q|FH3|)L~(<*{*R`!3W%!f!Z6(p(%tRQ-JuLf3?VHek^<5a(nEK*7g92)K6xzGfDcHdcK2nSUs*ZrC^(%Z7=!b6@%=IbyXuCt=^EBYRB%5TSCD z-SC6aL4;?C|xI$EFP8HoG>OXw1)0gbxs#2HZ3rLJ_y zo7Qt4PWV8)^jcU$^?=zhYfYA2L^Nxv{+nY=lvVBzKK+I2eFidr#sU3yUn$WW4Gtpyf>=} z+_wK>OFP|wf>31iY4mH`_S4_@a(Sj-WVNW05aQ}TFtIhTG^*b&v1-)ATc6br7 zW3;<$jkG^|Kg`DFg*!x6DCH(i^YV>bF!8G#<~-=e%)}TVetID0LPO1qqX!3^lprOY zTmE@>o!8dqd(`4NV(g4(vb_c?$@bm@X3=FCBSo25Hl{wuGgU`OzctScO-M}0pyYYR zoCUjAW=nV(<*dv3k!k%UdS!c8UWPxqYS(YPydqdr-@eg;H8zR?7=en+$R7R*LwRFt zGp{Gkel+o5{h%)!jY5#$$B`>qf2wu6(&}29mnY$P7=;H@vJNMCO70K(5lyR|o9TcN z{M`>!Cb(Yn#}Gu+U`S(9_2pM_8jz)bKOf*X&qGLBCX!qYwJ^}6$0)#X+Ee&>Mgxme zD?0}qm8J>Cc+&Fi=)F(x%X3I}LO>5)mt6J%mlF0^V|8gkcJ}B$=&*&e^u+6pC{*E~ z`ph-f+jt%dSFe}7Sj01{s8(@sQhi8hD4)1EFimoG3&QSk!fDV)u~6eeP)%pQuzjrG z6dfQ>gP{bk+E-A9{HMOp)9hf1l|Sayy@-&sF=>a|QvC!1mjo#k76Ttq-b2|UX0#-A4mLq8{X zKb}I&rHVve*@_pDN*ua2OT$N(pcFP5{J&&f0 zPI>;Wr=uO!u{wJFra!^)KsN}cT|04HoA(>Gi=N9FqGOw@CJ7iVFLuZ9rx%0A2aWH> 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 literal 0 HcmV?d00001 diff --git a/resources/profiles/Creality/SERMOONV1_thumbnail.png b/resources/profiles/Creality/SERMOONV1_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..7ec62ef848111502dfa769a2e4eb1c6ea5a0f08b GIT binary patch literal 24117 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 + + + diff --git a/resources/profiles/Creality/sermoonv1_bed.stl b/resources/profiles/Creality/sermoonv1_bed.stl new file mode 100644 index 0000000000000000000000000000000000000000..b9ea60a0f3c54580678790473421e7dca0881599 GIT binary patch literal 35884 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 PP|fyy%o3oPQ2T!Yi|PSf literal 0 HcmV?d00001 diff --git a/resources/profiles/Elegoo.idx b/resources/profiles/Elegoo.idx index cf0da371b16..828060123a9 100644 --- a/resources/profiles/Elegoo.idx +++ b/resources/profiles/Elegoo.idx @@ -1,2 +1,6 @@ -min_slic3r_version = 2.5.0-alpha3 -1.0.0 Initial version +min_slic3r_version = 2.6.0-alpha1 +1.0.3 Added Eolas Prints filaments. +1.0.2 Added new printer models. +min_slic3r_version = 2.5.0-alpha3 +1.0.1 Decreased bed size to 220x220. +1.0.0 Initial version diff --git a/resources/profiles/Elegoo.ini b/resources/profiles/Elegoo.ini index a39d33f3f5d..487f16dccc3 100644 --- a/resources/profiles/Elegoo.ini +++ b/resources/profiles/Elegoo.ini @@ -1,510 +1,596 @@ -# PrusaSlicer print profiles for the Elegoo printers. -# By Andrew Suzuki (andrewsuzuki.com), adapted from Creality.ini - -[vendor] -# Vendor name will be shown by the Config Wizard. -name = Elegoo -# Configuration version of this file. Config file will only be installed, if the config_version differs. -# This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 1.0.0 -config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Elegoo/ - -# The printer models will be shown by the Configuration Wizard in this order, -# also the first model installed & the first nozzle installed will be activated after install. -# Printer model name will be shown by the installation wizard. - -[printer_model:NEPTUNE1] -name = Elegoo Neptune-1 -variants = 0.4 -technology = FFF -family = NEPTUNE -bed_model = -bed_texture = -default_materials = Generic PLA @ELEGOO; Generic PETG @ELEGOO; Generic ABS @ELEGOO - -[printer_model:NEPTUNE2] -name = Elegoo Neptune-2 -variants = 0.4 -technology = FFF -family = NEPTUNE -bed_model = -bed_texture = -default_materials = Generic PLA @ELEGOO; Generic PETG @ELEGOO; Generic ABS @ELEGOO - -[printer_model:NEPTUNE2D] -name = Elegoo Neptune-2D -variants = 0.4 -technology = FFF -family = NEPTUNE -bed_model = -bed_texture = -default_materials = Generic PLA @ELEGOO; Generic PETG @ELEGOO; Generic ABS @ELEGOO - -[printer_model:NEPTUNE2S] -name = Elegoo Neptune-2S -variants = 0.4 -technology = FFF -family = NEPTUNE -bed_model = -bed_texture = -default_materials = Generic PLA @ELEGOO; Generic PETG @ELEGOO; Generic ABS @ELEGOO - -[printer_model:NEPTUNE3] -name = Elegoo Neptune-3 -variants = 0.4 -technology = FFF -family = NEPTUNE -bed_model = -bed_texture = -default_materials = Generic PLA @ELEGOO; Generic PETG @ELEGOO; Generic ABS @ELEGOO - -[printer_model:NEPTUNEX] -name = Elegoo Neptune-X -variants = 0.4 -technology = FFF -family = NEPTUNE -bed_model = -bed_texture = -default_materials = Generic PLA @ELEGOO; Generic PETG @ELEGOO; Generic ABS @ELEGOO - -# All presets starting with asterisk, for example *common*, are intermediate and they will -# not make it into the user interface. - -# Common print preset -[print:*common*] -avoid_crossing_perimeters = 0 -bridge_angle = 0 -bridge_flow_ratio = 0.95 -bridge_speed = 25 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -complete_objects = 0 -dont_support_bridges = 1 -elefant_foot_compensation = 0.1 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeters_first = 0 -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 25 -extra_perimeters = 0 -extruder_clearance_height = 25 -extruder_clearance_radius = 45 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = grid -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 20 -gap_fill_speed = 30 -gcode_comments = 0 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 50 -interface_shells = 0 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -overhangs = 0 -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = {input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode -perimeters = 2 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 40 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -single_extruder_multi_material_priming = 0 -skirts = 1 -skirt_distance = 2 -skirt_height = 2 -small_perimeter_speed = 25 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 40 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.38 -support_material_interface_extruder = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_enforce_layers = 0 -support_material_contact_distance = 0.15 -support_material_interface_contact_loops = 0 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 40 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 30 -travel_speed = 150 -wipe_tower = 0 -wipe_tower_bridging = 10 -wipe_tower_rotation_angle = 0 -wipe_tower_width = 60 -wipe_tower_x = 170 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:*0.08mm*] -inherits = *common* -layer_height = 0.08 -perimeters = 3 -bottom_solid_layers = 9 -top_solid_layers = 11 - -[print:*0.10mm*] -inherits = *common* -layer_height = 0.1 -perimeters = 3 -bottom_solid_layers = 7 -top_solid_layers = 9 - -[print:*0.12mm*] -inherits = *common* -layer_height = 0.12 -perimeters = 3 -bottom_solid_layers = 6 -top_solid_layers = 7 - -[print:*0.16mm*] -inherits = *common* -layer_height = 0.16 -bottom_solid_layers = 5 -top_solid_layers = 7 - -[print:*0.20mm*] -inherits = *common* -layer_height = 0.20 -bottom_solid_layers = 4 -top_solid_layers = 5 - -[print:*0.24mm*] -inherits = *common* -layer_height = 0.24 -top_infill_extrusion_width = 0.45 -bottom_solid_layers = 3 -top_solid_layers = 4 - -[print:*0.28mm*] -inherits = *common* -layer_height = 0.28 -top_infill_extrusion_width = 0.45 -bottom_solid_layers = 3 -top_solid_layers = 4 - -[print:0.08mm SUPERDETAIL @ELEGOO] -inherits = *0.08mm* -compatible_printers_condition = printer_model=~/(NEPTUNE).*/ and nozzle_diameter[0]==0.4 - -[print:0.10mm HIGHDETAIL @ELEGOO] -inherits = *0.10mm* -compatible_printers_condition = printer_model=~/(NEPTUNE).*/ and nozzle_diameter[0]==0.4 - -[print:0.12mm DETAIL @ELEGOO] -inherits = *0.12mm* -compatible_printers_condition = printer_model=~/(NEPTUNE).*/ and nozzle_diameter[0]==0.4 - -[print:0.16mm OPTIMAL @ELEGOO] -inherits = *0.16mm* -compatible_printers_condition = printer_model=~/(NEPTUNE).*/ and nozzle_diameter[0]==0.4 - -[print:0.20mm NORMAL @ELEGOO] -inherits = *0.20mm* -compatible_printers_condition = printer_model=~/(NEPTUNE).*/ and nozzle_diameter[0]==0.4 - -[print:0.24mm DRAFT @ELEGOO] -inherits = *0.24mm* -compatible_printers_condition = printer_model=~/(NEPTUNE).*/ and nozzle_diameter[0]==0.4 - -[print:0.28mm SUPERDRAFT @ELEGOO] -inherits = *0.28mm* -compatible_printers_condition = printer_model=~/(NEPTUNE).*/ and nozzle_diameter[0]==0.4 - -# When submitting new filaments please print the following temperature tower at 0.1mm layer height: -# https://www.thingiverse.com/thing:2615842 -# Pay particular attention to bridging, overhangs and retractions. -# Also print the following bed adhesion test at 0.1 layer height as well: -# https://www.prusaprinters.org/prints/4634-bed-adhesion-warp-test -# At least for PLA, please keep bed temp at 60, as many Elegoo printers do not have any ABL -# So having some leeway to get good bed adhesion is not a luxury for many users - -[filament:*common*] -cooling = 0 -compatible_printers = -extrusion_multiplier = 1 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_notes = "" -filament_settings_id = "" -filament_soluble = 0 -min_print_speed = 15 -slowdown_below_layer_time = 20 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ELEGOO.*/ - -[filament:*PLA*] -inherits = *common* -bed_temperature = 60 -fan_below_layer_time = 100 -filament_colour = #DDDDDD -filament_max_volumetric_speed = 15 -filament_type = PLA -filament_density = 1.24 -filament_cost = 20 -first_layer_bed_temperature = 60 -first_layer_temperature = 210 -fan_always_on = 1 -cooling = 1 -max_fan_speed = 100 -min_fan_speed = 100 -bridge_fan_speed = 100 -disable_fan_first_layers = 1 -temperature = 205 - -[filament:*PET*] -inherits = *common* -bed_temperature = 70 -cooling = 1 -disable_fan_first_layers = 3 -fan_below_layer_time = 20 -filament_colour = #DDDDDD -filament_max_volumetric_speed = 8 -filament_type = PETG -filament_density = 1.27 -filament_cost = 20 -first_layer_bed_temperature = 70 -first_layer_temperature = 240 -fan_always_on = 1 -max_fan_speed = 50 -min_fan_speed = 20 -bridge_fan_speed = 100 -temperature = 240 - -[filament:*ABS*] -inherits = *common* -bed_temperature = 100 -cooling = 0 -disable_fan_first_layers = 3 -fan_below_layer_time = 20 -filament_colour = #DDDDDD -filament_max_volumetric_speed = 11 -filament_type = ABS -filament_density = 1.04 -filament_cost = 20 -first_layer_bed_temperature = 100 -first_layer_temperature = 245 -fan_always_on = 0 -max_fan_speed = 0 -min_fan_speed = 0 -bridge_fan_speed = 30 -top_fan_speed = 0 -temperature = 245 - -[filament:Generic PLA @ELEGOO] -inherits = *PLA* -filament_vendor = Generic - -[filament:Generic PETG @ELEGOO] -inherits = *PET* -filament_vendor = Generic - -[filament:Generic ABS @ELEGOO] -inherits = *ABS* -first_layer_bed_temperature = 90 -bed_temperature = 90 -filament_vendor = Generic - -# Common printer preset -[printer:*common*] -printer_technology = FFF -before_layer_gcode = ;BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z]\n\n -bed_shape = 0x0,235x0,235x235,0x235 -between_objects_gcode = -pause_print_gcode = -deretract_speed = 0 -extruder_colour = #FCE94F -extruder_offset = 0x0 -gcode_flavor = marlin -silent_mode = 0 -remaining_times = 0 -machine_max_acceleration_e = 5000 -machine_max_acceleration_extruding = 500 -machine_max_acceleration_retracting = 1000 -machine_max_acceleration_x = 500 -machine_max_acceleration_y = 500 -machine_max_acceleration_z = 100 -machine_max_feedrate_e = 60 -machine_max_feedrate_x = 500 -machine_max_feedrate_y = 500 -machine_max_feedrate_z = 10 -machine_max_jerk_e = 5 -machine_max_jerk_x = 8 -machine_max_jerk_y = 8 -machine_max_jerk_z = 0.4 -machine_min_extruding_rate = 0 -machine_min_travel_rate = 0 -layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z] -max_layer_height = 0.3 -min_layer_height = 0.07 -max_print_height = 250 -nozzle_diameter = 0.4 -printer_notes = -printer_settings_id = -retract_before_travel = 1 -retract_before_wipe = 0% -retract_layer_change = 1 -retract_length = 1 -retract_length_toolchange = 1 -retract_lift = 0 -retract_lift_above = 0 -retract_lift_below = 0 -retract_restart_extra = 0 -retract_restart_extra_toolchange = 0 -retract_speed = 35 -single_extruder_multi_material = 0 -thumbnails = 16x16,220x124 -toolchange_gcode = -use_firmware_retraction = 0 -use_relative_e_distances = 1 -use_volumetric_e = 0 -variable_layer_height = 1 -wipe = 1 -z_offset = 0 -printer_model = -default_print_profile = 0.16mm OPTIMAL @ELEGOO -default_filament_profile = Generic PLA @ELEGOO - -[printer:Elegoo Neptune-2] -inherits = *common* -printer_model = NEPTUNE2 -printer_variant = 0.4 -max_layer_height = 0.28 -min_layer_height = 0.08 -printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ELEGOO\nPRINTER_MODEL_NEPTUNE2\nPRINTER_HAS_BOWDEN -max_print_height = 250 -machine_max_acceleration_e = 5000 -machine_max_acceleration_extruding = 500 -machine_max_acceleration_retracting = 1000 -machine_max_acceleration_x = 500 -machine_max_acceleration_y = 500 -machine_max_acceleration_z = 100 -machine_max_feedrate_e = 60 -machine_max_feedrate_x = 500 -machine_max_feedrate_y = 500 -machine_max_feedrate_z = 10 -machine_max_jerk_e = 5 -machine_max_jerk_x = 8 -machine_max_jerk_y = 8 -machine_max_jerk_z = 0.4 -machine_min_extruding_rate = 0 -machine_min_travel_rate = 0 -nozzle_diameter = 0.4 -retract_before_travel = 2 -retract_length = 5 -retract_speed = 60 -deretract_speed = 40 -retract_before_wipe = 70% -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[first_layer_bed_temperature] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set final nozzle temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp to stabilize\nM109 S[first_layer_temperature] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0 -end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+70, max_print_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < max_print_height*0.6}G1 Z{max_print_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors - - -# Intended for printers with a smaller bed -# [printer:*fastabl*] -# start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[first_layer_bed_temperature] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set final nozzle temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp to stabilize\nM109 S[first_layer_temperature] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0 - -# Intended for printers with a larger bed -# [printer:*slowabl*] -# start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[first_layer_bed_temperature] ; set final bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp to stabilize\nG28 ; home all axis\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set final nozzle temp\nM109 S[first_layer_temperature] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0 - -# Intended for printers with vendor official firmware verified to support M25 -# [printer:*pauseprint*] -# pause_print_gcode = M25 ; pause print - -# Intended for printers where the Z-axis lowers the print bed during printing -# [printer:*invertedz*] -# end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print bed down\nG1 X50 Y50 F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+max_print_height-10} F600{endif} ; Move print bed down further down\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors - -# Intended for printers with dual extruders and a single hotend/nozzle -[printer:*dualextruder*] -single_extruder_multi_material = 1 -cooling_tube_length = 23 -cooling_tube_retraction = 35 -extra_loading_move = -2 -parking_pos_retraction = 80 -deretract_speed = 40,40 -extruder_colour = #0080C0;#FFFF9F -extruder_offset = 0x0,0x0 -max_layer_height = 0.28,0.28 -min_layer_height = 0.08,0.08 -nozzle_diameter = 0.4,0.4 -retract_before_travel = 2,2 -retract_before_wipe = 70%,70% -retract_layer_change = 1,1 -retract_length = 5,5 -retract_length_toolchange = 1,1 -retract_lift = 0,0 -retract_lift_above = 0,0 -retract_lift_below = 0,0 -retract_restart_extra = 0,0 -retract_restart_extra_toolchange = 0,0 -retract_speed = 60,60 -wipe = 1,1 -start_gcode = T[initial_tool] ; set active extruder\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM140 S{first_layer_bed_temperature[0]} ; set final bed temp\nM104 S150 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\n;G29 ; auto bed levelling - remove ; at beginning of line to enable\n;M420 S1 ; enable mesh - remove ; at beginning of line to enable\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S{first_layer_temperature[0]} ; set final nozzle temp\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp to stabilize\nM109 S{first_layer_temperature[0]} ; wait for nozzle temp to stabilize\nG1 Z0.28 F240 ; move down to prime nozzle\nG92 E0 ; reset extruder\nG1 E90 ; load filament\nG92 E0 ; reset extruder\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000 ; move over for second prime line\nG92 E0 ; reset extruder\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0 ; reset extruder -end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\nG1 E-80 F2000 ; unload filament\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+70, max_print_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < max_print_height*0.6}G1 Z{max_print_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors - -# Copy of Creality CR-X config for the Neptune 2D (dual extruder, single hotend) - -[printer:Elegoo Neptune-2D] -inherits = Elegoo Neptune-2; *dualextruder* -retract_length = 6,6 -printer_model = NEPTUNE2D -printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ELEGOO\nPRINTER_MODEL_NEPTUNE2D\nPRINTER_HAS_BOWDEN - -[printer:Elegoo Neptune-2S] -inherits = Elegoo Neptune-2 -printer_model = NEPTUNE2S -printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ELEGOO\nPRINTER_MODEL_NEPTUNE2D\nPRINTER_HAS_BOWDEN - -[printer:Elegoo Neptune-X] -inherits = Elegoo Neptune-2 -max_print_height = 300 -printer_model = NEPTUNEX -printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ELEGOO\nPRINTER_MODEL_NEPTUNE2D\nPRINTER_HAS_BOWDEN - -[printer:Elegoo Neptune-3] -inherits = Elegoo Neptune-2 -max_print_height = 280 -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[first_layer_bed_temperature] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\nG29 ; run abl mesh\nM420 S1 ; load mesh\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set final nozzle temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp to stabilize\nM109 S[first_layer_temperature] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0 -printer_model = NEPTUNE3 -printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ELEGOO\nPRINTER_MODEL_NEPTUNE2D\nPRINTER_HAS_BOWDEN - -[printer:Elegoo Neptune-1] -inherits = Elegoo Neptune-2 -bed_shape = 0x0,210x0,210x210,0x210 -max_print_height = 200 -printer_model = NEPTUNE1 -printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ELEGOO\nPRINTER_MODEL_NEPTUNE2D\nPRINTER_HAS_BOWDEN +# PrusaSlicer print profiles for the Elegoo printers. +# By Andrew Suzuki (andrewsuzuki.com), adapted from Creality.ini + +[vendor] +# Vendor name will be shown by the Config Wizard. +name = Elegoo +# Configuration version of this file. Config file will only be installed, if the config_version differs. +# This means, the server may force the PrusaSlicer configuration to be downgraded. +config_version = 1.0.3 +config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Elegoo/ + +# The printer models will be shown by the Configuration Wizard in this order, +# also the first model installed & the first nozzle installed will be activated after install. +# Printer model name will be shown by the installation wizard. + +[printer_model:NEPTUNE1] +name = Elegoo Neptune-1 +variants = 0.4 +technology = FFF +family = NEPTUNE +bed_model = +bed_texture = +default_materials = Generic PLA @ELEGOO; Generic PETG @ELEGOO; Generic ABS @ELEGOO + +[printer_model:NEPTUNE2] +name = Elegoo Neptune-2 +variants = 0.4 +technology = FFF +family = NEPTUNE +bed_model = +bed_texture = +default_materials = Generic PLA @ELEGOO; Generic PETG @ELEGOO; Generic ABS @ELEGOO + +[printer_model:NEPTUNE2D] +name = Elegoo Neptune-2D +variants = 0.4 +technology = FFF +family = NEPTUNE +bed_model = +bed_texture = +default_materials = Generic PLA @ELEGOO; Generic PETG @ELEGOO; Generic ABS @ELEGOO + +[printer_model:NEPTUNE2S] +name = Elegoo Neptune-2S +variants = 0.4 +technology = FFF +family = NEPTUNE +bed_model = +bed_texture = +default_materials = Generic PLA @ELEGOO; Generic PETG @ELEGOO; Generic ABS @ELEGOO + +[printer_model:NEPTUNE3] +name = Elegoo Neptune-3 +variants = 0.4 +technology = FFF +family = NEPTUNE +bed_model = +bed_texture = +default_materials = Generic PLA @ELEGOO; Generic PETG @ELEGOO; Generic ABS @ELEGOO + +[printer_model:NEPTUNE3MAX] +name = Elegoo Neptune-3 Max +variants = 0.4 +technology = FFF +family = NEPTUNE +bed_model = +bed_texture = +default_materials = Generic PLA @ELEGOO; Generic PETG @ELEGOO; Generic ABS @ELEGOO + +[printer_model:NEPTUNE3PLUS] +name = Elegoo Neptune-3 Plus +variants = 0.4 +technology = FFF +family = NEPTUNE +bed_model = +bed_texture = +default_materials = Generic PLA @ELEGOO; Generic PETG @ELEGOO; Generic ABS @ELEGOO + +[printer_model:NEPTUNE3PRO] +name = Elegoo Neptune-3 Pro +variants = 0.4 +technology = FFF +family = NEPTUNE +bed_model = +bed_texture = +default_materials = Generic PLA @ELEGOO; Generic PETG @ELEGOO; Generic ABS @ELEGOO + +[printer_model:NEPTUNEX] +name = Elegoo Neptune-X +variants = 0.4 +technology = FFF +family = NEPTUNE +bed_model = +bed_texture = +default_materials = Generic PLA @ELEGOO; Generic PETG @ELEGOO; Generic ABS @ELEGOO + +# All presets starting with asterisk, for example *common*, are intermediate and they will +# not make it into the user interface. + +# Common print preset +[print:*common*] +avoid_crossing_perimeters = 0 +bridge_angle = 0 +bridge_flow_ratio = 0.95 +bridge_speed = 25 +brim_width = 0 +clip_multipart_objects = 1 +compatible_printers = +complete_objects = 0 +dont_support_bridges = 1 +elefant_foot_compensation = 0.1 +ensure_vertical_shell_thickness = 1 +external_fill_pattern = rectilinear +external_perimeters_first = 0 +external_perimeter_extrusion_width = 0.45 +external_perimeter_speed = 25 +extra_perimeters = 0 +extruder_clearance_height = 25 +extruder_clearance_radius = 45 +extrusion_width = 0.45 +fill_angle = 45 +fill_density = 20% +fill_pattern = grid +first_layer_extrusion_width = 0.42 +first_layer_height = 0.2 +first_layer_speed = 20 +gap_fill_speed = 30 +gcode_comments = 0 +infill_every_layers = 1 +infill_extruder = 1 +infill_extrusion_width = 0.45 +infill_first = 0 +infill_only_where_needed = 0 +infill_overlap = 25% +infill_speed = 50 +interface_shells = 0 +max_print_speed = 100 +max_volumetric_extrusion_rate_slope_negative = 0 +max_volumetric_extrusion_rate_slope_positive = 0 +max_volumetric_speed = 0 +min_skirt_length = 4 +notes = +overhangs = 0 +only_retract_when_crossing_perimeters = 0 +ooze_prevention = 0 +output_filename_format = {input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode +perimeters = 2 +perimeter_extruder = 1 +perimeter_extrusion_width = 0.45 +perimeter_speed = 40 +post_process = +print_settings_id = +raft_layers = 0 +resolution = 0 +seam_position = nearest +single_extruder_multi_material_priming = 0 +skirts = 1 +skirt_distance = 2 +skirt_height = 2 +small_perimeter_speed = 25 +solid_infill_below_area = 0 +solid_infill_every_layers = 0 +solid_infill_extruder = 1 +solid_infill_extrusion_width = 0.45 +solid_infill_speed = 40 +spiral_vase = 0 +standby_temperature_delta = -5 +support_material = 0 +support_material_extruder = 0 +support_material_extrusion_width = 0.38 +support_material_interface_extruder = 0 +support_material_angle = 0 +support_material_buildplate_only = 0 +support_material_enforce_layers = 0 +support_material_contact_distance = 0.15 +support_material_interface_contact_loops = 0 +support_material_interface_layers = 2 +support_material_interface_spacing = 0.2 +support_material_interface_speed = 100% +support_material_pattern = rectilinear +support_material_spacing = 2 +support_material_speed = 40 +support_material_synchronize_layers = 0 +support_material_threshold = 45 +support_material_with_sheath = 0 +support_material_xy_spacing = 60% +thin_walls = 0 +top_infill_extrusion_width = 0.4 +top_solid_infill_speed = 30 +travel_speed = 150 +wipe_tower = 0 +wipe_tower_bridging = 10 +wipe_tower_rotation_angle = 0 +wipe_tower_width = 60 +wipe_tower_x = 170 +wipe_tower_y = 140 +xy_size_compensation = 0 + +[print:*0.08mm*] +inherits = *common* +layer_height = 0.08 +perimeters = 3 +bottom_solid_layers = 9 +top_solid_layers = 11 + +[print:*0.10mm*] +inherits = *common* +layer_height = 0.1 +perimeters = 3 +bottom_solid_layers = 7 +top_solid_layers = 9 + +[print:*0.12mm*] +inherits = *common* +layer_height = 0.12 +perimeters = 3 +bottom_solid_layers = 6 +top_solid_layers = 7 + +[print:*0.16mm*] +inherits = *common* +layer_height = 0.16 +bottom_solid_layers = 5 +top_solid_layers = 7 + +[print:*0.20mm*] +inherits = *common* +layer_height = 0.20 +bottom_solid_layers = 4 +top_solid_layers = 5 + +[print:*0.24mm*] +inherits = *common* +layer_height = 0.24 +top_infill_extrusion_width = 0.45 +bottom_solid_layers = 3 +top_solid_layers = 4 + +[print:*0.28mm*] +inherits = *common* +layer_height = 0.28 +top_infill_extrusion_width = 0.45 +bottom_solid_layers = 3 +top_solid_layers = 4 + +[print:0.08mm SUPERDETAIL @ELEGOO] +inherits = *0.08mm* +compatible_printers_condition = printer_model=~/(NEPTUNE).*/ and nozzle_diameter[0]==0.4 + +[print:0.10mm HIGHDETAIL @ELEGOO] +inherits = *0.10mm* +compatible_printers_condition = printer_model=~/(NEPTUNE).*/ and nozzle_diameter[0]==0.4 + +[print:0.12mm DETAIL @ELEGOO] +inherits = *0.12mm* +compatible_printers_condition = printer_model=~/(NEPTUNE).*/ and nozzle_diameter[0]==0.4 + +[print:0.16mm OPTIMAL @ELEGOO] +inherits = *0.16mm* +compatible_printers_condition = printer_model=~/(NEPTUNE).*/ and nozzle_diameter[0]==0.4 + +[print:0.20mm NORMAL @ELEGOO] +inherits = *0.20mm* +compatible_printers_condition = printer_model=~/(NEPTUNE).*/ and nozzle_diameter[0]==0.4 + +[print:0.24mm DRAFT @ELEGOO] +inherits = *0.24mm* +compatible_printers_condition = printer_model=~/(NEPTUNE).*/ and nozzle_diameter[0]==0.4 + +[print:0.28mm SUPERDRAFT @ELEGOO] +inherits = *0.28mm* +compatible_printers_condition = printer_model=~/(NEPTUNE).*/ and nozzle_diameter[0]==0.4 + +# When submitting new filaments please print the following temperature tower at 0.1mm layer height: +# https://www.thingiverse.com/thing:2615842 +# Pay particular attention to bridging, overhangs and retractions. +# Also print the following bed adhesion test at 0.1 layer height as well: +# https://www.prusaprinters.org/prints/4634-bed-adhesion-warp-test +# At least for PLA, please keep bed temp at 60, as many Elegoo printers do not have any ABL +# So having some leeway to get good bed adhesion is not a luxury for many users + +[filament:*common*] +cooling = 0 +compatible_printers = +extrusion_multiplier = 1 +filament_cost = 0 +filament_density = 0 +filament_diameter = 1.75 +filament_notes = "" +filament_settings_id = "" +filament_soluble = 0 +min_print_speed = 15 +slowdown_below_layer_time = 20 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ELEGOO.*/ + +[filament:*PLA*] +inherits = *common* +bed_temperature = 60 +fan_below_layer_time = 100 +filament_colour = #DDDDDD +filament_max_volumetric_speed = 15 +filament_type = PLA +filament_density = 1.24 +filament_cost = 20 +first_layer_bed_temperature = 60 +first_layer_temperature = 210 +fan_always_on = 1 +cooling = 1 +max_fan_speed = 100 +min_fan_speed = 100 +bridge_fan_speed = 100 +disable_fan_first_layers = 1 +temperature = 205 + +[filament:*PET*] +inherits = *common* +bed_temperature = 70 +cooling = 1 +disable_fan_first_layers = 3 +fan_below_layer_time = 20 +filament_colour = #DDDDDD +filament_max_volumetric_speed = 8 +filament_type = PETG +filament_density = 1.27 +filament_cost = 20 +first_layer_bed_temperature = 70 +first_layer_temperature = 240 +fan_always_on = 1 +max_fan_speed = 50 +min_fan_speed = 20 +bridge_fan_speed = 100 +temperature = 240 + +[filament:*ABS*] +inherits = *common* +bed_temperature = 100 +cooling = 0 +disable_fan_first_layers = 3 +fan_below_layer_time = 20 +filament_colour = #DDDDDD +filament_max_volumetric_speed = 11 +filament_type = ABS +filament_density = 1.04 +filament_cost = 20 +first_layer_bed_temperature = 100 +first_layer_temperature = 245 +fan_always_on = 0 +max_fan_speed = 0 +min_fan_speed = 0 +bridge_fan_speed = 30 +top_fan_speed = 0 +temperature = 245 + +[filament:Generic PLA @ELEGOO] +inherits = *PLA* +filament_vendor = Generic + +[filament:Generic PETG @ELEGOO] +inherits = *PET* +filament_vendor = Generic + +[filament:Generic ABS @ELEGOO] +inherits = *ABS* +first_layer_bed_temperature = 90 +bed_temperature = 90 +filament_vendor = Generic + +[filament:Eolas Prints PLA @ELEGOO] +inherits = *PLA* +filament_vendor = Eolas Prints +filament_cost = 23.50 +filament_density = 1.24 +filament_spool_weight = 0 +filament_colour = #4D9398 +first_layer_bed_temperature = 65 +first_layer_temperature = 208 +temperature = 202 + +[filament:Eolas Prints PLA Matte @ELEGOO] +inherits = Eolas Prints PLA @ELEGOO +filament_cost = 25.50 +filament_max_volumetric_speed = 14 +temperature = 210 + +[filament:Eolas Prints INGEO 850 @ELEGOO] +inherits = Eolas Prints PLA @ELEGOO +filament_cost = 25.90 +temperature = 210 + +[filament:Eolas Prints INGEO 870 @ELEGOO] +inherits = Eolas Prints PLA @ELEGOO +filament_cost = 25.90 +temperature = 215 +first_layer_bed_temperature = 68 +first_layer_temperature = 220 +bed_temperature = 65 + +[filament:Eolas Prints PETG @ELEGOO] +inherits = *PET* +filament_vendor = Eolas Prints +filament_cost = 29.90 +filament_density = 1.27 +filament_spool_weight = 0 +filament_colour = #4D9398 +temperature = 240 +first_layer_bed_temperature = 85 +first_layer_temperature = 235 +bed_temperature = 90 + +[filament:Eolas Prints PETG - UV Resistant @ELEGOO] +inherits = Eolas Prints PETG @ELEGOO +filament_cost = 35.90 +temperature = 242 +first_layer_temperature = 237 + +# Common printer preset +[printer:*common*] +printer_technology = FFF +before_layer_gcode = ;BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z]\n\n +bed_shape = 0x0,220x0,220x220,0x220 +between_objects_gcode = +pause_print_gcode = +deretract_speed = 0 +extruder_colour = #FCE94F +extruder_offset = 0x0 +gcode_flavor = marlin +silent_mode = 0 +remaining_times = 0 +machine_max_acceleration_e = 5000 +machine_max_acceleration_extruding = 500 +machine_max_acceleration_retracting = 1000 +machine_max_acceleration_x = 500 +machine_max_acceleration_y = 500 +machine_max_acceleration_z = 100 +machine_max_feedrate_e = 60 +machine_max_feedrate_x = 500 +machine_max_feedrate_y = 500 +machine_max_feedrate_z = 10 +machine_max_jerk_e = 5 +machine_max_jerk_x = 8 +machine_max_jerk_y = 8 +machine_max_jerk_z = 0.4 +machine_min_extruding_rate = 0 +machine_min_travel_rate = 0 +layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z] +max_layer_height = 0.3 +min_layer_height = 0.07 +max_print_height = 250 +nozzle_diameter = 0.4 +printer_notes = +printer_settings_id = +retract_before_travel = 1 +retract_before_wipe = 0% +retract_layer_change = 1 +retract_length = 1 +retract_length_toolchange = 1 +retract_lift = 0 +retract_lift_above = 0 +retract_lift_below = 0 +retract_restart_extra = 0 +retract_restart_extra_toolchange = 0 +retract_speed = 35 +single_extruder_multi_material = 0 +thumbnails = 16x16,220x124 +toolchange_gcode = +use_firmware_retraction = 0 +use_relative_e_distances = 1 +use_volumetric_e = 0 +variable_layer_height = 1 +wipe = 1 +z_offset = 0 +printer_model = +default_print_profile = 0.16mm OPTIMAL @ELEGOO +default_filament_profile = Generic PLA @ELEGOO + +[printer:Elegoo Neptune-2] +inherits = *common* +printer_model = NEPTUNE2 +printer_variant = 0.4 +max_layer_height = 0.28 +min_layer_height = 0.08 +printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ELEGOO\nPRINTER_MODEL_NEPTUNE2\nPRINTER_HAS_BOWDEN +max_print_height = 250 +machine_max_acceleration_e = 5000 +machine_max_acceleration_extruding = 500 +machine_max_acceleration_retracting = 1000 +machine_max_acceleration_x = 500 +machine_max_acceleration_y = 500 +machine_max_acceleration_z = 100 +machine_max_feedrate_e = 60 +machine_max_feedrate_x = 500 +machine_max_feedrate_y = 500 +machine_max_feedrate_z = 10 +machine_max_jerk_e = 5 +machine_max_jerk_x = 8 +machine_max_jerk_y = 8 +machine_max_jerk_z = 0.4 +machine_min_extruding_rate = 0 +machine_min_travel_rate = 0 +nozzle_diameter = 0.4 +retract_before_travel = 2 +retract_length = 5 +retract_speed = 60 +deretract_speed = 40 +retract_before_wipe = 70% +start_gcode = M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[first_layer_bed_temperature] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set final nozzle temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp to stabilize\nM109 S[first_layer_temperature] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0 +end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+70, max_print_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < max_print_height*0.6}G1 Z{max_print_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors + +# Intended for printers with dual extruders and a single hotend/nozzle +[printer:*dualextruder*] +single_extruder_multi_material = 1 +cooling_tube_length = 23 +cooling_tube_retraction = 35 +extra_loading_move = -2 +parking_pos_retraction = 80 +deretract_speed = 40,40 +extruder_colour = #0080C0;#FFFF9F +extruder_offset = 0x0,0x0 +max_layer_height = 0.28,0.28 +min_layer_height = 0.08,0.08 +nozzle_diameter = 0.4,0.4 +retract_before_travel = 2,2 +retract_before_wipe = 70%,70% +retract_layer_change = 1,1 +retract_length = 5,5 +retract_length_toolchange = 1,1 +retract_lift = 0,0 +retract_lift_above = 0,0 +retract_lift_below = 0,0 +retract_restart_extra = 0,0 +retract_restart_extra_toolchange = 0,0 +retract_speed = 60,60 +wipe = 1,1 +start_gcode = T[initial_tool] ; set active extruder\nM413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM140 S{first_layer_bed_temperature[0]} ; set final bed temp\nM104 S150 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\n;G29 ; auto bed levelling - remove ; at beginning of line to enable\n;M420 S1 ; enable mesh - remove ; at beginning of line to enable\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S{first_layer_temperature[0]} ; set final nozzle temp\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp to stabilize\nM109 S{first_layer_temperature[0]} ; wait for nozzle temp to stabilize\nG1 Z0.28 F240 ; move down to prime nozzle\nG92 E0 ; reset extruder\nG1 E90 ; load filament\nG92 E0 ; reset extruder\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000 ; move over for second prime line\nG92 E0 ; reset extruder\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0 ; reset extruder +end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\nG1 E-80 F2000 ; unload filament\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+70, max_print_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < max_print_height*0.6}G1 Z{max_print_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors + +# Copy of Creality CR-X config for the Neptune 2D (dual extruder, single hotend) + +[printer:Elegoo Neptune-2D] +inherits = Elegoo Neptune-2; *dualextruder* +retract_length = 6,6 +printer_model = NEPTUNE2D +printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ELEGOO\nPRINTER_MODEL_NEPTUNE2D + +[printer:Elegoo Neptune-2S] +inherits = Elegoo Neptune-2 +printer_model = NEPTUNE2S +printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ELEGOO\nPRINTER_MODEL_NEPTUNE2S + +[printer:Elegoo Neptune-X] +inherits = Elegoo Neptune-2 +max_print_height = 300 +printer_model = NEPTUNEX +printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ELEGOO\nPRINTER_MODEL_NEPTUNEX + +[printer:Elegoo Neptune-3] +inherits = Elegoo Neptune-2 +max_print_height = 280 +start_gcode = M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[first_layer_bed_temperature] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\n;G29 ; run abl mesh\nM420 S1 ; load mesh\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set final nozzle temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp to stabilize\nM109 S[first_layer_temperature] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0 +printer_model = NEPTUNE3 +printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ELEGOO\nPRINTER_MODEL_NEPTUNE3 + +[printer:Elegoo Neptune-1] +inherits = Elegoo Neptune-2 +bed_shape = 0x0,210x0,210x210,0x210 +max_print_height = 200 +printer_model = NEPTUNE1 +printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ELEGOO\nPRINTER_MODEL_NEPTUNE1 + +[printer:Elegoo Neptune-3 Max] +inherits = Elegoo Neptune-3 +retract_length = 2.5 +retract_speed = 25 +bed_shape = 0x0,420x0,420x420,0x420 +max_print_height = 500 +printer_model = NEPTUNE3MAX +printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ELEGOO\nPRINTER_MODEL_NEPTUNE3MAX + +[printer:Elegoo Neptune-3 Plus] +inherits = Elegoo Neptune-3 +retract_length = 2.5 +retract_speed = 25 +bed_shape = 0x0,320x0,320x320,0x320 +max_print_height = 400 +printer_model = NEPTUNE3PLUS +printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ELEGOO\nPRINTER_MODEL_NEPTUNE3PLUS + +[printer:Elegoo Neptune-3 Pro] +inherits = Elegoo Neptune-3 +bed_shape = 0x0,225x0,225x225,0x225 +max_print_height = 280 +retract_length = 2.5 +retract_speed = 25 +printer_model = NEPTUNE3PRO +printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ELEGOO\nPRINTER_MODEL_NEPTUNE3PRO + diff --git a/resources/profiles/Elegoo/NEPTUNE3MAX_thumbnail.png b/resources/profiles/Elegoo/NEPTUNE3MAX_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..5b429ac32ab0f0ac6cb208629ff387d6b1f1162d GIT binary patch literal 40643 zcmXte1yEc)+x7yBEbi{^?z%|P;_mKR+*uq-af-W3vEnYpp-6GJ7I$|(o_GHL?3_6} znMradxg?X^(JD$ZD2RlJ0000*PF70oDI8~g(RsA7FJbllZUy~tf$ zovmygEXmz{Tr9~gy=|=k0PmIREZZbvzNGN?U2HdCZ#@}&)$*E2oY~D+_9|(EIh~;wxTIrscU>P4$hMaFCkvI@~7r`*7ZM!0QY1!_8Yjkk!*0 z>%-RDOHAG-L2csV!=vfz7x9<3m*MB}DQ%~lEaR}3aoEd!^OGsGn%!r&>$^0J-xxLT z*Liotn|@v$_x@IVYNiBZ)@pe&tz<3RvB{cW&wuu7|8w4Ze(Dx9{*Bfnaka`O_NZ3? zk2JHH(C-y+ha@8@d5)v(v=D>Z{~5r}XRiD#8dKa^HSS zuUL2B+m|3j2kMYV7B};dUsF>oR;WRLwfsToKE`{u$;JgvpMD#qQs?Fne2xn1O+$C1 z@6&D|l=!-UFm3V|H(8Mq-L?5QIm@6L)uTz$K??^^oyU9nCgYDsNr zMt;X#@qJt}u2g6>q@Cv9Y`G@6ubCSrd7p`6Zgg$`X=)id-tsh`w$4s=oV2f=`DMGv z(s=zDEz9;@IkYx#Jsrw&>i)N|>eRDqJ=fpj5cK*aCdJ}kWW}cDYy3*U6R20^bmN2( z#-+ zds*wUSai1f!5bN+_1S>&&RtfyBgM8a#vJS-NPPD_~1H-7Y4CLwq0=F~4HKby+A5_k=g z*ah@lS77EEIe}_!>V`>~ev<>2ikjNWHh9n4p3x&RqAhYO;&QDghR1Sv(tF4UyP75x z)!Jqt4J#-btHtU&-#Vc=yga{2k)Pzw!VspB%`m=4G%cd_Jdt88^(OJ^IW6b zp0cVHr89}RtfX_OYl^ZZUH5yl)C7Ww=9>%64+3-;v;HdC8&H|f`syuk^8R!b_!?|9^@FMR zy5-DOjg~|s2tAG{j@`d&`15)5rQ5QY6(0+Zq>4Oteit%AMgl zIak2dAz~CbBNzPXjOAE?mZJJZEEiMHO65$Gva**WB}TRe@@9De1T{kox6dn_cG z!f~5{3G!0a_U0(15;0btd7oMll4^Xs=G&lDIqZ4;NiMgQVr6>A8*dyLTKk z8dPnsFg`C9+)GOq0`%9ZC=M7Aijdsx<{Wh$szxK-IsM)QqPC46$aYK0jP3IQ{rD|u zv(N4d4;u> z$Wrcc@h1v=_s>LISU=t7=RH8f1JGl-gszu04o_~KOn2K8lT02WUx2?Vh@yfKQ8(=a z{i2E3INyCWPet&yk*2WsU>GY_7}^@#pH-|q)(p<;oNr;M5*Z&xo!$>Ue(s23<@oWg zxeiP+Z0@df>wLw{XWyAngIhYF{1=@2G8q%i3j* z@&t7l#rqmP2BfrU*e6+xHw9_%`JF}4n>unFXLoJW4~WQt)0Y{+8{B@t{U@)tjayDQ;xukZ}Da^w%Q{HMX;^Z zhligL-N1yg2!B;}>7i4k_W#|1{po_vZgK|8WD!Rn zF@3zSC50<_gvm?KGv$yWT5xZkc74uEiP?~^!p#0E%qf1hSwbnC7*h=>;@Tl4sVIw@ zYjl($X3GfCNlG{uXzU5WcStvYHlKbb0o`4vr0_pE7{KjU@RzQ6)qIG8QC8vb#RFroV4{Hzm@_U}KBgYV%CcEXI&KQ+7WS*p^0sN;_ z{DdCE;fFI01rYTY6M}G+&R$lfmw#xcR7y1Vj8Z%`)pYt)l4HTwGNr<; z$isk}0G+5ETs4C=%lLIKn4^yAMa!N-DU`D5%MEEA_WhDz8dxi;>?GJI_CcuQq6@wM z065Iv)I3n3@*IkbB?l&>ws__ZCZ<6Ak~pN0{bwEoOP+5njd-O%j9(8_6eE=BoGu7B zC|iFr5)h2!moP?ywzkWELvBLt(cA%5P%dqYB5jQ9m82*%tFDDhvi|N|V|mb-bj*$C zr4eV5De~)H1$>FVf4TJ2rgjQt6;@f}|$3;(!92S~E&PlW=#v}w# zE~yj3rh`REYnl!7pScq#wRcDxq&$J%ek!j*s-El+8P`0$<{=2C$N*Lr6`cgHaY<1D z5-rR>-s$^GI5u_Ozea@%t+;HO6}g{SB+@k4xAAIJVvD_vx!?i?zV^l|^r3<+3>XPP zp?WOE$uYK4`LML>(&>q`EXs$w{jc9ZYW^cIe-8!6Jn|2@r-{008<81GN3N@~N)II8 zsYZxca0kiF@ROp7WR=1TU}j*($Z=c|*xYebp_c~hxWS>i3@_V7=W-a#cuh!2J#R_t zpknSBG|Xu={ko}|x}m=D&+&2{{aVno_O57dqgEOMKjq%FVFKF&4jx=(Trt1Hm9tSJ z>V6e5tA;Fg$2n6I4pI5Z;JOCln~6kYGlmRsX* zNWMO}SYyJ0v?vr(f;x>Y`JMrd6zcwK1^o0V$b)txzD`ylCK^8#xAshU^E+Rz;shq@ zNbCtl)xdqyc>w1f#)~_xx|j!9Pt{xW-tT8qjK%t<)xLAf^qi*oieDF&i!qv--~^%LBsRaFU{NE_uvC0c>>n&3PvG54HJg8Tu)wP{r*bcC zy8$9FtdyYFJ*d7ifNSg6VK=BVq@ga@|M6(SmFZ9jkKRg|!dj8mQN<-4w|+P`eeQ$G z=?H*+1;qh)>_Tr79bG3b(T1cczamjhz;nFaCjMB}e zv;XWS!-kCu&X090R7nqGh)BxGFO^twiw6csf2e>c1Br(a&so^PGx|yRr(N)-4oa>y zzCY?x9;PF1(=r^;=CvW63p!4$ibHkyRufh zzH>?9(-QH{j`&e%Bb>LNTu6cfJjA;DIB2@yDGHSWLkSaVVXGo>DZkebhhp|7N%%Ar zrvLFHlc*V25avUaI%C_==hek+~;l+g`MVF{%cJZWZ=6*w2g76qJUL` z3xMMZfHMfiu#O{{R~4>PbNz;cvK)Vvjw1=?r11`H3B%xUwzyT3CK2`=Cnu5Dx&lRK zeJA?Fje& zT@v$a_?@&T)F~7qw*yGC;l8&hA128+#j4!dQDdFD!(D>tr)dC-&7Uro%r24JNgnW3 zf4kL4zrtBTIqaJ#6-jVC0SH*6yo{DP+u`W&f=}mY*p=; z9AHomIS@nqU@qdBmARidG{iG`g02MoicC{X#}2J7%Ee~D#)(XIk1=|_c`Dwv{bf0y znR(ym1%v>cpmOhL+|enu(ElbsHH>}OASu~SqH)8dCTrE{>e0hsakPkgrAaws;azT} zhJ9$r(2wH^owmJGK&l*7O!vi89ia`7wLw)8h7?XSPw`E^YjvCL0aM%!BDRYm__;~Jk1|N7Fi zVj>58@{saMr5at_d@BB0C^G7Ru&X8;0=hj89zn?ZU6V83vR3GjJ(bvqooH}ERZ%oa z^UGpuT1}<^Lh-pB#-xIHItsS(2b{lzcZjb!kI=U^O~%gtCyo#yI_aXlz5zMQ(8!g zB>~Q|&W*i7L<{bsCl_|5ME&6d2|#g;>B|dpFTqi=acyz)-#^mnnb7dcRioF`8g|PF z!_{WoXDY}nSiKAgVZ})N4m-?OGDRb1mSRR_zn_O+5z$KoEBr%doAFW|?6QfW2>@c$ zi0#OPX5sw`NM|7%pC|MRQ%uYha`Yy~cmMLCeL|A6k?W6uk>NOdtTNw_9WM0@Jt0G6 zEXwd<8R^_eKrjAFnd}B*Dt#%Jr7I z^23{_SAGG2B*W_Pf}sVqsJHW`(Dbf%Qu)@>Y$56!;#xE|Utj11X0R1s#TD&vf`#NkuCPjQ$MW0vqZm zFWF72P`QF?8tqAk2T}hP$iTh`tuVhyTSN~}gP?1hfAk~Rpk>F0%?`#(gZJ(0JTQda zjDtRx5jurODFzG$H$n*{`BQH=huJdii9rLZOf_*a$na;ytysBAl6c8EF06o|DrWU@QuF{;mRg}as$B9C}BGABr zC|xy&DtbznIyLJD_)w(nm~KFkvNS_pXpvrs8Hze&;cgJ$Z8oq6UPjjK1v{Z#l_nwv zRX!H6F2X`&ulrsjksbF>0>y6J+|V-P&g6l$2Y~V(FvazC*q?H13oseYd1{wrOT=ua zUaT&RY4*D@I!DRKGyD!YLGX*^Lv*@2)lDTv-6*>c4cd>do-_RRl+IKz;3JEJ$b5H7 zm6AFC8H^1MleuYStZBocd0bCc`_xG2tIAEmy&TUN2D1&zt*`Z z36{y#DeQAzZMZv}9kd{y8Y`^+QB!h2eX0JB*k6={tJ7EHFzlRMmC@P#KNA^cP7t4} z#DLjESF4iC7KQCxM|r^!&hX#=D!>|sm<*jmz1?L}339lIDnh03h9ewZs5ffDRTUv- zFHwYzm=UOd6Bt4h;cZmi*bapJlKI>v!ML9Ua-a6Z%2dBm4q$Z^F%xMc51}L!CRB%K zCcUR_qUwyxqc8;fFiy>BvKOyI@KJ^&>b9%P7O2p%t;EU)m+Sn!TP{=aUT}TdhjUZZ z=FYx^ve((GsB2HfqwjXsMeFzhBPvUn+K zvsNh33DgolONw@Jp;@uvOAI_9(plf;!D_NGdY&Q9=hY-V zt9zqgEmquinmdxt7;Jf2ubM*HNd9wZd8w_6e&F1DH)T}#+|*VsNx5(EHJwv@CS`sg z(e4Y?g4`IrYIkih7iy0G!kvtw61k|f4BC;wh|#CRv;;%VeJXhyJB*gMd>~9?PYyQu zaraTHMsns9stZhNh#($UK(qhMKaaE<)mtBvdZY+%F6V5-))0C+Y3!7&Y;fkwTj`7)qB^7WmrLNFcbz z5LcH%d+k?=d~i5gL4kCrD;Y_CqNWOw*Rptv$6WB1W3}x&reO(=1Oac25$h;^PbgK|{uPwELos;j>tNp~oN7J(=hZ>n~AoDs@Vy~-9SxX)RyO(MKt`ZlCu zoxum2sh!5if8fsvYYVD4XA%W-C82OowJUMQg7oqQQ)Nvpvd=`X!4wU|9=xL=XkkJu zYk)v{iMl1_!ieaTUM^*Kul0gg^yuVc3@ef@WmD20hfuwrSM`mi{#-^?ckRr|g_-}w zz*Y>%UvCkJ5-a~v|NfxLPU`d8Qo7rP+a_8%RXtt(Cp&7Ut7%abXhUb!DGH;<@h!VC z=rcp0y-P|euG?3VP!10%Ya1l`3NFuy48{Ys1@%ajHZVy5K# z>I&`_7|PrrW6q@TKWotGqm?9G+1ErdFw8-D@D@ANJ?mz@_)|rPazR&^uDEngO7zPL zI+SsNTOGdnX@{0(gh?EgPr3!y&hwNHi-vlv8N>54+$N$Q4#VB$f~5t3#m0W?wupslsiC$lFqfFqSKheGn5OZ}=}=&Qn1U zXCZ;Gk@@-x1T16a^70?uVnT~S9o+P#Czt3^9%@zmFqph4zYxUjso}bl2LygzLfL+` zG6Vw6mPR!C(Ayfbj18=u6F<`(XC@QesGCD9k=~$klQQg~+iOq)YiW_=5F2U+XL*01 zRwL)UhHTU}2eRSzV+s2kO&?+^*x@8Pp8M~libN}SB~nERK9hsQ$2e3h^K%+2g6-E6 z8@sl@42YLg&b+9W#WBFB)YaUrl$N@xkki_)V7{+eST42n_08AxpvZYhpjqZCHKR(B zCYZB@Nu442fs_hspx`6aIzAgDMoAkfWb>!LelQs%_E$mqc+9xHz z>DWzc9s}$Ra6c18Dy(-rcJN_%=31QVur>PfW?fi;=MWiLrTfYEf}pII;-A^j4I!}> zvdrGt4o2d`4S_B~YrXD?wBqvS-&-~fFB|O)54q457Vcd{tjemIprjt5NIkA{n+^pp znRH~vh6^Hs5=TKKqB`UA@~+;Wt3<`c84c>$^{jj7nO)@YMLK!!>Jq)Z!t5<^e%z?c zw3Niu{SZ2@)&@9G5*1_ol#{0CtR@~@|x+keocRi3fLSJ)Lf;y$Z+ zh*YH${-hDD)rpLY=r2nrXbj8=*60c2%#i=SLjMVyz~#ujP}iCp;oIb`4PC-F zqbNUIG%;w7p|8Hv7?&e##?Cl-K0v-0)hx4lcAghVQ_h3)Uv=?A8>S`-jSAt5$y7F2 zBa##aT}pX}AD+x;TajRh6zZc$PMpBOMSC-GavT8LgI)1AiEuUV4st=B2QdF7MNt<% zdzyhct8UR#bQ)vwHJDkikovR}fVfiSKdja0jMIp-0b1-9R706fxM*$+h$jL8CGT7mZ26#t)TQGh570@_a zx-nHm<3nH;Pqbjl+lrkr1>G<$_$|u&t_sO1u?eDd#)_`zz%kZ+=iX!<WjTTqF$M93+k;*DT}(M3Hcxa2rgqP^K*xVHrKSi} zZt*7ZRy$`_q&xe; z2GgT0tUp8c_#@^CxO>D14S$TxxjKJ^E55;HVcupCE(|DMR-(=<0hAk0Gu^>ZtR0kG zC$zM$l+6Fk{)rD~j6;gGZX)~y%vXOX1jT({oRCTxqZ|2_d)QfCj=qwKpckrl42?LyxNp>FA+8l{yNmlQp9IG}YyM{#`3uK9t@ypvr)6ZmB)rwl>`WX{TLAnO$ ze-vbvnbH-OcAlSSPXYC781cBqyFB!wxGl3sGRAmR0Gxuv3`ESJfs z=pbrXDy>0Jf$Ts$&!8CY^WO`K6ltv^P#8==gJ0#*6z{OacC$xUsu$-V+a1orB$%l>?AaLlujYd&yROg_8c$RR~+VxA1V(2 z^61C^^W6aDNe9KE){*QiNbK1KF1s&7r7jgq<(k|nqzx#e_`^5 zW>4P~72PAeP@Hnba7R?6dA&HwVagZx9c0+7r;CFdB^+^1i%{Oiro<%=Zi~t$UN}2c zpuo7aVw{K4c468tN27fM3`Ky-4UL`o@z6Y?C?s;TN4=3x)%z01 zj4S_QBWH?ELUmH5xIbxih}$5i?4*ikinGMV9zfOO_mG`8$|sg5fQHr9G&gn0eyAbB zDptJF2Gf;nT@|3QL9w{CD^}NL_kIePoa5d}0y~Sus)mB|&_*1Z23A`77{4BM5YzT$ z!SjY4(ao!Q=NRTtE2VvZ6%{@PAmP?>Rnt5ozJ8aSF$bo0#c^5w$N?|ROJ$-1F3ctY1$upNF%zdq{3^#m|P8~t8{`h82XQN#;2FJ!Mu0zGRo zAGqOQI8XQoPZlT#9W+|NgI4B8V}hqQ1zBGqia;$Vk|zj=^5b#`)+3bCQSntHWq2X- zli0`IUL!$9>dj>(`gfY?PW7=vCFZl;Q5t>14OAckq%3k5r6Jzczf8WSeZ^27m2}tu zz{RPc?k#1MYIqy0X22_8Es3kKUl2}vVA-Unr_#{E&@MP#8o+e3O%^MA|5z%y^k*7i z5z>F-6D6qfO9th8&1p{w8f*1^A{)(`;WT+UK&;MyIeRvebkyf&@Vve2{bfF&n<6`< z{n=RRXJT_rC%wQ&mQJ{>q@;?Rq~!lk%=t*i$qq;qk^QBD9j>fCNU4b-6vb~*u7oQU z!!M5$V^YwFqvyfyb4bQ*E30Ne47(T-Di)&&k7sR2VgM_C0Y5N5C^z#-zLSliG3v5^ zHz3<66DlAfF`RuOw_b4I53?#@g{R)OJwU%OxpI%cD$8 zi5o-0?8VMR!1yJF|3^9DKP25WoJsxcdHL9;vr%LG3412nnpwh6#0s+HAPi1B`XXo~ zj1?ZW&&3DAd)s7RUgTUy|1yRqnnP)pClHH0kiFzq>!#GSSpVY zPxW8j;KCkY0li*JXE2`4P#_csiR0mW#e)#h;!ngw z@zbsRu}iHZkpT~9W(A^d(P5p4zQXqI7qV1qftC%?u0YTkfL2him-Guw=xxFwN#2~F zyBLJ+lfIr0XmK6w4iuaL{eS}5!wBlLjX{506bn_%MO(ryv|pz?e0xFdwVX-SQkC$? z);Z8|!-8?)gD6P1*ILiCY>QpHqSy93WHg)_{>^R2x~uGoy{!#of}Bh1>sf+kzd*bH zXd8um<;W8wOo!PI^jgZhp1e|yd^4Pseae%cOz~iuHU0YgY-Z@tl8Wx zTIV4L44M9#iU`HPZ@}wqxS*6hgxPGj_~Czh{4ppo<^q8@=Kq>T+j0gd5!~V-Efk#` zS${o?n6RGThgpjcmfUL?>3Ku@o7a82n+-N1akPES!%W>Bk@%RQ4-XlR{HUT~*&e#RT=1Xb67q-Np80GX&=wy2#SvV)n4{Pw2TyJF2Wj@gU$(RB|!g~0zN z|2vd7VK0Z@uJ^}A+gr>-T&%I1)8f1XbI(2=nz>b>E`ZJuQ7?%8A+9>%a5A27@4p#w zX5HrhUu8{bZ`|IOnN~bWUG7R_ZmgAMC-FNgBzVO*zd8;%_fc$x-@OyPU z$O0K+qO8Q7<14+%n^t4V?II2KFvfKKUa1~n3Wnc;d*<8pKfYfZFJ}q8a!$Sce_IQ0 zVUhZM?%N9We-4|FdGOu{l!1#~{g_gJLm3b{+IBUBZS!Yh4`pT%8jcIQakJw|xN+uv zx{71!Qk*y=$K3_-E;_^xBSzNwjooLB@W2X>9-C~+a zT@d?@PAr2fxUe<{-1-EV6+@nYJy!6ytV??h*pKbv8AKwZoH zvQ#lfyhshfIqQoS9x_6ZKBhH@VY}rX{uSRe7qn#wP$a{(0Bq_jvLNN0Kf&O9*XBZfXvbUtj!2kIpS1+49G|%e0nuJ)(tNe>51MGEMZq zu-wTZc!1AO<)*9;V~xJNjS&Q6@_w)A0=kWVB>S>E4<$x!P%o+#5`wn9&;>w_e{Rf( z{kC}h_2g}+d|tR;(3;&-2`nifsKA;O;wI6 z2=SkeOeLZ7l3cfhn@Q)QM%CBS{lZLqlUm&u_ zTbSW?UQyt4?W1I_*{WNe;_jgdV5(@+I;Xh&zu>cx+$@}X9aw{W;+e0>^Z53A-5x4J zX}!oeCISFT(anwBx)P563s4ZYGK{{J&je1x!8@OI_C07OrXLj@ zLA75j3jR|$FwOq4pCk0c35v@~bD!JNXlQD=j73E?wyX{3O{u`EO5|~bQ3Ao^65Q6q zhhC;)>g^(YNX#sb%B_n-ZQqGBm&K;mQr70Hips2uBu7utR(#gD(NmqSM>QbsLpPn6 zOnLrCr~vq0$D%LRA4q))ro(khw-k-JIj;?A`kUJqco7+v*}?)}E!Ozp2LQXStjlN0FugsE@eJ(ke!ZUfbx5=LX*n z<(W7KdW}r9t&1yiljQzV+F+S0v?uxIvk!rz8hnjV&|4Yw9u61KlCaGNd_av-Ot|m` z4xk;2yC>03iz1yr#gDjWe}Ddk^EEPxoCY!s@1P z%{*g@GT=NYww2SOQRTW?VM}EDxK695`S@>X&afC%wnkFJhevckvwK0e`aAat8-%>c zAbR)-T`9+w^WIw03#>YT^8TmUa-m;2;&pyUDe8w!|7$@B$?)oqoLd(o=9z#g*gHK9 zrS(uO;Q)P7~xRk+lm zU{p47V`tZ}=xxpL?y2-?n_^21^XPIM-haL)N)MH;9FMyf94$_!s)qisK;uVr6xn=; zvQOrET}30XdikG|FaW-Dc#U<334D-HoJw7qd7g)O&R^zOHvYCZtD<)>@99)u36%D~ z5imf1ANODDj#zd(_);`hNrZTmhzkTfymFmB90{N~(A#pw|F35p6;2o=QPlL9VONDx z>D@rtFq3M3pJMj+yC#Rhp6uuSCK|^*$M!3e!pg+%;D7dVRKVDPMm(SBh%{tchL@I#B+6W!-8`=Gn*(rt`=OZUBAt~f znH*04S-4{GQDn<|dAvi335y@xkT@Mmh+b6=Vl;YoY|Jp_#NvlT*D{)N{14-bk!oCa zPt!7FaCRT&7)t9ytrI_jMn+VuXTcgoP?0sY?0826S_s82=%NVl)0E5d$^M^m{nOiv z=(;0{2yRDjLl-$eZ$$3a-%f{OkL>Xh6PC$AvR~#Z3fF^v2>fuCG#cWenPT=2Ak(Mt zy4}iL#YA98U`OW`ChXXluo63`oJ9jKaz3c)NP|5zoXb_DHR{!b8w!A%f^_@N_T$h5(BVT5tJMW|obB{T}3%UN-S)iply+61MKo^BP61ALKSi(E1 za}j)4nOLLG+6!fpmw|vR8O&1C(2!BcGPH}+$M~H~^u^)=4rY2^`u?4)#h{%P7fsmF zq9GmB_^GI<~>fn!urQN z5%uUDZ%RKkUrXOWki))z5NRv?y-Qsj{Pgy|Y@SY1v7Jl8b>Yv7U|3WeMj5RB=Kp@K zAoql|EP)2=_Tj|veaL{e$PWp7JAE@||6DX~sB5=#OZ5`Fx}|&L7}ito=Am#^igb@} zrGNAwxi9WL!w6p_7-lhys3dCKev5^Fux&z$TDgYR5`RD)5i00%<|U>f4jE(!?6Tz~ zUCxy>b|&+EewtofjnQD_>2g0F-k-kXodA#vF5bU;i3-Wu7*P9~u=<&n;SRu-iyZ`h z!?jArTB}3$9wrMJhDS%21puK_ZPU(Pq#CD-f(ZcM9$%f^&G$ORD<8SlK%0fvs-Cx8 zCbPJwGg4oQ+4qSf?9(1E!C7HqTaxVfVDba6chvriCr0^}zz`@Ay>z*{z!6q;A;Ob>qkv4yibo|%t@Dl}~$4J5?q?Py=tAF-=XwDjt*KtOPec#C6Wkia~Z+!Yt}Y0VClTR0BhSE zZfv>xc7f8ItVBQW zhki7-OOt%v$H*}q!^P-}%LaX|lj7e7nm7T!cV~EMljYDkAF41_;1bx<(9^--bJU~$ z{$X&7h4NZtPNv?SN9^58nir-2$w?~CspRX$d61t9r~LUBV5DVMei#IE@su1oENNWy zy-h(D6bb^~)a1Wy^$+Jh^*4IDV6-*(Xyi<7oJlODFI_eorugTlWFYx~njq&H_yzpV3oP68w@{dv=1@yUy? zO2Ww#lEBbuAN3$$ynIr8DptaFf80qwKiX#ehn4lv6%6b5^Si{{Yo;88Jl+n=K~g+) zU*TLagvrElY*K067piFC{f2!59U}=-XlRt1;V5{;x(Hor0>r&wPS_7zL?T0-nRU)Z zUmSi!P%QIP-9z)1>3V-kX1y3rV^K*$@f3S*PD$KDkqZCX2g+9!6b?e<2BfoX2%42g z{#nB>uzO2poybT$alZ-q)Ua5ya=}bP`tV}PZU|3rf<)xQg{HVjZaI3IJ`FxcJen?9 z3f;>Yh7zv7%24UVLb74`Q|FcVeWN5pJGQS>F2Gs7GQW#t2`cJdD$6U9) z37@h3+r~WKt9n^lzikBgB!C(M|5`9MV3vESx%HwgTS6d|rKb_{HvNY14FqFRh+4=uR%0v* z(Js4!?AU#txT?b5>sV&_|0-i|l; z^JJ-i9$ffDI%m6Woyb^EWd^8PYde(MR`N1PVNPW5fR1@RcObg({q_eVme(lzZ~&>h4uGH=oLF+NjN;me7C+bg?(TmXYFgE+$oqvn9R_lb-&rHnt`gMUY3 zNxrGtkdkbGsrDxIA(dl#0Aw{acXyAVrm#<-192+1eeFb_hrPr;WKWOZr}}r5yl&>^ zyQ(4|58&dUD9F!o`De@9; zt;$Z1*RZ8!s;~LfF$R}~QHfDm^zcVScem(!nP?LNIWQ-ui+nDm=FsGu_$)s7ptzLb zwvFudqO2!5X@C-E!@j2d=(z+{2aDuD1kEa6VC9eRu*?^i@kThy+pN;pMTZT+pIudG zqP1udi)hfj7{t6@DJuAht;ZYBC=l*_P6BW`AIt$$!PO`}m73DZs=4hMB+ZGh?1!b` zchTBKPyT4#)Z~A>Ui>s6s)(USykM5z`Y>Rmbhvm$wOnF&if*JEQIa6$K&jM}n%Up$ zRNE4+F4P8dI_>$h`)pgc!xa#&njapu^Z-#F)y+N1A>Mg9Sx8in4$&&NHO-(1LWutD9GveMl13p@9?zc zzzBSQ=zy)*gJVn#G{t|(A%6bQ?1<6~2p`F~3Fr_20!?LqIE;~@@%H6Id4X*bhnaqJ z#=gW#0(ux{g*}`wsUl~g<&_p|&VKVhgh^1M+G07f?+ZYO)_EnP(^kKEmtPIDf&)=< zmd1Rbk$Bvl*$ImQwkRR9=GXZ(1^UH4aU>n*vH@%I=!((?MrNr(sr|IaZ)}6ixbH2B zvl!Mn-RwHLTD;GfX+}Qou8LG*W@p)KT~|*`M1j7iK`dv7a(~9g>gb_fG5TIqUQC1& zkeC!?5fEq~z+#m$37ejO)Zao{2dgmw9tF6tTZTGFGI$b<{3XwA8mZc?7Fd8{Kw}EI zMthz-vB*7o_Lrm4C_1i((;Tm&$Ky0J8GWHjJEnTaV=WD-aSY^$M5PiiLf`qh-@vQ% z*?FPH?}qhA8To<@=y3RLIM#ii%PjZtS#?B43e!R73-gG zNs@pF5r@diQsiU7jd9D$s>p9st)%4zp1g^r`X6)&1M$yd$U=JdL-Pj$y0BXL0?2Pz zqgXqopp)pw8B0_EW6)7&Z|I2lJ8;g$0Jr%h>O_-I_aVr2OPFC*#^m$SkV7MHcclGn z55oRLbY`wd$Yy-F3|V+{oac@EAUXrmuk(BH@*Hu5U~Eh&SM(bqiEUBt1mcu(_~a_O zF_EB_rThyL3aG=k&xq)UxD>Kb6f_8`Xz_X-@YM9h=;&$$P<``6LlH2DAbEUh;FaqR zcmKLI*zLf3S^zOV3nEQ@wd~H+;*(ZtJFtK2%TR9kAVsJXwi~_+x)$H&Xl)QS^RZ91Jg>zGo`|Gr#zqU(I#VB;oCv8LG=Gf(k|0B0J0rW`25S6-J3KS95x3!v+vWflmy&Lvf1MFjqvO$RYE%B>M?{S+I_8D9 zux$|i6_Lz{H=g<2`Mqz5sBu%geq9^P_|Lv@l{Zm}@|vhQxoC)`K%GFOtsXiM9dnwe z^f4fpQy+1MA3F6PSa#7P0niN8fY~#<$*MH}o4JPZUEbn}_D-P&+c-WZNXky3;n+6f#GQWqJ zYI{(}qK%+^od<$T;NP_aNKgo_F9~`ot?T zy#?Z$L=(SFA;VMUr}T1PKbOrOIzzXIbcD_a>dSJ_V{IsQV_Fs@YPi@?v-QTeft$H9bu?)iTddPpAnA)7&UV zwRp+2^R;sxo?)f+v0Yspe_aIzc0mKXmmG9HTOS8Mr3^tU9tzaj6bf?rZ>dQskT;do z<+{LTN6u6MxK{H}HR$0l`S!jXK%8p&_`o&e!0~357KgRYOWD=t5BiznmseJwr;>WBlgS;C6YO_ z@keC;k?$HA5Ns~=5o_G9zQ+DP6ACpcusp7>MruYfGK5Nd zsT&`I(VMvyQrgA}UzD%WM%;XT`8Z9N=i;i^$rhOA&W~?C?Lm?#OD*7awl*dFeA4hK zwo`>3n6)~x>hqTc>zl1Ps~kgyd{!6-A1W&a2u#n!+)x?BU;{e9h)bcly#D^={BhcJ z9*VBe1VR6RzvN;c4Lnu&NF{Ke%(zbM`{(uf!V_I*3{OYU>7$rTIJlA{lOT#_uJ6bySqC~ zim;A4iUQk}pY@(FAgC~U=6ZAlS(U8$&fB6q_`D*#PWWNtNw9N{PMltm-X`YQ zl-;o=Z-4qG)O_(lr@R0>(CD1Z|D z)7+&=wg?_Y#LxvMCV2{QKa5+>I?v9|U{X3Hd)-lHOBJ6N8m2^rEV>&?ZPjr|Ff}zb zqdx$_H?)F+9IiP;>5(>7l0`)o4%rH~^fXO@Y`l8!(>bRZHcK9Dg}@|S_`rbvC992> z5Gtx?)_MNYlSTLXS;*>L%*^Ry9JG9PHpx_ylA!UJuBfP}-1BlZj)u|_z?+rRR{|l2 z4Db3pdG$Q6r;lHOA|;%RzPesUWz7~O$+c!7QHs#ydx>no)m{86W(5`1Il?0Y`?n3p ze%4c$j76G<^k z9mb{P$SgG-`bIDnKS-oQP_1TL>vZ&Ej7EFWdsKg%{r#d1%hu3x0NjJTHDIGq1q(p+ zddWu)K|+_$KlDWeIQ$;~??4d0Ti5{5SYLy-whjn4M*>o~xyMpj?R_{*)0!;R{0<(E zhgVis{(M*4XEK?S3Xz%0%F31!D;Oe*e<3dIO`;%3>7^apTVet8y~gEC`)2QM)|``tJZf6K!c7WL6~* zqJ)Aw0)$A^)z-$<=e8t-z~LOaVJO%M+?-(r$-aIK_V&hnfB>Zgb#-;StTMm+^2^J5 zdwZuB{AXR)$E=c)uIn9ys%jop;p5gr7R62A8q%1C+Pd1-=bn4+nO#Rix)0-= z6H3+d9*@Uc$LbASwQ5CN#hZy6u9F~y6%B@4;8Sur+;IiD+XnJ|eSJPc2tuLIZ+1U{jLndR0$$~!j9DOF zdF7w(${;|%08qCiQH4@L0LDmZ=^McB0em&u(mJejU~wJ+Apqx)60xEyB83fCEnj0A z00u~aY8ncl?Ca#DimHlfk+Mj7`t<3)-QBj`-Q8X{XB(7K^!E0SS)e^$9mIXn5<=Z# z_WpW80tP}cVG{g@b2)B_wzPhCw@(9O9!LtV__Ye3bIu(?HE_Z_~J z73+nyk8?TV@pw&ref_WRz4zY4?zZLbB$ug)E-EW4r;ODbSQaivZ?ap}|GH533pNyL zWW|K8Sh-{pQz#|DMq}~=ga%z+Tl&JVKNKptzxR$zKjbh)7_V)J6D#|M^`PHv}wMV@T zr%s*POI&#a$}}*h%^j;Z(C_!V?VeSnsi|oSR;*s@YMm&zNeD3^f&PzZOY1cw+L=(V zlqyA3)3hScKEo>tA}OG(Kfw+ZmT4jA3t(SOyywlE|2f-sA}=p~`ISB0M@qTL@AJWD zcwIe?%#7P_zkN*l(G?XH&~;s1Yjbs zM;?CUV+7(WM;>|P=YQ~n?~kY@-1RqH?}S6)mpz67!?6)eW&i*n07*naRM4R@4ejln zr;f!NxN+k~WV2aF2~<>+A(cuhi9L6U!k7j|Cr(YF7Hw&LWYkXsp_LFyT#yo46ky5a za(PJz1d&MeCD2$~i|rkqMX^He2<+(Wo^{w^^S63E-YJ(~ei>}rhDHdcHSLd3IGEzL z)9&?o*Ll4DwE>@Zd1Y1I#wm@BYkqe9Plkl^mRoKkum1D(BigrbzkKD2cP$p2E5}Bh$H47)lDhgBsn@5 zqX`1)Ayih}d(R&a$)wZuj1jYOa^tnrXUzQhuYY~(s577rm^Jg!WHOP9_r`rvN~9C% z15Y{W)T5ty?&;UY(hYp|)z>Oi5+hZ0kAA+8Lje)a32d;a)`hHdX{yKwT1S&$NNq!_e_a^Rdf0C(UuJnz2q&a%&Z z@VM`;UpMIg|KIn&&)$FU{ds-y_#vI0od-!c$EK3G!}Gbkhf)g0G!O!KJVrVk3Eg?X z>{-{}bI&~+@$}Ol>cZT33~E9P@h%Cr*DyBV7{Z3t*gqr$cjEsG!(Pc`3n-+h-P6N#{CnW*2-fnH4NSIgst z$sr*Od#aoC%U}J919;Q@0|5B@-~Pt#yz}=n9WLra;c#^(liDbROP0R5 z*Dg+7-K6%&{^eM*lY`R&$QOoOhG7IhQ8h&w0E?lA{spo zz?cELqq8&01&0(ITsQ!ssH?8Tl*R@nn9e95xpBey7w^CQ{T&BM;yC;5H|6gf1Hd=OYuIkL3|R*=<`n=>lY`PO3bpYd}i(1HE5jNi0bMpNFh)8;ukNv@bpv9c=Cetzj*$~ z{?K`}8X^QZMNwzEyE_IU1RS9RXfmlJ71Aabf9XPeaU*OLOG(Q+Isok{-JwCVf( za`EEDyfRvQKJf zs@(k2C13silTSSH`BA#_al?eK}dnF zSlc9twkL!F8GuA6=zAH!@%!q$tE#G+ws$8XIaEIu5Cp>c$IeV9QqOb9#(dsQYJw?jRTlf`TERH<8X}(b?S%M+#MP1p-1O8Yea2^wUm-5Gs_!#n_R!`1)m6 z9I$%T>KmnWB1ay1IIe8|=4qXso!6~dv-+Zr&TgbK32blMj9e~_?(S~bwgblz;6fFr zN=e*YWQx9ca^Zje_?mqt>=I8T0zygeAa-qC-B)be zwk^xL?%U1ZCqMY!f0J<0(HMNFDk7AAq zzor2MsBNsnwb%SYEu2sS%BU;ns#HjO`eOL&!+(QP)*`U^*a14$)7_LwCrKh1M@2;? zo_gwOa4uk47P#QBojf2VDk{q1_xY5vCjmSj4JVv%6b?Up4pbH)K_-*Y+IO_?x3A9K zwnap64na7C;1EK;E14_VT6c&prR#=8Mli z2L_cOLSowV{jqA*I@H!y;b+(W4>UqxW-<`mhHz~7JwBXr(#fz)3tR{|&e#FEsfn()iWz(>28;%6R<>iQ! zm3=cBt@5Lk>Rj_CpUo;y*sgK=1UbIrr@I{$tao&DT2I%H{I8 zxm&hw9<+3K{%0?IV(a!zr)P3DyxxE+Q(^>_RW*o4YvK3%KnO)mbuBtNJFug>9l=lt zo8NyA<&g*`)i*$+468S+&DEAye5X88F*lh?YDSW72ew}wicXu83IKA++BdHs|yPu{j*nR(cj z1v_uUG&4xWV@JIAUhA1&UjVZXn2Gj|9x&aDgAYCsdDFtWch};uLl1$^PH;cWktGZpZ9dvtNZb_^u_~Hg#^_LG{{~5W+#B#Dq`^LO`Stpp?+6^73k3 z*FuitC@EhdV7ZdMLP*t|lmJ|CD!4r_nNIsC1q28P(NI%Wg`U0`0zN;oxf~?tMWxqF zB94Y=8Jea{RXrRD#r7TT*!F%KEZc;cOT*ATvb;R{dTmYB&mMo`;m1E|Ko6P}UVOnN zbsINq{t@Rk@@D?mAA}hIq_hH+6&iweIivu#Zf^r1(AM4oA>Kh_VFf%#iGD(=}1T4#f;q~L)4O_sd4iFQG zL<-q#7PifyYX$&`>Z&Td_4b>vO-lhv07wB!b#U(Bz3puaedXl~b)UBgyxX@;oon$N zDIi3DFGB&eb$7duW8r$M9*2YiQVfuPaIb^m3lzVv1kf8#fD(#qPNmjRO@~L*AcO?d zG`C1uodqF)Vd%;|OZoFw9!zILR!5gdveM&8 z;j$}!f#;rl2CZ#vU_`0l69PoSVRZF$BH#~za|?tLG}P8$dn^S~><2ucC9;dAEZp-# zaa=(Tmbf)8!WB{>g?bkOx5KbYwNQ-!2R61GbgSJ4tZr9UAyn-k7dE(KyH;O73JF04 zARREm(An9Jc)Smm<$!4#AOYL5kjkB zfC?Vs3cwc%hYLy%AWAk(3R>)pI}l{zikiCzP)~xJ*iVTP^&wOi)1!$5Kvhf{u5L%c zAV?`)L(t#3*Rd^R(y33RfY@N5yE-q(nOR67R&CnQx@D*xdgD2g$pYQoy|8(IxV2y@ z9mjDOQA%t3{h0D zS2x=|CZVdow(LKi?62m46b>YWdPvl-g5#K=x<^&0+cx}e78|5QJl+Sx<3m}Q+s9A< znr@+|Hvu6yOf%=!^GQ%CA>Cv*N+=){NYs6p)rklcI-wK_TnQnNl)`PCtn!Q`QJrFC z!3e19T<8<-ULh39$Kduumx8N@)lIT0q)STxf^%?gLxmnW2-8p=3HIjm**|}xfj;}J zv*)f{xw4510m{gbLM&&VdG^_C1c9`GRi;*0i()_GfIk8*o0Cr zN?v+@OjI*5bi|Ofx|g$Apj~Mi2$br($Jy7+nBL= z1t@_|Dbk4)w6N0S6P%;GECMMMcpV)(py>>WL<-CeiP>Cr`_eTJOw&X_qwi=M-V6tW zFfFI2C!S15BEf`&*U%9T1<@N%^*Wq$UDuVRCj`2o!SD0JV|Wk@24Pxu*ZVs<<9W;E zTyQ{0c$qv@3LefR6KAw{b{`K2m^Mcs6voW`_eV07!j!2~@bD+s0d|#`m>*2b;?O6TAyg3*RNlHq-ERgGfsD^ zzx(3(mz?nV3qE_rLx1|qJDok`M-Q9~E zw=kt?8U*K9F!vB_dv6<<#;|?+cFdVP<=~}DUZ2_6*s$%{=bwD*oJp zI`Cci;;S2xP9+fV`amfGciU<}O61Hu63IAxfdDvn;J7|6=Nx{&AC_f7(= z09|8Xl!8(XQVKA)@q99ofa7rZ1Ageb0mdjaO#>wi8q?K8P1lf2fAq<0eaWOxHHlSk zFT>}7?lDkVRfW0p4u{tlKp<2Ge<%!}?m^J!N5JpJep8#S?(Xb5Ea3O|R#jEaFE1}U zv^)|y=$2b=`os(G7J=58vAN;Q>%kdkorOu0Cc(0-XtLt-#!Q^Py>~C!nV3 zz!+0`UGc8@*OhDf*6M}%ot^E7_4XhZ>rqWQH4h4T$VyKR#W{gt==(&B zvL;%!KP1#dS<>R9j&qJwDh+@@*ELY4lt?vQhhcb;Os3CelpUxu?fN&~cSxTnKY}TU$}qXyMVvOiLz{_NL97ikcR;-_f$MC!VwpojV`14?GOV z9=8aN5R?#dv1ysAWR|$fCsMld1tyY-ICNcuuIV6zf{(EV4_9AzW5(vZl`)E%nmVOx z;ZC;FnKU+T*@$>Dj$kMR&IN4Sgl(B{xT>oZ(t*$CgM>sd82ZT1H=Rz0ilIwFp=(}H zMp0E+g~rK~Rc#?-DyqRKynZkCpE(2RO!{k-u^wI5TQJT>5oj))y!#}RdGqEG0J!3^ zZyJ*ur<_(-GlhTptaImI^OK(!f}Y6R96!6^Cj8q~|Aq%2{PTT=rnUJzUX+)Wp|++H z8l%dmc0+XylP00IZW25m9|+SS32^Gki}o997o<1V*Gnk_B?ijNtH3k{k4H`PASJv$ z9}L5zmXw8~q6|Vpauw|`bOQl@0992L)gSe_X0y36DG9(B3PLkd0zI)fo`2~j2ml&m z#k+jef(4j&=%I*2LLh|va_O?A<1Wd+I4LwuvzAo+?Yw;vm%tY;I2SXTrs3(QpT#?? z*FZvm5QfcL)I=p(Q31k~cw=90-8FJ|~ zq|-0xUWl0od_LH=iH`Q|&wbSA>hXGNNh%FWH3-3#1`5&O^LZhOL^hL!uIpe-HFkRC z)z?s0Ta9!o(_Tmc!=G_W$zwpW<81-$FbQ@6~nfMa#+K@yDOSGta$%6{}Xct6UPAPGLI^ zIyyTcBzHqpP*!h@jq-}%l6Y??Y%_(LnsUtAe;S%5HzHbD0l(i1(=x#*f2X=O^5sbl zWtY#IHRZY5+K3qr8)=Ur(>>j7X)E$H_U zDdEw*sH&{QnP+|)>)w4ApsFIdv$J!|U65eV|M-Ci&B{3rcQlP|4fx8ElN##b_50A! zFgd+_^YWu>gXHb+UUSD90QmQR|Mx#GTzCv=ZvIAoU!SXO^Ev_5Wx#c$K_Fr1I?|~$ z9PU7447%5wT(x@j4>18o5$IGp`KU%%mm{5OM>@xJb#h{UAqdFX(3Wxsr=Qx_?WvOci(;2RseVH zVv|AbDSrO*pMNZ`nQO1T&i}w8k9w8JIRTXbB!`d^9*+l_rk1lAr4U?9Ji+s~-g(;u z@E~Ojl+oO-c1k7Uj4*dOS7~GHq`B<#2PD%p5Jn*>!G6=4(AYQ?QUbcpKncUdQC!>m zBbmvDEXN^~z-`zh!Cj!Gl<4W|fzC9y@urxVy}qf&77H#wDXl&Fn1$hCchXrzfVkOT z5<>9a4{pP`fRrknr7>XhrY%^tausZwLt{Dw1gtSwSNKU8Teoei7fLnI6_jyvUW8Ed z7DI>E>j5PMLQYIMU6h9+uYgJ+xM00Ky$1|yp>tV7>Hn$K15ML+TKCs9LscP54oWnX zMZ!4f-~$njMpf1tk(fGla{W42-P4U)eIZx+8JowDf|jTfK(=no~|Brb$3A57$6A*=UNHP z(T!9p6)9vDiUFyz!qw}}<#PaYR}TsN6B1|uV3fQI5cvIpVf%8}rc*_!$_-X>1=z_# zGsaRv2$iMF2r4To&^UQ22q-j79z`G!0A&o6 z&D5`uwJhJ_1{!Swx_+&Ve}$KoY2M>%4BiAZrGC?$%T=2EHp@4x>H z)Kyoj0)`26U3LPxs;cI7MzyTR>zy~;P8l;7D7F!!7;-_u&DwKcg%Y-HMp0B7>9?%a<=lCYMDbl~nUaP;A-U$|fYx>gjjxBb3w+YaJvH6Iy8Sh@oe8L`b+Z zZpj6*`8*zY=s`U3Y=JXLIG!EshkfexQ^ND5Kck-d+?tFIeqZ zU!OK%f%a;~67KN&eV~jx#=u61mGNtW1IiNH^@Sel8fDV0doM;iDAZd}a-~_4GxNrT1$xb`rG?^k|0R@zhEQ zP)PwwwllXy1|-4e&8?U^WwIN>E4&pcgy7nQ1{wgErgag@rVa`j#p9Zid2{mzDBV7^ z4{hZD0l^(;Ohci*MM=1-N|u2=z)NF9w=F6QGP{EJ5{*en3duPfhr4pDZl1K7i9>Md zneagCOm7Df)r0+K9#BubQr!f^(33(TYyt`HIM8*bDl62i1&mREuwtu((iqvu<;-f8 zi!MQ+#|V)QApjQ+Bam0p_i5L9NGBs|6Eg- z$>sX{s8b{)z+HAB2|-(XJDR3UR`)>yTu3lB!Q;^CV$c}poNU;zp|*bq8X#cBR%EZf z^rAU5(83`U;0}k|4+w-3ghF9#-_ZsD$XlgJ;Yi1O@3lolAxb9%ydG~#3ZXj7NeLlr zP;J5JHC)r(;B>K;7QBSvxT;5LOKKdKdw5zN{PHv(&ZTGsH`ZPR)mz2^!u}&j0`*07*naRApqSB(nedLP`iOKnZo5(-TaT zm*H-KwjC#->3T&!kZ$-#^^hLc<$&bwRHfKW-d(wpD)Ip!U#ck_@sL0rEkrp$;s6i~ zhVw%9>)WYGjN9j&G1W6tkdlQ40K=mtgy6;HZ$e0jNC!kx2nuuf12d^g>s6|0!Ac8v zLS9JpFO3o2FiNA+UHM~Fiz&BI%Y*b^UnwP=q9Fk&qj11WK&uCyCLM=+|K;mfxVnJS z5K=&bgNUJ%`vHJ4YDy{KW|*VUU|wZ_DK{jaFIni34$gU4xKagD%62z$WJ$N^LI_@z z2P3WkAtkg_u~Ljy2wtSm-CYP z=tu`+tf_bbiIR}eb;Bm0sIRF;Lv1Y%Jm3K6nug2Vl5&pY?Rk=<%*jN5XW4g{EVq`s|= z@`I#X{A$>L`@=sfeB#re_S*t$o@4=_R4OFa7_PkXO6rXUd-v~Wd9g|>Y7uxou88mQ zp>YLAaol1_bh766fA?cj8!K!&PiVAhyh!n4tZmOGgBzo;sgjaylg_*L3T$%vTp@{F zE^Gw&zJK1;HE4_F_S?V7zI_LH@PP;ED_2-rm}kTK^=C3nIxw&;Z&5ez*Ov54{&TQ1tl(T5+Rr__^9=l_5!C$;SlKK|d0l=4WN#5=9k zc_Y&F!5XA|VKzo4lT9mZHyU*6)G3sbcz!@%Uq6!*lN5{HM&T>5nVFehSAIw=cKM#W zzo`M5t)>-9GBZ8J&WkVQ-1Ir>wJM`)*HS7Jz-sglNN43`K{-mugBH6z48sAT($=*x zfOx^iN^hxb99P4Mo+zc*b@3HEcI*+>uG`G?xe2yzySVG6ufVJ|1Fn#kpv^@4aUm5_ z2zKq-#lsIC;gU-)r&g-MV!gy!S44@7~M7d%nZ&-TV03ZMSs2^c7gKkYDeny+N22+Cjz-tdN2S?!TXn z8#nRzV~??J{RWEecqHoZw4MFxxopl@V~tdjC!ctNzP>U& zJw1$_J&iUNYhx_7i$kwAA>>Wgn0_H8Hqi*ItyZfq*y<}43yGtTI?Oqf$#CyI-(k<* z{Tw}dgo`fP#)F3scVW9%V3}-g2;BBwDP$*@j1CPODKW<$eS|&x_VLKkhsos&#Bt1q zb!*$g^j+no3qQ=@CMiT`FP^lvIy^M=f({);kpZyjXxoEFj&k72D>-rENv?X$wcK;} zcev)Yugi7a^yOQl(X6-?69Q{jAk+TAehZl0d-ibZnWx!v`Cg_cr`U4QHjW&9h*%qp zF@>%}ud;`ZJ$xeLWsahCTXj_5eb=2Y2yRYJO;{&H;}Fm*c3(oH-o$9j^wc!lckJZM z+0$JweFdhJx6Vly2*j#+&Y__}3(}rBa~h0gYI>4&>(}w{gAZ`oC6|EJ2yMDK^s~*& zFBE&V_8~S;_)XQVf&6<%*;%a&lQ+GH`Ddfmudgw<9{L( z9T!RKl3d_-ChkXuN3B3uPboHUxrlnb&cebxTeoc|3}cKrm2539f=$qt z#TR>SZ*MP3D4Zy|WO`#ndUTSM5fVbW*jZa;CbFu z`)gY-+K#o>_74nlTU$|t#fcX9{tDA^$Ii{x^OQY& z_%Pdd?&Qb=4=^-1!l_fI*t2IZX(8E-(9bpl*?g&&I0_MP?!}(_>CgX#709NO0fVve zaq9JDN~K=o(CypaFZQ8{6_!yU8 zeg#iH`2<*rl&VYcf6kMYECl&HCWkgoWN=^*FevC2 zh0l}8^{XHN<>5(Qat*98CK2v$N~I!44j*FQ{{0-f?_TyFxQe^)zJq$B))j1g85Ve% z4InUBJn21WYl8A5voo_?v1boY9zRYlpCgwo($`x?IzCO%b?E12(SZ>XRX^~4VyOeY1CY@viwwpt*wx9f$ zZ}+5B8EY*`qOrnat@+s(eeqP%RUnvOT;Ph`dpP#UBkVtL6^HIS$ko?g$HII!LcgpW zItWHmCN9?6^UwXPWhj;8;fEe#^Oh|%n@tuM7icsaC?QC6(uM6-+xeOE$|3@hY7o1r z3EuSLH6%t`gT+$r>A_e-CY#~xnKNv;XbUG#J`LS<-!CuaSXiuJodkrjcILSswTw@n zKEuwPyEyW|{fvx^a_ZzMHf-341$6v_A@%yQ9eQZEKPRNXEtJ+23x#SFCA+V_`s&;Z zM`+m+>E7v981l%`huOGk3t_8CsZ=HjLzL`p!g^Wwl9YqGJ)A7Wb0W0XCb1a)=b!x< zcieL~-?;s2+;#9Ew|@P0w`X0*u0yZ3iJ7VOkV;KqFtPb#t4%OHJ-z1zi$ZI|_Awbn z5!YP%S`Hn&o9#O<;eo@4*mda@^p%U5uDiap`JNnb%OM4xkk3Imbdn_2n9eFUAr!_M ztZ-Z!gy=R_R$H}N_uYUjSOew0@|}V5?efy{{uhiYme{5_bPxoLkB_nQ;$1xY$V2Si zcYp^D-$!4$uczy-FK)Nq{%y6iT{Uvo%ApC(xOJ|#xAz%s^xhZx9*Yw|K|rh3Vs3VZz|Sx`I!d*=%*KstX|%d)DPGc{ zZ~OX&TBDV&nK1ZDJO{QjMjK4BqDCc*Tk}S`m%ZC5ywH*;$y(ty$XaXhJa5ig`)%M- zUf83pz#@gj7>ksWFWvk_=I77z<(qHjv15<1FhAe**q5-W@v)LM+NBfLP%0IlqgWM3 zv9;J$@@nZO*;E78TDqOW3nH}V>}4 z^;X6v&hpe#$5~if;K)M{QLR?H9{UouxU|q?Obk*WrRB=24m>C22%{*KSaVTaNtJGs zb&?a-bX(sS=4jRo$aDe)V{IHq$>`|lDItWIoSfY9LOBPWjl6Ex$I2=tf0LQ%X}X% zq5j4#pDsjkJ?{ymz+125rY{AXgp4p&Wss`JqLn8yTdl<+?4Xd=Q;w?A3pOK_EEsDu zwS}>DS|@p|c4NlQ=bY2&1f;<@&V|#VGaBQDTN&uJ{KSphxNc#VDDwKZeDFQLGuXfG z-h6)eo*RGq{fj^U&UdeWbjO-en8nLsO+pa(4S=3} zu?~V}z4^R5@Uq!#wOOsF5T0;lij`Qa0gJS7)s_3VJaF*Ndtc38>h`aFs?usS`mIR< zPsm=OTLD6BF}5inGc2qX*2}E3iB$&cNfB+bNi2jA6|l+*xxpAy2&-cP5RtWj?&yrS zS8AlPP#9H5q?06&Zu)X9YPZ}cJ^I^g?Tpo(DCz{@Ey6g-2Ta@bEY@gD5@W3<@H6z5 z`miSHjq8iQz9cMRxNL9!%x@e!d1~Ua=1di(Lqb9#>tl?@XzdE}I6>I&kCfxjKlxd4 z`0#^0eSLk6-~F9`7k|$j+V^E45dvWh%9G~+c3-il`uOqVNF|>a67rSTY{N&^*fgDP zZ#;DuJd9ewZMS?vDH{h$sO<~OGYFI91)@h7n^&G0(mE1K7B*TPE2U&#sI{k5W)xw| z!X%y)Q~-&P6@w|&=TE1b11#Et6;1_JS^+jhV=p+>9KBQ5#F#08WtSZ&uPi3yCM*J_g$!uI{)$39-rvBnQn{KGf?_&*eL zgCD;6=1-3OlRLD*(W+5RuF24Pa|>eLBkDkS2FRn7&4kS=-xo&9O;YCt*!M=Ix}2$9wdw)1am-Ob@1 zPnTvQ+Ct=MvK1Pn~_rq1mY6dx}D#&n>i<2G2aj zrE3LN#AHj)aK)O!n*aQf|MDA!zRIC;W#fGZUh}4ZG`w`|u_r$sWXf;TI^xlX52B-( zFo{W`7;WOt2_{54Kqv}@GJcRJoA33XeEg0#Z@XycbwBggU)cY*H+|~#KdD3Ka+#jG zm0$(Z^O^u}{^@@i@4kFr>zSvYc;2E=Ypqi${|=gA1!$AFO|;gM&1Q?)Tn-fn>4kHb zTpKrTq*%4*P`K5~*4WO5$@cMXQb!PoPV@t@YP*X_QwFi(j-GqW&}Id?*K0eeXx|8= zYlfk-{dVPN;B+!py>8q2Nh5FDX;*fnyPHm?PHj@H4Yb<`Yb+R(kR&ll5)sGYs@HJe z6NMo{I!G>z8VDuHW=m)ryM~HTNGXxZ!xx%d-u9duKlY#VOJx?OPMMqk>OUP5Lfwz> z4w1{;d*I3&o>;T?idR%QPESs}Ff)AWq89y^!N6X4RT})S)x|L z#k($Iv0mq~C#O*=Kmt!6`xZ|fzo);L@A>R6yz70h`_!lZEcqvMXo)w90BtlGCFn~8NsF$IlWBMS8MkHCTGh$vU7=<%CSCZB?W7^r z>NI7L7z09@G#wEbk-B<1o6~-e>0Ts2piR^{J**{7iA1OKXIGtIS|_PEPwL!8yBoZn z%B0tzb3#dpu?ElcaPoE1HM}JV=^RLTKE9VhDc>>gltPv{QmRW5sfPi5fIefxf_bL|U--1};^#-p|BV!2wabNOX^Ir_*0 zeCZ2+NB{cQQXX7`r+lPWM&$#9jZoPN!~IzjlcC;7*mjlWu{-~Svu95Jn;U=RC%^Tz zZ+z+N|1_{&#;f>=JMQxNLTBPwC@E%VW=Eet@0QjYNaC0z3^7(?3`DJn`tlNS7$TE| z+rD-u&zzcO>z3^dRElibT%l5efl3}J1c}xu^yDI>K%%X7^L44iwh@F*YJTguGUQ=;RDtAc;J9k-o^ILvn?R;MY2(P^Z01*H+` zGdlN7+u76CM38-#I$>8=qxfC`R-ly!Rs#Yl1B6s~K^8xgBM5Q` z&%;8uXU0ylclQDME5ppqpP<&f8lOvf{hk5?gL$4lwanO573=wA^Sx}_XZ7S}<8b{b$;oH&Ks ztTC&yaGU;YSJcVWfmd((vex4J{)$5j;fl-l$&sc|q$!dyi921ql~X85Bed26DV>v> z*oon`GaF+BLMaw&bsBYvRDEQ#Ws1FJd@qX-K0*a#3k5voqr3p4B|>@#Pm&2TWb=8) zMooWLC4CZOh!Yohn$0GKT=us%Y*_cXdZQU-v;NE_`E2vqesTQxW1rc)W&2y3jpesI zeDq=V?SBp5`1;?|n7D~-&qW+Mx{Is!N(?@T9>V$*&rIY9wV{xKB+fIkx5FD3abB!n&MRO845uo;6ql&9H%=$z!#{=S`B}D@7E=)EBE@Bz};^ zc%Zxtfm8(90=ayizTQD9ef=Okl<$gdqXl$O9udUUV2B)Sb*|X;W4?J)W^QZnA z>;E#}IhdtX$PgQM(#1mOv_`H^A`DpW^J%KV@?2%o{S9?7szm`@8DUJ%z&8 zdU|`_Jo$7mHat9h$4W;W;dved0|QJ=O+AayOi#W=rJ^YJ6tPKyRR(P| z)+QZ@ti8F`X)60}`v7Joa^mn_7jskCEzNV|#9*u@Ni<2E5JfRb0tgQ&Gf0&I;bV=Y z71qgQ0t5oz&tNo26(IdgTA+DIsT}$c704C}^ppa8-y;aJc%Dz-XOPOBLP|+I&m)u1 zk_iHLvq=|C!!W{FgEp418Ir^y%~q2}y-5@$gkghL*rHaeQm@x(G#b=uHI|o`Szcad zYHFIP=_wYMmT1&!l*^S?xwmh8)8>uu{`99mdFGWm(S7&bd+v(edp|HcxA?bDKl3E} z_g~B4;96$S9j7^cCu-x*aNwd6+csu6GZ}OE@kNAz-8(8AI8foSV~gA`ucc@9ahArv z!}PiF|M0^<^yWKn|JIl9dZq8>Ww)K5ICfmzd+*)fxa*#Ko*o<+p6Va$FOH8*R_;A` z*H4~2`E=iFue<)B5Gp4GIc;>o8oQ<%#&TkEl8blj;?BFj4c3yx5wE-U^?dV=+c8G- z*0;Qc^=mey(Xo9*3z9@Le}0a!u`|psEV8gP%kuJaTCE!{z3eh}U$KXBUxi{2P|Pho1}w2NhvYfFf=rHWc&7=PmGMLnb^2-!|#3M|M~F3D{-bBJ1_lgwbppM zpDA%*-&K6)&f5qROJ(Q(hhMprH(Xg_e4@_8g2cw>QQ0BNc|k6pq1KG4o}c9O;ortI zC)vF5lCgn-%I>dy?Tho@l?c7-(jE5q|LgBQGBr8%5i1ncT9r(;Kqkndq>tzMR|^y= zp#}tvUFBPo|JznXNs$iejsXJFFdFF^h=8<6*N~F@BHb}MB`4w}M|Xn)QX?cJM@Vk8 zz;plpgXi7e?AWn;yU+XloN-;3g^GMrCF5H)RYMV^hqPEQGwbVs1p4ubBDncsY12|T zTzumO#{U}NGZDu1k!TRf$_E<1)sJ|ihJV4HoNo@h;?7)9zh>SOUdi&IVL$AKO_gi) z2QPv}TC|_vriV{`8#Fl%V&;9^S$!yn{uOKU{R`%D+H8tNCvKsg&9B((TBFA_Sy8|$;=R7+oA=78t%W9t|4+S5lJ(3s zM=>rR1)*PfZqTm|4`i9g&E^(Do@vDGzcNr^P_29v)nF#zZ87aA>L|K5v*%+r_QVEM zW?WrsZeee49~B!*FgP@nQ&3Q9;K5clfRWuhlh)*2_m9l1c^;+w&Hd;b*NZrkM~4fP zi&S_OFli*_l0(D9+zf{ZJu$)Vc~u9OeG_p_M>xQi6GUQl#Usy>2TJ=vm0GxdR^1iW zvOveh%{_80rEPlxe#R@Sg2VHJQ^ps%`#$S-F07~6C3v;1%>-!EV2*;`9+U@d?pw9F z-F>b49(;7UIkPH%hNW1~t@5z;_6EZ!;Mt*j6#QG_UYgBRmNMeW`fjL7EH-WIQoG=- zb<2uUfN5O#O=Y3X|HR)Awv?;Tr$N}+iDE4<7!mLxP_795!|IZ))aBJY^kl%Fj%Kn% zQb{usjpvWDP2?c$WY3MCUG8kqS7LcAdp2XJt)~<2Y3`(_UIw`giGoz(YNqZ)XqIc& z)79CJnI)hAz_GGoMw*RLIS=Yr&3-YuZrT4X<0Q5pbe35yB=a)fC=HK<+1}STNis=V zwK%;l++4j}JwZ=RbPA~XDJiA@x@Pq*(VUrUECLWEu19&EMtwEW_y!N76x;a^G97pO3%z zIb|jtb^3!8`{}jgyIq0z!Wz8`IjVIF4+>}#8vF;4Uls$XsfV(`p@$bM*O@?gc6zKx z^7QNWuLt*ct9PhSET*R`6g$76t)pj9HEWV<#ge2XxLTig7xu6LIywJ5#;5lsTu($q zwAaFKH4!BkXK~+3e|gThifhBWdAb?iUHp_6VFV0kBlD-5V{Jf**)_O`G-rA$)i1EQ zB85=DtSUX-?OUI6PEAiMvsx)s{wEpBFu|Uf?=DcFLr*hkGc;%eLrE{mXpkppNW1+d zX-PuE$jLx|&gdmHzDjH#EhvP@goaHV! zhT{m86C3|(y?Nj+vpno8FViRxuyRm>Wo|9zd zg0XB>ukrqYF)qH%Lhwky;1HLv*|g)UesSICAPVhvg%5YMg{Lk4bA@oVS9s^aYaVjQ ze_y4sUDqQ`p&W+1|H72p7z$;C#dVR!Ta#)`uL9(>dcTC{<1V?e+vEeIc!!Zke8>3dM;x za`JY?aFlsURx|(Mjie$NGfQ-yRXx1x5p!+b5z!nV?>yaM-r=64w)$B4s3M=Je*2-&5NeP4djJ6vxD0nZ`3a-ZH;iK6Wf<>v7`eJ+-X&ka(04 z*Jdi4QFqIMYJ?tBMU^2-`e+-RYI8^^P26A<_|UAH^&~asKjfoE&&=3z+6dq+=jcsP4e+ZprSDcbUN z^orlf%Ck8Fd7w`#&X=JWw91_~0zKX2mDQ_hZtfm|aaT(0xter^ozaU!4ngc?C9TcF zKYtR#3}Fqq2;Jf@>Af(*DIA23Gfgj*Xp&L-D?_)bU7`(!w?mEynMoS!xkd{UmfHSiq6M z>6%MRu&5Lm6iMJExJB+J*Q9>MeE=KlNaoOpS&!i%tem4~kU!x_mcOIjDr6Gu@TYmk zC^H@gss@@6No0*m(fvGGe7sw2Fby7~YpHljTdFBQa}zRy^+&DPZZBKijl$)xzDi-~ zLw6FHzli6B%7VeFwKIJy9f2cgqJ(6J@&u2U zIu5Yx*L!hbFxbzD2{?%WYhnbH&?%=Oer|=ggd)qG_8?B?LUC}H@|sW+Fe`Yd;{l4M zxE}#Ljun9aGCod`GcxW_UqlBlgN$tq{<~p(riILnOB8>r*eJ@iu^Z*q#*=x?lc~A+ z!8C3F$6&KHs9>r6;2Up`V@OC(xsLS1cN*TG8m$+}q!N1uX#vi&kmH1MTk1dl^*rDQ z_~-a|ZF9|kpVFJtxA!Xp?4vK(wBZZkK4*&2gHGnf?g^~IQO56Ll|HACr!)V#kpq`A ziM!7$-FK5JipQUF^nOA`Ne16bPpTMb*HcY7ihVJ55v3Q{L%!cbKGFEQgZo{0|I|CY zn@FS|nt=XT(3zz@TQ7}FRL4{N#Y6X5M|xEVU+YtB6lN0E8zO;^q$Fu)IO7+xG_b(QN zJq&}v0KbE9>W0hzsQHj%0V%hzMv1VQT|kQpDdjRBX&cKE_b$`EtN|gKlCWyG#w{};$2sAuG zh?w0eV=v4x@f&S9x*#B=N-6urD5~5OYv@o5pCFGUgHrnGvc6;Bwj3fr;eYEF;L#*M zU0}%37T-#q*A-lG7CY`>h>dg|ES+_gB#^9)!$(E&7+zPW1HF4;I}tkVd{Vp9%^i`IdY zLDqRQwqx7%-+$~0v@pwcaJJ1~@sjW82xlSpT3}OJobfYs_jz7m5rtUN$ylL;sB@(C z(`r+)N3#3m`0BdxD?L%)3ez#p#@XHfeg5-Z;EuS(2Z3+i@c*ze8`K62VUbFLYPIv> z@PAZa47h_XZ;$?jhMvCsS!l&Jylr5qAf5*w`&9eNP;d(%lig`PL0IozjWV}Dr($mO zDmJ6*{;yt#GudLQLqiUOOka*6JY`f_W8kG8BYMxpvTx}MBOCCSc1VxG0kf@>knp|O z-jW6 zsBFP&-ji~`f0RA$9UJdtY=1UK;{3t8IoTJ7S`M21#XN#>l}V%e^a%YzwPJm{jqAk! zeX0gS%Rc-2QEQC4>AcgBkm5(n#Y<0%CL{OejW!z69AiZ;ntaOLxkMCC<<9QY`{Y~-N2pLNUob$P);?#vqh%LDjw%J@>=VKsM`-xRSo2p;XGCqj7WuBLo%;^s z6Ju8t6z^oQf5_q@$zA3UrPUDDVcg5Gi9f$c`@)q0vBBQKLF(+M27sg4IZ{I?x8K0! zW3%Fe5VM<&r5N{}kmV+FjoH7{0h!z3zZJ;JZHUH)#1Oc&Z0EXE&b{S-Qw6#zg$u=M zd9<^Hi?M*$q_dTZBRDkKA~IYT>I#4w71P9pl=ppbzO+wn_r#=p4fU2*MaB3ZI+!kP znpd{iB8R)U@a)j=)fG`C!f7+UclhLOg6iApD_KM%N$!j=i=!AtuQ8Y^0lGv9T2!l_ zbE*PSkq)xffv+RA3cM_%f}&n;*zE4;n;o|-#AH-5lDgNan?(4KxT)OOsgn*`3jtb8 zS_I=Rm5acbaeN^WR)Vu>$%`iCG5Pv1*?D>z?+-ml)oe~4Sgqb*qeS5CN%{l?kwnSF z6G{4n_jA`&=<#bksq@3-`_&3~g-64DD`kSI7FEwD;q&v|-I2GUyB$Z&NaL4wzcXYz&)4I8zf4BkivH& zj&5)}i_$`6qi+J3LUQdRY}6T|@Xh9sU0e@XQl1dkITCyo5z6J zwH5H0jr?XXpFLx(90_BaF8ed{WWQEvnB7-cq>_)!xJ#sR zdWNdt{_k`6g;nDR_6{)TxUM$T_f*zohu8j>#-=}~S+ki^v(ZQxBWspxR}5Y<6Z>$6 zqj(-I;>B@UY7g0)7_-S7cN(QhXE6fUtK7W?BDB$h20f16*nW-aS$#-*@X$Ddg2GV8 z?eY`SUT`B2Bkz6YQ*?t|y+RsRe^u@>4;+$Np}JH&rjEbWryQuZFv)hX4N5aZykaeK zIJiDb2T^^p&QQvTv@h*hTH=4_Fch<%?PbO6@@h{1aKG>3(K-j`A^&W5_wX=Jo`lC{ zu^Q9RMUbq#!pD&4mC7p5X8%hViM$2&sZ8s#8|SheJQS&EKO4LM)YC(DC=--Ys;1Yxn|p55>6u6stKkuc zEsV*tdzluA(V`5*BY?&5xFUYOVf&H}va4^=4f$6pVfiDg(~Iaz`zo~z`A>M_0-i`l z)XDudtXxe0Fz>eN?cMe#F&~Nc^Qe7s_r=RYV^F)hjnhdrKqihykW5e)z#2t*$C z_4N@GlNj)1J_xJEso<($cqfqL7-^tM94EvZX+*0fp2wN>Lb|sT*2!YU|I2FE4?ju_ z0L4Nz28s&v9pz-Ab4ph;@>rB<#;;dnxuka?HL=E?{E9B6Dj?tp8FIlczqBBI#%zE)$NQZkb zFTFULvf=rUhCK}SJY8|CR%y}|_2N(UX1&z)=bQg4#mC;v)~&qN_T3?? z*rTP(Rtaq84d|!}nS1p7`SaYjKr$6xXL^t6y2|TXxGt3P{=IV3`RvSzvFo?l4G2+F z>jQ+30aBDZMh#ZYa=9=b^$)S1Z4ejD6WAV~5El0ZlwAm4Caq~(rda9z)p&v5q~Y+? z>hHeY4WJv97P5HQv&nSJ!jD6 zj>m=0_hN$M27WR&Eng4N-{}RR!ABw0+1c5PhKHc8caEP=U+f{Tb;gAL?O25#R@-+v zkSsU)b?nnbp598(_1z$5LW5*>Qlb@K1;SE55M6V$im94jKTHoWvM48U zMC-#vk~w$k3Z*GfrLG!-!&$=yUs5^}G{*ZojF!P&z&vv$is5%IH-s>X51h|b_LnWua-4 zZ{N}V0gXI!@C3v4Cz+$*uJ+g5+qXC;@rm~J9=^Vrv9Zt+$&#+>qT*E6(JjJ|KUPB7 z&!fn~iqMB`NAK;*lGlnAljOXXpfroYPh5cU(CIf%Y^eTYRwYYJ=i199IH+IH@t1i1 z)N6siqoczb;o`wPvbT0hVyYnv>hck+Cj_fs5rhbar}aGMRsG%3Ur%m#q#TFD@o=8}=nOodFL!-wpsN*8(pD{`|Uk0iOw@0??5|X|biwG$c>#OH6q`5W@A6VVLQiE+Q z48U~Bfhou%c6BsMZL?eNBS>eQU(Y?L1v#sso&#?kw#QHs4U7j{*Mb6=zDZ_NRluIb zjPu*>{hBH!r4GwFIf2+01T%dqbc7RB9w(TB+p^c^HNR$}N&08Y7+g^7Ee?Z3PA8G%PFYW7|W$a2W8^eVH7DR`+0ZKqtLtfF6_$w6TVyK@7S}h z@)bwi4{Xmc<+>tt*;J+N8fb(=p>UZh(B}zkS$%hE0Fe_$)7jFENgo790bxAoZ{)`e=uHiRTNTzpVs)gvMY6j^S>5KD( z$|sZeC(-J>s^l_PuRtf(6yhIz8l39Yo_)Li;`TH~c>7HR z=~3*4{{e8?-`LpT7ZgbSv9(a|!3;!idv`ov+knIbSntdn?qSX9-_$)3XU%A5598X&P_ezo{yR_X8SMg*@ z%K(0OYW;GZ??+$$2%T?R-{ND=W%ZG$anOW}1JbksCCFF4r?eyd?k71)@B&LUv3iB5 z7VDy!bGTorBBAkWxkcOC4{z1Y?7fZygMkJO;G-nkhijAm`aKQgdX?E2FU%A=EZ^JM zkQLC%TGccd`Sf)|)^Fs1B(i;J7%GZGIKqbFVZXtq{~t?*G)IwzpW$KpYIt4)R<~^) zt0FfOw)EMLR`xAEtMEi#s18mE5J0N_W@RiU(Ii&*JaDHNNXS z&)vUowyX+fAufH)*}t{|scbT<9x~e}|HO2lo0-<=+g&MH-qM;*5>KNGL@$1U*0Z?= z#*mY>lqFyFpWAGwlP05y%FB6@m_VDSM1`kE_uI=&^5 z4f=YJewMRP_FTxoT(zOxlaY=%-B9DJ;EO%4_m`ntb&+%v7_^YDr2>TuJVGd*+McvA z1l!ZL@g3yNcpd2cB=&`&^Ee+gfK!1mZ_iL=WCYH1rGFuE|7TwQ_iHPq1~GJ@6{h#8 zX@D0xso-m1P8-?v%}V;I2i5Tt)?s|s%m~tYrI-&W$ZO3pJjI%9jsROvM|Ihc|3(fo z4i_)FmXEI`h9BKjlP~L)xLE9)&9$PC-+d7O&zI*G$b04o67@cyeaBD0X5|MOs=6xQ Ifvsi#2Scu7=l}o! literal 0 HcmV?d00001 diff --git a/resources/profiles/Elegoo/NEPTUNE3PLUS_thumbnail.png b/resources/profiles/Elegoo/NEPTUNE3PLUS_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..78293eebbdb64d1524d85a87d67df4702bad9721 GIT binary patch literal 35858 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%0D#Vw!hAHKbvK&|yDy%UL^iK+^&& z>T>`iKG`6Y%7&=#AJc}xHs2TFCTPGU;PpPexnR)j2dw>EA9CW3JGQ!X%&Mm+>%W<= zev~Dq5;&2jq{z|`-;UbaX%yV*@89pAixiSx9Mku{V0jFO=XM+v;8}|&yLOGOyze!* z_l-KLpAU<85VBvcLpGOI+-N~wJ2#6=qq z=JjcTp%kES_ur1$(U!VASiP?h1vHlOM-T8bUBJ2XMBHHR zy)a#jv6P)PKgX>ZfxuuM(o1cT9TxJwx9K#UT1$-vT~zXW@QfOnqD!|Q>(rx2F1$)Bv-vWy(_SR%7pn`+z!X5#8o;3X*4uO6fj7*K1>MiQ~FgSh?0(l>JB{> z@`rp$->LAQnX0-bLk(T7Fq{y59tGC7MP}yI7e)K6#P<<|e|CGkHh^vv_@>OoWPv~z zPinemwU3Xf>tb|_gzy2QMT*>vyDoI*%SPVMOBUe4r_+*syAdm}rW72_^YbSppP{zGV5j)n6>{~uN@)AoF|GJTL~e<7aB{%vRdAO>Nl z&3ZlFGz7HRPL?K!7eexuMgyC?tIDYHp&%}9Li3%LDA5Gcmi8_AlvMaqr0Y z!baaj-dXjWxIvn7{ucA8+;%IZ%tkm25zGj<_LHMj1RbKsyPfGMBCsTf;Q!Y6j9|`y z$U2L35Wd5TFoQ9ag-a(FY&84EkJLN>JwM!=BLxT!*pmOHZ^@xZsyN?gz64MG^NW{b zy-R|F#t2aGc)PRsEb(nC>=CE)zG-FhdA2Zqt*yNgi{iZ_q@Zo@oPXmco89SUAxKom zGcOY3?It19y*P<0Bjis(HNn7F5|mil_4G$xjWn$M?L{*&VzPjmF9>0qWz|vU^ZMN8 z16PM8dIuz}{vD~fU$?XN-3`yR2pNgc<$j_u`pD{bR5i7cXx!Mer8FvOzC1CD3t2EW zdD1wK0(sn4sAK&>gU)yRZ<2=NjN8oS88qdk`G^A2{mb%eYpYI(eHnNVVVD8U0bfmK_LgKKv6hw!WGVNRPCB-SwHL z7r|8(6^gv!g2w0&%GCG-UQ5Ib_!(W#NKgSSKLbU$+liIdqB>M|h}YxC5Sy`aNc4?9<+Qg7}@X!p5b!^-#p!z=|p1?D{_Z+%hC%?wAI5iHwJ;ufCa9 z@#SSIlz$K$(n^fp=UG}ks?3Wv5_ItFXo;8~nq9ptUa)ZdS_{7F7)^ZX*G6ff4ZX%7 zj|q(JSP>JtsU+r0NOL6i+sL-1zQ72}-SV~3flzI5O1 zl)!_;|DRzJ5OGFUCPWm2mR&kkd=wA#U@-+5ov{PlMhuJ6AWJad58IR@;ut*_tzc8_k!Ep%)492CaTZFBDQx!Ex1JZgP zdMVb?(od~;7h^@;zs*SXc%%t?Lt}&=EAW{H4_l|D%6`{f5Q*#uSOOX)F8=71^^iyq zql;}F-sBwx+G?x1zAOI`2E#Dw)DFJM!`}P+%x^T*z5dHze(6TP=%aBh&+s5f*x;9)BNTd@*bHVTR8$^)jKh@ovDvcPKx}fY)mYUazbq#F*V=4 zl9BA4s7$bI>RAjB4${dB@~HjLIcWdmdS(2OQhes_=f{kHq4T{P%|4@qY@*C&pPW2G z63)It9+3_VC8;{MtNt#%i)`?LTpJOD23CC1$U3 zPv_74Cs9?{B6R$dIuI@7sv0Vu=f~n^ovVp3+EnZK{4fxJay5}xqU9kEZkwNH|wKTOnw?|T`*-p(s z{fL2g;KET=pKOFwQez~`8kSJCKqKd;KUkxUaqI2fo|+FLe&h2TwmvDD7I|nTG8fTj z2_O8^rogneJdKeAZo+8K7K?At6!N%{k1E_5gsF-pGH80|Ei^|0zuu_u+LL?0Pp8{{CUW*8r zd#Y#+J@XjR^yneB3XkOAqTfic;O|U^i*Cujjs==|(yU(sScru{@6ecW1^1)zdN~-* zKHb@lE=HX8;<1UStmy$Z>YW2i8NVWZs~nT~smGYm=VkQ0K!CG%9 z*~#8OuH$b+2P?YG;g79;9|LNrHJRQCB14hBZNIcm)xM*Jx+|KvF&}1<9NPH_JPNGE57X!!52? zwE5rO#6SwC{?mxiM!$0fe^x&y3ItW>;D@+Hlp1Klbj5#z^GEWj2*8*ta;k+8BF_); z?CXxIST?7}$NpAErvNsCrwEGN`$o^^aE_Srow-ns?v-oakTGC}RT=jMdMZJqr=Bb} zLTZapN%Q|+0G9l~6hw*nV5A15zx{CGVsgZtXG#2A3DiBadu~24MvusimX=b?VR&OC z1wSYK`bqn@{OuERu^RIgU#!j=9jor`E=E$;e+8ZB~DFq@ERfFvT#8TnROSL_7 zvW9}emUL%;5wz%yu1&^Ax+a#ezN7gH3U<;I0-FRifmnZV{7eL)S7VCW&gFgAHCy9U zq3oBVkA(f%RuZd+CcWo+>S7FO+$!&zMf5(paffwk9AudskRHv5Bep9jmVTc}p`TwfCQVO^MvN;?!yia#bsiRAAFeXxtl62O!J2NcDP8XRU?`E&a$ek|norvdfT7)gL>Ptx zUo@cY{Xa&z?+HU1QG2Kgw^-5IDjJK4^)xwUv?@0P!O~_y$U>+lfpFFOzWo~EeKRuP zht4x_AdU=C?(-^+4)nu5BY;a9`M`DAnl*}w#oRz^Kwv zS1|x=p{g#DgFyQ7Zh1xG7I-HQ4`aNY+VW?VuXrywdgRGmE}jdIFIA(b;m0%)X!O*z zOLfukA^qRQtD_FUP*d?ogSaUS+n}*Hwm9pUUV=qZ%vjCO*Kg?s!JQvQ0Jl<{pAtOM zB4{83#mC(EpUi^p9{L)IFh_0FXrr_NOvTa+ylmlP`Lbw@U*I;p7J30GHZD0`PCoPgD#ECa z9BPXh+lD5ulr~1!zYSCXHJM=_FI@;)i$l^x)!E-jtSfAQ8$77v+g&uG9J*h}^sUfco1KY;S)tV-vfD zs!HT3z3y5LX#!}}xm0Jfzu>w-9U(`MSM7sE`83Dli-`bgTFZk-eC!%WS8V2(B0cXKMt7HoR&&6G^Y9FpxjGJN-dwYd4Y z1P$2zlD#N}C?P<2bTx3`Q`ZK;Rt;}3Aa3h#9HXLHK)bf`^p->;LE!%Nm+s?_7r@|z z2)_B;w`McKv3noazG*+dH&GwECFJ>!@Aa3xmG;3$H1%;p}#gaaAd|pd{Lt9N=zNR>E zJ!)`kpxP+jSspdI2$db*`_(+G$9E)&$NB0M2_4y7XLQ5wQ@(b$!g#URm3|II0`7Kl za_JkgUpGf~I&H34Dp_wU8n#HQc+kP{>DBR1m2#J!IsTX9Gs>@Prn1#Pk9NdLv*q9ObeK{@aUrZ1lYc{l9^Nig zZot+%t|khGy0`PF2hwtZcn}G#Z>Fu`^cVTYA@y0=8@Vbh&8HH@C_qb0>zqLHI3ZWr zS^-wt19LrMmO`S`LVqsQYoX-gp0k#wVk|9*w|-RP>i=0vg~1Y{%_lhAXoE;*Gd7 ziyqFei%U!47KSs%+2~M8or$7ioMNnF3jX!G;fJ=ie&gpOZ9l+fNoI#f-woBuK8@#Z z)A*;`=8ky}7(P{5CUC)VHMS8h@1mi$=dDt2O2OqDWG$_3Mr0C7gXs1qjXM%R?y|Az zO~<_?Mix8i-O6?<5Kx*U;DtN*CC`MkFn-3&Y3s>->0+z zM?=m02*_p=P=Nu&Xlbl-j|iJ&&eZRF@fUgyanUyYU`ps_H372~+WulRnLqiic*vs8 ze!75!0%*^^`1pIOE^Q!MwDc93I^UHm%Vh6{lHitN8(y&Qy1Xewc@JY>5 zTV|=27IMASxbJ<}xT^qqjZw#Iyee1UZtk-?PsNr2v#h$YF)DPJ_w_#4xRpj?qUlt* z*88cODwE%Hpa%@&`Q3z-&jTRUQppR#*t~=GO-YU!0`dm_G29FL$~C1JcSUrCNOIbC@;O3BF$GV-roRjRHA zK03TO7v`LuRbF`8dzhR5;Zt7Bic;0s9wK{7{W@1F)_8F_$}O&z$YopJvJ>)eYR*0F zkCY!72+CV;%V%avrSZ8JJ^X1GUqaiO1f4?PQML5JRo;u9?Bi5M6EM8H?uTjA_zBzS zMa47Gp5IyP{$KdDN-=v|*ptTBfl)NS9%i;Pe?ZnJL(8K>zR#8vR91>^#t8(~J7D1D zNCkLcW)vu~?fd<7?AAKorxxDd|MCaBw`5#@ul@RFW%A|a7U!XH5l7^2*FO)BYgIXO zUgOXLF5S$I%Mtd@2DAQXMBm-7zG4l>oP*}I`1c?~)6Wqe@@TQtqU0VP9tj!+?{#C~ zMwU;R{7zLymp7S1E(jChixFCe*m*&4dt$3=P#77Y$#Lxl3%6h*lOLzA{Y!rVUQyd} zh@f&91YCWy$f)}tv$vc!nuTaYcdQ$cmY^NZcjG1_MK+BmPVSGcw_f&FRMjxk z1pc7s(+QgU}*vJrP)MLU_`MyA9upBy7_dH+2MG>f!}pyA*I@zMp$np5n7CgeuxVpmWytM zS-;VZr4UA8NaI8QEbBZ04i<&3t-T&^uvT|IpCK4(;*=&IrdUoZy^n;Gj3gme z8p{cdT#LtSiETt%TN@!@!8!P)8a_$AZubdpLTR2%3=~HP*o)jl+83IrraUUscCRX0 zL720BZzs7CK>fDNB=j-}u*CtwwK}UbRU7`FDKnlru*oZTh3_ z>2Xz1?S`5aXtceU{zI=FT|@qdLF3UedZDrSkMC%3H=cm+-gKIngHYhZ>|T<__p7(@ zqBp-AFt~s5G>aQiC=z1y0Zcv^;#X#`NxXi=GWMEk#isf347k3&hC^XU)p6Q;2XbF@ z6$w>Pux)x8j|&7-V$#_l&hFML4G3@0PLH$P3>Q5NJeMqG3fZ^h0}{<73V4u7Uj8i! z_&?cf%sVp}7ITx@EWQ6BiX@aYoO8f(|G&_6N>e!t<2}Vxs$4UXXHSj^HWwKUW{yh89EXP9Hq1+vm|iu{fTRJ z2*)lw%fRGPN_boxw*5veRT$uSp;AgLH`12$;PkX|EjO5H{p*ip z@2Bt9wU#TM7H&Q?mNKRtgZpGT0|V;6fB9et2?X zAAD|!eS^Zu0PB8E_qC;2u9wa9i9;ka>0_OGDO7d#6v^r$k0-`17yTr?e4HR~;;==R z14cqz;~Zhcux3f#&(da6RNs(;GhL#I@Za=bgrSE5TrEyM@9meP4f0`UXVgD*8i|o6 zY+~WI17}D2Zxgh}EVS7w^x4A_=uwakz(i}IuPUg?aV5_9<kHK4jqZt!gA5;W zD%_0mc-x~$>;7}=C}?oi-0Itp^|Y!gVh^Tt`>Dnc>0Z2Ysn76dbOUXLSc}M^Bl3KK{-=> z6l%Yx$=}n<=n#;*a&Jq7-p&|;{R)apczx)|bBZn8=$R%9q$TvwQvaQz)$V@y#`5Mw zx7X;!=;bBjx0Z27esHS>S{NYPu>IiVEIhfNH)_cqr8Vnqj)8n$b2FUIrruH;(glPx zdn+W$Gw@hmTG+2Ppdt54XlpZNG%nO^uag2a1jA|oXj$Id z7xeckr!*_yUIVX>x!WHe(BRHi^$%s`C?zaa=px}gEJ!3e7wh`)c0A2}RU|fJ3Mm_E z6OGK zhpE|QphL50zqwIlDW;{Mg{z14g5kQa`DFtc-PbavXyOp^Xk1RpU}AJZxAAlYc_5d- zCY!9_QFZ|fl>~q*%cmM2DHczSmA2>~W4&M(AsTCz)<;;^dk4ATk?aAxOeRp_W(qQE zu)EOi-hDPeMVm;P9uEYbnx8$^->-p~7SHxWf>=$3`yXFA;PJJvx4{a^5;W*?kEBJY zK&10P#zqNf3EdPvdML6;IOhU0ZtPIP)>WE~x;O{v1DT2h2w_Ny*Q?CdD^$ox zqjd>K#~19+Ar>oH^qIr70+NkzFez~;WXq9IuA@G65bkRIBZLOd3Km?APzDjoPOq=W zd1N+CsRwqj$tJ(yoHQ z+Ki+Q<&kPCi=?84r8qB8QRVP@`@P)zOcxZ#9y}2*zDPu-x<0+O&X)V}f>lR=_qo#q z@Htn(zyov zi|ejYb=xMT20Ez^dVPWyM=^i*J2g_i1Us_dR0259J|t!dbLP|K#GFX1Usqp`w*uvL zXB?3?aEAjmlMuhnoHcSqixMjl=&{7g3m`eJ3}rB3_6j_~F7sRUnH4?FEqhFx0+p)oubn|UhdUS~JFt}6&&Lin05S5Q6@WY~?|)OZG) zbKm(_5~Ktrqviaa)mx`@d!2nd4gzvd%cmq%8I&g@Xs9hlyJ;K9wOnF0fU-E&p$rdE zzcAkvtD~?c)#U<7`@W*aVxV;l04lf?CrZWd_!4aC0MdY$O)vGfZZSWEKq!i2ipA`fl7;3WlEkGSRJ7Lgqh^bC+a9nYU&J6~^XQ$d-!0+~zyyW04 zSG9+{B0Zd{_#>c0D1Njv1GAJw}-xUD>6VuyL4O9Fngf{HR{ zIT7|bk<{5}i;ud<-Ep9inZ5N%l3r$A);$v?M>n}G?24Rkp>j=F4^M&T#qJF`e#OyP zTq+YCSCwF5G%0hyeu}u#H(tv_AaX<1p{fcgf63J1qTHWpH7Ps&$Jm?+BX3LY@^Z=f z4}^8LAaGtdQKU@(MhPvE;KKN*3epCHq6A%WkGiAvP=V$N#O-wjCJ4&g4u*ukqPo{UIC7bae zy!7EIfq({E)S92;+<+@h5@-@yMCBv!oedfR0cu)QDGpN5;KSKc>k`$>m$_w}g(^ag z5LWbQ2wq=>-FND!;P2%5N?;_UwvsncG!Kthka;ZJJIRf4)sx38H1Beq~liVeE#VgfN)3Da({di7HU%nvQuV3PQss~vcdtBn0B%3 zfDsQ>wC1UT(_t=AgMUDWYy->s#E;&A)(VVaxW|yRuyTg8&UB?;TiMuxFBia6dxA6YC$L_WY_**LH9O5Z-sYo z>_tj|k|~Kv*~n`n;P%BLsO{s%>$+D-`z8!&T~ zDdtR*nxR&xj!tL|7HA@IbhllPe1j7&OQ5?wdD99Aao(vDj3uAHyWM!%<4;BCdOOJ> zQgb=g?Qk^ry&{D}_cA9zpa5RNg+ss=>BMp3Ti))To@Tuf#C-%>ITZ*pv-uG{phF=J zuDnPof%`&hTI%?%HLuiy=883LdM!e%o{J?(P(*u6!T0E#5dkgJWQ~Kiq;wZ3i{Tf3 za2^jbEefF)#*RVuN-3_2_1i+ijB@yXKS^~$HE1^>avSxs`=X(Ei)m217=Pfu&X0&X zSb*Hts|_xpn=qfU@8vx%%vtaL)#?soh^pmGTz$db^Z%tpCdBC&{ zCM?X9G%p(AT}Brxb8c*^ksl&Nz2KWe$foE5BrK!@HIdF@ zkEqTWBu1(*Zvif6?ViQ+*cu?E*Q9$moZQ) z=e0GV)Y@R;yl&9A^d&27LJF!nsPoV-n*iqMq)BSqF4FYsJFdDMhHaS4+3s}ihNu!< z#qN6htM*BpygL(4zO>m5%gY&=ti?K=frt+e8nj^{ZL@NZ4;s#VRD3*I;pMip$-v}o zcst@+YH~g5!=9lp7i@~SwzQN^>xe#4U#2pmj7|FTod<;rsV6awhL&{`thUYJ+x{@3`1_Y7Mo!R{3~6|lxG+8=s}Q=3DLlJ9v1GIAhMJ+y z0tgb2dHRDf^8b#5aRB~wDE>jFQ^$R!4o6!8Z}j>)b*b?b+FX`I$Qzc7y&pO1D5~Mi z+B{u^{hjlEt?DI*w9(N9T*j%B`;m<30v<=nm9h9N(Fii?-K$`MV!U?t(+U<^T2LgN z3Rk**U_?=x1Fnso-QYr{zUfj^=C~m2M?-R$20|~(=F+|~OK|F)tNoc-s=l@qNYcaO z9g|WT$XX0s8F8d5 zs-TYoJ+X|3%!d{j5`4C82Uo@vphhQq=04EO{I+Y_;#6cMn;M2yf~EP^}>8 zkJXxyo6l>vxxi-qkS;!D`;`uJ9jx+LUijvUnEq~Lx%>pF_n9(c@FP`DEEnFmgqjkX zWT5bg?s&O-i@GKA@`Ova%wRx3Hf?dl(d+sPfVL+hag^AOa@B-q(~kl*A&N_v3@3ytnLk0Jhfn#+!$D3} zwOP|!7BI>u0g}tJ!a9&VhnM?zhHkTqlFQNP_vEe$(>EwT1Vf;wb%aYYE zD94nG{1tNCw|Jr!HysEF?(DSa$y<7uOz# z|4nwDHO#8iSG8WG#N$D;OEu9m-E7KnGt-Midx)445vE2^DkP>Inz@O&_H83$uSUQRtoDxU1r(g_DKV z$s(R!?52Z3hKk;8myc z^WUJ?#b6Cn(eC5^RybhTAx(J>0hCw4d~!-+lujJFd)#>f%`bU5@%7;z4#LI%sk*54 zXC90*7~D?{lp`{NYQZJK!=q1s<`-QCY?;mbN9G-wn~`O-Rvg=}Q?vn_5fo4oDY9bL z&XGhlXYf=i6icBYk(v)KyKdc$z--ePm1{3-2%BtEkeIUmovu5KvqHANl-c_wM0nP{ zDPQIeQh_PMcOg=Kd3b5iUmEqg*p)}sB=7m|Q7u*ki_nCebJci%7iKnu+r=4v*e!k7 zmWy<6pUvdwEDGB!K)9mTJ7`|l4RJ9aq^r3z&S;?zuBCO|SGY;2vd;FNX5aoQZ(TPn zg=s@4f}yr7%YYX@IJGdXJ6Dj1pXgjRj%Wbz;}FmUW+be45Xvjypp)_ak>t5!(A}WI zjI0Yo+F=R+u3 zJv&taiGjMFSE_dMk}RGvKk%)}{AxtxU$fSQ`@&Egny;V;?3#fl2YTk)`oYennN&c) z&ZSSI8qZfEKDi?)KOhx_h{d^etxwRUqQBLW92(Fvu6-W@n~@rW2v<4Rih^MJ_e|M6 z`GKQDaw_5l<90pBE>=O@L9fpvt38RO=^#+Tq$O{;i@YVTa5gBP1)9-9b-qre1^qt& zG(pS0IrfkOT1qL3jUv)trHe%)C=`s6;v@;6Az8CMqHBUNrb3aDamVcHPFnOlcCuAhB}_&sRJUkJ04Nv*cE|zk37dNv4hdlDq$X_IyrraXQ%Z^6 zo^CU&YZ=NEztG+^txBe2PiO}4?uu2YZx{vaBIt8v4R&gwCpS&(QW%4(6vZxu7}|*B zI)Kc+001BWNklgwYA?`h6LJLTcxh5t<>$nwz+^|7?n)N z$b%S1AjYqP^ehwk>4SGB^0mIzSuBaT0ZKQ#_p8pLcWj>>zbjkVof+9GYxFkv+#x8c9#)C(yCIFffGU=S}uoan!*!93{(uDM2AgEU*9brj}c0+#VIXy3Se^i zLR|&Tkpf-JV5Cwh)Kpgu3awXWDumqSAXkO4jANl4`nlkVLkj4=RNB|Ul&N zFigm?(5X}!l+Z4KfHLNGU!&qfk2r=Af%uQOHiQHM!a$w6bB%V{U&a_qF-qOxL4c4$ z8)ARZ0G-Zcd>LG?70W-t-gsGBEJo_-=|Np>RVyJB#8o)WB`30&GRoz0Ojot-gn0EF0-0=% zZr-w`vbZu*3r&idjKPu^!B#`T`7VjJxkyu1JWjq)z-zC)t{*Z$n}#8aohe0~WD*ES zya`Pb5{6MA_4TzK3T2>7fsg`*X`;8cuafB)k%=zWYIrUO2nIBO6ZZ}&t(yR@EIcKubcTUsLDHJ{M~cWk1z<061#ur1of7myTYugk^JNbGgdm%7`qq z3>c20oSDb7B&1Y>dN(ddNYnBFz?_n3aL%!P$BxJ$12l2RqIu)df}0g`cl#d@X zdzKl})DC~O(6-Unm#P3g5}<_$lJh!Rn7FTfB|wlS*styuX&p|*nO$Sriy<&cB89L4hgqA1PaTfR`}6GB2) zT~#F^kxHjyhYZldU7aEXehU^{m3gQ8ffmURj9`d{LS2+O10fx)W>zU79g&5W{=!L7 zG^g~Q2ojj{LUyflrt5ky7ZRGr{5wD-5~(_5fOa|{iUV$flC?pRh(M4?0l>8FEgsOE z+sNkfm7s7$LChfYYW#+)QcVs0091Md@U2p});Jgb)oCI!Bh|@XHJ+ z?YF$`=?<1m!P(`Otf@|IZQTT2RREX}LZV<8yH$v#2h}+ZoWLiaT!_;?dMfhy0wzwJ zh^p!;y#B^pegy74HWJcXK?o>SAe`AMV=8!#2xt^rtx7LPF)%M$@Y3;j12@YuQ$hlY z%KU3)+jjgA0=l%?>$thcAQFjS)22;0>gc2J*Jq!@X{XNf?~aPwOQ@;pc0vfKqJTT2 z(kjc}BRTt`xUfQ*YoP;)yJE~pAcvr;TA!><34uUOv;^lObjSc5>>DJMqPDgce|`2j z%$_|P3!i=l=bm>?z-CA!5((-&kG6qOFhzwB0;XkE|LKuOSOwAHZQuT{uak>D`Oo;) z*KfeZmt2fwGKstIxDA(He4zsxV<=8zlzvC|&V6X~NQn|5dB#}%ApoWU@I`QIty6-7vS6Yt~^@ zV?9op_Yo{xwj5Vo@vlfGYw`Nq@47t|vZMlGcRqAH9?O6bsET9lB?$6`LhKL%niR`6 z2yp&CpNpRV&)$2-OLA4`qTdb`y1M)1ITNJ`k`)O`NGJiG|9%60|99SvEK3iX-rJeWe)u(cU?i&qfufWY z@?lAm_Pl5eI*+XLVfR10<4$bYa5c7V+m0)*d^Mil{4{p%+)>Dbd7e$%U2(~UvKCcl zsT*M->=2^knT}_;?!NZ{GQZHkB^SLCx8Lz2yycD8LQ08G|NR$B1AscN_GlRTEpK~= zrj*R)Ba@w@dhrB>oeN}*`b}?q12%2igi07f2!ZM8XIymGzQH|gDU}pUAuQmXJg>3G{?ICklLr`ijEpz`7|Xx<4P zj5Zh<8NsEOU5bqxH{qIVHsJ2Ne+(@|;VsI`=X}Bj9~4Sy2q~8xH_>Od?tAcIGCnbZ zD=xnjci#OIyy4e2fD(dFeC{7zcB5OX<7kk>8GTxw3P1>1@uD&4t`>PhaOL{-_|cE< z#)=ioF)}iOfq?;>`I0k>2Unt~_}hcP+na%02R`hT%MMj|U-0lGMB9mRsqI!$UJ#vTcL=?z(W^snAZ-<5`YpxL$JV$@KpFA3_vG zIOm+R@YQczkKcON+u?hBvDYocfR473Ow2Em`|$Se+vmMFfy_SsmzVnsnO<%|~(4t;Mg08r+^0B9%4@a?zXe!Tnp8LS|zkhj0}&A9oN+u(Z~ zg9Cl|!k7LPzxO-uUQ`w&`JhpKwAWNxHI&NX34zoawQ6nP#o?i8N2wpi;CtV@5$BzE zF0w2G=Ntq5{kY}U+mMeOW~>9^qDnZKLk<9FG+T6J&z}C{W_s-FWv8D)fBNvFAcWw8 zSDcHle*Jp9>+Nqvts3Dl!e2-A(1Gu_q*CClGq`i_zI`tagXWZ>h=>Vr?m1_nUhl#7 z?K^PxIcMXhn{UA-7hPCP$5KiafBRWyoHE8J19L?GIBq{DW8Pj!>!*)BL7(2b4X?lI zO5Fe8!+6b=uSUII$7eqOPaQfb=^71kR1eK4T~Nw6ooL&&qO}QM6b9{iyi1aJaBv8> z-g+y}I_oU_;MO1DHLqC@-}eg-UKTBB&5X^|qcF8{1_bRi!9t^PJk#+E7Ga#c^X+fN z4}N$jv{G0$yaZqP(!b)Jzwzr`E}4*{6O#%k82C*gG?*){Xk*Y$lD?xF^rt`b8S;F; zpatY`jk4eQkMH4iue%Bp6XQ7b)KifrDenI9J%xWL8}!?LhaK8lkVrUX+{||?4;8qO^;U#pTTy&Eb2#Qz@{ckTW6i;DZn0j5E)~_rHG=uDRxFj89A!7e;B_^|$++@1u-C8_T#e z!13#Bq{%OsELq0cmaRE% zrpLY-tu}f0yWWm_esVwNW@mBo+BNv%bzi}i>t9uxt&*qjj?F_i=cZ@1A;_eLa&tP3 zIkJ-f3&x6_TM3ry?0DRwv z)EZK%|8-2;cbDckuexuE&}aS9M11l@wsLI%-UaO10MV zIhUc#xo8_p4-5b3g zg%gAj_?{09f;3A9Z~NgL-f>eswzYZdc6#3f58*9uycV0cZpYbYy$mO;T8V%A>Nh)( zgOXzYslm~;3@D5Ski@BgRvN}q7G4~XgS(DzhbXXT-vMmiwgYi1#_f0AgCxr^J~@S4 z#PR%BoOf>d`AhoyMga>sK!DlVc``aWdOXu{jB9#!j{VlV-i`+!egqTa<2dbgRf87M0*UFSGJTxIk&OW{1TCj4FKtgDVEnp5x>+jjU z?W5)I2l{$O8KZ`K9tfd`lLR|=?mC|7IL3AMOU}T~-6PnucONdh^kRJHKX1epmtBls zS+~|2G^L=76jK$HItI*P1Ic;m=13Z2&`whRqA+O2S)r+&58NybZG?6~MczFjL|06R zm!EM;E8slK4LVIzw3Fm`apf4-wq3h%?*l)@o8R!O*g3Knr=4~h)~#8CZ+-Va!59N& z)K+sHCoGQJ=2%`=YZC)b^7hw3NMedfvUx&ZYgLlhH6YMPlC&$z zzUYEiXpgh~oN+Klk!AvoM&pFzrh1H!V}72#>uqnwlbbeUbo2nuJoRLJ_1~|@z~BHF zqws!kq<VWd&NKg!{`3;#cI$eE?-8UcxoeVzxy8i-n-w0n{U4ZVOYV? z&=44-2rCuqp&jHfN13rw0v&UC?%L*}P0z-sw~{kYJLMn`|Ni&C-@IT9nlbL?0h#U* zHJ$0_fP*4J$U_R9c$`f|0mlU=58?E+LwM!6C;mk|v*U02>lISPoVoZ!VzT8P6=De5 z3?UPzKq&nB{QNv=CxQIL2fv$wkXa2rM~oadgf(NuTQM1$peCI;@wAKe3)P?>dFm

FRgB^PT_e&2M^R#^unB) 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%0DDx7UqQts5;AUZ=MxpC@3sFcGUCO?3+KsrduM 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 +#perimeter_speed = {if infill_speed<60}math.ceil(round(infill_speed*0.8){elsif infill_speed>60}math.ceil(round(infill_speed*0.75)){else}60{endif} +#external_perimeter_speed = {if infill_speed<=60}math.ceil(round(infill_speed*0.5)){else}math.ceil(round(infill_speed*0.75)){endif} +#solid_infill_speed = {if infill_speed<=60}20{else}math.ceil(round(infill_speed*0.3)){endif} +#top_solid_infill_speed = {if infill_speed<=60}20{elsif 6060}math.ceil(round(infill_speed*0.5){else}40{endif} +#bridge_speed = {if infill_speed<=60}math.ceil(round(infill_speed*0.5)){else}math.ceil(round(infill_speed*0.75)){endif} +#bridge_speed_internal = {if infill_speed<=60}math.ceil(round(infill_speed*1.5)){elsif 60=2 + +# Print layer_height(0.08mm,0.10mm,0.12mm,0.16mm,0.20mm,0.24mm,0.28mm,0.36mm,0.44mm) +[print:*0.08mm*] +inherits = *common* +layer_height = 0.08 +first_layer_height = 0.12 +bottom_solid_layers = 9 +top_solid_layers = 11 +bridge_flow_ratio = 0.70 + +[print:*0.10mm*] +inherits = *common* +layer_height = 0.10 +first_layer_height = 0.15 +bottom_solid_layers = 7 +top_solid_layers = 9 +bridge_flow_ratio = 0.70 + +[print:*0.12mm*] +inherits = *common* +layer_height = 0.12 +first_layer_height = 0.18 +bottom_solid_layers = 6 +top_solid_layers = 7 +bridge_flow_ratio = 0.70 + +[print:*0.16mm*] +inherits = *common* +layer_height = 0.16 +first_layer_height = 0.16 +bottom_solid_layers = 5 +top_solid_layers = 7 +bridge_flow_ratio = 0.85 + +[print:*0.20mm*] +inherits = *common* +layer_height = 0.20 +first_layer_height = 0.24 +bottom_solid_layers = 4 +top_solid_layers = 5 + +[print:*0.24mm*] +inherits = *common* +layer_height = 0.24 +first_layer_height = 0.30 +bottom_solid_layers = 3 +top_solid_layers = 4 + +[print:*0.28mm*] +inherits = *common* +layer_height = 0.28 +first_layer_height = 0.30 +bottom_solid_layers = 3 +top_solid_layers = 4 + +[print:*0.36mm*] +inherits = *common* +layer_height = 0.36 +first_layer_height = 0.36 +bottom_solid_layers = 3 +top_solid_layers = 4 + +[print:*0.44mm*] +inherits = *common* +layer_height = 0.44 +first_layer_height = 0.44 +bottom_solid_layers = 3 +top_solid_layers = 4 + +# Nozzle Size(0.2nozzle,0.3nozzle,0.4nozzle,0.5nozzle,0.6nozzle,0.8nozzle) +[print:*0.2nozzle*] +elefant_foot_compensation = 0 +support_material_interface_layers = 0 +support_material_interface_spacing = 0.15 +support_material_spacing = 1 +support_material_xy_spacing = 150% +support_material_contact_distance = 0.1 +output_filename_format = {input_filename_base}_{nozzle_diameter[0]}nozzle_{layer_height}mm_{initial_filament_type}_{printer_model}_{print_time}.gcode +thick_bridges = 0 +bridge_flow_ratio = 1 +bridge_speed = 20 +wipe_tower_bridging = 6 +wall_transition_angle = 10 +wall_transition_filter_deviation = 25% +wall_transition_length = 0.25 +wall_distribution_count = 1 +min_bead_width = 85% + +[print:*0.3nozzle*] +perimeters = 4 +support_material_interface_spacing = 0.15 +support_material_spacing = 1 +output_filename_format = {input_filename_base}_{nozzle_diameter[0]}nozzle_{layer_height}mm_{initial_filament_type}_{printer_model}_{print_time}.gcode + +[print:*0.4nozzle*] +perimeters = 3 +support_material_interface_spacing = 0.2 +support_material_spacing = 1 +output_filename_format = {input_filename_base}_{nozzle_diameter[0]}nozzle_{digits(layer_height,1,2)}mm_{if num_extruders==1}{filament_type[0]}{elsif num_extruders==2}E0{filament_type[0]}_E1{filament_type[1]}{else}E0{filament_type[0]}_E1{filament_type[1]}E2{filament_type[2]}{endif}_{temperature[0]}C_{printer_model}_{print_time}.gcode + +[print:*0.5nozzle*] +perimeters = 2 +support_material_interface_spacing = 0.25 +support_material_spacing = 1.1 +output_filename_format = {input_filename_base}_{nozzle_diameter[0]}nozzle_{layer_height}mm_{initial_filament_type}_{printer_model}_{print_time}.gcode + +[print:*0.6nozzle*] +perimeters = 2 +support_material_contact_distance = 0.15 +support_material_xy_spacing = 80% +support_material_interface_spacing = 0.3 +output_filename_format = {input_filename_base}_{nozzle_diameter[0]}nozzle_{layer_height}mm_{initial_filament_type}_{printer_model}_{print_time}.gcode +infill_anchor_max = 15 +top_solid_min_thickness = 0.9 +bottom_solid_min_thickness = 0.6 +thick_bridges = 0 +bridge_flow_ratio = 0.95 +bridge_speed = 25 +wall_transition_angle = 10 +wall_transition_filter_deviation = 25% +wall_transition_length = 0.6 +wall_distribution_count = 1 +min_bead_width = 85% + +[print:*0.8nozzle*] +support_material_contact_distance = 0.25 +support_material_spacing = 2 +support_material_interface_spacing = 0.4 +support_material_interface_speed = 100% +support_material_xy_spacing = 80% +support_material_threshold = 50 +output_filename_format = {input_filename_base}_{nozzle_diameter[0]}nozzle_{layer_height}mm_{initial_filament_type}_{printer_model}_{print_time}.gcode +fill_pattern = gyroid +fill_density = 15% +infill_anchor_max = 20 +top_solid_layers = 4 +bottom_solid_layers = 3 +skirt_distance = 3 +skirt_height = 2 +infill_overlap = 30% +bridge_speed = 22 +gap_fill_speed = 30 +bridge_flow_ratio = 0.9 +top_solid_min_thickness = 1.2 +bottom_solid_min_thickness = 0.8 +single_extruder_multi_material_priming = 0 +thick_bridges = 1 +overhangs = 0 +wall_transition_angle = 10 +wall_transition_filter_deviation = 25% +wall_transition_length = 0.8 +wall_distribution_count = 1 +min_bead_width = 85% + +# Print quality of Common printers with different nozzle diameters +[print:0.08 mm SUPERDETAIL (0.2mm nozzle) @Geeetech] +inherits = *0.08mm*; *0.2nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.2 and num_extruders==1 + +[print:0.08 mm SUPERDETAIL (0.3mm nozzle) @Geeetech] +inherits = *0.08mm*; *0.3nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.3 and num_extruders==1 + +[print:0.08 mm SUPERDETAIL @Geeetech] +inherits = *0.08mm*; *0.4nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.4 and num_extruders==1 + +[print:0.08 mm SUPERDETAIL (0.5mm nozzle) @Geeetech] +inherits = *0.08mm*; *0.5nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.5 and num_extruders==1 + +[print:0.08 mm SUPERDETAIL (0.6mm nozzle) @Geeetech] +inherits = *0.08mm*; *0.6nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.6 and num_extruders==1 + +[print:0.10 mm HIGHDETAIL (0.2mm nozzle) @Geeetech] +inherits = *0.10mm*; *0.2nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.2 and num_extruders==1 + +[print:0.10 mm HIGHDETAIL (0.3mm nozzle) @Geeetech] +inherits = *0.10mm*; *0.3nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.3 and num_extruders==1 + +[print:0.10 mm HIGHDETAIL @Geeetech] +inherits = *0.10mm*; *0.4nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.4 and num_extruders==1 + +[print:0.10 mm HIGHDETAIL (0.5mm nozzle) @Geeetech] +inherits = *0.10mm*; *0.5nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.5 and num_extruders==1 + +[print:0.10 mm HIGHDETAIL (0.6mm nozzle) @Geeetech] +inherits = *0.10mm*; *0.6nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.6 and num_extruders==1 + +[print:0.12 mm DETAIL (0.2mm nozzle) @Geeetech] +inherits = *0.12mm*; *0.2nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.2 and num_extruders==1 + +[print:0.12 mm DETAIL (0.3mm nozzle) @Geeetech] +inherits = *0.12mm*; *0.3nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.3 and num_extruders==1 + +[print:0.12 mm DETAIL @Geeetech] +inherits = *0.12mm*; *0.4nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.4 and num_extruders==1 + +[print:0.12 mm DETAIL (0.5mm nozzle) @Geeetech] +inherits = *0.12mm*; *0.5nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.5 and num_extruders==1 + +[print:0.12 mm DETAIL (0.6mm nozzle) @Geeetech] +inherits = *0.12mm*; *0.6nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.6 and num_extruders==1 + +[print:0.16 mm OPTIMAL (0.2mm nozzle) @Geeetech] +inherits = *0.16mm*; *0.2nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.2 and num_extruders==1 + +[print:0.16 mm OPTIMAL (0.3mm nozzle) @Geeetech] +inherits = *0.16mm*; *0.3nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.3 and num_extruders==1 + +[print:0.16 mm OPTIMAL @Geeetech] +inherits = *0.16mm*; *0.4nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.4 and num_extruders==1 + +[print:0.16 mm OPTIMAL (0.5mm nozzle) @Geeetech] +inherits = *0.16mm*; *0.5nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.5 and num_extruders==1 + +[print:0.16 mm OPTIMAL (0.6mm nozzle) @Geeetech] +inherits = *0.16mm*; *0.6nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.6 and num_extruders==1 + +[print:0.20 mm NORMAL (0.3mm nozzle) @Geeetech] +inherits = *0.20mm*; *0.3nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.3 and num_extruders==1 + +[print:0.20 mm NORMAL @Geeetech] +inherits = *0.20mm*; *0.4nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.4 and num_extruders==1 + +[print:0.20 mm NORMAL (0.5mm nozzle) @Geeetech] +inherits = *0.20mm*; *0.5nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.5 and num_extruders==1 + +[print:0.20 mm NORMAL (0.6mm nozzle) @Geeetech] +inherits = *0.20mm*; *0.6nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.6 and num_extruders==1 + +[print:0.24 mm DRAFT @Geeetech] +inherits = *0.24mm*; *0.4nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.4 and num_extruders==1 + +[print:0.24 mm DRAFT (0.5mm nozzle) @Geeetech] +inherits = *0.24mm*; *0.5nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.5 and num_extruders==1 + +[print:0.24 mm DRAFT (0.6mm nozzle) @Geeetech] +inherits = *0.24mm*; *0.6nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.6 and num_extruders==1 + +[print:0.28 mm SUPERDRAFT @Geeetech] +inherits = *0.28mm*; *0.4nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.4 and num_extruders==1 + +[print:0.28 mm SUPERDRAFT (0.5mm nozzle) @Geeetech] +inherits = *0.28mm*; *0.5nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.5 and num_extruders==1 + +[print:0.28 mm SUPERDRAFT (0.6mm nozzle) @Geeetech] +inherits = *0.28mm*; *0.6nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.6 and num_extruders==1 + +[print:0.36 mm CHUNKY (0.5mm nozzle) @Geeetech] +inherits = *0.36mm*; *0.5nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.5 and num_extruders==1 + +[print:0.36 mm CHUNKY (0.6mm nozzle) @Geeetech] +inherits = *0.36mm*; *0.6nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.6 and num_extruders==1 + +[print:0.36 mm CHUNKY (0.8mm nozzle) @Geeetech] +inherits = *0.36mm*; *0.8nozzle* +perimeter_acceleration = 800 +infill_acceleration = 1000 +bridge_acceleration = 1000 +first_layer_acceleration = 800 +default_acceleration = 1000 +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.8 and num_extruders==1 + +[print:0.44 mm SUPERCHUNKY (0.6mm nozzle) @Geeetech] +inherits = *0.44mm*; *0.6nozzle* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.6 and num_extruders==1 + +[print:0.44 mm SUPERCHUNKY (0.8mm nozzle) @Geeetech] +inherits = *0.44mm*; *0.8nozzle* +perimeter_acceleration = 800 +infill_acceleration = 1000 +bridge_acceleration = 1000 +first_layer_acceleration = 800 +default_acceleration = 1000 +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.8 and num_extruders==1 + +# Print quality of HighSpeed printers with different nozzle diameters +[print:0.08 mm SUPERDETAIL (0.2mm nozzle) @High-speed] +inherits = *0.08mm*; *0.2nozzle*; *High-speed* +max_volumetric_speed = 15 +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ and nozzle_diameter[0]==0.2 and num_extruders==1 + +[print:0.08 mm SUPERDETAIL @High-speed] +inherits = *0.08mm*; *0.4nozzle*; *High-speed* +max_volumetric_speed = 52.8 +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ and nozzle_diameter[0]==0.4 and num_extruders==1 + +[print:0.08 mm SUPERDETAIL (0.6mm nozzle) @High-speed] +inherits = *0.08mm*; *0.6nozzle*; *High-speed* +max_volumetric_speed = 117 +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ and nozzle_diameter[0]==0.6 and num_extruders==1 + +[print:0.10 mm HIGHDETAIL (0.2mm nozzle) @High-speed] +inherits = *0.10mm*; *0.2nozzle*; *High-speed* +max_volumetric_speed = 15 +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ and nozzle_diameter[0]==0.2 and num_extruders==1 + +[print:0.10 mm HIGHDETAIL @High-speed] +inherits = *0.10mm*; *0.4nozzle*; *High-speed* +max_volumetric_speed = 52.8 +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ and nozzle_diameter[0]==0.4 and num_extruders==1 + +[print:0.10 mm HIGHDETAIL (0.6mm nozzle) @High-speed] +inherits = *0.10mm*; *0.6nozzle*; *High-speed* +max_volumetric_speed = 117 +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ and nozzle_diameter[0]==0.6 and num_extruders==1 + +[print:0.12 mm DETAIL (0.2mm nozzle) @High-speed] +inherits = *0.12mm*; *0.2nozzle*; *High-speed* +max_volumetric_speed = 15 +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ and nozzle_diameter[0]==0.2 and num_extruders==1 + +[print:0.12 mm DETAIL @High-speed] +inherits = *0.12mm*; *0.4nozzle*; *High-speed* +max_volumetric_speed = 52.8 +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ and nozzle_diameter[0]==0.4 and num_extruders==1 + +[print:0.12 mm DETAIL (0.6mm nozzle) @High-speed] +inherits = *0.12mm*; *0.6nozzle*; *High-speed* +max_volumetric_speed = 117 +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ and nozzle_diameter[0]==0.6 and num_extruders==1 + +[print:0.16 mm OPTIMAL (0.2mm nozzle) @High-speed] +inherits = *0.16mm*; *0.2nozzle*; *High-speed* +max_volumetric_speed = 15 +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ and nozzle_diameter[0]==0.2 and num_extruders==1 + +[print:0.16 mm OPTIMAL @High-speed] +inherits = *0.16mm*; *0.4nozzle*; *High-speed* +max_volumetric_speed = 52.8 +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ and nozzle_diameter[0]==0.4 and num_extruders==1 + +[print:0.16 mm OPTIMAL (0.6mm nozzle) @High-speed] +inherits = *0.16mm*; *0.6nozzle*; *High-speed* +max_volumetric_speed = 117 +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ and nozzle_diameter[0]==0.6 and num_extruders==1 + +[print:0.20 mm NORMAL @High-speed] +inherits = *0.20mm*; *0.4nozzle*; *High-speed* +first_layer_height = 0.30 +max_volumetric_speed = 52.8 +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ and nozzle_diameter[0]==0.4 and num_extruders==1 + +[print:0.20 mm NORMAL (0.6mm nozzle) @High-speed] +inherits = *0.20mm*; *0.6nozzle*; *High-speed* +max_volumetric_speed = 117 +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ and nozzle_diameter[0]==0.6 and num_extruders==1 + +[print:0.24 mm DRAFT @High-speed] +inherits = *0.24mm*; *0.4nozzle*; *High-speed* +max_volumetric_speed = 52.8 +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ and nozzle_diameter[0]==0.4 and num_extruders==1 + +[print:0.24 mm DRAFT (0.6mm nozzle) @High-speed] +inherits = *0.24mm*; *0.6nozzle*; *High-speed* +max_volumetric_speed = 117 +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ and nozzle_diameter[0]==0.6 and num_extruders==1 + +[print:0.28 mm SUPERDRAFT @High-speed] +inherits = *0.28mm*; *0.4nozzle*; *High-speed* +max_volumetric_speed = 52.8 +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ and nozzle_diameter[0]==0.4 and num_extruders==1 + +[print:0.28 mm SUPERDRAFT (0.6mm nozzle) @High-speed] +inherits = *0.28mm*; *0.6nozzle*; *High-speed* +max_volumetric_speed = 117 +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ and nozzle_diameter[0]==0.6 and num_extruders==1 + +[print:0.36 mm CHUNKY (0.6mm nozzle) @High-speed] +inherits = *0.36mm*; *0.6nozzle*; *High-speed* +max_volumetric_speed = 117 +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ and nozzle_diameter[0]==0.6 and num_extruders==1 + +[print:0.36 mm CHUNKY (0.8mm nozzle) @High-speed] +inherits = *0.36mm*; *0.8nozzle*; *High-speed* +max_volumetric_speed = 216 +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ and nozzle_diameter[0]==0.8 and num_extruders==1 + +[print:0.44 mm SUPERCHUNKY (0.6mm nozzle) @High-speed] +inherits = *0.44mm*; *0.6nozzle*; *High-speed* +max_volumetric_speed = 117 +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ and nozzle_diameter[0]==0.6 and num_extruders==1 + +[print:0.44 mm SUPERCHUNKY (0.8mm nozzle) @High-speed] +inherits = *0.44mm*; *0.8nozzle*; *High-speed* +max_volumetric_speed = 216 +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ and nozzle_diameter[0]==0.8 and num_extruders==1 + +# Print quality for multi-extruder printers (0.4mm nozzle diameter) +[print:0.08 mm SUPERDETAIL @Multi-extruder] +inherits = *0.08mm*; *0.4nozzle*; *Multi-extruder* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.4 and num_extruders>=2 + +[print:0.10 mm HIGHDETAIL @Multi-extruder] +inherits = *0.10mm*; *0.4nozzle*; *Multi-extruder* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.4 and num_extruders>=2 + +[print:0.12 mm DETAIL @Multi-extruder] +inherits = *0.12mm*; *0.4nozzle*; *Multi-extruder* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.4 and num_extruders>=2 + +[print:0.16 mm OPTIMAL @Multi-extruder] +inherits = *0.16mm*; *0.4nozzle*; *Multi-extruder* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.4 and num_extruders>=2 + +[print:0.20 mm NORMAL @Multi-extruder] +inherits = *0.20mm*; *0.4nozzle*; *Multi-extruder* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.4 and num_extruders>=2 + +[print:0.24 mm DETAIL @Multi-extruder] +inherits = *0.24mm*; *0.4nozzle*; *Multi-extruder* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.4 and num_extruders>=2 + +[print:0.28 mm SUPERDRAFT @Multi-extruder] +inherits = *0.28mm*; *0.4nozzle*; *Multi-extruder* +compatible_printers_condition = printer_model=~/(Mizar|A10|A20|A30|E180|Me|GiantArm|I3).*/ and nozzle_diameter[0]==0.4 and num_extruders>=2 +######################################### +####### End ###print presets ######## +######################################### + + +# When submitting new filaments please print the following temperature tower at 0.1mm layer height: +# https://www.thingiverse.com/thing:2615842 +# Pay particular attention to bridging, overhangs and retractions. +# Also print the following bed adhesion test at 0.1 layer height as well: +# https://www.prusaprinters.org/prints/4634-bed-adhesion-warp-test +# At least for PLA, please keep bed temp at 60℃, as many Geeetech printers do not have any ABL +# So having some leeway to get good bed adhesion is not a luxury for many users + + +######################################### +####### Start ###filament presets ####### +######################################### +[filament:*common*] +# Filament presets for common printers +cooling = 0 +filament_vendor = Generic +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_Geeetech.*/ +extrusion_multiplier = 1 +filament_cost = 0 +filament_density = 0 +filament_diameter = 1.75 +filament_notes = "" +filament_settings_id = "" +filament_soluble = 0 +min_print_speed = 15 +slowdown_below_layer_time = 20 +filament_minimal_purge_on_wipe_tower = 25 + +[filament:*PLA*] +inherits = *common* +fan_below_layer_time = 100 +filament_colour = #DDDDDD +filament_max_volumetric_speed = 0 +filament_type = PLA +filament_density = 1.24 +filament_cost = 20 +first_layer_temperature = 210 +temperature = 205 +first_layer_bed_temperature = 60 +bed_temperature = 60 +fan_always_on = 1 +cooling = 1 +max_fan_speed = 100 +min_fan_speed = 100 +bridge_fan_speed = 100 +disable_fan_first_layers = 2 + +[filament:*PETG*] +inherits = *common* +bed_temperature = 70 +cooling = 1 +disable_fan_first_layers = 3 +fan_below_layer_time = 20 +filament_colour = #DDDDDD +filament_max_volumetric_speed = 0 +filament_type = PETG +filament_density = 1.27 +filament_cost = 30 +first_layer_bed_temperature = 70 +first_layer_temperature = 240 +fan_always_on = 1 +max_fan_speed = 50 +min_fan_speed = 20 +bridge_fan_speed = 100 +temperature = 240 + +[filament:*ABS*] +inherits = *common* +bed_temperature = 100 +cooling = 0 +disable_fan_first_layers = 3 +fan_below_layer_time = 20 +filament_colour = #DDDDDD +filament_max_volumetric_speed = 0 +filament_type = ABS +filament_density = 1.04 +filament_cost = 20 +first_layer_bed_temperature = 100 +first_layer_temperature = 245 +fan_always_on = 0 +max_fan_speed = 0 +min_fan_speed = 0 +bridge_fan_speed = 30 +top_fan_speed = 0 +temperature = 245 + +[filament:*TPU*] +inherits = *common* +bed_temperature = 55 +cooling = 0 +disable_fan_first_layers = 3 +fan_always_on = 0 +fan_below_layer_time = 20 +filament_colour = #CFFFFB +filament_cost = 30 +filament_density = 1.2 +filament_max_volumetric_speed = 0 +filament_retract_before_travel = 4 +filament_retract_length = 2.5 +filament_retract_speed = 30 +filament_type = TPU +first_layer_bed_temperature = 55 +first_layer_temperature = 210 +max_fan_speed = 70 +min_fan_speed = 0 + +[filament:*HS-PLA*] +inherits = *common* +filament_vendor = Geeetech +filament_colour = #F94D0C +filament_max_volumetric_speed = 0 +filament_type = PLA +filament_density = 1.24 +filament_cost = 20 +first_layer_temperature = 210 +temperature = 215 +first_layer_bed_temperature = 60 +bed_temperature = 60 +cooling = 1 +fan_always_on = 1 +min_fan_speed = 100 +bridge_fan_speed = 100 +bridge_internal_fan_speed = -1 +top_fan_speed = -1 +external_perimeter_fan_speed = -1 +support_material_interface_fan_speed = -1 +disable_fan_first_layers = 1 +full_fan_speed_layer = 0 +fan_below_layer_time = 10 +max_fan_speed = 100 +slowdown_below_layer_time = 1 +max_speed_reduction = 15 +min_print_speed = 211 +#"material_print_temperature": {"default_value": 210,"value": "200 if speed_infill <=150 else 205 if speed_infill <= 200 else 215 if speed_infill <= 260 else 220","maximum_value": "250" }, + +[filament:Generic PLA @Geeetech] +inherits = *PLA* +filament_vendor = Generic +filament_cost = 25.4 +filament_density = 1.24 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_Geeetech.*/ and printer_model=~/(Thunder|ThunderPro|Mizar|A10|A20|A30).*/ + +[filament:Generic PETG @Geeetech] +inherits = *PETG* +filament_vendor = Generic +filament_cost = 27.82 +filament_density = 1.27 + +[filament:Generic ABS @Geeetech] +inherits = *ABS* +filament_vendor = Generic +filament_cost = 27.82 +filament_density = 1.04 + +[filament:Generic TPU @Geeetech] +inherits = *TPU* +filament_vendor = Geeetech + +[filament:Geeetech PLA @Geeetech] +inherits = *PLA* +filament_vendor = Geeetech +temperature = 200 +bed_temperature = 60 +first_layer_temperature = 205 +first_layer_bed_temperature = 60 +filament_colour = #42BDD8 + +[filament:Geeetech PETG @Geeetech] +inherits = *PETG* +filament_vendor = Geeetech +temperature = 240 +bed_temperature = 70 +first_layer_temperature = 240 +first_layer_bed_temperature = 70 +max_fan_speed = 40 +min_fan_speed = 20 +filament_colour = #42BDD8 + +[filament:Geeetech ABS @Geeetech] +inherits = *ABS* +filament_vendor = Geeetech +temperature = 240 +bed_temperature = 100 +first_layer_temperature = 240 +first_layer_bed_temperature = 100 +filament_colour = #42BDD8 + +[filament:Thunder HS-PLA @Geeetech] +inherits = *HS-PLA* +filament_vendor = Geeetech +filament_colour = #F5DC1E +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ +compatible_prints_condition = infill_speed >= 150 +filament_notes = "HS-PLA is Geeetech's latest high-speed printing filament. By adjusting the melting point, melting index, glass transition temperature of raw materials and optimizing the production process, Geeetech enables HS-PLA to have stronger fluidity, smoother discharge, faster curing and forming speed and is not easy to deform under the melting condition. Compared with ordinary PLA, HS-pla has the advantages of faster printing speed, higher printing quality and more delicate model surface, which can better meet the high performance requirements of high-speed 3D printers for filament.\n\nhttps://www.geeetech.com/wiki/index.php/Geeetech_Thunder_3D_printer#HS-PLA_Series_Filament_.22Speed-Temperature.22_Parameter_Settings_for_Reference" + +[filament:Thunder PLA @Geeetech] +inherits = *HS-PLA* +filament_vendor = Geeetech +filament_colour = #C8CF0A +compatible_printers_condition = printer_model=~/(Thunder|ThunderPro).*/ +compatible_prints_condition = infill_speed >= 150 +filament_notes = "common PLA filament setting for high-speed printing" + +######################################### +####### end ###filament presets ######## +######################################### + + + + + +######################################### +########## begin ###printer presets ##### +######################################### +[printer:*common*] +# Presets for common printers +printer_technology = FFF +before_layer_gcode = \nG92 E0\n +between_objects_gcode = +pause_print_gcode = +deretract_speed = 40 +extruder_offset = 0x0 +gcode_flavor = marlin +silent_mode = 0 +remaining_times = 0 +machine_max_feedrate_x = 500 +machine_max_feedrate_y = 500 +machine_max_feedrate_z = 5 +machine_max_feedrate_e = 25 +machine_max_acceleration_x = 500 +machine_max_acceleration_y = 500 +machine_max_acceleration_z = 100 +machine_max_acceleration_e = 1000 +machine_max_acceleration_extruding = 500 +machine_max_acceleration_retracting = 1000 +machine_max_jerk_x = 10 +machine_max_jerk_y = 10 +machine_max_jerk_z = 0.3 +machine_max_jerk_e = 5 +machine_min_extruding_rate = 0 +machine_min_travel_rate = 0 +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩AFTER_LAYER_CHANGE# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +max_print_height = 260 +printer_notes = +printer_settings_id = +retract_before_travel = 2 +retract_before_wipe = 70% +retract_layer_change = 1 +retract_length_toolchange = 1 +retract_lift = 0 +retract_lift_above = 0 +retract_lift_below = 0 +retract_restart_extra = 0 +retract_restart_extra_toolchange = 0 +retract_speed = 45 +single_extruder_multi_material = 0 +toolchange_gcode = +use_firmware_retraction = 0 +use_relative_e_distances = 1 +use_volumetric_e = 0 +variable_layer_height = 1 +z_offset = 0 +printer_model = +default_filament_profile = Generic PLA @Geeetech +start_gcode = ;Custom Start G-code\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG92 E0 ; Reset Extruder\nG28 ; Home all axes\nM107 ;Off Fan\nG1 Z5.0 F3000 ;Move Z Axis up little to prevent scratching of Heat Bed\nG1 X0.1 Y20 Z0.8 F5000 ; Move to start position\nG1 X0.1 Y200.0 Z1.2 F1500 E30 ; Draw the first line\nG92 E0 ; Reset Extruder\nG1 X0.4 Y200.0 Z1.2 F3000 ; Move to side a little\nG1 X0.4 Y20 Z1.2 F1500 E25 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X5 Y20 Z0.4 F3000.0 ; Move over to prevent blob squish\n\nM221 S{if layer_height<0.2}110{else}100{endif}\nG92 E0 +end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+70, max_print_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < max_print_height*0.6}G1 Z{max_print_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors + +[printer:*HighSpeedPrinter*] +# Presets for high-speed printers +inherits = *common* +machine_max_feedrate_x = 300 +machine_max_feedrate_y = 500 +machine_max_feedrate_z = 10 +machine_max_feedrate_e = 60 +machine_max_acceleration_x = 5000 +machine_max_acceleration_y = 4000 +machine_max_acceleration_z = 50 +machine_max_acceleration_e = 3500 +machine_max_acceleration_extruding = 3500 +machine_max_acceleration_retracting = 3500 +machine_max_jerk_x = 45 +machine_max_jerk_y = 45 +machine_max_jerk_z = 0.8 +machine_max_jerk_e = 8 +machine_min_extruding_rate = 0 +machine_min_travel_rate = 5 +extruder_colour = #F5DC1E +default_filament_profile = Thunder HS-PLA @Geeetech; Thunder PLA @Geeetech +start_gcode = ;Custom Start G-code for High-speed Printer\n\nM104 S[first_layer_temperature] ; Set Hotend Temp.\nM140 S[first_layer_bed_temperature] ; Set bed Temp.\nM190 S[first_layer_bed_temperature] ; Wait for Bed Temp.\nM109 S[first_layer_temperature] ; Wait for Hotend Temp.\nG92 E0 ; Reset Extruder\nG28 ; Home all axes\nM107 P0 ;Off Main Fan\nM107 P1 ;Off Aux Fan\nM2012 P8 S1 F100 ; ON Light\n;M106 P0 S383 ; ON MainFan 150% if need\n;M106 P1 S255 ; ON Aux Fan 100% if need\nG1 Z5.0 F3000 ;Move the Z-axis slightly up to prevent scratching the heatbed\nG1 X0.1 Y20 Z0.8 F5000 ; Move to start position\nG1 X0.1 Y200.0 Z1.2 F1500 E30 ; Draw the first line\nG92 E0 ; Reset Extruder\nG1 X0.4 Y200.0 Z1.2 F3000 ; Move to side a little\nG1 X0.4 Y20 Z1.2 F1500 E25 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 Z2.0 F3000 ; Move the Z-axis slightly up to prevent scratching the heatbed\nG1 X5 Y20 Z0.4 F3000.0 ; Scrape off nozzle residue\n\nM221 S{if layer_height<0.2}110{else}100{endif}\nG92 E0 +printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_Thunder series + +[printer:*DualExtruderPrinter*] +# Presets for Dual-Extruder printers +inherits = *common* +deretract_speed = 30,30 +extruder_offset = 0x0,0x0 +max_layer_height = 0.3,0.3 +min_layer_height = 0.05,0.05 +printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_MizarM&A10M&A20M&A30M +retract_before_travel = 3,3 +retract_before_wipe = 15%,15% +retract_layer_change = 0,0 +retract_length = 6,6 +retract_length_toolchange = 0,0 +retract_lift = 0,0 +retract_restart_extra = 0,0 +retract_restart_extra_toolchange = 0,0 +retract_speed = 35,35 +use_relative_e_distances = 1 +wipe = 0,0 +z_offset = 0 +default_print_profile = 0.20 mm NORMAL @Multi-extruder +default_filament_profile = Generic PLA @Geeetech + +[printer:*MultiExtruderPrinter*] +# Presets for Multi-Extruder printers +inherits = *common* +deretract_speed = 30,30,30 +extruder_offset = 0x0,0x0,0x0 +max_layer_height = 0.3,0.3 +min_layer_height = 0.05,0.05 +printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_MizarT&A10T&A20T&A30T +retract_before_travel = 3,3,3 +retract_before_wipe = 15%,15%,15% +retract_layer_change = 0,0,0 +retract_length = 6,6,6 +retract_length_toolchange = 0,0,0 +retract_lift = 0,0,0 +retract_restart_extra = 0,0,0 +retract_restart_extra_toolchange = 0,0,0 +retract_speed = 35,35,35 +use_relative_e_distances = 1 +wipe = 0,0,0 +z_offset = 0 +default_print_profile = 0.20 mm NORMAL @Multi-extruder +default_filament_profile = Generic PLA @Geeetech + +# Intended for printers where the Z-axis lowers the print bed during printing, like the GTC10 series +#[printer:*descendingz*] +#end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print bed down\nG1 X50 Y50 F{travel_speed*60} ; move print head out of the way\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+max_print_height-10} F600{endif} ; Move print bed close to the bottom\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors + +[printer:*PausePrint*] +# Intended for printers with vendor official firmware verified to support M25 +pause_print_gcode = M25 ; pause print + +# Presets retract length +[printer:*Retract_1mm*] +retract_length = 1 +[printer:*Retract_2mm*] +retract_length = 2 +[printer:*Retract_3mm*] +retract_length = 3 +[printer:*Retract_4mm*] +retract_length = 4 +[printer:*Retract_5mm*] +retract_length = 5 +[printer:*Retract_6mm*] +retract_length = 6 + +[printer:*Retract_6.5mm*] +retract_length = 6.5 + +[printer:*Retract_7mm*] +retract_length = 7 + +[printer:*Retract_8mm*] +retract_length = 8 + +[printer:*0.2nozzle*] +nozzle_diameter = 0.2 +printer_variant = 0.2 +min_layer_height = 0.08 +max_layer_height = 0.16 +retract_lift_above = 0.2 + +[printer:*0.3nozzle*] +nozzle_diameter = 0.3 +printer_variant = 0.3 +min_layer_height = 0.08 +max_layer_height = 0.24 +retract_lift_above = 0.2 + +[printer:*0.4nozzle*] +nozzle_diameter = 0.4 +printer_variant = 0.4 +min_layer_height = 0.08 +max_layer_height = 0.32 +retract_lift_above = 0.2 + +[printer:*0.5nozzle*] +nozzle_diameter = 0.5 +printer_variant = 0.5 +min_layer_height = 0.08 +max_layer_height = 0.40 +retract_lift_above = 0.2 + +[printer:*0.6nozzle*] +nozzle_diameter = 0.6 +printer_variant = 0.6 +min_layer_height = 0.08 +max_layer_height = 0.48 +retract_lift_above = 0.3 + +[printer:*0.8nozzle*] +nozzle_diameter = 0.8 +printer_variant = 0.8 +min_layer_height = 0.08 +max_layer_height = 0.48 +retract_lift_above = 0.3 + +######################################### +###############Printer inherits########## +######################################### + +[printer:*Thunder*] +inherits = *common*; *HighSpeedPrinter*; *Retract_6.5mm*; *PausePrint* +printer_model = Thunder +bed_shape = 0x0,250x0,250x250,0x250 +max_print_height = 260 +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【Thunder】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_Thunder\nPRINTER_HAS_BOWDEN + +[printer:*ThunderPro*] +inherits = *common*; *HighSpeedPrinter*; *Retract_6.5mm*; *PausePrint* +printer_model = ThunderPro +bed_shape = 0x0,250x0,250x250,0x250 +max_print_height = 260 +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【ThunderPro】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_ThunderPro\nPRINTER_HAS_DirectDriveExtruder + +[printer:*MizarS*] +inherits = *common*; *Retract_6.5mm*; *PausePrint* +printer_model = MizarS +bed_shape = 0x0,255x0,255x255,0x255 +max_print_height = 260 +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【MizarS】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_MizarS\nPRINTER_HAS_BOWDEN + +[printer:*MizarPro*] +inherits = *common*; *Retract_6.5mm*; *PausePrint* +printer_model = MizarPro +bed_shape = 0x0,220x0,220x220,0x220 +max_print_height = 260 +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【Mizar Pro】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_MizarPro\nPRINTER_HAS_BOWDEN + +[printer:*Mizar*] +inherits = *common*; *Retract_6.5mm*; *PausePrint* +printer_model = Mizar +bed_shape = 0x0,220x0,220x220,0x220 +max_print_height = 260 +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【Mizar】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_Mizar\nPRINTER_HAS_BOWDEN + +[printer:*MizarMax*] +inherits = *common*; *Retract_6.5mm*; *PausePrint* +printer_model = MizarMax +bed_shape = 0x0,320x0,320x320,0x320 +max_print_height = 400 +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【MizarMax】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_MizarMax\nPRINTER_HAS_BOWDEN + +[printer:*A10Pro*] +inherits = *common*; *Retract_6.5mm*; *PausePrint* +printer_model = A10Pro +bed_shape = 0x0,220x0,220x220,0x220 +max_print_height = 260 +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【A10 Pro】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_A10Pro\nPRINTER_HAS_BOWDEN + +[printer:*A20*] +inherits = *common*; *Retract_6.5mm*; *PausePrint* +printer_model = A20 +bed_shape = 0x0,250x0,250x250,0x250 +max_print_height = 250 +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【A20】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_A20\nPRINTER_HAS_BOWDEN + +[printer:*A30Pro*] +inherits = *common*; *Retract_6.5mm*; *PausePrint* +printer_model = A30Pro +bed_shape = 0x0,320x0,320x320,0x320 +max_print_height = 420 +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【A30Pro】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_A30Pro\nPRINTER_HAS_BOWDEN + +[printer:*E180*] +inherits = *common*; *Retract_6mm*; *PausePrint* +printer_model = E180 +bed_shape = 0x0,125x0,125x130,0x130 +max_print_height = 126 +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【E180】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_E180\nPRINTER_HAS_BOWDEN + +[printer:*MeDucer*] +inherits = *common*; *Retract_2mm*; *PausePrint* +printer_model = MeDucer +bed_shape = 0x0,180x0,180x150,0x150 +max_print_height = 150 +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【MeDucer】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_MeDucer\nPRINTER_HAS_DirectDriveExtruder + +[printer:*MeCreator*] +inherits = *common*; *Retract_2mm*; *PausePrint* +printer_model = MeCreator +bed_shape = 0x0,150x0,150x150,0x150 +max_print_height = 125 +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【MeCreator】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_MeCreator\nPRINTER_HAS_DirectDriveExtruder + +[printer:*MeCreator2*] +inherits = *common*; *Retract_2mm*; *PausePrint* +printer_model = MeCreator2 +bed_shape = 0x0,160x0,160x160,0x160 +max_print_height = 160 +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【MeCreator2】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_MeCreator2\nPRINTER_HAS_DirectDriveExtruder + +[printer:*GiantArmD200*] +inherits = *common*; *Retract_2mm*; *PausePrint* +printer_model = GiantArmD200 +bed_shape = 0x0,300x0,300x180,0x180 +max_print_height = 180 +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【GiantArmD200】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_GiantArmD200\nPRINTER_HAS_DirectDriveExtruder + +[printer:*I3ProB*] +inherits = *common*; *Retract_2mm*; *PausePrint* +printer_model = I3ProB +bed_shape = 0x0,200x0,200x200,0x200 +max_print_height = 180 +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【I3ProB】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_I3ProB\nPRINTER_HAS_DirectDriveExtruder + +[printer:*I3ProW*] +inherits = *common*; *Retract_2mm*; *PausePrint* +printer_model = I3ProW +bed_shape = 0x0,200x0,200x200,0x200 +max_print_height = 180 +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【I3ProW】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_I3ProW\nPRINTER_HAS_DirectDriveExtruder + + + +[printer:Geeetech Thunder (0.2 mm nozzle)] +inherits = *Thunder*; *0.2nozzle* +default_print_profile = 0.10 mm HIGHDETAIL (0.2mm nozzle) @High-speed +default_filament_profile =Thunder HS-PLA @Geeetech +[printer:Geeetech Thunder] +inherits = *Thunder*; *0.4nozzle* +default_print_profile = 0.20 mm NORMAL @High-speed +default_filament_profile =Thunder HS-PLA @Geeetech +[printer:Geeetech Thunder (0.6 mm nozzle)] +inherits = *Thunder*; *0.6nozzle* +default_print_profile = 0.28 mm SUPERDRAFT (0.6mm nozzle) @High-speed +default_filament_profile =Thunder HS-PLA @Geeetech +[printer:Geeetech Thunder (0.8 mm nozzle)] +inherits = *Thunder*; *0.8nozzle* +default_print_profile = 0.36 mm CHUNKY (0.8mm nozzle) @High-speed +default_filament_profile =Thunder HS-PLA @Geeetech + +[printer:Geeetech ThunderPro (0.2 mm nozzle)] +inherits = *ThunderPro*; *0.2nozzle* +default_print_profile = 0.10 mm HIGHDETAIL (0.2mm nozzle) @High-speed +default_filament_profile =Thunder HS-PLA @Geeetech +[printer:Geeetech ThunderPro] +inherits = *ThunderPro*; *0.4nozzle* +default_print_profile = 0.20 mm NORMAL @High-speed +default_filament_profile =Thunder HS-PLA @Geeetech +[printer:Geeetech ThunderPro (0.6 mm nozzle)] +inherits = *ThunderPro*; *0.6nozzle* +default_print_profile = 0.28 mm SUPERDRAFT (0.6mm nozzle) @High-speed +default_filament_profile =Thunder HS-PLA @Geeetech +[printer:Geeetech ThunderPro (0.8 mm nozzle)] +inherits = *ThunderPro*; *0.8nozzle* +default_print_profile = 0.36 mm CHUNKY (0.8mm nozzle) @High-speed +default_filament_profile =Thunder HS-PLA @Geeetech + +[printer:Geeetech MizarS (0.2 mm nozzle)] +inherits = *MizarS*; *0.2nozzle* +default_print_profile = 0.08 mm SUPERDETAIL (0.2mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MizarS (0.3 mm nozzle)] +inherits = *MizarS*; *0.3nozzle* +default_print_profile = 0.12 mm DETAIL (0.3mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MizarS] +inherits = *MizarS*; *0.4nozzle* +default_print_profile = 0.20 mm NORMAL @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MizarS (0.5 mm nozzle)] +inherits = *MizarS*; *0.5nozzle* +default_print_profile = 0.28 mm SUPERDRAFT (0.5mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MizarS (0.6 mm nozzle)] +inherits = *MizarS*; *0.6nozzle* +default_print_profile = 0.36 mm CHUNKY (0.6mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MizarS (0.8 mm nozzle)] +inherits = *MizarS*; *0.8nozzle* +default_print_profile = 0.44 mm SUPERCHUNKY (0.8mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech + +[printer:Geeetech MizarPro (0.2 mm nozzle)] +inherits = *MizarPro*; *0.2nozzle* +default_print_profile = 0.08 mm SUPERDETAIL (0.2mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MizarPro (0.3 mm nozzle)] +inherits = *MizarPro*; *0.3nozzle* +default_print_profile = 0.12 mm DETAIL (0.3mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MizarPro] +inherits = *MizarPro*; *0.4nozzle* +default_print_profile = 0.20 mm NORMAL @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MizarPro (0.5 mm nozzle)] +inherits = *MizarPro*; *0.5nozzle* +default_print_profile = 0.28 mm SUPERDRAFT (0.5mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MizarPro (0.6 mm nozzle)] +inherits = *MizarPro*; *0.6nozzle* +default_print_profile = 0.36 mm CHUNKY (0.6mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MizarPro (0.8 mm nozzle)] +inherits = *MizarPro*; *0.8nozzle* +default_print_profile = 0.44 mm SUPERCHUNKY (0.8mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech + +[printer:Geeetech Mizar (0.2 mm nozzle)] +inherits = *Mizar*; *0.2nozzle* +default_print_profile = 0.08 mm SUPERDETAIL (0.2mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech Mizar (0.3 mm nozzle)] +inherits = *Mizar*; *0.3nozzle* +default_print_profile = 0.12 mm DETAIL (0.3mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech Mizar] +inherits = *Mizar*; *0.4nozzle* +default_print_profile = 0.20 mm NORMAL @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech Mizar (0.5 mm nozzle)] +inherits = *Mizar*; *0.5nozzle* +default_print_profile = 0.28 mm SUPERDRAFT (0.5mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech Mizar (0.6 mm nozzle)] +inherits = *Mizar*; *0.6nozzle* +default_print_profile = 0.36 mm CHUNKY (0.6mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech Mizar (0.8 mm nozzle)] +inherits = *Mizar*; *0.8nozzle* +default_print_profile = 0.44 mm SUPERCHUNKY (0.8mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech + +[printer:Geeetech MizarMax (0.2 mm nozzle)] +inherits = *MizarMax*; *0.2nozzle* +default_print_profile = 0.08 mm SUPERDETAIL (0.2mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MizarMax (0.3 mm nozzle)] +inherits = *MizarMax*; *0.3nozzle* +default_print_profile = 0.12 mm DETAIL (0.3mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MizarMax] +inherits = *MizarMax*; *0.4nozzle* +default_print_profile = 0.20 mm NORMAL @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MizarMax (0.5 mm nozzle)] +inherits = *MizarMax*; *0.5nozzle* +default_print_profile = 0.28 mm SUPERDRAFT (0.5mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MizarMax (0.6 mm nozzle)] +inherits = *MizarMax*; *0.6nozzle* +default_print_profile = 0.36 mm CHUNKY (0.6mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MizarMax (0.8 mm nozzle)] +inherits = *MizarMax*; *0.8nozzle* +default_print_profile = 0.44 mm SUPERCHUNKY (0.8mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech + +[printer:Geeetech MizarM] +inherits = *common*; *DualExtruderPrinter*; *0.4nozzle*; *Retract_6mm*; *PausePrint* +printer_model = MizarM +bed_shape = 0x0,255x0,255x255,0x255 +max_print_height = 260 +nozzle_diameter = 0.4,0.4 +extruder_colour = #FF8000;#DB5182 +default_print_profile = 0.20 mm NORMAL @Multi-extruder +default_filament_profile = Generic PLA @Geeetech +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【MizarM】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_MizarM\nPRINTER_HAS_BOWDEN + +## [printer:Geeetech MizarT] +## inherits = *common*; *MultiExtruderPrinter*; *0.4nozzle*; *Retract_6mm*; *PausePrint* +## printer_model = MizarT +## bed_shape = 0x0,255x0,255x255,0x255 +## max_print_height = 260 +## nozzle_diameter = 0.4,0.4,0.4 +## extruder_colour = #FF0000;#00FF00;#0000FF +## default_print_profile = 0.20 mm NORMAL @Multi-extruder +## default_filament_profile = Generic PLA @Geeetech +## layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【MizarT】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +## printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_MizarT\nPRINTER_HAS_BOWDEN + +[printer:Geeetech A10Pro (0.2 mm nozzle)] +inherits = *A10Pro*; *0.2nozzle* +default_print_profile = 0.08 mm SUPERDETAIL (0.2mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech A10Pro (0.3 mm nozzle)] +inherits = *A10Pro*; *0.3nozzle* +default_print_profile = 0.12 mm DETAIL (0.3mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech A10Pro] +inherits = *A10Pro*; *0.4nozzle* +default_print_profile = 0.20 mm NORMAL @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech A10Pro (0.5 mm nozzle)] +inherits = *A10Pro*; *0.5nozzle* +default_print_profile = 0.28 mm SUPERDRAFT (0.5mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech A10Pro (0.6 mm nozzle)] +inherits = *A10Pro*; *0.6nozzle* +default_print_profile = 0.36 mm CHUNKY (0.6mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech A10Pro (0.8 mm nozzle)] +inherits = *A10Pro*; *0.8nozzle* +default_print_profile = 0.44 mm SUPERCHUNKY (0.8mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech + +[printer:Geeetech A10M] +inherits = *common*; *DualExtruderPrinter*; *0.4nozzle*; *Retract_6mm*; *PausePrint* +printer_model = A10M +bed_shape = 0x0,220x0,220x220,0x220 +max_print_height = 260 +nozzle_diameter = 0.4,0.4 +extruder_colour = #FF8000;#DB5182 +default_print_profile = 0.20 mm NORMAL @Multi-extruder +default_filament_profile = Generic PLA @Geeetech +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【A10M】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_A10M\nPRINTER_HAS_BOWDEN + +[printer:Geeetech A10T] +inherits = *common*; *MultiExtruderPrinter*; *0.4nozzle*; *Retract_6mm*; *PausePrint* +printer_model = A10T +bed_shape = 0x0,220x0,220x220,0x220 +max_print_height = 260 +nozzle_diameter = 0.4,0.4,0.4 +extruder_colour = #FF0000;#00FF00;#0000FF +default_print_profile = 0.20 mm NORMAL @Multi-extruder +default_filament_profile = Generic PLA @Geeetech +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【A10T】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_A10T\nPRINTER_HAS_BOWDEN + +[printer:Geeetech A20 (0.2 mm nozzle)] +inherits = *A20*; *0.2nozzle* +default_print_profile = 0.08 mm SUPERDETAIL (0.2mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech A20 (0.3 mm nozzle)] +inherits = *A20*; *0.3nozzle* +default_print_profile = 0.12 mm DETAIL (0.3mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech A20] +inherits = *A20*; *0.4nozzle* +default_print_profile = 0.20 mm NORMAL @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech A20 (0.5 mm nozzle)] +inherits = *A20*; *0.5nozzle* +default_print_profile = 0.28 mm SUPERDRAFT (0.5mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech A20 (0.6 mm nozzle)] +inherits = *A20*; *0.6nozzle* +default_print_profile = 0.36 mm CHUNKY (0.6mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech A20 (0.8 mm nozzle)] +inherits = *A20*; *0.8nozzle* +default_print_profile = 0.44 mm SUPERCHUNKY (0.8mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech + +[printer:Geeetech A20M] +inherits = *common*; *DualExtruderPrinter*; *0.4nozzle*; *Retract_6mm*; *PausePrint* +printer_model = A20M +bed_shape = 0x0,250x0,250x250,0x250 +max_print_height = 250 +nozzle_diameter = 0.4,0.4 +extruder_colour = #FF8000;#DB5182 +default_print_profile = 0.20 mm NORMAL @Multi-extruder +default_filament_profile = Generic PLA @Geeetech +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【A20M】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_A20M\nPRINTER_HAS_BOWDEN + +[printer:Geeetech A20T] +inherits = *common*; *MultiExtruderPrinter*; *0.4nozzle*; *Retract_6mm*; *PausePrint* +printer_model = A20T +bed_shape = 0x0,250x0,250x250,0x250 +max_print_height = 250 +nozzle_diameter = 0.4,0.4,0.4 +extruder_colour = #FF0000;#00FF00;#0000FF +default_print_profile = 0.20 mm NORMAL @Multi-extruder +default_filament_profile = Generic PLA @Geeetech +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【A20T】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_A20T\nPRINTER_HAS_BOWDEN + +[printer:Geeetech A30Pro (0.2 mm nozzle)] +inherits = *A30Pro*; *0.2nozzle* +default_print_profile = 0.08 mm SUPERDETAIL (0.2mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech A30Pro (0.3 mm nozzle)] +inherits = *A30Pro*; *0.3nozzle* +default_print_profile = 0.12 mm DETAIL (0.3mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech A30Pro] +inherits = *A30Pro*; *0.4nozzle* +default_print_profile = 0.20 mm NORMAL @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech A30Pro (0.5 mm nozzle)] +inherits = *A30Pro*; *0.5nozzle* +default_print_profile = 0.28 mm SUPERDRAFT (0.5mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech A30Pro (0.6 mm nozzle)] +inherits = *A30Pro*; *0.6nozzle* +default_print_profile = 0.36 mm CHUNKY (0.6mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech A30Pro (0.8 mm nozzle)] +inherits = *A30Pro*; *0.8nozzle* +default_print_profile = 0.44 mm SUPERCHUNKY (0.8mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech + +[printer:Geeetech A30M] +inherits = *common*; *DualExtruderPrinter*; *0.4nozzle*; *Retract_6mm*; *PausePrint* +printer_model = A30M +bed_shape = 0x0,320x0,320x320,0x320 +max_print_height = 420 +nozzle_diameter = 0.4,0.4 +extruder_colour = #FF8000;#DB5182 +default_print_profile = 0.20 mm NORMAL @Multi-extruder +default_filament_profile = Generic PLA @Geeetech +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【A30M】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_A30M\nPRINTER_HAS_BOWDEN + +[printer:Geeetech A30T] +inherits = *common*; *MultiExtruderPrinter*; *0.4nozzle*; *Retract_6mm*; *PausePrint* +printer_model = A30T +bed_shape = 0x0,320x0,320x320,0x320 +max_print_height = 420 +nozzle_diameter = 0.4,0.4,0.4 +extruder_colour = #FF0000;#00FF00;#0000FF +default_print_profile = 0.20 mm NORMAL @Multi-extruder +default_filament_profile = Generic PLA @Geeetech +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【A30T】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_A30T\nPRINTER_HAS_BOWDEN + +[printer:Geeetech E180 (0.2 mm nozzle)] +inherits = *E180*; *0.2nozzle* +default_print_profile = 0.08 mm SUPERDETAIL (0.2mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech E180 (0.3 mm nozzle)] +inherits = *E180*; *0.3nozzle* +default_print_profile = 0.12 mm DETAIL (0.3mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech E180] +inherits = *E180*; *0.4nozzle* +default_print_profile = 0.20 mm NORMAL @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech E180 (0.5 mm nozzle)] +inherits = *E180*; *0.5nozzle* +default_print_profile = 0.28 mm SUPERDRAFT (0.5mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech E180 (0.6 mm nozzle)] +inherits = *E180*; *0.6nozzle* +default_print_profile = 0.36 mm CHUNKY (0.6mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech E180 (0.8 mm nozzle)] +inherits = *E180*; *0.8nozzle* +default_print_profile = 0.44 mm SUPERCHUNKY (0.8mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech + +[printer:Geeetech MeDucer (0.2 mm nozzle)] +inherits = *MeDucer*; *0.2nozzle* +default_print_profile = 0.08 mm SUPERDETAIL (0.2mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MeDucer (0.3 mm nozzle)] +inherits = *MeDucer*; *0.3nozzle* +default_print_profile = 0.12 mm DETAIL (0.3mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MeDucer] +inherits = *MeDucer*; *0.4nozzle* +default_print_profile = 0.20 mm NORMAL @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MeDucer (0.5 mm nozzle)] +inherits = *MeDucer*; *0.5nozzle* +default_print_profile = 0.28 mm SUPERDRAFT (0.5mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MeDucer (0.6 mm nozzle)] +inherits = *MeDucer*; *0.6nozzle* +default_print_profile = 0.36 mm CHUNKY (0.6mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MeDucer (0.8 mm nozzle)] +inherits = *MeDucer*; *0.8nozzle* +default_print_profile = 0.44 mm SUPERCHUNKY (0.8mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech + +[printer:Geeetech MeCreator (0.2 mm nozzle)] +inherits = *MeCreator*; *0.2nozzle* +default_print_profile = 0.08 mm SUPERDETAIL (0.2mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MeCreator (0.3 mm nozzle)] +inherits = *MeCreator*; *0.3nozzle* +default_print_profile = 0.12 mm DETAIL (0.3mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MeCreator] +inherits = *MeCreator*; *0.4nozzle* +default_print_profile = 0.20 mm NORMAL @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MeCreator (0.5 mm nozzle)] +inherits = *MeCreator*; *0.5nozzle* +default_print_profile = 0.28 mm SUPERDRAFT (0.5mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MeCreator (0.6 mm nozzle)] +inherits = *MeCreator*; *0.6nozzle* +default_print_profile = 0.36 mm CHUNKY (0.6mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MeCreator (0.8 mm nozzle)] +inherits = *MeCreator*; *0.8nozzle* +default_print_profile = 0.44 mm SUPERCHUNKY (0.8mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech + +[printer:Geeetech MeCreator2 (0.2 mm nozzle)] +inherits = *MeCreator2*; *0.2nozzle* +default_print_profile = 0.08 mm SUPERDETAIL (0.2mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MeCreator2 (0.3 mm nozzle)] +inherits = *MeCreator2*; *0.3nozzle* +default_print_profile = 0.12 mm DETAIL (0.3mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MeCreator2] +inherits = *MeCreator2*; *0.4nozzle* +default_print_profile = 0.20 mm NORMAL @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MeCreator2 (0.5 mm nozzle)] +inherits = *MeCreator2*; *0.5nozzle* +default_print_profile = 0.28 mm SUPERDRAFT (0.5mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MeCreator2 (0.6 mm nozzle)] +inherits = *MeCreator2*; *0.6nozzle* +default_print_profile = 0.36 mm CHUNKY (0.6mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech MeCreator2 (0.8 mm nozzle)] +inherits = *MeCreator2*; *0.8nozzle* +default_print_profile = 0.44 mm SUPERCHUNKY (0.8mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech + +[printer:Geeetech GiantArmD200 (0.2 mm nozzle)] +inherits = *GiantArmD200*; *0.2nozzle* +default_print_profile = 0.08 mm SUPERDETAIL (0.2mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech GiantArmD200 (0.3 mm nozzle)] +inherits = *GiantArmD200*; *0.3nozzle* +default_print_profile = 0.12 mm DETAIL (0.3mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech GiantArmD200] +inherits = *GiantArmD200*; *0.4nozzle* +default_print_profile = 0.20 mm NORMAL @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech GiantArmD200 (0.5 mm nozzle)] +inherits = *GiantArmD200*; *0.5nozzle* +default_print_profile = 0.28 mm SUPERDRAFT (0.5mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech GiantArmD200 (0.6 mm nozzle)] +inherits = *GiantArmD200*; *0.6nozzle* +default_print_profile = 0.36 mm CHUNKY (0.6mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech GiantArmD200 (0.8 mm nozzle)] +inherits = *GiantArmD200*; *0.8nozzle* +default_print_profile = 0.44 mm SUPERCHUNKY (0.8mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech + +[printer:Geeetech I3ProB (0.2 mm nozzle)] +inherits = *I3ProB*; *0.2nozzle* +default_print_profile = 0.08 mm SUPERDETAIL (0.2mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech I3ProB (0.3 mm nozzle)] +inherits = *I3ProB*; *0.3nozzle* +default_print_profile = 0.12 mm DETAIL (0.3mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech I3ProB] +inherits = *I3ProB*; *0.4nozzle* +default_print_profile = 0.20 mm NORMAL @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech I3ProB (0.5 mm nozzle)] +inherits = *I3ProB*; *0.5nozzle* +default_print_profile = 0.28 mm SUPERDRAFT (0.5mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech I3ProB (0.6 mm nozzle)] +inherits = *I3ProB*; *0.6nozzle* +default_print_profile = 0.36 mm CHUNKY (0.6mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech I3ProB (0.8 mm nozzle)] +inherits = *I3ProB*; *0.8nozzle* +default_print_profile = 0.44 mm SUPERCHUNKY (0.8mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech + +[printer:Geeetech I3ProW (0.2 mm nozzle)] +inherits = *I3ProW*; *0.2nozzle* +default_print_profile = 0.08 mm SUPERDETAIL (0.2mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech I3ProW (0.3 mm nozzle)] +inherits = *I3ProW*; *0.3nozzle* +default_print_profile = 0.12 mm DETAIL (0.3mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech I3ProW] +inherits = *I3ProW*; *0.4nozzle* +default_print_profile = 0.20 mm NORMAL @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech I3ProW (0.5 mm nozzle)] +inherits = *I3ProW*; *0.5nozzle* +default_print_profile = 0.28 mm SUPERDRAFT (0.5mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech I3ProW (0.6 mm nozzle)] +inherits = *I3ProW*; *0.6nozzle* +default_print_profile = 0.36 mm CHUNKY (0.6mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech +[printer:Geeetech I3ProW (0.8 mm nozzle)] +inherits = *I3ProW*; *0.8nozzle* +default_print_profile = 0.44 mm SUPERCHUNKY (0.8mm nozzle) @Geeetech +default_filament_profile = Generic PLA @Geeetech + +[printer:Geeetech I3ProC] +inherits = *common*; *DualExtruderPrinter*; *0.4nozzle*; *Retract_1mm*; *PausePrint* +printer_model = I3ProC +bed_shape = 0x0,200x0,200x200,0x200 +max_print_height = 180 +nozzle_diameter = 0.4,0.4 +extruder_colour = #FF8000;#DB5182 +default_print_profile = 0.20 mm NORMAL @Multi-extruder +default_filament_profile = Generic PLA @Geeetech +layer_gcode = ;▩▩▩▩▩▩▩▩▩▩【I3ProC】# layer No:[layer_num] ———>Print Height:[layer_z] mm ▩▩▩▩▩▩▩▩▩▩ +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Geeetech\nPRINTER_MODEL_I3ProC\nPRINTER_HAS_DirectDriveExtruder +######################################### +########## End ###printer presets ##### +######################################### \ No newline at end of file diff --git a/resources/profiles/Geeetech/125X130.stl b/resources/profiles/Geeetech/125X130.stl new file mode 100644 index 0000000000000000000000000000000000000000..968daa2ef76df5fae40c36dfea595cc7de21f810 GIT binary patch literal 684 zcmbV|O$x#=5QXOe9-YI(2?!pc2XG?@F5I~aUQF?1zBkF_N8`o^ZQe}#5tT@S|I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/profiles/Geeetech/150x150.stl b/resources/profiles/Geeetech/150x150.stl new file mode 100644 index 0000000000000000000000000000000000000000..41f7363250e691a1a37322f1f15402cb93aabb18 GIT binary patch literal 684 zcmbtQF%H5o4D-%81ssL2h^8wXU9%MyK$16i|zBdc|PvL zt-GH0{U!Cg!}f*f{=i0v{MJK1<0LXBk<$k!IU+dn232I^uHbEiu#rXxQnA*AFfxN*t;>{Jo;Ta0>3V*NWZ_&YfYz1ENt6;_b!lNoO v$_T2o3$y24;ZgGFE>H#LP_?Q+jd^c}2j0v#Vb=YWa}uJ3DrS|1B3b_zKM{P! literal 0 HcmV?d00001 diff --git a/resources/profiles/Geeetech/150x150.svg b/resources/profiles/Geeetech/150x150.svg new file mode 100644 index 00000000000..ca381100405 --- /dev/null +++ b/resources/profiles/Geeetech/150x150.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/profiles/Geeetech/160x160.stl b/resources/profiles/Geeetech/160x160.stl new file mode 100644 index 0000000000000000000000000000000000000000..615b54f4a7ca633788692dd713eacc20381586e0 GIT binary patch literal 684 zcmbVIF%H5o49o*~L_bgo7+8zK!onkv=zxS&sW33+Dg6nkFXPUMou=)?Np3E-&*$dZ zJ?^*a(w_SE`s(_9efIV4uze${f3R^x_{brjVRUZr&K + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/profiles/Geeetech/180X150.stl b/resources/profiles/Geeetech/180X150.stl new file mode 100644 index 0000000000000000000000000000000000000000..740e7a5db70a5a326cf34079956525304cc8b95d GIT binary patch literal 684 zcmbV|I}XAy5JdL?93mHploUvGAd7;Ao<5{NLP7%3`xKmn9>mF*S$q9~&@fWs*-f5j z?aS$S*f-m8eI3SgyK!y5=yv_QYyQ+sDF4t!U-y^D&55j@BI;2mkA9F6K6oQoeG#Cu z{1V>dFYHrgpw^7o{~%Br!7r9KF%|cZQUdAazR9B>WD~J6BKhA_#rvvG%h@dtD}9#T zun{T42v-pv-|>*Llb5rXC#TO+g6Y_Al8AYc@W{ZOO`V*7l+#86ixSMhL)nDt*>~EO EH-o!^L;wH) literal 0 HcmV?d00001 diff --git a/resources/profiles/Geeetech/180x150.svg b/resources/profiles/Geeetech/180x150.svg new file mode 100644 index 00000000000..d21c6138915 --- /dev/null +++ b/resources/profiles/Geeetech/180x150.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/profiles/Geeetech/200x200.stl b/resources/profiles/Geeetech/200x200.stl new file mode 100644 index 0000000000000000000000000000000000000000..c5dcfe68fb21c1e8d9860d7d334b200dce2b41d8 GIT binary patch literal 684 zcmbu5F%H5o3`KJQ4$%u#s^9>iOmGhtBqRnF#@r0lsmJ1dr%oE$jW4EYa>WXxPr#!#$V6J&^ zDqmp=uF87F{WiAJ{28Vg+quPqe1>nNn=1;(vnb#d{$9=B(xH3V3SRN6P{sX}6N+nDcbcFa>j@+Eh?e-rMou&3qGO-Osot5iLxysH_w*_kRHxV~VH% literal 0 HcmV?d00001 diff --git a/resources/profiles/Geeetech/200x200.svg b/resources/profiles/Geeetech/200x200.svg new file mode 100644 index 00000000000..44c5a5415f6 --- /dev/null +++ b/resources/profiles/Geeetech/200x200.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/profiles/Geeetech/220x220.stl b/resources/profiles/Geeetech/220x220.stl new file mode 100644 index 0000000000000000000000000000000000000000..6519746e8a829a5a39a27a8a07fc77a94639d4ae GIT binary patch literal 684 zcmbtQ!41MN4Dc??-A-X?s5JKN}*k_qVmLzii;3P)`M?S+8nz<`@+bE!}&=a`k`HctWng>qi zD@=havtDt(ovk>(z!Y;kH$0Hf@QrwLMR0hA0=&ZCtNB}W@E%)%SNtkiali1W3Pl+~ tm33kEx+^?N9^D0|z#OV}6{s=q?eM^x`6kS|pK(q?v@pf0vQebm{{^^nkWv5u literal 0 HcmV?d00001 diff --git a/resources/profiles/Geeetech/220x220.svg b/resources/profiles/Geeetech/220x220.svg new file mode 100644 index 00000000000..20b4b8a0ca7 --- /dev/null +++ b/resources/profiles/Geeetech/220x220.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/profiles/Geeetech/250x250.stl b/resources/profiles/Geeetech/250x250.stl new file mode 100644 index 0000000000000000000000000000000000000000..b95a5e66e13f7a3733f4eb1574a874c83bb4b5db GIT binary patch literal 684 zcmbtQF%H5o4DBRr;vpc`{oLUe!NAcVf{u+K7!EJ@`2!AXt?j(mnGG;>$*woyP`p(k+7^BWJ$H4mK3 zSC|4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/profiles/Geeetech/255x255.stl b/resources/profiles/Geeetech/255x255.stl new file mode 100644 index 0000000000000000000000000000000000000000..a60b4a405aa52da06614e26d5079a71c2864a723 GIT binary patch literal 684 zcmbVIF%H5o49o*~L_g34sWT`O3llFuVyT3LL>I*5pMmV+d0W;rPW#j&P2Af+{3&Q}DJ@KwTgQa7ptk z56o2$oXi)f0#|0OVtyN2aejs>#(J)MAfI3x@n#C=@N@-ufxTDtx9H&Aw*oI%Dp)Z; z_b3WM89|kHVfMVsJ#rr18LGe>sx}pmegz?<17%$lEaPD0dB#jLVY#MJ)-%cz@< literal 0 HcmV?d00001 diff --git a/resources/profiles/Geeetech/255x255.svg b/resources/profiles/Geeetech/255x255.svg new file mode 100644 index 00000000000..ff0373ac612 --- /dev/null +++ b/resources/profiles/Geeetech/255x255.svg @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/profiles/Geeetech/300x180.stl b/resources/profiles/Geeetech/300x180.stl new file mode 100644 index 0000000000000000000000000000000000000000..ee1d4867478f78006cb970fbc5c62cad467e318a GIT binary patch literal 684 zcmbV|F%H5o3`KnaX69a?QhoMgRZ+ literal 0 HcmV?d00001 diff --git a/resources/profiles/Geeetech/300x180.svg b/resources/profiles/Geeetech/300x180.svg new file mode 100644 index 00000000000..4cba3065e9b --- /dev/null +++ b/resources/profiles/Geeetech/300x180.svg @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/profiles/Geeetech/320x320.stl b/resources/profiles/Geeetech/320x320.stl new file mode 100644 index 0000000000000000000000000000000000000000..086d5064a61d16ebf6462c8964a59a5772a1301c GIT binary patch literal 684 zcmbu5OAf*?3`BDP4v`B~s^|gubi+Z|AR)0}!!kDmsTbpoQzs4Wj*;9&sy^Krjj z<7w!-%efo&{fmfyU>Ah+w!=Pg3L%am96y}mMB(H!Op!8og>EYa>WXxLr#!#$V6J&^ zDqmp=uF87F{WiAJ{28X0+PTGpe1>nNn=1;(vnb#d{$9=B(xH3V3SRN6P{sX}6N+nDcbcFa>j@+Eh?e-rMou&3qGO-Osot5iLxysH_xY?*9V1#9O`q literal 0 HcmV?d00001 diff --git a/resources/profiles/Geeetech/320x320.svg b/resources/profiles/Geeetech/320x320.svg new file mode 100644 index 00000000000..202c7c05424 --- /dev/null +++ b/resources/profiles/Geeetech/320x320.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/profiles/Geeetech/A10M_thumbnail.png b/resources/profiles/Geeetech/A10M_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..e487b34126cd65f565f9af01733a062ea431fa86 GIT binary patch literal 45048 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 BPdESo literal 0 HcmV?d00001 diff --git a/resources/profiles/Geeetech/A20M_thumbnail.png b/resources/profiles/Geeetech/A20M_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..ab48da911f950b5700f810d6e20c7398effa6e43 GIT binary patch literal 42458 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 F{{!;$yUqXr literal 0 HcmV?d00001 diff --git a/resources/profiles/Geeetech/A20T_thumbnail.png b/resources/profiles/Geeetech/A20T_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..a184f30777ec575557e102b542f3bbf04f677c29 GIT binary patch literal 57482 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 literal 0 HcmV?d00001 diff --git a/resources/profiles/Geeetech/A20_thumbnail.png b/resources/profiles/Geeetech/A20_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..bf8681167d8cffdc27c9b4269f67f4e98f1771b1 GIT binary patch literal 40931 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≪;Y$8;BR{zoqk6pRqk^cw{s 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 Ibnid^AI@t6JOBUy literal 0 HcmV?d00001 diff --git a/resources/profiles/Geeetech/A30T_thumbnail.png b/resources/profiles/Geeetech/A30T_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..1fd33db1bb504bcf2d09bd9f35c0c95ac6174428 GIT binary patch literal 50478 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 A=l}o! literal 0 HcmV?d00001 diff --git a/resources/profiles/Geeetech/E180_thumbnail.png b/resources/profiles/Geeetech/E180_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..4c3ffa454084b5505deea5a56fd5b27c50b6198c GIT binary patch literal 36072 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

pIf3oQSDb0CPN1!S)LmQc+Ps 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 literal 0 HcmV?d00001 diff --git a/resources/profiles/Geeetech/I3ProB_thumbnail.png b/resources/profiles/Geeetech/I3ProB_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..f4f86aaf42b5adc52031deb058638f8b81ea9723 GIT binary patch literal 59698 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 IT|E2TYHIe6*mP-V8l0M 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 Z;uqekd^3|YP5A?ONQ%mdR14_`{11hV^5y^l literal 0 HcmV?d00001 diff --git a/resources/profiles/Geeetech/I3ProW_thumbnail.png b/resources/profiles/Geeetech/I3ProW_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..585784f112edccb318c493968198f7b145c4b928 GIT binary patch literal 50350 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 literal 0 HcmV?d00001 diff --git a/resources/profiles/Geeetech/MeCreator_thumbnail.png b/resources/profiles/Geeetech/MeCreator_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..aafb6ed5b7eb692b3751ee2770f0bf01abfda336 GIT binary patch literal 49215 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 HanSz(FO?~P literal 0 HcmV?d00001 diff --git a/resources/profiles/Geeetech/MeDucer_thumbnail.png b/resources/profiles/Geeetech/MeDucer_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..306ff12beefed4f121ec6d13386557bee7a1f2bb GIT binary patch literal 59169 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 ooA+BD#&LN7SNi|y8IehQ1iX)M?O)J>Hq)$ literal 0 HcmV?d00001 diff --git a/resources/profiles/Geeetech/MizarM_thumbnail.png b/resources/profiles/Geeetech/MizarM_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..b0bce4653eb754cf83e25245d733d360aeeca51d GIT binary patch literal 48858 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 Rfbl$(ytIl`t%OPF{{V6xGqL~x literal 0 HcmV?d00001 diff --git a/resources/profiles/Geeetech/MizarPro_thumbnail.png b/resources/profiles/Geeetech/MizarPro_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..96099c88f4c191d23b2784f3b1bc1e376b2d86f3 GIT binary patch literal 35007 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�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 LiZrP~c*Xw<_mRR$ literal 0 HcmV?d00001 diff --git a/resources/profiles/Geeetech/MizarS_thumbnail.png b/resources/profiles/Geeetech/MizarS_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..9c0d3888578fef06df99e880c7b96255f7c4a8b6 GIT binary patch literal 35146 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 literal 0 HcmV?d00001 diff --git a/resources/profiles/Geeetech/Mizar_thumbnail.png b/resources/profiles/Geeetech/Mizar_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..46481ee07fb9a7327b2ccad381ee8889ea00f1fd GIT binary patch literal 27120 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 literal 0 HcmV?d00001 diff --git a/resources/profiles/Geeetech/Thunder_thumbnail.png b/resources/profiles/Geeetech/Thunder_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..73b5b9bbd418b7b5ef56a54cd9b63e0458ddd57e GIT binary patch literal 45095 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Π`M^ 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 literal 0 HcmV?d00001 diff --git a/resources/profiles/MakerGear.idx b/resources/profiles/MakerGear.idx new file mode 100644 index 00000000000..6fc08a3902f --- /dev/null +++ b/resources/profiles/MakerGear.idx @@ -0,0 +1,2 @@ +min_slic3r_version = 2.6.0-alpha1 +0.1.0 Initial version diff --git a/resources/profiles/MakerGear.ini b/resources/profiles/MakerGear.ini new file mode 100644 index 00000000000..961e505c950 --- /dev/null +++ b/resources/profiles/MakerGear.ini @@ -0,0 +1,1754 @@ +# Print profiles for the MakerGear printers. + +[vendor] +name = MakerGear +config_version = 0.1.0 +config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/MakerGear/ + +[printer_model:MAKERGEAR_MICRO] +# bed_model = waiting on this one +default_materials = MakerGear PLA @MakerGear_MICRO +family = MakerGear Micro +name = Micro +technology = FFF +variants = 0.40 + +[printer_model:MAKERGEAR_M2] +bed_model = M2_M3.stl +bed_texture = M2_M3.svg +default_materials = MakerGear PLA @MakerGear +family = MakerGear M2 +name = MakerGear M2(V4 Hotend) +technology = FFF +variants = 0.35; 0.50; 0.25; 0.75 + +[printer_model:MAKERGEAR_M2_DUAL] +bed_model = M2_M3.stl +bed_texture = M2_M3.svg +default_materials = MakerGear PLA @MakerGear; Empty @MakerGear +family = MakerGear M2 +name = MakerGear M2 Dual +technology = FFF +variants = 0.35; 0.50; 0.25; 0.75 + +[printer_model:MAKERGEAR_M3_SE] +bed_model = M2_M3.stl +bed_texture = M2_M3.svg +default_materials = MakerGear PLA @MakerGear +family = MakerGear M3-SE +name = M3 - Single Extruder +technology = FFF +variants = 0.35; 0.50; 0.25; 0.75 + +[printer_model:MAKERGEAR_M3_ID_0] +bed_model = M2_M3.stl +bed_texture = M2_M3.svg +thumbnail = MAKERGEAR_M3_thumbnail.png +default_materials = MakerGear PLA @MakerGear; Empty @MakerGear +family = MakerGear M3-ID Rev.0 +name = M3 - Independent Dual Rev.0 +technology = FFF +variants = 0.35; 0.50; 0.25; 0.75 + +[printer_model:MAKERGEAR_M3_ID_0_DUPLICATION] +thumbnail = MAKERGEAR_M3_DUPLICATION_thumbnail.png +default_materials = MakerGear PLA @MakerGear +family = MakerGear M3-ID Rev.0 +name = M3 - Independent Dual Rev.0 (Duplication Mode) +technology = FFF +variants = 0.35; 0.50; 0.25; 0.75 + +[printer_model:MAKERGEAR_M3_ID_1] +bed_model = M2_M3.stl +bed_texture = M2_M3.svg +thumbnail = MAKERGEAR_M3_thumbnail.png +default_materials = MakerGear PLA @MakerGear; Empty @MakerGear +family = MakerGear M3-ID Rev.1 +name = M3 - Independent Dual Rev.1 +technology = FFF +variants = 0.35; 0.50; 0.25; 0.75 + +[printer_model:MAKERGEAR_M3_ID_1_DUPLICATION] +thumbnail = MAKERGEAR_M3_DUPLICATION_thumbnail.png +default_materials = MakerGear PLA @MakerGear +family = MakerGear M3-ID Rev.1 +name = M3 - Independent Dual Rev.1 (Duplication Mode) +technology = FFF +variants = 0.35; 0.50; 0.25; 0.75 + +[printer_model:MAKERGEAR_U1] +# bed_model = +# bed_texture = +default_materials = MakerGear PLA @MakerGear +family = MakerGear Ultra One +name = Ultra One +technology = FFF +variants = 0.50; 0.25; 0.35; 0.75 + +[printer_model:MAKERGEAR_U1_DUPLICATION] +# bed_model = +# bed_texture = +thumbnail = MAKERGEAR_U1_thumbnail.png +default_materials = MakerGear PLA @MakerGear +family = MakerGear Ultra One +name = Ultra One (Duplication Mode) +technology = FFF +variants = 0.50; 0.25; 0.35; 0.75 + +# --------------------------- +# All presets starting with asterisk, for example *common*, are intermediate and they will +# not make it into the user interface. + +# /~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\ +# |~~~ Common Print Settings ~~~| +# \~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/ + +#0.35mm Nozzle +[print:*common*] +avoid_crossing_perimeters = 0 +bottom_fill_pattern = rectilinear +bridge_angle = 0 +bridge_flow_ratio = 0.95 +bridge_speed = 65 +brim_width = 0 +brim_type = outer_only +clip_multipart_objects = 1 +complete_objects = 0 +dont_support_bridges = 0 +elefant_foot_compensation = 0.1 +ensure_vertical_shell_thickness = 1 +external_fill_pattern = rectilinear +external_perimeter_extrusion_width = 0.42 +external_perimeter_speed = 80 +external_perimeters_first = 1 +extra_perimeters = 1 +extruder_clearance_height = 25 +extruder_clearance_radius = 45 +extrusion_width = 0.42 +fill_angle = 45 +fill_density = 15% +fill_pattern = gyroid +first_layer_extrusion_width = 0.42 +first_layer_height = 0.16 +first_layer_speed = 35 +gap_fill_speed = 30 +gcode_comments = 0 +infill_every_layers = 1 +infill_extruder = 1 +infill_extrusion_width = 0.42 +infill_first = 0 +infill_only_where_needed = 0 +infill_overlap = 20% +infill_speed = 90 +interface_shells = 0 +max_print_speed = 100 +max_volumetric_extrusion_rate_slope_negative = 0 +max_volumetric_extrusion_rate_slope_positive = 0 +max_volumetric_speed = 0 +min_skirt_length = 4 +notes = +only_retract_when_crossing_perimeters = 1 +ooze_prevention = 0 +output_filename_format = {input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode +overhangs = 1 +perimeter_extruder = 1 +perimeter_extrusion_width = 0.42 +perimeter_generator = arachne +perimeter_speed = 65 +perimeters = 2 +raft_first_layer_density = 60 +raft_layers = 0 +resolution = 0 +seam_position = aligned +single_extruder_multi_material_priming = 0 +skirt_distance = 2 +skirt_height = 1 +skirts = 3 +small_perimeter_speed = 25 +solid_infill_below_area = 0 +solid_infill_every_layers = 0 +solid_infill_extruder = 1 +solid_infill_extrusion_width = 0.42 +solid_infill_speed = 30 +spiral_vase = 0 +standby_temperature_delta = -5 +support_material = 1 +support_material_angle = 50 +support_material_buildplate_only = 0 +support_material_contact_distance = 0.25 +support_material_enforce_layers = 0 +support_material_extruder = 0 +support_material_extrusion_width = 0.42 +support_material_interface_contact_loops = 0 +support_material_interface_extruder = 0 +support_material_interface_layers = 2 +support_material_interface_spacing = 0.3 +support_material_interface_speed = 100% +support_material_pattern = honeycomb +support_material_spacing = 2 +support_material_speed = 60 +support_material_style = snug +support_material_synchronize_layers = 0 +support_material_threshold = 65 +support_material_with_sheath = 0 +support_material_xy_spacing = 200% +thin_walls = 1 +top_fill_pattern = rectilinear +top_infill_extrusion_width = 0.42 +top_solid_infill_speed = 35 +travel_speed = 150 +wipe_tower = 0 +wipe_tower_bridging = 10 +wipe_tower_rotation_angle = 0 +wipe_tower_width = 60 +wipe_tower_x = 170 +wipe_tower_y = 40 +xy_size_compensation = 0 + +# /~~~~~~~~~~~~~~~~~~~~~~~\ +# |~~~ Nozzle Variants ~~~| +# \~~~~~~~~~~~~~~~~~~~~~~~/ +[print:*0.25nozzle*] +elefant_foot_compensation = 0 +external_perimeter_extrusion_width = 0.30 +extrusion_width = 0.30 +first_layer_extrusion_width = 0.3 +infill_extrusion_width = 0.30 +output_filename_format = {input_filename_base}_{nozzle_diameter[0]}n_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode +perimeter_extrusion_width = 0.30 +solid_infill_extrusion_width = 0.30 +support_material_extrusion_width = 0.30 +support_material_interface_layers = 0 +support_material_interface_spacing = 0.15 +support_material_spacing = 1 +support_material_xy_spacing = 150% +top_infill_extrusion_width = 0.30 + + ; Only for the MakerGear Micro +[print:*0.40nozzle*] +bottom_solid_min_thickness = 0.5 +bridge_speed = 55 +external_perimeter_extrusion_width = 0.45 +external_perimeter_speed = 35 +extrusion_width = 0.45 +first_layer_extrusion_width = 0.42 +infill_anchor_max = 15 +infill_extrusion_width = 0.45 +infill_speed = 40 +output_filename_format = {input_filename_base}_{nozzle_diameter[0]}n_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode +overhangs = 1 +perimeter_extrusion_width = 0.45 +perimeter_speed = 35 +small_perimeter_speed = 35 +solid_infill_extrusion_width = 0.45 +solid_infill_speed = 45 +support_material = 1 +support_material_auto = 1 +support_material_contact_distance = 0.3 +support_material_extrusion_width = 0.45 +support_material_interface_layers = 1 +support_material_interface_spacing = 0.3 +support_material_spacing = 2.5 +support_material_speed = 35 +support_material_threshold = 60 +support_material_with_sheath = 1 +support_material_xy_spacing = 80% +top_infill_extrusion_width = 0.45 +top_solid_infill_speed = 25 +top_solid_min_thickness = 0.7 + +[print:*0.50nozzle*] +bottom_solid_min_thickness = 0.5 +external_perimeter_extrusion_width = 0.60 +extrusion_width = 0.60 +first_layer_extrusion_width = 0.60 +infill_anchor_max = 15 +infill_extrusion_width = 0.60 +output_filename_format = {input_filename_base}_{nozzle_diameter[0]}n_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode +perimeter_extrusion_width = 0.60 +solid_infill_extrusion_width = 0.60 +support_material_contact_distance = 0.25 +support_material_extrusion_width = 0.60 +support_material_interface_spacing = 0.3 +support_material_xy_spacing = 180% +top_infill_extrusion_width = 0.60 +top_solid_min_thickness = 0.8 + +[print:*0.75nozzle*] +bottom_solid_layers = 2 +bottom_solid_min_thickness = 0.6 +bridge_acceleration = 1000 +bridge_flow_ratio = 0.9 +bridge_speed = 22 +default_acceleration = 1000 +external_perimeter_extrusion_width = 0.84 +extrusion_width = 0.84 +fill_density = 10% +fill_pattern = gyroid +first_layer_acceleration = 1000 +first_layer_extrusion_width = 0.94 +first_layer_height = 0.3 +first_layer_speed = 20 +gap_fill_speed = 20 +infill_acceleration = 1000 +infill_anchor_max = 20 +infill_extrusion_width = 0.84 +infill_speed = 85 +infill_overlap = 25% +output_filename_format = {input_filename_base}_{nozzle_diameter[0]}n_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode +perimeter_acceleration = 800 +perimeter_extrusion_width = 0.84 +single_extruder_multi_material_priming = 0 +skirt_distance = 3 +skirt_height = 2 +solid_infill_speed = 55 +solid_infill_extrusion_width = 0.84 +support_material_contact_distance = 0.3 +support_material_extrusion_width = 0.7 +support_material_interface_spacing = 0.4 +support_material_interface_speed = 175% +support_material_spacing = 2 +support_material_threshold = 50 +support_material_xy_spacing = 200% +top_infill_extrusion_width = 0.8 +top_solid_layers = 4 +top_solid_min_thickness = 1.2 + +# /~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\ +# |~~~ Layer Height Settings ~~~| +# \~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/ +# --------------------------- +# (not used) 0.05mm +# --------------------------- +[print:*0.05mm*] +inherits = *common* +bottom_solid_layers = 10 +bridge_acceleration = 300 +bridge_flow_ratio = 0.7 +default_acceleration = 1000 +external_perimeter_speed = 20 +fill_density = 15% +first_layer_acceleration = 500 +gap_fill_speed = 20 +infill_acceleration = 800 +infill_speed = 30 +layer_height = 0.05 +max_print_speed = 80 +perimeter_acceleration = 300 +perimeter_speed = 30 +perimeters = 3 +small_perimeter_speed = 20 +solid_infill_speed = 30 +support_material_extrusion_width = 0.3 +support_material_spacing = 1.5 +support_material_speed = 30 +top_solid_infill_speed = 20 +top_solid_layers = 15 + +# [print:NOT READY 0.05mm ULTRAFINE @0.25 nozzle] # M2, M3, U1 +# inherits = *0.05mm*; *0.25nozzle* +# compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ and nozzle_diameter[0]==0.25 + +# --------------------------- +# 0.07mm (Testing) +# --------------------------- +[print:*0.07mm*] +inherits = *common* +bottom_solid_layers = 8 +bridge_acceleration = 300 +bridge_flow_ratio = 0.7 +bridge_speed = 20 +default_acceleration = 1000 +external_perimeter_speed = 20 +fill_density = 15% +first_layer_acceleration = 500 +gap_fill_speed = 20 +infill_acceleration = 800 +infill_speed = 40 +layer_height = 0.07 +max_print_speed = 80 +perimeter_acceleration = 300 +perimeter_speed = 30 +perimeters = 3 +small_perimeter_speed = 20 +solid_infill_speed = 40 +support_material_extrusion_width = 0.3 +support_material_spacing = 1.5 +support_material_speed = 40 +top_solid_infill_speed = 30 +top_solid_layers = 11 + +# [print:NOT READY 0.07mm Quality @0.25 nozzle] # M2, M3, U1 +# inherits = *0.07mm*; *0.25nozzle* +# compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ and nozzle_diameter[0]==0.25 + +# --------------------------- +# 0.10mm (Testing) +# --------------------------- +[print:*0.10mm*] +inherits = *common* +bottom_solid_layers = 7 +bridge_flow_ratio = 0.7 +bridge_speed = 20 +fill_density = 15% +first_layer_speed = 25 +gap_fill_speed = 20 +infill_speed = 40 +layer_height = 0.1 +max_print_speed = 80 +perimeter_acceleration = 800 +perimeter_speed = 30 +perimeters = 3 +small_perimeter_speed = 20 +solid_infill_speed = 40 +support_material_extrusion_width = 0.3 +support_material_spacing = 1.5 +support_material_speed = 40 +top_solid_infill_speed = 30 +top_solid_layers = 9 + + # M2, M3, U1 +[print:0.10mm Fine @0.35 nozzle MakerGear] +inherits = *0.10mm* +bridge_speed = 40 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ and nozzle_diameter[0]==0.35 +external_perimeter_speed = 45 +fill_density = 15% +fill_pattern = 3dhoneycomb +infill_acceleration = 1000 +infill_speed = 55 +max_print_speed = 200 +perimeter_speed = 45 +solid_infill_speed = 80 +top_solid_infill_speed = 40 + +# --------------------------- +# 0.15mm +# --------------------------- +[print:*0.15mm*] +inherits = *common* +bottom_solid_layers = 5 +external_perimeter_speed = 40 +infill_acceleration = 2000 +infill_speed = 60 +layer_height = 0.15 +perimeter_acceleration = 800 +perimeter_speed = 50 +solid_infill_speed = 50 +top_infill_extrusion_width = 0.4 +top_solid_layers = 7 + + # M2, M3, U1 +[print:0.15mm Normal @0.25 nozzle MakerGear] +inherits = *0.15mm*; *0.25nozzle* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ and nozzle_diameter[0]==0.25 + +# M2, M3, U1 +[print:0.15mm Quality @0.35 nozzle MakerGear] +inherits = *0.15mm* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ and nozzle_diameter[0]==0.35 +bridge_flow_ratio = 0.95 + +# Micro +[print:0.15mm Quality @0.40 nozzle MakerGear] +inherits = *0.15mm*; *0.40nozzle* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_MICRO.*/ and nozzle_diameter[0]==0.40 +first_layer_height = 0.2 + +# --------------------------- +# 0.20mm +# --------------------------- +[print:*0.20mm*] +inherits = *common* +bottom_solid_layers = 2 +bridge_flow_ratio = 0.9 +external_perimeter_speed = 60 +infill_speed = 65 +layer_height = 0.2 +perimeter_speed = 50 +solid_infill_speed = 50 +top_solid_layers = 3 + +# M2, M3, U1 +[print:0.20mm Quality @0.50 nozzle MakerGear] +inherits = *0.20mm*; *0.50nozzle* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ and nozzle_diameter[0]==0.50 + +# M2, M3, U1 +[print:0.20mm Normal @0.35 nozzle MakerGear] +inherits = *0.20mm* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ and nozzle_diameter[0]==0.35 +bridge_flow_ratio = 0.95 + +# Micro +[print:0.20mm Normal @0.40 Nozzle MakerGear] +inherits = *0.20mm*; *0.40nozzle* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_MICRO.*/ and nozzle_diameter[0]==0.40 +perimeters = 3 + +# --------------------------- +# 0.25mm (Testing) +# --------------------------- +[print:*0.25mm*] +inherits = *common* +bottom_solid_layers = 4 +bridge_flow_ratio = 0.95 +external_perimeter_speed = 40 +layer_height = 0.25 +perimeter_acceleration = 800 +perimeter_speed = 50 +top_solid_layers = 4 + +# M2, M3, U1 +[print:0.25mm Speed @0.35 nozzle MakerGear] +inherits = *0.25mm* +bridge_speed = 60 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ and nozzle_diameter[0]==0.35 +external_perimeter_speed = 70 +infill_acceleration = 2000 +infill_speed = 200 +max_print_speed = 200 +perimeter_speed = 75 +solid_infill_speed = 200 +top_solid_infill_speed = 70 + +# Micro +[print:0.25mm Fast @0.40 nozzle MakerGear] +inherits = *0.25mm*; *0.40nozzle* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_MICRO.*/ and nozzle_diameter[0]==0.40 +perimeters = 3 + +# M2, M3, U1 +[print:0.25mm Normal @0.50 nozzle MakerGear] +inherits = *0.25mm*; *0.50nozzle* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ and nozzle_diameter[0]==0.50 +first_layer_height = 0.26 + +# M2, M3, U1 +[print:0.25mm Quality @0.75 nozzle MakerGear] +inherits = *0.25mm*; *0.75nozzle* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ and nozzle_diameter[0]==0.75 + +# --------------------------- +# 0.30mm +# --------------------------- +[print:*0.30mm*] +inherits = *common* +bottom_solid_layers = 3 +bridge_flow_ratio = 0.95 +external_perimeter_speed = 75 +first_layer_height = 0.24 +gap_fill_speed = 40 +infill_speed = 80 +layer_height = 0.3 +perimeter_speed = 65 +small_perimeter_speed = 35 +solid_infill_speed = 50 +support_material_contact_distance = 0.3 +top_infill_extrusion_width = 0.4 +top_solid_layers = 4 + + # M2, M3, U1 +[print:0.30mm Speed @0.50 nozzle MakerGear] +inherits = *0.30mm*; *0.50nozzle* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ and nozzle_diameter[0]==0.50 +first_layer_height = 0.22 + +# M2, M3, U1 +[print:0.30mm Normal @0.75 nozzle MakerGear] +inherits = *0.30mm*; *0.75nozzle* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ and nozzle_diameter[0]==0.75 + +# --------------------------- +# 0.35mm (Testing) +# --------------------------- +[print:*0.35mm*] +inherits = *common* +bottom_solid_layers = 3 +external_perimeter_extrusion_width = 0.6 +external_perimeter_speed = 40 +first_layer_extrusion_width = 0.75 +infill_acceleration = 2000 +infill_speed = 60 +layer_height = 0.35 +perimeter_acceleration = 800 +perimeter_extrusion_width = 0.65 +perimeter_speed = 50 +solid_infill_extrusion_width = 0.65 +solid_infill_speed = 60 +top_solid_infill_speed = 50 +top_solid_layers = 4 + +# [print:NOT READY 0.35mm Speed @0.50 nozzle MakerGear] +#inherits = *0.35*; *0.50nozzle* +# compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ and nozzle_diameter[0]==0.50 + +# M2, M3, U1 +[print:0.35mm Speed @0.75 nozzle MakerGear] +inherits = *0.35mm*; *0.75nozzle* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ and nozzle_diameter[0]==0.75 + +# --------------------------- +# 0.40mm (NOT READY) +# --------------------------- +[print:*0.40mm*] +inherits = *common* +bottom_solid_layers = 3 +external_perimeter_extrusion_width = 0.6 +external_perimeter_speed = 40 +first_layer_extrusion_width = 0.75 +infill_acceleration = 2000 +infill_speed = 60 +layer_height = 0.40 +perimeter_acceleration = 800 +perimeter_extrusion_width = 0.65 +perimeter_speed = 50 +solid_infill_extrusion_width = 0.65 +solid_infill_speed = 60 +top_solid_infill_speed = 50 +top_solid_layers = 4 + +# [print:NOT READY 0.40mm Do_I_Want_To_Support_This @0.75 nozzle] # M2, M3, U1 +# inherits = *0.40mm*; *0.75nozzle* +# compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ and nozzle_diameter[0]==0.75 + + +# /~~~~~~~~~~~~~~~~~~~~~~~~~\ +# |~~~ Filament Settings ~~~| +# \~~~~~~~~~~~~~~~~~~~~~~~~~/ +# When submitting new filaments please print the following temperature tower at 0.1mm layer height: +# https://www.thingiverse.com/thing:2615842 +# Pay particular attention to bridging, overhangs and retractions. +# Also print the following bed adhesion test at 0.1 layer height as well: +# https://www.prusaprinters.org/prints/4634-bed-adhesion-warp-test + +[filament:*common*] +compatible_printers = +cooling = 0 +extrusion_multiplier = 0.9 +filament_cost = 0 +filament_density = 0 +filament_diameter = 1.75 +filament_notes = "" +filament_settings_id = "" +filament_soluble = 0 +min_print_speed = 15 +slowdown_below_layer_time = 20 + +[filament:*PLA*] +inherits = *common* +bed_temperature = 60 +bridge_fan_speed = 100 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(ICRO|2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +cooling = 1 +disable_fan_first_layers = 1 +fan_always_on = 1 +fan_below_layer_time = 100 +filament_colour = #DDDDDD +filament_cost = 20 +filament_density = 1.24 +filament_max_volumetric_speed = 15 +filament_type = PLA +first_layer_bed_temperature = 60 +first_layer_temperature = 215 +max_fan_speed = 100 +min_fan_speed = 100 +temperature = 210 + +[filament:*PET*] +inherits = *common* +bed_temperature = 70 +bridge_fan_speed = 100 +cooling = 1 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +disable_fan_first_layers = 2 +extrusion_multiplier = 0.98 +fan_always_on = 1 +fan_below_layer_time = 20 +filament_colour = #DDDDDD +filament_cost = 30 +filament_density = 1.27 +filament_max_volumetric_speed = 8 +filament_type = PETG +first_layer_bed_temperature = 70 +first_layer_temperature = 250 +max_fan_speed = 80 +min_fan_speed = 40 +temperature = 245 + +[filament:*ABS*] +inherits = *common* +bed_temperature = 100 +bridge_fan_speed = 30 +cooling = 0 +disable_fan_first_layers = 0 +extrusion_multiplier = 1 +fan_always_on = 0 +fan_below_layer_time = 20 +filament_colour = #DDDDDD +filament_cost = 20 +filament_density = 1.04 +filament_max_volumetric_speed = 11 +filament_type = ABS +first_layer_bed_temperature = 110 +first_layer_temperature = 250 +max_fan_speed = 0 +min_fan_speed = 0 +temperature = 245 +top_fan_speed = 0 + +[filament:*FLEX*] +inherits = *common* +bed_temperature = 50 +bridge_fan_speed = 80 +cooling = 0 +disable_fan_first_layers = 3 +extrusion_multiplier = 1.15 +fan_always_on = 0 +fan_below_layer_time = 100 +filament_colour = #008000 +filament_deretract_speed = 25 +filament_max_volumetric_speed = 2 +filament_retract_length = 0.8 +filament_retract_lift = 0 +filament_type = FLEX +filament_wipe = 0 +first_layer_bed_temperature = 55 +first_layer_temperature = 245 +max_fan_speed = 90 +min_fan_speed = 70 +slowdown_below_layer_time = 10 +temperature = 240 + +[filament:*EMPTY*] +inherits = *common* +bed_temperature = +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2_DUAL|3_ID)).*/ +filament_colour = #DDDDDD +filament_cost = 0 +filament_density = 0 +filament_type = EMPTY +first_layer_bed_temperature = +first_layer_temperature = 0 +temperature = 0 + +# --------------------------- +# PLA Filament +# --------------------------- +[filament:MakerGear PLA @MakerGear] +inherits = *PLA* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes!~/.*PRINTER_MODEL_MAKERGEAR_MICRO.*/ +filament_cost = 25.4 +filament_density = 1.24 +filament_vendor = MakerGear + + +[filament:MakerGear Translucent PLA @MakerGear] +inherits = MakerGear PLA @MakerGear +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ +filament_cost = 25.4 +filament_density = 1.24 +filament_vendor = MakerGear + +[filament:MakerGear PLA @MakerGear_Micro] +inherits = *PLA* +bed_temperature = +bridge_fan_speed = 0 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_MICRO.*/ +cooling = 0 +disable_fan_first_layers = +fan_always_on = 0 +fan_below_layer_time = +filament_colour = #DDDDDD +filament_cost = 20 +filament_density = 1.24 +filament_max_volumetric_speed = 10 +filament_type = PLA +filament_vendor = MakerGear +first_layer_bed_temperature = 0 +first_layer_temperature = 210 +max_fan_speed = +min_fan_speed = +temperature = 205 + +[filament:Fiberlogy PLA @MakerGear] +inherits = *PLA* +filament_cost = 25.4 +filament_density = 1.24 +filament_vendor = Fiberlogy + +[filament:AmazonBasics PLA @MakerGear] +inherits = *PLA* +filament_cost = 25.4 +filament_density = 1.24 +filament_vendor = AmazonBasics + +[filament:Overture PLA @MakerGear] +inherits = *PLA* +filament_cost = 22 +filament_density = 1.24 +filament_spool_weight = 235 +filament_vendor = Overture + +[filament:Hatchbox PLA @MakerGear] +inherits = *PLA* +filament_cost = 25.4 +filament_density = 1.27 +filament_spool_weight = 245 +filament_vendor = Hatchbox + +[filament:Fillamentum PLA @MakerGear] +inherits = *PLA* +filament_cost = 35.48 +filament_density = 1.24 +filament_spool_weight = 230 +filament_vendor = Fillamentum + +[filament:Esun PLA @MakerGear] +inherits = *PLA* +filament_cost = 25.4 +filament_density = 1.24 +filament_spool_weight = 265 +filament_vendor = Esun + +[filament:Inland PLA @MakerGear] +inherits = *PLA* +filament_cost = 25.4 +filament_density = 1.24 +filament_spool_weight = 265 +filament_vendor = Inland + +[filament:MatterHackers PLA @MakerGear] +inherits = *PLA* +filament_cost = 25.4 +filament_density = 1.24 +filament_spool_weight = 265 +filament_vendor = MatterHackers + +# --------------------------- +# ABS Filament +# --------------------------- +[filament:MakerGear ABS @MakerGear] +inherits = *ABS* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +cooling = 0 +filament_colour = #DDDDDD +filament_density = 1.04 +filament_type = ABS +filament_vendor = MakerGear + +[filament:Esun ABS @MakerGear] +inherits = *ABS* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +filament_cost = 27.82 +filament_density = 1.01 +filament_spool_weight = 265 +filament_vendor = Esun + +[filament:Hatchbox ABS @MakerGear] +inherits = *ABS* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +filament_cost = 27.82 +filament_density = 1.04 +filament_spool_weight = 245 +filament_vendor = Hatchbox + +[filament:Verbatim ABS @MakerGear] +inherits = *ABS* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +filament_cost = 25.87 +filament_density = 1.05 +filament_vendor = Verbatim + +[filament:Fillamentum ABS @MakerGear] +inherits = *ABS* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +filament_cost = 32.4 +filament_density = 1.04 +filament_spool_weight = 230 +filament_vendor = Fillamentum +first_layer_temperature = 240 +temperature = 240 + +[filament:E3D PC-ABS @MakerGear] +inherits = *ABS* +filament_vendor = E3D +filament_cost = 0 +filament_type = PC +filament_density = 1.05 +first_layer_temperature = 275 +temperature = 270 + +# --------------------------- +# ASA Filament +# --------------------------- +[filament:Fillamentum ASA @MakerGear] +inherits = *ABS* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +cooling = 1 +fan_always_on = 1 +filament_cost = 38.7 +filament_density = 1.07 +filament_spool_weight = 230 +filament_type = ASA +filament_vendor = Fillamentum +first_layer_temperature = 265 +max_fan_speed = 20 +min_fan_speed = 20 +min_print_speed = 15 +slowdown_below_layer_time = 15 +temperature = 265 + +[filament:Fiberlogy ASA @MakerGear] +inherits = *ABS* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +filament_vendor = Fiberlogy +filament_cost = 33 +filament_density = 1.07 +filament_spool_weight = 330 +fan_always_on = 0 +cooling = 1 +min_fan_speed = 10 +max_fan_speed = 15 +bridge_fan_speed = 30 +min_print_speed = 15 +slowdown_below_layer_time = 15 +first_layer_temperature = 260 +temperature = 260 +first_layer_bed_temperature = 105 +bed_temperature = 110 +filament_type = ASA +fan_below_layer_time = 30 +disable_fan_first_layers = 5 + +# --------------------------- +# PETG Filament +# --------------------------- +[filament:Verbatim PETG @MakerGear] +inherits = *PET* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +filament_cost = 27.90 +filament_density = 1.27 +filament_spool_weight = 235 +filament_vendor = Verbatim + +[filament:Fiberlogy PETG @MakerGear] +inherits = *PET* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +filament_cost = 21.50 +filament_density = 1.27 +filament_vendor = Fiberlogy + +[filament:Esun PETG @MakerGear] +inherits = *PET* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +filament_cost = 21.50 +filament_density = 1.27 +filament_vendor = Esun + +[filament:Overture PETG @MakerGear] +inherits = *PET* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +filament_cost = 27.90 +filament_density = 1.27 +filament_spool_weight = 235 +filament_vendor = Overture + +[filament:3DxTech PETG @MakerGear] +inherits = *PET* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +filament_cost = 27.90 +filament_density = 1.27 +filament_spool_weight = 235 +filament_vendor = 3DxTech + +[filament:Hatchbox PETG @MakerGear] +inherits = *PET* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +filament_cost = 27.90 +filament_density = 1.27 +filament_spool_weight = 235 +filament_vendor = Hatchbox + +[filament:Inland PETG @MakerGear] +inherits = *PET* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +filament_cost = 27.90 +filament_density = 1.27 +filament_spool_weight = 235 +filament_vendor = Inland + +[filament:MatterHackers PETG @MakerGear] +inherits = *PET* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +filament_cost = 27.90 +filament_density = 1.27 +filament_spool_weight = 235 +filament_vendor = MatterHackers + +# --------------------------- +# Nylon Filament +# --------------------------- +[filament:Fiberlogy Nylon PA12 @MakerGear] +inherits = Fiberlogy ASA @MakerGear +bed_temperature = 105 +bridge_fan_speed = 30 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +fan_always_on = 0 +fan_below_layer_time = 20 +filament_cost = 48 +filament_density = 1.01 +filament_max_volumetric_speed = 6 +filament_retract_lift = 0.2 +filament_type = NYLON +first_layer_bed_temperature = 110 +first_layer_temperature = 265 +max_fan_speed = 15 +min_fan_speed = 10 +temperature = 265 + +[filament:Fiberlogy Nylon PA12+CF15 @MakerGear] +inherits = Fiberlogy Nylon PA12 @MakerGear +bed_temperature = 110 +bridge_fan_speed = 30 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +extrusion_multiplier = 0.97 +fan_always_on = 0 +fan_below_layer_time = 20 +filament_cost = 87.5 +filament_density = 1.07 +filament_max_volumetric_speed = 6 +first_layer_bed_temperature = 105 +first_layer_temperature = 265 +max_fan_speed = 15 +min_fan_speed = 10 +temperature = 265 +# --------------------------- +# Flex Filament +# --------------------------- +[filament:AmazonBasics TPU @MakerGear] +inherits = *FLEX* +bed_temperature = 50 +bridge_fan_speed = 100 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +cooling = 1 +disable_fan_first_layers = 4 +extrusion_multiplier = 1.14 +fan_always_on = 1 +filament_cost = 19.99 +filament_density = 1.21 +filament_deretract_speed = 20 +filament_max_volumetric_speed = 1.8 +filament_retract_before_travel = 3 +filament_retract_length = 2 +filament_retract_lift = 0 +filament_retract_speed = 45 +filament_vendor = AmazonBasics +filament_wipe = 0 +first_layer_bed_temperature = 50 +first_layer_temperature = 235 +full_fan_speed_layer = 6 +max_fan_speed = 80 +min_fan_speed = 80 +min_print_speed = 15 +temperature = 235 + +[filament:SainSmart TPU @MakerGear] +inherits = *FLEX* +bed_temperature = 50 +bridge_fan_speed = 100 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +cooling = 1 +disable_fan_first_layers = 4 +extrusion_multiplier = 1.1 +fan_always_on = 1 +filament_cost = 32.99 +filament_density = 1.21 +filament_deretract_speed = 25 +filament_max_volumetric_speed = 2.5 +filament_retract_before_travel = 3 +filament_retract_length = 1 +filament_retract_lift = 0 +filament_retract_speed = nil +filament_vendor = SainSmart +filament_wipe = 0 +first_layer_bed_temperature = 50 +first_layer_temperature = 230 +full_fan_speed_layer = 6 +max_fan_speed = 80 +min_fan_speed = 80 +min_print_speed = 15 +temperature = 230 + +# --------------------------- +# Misc Filament +# --------------------------- +[filament:PolyMaker PolySmooth @MakerGear] +inherits = *PLA* +bed_temperature = 60 +bridge_fan_speed = 100 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +cooling = 1 +disable_fan_first_layers = 1 +fan_always_on = 1 +fan_below_layer_time = 100 +filament_colour = #666666 +filament_cost = 20 +filament_density = 1.24 +filament_max_volumetric_speed = 10 +filament_retract_length = 1 +filament_retract_speed = 25 +filament_type = Misc +filament_vendor = PolyMaker +first_layer_bed_temperature = 55 +first_layer_temperature = 215 +max_fan_speed = 100 +min_fan_speed = 100 +temperature = 210 + +[filament:Empty @MakerGear] +inherits = *EMPTY* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2_DUAL|3_ID)).*/ +filament_cost = 0 +filament_density = 0 +filament_spool_weight = 0 +filament_vendor = MakerGear +filament_type = Misc + +# --------------------------- +# Generic Filament +# --------------------------- +[filament:Generic ABS @MakerGear] +inherits = *ABS* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +filament_cost = 27.82 +filament_density = 1.04 +filament_vendor = Generic + +[filament:Generic PETG @MakerGear] +inherits = *PET* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +filament_cost = 27.82 +filament_density = 1.27 +filament_vendor = Generic + + +[filament:Generic ASA @MakerGear] +inherits = *ABS* +bed_temperature = 90 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +filament_cost = 27.82 +filament_density = 1.04 +filament_type = ASA +filament_vendor = Generic +first_layer_bed_temperature = 95 +first_layer_temperature = 250 +temperature = 245 + +[filament:Generic FLEX @MakerGear] +inherits = *FLEX* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +filament_cost = 82 +filament_density = 1.22 +filament_max_volumetric_speed = 1.2 +filament_retract_length = 0 +filament_retract_lift = nil +filament_retract_speed = nil +filament_vendor = Generic + +[filament:Generic HIPS @MakerGear] +inherits = *ABS* +bridge_fan_speed = 50 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_MAKERGEAR.*/ and printer_notes=~/.*PRINTER_MODEL_MAKERGEAR_(U1|M(2|2_DUAL|3_SE|3_ID|3_ID_DUPLICATION)).*/ +cooling = 1 +extrusion_multiplier = 1 +fan_always_on = 1 +fan_below_layer_time = 10 +filament_colour = #FFFFD7 +filament_cost = 27.3 +filament_density = 1.04 +filament_soluble = 1 +filament_type = HIPS +filament_vendor = Generic +first_layer_temperature = 230 +max_fan_speed = 20 +min_fan_speed = 20 +temperature = 230 + +# /~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\ +# |~~~ Common printer presets ~~~| +# \~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/ +[printer:*default*] +before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;[layer_z]\n\n +between_objects_gcode = +color_change_gcode = +extruder_colour = #FD8309;#E1E1E1 +extruder_offset = 0x0 +gcode_flavor = marlin +layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z] +machine_limits_usage = time_estimate_only +nozzle_diameter = 0.35 +octoprint_apikey = +octoprint_host = +pause_print_gcode = M601 +printer_notes = Dont remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_MAKERGEAR\n +printer_settings_id = +printer_technology = FFF +remaining_times = 0 +retract_length = 2 +serial_port = +serial_speed = 115200 +silent_mode = 0 +use_firmware_retraction = 0 +use_relative_e_distances = 0 +use_volumetric_e = 0 +variable_layer_height = 0 + +# --------------------------- +# MakerGear Micro +# --------------------------- +[printer:MakerGear Micro] +inherits = *default* +bed_shape = 0x0, 81x0, 81x81, 0x81 +default_filament_profile = "MakerGear PLA @MakerGear_Micro" +default_print_profile = 0.20mm Normal @0.40 Nozzle MakerGear +end_gcode = M104 S0 ; Turn off hotend temperature \nG1 X0 Y81 Z95 +gcode_flavor = marlin +machine_max_acceleration_e = 2000, 2000 +machine_max_acceleration_extruding = 2000, 2000 +machine_max_acceleration_retracting = 2000, 2000 +machine_max_acceleration_x = 450, 450 +machine_max_acceleration_y = 450, 450 +machine_max_acceleration_z = 10, 10 +machine_max_feedrate_e = 30, 30 +machine_max_feedrate_x = 300, 300 +machine_max_feedrate_y = 300, 300 +machine_max_feedrate_z = 20, 20 +machine_max_jerk_e = 10, 10 +# machine_max_jerk_x = Using Junction Deviation Factor +# machine_max_jerk_y = Using Junction Deviation Factor +# machine_max_jerk_z = Using Junction Deviation Factor +max_layer_height = 0.3 +max_print_height = 100 +nozzle_diameter = 0.40 +printer_model = MAKERGEAR_MICRO +printer_notes = Dont remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_MAKERGEAR\nPRINTER_MODEL_MAKERGEAR_MICRO\n +printer_variant = 0.40 +retract_length = 6 +retract_speed = 60 +start_gcode = G90 ; blank \nM82 ; blank \nG28 ; home all axes \nG29 ; Mesh testing \nG1 X0 Y0 ; moves axes \nM109 S[first_layer_temperature_[current_extruder]] ; wait for hotend to reach first layer temperature +# thumbnails = 16x16, 261x256 + +# --------------------------- +# MakerGear M2 +# --------------------------- +[printer:MakerGear M2 (V4 Hotend)] +inherits = *default* +bed_shape = 0x0,200x0,200x251,0x251 +default_filament_profile = "MakerGear PLA @MakerGear" +default_print_profile = 0.20mm Normal @0.35 nozzle MakerGear +end_gcode = M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nG91 ; relative mode\nG1 Z10 ; lift 10mm\nG90 ; absolute mode\nG28 X0 ; home X axis\nM84 ; disable motors +machine_max_acceleration_e = 2000, 2000 +machine_max_acceleration_extruding = 2000, 2000 +machine_max_acceleration_retracting = 3000, 3000 +machine_max_acceleration_x = 2000, 2000 +machine_max_acceleration_y = 2000, 2000 +machine_max_acceleration_z = 2000, 2000 +machine_max_feedrate_e = 25, 25 +machine_max_feedrate_x = 200, 200 +machine_max_feedrate_y = 200, 200 +machine_max_feedrate_z = 25, 25 +machine_max_jerk_e = 1, 1 +machine_max_jerk_x = 4, 4 +machine_max_jerk_y = 4, 4 +machine_max_jerk_z = 0.4, 0.4 +max_print_height = 200 +nozzle_diameter = 0.35 +printer_model = MAKERGEAR_M2 +printer_notes = Dont remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_MAKERGEAR\nPRINTER_MODEL_MAKERGEAR_M2\n +printer_variant = 0.35 +start_gcode = M108 S255 ; turn on M2 fans\nG28 ; home all axes\nG1 Y50 Z0.3 F9600 ; move forward to avoid binder clips\nG1 X205 Z10 ; move off platform\nG1 Z0.4 ; position nozzle\nG92 E0 ; zero extruder\nM109 S[first_layer_temperature_[current_extruder]]\nG1 E25 F225 ; purge nozzle\nG92 E0 ; zero extruder\nG1 X190 Z0.1 E1.0 F1200 ; slow wipe\nG1 X180 Z0.25 ; lift\n +# thumbnails = 16x16,220x124 + +[printer:MakerGear M2 0.25 Nozzle] +inherits = MakerGear M2 (V4 Hotend) +default_print_profile = 0.15mm Normal @0.25 nozzle MakerGear +max_layer_height = 0.15 +min_layer_height = 0.05 +nozzle_diameter = 0.25 +printer_variant = 0.25 +retract_length = 1 +retract_lift = 0.15 +retract_speed = 50 + +[printer:MakerGear M2 0.50 Nozzle] +inherits = MakerGear M2 (V4 Hotend) +default_print_profile = 0.20mm Quality @0.50 nozzle MakerGear +max_layer_height = 0.35 +min_layer_height = 0.1 +nozzle_diameter = 0.50 +printer_variant = 0.50 + +[printer:MakerGear M2 0.75 Nozzle] +inherits = MakerGear M2 (V4 Hotend) +default_print_profile = 0.25mm Quality @0.75 nozzle MakerGear +max_layer_height = 0.5 +min_layer_height = 0.15 +nozzle_diameter = 0.75 +printer_variant = 0.75 +retract_length = 1 +retract_speed = 35 + +# ------------------------------- +# MakerGear M2 Dual +# ------------------------------- +[printer:MakerGear M2 Dual] +inherits = *default* +bed_shape = 0x0,200x0,200x251,0x251 +default_filament_profile = "MakerGear PLA @MakerGear" +default_print_profile = 0.20mm Normal @0.35 nozzle MakerGear +end_gcode = M104 S0 T1 ; turn off right extruder\nM104 S0 T0 ; turn off left extruder\nM140 S0 ; turn off bed\nG91 ; relative mode\nG1 Z10 ; lift 10mm\nG90 ; absolute mode\nG28 X0 ; home X axis\nM84 ; disable motors +extruders_count = 2 +machine_max_acceleration_e = 2000, 2000 +machine_max_acceleration_extruding = 1000, 1000 +machine_max_acceleration_retracting = 2000, 2000 +machine_max_acceleration_x = 1200, 1200 +machine_max_acceleration_y = 1200, 1200 +machine_max_acceleration_z = 10, 10 +machine_max_feedrate_e = 30, 30 +machine_max_feedrate_x = 300, 300 +machine_max_feedrate_y = 300, 300 +machine_max_feedrate_z = 10, 10 +machine_max_jerk_e = 10, 10 +machine_max_jerk_x = 5, 5 +machine_max_jerk_y = 5, 5 +machine_max_jerk_z = 1, 1 +max_print_height = 200 +nozzle_diameter = 0.35,0.35 +printer_model = MAKERGEAR_M2_DUAL +printer_notes = Dont remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_MAKERGEAR\nPRINTER_MODEL_MAKERGEAR_M2_DUAL\n +printer_variant = 0.35 +start_gcode = \nM108 S0 ; Turn on M2 fans\n; Turn off hotends to reduce ooze on the bed during startup\n; NOTE: this does not explicitly wait for the hotends to completely cool down\nM104 T0 S0\nM104 T1 S0\n\n{if first_layer_bed_temperature[1] < first_layer_bed_temperature[0]}\nM140 S{first_layer_bed_temperature[0]} ; Set bed temperature\nM190 S{first_layer_bed_temperature[0]} ; Wait for bed to reach temperature\n{endif}\n\n{if first_layer_bed_temperature[0] < first_layer_bed_temperature[1]}\nM140 S{first_layer_bed_temperature[1]} ; Set bed temperature\nM190 S{first_layer_bed_temperature[1]} ; Wait for bed to reach temperature\n{endif}\n\nT1 ; Switch to right extruder offsets for homing\nG28 ; Home all axes\nT0 ; Switch to left extruder\nG1 X0 Y50 Z0.3 F9600 ; Move forward to avoid binder clips\nG1 X200 Z10 F3600 ; Move off platform\n\n; Set hotend temperature\nM104 T0 S{first_layer_temperature[0]}\nM104 T1 S{first_layer_temperature[1]}\n\n; Wait for hotends to reach temperature\nM109 T0 S{first_layer_temperature[0]}\nM109 T1 S{first_layer_temperature[1]}\n\n\n{if temperature[1] == 0}\n; Single Mode - Left Purge script\n\nG1 Z0.4 ; Position nozzle above buildplate\nG92 E0 ; Zero extruder\nG1 E25 F225 ; Purge left extruder\nG92 E0 ; Zero extruder\nG1 X160 Z0.1 E1.0 F1200 ; Slow wipe\nG1 X140 Z0.25 ; Lift\n{endif}\n\n{if temperature[0] == 0}\n; Single Mode - Right Purge Script\n\nG1 Z0.4 ; Position nozzle above buildplate\nT1 ; Switch to right extruder\nG92 E0 ; Zero extruder\nG1 E25 F225 ; Purge right extruder\nG92 E0 ; Zero extruder\nG1 X160 Z0.1 E1.0 F1200 ; Slow wipe\nG1 X140 Z0.25 ; Lift\n{endif}\n\n{if temperature[0] > 0 and temperature[1] > 0}\n; Dual Mode - Purge Script\nG1 Z0.4 ; Position nozzle above buildplate\nG92 E0 ; Zero extruder\nG1 E25 F225 ; Purge left extruder\nG92 E0 ; Zero extruder\nT1 ; Set right extruder\nG1 E25 F225 ; Purge right extruder\nG92 E0 ; Zero extruder\nG1 X160 Z0.1 E1.0 F1200 ; Slow wipe\nG1 X140 Z0.25 ; Lift\nT0\nG92 E0 ; Zero extruder\n{endif} +# thumbnails = 16x16,220x124 + +[printer:MakerGear M2 Dual 0.25 Nozzle] +inherits = MakerGear M2 Dual +default_print_profile = 0.15mm Normal @0.25 nozzle MakerGear +max_layer_height = 0.15 +min_layer_height = 0.05 +nozzle_diameter = 0.25 +printer_variant = 0.25 +retract_length = 1 +retract_lift = 0.15 +retract_speed = 50 + +[printer:MakerGear M2 Dual 0.50 Nozzle] +inherits = MakerGear M2 Dual +default_print_profile = 0.20mm Quality @0.50 nozzle MakerGear +max_layer_height = 0.35 +min_layer_height = 0.1 +nozzle_diameter = 0.50 +printer_variant = 0.50 + +[printer:MakerGear M2 Dual 0.75 Nozzle] +inherits = MakerGear M2 Dual +default_print_profile = 0.25mm Quality @0.75 nozzle MakerGear +max_layer_height = 0.5 +min_layer_height = 0.15,0.15 +nozzle_diameter = 0.75,0.75 +printer_variant = 0.75 +retract_length = 1, 1 +retract_speed = 35, 35 + +# --------------------------- +# MakerGear M3-S3 +# --------------------------- +[printer:MakerGear M3 Single Extruder] +inherits = *default* +bed_shape = 0x0,200x0,200x251,0x251 +default_filament_profile = "MakerGear PLA @MakerGear" +default_print_profile = 0.20mm Normal @0.35 nozzle MakerGear +end_gcode = M104 S0 ; turn off extruder\nM104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nG1 Z200 Y0 X215 F10000\nM106 S0\nM84 ; disable motors +host_type = octoprint +machine_max_acceleration_e = 2000, 2000 +machine_max_acceleration_extruding = 1000, 1000 +machine_max_acceleration_retracting = 2000, 2000 +machine_max_acceleration_x = 1200, 1200 +machine_max_acceleration_y = 1200, 1200 +machine_max_acceleration_z = 10, 10 +machine_max_feedrate_e = 30, 30 +machine_max_feedrate_x = 300, 300 +machine_max_feedrate_y = 300, 300 +machine_max_feedrate_z = 10, 10 +machine_max_jerk_e = 10, 10 +machine_max_jerk_x = 5, 5 +machine_max_jerk_y = 5, 5 +machine_max_jerk_z = 1, 1 +max_print_height = 200 +nozzle_diameter = 0.35 +printer_model = MAKERGEAR_M3_SE +printer_notes = Dont remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_MAKERGEAR\nPRINTER_MODEL_MAKERGEAR_M3_SE\n +printer_variant = 0.35 +start_gcode = G28 ; home all axes\nG1 X215 Y40 Z0.1 F10000 ; move off the bed and bring the bed up\nM109 S[first_layer_temperature_[current_extruder]]\nG92 E0 ; zero extruder\nG1 X195 Z0.1 F1000; scrape off any ooze\nG1 Z5 ; lift\nG1 X170 Y3 F10000; move to unused front edge\nG1 Z0.30 F1000\n\nG1 X40 E20 F1000\nG1 X30 Z0.05 F1000 ; wipe off tail\nG1 Z1\nG92 E0\nM211 S0 ;disable software endstops\n; ok now you can start +# thumbnails = 16x16,220x124 + +[printer:MakerGear M3 Single Extruder 0.25 Nozzle] +inherits = MakerGear M3 Single Extruder +default_print_profile = 0.15mm Normal @0.25 nozzle MakerGear +max_layer_height = 0.15 +min_layer_height = 0.05 +nozzle_diameter = 0.25 +printer_variant = 0.25 +retract_length = 1 +retract_lift = 0.15 +retract_speed = 50 + +[printer:MakerGear M3 Single Extruder 0.50 Nozzle] +inherits = MakerGear M3 Single Extruder +default_print_profile = 0.20mm Quality @0.50 nozzle MakerGear +max_layer_height = 0.35 +min_layer_height = 0.1 +nozzle_diameter = 0.50 +printer_variant = 0.50 + +[printer:MakerGear M3 Single Extruder 0.75 Nozzle] +inherits = MakerGear M3 Single Extruder +default_print_profile = 0.25mm Quality @0.75 nozzle MakerGear +max_layer_height = 0.5 +min_layer_height = 0.25 +nozzle_diameter = 0.75 +printer_variant = 0.75 +retract_length = 1 +retract_speed = 35 + +# ------------------------------ +# MakerGear M3 Independent Dual Rev.0 +# ------------------------------ +[printer:MakerGear M3 Independent Dual Rev.0] +inherits = *default* +bed_shape = 0x0,200x0,200x255,0x251 +default_filament_profile = "MakerGear PLA @MakerGear" +default_print_profile = 0.20mm Normal @0.35 nozzle MakerGear +end_gcode = M104 S0 ; turn off extruder\nM104 S0 T0 ; turn off extruder\nM104 S0 T1; turn off extruder\nM140 S0 ; turn off bed\nM106 S0 ; turn off cooling fan\nG91 ; relative mode\nG1 Z20 ; move Z down 20mm if possible Max endstop will catch it if it is to far\nG90; absolute mode\nG28 X ; home tool/s\nT0 ; defualt tool should always be T0\nG1 Y230 F10000 ; move build plate out\nM84 ; disable motors +extruders_count = 2 +extruder_offset = 0x0,0x0 +host_type = octoprint +machine_max_acceleration_e = 2000, 2000 +machine_max_acceleration_extruding = 1000, 1000 +machine_max_acceleration_retracting = 2000, 2000 +machine_max_acceleration_x = 1200, 1200 +machine_max_acceleration_y = 1200, 1200 +machine_max_acceleration_z = 10, 10 +machine_max_feedrate_e = 30, 30 +machine_max_feedrate_x = 300, 300 +machine_max_feedrate_y = 300, 300 +machine_max_feedrate_z = 10, 10 +machine_max_jerk_e = 10, 10 +machine_max_jerk_x = 5, 5 +machine_max_jerk_y = 5, 5 +machine_max_jerk_z = 1, 1 +max_layer_height = 0.28,0.28 +max_print_height = 200 +nozzle_diameter = 0.35,0.35 +printer_model = MAKERGEAR_M3_ID_0_DUPLICATION +printer_notes = Dont remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_MAKERGEAR\nPRINTER_MODEL_MAKERGEAR_M3_ID_0\n +printer_variant = 0.35 +retract_length_toolchange = 4,4 +start_gcode = ;M3 Independent Dual Startup Script\n\n; Turn off hotends to reduce ooze on the bed during startup\n; NOTE: this does not explicitly wait for the hotends to completely cool down\nM104 T0 S0\nM104 T1 S0\n\n{if first_layer_bed_temperature[1] < first_layer_bed_temperature[0]}\nM140 S{first_layer_bed_temperature[0]} ; Set bed temperature\nM190 S{first_layer_bed_temperature[0]} ; Wait for bed to reach temperature\n{endif}\n\n{if first_layer_bed_temperature[0] < first_layer_bed_temperature[1]}\nM140 S{first_layer_bed_temperature[1]} ; Set bed temperature\nM190 S{first_layer_bed_temperature[1]} ; Wait for bed to reach temperature\n{endif}\n\nM605 S0 ; Set to full independent control on x axes\nT0 ; Switch to left hotend\nG28 ; Home all axes probe/mesh if available\n\n; Set hotend temperature\nM104 T0 S{first_layer_temperature[0]}\nM104 T1 S{first_layer_temperature[1]}\n\n; Wait for hotends to reach temperature\nM109 T0 S{first_layer_temperature[0]}\nM109 T1 S{first_layer_temperature[1]}\n\n; Purge Scripts\n{if temperature[1] == 0}\n\n; Single Mode - Left Purge\nM211 S0 ; Turn off software endstops\nG1 X205 Y210 Z0.1 F10000 ; Move off the bed and bring the bed up\nG92 E0 ; Zero extruder\nG1 X195 Z0.1 F1000 ; Scrape off any ooze\nG1 Z10 ; Lift bed\nG1 X160 Y240 F10000 ; move to unused front edge\nG1 Z0.30 F1000\nG1 X40 E20 F1000\nG1 X30 Z0.05 F1000 ; wipe off tail\nG1 Z10\nG92 E0{endif}\n\n{if temperature[0] == 0}\n; Single Mode - Right Purge\nM211 S0 ; Turn off software endstops for purge moves\nG1 X25 F9000 ; Move T0 past bedclips as to not damage probe\nT1 ; Switch to right hotend\nG1 X205 Y210 Z0.1 F10000 ; Move off the bed and bring the bed up\nG92 E0 ; Zero extruder\nG1 X195 Z0.1 F1000 ; Scrape off any ooze\nG1 Z10 ; Lift\nG1 X100 Y240 F10000 ; Move to unused front edge\nG1 Z0.30 F1000\nG1 X180 E9.25 F1000 ; Deposit extrusion line\nG1 Y239 E9.45 F1000 ; Move Y-axis and extrude\nG1 X130 E17.05; lift \nF1000 ; deposit extrusion line\nG1 X120 Z0.05 F1000 ; wipe off tail\nG92 E0; zero extruder\nG1 Z10 Y230 ; move back to safe bounds\nT0\nG1 X-20.77 ; move T0 back home\nT1{endif}\n\n{if temperature[0] > 0 and temperature[1] > 0}\n; M3-ID T0/T1 Starting Script\nG1 X25 F9000; move T0 past bedclips as to not damage probe\n\nT1 ; Switch to right extruder\nG1 X215 Y210 Z0.1 F10000 ; move off the bed and bring the bed up\nG92 E0 ; zero extruder\nG1 X195 Z0.1 F1000; scrape off any ooze\nG1 Z10 ; lift\nM211 S0 ; turn off soft endstops for purge moves\nG1 X100 Y240 F10000; move to unused back edge\nG1 Z0.30 F1000\nG1 X180 E9.25 F1000; deposit extrusion line\nG1 Y239 E9.45 F1000 ; move and extrude y\nG1 X130 E17.05; lift F1000; deposit extrusion line\nG1 X100 Z0.05 F1000 ; wipe off tail\nG92 E0; zero extruder\nG1 Z10 Y225 ; move back to safe bounds\nG1 X252 F4800; move T1 home\n\nT0;\nG1 X205 Y210 Z0.1 F10000 ; move off the bed and bring the bed up\nG92 E0 ; zero extruder\nG1 X195 Z0.1 F1000; scrape off any ooze\nG1 Z10 ; lift\nG1 X100 Y240 F10000; move to unused back edge\nG1 Z0.30 F1000\nG1 X20 E9.25 F1000; deposit extrusion line\nG1 Y239 E9.45 F1000 ; move and extrude y\nG1 X70 E17.05; lift F1000; deposit extrusion line\nG1 X100 Z0.05 F1000 ; wipe off tail\nG92 E0; zero extruder\nG1 Z10 Y225 ; move back to safe bounds\nG1 X-20.77 F4800 ; move T0 home\nG92 E0{endif}\n; ok now you can start +toolchange_gcode = {if next_extruder == 0}\nT1 ; makes sure T1 is active\nG90 ; switch into absolute mode\nG1 X252\nT0\n{endif}\n\n{if next_extruder == 1}\nT0 ; makes sure T0 is active\nG90 ; switch into absolute mode\nG1 X-4\nT1\n{endif}\n +# thumbnails = 16x16,220x124 + +[printer:MakerGear M3 Independent Dual Rev.0 0.25 Nozzle] +inherits = MakerGear M3 Independent Dual Rev.0 +default_print_profile = 0.15mm Normal @0.25 nozzle MakerGear +max_layer_height = 0.15,0.15 +min_layer_height = 0.05,0.05 +nozzle_diameter = 0.25,0.25 +printer_variant = 0.25 +retract_length = 1 +retract_lift = 0.15 +retract_speed = 50 + +[printer:MakerGear M3 Independent Dual Rev.0 0.50 Nozzle] +inherits = MakerGear M3 Independent Dual Rev.0 +default_print_profile = 0.20mm Quality @0.50 nozzle MakerGear +max_layer_height = 0.35,0.35 +min_layer_height = 0.1,0.1 +nozzle_diameter = 0.50,0.50 +printer_variant = 0.50 + +[printer:MakerGear M3 Independent Dual Rev.0 0.75 Nozzle] +inherits = MakerGear M3 Independent Dual Rev.0 +default_print_profile = 0.25mm Quality @0.75 nozzle MakerGear +max_layer_height = 0.5,0.5 +min_layer_height = 0.15,0.15 +nozzle_diameter = 0.75,0.75 +printer_variant = 0.75 +retract_length = 1, 1 +retract_speed = 35, 35 + +# ----------------------------------- +# MakerGear M3-ID (Duplication Mode) +# ----------------------------------- +[printer:MakerGear M3 Independent Dual Rev.0 (Duplication Mode)] +inherits = MakerGear M3 Independent Dual Rev.0 +bed_shape = 0x0,100x0,100x251,0x251 +end_gcode = M605 S0 ; set to full independent control\nM104 S0 ; turn off extruder\nM104 S0 T0 ; turn off extruder\nM104 S0 T1 ; turn off extruder\nM140 S0 ; turn off bed\nM106 S0 ; turn off cooling fan\nG91 ; relative mode\nG1 Z20 ; move Z down 20mm if possible Max endstop will catch it if it is to far\nG90 ; absolute mode\nG28 X ; home tools\nT0 ; default tool should always be T0\nG1 Y230 F10000 ; move build plate out\nM84 ; disable motors +extruders_count = 1 +nozzle_diameter = 0.35 +printer_model = MAKERGEAR_M3_ID_0_DUPLICATION +printer_notes = Dont remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_MAKERGEAR\nPRINTER_MODEL_MAKERGEAR_M3_ID_0_DUPLICATION\n +printer_variant = 0.35 +start_gcode = ;M3 ID Duplication Mode startup script\nM211 S1 ; turn on soft endstops to protect the machine\nM605 S0 ; set to full independent control on x axes\nG28 XYZ ; home without mesh level compensation\n\n; Set hotend temperature\nM104 T0 S{first_layer_temperature[0]}\nM104 T1 S{first_layer_temperature[0]}\n\n; Wait for hotend's to reach temperature\nM109 T0 S{first_layer_temperature[0]}\nM109 T1 S{first_layer_temperature[0]}\n\nT0 ; Make sure we're on T0\nM605 S2 R0 X100 ; set X to duplication mode 0 temperature difference 100 X difference\nG28 X ; home x axes to engange mode\nM211 S0 ; turn off soft endstops to let us move to back of the bed\nG1 X20 F1000 ; move to start x position\nG1 Y243 Z0.1 F10000 ; move off the bed and bring the bed up\nG92 E0 ; zero extruder\nG1 Y240 Z0.1 F1000 ; scrape off any ooze\nG1 Z0.30 F1000 ; lift\nG1 X80 E9.25 ; lift F1000 ; deposit extrusion line\nG1 Y239 E9.45 F1000 ; move and extrude y\nG1 X30 E17.05 ; lift F1000 ; deposit extrusion line\nG1 X20 Z0.05 F1000 ; wipe off tail\nG1 Z10 Y223 ; lift to avoid clips and move back to safe bounds\nM400 ; wait for moves to finish before proceeding so that T1 doesn't get caught in a deadzone when switching back to Soft endstops on \n;\n;\nM211 S0 ; turn off soft endstops \nG92 E0; zero extruder +# thumbnails = 16x16,300x350 + +[printer:MakerGear M3 Independent Dual Rev.0 0.25 Nozzle (Duplication Mode)] +inherits = MakerGear M3 Independent Dual Rev.0 (Duplication Mode) +default_print_profile = 0.15mm Normal @0.25 nozzle MakerGear +max_layer_height = 0.15 +min_layer_height = 0.05 +nozzle_diameter = 0.25 +printer_variant = 0.25 +retract_length = 1 +retract_lift = 0.15 +retract_speed = 50 + +[printer:MakerGear M3 Independent Dual Rev.0 0.50 Nozzle (Duplication Mode)] +inherits = MakerGear M3 Independent Dual Rev.0 (Duplication Mode) +default_print_profile = 0.20mm Quality @0.50 nozzle MakerGear +max_layer_height = 0.35 +min_layer_height = 0.1 +nozzle_diameter = 0.50 +printer_variant = 0.50 + +[printer:MakerGear M3 Independent Dual Rev.0 0.75 Nozzle (Duplication Mode)] +inherits = MakerGear M3 Independent Dual Rev.0 (Duplication Mode) +default_print_profile = 0.25mm Quality @0.75 nozzle MakerGear +max_layer_height = 0.5 +min_layer_height = 0.15 +nozzle_diameter = 0.75 +printer_variant = 0.75 +retract_length = 1 +retract_speed = 35 + +# ------------------------------ +# MakerGear M3 Independent Dual Rev.1 +# ------------------------------ +[printer:MakerGear M3 Independent Dual Rev.1] +inherits = *default* +bed_shape = 0x0,200x0,200x251,0x251 +default_filament_profile = "MakerGear PLA @MakerGear" +default_print_profile = 0.20mm Normal @0.35 nozzle MakerGear +end_gcode = M104 S0 ; turn off extruder\nM104 S0 T0 ; turn off extruder\nM104 S0 T1; turn off extruder\nM140 S0 ; turn off bed\nM106 S0 ; turn off cooling fan\nG91 ; relative mode\nG1 Z20 ; move Z down 20mm if possible Max endstop will catch it if it is to far\nG90; absolute mode\nG28 X ; home tool/s\nT0 ; defualt tool should always be T0\nG1 Y230 F10000 ; move build plate out\nM84 ; disable motors +extruders_count = 2 +extruder_offset = 0x0,0x0 +host_type = octoprint +machine_max_acceleration_e = 2000, 2000 +machine_max_acceleration_extruding = 1000, 1000 +machine_max_acceleration_retracting = 2000, 2000 +machine_max_acceleration_x = 1200, 1200 +machine_max_acceleration_y = 1200, 1200 +machine_max_acceleration_z = 10, 10 +machine_max_feedrate_e = 30, 30 +machine_max_feedrate_x = 300, 300 +machine_max_feedrate_y = 300, 300 +machine_max_feedrate_z = 10, 10 +machine_max_jerk_e = 10, 10 +machine_max_jerk_x = 5, 5 +machine_max_jerk_y = 5, 5 +machine_max_jerk_z = 1, 1 +max_layer_height = 0.28,0.28 +max_print_height = 200 +nozzle_diameter = 0.35,0.35 +printer_model = MAKERGEAR_M3_ID_1 +printer_notes = Dont remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_MAKERGEAR\nPRINTER_MODEL_MAKERGEAR_M3_ID_1\n +printer_variant = 0.35 +retract_length_toolchange = 4,4 +start_gcode = ;M3 Independent Dual Startup Script\n\n; Turn off hotends to reduce ooze on the bed during startup\n; NOTE: this does not explicitly wait for the hotends to completely cool down\nM104 T0 S0\nM104 T1 S0\n\n{if first_layer_bed_temperature[1] < first_layer_bed_temperature[0]}\nM140 S{first_layer_bed_temperature[0]} ; Set bed temperature\nM190 S{first_layer_bed_temperature[0]} ; Wait for bed to reach temperature\n{endif}\n\n{if first_layer_bed_temperature[0] < first_layer_bed_temperature[1]}\nM140 S{first_layer_bed_temperature[1]} ; Set bed temperature\nM190 S{first_layer_bed_temperature[1]} ; Wait for bed to reach temperature\n{endif}\n\nM605 S0 ; Set to full independent control on x axes\nT0 ; Switch to left hotend\nG28 ; Home all axes probe/mesh if available\n\n; Set hotend temperature\nM104 T0 S{first_layer_temperature[0]}\nM104 T1 S{first_layer_temperature[1]}\n\n; Wait for hotends to reach temperature\nM109 T0 S{first_layer_temperature[0]}\nM109 T1 S{first_layer_temperature[1]}\n\n; Purge Scripts\n{if temperature[1] == 0}\n\n; Single Mode - Left Purge\nM211 S0 ; Turn off software endstops\nG1 X205 Y210 Z0.1 F10000 ; Move off the bed and bring the bed up\nG92 E0 ; Zero extruder\nG1 X195 Z0.1 F1000 ; Scrape off any ooze\nG1 Z10 ; Lift bed\nG1 X160 Y240 F10000 ; move to unused front edge\nG1 Z0.30 F1000\nG1 X40 E20 F1000\nG1 X30 Z0.05 F1000 ; wipe off tail\nG1 Z10\nG92 E0{endif}\n\n{if temperature[0] == 0}\n; Single Mode - Right Purge\nM211 S0 ; Turn off software endstops for purge moves\nG1 X25 F9000 ; Move T0 past bedclips as to not damage probe\nT1 ; Switch to right hotend\nG1 X205 Y210 Z0.1 F10000 ; Move off the bed and bring the bed up\nG92 E0 ; Zero extruder\nG1 X195 Z0.1 F1000 ; Scrape off any ooze\nG1 Z10 ; Lift\nG1 X100 Y240 F10000 ; Move to unused front edge\nG1 Z0.30 F1000\nG1 X180 E9.25 F1000 ; Deposit extrusion line\nG1 Y239 E9.45 F1000 ; Move Y-axis and extrude\nG1 X130 E17.05; lift \nF1000 ; deposit extrusion line\nG1 X120 Z0.05 F1000 ; wipe off tail\nG92 E0; zero extruder\nG1 Z10 Y230 ; move back to safe bounds\nT0\nG1 X-20.77 ; move T0 back home\nT1{endif}\n\n{if temperature[0] > 0 and temperature[1] > 0}\n; M3-ID T0/T1 Starting Script\nG1 X25 F9000; move T0 past bedclips as to not damage probe\n\nT1 ; Switch to right extruder\nG1 X215 Y210 Z0.1 F10000 ; move off the bed and bring the bed up\nG92 E0 ; zero extruder\nG1 X195 Z0.1 F1000; scrape off any ooze\nG1 Z10 ; lift\nM211 S0 ; turn off soft endstops for purge moves\nG1 X100 Y240 F10000; move to unused back edge\nG1 Z0.30 F1000\nG1 X180 E9.25 F1000; deposit extrusion line\nG1 Y239 E9.45 F1000 ; move and extrude y\nG1 X130 E17.05; lift F1000; deposit extrusion line\nG1 X100 Z0.05 F1000 ; wipe off tail\nG92 E0; zero extruder\nG1 Z10 Y225 ; move back to safe bounds\nG1 X252 F4800; move T1 home\n\nT0;\nG1 X205 Y210 Z0.1 F10000 ; move off the bed and bring the bed up\nG92 E0 ; zero extruder\nG1 X195 Z0.1 F1000; scrape off any ooze\nG1 Z10 ; lift\nG1 X100 Y240 F10000; move to unused back edge\nG1 Z0.30 F1000\nG1 X20 E9.25 F1000; deposit extrusion line\nG1 Y239 E9.45 F1000 ; move and extrude y\nG1 X70 E17.05; lift F1000; deposit extrusion line\nG1 X100 Z0.05 F1000 ; wipe off tail\nG92 E0; zero extruder\nG1 Z10 Y225 ; move back to safe bounds\nG1 X-20.77 F4800 ; move T0 home\nG92 E0{endif}\n; ok now you can start +toolchange_gcode = {if next_extruder == 0}\nT1 ; makes sure T1 is active\nG90 ; switch into absolute mode\nG1 X252\nT0\n{endif}\n\n{if next_extruder == 1}\nT0 ; makes sure T0 is active\nG90 ; switch into absolute mode\nG1 X-20.77\nT1\n{endif}\n +# thumbnails = 16x16,220x124 + +[printer:MakerGear M3 Independent Dual Rev.1 0.25 Nozzle] +inherits = MakerGear M3 Independent Dual Rev.1 +default_print_profile = 0.15mm Normal @0.25 nozzle MakerGear +max_layer_height = 0.15,0.15 +min_layer_height = 0.05,0.05 +nozzle_diameter = 0.25,0.25 +printer_variant = 0.25 +retract_length = 1 +retract_lift = 0.15 +retract_speed = 50 + +[printer:MakerGear M3 Independent Dual Rev.1 0.50 Nozzle] +inherits = MakerGear M3 Independent Dual Rev.1 +default_print_profile = 0.20mm Quality @0.50 nozzle MakerGear +max_layer_height = 0.35,0.35 +min_layer_height = 0.1,0.1 +nozzle_diameter = 0.50,0.50 +printer_variant = 0.50 + +[printer:MakerGear M3 Independent Dual Rev.1 0.75 Nozzle] +inherits = MakerGear M3 Independent Dual Rev.1 +default_print_profile = 0.25mm Quality @0.75 nozzle MakerGear +max_layer_height = 0.5,0.5 +min_layer_height = 0.15,0.15 +nozzle_diameter = 0.75,0.75 +printer_variant = 0.75 +retract_length = 1, 1 +retract_speed = 35, 35 + +# ----------------------------------- +# MakerGear M3-ID (Duplication Mode) +# ----------------------------------- +[printer:MakerGear M3 Independent Dual Rev.1 (Duplication Mode)] +inherits = MakerGear M3 Independent Dual Rev.1 +bed_shape = 0x0,100x0,100x251,0x251 +end_gcode = M605 S0 ; set to full independent control\nM104 S0 ; turn off extruder\nM104 S0 T0 ; turn off extruder\nM104 S0 T1 ; turn off extruder\nM140 S0 ; turn off bed\nM106 S0 ; turn off cooling fan\nG91 ; relative mode\nG1 Z20 ; move Z down 20mm if possible Max endstop will catch it if it is to far\nG90 ; absolute mode\nG28 X ; home tools\nT0 ; default tool should always be T0\nG1 Y230 F10000 ; move build plate out\nM84 ; disable motors +extruders_count = 1 +nozzle_diameter = 0.35 +printer_model = MAKERGEAR_M3_ID_1_DUPLICATION +printer_notes = Dont remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_MAKERGEAR\nPRINTER_MODEL_MAKERGEAR_M3_ID_1_DUPLICATION\n +printer_variant = 0.35 +start_gcode = ;M3 ID Duplication Mode startup script\nM211 S1 ; turn on soft endstops to protect the machine\nM605 S0 ; set to full independent control on x axes\nG28 XYZ ; home without mesh level compensation\n\n; Set hotend temperature\nM104 T0 S{first_layer_temperature[0]}\nM104 T1 S{first_layer_temperature[0]}\n\n; Wait for hotend's to reach temperature\nM109 T0 S{first_layer_temperature[0]}\nM109 T1 S{first_layer_temperature[0]}\n\nT0 ; Make sure we're on T0\nM605 S2 R0 X100 ; set X to duplication mode 0 temperature difference 100 X difference\nG28 X ; home x axes to engange mode\nM211 S0 ; turn off soft endstops to let us move to back of the bed\nG1 X20 F1000 ; move to start x position\nG1 Y243 Z0.1 F10000 ; move off the bed and bring the bed up\nG92 E0 ; zero extruder\nG1 Y240 Z0.1 F1000 ; scrape off any ooze\nG1 Z0.30 F1000 ; lift\nG1 X80 E9.25 ; lift F1000 ; deposit extrusion line\nG1 Y239 E9.45 F1000 ; move and extrude y\nG1 X30 E17.05 ; lift F1000 ; deposit extrusion line\nG1 X20 Z0.05 F1000 ; wipe off tail\nG1 Z10 Y223 ; lift to avoid clips and move back to safe bounds\nM400 ; wait for moves to finish before proceeding so that T1 doesn't get caught in a deadzone when switching back to Soft endstops on \n;\n;\nM211 S0 ; turn off soft endstops \nG92 E0; zero extruder +# thumbnails = 16x16,300x350 + +[printer:MakerGear M3 Independent Dual Rev.1 0.25 Nozzle (Duplication Mode)] +inherits = MakerGear M3 Independent Dual Rev.1 (Duplication Mode) +default_print_profile = 0.15mm Normal @0.25 nozzle MakerGear +max_layer_height = 0.15 +min_layer_height = 0.05 +nozzle_diameter = 0.25 +printer_variant = 0.25 +retract_length = 1 +retract_lift = 0.15 +retract_speed = 50 + +[printer:MakerGear M3 Independent Dual Rev.1 0.50 Nozzle (Duplication Mode)] +inherits = MakerGear M3 Independent Dual Rev.1 (Duplication Mode) +default_print_profile = 0.20mm Quality @0.50 nozzle MakerGear +max_layer_height = 0.35 +min_layer_height = 0.1 +nozzle_diameter = 0.50 +printer_variant = 0.50 + +[printer:MakerGear M3 Independent Dual Rev.1 0.75 Nozzle (Duplication Mode)] +inherits = MakerGear M3 Independent Dual Rev.1 (Duplication Mode) +default_print_profile = 0.25mm Quality @0.75 nozzle MakerGear +max_layer_height = 0.5 +min_layer_height = 0.15 +nozzle_diameter = 0.75 +printer_variant = 0.75 +retract_length = 1 +retract_speed = 35 + +# ----------------------------------- +# MakerGear Ultra One +# ----------------------------------- +[printer:MakerGear Ultra One] +inherits = *default* +bed_shape = 0x0,406x0,406x355,0x355 +default_filament_profile = "MakerGear PLA @MakerGear" +default_print_profile = 0.20mm Quality @0.50 nozzle MakerGear +end_gcode = M106 P2 S0 ; turn off exhaust fan\n \nM104 S0 ; turn off extruder\nM104 S0 T0 ; turn off extruder\nM104 S0 T1; turn off extruder\nM140 P0 S0 ; turn off bed\nM140 P1 S0 ; turn off bed\nM140 P2 S0 ; turn off bed\nM140 P3 S0 ; turn off bed\nM106 S0 ; turn off cooling fan\nG91 ; relative mode\nG1 Z20 ; move Z down 20mm\nG90; absolute mode\n\nG28 XY ; home tool/s\nM502 ; set to firmware default values\nT0 ; defualt tool should always be T0 +extruders_count = 2 +extruder_offset = 0x0,0x0 +gcode_flavor = reprapfirmware +host_type = octoprint +machine_max_acceleration_e = 2000, 2000 +machine_max_acceleration_extruding = 1000, 1000 +machine_max_acceleration_retracting = 1500, 1500 +machine_max_acceleration_x = 1000, 1000 +machine_max_acceleration_y = 1000, 1000 +machine_max_acceleration_z = 10, 10 +machine_max_feedrate_e = 30, 30 +machine_max_feedrate_x = 300, 300 +machine_max_feedrate_y = 300, 300 +machine_max_feedrate_z = 20, 20 +machine_max_jerk_e = 10, 10 +machine_max_jerk_x = 5, 5 +machine_max_jerk_y = 5, 5 +machine_max_jerk_z = 1, 1 +max_layer_height = 0.35,0.35 +max_print_height = 350 +nozzle_diameter = 0.50,0.50 +printer_model = MAKERGEAR_U1 +printer_notes = Dont remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_MAKERGEAR\nPRINTER_MODEL_MAKERGEAR_U1\n +printer_variant = 0.50 +retract_length_toolchange = 4,4 +start_gcode = ;U1 Startup Script\n\nM203 X18000.00 Y18000.00 Z1200.00 U18000.00 E1800.00 ; U1 max feedrate mm/minute\n M201 X1200 Y1200 Z10 U1200 E2000 ; U1 Maximum Acceleration axes mm/s^2\n M204 P2000 T2000 ; U1 Maximum Acceleration printing / travel mm/s^2\n M566 X300 Y300 Z60 U300 E600 ; U1 instantenous speed change 'jerk' in mm/minute\n M593 F0 ; make sure dynamix acceleration is off \n\n; Turn off hotends to reduce ooze on the bed during startup\nM104 T0 S0\nM104 T1 S0\n; Note: this will not explicitly wait for the hotends to cool down\n\nM221 D0 S100 ; Extruder rate for T0 is set in the profile so set to 100%\nM221 D1 S100 ; Extruder rate for T1 is set in the profile so set to 100%\n\n{if first_layer_bed_temperature[1] < first_layer_bed_temperature[0]}\nM140 P0 S{first_layer_bed_temperature[0]} ; Middle bed heater strip\nM140 P1 S{first_layer_bed_temperature[0]} ; 2nd from left and second from right bed heater\nM140 P2 S{first_layer_bed_temperature[0]} ; Left bed heater strip\nM140 P3 S{first_layer_bed_temperature[0]} ; Right bed heater strip\n{endif}\n\n{if first_layer_bed_temperature[0] < first_layer_bed_temperature[1]}\nM140 P0 S{first_layer_bed_temperature[1]} ; Middle bed heater strip\nM140 P1 S{first_layer_bed_temperature[1]} ; 2nd from left and second from right bed heater\nM140 P2 S{first_layer_bed_temperature[1]} ; Left bed heater strip\nM140 P3 S{first_layer_bed_temperature[1]} ; Right bed heater strip\n{endif}\n\nM116 ; Wait for all bed heating pads to reach operation temperature before homing (this will wait for cooldown if there is overshoot)\nG28 ; 1)Home XY, 2)Home Z, 3)Auto Level, 4)Home Z, 5) Mesh Level\n\n; Set hotend temperature\nM104 T0 S{first_layer_temperature[0]}\nM104 T1 S{first_layer_temperature[1]}\n\n; Wait for hotends to reach temperature\nM109 T0 S{first_layer_temperature[0]}\nM109 T1 S{first_layer_temperature[1]}\n\nM116 ; Wait for all hotends to reach operation temperature (this will wait for cooldown if there is overshoot)\n\n; Purge Scripts\n{if temperature[1] == 0}\n; U1 Single Mode - Left Purge\nT0 ; implied by G28 but explicilty called here\nG1 Z20.0 F6000 ; Move Z to 20\nG92 E0 ; Zero Extruder\nM564 S0 ; Safteys off\nG1 X160 Y5 F1000 ; Move to unused front edge\nG1 Z0.30 F1000 ; Move closer to the bed\nG1 X40 E20 F1000 ; Deposit purge line\nG1 X30 Z0.05 F1000 ; Wipe off tail\nG1 Z10 ; Move away from bed\nG1 Y11 ; Move to Y-axis safe zone\nG92 E0 ; Zero extruder\nM564 S0 ; Safteys off\nM106 P2 S50 ; Enable exhaust fan\n{endif}\n\n{if temperature[0] == 0}\n; U1 Single Mode - Right Purge\nT1 ; Switch to T1\nG1 Z20.0 F6000 ; Move Z to 20\nG92 E0 ; Zero Extruder\nM564 S0 ; Safteys off\nG1 X160 Y5 F1000 ; Move to unused front edge\nG1 Z0.30 F1000 ; Move closer to the bed\nG1 X40 E20 F1000 ; Deposit purge line\nG1 X30 Z0.05 F1000 ; Wipe off tail\nG1 Z10 ; Move away from bed\nG1 Y11 ; Move to y safe zone\nG92 E0 ; Zero extruder\nM564 S0 ; Safteys off\nM106 P2 S50 ; Enable exhaust fan\n{endif}\n\n{if temperature[0] > 0 && temperature[1] > 0}\n; U1 T0/T1 Startup Script\nT1 ; Switch to T1\nG1 Z20.0 F6000 ; Move Z to 20\nG92 E0 ; Zero Extruder\nM564 S0 ; Safteys off\nG1 X160 Y5 F1000 ; Move to unused front edge\nG1 Z0.30 F1000 ; Move closer to the bed\nG1 X40 E20 F1000 ; Deposit purge line\nG1 X30 Z0.05 F1000 ; Wipe off tail\nG1 Z10 ; Move away from bed\nG1 Y11 ; Move to y safe zone\nG92 E0 ; Zero extruder\n\nT0 ; Switch to T0\nG1 X360 Y5 F1000 ; Move to unused front edge\nG1 Z0.30 F1000 ; Move closer to the bed\nG1 X240 E20 F1000 ; Deposit purge line\nG1 X230 Z0.05 F1000 ; Wipe off tail\nG1 Z10 ; Move away from bed\nG1 Y11 ; Move to y safe zone\nG92 E0 ; Zero extruder\nM564 S1 ; Safteys on\nM106 P2 S50 ; Enable exhaust fan\n{endif} +toolchange_gcode = +# thumbnails = 16x16,220x124 + +[printer:MakerGear Ultra One 0.25 Nozzle] +inherits = MakerGear Ultra One +default_print_profile = 0.15mm Normal @0.25 nozzle MakerGear +max_layer_height = 0.15,0.15 +min_layer_height = 0.05,0.05 +nozzle_diameter = 0.25,0.25 +printer_variant = 0.25 +retract_length = 1 +retract_lift = 0.15 +retract_speed = 50 + +[printer:MakerGear Ultra One 0.35 Nozzle] +inherits = MakerGear Ultra One +default_print_profile = 0.20mm Normal @0.35 nozzle MakerGear +max_layer_height = 0.30,0.30 +min_layer_height = 0.1,0.1 +nozzle_diameter = 0.35,0.35 +printer_variant = 0.35 + +[printer:MakerGear Ultra One 0.75 Nozzle] +inherits = MakerGear Ultra One +default_print_profile = 0.25mm Quality @0.75 nozzle MakerGear +max_layer_height = 0.5,0.5 +min_layer_height = 0.15,0.15 +nozzle_diameter = 0.75,0.75 +printer_variant = 0.75 +retract_length = 1, 1 +retract_speed = 35, 35 + +# ----------------------------------- +# MakerGear Ultra One (Duplication Mode) +# ----------------------------------- + +[printer:MakerGear Ultra One (Duplication Mode)] +inherits = MakerGear Ultra One +bed_shape = 0x0,203x0,203x355,0x355 +end_gcode = M106 P2 S0 ; turn off exhaust fan\n\nM104 S0 ; turn off extruder\nM104 S0 T0 ; turn off extruder\nM104 S0 T1; turn off extruder\nM104 S0 T2; turn off extruder\nM140 P0 S0 ; turn off bed\nM140 P1 S0 ; turn off bed\nM140 P2 S0 ; turn off bed\nM140 P3 S0 ; turn off bed\nM106 S0 ; turn off cooling fan\nG91 ; relative mode\nG1 Z20 ; move Z down 20mm\nG90; absolute mode\n\nG28 XY ; home tool/s\nM502 ; set to firmware default values\nT0 ; defualt tool should always be T0 +extruders_count = 1 +nozzle_diameter = 0.50 +printer_model = MAKERGEAR_U1_DUPLICATION +printer_notes = Dont remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_MAKERGEAR\nPRINTER_MODEL_MAKERGEAR_U1_DUPLICATION\n +printer_variant = 0.50 +start_gcode = ;U1 Rev0 Duplication Script - T0 and T1\n\nM203 X18000.00 Y18000.00 Z1200.00 U18000.00 E1800.00 ; U1 max feedrate mm/minute\n M201 X1000 Y1000 Z10 U1000 E2000 ; U1 Maximum Acceleration axes mm/s^2\n M204 P2000 T2000 ; U1 Maximum Acceleration printing / travel mm/s^2\n M566 X300 Y300 Z60 U300 E600 ; U1 instantenous speed change 'jerk' in mm/minute\n M593 F0 ;make sure dynamix acceleration is off \n\n\n; turn off T0 hot end to reduce ooze on the bed during startup. NOTE: this does not explicitly wait for the hotends to totally cool down\nM104 T0 S0\nM104 T1 S0\nM104 T2 S0\n\n\nM221 D0 S100 ;extruder rate for T0 is set in S3D so set to 100% here\nM221 D1 S100 ;extruder rate for T1 is set in S3D so set to 100% here\n\n\nM140 P0 S[first_layer_bed_temperature] ;Middle bed heater strip\nM140 P1 S[first_layer_bed_temperature] ;2nd from left and second from right bed heater\nM140 P2 S[first_layer_bed_temperature] ;Left bed heater strip\nM140 P3 S[first_layer_bed_temperature] ;Right bed heater strip\n\nM116 ; wait for all bed heaters to get to temp before probing. This will wait for cooldown if there is overshoot. \n\nG29 S2 ; Clear any meshes \nG28 XY; home XY\nG28 Z ;Home Z\nG32 ;Auto Level \nG28 Z ; rehome Z\n\n;Get hot ends up to temp\nM104 T0 S{first_layer_temperature[0]}\nM104 T1 S{first_layer_temperature[0]}\nM104 T2 S{first_layer_temperature[0]}\nM116 ; wait for all bed heaters to get to temp before probing. This will wait for cooldown if there is overshoot. \n\n\n;***Initial Purge***\nT2\nG1 Z20.0 F6000 ; Move Z to 20\n\nG92 E0 ; Zero Extruder\n\nM564 S0 ; safteys off\nG1 X160 Y5F10000; move to unused front edge\nG1 Z0.30 F1000\nG1 X40 E20 F1000\nG1 X30 Z0.05 F1000 ; wipe off tail\nG1 Z10\nG1 Y11 ;safe zone\nG92 E0\n\nM564 S0 ; safteys off\n\n\nM106 P2 S100; exhaust fan change S value to enable (50 is a good starting value)\n\n; end startup script +# thumbnails = 16x16,300x350 + +[printer:MakerGear Ultra One 0.25 Nozzle (Duplication Mode)] +inherits = MakerGear Ultra One (Duplication Mode) +default_print_profile = 0.15mm Normal @0.25 nozzle MakerGear +max_layer_height = 0.15 +min_layer_height = 0.05 +nozzle_diameter = 0.25 +printer_variant = 0.25 +retract_length = 1 +retract_lift = 0.15 +retract_speed = 50 + +[printer:MakerGear Ultra One 0.35 Nozzle (Duplication Mode)] +inherits = MakerGear Ultra One (Duplication Mode) +default_print_profile = 0.20mm Normal @0.35 nozzle MakerGear +max_layer_height = 0.35 +min_layer_height = 0.1 +nozzle_diameter = 0.35 +printer_variant = 0.35 + +[printer:MakerGear Ultra One 0.75 Nozzle (Duplication Mode)] +inherits = MakerGear Ultra One (Duplication Mode) +default_print_profile = 0.25mm Quality @0.75 nozzle MakerGear +max_layer_height = 0.5 +min_layer_height = 0.15 +nozzle_diameter = 0.75 +printer_variant = 0.75 +retract_length = 1 +retract_speed = 35 \ No newline at end of file diff --git a/resources/profiles/MakerGear/M2_M3.stl b/resources/profiles/MakerGear/M2_M3.stl new file mode 100644 index 0000000000000000000000000000000000000000..77f2f3197f8382d80792448e23bd00bab3b8bd0d GIT binary patch literal 171484 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 J@nL>O{Xc#8GEo2k literal 0 HcmV?d00001 diff --git a/resources/profiles/MakerGear/M2_M3.svg b/resources/profiles/MakerGear/M2_M3.svg new file mode 100644 index 00000000000..0fd213f8b4c --- /dev/null +++ b/resources/profiles/MakerGear/M2_M3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/profiles/MakerGear/MAKERGEAR_M2_DUAL_thumbnail.png b/resources/profiles/MakerGear/MAKERGEAR_M2_DUAL_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..3cf2e6d362616156d085e491c1b5f7bcfea4140a GIT binary patch literal 41714 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

    $G$ksp>* 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 literal 0 HcmV?d00001 diff --git a/resources/profiles/MakerGear/MAKERGEAR_U1_thumbnail.png b/resources/profiles/MakerGear/MAKERGEAR_U1_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..7052ac44bf11b4ef7a044206cab7be575aae28fc GIT binary patch literal 47224 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 aFZB6{Z_5f;)PxY=kG!;s)NcuskpBY{B)+l$ literal 0 HcmV?d00001 diff --git a/resources/profiles/Print4Taste.idx b/resources/profiles/Print4Taste.idx new file mode 100644 index 00000000000..b19d0f3e1a1 --- /dev/null +++ b/resources/profiles/Print4Taste.idx @@ -0,0 +1,2 @@ +min_slic3r_version = 2.6.0-alpha1 +0.0.1 Initial version \ No newline at end of file diff --git a/resources/profiles/Print4Taste.ini b/resources/profiles/Print4Taste.ini new file mode 100644 index 00000000000..05f76e1c33a --- /dev/null +++ b/resources/profiles/Print4Taste.ini @@ -0,0 +1,131 @@ +# Print profiles for Print4Taste printers (mycusini and procusini brands) +# Created from scratch from default FFF + +[vendor] +# Vendor name will be shown by the Config Wizard. +name = Print4Taste +# Configuration version of this file. Config file will only be installed, if the config_version differs. +# This means, the server may force the PrusaSlicer configuration to be downgraded. +config_version = 0.0.1 +# Where to get the updates from? +config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Print4Taste/ + +# The printer models will be shown by the Configuration Wizard in this order, +# also the first model installed & the first nozzle installed will be activated after install. +# Printer model name will be shown by the installation wizard. + + +[printer_model:MC2.0] +name = mycusini 2.0 +variants = 1.0 +technology = FFF +family = mycusini +bed_model = MC2.0_bed.stl +bed_texture = MC2.0_texture.svg +default_materials = mycusini 3D Choco @MC2.0 + +[print:*common_MC2.0*] +bottom_solid_layers = 2 +bridge_speed = 30 +brim_type = no_brim +compatible_printers_condition = printer_notes=~/.*PRINT4TASTE.*/ and printer_notes=~/.*MYCUSINI2.0.*/ +elefant_foot_compensation = 0.1 +ensure_vertical_shell_thickness = 1 +external_perimeter_extrusion_width = 1.15 +external_perimeter_speed = 100% +extra_perimeters = 0 +extruder_clearance_height = 45 +extruder_clearance_radius = 40 +extrusion_width = 1.15 +fill_density = 20% +fill_pattern = grid +first_layer_extrusion_width = 1.15 +first_layer_height = 0.5 +first_layer_speed = 100% +gap_fill_speed = 30 +infill_anchor = 250% +infill_extrusion_width = 1 +infill_overlap = 5% +infill_speed = 30 +layer_height = 0.5 +max_print_speed = 80 +max_volumetric_extrusion_rate_slope_negative = 2 +max_volumetric_extrusion_rate_slope_positive = 2 +max_volumetric_speed = 8 +notes = Extruder clearances:\nHeight: 45 Radius: 40\nHeight: 8 Radius: 12\n\nDon't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRINT4TASTE\nPRINTER_MODEL_MYCUSINI2.0 +output_filename_format = [input_filename_base].gco +perimeter_extrusion_width = 1.15 +perimeter_speed = 30 +perimeters = 1 +slice_closing_radius = 0.49 +small_perimeter_speed = 100% +solid_infill_below_area = 10 +solid_infill_extrusion_width = 1.15 +solid_infill_speed = 100% +thin_walls = 0 +top_infill_extrusion_width = 1.15 +top_solid_infill_speed = 100% +top_solid_layers = 3 +travel_speed = 80 +skirts = 0 + +[print:0.50mm SOLID @MC2.0] +inherits = *common_MC2.0* + +[print:0.50mm FILLABLE @MC2.0] +inherits = 0.50mm SOLID @MC2.0 +top_solid_layers = 0 +fill_density = 0% +spiral_vase = 1 + +[print:0.50mm OUTLINES @MC2.0] +inherits = 0.50mm FILLABLE @MC2.0 +bottom_solid_layers = 0 + +[filament:mycusini 3D Choco @MC2.0] +filament_vendor = Print4Taste +bed_temperature = 0 +bridge_fan_speed = 0 +compatible_printers_condition = printer_notes=~/.*PRINT4TASTE.*/ and printer_notes=~/.*MYCUSINI2.0.*/ +cooling = 1 +disable_fan_first_layers = 0 +end_filament_gcode = "" +extrusion_multiplier = 0.95 +fan_always_on = 0 +fan_below_layer_time = 60 +filament_colour = #F4A6FF +filament_density = 1.26 +filament_diameter = 18 +filament_max_volumetric_speed = 8 +filament_notes = "Full cartridge: 18 x 100 mm, 32g\nDensity: 1.26 g/cm3\nCut cartrige size: 18 x ~50 mm, 16g\nMycusini 2.0 does not require temperature control in gcode\n\n\nDon't remove the following keywords! These keywords are used in the \"compatible printer\" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRINT4TASTE\nPRINTER_MODEL_MYCUSINI2.0" +ilament_retract_before_wipe = 30% +filament_retract_layer_change = 1 +filament_retract_length = 0.3 +filament_retract_lift = 1 +filament_type = GLAZE +filament_wipe = 1 +first_layer_bed_temperature = 0 +first_layer_temperature = 0 +max_fan_speed = 0 +min_fan_speed = 0 +min_print_speed = 9 +slowdown_below_layer_time = 15 +start_filament_gcode = "" +temperature = 0 + +[printer:mycusini 2.0] +printer_model = MC2.0 +printer_variant = 1.0 +bed_shape = 5x2.5,105x2.5,105x112.5,5x112.5 +color_change_gcode = +end_gcode = M83 ;Relative mode to retract\nG1 F2400 E-0.1 ;Retract\nM84 ;Back to absolute mode after retract\nG0 F2400 X90 Y55 Z45 ;Park +max_layer_height = 0.75 +max_print_height = 45 +min_layer_height = 0.3 +nozzle_diameter = 1 +pause_print_gcode = +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRINT4TASTE\nPRINTER_MODEL_MYCUSINI2.0 +retract_length = 0.1 +start_gcode = G1 F2400 E-0.3 ;Retract\nG0 F2400 X100 Y55 Z20.7 ;Full coordinates to prevent ramming down\nG0 F2400 X100 Y40 Z0.5 ;Start purge line\nG0 F570 X100 Y10 Z0.5 E0.025 ;Purge slightly more, should make a line only a few mm long +default_print_profile = 0.50mm SOLID @MC2.0 +default_filament_profile = mycusini 3D Choco @MC2.0 \ No newline at end of file diff --git a/resources/profiles/Print4Taste/MC2.0_bed.stl b/resources/profiles/Print4Taste/MC2.0_bed.stl new file mode 100644 index 0000000000000000000000000000000000000000..2db61908d88bde355a170c3a5bc9bc5cc46cf06d GIT binary patch literal 684 zcmb7>!41MN3`IQvLu7)eJ;4PbiiCQoS_yh&3l_*I-K0_%gKx)9QVItwC2^d*Z#%h< zUE|K<)z!7%`^wkV!Ci)KxE-fydbz)CM{Hr1MW%KkdSI}L-xNOLVSe`C30Bzob=>ue{Q2nA0&9my3Z&|)2 z`b8ffM9N`=(wX2|11PIkYFAzHnZTZi|HCX1a-wgAn{4@KSHzrel~sukmHfI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/profiles/Print4Taste/MC2.0_thumbnail.png b/resources/profiles/Print4Taste/MC2.0_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..886dd34547efe01a2a50a2cd9c787a1257b0e698 GIT binary patch literal 45346 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%0Av3sDG^ku3d^GD3$h%g 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 literal 0 HcmV?d00001 diff --git a/resources/profiles/PrusaResearch.idx b/resources/profiles/PrusaResearch.idx index 35a19f8cf08..a108d837fdc 100644 --- a/resources/profiles/PrusaResearch.idx +++ b/resources/profiles/PrusaResearch.idx @@ -1,4 +1,6 @@ min_slic3r_version = 2.6.0-alpha5 +1.9.0-alpha1 Added profiles for Original Prusa MK4. +1.9.0-alpha0 Updated output filename format. 1.7.0-alpha2 Updated compatibility condition in some filament profiles (Prusa XL). 1.7.0-alpha1 Added profiles for Original Prusa XL. Added filament profile for Prusament PETG Tungsten 75%. min_slic3r_version = 2.6.0-alpha1 @@ -6,13 +8,13 @@ min_slic3r_version = 2.6.0-alpha1 1.6.0-alpha2 Added profile for Prusament PETG Carbon Fiber and Fiberthree F3 PA-GF30 Pro. Updated acceleration settings for Prusa MINI. 1.6.0-alpha1 Updated FW version notification. Decreased min layer time for PLA. 1.6.0-alpha0 Default top fill set to monotonic lines. Updated infill/perimeter overlap values. Updated output filename format. Enabled dynamic overhang speeds. -min_slic3r_version = 2.5.2-rc0 -1.7.0 Added profiles for Original Prusa MK4. min_slic3r_version = 2.5.1-rc0 +1.6.3 Added SLA materials. 1.6.2 Updated compatibility condition in some filament profiles (Prusa XL). 1.6.1 Added filament profile for Prusament PETG Tungsten 75%. Updated Prusa XL profiles. 1.6.0 Added Original Prusa XL profiles. Updated acceleration settings for Prusa MINI. Updated infill/perimeter overlap values. min_slic3r_version = 2.5.0-alpha0 +1.5.9 Added SLA materials. 1.5.8 Added filament profile for Prusament PETG Tungsten 75%. Updated FW version notification. 1.5.7 Added filament profile for Prusament PETG Carbon Fiber and Fiberthree F3 PA-GF30 Pro. 1.5.6 Updated FW version notification (MK2.5/MK3 family). Added filament profile for Kimya PEBA-S. diff --git a/resources/profiles/PrusaResearch.ini b/resources/profiles/PrusaResearch.ini index f8f2fc2f537..0194657972d 100644 --- a/resources/profiles/PrusaResearch.ini +++ b/resources/profiles/PrusaResearch.ini @@ -5,7 +5,7 @@ name = Prusa Research # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 1.7.0 +config_version = 1.9.0-alpha1 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaResearch/ changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% @@ -261,7 +261,7 @@ bottom_solid_min_thickness = 0.5 gcode_label_objects = 1 infill_anchor = 2.5 infill_anchor_max = 12 -## enable_dynamic_overhang_speeds = 1 +enable_dynamic_overhang_speeds = 1 [print:*MK3*] fill_pattern = grid @@ -592,7 +592,7 @@ perimeter_speed = 30 perimeters = 3 support_material_speed = 30 top_solid_infill_speed = 20 -top_solid_layers = 15 +top_solid_layers = 14 thick_bridges = 1 [print:*0.07mm*] @@ -605,7 +605,7 @@ infill_speed = 40 solid_infill_speed = 40 support_material_speed = 40 top_solid_infill_speed = 30 -top_solid_layers = 11 +top_solid_layers = 10 [print:*0.10mm*] inherits = *common* @@ -615,7 +615,7 @@ bridge_speed = 20 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders==1 layer_height = 0.1 perimeter_acceleration = 600 -top_solid_layers = 9 +top_solid_layers = 8 support_material_contact_distance = 0.17 raft_contact_distance = 0.15 @@ -636,7 +636,7 @@ perimeter_acceleration = 800 perimeter_speed = 50 solid_infill_speed = 50 top_infill_extrusion_width = 0.4 -top_solid_layers = 8 +top_solid_layers = 6 bridge_flow_ratio = 1 bridge_speed = 25 @@ -656,7 +656,7 @@ perimeter_acceleration = 800 perimeter_speed = 50 solid_infill_speed = 50 top_infill_extrusion_width = 0.4 -top_solid_layers = 6 +top_solid_layers = 5 [print:*0.25mm*] inherits = *common* @@ -2478,7 +2478,7 @@ infill_acceleration = 3000 top_solid_layers = 5 bottom_solid_layers = 4 default_acceleration = 1250 -## dynamic_overhang_speeds = 35,20,15,15 +dynamic_overhang_speeds = 35,20,15,15 [print:0.32mm QUALITY @XL 0.6] inherits = *0.32mm*; *XL*; *0.6nozzleXL* @@ -2580,7 +2580,7 @@ solid_infill_acceleration = 2000 infill_acceleration = 3000 default_acceleration = 1500 bridge_flow_ratio = 0.95 -## dynamic_overhang_speeds = 30,20,15,15 +dynamic_overhang_speeds = 30,20,15,15 compatible_printers_condition = printer_model=="XL" and nozzle_diameter[0]==0.6 ## XL - 0.8mm nozzle @@ -3481,7 +3481,7 @@ solid_infill_acceleration = 1500 infill_acceleration = 2000 default_acceleration = 1500 bridge_flow_ratio = 0.95 -## dynamic_overhang_speeds = 30,20,15,15 +dynamic_overhang_speeds = 30,20,15,15 compatible_printers_condition = printer_model=="MK4" and nozzle_diameter[0]==0.6 ## MK4 - 0.8mm nozzle @@ -11241,6 +11241,22 @@ material_type = Tough material_vendor = Prusa Polymers material_colour = #EC0000 +[sla_material:Prusament Resin Model Solid Grey @0.025] +inherits = *common 0.025* +exposure_time = 4.5 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Prusa Polymers +material_colour = #9C9D9D + +[sla_material:Prusament Resin Model Alabaster White @0.025] +inherits = *common 0.025* +exposure_time = 4.5 +initial_exposure_time = 30 +material_type = Tough +material_vendor = Prusa Polymers +material_colour = #D6D7D8 + [sla_material:Prusament Resin BioBased60 Herbal Green @0.025] inherits = *common 0.025* exposure_time = 7 @@ -12254,6 +12270,22 @@ material_type = Tough material_vendor = Prusa Polymers material_colour = #EC0000 +[sla_material:Prusament Resin Model Solid Grey @0.05] +inherits = *common 0.05* +exposure_time = 5 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Prusa Polymers +material_colour = #9C9D9D + +[sla_material:Prusament Resin Model Alabaster White @0.05] +inherits = *common 0.05* +exposure_time = 5 +initial_exposure_time = 30 +material_type = Tough +material_vendor = Prusa Polymers +material_colour = #D6D7D8 + [sla_material:Prusament Resin BioBased60 Herbal Green @0.05] inherits = *common 0.05* exposure_time = 8 @@ -12706,6 +12738,22 @@ material_type = Tough material_vendor = Prusa Polymers material_colour = #3AD200 +[sla_material:Prusament Resin Model Solid Grey @0.1] +inherits = *common 0.1* +exposure_time = 13 +initial_exposure_time = 45 +material_type = Tough +material_vendor = Prusa Polymers +material_colour = #9C9D9D + +[sla_material:Prusament Resin Model Alabaster White @0.1] +inherits = *common 0.1* +exposure_time = 13 +initial_exposure_time = 45 +material_type = Tough +material_vendor = Prusa Polymers +material_colour = #D6D7D8 + [sla_material:Prusament Resin BioBased60 Magma Red @0.1] inherits = *common 0.1* exposure_time = 13 @@ -12962,6 +13010,22 @@ material_type = Tough material_vendor = Prusa Polymers material_colour = #EC0000 +[sla_material:Prusament Resin Model Solid Grey @0.025 SL1S] +inherits = *0.025_sl1s* +exposure_time = 2 +initial_exposure_time = 25 +material_type = Tough +material_vendor = Prusa Polymers +material_colour = #9C9D9D + +[sla_material:Prusament Resin Model Alabaster White @0.025 SL1S] +inherits = *0.025_sl1s* +exposure_time = 2 +initial_exposure_time = 20 +material_type = Tough +material_vendor = Prusa Polymers +material_colour = #D6D7D8 + [sla_material:Prusament Resin BioBased60 Herbal Green @0.025 SL1S] inherits = *0.025_sl1s* exposure_time = 3.5 @@ -13440,6 +13504,22 @@ material_type = Tough material_vendor = Prusa Polymers material_colour = #EC0000 +[sla_material:Prusament Resin Model Solid Grey @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2.2 +initial_exposure_time = 25 +material_type = Tough +material_vendor = Prusa Polymers +material_colour = #9C9D9D + +[sla_material:Prusament Resin Model Alabaster White @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2.2 +initial_exposure_time = 20 +material_type = Tough +material_vendor = Prusa Polymers +material_colour = #D6D7D8 + [sla_material:Prusament Resin BioBased60 Herbal Green @0.05 SL1S] inherits = *0.05_sl1s* exposure_time = 4 @@ -14122,6 +14202,30 @@ material_type = Tough material_vendor = 3DJake material_colour = #007EFD +[sla_material:LOCTITE 3D IND475 @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 4 +initial_exposure_time = 15 +material_type = Flexible +material_vendor = Henkel +material_colour = #FFFFFF + +[sla_material:LOCTITE 3D PRO476 @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 7 +initial_exposure_time = 25 +material_type = Tough +material_vendor = Henkel +material_colour = #595959 + +[sla_material:LOCTITE 3D 3843 HDT60 High Toughness @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 13 +initial_exposure_time = 25 +material_type = Tough +material_vendor = Henkel +material_colour = #595959 + ## 0.1 SL1S ## Prusa Polymers 0.1 @@ -14222,6 +14326,22 @@ material_type = Tough material_vendor = Prusa Polymers material_colour = #EC0000 +[sla_material:Prusament Resin Model Solid Grey @0.1 SL1S] +inherits = *0.1_sl1s* +exposure_time = 2.8 +initial_exposure_time = 25 +material_type = Tough +material_vendor = Prusa Polymers +material_colour = #9C9D9D + +[sla_material:Prusament Resin Model Alabaster White @0.1 SL1S] +inherits = *0.1_sl1s* +exposure_time = 2.8 +initial_exposure_time = 20 +material_type = Tough +material_vendor = Prusa Polymers +material_colour = #D6D7D8 + [sla_material:Prusament Resin BioBased60 Herbal Green @0.1 SL1S] inherits = *0.1_sl1s* exposure_time = 5 @@ -14582,6 +14702,30 @@ material_type = Tough material_vendor = 3DJake material_colour = #007EFD +[sla_material:LOCTITE 3D IND475 @0.1 SL1S] +inherits = *0.1_sl1s* +exposure_time = 6.5 +initial_exposure_time = 15 +material_type = Flexible +material_vendor = Henkel +material_colour = #FFFFFF + +[sla_material:LOCTITE 3D PRO476 @0.1 SL1S] +inherits = *0.1_sl1s* +exposure_time = 9 +initial_exposure_time = 25 +material_type = Tough +material_vendor = Henkel +material_colour = #595959 + +[sla_material:LOCTITE 3D 3843 HDT60 High Toughness @0.1 SL1S] +inherits = *0.1_sl1s* +exposure_time = 18 +initial_exposure_time = 25 +material_type = Tough +material_vendor = Henkel +material_colour = #595959 + [printer:*common*] printer_technology = FFF bed_shape = 0x0,250x0,250x210,0x210 @@ -15519,7 +15663,7 @@ retract_before_travel = 1.5 retract_before_wipe = 80% retract_layer_change = 1 retract_length = 0.8 -start_gcode = M17 ; enable steppers\nM862.3 P "[printer_model]" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM330 SYSLOG\nM331 loadcell_raw\nM331 loadcell_threshold\nM331 loadcell_hysteresis\nM331 loadcell_scale\nM331 probe_z\nM331 probe_z_raw\nM331 probe_z_diff\nM331 home_diff\nM331 fsensor_raw\nM331 temp_hbr\nM331 temp_bed\nM331 temp_noz\nM331 temp_brd\nM331 ttemp_bed\nM331 ttemp_noz\nM331 pos_z\nM331 fan_speed\nM331 fan_hbr_speed\nM331 tmc_sg_x\nM331 tmc_sg_y\nM331 tmc_sg_z\nM331 tmc_sg_e\n\nM555 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4)} W{((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) - ((min(print_bed_max[0], first_layer_print_min[0] + 32) - 32))} H{((first_layer_print_max[1])) - ((max(0, first_layer_print_min[1]) - 4))}\n\nG90 ; use absolute coordinates\nM92 E380 ; set steps/mm for extruder\nM83 ; extruder relative mode\n\nM140 S[first_layer_bed_temperature] ; set bed temp\n{if filament_type[initial_tool]=="PC" or filament_type[initial_tool]=="NYLON"}\nM104 S{first_layer_temperature[initial_tool]-25} ; set extruder temp for bed leveling\nM109 R{first_layer_temperature[initial_tool]-25} ; wait for temp\n{elsif filament_type[initial_tool]=="FLEX"}\nM104 S210 ; set extruder temp for bed leveling\nM109 R210 ; wait for temp\n{else}\nM104 S170 ; set extruder temp for bed leveling\nM109 R170 ; wait for temp\n{endif}\n\nM84 E ; turn off E motor\n\nG28 ; home all without mesh bed level\n\n; probe to clean the nozzle\nG1 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)+32} Y{((first_layer_print_min[1]) - 4)} Z{5} F4800\n\nM302 S160 ; lower cold extrusion limit to 160C\n\n{if filament_type[initial_tool]=="FLEX"}\nG1 E-4 F2400 ; retraction\n{else}\nG1 E-2 F2400 ; retraction\n{endif}\n\nM84 E ; turn off E motor\n\nG29 P9 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4)} W{32} H{4}\n\n{if first_layer_bed_temperature[initial_tool]<=60}M106 S100{endif}\n\nG0 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4)} Z{40} F10000\n\nM190 S[first_layer_bed_temperature] ; wait for bed temp\n\nM107\n\n;\n; MBL\n;\nM84 E ; turn off E motor\nG29 ; mesh bed leveling\nM104 S[first_layer_temperature] ; set extruder temp\nG0 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4) + 4 - 4.5} Z{30} F4800\n\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.2 F720\nG92 E0\n\nM569 S0 E ; set spreadcycle mode for extruder\n\n;\n; Extrude purge line\n;\n{if filament_type[initial_tool]=="FLEX"}\nG1 E4 F2400 ; deretraction\n{else}\nG1 E2 F2400 ; deretraction\n{endif}\n\n; move right\nG1 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) + 32} E{32 * 0.15} F1000\n; move down\nG1 Y{(max(0, first_layer_print_min[1]) - 4) + 4 - 4.5 - 1.5} E{1.5 * 0.15} F1000\n; move left\nG1 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} E{32 * 0.30} F800\n\nG92 E0\nM221 S100 ; set flow to 100% +start_gcode = M17 ; enable steppers\nM862.3 P "[printer_model]" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM555 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4)} W{((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) - ((min(print_bed_max[0], first_layer_print_min[0] + 32) - 32))} H{((first_layer_print_max[1])) - ((max(0, first_layer_print_min[1]) - 4))}\n\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\n\nM140 S[first_layer_bed_temperature] ; set bed temp\n{if filament_type[initial_tool]=="PC" or filament_type[initial_tool]=="NYLON"}\nM104 S{first_layer_temperature[initial_tool]-25} ; set extruder temp for bed leveling\nM109 R{first_layer_temperature[initial_tool]-25} ; wait for temp\n{elsif filament_type[initial_tool]=="FLEX"}\nM104 S210 ; set extruder temp for bed leveling\nM109 R210 ; wait for temp\n{else}\nM104 S170 ; set extruder temp for bed leveling\nM109 R170 ; wait for temp\n{endif}\n\nM84 E ; turn off E motor\n\nG28 ; home all without mesh bed level\n\n; probe to clean the nozzle\nG1 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)+32} Y{((first_layer_print_min[1]) - 4)} Z{5} F4800\n\nM302 S160 ; lower cold extrusion limit to 160C\n\n{if filament_type[initial_tool]=="FLEX"}\nG1 E-4 F2400 ; retraction\n{else}\nG1 E-2 F2400 ; retraction\n{endif}\n\nM84 E ; turn off E motor\n\nG29 P9 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4)} W{32} H{4}\n\n{if first_layer_bed_temperature[initial_tool]<=60}M106 S100{endif}\n\nG0 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4)} Z{40} F10000\n\nM190 S[first_layer_bed_temperature] ; wait for bed temp\n\nM107\n\n;\n; MBL\n;\nM84 E ; turn off E motor\nG29 ; mesh bed leveling\nM104 S[first_layer_temperature] ; set extruder temp\nG0 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4) + 4 - 4.5} Z{30} F4800\n\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.2 F720\nG92 E0\n\nM569 S0 E ; set spreadcycle mode for extruder\n\n;\n; Extrude purge line\n;\n{if filament_type[initial_tool]=="FLEX"}\nG1 E4 F2400 ; deretraction\n{else}\nG1 E2 F2400 ; deretraction\n{endif}\n\n; move right\nG1 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) + 32} E{32 * 0.15} F1000\n; move down\nG1 Y{(max(0, first_layer_print_min[1]) - 4) + 4 - 4.5 - 1.5} E{1.5 * 0.15} F1000\n; move left\nG1 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} E{32 * 0.30} F800\n\nG92 E0\nM221 S100 ; set flow to 100% default_print_profile = 0.20mm QUALITY @MK4 0.4 default_filament_profile = "Prusament PLA @PG" thumbnails = 16x16,313x173,440x240 diff --git a/resources/profiles/PrusaResearch/mk4.svg b/resources/profiles/PrusaResearch/mk4.svg index bd22778cc51..70a3b5ecaf3 100644 --- a/resources/profiles/PrusaResearch/mk4.svg +++ b/resources/profiles/PrusaResearch/mk4.svg @@ -1,101 +1,101 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/profiles/PrusaResearch/xl.svg b/resources/profiles/PrusaResearch/xl.svg index fadd4b6b129..759d7d2fbf3 100644 --- a/resources/profiles/PrusaResearch/xl.svg +++ b/resources/profiles/PrusaResearch/xl.svg @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/profiles/RatRig.idx b/resources/profiles/RatRig.idx index a86724f1df3..b8811aa5e82 100644 --- a/resources/profiles/RatRig.idx +++ b/resources/profiles/RatRig.idx @@ -1,2 +1,4 @@ min_slic3r_version = 2.4.1-alpha0 +1.0.2 Updated start g-code. +1.0.1 Various fixes and improvements. Commented filament sensor initialisation for v-Minion (optional HW). 1.0.0 Initial RatRig bundle \ No newline at end of file diff --git a/resources/profiles/RatRig.ini b/resources/profiles/RatRig.ini index 69379e781b0..56fab6e0df7 100644 --- a/resources/profiles/RatRig.ini +++ b/resources/profiles/RatRig.ini @@ -9,7 +9,7 @@ name = RatRig # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the Slic3r configuration to be downgraded. -config_version = 1.0.0 +config_version = 1.0.2 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/RatRig/ # The printer models will be shown by the Configuration Wizard in this order, @@ -25,7 +25,7 @@ technology = FFF family = V-Core-3 bed_model = rr-vc-300.stl bed_texture = rr-vc-300.svg -default_materials = Generic PETG V6 @RatRig; Generic PETG HF @RatRig; Generic PLA @RatRig; Esun ePA-CF @RatRig; Generic ABS @RatRig +default_materials = Generic PETG V6 @RatRig; Generic PETG HF @RatRig; Generic PLA @RatRig; Esun ePA-CF @RatRig; Generic ABS @RatRig; Generic TPU @RatRig [printer_model:VC3_400] name = RatRig V-Core-3 400mm @@ -33,7 +33,7 @@ variants = 0.4 family = V-Core-3 bed_model = rr-vc-400.stl bed_texture = rr-vc-400.svg -default_materials = Generic PETG V6 @RatRig; Generic PETG HF @RatRig; Generic PLA @RatRig; Esun ePA-CF @RatRig; Generic ABS @RatRig +default_materials = Generic PETG V6 @RatRig; Generic PETG HF @RatRig; Generic PLA @RatRig; Esun ePA-CF @RatRig; Generic ABS @RatRig; Generic TPU @RatRig [printer_model:VC3_500] name = RatRig V-Core-3 500mm @@ -41,7 +41,7 @@ variants = 0.4 family = V-Core-3 bed_model = rr-vc-500.stl bed_texture = rr-vc-500.svg -default_materials = Generic PETG V6 @RatRig; Generic PETG HF @RatRig; Generic PLA @RatRig; Esun ePA-CF @RatRig; Generic ABS @RatRig +default_materials = Generic PETG V6 @RatRig; Generic PETG HF @RatRig; Generic PLA @RatRig; Esun ePA-CF @RatRig; Generic ABS @RatRig; Generic TPU @RatRig [printer_model:VMINION] name = RatRig V-Minion @@ -50,7 +50,7 @@ technology = FFF family = V-Minion bed_model = rr-vminion.stl bed_texture = rr-vminion.svg -default_materials = Generic PETG V6 @RatRig; Generic PETG HF @RatRig; Generic PLA @RatRig; @Esun ePA-CF RatRig; Generic ABS @RatRig +default_materials = Generic PETG V6 @RatRig; Generic PETG HF @RatRig; Generic PLA @RatRig; @Esun ePA-CF RatRig; Generic ABS @RatRig; Generic TPU @RatRig [print:*common*] compatible_printers_condition = printer_model=~/.*VC3_.*/ and nozzle_diameter[0]==0.4 @@ -75,7 +75,6 @@ dont_support_bridges = 1 draft_shield = 0 ensure_vertical_shell_thickness = 1 exact_last_layer_height = 0 -external_infill_margin = 150% external_perimeter_extrusion_width = 0.4 external_perimeter_speed = 90% extruder_clearance_height = 25 @@ -116,7 +115,6 @@ notes = only_retract_when_crossing_perimeters = 0 ooze_prevention = 0 output_filename_format = {input_filename_base}_{layer_height}mm_{filament_type[0]}_{print_time}.gcode -over_bridge_flow_ratio = 100% perimeter_acceleration = 3000 perimeter_extruder = 1 perimeter_extrusion_width = 0.4 @@ -163,7 +161,6 @@ support_material_threshold = 65 support_material_with_sheath = 0 support_material_xy_spacing = 60% thin_walls = 0 -threads = 4 top_fill_pattern = monotonic top_infill_extrusion_width = 0.4 top_solid_infill_speed = 60% @@ -436,8 +433,8 @@ retract_restart_extra_toolchange = 0 retract_speed = 40 silent_mode = 0 single_extruder_multi_material = 0 -start_gcode = M190 S0 ; Prevents prusaslicer from prepending m190 to the gcode interfering with the macro\nM109 S0 ; Prevents prusaslicer from prepending m109 to the gcode interfering with the macro\nSTART_PRINT EXTRUDER_TEMP=[first_layer_temperature] BED_TEMP=[first_layer_bed_temperature]\n;enable this if you have a BTT Smart Filament Sensor\nSET_FILAMENT_SENSOR SENSOR=my_sensor ENABLE=0\n -thumbnails = 16x16,220x220 +start_gcode = M190 S0 ; Prevents prusaslicer from prepending m190 to the gcode interfering with the macro\nM109 S0 ; Prevents prusaslicer from prepending m109 to the gcode interfering with the macro\nSET_GCODE_VARIABLE MACRO=RatOS VARIABLE=relative_extrusion VALUE=True\nSTART_PRINT EXTRUDER_TEMP=[first_layer_temperature] BED_TEMP=[first_layer_bed_temperature]\n;enable this if you have a BTT Smart Filament Sensor\nSET_FILAMENT_SENSOR SENSOR=my_sensor ENABLE=0\n +thumbnails = 64x64,400x300 toolchange_gcode = use_firmware_retraction = 0 use_relative_e_distances = 1 @@ -499,10 +496,10 @@ retract_restart_extra_toolchange = 0 retract_speed = 40 silent_mode = 0 single_extruder_multi_material = 0 -start_gcode = M190 S0 ; Prevents prusaslicer from prepending m190 to the gcode interfering with the macro\nM109 S0 ; Prevents prusaslicer from prepending m109 to the gcode interfering with the macro\nSTART_PRINT EXTRUDER_TEMP=[first_layer_temperature] BED_TEMP=[first_layer_bed_temperature]\n;enable this if you have a BTT Smart Filament Sensor\nSET_FILAMENT_SENSOR SENSOR=my_sensor ENABLE=0\n +start_gcode = M190 S0 ; Prevents prusaslicer from prepending m190 to the gcode interfering with the macro\nM109 S0 ; Prevents prusaslicer from prepending m109 to the gcode interfering with the macro\nSET_GCODE_VARIABLE MACRO=RatOS VARIABLE=relative_extrusion VALUE=True\nSTART_PRINT EXTRUDER_TEMP=[first_layer_temperature] BED_TEMP=[first_layer_bed_temperature]\n;enable this if you have a BTT Smart Filament Sensor\nSET_FILAMENT_SENSOR SENSOR=my_sensor ENABLE=0\n start_gcode_manual = 0 template_custom_gcode = -thumbnails = 16x16,220x220 +thumbnails = 64x64,400x300 thumbnails_color = #018aff thumbnails_custom_color = 0 thumbnails_with_bed = 1 @@ -744,4 +741,87 @@ min_fan_speed = 0 min_print_speed = 15 slowdown_below_layer_time = 10 start_filament_gcode = "; Filament gcode\nSET_GCODE_OFFSET Z=0.0\n\n{if nozzle_diameter[0]==0.4} SET_PRESSURE_ADVANCE ADVANCE=0.045{elsif nozzle_diameter[0]==0.6}SET_PRESSURE_ADVANCE ADVANCE=0.02{endif}\n\n" -temperature = 270 \ No newline at end of file +temperature = 270 + +[filament:Generic TPU @RatRig] +inherits = Generic PLA @RatRig +bed_temperature = 30 +bridge_fan_speed = 100 +bridge_internal_fan_speed = -1 +chamber_temperature = 0 +compatible_printers = +compatible_printers_condition = +compatible_prints = +compatible_prints_condition = +cooling = 1 +disable_fan_first_layers = 2 +end_filament_gcode = "; Filament-specific end gcode \n;END gcode for filament\n" +external_perimeter_fan_speed = -1 +extrusion_multiplier = 0.89 +fan_always_on = 1 +fan_below_layer_time = 100 +filament_colour = #FF00FF +filament_cooling_final_speed = 3.4 +filament_cooling_initial_speed = 2.2 +filament_cooling_moves = 4 +filament_cooling_zone_pause = 0 +filament_cost = 20 +filament_custom_variables = "" +filament_density = 1.24 +filament_deretract_speed = nil +filament_diameter = 1.75 +filament_dip_extraction_speed = 70 +filament_dip_insertion_speed = 33 +filament_enable_toolchange_part_fan = 0 +filament_enable_toolchange_temp = 0 +filament_load_time = 0 +filament_loading_speed = 28 +filament_loading_speed_start = 3 +filament_max_overlap = 100% +filament_max_speed = 0 +filament_max_volumetric_speed = 5 +filament_max_wipe_tower_speed = 0 +filament_melt_zone_pause = 0 +filament_minimal_purge_on_wipe_tower = 15 +filament_notes = "This is a profile for TPU95A. It was tested with Anycubic TPU95A, but most of the economy TPU filaments behave pretty similar.\n\nYou will want to optimize the temperature. Even different colors of the same brand can require 10° more or less.\n\nIf you experience clogs or grinding, reduce the maximum volumetric speed!" +filament_ramming_parameters = "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" +filament_retract_before_travel = nil +filament_retract_before_wipe = nil +filament_retract_layer_change = nil +filament_retract_length = 1 +filament_retract_lift = 0.1 +filament_retract_lift_above = nil +filament_retract_lift_below = nil +filament_retract_restart_extra = nil +filament_retract_speed = nil +filament_seam_gap = nil +filament_shrink = 100% +filament_skinnydip_distance = 31 +filament_soluble = 0 +filament_spool_weight = 0 +filament_toolchange_delay = 0 +filament_toolchange_part_fan_speed = 50 +filament_toolchange_temp = 200 +filament_type = FLEX +filament_unload_time = 0 +filament_unloading_speed = 90 +filament_unloading_speed_start = 100 +filament_use_fast_skinnydip = 0 +filament_use_skinnydip = 0 +filament_vendor = Generic +filament_wipe = nil +filament_wipe_advanced_pigment = 0.5 +filament_wipe_extra_perimeter = nil +filament_wipe_only_crossing = nil +filament_wipe_speed = nil +first_layer_bed_temperature = 30 +first_layer_temperature = 220 +full_fan_speed_layer = 4 +max_fan_speed = 100 +max_speed_reduction = 95% +min_fan_speed = 100 +min_print_speed = 10 +slowdown_below_layer_time = 8 +start_filament_gcode = "; Filament gcode\nSET_GCODE_OFFSET Z=0\nSET_PRESSURE_ADVANCE ADVANCE=0.1" +temperature = 220 +top_fan_speed = -1 diff --git a/resources/profiles/RatRig/VC3_300_thumbnail.png b/resources/profiles/RatRig/VC3_300_thumbnail.png index c9150d2b03aec2a9b58a4180f4cda776007fdf53..3e35aaf3e638aca76c746d7613a2b26ebe293ea5 100644 GIT binary patch literal 34392 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�tzu# z4oEq_{7O5$J^z%R932eDC~`3Vpuc1MW{CW*hhaqg9_5w)EK;VZ2kUta);a>a7e28v z8}sps>U*I#lX&ye1g*28Ce8r;#LH#XXil>05Qce^Fb6BU^)R*K^@6h>5c&GU=)bA2 zDr0{OYR1dSo@|xZ8KP$`ReRkA^8w#9C=L#n*4+aVcBa-zEoEK*4)x{!{+kG+#jre_ zbFz1EQu6R10u@x7rV!#q zTQj)MYEFTJ#xp!Tj9swdM~u9*O(lSOGKKN{*v9ib!Fq&9=fS!A{>!f?{W+gCsnSNl z2u;FpR?S}jz&&GrY_VVpSfv84!f zyhqW)-dR1{u3g^vHU!ouU_?`Sk3og6xdsUv1d}-Yuw~%kG1sH$nxwN-B658|z_1P%vIk7P~z%?V*4jXG8-NkFzwpYszah(Z zJ~^x$ZS{S;yTW$?7Hjz4_I;csuanL3bR_?GWM<8X)L+@+y6%Ei|86y=uP=1Z-bICd z2EPxD?Po?rTu2_F=vQrW|2L{zq1~83DWG1q^;kNaB`~ zt|Uw+|1uM7{06Jv8a+e0FUHG}+UPy_M&WzL5i&NKJTN@kRpBja0}F>fR>Sh#KPHPOd8ke(R}J>wTa25zz6|(MdKJ z;C-VTtM}JE2u`jwXEs0&!@v!jT%3d|rzdx(5ceF829NJb6r^T83XtRE6&9j`j*)?} zu@o{}#$bEFn2L%DA+sufE3cpU&Cn)g-FH3%oe#KK5R=8$zv`pOH9(? zgm4hUUU~EC5pVDA_H3Qu?A#c++Gnu-w`7A-mu|i?3!BZ)EjQ4#{XSr@6Bip43oWRjI#F?=VOMXoazZf1PF_xU+ti7^w-__gs${=anYAf;yDeH?Hv;nzqWU|s2 z>d;0#;<%n)wnxgbbHd^n-amKOzaop@F;SzNbIa9!3WjA>)Ou(}Ssd8}RBvUoO5fpD z&*2lYm&H&6c!BBdz_xL{L3^euGYl(yVrB*oG5ccG17$ei2_*_M!p=W%^N? z^^4}<;ux5;5l&(TJ41<~>}WaBpQOAFbQlotVS?m0xo%hFtxreg@NiBxNjM}^9)|bS ziucNM(3{KjK^NwH+)NuQWg>{C4UL0!uteO<^6`~Fy4(!GwLQ?dF z{{6?dP+Lj5gG#c8ea%1_Esp_>)R6mmd-XT|LMEh7)7p%%Hf zmwP$Xm%V6qKCz}*b0{BRmLrvn3(172L$@`sGPj3IJryzNEt_3)cHUK(iV!@%&&0U8 z*}A+f4v965F;UV%Qpa(F2|{_lU9A);8Ddpn0&E(G{TtaLsR|;O+c@X#?a~3Y$fCOw zUNqpCn3$LhvlqSqJK^;bxTS(Qkqat)ncd`zH6{t|-5VBlHaH>(U5I-HGC7|8{lum+ z!vX$Sx9kZCd)Xp#hd=(NB0Y4S9)t3mh-XMArYvd#2jV$jh~c=7(zL+h;N&Q%KUe|% zap9|3pgV+t8jtDOvqO`<1>BSNduKu1V!<4hTCct^64q6Zh}mdKlRhi-_w`(krLXMtom@pVVHdAl2WNs9 z3u078r}OaY%}j}IJr^5$p^TxS;S1uzP}uq3GQ;vIN)O5jIv3)?W0)R$34jl+g9g)} zi@l`G6urqTd6jSHG>kdHf`C9|Fx2VSRdd-UlLB;8>5ZHC>4sAF*^M$6?%{0m7x`(; zf3BXfjnAEl{ih;2c8F7SMv7AwQAWYb9%)gVV7sI>t`B$~hlaX-;?keh1c| zqK*$3*jQ{Ea0mt)d=qH}*^ix*Ga@sck+H1ItOe{3rXB^gUQTHQ1PQ^d zjy|2yJy{lPB%xhKvF6+?5-Rf%tmE)f!1b)w*Nt$uv?ADd25NxS?@}@Ffvo9|DE5&v z--QluX(3-R;}U+MmNh6`LbS9-Mcrbk_}-?}V|AVoGDY`k2$SbtM3`1l5Xq_G%c3T+S+;#9Q+Qwv6o`peG0pHJi%I8D+4^t z$j-54!#Qz2+`u>g#+wh)H#cj*)6w&dQm4V-QHT3QgSI+^fh=2wl1OjD6nV)Pv@T7V@pt?b9vYt<_1KwuM2gp zy!3!%IF)Bjbn3l-+pjfc#!nP&ZEbbv__Tq-evxYFzYlKiKc%PN)+Wx6QNx^Ms@dEu zc`?Ndx`W?s?(u%`r>*K(XIrDZxXBKhyJ##pL@!`y_S4SRRoT9;xo+X~Ik{_`udS~) zYqshK;#`6_PuYh;K{I0j8IRdRTXB~EK^5dXn88>9QFY-#pJ;)Hv$qiHErhb6pkd80 zA>jf8gkhM(4rz~%BgBB7PM#J+P1^>!`mYCyEVV2T3JSE$j&gu%J}h{&i9Kxw^?A9j zyY+{9*TXt>G+gG4y^&e;lp7jnnP;4wDM!HKk6kuoWMsddu6M{wX1|r9X0-$jO&JwX z**@h>^iHHuk-e4)dbidZg4#~EDkQ#}#Ps_(LX{o!lQAI~gH|8w&@`m|PEADhoTI#3 zb6ODqfUC~V&I>a0!0P+t7iNB(T4KsrSmAc`=~JY7U*Qm6C@+RRDXC~8&8H##2|b`$!$kzWeY@br52EdO1rxvih9!RT7mVi?eWXwpb1RU?N8Hg zJ6Bkv4>NDE9=_w~alPCT{cRA6WWvE0R8e|rRJYoeogZkJ(R0fpN@nJ0>jK)rQb*4> z^wayd_6w5mO1FMz_6Ux)+6!jbJOZP6lY1x59go+BV6cGi_56(n`tyY3^A{aw=K_hS_W$(%rYQvAl>xr5h$fvGImUshH30i^0?+!k69EZLMu00@@A&kXp}qycU>$sma7{q1PQ5L$IH zG`1Nm47j|?LzD+r$69^uVZY2Ta{sf8usv5yD9&jS-}TdrE6IaZA~P?ofg@3UdT})} z2Ia05?w5J`dEZG?o%h2$ z@HqbwM2G}O_~}= z;?S>L00RQ$VA>*KRyJ&*_xINENNc&Na99=&q(D*JTP>E>A?;I(^xu|3%t?_T(I8dw zM@ZL;JDjT!x|6E*qk!aqRJ{HI4#s2#0X@Hxw+SaZjD~=Upi_NeVd3(IYbTmuA#t!Q zy$tDx*H-A^pdd{LHMZnn->ouhyPH4rZ5??ZZ_I@TF*omc|H$&bqoeM}508wis;D9d za~ZuX#iv=wF_8x_*jvC_fD*0%OX&XQR63eP7t(){nxG2HlE0)W0vvtYg;yK69qOpKK}IRx+Ew4YXi61&J=JZ%t=}R zBuas;fVK|C*lo#VEL-&F{1j*J26OW7kF>Rs{8KnaQnQ_I`xZ9n`c=_ZYFGRXsLxx} z4c{}b8G;q;k*n`_Hf>$qNy{(l?{_8EDB7G?n*o`E5HYV{w-+x`ftx?8({bWMy16T) zOV+PEfwZId@`S+~&rS4P8JJfwka%U+)l$}QLspBJ#)vCNxPmf_$Uogm z)ADQlSeMy(RO((0NX$Eyrxr3&$yey0zq_3-u<6m1r!4v?fJiz-cRWx0hd!bbc*$v+~0eRK342e!`GAfV?jK$6G(xcq)Ti zy<3IkR#Ozb`L%(=R;w^gY8s)ip@33quwJA`!ittn_Qo|@LhY=thg!PZO?Hs%)Lx}X zSPBff(U{*3z4!$}Yu58X$ofP4T1Ell#`TG9K)1|@z4wY1lKB;QdX$3bIa5hgbDmC5 zE-Sb+u2dZLruaUJu%zvDfdtDpCDh)Y3QjiTR;UqhDuyUDBb(uFGLP8)9IMpyvN2G4bNgDqc!>8$~Cb-zLDx>3B$$ng6K-SrC%6kvD%G(|3hg zb46^#%)8GYCk?o^w)6!1>2F#jv30O2!Fr=LE2D^02lPV141|n+lniuY@Wx<gz@F0B7z8!ukf_aNcP+xuQNRK;V#1C zF1G$B!H?r!{16^eHs4fI-h;@XkiUxb>JvAmLCPO&qe=jhim^i3>jWotb#+B$9=3IAx2V0ckIN)K37_!noT*J*Z>5pY)*V zXXy`yP@ucMN3@bF5)p|sBU!WG-ElWt1(IrM_YM!s-@biICBeT#Za|_=J^fyHujKE0 z&c(f{8wSTXv2v;E#~pH){Le2`NF^5oO$@^?E+4NZZ)jKPUf(^BL!pt>#0s}QG^u!V zf><>A3VVGp5WH(Qop*75?wlqabcbDvs4OoJT?0*TN8!W>fA)Q((EIH71(W{>~^}RfF*~MYby0C{L?M**1GvxK(2~-YfpB5FY zP%tC05GGKoA|;`v3a4+AY=bupkQD>&F2e07noDbjFe78*#=N>ZucOmTJ_^!bSQtUt zz#kuF$1nE>RruV#JblaBi3nQRfHwk#uA?qGtv){xau8V-F@|jZYa8XH4nv#FMiHIo z@y|gq)usF4a{9ct7~YH16J_qR>J@pk`(L`%?n_1n>CMf}_>a=s`9mqxnkh(+B)?wh zHh67KkQAJ?%GTD08IaBq*GPvic?!rz7dd>A_|uqwv!-58tgW87A|2cFM`bBsk!&oufevyDVPbc-AE`eyi>E?zZ<=a zNnLW5Muw!^NcJ{gt-iq4pfpq^Rj0O!i?YMjxdJrT8+#6~gqh=6h{b_pFwNY4r~}*) zAtTJ6?&j6O2?Ib6?HXh{J>dxeWwlIgwhRBZ(U`pLe@AvQRF5wB_RF>o9J z`uMERW-2^Np{K@@@-Ve$VLR#2MMBGMNnDB{ukfe%jDcV8neV+Gujc!=&i*baGM)u8 z6E+Q=+}z-}g#9y#0YZ~ZZWqDw2!sU-vd!O243lGoTY9CW;l+3L6&94BLR`3Sn5#9@j z)mB%Zv4M)!lxQ zy8A`4iOR2d=d;b9YDj-qK^X4?Sa`eWt8d{&GF{3XTW6KW`7zlawY=;^Afi)xB^vlQ zTZQZejj@5iom1`QEmntcy~~#ORx|V659^Ah?@(5nJDU__Wm~(8lh#lxy6mndvaOS* z&_O@wUpRa1KoL8ruP2Biad;*5BmIw(h-%HwY}`>tNZG# ziOauuiG7*B>!BxL5BMV(ta-sk7_CW>AuhKL`E);ok5Bx(i6$61Nwiw#x_6C#vE-zb zS)@sQf!NItJx}S3u>UB4M$qnL{m|N=rDX5LCry?BGg7Jxyx{Ig;8FYKjDFr%*Q>h1 zao}N9nklw=du!_^k+~s12@4{xOU&DsaPAL<#7kWpGm41Zl!0Rzu;T0^QE0G`97P+? z2G`R&KL)ku!XBCY`ub~paPMl47cTz|FEXDChQS-(KYgm^QwzK;$NslU=G}T@q4?VG zIU5}(qs_Nmyc{7G7`6ZS2$GP-U3wPKpgh}F#Thg^ZmxTFG4M3^9xMYqhCs>dcPw}W z&gu{kE-{;;=hAvNYPECRNj(8ev=4H890`o*^Rp3**V4;AZ+#8d?U=1mSnGNZv?oiv zk-{A#My_`frR)G+k(*`o7uOFyxGWV@g!%`+|F*YDl$tlZ)?%1Rw`B6?%zp#qsq=sQ zzSwTv8t~_!si^@xT0`orm&h-+I)ix7X;n*PRgkgaJ;;Yr!DirmcR+_1Iqxe;+W_k> zLILNZj;B5*|d&<3= zqs?9=NRXYM7XG>d0)fLxjVD5N`TkcViT}#+9qw1&b%mh5Kn?9Ge(p#hu@Oe}fG>3k zxBu%6_N)RMT3YTsHH2b7eSRd>%zr-$t0*adzgO$@RZ9Uw<9TB}5c`tUB{D0}L{Waf9*Tb?9XtlIZBL+$5?)_Sott)k zfoBYTP1*iub`p8}A)o^_G=j)d*Kuc3?ZEcoE+}zw8A1Ggmj)_6HCBJ}o-0e7cClE9+v+hrSt>@`( zf7s#C0h92?xrhFfY$Xh!O6zYsS79=52CjX|loJm3sdeR*&5o_G%|bA&3{G5DWnjj3 zY-ni6JS8PX+86w~z@k1W2if9d?7IJOO;WDwowa}kujq^UtMul|p52QpWZ(XM&-Q;G z%pVw&q%|BgOqZro>T3(1JN+L&9-DXmlc|lbdd6d8F9X4bKp<*L+KQF(79sxwcuS+( delta 31544 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

    L%Dc&;_E_EN`J3VrT39M|mi8HJw-9#cfh1-qe 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�Zxni!n~_vO+C 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 Bvn2ok literal 0 HcmV?d00001 diff --git a/resources/profiles/Rigid3D/Mucit_thumbnail.png b/resources/profiles/Rigid3D/Mucit_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..0796709d11a28f08a913d35999fd618ebf62b69f GIT binary patch literal 55165 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

    !Zz{8I{w)l!mF0rbFK4CCO!ayJ)I7e-58b_Ym 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

    l2@@5StDO5YI0GOoonU-)gxq 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 uQ;g) zuQ(Y1x-+k@NQv*E4|EwktfBvA@k3o~BA?4v4n@)Ao@d z{4mFg5Yoy2$hkAtF>$_o&fsD;PsL|@^~TIUZPF!7V0=rZs8y2G7HiJ)ZN(5cn(v5k6$N3F2?eZ}?g9?(=Ei}&&^MMmT2#mN<1kqRx`15d9y}<$KK?wf;po^CqmVCNn_R_iQ zMYF>ub?)BYPi{rkA}@cgjPE#??fQLP+oWn4q3Tbg^tUz-1O^IolhG#ANZ4Nc%v#{J z68X$g9i2eQAu;Vq!)$${>4n7Q<2VbrFNN|z+|9~B2Z-q9_cm7p-KHFd>}dgdKTHPa zH>)Hue~P5M!}$WETWEStVKFuB_^oo~F&l?n2DiW_w5BUg#%n^gh=|`H>Fb_r>RLar zD2wPC5!4bahB7=cH{Wf&ZI0FSAuEvzj!L2q*{4gnewfP3rEfd@7tCeIg@gW05v%)P zAP$2v>-@T%xx%c)clAX#jEh4eMylQVaJM^xrV-|R)B}Ht{kqkGxLKeh0oASe#CWpL z$~vk+vmvgIOpJKHURk+C_EK$}?CXh}Y^v%*`o`s^h<#i|xVaq+-^C{+=xk;RE%~ z3G=H#C$Z#ghkRoQe6YqwmvT@0q+Cxv73~<{X_CTH+ipzyeb z=UFwtf%%Is)=*oMCM@jxwt+PQIV1uJ_-8}Sie8M(HZc8?#5%T|T8>cS{bu?nkNR=7 zJte#iH7lgaVR@c#6zmxXXWP^2a)+HYj`QF8XLc1)`F|l7`1D??=)BIe=RdGoakH8t zZh}@=1{0PR^ukOK@caJ1ZJ#yYD9@hQ0DFChezi?P zcojnm?YeEPXnad5&K?N6Z|@neRfuYqCYpz@aI6hfYvlg{eo~8U zd5`s(zj&#_(GV(8CcSQ?lN8ttZA0xp5c&fQ?<GpQI%;zpokt!x14v%Xi8nZMRAQt&d>d^F_g%u2Y zq7kB$YC$4x&c|xeQ_5KhXz5M8m-)OKK)zaGU zYjDXF`;4*@)mk#!2rz&J+QQQK92th39D72IqP`cpFV&jm8TG;1e;r0AC(%{N;l!C2 znxME1VOk>`(!|`u67I9Hw%^1wULQV^Rdh9YaHGQJ7zL|&^Vw~zVw7DV+ot25P~J=u z%|W2loV}fsyF27w(Q>WXSst(2hhs9qNvWS<#SWI1j?1)q%t`n96iZvXBmMNXSZv(Z z;sdSdlm6`-ag11t6~}upG;6_PdFCC({|XN)gZF`Ec0!k%PSv!X@aSCaVTUJ(`fcNU zCXq+^KPHl}FtFHw2U3;@GSW%Q7UiY#;Pn>ARh{3Y>|deyrs@8M>La-+0po@xfy`Hd zg~>IQ#Exl}UJUTRDNP6{xsh7e2dQYPHx_7d!^mdKJ&zpY*&^Xc55L(f!~bLTenbxgF; In$Ge61H^3Ur~m)} literal 0 HcmV?d00001 diff --git a/resources/profiles/Rigid3D/Zero2_thumbnail.png b/resources/profiles/Rigid3D/Zero2_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..af2606198de9e5798f8f943cefef6047942f843a GIT binary patch literal 60344 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 Y9o}dYx04jJ2yde(tNNu*+U)250C|~;c>n+a literal 0 HcmV?d00001 diff --git a/resources/profiles/Rigid3D/Zero3_thumbnail.png b/resources/profiles/Rigid3D/Zero3_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..7f65192f2ca503879267e22944ca95f208190372 GIT binary patch literal 47050 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 z zIEt~>P&viUgE61}iD!BLzx^H<*IcVKe@2hso`d}Yk{sq!Fp|}0SK-l|AAP0IkABF& zAVPo3@IU|IBzRg!#7g=A%%VVtd~pKlQh)B07*naRPIg#4lO!) z)Z);=uEinqmd-+`>+a7XFtzqmv=YoKLmDgQ^8%?9bew&ftm~%7sjR@5njRUolIYq{ zo0>>SM$@TZChdDXTRY2aGNYQ$Fs-+Ajj3yj`Mia#=4C+~astylAy$&>k80lk%qs8y z&=x#6fbG)1gY%tmMaGc!VgCW#--VSm*el@y7%fmM6+2VNSNlv3H2n-#hCR|GCW%wx zC?-)Vz^#9CJAzvmps-{R5lQd0 zL15*i^O_my7UqElhe0x(PKlC~gSlot+4pRM)jV!@p0;?Nas4QoFu*$V(HRms$XI@zb!#)S&l4@M?6F>eEJiP^PJcKv} zslW|kvI{B&N{Ad(G0aN1kV2|Z+m?EN&bhOWFa79~T>IblIT&s8hp&E-D3ZMA#ix1r zXpgLyk@YgtB<1Fv`#9r>!Vs7x3EF6sl!!!eu)W7CA9_D=B>COn{Ug%EZ@HvtgtLNL z&q?#-m?O5ZXo#9=xxte=>c1oHMW+HU|C?<+vzvt4Q$eh_Wr0>Z>`BoS)kT$V5}_I| z{Z@})4W_Q?B{7CJI?8XSgz2OmUm8B1S-hJE&XDW=wZ zyvT=ta0On!4=VN->A?ZaM$nI8R>AB(h#KMqW*UY9RvajZ;~|V{u3p^d=YP23FaM0< zw}0FUV|BO^Xz-dSNhs!Xt({|goNe2M@20VB zn~lxJPGdDzV_S_e;bdalwj0}N*ccPreCPQO@AcvO1?P5Rt#$0HWDfy6UE_RsM!V&8 zYajkj+RbGd=ov4k+R(8!LLgy(hOwd{%Nk!jP@-a{{h(tm!Tk0SS7|LWBbyzZvIniH zuiv>5Oxdc`w8oy7>wy{?G2-?o@%<6{S^G(3z2D>GWKJs9uVbdU(aQT^945!l6ib`H z(CeE2!an|q>|-Rie{uM7_ke-7c5A!2wr9AjjGjp;LmFaKscIm@3A27?P0#8TI{ou1 zdS)UsJfQnnNX`4^r+|TGY>QMPcvbxBbWVJy@HCE{v-SI5--;MzaG)&ADJlny*_6?X z&Lmm(=`A>b_TZr~c;kJ&%CU-bEtfMRCT&ImGV`liFuDMuf6!>G+ccXNm>8FjH+sJl zJ$My);Rt*c{UnN!!P@M3#x?S~=gtY(F%bIf*9^G1d}l6{f$28%DL9U^Rh(Ma_y=?9 z1-%O2D($Nn&ywXQV|#Fk;tV_segZVVIWSQYSze(pF%aFS@s|8Lw#NAOUvXFD@S`0i zJq9%9-;6f%cT%JG7b0xOxaaX&|C|V4Uhl_7ZSQ4Hm8<^Ft*NyWM6?SLu_!*dg4WLo4s_NK8|PbUc`){%Vqmky?g;hrkyRo#TOJ$7k(k!l0iK$)xxZuOTFZ zyw%g#(g37pL9dM>hBU*^0`dm{5cM zu^ir?e0Fipa>pLIz2eC4X$d%odwu(-@<}PBdVNsa9R!LFu^zHDddA(emIE>aQmdMa z

    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 literal 0 HcmV?d00001 diff --git a/resources/profiles/Rigid3D/mucit2_bed.png b/resources/profiles/Rigid3D/mucit2_bed.png new file mode 100644 index 0000000000000000000000000000000000000000..d01c0b82d7b390de22de64eacb85cb4bf0f8cbe2 GIT binary patch literal 10363 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

    Q5jfvU0wl^i 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⪚iw_wQG*iFO8AmtVI>LF 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 literal 0 HcmV?d00001 diff --git a/resources/profiles/Rigid3D/mucit_bed.png b/resources/profiles/Rigid3D/mucit_bed.png new file mode 100644 index 0000000000000000000000000000000000000000..2f94cb8f265d80b5382d353bc3c96b2f2474f578 GIT binary patch literal 9332 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 gpFuudJB(D;;hA4-WBYXATM literal 0 HcmV?d00001 diff --git a/resources/profiles/Rigid3D/zero2_bed.png b/resources/profiles/Rigid3D/zero2_bed.png new file mode 100644 index 0000000000000000000000000000000000000000..4e6e04e652513cb20401c701229b44dd096234b8 GIT binary patch literal 9707 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 UqdJLc5e8taZ*~QD>Gp&F06;YmUjP6A literal 0 HcmV?d00001 diff --git a/resources/profiles/Rigid3D/zero3_bed.png b/resources/profiles/Rigid3D/zero3_bed.png new file mode 100644 index 0000000000000000000000000000000000000000..3c5dd5f1933029f5ec1fc1e253250046b0b2bc81 GIT binary patch literal 9708 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%0A(mgxBiQPeJ>H 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%0A(mgxBiQQ;yC&(H$h1M1(nB-|wL2yy2Dd z&x(ZC>eADi&N{&zB$z~mIm(l!vV(-z>e5rE7SC`82__L?jvsz$O0)cuyid3$;kCN- z^sMf0%5?-rIPXQYoat8?}5n+zB9k?m`gliIBt4mKa+jGDjB$z~m zIns9ErtA~0NqDU;J(X?K!`(rGNko{VJW;Nz>joseR+pYG_m`>eAi*Re%u$|(YFgr+itu8&aaPk4}Ai*Re z%u$}Wm>nd%R+pZ>IC@`qkYExK<|t2&%nlM>t4mLjylpRckYExK=D2U&r{J4i5z2y>Jtd1eO*uhpfedVXkEcaUHb5#~tSft#{VxF+GXy7Y9?8+LIA z2__L?jQ}&nx^XaoP^iv($ivJ+Swf>m_&p* zwm<2lX3;TupKwjWYjx?Vx3hP02MHz-VUBfvJf}JMj=WE}CgHWZ^z`0QJGg@clZY_K zrVD-vF->*WumnPu81Z0EZqm_&p*(stmc>=Uj@ zc&#oyrTg5C+(Cj#M3|#IVLTrP39r?qr;V?;fjdYri3oF~?Z8dhCtQ>8T3vc-y7md% z&x!<-h%iUm4&0P|!Ziu6)upGuzcbbyB$z~mIns9ErtA~0NqDU;J;h%8gzY#;Fo_6r zr0u{>*(Y3+@LFAZ8o%}ln}Y*(Y3+ z@LF9*CWrP3+i{R!5)tMon;r6Tknmbv+VY@%!sZ~sBqGd_wgWe1pKwjWYju4rIkZpM i93+@TggMf7;HK;ou1R>Uu5rnseZuA-!6YKg@&5tO9E4f` literal 0 HcmV?d00001 diff --git a/resources/profiles/Snapmaker.ini b/resources/profiles/Snapmaker.ini index 2643211b7e5..68e32910b11 100644 --- a/resources/profiles/Snapmaker.ini +++ b/resources/profiles/Snapmaker.ini @@ -470,4 +470,4 @@ max_print_height = 235 start_gcode = M82 ;absolute extrusion mode\n;Start GCode begin\nM140 S[first_layer_bed_temperature] ;Start Warming Bed\nM104 S160 ;Preheat Nozzle\nG28 ; home all axes\nG90 ;absolute positioning\nG1 X-10 Y-10 F3000\nG1 Z0 F1800\nG1 Z5 F5000 ; lift nozzle\nM190 S[first_layer_bed_temperature] ;Wait For Bed Temperature\nM109 S[first_layer_temperature] ;Wait for Hotend Temperature\nG92 E0\nG1 E10 F200\nG1 E-2 F300\nG92 E0\n;Start GCode end\nG1 F3600 E-2 end_gcode = M140 S0\n;End GCode begin\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG90 ;absolute positioning\nG92 E0\nG1 E-2 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z330 E-1 F80 ;move Z up a bit and retract filament even more\nG1 X0 F3000 ;move X to min endstops, so the head is out of the way\nG1 Y250 F3000 ;so the head is out of the way and Plate is moved forward\nM84 ;steppers off\n;End GCode end\nM82 ;absolute extrusion mode\nM104 S0\nM107\n;End of Gcode default_filament_profile = Generic PLA @Snapmaker -default_print_profile = 0.20mm NORMAL @SnapmakerA250 \ No newline at end of file +default_print_profile = 0.20mm NORMAL @SnapmakerA250 diff --git a/resources/profiles/Templates.idx b/resources/profiles/Templates.idx new file mode 100644 index 00000000000..297aeb1fee6 --- /dev/null +++ b/resources/profiles/Templates.idx @@ -0,0 +1,3 @@ +min_slic3r_version = 2.6.0-alpha0 +1.0.1 Added Prusament PETG Carbon Fiber, Fiberthree F3 PA-GF30 Pro. +1.0.0 Initial diff --git a/resources/profiles/Templates.ini b/resources/profiles/Templates.ini new file mode 100644 index 00000000000..cf7b8ebe8fa --- /dev/null +++ b/resources/profiles/Templates.ini @@ -0,0 +1,2167 @@ +# Generic filament profile templates + +[vendor] +name = Templates +config_version = 1.0.1 +config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Templates/ +templates_profile = 1 + +## Generic filament profiles + +[filament:*common*] +cooling = 1 +compatible_printers = +compatible_printers_condition = +end_filament_gcode = "; Filament-specific end gcode" +extrusion_multiplier = 1 +filament_loading_speed = 14 +filament_loading_speed_start = 19 +filament_unloading_speed = 90 +filament_unloading_speed_start = 100 +filament_toolchange_delay = 0 +filament_cooling_moves = 1 +filament_cooling_initial_speed = 3 +filament_cooling_final_speed = 2 +filament_load_time = 0 +filament_unload_time = 0 +filament_ramming_parameters = "130 120 2.70968 2.93548 3.32258 3.83871 4.58065 5.54839 6.51613 7.35484 7.93548 8.16129| 0.05 2.66451 0.45 3.05805 0.95 4.05807 1.45 5.97742 1.95 7.69999 2.45 8.1936 2.95 11.342 3.45 11.4065 3.95 7.6 4.45 7.6 4.95 7.6" +filament_minimal_purge_on_wipe_tower = 0 +filament_cost = 0 +filament_density = 0 +filament_diameter = 1.75 +filament_notes = "" +filament_settings_id = "" +filament_soluble = 0 +min_print_speed = 10 +slowdown_below_layer_time = 10 +start_filament_gcode = + +[filament:*PLA*] +inherits = *common* +bed_temperature = 60 +bridge_fan_speed = 100 +disable_fan_first_layers = 1 +full_fan_speed_layer = 3 +fan_always_on = 1 +fan_below_layer_time = 100 +filament_colour = #FF8000 +filament_max_volumetric_speed = 0 +filament_type = PLA +first_layer_bed_temperature = 60 +first_layer_temperature = 215 +max_fan_speed = 100 +min_fan_speed = 100 +temperature = 210 + +[filament:*PET*] +inherits = *common* +bed_temperature = 90 +bridge_fan_speed = 50 +disable_fan_first_layers = 3 +full_fan_speed_layer = 5 +fan_always_on = 1 +fan_below_layer_time = 20 +filament_colour = #FF8000 +filament_max_volumetric_speed = 0 +filament_type = PETG +first_layer_bed_temperature = 85 +first_layer_temperature = 230 +max_fan_speed = 50 +min_fan_speed = 30 +temperature = 240 + +[filament:*ABS*] +inherits = *common* +bed_temperature = 100 +bridge_fan_speed = 25 +cooling = 0 +disable_fan_first_layers = 3 +fan_always_on = 0 +fan_below_layer_time = 20 +filament_colour = #FFF2EC +filament_max_volumetric_speed = 0 +filament_ramming_parameters = "120 100 5.70968 6.03226 7 8.25806 9 9.19355 9.3871 9.77419 10.129 10.3226 10.4516 10.5161| 0.05 5.69677 0.45 6.15484 0.95 8.76774 1.45 9.20323 1.95 9.95806 2.45 10.3871 2.95 10.5677 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" +filament_type = ABS +first_layer_bed_temperature = 100 +first_layer_temperature = 255 +max_fan_speed = 30 +min_fan_speed = 20 +temperature = 255 + +[filament:*ABSC*] +inherits = *common* +bed_temperature = 100 +bridge_fan_speed = 25 +cooling = 1 +disable_fan_first_layers = 4 +fan_always_on = 0 +fan_below_layer_time = 30 +slowdown_below_layer_time = 20 +filament_colour = #FFF2EC +filament_max_volumetric_speed = 0 +filament_ramming_parameters = "120 100 5.70968 6.03226 7 8.25806 9 9.19355 9.3871 9.77419 10.129 10.3226 10.4516 10.5161| 0.05 5.69677 0.45 6.15484 0.95 8.76774 1.45 9.20323 1.95 9.95806 2.45 10.3871 2.95 10.5677 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" +filament_type = ABS +first_layer_bed_temperature = 100 +first_layer_temperature = 255 +max_fan_speed = 15 +min_fan_speed = 15 +min_print_speed = 15 +temperature = 255 + +[filament:*FLEX*] +inherits = *common* +bed_temperature = 50 +bridge_fan_speed = 80 +cooling = 0 +disable_fan_first_layers = 3 +extrusion_multiplier = 1.15 +fan_always_on = 0 +fan_below_layer_time = 100 +filament_colour = #008000 +filament_max_volumetric_speed = 1.8 +filament_type = FLEX +first_layer_bed_temperature = 50 +first_layer_temperature = 240 +max_fan_speed = 90 +min_fan_speed = 70 +temperature = 240 + +[filament:ColorFabb bronzeFill] +inherits = *PLA* +filament_vendor = ColorFabb +extrusion_multiplier = 1.12 +filament_cost = 80.65 +filament_density = 3.9 +filament_spool_weight = 236 +filament_colour = #804040 + +[filament:ColorFabb steelFill] +inherits = *PLA* +filament_vendor = ColorFabb +extrusion_multiplier = 1.1 +filament_cost = 80.65 +filament_density = 3.13 +filament_spool_weight = 236 +filament_colour = #808080 + +[filament:ColorFabb copperFill] +inherits = *PLA* +filament_vendor = ColorFabb +extrusion_multiplier = 1.1 +filament_cost = 80.65 +filament_density = 3.9 +filament_spool_weight = 236 +filament_colour = #82603E + +[filament:ColorFabb HT] +inherits = *PET* +filament_vendor = ColorFabb +bed_temperature = 100 +bridge_fan_speed = 30 +cooling = 1 +disable_fan_first_layers = 3 +fan_always_on = 0 +fan_below_layer_time = 10 +filament_cost = 65.66 +filament_density = 1.18 +filament_spool_weight = 236 +first_layer_bed_temperature = 100 +first_layer_temperature = 270 +max_fan_speed = 20 +min_fan_speed = 10 +temperature = 270 + +[filament:ColorFabb PLA-PHA] +inherits = *PLA* +filament_vendor = ColorFabb +filament_cost = 54.84 +filament_density = 1.24 +filament_spool_weight = 236 + +[filament:ColorFabb woodFill] +inherits = *PLA* +filament_vendor = ColorFabb +extrusion_multiplier = 1.1 +filament_cost = 78.63 +filament_density = 1.15 +filament_spool_weight = 236 +filament_colour = #dfc287 +first_layer_temperature = 200 +temperature = 200 + +[filament:ColorFabb corkFill] +inherits = *PLA* +filament_vendor = ColorFabb +extrusion_multiplier = 1.1 +filament_cost = 78.63 +filament_density = 1.18 +filament_spool_weight = 236 +filament_colour = #634d33 +filament_max_volumetric_speed = 6 +first_layer_temperature = 220 +temperature = 220 + +[filament:ColorFabb XT] +inherits = *PET* +filament_vendor = ColorFabb +filament_cost = 62.90 +filament_density = 1.27 +filament_spool_weight = 236 +first_layer_bed_temperature = 90 +first_layer_temperature = 260 +temperature = 270 + +[filament:ColorFabb XT-CF20] +inherits = *PET* +filament_vendor = ColorFabb +extrusion_multiplier = 1.05 +filament_cost = 80.65 +filament_density = 1.35 +filament_spool_weight = 236 +filament_colour = #804040 +filament_max_volumetric_speed = 2 +first_layer_bed_temperature = 90 +first_layer_temperature = 260 +temperature = 260 + +[filament:ColorFabb nGen] +inherits = *PET* +filament_vendor = ColorFabb +filament_cost = 52.46 +filament_density = 1.2 +filament_spool_weight = 236 +bridge_fan_speed = 40 +fan_always_on = 0 +fan_below_layer_time = 10 +filament_type = NGEN +first_layer_temperature = 240 +max_fan_speed = 35 +min_fan_speed = 20 + +[filament:ColorFabb nGen flex] +inherits = *FLEX* +filament_vendor = ColorFabb +filament_cost = 58.30 +filament_density = 1 +filament_spool_weight = 236 +bed_temperature = 85 +bridge_fan_speed = 40 +cooling = 1 +disable_fan_first_layers = 3 +extrusion_multiplier = 1 +fan_below_layer_time = 10 +filament_max_volumetric_speed = 5 +first_layer_bed_temperature = 85 +first_layer_temperature = 260 +max_fan_speed = 35 +min_fan_speed = 20 +temperature = 260 + +[filament:Kimya PETG Carbon] +inherits = *PET* +filament_vendor = Kimya +extrusion_multiplier = 1.05 +filament_cost = 150.02 +filament_density = 1.317 +filament_colour = #804040 +first_layer_bed_temperature = 85 +first_layer_temperature = 240 +temperature = 240 + +[filament:Kimya ABS Carbon] +inherits = *ABSC* +filament_vendor = Kimya +filament_cost = 140.34 +filament_density = 1.032 +filament_colour = #804040 +first_layer_temperature = 260 +temperature = 260 + +[filament:Kimya ABS Kevlar] +inherits = Kimya ABS Carbon +filament_vendor = Kimya +filament_density = 1.037 + +[filament:E3D Edge] +inherits = *PET* +filament_vendor = E3D +filament_cost = 56.9 +filament_density = 1.26 +filament_type = EDGE + +[filament:E3D PC-ABS] +inherits = *ABS* +filament_vendor = E3D +filament_cost = 0 +filament_type = PC +filament_density = 1.05 +first_layer_temperature = 270 +temperature = 270 + +[filament:Fillamentum PLA] +inherits = *PLA* +filament_vendor = Fillamentum +filament_cost = 35.48 +filament_density = 1.24 +filament_spool_weight = 230 + +[filament:Fillamentum ABS] +inherits = *ABSC* +filament_vendor = Fillamentum +filament_cost = 32.4 +filament_density = 1.04 +filament_spool_weight = 230 +first_layer_temperature = 240 +temperature = 240 + +[filament:Fillamentum ASA] +inherits = *ABS* +filament_vendor = Fillamentum +filament_cost = 38.7 +filament_density = 1.07 +filament_spool_weight = 230 +fan_always_on = 1 +cooling = 1 +min_fan_speed = 20 +max_fan_speed = 20 +min_print_speed = 15 +slowdown_below_layer_time = 15 +first_layer_temperature = 260 +temperature = 260 +filament_type = ASA + +[filament:Prusament ASA] +inherits = *ABS* +filament_vendor = Prusa Polymers +filament_cost = 42.69 +filament_density = 1.07 +filament_spool_weight = 201 +fan_always_on = 1 +first_layer_temperature = 260 +first_layer_bed_temperature = 100 +temperature = 260 +bed_temperature = 100 +cooling = 1 +min_fan_speed = 20 +max_fan_speed = 20 +bridge_fan_speed = 30 +min_print_speed = 15 +slowdown_below_layer_time = 15 +disable_fan_first_layers = 4 +filament_type = ASA +filament_colour = #FFF2EC + +[filament:Prusament PC Blend] +inherits = *ABS* +filament_vendor = Prusa Polymers +filament_cost = 62.36 +filament_density = 1.22 +filament_spool_weight = 201 +fan_always_on = 0 +first_layer_temperature = 275 +first_layer_bed_temperature = 105 +temperature = 275 +bed_temperature = 105 +cooling = 1 +min_fan_speed = 20 +max_fan_speed = 20 +bridge_fan_speed = 30 +min_print_speed = 15 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 4 +fan_below_layer_time = 30 +filament_type = PC +filament_colour = #DEE0E6 + +[filament:Prusament PC Blend Carbon Fiber] +inherits = Prusament PC Blend +filament_cost = 90.73 +filament_density = 1.16 +extrusion_multiplier = 1.04 +first_layer_temperature = 285 +temperature = 285 +disable_fan_first_layers = 4 +fan_below_layer_time = 10 +filament_colour = #BBBBBB + +[filament:Prusament PA11 Carbon Fiber] +inherits = Prusament PC Blend Carbon Fiber +filament_cost = 151.24 +filament_density = 1.11 +filament_type = PA +extrusion_multiplier = 1.05 +first_layer_temperature = 275 +temperature = 285 +first_layer_bed_temperature = 90 +bed_temperature = 105 +fan_below_layer_time = 10 + +[filament:Fillamentum CPE] +inherits = *PET* +filament_vendor = Fillamentum +filament_cost = 56.45 +filament_density = 1.25 +filament_spool_weight = 230 +filament_type = CPE +first_layer_bed_temperature = 90 +first_layer_temperature = 275 +min_fan_speed = 30 +max_fan_speed = 50 +disable_fan_first_layers = 3 +full_fan_speed_layer = 5 +temperature = 275 + +[filament:Fillamentum Timberfill] +inherits = *PLA* +filament_vendor = Fillamentum +extrusion_multiplier = 1.05 +filament_cost = 68 +filament_density = 1.15 +filament_spool_weight = 230 +filament_colour = #804040 +first_layer_temperature = 190 +temperature = 190 +filament_retract_lift = 0.2 + +[filament:Smartfil Wood] +inherits = *PLA* +filament_vendor = Smart Materials 3D +extrusion_multiplier = 1.05 +filament_cost = 68 +filament_density = 1.58 +filament_colour = #804040 +first_layer_temperature = 220 +temperature = 220 + +[filament:Generic ABS] +inherits = *ABSC* +filament_vendor = Generic +filament_cost = 27.82 +filament_density = 1.04 + +[filament:Esun ABS] +inherits = *ABSC* +filament_vendor = Esun +filament_cost = 27.82 +filament_density = 1.01 +filament_spool_weight = 265 + +[filament:Hatchbox ABS] +inherits = *ABSC* +filament_vendor = Hatchbox +filament_cost = 27.82 +filament_density = 1.04 +filament_spool_weight = 245 + +[filament:Filament PM ABS] +inherits = *ABSC* +filament_vendor = Filament PM +filament_cost = 27.82 +filament_density = 1.08 +filament_spool_weight = 230 + +[filament:Verbatim ABS] +inherits = *ABSC* +filament_vendor = Verbatim +filament_cost = 25.87 +filament_density = 1.05 +filament_spool_weight = 235 + +[filament:Generic PETG] +inherits = *PET* +filament_vendor = Generic +filament_cost = 27.82 +filament_density = 1.27 + +[filament:Extrudr DuraPro ASA] +inherits = Fillamentum ASA +filament_vendor = Extrudr +bed_temperature = 90 +filament_cost = 34.64 +filament_density = 1.05 +filament_notes = "https://www.extrudr.com/en/products/catalogue/?material=120" +first_layer_bed_temperature = 90 +first_layer_temperature = 220 +temperature = 220 +filament_spool_weight = 230 + +[filament:Extrudr PETG] +inherits = *PET* +filament_vendor = Extrudr +bed_temperature = 70 +filament_cost = 35.45 +filament_density = 1.29 +filament_notes = "https://www.extrudr.com/en/products/catalogue/?material=94" +first_layer_bed_temperature = 70 +first_layer_temperature = 220 +temperature = 220 +slowdown_below_layer_time = 20 +filament_spool_weight = 262 +full_fan_speed_layer = 0 + +[filament:Extrudr XPETG CF] +inherits = Extrudr PETG +filament_cost = 62.49 +filament_density = 1.29 +filament_notes = "https://www.extrudr.com/en/products/catalogue/?material=198" +first_layer_temperature = 235 +temperature = 235 +filament_spool_weight = 230 + +[filament:Extrudr XPETG Matt] +inherits = Extrudr PETG +filament_cost = 29.99 +filament_density = 1.41 +filament_notes = "https://www.extrudr.com/en/products/catalogue/?material=199" +first_layer_temperature = 230 +temperature = 230 + +[filament:Extrudr BioFusion] +inherits = *PLA* +filament_vendor = Extrudr +disable_fan_first_layers = 3 +full_fan_speed_layer = 0 +filament_cost = 31.23 +filament_density = 1.25 +filament_notes = "https://www.extrudr.com/en/products/catalogue/?material=121" +first_layer_temperature = 220 +temperature = 220 +max_fan_speed = 45 +min_fan_speed = 25 +slowdown_below_layer_time = 20 +filament_spool_weight = 230 + +[filament:Extrudr Flax] +inherits = *PLA* +filament_vendor = Extrudr +filament_cost = 50.91 +filament_density = 1.45 +filament_notes = "High Performance Filament for decorative parts.\nPrints as easily as PLA with much higher strength and temperature resistance.\nFully biodegradable with a nice matt finish.\n\nhttps://www.extrudr.com/en/products/catalogue/?material=131" +first_layer_temperature = 190 +temperature = 190 +max_fan_speed = 80 +min_fan_speed = 30 +full_fan_speed_layer = 0 +slowdown_below_layer_time = 20 +filament_spool_weight = 262 + +[filament:Extrudr GreenTEC] +inherits = *PLA* +filament_vendor = Extrudr +filament_cost = 50.91 +filament_density = 1.3 +filament_notes = "https://www.extrudr.com/en/products/catalogue/?ignorechildren=1&material=106" +first_layer_temperature = 208 +temperature = 208 +slowdown_below_layer_time = 20 +filament_spool_weight = 262 + +[filament:Extrudr GreenTEC Pro] +inherits = *PLA* +filament_vendor = Extrudr +filament_cost = 56.23 +filament_density = 1.35 +filament_notes = "High Performance Filament for technical parts.\nPrints as easily as PLA with much higher strength and temperature resistance.\nFully biodegradable with a nice matt finish.\n\nhttps://www.extrudr.com/en/products/catalogue/?material=134" +temperature = 215 +max_fan_speed = 80 +min_fan_speed = 30 +full_fan_speed_layer = 0 +slowdown_below_layer_time = 20 +filament_spool_weight = 230 + +[filament:Extrudr GreenTEC Pro Carbon] +inherits = *PLA* +filament_vendor = Extrudr +filament_cost = 62.49 +filament_density = 1.2 +filament_notes = "High Performance Filament for technical parts.\nPrints as easily as PLA with much higher stregnth and temperature resistance.\nFully biodegradable with a nice matt finish.\n\nhttps://www.extrudr.com/en/products/catalogue/?material=138" +first_layer_temperature = 225 +max_fan_speed = 80 +min_fan_speed = 30 +temperature = 225 +full_fan_speed_layer = 0 +slowdown_below_layer_time = 20 +filament_spool_weight = 230 + +[filament:Extrudr PLA NX1] +inherits = *PLA* +filament_vendor = Extrudr +filament_cost = 22.76 +filament_density = 1.24 +filament_notes = "https://www.extrudr.com/en/products/catalogue/?material=97" +temperature = 205 +bed_temperature = 60 +first_layer_temperature = 205 +first_layer_bed_temperature = 60 +full_fan_speed_layer = 0 +max_fan_speed = 90 +min_fan_speed = 30 +slowdown_below_layer_time = 20 +filament_spool_weight = 262 + +[filament:Extrudr PLA NX2] +inherits = Extrudr PLA NX1 +filament_cost = 23.63 +filament_density = 1.3 +filament_notes = "https://www.extrudr.com/en/products/catalogue/?material=128" + +[filament:Extrudr Flex Hard] +inherits = *FLEX* +filament_vendor = Extrudr +disable_fan_first_layers = 1 +extrusion_multiplier = 1.15 +filament_cost = 39.98 +filament_density = 1.2 +filament_max_volumetric_speed = 3 +filament_notes = "https://www.extrudr.com/en/products/catalogue/?material=115" +filament_spool_weight = 230 +slowdown_below_layer_time = 20 + +[filament:Extrudr Flex Medium] +inherits = *FLEX* +filament_vendor = Extrudr +disable_fan_first_layers = 1 +extrusion_multiplier = 1.15 +filament_cost = 39.98 +filament_density = 1.19 +filament_max_volumetric_speed = 3 +filament_notes = "https://www.extrudr.com/en/products/catalogue/?material=117" +filament_spool_weight = 230 +slowdown_below_layer_time = 20 + +[filament:Extrudr Flex SemiSoft] +inherits = *FLEX* +filament_vendor = Extrudr +disable_fan_first_layers = 1 +extrusion_multiplier = 1.15 +filament_cost = 39.98 +filament_density = 1.18 +filament_max_volumetric_speed = 1.8 +filament_notes = "https://www.extrudr.com/en/products/catalogue/?material=116" +filament_spool_weight = 230 +slowdown_below_layer_time = 20 + +[filament:addnorth Adamant S1] +inherits = *FLEX* +filament_vendor = addnorth +disable_fan_first_layers = 3 +extrusion_multiplier = 1 +filament_cost = +filament_density = 1.22 +temperature = 250 +bed_temperature = 50 +first_layer_temperature = 245 +first_layer_bed_temperature = 50 +slowdown_below_layer_time = 20 +min_print_speed = 20 +fan_below_layer_time = 15 +fan_always_on = 1 +cooling = 1 +min_fan_speed = 40 +max_fan_speed = 70 +bridge_fan_speed = 60 +filament_max_volumetric_speed = 1.7 + +[filament:addnorth Adura X] +inherits = *PET* +filament_vendor = addnorth +filament_cost = 29.99 +filament_density = 1.27 +filament_type = PA +extrusion_multiplier = 0.98 +bed_temperature = 105 +first_layer_bed_temperature = 105 +first_layer_temperature = 265 +temperature = 270 +fan_always_on = 0 +min_fan_speed = 20 +max_fan_speed = 40 +bridge_fan_speed = 70 +slowdown_below_layer_time = 10 +min_print_speed = 20 +fan_below_layer_time = 10 +disable_fan_first_layers = 3 +full_fan_speed_layer = 0 + +[filament:addnorth E-PLA] +inherits = *PLA* +filament_vendor = addnorth +filament_cost = 24.99 +filament_density = 1.24 +extrusion_multiplier = 0.98 +temperature = 215 +bed_temperature = 60 +first_layer_temperature = 215 +first_layer_bed_temperature = 60 +full_fan_speed_layer = 3 +slowdown_below_layer_time = 15 +filament_spool_weight = 0 + +[filament:addnorth ESD-PETG] +inherits = *PET* +filament_vendor = addnorth +filament_cost = 29.99 +filament_density = 1.27 +extrusion_multiplier = 1 +bed_temperature = 80 +first_layer_bed_temperature = 85 +first_layer_temperature = 245 +temperature = 265 +fan_always_on = 1 +min_fan_speed = 15 +max_fan_speed = 30 +bridge_fan_speed = 35 +slowdown_below_layer_time = 10 +min_print_speed = 15 +fan_below_layer_time = 8 +disable_fan_first_layers = 3 +full_fan_speed_layer = 0 + +[filament:addnorth OBC Polyethylene] +inherits = *FLEX* +filament_vendor = addnorth +disable_fan_first_layers = 3 +extrusion_multiplier = 1 +filament_cost = 82 +filament_density = 1.22 +temperature = 200 +bed_temperature = 100 +first_layer_temperature = 195 +first_layer_bed_temperature = 100 +slowdown_below_layer_time = 5 +fan_below_layer_time = 15 +fan_always_on = 1 +cooling = 1 +min_fan_speed = 20 +max_fan_speed = 30 +bridge_fan_speed = 40 +min_print_speed = 20 +filament_spool_weight = 0 +filament_notes = "Use Magigoo PP bed adhesive or PP packing tape (on a cold printbed)." + +[filament:addnorth PETG] +inherits = *PET* +filament_vendor = addnorth +filament_cost = 29.99 +filament_density = 1.27 +bed_temperature = 80 +first_layer_bed_temperature = 85 +first_layer_temperature = 240 +temperature = 250 +fan_always_on = 1 +min_fan_speed = 15 +max_fan_speed = 40 +bridge_fan_speed = 50 +slowdown_below_layer_time = 10 +min_print_speed = 15 +fan_below_layer_time = 15 +disable_fan_first_layers = 3 +full_fan_speed_layer = 0 +filament_spool_weight = 0 + +[filament:addnorth Rigid X] +inherits = *PET* +filament_vendor = addnorth +filament_cost = 29.99 +filament_density = 1.27 +extrusion_multiplier = 1 +bed_temperature = 85 +first_layer_bed_temperature = 90 +first_layer_temperature = 250 +temperature = 260 +fan_always_on = 1 +min_fan_speed = 20 +max_fan_speed = 60 +bridge_fan_speed = 70 +slowdown_below_layer_time = 10 +fan_below_layer_time = 20 +min_print_speed = 20 +disable_fan_first_layers = 3 +full_fan_speed_layer = 0 +filament_spool_weight = 0 +filament_notes = "Please use a nozzle that is resistant to abrasive filaments, like hardened steel." + +[filament:addnorth Textura] +inherits = *PLA* +filament_vendor = addnorth +filament_cost = 24.99 +filament_density = 1.24 +extrusion_multiplier = 0.95 +temperature = 215 +bed_temperature = 65 +first_layer_temperature = 215 +first_layer_bed_temperature = 65 +min_fan_speed = 20 +max_fan_speed = 40 +bridge_fan_speed = 60 +full_fan_speed_layer = 0 +slowdown_below_layer_time = 15 +min_print_speed = 20 +filament_spool_weight = 0 + +[filament:Filamentworld ABS] +inherits = *ABSC* +filament_vendor = Filamentworld +filament_cost = 24.9 +filament_density = 1.04 +temperature = 230 +bed_temperature = 95 +first_layer_temperature = 240 +first_layer_bed_temperature = 100 +max_fan_speed = 20 +min_fan_speed = 10 +min_print_speed = 20 +disable_fan_first_layers = 3 +fan_below_layer_time = 60 +slowdown_below_layer_time = 15 +bridge_fan_speed = 20 + +[filament:Filamentworld PETG] +inherits = *PET* +filament_vendor = Filamentworld +filament_cost = 34.9 +filament_density = 1.27 +bed_temperature = 70 +first_layer_bed_temperature = 85 +first_layer_temperature = 240 +temperature = 235 +fan_always_on = 1 +min_fan_speed = 25 +max_fan_speed = 55 +bridge_fan_speed = 55 +slowdown_below_layer_time = 20 +min_print_speed = 20 +fan_below_layer_time = 35 +disable_fan_first_layers = 2 +full_fan_speed_layer = 0 +filament_spool_weight = 0 + +[filament:Filamentworld PLA] +inherits = *PLA* +filament_vendor = Filamentworld +filament_cost = 24.9 +filament_density = 1.24 +temperature = 205 +bed_temperature = 55 +first_layer_temperature = 215 +first_layer_bed_temperature = 60 +full_fan_speed_layer = 3 +slowdown_below_layer_time = 10 +filament_spool_weight = 0 +min_print_speed = 20 + +[filament:Filament PM PETG] +inherits = *PET* +filament_vendor = Filament PM +filament_cost = 27.82 +filament_density = 1.27 +filament_spool_weight = 230 + +[filament:Generic PLA] +inherits = *PLA* +filament_vendor = Generic +filament_cost = 25.4 +filament_density = 1.24 + +[filament:3D-Fuel Standard PLA] +inherits = *PLA* +filament_vendor = 3D-Fuel +filament_cost = 22.14 +filament_density = 1.24 +first_layer_temperature = 210 +temperature = 200 + +[filament:3D-Fuel EasiPrint PLA] +inherits = 3D-Fuel Standard PLA +filament_cost = 30.44 + +[filament:3D-Fuel Pro PLA] +inherits = *PLA* +filament_vendor = 3D-Fuel +filament_cost = 26.57 +filament_density = 1.22 +first_layer_temperature = 220 +temperature = 215 + +[filament:3D-Fuel Buzzed] +inherits = 3D-Fuel Standard PLA +filament_cost = 44.27 +filament_retract_lift = 0 +first_layer_temperature = 210 +temperature = 195 + +[filament:3D-Fuel Wound up] +inherits = 3D-Fuel Buzzed +filament_cost = 44.27 +filament_retract_lift = nil +first_layer_temperature = 215 +temperature = 210 + +[filament:3D-Fuel Workday ABS] +inherits = *ABSC* +filament_vendor = 3D-Fuel +filament_cost = 23.25 +filament_density = 1.04 + +[filament:Jessie PLA] +inherits = *PLA* +filament_vendor = Printed Solid +filament_cost = 21 +filament_density = 1.24 + +[filament:Jessie PETG] +inherits = *PET* +filament_vendor = Printed Solid +filament_cost = 22 +filament_density = 1.27 +first_layer_temperature = 240 +first_layer_bed_temperature = 85 +temperature = 245 +bed_temperature = 90 + +[filament:Devil Design PLA] +inherits = *PLA* +filament_vendor = Devil Design +filament_cost = 20.99 +filament_density = 1.24 +filament_spool_weight = 250 + +[filament:Devil Design PETG] +inherits = *PET* +filament_vendor = Devil Design +filament_cost = 20.99 +filament_density = 1.23 +filament_spool_weight = 250 +first_layer_temperature = 230 +first_layer_bed_temperature = 85 +temperature = 230 +bed_temperature = 90 + +[filament:Spectrum PLA] +inherits = *PLA* +filament_vendor = Spectrum +filament_cost = 21.50 +filament_density = 1.24 + +[filament:Generic FLEX] +inherits = *FLEX* +filament_vendor = Generic +filament_cost = 82 +filament_density = 1.22 +filament_max_volumetric_speed = 1.2 +filament_retract_length = 0 +filament_retract_speed = nil +filament_retract_lift = nil + +[filament:Fillamentum Flexfill 92A] +inherits = *FLEX* +filament_vendor = Fillamentum +filament_cost = 33.99 +filament_density = 1.20 +filament_spool_weight = 230 +filament_max_volumetric_speed = 1.2 +fan_always_on = 1 +cooling = 0 +max_fan_speed = 60 +min_fan_speed = 60 +disable_fan_first_layers = 4 +full_fan_speed_layer = 6 + +[filament:AmazonBasics TPU] +inherits = *FLEX* +filament_vendor = AmazonBasics +fan_always_on = 1 +filament_max_volumetric_speed = 1.8 +extrusion_multiplier = 1.14 +first_layer_temperature = 235 +first_layer_bed_temperature = 50 +temperature = 235 +bed_temperature = 50 +bridge_fan_speed = 100 +max_fan_speed = 80 +min_fan_speed = 80 +filament_retract_before_travel = 3 +filament_cost = 19.99 +filament_density = 1.21 +disable_fan_first_layers = 4 +full_fan_speed_layer = 6 +min_print_speed = 15 +slowdown_below_layer_time = 10 +cooling = 1 + +[filament:SainSmart TPU] +inherits = *FLEX* +filament_vendor = SainSmart +fan_always_on = 1 +filament_max_volumetric_speed = 2.5 +extrusion_multiplier = 1.05 +first_layer_temperature = 230 +first_layer_bed_temperature = 50 +temperature = 230 +bed_temperature = 50 +bridge_fan_speed = 100 +max_fan_speed = 80 +min_fan_speed = 80 +filament_retract_before_travel = 3 +filament_cost = 32.99 +filament_density = 1.21 +disable_fan_first_layers = 4 +full_fan_speed_layer = 6 +min_print_speed = 15 +slowdown_below_layer_time = 10 +cooling = 1 + +[filament:NinjaTek NinjaFlex TPU] +inherits = *FLEX* +filament_vendor = NinjaTek +fan_always_on = 1 +filament_max_volumetric_speed = 1.2 +extrusion_multiplier = 1.15 +first_layer_temperature = 238 +first_layer_bed_temperature = 50 +temperature = 238 +bed_temperature = 50 +bridge_fan_speed = 75 +max_fan_speed = 60 +min_fan_speed = 60 +filament_cost = 85 +filament_density = 1.19 +disable_fan_first_layers = 1 +full_fan_speed_layer = 3 +min_print_speed = 10 +slowdown_below_layer_time = 10 +cooling = 1 + +[filament:NinjaTek Cheetah TPU] +inherits = NinjaTek NinjaFlex TPU +filament_retract_length = 1.5 +filament_density = 1.22 +filament_max_volumetric_speed = 4 +extrusion_multiplier = 1.05 +filament_retract_speed = 45 +filament_deretract_speed = 25 +first_layer_temperature = 240 +temperature = 240 + +[filament:Filatech FilaFlex40] +inherits = *FLEX* +filament_vendor = Filatech +fan_always_on = 1 +filament_max_volumetric_speed = 2.5 +extrusion_multiplier = 1.1 +first_layer_temperature = 230 +first_layer_bed_temperature = 50 +temperature = 230 +bed_temperature = 50 +bridge_fan_speed = 100 +max_fan_speed = 50 +min_fan_speed = 50 +filament_cost = 84.68 +filament_density = 1.22 +disable_fan_first_layers = 4 +full_fan_speed_layer = 6 +min_print_speed = 15 +slowdown_below_layer_time = 10 +cooling = 1 + +[filament:Filatech FilaFlex30] +inherits = Filatech FilaFlex40 +temperature = 225 +filament_density = 1.15 +extrusion_multiplier = 1.1 +filament_cost = + +[filament:Filatech FilaFlex55] +inherits = Filatech FilaFlex40 +temperature = 230 +filament_density = 1.18 +bed_temperature = 60 +fan_always_on = 0 +fan_below_layer_time = 60 +filament_cost = +first_layer_temperature = 235 +extrusion_multiplier = 1 + +[filament:Filatech TPU] +inherits = Filatech FilaFlex40 +first_layer_temperature = 230 +filament_density = 1.2 +fan_below_layer_time = 60 +max_fan_speed = 80 +min_fan_speed = 80 +fan_always_on = 1 +temperature = 235 + +[filament:Filatech ABS] +inherits = *ABSC* +filament_vendor = Filatech +filament_cost = +extrusion_multiplier = 1 +filament_density = 1.05 + +[filament:Filatech FilaCarbon] +inherits = *ABSC* +filament_vendor = Filatech +filament_cost = +extrusion_multiplier = 0.95 +filament_density = 1.1 +first_layer_bed_temperature = 100 +bed_temperature = 100 + +[filament:Filatech FilaPLA] +inherits = *PLA* +filament_vendor = Filatech +filament_cost = +filament_density = 1.3 +first_layer_temperature = 235 +first_layer_bed_temperature = 50 +temperature = 230 +bed_temperature = 55 + +[filament:Filatech PLA] +inherits = *PLA* +filament_vendor = Filatech +filament_cost = +filament_density = 1.25 +first_layer_temperature = 215 +temperature = 210 + +[filament:Filatech PLA+] +inherits = Filatech PLA +filament_density = 1.24 + +[filament:Filatech FilaTough] +inherits = Filatech ABS +filament_cost = +extrusion_multiplier = 0.95 +filament_density = 1.29 +first_layer_temperature = 245 +first_layer_bed_temperature = 80 +temperature = 240 +bed_temperature = 90 +cooling = 0 + +[filament:Filatech HIPS] +inherits = Prusa HIPS +filament_vendor = Filatech +filament_density = 1.07 +filament_spool_weight = +first_layer_temperature = 230 +first_layer_bed_temperature = 100 +temperature = 225 +bed_temperature = 100 + +[filament:Filatech PA] +inherits = *ABSC* +filament_vendor = Filatech +filament_density = 1.1 +first_layer_temperature = 275 +first_layer_bed_temperature = 105 +temperature = 275 +bed_temperature = 105 +fan_always_on = 0 +cooling = 0 +bridge_fan_speed = 25 +filament_type = PA + +[filament:Filatech PC] +inherits = Filatech PA +filament_density = 1.2 +filament_type = PC + +[filament:Filatech PC-ABS] +inherits = Filatech PC +first_layer_temperature = 270 +temperature = 270 +first_layer_bed_temperature = 105 +bed_temperature = 105 +filament_density = 1.08 +filament_type = PC +fan_always_on = 0 +cooling = 1 +extrusion_multiplier = 0.95 +disable_fan_first_layers = 6 + +[filament:Filatech PETG] +inherits = *PET* +filament_vendor = Filatech +filament_cost = +filament_density = 1.27 +first_layer_temperature = 240 +first_layer_bed_temperature = 75 +temperature = 245 +bed_temperature = 80 +extrusion_multiplier = 0.95 +fan_always_on = 0 + +[filament:Filatech Wood-PLA] +inherits = Filatech PLA +filament_density = 1.05 +first_layer_temperature = 210 + +[filament:Ultrafuse PET] +inherits = *PET* +filament_vendor = BASF +filament_density = 1.33 +filament_colour = #F7F7F7 +first_layer_temperature = 220 +first_layer_bed_temperature = 70 +temperature = 215 +bed_temperature = 70 +fan_below_layer_time = 10 +min_fan_speed = 75 +max_fan_speed = 100 +bridge_fan_speed = 100 +filament_type = PET +disable_fan_first_layers = 1 +full_fan_speed_layer = 3 +filament_notes = "Material Description\nUltrafuse PET is made from a premium PET and prints as easy as PLA, but is much stronger. The filament has a large operating window for printing (temperature vs. speed), so it can be used on every 3D-printer. PET will give you outstanding printing results: a good layer adhesion, a high resolution and it is easy to handle. Ultrafuse PET can be 100% recycled, is watertight and has great colors and finish.\n\nPrinting Recommendations:\nUltrafuse PET can be printed directly onto a clean build plate. For challenging prints, use 3dLac to improve adhesion." + +[filament:Ultrafuse PRO1] +inherits = Prusament PLA +filament_vendor = BASF +filament_cost = +filament_density = 1.25 +filament_spool_weight = 0 +filament_colour = #FFFFFF +filament_notes = "Material Description\nPLA PRO1 is an extremely versatile tough PLA filament made for professionals. It reduces your printing time by 30% – 80%, (subject to printer and object limitations) and the strength exceeds overall mechanical properties of printed ABS parts. Printer settings can be tuned to achieve blazing fast speeds or an unrivaled surface finish. The excellent quality control ensures the highest levels of consistency between colors and batches, it will perform as expected, every time.\n\nPrinting Recommendations:\nUltrafuse PLA PRO1 can be printed directly onto a clean build plate." + +[filament:Ultrafuse ABS] +inherits = *ABSC* +filament_vendor = BASF +filament_density = 1.04 +min_fan_speed = 10 +max_fan_speed = 20 +bed_temperature = 100 +disable_fan_first_layers = 3 +filament_colour = #FFFFFF +filament_notes = "Material Description\nABS is the second most used 3D printing material. It is strong, flexible and has a high heat resistance. ABS is a preferred plastic for engineers and professional applications. ABS can be smoothened with acetone. To make a proper 3D print with ABS you will need a heated print bed. The filament is available in 9 colors.\n\nPrinting Recommendations:\n\nApply Tape, adhesion spray or glue to a clean build plate to improve adhesion." + +[filament:Ultrafuse ABS Fusion+] +inherits = Ultrafuse ABS +filament_density = 1.08 +first_layer_bed_temperature = 100 +first_layer_temperature = 270 +temperature = 270 +filament_colour = #FFF8D9 +filament_notes = "Material Description\nABS Fusion+ made with Polyscope XILOY™ 3D is an engineering filament which has been optimized for 3D-printing. This special grade has been developed in collaboration with Polyscope Polymers - renowned for its material solutions in the automotive industry. ABS is a thermoplastic which is used in many applications. Although ABS has been classified as a standard material in 3D-printing it is known to be quite challenging to process. ABS Fusion+ combines the properties of ABS with an improved processability. The filament is based on an ABS grade which can be directly printed on glass without any adhesives or tape and has a higher success rate of prints due to extreme low warping." + +[filament:Ultrafuse ASA] +inherits = Ultrafuse ABS Fusion+ +filament_density = 1.07 +filament_colour = #FFF4CA +first_layer_temperature = 275 +temperature = 275 +first_layer_bed_temperature = 100 +bed_temperature = 100 +filament_type = ASA +min_fan_speed = 25 +max_fan_speed = 50 +bridge_fan_speed = 100 +disable_fan_first_layers = 4 +filament_notes = "Material Description\nUltrafuse ASA is a high-performance thermoplastic with similar mechanical properties as ABS. ASA offers additional benefits such as high outdoor weather resistance. The UV resistance, toughness, and rigidity make it an ideal material to 3D-print outdoor fixtures and appliances without losing its properties or color. When also taking into account the high heat resistance and high chemical resistance, this filament is a good choice for many types of applications.\n\nPrinting Recommendations:\nApply Magigoo PC, 3D lac or Dimafix to a clean build plate to improve adhesion." + +[filament:Ultrafuse HIPS] +inherits = Ultrafuse ABS +temperature = 250 +filament_density = 1.02 +filament_type = HIPS +min_fan_speed = 20 +max_fan_speed = 20 +filament_soluble = 1 +filament_notes = "Material Description\nUltrafuse HIPS is a high-quality engineering thermoplastic, which is well known in the 3D-printing industry as a support material for ABS. But this material has additional properties to offer like good impact resistance, good dimensional stability, and easy post-processing. HiPS is a great material to use as a support for ABS because there is a good compatibility between the two materials, and HIPS is an easy breakaway support. Now you have the opportunity to create ABS models with complex geometry. HIPS is easy to post process with glue or with sanding paper." + +[filament:Ultrafuse PA] +inherits = Fillamentum Nylon FX256 +filament_vendor = BASF +filament_density = 1.12 +filament_colour = #ECFAFF +first_layer_temperature = 240 +temperature = 240 +first_layer_bed_temperature = 80 +bed_temperature = 70 +min_fan_speed = 0 +max_fan_speed = 0 +bridge_fan_speed = 0 +fan_below_layer_time = 30 +slowdown_below_layer_time = 20 +min_print_speed = 15 +filament_notes = "Material Description\nThe key features of Ultrafuse PA are the high strength and high modulus. Furthermore, Ultrafuse PA shows a good thermal distortion stability.\n\nPrinting Recommendations:\nApply PVA glue, Kapton tape or PA adhesive to a clean buildplate to improve adhesion." + +[filament:Ultrafuse PA6 GF30] +inherits = Ultrafuse PA +filament_density = 1.17 +first_layer_temperature = 270 +temperature = 270 +first_layer_bed_temperature = 100 +bed_temperature = 100 +filament_colour = #404040 +fan_always_on = 1 +min_fan_speed = 0 +max_fan_speed = 50 +bridge_fan_speed = 100 +disable_fan_first_layers = 1 +full_fan_speed_layer = 3 +slowdown_below_layer_time = 15 +filament_notes = "Material Description\nUltrafuse® PA6 GF30 is a unique compound specifically developed for FFF printing. Due to the glass fiber content of 30%, parts tend to warp less. In addition the excellent layer adhesion and its compatibility with the water soluble support Ultrafuse® BVOH make this material the perfect solution to develop industrial applications on an FFF printer.\n\nWith its high wear and chemical resistance, high stiffness and strength, Ultrafuse® PA6 GF30 is perfect for a wide variety of applications in automotive, electronics or transportation.\n\nUltrafuse PA6 GF30 is designed for functional prototyping and demanding applications such as industrial tooling, transportation, electronics, small appliances, sports & leisure\n\nPrinting Recommendations:\nThis material contains fibers that have an abrasive effect on printer components. Use a hardened or Ruby nozzle with a diameter of 0.6 or larger for optimal performance and avoid damage to the nozzle.\n\nUltrafuse PA6 GF30 can be printed directly onto a clean build plate. For challenging prints, use Magigoo PA gluestick to improve adhesion." + +[filament:Ultrafuse PAHT-CF15] +inherits = Ultrafuse PA6 GF30 +filament_density = 1.23 +filament_notes = "Material Description\nPAHT CF15 is a high-performance 3D printing filament that opens new application fields in FFF printing. In parallel to its advanced mechanical properties, dimensional stability, and chemical resistance, it has very good processability. It works in any FFF printer with a hardened nozzle. In addition to that, it is compatible with water-soluble support material and HiPS, which allow printing complex geometries that work in challenging environments. PAHT CF15 has high heat resistance up to 130 °C and low moisture absorption.\n\nPrinting Recommendations:\nThis material contains fibers that have an abrasive effect on printer components. Use a hardened or Ruby nozzle with a diameter of 0.6 or larger for optimal performance and avoid damage to the nozzle.\n\nUltrafuse PAHT-CF can be printed directly onto a clean build plate. For challenging prints, use 3dLac to improve adhesion." + +[filament:Ultrafuse PC-ABS-FR] +inherits = Ultrafuse ABS +filament_colour = #505050 +filament_density = 1.17 +first_layer_temperature = 275 +temperature = 275 +first_layer_bed_temperature = 105 +bed_temperature = 105 +filament_type = PC +min_fan_speed = 20 +max_fan_speed = 20 +bridge_fan_speed = 30 +disable_fan_first_layers = 4 +filament_notes = "Material Description\nUltrafuse® PC/ABS FR Black is a V-0 flame retardant blend of Polycarbonate and ABS – two of the most used thermoplastics for engineering & electrical applications. The combination of these two materials results in a premium material with a mix of the excellent mechanical properties of PC and the comparably low printing temperature of ABS. Combined with a halogen free flame retardant, parts printed with Ultrafuse® PC/ABS FR Black feature great tensile and impact strength, higher thermal resistance than ABS and can fulfill the requirements of the UL94 V-0 standard.\n\nPrinting Recommendations:\nApply Magigoo PC to a clean build plate to improve adhesion." + +[filament:Ultrafuse PET-CF15] +inherits = Ultrafuse PET +filament_density = 1.36 +filament_colour = #404040 +first_layer_temperature = 270 +temperature = 270 +first_layer_bed_temperature = 75 +bed_temperature = 75 +min_fan_speed = 60 +max_fan_speed = 100 +bridge_fan_speed = 100 +disable_fan_first_layers = 1 +full_fan_speed_layer = 3 +slowdown_below_layer_time = 15 +fan_below_layer_time = 30 +filament_notes = "Material Description\nPET CF15 is a Carbon Fiber reinforced PET which has precisely tuned material properties, for a wide range of technical applications. The filament is very strong and stiff and has high heat resistance. With its high dimensional stability and low abrasiveness, the filament offers an easy to print experience which allows direct printing on glass or a PEI sheet. It is compatible with HiPS for breakaway support and water soluble support and has an excellent surface finish.\n\nPrinting Recommendations:\nThis material contains fibers that have an abrasive effect on printer components. Use a hardened or Ruby nozzle with a diameter of 0.6 or larger for optimal performance and avoid damage to the nozzle.\n\nUltrafuse PET-CF15 can be printed directly onto a clean build plate. For challenging prints, use 3dLac to improve adhesion." + +[filament:Ultrafuse PLA] +inherits = *PLA* +filament_vendor = BASF +filament_density = 1.25 +full_fan_speed_layer = 3 +filament_notes = "Material Description\nPLA is one of the most used materials for 3D printing. Ultrafuse PLA is available in a wide range of colors. The glossy feel often attracts those who print display models or items for household use. Many appreciate the plant-based origin of this material. When properly cooled, PLA has a high maximum printing speed and sharp printed corners. Combining this with low warping of the print makes it a popular plastic for home printers, hobbyists, prototyping and schools.\n\nPrinting Recommendations:\nUltrafuse PLA can be printed directly onto a clean build plate." + +[filament:Ultrafuse PP] +inherits = Ultrafuse ABS +filament_density = 0.91 +filament_colour = #F0F0F0 +first_layer_temperature = 240 +temperature = 240 +first_layer_bed_temperature = 80 +bed_temperature = 70 +min_fan_speed = 100 +max_fan_speed = 100 +bridge_fan_speed = 100 +disable_fan_first_layers = 1 +full_fan_speed_layer = 3 +fan_below_layer_time = 60 +slowdown_below_layer_time = 20 +min_print_speed = 10 +filament_type = PP +filament_max_volumetric_speed = 2.5 +filament_notes = "Material Description\nUltrafuse PP is high-performance thermoplastic with low density, high elasticity and high resistance to fatigue. The mechanical properties make it an ideal material for 3D-printing applications which have to endure high stress or strain. The filament has high chemical resistance and a high isolation value. PP is one of the most used materials in the world, due to its versatility and ability to engineer lightweight tough parts.\n\nPrinting Recommendations:\nApply PP tape or Magigoo PP adhesive to the buildplate for optimal adhesion." + +[filament:Ultrafuse PP-GF30] +inherits = Ultrafuse PP +filament_density = 1.07 +filament_colour = #404040 +first_layer_temperature = 260 +temperature = 250 +first_layer_bed_temperature = 90 +bed_temperature = 40 +min_fan_speed = 40 +max_fan_speed = 75 +fan_always_on = 1 +fan_below_layer_time = 30 +slowdown_below_layer_time = 15 +min_print_speed = 15 +filament_notes = "Ultrafuse PP GF30 is polypropylene, reinforced with 30% glass fiber content. The fibers in this compound are specially designed for 3D-printing filaments and are compatible with a wide range of standard FFF 3D-printers. The extreme stiffness makes this material highly suitable for demanding applications. Other key properties of PPGF30 are high heat resistance and improved UV-resistance. All these excellent properties make this filament highly suitable in an industrial environment.\n\nPrinting Recommendations:\nThis material contains fibers that have an abrasive effect on printer components. Use a hardened or Ruby nozzle with a diameter of 0.6 or larger for optimal performance and avoid damage to the nozzle.\n\nApply PP strapping tape or PPGF adhesive to a clean build plate for optimal adhesion." + +[filament:Ultrafuse TPC-45D] +inherits = *FLEX* +filament_vendor = BASF +extrusion_multiplier = 1 +filament_density = 1.15 +filament_colour = #0035EC +first_layer_temperature = 235 +temperature = 235 +first_layer_bed_temperature = 60 +bed_temperature = 60 +min_fan_speed = 10 +max_fan_speed = 50 +bridge_fan_speed = 80 +fan_below_layer_time = 30 +slowdown_below_layer_time = 15 +min_print_speed = 15 +fan_always_on = 1 +cooling = 1 +filament_max_volumetric_speed = 1.2 +filament_notes = "Material Description\nTPC 45D is a flexible, shore 45D, rubber-like Thermoplastic Copolyester Elastomer (TPE-C), which is derived from rapeseed oil and combines the best properties of elastomers (rubbers) and polyesters. The material delivers excellent adhesion in the Z-direction, meaning that the printed layers do not detach - even with extreme deformation.\n\nPrinting Recommendations:\nApply Magigoo Flex to a clean build plate to improve adhesion." + +[filament:Ultrafuse TPU-64D] +inherits = Ultrafuse TPC-45D +filament_density = 1.16 +first_layer_temperature = 230 +temperature = 225 +first_layer_bed_temperature = 40 +bed_temperature = 40 +min_fan_speed = 20 +max_fan_speed = 100 +filament_notes = "Material Description\nUltrafuse® TPU 64D is the hardest elastomer in BASF Forward AM’s flexible productline. The material shows a relatively high rigidity while maintaining a certain flexibility. This filament is the perfect match for industrial applications requiring rigid parts being resistant to impact, wear and tear. Due to its property profile, the material can be used as an alternative for parts made from ABS and rubbers. Ultrafuse® TPU 64D is easy to print on direct drive and bowden style printers and is compatible with soluble BVOH support to realize the most complex geometries.\n\nPrinting Recommendations:\nUltrafuse TPU can be printed directly onto a clean build plate. A small amount of 3Dlac can make removal easier after printing." + +[filament:Ultrafuse TPU-85A] +inherits = Ultrafuse TPU-64D +filament_density = 1.11 +first_layer_temperature = 225 +temperature = 220 +filament_notes = "Material Description\nUltrafuse® TPU 85A comes in its natural white color. Chemical properties (e.g. resistance against particular substances) and tolerance for solvents can be made available, if these factors are relevant for a specific application. Generally, these properties correspond to publicly available data on polyether based TPUs. This material is not FDA conform. Good flexibility at low temperature, good wear performance and good damping behavior are the key features of Ultrafuse® TPU 85A.\n\nPrinting Recommendations:\nUltrafuse TPU can be printed directly onto a clean build plate. A small amount of 3Dlac can make removal easier after printing." + +[filament:Ultrafuse TPU-95A] +inherits = Ultrafuse TPU-85A +filament_density = 1.14 +first_layer_temperature = 230 +temperature = 225 +filament_notes = "Material Description\nUltrafuse® TPU 95A comes with a well-balanced profile of flexibility and durability. On top of that, it allows for easier and faster printing then softer TPU grades. Parts printed with Ultrafuse® TPU 95A show a high elongation, good impact resistance, excellent layer adhesion and a good resistance to oils and common industrially used chemicals. Due to its good printing behavior, Ultrafuse® TPU 95A is a good choice for starting printing flexible materials on both direct drive and bowden style printers.\n\nPrinting Recommendations:\nUltrafuse TPU can be printed directly onto a clean build plate. A small amount of 3Dlac can make removal easier after printing." + +[filament:Ultrafuse rPET] +inherits = Ultrafuse PET +filament_density = 1.27 +filament_colour = #9DC5FF +first_layer_temperature = 235 +temperature = 235 +first_layer_bed_temperature = 80 +bed_temperature = 75 +min_fan_speed = 50 +max_fan_speed = 100 +fan_below_layer_time = 15 +filament_notes = "Material Description\nPET is mainly known by the well-known PET bottle material. This recycled has a natural transparent blueish look. It has excellent 3D printing properties and good mechanical characteristics." + +[filament:Ultrafuse Metal] +inherits = *ABSC* +filament_vendor = BASF +filament_density = 4.5 +extrusion_multiplier = 1.08 +first_layer_temperature = 250 +first_layer_bed_temperature = 100 +temperature = 250 +bed_temperature = 100 +min_fan_speed = 0 +max_fan_speed = 0 +bridge_fan_speed = 0 +cooling = 0 +fan_always_on = 0 +filament_max_volumetric_speed = 4 +filament_type = METAL +compatible_printers_condition = nozzle_diameter[0]>=0.4 +filament_colour = #FFFFFF + +[filament:Polymaker PC-Max] +inherits = *ABS* +filament_vendor = Polymaker +filament_cost = 77.3 +filament_density = 1.20 +filament_type = PC +bed_temperature = 115 +filament_colour = #FFF2EC +first_layer_bed_temperature = 100 +first_layer_temperature = 270 +temperature = 270 +bridge_fan_speed = 0 + +[filament:PrimaSelect PVA+] +inherits = *PLA* +filament_vendor = PrimaSelect +filament_cost = 122.1 +filament_density = 1.23 +cooling = 0 +fan_always_on = 0 +filament_colour = #FFFFD7 +filament_soluble = 1 +filament_type = PVA +first_layer_temperature = 195 +temperature = 195 + +[filament:Prusa ABS] +inherits = *ABSC* +filament_vendor = Made for Prusa +filament_cost = 27.82 +filament_density = 1.08 +filament_spool_weight = 230 + +[filament:Prusa HIPS] +inherits = Generic HIPS +filament_vendor = Made for Prusa +first_layer_temperature = 220 +temperature = 220 + +[filament:Generic HIPS] +inherits = *ABS* +filament_vendor = Generic +filament_cost = 27.3 +filament_density = 1.04 +bridge_fan_speed = 50 +cooling = 1 +extrusion_multiplier = 1 +fan_always_on = 1 +fan_below_layer_time = 10 +filament_colour = #FFFFD7 +filament_soluble = 1 +filament_type = HIPS +first_layer_temperature = 230 +max_fan_speed = 20 +min_fan_speed = 20 +temperature = 230 +compatible_printers_condition = nozzle_diameter[0]!=0.8 and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) + +[filament:Prusa PETG] +inherits = *PET* +filament_vendor = Made for Prusa +filament_cost = 27.82 +filament_density = 1.27 +filament_spool_weight = 230 + +[filament:Verbatim PETG] +inherits = *PET* +filament_vendor = Verbatim +filament_cost = 27.90 +filament_density = 1.27 +filament_spool_weight = 235 + +[filament:Prusament PETG] +inherits = *PET* +filament_vendor = Prusa Polymers +first_layer_temperature = 240 +temperature = 250 +filament_cost = 36.29 +filament_density = 1.27 +filament_spool_weight = 201 +filament_type = PETG + +[filament:Prusament PETG Carbon Fiber] +inherits = Prusament PETG +filament_vendor = Prusa Polymers +first_layer_temperature = 260 +temperature = 265 +extrusion_multiplier = 1.03 +filament_cost = 54.99 +filament_density = 1.27 +filament_colour = #BBBBBB + +[filament:Prusa PLA] +inherits = *PLA* +filament_vendor = Made for Prusa +filament_cost = 27.82 +filament_density = 1.24 +filament_spool_weight = 230 + +[filament:Eolas Prints PLA] +inherits = *PLA* +filament_vendor = Eolas Prints +filament_cost = 23.50 +filament_density = 1.24 +filament_spool_weight = 0 +filament_colour = #4D9398 +temperature = 208 + +[filament:Eolas Prints PLA Matte] +inherits = Eolas Prints PLA +filament_cost = 25.50 +temperature = 212 + +[filament:Eolas Prints INGEO 850] +inherits = Eolas Prints PLA +filament_cost = 25.90 +temperature = 210 + +[filament:Eolas Prints INGEO 870] +inherits = Eolas Prints PLA +filament_cost = 25.90 +temperature = 215 +first_layer_bed_temperature = 68 +first_layer_temperature = 220 +bed_temperature = 65 + +[filament:Eolas Prints PETG] +inherits = *PET* +filament_vendor = Eolas Prints +filament_cost = 29.90 +filament_density = 1.27 +filament_spool_weight = 0 +filament_colour = #4D9398 +temperature = 240 +first_layer_bed_temperature = 85 +first_layer_temperature = 235 +bed_temperature = 90 + +[filament:Eolas Prints PETG - UV Resistant] +inherits = Eolas Prints PETG +filament_cost = 35.90 +temperature = 237 +first_layer_temperature = 232 + +[filament:Eolas Prints TPU 93A] +inherits = *FLEX* +filament_vendor = Eolas Prints +filament_cost = 34.99 +filament_density = 1.21 +filament_colour = #4D9398 +filament_max_volumetric_speed = 1.2 +temperature = 235 +first_layer_bed_temperature = 30 +bed_temperature = 30 +filament_retract_length = 0 +extrusion_multiplier = 1.16 + +[filament:Fiberlogy Easy PLA] +inherits = *PLA* +filament_vendor = Fiberlogy +filament_cost = 20 +filament_density = 1.24 +first_layer_temperature = 220 +temperature = 220 +filament_spool_weight = 330 + +[filament:Fiberlogy Easy PET-G] +inherits = *PET* +filament_vendor = Fiberlogy +filament_spool_weight = 330 +filament_cost = 20 +filament_density = 1.27 +first_layer_bed_temperature = 80 +bed_temperature = 80 +first_layer_temperature = 235 +temperature = 235 +min_fan_speed = 15 +max_fan_speed = 30 +bridge_fan_speed = 60 +disable_fan_first_layers = 5 +full_fan_speed_layer = 5 +slowdown_below_layer_time = 15 + +[filament:Fiberlogy ASA] +inherits = *ABS* +filament_vendor = Fiberlogy +filament_cost = 33 +filament_density = 1.07 +filament_spool_weight = 330 +fan_always_on = 0 +cooling = 1 +min_fan_speed = 10 +max_fan_speed = 15 +bridge_fan_speed = 30 +min_print_speed = 15 +slowdown_below_layer_time = 15 +first_layer_temperature = 260 +temperature = 260 +first_layer_bed_temperature = 100 +bed_temperature = 100 +filament_type = ASA +fan_below_layer_time = 30 +disable_fan_first_layers = 5 + +[filament:Fiberlogy Easy ABS] +inherits = Fiberlogy ASA +filament_cost = 22.67 +filament_density = 1.09 +fan_always_on = 0 +cooling = 1 +min_fan_speed = 10 +max_fan_speed = 15 +min_print_speed = 15 +slowdown_below_layer_time = 15 +first_layer_temperature = 250 +temperature = 250 +first_layer_bed_temperature = 100 +bed_temperature = 100 +filament_type = ABS +fan_below_layer_time = 25 +disable_fan_first_layers = 5 + +[filament:Fiberlogy CPE HT] +inherits = *PET* +filament_vendor = Fiberlogy +filament_cost = 42.67 +filament_density = 1.18 +extrusion_multiplier = 0.98 +filament_spool_weight = 330 +fan_always_on = 1 +cooling = 1 +min_fan_speed = 0 +max_fan_speed = 0 +bridge_fan_speed = 50 +min_print_speed = 15 +first_layer_temperature = 275 +temperature = 275 +first_layer_bed_temperature = 105 +bed_temperature = 105 +filament_type = CPE +fan_below_layer_time = 20 +slowdown_below_layer_time = 15 +disable_fan_first_layers = 5 + +[filament:Fiberlogy PCTG] +inherits = Fiberlogy CPE HT +filament_cost = 29.41 +filament_density = 1.23 +extrusion_multiplier = 1 +min_fan_speed = 10 +max_fan_speed = 15 +first_layer_temperature = 265 +temperature = 265 +first_layer_bed_temperature = 90 +bed_temperature = 90 +filament_type = PCTG + +[filament:Fiberlogy FiberFlex 40D] +inherits = *FLEX* +filament_vendor = Fiberlogy +fan_always_on = 1 +filament_max_volumetric_speed = 1.5 +extrusion_multiplier = 1.12 +first_layer_temperature = 230 +first_layer_bed_temperature = 60 +temperature = 230 +bed_temperature = 60 +bridge_fan_speed = 75 +min_fan_speed = 25 +max_fan_speed = 75 +filament_cost = 39.41 +filament_density = 1.16 +disable_fan_first_layers = 5 +full_fan_speed_layer = 5 +min_print_speed = 15 +cooling = 1 +filament_spool_weight = 330 + +[filament:Fiberlogy MattFlex 40D] +inherits = Fiberlogy FiberFlex 40D +filament_vendor = Fiberlogy +fan_always_on = 1 +filament_max_volumetric_speed = 1.35 +extrusion_multiplier = 1.1 +filament_cost = 49.11 + +[filament:Fiberlogy FiberFlex 30D] +inherits = Fiberlogy FiberFlex 40D +filament_max_volumetric_speed = 1.2 +extrusion_multiplier = 1.15 +first_layer_temperature = 240 +temperature = 240 +min_fan_speed = 25 +max_fan_speed = 60 +filament_density = 1.07 + +[filament:Fiberlogy FiberSatin] +inherits = Fiberlogy Easy PLA +first_layer_temperature = 215 +temperature = 215 +extrusion_multiplier = 1 +filament_density = 1.2 +filament_cost = 32.35 + +[filament:Fiberlogy FiberSilk] +inherits = Fiberlogy FiberSatin +first_layer_temperature = 230 +temperature = 230 +extrusion_multiplier = 0.97 +filament_density = 1.22 +filament_cost = 32.35 + +[filament:Fiberlogy FiberWood] +inherits = Fiberlogy Easy PLA +first_layer_temperature = 185 +temperature = 185 +extrusion_multiplier = 1 +filament_density = 1.23 +filament_cost = 38.66 + +[filament:Fiberlogy HD PLA] +inherits = Fiberlogy Easy PLA +first_layer_temperature = 230 +temperature = 230 +extrusion_multiplier = 1 +filament_density = 1.24 +filament_cost = 30.59 + +[filament:Fiberlogy PLA Mineral] +inherits = Fiberlogy Easy PLA +first_layer_temperature = 195 +temperature = 190 +extrusion_multiplier = 0.98 +filament_density = 1.38 +filament_cost = 37.64 + +[filament:Fiberlogy Impact PLA] +inherits = Fiberlogy HD PLA +filament_density = 1.22 +filament_cost = 27.65 + +[filament:Fiberlogy Nylon PA12] +inherits = Fiberlogy ASA +filament_type = PA +filament_density = 1.01 +filament_cost = 48 +first_layer_bed_temperature = 105 +bed_temperature = 105 +first_layer_temperature = 265 +temperature = 265 +min_fan_speed = 10 +max_fan_speed = 15 +fan_below_layer_time = 20 +bridge_fan_speed = 30 +fan_always_on = 0 + +[filament:Fiberlogy Nylon PA12+CF15] +inherits = Fiberlogy Nylon PA12 +extrusion_multiplier = 0.97 +filament_density = 1.07 +filament_cost = 87.5 +first_layer_bed_temperature = 105 +bed_temperature = 105 +first_layer_temperature = 265 +temperature = 265 +min_fan_speed = 10 +max_fan_speed = 15 +fan_below_layer_time = 20 +bridge_fan_speed = 30 +fan_always_on = 0 + +[filament:Fiberlogy Nylon PA12+GF15] +inherits = Fiberlogy Nylon PA12+CF15 +filament_density = 1.13 + +[filament:Fiberlogy PP] +inherits = *ABS* +filament_vendor = Fiberlogy +filament_cost = 36.67 +filament_density = 1.05 +extrusion_multiplier = 1.05 +filament_spool_weight = 330 +fan_always_on = 1 +cooling = 1 +min_fan_speed = 0 +max_fan_speed = 25 +bridge_fan_speed = 70 +min_print_speed = 15 +slowdown_below_layer_time = 15 +first_layer_temperature = 245 +temperature = 245 +first_layer_bed_temperature = 0 +bed_temperature = 0 +filament_type = PP +fan_below_layer_time = 100 +disable_fan_first_layers = 5 +filament_max_volumetric_speed = 5 + +[filament:Filament PM PLA] +inherits = *PLA* +filament_vendor = Filament PM +filament_cost = 27.82 +filament_density = 1.24 +filament_spool_weight = 230 + +[filament:AmazonBasics PLA] +inherits = *PLA* +filament_vendor = AmazonBasics +filament_cost = 25.4 +filament_density = 1.24 + +[filament:Overture PLA] +inherits = *PLA* +filament_vendor = Overture +filament_cost = 22 +filament_density = 1.24 +filament_spool_weight = 235 + +[filament:Hatchbox PLA] +inherits = *PLA* +filament_vendor = Hatchbox +filament_cost = 25.4 +filament_density = 1.27 +filament_spool_weight = 245 + +[filament:Esun PLA] +inherits = *PLA* +filament_vendor = Esun +filament_cost = 25.4 +filament_density = 1.24 +filament_spool_weight = 265 + +[filament:Das Filament PLA] +inherits = *PLA* +filament_vendor = Das Filament +filament_cost = 25.4 +filament_density = 1.24 + +[filament:EUMAKERS PLA] +inherits = *PLA* +filament_vendor = EUMAKERS +filament_cost = 25.4 +filament_density = 1.24 + +[filament:Floreon3D PLA] +inherits = *PLA* +filament_vendor = Floreon3D +filament_cost = 25.4 +filament_density = 1.24 + +[filament:Prusament PLA] +inherits = *PLA* +filament_vendor = Prusa Polymers +temperature = 215 +filament_cost = 36.29 +filament_density = 1.24 +filament_spool_weight = 201 +filament_notes = "Affordable filament for everyday printing in premium quality manufactured in-house by Josef Prusa" + +[filament:Prusament PVB] +inherits = *PLA* +filament_vendor = Prusa Polymers +temperature = 215 +bed_temperature = 75 +first_layer_bed_temperature = 75 +filament_cost = 60.48 +filament_density = 1.09 +filament_spool_weight = 201 +filament_max_volumetric_speed = 8 +filament_type = PVB +filament_soluble = 1 +filament_colour = #FFFF6F +slowdown_below_layer_time = 20 + +[filament:Fillamentum Flexfill 98A] +inherits = *FLEX* +filament_vendor = Fillamentum +filament_cost = 82.26 +filament_density = 1.23 +filament_spool_weight = 230 +extrusion_multiplier = 1.1 +filament_max_volumetric_speed = 1.5 +fan_always_on = 1 +cooling = 0 +max_fan_speed = 60 +min_fan_speed = 60 +disable_fan_first_layers = 4 +full_fan_speed_layer = 6 + +[filament:ColorFabb VarioShore TPU] +inherits = Fillamentum Flexfill 98A +filament_vendor = ColorFabb +filament_colour = #BBBBBB +filament_cost = 71.35 +filament_density = 1.22 +filament_spool_weight = 0 +extrusion_multiplier = 0.85 +first_layer_temperature = 220 +temperature = 220 + +[filament:Taulman Bridge] +inherits = *common* +filament_vendor = Taulman +filament_cost = 40 +filament_density = 1.13 +bed_temperature = 110 +bridge_fan_speed = 40 +cooling = 0 +disable_fan_first_layers = 3 +fan_always_on = 0 +fan_below_layer_time = 20 +filament_colour = #DEE0E6 +filament_soluble = 0 +filament_type = PA +first_layer_bed_temperature = 90 +first_layer_temperature = 260 +temperature = 260 +max_fan_speed = 0 +min_fan_speed = 0 +filament_max_volumetric_speed = 6 + +[filament:Fillamentum Nylon FX256] +inherits = *common* +filament_vendor = Fillamentum +filament_cost = 56.99 +filament_density = 1.01 +filament_spool_weight = 230 +bed_temperature = 90 +bridge_fan_speed = 30 +cooling = 1 +disable_fan_first_layers = 6 +fan_always_on = 0 +fan_below_layer_time = 20 +min_print_speed = 15 +slowdown_below_layer_time = 20 +filament_colour = #DEE0E6 +filament_max_volumetric_speed = 6 +filament_soluble = 0 +filament_type = PA +first_layer_bed_temperature = 90 +first_layer_temperature = 250 +max_fan_speed = 0 +min_fan_speed = 0 +temperature = 250 + +[filament:Fiberthree F3 PA Pure Pro] +inherits = *common* +filament_vendor = Fiberthree +filament_cost = 200.84 +filament_density = 1.2 +bed_temperature = 90 +first_layer_bed_temperature = 90 +first_layer_temperature = 285 +temperature = 285 +bridge_fan_speed = 30 +cooling = 1 +disable_fan_first_layers = 3 +fan_always_on = 1 +fan_below_layer_time = 20 +min_print_speed = 15 +slowdown_below_layer_time = 10 +filament_colour = #DEE0E6 +filament_max_volumetric_speed = 5 +filament_soluble = 0 +filament_type = PA +max_fan_speed = 20 +min_fan_speed = 20 + +[filament:Fiberthree F3 PA-CF Pro] +inherits = *common* +filament_vendor = Fiberthree +filament_cost = 208.1 +filament_density = 1.25 +bed_temperature = 90 +first_layer_bed_temperature = 90 +first_layer_temperature = 285 +temperature = 285 +bridge_fan_speed = 30 +cooling = 1 +disable_fan_first_layers = 3 +fan_always_on = 0 +fan_below_layer_time = 20 +min_print_speed = 15 +slowdown_below_layer_time = 10 +filament_colour = #DEE0E6 +filament_max_volumetric_speed = 5 +filament_soluble = 0 +filament_type = PA +max_fan_speed = 0 +min_fan_speed = 0 + +[filament:Fiberthree F3 PA-GF Pro] +inherits = Fiberthree F3 PA-CF Pro +filament_vendor = Fiberthree +filament_cost = 205.68 +filament_density = 1.27 +fan_always_on = 1 +max_fan_speed = 15 +min_fan_speed = 15 + +[filament:Fiberthree F3 PA-GF30 Pro] +inherits = Prusament PC Blend Carbon Fiber +filament_vendor = Fiberthree +filament_cost = 208.01 +filament_density = 1.35 +extrusion_multiplier = 1.03 +first_layer_temperature = 275 +temperature = 285 +first_layer_bed_temperature = 90 +bed_temperature = 90 +fan_below_layer_time = 10 +max_fan_speed = 15 +min_fan_speed = 15 +filament_type = PA + +[filament:Taulman T-Glase] +inherits = *PET* +filament_vendor = Taulman +filament_cost = 40 +filament_density = 1.27 +bridge_fan_speed = 40 +cooling = 0 +fan_always_on = 0 +first_layer_bed_temperature = 90 +first_layer_temperature = 240 +max_fan_speed = 5 +min_fan_speed = 0 + +[filament:Verbatim PLA] +inherits = *PLA* +filament_vendor = Verbatim +filament_cost = 42.99 +filament_density = 1.24 +filament_spool_weight = 235 + +[filament:Verbatim BVOH] +inherits = *common* +filament_vendor = Verbatim +filament_cost = 193.58 +filament_density = 1.14 +filament_spool_weight = 235 +bed_temperature = 60 +bridge_fan_speed = 100 +cooling = 0 +disable_fan_first_layers = 1 +extrusion_multiplier = 1 +fan_always_on = 0 +fan_below_layer_time = 100 +filament_colour = #FFFFD7 +filament_soluble = 1 +filament_type = PVA +first_layer_bed_temperature = 60 +first_layer_temperature = 215 +max_fan_speed = 100 +min_fan_speed = 100 +temperature = 210 + +[filament:Verbatim PP] +inherits = *common* +filament_vendor = Verbatim +filament_cost = 72 +filament_density = 0.89 +filament_spool_weight = 235 +bed_temperature = 100 +bridge_fan_speed = 100 +cooling = 1 +disable_fan_first_layers = 2 +extrusion_multiplier = 1 +fan_always_on = 1 +fan_below_layer_time = 100 +filament_colour = #DEE0E6 +filament_max_volumetric_speed = 5 +filament_type = PP +first_layer_bed_temperature = 100 +first_layer_temperature = 220 +max_fan_speed = 100 +min_fan_speed = 100 +temperature = 220 + +[filament:FormFutura Centaur PP] +inherits = *common* +filament_vendor = FormFutura +filament_cost = 70 +filament_density = 0.89 +filament_spool_weight = 212 +bridge_fan_speed = 100 +cooling = 1 +disable_fan_first_layers = 2 +extrusion_multiplier = 1.05 +fan_always_on = 1 +fan_below_layer_time = 100 +filament_colour = #DEE0E6 +filament_max_volumetric_speed = 4 +filament_type = PP +first_layer_bed_temperature = 85 +bed_temperature = 85 +first_layer_temperature = 235 +max_fan_speed = 70 +min_fan_speed = 70 +temperature = 235 +filament_wipe = 0 +filament_retract_lift = 0 \ No newline at end of file diff --git a/resources/profiles/TriLAB.idx b/resources/profiles/TriLAB.idx index 3e2a7c824f7..9ba40c9fc67 100644 --- a/resources/profiles/TriLAB.idx +++ b/resources/profiles/TriLAB.idx @@ -1,7 +1,4 @@ -min_slic3r_version = 2.5.2-alpha0 -1.0.4 Added new printer AzteQ Dynamic, Added AzteQ Dynamic material profiles for Prusament ASA, Prusa EasyABS, Prusament PLA, Prusament PETG, Smartfil PLA, Prusament PETG Carbon Fiber, Added AzteQ Industrial material profiles for Prusa EasyABS, Filament PM PAJet 160, Prusament PLA, Prusament PETG, Prusament PA11 Carbon Fiber, Smartfil PLA, Prusament PETG Carbon Fiber, Added DeltiQ 2 material profiles for Prusament PA11 Carbon Fiber, Prusament PC Blend Carbon Fiber, Prusament PETG, Fiberlogy Nylon PA12+CF15, Fiberlogy Nylon PA12+GF15, Prusament PVB, Prusament PC Blend Carbon Fiber 0.6 nozzle, Fiberlogy Nylon PA12+CF15 0.6 nozzle, Fiberlogy Nylon PA12+GF15 0.6 nozzle, Added FlexPrint 2 material profiles for Fiberlogy PP, NinjaTek TPU 75D, Changing the names of materials, Some minor print styles improvements min_slic3r_version = 2.5.0-alpha0 -1.0.3 Added DeltiQ 2 materials PETG (Prusa Polymers), PA11 Carbon Fiber (Prusa Polymers), PC Blend Carbon Fiber (Prusa Polymers), Improved DeltiQ 2 material PLA Prusament, Improved output filename template(added filament used weight, fixed timestamp, fixed invalid printhead code) 1.0.2 Added home to start gcode before heating bed, added DeltiQ 2 material PLA Prusament, fixed gcode for pause print, improved output filename template(added printhead code, added filament used length, truncated timestamp) min_slic3r_version = 2.4.1-rc1 1.0.1 Fix missing AzteQ Industrial ABS material for 0.6, 0.8 nozzle, enabled elefant foot compensation diff --git a/resources/profiles/TriLAB.ini b/resources/profiles/TriLAB.ini index 05c734f8ed9..62ddd94a23f 100644 --- a/resources/profiles/TriLAB.ini +++ b/resources/profiles/TriLAB.ini @@ -6,7 +6,7 @@ name = TriLAB # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 1.0.4 +config_version = 1.0.2 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/TriLAB/ # changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% @@ -22,16 +22,7 @@ technology = FFF family = AzteQ bed_model = aq_bed.stl bed_texture = aq_bed_texture.svg -default_materials = Fillamentum PLA (Door Opened) @AQI;Generic PLA (Door Opened) @AQI;Fillamentum PLA (PLA Printhead) @AQI;Fillamentum ABS @AQI;Generic ABS @AQI;Fillamentum ASA @AQI;Generic ASA @AQI;Prusament ASA @AQI;Fiberlogy Nylon PA12 @AQI;Prusament PC Blend @AQI;Polymaker PC @AQI;Polymaker PC @AQI 0.6 nozzle;Fillamentum PC/ABS @AQI;Fillamentum PC/ABS @AQI 0.6 nozzle;Fillamentum Nylon FX256 @AQI;Fillamentum Nylon FX256 @AQI 0.6 nozzle;Generic ABS @AQI 0.8 nozzle;Fillamentum ABS @AQI 0.8 nozzle;Fillamentum ASA @AQI 0.8 nozzle;Prusament ASA @AQI 0.8 nozzle;Prusament PC Blend @AQI 0.8 nozzle;Prusa EasyABS @AQI;Filament PM PAJet 160 @AQI;Prusament PLA (Door Opened) @AQI;Prusament PETG @AQI;Prusament PA11 Carbon Fiber @AQI;Smartfil PLA (Door Opened) @AQI;Prusament PETG Carbon Fiber @AQI - -[printer_model:AQD] -name = AzteQ Dynamic -variants = 0.4 -technology = FFF -family = AzteQ -bed_model = aq_bed.stl -bed_texture = aq_bed_texture.svg -default_materials = Prusament ASA @AQD; Prusa EasyABS @AQD;Prusament PLA (Door Opened) @AQD;Prusament PETG @AQD;Smartfil PLA (Door Opened) @AQD;Prusament PETG Carbon Fiber @AQD +default_materials = AzteQ Industrial (Door Opened) - PLA - ExtraFill (Fillamentum);AzteQ Industrial (Door Opened) - PLA - Generic;AzteQ Industrial (PLA Printhead) - PLA - ExtraFill (Fillamentum);AzteQ Industrial - ABS - ExtraFill (Fillamentum);AzteQ Industrial - ABS - Generic;AzteQ Industrial - ASA - ExtraFill (Fillamentum);AzteQ Industrial - ASA - Generic;AzteQ Industrial - ASA - Prusament (Prusa Polymers);AzteQ Industrial - PA - Nylon PA12 (Fiberlogy);AzteQ Industrial - PC Blend - Prusament (Prusa Polymers);AzteQ Industrial - PC - PolyMax (Polymaker);AzteQ Industrial - PC - PolyMax (Polymaker) @0.6 nozzle;AzteQ Industrial - PC/ABS - (Fillamentum);AzteQ Industrial - PC/ABS - (Fillamentum) @0.6 nozzle;AzteQ Industrial - PA - Nylon FX256 (Fillamentum);AzteQ Industrial - PA - Nylon FX256 (Fillamentum) @0.6 nozzle;AzteQ Industrial - ABS - Generic @0.8 nozzle;AzteQ Industrial - ABS - ExtraFill (Fillamentum) @0.8 nozzle;AzteQ Industrial - ASA - ExtraFill (Fillamentum) @0.8 nozzle;AzteQ Industrial - ASA - Prusament (Prusa Polymers) @0.8 nozzle;AzteQ Industrial - PC Blend - Prusament (Prusa Polymers) @0.8 nozzle [printer_model:DQ2] name = DeltiQ 2 @@ -40,7 +31,7 @@ technology = FFF family = DeltiQ 2 bed_model = dq2_bed.stl bed_texture = dq2_bed_texture.svg -default_materials = Generic PLA @DQ2;Prusament PLA @DQ2;Fillamentum PLA @DQ2;Generic PETG @DQ2;Devil Design PETG @DQ2;Generic ABS @DQ2;Fillamentum ABS @DQ2;Fillamentum ASA @DQ2;Spectrum ASA @DQ2;Fillamentum CPE HG100 @DQ2;Fillamentum PLA @DQ2 0.25 nozzle;Devil Design PETG @DQ2 0.25 nozzle;Prusament PLA @DQ2 0.6 nozzle;Fillamentum PLA @DQ2 0.6 nozzle;Devil Design PETG @DQ2 0.6 nozzle;Fillamentum ABS @DQ2 0.6 nozzle;Fillamentum ASA @DQ2 0.6 nozzle;Spectrum ASA @DQ2 0.6 nozzle;Fillamentum CPE HG100 @DQ2 0.6 nozzle;Prusament PLA @DQ2 0.8 nozzle;Fillamentum PLA @DQ2 0.8 nozzle;Devil Design PETG @DQ2 0.8 nozzle;Fiberlogy Nylon PA12 @DQ2;Fillamentum Nylon CF15 @DQ2;Wax-Alike MoldLay @DQ2;Prusament PA11 Carbon Fiber @DQ2;Prusament PC Blend Carbon Fiber @DQ2;Prusament PETG @DQ2;Fiberlogy Nylon PA12+CF15 @DQ2;Fiberlogy Nylon PA12+GF15 @DQ2;Prusament PVB @DQ2;Prusament PC Blend Carbon Fiber @DQ2 0.6 nozzle;Fiberlogy Nylon PA12+CF15 @DQ2 0.6 nozzle;Fiberlogy Nylon PA12+GF15 @DQ2 0.6 nozzle +default_materials = DeltiQ - PLA - Generic;DeltiQ - PLA - Prusament (Prusa Polymers); DeltiQ - PLA - ExtraFill (Fillamentum);DeltiQ - PETG - Generic;DeltiQ - PETG (Devil Design);DeltiQ - ABS - Generic;DeltiQ - ABS - ExtraFill (Fillamentum);DeltiQ - ASA - ExtraFill (Fillamentum);DeltiQ - ASA - ASA 275 (Spectrum);DeltiQ - CPE - HG100 (Fillamentum);DeltiQ - PLA - ExtraFill (Fillamentum) @0.25 nozzle;DeltiQ - PETG (Devil Design) @0.25 nozzle;DeltiQ - PLA - Prusament (Prusa Polymers) @0.6 nozzle;DeltiQ - PLA - ExtraFill (Fillamentum) @0.6 nozzle;DeltiQ - PETG (Devil Design) @0.6 nozzle;DeltiQ - ABS - ExtraFill (Fillamentum) @0.6 nozzle;DeltiQ - ASA - ExtraFill (Fillamentum) @0.6 nozzle;DeltiQ - ASA - ASA 275 (Spectrum) @0.6 nozzle;DeltiQ - CPE - HG100 (Fillamentum) @0.6 nozzle;DeltiQ - PLA - Prusament (Prusa Polymers) @0.8 nozzle;DeltiQ - PLA - ExtraFill (Fillamentum) @0.8 nozzle;DeltiQ - PETG (Devil Design) @0.8 nozzle;DeltiQ - PA - Nylon PA12 (Fiberlogy);DeltiQ - PA - Nylon CF15 Carbon (Fillamentum);DeltiQ - MoldLay (Wax-Alike) [printer_model:DQ2P] name = DeltiQ 2 Plus @@ -49,7 +40,7 @@ technology = FFF family = DeltiQ 2 bed_model = dq2_bed.stl bed_texture = dq2_bed_texture.svg -default_materials = Generic PLA @DQ2;Prusament PLA @DQ2; Fillamentum PLA @DQ2;Generic PETG @DQ2;Devil Design PETG @DQ2;Generic ABS @DQ2;Fillamentum ABS @DQ2;Fillamentum ASA @DQ2;Spectrum ASA @DQ2;Fillamentum CPE HG100 @DQ2;Fillamentum PLA @DQ2 0.25 nozzle;Devil Design PETG @DQ2 0.25 nozzle;Prusament PLA @DQ2 0.6 nozzle;Fillamentum PLA @DQ2 0.6 nozzle;Devil Design PETG @DQ2 0.6 nozzle;Fillamentum ABS @DQ2 0.6 nozzle;Fillamentum ASA @DQ2 0.6 nozzle;Spectrum ASA @DQ2 0.6 nozzle;Fillamentum CPE HG100 @DQ2 0.6 nozzle;Prusament PLA @DQ2 0.8 nozzle;Fillamentum PLA @DQ2 0.8 nozzle;Devil Design PETG @DQ2 0.8 nozzle;Fiberlogy Nylon PA12 @DQ2;Fillamentum Nylon CF15 @DQ2;Wax-Alike MoldLay @DQ2;Prusament PA11 Carbon Fiber @DQ2;Prusament PC Blend Carbon Fiber @DQ2;Prusament PETG @DQ2;Fiberlogy Nylon PA12+CF15 @DQ2;Fiberlogy Nylon PA12+GF15 @DQ2;Prusament PVB @DQ2;Prusament PC Blend Carbon Fiber @DQ2 0.6 nozzle;Fiberlogy Nylon PA12+CF15 @DQ2 0.6 nozzle;Fiberlogy Nylon PA12+GF15 @DQ2 0.6 nozzle +default_materials = DeltiQ - PLA - Generic;DeltiQ - PLA - Prusament (Prusa Polymers); DeltiQ - PLA - ExtraFill (Fillamentum);DeltiQ - PETG - Generic;DeltiQ - PETG (Devil Design);DeltiQ - ABS - Generic;DeltiQ - ABS - ExtraFill (Fillamentum);DeltiQ - ASA - ExtraFill (Fillamentum);DeltiQ - ASA - ASA 275 (Spectrum);DeltiQ - CPE - HG100 (Fillamentum);DeltiQ - PLA - ExtraFill (Fillamentum) @0.25 nozzle;DeltiQ - PETG (Devil Design) @0.25 nozzle;DeltiQ - PLA - Prusament (Prusa Polymers) @0.6 nozzle;DeltiQ - PLA - ExtraFill (Fillamentum) @0.6 nozzle;DeltiQ - PETG (Devil Design) @0.6 nozzle;DeltiQ - ABS - ExtraFill (Fillamentum) @0.6 nozzle;DeltiQ - ASA - ExtraFill (Fillamentum) @0.6 nozzle;DeltiQ - ASA - ASA 275 (Spectrum) @0.6 nozzle;DeltiQ - CPE - HG100 (Fillamentum) @0.6 nozzle;DeltiQ - PLA - Prusament (Prusa Polymers) @0.8 nozzle;DeltiQ - PLA - ExtraFill (Fillamentum) @0.8 nozzle;DeltiQ - PETG (Devil Design) @0.8 nozzle;DeltiQ - PA - Nylon PA12 (Fiberlogy);DeltiQ - PA - Nylon CF15 Carbon (Fillamentum);DeltiQ - MoldLay (Wax-Alike) [printer_model:DQ2+FP2] name = DeltiQ 2 + FlexPrint 2 @@ -58,7 +49,7 @@ technology = FFF family = DeltiQ 2 bed_model = dq2_bed.stl bed_texture = dq2_bed_texture.svg -default_materials = Generic PLA @DQ2FP2;Prusament PLA @DQ2FP2;Fillamentum PLA @DQ2FP2;Generic PETG @DQ2FP2;Devil Design PETG @DQ2FP2;Generic ABS @DQ2FP2;Fillamentum ABS @DQ2FP2;Fillamentum ASA @DQ2FP2;Fillamentum CPE HG100;Generic FLEX @DQ2FP2;Fillamentum TPU 92A @DQ2FP2;Fillamentum TPU 98A @DQ2FP2;Smartfil TPU 93A @DQ2FP2;Fillamentum PEBA 90A @DQ2FP2;Fiberlogy PP @DQ2FP2;NinjaTek TPU 75D @DQ2FP2 +default_materials = DeltiQ FP2 - PLA - Generic;DeltiQ FP2 - PLA - Prusament (Prusa Polymers);DeltiQ FP2 - PLA - ExtraFill (Fillamentum);DeltiQ FP2 - PETG - Generic;DeltiQ FP2 - PETG (Devil Design);DeltiQ FP2 - ABS - Generic;DeltiQ FP2 - ABS - ExtraFill (Fillamentum);DeltiQ FP2 - ASA - ExtraFill (Fillamentum);DeltiQ FP2 - CPE - HG100 (Fillamentum);DeltiQ FP2 - FLEX - Generic;DeltiQ FP2 - TPU 92A - FlexFill (Fillamentum);DeltiQ FP2 - TPU 98A - FlexFill (Fillamentum);DeltiQ FP2 - TPU 93A (SMARTFIL);DeltiQ FP2 - PEBA 90A - FlexFill (Fillamentum) [printer_model:DQ2P+FP2] name = DeltiQ 2 Plus + FlexPrint 2 @@ -67,7 +58,7 @@ technology = FFF family = DeltiQ 2 bed_model = dq2_bed.stl bed_texture = dq2_bed_texture.svg -default_materials = Generic PLA @DQ2FP2;Prusament PLA @DQ2FP2;Fillamentum PLA @DQ2FP2;Generic PETG @DQ2FP2;Devil Design PETG @DQ2FP2;Generic ABS @DQ2FP2;Fillamentum ABS @DQ2FP2;Fillamentum ASA @DQ2FP2;Fillamentum CPE HG100 @DQ2FP2;Generic FLEX @DQ2FP2;Fillamentum TPU 92A @DQ2FP2;Fillamentum TPU 98A @DQ2FP2;Smartfil TPU 93A @DQ2FP2;Fillamentum PEBA 90A @DQ2FP2;Fiberlogy PP @DQ2FP2;NinjaTek TPU 75D @DQ2FP2 +default_materials = DeltiQ FP2 - PLA - Generic;DeltiQ FP2 - PLA - Prusament (Prusa Polymers);DeltiQ FP2 - PLA - ExtraFill (Fillamentum);DeltiQ FP2 - PETG - Generic;DeltiQ FP2 - PETG (Devil Design);DeltiQ FP2 - ABS - Generic;DeltiQ FP2 - ABS - ExtraFill (Fillamentum);DeltiQ FP2 - ASA - ExtraFill (Fillamentum);DeltiQ FP2 - CPE - HG100 (Fillamentum);DeltiQ FP2 - FLEX - Generic;DeltiQ FP2 - TPU 92A - FlexFill (Fillamentum);DeltiQ FP2 - TPU 98A - FlexFill (Fillamentum);DeltiQ FP2 - TPU 93A (SMARTFIL);DeltiQ FP2 - PEBA 90A - FlexFill (Fillamentum) [printer_model:DQ2+FP] name = DeltiQ 2 + FlexPrint @@ -76,7 +67,7 @@ technology = FFF family = DeltiQ 2 bed_model = dq2_bed.stl bed_texture = dq2_bed_texture.svg -default_materials = Generic PLA @DQ2FP;Prusament PLA @DQ2FP;Fillamentum PLA @DQ2FP;Generic PETG @DQ2FP;Devil Design PETG @DQ2FP;Generic ABS @DQ2FP;Fillamentum ABS @DQ2FP;Fillamentum ASA @DQ2FP;Fillamentum CPE HG100 @DQ2FP;Generic FLEX @DQ2FP +default_materials = DeltiQ FP - PLA - Generic;DeltiQ FP - PLA - Prusament (Prusa Polymers);DeltiQ FP - PLA - ExtraFill (Fillamentum);DeltiQ FP - PETG - Generic;DeltiQ FP - PETG (Devil Design);DeltiQ FP - ABS - Generic;DeltiQ FP - ABS - ExtraFill (Fillamentum);DeltiQ FP - ASA - ExtraFill (Fillamentum);DeltiQ FP - CPE - HG100 (Fillamentum);DeltiQ FP - FLEX - Generic [printer_model:DQ2P+FP] name = DeltiQ 2 Plus + FlexPrint @@ -85,33 +76,32 @@ technology = FFF family = DeltiQ 2 bed_model = dq2_bed.stl bed_texture = dq2_bed_texture.svg -default_materials = Generic PLA @DQ2FP;Prusament PLA @DQ2FP;Fillamentum PLA @DQ2FP;Generic PETG @DQ2FP;Devil Design PETG @DQ2FP;Generic ABS @DQ2FP;Fillamentum ABS @DQ2FP;Fillamentum ASA @DQ2FP;Fillamentum CPE HG100 @DQ2FP;Generic FLEX @DQ2FP +default_materials = DeltiQ FP - PLA - Generic;DeltiQ FP - PLA - Prusament (Prusa Polymers);DeltiQ FP - PLA - ExtraFill (Fillamentum);DeltiQ FP - PETG - Generic;DeltiQ FP - PETG (Devil Design);DeltiQ FP - ABS - Generic;DeltiQ FP - ABS - ExtraFill (Fillamentum);DeltiQ FP - ASA - ExtraFill (Fillamentum);DeltiQ FP - CPE - HG100 (Fillamentum);DeltiQ FP - FLEX - Generic [printer_model:DQM] name = DeltiQ M variants = 0.4 technology = FFF family = DeltiQ -default_materials = PLA @DQ;ASA @DQ;PET @DQ;ABS @DQ;CPE @DQ +default_materials = DeltiQ PLA; DeltiQ ASA; DeltiQ PET; DeltiQ ABS; DeltiQ CPE [printer_model:DQL] name = DeltiQ L variants = 0.4 technology = FFF family = DeltiQ -default_materials = PLA @DQ;ASA @DQ;PET @DQ;ABS @DQ;CPE @DQ +default_materials = DeltiQ PLA; DeltiQ ASA; DeltiQ PET; DeltiQ ABS; DeltiQ CPE [printer_model:DQXL] name = DeltiQ XL variants = 0.4 technology = FFF family = DeltiQ -default_materials = PLA @DQ;ASA @DQ;PET @DQ;ABS @DQ;CPE @DQ +default_materials = DeltiQ PLA; DeltiQ ASA; DeltiQ PET; DeltiQ ABS; DeltiQ CPE # DeltiQ print styles # -[print:0.20mm Normal @DQ] -renamed_from = "DeltiQ 0.20mm Normal" +[print:DeltiQ 0.20mm Normal] avoid_crossing_perimeters = 0 bottom_fill_pattern = monotonic bottom_solid_layers = 4 @@ -168,7 +158,7 @@ min_skirt_length = 4 notes = only_retract_when_crossing_perimeters = 0 ooze_prevention = 0 -output_filename_format = {input_filename_base}_{printer_model}_{filament_type[0]}_{filament_notes[0]}_{print_time}_{round(total_weight)}g_{year}{zdigits(month, 2)}{zdigits(day, 2)}-{zdigits(hour, 2)}{zdigits(minute, 2)}.gcode +output_filename_format = {input_filename_base}_{printer_model}_{filament_notes[0]}_{filament_type[0]}_{print_time}_{round(used_filament)}m_{year}{zdigits(month, 2)}{zdigits(day, 2)}-{hour}{minute}.gcode overhangs = 1 perimeter_acceleration = 1500 perimeter_extruder = 1 @@ -179,14 +169,14 @@ post_process = print_settings_id = raft_layers = 0 resolution = 0 -seam_position = aligned +seam_position = nearest single_extruder_multi_material_priming = 0 skirt_distance = 3 skirt_height = 2 skirts = 1 slice_closing_radius = 0.049 small_perimeter_speed = 20 -solid_infill_below_area = 20 +solid_infill_below_area = 70 solid_infill_every_layers = 0 solid_infill_extruder = 1 solid_infill_extrusion_width = 0.45 @@ -229,13 +219,9 @@ wipe_tower_width = 60 wipe_tower_x = 180 wipe_tower_y = 140 xy_size_compensation = 0 -max_volumetric_extrusion_rate_slope_negative = 1.3 -thick_bridges = 0 - -[print:0.10mm Detail @DQ] -renamed_from = "DeltiQ 0.10mm Detail" -inherits = 0.20mm Normal @DQ +[print:DeltiQ 0.10mm Detail] +inherits = DeltiQ 0.20mm Normal bottom_solid_layers = 7 bottom_solid_min_thickness = 0.7 bridge_flow_ratio = 0.7 @@ -249,9 +235,8 @@ top_infill_extrusion_width = 0.4 fill_pattern = grid fill_density = 20% -[print:0.15mm Normal @DQ] -renamed_from = "DeltiQ 0.15mm Normal" -inherits = 0.20mm Normal @DQ +[print:DeltiQ 0.15mm Normal] +inherits = DeltiQ 0.20mm Normal bottom_solid_layers = 5 bottom_solid_min_thickness = 0.7 bridge_flow_ratio = 0.7 @@ -264,9 +249,8 @@ top_solid_min_thickness = 0.7 fill_pattern = grid fill_density = 20% -[print:0.20mm Vase @DQ] -renamed_from = "DeltiQ 0.20mm Vase" -inherits = 0.20mm Normal @DQ +[print:DeltiQ 0.20mm Vase] +inherits = DeltiQ 0.20mm Normal perimeters = 1 top_solid_layers = 0 fill_density = 0 @@ -275,9 +259,8 @@ spiral_vase = 1 ensure_vertical_shell_thickness = 1 thin_walls = 0 -[print:0.20mm FLEX @DQ] -renamed_from = "DeltiQ 0.20mm FLEX" -inherits = 0.20mm Normal @DQ +[print:DeltiQ 0.20mm FLEX] +inherits = DeltiQ 0.20mm Normal avoid_crossing_perimeters = 0 bridge_flow_ratio = 0.80 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT.*/ and nozzle_diameter[0]==0.4 @@ -308,9 +291,8 @@ travel_speed = 200 max_print_speed = 40 complete_objects = 1 -[print:0.07mm Quality @DQ2 0.25 nozzle] -renamed_from = "DeltiQ 0.07mm Quality @0.25 nozzle" -inherits = 0.20mm Normal @DQ +[print:DeltiQ 0.07mm Quality @0.25 nozzle] +inherits = DeltiQ 0.20mm Normal bottom_solid_layers = 6 bottom_solid_min_thickness = 0.5 bridge_speed = 60 @@ -335,15 +317,13 @@ top_solid_layers = 6 top_solid_min_thickness = 0.5 thin_walls = 1 -[print:0.20mm Normal @DQ2 0.25 nozzle] -renamed_from = "DeltiQ 0.20mm Normal @0.25 nozzle" -inherits = 0.07mm Quality @DQ2 0.25 nozzle +[print:DeltiQ 0.20mm Normal @0.25 nozzle] +inherits = DeltiQ 0.07mm Quality @0.25 nozzle first_layer_height = 0.2 layer_height = 0.2 -[print:0.30mm Normal @DQ2 0.6 nozzle] -renamed_from = "DeltiQ 0.30mm Normal @0.6 nozzle" -inherits = 0.20mm Normal @DQ +[print:DeltiQ 0.30mm Normal @0.6 nozzle] +inherits = DeltiQ 0.20mm Normal compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and nozzle_diameter[0]==0.6 external_perimeter_extrusion_width = 0.68 extrusion_width = 0.65 @@ -360,21 +340,18 @@ support_material_xy_spacing = 0.9 top_infill_extrusion_width = 0.6 elefant_foot_compensation = 0.2 -[print:0.30mm Strong @DQ2 0.6 nozzle] -renamed_from = "DeltiQ 0.30mm Strong @0.6 nozzle" -inherits = 0.30mm Normal @DQ2 0.6 nozzle +[print:DeltiQ 0.30mm Strong @0.6 nozzle] +inherits = DeltiQ 0.30mm Normal @0.6 nozzle fill_density = 50% perimeters = 3 -[print:0.35mm Fast @DQ2 0.6 nozzle] -renamed_from = "DeltiQ 0.35mm Fast @0.6 nozzle" -inherits = 0.30mm Normal @DQ2 0.6 nozzle +[print:DeltiQ 0.35mm Fast @0.6 nozzle] +inherits = DeltiQ 0.30mm Normal @0.6 nozzle fill_density = 10% layer_height = 0.35 -[print:0.40mm Normal @DQ2 0.8 nozzle] -renamed_from = "DeltiQ 0.40mm Normal @0.8 nozzle" -inherits = 0.20mm Normal @DQ +[print:DeltiQ 0.40mm Normal @0.8 nozzle] +inherits = DeltiQ 0.20mm Normal bottom_solid_layers = 3 bottom_solid_min_thickness = 1.2 bridge_flow_ratio = 0.90 @@ -408,9 +385,8 @@ top_solid_infill_speed = 40 top_solid_layers = 4 top_solid_min_thickness = 1.2 -[print:0.40mm Vase @DQ2 0.8 nozzle] -renamed_from = "DeltiQ 0.40mm Vase @0.8 nozzle" -inherits = 0.40mm Normal @DQ2 0.8 nozzle +[print:DeltiQ 0.40mm Vase @0.8 nozzle] +inherits = DeltiQ 0.40mm Normal @0.8 nozzle bottom_solid_layers = 4 perimeters = 1 top_solid_layers = 0 @@ -422,45 +398,154 @@ thin_walls = 0 # AzteQ print styles # -[print:0.20mm Normal @AQ] -renamed_from = "AzteQ Industrial 0.20mm Normal" -inherits = 0.20mm Normal @DQ +[print:AzteQ Industrial 0.20mm Normal] +avoid_crossing_perimeters = 0 +avoid_crossing_perimeters_max_detour = 0 +bottom_fill_pattern = monotonic +bottom_solid_layers = 4 +bottom_solid_min_thickness = 0.7 +bridge_acceleration = 1000 +bridge_angle = 0 +bridge_flow_ratio = 0.95 +bridge_speed = 30 +brim_width = 0 +clip_multipart_objects = 1 compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and ( printer_notes=~/.*PRINTER_MODEL_AQI.*/ or printer_notes=~/.*PRINTER_MODEL_AQD.*/ ) and nozzle_diameter[0]==0.4 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.4 +complete_objects = 0 +default_acceleration = 2000 +dont_support_bridges = 0 +draft_shield = 0 +elefant_foot_compensation = 0.1 +ensure_vertical_shell_thickness = 0 +external_perimeter_extrusion_width = 0.45 +external_perimeter_speed = 30 +external_perimeters_first = 0 +extra_perimeters = 0 extruder_clearance_height = 65 extruder_clearance_radius = 65 +extrusion_width = 0.45 +fill_angle = 45 +fill_density = 20% +fill_pattern = grid +first_layer_acceleration = 1000 +first_layer_extrusion_width = 0.42 +first_layer_height = 0.2 +first_layer_speed = 20 +gap_fill_speed = 40 +gcode_comments = 0 +gcode_label_objects = 0 +infill_acceleration = 2000 +infill_anchor = 600% +infill_anchor_max = 50 +infill_every_layers = 1 +infill_extruder = 1 +infill_extrusion_width = 0.45 +infill_first = 0 +infill_only_where_needed = 0 +infill_overlap = 25% +infill_speed = 60 +inherits = +interface_shells = 0 +ironing = 0 +ironing_flowrate = 15% +ironing_spacing = 0.1 +ironing_speed = 15 +ironing_type = top +layer_height = 0.2 +max_print_speed = 60 +max_volumetric_speed = 0 +min_skirt_length = 4 +notes = +only_retract_when_crossing_perimeters = 0 +ooze_prevention = 0 +output_filename_format = {input_filename_base}_{printer_model}_{filament_notes[0]}_{filament_type[0]}_{print_time}_{round(used_filament)}m_{year}{zdigits(month, 2)}{zdigits(day, 2)}-{hour}{minute}.gcode +overhangs = 1 +perimeter_acceleration = 1500 +perimeter_extruder = 1 +perimeter_extrusion_width = 0.45 +perimeter_speed = 45 +perimeters = 2 +post_process = +print_settings_id = +raft_layers = 0 +resolution = 0 +seam_position = nearest +single_extruder_multi_material_priming = 0 +skirt_distance = 10 +skirt_height = 2 +skirts = 1 +slice_closing_radius = 0.049 +small_perimeter_speed = 20 +solid_infill_below_area = 70 +solid_infill_every_layers = 0 +solid_infill_extruder = 1 +solid_infill_extrusion_width = 0.45 +solid_infill_speed = 60 +spiral_vase = 0 +standby_temperature_delta = -5 +support_material = 0 +support_material_angle = 30 +support_material_auto = 1 +support_material_buildplate_only = 0 +support_material_contact_distance = 0.1 +support_material_enforce_layers = 0 +support_material_extruder = 0 +support_material_extrusion_width = 0.35 +support_material_interface_contact_loops = 0 +support_material_interface_extruder = 0 +support_material_interface_layers = 4 +support_material_interface_spacing = 0.4 +support_material_interface_speed = 100% +support_material_pattern = rectilinear +support_material_spacing = 2 +support_material_speed = 50 +support_material_synchronize_layers = 0 +support_material_threshold = 40 +support_material_with_sheath = 0 +support_material_xy_spacing = 0.6 +thin_walls = 0 +threads = 12 +top_fill_pattern = monotonic +top_infill_extrusion_width = 0.4 +top_solid_infill_speed = 40 +top_solid_layers = 5 +top_solid_min_thickness = 0.7 travel_speed = 200 +wipe_tower = 0 +wipe_tower_bridging = 10 +wipe_tower_no_sparse_layers = 0 +wipe_tower_rotation_angle = 0 +wipe_tower_width = 60 +wipe_tower_x = 180 +wipe_tower_y = 140 +xy_size_compensation = 0 -[print:0.15mm Detail @AQ] -renamed_from = "AzteQ Industrial 0.15mm Detail" -inherits = 0.20mm Normal @AQ +[print:AzteQ Industrial 0.15mm Detail] +inherits = AzteQ Industrial 0.20mm Normal layer_height = 0.15 -[print:0.20mm Strong @AQ] -renamed_from = "AzteQ Industrial 0.20mm Strong" -inherits = 0.20mm Normal @AQ +[print:AzteQ Industrial 0.20mm Strong] +inherits = AzteQ Industrial 0.20mm Normal fill_density = 50% perimeters = 3 -[print:0.20mm Vase @AQ] -renamed_from = "AzteQ Industrial 0.20mm Vase" -inherits = 0.20mm Normal @AQ +[print:AzteQ Industrial 0.20mm Vase] +inherits = AzteQ Industrial 0.20mm Normal ensure_vertical_shell_thickness = 1 fill_density = 0% perimeters = 1 spiral_vase = 1 top_solid_layers = 0 -[print:0.25mm Fast @AQ] -renamed_from = "AzteQ Industrial 0.25mm Fast" -inherits = 0.20mm Normal @AQ +[print:AzteQ Industrial 0.25mm Fast] +inherits = AzteQ Industrial 0.20mm Normal fill_density = 10% layer_height = 0.25 -[print:0.30mm Normal @AQ 0.6 nozzle] -renamed_from = "AzteQ Industrial 0.30mm Normal @0.6 nozzle" -inherits = 0.20mm Normal @AQ -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and ( printer_notes=~/.*PRINTER_MODEL_AQI.*/ or printer_notes=~/.*PRINTER_MODEL_AQD.*/ ) and nozzle_diameter[0]==0.6 +[print:AzteQ Industrial 0.30mm Normal @0.6 nozzle] +inherits = AzteQ Industrial 0.20mm Normal +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.6 external_perimeter_extrusion_width = 0.68 extrusion_width = 0.65 first_layer_extrusion_width = 0.65 @@ -476,22 +561,21 @@ support_material_xy_spacing = 0.9 top_infill_extrusion_width = 0.6 elefant_foot_compensation = 0.2 -[print:0.30mm Strong @AQ 0.6 nozzle] -renamed_from = "AzteQ Industrial 0.30mm Strong @0.6 nozzle" -inherits = 0.30mm Normal @AQ 0.6 nozzle +[print:AzteQ Industrial 0.30mm Strong @0.6 nozzle] +inherits = AzteQ Industrial 0.30mm Normal @0.6 nozzle fill_density = 50% perimeters = 3 -[print:0.35mm Fast @AQ 0.6 nozzle] -renamed_from = "AzteQ Industrial 0.35mm Fast @0.6 nozzle" -inherits = 0.30mm Normal @AQ 0.6 nozzle +[print:AzteQ Industrial 0.35mm Fast @0.6 nozzle] +inherits = AzteQ Industrial 0.30mm Normal @0.6 nozzle fill_density = 10% layer_height = 0.35 -[print:0.40mm Normal @AQ 0.8 nozzle] -renamed_from = "AzteQ Industrial 0.40mm Normal @0.8 nozzle" -inherits = 0.20mm Normal @AQ -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and ( printer_notes=~/.*PRINTER_MODEL_AQI.*/ or printer_notes=~/.*PRINTER_MODEL_AQD.*/ ) and nozzle_diameter[0]==0.8 +[print:AzteQ Industrial 0.40mm Normal @0.8 nozzle] +inherits = AzteQ Industrial 0.20mm Normal +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.8 +avoid_crossing_perimeters = 0 +avoid_crossing_perimeters_max_detour = 0 bottom_solid_layers = 4 bottom_solid_min_thickness = 0.7 bridge_flow_ratio = 0.95 @@ -531,10 +615,11 @@ raft_expansion = 1.5 raft_first_layer_density = 90% raft_first_layer_expansion = 3 raft_layers = 0 +skirt_distance = 10 skirt_height = 2 skirts = 1 small_perimeter_speed = 20 -solid_infill_below_area = 20 +solid_infill_below_area = 70 solid_infill_every_layers = 0 solid_infill_extruder = 1 solid_infill_extrusion_width = 0.8 @@ -575,9 +660,8 @@ top_solid_min_thickness = 0.7 travel_speed = 200 travel_speed_z = 0 -[print:0.40mm Vase @AQ 0.8 nozzle] -renamed_from = "AzteQ Industrial 0.40mm Vase @0.8 nozzle" -inherits = 0.40mm Normal @AQ 0.8 nozzle +[print:AzteQ Industrial 0.40mm Vase @0.8 nozzle] +inherits = AzteQ Industrial 0.40mm Normal @0.8 nozzle bottom_solid_layers = 4 perimeters = 1 top_solid_layers = 0 @@ -589,12 +673,12 @@ thin_walls = 0 # DeltiQ filaments # -[filament:*DQ2 0.4*] +[filament:*DeltiQ common*] compatible_printers = compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and !(printer_notes=~/.*FLEXPRINT.*/) and nozzle_diameter[0]==0.4 disable_fan_first_layers = 3 extrusion_multiplier = 1 -filament_colour = #EC626F +filament_colour = #FF0000 filament_diameter = 1.75 filament_minimal_purge_on_wipe_tower = 15 filament_ramming_parameters = "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" @@ -608,84 +692,10 @@ filament_spool_weight = 250 filament_vendor = Generic filament_notes = "LP-CU" -[filament:*DQ2 0.4X*] -inherits = *DQ2 0.4* -filament_notes = "MV-DG" - -[filament:*DQ2 0.25*] -inherits = *DQ2 0.4* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and !(printer_notes=~/.*FLEXPRINT.*/) and nozzle_diameter[0]==0.25 -filament_notes = "JW" - -[filament:*DQ2 0.6*] -inherits = *DQ2 0.4* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_DQ.*/ and !(printer_notes=~/.*FLEXPRINT.*/) and nozzle_diameter[0]==0.6 -filament_notes = "BN" -filament_max_volumetric_speed = 15 - -[filament:*DQ2 0.6X*] -inherits = *DQ2 0.6* -filament_notes = "SL" - -[filament:*DQ2 0.8*] -inherits = *DQ2 0.4* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_DQ.*/ and !(printer_notes=~/.*FLEXPRINT.*/) and nozzle_diameter[0]==0.8 -filament_notes = "ZL" -filament_max_volumetric_speed = 15 - -[filament:*DQ2FP 0.4*] -inherits = *DQ2 0.4* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT1.*/ and nozzle_diameter[0]==0.4 - -[filament:*DQ2FP2 0.4*] -inherits = *DQ2FP 0.4* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT2.*/ and nozzle_diameter[0]==0.4 - -[filament:*AQI 0.4*] -inherits = *DQ2 0.4* -start_filament_gcode = "; FILAMENT_START_GCODE" -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.4 -filament_notes = "CU" -filament_max_volumetric_speed = 15 - -[filament:*AQI 0.4X*] -inherits = *AQI 0.4* -filament_notes = "DG" - -[filament:*AQI 0.6*] -inherits = *AQI 0.4* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.6 -filament_notes = "BN" - -[filament:*AQI 0.6X*] -inherits = *AQI 0.6* -filament_notes = "SL" - -[filament:*AQI 0.8*] -inherits = *AQI 0.4* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.8 -filament_notes = "ZL" - -[filament:*AQD 0.4*] -inherits = *AQI 0.4* -start_filament_gcode = "; FILAMENT_START_GCODE" -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQD.*/ and nozzle_diameter[0]==0.4 - -[filament:*AQD 0.6*] -inherits = *AQD 0.4* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQD.*/ and nozzle_diameter[0]==0.6 -filament_notes = "BN" - -[filament:*AQD 0.8*] -inherits = *AQD 0.4* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQD.*/ and nozzle_diameter[0]==0.8 -filament_notes = "ZL" - # DeltiQ PLA filaments # -[filament:Generic PLA @DQ2] -renamed_from = "DeltiQ - PLA - Generic" -inherits = *DQ2 0.4* +[filament:DeltiQ - PLA - Generic] +inherits = *DeltiQ common* bed_temperature = 55 bridge_fan_speed = 100 cooling = 1 @@ -709,29 +719,22 @@ min_print_speed = 10 slowdown_below_layer_time = 4 temperature = 215 -[filament:Generic PLA @DQ2FP] -renamed_from = "DeltiQ FP - PLA - Generic" -inherits = Generic PLA @DQ2; *DQ2FP 0.4* -filament_retract_length = 0.7 -filament_retract_speed = 28 - -[filament:Prusament PLA @DQ2] -renamed_from = "DeltiQ - PLA - Prusament (Prusa Polymers)" -inherits = Generic PLA @DQ2 -bed_temperature = 50 +[filament:DeltiQ - PLA - Prusament (Prusa Polymers)] +inherits = DeltiQ - PLA - Generic +bed_temperature = 55 bridge_fan_speed = 100 cooling = 1 extrusion_multiplier = 1 fan_always_on = 1 fan_below_layer_time = 100 -filament_cost = 29.99 +filament_cost = 550 filament_density = 1.24 filament_deretract_speed = nil filament_max_volumetric_speed = 8 filament_retract_before_travel = 2 filament_retract_before_wipe = 90% filament_retract_layer_change = 1 -filament_retract_length = 4.2 +filament_retract_length = 4 filament_retract_lift = 0.2 filament_retract_lift_above = nil filament_retract_lift_below = nil @@ -740,28 +743,24 @@ filament_retract_speed = 30 filament_spool_weight = 201 filament_vendor = Prusa Polymers filament_wipe = 1 -first_layer_bed_temperature = 50 -first_layer_temperature = 220 +first_layer_bed_temperature = 55 +first_layer_temperature = 215 full_fan_speed_layer = 0 max_fan_speed = 100 min_fan_speed = 100 min_print_speed = 10 slowdown_below_layer_time = 4 -temperature = 220 +temperature = 215 -[filament:Prusament PLA @DQ2 0.6 nozzle] -renamed_from = "DeltiQ - PLA - Prusament (Prusa Polymers) @0.6 nozzle" -inherits = Prusament PLA @DQ2; *DQ2 0.6* -filament_max_volumetric_speed = 12 -extrusion_multiplier = 1.02 -first_layer_temperature = 230 -temperature = 230 -filament_retract_before_wipe = 100% -filament_retract_length = 3.8 +[filament:DeltiQ - PLA - Prusament (Prusa Polymers) @0.6 nozzle] +inherits = DeltiQ - PLA - Prusament (Prusa Polymers) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_DQ.*/ and !(printer_notes=~/.*FLEXPRINT.*/) and nozzle_diameter[0]==0.6 +filament_max_volumetric_speed = 15 +filament_notes = "BN" -[filament:Prusament PLA @DQ2 0.8 nozzle] -renamed_from = "DeltiQ - PLA - Prusament (Prusa Polymers) @0.8 nozzle" -inherits = Prusament PLA @DQ2; *DQ2 0.8* +[filament:DeltiQ - PLA - Prusament (Prusa Polymers) @0.8 nozzle] +inherits = DeltiQ - PLA - Prusament (Prusa Polymers) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and !(printer_notes=~/.*FLEXPRINT.*/) and nozzle_diameter[0]==0.8 disable_fan_first_layers = 1 filament_max_volumetric_speed = 40 first_layer_temperature = 230 @@ -771,45 +770,29 @@ filament_retract_layer_change = 0 filament_retract_length = 4.1 filament_retract_speed = 45 filament_deretract_speed = 25 +filament_notes = "ZL" -[filament:Prusament PLA (Door Opened) @AQI] -inherits = Prusament PLA @DQ2; *AQI 0.4* -first_layer_bed_temperature = 55 -bed_temperature = 55 -first_layer_temperature = 230 -temperature = 230 -filament_retract_before_wipe = 90% -filament_retract_length = 3.7 -filament_retract_speed = 29 -min_fan_speed = 100 -fan_below_layer_time = 20 -min_print_speed = 18 -slowdown_below_layer_time = 1 -start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S0 ; Wait for chamber temperature" - -[filament:Prusament PLA (Door Opened) @AQD] -inherits = Prusament PLA (Door Opened) @AQI; *AQD 0.4* - -[filament:Fillamentum PLA @DQ2] -renamed_from = "DeltiQ - PLA - ExtraFill (Fillamentum)" -inherits = Generic PLA @DQ2; *DQ2 0.4* +[filament:DeltiQ - PLA - ExtraFill (Fillamentum)] +inherits = DeltiQ - PLA - Generic filament_cost = 24.27 filament_spool_weight = 229 filament_density = 1.24 filament_vendor = Fillamentum -[filament:Fillamentum PLA @DQ2 0.25 nozzle] -renamed_from = "DeltiQ - PLA - ExtraFill (Fillamentum) @0.25 nozzle" -inherits = Fillamentum PLA @DQ2; *DQ2 0.25* +[filament:DeltiQ - PLA - ExtraFill (Fillamentum) @0.25 nozzle] +inherits = DeltiQ - PLA - ExtraFill (Fillamentum) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and !(printer_notes=~/.*FLEXPRINT.*/) and nozzle_diameter[0]==0.25 +filament_notes = "BN" -[filament:Fillamentum PLA @DQ2 0.6 nozzle] -renamed_from = "DeltiQ - PLA - ExtraFill (Fillamentum) @0.6 nozzle" -inherits = Fillamentum PLA @DQ2; *DQ2 0.6* +[filament:DeltiQ - PLA - ExtraFill (Fillamentum) @0.6 nozzle] +inherits = DeltiQ - PLA - ExtraFill (Fillamentum) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_DQ.*/ and !(printer_notes=~/.*FLEXPRINT.*/) and nozzle_diameter[0]==0.6 filament_max_volumetric_speed = 15 +filament_notes = "BN" -[filament:Fillamentum PLA @DQ2 0.8 nozzle] -renamed_from = "DeltiQ - PLA - ExtraFill (Fillamentum) @0.8 nozzle" -inherits = Fillamentum PLA @DQ2; *DQ2 0.8* +[filament:DeltiQ - PLA - ExtraFill (Fillamentum) @0.8 nozzle] +inherits = DeltiQ - PLA - ExtraFill (Fillamentum) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and !(printer_notes=~/.*FLEXPRINT.*/) and nozzle_diameter[0]==0.8 disable_fan_first_layers = 1 filament_max_volumetric_speed = 40 first_layer_temperature = 230 @@ -819,41 +802,29 @@ filament_retract_layer_change = 0 filament_retract_length = 4.1 filament_retract_speed = 45 filament_deretract_speed = 25 +filament_notes = "ZL" -[filament:Prusament PVB @DQ2] -inherits = Generic PLA @DQ2; *DQ2 0.4* -filament_type = PVB -filament_vendor = Prusa Polymers -filament_spool_weight = 201 -bed_temperature = 75 -first_layer_bed_temperature = 75 -first_layer_temperature = 215 -extrusion_multiplier = 0.95 -filament_retract_before_wipe = 0% -filament_retract_length = 4.1 -filament_wipe = 0 -min_print_speed = 15 -slowdown_below_layer_time = 2 -filament_cost = 41.3 - +[filament:DeltiQ FP - PLA - Generic] +inherits = DeltiQ - PLA - Generic +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT1.*/ and nozzle_diameter[0]==0.4 +filament_retract_length = 0.7 +filament_retract_speed = 28 -[filament:Fillamentum PLA @DQ2FP] -renamed_from = "DeltiQ FP - PLA - ExtraFill (Fillamentum)" -inherits = Generic PLA @DQ2; *DQ2FP 0.4* +[filament:DeltiQ FP - PLA - ExtraFill (Fillamentum)] +inherits = DeltiQ FP - PLA - Generic filament_cost = 24.27 filament_spool_weight = 229 filament_density = 1.24 filament_vendor = Fillamentum -[filament:Generic PLA @DQ2FP2] -renamed_from = "DeltiQ FP2 - PLA - Generic" -inherits = Generic PLA @DQ2FP; *DQ2FP2 0.4* +[filament:DeltiQ FP2 - PLA - Generic] +inherits = DeltiQ FP - PLA - Generic +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT2.*/ and nozzle_diameter[0]==0.4 filament_retract_length = 1.2 filament_retract_speed = 28 -[filament:Prusament PLA @DQ2FP2] -renamed_from = "DeltiQ FP2 - PLA - Prusament (Prusa Polymers)" -inherits = Generic PLA @DQ2FP2; *DQ2FP2 0.4* +[filament:DeltiQ FP2 - PLA - Prusament (Prusa Polymers)] +inherits = DeltiQ FP2 - PLA - Generic bed_temperature = 55 bridge_fan_speed = 100 cooling = 1 @@ -885,40 +856,17 @@ min_print_speed = 10 slowdown_below_layer_time = 4 temperature = 215 -[filament:Fillamentum PLA @DQ2FP2] -renamed_from = "DeltiQ FP2 - PLA - ExtraFill (Fillamentum)" -inherits = Generic PLA @DQ2FP2; *DQ2FP2 0.4* +[filament:DeltiQ FP2 - PLA - ExtraFill (Fillamentum)] +inherits = DeltiQ FP2 - PLA - Generic filament_cost = 24.27 filament_spool_weight = 229 filament_density = 1.24 filament_vendor = Fillamentum - -[filament:Fiberlogy PP @DQ2FP2] -inherits = Generic PLA @DQ2FP2; *DQ2FP2 0.4* -filament_type = PP -filament_vendor = Fiberlogy -filament_density = 1.04 -first_layer_bed_temperature = 0 -bed_temperature = 0 -first_layer_temperature = 230 -temperature = 230 -extrusion_multiplier = 0.91 -bridge_fan_speed = 75 -disable_fan_first_layers = 5 -max_fan_speed = 50 -min_fan_speed = 15 -fan_below_layer_time = 20 -min_print_speed = 15 -slowdown_below_layer_time = 2 -filament_retract_length = 0.8 -filament_cost = 54.36 - # DeltiQ PETG filaments # -[filament:Generic PETG @DQ2] -renamed_from = "DeltiQ - PETG - Generic" -inherits = *DQ2 0.4* +[filament:DeltiQ - PETG - Generic] +inherits = *DeltiQ common* bed_temperature = 80 bridge_fan_speed = 50 cooling = 1 @@ -943,37 +891,32 @@ min_print_speed = 10 slowdown_below_layer_time = 5 temperature = 245 -[filament:Devil Design PETG @DQ2] -renamed_from = "DeltiQ - PETG (Devil Design)" -inherits = Generic PETG @DQ2; *DQ2 0.6* -filament_vendor = DevilDesign +[filament:DeltiQ - PETG (Devil Design)] +inherits = DeltiQ - PETG - Generic +filament_cost = 16.53 filament_spool_weight = 247 filament_density = 1.27 -filament_cost = 16.53 +filament_vendor = DevilDesign -[filament:Devil Design PETG @DQ2 0.25 nozzle] -renamed_from = "DeltiQ - PETG (Devil Design) @0.25 nozzle" -inherits = Devil Design PETG @DQ2; *DQ2 0.25* +[filament:DeltiQ - PETG (Devil Design) @0.25 nozzle] +inherits = DeltiQ - PETG (Devil Design) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and !(printer_notes=~/.*FLEXPRINT.*/) and nozzle_diameter[0]==0.25 first_layer_temperature = 225 temperature = 220 max_fan_speed = 65 min_fan_speed = 40 bridge_fan_speed = 100 +filament_notes = "JW" -[filament:Devil Design PETG @DQ2 0.6 nozzle] -renamed_from = "DeltiQ - PETG (Devil Design) @0.6 nozzle" -inherits = Devil Design PETG @DQ2; *DQ2 0.6* +[filament:DeltiQ - PETG (Devil Design) @0.6 nozzle] +inherits = DeltiQ - PETG (Devil Design) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_DQ.*/ and !(printer_notes=~/.*FLEXPRINT.*/) and nozzle_diameter[0]==0.6 filament_max_volumetric_speed = 15 -bridge_fan_speed = 70 -min_fan_speed = 35 -extrusion_multiplier = 1.025 -first_layer_temperature = 255 -temperature = 255 -filament_wipe = 0 +filament_notes = "BN" -[filament:Devil Design PETG @DQ2 0.8 nozzle] -renamed_from = "DeltiQ - PETG (Devil Design) @0.8 nozzle" -inherits = Devil Design PETG @DQ2; *DQ2 0.8* +[filament:DeltiQ - PETG (Devil Design) @0.8 nozzle] +inherits = DeltiQ - PETG (Devil Design) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and !(printer_notes=~/.*FLEXPRINT.*/) and nozzle_diameter[0]==0.8 filament_max_volumetric_speed = 40 first_layer_temperature = 240 slowdown_below_layer_time = 8 @@ -984,79 +927,30 @@ filament_retract_speed = 45 filament_deretract_speed = 25 filament_retract_before_wipe = 80% filament_wipe = 1 +filament_notes = "ZL" -[filament:Prusament PETG @DQ2] -inherits = Generic PETG @DQ2; *DQ2 0.4* -filament_vendor = Prusa Polymers -filament_spool_weight = 201 -filament_density = 1.27 -first_layer_temperature = 235 -temperature = 230 -filament_retract_length = 4.4 -filament_cost = 29.99 - -[filament:Prusament PETG @AQI] -inherits = Prusament PETG @DQ2; *AQI 0.4* -bridge_fan_speed = 100 -max_fan_speed = 80 -min_fan_speed = 15 -min_print_speed = 15 -slowdown_below_layer_time = 3 -first_layer_temperature = 250 -temperature = 250 -filament_retract_before_travel = 2.5 -filament_retract_before_wipe = 100% -filament_retract_length = 4 -filament_retract_speed = 30 - -[filament:Prusament PETG @AQD] -inherits = Prusament PETG @AQI; *AQD 0.4* - -[filament:Prusament PETG Carbon Fiber @AQI] -inherits = Prusament PETG @AQI; *AQI 0.4* -filament_vendor = Prusa Polymers -filament_type = PETGCF -filament_density = 1.27 -first_layer_temperature = 275 -temperature = 275 -bed_temperature = 85 -first_layer_bed_temperature = 85 -extrusion_multiplier = 0.95 -bridge_fan_speed = 90% -min_fan_speed = 55 -min_print_speed = 18 -slowdown_below_layer_time = 2 -filament_retract_before_wipe = 50% -filament_retract_length = 3.5 -filament_cost = 45.45 - -[filament:Prusament PETG Carbon Fiber @AQD] -inherits = Prusament PETG Carbon Fiber @AQI; *AQD 0.4* - -[filament:Generic PETG @DQ2FP] -renamed_from = "DeltiQ FP - PETG - Generic" -inherits = Generic PETG @DQ2; *DQ2FP 0.4* +[filament:DeltiQ FP - PETG - Generic] +inherits = DeltiQ - PETG - Generic +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT1.*/ and nozzle_diameter[0]==0.4 filament_retract_length = 0.7 filament_retract_speed = 25 -[filament:Devil Design PETG @DQ2FP] -renamed_from = "DeltiQ FP - PETG (Devil Design)" -inherits = Generic PETG @DQ2FP; *DQ2FP 0.4* +[filament:DeltiQ FP - PETG (Devil Design)] +inherits = DeltiQ FP - PETG - Generic filament_cost = 16.53 filament_spool_weight = 247 filament_density = 1.27 filament_vendor = DevilDesign -[filament:Generic PETG @DQ2FP2] -renamed_from = "DeltiQ FP2 - PETG - Generic" -inherits = Generic PETG @DQ2FP; *DQ2FP 0.4* +[filament:DeltiQ FP2 - PETG - Generic] +inherits = DeltiQ FP - PETG - Generic +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT2.*/ and nozzle_diameter[0]==0.4 filament_retract_length = 1.4 filament_retract_speed = 35 filament_retract_before_wipe = 0% -[filament:Devil Design PETG @DQ2FP2] -renamed_from = "DeltiQ FP2 - PETG (Devil Design)" -inherits = Generic PETG @DQ2FP2; *DQ2FP2 0.4* +[filament:DeltiQ FP2 - PETG (Devil Design)] +inherits = DeltiQ FP2 - PETG - Generic filament_cost = 16.53 filament_spool_weight = 247 filament_density = 1.27 @@ -1064,9 +958,8 @@ filament_vendor = DevilDesign # DeltiQ ABS filaments # -[filament:Generic ABS @DQ2] -renamed_from = "DeltiQ - ABS - Generic" -inherits = *DQ2 0.4* +[filament:DeltiQ - ABS - Generic] +inherits = *DeltiQ common* bed_temperature = 100 bridge_fan_speed = 25 cooling = 1 @@ -1090,41 +983,40 @@ min_print_speed = 10 slowdown_below_layer_time = 15 temperature = 255 -[filament:Fillamentum ABS @DQ2] -renamed_from = "DeltiQ - ABS - ExtraFill (Fillamentum)" -inherits = Generic ABS @DQ2; *DQ2 0.4* +[filament:DeltiQ - ABS - ExtraFill (Fillamentum)] +inherits = DeltiQ - ABS - Generic filament_cost = 24.27 filament_spool_weight = 229 filament_density = 1.04 filament_vendor = Fillamentum -[filament:Fillamentum ABS @DQ2 0.6 nozzle] -renamed_from = "DeltiQ - ABS - ExtraFill (Fillamentum) @0.6 nozzle" -inherits = Fillamentum ABS @DQ2; *DQ2 0.6* +[filament:DeltiQ - ABS - ExtraFill (Fillamentum) @0.6 nozzle] +inherits = DeltiQ - ABS - ExtraFill (Fillamentum) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_DQ.*/ and !(printer_notes=~/.*FLEXPRINT.*/) and nozzle_diameter[0]==0.6 +filament_max_volumetric_speed = 15 +filament_notes = "BN" -[filament:Generic ABS @DQ2FP] -renamed_from = "DeltiQ FP - ABS - Generic" -inherits = Generic ABS @DQ2; *DQ2FP 0.4* +[filament:DeltiQ FP - ABS - Generic] +inherits = DeltiQ - ABS - Generic +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT1.*/ and nozzle_diameter[0]==0.4 filament_retract_length = 0.7 filament_retract_speed = 25 -[filament:Fillamentum ABS @DQ2FP] -renamed_from = "DeltiQ FP - ABS - ExtraFill (Fillamentum)" -inherits = Generic ABS @DQ2FP; *DQ2FP 0.4* +[filament:DeltiQ FP - ABS - ExtraFill (Fillamentum)] +inherits = DeltiQ FP - ABS - Generic filament_cost = 24.27 filament_spool_weight = 229 filament_density = 1.04 filament_vendor = Fillamentum -[filament:Generic ABS @DQ2FP2] -renamed_from = "DeltiQ FP2 - ABS - Generic" -inherits = Generic ABS @DQ2FP; *DQ2FP2 0.4* +[filament:DeltiQ FP2 - ABS - Generic] +inherits = DeltiQ FP - ABS - Generic +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT2.*/ and nozzle_diameter[0]==0.4 filament_retract_length = 0.8 filament_retract_speed = 25 -[filament:Fillamentum ABS @DQ2FP2] -renamed_from = "DeltiQ FP2 - ABS - ExtraFill (Fillamentum)" -inherits = Generic ABS @DQ2FP2; *DQ2FP2 0.4* +[filament:DeltiQ FP2 - ABS - ExtraFill (Fillamentum)] +inherits = DeltiQ FP2 - ABS - Generic filament_cost = 24.27 filament_spool_weight = 229 filament_density = 1.04 @@ -1133,9 +1025,8 @@ filament_vendor = Fillamentum # DeltiQ ASA filaments # -[filament:Fillamentum ASA @DQ2] -renamed_from = "DeltiQ - ASA - ExtraFill (Fillamentum)" -inherits = Generic ABS @DQ2; *DQ2 0.4* +[filament:DeltiQ - ASA - ExtraFill (Fillamentum)] +inherits = DeltiQ - ABS - Generic filament_cost = 29.53 filament_spool_weight = 229 filament_density = 1.07 @@ -1144,23 +1035,25 @@ filament_vendor = Fillamentum first_layer_temperature = 265 temperature = 265 -[filament:Fillamentum ASA @DQ2 0.6 nozzle] -renamed_from = "DeltiQ - ASA - ExtraFill (Fillamentum) @0.6 nozzle" -inherits = Fillamentum ASA @DQ2; *DQ2 0.6* +[filament:DeltiQ - ASA - ExtraFill (Fillamentum) @0.6 nozzle] +inherits = DeltiQ - ASA - ExtraFill (Fillamentum) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_DQ.*/ and !(printer_notes=~/.*FLEXPRINT.*/) and nozzle_diameter[0]==0.6 +filament_max_volumetric_speed = 15 +filament_notes = "BN" -[filament:Fillamentum ASA @DQ2FP] -renamed_from = "DeltiQ FP - ASA - ExtraFill (Fillamentum)" -inherits = Fillamentum ASA @DQ2; *DQ2FP2 0.4* +[filament:DeltiQ FP - ASA - ExtraFill (Fillamentum)] +inherits = DeltiQ - ASA - ExtraFill (Fillamentum) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT1.*/ and nozzle_diameter[0]==0.4 filament_retract_length = 0.7 filament_retract_speed = 25 -[filament:Fillamentum ASA @DQ2FP2] -renamed_from = "DeltiQ FP2 - ASA - ExtraFill (Fillamentum)" -inherits = Fillamentum ASA @DQ2FP; *DQ2FP2 0.4* +[filament:DeltiQ FP2 - ASA - ExtraFill (Fillamentum)] +inherits = DeltiQ FP - ASA - ExtraFill (Fillamentum) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT2.*/ and nozzle_diameter[0]==0.4 + -[filament:Spectrum ASA @DQ2] -renamed_from = "DeltiQ - ASA - ASA 275 (Spectrum)" -inherits = *DQ2 0.4* +[filament:DeltiQ - ASA - ASA 275 (Spectrum)] +inherits = *DeltiQ common* bed_temperature = 55 bridge_fan_speed = 80 cooling = 1 @@ -1186,15 +1079,16 @@ min_print_speed = 10 slowdown_below_layer_time = 15 temperature = 230 -[filament:Spectrum ASA @DQ2 0.6 nozzle] -renamed_from = "DeltiQ - ASA - ASA 275 (Spectrum) @0.6 nozzle" -inherits = Spectrum ASA @DQ2; *DQ2 0.6* +[filament:DeltiQ - ASA - ASA 275 (Spectrum) @0.6 nozzle] +inherits = DeltiQ - ASA - ASA 275 (Spectrum) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_DQ.*/ and !(printer_notes=~/.*FLEXPRINT.*/) and nozzle_diameter[0]==0.6 +filament_max_volumetric_speed = 15 +filament_notes = "BN" # DeltiQ CPE filaments # -[filament:Fillamentum CPE HG100 @DQ2] -renamed_from = "DeltiQ - CPE - HG100 (Fillamentum)" -inherits = *DQ2 0.4* +[filament:DeltiQ - CPE - HG100 (Fillamentum)] +inherits = *DeltiQ common* bed_temperature = 90 bridge_fan_speed = 50 cooling = 1 @@ -1222,21 +1116,23 @@ min_print_speed = 10 slowdown_below_layer_time = 5 temperature = 260 -[filament:Fillamentum CPE HG100 @DQ2 0.6 nozzle] -renamed_from = "DeltiQ - CPE - HG100 (Fillamentum) @0.6 nozzle" -inherits = Fillamentum CPE HG100 @DQ2; *DQ2 0.6* +[filament:DeltiQ - CPE - HG100 (Fillamentum) @0.6 nozzle] +inherits = DeltiQ - CPE - HG100 (Fillamentum) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_DQ.*/ and !(printer_notes=~/.*FLEXPRINT.*/) and nozzle_diameter[0]==0.6 +filament_max_volumetric_speed = 15 +filament_notes = "BN" -[filament:Fillamentum CPE HG100 @DQ2FP] -renamed_from = "DeltiQ FP - CPE - HG100 (Fillamentum)" -inherits = Fillamentum CPE HG100 @DQ2; *DQ2FP 0.4* +[filament:DeltiQ FP - CPE - HG100 (Fillamentum)] +inherits = DeltiQ - CPE - HG100 (Fillamentum) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT1.*/ and nozzle_diameter[0]==0.4 filament_retract_length = 0.7 filament_retract_speed = 25 filament_deretract_speed = 0 filament_retract_before_wipe = 0% -[filament:Fillamentum CPE HG100 @DQ2FP2] -renamed_from = "DeltiQ FP2 - CPE - HG100 (Fillamentum)" -inherits = Fillamentum CPE HG100 @DQ2FP; *DQ2FP2 0.4* +[filament:DeltiQ FP2 - CPE - HG100 (Fillamentum)] +inherits = DeltiQ FP - CPE - HG100 (Fillamentum) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT2.*/ and nozzle_diameter[0]==0.4 filament_retract_length = 0.8 filament_retract_speed = 35 filament_deretract_speed = 0 @@ -1245,9 +1141,9 @@ filament_retract_before_wipe = 0% # DeltiQ FLEX filaments # -[filament:Generic FLEX @DQ2FP] -renamed_from = "DeltiQ FP - FLEX - Generic" -inherits = *DQ2FP2 0.4* +[filament:DeltiQ FP - FLEX - Generic] +inherits = *DeltiQ common* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT1.*/ and nozzle_diameter[0]==0.4 bed_temperature = 50 bridge_fan_speed = 80 cooling = 1 @@ -1275,9 +1171,9 @@ min_print_speed = 5 slowdown_below_layer_time = 4 temperature = 240 -[filament:Generic FLEX @DQ2FP2] -renamed_from = "DeltiQ FP2 - FLEX - Generic" -inherits = Generic FLEX @DQ2FP; *DQ2FP2 0.4* +[filament:DeltiQ FP2 - FLEX - Generic] +inherits = DeltiQ FP - FLEX - Generic +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT2.*/ and nozzle_diameter[0]==0.4 bed_temperature = 50 bridge_fan_speed = 80 cooling = 1 @@ -1305,29 +1201,8 @@ min_print_speed = 5 slowdown_below_layer_time = 4 temperature = 225 -[filament:NinjaTek TPU 75D @DQ2FP2] -inherits = Generic FLEX @DQ2FP2; *DQ2FP2 0.4* -filament_vendor = NinjaTek -filament_type = TPU75D -first_layer_bed_temperature = 55 -bed_temperature = 55 -first_layer_temperature = 240 -temperature = 240 -extrusion_multiplier = 0.9 -filament_density = 1.1 -bridge_fan_speed = 90 -max_fan_speed = 70 -min_fan_speed = 50 -min_print_speed = 15 -slowdown_below_layer_time = 2 -filament_max_volumetric_speed = 5 -filament_retract_before_wipe = 95% -filament_retract_length = 1.4 -filament_cost = 91.67 - -[filament:Fillamentum TPU 92A @DQ2FP2] -renamed_from = "DeltiQ FP2 - TPU 92A - FlexFill (Fillamentum)" -inherits = Generic FLEX @DQ2FP2; *DQ2FP2 0.4* +[filament:DeltiQ FP2 - TPU 92A - FlexFill (Fillamentum)] +inherits = DeltiQ FP2 - FLEX - Generic bed_temperature = 50 bridge_fan_speed = 80 cooling = 1 @@ -1358,9 +1233,8 @@ min_print_speed = 5 slowdown_below_layer_time = 4 temperature = 230 -[filament:Fillamentum TPU 98A @DQ2FP2] -renamed_from = "DeltiQ FP2 - TPU 98A - FlexFill (Fillamentum)" -inherits = Fillamentum TPU 92A @DQ2FP2; *DQ2FP2 0.4* +[filament:DeltiQ FP2 - TPU 98A - FlexFill (Fillamentum)] +inherits = DeltiQ FP2 - TPU 92A - FlexFill (Fillamentum) extrusion_multiplier = 1.10 filament_cost = 58.33 filament_spool_weight = 229 @@ -1372,9 +1246,8 @@ filament_retract_length = 2.5 filament_retract_speed = 20 filament_type = TPU98A -[filament:Smartfil TPU 93A @DQ2FP2] -renamed_from = "DeltiQ FP2 - TPU 93A (SMARTFIL)" -inherits = Generic FLEX @DQ2FP2; *DQ2FP2 0.4* +[filament:DeltiQ FP2 - TPU 93A (SMARTFIL)] +inherits = DeltiQ FP2 - FLEX - Generic bed_temperature = 50 bridge_fan_speed = 80 cooling = 1 @@ -1405,9 +1278,8 @@ min_print_speed = 10 slowdown_below_layer_time = 4 temperature = 235 -[filament:Fillamentum PEBA 90A @DQ2FP2] -renamed_from = "DeltiQ FP2 - PEBA 90A - FlexFill (Fillamentum)" -inherits = Fillamentum TPU 98A @DQ2FP2; *DQ2FP2 0.4* +[filament:DeltiQ FP2 - PEBA 90A - FlexFill (Fillamentum)] +inherits = DeltiQ FP2 - TPU 98A - FlexFill (Fillamentum) extrusion_multiplier = 1.1 filament_cost = 139.67 filament_spool_weight = 229 @@ -1424,93 +1296,28 @@ first_layer_temperature = 245 bed_temperature = 75 temperature = 245 -[filament:Fiberlogy Nylon PA12 @DQ2] -renamed_from = "DeltiQ - PA - Nylon PA12 (Fiberlogy)" -inherits = Generic ABS @DQ2; *DQ2 0.4* -filament_type = PA -filament_vendor = Fiberlogy +[filament:DeltiQ - PA - Nylon PA12 (Fiberlogy)] +inherits = DeltiQ - ABS - Generic bed_temperature = 100 +filament_cost = 45.11 filament_spool_weight = 230 filament_density = 1.02 filament_retract_length = 4.1 +filament_type = NYLON first_layer_bed_temperature = 100 first_layer_temperature = 255 max_fan_speed = 30 min_fan_speed = 20 temperature = 255 -filament_cost = 45.11 -[filament:Fiberlogy Nylon PA12+CF15 @DQ2] -inherits = Fiberlogy Nylon PA12 @DQ2; *DQ2 0.4X* -filament_type = PACF -bridge_fan_speed = 15 -min_fan_speed = 5 -fan_always_on = 0 -fan_below_layer_time = 11 -slowdown_below_layer_time = 10 -extrusion_multiplier = 0.97 -first_layer_temperature = 260 -temperature = 260 -filament_retract_length = 4.15 -filament_retract_lift = 0.25 -filament_cost = 133.82 - -[filament:Fiberlogy Nylon PA12+CF15 @DQ2 0.6 nozzle] -inherits = Fiberlogy Nylon PA12+CF15 @DQ2; *DQ2 0.6X* -bridge_fan_speed = 50 -max_fan_speed = 40 -min_fan_speed = 20 -fan_always_on = 1 -fan_below_layer_time = 12 -min_print_speed = 15 -slowdown_below_layer_time = 3 -extrusion_multiplier = 1.075 -first_layer_temperature = 270 -temperature = 270 -filament_retract_length = 4 -filament_retract_lift = 0.2 -filament_retract_before_wipe = 90% - -[filament:Fiberlogy Nylon PA12+GF15 @DQ2] -inherits = Fiberlogy Nylon PA12 @DQ2; *DQ2 0.4X* -filament_type = PAGF -bridge_fan_speed = 15 -min_fan_speed = 5 -fan_always_on = 0 -fan_below_layer_time = 11 -slowdown_below_layer_time = 10 -extrusion_multiplier = 0.97 -first_layer_temperature = 260 -temperature = 260 -filament_retract_length = 4.15 -filament_retract_lift = 0.25 -filament_cost = 113.82 - -[filament:Fiberlogy Nylon PA12+GF15 @DQ2 0.6 nozzle] -inherits = Fiberlogy Nylon PA12+GF15 @DQ2; *DQ2 0.6X* -bridge_fan_speed = 50 -max_fan_speed = 40 -min_fan_speed = 20 -fan_always_on = 1 -fan_below_layer_time = 12 -min_print_speed = 15 -slowdown_below_layer_time = 3 -extrusion_multiplier = 1.075 -first_layer_temperature = 270 -temperature = 270 -filament_retract_length = 4 -filament_retract_lift = 0.2 -filament_retract_before_wipe = 90% - -[filament:Fillamentum Nylon CF15 @DQ2] -renamed_from = "DeltiQ - PA - Nylon CF15 Carbon (Fillamentum)" -inherits = Generic ABS @DQ2; *DQ2 0.4X* -filament_type = PACF +[filament:DeltiQ - PA - Nylon CF15 Carbon (Fillamentum)] +inherits = DeltiQ - ABS - Generic bed_temperature = 100 filament_cost = 88.17 filament_density = 1.08 filament_spool_weight = 229 filament_retract_length = 2.0 +filament_type = NYLON first_layer_bed_temperature = 100 first_layer_temperature = 255 max_fan_speed = 50 @@ -1518,103 +1325,8 @@ min_fan_speed = 20 temperature = 255 extrusion_multiplier = 0.95 -[filament:Prusament PA11 Carbon Fiber @DQ2] -renamed_from = "DeltiQ - PA - PA11 Carbon Fiber (Prusa Polymers)" -inherits = Generic ABS @DQ2; *DQ2 0.4X* -filament_type = PACF -bridge_fan_speed = 50 -disable_fan_first_layers = 5 -max_fan_speed = 50 -min_fan_speed = 0 -fan_always_on = 0 -fan_below_layer_time = 10 -min_print_speed = 15 -slowdown_below_layer_time = 5 -extrusion_multiplier = 1.02 -filament_cost = 82.64 -filament_density = 1.08 -filament_spool_weight = 201 -first_layer_temperature = 275 -temperature = 275 -filament_max_volumetric_speed = 6 -filament_vendor = Prusa Polymers -filament_retract_length = 2.5 - -[filament:Prusament PA11 Carbon Fiber @AQI] -inherits = Prusament PA11 Carbon Fiber @DQ2; *AQI 0.4X* -bridge_fan_speed = 30 -disable_fan_first_layers = 3 -max_fan_speed = 25 -min_fan_speed = 5 -fan_always_on = 1 -slowdown_below_layer_time = 2 -extrusion_multiplier = 1.05 -first_layer_temperature = 265 -temperature = 265 -filament_max_volumetric_speed = 8 -filament_retract_before_wipe = 100% -filament_retract_length = 2.9 -filament_retract_speed = 30 -start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S50 ; Wait for chamber temperature" - -[filament:Filament PM PAJet 160 @AQI] -inherits = Generic ABS @AQI; *AQI 0.4X* -filament_type = PA -filament_vendor = Filament PM -bridge_fan_speed = 80 -max_fan_speed = 50 -min_fan_speed = 20 -min_print_speed = 15 -slowdown_below_layer_time = 2 -extrusion_multiplier = 0.9 -first_layer_temperature = 245 -temperature = 245 -filament_retract_before_wipe = 100% -filament_retract_length = 6 -filament_retract_speed = 30 -filament_wipe = 0 -filament_cost = 79.08 - -[filament:Prusament PC Blend Carbon Fiber @DQ2] -renamed_from = "DeltiQ - PC - PC Blend Carbon Fiber (Prusa Polymers)" -inherits = Generic ABS @DQ2; *DQ2 0.4X* -filament_type = PCCF -filament_vendor = Prusa Polymers -bridge_fan_speed = 30 -disable_fan_first_layers = 4 -max_fan_speed = 20 -min_fan_speed = 20 -fan_always_on = 0 -extrusion_multiplier = 1.04 -filament_density = 1.08 -filament_spool_weight = 201 -first_layer_temperature = 280 -temperature = 280 -filament_retract_length = 4.3 -filament_retract_speed = 30 -filament_cost = 49.58 - -[filament:Prusament PC Blend Carbon Fiber @DQ2 0.6 nozzle] -inherits = Prusament PC Blend Carbon Fiber @DQ2; *DQ2 0.6X* -bridge_fan_speed = 75 -disable_fan_first_layers = 3 -max_fan_speed = 65 -min_fan_speed = 10 -fan_always_on = 1 -fan_below_layer_time = 12 -min_print_speed = 15 -slowdown_below_layer_time = 4 -extrusion_multiplier = 1.075 -first_layer_temperature = 285 -temperature = 285 -filament_max_volumetric_speed = 12 -filament_retract_before_wipe = 90% -filament_retract_length = 4 -filament_retract_speed = 25 - -[filament:Wax-Alike MoldLay @DQ2] -renamed_from = "DeltiQ - MoldLay (Wax-Alike)" -inherits = Generic PLA @DQ2; *DQ2 0.4* +[filament:DeltiQ - MoldLay (Wax-Alike)] +inherits = DeltiQ - PLA - Generic bed_temperature = 50 filament_cost = 79.07 filament_spool_weight = 230 @@ -1630,11 +1342,15 @@ filament_vendor = Wax-Alike # AzteQ filaments # +[filament:*AzteQ common*] +inherits = *DeltiQ common* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.4 +filament_notes = "CU" + # AzteQ Industrial filaments # -[filament:Generic PLA (Door Opened) @AQI] -renamed_from = "AzteQ Industrial (Door Opened) - PLA - Generic" -inherits = *AQI 0.4* +[filament:AzteQ Industrial (Door Opened) - PLA - Generic] +inherits = *AzteQ common* bed_temperature = 50 bridge_fan_speed = 100 cooling = 1 @@ -1667,48 +1383,30 @@ max_fan_speed = 100 min_fan_speed = 90 min_print_speed = 10 slowdown_below_layer_time = 15 -start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S0 ; Wait for chamber temperature" +start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S0 ; Set and wait - chamber temperature" temperature = 210 -[filament:Smartfil PLA (Door Opened) @AQI] -inherits = Generic PLA (Door Opened) @AQI; *AQI 0.4* -filament_vendor = Smartfil -filament_type = PLA -bed_temperature = 55 -first_layer_bed_temperature = 55 -first_layer_temperature = 220 -temperature = 220 -extrusion_multiplier = 0.93 -filament_retract_before_travel = 2.5 -filament_retract_before_wipe = 90% -filament_retract_length = 3.9 -min_fan_speed = 100 -min_print_speed = 20 -slowdown_below_layer_time = 2 -filament_cost = 21.12 - -[filament:Smartfil PLA (Door Opened) @AQD] -inherits = Smartfil PLA (Door Opened) @AQI; *AQD 0.4* - -[filament:Generic PLA (Door Opened) @AQI 0.6 nozzle] -renamed_from = "AzteQ Industrial (Door Opened) - PLA - Generic @0.6 nozzle" -inherits = Generic PLA (Door Opened) @AQI; *AQI 0.6* +[filament:AzteQ Industrial (Door Opened) - PLA - Generic @0.6 nozzle] +inherits = AzteQ Industrial (Door Opened) - PLA - Generic +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.6 +filament_max_volumetric_speed = 15 +filament_notes = "BN" -[filament:Fillamentum PLA (Door Opened) @AQI] -renamed_from = "AzteQ Industrial (Door Opened) - PLA - ExtraFill (Fillamentum)" -inherits = Generic PLA (Door Opened) @AQI; *AQI 0.4* +[filament:AzteQ Industrial (Door Opened) - PLA - ExtraFill (Fillamentum)] +inherits = AzteQ Industrial (Door Opened) - PLA - Generic filament_vendor = Fillamentum filament_cost = 24.27 filament_density = 1.24 filament_spool_weight = 229 -[filament:Fillamentum PLA (Door Opened) @AQI 0.6 nozzle] -renamed_from = "AzteQ Industrial (Door Opened) - PLA - ExtraFill (Fillamentum) @0.6 nozzle" -inherits = Fillamentum PLA (Door Opened) @AQI; *AQI 0.6* +[filament:AzteQ Industrial (Door Opened) - PLA - ExtraFill (Fillamentum) @0.6 nozzle] +inherits = AzteQ Industrial (Door Opened) - PLA - ExtraFill (Fillamentum) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.6 +filament_max_volumetric_speed = 15 +filament_notes = "BN" -[filament:Fillamentum PLA (PLA Printhead) @AQI] -renamed_from = "AzteQ Industrial (PLA Printhead) - PLA - ExtraFill (Fillamentum)" -inherits = *AQI 0.4* +[filament:AzteQ Industrial (PLA Printhead) - PLA - ExtraFill (Fillamentum)] +inherits = *AzteQ common* bed_temperature = 50 bridge_fan_speed = 100 cooling = 1 @@ -1742,16 +1440,17 @@ max_fan_speed = 100 min_fan_speed = 100 min_print_speed = 10 slowdown_below_layer_time = 5 -start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S0 ; Wait for chamber temperature" +start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S0 ; Set and wait - chamber temperature" temperature = 215 -[filament:Fillamentum PLA (PLA Printhead) @AQI 0.6 nozzle] -renamed_from = "AzteQ Industrial (PLA Printhead) - PLA - ExtraFill (Fillamentum) @0.6 nozzle" -inherits = Fillamentum PLA (PLA Printhead) @AQI; *AQI 0.6* +[filament:AzteQ Industrial (PLA Printhead) - PLA - ExtraFill (Fillamentum) @0.6 nozzle] +inherits = AzteQ Industrial (PLA Printhead) - PLA - ExtraFill (Fillamentum) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.6 +filament_max_volumetric_speed = 15 +filament_notes = "BN" -[filament:Generic ABS @AQI] -renamed_from = "AzteQ Industrial - ABS - Generic" -inherits = *AQI 0.4* +[filament:AzteQ Industrial - ABS - Generic] +inherits = *AzteQ common* bed_temperature = 100 bridge_fan_speed = 100 cooling = 1 @@ -1785,16 +1484,18 @@ max_fan_speed = 100 min_fan_speed = 80 min_print_speed = 10 slowdown_below_layer_time = 5 -start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S75 ; Wait for chamber temperature" +start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S75 ; Set and wait - chamber temperature" temperature = 255 -[filament:Generic ABS @AQI 0.6 nozzle] -renamed_from = "AzteQ Industrial - ABS - Generic @0.6 nozzle" -inherits = Generic ABS @AQI; *AQI 0.6* +[filament:AzteQ Industrial - ABS - Generic @0.6 nozzle] +inherits = AzteQ Industrial - ABS - Generic +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.6 +filament_max_volumetric_speed = 15 +filament_notes = "BN" -[filament:Generic ABS @AQI 0.8 nozzle] -renamed_from = "AzteQ Industrial - ABS - Generic @0.8 nozzle" -inherits = Generic ABS @AQI; *AQI 0.8* +[filament:AzteQ Industrial - ABS - Generic @0.8 nozzle] +inherits = AzteQ Industrial - ABS - Generic +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.8 first_layer_temperature = 255 first_layer_bed_temperature = 100 temperature = 255 @@ -1803,54 +1504,29 @@ max_fan_speed = 80 min_fan_speed = 50 filament_retract_length = 6.1 filament_max_volumetric_speed = 0 -start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S75 ; Wait for chamber temperature" +start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S75 ; Set and wait - chamber temperature" +filament_notes = "ZL" -[filament:Fillamentum ABS @AQI] -renamed_from = "AzteQ Industrial - ABS - ExtraFill (Fillamentum)" -inherits = Generic ABS @AQI; *AQI 0.4* +[filament:AzteQ Industrial - ABS - ExtraFill (Fillamentum)] +inherits = AzteQ Industrial - ABS - Generic filament_vendor = Fillamentum filament_cost = 24.27 filament_density = 1.04 filament_spool_weight = 229 -[filament:Fillamentum ABS @AQI 0.6 nozzle] -renamed_from = "AzteQ Industrial - ABS - ExtraFill (Fillamentum) @0.6 nozzle" -inherits = Fillamentum ABS @AQI; *AQI 0.6* +[filament:AzteQ Industrial - ABS - ExtraFill (Fillamentum) @0.6 nozzle] +inherits = AzteQ Industrial - ABS - ExtraFill (Fillamentum) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.6 +filament_notes = "BN" -[filament:Fillamentum ABS @AQI 0.8 nozzle] -renamed_from = "AzteQ Industrial - ABS - ExtraFill (Fillamentum) @0.8 nozzle" -inherits = Fillamentum ABS @AQI; *AQI 0.8* +[filament:AzteQ Industrial - ABS - ExtraFill (Fillamentum) @0.8 nozzle] +inherits = AzteQ Industrial - ABS - ExtraFill (Fillamentum) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.8 extrusion_multiplier = 0.95 +filament_notes = "ZL" -[filament:Prusa EasyABS @AQI] -inherits = Generic ABS @AQI; *AQI 0.4* -filament_type = ABST -bridge_fan_speed = 90 -max_fan_speed = 80 -min_fan_speed = 50 -fan_below_layer_time = 15 -slowdown_below_layer_time = 3 -extrusion_multiplier = 0.96 -filament_spool_weight = 230 -first_layer_temperature = 250 -temperature = 250 -filament_max_volumetric_speed = 10 -filament_retract_length = 4.7 -start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S50 ; Wait for chamber temperature" -filament_vendor = Prusa -filament_cost = 22.31 - -[filament:Prusa EasyABS @AQD] -inherits = Prusa EasyABS @AQI; *AQD 0.4* -min_fan_speed = 30 -min_print_speed = 15 -extrusion_multiplier = 0.925 -filament_retract_length = 4.2 -filament_retract_before_wipe = 80% - -[filament:Fillamentum PC/ABS @AQI] -renamed_from = "AzteQ Industrial - PC/ABS - (Fillamentum)" -inherits = Generic ABS @AQI; *AQI 0.4* +[filament:AzteQ Industrial - PC/ABS - (Fillamentum)] +inherits = AzteQ Industrial - ABS - Generic filament_vendor = Fillamentum filament_type = PCABS filament_cost = 53.71 @@ -1862,16 +1538,18 @@ first_layer_bed_temperature = 100 first_layer_temperature = 265 max_fan_speed = 50 min_fan_speed = 50 -start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S75 ; Wait for chamber temperature" +start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S75 ; Set and wait - chamber temperature" temperature = 265 +filament_notes = "S180 ; Probing temperature" -[filament:Fillamentum PC/ABS @AQI 0.6 nozzle] -renamed_from = "AzteQ Industrial - PC/ABS - (Fillamentum) @0.6 nozzle" -inherits = Fillamentum PC/ABS @AQI; *AQI 0.6* +[filament:AzteQ Industrial - PC/ABS - (Fillamentum) @0.6 nozzle] +inherits = AzteQ Industrial - PC/ABS - (Fillamentum) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.6 +filament_max_volumetric_speed = 15 +filament_notes = "BN" -[filament:Polymaker PC @AQI] -renamed_from = "AzteQ Industrial - PC - PolyMax (Polymaker)" -inherits = Generic ABS @AQI; *AQI 0.4* +[filament:AzteQ Industrial - PC - PolyMax (Polymaker)] +inherits = AzteQ Industrial - ABS - Generic filament_vendor = Polymaker filament_spool_weight = 230 filament_cost = 52.40 @@ -1882,16 +1560,18 @@ first_layer_bed_temperature = 100 first_layer_temperature = 265 max_fan_speed = 50 min_fan_speed = 50 -start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S75 ; Wait for chamber temperature" +start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S75 ; Set and wait - chamber temperature" temperature = 265 +filament_notes = "S180 ; Probing temperature" -[filament:Polymaker PC @AQI 0.6 nozzle] -renamed_from = "AzteQ Industrial - PC - PolyMax (Polymaker) @0.6 nozzle" -inherits = Polymaker PC @AQI; *AQI 0.6* +[filament:AzteQ Industrial - PC - PolyMax (Polymaker) @0.6 nozzle] +inherits = AzteQ Industrial - PC - PolyMax (Polymaker) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.6 +filament_max_volumetric_speed = 15 +filament_notes = "BN" -[filament:Generic ASA @AQI] -renamed_from = "AzteQ Industrial - ASA - Generic" -inherits = *AQI 0.4* +[filament:AzteQ Industrial - ASA - Generic] +inherits = *AzteQ common* bed_temperature = 100 bridge_fan_speed = 100 cooling = 1 @@ -1922,16 +1602,17 @@ max_fan_speed = 75 min_fan_speed = 50 min_print_speed = 10 slowdown_below_layer_time = 5 -start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S50 ; Wait for chamber temperature" +start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S50 ; Set and wait - chamber temperature" temperature = 265 -[filament:Generic ASA @AQI 0.6 nozzle] -renamed_from = "AzteQ Industrial - ASA - Generic @0.6 nozzle" -inherits = Generic ASA @AQI; *AQI 0.6* +[filament:AzteQ Industrial - ASA - Generic @0.6 nozzle] +inherits = AzteQ Industrial - ASA - Generic +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.6 +filament_max_volumetric_speed = 15 +filament_notes = "BN" -[filament:Fillamentum ASA @AQI] -renamed_from = "AzteQ Industrial - ASA - ExtraFill (Fillamentum)" -inherits = Generic ASA @AQI; *AQI 0.4* +[filament:AzteQ Industrial - ASA - ExtraFill (Fillamentum)] +inherits = AzteQ Industrial - ASA - Generic filament_vendor = Fillamentum first_layer_temperature = 255 temperature = 255 @@ -1941,27 +1622,29 @@ filament_spool_weight = 229 filament_cost = 29.53 filament_density = 1.07 -[filament:Fillamentum ASA @AQI 0.6 nozzle] -renamed_from = "AzteQ Industrial - ASA - ExtraFill (Fillamentum) @0.6 nozzle" -inherits = Fillamentum ASA @AQI; *AQI 0.6* +[filament:AzteQ Industrial - ASA - ExtraFill (Fillamentum) @0.6 nozzle] +inherits = AzteQ Industrial - ASA - ExtraFill (Fillamentum) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.6 +filament_max_volumetric_speed = 15 +filament_notes = "BN" -[filament:Fillamentum ASA @AQI 0.8 nozzle] -renamed_from = "AzteQ Industrial - ASA - ExtraFill (Fillamentum) @0.8 nozzle" -inherits = Fillamentum ASA @AQI; *AQI 0.8* +[filament:AzteQ Industrial - ASA - ExtraFill (Fillamentum) @0.8 nozzle] +inherits = AzteQ Industrial - ASA - ExtraFill (Fillamentum) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.8 first_layer_bed_temperature = 100 bed_temperature = 100 first_layer_temperature = 250 temperature = 250 -start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S50 ; Wait for chamber temperature" +start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S50 ; Set and wait - chamber temperature" max_fan_speed = 100 min_fan_speed = 80 filament_retract_length = 6.1 filament_max_volumetric_speed = 0 +filament_notes = "ZL" -[filament:Prusament ASA @AQI] -renamed_from = "AzteQ Industrial - ASA - Prusament (Prusa Polymers)" -inherits = Generic ASA @AQI; *AQI 0.4* +[filament:AzteQ Industrial - ASA - Prusament (Prusa Polymers)] +inherits = AzteQ Industrial - ASA - Generic filament_cost = 29.16 filament_density = 1.07 filament_spool_weight = 201 @@ -1969,37 +1652,32 @@ filament_vendor = Prusa Polymers first_layer_temperature = 260 max_fan_speed = 70 min_fan_speed = 70 -start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S50 ; Wait for chamber temperature" +start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S50 ; Set and wait - chamber temperature" temperature = 260 -[filament:Prusament ASA @AQI 0.6 nozzle] -renamed_from = "AzteQ Industrial - ASA - Prusament (Prusa Polymers) @0.6 nozzle" -inherits = Prusament ASA @AQI; *AQI 0.6* +[filament:AzteQ Industrial - ASA - Prusament (Prusa Polymers) @0.6 nozzle] +inherits = AzteQ Industrial - ASA - Prusament (Prusa Polymers) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.6 +filament_max_volumetric_speed = 15 +filament_notes = "BN" -[filament:Prusament ASA @AQI 0.8 nozzle] -renamed_from = "AzteQ Industrial - ASA - Prusament (Prusa Polymers) @0.8 nozzle" -inherits = Prusament ASA @AQI; *AQI 0.8* +[filament:AzteQ Industrial - ASA - Prusament (Prusa Polymers) @0.8 nozzle] +inherits = AzteQ Industrial - ASA - Prusament (Prusa Polymers) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.8 first_layer_bed_temperature = 100 bed_temperature = 100 first_layer_temperature = 250 temperature = 250 -start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S75 ; Wait for chamber temperature" +start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S75 ; Set and wait - chamber temperature" max_fan_speed = 80 min_fan_speed = 50 filament_retract_length = 4.1 filament_max_volumetric_speed = 0 +filament_notes = "ZL" -[filament:Prusament ASA @AQD] -inherits = Prusament ASA @AQI; *AQD 0.4* -extrusion_multiplier = 0.925 -first_layer_temperature = 250 -temperature = 250 -filament_retract_length = 2.7 -min_fan_speed = 20 -[filament:Fiberlogy Nylon PA12 @AQI] -renamed_from = "AzteQ Industrial - PA - Nylon PA12 (Fiberlogy)" -inherits = *AQI 0.4* +[filament:AzteQ Industrial - PA - Nylon PA12 (Fiberlogy)] +inherits = *AzteQ common* bed_temperature = 100 bridge_fan_speed = 100 cooling = 1 @@ -2023,7 +1701,7 @@ filament_retract_restart_extra = nil filament_retract_speed = 25 filament_soluble = 0 filament_toolchange_delay = 0 -filament_type = PA +filament_type = NYLON filament_unload_time = 0 filament_unloading_speed = 90 filament_unloading_speed_start = 100 @@ -2036,16 +1714,17 @@ max_fan_speed = 75 min_fan_speed = 50 min_print_speed = 10 slowdown_below_layer_time = 5 -start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S50 ; Wait for chamber temperature" +start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S50 ; Set and wait - chamber temperature" temperature = 255 -[filament:Fiberlogy Nylon PA12 @AQI 0.6 nozzle] -renamed_from = "AzteQ Industrial - PA - Nylon PA12 (Fiberlogy) @0.6 nozzle" -inherits = Fiberlogy Nylon PA12 @AQI; *AQI 0.6* +[filament:AzteQ Industrial - PA - Nylon PA12 (Fiberlogy) @0.6 nozzle] +inherits = AzteQ Industrial - PA - Nylon PA12 (Fiberlogy) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.6 +filament_max_volumetric_speed = 15 +filament_notes = "BN" -[filament:Fillamentum Nylon FX256 @AQI] -renamed_from = "AzteQ Industrial - PA - Nylon FX256 (Fillamentum)" -inherits = *AQI 0.4* +[filament:AzteQ Industrial - PA - Nylon FX256 (Fillamentum)] +inherits = *AzteQ common* bed_temperature = 100 bridge_fan_speed = 100 cooling = 1 @@ -2069,7 +1748,7 @@ filament_retract_restart_extra = nil filament_retract_speed = 25 filament_soluble = 0 filament_toolchange_delay = 0 -filament_type = PA +filament_type = NYLON filament_unload_time = 0 filament_unloading_speed = 90 filament_unloading_speed_start = 100 @@ -2082,16 +1761,17 @@ max_fan_speed = 85 min_fan_speed = 50 min_print_speed = 10 slowdown_below_layer_time = 5 -start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S60 ; Wait for chamber temperature" +start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S60 ; Set and wait - chamber temperature" temperature = 255 -[filament:Fillamentum Nylon FX256 @AQI 0.6 nozzle] -renamed_from = "AzteQ Industrial - PA - Nylon FX256 (Fillamentum) @0.6 nozzle" -inherits = Fillamentum Nylon FX256 @AQI; *AQI 0.6* +[filament:AzteQ Industrial - PA - Nylon FX256 (Fillamentum) @0.6 nozzle] +inherits = AzteQ Industrial - PA - Nylon FX256 (Fillamentum) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.6 +filament_max_volumetric_speed = 15 +filament_notes = "BN" -[filament:Prusament PC Blend @AQI] -renamed_from = "AzteQ Industrial - PC Blend - Prusament (Prusa Polymers)" -inherits = *AQI 0.4* +[filament:AzteQ Industrial - PC Blend - Prusament (Prusa Polymers)] +inherits = *AzteQ common* bed_temperature = 100 bridge_fan_speed = 75 cooling = 1 @@ -2124,25 +1804,29 @@ max_fan_speed = 50 min_fan_speed = 30 min_print_speed = 10 slowdown_below_layer_time = 5 -start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S75 ; Wait for chamber temperature" +start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S75 ; Set and wait - chamber temperature" temperature = 270 +filament_notes = "S180 ; Probing temperature" -[filament:Prusament PC Blend @AQI 0.6 nozzle] -renamed_from = "AzteQ Industrial - PC Blend - Prusament (Prusa Polymers) @0.6 nozzle" -inherits = Prusament PC Blend @AQI; *AQI 0.6* +[filament:AzteQ Industrial - PC Blend - Prusament (Prusa Polymers) @0.6 nozzle] +inherits = AzteQ Industrial - PC Blend - Prusament (Prusa Polymers) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.6 +filament_max_volumetric_speed = 15 +filament_notes = "BN" -[filament:Prusament PC Blend @AQI 0.8 nozzle] -renamed_from = "AzteQ Industrial - PC Blend - Prusament (Prusa Polymers) @0.8 nozzle" -inherits = Prusament PC Blend @AQI; *AQI 0.8* +[filament:AzteQ Industrial - PC Blend - Prusament (Prusa Polymers) @0.8 nozzle] +inherits = AzteQ Industrial - PC Blend - Prusament (Prusa Polymers) +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_MODEL_AQI.*/ and nozzle_diameter[0]==0.8 first_layer_bed_temperature = 100 bed_temperature = 100 first_layer_temperature = 275 temperature = 275 -start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S75 ; Wait for chamber temperature" +start_filament_gcode = "; FILAMENT_START_GCODE\nM191 S75 ; Set and wait - chamber temperature" max_fan_speed = 60 min_fan_speed = 60 filament_retract_length = 7.1 filament_max_volumetric_speed = 0 +filament_notes = "ZL" # DeltiQ Printer # @@ -2159,7 +1843,7 @@ default_print_profile = DeltiQ 0.20mm Normal deretract_speed = 0 end_gcode = ;END\nM104 S0 ; Turn extruder heater off\nM140 S0 ; Turn bed heater off\nG28 ; Home all axes\nM84 S5 ; Stop all axes and hold inidle for 5 seconds\nG90 ; Absolute positioning extra_loading_move = -2 -extruder_colour = #EC626F +extruder_colour = #FF0000 extruder_offset = 0x0 gcode_flavor = repetier layer_gcode = ;AFTER_LAYER_CHANGE\nM117 layer [layer_num] at [layer_z]mm\n;[layer_z]\n @@ -2226,33 +1910,15 @@ retract_speed = 35 [printer:*DeltiQ 2*] inherits = *DeltiQ* -default_filament_profile = "Prusament PLA @DQ2" -default_print_profile = 0.20mm Normal @DQ2 +default_filament_profile = "DeltiQ - PLA - Prusament (Prusa Polymers)" +default_print_profile = DeltiQ 0.20mm Normal before_layer_gcode = ; BEFORE_LAYER_CHANGE\n;[layer_z]\nG92 E0\n end_gcode = ; END_GCODE\n\nM140 S0 ; Turn off bed\n\nG28 ; Home\n\nM104 S0 ; Turn off extruder\nM107 ; Turn off fan\n\nG90 ; Absolute positioning\nM220 S100 ; Feedmultiply back to 100percent\n\nM84 S5; Disable motors gcode_flavor = reprapfirmware layer_gcode = ; AFTER_LAYER_CHANGE\n;[layer_z] pause_print_gcode = M25 -start_gcode = ; START_GCODE\n\nT0 ; Select Titan extruder\nM220 S100 ; Set feedmultiply back to 100percent\n\nG90 ; Absolute positioning\nM83; Relative Extruder\n\nG28 ; Home all axes\n\nM190 S[first_layer_bed_temperature] ; Set and wait - bed temperature\nM104 S[first_layer_temperature]\n\nG32 ; Probe Z and calculate Z plane\nG29 ; Mesh bed probe\n\nG1009 ; Go ARC to purge end\n\nG92 E0 ; Zero extruder +start_gcode = ; START_GCODE\n\nM220 S100 ; Set feedmultiply back to 100percent\n\nT0 ; Select Titan extruder\n\nG90 ; Absolute positioning\nM83; Relative Extruder\n\nG28 ; Home all axes\n\nM190 S[first_layer_bed_temperature] ; Set and wait - bed temperature\nM104 S[first_layer_temperature]\n\nG28 ; Home all axes\nG32 ; Probe Z and calculate Z plane\n\nG29 ; Mesh bed probe\n\nG1009 ; Go ARC to purge end\n\nG92 E0 ; Zero extruder printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_TRILAB\nPRINTER_FAMILY_DQ\nPRINTER_MODEL_DQ2 -machine_limits_usage = time_estimate_only -machine_max_acceleration_e = 9000 -machine_max_acceleration_extruding = 1000 -machine_max_acceleration_retracting = 1000 -machine_max_acceleration_travel = 2000 -machine_max_acceleration_x = 2000 -machine_max_acceleration_y = 2000 -machine_max_acceleration_z = 2000 -machine_max_feedrate_e = 50 -machine_max_feedrate_x = 300 -machine_max_feedrate_y = 300 -machine_max_feedrate_z = 300 -machine_max_jerk_e = 20 -machine_max_jerk_x = 10 -machine_max_jerk_y = 10 -machine_max_jerk_z = 10 -machine_min_extruding_rate = 0 -machine_min_travel_rate = 0 [printer:DeltiQ 2] inherits = *DeltiQ 2* @@ -2266,8 +1932,8 @@ printer_variant = 0.25 max_layer_height = 0.15 min_layer_height = 0.07 nozzle_diameter = 0.25 -default_filament_profile = "Fillamentum PLA @DQ2 0.25 nozzle" -default_print_profile = 0.07mm Quality @DQ2 0.25 nozzle +default_filament_profile = "DeltiQ - PLA - ExtraFill (Fillamentum) @0.25 nozzle" +default_print_profile = DeltiQ 0.07mm Quality @0.25 nozzle [printer:DeltiQ 2 - 0.6 nozzle] inherits = DeltiQ 2 @@ -2275,8 +1941,8 @@ printer_variant = 0.6 max_layer_height = 0.4 min_layer_height = 0.2 nozzle_diameter = 0.6 -default_filament_profile = "Prusament PLA @DQ2 0.6 nozzle" -default_print_profile = 0.30mm Normal @DQ2 0.6 nozzle +default_filament_profile = "DeltiQ - PLA - Prusament (Prusa Polymers) @0.6 nozzle" +default_print_profile = DeltiQ 0.30mm Normal @0.6 nozzle [printer:DeltiQ 2 - 0.8 nozzle] inherits = DeltiQ 2 @@ -2284,8 +1950,8 @@ printer_variant = 0.8 max_layer_height = 0.6 min_layer_height = 0.3 nozzle_diameter = 0.8 -default_filament_profile = "Prusament PLA @DQ2 0.8 nozzle" -default_print_profile = 0.40mm Normal @DQ2 0.8 nozzle +default_filament_profile = "DeltiQ - PLA - Prusament (Prusa Polymers) @0.8 nozzle" +default_print_profile = DeltiQ 0.40mm Normal @0.8 nozzle [printer:DeltiQ 2 Plus] inherits = *DeltiQ 2* @@ -2299,8 +1965,8 @@ printer_variant = 0.25 max_layer_height = 0.15 min_layer_height = 0.07 nozzle_diameter = 0.25 -default_filament_profile = "Fillamentum PLA @DQ2 0.25 nozzle" -default_print_profile = 0.07mm Quality @DQ2 0.25 nozzle +default_filament_profile = "DeltiQ - PLA - ExtraFill (Fillamentum) @0.25 nozzle" +default_print_profile = DeltiQ 0.07mm Quality @0.25 nozzle [printer:DeltiQ 2 Plus - 0.6 nozzle] inherits = DeltiQ 2 Plus @@ -2308,8 +1974,8 @@ printer_variant = 0.6 max_layer_height = 0.4 min_layer_height = 0.2 nozzle_diameter = 0.6 -default_filament_profile = "Prusament PLA @DQ2 0.6 nozzle" -default_print_profile = 0.30mm Normal @DQ2 0.6 nozzle +default_filament_profile = "DeltiQ - PLA - Prusament (Prusa Polymers) @0.6 nozzle" +default_print_profile = DeltiQ 0.30mm Normal @0.6 nozzle [printer:DeltiQ 2 Plus - 0.8 nozzle] inherits = DeltiQ 2 Plus @@ -2317,18 +1983,17 @@ printer_variant = 0.8 max_layer_height = 0.6 min_layer_height = 0.3 nozzle_diameter = 0.8 -default_filament_profile = "Prusament PLA @DQ2 0.8 nozzle" -default_print_profile = 0.40mm Normal @DQ2 0.8 nozzle +default_filament_profile = "DeltiQ - PLA - Prusament (Prusa Polymers) @0.8 nozzle" +default_print_profile = DeltiQ 0.40mm Normal @0.8 nozzle [printer:*DeltiQ 2 FlexPrint*] inherits = *DeltiQ 2* start_gcode = ; START_GCODE\n\nM220 S100 ; Set feedmultiply back to 100percent\n\nT1 ; Select FlexPrint extruder\n\nG90 ; Absolute positioning\nM83; Relative Extruder\n\nG28 ; Home all axes\n\nM190 S[first_layer_bed_temperature] ; Set and wait - bed temperature\nM104 S[first_layer_temperature]\n\nG28 ; Home all axes\nG32 ; Probe Z and calculate Z plane\n\nG29 ; Mesh bed probe\n\nG1009 ; Go ARC to purge end\n\nG92 E0 ; Zero extruder -default_print_profile = 0.20mm FLEX @DQ2FP -default_filament_profile = "Generic FLEX @DQ2FP" +default_print_profile = DeltiQ 0.20mm FLEX +default_filament_profile = "DeltiQ FP2 - FLEX - Generic" retract_length = 0.7 retract_speed = 25 printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_TRILAB\nPRINTER_FAMILY_DQ\nPRINTER_MODEL_DQ2+FP\nFLEXPRINT1 -machine_max_jerk_e = 0.6 [printer:DeltiQ 2 + FlexPrint] inherits = *DeltiQ 2 FlexPrint* @@ -2344,7 +2009,7 @@ max_print_height = 500 [printer:*DeltiQ 2 FlexPrint 2*] inherits = *DeltiQ 2 FlexPrint* -default_filament_profile = "Generic FLEX @DQ2FP2" +default_filament_profile = "DeltiQ FP2 - FLEX - Generic" retract_length = 0.8 retract_speed = 25 printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_TRILAB\nPRINTER_FAMILY_DQ\nPRINTER_MODEL_DQ2+FP\nFLEXPRINT2 @@ -2361,7 +2026,7 @@ printer_model = DQ2P+FP2 printer_variant = 0.4 max_print_height = 500 -[printer:*AQI*] +[printer:*AzteQ*] inherits = *DeltiQ 2* max_print_height = 400 bed_shape = 149.429x13.0734,147.721x26.0472,144.889x38.8229,140.954x51.303,135.946x63.3927,129.904x75,122.873x86.0365,114.907x96.4181,106.066x106.066,96.4181x114.907,86.0365x122.873,75x129.904,63.3927x135.946,51.303x140.954,38.8229x144.889,26.0472x147.721,13.0734x149.429,9.18485e-15x150,-13.0734x149.429,-26.0472x147.721,-38.8229x144.889,-51.303x140.954,-63.3927x135.946,-75x129.904,-86.0365x122.873,-96.4181x114.907,-106.066x106.066,-114.907x96.4181,-122.873x86.0365,-129.904x75,-135.946x63.3927,-140.954x51.303,-144.889x38.8229,-147.721x26.0472,-149.429x13.0734,-150x1.83697e-14,-149.429x-13.0734,-147.721x-26.0472,-144.889x-38.8229,-140.954x-51.303,-135.946x-63.3927,-129.904x-75,-122.873x-86.0365,-114.907x-96.4181,-106.066x-106.066,-96.4181x-114.907,-86.0365x-122.873,-75x-129.904,-63.3927x-135.946,-51.303x-140.954,-38.8229x-144.889,-26.0472x-147.721,-13.0734x-149.429,-2.75546e-14x-150,13.0734x-149.429,26.0472x-147.721,38.8229x-144.889,51.303x-140.954,63.3927x-135.946,75x-129.904,86.0365x-122.873,96.4181x-114.907,106.066x-106.066,114.907x-96.4181,122.873x-86.0365,129.904x-75,135.946x-63.3927,140.954x-51.303,144.889x-38.8229,147.721x-26.0472,149.429x-13.0734,150x-3.67394e-14 @@ -2380,16 +2045,16 @@ retract_lift_below = 0 retract_restart_extra = 0 retract_restart_extra_toolchange = 0 retract_speed = 30 -start_gcode = ; START_GCODE\nT0\nM220 S100 ; Set feedmultiply back to 100 percent\n\nG90 ; Absolute positioning for motion\nM83 ; Relative extruder\nM107 ; Layer fan off\n\nG28 ; Home all axes\n\nM140 S[first_layer_bed_temperature] ; Set bed temperature\nM104 S{if filament_type[0]=~/(ABS)?(ABST)?(PC)?(PCABS)?(PA)?(PACF)?(PAGF)?/}180{else}150{endif} ; Set hotend material specific probing temperature\n[start_filament_gcode]\nM190 ; Wait for bed temperature\nM109 ; Wait for hotend probing temperature\n\nG32 ; Probe Z and calculate Z plane\nG29 ; Mesh bed probe\n\nM104 S[first_layer_temperature] ; Set hotend printing temperature\n\nG1009 ; Purge hotend\nG92 E0 ; Zero extruder +start_gcode = ; START_GCODE\nT0\nM220 S100 ; Set feedmultiply back to 100 percent\nG90 ; Absolute positioning for motion\nM83 ; Relative extruder\nM107 ; Layer fan off\n\nG28 ; Home all axes\n\nM140 S[first_layer_bed_temperature] ; Set and continue - bed temperature\nM104 S150 ; Set and continue - hotend probing temperature\n[start_filament_gcode]\nM190 S[first_layer_bed_temperature] ; Set and wait - bed temperature\nM109 [filament_notes] ; Set and wait for material specific hotend probing temperature\n\nG28 ; Home all axes\nG32 ; Probe Z and calculate Z plane\nG29 ; Mesh bed probe\n\nM104 S[first_layer_temperature] ; Set and continue - printing temperature\n\nG1009 ; Purge hotend\nG92 E0 ; Zero extruder wipe = 1 [printer:AzteQ Industrial] -inherits = *AQI* +inherits = *AzteQ* printer_model = AQI printer_variant = 0.4 max_print_height = 400 -default_filament_profile = "Prusament ASA @AQI" -default_print_profile = 0.20mm Normal @AQ +default_filament_profile = "AzteQ Industrial - ASA - Prusament (Prusa Polymers)" +default_print_profile = AzteQ Industrial 0.30mm Normal [printer:AzteQ Industrial - 0.6 nozzle] inherits = AzteQ Industrial @@ -2397,8 +2062,8 @@ printer_variant = 0.6 max_layer_height = 0.4 min_layer_height = 0.2 nozzle_diameter = 0.6 -default_filament_profile = "Prusament ASA @AQI 0.6 nozzle" -default_print_profile = 0.30mm Normal @AQ 0.6 nozzle +default_filament_profile = "AzteQ Industrial - ASA - Prusament (Prusa Polymers) @0.6 nozzle" +default_print_profile = AzteQ Industrial 0.30mm Normal @0.6 nozzle [printer:AzteQ Industrial - 0.8 nozzle] inherits = AzteQ Industrial @@ -2406,23 +2071,10 @@ printer_variant = 0.8 max_layer_height = 0.6 min_layer_height = 0.2 nozzle_diameter = 0.8 -default_filament_profile = "Prusament ASA @AQI 0.8 nozzle" -default_print_profile = 0.40mm Normal @AQ 0.8 nozzle - -[printer:*AQD*] -inherits = *AQI* -printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_TRILAB\nPRINTER_FAMILY_AQ\nPRINTER_MODEL_AQD -start_gcode = ; START_GCODE\nT0\nM220 S100 ; Set feedmultiply back to 100 percent\n\nG90 ; Absolute positioning for motion\nM83 ; Relative extruder\nM107 ; Layer fan off\n\nG28 ; Home all axes\n\nM140 S[first_layer_bed_temperature] ; Set bed temperature\nM104 S{if filament_type[0]=~/(ABS)?(ABST)?(PC)?(PCABS)?(PA)?(PACF)?(PAGF)?/}180{else}150{endif} ; Set hotend material specific probing temperature\n[start_filament_gcode]\nM190 ; Wait for bed temperature\nM109 ; Wait for hotend probing temperature\n\nG32 ; Probe Z and calculate Z plane\nG29 ; Mesh bed probe\n\nM104 S[first_layer_temperature] ; Set hotend printing temperature\n\nG1009 ; Purge hotend\nG92 E0 ; Zero extruder - -[printer:AzteQ Dynamic] -inherits = *AQD* -printer_model = AQD -printer_variant = 0.4 -max_print_height = 400 -default_filament_profile = "Prusament ASA @AQI" -default_print_profile = 0.20mm Normal @AQ +default_filament_profile = "AzteQ Industrial - ASA - Prusament (Prusa Polymers) @0.8 nozzle" +default_print_profile = AzteQ Industrial 0.40mm Normal @0.8 nozzle [presets] -print = 0.20mm Normal @DQ2 +print = DeltiQ 0.20mm Normal printer = DeltiQ 2 -filament = Prusament PLA @DQ2 \ No newline at end of file +filament = DeltiQ - PLA - Prusament (Prusa Polymers) \ No newline at end of file diff --git a/resources/profiles/Ultimaker.idx b/resources/profiles/Ultimaker.idx index a593d2fb4b9..605b87e071b 100644 --- a/resources/profiles/Ultimaker.idx +++ b/resources/profiles/Ultimaker.idx @@ -1,2 +1,4 @@ min_slic3r_version = 2.4.0-beta0 +1.0.2 Fixed start g-code. +1.0.1 Updated start g-code. 1.0.0 Initial version diff --git a/resources/profiles/Ultimaker.ini b/resources/profiles/Ultimaker.ini index 363e0dec8a0..f3e30db4008 100644 --- a/resources/profiles/Ultimaker.ini +++ b/resources/profiles/Ultimaker.ini @@ -9,7 +9,7 @@ name = Ultimaker # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 1.0.0 +config_version = 1.0.2 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Ultimaker/ @@ -396,5 +396,5 @@ printer_notes = Dont remove the following keywords! These keywords are used in t nozzle_diameter = 0.4 default_print_profile = 0.20mm NORMAL @ULTIMAKER2 default_filament_profile = Generic PLA @ULTIMAKER2 -start_gcode = ; Printer_Settings_ID: [printer_settings_id]\n\n; # # # # # # START Header\nG21 ; metric values\nG90 ; absolute positioning\nM82 ; set extruder to absolute mode\nM107 ; start with the fan off\n\nG28 X0 Y0 Z0 ; move X/Y/Z to endstops\nG1 X1 Y6 F15000 ; move X/Y to start position\nG1 Z35 F9000 ; move Z to start position\n\n; Heat up bed and nozzle\nM190 S{first_layer_bed_temperature[0] - 5} ; wait for bed temperature - 5\nM140 S[first_layer_bed_temperature] ; continue bed heating\nM109 S[first_layer_temperature] ; wait for nozzle temperature\n\nG92 E0 ; zero the extruded length\nG1 F150 E22 ; purge nozzle with filament\nG92 E0 ; zero the extruded length again\nG1 F75 E7 ; additional priming\nG92 E0 ; zero the extruded length again\n\n; # # # # # # END Header +start_gcode = ; Printer_Settings_ID: [printer_settings_id]\n\n; # # # # # # START Header\nG21 ; metric values\nG90 ; absolute positioning\nM82 ; set extruder to absolute mode\nM107 ; start with the fan off\n\nM140 S[first_layer_bed_temperature] ; start bed heating\n\nG28 X0 Y0 Z0 ; move X/Y/Z to endstops\nG1 X1 Y6 F15000 ; move X/Y to start position\nG1 Z35 F9000 ; move Z to start position\n\n; Wait for bed and nozzle temperatures\nM190 S{first_layer_bed_temperature[0] - 5} ; wait for bed temperature - 5\nM140 S[first_layer_bed_temperature] ; continue bed heating\nM109 S[first_layer_temperature] ; wait for nozzle temperature\n\n; Purge and prime\nM83 ; set extruder to relative mode\nG92 E0 ; reset extrusion distance\nG0 X0 Y1 F10000\nG1 F150 E20 ; compress the bowden tube\nG1 E-8 F1200\nG0 X30 Y1 F5000 \nG0 F1200 Z{first_layer_height/2} ; Cut the connection to priming blob\nG0 X100 F10000 ; disconnect with the prime blob\nG0 X50 ; Avoid the metal clip holding the Ultimaker glass plate\nG0 Z0.2 F720\nG1 E8 F1200\nG1 X80 E3 F1000 ; intro line 1\nG1 X110 E4 F1000 ; intro line 2\nG1 X140 F600 ; drag filament to decompress bowden tube\nG1 X100 F3200 ; wipe backwards a bit\nG1 X150 F3200 ; back to where there is no plastic: avoid dragging\nG92 E0 ; reset extruder reference\nM82 ; set extruder to absolute mode\n\n; # # # # # # END Header end_gcode = ; # # # # # # START Footer\nG91 ; relative coordinates\n;G1 E-1 F1200 ; retract the filament\nG1 Z+15 X-10 Y-10 E-7 F6000 ; move Z a bit\n; G1 X-10 Y-10 F6000 ; move XY a bit\nG1 E-5.5 F300 ; retract the filament\nG28 X0 Y0 ; move X/Y to min endstops, so the head is out of the way\nM104 S0 ; extruder heater off\nM140 S0 ; heated bed heater off (if you have it)\nM84 ; disable motors\n; # # # # # # END Footer\n diff --git a/resources/profiles/Voron.idx b/resources/profiles/Voron.idx index a593d2fb4b9..a169eb751ec 100644 --- a/resources/profiles/Voron.idx +++ b/resources/profiles/Voron.idx @@ -1,2 +1,4 @@ +min_slic3r_version = 2.4.2 +1.0.1 Added 350mm Voron v1 variant. Updated max print heights. Removed redundant v1 volcano nozzle variants. min_slic3r_version = 2.4.0-beta0 1.0.0 Initial version diff --git a/resources/profiles/Voron.ini b/resources/profiles/Voron.ini index cd0fbd2d9a0..e34da50100e 100644 --- a/resources/profiles/Voron.ini +++ b/resources/profiles/Voron.ini @@ -7,7 +7,7 @@ name = Voron # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 1.0.0 +config_version = 1.0.1 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Voron/ @@ -72,21 +72,30 @@ default_materials = Basic PLA @VORON; Basic PLA VOLCANO @VORON; Basic PET @VORON [printer_model:Voron_v1_250_afterburner] name = Voron v1 250mm3 -variants = 0.4; 0.25; 0.3; 0.5; 0.6; 0.8; volcano 0.6; volcano 0.8; volcano 1.0; volcano 1.2 +variants = 0.4; 0.25; 0.3; 0.5; 0.6; 0.8 technology = FFF family = Voron v1 Afterburner bed_model = printbed-v1-250.stl bed_texture = bedtexture-v1-250.png -default_materials = Basic PLA @VORON; Basic PLA VOLCANO @VORON; Basic PET @VORON; Basic PET VOLCANO @VORON; Basic ABS @VORON; Basic ABS VOLCANO @VORON +default_materials = Basic PLA @VORON; Basic PET @VORON; Basic ABS @VORON [printer_model:Voron_v1_300_afterburner] name = Voron v1 300mm3 -variants = 0.4; 0.25; 0.3; 0.5; 0.6; 0.8; volcano 0.6; volcano 0.8; volcano 1.0; volcano 1.2 +variants = 0.4; 0.25; 0.3; 0.5; 0.6; 0.8 technology = FFF family = Voron v1 Afterburner bed_model = printbed-v1-300.stl bed_texture = bedtexture-v1-300.png -default_materials = Basic PLA @VORON; Basic PLA VOLCANO @VORON; Basic PET @VORON; Basic PET VOLCANO @VORON; Basic ABS @VORON; Basic ABS VOLCANO @VORON +default_materials = Basic PLA @VORON; Basic PET @VORON; Basic ABS @VORON + +[printer_model:Voron_v1_350_afterburner] +name = Voron v1 350mm3 +variants = 0.4; 0.25; 0.3; 0.5; 0.6; 0.8 +technology = FFF +family = Voron v1 Afterburner +bed_model = printbed-v1-350.stl +bed_texture = bedtexture-v2-350.png +default_materials = Basic PLA @VORON; Basic PET @VORON; Basic ABS @VORON [printer_model:Voron_v0_120] name = Voron Zero 120mm3 @@ -239,21 +248,21 @@ retract_speed = 50 [printer:*Voron_v2_250*] inherits = *common* bed_shape = 0x0,250x0,250x250,0x250 -max_print_height = 250 +max_print_height = 230 printer_model = Voron_v2_250 printer_notes = Unoffical profile.\nPRINTER_HAS_BOWDEN\nE3DV6 [printer:*Voron_v2_300*] inherits = *common* bed_shape = 0x0,300x0,300x300,0x300 -max_print_height = 300 +max_print_height = 280 printer_model = Voron_v2_300 printer_notes = Unoffical profile.\nPRINTER_HAS_BOWDEN\nE3DV6 [printer:*Voron_v2_350*] inherits = *common* bed_shape = 0x0,350x0,350x350,0x350 -max_print_height = 350 +max_print_height = 330 printer_model = Voron_v2_350 printer_notes = Unoffical profile.\nPRINTER_HAS_BOWDEN\nE3DV6 @@ -282,10 +291,17 @@ printer_notes = Unoffical profile.\nE3DV6 [printer:*Voron_v1_300_afterburner*] inherits = *common*; *afterburner* bed_shape = 0x0,300x0,300x300,0x300 -max_print_height = 230 +max_print_height = 280 printer_model = Voron_v1_300_afterburner printer_notes = Unoffical profile.\nE3DV6 +[printer:*Voron_v1_350_afterburner*] +inherits = *common*; *afterburner* +bed_shape = 0x0,350x0,350x350,0x350 +max_print_height = 330 +printer_model = Voron_v1_350_afterburner +printer_notes = Unoffical profile.\nE3DV6 + [printer:*Voron_v0_120*] inherits = *common* bed_shape = 0x0,120x0,120x120,0x120 @@ -455,6 +471,24 @@ inherits = *Voron_v1_300_afterburner*; *0.6nozzle* [printer:Voron_v1_300_afterburner 0.8 nozzle] inherits = *Voron_v1_300_afterburner*; *0.8nozzle* +[printer:Voron_v1_350_afterburner 0.25 nozzle] +inherits = *Voron_v1_350_afterburner*; *0.25nozzle* + +[printer:Voron_v1_350_afterburner 0.3 nozzle] +inherits = *Voron_v1_350_afterburner*; *0.3nozzle* + +[printer:Voron_v1_350_afterburner 0.4 nozzle] +inherits = *Voron_v1_350_afterburner*; *0.4nozzle* + +[printer:Voron_v1_350_afterburner 0.5 nozzle] +inherits = *Voron_v1_350_afterburner*; *0.5nozzle* + +[printer:Voron_v1_350_afterburner 0.6 nozzle] +inherits = *Voron_v1_350_afterburner*; *0.6nozzle* + +[printer:Voron_v1_350_afterburner 0.8 nozzle] +inherits = *Voron_v1_350_afterburner*; *0.8nozzle* + [printer:Voron_v2_250_afterburner 0.25 nozzle] inherits = *Voron_v2_250_afterburner*; *0.25nozzle* @@ -652,7 +686,7 @@ fill_angle = 45 fill_density = 15% fill_pattern = gyroid first_layer_acceleration = 1000 -first_layer_height = 75% +first_layer_height = 0.2 first_layer_speed = 30 gap_fill_speed = 40 gcode_comments = 0 diff --git a/resources/profiles/Voron/Voron_v1_250_afterburner_thumbnail.png b/resources/profiles/Voron/Voron_v1_250_afterburner_thumbnail.png index 07c3202cac80a383e4a6539a0763325ab43258b3..2b933909755680716b75387e46af97b002f5a763 100644 GIT binary patch literal 39990 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 Uh|lYE0tCEn-!L^m>)S{F56q%YMF0Q* literal 64932 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

    >BkWU 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 YsJ>ZkHKKuFay{g|jFNPb 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 Uh|lYE0tCEn-!L^m>)S{F56q%YMF0Q* literal 64932 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

    >BkWU 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 YsJ>ZkHKKuFay{g|jFNPb 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 Uh|lYE0tCEn-!L^m>)S{F56q%YMF0Q* literal 64932 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

    >BkWU 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 YsJ>ZkHKKuFay{g|jFNP use darker color @@ -70,18 +77,13 @@ void main() float delta_radius = print_volume.xy_data.z - distance(world_pos.xy, print_volume.xy_data.xy); pv_check_min = vec3(delta_radius, 0.0, world_pos.z - print_volume.z_data.x); pv_check_max = vec3(0.0, 0.0, world_pos.z - print_volume.z_data.y); - } - color = (any(lessThan(pv_check_min, ZERO)) || any(greaterThan(pv_check_max, ZERO))) ? mix(color, ZERO, 0.3333) : color; + } + color.rgb = (any(lessThan(pv_check_min, ZERO)) || any(greaterThan(pv_check_max, ZERO))) ? mix(color.rgb, ZERO, 0.3333) : color.rgb; #ifdef ENABLE_ENVIRONMENT_MAP if (use_environment_tex) - gl_FragColor = vec4(0.45 * texture2D(environment_tex, normalize(eye_normal).xy * 0.5 + 0.5).xyz + 0.8 * color * intensity.x, alpha); + gl_FragColor = vec4(0.45 * texture(environment_tex, normalize(eye_normal).xy * 0.5 + 0.5).xyz + 0.8 * color.rgb * intensity.x, color.a); else #endif - gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); - - // In the support painting gizmo and the seam painting gizmo are painted triangles rendered over the already - // rendered object. To resolved z-fighting between previously rendered object and painted triangles, values - // inside the depth buffer are offset by small epsilon for painted triangles inside those gizmos. - gl_FragDepth = gl_FragCoord.z - (offset_depth_buffer ? EPSILON : 0.0); + gl_FragColor = vec4(vec3(intensity.y) + color.rgb * intensity.x, color.a); } diff --git a/resources/shaders/110/gouraud.vs b/resources/shaders/110/gouraud.vs new file mode 100644 index 00000000000..d076ca007f3 --- /dev/null +++ b/resources/shaders/110/gouraud.vs @@ -0,0 +1,81 @@ +#version 110 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SHININESS 5.0 + +#define INTENSITY_AMBIENT 0.3 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); + +struct SlopeDetection +{ + bool actived; + float normal_z; + mat3 volume_world_normal_matrix; +}; + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; +uniform mat4 volume_world_matrix; +uniform SlopeDetection slope; + +// Clipping plane, x = min z, y = max z. Used by the FFF and SLA previews to clip with a top / bottom plane. +uniform vec2 z_range; +// Clipping plane - general orientation. Used by the SLA gizmo. +uniform vec4 clipping_plane; +// Color clip plane - general orientation. Used by the cut gizmo. +uniform vec4 color_clip_plane; + +attribute vec3 v_position; +attribute vec3 v_normal; + +// x = diffuse, y = specular; +varying vec2 intensity; + +varying vec3 clipping_planes_dots; +varying float color_clip_plane_dot; + +varying vec4 world_pos; +varying float world_normal_z; +varying vec3 eye_normal; + +void main() +{ + // First transform the normal into camera space and normalize the result. + eye_normal = normalize(view_normal_matrix * v_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + // Point in homogenous coordinates. + world_pos = volume_world_matrix * vec4(v_position, 1.0); + + // z component of normal vector in world coordinate used for slope shading + world_normal_z = slope.actived ? (normalize(slope.volume_world_normal_matrix * v_normal)).z : 0.0; + + gl_Position = projection_matrix * position; + // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. + clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); + color_clip_plane_dot = dot(world_pos, color_clip_plane); +} diff --git a/resources/shaders/gouraud_light.fs b/resources/shaders/110/gouraud_light.fs similarity index 100% rename from resources/shaders/gouraud_light.fs rename to resources/shaders/110/gouraud_light.fs diff --git a/resources/shaders/110/gouraud_light.vs b/resources/shaders/110/gouraud_light.vs new file mode 100644 index 00000000000..38ebb569280 --- /dev/null +++ b/resources/shaders/110/gouraud_light.vs @@ -0,0 +1,45 @@ +#version 110 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) + +#define INTENSITY_AMBIENT 0.3 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; + +attribute vec3 v_position; +attribute vec3 v_normal; + +// x = tainted, y = specular; +varying vec2 intensity; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 normal = normalize(view_normal_matrix * v_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + gl_Position = projection_matrix * position; +} diff --git a/resources/shaders/110/gouraud_light_clip.fs b/resources/shaders/110/gouraud_light_clip.fs new file mode 100644 index 00000000000..5c706870935 --- /dev/null +++ b/resources/shaders/110/gouraud_light_clip.fs @@ -0,0 +1,17 @@ +#version 110 + +uniform vec4 uniform_color; +uniform float emission_factor; + +// x = tainted, y = specular; +varying vec2 intensity; + +varying float clipping_planes_dot; + +void main() +{ + if (clipping_planes_dot < 0.0) + discard; + + gl_FragColor = vec4(vec3(intensity.y) + uniform_color.rgb * (intensity.x + emission_factor), uniform_color.a); +} diff --git a/resources/shaders/110/gouraud_light_clip.vs b/resources/shaders/110/gouraud_light_clip.vs new file mode 100644 index 00000000000..6d7c32e1b35 --- /dev/null +++ b/resources/shaders/110/gouraud_light_clip.vs @@ -0,0 +1,54 @@ +#version 110 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) + +#define INTENSITY_AMBIENT 0.3 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; +uniform mat4 volume_world_matrix; + +// Clipping plane - general orientation. Used by the SLA gizmo. +uniform vec4 clipping_plane; + +attribute vec3 v_position; +attribute vec3 v_normal; + +// x = tainted, y = specular; +varying vec2 intensity; + +varying float clipping_planes_dot; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 eye_normal = normalize(view_normal_matrix * v_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 eye_position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(eye_position.xyz), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + gl_Position = projection_matrix * eye_position; + + // Fill in the scalar for fragment shader clipping. Fragments with this value lower than zero are discarded. + clipping_planes_dot = dot(volume_world_matrix * vec4(v_position, 1.0), clipping_plane); +} diff --git a/resources/shaders/gouraud_light_instanced.fs b/resources/shaders/110/gouraud_light_instanced.fs similarity index 100% rename from resources/shaders/gouraud_light_instanced.fs rename to resources/shaders/110/gouraud_light_instanced.fs diff --git a/resources/shaders/110/gouraud_light_instanced.vs b/resources/shaders/110/gouraud_light_instanced.vs new file mode 100644 index 00000000000..8148f74cad8 --- /dev/null +++ b/resources/shaders/110/gouraud_light_instanced.vs @@ -0,0 +1,50 @@ +#version 110 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) + +#define INTENSITY_AMBIENT 0.3 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; + +// vertex attributes +attribute vec3 v_position; +attribute vec3 v_normal; +// instance attributes +attribute vec3 i_offset; +attribute vec2 i_scales; + +// x = tainted, y = specular; +varying vec2 intensity; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 eye_normal = normalize(view_normal_matrix * v_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 world_position = vec4(v_position * vec3(vec2(1.5 * i_scales.x), 1.5 * i_scales.y) + i_offset - vec3(0.0, 0.0, 0.5 * i_scales.y), 1.0); + vec4 eye_position = view_model_matrix * world_position; + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(eye_position.xyz), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + gl_Position = projection_matrix * eye_position; +} diff --git a/resources/shaders/110/imgui.fs b/resources/shaders/110/imgui.fs new file mode 100644 index 00000000000..4b0e27ce9da --- /dev/null +++ b/resources/shaders/110/imgui.fs @@ -0,0 +1,11 @@ +#version 110 + +uniform sampler2D Texture; + +varying vec2 Frag_UV; +varying vec4 Frag_Color; + +void main() +{ + gl_FragColor = Frag_Color * texture2D(Texture, Frag_UV.st); +} \ No newline at end of file diff --git a/resources/shaders/110/imgui.vs b/resources/shaders/110/imgui.vs new file mode 100644 index 00000000000..100813e2b5e --- /dev/null +++ b/resources/shaders/110/imgui.vs @@ -0,0 +1,17 @@ +#version 110 + +uniform mat4 ProjMtx; + +attribute vec2 Position; +attribute vec2 UV; +attribute vec4 Color; + +varying vec2 Frag_UV; +varying vec4 Frag_Color; + +void main() +{ + Frag_UV = UV; + Frag_Color = Color; + gl_Position = ProjMtx * vec4(Position.xy, 0.0, 1.0); +} \ No newline at end of file diff --git a/resources/shaders/110/mm_contour.fs b/resources/shaders/110/mm_contour.fs new file mode 100644 index 00000000000..ab656998df7 --- /dev/null +++ b/resources/shaders/110/mm_contour.fs @@ -0,0 +1,8 @@ +#version 110 + +uniform vec4 uniform_color; + +void main() +{ + gl_FragColor = uniform_color; +} diff --git a/resources/shaders/110/mm_contour.vs b/resources/shaders/110/mm_contour.vs new file mode 100644 index 00000000000..b37394b6191 --- /dev/null +++ b/resources/shaders/110/mm_contour.vs @@ -0,0 +1,15 @@ +#version 110 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform float offset; + +attribute vec3 v_position; + +void main() +{ + // Add small epsilon to z to solve z-fighting between painted triangles and contour lines. + vec4 clip_position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); + clip_position.z -= offset * abs(clip_position.w); + gl_Position = clip_position; +} diff --git a/resources/shaders/mm_gouraud.fs b/resources/shaders/110/mm_gouraud.fs similarity index 87% rename from resources/shaders/mm_gouraud.fs rename to resources/shaders/110/mm_gouraud.fs index 5932efe5923..06ca003d73d 100644 --- a/resources/shaders/mm_gouraud.fs +++ b/resources/shaders/110/mm_gouraud.fs @@ -1,60 +1,63 @@ -#version 110 - -#define INTENSITY_CORRECTION 0.6 - -// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) -const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); -#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) -#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) -#define LIGHT_TOP_SHININESS 20.0 - -// normalized values for (1./1.43, 0.2/1.43, 1./1.43) -const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); -#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) - -#define INTENSITY_AMBIENT 0.3 - -const vec3 ZERO = vec3(0.0, 0.0, 0.0); -const float EPSILON = 0.0001; - -uniform vec4 uniform_color; - -varying vec3 clipping_planes_dots; -varying vec4 model_pos; - -uniform bool volume_mirrored; - -void main() -{ - if (any(lessThan(clipping_planes_dots, ZERO))) - discard; - vec3 color = uniform_color.rgb; - float alpha = uniform_color.a; - - vec3 triangle_normal = normalize(cross(dFdx(model_pos.xyz), dFdy(model_pos.xyz))); -#ifdef FLIP_TRIANGLE_NORMALS - triangle_normal = -triangle_normal; -#endif - - if (volume_mirrored) - triangle_normal = -triangle_normal; - - // First transform the normal into camera space and normalize the result. - vec3 eye_normal = normalize(gl_NormalMatrix * triangle_normal); - - // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. - // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. - float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); - - // x = diffuse, y = specular; - vec2 intensity = vec2(0.0, 0.0); - intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; - vec3 position = (gl_ModelViewMatrix * model_pos).xyz; - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); - - // Perform the same lighting calculation for the 2nd light source (no specular applied). - NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); - intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - - gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); -} +#version 110 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) + +#define INTENSITY_AMBIENT 0.3 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); +const float EPSILON = 0.0001; + +uniform vec4 uniform_color; + +uniform bool volume_mirrored; + +uniform mat4 view_model_matrix; +uniform mat3 view_normal_matrix; + +varying vec3 clipping_planes_dots; +varying vec4 model_pos; + +void main() +{ + if (any(lessThan(clipping_planes_dots, ZERO))) + discard; + vec3 color = uniform_color.rgb; + float alpha = uniform_color.a; + + vec3 triangle_normal = normalize(cross(dFdx(model_pos.xyz), dFdy(model_pos.xyz))); +#ifdef FLIP_TRIANGLE_NORMALS + triangle_normal = -triangle_normal; +#endif + + if (volume_mirrored) + triangle_normal = -triangle_normal; + + // First transform the normal into camera space and normalize the result. + vec3 eye_normal = normalize(view_normal_matrix * triangle_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); + + // x = diffuse, y = specular; + vec2 intensity = vec2(0.0); + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec3 position = (view_model_matrix * model_pos).xyz; + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); +} diff --git a/resources/shaders/mm_gouraud.vs b/resources/shaders/110/mm_gouraud.vs similarity index 72% rename from resources/shaders/mm_gouraud.vs rename to resources/shaders/110/mm_gouraud.vs index 2847c3136b1..10c25239f93 100644 --- a/resources/shaders/mm_gouraud.vs +++ b/resources/shaders/110/mm_gouraud.vs @@ -2,22 +2,27 @@ const vec3 ZERO = vec3(0.0, 0.0, 0.0); +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + uniform mat4 volume_world_matrix; // Clipping plane, x = min z, y = max z. Used by the FFF and SLA previews to clip with a top / bottom plane. uniform vec2 z_range; // Clipping plane - general orientation. Used by the SLA gizmo. uniform vec4 clipping_plane; +attribute vec3 v_position; + varying vec3 clipping_planes_dots; varying vec4 model_pos; void main() { - model_pos = gl_Vertex; + model_pos = vec4(v_position, 1.0); // Point in homogenous coordinates. - vec4 world_pos = volume_world_matrix * gl_Vertex; + vec4 world_pos = volume_world_matrix * model_pos; - gl_Position = ftransform(); + gl_Position = projection_matrix * view_model_matrix * model_pos; // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); } diff --git a/resources/shaders/printbed.fs b/resources/shaders/110/printbed.fs similarity index 61% rename from resources/shaders/printbed.fs rename to resources/shaders/110/printbed.fs index d1316ca2fe8..e11b293e980 100644 --- a/resources/shaders/printbed.fs +++ b/resources/shaders/110/printbed.fs @@ -1,21 +1,21 @@ #version 110 -const vec3 back_color_dark = vec3(0.235, 0.235, 0.235); +const vec3 back_color_dark = vec3(0.235, 0.235, 0.235); const vec3 back_color_light = vec3(0.365, 0.365, 0.365); uniform sampler2D texture; uniform bool transparent_background; uniform bool svg_source; -varying vec2 tex_coords; +varying vec2 tex_coord; vec4 svg_color() { // takes foreground from texture - vec4 fore_color = texture2D(texture, tex_coords); + vec4 fore_color = texture2D(texture, tex_coord); // calculates radial gradient - vec3 back_color = vec3(mix(back_color_light, back_color_dark, smoothstep(0.0, 0.5, length(abs(tex_coords.xy) - vec2(0.5))))); + vec3 back_color = vec3(mix(back_color_light, back_color_dark, smoothstep(0.0, 0.5, length(abs(tex_coord.xy) - vec2(0.5))))); // blends foreground with background return vec4(mix(back_color, fore_color.rgb, fore_color.a), transparent_background ? fore_color.a : 1.0); @@ -24,11 +24,13 @@ vec4 svg_color() vec4 non_svg_color() { // takes foreground from texture - vec4 color = texture2D(texture, tex_coords); + vec4 color = texture2D(texture, tex_coord); return vec4(color.rgb, transparent_background ? color.a * 0.25 : color.a); } void main() { - gl_FragColor = svg_source ? svg_color() : non_svg_color(); + vec4 color = svg_source ? svg_color() : non_svg_color(); + color.a = transparent_background ? color.a * 0.5 : color.a; + gl_FragColor = color; } \ No newline at end of file diff --git a/resources/shaders/110/printbed.vs b/resources/shaders/110/printbed.vs new file mode 100644 index 00000000000..dc4868b04df --- /dev/null +++ b/resources/shaders/110/printbed.vs @@ -0,0 +1,15 @@ +#version 110 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +attribute vec3 v_position; +attribute vec2 v_tex_coord; + +varying vec2 tex_coord; + +void main() +{ + tex_coord = v_tex_coord; + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); +} diff --git a/resources/shaders/110/toolpaths_cog.fs b/resources/shaders/110/toolpaths_cog.fs new file mode 100644 index 00000000000..668fe03ecf4 --- /dev/null +++ b/resources/shaders/110/toolpaths_cog.fs @@ -0,0 +1,19 @@ +#version 110 + +const vec4 BLACK = vec4(vec3(0.1), 1.0); +const vec4 WHITE = vec4(vec3(1.0), 1.0); + +const float emission_factor = 0.25; + +uniform vec3 world_center; + +// x = tainted, y = specular; +varying vec2 intensity; +varying vec3 world_position; + +void main() +{ + vec3 delta = world_position - world_center; + vec4 color = delta.x * delta.y * delta.z > 0.0 ? BLACK : WHITE; + gl_FragColor = vec4(vec3(intensity.y) + color.rgb * (intensity.x + emission_factor), 1.0); +} diff --git a/resources/shaders/110/toolpaths_cog.vs b/resources/shaders/110/toolpaths_cog.vs new file mode 100644 index 00000000000..f37e796ab2a --- /dev/null +++ b/resources/shaders/110/toolpaths_cog.vs @@ -0,0 +1,47 @@ +#version 110 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) + +#define INTENSITY_AMBIENT 0.3 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; + +attribute vec3 v_position; +attribute vec3 v_normal; + +// x = tainted, y = specular; +varying vec2 intensity; +varying vec3 world_position; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 normal = normalize(view_normal_matrix * v_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + world_position = v_position; + gl_Position = projection_matrix * position; +} diff --git a/resources/shaders/variable_layer_height.fs b/resources/shaders/110/variable_layer_height.fs similarity index 100% rename from resources/shaders/variable_layer_height.fs rename to resources/shaders/110/variable_layer_height.fs diff --git a/resources/shaders/110/variable_layer_height.vs b/resources/shaders/110/variable_layer_height.vs new file mode 100644 index 00000000000..1a04bbeec40 --- /dev/null +++ b/resources/shaders/110/variable_layer_height.vs @@ -0,0 +1,60 @@ +#version 110 + +#define INTENSITY_CORRECTION 0.6 + +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SHININESS 5.0 + +#define INTENSITY_AMBIENT 0.3 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; +uniform mat4 volume_world_matrix; +uniform float object_max_z; + +attribute vec3 v_position; +attribute vec3 v_normal; +attribute vec2 v_tex_coord; + +// x = tainted, y = specular; +varying vec2 intensity; + +varying float object_z; + +void main() +{ + // ===================================================== + // NOTE: + // when object_max_z > 0.0 we are rendering the overlay + // when object_max_z == 0.0 we are rendering the volumes + // ===================================================== + + // First transform the normal into camera space and normalize the result. + vec3 normal = (object_max_z > 0.0) ? vec3(0.0, 0.0, 1.0) : normalize(view_normal_matrix * v_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular) + NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); + + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + // Scaled to widths of the Z texture. + object_z = (object_max_z > 0.0) ? object_max_z * v_tex_coord.y : (volume_world_matrix * vec4(v_position, 1.0)).z; + + gl_Position = projection_matrix * position; +} diff --git a/resources/shaders/140/background.fs b/resources/shaders/140/background.fs new file mode 100644 index 00000000000..4e595312ee0 --- /dev/null +++ b/resources/shaders/140/background.fs @@ -0,0 +1,13 @@ +#version 140 + +uniform vec4 top_color; +uniform vec4 bottom_color; + +in vec2 tex_coord; + +out vec4 out_color; + +void main() +{ + out_color = mix(bottom_color, top_color, tex_coord.y); +} diff --git a/resources/shaders/140/background.vs b/resources/shaders/140/background.vs new file mode 100644 index 00000000000..13609b3a210 --- /dev/null +++ b/resources/shaders/140/background.vs @@ -0,0 +1,12 @@ +#version 140 + +in vec3 v_position; +in vec2 v_tex_coord; + +out vec2 tex_coord; + +void main() +{ + tex_coord = v_tex_coord; + gl_Position = vec4(v_position, 1.0); +} diff --git a/resources/shaders/140/dashed_thick_lines.fs b/resources/shaders/140/dashed_thick_lines.fs new file mode 100644 index 00000000000..7ea3c6d6101 --- /dev/null +++ b/resources/shaders/140/dashed_thick_lines.fs @@ -0,0 +1,34 @@ +#version 150 + +// see as reference: https://github.com/mhalber/Lines/blob/master/geometry_shader_lines.h +// https://stackoverflow.com/questions/52928678/dashed-line-in-opengl3 + +const float aa_radius = 0.5; + +uniform float dash_size; +uniform float gap_size; +uniform vec4 uniform_color; + +in float line_width; +// x = v tex coord, y = s coord +in vec2 seg_params; + +out vec4 out_color; + +void main() +{ + float inv_stride = 1.0 / (dash_size + gap_size); + if (gap_size > 0.0 && fract(seg_params.y * inv_stride) > dash_size * inv_stride) + discard; + + // We render a quad that is fattened by r, giving total width of the line to be w+r. We want smoothing to happen + // around w, so that the edge is properly smoothed out. As such, in the smoothstep function we have: + // Far edge : 1.0 = (w+r) / (w+r) + // Close edge : 1.0 - (2r / (w+r)) = (w+r)/(w+r) - 2r/(w+r)) = (w-r) / (w+r) + // This way the smoothing is centered around 'w'. + + out_color = uniform_color; + float inv_line_width = 1.0 / line_width; + float aa = 1.0 - smoothstep(1.0 - (2.0 * aa_radius * inv_line_width), 1.0, abs(seg_params.x * inv_line_width)); + out_color.a *= aa; +} diff --git a/resources/shaders/140/dashed_thick_lines.gs b/resources/shaders/140/dashed_thick_lines.gs new file mode 100644 index 00000000000..c4897e94912 --- /dev/null +++ b/resources/shaders/140/dashed_thick_lines.gs @@ -0,0 +1,50 @@ +#version 150 + +// see as reference: https://github.com/mhalber/Lines/blob/master/geometry_shader_lines.h +// https://stackoverflow.com/questions/52928678/dashed-line-in-opengl3 + +layout(lines) in; +layout(triangle_strip, max_vertices = 4) out; + +const float aa_radius = 0.5; + +uniform vec2 viewport_size; +uniform float width; + +in float coord_s[]; + +out float line_width; +// x = v tex coord, y = s coord +out vec2 seg_params; + +void main() +{ + vec2 ndc_0 = gl_in[0].gl_Position.xy / gl_in[0].gl_Position.w; + vec2 ndc_1 = gl_in[1].gl_Position.xy / gl_in[1].gl_Position.w; + + vec2 dir = normalize((ndc_1 - ndc_0) * viewport_size); + vec2 normal_dir = vec2(-dir.y, dir.x); + + line_width = max(1.0, width) + 2.0 * aa_radius; + float half_line_width = 0.5 * line_width; + + vec2 normal = vec2(line_width / viewport_size[0], line_width / viewport_size[1]) * normal_dir; + + seg_params = vec2(-half_line_width, coord_s[0]); + gl_Position = vec4((ndc_0 + normal) * gl_in[0].gl_Position.w, gl_in[0].gl_Position.zw); + EmitVertex(); + + seg_params = vec2(-half_line_width, coord_s[0]); + gl_Position = vec4((ndc_0 - normal) * gl_in[0].gl_Position.w, gl_in[0].gl_Position.zw); + EmitVertex(); + + seg_params = vec2(half_line_width, coord_s[1]); + gl_Position = vec4((ndc_1 + normal) * gl_in[1].gl_Position.w, gl_in[1].gl_Position.zw); + EmitVertex(); + + seg_params = vec2(half_line_width, coord_s[1]); + gl_Position = vec4((ndc_1 - normal) * gl_in[1].gl_Position.w, gl_in[1].gl_Position.zw); + EmitVertex(); + + EndPrimitive(); +} diff --git a/resources/shaders/140/dashed_thick_lines.vs b/resources/shaders/140/dashed_thick_lines.vs new file mode 100644 index 00000000000..79a9fe38cd1 --- /dev/null +++ b/resources/shaders/140/dashed_thick_lines.vs @@ -0,0 +1,18 @@ +#version 150 + +// see as reference: https://github.com/mhalber/Lines/blob/master/geometry_shader_lines.h +// https://stackoverflow.com/questions/52928678/dashed-line-in-opengl3 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +// v_position.w = coordinate along the line +in vec4 v_position; + +out float coord_s; + +void main() +{ + coord_s = v_position.w; + gl_Position = projection_matrix * view_model_matrix * vec4(v_position.xyz, 1.0); +} \ No newline at end of file diff --git a/resources/shaders/140/flat.fs b/resources/shaders/140/flat.fs new file mode 100644 index 00000000000..28642d53fe2 --- /dev/null +++ b/resources/shaders/140/flat.fs @@ -0,0 +1,10 @@ +#version 140 + +uniform vec4 uniform_color; + +out vec4 out_color; + +void main() +{ + out_color = uniform_color; +} diff --git a/resources/shaders/140/flat.vs b/resources/shaders/140/flat.vs new file mode 100644 index 00000000000..7042671de20 --- /dev/null +++ b/resources/shaders/140/flat.vs @@ -0,0 +1,11 @@ +#version 140 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +in vec3 v_position; + +void main() +{ + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); +} diff --git a/resources/shaders/140/flat_clip.fs b/resources/shaders/140/flat_clip.fs new file mode 100644 index 00000000000..b77e0bfaa69 --- /dev/null +++ b/resources/shaders/140/flat_clip.fs @@ -0,0 +1,17 @@ +#version 140 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); + +uniform vec4 uniform_color; + +in vec3 clipping_planes_dots; + +out vec4 out_color; + +void main() +{ + if (any(lessThan(clipping_planes_dots, ZERO))) + discard; + + out_color = uniform_color; +} diff --git a/resources/shaders/140/flat_clip.vs b/resources/shaders/140/flat_clip.vs new file mode 100644 index 00000000000..40cddf1e5a6 --- /dev/null +++ b/resources/shaders/140/flat_clip.vs @@ -0,0 +1,23 @@ +#version 140 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat4 volume_world_matrix; + +// Clipping plane, x = min z, y = max z. Used by the FFF and SLA previews to clip with a top / bottom plane. +uniform vec2 z_range; +// Clipping plane - general orientation. Used by the SLA gizmo. +uniform vec4 clipping_plane; + +in vec3 v_position; + +out vec3 clipping_planes_dots; + +void main() +{ + // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. + vec4 world_pos = volume_world_matrix * vec4(v_position, 1.0); + clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); + + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); +} diff --git a/resources/shaders/140/flat_texture.fs b/resources/shaders/140/flat_texture.fs new file mode 100644 index 00000000000..bb6682367fe --- /dev/null +++ b/resources/shaders/140/flat_texture.fs @@ -0,0 +1,12 @@ +#version 140 + +uniform sampler2D uniform_texture; + +in vec2 tex_coord; + +out vec4 out_color; + +void main() +{ + out_color = texture(uniform_texture, tex_coord); +} diff --git a/resources/shaders/140/flat_texture.vs b/resources/shaders/140/flat_texture.vs new file mode 100644 index 00000000000..57d8ca3b7c6 --- /dev/null +++ b/resources/shaders/140/flat_texture.vs @@ -0,0 +1,15 @@ +#version 140 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +in vec3 v_position; +in vec2 v_tex_coord; + +out vec2 tex_coord; + +void main() +{ + tex_coord = v_tex_coord; + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); +} diff --git a/resources/shaders/140/gouraud.fs b/resources/shaders/140/gouraud.fs new file mode 100644 index 00000000000..44851a4de35 --- /dev/null +++ b/resources/shaders/140/gouraud.fs @@ -0,0 +1,91 @@ +#version 140 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); +const float EPSILON = 0.0001; + +struct PrintVolumeDetection +{ + // 0 = rectangle, 1 = circle, 2 = custom, 3 = invalid + int type; + // type = 0 (rectangle): + // x = min.x, y = min.y, z = max.x, w = max.y + // type = 1 (circle): + // x = center.x, y = center.y, z = radius + vec4 xy_data; + // x = min z, y = max z + vec2 z_data; +}; + +struct SlopeDetection +{ + bool actived; + float normal_z; + mat3 volume_world_normal_matrix; +}; + +uniform vec4 uniform_color; +uniform bool use_color_clip_plane; +uniform vec4 uniform_color_clip_plane_1; +uniform vec4 uniform_color_clip_plane_2; +uniform SlopeDetection slope; + +#ifdef ENABLE_ENVIRONMENT_MAP + uniform sampler2D environment_tex; + uniform bool use_environment_tex; +#endif // ENABLE_ENVIRONMENT_MAP + +uniform PrintVolumeDetection print_volume; + +in vec3 clipping_planes_dots; +in float color_clip_plane_dot; + +// x = diffuse, y = specular; +in vec2 intensity; + +in vec4 world_pos; +in float world_normal_z; +in vec3 eye_normal; + +out vec4 out_color; + +void main() +{ + if (any(lessThan(clipping_planes_dots, ZERO))) + discard; + + vec4 color; + if (use_color_clip_plane) { + color.rgb = (color_clip_plane_dot < 0.0) ? uniform_color_clip_plane_1.rgb : uniform_color_clip_plane_2.rgb; + color.a = uniform_color.a; + } + else + color = uniform_color; + + if (slope.actived && world_normal_z < slope.normal_z - EPSILON) { + color.rgb = vec3(0.7, 0.7, 1.0); + color.a = 1.0; + } + + // if the fragment is outside the print volume -> use darker color + vec3 pv_check_min = ZERO; + vec3 pv_check_max = ZERO; + if (print_volume.type == 0) { + // rectangle + pv_check_min = world_pos.xyz - vec3(print_volume.xy_data.x, print_volume.xy_data.y, print_volume.z_data.x); + pv_check_max = world_pos.xyz - vec3(print_volume.xy_data.z, print_volume.xy_data.w, print_volume.z_data.y); + } + else if (print_volume.type == 1) { + // circle + float delta_radius = print_volume.xy_data.z - distance(world_pos.xy, print_volume.xy_data.xy); + pv_check_min = vec3(delta_radius, 0.0, world_pos.z - print_volume.z_data.x); + pv_check_max = vec3(0.0, 0.0, world_pos.z - print_volume.z_data.y); + } + color.rgb = (any(lessThan(pv_check_min, ZERO)) || any(greaterThan(pv_check_max, ZERO))) ? mix(color.rgb, ZERO, 0.3333) : color.rgb; + +#ifdef ENABLE_ENVIRONMENT_MAP + if (use_environment_tex) + out_color = vec4(0.45 * texture(environment_tex, normalize(eye_normal).xy * 0.5 + 0.5).xyz + 0.8 * color.rgb * intensity.x, color.a); + else +#endif + out_color = vec4(vec3(intensity.y) + color.rgb * intensity.x, color.a); +} diff --git a/resources/shaders/140/gouraud.vs b/resources/shaders/140/gouraud.vs new file mode 100644 index 00000000000..92745243805 --- /dev/null +++ b/resources/shaders/140/gouraud.vs @@ -0,0 +1,81 @@ +#version 140 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SHININESS 5.0 + +#define INTENSITY_AMBIENT 0.3 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); + +struct SlopeDetection +{ + bool actived; + float normal_z; + mat3 volume_world_normal_matrix; +}; + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; +uniform mat4 volume_world_matrix; +uniform SlopeDetection slope; + +// Clipping plane, x = min z, y = max z. Used by the FFF and SLA previews to clip with a top / bottom plane. +uniform vec2 z_range; +// Clipping plane - general orientation. Used by the SLA gizmo. +uniform vec4 clipping_plane; +// Color clip plane - general orientation. Used by the cut gizmo. +uniform vec4 color_clip_plane; + +in vec3 v_position; +in vec3 v_normal; + +// x = diffuse, y = specular; +out vec2 intensity; + +out vec3 clipping_planes_dots; +out float color_clip_plane_dot; + +out vec4 world_pos; +out float world_normal_z; +out vec3 eye_normal; + +void main() +{ + // First transform the normal into camera space and normalize the result. + eye_normal = normalize(view_normal_matrix * v_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + // Point in homogenous coordinates. + world_pos = volume_world_matrix * vec4(v_position, 1.0); + + // z component of normal vector in world coordinate used for slope shading + world_normal_z = slope.actived ? (normalize(slope.volume_world_normal_matrix * v_normal)).z : 0.0; + + gl_Position = projection_matrix * position; + // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. + clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); + color_clip_plane_dot = dot(world_pos, color_clip_plane); +} diff --git a/resources/shaders/140/gouraud_light.fs b/resources/shaders/140/gouraud_light.fs new file mode 100644 index 00000000000..0f918f4f695 --- /dev/null +++ b/resources/shaders/140/gouraud_light.fs @@ -0,0 +1,14 @@ +#version 140 + +uniform vec4 uniform_color; +uniform float emission_factor; + +// x = tainted, y = specular; +in vec2 intensity; + +out vec4 out_color; + +void main() +{ + out_color = vec4(vec3(intensity.y) + uniform_color.rgb * (intensity.x + emission_factor), uniform_color.a); +} diff --git a/resources/shaders/140/gouraud_light.vs b/resources/shaders/140/gouraud_light.vs new file mode 100644 index 00000000000..07ceee350fb --- /dev/null +++ b/resources/shaders/140/gouraud_light.vs @@ -0,0 +1,45 @@ +#version 140 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) + +#define INTENSITY_AMBIENT 0.3 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; + +in vec3 v_position; +in vec3 v_normal; + +// x = tainted, y = specular; +out vec2 intensity; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 normal = normalize(view_normal_matrix * v_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + gl_Position = projection_matrix * position; +} diff --git a/resources/shaders/140/gouraud_light_clip.fs b/resources/shaders/140/gouraud_light_clip.fs new file mode 100644 index 00000000000..714e5bcaaef --- /dev/null +++ b/resources/shaders/140/gouraud_light_clip.fs @@ -0,0 +1,19 @@ +#version 140 + +uniform vec4 uniform_color; +uniform float emission_factor; + +// x = tainted, y = specular; +in vec2 intensity; + +in float clipping_planes_dot; + +out vec4 out_color; + +void main() +{ + if (clipping_planes_dot < 0.0) + discard; + + out_color = vec4(vec3(intensity.y) + uniform_color.rgb * (intensity.x + emission_factor), uniform_color.a); +} diff --git a/resources/shaders/140/gouraud_light_clip.vs b/resources/shaders/140/gouraud_light_clip.vs new file mode 100644 index 00000000000..8fca59380f3 --- /dev/null +++ b/resources/shaders/140/gouraud_light_clip.vs @@ -0,0 +1,54 @@ +#version 140 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) + +#define INTENSITY_AMBIENT 0.3 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; +uniform mat4 volume_world_matrix; + +// Clipping plane - general orientation. Used by the SLA gizmo. +uniform vec4 clipping_plane; + +in vec3 v_position; +in vec3 v_normal; + +// x = tainted, y = specular; +out vec2 intensity; + +out float clipping_planes_dot; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 eye_normal = normalize(view_normal_matrix * v_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 eye_position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(eye_position.xyz), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + gl_Position = projection_matrix * eye_position; + + // Fill in the scalar for fragment shader clipping. Fragments with this value lower than zero are discarded. + clipping_planes_dot = dot(volume_world_matrix * vec4(v_position, 1.0), clipping_plane); +} diff --git a/resources/shaders/140/gouraud_light_instanced.fs b/resources/shaders/140/gouraud_light_instanced.fs new file mode 100644 index 00000000000..0f918f4f695 --- /dev/null +++ b/resources/shaders/140/gouraud_light_instanced.fs @@ -0,0 +1,14 @@ +#version 140 + +uniform vec4 uniform_color; +uniform float emission_factor; + +// x = tainted, y = specular; +in vec2 intensity; + +out vec4 out_color; + +void main() +{ + out_color = vec4(vec3(intensity.y) + uniform_color.rgb * (intensity.x + emission_factor), uniform_color.a); +} diff --git a/resources/shaders/140/gouraud_light_instanced.vs b/resources/shaders/140/gouraud_light_instanced.vs new file mode 100644 index 00000000000..64178fb79b5 --- /dev/null +++ b/resources/shaders/140/gouraud_light_instanced.vs @@ -0,0 +1,50 @@ +#version 140 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) + +#define INTENSITY_AMBIENT 0.3 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; + +// vertex attributes +in vec3 v_position; +in vec3 v_normal; +// instance attributes +in vec3 i_offset; +in vec2 i_scales; + +// x = tainted, y = specular; +out vec2 intensity; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 eye_normal = normalize(view_normal_matrix * v_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 world_position = vec4(v_position * vec3(vec2(1.5 * i_scales.x), 1.5 * i_scales.y) + i_offset - vec3(0.0, 0.0, 0.5 * i_scales.y), 1.0); + vec4 eye_position = view_model_matrix * world_position; + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(eye_position.xyz), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + gl_Position = projection_matrix * eye_position; +} diff --git a/resources/shaders/140/imgui.fs b/resources/shaders/140/imgui.fs new file mode 100644 index 00000000000..1666c814eb7 --- /dev/null +++ b/resources/shaders/140/imgui.fs @@ -0,0 +1,13 @@ +#version 140 + +uniform sampler2D Texture; + +in vec2 Frag_UV; +in vec4 Frag_Color; + +out vec4 out_color; + +void main() +{ + out_color = Frag_Color * texture(Texture, Frag_UV.st); +} \ No newline at end of file diff --git a/resources/shaders/140/imgui.vs b/resources/shaders/140/imgui.vs new file mode 100644 index 00000000000..fd743bdf2d1 --- /dev/null +++ b/resources/shaders/140/imgui.vs @@ -0,0 +1,17 @@ +#version 140 + +uniform mat4 ProjMtx; + +in vec2 Position; +in vec2 UV; +in vec4 Color; + +out vec2 Frag_UV; +out vec4 Frag_Color; + +void main() +{ + Frag_UV = UV; + Frag_Color = Color; + gl_Position = ProjMtx * vec4(Position.xy, 0.0, 1.0); +} \ No newline at end of file diff --git a/resources/shaders/140/mm_contour.fs b/resources/shaders/140/mm_contour.fs new file mode 100644 index 00000000000..28642d53fe2 --- /dev/null +++ b/resources/shaders/140/mm_contour.fs @@ -0,0 +1,10 @@ +#version 140 + +uniform vec4 uniform_color; + +out vec4 out_color; + +void main() +{ + out_color = uniform_color; +} diff --git a/resources/shaders/140/mm_contour.vs b/resources/shaders/140/mm_contour.vs new file mode 100644 index 00000000000..679291ba6d0 --- /dev/null +++ b/resources/shaders/140/mm_contour.vs @@ -0,0 +1,15 @@ +#version 140 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform float offset; + +in vec3 v_position; + +void main() +{ + // Add small epsilon to z to solve z-fighting between painted triangles and contour lines. + vec4 clip_position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); + clip_position.z -= offset * abs(clip_position.w); + gl_Position = clip_position; +} diff --git a/resources/shaders/140/mm_gouraud.fs b/resources/shaders/140/mm_gouraud.fs new file mode 100644 index 00000000000..c810b7b4db0 --- /dev/null +++ b/resources/shaders/140/mm_gouraud.fs @@ -0,0 +1,65 @@ +#version 140 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) + +#define INTENSITY_AMBIENT 0.3 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); +const float EPSILON = 0.0001; + +uniform vec4 uniform_color; + +uniform bool volume_mirrored; + +uniform mat4 view_model_matrix; +uniform mat3 view_normal_matrix; + +in vec3 clipping_planes_dots; +in vec4 model_pos; + +out vec4 out_color; + +void main() +{ + if (any(lessThan(clipping_planes_dots, ZERO))) + discard; + vec3 color = uniform_color.rgb; + float alpha = uniform_color.a; + + vec3 triangle_normal = normalize(cross(dFdx(model_pos.xyz), dFdy(model_pos.xyz))); +#ifdef FLIP_TRIANGLE_NORMALS + triangle_normal = -triangle_normal; +#endif + + if (volume_mirrored) + triangle_normal = -triangle_normal; + + // First transform the normal into camera space and normalize the result. + vec3 eye_normal = normalize(view_normal_matrix * triangle_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); + + // x = diffuse, y = specular; + vec2 intensity = vec2(0.0); + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec3 position = (view_model_matrix * model_pos).xyz; + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + out_color = vec4(vec3(intensity.y) + color * intensity.x, alpha); +} diff --git a/resources/shaders/140/mm_gouraud.vs b/resources/shaders/140/mm_gouraud.vs new file mode 100644 index 00000000000..30223f4eecb --- /dev/null +++ b/resources/shaders/140/mm_gouraud.vs @@ -0,0 +1,28 @@ +#version 140 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +uniform mat4 volume_world_matrix; +// Clipping plane, x = min z, y = max z. Used by the FFF and SLA previews to clip with a top / bottom plane. +uniform vec2 z_range; +// Clipping plane - general orientation. Used by the SLA gizmo. +uniform vec4 clipping_plane; + +in vec3 v_position; + +out vec3 clipping_planes_dots; +out vec4 model_pos; + +void main() +{ + model_pos = vec4(v_position, 1.0); + // Point in homogenous coordinates. + vec4 world_pos = volume_world_matrix * model_pos; + + gl_Position = projection_matrix * view_model_matrix * model_pos; + // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. + clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); +} diff --git a/resources/shaders/140/printbed.fs b/resources/shaders/140/printbed.fs new file mode 100644 index 00000000000..b10aa3f9881 --- /dev/null +++ b/resources/shaders/140/printbed.fs @@ -0,0 +1,38 @@ +#version 140 + +const vec3 back_color_dark = vec3(0.235, 0.235, 0.235); +const vec3 back_color_light = vec3(0.365, 0.365, 0.365); + +uniform sampler2D in_texture; +uniform bool transparent_background; +uniform bool svg_source; + +in vec2 tex_coord; + +out vec4 out_color; + +vec4 svg_color() +{ + // takes foreground from texture + vec4 fore_color = texture(in_texture, tex_coord); + + // calculates radial gradient + vec3 back_color = vec3(mix(back_color_light, back_color_dark, smoothstep(0.0, 0.5, length(abs(tex_coord.xy) - vec2(0.5))))); + + // blends foreground with background + return vec4(mix(back_color, fore_color.rgb, fore_color.a), transparent_background ? fore_color.a : 1.0); +} + +vec4 non_svg_color() +{ + // takes foreground from texture + vec4 color = texture(in_texture, tex_coord); + return vec4(color.rgb, transparent_background ? color.a * 0.25 : color.a); +} + +void main() +{ + vec4 color = svg_source ? svg_color() : non_svg_color(); + color.a = transparent_background ? color.a * 0.5 : color.a; + out_color = color; +} \ No newline at end of file diff --git a/resources/shaders/140/printbed.vs b/resources/shaders/140/printbed.vs new file mode 100644 index 00000000000..57d8ca3b7c6 --- /dev/null +++ b/resources/shaders/140/printbed.vs @@ -0,0 +1,15 @@ +#version 140 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +in vec3 v_position; +in vec2 v_tex_coord; + +out vec2 tex_coord; + +void main() +{ + tex_coord = v_tex_coord; + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); +} diff --git a/resources/shaders/140/toolpaths_cog.fs b/resources/shaders/140/toolpaths_cog.fs new file mode 100644 index 00000000000..010abe9711f --- /dev/null +++ b/resources/shaders/140/toolpaths_cog.fs @@ -0,0 +1,21 @@ +#version 140 + +const vec4 BLACK = vec4(vec3(0.1), 1.0); +const vec4 WHITE = vec4(vec3(1.0), 1.0); + +const float emission_factor = 0.25; + +uniform vec3 world_center; + +// x = tainted, y = specular; +in vec2 intensity; +in vec3 world_position; + +out vec4 out_color; + +void main() +{ + vec3 delta = world_position - world_center; + vec4 color = delta.x * delta.y * delta.z > 0.0 ? BLACK : WHITE; + out_color = vec4(vec3(intensity.y) + color.rgb * (intensity.x + emission_factor), 1.0); +} diff --git a/resources/shaders/140/toolpaths_cog.vs b/resources/shaders/140/toolpaths_cog.vs new file mode 100644 index 00000000000..a39595ebf5b --- /dev/null +++ b/resources/shaders/140/toolpaths_cog.vs @@ -0,0 +1,47 @@ +#version 140 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) + +#define INTENSITY_AMBIENT 0.3 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; + +in vec3 v_position; +in vec3 v_normal; + +// x = tainted, y = specular; +out vec2 intensity; +out vec3 world_position; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 normal = normalize(view_normal_matrix * v_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + world_position = v_position; + gl_Position = projection_matrix * position; +} diff --git a/resources/shaders/140/variable_layer_height.fs b/resources/shaders/140/variable_layer_height.fs new file mode 100644 index 00000000000..658f8122860 --- /dev/null +++ b/resources/shaders/140/variable_layer_height.fs @@ -0,0 +1,43 @@ +#version 140 + +#define M_PI 3.1415926535897932384626433832795 + +// 2D texture (1D texture split by the rows) of color along the object Z axis. +uniform sampler2D z_texture; +// Scaling from the Z texture rows coordinate to the normalized texture row coordinate. +uniform float z_to_texture_row; +uniform float z_texture_row_to_normalized; +uniform float z_cursor; +uniform float z_cursor_band_width; + +// x = tainted, y = specular; +in vec2 intensity; + +in float object_z; + +out vec4 out_color; + +void main() +{ + float object_z_row = z_to_texture_row * object_z; + // Index of the row in the texture. + float z_texture_row = floor(object_z_row); + // Normalized coordinate from 0. to 1. + float z_texture_col = object_z_row - z_texture_row; + float z_blend = 0.25 * cos(min(M_PI, abs(M_PI * (object_z - z_cursor) * 1.8 / z_cursor_band_width))) + 0.25; + // Calculate level of detail from the object Z coordinate. + // This makes the slowly sloping surfaces to be shown with high detail (with stripes), + // and the vertical surfaces to be shown with low detail (no stripes) + float z_in_cells = object_z_row * 190.; + // Gradient of Z projected on the screen. + float dx_vtc = dFdx(z_in_cells); + float dy_vtc = dFdy(z_in_cells); + float lod = clamp(0.5 * log2(max(dx_vtc * dx_vtc, dy_vtc * dy_vtc)), 0., 1.); + // Sample the Z texture. Texture coordinates are normalized to <0, 1>. + vec4 color = vec4(0.25, 0.25, 0.25, 1.0); + if (z_texture_row >= 0.0) + color = mix(texture(z_texture, vec2(z_texture_col, z_texture_row_to_normalized * (z_texture_row + 0.5 )), -10000.), + texture(z_texture, vec2(z_texture_col, z_texture_row_to_normalized * (z_texture_row * 2. + 1.)), 10000.), lod); + // Mix the final color. + out_color = vec4(vec3(intensity.y), 1.0) + intensity.x * mix(color, vec4(1.0, 1.0, 0.0, 1.0), z_blend); +} diff --git a/resources/shaders/140/variable_layer_height.vs b/resources/shaders/140/variable_layer_height.vs new file mode 100644 index 00000000000..2b656d3ca35 --- /dev/null +++ b/resources/shaders/140/variable_layer_height.vs @@ -0,0 +1,60 @@ +#version 140 + +#define INTENSITY_CORRECTION 0.6 + +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SHININESS 5.0 + +#define INTENSITY_AMBIENT 0.3 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; +uniform mat4 volume_world_matrix; +uniform float object_max_z; + +in vec3 v_position; +in vec3 v_normal; +in vec2 v_tex_coord; + +// x = tainted, y = specular; +out vec2 intensity; + +out float object_z; + +void main() +{ + // ===================================================== + // NOTE: + // when object_max_z > 0.0 we are rendering the overlay + // when object_max_z == 0.0 we are rendering the volumes + // ===================================================== + + // First transform the normal into camera space and normalize the result. + vec3 normal = (object_max_z > 0.0) ? vec3(0.0, 0.0, 1.0) : normalize(view_normal_matrix * v_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular) + NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); + + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + // Scaled to widths of the Z texture. + object_z = (object_max_z > 0.0) ? object_max_z * v_tex_coord.y : (volume_world_matrix * vec4(v_position, 1.0)).z; + + gl_Position = projection_matrix * position; +} diff --git a/resources/shaders/ES/background.fs b/resources/shaders/ES/background.fs new file mode 100644 index 00000000000..5f46e658ff0 --- /dev/null +++ b/resources/shaders/ES/background.fs @@ -0,0 +1,13 @@ +#version 100 + +precision highp float; + +uniform vec4 top_color; +uniform vec4 bottom_color; + +varying vec2 tex_coord; + +void main() +{ + gl_FragColor = mix(bottom_color, top_color, tex_coord.y); +} diff --git a/resources/shaders/ES/background.vs b/resources/shaders/ES/background.vs new file mode 100644 index 00000000000..6334c83b140 --- /dev/null +++ b/resources/shaders/ES/background.vs @@ -0,0 +1,12 @@ +#version 100 + +attribute vec3 v_position; +attribute vec2 v_tex_coord; + +varying vec2 tex_coord; + +void main() +{ + tex_coord = v_tex_coord; + gl_Position = vec4(v_position, 1.0); +} diff --git a/resources/shaders/ES/dashed_lines.fs b/resources/shaders/ES/dashed_lines.fs new file mode 100644 index 00000000000..9aecd0240db --- /dev/null +++ b/resources/shaders/ES/dashed_lines.fs @@ -0,0 +1,20 @@ +#version 100 + +precision highp float; + +// see as reference: https://stackoverflow.com/questions/52928678/dashed-line-in-opengl3 + +uniform float dash_size; +uniform float gap_size; +uniform vec4 uniform_color; + +varying float coord_s; + +void main() +{ + float inv_stride = 1.0 / (dash_size + gap_size); + if (gap_size > 0.0 && fract(coord_s * inv_stride) > dash_size * inv_stride) + discard; + + gl_FragColor = uniform_color; +} diff --git a/resources/shaders/ES/dashed_lines.vs b/resources/shaders/ES/dashed_lines.vs new file mode 100644 index 00000000000..540715a11b6 --- /dev/null +++ b/resources/shaders/ES/dashed_lines.vs @@ -0,0 +1,17 @@ +#version 100 + +// see as reference: https://stackoverflow.com/questions/52928678/dashed-line-in-opengl3 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +// v_position.w = coordinate along the line +attribute vec4 v_position; + +varying float coord_s; + +void main() +{ + coord_s = v_position.w; + gl_Position = projection_matrix * view_model_matrix * vec4(v_position.xyz, 1.0); +} \ No newline at end of file diff --git a/resources/shaders/ES/flat.fs b/resources/shaders/ES/flat.fs new file mode 100644 index 00000000000..f27e5d38cd7 --- /dev/null +++ b/resources/shaders/ES/flat.fs @@ -0,0 +1,10 @@ +#version 100 + +precision highp float; + +uniform vec4 uniform_color; + +void main() +{ + gl_FragColor = uniform_color; +} diff --git a/resources/shaders/ES/flat.vs b/resources/shaders/ES/flat.vs new file mode 100644 index 00000000000..a8358723925 --- /dev/null +++ b/resources/shaders/ES/flat.vs @@ -0,0 +1,11 @@ +#version 100 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +attribute vec3 v_position; + +void main() +{ + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); +} diff --git a/resources/shaders/ES/flat_clip.fs b/resources/shaders/ES/flat_clip.fs new file mode 100644 index 00000000000..8de7d1921e3 --- /dev/null +++ b/resources/shaders/ES/flat_clip.fs @@ -0,0 +1,17 @@ +#version 100 + +precision highp float; + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); + +uniform vec4 uniform_color; + +varying vec3 clipping_planes_dots; + +void main() +{ + if (any(lessThan(clipping_planes_dots, ZERO))) + discard; + + gl_FragColor = uniform_color; +} diff --git a/resources/shaders/ES/flat_clip.vs b/resources/shaders/ES/flat_clip.vs new file mode 100644 index 00000000000..baf5a3385e6 --- /dev/null +++ b/resources/shaders/ES/flat_clip.vs @@ -0,0 +1,23 @@ +#version 100 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat4 volume_world_matrix; + +// Clipping plane, x = min z, y = max z. Used by the FFF and SLA previews to clip with a top / bottom plane. +uniform vec2 z_range; +// Clipping plane - general orientation. Used by the SLA gizmo. +uniform vec4 clipping_plane; + +attribute vec3 v_position; + +varying vec3 clipping_planes_dots; + +void main() +{ + // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. + vec4 world_pos = volume_world_matrix * vec4(v_position, 1.0); + clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); + + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); +} diff --git a/resources/shaders/ES/flat_texture.fs b/resources/shaders/ES/flat_texture.fs new file mode 100644 index 00000000000..ec41960f73f --- /dev/null +++ b/resources/shaders/ES/flat_texture.fs @@ -0,0 +1,12 @@ +#version 100 + +precision highp float; + +uniform sampler2D uniform_texture; + +varying vec2 tex_coord; + +void main() +{ + gl_FragColor = texture2D(uniform_texture, tex_coord); +} diff --git a/resources/shaders/ES/flat_texture.vs b/resources/shaders/ES/flat_texture.vs new file mode 100644 index 00000000000..e83cacd59cb --- /dev/null +++ b/resources/shaders/ES/flat_texture.vs @@ -0,0 +1,15 @@ +#version 100 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +attribute vec3 v_position; +attribute vec2 v_tex_coord; + +varying vec2 tex_coord; + +void main() +{ + tex_coord = v_tex_coord; + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); +} diff --git a/resources/shaders/ES/gouraud.fs b/resources/shaders/ES/gouraud.fs new file mode 100644 index 00000000000..ddc2e0718cd --- /dev/null +++ b/resources/shaders/ES/gouraud.fs @@ -0,0 +1,91 @@ +#version 100 + +precision highp float; + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); +const float EPSILON = 0.0001; + +struct PrintVolumeDetection +{ + // 0 = rectangle, 1 = circle, 2 = custom, 3 = invalid + int type; + // type = 0 (rectangle): + // x = min.x, y = min.y, z = max.x, w = max.y + // type = 1 (circle): + // x = center.x, y = center.y, z = radius + vec4 xy_data; + // x = min z, y = max z + vec2 z_data; +}; + +struct SlopeDetection +{ + bool actived; + float normal_z; + mat3 volume_world_normal_matrix; +}; + +uniform vec4 uniform_color; +uniform bool use_color_clip_plane; +uniform vec4 uniform_color_clip_plane_1; +uniform vec4 uniform_color_clip_plane_2; +uniform SlopeDetection slope; + +#ifdef ENABLE_ENVIRONMENT_MAP + uniform sampler2D environment_tex; + uniform bool use_environment_tex; +#endif // ENABLE_ENVIRONMENT_MAP + +uniform PrintVolumeDetection print_volume; + +varying vec3 clipping_planes_dots; +varying float color_clip_plane_dot; + +// x = diffuse, y = specular; +varying vec2 intensity; + +varying vec4 world_pos; +varying float world_normal_z; +varying vec3 eye_normal; + +void main() +{ + if (any(lessThan(clipping_planes_dots, ZERO))) + discard; + + vec4 color; + if (use_color_clip_plane) { + color.rgb = (color_clip_plane_dot < 0.0) ? uniform_color_clip_plane_1.rgb : uniform_color_clip_plane_2.rgb; + color.a = uniform_color.a; + } + else + color = uniform_color; + + if (slope.actived && world_normal_z < slope.normal_z - EPSILON) { + color.rgb = vec3(0.7, 0.7, 1.0); + color.a = 1.0; + } + + // if the fragment is outside the print volume -> use darker color + vec3 pv_check_min = ZERO; + vec3 pv_check_max = ZERO; + if (print_volume.type == 0) { + // rectangle + pv_check_min = world_pos.xyz - vec3(print_volume.xy_data.x, print_volume.xy_data.y, print_volume.z_data.x); + pv_check_max = world_pos.xyz - vec3(print_volume.xy_data.z, print_volume.xy_data.w, print_volume.z_data.y); + } + else if (print_volume.type == 1) { + // circle + float delta_radius = print_volume.xy_data.z - distance(world_pos.xy, print_volume.xy_data.xy); + pv_check_min = vec3(delta_radius, 0.0, world_pos.z - print_volume.z_data.x); + pv_check_max = vec3(0.0, 0.0, world_pos.z - print_volume.z_data.y); + } + color.rgb = (any(lessThan(pv_check_min, ZERO)) || any(greaterThan(pv_check_max, ZERO))) ? mix(color.rgb, ZERO, 0.3333) : color.rgb; + +#ifdef ENABLE_ENVIRONMENT_MAP + if (use_environment_tex) + gl_FragColor = vec4(0.45 * texture(environment_tex, normalize(eye_normal).xy * 0.5 + 0.5).xyz + 0.8 * color.rgb * intensity.x, color.a); + else +#endif + gl_FragColor = vec4(vec3(intensity.y) + color.rgb * intensity.x, color.a); +} diff --git a/resources/shaders/gouraud.vs b/resources/shaders/ES/gouraud.vs similarity index 75% rename from resources/shaders/gouraud.vs rename to resources/shaders/ES/gouraud.vs index 79d7a63c072..f5fa01e7535 100644 --- a/resources/shaders/gouraud.vs +++ b/resources/shaders/ES/gouraud.vs @@ -1,4 +1,4 @@ -#version 110 +#version 100 #define INTENSITY_CORRECTION 0.6 @@ -25,6 +25,9 @@ struct SlopeDetection mat3 volume_world_normal_matrix; }; +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; uniform mat4 volume_world_matrix; uniform SlopeDetection slope; @@ -32,13 +35,18 @@ uniform SlopeDetection slope; uniform vec2 z_range; // Clipping plane - general orientation. Used by the SLA gizmo. uniform vec4 clipping_plane; +// Color clip plane - general orientation. Used by the cut gizmo. +uniform vec4 color_clip_plane; + +attribute vec3 v_position; +attribute vec3 v_normal; // x = diffuse, y = specular; varying vec2 intensity; varying vec3 clipping_planes_dots; +varying float color_clip_plane_dot; -varying vec4 model_pos; varying vec4 world_pos; varying float world_normal_z; varying vec3 eye_normal; @@ -46,28 +54,28 @@ varying vec3 eye_normal; void main() { // First transform the normal into camera space and normalize the result. - eye_normal = normalize(gl_NormalMatrix * gl_Normal); + eye_normal = normalize(view_normal_matrix * v_normal); // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; - vec3 position = (gl_ModelViewMatrix * gl_Vertex).xyz; - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); // Perform the same lighting calculation for the 2nd light source (no specular applied). NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - model_pos = gl_Vertex; // Point in homogenous coordinates. - world_pos = volume_world_matrix * gl_Vertex; + world_pos = volume_world_matrix * vec4(v_position, 1.0); // z component of normal vector in world coordinate used for slope shading - world_normal_z = slope.actived ? (normalize(slope.volume_world_normal_matrix * gl_Normal)).z : 0.0; + world_normal_z = slope.actived ? (normalize(slope.volume_world_normal_matrix * v_normal)).z : 0.0; - gl_Position = ftransform(); + gl_Position = projection_matrix * position; // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); + color_clip_plane_dot = dot(world_pos, color_clip_plane); } diff --git a/resources/shaders/ES/gouraud_light.fs b/resources/shaders/ES/gouraud_light.fs new file mode 100644 index 00000000000..a8de5879caf --- /dev/null +++ b/resources/shaders/ES/gouraud_light.fs @@ -0,0 +1,14 @@ +#version 100 + +precision highp float; + +uniform vec4 uniform_color; +uniform float emission_factor; + +// x = tainted, y = specular; +varying vec2 intensity; + +void main() +{ + gl_FragColor = vec4(vec3(intensity.y) + uniform_color.rgb * (intensity.x + emission_factor), uniform_color.a); +} diff --git a/resources/shaders/gouraud_light.vs b/resources/shaders/ES/gouraud_light.vs similarity index 76% rename from resources/shaders/gouraud_light.vs rename to resources/shaders/ES/gouraud_light.vs index d4f71938a99..98bde435ddc 100644 --- a/resources/shaders/gouraud_light.vs +++ b/resources/shaders/ES/gouraud_light.vs @@ -1,4 +1,4 @@ -#version 110 +#version 100 #define INTENSITY_CORRECTION 0.6 @@ -14,25 +14,32 @@ const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); #define INTENSITY_AMBIENT 0.3 +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; + +attribute vec3 v_position; +attribute vec3 v_normal; + // x = tainted, y = specular; varying vec2 intensity; void main() { // First transform the normal into camera space and normalize the result. - vec3 normal = normalize(gl_NormalMatrix * gl_Normal); + vec3 normal = normalize(view_normal_matrix * v_normal); // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; - vec3 position = (gl_ModelViewMatrix * gl_Vertex).xyz; - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); // Perform the same lighting calculation for the 2nd light source (no specular applied). NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - gl_Position = ftransform(); + gl_Position = projection_matrix * position; } diff --git a/resources/shaders/ES/gouraud_light_clip.fs b/resources/shaders/ES/gouraud_light_clip.fs new file mode 100644 index 00000000000..45cae0ddb06 --- /dev/null +++ b/resources/shaders/ES/gouraud_light_clip.fs @@ -0,0 +1,19 @@ +#version 100 + +precision highp float; + +uniform vec4 uniform_color; +uniform float emission_factor; + +// x = tainted, y = specular; +varying vec2 intensity; + +varying float clipping_planes_dot; + +void main() +{ + if (clipping_planes_dot < 0.0) + discard; + + gl_FragColor = vec4(vec3(intensity.y) + uniform_color.rgb * (intensity.x + emission_factor), uniform_color.a); +} diff --git a/resources/shaders/ES/gouraud_light_clip.vs b/resources/shaders/ES/gouraud_light_clip.vs new file mode 100644 index 00000000000..f3ab8c3dc07 --- /dev/null +++ b/resources/shaders/ES/gouraud_light_clip.vs @@ -0,0 +1,54 @@ +#version 100 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) + +#define INTENSITY_AMBIENT 0.3 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; +uniform mat4 volume_world_matrix; + +// Clipping plane - general orientation. Used by the SLA gizmo. +uniform vec4 clipping_plane; + +attribute vec3 v_position; +attribute vec3 v_normal; + +// x = tainted, y = specular; +varying vec2 intensity; + +varying float clipping_planes_dot; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 eye_normal = normalize(view_normal_matrix * v_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 eye_position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(eye_position.xyz), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + gl_Position = projection_matrix * eye_position; + + // Fill in the scalar for fragment shader clipping. Fragments with this value lower than zero are discarded. + clipping_planes_dot = dot(volume_world_matrix * vec4(v_position, 1.0), clipping_plane); +} diff --git a/resources/shaders/ES/gouraud_light_instanced.fs b/resources/shaders/ES/gouraud_light_instanced.fs new file mode 100644 index 00000000000..d737137ee2c --- /dev/null +++ b/resources/shaders/ES/gouraud_light_instanced.fs @@ -0,0 +1,12 @@ +#version 100 + +uniform vec4 uniform_color; +uniform float emission_factor; + +// x = tainted, y = specular; +varying vec2 intensity; + +void main() +{ + gl_FragColor = vec4(vec3(intensity.y) + uniform_color.rgb * (intensity.x + emission_factor), uniform_color.a); +} diff --git a/resources/shaders/gouraud_light_instanced.vs b/resources/shaders/ES/gouraud_light_instanced.vs similarity index 81% rename from resources/shaders/gouraud_light_instanced.vs rename to resources/shaders/ES/gouraud_light_instanced.vs index a42f8e9a4e2..0aebd7a0b4c 100644 --- a/resources/shaders/gouraud_light_instanced.vs +++ b/resources/shaders/ES/gouraud_light_instanced.vs @@ -1,4 +1,4 @@ -#version 110 +#version 100 #define INTENSITY_CORRECTION 0.6 @@ -14,6 +14,10 @@ const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); #define INTENSITY_AMBIENT 0.3 +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; + // vertex attributes attribute vec3 v_position; attribute vec3 v_normal; @@ -27,7 +31,7 @@ varying vec2 intensity; void main() { // First transform the normal into camera space and normalize the result. - vec3 eye_normal = normalize(gl_NormalMatrix * v_normal); + vec3 eye_normal = normalize(view_normal_matrix * v_normal); // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. @@ -35,12 +39,12 @@ void main() intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; vec4 world_position = vec4(v_position * vec3(vec2(1.5 * i_scales.x), 1.5 * i_scales.y) + i_offset - vec3(0.0, 0.0, 0.5 * i_scales.y), 1.0); - vec3 eye_position = (gl_ModelViewMatrix * world_position).xyz; - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(eye_position), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); + vec4 eye_position = view_model_matrix * world_position; + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(eye_position.xyz), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); // Perform the same lighting calculation for the 2nd light source (no specular applied). NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - gl_Position = gl_ProjectionMatrix * vec4(eye_position, 1.0); + gl_Position = projection_matrix * eye_position; } diff --git a/resources/shaders/ES/imgui.fs b/resources/shaders/ES/imgui.fs new file mode 100644 index 00000000000..2174f955d0f --- /dev/null +++ b/resources/shaders/ES/imgui.fs @@ -0,0 +1,13 @@ +#version 100 + +precision highp float; + +uniform sampler2D Texture; + +varying vec2 Frag_UV; +varying vec4 Frag_Color; + +void main() +{ + gl_FragColor = Frag_Color * texture2D(Texture, Frag_UV.st); +} \ No newline at end of file diff --git a/resources/shaders/ES/imgui.vs b/resources/shaders/ES/imgui.vs new file mode 100644 index 00000000000..7abb3f40525 --- /dev/null +++ b/resources/shaders/ES/imgui.vs @@ -0,0 +1,17 @@ +#version 100 + +uniform mat4 ProjMtx; + +attribute vec2 Position; +attribute vec2 UV; +attribute vec4 Color; + +varying vec2 Frag_UV; +varying vec4 Frag_Color; + +void main() +{ + Frag_UV = UV; + Frag_Color = Color; + gl_Position = ProjMtx * vec4(Position.xy, 0.0, 1.0); +} \ No newline at end of file diff --git a/resources/shaders/ES/mm_contour.fs b/resources/shaders/ES/mm_contour.fs new file mode 100644 index 00000000000..f27e5d38cd7 --- /dev/null +++ b/resources/shaders/ES/mm_contour.fs @@ -0,0 +1,10 @@ +#version 100 + +precision highp float; + +uniform vec4 uniform_color; + +void main() +{ + gl_FragColor = uniform_color; +} diff --git a/resources/shaders/ES/mm_contour.vs b/resources/shaders/ES/mm_contour.vs new file mode 100644 index 00000000000..7142a5de699 --- /dev/null +++ b/resources/shaders/ES/mm_contour.vs @@ -0,0 +1,15 @@ +#version 100 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform float offset; + +attribute vec3 v_position; + +void main() +{ + // Add small epsilon to z to solve z-fighting + vec4 clip_position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); + clip_position.z -= offset * abs(clip_position.w); + gl_Position = clip_position; +} diff --git a/resources/shaders/ES/mm_gouraud.fs b/resources/shaders/ES/mm_gouraud.fs new file mode 100644 index 00000000000..4824753f1fe --- /dev/null +++ b/resources/shaders/ES/mm_gouraud.fs @@ -0,0 +1,66 @@ +#version 100 +#extension GL_OES_standard_derivatives : enable + +precision highp float; + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) + +#define INTENSITY_AMBIENT 0.3 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); +const float EPSILON = 0.0001; + +uniform vec4 uniform_color; + +uniform bool volume_mirrored; + +uniform mat4 view_model_matrix; +uniform mat3 view_normal_matrix; + +varying vec3 clipping_planes_dots; +varying vec4 model_pos; + +void main() +{ + if (any(lessThan(clipping_planes_dots, ZERO))) + discard; + vec3 color = uniform_color.rgb; + float alpha = uniform_color.a; + + vec3 triangle_normal = normalize(cross(dFdx(model_pos.xyz), dFdy(model_pos.xyz))); +#ifdef FLIP_TRIANGLE_NORMALS + triangle_normal = -triangle_normal; +#endif + + if (volume_mirrored) + triangle_normal = -triangle_normal; + + // First transform the normal into camera space and normalize the result. + vec3 eye_normal = normalize(view_normal_matrix * triangle_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); + + // x = diffuse, y = specular; + vec2 intensity = vec2(0.0); + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec3 position = (view_model_matrix * model_pos).xyz; + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); +} diff --git a/resources/shaders/ES/mm_gouraud.vs b/resources/shaders/ES/mm_gouraud.vs new file mode 100644 index 00000000000..8ad5fca68ed --- /dev/null +++ b/resources/shaders/ES/mm_gouraud.vs @@ -0,0 +1,28 @@ +#version 100 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +uniform mat4 volume_world_matrix; +// Clipping plane, x = min z, y = max z. Used by the FFF and SLA previews to clip with a top / bottom plane. +uniform vec2 z_range; +// Clipping plane - general orientation. Used by the SLA gizmo. +uniform vec4 clipping_plane; + +attribute vec3 v_position; + +varying vec3 clipping_planes_dots; +varying vec4 model_pos; + +void main() +{ + model_pos = vec4(v_position, 1.0); + // Point in homogenous coordinates. + vec4 world_pos = volume_world_matrix * model_pos; + + gl_Position = projection_matrix * view_model_matrix * model_pos; + // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. + clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); +} diff --git a/resources/shaders/ES/printbed.fs b/resources/shaders/ES/printbed.fs new file mode 100644 index 00000000000..517536467fc --- /dev/null +++ b/resources/shaders/ES/printbed.fs @@ -0,0 +1,38 @@ +#version 100 + +precision highp float; + +const vec3 back_color_dark = vec3(0.235, 0.235, 0.235); +const vec3 back_color_light = vec3(0.365, 0.365, 0.365); + +uniform sampler2D texture; +uniform bool transparent_background; +uniform bool svg_source; + +varying vec2 tex_coord; + +vec4 svg_color() +{ + // takes foreground from texture + vec4 fore_color = texture2D(texture, tex_coord); + + // calculates radial gradient + vec3 back_color = vec3(mix(back_color_light, back_color_dark, smoothstep(0.0, 0.5, length(abs(tex_coord.xy) - vec2(0.5))))); + + // blends foreground with background + return vec4(mix(back_color, fore_color.rgb, fore_color.a), transparent_background ? fore_color.a : 1.0); +} + +vec4 non_svg_color() +{ + // takes foreground from texture + vec4 color = texture2D(texture, tex_coord); + return vec4(color.rgb, transparent_background ? color.a * 0.25 : color.a); +} + +void main() +{ + vec4 color = svg_source ? svg_color() : non_svg_color(); + color.a = transparent_background ? color.a * 0.5 : color.a; + gl_FragColor = color; +} \ No newline at end of file diff --git a/resources/shaders/ES/printbed.vs b/resources/shaders/ES/printbed.vs new file mode 100644 index 00000000000..e83cacd59cb --- /dev/null +++ b/resources/shaders/ES/printbed.vs @@ -0,0 +1,15 @@ +#version 100 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +attribute vec3 v_position; +attribute vec2 v_tex_coord; + +varying vec2 tex_coord; + +void main() +{ + tex_coord = v_tex_coord; + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); +} diff --git a/resources/shaders/ES/toolpaths_cog.fs b/resources/shaders/ES/toolpaths_cog.fs new file mode 100644 index 00000000000..f5e4404be9c --- /dev/null +++ b/resources/shaders/ES/toolpaths_cog.fs @@ -0,0 +1,21 @@ +#version 100 + +precision highp float; + +const vec4 BLACK = vec4(vec3(0.1), 1.0); +const vec4 WHITE = vec4(vec3(1.0), 1.0); + +const float emission_factor = 0.25; + +uniform vec3 world_center; + +// x = tainted, y = specular; +varying vec2 intensity; +varying vec3 world_position; + +void main() +{ + vec3 delta = world_position - world_center; + vec4 color = delta.x * delta.y * delta.z > 0.0 ? BLACK : WHITE; + gl_FragColor = vec4(vec3(intensity.y) + color.rgb * (intensity.x + emission_factor), 1.0); +} diff --git a/resources/shaders/ES/toolpaths_cog.vs b/resources/shaders/ES/toolpaths_cog.vs new file mode 100644 index 00000000000..72b5835bdd5 --- /dev/null +++ b/resources/shaders/ES/toolpaths_cog.vs @@ -0,0 +1,47 @@ +#version 100 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) + +#define INTENSITY_AMBIENT 0.3 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; + +attribute vec3 v_position; +attribute vec3 v_normal; + +// x = tainted, y = specular; +varying vec2 intensity; +varying vec3 world_position; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 normal = normalize(view_normal_matrix * v_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + world_position = v_position; + gl_Position = projection_matrix * position; +} diff --git a/resources/shaders/ES/variable_layer_height.fs b/resources/shaders/ES/variable_layer_height.fs new file mode 100644 index 00000000000..ac96f31b7db --- /dev/null +++ b/resources/shaders/ES/variable_layer_height.fs @@ -0,0 +1,44 @@ +#version 100 +#extension GL_OES_standard_derivatives : enable + +precision highp float; + +#define M_PI 3.1415926535897932384626433832795 + +// 2D texture (1D texture split by the rows) of color along the object Z axis. +uniform sampler2D z_texture; +// Scaling from the Z texture rows coordinate to the normalized texture row coordinate. +uniform float z_to_texture_row; +uniform float z_texture_row_to_normalized; +uniform float z_cursor; +uniform float z_cursor_band_width; + +// x = tainted, y = specular; +varying vec2 intensity; + +varying float object_z; + +void main() +{ + float object_z_row = z_to_texture_row * object_z; + // Index of the row in the texture. + float z_texture_row = floor(object_z_row); + // Normalized coordinate from 0. to 1. + float z_texture_col = object_z_row - z_texture_row; + float z_blend = 0.25 * cos(min(M_PI, abs(M_PI * (object_z - z_cursor) * 1.8 / z_cursor_band_width))) + 0.25; + // Calculate level of detail from the object Z coordinate. + // This makes the slowly sloping surfaces to be shown with high detail (with stripes), + // and the vertical surfaces to be shown with low detail (no stripes) + float z_in_cells = object_z_row * 190.; + // Gradient of Z projected on the screen. + float dx_vtc = dFdx(z_in_cells); + float dy_vtc = dFdy(z_in_cells); + float lod = clamp(0.5 * log2(max(dx_vtc * dx_vtc, dy_vtc * dy_vtc)), 0., 1.); + // Sample the Z texture. Texture coordinates are normalized to <0, 1>. + vec4 color = vec4(0.25, 0.25, 0.25, 1.0); + if (z_texture_row >= 0.0) + color = mix(texture2D(z_texture, vec2(z_texture_col, z_texture_row_to_normalized * (z_texture_row + 0.5 )), -10000.), + texture2D(z_texture, vec2(z_texture_col, z_texture_row_to_normalized * (z_texture_row * 2. + 1.)), 10000.), lod); + // Mix the final color. + gl_FragColor = vec4(vec3(intensity.y), 1.0) + intensity.x * mix(color, vec4(1.0, 1.0, 0.0, 1.0), z_blend); +} diff --git a/resources/shaders/variable_layer_height.vs b/resources/shaders/ES/variable_layer_height.vs similarity index 63% rename from resources/shaders/variable_layer_height.vs rename to resources/shaders/ES/variable_layer_height.vs index 0e966b0814a..8deaf8368c8 100644 --- a/resources/shaders/variable_layer_height.vs +++ b/resources/shaders/ES/variable_layer_height.vs @@ -1,4 +1,4 @@ -#version 110 +#version 100 #define INTENSITY_CORRECTION 0.6 @@ -14,9 +14,16 @@ const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); #define INTENSITY_AMBIENT 0.3 +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; uniform mat4 volume_world_matrix; uniform float object_max_z; +attribute vec3 v_position; +attribute vec3 v_normal; +attribute vec2 v_tex_coord; + // x = tainted, y = specular; varying vec2 intensity; @@ -24,16 +31,22 @@ varying float object_z; void main() { + // ===================================================== + // NOTE: + // when object_max_z > 0.0 we are rendering the overlay + // when object_max_z == 0.0 we are rendering the volumes + // ===================================================== + // First transform the normal into camera space and normalize the result. - vec3 normal = normalize(gl_NormalMatrix * gl_Normal); + vec3 normal = (object_max_z > 0.0) ? vec3(0.0, 0.0, 1.0) : normalize(view_normal_matrix * v_normal); // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; - vec3 position = (gl_ModelViewMatrix * gl_Vertex).xyz; - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); // Perform the same lighting calculation for the 2nd light source (no specular) NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); @@ -41,12 +54,7 @@ void main() intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; // Scaled to widths of the Z texture. - if (object_max_z > 0.0) - // when rendering the overlay - object_z = object_max_z * gl_MultiTexCoord0.y; - else - // when rendering the volumes - object_z = (volume_world_matrix * gl_Vertex).z; + object_z = (object_max_z > 0.0) ? object_max_z * v_tex_coord.y : (volume_world_matrix * vec4(v_position, 1.0)).z; - gl_Position = ftransform(); + gl_Position = projection_matrix * position; } diff --git a/resources/shaders/ES/wireframe.fs b/resources/shaders/ES/wireframe.fs new file mode 100644 index 00000000000..036ee887926 --- /dev/null +++ b/resources/shaders/ES/wireframe.fs @@ -0,0 +1,19 @@ +#version 100 +#extension GL_OES_standard_derivatives : enable + +// see for reference: https://stackoverflow.com/questions/7361582/opengl-debugging-single-pass-wireframe-rendering + +precision highp float; + +uniform vec4 uniform_color; + +varying vec3 barycentric; + +void main() +{ + float min_dist = min(min(barycentric.x, barycentric.y), barycentric.z); + if (min_dist > 0.5 * fwidth(min_dist)) + discard; + + gl_FragColor = uniform_color; +} \ No newline at end of file diff --git a/resources/shaders/ES/wireframe.vs b/resources/shaders/ES/wireframe.vs new file mode 100644 index 00000000000..00a5214f589 --- /dev/null +++ b/resources/shaders/ES/wireframe.vs @@ -0,0 +1,20 @@ +#version 100 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform float offset; + +attribute vec3 v_position; +attribute vec3 v_normal; +attribute vec3 v_extra; + +varying vec3 barycentric; + +void main() +{ + barycentric = v_extra; + // Add small epsilon to z to solve z-fighting + vec4 clip_position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); + clip_position.z -= offset * abs(clip_position.w); + gl_Position = clip_position; +} \ No newline at end of file diff --git a/resources/shaders/mm_contour.fs b/resources/shaders/mm_contour.fs deleted file mode 100644 index 8ccf5b832c0..00000000000 --- a/resources/shaders/mm_contour.fs +++ /dev/null @@ -1,11 +0,0 @@ -#version 110 - -const float EPSILON = 0.0001; - -void main() -{ - gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); - // Values inside depth buffer for fragments of the contour of a selected area are offset - // by small epsilon to solve z-fighting between painted triangles and contour lines. - gl_FragDepth = gl_FragCoord.z - EPSILON; -} diff --git a/resources/shaders/mm_contour.vs b/resources/shaders/mm_contour.vs deleted file mode 100644 index d0d3ee42a9a..00000000000 --- a/resources/shaders/mm_contour.vs +++ /dev/null @@ -1,6 +0,0 @@ -#version 110 - -void main() -{ - gl_Position = ftransform(); -} diff --git a/resources/shaders/options_110.vs b/resources/shaders/options_110.vs deleted file mode 100644 index 5f2ab23504e..00000000000 --- a/resources/shaders/options_110.vs +++ /dev/null @@ -1,22 +0,0 @@ -#version 110 - -uniform bool use_fixed_screen_size; -uniform float zoom; -uniform float point_size; -uniform float near_plane_height; - -float fixed_screen_size() -{ - return point_size; -} - -float fixed_world_size() -{ - return (gl_Position.w == 1.0) ? zoom * near_plane_height * point_size : near_plane_height * point_size / gl_Position.w; -} - -void main() -{ - gl_Position = ftransform(); - gl_PointSize = use_fixed_screen_size ? fixed_screen_size() : fixed_world_size(); -} diff --git a/resources/shaders/options_120.fs b/resources/shaders/options_120.fs deleted file mode 100644 index e9b61304f26..00000000000 --- a/resources/shaders/options_120.fs +++ /dev/null @@ -1,22 +0,0 @@ -// version 120 is needed for gl_PointCoord -#version 120 - -uniform vec4 uniform_color; -uniform float percent_outline_radius; -uniform float percent_center_radius; - -vec4 calc_color(float radius, vec4 color) -{ - return ((radius < percent_center_radius) || (radius > 1.0 - percent_outline_radius)) ? - vec4(0.5 * color.rgb, color.a) : color; -} - -void main() -{ - vec2 pos = (gl_PointCoord - 0.5) * 2.0; - float radius = length(pos); - if (radius > 1.0) - discard; - - gl_FragColor = calc_color(radius, uniform_color); -} diff --git a/resources/shaders/options_120.vs b/resources/shaders/options_120.vs deleted file mode 100644 index edb503fb2b2..00000000000 --- a/resources/shaders/options_120.vs +++ /dev/null @@ -1,22 +0,0 @@ -#version 120 - -uniform bool use_fixed_screen_size; -uniform float zoom; -uniform float point_size; -uniform float near_plane_height; - -float fixed_screen_size() -{ - return point_size; -} - -float fixed_world_size() -{ - return (gl_Position.w == 1.0) ? zoom * near_plane_height * point_size : near_plane_height * point_size / gl_Position.w; -} - -void main() -{ - gl_Position = ftransform(); - gl_PointSize = use_fixed_screen_size ? fixed_screen_size() : fixed_world_size(); -} diff --git a/resources/shaders/printbed.vs b/resources/shaders/printbed.vs deleted file mode 100644 index 7633017f12c..00000000000 --- a/resources/shaders/printbed.vs +++ /dev/null @@ -1,14 +0,0 @@ -#version 110 - -attribute vec3 v_position; -attribute vec2 v_tex_coords; - -varying vec2 tex_coords; - -void main() -{ - gl_Position = gl_ModelViewProjectionMatrix * vec4(v_position.x, v_position.y, v_position.z, 1.0); - // the following line leads to crash on some Intel graphics card - //gl_Position = gl_ModelViewProjectionMatrix * vec4(v_position, 1.0); - tex_coords = v_tex_coords; -} diff --git a/resources/shaders/toolpaths_lines.fs b/resources/shaders/toolpaths_lines.fs deleted file mode 100644 index 31151cdc170..00000000000 --- a/resources/shaders/toolpaths_lines.fs +++ /dev/null @@ -1,28 +0,0 @@ -#version 110 - -// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) -const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); -const vec3 LIGHT_FRONT_DIR = vec3(0.0, 0.0, 1.0); - -// x = ambient, y = top diffuse, z = front diffuse, w = global -uniform vec4 light_intensity; -uniform vec4 uniform_color; - -varying vec3 eye_normal; - -void main() -{ - vec3 normal = normalize(eye_normal); - - // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. - // Since these two are normalized the cosine is the dot product. Take the abs value to light the lines no matter in which direction the normal points. - float NdotL = abs(dot(normal, LIGHT_TOP_DIR)); - - float intensity = light_intensity.x + NdotL * light_intensity.y; - - // Perform the same lighting calculation for the 2nd light source. - NdotL = abs(dot(normal, LIGHT_FRONT_DIR)); - intensity += NdotL * light_intensity.z; - - gl_FragColor = vec4(uniform_color.rgb * light_intensity.w * intensity, uniform_color.a); -} diff --git a/resources/shaders/toolpaths_lines.vs b/resources/shaders/toolpaths_lines.vs deleted file mode 100644 index c008aedc667..00000000000 --- a/resources/shaders/toolpaths_lines.vs +++ /dev/null @@ -1,9 +0,0 @@ -#version 110 - -varying vec3 eye_normal; - -void main() -{ - gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; - eye_normal = gl_NormalMatrix * gl_Normal; -} diff --git a/resources/shapes/sphere.png b/resources/shapes/sphere.png index c3853d68d4f4ca6c17cc100195cf87e36a9d3b4c..305b64f4188ea7b3e715d6450283771f01aadc8a 100644 GIT binary patch literal 15943 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⁣qWqa1Or#?++P*(VszW;4l8U)zZIzj}2Yne# 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 diff --git a/resources/shapes/sphere.stl b/resources/shapes/sphere.stl index ca1ef24f5c44aff29759cc486e50918e6ff5446c..80d6ac59650c5b05c5de3c6c0abd756aa6a4b6ea 100644 GIT binary patch literal 64084 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 literal 61284 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 B5$FH_ diff --git a/resources/shapes/universal wall mount hole.png b/resources/shapes/universal wall mount hole.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf7b9957605122fe1ad1dd953fce88daea2c72a GIT binary patch literal 6573 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 Q{QMHb*aVgxGcJVqU-Y}V(EtDd literal 0 HcmV?d00001 diff --git a/sandboxes/CMakeLists.txt b/sandboxes/CMakeLists.txt index 81ea94a2910..f6a4e4a84aa 100644 --- a/sandboxes/CMakeLists.txt +++ b/sandboxes/CMakeLists.txt @@ -3,4 +3,5 @@ # add_subdirectory(meshboolean) add_subdirectory(its_neighbor_index) # add_subdirectory(opencsg) -#add_subdirectory(aabb-evaluation) \ No newline at end of file +#add_subdirectory(aabb-evaluation) +add_subdirectory(wx_gl_test) \ No newline at end of file diff --git a/sandboxes/aabb-evaluation/aabb-evaluation.cpp b/sandboxes/aabb-evaluation/aabb-evaluation.cpp index 1019ecf28b1..c11af70e4e8 100644 --- a/sandboxes/aabb-evaluation/aabb-evaluation.cpp +++ b/sandboxes/aabb-evaluation/aabb-evaluation.cpp @@ -6,8 +6,6 @@ #include #include -#include - #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable: 4244) @@ -42,53 +40,42 @@ void profile(const TriangleMesh &mesh) Eigen::MatrixXd occlusion_output0; { - AABBTreeIndirect::Tree3f tree; - { - PROFILE_BLOCK(AABBIndirect_Init); - tree = AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set(mesh.its.vertices, mesh.its.indices); - } - { - PROFILE_BLOCK(EigenMesh3D_AABBIndirectF_AmbientOcclusion); - occlusion_output0.resize(num_vertices, 1); - for (int ivertex = 0; ivertex < num_vertices; ++ ivertex) { - const Eigen::Vector3d origin = mesh.its.vertices[ivertex].template cast(); - const Eigen::Vector3d normal = vertex_normals.row(ivertex).template cast(); - int num_hits = 0; - for (int s = 0; s < num_samples; s++) { - Eigen::Vector3d d = dirs.row(s); - if(d.dot(normal) < 0) { - // reverse ray - d *= -1; - } - igl::Hit hit; - if (AABBTreeIndirect::intersect_ray_first_hit(mesh.its.vertices, mesh.its.indices, tree, (origin + 1e-4 * d).eval(), d, hit)) - ++ num_hits; + AABBTreeIndirect::Tree3f tree = AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set(mesh.its.vertices, mesh.its.indices); + occlusion_output0.resize(num_vertices, 1); + for (int ivertex = 0; ivertex < num_vertices; ++ ivertex) { + const Eigen::Vector3d origin = mesh.its.vertices[ivertex].template cast(); + const Eigen::Vector3d normal = vertex_normals.row(ivertex).template cast(); + int num_hits = 0; + for (int s = 0; s < num_samples; s++) { + Eigen::Vector3d d = dirs.row(s); + if(d.dot(normal) < 0) { + // reverse ray + d *= -1; } - occlusion_output0(ivertex) = (double)num_hits/(double)num_samples; + igl::Hit hit; + if (AABBTreeIndirect::intersect_ray_first_hit(mesh.its.vertices, mesh.its.indices, tree, (origin + 1e-4 * d).eval(), d, hit)) + ++ num_hits; } + occlusion_output0(ivertex) = (double)num_hits/(double)num_samples; } - - { - PROFILE_BLOCK(EigenMesh3D_AABBIndirectFF_AmbientOcclusion); - occlusion_output0.resize(num_vertices, 1); - for (int ivertex = 0; ivertex < num_vertices; ++ ivertex) { - const Eigen::Vector3d origin = mesh.its.vertices[ivertex].template cast(); - const Eigen::Vector3d normal = vertex_normals.row(ivertex).template cast(); - int num_hits = 0; - for (int s = 0; s < num_samples; s++) { - Eigen::Vector3d d = dirs.row(s); - if(d.dot(normal) < 0) { - // reverse ray - d *= -1; - } - igl::Hit hit; - if (AABBTreeIndirect::intersect_ray_first_hit(mesh.its.vertices, mesh.its.indices, tree, - Eigen::Vector3f((origin + 1e-4 * d).template cast()), - Eigen::Vector3f(d.template cast()), hit)) - ++ num_hits; + occlusion_output0.resize(num_vertices, 1); + for (int ivertex = 0; ivertex < num_vertices; ++ ivertex) { + const Eigen::Vector3d origin = mesh.its.vertices[ivertex].template cast(); + const Eigen::Vector3d normal = vertex_normals.row(ivertex).template cast(); + int num_hits = 0; + for (int s = 0; s < num_samples; s++) { + Eigen::Vector3d d = dirs.row(s); + if(d.dot(normal) < 0) { + // reverse ray + d *= -1; } - occlusion_output0(ivertex) = (double)num_hits/(double)num_samples; + igl::Hit hit; + if (AABBTreeIndirect::intersect_ray_first_hit(mesh.its.vertices, mesh.its.indices, tree, + Eigen::Vector3f((origin + 1e-4 * d).template cast()), + Eigen::Vector3f(d.template cast()), hit)) + ++ num_hits; } + occlusion_output0(ivertex) = (double)num_hits/(double)num_samples; } } @@ -100,31 +87,23 @@ void profile(const TriangleMesh &mesh) vertices.emplace_back(V.row(i).transpose()); for (int i = 0; i < F.rows(); ++ i) triangles.emplace_back(F.row(i).transpose()); - AABBTreeIndirect::Tree3d tree; - { - PROFILE_BLOCK(AABBIndirectD_Init); - tree = AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set(vertices, triangles); - } - - { - PROFILE_BLOCK(EigenMesh3D_AABBIndirectD_AmbientOcclusion); - occlusion_output1.resize(num_vertices, 1); - for (int ivertex = 0; ivertex < num_vertices; ++ ivertex) { - const Eigen::Vector3d origin = V.row(ivertex).template cast(); - const Eigen::Vector3d normal = vertex_normals.row(ivertex).template cast(); - int num_hits = 0; - for (int s = 0; s < num_samples; s++) { - Eigen::Vector3d d = dirs.row(s); - if(d.dot(normal) < 0) { - // reverse ray - d *= -1; - } - igl::Hit hit; - if (AABBTreeIndirect::intersect_ray_first_hit(vertices, triangles, tree, Eigen::Vector3d(origin + 1e-4 * d), d, hit)) - ++ num_hits; + AABBTreeIndirect::Tree3d tree = AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set(vertices, triangles); + occlusion_output1.resize(num_vertices, 1); + for (int ivertex = 0; ivertex < num_vertices; ++ ivertex) { + const Eigen::Vector3d origin = V.row(ivertex).template cast(); + const Eigen::Vector3d normal = vertex_normals.row(ivertex).template cast(); + int num_hits = 0; + for (int s = 0; s < num_samples; s++) { + Eigen::Vector3d d = dirs.row(s); + if(d.dot(normal) < 0) { + // reverse ray + d *= -1; } - occlusion_output1(ivertex) = (double)num_hits/(double)num_samples; + igl::Hit hit; + if (AABBTreeIndirect::intersect_ray_first_hit(vertices, triangles, tree, Eigen::Vector3d(origin + 1e-4 * d), d, hit)) + ++ num_hits; } + occlusion_output1(ivertex) = (double)num_hits/(double)num_samples; } } @@ -133,29 +112,23 @@ void profile(const TriangleMesh &mesh) Eigen::MatrixXd occlusion_output2; { igl::AABB AABB; - { - PROFILE_BLOCK(EigenMesh3D_AABB_Init); - AABB.init(V, F); - } - { - PROFILE_BLOCK(EigenMesh3D_AABB_AmbientOcclusion); - occlusion_output2.resize(num_vertices, 1); - for (int ivertex = 0; ivertex < num_vertices; ++ ivertex) { - const Eigen::Vector3d origin = V.row(ivertex).template cast(); - const Eigen::Vector3d normal = vertex_normals.row(ivertex).template cast(); - int num_hits = 0; - for (int s = 0; s < num_samples; s++) { - Eigen::Vector3d d = dirs.row(s); - if(d.dot(normal) < 0) { - // reverse ray - d *= -1; - } - igl::Hit hit; - if (AABB.intersect_ray(V, F, origin + 1e-4 * d, d, hit)) - ++ num_hits; + AABB.init(V, F); + occlusion_output2.resize(num_vertices, 1); + for (int ivertex = 0; ivertex < num_vertices; ++ ivertex) { + const Eigen::Vector3d origin = V.row(ivertex).template cast(); + const Eigen::Vector3d normal = vertex_normals.row(ivertex).template cast(); + int num_hits = 0; + for (int s = 0; s < num_samples; s++) { + Eigen::Vector3d d = dirs.row(s); + if(d.dot(normal) < 0) { + // reverse ray + d *= -1; } - occlusion_output2(ivertex) = (double)num_hits/(double)num_samples; + igl::Hit hit; + if (AABB.intersect_ray(V, F, origin + 1e-4 * d, d, hit)) + ++ num_hits; } + occlusion_output2(ivertex) = (double)num_hits/(double)num_samples; } } @@ -166,37 +139,28 @@ void profile(const TriangleMesh &mesh) igl::AABB AABB; auto vertices = MapMatrixXfUnaligned(mesh.its.vertices.front().data(), mesh.its.vertices.size(), 3); auto faces = MapMatrixXiUnaligned(mesh.its.indices.front().data(), mesh.its.indices.size(), 3); - { - PROFILE_BLOCK(EigenMesh3D_AABBf_Init); - AABB.init( - vertices, - faces); - } - - { - PROFILE_BLOCK(EigenMesh3D_AABBf_AmbientOcclusion); - occlusion_output3.resize(num_vertices, 1); - for (int ivertex = 0; ivertex < num_vertices; ++ ivertex) { - const Eigen::Vector3d origin = mesh.its.vertices[ivertex].template cast(); - const Eigen::Vector3d normal = vertex_normals.row(ivertex).template cast(); - int num_hits = 0; - for (int s = 0; s < num_samples; s++) { - Eigen::Vector3d d = dirs.row(s); - if(d.dot(normal) < 0) { - // reverse ray - d *= -1; - } - igl::Hit hit; - if (AABB.intersect_ray(vertices, faces, (origin + 1e-4 * d).eval().template cast(), d.template cast(), hit)) - ++ num_hits; + AABB.init( + vertices, + faces); + + occlusion_output3.resize(num_vertices, 1); + for (int ivertex = 0; ivertex < num_vertices; ++ ivertex) { + const Eigen::Vector3d origin = mesh.its.vertices[ivertex].template cast(); + const Eigen::Vector3d normal = vertex_normals.row(ivertex).template cast(); + int num_hits = 0; + for (int s = 0; s < num_samples; s++) { + Eigen::Vector3d d = dirs.row(s); + if(d.dot(normal) < 0) { + // reverse ray + d *= -1; } - occlusion_output3(ivertex) = (double)num_hits/(double)num_samples; + igl::Hit hit; + if (AABB.intersect_ray(vertices, faces, (origin + 1e-4 * d).eval().template cast(), d.template cast(), hit)) + ++ num_hits; } + occlusion_output3(ivertex) = (double)num_hits/(double)num_samples; } } - - PROFILE_UPDATE(); - PROFILE_OUTPUT(nullptr); } int main(const int argc, const char *argv[]) diff --git a/sandboxes/wx_gl_test/CMakeLists.txt b/sandboxes/wx_gl_test/CMakeLists.txt new file mode 100644 index 00000000000..b94029a8480 --- /dev/null +++ b/sandboxes/wx_gl_test/CMakeLists.txt @@ -0,0 +1,24 @@ +cmake_minimum_required(VERSION 3.10) + +project(wxGL_Test) + +add_executable(wxgltest WIN32 main.cpp ) + +set (wxWidgets_CONFIG_OPTIONS "--toolkit=gtk${SLIC3R_GTK}") +find_package(wxWidgets 3.1 REQUIRED COMPONENTS core base gl html) +find_package(OpenGL REQUIRED) +find_package(NanoSVG REQUIRED) +include(${wxWidgets_USE_FILE}) + +target_include_directories(wxgltest PRIVATE ${wxWidgets_INCLUDE_DIRS}) +target_compile_definitions(wxgltest PRIVATE ${wxWidgets_DEFINITIONS}) +target_compile_definitions(wxgltest PUBLIC -DwxDEBUG_LEVEL=0) + +target_link_libraries(wxgltest ${wxWidgets_LIBRARIES} + OpenGL::GL + OpenGL::EGL + NanoSVG::nanosvgrast +# png16 +# X11 + X11 wayland-client wayland-egl +) diff --git a/sandboxes/wx_gl_test/main.cpp b/sandboxes/wx_gl_test/main.cpp new file mode 100644 index 00000000000..4aa02c83a12 --- /dev/null +++ b/sandboxes/wx_gl_test/main.cpp @@ -0,0 +1,221 @@ +#include +#include +#include +#include + +// For compilers that support precompilation, includes "wx/wx.h". +#include +#ifndef WX_PRECOMP +#include +#endif + +#include +#include +#include +#include +#include + +class Renderer { +protected: + wxGLCanvas *m_canvas; + std::unique_ptr m_context; +public: + + Renderer(wxGLCanvas *c): m_canvas{c} { + m_context = std::make_unique(m_canvas); + } + + wxGLContext * context() { return m_context.get(); } + const wxGLContext * context() const { return m_context.get(); } + + void set_active() + { + m_canvas->SetCurrent(*m_context); + + // Set the current clear color to sky blue and the current drawing color to + // white. + glClearColor(0.1, 0.39, 0.88, 1.0); + glColor3f(1.0, 1.0, 1.0); + + // Tell the rendering engine not to draw backfaces. Without this code, + // all four faces of the tetrahedron would be drawn and it is possible + // that faces farther away could be drawn after nearer to the viewer. + // Since there is only one closed polyhedron in the whole scene, + // eliminating the drawing of backfaces gives us the realism we need. + // THIS DOES NOT WORK IN GENERAL. + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + + // Set the camera lens so that we have a perspective viewing volume whose + // horizontal bounds at the near clipping plane are -2..2 and vertical + // bounds are -1.5..1.5. The near clipping plane is 1 unit from the camera + // and the far clipping plane is 40 units away. + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glFrustum(-2, 2, -1.5, 1.5, 1, 40); + + // Set up transforms so that the tetrahedron which is defined right at + // the origin will be rotated and moved into the view volume. First we + // rotate 70 degrees around y so we can see a lot of the left side. + // Then we rotate 50 degrees around x to "drop" the top of the pyramid + // down a bit. Then we move the object back 3 units "into the screen". + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0, 0, -3); + glRotatef(50, 1, 0, 0); + glRotatef(70, 0, 1, 0); + } + + void draw_scene(long w, long h) + { + glViewport(0, 0, GLsizei(w), GLsizei(h)); + glClear(GL_COLOR_BUFFER_BIT); + + // Draw a white grid "floor" for the tetrahedron to sit on. + glColor3f(1.0, 1.0, 1.0); + glBegin(GL_LINES); + for (GLfloat i = -2.5; i <= 2.5; i += 0.25) { + glVertex3f(i, 0, 2.5); glVertex3f(i, 0, -2.5); + glVertex3f(2.5, 0, i); glVertex3f(-2.5, 0, i); + } + glEnd(); + + // Draw the tetrahedron. It is a four sided figure, so when defining it + // with a triangle strip we have to repeat the last two vertices. + glBegin(GL_TRIANGLE_STRIP); + glColor3f(1, 1, 1); glVertex3f(0, 2, 0); + glColor3f(1, 0, 0); glVertex3f(-1, 0, 1); + glColor3f(0, 1, 0); glVertex3f(1, 0, 1); + glColor3f(0, 0, 1); glVertex3f(0, 0, -1.4); + glColor3f(1, 1, 1); glVertex3f(0, 2, 0); + glColor3f(1, 0, 0); glVertex3f(-1, 0, 1); + glEnd(); + + glFlush(); + } + + void swap_buffers() { m_canvas->SwapBuffers(); } +}; + +// The top level frame of the application. +class MyFrame: public wxFrame +{ + wxGLCanvas *m_canvas; + std::unique_ptr m_renderer; + +public: + MyFrame(const wxString & title, + const wxPoint & pos, + const wxSize & size); + + wxGLCanvas * canvas() { return m_canvas; } + const wxGLCanvas * canvas() const { return m_canvas; } +}; + +class App : public wxApp { + MyFrame *m_frame = nullptr; + wxString m_fname; +public: + bool OnInit() override { + + m_frame = new MyFrame("Wayland wxNotebook issue", wxDefaultPosition, wxSize(1024, 768)); + m_frame->Show( true ); + + return true; + } + +}; + +wxIMPLEMENT_APP(App); + +MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): + wxFrame(nullptr, wxID_ANY, title, pos, size) +{ + wxMenu *menuFile = new wxMenu; + menuFile->Append(wxID_OPEN); + menuFile->Append(wxID_EXIT); + wxMenuBar *menuBar = new wxMenuBar; + menuBar->Append( menuFile, "&File" ); + SetMenuBar( menuBar ); + + auto notebookpanel = new wxPanel(this); + auto notebook = new wxNotebook(notebookpanel, wxID_ANY); + auto maintab = new wxPanel(notebook); + + m_canvas = new wxGLCanvas(maintab, + wxID_ANY, + nullptr, + wxDefaultPosition, + wxDefaultSize, + wxWANTS_CHARS | wxFULL_REPAINT_ON_RESIZE); + + m_renderer = std::make_unique(m_canvas); + + wxPanel *control_panel = new wxPanel(maintab); + + auto controlsizer = new wxBoxSizer(wxHORIZONTAL); + auto console_sizer = new wxBoxSizer(wxVERTICAL); + + std::vector combolist = {"One", "Two", "Three"}; + auto combobox = new wxComboBox(control_panel, wxID_ANY, combolist[0], + wxDefaultPosition, wxDefaultSize, + int(combolist.size()), combolist.data()); + + auto sz = new wxBoxSizer(wxHORIZONTAL); + sz->Add(new wxStaticText(control_panel, wxID_ANY, "Choose number"), 0, + wxALL | wxALIGN_CENTER, 5); + sz->Add(combobox, 1, wxALL | wxEXPAND, 5); + console_sizer->Add(sz, 0, wxEXPAND); + + auto btn1 = new wxToggleButton(control_panel, wxID_ANY, "Button1"); + console_sizer->Add(btn1, 0, wxALL | wxEXPAND, 5); + + auto btn2 = new wxToggleButton(control_panel, wxID_ANY, "Button2"); + btn2->SetValue(true); + console_sizer->Add(btn2, 0, wxALL | wxEXPAND, 5); + + controlsizer->Add(console_sizer, 1, wxEXPAND); + + control_panel->SetSizer(controlsizer); + + auto maintab_sizer = new wxBoxSizer(wxHORIZONTAL); + maintab_sizer->Add(m_canvas, 1, wxEXPAND); + maintab_sizer->Add(control_panel, 0); + maintab->SetSizer(maintab_sizer); + + notebook->AddPage(maintab, "Main"); + + wxTextCtrl* textCtrl1 = new wxTextCtrl(notebook, wxID_ANY, L"Tab 2 Contents"); + notebook->AddPage(textCtrl1, "Dummy"); + + auto notebooksizer = new wxBoxSizer(wxHORIZONTAL); + notebooksizer->Add(notebook, 1, wxEXPAND); + notebookpanel->SetSizer(notebooksizer); + + auto topsizer = new wxBoxSizer(wxHORIZONTAL); + topsizer->Add(notebookpanel, 1, wxEXPAND); + SetSizer(topsizer); + SetMinSize(size); + + Bind(wxEVT_MENU, [this](wxCommandEvent &) { + wxFileDialog dlg(this, "Select file", wxEmptyString, + wxEmptyString, "*.*", wxFD_OPEN|wxFD_FILE_MUST_EXIST); + dlg.ShowModal(); + }, wxID_OPEN); + + Bind(wxEVT_MENU, [this](wxCommandEvent &) { + Close(); + }, wxID_EXIT); + + Bind(wxEVT_SHOW, [this](wxShowEvent &) { + m_renderer->set_active(); + + m_canvas->Bind(wxEVT_PAINT, [this](wxPaintEvent &){ + wxPaintDC dc(m_canvas); + + const wxSize sz = m_canvas->GetClientSize(); + m_renderer->draw_scene(sz.x, sz.y); + m_renderer->swap_buffers(); + }); + }); +} diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b75dcaa2fe3..50eccfc849f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -9,13 +9,22 @@ add_subdirectory(boost) add_subdirectory(clipper) add_subdirectory(miniz) add_subdirectory(glu-libtess) -add_subdirectory(qhull) -add_subdirectory(Shiny) add_subdirectory(semver) add_subdirectory(libigl) add_subdirectory(hints) add_subdirectory(qoi) add_subdirectory(libnest2d) + +find_package(Qhull 7.2 REQUIRED) +add_library(qhull INTERFACE) +if(SLIC3R_STATIC) + slic3r_remap_configs("Qhull::qhullcpp;Qhull::qhullstatic_r" RelWithDebInfo Release) + target_link_libraries(qhull INTERFACE Qhull::qhullcpp Qhull::qhullstatic_r) +else() + slic3r_remap_configs("Qhull::qhullcpp;Qhull::qhull_r" RelWithDebInfo Release) + target_link_libraries(qhull INTERFACE Qhull::qhullcpp Qhull::qhull_r) +endif() + add_subdirectory(libslic3r) if (SLIC3R_ENABLE_FORMAT_STEP) @@ -50,18 +59,26 @@ if (SLIC3R_GUI) "Hint: On Linux you can set -DSLIC3R_WX_STABLE=1 to use wxWidgets 3.0\n") endif () endif () + + include(${wxWidgets_USE_FILE}) else () - find_package(wxWidgets 3.1 REQUIRED COMPONENTS html adv gl core base) + find_package(wxWidgets 3.1 COMPONENTS html adv gl core base) + if (NOT wxWidgets_FOUND) + message(STATUS "Trying to find wxWidgets in CONFIG mode...") + find_package(wxWidgets 3.2 CONFIG REQUIRED COMPONENTS html adv gl core base) + slic3r_remap_configs(wx::wxhtml wx::wxadv wx::wxgl wx::wxcore wx::wxbase RelWithDebInfo Release) + else () + include(${wxWidgets_USE_FILE}) + endif () endif () if(UNIX) message(STATUS "wx-config path: ${wxWidgets_CONFIG_EXECUTABLE}") endif() - include(${wxWidgets_USE_FILE}) - find_package(JPEG QUIET) find_package(TIFF QUIET) + find_package(NanoSVG REQUIRED) string(REGEX MATCH "wxpng" WX_PNG_BUILTIN ${wxWidgets_LIBRARIES}) if (PNG_FOUND AND NOT WX_PNG_BUILTIN) @@ -97,7 +114,10 @@ if (SLIC3R_GUI) # wrong libs for opengl in the link line and it does not link to it by himself. # libslic3r_gui will link to opengl anyway, so lets override wx list(FILTER wxWidgets_LIBRARIES EXCLUDE REGEX OpenGL) - + + if (UNIX AND NOT APPLE) + list(APPEND wxWidgets_LIBRARIES X11 wayland-client wayland-egl EGL) + endif () # list(REMOVE_ITEM wxWidgets_LIBRARIES oleacc) message(STATUS "wx libs: ${wxWidgets_LIBRARIES}") @@ -127,7 +147,7 @@ if (NOT WIN32 AND NOT APPLE) set_target_properties(PrusaSlicer PROPERTIES OUTPUT_NAME "prusa-slicer") endif () -target_link_libraries(PrusaSlicer libslic3r cereal) +target_link_libraries(PrusaSlicer libslic3r libcereal) if (APPLE) # add_compile_options(-stdlib=libc++) diff --git a/src/PrusaSlicer.cpp b/src/PrusaSlicer.cpp index 3d2e6e6b767..e600f343ca3 100644 --- a/src/PrusaSlicer.cpp +++ b/src/PrusaSlicer.cpp @@ -33,6 +33,9 @@ #include "unix/fhs.hpp" // Generated by CMake from ../platform/unix/fhs.hpp.in #include "libslic3r/libslic3r.h" +#if ENABLE_GL_CORE_PROFILE +#include +#endif // ENABLE_GL_CORE_PROFILE #include "libslic3r/Config.hpp" #include "libslic3r/Geometry.hpp" #include "libslic3r/GCode/PostProcessor.hpp" @@ -69,6 +72,8 @@ int CLI::run(int argc, char **argv) { // Mark the main thread for the debugger and for runtime checks. set_current_thread_name("slic3r_main"); + // Save the thread ID of the main thread. + save_main_thread_id(); #ifdef __WXGTK__ // On Linux, wxGTK has no support for Wayland, and the app crashes on @@ -110,6 +115,9 @@ int CLI::run(int argc, char **argv) std::find(m_transforms.begin(), m_transforms.end(), "cut") == m_transforms.end() && std::find(m_transforms.begin(), m_transforms.end(), "cut_x") == m_transforms.end() && std::find(m_transforms.begin(), m_transforms.end(), "cut_y") == m_transforms.end(); + bool start_downloader = false; + bool delete_after_load = false; + std::string download_url; bool start_as_gcodeviewer = #ifdef _WIN32 false; @@ -117,6 +125,12 @@ int CLI::run(int argc, char **argv) // On Unix systems, the prusa-slicer binary may be symlinked to give the application a different meaning. boost::algorithm::iends_with(boost::filesystem::path(argv[0]).filename().string(), "gcodeviewer"); #endif // _WIN32 +#if ENABLE_GL_CORE_PROFILE + std::pair opengl_version = { 0, 0 }; +#if ENABLE_OPENGL_DEBUG_OPTION + bool opengl_debug = false; +#endif // ENABLE_OPENGL_DEBUG_OPTION +#endif // ENABLE_GL_CORE_PROFILE const std::vector &load_configs = m_config.option("load", true)->values; const ForwardCompatibilitySubstitutionRule config_substitution_rule = m_config.option>("config_compatibility", true)->value; @@ -155,6 +169,44 @@ int CLI::run(int argc, char **argv) m_print_config.apply(config); } +#if ENABLE_GL_CORE_PROFILE + // search for special keys into command line parameters + auto it = std::find(m_actions.begin(), m_actions.end(), "gcodeviewer"); + if (it != m_actions.end()) { + start_gui = true; + start_as_gcodeviewer = true; + m_actions.erase(it); + } + + it = std::find(m_actions.begin(), m_actions.end(), "opengl-version"); + if (it != m_actions.end()) { + std::string opengl_version_str = m_config.opt_string("opengl-version"); + if (std::find(Slic3r::GUI::OpenGLVersions::core_str.begin(), Slic3r::GUI::OpenGLVersions::core_str.end(), opengl_version_str) == Slic3r::GUI::OpenGLVersions::core_str.end()) { + if (std::find(Slic3r::GUI::OpenGLVersions::precore_str.begin(), Slic3r::GUI::OpenGLVersions::precore_str.end(), opengl_version_str) == Slic3r::GUI::OpenGLVersions::precore_str.end()) { + boost::nowide::cerr << "Found invalid OpenGL version: " << opengl_version_str << std::endl; + opengl_version_str.clear(); + } + } + + if (!opengl_version_str.empty()) { + std::vector tokens; + boost::split(tokens, opengl_version_str, boost::is_any_of("."), boost::token_compress_on); + opengl_version.first = std::stoi(tokens[0].c_str()); + opengl_version.second = std::stoi(tokens[1].c_str()); + } + start_gui = true; + m_actions.erase(it); + } + + it = std::find(m_actions.begin(), m_actions.end(), "opengl-debug"); + if (it != m_actions.end()) { + start_gui = true; +#if ENABLE_OPENGL_DEBUG_OPTION + opengl_debug = true; +#endif // ENABLE_OPENGL_DEBUG_OPTION + m_actions.erase(it); + } +#else // are we starting as gcodeviewer ? for (auto it = m_actions.begin(); it != m_actions.end(); ++it) { if (*it == "gcodeviewer") { @@ -164,6 +216,7 @@ int CLI::run(int argc, char **argv) break; } } +#endif // ENABLE_GL_CORE_PROFILE // Read input file(s) if any. for (const std::string& file : m_input_files) @@ -173,6 +226,11 @@ int CLI::run(int argc, char **argv) } if (!start_as_gcodeviewer) { for (const std::string& file : m_input_files) { + if (boost::starts_with(file, "prusaslicer://")) { + start_downloader = true; + download_url = file; + continue; + } if (!boost::filesystem::exists(file)) { boost::nowide::cerr << "No such file: " << file << std::endl; exit(1); @@ -324,7 +382,7 @@ int CLI::run(int argc, char **argv) } else if (opt_key == "align_xy") { const Vec2d &p = m_config.option("align_xy")->value; for (auto &model : m_models) { - BoundingBoxf3 bb = model.bounding_box(); + BoundingBoxf3 bb = model.bounding_box_exact(); // this affects volumes: model.translate(-(bb.min.x() - p.x()), -(bb.min.y() - p.y()), -bb.min.z()); } @@ -365,7 +423,7 @@ int CLI::run(int argc, char **argv) } else if (opt_key == "cut" || opt_key == "cut_x" || opt_key == "cut_y") { std::vector new_models; for (auto &model : m_models) { - model.translate(0, 0, -model.bounding_box().min.z()); // align to z = 0 + model.translate(0, 0, -model.bounding_box_exact().min.z()); // align to z = 0 size_t num_objects = model.objects.size(); for (size_t i = 0; i < num_objects; ++ i) { @@ -378,7 +436,9 @@ int CLI::run(int argc, char **argv) o->cut(Z, m_config.opt_float("cut"), &out); } #else - model.objects.front()->cut(0, m_config.opt_float("cut"), ModelObjectCutAttribute::KeepLower | ModelObjectCutAttribute::KeepUpper | ModelObjectCutAttribute::FlipLower); +// model.objects.front()->cut(0, m_config.opt_float("cut"), ModelObjectCutAttribute::KeepLower | ModelObjectCutAttribute::KeepUpper | ModelObjectCutAttribute::FlipLower); + model.objects.front()->cut(0, Geometry::translation_transform(m_config.opt_float("cut") * Vec3d::UnitZ()), + ModelObjectCutAttribute::KeepLower | ModelObjectCutAttribute::KeepUpper | ModelObjectCutAttribute::PlaceOnCutUpper); #endif model.delete_object(size_t(0)); } @@ -428,6 +488,9 @@ int CLI::run(int argc, char **argv) // Models are repaired by default. //for (auto &model : m_models) // model.repair(); + + } else if (opt_key == "delete-after-load") { + delete_after_load = true; } else { boost::nowide::cerr << "error: option not implemented yet: " << opt_key << std::endl; return 1; @@ -498,8 +561,6 @@ int CLI::run(int argc, char **argv) std::string outfile = m_config.opt_string("output"); Print fff_print; SLAPrint sla_print; - SL1Archive sla_archive(sla_print.printer_config()); - sla_print.set_printer(&sla_archive); sla_print.set_status_callback( [](const PrintBase::SlicingStatus& s) { @@ -539,7 +600,7 @@ int CLI::run(int argc, char **argv) outfile = sla_print.output_filepath(outfile); // We need to finalize the filename beforehand because the export function sets the filename inside the zip metadata outfile_final = sla_print.print_statistics().finalize_output_path(outfile); - sla_archive.export_print(outfile_final, sla_print); + sla_print.export_print(outfile_final); } if (outfile != outfile_final) { if (Slic3r::rename_file(outfile, outfile_final)) { @@ -615,6 +676,15 @@ int CLI::run(int argc, char **argv) params.extra_config = std::move(m_extra_config); params.input_files = std::move(m_input_files); params.start_as_gcodeviewer = start_as_gcodeviewer; + params.start_downloader = start_downloader; + params.download_url = download_url; + params.delete_after_load = delete_after_load; +#if ENABLE_GL_CORE_PROFILE +#if ENABLE_OPENGL_DEBUG_OPTION + params.opengl_version = opengl_version; + params.opengl_debug = opengl_debug; +#endif // ENABLE_OPENGL_DEBUG_OPTION +#endif // ENABLE_GL_CORE_PROFILE return Slic3r::GUI::GUI_Run(params); #else // SLIC3R_GUI // No GUI support. Just print out a help. @@ -823,6 +893,39 @@ std::string CLI::output_filepath(const Model &model, IO::ExportFormat format) co return proposed_path.string(); } +// __has_feature() is used later for Clang, this is for compatibility with other compilers (such as GCC and MSVC) +#ifndef __has_feature +# define __has_feature(x) 0 +#endif + +#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) +extern "C" { + // Based on https://github.com/google/skia/blob/main/tools/LsanSuppressions.cpp + const char *__lsan_default_suppressions() { + return "leak:libfontconfig\n" // FontConfig looks like it leaks, but it doesn't. + "leak:libfreetype\n" // Unsure, appeared upgrading Debian 9->10. + "leak:libGLX_nvidia.so\n" // For NVidia driver. + "leak:libnvidia-glcore.so\n" // For NVidia driver. + "leak:libnvidia-tls.so\n" // For NVidia driver. + "leak:terminator_CreateDevice\n" // For Intel Vulkan drivers. + "leak:swrast_dri.so\n" // For Mesa 3D software driver. + "leak:amdgpu_dri.so\n" // For AMD driver. + "leak:libdrm_amdgpu.so\n" // For AMD driver. + "leak:libdbus-1.so\n" // For D-Bus library. Unsure if it is a leak or not. + ; + } +} +#endif + +#if defined(SLIC3R_UBSAN) +extern "C" { + // Enable printing stacktrace by default. It can be disabled by running PrusaSlicer with "UBSAN_OPTIONS=print_stacktrace=0". + const char *__ubsan_default_options() { + return "print_stacktrace=1"; + } +} +#endif + #if defined(_MSC_VER) || defined(__MINGW32__) extern "C" { __declspec(dllexport) int __stdcall slic3r_main(int argc, wchar_t **argv) diff --git a/src/PrusaSlicer_app_msvc.cpp b/src/PrusaSlicer_app_msvc.cpp index 2ccf2f1ffd2..90bd2d89f20 100644 --- a/src/PrusaSlicer_app_msvc.cpp +++ b/src/PrusaSlicer_app_msvc.cpp @@ -66,16 +66,25 @@ class OpenGLVersionCheck return this->success; } - void unload_opengl_dll() + bool unload_opengl_dll() { - if (this->hOpenGL) { - BOOL released = FreeLibrary(this->hOpenGL); - if (released) - printf("System OpenGL library released\n"); + if (this->hOpenGL != nullptr) { + if (::FreeLibrary(this->hOpenGL) != FALSE) { + if (::GetModuleHandle(L"opengl32.dll") == nullptr) { + printf("System OpenGL library successfully released\n"); + this->hOpenGL = nullptr; + return true; + } + else + printf("System OpenGL library released but not removed\n"); + } else printf("System OpenGL library NOT released\n"); - this->hOpenGL = nullptr; + + return false; } + + return true; } bool is_version_greater_or_equal_to(unsigned int major, unsigned int minor) const @@ -233,13 +242,14 @@ int wmain(int argc, wchar_t **argv) #ifdef SLIC3R_GUI // Here one may push some additional parameters based on the wrapper type. bool force_mesa = false; + bool force_hw = false; #endif /* SLIC3R_GUI */ for (int i = 1; i < argc; ++ i) { #ifdef SLIC3R_GUI if (wcscmp(argv[i], L"--sw-renderer") == 0) force_mesa = true; else if (wcscmp(argv[i], L"--no-sw-renderer") == 0) - force_mesa = false; + force_hw = true; #endif /* SLIC3R_GUI */ argv_extended.emplace_back(argv[i]); } @@ -252,7 +262,7 @@ int wmain(int argc, wchar_t **argv) force_mesa || // Running over a rempote desktop, and the RemoteFX is not enabled, therefore Windows will only provide SW OpenGL 1.1 context. // In that case, use Mesa. - ::GetSystemMetrics(SM_REMOTESESSION) || + (::GetSystemMetrics(SM_REMOTESESSION) && !force_hw) || // Try to load the default OpenGL driver and test its context version. ! opengl_version_check.load_opengl_dll() || ! opengl_version_check.is_version_greater_or_equal_to(2, 0); #endif /* SLIC3R_GUI */ @@ -270,20 +280,26 @@ int wmain(int argc, wchar_t **argv) // https://wiki.qt.io/Cross_compiling_Mesa_for_Windows // http://download.qt.io/development_releases/prebuilt/llvmpipe/windows/ if (load_mesa) { - opengl_version_check.unload_opengl_dll(); - wchar_t path_to_mesa[MAX_PATH + 1] = { 0 }; - wcscpy(path_to_mesa, path_to_exe); - wcscat(path_to_mesa, L"mesa\\opengl32.dll"); - printf("Loading MESA OpenGL library: %S\n", path_to_mesa); - HINSTANCE hInstance_OpenGL = LoadLibraryExW(path_to_mesa, nullptr, 0); - if (hInstance_OpenGL == nullptr) { - printf("MESA OpenGL library was not loaded\n"); - } else - printf("MESA OpenGL library was loaded sucessfully\n"); + bool res = opengl_version_check.unload_opengl_dll(); + if (!res) { + MessageBox(nullptr, L"PrusaSlicer was unable to automatically switch to MESA OpenGL library\nPlease, try to run the application using the '--sw-renderer' option.\n", + L"PrusaSlicer Warning", MB_OK); + return -1; + } + else { + wchar_t path_to_mesa[MAX_PATH + 1] = { 0 }; + wcscpy(path_to_mesa, path_to_exe); + wcscat(path_to_mesa, L"mesa\\opengl32.dll"); + printf("Loading MESA OpenGL library: %S\n", path_to_mesa); + HINSTANCE hInstance_OpenGL = LoadLibraryExW(path_to_mesa, nullptr, 0); + if (hInstance_OpenGL == nullptr) + printf("MESA OpenGL library was not loaded\n"); + else + printf("MESA OpenGL library was loaded sucessfully\n"); + } } #endif /* SLIC3R_GUI */ - wchar_t path_to_slic3r[MAX_PATH + 1] = { 0 }; wcscpy(path_to_slic3r, path_to_exe); wcscat(path_to_slic3r, L"PrusaSlicer.dll"); diff --git a/src/Shiny/CMakeLists.txt b/src/Shiny/CMakeLists.txt deleted file mode 100644 index abdb96a72e0..00000000000 --- a/src/Shiny/CMakeLists.txt +++ /dev/null @@ -1,25 +0,0 @@ -cmake_minimum_required(VERSION 2.8.12) -project(Shiny) - -add_library(Shiny STATIC - Shiny.h - ShinyConfig.h - ShinyData.h - ShinyMacros.h - ShinyManager.c - ShinyManager.h - ShinyNode.c - ShinyNode.h - ShinyNodePool.c - ShinyNodePool.h - ShinyNodeState.c - ShinyNodeState.h - ShinyOutput.c - ShinyOutput.h - ShinyPrereqs.h - ShinyTools.c - ShinyTools.h - ShinyVersion.h - ShinyZone.c - ShinyZone.h -) diff --git a/src/Shiny/Shiny.h b/src/Shiny/Shiny.h deleted file mode 100644 index a2905aef094..00000000000 --- a/src/Shiny/Shiny.h +++ /dev/null @@ -1,36 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifndef SHINY_H -#define SHINY_H - -/*---------------------------------------------------------------------------*/ - -#include "ShinyMacros.h" - -#ifdef SLIC3R_PROFILE -#include "ShinyManager.h" -#endif /* SLIC3R_PROFILE */ - -#endif /* SHINY_H */ diff --git a/src/Shiny/ShinyConfig.h b/src/Shiny/ShinyConfig.h deleted file mode 100644 index 54c632151b2..00000000000 --- a/src/Shiny/ShinyConfig.h +++ /dev/null @@ -1,61 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifndef SHINY_CONFIG_H -#define SHINY_CONFIG_H - - -/*---------------------------------------------------------------------------*/ - -/* if SHINY_LOOKUP_RATE is defined to TRUE then Shiny will record the success of its hash function. This is useful for debugging. Default is FALSE. - */ -#ifndef SHINY_LOOKUP_RATE -// #define SHINY_LOOKUP_RATE FALSE -#endif - -/* if SHINY_HAS_ENABLED is defined to TRUE then Shiny can be enabled and disabled at runtime. TODO: bla bla... - */ -#ifndef SHINY_HAS_ENABLED -// #define SHINY_HAS_ENABLED FALSE -#endif - -/* TODO: - */ -#define SHINY_OUTPUT_MODE_FLAT 0x1 - -/* TODO: - */ -#define SHINY_OUTPUT_MODE_TREE 0x2 - -/* TODO: - */ -#define SHINY_OUTPUT_MODE_BOTH 0x3 - -/* TODO: - */ -#ifndef SHINY_OUTPUT_MODE -#define SHINY_OUTPUT_MODE SHINY_OUTPUT_MODE_BOTH -#endif - -#endif /* SHINY_CONFIG_H */ diff --git a/src/Shiny/ShinyData.h b/src/Shiny/ShinyData.h deleted file mode 100644 index d75d4f5bf48..00000000000 --- a/src/Shiny/ShinyData.h +++ /dev/null @@ -1,102 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifndef SHINY_DATA_H -#define SHINY_DATA_H - -#include "ShinyPrereqs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*---------------------------------------------------------------------------*/ - -typedef struct { - uint32_t entryCount; - shinytick_t selfTicks; -} ShinyLastData; - - -/*---------------------------------------------------------------------------*/ - -typedef struct { - shinytick_t cur; - float avg; -} ShinyTickData; - -typedef struct { - uint32_t cur; - float avg; -} ShinyCountData; - -typedef struct { - ShinyCountData entryCount; - ShinyTickData selfTicks; - ShinyTickData childTicks; -} ShinyData; - -SHINY_INLINE shinytick_t ShinyData_totalTicksCur(const ShinyData *self) { - return self->selfTicks.cur + self->childTicks.cur; -} - -SHINY_INLINE float ShinyData_totalTicksAvg(const ShinyData *self) { - return self->selfTicks.avg + self->childTicks.avg; -} - -SHINY_INLINE void ShinyData_computeAverage(ShinyData *self, float a_damping) { - self->entryCount.avg = self->entryCount.cur + - a_damping * (self->entryCount.avg - self->entryCount.cur); - self->selfTicks.avg = self->selfTicks.cur + - a_damping * (self->selfTicks.avg - self->selfTicks.cur); - self->childTicks.avg = self->childTicks.cur + - a_damping * (self->childTicks.avg - self->childTicks.cur); -} - -SHINY_INLINE void ShinyData_copyAverage(ShinyData *self) { - self->entryCount.avg = (float) self->entryCount.cur; - self->selfTicks.avg = (float) self->selfTicks.cur; - self->childTicks.avg = (float) self->childTicks.cur; -} - -SHINY_INLINE void ShinyData_clearAll(ShinyData *self) { - self->entryCount.cur = 0; - self->entryCount.avg = 0; - self->selfTicks.cur = 0; - self->selfTicks.avg = 0; - self->childTicks.cur = 0; - self->childTicks.avg = 0; -} - -SHINY_INLINE void ShinyData_clearCurrent(ShinyData *self) { - self->entryCount.cur = 0; - self->selfTicks.cur = 0; - self->childTicks.cur = 0; -} - -#if __cplusplus -} /* end of extern "C" */ -#endif - -#endif /* SHINY_DATA_H */ diff --git a/src/Shiny/ShinyMacros.h b/src/Shiny/ShinyMacros.h deleted file mode 100644 index 79dfa438193..00000000000 --- a/src/Shiny/ShinyMacros.h +++ /dev/null @@ -1,281 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifndef SHINY_MACROS_H -#define SHINY_MACROS_H - -#ifdef SLIC3R_PROFILE - -#include "ShinyManager.h" - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#define PROFILE_UPDATE() \ - ShinyManager_update(&Shiny_instance) - -#define PROFILE_SET_DAMPING(floatfrom0to1) \ - Shiny_instance.damping = (floatfrom0to1); - -#define PROFILE_GET_DAMPING() \ - (Shiny_instance.damping) - -#define PROFILE_OUTPUT(filename) \ - ShinyManager_output(&Shiny_instance, (filename)) - -#define PROFILE_OUTPUT_STREAM(stream) \ - ShinyManager_outputToStream(&Shiny_instance, (stream)) - -#ifdef __cplusplus -#define PROFILE_GET_TREE_STRING() \ - ShinyManager_outputTreeToString(&Shiny_instance) - -#define PROFILE_GET_FLAT_STRING() \ - ShinyManager_outputFlatToString(&Shiny_instance) -#endif /* __cplusplus */ - -#define PROFILE_DESTROY() \ - ShinyManager_destroy(&Shiny_instance) - -#define PROFILE_CLEAR() \ - ShinyManager_clear(&Shiny_instance) - -#define PROFILE_SORT_ZONES() \ - ShinyManager_sortZones(&Shiny_instance) - - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#define PROFILE_GET_TOTAL_TICKS_CUR() \ - ShinyData_totalTicksCur(&Shiny_instance.rootZone.data) - -#define PROFILE_GET_TOTAL_TICKS() \ - ShinyData_totalTicksAvg(&Shiny_instance.rootZone.data) - -#define PROFILE_GET_PROFILED_TICKS_CUR() \ - (Shiny_instance.rootZone.data.selfTicks.cur) - -#define PROFILE_GET_PROFILED_TICKS() \ - (Shiny_instance.rootZone.data.selfTicks.avg) - -#define PROFILE_GET_UNPROFILED_TICKS_CUR() \ - (Shiny_instance.rootZone.data.childTicks.cur) - -#define PROFILE_GET_UNPROFILED_TICKS() \ - (Shiny_instance.rootZone.data.childTicks.avg) - -#define PROFILE_GET_SHARED_TOTAL_TICKS_CUR(name) \ - ShinyData_totalTicksCur(&(_PROFILE_ID_ZONE_SHARED(name).data)) - -#define PROFILE_GET_SHARED_TOTAL_TICKS(name) \ - ShinyData_totalTicksAvg(&(_PROFILE_ID_ZONE_SHARED(name).data)) - -#define PROFILE_GET_SHARED_SELF_TICKS_CUR(name) \ - (_PROFILE_ID_ZONE_SHARED(name).data.selfTicks.cur) - -#define PROFILE_GET_SHARED_SELF_TICKS(name) \ - (_PROFILE_ID_ZONE_SHARED(name).data.selfTicks.avg) - - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#define PROFILE_IS_SHARED_SELF_BELOW(name, floatfrom0to1) \ - ShinyManager_isZoneSelfTimeBelow( \ - &Shiny_instance, _PROFILE_ID_ZONE_SHARED(name), floatfrom0to1) - -#define PROFILE_IS_SHARED_TOTAL_BELOW(name, floatfrom0to1) \ - ShinyManager_isZoneTotalTimeBelow( \ - &Shiny_instance, _PROFILE_ID_ZONE_SHARED(name), floatfrom0to1) - - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#define PROFILE_END() \ - ShinyManager_endCurNode(&Shiny_instance) - - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#define PROFILE_BEGIN( name ) \ - \ - static _PROFILE_ZONE_DEFINE(_PROFILE_ID_ZONE(name), #name); \ - _PROFILE_ZONE_BEGIN(_PROFILE_ID_ZONE(name)) - - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#ifdef __cplusplus -#define PROFILE_BLOCK( name ) \ - \ - _PROFILE_BLOCK_DEFINE(_PROFILE_ID_BLOCK()); \ - PROFILE_BEGIN(name) -#endif /* __cplusplus */ - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#ifdef __cplusplus -#define PROFILE_FUNC() \ - \ - _PROFILE_BLOCK_DEFINE(_PROFILE_ID_BLOCK()); \ - static _PROFILE_ZONE_DEFINE(_PROFILE_ID_ZONE_FUNC(), __FUNCTION__); \ - _PROFILE_ZONE_BEGIN(_PROFILE_ID_ZONE_FUNC()) -#endif /* __cplusplus */ - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#define PROFILE_CODE( code ) \ - \ - do { \ - static _PROFILE_ZONE_DEFINE(_PROFILE_ID_ZONE_CODE(), #code); \ - _PROFILE_ZONE_BEGIN(_PROFILE_ID_ZONE_CODE()); \ - { code; } \ - PROFILE_END(); \ - } while(0) - - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#define PROFILE_SHARED_EXTERN( name ) \ - \ - _PROFILE_ZONE_DECLARE(extern, _PROFILE_ID_ZONE_SHARED(name)) - - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#define PROFILE_SHARED_DEFINE( name ) \ - \ - _PROFILE_ZONE_DEFINE(_PROFILE_ID_ZONE_SHARED(name), #name) - - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#define PROFILE_SHARED_BEGIN( name ) \ - \ - _PROFILE_ZONE_BEGIN(_PROFILE_ID_ZONE_SHARED(name)) - - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#ifdef __cplusplus -#define PROFILE_SHARED_BLOCK( name ) \ - \ - _PROFILE_BLOCK_DEFINE(_PROFILE_ID_BLOCK()); \ - _PROFILE_ZONE_BEGIN(_PROFILE_ID_ZONE_SHARED(name)) -#endif /* __cplusplus */ - - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#ifdef SHINY_HAS_ENABLED -#define PROFILE_SET_ENABLED( boolean ) \ - Shiny_instance.enabled = boolean -#endif - - -/*---------------------------------------------------------------------------*/ -/* internal preprocessors */ - -#define _PROFILE_ID_ZONE( name ) __ShinyZone_##name -#define _PROFILE_ID_ZONE_FUNC() __ShinyZoneFunc -#define _PROFILE_ID_ZONE_CODE() __ShinyZoneCode -#define _PROFILE_ID_ZONE_SHARED( name ) name##__ShinyZoneShared -#define _PROFILE_ID_BLOCK() __ShinyBlock - - -/*---------------------------------------------------------------------------*/ -/* internal preprocessor */ - -#define _PROFILE_ZONE_DEFINE( id, string ) \ - \ - ShinyZone id = { \ - NULL, SHINY_ZONE_STATE_HIDDEN, string, \ - { { 0, 0 }, { 0, 0 }, { 0, 0 } } \ - } - - -/*---------------------------------------------------------------------------*/ -/* internal preprocessor */ - -#define _PROFILE_ZONE_DECLARE( prefix, id ) \ - \ - prefix ShinyZone id - - -/*---------------------------------------------------------------------------*/ -/* internal preprocessor */ - -#define _PROFILE_BLOCK_DEFINE( id ) \ - \ - ShinyEndNodeOnDestruction SHINY_UNUSED id - - -/*---------------------------------------------------------------------------*/ -/* internal preprocessor */ - -#define _PROFILE_ZONE_BEGIN( id ) \ - \ - do { \ - static ShinyNodeCache cache = &_ShinyNode_dummy; \ - ShinyManager_lookupAndBeginNode(&Shiny_instance, &cache, &id); \ - } while(0) - -/*---------------------------------------------------------------------------*/ - -#else /* SLIC3R_PROFILE */ - -#define PROFILE_UPDATE() -#define PROFILE_SET_DAMPING(x) -#define PROFILE_GET_DAMPING() 0.0f -#define PROFILE_OUTPUT(x) -#define PROFILE_OUTPUT_STREAM(x) -#define PROFILE_CLEAR() -#define PROFILE_GET_TREE_STRING() std::string() -#define PROFILE_GET_FLAT_STRING() std::string() -#define PROFILE_DESTROY() -#define PROFILE_BEGIN(name) -#define PROFILE_BLOCK(name) -#define PROFILE_FUNC() -#define PROFILE_CODE(code) do { code; } while (0) -#define PROFILE_SHARED_GLOBAL(name) -#define PROFILE_SHARED_MEMBER(name) -#define PROFILE_SHARED_DEFINE(name) -#define PROFILE_SHARED_BEGIN(name) -#define PROFILE_SHARED_BLOCK(name) -#define PROFILE_SET_ENABLED(boolean) - -#endif /* SLIC3R_PROFILE */ - -#endif /* SHINY_MACROS_H */ diff --git a/src/Shiny/ShinyManager.c b/src/Shiny/ShinyManager.c deleted file mode 100644 index 6b281185136..00000000000 --- a/src/Shiny/ShinyManager.c +++ /dev/null @@ -1,445 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifdef SLIC3R_PROFILE - -#include "ShinyManager.h" - -#include -#include -#include -#include - -/*---------------------------------------------------------------------------*/ - -#define TABLE_SIZE_INIT 256 - -/*---------------------------------------------------------------------------*/ - -ShinyManager Shiny_instance = { -#if SHINY_HAS_ENABLED == TRUE - /* enabled = */ false, -#endif - /* _lastTick = */ 0, - /* _curNode = */ &Shiny_instance.rootNode, - /* _tableMask = */ 0, - /* _nodeTable = */ _ShinyManager_dummyNodeTable, -#if SHINY_LOOKUP_RATE == TRUE - /* _lookupCount = */ 0, - /* _lookupSuccessCount = */ 0, -#endif - /* _tableSize = */ 1, - /* nodeCount = */ 1, - /* zoneCount = */ 1, - /* _lastZone = */ &Shiny_instance.rootZone, - /* _lastNodePool = */ NULL, - /* _firstNodePool = */ NULL, - /* rootNode = */ { - /* _last = */ { 0, 0 }, - /* zone = */ &Shiny_instance.rootZone, - /* parent = */ &Shiny_instance.rootNode, - /* nextSibling = */ NULL, - /* firstChild = */ NULL, - /* lastChild = */ NULL, - /* childCount = */ 0, - /* entryLevel = */ 0, - /* _cache = */ NULL, - /* data = */ { { 0, 0 }, { 0, 0 }, { 0, 0 } } - }, - /* rootZone = */ { - /* next = */ NULL, - /* _state = */ SHINY_ZONE_STATE_HIDDEN, - /* name = */ "", - /* data = */ { { 0, 0 }, { 0, 0 }, { 0, 0 } } - }, - /* damping = */ 0.f, // Damping disabled, every PROFILE_UPDATE will be performed from scratch. Original value: 0.9f - /* _initialized = */ FALSE, - /* _firstUpdate = */ TRUE -}; - -ShinyNode* _ShinyManager_dummyNodeTable[] = { NULL }; - - -/*---------------------------------------------------------------------------*/ - -#if SHINY_COMPILER == SHINY_COMPILER_MSVC -# pragma warning (push) -# pragma warning (disable: 4311) -#endif - -/* primary hash function */ -SHINY_INLINE uint32_t hash_value(void* a_pParent, void* a_pZone) { - uint32_t a = (uint32_t) a_pParent + (uint32_t) a_pZone; -// uint32_t a = *reinterpret_cast(&a_pParent) + *reinterpret_cast(&a_pZone); - - a = (a+0x7ed55d16) + (a<<12); - a = (a^0xc761c23c) ^ (a>>19); - return a; -} - -/* - * secondary hash used as index offset: force it to be odd - * so it's relatively prime to the power-of-two table size - */ -SHINY_INLINE uint32_t hash_offset(uint32_t a) { - return ((a << 8) + (a >> 4)) | 1; -} - -#if SHINY_COMPILER == SHINY_COMPILER_MSVC -# pragma warning (pop) -#endif - - -/*---------------------------------------------------------------------------*/ - -void ShinyManager_preLoad(ShinyManager *self) { - if (!self->_initialized) { - _ShinyManager_init(self); - - _ShinyManager_createNodeTable(self, TABLE_SIZE_INIT); - _ShinyManager_createNodePool(self, TABLE_SIZE_INIT / 2); - } -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyManager_update(ShinyManager *self) { -#if SHINY_HAS_ENABLED == TRUE - if (!enabled) return; -#endif - - _ShinyManager_appendTicksToCurNode(self); - ShinyZone_preUpdateChain(&self->rootZone); - - if (self->_firstUpdate || self->damping == 0) { - self->_firstUpdate = FALSE; - ShinyNode_updateTreeClean(&self->rootNode); - ShinyZone_updateChainClean(&self->rootZone); - - } else { - ShinyNode_updateTree(&self->rootNode, self->damping); - ShinyZone_updateChain(&self->rootZone, self->damping); - } -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyManager_updateClean(ShinyManager *self) { -#if SHINY_HAS_ENABLED == TRUE - if (!enabled) return; -#endif - - _ShinyManager_appendTicksToCurNode(self); - ShinyZone_preUpdateChain(&self->rootZone); - - self->_firstUpdate = FALSE; - ShinyNode_updateTreeClean(&self->rootNode); - ShinyZone_updateChainClean(&self->rootZone); -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyManager_clear(ShinyManager *self) { - ShinyManager_destroy(self); - ShinyManager_preLoad(self); -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyManager_destroy(ShinyManager *self) { - ShinyManager_destroyNodes(self); - ShinyManager_resetZones(self); - _ShinyManager_uninit(self); -} - - -/*---------------------------------------------------------------------------*/ - -ShinyNode* _ShinyManager_lookupNode(ShinyManager *self, ShinyNodeCache *a_cache, ShinyZone *a_zone) { - uint32_t nHash = hash_value(self->_curNode, a_zone); - uint32_t nIndex = nHash & self->_tableMask; - ShinyNode* pNode = self->_nodeTable[nIndex]; - - _ShinyManager_incLookup(self); - _ShinyManager_incLookupSuccess(self); - - if (pNode) { - uint32_t nStep; - - if (ShinyNode_isEqual(pNode, self->_curNode, a_zone)) return pNode; /* found it! */ - - /* hash collision: */ - - /* compute a secondary hash function for stepping */ - nStep = hash_offset(nHash); - - for (;;) { - _ShinyManager_incLookup(self); - - nIndex = (nIndex + nStep) & self->_tableMask; - pNode = self->_nodeTable[nIndex]; - - if (!pNode) break; /* found empty slot */ - else if (ShinyNode_isEqual(pNode, self->_curNode, a_zone)) return pNode; /* found it! */ - } - - /* loop is guaranteed to end because the hash table is never full */ - } - - if (a_zone->_state == SHINY_ZONE_STATE_HIDDEN) { /* zone is not initialized */ - ShinyZone_init(a_zone, self->_lastZone); - - self->_lastZone = a_zone; - self->zoneCount++; - - if (self->_initialized == FALSE) { /* first time init */ - _ShinyManager_init(self); - - _ShinyManager_createNodeTable(self, TABLE_SIZE_INIT); - _ShinyManager_createNodePool(self, TABLE_SIZE_INIT / 2); - - /* initialization has invalidated nIndex - * we must compute nIndex again - */ - return _ShinyManager_createNode(self, a_cache, a_zone); - } - } - - /* Althouth nodeCount is not updated - * it includes rootNode so it adds up. - * - * check if we need to grow the table - * we keep it at most 1/2 full to be very fast - */ - if (self->_tableSize < 2 * self->nodeCount) { - - _ShinyManager_resizeNodeTable(self, 2 * self->_tableSize); - _ShinyManager_resizeNodePool(self, self->nodeCount - 1); - - /* resize has invalidated nIndex - * we must compute nIndex again - */ - return _ShinyManager_createNode(self, a_cache, a_zone); - } - - self->nodeCount++; - - { - ShinyNode* pNewNode = ShinyNodePool_newItem(self->_lastNodePool); - ShinyNode_init(pNewNode, self->_curNode, a_zone, a_cache); - - self->_nodeTable[nIndex] = pNewNode; - return pNewNode; - } -} - - -/*---------------------------------------------------------------------------*/ - -void _ShinyManager_insertNode(ShinyManager *self, ShinyNode* a_pNode) { - uint32_t nHash = hash_value(a_pNode->parent, a_pNode->zone); - uint32_t nIndex = nHash & self->_tableMask; - - if (self->_nodeTable[nIndex]) { - uint32_t nStep = hash_offset(nHash); - - while (self->_nodeTable[nIndex]) - nIndex = (nIndex + nStep) & self->_tableMask; - } - - self->_nodeTable[nIndex] = a_pNode; -} - - -/*---------------------------------------------------------------------------*/ - -ShinyNode* _ShinyManager_createNode(ShinyManager *self, ShinyNodeCache* a_cache, ShinyZone* a_pZone) { - ShinyNode* pNewNode = ShinyNodePool_newItem(self->_lastNodePool); - ShinyNode_init(pNewNode, self->_curNode, a_pZone, a_cache); - - self->nodeCount++; - _ShinyManager_insertNode(self, pNewNode); - return pNewNode; -} - - -/*---------------------------------------------------------------------------*/ - -void _ShinyManager_createNodePool(ShinyManager *self, uint32_t a_nCount) { - self->_firstNodePool = ShinyNodePool_create(a_nCount); - self->_lastNodePool = self->_firstNodePool; -} - - -/*---------------------------------------------------------------------------*/ - -void _ShinyManager_resizeNodePool(ShinyManager *self, uint32_t a_nCount) { - ShinyNodePool* pPool = ShinyNodePool_create(a_nCount); - self->_lastNodePool->nextPool = pPool; - self->_lastNodePool = pPool; -} - - -/*---------------------------------------------------------------------------*/ - -void _ShinyManager_createNodeTable(ShinyManager *self, uint32_t a_nCount) { - self->_tableSize = a_nCount; - self->_tableMask = a_nCount - 1; - - self->_nodeTable = (ShinyNodeTable*) - malloc(sizeof(ShinyNode) * a_nCount); - - memset(self->_nodeTable, 0, a_nCount * sizeof(ShinyNode*)); -} - - -/*---------------------------------------------------------------------------*/ - -void _ShinyManager_resizeNodeTable(ShinyManager *self, uint32_t a_nCount) { - ShinyNodePool* pPool; - - free(self->_nodeTable); - _ShinyManager_createNodeTable(self, a_nCount); - - pPool = self->_firstNodePool; - while (pPool) { - - ShinyNode *pIter = ShinyNodePool_firstItem(pPool); - - while (pIter != pPool->_nextItem) - _ShinyManager_insertNode(self, pIter++); - - pPool = pPool->nextPool; - } -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyManager_resetZones(ShinyManager *self) { - ShinyZone_resetChain(&self->rootZone); - self->_lastZone = &self->rootZone; - self->zoneCount = 1; -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyManager_destroyNodes(ShinyManager *self) { - if (self->_firstNodePool) { - ShinyNodePool_destroy(self->_firstNodePool); - self->_firstNodePool = NULL; - } - - if (self->_nodeTable != _ShinyManager_dummyNodeTable) { - free(self->_nodeTable); - - self->_nodeTable = _ShinyManager_dummyNodeTable; - self->_tableSize = 1; - self->_tableMask = 0; - } - - self->_curNode = &self->rootNode; - self->nodeCount = 1; - - _ShinyManager_init(self); -} - - -/*---------------------------------------------------------------------------*/ - -const char* ShinyManager_getOutputErrorString(ShinyManager *self) { - if (self->_firstUpdate) return "!!! Profile data must first be updated !!!"; - else if (!self->_initialized) return "!!! No profiles where executed !!!"; - else return NULL; -} - - -/*---------------------------------------------------------------------------*/ - -#if SHINY_COMPILER == SHINY_COMPILER_MSVC -# pragma warning (push) -# pragma warning (disable: 4996) -#endif - -int ShinyManager_output(ShinyManager *self, const char *a_filename) { - if (!a_filename) { - ShinyManager_outputToStream(self, stdout); - - } else { - FILE *file = fopen(a_filename, "w"); - if (!file) return FALSE; - ShinyManager_outputToStream(self, file); - fclose(file); - } - - return TRUE; -} - -#if SHINY_COMPILER == SHINY_COMPILER_MSVC -# pragma warning (pop) -#endif - - -/*---------------------------------------------------------------------------*/ - -void ShinyManager_outputToStream(ShinyManager *self, FILE *a_stream) { - const char *error = ShinyManager_getOutputErrorString(self); - - if (error) { - fwrite(error, 1, strlen(error), a_stream); - fwrite("\n\n", 1, 2, a_stream); - return; - } - -#if SHINY_OUTPUT_MODE & SHINY_OUTPUT_MODE_FLAT - ShinyManager_sortZones(self); - - { - int size = ShinyPrintZonesSize(self->zoneCount); - char *buffer = (char*) malloc(size); - ShinyPrintZones(buffer, &self->rootZone); - fwrite(buffer, 1, size - 1, a_stream); - fwrite("\n\n", 1, 2, a_stream); - free(buffer); - } -#endif - -#if SHINY_OUTPUT_MODE & SHINY_OUTPUT_MODE_TREE - { - int size = ShinyPrintNodesSize(self->nodeCount); - char *buffer = (char*) malloc(size); - ShinyPrintNodes(buffer, &self->rootNode); - fwrite(buffer, 1, size - 1, a_stream); - fwrite("\n\n", 1, 2, a_stream); - free(buffer); - } -#endif -} - -#endif /* SLIC3R_PROFILE */ diff --git a/src/Shiny/ShinyManager.h b/src/Shiny/ShinyManager.h deleted file mode 100644 index 403e0e8782c..00000000000 --- a/src/Shiny/ShinyManager.h +++ /dev/null @@ -1,263 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifndef SHINY_MANAGER_H -#define SHINY_MANAGER_H - -#include "ShinyZone.h" -#include "ShinyNode.h" -#include "ShinyNodePool.h" -#include "ShinyTools.h" -#include "ShinyOutput.h" - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/*---------------------------------------------------------------------------*/ - -typedef struct { -#ifdef SHINY_HAS_ENABLED - bool enabled; -#endif - - shinytick_t _lastTick; - - ShinyNode* _curNode; - - uint32_t _tableMask; /* = _tableSize - 1 */ - - ShinyNodeTable* _nodeTable; - -#ifdef SHINY_LOOKUP_RATE - uint64_t _lookupCount; - uint64_t _lookupSuccessCount; -#endif - - uint32_t _tableSize; - - uint32_t nodeCount; - uint32_t zoneCount; - - ShinyZone* _lastZone; - - ShinyNodePool* _lastNodePool; - ShinyNodePool* _firstNodePool; - - ShinyNode rootNode; - ShinyZone rootZone; - - float damping; - - int _initialized; - int _firstUpdate; -} ShinyManager; - - -/*---------------------------------------------------------------------------*/ - -extern ShinyNode* _ShinyManager_dummyNodeTable[]; - -extern ShinyManager Shiny_instance; - - -/*---------------------------------------------------------------------------*/ - -SHINY_INLINE void _ShinyManager_appendTicksToCurNode(ShinyManager *self) { - shinytick_t curTick; - ShinyGetTicks(&curTick); - - ShinyNode_appendTicks(self->_curNode, curTick - self->_lastTick); - self->_lastTick = curTick; -} - -SHINY_API ShinyNode* _ShinyManager_lookupNode(ShinyManager *self, ShinyNodeCache* a_cache, ShinyZone* a_zone); - -SHINY_API void _ShinyManager_createNodeTable(ShinyManager *self, uint32_t a_count); -SHINY_API void _ShinyManager_resizeNodeTable(ShinyManager *self, uint32_t a_count); - -SHINY_API void _ShinyManager_createNodePool(ShinyManager *self, uint32_t a_count); -SHINY_API void _ShinyManager_resizeNodePool(ShinyManager *self, uint32_t a_count); - -SHINY_API ShinyNode* _ShinyManager_createNode(ShinyManager *self, ShinyNodeCache* a_cache, ShinyZone* a_pZone); -SHINY_API void _ShinyManager_insertNode(ShinyManager *self, ShinyNode* a_pNode); - -SHINY_INLINE void _ShinyManager_init(ShinyManager *self) { - self->_initialized = TRUE; - - self->rootNode._last.entryCount = 1; - self->rootNode._last.selfTicks = 0; - ShinyGetTicks(&self->_lastTick); -} - -SHINY_INLINE void _ShinyManager_uninit(ShinyManager *self) { - self->_initialized = FALSE; - - ShinyNode_clear(&self->rootNode); - self->rootNode.parent = &self->rootNode; - self->rootNode.zone = &self->rootZone; -} - -#ifdef SHINY_LOOKUP_RATE -SHINY_INLINE void _ShinyManager_incLookup(ShinyManager *self) { self->_lookupCount++; } -SHINY_INLINE void _ShinyManager_incLookupSuccess(ShinyManager *self) { self->_lookupSuccessCount++; } -SHINY_INLINE float ShinyManager_lookupRate(const ShinyManager *self) { return ((float) self->_lookupSuccessCount) / ((float) self->_lookupCount); } - -#else -SHINY_INLINE void _ShinyManager_incLookup(ShinyManager * self) { self = self; } -SHINY_INLINE void _ShinyManager_incLookupSuccess(ShinyManager * self) { self = self; } -SHINY_INLINE float ShinyManager_lookupRate(const ShinyManager * self) { self = self; return -1; } -#endif - -SHINY_API void ShinyManager_resetZones(ShinyManager *self); -SHINY_API void ShinyManager_destroyNodes(ShinyManager *self); - -SHINY_INLINE float ShinyManager_tableUsage(const ShinyManager *self) { - return ((float) self->nodeCount) / ((float) self->_tableSize); -} - -SHINY_INLINE uint32_t ShinyManager_allocMemInBytes(const ShinyManager *self) { - return self->_tableSize * sizeof(ShinyNode*) - + (self->_firstNodePool)? ShinyNodePool_memoryUsageChain(self->_firstNodePool) : 0; -} - -SHINY_INLINE void ShinyManager_beginNode(ShinyManager *self, ShinyNode* a_node) { - ShinyNode_beginEntry(a_node); - - _ShinyManager_appendTicksToCurNode(self); - self->_curNode = a_node; -} - -SHINY_INLINE void ShinyManager_lookupAndBeginNode(ShinyManager *self, ShinyNodeCache* a_cache, ShinyZone* a_zone) { -#ifdef SHINY_HAS_ENABLED - if (!self->enabled) return; -#endif - - if (self->_curNode != (*a_cache)->parent) - *a_cache = _ShinyManager_lookupNode(self, a_cache, a_zone); - - ShinyManager_beginNode(self, *a_cache); -} - -SHINY_INLINE void ShinyManager_endCurNode(ShinyManager *self) { -#ifdef SHINY_HAS_ENABLED - if (!self->enabled) return; -#endif - - _ShinyManager_appendTicksToCurNode(self); - self->_curNode = self->_curNode->parent; -} - -/**/ - -SHINY_API void ShinyManager_preLoad(ShinyManager *self); - -SHINY_API void ShinyManager_updateClean(ShinyManager *self); -SHINY_API void ShinyManager_update(ShinyManager *self); - -SHINY_API void ShinyManager_clear(ShinyManager *self); -SHINY_API void ShinyManager_destroy(ShinyManager *self); - -SHINY_INLINE void ShinyManager_sortZones(ShinyManager *self) { - if (self->rootZone.next) - self->_lastZone = ShinyZone_sortChain(&self->rootZone.next); -} - -SHINY_API const char* ShinyManager_getOutputErrorString(ShinyManager *self); - -SHINY_API int ShinyManager_output(ShinyManager *self, const char *a_filename); -SHINY_API void ShinyManager_outputToStream(ShinyManager *self, FILE *stream); - -#if __cplusplus -} /* end of extern "C" */ - -SHINY_INLINE std::string ShinyManager_outputTreeToString(ShinyManager *self) { - const char* error = ShinyManager_getOutputErrorString(self); - if (error) return error; - else return ShinyNodesToString(&self->rootNode, self->nodeCount); -} - -SHINY_INLINE std::string ShinyManager_outputFlatToString(ShinyManager *self) { - const char* error = ShinyManager_getOutputErrorString(self); - if (error) return error; - - ShinyManager_sortZones(self); - return ShinyZonesToString(&self->rootZone, self->zoneCount); -} - -extern "C" { /* end of c++ */ -#endif - -SHINY_INLINE int ShinyManager_isZoneSelfTimeBelow(ShinyManager *self, ShinyZone* a_zone, float a_percentage) { - return a_percentage * (float) self->rootZone.data.childTicks.cur - <= (float) a_zone->data.selfTicks.cur; -} - -SHINY_INLINE int ShinyManager_isZoneTotalTimeBelow(ShinyManager *self, ShinyZone* a_zone, float a_percentage) { - return a_percentage * (float) self->rootZone.data.childTicks.cur - <= (float) ShinyData_totalTicksCur(&a_zone->data); -} - -/**/ - -SHINY_INLINE void ShinyManager_enumerateNodes(ShinyManager *self, void (*a_func)(const ShinyNode*)) { - ShinyNode_enumerateNodes(&self->rootNode, a_func); -} - -SHINY_INLINE void ShinyManager_enumerateZones(ShinyManager *self, void (*a_func)(const ShinyZone*)) { - ShinyZone_enumerateZones(&self->rootZone, a_func); -} - -#if __cplusplus -} /* end of extern "C" */ - -template void ShinyManager_enumerateNodes(ShinyManager *self, T* a_this, void (T::*a_func)(const ShinyNode*)) { - ShinyNode_enumerateNodes(&self->rootNode, a_this, a_func); -} - -template void ShinyManager_enumerateZones(ShinyManager *self, T* a_this, void (T::*a_func)(const ShinyZone*)) { - ShinyZone_enumerateZones(&self->rootZone, a_this, a_func); -} - -extern "C" { /* end of c++ */ -#endif - - -/*---------------------------------------------------------------------------*/ - -#if __cplusplus -} /* end of extern "C" */ - -class ShinyEndNodeOnDestruction { -public: - - SHINY_INLINE ~ShinyEndNodeOnDestruction() { - ShinyManager_endCurNode(&Shiny_instance); - } -}; -#endif - -#endif /* SHINY_MANAGER_H */ diff --git a/src/Shiny/ShinyNode.c b/src/Shiny/ShinyNode.c deleted file mode 100644 index 9d777073b02..00000000000 --- a/src/Shiny/ShinyNode.c +++ /dev/null @@ -1,129 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifdef SLIC3R_PROFILE - -#include "ShinyNode.h" -#include "ShinyZone.h" -#include "ShinyNodeState.h" - -#include - -/*---------------------------------------------------------------------------*/ - -ShinyNode _ShinyNode_dummy = { - /* _last = */ { 0, 0 }, - /* zone = */ NULL, - /* parent = */ NULL, - /* nextSibling = */ NULL, - /* firstChild = */ NULL, - /* lastChild = */ NULL -}; - - -/*---------------------------------------------------------------------------*/ - -void ShinyNode_updateTree(ShinyNode* first, float a_damping) { - ShinyNodeState *top = NULL; - ShinyNode *node = first; - - for (;;) { - do { - top = ShinyNodeState_push(top, node); - node = node->firstChild; - } while (node); - - for (;;) { - node = ShinyNodeState_finishAndGetNext(top, a_damping); - top = ShinyNodeState_pop(top); - - if (node) break; - else if (!top) return; - } - } -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyNode_updateTreeClean(ShinyNode* first) { - ShinyNodeState *top = NULL; - ShinyNode *node = first; - - for (;;) { - do { - top = ShinyNodeState_push(top, node); - node = node->firstChild; - } while (node); - - for (;;) { - node = ShinyNodeState_finishAndGetNextClean(top); - top = ShinyNodeState_pop(top); - - if (node) break; - else if (!top) return; - } - } -} - - -/*---------------------------------------------------------------------------*/ - -const ShinyNode* ShinyNode_findNextInTree(const ShinyNode* self) { - if (self->firstChild) { - return self->firstChild; - - } else if (self->nextSibling) { - return self->nextSibling; - - } else { - ShinyNode* pParent = self->parent; - - while (!ShinyNode_isRoot(pParent)) { - if (pParent->nextSibling) return pParent->nextSibling; - else pParent = pParent->parent; - } - - return NULL; - } -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyNode_clear(ShinyNode* self) { - memset(self, 0, sizeof(ShinyNode)); -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyNode_enumerateNodes(const ShinyNode* a_node, void (*a_func)(const ShinyNode*)) { - a_func(a_node); - - if (a_node->firstChild) ShinyNode_enumerateNodes(a_node->firstChild, a_func); - if (a_node->nextSibling) ShinyNode_enumerateNodes(a_node->nextSibling, a_func); -} - -#endif /* SLIC3R_PROFILE */ diff --git a/src/Shiny/ShinyNode.h b/src/Shiny/ShinyNode.h deleted file mode 100644 index ee5fdb0de5a..00000000000 --- a/src/Shiny/ShinyNode.h +++ /dev/null @@ -1,133 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifndef SHINY_NODE_H -#define SHINY_NODE_H - -#include "ShinyData.h" -#include "ShinyTools.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*---------------------------------------------------------------------------*/ - -typedef struct _ShinyNode { - - ShinyLastData _last; - - struct _ShinyZone* zone; - struct _ShinyNode* parent; - struct _ShinyNode* nextSibling; - - struct _ShinyNode* firstChild; - struct _ShinyNode* lastChild; - - uint32_t childCount; - uint32_t entryLevel; - - ShinyNodeCache* _cache; - - ShinyData data; - -} ShinyNode; - - -/*---------------------------------------------------------------------------*/ - -extern ShinyNode _ShinyNode_dummy; - - -/*---------------------------------------------------------------------------*/ - -SHINY_INLINE void ShinyNode_addChild(ShinyNode* self, ShinyNode* a_child) { - if (self->childCount++) { - self->lastChild->nextSibling = a_child; - self->lastChild = a_child; - - } else { - self->lastChild = a_child; - self->firstChild = a_child; - } -} - -SHINY_INLINE void ShinyNode_init(ShinyNode* self, ShinyNode* a_parent, struct _ShinyZone* a_zone, ShinyNodeCache* a_cache) { - /* NOTE: all member variables are assumed to be zero when allocated */ - - self->zone = a_zone; - self->parent = a_parent; - - self->entryLevel = a_parent->entryLevel + 1; - ShinyNode_addChild(a_parent, self); - - self->_cache = a_cache; -} - -SHINY_API void ShinyNode_updateTree(ShinyNode* self, float a_damping); -SHINY_API void ShinyNode_updateTreeClean(ShinyNode* self); - -SHINY_INLINE void ShinyNode_destroy(ShinyNode* self) { - *(self->_cache) = &_ShinyNode_dummy; -} - -SHINY_INLINE void ShinyNode_appendTicks(ShinyNode* self, shinytick_t a_elapsedTicks) { - self->_last.selfTicks += a_elapsedTicks; -} - -SHINY_INLINE void ShinyNode_beginEntry(ShinyNode* self) { - self->_last.entryCount++; -} - -SHINY_INLINE int ShinyNode_isRoot(ShinyNode* self) { - return (self->entryLevel == 0); -} - -SHINY_INLINE int ShinyNode_isDummy(ShinyNode* self) { - return (self == &_ShinyNode_dummy); -} - -SHINY_INLINE int ShinyNode_isEqual(ShinyNode* self, const ShinyNode* a_parent, const struct _ShinyZone* a_zone) { - return (self->parent == a_parent && self->zone == a_zone); -} - -SHINY_API const ShinyNode* ShinyNode_findNextInTree(const ShinyNode* self); - -SHINY_API void ShinyNode_clear(ShinyNode* self); - -SHINY_API void ShinyNode_enumerateNodes(const ShinyNode* a_node, void (*a_func)(const ShinyNode*)); - -#if __cplusplus -} /* end of extern "C" */ - -template -void ShinyNode_enumerateNodes(const ShinyNode* a_node, T* a_this, void (T::*a_func)(const ShinyNode*)) { - (a_this->*a_func)(a_node); - - if (a_node->firstChild) ShinyNode_enumerateNodes(a_node->firstChild, a_this, a_func); - if (a_node->nextSibling) ShinyNode_enumerateNodes(a_node->nextSibling, a_this, a_func); -} -#endif /* __cplusplus */ - -#endif /* SHINY_NODE_H */ diff --git a/src/Shiny/ShinyNodePool.c b/src/Shiny/ShinyNodePool.c deleted file mode 100644 index f00293252cb..00000000000 --- a/src/Shiny/ShinyNodePool.c +++ /dev/null @@ -1,77 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifdef SLIC3R_PROFILE - -#include "ShinyNodePool.h" -#include "ShinyTools.h" - -#include -#include - -/*---------------------------------------------------------------------------*/ - -ShinyNodePool* ShinyNodePool_create(uint32_t a_items) { - ShinyNodePool* pPool = (ShinyNodePool*) - malloc(sizeof(ShinyNodePool) + sizeof(ShinyNode) * (a_items - 1)); - - pPool->nextPool = NULL; - pPool->_nextItem = &pPool->_items[0]; - pPool->endOfItems = &pPool->_items[a_items]; - - memset(&pPool->_items[0], 0, a_items * sizeof(ShinyNode)); - return pPool; -} - - -/*---------------------------------------------------------------------------*/ - -uint32_t ShinyNodePool_memoryUsageChain(ShinyNodePool *first) { - uint32_t bytes = (uint32_t) ((char*) first->endOfItems - (char*) first); - ShinyNodePool *pool = first->nextPool; - - while (pool) { - bytes += (uint32_t) ((char*) pool->endOfItems - (char*) pool); - pool = pool->nextPool; - } - - return bytes; -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyNodePool_destroy(ShinyNodePool *self) { - ShinyNode* firstNode = ShinyNodePool_firstItem(self); - ShinyNode* lastNode = self->_nextItem; - - while (firstNode != lastNode) - ShinyNode_destroy(firstNode++); - - /* TODO: make this into a loop or a tail recursion */ - if (self->nextPool) ShinyNodePool_destroy(self->nextPool); - free(self); -} - -#endif /* SLIC3R_PROFILE */ diff --git a/src/Shiny/ShinyNodePool.h b/src/Shiny/ShinyNodePool.h deleted file mode 100644 index 5e30a3306bb..00000000000 --- a/src/Shiny/ShinyNodePool.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifndef SHINY_NODE_POOL_H -#define SHINY_NODE_POOL_H - -#include "ShinyNode.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*---------------------------------------------------------------------------*/ - -typedef struct _ShinyNodePool { - - struct _ShinyNodePool* nextPool; - - ShinyNode *_nextItem; - ShinyNode *endOfItems; - - ShinyNode _items[1]; - -} ShinyNodePool; - - -/*---------------------------------------------------------------------------*/ - -SHINY_INLINE ShinyNode* ShinyNodePool_firstItem(ShinyNodePool *self) { - return &(self->_items[0]); -} - -SHINY_INLINE ShinyNode* ShinyNodePool_newItem(ShinyNodePool *self) { - return self->_nextItem++; -} - -ShinyNodePool* ShinyNodePool_create(uint32_t a_items); -void ShinyNodePool_destroy(ShinyNodePool *self); - -uint32_t ShinyNodePool_memoryUsageChain(ShinyNodePool *first); - -#if __cplusplus -} /* end of extern "C" */ -#endif - -#endif /* SHINY_NODE_POOL_H */ diff --git a/src/Shiny/ShinyNodeState.c b/src/Shiny/ShinyNodeState.c deleted file mode 100644 index fbf6dc8704e..00000000000 --- a/src/Shiny/ShinyNodeState.c +++ /dev/null @@ -1,108 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifdef SLIC3R_PROFILE - -#include "ShinyNodeState.h" -#include "ShinyNode.h" -#include "ShinyZone.h" - -#include - -/*---------------------------------------------------------------------------*/ - -ShinyNodeState* ShinyNodeState_push(ShinyNodeState *a_top, ShinyNode *a_node) { - ShinyZone *zone = a_node->zone; - ShinyNodeState *self = (ShinyNodeState*) malloc(sizeof(ShinyNodeState)); - self->node = a_node; - self->_prev = a_top; - - a_node->data.selfTicks.cur = a_node->_last.selfTicks; - a_node->data.entryCount.cur = a_node->_last.entryCount; - - zone->data.selfTicks.cur += a_node->_last.selfTicks; - zone->data.entryCount.cur += a_node->_last.entryCount; - - a_node->data.childTicks.cur = 0; - a_node->_last.selfTicks = 0; - a_node->_last.entryCount = 0; - - self->zoneUpdating = zone->_state != SHINY_ZONE_STATE_UPDATING; - if (self->zoneUpdating) { - zone->_state = SHINY_ZONE_STATE_UPDATING; - } else { - zone->data.childTicks.cur -= a_node->data.selfTicks.cur; - } - - return self; -} - -/*---------------------------------------------------------------------------*/ - -ShinyNodeState* ShinyNodeState_pop(ShinyNodeState *a_top) { - ShinyNodeState *prev = a_top->_prev; - free(a_top); - return prev; -} - -/*---------------------------------------------------------------------------*/ - -ShinyNode* ShinyNodeState_finishAndGetNext(ShinyNodeState *self, float a_damping) { - ShinyNode *node = self->node; - ShinyZone *zone = node->zone; - - if (self->zoneUpdating) { - zone->data.childTicks.cur += node->data.childTicks.cur; - zone->_state = SHINY_ZONE_STATE_INITIALIZED; - } - - ShinyData_computeAverage(&node->data, a_damping); - - if (!ShinyNode_isRoot(node)) - node->parent->data.childTicks.cur += node->data.selfTicks.cur + node->data.childTicks.cur; - - return node->nextSibling; -} - - -/*---------------------------------------------------------------------------*/ - -ShinyNode* ShinyNodeState_finishAndGetNextClean(ShinyNodeState *self) { - ShinyNode *node = self->node; - ShinyZone *zone = node->zone; - - if (self->zoneUpdating) { - zone->data.childTicks.cur += node->data.childTicks.cur; - zone->_state = SHINY_ZONE_STATE_INITIALIZED; - } - - ShinyData_copyAverage(&node->data); - - if (!ShinyNode_isRoot(node)) - node->parent->data.childTicks.cur += node->data.selfTicks.cur + node->data.childTicks.cur; - - return node->nextSibling; -} - -#endif /* SLIC3R_PROFILE */ diff --git a/src/Shiny/ShinyNodeState.h b/src/Shiny/ShinyNodeState.h deleted file mode 100644 index 62fdd4ba86e..00000000000 --- a/src/Shiny/ShinyNodeState.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifndef SHINY_NODE_STATE_H -#define SHINY_NODE_STATE_H - -#include "ShinyNode.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*---------------------------------------------------------------------------*/ - -typedef struct _ShinyNodeState { - ShinyNode *node; - int zoneUpdating; - - struct _ShinyNodeState *_prev; -} ShinyNodeState; - - -/*---------------------------------------------------------------------------*/ - -ShinyNodeState* ShinyNodeState_push(ShinyNodeState *a_top, ShinyNode *a_node); -ShinyNodeState* ShinyNodeState_pop(ShinyNodeState *a_top); - -ShinyNode* ShinyNodeState_finishAndGetNext(ShinyNodeState *self, float a_damping); -ShinyNode* ShinyNodeState_finishAndGetNextClean(ShinyNodeState *self); - -#if __cplusplus -} /* end of extern "C" */ -#endif - -#endif /* SHINY_NODE_STATE_H */ diff --git a/src/Shiny/ShinyOutput.c b/src/Shiny/ShinyOutput.c deleted file mode 100644 index c2c624d589b..00000000000 --- a/src/Shiny/ShinyOutput.c +++ /dev/null @@ -1,189 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifdef SLIC3R_PROFILE - -#include "ShinyOutput.h" - -#include - -#if SHINY_COMPILER == SHINY_COMPILER_MSVC -# pragma warning(disable: 4996) -# define snprintf _snprintf -# define TRAILING 0 - -#else -# define TRAILING 1 -#endif - -/*---------------------------------------------------------------------------*/ - -#define OUTPUT_WIDTH_CALL 6 -#define OUTPUT_WIDTH_TIME (6+3) -#define OUTPUT_WIDTH_PERC (4+3) -#define OUTPUT_WIDTH_SUM 120 - -#define OUTPUT_WIDTH_DATA (1+OUTPUT_WIDTH_CALL + 1 + 2*(OUTPUT_WIDTH_TIME+4+OUTPUT_WIDTH_PERC+1) + 1) -#define OUTPUT_WIDTH_NAME (OUTPUT_WIDTH_SUM - OUTPUT_WIDTH_DATA) - - -/*---------------------------------------------------------------------------*/ - -SHINY_INLINE char* printHeader(char *output, const char *a_title) { - snprintf(output, OUTPUT_WIDTH_SUM + TRAILING, - "%-*s %*s %*s %*s", - OUTPUT_WIDTH_NAME, a_title, - OUTPUT_WIDTH_CALL, "calls", - OUTPUT_WIDTH_TIME+4+OUTPUT_WIDTH_PERC+1, "self time", - OUTPUT_WIDTH_TIME+4+OUTPUT_WIDTH_PERC+1, "total time"); - - return output + OUTPUT_WIDTH_SUM; -} - - -/*---------------------------------------------------------------------------*/ - -SHINY_INLINE char* printData(char *output, const ShinyData *a_data, float a_topercent) { - float totalTicksAvg = ShinyData_totalTicksAvg(a_data); - const ShinyTimeUnit *selfUnit = ShinyGetTimeUnit(a_data->selfTicks.avg); - const ShinyTimeUnit *totalUnit = ShinyGetTimeUnit(totalTicksAvg); - - snprintf(output, OUTPUT_WIDTH_DATA + TRAILING, - " %*.1f %*.2f %-2s %*.2f%% %*.2f %-2s %*.2f%%", - OUTPUT_WIDTH_CALL, a_data->entryCount.avg, - OUTPUT_WIDTH_TIME, a_data->selfTicks.avg * selfUnit->invTickFreq, selfUnit->suffix, - OUTPUT_WIDTH_PERC, a_data->selfTicks.avg * a_topercent, - OUTPUT_WIDTH_TIME, totalTicksAvg * totalUnit->invTickFreq, totalUnit->suffix, - OUTPUT_WIDTH_PERC, totalTicksAvg * a_topercent); - - return output + OUTPUT_WIDTH_DATA; -} - - -/*---------------------------------------------------------------------------*/ - -SHINY_INLINE char* printNode(char* output, const ShinyNode *a_node, float a_topercent) { - int offset = a_node->entryLevel * 2; - - snprintf(output, OUTPUT_WIDTH_NAME + TRAILING, "%*s%-*s", - offset, "", OUTPUT_WIDTH_NAME - offset, a_node->zone->name); - - output += OUTPUT_WIDTH_NAME; - - output = printData(output, &a_node->data, a_topercent); - return output; -} - - -/*---------------------------------------------------------------------------*/ - -SHINY_INLINE char* printZone(char* output, const ShinyZone *a_zone, float a_topercent) { - snprintf(output, OUTPUT_WIDTH_NAME + TRAILING, "%-*s", - OUTPUT_WIDTH_NAME, a_zone->name); - - output += OUTPUT_WIDTH_NAME; - - output = printData(output, &a_zone->data, a_topercent); - return output; -} - - -/*---------------------------------------------------------------------------*/ - -int ShinyPrintNodesSize(uint32_t a_count) { - return (1 + a_count) * (OUTPUT_WIDTH_SUM + 1); -} - - -/*---------------------------------------------------------------------------*/ - -int ShinyPrintZonesSize(uint32_t a_count) { - return (1 + a_count) * (OUTPUT_WIDTH_SUM + 1); -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyPrintANode(char* output, const ShinyNode *a_node, const ShinyNode *a_root) { - float fTicksToPc = 100.0f / a_root->data.childTicks.avg; - output = printNode(output, a_node, fTicksToPc); - (*output++) = '\0'; -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyPrintAZone(char* output, const ShinyZone *a_zone, const ShinyZone *a_root) { - float fTicksToPc = 100.0f / a_root->data.childTicks.avg; - output = printZone(output, a_zone, fTicksToPc); - (*output++) = '\0'; -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyPrintNodes(char* output, const ShinyNode *a_root) { - float fTicksToPc = 100.0f / a_root->data.childTicks.avg; - const ShinyNode *node = a_root; - - output = printHeader(output, "call tree"); - (*output++) = '\n'; - - for (;;) { - output = printNode(output, node, fTicksToPc); - - node = ShinyNode_findNextInTree(node); - if (node) { - (*output++) = '\n'; - } else { - (*output++) = '\0'; - return; - } - } -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyPrintZones(char* output, const ShinyZone *a_root) { - float fTicksToPc = 100.0f / a_root->data.childTicks.avg; - const ShinyZone *zone = a_root; - - output = printHeader(output, "sorted list"); - (*output++) = '\n'; - - for (;;) { - output = printZone(output, zone, fTicksToPc); - - zone = zone->next; - if (zone) { - (*output++) = '\n'; - } else { - (*output++) = '\0'; - return; - } - } -} - -#endif /* SLIC3R_PROFILE */ diff --git a/src/Shiny/ShinyOutput.h b/src/Shiny/ShinyOutput.h deleted file mode 100644 index 81c1783dbe6..00000000000 --- a/src/Shiny/ShinyOutput.h +++ /dev/null @@ -1,68 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifndef SHINY_OUTPUT_H -#define SHINY_OUTPUT_H - -#include "ShinyNode.h" -#include "ShinyZone.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*---------------------------------------------------------------------------*/ - -SHINY_API int ShinyPrintNodesSize(uint32_t a_count); -SHINY_API int ShinyPrintZonesSize(uint32_t a_count); - -SHINY_API void ShinyPrintANode(char* output, const ShinyNode *a_node, const ShinyNode *a_root); -SHINY_API void ShinyPrintAZone(char* output, const ShinyZone *a_zone, const ShinyZone *a_root); - -SHINY_API void ShinyPrintNodes(char* output, const ShinyNode *a_root); -SHINY_API void ShinyPrintZones(char* output, const ShinyZone *a_root); - - -/*---------------------------------------------------------------------------*/ - -#if __cplusplus -} /* end of extern "C" */ -#include - -SHINY_INLINE std::string ShinyNodesToString(const ShinyNode *a_root, uint32_t a_count) { - std::string str; - str.resize(ShinyPrintNodesSize(a_count) - 1); - ShinyPrintNodes(&str[0], a_root); - return str; -} - -SHINY_INLINE std::string ShinyZonesToString(const ShinyZone *a_root, uint32_t a_count) { - std::string str; - str.resize(ShinyPrintZonesSize(a_count) - 1); - ShinyPrintZones(&str[0], a_root); - return str; -} -#endif /* __cplusplus */ - -#endif /* SHINY_OUTPUT_H */ diff --git a/src/Shiny/ShinyPrereqs.h b/src/Shiny/ShinyPrereqs.h deleted file mode 100644 index 5a3044dbce9..00000000000 --- a/src/Shiny/ShinyPrereqs.h +++ /dev/null @@ -1,138 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifndef SHINY_PREREQS_H -#define SHINY_PREREQS_H - - -#include - -/*---------------------------------------------------------------------------*/ - -#ifndef FALSE -#define FALSE 0x0 -#endif - -#ifndef TRUE -#define TRUE 0x1 -#endif - -#ifndef NULL -#define NULL 0 -#endif - -#include "ShinyConfig.h" -#include "ShinyVersion.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*---------------------------------------------------------------------------*/ - -#define SHINY_PLATFORM_WIN32 0x1 -#define SHINY_PLATFORM_POSIX 0x2 - -#if defined (_WIN32) -# define SHINY_PLATFORM SHINY_PLATFORM_WIN32 - -#else /* ASSUME: POSIX-compliant OS */ -# define SHINY_PLATFORM SHINY_PLATFORM_POSIX -#endif - - -/*---------------------------------------------------------------------------*/ - -#define SHINY_COMPILER_MSVC 0x1 -#define SHINY_COMPILER_GNUC 0x2 -#define SHINY_COMPILER_OTHER 0x3 - -#if defined (_MSC_VER) -# define SHINY_COMPILER SHINY_COMPILER_MSVC - -#elif defined (__GNUG__) -# define SHINY_COMPILER SHINY_COMPILER_GNUC - -#else -# define SHINY_COMPILER SHINY_COMPILER_OTHER -#endif - - -/*---------------------------------------------------------------------------*/ - -#if SHINY_COMPILER == SHINY_COMPILER_GNUC -#include -#include -#endif - - -/*---------------------------------------------------------------------------*/ - -struct _ShinyNode; -struct _ShinyZone; - -typedef struct _ShinyNode* ShinyNodeCache; -typedef struct _ShinyNode* ShinyNodeTable; - -/*---------------------------------------------------------------------------*/ - -#define SHINY_API - -/*---------------------------------------------------------------------------*/ - -#if SHINY_COMPILER == SHINY_COMPILER_MSVC -# define SHINY_INLINE __inline -# define SHINY_UNUSED -#elif SHINY_COMPILER == SHINY_COMPILER_GNUC -# define SHINY_INLINE inline -# define SHINY_UNUSED __attribute__((unused)) -#elif SHINY_COMPILER == SHINY_COMPILER_OTHER -# define SHINY_INLINE inline -# define SHINY_UNUSED -#endif - - -/*---------------------------------------------------------------------------*/ - -#if SHINY_COMPILER == SHINY_COMPILER_MSVC - typedef int int32_t; - typedef unsigned int uint32_t; - - typedef __int64 int64_t; - typedef unsigned __int64 uint64_t; - -/* -#elif defined(__CYGWIN__) - typedef u_int32_t uint32_t; - typedef u_int64_t uint64_t; -*/ -#endif - - typedef uint64_t shinytick_t; - -#if __cplusplus -} /* end of extern "C" */ -#endif - -#endif /* SHINY_PREREQS_H */ diff --git a/src/Shiny/ShinyTools.c b/src/Shiny/ShinyTools.c deleted file mode 100644 index 4058e22853a..00000000000 --- a/src/Shiny/ShinyTools.c +++ /dev/null @@ -1,116 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifdef SLIC3R_PROFILE - -#include "ShinyTools.h" - -#if SHINY_PLATFORM == SHINY_PLATFORM_WIN32 -#define WIN32_LEAN_AND_MEAN -#ifndef NOMINMAX - #define NOMINMAX -#endif /* NOMINMAX */ -#include - -#elif SHINY_PLATFORM == SHINY_PLATFORM_POSIX -#include -#endif - - -/*---------------------------------------------------------------------------*/ - -const ShinyTimeUnit* ShinyGetTimeUnit(float ticks) { - static ShinyTimeUnit units[4] = { 0 }; - - if (units[0].tickFreq == 0) { /* auto initialize first time */ - units[0].tickFreq = ShinyGetTickFreq() / 1.0f; - units[0].invTickFreq = ShinyGetTickInvFreq() * 1.0f; - units[0].suffix = "s"; - - units[1].tickFreq = ShinyGetTickFreq() / 1000.0f; - units[1].invTickFreq = ShinyGetTickInvFreq() * 1000.0f; - units[1].suffix = "ms"; - - units[2].tickFreq = ShinyGetTickFreq() / 1000000.0f; - units[2].invTickFreq = ShinyGetTickInvFreq() * 1000000.0f; - units[2].suffix = "us"; - - units[3].tickFreq = ShinyGetTickFreq() / 1000000000.0f; - units[3].invTickFreq = ShinyGetTickInvFreq() * 1000000000.0f; - units[3].suffix = "ns"; - } - - if (units[0].tickFreq < ticks) return &units[0]; - else if (units[1].tickFreq < ticks) return &units[1]; - else if (units[2].tickFreq < ticks) return &units[2]; - else return &units[3]; -} - - -/*---------------------------------------------------------------------------*/ - -#if SHINY_PLATFORM == SHINY_PLATFORM_WIN32 - -void ShinyGetTicks(shinytick_t *p) { - QueryPerformanceCounter((LARGE_INTEGER*)(p)); -} - -shinytick_t ShinyGetTickFreq(void) { - static shinytick_t freq = 0; - if (freq == 0) QueryPerformanceFrequency((LARGE_INTEGER*)(&freq)); - return freq; -} - -float ShinyGetTickInvFreq(void) { - static float invfreq = 0; - if (invfreq == 0) invfreq = 1.0f / ShinyGetTickFreq(); - return invfreq; -} - - -/*---------------------------------------------------------------------------*/ - -#elif SHINY_PLATFORM == SHINY_PLATFORM_POSIX - -//#include -//#include - -void ShinyGetTicks(shinytick_t *p) { - struct timeval time; - gettimeofday(&time, NULL); - - *p = time.tv_sec * 1000000 + time.tv_usec; -} - -shinytick_t ShinyGetTickFreq(void) { - return 1000000; -} - -float ShinyGetTickInvFreq(void) { - return 1.0f / 1000000.0f; -} - -#endif - -#endif /* SLIC3R_PROFILE */ diff --git a/src/Shiny/ShinyTools.h b/src/Shiny/ShinyTools.h deleted file mode 100644 index 379703ee64a..00000000000 --- a/src/Shiny/ShinyTools.h +++ /dev/null @@ -1,57 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifndef SHINY_TOOLS_H -#define SHINY_TOOLS_H - -#include "ShinyPrereqs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*---------------------------------------------------------------------------*/ - -typedef struct { - float tickFreq; - float invTickFreq; - const char* suffix; -} ShinyTimeUnit; - - -/*---------------------------------------------------------------------------*/ - -SHINY_API const ShinyTimeUnit* ShinyGetTimeUnit(float ticks); - -SHINY_API void ShinyGetTicks(shinytick_t *p); - -SHINY_API shinytick_t ShinyGetTickFreq(void); - -SHINY_API float ShinyGetTickInvFreq(void); - -#if __cplusplus -} /* end of extern "C" */ -#endif - -#endif /* SHINY_TOOLS_H */ diff --git a/src/Shiny/ShinyVersion.h b/src/Shiny/ShinyVersion.h deleted file mode 100644 index fe6cd4a3388..00000000000 --- a/src/Shiny/ShinyVersion.h +++ /dev/null @@ -1,37 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifndef SHINY_VERSION_H -#define SHINY_VERSION_H - - -/*---------------------------------------------------------------------------*/ - -#define SHINY_VERSION "2.6 RC1" -#define SHINY_SHORTNAME "Shiny" -#define SHINY_FULLNAME "Shiny Profiler" -#define SHINY_COPYRIGHT "Copyright (C) 2007-2010 Aidin Abedi" -#define SHINY_DESCRIPTION "Shiny is a state of the art profiler designed to help finding bottlenecks in your project." - -#endif /* SHINY_VERSION_H */ diff --git a/src/Shiny/ShinyZone.c b/src/Shiny/ShinyZone.c deleted file mode 100644 index 99d90d9276d..00000000000 --- a/src/Shiny/ShinyZone.c +++ /dev/null @@ -1,201 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifdef SLIC3R_PROFILE - -#include "ShinyZone.h" - -#include - -/*---------------------------------------------------------------------------*/ - -void ShinyZone_preUpdateChain(ShinyZone *first) { - ShinyZone* zone = first; - - while (zone) { - ShinyData_clearCurrent(&(zone->data)); - zone = zone->next; - } -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyZone_updateChain(ShinyZone *first, float a_damping) { - ShinyZone* zone = first; - - do { - ShinyData_computeAverage(&(zone->data), a_damping); - zone = zone->next; - } while (zone); -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyZone_updateChainClean(ShinyZone *first) { - ShinyZone* zone = first; - - do { - ShinyData_copyAverage(&(zone->data)); - zone = zone->next; - } while (zone); -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyZone_resetChain(ShinyZone *first) { - ShinyZone* zone = first, *temp; - - do { - zone->_state = SHINY_ZONE_STATE_HIDDEN; - temp = zone->next; - zone->next = NULL; - zone = temp; - } while (zone); -} - -/*---------------------------------------------------------------------------*/ - -/* A Linked-List Memory Sort - by Philip J. Erdelsky - pje@efgh.com - http://www.alumni.caltech.edu/~pje/ - - Modified by Aidin Abedi -*/ - -ShinyZone* ShinyZone_sortChain(ShinyZone **first) /* return ptr to last zone */ -{ - ShinyZone *p = *first; - - unsigned base; - unsigned long block_size; - - struct tape - { - ShinyZone *first, *last; - unsigned long count; - } tape[4]; - - /* Distribute the records alternately to tape[0] and tape[1]. */ - - tape[0].count = tape[1].count = 0L; - tape[0].first = NULL; - base = 0; - while (p != NULL) - { - ShinyZone *next = p->next; - p->next = tape[base].first; - tape[base].first = p; - tape[base].count++; - p = next; - base ^= 1; - } - - /* If the list is empty or contains only a single record, then */ - /* tape[1].count == 0L and this part is vacuous. */ - - for (base = 0, block_size = 1L; tape[base+1].count != 0L; - base ^= 2, block_size <<= 1) - { - int dest; - struct tape *tape0, *tape1; - tape0 = tape + base; - tape1 = tape + base + 1; - dest = base ^ 2; - tape[dest].count = tape[dest+1].count = 0; - for (; tape0->count != 0; dest ^= 1) - { - unsigned long n0, n1; - struct tape *output_tape = tape + dest; - n0 = n1 = block_size; - while (1) - { - ShinyZone *chosen_record; - struct tape *chosen_tape; - if (n0 == 0 || tape0->count == 0) - { - if (n1 == 0 || tape1->count == 0) - break; - chosen_tape = tape1; - n1--; - } - else if (n1 == 0 || tape1->count == 0) - { - chosen_tape = tape0; - n0--; - } - else if (ShinyZone_compare(tape1->first, tape0->first) > 0) - { - chosen_tape = tape1; - n1--; - } - else - { - chosen_tape = tape0; - n0--; - } - chosen_tape->count--; - chosen_record = chosen_tape->first; - chosen_tape->first = chosen_record->next; - if (output_tape->count == 0) - output_tape->first = chosen_record; - else - output_tape->last->next = chosen_record; - output_tape->last = chosen_record; - output_tape->count++; - } - } - } - - if (tape[base].count > 1L) { - ShinyZone* last = tape[base].last; - *first = tape[base].first; - last->next = NULL; - return last; - - } else { - return NULL; - } -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyZone_clear(ShinyZone* self) { - memset(self, 0, sizeof(ShinyZone)); -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyZone_enumerateZones(const ShinyZone* a_zone, void (*a_func)(const ShinyZone*)) { - a_func(a_zone); - - if (a_zone->next) ShinyZone_enumerateZones(a_zone->next, a_func); -} - -#endif /* SLIC3R_PROFILE */ diff --git a/src/Shiny/ShinyZone.h b/src/Shiny/ShinyZone.h deleted file mode 100644 index dde0d3624a0..00000000000 --- a/src/Shiny/ShinyZone.h +++ /dev/null @@ -1,91 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifndef SHINY_ZONE_H -#define SHINY_ZONE_H - -#include "ShinyData.h" -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/*---------------------------------------------------------------------------*/ - -#define SHINY_ZONE_STATE_HIDDEN 0 -#define SHINY_ZONE_STATE_INITIALIZED 1 -#define SHINY_ZONE_STATE_UPDATING 2 - - -/*---------------------------------------------------------------------------*/ - -typedef struct _ShinyZone { - struct _ShinyZone* next; - int _state; - const char* name; - ShinyData data; -} ShinyZone; - - -/*---------------------------------------------------------------------------*/ - -SHINY_INLINE void ShinyZone_init(ShinyZone *self, ShinyZone* a_prev) { - self->_state = SHINY_ZONE_STATE_INITIALIZED; - a_prev->next = self; -} - -SHINY_INLINE void ShinyZone_uninit(ShinyZone *self) { - self->_state = SHINY_ZONE_STATE_HIDDEN; - self->next = NULL; -} - -SHINY_API void ShinyZone_preUpdateChain(ShinyZone *first); -SHINY_API void ShinyZone_updateChain(ShinyZone *first, float a_damping); -SHINY_API void ShinyZone_updateChainClean(ShinyZone *first); - -SHINY_API void ShinyZone_resetChain(ShinyZone *first); - -SHINY_API ShinyZone* ShinyZone_sortChain(ShinyZone **first); - -SHINY_INLINE float ShinyZone_compare(ShinyZone *a, ShinyZone *b) { - return a->data.selfTicks.avg - b->data.selfTicks.avg; -} - -SHINY_API void ShinyZone_clear(ShinyZone* self); - -SHINY_API void ShinyZone_enumerateZones(const ShinyZone* a_zone, void (*a_func)(const ShinyZone*)); - -#if __cplusplus -} /* end of extern "C" */ - -template -void ShinyZone_enumerateZones(const ShinyZone* a_zone, T* a_this, void (T::*a_func)(const ShinyZone*)) { - (a_this->*a_func)(a_zone); - - if (a_zone->next) ShinyZone_enumerateZones(a_zone->next, a_this, a_func); -} -#endif /* __cplusplus */ - -#endif /* SHINY_ZONE_H */ diff --git a/src/admesh/shared.cpp b/src/admesh/shared.cpp index a8fbc2a87db..8ead78d08e1 100644 --- a/src/admesh/shared.cpp +++ b/src/admesh/shared.cpp @@ -207,6 +207,31 @@ bool its_write_obj(const indexed_triangle_set &its, const char *file) return true; } +bool its_write_obj(const indexed_triangle_set& its, const std::vector &color, const char* file) +{ + Slic3r::CNumericLocalesSetter locales_setter; + FILE* fp = boost::nowide::fopen(file, "w"); + if (fp == nullptr) { + BOOST_LOG_TRIVIAL(error) << "stl_write_obj: Couldn't open " << file << " for writing"; + return false; + } + + for (size_t i = 0; i < its.vertices.size(); ++i) + fprintf(fp, "v %f %f %f %f %f %f\n", + its.vertices[i](0), + its.vertices[i](1), + its.vertices[i](2), + color[i](0), + color[i](1), + color[i](2)); + for (size_t i = 0; i < its.indices.size(); ++i) + fprintf(fp, "f %d %d %d\n", + its.indices[i][0] + 1, + its.indices[i][1] + 1, + its.indices[i][2] + 1); + fclose(fp); + return true; +} // Check validity of the mesh, assert on error. bool stl_validate(const stl_file *stl, const indexed_triangle_set &its) diff --git a/src/admesh/stl.h b/src/admesh/stl.h index 8c30a6ae5de..ac51ae1b680 100644 --- a/src/admesh/stl.h +++ b/src/admesh/stl.h @@ -303,6 +303,17 @@ extern bool its_write_obj(const indexed_triangle_set &its, const char *file); extern bool its_write_off(const indexed_triangle_set &its, const char *file); extern bool its_write_vrml(const indexed_triangle_set &its, const char *file); + +typedef Eigen::Matrix obj_color; // Vec3f +///

    +/// write idexed triangle set into obj file with color +/// +/// input model +/// color of stored model +/// define place to store +/// True on success otherwise FALSE +extern bool its_write_obj(const indexed_triangle_set& its, const std::vector &color, const char* file); + extern bool stl_write_dxf(stl_file *stl, const char *file, char *label); inline void stl_calculate_normal(stl_normal &normal, stl_facet *facet) { normal = (facet->vertex[1] - facet->vertex[0]).cross(facet->vertex[2] - facet->vertex[0]); diff --git a/src/clipper/CMakeLists.txt b/src/clipper/CMakeLists.txt index f6250882092..3cb7cb6bbdd 100644 --- a/src/clipper/CMakeLists.txt +++ b/src/clipper/CMakeLists.txt @@ -8,7 +8,3 @@ add_library(clipper STATIC clipper_z.cpp clipper_z.hpp ) - -if(SLIC3R_PROFILE) - target_link_libraries(clipper Shiny) -endif() diff --git a/src/clipper/clipper.cpp b/src/clipper/clipper.cpp index 84109398a7e..c4b7e8bc29c 100644 --- a/src/clipper/clipper.cpp +++ b/src/clipper/clipper.cpp @@ -50,17 +50,6 @@ #include #include -// Profiling support using the Shiny intrusive profiler -//#define CLIPPERLIB_PROFILE -#if defined(SLIC3R_PROFILE) && defined(CLIPPERLIB_PROFILE) - #include - #define CLIPPERLIB_PROFILE_FUNC() PROFILE_FUNC() - #define CLIPPERLIB_PROFILE_BLOCK(name) PROFILE_BLOCK(name) -#else - #define CLIPPERLIB_PROFILE_FUNC() - #define CLIPPERLIB_PROFILE_BLOCK(name) -#endif - #ifdef CLIPPERLIB_NAMESPACE_PREFIX namespace CLIPPERLIB_NAMESPACE_PREFIX { #endif // CLIPPERLIB_NAMESPACE_PREFIX @@ -119,6 +108,10 @@ inline cInt Round(double val) return static_cast((val < 0) ? (val - 0.5) : (val + 0.5)); } +// Overriding the Eigen operators because we don't want to compare Z coordinate if IntPoint is 3 dimensional. +inline bool operator==(const IntPoint &l, const IntPoint &r) { return l.x() == r.x() && l.y() == r.y(); } +inline bool operator!=(const IntPoint &l, const IntPoint &r) { return l.x() != r.x() || l.y() != r.y(); } + //------------------------------------------------------------------------------ // PolyTree methods ... //------------------------------------------------------------------------------ @@ -189,19 +182,25 @@ double Area(const Path &poly) } //------------------------------------------------------------------------------ -double Area(const OutRec &outRec) +double Area(const OutPt *op) { - OutPt *op = outRec.Pts; + const OutPt *startOp = op; if (!op) return 0; double a = 0; do { a += (double)(op->Prev->Pt.x() + op->Pt.x()) * (double)(op->Prev->Pt.y() - op->Pt.y()); op = op->Next; - } while (op != outRec.Pts); + } while (op != startOp); return a * 0.5; } //------------------------------------------------------------------------------ +double Area(const OutRec &outRec) +{ + return Area(outRec.Pts); +} +//------------------------------------------------------------------------------ + bool PointIsVertex(const IntPoint &Pt, OutPt *pp) { OutPt *pp2 = pp; @@ -236,7 +235,7 @@ int PointInPolygon(const IntPoint &pt, const Path &path) if (ipNext.x() > pt.x()) result = 1 - result; else { - double d = (double)(ip.x() - pt.x()) * (ipNext.y() - pt.y()) - (double)(ipNext.x() - pt.x()) * (ip.y() - pt.y()); + auto d = CrossProductType(ip.x() - pt.x()) * CrossProductType(ipNext.y() - pt.y()) - CrossProductType(ipNext.x() - pt.x()) * CrossProductType(ip.y() - pt.y()); if (!d) return -1; if ((d > 0) == (ipNext.y() > ip.y())) result = 1 - result; } @@ -244,7 +243,7 @@ int PointInPolygon(const IntPoint &pt, const Path &path) { if (ipNext.x() > pt.x()) { - double d = (double)(ip.x() - pt.x()) * (ipNext.y() - pt.y()) - (double)(ipNext.x() - pt.x()) * (ip.y() - pt.y()); + auto d = CrossProductType(ip.x() - pt.x()) * CrossProductType(ipNext.y() - pt.y()) - CrossProductType(ipNext.x() - pt.x()) * CrossProductType(ip.y() - pt.y()); if (!d) return -1; if ((d > 0) == (ipNext.y() > ip.y())) result = 1 - result; } @@ -257,7 +256,7 @@ int PointInPolygon(const IntPoint &pt, const Path &path) //------------------------------------------------------------------------------ // Called by Poly2ContainsPoly1() -int PointInPolygon (const IntPoint &pt, OutPt *op) +int PointInPolygon(const IntPoint &pt, OutPt *op) { //returns 0 if false, +1 if true, -1 if pt ON polygon boundary int result = 0; @@ -276,7 +275,7 @@ int PointInPolygon (const IntPoint &pt, OutPt *op) if (op->Next->Pt.x() > pt.x()) result = 1 - result; else { - double d = (double)(op->Pt.x() - pt.x()) * (op->Next->Pt.y() - pt.y()) - (double)(op->Next->Pt.x() - pt.x()) * (op->Pt.y() - pt.y()); + auto d = CrossProductType(op->Pt.x() - pt.x()) * CrossProductType(op->Next->Pt.y() - pt.y()) - CrossProductType(op->Next->Pt.x() - pt.x()) * CrossProductType(op->Pt.y() - pt.y()); if (!d) return -1; if ((d > 0) == (op->Next->Pt.y() > op->Pt.y())) result = 1 - result; } @@ -284,7 +283,7 @@ int PointInPolygon (const IntPoint &pt, OutPt *op) { if (op->Next->Pt.x() > pt.x()) { - double d = (double)(op->Pt.x() - pt.x()) * (op->Next->Pt.y() - pt.y()) - (double)(op->Next->Pt.x() - pt.x()) * (op->Pt.y() - pt.y()); + auto d = CrossProductType(op->Pt.x() - pt.x()) * CrossProductType(op->Next->Pt.y() - pt.y()) - CrossProductType(op->Next->Pt.x() - pt.x()) * CrossProductType(op->Pt.y() - pt.y()); if (!d) return -1; if ((d > 0) == (op->Next->Pt.y() > op->Pt.y())) result = 1 - result; } @@ -299,7 +298,6 @@ int PointInPolygon (const IntPoint &pt, OutPt *op) // This is potentially very expensive! O(n^2)! bool Poly2ContainsPoly1(OutPt *OutPt1, OutPt *OutPt2) { - CLIPPERLIB_PROFILE_FUNC(); OutPt* op = OutPt1; do { @@ -536,27 +534,32 @@ bool FirstIsBottomPt(const OutPt* btmPt1, const OutPt* btmPt2) p = btmPt2->Next; while ((p->Pt == btmPt2->Pt) && (p != btmPt2)) p = p->Next; double dx2n = std::fabs(GetDx(btmPt2->Pt, p->Pt)); - return (dx1p >= dx2p && dx1p >= dx2n) || (dx1n >= dx2p && dx1n >= dx2n); + + if (std::max(dx1p, dx1n) == std::max(dx2p, dx2n) && + std::min(dx1p, dx1n) == std::min(dx2p, dx2n)) + return Area(btmPt1) > 0; //if otherwise identical use orientation + else + return (dx1p >= dx2p && dx1p >= dx2n) || (dx1n >= dx2p && dx1n >= dx2n); } //------------------------------------------------------------------------------ // Called by GetLowermostRec() OutPt* GetBottomPt(OutPt *pp) { - OutPt* dups = 0; + OutPt* dups = nullptr; OutPt* p = pp->Next; while (p != pp) { if (p->Pt.y() > pp->Pt.y()) { pp = p; - dups = 0; + dups = nullptr; } else if (p->Pt.y() == pp->Pt.y() && p->Pt.x() <= pp->Pt.x()) { if (p->Pt.x() < pp->Pt.x()) { - dups = 0; + dups = nullptr; pp = p; } else { @@ -577,6 +580,7 @@ OutPt* GetBottomPt(OutPt *pp) } return pp; } + //------------------------------------------------------------------------------ bool Pt2IsBetweenPt1AndPt3(const IntPoint &pt1, @@ -602,9 +606,18 @@ bool HorzSegmentsOverlap(cInt seg1a, cInt seg1b, cInt seg2a, cInt seg2b) // ClipperBase class methods ... //------------------------------------------------------------------------------ -#ifndef CLIPPERLIB_INT32 +#ifdef CLIPPERLIB_INT32 +static inline void RangeTest(const IntPoint &pt) +{ +#ifndef NDEBUG + static constexpr const int32_t hi = 65536 * 16383; + if (pt.x() > hi || pt.y() > hi || -pt.x() > hi || -pt.y() > hi) + throw clipperException("Coordinate outside allowed range"); +#endif // NDEBUG +} +#else // CLIPPERLIB_INT32 // Called from ClipperBase::AddPath() to verify the scale of the input polygon coordinates. -inline void RangeTest(const IntPoint& Pt, bool& useFullRange) +static inline void RangeTest(const IntPoint& Pt, bool& useFullRange) { if (useFullRange) { @@ -759,7 +772,6 @@ TEdge* ClipperBase::ProcessBound(TEdge* E, bool NextIsForward) bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed) { - CLIPPERLIB_PROFILE_FUNC(); // Remove duplicate end point from a closed input path. // Remove duplicate points from the end of the input path. int highI = (int)pg.size() -1; @@ -783,7 +795,6 @@ bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed) bool ClipperBase::AddPathInternal(const Path &pg, int highI, PolyType PolyTyp, bool Closed, TEdge* edges) { - CLIPPERLIB_PROFILE_FUNC(); #ifdef use_lines if (!Closed && PolyTyp == ptClip) throw clipperException("AddPath: Open paths must be subject."); @@ -798,7 +809,10 @@ bool ClipperBase::AddPathInternal(const Path &pg, int highI, PolyType PolyTyp, b try { edges[1].Curr = pg[1]; -#ifndef CLIPPERLIB_INT32 +#ifdef CLIPPERLIB_INT32 + RangeTest(pg[0]); + RangeTest(pg[highI]); +#else RangeTest(pg[0], m_UseFullRange); RangeTest(pg[highI], m_UseFullRange); #endif // CLIPPERLIB_INT32 @@ -806,7 +820,9 @@ bool ClipperBase::AddPathInternal(const Path &pg, int highI, PolyType PolyTyp, b InitEdge(&edges[highI], &edges[0], &edges[highI-1], pg[highI]); for (int i = highI - 1; i >= 1; --i) { -#ifndef CLIPPERLIB_INT32 +#ifdef CLIPPERLIB_INT32 + RangeTest(pg[i]); +#else RangeTest(pg[i], m_UseFullRange); #endif // CLIPPERLIB_INT32 InitEdge(&edges[i], &edges[i+1], &edges[i-1], pg[i]); @@ -961,7 +977,6 @@ bool ClipperBase::AddPathInternal(const Path &pg, int highI, PolyType PolyTyp, b void ClipperBase::Clear() { - CLIPPERLIB_PROFILE_FUNC(); m_MinimaList.clear(); m_edges.clear(); #ifndef CLIPPERLIB_INT32 @@ -975,7 +990,6 @@ void ClipperBase::Clear() // Sort the LML entries, initialize the left / right bound edges of each Local Minima. void ClipperBase::Reset() { - CLIPPERLIB_PROFILE_FUNC(); if (m_MinimaList.empty()) return; //ie nothing to process std::sort(m_MinimaList.begin(), m_MinimaList.end(), [](const LocalMinimum& lm1, const LocalMinimum& lm2){ return lm1.Y < lm2.Y; }); @@ -1004,7 +1018,6 @@ void ClipperBase::Reset() // Returns (0,0,0,0) for an empty rectangle. IntRect ClipperBase::GetBounds() { - CLIPPERLIB_PROFILE_FUNC(); IntRect result; auto lm = m_MinimaList.begin(); if (lm == m_MinimaList.end()) @@ -1065,7 +1078,6 @@ Clipper::Clipper(int initOptions) : void Clipper::Reset() { - CLIPPERLIB_PROFILE_FUNC(); ClipperBase::Reset(); m_Scanbeam = std::priority_queue(); m_Maxima.clear(); @@ -1080,7 +1092,6 @@ void Clipper::Reset() bool Clipper::Execute(ClipType clipType, Paths &solution, PolyFillType subjFillType, PolyFillType clipFillType) { - CLIPPERLIB_PROFILE_FUNC(); if (m_HasOpenPaths) throw clipperException("Error: PolyTree struct is needed for open path clipping."); solution.clear(); @@ -1098,7 +1109,6 @@ bool Clipper::Execute(ClipType clipType, Paths &solution, bool Clipper::Execute(ClipType clipType, PolyTree& polytree, PolyFillType subjFillType, PolyFillType clipFillType) { - CLIPPERLIB_PROFILE_FUNC(); m_SubjFillType = subjFillType; m_ClipFillType = clipFillType; m_ClipType = clipType; @@ -1112,10 +1122,8 @@ bool Clipper::Execute(ClipType clipType, PolyTree& polytree, bool Clipper::ExecuteInternal() { - CLIPPERLIB_PROFILE_FUNC(); bool succeeded = true; try { - CLIPPERLIB_PROFILE_BLOCK(Clipper_ExecuteInternal_Process); Reset(); if (m_MinimaList.empty()) return true; cInt botY = m_Scanbeam.top(); @@ -1140,13 +1148,11 @@ bool Clipper::ExecuteInternal() if (succeeded) { - CLIPPERLIB_PROFILE_BLOCK(Clipper_ExecuteInternal_Fix); //fix orientations ... //FIXME Vojtech: Does it not invalidate the loop hierarchy maintained as OutRec::FirstLeft pointers? //FIXME Vojtech: The area is calculated with floats, it may not be numerically stable! { - CLIPPERLIB_PROFILE_BLOCK(Clipper_ExecuteInternal_Fix_orientations); for (OutRec *outRec : m_PolyOuts) if (outRec->Pts && !outRec->IsOpen && (outRec->IsHole ^ m_ReverseOutput) == (Area(*outRec) > 0)) ReversePolyPtLinks(outRec->Pts); @@ -1156,7 +1162,6 @@ bool Clipper::ExecuteInternal() //unfortunately FixupOutPolygon() must be done after JoinCommonEdges() { - CLIPPERLIB_PROFILE_BLOCK(Clipper_ExecuteInternal_Fix_fixup); for (OutRec *outRec : m_PolyOuts) if (outRec->Pts) { if (outRec->IsOpen) @@ -1410,7 +1415,6 @@ bool Clipper::IsContributing(const TEdge& edge) const // Called from Clipper::InsertLocalMinimaIntoAEL() and Clipper::IntersectEdges(). OutPt* Clipper::AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &Pt) { - CLIPPERLIB_PROFILE_FUNC(); OutPt* result; TEdge *e, *prevE; if (IsHorizontal(*e2) || ( e1->Dx > e2->Dx )) @@ -1502,7 +1506,6 @@ void Clipper::CopyAELToSEL() // Called from Clipper::ExecuteInternal() void Clipper::InsertLocalMinimaIntoAEL(const cInt botY) { - CLIPPERLIB_PROFILE_FUNC(); while (!m_MinimaList.empty() && m_MinimaList.back().Y == botY) { TEdge* lb = m_MinimaList.back().LeftBound; @@ -2052,7 +2055,6 @@ OutPt* Clipper::GetLastOutPt(TEdge *e) void Clipper::ProcessHorizontals() { - CLIPPERLIB_PROFILE_FUNC(); TEdge* horzEdge = m_SortedEdges; while(horzEdge) { @@ -2429,7 +2431,6 @@ void Clipper::UpdateEdgeIntoAEL(TEdge *&e) bool Clipper::ProcessIntersections(const cInt topY) { - CLIPPERLIB_PROFILE_FUNC(); if( !m_ActiveEdges ) return true; try { BuildIntersectList(topY); @@ -2584,7 +2585,6 @@ void Clipper::DoMaxima(TEdge *e) void Clipper::ProcessEdgesAtTopOfScanbeam(const cInt topY) { - CLIPPERLIB_PROFILE_FUNC(); TEdge* e = m_ActiveEdges; while( e ) { @@ -3195,7 +3195,6 @@ bool Clipper::JoinPoints(Join *j, OutRec* outRec1, OutRec* outRec2) // This is potentially very expensive! O(n^3)! void Clipper::FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec) const { - CLIPPERLIB_PROFILE_FUNC(); //tests if NewOutRec contains the polygon before reassigning FirstLeft for (OutRec *outRec : m_PolyOuts) { @@ -3219,7 +3218,6 @@ void Clipper::FixupFirstLefts2(OutRec* OldOutRec, OutRec* NewOutRec) const void Clipper::JoinCommonEdges() { - CLIPPERLIB_PROFILE_FUNC(); for (Join &join : m_Joins) { OutRec *outRec1 = GetOutRec(join.OutPt1->Idx); @@ -3770,7 +3768,6 @@ void ClipperOffset::DoRound(int j, int k) // http://www.angusj.com/delphi/clipper/documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/StrictlySimple.htm void Clipper::DoSimplePolygons() { - CLIPPERLIB_PROFILE_FUNC(); size_t i = 0; while (i < m_PolyOuts.size()) { @@ -4112,19 +4109,40 @@ void AddPolyNodeToPaths(const PolyNode& polynode, NodeType nodetype, Paths& path for (int i = 0; i < polynode.ChildCount(); ++i) AddPolyNodeToPaths(*polynode.Childs[i], nodetype, paths); } + +void AddPolyNodeToPaths(PolyNode&& polynode, NodeType nodetype, Paths& paths) +{ + bool match = true; + if (nodetype == ntClosed) match = !polynode.IsOpen(); + else if (nodetype == ntOpen) return; + + if (!polynode.Contour.empty() && match) + paths.push_back(std::move(polynode.Contour)); + for (int i = 0; i < polynode.ChildCount(); ++i) + AddPolyNodeToPaths(std::move(*polynode.Childs[i]), nodetype, paths); +} + //------------------------------------------------------------------------------ void PolyTreeToPaths(const PolyTree& polytree, Paths& paths) { - paths.resize(0); + paths.clear(); paths.reserve(polytree.Total()); AddPolyNodeToPaths(polytree, ntAny, paths); } + +void PolyTreeToPaths(PolyTree&& polytree, Paths& paths) +{ + paths.clear(); + paths.reserve(polytree.Total()); + AddPolyNodeToPaths(std::move(polytree), ntAny, paths); +} + //------------------------------------------------------------------------------ void ClosedPathsFromPolyTree(const PolyTree& polytree, Paths& paths) { - paths.resize(0); + paths.clear(); paths.reserve(polytree.Total()); AddPolyNodeToPaths(polytree, ntClosed, paths); } @@ -4132,7 +4150,7 @@ void ClosedPathsFromPolyTree(const PolyTree& polytree, Paths& paths) void OpenPathsFromPolyTree(PolyTree& polytree, Paths& paths) { - paths.resize(0); + paths.clear(); paths.reserve(polytree.Total()); //Open paths are top level only, so ... for (int i = 0; i < polytree.ChildCount(); ++i) diff --git a/src/clipper/clipper.hpp b/src/clipper/clipper.hpp index b1dae3c2480..849672a8f91 100644 --- a/src/clipper/clipper.hpp +++ b/src/clipper/clipper.hpp @@ -85,9 +85,11 @@ enum PolyFillType { pftEvenOdd, pftNonZero, pftPositive, pftNegative }; // Point coordinate type #ifdef CLIPPERLIB_INT32 // Coordinates and their differences (vectors of the coordinates) have to fit int32_t. - typedef int32_t cInt; + using cInt = int32_t; + using CrossProductType = int64_t; #else - typedef int64_t cInt; + using cInt = int64_t; + using CrossProductType = double; // Maximum cInt value to allow a cross product calculation using 32bit expressions. static constexpr cInt const loRange = 0x3FFFFFFF; // 0x3FFFFFFF = 1 073 741 823 // Maximum allowed cInt value. @@ -204,6 +206,7 @@ void MinkowskiSum(const Path& pattern, const Paths& paths, Paths& solution, bool void MinkowskiDiff(const Path& poly1, const Path& poly2, Paths& solution); void PolyTreeToPaths(const PolyTree& polytree, Paths& paths); +void PolyTreeToPaths(PolyTree&& polytree, Paths& paths); void ClosedPathsFromPolyTree(const PolyTree& polytree, Paths& paths); void OpenPathsFromPolyTree(PolyTree& polytree, Paths& paths); diff --git a/src/glew/LICENSE.txt b/src/glew/LICENSE.txt deleted file mode 100644 index f7078042e95..00000000000 --- a/src/glew/LICENSE.txt +++ /dev/null @@ -1,73 +0,0 @@ -The OpenGL Extension Wrangler Library -Copyright (C) 2002-2007, Milan Ikits -Copyright (C) 2002-2007, Marcelo E. Magallon -Copyright (C) 2002, Lev Povalahev -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. -* The name of the author may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -THE POSSIBILITY OF SUCH DAMAGE. - - -Mesa 3-D graphics library -Version: 7.0 - -Copyright (C) 1999-2007 Brian Paul All Rights Reserved. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -Copyright (c) 2007 The Khronos Group Inc. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and/or associated documentation files (the -"Materials"), to deal in the Materials without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Materials, and to -permit persons to whom the Materials are furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Materials. - -THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. diff --git a/src/glew/README.md b/src/glew/README.md deleted file mode 100644 index a5942cac58d..00000000000 --- a/src/glew/README.md +++ /dev/null @@ -1,260 +0,0 @@ -THIS IS NOT THE COMPLETE GLEW DISTRIBUTION. ONLY FILES NEEDED FOR COMPILING GLEW INTO SLIC3R WERE PUT INTO THE SLIC3R SOURCE DISTRIBUTION. - -# GLEW - The OpenGL Extension Wrangler Library - -The OpenGL Extension Wrangler Library (GLEW) is a cross-platform open-source C/C++ extension loading library. GLEW provides efficient run-time mechanisms for determining which OpenGL extensions are supported on the target platform. OpenGL core and extension functionality is exposed in a single header file. GLEW has been tested on a variety of operating systems, including Windows, Linux, Mac OS X, FreeBSD, Irix, and Solaris. - -![](http://glew.sourceforge.net/glew.png) - -http://glew.sourceforge.net/ - -https://github.com/nigels-com/glew - -[![Build Status](https://travis-ci.org/nigels-com/glew.svg?branch=master)](https://travis-ci.org/nigels-com/glew) -[![Gitter](https://badges.gitter.im/nigels-com/glew.svg)](https://gitter.im/nigels-com/glew?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) -[![Download](https://img.shields.io/sourceforge/dm/glew.svg)](https://sourceforge.net/projects/glew/files/latest/download) - -## Table of Contents - -* [Downloads](#downloads) - * [Recent snapshots](#recent-snapshots) -* [Build](#build) - * [Linux and Mac](#linux-and-mac) - * [Using GNU Make](#using-gnu-make) - * [Install build tools](#install-build-tools) - * [Build](#build-1) - * [Linux EGL](#linux-egl) - * [Linux OSMesa](#linux-osmesa) - * [Linux mingw-w64](#linux-mingw-w64) - * [Using cmake](#using-cmake) - * [Install build tools](#install-build-tools-1) - * [Build](#build-2) - * [Windows](#windows) - * [Visual Studio](#visual-studio) - * [MSYS/Mingw](#msysmingw) - * [MSYS2/Mingw-w64](#msys2mingw-w64) -* [glewinfo](#glewinfo) -* [Code Generation](#code-generation) -* [Authors](#authors) -* [Contributions](#contributions) -* [Copyright and Licensing](#copyright-and-licensing) - -## Downloads - -Current release is [2.1.0](https://sourceforge.net/projects/glew/files/glew/2.1.0/). -[(Change Log)](http://glew.sourceforge.net/log.html) - -Sources available as -[ZIP](https://sourceforge.net/projects/glew/files/glew/2.1.0/glew-2.1.0.zip/download) or -[TGZ](https://sourceforge.net/projects/glew/files/glew/2.1.0/glew-2.1.0.tgz/download). - -Windows binaries for [32-bit and 64-bit](https://sourceforge.net/projects/glew/files/glew/2.1.0/glew-2.1.0-win32.zip/download). - -### Recent snapshots - -Snapshots may contain new features, bug-fixes or new OpenGL extensions ahead of tested, official releases. - -[glew-20200115.tgz](https://sourceforge.net/projects/glew/files/glew/snapshots/glew-20200115.tgz/download) *GLEW 2.2.0 RC3: fixes* - -[glew-20190928.tgz](https://sourceforge.net/projects/glew/files/glew/snapshots/glew-20190928.tgz/download) *GLEW 2.2.0 RC2: New extensions, bug fixes* - -## Build - -It is highly recommended to build from a tgz or zip release snapshot. -The code generation workflow is a complex brew of gnu make, perl and python, that works best on Linux or Mac. -The code generation is known to work on Windows using [MSYS2](https://www.msys2.org/). -For most end-users of GLEW the official releases are the best choice, with first class support. - -### Linux and Mac - -#### Using GNU Make - -GNU make is the primary build system for GLEW, historically. -It includes targets for building the sources and headers, for maintenance purposes. - -##### Install build tools - -Debian/Ubuntu/Mint: `$ sudo apt-get install build-essential libxmu-dev libxi-dev libgl-dev` - -RedHat/CentOS/Fedora: `$ sudo yum install libXmu-devel libXi-devel libGL-devel` - -FreeBSD: `# pkg install xorg lang/gcc git cmake gmake bash python perl5` - -##### Build - - $ make - $ sudo make install - $ make clean - -Targets: `all, glew.lib (sub-targets: glew.lib.shared, glew.lib.static), glew.bin, clean, install, uninstall` - -Variables: `SYSTEM=linux-clang, GLEW_DEST=/usr/local, STRIP=` - -_Note: you may need to call `make` in the **auto** folder first_ - -##### Linux EGL - - $ sudo apt install libegl1-mesa-dev - $ make SYSTEM=linux-egl - -##### Linux OSMesa - - $ sudo apt install libosmesa-dev - $ make SYSTEM=linux-osmesa - -##### Linux mingw-w64 - - $ sudo apt install mingw-w64 - $ make SYSTEM=linux-mingw32 - $ make SYSTEM=linux-mingw64 - -#### Using cmake - -The cmake build is mostly contributer maintained. -Due to the multitude of use cases this is maintained on a _best effort_ basis. -Pull requests are welcome. - -*CMake 2.8.12 or higher is required.* - -##### Install build tools - -Debian/Ubuntu/Mint: `$ sudo apt-get install build-essential libxmu-dev libxi-dev libgl-dev cmake git` - -RedHat/CentOS/Fedora: `$ sudo yum install libXmu-devel libXi-devel libGL-devel cmake git` - -##### Build - - $ cd build - $ cmake ./cmake - $ make -j4 - -| Target | Description | -| ---------- | ----------- | -| glew | Build the glew shared library. | -| glew_s | Build the glew static library. | -| glewinfo | Build the `glewinfo` executable (requires `BUILD_UTILS` to be `ON`). | -| visualinfo | Build the `visualinfo` executable (requires `BUILD_UTILS` to be `ON`). | -| install | Install all enabled targets into `CMAKE_INSTALL_PREFIX`. | -| clean | Clean up build artifacts. | -| all | Build all enabled targets (default target). | - -| Variables | Description | -| --------------- | ----------- | -| BUILD_UTILS | Build the `glewinfo` and `visualinfo` executables. | -| GLEW_REGAL | Build in Regal mode. | -| GLEW_OSMESA | Build in off-screen Mesa mode. | -| BUILD_FRAMEWORK | Build as MacOSX Framework. Setting `CMAKE_INSTALL_PREFIX` to `/Library/Frameworks` is recommended. | - -### Windows - -#### Visual Studio - -Use the provided Visual Studio project file in build/vc15/ - -Projects for vc6, vc10, vc12 and vc14 are also provided - -#### MSYS/Mingw - -Available from [Mingw](http://www.mingw.org/) - -Requirements: bash, make, gcc - - $ mingw32-make - $ mingw32-make install - $ mingw32-make install.all - -Alternative toolchain: `SYSTEM=mingw-win32` - -#### MSYS2/Mingw-w64 - -Available from [Msys2](http://msys2.github.io/) and/or [Mingw-w64](http://mingw-w64.org/) - -Requirements: bash, make, gcc - - $ pacman -S gcc make mingw-w64-i686-gcc mingw-w64-x86_64-gcc - $ make - $ make install - $ make install.all - -Alternative toolchain: `SYSTEM=msys, SYSTEM=msys-win32, SYSTEM=msys-win64` - -## glewinfo - -`glewinfo` is a command-line tool useful for inspecting the capabilities of an -OpenGL implementation and GLEW support for that. Please include `glewinfo.txt` -with bug reports, as appropriate. - - --------------------------- - GLEW Extension Info - --------------------------- - - GLEW version 2.0.0 - Reporting capabilities of pixelformat 3 - Running on a Intel(R) HD Graphics 3000 from Intel - OpenGL version 3.1.0 - Build 9.17.10.4229 is supported - - GL_VERSION_1_1: OK - --------------- - - GL_VERSION_1_2: OK - --------------- - glCopyTexSubImage3D: OK - glDrawRangeElements: OK - glTexImage3D: OK - glTexSubImage3D: OK - - ... - -## Code Generation - -A Unix or Mac environment is needed for building GLEW from scratch to -include new extensions, or customize the code generation. The extension -data is regenerated from the top level source directory with: - - make extensions - -An alternative to generating the GLEW sources from scratch is to -download a pre-generated (unsupported) snapshot: - -https://sourceforge.net/projects/glew/files/glew/snapshots/ - -## Authors - -GLEW is currently maintained by [Nigel Stewart](https://github.com/nigels-com) -with bug fixes, new OpenGL extension support and new releases. - -GLEW was developed by [Milan Ikits](http://www.cs.utah.edu/~ikits/) -and [Marcelo Magallon](http://wwwvis.informatik.uni-stuttgart.de/~magallon/). -Aaron Lefohn, Joe Kniss, and Chris Wyman were the first users and also -assisted with the design and debugging process. - -The acronym GLEW originates from Aaron Lefohn. -Pasi Kärkkäinen identified and fixed several problems with -GLX and SDL. Nate Robins created the `wglinfo` utility, to -which modifications were made by Michael Wimmer. - -## Contributions - -GLEW welcomes community contributions. Typically these are co-ordinated -via [Issues](https://github.com/nigels-com/glew/issues) or -[Pull Requests](https://github.com/nigels-com/glew/pulls) in the -GitHub web interface. - -Be sure to mention platform and compiler toolchain details when filing -a bug report. The output of `glewinfo` can be quite useful for discussion -also. - -Generally GLEW is usually released once a year, around the time of the Siggraph -computer graphics conference. If you're not using the current release -version of GLEW, be sure to check if the issue or bug is fixed there. - -## Copyright and Licensing - -GLEW is originally derived from the EXTGL project by Lev Povalahev. -The source code is licensed under the -[Modified BSD License](http://glew.sourceforge.net/glew.txt), the -[Mesa 3-D License](http://glew.sourceforge.net/mesa.txt) (MIT) and the -[Khronos License](http://glew.sourceforge.net/khronos.txt) (MIT). - -The automatic code generation scripts are released under the -[GNU GPL](http://glew.sourceforge.net/gpl.txt). diff --git a/src/glew/include/GL/glew.h b/src/glew/include/GL/glew.h deleted file mode 100644 index 234591bb599..00000000000 --- a/src/glew/include/GL/glew.h +++ /dev/null @@ -1,26427 +0,0 @@ -/* -** The OpenGL Extension Wrangler Library -** Copyright (C) 2008-2019, Nigel Stewart -** Copyright (C) 2002-2008, Milan Ikits -** Copyright (C) 2002-2008, Marcelo E. Magallon -** Copyright (C) 2002, Lev Povalahev -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are met: -** -** * Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** * The name of the author may be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -** THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Mesa 3-D graphics library - * Version: 7.0 - * - * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* -** Copyright (c) 2007 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ - -#ifndef __glew_h__ -#define __glew_h__ -#define __GLEW_H__ - -#if defined(__gl_h_) || defined(__GL_H__) || defined(_GL_H) || defined(__X_GL_H) -#error gl.h included before glew.h -#endif -#if defined(__gl2_h_) -#error gl2.h included before glew.h -#endif -#if defined(__gltypes_h_) -#error gltypes.h included before glew.h -#endif -#if defined(__REGAL_H__) -#error Regal.h included before glew.h -#endif -#if defined(__glext_h_) || defined(__GLEXT_H_) || defined(__gl_glext_h_) -#error glext.h included before glew.h -#endif -#if defined(__gl_ATI_h_) -#error glATI.h included before glew.h -#endif - -#define __gl_h_ -#define __gl2_h_ -#define __GL_H__ -#define _GL_H -#define __gltypes_h_ -#define __REGAL_H__ -#define __X_GL_H -#define __glext_h_ -#define __GLEXT_H_ -#define __gl_glext_h_ -#define __gl_ATI_h_ - -#if defined(_WIN32) - -/* - * GLEW does not include to avoid name space pollution. - * GL needs GLAPI and GLAPIENTRY, GLU needs APIENTRY, CALLBACK, and wchar_t - * defined properly. - */ -/* and */ -#ifdef APIENTRY -# ifndef GLAPIENTRY -# define GLAPIENTRY APIENTRY -# endif -# ifndef GLEWAPIENTRY -# define GLEWAPIENTRY APIENTRY -# endif -#else -#define GLEW_APIENTRY_DEFINED -# if defined(__MINGW32__) || defined(__CYGWIN__) || (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) -# define APIENTRY __stdcall -# ifndef GLAPIENTRY -# define GLAPIENTRY __stdcall -# endif -# ifndef GLEWAPIENTRY -# define GLEWAPIENTRY __stdcall -# endif -# else -# define APIENTRY -# endif -#endif -#ifndef GLAPI -# if defined(__MINGW32__) || defined(__CYGWIN__) -# define GLAPI extern -# endif -#endif -/* */ -#ifndef CALLBACK -#define GLEW_CALLBACK_DEFINED -# if defined(__MINGW32__) || defined(__CYGWIN__) -# define CALLBACK __attribute__ ((__stdcall__)) -# elif (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) -# define CALLBACK __stdcall -# else -# define CALLBACK -# endif -#endif -/* and */ -#ifndef WINGDIAPI -#define GLEW_WINGDIAPI_DEFINED -#define WINGDIAPI __declspec(dllimport) -#endif -/* */ -#if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(_WCHAR_T_DEFINED) -typedef unsigned short wchar_t; -# define _WCHAR_T_DEFINED -#endif -/* */ -#if !defined(_W64) -# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && defined(_MSC_VER) && _MSC_VER >= 1300 -# define _W64 __w64 -# else -# define _W64 -# endif -#endif -#if !defined(_PTRDIFF_T_DEFINED) && !defined(_PTRDIFF_T_) && !defined(__MINGW64__) -# ifdef _WIN64 -typedef __int64 ptrdiff_t; -# else -typedef _W64 int ptrdiff_t; -# endif -# define _PTRDIFF_T_DEFINED -# define _PTRDIFF_T_ -#endif - -#ifndef GLAPI -# if defined(__MINGW32__) || defined(__CYGWIN__) -# define GLAPI extern -# else -# define GLAPI WINGDIAPI -# endif -#endif - -/* - * GLEW_STATIC is defined for static library. - * GLEW_BUILD is defined for building the DLL library. - */ - -#ifdef GLEW_STATIC -# define GLEWAPI extern -#else -# ifdef GLEW_BUILD -# define GLEWAPI extern __declspec(dllexport) -# else -# define GLEWAPI extern __declspec(dllimport) -# endif -#endif - -#else /* _UNIX */ - -/* - * Needed for ptrdiff_t in turn needed by VBO. This is defined by ISO - * C. On my system, this amounts to _3 lines_ of included code, all of - * them pretty much harmless. If you know of a way of detecting 32 vs - * 64 _targets_ at compile time you are free to replace this with - * something that's portable. For now, _this_ is the portable solution. - * (mem, 2004-01-04) - */ - -#if defined(__APPLE__) || defined(__linux__) -# if defined(__cplusplus) -# include -# include -# else -# include -# include -# endif -#else - -# include - -/* SGI MIPSPro doesn't like stdint.h in C++ mode */ -/* ID: 3376260 Solaris 9 has inttypes.h, but not stdint.h */ - -# if (defined(__sgi) || defined(__sun)) && !defined(__GNUC__) -# include -# else -# include -# endif -#endif - -#define GLEW_APIENTRY_DEFINED -#define APIENTRY - -/* - * GLEW_STATIC is defined for static library. - */ - -#ifdef GLEW_STATIC -# define GLEWAPI extern -#else -# if defined(__GNUC__) && __GNUC__>=4 -# define GLEWAPI extern __attribute__ ((visibility("default"))) -# elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) -# define GLEWAPI extern __global -# else -# define GLEWAPI extern -# endif -#endif - -/* */ -#ifndef GLAPI -#define GLAPI extern -#endif - -#endif /* _WIN32 */ - -#ifndef GLAPIENTRY -#define GLAPIENTRY -#endif - -#ifndef GLEWAPIENTRY -#define GLEWAPIENTRY -#endif - -#define GLEW_VAR_EXPORT GLEWAPI -#define GLEW_FUN_EXPORT GLEWAPI - -#ifdef __cplusplus -extern "C" { -#endif - -/* ----------------------------- GL_VERSION_1_1 ---------------------------- */ - -#ifndef GL_VERSION_1_1 -#define GL_VERSION_1_1 1 - -typedef unsigned int GLenum; -typedef unsigned int GLbitfield; -typedef unsigned int GLuint; -typedef int GLint; -typedef int GLsizei; -typedef unsigned char GLboolean; -typedef signed char GLbyte; -typedef short GLshort; -typedef unsigned char GLubyte; -typedef unsigned short GLushort; -typedef unsigned long GLulong; -typedef float GLfloat; -typedef float GLclampf; -typedef double GLdouble; -typedef double GLclampd; -typedef void GLvoid; -#if defined(_MSC_VER) && _MSC_VER < 1400 -typedef __int64 GLint64EXT; -typedef unsigned __int64 GLuint64EXT; -#elif defined(_MSC_VER) || defined(__BORLANDC__) -typedef signed long long GLint64EXT; -typedef unsigned long long GLuint64EXT; -#else -# if defined(__MINGW32__) || defined(__CYGWIN__) -#include -# endif -typedef int64_t GLint64EXT; -typedef uint64_t GLuint64EXT; -#endif -typedef GLint64EXT GLint64; -typedef GLuint64EXT GLuint64; -typedef struct __GLsync *GLsync; - -typedef char GLchar; - -typedef void *GLeglImageOES; /* GL_EXT_EGL_image_storage */ - -#define GL_ZERO 0 -#define GL_FALSE 0 -#define GL_LOGIC_OP 0x0BF1 -#define GL_NONE 0 -#define GL_TEXTURE_COMPONENTS 0x1003 -#define GL_NO_ERROR 0 -#define GL_POINTS 0x0000 -#define GL_CURRENT_BIT 0x00000001 -#define GL_TRUE 1 -#define GL_ONE 1 -#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 -#define GL_LINES 0x0001 -#define GL_LINE_LOOP 0x0002 -#define GL_POINT_BIT 0x00000002 -#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 -#define GL_LINE_STRIP 0x0003 -#define GL_LINE_BIT 0x00000004 -#define GL_TRIANGLES 0x0004 -#define GL_TRIANGLE_STRIP 0x0005 -#define GL_TRIANGLE_FAN 0x0006 -#define GL_QUADS 0x0007 -#define GL_QUAD_STRIP 0x0008 -#define GL_POLYGON_BIT 0x00000008 -#define GL_POLYGON 0x0009 -#define GL_POLYGON_STIPPLE_BIT 0x00000010 -#define GL_PIXEL_MODE_BIT 0x00000020 -#define GL_LIGHTING_BIT 0x00000040 -#define GL_FOG_BIT 0x00000080 -#define GL_DEPTH_BUFFER_BIT 0x00000100 -#define GL_ACCUM 0x0100 -#define GL_LOAD 0x0101 -#define GL_RETURN 0x0102 -#define GL_MULT 0x0103 -#define GL_ADD 0x0104 -#define GL_NEVER 0x0200 -#define GL_ACCUM_BUFFER_BIT 0x00000200 -#define GL_LESS 0x0201 -#define GL_EQUAL 0x0202 -#define GL_LEQUAL 0x0203 -#define GL_GREATER 0x0204 -#define GL_NOTEQUAL 0x0205 -#define GL_GEQUAL 0x0206 -#define GL_ALWAYS 0x0207 -#define GL_SRC_COLOR 0x0300 -#define GL_ONE_MINUS_SRC_COLOR 0x0301 -#define GL_SRC_ALPHA 0x0302 -#define GL_ONE_MINUS_SRC_ALPHA 0x0303 -#define GL_DST_ALPHA 0x0304 -#define GL_ONE_MINUS_DST_ALPHA 0x0305 -#define GL_DST_COLOR 0x0306 -#define GL_ONE_MINUS_DST_COLOR 0x0307 -#define GL_SRC_ALPHA_SATURATE 0x0308 -#define GL_STENCIL_BUFFER_BIT 0x00000400 -#define GL_FRONT_LEFT 0x0400 -#define GL_FRONT_RIGHT 0x0401 -#define GL_BACK_LEFT 0x0402 -#define GL_BACK_RIGHT 0x0403 -#define GL_FRONT 0x0404 -#define GL_BACK 0x0405 -#define GL_LEFT 0x0406 -#define GL_RIGHT 0x0407 -#define GL_FRONT_AND_BACK 0x0408 -#define GL_AUX0 0x0409 -#define GL_AUX1 0x040A -#define GL_AUX2 0x040B -#define GL_AUX3 0x040C -#define GL_INVALID_ENUM 0x0500 -#define GL_INVALID_VALUE 0x0501 -#define GL_INVALID_OPERATION 0x0502 -#define GL_STACK_OVERFLOW 0x0503 -#define GL_STACK_UNDERFLOW 0x0504 -#define GL_OUT_OF_MEMORY 0x0505 -#define GL_2D 0x0600 -#define GL_3D 0x0601 -#define GL_3D_COLOR 0x0602 -#define GL_3D_COLOR_TEXTURE 0x0603 -#define GL_4D_COLOR_TEXTURE 0x0604 -#define GL_PASS_THROUGH_TOKEN 0x0700 -#define GL_POINT_TOKEN 0x0701 -#define GL_LINE_TOKEN 0x0702 -#define GL_POLYGON_TOKEN 0x0703 -#define GL_BITMAP_TOKEN 0x0704 -#define GL_DRAW_PIXEL_TOKEN 0x0705 -#define GL_COPY_PIXEL_TOKEN 0x0706 -#define GL_LINE_RESET_TOKEN 0x0707 -#define GL_EXP 0x0800 -#define GL_VIEWPORT_BIT 0x00000800 -#define GL_EXP2 0x0801 -#define GL_CW 0x0900 -#define GL_CCW 0x0901 -#define GL_COEFF 0x0A00 -#define GL_ORDER 0x0A01 -#define GL_DOMAIN 0x0A02 -#define GL_CURRENT_COLOR 0x0B00 -#define GL_CURRENT_INDEX 0x0B01 -#define GL_CURRENT_NORMAL 0x0B02 -#define GL_CURRENT_TEXTURE_COORDS 0x0B03 -#define GL_CURRENT_RASTER_COLOR 0x0B04 -#define GL_CURRENT_RASTER_INDEX 0x0B05 -#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 -#define GL_CURRENT_RASTER_POSITION 0x0B07 -#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 -#define GL_CURRENT_RASTER_DISTANCE 0x0B09 -#define GL_POINT_SMOOTH 0x0B10 -#define GL_POINT_SIZE 0x0B11 -#define GL_POINT_SIZE_RANGE 0x0B12 -#define GL_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_LINE_SMOOTH 0x0B20 -#define GL_LINE_WIDTH 0x0B21 -#define GL_LINE_WIDTH_RANGE 0x0B22 -#define GL_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_LINE_STIPPLE 0x0B24 -#define GL_LINE_STIPPLE_PATTERN 0x0B25 -#define GL_LINE_STIPPLE_REPEAT 0x0B26 -#define GL_LIST_MODE 0x0B30 -#define GL_MAX_LIST_NESTING 0x0B31 -#define GL_LIST_BASE 0x0B32 -#define GL_LIST_INDEX 0x0B33 -#define GL_POLYGON_MODE 0x0B40 -#define GL_POLYGON_SMOOTH 0x0B41 -#define GL_POLYGON_STIPPLE 0x0B42 -#define GL_EDGE_FLAG 0x0B43 -#define GL_CULL_FACE 0x0B44 -#define GL_CULL_FACE_MODE 0x0B45 -#define GL_FRONT_FACE 0x0B46 -#define GL_LIGHTING 0x0B50 -#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 -#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 -#define GL_LIGHT_MODEL_AMBIENT 0x0B53 -#define GL_SHADE_MODEL 0x0B54 -#define GL_COLOR_MATERIAL_FACE 0x0B55 -#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 -#define GL_COLOR_MATERIAL 0x0B57 -#define GL_FOG 0x0B60 -#define GL_FOG_INDEX 0x0B61 -#define GL_FOG_DENSITY 0x0B62 -#define GL_FOG_START 0x0B63 -#define GL_FOG_END 0x0B64 -#define GL_FOG_MODE 0x0B65 -#define GL_FOG_COLOR 0x0B66 -#define GL_DEPTH_RANGE 0x0B70 -#define GL_DEPTH_TEST 0x0B71 -#define GL_DEPTH_WRITEMASK 0x0B72 -#define GL_DEPTH_CLEAR_VALUE 0x0B73 -#define GL_DEPTH_FUNC 0x0B74 -#define GL_ACCUM_CLEAR_VALUE 0x0B80 -#define GL_STENCIL_TEST 0x0B90 -#define GL_STENCIL_CLEAR_VALUE 0x0B91 -#define GL_STENCIL_FUNC 0x0B92 -#define GL_STENCIL_VALUE_MASK 0x0B93 -#define GL_STENCIL_FAIL 0x0B94 -#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 -#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 -#define GL_STENCIL_REF 0x0B97 -#define GL_STENCIL_WRITEMASK 0x0B98 -#define GL_MATRIX_MODE 0x0BA0 -#define GL_NORMALIZE 0x0BA1 -#define GL_VIEWPORT 0x0BA2 -#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 -#define GL_PROJECTION_STACK_DEPTH 0x0BA4 -#define GL_TEXTURE_STACK_DEPTH 0x0BA5 -#define GL_MODELVIEW_MATRIX 0x0BA6 -#define GL_PROJECTION_MATRIX 0x0BA7 -#define GL_TEXTURE_MATRIX 0x0BA8 -#define GL_ATTRIB_STACK_DEPTH 0x0BB0 -#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 -#define GL_ALPHA_TEST 0x0BC0 -#define GL_ALPHA_TEST_FUNC 0x0BC1 -#define GL_ALPHA_TEST_REF 0x0BC2 -#define GL_DITHER 0x0BD0 -#define GL_BLEND_DST 0x0BE0 -#define GL_BLEND_SRC 0x0BE1 -#define GL_BLEND 0x0BE2 -#define GL_LOGIC_OP_MODE 0x0BF0 -#define GL_INDEX_LOGIC_OP 0x0BF1 -#define GL_COLOR_LOGIC_OP 0x0BF2 -#define GL_AUX_BUFFERS 0x0C00 -#define GL_DRAW_BUFFER 0x0C01 -#define GL_READ_BUFFER 0x0C02 -#define GL_SCISSOR_BOX 0x0C10 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_INDEX_CLEAR_VALUE 0x0C20 -#define GL_INDEX_WRITEMASK 0x0C21 -#define GL_COLOR_CLEAR_VALUE 0x0C22 -#define GL_COLOR_WRITEMASK 0x0C23 -#define GL_INDEX_MODE 0x0C30 -#define GL_RGBA_MODE 0x0C31 -#define GL_DOUBLEBUFFER 0x0C32 -#define GL_STEREO 0x0C33 -#define GL_RENDER_MODE 0x0C40 -#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 -#define GL_POINT_SMOOTH_HINT 0x0C51 -#define GL_LINE_SMOOTH_HINT 0x0C52 -#define GL_POLYGON_SMOOTH_HINT 0x0C53 -#define GL_FOG_HINT 0x0C54 -#define GL_TEXTURE_GEN_S 0x0C60 -#define GL_TEXTURE_GEN_T 0x0C61 -#define GL_TEXTURE_GEN_R 0x0C62 -#define GL_TEXTURE_GEN_Q 0x0C63 -#define GL_PIXEL_MAP_I_TO_I 0x0C70 -#define GL_PIXEL_MAP_S_TO_S 0x0C71 -#define GL_PIXEL_MAP_I_TO_R 0x0C72 -#define GL_PIXEL_MAP_I_TO_G 0x0C73 -#define GL_PIXEL_MAP_I_TO_B 0x0C74 -#define GL_PIXEL_MAP_I_TO_A 0x0C75 -#define GL_PIXEL_MAP_R_TO_R 0x0C76 -#define GL_PIXEL_MAP_G_TO_G 0x0C77 -#define GL_PIXEL_MAP_B_TO_B 0x0C78 -#define GL_PIXEL_MAP_A_TO_A 0x0C79 -#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 -#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 -#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 -#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 -#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 -#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 -#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 -#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 -#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 -#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 -#define GL_UNPACK_SWAP_BYTES 0x0CF0 -#define GL_UNPACK_LSB_FIRST 0x0CF1 -#define GL_UNPACK_ROW_LENGTH 0x0CF2 -#define GL_UNPACK_SKIP_ROWS 0x0CF3 -#define GL_UNPACK_SKIP_PIXELS 0x0CF4 -#define GL_UNPACK_ALIGNMENT 0x0CF5 -#define GL_PACK_SWAP_BYTES 0x0D00 -#define GL_PACK_LSB_FIRST 0x0D01 -#define GL_PACK_ROW_LENGTH 0x0D02 -#define GL_PACK_SKIP_ROWS 0x0D03 -#define GL_PACK_SKIP_PIXELS 0x0D04 -#define GL_PACK_ALIGNMENT 0x0D05 -#define GL_MAP_COLOR 0x0D10 -#define GL_MAP_STENCIL 0x0D11 -#define GL_INDEX_SHIFT 0x0D12 -#define GL_INDEX_OFFSET 0x0D13 -#define GL_RED_SCALE 0x0D14 -#define GL_RED_BIAS 0x0D15 -#define GL_ZOOM_X 0x0D16 -#define GL_ZOOM_Y 0x0D17 -#define GL_GREEN_SCALE 0x0D18 -#define GL_GREEN_BIAS 0x0D19 -#define GL_BLUE_SCALE 0x0D1A -#define GL_BLUE_BIAS 0x0D1B -#define GL_ALPHA_SCALE 0x0D1C -#define GL_ALPHA_BIAS 0x0D1D -#define GL_DEPTH_SCALE 0x0D1E -#define GL_DEPTH_BIAS 0x0D1F -#define GL_MAX_EVAL_ORDER 0x0D30 -#define GL_MAX_LIGHTS 0x0D31 -#define GL_MAX_CLIP_PLANES 0x0D32 -#define GL_MAX_TEXTURE_SIZE 0x0D33 -#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 -#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 -#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 -#define GL_MAX_NAME_STACK_DEPTH 0x0D37 -#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 -#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 -#define GL_MAX_VIEWPORT_DIMS 0x0D3A -#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B -#define GL_SUBPIXEL_BITS 0x0D50 -#define GL_INDEX_BITS 0x0D51 -#define GL_RED_BITS 0x0D52 -#define GL_GREEN_BITS 0x0D53 -#define GL_BLUE_BITS 0x0D54 -#define GL_ALPHA_BITS 0x0D55 -#define GL_DEPTH_BITS 0x0D56 -#define GL_STENCIL_BITS 0x0D57 -#define GL_ACCUM_RED_BITS 0x0D58 -#define GL_ACCUM_GREEN_BITS 0x0D59 -#define GL_ACCUM_BLUE_BITS 0x0D5A -#define GL_ACCUM_ALPHA_BITS 0x0D5B -#define GL_NAME_STACK_DEPTH 0x0D70 -#define GL_AUTO_NORMAL 0x0D80 -#define GL_MAP1_COLOR_4 0x0D90 -#define GL_MAP1_INDEX 0x0D91 -#define GL_MAP1_NORMAL 0x0D92 -#define GL_MAP1_TEXTURE_COORD_1 0x0D93 -#define GL_MAP1_TEXTURE_COORD_2 0x0D94 -#define GL_MAP1_TEXTURE_COORD_3 0x0D95 -#define GL_MAP1_TEXTURE_COORD_4 0x0D96 -#define GL_MAP1_VERTEX_3 0x0D97 -#define GL_MAP1_VERTEX_4 0x0D98 -#define GL_MAP2_COLOR_4 0x0DB0 -#define GL_MAP2_INDEX 0x0DB1 -#define GL_MAP2_NORMAL 0x0DB2 -#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 -#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 -#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 -#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 -#define GL_MAP2_VERTEX_3 0x0DB7 -#define GL_MAP2_VERTEX_4 0x0DB8 -#define GL_MAP1_GRID_DOMAIN 0x0DD0 -#define GL_MAP1_GRID_SEGMENTS 0x0DD1 -#define GL_MAP2_GRID_DOMAIN 0x0DD2 -#define GL_MAP2_GRID_SEGMENTS 0x0DD3 -#define GL_TEXTURE_1D 0x0DE0 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 -#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 -#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 -#define GL_SELECTION_BUFFER_POINTER 0x0DF3 -#define GL_SELECTION_BUFFER_SIZE 0x0DF4 -#define GL_TEXTURE_WIDTH 0x1000 -#define GL_TRANSFORM_BIT 0x00001000 -#define GL_TEXTURE_HEIGHT 0x1001 -#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 -#define GL_TEXTURE_BORDER_COLOR 0x1004 -#define GL_TEXTURE_BORDER 0x1005 -#define GL_DONT_CARE 0x1100 -#define GL_FASTEST 0x1101 -#define GL_NICEST 0x1102 -#define GL_AMBIENT 0x1200 -#define GL_DIFFUSE 0x1201 -#define GL_SPECULAR 0x1202 -#define GL_POSITION 0x1203 -#define GL_SPOT_DIRECTION 0x1204 -#define GL_SPOT_EXPONENT 0x1205 -#define GL_SPOT_CUTOFF 0x1206 -#define GL_CONSTANT_ATTENUATION 0x1207 -#define GL_LINEAR_ATTENUATION 0x1208 -#define GL_QUADRATIC_ATTENUATION 0x1209 -#define GL_COMPILE 0x1300 -#define GL_COMPILE_AND_EXECUTE 0x1301 -#define GL_BYTE 0x1400 -#define GL_UNSIGNED_BYTE 0x1401 -#define GL_SHORT 0x1402 -#define GL_UNSIGNED_SHORT 0x1403 -#define GL_INT 0x1404 -#define GL_UNSIGNED_INT 0x1405 -#define GL_FLOAT 0x1406 -#define GL_2_BYTES 0x1407 -#define GL_3_BYTES 0x1408 -#define GL_4_BYTES 0x1409 -#define GL_DOUBLE 0x140A -#define GL_CLEAR 0x1500 -#define GL_AND 0x1501 -#define GL_AND_REVERSE 0x1502 -#define GL_COPY 0x1503 -#define GL_AND_INVERTED 0x1504 -#define GL_NOOP 0x1505 -#define GL_XOR 0x1506 -#define GL_OR 0x1507 -#define GL_NOR 0x1508 -#define GL_EQUIV 0x1509 -#define GL_INVERT 0x150A -#define GL_OR_REVERSE 0x150B -#define GL_COPY_INVERTED 0x150C -#define GL_OR_INVERTED 0x150D -#define GL_NAND 0x150E -#define GL_SET 0x150F -#define GL_EMISSION 0x1600 -#define GL_SHININESS 0x1601 -#define GL_AMBIENT_AND_DIFFUSE 0x1602 -#define GL_COLOR_INDEXES 0x1603 -#define GL_MODELVIEW 0x1700 -#define GL_PROJECTION 0x1701 -#define GL_TEXTURE 0x1702 -#define GL_COLOR 0x1800 -#define GL_DEPTH 0x1801 -#define GL_STENCIL 0x1802 -#define GL_COLOR_INDEX 0x1900 -#define GL_STENCIL_INDEX 0x1901 -#define GL_DEPTH_COMPONENT 0x1902 -#define GL_RED 0x1903 -#define GL_GREEN 0x1904 -#define GL_BLUE 0x1905 -#define GL_ALPHA 0x1906 -#define GL_RGB 0x1907 -#define GL_RGBA 0x1908 -#define GL_LUMINANCE 0x1909 -#define GL_LUMINANCE_ALPHA 0x190A -#define GL_BITMAP 0x1A00 -#define GL_POINT 0x1B00 -#define GL_LINE 0x1B01 -#define GL_FILL 0x1B02 -#define GL_RENDER 0x1C00 -#define GL_FEEDBACK 0x1C01 -#define GL_SELECT 0x1C02 -#define GL_FLAT 0x1D00 -#define GL_SMOOTH 0x1D01 -#define GL_KEEP 0x1E00 -#define GL_REPLACE 0x1E01 -#define GL_INCR 0x1E02 -#define GL_DECR 0x1E03 -#define GL_VENDOR 0x1F00 -#define GL_RENDERER 0x1F01 -#define GL_VERSION 0x1F02 -#define GL_EXTENSIONS 0x1F03 -#define GL_S 0x2000 -#define GL_ENABLE_BIT 0x00002000 -#define GL_T 0x2001 -#define GL_R 0x2002 -#define GL_Q 0x2003 -#define GL_MODULATE 0x2100 -#define GL_DECAL 0x2101 -#define GL_TEXTURE_ENV_MODE 0x2200 -#define GL_TEXTURE_ENV_COLOR 0x2201 -#define GL_TEXTURE_ENV 0x2300 -#define GL_EYE_LINEAR 0x2400 -#define GL_OBJECT_LINEAR 0x2401 -#define GL_SPHERE_MAP 0x2402 -#define GL_TEXTURE_GEN_MODE 0x2500 -#define GL_OBJECT_PLANE 0x2501 -#define GL_EYE_PLANE 0x2502 -#define GL_NEAREST 0x2600 -#define GL_LINEAR 0x2601 -#define GL_NEAREST_MIPMAP_NEAREST 0x2700 -#define GL_LINEAR_MIPMAP_NEAREST 0x2701 -#define GL_NEAREST_MIPMAP_LINEAR 0x2702 -#define GL_LINEAR_MIPMAP_LINEAR 0x2703 -#define GL_TEXTURE_MAG_FILTER 0x2800 -#define GL_TEXTURE_MIN_FILTER 0x2801 -#define GL_TEXTURE_WRAP_S 0x2802 -#define GL_TEXTURE_WRAP_T 0x2803 -#define GL_CLAMP 0x2900 -#define GL_REPEAT 0x2901 -#define GL_POLYGON_OFFSET_UNITS 0x2A00 -#define GL_POLYGON_OFFSET_POINT 0x2A01 -#define GL_POLYGON_OFFSET_LINE 0x2A02 -#define GL_R3_G3_B2 0x2A10 -#define GL_V2F 0x2A20 -#define GL_V3F 0x2A21 -#define GL_C4UB_V2F 0x2A22 -#define GL_C4UB_V3F 0x2A23 -#define GL_C3F_V3F 0x2A24 -#define GL_N3F_V3F 0x2A25 -#define GL_C4F_N3F_V3F 0x2A26 -#define GL_T2F_V3F 0x2A27 -#define GL_T4F_V4F 0x2A28 -#define GL_T2F_C4UB_V3F 0x2A29 -#define GL_T2F_C3F_V3F 0x2A2A -#define GL_T2F_N3F_V3F 0x2A2B -#define GL_T2F_C4F_N3F_V3F 0x2A2C -#define GL_T4F_C4F_N3F_V4F 0x2A2D -#define GL_CLIP_PLANE0 0x3000 -#define GL_CLIP_PLANE1 0x3001 -#define GL_CLIP_PLANE2 0x3002 -#define GL_CLIP_PLANE3 0x3003 -#define GL_CLIP_PLANE4 0x3004 -#define GL_CLIP_PLANE5 0x3005 -#define GL_LIGHT0 0x4000 -#define GL_COLOR_BUFFER_BIT 0x00004000 -#define GL_LIGHT1 0x4001 -#define GL_LIGHT2 0x4002 -#define GL_LIGHT3 0x4003 -#define GL_LIGHT4 0x4004 -#define GL_LIGHT5 0x4005 -#define GL_LIGHT6 0x4006 -#define GL_LIGHT7 0x4007 -#define GL_HINT_BIT 0x00008000 -#define GL_POLYGON_OFFSET_FILL 0x8037 -#define GL_POLYGON_OFFSET_FACTOR 0x8038 -#define GL_ALPHA4 0x803B -#define GL_ALPHA8 0x803C -#define GL_ALPHA12 0x803D -#define GL_ALPHA16 0x803E -#define GL_LUMINANCE4 0x803F -#define GL_LUMINANCE8 0x8040 -#define GL_LUMINANCE12 0x8041 -#define GL_LUMINANCE16 0x8042 -#define GL_LUMINANCE4_ALPHA4 0x8043 -#define GL_LUMINANCE6_ALPHA2 0x8044 -#define GL_LUMINANCE8_ALPHA8 0x8045 -#define GL_LUMINANCE12_ALPHA4 0x8046 -#define GL_LUMINANCE12_ALPHA12 0x8047 -#define GL_LUMINANCE16_ALPHA16 0x8048 -#define GL_INTENSITY 0x8049 -#define GL_INTENSITY4 0x804A -#define GL_INTENSITY8 0x804B -#define GL_INTENSITY12 0x804C -#define GL_INTENSITY16 0x804D -#define GL_RGB4 0x804F -#define GL_RGB5 0x8050 -#define GL_RGB8 0x8051 -#define GL_RGB10 0x8052 -#define GL_RGB12 0x8053 -#define GL_RGB16 0x8054 -#define GL_RGBA2 0x8055 -#define GL_RGBA4 0x8056 -#define GL_RGB5_A1 0x8057 -#define GL_RGBA8 0x8058 -#define GL_RGB10_A2 0x8059 -#define GL_RGBA12 0x805A -#define GL_RGBA16 0x805B -#define GL_TEXTURE_RED_SIZE 0x805C -#define GL_TEXTURE_GREEN_SIZE 0x805D -#define GL_TEXTURE_BLUE_SIZE 0x805E -#define GL_TEXTURE_ALPHA_SIZE 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE 0x8061 -#define GL_PROXY_TEXTURE_1D 0x8063 -#define GL_PROXY_TEXTURE_2D 0x8064 -#define GL_TEXTURE_PRIORITY 0x8066 -#define GL_TEXTURE_RESIDENT 0x8067 -#define GL_TEXTURE_BINDING_1D 0x8068 -#define GL_TEXTURE_BINDING_2D 0x8069 -#define GL_VERTEX_ARRAY 0x8074 -#define GL_NORMAL_ARRAY 0x8075 -#define GL_COLOR_ARRAY 0x8076 -#define GL_INDEX_ARRAY 0x8077 -#define GL_TEXTURE_COORD_ARRAY 0x8078 -#define GL_EDGE_FLAG_ARRAY 0x8079 -#define GL_VERTEX_ARRAY_SIZE 0x807A -#define GL_VERTEX_ARRAY_TYPE 0x807B -#define GL_VERTEX_ARRAY_STRIDE 0x807C -#define GL_NORMAL_ARRAY_TYPE 0x807E -#define GL_NORMAL_ARRAY_STRIDE 0x807F -#define GL_COLOR_ARRAY_SIZE 0x8081 -#define GL_COLOR_ARRAY_TYPE 0x8082 -#define GL_COLOR_ARRAY_STRIDE 0x8083 -#define GL_INDEX_ARRAY_TYPE 0x8085 -#define GL_INDEX_ARRAY_STRIDE 0x8086 -#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A -#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C -#define GL_VERTEX_ARRAY_POINTER 0x808E -#define GL_NORMAL_ARRAY_POINTER 0x808F -#define GL_COLOR_ARRAY_POINTER 0x8090 -#define GL_INDEX_ARRAY_POINTER 0x8091 -#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 -#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 -#define GL_COLOR_INDEX1_EXT 0x80E2 -#define GL_COLOR_INDEX2_EXT 0x80E3 -#define GL_COLOR_INDEX4_EXT 0x80E4 -#define GL_COLOR_INDEX8_EXT 0x80E5 -#define GL_COLOR_INDEX12_EXT 0x80E6 -#define GL_COLOR_INDEX16_EXT 0x80E7 -#define GL_EVAL_BIT 0x00010000 -#define GL_LIST_BIT 0x00020000 -#define GL_TEXTURE_BIT 0x00040000 -#define GL_SCISSOR_BIT 0x00080000 -#define GL_ALL_ATTRIB_BITS 0x000fffff -#define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff - -GLAPI void GLAPIENTRY glAccum (GLenum op, GLfloat value); -GLAPI void GLAPIENTRY glAlphaFunc (GLenum func, GLclampf ref); -GLAPI GLboolean GLAPIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences); -GLAPI void GLAPIENTRY glArrayElement (GLint i); -GLAPI void GLAPIENTRY glBegin (GLenum mode); -GLAPI void GLAPIENTRY glBindTexture (GLenum target, GLuint texture); -GLAPI void GLAPIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); -GLAPI void GLAPIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); -GLAPI void GLAPIENTRY glCallList (GLuint list); -GLAPI void GLAPIENTRY glCallLists (GLsizei n, GLenum type, const void *lists); -GLAPI void GLAPIENTRY glClear (GLbitfield mask); -GLAPI void GLAPIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -GLAPI void GLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -GLAPI void GLAPIENTRY glClearDepth (GLclampd depth); -GLAPI void GLAPIENTRY glClearIndex (GLfloat c); -GLAPI void GLAPIENTRY glClearStencil (GLint s); -GLAPI void GLAPIENTRY glClipPlane (GLenum plane, const GLdouble *equation); -GLAPI void GLAPIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue); -GLAPI void GLAPIENTRY glColor3bv (const GLbyte *v); -GLAPI void GLAPIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue); -GLAPI void GLAPIENTRY glColor3dv (const GLdouble *v); -GLAPI void GLAPIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue); -GLAPI void GLAPIENTRY glColor3fv (const GLfloat *v); -GLAPI void GLAPIENTRY glColor3i (GLint red, GLint green, GLint blue); -GLAPI void GLAPIENTRY glColor3iv (const GLint *v); -GLAPI void GLAPIENTRY glColor3s (GLshort red, GLshort green, GLshort blue); -GLAPI void GLAPIENTRY glColor3sv (const GLshort *v); -GLAPI void GLAPIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue); -GLAPI void GLAPIENTRY glColor3ubv (const GLubyte *v); -GLAPI void GLAPIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue); -GLAPI void GLAPIENTRY glColor3uiv (const GLuint *v); -GLAPI void GLAPIENTRY glColor3us (GLushort red, GLushort green, GLushort blue); -GLAPI void GLAPIENTRY glColor3usv (const GLushort *v); -GLAPI void GLAPIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); -GLAPI void GLAPIENTRY glColor4bv (const GLbyte *v); -GLAPI void GLAPIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); -GLAPI void GLAPIENTRY glColor4dv (const GLdouble *v); -GLAPI void GLAPIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -GLAPI void GLAPIENTRY glColor4fv (const GLfloat *v); -GLAPI void GLAPIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha); -GLAPI void GLAPIENTRY glColor4iv (const GLint *v); -GLAPI void GLAPIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha); -GLAPI void GLAPIENTRY glColor4sv (const GLshort *v); -GLAPI void GLAPIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); -GLAPI void GLAPIENTRY glColor4ubv (const GLubyte *v); -GLAPI void GLAPIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha); -GLAPI void GLAPIENTRY glColor4uiv (const GLuint *v); -GLAPI void GLAPIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha); -GLAPI void GLAPIENTRY glColor4usv (const GLushort *v); -GLAPI void GLAPIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -GLAPI void GLAPIENTRY glColorMaterial (GLenum face, GLenum mode); -GLAPI void GLAPIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); -GLAPI void GLAPIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); -GLAPI void GLAPIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); -GLAPI void GLAPIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GLAPI void GLAPIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI void GLAPIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void GLAPIENTRY glCullFace (GLenum mode); -GLAPI void GLAPIENTRY glDeleteLists (GLuint list, GLsizei range); -GLAPI void GLAPIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); -GLAPI void GLAPIENTRY glDepthFunc (GLenum func); -GLAPI void GLAPIENTRY glDepthMask (GLboolean flag); -GLAPI void GLAPIENTRY glDepthRange (GLclampd zNear, GLclampd zFar); -GLAPI void GLAPIENTRY glDisable (GLenum cap); -GLAPI void GLAPIENTRY glDisableClientState (GLenum array); -GLAPI void GLAPIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); -GLAPI void GLAPIENTRY glDrawBuffer (GLenum mode); -GLAPI void GLAPIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices); -GLAPI void GLAPIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -GLAPI void GLAPIENTRY glEdgeFlag (GLboolean flag); -GLAPI void GLAPIENTRY glEdgeFlagPointer (GLsizei stride, const void *pointer); -GLAPI void GLAPIENTRY glEdgeFlagv (const GLboolean *flag); -GLAPI void GLAPIENTRY glEnable (GLenum cap); -GLAPI void GLAPIENTRY glEnableClientState (GLenum array); -GLAPI void GLAPIENTRY glEnd (void); -GLAPI void GLAPIENTRY glEndList (void); -GLAPI void GLAPIENTRY glEvalCoord1d (GLdouble u); -GLAPI void GLAPIENTRY glEvalCoord1dv (const GLdouble *u); -GLAPI void GLAPIENTRY glEvalCoord1f (GLfloat u); -GLAPI void GLAPIENTRY glEvalCoord1fv (const GLfloat *u); -GLAPI void GLAPIENTRY glEvalCoord2d (GLdouble u, GLdouble v); -GLAPI void GLAPIENTRY glEvalCoord2dv (const GLdouble *u); -GLAPI void GLAPIENTRY glEvalCoord2f (GLfloat u, GLfloat v); -GLAPI void GLAPIENTRY glEvalCoord2fv (const GLfloat *u); -GLAPI void GLAPIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2); -GLAPI void GLAPIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); -GLAPI void GLAPIENTRY glEvalPoint1 (GLint i); -GLAPI void GLAPIENTRY glEvalPoint2 (GLint i, GLint j); -GLAPI void GLAPIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer); -GLAPI void GLAPIENTRY glFinish (void); -GLAPI void GLAPIENTRY glFlush (void); -GLAPI void GLAPIENTRY glFogf (GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glFogfv (GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glFogi (GLenum pname, GLint param); -GLAPI void GLAPIENTRY glFogiv (GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glFrontFace (GLenum mode); -GLAPI void GLAPIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLAPI GLuint GLAPIENTRY glGenLists (GLsizei range); -GLAPI void GLAPIENTRY glGenTextures (GLsizei n, GLuint *textures); -GLAPI void GLAPIENTRY glGetBooleanv (GLenum pname, GLboolean *params); -GLAPI void GLAPIENTRY glGetClipPlane (GLenum plane, GLdouble *equation); -GLAPI void GLAPIENTRY glGetDoublev (GLenum pname, GLdouble *params); -GLAPI GLenum GLAPIENTRY glGetError (void); -GLAPI void GLAPIENTRY glGetFloatv (GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetIntegerv (GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v); -GLAPI void GLAPIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v); -GLAPI void GLAPIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v); -GLAPI void GLAPIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetPixelMapfv (GLenum map, GLfloat *values); -GLAPI void GLAPIENTRY glGetPixelMapuiv (GLenum map, GLuint *values); -GLAPI void GLAPIENTRY glGetPixelMapusv (GLenum map, GLushort *values); -GLAPI void GLAPIENTRY glGetPointerv (GLenum pname, void* *params); -GLAPI void GLAPIENTRY glGetPolygonStipple (GLubyte *mask); -GLAPI const GLubyte * GLAPIENTRY glGetString (GLenum name); -GLAPI void GLAPIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params); -GLAPI void GLAPIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, void *pixels); -GLAPI void GLAPIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glHint (GLenum target, GLenum mode); -GLAPI void GLAPIENTRY glIndexMask (GLuint mask); -GLAPI void GLAPIENTRY glIndexPointer (GLenum type, GLsizei stride, const void *pointer); -GLAPI void GLAPIENTRY glIndexd (GLdouble c); -GLAPI void GLAPIENTRY glIndexdv (const GLdouble *c); -GLAPI void GLAPIENTRY glIndexf (GLfloat c); -GLAPI void GLAPIENTRY glIndexfv (const GLfloat *c); -GLAPI void GLAPIENTRY glIndexi (GLint c); -GLAPI void GLAPIENTRY glIndexiv (const GLint *c); -GLAPI void GLAPIENTRY glIndexs (GLshort c); -GLAPI void GLAPIENTRY glIndexsv (const GLshort *c); -GLAPI void GLAPIENTRY glIndexub (GLubyte c); -GLAPI void GLAPIENTRY glIndexubv (const GLubyte *c); -GLAPI void GLAPIENTRY glInitNames (void); -GLAPI void GLAPIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const void *pointer); -GLAPI GLboolean GLAPIENTRY glIsEnabled (GLenum cap); -GLAPI GLboolean GLAPIENTRY glIsList (GLuint list); -GLAPI GLboolean GLAPIENTRY glIsTexture (GLuint texture); -GLAPI void GLAPIENTRY glLightModelf (GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glLightModelfv (GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glLightModeli (GLenum pname, GLint param); -GLAPI void GLAPIENTRY glLightModeliv (GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glLightf (GLenum light, GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glLighti (GLenum light, GLenum pname, GLint param); -GLAPI void GLAPIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glLineStipple (GLint factor, GLushort pattern); -GLAPI void GLAPIENTRY glLineWidth (GLfloat width); -GLAPI void GLAPIENTRY glListBase (GLuint base); -GLAPI void GLAPIENTRY glLoadIdentity (void); -GLAPI void GLAPIENTRY glLoadMatrixd (const GLdouble *m); -GLAPI void GLAPIENTRY glLoadMatrixf (const GLfloat *m); -GLAPI void GLAPIENTRY glLoadName (GLuint name); -GLAPI void GLAPIENTRY glLogicOp (GLenum opcode); -GLAPI void GLAPIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -GLAPI void GLAPIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -GLAPI void GLAPIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -GLAPI void GLAPIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -GLAPI void GLAPIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2); -GLAPI void GLAPIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2); -GLAPI void GLAPIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); -GLAPI void GLAPIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); -GLAPI void GLAPIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glMateriali (GLenum face, GLenum pname, GLint param); -GLAPI void GLAPIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glMatrixMode (GLenum mode); -GLAPI void GLAPIENTRY glMultMatrixd (const GLdouble *m); -GLAPI void GLAPIENTRY glMultMatrixf (const GLfloat *m); -GLAPI void GLAPIENTRY glNewList (GLuint list, GLenum mode); -GLAPI void GLAPIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz); -GLAPI void GLAPIENTRY glNormal3bv (const GLbyte *v); -GLAPI void GLAPIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz); -GLAPI void GLAPIENTRY glNormal3dv (const GLdouble *v); -GLAPI void GLAPIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz); -GLAPI void GLAPIENTRY glNormal3fv (const GLfloat *v); -GLAPI void GLAPIENTRY glNormal3i (GLint nx, GLint ny, GLint nz); -GLAPI void GLAPIENTRY glNormal3iv (const GLint *v); -GLAPI void GLAPIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz); -GLAPI void GLAPIENTRY glNormal3sv (const GLshort *v); -GLAPI void GLAPIENTRY glNormalPointer (GLenum type, GLsizei stride, const void *pointer); -GLAPI void GLAPIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLAPI void GLAPIENTRY glPassThrough (GLfloat token); -GLAPI void GLAPIENTRY glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values); -GLAPI void GLAPIENTRY glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values); -GLAPI void GLAPIENTRY glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values); -GLAPI void GLAPIENTRY glPixelStoref (GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glPixelStorei (GLenum pname, GLint param); -GLAPI void GLAPIENTRY glPixelTransferf (GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glPixelTransferi (GLenum pname, GLint param); -GLAPI void GLAPIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor); -GLAPI void GLAPIENTRY glPointSize (GLfloat size); -GLAPI void GLAPIENTRY glPolygonMode (GLenum face, GLenum mode); -GLAPI void GLAPIENTRY glPolygonOffset (GLfloat factor, GLfloat units); -GLAPI void GLAPIENTRY glPolygonStipple (const GLubyte *mask); -GLAPI void GLAPIENTRY glPopAttrib (void); -GLAPI void GLAPIENTRY glPopClientAttrib (void); -GLAPI void GLAPIENTRY glPopMatrix (void); -GLAPI void GLAPIENTRY glPopName (void); -GLAPI void GLAPIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities); -GLAPI void GLAPIENTRY glPushAttrib (GLbitfield mask); -GLAPI void GLAPIENTRY glPushClientAttrib (GLbitfield mask); -GLAPI void GLAPIENTRY glPushMatrix (void); -GLAPI void GLAPIENTRY glPushName (GLuint name); -GLAPI void GLAPIENTRY glRasterPos2d (GLdouble x, GLdouble y); -GLAPI void GLAPIENTRY glRasterPos2dv (const GLdouble *v); -GLAPI void GLAPIENTRY glRasterPos2f (GLfloat x, GLfloat y); -GLAPI void GLAPIENTRY glRasterPos2fv (const GLfloat *v); -GLAPI void GLAPIENTRY glRasterPos2i (GLint x, GLint y); -GLAPI void GLAPIENTRY glRasterPos2iv (const GLint *v); -GLAPI void GLAPIENTRY glRasterPos2s (GLshort x, GLshort y); -GLAPI void GLAPIENTRY glRasterPos2sv (const GLshort *v); -GLAPI void GLAPIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z); -GLAPI void GLAPIENTRY glRasterPos3dv (const GLdouble *v); -GLAPI void GLAPIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z); -GLAPI void GLAPIENTRY glRasterPos3fv (const GLfloat *v); -GLAPI void GLAPIENTRY glRasterPos3i (GLint x, GLint y, GLint z); -GLAPI void GLAPIENTRY glRasterPos3iv (const GLint *v); -GLAPI void GLAPIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z); -GLAPI void GLAPIENTRY glRasterPos3sv (const GLshort *v); -GLAPI void GLAPIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void GLAPIENTRY glRasterPos4dv (const GLdouble *v); -GLAPI void GLAPIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void GLAPIENTRY glRasterPos4fv (const GLfloat *v); -GLAPI void GLAPIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w); -GLAPI void GLAPIENTRY glRasterPos4iv (const GLint *v); -GLAPI void GLAPIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void GLAPIENTRY glRasterPos4sv (const GLshort *v); -GLAPI void GLAPIENTRY glReadBuffer (GLenum mode); -GLAPI void GLAPIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); -GLAPI void GLAPIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); -GLAPI void GLAPIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2); -GLAPI void GLAPIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); -GLAPI void GLAPIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2); -GLAPI void GLAPIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2); -GLAPI void GLAPIENTRY glRectiv (const GLint *v1, const GLint *v2); -GLAPI void GLAPIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2); -GLAPI void GLAPIENTRY glRectsv (const GLshort *v1, const GLshort *v2); -GLAPI GLint GLAPIENTRY glRenderMode (GLenum mode); -GLAPI void GLAPIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -GLAPI void GLAPIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -GLAPI void GLAPIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z); -GLAPI void GLAPIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z); -GLAPI void GLAPIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void GLAPIENTRY glSelectBuffer (GLsizei size, GLuint *buffer); -GLAPI void GLAPIENTRY glShadeModel (GLenum mode); -GLAPI void GLAPIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); -GLAPI void GLAPIENTRY glStencilMask (GLuint mask); -GLAPI void GLAPIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); -GLAPI void GLAPIENTRY glTexCoord1d (GLdouble s); -GLAPI void GLAPIENTRY glTexCoord1dv (const GLdouble *v); -GLAPI void GLAPIENTRY glTexCoord1f (GLfloat s); -GLAPI void GLAPIENTRY glTexCoord1fv (const GLfloat *v); -GLAPI void GLAPIENTRY glTexCoord1i (GLint s); -GLAPI void GLAPIENTRY glTexCoord1iv (const GLint *v); -GLAPI void GLAPIENTRY glTexCoord1s (GLshort s); -GLAPI void GLAPIENTRY glTexCoord1sv (const GLshort *v); -GLAPI void GLAPIENTRY glTexCoord2d (GLdouble s, GLdouble t); -GLAPI void GLAPIENTRY glTexCoord2dv (const GLdouble *v); -GLAPI void GLAPIENTRY glTexCoord2f (GLfloat s, GLfloat t); -GLAPI void GLAPIENTRY glTexCoord2fv (const GLfloat *v); -GLAPI void GLAPIENTRY glTexCoord2i (GLint s, GLint t); -GLAPI void GLAPIENTRY glTexCoord2iv (const GLint *v); -GLAPI void GLAPIENTRY glTexCoord2s (GLshort s, GLshort t); -GLAPI void GLAPIENTRY glTexCoord2sv (const GLshort *v); -GLAPI void GLAPIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r); -GLAPI void GLAPIENTRY glTexCoord3dv (const GLdouble *v); -GLAPI void GLAPIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r); -GLAPI void GLAPIENTRY glTexCoord3fv (const GLfloat *v); -GLAPI void GLAPIENTRY glTexCoord3i (GLint s, GLint t, GLint r); -GLAPI void GLAPIENTRY glTexCoord3iv (const GLint *v); -GLAPI void GLAPIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r); -GLAPI void GLAPIENTRY glTexCoord3sv (const GLshort *v); -GLAPI void GLAPIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q); -GLAPI void GLAPIENTRY glTexCoord4dv (const GLdouble *v); -GLAPI void GLAPIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q); -GLAPI void GLAPIENTRY glTexCoord4fv (const GLfloat *v); -GLAPI void GLAPIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q); -GLAPI void GLAPIENTRY glTexCoord4iv (const GLint *v); -GLAPI void GLAPIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q); -GLAPI void GLAPIENTRY glTexCoord4sv (const GLshort *v); -GLAPI void GLAPIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); -GLAPI void GLAPIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param); -GLAPI void GLAPIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param); -GLAPI void GLAPIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params); -GLAPI void GLAPIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param); -GLAPI void GLAPIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void GLAPIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void GLAPIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); -GLAPI void GLAPIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -GLAPI void GLAPIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -GLAPI void GLAPIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z); -GLAPI void GLAPIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z); -GLAPI void GLAPIENTRY glVertex2d (GLdouble x, GLdouble y); -GLAPI void GLAPIENTRY glVertex2dv (const GLdouble *v); -GLAPI void GLAPIENTRY glVertex2f (GLfloat x, GLfloat y); -GLAPI void GLAPIENTRY glVertex2fv (const GLfloat *v); -GLAPI void GLAPIENTRY glVertex2i (GLint x, GLint y); -GLAPI void GLAPIENTRY glVertex2iv (const GLint *v); -GLAPI void GLAPIENTRY glVertex2s (GLshort x, GLshort y); -GLAPI void GLAPIENTRY glVertex2sv (const GLshort *v); -GLAPI void GLAPIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z); -GLAPI void GLAPIENTRY glVertex3dv (const GLdouble *v); -GLAPI void GLAPIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z); -GLAPI void GLAPIENTRY glVertex3fv (const GLfloat *v); -GLAPI void GLAPIENTRY glVertex3i (GLint x, GLint y, GLint z); -GLAPI void GLAPIENTRY glVertex3iv (const GLint *v); -GLAPI void GLAPIENTRY glVertex3s (GLshort x, GLshort y, GLshort z); -GLAPI void GLAPIENTRY glVertex3sv (const GLshort *v); -GLAPI void GLAPIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void GLAPIENTRY glVertex4dv (const GLdouble *v); -GLAPI void GLAPIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void GLAPIENTRY glVertex4fv (const GLfloat *v); -GLAPI void GLAPIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w); -GLAPI void GLAPIENTRY glVertex4iv (const GLint *v); -GLAPI void GLAPIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void GLAPIENTRY glVertex4sv (const GLshort *v); -GLAPI void GLAPIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); -GLAPI void GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); - -#define GLEW_VERSION_1_1 GLEW_GET_VAR(__GLEW_VERSION_1_1) - -#endif /* GL_VERSION_1_1 */ - -/* ---------------------------------- GLU ---------------------------------- */ - -#ifndef GLEW_NO_GLU -# ifdef __APPLE__ -# include -# if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) -# define GLEW_NO_GLU -# endif -# endif -#endif - -#ifndef GLEW_NO_GLU -/* this is where we can safely include GLU */ -# if defined(__APPLE__) && defined(__MACH__) -# include -# else -# include -# endif -#endif - -/* ----------------------------- GL_VERSION_1_2 ---------------------------- */ - -#ifndef GL_VERSION_1_2 -#define GL_VERSION_1_2 1 - -#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 -#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 -#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#define GL_RESCALE_NORMAL 0x803A -#define GL_TEXTURE_BINDING_3D 0x806A -#define GL_PACK_SKIP_IMAGES 0x806B -#define GL_PACK_IMAGE_HEIGHT 0x806C -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_TEXTURE_3D 0x806F -#define GL_PROXY_TEXTURE_3D 0x8070 -#define GL_TEXTURE_DEPTH 0x8071 -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_BGR 0x80E0 -#define GL_BGRA 0x80E1 -#define GL_MAX_ELEMENTS_VERTICES 0x80E8 -#define GL_MAX_ELEMENTS_INDICES 0x80E9 -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_MAX_LEVEL 0x813D -#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 -#define GL_SINGLE_COLOR 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR 0x81FA -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_ALIASED_POINT_SIZE_RANGE 0x846D -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E - -typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); -typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); - -#define glCopyTexSubImage3D GLEW_GET_FUN(__glewCopyTexSubImage3D) -#define glDrawRangeElements GLEW_GET_FUN(__glewDrawRangeElements) -#define glTexImage3D GLEW_GET_FUN(__glewTexImage3D) -#define glTexSubImage3D GLEW_GET_FUN(__glewTexSubImage3D) - -#define GLEW_VERSION_1_2 GLEW_GET_VAR(__GLEW_VERSION_1_2) - -#endif /* GL_VERSION_1_2 */ - -/* ---------------------------- GL_VERSION_1_2_1 --------------------------- */ - -#ifndef GL_VERSION_1_2_1 -#define GL_VERSION_1_2_1 1 - -#define GLEW_VERSION_1_2_1 GLEW_GET_VAR(__GLEW_VERSION_1_2_1) - -#endif /* GL_VERSION_1_2_1 */ - -/* ----------------------------- GL_VERSION_1_3 ---------------------------- */ - -#ifndef GL_VERSION_1_3 -#define GL_VERSION_1_3 1 - -#define GL_MULTISAMPLE 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE 0x809F -#define GL_SAMPLE_COVERAGE 0x80A0 -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB -#define GL_CLAMP_TO_BORDER 0x812D -#define GL_TEXTURE0 0x84C0 -#define GL_TEXTURE1 0x84C1 -#define GL_TEXTURE2 0x84C2 -#define GL_TEXTURE3 0x84C3 -#define GL_TEXTURE4 0x84C4 -#define GL_TEXTURE5 0x84C5 -#define GL_TEXTURE6 0x84C6 -#define GL_TEXTURE7 0x84C7 -#define GL_TEXTURE8 0x84C8 -#define GL_TEXTURE9 0x84C9 -#define GL_TEXTURE10 0x84CA -#define GL_TEXTURE11 0x84CB -#define GL_TEXTURE12 0x84CC -#define GL_TEXTURE13 0x84CD -#define GL_TEXTURE14 0x84CE -#define GL_TEXTURE15 0x84CF -#define GL_TEXTURE16 0x84D0 -#define GL_TEXTURE17 0x84D1 -#define GL_TEXTURE18 0x84D2 -#define GL_TEXTURE19 0x84D3 -#define GL_TEXTURE20 0x84D4 -#define GL_TEXTURE21 0x84D5 -#define GL_TEXTURE22 0x84D6 -#define GL_TEXTURE23 0x84D7 -#define GL_TEXTURE24 0x84D8 -#define GL_TEXTURE25 0x84D9 -#define GL_TEXTURE26 0x84DA -#define GL_TEXTURE27 0x84DB -#define GL_TEXTURE28 0x84DC -#define GL_TEXTURE29 0x84DD -#define GL_TEXTURE30 0x84DE -#define GL_TEXTURE31 0x84DF -#define GL_ACTIVE_TEXTURE 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 -#define GL_MAX_TEXTURE_UNITS 0x84E2 -#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 -#define GL_SUBTRACT 0x84E7 -#define GL_COMPRESSED_ALPHA 0x84E9 -#define GL_COMPRESSED_LUMINANCE 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB -#define GL_COMPRESSED_INTENSITY 0x84EC -#define GL_COMPRESSED_RGB 0x84ED -#define GL_COMPRESSED_RGBA 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT 0x84EF -#define GL_NORMAL_MAP 0x8511 -#define GL_REFLECTION_MAP 0x8512 -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C -#define GL_COMBINE 0x8570 -#define GL_COMBINE_RGB 0x8571 -#define GL_COMBINE_ALPHA 0x8572 -#define GL_RGB_SCALE 0x8573 -#define GL_ADD_SIGNED 0x8574 -#define GL_INTERPOLATE 0x8575 -#define GL_CONSTANT 0x8576 -#define GL_PRIMARY_COLOR 0x8577 -#define GL_PREVIOUS 0x8578 -#define GL_SOURCE0_RGB 0x8580 -#define GL_SOURCE1_RGB 0x8581 -#define GL_SOURCE2_RGB 0x8582 -#define GL_SOURCE0_ALPHA 0x8588 -#define GL_SOURCE1_ALPHA 0x8589 -#define GL_SOURCE2_ALPHA 0x858A -#define GL_OPERAND0_RGB 0x8590 -#define GL_OPERAND1_RGB 0x8591 -#define GL_OPERAND2_RGB 0x8592 -#define GL_OPERAND0_ALPHA 0x8598 -#define GL_OPERAND1_ALPHA 0x8599 -#define GL_OPERAND2_ALPHA 0x859A -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 -#define GL_TEXTURE_COMPRESSED 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 -#define GL_DOT3_RGB 0x86AE -#define GL_DOT3_RGBA 0x86AF -#define GL_MULTISAMPLE_BIT 0x20000000 - -typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture); -typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, void *img); -typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); -typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); -typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); -typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); - -#define glActiveTexture GLEW_GET_FUN(__glewActiveTexture) -#define glClientActiveTexture GLEW_GET_FUN(__glewClientActiveTexture) -#define glCompressedTexImage1D GLEW_GET_FUN(__glewCompressedTexImage1D) -#define glCompressedTexImage2D GLEW_GET_FUN(__glewCompressedTexImage2D) -#define glCompressedTexImage3D GLEW_GET_FUN(__glewCompressedTexImage3D) -#define glCompressedTexSubImage1D GLEW_GET_FUN(__glewCompressedTexSubImage1D) -#define glCompressedTexSubImage2D GLEW_GET_FUN(__glewCompressedTexSubImage2D) -#define glCompressedTexSubImage3D GLEW_GET_FUN(__glewCompressedTexSubImage3D) -#define glGetCompressedTexImage GLEW_GET_FUN(__glewGetCompressedTexImage) -#define glLoadTransposeMatrixd GLEW_GET_FUN(__glewLoadTransposeMatrixd) -#define glLoadTransposeMatrixf GLEW_GET_FUN(__glewLoadTransposeMatrixf) -#define glMultTransposeMatrixd GLEW_GET_FUN(__glewMultTransposeMatrixd) -#define glMultTransposeMatrixf GLEW_GET_FUN(__glewMultTransposeMatrixf) -#define glMultiTexCoord1d GLEW_GET_FUN(__glewMultiTexCoord1d) -#define glMultiTexCoord1dv GLEW_GET_FUN(__glewMultiTexCoord1dv) -#define glMultiTexCoord1f GLEW_GET_FUN(__glewMultiTexCoord1f) -#define glMultiTexCoord1fv GLEW_GET_FUN(__glewMultiTexCoord1fv) -#define glMultiTexCoord1i GLEW_GET_FUN(__glewMultiTexCoord1i) -#define glMultiTexCoord1iv GLEW_GET_FUN(__glewMultiTexCoord1iv) -#define glMultiTexCoord1s GLEW_GET_FUN(__glewMultiTexCoord1s) -#define glMultiTexCoord1sv GLEW_GET_FUN(__glewMultiTexCoord1sv) -#define glMultiTexCoord2d GLEW_GET_FUN(__glewMultiTexCoord2d) -#define glMultiTexCoord2dv GLEW_GET_FUN(__glewMultiTexCoord2dv) -#define glMultiTexCoord2f GLEW_GET_FUN(__glewMultiTexCoord2f) -#define glMultiTexCoord2fv GLEW_GET_FUN(__glewMultiTexCoord2fv) -#define glMultiTexCoord2i GLEW_GET_FUN(__glewMultiTexCoord2i) -#define glMultiTexCoord2iv GLEW_GET_FUN(__glewMultiTexCoord2iv) -#define glMultiTexCoord2s GLEW_GET_FUN(__glewMultiTexCoord2s) -#define glMultiTexCoord2sv GLEW_GET_FUN(__glewMultiTexCoord2sv) -#define glMultiTexCoord3d GLEW_GET_FUN(__glewMultiTexCoord3d) -#define glMultiTexCoord3dv GLEW_GET_FUN(__glewMultiTexCoord3dv) -#define glMultiTexCoord3f GLEW_GET_FUN(__glewMultiTexCoord3f) -#define glMultiTexCoord3fv GLEW_GET_FUN(__glewMultiTexCoord3fv) -#define glMultiTexCoord3i GLEW_GET_FUN(__glewMultiTexCoord3i) -#define glMultiTexCoord3iv GLEW_GET_FUN(__glewMultiTexCoord3iv) -#define glMultiTexCoord3s GLEW_GET_FUN(__glewMultiTexCoord3s) -#define glMultiTexCoord3sv GLEW_GET_FUN(__glewMultiTexCoord3sv) -#define glMultiTexCoord4d GLEW_GET_FUN(__glewMultiTexCoord4d) -#define glMultiTexCoord4dv GLEW_GET_FUN(__glewMultiTexCoord4dv) -#define glMultiTexCoord4f GLEW_GET_FUN(__glewMultiTexCoord4f) -#define glMultiTexCoord4fv GLEW_GET_FUN(__glewMultiTexCoord4fv) -#define glMultiTexCoord4i GLEW_GET_FUN(__glewMultiTexCoord4i) -#define glMultiTexCoord4iv GLEW_GET_FUN(__glewMultiTexCoord4iv) -#define glMultiTexCoord4s GLEW_GET_FUN(__glewMultiTexCoord4s) -#define glMultiTexCoord4sv GLEW_GET_FUN(__glewMultiTexCoord4sv) -#define glSampleCoverage GLEW_GET_FUN(__glewSampleCoverage) - -#define GLEW_VERSION_1_3 GLEW_GET_VAR(__GLEW_VERSION_1_3) - -#endif /* GL_VERSION_1_3 */ - -/* ----------------------------- GL_VERSION_1_4 ---------------------------- */ - -#ifndef GL_VERSION_1_4 -#define GL_VERSION_1_4 1 - -#define GL_BLEND_DST_RGB 0x80C8 -#define GL_BLEND_SRC_RGB 0x80C9 -#define GL_BLEND_DST_ALPHA 0x80CA -#define GL_BLEND_SRC_ALPHA 0x80CB -#define GL_POINT_SIZE_MIN 0x8126 -#define GL_POINT_SIZE_MAX 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION 0x8129 -#define GL_GENERATE_MIPMAP 0x8191 -#define GL_GENERATE_MIPMAP_HINT 0x8192 -#define GL_DEPTH_COMPONENT16 0x81A5 -#define GL_DEPTH_COMPONENT24 0x81A6 -#define GL_DEPTH_COMPONENT32 0x81A7 -#define GL_MIRRORED_REPEAT 0x8370 -#define GL_FOG_COORDINATE_SOURCE 0x8450 -#define GL_FOG_COORDINATE 0x8451 -#define GL_FRAGMENT_DEPTH 0x8452 -#define GL_CURRENT_FOG_COORDINATE 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 -#define GL_FOG_COORDINATE_ARRAY 0x8457 -#define GL_COLOR_SUM 0x8458 -#define GL_CURRENT_SECONDARY_COLOR 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D -#define GL_SECONDARY_COLOR_ARRAY 0x845E -#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD -#define GL_TEXTURE_FILTER_CONTROL 0x8500 -#define GL_TEXTURE_LOD_BIAS 0x8501 -#define GL_INCR_WRAP 0x8507 -#define GL_DECR_WRAP 0x8508 -#define GL_TEXTURE_DEPTH_SIZE 0x884A -#define GL_DEPTH_TEXTURE_MODE 0x884B -#define GL_TEXTURE_COMPARE_MODE 0x884C -#define GL_TEXTURE_COMPARE_FUNC 0x884D -#define GL_COMPARE_R_TO_TEXTURE 0x884E - -typedef void (GLAPIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const void *pointer); -typedef void (GLAPIENTRY * PFNGLFOGCOORDDPROC) (GLdouble coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDDVPROC) (const GLdouble *coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDFPROC) (GLfloat coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDFVPROC) (const GLfloat *coord); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const* indices, GLsizei drawcount); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVPROC) (const GLdouble *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVPROC) (const GLfloat *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVPROC) (const GLint *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVPROC) (const GLshort *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVPROC) (const GLdouble *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVPROC) (const GLfloat *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVPROC) (const GLint *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVPROC) (const GLshort *p); - -#define glBlendColor GLEW_GET_FUN(__glewBlendColor) -#define glBlendEquation GLEW_GET_FUN(__glewBlendEquation) -#define glBlendFuncSeparate GLEW_GET_FUN(__glewBlendFuncSeparate) -#define glFogCoordPointer GLEW_GET_FUN(__glewFogCoordPointer) -#define glFogCoordd GLEW_GET_FUN(__glewFogCoordd) -#define glFogCoorddv GLEW_GET_FUN(__glewFogCoorddv) -#define glFogCoordf GLEW_GET_FUN(__glewFogCoordf) -#define glFogCoordfv GLEW_GET_FUN(__glewFogCoordfv) -#define glMultiDrawArrays GLEW_GET_FUN(__glewMultiDrawArrays) -#define glMultiDrawElements GLEW_GET_FUN(__glewMultiDrawElements) -#define glPointParameterf GLEW_GET_FUN(__glewPointParameterf) -#define glPointParameterfv GLEW_GET_FUN(__glewPointParameterfv) -#define glPointParameteri GLEW_GET_FUN(__glewPointParameteri) -#define glPointParameteriv GLEW_GET_FUN(__glewPointParameteriv) -#define glSecondaryColor3b GLEW_GET_FUN(__glewSecondaryColor3b) -#define glSecondaryColor3bv GLEW_GET_FUN(__glewSecondaryColor3bv) -#define glSecondaryColor3d GLEW_GET_FUN(__glewSecondaryColor3d) -#define glSecondaryColor3dv GLEW_GET_FUN(__glewSecondaryColor3dv) -#define glSecondaryColor3f GLEW_GET_FUN(__glewSecondaryColor3f) -#define glSecondaryColor3fv GLEW_GET_FUN(__glewSecondaryColor3fv) -#define glSecondaryColor3i GLEW_GET_FUN(__glewSecondaryColor3i) -#define glSecondaryColor3iv GLEW_GET_FUN(__glewSecondaryColor3iv) -#define glSecondaryColor3s GLEW_GET_FUN(__glewSecondaryColor3s) -#define glSecondaryColor3sv GLEW_GET_FUN(__glewSecondaryColor3sv) -#define glSecondaryColor3ub GLEW_GET_FUN(__glewSecondaryColor3ub) -#define glSecondaryColor3ubv GLEW_GET_FUN(__glewSecondaryColor3ubv) -#define glSecondaryColor3ui GLEW_GET_FUN(__glewSecondaryColor3ui) -#define glSecondaryColor3uiv GLEW_GET_FUN(__glewSecondaryColor3uiv) -#define glSecondaryColor3us GLEW_GET_FUN(__glewSecondaryColor3us) -#define glSecondaryColor3usv GLEW_GET_FUN(__glewSecondaryColor3usv) -#define glSecondaryColorPointer GLEW_GET_FUN(__glewSecondaryColorPointer) -#define glWindowPos2d GLEW_GET_FUN(__glewWindowPos2d) -#define glWindowPos2dv GLEW_GET_FUN(__glewWindowPos2dv) -#define glWindowPos2f GLEW_GET_FUN(__glewWindowPos2f) -#define glWindowPos2fv GLEW_GET_FUN(__glewWindowPos2fv) -#define glWindowPos2i GLEW_GET_FUN(__glewWindowPos2i) -#define glWindowPos2iv GLEW_GET_FUN(__glewWindowPos2iv) -#define glWindowPos2s GLEW_GET_FUN(__glewWindowPos2s) -#define glWindowPos2sv GLEW_GET_FUN(__glewWindowPos2sv) -#define glWindowPos3d GLEW_GET_FUN(__glewWindowPos3d) -#define glWindowPos3dv GLEW_GET_FUN(__glewWindowPos3dv) -#define glWindowPos3f GLEW_GET_FUN(__glewWindowPos3f) -#define glWindowPos3fv GLEW_GET_FUN(__glewWindowPos3fv) -#define glWindowPos3i GLEW_GET_FUN(__glewWindowPos3i) -#define glWindowPos3iv GLEW_GET_FUN(__glewWindowPos3iv) -#define glWindowPos3s GLEW_GET_FUN(__glewWindowPos3s) -#define glWindowPos3sv GLEW_GET_FUN(__glewWindowPos3sv) - -#define GLEW_VERSION_1_4 GLEW_GET_VAR(__GLEW_VERSION_1_4) - -#endif /* GL_VERSION_1_4 */ - -/* ----------------------------- GL_VERSION_1_5 ---------------------------- */ - -#ifndef GL_VERSION_1_5 -#define GL_VERSION_1_5 1 - -#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE -#define GL_FOG_COORD GL_FOG_COORDINATE -#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY -#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING -#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER -#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE -#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE -#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE -#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA -#define GL_SRC0_RGB GL_SOURCE0_RGB -#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA -#define GL_SRC1_RGB GL_SOURCE1_RGB -#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA -#define GL_SRC2_RGB GL_SOURCE2_RGB -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 -#define GL_QUERY_COUNTER_BITS 0x8864 -#define GL_CURRENT_QUERY 0x8865 -#define GL_QUERY_RESULT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE 0x8867 -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_ARRAY_BUFFER_BINDING 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F -#define GL_READ_ONLY 0x88B8 -#define GL_WRITE_ONLY 0x88B9 -#define GL_READ_WRITE 0x88BA -#define GL_BUFFER_ACCESS 0x88BB -#define GL_BUFFER_MAPPED 0x88BC -#define GL_BUFFER_MAP_POINTER 0x88BD -#define GL_STREAM_DRAW 0x88E0 -#define GL_STREAM_READ 0x88E1 -#define GL_STREAM_COPY 0x88E2 -#define GL_STATIC_DRAW 0x88E4 -#define GL_STATIC_READ 0x88E5 -#define GL_STATIC_COPY 0x88E6 -#define GL_DYNAMIC_DRAW 0x88E8 -#define GL_DYNAMIC_READ 0x88E9 -#define GL_DYNAMIC_COPY 0x88EA -#define GL_SAMPLES_PASSED 0x8914 - -typedef ptrdiff_t GLintptr; -typedef ptrdiff_t GLsizeiptr; - -typedef void (GLAPIENTRY * PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void* data, GLenum usage); -typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void* data); -typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint* buffers); -typedef void (GLAPIENTRY * PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLENDQUERYPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLGENBUFFERSPROC) (GLsizei n, GLuint* buffers); -typedef void (GLAPIENTRY * PFNGLGENQUERIESPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void** params); -typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void* data); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERPROC) (GLuint buffer); -typedef GLboolean (GLAPIENTRY * PFNGLISQUERYPROC) (GLuint id); -typedef void* (GLAPIENTRY * PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); -typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERPROC) (GLenum target); - -#define glBeginQuery GLEW_GET_FUN(__glewBeginQuery) -#define glBindBuffer GLEW_GET_FUN(__glewBindBuffer) -#define glBufferData GLEW_GET_FUN(__glewBufferData) -#define glBufferSubData GLEW_GET_FUN(__glewBufferSubData) -#define glDeleteBuffers GLEW_GET_FUN(__glewDeleteBuffers) -#define glDeleteQueries GLEW_GET_FUN(__glewDeleteQueries) -#define glEndQuery GLEW_GET_FUN(__glewEndQuery) -#define glGenBuffers GLEW_GET_FUN(__glewGenBuffers) -#define glGenQueries GLEW_GET_FUN(__glewGenQueries) -#define glGetBufferParameteriv GLEW_GET_FUN(__glewGetBufferParameteriv) -#define glGetBufferPointerv GLEW_GET_FUN(__glewGetBufferPointerv) -#define glGetBufferSubData GLEW_GET_FUN(__glewGetBufferSubData) -#define glGetQueryObjectiv GLEW_GET_FUN(__glewGetQueryObjectiv) -#define glGetQueryObjectuiv GLEW_GET_FUN(__glewGetQueryObjectuiv) -#define glGetQueryiv GLEW_GET_FUN(__glewGetQueryiv) -#define glIsBuffer GLEW_GET_FUN(__glewIsBuffer) -#define glIsQuery GLEW_GET_FUN(__glewIsQuery) -#define glMapBuffer GLEW_GET_FUN(__glewMapBuffer) -#define glUnmapBuffer GLEW_GET_FUN(__glewUnmapBuffer) - -#define GLEW_VERSION_1_5 GLEW_GET_VAR(__GLEW_VERSION_1_5) - -#endif /* GL_VERSION_1_5 */ - -/* ----------------------------- GL_VERSION_2_0 ---------------------------- */ - -#ifndef GL_VERSION_2_0 -#define GL_VERSION_2_0 1 - -#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB 0x8626 -#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 -#define GL_STENCIL_BACK_FUNC 0x8800 -#define GL_STENCIL_BACK_FAIL 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 -#define GL_MAX_DRAW_BUFFERS 0x8824 -#define GL_DRAW_BUFFER0 0x8825 -#define GL_DRAW_BUFFER1 0x8826 -#define GL_DRAW_BUFFER2 0x8827 -#define GL_DRAW_BUFFER3 0x8828 -#define GL_DRAW_BUFFER4 0x8829 -#define GL_DRAW_BUFFER5 0x882A -#define GL_DRAW_BUFFER6 0x882B -#define GL_DRAW_BUFFER7 0x882C -#define GL_DRAW_BUFFER8 0x882D -#define GL_DRAW_BUFFER9 0x882E -#define GL_DRAW_BUFFER10 0x882F -#define GL_DRAW_BUFFER11 0x8830 -#define GL_DRAW_BUFFER12 0x8831 -#define GL_DRAW_BUFFER13 0x8832 -#define GL_DRAW_BUFFER14 0x8833 -#define GL_DRAW_BUFFER15 0x8834 -#define GL_BLEND_EQUATION_ALPHA 0x883D -#define GL_POINT_SPRITE 0x8861 -#define GL_COORD_REPLACE 0x8862 -#define GL_MAX_VERTEX_ATTRIBS 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_MAX_TEXTURE_COORDS 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A -#define GL_MAX_VARYING_FLOATS 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D -#define GL_SHADER_TYPE 0x8B4F -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT4 0x8B5C -#define GL_SAMPLER_1D 0x8B5D -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_3D 0x8B5F -#define GL_SAMPLER_CUBE 0x8B60 -#define GL_SAMPLER_1D_SHADOW 0x8B61 -#define GL_SAMPLER_2D_SHADOW 0x8B62 -#define GL_DELETE_STATUS 0x8B80 -#define GL_COMPILE_STATUS 0x8B81 -#define GL_LINK_STATUS 0x8B82 -#define GL_VALIDATE_STATUS 0x8B83 -#define GL_INFO_LOG_LENGTH 0x8B84 -#define GL_ATTACHED_SHADERS 0x8B85 -#define GL_ACTIVE_UNIFORMS 0x8B86 -#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 -#define GL_SHADER_SOURCE_LENGTH 0x8B88 -#define GL_ACTIVE_ATTRIBUTES 0x8B89 -#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B -#define GL_SHADING_LANGUAGE_VERSION 0x8B8C -#define GL_CURRENT_PROGRAM 0x8B8D -#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 -#define GL_LOWER_LEFT 0x8CA1 -#define GL_UPPER_LEFT 0x8CA2 -#define GL_STENCIL_BACK_REF 0x8CA3 -#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 -#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 - -typedef void (GLAPIENTRY * PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); -typedef void (GLAPIENTRY * PFNGLCOMPILESHADERPROC) (GLuint shader); -typedef GLuint (GLAPIENTRY * PFNGLCREATEPROGRAMPROC) (void); -typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROC) (GLenum type); -typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPROC) (GLuint program); -typedef void (GLAPIENTRY * PFNGLDELETESHADERPROC) (GLuint shader); -typedef void (GLAPIENTRY * PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum* bufs); -typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders); -typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog); -typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEPROC) (GLuint obj, GLsizei maxLength, GLsizei* length, GLchar* source); -typedef void (GLAPIENTRY * PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint* param); -typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void** pointer); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPROC) (GLuint program); -typedef GLboolean (GLAPIENTRY * PFNGLISSHADERPROC) (GLuint shader); -typedef void (GLAPIENTRY * PFNGLLINKPROGRAMPROC) (GLuint program); -typedef void (GLAPIENTRY * PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const* string, const GLint* length); -typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); -typedef void (GLAPIENTRY * PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); -typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (GLAPIENTRY * PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); -typedef void (GLAPIENTRY * PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM1IPROC) (GLint location, GLint v0); -typedef void (GLAPIENTRY * PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (GLAPIENTRY * PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); -typedef void (GLAPIENTRY * PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (GLAPIENTRY * PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (GLAPIENTRY * PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (GLAPIENTRY * PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GLAPIENTRY * PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUSEPROGRAMPROC) (GLuint program); -typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPROC) (GLuint program); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer); - -#define glAttachShader GLEW_GET_FUN(__glewAttachShader) -#define glBindAttribLocation GLEW_GET_FUN(__glewBindAttribLocation) -#define glBlendEquationSeparate GLEW_GET_FUN(__glewBlendEquationSeparate) -#define glCompileShader GLEW_GET_FUN(__glewCompileShader) -#define glCreateProgram GLEW_GET_FUN(__glewCreateProgram) -#define glCreateShader GLEW_GET_FUN(__glewCreateShader) -#define glDeleteProgram GLEW_GET_FUN(__glewDeleteProgram) -#define glDeleteShader GLEW_GET_FUN(__glewDeleteShader) -#define glDetachShader GLEW_GET_FUN(__glewDetachShader) -#define glDisableVertexAttribArray GLEW_GET_FUN(__glewDisableVertexAttribArray) -#define glDrawBuffers GLEW_GET_FUN(__glewDrawBuffers) -#define glEnableVertexAttribArray GLEW_GET_FUN(__glewEnableVertexAttribArray) -#define glGetActiveAttrib GLEW_GET_FUN(__glewGetActiveAttrib) -#define glGetActiveUniform GLEW_GET_FUN(__glewGetActiveUniform) -#define glGetAttachedShaders GLEW_GET_FUN(__glewGetAttachedShaders) -#define glGetAttribLocation GLEW_GET_FUN(__glewGetAttribLocation) -#define glGetProgramInfoLog GLEW_GET_FUN(__glewGetProgramInfoLog) -#define glGetProgramiv GLEW_GET_FUN(__glewGetProgramiv) -#define glGetShaderInfoLog GLEW_GET_FUN(__glewGetShaderInfoLog) -#define glGetShaderSource GLEW_GET_FUN(__glewGetShaderSource) -#define glGetShaderiv GLEW_GET_FUN(__glewGetShaderiv) -#define glGetUniformLocation GLEW_GET_FUN(__glewGetUniformLocation) -#define glGetUniformfv GLEW_GET_FUN(__glewGetUniformfv) -#define glGetUniformiv GLEW_GET_FUN(__glewGetUniformiv) -#define glGetVertexAttribPointerv GLEW_GET_FUN(__glewGetVertexAttribPointerv) -#define glGetVertexAttribdv GLEW_GET_FUN(__glewGetVertexAttribdv) -#define glGetVertexAttribfv GLEW_GET_FUN(__glewGetVertexAttribfv) -#define glGetVertexAttribiv GLEW_GET_FUN(__glewGetVertexAttribiv) -#define glIsProgram GLEW_GET_FUN(__glewIsProgram) -#define glIsShader GLEW_GET_FUN(__glewIsShader) -#define glLinkProgram GLEW_GET_FUN(__glewLinkProgram) -#define glShaderSource GLEW_GET_FUN(__glewShaderSource) -#define glStencilFuncSeparate GLEW_GET_FUN(__glewStencilFuncSeparate) -#define glStencilMaskSeparate GLEW_GET_FUN(__glewStencilMaskSeparate) -#define glStencilOpSeparate GLEW_GET_FUN(__glewStencilOpSeparate) -#define glUniform1f GLEW_GET_FUN(__glewUniform1f) -#define glUniform1fv GLEW_GET_FUN(__glewUniform1fv) -#define glUniform1i GLEW_GET_FUN(__glewUniform1i) -#define glUniform1iv GLEW_GET_FUN(__glewUniform1iv) -#define glUniform2f GLEW_GET_FUN(__glewUniform2f) -#define glUniform2fv GLEW_GET_FUN(__glewUniform2fv) -#define glUniform2i GLEW_GET_FUN(__glewUniform2i) -#define glUniform2iv GLEW_GET_FUN(__glewUniform2iv) -#define glUniform3f GLEW_GET_FUN(__glewUniform3f) -#define glUniform3fv GLEW_GET_FUN(__glewUniform3fv) -#define glUniform3i GLEW_GET_FUN(__glewUniform3i) -#define glUniform3iv GLEW_GET_FUN(__glewUniform3iv) -#define glUniform4f GLEW_GET_FUN(__glewUniform4f) -#define glUniform4fv GLEW_GET_FUN(__glewUniform4fv) -#define glUniform4i GLEW_GET_FUN(__glewUniform4i) -#define glUniform4iv GLEW_GET_FUN(__glewUniform4iv) -#define glUniformMatrix2fv GLEW_GET_FUN(__glewUniformMatrix2fv) -#define glUniformMatrix3fv GLEW_GET_FUN(__glewUniformMatrix3fv) -#define glUniformMatrix4fv GLEW_GET_FUN(__glewUniformMatrix4fv) -#define glUseProgram GLEW_GET_FUN(__glewUseProgram) -#define glValidateProgram GLEW_GET_FUN(__glewValidateProgram) -#define glVertexAttrib1d GLEW_GET_FUN(__glewVertexAttrib1d) -#define glVertexAttrib1dv GLEW_GET_FUN(__glewVertexAttrib1dv) -#define glVertexAttrib1f GLEW_GET_FUN(__glewVertexAttrib1f) -#define glVertexAttrib1fv GLEW_GET_FUN(__glewVertexAttrib1fv) -#define glVertexAttrib1s GLEW_GET_FUN(__glewVertexAttrib1s) -#define glVertexAttrib1sv GLEW_GET_FUN(__glewVertexAttrib1sv) -#define glVertexAttrib2d GLEW_GET_FUN(__glewVertexAttrib2d) -#define glVertexAttrib2dv GLEW_GET_FUN(__glewVertexAttrib2dv) -#define glVertexAttrib2f GLEW_GET_FUN(__glewVertexAttrib2f) -#define glVertexAttrib2fv GLEW_GET_FUN(__glewVertexAttrib2fv) -#define glVertexAttrib2s GLEW_GET_FUN(__glewVertexAttrib2s) -#define glVertexAttrib2sv GLEW_GET_FUN(__glewVertexAttrib2sv) -#define glVertexAttrib3d GLEW_GET_FUN(__glewVertexAttrib3d) -#define glVertexAttrib3dv GLEW_GET_FUN(__glewVertexAttrib3dv) -#define glVertexAttrib3f GLEW_GET_FUN(__glewVertexAttrib3f) -#define glVertexAttrib3fv GLEW_GET_FUN(__glewVertexAttrib3fv) -#define glVertexAttrib3s GLEW_GET_FUN(__glewVertexAttrib3s) -#define glVertexAttrib3sv GLEW_GET_FUN(__glewVertexAttrib3sv) -#define glVertexAttrib4Nbv GLEW_GET_FUN(__glewVertexAttrib4Nbv) -#define glVertexAttrib4Niv GLEW_GET_FUN(__glewVertexAttrib4Niv) -#define glVertexAttrib4Nsv GLEW_GET_FUN(__glewVertexAttrib4Nsv) -#define glVertexAttrib4Nub GLEW_GET_FUN(__glewVertexAttrib4Nub) -#define glVertexAttrib4Nubv GLEW_GET_FUN(__glewVertexAttrib4Nubv) -#define glVertexAttrib4Nuiv GLEW_GET_FUN(__glewVertexAttrib4Nuiv) -#define glVertexAttrib4Nusv GLEW_GET_FUN(__glewVertexAttrib4Nusv) -#define glVertexAttrib4bv GLEW_GET_FUN(__glewVertexAttrib4bv) -#define glVertexAttrib4d GLEW_GET_FUN(__glewVertexAttrib4d) -#define glVertexAttrib4dv GLEW_GET_FUN(__glewVertexAttrib4dv) -#define glVertexAttrib4f GLEW_GET_FUN(__glewVertexAttrib4f) -#define glVertexAttrib4fv GLEW_GET_FUN(__glewVertexAttrib4fv) -#define glVertexAttrib4iv GLEW_GET_FUN(__glewVertexAttrib4iv) -#define glVertexAttrib4s GLEW_GET_FUN(__glewVertexAttrib4s) -#define glVertexAttrib4sv GLEW_GET_FUN(__glewVertexAttrib4sv) -#define glVertexAttrib4ubv GLEW_GET_FUN(__glewVertexAttrib4ubv) -#define glVertexAttrib4uiv GLEW_GET_FUN(__glewVertexAttrib4uiv) -#define glVertexAttrib4usv GLEW_GET_FUN(__glewVertexAttrib4usv) -#define glVertexAttribPointer GLEW_GET_FUN(__glewVertexAttribPointer) - -#define GLEW_VERSION_2_0 GLEW_GET_VAR(__GLEW_VERSION_2_0) - -#endif /* GL_VERSION_2_0 */ - -/* ----------------------------- GL_VERSION_2_1 ---------------------------- */ - -#ifndef GL_VERSION_2_1 -#define GL_VERSION_2_1 1 - -#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F -#define GL_PIXEL_PACK_BUFFER 0x88EB -#define GL_PIXEL_UNPACK_BUFFER 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF -#define GL_FLOAT_MAT2x3 0x8B65 -#define GL_FLOAT_MAT2x4 0x8B66 -#define GL_FLOAT_MAT3x2 0x8B67 -#define GL_FLOAT_MAT3x4 0x8B68 -#define GL_FLOAT_MAT4x2 0x8B69 -#define GL_FLOAT_MAT4x3 0x8B6A -#define GL_SRGB 0x8C40 -#define GL_SRGB8 0x8C41 -#define GL_SRGB_ALPHA 0x8C42 -#define GL_SRGB8_ALPHA8 0x8C43 -#define GL_SLUMINANCE_ALPHA 0x8C44 -#define GL_SLUMINANCE8_ALPHA8 0x8C45 -#define GL_SLUMINANCE 0x8C46 -#define GL_SLUMINANCE8 0x8C47 -#define GL_COMPRESSED_SRGB 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 -#define GL_COMPRESSED_SLUMINANCE 0x8C4A -#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B - -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - -#define glUniformMatrix2x3fv GLEW_GET_FUN(__glewUniformMatrix2x3fv) -#define glUniformMatrix2x4fv GLEW_GET_FUN(__glewUniformMatrix2x4fv) -#define glUniformMatrix3x2fv GLEW_GET_FUN(__glewUniformMatrix3x2fv) -#define glUniformMatrix3x4fv GLEW_GET_FUN(__glewUniformMatrix3x4fv) -#define glUniformMatrix4x2fv GLEW_GET_FUN(__glewUniformMatrix4x2fv) -#define glUniformMatrix4x3fv GLEW_GET_FUN(__glewUniformMatrix4x3fv) - -#define GLEW_VERSION_2_1 GLEW_GET_VAR(__GLEW_VERSION_2_1) - -#endif /* GL_VERSION_2_1 */ - -/* ----------------------------- GL_VERSION_3_0 ---------------------------- */ - -#ifndef GL_VERSION_3_0 -#define GL_VERSION_3_0 1 - -#define GL_CLIP_DISTANCE0 GL_CLIP_PLANE0 -#define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1 -#define GL_CLIP_DISTANCE2 GL_CLIP_PLANE2 -#define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3 -#define GL_CLIP_DISTANCE4 GL_CLIP_PLANE4 -#define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5 -#define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE_ARB -#define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES -#define GL_MAX_VARYING_COMPONENTS GL_MAX_VARYING_FLOATS -#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001 -#define GL_MAJOR_VERSION 0x821B -#define GL_MINOR_VERSION 0x821C -#define GL_NUM_EXTENSIONS 0x821D -#define GL_CONTEXT_FLAGS 0x821E -#define GL_DEPTH_BUFFER 0x8223 -#define GL_STENCIL_BUFFER 0x8224 -#define GL_RGBA32F 0x8814 -#define GL_RGB32F 0x8815 -#define GL_RGBA16F 0x881A -#define GL_RGB16F 0x881B -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD -#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF -#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 -#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 -#define GL_CLAMP_VERTEX_COLOR 0x891A -#define GL_CLAMP_FRAGMENT_COLOR 0x891B -#define GL_CLAMP_READ_COLOR 0x891C -#define GL_FIXED_ONLY 0x891D -#define GL_TEXTURE_RED_TYPE 0x8C10 -#define GL_TEXTURE_GREEN_TYPE 0x8C11 -#define GL_TEXTURE_BLUE_TYPE 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE 0x8C13 -#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 -#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 -#define GL_TEXTURE_DEPTH_TYPE 0x8C16 -#define GL_TEXTURE_1D_ARRAY 0x8C18 -#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 -#define GL_TEXTURE_2D_ARRAY 0x8C1A -#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B -#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C -#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D -#define GL_R11F_G11F_B10F 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B -#define GL_RGB9_E5 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E -#define GL_TEXTURE_SHARED_SIZE 0x8C3F -#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 -#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 -#define GL_PRIMITIVES_GENERATED 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 -#define GL_RASTERIZER_DISCARD 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B -#define GL_INTERLEAVED_ATTRIBS 0x8C8C -#define GL_SEPARATE_ATTRIBS 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F -#define GL_RGBA32UI 0x8D70 -#define GL_RGB32UI 0x8D71 -#define GL_RGBA16UI 0x8D76 -#define GL_RGB16UI 0x8D77 -#define GL_RGBA8UI 0x8D7C -#define GL_RGB8UI 0x8D7D -#define GL_RGBA32I 0x8D82 -#define GL_RGB32I 0x8D83 -#define GL_RGBA16I 0x8D88 -#define GL_RGB16I 0x8D89 -#define GL_RGBA8I 0x8D8E -#define GL_RGB8I 0x8D8F -#define GL_RED_INTEGER 0x8D94 -#define GL_GREEN_INTEGER 0x8D95 -#define GL_BLUE_INTEGER 0x8D96 -#define GL_ALPHA_INTEGER 0x8D97 -#define GL_RGB_INTEGER 0x8D98 -#define GL_RGBA_INTEGER 0x8D99 -#define GL_BGR_INTEGER 0x8D9A -#define GL_BGRA_INTEGER 0x8D9B -#define GL_SAMPLER_1D_ARRAY 0x8DC0 -#define GL_SAMPLER_2D_ARRAY 0x8DC1 -#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 -#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 -#define GL_UNSIGNED_INT_VEC2 0x8DC6 -#define GL_UNSIGNED_INT_VEC3 0x8DC7 -#define GL_UNSIGNED_INT_VEC4 0x8DC8 -#define GL_INT_SAMPLER_1D 0x8DC9 -#define GL_INT_SAMPLER_2D 0x8DCA -#define GL_INT_SAMPLER_3D 0x8DCB -#define GL_INT_SAMPLER_CUBE 0x8DCC -#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE -#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF -#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 -#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 -#define GL_QUERY_WAIT 0x8E13 -#define GL_QUERY_NO_WAIT 0x8E14 -#define GL_QUERY_BY_REGION_WAIT 0x8E15 -#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 - -typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); -typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); -typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint colorNumber, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); -typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil); -typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawBuffer, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawBuffer, const GLint* value); -typedef void (GLAPIENTRY * PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawBuffer, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLCOLORMASKIPROC) (GLuint buf, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -typedef void (GLAPIENTRY * PFNGLDISABLEIPROC) (GLenum cap, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEIPROC) (GLenum cap, GLuint index); -typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERPROC) (void); -typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKPROC) (void); -typedef void (GLAPIENTRY * PFNGLGETBOOLEANI_VPROC) (GLenum pname, GLuint index, GLboolean* data); -typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar* name); -typedef const GLubyte* (GLAPIENTRY * PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); -typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDIPROC) (GLenum cap, GLuint index); -typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint v0, GLint v1); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint v0, GLuint v1); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint v0, GLint v1, GLint v2); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint v0, GLuint v1, GLuint v2); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void*pointer); - -#define glBeginConditionalRender GLEW_GET_FUN(__glewBeginConditionalRender) -#define glBeginTransformFeedback GLEW_GET_FUN(__glewBeginTransformFeedback) -#define glBindFragDataLocation GLEW_GET_FUN(__glewBindFragDataLocation) -#define glClampColor GLEW_GET_FUN(__glewClampColor) -#define glClearBufferfi GLEW_GET_FUN(__glewClearBufferfi) -#define glClearBufferfv GLEW_GET_FUN(__glewClearBufferfv) -#define glClearBufferiv GLEW_GET_FUN(__glewClearBufferiv) -#define glClearBufferuiv GLEW_GET_FUN(__glewClearBufferuiv) -#define glColorMaski GLEW_GET_FUN(__glewColorMaski) -#define glDisablei GLEW_GET_FUN(__glewDisablei) -#define glEnablei GLEW_GET_FUN(__glewEnablei) -#define glEndConditionalRender GLEW_GET_FUN(__glewEndConditionalRender) -#define glEndTransformFeedback GLEW_GET_FUN(__glewEndTransformFeedback) -#define glGetBooleani_v GLEW_GET_FUN(__glewGetBooleani_v) -#define glGetFragDataLocation GLEW_GET_FUN(__glewGetFragDataLocation) -#define glGetStringi GLEW_GET_FUN(__glewGetStringi) -#define glGetTexParameterIiv GLEW_GET_FUN(__glewGetTexParameterIiv) -#define glGetTexParameterIuiv GLEW_GET_FUN(__glewGetTexParameterIuiv) -#define glGetTransformFeedbackVarying GLEW_GET_FUN(__glewGetTransformFeedbackVarying) -#define glGetUniformuiv GLEW_GET_FUN(__glewGetUniformuiv) -#define glGetVertexAttribIiv GLEW_GET_FUN(__glewGetVertexAttribIiv) -#define glGetVertexAttribIuiv GLEW_GET_FUN(__glewGetVertexAttribIuiv) -#define glIsEnabledi GLEW_GET_FUN(__glewIsEnabledi) -#define glTexParameterIiv GLEW_GET_FUN(__glewTexParameterIiv) -#define glTexParameterIuiv GLEW_GET_FUN(__glewTexParameterIuiv) -#define glTransformFeedbackVaryings GLEW_GET_FUN(__glewTransformFeedbackVaryings) -#define glUniform1ui GLEW_GET_FUN(__glewUniform1ui) -#define glUniform1uiv GLEW_GET_FUN(__glewUniform1uiv) -#define glUniform2ui GLEW_GET_FUN(__glewUniform2ui) -#define glUniform2uiv GLEW_GET_FUN(__glewUniform2uiv) -#define glUniform3ui GLEW_GET_FUN(__glewUniform3ui) -#define glUniform3uiv GLEW_GET_FUN(__glewUniform3uiv) -#define glUniform4ui GLEW_GET_FUN(__glewUniform4ui) -#define glUniform4uiv GLEW_GET_FUN(__glewUniform4uiv) -#define glVertexAttribI1i GLEW_GET_FUN(__glewVertexAttribI1i) -#define glVertexAttribI1iv GLEW_GET_FUN(__glewVertexAttribI1iv) -#define glVertexAttribI1ui GLEW_GET_FUN(__glewVertexAttribI1ui) -#define glVertexAttribI1uiv GLEW_GET_FUN(__glewVertexAttribI1uiv) -#define glVertexAttribI2i GLEW_GET_FUN(__glewVertexAttribI2i) -#define glVertexAttribI2iv GLEW_GET_FUN(__glewVertexAttribI2iv) -#define glVertexAttribI2ui GLEW_GET_FUN(__glewVertexAttribI2ui) -#define glVertexAttribI2uiv GLEW_GET_FUN(__glewVertexAttribI2uiv) -#define glVertexAttribI3i GLEW_GET_FUN(__glewVertexAttribI3i) -#define glVertexAttribI3iv GLEW_GET_FUN(__glewVertexAttribI3iv) -#define glVertexAttribI3ui GLEW_GET_FUN(__glewVertexAttribI3ui) -#define glVertexAttribI3uiv GLEW_GET_FUN(__glewVertexAttribI3uiv) -#define glVertexAttribI4bv GLEW_GET_FUN(__glewVertexAttribI4bv) -#define glVertexAttribI4i GLEW_GET_FUN(__glewVertexAttribI4i) -#define glVertexAttribI4iv GLEW_GET_FUN(__glewVertexAttribI4iv) -#define glVertexAttribI4sv GLEW_GET_FUN(__glewVertexAttribI4sv) -#define glVertexAttribI4ubv GLEW_GET_FUN(__glewVertexAttribI4ubv) -#define glVertexAttribI4ui GLEW_GET_FUN(__glewVertexAttribI4ui) -#define glVertexAttribI4uiv GLEW_GET_FUN(__glewVertexAttribI4uiv) -#define glVertexAttribI4usv GLEW_GET_FUN(__glewVertexAttribI4usv) -#define glVertexAttribIPointer GLEW_GET_FUN(__glewVertexAttribIPointer) - -#define GLEW_VERSION_3_0 GLEW_GET_VAR(__GLEW_VERSION_3_0) - -#endif /* GL_VERSION_3_0 */ - -/* ----------------------------- GL_VERSION_3_1 ---------------------------- */ - -#ifndef GL_VERSION_3_1 -#define GL_VERSION_3_1 1 - -#define GL_TEXTURE_RECTANGLE 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 -#define GL_SAMPLER_2D_RECT 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 -#define GL_TEXTURE_BUFFER 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT 0x8C2E -#define GL_SAMPLER_BUFFER 0x8DC2 -#define GL_INT_SAMPLER_2D_RECT 0x8DCD -#define GL_INT_SAMPLER_BUFFER 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 -#define GL_RED_SNORM 0x8F90 -#define GL_RG_SNORM 0x8F91 -#define GL_RGB_SNORM 0x8F92 -#define GL_RGBA_SNORM 0x8F93 -#define GL_R8_SNORM 0x8F94 -#define GL_RG8_SNORM 0x8F95 -#define GL_RGB8_SNORM 0x8F96 -#define GL_RGBA8_SNORM 0x8F97 -#define GL_R16_SNORM 0x8F98 -#define GL_RG16_SNORM 0x8F99 -#define GL_RGB16_SNORM 0x8F9A -#define GL_RGBA16_SNORM 0x8F9B -#define GL_SIGNED_NORMALIZED 0x8F9C -#define GL_PRIMITIVE_RESTART 0x8F9D -#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E -#define GL_BUFFER_ACCESS_FLAGS 0x911F -#define GL_BUFFER_MAP_LENGTH 0x9120 -#define GL_BUFFER_MAP_OFFSET 0x9121 - -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalFormat, GLuint buffer); - -#define glDrawArraysInstanced GLEW_GET_FUN(__glewDrawArraysInstanced) -#define glDrawElementsInstanced GLEW_GET_FUN(__glewDrawElementsInstanced) -#define glPrimitiveRestartIndex GLEW_GET_FUN(__glewPrimitiveRestartIndex) -#define glTexBuffer GLEW_GET_FUN(__glewTexBuffer) - -#define GLEW_VERSION_3_1 GLEW_GET_VAR(__GLEW_VERSION_3_1) - -#endif /* GL_VERSION_3_1 */ - -/* ----------------------------- GL_VERSION_3_2 ---------------------------- */ - -#ifndef GL_VERSION_3_2 -#define GL_VERSION_3_2 1 - -#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 -#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 -#define GL_LINES_ADJACENCY 0x000A -#define GL_LINE_STRIP_ADJACENCY 0x000B -#define GL_TRIANGLES_ADJACENCY 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D -#define GL_PROGRAM_POINT_SIZE 0x8642 -#define GL_GEOMETRY_VERTICES_OUT 0x8916 -#define GL_GEOMETRY_INPUT_TYPE 0x8917 -#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 -#define GL_GEOMETRY_SHADER 0x8DD9 -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 -#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 -#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 -#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 -#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 -#define GL_CONTEXT_PROFILE_MASK 0x9126 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum value, GLint64 * data); -typedef void (GLAPIENTRY * PFNGLGETINTEGER64I_VPROC) (GLenum pname, GLuint index, GLint64 * data); - -#define glFramebufferTexture GLEW_GET_FUN(__glewFramebufferTexture) -#define glGetBufferParameteri64v GLEW_GET_FUN(__glewGetBufferParameteri64v) -#define glGetInteger64i_v GLEW_GET_FUN(__glewGetInteger64i_v) - -#define GLEW_VERSION_3_2 GLEW_GET_VAR(__GLEW_VERSION_3_2) - -#endif /* GL_VERSION_3_2 */ - -/* ----------------------------- GL_VERSION_3_3 ---------------------------- */ - -#ifndef GL_VERSION_3_3 -#define GL_VERSION_3_3 1 - -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE -#define GL_RGB10_A2UI 0x906F - -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); - -#define glVertexAttribDivisor GLEW_GET_FUN(__glewVertexAttribDivisor) - -#define GLEW_VERSION_3_3 GLEW_GET_VAR(__GLEW_VERSION_3_3) - -#endif /* GL_VERSION_3_3 */ - -/* ----------------------------- GL_VERSION_4_0 ---------------------------- */ - -#ifndef GL_VERSION_4_0 -#define GL_VERSION_4_0 1 - -#define GL_SAMPLE_SHADING 0x8C36 -#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F -#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS 0x8F9F -#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B -#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F - -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGPROC) (GLclampf value); - -#define glBlendEquationSeparatei GLEW_GET_FUN(__glewBlendEquationSeparatei) -#define glBlendEquationi GLEW_GET_FUN(__glewBlendEquationi) -#define glBlendFuncSeparatei GLEW_GET_FUN(__glewBlendFuncSeparatei) -#define glBlendFunci GLEW_GET_FUN(__glewBlendFunci) -#define glMinSampleShading GLEW_GET_FUN(__glewMinSampleShading) - -#define GLEW_VERSION_4_0 GLEW_GET_VAR(__GLEW_VERSION_4_0) - -#endif /* GL_VERSION_4_0 */ - -/* ----------------------------- GL_VERSION_4_1 ---------------------------- */ - -#ifndef GL_VERSION_4_1 -#define GL_VERSION_4_1 1 - -#define GLEW_VERSION_4_1 GLEW_GET_VAR(__GLEW_VERSION_4_1) - -#endif /* GL_VERSION_4_1 */ - -/* ----------------------------- GL_VERSION_4_2 ---------------------------- */ - -#ifndef GL_VERSION_4_2 -#define GL_VERSION_4_2 1 - -#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 -#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 -#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C -#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D -#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E -#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F -#define GL_COPY_READ_BUFFER_BINDING 0x8F36 -#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 - -#define GLEW_VERSION_4_2 GLEW_GET_VAR(__GLEW_VERSION_4_2) - -#endif /* GL_VERSION_4_2 */ - -/* ----------------------------- GL_VERSION_4_3 ---------------------------- */ - -#ifndef GL_VERSION_4_3 -#define GL_VERSION_4_3 1 - -#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 -#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E - -#define GLEW_VERSION_4_3 GLEW_GET_VAR(__GLEW_VERSION_4_3) - -#endif /* GL_VERSION_4_3 */ - -/* ----------------------------- GL_VERSION_4_4 ---------------------------- */ - -#ifndef GL_VERSION_4_4 -#define GL_VERSION_4_4 1 - -#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 -#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 -#define GL_TEXTURE_BUFFER_BINDING 0x8C2A - -#define GLEW_VERSION_4_4 GLEW_GET_VAR(__GLEW_VERSION_4_4) - -#endif /* GL_VERSION_4_4 */ - -/* ----------------------------- GL_VERSION_4_5 ---------------------------- */ - -#ifndef GL_VERSION_4_5 -#define GL_VERSION_4_5 1 - -#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 - -typedef GLenum (GLAPIENTRY * PFNGLGETGRAPHICSRESETSTATUSPROC) (void); -typedef void (GLAPIENTRY * PFNGLGETNCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLsizei bufSize, GLvoid *pixels); -typedef void (GLAPIENTRY * PFNGLGETNTEXIMAGEPROC) (GLenum tex, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *pixels); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMDVPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); - -#define glGetGraphicsResetStatus GLEW_GET_FUN(__glewGetGraphicsResetStatus) -#define glGetnCompressedTexImage GLEW_GET_FUN(__glewGetnCompressedTexImage) -#define glGetnTexImage GLEW_GET_FUN(__glewGetnTexImage) -#define glGetnUniformdv GLEW_GET_FUN(__glewGetnUniformdv) - -#define GLEW_VERSION_4_5 GLEW_GET_VAR(__GLEW_VERSION_4_5) - -#endif /* GL_VERSION_4_5 */ - -/* ----------------------------- GL_VERSION_4_6 ---------------------------- */ - -#ifndef GL_VERSION_4_6 -#define GL_VERSION_4_6 1 - -#define GL_CONTEXT_FLAG_NO_ERROR_BIT 0x00000008 -#define GL_PARAMETER_BUFFER 0x80EE -#define GL_PARAMETER_BUFFER_BINDING 0x80EF -#define GL_TRANSFORM_FEEDBACK_OVERFLOW 0x82EC -#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW 0x82ED -#define GL_VERTICES_SUBMITTED 0x82EE -#define GL_PRIMITIVES_SUBMITTED 0x82EF -#define GL_VERTEX_SHADER_INVOCATIONS 0x82F0 -#define GL_TESS_CONTROL_SHADER_PATCHES 0x82F1 -#define GL_TESS_EVALUATION_SHADER_INVOCATIONS 0x82F2 -#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED 0x82F3 -#define GL_FRAGMENT_SHADER_INVOCATIONS 0x82F4 -#define GL_COMPUTE_SHADER_INVOCATIONS 0x82F5 -#define GL_CLIPPING_INPUT_PRIMITIVES 0x82F6 -#define GL_CLIPPING_OUTPUT_PRIMITIVES 0x82F7 -#define GL_TEXTURE_MAX_ANISOTROPY 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF -#define GL_POLYGON_OFFSET_CLAMP 0x8E1B -#define GL_SHADER_BINARY_FORMAT_SPIR_V 0x9551 -#define GL_SPIR_V_BINARY 0x9552 -#define GL_SPIR_V_EXTENSIONS 0x9553 -#define GL_NUM_SPIR_V_EXTENSIONS 0x9554 - -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC) (GLenum mode, const GLvoid *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC) (GLenum mode, GLenum type, const GLvoid *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLSPECIALIZESHADERPROC) (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); - -#define glMultiDrawArraysIndirectCount GLEW_GET_FUN(__glewMultiDrawArraysIndirectCount) -#define glMultiDrawElementsIndirectCount GLEW_GET_FUN(__glewMultiDrawElementsIndirectCount) -#define glSpecializeShader GLEW_GET_FUN(__glewSpecializeShader) - -#define GLEW_VERSION_4_6 GLEW_GET_VAR(__GLEW_VERSION_4_6) - -#endif /* GL_VERSION_4_6 */ - -/* -------------------------- GL_3DFX_multisample -------------------------- */ - -#ifndef GL_3DFX_multisample -#define GL_3DFX_multisample 1 - -#define GL_MULTISAMPLE_3DFX 0x86B2 -#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 -#define GL_SAMPLES_3DFX 0x86B4 -#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 - -#define GLEW_3DFX_multisample GLEW_GET_VAR(__GLEW_3DFX_multisample) - -#endif /* GL_3DFX_multisample */ - -/* ---------------------------- GL_3DFX_tbuffer ---------------------------- */ - -#ifndef GL_3DFX_tbuffer -#define GL_3DFX_tbuffer 1 - -typedef void (GLAPIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); - -#define glTbufferMask3DFX GLEW_GET_FUN(__glewTbufferMask3DFX) - -#define GLEW_3DFX_tbuffer GLEW_GET_VAR(__GLEW_3DFX_tbuffer) - -#endif /* GL_3DFX_tbuffer */ - -/* -------------------- GL_3DFX_texture_compression_FXT1 ------------------- */ - -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_3DFX_texture_compression_FXT1 1 - -#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 -#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 - -#define GLEW_3DFX_texture_compression_FXT1 GLEW_GET_VAR(__GLEW_3DFX_texture_compression_FXT1) - -#endif /* GL_3DFX_texture_compression_FXT1 */ - -/* ----------------------- GL_AMD_blend_minmax_factor ---------------------- */ - -#ifndef GL_AMD_blend_minmax_factor -#define GL_AMD_blend_minmax_factor 1 - -#define GL_FACTOR_MIN_AMD 0x901C -#define GL_FACTOR_MAX_AMD 0x901D - -#define GLEW_AMD_blend_minmax_factor GLEW_GET_VAR(__GLEW_AMD_blend_minmax_factor) - -#endif /* GL_AMD_blend_minmax_factor */ - -/* --------------------- GL_AMD_compressed_3DC_texture --------------------- */ - -#ifndef GL_AMD_compressed_3DC_texture -#define GL_AMD_compressed_3DC_texture 1 - -#define GL_3DC_X_AMD 0x87F9 -#define GL_3DC_XY_AMD 0x87FA - -#define GLEW_AMD_compressed_3DC_texture GLEW_GET_VAR(__GLEW_AMD_compressed_3DC_texture) - -#endif /* GL_AMD_compressed_3DC_texture */ - -/* --------------------- GL_AMD_compressed_ATC_texture --------------------- */ - -#ifndef GL_AMD_compressed_ATC_texture -#define GL_AMD_compressed_ATC_texture 1 - -#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE -#define GL_ATC_RGB_AMD 0x8C92 -#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93 - -#define GLEW_AMD_compressed_ATC_texture GLEW_GET_VAR(__GLEW_AMD_compressed_ATC_texture) - -#endif /* GL_AMD_compressed_ATC_texture */ - -/* ----------------------- GL_AMD_conservative_depth ----------------------- */ - -#ifndef GL_AMD_conservative_depth -#define GL_AMD_conservative_depth 1 - -#define GLEW_AMD_conservative_depth GLEW_GET_VAR(__GLEW_AMD_conservative_depth) - -#endif /* GL_AMD_conservative_depth */ - -/* -------------------------- GL_AMD_debug_output -------------------------- */ - -#ifndef GL_AMD_debug_output -#define GL_AMD_debug_output 1 - -#define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 -#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 -#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 -#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 -#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A -#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B -#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C -#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D -#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E -#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F -#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 - -typedef void (GLAPIENTRY *GLDEBUGPROCAMD)(GLuint id, GLenum category, GLenum severity, GLsizei length, const GLchar* message, void* userParam); - -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void *userParam); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar* buf); -typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum* categories, GLuint* severities, GLuint* ids, GLsizei* lengths, GLchar* message); - -#define glDebugMessageCallbackAMD GLEW_GET_FUN(__glewDebugMessageCallbackAMD) -#define glDebugMessageEnableAMD GLEW_GET_FUN(__glewDebugMessageEnableAMD) -#define glDebugMessageInsertAMD GLEW_GET_FUN(__glewDebugMessageInsertAMD) -#define glGetDebugMessageLogAMD GLEW_GET_FUN(__glewGetDebugMessageLogAMD) - -#define GLEW_AMD_debug_output GLEW_GET_VAR(__GLEW_AMD_debug_output) - -#endif /* GL_AMD_debug_output */ - -/* ---------------------- GL_AMD_depth_clamp_separate ---------------------- */ - -#ifndef GL_AMD_depth_clamp_separate -#define GL_AMD_depth_clamp_separate 1 - -#define GL_DEPTH_CLAMP_NEAR_AMD 0x901E -#define GL_DEPTH_CLAMP_FAR_AMD 0x901F - -#define GLEW_AMD_depth_clamp_separate GLEW_GET_VAR(__GLEW_AMD_depth_clamp_separate) - -#endif /* GL_AMD_depth_clamp_separate */ - -/* ----------------------- GL_AMD_draw_buffers_blend ----------------------- */ - -#ifndef GL_AMD_draw_buffers_blend -#define GL_AMD_draw_buffers_blend 1 - -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode); -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); - -#define glBlendEquationIndexedAMD GLEW_GET_FUN(__glewBlendEquationIndexedAMD) -#define glBlendEquationSeparateIndexedAMD GLEW_GET_FUN(__glewBlendEquationSeparateIndexedAMD) -#define glBlendFuncIndexedAMD GLEW_GET_FUN(__glewBlendFuncIndexedAMD) -#define glBlendFuncSeparateIndexedAMD GLEW_GET_FUN(__glewBlendFuncSeparateIndexedAMD) - -#define GLEW_AMD_draw_buffers_blend GLEW_GET_VAR(__GLEW_AMD_draw_buffers_blend) - -#endif /* GL_AMD_draw_buffers_blend */ - -/* ---------------- GL_AMD_framebuffer_multisample_advanced ---------------- */ - -#ifndef GL_AMD_framebuffer_multisample_advanced -#define GL_AMD_framebuffer_multisample_advanced 1 - -#define GL_RENDERBUFFER_STORAGE_SAMPLES_AMD 0x91B2 -#define GL_MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD 0x91B3 -#define GL_MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD 0x91B4 -#define GL_MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD 0x91B5 -#define GL_NUM_SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B6 -#define GL_SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B7 - -typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC) (GLuint renderbuffer, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC) (GLenum target, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); - -#define glNamedRenderbufferStorageMultisampleAdvancedAMD GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleAdvancedAMD) -#define glRenderbufferStorageMultisampleAdvancedAMD GLEW_GET_FUN(__glewRenderbufferStorageMultisampleAdvancedAMD) - -#define GLEW_AMD_framebuffer_multisample_advanced GLEW_GET_VAR(__GLEW_AMD_framebuffer_multisample_advanced) - -#endif /* GL_AMD_framebuffer_multisample_advanced */ - -/* ------------------ GL_AMD_framebuffer_sample_positions ------------------ */ - -#ifndef GL_AMD_framebuffer_sample_positions -#define GL_AMD_framebuffer_sample_positions 1 - -#define GL_SUBSAMPLE_DISTANCE_AMD 0x883F -#define GL_PIXELS_PER_SAMPLE_PATTERN_X_AMD 0x91AE -#define GL_PIXELS_PER_SAMPLE_PATTERN_Y_AMD 0x91AF -#define GL_ALL_PIXELS_AMD 0xFFFFFFFF - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC) (GLenum target, GLuint numsamples, GLuint pixelindex, const GLfloat* values); -typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC) (GLenum target, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat* values); -typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC) (GLuint framebuffer, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat* values); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC) (GLuint framebuffer, GLuint numsamples, GLuint pixelindex, const GLfloat* values); - -#define glFramebufferSamplePositionsfvAMD GLEW_GET_FUN(__glewFramebufferSamplePositionsfvAMD) -#define glGetFramebufferParameterfvAMD GLEW_GET_FUN(__glewGetFramebufferParameterfvAMD) -#define glGetNamedFramebufferParameterfvAMD GLEW_GET_FUN(__glewGetNamedFramebufferParameterfvAMD) -#define glNamedFramebufferSamplePositionsfvAMD GLEW_GET_FUN(__glewNamedFramebufferSamplePositionsfvAMD) - -#define GLEW_AMD_framebuffer_sample_positions GLEW_GET_VAR(__GLEW_AMD_framebuffer_sample_positions) - -#endif /* GL_AMD_framebuffer_sample_positions */ - -/* --------------------------- GL_AMD_gcn_shader --------------------------- */ - -#ifndef GL_AMD_gcn_shader -#define GL_AMD_gcn_shader 1 - -#define GLEW_AMD_gcn_shader GLEW_GET_VAR(__GLEW_AMD_gcn_shader) - -#endif /* GL_AMD_gcn_shader */ - -/* ---------------------- GL_AMD_gpu_shader_half_float --------------------- */ - -#ifndef GL_AMD_gpu_shader_half_float -#define GL_AMD_gpu_shader_half_float 1 - -#define GL_FLOAT16_NV 0x8FF8 -#define GL_FLOAT16_VEC2_NV 0x8FF9 -#define GL_FLOAT16_VEC3_NV 0x8FFA -#define GL_FLOAT16_VEC4_NV 0x8FFB -#define GL_FLOAT16_MAT2_AMD 0x91C5 -#define GL_FLOAT16_MAT3_AMD 0x91C6 -#define GL_FLOAT16_MAT4_AMD 0x91C7 -#define GL_FLOAT16_MAT2x3_AMD 0x91C8 -#define GL_FLOAT16_MAT2x4_AMD 0x91C9 -#define GL_FLOAT16_MAT3x2_AMD 0x91CA -#define GL_FLOAT16_MAT3x4_AMD 0x91CB -#define GL_FLOAT16_MAT4x2_AMD 0x91CC -#define GL_FLOAT16_MAT4x3_AMD 0x91CD - -#define GLEW_AMD_gpu_shader_half_float GLEW_GET_VAR(__GLEW_AMD_gpu_shader_half_float) - -#endif /* GL_AMD_gpu_shader_half_float */ - -/* ------------------- GL_AMD_gpu_shader_half_float_fetch ------------------ */ - -#ifndef GL_AMD_gpu_shader_half_float_fetch -#define GL_AMD_gpu_shader_half_float_fetch 1 - -#define GL_FLOAT16_SAMPLER_1D_AMD 0x91CE -#define GL_FLOAT16_SAMPLER_2D_AMD 0x91CF -#define GL_FLOAT16_SAMPLER_3D_AMD 0x91D0 -#define GL_FLOAT16_SAMPLER_CUBE_AMD 0x91D1 -#define GL_FLOAT16_SAMPLER_2D_RECT_AMD 0x91D2 -#define GL_FLOAT16_SAMPLER_1D_ARRAY_AMD 0x91D3 -#define GL_FLOAT16_SAMPLER_2D_ARRAY_AMD 0x91D4 -#define GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_AMD 0x91D5 -#define GL_FLOAT16_SAMPLER_BUFFER_AMD 0x91D6 -#define GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_AMD 0x91D7 -#define GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_ARRAY_AMD 0x91D8 -#define GL_FLOAT16_SAMPLER_1D_SHADOW_AMD 0x91D9 -#define GL_FLOAT16_SAMPLER_2D_SHADOW_AMD 0x91DA -#define GL_FLOAT16_SAMPLER_2D_RECT_SHADOW_AMD 0x91DB -#define GL_FLOAT16_SAMPLER_1D_ARRAY_SHADOW_AMD 0x91DC -#define GL_FLOAT16_SAMPLER_2D_ARRAY_SHADOW_AMD 0x91DD -#define GL_FLOAT16_SAMPLER_CUBE_SHADOW_AMD 0x91DE -#define GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_SHADOW_AMD 0x91DF -#define GL_FLOAT16_IMAGE_1D_AMD 0x91E0 -#define GL_FLOAT16_IMAGE_2D_AMD 0x91E1 -#define GL_FLOAT16_IMAGE_3D_AMD 0x91E2 -#define GL_FLOAT16_IMAGE_2D_RECT_AMD 0x91E3 -#define GL_FLOAT16_IMAGE_CUBE_AMD 0x91E4 -#define GL_FLOAT16_IMAGE_1D_ARRAY_AMD 0x91E5 -#define GL_FLOAT16_IMAGE_2D_ARRAY_AMD 0x91E6 -#define GL_FLOAT16_IMAGE_CUBE_MAP_ARRAY_AMD 0x91E7 -#define GL_FLOAT16_IMAGE_BUFFER_AMD 0x91E8 -#define GL_FLOAT16_IMAGE_2D_MULTISAMPLE_AMD 0x91E9 -#define GL_FLOAT16_IMAGE_2D_MULTISAMPLE_ARRAY_AMD 0x91EA - -#define GLEW_AMD_gpu_shader_half_float_fetch GLEW_GET_VAR(__GLEW_AMD_gpu_shader_half_float_fetch) - -#endif /* GL_AMD_gpu_shader_half_float_fetch */ - -/* ------------------------ GL_AMD_gpu_shader_int16 ------------------------ */ - -#ifndef GL_AMD_gpu_shader_int16 -#define GL_AMD_gpu_shader_int16 1 - -#define GLEW_AMD_gpu_shader_int16 GLEW_GET_VAR(__GLEW_AMD_gpu_shader_int16) - -#endif /* GL_AMD_gpu_shader_int16 */ - -/* ------------------------ GL_AMD_gpu_shader_int64 ------------------------ */ - -#ifndef GL_AMD_gpu_shader_int64 -#define GL_AMD_gpu_shader_int64 1 - -#define GLEW_AMD_gpu_shader_int64 GLEW_GET_VAR(__GLEW_AMD_gpu_shader_int64) - -#endif /* GL_AMD_gpu_shader_int64 */ - -/* ---------------------- GL_AMD_interleaved_elements ---------------------- */ - -#ifndef GL_AMD_interleaved_elements -#define GL_AMD_interleaved_elements 1 - -#define GL_RED 0x1903 -#define GL_GREEN 0x1904 -#define GL_BLUE 0x1905 -#define GL_ALPHA 0x1906 -#define GL_RG8UI 0x8238 -#define GL_RG16UI 0x823A -#define GL_RGBA8UI 0x8D7C -#define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4 -#define GL_VERTEX_ID_SWIZZLE_AMD 0x91A5 - -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPARAMETERIAMDPROC) (GLuint index, GLenum pname, GLint param); - -#define glVertexAttribParameteriAMD GLEW_GET_FUN(__glewVertexAttribParameteriAMD) - -#define GLEW_AMD_interleaved_elements GLEW_GET_VAR(__GLEW_AMD_interleaved_elements) - -#endif /* GL_AMD_interleaved_elements */ - -/* ----------------------- GL_AMD_multi_draw_indirect ---------------------- */ - -#ifndef GL_AMD_multi_draw_indirect -#define GL_AMD_multi_draw_indirect 1 - -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); - -#define glMultiDrawArraysIndirectAMD GLEW_GET_FUN(__glewMultiDrawArraysIndirectAMD) -#define glMultiDrawElementsIndirectAMD GLEW_GET_FUN(__glewMultiDrawElementsIndirectAMD) - -#define GLEW_AMD_multi_draw_indirect GLEW_GET_VAR(__GLEW_AMD_multi_draw_indirect) - -#endif /* GL_AMD_multi_draw_indirect */ - -/* ------------------------- GL_AMD_name_gen_delete ------------------------ */ - -#ifndef GL_AMD_name_gen_delete -#define GL_AMD_name_gen_delete 1 - -#define GL_DATA_BUFFER_AMD 0x9151 -#define GL_PERFORMANCE_MONITOR_AMD 0x9152 -#define GL_QUERY_OBJECT_AMD 0x9153 -#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 -#define GL_SAMPLER_OBJECT_AMD 0x9155 - -typedef void (GLAPIENTRY * PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint* names); -typedef void (GLAPIENTRY * PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint* names); -typedef GLboolean (GLAPIENTRY * PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name); - -#define glDeleteNamesAMD GLEW_GET_FUN(__glewDeleteNamesAMD) -#define glGenNamesAMD GLEW_GET_FUN(__glewGenNamesAMD) -#define glIsNameAMD GLEW_GET_FUN(__glewIsNameAMD) - -#define GLEW_AMD_name_gen_delete GLEW_GET_VAR(__GLEW_AMD_name_gen_delete) - -#endif /* GL_AMD_name_gen_delete */ - -/* ---------------------- GL_AMD_occlusion_query_event --------------------- */ - -#ifndef GL_AMD_occlusion_query_event -#define GL_AMD_occlusion_query_event 1 - -#define GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD 0x00000001 -#define GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD 0x00000002 -#define GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD 0x00000004 -#define GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD 0x00000008 -#define GL_OCCLUSION_QUERY_EVENT_MASK_AMD 0x874F -#define GL_QUERY_ALL_EVENT_BITS_AMD 0xFFFFFFFF - -typedef void (GLAPIENTRY * PFNGLQUERYOBJECTPARAMETERUIAMDPROC) (GLenum target, GLuint id, GLenum pname, GLuint param); - -#define glQueryObjectParameteruiAMD GLEW_GET_FUN(__glewQueryObjectParameteruiAMD) - -#define GLEW_AMD_occlusion_query_event GLEW_GET_VAR(__GLEW_AMD_occlusion_query_event) - -#endif /* GL_AMD_occlusion_query_event */ - -/* ----------------------- GL_AMD_performance_monitor ---------------------- */ - -#ifndef GL_AMD_performance_monitor -#define GL_AMD_performance_monitor 1 - -#define GL_COUNTER_TYPE_AMD 0x8BC0 -#define GL_COUNTER_RANGE_AMD 0x8BC1 -#define GL_UNSIGNED_INT64_AMD 0x8BC2 -#define GL_PERCENTAGE_AMD 0x8BC3 -#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 -#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 -#define GL_PERFMON_RESULT_AMD 0x8BC6 - -typedef void (GLAPIENTRY * PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); -typedef void (GLAPIENTRY * PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors); -typedef void (GLAPIENTRY * PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); -typedef void (GLAPIENTRY * PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors); -typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint *bytesWritten); -typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data); -typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, GLchar *counterString); -typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint* numCounters, GLint *maxActiveCounters, GLsizei countersSize, GLuint *counters); -typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei* length, GLchar *groupString); -typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint* numGroups, GLsizei groupsSize, GLuint *groups); -typedef void (GLAPIENTRY * PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* counterList); - -#define glBeginPerfMonitorAMD GLEW_GET_FUN(__glewBeginPerfMonitorAMD) -#define glDeletePerfMonitorsAMD GLEW_GET_FUN(__glewDeletePerfMonitorsAMD) -#define glEndPerfMonitorAMD GLEW_GET_FUN(__glewEndPerfMonitorAMD) -#define glGenPerfMonitorsAMD GLEW_GET_FUN(__glewGenPerfMonitorsAMD) -#define glGetPerfMonitorCounterDataAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterDataAMD) -#define glGetPerfMonitorCounterInfoAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterInfoAMD) -#define glGetPerfMonitorCounterStringAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterStringAMD) -#define glGetPerfMonitorCountersAMD GLEW_GET_FUN(__glewGetPerfMonitorCountersAMD) -#define glGetPerfMonitorGroupStringAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupStringAMD) -#define glGetPerfMonitorGroupsAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupsAMD) -#define glSelectPerfMonitorCountersAMD GLEW_GET_FUN(__glewSelectPerfMonitorCountersAMD) - -#define GLEW_AMD_performance_monitor GLEW_GET_VAR(__GLEW_AMD_performance_monitor) - -#endif /* GL_AMD_performance_monitor */ - -/* -------------------------- GL_AMD_pinned_memory ------------------------- */ - -#ifndef GL_AMD_pinned_memory -#define GL_AMD_pinned_memory 1 - -#define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160 - -#define GLEW_AMD_pinned_memory GLEW_GET_VAR(__GLEW_AMD_pinned_memory) - -#endif /* GL_AMD_pinned_memory */ - -/* ----------------------- GL_AMD_program_binary_Z400 ---------------------- */ - -#ifndef GL_AMD_program_binary_Z400 -#define GL_AMD_program_binary_Z400 1 - -#define GL_Z400_BINARY_AMD 0x8740 - -#define GLEW_AMD_program_binary_Z400 GLEW_GET_VAR(__GLEW_AMD_program_binary_Z400) - -#endif /* GL_AMD_program_binary_Z400 */ - -/* ----------------------- GL_AMD_query_buffer_object ---------------------- */ - -#ifndef GL_AMD_query_buffer_object -#define GL_AMD_query_buffer_object 1 - -#define GL_QUERY_BUFFER_AMD 0x9192 -#define GL_QUERY_BUFFER_BINDING_AMD 0x9193 -#define GL_QUERY_RESULT_NO_WAIT_AMD 0x9194 - -#define GLEW_AMD_query_buffer_object GLEW_GET_VAR(__GLEW_AMD_query_buffer_object) - -#endif /* GL_AMD_query_buffer_object */ - -/* ------------------------ GL_AMD_sample_positions ------------------------ */ - -#ifndef GL_AMD_sample_positions -#define GL_AMD_sample_positions 1 - -#define GL_SUBSAMPLE_DISTANCE_AMD 0x883F - -typedef void (GLAPIENTRY * PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint index, const GLfloat* val); - -#define glSetMultisamplefvAMD GLEW_GET_FUN(__glewSetMultisamplefvAMD) - -#define GLEW_AMD_sample_positions GLEW_GET_VAR(__GLEW_AMD_sample_positions) - -#endif /* GL_AMD_sample_positions */ - -/* ------------------ GL_AMD_seamless_cubemap_per_texture ------------------ */ - -#ifndef GL_AMD_seamless_cubemap_per_texture -#define GL_AMD_seamless_cubemap_per_texture 1 - -#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F - -#define GLEW_AMD_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_AMD_seamless_cubemap_per_texture) - -#endif /* GL_AMD_seamless_cubemap_per_texture */ - -/* -------------------- GL_AMD_shader_atomic_counter_ops ------------------- */ - -#ifndef GL_AMD_shader_atomic_counter_ops -#define GL_AMD_shader_atomic_counter_ops 1 - -#define GLEW_AMD_shader_atomic_counter_ops GLEW_GET_VAR(__GLEW_AMD_shader_atomic_counter_ops) - -#endif /* GL_AMD_shader_atomic_counter_ops */ - -/* -------------------------- GL_AMD_shader_ballot ------------------------- */ - -#ifndef GL_AMD_shader_ballot -#define GL_AMD_shader_ballot 1 - -#define GLEW_AMD_shader_ballot GLEW_GET_VAR(__GLEW_AMD_shader_ballot) - -#endif /* GL_AMD_shader_ballot */ - -/* ---------------- GL_AMD_shader_explicit_vertex_parameter ---------------- */ - -#ifndef GL_AMD_shader_explicit_vertex_parameter -#define GL_AMD_shader_explicit_vertex_parameter 1 - -#define GLEW_AMD_shader_explicit_vertex_parameter GLEW_GET_VAR(__GLEW_AMD_shader_explicit_vertex_parameter) - -#endif /* GL_AMD_shader_explicit_vertex_parameter */ - -/* ------------------- GL_AMD_shader_image_load_store_lod ------------------ */ - -#ifndef GL_AMD_shader_image_load_store_lod -#define GL_AMD_shader_image_load_store_lod 1 - -#define GLEW_AMD_shader_image_load_store_lod GLEW_GET_VAR(__GLEW_AMD_shader_image_load_store_lod) - -#endif /* GL_AMD_shader_image_load_store_lod */ - -/* ---------------------- GL_AMD_shader_stencil_export --------------------- */ - -#ifndef GL_AMD_shader_stencil_export -#define GL_AMD_shader_stencil_export 1 - -#define GLEW_AMD_shader_stencil_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_export) - -#endif /* GL_AMD_shader_stencil_export */ - -/* ------------------- GL_AMD_shader_stencil_value_export ------------------ */ - -#ifndef GL_AMD_shader_stencil_value_export -#define GL_AMD_shader_stencil_value_export 1 - -#define GLEW_AMD_shader_stencil_value_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_value_export) - -#endif /* GL_AMD_shader_stencil_value_export */ - -/* ---------------------- GL_AMD_shader_trinary_minmax --------------------- */ - -#ifndef GL_AMD_shader_trinary_minmax -#define GL_AMD_shader_trinary_minmax 1 - -#define GLEW_AMD_shader_trinary_minmax GLEW_GET_VAR(__GLEW_AMD_shader_trinary_minmax) - -#endif /* GL_AMD_shader_trinary_minmax */ - -/* ------------------------- GL_AMD_sparse_texture ------------------------- */ - -#ifndef GL_AMD_sparse_texture -#define GL_AMD_sparse_texture 1 - -#define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001 -#define GL_VIRTUAL_PAGE_SIZE_X_AMD 0x9195 -#define GL_VIRTUAL_PAGE_SIZE_Y_AMD 0x9196 -#define GL_VIRTUAL_PAGE_SIZE_Z_AMD 0x9197 -#define GL_MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198 -#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199 -#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A -#define GL_MIN_SPARSE_LEVEL_AMD 0x919B -#define GL_MIN_LOD_WARNING_AMD 0x919C - -typedef void (GLAPIENTRY * PFNGLTEXSTORAGESPARSEAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGESPARSEAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); - -#define glTexStorageSparseAMD GLEW_GET_FUN(__glewTexStorageSparseAMD) -#define glTextureStorageSparseAMD GLEW_GET_FUN(__glewTextureStorageSparseAMD) - -#define GLEW_AMD_sparse_texture GLEW_GET_VAR(__GLEW_AMD_sparse_texture) - -#endif /* GL_AMD_sparse_texture */ - -/* ------------------- GL_AMD_stencil_operation_extended ------------------- */ - -#ifndef GL_AMD_stencil_operation_extended -#define GL_AMD_stencil_operation_extended 1 - -#define GL_SET_AMD 0x874A -#define GL_REPLACE_VALUE_AMD 0x874B -#define GL_STENCIL_OP_VALUE_AMD 0x874C -#define GL_STENCIL_BACK_OP_VALUE_AMD 0x874D - -typedef void (GLAPIENTRY * PFNGLSTENCILOPVALUEAMDPROC) (GLenum face, GLuint value); - -#define glStencilOpValueAMD GLEW_GET_FUN(__glewStencilOpValueAMD) - -#define GLEW_AMD_stencil_operation_extended GLEW_GET_VAR(__GLEW_AMD_stencil_operation_extended) - -#endif /* GL_AMD_stencil_operation_extended */ - -/* --------------------- GL_AMD_texture_gather_bias_lod -------------------- */ - -#ifndef GL_AMD_texture_gather_bias_lod -#define GL_AMD_texture_gather_bias_lod 1 - -#define GLEW_AMD_texture_gather_bias_lod GLEW_GET_VAR(__GLEW_AMD_texture_gather_bias_lod) - -#endif /* GL_AMD_texture_gather_bias_lod */ - -/* ------------------------ GL_AMD_texture_texture4 ------------------------ */ - -#ifndef GL_AMD_texture_texture4 -#define GL_AMD_texture_texture4 1 - -#define GLEW_AMD_texture_texture4 GLEW_GET_VAR(__GLEW_AMD_texture_texture4) - -#endif /* GL_AMD_texture_texture4 */ - -/* --------------- GL_AMD_transform_feedback3_lines_triangles -------------- */ - -#ifndef GL_AMD_transform_feedback3_lines_triangles -#define GL_AMD_transform_feedback3_lines_triangles 1 - -#define GLEW_AMD_transform_feedback3_lines_triangles GLEW_GET_VAR(__GLEW_AMD_transform_feedback3_lines_triangles) - -#endif /* GL_AMD_transform_feedback3_lines_triangles */ - -/* ----------------------- GL_AMD_transform_feedback4 ---------------------- */ - -#ifndef GL_AMD_transform_feedback4 -#define GL_AMD_transform_feedback4 1 - -#define GL_STREAM_RASTERIZATION_AMD 0x91A0 - -#define GLEW_AMD_transform_feedback4 GLEW_GET_VAR(__GLEW_AMD_transform_feedback4) - -#endif /* GL_AMD_transform_feedback4 */ - -/* ----------------------- GL_AMD_vertex_shader_layer ---------------------- */ - -#ifndef GL_AMD_vertex_shader_layer -#define GL_AMD_vertex_shader_layer 1 - -#define GLEW_AMD_vertex_shader_layer GLEW_GET_VAR(__GLEW_AMD_vertex_shader_layer) - -#endif /* GL_AMD_vertex_shader_layer */ - -/* -------------------- GL_AMD_vertex_shader_tessellator ------------------- */ - -#ifndef GL_AMD_vertex_shader_tessellator -#define GL_AMD_vertex_shader_tessellator 1 - -#define GL_SAMPLER_BUFFER_AMD 0x9001 -#define GL_INT_SAMPLER_BUFFER_AMD 0x9002 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 -#define GL_TESSELLATION_MODE_AMD 0x9004 -#define GL_TESSELLATION_FACTOR_AMD 0x9005 -#define GL_DISCRETE_AMD 0x9006 -#define GL_CONTINUOUS_AMD 0x9007 - -typedef void (GLAPIENTRY * PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor); -typedef void (GLAPIENTRY * PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); - -#define glTessellationFactorAMD GLEW_GET_FUN(__glewTessellationFactorAMD) -#define glTessellationModeAMD GLEW_GET_FUN(__glewTessellationModeAMD) - -#define GLEW_AMD_vertex_shader_tessellator GLEW_GET_VAR(__GLEW_AMD_vertex_shader_tessellator) - -#endif /* GL_AMD_vertex_shader_tessellator */ - -/* ------------------ GL_AMD_vertex_shader_viewport_index ------------------ */ - -#ifndef GL_AMD_vertex_shader_viewport_index -#define GL_AMD_vertex_shader_viewport_index 1 - -#define GLEW_AMD_vertex_shader_viewport_index GLEW_GET_VAR(__GLEW_AMD_vertex_shader_viewport_index) - -#endif /* GL_AMD_vertex_shader_viewport_index */ - -/* -------------------- GL_ANDROID_extension_pack_es31a -------------------- */ - -#ifndef GL_ANDROID_extension_pack_es31a -#define GL_ANDROID_extension_pack_es31a 1 - -#define GLEW_ANDROID_extension_pack_es31a GLEW_GET_VAR(__GLEW_ANDROID_extension_pack_es31a) - -#endif /* GL_ANDROID_extension_pack_es31a */ - -/* ------------------------- GL_ANGLE_depth_texture ------------------------ */ - -#ifndef GL_ANGLE_depth_texture -#define GL_ANGLE_depth_texture 1 - -#define GLEW_ANGLE_depth_texture GLEW_GET_VAR(__GLEW_ANGLE_depth_texture) - -#endif /* GL_ANGLE_depth_texture */ - -/* ----------------------- GL_ANGLE_framebuffer_blit ----------------------- */ - -#ifndef GL_ANGLE_framebuffer_blit -#define GL_ANGLE_framebuffer_blit 1 - -#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 -#define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA - -typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); - -#define glBlitFramebufferANGLE GLEW_GET_FUN(__glewBlitFramebufferANGLE) - -#define GLEW_ANGLE_framebuffer_blit GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_blit) - -#endif /* GL_ANGLE_framebuffer_blit */ - -/* -------------------- GL_ANGLE_framebuffer_multisample ------------------- */ - -#ifndef GL_ANGLE_framebuffer_multisample -#define GL_ANGLE_framebuffer_multisample 1 - -#define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56 -#define GL_MAX_SAMPLES_ANGLE 0x8D57 - -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - -#define glRenderbufferStorageMultisampleANGLE GLEW_GET_FUN(__glewRenderbufferStorageMultisampleANGLE) - -#define GLEW_ANGLE_framebuffer_multisample GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_multisample) - -#endif /* GL_ANGLE_framebuffer_multisample */ - -/* ----------------------- GL_ANGLE_instanced_arrays ----------------------- */ - -#ifndef GL_ANGLE_instanced_arrays -#define GL_ANGLE_instanced_arrays 1 - -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE - -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor); - -#define glDrawArraysInstancedANGLE GLEW_GET_FUN(__glewDrawArraysInstancedANGLE) -#define glDrawElementsInstancedANGLE GLEW_GET_FUN(__glewDrawElementsInstancedANGLE) -#define glVertexAttribDivisorANGLE GLEW_GET_FUN(__glewVertexAttribDivisorANGLE) - -#define GLEW_ANGLE_instanced_arrays GLEW_GET_VAR(__GLEW_ANGLE_instanced_arrays) - -#endif /* GL_ANGLE_instanced_arrays */ - -/* -------------------- GL_ANGLE_pack_reverse_row_order -------------------- */ - -#ifndef GL_ANGLE_pack_reverse_row_order -#define GL_ANGLE_pack_reverse_row_order 1 - -#define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 - -#define GLEW_ANGLE_pack_reverse_row_order GLEW_GET_VAR(__GLEW_ANGLE_pack_reverse_row_order) - -#endif /* GL_ANGLE_pack_reverse_row_order */ - -/* ------------------------ GL_ANGLE_program_binary ------------------------ */ - -#ifndef GL_ANGLE_program_binary -#define GL_ANGLE_program_binary 1 - -#define GL_PROGRAM_BINARY_ANGLE 0x93A6 - -#define GLEW_ANGLE_program_binary GLEW_GET_VAR(__GLEW_ANGLE_program_binary) - -#endif /* GL_ANGLE_program_binary */ - -/* ------------------- GL_ANGLE_texture_compression_dxt1 ------------------- */ - -#ifndef GL_ANGLE_texture_compression_dxt1 -#define GL_ANGLE_texture_compression_dxt1 1 - -#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 - -#define GLEW_ANGLE_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt1) - -#endif /* GL_ANGLE_texture_compression_dxt1 */ - -/* ------------------- GL_ANGLE_texture_compression_dxt3 ------------------- */ - -#ifndef GL_ANGLE_texture_compression_dxt3 -#define GL_ANGLE_texture_compression_dxt3 1 - -#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 - -#define GLEW_ANGLE_texture_compression_dxt3 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt3) - -#endif /* GL_ANGLE_texture_compression_dxt3 */ - -/* ------------------- GL_ANGLE_texture_compression_dxt5 ------------------- */ - -#ifndef GL_ANGLE_texture_compression_dxt5 -#define GL_ANGLE_texture_compression_dxt5 1 - -#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 - -#define GLEW_ANGLE_texture_compression_dxt5 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt5) - -#endif /* GL_ANGLE_texture_compression_dxt5 */ - -/* ------------------------- GL_ANGLE_texture_usage ------------------------ */ - -#ifndef GL_ANGLE_texture_usage -#define GL_ANGLE_texture_usage 1 - -#define GL_TEXTURE_USAGE_ANGLE 0x93A2 -#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 - -#define GLEW_ANGLE_texture_usage GLEW_GET_VAR(__GLEW_ANGLE_texture_usage) - -#endif /* GL_ANGLE_texture_usage */ - -/* -------------------------- GL_ANGLE_timer_query ------------------------- */ - -#ifndef GL_ANGLE_timer_query -#define GL_ANGLE_timer_query 1 - -#define GL_QUERY_COUNTER_BITS_ANGLE 0x8864 -#define GL_CURRENT_QUERY_ANGLE 0x8865 -#define GL_QUERY_RESULT_ANGLE 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_ANGLE 0x8867 -#define GL_TIME_ELAPSED_ANGLE 0x88BF -#define GL_TIMESTAMP_ANGLE 0x8E28 - -typedef void (GLAPIENTRY * PFNGLBEGINQUERYANGLEPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETEQUERIESANGLEPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLENDQUERYANGLEPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLGENQUERIESANGLEPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VANGLEPROC) (GLuint id, GLenum pname, GLint64* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVANGLEPROC) (GLuint id, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VANGLEPROC) (GLuint id, GLenum pname, GLuint64* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVANGLEPROC) (GLuint id, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYIVANGLEPROC) (GLenum target, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISQUERYANGLEPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERANGLEPROC) (GLuint id, GLenum target); - -#define glBeginQueryANGLE GLEW_GET_FUN(__glewBeginQueryANGLE) -#define glDeleteQueriesANGLE GLEW_GET_FUN(__glewDeleteQueriesANGLE) -#define glEndQueryANGLE GLEW_GET_FUN(__glewEndQueryANGLE) -#define glGenQueriesANGLE GLEW_GET_FUN(__glewGenQueriesANGLE) -#define glGetQueryObjecti64vANGLE GLEW_GET_FUN(__glewGetQueryObjecti64vANGLE) -#define glGetQueryObjectivANGLE GLEW_GET_FUN(__glewGetQueryObjectivANGLE) -#define glGetQueryObjectui64vANGLE GLEW_GET_FUN(__glewGetQueryObjectui64vANGLE) -#define glGetQueryObjectuivANGLE GLEW_GET_FUN(__glewGetQueryObjectuivANGLE) -#define glGetQueryivANGLE GLEW_GET_FUN(__glewGetQueryivANGLE) -#define glIsQueryANGLE GLEW_GET_FUN(__glewIsQueryANGLE) -#define glQueryCounterANGLE GLEW_GET_FUN(__glewQueryCounterANGLE) - -#define GLEW_ANGLE_timer_query GLEW_GET_VAR(__GLEW_ANGLE_timer_query) - -#endif /* GL_ANGLE_timer_query */ - -/* ------------------- GL_ANGLE_translated_shader_source ------------------- */ - -#ifndef GL_ANGLE_translated_shader_source -#define GL_ANGLE_translated_shader_source 1 - -#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 - -typedef void (GLAPIENTRY * PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source); - -#define glGetTranslatedShaderSourceANGLE GLEW_GET_FUN(__glewGetTranslatedShaderSourceANGLE) - -#define GLEW_ANGLE_translated_shader_source GLEW_GET_VAR(__GLEW_ANGLE_translated_shader_source) - -#endif /* GL_ANGLE_translated_shader_source */ - -/* ----------------------- GL_APPLE_aux_depth_stencil ---------------------- */ - -#ifndef GL_APPLE_aux_depth_stencil -#define GL_APPLE_aux_depth_stencil 1 - -#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 - -#define GLEW_APPLE_aux_depth_stencil GLEW_GET_VAR(__GLEW_APPLE_aux_depth_stencil) - -#endif /* GL_APPLE_aux_depth_stencil */ - -/* ------------------------ GL_APPLE_client_storage ------------------------ */ - -#ifndef GL_APPLE_client_storage -#define GL_APPLE_client_storage 1 - -#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 - -#define GLEW_APPLE_client_storage GLEW_GET_VAR(__GLEW_APPLE_client_storage) - -#endif /* GL_APPLE_client_storage */ - -/* ------------------------- GL_APPLE_clip_distance ------------------------ */ - -#ifndef GL_APPLE_clip_distance -#define GL_APPLE_clip_distance 1 - -#define GL_MAX_CLIP_DISTANCES_APPLE 0x0D32 -#define GL_CLIP_DISTANCE0_APPLE 0x3000 -#define GL_CLIP_DISTANCE1_APPLE 0x3001 -#define GL_CLIP_DISTANCE2_APPLE 0x3002 -#define GL_CLIP_DISTANCE3_APPLE 0x3003 -#define GL_CLIP_DISTANCE4_APPLE 0x3004 -#define GL_CLIP_DISTANCE5_APPLE 0x3005 -#define GL_CLIP_DISTANCE6_APPLE 0x3006 -#define GL_CLIP_DISTANCE7_APPLE 0x3007 - -#define GLEW_APPLE_clip_distance GLEW_GET_VAR(__GLEW_APPLE_clip_distance) - -#endif /* GL_APPLE_clip_distance */ - -/* ------------------- GL_APPLE_color_buffer_packed_float ------------------ */ - -#ifndef GL_APPLE_color_buffer_packed_float -#define GL_APPLE_color_buffer_packed_float 1 - -#define GLEW_APPLE_color_buffer_packed_float GLEW_GET_VAR(__GLEW_APPLE_color_buffer_packed_float) - -#endif /* GL_APPLE_color_buffer_packed_float */ - -/* ---------------------- GL_APPLE_copy_texture_levels --------------------- */ - -#ifndef GL_APPLE_copy_texture_levels -#define GL_APPLE_copy_texture_levels 1 - -typedef void (GLAPIENTRY * PFNGLCOPYTEXTURELEVELSAPPLEPROC) (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); - -#define glCopyTextureLevelsAPPLE GLEW_GET_FUN(__glewCopyTextureLevelsAPPLE) - -#define GLEW_APPLE_copy_texture_levels GLEW_GET_VAR(__GLEW_APPLE_copy_texture_levels) - -#endif /* GL_APPLE_copy_texture_levels */ - -/* ------------------------- GL_APPLE_element_array ------------------------ */ - -#ifndef GL_APPLE_element_array -#define GL_APPLE_element_array 1 - -#define GL_ELEMENT_ARRAY_APPLE 0x8A0C -#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D -#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E - -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); -typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void *pointer); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint* first, const GLsizei *count, GLsizei primcount); - -#define glDrawElementArrayAPPLE GLEW_GET_FUN(__glewDrawElementArrayAPPLE) -#define glDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewDrawRangeElementArrayAPPLE) -#define glElementPointerAPPLE GLEW_GET_FUN(__glewElementPointerAPPLE) -#define glMultiDrawElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawElementArrayAPPLE) -#define glMultiDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawRangeElementArrayAPPLE) - -#define GLEW_APPLE_element_array GLEW_GET_VAR(__GLEW_APPLE_element_array) - -#endif /* GL_APPLE_element_array */ - -/* ----------------------------- GL_APPLE_fence ---------------------------- */ - -#ifndef GL_APPLE_fence -#define GL_APPLE_fence 1 - -#define GL_DRAW_PIXELS_APPLE 0x8A0A -#define GL_FENCE_APPLE 0x8A0B - -typedef void (GLAPIENTRY * PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint* fences); -typedef void (GLAPIENTRY * PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); -typedef void (GLAPIENTRY * PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); -typedef void (GLAPIENTRY * PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint* fences); -typedef GLboolean (GLAPIENTRY * PFNGLISFENCEAPPLEPROC) (GLuint fence); -typedef void (GLAPIENTRY * PFNGLSETFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (GLAPIENTRY * PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); - -#define glDeleteFencesAPPLE GLEW_GET_FUN(__glewDeleteFencesAPPLE) -#define glFinishFenceAPPLE GLEW_GET_FUN(__glewFinishFenceAPPLE) -#define glFinishObjectAPPLE GLEW_GET_FUN(__glewFinishObjectAPPLE) -#define glGenFencesAPPLE GLEW_GET_FUN(__glewGenFencesAPPLE) -#define glIsFenceAPPLE GLEW_GET_FUN(__glewIsFenceAPPLE) -#define glSetFenceAPPLE GLEW_GET_FUN(__glewSetFenceAPPLE) -#define glTestFenceAPPLE GLEW_GET_FUN(__glewTestFenceAPPLE) -#define glTestObjectAPPLE GLEW_GET_FUN(__glewTestObjectAPPLE) - -#define GLEW_APPLE_fence GLEW_GET_VAR(__GLEW_APPLE_fence) - -#endif /* GL_APPLE_fence */ - -/* ------------------------- GL_APPLE_float_pixels ------------------------- */ - -#ifndef GL_APPLE_float_pixels -#define GL_APPLE_float_pixels 1 - -#define GL_HALF_APPLE 0x140B -#define GL_RGBA_FLOAT32_APPLE 0x8814 -#define GL_RGB_FLOAT32_APPLE 0x8815 -#define GL_ALPHA_FLOAT32_APPLE 0x8816 -#define GL_INTENSITY_FLOAT32_APPLE 0x8817 -#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 -#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 -#define GL_RGBA_FLOAT16_APPLE 0x881A -#define GL_RGB_FLOAT16_APPLE 0x881B -#define GL_ALPHA_FLOAT16_APPLE 0x881C -#define GL_INTENSITY_FLOAT16_APPLE 0x881D -#define GL_LUMINANCE_FLOAT16_APPLE 0x881E -#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F -#define GL_COLOR_FLOAT_APPLE 0x8A0F - -#define GLEW_APPLE_float_pixels GLEW_GET_VAR(__GLEW_APPLE_float_pixels) - -#endif /* GL_APPLE_float_pixels */ - -/* ---------------------- GL_APPLE_flush_buffer_range ---------------------- */ - -#ifndef GL_APPLE_flush_buffer_range -#define GL_APPLE_flush_buffer_range 1 - -#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 -#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 - -typedef void (GLAPIENTRY * PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); - -#define glBufferParameteriAPPLE GLEW_GET_FUN(__glewBufferParameteriAPPLE) -#define glFlushMappedBufferRangeAPPLE GLEW_GET_FUN(__glewFlushMappedBufferRangeAPPLE) - -#define GLEW_APPLE_flush_buffer_range GLEW_GET_VAR(__GLEW_APPLE_flush_buffer_range) - -#endif /* GL_APPLE_flush_buffer_range */ - -/* -------------------- GL_APPLE_framebuffer_multisample ------------------- */ - -#ifndef GL_APPLE_framebuffer_multisample -#define GL_APPLE_framebuffer_multisample 1 - -#define GL_DRAW_FRAMEBUFFER_BINDING_APPLE 0x8CA6 -#define GL_READ_FRAMEBUFFER_APPLE 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_APPLE 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING_APPLE 0x8CAA -#define GL_RENDERBUFFER_SAMPLES_APPLE 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE 0x8D56 -#define GL_MAX_SAMPLES_APPLE 0x8D57 - -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC) (void); - -#define glRenderbufferStorageMultisampleAPPLE GLEW_GET_FUN(__glewRenderbufferStorageMultisampleAPPLE) -#define glResolveMultisampleFramebufferAPPLE GLEW_GET_FUN(__glewResolveMultisampleFramebufferAPPLE) - -#define GLEW_APPLE_framebuffer_multisample GLEW_GET_VAR(__GLEW_APPLE_framebuffer_multisample) - -#endif /* GL_APPLE_framebuffer_multisample */ - -/* ----------------------- GL_APPLE_object_purgeable ----------------------- */ - -#ifndef GL_APPLE_object_purgeable -#define GL_APPLE_object_purgeable 1 - -#define GL_BUFFER_OBJECT_APPLE 0x85B3 -#define GL_RELEASED_APPLE 0x8A19 -#define GL_VOLATILE_APPLE 0x8A1A -#define GL_RETAINED_APPLE 0x8A1B -#define GL_UNDEFINED_APPLE 0x8A1C -#define GL_PURGEABLE_APPLE 0x8A1D - -typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint* params); -typedef GLenum (GLAPIENTRY * PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); -typedef GLenum (GLAPIENTRY * PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); - -#define glGetObjectParameterivAPPLE GLEW_GET_FUN(__glewGetObjectParameterivAPPLE) -#define glObjectPurgeableAPPLE GLEW_GET_FUN(__glewObjectPurgeableAPPLE) -#define glObjectUnpurgeableAPPLE GLEW_GET_FUN(__glewObjectUnpurgeableAPPLE) - -#define GLEW_APPLE_object_purgeable GLEW_GET_VAR(__GLEW_APPLE_object_purgeable) - -#endif /* GL_APPLE_object_purgeable */ - -/* ------------------------- GL_APPLE_pixel_buffer ------------------------- */ - -#ifndef GL_APPLE_pixel_buffer -#define GL_APPLE_pixel_buffer 1 - -#define GL_MIN_PBUFFER_VIEWPORT_DIMS_APPLE 0x8A10 - -#define GLEW_APPLE_pixel_buffer GLEW_GET_VAR(__GLEW_APPLE_pixel_buffer) - -#endif /* GL_APPLE_pixel_buffer */ - -/* ---------------------------- GL_APPLE_rgb_422 --------------------------- */ - -#ifndef GL_APPLE_rgb_422 -#define GL_APPLE_rgb_422 1 - -#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB -#define GL_RGB_422_APPLE 0x8A1F -#define GL_RGB_RAW_422_APPLE 0x8A51 - -#define GLEW_APPLE_rgb_422 GLEW_GET_VAR(__GLEW_APPLE_rgb_422) - -#endif /* GL_APPLE_rgb_422 */ - -/* --------------------------- GL_APPLE_row_bytes -------------------------- */ - -#ifndef GL_APPLE_row_bytes -#define GL_APPLE_row_bytes 1 - -#define GL_PACK_ROW_BYTES_APPLE 0x8A15 -#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 - -#define GLEW_APPLE_row_bytes GLEW_GET_VAR(__GLEW_APPLE_row_bytes) - -#endif /* GL_APPLE_row_bytes */ - -/* ------------------------ GL_APPLE_specular_vector ----------------------- */ - -#ifndef GL_APPLE_specular_vector -#define GL_APPLE_specular_vector 1 - -#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 - -#define GLEW_APPLE_specular_vector GLEW_GET_VAR(__GLEW_APPLE_specular_vector) - -#endif /* GL_APPLE_specular_vector */ - -/* ----------------------------- GL_APPLE_sync ----------------------------- */ - -#ifndef GL_APPLE_sync -#define GL_APPLE_sync 1 - -#define GL_SYNC_FLUSH_COMMANDS_BIT_APPLE 0x00000001 -#define GL_SYNC_OBJECT_APPLE 0x8A53 -#define GL_MAX_SERVER_WAIT_TIMEOUT_APPLE 0x9111 -#define GL_OBJECT_TYPE_APPLE 0x9112 -#define GL_SYNC_CONDITION_APPLE 0x9113 -#define GL_SYNC_STATUS_APPLE 0x9114 -#define GL_SYNC_FLAGS_APPLE 0x9115 -#define GL_SYNC_FENCE_APPLE 0x9116 -#define GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE 0x9117 -#define GL_UNSIGNALED_APPLE 0x9118 -#define GL_SIGNALED_APPLE 0x9119 -#define GL_ALREADY_SIGNALED_APPLE 0x911A -#define GL_TIMEOUT_EXPIRED_APPLE 0x911B -#define GL_CONDITION_SATISFIED_APPLE 0x911C -#define GL_WAIT_FAILED_APPLE 0x911D -#define GL_TIMEOUT_IGNORED_APPLE 0xFFFFFFFFFFFFFFFFull - -typedef GLenum (GLAPIENTRY * PFNGLCLIENTWAITSYNCAPPLEPROC) (GLsync GLsync, GLbitfield flags, GLuint64 timeout); -typedef void (GLAPIENTRY * PFNGLDELETESYNCAPPLEPROC) (GLsync GLsync); -typedef GLsync (GLAPIENTRY * PFNGLFENCESYNCAPPLEPROC) (GLenum condition, GLbitfield flags); -typedef void (GLAPIENTRY * PFNGLGETINTEGER64VAPPLEPROC) (GLenum pname, GLint64* params); -typedef void (GLAPIENTRY * PFNGLGETSYNCIVAPPLEPROC) (GLsync GLsync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint *values); -typedef GLboolean (GLAPIENTRY * PFNGLISSYNCAPPLEPROC) (GLsync GLsync); -typedef void (GLAPIENTRY * PFNGLWAITSYNCAPPLEPROC) (GLsync GLsync, GLbitfield flags, GLuint64 timeout); - -#define glClientWaitSyncAPPLE GLEW_GET_FUN(__glewClientWaitSyncAPPLE) -#define glDeleteSyncAPPLE GLEW_GET_FUN(__glewDeleteSyncAPPLE) -#define glFenceSyncAPPLE GLEW_GET_FUN(__glewFenceSyncAPPLE) -#define glGetInteger64vAPPLE GLEW_GET_FUN(__glewGetInteger64vAPPLE) -#define glGetSyncivAPPLE GLEW_GET_FUN(__glewGetSyncivAPPLE) -#define glIsSyncAPPLE GLEW_GET_FUN(__glewIsSyncAPPLE) -#define glWaitSyncAPPLE GLEW_GET_FUN(__glewWaitSyncAPPLE) - -#define GLEW_APPLE_sync GLEW_GET_VAR(__GLEW_APPLE_sync) - -#endif /* GL_APPLE_sync */ - -/* -------------------- GL_APPLE_texture_2D_limited_npot ------------------- */ - -#ifndef GL_APPLE_texture_2D_limited_npot -#define GL_APPLE_texture_2D_limited_npot 1 - -#define GLEW_APPLE_texture_2D_limited_npot GLEW_GET_VAR(__GLEW_APPLE_texture_2D_limited_npot) - -#endif /* GL_APPLE_texture_2D_limited_npot */ - -/* -------------------- GL_APPLE_texture_format_BGRA8888 ------------------- */ - -#ifndef GL_APPLE_texture_format_BGRA8888 -#define GL_APPLE_texture_format_BGRA8888 1 - -#define GL_BGRA_EXT 0x80E1 -#define GL_BGRA8_EXT 0x93A1 - -#define GLEW_APPLE_texture_format_BGRA8888 GLEW_GET_VAR(__GLEW_APPLE_texture_format_BGRA8888) - -#endif /* GL_APPLE_texture_format_BGRA8888 */ - -/* ----------------------- GL_APPLE_texture_max_level ---------------------- */ - -#ifndef GL_APPLE_texture_max_level -#define GL_APPLE_texture_max_level 1 - -#define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D - -#define GLEW_APPLE_texture_max_level GLEW_GET_VAR(__GLEW_APPLE_texture_max_level) - -#endif /* GL_APPLE_texture_max_level */ - -/* --------------------- GL_APPLE_texture_packed_float --------------------- */ - -#ifndef GL_APPLE_texture_packed_float -#define GL_APPLE_texture_packed_float 1 - -#define GL_R11F_G11F_B10F_APPLE 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV_APPLE 0x8C3B -#define GL_RGB9_E5_APPLE 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV_APPLE 0x8C3E - -#define GLEW_APPLE_texture_packed_float GLEW_GET_VAR(__GLEW_APPLE_texture_packed_float) - -#endif /* GL_APPLE_texture_packed_float */ - -/* ------------------------- GL_APPLE_texture_range ------------------------ */ - -#ifndef GL_APPLE_texture_range -#define GL_APPLE_texture_range 1 - -#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 -#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 -#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC -#define GL_STORAGE_PRIVATE_APPLE 0x85BD -#define GL_STORAGE_CACHED_APPLE 0x85BE -#define GL_STORAGE_SHARED_APPLE 0x85BF - -typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, void **params); -typedef void (GLAPIENTRY * PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, void *pointer); - -#define glGetTexParameterPointervAPPLE GLEW_GET_FUN(__glewGetTexParameterPointervAPPLE) -#define glTextureRangeAPPLE GLEW_GET_FUN(__glewTextureRangeAPPLE) - -#define GLEW_APPLE_texture_range GLEW_GET_VAR(__GLEW_APPLE_texture_range) - -#endif /* GL_APPLE_texture_range */ - -/* ------------------------ GL_APPLE_transform_hint ------------------------ */ - -#ifndef GL_APPLE_transform_hint -#define GL_APPLE_transform_hint 1 - -#define GL_TRANSFORM_HINT_APPLE 0x85B1 - -#define GLEW_APPLE_transform_hint GLEW_GET_VAR(__GLEW_APPLE_transform_hint) - -#endif /* GL_APPLE_transform_hint */ - -/* ---------------------- GL_APPLE_vertex_array_object --------------------- */ - -#ifndef GL_APPLE_vertex_array_object -#define GL_APPLE_vertex_array_object 1 - -#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 - -typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); -typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); -typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); -typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); - -#define glBindVertexArrayAPPLE GLEW_GET_FUN(__glewBindVertexArrayAPPLE) -#define glDeleteVertexArraysAPPLE GLEW_GET_FUN(__glewDeleteVertexArraysAPPLE) -#define glGenVertexArraysAPPLE GLEW_GET_FUN(__glewGenVertexArraysAPPLE) -#define glIsVertexArrayAPPLE GLEW_GET_FUN(__glewIsVertexArrayAPPLE) - -#define GLEW_APPLE_vertex_array_object GLEW_GET_VAR(__GLEW_APPLE_vertex_array_object) - -#endif /* GL_APPLE_vertex_array_object */ - -/* ---------------------- GL_APPLE_vertex_array_range ---------------------- */ - -#ifndef GL_APPLE_vertex_array_range -#define GL_APPLE_vertex_array_range 1 - -#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E -#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F -#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE 0x8520 -#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 -#define GL_STORAGE_CLIENT_APPLE 0x85B4 -#define GL_STORAGE_CACHED_APPLE 0x85BE -#define GL_STORAGE_SHARED_APPLE 0x85BF - -typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); - -#define glFlushVertexArrayRangeAPPLE GLEW_GET_FUN(__glewFlushVertexArrayRangeAPPLE) -#define glVertexArrayParameteriAPPLE GLEW_GET_FUN(__glewVertexArrayParameteriAPPLE) -#define glVertexArrayRangeAPPLE GLEW_GET_FUN(__glewVertexArrayRangeAPPLE) - -#define GLEW_APPLE_vertex_array_range GLEW_GET_VAR(__GLEW_APPLE_vertex_array_range) - -#endif /* GL_APPLE_vertex_array_range */ - -/* ------------------- GL_APPLE_vertex_program_evaluators ------------------ */ - -#ifndef GL_APPLE_vertex_program_evaluators -#define GL_APPLE_vertex_program_evaluators 1 - -#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 -#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 -#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 -#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 -#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 -#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 -#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 -#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 -#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 -#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 - -typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); -typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); -typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname); -typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble* points); -typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat* points); -typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble* points); -typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat* points); - -#define glDisableVertexAttribAPPLE GLEW_GET_FUN(__glewDisableVertexAttribAPPLE) -#define glEnableVertexAttribAPPLE GLEW_GET_FUN(__glewEnableVertexAttribAPPLE) -#define glIsVertexAttribEnabledAPPLE GLEW_GET_FUN(__glewIsVertexAttribEnabledAPPLE) -#define glMapVertexAttrib1dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1dAPPLE) -#define glMapVertexAttrib1fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1fAPPLE) -#define glMapVertexAttrib2dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2dAPPLE) -#define glMapVertexAttrib2fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2fAPPLE) - -#define GLEW_APPLE_vertex_program_evaluators GLEW_GET_VAR(__GLEW_APPLE_vertex_program_evaluators) - -#endif /* GL_APPLE_vertex_program_evaluators */ - -/* --------------------------- GL_APPLE_ycbcr_422 -------------------------- */ - -#ifndef GL_APPLE_ycbcr_422 -#define GL_APPLE_ycbcr_422 1 - -#define GL_YCBCR_422_APPLE 0x85B9 - -#define GLEW_APPLE_ycbcr_422 GLEW_GET_VAR(__GLEW_APPLE_ycbcr_422) - -#endif /* GL_APPLE_ycbcr_422 */ - -/* ------------------------ GL_ARB_ES2_compatibility ----------------------- */ - -#ifndef GL_ARB_ES2_compatibility -#define GL_ARB_ES2_compatibility 1 - -#define GL_FIXED 0x140C -#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B -#define GL_RGB565 0x8D62 -#define GL_LOW_FLOAT 0x8DF0 -#define GL_MEDIUM_FLOAT 0x8DF1 -#define GL_HIGH_FLOAT 0x8DF2 -#define GL_LOW_INT 0x8DF3 -#define GL_MEDIUM_INT 0x8DF4 -#define GL_HIGH_INT 0x8DF5 -#define GL_SHADER_BINARY_FORMATS 0x8DF8 -#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 -#define GL_SHADER_COMPILER 0x8DFA -#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB -#define GL_MAX_VARYING_VECTORS 0x8DFC -#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD - -typedef int GLfixed; - -typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFPROC) (GLclampf d); -typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFPROC) (GLclampf n, GLclampf f); -typedef void (GLAPIENTRY * PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint* range, GLint *precision); -typedef void (GLAPIENTRY * PFNGLRELEASESHADERCOMPILERPROC) (void); -typedef void (GLAPIENTRY * PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint* shaders, GLenum binaryformat, const void*binary, GLsizei length); - -#define glClearDepthf GLEW_GET_FUN(__glewClearDepthf) -#define glDepthRangef GLEW_GET_FUN(__glewDepthRangef) -#define glGetShaderPrecisionFormat GLEW_GET_FUN(__glewGetShaderPrecisionFormat) -#define glReleaseShaderCompiler GLEW_GET_FUN(__glewReleaseShaderCompiler) -#define glShaderBinary GLEW_GET_FUN(__glewShaderBinary) - -#define GLEW_ARB_ES2_compatibility GLEW_GET_VAR(__GLEW_ARB_ES2_compatibility) - -#endif /* GL_ARB_ES2_compatibility */ - -/* ----------------------- GL_ARB_ES3_1_compatibility ---------------------- */ - -#ifndef GL_ARB_ES3_1_compatibility -#define GL_ARB_ES3_1_compatibility 1 - -typedef void (GLAPIENTRY * PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers); - -#define glMemoryBarrierByRegion GLEW_GET_FUN(__glewMemoryBarrierByRegion) - -#define GLEW_ARB_ES3_1_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_1_compatibility) - -#endif /* GL_ARB_ES3_1_compatibility */ - -/* ----------------------- GL_ARB_ES3_2_compatibility ---------------------- */ - -#ifndef GL_ARB_ES3_2_compatibility -#define GL_ARB_ES3_2_compatibility 1 - -#define GL_PRIMITIVE_BOUNDING_BOX_ARB 0x92BE -#define GL_MULTISAMPLE_LINE_WIDTH_RANGE_ARB 0x9381 -#define GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY_ARB 0x9382 - -typedef void (GLAPIENTRY * PFNGLPRIMITIVEBOUNDINGBOXARBPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); - -#define glPrimitiveBoundingBoxARB GLEW_GET_FUN(__glewPrimitiveBoundingBoxARB) - -#define GLEW_ARB_ES3_2_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_2_compatibility) - -#endif /* GL_ARB_ES3_2_compatibility */ - -/* ------------------------ GL_ARB_ES3_compatibility ----------------------- */ - -#ifndef GL_ARB_ES3_compatibility -#define GL_ARB_ES3_compatibility 1 - -#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF -#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 -#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A -#define GL_MAX_ELEMENT_INDEX 0x8D6B -#define GL_COMPRESSED_R11_EAC 0x9270 -#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 -#define GL_COMPRESSED_RG11_EAC 0x9272 -#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 -#define GL_COMPRESSED_RGB8_ETC2 0x9274 -#define GL_COMPRESSED_SRGB8_ETC2 0x9275 -#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 -#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 -#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 -#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 - -#define GLEW_ARB_ES3_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_compatibility) - -#endif /* GL_ARB_ES3_compatibility */ - -/* ------------------------ GL_ARB_arrays_of_arrays ------------------------ */ - -#ifndef GL_ARB_arrays_of_arrays -#define GL_ARB_arrays_of_arrays 1 - -#define GLEW_ARB_arrays_of_arrays GLEW_GET_VAR(__GLEW_ARB_arrays_of_arrays) - -#endif /* GL_ARB_arrays_of_arrays */ - -/* -------------------------- GL_ARB_base_instance ------------------------- */ - -#ifndef GL_ARB_base_instance -#define GL_ARB_base_instance 1 - -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount, GLuint baseinstance); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLuint baseinstance); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLint basevertex, GLuint baseinstance); - -#define glDrawArraysInstancedBaseInstance GLEW_GET_FUN(__glewDrawArraysInstancedBaseInstance) -#define glDrawElementsInstancedBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseInstance) -#define glDrawElementsInstancedBaseVertexBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertexBaseInstance) - -#define GLEW_ARB_base_instance GLEW_GET_VAR(__GLEW_ARB_base_instance) - -#endif /* GL_ARB_base_instance */ - -/* ------------------------ GL_ARB_bindless_texture ------------------------ */ - -#ifndef GL_ARB_bindless_texture -#define GL_ARB_bindless_texture 1 - -#define GL_UNSIGNED_INT64_ARB 0x140F - -typedef GLuint64 (GLAPIENTRY * PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); -typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture); -typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT* params); -typedef GLboolean (GLAPIENTRY * PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle); -typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access); -typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values); -typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value); -typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT* v); - -#define glGetImageHandleARB GLEW_GET_FUN(__glewGetImageHandleARB) -#define glGetTextureHandleARB GLEW_GET_FUN(__glewGetTextureHandleARB) -#define glGetTextureSamplerHandleARB GLEW_GET_FUN(__glewGetTextureSamplerHandleARB) -#define glGetVertexAttribLui64vARB GLEW_GET_FUN(__glewGetVertexAttribLui64vARB) -#define glIsImageHandleResidentARB GLEW_GET_FUN(__glewIsImageHandleResidentARB) -#define glIsTextureHandleResidentARB GLEW_GET_FUN(__glewIsTextureHandleResidentARB) -#define glMakeImageHandleNonResidentARB GLEW_GET_FUN(__glewMakeImageHandleNonResidentARB) -#define glMakeImageHandleResidentARB GLEW_GET_FUN(__glewMakeImageHandleResidentARB) -#define glMakeTextureHandleNonResidentARB GLEW_GET_FUN(__glewMakeTextureHandleNonResidentARB) -#define glMakeTextureHandleResidentARB GLEW_GET_FUN(__glewMakeTextureHandleResidentARB) -#define glProgramUniformHandleui64ARB GLEW_GET_FUN(__glewProgramUniformHandleui64ARB) -#define glProgramUniformHandleui64vARB GLEW_GET_FUN(__glewProgramUniformHandleui64vARB) -#define glUniformHandleui64ARB GLEW_GET_FUN(__glewUniformHandleui64ARB) -#define glUniformHandleui64vARB GLEW_GET_FUN(__glewUniformHandleui64vARB) -#define glVertexAttribL1ui64ARB GLEW_GET_FUN(__glewVertexAttribL1ui64ARB) -#define glVertexAttribL1ui64vARB GLEW_GET_FUN(__glewVertexAttribL1ui64vARB) - -#define GLEW_ARB_bindless_texture GLEW_GET_VAR(__GLEW_ARB_bindless_texture) - -#endif /* GL_ARB_bindless_texture */ - -/* ----------------------- GL_ARB_blend_func_extended ---------------------- */ - -#ifndef GL_ARB_blend_func_extended -#define GL_ARB_blend_func_extended 1 - -#define GL_SRC1_COLOR 0x88F9 -#define GL_ONE_MINUS_SRC1_COLOR 0x88FA -#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB -#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC - -typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); -typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar * name); - -#define glBindFragDataLocationIndexed GLEW_GET_FUN(__glewBindFragDataLocationIndexed) -#define glGetFragDataIndex GLEW_GET_FUN(__glewGetFragDataIndex) - -#define GLEW_ARB_blend_func_extended GLEW_GET_VAR(__GLEW_ARB_blend_func_extended) - -#endif /* GL_ARB_blend_func_extended */ - -/* ------------------------- GL_ARB_buffer_storage ------------------------- */ - -#ifndef GL_ARB_buffer_storage -#define GL_ARB_buffer_storage 1 - -#define GL_MAP_READ_BIT 0x0001 -#define GL_MAP_WRITE_BIT 0x0002 -#define GL_MAP_PERSISTENT_BIT 0x00000040 -#define GL_MAP_COHERENT_BIT 0x00000080 -#define GL_DYNAMIC_STORAGE_BIT 0x0100 -#define GL_CLIENT_STORAGE_BIT 0x0200 -#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 -#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F -#define GL_BUFFER_STORAGE_FLAGS 0x8220 - -typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); - -#define glBufferStorage GLEW_GET_FUN(__glewBufferStorage) - -#define GLEW_ARB_buffer_storage GLEW_GET_VAR(__GLEW_ARB_buffer_storage) - -#endif /* GL_ARB_buffer_storage */ - -/* ---------------------------- GL_ARB_cl_event ---------------------------- */ - -#ifndef GL_ARB_cl_event -#define GL_ARB_cl_event 1 - -#define GL_SYNC_CL_EVENT_ARB 0x8240 -#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 - -typedef struct _cl_context *cl_context; -typedef struct _cl_event *cl_event; - -typedef GLsync (GLAPIENTRY * PFNGLCREATESYNCFROMCLEVENTARBPROC) (cl_context context, cl_event event, GLbitfield flags); - -#define glCreateSyncFromCLeventARB GLEW_GET_FUN(__glewCreateSyncFromCLeventARB) - -#define GLEW_ARB_cl_event GLEW_GET_VAR(__GLEW_ARB_cl_event) - -#endif /* GL_ARB_cl_event */ - -/* ----------------------- GL_ARB_clear_buffer_object ---------------------- */ - -#ifndef GL_ARB_clear_buffer_object -#define GL_ARB_clear_buffer_object 1 - -typedef void (GLAPIENTRY * PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); - -#define glClearBufferData GLEW_GET_FUN(__glewClearBufferData) -#define glClearBufferSubData GLEW_GET_FUN(__glewClearBufferSubData) -#define glClearNamedBufferDataEXT GLEW_GET_FUN(__glewClearNamedBufferDataEXT) -#define glClearNamedBufferSubDataEXT GLEW_GET_FUN(__glewClearNamedBufferSubDataEXT) - -#define GLEW_ARB_clear_buffer_object GLEW_GET_VAR(__GLEW_ARB_clear_buffer_object) - -#endif /* GL_ARB_clear_buffer_object */ - -/* -------------------------- GL_ARB_clear_texture ------------------------- */ - -#ifndef GL_ARB_clear_texture -#define GL_ARB_clear_texture 1 - -#define GL_CLEAR_TEXTURE 0x9365 - -typedef void (GLAPIENTRY * PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); - -#define glClearTexImage GLEW_GET_FUN(__glewClearTexImage) -#define glClearTexSubImage GLEW_GET_FUN(__glewClearTexSubImage) - -#define GLEW_ARB_clear_texture GLEW_GET_VAR(__GLEW_ARB_clear_texture) - -#endif /* GL_ARB_clear_texture */ - -/* -------------------------- GL_ARB_clip_control -------------------------- */ - -#ifndef GL_ARB_clip_control -#define GL_ARB_clip_control 1 - -#define GL_LOWER_LEFT 0x8CA1 -#define GL_UPPER_LEFT 0x8CA2 -#define GL_CLIP_ORIGIN 0x935C -#define GL_CLIP_DEPTH_MODE 0x935D -#define GL_NEGATIVE_ONE_TO_ONE 0x935E -#define GL_ZERO_TO_ONE 0x935F - -typedef void (GLAPIENTRY * PFNGLCLIPCONTROLPROC) (GLenum origin, GLenum depth); - -#define glClipControl GLEW_GET_FUN(__glewClipControl) - -#define GLEW_ARB_clip_control GLEW_GET_VAR(__GLEW_ARB_clip_control) - -#endif /* GL_ARB_clip_control */ - -/* ----------------------- GL_ARB_color_buffer_float ----------------------- */ - -#ifndef GL_ARB_color_buffer_float -#define GL_ARB_color_buffer_float 1 - -#define GL_RGBA_FLOAT_MODE_ARB 0x8820 -#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A -#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B -#define GL_CLAMP_READ_COLOR_ARB 0x891C -#define GL_FIXED_ONLY_ARB 0x891D - -typedef void (GLAPIENTRY * PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); - -#define glClampColorARB GLEW_GET_FUN(__glewClampColorARB) - -#define GLEW_ARB_color_buffer_float GLEW_GET_VAR(__GLEW_ARB_color_buffer_float) - -#endif /* GL_ARB_color_buffer_float */ - -/* -------------------------- GL_ARB_compatibility ------------------------- */ - -#ifndef GL_ARB_compatibility -#define GL_ARB_compatibility 1 - -#define GLEW_ARB_compatibility GLEW_GET_VAR(__GLEW_ARB_compatibility) - -#endif /* GL_ARB_compatibility */ - -/* ---------------- GL_ARB_compressed_texture_pixel_storage ---------------- */ - -#ifndef GL_ARB_compressed_texture_pixel_storage -#define GL_ARB_compressed_texture_pixel_storage 1 - -#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 -#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 -#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 -#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A -#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B -#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C -#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D -#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E - -#define GLEW_ARB_compressed_texture_pixel_storage GLEW_GET_VAR(__GLEW_ARB_compressed_texture_pixel_storage) - -#endif /* GL_ARB_compressed_texture_pixel_storage */ - -/* ------------------------- GL_ARB_compute_shader ------------------------- */ - -#ifndef GL_ARB_compute_shader -#define GL_ARB_compute_shader 1 - -#define GL_COMPUTE_SHADER_BIT 0x00000020 -#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 -#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 -#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 -#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 -#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 -#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 -#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB -#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED -#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE -#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF -#define GL_COMPUTE_SHADER 0x91B9 -#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB -#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC -#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD -#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE -#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF - -typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); -typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); - -#define glDispatchCompute GLEW_GET_FUN(__glewDispatchCompute) -#define glDispatchComputeIndirect GLEW_GET_FUN(__glewDispatchComputeIndirect) - -#define GLEW_ARB_compute_shader GLEW_GET_VAR(__GLEW_ARB_compute_shader) - -#endif /* GL_ARB_compute_shader */ - -/* ------------------- GL_ARB_compute_variable_group_size ------------------ */ - -#ifndef GL_ARB_compute_variable_group_size -#define GL_ARB_compute_variable_group_size 1 - -#define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB -#define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF -#define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344 -#define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345 - -typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); - -#define glDispatchComputeGroupSizeARB GLEW_GET_FUN(__glewDispatchComputeGroupSizeARB) - -#define GLEW_ARB_compute_variable_group_size GLEW_GET_VAR(__GLEW_ARB_compute_variable_group_size) - -#endif /* GL_ARB_compute_variable_group_size */ - -/* ------------------- GL_ARB_conditional_render_inverted ------------------ */ - -#ifndef GL_ARB_conditional_render_inverted -#define GL_ARB_conditional_render_inverted 1 - -#define GL_QUERY_WAIT_INVERTED 0x8E17 -#define GL_QUERY_NO_WAIT_INVERTED 0x8E18 -#define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19 -#define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A - -#define GLEW_ARB_conditional_render_inverted GLEW_GET_VAR(__GLEW_ARB_conditional_render_inverted) - -#endif /* GL_ARB_conditional_render_inverted */ - -/* ----------------------- GL_ARB_conservative_depth ----------------------- */ - -#ifndef GL_ARB_conservative_depth -#define GL_ARB_conservative_depth 1 - -#define GLEW_ARB_conservative_depth GLEW_GET_VAR(__GLEW_ARB_conservative_depth) - -#endif /* GL_ARB_conservative_depth */ - -/* --------------------------- GL_ARB_copy_buffer -------------------------- */ - -#ifndef GL_ARB_copy_buffer -#define GL_ARB_copy_buffer 1 - -#define GL_COPY_READ_BUFFER 0x8F36 -#define GL_COPY_WRITE_BUFFER 0x8F37 - -typedef void (GLAPIENTRY * PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size); - -#define glCopyBufferSubData GLEW_GET_FUN(__glewCopyBufferSubData) - -#define GLEW_ARB_copy_buffer GLEW_GET_VAR(__GLEW_ARB_copy_buffer) - -#endif /* GL_ARB_copy_buffer */ - -/* --------------------------- GL_ARB_copy_image --------------------------- */ - -#ifndef GL_ARB_copy_image -#define GL_ARB_copy_image 1 - -typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); - -#define glCopyImageSubData GLEW_GET_FUN(__glewCopyImageSubData) - -#define GLEW_ARB_copy_image GLEW_GET_VAR(__GLEW_ARB_copy_image) - -#endif /* GL_ARB_copy_image */ - -/* -------------------------- GL_ARB_cull_distance ------------------------- */ - -#ifndef GL_ARB_cull_distance -#define GL_ARB_cull_distance 1 - -#define GL_MAX_CULL_DISTANCES 0x82F9 -#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA - -#define GLEW_ARB_cull_distance GLEW_GET_VAR(__GLEW_ARB_cull_distance) - -#endif /* GL_ARB_cull_distance */ - -/* -------------------------- GL_ARB_debug_output -------------------------- */ - -#ifndef GL_ARB_debug_output -#define GL_ARB_debug_output 1 - -#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 -#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 -#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 -#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 -#define GL_DEBUG_SOURCE_API_ARB 0x8246 -#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 -#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 -#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 -#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A -#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B -#define GL_DEBUG_TYPE_ERROR_ARB 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E -#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 -#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 -#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 -#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 -#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 - -typedef void (GLAPIENTRY *GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam); - -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const void *userParam); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); -typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); - -#define glDebugMessageCallbackARB GLEW_GET_FUN(__glewDebugMessageCallbackARB) -#define glDebugMessageControlARB GLEW_GET_FUN(__glewDebugMessageControlARB) -#define glDebugMessageInsertARB GLEW_GET_FUN(__glewDebugMessageInsertARB) -#define glGetDebugMessageLogARB GLEW_GET_FUN(__glewGetDebugMessageLogARB) - -#define GLEW_ARB_debug_output GLEW_GET_VAR(__GLEW_ARB_debug_output) - -#endif /* GL_ARB_debug_output */ - -/* ----------------------- GL_ARB_depth_buffer_float ----------------------- */ - -#ifndef GL_ARB_depth_buffer_float -#define GL_ARB_depth_buffer_float 1 - -#define GL_DEPTH_COMPONENT32F 0x8CAC -#define GL_DEPTH32F_STENCIL8 0x8CAD -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD - -#define GLEW_ARB_depth_buffer_float GLEW_GET_VAR(__GLEW_ARB_depth_buffer_float) - -#endif /* GL_ARB_depth_buffer_float */ - -/* --------------------------- GL_ARB_depth_clamp -------------------------- */ - -#ifndef GL_ARB_depth_clamp -#define GL_ARB_depth_clamp 1 - -#define GL_DEPTH_CLAMP 0x864F - -#define GLEW_ARB_depth_clamp GLEW_GET_VAR(__GLEW_ARB_depth_clamp) - -#endif /* GL_ARB_depth_clamp */ - -/* -------------------------- GL_ARB_depth_texture ------------------------- */ - -#ifndef GL_ARB_depth_texture -#define GL_ARB_depth_texture 1 - -#define GL_DEPTH_COMPONENT16_ARB 0x81A5 -#define GL_DEPTH_COMPONENT24_ARB 0x81A6 -#define GL_DEPTH_COMPONENT32_ARB 0x81A7 -#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A -#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B - -#define GLEW_ARB_depth_texture GLEW_GET_VAR(__GLEW_ARB_depth_texture) - -#endif /* GL_ARB_depth_texture */ - -/* ----------------------- GL_ARB_derivative_control ----------------------- */ - -#ifndef GL_ARB_derivative_control -#define GL_ARB_derivative_control 1 - -#define GLEW_ARB_derivative_control GLEW_GET_VAR(__GLEW_ARB_derivative_control) - -#endif /* GL_ARB_derivative_control */ - -/* ----------------------- GL_ARB_direct_state_access ---------------------- */ - -#ifndef GL_ARB_direct_state_access -#define GL_ARB_direct_state_access 1 - -#define GL_TEXTURE_TARGET 0x1006 -#define GL_QUERY_TARGET 0x82EA - -typedef void (GLAPIENTRY * PFNGLBINDTEXTUREUNITPROC) (GLuint unit, GLuint texture); -typedef void (GLAPIENTRY * PFNGLBLITNAMEDFRAMEBUFFERPROC) (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) (GLuint framebuffer, GLenum target); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERDATAPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint* value); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOPYNAMEDBUFFERSUBDATAPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLCREATEBUFFERSPROC) (GLsizei n, GLuint* buffers); -typedef void (GLAPIENTRY * PFNGLCREATEFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers); -typedef void (GLAPIENTRY * PFNGLCREATEPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines); -typedef void (GLAPIENTRY * PFNGLCREATEQUERIESPROC) (GLenum target, GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLCREATERENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers); -typedef void (GLAPIENTRY * PFNGLCREATESAMPLERSPROC) (GLsizei n, GLuint* samplers); -typedef void (GLAPIENTRY * PFNGLCREATETEXTURESPROC) (GLenum target, GLsizei n, GLuint* textures); -typedef void (GLAPIENTRY * PFNGLCREATETRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLCREATEVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays); -typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); -typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); -typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPPROC) (GLuint texture); -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLsizei bufSize, void *pixels); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) (GLuint buffer, GLenum pname, GLint64* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVPROC) (GLuint buffer, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVPROC) (GLuint buffer, GLenum pname, void** params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); -typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) (GLuint framebuffer, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) (GLuint renderbuffer, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTUI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTUIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); -typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVPROC) (GLuint texture, GLint level, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVPROC) (GLuint texture, GLint level, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64* param); -typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKIVPROC) (GLuint xfb, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINDEXED64IVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint64* param); -typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINDEXEDIVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYIVPROC) (GLuint vaobj, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments); -typedef void (GLAPIENTRY * PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERPROC) (GLuint buffer, GLenum access); -typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) (GLuint framebuffer, GLenum mode); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) (GLuint framebuffer, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) (GLuint framebuffer, GLenum mode); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERPROC) (GLuint texture, GLenum internalformat, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEPROC) (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFPROC) (GLuint texture, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, const GLfloat* param); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIPROC) (GLuint texture, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, const GLint* param); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE1DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) (GLuint xfb, GLuint index, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFERPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBBINDINGPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBIFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBLFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYBINDINGDIVISORPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYELEMENTBUFFERPROC) (GLuint vaobj, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBUFFERPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBUFFERSPROC) (GLuint vaobj, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizei *strides); - -#define glBindTextureUnit GLEW_GET_FUN(__glewBindTextureUnit) -#define glBlitNamedFramebuffer GLEW_GET_FUN(__glewBlitNamedFramebuffer) -#define glCheckNamedFramebufferStatus GLEW_GET_FUN(__glewCheckNamedFramebufferStatus) -#define glClearNamedBufferData GLEW_GET_FUN(__glewClearNamedBufferData) -#define glClearNamedBufferSubData GLEW_GET_FUN(__glewClearNamedBufferSubData) -#define glClearNamedFramebufferfi GLEW_GET_FUN(__glewClearNamedFramebufferfi) -#define glClearNamedFramebufferfv GLEW_GET_FUN(__glewClearNamedFramebufferfv) -#define glClearNamedFramebufferiv GLEW_GET_FUN(__glewClearNamedFramebufferiv) -#define glClearNamedFramebufferuiv GLEW_GET_FUN(__glewClearNamedFramebufferuiv) -#define glCompressedTextureSubImage1D GLEW_GET_FUN(__glewCompressedTextureSubImage1D) -#define glCompressedTextureSubImage2D GLEW_GET_FUN(__glewCompressedTextureSubImage2D) -#define glCompressedTextureSubImage3D GLEW_GET_FUN(__glewCompressedTextureSubImage3D) -#define glCopyNamedBufferSubData GLEW_GET_FUN(__glewCopyNamedBufferSubData) -#define glCopyTextureSubImage1D GLEW_GET_FUN(__glewCopyTextureSubImage1D) -#define glCopyTextureSubImage2D GLEW_GET_FUN(__glewCopyTextureSubImage2D) -#define glCopyTextureSubImage3D GLEW_GET_FUN(__glewCopyTextureSubImage3D) -#define glCreateBuffers GLEW_GET_FUN(__glewCreateBuffers) -#define glCreateFramebuffers GLEW_GET_FUN(__glewCreateFramebuffers) -#define glCreateProgramPipelines GLEW_GET_FUN(__glewCreateProgramPipelines) -#define glCreateQueries GLEW_GET_FUN(__glewCreateQueries) -#define glCreateRenderbuffers GLEW_GET_FUN(__glewCreateRenderbuffers) -#define glCreateSamplers GLEW_GET_FUN(__glewCreateSamplers) -#define glCreateTextures GLEW_GET_FUN(__glewCreateTextures) -#define glCreateTransformFeedbacks GLEW_GET_FUN(__glewCreateTransformFeedbacks) -#define glCreateVertexArrays GLEW_GET_FUN(__glewCreateVertexArrays) -#define glDisableVertexArrayAttrib GLEW_GET_FUN(__glewDisableVertexArrayAttrib) -#define glEnableVertexArrayAttrib GLEW_GET_FUN(__glewEnableVertexArrayAttrib) -#define glFlushMappedNamedBufferRange GLEW_GET_FUN(__glewFlushMappedNamedBufferRange) -#define glGenerateTextureMipmap GLEW_GET_FUN(__glewGenerateTextureMipmap) -#define glGetCompressedTextureImage GLEW_GET_FUN(__glewGetCompressedTextureImage) -#define glGetNamedBufferParameteri64v GLEW_GET_FUN(__glewGetNamedBufferParameteri64v) -#define glGetNamedBufferParameteriv GLEW_GET_FUN(__glewGetNamedBufferParameteriv) -#define glGetNamedBufferPointerv GLEW_GET_FUN(__glewGetNamedBufferPointerv) -#define glGetNamedBufferSubData GLEW_GET_FUN(__glewGetNamedBufferSubData) -#define glGetNamedFramebufferAttachmentParameteriv GLEW_GET_FUN(__glewGetNamedFramebufferAttachmentParameteriv) -#define glGetNamedFramebufferParameteriv GLEW_GET_FUN(__glewGetNamedFramebufferParameteriv) -#define glGetNamedRenderbufferParameteriv GLEW_GET_FUN(__glewGetNamedRenderbufferParameteriv) -#define glGetQueryBufferObjecti64v GLEW_GET_FUN(__glewGetQueryBufferObjecti64v) -#define glGetQueryBufferObjectiv GLEW_GET_FUN(__glewGetQueryBufferObjectiv) -#define glGetQueryBufferObjectui64v GLEW_GET_FUN(__glewGetQueryBufferObjectui64v) -#define glGetQueryBufferObjectuiv GLEW_GET_FUN(__glewGetQueryBufferObjectuiv) -#define glGetTextureImage GLEW_GET_FUN(__glewGetTextureImage) -#define glGetTextureLevelParameterfv GLEW_GET_FUN(__glewGetTextureLevelParameterfv) -#define glGetTextureLevelParameteriv GLEW_GET_FUN(__glewGetTextureLevelParameteriv) -#define glGetTextureParameterIiv GLEW_GET_FUN(__glewGetTextureParameterIiv) -#define glGetTextureParameterIuiv GLEW_GET_FUN(__glewGetTextureParameterIuiv) -#define glGetTextureParameterfv GLEW_GET_FUN(__glewGetTextureParameterfv) -#define glGetTextureParameteriv GLEW_GET_FUN(__glewGetTextureParameteriv) -#define glGetTransformFeedbacki64_v GLEW_GET_FUN(__glewGetTransformFeedbacki64_v) -#define glGetTransformFeedbacki_v GLEW_GET_FUN(__glewGetTransformFeedbacki_v) -#define glGetTransformFeedbackiv GLEW_GET_FUN(__glewGetTransformFeedbackiv) -#define glGetVertexArrayIndexed64iv GLEW_GET_FUN(__glewGetVertexArrayIndexed64iv) -#define glGetVertexArrayIndexediv GLEW_GET_FUN(__glewGetVertexArrayIndexediv) -#define glGetVertexArrayiv GLEW_GET_FUN(__glewGetVertexArrayiv) -#define glInvalidateNamedFramebufferData GLEW_GET_FUN(__glewInvalidateNamedFramebufferData) -#define glInvalidateNamedFramebufferSubData GLEW_GET_FUN(__glewInvalidateNamedFramebufferSubData) -#define glMapNamedBuffer GLEW_GET_FUN(__glewMapNamedBuffer) -#define glMapNamedBufferRange GLEW_GET_FUN(__glewMapNamedBufferRange) -#define glNamedBufferData GLEW_GET_FUN(__glewNamedBufferData) -#define glNamedBufferStorage GLEW_GET_FUN(__glewNamedBufferStorage) -#define glNamedBufferSubData GLEW_GET_FUN(__glewNamedBufferSubData) -#define glNamedFramebufferDrawBuffer GLEW_GET_FUN(__glewNamedFramebufferDrawBuffer) -#define glNamedFramebufferDrawBuffers GLEW_GET_FUN(__glewNamedFramebufferDrawBuffers) -#define glNamedFramebufferParameteri GLEW_GET_FUN(__glewNamedFramebufferParameteri) -#define glNamedFramebufferReadBuffer GLEW_GET_FUN(__glewNamedFramebufferReadBuffer) -#define glNamedFramebufferRenderbuffer GLEW_GET_FUN(__glewNamedFramebufferRenderbuffer) -#define glNamedFramebufferTexture GLEW_GET_FUN(__glewNamedFramebufferTexture) -#define glNamedFramebufferTextureLayer GLEW_GET_FUN(__glewNamedFramebufferTextureLayer) -#define glNamedRenderbufferStorage GLEW_GET_FUN(__glewNamedRenderbufferStorage) -#define glNamedRenderbufferStorageMultisample GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisample) -#define glTextureBuffer GLEW_GET_FUN(__glewTextureBuffer) -#define glTextureBufferRange GLEW_GET_FUN(__glewTextureBufferRange) -#define glTextureParameterIiv GLEW_GET_FUN(__glewTextureParameterIiv) -#define glTextureParameterIuiv GLEW_GET_FUN(__glewTextureParameterIuiv) -#define glTextureParameterf GLEW_GET_FUN(__glewTextureParameterf) -#define glTextureParameterfv GLEW_GET_FUN(__glewTextureParameterfv) -#define glTextureParameteri GLEW_GET_FUN(__glewTextureParameteri) -#define glTextureParameteriv GLEW_GET_FUN(__glewTextureParameteriv) -#define glTextureStorage1D GLEW_GET_FUN(__glewTextureStorage1D) -#define glTextureStorage2D GLEW_GET_FUN(__glewTextureStorage2D) -#define glTextureStorage2DMultisample GLEW_GET_FUN(__glewTextureStorage2DMultisample) -#define glTextureStorage3D GLEW_GET_FUN(__glewTextureStorage3D) -#define glTextureStorage3DMultisample GLEW_GET_FUN(__glewTextureStorage3DMultisample) -#define glTextureSubImage1D GLEW_GET_FUN(__glewTextureSubImage1D) -#define glTextureSubImage2D GLEW_GET_FUN(__glewTextureSubImage2D) -#define glTextureSubImage3D GLEW_GET_FUN(__glewTextureSubImage3D) -#define glTransformFeedbackBufferBase GLEW_GET_FUN(__glewTransformFeedbackBufferBase) -#define glTransformFeedbackBufferRange GLEW_GET_FUN(__glewTransformFeedbackBufferRange) -#define glUnmapNamedBuffer GLEW_GET_FUN(__glewUnmapNamedBuffer) -#define glVertexArrayAttribBinding GLEW_GET_FUN(__glewVertexArrayAttribBinding) -#define glVertexArrayAttribFormat GLEW_GET_FUN(__glewVertexArrayAttribFormat) -#define glVertexArrayAttribIFormat GLEW_GET_FUN(__glewVertexArrayAttribIFormat) -#define glVertexArrayAttribLFormat GLEW_GET_FUN(__glewVertexArrayAttribLFormat) -#define glVertexArrayBindingDivisor GLEW_GET_FUN(__glewVertexArrayBindingDivisor) -#define glVertexArrayElementBuffer GLEW_GET_FUN(__glewVertexArrayElementBuffer) -#define glVertexArrayVertexBuffer GLEW_GET_FUN(__glewVertexArrayVertexBuffer) -#define glVertexArrayVertexBuffers GLEW_GET_FUN(__glewVertexArrayVertexBuffers) - -#define GLEW_ARB_direct_state_access GLEW_GET_VAR(__GLEW_ARB_direct_state_access) - -#endif /* GL_ARB_direct_state_access */ - -/* -------------------------- GL_ARB_draw_buffers -------------------------- */ - -#ifndef GL_ARB_draw_buffers -#define GL_ARB_draw_buffers 1 - -#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 -#define GL_DRAW_BUFFER0_ARB 0x8825 -#define GL_DRAW_BUFFER1_ARB 0x8826 -#define GL_DRAW_BUFFER2_ARB 0x8827 -#define GL_DRAW_BUFFER3_ARB 0x8828 -#define GL_DRAW_BUFFER4_ARB 0x8829 -#define GL_DRAW_BUFFER5_ARB 0x882A -#define GL_DRAW_BUFFER6_ARB 0x882B -#define GL_DRAW_BUFFER7_ARB 0x882C -#define GL_DRAW_BUFFER8_ARB 0x882D -#define GL_DRAW_BUFFER9_ARB 0x882E -#define GL_DRAW_BUFFER10_ARB 0x882F -#define GL_DRAW_BUFFER11_ARB 0x8830 -#define GL_DRAW_BUFFER12_ARB 0x8831 -#define GL_DRAW_BUFFER13_ARB 0x8832 -#define GL_DRAW_BUFFER14_ARB 0x8833 -#define GL_DRAW_BUFFER15_ARB 0x8834 - -typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum* bufs); - -#define glDrawBuffersARB GLEW_GET_FUN(__glewDrawBuffersARB) - -#define GLEW_ARB_draw_buffers GLEW_GET_VAR(__GLEW_ARB_draw_buffers) - -#endif /* GL_ARB_draw_buffers */ - -/* ----------------------- GL_ARB_draw_buffers_blend ----------------------- */ - -#ifndef GL_ARB_draw_buffers_blend -#define GL_ARB_draw_buffers_blend 1 - -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); - -#define glBlendEquationSeparateiARB GLEW_GET_FUN(__glewBlendEquationSeparateiARB) -#define glBlendEquationiARB GLEW_GET_FUN(__glewBlendEquationiARB) -#define glBlendFuncSeparateiARB GLEW_GET_FUN(__glewBlendFuncSeparateiARB) -#define glBlendFunciARB GLEW_GET_FUN(__glewBlendFunciARB) - -#define GLEW_ARB_draw_buffers_blend GLEW_GET_VAR(__GLEW_ARB_draw_buffers_blend) - -#endif /* GL_ARB_draw_buffers_blend */ - -/* -------------------- GL_ARB_draw_elements_base_vertex ------------------- */ - -#ifndef GL_ARB_draw_elements_base_vertex -#define GL_ARB_draw_elements_base_vertex 1 - -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); -typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei* count, GLenum type, const void*const *indices, GLsizei drawcount, const GLint *basevertex); - -#define glDrawElementsBaseVertex GLEW_GET_FUN(__glewDrawElementsBaseVertex) -#define glDrawElementsInstancedBaseVertex GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertex) -#define glDrawRangeElementsBaseVertex GLEW_GET_FUN(__glewDrawRangeElementsBaseVertex) -#define glMultiDrawElementsBaseVertex GLEW_GET_FUN(__glewMultiDrawElementsBaseVertex) - -#define GLEW_ARB_draw_elements_base_vertex GLEW_GET_VAR(__GLEW_ARB_draw_elements_base_vertex) - -#endif /* GL_ARB_draw_elements_base_vertex */ - -/* -------------------------- GL_ARB_draw_indirect ------------------------- */ - -#ifndef GL_ARB_draw_indirect -#define GL_ARB_draw_indirect 1 - -#define GL_DRAW_INDIRECT_BUFFER 0x8F3F -#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 - -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); - -#define glDrawArraysIndirect GLEW_GET_FUN(__glewDrawArraysIndirect) -#define glDrawElementsIndirect GLEW_GET_FUN(__glewDrawElementsIndirect) - -#define GLEW_ARB_draw_indirect GLEW_GET_VAR(__GLEW_ARB_draw_indirect) - -#endif /* GL_ARB_draw_indirect */ - -/* ------------------------- GL_ARB_draw_instanced ------------------------- */ - -#ifndef GL_ARB_draw_instanced -#define GL_ARB_draw_instanced 1 - -#define GLEW_ARB_draw_instanced GLEW_GET_VAR(__GLEW_ARB_draw_instanced) - -#endif /* GL_ARB_draw_instanced */ - -/* ------------------------ GL_ARB_enhanced_layouts ------------------------ */ - -#ifndef GL_ARB_enhanced_layouts -#define GL_ARB_enhanced_layouts 1 - -#define GL_LOCATION_COMPONENT 0x934A -#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B -#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C - -#define GLEW_ARB_enhanced_layouts GLEW_GET_VAR(__GLEW_ARB_enhanced_layouts) - -#endif /* GL_ARB_enhanced_layouts */ - -/* -------------------- GL_ARB_explicit_attrib_location -------------------- */ - -#ifndef GL_ARB_explicit_attrib_location -#define GL_ARB_explicit_attrib_location 1 - -#define GLEW_ARB_explicit_attrib_location GLEW_GET_VAR(__GLEW_ARB_explicit_attrib_location) - -#endif /* GL_ARB_explicit_attrib_location */ - -/* -------------------- GL_ARB_explicit_uniform_location ------------------- */ - -#ifndef GL_ARB_explicit_uniform_location -#define GL_ARB_explicit_uniform_location 1 - -#define GL_MAX_UNIFORM_LOCATIONS 0x826E - -#define GLEW_ARB_explicit_uniform_location GLEW_GET_VAR(__GLEW_ARB_explicit_uniform_location) - -#endif /* GL_ARB_explicit_uniform_location */ - -/* ------------------- GL_ARB_fragment_coord_conventions ------------------- */ - -#ifndef GL_ARB_fragment_coord_conventions -#define GL_ARB_fragment_coord_conventions 1 - -#define GLEW_ARB_fragment_coord_conventions GLEW_GET_VAR(__GLEW_ARB_fragment_coord_conventions) - -#endif /* GL_ARB_fragment_coord_conventions */ - -/* --------------------- GL_ARB_fragment_layer_viewport -------------------- */ - -#ifndef GL_ARB_fragment_layer_viewport -#define GL_ARB_fragment_layer_viewport 1 - -#define GLEW_ARB_fragment_layer_viewport GLEW_GET_VAR(__GLEW_ARB_fragment_layer_viewport) - -#endif /* GL_ARB_fragment_layer_viewport */ - -/* ------------------------ GL_ARB_fragment_program ------------------------ */ - -#ifndef GL_ARB_fragment_program -#define GL_ARB_fragment_program 1 - -#define GL_FRAGMENT_PROGRAM_ARB 0x8804 -#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 -#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 -#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 -#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 -#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 -#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A -#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B -#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C -#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D -#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E -#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F -#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 -#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 - -#define GLEW_ARB_fragment_program GLEW_GET_VAR(__GLEW_ARB_fragment_program) - -#endif /* GL_ARB_fragment_program */ - -/* --------------------- GL_ARB_fragment_program_shadow -------------------- */ - -#ifndef GL_ARB_fragment_program_shadow -#define GL_ARB_fragment_program_shadow 1 - -#define GLEW_ARB_fragment_program_shadow GLEW_GET_VAR(__GLEW_ARB_fragment_program_shadow) - -#endif /* GL_ARB_fragment_program_shadow */ - -/* ------------------------- GL_ARB_fragment_shader ------------------------ */ - -#ifndef GL_ARB_fragment_shader -#define GL_ARB_fragment_shader 1 - -#define GL_FRAGMENT_SHADER_ARB 0x8B30 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B - -#define GLEW_ARB_fragment_shader GLEW_GET_VAR(__GLEW_ARB_fragment_shader) - -#endif /* GL_ARB_fragment_shader */ - -/* -------------------- GL_ARB_fragment_shader_interlock ------------------- */ - -#ifndef GL_ARB_fragment_shader_interlock -#define GL_ARB_fragment_shader_interlock 1 - -#define GLEW_ARB_fragment_shader_interlock GLEW_GET_VAR(__GLEW_ARB_fragment_shader_interlock) - -#endif /* GL_ARB_fragment_shader_interlock */ - -/* ------------------- GL_ARB_framebuffer_no_attachments ------------------- */ - -#ifndef GL_ARB_framebuffer_no_attachments -#define GL_ARB_framebuffer_no_attachments 1 - -#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 -#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 -#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 -#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 -#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 -#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 -#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 -#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 -#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param); - -#define glFramebufferParameteri GLEW_GET_FUN(__glewFramebufferParameteri) -#define glGetFramebufferParameteriv GLEW_GET_FUN(__glewGetFramebufferParameteriv) -#define glGetNamedFramebufferParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferParameterivEXT) -#define glNamedFramebufferParameteriEXT GLEW_GET_FUN(__glewNamedFramebufferParameteriEXT) - -#define GLEW_ARB_framebuffer_no_attachments GLEW_GET_VAR(__GLEW_ARB_framebuffer_no_attachments) - -#endif /* GL_ARB_framebuffer_no_attachments */ - -/* ----------------------- GL_ARB_framebuffer_object ----------------------- */ - -#ifndef GL_ARB_framebuffer_object -#define GL_ARB_framebuffer_object 1 - -#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 -#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 -#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 -#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 -#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 -#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 -#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 -#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 -#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 -#define GL_FRAMEBUFFER_DEFAULT 0x8218 -#define GL_FRAMEBUFFER_UNDEFINED 0x8219 -#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A -#define GL_INDEX 0x8222 -#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 -#define GL_DEPTH_STENCIL 0x84F9 -#define GL_UNSIGNED_INT_24_8 0x84FA -#define GL_DEPTH24_STENCIL8 0x88F0 -#define GL_TEXTURE_STENCIL_SIZE 0x88F1 -#define GL_UNSIGNED_NORMALIZED 0x8C17 -#define GL_SRGB 0x8C40 -#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_RENDERBUFFER_BINDING 0x8CA7 -#define GL_READ_FRAMEBUFFER 0x8CA8 -#define GL_DRAW_FRAMEBUFFER 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA -#define GL_RENDERBUFFER_SAMPLES 0x8CAB -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD -#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF -#define GL_COLOR_ATTACHMENT0 0x8CE0 -#define GL_COLOR_ATTACHMENT1 0x8CE1 -#define GL_COLOR_ATTACHMENT2 0x8CE2 -#define GL_COLOR_ATTACHMENT3 0x8CE3 -#define GL_COLOR_ATTACHMENT4 0x8CE4 -#define GL_COLOR_ATTACHMENT5 0x8CE5 -#define GL_COLOR_ATTACHMENT6 0x8CE6 -#define GL_COLOR_ATTACHMENT7 0x8CE7 -#define GL_COLOR_ATTACHMENT8 0x8CE8 -#define GL_COLOR_ATTACHMENT9 0x8CE9 -#define GL_COLOR_ATTACHMENT10 0x8CEA -#define GL_COLOR_ATTACHMENT11 0x8CEB -#define GL_COLOR_ATTACHMENT12 0x8CEC -#define GL_COLOR_ATTACHMENT13 0x8CED -#define GL_COLOR_ATTACHMENT14 0x8CEE -#define GL_COLOR_ATTACHMENT15 0x8CEF -#define GL_DEPTH_ATTACHMENT 0x8D00 -#define GL_STENCIL_ATTACHMENT 0x8D20 -#define GL_FRAMEBUFFER 0x8D40 -#define GL_RENDERBUFFER 0x8D41 -#define GL_RENDERBUFFER_WIDTH 0x8D42 -#define GL_RENDERBUFFER_HEIGHT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 -#define GL_STENCIL_INDEX1 0x8D46 -#define GL_STENCIL_INDEX4 0x8D47 -#define GL_STENCIL_INDEX8 0x8D48 -#define GL_STENCIL_INDEX16 0x8D49 -#define GL_RENDERBUFFER_RED_SIZE 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 -#define GL_MAX_SAMPLES 0x8D57 - -typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); -typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint* framebuffers); -typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint* renderbuffers); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint layer); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target,GLenum attachment, GLuint texture,GLint level,GLint layer); -typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers); -typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers); -typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); -typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - -#define glBindFramebuffer GLEW_GET_FUN(__glewBindFramebuffer) -#define glBindRenderbuffer GLEW_GET_FUN(__glewBindRenderbuffer) -#define glBlitFramebuffer GLEW_GET_FUN(__glewBlitFramebuffer) -#define glCheckFramebufferStatus GLEW_GET_FUN(__glewCheckFramebufferStatus) -#define glDeleteFramebuffers GLEW_GET_FUN(__glewDeleteFramebuffers) -#define glDeleteRenderbuffers GLEW_GET_FUN(__glewDeleteRenderbuffers) -#define glFramebufferRenderbuffer GLEW_GET_FUN(__glewFramebufferRenderbuffer) -#define glFramebufferTexture1D GLEW_GET_FUN(__glewFramebufferTexture1D) -#define glFramebufferTexture2D GLEW_GET_FUN(__glewFramebufferTexture2D) -#define glFramebufferTexture3D GLEW_GET_FUN(__glewFramebufferTexture3D) -#define glFramebufferTextureLayer GLEW_GET_FUN(__glewFramebufferTextureLayer) -#define glGenFramebuffers GLEW_GET_FUN(__glewGenFramebuffers) -#define glGenRenderbuffers GLEW_GET_FUN(__glewGenRenderbuffers) -#define glGenerateMipmap GLEW_GET_FUN(__glewGenerateMipmap) -#define glGetFramebufferAttachmentParameteriv GLEW_GET_FUN(__glewGetFramebufferAttachmentParameteriv) -#define glGetRenderbufferParameteriv GLEW_GET_FUN(__glewGetRenderbufferParameteriv) -#define glIsFramebuffer GLEW_GET_FUN(__glewIsFramebuffer) -#define glIsRenderbuffer GLEW_GET_FUN(__glewIsRenderbuffer) -#define glRenderbufferStorage GLEW_GET_FUN(__glewRenderbufferStorage) -#define glRenderbufferStorageMultisample GLEW_GET_FUN(__glewRenderbufferStorageMultisample) - -#define GLEW_ARB_framebuffer_object GLEW_GET_VAR(__GLEW_ARB_framebuffer_object) - -#endif /* GL_ARB_framebuffer_object */ - -/* ------------------------ GL_ARB_framebuffer_sRGB ------------------------ */ - -#ifndef GL_ARB_framebuffer_sRGB -#define GL_ARB_framebuffer_sRGB 1 - -#define GL_FRAMEBUFFER_SRGB 0x8DB9 - -#define GLEW_ARB_framebuffer_sRGB GLEW_GET_VAR(__GLEW_ARB_framebuffer_sRGB) - -#endif /* GL_ARB_framebuffer_sRGB */ - -/* ------------------------ GL_ARB_geometry_shader4 ------------------------ */ - -#ifndef GL_ARB_geometry_shader4 -#define GL_ARB_geometry_shader4 1 - -#define GL_LINES_ADJACENCY_ARB 0xA -#define GL_LINE_STRIP_ADJACENCY_ARB 0xB -#define GL_TRIANGLES_ADJACENCY_ARB 0xC -#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0xD -#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 -#define GL_GEOMETRY_SHADER_ARB 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA -#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB -#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC -#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD -#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); - -#define glFramebufferTextureARB GLEW_GET_FUN(__glewFramebufferTextureARB) -#define glFramebufferTextureFaceARB GLEW_GET_FUN(__glewFramebufferTextureFaceARB) -#define glFramebufferTextureLayerARB GLEW_GET_FUN(__glewFramebufferTextureLayerARB) -#define glProgramParameteriARB GLEW_GET_FUN(__glewProgramParameteriARB) - -#define GLEW_ARB_geometry_shader4 GLEW_GET_VAR(__GLEW_ARB_geometry_shader4) - -#endif /* GL_ARB_geometry_shader4 */ - -/* ----------------------- GL_ARB_get_program_binary ----------------------- */ - -#ifndef GL_ARB_get_program_binary -#define GL_ARB_get_program_binary 1 - -#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 -#define GL_PROGRAM_BINARY_LENGTH 0x8741 -#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE -#define GL_PROGRAM_BINARY_FORMATS 0x87FF - -typedef void (GLAPIENTRY * PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum *binaryFormat, void*binary); -typedef void (GLAPIENTRY * PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); - -#define glGetProgramBinary GLEW_GET_FUN(__glewGetProgramBinary) -#define glProgramBinary GLEW_GET_FUN(__glewProgramBinary) -#define glProgramParameteri GLEW_GET_FUN(__glewProgramParameteri) - -#define GLEW_ARB_get_program_binary GLEW_GET_VAR(__GLEW_ARB_get_program_binary) - -#endif /* GL_ARB_get_program_binary */ - -/* ---------------------- GL_ARB_get_texture_sub_image --------------------- */ - -#ifndef GL_ARB_get_texture_sub_image -#define GL_ARB_get_texture_sub_image 1 - -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); -typedef void (GLAPIENTRY * PFNGLGETTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); - -#define glGetCompressedTextureSubImage GLEW_GET_FUN(__glewGetCompressedTextureSubImage) -#define glGetTextureSubImage GLEW_GET_FUN(__glewGetTextureSubImage) - -#define GLEW_ARB_get_texture_sub_image GLEW_GET_VAR(__GLEW_ARB_get_texture_sub_image) - -#endif /* GL_ARB_get_texture_sub_image */ - -/* ---------------------------- GL_ARB_gl_spirv ---------------------------- */ - -#ifndef GL_ARB_gl_spirv -#define GL_ARB_gl_spirv 1 - -#define GL_SHADER_BINARY_FORMAT_SPIR_V_ARB 0x9551 -#define GL_SPIR_V_BINARY_ARB 0x9552 - -typedef void (GLAPIENTRY * PFNGLSPECIALIZESHADERARBPROC) (GLuint shader, const GLchar* pEntryPoint, GLuint numSpecializationConstants, const GLuint* pConstantIndex, const GLuint* pConstantValue); - -#define glSpecializeShaderARB GLEW_GET_FUN(__glewSpecializeShaderARB) - -#define GLEW_ARB_gl_spirv GLEW_GET_VAR(__GLEW_ARB_gl_spirv) - -#endif /* GL_ARB_gl_spirv */ - -/* --------------------------- GL_ARB_gpu_shader5 -------------------------- */ - -#ifndef GL_ARB_gpu_shader5 -#define GL_ARB_gpu_shader5 1 - -#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F -#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A -#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B -#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C -#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D -#define GL_MAX_VERTEX_STREAMS 0x8E71 - -#define GLEW_ARB_gpu_shader5 GLEW_GET_VAR(__GLEW_ARB_gpu_shader5) - -#endif /* GL_ARB_gpu_shader5 */ - -/* ------------------------- GL_ARB_gpu_shader_fp64 ------------------------ */ - -#ifndef GL_ARB_gpu_shader_fp64 -#define GL_ARB_gpu_shader_fp64 1 - -#define GL_DOUBLE_MAT2 0x8F46 -#define GL_DOUBLE_MAT3 0x8F47 -#define GL_DOUBLE_MAT4 0x8F48 -#define GL_DOUBLE_MAT2x3 0x8F49 -#define GL_DOUBLE_MAT2x4 0x8F4A -#define GL_DOUBLE_MAT3x2 0x8F4B -#define GL_DOUBLE_MAT3x4 0x8F4C -#define GL_DOUBLE_MAT4x2 0x8F4D -#define GL_DOUBLE_MAT4x3 0x8F4E -#define GL_DOUBLE_VEC2 0x8FFC -#define GL_DOUBLE_VEC3 0x8FFD -#define GL_DOUBLE_VEC4 0x8FFE - -typedef void (GLAPIENTRY * PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); -typedef void (GLAPIENTRY * PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); - -#define glGetUniformdv GLEW_GET_FUN(__glewGetUniformdv) -#define glUniform1d GLEW_GET_FUN(__glewUniform1d) -#define glUniform1dv GLEW_GET_FUN(__glewUniform1dv) -#define glUniform2d GLEW_GET_FUN(__glewUniform2d) -#define glUniform2dv GLEW_GET_FUN(__glewUniform2dv) -#define glUniform3d GLEW_GET_FUN(__glewUniform3d) -#define glUniform3dv GLEW_GET_FUN(__glewUniform3dv) -#define glUniform4d GLEW_GET_FUN(__glewUniform4d) -#define glUniform4dv GLEW_GET_FUN(__glewUniform4dv) -#define glUniformMatrix2dv GLEW_GET_FUN(__glewUniformMatrix2dv) -#define glUniformMatrix2x3dv GLEW_GET_FUN(__glewUniformMatrix2x3dv) -#define glUniformMatrix2x4dv GLEW_GET_FUN(__glewUniformMatrix2x4dv) -#define glUniformMatrix3dv GLEW_GET_FUN(__glewUniformMatrix3dv) -#define glUniformMatrix3x2dv GLEW_GET_FUN(__glewUniformMatrix3x2dv) -#define glUniformMatrix3x4dv GLEW_GET_FUN(__glewUniformMatrix3x4dv) -#define glUniformMatrix4dv GLEW_GET_FUN(__glewUniformMatrix4dv) -#define glUniformMatrix4x2dv GLEW_GET_FUN(__glewUniformMatrix4x2dv) -#define glUniformMatrix4x3dv GLEW_GET_FUN(__glewUniformMatrix4x3dv) - -#define GLEW_ARB_gpu_shader_fp64 GLEW_GET_VAR(__GLEW_ARB_gpu_shader_fp64) - -#endif /* GL_ARB_gpu_shader_fp64 */ - -/* ------------------------ GL_ARB_gpu_shader_int64 ------------------------ */ - -#ifndef GL_ARB_gpu_shader_int64 -#define GL_ARB_gpu_shader_int64 1 - -#define GL_INT64_ARB 0x140E -#define GL_UNSIGNED_INT64_ARB 0x140F -#define GL_INT64_VEC2_ARB 0x8FE9 -#define GL_INT64_VEC3_ARB 0x8FEA -#define GL_INT64_VEC4_ARB 0x8FEB -#define GL_UNSIGNED_INT64_VEC2_ARB 0x8FF5 -#define GL_UNSIGNED_INT64_VEC3_ARB 0x8FF6 -#define GL_UNSIGNED_INT64_VEC4_ARB 0x8FF7 - -typedef void (GLAPIENTRY * PFNGLGETUNIFORMI64VARBPROC) (GLuint program, GLint location, GLint64* params); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLuint64* params); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint64* params); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint64* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64ARBPROC) (GLuint program, GLint location, GLint64 x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64ARBPROC) (GLuint program, GLint location, GLuint64 x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM1I64ARBPROC) (GLint location, GLint64 x); -typedef void (GLAPIENTRY * PFNGLUNIFORM1I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64ARBPROC) (GLint location, GLuint64 x); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2I64ARBPROC) (GLint location, GLint64 x, GLint64 y); -typedef void (GLAPIENTRY * PFNGLUNIFORM2I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z); -typedef void (GLAPIENTRY * PFNGLUNIFORM3I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); -typedef void (GLAPIENTRY * PFNGLUNIFORM4I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); - -#define glGetUniformi64vARB GLEW_GET_FUN(__glewGetUniformi64vARB) -#define glGetUniformui64vARB GLEW_GET_FUN(__glewGetUniformui64vARB) -#define glGetnUniformi64vARB GLEW_GET_FUN(__glewGetnUniformi64vARB) -#define glGetnUniformui64vARB GLEW_GET_FUN(__glewGetnUniformui64vARB) -#define glProgramUniform1i64ARB GLEW_GET_FUN(__glewProgramUniform1i64ARB) -#define glProgramUniform1i64vARB GLEW_GET_FUN(__glewProgramUniform1i64vARB) -#define glProgramUniform1ui64ARB GLEW_GET_FUN(__glewProgramUniform1ui64ARB) -#define glProgramUniform1ui64vARB GLEW_GET_FUN(__glewProgramUniform1ui64vARB) -#define glProgramUniform2i64ARB GLEW_GET_FUN(__glewProgramUniform2i64ARB) -#define glProgramUniform2i64vARB GLEW_GET_FUN(__glewProgramUniform2i64vARB) -#define glProgramUniform2ui64ARB GLEW_GET_FUN(__glewProgramUniform2ui64ARB) -#define glProgramUniform2ui64vARB GLEW_GET_FUN(__glewProgramUniform2ui64vARB) -#define glProgramUniform3i64ARB GLEW_GET_FUN(__glewProgramUniform3i64ARB) -#define glProgramUniform3i64vARB GLEW_GET_FUN(__glewProgramUniform3i64vARB) -#define glProgramUniform3ui64ARB GLEW_GET_FUN(__glewProgramUniform3ui64ARB) -#define glProgramUniform3ui64vARB GLEW_GET_FUN(__glewProgramUniform3ui64vARB) -#define glProgramUniform4i64ARB GLEW_GET_FUN(__glewProgramUniform4i64ARB) -#define glProgramUniform4i64vARB GLEW_GET_FUN(__glewProgramUniform4i64vARB) -#define glProgramUniform4ui64ARB GLEW_GET_FUN(__glewProgramUniform4ui64ARB) -#define glProgramUniform4ui64vARB GLEW_GET_FUN(__glewProgramUniform4ui64vARB) -#define glUniform1i64ARB GLEW_GET_FUN(__glewUniform1i64ARB) -#define glUniform1i64vARB GLEW_GET_FUN(__glewUniform1i64vARB) -#define glUniform1ui64ARB GLEW_GET_FUN(__glewUniform1ui64ARB) -#define glUniform1ui64vARB GLEW_GET_FUN(__glewUniform1ui64vARB) -#define glUniform2i64ARB GLEW_GET_FUN(__glewUniform2i64ARB) -#define glUniform2i64vARB GLEW_GET_FUN(__glewUniform2i64vARB) -#define glUniform2ui64ARB GLEW_GET_FUN(__glewUniform2ui64ARB) -#define glUniform2ui64vARB GLEW_GET_FUN(__glewUniform2ui64vARB) -#define glUniform3i64ARB GLEW_GET_FUN(__glewUniform3i64ARB) -#define glUniform3i64vARB GLEW_GET_FUN(__glewUniform3i64vARB) -#define glUniform3ui64ARB GLEW_GET_FUN(__glewUniform3ui64ARB) -#define glUniform3ui64vARB GLEW_GET_FUN(__glewUniform3ui64vARB) -#define glUniform4i64ARB GLEW_GET_FUN(__glewUniform4i64ARB) -#define glUniform4i64vARB GLEW_GET_FUN(__glewUniform4i64vARB) -#define glUniform4ui64ARB GLEW_GET_FUN(__glewUniform4ui64ARB) -#define glUniform4ui64vARB GLEW_GET_FUN(__glewUniform4ui64vARB) - -#define GLEW_ARB_gpu_shader_int64 GLEW_GET_VAR(__GLEW_ARB_gpu_shader_int64) - -#endif /* GL_ARB_gpu_shader_int64 */ - -/* ------------------------ GL_ARB_half_float_pixel ------------------------ */ - -#ifndef GL_ARB_half_float_pixel -#define GL_ARB_half_float_pixel 1 - -#define GL_HALF_FLOAT_ARB 0x140B - -#define GLEW_ARB_half_float_pixel GLEW_GET_VAR(__GLEW_ARB_half_float_pixel) - -#endif /* GL_ARB_half_float_pixel */ - -/* ------------------------ GL_ARB_half_float_vertex ----------------------- */ - -#ifndef GL_ARB_half_float_vertex -#define GL_ARB_half_float_vertex 1 - -#define GL_HALF_FLOAT 0x140B - -#define GLEW_ARB_half_float_vertex GLEW_GET_VAR(__GLEW_ARB_half_float_vertex) - -#endif /* GL_ARB_half_float_vertex */ - -/* ----------------------------- GL_ARB_imaging ---------------------------- */ - -#ifndef GL_ARB_imaging -#define GL_ARB_imaging 1 - -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_BLEND_COLOR 0x8005 -#define GL_FUNC_ADD 0x8006 -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -#define GL_BLEND_EQUATION 0x8009 -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_CONVOLUTION_1D 0x8010 -#define GL_CONVOLUTION_2D 0x8011 -#define GL_SEPARABLE_2D 0x8012 -#define GL_CONVOLUTION_BORDER_MODE 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS 0x8015 -#define GL_REDUCE 0x8016 -#define GL_CONVOLUTION_FORMAT 0x8017 -#define GL_CONVOLUTION_WIDTH 0x8018 -#define GL_CONVOLUTION_HEIGHT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 -#define GL_HISTOGRAM 0x8024 -#define GL_PROXY_HISTOGRAM 0x8025 -#define GL_HISTOGRAM_WIDTH 0x8026 -#define GL_HISTOGRAM_FORMAT 0x8027 -#define GL_HISTOGRAM_RED_SIZE 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C -#define GL_HISTOGRAM_SINK 0x802D -#define GL_MINMAX 0x802E -#define GL_MINMAX_FORMAT 0x802F -#define GL_MINMAX_SINK 0x8030 -#define GL_TABLE_TOO_LARGE 0x8031 -#define GL_COLOR_MATRIX 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB -#define GL_COLOR_TABLE 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 -#define GL_PROXY_COLOR_TABLE 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 -#define GL_COLOR_TABLE_SCALE 0x80D6 -#define GL_COLOR_TABLE_BIAS 0x80D7 -#define GL_COLOR_TABLE_FORMAT 0x80D8 -#define GL_COLOR_TABLE_WIDTH 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF -#define GL_IGNORE_BORDER 0x8150 -#define GL_CONSTANT_BORDER 0x8151 -#define GL_WRAP_BORDER 0x8152 -#define GL_REPLICATE_BORDER 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR 0x8154 - -typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); -typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, void *table); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, void *image); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum types, void *values); -typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); -typedef void (GLAPIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (GLAPIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLRESETMINMAXPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); - -#define glColorSubTable GLEW_GET_FUN(__glewColorSubTable) -#define glColorTable GLEW_GET_FUN(__glewColorTable) -#define glColorTableParameterfv GLEW_GET_FUN(__glewColorTableParameterfv) -#define glColorTableParameteriv GLEW_GET_FUN(__glewColorTableParameteriv) -#define glConvolutionFilter1D GLEW_GET_FUN(__glewConvolutionFilter1D) -#define glConvolutionFilter2D GLEW_GET_FUN(__glewConvolutionFilter2D) -#define glConvolutionParameterf GLEW_GET_FUN(__glewConvolutionParameterf) -#define glConvolutionParameterfv GLEW_GET_FUN(__glewConvolutionParameterfv) -#define glConvolutionParameteri GLEW_GET_FUN(__glewConvolutionParameteri) -#define glConvolutionParameteriv GLEW_GET_FUN(__glewConvolutionParameteriv) -#define glCopyColorSubTable GLEW_GET_FUN(__glewCopyColorSubTable) -#define glCopyColorTable GLEW_GET_FUN(__glewCopyColorTable) -#define glCopyConvolutionFilter1D GLEW_GET_FUN(__glewCopyConvolutionFilter1D) -#define glCopyConvolutionFilter2D GLEW_GET_FUN(__glewCopyConvolutionFilter2D) -#define glGetColorTable GLEW_GET_FUN(__glewGetColorTable) -#define glGetColorTableParameterfv GLEW_GET_FUN(__glewGetColorTableParameterfv) -#define glGetColorTableParameteriv GLEW_GET_FUN(__glewGetColorTableParameteriv) -#define glGetConvolutionFilter GLEW_GET_FUN(__glewGetConvolutionFilter) -#define glGetConvolutionParameterfv GLEW_GET_FUN(__glewGetConvolutionParameterfv) -#define glGetConvolutionParameteriv GLEW_GET_FUN(__glewGetConvolutionParameteriv) -#define glGetHistogram GLEW_GET_FUN(__glewGetHistogram) -#define glGetHistogramParameterfv GLEW_GET_FUN(__glewGetHistogramParameterfv) -#define glGetHistogramParameteriv GLEW_GET_FUN(__glewGetHistogramParameteriv) -#define glGetMinmax GLEW_GET_FUN(__glewGetMinmax) -#define glGetMinmaxParameterfv GLEW_GET_FUN(__glewGetMinmaxParameterfv) -#define glGetMinmaxParameteriv GLEW_GET_FUN(__glewGetMinmaxParameteriv) -#define glGetSeparableFilter GLEW_GET_FUN(__glewGetSeparableFilter) -#define glHistogram GLEW_GET_FUN(__glewHistogram) -#define glMinmax GLEW_GET_FUN(__glewMinmax) -#define glResetHistogram GLEW_GET_FUN(__glewResetHistogram) -#define glResetMinmax GLEW_GET_FUN(__glewResetMinmax) -#define glSeparableFilter2D GLEW_GET_FUN(__glewSeparableFilter2D) - -#define GLEW_ARB_imaging GLEW_GET_VAR(__GLEW_ARB_imaging) - -#endif /* GL_ARB_imaging */ - -/* ----------------------- GL_ARB_indirect_parameters ---------------------- */ - -#ifndef GL_ARB_indirect_parameters -#define GL_ARB_indirect_parameters 1 - -#define GL_PARAMETER_BUFFER_ARB 0x80EE -#define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF - -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); - -#define glMultiDrawArraysIndirectCountARB GLEW_GET_FUN(__glewMultiDrawArraysIndirectCountARB) -#define glMultiDrawElementsIndirectCountARB GLEW_GET_FUN(__glewMultiDrawElementsIndirectCountARB) - -#define GLEW_ARB_indirect_parameters GLEW_GET_VAR(__GLEW_ARB_indirect_parameters) - -#endif /* GL_ARB_indirect_parameters */ - -/* ------------------------ GL_ARB_instanced_arrays ------------------------ */ - -#ifndef GL_ARB_instanced_arrays -#define GL_ARB_instanced_arrays 1 - -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE - -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); - -#define glDrawArraysInstancedARB GLEW_GET_FUN(__glewDrawArraysInstancedARB) -#define glDrawElementsInstancedARB GLEW_GET_FUN(__glewDrawElementsInstancedARB) -#define glVertexAttribDivisorARB GLEW_GET_FUN(__glewVertexAttribDivisorARB) - -#define GLEW_ARB_instanced_arrays GLEW_GET_VAR(__GLEW_ARB_instanced_arrays) - -#endif /* GL_ARB_instanced_arrays */ - -/* ---------------------- GL_ARB_internalformat_query ---------------------- */ - -#ifndef GL_ARB_internalformat_query -#define GL_ARB_internalformat_query 1 - -#define GL_NUM_SAMPLE_COUNTS 0x9380 - -typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params); - -#define glGetInternalformativ GLEW_GET_FUN(__glewGetInternalformativ) - -#define GLEW_ARB_internalformat_query GLEW_GET_VAR(__GLEW_ARB_internalformat_query) - -#endif /* GL_ARB_internalformat_query */ - -/* ---------------------- GL_ARB_internalformat_query2 --------------------- */ - -#ifndef GL_ARB_internalformat_query2 -#define GL_ARB_internalformat_query2 1 - -#define GL_INTERNALFORMAT_SUPPORTED 0x826F -#define GL_INTERNALFORMAT_PREFERRED 0x8270 -#define GL_INTERNALFORMAT_RED_SIZE 0x8271 -#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 -#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 -#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 -#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 -#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 -#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 -#define GL_INTERNALFORMAT_RED_TYPE 0x8278 -#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 -#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A -#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B -#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C -#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D -#define GL_MAX_WIDTH 0x827E -#define GL_MAX_HEIGHT 0x827F -#define GL_MAX_DEPTH 0x8280 -#define GL_MAX_LAYERS 0x8281 -#define GL_MAX_COMBINED_DIMENSIONS 0x8282 -#define GL_COLOR_COMPONENTS 0x8283 -#define GL_DEPTH_COMPONENTS 0x8284 -#define GL_STENCIL_COMPONENTS 0x8285 -#define GL_COLOR_RENDERABLE 0x8286 -#define GL_DEPTH_RENDERABLE 0x8287 -#define GL_STENCIL_RENDERABLE 0x8288 -#define GL_FRAMEBUFFER_RENDERABLE 0x8289 -#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A -#define GL_FRAMEBUFFER_BLEND 0x828B -#define GL_READ_PIXELS 0x828C -#define GL_READ_PIXELS_FORMAT 0x828D -#define GL_READ_PIXELS_TYPE 0x828E -#define GL_TEXTURE_IMAGE_FORMAT 0x828F -#define GL_TEXTURE_IMAGE_TYPE 0x8290 -#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 -#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 -#define GL_MIPMAP 0x8293 -#define GL_MANUAL_GENERATE_MIPMAP 0x8294 -#define GL_AUTO_GENERATE_MIPMAP 0x8295 -#define GL_COLOR_ENCODING 0x8296 -#define GL_SRGB_READ 0x8297 -#define GL_SRGB_WRITE 0x8298 -#define GL_SRGB_DECODE_ARB 0x8299 -#define GL_FILTER 0x829A -#define GL_VERTEX_TEXTURE 0x829B -#define GL_TESS_CONTROL_TEXTURE 0x829C -#define GL_TESS_EVALUATION_TEXTURE 0x829D -#define GL_GEOMETRY_TEXTURE 0x829E -#define GL_FRAGMENT_TEXTURE 0x829F -#define GL_COMPUTE_TEXTURE 0x82A0 -#define GL_TEXTURE_SHADOW 0x82A1 -#define GL_TEXTURE_GATHER 0x82A2 -#define GL_TEXTURE_GATHER_SHADOW 0x82A3 -#define GL_SHADER_IMAGE_LOAD 0x82A4 -#define GL_SHADER_IMAGE_STORE 0x82A5 -#define GL_SHADER_IMAGE_ATOMIC 0x82A6 -#define GL_IMAGE_TEXEL_SIZE 0x82A7 -#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 -#define GL_IMAGE_PIXEL_FORMAT 0x82A9 -#define GL_IMAGE_PIXEL_TYPE 0x82AA -#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC -#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD -#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE -#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF -#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 -#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 -#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 -#define GL_CLEAR_BUFFER 0x82B4 -#define GL_TEXTURE_VIEW 0x82B5 -#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 -#define GL_FULL_SUPPORT 0x82B7 -#define GL_CAVEAT_SUPPORT 0x82B8 -#define GL_IMAGE_CLASS_4_X_32 0x82B9 -#define GL_IMAGE_CLASS_2_X_32 0x82BA -#define GL_IMAGE_CLASS_1_X_32 0x82BB -#define GL_IMAGE_CLASS_4_X_16 0x82BC -#define GL_IMAGE_CLASS_2_X_16 0x82BD -#define GL_IMAGE_CLASS_1_X_16 0x82BE -#define GL_IMAGE_CLASS_4_X_8 0x82BF -#define GL_IMAGE_CLASS_2_X_8 0x82C0 -#define GL_IMAGE_CLASS_1_X_8 0x82C1 -#define GL_IMAGE_CLASS_11_11_10 0x82C2 -#define GL_IMAGE_CLASS_10_10_10_2 0x82C3 -#define GL_VIEW_CLASS_128_BITS 0x82C4 -#define GL_VIEW_CLASS_96_BITS 0x82C5 -#define GL_VIEW_CLASS_64_BITS 0x82C6 -#define GL_VIEW_CLASS_48_BITS 0x82C7 -#define GL_VIEW_CLASS_32_BITS 0x82C8 -#define GL_VIEW_CLASS_24_BITS 0x82C9 -#define GL_VIEW_CLASS_16_BITS 0x82CA -#define GL_VIEW_CLASS_8_BITS 0x82CB -#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC -#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD -#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE -#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF -#define GL_VIEW_CLASS_RGTC1_RED 0x82D0 -#define GL_VIEW_CLASS_RGTC2_RG 0x82D1 -#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 -#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 - -typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64* params); - -#define glGetInternalformati64v GLEW_GET_FUN(__glewGetInternalformati64v) - -#define GLEW_ARB_internalformat_query2 GLEW_GET_VAR(__GLEW_ARB_internalformat_query2) - -#endif /* GL_ARB_internalformat_query2 */ - -/* ----------------------- GL_ARB_invalidate_subdata ----------------------- */ - -#ifndef GL_ARB_invalidate_subdata -#define GL_ARB_invalidate_subdata 1 - -typedef void (GLAPIENTRY * PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); -typedef void (GLAPIENTRY * PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments); -typedef void (GLAPIENTRY * PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); - -#define glInvalidateBufferData GLEW_GET_FUN(__glewInvalidateBufferData) -#define glInvalidateBufferSubData GLEW_GET_FUN(__glewInvalidateBufferSubData) -#define glInvalidateFramebuffer GLEW_GET_FUN(__glewInvalidateFramebuffer) -#define glInvalidateSubFramebuffer GLEW_GET_FUN(__glewInvalidateSubFramebuffer) -#define glInvalidateTexImage GLEW_GET_FUN(__glewInvalidateTexImage) -#define glInvalidateTexSubImage GLEW_GET_FUN(__glewInvalidateTexSubImage) - -#define GLEW_ARB_invalidate_subdata GLEW_GET_VAR(__GLEW_ARB_invalidate_subdata) - -#endif /* GL_ARB_invalidate_subdata */ - -/* ---------------------- GL_ARB_map_buffer_alignment ---------------------- */ - -#ifndef GL_ARB_map_buffer_alignment -#define GL_ARB_map_buffer_alignment 1 - -#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC - -#define GLEW_ARB_map_buffer_alignment GLEW_GET_VAR(__GLEW_ARB_map_buffer_alignment) - -#endif /* GL_ARB_map_buffer_alignment */ - -/* ------------------------ GL_ARB_map_buffer_range ------------------------ */ - -#ifndef GL_ARB_map_buffer_range -#define GL_ARB_map_buffer_range 1 - -#define GL_MAP_READ_BIT 0x0001 -#define GL_MAP_WRITE_BIT 0x0002 -#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 -#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 -#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 -#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 - -typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); -typedef void * (GLAPIENTRY * PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); - -#define glFlushMappedBufferRange GLEW_GET_FUN(__glewFlushMappedBufferRange) -#define glMapBufferRange GLEW_GET_FUN(__glewMapBufferRange) - -#define GLEW_ARB_map_buffer_range GLEW_GET_VAR(__GLEW_ARB_map_buffer_range) - -#endif /* GL_ARB_map_buffer_range */ - -/* ------------------------- GL_ARB_matrix_palette ------------------------- */ - -#ifndef GL_ARB_matrix_palette -#define GL_ARB_matrix_palette 1 - -#define GL_MATRIX_PALETTE_ARB 0x8840 -#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 -#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 -#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 -#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 -#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 -#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 -#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 -#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 -#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 - -typedef void (GLAPIENTRY * PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); -typedef void (GLAPIENTRY * PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); -typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUBVARBPROC) (GLint size, GLubyte *indices); -typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUIVARBPROC) (GLint size, GLuint *indices); -typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUSVARBPROC) (GLint size, GLushort *indices); - -#define glCurrentPaletteMatrixARB GLEW_GET_FUN(__glewCurrentPaletteMatrixARB) -#define glMatrixIndexPointerARB GLEW_GET_FUN(__glewMatrixIndexPointerARB) -#define glMatrixIndexubvARB GLEW_GET_FUN(__glewMatrixIndexubvARB) -#define glMatrixIndexuivARB GLEW_GET_FUN(__glewMatrixIndexuivARB) -#define glMatrixIndexusvARB GLEW_GET_FUN(__glewMatrixIndexusvARB) - -#define GLEW_ARB_matrix_palette GLEW_GET_VAR(__GLEW_ARB_matrix_palette) - -#endif /* GL_ARB_matrix_palette */ - -/* --------------------------- GL_ARB_multi_bind --------------------------- */ - -#ifndef GL_ARB_multi_bind -#define GL_ARB_multi_bind 1 - -typedef void (GLAPIENTRY * PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizeiptr *sizes); -typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures); -typedef void (GLAPIENTRY * PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint* samplers); -typedef void (GLAPIENTRY * PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures); -typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizei *strides); - -#define glBindBuffersBase GLEW_GET_FUN(__glewBindBuffersBase) -#define glBindBuffersRange GLEW_GET_FUN(__glewBindBuffersRange) -#define glBindImageTextures GLEW_GET_FUN(__glewBindImageTextures) -#define glBindSamplers GLEW_GET_FUN(__glewBindSamplers) -#define glBindTextures GLEW_GET_FUN(__glewBindTextures) -#define glBindVertexBuffers GLEW_GET_FUN(__glewBindVertexBuffers) - -#define GLEW_ARB_multi_bind GLEW_GET_VAR(__GLEW_ARB_multi_bind) - -#endif /* GL_ARB_multi_bind */ - -/* ----------------------- GL_ARB_multi_draw_indirect ---------------------- */ - -#ifndef GL_ARB_multi_draw_indirect -#define GL_ARB_multi_draw_indirect 1 - -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); - -#define glMultiDrawArraysIndirect GLEW_GET_FUN(__glewMultiDrawArraysIndirect) -#define glMultiDrawElementsIndirect GLEW_GET_FUN(__glewMultiDrawElementsIndirect) - -#define GLEW_ARB_multi_draw_indirect GLEW_GET_VAR(__GLEW_ARB_multi_draw_indirect) - -#endif /* GL_ARB_multi_draw_indirect */ - -/* --------------------------- GL_ARB_multisample -------------------------- */ - -#ifndef GL_ARB_multisample -#define GL_ARB_multisample 1 - -#define GL_MULTISAMPLE_ARB 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F -#define GL_SAMPLE_COVERAGE_ARB 0x80A0 -#define GL_SAMPLE_BUFFERS_ARB 0x80A8 -#define GL_SAMPLES_ARB 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB -#define GL_MULTISAMPLE_BIT_ARB 0x20000000 - -typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); - -#define glSampleCoverageARB GLEW_GET_FUN(__glewSampleCoverageARB) - -#define GLEW_ARB_multisample GLEW_GET_VAR(__GLEW_ARB_multisample) - -#endif /* GL_ARB_multisample */ - -/* -------------------------- GL_ARB_multitexture -------------------------- */ - -#ifndef GL_ARB_multitexture -#define GL_ARB_multitexture 1 - -#define GL_TEXTURE0_ARB 0x84C0 -#define GL_TEXTURE1_ARB 0x84C1 -#define GL_TEXTURE2_ARB 0x84C2 -#define GL_TEXTURE3_ARB 0x84C3 -#define GL_TEXTURE4_ARB 0x84C4 -#define GL_TEXTURE5_ARB 0x84C5 -#define GL_TEXTURE6_ARB 0x84C6 -#define GL_TEXTURE7_ARB 0x84C7 -#define GL_TEXTURE8_ARB 0x84C8 -#define GL_TEXTURE9_ARB 0x84C9 -#define GL_TEXTURE10_ARB 0x84CA -#define GL_TEXTURE11_ARB 0x84CB -#define GL_TEXTURE12_ARB 0x84CC -#define GL_TEXTURE13_ARB 0x84CD -#define GL_TEXTURE14_ARB 0x84CE -#define GL_TEXTURE15_ARB 0x84CF -#define GL_TEXTURE16_ARB 0x84D0 -#define GL_TEXTURE17_ARB 0x84D1 -#define GL_TEXTURE18_ARB 0x84D2 -#define GL_TEXTURE19_ARB 0x84D3 -#define GL_TEXTURE20_ARB 0x84D4 -#define GL_TEXTURE21_ARB 0x84D5 -#define GL_TEXTURE22_ARB 0x84D6 -#define GL_TEXTURE23_ARB 0x84D7 -#define GL_TEXTURE24_ARB 0x84D8 -#define GL_TEXTURE25_ARB 0x84D9 -#define GL_TEXTURE26_ARB 0x84DA -#define GL_TEXTURE27_ARB 0x84DB -#define GL_TEXTURE28_ARB 0x84DC -#define GL_TEXTURE29_ARB 0x84DD -#define GL_TEXTURE30_ARB 0x84DE -#define GL_TEXTURE31_ARB 0x84DF -#define GL_ACTIVE_TEXTURE_ARB 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 -#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 - -typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); - -#define glActiveTextureARB GLEW_GET_FUN(__glewActiveTextureARB) -#define glClientActiveTextureARB GLEW_GET_FUN(__glewClientActiveTextureARB) -#define glMultiTexCoord1dARB GLEW_GET_FUN(__glewMultiTexCoord1dARB) -#define glMultiTexCoord1dvARB GLEW_GET_FUN(__glewMultiTexCoord1dvARB) -#define glMultiTexCoord1fARB GLEW_GET_FUN(__glewMultiTexCoord1fARB) -#define glMultiTexCoord1fvARB GLEW_GET_FUN(__glewMultiTexCoord1fvARB) -#define glMultiTexCoord1iARB GLEW_GET_FUN(__glewMultiTexCoord1iARB) -#define glMultiTexCoord1ivARB GLEW_GET_FUN(__glewMultiTexCoord1ivARB) -#define glMultiTexCoord1sARB GLEW_GET_FUN(__glewMultiTexCoord1sARB) -#define glMultiTexCoord1svARB GLEW_GET_FUN(__glewMultiTexCoord1svARB) -#define glMultiTexCoord2dARB GLEW_GET_FUN(__glewMultiTexCoord2dARB) -#define glMultiTexCoord2dvARB GLEW_GET_FUN(__glewMultiTexCoord2dvARB) -#define glMultiTexCoord2fARB GLEW_GET_FUN(__glewMultiTexCoord2fARB) -#define glMultiTexCoord2fvARB GLEW_GET_FUN(__glewMultiTexCoord2fvARB) -#define glMultiTexCoord2iARB GLEW_GET_FUN(__glewMultiTexCoord2iARB) -#define glMultiTexCoord2ivARB GLEW_GET_FUN(__glewMultiTexCoord2ivARB) -#define glMultiTexCoord2sARB GLEW_GET_FUN(__glewMultiTexCoord2sARB) -#define glMultiTexCoord2svARB GLEW_GET_FUN(__glewMultiTexCoord2svARB) -#define glMultiTexCoord3dARB GLEW_GET_FUN(__glewMultiTexCoord3dARB) -#define glMultiTexCoord3dvARB GLEW_GET_FUN(__glewMultiTexCoord3dvARB) -#define glMultiTexCoord3fARB GLEW_GET_FUN(__glewMultiTexCoord3fARB) -#define glMultiTexCoord3fvARB GLEW_GET_FUN(__glewMultiTexCoord3fvARB) -#define glMultiTexCoord3iARB GLEW_GET_FUN(__glewMultiTexCoord3iARB) -#define glMultiTexCoord3ivARB GLEW_GET_FUN(__glewMultiTexCoord3ivARB) -#define glMultiTexCoord3sARB GLEW_GET_FUN(__glewMultiTexCoord3sARB) -#define glMultiTexCoord3svARB GLEW_GET_FUN(__glewMultiTexCoord3svARB) -#define glMultiTexCoord4dARB GLEW_GET_FUN(__glewMultiTexCoord4dARB) -#define glMultiTexCoord4dvARB GLEW_GET_FUN(__glewMultiTexCoord4dvARB) -#define glMultiTexCoord4fARB GLEW_GET_FUN(__glewMultiTexCoord4fARB) -#define glMultiTexCoord4fvARB GLEW_GET_FUN(__glewMultiTexCoord4fvARB) -#define glMultiTexCoord4iARB GLEW_GET_FUN(__glewMultiTexCoord4iARB) -#define glMultiTexCoord4ivARB GLEW_GET_FUN(__glewMultiTexCoord4ivARB) -#define glMultiTexCoord4sARB GLEW_GET_FUN(__glewMultiTexCoord4sARB) -#define glMultiTexCoord4svARB GLEW_GET_FUN(__glewMultiTexCoord4svARB) - -#define GLEW_ARB_multitexture GLEW_GET_VAR(__GLEW_ARB_multitexture) - -#endif /* GL_ARB_multitexture */ - -/* ------------------------- GL_ARB_occlusion_query ------------------------ */ - -#ifndef GL_ARB_occlusion_query -#define GL_ARB_occlusion_query 1 - -#define GL_QUERY_COUNTER_BITS_ARB 0x8864 -#define GL_CURRENT_QUERY_ARB 0x8865 -#define GL_QUERY_RESULT_ARB 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 -#define GL_SAMPLES_PASSED_ARB 0x8914 - -typedef void (GLAPIENTRY * PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLENDQUERYARBPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISQUERYARBPROC) (GLuint id); - -#define glBeginQueryARB GLEW_GET_FUN(__glewBeginQueryARB) -#define glDeleteQueriesARB GLEW_GET_FUN(__glewDeleteQueriesARB) -#define glEndQueryARB GLEW_GET_FUN(__glewEndQueryARB) -#define glGenQueriesARB GLEW_GET_FUN(__glewGenQueriesARB) -#define glGetQueryObjectivARB GLEW_GET_FUN(__glewGetQueryObjectivARB) -#define glGetQueryObjectuivARB GLEW_GET_FUN(__glewGetQueryObjectuivARB) -#define glGetQueryivARB GLEW_GET_FUN(__glewGetQueryivARB) -#define glIsQueryARB GLEW_GET_FUN(__glewIsQueryARB) - -#define GLEW_ARB_occlusion_query GLEW_GET_VAR(__GLEW_ARB_occlusion_query) - -#endif /* GL_ARB_occlusion_query */ - -/* ------------------------ GL_ARB_occlusion_query2 ------------------------ */ - -#ifndef GL_ARB_occlusion_query2 -#define GL_ARB_occlusion_query2 1 - -#define GL_ANY_SAMPLES_PASSED 0x8C2F - -#define GLEW_ARB_occlusion_query2 GLEW_GET_VAR(__GLEW_ARB_occlusion_query2) - -#endif /* GL_ARB_occlusion_query2 */ - -/* --------------------- GL_ARB_parallel_shader_compile -------------------- */ - -#ifndef GL_ARB_parallel_shader_compile -#define GL_ARB_parallel_shader_compile 1 - -#define GL_MAX_SHADER_COMPILER_THREADS_ARB 0x91B0 -#define GL_COMPLETION_STATUS_ARB 0x91B1 - -typedef void (GLAPIENTRY * PFNGLMAXSHADERCOMPILERTHREADSARBPROC) (GLuint count); - -#define glMaxShaderCompilerThreadsARB GLEW_GET_FUN(__glewMaxShaderCompilerThreadsARB) - -#define GLEW_ARB_parallel_shader_compile GLEW_GET_VAR(__GLEW_ARB_parallel_shader_compile) - -#endif /* GL_ARB_parallel_shader_compile */ - -/* -------------------- GL_ARB_pipeline_statistics_query ------------------- */ - -#ifndef GL_ARB_pipeline_statistics_query -#define GL_ARB_pipeline_statistics_query 1 - -#define GL_VERTICES_SUBMITTED_ARB 0x82EE -#define GL_PRIMITIVES_SUBMITTED_ARB 0x82EF -#define GL_VERTEX_SHADER_INVOCATIONS_ARB 0x82F0 -#define GL_TESS_CONTROL_SHADER_PATCHES_ARB 0x82F1 -#define GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB 0x82F2 -#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB 0x82F3 -#define GL_FRAGMENT_SHADER_INVOCATIONS_ARB 0x82F4 -#define GL_COMPUTE_SHADER_INVOCATIONS_ARB 0x82F5 -#define GL_CLIPPING_INPUT_PRIMITIVES_ARB 0x82F6 -#define GL_CLIPPING_OUTPUT_PRIMITIVES_ARB 0x82F7 -#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F - -#define GLEW_ARB_pipeline_statistics_query GLEW_GET_VAR(__GLEW_ARB_pipeline_statistics_query) - -#endif /* GL_ARB_pipeline_statistics_query */ - -/* ----------------------- GL_ARB_pixel_buffer_object ---------------------- */ - -#ifndef GL_ARB_pixel_buffer_object -#define GL_ARB_pixel_buffer_object 1 - -#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF - -#define GLEW_ARB_pixel_buffer_object GLEW_GET_VAR(__GLEW_ARB_pixel_buffer_object) - -#endif /* GL_ARB_pixel_buffer_object */ - -/* ------------------------ GL_ARB_point_parameters ------------------------ */ - -#ifndef GL_ARB_point_parameters -#define GL_ARB_point_parameters 1 - -#define GL_POINT_SIZE_MIN_ARB 0x8126 -#define GL_POINT_SIZE_MAX_ARB 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 - -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat* params); - -#define glPointParameterfARB GLEW_GET_FUN(__glewPointParameterfARB) -#define glPointParameterfvARB GLEW_GET_FUN(__glewPointParameterfvARB) - -#define GLEW_ARB_point_parameters GLEW_GET_VAR(__GLEW_ARB_point_parameters) - -#endif /* GL_ARB_point_parameters */ - -/* -------------------------- GL_ARB_point_sprite -------------------------- */ - -#ifndef GL_ARB_point_sprite -#define GL_ARB_point_sprite 1 - -#define GL_POINT_SPRITE_ARB 0x8861 -#define GL_COORD_REPLACE_ARB 0x8862 - -#define GLEW_ARB_point_sprite GLEW_GET_VAR(__GLEW_ARB_point_sprite) - -#endif /* GL_ARB_point_sprite */ - -/* ---------------------- GL_ARB_polygon_offset_clamp ---------------------- */ - -#ifndef GL_ARB_polygon_offset_clamp -#define GL_ARB_polygon_offset_clamp 1 - -#define GL_POLYGON_OFFSET_CLAMP 0x8E1B - -typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETCLAMPPROC) (GLfloat factor, GLfloat units, GLfloat clamp); - -#define glPolygonOffsetClamp GLEW_GET_FUN(__glewPolygonOffsetClamp) - -#define GLEW_ARB_polygon_offset_clamp GLEW_GET_VAR(__GLEW_ARB_polygon_offset_clamp) - -#endif /* GL_ARB_polygon_offset_clamp */ - -/* ----------------------- GL_ARB_post_depth_coverage ---------------------- */ - -#ifndef GL_ARB_post_depth_coverage -#define GL_ARB_post_depth_coverage 1 - -#define GLEW_ARB_post_depth_coverage GLEW_GET_VAR(__GLEW_ARB_post_depth_coverage) - -#endif /* GL_ARB_post_depth_coverage */ - -/* --------------------- GL_ARB_program_interface_query -------------------- */ - -#ifndef GL_ARB_program_interface_query -#define GL_ARB_program_interface_query 1 - -#define GL_UNIFORM 0x92E1 -#define GL_UNIFORM_BLOCK 0x92E2 -#define GL_PROGRAM_INPUT 0x92E3 -#define GL_PROGRAM_OUTPUT 0x92E4 -#define GL_BUFFER_VARIABLE 0x92E5 -#define GL_SHADER_STORAGE_BLOCK 0x92E6 -#define GL_IS_PER_PATCH 0x92E7 -#define GL_VERTEX_SUBROUTINE 0x92E8 -#define GL_TESS_CONTROL_SUBROUTINE 0x92E9 -#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA -#define GL_GEOMETRY_SUBROUTINE 0x92EB -#define GL_FRAGMENT_SUBROUTINE 0x92EC -#define GL_COMPUTE_SUBROUTINE 0x92ED -#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE -#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF -#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 -#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 -#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 -#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 -#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 -#define GL_ACTIVE_RESOURCES 0x92F5 -#define GL_MAX_NAME_LENGTH 0x92F6 -#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 -#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 -#define GL_NAME_LENGTH 0x92F9 -#define GL_TYPE 0x92FA -#define GL_ARRAY_SIZE 0x92FB -#define GL_OFFSET 0x92FC -#define GL_BLOCK_INDEX 0x92FD -#define GL_ARRAY_STRIDE 0x92FE -#define GL_MATRIX_STRIDE 0x92FF -#define GL_IS_ROW_MAJOR 0x9300 -#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 -#define GL_BUFFER_BINDING 0x9302 -#define GL_BUFFER_DATA_SIZE 0x9303 -#define GL_NUM_ACTIVE_VARIABLES 0x9304 -#define GL_ACTIVE_VARIABLES 0x9305 -#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 -#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 -#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 -#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 -#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A -#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B -#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C -#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D -#define GL_LOCATION 0x930E -#define GL_LOCATION_INDEX 0x930F - -typedef void (GLAPIENTRY * PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint* params); -typedef GLuint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar* name); -typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar* name); -typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei* length, GLchar *name); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei *length, GLint *params); - -#define glGetProgramInterfaceiv GLEW_GET_FUN(__glewGetProgramInterfaceiv) -#define glGetProgramResourceIndex GLEW_GET_FUN(__glewGetProgramResourceIndex) -#define glGetProgramResourceLocation GLEW_GET_FUN(__glewGetProgramResourceLocation) -#define glGetProgramResourceLocationIndex GLEW_GET_FUN(__glewGetProgramResourceLocationIndex) -#define glGetProgramResourceName GLEW_GET_FUN(__glewGetProgramResourceName) -#define glGetProgramResourceiv GLEW_GET_FUN(__glewGetProgramResourceiv) - -#define GLEW_ARB_program_interface_query GLEW_GET_VAR(__GLEW_ARB_program_interface_query) - -#endif /* GL_ARB_program_interface_query */ - -/* ------------------------ GL_ARB_provoking_vertex ------------------------ */ - -#ifndef GL_ARB_provoking_vertex -#define GL_ARB_provoking_vertex 1 - -#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C -#define GL_FIRST_VERTEX_CONVENTION 0x8E4D -#define GL_LAST_VERTEX_CONVENTION 0x8E4E -#define GL_PROVOKING_VERTEX 0x8E4F - -typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXPROC) (GLenum mode); - -#define glProvokingVertex GLEW_GET_FUN(__glewProvokingVertex) - -#define GLEW_ARB_provoking_vertex GLEW_GET_VAR(__GLEW_ARB_provoking_vertex) - -#endif /* GL_ARB_provoking_vertex */ - -/* ----------------------- GL_ARB_query_buffer_object ---------------------- */ - -#ifndef GL_ARB_query_buffer_object -#define GL_ARB_query_buffer_object 1 - -#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 -#define GL_QUERY_BUFFER 0x9192 -#define GL_QUERY_BUFFER_BINDING 0x9193 -#define GL_QUERY_RESULT_NO_WAIT 0x9194 - -#define GLEW_ARB_query_buffer_object GLEW_GET_VAR(__GLEW_ARB_query_buffer_object) - -#endif /* GL_ARB_query_buffer_object */ - -/* ------------------ GL_ARB_robust_buffer_access_behavior ----------------- */ - -#ifndef GL_ARB_robust_buffer_access_behavior -#define GL_ARB_robust_buffer_access_behavior 1 - -#define GLEW_ARB_robust_buffer_access_behavior GLEW_GET_VAR(__GLEW_ARB_robust_buffer_access_behavior) - -#endif /* GL_ARB_robust_buffer_access_behavior */ - -/* --------------------------- GL_ARB_robustness --------------------------- */ - -#ifndef GL_ARB_robustness -#define GL_ARB_robustness 1 - -#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 -#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 -#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 -#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 -#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 -#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 -#define GL_NO_RESET_NOTIFICATION_ARB 0x8261 - -typedef GLenum (GLAPIENTRY * PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); -typedef void (GLAPIENTRY * PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* table); -typedef void (GLAPIENTRY * PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void* img); -typedef void (GLAPIENTRY * PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* image); -typedef void (GLAPIENTRY * PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values); -typedef void (GLAPIENTRY * PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble* v); -typedef void (GLAPIENTRY * PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat* v); -typedef void (GLAPIENTRY * PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint* v); -typedef void (GLAPIENTRY * PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values); -typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat* values); -typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint* values); -typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort* values); -typedef void (GLAPIENTRY * PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte* pattern); -typedef void (GLAPIENTRY * PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void* row, GLsizei columnBufSize, void*column, void*span); -typedef void (GLAPIENTRY * PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* img); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params); -typedef void (GLAPIENTRY * PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data); - -#define glGetGraphicsResetStatusARB GLEW_GET_FUN(__glewGetGraphicsResetStatusARB) -#define glGetnColorTableARB GLEW_GET_FUN(__glewGetnColorTableARB) -#define glGetnCompressedTexImageARB GLEW_GET_FUN(__glewGetnCompressedTexImageARB) -#define glGetnConvolutionFilterARB GLEW_GET_FUN(__glewGetnConvolutionFilterARB) -#define glGetnHistogramARB GLEW_GET_FUN(__glewGetnHistogramARB) -#define glGetnMapdvARB GLEW_GET_FUN(__glewGetnMapdvARB) -#define glGetnMapfvARB GLEW_GET_FUN(__glewGetnMapfvARB) -#define glGetnMapivARB GLEW_GET_FUN(__glewGetnMapivARB) -#define glGetnMinmaxARB GLEW_GET_FUN(__glewGetnMinmaxARB) -#define glGetnPixelMapfvARB GLEW_GET_FUN(__glewGetnPixelMapfvARB) -#define glGetnPixelMapuivARB GLEW_GET_FUN(__glewGetnPixelMapuivARB) -#define glGetnPixelMapusvARB GLEW_GET_FUN(__glewGetnPixelMapusvARB) -#define glGetnPolygonStippleARB GLEW_GET_FUN(__glewGetnPolygonStippleARB) -#define glGetnSeparableFilterARB GLEW_GET_FUN(__glewGetnSeparableFilterARB) -#define glGetnTexImageARB GLEW_GET_FUN(__glewGetnTexImageARB) -#define glGetnUniformdvARB GLEW_GET_FUN(__glewGetnUniformdvARB) -#define glGetnUniformfvARB GLEW_GET_FUN(__glewGetnUniformfvARB) -#define glGetnUniformivARB GLEW_GET_FUN(__glewGetnUniformivARB) -#define glGetnUniformuivARB GLEW_GET_FUN(__glewGetnUniformuivARB) -#define glReadnPixelsARB GLEW_GET_FUN(__glewReadnPixelsARB) - -#define GLEW_ARB_robustness GLEW_GET_VAR(__GLEW_ARB_robustness) - -#endif /* GL_ARB_robustness */ - -/* ---------------- GL_ARB_robustness_application_isolation ---------------- */ - -#ifndef GL_ARB_robustness_application_isolation -#define GL_ARB_robustness_application_isolation 1 - -#define GLEW_ARB_robustness_application_isolation GLEW_GET_VAR(__GLEW_ARB_robustness_application_isolation) - -#endif /* GL_ARB_robustness_application_isolation */ - -/* ---------------- GL_ARB_robustness_share_group_isolation ---------------- */ - -#ifndef GL_ARB_robustness_share_group_isolation -#define GL_ARB_robustness_share_group_isolation 1 - -#define GLEW_ARB_robustness_share_group_isolation GLEW_GET_VAR(__GLEW_ARB_robustness_share_group_isolation) - -#endif /* GL_ARB_robustness_share_group_isolation */ - -/* ------------------------ GL_ARB_sample_locations ------------------------ */ - -#ifndef GL_ARB_sample_locations -#define GL_ARB_sample_locations 1 - -#define GL_SAMPLE_LOCATION_ARB 0x8E50 -#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB 0x933D -#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB 0x933E -#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB 0x933F -#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB 0x9340 -#define GL_PROGRAMMABLE_SAMPLE_LOCATION_ARB 0x9341 -#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB 0x9342 -#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB 0x9343 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); - -#define glFramebufferSampleLocationsfvARB GLEW_GET_FUN(__glewFramebufferSampleLocationsfvARB) -#define glNamedFramebufferSampleLocationsfvARB GLEW_GET_FUN(__glewNamedFramebufferSampleLocationsfvARB) - -#define GLEW_ARB_sample_locations GLEW_GET_VAR(__GLEW_ARB_sample_locations) - -#endif /* GL_ARB_sample_locations */ - -/* ------------------------- GL_ARB_sample_shading ------------------------- */ - -#ifndef GL_ARB_sample_shading -#define GL_ARB_sample_shading 1 - -#define GL_SAMPLE_SHADING_ARB 0x8C36 -#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 - -typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGARBPROC) (GLclampf value); - -#define glMinSampleShadingARB GLEW_GET_FUN(__glewMinSampleShadingARB) - -#define GLEW_ARB_sample_shading GLEW_GET_VAR(__GLEW_ARB_sample_shading) - -#endif /* GL_ARB_sample_shading */ - -/* ------------------------- GL_ARB_sampler_objects ------------------------ */ - -#ifndef GL_ARB_sampler_objects -#define GL_ARB_sampler_objects 1 - -#define GL_SAMPLER_BINDING 0x8919 - -typedef void (GLAPIENTRY * PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); -typedef void (GLAPIENTRY * PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint * samplers); -typedef void (GLAPIENTRY * PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint* samplers); -typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISSAMPLERPROC) (GLuint sampler); -typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint* params); - -#define glBindSampler GLEW_GET_FUN(__glewBindSampler) -#define glDeleteSamplers GLEW_GET_FUN(__glewDeleteSamplers) -#define glGenSamplers GLEW_GET_FUN(__glewGenSamplers) -#define glGetSamplerParameterIiv GLEW_GET_FUN(__glewGetSamplerParameterIiv) -#define glGetSamplerParameterIuiv GLEW_GET_FUN(__glewGetSamplerParameterIuiv) -#define glGetSamplerParameterfv GLEW_GET_FUN(__glewGetSamplerParameterfv) -#define glGetSamplerParameteriv GLEW_GET_FUN(__glewGetSamplerParameteriv) -#define glIsSampler GLEW_GET_FUN(__glewIsSampler) -#define glSamplerParameterIiv GLEW_GET_FUN(__glewSamplerParameterIiv) -#define glSamplerParameterIuiv GLEW_GET_FUN(__glewSamplerParameterIuiv) -#define glSamplerParameterf GLEW_GET_FUN(__glewSamplerParameterf) -#define glSamplerParameterfv GLEW_GET_FUN(__glewSamplerParameterfv) -#define glSamplerParameteri GLEW_GET_FUN(__glewSamplerParameteri) -#define glSamplerParameteriv GLEW_GET_FUN(__glewSamplerParameteriv) - -#define GLEW_ARB_sampler_objects GLEW_GET_VAR(__GLEW_ARB_sampler_objects) - -#endif /* GL_ARB_sampler_objects */ - -/* ------------------------ GL_ARB_seamless_cube_map ----------------------- */ - -#ifndef GL_ARB_seamless_cube_map -#define GL_ARB_seamless_cube_map 1 - -#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F - -#define GLEW_ARB_seamless_cube_map GLEW_GET_VAR(__GLEW_ARB_seamless_cube_map) - -#endif /* GL_ARB_seamless_cube_map */ - -/* ------------------ GL_ARB_seamless_cubemap_per_texture ------------------ */ - -#ifndef GL_ARB_seamless_cubemap_per_texture -#define GL_ARB_seamless_cubemap_per_texture 1 - -#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F - -#define GLEW_ARB_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_ARB_seamless_cubemap_per_texture) - -#endif /* GL_ARB_seamless_cubemap_per_texture */ - -/* --------------------- GL_ARB_separate_shader_objects -------------------- */ - -#ifndef GL_ARB_separate_shader_objects -#define GL_ARB_separate_shader_objects 1 - -#define GL_VERTEX_SHADER_BIT 0x00000001 -#define GL_FRAGMENT_SHADER_BIT 0x00000002 -#define GL_GEOMETRY_SHADER_BIT 0x00000004 -#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 -#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 -#define GL_PROGRAM_SEPARABLE 0x8258 -#define GL_ACTIVE_PROGRAM 0x8259 -#define GL_PROGRAM_PIPELINE_BINDING 0x825A -#define GL_ALL_SHADER_BITS 0xFFFFFFFF - -typedef void (GLAPIENTRY * PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); -typedef void (GLAPIENTRY * PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar * const * strings); -typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint* pipelines); -typedef void (GLAPIENTRY * PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei* length, GLchar *infoLog); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint x, GLint y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint x, GLuint y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); -typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); - -#define glActiveShaderProgram GLEW_GET_FUN(__glewActiveShaderProgram) -#define glBindProgramPipeline GLEW_GET_FUN(__glewBindProgramPipeline) -#define glCreateShaderProgramv GLEW_GET_FUN(__glewCreateShaderProgramv) -#define glDeleteProgramPipelines GLEW_GET_FUN(__glewDeleteProgramPipelines) -#define glGenProgramPipelines GLEW_GET_FUN(__glewGenProgramPipelines) -#define glGetProgramPipelineInfoLog GLEW_GET_FUN(__glewGetProgramPipelineInfoLog) -#define glGetProgramPipelineiv GLEW_GET_FUN(__glewGetProgramPipelineiv) -#define glIsProgramPipeline GLEW_GET_FUN(__glewIsProgramPipeline) -#define glProgramUniform1d GLEW_GET_FUN(__glewProgramUniform1d) -#define glProgramUniform1dv GLEW_GET_FUN(__glewProgramUniform1dv) -#define glProgramUniform1f GLEW_GET_FUN(__glewProgramUniform1f) -#define glProgramUniform1fv GLEW_GET_FUN(__glewProgramUniform1fv) -#define glProgramUniform1i GLEW_GET_FUN(__glewProgramUniform1i) -#define glProgramUniform1iv GLEW_GET_FUN(__glewProgramUniform1iv) -#define glProgramUniform1ui GLEW_GET_FUN(__glewProgramUniform1ui) -#define glProgramUniform1uiv GLEW_GET_FUN(__glewProgramUniform1uiv) -#define glProgramUniform2d GLEW_GET_FUN(__glewProgramUniform2d) -#define glProgramUniform2dv GLEW_GET_FUN(__glewProgramUniform2dv) -#define glProgramUniform2f GLEW_GET_FUN(__glewProgramUniform2f) -#define glProgramUniform2fv GLEW_GET_FUN(__glewProgramUniform2fv) -#define glProgramUniform2i GLEW_GET_FUN(__glewProgramUniform2i) -#define glProgramUniform2iv GLEW_GET_FUN(__glewProgramUniform2iv) -#define glProgramUniform2ui GLEW_GET_FUN(__glewProgramUniform2ui) -#define glProgramUniform2uiv GLEW_GET_FUN(__glewProgramUniform2uiv) -#define glProgramUniform3d GLEW_GET_FUN(__glewProgramUniform3d) -#define glProgramUniform3dv GLEW_GET_FUN(__glewProgramUniform3dv) -#define glProgramUniform3f GLEW_GET_FUN(__glewProgramUniform3f) -#define glProgramUniform3fv GLEW_GET_FUN(__glewProgramUniform3fv) -#define glProgramUniform3i GLEW_GET_FUN(__glewProgramUniform3i) -#define glProgramUniform3iv GLEW_GET_FUN(__glewProgramUniform3iv) -#define glProgramUniform3ui GLEW_GET_FUN(__glewProgramUniform3ui) -#define glProgramUniform3uiv GLEW_GET_FUN(__glewProgramUniform3uiv) -#define glProgramUniform4d GLEW_GET_FUN(__glewProgramUniform4d) -#define glProgramUniform4dv GLEW_GET_FUN(__glewProgramUniform4dv) -#define glProgramUniform4f GLEW_GET_FUN(__glewProgramUniform4f) -#define glProgramUniform4fv GLEW_GET_FUN(__glewProgramUniform4fv) -#define glProgramUniform4i GLEW_GET_FUN(__glewProgramUniform4i) -#define glProgramUniform4iv GLEW_GET_FUN(__glewProgramUniform4iv) -#define glProgramUniform4ui GLEW_GET_FUN(__glewProgramUniform4ui) -#define glProgramUniform4uiv GLEW_GET_FUN(__glewProgramUniform4uiv) -#define glProgramUniformMatrix2dv GLEW_GET_FUN(__glewProgramUniformMatrix2dv) -#define glProgramUniformMatrix2fv GLEW_GET_FUN(__glewProgramUniformMatrix2fv) -#define glProgramUniformMatrix2x3dv GLEW_GET_FUN(__glewProgramUniformMatrix2x3dv) -#define glProgramUniformMatrix2x3fv GLEW_GET_FUN(__glewProgramUniformMatrix2x3fv) -#define glProgramUniformMatrix2x4dv GLEW_GET_FUN(__glewProgramUniformMatrix2x4dv) -#define glProgramUniformMatrix2x4fv GLEW_GET_FUN(__glewProgramUniformMatrix2x4fv) -#define glProgramUniformMatrix3dv GLEW_GET_FUN(__glewProgramUniformMatrix3dv) -#define glProgramUniformMatrix3fv GLEW_GET_FUN(__glewProgramUniformMatrix3fv) -#define glProgramUniformMatrix3x2dv GLEW_GET_FUN(__glewProgramUniformMatrix3x2dv) -#define glProgramUniformMatrix3x2fv GLEW_GET_FUN(__glewProgramUniformMatrix3x2fv) -#define glProgramUniformMatrix3x4dv GLEW_GET_FUN(__glewProgramUniformMatrix3x4dv) -#define glProgramUniformMatrix3x4fv GLEW_GET_FUN(__glewProgramUniformMatrix3x4fv) -#define glProgramUniformMatrix4dv GLEW_GET_FUN(__glewProgramUniformMatrix4dv) -#define glProgramUniformMatrix4fv GLEW_GET_FUN(__glewProgramUniformMatrix4fv) -#define glProgramUniformMatrix4x2dv GLEW_GET_FUN(__glewProgramUniformMatrix4x2dv) -#define glProgramUniformMatrix4x2fv GLEW_GET_FUN(__glewProgramUniformMatrix4x2fv) -#define glProgramUniformMatrix4x3dv GLEW_GET_FUN(__glewProgramUniformMatrix4x3dv) -#define glProgramUniformMatrix4x3fv GLEW_GET_FUN(__glewProgramUniformMatrix4x3fv) -#define glUseProgramStages GLEW_GET_FUN(__glewUseProgramStages) -#define glValidateProgramPipeline GLEW_GET_FUN(__glewValidateProgramPipeline) - -#define GLEW_ARB_separate_shader_objects GLEW_GET_VAR(__GLEW_ARB_separate_shader_objects) - -#endif /* GL_ARB_separate_shader_objects */ - -/* -------------------- GL_ARB_shader_atomic_counter_ops ------------------- */ - -#ifndef GL_ARB_shader_atomic_counter_ops -#define GL_ARB_shader_atomic_counter_ops 1 - -#define GLEW_ARB_shader_atomic_counter_ops GLEW_GET_VAR(__GLEW_ARB_shader_atomic_counter_ops) - -#endif /* GL_ARB_shader_atomic_counter_ops */ - -/* --------------------- GL_ARB_shader_atomic_counters --------------------- */ - -#ifndef GL_ARB_shader_atomic_counters -#define GL_ARB_shader_atomic_counters 1 - -#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 -#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 -#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 -#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 -#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 -#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 -#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB -#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE -#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF -#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 -#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 -#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 -#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 -#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 -#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 -#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 -#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 -#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA -#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB -#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC - -typedef void (GLAPIENTRY * PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint* params); - -#define glGetActiveAtomicCounterBufferiv GLEW_GET_FUN(__glewGetActiveAtomicCounterBufferiv) - -#define GLEW_ARB_shader_atomic_counters GLEW_GET_VAR(__GLEW_ARB_shader_atomic_counters) - -#endif /* GL_ARB_shader_atomic_counters */ - -/* -------------------------- GL_ARB_shader_ballot ------------------------- */ - -#ifndef GL_ARB_shader_ballot -#define GL_ARB_shader_ballot 1 - -#define GLEW_ARB_shader_ballot GLEW_GET_VAR(__GLEW_ARB_shader_ballot) - -#endif /* GL_ARB_shader_ballot */ - -/* ----------------------- GL_ARB_shader_bit_encoding ---------------------- */ - -#ifndef GL_ARB_shader_bit_encoding -#define GL_ARB_shader_bit_encoding 1 - -#define GLEW_ARB_shader_bit_encoding GLEW_GET_VAR(__GLEW_ARB_shader_bit_encoding) - -#endif /* GL_ARB_shader_bit_encoding */ - -/* -------------------------- GL_ARB_shader_clock -------------------------- */ - -#ifndef GL_ARB_shader_clock -#define GL_ARB_shader_clock 1 - -#define GLEW_ARB_shader_clock GLEW_GET_VAR(__GLEW_ARB_shader_clock) - -#endif /* GL_ARB_shader_clock */ - -/* --------------------- GL_ARB_shader_draw_parameters --------------------- */ - -#ifndef GL_ARB_shader_draw_parameters -#define GL_ARB_shader_draw_parameters 1 - -#define GLEW_ARB_shader_draw_parameters GLEW_GET_VAR(__GLEW_ARB_shader_draw_parameters) - -#endif /* GL_ARB_shader_draw_parameters */ - -/* ------------------------ GL_ARB_shader_group_vote ----------------------- */ - -#ifndef GL_ARB_shader_group_vote -#define GL_ARB_shader_group_vote 1 - -#define GLEW_ARB_shader_group_vote GLEW_GET_VAR(__GLEW_ARB_shader_group_vote) - -#endif /* GL_ARB_shader_group_vote */ - -/* --------------------- GL_ARB_shader_image_load_store -------------------- */ - -#ifndef GL_ARB_shader_image_load_store -#define GL_ARB_shader_image_load_store 1 - -#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 -#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 -#define GL_UNIFORM_BARRIER_BIT 0x00000004 -#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 -#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 -#define GL_COMMAND_BARRIER_BIT 0x00000040 -#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 -#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 -#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 -#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 -#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 -#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 -#define GL_MAX_IMAGE_UNITS 0x8F38 -#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 -#define GL_IMAGE_BINDING_NAME 0x8F3A -#define GL_IMAGE_BINDING_LEVEL 0x8F3B -#define GL_IMAGE_BINDING_LAYERED 0x8F3C -#define GL_IMAGE_BINDING_LAYER 0x8F3D -#define GL_IMAGE_BINDING_ACCESS 0x8F3E -#define GL_IMAGE_1D 0x904C -#define GL_IMAGE_2D 0x904D -#define GL_IMAGE_3D 0x904E -#define GL_IMAGE_2D_RECT 0x904F -#define GL_IMAGE_CUBE 0x9050 -#define GL_IMAGE_BUFFER 0x9051 -#define GL_IMAGE_1D_ARRAY 0x9052 -#define GL_IMAGE_2D_ARRAY 0x9053 -#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 -#define GL_IMAGE_2D_MULTISAMPLE 0x9055 -#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 -#define GL_INT_IMAGE_1D 0x9057 -#define GL_INT_IMAGE_2D 0x9058 -#define GL_INT_IMAGE_3D 0x9059 -#define GL_INT_IMAGE_2D_RECT 0x905A -#define GL_INT_IMAGE_CUBE 0x905B -#define GL_INT_IMAGE_BUFFER 0x905C -#define GL_INT_IMAGE_1D_ARRAY 0x905D -#define GL_INT_IMAGE_2D_ARRAY 0x905E -#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F -#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 -#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 -#define GL_UNSIGNED_INT_IMAGE_1D 0x9062 -#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 -#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 -#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 -#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 -#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 -#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 -#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 -#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C -#define GL_MAX_IMAGE_SAMPLES 0x906D -#define GL_IMAGE_BINDING_FORMAT 0x906E -#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 -#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 -#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 -#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA -#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB -#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC -#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD -#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE -#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF -#define GL_ALL_BARRIER_BITS 0xFFFFFFFF - -typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); -typedef void (GLAPIENTRY * PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); - -#define glBindImageTexture GLEW_GET_FUN(__glewBindImageTexture) -#define glMemoryBarrier GLEW_GET_FUN(__glewMemoryBarrier) - -#define GLEW_ARB_shader_image_load_store GLEW_GET_VAR(__GLEW_ARB_shader_image_load_store) - -#endif /* GL_ARB_shader_image_load_store */ - -/* ------------------------ GL_ARB_shader_image_size ----------------------- */ - -#ifndef GL_ARB_shader_image_size -#define GL_ARB_shader_image_size 1 - -#define GLEW_ARB_shader_image_size GLEW_GET_VAR(__GLEW_ARB_shader_image_size) - -#endif /* GL_ARB_shader_image_size */ - -/* ------------------------- GL_ARB_shader_objects ------------------------- */ - -#ifndef GL_ARB_shader_objects -#define GL_ARB_shader_objects 1 - -#define GL_PROGRAM_OBJECT_ARB 0x8B40 -#define GL_SHADER_OBJECT_ARB 0x8B48 -#define GL_OBJECT_TYPE_ARB 0x8B4E -#define GL_OBJECT_SUBTYPE_ARB 0x8B4F -#define GL_FLOAT_VEC2_ARB 0x8B50 -#define GL_FLOAT_VEC3_ARB 0x8B51 -#define GL_FLOAT_VEC4_ARB 0x8B52 -#define GL_INT_VEC2_ARB 0x8B53 -#define GL_INT_VEC3_ARB 0x8B54 -#define GL_INT_VEC4_ARB 0x8B55 -#define GL_BOOL_ARB 0x8B56 -#define GL_BOOL_VEC2_ARB 0x8B57 -#define GL_BOOL_VEC3_ARB 0x8B58 -#define GL_BOOL_VEC4_ARB 0x8B59 -#define GL_FLOAT_MAT2_ARB 0x8B5A -#define GL_FLOAT_MAT3_ARB 0x8B5B -#define GL_FLOAT_MAT4_ARB 0x8B5C -#define GL_SAMPLER_1D_ARB 0x8B5D -#define GL_SAMPLER_2D_ARB 0x8B5E -#define GL_SAMPLER_3D_ARB 0x8B5F -#define GL_SAMPLER_CUBE_ARB 0x8B60 -#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 -#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 -#define GL_SAMPLER_2D_RECT_ARB 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 -#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 -#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 -#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 -#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 -#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 -#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 -#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 -#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 -#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 - -typedef char GLcharARB; -typedef unsigned int GLhandleARB; - -typedef void (GLAPIENTRY * PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); -typedef void (GLAPIENTRY * PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); -typedef GLhandleARB (GLAPIENTRY * PFNGLCREATEPROGRAMOBJECTARBPROC) (void); -typedef GLhandleARB (GLAPIENTRY * PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); -typedef void (GLAPIENTRY * PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); -typedef void (GLAPIENTRY * PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); -typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); -typedef void (GLAPIENTRY * PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei* count, GLhandleARB *obj); -typedef GLhandleARB (GLAPIENTRY * PFNGLGETHANDLEARBPROC) (GLenum pname); -typedef void (GLAPIENTRY * PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *infoLog); -typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *source); -typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint* params); -typedef void (GLAPIENTRY * PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); -typedef void (GLAPIENTRY * PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint *length); -typedef void (GLAPIENTRY * PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); -typedef void (GLAPIENTRY * PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); -typedef void (GLAPIENTRY * PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (GLAPIENTRY * PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); -typedef void (GLAPIENTRY * PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (GLAPIENTRY * PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (GLAPIENTRY * PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (GLAPIENTRY * PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GLAPIENTRY * PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); -typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); - -#define glAttachObjectARB GLEW_GET_FUN(__glewAttachObjectARB) -#define glCompileShaderARB GLEW_GET_FUN(__glewCompileShaderARB) -#define glCreateProgramObjectARB GLEW_GET_FUN(__glewCreateProgramObjectARB) -#define glCreateShaderObjectARB GLEW_GET_FUN(__glewCreateShaderObjectARB) -#define glDeleteObjectARB GLEW_GET_FUN(__glewDeleteObjectARB) -#define glDetachObjectARB GLEW_GET_FUN(__glewDetachObjectARB) -#define glGetActiveUniformARB GLEW_GET_FUN(__glewGetActiveUniformARB) -#define glGetAttachedObjectsARB GLEW_GET_FUN(__glewGetAttachedObjectsARB) -#define glGetHandleARB GLEW_GET_FUN(__glewGetHandleARB) -#define glGetInfoLogARB GLEW_GET_FUN(__glewGetInfoLogARB) -#define glGetObjectParameterfvARB GLEW_GET_FUN(__glewGetObjectParameterfvARB) -#define glGetObjectParameterivARB GLEW_GET_FUN(__glewGetObjectParameterivARB) -#define glGetShaderSourceARB GLEW_GET_FUN(__glewGetShaderSourceARB) -#define glGetUniformLocationARB GLEW_GET_FUN(__glewGetUniformLocationARB) -#define glGetUniformfvARB GLEW_GET_FUN(__glewGetUniformfvARB) -#define glGetUniformivARB GLEW_GET_FUN(__glewGetUniformivARB) -#define glLinkProgramARB GLEW_GET_FUN(__glewLinkProgramARB) -#define glShaderSourceARB GLEW_GET_FUN(__glewShaderSourceARB) -#define glUniform1fARB GLEW_GET_FUN(__glewUniform1fARB) -#define glUniform1fvARB GLEW_GET_FUN(__glewUniform1fvARB) -#define glUniform1iARB GLEW_GET_FUN(__glewUniform1iARB) -#define glUniform1ivARB GLEW_GET_FUN(__glewUniform1ivARB) -#define glUniform2fARB GLEW_GET_FUN(__glewUniform2fARB) -#define glUniform2fvARB GLEW_GET_FUN(__glewUniform2fvARB) -#define glUniform2iARB GLEW_GET_FUN(__glewUniform2iARB) -#define glUniform2ivARB GLEW_GET_FUN(__glewUniform2ivARB) -#define glUniform3fARB GLEW_GET_FUN(__glewUniform3fARB) -#define glUniform3fvARB GLEW_GET_FUN(__glewUniform3fvARB) -#define glUniform3iARB GLEW_GET_FUN(__glewUniform3iARB) -#define glUniform3ivARB GLEW_GET_FUN(__glewUniform3ivARB) -#define glUniform4fARB GLEW_GET_FUN(__glewUniform4fARB) -#define glUniform4fvARB GLEW_GET_FUN(__glewUniform4fvARB) -#define glUniform4iARB GLEW_GET_FUN(__glewUniform4iARB) -#define glUniform4ivARB GLEW_GET_FUN(__glewUniform4ivARB) -#define glUniformMatrix2fvARB GLEW_GET_FUN(__glewUniformMatrix2fvARB) -#define glUniformMatrix3fvARB GLEW_GET_FUN(__glewUniformMatrix3fvARB) -#define glUniformMatrix4fvARB GLEW_GET_FUN(__glewUniformMatrix4fvARB) -#define glUseProgramObjectARB GLEW_GET_FUN(__glewUseProgramObjectARB) -#define glValidateProgramARB GLEW_GET_FUN(__glewValidateProgramARB) - -#define GLEW_ARB_shader_objects GLEW_GET_VAR(__GLEW_ARB_shader_objects) - -#endif /* GL_ARB_shader_objects */ - -/* ------------------------ GL_ARB_shader_precision ------------------------ */ - -#ifndef GL_ARB_shader_precision -#define GL_ARB_shader_precision 1 - -#define GLEW_ARB_shader_precision GLEW_GET_VAR(__GLEW_ARB_shader_precision) - -#endif /* GL_ARB_shader_precision */ - -/* ---------------------- GL_ARB_shader_stencil_export --------------------- */ - -#ifndef GL_ARB_shader_stencil_export -#define GL_ARB_shader_stencil_export 1 - -#define GLEW_ARB_shader_stencil_export GLEW_GET_VAR(__GLEW_ARB_shader_stencil_export) - -#endif /* GL_ARB_shader_stencil_export */ - -/* ------------------ GL_ARB_shader_storage_buffer_object ------------------ */ - -#ifndef GL_ARB_shader_storage_buffer_object -#define GL_ARB_shader_storage_buffer_object 1 - -#define GL_SHADER_STORAGE_BARRIER_BIT 0x2000 -#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 -#define GL_SHADER_STORAGE_BUFFER 0x90D2 -#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 -#define GL_SHADER_STORAGE_BUFFER_START 0x90D4 -#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 -#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 -#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 -#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 -#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 -#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA -#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB -#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC -#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD -#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE -#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF - -typedef void (GLAPIENTRY * PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); - -#define glShaderStorageBlockBinding GLEW_GET_FUN(__glewShaderStorageBlockBinding) - -#define GLEW_ARB_shader_storage_buffer_object GLEW_GET_VAR(__GLEW_ARB_shader_storage_buffer_object) - -#endif /* GL_ARB_shader_storage_buffer_object */ - -/* ------------------------ GL_ARB_shader_subroutine ----------------------- */ - -#ifndef GL_ARB_shader_subroutine -#define GL_ARB_shader_subroutine 1 - -#define GL_ACTIVE_SUBROUTINES 0x8DE5 -#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 -#define GL_MAX_SUBROUTINES 0x8DE7 -#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 -#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 -#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 -#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 -#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A -#define GL_COMPATIBLE_SUBROUTINES 0x8E4B - -typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar *name); -typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar *name); -typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint* values); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint* values); -typedef GLuint (GLAPIENTRY * PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar* name); -typedef GLint (GLAPIENTRY * PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint* params); -typedef void (GLAPIENTRY * PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint* indices); - -#define glGetActiveSubroutineName GLEW_GET_FUN(__glewGetActiveSubroutineName) -#define glGetActiveSubroutineUniformName GLEW_GET_FUN(__glewGetActiveSubroutineUniformName) -#define glGetActiveSubroutineUniformiv GLEW_GET_FUN(__glewGetActiveSubroutineUniformiv) -#define glGetProgramStageiv GLEW_GET_FUN(__glewGetProgramStageiv) -#define glGetSubroutineIndex GLEW_GET_FUN(__glewGetSubroutineIndex) -#define glGetSubroutineUniformLocation GLEW_GET_FUN(__glewGetSubroutineUniformLocation) -#define glGetUniformSubroutineuiv GLEW_GET_FUN(__glewGetUniformSubroutineuiv) -#define glUniformSubroutinesuiv GLEW_GET_FUN(__glewUniformSubroutinesuiv) - -#define GLEW_ARB_shader_subroutine GLEW_GET_VAR(__GLEW_ARB_shader_subroutine) - -#endif /* GL_ARB_shader_subroutine */ - -/* ------------------ GL_ARB_shader_texture_image_samples ------------------ */ - -#ifndef GL_ARB_shader_texture_image_samples -#define GL_ARB_shader_texture_image_samples 1 - -#define GLEW_ARB_shader_texture_image_samples GLEW_GET_VAR(__GLEW_ARB_shader_texture_image_samples) - -#endif /* GL_ARB_shader_texture_image_samples */ - -/* ----------------------- GL_ARB_shader_texture_lod ----------------------- */ - -#ifndef GL_ARB_shader_texture_lod -#define GL_ARB_shader_texture_lod 1 - -#define GLEW_ARB_shader_texture_lod GLEW_GET_VAR(__GLEW_ARB_shader_texture_lod) - -#endif /* GL_ARB_shader_texture_lod */ - -/* ------------------- GL_ARB_shader_viewport_layer_array ------------------ */ - -#ifndef GL_ARB_shader_viewport_layer_array -#define GL_ARB_shader_viewport_layer_array 1 - -#define GLEW_ARB_shader_viewport_layer_array GLEW_GET_VAR(__GLEW_ARB_shader_viewport_layer_array) - -#endif /* GL_ARB_shader_viewport_layer_array */ - -/* ---------------------- GL_ARB_shading_language_100 ---------------------- */ - -#ifndef GL_ARB_shading_language_100 -#define GL_ARB_shading_language_100 1 - -#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C - -#define GLEW_ARB_shading_language_100 GLEW_GET_VAR(__GLEW_ARB_shading_language_100) - -#endif /* GL_ARB_shading_language_100 */ - -/* -------------------- GL_ARB_shading_language_420pack -------------------- */ - -#ifndef GL_ARB_shading_language_420pack -#define GL_ARB_shading_language_420pack 1 - -#define GLEW_ARB_shading_language_420pack GLEW_GET_VAR(__GLEW_ARB_shading_language_420pack) - -#endif /* GL_ARB_shading_language_420pack */ - -/* -------------------- GL_ARB_shading_language_include -------------------- */ - -#ifndef GL_ARB_shading_language_include -#define GL_ARB_shading_language_include 1 - -#define GL_SHADER_INCLUDE_ARB 0x8DAE -#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 -#define GL_NAMED_STRING_TYPE_ARB 0x8DEA - -typedef void (GLAPIENTRY * PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar* const *path, const GLint *length); -typedef void (GLAPIENTRY * PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name, GLsizei bufSize, GLint *stringlen, GLchar *string); -typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar* name, GLenum pname, GLint *params); -typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar* name, GLint stringlen, const GLchar *string); - -#define glCompileShaderIncludeARB GLEW_GET_FUN(__glewCompileShaderIncludeARB) -#define glDeleteNamedStringARB GLEW_GET_FUN(__glewDeleteNamedStringARB) -#define glGetNamedStringARB GLEW_GET_FUN(__glewGetNamedStringARB) -#define glGetNamedStringivARB GLEW_GET_FUN(__glewGetNamedStringivARB) -#define glIsNamedStringARB GLEW_GET_FUN(__glewIsNamedStringARB) -#define glNamedStringARB GLEW_GET_FUN(__glewNamedStringARB) - -#define GLEW_ARB_shading_language_include GLEW_GET_VAR(__GLEW_ARB_shading_language_include) - -#endif /* GL_ARB_shading_language_include */ - -/* -------------------- GL_ARB_shading_language_packing -------------------- */ - -#ifndef GL_ARB_shading_language_packing -#define GL_ARB_shading_language_packing 1 - -#define GLEW_ARB_shading_language_packing GLEW_GET_VAR(__GLEW_ARB_shading_language_packing) - -#endif /* GL_ARB_shading_language_packing */ - -/* ----------------------------- GL_ARB_shadow ----------------------------- */ - -#ifndef GL_ARB_shadow -#define GL_ARB_shadow 1 - -#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C -#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D -#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E - -#define GLEW_ARB_shadow GLEW_GET_VAR(__GLEW_ARB_shadow) - -#endif /* GL_ARB_shadow */ - -/* ------------------------- GL_ARB_shadow_ambient ------------------------- */ - -#ifndef GL_ARB_shadow_ambient -#define GL_ARB_shadow_ambient 1 - -#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF - -#define GLEW_ARB_shadow_ambient GLEW_GET_VAR(__GLEW_ARB_shadow_ambient) - -#endif /* GL_ARB_shadow_ambient */ - -/* -------------------------- GL_ARB_sparse_buffer ------------------------- */ - -#ifndef GL_ARB_sparse_buffer -#define GL_ARB_sparse_buffer 1 - -#define GL_SPARSE_STORAGE_BIT_ARB 0x0400 -#define GL_SPARSE_BUFFER_PAGE_SIZE_ARB 0x82F8 - -typedef void (GLAPIENTRY * PFNGLBUFFERPAGECOMMITMENTARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); - -#define glBufferPageCommitmentARB GLEW_GET_FUN(__glewBufferPageCommitmentARB) - -#define GLEW_ARB_sparse_buffer GLEW_GET_VAR(__GLEW_ARB_sparse_buffer) - -#endif /* GL_ARB_sparse_buffer */ - -/* ------------------------- GL_ARB_sparse_texture ------------------------- */ - -#ifndef GL_ARB_sparse_texture -#define GL_ARB_sparse_texture 1 - -#define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195 -#define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196 -#define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197 -#define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198 -#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199 -#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A -#define GL_TEXTURE_SPARSE_ARB 0x91A6 -#define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 -#define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 -#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9 -#define GL_NUM_SPARSE_LEVELS_ARB 0x91AA - -typedef void (GLAPIENTRY * PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); - -#define glTexPageCommitmentARB GLEW_GET_FUN(__glewTexPageCommitmentARB) - -#define GLEW_ARB_sparse_texture GLEW_GET_VAR(__GLEW_ARB_sparse_texture) - -#endif /* GL_ARB_sparse_texture */ - -/* ------------------------- GL_ARB_sparse_texture2 ------------------------ */ - -#ifndef GL_ARB_sparse_texture2 -#define GL_ARB_sparse_texture2 1 - -#define GLEW_ARB_sparse_texture2 GLEW_GET_VAR(__GLEW_ARB_sparse_texture2) - -#endif /* GL_ARB_sparse_texture2 */ - -/* ---------------------- GL_ARB_sparse_texture_clamp ---------------------- */ - -#ifndef GL_ARB_sparse_texture_clamp -#define GL_ARB_sparse_texture_clamp 1 - -#define GLEW_ARB_sparse_texture_clamp GLEW_GET_VAR(__GLEW_ARB_sparse_texture_clamp) - -#endif /* GL_ARB_sparse_texture_clamp */ - -/* ------------------------ GL_ARB_spirv_extensions ------------------------ */ - -#ifndef GL_ARB_spirv_extensions -#define GL_ARB_spirv_extensions 1 - -#define GL_SPIR_V_EXTENSIONS 0x9553 -#define GL_NUM_SPIR_V_EXTENSIONS 0x9554 - -#define GLEW_ARB_spirv_extensions GLEW_GET_VAR(__GLEW_ARB_spirv_extensions) - -#endif /* GL_ARB_spirv_extensions */ - -/* ------------------------ GL_ARB_stencil_texturing ----------------------- */ - -#ifndef GL_ARB_stencil_texturing -#define GL_ARB_stencil_texturing 1 - -#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA - -#define GLEW_ARB_stencil_texturing GLEW_GET_VAR(__GLEW_ARB_stencil_texturing) - -#endif /* GL_ARB_stencil_texturing */ - -/* ------------------------------ GL_ARB_sync ------------------------------ */ - -#ifndef GL_ARB_sync -#define GL_ARB_sync 1 - -#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 -#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 -#define GL_OBJECT_TYPE 0x9112 -#define GL_SYNC_CONDITION 0x9113 -#define GL_SYNC_STATUS 0x9114 -#define GL_SYNC_FLAGS 0x9115 -#define GL_SYNC_FENCE 0x9116 -#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 -#define GL_UNSIGNALED 0x9118 -#define GL_SIGNALED 0x9119 -#define GL_ALREADY_SIGNALED 0x911A -#define GL_TIMEOUT_EXPIRED 0x911B -#define GL_CONDITION_SATISFIED 0x911C -#define GL_WAIT_FAILED 0x911D -#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull - -typedef GLenum (GLAPIENTRY * PFNGLCLIENTWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout); -typedef void (GLAPIENTRY * PFNGLDELETESYNCPROC) (GLsync GLsync); -typedef GLsync (GLAPIENTRY * PFNGLFENCESYNCPROC) (GLenum condition,GLbitfield flags); -typedef void (GLAPIENTRY * PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64* params); -typedef void (GLAPIENTRY * PFNGLGETSYNCIVPROC) (GLsync GLsync,GLenum pname,GLsizei bufSize,GLsizei* length, GLint *values); -typedef GLboolean (GLAPIENTRY * PFNGLISSYNCPROC) (GLsync GLsync); -typedef void (GLAPIENTRY * PFNGLWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout); - -#define glClientWaitSync GLEW_GET_FUN(__glewClientWaitSync) -#define glDeleteSync GLEW_GET_FUN(__glewDeleteSync) -#define glFenceSync GLEW_GET_FUN(__glewFenceSync) -#define glGetInteger64v GLEW_GET_FUN(__glewGetInteger64v) -#define glGetSynciv GLEW_GET_FUN(__glewGetSynciv) -#define glIsSync GLEW_GET_FUN(__glewIsSync) -#define glWaitSync GLEW_GET_FUN(__glewWaitSync) - -#define GLEW_ARB_sync GLEW_GET_VAR(__GLEW_ARB_sync) - -#endif /* GL_ARB_sync */ - -/* ----------------------- GL_ARB_tessellation_shader ---------------------- */ - -#ifndef GL_ARB_tessellation_shader -#define GL_ARB_tessellation_shader 1 - -#define GL_PATCHES 0xE -#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 -#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C -#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D -#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E -#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F -#define GL_PATCH_VERTICES 0x8E72 -#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 -#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 -#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 -#define GL_TESS_GEN_MODE 0x8E76 -#define GL_TESS_GEN_SPACING 0x8E77 -#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 -#define GL_TESS_GEN_POINT_MODE 0x8E79 -#define GL_ISOLINES 0x8E7A -#define GL_FRACTIONAL_ODD 0x8E7B -#define GL_FRACTIONAL_EVEN 0x8E7C -#define GL_MAX_PATCH_VERTICES 0x8E7D -#define GL_MAX_TESS_GEN_LEVEL 0x8E7E -#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F -#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 -#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 -#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 -#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 -#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 -#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 -#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 -#define GL_TESS_EVALUATION_SHADER 0x8E87 -#define GL_TESS_CONTROL_SHADER 0x8E88 -#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 -#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A - -typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat* values); -typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); - -#define glPatchParameterfv GLEW_GET_FUN(__glewPatchParameterfv) -#define glPatchParameteri GLEW_GET_FUN(__glewPatchParameteri) - -#define GLEW_ARB_tessellation_shader GLEW_GET_VAR(__GLEW_ARB_tessellation_shader) - -#endif /* GL_ARB_tessellation_shader */ - -/* ------------------------- GL_ARB_texture_barrier ------------------------ */ - -#ifndef GL_ARB_texture_barrier -#define GL_ARB_texture_barrier 1 - -typedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERPROC) (void); - -#define glTextureBarrier GLEW_GET_FUN(__glewTextureBarrier) - -#define GLEW_ARB_texture_barrier GLEW_GET_VAR(__GLEW_ARB_texture_barrier) - -#endif /* GL_ARB_texture_barrier */ - -/* ---------------------- GL_ARB_texture_border_clamp ---------------------- */ - -#ifndef GL_ARB_texture_border_clamp -#define GL_ARB_texture_border_clamp 1 - -#define GL_CLAMP_TO_BORDER_ARB 0x812D - -#define GLEW_ARB_texture_border_clamp GLEW_GET_VAR(__GLEW_ARB_texture_border_clamp) - -#endif /* GL_ARB_texture_border_clamp */ - -/* ---------------------- GL_ARB_texture_buffer_object --------------------- */ - -#ifndef GL_ARB_texture_buffer_object -#define GL_ARB_texture_buffer_object 1 - -#define GL_TEXTURE_BUFFER_ARB 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E - -typedef void (GLAPIENTRY * PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); - -#define glTexBufferARB GLEW_GET_FUN(__glewTexBufferARB) - -#define GLEW_ARB_texture_buffer_object GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object) - -#endif /* GL_ARB_texture_buffer_object */ - -/* ------------------- GL_ARB_texture_buffer_object_rgb32 ------------------ */ - -#ifndef GL_ARB_texture_buffer_object_rgb32 -#define GL_ARB_texture_buffer_object_rgb32 1 - -#define GLEW_ARB_texture_buffer_object_rgb32 GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object_rgb32) - -#endif /* GL_ARB_texture_buffer_object_rgb32 */ - -/* ---------------------- GL_ARB_texture_buffer_range ---------------------- */ - -#ifndef GL_ARB_texture_buffer_range -#define GL_ARB_texture_buffer_range 1 - -#define GL_TEXTURE_BUFFER_OFFSET 0x919D -#define GL_TEXTURE_BUFFER_SIZE 0x919E -#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F - -typedef void (GLAPIENTRY * PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); - -#define glTexBufferRange GLEW_GET_FUN(__glewTexBufferRange) -#define glTextureBufferRangeEXT GLEW_GET_FUN(__glewTextureBufferRangeEXT) - -#define GLEW_ARB_texture_buffer_range GLEW_GET_VAR(__GLEW_ARB_texture_buffer_range) - -#endif /* GL_ARB_texture_buffer_range */ - -/* ----------------------- GL_ARB_texture_compression ---------------------- */ - -#ifndef GL_ARB_texture_compression -#define GL_ARB_texture_compression 1 - -#define GL_COMPRESSED_ALPHA_ARB 0x84E9 -#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB -#define GL_COMPRESSED_INTENSITY_ARB 0x84EC -#define GL_COMPRESSED_RGB_ARB 0x84ED -#define GL_COMPRESSED_RGBA_ARB 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 -#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 - -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, void *img); - -#define glCompressedTexImage1DARB GLEW_GET_FUN(__glewCompressedTexImage1DARB) -#define glCompressedTexImage2DARB GLEW_GET_FUN(__glewCompressedTexImage2DARB) -#define glCompressedTexImage3DARB GLEW_GET_FUN(__glewCompressedTexImage3DARB) -#define glCompressedTexSubImage1DARB GLEW_GET_FUN(__glewCompressedTexSubImage1DARB) -#define glCompressedTexSubImage2DARB GLEW_GET_FUN(__glewCompressedTexSubImage2DARB) -#define glCompressedTexSubImage3DARB GLEW_GET_FUN(__glewCompressedTexSubImage3DARB) -#define glGetCompressedTexImageARB GLEW_GET_FUN(__glewGetCompressedTexImageARB) - -#define GLEW_ARB_texture_compression GLEW_GET_VAR(__GLEW_ARB_texture_compression) - -#endif /* GL_ARB_texture_compression */ - -/* -------------------- GL_ARB_texture_compression_bptc -------------------- */ - -#ifndef GL_ARB_texture_compression_bptc -#define GL_ARB_texture_compression_bptc 1 - -#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C -#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D -#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E -#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F - -#define GLEW_ARB_texture_compression_bptc GLEW_GET_VAR(__GLEW_ARB_texture_compression_bptc) - -#endif /* GL_ARB_texture_compression_bptc */ - -/* -------------------- GL_ARB_texture_compression_rgtc -------------------- */ - -#ifndef GL_ARB_texture_compression_rgtc -#define GL_ARB_texture_compression_rgtc 1 - -#define GL_COMPRESSED_RED_RGTC1 0x8DBB -#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC -#define GL_COMPRESSED_RG_RGTC2 0x8DBD -#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE - -#define GLEW_ARB_texture_compression_rgtc GLEW_GET_VAR(__GLEW_ARB_texture_compression_rgtc) - -#endif /* GL_ARB_texture_compression_rgtc */ - -/* ------------------------ GL_ARB_texture_cube_map ------------------------ */ - -#ifndef GL_ARB_texture_cube_map -#define GL_ARB_texture_cube_map 1 - -#define GL_NORMAL_MAP_ARB 0x8511 -#define GL_REFLECTION_MAP_ARB 0x8512 -#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C - -#define GLEW_ARB_texture_cube_map GLEW_GET_VAR(__GLEW_ARB_texture_cube_map) - -#endif /* GL_ARB_texture_cube_map */ - -/* --------------------- GL_ARB_texture_cube_map_array --------------------- */ - -#ifndef GL_ARB_texture_cube_map_array -#define GL_ARB_texture_cube_map_array 1 - -#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B -#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F - -#define GLEW_ARB_texture_cube_map_array GLEW_GET_VAR(__GLEW_ARB_texture_cube_map_array) - -#endif /* GL_ARB_texture_cube_map_array */ - -/* ------------------------- GL_ARB_texture_env_add ------------------------ */ - -#ifndef GL_ARB_texture_env_add -#define GL_ARB_texture_env_add 1 - -#define GLEW_ARB_texture_env_add GLEW_GET_VAR(__GLEW_ARB_texture_env_add) - -#endif /* GL_ARB_texture_env_add */ - -/* ----------------------- GL_ARB_texture_env_combine ---------------------- */ - -#ifndef GL_ARB_texture_env_combine -#define GL_ARB_texture_env_combine 1 - -#define GL_SUBTRACT_ARB 0x84E7 -#define GL_COMBINE_ARB 0x8570 -#define GL_COMBINE_RGB_ARB 0x8571 -#define GL_COMBINE_ALPHA_ARB 0x8572 -#define GL_RGB_SCALE_ARB 0x8573 -#define GL_ADD_SIGNED_ARB 0x8574 -#define GL_INTERPOLATE_ARB 0x8575 -#define GL_CONSTANT_ARB 0x8576 -#define GL_PRIMARY_COLOR_ARB 0x8577 -#define GL_PREVIOUS_ARB 0x8578 -#define GL_SOURCE0_RGB_ARB 0x8580 -#define GL_SOURCE1_RGB_ARB 0x8581 -#define GL_SOURCE2_RGB_ARB 0x8582 -#define GL_SOURCE0_ALPHA_ARB 0x8588 -#define GL_SOURCE1_ALPHA_ARB 0x8589 -#define GL_SOURCE2_ALPHA_ARB 0x858A -#define GL_OPERAND0_RGB_ARB 0x8590 -#define GL_OPERAND1_RGB_ARB 0x8591 -#define GL_OPERAND2_RGB_ARB 0x8592 -#define GL_OPERAND0_ALPHA_ARB 0x8598 -#define GL_OPERAND1_ALPHA_ARB 0x8599 -#define GL_OPERAND2_ALPHA_ARB 0x859A - -#define GLEW_ARB_texture_env_combine GLEW_GET_VAR(__GLEW_ARB_texture_env_combine) - -#endif /* GL_ARB_texture_env_combine */ - -/* ---------------------- GL_ARB_texture_env_crossbar ---------------------- */ - -#ifndef GL_ARB_texture_env_crossbar -#define GL_ARB_texture_env_crossbar 1 - -#define GLEW_ARB_texture_env_crossbar GLEW_GET_VAR(__GLEW_ARB_texture_env_crossbar) - -#endif /* GL_ARB_texture_env_crossbar */ - -/* ------------------------ GL_ARB_texture_env_dot3 ------------------------ */ - -#ifndef GL_ARB_texture_env_dot3 -#define GL_ARB_texture_env_dot3 1 - -#define GL_DOT3_RGB_ARB 0x86AE -#define GL_DOT3_RGBA_ARB 0x86AF - -#define GLEW_ARB_texture_env_dot3 GLEW_GET_VAR(__GLEW_ARB_texture_env_dot3) - -#endif /* GL_ARB_texture_env_dot3 */ - -/* ------------------- GL_ARB_texture_filter_anisotropic ------------------- */ - -#ifndef GL_ARB_texture_filter_anisotropic -#define GL_ARB_texture_filter_anisotropic 1 - -#define GL_TEXTURE_MAX_ANISOTROPY 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF - -#define GLEW_ARB_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_ARB_texture_filter_anisotropic) - -#endif /* GL_ARB_texture_filter_anisotropic */ - -/* ---------------------- GL_ARB_texture_filter_minmax --------------------- */ - -#ifndef GL_ARB_texture_filter_minmax -#define GL_ARB_texture_filter_minmax 1 - -#define GL_TEXTURE_REDUCTION_MODE_ARB 0x9366 -#define GL_WEIGHTED_AVERAGE_ARB 0x9367 - -#define GLEW_ARB_texture_filter_minmax GLEW_GET_VAR(__GLEW_ARB_texture_filter_minmax) - -#endif /* GL_ARB_texture_filter_minmax */ - -/* -------------------------- GL_ARB_texture_float ------------------------- */ - -#ifndef GL_ARB_texture_float -#define GL_ARB_texture_float 1 - -#define GL_RGBA32F_ARB 0x8814 -#define GL_RGB32F_ARB 0x8815 -#define GL_ALPHA32F_ARB 0x8816 -#define GL_INTENSITY32F_ARB 0x8817 -#define GL_LUMINANCE32F_ARB 0x8818 -#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 -#define GL_RGBA16F_ARB 0x881A -#define GL_RGB16F_ARB 0x881B -#define GL_ALPHA16F_ARB 0x881C -#define GL_INTENSITY16F_ARB 0x881D -#define GL_LUMINANCE16F_ARB 0x881E -#define GL_LUMINANCE_ALPHA16F_ARB 0x881F -#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 -#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 -#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 -#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 -#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 -#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 -#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 - -#define GLEW_ARB_texture_float GLEW_GET_VAR(__GLEW_ARB_texture_float) - -#endif /* GL_ARB_texture_float */ - -/* ------------------------- GL_ARB_texture_gather ------------------------- */ - -#ifndef GL_ARB_texture_gather -#define GL_ARB_texture_gather 1 - -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F -#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F - -#define GLEW_ARB_texture_gather GLEW_GET_VAR(__GLEW_ARB_texture_gather) - -#endif /* GL_ARB_texture_gather */ - -/* ------------------ GL_ARB_texture_mirror_clamp_to_edge ------------------ */ - -#ifndef GL_ARB_texture_mirror_clamp_to_edge -#define GL_ARB_texture_mirror_clamp_to_edge 1 - -#define GL_MIRROR_CLAMP_TO_EDGE 0x8743 - -#define GLEW_ARB_texture_mirror_clamp_to_edge GLEW_GET_VAR(__GLEW_ARB_texture_mirror_clamp_to_edge) - -#endif /* GL_ARB_texture_mirror_clamp_to_edge */ - -/* --------------------- GL_ARB_texture_mirrored_repeat -------------------- */ - -#ifndef GL_ARB_texture_mirrored_repeat -#define GL_ARB_texture_mirrored_repeat 1 - -#define GL_MIRRORED_REPEAT_ARB 0x8370 - -#define GLEW_ARB_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_ARB_texture_mirrored_repeat) - -#endif /* GL_ARB_texture_mirrored_repeat */ - -/* ----------------------- GL_ARB_texture_multisample ---------------------- */ - -#ifndef GL_ARB_texture_multisample -#define GL_ARB_texture_multisample 1 - -#define GL_SAMPLE_POSITION 0x8E50 -#define GL_SAMPLE_MASK 0x8E51 -#define GL_SAMPLE_MASK_VALUE 0x8E52 -#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 -#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 -#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 -#define GL_TEXTURE_SAMPLES 0x9106 -#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 -#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 -#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A -#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B -#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D -#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E -#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F -#define GL_MAX_INTEGER_SAMPLES 0x9110 - -typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat* val); -typedef void (GLAPIENTRY * PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask); -typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); - -#define glGetMultisamplefv GLEW_GET_FUN(__glewGetMultisamplefv) -#define glSampleMaski GLEW_GET_FUN(__glewSampleMaski) -#define glTexImage2DMultisample GLEW_GET_FUN(__glewTexImage2DMultisample) -#define glTexImage3DMultisample GLEW_GET_FUN(__glewTexImage3DMultisample) - -#define GLEW_ARB_texture_multisample GLEW_GET_VAR(__GLEW_ARB_texture_multisample) - -#endif /* GL_ARB_texture_multisample */ - -/* -------------------- GL_ARB_texture_non_power_of_two -------------------- */ - -#ifndef GL_ARB_texture_non_power_of_two -#define GL_ARB_texture_non_power_of_two 1 - -#define GLEW_ARB_texture_non_power_of_two GLEW_GET_VAR(__GLEW_ARB_texture_non_power_of_two) - -#endif /* GL_ARB_texture_non_power_of_two */ - -/* ---------------------- GL_ARB_texture_query_levels ---------------------- */ - -#ifndef GL_ARB_texture_query_levels -#define GL_ARB_texture_query_levels 1 - -#define GLEW_ARB_texture_query_levels GLEW_GET_VAR(__GLEW_ARB_texture_query_levels) - -#endif /* GL_ARB_texture_query_levels */ - -/* ------------------------ GL_ARB_texture_query_lod ----------------------- */ - -#ifndef GL_ARB_texture_query_lod -#define GL_ARB_texture_query_lod 1 - -#define GLEW_ARB_texture_query_lod GLEW_GET_VAR(__GLEW_ARB_texture_query_lod) - -#endif /* GL_ARB_texture_query_lod */ - -/* ------------------------ GL_ARB_texture_rectangle ----------------------- */ - -#ifndef GL_ARB_texture_rectangle -#define GL_ARB_texture_rectangle 1 - -#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 -#define GL_SAMPLER_2D_RECT_ARB 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 - -#define GLEW_ARB_texture_rectangle GLEW_GET_VAR(__GLEW_ARB_texture_rectangle) - -#endif /* GL_ARB_texture_rectangle */ - -/* --------------------------- GL_ARB_texture_rg --------------------------- */ - -#ifndef GL_ARB_texture_rg -#define GL_ARB_texture_rg 1 - -#define GL_COMPRESSED_RED 0x8225 -#define GL_COMPRESSED_RG 0x8226 -#define GL_RG 0x8227 -#define GL_RG_INTEGER 0x8228 -#define GL_R8 0x8229 -#define GL_R16 0x822A -#define GL_RG8 0x822B -#define GL_RG16 0x822C -#define GL_R16F 0x822D -#define GL_R32F 0x822E -#define GL_RG16F 0x822F -#define GL_RG32F 0x8230 -#define GL_R8I 0x8231 -#define GL_R8UI 0x8232 -#define GL_R16I 0x8233 -#define GL_R16UI 0x8234 -#define GL_R32I 0x8235 -#define GL_R32UI 0x8236 -#define GL_RG8I 0x8237 -#define GL_RG8UI 0x8238 -#define GL_RG16I 0x8239 -#define GL_RG16UI 0x823A -#define GL_RG32I 0x823B -#define GL_RG32UI 0x823C - -#define GLEW_ARB_texture_rg GLEW_GET_VAR(__GLEW_ARB_texture_rg) - -#endif /* GL_ARB_texture_rg */ - -/* ----------------------- GL_ARB_texture_rgb10_a2ui ----------------------- */ - -#ifndef GL_ARB_texture_rgb10_a2ui -#define GL_ARB_texture_rgb10_a2ui 1 - -#define GL_RGB10_A2UI 0x906F - -#define GLEW_ARB_texture_rgb10_a2ui GLEW_GET_VAR(__GLEW_ARB_texture_rgb10_a2ui) - -#endif /* GL_ARB_texture_rgb10_a2ui */ - -/* ------------------------ GL_ARB_texture_stencil8 ------------------------ */ - -#ifndef GL_ARB_texture_stencil8 -#define GL_ARB_texture_stencil8 1 - -#define GL_STENCIL_INDEX 0x1901 -#define GL_STENCIL_INDEX8 0x8D48 - -#define GLEW_ARB_texture_stencil8 GLEW_GET_VAR(__GLEW_ARB_texture_stencil8) - -#endif /* GL_ARB_texture_stencil8 */ - -/* ------------------------- GL_ARB_texture_storage ------------------------ */ - -#ifndef GL_ARB_texture_storage -#define GL_ARB_texture_storage 1 - -#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F - -typedef void (GLAPIENTRY * PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); - -#define glTexStorage1D GLEW_GET_FUN(__glewTexStorage1D) -#define glTexStorage2D GLEW_GET_FUN(__glewTexStorage2D) -#define glTexStorage3D GLEW_GET_FUN(__glewTexStorage3D) - -#define GLEW_ARB_texture_storage GLEW_GET_VAR(__GLEW_ARB_texture_storage) - -#endif /* GL_ARB_texture_storage */ - -/* ------------------- GL_ARB_texture_storage_multisample ------------------ */ - -#ifndef GL_ARB_texture_storage_multisample -#define GL_ARB_texture_storage_multisample 1 - -typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); - -#define glTexStorage2DMultisample GLEW_GET_FUN(__glewTexStorage2DMultisample) -#define glTexStorage3DMultisample GLEW_GET_FUN(__glewTexStorage3DMultisample) -#define glTextureStorage2DMultisampleEXT GLEW_GET_FUN(__glewTextureStorage2DMultisampleEXT) -#define glTextureStorage3DMultisampleEXT GLEW_GET_FUN(__glewTextureStorage3DMultisampleEXT) - -#define GLEW_ARB_texture_storage_multisample GLEW_GET_VAR(__GLEW_ARB_texture_storage_multisample) - -#endif /* GL_ARB_texture_storage_multisample */ - -/* ------------------------- GL_ARB_texture_swizzle ------------------------ */ - -#ifndef GL_ARB_texture_swizzle -#define GL_ARB_texture_swizzle 1 - -#define GL_TEXTURE_SWIZZLE_R 0x8E42 -#define GL_TEXTURE_SWIZZLE_G 0x8E43 -#define GL_TEXTURE_SWIZZLE_B 0x8E44 -#define GL_TEXTURE_SWIZZLE_A 0x8E45 -#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 - -#define GLEW_ARB_texture_swizzle GLEW_GET_VAR(__GLEW_ARB_texture_swizzle) - -#endif /* GL_ARB_texture_swizzle */ - -/* -------------------------- GL_ARB_texture_view -------------------------- */ - -#ifndef GL_ARB_texture_view -#define GL_ARB_texture_view 1 - -#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB -#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC -#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD -#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE -#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF - -typedef void (GLAPIENTRY * PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); - -#define glTextureView GLEW_GET_FUN(__glewTextureView) - -#define GLEW_ARB_texture_view GLEW_GET_VAR(__GLEW_ARB_texture_view) - -#endif /* GL_ARB_texture_view */ - -/* --------------------------- GL_ARB_timer_query -------------------------- */ - -#ifndef GL_ARB_timer_query -#define GL_ARB_timer_query 1 - -#define GL_TIME_ELAPSED 0x88BF -#define GL_TIMESTAMP 0x8E28 - -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64* params); -typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); - -#define glGetQueryObjecti64v GLEW_GET_FUN(__glewGetQueryObjecti64v) -#define glGetQueryObjectui64v GLEW_GET_FUN(__glewGetQueryObjectui64v) -#define glQueryCounter GLEW_GET_FUN(__glewQueryCounter) - -#define GLEW_ARB_timer_query GLEW_GET_VAR(__GLEW_ARB_timer_query) - -#endif /* GL_ARB_timer_query */ - -/* ----------------------- GL_ARB_transform_feedback2 ---------------------- */ - -#ifndef GL_ARB_transform_feedback2 -#define GL_ARB_transform_feedback2 1 - -#define GL_TRANSFORM_FEEDBACK 0x8E22 -#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 -#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 -#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 - -typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); -typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids); -typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); -typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); - -#define glBindTransformFeedback GLEW_GET_FUN(__glewBindTransformFeedback) -#define glDeleteTransformFeedbacks GLEW_GET_FUN(__glewDeleteTransformFeedbacks) -#define glDrawTransformFeedback GLEW_GET_FUN(__glewDrawTransformFeedback) -#define glGenTransformFeedbacks GLEW_GET_FUN(__glewGenTransformFeedbacks) -#define glIsTransformFeedback GLEW_GET_FUN(__glewIsTransformFeedback) -#define glPauseTransformFeedback GLEW_GET_FUN(__glewPauseTransformFeedback) -#define glResumeTransformFeedback GLEW_GET_FUN(__glewResumeTransformFeedback) - -#define GLEW_ARB_transform_feedback2 GLEW_GET_VAR(__GLEW_ARB_transform_feedback2) - -#endif /* GL_ARB_transform_feedback2 */ - -/* ----------------------- GL_ARB_transform_feedback3 ---------------------- */ - -#ifndef GL_ARB_transform_feedback3 -#define GL_ARB_transform_feedback3 1 - -#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 -#define GL_MAX_VERTEX_STREAMS 0x8E71 - -typedef void (GLAPIENTRY * PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); -typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); -typedef void (GLAPIENTRY * PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); -typedef void (GLAPIENTRY * PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); - -#define glBeginQueryIndexed GLEW_GET_FUN(__glewBeginQueryIndexed) -#define glDrawTransformFeedbackStream GLEW_GET_FUN(__glewDrawTransformFeedbackStream) -#define glEndQueryIndexed GLEW_GET_FUN(__glewEndQueryIndexed) -#define glGetQueryIndexediv GLEW_GET_FUN(__glewGetQueryIndexediv) - -#define GLEW_ARB_transform_feedback3 GLEW_GET_VAR(__GLEW_ARB_transform_feedback3) - -#endif /* GL_ARB_transform_feedback3 */ - -/* ------------------ GL_ARB_transform_feedback_instanced ------------------ */ - -#ifndef GL_ARB_transform_feedback_instanced -#define GL_ARB_transform_feedback_instanced 1 - -typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei primcount); - -#define glDrawTransformFeedbackInstanced GLEW_GET_FUN(__glewDrawTransformFeedbackInstanced) -#define glDrawTransformFeedbackStreamInstanced GLEW_GET_FUN(__glewDrawTransformFeedbackStreamInstanced) - -#define GLEW_ARB_transform_feedback_instanced GLEW_GET_VAR(__GLEW_ARB_transform_feedback_instanced) - -#endif /* GL_ARB_transform_feedback_instanced */ - -/* ---------------- GL_ARB_transform_feedback_overflow_query --------------- */ - -#ifndef GL_ARB_transform_feedback_overflow_query -#define GL_ARB_transform_feedback_overflow_query 1 - -#define GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB 0x82EC -#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB 0x82ED - -#define GLEW_ARB_transform_feedback_overflow_query GLEW_GET_VAR(__GLEW_ARB_transform_feedback_overflow_query) - -#endif /* GL_ARB_transform_feedback_overflow_query */ - -/* ------------------------ GL_ARB_transpose_matrix ------------------------ */ - -#ifndef GL_ARB_transpose_matrix -#define GL_ARB_transpose_matrix 1 - -#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 - -typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); -typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); -typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); -typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); - -#define glLoadTransposeMatrixdARB GLEW_GET_FUN(__glewLoadTransposeMatrixdARB) -#define glLoadTransposeMatrixfARB GLEW_GET_FUN(__glewLoadTransposeMatrixfARB) -#define glMultTransposeMatrixdARB GLEW_GET_FUN(__glewMultTransposeMatrixdARB) -#define glMultTransposeMatrixfARB GLEW_GET_FUN(__glewMultTransposeMatrixfARB) - -#define GLEW_ARB_transpose_matrix GLEW_GET_VAR(__GLEW_ARB_transpose_matrix) - -#endif /* GL_ARB_transpose_matrix */ - -/* ---------------------- GL_ARB_uniform_buffer_object --------------------- */ - -#ifndef GL_ARB_uniform_buffer_object -#define GL_ARB_uniform_buffer_object 1 - -#define GL_UNIFORM_BUFFER 0x8A11 -#define GL_UNIFORM_BUFFER_BINDING 0x8A28 -#define GL_UNIFORM_BUFFER_START 0x8A29 -#define GL_UNIFORM_BUFFER_SIZE 0x8A2A -#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B -#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C -#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D -#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E -#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F -#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 -#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 -#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 -#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 -#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 -#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 -#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 -#define GL_UNIFORM_TYPE 0x8A37 -#define GL_UNIFORM_SIZE 0x8A38 -#define GL_UNIFORM_NAME_LENGTH 0x8A39 -#define GL_UNIFORM_BLOCK_INDEX 0x8A3A -#define GL_UNIFORM_OFFSET 0x8A3B -#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C -#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D -#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E -#define GL_UNIFORM_BLOCK_BINDING 0x8A3F -#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 -#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 -#define GL_INVALID_INDEX 0xFFFFFFFFu - -typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName); -typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformName); -typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint* data); -typedef GLuint (GLAPIENTRY * PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar* uniformBlockName); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar* const * uniformNames, GLuint* uniformIndices); -typedef void (GLAPIENTRY * PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); - -#define glBindBufferBase GLEW_GET_FUN(__glewBindBufferBase) -#define glBindBufferRange GLEW_GET_FUN(__glewBindBufferRange) -#define glGetActiveUniformBlockName GLEW_GET_FUN(__glewGetActiveUniformBlockName) -#define glGetActiveUniformBlockiv GLEW_GET_FUN(__glewGetActiveUniformBlockiv) -#define glGetActiveUniformName GLEW_GET_FUN(__glewGetActiveUniformName) -#define glGetActiveUniformsiv GLEW_GET_FUN(__glewGetActiveUniformsiv) -#define glGetIntegeri_v GLEW_GET_FUN(__glewGetIntegeri_v) -#define glGetUniformBlockIndex GLEW_GET_FUN(__glewGetUniformBlockIndex) -#define glGetUniformIndices GLEW_GET_FUN(__glewGetUniformIndices) -#define glUniformBlockBinding GLEW_GET_FUN(__glewUniformBlockBinding) - -#define GLEW_ARB_uniform_buffer_object GLEW_GET_VAR(__GLEW_ARB_uniform_buffer_object) - -#endif /* GL_ARB_uniform_buffer_object */ - -/* ------------------------ GL_ARB_vertex_array_bgra ----------------------- */ - -#ifndef GL_ARB_vertex_array_bgra -#define GL_ARB_vertex_array_bgra 1 - -#define GL_BGRA 0x80E1 - -#define GLEW_ARB_vertex_array_bgra GLEW_GET_VAR(__GLEW_ARB_vertex_array_bgra) - -#endif /* GL_ARB_vertex_array_bgra */ - -/* ----------------------- GL_ARB_vertex_array_object ---------------------- */ - -#ifndef GL_ARB_vertex_array_object -#define GL_ARB_vertex_array_object 1 - -#define GL_VERTEX_ARRAY_BINDING 0x85B5 - -typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYPROC) (GLuint array); -typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint* arrays); -typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays); -typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYPROC) (GLuint array); - -#define glBindVertexArray GLEW_GET_FUN(__glewBindVertexArray) -#define glDeleteVertexArrays GLEW_GET_FUN(__glewDeleteVertexArrays) -#define glGenVertexArrays GLEW_GET_FUN(__glewGenVertexArrays) -#define glIsVertexArray GLEW_GET_FUN(__glewIsVertexArray) - -#define GLEW_ARB_vertex_array_object GLEW_GET_VAR(__GLEW_ARB_vertex_array_object) - -#endif /* GL_ARB_vertex_array_object */ - -/* ----------------------- GL_ARB_vertex_attrib_64bit ---------------------- */ - -#ifndef GL_ARB_vertex_attrib_64bit -#define GL_ARB_vertex_attrib_64bit 1 - -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer); - -#define glGetVertexAttribLdv GLEW_GET_FUN(__glewGetVertexAttribLdv) -#define glVertexAttribL1d GLEW_GET_FUN(__glewVertexAttribL1d) -#define glVertexAttribL1dv GLEW_GET_FUN(__glewVertexAttribL1dv) -#define glVertexAttribL2d GLEW_GET_FUN(__glewVertexAttribL2d) -#define glVertexAttribL2dv GLEW_GET_FUN(__glewVertexAttribL2dv) -#define glVertexAttribL3d GLEW_GET_FUN(__glewVertexAttribL3d) -#define glVertexAttribL3dv GLEW_GET_FUN(__glewVertexAttribL3dv) -#define glVertexAttribL4d GLEW_GET_FUN(__glewVertexAttribL4d) -#define glVertexAttribL4dv GLEW_GET_FUN(__glewVertexAttribL4dv) -#define glVertexAttribLPointer GLEW_GET_FUN(__glewVertexAttribLPointer) - -#define GLEW_ARB_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_64bit) - -#endif /* GL_ARB_vertex_attrib_64bit */ - -/* ---------------------- GL_ARB_vertex_attrib_binding --------------------- */ - -#ifndef GL_ARB_vertex_attrib_binding -#define GL_ARB_vertex_attrib_binding 1 - -#define GL_VERTEX_ATTRIB_BINDING 0x82D4 -#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 -#define GL_VERTEX_BINDING_DIVISOR 0x82D6 -#define GL_VERTEX_BINDING_OFFSET 0x82D7 -#define GL_VERTEX_BINDING_STRIDE 0x82D8 -#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 -#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA -#define GL_VERTEX_BINDING_BUFFER 0x8F4F - -typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); - -#define glBindVertexBuffer GLEW_GET_FUN(__glewBindVertexBuffer) -#define glVertexArrayBindVertexBufferEXT GLEW_GET_FUN(__glewVertexArrayBindVertexBufferEXT) -#define glVertexArrayVertexAttribBindingEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribBindingEXT) -#define glVertexArrayVertexAttribFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribFormatEXT) -#define glVertexArrayVertexAttribIFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIFormatEXT) -#define glVertexArrayVertexAttribLFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLFormatEXT) -#define glVertexArrayVertexBindingDivisorEXT GLEW_GET_FUN(__glewVertexArrayVertexBindingDivisorEXT) -#define glVertexAttribBinding GLEW_GET_FUN(__glewVertexAttribBinding) -#define glVertexAttribFormat GLEW_GET_FUN(__glewVertexAttribFormat) -#define glVertexAttribIFormat GLEW_GET_FUN(__glewVertexAttribIFormat) -#define glVertexAttribLFormat GLEW_GET_FUN(__glewVertexAttribLFormat) -#define glVertexBindingDivisor GLEW_GET_FUN(__glewVertexBindingDivisor) - -#define GLEW_ARB_vertex_attrib_binding GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_binding) - -#endif /* GL_ARB_vertex_attrib_binding */ - -/* -------------------------- GL_ARB_vertex_blend -------------------------- */ - -#ifndef GL_ARB_vertex_blend -#define GL_ARB_vertex_blend 1 - -#define GL_MODELVIEW0_ARB 0x1700 -#define GL_MODELVIEW1_ARB 0x850A -#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 -#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 -#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 -#define GL_VERTEX_BLEND_ARB 0x86A7 -#define GL_CURRENT_WEIGHT_ARB 0x86A8 -#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 -#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA -#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB -#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC -#define GL_WEIGHT_ARRAY_ARB 0x86AD -#define GL_MODELVIEW2_ARB 0x8722 -#define GL_MODELVIEW3_ARB 0x8723 -#define GL_MODELVIEW4_ARB 0x8724 -#define GL_MODELVIEW5_ARB 0x8725 -#define GL_MODELVIEW6_ARB 0x8726 -#define GL_MODELVIEW7_ARB 0x8727 -#define GL_MODELVIEW8_ARB 0x8728 -#define GL_MODELVIEW9_ARB 0x8729 -#define GL_MODELVIEW10_ARB 0x872A -#define GL_MODELVIEW11_ARB 0x872B -#define GL_MODELVIEW12_ARB 0x872C -#define GL_MODELVIEW13_ARB 0x872D -#define GL_MODELVIEW14_ARB 0x872E -#define GL_MODELVIEW15_ARB 0x872F -#define GL_MODELVIEW16_ARB 0x8730 -#define GL_MODELVIEW17_ARB 0x8731 -#define GL_MODELVIEW18_ARB 0x8732 -#define GL_MODELVIEW19_ARB 0x8733 -#define GL_MODELVIEW20_ARB 0x8734 -#define GL_MODELVIEW21_ARB 0x8735 -#define GL_MODELVIEW22_ARB 0x8736 -#define GL_MODELVIEW23_ARB 0x8737 -#define GL_MODELVIEW24_ARB 0x8738 -#define GL_MODELVIEW25_ARB 0x8739 -#define GL_MODELVIEW26_ARB 0x873A -#define GL_MODELVIEW27_ARB 0x873B -#define GL_MODELVIEW28_ARB 0x873C -#define GL_MODELVIEW29_ARB 0x873D -#define GL_MODELVIEW30_ARB 0x873E -#define GL_MODELVIEW31_ARB 0x873F - -typedef void (GLAPIENTRY * PFNGLVERTEXBLENDARBPROC) (GLint count); -typedef void (GLAPIENTRY * PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); -typedef void (GLAPIENTRY * PFNGLWEIGHTBVARBPROC) (GLint size, GLbyte *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTDVARBPROC) (GLint size, GLdouble *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTFVARBPROC) (GLint size, GLfloat *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTIVARBPROC) (GLint size, GLint *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTSVARBPROC) (GLint size, GLshort *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTUBVARBPROC) (GLint size, GLubyte *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTUIVARBPROC) (GLint size, GLuint *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTUSVARBPROC) (GLint size, GLushort *weights); - -#define glVertexBlendARB GLEW_GET_FUN(__glewVertexBlendARB) -#define glWeightPointerARB GLEW_GET_FUN(__glewWeightPointerARB) -#define glWeightbvARB GLEW_GET_FUN(__glewWeightbvARB) -#define glWeightdvARB GLEW_GET_FUN(__glewWeightdvARB) -#define glWeightfvARB GLEW_GET_FUN(__glewWeightfvARB) -#define glWeightivARB GLEW_GET_FUN(__glewWeightivARB) -#define glWeightsvARB GLEW_GET_FUN(__glewWeightsvARB) -#define glWeightubvARB GLEW_GET_FUN(__glewWeightubvARB) -#define glWeightuivARB GLEW_GET_FUN(__glewWeightuivARB) -#define glWeightusvARB GLEW_GET_FUN(__glewWeightusvARB) - -#define GLEW_ARB_vertex_blend GLEW_GET_VAR(__GLEW_ARB_vertex_blend) - -#endif /* GL_ARB_vertex_blend */ - -/* ---------------------- GL_ARB_vertex_buffer_object ---------------------- */ - -#ifndef GL_ARB_vertex_buffer_object -#define GL_ARB_vertex_buffer_object 1 - -#define GL_BUFFER_SIZE_ARB 0x8764 -#define GL_BUFFER_USAGE_ARB 0x8765 -#define GL_ARRAY_BUFFER_ARB 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 -#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F -#define GL_READ_ONLY_ARB 0x88B8 -#define GL_WRITE_ONLY_ARB 0x88B9 -#define GL_READ_WRITE_ARB 0x88BA -#define GL_BUFFER_ACCESS_ARB 0x88BB -#define GL_BUFFER_MAPPED_ARB 0x88BC -#define GL_BUFFER_MAP_POINTER_ARB 0x88BD -#define GL_STREAM_DRAW_ARB 0x88E0 -#define GL_STREAM_READ_ARB 0x88E1 -#define GL_STREAM_COPY_ARB 0x88E2 -#define GL_STATIC_DRAW_ARB 0x88E4 -#define GL_STATIC_READ_ARB 0x88E5 -#define GL_STATIC_COPY_ARB 0x88E6 -#define GL_DYNAMIC_DRAW_ARB 0x88E8 -#define GL_DYNAMIC_READ_ARB 0x88E9 -#define GL_DYNAMIC_COPY_ARB 0x88EA - -typedef ptrdiff_t GLintptrARB; -typedef ptrdiff_t GLsizeiptrARB; - -typedef void (GLAPIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); -typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); -typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint* buffers); -typedef void (GLAPIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint* buffers); -typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, void** params); -typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); -typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERARBPROC) (GLuint buffer); -typedef void * (GLAPIENTRY * PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); -typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERARBPROC) (GLenum target); - -#define glBindBufferARB GLEW_GET_FUN(__glewBindBufferARB) -#define glBufferDataARB GLEW_GET_FUN(__glewBufferDataARB) -#define glBufferSubDataARB GLEW_GET_FUN(__glewBufferSubDataARB) -#define glDeleteBuffersARB GLEW_GET_FUN(__glewDeleteBuffersARB) -#define glGenBuffersARB GLEW_GET_FUN(__glewGenBuffersARB) -#define glGetBufferParameterivARB GLEW_GET_FUN(__glewGetBufferParameterivARB) -#define glGetBufferPointervARB GLEW_GET_FUN(__glewGetBufferPointervARB) -#define glGetBufferSubDataARB GLEW_GET_FUN(__glewGetBufferSubDataARB) -#define glIsBufferARB GLEW_GET_FUN(__glewIsBufferARB) -#define glMapBufferARB GLEW_GET_FUN(__glewMapBufferARB) -#define glUnmapBufferARB GLEW_GET_FUN(__glewUnmapBufferARB) - -#define GLEW_ARB_vertex_buffer_object GLEW_GET_VAR(__GLEW_ARB_vertex_buffer_object) - -#endif /* GL_ARB_vertex_buffer_object */ - -/* ------------------------- GL_ARB_vertex_program ------------------------- */ - -#ifndef GL_ARB_vertex_program -#define GL_ARB_vertex_program 1 - -#define GL_COLOR_SUM_ARB 0x8458 -#define GL_VERTEX_PROGRAM_ARB 0x8620 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 -#define GL_PROGRAM_LENGTH_ARB 0x8627 -#define GL_PROGRAM_STRING_ARB 0x8628 -#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E -#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F -#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 -#define GL_CURRENT_MATRIX_ARB 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 -#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B -#define GL_PROGRAM_BINDING_ARB 0x8677 -#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A -#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 -#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 -#define GL_PROGRAM_FORMAT_ARB 0x8876 -#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 -#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 -#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 -#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 -#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 -#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 -#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 -#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 -#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 -#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 -#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA -#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB -#define GL_PROGRAM_ATTRIBS_ARB 0x88AC -#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD -#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE -#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF -#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 -#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 -#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 -#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 -#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 -#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 -#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 -#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 -#define GL_MATRIX0_ARB 0x88C0 -#define GL_MATRIX1_ARB 0x88C1 -#define GL_MATRIX2_ARB 0x88C2 -#define GL_MATRIX3_ARB 0x88C3 -#define GL_MATRIX4_ARB 0x88C4 -#define GL_MATRIX5_ARB 0x88C5 -#define GL_MATRIX6_ARB 0x88C6 -#define GL_MATRIX7_ARB 0x88C7 -#define GL_MATRIX8_ARB 0x88C8 -#define GL_MATRIX9_ARB 0x88C9 -#define GL_MATRIX10_ARB 0x88CA -#define GL_MATRIX11_ARB 0x88CB -#define GL_MATRIX12_ARB 0x88CC -#define GL_MATRIX13_ARB 0x88CD -#define GL_MATRIX14_ARB 0x88CE -#define GL_MATRIX15_ARB 0x88CF -#define GL_MATRIX16_ARB 0x88D0 -#define GL_MATRIX17_ARB 0x88D1 -#define GL_MATRIX18_ARB 0x88D2 -#define GL_MATRIX19_ARB 0x88D3 -#define GL_MATRIX20_ARB 0x88D4 -#define GL_MATRIX21_ARB 0x88D5 -#define GL_MATRIX22_ARB 0x88D6 -#define GL_MATRIX23_ARB 0x88D7 -#define GL_MATRIX24_ARB 0x88D8 -#define GL_MATRIX25_ARB 0x88D9 -#define GL_MATRIX26_ARB 0x88DA -#define GL_MATRIX27_ARB 0x88DB -#define GL_MATRIX28_ARB 0x88DC -#define GL_MATRIX29_ARB 0x88DD -#define GL_MATRIX30_ARB 0x88DE -#define GL_MATRIX31_ARB 0x88DF - -typedef void (GLAPIENTRY * PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); -typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint* programs); -typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (GLAPIENTRY * PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint* programs); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void *string); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, void** pointer); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMARBPROC) (GLuint program); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void *string); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); - -#define glBindProgramARB GLEW_GET_FUN(__glewBindProgramARB) -#define glDeleteProgramsARB GLEW_GET_FUN(__glewDeleteProgramsARB) -#define glDisableVertexAttribArrayARB GLEW_GET_FUN(__glewDisableVertexAttribArrayARB) -#define glEnableVertexAttribArrayARB GLEW_GET_FUN(__glewEnableVertexAttribArrayARB) -#define glGenProgramsARB GLEW_GET_FUN(__glewGenProgramsARB) -#define glGetProgramEnvParameterdvARB GLEW_GET_FUN(__glewGetProgramEnvParameterdvARB) -#define glGetProgramEnvParameterfvARB GLEW_GET_FUN(__glewGetProgramEnvParameterfvARB) -#define glGetProgramLocalParameterdvARB GLEW_GET_FUN(__glewGetProgramLocalParameterdvARB) -#define glGetProgramLocalParameterfvARB GLEW_GET_FUN(__glewGetProgramLocalParameterfvARB) -#define glGetProgramStringARB GLEW_GET_FUN(__glewGetProgramStringARB) -#define glGetProgramivARB GLEW_GET_FUN(__glewGetProgramivARB) -#define glGetVertexAttribPointervARB GLEW_GET_FUN(__glewGetVertexAttribPointervARB) -#define glGetVertexAttribdvARB GLEW_GET_FUN(__glewGetVertexAttribdvARB) -#define glGetVertexAttribfvARB GLEW_GET_FUN(__glewGetVertexAttribfvARB) -#define glGetVertexAttribivARB GLEW_GET_FUN(__glewGetVertexAttribivARB) -#define glIsProgramARB GLEW_GET_FUN(__glewIsProgramARB) -#define glProgramEnvParameter4dARB GLEW_GET_FUN(__glewProgramEnvParameter4dARB) -#define glProgramEnvParameter4dvARB GLEW_GET_FUN(__glewProgramEnvParameter4dvARB) -#define glProgramEnvParameter4fARB GLEW_GET_FUN(__glewProgramEnvParameter4fARB) -#define glProgramEnvParameter4fvARB GLEW_GET_FUN(__glewProgramEnvParameter4fvARB) -#define glProgramLocalParameter4dARB GLEW_GET_FUN(__glewProgramLocalParameter4dARB) -#define glProgramLocalParameter4dvARB GLEW_GET_FUN(__glewProgramLocalParameter4dvARB) -#define glProgramLocalParameter4fARB GLEW_GET_FUN(__glewProgramLocalParameter4fARB) -#define glProgramLocalParameter4fvARB GLEW_GET_FUN(__glewProgramLocalParameter4fvARB) -#define glProgramStringARB GLEW_GET_FUN(__glewProgramStringARB) -#define glVertexAttrib1dARB GLEW_GET_FUN(__glewVertexAttrib1dARB) -#define glVertexAttrib1dvARB GLEW_GET_FUN(__glewVertexAttrib1dvARB) -#define glVertexAttrib1fARB GLEW_GET_FUN(__glewVertexAttrib1fARB) -#define glVertexAttrib1fvARB GLEW_GET_FUN(__glewVertexAttrib1fvARB) -#define glVertexAttrib1sARB GLEW_GET_FUN(__glewVertexAttrib1sARB) -#define glVertexAttrib1svARB GLEW_GET_FUN(__glewVertexAttrib1svARB) -#define glVertexAttrib2dARB GLEW_GET_FUN(__glewVertexAttrib2dARB) -#define glVertexAttrib2dvARB GLEW_GET_FUN(__glewVertexAttrib2dvARB) -#define glVertexAttrib2fARB GLEW_GET_FUN(__glewVertexAttrib2fARB) -#define glVertexAttrib2fvARB GLEW_GET_FUN(__glewVertexAttrib2fvARB) -#define glVertexAttrib2sARB GLEW_GET_FUN(__glewVertexAttrib2sARB) -#define glVertexAttrib2svARB GLEW_GET_FUN(__glewVertexAttrib2svARB) -#define glVertexAttrib3dARB GLEW_GET_FUN(__glewVertexAttrib3dARB) -#define glVertexAttrib3dvARB GLEW_GET_FUN(__glewVertexAttrib3dvARB) -#define glVertexAttrib3fARB GLEW_GET_FUN(__glewVertexAttrib3fARB) -#define glVertexAttrib3fvARB GLEW_GET_FUN(__glewVertexAttrib3fvARB) -#define glVertexAttrib3sARB GLEW_GET_FUN(__glewVertexAttrib3sARB) -#define glVertexAttrib3svARB GLEW_GET_FUN(__glewVertexAttrib3svARB) -#define glVertexAttrib4NbvARB GLEW_GET_FUN(__glewVertexAttrib4NbvARB) -#define glVertexAttrib4NivARB GLEW_GET_FUN(__glewVertexAttrib4NivARB) -#define glVertexAttrib4NsvARB GLEW_GET_FUN(__glewVertexAttrib4NsvARB) -#define glVertexAttrib4NubARB GLEW_GET_FUN(__glewVertexAttrib4NubARB) -#define glVertexAttrib4NubvARB GLEW_GET_FUN(__glewVertexAttrib4NubvARB) -#define glVertexAttrib4NuivARB GLEW_GET_FUN(__glewVertexAttrib4NuivARB) -#define glVertexAttrib4NusvARB GLEW_GET_FUN(__glewVertexAttrib4NusvARB) -#define glVertexAttrib4bvARB GLEW_GET_FUN(__glewVertexAttrib4bvARB) -#define glVertexAttrib4dARB GLEW_GET_FUN(__glewVertexAttrib4dARB) -#define glVertexAttrib4dvARB GLEW_GET_FUN(__glewVertexAttrib4dvARB) -#define glVertexAttrib4fARB GLEW_GET_FUN(__glewVertexAttrib4fARB) -#define glVertexAttrib4fvARB GLEW_GET_FUN(__glewVertexAttrib4fvARB) -#define glVertexAttrib4ivARB GLEW_GET_FUN(__glewVertexAttrib4ivARB) -#define glVertexAttrib4sARB GLEW_GET_FUN(__glewVertexAttrib4sARB) -#define glVertexAttrib4svARB GLEW_GET_FUN(__glewVertexAttrib4svARB) -#define glVertexAttrib4ubvARB GLEW_GET_FUN(__glewVertexAttrib4ubvARB) -#define glVertexAttrib4uivARB GLEW_GET_FUN(__glewVertexAttrib4uivARB) -#define glVertexAttrib4usvARB GLEW_GET_FUN(__glewVertexAttrib4usvARB) -#define glVertexAttribPointerARB GLEW_GET_FUN(__glewVertexAttribPointerARB) - -#define GLEW_ARB_vertex_program GLEW_GET_VAR(__GLEW_ARB_vertex_program) - -#endif /* GL_ARB_vertex_program */ - -/* -------------------------- GL_ARB_vertex_shader ------------------------- */ - -#ifndef GL_ARB_vertex_shader -#define GL_ARB_vertex_shader 1 - -#define GL_VERTEX_SHADER_ARB 0x8B31 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A -#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D -#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 -#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A - -typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB* name); -typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); -typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); - -#define glBindAttribLocationARB GLEW_GET_FUN(__glewBindAttribLocationARB) -#define glGetActiveAttribARB GLEW_GET_FUN(__glewGetActiveAttribARB) -#define glGetAttribLocationARB GLEW_GET_FUN(__glewGetAttribLocationARB) - -#define GLEW_ARB_vertex_shader GLEW_GET_VAR(__GLEW_ARB_vertex_shader) - -#endif /* GL_ARB_vertex_shader */ - -/* ------------------- GL_ARB_vertex_type_10f_11f_11f_rev ------------------ */ - -#ifndef GL_ARB_vertex_type_10f_11f_11f_rev -#define GL_ARB_vertex_type_10f_11f_11f_rev 1 - -#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B - -#define GLEW_ARB_vertex_type_10f_11f_11f_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_10f_11f_11f_rev) - -#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ - -/* ------------------- GL_ARB_vertex_type_2_10_10_10_rev ------------------- */ - -#ifndef GL_ARB_vertex_type_2_10_10_10_rev -#define GL_ARB_vertex_type_2_10_10_10_rev 1 - -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 -#define GL_INT_2_10_10_10_REV 0x8D9F - -typedef void (GLAPIENTRY * PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); -typedef void (GLAPIENTRY * PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint* color); -typedef void (GLAPIENTRY * PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); -typedef void (GLAPIENTRY * PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint* color); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint* color); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); -typedef void (GLAPIENTRY * PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); -typedef void (GLAPIENTRY * PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); -typedef void (GLAPIENTRY * PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint* value); - -#define glColorP3ui GLEW_GET_FUN(__glewColorP3ui) -#define glColorP3uiv GLEW_GET_FUN(__glewColorP3uiv) -#define glColorP4ui GLEW_GET_FUN(__glewColorP4ui) -#define glColorP4uiv GLEW_GET_FUN(__glewColorP4uiv) -#define glMultiTexCoordP1ui GLEW_GET_FUN(__glewMultiTexCoordP1ui) -#define glMultiTexCoordP1uiv GLEW_GET_FUN(__glewMultiTexCoordP1uiv) -#define glMultiTexCoordP2ui GLEW_GET_FUN(__glewMultiTexCoordP2ui) -#define glMultiTexCoordP2uiv GLEW_GET_FUN(__glewMultiTexCoordP2uiv) -#define glMultiTexCoordP3ui GLEW_GET_FUN(__glewMultiTexCoordP3ui) -#define glMultiTexCoordP3uiv GLEW_GET_FUN(__glewMultiTexCoordP3uiv) -#define glMultiTexCoordP4ui GLEW_GET_FUN(__glewMultiTexCoordP4ui) -#define glMultiTexCoordP4uiv GLEW_GET_FUN(__glewMultiTexCoordP4uiv) -#define glNormalP3ui GLEW_GET_FUN(__glewNormalP3ui) -#define glNormalP3uiv GLEW_GET_FUN(__glewNormalP3uiv) -#define glSecondaryColorP3ui GLEW_GET_FUN(__glewSecondaryColorP3ui) -#define glSecondaryColorP3uiv GLEW_GET_FUN(__glewSecondaryColorP3uiv) -#define glTexCoordP1ui GLEW_GET_FUN(__glewTexCoordP1ui) -#define glTexCoordP1uiv GLEW_GET_FUN(__glewTexCoordP1uiv) -#define glTexCoordP2ui GLEW_GET_FUN(__glewTexCoordP2ui) -#define glTexCoordP2uiv GLEW_GET_FUN(__glewTexCoordP2uiv) -#define glTexCoordP3ui GLEW_GET_FUN(__glewTexCoordP3ui) -#define glTexCoordP3uiv GLEW_GET_FUN(__glewTexCoordP3uiv) -#define glTexCoordP4ui GLEW_GET_FUN(__glewTexCoordP4ui) -#define glTexCoordP4uiv GLEW_GET_FUN(__glewTexCoordP4uiv) -#define glVertexAttribP1ui GLEW_GET_FUN(__glewVertexAttribP1ui) -#define glVertexAttribP1uiv GLEW_GET_FUN(__glewVertexAttribP1uiv) -#define glVertexAttribP2ui GLEW_GET_FUN(__glewVertexAttribP2ui) -#define glVertexAttribP2uiv GLEW_GET_FUN(__glewVertexAttribP2uiv) -#define glVertexAttribP3ui GLEW_GET_FUN(__glewVertexAttribP3ui) -#define glVertexAttribP3uiv GLEW_GET_FUN(__glewVertexAttribP3uiv) -#define glVertexAttribP4ui GLEW_GET_FUN(__glewVertexAttribP4ui) -#define glVertexAttribP4uiv GLEW_GET_FUN(__glewVertexAttribP4uiv) -#define glVertexP2ui GLEW_GET_FUN(__glewVertexP2ui) -#define glVertexP2uiv GLEW_GET_FUN(__glewVertexP2uiv) -#define glVertexP3ui GLEW_GET_FUN(__glewVertexP3ui) -#define glVertexP3uiv GLEW_GET_FUN(__glewVertexP3uiv) -#define glVertexP4ui GLEW_GET_FUN(__glewVertexP4ui) -#define glVertexP4uiv GLEW_GET_FUN(__glewVertexP4uiv) - -#define GLEW_ARB_vertex_type_2_10_10_10_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_2_10_10_10_rev) - -#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ - -/* ------------------------- GL_ARB_viewport_array ------------------------- */ - -#ifndef GL_ARB_viewport_array -#define GL_ARB_viewport_array 1 - -#define GL_DEPTH_RANGE 0x0B70 -#define GL_VIEWPORT 0x0BA2 -#define GL_SCISSOR_BOX 0x0C10 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_MAX_VIEWPORTS 0x825B -#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C -#define GL_VIEWPORT_BOUNDS_RANGE 0x825D -#define GL_LAYER_PROVOKING_VERTEX 0x825E -#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F -#define GL_UNDEFINED_VERTEX 0x8260 -#define GL_FIRST_VERTEX_CONVENTION 0x8E4D -#define GL_LAST_VERTEX_CONVENTION 0x8E4E -#define GL_PROVOKING_VERTEX 0x8E4F - -typedef void (GLAPIENTRY * PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLclampd * v); -typedef void (GLAPIENTRY * PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLclampd n, GLclampd f); -typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble* data); -typedef void (GLAPIENTRY * PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat* data); -typedef void (GLAPIENTRY * PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint * v); -typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint * v); -typedef void (GLAPIENTRY * PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat * v); -typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); -typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat * v); - -#define glDepthRangeArrayv GLEW_GET_FUN(__glewDepthRangeArrayv) -#define glDepthRangeIndexed GLEW_GET_FUN(__glewDepthRangeIndexed) -#define glGetDoublei_v GLEW_GET_FUN(__glewGetDoublei_v) -#define glGetFloati_v GLEW_GET_FUN(__glewGetFloati_v) -#define glScissorArrayv GLEW_GET_FUN(__glewScissorArrayv) -#define glScissorIndexed GLEW_GET_FUN(__glewScissorIndexed) -#define glScissorIndexedv GLEW_GET_FUN(__glewScissorIndexedv) -#define glViewportArrayv GLEW_GET_FUN(__glewViewportArrayv) -#define glViewportIndexedf GLEW_GET_FUN(__glewViewportIndexedf) -#define glViewportIndexedfv GLEW_GET_FUN(__glewViewportIndexedfv) - -#define GLEW_ARB_viewport_array GLEW_GET_VAR(__GLEW_ARB_viewport_array) - -#endif /* GL_ARB_viewport_array */ - -/* --------------------------- GL_ARB_window_pos --------------------------- */ - -#ifndef GL_ARB_window_pos -#define GL_ARB_window_pos 1 - -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVARBPROC) (const GLdouble* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVARBPROC) (const GLfloat* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVARBPROC) (const GLint* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVARBPROC) (const GLshort* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVARBPROC) (const GLdouble* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVARBPROC) (const GLfloat* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVARBPROC) (const GLint* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVARBPROC) (const GLshort* p); - -#define glWindowPos2dARB GLEW_GET_FUN(__glewWindowPos2dARB) -#define glWindowPos2dvARB GLEW_GET_FUN(__glewWindowPos2dvARB) -#define glWindowPos2fARB GLEW_GET_FUN(__glewWindowPos2fARB) -#define glWindowPos2fvARB GLEW_GET_FUN(__glewWindowPos2fvARB) -#define glWindowPos2iARB GLEW_GET_FUN(__glewWindowPos2iARB) -#define glWindowPos2ivARB GLEW_GET_FUN(__glewWindowPos2ivARB) -#define glWindowPos2sARB GLEW_GET_FUN(__glewWindowPos2sARB) -#define glWindowPos2svARB GLEW_GET_FUN(__glewWindowPos2svARB) -#define glWindowPos3dARB GLEW_GET_FUN(__glewWindowPos3dARB) -#define glWindowPos3dvARB GLEW_GET_FUN(__glewWindowPos3dvARB) -#define glWindowPos3fARB GLEW_GET_FUN(__glewWindowPos3fARB) -#define glWindowPos3fvARB GLEW_GET_FUN(__glewWindowPos3fvARB) -#define glWindowPos3iARB GLEW_GET_FUN(__glewWindowPos3iARB) -#define glWindowPos3ivARB GLEW_GET_FUN(__glewWindowPos3ivARB) -#define glWindowPos3sARB GLEW_GET_FUN(__glewWindowPos3sARB) -#define glWindowPos3svARB GLEW_GET_FUN(__glewWindowPos3svARB) - -#define GLEW_ARB_window_pos GLEW_GET_VAR(__GLEW_ARB_window_pos) - -#endif /* GL_ARB_window_pos */ - -/* ----------------------- GL_ARM_mali_program_binary ---------------------- */ - -#ifndef GL_ARM_mali_program_binary -#define GL_ARM_mali_program_binary 1 - -#define GL_MALI_PROGRAM_BINARY_ARM 0x8F61 - -#define GLEW_ARM_mali_program_binary GLEW_GET_VAR(__GLEW_ARM_mali_program_binary) - -#endif /* GL_ARM_mali_program_binary */ - -/* ----------------------- GL_ARM_mali_shader_binary ----------------------- */ - -#ifndef GL_ARM_mali_shader_binary -#define GL_ARM_mali_shader_binary 1 - -#define GL_MALI_SHADER_BINARY_ARM 0x8F60 - -#define GLEW_ARM_mali_shader_binary GLEW_GET_VAR(__GLEW_ARM_mali_shader_binary) - -#endif /* GL_ARM_mali_shader_binary */ - -/* ------------------------------ GL_ARM_rgba8 ----------------------------- */ - -#ifndef GL_ARM_rgba8 -#define GL_ARM_rgba8 1 - -#define GL_RGBA8_OES 0x8058 - -#define GLEW_ARM_rgba8 GLEW_GET_VAR(__GLEW_ARM_rgba8) - -#endif /* GL_ARM_rgba8 */ - -/* -------------------- GL_ARM_shader_framebuffer_fetch -------------------- */ - -#ifndef GL_ARM_shader_framebuffer_fetch -#define GL_ARM_shader_framebuffer_fetch 1 - -#define GL_FETCH_PER_SAMPLE_ARM 0x8F65 -#define GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM 0x8F66 - -#define GLEW_ARM_shader_framebuffer_fetch GLEW_GET_VAR(__GLEW_ARM_shader_framebuffer_fetch) - -#endif /* GL_ARM_shader_framebuffer_fetch */ - -/* ------------- GL_ARM_shader_framebuffer_fetch_depth_stencil ------------- */ - -#ifndef GL_ARM_shader_framebuffer_fetch_depth_stencil -#define GL_ARM_shader_framebuffer_fetch_depth_stencil 1 - -#define GLEW_ARM_shader_framebuffer_fetch_depth_stencil GLEW_GET_VAR(__GLEW_ARM_shader_framebuffer_fetch_depth_stencil) - -#endif /* GL_ARM_shader_framebuffer_fetch_depth_stencil */ - -/* ---------------- GL_ARM_texture_unnormalized_coordinates ---------------- */ - -#ifndef GL_ARM_texture_unnormalized_coordinates -#define GL_ARM_texture_unnormalized_coordinates 1 - -#define GL_TEXTURE_UNNORMALIZED_COORDINATES_ARM 0x8F6A - -#define GLEW_ARM_texture_unnormalized_coordinates GLEW_GET_VAR(__GLEW_ARM_texture_unnormalized_coordinates) - -#endif /* GL_ARM_texture_unnormalized_coordinates */ - -/* ------------------------- GL_ATIX_point_sprites ------------------------- */ - -#ifndef GL_ATIX_point_sprites -#define GL_ATIX_point_sprites 1 - -#define GL_TEXTURE_POINT_MODE_ATIX 0x60B0 -#define GL_TEXTURE_POINT_ONE_COORD_ATIX 0x60B1 -#define GL_TEXTURE_POINT_SPRITE_ATIX 0x60B2 -#define GL_POINT_SPRITE_CULL_MODE_ATIX 0x60B3 -#define GL_POINT_SPRITE_CULL_CENTER_ATIX 0x60B4 -#define GL_POINT_SPRITE_CULL_CLIP_ATIX 0x60B5 - -#define GLEW_ATIX_point_sprites GLEW_GET_VAR(__GLEW_ATIX_point_sprites) - -#endif /* GL_ATIX_point_sprites */ - -/* ---------------------- GL_ATIX_texture_env_combine3 --------------------- */ - -#ifndef GL_ATIX_texture_env_combine3 -#define GL_ATIX_texture_env_combine3 1 - -#define GL_MODULATE_ADD_ATIX 0x8744 -#define GL_MODULATE_SIGNED_ADD_ATIX 0x8745 -#define GL_MODULATE_SUBTRACT_ATIX 0x8746 - -#define GLEW_ATIX_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATIX_texture_env_combine3) - -#endif /* GL_ATIX_texture_env_combine3 */ - -/* ----------------------- GL_ATIX_texture_env_route ----------------------- */ - -#ifndef GL_ATIX_texture_env_route -#define GL_ATIX_texture_env_route 1 - -#define GL_SECONDARY_COLOR_ATIX 0x8747 -#define GL_TEXTURE_OUTPUT_RGB_ATIX 0x8748 -#define GL_TEXTURE_OUTPUT_ALPHA_ATIX 0x8749 - -#define GLEW_ATIX_texture_env_route GLEW_GET_VAR(__GLEW_ATIX_texture_env_route) - -#endif /* GL_ATIX_texture_env_route */ - -/* ---------------- GL_ATIX_vertex_shader_output_point_size ---------------- */ - -#ifndef GL_ATIX_vertex_shader_output_point_size -#define GL_ATIX_vertex_shader_output_point_size 1 - -#define GL_OUTPUT_POINT_SIZE_ATIX 0x610E - -#define GLEW_ATIX_vertex_shader_output_point_size GLEW_GET_VAR(__GLEW_ATIX_vertex_shader_output_point_size) - -#endif /* GL_ATIX_vertex_shader_output_point_size */ - -/* -------------------------- GL_ATI_draw_buffers -------------------------- */ - -#ifndef GL_ATI_draw_buffers -#define GL_ATI_draw_buffers 1 - -#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 -#define GL_DRAW_BUFFER0_ATI 0x8825 -#define GL_DRAW_BUFFER1_ATI 0x8826 -#define GL_DRAW_BUFFER2_ATI 0x8827 -#define GL_DRAW_BUFFER3_ATI 0x8828 -#define GL_DRAW_BUFFER4_ATI 0x8829 -#define GL_DRAW_BUFFER5_ATI 0x882A -#define GL_DRAW_BUFFER6_ATI 0x882B -#define GL_DRAW_BUFFER7_ATI 0x882C -#define GL_DRAW_BUFFER8_ATI 0x882D -#define GL_DRAW_BUFFER9_ATI 0x882E -#define GL_DRAW_BUFFER10_ATI 0x882F -#define GL_DRAW_BUFFER11_ATI 0x8830 -#define GL_DRAW_BUFFER12_ATI 0x8831 -#define GL_DRAW_BUFFER13_ATI 0x8832 -#define GL_DRAW_BUFFER14_ATI 0x8833 -#define GL_DRAW_BUFFER15_ATI 0x8834 - -typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum* bufs); - -#define glDrawBuffersATI GLEW_GET_FUN(__glewDrawBuffersATI) - -#define GLEW_ATI_draw_buffers GLEW_GET_VAR(__GLEW_ATI_draw_buffers) - -#endif /* GL_ATI_draw_buffers */ - -/* -------------------------- GL_ATI_element_array ------------------------- */ - -#ifndef GL_ATI_element_array -#define GL_ATI_element_array 1 - -#define GL_ELEMENT_ARRAY_ATI 0x8768 -#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 -#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A - -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); -typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); -typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void *pointer); - -#define glDrawElementArrayATI GLEW_GET_FUN(__glewDrawElementArrayATI) -#define glDrawRangeElementArrayATI GLEW_GET_FUN(__glewDrawRangeElementArrayATI) -#define glElementPointerATI GLEW_GET_FUN(__glewElementPointerATI) - -#define GLEW_ATI_element_array GLEW_GET_VAR(__GLEW_ATI_element_array) - -#endif /* GL_ATI_element_array */ - -/* ------------------------- GL_ATI_envmap_bumpmap ------------------------- */ - -#ifndef GL_ATI_envmap_bumpmap -#define GL_ATI_envmap_bumpmap 1 - -#define GL_BUMP_ROT_MATRIX_ATI 0x8775 -#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 -#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 -#define GL_BUMP_TEX_UNITS_ATI 0x8778 -#define GL_DUDV_ATI 0x8779 -#define GL_DU8DV8_ATI 0x877A -#define GL_BUMP_ENVMAP_ATI 0x877B -#define GL_BUMP_TARGET_ATI 0x877C - -typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); -typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); -typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); -typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); - -#define glGetTexBumpParameterfvATI GLEW_GET_FUN(__glewGetTexBumpParameterfvATI) -#define glGetTexBumpParameterivATI GLEW_GET_FUN(__glewGetTexBumpParameterivATI) -#define glTexBumpParameterfvATI GLEW_GET_FUN(__glewTexBumpParameterfvATI) -#define glTexBumpParameterivATI GLEW_GET_FUN(__glewTexBumpParameterivATI) - -#define GLEW_ATI_envmap_bumpmap GLEW_GET_VAR(__GLEW_ATI_envmap_bumpmap) - -#endif /* GL_ATI_envmap_bumpmap */ - -/* ------------------------- GL_ATI_fragment_shader ------------------------ */ - -#ifndef GL_ATI_fragment_shader -#define GL_ATI_fragment_shader 1 - -#define GL_2X_BIT_ATI 0x00000001 -#define GL_RED_BIT_ATI 0x00000001 -#define GL_4X_BIT_ATI 0x00000002 -#define GL_COMP_BIT_ATI 0x00000002 -#define GL_GREEN_BIT_ATI 0x00000002 -#define GL_8X_BIT_ATI 0x00000004 -#define GL_BLUE_BIT_ATI 0x00000004 -#define GL_NEGATE_BIT_ATI 0x00000004 -#define GL_BIAS_BIT_ATI 0x00000008 -#define GL_HALF_BIT_ATI 0x00000008 -#define GL_QUARTER_BIT_ATI 0x00000010 -#define GL_EIGHTH_BIT_ATI 0x00000020 -#define GL_SATURATE_BIT_ATI 0x00000040 -#define GL_FRAGMENT_SHADER_ATI 0x8920 -#define GL_REG_0_ATI 0x8921 -#define GL_REG_1_ATI 0x8922 -#define GL_REG_2_ATI 0x8923 -#define GL_REG_3_ATI 0x8924 -#define GL_REG_4_ATI 0x8925 -#define GL_REG_5_ATI 0x8926 -#define GL_CON_0_ATI 0x8941 -#define GL_CON_1_ATI 0x8942 -#define GL_CON_2_ATI 0x8943 -#define GL_CON_3_ATI 0x8944 -#define GL_CON_4_ATI 0x8945 -#define GL_CON_5_ATI 0x8946 -#define GL_CON_6_ATI 0x8947 -#define GL_CON_7_ATI 0x8948 -#define GL_MOV_ATI 0x8961 -#define GL_ADD_ATI 0x8963 -#define GL_MUL_ATI 0x8964 -#define GL_SUB_ATI 0x8965 -#define GL_DOT3_ATI 0x8966 -#define GL_DOT4_ATI 0x8967 -#define GL_MAD_ATI 0x8968 -#define GL_LERP_ATI 0x8969 -#define GL_CND_ATI 0x896A -#define GL_CND0_ATI 0x896B -#define GL_DOT2_ADD_ATI 0x896C -#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D -#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E -#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F -#define GL_NUM_PASSES_ATI 0x8970 -#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 -#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 -#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 -#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 -#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 -#define GL_SWIZZLE_STR_ATI 0x8976 -#define GL_SWIZZLE_STQ_ATI 0x8977 -#define GL_SWIZZLE_STR_DR_ATI 0x8978 -#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 -#define GL_SWIZZLE_STRQ_ATI 0x897A -#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B - -typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -typedef void (GLAPIENTRY * PFNGLBEGINFRAGMENTSHADERATIPROC) (void); -typedef void (GLAPIENTRY * PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -typedef void (GLAPIENTRY * PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLENDFRAGMENTSHADERATIPROC) (void); -typedef GLuint (GLAPIENTRY * PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); -typedef void (GLAPIENTRY * PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); -typedef void (GLAPIENTRY * PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); -typedef void (GLAPIENTRY * PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat* value); - -#define glAlphaFragmentOp1ATI GLEW_GET_FUN(__glewAlphaFragmentOp1ATI) -#define glAlphaFragmentOp2ATI GLEW_GET_FUN(__glewAlphaFragmentOp2ATI) -#define glAlphaFragmentOp3ATI GLEW_GET_FUN(__glewAlphaFragmentOp3ATI) -#define glBeginFragmentShaderATI GLEW_GET_FUN(__glewBeginFragmentShaderATI) -#define glBindFragmentShaderATI GLEW_GET_FUN(__glewBindFragmentShaderATI) -#define glColorFragmentOp1ATI GLEW_GET_FUN(__glewColorFragmentOp1ATI) -#define glColorFragmentOp2ATI GLEW_GET_FUN(__glewColorFragmentOp2ATI) -#define glColorFragmentOp3ATI GLEW_GET_FUN(__glewColorFragmentOp3ATI) -#define glDeleteFragmentShaderATI GLEW_GET_FUN(__glewDeleteFragmentShaderATI) -#define glEndFragmentShaderATI GLEW_GET_FUN(__glewEndFragmentShaderATI) -#define glGenFragmentShadersATI GLEW_GET_FUN(__glewGenFragmentShadersATI) -#define glPassTexCoordATI GLEW_GET_FUN(__glewPassTexCoordATI) -#define glSampleMapATI GLEW_GET_FUN(__glewSampleMapATI) -#define glSetFragmentShaderConstantATI GLEW_GET_FUN(__glewSetFragmentShaderConstantATI) - -#define GLEW_ATI_fragment_shader GLEW_GET_VAR(__GLEW_ATI_fragment_shader) - -#endif /* GL_ATI_fragment_shader */ - -/* ------------------------ GL_ATI_map_object_buffer ----------------------- */ - -#ifndef GL_ATI_map_object_buffer -#define GL_ATI_map_object_buffer 1 - -typedef void * (GLAPIENTRY * PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); - -#define glMapObjectBufferATI GLEW_GET_FUN(__glewMapObjectBufferATI) -#define glUnmapObjectBufferATI GLEW_GET_FUN(__glewUnmapObjectBufferATI) - -#define GLEW_ATI_map_object_buffer GLEW_GET_VAR(__GLEW_ATI_map_object_buffer) - -#endif /* GL_ATI_map_object_buffer */ - -/* ----------------------------- GL_ATI_meminfo ---------------------------- */ - -#ifndef GL_ATI_meminfo -#define GL_ATI_meminfo 1 - -#define GL_VBO_FREE_MEMORY_ATI 0x87FB -#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC -#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD - -#define GLEW_ATI_meminfo GLEW_GET_VAR(__GLEW_ATI_meminfo) - -#endif /* GL_ATI_meminfo */ - -/* -------------------------- GL_ATI_pn_triangles -------------------------- */ - -#ifndef GL_ATI_pn_triangles -#define GL_ATI_pn_triangles 1 - -#define GL_PN_TRIANGLES_ATI 0x87F0 -#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 -#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 -#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 -#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 -#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 -#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 -#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 -#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 - -typedef void (GLAPIENTRY * PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); - -#define glPNTrianglesfATI GLEW_GET_FUN(__glewPNTrianglesfATI) -#define glPNTrianglesiATI GLEW_GET_FUN(__glewPNTrianglesiATI) - -#define GLEW_ATI_pn_triangles GLEW_GET_VAR(__GLEW_ATI_pn_triangles) - -#endif /* GL_ATI_pn_triangles */ - -/* ------------------------ GL_ATI_separate_stencil ------------------------ */ - -#ifndef GL_ATI_separate_stencil -#define GL_ATI_separate_stencil 1 - -#define GL_STENCIL_BACK_FUNC_ATI 0x8800 -#define GL_STENCIL_BACK_FAIL_ATI 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 - -typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); -typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); - -#define glStencilFuncSeparateATI GLEW_GET_FUN(__glewStencilFuncSeparateATI) -#define glStencilOpSeparateATI GLEW_GET_FUN(__glewStencilOpSeparateATI) - -#define GLEW_ATI_separate_stencil GLEW_GET_VAR(__GLEW_ATI_separate_stencil) - -#endif /* GL_ATI_separate_stencil */ - -/* ----------------------- GL_ATI_shader_texture_lod ----------------------- */ - -#ifndef GL_ATI_shader_texture_lod -#define GL_ATI_shader_texture_lod 1 - -#define GLEW_ATI_shader_texture_lod GLEW_GET_VAR(__GLEW_ATI_shader_texture_lod) - -#endif /* GL_ATI_shader_texture_lod */ - -/* ---------------------- GL_ATI_text_fragment_shader ---------------------- */ - -#ifndef GL_ATI_text_fragment_shader -#define GL_ATI_text_fragment_shader 1 - -#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 - -#define GLEW_ATI_text_fragment_shader GLEW_GET_VAR(__GLEW_ATI_text_fragment_shader) - -#endif /* GL_ATI_text_fragment_shader */ - -/* --------------------- GL_ATI_texture_compression_3dc -------------------- */ - -#ifndef GL_ATI_texture_compression_3dc -#define GL_ATI_texture_compression_3dc 1 - -#define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837 - -#define GLEW_ATI_texture_compression_3dc GLEW_GET_VAR(__GLEW_ATI_texture_compression_3dc) - -#endif /* GL_ATI_texture_compression_3dc */ - -/* ---------------------- GL_ATI_texture_env_combine3 ---------------------- */ - -#ifndef GL_ATI_texture_env_combine3 -#define GL_ATI_texture_env_combine3 1 - -#define GL_MODULATE_ADD_ATI 0x8744 -#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 -#define GL_MODULATE_SUBTRACT_ATI 0x8746 - -#define GLEW_ATI_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATI_texture_env_combine3) - -#endif /* GL_ATI_texture_env_combine3 */ - -/* -------------------------- GL_ATI_texture_float ------------------------- */ - -#ifndef GL_ATI_texture_float -#define GL_ATI_texture_float 1 - -#define GL_RGBA_FLOAT32_ATI 0x8814 -#define GL_RGB_FLOAT32_ATI 0x8815 -#define GL_ALPHA_FLOAT32_ATI 0x8816 -#define GL_INTENSITY_FLOAT32_ATI 0x8817 -#define GL_LUMINANCE_FLOAT32_ATI 0x8818 -#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 -#define GL_RGBA_FLOAT16_ATI 0x881A -#define GL_RGB_FLOAT16_ATI 0x881B -#define GL_ALPHA_FLOAT16_ATI 0x881C -#define GL_INTENSITY_FLOAT16_ATI 0x881D -#define GL_LUMINANCE_FLOAT16_ATI 0x881E -#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F - -#define GLEW_ATI_texture_float GLEW_GET_VAR(__GLEW_ATI_texture_float) - -#endif /* GL_ATI_texture_float */ - -/* ----------------------- GL_ATI_texture_mirror_once ---------------------- */ - -#ifndef GL_ATI_texture_mirror_once -#define GL_ATI_texture_mirror_once 1 - -#define GL_MIRROR_CLAMP_ATI 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 - -#define GLEW_ATI_texture_mirror_once GLEW_GET_VAR(__GLEW_ATI_texture_mirror_once) - -#endif /* GL_ATI_texture_mirror_once */ - -/* ----------------------- GL_ATI_vertex_array_object ---------------------- */ - -#ifndef GL_ATI_vertex_array_object -#define GL_ATI_vertex_array_object 1 - -#define GL_STATIC_ATI 0x8760 -#define GL_DYNAMIC_ATI 0x8761 -#define GL_PRESERVE_ATI 0x8762 -#define GL_DISCARD_ATI 0x8763 -#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 -#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 -#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 -#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 - -typedef void (GLAPIENTRY * PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (GLAPIENTRY * PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); -typedef GLuint (GLAPIENTRY * PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void *pointer, GLenum usage); -typedef void (GLAPIENTRY * PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); -typedef void (GLAPIENTRY * PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); - -#define glArrayObjectATI GLEW_GET_FUN(__glewArrayObjectATI) -#define glFreeObjectBufferATI GLEW_GET_FUN(__glewFreeObjectBufferATI) -#define glGetArrayObjectfvATI GLEW_GET_FUN(__glewGetArrayObjectfvATI) -#define glGetArrayObjectivATI GLEW_GET_FUN(__glewGetArrayObjectivATI) -#define glGetObjectBufferfvATI GLEW_GET_FUN(__glewGetObjectBufferfvATI) -#define glGetObjectBufferivATI GLEW_GET_FUN(__glewGetObjectBufferivATI) -#define glGetVariantArrayObjectfvATI GLEW_GET_FUN(__glewGetVariantArrayObjectfvATI) -#define glGetVariantArrayObjectivATI GLEW_GET_FUN(__glewGetVariantArrayObjectivATI) -#define glIsObjectBufferATI GLEW_GET_FUN(__glewIsObjectBufferATI) -#define glNewObjectBufferATI GLEW_GET_FUN(__glewNewObjectBufferATI) -#define glUpdateObjectBufferATI GLEW_GET_FUN(__glewUpdateObjectBufferATI) -#define glVariantArrayObjectATI GLEW_GET_FUN(__glewVariantArrayObjectATI) - -#define GLEW_ATI_vertex_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_array_object) - -#endif /* GL_ATI_vertex_array_object */ - -/* ------------------- GL_ATI_vertex_attrib_array_object ------------------- */ - -#ifndef GL_ATI_vertex_attrib_array_object -#define GL_ATI_vertex_attrib_array_object 1 - -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); - -#define glGetVertexAttribArrayObjectfvATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectfvATI) -#define glGetVertexAttribArrayObjectivATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectivATI) -#define glVertexAttribArrayObjectATI GLEW_GET_FUN(__glewVertexAttribArrayObjectATI) - -#define GLEW_ATI_vertex_attrib_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_attrib_array_object) - -#endif /* GL_ATI_vertex_attrib_array_object */ - -/* ------------------------- GL_ATI_vertex_streams ------------------------- */ - -#ifndef GL_ATI_vertex_streams -#define GL_ATI_vertex_streams 1 - -#define GL_MAX_VERTEX_STREAMS_ATI 0x876B -#define GL_VERTEX_SOURCE_ATI 0x876C -#define GL_VERTEX_STREAM0_ATI 0x876D -#define GL_VERTEX_STREAM1_ATI 0x876E -#define GL_VERTEX_STREAM2_ATI 0x876F -#define GL_VERTEX_STREAM3_ATI 0x8770 -#define GL_VERTEX_STREAM4_ATI 0x8771 -#define GL_VERTEX_STREAM5_ATI 0x8772 -#define GL_VERTEX_STREAM6_ATI 0x8773 -#define GL_VERTEX_STREAM7_ATI 0x8774 - -typedef void (GLAPIENTRY * PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte x, GLbyte y, GLbyte z); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); - -#define glClientActiveVertexStreamATI GLEW_GET_FUN(__glewClientActiveVertexStreamATI) -#define glNormalStream3bATI GLEW_GET_FUN(__glewNormalStream3bATI) -#define glNormalStream3bvATI GLEW_GET_FUN(__glewNormalStream3bvATI) -#define glNormalStream3dATI GLEW_GET_FUN(__glewNormalStream3dATI) -#define glNormalStream3dvATI GLEW_GET_FUN(__glewNormalStream3dvATI) -#define glNormalStream3fATI GLEW_GET_FUN(__glewNormalStream3fATI) -#define glNormalStream3fvATI GLEW_GET_FUN(__glewNormalStream3fvATI) -#define glNormalStream3iATI GLEW_GET_FUN(__glewNormalStream3iATI) -#define glNormalStream3ivATI GLEW_GET_FUN(__glewNormalStream3ivATI) -#define glNormalStream3sATI GLEW_GET_FUN(__glewNormalStream3sATI) -#define glNormalStream3svATI GLEW_GET_FUN(__glewNormalStream3svATI) -#define glVertexBlendEnvfATI GLEW_GET_FUN(__glewVertexBlendEnvfATI) -#define glVertexBlendEnviATI GLEW_GET_FUN(__glewVertexBlendEnviATI) -#define glVertexStream1dATI GLEW_GET_FUN(__glewVertexStream1dATI) -#define glVertexStream1dvATI GLEW_GET_FUN(__glewVertexStream1dvATI) -#define glVertexStream1fATI GLEW_GET_FUN(__glewVertexStream1fATI) -#define glVertexStream1fvATI GLEW_GET_FUN(__glewVertexStream1fvATI) -#define glVertexStream1iATI GLEW_GET_FUN(__glewVertexStream1iATI) -#define glVertexStream1ivATI GLEW_GET_FUN(__glewVertexStream1ivATI) -#define glVertexStream1sATI GLEW_GET_FUN(__glewVertexStream1sATI) -#define glVertexStream1svATI GLEW_GET_FUN(__glewVertexStream1svATI) -#define glVertexStream2dATI GLEW_GET_FUN(__glewVertexStream2dATI) -#define glVertexStream2dvATI GLEW_GET_FUN(__glewVertexStream2dvATI) -#define glVertexStream2fATI GLEW_GET_FUN(__glewVertexStream2fATI) -#define glVertexStream2fvATI GLEW_GET_FUN(__glewVertexStream2fvATI) -#define glVertexStream2iATI GLEW_GET_FUN(__glewVertexStream2iATI) -#define glVertexStream2ivATI GLEW_GET_FUN(__glewVertexStream2ivATI) -#define glVertexStream2sATI GLEW_GET_FUN(__glewVertexStream2sATI) -#define glVertexStream2svATI GLEW_GET_FUN(__glewVertexStream2svATI) -#define glVertexStream3dATI GLEW_GET_FUN(__glewVertexStream3dATI) -#define glVertexStream3dvATI GLEW_GET_FUN(__glewVertexStream3dvATI) -#define glVertexStream3fATI GLEW_GET_FUN(__glewVertexStream3fATI) -#define glVertexStream3fvATI GLEW_GET_FUN(__glewVertexStream3fvATI) -#define glVertexStream3iATI GLEW_GET_FUN(__glewVertexStream3iATI) -#define glVertexStream3ivATI GLEW_GET_FUN(__glewVertexStream3ivATI) -#define glVertexStream3sATI GLEW_GET_FUN(__glewVertexStream3sATI) -#define glVertexStream3svATI GLEW_GET_FUN(__glewVertexStream3svATI) -#define glVertexStream4dATI GLEW_GET_FUN(__glewVertexStream4dATI) -#define glVertexStream4dvATI GLEW_GET_FUN(__glewVertexStream4dvATI) -#define glVertexStream4fATI GLEW_GET_FUN(__glewVertexStream4fATI) -#define glVertexStream4fvATI GLEW_GET_FUN(__glewVertexStream4fvATI) -#define glVertexStream4iATI GLEW_GET_FUN(__glewVertexStream4iATI) -#define glVertexStream4ivATI GLEW_GET_FUN(__glewVertexStream4ivATI) -#define glVertexStream4sATI GLEW_GET_FUN(__glewVertexStream4sATI) -#define glVertexStream4svATI GLEW_GET_FUN(__glewVertexStream4svATI) - -#define GLEW_ATI_vertex_streams GLEW_GET_VAR(__GLEW_ATI_vertex_streams) - -#endif /* GL_ATI_vertex_streams */ - -/* ------------------------- GL_DMP_program_binary ------------------------- */ - -#ifndef GL_DMP_program_binary -#define GL_DMP_program_binary 1 - -#define GL_SMAPHS30_PROGRAM_BINARY_DMP 0x9251 -#define GL_SMAPHS_PROGRAM_BINARY_DMP 0x9252 -#define GL_DMP_PROGRAM_BINARY_DMP 0x9253 - -#define GLEW_DMP_program_binary GLEW_GET_VAR(__GLEW_DMP_program_binary) - -#endif /* GL_DMP_program_binary */ - -/* -------------------------- GL_DMP_shader_binary ------------------------- */ - -#ifndef GL_DMP_shader_binary -#define GL_DMP_shader_binary 1 - -#define GL_SHADER_BINARY_DMP 0x9250 - -#define GLEW_DMP_shader_binary GLEW_GET_VAR(__GLEW_DMP_shader_binary) - -#endif /* GL_DMP_shader_binary */ - -/* --------------------------- GL_EXT_422_pixels --------------------------- */ - -#ifndef GL_EXT_422_pixels -#define GL_EXT_422_pixels 1 - -#define GL_422_EXT 0x80CC -#define GL_422_REV_EXT 0x80CD -#define GL_422_AVERAGE_EXT 0x80CE -#define GL_422_REV_AVERAGE_EXT 0x80CF - -#define GLEW_EXT_422_pixels GLEW_GET_VAR(__GLEW_EXT_422_pixels) - -#endif /* GL_EXT_422_pixels */ - -/* ---------------------------- GL_EXT_Cg_shader --------------------------- */ - -#ifndef GL_EXT_Cg_shader -#define GL_EXT_Cg_shader 1 - -#define GL_CG_VERTEX_SHADER_EXT 0x890E -#define GL_CG_FRAGMENT_SHADER_EXT 0x890F - -#define GLEW_EXT_Cg_shader GLEW_GET_VAR(__GLEW_EXT_Cg_shader) - -#endif /* GL_EXT_Cg_shader */ - -/* ------------------------- GL_EXT_EGL_image_array ------------------------ */ - -#ifndef GL_EXT_EGL_image_array -#define GL_EXT_EGL_image_array 1 - -#define GLEW_EXT_EGL_image_array GLEW_GET_VAR(__GLEW_EXT_EGL_image_array) - -#endif /* GL_EXT_EGL_image_array */ - -/* ------------------ GL_EXT_EGL_image_external_wrap_modes ----------------- */ - -#ifndef GL_EXT_EGL_image_external_wrap_modes -#define GL_EXT_EGL_image_external_wrap_modes 1 - -#define GLEW_EXT_EGL_image_external_wrap_modes GLEW_GET_VAR(__GLEW_EXT_EGL_image_external_wrap_modes) - -#endif /* GL_EXT_EGL_image_external_wrap_modes */ - -/* ------------------------ GL_EXT_EGL_image_storage ----------------------- */ - -#ifndef GL_EXT_EGL_image_storage -#define GL_EXT_EGL_image_storage 1 - -typedef void (GLAPIENTRY * PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC) (GLenum target, GLeglImageOES image, const GLint* attrib_list); -typedef void (GLAPIENTRY * PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC) (GLuint texture, GLeglImageOES image, const GLint* attrib_list); - -#define glEGLImageTargetTexStorageEXT GLEW_GET_FUN(__glewEGLImageTargetTexStorageEXT) -#define glEGLImageTargetTextureStorageEXT GLEW_GET_FUN(__glewEGLImageTargetTextureStorageEXT) - -#define GLEW_EXT_EGL_image_storage GLEW_GET_VAR(__GLEW_EXT_EGL_image_storage) - -#endif /* GL_EXT_EGL_image_storage */ - -/* ---------------------------- GL_EXT_EGL_sync ---------------------------- */ - -#ifndef GL_EXT_EGL_sync -#define GL_EXT_EGL_sync 1 - -#define GLEW_EXT_EGL_sync GLEW_GET_VAR(__GLEW_EXT_EGL_sync) - -#endif /* GL_EXT_EGL_sync */ - -/* --------------------------- GL_EXT_YUV_target --------------------------- */ - -#ifndef GL_EXT_YUV_target -#define GL_EXT_YUV_target 1 - -#define GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT 0x8BE7 - -#define GLEW_EXT_YUV_target GLEW_GET_VAR(__GLEW_EXT_YUV_target) - -#endif /* GL_EXT_YUV_target */ - -/* ------------------------------ GL_EXT_abgr ------------------------------ */ - -#ifndef GL_EXT_abgr -#define GL_EXT_abgr 1 - -#define GL_ABGR_EXT 0x8000 - -#define GLEW_EXT_abgr GLEW_GET_VAR(__GLEW_EXT_abgr) - -#endif /* GL_EXT_abgr */ - -/* -------------------------- GL_EXT_base_instance ------------------------- */ - -#ifndef GL_EXT_base_instance -#define GL_EXT_base_instance 1 - -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); - -#define glDrawArraysInstancedBaseInstanceEXT GLEW_GET_FUN(__glewDrawArraysInstancedBaseInstanceEXT) -#define glDrawElementsInstancedBaseInstanceEXT GLEW_GET_FUN(__glewDrawElementsInstancedBaseInstanceEXT) -#define glDrawElementsInstancedBaseVertexBaseInstanceEXT GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertexBaseInstanceEXT) - -#define GLEW_EXT_base_instance GLEW_GET_VAR(__GLEW_EXT_base_instance) - -#endif /* GL_EXT_base_instance */ - -/* ------------------------------ GL_EXT_bgra ------------------------------ */ - -#ifndef GL_EXT_bgra -#define GL_EXT_bgra 1 - -#define GL_BGR_EXT 0x80E0 -#define GL_BGRA_EXT 0x80E1 - -#define GLEW_EXT_bgra GLEW_GET_VAR(__GLEW_EXT_bgra) - -#endif /* GL_EXT_bgra */ - -/* ------------------------ GL_EXT_bindable_uniform ------------------------ */ - -#ifndef GL_EXT_bindable_uniform -#define GL_EXT_bindable_uniform 1 - -#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 -#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 -#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 -#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED -#define GL_UNIFORM_BUFFER_EXT 0x8DEE -#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF - -typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); -typedef GLintptr (GLAPIENTRY * PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); -typedef void (GLAPIENTRY * PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); - -#define glGetUniformBufferSizeEXT GLEW_GET_FUN(__glewGetUniformBufferSizeEXT) -#define glGetUniformOffsetEXT GLEW_GET_FUN(__glewGetUniformOffsetEXT) -#define glUniformBufferEXT GLEW_GET_FUN(__glewUniformBufferEXT) - -#define GLEW_EXT_bindable_uniform GLEW_GET_VAR(__GLEW_EXT_bindable_uniform) - -#endif /* GL_EXT_bindable_uniform */ - -/* --------------------------- GL_EXT_blend_color -------------------------- */ - -#ifndef GL_EXT_blend_color -#define GL_EXT_blend_color 1 - -#define GL_CONSTANT_COLOR_EXT 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 -#define GL_CONSTANT_ALPHA_EXT 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 -#define GL_BLEND_COLOR_EXT 0x8005 - -typedef void (GLAPIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); - -#define glBlendColorEXT GLEW_GET_FUN(__glewBlendColorEXT) - -#define GLEW_EXT_blend_color GLEW_GET_VAR(__GLEW_EXT_blend_color) - -#endif /* GL_EXT_blend_color */ - -/* --------------------- GL_EXT_blend_equation_separate -------------------- */ - -#ifndef GL_EXT_blend_equation_separate -#define GL_EXT_blend_equation_separate 1 - -#define GL_BLEND_EQUATION_RGB_EXT 0x8009 -#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D - -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); - -#define glBlendEquationSeparateEXT GLEW_GET_FUN(__glewBlendEquationSeparateEXT) - -#define GLEW_EXT_blend_equation_separate GLEW_GET_VAR(__GLEW_EXT_blend_equation_separate) - -#endif /* GL_EXT_blend_equation_separate */ - -/* ----------------------- GL_EXT_blend_func_extended ---------------------- */ - -#ifndef GL_EXT_blend_func_extended -#define GL_EXT_blend_func_extended 1 - -#define GL_SRC_ALPHA_SATURATE_EXT 0x0308 -#define GL_SRC1_ALPHA_EXT 0x8589 -#define GL_SRC1_COLOR_EXT 0x88F9 -#define GL_ONE_MINUS_SRC1_COLOR_EXT 0x88FA -#define GL_ONE_MINUS_SRC1_ALPHA_EXT 0x88FB -#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT 0x88FC -#define GL_LOCATION_INDEX_EXT 0x930F - -typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); -typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATAINDEXEXTPROC) (GLuint program, const GLchar * name); -typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC) (GLuint program, GLenum programInterface, const GLchar* name); - -#define glBindFragDataLocationIndexedEXT GLEW_GET_FUN(__glewBindFragDataLocationIndexedEXT) -#define glGetFragDataIndexEXT GLEW_GET_FUN(__glewGetFragDataIndexEXT) -#define glGetProgramResourceLocationIndexEXT GLEW_GET_FUN(__glewGetProgramResourceLocationIndexEXT) - -#define GLEW_EXT_blend_func_extended GLEW_GET_VAR(__GLEW_EXT_blend_func_extended) - -#endif /* GL_EXT_blend_func_extended */ - -/* ----------------------- GL_EXT_blend_func_separate ---------------------- */ - -#ifndef GL_EXT_blend_func_separate -#define GL_EXT_blend_func_separate 1 - -#define GL_BLEND_DST_RGB_EXT 0x80C8 -#define GL_BLEND_SRC_RGB_EXT 0x80C9 -#define GL_BLEND_DST_ALPHA_EXT 0x80CA -#define GL_BLEND_SRC_ALPHA_EXT 0x80CB - -typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); - -#define glBlendFuncSeparateEXT GLEW_GET_FUN(__glewBlendFuncSeparateEXT) - -#define GLEW_EXT_blend_func_separate GLEW_GET_VAR(__GLEW_EXT_blend_func_separate) - -#endif /* GL_EXT_blend_func_separate */ - -/* ------------------------- GL_EXT_blend_logic_op ------------------------- */ - -#ifndef GL_EXT_blend_logic_op -#define GL_EXT_blend_logic_op 1 - -#define GLEW_EXT_blend_logic_op GLEW_GET_VAR(__GLEW_EXT_blend_logic_op) - -#endif /* GL_EXT_blend_logic_op */ - -/* -------------------------- GL_EXT_blend_minmax -------------------------- */ - -#ifndef GL_EXT_blend_minmax -#define GL_EXT_blend_minmax 1 - -#define GL_FUNC_ADD_EXT 0x8006 -#define GL_MIN_EXT 0x8007 -#define GL_MAX_EXT 0x8008 -#define GL_BLEND_EQUATION_EXT 0x8009 - -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); - -#define glBlendEquationEXT GLEW_GET_FUN(__glewBlendEquationEXT) - -#define GLEW_EXT_blend_minmax GLEW_GET_VAR(__GLEW_EXT_blend_minmax) - -#endif /* GL_EXT_blend_minmax */ - -/* ------------------------- GL_EXT_blend_subtract ------------------------- */ - -#ifndef GL_EXT_blend_subtract -#define GL_EXT_blend_subtract 1 - -#define GL_FUNC_SUBTRACT_EXT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B - -#define GLEW_EXT_blend_subtract GLEW_GET_VAR(__GLEW_EXT_blend_subtract) - -#endif /* GL_EXT_blend_subtract */ - -/* ------------------------- GL_EXT_buffer_storage ------------------------- */ - -#ifndef GL_EXT_buffer_storage -#define GL_EXT_buffer_storage 1 - -#define GL_MAP_READ_BIT 0x0001 -#define GL_MAP_WRITE_BIT 0x0002 -#define GL_MAP_PERSISTENT_BIT_EXT 0x0040 -#define GL_MAP_COHERENT_BIT_EXT 0x0080 -#define GL_DYNAMIC_STORAGE_BIT_EXT 0x0100 -#define GL_CLIENT_STORAGE_BIT_EXT 0x0200 -#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT_EXT 0x00004000 -#define GL_BUFFER_IMMUTABLE_STORAGE_EXT 0x821F -#define GL_BUFFER_STORAGE_FLAGS_EXT 0x8220 - -typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEEXTPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); - -#define glBufferStorageEXT GLEW_GET_FUN(__glewBufferStorageEXT) -#define glNamedBufferStorageEXT GLEW_GET_FUN(__glewNamedBufferStorageEXT) - -#define GLEW_EXT_buffer_storage GLEW_GET_VAR(__GLEW_EXT_buffer_storage) - -#endif /* GL_EXT_buffer_storage */ - -/* -------------------------- GL_EXT_clear_texture ------------------------- */ - -#ifndef GL_EXT_clear_texture -#define GL_EXT_clear_texture 1 - -typedef void (GLAPIENTRY * PFNGLCLEARTEXIMAGEEXTPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCLEARTEXSUBIMAGEEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); - -#define glClearTexImageEXT GLEW_GET_FUN(__glewClearTexImageEXT) -#define glClearTexSubImageEXT GLEW_GET_FUN(__glewClearTexSubImageEXT) - -#define GLEW_EXT_clear_texture GLEW_GET_VAR(__GLEW_EXT_clear_texture) - -#endif /* GL_EXT_clear_texture */ - -/* -------------------------- GL_EXT_clip_control -------------------------- */ - -#ifndef GL_EXT_clip_control -#define GL_EXT_clip_control 1 - -#define GL_LOWER_LEFT_EXT 0x8CA1 -#define GL_UPPER_LEFT_EXT 0x8CA2 -#define GL_CLIP_ORIGIN_EXT 0x935C -#define GL_CLIP_DEPTH_MODE_EXT 0x935D -#define GL_NEGATIVE_ONE_TO_ONE_EXT 0x935E -#define GL_ZERO_TO_ONE_EXT 0x935F - -typedef void (GLAPIENTRY * PFNGLCLIPCONTROLEXTPROC) (GLenum origin, GLenum depth); - -#define glClipControlEXT GLEW_GET_FUN(__glewClipControlEXT) - -#define GLEW_EXT_clip_control GLEW_GET_VAR(__GLEW_EXT_clip_control) - -#endif /* GL_EXT_clip_control */ - -/* ----------------------- GL_EXT_clip_cull_distance ----------------------- */ - -#ifndef GL_EXT_clip_cull_distance -#define GL_EXT_clip_cull_distance 1 - -#define GL_MAX_CLIP_DISTANCES_EXT 0x0D32 -#define GL_CLIP_DISTANCE0_EXT 0x3000 -#define GL_CLIP_DISTANCE1_EXT 0x3001 -#define GL_CLIP_DISTANCE2_EXT 0x3002 -#define GL_CLIP_DISTANCE3_EXT 0x3003 -#define GL_CLIP_DISTANCE4_EXT 0x3004 -#define GL_CLIP_DISTANCE5_EXT 0x3005 -#define GL_CLIP_DISTANCE6_EXT 0x3006 -#define GL_CLIP_DISTANCE7_EXT 0x3007 -#define GL_MAX_CULL_DISTANCES_EXT 0x82F9 -#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES_EXT 0x82FA - -#define GLEW_EXT_clip_cull_distance GLEW_GET_VAR(__GLEW_EXT_clip_cull_distance) - -#endif /* GL_EXT_clip_cull_distance */ - -/* ------------------------ GL_EXT_clip_volume_hint ------------------------ */ - -#ifndef GL_EXT_clip_volume_hint -#define GL_EXT_clip_volume_hint 1 - -#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 - -#define GLEW_EXT_clip_volume_hint GLEW_GET_VAR(__GLEW_EXT_clip_volume_hint) - -#endif /* GL_EXT_clip_volume_hint */ - -/* ------------------------------ GL_EXT_cmyka ----------------------------- */ - -#ifndef GL_EXT_cmyka -#define GL_EXT_cmyka 1 - -#define GL_CMYK_EXT 0x800C -#define GL_CMYKA_EXT 0x800D -#define GL_PACK_CMYK_HINT_EXT 0x800E -#define GL_UNPACK_CMYK_HINT_EXT 0x800F - -#define GLEW_EXT_cmyka GLEW_GET_VAR(__GLEW_EXT_cmyka) - -#endif /* GL_EXT_cmyka */ - -/* ----------------------- GL_EXT_color_buffer_float ----------------------- */ - -#ifndef GL_EXT_color_buffer_float -#define GL_EXT_color_buffer_float 1 - -#define GLEW_EXT_color_buffer_float GLEW_GET_VAR(__GLEW_EXT_color_buffer_float) - -#endif /* GL_EXT_color_buffer_float */ - -/* --------------------- GL_EXT_color_buffer_half_float -------------------- */ - -#ifndef GL_EXT_color_buffer_half_float -#define GL_EXT_color_buffer_half_float 1 - -#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT 0x8211 -#define GL_R16F_EXT 0x822D -#define GL_RG16F_EXT 0x822F -#define GL_RGBA16F_EXT 0x881A -#define GL_RGB16F_EXT 0x881B -#define GL_UNSIGNED_NORMALIZED_EXT 0x8C17 - -#define GLEW_EXT_color_buffer_half_float GLEW_GET_VAR(__GLEW_EXT_color_buffer_half_float) - -#endif /* GL_EXT_color_buffer_half_float */ - -/* ------------------------- GL_EXT_color_subtable ------------------------- */ - -#ifndef GL_EXT_color_subtable -#define GL_EXT_color_subtable 1 - -typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); - -#define glColorSubTableEXT GLEW_GET_FUN(__glewColorSubTableEXT) -#define glCopyColorSubTableEXT GLEW_GET_FUN(__glewCopyColorSubTableEXT) - -#define GLEW_EXT_color_subtable GLEW_GET_VAR(__GLEW_EXT_color_subtable) - -#endif /* GL_EXT_color_subtable */ - -/* ---------------------- GL_EXT_compiled_vertex_array --------------------- */ - -#ifndef GL_EXT_compiled_vertex_array -#define GL_EXT_compiled_vertex_array 1 - -#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 -#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 - -typedef void (GLAPIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); -typedef void (GLAPIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void); - -#define glLockArraysEXT GLEW_GET_FUN(__glewLockArraysEXT) -#define glUnlockArraysEXT GLEW_GET_FUN(__glewUnlockArraysEXT) - -#define GLEW_EXT_compiled_vertex_array GLEW_GET_VAR(__GLEW_EXT_compiled_vertex_array) - -#endif /* GL_EXT_compiled_vertex_array */ - -/* ---------------- GL_EXT_compressed_ETC1_RGB8_sub_texture ---------------- */ - -#ifndef GL_EXT_compressed_ETC1_RGB8_sub_texture -#define GL_EXT_compressed_ETC1_RGB8_sub_texture 1 - -#define GLEW_EXT_compressed_ETC1_RGB8_sub_texture GLEW_GET_VAR(__GLEW_EXT_compressed_ETC1_RGB8_sub_texture) - -#endif /* GL_EXT_compressed_ETC1_RGB8_sub_texture */ - -/* ----------------------- GL_EXT_conservative_depth ----------------------- */ - -#ifndef GL_EXT_conservative_depth -#define GL_EXT_conservative_depth 1 - -#define GLEW_EXT_conservative_depth GLEW_GET_VAR(__GLEW_EXT_conservative_depth) - -#endif /* GL_EXT_conservative_depth */ - -/* --------------------------- GL_EXT_convolution -------------------------- */ - -#ifndef GL_EXT_convolution -#define GL_EXT_convolution 1 - -#define GL_CONVOLUTION_1D_EXT 0x8010 -#define GL_CONVOLUTION_2D_EXT 0x8011 -#define GL_SEPARABLE_2D_EXT 0x8012 -#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 -#define GL_REDUCE_EXT 0x8016 -#define GL_CONVOLUTION_FORMAT_EXT 0x8017 -#define GL_CONVOLUTION_WIDTH_EXT 0x8018 -#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 - -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *image); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); -typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); - -#define glConvolutionFilter1DEXT GLEW_GET_FUN(__glewConvolutionFilter1DEXT) -#define glConvolutionFilter2DEXT GLEW_GET_FUN(__glewConvolutionFilter2DEXT) -#define glConvolutionParameterfEXT GLEW_GET_FUN(__glewConvolutionParameterfEXT) -#define glConvolutionParameterfvEXT GLEW_GET_FUN(__glewConvolutionParameterfvEXT) -#define glConvolutionParameteriEXT GLEW_GET_FUN(__glewConvolutionParameteriEXT) -#define glConvolutionParameterivEXT GLEW_GET_FUN(__glewConvolutionParameterivEXT) -#define glCopyConvolutionFilter1DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter1DEXT) -#define glCopyConvolutionFilter2DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter2DEXT) -#define glGetConvolutionFilterEXT GLEW_GET_FUN(__glewGetConvolutionFilterEXT) -#define glGetConvolutionParameterfvEXT GLEW_GET_FUN(__glewGetConvolutionParameterfvEXT) -#define glGetConvolutionParameterivEXT GLEW_GET_FUN(__glewGetConvolutionParameterivEXT) -#define glGetSeparableFilterEXT GLEW_GET_FUN(__glewGetSeparableFilterEXT) -#define glSeparableFilter2DEXT GLEW_GET_FUN(__glewSeparableFilter2DEXT) - -#define GLEW_EXT_convolution GLEW_GET_VAR(__GLEW_EXT_convolution) - -#endif /* GL_EXT_convolution */ - -/* ------------------------ GL_EXT_coordinate_frame ------------------------ */ - -#ifndef GL_EXT_coordinate_frame -#define GL_EXT_coordinate_frame 1 - -#define GL_TANGENT_ARRAY_EXT 0x8439 -#define GL_BINORMAL_ARRAY_EXT 0x843A -#define GL_CURRENT_TANGENT_EXT 0x843B -#define GL_CURRENT_BINORMAL_EXT 0x843C -#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E -#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F -#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 -#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 -#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 -#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 -#define GL_MAP1_TANGENT_EXT 0x8444 -#define GL_MAP2_TANGENT_EXT 0x8445 -#define GL_MAP1_BINORMAL_EXT 0x8446 -#define GL_MAP2_BINORMAL_EXT 0x8447 - -typedef void (GLAPIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, void *pointer); -typedef void (GLAPIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, void *pointer); - -#define glBinormalPointerEXT GLEW_GET_FUN(__glewBinormalPointerEXT) -#define glTangentPointerEXT GLEW_GET_FUN(__glewTangentPointerEXT) - -#define GLEW_EXT_coordinate_frame GLEW_GET_VAR(__GLEW_EXT_coordinate_frame) - -#endif /* GL_EXT_coordinate_frame */ - -/* --------------------------- GL_EXT_copy_image --------------------------- */ - -#ifndef GL_EXT_copy_image -#define GL_EXT_copy_image 1 - -typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATAEXTPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); - -#define glCopyImageSubDataEXT GLEW_GET_FUN(__glewCopyImageSubDataEXT) - -#define GLEW_EXT_copy_image GLEW_GET_VAR(__GLEW_EXT_copy_image) - -#endif /* GL_EXT_copy_image */ - -/* -------------------------- GL_EXT_copy_texture -------------------------- */ - -#ifndef GL_EXT_copy_texture -#define GL_EXT_copy_texture 1 - -typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); - -#define glCopyTexImage1DEXT GLEW_GET_FUN(__glewCopyTexImage1DEXT) -#define glCopyTexImage2DEXT GLEW_GET_FUN(__glewCopyTexImage2DEXT) -#define glCopyTexSubImage1DEXT GLEW_GET_FUN(__glewCopyTexSubImage1DEXT) -#define glCopyTexSubImage2DEXT GLEW_GET_FUN(__glewCopyTexSubImage2DEXT) -#define glCopyTexSubImage3DEXT GLEW_GET_FUN(__glewCopyTexSubImage3DEXT) - -#define GLEW_EXT_copy_texture GLEW_GET_VAR(__GLEW_EXT_copy_texture) - -#endif /* GL_EXT_copy_texture */ - -/* --------------------------- GL_EXT_cull_vertex -------------------------- */ - -#ifndef GL_EXT_cull_vertex -#define GL_EXT_cull_vertex 1 - -#define GL_CULL_VERTEX_EXT 0x81AA -#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB -#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC - -typedef void (GLAPIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params); - -#define glCullParameterdvEXT GLEW_GET_FUN(__glewCullParameterdvEXT) -#define glCullParameterfvEXT GLEW_GET_FUN(__glewCullParameterfvEXT) - -#define GLEW_EXT_cull_vertex GLEW_GET_VAR(__GLEW_EXT_cull_vertex) - -#endif /* GL_EXT_cull_vertex */ - -/* --------------------------- GL_EXT_debug_label -------------------------- */ - -#ifndef GL_EXT_debug_label -#define GL_EXT_debug_label 1 - -#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F -#define GL_PROGRAM_OBJECT_EXT 0x8B40 -#define GL_SHADER_OBJECT_EXT 0x8B48 -#define GL_BUFFER_OBJECT_EXT 0x9151 -#define GL_QUERY_OBJECT_EXT 0x9153 -#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 - -typedef void (GLAPIENTRY * PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei* length, GLchar *label); -typedef void (GLAPIENTRY * PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar* label); - -#define glGetObjectLabelEXT GLEW_GET_FUN(__glewGetObjectLabelEXT) -#define glLabelObjectEXT GLEW_GET_FUN(__glewLabelObjectEXT) - -#define GLEW_EXT_debug_label GLEW_GET_VAR(__GLEW_EXT_debug_label) - -#endif /* GL_EXT_debug_label */ - -/* -------------------------- GL_EXT_debug_marker -------------------------- */ - -#ifndef GL_EXT_debug_marker -#define GL_EXT_debug_marker 1 - -typedef void (GLAPIENTRY * PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar* marker); -typedef void (GLAPIENTRY * PFNGLPOPGROUPMARKEREXTPROC) (void); -typedef void (GLAPIENTRY * PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar* marker); - -#define glInsertEventMarkerEXT GLEW_GET_FUN(__glewInsertEventMarkerEXT) -#define glPopGroupMarkerEXT GLEW_GET_FUN(__glewPopGroupMarkerEXT) -#define glPushGroupMarkerEXT GLEW_GET_FUN(__glewPushGroupMarkerEXT) - -#define GLEW_EXT_debug_marker GLEW_GET_VAR(__GLEW_EXT_debug_marker) - -#endif /* GL_EXT_debug_marker */ - -/* ------------------------ GL_EXT_depth_bounds_test ----------------------- */ - -#ifndef GL_EXT_depth_bounds_test -#define GL_EXT_depth_bounds_test 1 - -#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 -#define GL_DEPTH_BOUNDS_EXT 0x8891 - -typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); - -#define glDepthBoundsEXT GLEW_GET_FUN(__glewDepthBoundsEXT) - -#define GLEW_EXT_depth_bounds_test GLEW_GET_VAR(__GLEW_EXT_depth_bounds_test) - -#endif /* GL_EXT_depth_bounds_test */ - -/* --------------------------- GL_EXT_depth_clamp -------------------------- */ - -#ifndef GL_EXT_depth_clamp -#define GL_EXT_depth_clamp 1 - -#define GL_DEPTH_CLAMP_EXT 0x864F - -#define GLEW_EXT_depth_clamp GLEW_GET_VAR(__GLEW_EXT_depth_clamp) - -#endif /* GL_EXT_depth_clamp */ - -/* ----------------------- GL_EXT_direct_state_access ---------------------- */ - -#ifndef GL_EXT_direct_state_access -#define GL_EXT_direct_state_access 1 - -#define GL_PROGRAM_MATRIX_EXT 0x8E2D -#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E -#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F - -typedef void (GLAPIENTRY * PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); -typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); -typedef void (GLAPIENTRY * PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); -typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); -typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); -typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); -typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); -typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); -typedef void (GLAPIENTRY * PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); -typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, void *img); -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, void *img); -typedef void (GLAPIENTRY * PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void** params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); -typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void *string); -typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, void** params); -typedef void (GLAPIENTRY * PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void** params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); -typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void** param); -typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, void** param); -typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); -typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (GLAPIENTRY * PFNGLMATRIXFRUSTUMEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f); -typedef void (GLAPIENTRY * PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum matrixMode); -typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m); -typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXLOADDEXTPROC) (GLenum matrixMode, const GLdouble* m); -typedef void (GLAPIENTRY * PFNGLMATRIXLOADFEXTPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m); -typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXMULTDEXTPROC) (GLenum matrixMode, const GLdouble* m); -typedef void (GLAPIENTRY * PFNGLMATRIXMULTFEXTPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXORTHOEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f); -typedef void (GLAPIENTRY * PFNGLMATRIXPOPEXTPROC) (GLenum matrixMode); -typedef void (GLAPIENTRY * PFNGLMATRIXPUSHEXTPROC) (GLenum matrixMode); -typedef void (GLAPIENTRY * PFNGLMATRIXROTATEDEXTPROC) (GLenum matrixMode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLMATRIXROTATEFEXTPROC) (GLenum matrixMode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLMATRIXSCALEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLMATRIXSCALEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (GLAPIENTRY * PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); -typedef void (GLAPIENTRY * PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* param); -typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* param); -typedef void (GLAPIENTRY * PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); -typedef void (GLAPIENTRY * PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint* params); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint* params); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); -typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); -typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat* param); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* param); -typedef void (GLAPIENTRY * PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC) (GLuint vaobj, GLuint index, GLuint divisor); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); - -#define glBindMultiTextureEXT GLEW_GET_FUN(__glewBindMultiTextureEXT) -#define glCheckNamedFramebufferStatusEXT GLEW_GET_FUN(__glewCheckNamedFramebufferStatusEXT) -#define glClientAttribDefaultEXT GLEW_GET_FUN(__glewClientAttribDefaultEXT) -#define glCompressedMultiTexImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage1DEXT) -#define glCompressedMultiTexImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage2DEXT) -#define glCompressedMultiTexImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage3DEXT) -#define glCompressedMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage1DEXT) -#define glCompressedMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage2DEXT) -#define glCompressedMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage3DEXT) -#define glCompressedTextureImage1DEXT GLEW_GET_FUN(__glewCompressedTextureImage1DEXT) -#define glCompressedTextureImage2DEXT GLEW_GET_FUN(__glewCompressedTextureImage2DEXT) -#define glCompressedTextureImage3DEXT GLEW_GET_FUN(__glewCompressedTextureImage3DEXT) -#define glCompressedTextureSubImage1DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage1DEXT) -#define glCompressedTextureSubImage2DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage2DEXT) -#define glCompressedTextureSubImage3DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage3DEXT) -#define glCopyMultiTexImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexImage1DEXT) -#define glCopyMultiTexImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexImage2DEXT) -#define glCopyMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage1DEXT) -#define glCopyMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage2DEXT) -#define glCopyMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage3DEXT) -#define glCopyTextureImage1DEXT GLEW_GET_FUN(__glewCopyTextureImage1DEXT) -#define glCopyTextureImage2DEXT GLEW_GET_FUN(__glewCopyTextureImage2DEXT) -#define glCopyTextureSubImage1DEXT GLEW_GET_FUN(__glewCopyTextureSubImage1DEXT) -#define glCopyTextureSubImage2DEXT GLEW_GET_FUN(__glewCopyTextureSubImage2DEXT) -#define glCopyTextureSubImage3DEXT GLEW_GET_FUN(__glewCopyTextureSubImage3DEXT) -#define glDisableClientStateIndexedEXT GLEW_GET_FUN(__glewDisableClientStateIndexedEXT) -#define glDisableClientStateiEXT GLEW_GET_FUN(__glewDisableClientStateiEXT) -#define glDisableVertexArrayAttribEXT GLEW_GET_FUN(__glewDisableVertexArrayAttribEXT) -#define glDisableVertexArrayEXT GLEW_GET_FUN(__glewDisableVertexArrayEXT) -#define glEnableClientStateIndexedEXT GLEW_GET_FUN(__glewEnableClientStateIndexedEXT) -#define glEnableClientStateiEXT GLEW_GET_FUN(__glewEnableClientStateiEXT) -#define glEnableVertexArrayAttribEXT GLEW_GET_FUN(__glewEnableVertexArrayAttribEXT) -#define glEnableVertexArrayEXT GLEW_GET_FUN(__glewEnableVertexArrayEXT) -#define glFlushMappedNamedBufferRangeEXT GLEW_GET_FUN(__glewFlushMappedNamedBufferRangeEXT) -#define glFramebufferDrawBufferEXT GLEW_GET_FUN(__glewFramebufferDrawBufferEXT) -#define glFramebufferDrawBuffersEXT GLEW_GET_FUN(__glewFramebufferDrawBuffersEXT) -#define glFramebufferReadBufferEXT GLEW_GET_FUN(__glewFramebufferReadBufferEXT) -#define glGenerateMultiTexMipmapEXT GLEW_GET_FUN(__glewGenerateMultiTexMipmapEXT) -#define glGenerateTextureMipmapEXT GLEW_GET_FUN(__glewGenerateTextureMipmapEXT) -#define glGetCompressedMultiTexImageEXT GLEW_GET_FUN(__glewGetCompressedMultiTexImageEXT) -#define glGetCompressedTextureImageEXT GLEW_GET_FUN(__glewGetCompressedTextureImageEXT) -#define glGetDoubleIndexedvEXT GLEW_GET_FUN(__glewGetDoubleIndexedvEXT) -#define glGetDoublei_vEXT GLEW_GET_FUN(__glewGetDoublei_vEXT) -#define glGetFloatIndexedvEXT GLEW_GET_FUN(__glewGetFloatIndexedvEXT) -#define glGetFloati_vEXT GLEW_GET_FUN(__glewGetFloati_vEXT) -#define glGetFramebufferParameterivEXT GLEW_GET_FUN(__glewGetFramebufferParameterivEXT) -#define glGetMultiTexEnvfvEXT GLEW_GET_FUN(__glewGetMultiTexEnvfvEXT) -#define glGetMultiTexEnvivEXT GLEW_GET_FUN(__glewGetMultiTexEnvivEXT) -#define glGetMultiTexGendvEXT GLEW_GET_FUN(__glewGetMultiTexGendvEXT) -#define glGetMultiTexGenfvEXT GLEW_GET_FUN(__glewGetMultiTexGenfvEXT) -#define glGetMultiTexGenivEXT GLEW_GET_FUN(__glewGetMultiTexGenivEXT) -#define glGetMultiTexImageEXT GLEW_GET_FUN(__glewGetMultiTexImageEXT) -#define glGetMultiTexLevelParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterfvEXT) -#define glGetMultiTexLevelParameterivEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterivEXT) -#define glGetMultiTexParameterIivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIivEXT) -#define glGetMultiTexParameterIuivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIuivEXT) -#define glGetMultiTexParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexParameterfvEXT) -#define glGetMultiTexParameterivEXT GLEW_GET_FUN(__glewGetMultiTexParameterivEXT) -#define glGetNamedBufferParameterivEXT GLEW_GET_FUN(__glewGetNamedBufferParameterivEXT) -#define glGetNamedBufferPointervEXT GLEW_GET_FUN(__glewGetNamedBufferPointervEXT) -#define glGetNamedBufferSubDataEXT GLEW_GET_FUN(__glewGetNamedBufferSubDataEXT) -#define glGetNamedFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferAttachmentParameterivEXT) -#define glGetNamedProgramLocalParameterIivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIivEXT) -#define glGetNamedProgramLocalParameterIuivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIuivEXT) -#define glGetNamedProgramLocalParameterdvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterdvEXT) -#define glGetNamedProgramLocalParameterfvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterfvEXT) -#define glGetNamedProgramStringEXT GLEW_GET_FUN(__glewGetNamedProgramStringEXT) -#define glGetNamedProgramivEXT GLEW_GET_FUN(__glewGetNamedProgramivEXT) -#define glGetNamedRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetNamedRenderbufferParameterivEXT) -#define glGetPointerIndexedvEXT GLEW_GET_FUN(__glewGetPointerIndexedvEXT) -#define glGetPointeri_vEXT GLEW_GET_FUN(__glewGetPointeri_vEXT) -#define glGetTextureImageEXT GLEW_GET_FUN(__glewGetTextureImageEXT) -#define glGetTextureLevelParameterfvEXT GLEW_GET_FUN(__glewGetTextureLevelParameterfvEXT) -#define glGetTextureLevelParameterivEXT GLEW_GET_FUN(__glewGetTextureLevelParameterivEXT) -#define glGetTextureParameterIivEXT GLEW_GET_FUN(__glewGetTextureParameterIivEXT) -#define glGetTextureParameterIuivEXT GLEW_GET_FUN(__glewGetTextureParameterIuivEXT) -#define glGetTextureParameterfvEXT GLEW_GET_FUN(__glewGetTextureParameterfvEXT) -#define glGetTextureParameterivEXT GLEW_GET_FUN(__glewGetTextureParameterivEXT) -#define glGetVertexArrayIntegeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayIntegeri_vEXT) -#define glGetVertexArrayIntegervEXT GLEW_GET_FUN(__glewGetVertexArrayIntegervEXT) -#define glGetVertexArrayPointeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayPointeri_vEXT) -#define glGetVertexArrayPointervEXT GLEW_GET_FUN(__glewGetVertexArrayPointervEXT) -#define glMapNamedBufferEXT GLEW_GET_FUN(__glewMapNamedBufferEXT) -#define glMapNamedBufferRangeEXT GLEW_GET_FUN(__glewMapNamedBufferRangeEXT) -#define glMatrixFrustumEXT GLEW_GET_FUN(__glewMatrixFrustumEXT) -#define glMatrixLoadIdentityEXT GLEW_GET_FUN(__glewMatrixLoadIdentityEXT) -#define glMatrixLoadTransposedEXT GLEW_GET_FUN(__glewMatrixLoadTransposedEXT) -#define glMatrixLoadTransposefEXT GLEW_GET_FUN(__glewMatrixLoadTransposefEXT) -#define glMatrixLoaddEXT GLEW_GET_FUN(__glewMatrixLoaddEXT) -#define glMatrixLoadfEXT GLEW_GET_FUN(__glewMatrixLoadfEXT) -#define glMatrixMultTransposedEXT GLEW_GET_FUN(__glewMatrixMultTransposedEXT) -#define glMatrixMultTransposefEXT GLEW_GET_FUN(__glewMatrixMultTransposefEXT) -#define glMatrixMultdEXT GLEW_GET_FUN(__glewMatrixMultdEXT) -#define glMatrixMultfEXT GLEW_GET_FUN(__glewMatrixMultfEXT) -#define glMatrixOrthoEXT GLEW_GET_FUN(__glewMatrixOrthoEXT) -#define glMatrixPopEXT GLEW_GET_FUN(__glewMatrixPopEXT) -#define glMatrixPushEXT GLEW_GET_FUN(__glewMatrixPushEXT) -#define glMatrixRotatedEXT GLEW_GET_FUN(__glewMatrixRotatedEXT) -#define glMatrixRotatefEXT GLEW_GET_FUN(__glewMatrixRotatefEXT) -#define glMatrixScaledEXT GLEW_GET_FUN(__glewMatrixScaledEXT) -#define glMatrixScalefEXT GLEW_GET_FUN(__glewMatrixScalefEXT) -#define glMatrixTranslatedEXT GLEW_GET_FUN(__glewMatrixTranslatedEXT) -#define glMatrixTranslatefEXT GLEW_GET_FUN(__glewMatrixTranslatefEXT) -#define glMultiTexBufferEXT GLEW_GET_FUN(__glewMultiTexBufferEXT) -#define glMultiTexCoordPointerEXT GLEW_GET_FUN(__glewMultiTexCoordPointerEXT) -#define glMultiTexEnvfEXT GLEW_GET_FUN(__glewMultiTexEnvfEXT) -#define glMultiTexEnvfvEXT GLEW_GET_FUN(__glewMultiTexEnvfvEXT) -#define glMultiTexEnviEXT GLEW_GET_FUN(__glewMultiTexEnviEXT) -#define glMultiTexEnvivEXT GLEW_GET_FUN(__glewMultiTexEnvivEXT) -#define glMultiTexGendEXT GLEW_GET_FUN(__glewMultiTexGendEXT) -#define glMultiTexGendvEXT GLEW_GET_FUN(__glewMultiTexGendvEXT) -#define glMultiTexGenfEXT GLEW_GET_FUN(__glewMultiTexGenfEXT) -#define glMultiTexGenfvEXT GLEW_GET_FUN(__glewMultiTexGenfvEXT) -#define glMultiTexGeniEXT GLEW_GET_FUN(__glewMultiTexGeniEXT) -#define glMultiTexGenivEXT GLEW_GET_FUN(__glewMultiTexGenivEXT) -#define glMultiTexImage1DEXT GLEW_GET_FUN(__glewMultiTexImage1DEXT) -#define glMultiTexImage2DEXT GLEW_GET_FUN(__glewMultiTexImage2DEXT) -#define glMultiTexImage3DEXT GLEW_GET_FUN(__glewMultiTexImage3DEXT) -#define glMultiTexParameterIivEXT GLEW_GET_FUN(__glewMultiTexParameterIivEXT) -#define glMultiTexParameterIuivEXT GLEW_GET_FUN(__glewMultiTexParameterIuivEXT) -#define glMultiTexParameterfEXT GLEW_GET_FUN(__glewMultiTexParameterfEXT) -#define glMultiTexParameterfvEXT GLEW_GET_FUN(__glewMultiTexParameterfvEXT) -#define glMultiTexParameteriEXT GLEW_GET_FUN(__glewMultiTexParameteriEXT) -#define glMultiTexParameterivEXT GLEW_GET_FUN(__glewMultiTexParameterivEXT) -#define glMultiTexRenderbufferEXT GLEW_GET_FUN(__glewMultiTexRenderbufferEXT) -#define glMultiTexSubImage1DEXT GLEW_GET_FUN(__glewMultiTexSubImage1DEXT) -#define glMultiTexSubImage2DEXT GLEW_GET_FUN(__glewMultiTexSubImage2DEXT) -#define glMultiTexSubImage3DEXT GLEW_GET_FUN(__glewMultiTexSubImage3DEXT) -#define glNamedBufferDataEXT GLEW_GET_FUN(__glewNamedBufferDataEXT) -#define glNamedBufferSubDataEXT GLEW_GET_FUN(__glewNamedBufferSubDataEXT) -#define glNamedCopyBufferSubDataEXT GLEW_GET_FUN(__glewNamedCopyBufferSubDataEXT) -#define glNamedFramebufferRenderbufferEXT GLEW_GET_FUN(__glewNamedFramebufferRenderbufferEXT) -#define glNamedFramebufferTexture1DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture1DEXT) -#define glNamedFramebufferTexture2DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture2DEXT) -#define glNamedFramebufferTexture3DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture3DEXT) -#define glNamedFramebufferTextureEXT GLEW_GET_FUN(__glewNamedFramebufferTextureEXT) -#define glNamedFramebufferTextureFaceEXT GLEW_GET_FUN(__glewNamedFramebufferTextureFaceEXT) -#define glNamedFramebufferTextureLayerEXT GLEW_GET_FUN(__glewNamedFramebufferTextureLayerEXT) -#define glNamedProgramLocalParameter4dEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dEXT) -#define glNamedProgramLocalParameter4dvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dvEXT) -#define glNamedProgramLocalParameter4fEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fEXT) -#define glNamedProgramLocalParameter4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fvEXT) -#define glNamedProgramLocalParameterI4iEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4iEXT) -#define glNamedProgramLocalParameterI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4ivEXT) -#define glNamedProgramLocalParameterI4uiEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uiEXT) -#define glNamedProgramLocalParameterI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uivEXT) -#define glNamedProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameters4fvEXT) -#define glNamedProgramLocalParametersI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4ivEXT) -#define glNamedProgramLocalParametersI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4uivEXT) -#define glNamedProgramStringEXT GLEW_GET_FUN(__glewNamedProgramStringEXT) -#define glNamedRenderbufferStorageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageEXT) -#define glNamedRenderbufferStorageMultisampleCoverageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleCoverageEXT) -#define glNamedRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleEXT) -#define glProgramUniform1fEXT GLEW_GET_FUN(__glewProgramUniform1fEXT) -#define glProgramUniform1fvEXT GLEW_GET_FUN(__glewProgramUniform1fvEXT) -#define glProgramUniform1iEXT GLEW_GET_FUN(__glewProgramUniform1iEXT) -#define glProgramUniform1ivEXT GLEW_GET_FUN(__glewProgramUniform1ivEXT) -#define glProgramUniform1uiEXT GLEW_GET_FUN(__glewProgramUniform1uiEXT) -#define glProgramUniform1uivEXT GLEW_GET_FUN(__glewProgramUniform1uivEXT) -#define glProgramUniform2fEXT GLEW_GET_FUN(__glewProgramUniform2fEXT) -#define glProgramUniform2fvEXT GLEW_GET_FUN(__glewProgramUniform2fvEXT) -#define glProgramUniform2iEXT GLEW_GET_FUN(__glewProgramUniform2iEXT) -#define glProgramUniform2ivEXT GLEW_GET_FUN(__glewProgramUniform2ivEXT) -#define glProgramUniform2uiEXT GLEW_GET_FUN(__glewProgramUniform2uiEXT) -#define glProgramUniform2uivEXT GLEW_GET_FUN(__glewProgramUniform2uivEXT) -#define glProgramUniform3fEXT GLEW_GET_FUN(__glewProgramUniform3fEXT) -#define glProgramUniform3fvEXT GLEW_GET_FUN(__glewProgramUniform3fvEXT) -#define glProgramUniform3iEXT GLEW_GET_FUN(__glewProgramUniform3iEXT) -#define glProgramUniform3ivEXT GLEW_GET_FUN(__glewProgramUniform3ivEXT) -#define glProgramUniform3uiEXT GLEW_GET_FUN(__glewProgramUniform3uiEXT) -#define glProgramUniform3uivEXT GLEW_GET_FUN(__glewProgramUniform3uivEXT) -#define glProgramUniform4fEXT GLEW_GET_FUN(__glewProgramUniform4fEXT) -#define glProgramUniform4fvEXT GLEW_GET_FUN(__glewProgramUniform4fvEXT) -#define glProgramUniform4iEXT GLEW_GET_FUN(__glewProgramUniform4iEXT) -#define glProgramUniform4ivEXT GLEW_GET_FUN(__glewProgramUniform4ivEXT) -#define glProgramUniform4uiEXT GLEW_GET_FUN(__glewProgramUniform4uiEXT) -#define glProgramUniform4uivEXT GLEW_GET_FUN(__glewProgramUniform4uivEXT) -#define glProgramUniformMatrix2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2fvEXT) -#define glProgramUniformMatrix2x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x3fvEXT) -#define glProgramUniformMatrix2x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x4fvEXT) -#define glProgramUniformMatrix3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3fvEXT) -#define glProgramUniformMatrix3x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x2fvEXT) -#define glProgramUniformMatrix3x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x4fvEXT) -#define glProgramUniformMatrix4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4fvEXT) -#define glProgramUniformMatrix4x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x2fvEXT) -#define glProgramUniformMatrix4x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x3fvEXT) -#define glPushClientAttribDefaultEXT GLEW_GET_FUN(__glewPushClientAttribDefaultEXT) -#define glTextureBufferEXT GLEW_GET_FUN(__glewTextureBufferEXT) -#define glTextureImage1DEXT GLEW_GET_FUN(__glewTextureImage1DEXT) -#define glTextureImage2DEXT GLEW_GET_FUN(__glewTextureImage2DEXT) -#define glTextureImage3DEXT GLEW_GET_FUN(__glewTextureImage3DEXT) -#define glTextureParameterIivEXT GLEW_GET_FUN(__glewTextureParameterIivEXT) -#define glTextureParameterIuivEXT GLEW_GET_FUN(__glewTextureParameterIuivEXT) -#define glTextureParameterfEXT GLEW_GET_FUN(__glewTextureParameterfEXT) -#define glTextureParameterfvEXT GLEW_GET_FUN(__glewTextureParameterfvEXT) -#define glTextureParameteriEXT GLEW_GET_FUN(__glewTextureParameteriEXT) -#define glTextureParameterivEXT GLEW_GET_FUN(__glewTextureParameterivEXT) -#define glTextureRenderbufferEXT GLEW_GET_FUN(__glewTextureRenderbufferEXT) -#define glTextureSubImage1DEXT GLEW_GET_FUN(__glewTextureSubImage1DEXT) -#define glTextureSubImage2DEXT GLEW_GET_FUN(__glewTextureSubImage2DEXT) -#define glTextureSubImage3DEXT GLEW_GET_FUN(__glewTextureSubImage3DEXT) -#define glUnmapNamedBufferEXT GLEW_GET_FUN(__glewUnmapNamedBufferEXT) -#define glVertexArrayColorOffsetEXT GLEW_GET_FUN(__glewVertexArrayColorOffsetEXT) -#define glVertexArrayEdgeFlagOffsetEXT GLEW_GET_FUN(__glewVertexArrayEdgeFlagOffsetEXT) -#define glVertexArrayFogCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayFogCoordOffsetEXT) -#define glVertexArrayIndexOffsetEXT GLEW_GET_FUN(__glewVertexArrayIndexOffsetEXT) -#define glVertexArrayMultiTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayMultiTexCoordOffsetEXT) -#define glVertexArrayNormalOffsetEXT GLEW_GET_FUN(__glewVertexArrayNormalOffsetEXT) -#define glVertexArraySecondaryColorOffsetEXT GLEW_GET_FUN(__glewVertexArraySecondaryColorOffsetEXT) -#define glVertexArrayTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayTexCoordOffsetEXT) -#define glVertexArrayVertexAttribDivisorEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribDivisorEXT) -#define glVertexArrayVertexAttribIOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIOffsetEXT) -#define glVertexArrayVertexAttribOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribOffsetEXT) -#define glVertexArrayVertexOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexOffsetEXT) - -#define GLEW_EXT_direct_state_access GLEW_GET_VAR(__GLEW_EXT_direct_state_access) - -#endif /* GL_EXT_direct_state_access */ - -/* ----------------------- GL_EXT_discard_framebuffer ---------------------- */ - -#ifndef GL_EXT_discard_framebuffer -#define GL_EXT_discard_framebuffer 1 - -#define GL_COLOR_EXT 0x1800 -#define GL_DEPTH_EXT 0x1801 -#define GL_STENCIL_EXT 0x1802 - -typedef void (GLAPIENTRY * PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments); - -#define glDiscardFramebufferEXT GLEW_GET_FUN(__glewDiscardFramebufferEXT) - -#define GLEW_EXT_discard_framebuffer GLEW_GET_VAR(__GLEW_EXT_discard_framebuffer) - -#endif /* GL_EXT_discard_framebuffer */ - -/* ---------------------- GL_EXT_disjoint_timer_query ---------------------- */ - -#ifndef GL_EXT_disjoint_timer_query -#define GL_EXT_disjoint_timer_query 1 - -#define GL_QUERY_COUNTER_BITS_EXT 0x8864 -#define GL_CURRENT_QUERY_EXT 0x8865 -#define GL_QUERY_RESULT_EXT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_EXT 0x8867 -#define GL_TIME_ELAPSED_EXT 0x88BF -#define GL_TIMESTAMP_EXT 0x8E28 -#define GL_GPU_DISJOINT_EXT 0x8FBB - -typedef void (GLAPIENTRY * PFNGLBEGINQUERYEXTPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETEQUERIESEXTPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLENDQUERYEXTPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLGENQUERIESEXTPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLGETINTEGER64VEXTPROC) (GLenum pname, GLint64* data); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVEXTPROC) (GLuint id, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVEXTPROC) (GLuint id, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYIVEXTPROC) (GLenum target, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISQUERYEXTPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLQUERYCOUNTEREXTPROC) (GLuint id, GLenum target); - -#define glBeginQueryEXT GLEW_GET_FUN(__glewBeginQueryEXT) -#define glDeleteQueriesEXT GLEW_GET_FUN(__glewDeleteQueriesEXT) -#define glEndQueryEXT GLEW_GET_FUN(__glewEndQueryEXT) -#define glGenQueriesEXT GLEW_GET_FUN(__glewGenQueriesEXT) -#define glGetInteger64vEXT GLEW_GET_FUN(__glewGetInteger64vEXT) -#define glGetQueryObjectivEXT GLEW_GET_FUN(__glewGetQueryObjectivEXT) -#define glGetQueryObjectuivEXT GLEW_GET_FUN(__glewGetQueryObjectuivEXT) -#define glGetQueryivEXT GLEW_GET_FUN(__glewGetQueryivEXT) -#define glIsQueryEXT GLEW_GET_FUN(__glewIsQueryEXT) -#define glQueryCounterEXT GLEW_GET_FUN(__glewQueryCounterEXT) - -#define GLEW_EXT_disjoint_timer_query GLEW_GET_VAR(__GLEW_EXT_disjoint_timer_query) - -#endif /* GL_EXT_disjoint_timer_query */ - -/* -------------------------- GL_EXT_draw_buffers -------------------------- */ - -#ifndef GL_EXT_draw_buffers -#define GL_EXT_draw_buffers 1 - -#define GL_MAX_DRAW_BUFFERS_EXT 0x8824 -#define GL_DRAW_BUFFER0_EXT 0x8825 -#define GL_DRAW_BUFFER1_EXT 0x8826 -#define GL_DRAW_BUFFER2_EXT 0x8827 -#define GL_DRAW_BUFFER3_EXT 0x8828 -#define GL_DRAW_BUFFER4_EXT 0x8829 -#define GL_DRAW_BUFFER5_EXT 0x882A -#define GL_DRAW_BUFFER6_EXT 0x882B -#define GL_DRAW_BUFFER7_EXT 0x882C -#define GL_DRAW_BUFFER8_EXT 0x882D -#define GL_DRAW_BUFFER9_EXT 0x882E -#define GL_DRAW_BUFFER10_EXT 0x882F -#define GL_DRAW_BUFFER11_EXT 0x8830 -#define GL_DRAW_BUFFER12_EXT 0x8831 -#define GL_DRAW_BUFFER13_EXT 0x8832 -#define GL_DRAW_BUFFER14_EXT 0x8833 -#define GL_DRAW_BUFFER15_EXT 0x8834 -#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF -#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 -#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 -#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 -#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 -#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 -#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 -#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 -#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 -#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 -#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 -#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA -#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB -#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC -#define GL_COLOR_ATTACHMENT13_EXT 0x8CED -#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE -#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF - -typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSEXTPROC) (GLsizei n, const GLenum* bufs); - -#define glDrawBuffersEXT GLEW_GET_FUN(__glewDrawBuffersEXT) - -#define GLEW_EXT_draw_buffers GLEW_GET_VAR(__GLEW_EXT_draw_buffers) - -#endif /* GL_EXT_draw_buffers */ - -/* -------------------------- GL_EXT_draw_buffers2 ------------------------- */ - -#ifndef GL_EXT_draw_buffers2 -#define GL_EXT_draw_buffers2 1 - -typedef void (GLAPIENTRY * PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef void (GLAPIENTRY * PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); -typedef void (GLAPIENTRY * PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum value, GLuint index, GLboolean* data); -typedef void (GLAPIENTRY * PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum value, GLuint index, GLint* data); -typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); - -#define glColorMaskIndexedEXT GLEW_GET_FUN(__glewColorMaskIndexedEXT) -#define glDisableIndexedEXT GLEW_GET_FUN(__glewDisableIndexedEXT) -#define glEnableIndexedEXT GLEW_GET_FUN(__glewEnableIndexedEXT) -#define glGetBooleanIndexedvEXT GLEW_GET_FUN(__glewGetBooleanIndexedvEXT) -#define glGetIntegerIndexedvEXT GLEW_GET_FUN(__glewGetIntegerIndexedvEXT) -#define glIsEnabledIndexedEXT GLEW_GET_FUN(__glewIsEnabledIndexedEXT) - -#define GLEW_EXT_draw_buffers2 GLEW_GET_VAR(__GLEW_EXT_draw_buffers2) - -#endif /* GL_EXT_draw_buffers2 */ - -/* ---------------------- GL_EXT_draw_buffers_indexed ---------------------- */ - -#ifndef GL_EXT_draw_buffers_indexed -#define GL_EXT_draw_buffers_indexed 1 - -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIEXTPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIEXTPROC) (GLuint buf, GLenum mode); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIEXTPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCIEXTPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (GLAPIENTRY * PFNGLCOLORMASKIEXTPROC) (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef void (GLAPIENTRY * PFNGLDISABLEIEXTPROC) (GLenum target, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEIEXTPROC) (GLenum target, GLuint index); -typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDIEXTPROC) (GLenum target, GLuint index); - -#define glBlendEquationSeparateiEXT GLEW_GET_FUN(__glewBlendEquationSeparateiEXT) -#define glBlendEquationiEXT GLEW_GET_FUN(__glewBlendEquationiEXT) -#define glBlendFuncSeparateiEXT GLEW_GET_FUN(__glewBlendFuncSeparateiEXT) -#define glBlendFunciEXT GLEW_GET_FUN(__glewBlendFunciEXT) -#define glColorMaskiEXT GLEW_GET_FUN(__glewColorMaskiEXT) -#define glDisableiEXT GLEW_GET_FUN(__glewDisableiEXT) -#define glEnableiEXT GLEW_GET_FUN(__glewEnableiEXT) -#define glIsEnablediEXT GLEW_GET_FUN(__glewIsEnablediEXT) - -#define GLEW_EXT_draw_buffers_indexed GLEW_GET_VAR(__GLEW_EXT_draw_buffers_indexed) - -#endif /* GL_EXT_draw_buffers_indexed */ - -/* -------------------- GL_EXT_draw_elements_base_vertex ------------------- */ - -#ifndef GL_EXT_draw_elements_base_vertex -#define GL_EXT_draw_elements_base_vertex 1 - -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); -typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, const GLsizei* count, GLenum type, const void *const *indices, GLsizei primcount, const GLint *basevertex); - -#define glDrawElementsBaseVertexEXT GLEW_GET_FUN(__glewDrawElementsBaseVertexEXT) -#define glDrawElementsInstancedBaseVertexEXT GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertexEXT) -#define glDrawRangeElementsBaseVertexEXT GLEW_GET_FUN(__glewDrawRangeElementsBaseVertexEXT) -#define glMultiDrawElementsBaseVertexEXT GLEW_GET_FUN(__glewMultiDrawElementsBaseVertexEXT) - -#define GLEW_EXT_draw_elements_base_vertex GLEW_GET_VAR(__GLEW_EXT_draw_elements_base_vertex) - -#endif /* GL_EXT_draw_elements_base_vertex */ - -/* ------------------------- GL_EXT_draw_instanced ------------------------- */ - -#ifndef GL_EXT_draw_instanced -#define GL_EXT_draw_instanced 1 - -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); - -#define glDrawArraysInstancedEXT GLEW_GET_FUN(__glewDrawArraysInstancedEXT) -#define glDrawElementsInstancedEXT GLEW_GET_FUN(__glewDrawElementsInstancedEXT) - -#define GLEW_EXT_draw_instanced GLEW_GET_VAR(__GLEW_EXT_draw_instanced) - -#endif /* GL_EXT_draw_instanced */ - -/* ----------------------- GL_EXT_draw_range_elements ---------------------- */ - -#ifndef GL_EXT_draw_range_elements -#define GL_EXT_draw_range_elements 1 - -#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 -#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 - -typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); - -#define glDrawRangeElementsEXT GLEW_GET_FUN(__glewDrawRangeElementsEXT) - -#define GLEW_EXT_draw_range_elements GLEW_GET_VAR(__GLEW_EXT_draw_range_elements) - -#endif /* GL_EXT_draw_range_elements */ - -/* --------------------- GL_EXT_draw_transform_feedback -------------------- */ - -#ifndef GL_EXT_draw_transform_feedback -#define GL_EXT_draw_transform_feedback 1 - -typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKEXTPROC) (GLenum mode, GLuint id); -typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDEXTPROC) (GLenum mode, GLuint id, GLsizei instancecount); - -#define glDrawTransformFeedbackEXT GLEW_GET_FUN(__glewDrawTransformFeedbackEXT) -#define glDrawTransformFeedbackInstancedEXT GLEW_GET_FUN(__glewDrawTransformFeedbackInstancedEXT) - -#define GLEW_EXT_draw_transform_feedback GLEW_GET_VAR(__GLEW_EXT_draw_transform_feedback) - -#endif /* GL_EXT_draw_transform_feedback */ - -/* ------------------------- GL_EXT_external_buffer ------------------------ */ - -#ifndef GL_EXT_external_buffer -#define GL_EXT_external_buffer 1 - -typedef void* GLeglClientBufferEXT; - -typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEEXTERNALEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); - -#define glBufferStorageExternalEXT GLEW_GET_FUN(__glewBufferStorageExternalEXT) -#define glNamedBufferStorageExternalEXT GLEW_GET_FUN(__glewNamedBufferStorageExternalEXT) - -#define GLEW_EXT_external_buffer GLEW_GET_VAR(__GLEW_EXT_external_buffer) - -#endif /* GL_EXT_external_buffer */ - -/* --------------------------- GL_EXT_float_blend -------------------------- */ - -#ifndef GL_EXT_float_blend -#define GL_EXT_float_blend 1 - -#define GLEW_EXT_float_blend GLEW_GET_VAR(__GLEW_EXT_float_blend) - -#endif /* GL_EXT_float_blend */ - -/* ---------------------------- GL_EXT_fog_coord --------------------------- */ - -#ifndef GL_EXT_fog_coord -#define GL_EXT_fog_coord 1 - -#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 -#define GL_FOG_COORDINATE_EXT 0x8451 -#define GL_FRAGMENT_DEPTH_EXT 0x8452 -#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 -#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 - -typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); -typedef void (GLAPIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); - -#define glFogCoordPointerEXT GLEW_GET_FUN(__glewFogCoordPointerEXT) -#define glFogCoorddEXT GLEW_GET_FUN(__glewFogCoorddEXT) -#define glFogCoorddvEXT GLEW_GET_FUN(__glewFogCoorddvEXT) -#define glFogCoordfEXT GLEW_GET_FUN(__glewFogCoordfEXT) -#define glFogCoordfvEXT GLEW_GET_FUN(__glewFogCoordfvEXT) - -#define GLEW_EXT_fog_coord GLEW_GET_VAR(__GLEW_EXT_fog_coord) - -#endif /* GL_EXT_fog_coord */ - -/* --------------------------- GL_EXT_frag_depth --------------------------- */ - -#ifndef GL_EXT_frag_depth -#define GL_EXT_frag_depth 1 - -#define GLEW_EXT_frag_depth GLEW_GET_VAR(__GLEW_EXT_frag_depth) - -#endif /* GL_EXT_frag_depth */ - -/* ------------------------ GL_EXT_fragment_lighting ----------------------- */ - -#ifndef GL_EXT_fragment_lighting -#define GL_EXT_fragment_lighting 1 - -#define GL_FRAGMENT_LIGHTING_EXT 0x8400 -#define GL_FRAGMENT_COLOR_MATERIAL_EXT 0x8401 -#define GL_FRAGMENT_COLOR_MATERIAL_FACE_EXT 0x8402 -#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_EXT 0x8403 -#define GL_MAX_FRAGMENT_LIGHTS_EXT 0x8404 -#define GL_MAX_ACTIVE_LIGHTS_EXT 0x8405 -#define GL_CURRENT_RASTER_NORMAL_EXT 0x8406 -#define GL_LIGHT_ENV_MODE_EXT 0x8407 -#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_EXT 0x8408 -#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_EXT 0x8409 -#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_EXT 0x840A -#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_EXT 0x840B -#define GL_FRAGMENT_LIGHT0_EXT 0x840C -#define GL_FRAGMENT_LIGHT7_EXT 0x8413 - -typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALEXTPROC) (GLenum face, GLenum mode); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFEXTPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVEXTPROC) (GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIEXTPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVEXTPROC) (GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFEXTPROC) (GLenum light, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIEXTPROC) (GLenum light, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFEXTPROC) (GLenum face, GLenum pname, const GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIEXTPROC) (GLenum face, GLenum pname, const GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLLIGHTENVIEXTPROC) (GLenum pname, GLint param); - -#define glFragmentColorMaterialEXT GLEW_GET_FUN(__glewFragmentColorMaterialEXT) -#define glFragmentLightModelfEXT GLEW_GET_FUN(__glewFragmentLightModelfEXT) -#define glFragmentLightModelfvEXT GLEW_GET_FUN(__glewFragmentLightModelfvEXT) -#define glFragmentLightModeliEXT GLEW_GET_FUN(__glewFragmentLightModeliEXT) -#define glFragmentLightModelivEXT GLEW_GET_FUN(__glewFragmentLightModelivEXT) -#define glFragmentLightfEXT GLEW_GET_FUN(__glewFragmentLightfEXT) -#define glFragmentLightfvEXT GLEW_GET_FUN(__glewFragmentLightfvEXT) -#define glFragmentLightiEXT GLEW_GET_FUN(__glewFragmentLightiEXT) -#define glFragmentLightivEXT GLEW_GET_FUN(__glewFragmentLightivEXT) -#define glFragmentMaterialfEXT GLEW_GET_FUN(__glewFragmentMaterialfEXT) -#define glFragmentMaterialfvEXT GLEW_GET_FUN(__glewFragmentMaterialfvEXT) -#define glFragmentMaterialiEXT GLEW_GET_FUN(__glewFragmentMaterialiEXT) -#define glFragmentMaterialivEXT GLEW_GET_FUN(__glewFragmentMaterialivEXT) -#define glGetFragmentLightfvEXT GLEW_GET_FUN(__glewGetFragmentLightfvEXT) -#define glGetFragmentLightivEXT GLEW_GET_FUN(__glewGetFragmentLightivEXT) -#define glGetFragmentMaterialfvEXT GLEW_GET_FUN(__glewGetFragmentMaterialfvEXT) -#define glGetFragmentMaterialivEXT GLEW_GET_FUN(__glewGetFragmentMaterialivEXT) -#define glLightEnviEXT GLEW_GET_FUN(__glewLightEnviEXT) - -#define GLEW_EXT_fragment_lighting GLEW_GET_VAR(__GLEW_EXT_fragment_lighting) - -#endif /* GL_EXT_fragment_lighting */ - -/* ------------------------ GL_EXT_framebuffer_blit ------------------------ */ - -#ifndef GL_EXT_framebuffer_blit -#define GL_EXT_framebuffer_blit 1 - -#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 -#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA - -typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); - -#define glBlitFramebufferEXT GLEW_GET_FUN(__glewBlitFramebufferEXT) - -#define GLEW_EXT_framebuffer_blit GLEW_GET_VAR(__GLEW_EXT_framebuffer_blit) - -#endif /* GL_EXT_framebuffer_blit */ - -/* --------------------- GL_EXT_framebuffer_multisample -------------------- */ - -#ifndef GL_EXT_framebuffer_multisample -#define GL_EXT_framebuffer_multisample 1 - -#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 -#define GL_MAX_SAMPLES_EXT 0x8D57 - -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - -#define glRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewRenderbufferStorageMultisampleEXT) - -#define GLEW_EXT_framebuffer_multisample GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample) - -#endif /* GL_EXT_framebuffer_multisample */ - -/* --------------- GL_EXT_framebuffer_multisample_blit_scaled -------------- */ - -#ifndef GL_EXT_framebuffer_multisample_blit_scaled -#define GL_EXT_framebuffer_multisample_blit_scaled 1 - -#define GL_SCALED_RESOLVE_FASTEST_EXT 0x90BA -#define GL_SCALED_RESOLVE_NICEST_EXT 0x90BB - -#define GLEW_EXT_framebuffer_multisample_blit_scaled GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample_blit_scaled) - -#endif /* GL_EXT_framebuffer_multisample_blit_scaled */ - -/* ----------------------- GL_EXT_framebuffer_object ----------------------- */ - -#ifndef GL_EXT_framebuffer_object -#define GL_EXT_framebuffer_object 1 - -#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 -#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 -#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 -#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 -#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD -#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF -#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 -#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 -#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 -#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 -#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 -#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 -#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 -#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 -#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 -#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 -#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA -#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB -#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC -#define GL_COLOR_ATTACHMENT13_EXT 0x8CED -#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE -#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF -#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 -#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 -#define GL_FRAMEBUFFER_EXT 0x8D40 -#define GL_RENDERBUFFER_EXT 0x8D41 -#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 -#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 -#define GL_STENCIL_INDEX1_EXT 0x8D46 -#define GL_STENCIL_INDEX4_EXT 0x8D47 -#define GL_STENCIL_INDEX8_EXT 0x8D48 -#define GL_STENCIL_INDEX16_EXT 0x8D49 -#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 - -typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); -typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); -typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint* framebuffers); -typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint* renderbuffers); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint* framebuffers); -typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint* renderbuffers); -typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); -typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); - -#define glBindFramebufferEXT GLEW_GET_FUN(__glewBindFramebufferEXT) -#define glBindRenderbufferEXT GLEW_GET_FUN(__glewBindRenderbufferEXT) -#define glCheckFramebufferStatusEXT GLEW_GET_FUN(__glewCheckFramebufferStatusEXT) -#define glDeleteFramebuffersEXT GLEW_GET_FUN(__glewDeleteFramebuffersEXT) -#define glDeleteRenderbuffersEXT GLEW_GET_FUN(__glewDeleteRenderbuffersEXT) -#define glFramebufferRenderbufferEXT GLEW_GET_FUN(__glewFramebufferRenderbufferEXT) -#define glFramebufferTexture1DEXT GLEW_GET_FUN(__glewFramebufferTexture1DEXT) -#define glFramebufferTexture2DEXT GLEW_GET_FUN(__glewFramebufferTexture2DEXT) -#define glFramebufferTexture3DEXT GLEW_GET_FUN(__glewFramebufferTexture3DEXT) -#define glGenFramebuffersEXT GLEW_GET_FUN(__glewGenFramebuffersEXT) -#define glGenRenderbuffersEXT GLEW_GET_FUN(__glewGenRenderbuffersEXT) -#define glGenerateMipmapEXT GLEW_GET_FUN(__glewGenerateMipmapEXT) -#define glGetFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetFramebufferAttachmentParameterivEXT) -#define glGetRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetRenderbufferParameterivEXT) -#define glIsFramebufferEXT GLEW_GET_FUN(__glewIsFramebufferEXT) -#define glIsRenderbufferEXT GLEW_GET_FUN(__glewIsRenderbufferEXT) -#define glRenderbufferStorageEXT GLEW_GET_FUN(__glewRenderbufferStorageEXT) - -#define GLEW_EXT_framebuffer_object GLEW_GET_VAR(__GLEW_EXT_framebuffer_object) - -#endif /* GL_EXT_framebuffer_object */ - -/* ------------------------ GL_EXT_framebuffer_sRGB ------------------------ */ - -#ifndef GL_EXT_framebuffer_sRGB -#define GL_EXT_framebuffer_sRGB 1 - -#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 -#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA - -#define GLEW_EXT_framebuffer_sRGB GLEW_GET_VAR(__GLEW_EXT_framebuffer_sRGB) - -#endif /* GL_EXT_framebuffer_sRGB */ - -/* ----------------------- GL_EXT_geometry_point_size ---------------------- */ - -#ifndef GL_EXT_geometry_point_size -#define GL_EXT_geometry_point_size 1 - -#define GL_GEOMETRY_SHADER_BIT_EXT 0x00000004 -#define GL_LINES_ADJACENCY_EXT 0xA -#define GL_LINE_STRIP_ADJACENCY_EXT 0xB -#define GL_TRIANGLES_ADJACENCY_EXT 0xC -#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD -#define GL_LAYER_PROVOKING_VERTEX_EXT 0x825E -#define GL_UNDEFINED_VERTEX_EXT 0x8260 -#define GL_GEOMETRY_SHADER_INVOCATIONS_EXT 0x887F -#define GL_GEOMETRY_LINKED_VERTICES_OUT_EXT 0x8916 -#define GL_GEOMETRY_LINKED_INPUT_TYPE_EXT 0x8917 -#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT 0x8918 -#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT 0x8A2C -#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8A32 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 -#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 -#define GL_GEOMETRY_SHADER_EXT 0x8DD9 -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 -#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D -#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E -#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT 0x8E5A -#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT 0x90CD -#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT 0x90D7 -#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT 0x9123 -#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT 0x9124 -#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 0x92CF -#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT 0x92D5 -#define GL_REFERENCED_BY_GEOMETRY_SHADER_EXT 0x9309 -#define GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT 0x9312 -#define GL_MAX_FRAMEBUFFER_LAYERS_EXT 0x9317 - -#define GLEW_EXT_geometry_point_size GLEW_GET_VAR(__GLEW_EXT_geometry_point_size) - -#endif /* GL_EXT_geometry_point_size */ - -/* ------------------------- GL_EXT_geometry_shader ------------------------ */ - -#ifndef GL_EXT_geometry_shader -#define GL_EXT_geometry_shader 1 - -#define GL_GEOMETRY_SHADER_BIT_EXT 0x00000004 -#define GL_LINES_ADJACENCY_EXT 0xA -#define GL_LINE_STRIP_ADJACENCY_EXT 0xB -#define GL_TRIANGLES_ADJACENCY_EXT 0xC -#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD -#define GL_LAYER_PROVOKING_VERTEX_EXT 0x825E -#define GL_UNDEFINED_VERTEX_EXT 0x8260 -#define GL_GEOMETRY_SHADER_INVOCATIONS_EXT 0x887F -#define GL_GEOMETRY_LINKED_VERTICES_OUT_EXT 0x8916 -#define GL_GEOMETRY_LINKED_INPUT_TYPE_EXT 0x8917 -#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT 0x8918 -#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT 0x8A2C -#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8A32 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 -#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 -#define GL_GEOMETRY_SHADER_EXT 0x8DD9 -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 -#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D -#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E -#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT 0x8E5A -#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT 0x90CD -#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT 0x90D7 -#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT 0x9123 -#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT 0x9124 -#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 0x92CF -#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT 0x92D5 -#define GL_REFERENCED_BY_GEOMETRY_SHADER_EXT 0x9309 -#define GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT 0x9312 -#define GL_MAX_FRAMEBUFFER_LAYERS_EXT 0x9317 - -#define GLEW_EXT_geometry_shader GLEW_GET_VAR(__GLEW_EXT_geometry_shader) - -#endif /* GL_EXT_geometry_shader */ - -/* ------------------------ GL_EXT_geometry_shader4 ------------------------ */ - -#ifndef GL_EXT_geometry_shader4 -#define GL_EXT_geometry_shader4 1 - -#define GL_LINES_ADJACENCY_EXT 0xA -#define GL_LINE_STRIP_ADJACENCY_EXT 0xB -#define GL_TRIANGLES_ADJACENCY_EXT 0xC -#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD -#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 -#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 -#define GL_GEOMETRY_SHADER_EXT 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA -#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB -#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC -#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD -#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); - -#define glFramebufferTextureEXT GLEW_GET_FUN(__glewFramebufferTextureEXT) -#define glFramebufferTextureFaceEXT GLEW_GET_FUN(__glewFramebufferTextureFaceEXT) -#define glProgramParameteriEXT GLEW_GET_FUN(__glewProgramParameteriEXT) - -#define GLEW_EXT_geometry_shader4 GLEW_GET_VAR(__GLEW_EXT_geometry_shader4) - -#endif /* GL_EXT_geometry_shader4 */ - -/* --------------------- GL_EXT_gpu_program_parameters --------------------- */ - -#ifndef GL_EXT_gpu_program_parameters -#define GL_EXT_gpu_program_parameters 1 - -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); - -#define glProgramEnvParameters4fvEXT GLEW_GET_FUN(__glewProgramEnvParameters4fvEXT) -#define glProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewProgramLocalParameters4fvEXT) - -#define GLEW_EXT_gpu_program_parameters GLEW_GET_VAR(__GLEW_EXT_gpu_program_parameters) - -#endif /* GL_EXT_gpu_program_parameters */ - -/* --------------------------- GL_EXT_gpu_shader4 -------------------------- */ - -#ifndef GL_EXT_gpu_shader4 -#define GL_EXT_gpu_shader4 1 - -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD -#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 -#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 -#define GL_SAMPLER_BUFFER_EXT 0x8DC2 -#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 -#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 -#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 -#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 -#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 -#define GL_INT_SAMPLER_1D_EXT 0x8DC9 -#define GL_INT_SAMPLER_2D_EXT 0x8DCA -#define GL_INT_SAMPLER_3D_EXT 0x8DCB -#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC -#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD -#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE -#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF -#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 -#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 -#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 - -typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); -typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); - -#define glBindFragDataLocationEXT GLEW_GET_FUN(__glewBindFragDataLocationEXT) -#define glGetFragDataLocationEXT GLEW_GET_FUN(__glewGetFragDataLocationEXT) -#define glGetUniformuivEXT GLEW_GET_FUN(__glewGetUniformuivEXT) -#define glGetVertexAttribIivEXT GLEW_GET_FUN(__glewGetVertexAttribIivEXT) -#define glGetVertexAttribIuivEXT GLEW_GET_FUN(__glewGetVertexAttribIuivEXT) -#define glUniform1uiEXT GLEW_GET_FUN(__glewUniform1uiEXT) -#define glUniform1uivEXT GLEW_GET_FUN(__glewUniform1uivEXT) -#define glUniform2uiEXT GLEW_GET_FUN(__glewUniform2uiEXT) -#define glUniform2uivEXT GLEW_GET_FUN(__glewUniform2uivEXT) -#define glUniform3uiEXT GLEW_GET_FUN(__glewUniform3uiEXT) -#define glUniform3uivEXT GLEW_GET_FUN(__glewUniform3uivEXT) -#define glUniform4uiEXT GLEW_GET_FUN(__glewUniform4uiEXT) -#define glUniform4uivEXT GLEW_GET_FUN(__glewUniform4uivEXT) -#define glVertexAttribI1iEXT GLEW_GET_FUN(__glewVertexAttribI1iEXT) -#define glVertexAttribI1ivEXT GLEW_GET_FUN(__glewVertexAttribI1ivEXT) -#define glVertexAttribI1uiEXT GLEW_GET_FUN(__glewVertexAttribI1uiEXT) -#define glVertexAttribI1uivEXT GLEW_GET_FUN(__glewVertexAttribI1uivEXT) -#define glVertexAttribI2iEXT GLEW_GET_FUN(__glewVertexAttribI2iEXT) -#define glVertexAttribI2ivEXT GLEW_GET_FUN(__glewVertexAttribI2ivEXT) -#define glVertexAttribI2uiEXT GLEW_GET_FUN(__glewVertexAttribI2uiEXT) -#define glVertexAttribI2uivEXT GLEW_GET_FUN(__glewVertexAttribI2uivEXT) -#define glVertexAttribI3iEXT GLEW_GET_FUN(__glewVertexAttribI3iEXT) -#define glVertexAttribI3ivEXT GLEW_GET_FUN(__glewVertexAttribI3ivEXT) -#define glVertexAttribI3uiEXT GLEW_GET_FUN(__glewVertexAttribI3uiEXT) -#define glVertexAttribI3uivEXT GLEW_GET_FUN(__glewVertexAttribI3uivEXT) -#define glVertexAttribI4bvEXT GLEW_GET_FUN(__glewVertexAttribI4bvEXT) -#define glVertexAttribI4iEXT GLEW_GET_FUN(__glewVertexAttribI4iEXT) -#define glVertexAttribI4ivEXT GLEW_GET_FUN(__glewVertexAttribI4ivEXT) -#define glVertexAttribI4svEXT GLEW_GET_FUN(__glewVertexAttribI4svEXT) -#define glVertexAttribI4ubvEXT GLEW_GET_FUN(__glewVertexAttribI4ubvEXT) -#define glVertexAttribI4uiEXT GLEW_GET_FUN(__glewVertexAttribI4uiEXT) -#define glVertexAttribI4uivEXT GLEW_GET_FUN(__glewVertexAttribI4uivEXT) -#define glVertexAttribI4usvEXT GLEW_GET_FUN(__glewVertexAttribI4usvEXT) -#define glVertexAttribIPointerEXT GLEW_GET_FUN(__glewVertexAttribIPointerEXT) - -#define GLEW_EXT_gpu_shader4 GLEW_GET_VAR(__GLEW_EXT_gpu_shader4) - -#endif /* GL_EXT_gpu_shader4 */ - -/* --------------------------- GL_EXT_gpu_shader5 -------------------------- */ - -#ifndef GL_EXT_gpu_shader5 -#define GL_EXT_gpu_shader5 1 - -#define GLEW_EXT_gpu_shader5 GLEW_GET_VAR(__GLEW_EXT_gpu_shader5) - -#endif /* GL_EXT_gpu_shader5 */ - -/* ---------------------------- GL_EXT_histogram --------------------------- */ - -#ifndef GL_EXT_histogram -#define GL_EXT_histogram 1 - -#define GL_HISTOGRAM_EXT 0x8024 -#define GL_PROXY_HISTOGRAM_EXT 0x8025 -#define GL_HISTOGRAM_WIDTH_EXT 0x8026 -#define GL_HISTOGRAM_FORMAT_EXT 0x8027 -#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C -#define GL_HISTOGRAM_SINK_EXT 0x802D -#define GL_MINMAX_EXT 0x802E -#define GL_MINMAX_FORMAT_EXT 0x802F -#define GL_MINMAX_SINK_EXT 0x8030 - -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); -typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (GLAPIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLRESETMINMAXEXTPROC) (GLenum target); - -#define glGetHistogramEXT GLEW_GET_FUN(__glewGetHistogramEXT) -#define glGetHistogramParameterfvEXT GLEW_GET_FUN(__glewGetHistogramParameterfvEXT) -#define glGetHistogramParameterivEXT GLEW_GET_FUN(__glewGetHistogramParameterivEXT) -#define glGetMinmaxEXT GLEW_GET_FUN(__glewGetMinmaxEXT) -#define glGetMinmaxParameterfvEXT GLEW_GET_FUN(__glewGetMinmaxParameterfvEXT) -#define glGetMinmaxParameterivEXT GLEW_GET_FUN(__glewGetMinmaxParameterivEXT) -#define glHistogramEXT GLEW_GET_FUN(__glewHistogramEXT) -#define glMinmaxEXT GLEW_GET_FUN(__glewMinmaxEXT) -#define glResetHistogramEXT GLEW_GET_FUN(__glewResetHistogramEXT) -#define glResetMinmaxEXT GLEW_GET_FUN(__glewResetMinmaxEXT) - -#define GLEW_EXT_histogram GLEW_GET_VAR(__GLEW_EXT_histogram) - -#endif /* GL_EXT_histogram */ - -/* ----------------------- GL_EXT_index_array_formats ---------------------- */ - -#ifndef GL_EXT_index_array_formats -#define GL_EXT_index_array_formats 1 - -#define GLEW_EXT_index_array_formats GLEW_GET_VAR(__GLEW_EXT_index_array_formats) - -#endif /* GL_EXT_index_array_formats */ - -/* --------------------------- GL_EXT_index_func --------------------------- */ - -#ifndef GL_EXT_index_func -#define GL_EXT_index_func 1 - -typedef void (GLAPIENTRY * PFNGLINDEXFUNCEXTPROC) (GLenum func, GLfloat ref); - -#define glIndexFuncEXT GLEW_GET_FUN(__glewIndexFuncEXT) - -#define GLEW_EXT_index_func GLEW_GET_VAR(__GLEW_EXT_index_func) - -#endif /* GL_EXT_index_func */ - -/* ------------------------- GL_EXT_index_material ------------------------- */ - -#ifndef GL_EXT_index_material -#define GL_EXT_index_material 1 - -typedef void (GLAPIENTRY * PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); - -#define glIndexMaterialEXT GLEW_GET_FUN(__glewIndexMaterialEXT) - -#define GLEW_EXT_index_material GLEW_GET_VAR(__GLEW_EXT_index_material) - -#endif /* GL_EXT_index_material */ - -/* -------------------------- GL_EXT_index_texture ------------------------- */ - -#ifndef GL_EXT_index_texture -#define GL_EXT_index_texture 1 - -#define GLEW_EXT_index_texture GLEW_GET_VAR(__GLEW_EXT_index_texture) - -#endif /* GL_EXT_index_texture */ - -/* ------------------------ GL_EXT_instanced_arrays ------------------------ */ - -#ifndef GL_EXT_instanced_arrays -#define GL_EXT_instanced_arrays 1 - -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_EXT 0x88FE - -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor); - -#define glVertexAttribDivisorEXT GLEW_GET_FUN(__glewVertexAttribDivisorEXT) - -#define GLEW_EXT_instanced_arrays GLEW_GET_VAR(__GLEW_EXT_instanced_arrays) - -#endif /* GL_EXT_instanced_arrays */ - -/* -------------------------- GL_EXT_light_texture ------------------------- */ - -#ifndef GL_EXT_light_texture -#define GL_EXT_light_texture 1 - -#define GL_FRAGMENT_MATERIAL_EXT 0x8349 -#define GL_FRAGMENT_NORMAL_EXT 0x834A -#define GL_FRAGMENT_COLOR_EXT 0x834C -#define GL_ATTENUATION_EXT 0x834D -#define GL_SHADOW_ATTENUATION_EXT 0x834E -#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F -#define GL_TEXTURE_LIGHT_EXT 0x8350 -#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 -#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 - -typedef void (GLAPIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); -typedef void (GLAPIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); -typedef void (GLAPIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); - -#define glApplyTextureEXT GLEW_GET_FUN(__glewApplyTextureEXT) -#define glTextureLightEXT GLEW_GET_FUN(__glewTextureLightEXT) -#define glTextureMaterialEXT GLEW_GET_FUN(__glewTextureMaterialEXT) - -#define GLEW_EXT_light_texture GLEW_GET_VAR(__GLEW_EXT_light_texture) - -#endif /* GL_EXT_light_texture */ - -/* ------------------------ GL_EXT_map_buffer_range ------------------------ */ - -#ifndef GL_EXT_map_buffer_range -#define GL_EXT_map_buffer_range 1 - -#define GL_MAP_READ_BIT_EXT 0x0001 -#define GL_MAP_WRITE_BIT_EXT 0x0002 -#define GL_MAP_INVALIDATE_RANGE_BIT_EXT 0x0004 -#define GL_MAP_INVALIDATE_BUFFER_BIT_EXT 0x0008 -#define GL_MAP_FLUSH_EXPLICIT_BIT_EXT 0x0010 -#define GL_MAP_UNSYNCHRONIZED_BIT_EXT 0x0020 - -typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length); -typedef void * (GLAPIENTRY * PFNGLMAPBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); - -#define glFlushMappedBufferRangeEXT GLEW_GET_FUN(__glewFlushMappedBufferRangeEXT) -#define glMapBufferRangeEXT GLEW_GET_FUN(__glewMapBufferRangeEXT) - -#define GLEW_EXT_map_buffer_range GLEW_GET_VAR(__GLEW_EXT_map_buffer_range) - -#endif /* GL_EXT_map_buffer_range */ - -/* -------------------------- GL_EXT_memory_object ------------------------- */ - -#ifndef GL_EXT_memory_object -#define GL_EXT_memory_object 1 - -#define GL_UUID_SIZE_EXT 16 -#define GL_TEXTURE_TILING_EXT 0x9580 -#define GL_DEDICATED_MEMORY_OBJECT_EXT 0x9581 -#define GL_NUM_TILING_TYPES_EXT 0x9582 -#define GL_TILING_TYPES_EXT 0x9583 -#define GL_OPTIMAL_TILING_EXT 0x9584 -#define GL_LINEAR_TILING_EXT 0x9585 -#define GL_NUM_DEVICE_UUIDS_EXT 0x9596 -#define GL_DEVICE_UUID_EXT 0x9597 -#define GL_DRIVER_UUID_EXT 0x9598 -#define GL_PROTECTED_MEMORY_OBJECT_EXT 0x959B - -typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEMEMEXTPROC) (GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLCREATEMEMORYOBJECTSEXTPROC) (GLsizei n, GLuint* memoryObjects); -typedef void (GLAPIENTRY * PFNGLDELETEMEMORYOBJECTSEXTPROC) (GLsizei n, const GLuint* memoryObjects); -typedef void (GLAPIENTRY * PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETUNSIGNEDBYTEI_VEXTPROC) (GLenum target, GLuint index, GLubyte* data); -typedef void (GLAPIENTRY * PFNGLGETUNSIGNEDBYTEVEXTPROC) (GLenum pname, GLubyte* data); -typedef GLboolean (GLAPIENTRY * PFNGLISMEMORYOBJECTEXTPROC) (GLuint memoryObject); -typedef void (GLAPIENTRY * PFNGLMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC) (GLuint buffer, GLsizeiptr size, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM1DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM2DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM3DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); - -#define glBufferStorageMemEXT GLEW_GET_FUN(__glewBufferStorageMemEXT) -#define glCreateMemoryObjectsEXT GLEW_GET_FUN(__glewCreateMemoryObjectsEXT) -#define glDeleteMemoryObjectsEXT GLEW_GET_FUN(__glewDeleteMemoryObjectsEXT) -#define glGetMemoryObjectParameterivEXT GLEW_GET_FUN(__glewGetMemoryObjectParameterivEXT) -#define glGetUnsignedBytei_vEXT GLEW_GET_FUN(__glewGetUnsignedBytei_vEXT) -#define glGetUnsignedBytevEXT GLEW_GET_FUN(__glewGetUnsignedBytevEXT) -#define glIsMemoryObjectEXT GLEW_GET_FUN(__glewIsMemoryObjectEXT) -#define glMemoryObjectParameterivEXT GLEW_GET_FUN(__glewMemoryObjectParameterivEXT) -#define glNamedBufferStorageMemEXT GLEW_GET_FUN(__glewNamedBufferStorageMemEXT) -#define glTexStorageMem1DEXT GLEW_GET_FUN(__glewTexStorageMem1DEXT) -#define glTexStorageMem2DEXT GLEW_GET_FUN(__glewTexStorageMem2DEXT) -#define glTexStorageMem2DMultisampleEXT GLEW_GET_FUN(__glewTexStorageMem2DMultisampleEXT) -#define glTexStorageMem3DEXT GLEW_GET_FUN(__glewTexStorageMem3DEXT) -#define glTexStorageMem3DMultisampleEXT GLEW_GET_FUN(__glewTexStorageMem3DMultisampleEXT) -#define glTextureStorageMem1DEXT GLEW_GET_FUN(__glewTextureStorageMem1DEXT) -#define glTextureStorageMem2DEXT GLEW_GET_FUN(__glewTextureStorageMem2DEXT) -#define glTextureStorageMem2DMultisampleEXT GLEW_GET_FUN(__glewTextureStorageMem2DMultisampleEXT) -#define glTextureStorageMem3DEXT GLEW_GET_FUN(__glewTextureStorageMem3DEXT) -#define glTextureStorageMem3DMultisampleEXT GLEW_GET_FUN(__glewTextureStorageMem3DMultisampleEXT) - -#define GLEW_EXT_memory_object GLEW_GET_VAR(__GLEW_EXT_memory_object) - -#endif /* GL_EXT_memory_object */ - -/* ------------------------ GL_EXT_memory_object_fd ------------------------ */ - -#ifndef GL_EXT_memory_object_fd -#define GL_EXT_memory_object_fd 1 - -#define GL_HANDLE_TYPE_OPAQUE_FD_EXT 0x9586 - -typedef void (GLAPIENTRY * PFNGLIMPORTMEMORYFDEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, GLint fd); - -#define glImportMemoryFdEXT GLEW_GET_FUN(__glewImportMemoryFdEXT) - -#define GLEW_EXT_memory_object_fd GLEW_GET_VAR(__GLEW_EXT_memory_object_fd) - -#endif /* GL_EXT_memory_object_fd */ - -/* ----------------------- GL_EXT_memory_object_win32 ---------------------- */ - -#ifndef GL_EXT_memory_object_win32 -#define GL_EXT_memory_object_win32 1 - -#define GL_LUID_SIZE_EXT 8 -#define GL_HANDLE_TYPE_OPAQUE_WIN32_EXT 0x9587 -#define GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT 0x9588 -#define GL_HANDLE_TYPE_D3D12_TILEPOOL_EXT 0x9589 -#define GL_HANDLE_TYPE_D3D12_RESOURCE_EXT 0x958A -#define GL_HANDLE_TYPE_D3D11_IMAGE_EXT 0x958B -#define GL_HANDLE_TYPE_D3D11_IMAGE_KMT_EXT 0x958C -#define GL_HANDLE_TYPE_D3D12_FENCE_EXT 0x9594 -#define GL_D3D12_FENCE_VALUE_EXT 0x9595 -#define GL_DEVICE_LUID_EXT 0x9599 -#define GL_DEVICE_NODE_MASK_EXT 0x959A - -typedef void (GLAPIENTRY * PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, void *handle); -typedef void (GLAPIENTRY * PFNGLIMPORTMEMORYWIN32NAMEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, const void *name); - -#define glImportMemoryWin32HandleEXT GLEW_GET_FUN(__glewImportMemoryWin32HandleEXT) -#define glImportMemoryWin32NameEXT GLEW_GET_FUN(__glewImportMemoryWin32NameEXT) - -#define GLEW_EXT_memory_object_win32 GLEW_GET_VAR(__GLEW_EXT_memory_object_win32) - -#endif /* GL_EXT_memory_object_win32 */ - -/* ------------------------- GL_EXT_misc_attribute ------------------------- */ - -#ifndef GL_EXT_misc_attribute -#define GL_EXT_misc_attribute 1 - -#define GLEW_EXT_misc_attribute GLEW_GET_VAR(__GLEW_EXT_misc_attribute) - -#endif /* GL_EXT_misc_attribute */ - -/* ------------------------ GL_EXT_multi_draw_arrays ----------------------- */ - -#ifndef GL_EXT_multi_draw_arrays -#define GL_EXT_multi_draw_arrays 1 - -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, GLsizei* count, GLenum type, const void *const *indices, GLsizei primcount); - -#define glMultiDrawArraysEXT GLEW_GET_FUN(__glewMultiDrawArraysEXT) -#define glMultiDrawElementsEXT GLEW_GET_FUN(__glewMultiDrawElementsEXT) - -#define GLEW_EXT_multi_draw_arrays GLEW_GET_VAR(__GLEW_EXT_multi_draw_arrays) - -#endif /* GL_EXT_multi_draw_arrays */ - -/* ----------------------- GL_EXT_multi_draw_indirect ---------------------- */ - -#ifndef GL_EXT_multi_draw_indirect -#define GL_EXT_multi_draw_indirect 1 - -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); - -#define glMultiDrawArraysIndirectEXT GLEW_GET_FUN(__glewMultiDrawArraysIndirectEXT) -#define glMultiDrawElementsIndirectEXT GLEW_GET_FUN(__glewMultiDrawElementsIndirectEXT) - -#define GLEW_EXT_multi_draw_indirect GLEW_GET_VAR(__GLEW_EXT_multi_draw_indirect) - -#endif /* GL_EXT_multi_draw_indirect */ - -/* ------------------------ GL_EXT_multiple_textures ----------------------- */ - -#ifndef GL_EXT_multiple_textures -#define GL_EXT_multiple_textures 1 - -#define GLEW_EXT_multiple_textures GLEW_GET_VAR(__GLEW_EXT_multiple_textures) - -#endif /* GL_EXT_multiple_textures */ - -/* --------------------------- GL_EXT_multisample -------------------------- */ - -#ifndef GL_EXT_multisample -#define GL_EXT_multisample 1 - -#define GL_MULTISAMPLE_EXT 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F -#define GL_SAMPLE_MASK_EXT 0x80A0 -#define GL_1PASS_EXT 0x80A1 -#define GL_2PASS_0_EXT 0x80A2 -#define GL_2PASS_1_EXT 0x80A3 -#define GL_4PASS_0_EXT 0x80A4 -#define GL_4PASS_1_EXT 0x80A5 -#define GL_4PASS_2_EXT 0x80A6 -#define GL_4PASS_3_EXT 0x80A7 -#define GL_SAMPLE_BUFFERS_EXT 0x80A8 -#define GL_SAMPLES_EXT 0x80A9 -#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA -#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB -#define GL_SAMPLE_PATTERN_EXT 0x80AC -#define GL_MULTISAMPLE_BIT_EXT 0x20000000 - -typedef void (GLAPIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); -typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); - -#define glSampleMaskEXT GLEW_GET_FUN(__glewSampleMaskEXT) -#define glSamplePatternEXT GLEW_GET_FUN(__glewSamplePatternEXT) - -#define GLEW_EXT_multisample GLEW_GET_VAR(__GLEW_EXT_multisample) - -#endif /* GL_EXT_multisample */ - -/* -------------------- GL_EXT_multisample_compatibility ------------------- */ - -#ifndef GL_EXT_multisample_compatibility -#define GL_EXT_multisample_compatibility 1 - -#define GL_MULTISAMPLE_EXT 0x809D -#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F - -#define GLEW_EXT_multisample_compatibility GLEW_GET_VAR(__GLEW_EXT_multisample_compatibility) - -#endif /* GL_EXT_multisample_compatibility */ - -/* ----------------- GL_EXT_multisampled_render_to_texture ----------------- */ - -#ifndef GL_EXT_multisampled_render_to_texture -#define GL_EXT_multisampled_render_to_texture 1 - -#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 -#define GL_MAX_SAMPLES_EXT 0x8D57 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); - -#define glFramebufferTexture2DMultisampleEXT GLEW_GET_FUN(__glewFramebufferTexture2DMultisampleEXT) - -#define GLEW_EXT_multisampled_render_to_texture GLEW_GET_VAR(__GLEW_EXT_multisampled_render_to_texture) - -#endif /* GL_EXT_multisampled_render_to_texture */ - -/* ----------------- GL_EXT_multisampled_render_to_texture2 ---------------- */ - -#ifndef GL_EXT_multisampled_render_to_texture2 -#define GL_EXT_multisampled_render_to_texture2 1 - -#define GLEW_EXT_multisampled_render_to_texture2 GLEW_GET_VAR(__GLEW_EXT_multisampled_render_to_texture2) - -#endif /* GL_EXT_multisampled_render_to_texture2 */ - -/* --------------------- GL_EXT_multiview_draw_buffers --------------------- */ - -#ifndef GL_EXT_multiview_draw_buffers -#define GL_EXT_multiview_draw_buffers 1 - -#define GL_DRAW_BUFFER_EXT 0x0C01 -#define GL_READ_BUFFER_EXT 0x0C02 -#define GL_COLOR_ATTACHMENT_EXT 0x90F0 -#define GL_MULTIVIEW_EXT 0x90F1 -#define GL_MAX_MULTIVIEW_BUFFERS_EXT 0x90F2 - -typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSINDEXEDEXTPROC) (GLint n, const GLenum* location, const GLint *indices); -typedef void (GLAPIENTRY * PFNGLGETINTEGERI_VEXTPROC) (GLenum target, GLuint index, GLint* data); -typedef void (GLAPIENTRY * PFNGLREADBUFFERINDEXEDEXTPROC) (GLenum src, GLint index); - -#define glDrawBuffersIndexedEXT GLEW_GET_FUN(__glewDrawBuffersIndexedEXT) -#define glGetIntegeri_vEXT GLEW_GET_FUN(__glewGetIntegeri_vEXT) -#define glReadBufferIndexedEXT GLEW_GET_FUN(__glewReadBufferIndexedEXT) - -#define GLEW_EXT_multiview_draw_buffers GLEW_GET_VAR(__GLEW_EXT_multiview_draw_buffers) - -#endif /* GL_EXT_multiview_draw_buffers */ - -/* ------------- GL_EXT_multiview_tessellation_geometry_shader ------------- */ - -#ifndef GL_EXT_multiview_tessellation_geometry_shader -#define GL_EXT_multiview_tessellation_geometry_shader 1 - -#define GLEW_EXT_multiview_tessellation_geometry_shader GLEW_GET_VAR(__GLEW_EXT_multiview_tessellation_geometry_shader) - -#endif /* GL_EXT_multiview_tessellation_geometry_shader */ - -/* ------------------ GL_EXT_multiview_texture_multisample ----------------- */ - -#ifndef GL_EXT_multiview_texture_multisample -#define GL_EXT_multiview_texture_multisample 1 - -#define GLEW_EXT_multiview_texture_multisample GLEW_GET_VAR(__GLEW_EXT_multiview_texture_multisample) - -#endif /* GL_EXT_multiview_texture_multisample */ - -/* ---------------------- GL_EXT_multiview_timer_query --------------------- */ - -#ifndef GL_EXT_multiview_timer_query -#define GL_EXT_multiview_timer_query 1 - -#define GLEW_EXT_multiview_timer_query GLEW_GET_VAR(__GLEW_EXT_multiview_timer_query) - -#endif /* GL_EXT_multiview_timer_query */ - -/* --------------------- GL_EXT_occlusion_query_boolean -------------------- */ - -#ifndef GL_EXT_occlusion_query_boolean -#define GL_EXT_occlusion_query_boolean 1 - -#define GL_CURRENT_QUERY_EXT 0x8865 -#define GL_QUERY_RESULT_EXT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_EXT 0x8867 -#define GL_ANY_SAMPLES_PASSED_EXT 0x8C2F -#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT 0x8D6A - -#define GLEW_EXT_occlusion_query_boolean GLEW_GET_VAR(__GLEW_EXT_occlusion_query_boolean) - -#endif /* GL_EXT_occlusion_query_boolean */ - -/* ---------------------- GL_EXT_packed_depth_stencil ---------------------- */ - -#ifndef GL_EXT_packed_depth_stencil -#define GL_EXT_packed_depth_stencil 1 - -#define GL_DEPTH_STENCIL_EXT 0x84F9 -#define GL_UNSIGNED_INT_24_8_EXT 0x84FA -#define GL_DEPTH24_STENCIL8_EXT 0x88F0 -#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 - -#define GLEW_EXT_packed_depth_stencil GLEW_GET_VAR(__GLEW_EXT_packed_depth_stencil) - -#endif /* GL_EXT_packed_depth_stencil */ - -/* -------------------------- GL_EXT_packed_float -------------------------- */ - -#ifndef GL_EXT_packed_float -#define GL_EXT_packed_float 1 - -#define GL_R11F_G11F_B10F_EXT 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B -#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C - -#define GLEW_EXT_packed_float GLEW_GET_VAR(__GLEW_EXT_packed_float) - -#endif /* GL_EXT_packed_float */ - -/* -------------------------- GL_EXT_packed_pixels ------------------------- */ - -#ifndef GL_EXT_packed_pixels -#define GL_EXT_packed_pixels 1 - -#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 - -#define GLEW_EXT_packed_pixels GLEW_GET_VAR(__GLEW_EXT_packed_pixels) - -#endif /* GL_EXT_packed_pixels */ - -/* ------------------------ GL_EXT_paletted_texture ------------------------ */ - -#ifndef GL_EXT_paletted_texture -#define GL_EXT_paletted_texture 1 - -#define GL_TEXTURE_1D 0x0DE0 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_PROXY_TEXTURE_1D 0x8063 -#define GL_PROXY_TEXTURE_2D 0x8064 -#define GL_COLOR_TABLE_FORMAT_EXT 0x80D8 -#define GL_COLOR_TABLE_WIDTH_EXT 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE_EXT 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE_EXT 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE_EXT 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE_EXT 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE_EXT 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE_EXT 0x80DF -#define GL_COLOR_INDEX1_EXT 0x80E2 -#define GL_COLOR_INDEX2_EXT 0x80E3 -#define GL_COLOR_INDEX4_EXT 0x80E4 -#define GL_COLOR_INDEX8_EXT 0x80E5 -#define GL_COLOR_INDEX12_EXT 0x80E6 -#define GL_COLOR_INDEX16_EXT 0x80E7 -#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED -#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 -#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B - -typedef void (GLAPIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void *data); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); - -#define glColorTableEXT GLEW_GET_FUN(__glewColorTableEXT) -#define glGetColorTableEXT GLEW_GET_FUN(__glewGetColorTableEXT) -#define glGetColorTableParameterfvEXT GLEW_GET_FUN(__glewGetColorTableParameterfvEXT) -#define glGetColorTableParameterivEXT GLEW_GET_FUN(__glewGetColorTableParameterivEXT) - -#define GLEW_EXT_paletted_texture GLEW_GET_VAR(__GLEW_EXT_paletted_texture) - -#endif /* GL_EXT_paletted_texture */ - -/* ----------------------- GL_EXT_pixel_buffer_object ---------------------- */ - -#ifndef GL_EXT_pixel_buffer_object -#define GL_EXT_pixel_buffer_object 1 - -#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF - -#define GLEW_EXT_pixel_buffer_object GLEW_GET_VAR(__GLEW_EXT_pixel_buffer_object) - -#endif /* GL_EXT_pixel_buffer_object */ - -/* ------------------------- GL_EXT_pixel_transform ------------------------ */ - -#ifndef GL_EXT_pixel_transform -#define GL_EXT_pixel_transform 1 - -#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 -#define GL_PIXEL_MAG_FILTER_EXT 0x8331 -#define GL_PIXEL_MIN_FILTER_EXT 0x8332 -#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 -#define GL_CUBIC_EXT 0x8334 -#define GL_AVERAGE_EXT 0x8335 -#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 -#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 -#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 - -typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, const GLfloat param); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, const GLint param); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); - -#define glGetPixelTransformParameterfvEXT GLEW_GET_FUN(__glewGetPixelTransformParameterfvEXT) -#define glGetPixelTransformParameterivEXT GLEW_GET_FUN(__glewGetPixelTransformParameterivEXT) -#define glPixelTransformParameterfEXT GLEW_GET_FUN(__glewPixelTransformParameterfEXT) -#define glPixelTransformParameterfvEXT GLEW_GET_FUN(__glewPixelTransformParameterfvEXT) -#define glPixelTransformParameteriEXT GLEW_GET_FUN(__glewPixelTransformParameteriEXT) -#define glPixelTransformParameterivEXT GLEW_GET_FUN(__glewPixelTransformParameterivEXT) - -#define GLEW_EXT_pixel_transform GLEW_GET_VAR(__GLEW_EXT_pixel_transform) - -#endif /* GL_EXT_pixel_transform */ - -/* ------------------- GL_EXT_pixel_transform_color_table ------------------ */ - -#ifndef GL_EXT_pixel_transform_color_table -#define GL_EXT_pixel_transform_color_table 1 - -#define GLEW_EXT_pixel_transform_color_table GLEW_GET_VAR(__GLEW_EXT_pixel_transform_color_table) - -#endif /* GL_EXT_pixel_transform_color_table */ - -/* ------------------------ GL_EXT_point_parameters ------------------------ */ - -#ifndef GL_EXT_point_parameters -#define GL_EXT_point_parameters 1 - -#define GL_POINT_SIZE_MIN_EXT 0x8126 -#define GL_POINT_SIZE_MAX_EXT 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 -#define GL_DISTANCE_ATTENUATION_EXT 0x8129 - -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat* params); - -#define glPointParameterfEXT GLEW_GET_FUN(__glewPointParameterfEXT) -#define glPointParameterfvEXT GLEW_GET_FUN(__glewPointParameterfvEXT) - -#define GLEW_EXT_point_parameters GLEW_GET_VAR(__GLEW_EXT_point_parameters) - -#endif /* GL_EXT_point_parameters */ - -/* ------------------------- GL_EXT_polygon_offset ------------------------- */ - -#ifndef GL_EXT_polygon_offset -#define GL_EXT_polygon_offset 1 - -#define GL_POLYGON_OFFSET_EXT 0x8037 -#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 -#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 - -typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); - -#define glPolygonOffsetEXT GLEW_GET_FUN(__glewPolygonOffsetEXT) - -#define GLEW_EXT_polygon_offset GLEW_GET_VAR(__GLEW_EXT_polygon_offset) - -#endif /* GL_EXT_polygon_offset */ - -/* ---------------------- GL_EXT_polygon_offset_clamp ---------------------- */ - -#ifndef GL_EXT_polygon_offset_clamp -#define GL_EXT_polygon_offset_clamp 1 - -#define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B - -typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); - -#define glPolygonOffsetClampEXT GLEW_GET_FUN(__glewPolygonOffsetClampEXT) - -#define GLEW_EXT_polygon_offset_clamp GLEW_GET_VAR(__GLEW_EXT_polygon_offset_clamp) - -#endif /* GL_EXT_polygon_offset_clamp */ - -/* ----------------------- GL_EXT_post_depth_coverage ---------------------- */ - -#ifndef GL_EXT_post_depth_coverage -#define GL_EXT_post_depth_coverage 1 - -#define GLEW_EXT_post_depth_coverage GLEW_GET_VAR(__GLEW_EXT_post_depth_coverage) - -#endif /* GL_EXT_post_depth_coverage */ - -/* --------------------- GL_EXT_primitive_bounding_box --------------------- */ - -#ifndef GL_EXT_primitive_bounding_box -#define GL_EXT_primitive_bounding_box 1 - -#define GL_PRIMITIVE_BOUNDING_BOX_EXT 0x92BE - -typedef void (GLAPIENTRY * PFNGLPRIMITIVEBOUNDINGBOXEXTPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); - -#define glPrimitiveBoundingBoxEXT GLEW_GET_FUN(__glewPrimitiveBoundingBoxEXT) - -#define GLEW_EXT_primitive_bounding_box GLEW_GET_VAR(__GLEW_EXT_primitive_bounding_box) - -#endif /* GL_EXT_primitive_bounding_box */ - -/* ----------------------- GL_EXT_protected_textures ----------------------- */ - -#ifndef GL_EXT_protected_textures -#define GL_EXT_protected_textures 1 - -#define GL_CONTEXT_FLAG_PROTECTED_CONTENT_BIT_EXT 0x00000010 -#define GL_TEXTURE_PROTECTED_EXT 0x8BFA - -#define GLEW_EXT_protected_textures GLEW_GET_VAR(__GLEW_EXT_protected_textures) - -#endif /* GL_EXT_protected_textures */ - -/* ------------------------ GL_EXT_provoking_vertex ------------------------ */ - -#ifndef GL_EXT_provoking_vertex -#define GL_EXT_provoking_vertex 1 - -#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C -#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D -#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E -#define GL_PROVOKING_VERTEX_EXT 0x8E4F - -typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode); - -#define glProvokingVertexEXT GLEW_GET_FUN(__glewProvokingVertexEXT) - -#define GLEW_EXT_provoking_vertex GLEW_GET_VAR(__GLEW_EXT_provoking_vertex) - -#endif /* GL_EXT_provoking_vertex */ - -/* --------------------------- GL_EXT_pvrtc_sRGB --------------------------- */ - -#ifndef GL_EXT_pvrtc_sRGB -#define GL_EXT_pvrtc_sRGB 1 - -#define GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT 0x8A54 -#define GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT 0x8A55 -#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT 0x8A56 -#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT 0x8A57 - -#define GLEW_EXT_pvrtc_sRGB GLEW_GET_VAR(__GLEW_EXT_pvrtc_sRGB) - -#endif /* GL_EXT_pvrtc_sRGB */ - -/* ----------------------- GL_EXT_raster_multisample ----------------------- */ - -#ifndef GL_EXT_raster_multisample -#define GL_EXT_raster_multisample 1 - -#define GL_COLOR_SAMPLES_NV 0x8E20 -#define GL_RASTER_MULTISAMPLE_EXT 0x9327 -#define GL_RASTER_SAMPLES_EXT 0x9328 -#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 -#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A -#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B -#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C -#define GL_DEPTH_SAMPLES_NV 0x932D -#define GL_STENCIL_SAMPLES_NV 0x932E -#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F -#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 -#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 -#define GL_COVERAGE_MODULATION_NV 0x9332 -#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 - -typedef void (GLAPIENTRY * PFNGLCOVERAGEMODULATIONNVPROC) (GLenum components); -typedef void (GLAPIENTRY * PFNGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufsize, GLfloat* v); -typedef void (GLAPIENTRY * PFNGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); - -#define glCoverageModulationNV GLEW_GET_FUN(__glewCoverageModulationNV) -#define glCoverageModulationTableNV GLEW_GET_FUN(__glewCoverageModulationTableNV) -#define glGetCoverageModulationTableNV GLEW_GET_FUN(__glewGetCoverageModulationTableNV) -#define glRasterSamplesEXT GLEW_GET_FUN(__glewRasterSamplesEXT) - -#define GLEW_EXT_raster_multisample GLEW_GET_VAR(__GLEW_EXT_raster_multisample) - -#endif /* GL_EXT_raster_multisample */ - -/* ------------------------ GL_EXT_read_format_bgra ------------------------ */ - -#ifndef GL_EXT_read_format_bgra -#define GL_EXT_read_format_bgra 1 - -#define GL_BGRA_EXT 0x80E1 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366 - -#define GLEW_EXT_read_format_bgra GLEW_GET_VAR(__GLEW_EXT_read_format_bgra) - -#endif /* GL_EXT_read_format_bgra */ - -/* -------------------------- GL_EXT_render_snorm -------------------------- */ - -#ifndef GL_EXT_render_snorm -#define GL_EXT_render_snorm 1 - -#define GL_BYTE 0x1400 -#define GL_SHORT 0x1402 -#define GL_R8_SNORM 0x8F94 -#define GL_RG8_SNORM 0x8F95 -#define GL_RGBA8_SNORM 0x8F97 -#define GL_R16_SNORM_EXT 0x8F98 -#define GL_RG16_SNORM_EXT 0x8F99 -#define GL_RGBA16_SNORM_EXT 0x8F9B - -#define GLEW_EXT_render_snorm GLEW_GET_VAR(__GLEW_EXT_render_snorm) - -#endif /* GL_EXT_render_snorm */ - -/* ------------------------- GL_EXT_rescale_normal ------------------------- */ - -#ifndef GL_EXT_rescale_normal -#define GL_EXT_rescale_normal 1 - -#define GL_RESCALE_NORMAL_EXT 0x803A - -#define GLEW_EXT_rescale_normal GLEW_GET_VAR(__GLEW_EXT_rescale_normal) - -#endif /* GL_EXT_rescale_normal */ - -/* --------------------------- GL_EXT_robustness --------------------------- */ - -#ifndef GL_EXT_robustness -#define GL_EXT_robustness 1 - -#define GL_LOSE_CONTEXT_ON_RESET_EXT 0x8252 -#define GL_GUILTY_CONTEXT_RESET_EXT 0x8253 -#define GL_INNOCENT_CONTEXT_RESET_EXT 0x8254 -#define GL_UNKNOWN_CONTEXT_RESET_EXT 0x8255 -#define GL_RESET_NOTIFICATION_STRATEGY_EXT 0x8256 -#define GL_NO_RESET_NOTIFICATION_EXT 0x8261 -#define GL_CONTEXT_ROBUST_ACCESS_EXT 0x90F3 - -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params); -typedef void (GLAPIENTRY * PFNGLREADNPIXELSEXTPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); - -#define glGetnUniformfvEXT GLEW_GET_FUN(__glewGetnUniformfvEXT) -#define glGetnUniformivEXT GLEW_GET_FUN(__glewGetnUniformivEXT) -#define glReadnPixelsEXT GLEW_GET_FUN(__glewReadnPixelsEXT) - -#define GLEW_EXT_robustness GLEW_GET_VAR(__GLEW_EXT_robustness) - -#endif /* GL_EXT_robustness */ - -/* ------------------------------ GL_EXT_sRGB ------------------------------ */ - -#ifndef GL_EXT_sRGB -#define GL_EXT_sRGB 1 - -#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210 -#define GL_SRGB_EXT 0x8C40 -#define GL_SRGB_ALPHA_EXT 0x8C42 -#define GL_SRGB8_ALPHA8_EXT 0x8C43 - -#define GLEW_EXT_sRGB GLEW_GET_VAR(__GLEW_EXT_sRGB) - -#endif /* GL_EXT_sRGB */ - -/* ----------------------- GL_EXT_sRGB_write_control ----------------------- */ - -#ifndef GL_EXT_sRGB_write_control -#define GL_EXT_sRGB_write_control 1 - -#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 - -#define GLEW_EXT_sRGB_write_control GLEW_GET_VAR(__GLEW_EXT_sRGB_write_control) - -#endif /* GL_EXT_sRGB_write_control */ - -/* -------------------------- GL_EXT_scene_marker -------------------------- */ - -#ifndef GL_EXT_scene_marker -#define GL_EXT_scene_marker 1 - -typedef void (GLAPIENTRY * PFNGLBEGINSCENEEXTPROC) (void); -typedef void (GLAPIENTRY * PFNGLENDSCENEEXTPROC) (void); - -#define glBeginSceneEXT GLEW_GET_FUN(__glewBeginSceneEXT) -#define glEndSceneEXT GLEW_GET_FUN(__glewEndSceneEXT) - -#define GLEW_EXT_scene_marker GLEW_GET_VAR(__GLEW_EXT_scene_marker) - -#endif /* GL_EXT_scene_marker */ - -/* ------------------------- GL_EXT_secondary_color ------------------------ */ - -#ifndef GL_EXT_secondary_color -#define GL_EXT_secondary_color 1 - -#define GL_COLOR_SUM_EXT 0x8458 -#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D -#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E - -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); - -#define glSecondaryColor3bEXT GLEW_GET_FUN(__glewSecondaryColor3bEXT) -#define glSecondaryColor3bvEXT GLEW_GET_FUN(__glewSecondaryColor3bvEXT) -#define glSecondaryColor3dEXT GLEW_GET_FUN(__glewSecondaryColor3dEXT) -#define glSecondaryColor3dvEXT GLEW_GET_FUN(__glewSecondaryColor3dvEXT) -#define glSecondaryColor3fEXT GLEW_GET_FUN(__glewSecondaryColor3fEXT) -#define glSecondaryColor3fvEXT GLEW_GET_FUN(__glewSecondaryColor3fvEXT) -#define glSecondaryColor3iEXT GLEW_GET_FUN(__glewSecondaryColor3iEXT) -#define glSecondaryColor3ivEXT GLEW_GET_FUN(__glewSecondaryColor3ivEXT) -#define glSecondaryColor3sEXT GLEW_GET_FUN(__glewSecondaryColor3sEXT) -#define glSecondaryColor3svEXT GLEW_GET_FUN(__glewSecondaryColor3svEXT) -#define glSecondaryColor3ubEXT GLEW_GET_FUN(__glewSecondaryColor3ubEXT) -#define glSecondaryColor3ubvEXT GLEW_GET_FUN(__glewSecondaryColor3ubvEXT) -#define glSecondaryColor3uiEXT GLEW_GET_FUN(__glewSecondaryColor3uiEXT) -#define glSecondaryColor3uivEXT GLEW_GET_FUN(__glewSecondaryColor3uivEXT) -#define glSecondaryColor3usEXT GLEW_GET_FUN(__glewSecondaryColor3usEXT) -#define glSecondaryColor3usvEXT GLEW_GET_FUN(__glewSecondaryColor3usvEXT) -#define glSecondaryColorPointerEXT GLEW_GET_FUN(__glewSecondaryColorPointerEXT) - -#define GLEW_EXT_secondary_color GLEW_GET_VAR(__GLEW_EXT_secondary_color) - -#endif /* GL_EXT_secondary_color */ - -/* ---------------------------- GL_EXT_semaphore --------------------------- */ - -#ifndef GL_EXT_semaphore -#define GL_EXT_semaphore 1 - -#define GL_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_EXT 0x9530 -#define GL_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_EXT 0x9531 -#define GL_LAYOUT_GENERAL_EXT 0x958D -#define GL_LAYOUT_COLOR_ATTACHMENT_EXT 0x958E -#define GL_LAYOUT_DEPTH_STENCIL_ATTACHMENT_EXT 0x958F -#define GL_LAYOUT_DEPTH_STENCIL_READ_ONLY_EXT 0x9590 -#define GL_LAYOUT_SHADER_READ_ONLY_EXT 0x9591 -#define GL_LAYOUT_TRANSFER_SRC_EXT 0x9592 -#define GL_LAYOUT_TRANSFER_DST_EXT 0x9593 - -typedef void (GLAPIENTRY * PFNGLDELETESEMAPHORESEXTPROC) (GLsizei n, const GLuint* semaphores); -typedef void (GLAPIENTRY * PFNGLGENSEMAPHORESEXTPROC) (GLsizei n, GLuint* semaphores); -typedef void (GLAPIENTRY * PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, GLuint64* params); -typedef GLboolean (GLAPIENTRY * PFNGLISSEMAPHOREEXTPROC) (GLuint semaphore); -typedef void (GLAPIENTRY * PFNGLSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, const GLuint64* params); -typedef void (GLAPIENTRY * PFNGLSIGNALSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint* buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *dstLayouts); -typedef void (GLAPIENTRY * PFNGLWAITSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint* buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *srcLayouts); - -#define glDeleteSemaphoresEXT GLEW_GET_FUN(__glewDeleteSemaphoresEXT) -#define glGenSemaphoresEXT GLEW_GET_FUN(__glewGenSemaphoresEXT) -#define glGetSemaphoreParameterui64vEXT GLEW_GET_FUN(__glewGetSemaphoreParameterui64vEXT) -#define glIsSemaphoreEXT GLEW_GET_FUN(__glewIsSemaphoreEXT) -#define glSemaphoreParameterui64vEXT GLEW_GET_FUN(__glewSemaphoreParameterui64vEXT) -#define glSignalSemaphoreEXT GLEW_GET_FUN(__glewSignalSemaphoreEXT) -#define glWaitSemaphoreEXT GLEW_GET_FUN(__glewWaitSemaphoreEXT) - -#define GLEW_EXT_semaphore GLEW_GET_VAR(__GLEW_EXT_semaphore) - -#endif /* GL_EXT_semaphore */ - -/* -------------------------- GL_EXT_semaphore_fd -------------------------- */ - -#ifndef GL_EXT_semaphore_fd -#define GL_EXT_semaphore_fd 1 - -typedef void (GLAPIENTRY * PFNGLIMPORTSEMAPHOREFDEXTPROC) (GLuint semaphore, GLenum handleType, GLint fd); - -#define glImportSemaphoreFdEXT GLEW_GET_FUN(__glewImportSemaphoreFdEXT) - -#define GLEW_EXT_semaphore_fd GLEW_GET_VAR(__GLEW_EXT_semaphore_fd) - -#endif /* GL_EXT_semaphore_fd */ - -/* ------------------------- GL_EXT_semaphore_win32 ------------------------ */ - -#ifndef GL_EXT_semaphore_win32 -#define GL_EXT_semaphore_win32 1 - -typedef void (GLAPIENTRY * PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC) (GLuint semaphore, GLenum handleType, void *handle); -typedef void (GLAPIENTRY * PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC) (GLuint semaphore, GLenum handleType, const void *name); - -#define glImportSemaphoreWin32HandleEXT GLEW_GET_FUN(__glewImportSemaphoreWin32HandleEXT) -#define glImportSemaphoreWin32NameEXT GLEW_GET_FUN(__glewImportSemaphoreWin32NameEXT) - -#define GLEW_EXT_semaphore_win32 GLEW_GET_VAR(__GLEW_EXT_semaphore_win32) - -#endif /* GL_EXT_semaphore_win32 */ - -/* --------------------- GL_EXT_separate_shader_objects -------------------- */ - -#ifndef GL_EXT_separate_shader_objects -#define GL_EXT_separate_shader_objects 1 - -#define GL_ACTIVE_PROGRAM_EXT 0x8B8D - -typedef void (GLAPIENTRY * PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); -typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar* string); -typedef void (GLAPIENTRY * PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); - -#define glActiveProgramEXT GLEW_GET_FUN(__glewActiveProgramEXT) -#define glCreateShaderProgramEXT GLEW_GET_FUN(__glewCreateShaderProgramEXT) -#define glUseShaderProgramEXT GLEW_GET_FUN(__glewUseShaderProgramEXT) - -#define GLEW_EXT_separate_shader_objects GLEW_GET_VAR(__GLEW_EXT_separate_shader_objects) - -#endif /* GL_EXT_separate_shader_objects */ - -/* --------------------- GL_EXT_separate_specular_color -------------------- */ - -#ifndef GL_EXT_separate_specular_color -#define GL_EXT_separate_specular_color 1 - -#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 -#define GL_SINGLE_COLOR_EXT 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA - -#define GLEW_EXT_separate_specular_color GLEW_GET_VAR(__GLEW_EXT_separate_specular_color) - -#endif /* GL_EXT_separate_specular_color */ - -/* -------------------- GL_EXT_shader_framebuffer_fetch -------------------- */ - -#ifndef GL_EXT_shader_framebuffer_fetch -#define GL_EXT_shader_framebuffer_fetch 1 - -#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERFETCHBARRIEREXTPROC) (void); - -#define glFramebufferFetchBarrierEXT GLEW_GET_FUN(__glewFramebufferFetchBarrierEXT) - -#define GLEW_EXT_shader_framebuffer_fetch GLEW_GET_VAR(__GLEW_EXT_shader_framebuffer_fetch) - -#endif /* GL_EXT_shader_framebuffer_fetch */ - -/* -------------- GL_EXT_shader_framebuffer_fetch_non_coherent ------------- */ - -#ifndef GL_EXT_shader_framebuffer_fetch_non_coherent -#define GL_EXT_shader_framebuffer_fetch_non_coherent 1 - -#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 - -#define GLEW_EXT_shader_framebuffer_fetch_non_coherent GLEW_GET_VAR(__GLEW_EXT_shader_framebuffer_fetch_non_coherent) - -#endif /* GL_EXT_shader_framebuffer_fetch_non_coherent */ - -/* ------------------------ GL_EXT_shader_group_vote ----------------------- */ - -#ifndef GL_EXT_shader_group_vote -#define GL_EXT_shader_group_vote 1 - -#define GLEW_EXT_shader_group_vote GLEW_GET_VAR(__GLEW_EXT_shader_group_vote) - -#endif /* GL_EXT_shader_group_vote */ - -/* ------------------- GL_EXT_shader_image_load_formatted ------------------ */ - -#ifndef GL_EXT_shader_image_load_formatted -#define GL_EXT_shader_image_load_formatted 1 - -#define GLEW_EXT_shader_image_load_formatted GLEW_GET_VAR(__GLEW_EXT_shader_image_load_formatted) - -#endif /* GL_EXT_shader_image_load_formatted */ - -/* --------------------- GL_EXT_shader_image_load_store -------------------- */ - -#ifndef GL_EXT_shader_image_load_store -#define GL_EXT_shader_image_load_store 1 - -#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 -#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 -#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 -#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 -#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 -#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 -#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 -#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 -#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 -#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 -#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 -#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 -#define GL_MAX_IMAGE_UNITS_EXT 0x8F38 -#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 -#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A -#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B -#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C -#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D -#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E -#define GL_IMAGE_1D_EXT 0x904C -#define GL_IMAGE_2D_EXT 0x904D -#define GL_IMAGE_3D_EXT 0x904E -#define GL_IMAGE_2D_RECT_EXT 0x904F -#define GL_IMAGE_CUBE_EXT 0x9050 -#define GL_IMAGE_BUFFER_EXT 0x9051 -#define GL_IMAGE_1D_ARRAY_EXT 0x9052 -#define GL_IMAGE_2D_ARRAY_EXT 0x9053 -#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 -#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 -#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 -#define GL_INT_IMAGE_1D_EXT 0x9057 -#define GL_INT_IMAGE_2D_EXT 0x9058 -#define GL_INT_IMAGE_3D_EXT 0x9059 -#define GL_INT_IMAGE_2D_RECT_EXT 0x905A -#define GL_INT_IMAGE_CUBE_EXT 0x905B -#define GL_INT_IMAGE_BUFFER_EXT 0x905C -#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D -#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E -#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F -#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 -#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 -#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 -#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 -#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 -#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 -#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 -#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 -#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 -#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 -#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C -#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D -#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E -#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF - -typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); -typedef void (GLAPIENTRY * PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers); - -#define glBindImageTextureEXT GLEW_GET_FUN(__glewBindImageTextureEXT) -#define glMemoryBarrierEXT GLEW_GET_FUN(__glewMemoryBarrierEXT) - -#define GLEW_EXT_shader_image_load_store GLEW_GET_VAR(__GLEW_EXT_shader_image_load_store) - -#endif /* GL_EXT_shader_image_load_store */ - -/* ------------------- GL_EXT_shader_implicit_conversions ------------------ */ - -#ifndef GL_EXT_shader_implicit_conversions -#define GL_EXT_shader_implicit_conversions 1 - -#define GLEW_EXT_shader_implicit_conversions GLEW_GET_VAR(__GLEW_EXT_shader_implicit_conversions) - -#endif /* GL_EXT_shader_implicit_conversions */ - -/* ----------------------- GL_EXT_shader_integer_mix ----------------------- */ - -#ifndef GL_EXT_shader_integer_mix -#define GL_EXT_shader_integer_mix 1 - -#define GLEW_EXT_shader_integer_mix GLEW_GET_VAR(__GLEW_EXT_shader_integer_mix) - -#endif /* GL_EXT_shader_integer_mix */ - -/* ------------------------ GL_EXT_shader_io_blocks ------------------------ */ - -#ifndef GL_EXT_shader_io_blocks -#define GL_EXT_shader_io_blocks 1 - -#define GLEW_EXT_shader_io_blocks GLEW_GET_VAR(__GLEW_EXT_shader_io_blocks) - -#endif /* GL_EXT_shader_io_blocks */ - -/* ------------- GL_EXT_shader_non_constant_global_initializers ------------ */ - -#ifndef GL_EXT_shader_non_constant_global_initializers -#define GL_EXT_shader_non_constant_global_initializers 1 - -#define GLEW_EXT_shader_non_constant_global_initializers GLEW_GET_VAR(__GLEW_EXT_shader_non_constant_global_initializers) - -#endif /* GL_EXT_shader_non_constant_global_initializers */ - -/* ------------------- GL_EXT_shader_pixel_local_storage ------------------- */ - -#ifndef GL_EXT_shader_pixel_local_storage -#define GL_EXT_shader_pixel_local_storage 1 - -#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT 0x8F63 -#define GL_SHADER_PIXEL_LOCAL_STORAGE_EXT 0x8F64 -#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_SIZE_EXT 0x8F67 - -#define GLEW_EXT_shader_pixel_local_storage GLEW_GET_VAR(__GLEW_EXT_shader_pixel_local_storage) - -#endif /* GL_EXT_shader_pixel_local_storage */ - -/* ------------------- GL_EXT_shader_pixel_local_storage2 ------------------ */ - -#ifndef GL_EXT_shader_pixel_local_storage2 -#define GL_EXT_shader_pixel_local_storage2 1 - -#define GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_FAST_SIZE_EXT 0x9650 -#define GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_SIZE_EXT 0x9651 -#define GL_FRAMEBUFFER_INCOMPLETE_INSUFFICIENT_SHADER_COMBINED_LOCAL_STORAGE_EXT 0x9652 - -typedef void (GLAPIENTRY * PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC) (GLsizei offset, GLsizei n, const GLuint* values); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target, GLsizei size); -typedef GLsizei (GLAPIENTRY * PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target); - -#define glClearPixelLocalStorageuiEXT GLEW_GET_FUN(__glewClearPixelLocalStorageuiEXT) -#define glFramebufferPixelLocalStorageSizeEXT GLEW_GET_FUN(__glewFramebufferPixelLocalStorageSizeEXT) -#define glGetFramebufferPixelLocalStorageSizeEXT GLEW_GET_FUN(__glewGetFramebufferPixelLocalStorageSizeEXT) - -#define GLEW_EXT_shader_pixel_local_storage2 GLEW_GET_VAR(__GLEW_EXT_shader_pixel_local_storage2) - -#endif /* GL_EXT_shader_pixel_local_storage2 */ - -/* ----------------------- GL_EXT_shader_texture_lod ----------------------- */ - -#ifndef GL_EXT_shader_texture_lod -#define GL_EXT_shader_texture_lod 1 - -#define GLEW_EXT_shader_texture_lod GLEW_GET_VAR(__GLEW_EXT_shader_texture_lod) - -#endif /* GL_EXT_shader_texture_lod */ - -/* -------------------------- GL_EXT_shadow_funcs -------------------------- */ - -#ifndef GL_EXT_shadow_funcs -#define GL_EXT_shadow_funcs 1 - -#define GLEW_EXT_shadow_funcs GLEW_GET_VAR(__GLEW_EXT_shadow_funcs) - -#endif /* GL_EXT_shadow_funcs */ - -/* ------------------------- GL_EXT_shadow_samplers ------------------------ */ - -#ifndef GL_EXT_shadow_samplers -#define GL_EXT_shadow_samplers 1 - -#define GL_TEXTURE_COMPARE_MODE_EXT 0x884C -#define GL_TEXTURE_COMPARE_FUNC_EXT 0x884D -#define GL_COMPARE_REF_TO_TEXTURE_EXT 0x884E -#define GL_SAMPLER_2D_SHADOW_EXT 0x8B62 - -#define GLEW_EXT_shadow_samplers GLEW_GET_VAR(__GLEW_EXT_shadow_samplers) - -#endif /* GL_EXT_shadow_samplers */ - -/* --------------------- GL_EXT_shared_texture_palette --------------------- */ - -#ifndef GL_EXT_shared_texture_palette -#define GL_EXT_shared_texture_palette 1 - -#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB - -#define GLEW_EXT_shared_texture_palette GLEW_GET_VAR(__GLEW_EXT_shared_texture_palette) - -#endif /* GL_EXT_shared_texture_palette */ - -/* ------------------------- GL_EXT_sparse_texture ------------------------- */ - -#ifndef GL_EXT_sparse_texture -#define GL_EXT_sparse_texture 1 - -#define GL_TEXTURE_2D 0x0DE1 -#define GL_TEXTURE_3D 0x806F -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_2D_ARRAY 0x8C1A -#define GL_TEXTURE_CUBE_MAP_ARRAY_OES 0x9009 -#define GL_VIRTUAL_PAGE_SIZE_X_EXT 0x9195 -#define GL_VIRTUAL_PAGE_SIZE_Y_EXT 0x9196 -#define GL_VIRTUAL_PAGE_SIZE_Z_EXT 0x9197 -#define GL_MAX_SPARSE_TEXTURE_SIZE_EXT 0x9198 -#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_EXT 0x9199 -#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_EXT 0x919A -#define GL_TEXTURE_SPARSE_EXT 0x91A6 -#define GL_VIRTUAL_PAGE_SIZE_INDEX_EXT 0x91A7 -#define GL_NUM_VIRTUAL_PAGE_SIZES_EXT 0x91A8 -#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_EXT 0x91A9 -#define GL_NUM_SPARSE_LEVELS_EXT 0x91AA - -typedef void (GLAPIENTRY * PFNGLTEXPAGECOMMITMENTEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); -typedef void (GLAPIENTRY * PFNGLTEXTUREPAGECOMMITMENTEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); - -#define glTexPageCommitmentEXT GLEW_GET_FUN(__glewTexPageCommitmentEXT) -#define glTexturePageCommitmentEXT GLEW_GET_FUN(__glewTexturePageCommitmentEXT) - -#define GLEW_EXT_sparse_texture GLEW_GET_VAR(__GLEW_EXT_sparse_texture) - -#endif /* GL_EXT_sparse_texture */ - -/* ------------------------- GL_EXT_sparse_texture2 ------------------------ */ - -#ifndef GL_EXT_sparse_texture2 -#define GL_EXT_sparse_texture2 1 - -#define GLEW_EXT_sparse_texture2 GLEW_GET_VAR(__GLEW_EXT_sparse_texture2) - -#endif /* GL_EXT_sparse_texture2 */ - -/* ----------------------- GL_EXT_static_vertex_array ---------------------- */ - -#ifndef GL_EXT_static_vertex_array -#define GL_EXT_static_vertex_array 1 - -#define GLEW_EXT_static_vertex_array GLEW_GET_VAR(__GLEW_EXT_static_vertex_array) - -#endif /* GL_EXT_static_vertex_array */ - -/* ------------------------ GL_EXT_stencil_clear_tag ----------------------- */ - -#ifndef GL_EXT_stencil_clear_tag -#define GL_EXT_stencil_clear_tag 1 - -#define GL_STENCIL_TAG_BITS_EXT 0x88F2 -#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 - -#define GLEW_EXT_stencil_clear_tag GLEW_GET_VAR(__GLEW_EXT_stencil_clear_tag) - -#endif /* GL_EXT_stencil_clear_tag */ - -/* ------------------------ GL_EXT_stencil_two_side ------------------------ */ - -#ifndef GL_EXT_stencil_two_side -#define GL_EXT_stencil_two_side 1 - -#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 -#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 - -typedef void (GLAPIENTRY * PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); - -#define glActiveStencilFaceEXT GLEW_GET_FUN(__glewActiveStencilFaceEXT) - -#define GLEW_EXT_stencil_two_side GLEW_GET_VAR(__GLEW_EXT_stencil_two_side) - -#endif /* GL_EXT_stencil_two_side */ - -/* -------------------------- GL_EXT_stencil_wrap -------------------------- */ - -#ifndef GL_EXT_stencil_wrap -#define GL_EXT_stencil_wrap 1 - -#define GL_INCR_WRAP_EXT 0x8507 -#define GL_DECR_WRAP_EXT 0x8508 - -#define GLEW_EXT_stencil_wrap GLEW_GET_VAR(__GLEW_EXT_stencil_wrap) - -#endif /* GL_EXT_stencil_wrap */ - -/* --------------------------- GL_EXT_subtexture --------------------------- */ - -#ifndef GL_EXT_subtexture -#define GL_EXT_subtexture 1 - -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); - -#define glTexSubImage1DEXT GLEW_GET_FUN(__glewTexSubImage1DEXT) -#define glTexSubImage2DEXT GLEW_GET_FUN(__glewTexSubImage2DEXT) -#define glTexSubImage3DEXT GLEW_GET_FUN(__glewTexSubImage3DEXT) - -#define GLEW_EXT_subtexture GLEW_GET_VAR(__GLEW_EXT_subtexture) - -#endif /* GL_EXT_subtexture */ - -/* --------------------- GL_EXT_tessellation_point_size -------------------- */ - -#ifndef GL_EXT_tessellation_point_size -#define GL_EXT_tessellation_point_size 1 - -#define GL_QUADS_EXT 0x0007 -#define GL_TESS_CONTROL_SHADER_BIT_EXT 0x00000008 -#define GL_PATCHES_EXT 0xE -#define GL_TESS_EVALUATION_SHADER_BIT_EXT 0x00000010 -#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 -#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_EXT 0x886C -#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_EXT 0x886D -#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_EXT 0x8E1E -#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT 0x8E1F -#define GL_PATCH_VERTICES_EXT 0x8E72 -#define GL_TESS_CONTROL_OUTPUT_VERTICES_EXT 0x8E75 -#define GL_TESS_GEN_MODE_EXT 0x8E76 -#define GL_TESS_GEN_SPACING_EXT 0x8E77 -#define GL_TESS_GEN_VERTEX_ORDER_EXT 0x8E78 -#define GL_TESS_GEN_POINT_MODE_EXT 0x8E79 -#define GL_ISOLINES_EXT 0x8E7A -#define GL_FRACTIONAL_ODD_EXT 0x8E7B -#define GL_FRACTIONAL_EVEN_EXT 0x8E7C -#define GL_MAX_PATCH_VERTICES_EXT 0x8E7D -#define GL_MAX_TESS_GEN_LEVEL_EXT 0x8E7E -#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_EXT 0x8E7F -#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT 0x8E80 -#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_EXT 0x8E81 -#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_EXT 0x8E82 -#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_EXT 0x8E83 -#define GL_MAX_TESS_PATCH_COMPONENTS_EXT 0x8E84 -#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_EXT 0x8E85 -#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_EXT 0x8E86 -#define GL_TESS_EVALUATION_SHADER_EXT 0x8E87 -#define GL_TESS_CONTROL_SHADER_EXT 0x8E88 -#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_EXT 0x8E89 -#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_EXT 0x8E8A -#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_EXT 0x90CB -#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_EXT 0x90CC -#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_EXT 0x90D8 -#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_EXT 0x90D9 -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_EXT 0x92CD -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_EXT 0x92CE -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_EXT 0x92D3 -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_EXT 0x92D4 -#define GL_IS_PER_PATCH_EXT 0x92E7 -#define GL_REFERENCED_BY_TESS_CONTROL_SHADER_EXT 0x9307 -#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER_EXT 0x9308 - -typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERIEXTPROC) (GLenum pname, GLint value); - -#define glPatchParameteriEXT GLEW_GET_FUN(__glewPatchParameteriEXT) - -#define GLEW_EXT_tessellation_point_size GLEW_GET_VAR(__GLEW_EXT_tessellation_point_size) - -#endif /* GL_EXT_tessellation_point_size */ - -/* ----------------------- GL_EXT_tessellation_shader ---------------------- */ - -#ifndef GL_EXT_tessellation_shader -#define GL_EXT_tessellation_shader 1 - -#define GL_QUADS_EXT 0x0007 -#define GL_TESS_CONTROL_SHADER_BIT_EXT 0x00000008 -#define GL_PATCHES_EXT 0xE -#define GL_TESS_EVALUATION_SHADER_BIT_EXT 0x00000010 -#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 -#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_EXT 0x886C -#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_EXT 0x886D -#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_EXT 0x8E1E -#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT 0x8E1F -#define GL_PATCH_VERTICES_EXT 0x8E72 -#define GL_TESS_CONTROL_OUTPUT_VERTICES_EXT 0x8E75 -#define GL_TESS_GEN_MODE_EXT 0x8E76 -#define GL_TESS_GEN_SPACING_EXT 0x8E77 -#define GL_TESS_GEN_VERTEX_ORDER_EXT 0x8E78 -#define GL_TESS_GEN_POINT_MODE_EXT 0x8E79 -#define GL_ISOLINES_EXT 0x8E7A -#define GL_FRACTIONAL_ODD_EXT 0x8E7B -#define GL_FRACTIONAL_EVEN_EXT 0x8E7C -#define GL_MAX_PATCH_VERTICES_EXT 0x8E7D -#define GL_MAX_TESS_GEN_LEVEL_EXT 0x8E7E -#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_EXT 0x8E7F -#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT 0x8E80 -#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_EXT 0x8E81 -#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_EXT 0x8E82 -#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_EXT 0x8E83 -#define GL_MAX_TESS_PATCH_COMPONENTS_EXT 0x8E84 -#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_EXT 0x8E85 -#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_EXT 0x8E86 -#define GL_TESS_EVALUATION_SHADER_EXT 0x8E87 -#define GL_TESS_CONTROL_SHADER_EXT 0x8E88 -#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_EXT 0x8E89 -#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_EXT 0x8E8A -#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_EXT 0x90CB -#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_EXT 0x90CC -#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_EXT 0x90D8 -#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_EXT 0x90D9 -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_EXT 0x92CD -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_EXT 0x92CE -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_EXT 0x92D3 -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_EXT 0x92D4 -#define GL_IS_PER_PATCH_EXT 0x92E7 -#define GL_REFERENCED_BY_TESS_CONTROL_SHADER_EXT 0x9307 -#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER_EXT 0x9308 - -#define GLEW_EXT_tessellation_shader GLEW_GET_VAR(__GLEW_EXT_tessellation_shader) - -#endif /* GL_EXT_tessellation_shader */ - -/* ----------------------------- GL_EXT_texture ---------------------------- */ - -#ifndef GL_EXT_texture -#define GL_EXT_texture 1 - -#define GL_ALPHA4_EXT 0x803B -#define GL_ALPHA8_EXT 0x803C -#define GL_ALPHA12_EXT 0x803D -#define GL_ALPHA16_EXT 0x803E -#define GL_LUMINANCE4_EXT 0x803F -#define GL_LUMINANCE8_EXT 0x8040 -#define GL_LUMINANCE12_EXT 0x8041 -#define GL_LUMINANCE16_EXT 0x8042 -#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 -#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 -#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 -#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 -#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 -#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 -#define GL_INTENSITY_EXT 0x8049 -#define GL_INTENSITY4_EXT 0x804A -#define GL_INTENSITY8_EXT 0x804B -#define GL_INTENSITY12_EXT 0x804C -#define GL_INTENSITY16_EXT 0x804D -#define GL_RGB2_EXT 0x804E -#define GL_RGB4_EXT 0x804F -#define GL_RGB5_EXT 0x8050 -#define GL_RGB8_EXT 0x8051 -#define GL_RGB10_EXT 0x8052 -#define GL_RGB12_EXT 0x8053 -#define GL_RGB16_EXT 0x8054 -#define GL_RGBA2_EXT 0x8055 -#define GL_RGBA4_EXT 0x8056 -#define GL_RGB5_A1_EXT 0x8057 -#define GL_RGBA8_EXT 0x8058 -#define GL_RGB10_A2_EXT 0x8059 -#define GL_RGBA12_EXT 0x805A -#define GL_RGBA16_EXT 0x805B -#define GL_TEXTURE_RED_SIZE_EXT 0x805C -#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D -#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E -#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 -#define GL_REPLACE_EXT 0x8062 -#define GL_PROXY_TEXTURE_1D_EXT 0x8063 -#define GL_PROXY_TEXTURE_2D_EXT 0x8064 - -#define GLEW_EXT_texture GLEW_GET_VAR(__GLEW_EXT_texture) - -#endif /* GL_EXT_texture */ - -/* ---------------------------- GL_EXT_texture3D --------------------------- */ - -#ifndef GL_EXT_texture3D -#define GL_EXT_texture3D 1 - -#define GL_PACK_SKIP_IMAGES_EXT 0x806B -#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C -#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D -#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E -#define GL_TEXTURE_3D_EXT 0x806F -#define GL_PROXY_TEXTURE_3D_EXT 0x8070 -#define GL_TEXTURE_DEPTH_EXT 0x8071 -#define GL_TEXTURE_WRAP_R_EXT 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 - -typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); - -#define glTexImage3DEXT GLEW_GET_FUN(__glewTexImage3DEXT) - -#define GLEW_EXT_texture3D GLEW_GET_VAR(__GLEW_EXT_texture3D) - -#endif /* GL_EXT_texture3D */ - -/* -------------------------- GL_EXT_texture_array ------------------------- */ - -#ifndef GL_EXT_texture_array -#define GL_EXT_texture_array 1 - -#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E -#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF -#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 -#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 -#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A -#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B -#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C -#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); - -#define glFramebufferTextureLayerEXT GLEW_GET_FUN(__glewFramebufferTextureLayerEXT) - -#define GLEW_EXT_texture_array GLEW_GET_VAR(__GLEW_EXT_texture_array) - -#endif /* GL_EXT_texture_array */ - -/* ---------------------- GL_EXT_texture_border_clamp ---------------------- */ - -#ifndef GL_EXT_texture_border_clamp -#define GL_EXT_texture_border_clamp 1 - -#define GL_TEXTURE_BORDER_COLOR_EXT 0x1004 -#define GL_CLAMP_TO_BORDER_EXT 0x812D - -typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIIVEXTPROC) (GLuint sampler, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIUIVEXTPROC) (GLuint sampler, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIIVEXTPROC) (GLuint sampler, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIUIVEXTPROC) (GLuint sampler, GLenum pname, const GLuint* params); - -#define glGetSamplerParameterIivEXT GLEW_GET_FUN(__glewGetSamplerParameterIivEXT) -#define glGetSamplerParameterIuivEXT GLEW_GET_FUN(__glewGetSamplerParameterIuivEXT) -#define glSamplerParameterIivEXT GLEW_GET_FUN(__glewSamplerParameterIivEXT) -#define glSamplerParameterIuivEXT GLEW_GET_FUN(__glewSamplerParameterIuivEXT) - -#define GLEW_EXT_texture_border_clamp GLEW_GET_VAR(__GLEW_EXT_texture_border_clamp) - -#endif /* GL_EXT_texture_border_clamp */ - -/* ------------------------- GL_EXT_texture_buffer ------------------------- */ - -#ifndef GL_EXT_texture_buffer -#define GL_EXT_texture_buffer 1 - -#define GL_TEXTURE_BUFFER_BINDING_EXT 0x8C2A -#define GL_TEXTURE_BUFFER_EXT 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D -#define GL_SAMPLER_BUFFER_EXT 0x8DC2 -#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 -#define GL_IMAGE_BUFFER_EXT 0x9051 -#define GL_INT_IMAGE_BUFFER_EXT 0x905C -#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 -#define GL_TEXTURE_BUFFER_OFFSET_EXT 0x919D -#define GL_TEXTURE_BUFFER_SIZE_EXT 0x919E -#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_EXT 0x919F - -#define GLEW_EXT_texture_buffer GLEW_GET_VAR(__GLEW_EXT_texture_buffer) - -#endif /* GL_EXT_texture_buffer */ - -/* ---------------------- GL_EXT_texture_buffer_object --------------------- */ - -#ifndef GL_EXT_texture_buffer_object -#define GL_EXT_texture_buffer_object 1 - -#define GL_TEXTURE_BUFFER_EXT 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E - -typedef void (GLAPIENTRY * PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); - -#define glTexBufferEXT GLEW_GET_FUN(__glewTexBufferEXT) - -#define GLEW_EXT_texture_buffer_object GLEW_GET_VAR(__GLEW_EXT_texture_buffer_object) - -#endif /* GL_EXT_texture_buffer_object */ - -/* -------------- GL_EXT_texture_compression_astc_decode_mode -------------- */ - -#ifndef GL_EXT_texture_compression_astc_decode_mode -#define GL_EXT_texture_compression_astc_decode_mode 1 - -#define GL_TEXTURE_ASTC_DECODE_PRECISION_EXT 0x8F69 - -#define GLEW_EXT_texture_compression_astc_decode_mode GLEW_GET_VAR(__GLEW_EXT_texture_compression_astc_decode_mode) - -#endif /* GL_EXT_texture_compression_astc_decode_mode */ - -/* ----------- GL_EXT_texture_compression_astc_decode_mode_rgb9e5 ---------- */ - -#ifndef GL_EXT_texture_compression_astc_decode_mode_rgb9e5 -#define GL_EXT_texture_compression_astc_decode_mode_rgb9e5 1 - -#define GL_TEXTURE_ASTC_DECODE_PRECISION_EXT 0x8F69 - -#define GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5 GLEW_GET_VAR(__GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5) - -#endif /* GL_EXT_texture_compression_astc_decode_mode_rgb9e5 */ - -/* -------------------- GL_EXT_texture_compression_bptc -------------------- */ - -#ifndef GL_EXT_texture_compression_bptc -#define GL_EXT_texture_compression_bptc 1 - -#define GL_COMPRESSED_RGBA_BPTC_UNORM_EXT 0x8E8C -#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT 0x8E8D -#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT 0x8E8E -#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT 0x8E8F - -#define GLEW_EXT_texture_compression_bptc GLEW_GET_VAR(__GLEW_EXT_texture_compression_bptc) - -#endif /* GL_EXT_texture_compression_bptc */ - -/* -------------------- GL_EXT_texture_compression_dxt1 -------------------- */ - -#ifndef GL_EXT_texture_compression_dxt1 -#define GL_EXT_texture_compression_dxt1 1 - -#define GLEW_EXT_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_EXT_texture_compression_dxt1) - -#endif /* GL_EXT_texture_compression_dxt1 */ - -/* -------------------- GL_EXT_texture_compression_latc -------------------- */ - -#ifndef GL_EXT_texture_compression_latc -#define GL_EXT_texture_compression_latc 1 - -#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 -#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 -#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 -#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 - -#define GLEW_EXT_texture_compression_latc GLEW_GET_VAR(__GLEW_EXT_texture_compression_latc) - -#endif /* GL_EXT_texture_compression_latc */ - -/* -------------------- GL_EXT_texture_compression_rgtc -------------------- */ - -#ifndef GL_EXT_texture_compression_rgtc -#define GL_EXT_texture_compression_rgtc 1 - -#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB -#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC -#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD -#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE - -#define GLEW_EXT_texture_compression_rgtc GLEW_GET_VAR(__GLEW_EXT_texture_compression_rgtc) - -#endif /* GL_EXT_texture_compression_rgtc */ - -/* -------------------- GL_EXT_texture_compression_s3tc -------------------- */ - -#ifndef GL_EXT_texture_compression_s3tc -#define GL_EXT_texture_compression_s3tc 1 - -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 - -#define GLEW_EXT_texture_compression_s3tc GLEW_GET_VAR(__GLEW_EXT_texture_compression_s3tc) - -#endif /* GL_EXT_texture_compression_s3tc */ - -/* ------------------ GL_EXT_texture_compression_s3tc_srgb ----------------- */ - -#ifndef GL_EXT_texture_compression_s3tc_srgb -#define GL_EXT_texture_compression_s3tc_srgb 1 - -#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F - -#define GLEW_EXT_texture_compression_s3tc_srgb GLEW_GET_VAR(__GLEW_EXT_texture_compression_s3tc_srgb) - -#endif /* GL_EXT_texture_compression_s3tc_srgb */ - -/* ------------------------ GL_EXT_texture_cube_map ------------------------ */ - -#ifndef GL_EXT_texture_cube_map -#define GL_EXT_texture_cube_map 1 - -#define GL_NORMAL_MAP_EXT 0x8511 -#define GL_REFLECTION_MAP_EXT 0x8512 -#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C - -#define GLEW_EXT_texture_cube_map GLEW_GET_VAR(__GLEW_EXT_texture_cube_map) - -#endif /* GL_EXT_texture_cube_map */ - -/* --------------------- GL_EXT_texture_cube_map_array --------------------- */ - -#ifndef GL_EXT_texture_cube_map_array -#define GL_EXT_texture_cube_map_array 1 - -#define GL_TEXTURE_CUBE_MAP_ARRAY_EXT 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT 0x900A -#define GL_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900F -#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 -#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F -#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A - -#define GLEW_EXT_texture_cube_map_array GLEW_GET_VAR(__GLEW_EXT_texture_cube_map_array) - -#endif /* GL_EXT_texture_cube_map_array */ - -/* ----------------------- GL_EXT_texture_edge_clamp ----------------------- */ - -#ifndef GL_EXT_texture_edge_clamp -#define GL_EXT_texture_edge_clamp 1 - -#define GL_CLAMP_TO_EDGE_EXT 0x812F - -#define GLEW_EXT_texture_edge_clamp GLEW_GET_VAR(__GLEW_EXT_texture_edge_clamp) - -#endif /* GL_EXT_texture_edge_clamp */ - -/* --------------------------- GL_EXT_texture_env -------------------------- */ - -#ifndef GL_EXT_texture_env -#define GL_EXT_texture_env 1 - -#define GLEW_EXT_texture_env GLEW_GET_VAR(__GLEW_EXT_texture_env) - -#endif /* GL_EXT_texture_env */ - -/* ------------------------- GL_EXT_texture_env_add ------------------------ */ - -#ifndef GL_EXT_texture_env_add -#define GL_EXT_texture_env_add 1 - -#define GLEW_EXT_texture_env_add GLEW_GET_VAR(__GLEW_EXT_texture_env_add) - -#endif /* GL_EXT_texture_env_add */ - -/* ----------------------- GL_EXT_texture_env_combine ---------------------- */ - -#ifndef GL_EXT_texture_env_combine -#define GL_EXT_texture_env_combine 1 - -#define GL_COMBINE_EXT 0x8570 -#define GL_COMBINE_RGB_EXT 0x8571 -#define GL_COMBINE_ALPHA_EXT 0x8572 -#define GL_RGB_SCALE_EXT 0x8573 -#define GL_ADD_SIGNED_EXT 0x8574 -#define GL_INTERPOLATE_EXT 0x8575 -#define GL_CONSTANT_EXT 0x8576 -#define GL_PRIMARY_COLOR_EXT 0x8577 -#define GL_PREVIOUS_EXT 0x8578 -#define GL_SOURCE0_RGB_EXT 0x8580 -#define GL_SOURCE1_RGB_EXT 0x8581 -#define GL_SOURCE2_RGB_EXT 0x8582 -#define GL_SOURCE0_ALPHA_EXT 0x8588 -#define GL_SOURCE1_ALPHA_EXT 0x8589 -#define GL_SOURCE2_ALPHA_EXT 0x858A -#define GL_OPERAND0_RGB_EXT 0x8590 -#define GL_OPERAND1_RGB_EXT 0x8591 -#define GL_OPERAND2_RGB_EXT 0x8592 -#define GL_OPERAND0_ALPHA_EXT 0x8598 -#define GL_OPERAND1_ALPHA_EXT 0x8599 -#define GL_OPERAND2_ALPHA_EXT 0x859A - -#define GLEW_EXT_texture_env_combine GLEW_GET_VAR(__GLEW_EXT_texture_env_combine) - -#endif /* GL_EXT_texture_env_combine */ - -/* ------------------------ GL_EXT_texture_env_dot3 ------------------------ */ - -#ifndef GL_EXT_texture_env_dot3 -#define GL_EXT_texture_env_dot3 1 - -#define GL_DOT3_RGB_EXT 0x8740 -#define GL_DOT3_RGBA_EXT 0x8741 - -#define GLEW_EXT_texture_env_dot3 GLEW_GET_VAR(__GLEW_EXT_texture_env_dot3) - -#endif /* GL_EXT_texture_env_dot3 */ - -/* ------------------- GL_EXT_texture_filter_anisotropic ------------------- */ - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_EXT_texture_filter_anisotropic 1 - -#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF - -#define GLEW_EXT_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_EXT_texture_filter_anisotropic) - -#endif /* GL_EXT_texture_filter_anisotropic */ - -/* ---------------------- GL_EXT_texture_filter_minmax --------------------- */ - -#ifndef GL_EXT_texture_filter_minmax -#define GL_EXT_texture_filter_minmax 1 - -#define GL_TEXTURE_REDUCTION_MODE_EXT 0x9366 -#define GL_WEIGHTED_AVERAGE_EXT 0x9367 - -#define GLEW_EXT_texture_filter_minmax GLEW_GET_VAR(__GLEW_EXT_texture_filter_minmax) - -#endif /* GL_EXT_texture_filter_minmax */ - -/* --------------------- GL_EXT_texture_format_BGRA8888 -------------------- */ - -#ifndef GL_EXT_texture_format_BGRA8888 -#define GL_EXT_texture_format_BGRA8888 1 - -#define GL_BGRA_EXT 0x80E1 - -#define GLEW_EXT_texture_format_BGRA8888 GLEW_GET_VAR(__GLEW_EXT_texture_format_BGRA8888) - -#endif /* GL_EXT_texture_format_BGRA8888 */ - -/* ------------------ GL_EXT_texture_format_sRGB_override ------------------ */ - -#ifndef GL_EXT_texture_format_sRGB_override -#define GL_EXT_texture_format_sRGB_override 1 - -#define GL_TEXTURE_FORMAT_SRGB_OVERRIDE_EXT 0x8FBF - -#define GLEW_EXT_texture_format_sRGB_override GLEW_GET_VAR(__GLEW_EXT_texture_format_sRGB_override) - -#endif /* GL_EXT_texture_format_sRGB_override */ - -/* ------------------------- GL_EXT_texture_integer ------------------------ */ - -#ifndef GL_EXT_texture_integer -#define GL_EXT_texture_integer 1 - -#define GL_RGBA32UI_EXT 0x8D70 -#define GL_RGB32UI_EXT 0x8D71 -#define GL_ALPHA32UI_EXT 0x8D72 -#define GL_INTENSITY32UI_EXT 0x8D73 -#define GL_LUMINANCE32UI_EXT 0x8D74 -#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 -#define GL_RGBA16UI_EXT 0x8D76 -#define GL_RGB16UI_EXT 0x8D77 -#define GL_ALPHA16UI_EXT 0x8D78 -#define GL_INTENSITY16UI_EXT 0x8D79 -#define GL_LUMINANCE16UI_EXT 0x8D7A -#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B -#define GL_RGBA8UI_EXT 0x8D7C -#define GL_RGB8UI_EXT 0x8D7D -#define GL_ALPHA8UI_EXT 0x8D7E -#define GL_INTENSITY8UI_EXT 0x8D7F -#define GL_LUMINANCE8UI_EXT 0x8D80 -#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 -#define GL_RGBA32I_EXT 0x8D82 -#define GL_RGB32I_EXT 0x8D83 -#define GL_ALPHA32I_EXT 0x8D84 -#define GL_INTENSITY32I_EXT 0x8D85 -#define GL_LUMINANCE32I_EXT 0x8D86 -#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 -#define GL_RGBA16I_EXT 0x8D88 -#define GL_RGB16I_EXT 0x8D89 -#define GL_ALPHA16I_EXT 0x8D8A -#define GL_INTENSITY16I_EXT 0x8D8B -#define GL_LUMINANCE16I_EXT 0x8D8C -#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D -#define GL_RGBA8I_EXT 0x8D8E -#define GL_RGB8I_EXT 0x8D8F -#define GL_ALPHA8I_EXT 0x8D90 -#define GL_INTENSITY8I_EXT 0x8D91 -#define GL_LUMINANCE8I_EXT 0x8D92 -#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 -#define GL_RED_INTEGER_EXT 0x8D94 -#define GL_GREEN_INTEGER_EXT 0x8D95 -#define GL_BLUE_INTEGER_EXT 0x8D96 -#define GL_ALPHA_INTEGER_EXT 0x8D97 -#define GL_RGB_INTEGER_EXT 0x8D98 -#define GL_RGBA_INTEGER_EXT 0x8D99 -#define GL_BGR_INTEGER_EXT 0x8D9A -#define GL_BGRA_INTEGER_EXT 0x8D9B -#define GL_LUMINANCE_INTEGER_EXT 0x8D9C -#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D -#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E - -typedef void (GLAPIENTRY * PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); -typedef void (GLAPIENTRY * PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); -typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); -typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); - -#define glClearColorIiEXT GLEW_GET_FUN(__glewClearColorIiEXT) -#define glClearColorIuiEXT GLEW_GET_FUN(__glewClearColorIuiEXT) -#define glGetTexParameterIivEXT GLEW_GET_FUN(__glewGetTexParameterIivEXT) -#define glGetTexParameterIuivEXT GLEW_GET_FUN(__glewGetTexParameterIuivEXT) -#define glTexParameterIivEXT GLEW_GET_FUN(__glewTexParameterIivEXT) -#define glTexParameterIuivEXT GLEW_GET_FUN(__glewTexParameterIuivEXT) - -#define GLEW_EXT_texture_integer GLEW_GET_VAR(__GLEW_EXT_texture_integer) - -#endif /* GL_EXT_texture_integer */ - -/* ------------------------ GL_EXT_texture_lod_bias ------------------------ */ - -#ifndef GL_EXT_texture_lod_bias -#define GL_EXT_texture_lod_bias 1 - -#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD -#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 -#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 - -#define GLEW_EXT_texture_lod_bias GLEW_GET_VAR(__GLEW_EXT_texture_lod_bias) - -#endif /* GL_EXT_texture_lod_bias */ - -/* ---------------------- GL_EXT_texture_mirror_clamp ---------------------- */ - -#ifndef GL_EXT_texture_mirror_clamp -#define GL_EXT_texture_mirror_clamp 1 - -#define GL_MIRROR_CLAMP_EXT 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 -#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 - -#define GLEW_EXT_texture_mirror_clamp GLEW_GET_VAR(__GLEW_EXT_texture_mirror_clamp) - -#endif /* GL_EXT_texture_mirror_clamp */ - -/* ------------------ GL_EXT_texture_mirror_clamp_to_edge ------------------ */ - -#ifndef GL_EXT_texture_mirror_clamp_to_edge -#define GL_EXT_texture_mirror_clamp_to_edge 1 - -#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 - -#define GLEW_EXT_texture_mirror_clamp_to_edge GLEW_GET_VAR(__GLEW_EXT_texture_mirror_clamp_to_edge) - -#endif /* GL_EXT_texture_mirror_clamp_to_edge */ - -/* ------------------------- GL_EXT_texture_norm16 ------------------------- */ - -#ifndef GL_EXT_texture_norm16 -#define GL_EXT_texture_norm16 1 - -#define GL_RGB16_EXT 0x8054 -#define GL_RGBA16_EXT 0x805B -#define GL_R16_EXT 0x822A -#define GL_RG16_EXT 0x822C -#define GL_R16_SNORM_EXT 0x8F98 -#define GL_RG16_SNORM_EXT 0x8F99 -#define GL_RGB16_SNORM_EXT 0x8F9A -#define GL_RGBA16_SNORM_EXT 0x8F9B - -#define GLEW_EXT_texture_norm16 GLEW_GET_VAR(__GLEW_EXT_texture_norm16) - -#endif /* GL_EXT_texture_norm16 */ - -/* ------------------------- GL_EXT_texture_object ------------------------- */ - -#ifndef GL_EXT_texture_object -#define GL_EXT_texture_object 1 - -#define GL_TEXTURE_PRIORITY_EXT 0x8066 -#define GL_TEXTURE_RESIDENT_EXT 0x8067 -#define GL_TEXTURE_1D_BINDING_EXT 0x8068 -#define GL_TEXTURE_2D_BINDING_EXT 0x8069 -#define GL_TEXTURE_3D_BINDING_EXT 0x806A - -typedef GLboolean (GLAPIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint* textures, GLboolean* residences); -typedef void (GLAPIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); -typedef void (GLAPIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint* textures); -typedef void (GLAPIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint* textures); -typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture); -typedef void (GLAPIENTRY * PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint* textures, const GLclampf* priorities); - -#define glAreTexturesResidentEXT GLEW_GET_FUN(__glewAreTexturesResidentEXT) -#define glBindTextureEXT GLEW_GET_FUN(__glewBindTextureEXT) -#define glDeleteTexturesEXT GLEW_GET_FUN(__glewDeleteTexturesEXT) -#define glGenTexturesEXT GLEW_GET_FUN(__glewGenTexturesEXT) -#define glIsTextureEXT GLEW_GET_FUN(__glewIsTextureEXT) -#define glPrioritizeTexturesEXT GLEW_GET_FUN(__glewPrioritizeTexturesEXT) - -#define GLEW_EXT_texture_object GLEW_GET_VAR(__GLEW_EXT_texture_object) - -#endif /* GL_EXT_texture_object */ - -/* --------------------- GL_EXT_texture_perturb_normal --------------------- */ - -#ifndef GL_EXT_texture_perturb_normal -#define GL_EXT_texture_perturb_normal 1 - -#define GL_PERTURB_EXT 0x85AE -#define GL_TEXTURE_NORMAL_EXT 0x85AF - -typedef void (GLAPIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode); - -#define glTextureNormalEXT GLEW_GET_FUN(__glewTextureNormalEXT) - -#define GLEW_EXT_texture_perturb_normal GLEW_GET_VAR(__GLEW_EXT_texture_perturb_normal) - -#endif /* GL_EXT_texture_perturb_normal */ - -/* ------------------------ GL_EXT_texture_query_lod ----------------------- */ - -#ifndef GL_EXT_texture_query_lod -#define GL_EXT_texture_query_lod 1 - -#define GLEW_EXT_texture_query_lod GLEW_GET_VAR(__GLEW_EXT_texture_query_lod) - -#endif /* GL_EXT_texture_query_lod */ - -/* ------------------------ GL_EXT_texture_rectangle ----------------------- */ - -#ifndef GL_EXT_texture_rectangle -#define GL_EXT_texture_rectangle 1 - -#define GL_TEXTURE_RECTANGLE_EXT 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_EXT 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_EXT 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8 - -#define GLEW_EXT_texture_rectangle GLEW_GET_VAR(__GLEW_EXT_texture_rectangle) - -#endif /* GL_EXT_texture_rectangle */ - -/* --------------------------- GL_EXT_texture_rg --------------------------- */ - -#ifndef GL_EXT_texture_rg -#define GL_EXT_texture_rg 1 - -#define GL_RED_EXT 0x1903 -#define GL_RG_EXT 0x8227 -#define GL_R8_EXT 0x8229 -#define GL_RG8_EXT 0x822B - -#define GLEW_EXT_texture_rg GLEW_GET_VAR(__GLEW_EXT_texture_rg) - -#endif /* GL_EXT_texture_rg */ - -/* -------------------------- GL_EXT_texture_sRGB -------------------------- */ - -#ifndef GL_EXT_texture_sRGB -#define GL_EXT_texture_sRGB 1 - -#define GL_SRGB_EXT 0x8C40 -#define GL_SRGB8_EXT 0x8C41 -#define GL_SRGB_ALPHA_EXT 0x8C42 -#define GL_SRGB8_ALPHA8_EXT 0x8C43 -#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 -#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 -#define GL_SLUMINANCE_EXT 0x8C46 -#define GL_SLUMINANCE8_EXT 0x8C47 -#define GL_COMPRESSED_SRGB_EXT 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 -#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A -#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B -#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F - -#define GLEW_EXT_texture_sRGB GLEW_GET_VAR(__GLEW_EXT_texture_sRGB) - -#endif /* GL_EXT_texture_sRGB */ - -/* ------------------------- GL_EXT_texture_sRGB_R8 ------------------------ */ - -#ifndef GL_EXT_texture_sRGB_R8 -#define GL_EXT_texture_sRGB_R8 1 - -#define GL_SR8_EXT 0x8FBD - -#define GLEW_EXT_texture_sRGB_R8 GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_R8) - -#endif /* GL_EXT_texture_sRGB_R8 */ - -/* ------------------------ GL_EXT_texture_sRGB_RG8 ------------------------ */ - -#ifndef GL_EXT_texture_sRGB_RG8 -#define GL_EXT_texture_sRGB_RG8 1 - -#define GL_SRG8_EXT 0x8FBE - -#define GLEW_EXT_texture_sRGB_RG8 GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_RG8) - -#endif /* GL_EXT_texture_sRGB_RG8 */ - -/* ----------------------- GL_EXT_texture_sRGB_decode ---------------------- */ - -#ifndef GL_EXT_texture_sRGB_decode -#define GL_EXT_texture_sRGB_decode 1 - -#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 -#define GL_DECODE_EXT 0x8A49 -#define GL_SKIP_DECODE_EXT 0x8A4A - -#define GLEW_EXT_texture_sRGB_decode GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_decode) - -#endif /* GL_EXT_texture_sRGB_decode */ - -/* ----------------------- GL_EXT_texture_shadow_lod ----------------------- */ - -#ifndef GL_EXT_texture_shadow_lod -#define GL_EXT_texture_shadow_lod 1 - -#define GLEW_EXT_texture_shadow_lod GLEW_GET_VAR(__GLEW_EXT_texture_shadow_lod) - -#endif /* GL_EXT_texture_shadow_lod */ - -/* --------------------- GL_EXT_texture_shared_exponent -------------------- */ - -#ifndef GL_EXT_texture_shared_exponent -#define GL_EXT_texture_shared_exponent 1 - -#define GL_RGB9_E5_EXT 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E -#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F - -#define GLEW_EXT_texture_shared_exponent GLEW_GET_VAR(__GLEW_EXT_texture_shared_exponent) - -#endif /* GL_EXT_texture_shared_exponent */ - -/* -------------------------- GL_EXT_texture_snorm ------------------------- */ - -#ifndef GL_EXT_texture_snorm -#define GL_EXT_texture_snorm 1 - -#define GL_RED_SNORM 0x8F90 -#define GL_RG_SNORM 0x8F91 -#define GL_RGB_SNORM 0x8F92 -#define GL_RGBA_SNORM 0x8F93 -#define GL_R8_SNORM 0x8F94 -#define GL_RG8_SNORM 0x8F95 -#define GL_RGB8_SNORM 0x8F96 -#define GL_RGBA8_SNORM 0x8F97 -#define GL_R16_SNORM 0x8F98 -#define GL_RG16_SNORM 0x8F99 -#define GL_RGB16_SNORM 0x8F9A -#define GL_RGBA16_SNORM 0x8F9B -#define GL_SIGNED_NORMALIZED 0x8F9C -#define GL_ALPHA_SNORM 0x9010 -#define GL_LUMINANCE_SNORM 0x9011 -#define GL_LUMINANCE_ALPHA_SNORM 0x9012 -#define GL_INTENSITY_SNORM 0x9013 -#define GL_ALPHA8_SNORM 0x9014 -#define GL_LUMINANCE8_SNORM 0x9015 -#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 -#define GL_INTENSITY8_SNORM 0x9017 -#define GL_ALPHA16_SNORM 0x9018 -#define GL_LUMINANCE16_SNORM 0x9019 -#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A -#define GL_INTENSITY16_SNORM 0x901B - -#define GLEW_EXT_texture_snorm GLEW_GET_VAR(__GLEW_EXT_texture_snorm) - -#endif /* GL_EXT_texture_snorm */ - -/* ------------------------- GL_EXT_texture_storage ------------------------ */ - -#ifndef GL_EXT_texture_storage -#define GL_EXT_texture_storage 1 - -#define GL_ALPHA8_EXT 0x803C -#define GL_LUMINANCE8_EXT 0x8040 -#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 -#define GL_RGB10_EXT 0x8052 -#define GL_RGB10_A2_EXT 0x8059 -#define GL_R8_EXT 0x8229 -#define GL_RG8_EXT 0x822B -#define GL_R16F_EXT 0x822D -#define GL_R32F_EXT 0x822E -#define GL_RG16F_EXT 0x822F -#define GL_RG32F_EXT 0x8230 -#define GL_RGBA32F_EXT 0x8814 -#define GL_RGB32F_EXT 0x8815 -#define GL_ALPHA32F_EXT 0x8816 -#define GL_LUMINANCE32F_EXT 0x8818 -#define GL_LUMINANCE_ALPHA32F_EXT 0x8819 -#define GL_RGBA16F_EXT 0x881A -#define GL_RGB16F_EXT 0x881B -#define GL_ALPHA16F_EXT 0x881C -#define GL_LUMINANCE16F_EXT 0x881E -#define GL_LUMINANCE_ALPHA16F_EXT 0x881F -#define GL_RGB_RAW_422_APPLE 0x8A51 -#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F -#define GL_BGRA8_EXT 0x93A1 - -typedef void (GLAPIENTRY * PFNGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); - -#define glTexStorage1DEXT GLEW_GET_FUN(__glewTexStorage1DEXT) -#define glTexStorage2DEXT GLEW_GET_FUN(__glewTexStorage2DEXT) -#define glTexStorage3DEXT GLEW_GET_FUN(__glewTexStorage3DEXT) -#define glTextureStorage1DEXT GLEW_GET_FUN(__glewTextureStorage1DEXT) -#define glTextureStorage2DEXT GLEW_GET_FUN(__glewTextureStorage2DEXT) -#define glTextureStorage3DEXT GLEW_GET_FUN(__glewTextureStorage3DEXT) - -#define GLEW_EXT_texture_storage GLEW_GET_VAR(__GLEW_EXT_texture_storage) - -#endif /* GL_EXT_texture_storage */ - -/* ------------------------- GL_EXT_texture_swizzle ------------------------ */ - -#ifndef GL_EXT_texture_swizzle -#define GL_EXT_texture_swizzle 1 - -#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 -#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 -#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 -#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 -#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 - -#define GLEW_EXT_texture_swizzle GLEW_GET_VAR(__GLEW_EXT_texture_swizzle) - -#endif /* GL_EXT_texture_swizzle */ - -/* ------------------- GL_EXT_texture_type_2_10_10_10_REV ------------------ */ - -#ifndef GL_EXT_texture_type_2_10_10_10_REV -#define GL_EXT_texture_type_2_10_10_10_REV 1 - -#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 - -#define GLEW_EXT_texture_type_2_10_10_10_REV GLEW_GET_VAR(__GLEW_EXT_texture_type_2_10_10_10_REV) - -#endif /* GL_EXT_texture_type_2_10_10_10_REV */ - -/* -------------------------- GL_EXT_texture_view -------------------------- */ - -#ifndef GL_EXT_texture_view -#define GL_EXT_texture_view 1 - -#define GL_TEXTURE_VIEW_MIN_LEVEL_EXT 0x82DB -#define GL_TEXTURE_VIEW_NUM_LEVELS_EXT 0x82DC -#define GL_TEXTURE_VIEW_MIN_LAYER_EXT 0x82DD -#define GL_TEXTURE_VIEW_NUM_LAYERS_EXT 0x82DE -#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF - -typedef void (GLAPIENTRY * PFNGLTEXTUREVIEWEXTPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); - -#define glTextureViewEXT GLEW_GET_FUN(__glewTextureViewEXT) - -#define GLEW_EXT_texture_view GLEW_GET_VAR(__GLEW_EXT_texture_view) - -#endif /* GL_EXT_texture_view */ - -/* --------------------------- GL_EXT_timer_query -------------------------- */ - -#ifndef GL_EXT_timer_query -#define GL_EXT_timer_query 1 - -#define GL_TIME_ELAPSED_EXT 0x88BF - -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params); - -#define glGetQueryObjecti64vEXT GLEW_GET_FUN(__glewGetQueryObjecti64vEXT) -#define glGetQueryObjectui64vEXT GLEW_GET_FUN(__glewGetQueryObjectui64vEXT) - -#define GLEW_EXT_timer_query GLEW_GET_VAR(__GLEW_EXT_timer_query) - -#endif /* GL_EXT_timer_query */ - -/* ----------------------- GL_EXT_transform_feedback ----------------------- */ - -#ifndef GL_EXT_transform_feedback -#define GL_EXT_transform_feedback 1 - -#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 -#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 -#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 -#define GL_RASTERIZER_DISCARD_EXT 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B -#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C -#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F - -typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); -typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei *size, GLenum *type, GLchar *name); -typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar * const* varyings, GLenum bufferMode); - -#define glBeginTransformFeedbackEXT GLEW_GET_FUN(__glewBeginTransformFeedbackEXT) -#define glBindBufferBaseEXT GLEW_GET_FUN(__glewBindBufferBaseEXT) -#define glBindBufferOffsetEXT GLEW_GET_FUN(__glewBindBufferOffsetEXT) -#define glBindBufferRangeEXT GLEW_GET_FUN(__glewBindBufferRangeEXT) -#define glEndTransformFeedbackEXT GLEW_GET_FUN(__glewEndTransformFeedbackEXT) -#define glGetTransformFeedbackVaryingEXT GLEW_GET_FUN(__glewGetTransformFeedbackVaryingEXT) -#define glTransformFeedbackVaryingsEXT GLEW_GET_FUN(__glewTransformFeedbackVaryingsEXT) - -#define GLEW_EXT_transform_feedback GLEW_GET_VAR(__GLEW_EXT_transform_feedback) - -#endif /* GL_EXT_transform_feedback */ - -/* ------------------------- GL_EXT_unpack_subimage ------------------------ */ - -#ifndef GL_EXT_unpack_subimage -#define GL_EXT_unpack_subimage 1 - -#define GL_UNPACK_ROW_LENGTH_EXT 0x0CF2 -#define GL_UNPACK_SKIP_ROWS_EXT 0x0CF3 -#define GL_UNPACK_SKIP_PIXELS_EXT 0x0CF4 - -#define GLEW_EXT_unpack_subimage GLEW_GET_VAR(__GLEW_EXT_unpack_subimage) - -#endif /* GL_EXT_unpack_subimage */ - -/* -------------------------- GL_EXT_vertex_array -------------------------- */ - -#ifndef GL_EXT_vertex_array -#define GL_EXT_vertex_array 1 - -#define GL_DOUBLE_EXT 0x140A -#define GL_VERTEX_ARRAY_EXT 0x8074 -#define GL_NORMAL_ARRAY_EXT 0x8075 -#define GL_COLOR_ARRAY_EXT 0x8076 -#define GL_INDEX_ARRAY_EXT 0x8077 -#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 -#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 -#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A -#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B -#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C -#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D -#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E -#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F -#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 -#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 -#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 -#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 -#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 -#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 -#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 -#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 -#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A -#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B -#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C -#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D -#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E -#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F -#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 -#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 -#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 -#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 - -typedef void (GLAPIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i); -typedef void (GLAPIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean* pointer); -typedef void (GLAPIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); -typedef void (GLAPIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); -typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); -typedef void (GLAPIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); - -#define glArrayElementEXT GLEW_GET_FUN(__glewArrayElementEXT) -#define glColorPointerEXT GLEW_GET_FUN(__glewColorPointerEXT) -#define glDrawArraysEXT GLEW_GET_FUN(__glewDrawArraysEXT) -#define glEdgeFlagPointerEXT GLEW_GET_FUN(__glewEdgeFlagPointerEXT) -#define glIndexPointerEXT GLEW_GET_FUN(__glewIndexPointerEXT) -#define glNormalPointerEXT GLEW_GET_FUN(__glewNormalPointerEXT) -#define glTexCoordPointerEXT GLEW_GET_FUN(__glewTexCoordPointerEXT) -#define glVertexPointerEXT GLEW_GET_FUN(__glewVertexPointerEXT) - -#define GLEW_EXT_vertex_array GLEW_GET_VAR(__GLEW_EXT_vertex_array) - -#endif /* GL_EXT_vertex_array */ - -/* ------------------------ GL_EXT_vertex_array_bgra ----------------------- */ - -#ifndef GL_EXT_vertex_array_bgra -#define GL_EXT_vertex_array_bgra 1 - -#define GL_BGRA 0x80E1 - -#define GLEW_EXT_vertex_array_bgra GLEW_GET_VAR(__GLEW_EXT_vertex_array_bgra) - -#endif /* GL_EXT_vertex_array_bgra */ - -/* ----------------------- GL_EXT_vertex_array_setXXX ---------------------- */ - -#ifndef GL_EXT_vertex_array_setXXX -#define GL_EXT_vertex_array_setXXX 1 - -typedef void (GLAPIENTRY * PFNGLBINDARRAYSETEXTPROC) (const void *arrayset); -typedef const void * (GLAPIENTRY * PFNGLCREATEARRAYSETEXTPROC) (void); -typedef void (GLAPIENTRY * PFNGLDELETEARRAYSETSEXTPROC) (GLsizei n, const void *arrayset[]); - -#define glBindArraySetEXT GLEW_GET_FUN(__glewBindArraySetEXT) -#define glCreateArraySetExt GLEW_GET_FUN(__glewCreateArraySetExt) -#define glDeleteArraySetsEXT GLEW_GET_FUN(__glewDeleteArraySetsEXT) - -#define GLEW_EXT_vertex_array_setXXX GLEW_GET_VAR(__GLEW_EXT_vertex_array_setXXX) - -#endif /* GL_EXT_vertex_array_setXXX */ - -/* ----------------------- GL_EXT_vertex_attrib_64bit ---------------------- */ - -#ifndef GL_EXT_vertex_attrib_64bit -#define GL_EXT_vertex_attrib_64bit 1 - -#define GL_DOUBLE_MAT2_EXT 0x8F46 -#define GL_DOUBLE_MAT3_EXT 0x8F47 -#define GL_DOUBLE_MAT4_EXT 0x8F48 -#define GL_DOUBLE_MAT2x3_EXT 0x8F49 -#define GL_DOUBLE_MAT2x4_EXT 0x8F4A -#define GL_DOUBLE_MAT3x2_EXT 0x8F4B -#define GL_DOUBLE_MAT3x4_EXT 0x8F4C -#define GL_DOUBLE_MAT4x2_EXT 0x8F4D -#define GL_DOUBLE_MAT4x3_EXT 0x8F4E -#define GL_DOUBLE_VEC2_EXT 0x8FFC -#define GL_DOUBLE_VEC3_EXT 0x8FFD -#define GL_DOUBLE_VEC4_EXT 0x8FFE - -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); - -#define glGetVertexAttribLdvEXT GLEW_GET_FUN(__glewGetVertexAttribLdvEXT) -#define glVertexArrayVertexAttribLOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLOffsetEXT) -#define glVertexAttribL1dEXT GLEW_GET_FUN(__glewVertexAttribL1dEXT) -#define glVertexAttribL1dvEXT GLEW_GET_FUN(__glewVertexAttribL1dvEXT) -#define glVertexAttribL2dEXT GLEW_GET_FUN(__glewVertexAttribL2dEXT) -#define glVertexAttribL2dvEXT GLEW_GET_FUN(__glewVertexAttribL2dvEXT) -#define glVertexAttribL3dEXT GLEW_GET_FUN(__glewVertexAttribL3dEXT) -#define glVertexAttribL3dvEXT GLEW_GET_FUN(__glewVertexAttribL3dvEXT) -#define glVertexAttribL4dEXT GLEW_GET_FUN(__glewVertexAttribL4dEXT) -#define glVertexAttribL4dvEXT GLEW_GET_FUN(__glewVertexAttribL4dvEXT) -#define glVertexAttribLPointerEXT GLEW_GET_FUN(__glewVertexAttribLPointerEXT) - -#define GLEW_EXT_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_EXT_vertex_attrib_64bit) - -#endif /* GL_EXT_vertex_attrib_64bit */ - -/* -------------------------- GL_EXT_vertex_shader ------------------------- */ - -#ifndef GL_EXT_vertex_shader -#define GL_EXT_vertex_shader 1 - -#define GL_VERTEX_SHADER_EXT 0x8780 -#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 -#define GL_OP_INDEX_EXT 0x8782 -#define GL_OP_NEGATE_EXT 0x8783 -#define GL_OP_DOT3_EXT 0x8784 -#define GL_OP_DOT4_EXT 0x8785 -#define GL_OP_MUL_EXT 0x8786 -#define GL_OP_ADD_EXT 0x8787 -#define GL_OP_MADD_EXT 0x8788 -#define GL_OP_FRAC_EXT 0x8789 -#define GL_OP_MAX_EXT 0x878A -#define GL_OP_MIN_EXT 0x878B -#define GL_OP_SET_GE_EXT 0x878C -#define GL_OP_SET_LT_EXT 0x878D -#define GL_OP_CLAMP_EXT 0x878E -#define GL_OP_FLOOR_EXT 0x878F -#define GL_OP_ROUND_EXT 0x8790 -#define GL_OP_EXP_BASE_2_EXT 0x8791 -#define GL_OP_LOG_BASE_2_EXT 0x8792 -#define GL_OP_POWER_EXT 0x8793 -#define GL_OP_RECIP_EXT 0x8794 -#define GL_OP_RECIP_SQRT_EXT 0x8795 -#define GL_OP_SUB_EXT 0x8796 -#define GL_OP_CROSS_PRODUCT_EXT 0x8797 -#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 -#define GL_OP_MOV_EXT 0x8799 -#define GL_OUTPUT_VERTEX_EXT 0x879A -#define GL_OUTPUT_COLOR0_EXT 0x879B -#define GL_OUTPUT_COLOR1_EXT 0x879C -#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D -#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E -#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F -#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 -#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 -#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 -#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 -#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 -#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 -#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 -#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 -#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 -#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 -#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA -#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB -#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC -#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD -#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE -#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF -#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 -#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 -#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 -#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 -#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 -#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 -#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 -#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 -#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 -#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 -#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA -#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB -#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC -#define GL_OUTPUT_FOG_EXT 0x87BD -#define GL_SCALAR_EXT 0x87BE -#define GL_VECTOR_EXT 0x87BF -#define GL_MATRIX_EXT 0x87C0 -#define GL_VARIANT_EXT 0x87C1 -#define GL_INVARIANT_EXT 0x87C2 -#define GL_LOCAL_CONSTANT_EXT 0x87C3 -#define GL_LOCAL_EXT 0x87C4 -#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 -#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 -#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 -#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 -#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CC -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CD -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE -#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF -#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 -#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 -#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 -#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 -#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 -#define GL_X_EXT 0x87D5 -#define GL_Y_EXT 0x87D6 -#define GL_Z_EXT 0x87D7 -#define GL_W_EXT 0x87D8 -#define GL_NEGATIVE_X_EXT 0x87D9 -#define GL_NEGATIVE_Y_EXT 0x87DA -#define GL_NEGATIVE_Z_EXT 0x87DB -#define GL_NEGATIVE_W_EXT 0x87DC -#define GL_ZERO_EXT 0x87DD -#define GL_ONE_EXT 0x87DE -#define GL_NEGATIVE_ONE_EXT 0x87DF -#define GL_NORMALIZED_RANGE_EXT 0x87E0 -#define GL_FULL_RANGE_EXT 0x87E1 -#define GL_CURRENT_VERTEX_EXT 0x87E2 -#define GL_MVP_MATRIX_EXT 0x87E3 -#define GL_VARIANT_VALUE_EXT 0x87E4 -#define GL_VARIANT_DATATYPE_EXT 0x87E5 -#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 -#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 -#define GL_VARIANT_ARRAY_EXT 0x87E8 -#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 -#define GL_INVARIANT_VALUE_EXT 0x87EA -#define GL_INVARIANT_DATATYPE_EXT 0x87EB -#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC -#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED - -typedef void (GLAPIENTRY * PFNGLBEGINVERTEXSHADEREXTPROC) (void); -typedef GLuint (GLAPIENTRY * PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); -typedef GLuint (GLAPIENTRY * PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); -typedef GLuint (GLAPIENTRY * PFNGLBINDPARAMETEREXTPROC) (GLenum value); -typedef GLuint (GLAPIENTRY * PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); -typedef GLuint (GLAPIENTRY * PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); -typedef void (GLAPIENTRY * PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLENDVERTEXSHADEREXTPROC) (void); -typedef void (GLAPIENTRY * PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); -typedef GLuint (GLAPIENTRY * PFNGLGENSYMBOLSEXTPROC) (GLenum dataType, GLenum storageType, GLenum range, GLuint components); -typedef GLuint (GLAPIENTRY * PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); -typedef void (GLAPIENTRY * PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (GLAPIENTRY * PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (GLAPIENTRY * PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (GLAPIENTRY * PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (GLAPIENTRY * PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (GLAPIENTRY * PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (GLAPIENTRY * PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, void **data); -typedef void (GLAPIENTRY * PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); -typedef GLboolean (GLAPIENTRY * PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); -typedef void (GLAPIENTRY * PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, void *addr); -typedef void (GLAPIENTRY * PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, void *addr); -typedef void (GLAPIENTRY * PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); -typedef void (GLAPIENTRY * PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); -typedef void (GLAPIENTRY * PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); -typedef void (GLAPIENTRY * PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -typedef void (GLAPIENTRY * PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, void *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTBVEXTPROC) (GLuint id, GLbyte *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTDVEXTPROC) (GLuint id, GLdouble *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTFVEXTPROC) (GLuint id, GLfloat *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTIVEXTPROC) (GLuint id, GLint *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTSVEXTPROC) (GLuint id, GLshort *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTUBVEXTPROC) (GLuint id, GLubyte *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTUIVEXTPROC) (GLuint id, GLuint *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTUSVEXTPROC) (GLuint id, GLushort *addr); -typedef void (GLAPIENTRY * PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); - -#define glBeginVertexShaderEXT GLEW_GET_FUN(__glewBeginVertexShaderEXT) -#define glBindLightParameterEXT GLEW_GET_FUN(__glewBindLightParameterEXT) -#define glBindMaterialParameterEXT GLEW_GET_FUN(__glewBindMaterialParameterEXT) -#define glBindParameterEXT GLEW_GET_FUN(__glewBindParameterEXT) -#define glBindTexGenParameterEXT GLEW_GET_FUN(__glewBindTexGenParameterEXT) -#define glBindTextureUnitParameterEXT GLEW_GET_FUN(__glewBindTextureUnitParameterEXT) -#define glBindVertexShaderEXT GLEW_GET_FUN(__glewBindVertexShaderEXT) -#define glDeleteVertexShaderEXT GLEW_GET_FUN(__glewDeleteVertexShaderEXT) -#define glDisableVariantClientStateEXT GLEW_GET_FUN(__glewDisableVariantClientStateEXT) -#define glEnableVariantClientStateEXT GLEW_GET_FUN(__glewEnableVariantClientStateEXT) -#define glEndVertexShaderEXT GLEW_GET_FUN(__glewEndVertexShaderEXT) -#define glExtractComponentEXT GLEW_GET_FUN(__glewExtractComponentEXT) -#define glGenSymbolsEXT GLEW_GET_FUN(__glewGenSymbolsEXT) -#define glGenVertexShadersEXT GLEW_GET_FUN(__glewGenVertexShadersEXT) -#define glGetInvariantBooleanvEXT GLEW_GET_FUN(__glewGetInvariantBooleanvEXT) -#define glGetInvariantFloatvEXT GLEW_GET_FUN(__glewGetInvariantFloatvEXT) -#define glGetInvariantIntegervEXT GLEW_GET_FUN(__glewGetInvariantIntegervEXT) -#define glGetLocalConstantBooleanvEXT GLEW_GET_FUN(__glewGetLocalConstantBooleanvEXT) -#define glGetLocalConstantFloatvEXT GLEW_GET_FUN(__glewGetLocalConstantFloatvEXT) -#define glGetLocalConstantIntegervEXT GLEW_GET_FUN(__glewGetLocalConstantIntegervEXT) -#define glGetVariantBooleanvEXT GLEW_GET_FUN(__glewGetVariantBooleanvEXT) -#define glGetVariantFloatvEXT GLEW_GET_FUN(__glewGetVariantFloatvEXT) -#define glGetVariantIntegervEXT GLEW_GET_FUN(__glewGetVariantIntegervEXT) -#define glGetVariantPointervEXT GLEW_GET_FUN(__glewGetVariantPointervEXT) -#define glInsertComponentEXT GLEW_GET_FUN(__glewInsertComponentEXT) -#define glIsVariantEnabledEXT GLEW_GET_FUN(__glewIsVariantEnabledEXT) -#define glSetInvariantEXT GLEW_GET_FUN(__glewSetInvariantEXT) -#define glSetLocalConstantEXT GLEW_GET_FUN(__glewSetLocalConstantEXT) -#define glShaderOp1EXT GLEW_GET_FUN(__glewShaderOp1EXT) -#define glShaderOp2EXT GLEW_GET_FUN(__glewShaderOp2EXT) -#define glShaderOp3EXT GLEW_GET_FUN(__glewShaderOp3EXT) -#define glSwizzleEXT GLEW_GET_FUN(__glewSwizzleEXT) -#define glVariantPointerEXT GLEW_GET_FUN(__glewVariantPointerEXT) -#define glVariantbvEXT GLEW_GET_FUN(__glewVariantbvEXT) -#define glVariantdvEXT GLEW_GET_FUN(__glewVariantdvEXT) -#define glVariantfvEXT GLEW_GET_FUN(__glewVariantfvEXT) -#define glVariantivEXT GLEW_GET_FUN(__glewVariantivEXT) -#define glVariantsvEXT GLEW_GET_FUN(__glewVariantsvEXT) -#define glVariantubvEXT GLEW_GET_FUN(__glewVariantubvEXT) -#define glVariantuivEXT GLEW_GET_FUN(__glewVariantuivEXT) -#define glVariantusvEXT GLEW_GET_FUN(__glewVariantusvEXT) -#define glWriteMaskEXT GLEW_GET_FUN(__glewWriteMaskEXT) - -#define GLEW_EXT_vertex_shader GLEW_GET_VAR(__GLEW_EXT_vertex_shader) - -#endif /* GL_EXT_vertex_shader */ - -/* ------------------------ GL_EXT_vertex_weighting ------------------------ */ - -#ifndef GL_EXT_vertex_weighting -#define GL_EXT_vertex_weighting 1 - -#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 -#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 -#define GL_MODELVIEW0_EXT 0x1700 -#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 -#define GL_MODELVIEW1_MATRIX_EXT 0x8506 -#define GL_VERTEX_WEIGHTING_EXT 0x8509 -#define GL_MODELVIEW1_EXT 0x850A -#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B -#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C -#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D -#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E -#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F -#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 - -typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); -typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); -typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (GLfloat* weight); - -#define glVertexWeightPointerEXT GLEW_GET_FUN(__glewVertexWeightPointerEXT) -#define glVertexWeightfEXT GLEW_GET_FUN(__glewVertexWeightfEXT) -#define glVertexWeightfvEXT GLEW_GET_FUN(__glewVertexWeightfvEXT) - -#define GLEW_EXT_vertex_weighting GLEW_GET_VAR(__GLEW_EXT_vertex_weighting) - -#endif /* GL_EXT_vertex_weighting */ - -/* ------------------------ GL_EXT_win32_keyed_mutex ----------------------- */ - -#ifndef GL_EXT_win32_keyed_mutex -#define GL_EXT_win32_keyed_mutex 1 - -typedef GLboolean (GLAPIENTRY * PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key, GLuint timeout); -typedef GLboolean (GLAPIENTRY * PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key); - -#define glAcquireKeyedMutexWin32EXT GLEW_GET_FUN(__glewAcquireKeyedMutexWin32EXT) -#define glReleaseKeyedMutexWin32EXT GLEW_GET_FUN(__glewReleaseKeyedMutexWin32EXT) - -#define GLEW_EXT_win32_keyed_mutex GLEW_GET_VAR(__GLEW_EXT_win32_keyed_mutex) - -#endif /* GL_EXT_win32_keyed_mutex */ - -/* ------------------------ GL_EXT_window_rectangles ----------------------- */ - -#ifndef GL_EXT_window_rectangles -#define GL_EXT_window_rectangles 1 - -#define GL_INCLUSIVE_EXT 0x8F10 -#define GL_EXCLUSIVE_EXT 0x8F11 -#define GL_WINDOW_RECTANGLE_EXT 0x8F12 -#define GL_WINDOW_RECTANGLE_MODE_EXT 0x8F13 -#define GL_MAX_WINDOW_RECTANGLES_EXT 0x8F14 -#define GL_NUM_WINDOW_RECTANGLES_EXT 0x8F15 - -typedef void (GLAPIENTRY * PFNGLWINDOWRECTANGLESEXTPROC) (GLenum mode, GLsizei count, const GLint box[]); - -#define glWindowRectanglesEXT GLEW_GET_FUN(__glewWindowRectanglesEXT) - -#define GLEW_EXT_window_rectangles GLEW_GET_VAR(__GLEW_EXT_window_rectangles) - -#endif /* GL_EXT_window_rectangles */ - -/* ------------------------- GL_EXT_x11_sync_object ------------------------ */ - -#ifndef GL_EXT_x11_sync_object -#define GL_EXT_x11_sync_object 1 - -#define GL_SYNC_X11_FENCE_EXT 0x90E1 - -typedef GLsync (GLAPIENTRY * PFNGLIMPORTSYNCEXTPROC) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); - -#define glImportSyncEXT GLEW_GET_FUN(__glewImportSyncEXT) - -#define GLEW_EXT_x11_sync_object GLEW_GET_VAR(__GLEW_EXT_x11_sync_object) - -#endif /* GL_EXT_x11_sync_object */ - -/* ----------------------- GL_FJ_shader_binary_GCCSO ----------------------- */ - -#ifndef GL_FJ_shader_binary_GCCSO -#define GL_FJ_shader_binary_GCCSO 1 - -#define GL_GCCSO_SHADER_BINARY_FJ 0x9260 - -#define GLEW_FJ_shader_binary_GCCSO GLEW_GET_VAR(__GLEW_FJ_shader_binary_GCCSO) - -#endif /* GL_FJ_shader_binary_GCCSO */ - -/* ---------------------- GL_GREMEDY_frame_terminator ---------------------- */ - -#ifndef GL_GREMEDY_frame_terminator -#define GL_GREMEDY_frame_terminator 1 - -typedef void (GLAPIENTRY * PFNGLFRAMETERMINATORGREMEDYPROC) (void); - -#define glFrameTerminatorGREMEDY GLEW_GET_FUN(__glewFrameTerminatorGREMEDY) - -#define GLEW_GREMEDY_frame_terminator GLEW_GET_VAR(__GLEW_GREMEDY_frame_terminator) - -#endif /* GL_GREMEDY_frame_terminator */ - -/* ------------------------ GL_GREMEDY_string_marker ----------------------- */ - -#ifndef GL_GREMEDY_string_marker -#define GL_GREMEDY_string_marker 1 - -typedef void (GLAPIENTRY * PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void *string); - -#define glStringMarkerGREMEDY GLEW_GET_FUN(__glewStringMarkerGREMEDY) - -#define GLEW_GREMEDY_string_marker GLEW_GET_VAR(__GLEW_GREMEDY_string_marker) - -#endif /* GL_GREMEDY_string_marker */ - -/* --------------------- GL_HP_convolution_border_modes -------------------- */ - -#ifndef GL_HP_convolution_border_modes -#define GL_HP_convolution_border_modes 1 - -#define GLEW_HP_convolution_border_modes GLEW_GET_VAR(__GLEW_HP_convolution_border_modes) - -#endif /* GL_HP_convolution_border_modes */ - -/* ------------------------- GL_HP_image_transform ------------------------- */ - -#ifndef GL_HP_image_transform -#define GL_HP_image_transform 1 - -typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, const GLfloat param); -typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, const GLint param); -typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); - -#define glGetImageTransformParameterfvHP GLEW_GET_FUN(__glewGetImageTransformParameterfvHP) -#define glGetImageTransformParameterivHP GLEW_GET_FUN(__glewGetImageTransformParameterivHP) -#define glImageTransformParameterfHP GLEW_GET_FUN(__glewImageTransformParameterfHP) -#define glImageTransformParameterfvHP GLEW_GET_FUN(__glewImageTransformParameterfvHP) -#define glImageTransformParameteriHP GLEW_GET_FUN(__glewImageTransformParameteriHP) -#define glImageTransformParameterivHP GLEW_GET_FUN(__glewImageTransformParameterivHP) - -#define GLEW_HP_image_transform GLEW_GET_VAR(__GLEW_HP_image_transform) - -#endif /* GL_HP_image_transform */ - -/* -------------------------- GL_HP_occlusion_test ------------------------- */ - -#ifndef GL_HP_occlusion_test -#define GL_HP_occlusion_test 1 - -#define GLEW_HP_occlusion_test GLEW_GET_VAR(__GLEW_HP_occlusion_test) - -#endif /* GL_HP_occlusion_test */ - -/* ------------------------- GL_HP_texture_lighting ------------------------ */ - -#ifndef GL_HP_texture_lighting -#define GL_HP_texture_lighting 1 - -#define GLEW_HP_texture_lighting GLEW_GET_VAR(__GLEW_HP_texture_lighting) - -#endif /* GL_HP_texture_lighting */ - -/* --------------------------- GL_IBM_cull_vertex -------------------------- */ - -#ifndef GL_IBM_cull_vertex -#define GL_IBM_cull_vertex 1 - -#define GL_CULL_VERTEX_IBM 103050 - -#define GLEW_IBM_cull_vertex GLEW_GET_VAR(__GLEW_IBM_cull_vertex) - -#endif /* GL_IBM_cull_vertex */ - -/* ---------------------- GL_IBM_multimode_draw_arrays --------------------- */ - -#ifndef GL_IBM_multimode_draw_arrays -#define GL_IBM_multimode_draw_arrays 1 - -typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum* mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); -typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum* mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei primcount, GLint modestride); - -#define glMultiModeDrawArraysIBM GLEW_GET_FUN(__glewMultiModeDrawArraysIBM) -#define glMultiModeDrawElementsIBM GLEW_GET_FUN(__glewMultiModeDrawElementsIBM) - -#define GLEW_IBM_multimode_draw_arrays GLEW_GET_VAR(__GLEW_IBM_multimode_draw_arrays) - -#endif /* GL_IBM_multimode_draw_arrays */ - -/* ------------------------- GL_IBM_rasterpos_clip ------------------------- */ - -#ifndef GL_IBM_rasterpos_clip -#define GL_IBM_rasterpos_clip 1 - -#define GL_RASTER_POSITION_UNCLIPPED_IBM 103010 - -#define GLEW_IBM_rasterpos_clip GLEW_GET_VAR(__GLEW_IBM_rasterpos_clip) - -#endif /* GL_IBM_rasterpos_clip */ - -/* --------------------------- GL_IBM_static_data -------------------------- */ - -#ifndef GL_IBM_static_data -#define GL_IBM_static_data 1 - -#define GL_ALL_STATIC_DATA_IBM 103060 -#define GL_STATIC_VERTEX_ARRAY_IBM 103061 - -#define GLEW_IBM_static_data GLEW_GET_VAR(__GLEW_IBM_static_data) - -#endif /* GL_IBM_static_data */ - -/* --------------------- GL_IBM_texture_mirrored_repeat -------------------- */ - -#ifndef GL_IBM_texture_mirrored_repeat -#define GL_IBM_texture_mirrored_repeat 1 - -#define GL_MIRRORED_REPEAT_IBM 0x8370 - -#define GLEW_IBM_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_IBM_texture_mirrored_repeat) - -#endif /* GL_IBM_texture_mirrored_repeat */ - -/* ----------------------- GL_IBM_vertex_array_lists ----------------------- */ - -#ifndef GL_IBM_vertex_array_lists -#define GL_IBM_vertex_array_lists 1 - -#define GL_VERTEX_ARRAY_LIST_IBM 103070 -#define GL_NORMAL_ARRAY_LIST_IBM 103071 -#define GL_COLOR_ARRAY_LIST_IBM 103072 -#define GL_INDEX_ARRAY_LIST_IBM 103073 -#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 -#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 -#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 -#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 -#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 -#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 -#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 -#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 -#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 -#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 -#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 -#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 - -typedef void (GLAPIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean ** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); - -#define glColorPointerListIBM GLEW_GET_FUN(__glewColorPointerListIBM) -#define glEdgeFlagPointerListIBM GLEW_GET_FUN(__glewEdgeFlagPointerListIBM) -#define glFogCoordPointerListIBM GLEW_GET_FUN(__glewFogCoordPointerListIBM) -#define glIndexPointerListIBM GLEW_GET_FUN(__glewIndexPointerListIBM) -#define glNormalPointerListIBM GLEW_GET_FUN(__glewNormalPointerListIBM) -#define glSecondaryColorPointerListIBM GLEW_GET_FUN(__glewSecondaryColorPointerListIBM) -#define glTexCoordPointerListIBM GLEW_GET_FUN(__glewTexCoordPointerListIBM) -#define glVertexPointerListIBM GLEW_GET_FUN(__glewVertexPointerListIBM) - -#define GLEW_IBM_vertex_array_lists GLEW_GET_VAR(__GLEW_IBM_vertex_array_lists) - -#endif /* GL_IBM_vertex_array_lists */ - -/* ------------------------ GL_IMG_bindless_texture ------------------------ */ - -#ifndef GL_IMG_bindless_texture -#define GL_IMG_bindless_texture 1 - -typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLEIMGPROC) (GLuint texture); -typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLEIMGPROC) (GLuint texture, GLuint sampler); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64IMGPROC) (GLuint program, GLint location, GLuint64 value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VIMGPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values); -typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64IMGPROC) (GLint location, GLuint64 value); -typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VIMGPROC) (GLint location, GLsizei count, const GLuint64* value); - -#define glGetTextureHandleIMG GLEW_GET_FUN(__glewGetTextureHandleIMG) -#define glGetTextureSamplerHandleIMG GLEW_GET_FUN(__glewGetTextureSamplerHandleIMG) -#define glProgramUniformHandleui64IMG GLEW_GET_FUN(__glewProgramUniformHandleui64IMG) -#define glProgramUniformHandleui64vIMG GLEW_GET_FUN(__glewProgramUniformHandleui64vIMG) -#define glUniformHandleui64IMG GLEW_GET_FUN(__glewUniformHandleui64IMG) -#define glUniformHandleui64vIMG GLEW_GET_FUN(__glewUniformHandleui64vIMG) - -#define GLEW_IMG_bindless_texture GLEW_GET_VAR(__GLEW_IMG_bindless_texture) - -#endif /* GL_IMG_bindless_texture */ - -/* --------------------- GL_IMG_framebuffer_downsample --------------------- */ - -#ifndef GL_IMG_framebuffer_downsample -#define GL_IMG_framebuffer_downsample 1 - -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_AND_DOWNSAMPLE_IMG 0x913C -#define GL_NUM_DOWNSAMPLE_SCALES_IMG 0x913D -#define GL_DOWNSAMPLE_SCALES_IMG 0x913E -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SCALE_IMG 0x913F - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DDOWNSAMPLEIMGPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint xscale, GLint yscale); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERDOWNSAMPLEIMGPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer, GLint xscale, GLint yscale); - -#define glFramebufferTexture2DDownsampleIMG GLEW_GET_FUN(__glewFramebufferTexture2DDownsampleIMG) -#define glFramebufferTextureLayerDownsampleIMG GLEW_GET_FUN(__glewFramebufferTextureLayerDownsampleIMG) - -#define GLEW_IMG_framebuffer_downsample GLEW_GET_VAR(__GLEW_IMG_framebuffer_downsample) - -#endif /* GL_IMG_framebuffer_downsample */ - -/* ----------------- GL_IMG_multisampled_render_to_texture ----------------- */ - -#ifndef GL_IMG_multisampled_render_to_texture -#define GL_IMG_multisampled_render_to_texture 1 - -#define GL_RENDERBUFFER_SAMPLES_IMG 0x9133 -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG 0x9134 -#define GL_MAX_SAMPLES_IMG 0x9135 -#define GL_TEXTURE_SAMPLES_IMG 0x9136 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - -#define glFramebufferTexture2DMultisampleIMG GLEW_GET_FUN(__glewFramebufferTexture2DMultisampleIMG) -#define glRenderbufferStorageMultisampleIMG GLEW_GET_FUN(__glewRenderbufferStorageMultisampleIMG) - -#define GLEW_IMG_multisampled_render_to_texture GLEW_GET_VAR(__GLEW_IMG_multisampled_render_to_texture) - -#endif /* GL_IMG_multisampled_render_to_texture */ - -/* ------------------------- GL_IMG_program_binary ------------------------- */ - -#ifndef GL_IMG_program_binary -#define GL_IMG_program_binary 1 - -#define GL_SGX_PROGRAM_BINARY_IMG 0x9130 - -#define GLEW_IMG_program_binary GLEW_GET_VAR(__GLEW_IMG_program_binary) - -#endif /* GL_IMG_program_binary */ - -/* --------------------------- GL_IMG_read_format -------------------------- */ - -#ifndef GL_IMG_read_format -#define GL_IMG_read_format 1 - -#define GL_BGRA_IMG 0x80E1 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG 0x8365 - -#define GLEW_IMG_read_format GLEW_GET_VAR(__GLEW_IMG_read_format) - -#endif /* GL_IMG_read_format */ - -/* -------------------------- GL_IMG_shader_binary ------------------------- */ - -#ifndef GL_IMG_shader_binary -#define GL_IMG_shader_binary 1 - -#define GL_SGX_BINARY_IMG 0x8C0A - -#define GLEW_IMG_shader_binary GLEW_GET_VAR(__GLEW_IMG_shader_binary) - -#endif /* GL_IMG_shader_binary */ - -/* -------------------- GL_IMG_texture_compression_pvrtc ------------------- */ - -#ifndef GL_IMG_texture_compression_pvrtc -#define GL_IMG_texture_compression_pvrtc 1 - -#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 -#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01 -#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 -#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03 - -#define GLEW_IMG_texture_compression_pvrtc GLEW_GET_VAR(__GLEW_IMG_texture_compression_pvrtc) - -#endif /* GL_IMG_texture_compression_pvrtc */ - -/* ------------------- GL_IMG_texture_compression_pvrtc2 ------------------- */ - -#ifndef GL_IMG_texture_compression_pvrtc2 -#define GL_IMG_texture_compression_pvrtc2 1 - -#define GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG 0x9137 -#define GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG 0x9138 - -#define GLEW_IMG_texture_compression_pvrtc2 GLEW_GET_VAR(__GLEW_IMG_texture_compression_pvrtc2) - -#endif /* GL_IMG_texture_compression_pvrtc2 */ - -/* --------------- GL_IMG_texture_env_enhanced_fixed_function -------------- */ - -#ifndef GL_IMG_texture_env_enhanced_fixed_function -#define GL_IMG_texture_env_enhanced_fixed_function 1 - -#define GL_DOT3_RGBA_IMG 0x86AF -#define GL_MODULATE_COLOR_IMG 0x8C04 -#define GL_RECIP_ADD_SIGNED_ALPHA_IMG 0x8C05 -#define GL_TEXTURE_ALPHA_MODULATE_IMG 0x8C06 -#define GL_FACTOR_ALPHA_MODULATE_IMG 0x8C07 -#define GL_FRAGMENT_ALPHA_MODULATE_IMG 0x8C08 -#define GL_ADD_BLEND_IMG 0x8C09 - -#define GLEW_IMG_texture_env_enhanced_fixed_function GLEW_GET_VAR(__GLEW_IMG_texture_env_enhanced_fixed_function) - -#endif /* GL_IMG_texture_env_enhanced_fixed_function */ - -/* ---------------------- GL_IMG_texture_filter_cubic ---------------------- */ - -#ifndef GL_IMG_texture_filter_cubic -#define GL_IMG_texture_filter_cubic 1 - -#define GL_CUBIC_IMG 0x9139 -#define GL_CUBIC_MIPMAP_NEAREST_IMG 0x913A -#define GL_CUBIC_MIPMAP_LINEAR_IMG 0x913B - -#define GLEW_IMG_texture_filter_cubic GLEW_GET_VAR(__GLEW_IMG_texture_filter_cubic) - -#endif /* GL_IMG_texture_filter_cubic */ - -/* -------------------------- GL_INGR_color_clamp -------------------------- */ - -#ifndef GL_INGR_color_clamp -#define GL_INGR_color_clamp 1 - -#define GL_RED_MIN_CLAMP_INGR 0x8560 -#define GL_GREEN_MIN_CLAMP_INGR 0x8561 -#define GL_BLUE_MIN_CLAMP_INGR 0x8562 -#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 -#define GL_RED_MAX_CLAMP_INGR 0x8564 -#define GL_GREEN_MAX_CLAMP_INGR 0x8565 -#define GL_BLUE_MAX_CLAMP_INGR 0x8566 -#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 - -#define GLEW_INGR_color_clamp GLEW_GET_VAR(__GLEW_INGR_color_clamp) - -#endif /* GL_INGR_color_clamp */ - -/* ------------------------- GL_INGR_interlace_read ------------------------ */ - -#ifndef GL_INGR_interlace_read -#define GL_INGR_interlace_read 1 - -#define GL_INTERLACE_READ_INGR 0x8568 - -#define GLEW_INGR_interlace_read GLEW_GET_VAR(__GLEW_INGR_interlace_read) - -#endif /* GL_INGR_interlace_read */ - -/* ----------------------- GL_INTEL_blackhole_render ----------------------- */ - -#ifndef GL_INTEL_blackhole_render -#define GL_INTEL_blackhole_render 1 - -#define GL_BLACKHOLE_RENDER_INTEL 0x83FC - -#define GLEW_INTEL_blackhole_render GLEW_GET_VAR(__GLEW_INTEL_blackhole_render) - -#endif /* GL_INTEL_blackhole_render */ - -/* ------------------ GL_INTEL_conservative_rasterization ------------------ */ - -#ifndef GL_INTEL_conservative_rasterization -#define GL_INTEL_conservative_rasterization 1 - -#define GL_CONSERVATIVE_RASTERIZATION_INTEL 0x83FE - -#define GLEW_INTEL_conservative_rasterization GLEW_GET_VAR(__GLEW_INTEL_conservative_rasterization) - -#endif /* GL_INTEL_conservative_rasterization */ - -/* ------------------- GL_INTEL_fragment_shader_ordering ------------------- */ - -#ifndef GL_INTEL_fragment_shader_ordering -#define GL_INTEL_fragment_shader_ordering 1 - -#define GLEW_INTEL_fragment_shader_ordering GLEW_GET_VAR(__GLEW_INTEL_fragment_shader_ordering) - -#endif /* GL_INTEL_fragment_shader_ordering */ - -/* ----------------------- GL_INTEL_framebuffer_CMAA ----------------------- */ - -#ifndef GL_INTEL_framebuffer_CMAA -#define GL_INTEL_framebuffer_CMAA 1 - -#define GLEW_INTEL_framebuffer_CMAA GLEW_GET_VAR(__GLEW_INTEL_framebuffer_CMAA) - -#endif /* GL_INTEL_framebuffer_CMAA */ - -/* -------------------------- GL_INTEL_map_texture ------------------------- */ - -#ifndef GL_INTEL_map_texture -#define GL_INTEL_map_texture 1 - -#define GL_LAYOUT_DEFAULT_INTEL 0 -#define GL_LAYOUT_LINEAR_INTEL 1 -#define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2 -#define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF - -typedef void * (GLAPIENTRY * PFNGLMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, GLint* stride, GLenum *layout); -typedef void (GLAPIENTRY * PFNGLSYNCTEXTUREINTELPROC) (GLuint texture); -typedef void (GLAPIENTRY * PFNGLUNMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level); - -#define glMapTexture2DINTEL GLEW_GET_FUN(__glewMapTexture2DINTEL) -#define glSyncTextureINTEL GLEW_GET_FUN(__glewSyncTextureINTEL) -#define glUnmapTexture2DINTEL GLEW_GET_FUN(__glewUnmapTexture2DINTEL) - -#define GLEW_INTEL_map_texture GLEW_GET_VAR(__GLEW_INTEL_map_texture) - -#endif /* GL_INTEL_map_texture */ - -/* ------------------------ GL_INTEL_parallel_arrays ----------------------- */ - -#ifndef GL_INTEL_parallel_arrays -#define GL_INTEL_parallel_arrays 1 - -#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 -#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 -#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 -#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 -#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 - -typedef void (GLAPIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); -typedef void (GLAPIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void** pointer); -typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); -typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); - -#define glColorPointervINTEL GLEW_GET_FUN(__glewColorPointervINTEL) -#define glNormalPointervINTEL GLEW_GET_FUN(__glewNormalPointervINTEL) -#define glTexCoordPointervINTEL GLEW_GET_FUN(__glewTexCoordPointervINTEL) -#define glVertexPointervINTEL GLEW_GET_FUN(__glewVertexPointervINTEL) - -#define GLEW_INTEL_parallel_arrays GLEW_GET_VAR(__GLEW_INTEL_parallel_arrays) - -#endif /* GL_INTEL_parallel_arrays */ - -/* ----------------------- GL_INTEL_performance_query ---------------------- */ - -#ifndef GL_INTEL_performance_query -#define GL_INTEL_performance_query 1 - -#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x0000 -#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x0001 -#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 -#define GL_PERFQUERY_FLUSH_INTEL 0x83FA -#define GL_PERFQUERY_WAIT_INTEL 0x83FB -#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 -#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 -#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 -#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 -#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 -#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 -#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 -#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 -#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA -#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB -#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC -#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD -#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE -#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF -#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 - -typedef void (GLAPIENTRY * PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); -typedef void (GLAPIENTRY * PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint* queryHandle); -typedef void (GLAPIENTRY * PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); -typedef void (GLAPIENTRY * PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); -typedef void (GLAPIENTRY * PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint* queryId); -typedef void (GLAPIENTRY * PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint* nextQueryId); -typedef void (GLAPIENTRY * PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar* counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); -typedef void (GLAPIENTRY * PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); -typedef void (GLAPIENTRY * PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar* queryName, GLuint *queryId); -typedef void (GLAPIENTRY * PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar* queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); - -#define glBeginPerfQueryINTEL GLEW_GET_FUN(__glewBeginPerfQueryINTEL) -#define glCreatePerfQueryINTEL GLEW_GET_FUN(__glewCreatePerfQueryINTEL) -#define glDeletePerfQueryINTEL GLEW_GET_FUN(__glewDeletePerfQueryINTEL) -#define glEndPerfQueryINTEL GLEW_GET_FUN(__glewEndPerfQueryINTEL) -#define glGetFirstPerfQueryIdINTEL GLEW_GET_FUN(__glewGetFirstPerfQueryIdINTEL) -#define glGetNextPerfQueryIdINTEL GLEW_GET_FUN(__glewGetNextPerfQueryIdINTEL) -#define glGetPerfCounterInfoINTEL GLEW_GET_FUN(__glewGetPerfCounterInfoINTEL) -#define glGetPerfQueryDataINTEL GLEW_GET_FUN(__glewGetPerfQueryDataINTEL) -#define glGetPerfQueryIdByNameINTEL GLEW_GET_FUN(__glewGetPerfQueryIdByNameINTEL) -#define glGetPerfQueryInfoINTEL GLEW_GET_FUN(__glewGetPerfQueryInfoINTEL) - -#define GLEW_INTEL_performance_query GLEW_GET_VAR(__GLEW_INTEL_performance_query) - -#endif /* GL_INTEL_performance_query */ - -/* ------------------- GL_INTEL_shader_integer_functions2 ------------------ */ - -#ifndef GL_INTEL_shader_integer_functions2 -#define GL_INTEL_shader_integer_functions2 1 - -#define GLEW_INTEL_shader_integer_functions2 GLEW_GET_VAR(__GLEW_INTEL_shader_integer_functions2) - -#endif /* GL_INTEL_shader_integer_functions2 */ - -/* ------------------------ GL_INTEL_texture_scissor ----------------------- */ - -#ifndef GL_INTEL_texture_scissor -#define GL_INTEL_texture_scissor 1 - -typedef void (GLAPIENTRY * PFNGLTEXSCISSORFUNCINTELPROC) (GLenum target, GLenum lfunc, GLenum hfunc); -typedef void (GLAPIENTRY * PFNGLTEXSCISSORINTELPROC) (GLenum target, GLclampf tlow, GLclampf thigh); - -#define glTexScissorFuncINTEL GLEW_GET_FUN(__glewTexScissorFuncINTEL) -#define glTexScissorINTEL GLEW_GET_FUN(__glewTexScissorINTEL) - -#define GLEW_INTEL_texture_scissor GLEW_GET_VAR(__GLEW_INTEL_texture_scissor) - -#endif /* GL_INTEL_texture_scissor */ - -/* --------------------- GL_KHR_blend_equation_advanced -------------------- */ - -#ifndef GL_KHR_blend_equation_advanced -#define GL_KHR_blend_equation_advanced 1 - -#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 -#define GL_MULTIPLY_KHR 0x9294 -#define GL_SCREEN_KHR 0x9295 -#define GL_OVERLAY_KHR 0x9296 -#define GL_DARKEN_KHR 0x9297 -#define GL_LIGHTEN_KHR 0x9298 -#define GL_COLORDODGE_KHR 0x9299 -#define GL_COLORBURN_KHR 0x929A -#define GL_HARDLIGHT_KHR 0x929B -#define GL_SOFTLIGHT_KHR 0x929C -#define GL_DIFFERENCE_KHR 0x929E -#define GL_EXCLUSION_KHR 0x92A0 -#define GL_HSL_HUE_KHR 0x92AD -#define GL_HSL_SATURATION_KHR 0x92AE -#define GL_HSL_COLOR_KHR 0x92AF -#define GL_HSL_LUMINOSITY_KHR 0x92B0 - -typedef void (GLAPIENTRY * PFNGLBLENDBARRIERKHRPROC) (void); - -#define glBlendBarrierKHR GLEW_GET_FUN(__glewBlendBarrierKHR) - -#define GLEW_KHR_blend_equation_advanced GLEW_GET_VAR(__GLEW_KHR_blend_equation_advanced) - -#endif /* GL_KHR_blend_equation_advanced */ - -/* ---------------- GL_KHR_blend_equation_advanced_coherent ---------------- */ - -#ifndef GL_KHR_blend_equation_advanced_coherent -#define GL_KHR_blend_equation_advanced_coherent 1 - -#define GLEW_KHR_blend_equation_advanced_coherent GLEW_GET_VAR(__GLEW_KHR_blend_equation_advanced_coherent) - -#endif /* GL_KHR_blend_equation_advanced_coherent */ - -/* ---------------------- GL_KHR_context_flush_control --------------------- */ - -#ifndef GL_KHR_context_flush_control -#define GL_KHR_context_flush_control 1 - -#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB -#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC - -#define GLEW_KHR_context_flush_control GLEW_GET_VAR(__GLEW_KHR_context_flush_control) - -#endif /* GL_KHR_context_flush_control */ - -/* ------------------------------ GL_KHR_debug ----------------------------- */ - -#ifndef GL_KHR_debug -#define GL_KHR_debug 1 - -#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 -#define GL_STACK_OVERFLOW 0x0503 -#define GL_STACK_UNDERFLOW 0x0504 -#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 -#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 -#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 -#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 -#define GL_DEBUG_SOURCE_API 0x8246 -#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 -#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 -#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 -#define GL_DEBUG_SOURCE_APPLICATION 0x824A -#define GL_DEBUG_SOURCE_OTHER 0x824B -#define GL_DEBUG_TYPE_ERROR 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E -#define GL_DEBUG_TYPE_PORTABILITY 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 -#define GL_DEBUG_TYPE_OTHER 0x8251 -#define GL_DEBUG_TYPE_MARKER 0x8268 -#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 -#define GL_DEBUG_TYPE_POP_GROUP 0x826A -#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B -#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C -#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D -#define GL_BUFFER 0x82E0 -#define GL_SHADER 0x82E1 -#define GL_PROGRAM 0x82E2 -#define GL_QUERY 0x82E3 -#define GL_PROGRAM_PIPELINE 0x82E4 -#define GL_SAMPLER 0x82E6 -#define GL_DISPLAY_LIST 0x82E7 -#define GL_MAX_LABEL_LENGTH 0x82E8 -#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES 0x9145 -#define GL_DEBUG_SEVERITY_HIGH 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 -#define GL_DEBUG_SEVERITY_LOW 0x9148 -#define GL_DEBUG_OUTPUT 0x92E0 - -typedef void (GLAPIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam); - -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); -typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); -typedef void (GLAPIENTRY * PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei* length, GLchar *label); -typedef void (GLAPIENTRY * PFNGLGETOBJECTPTRLABELPROC) (void* ptr, GLsizei bufSize, GLsizei* length, GLchar *label); -typedef void (GLAPIENTRY * PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar* label); -typedef void (GLAPIENTRY * PFNGLOBJECTPTRLABELPROC) (void* ptr, GLsizei length, const GLchar* label); -typedef void (GLAPIENTRY * PFNGLPOPDEBUGGROUPPROC) (void); -typedef void (GLAPIENTRY * PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar * message); - -#define glDebugMessageCallback GLEW_GET_FUN(__glewDebugMessageCallback) -#define glDebugMessageControl GLEW_GET_FUN(__glewDebugMessageControl) -#define glDebugMessageInsert GLEW_GET_FUN(__glewDebugMessageInsert) -#define glGetDebugMessageLog GLEW_GET_FUN(__glewGetDebugMessageLog) -#define glGetObjectLabel GLEW_GET_FUN(__glewGetObjectLabel) -#define glGetObjectPtrLabel GLEW_GET_FUN(__glewGetObjectPtrLabel) -#define glObjectLabel GLEW_GET_FUN(__glewObjectLabel) -#define glObjectPtrLabel GLEW_GET_FUN(__glewObjectPtrLabel) -#define glPopDebugGroup GLEW_GET_FUN(__glewPopDebugGroup) -#define glPushDebugGroup GLEW_GET_FUN(__glewPushDebugGroup) - -#define GLEW_KHR_debug GLEW_GET_VAR(__GLEW_KHR_debug) - -#endif /* GL_KHR_debug */ - -/* ---------------------------- GL_KHR_no_error ---------------------------- */ - -#ifndef GL_KHR_no_error -#define GL_KHR_no_error 1 - -#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008 - -#define GLEW_KHR_no_error GLEW_GET_VAR(__GLEW_KHR_no_error) - -#endif /* GL_KHR_no_error */ - -/* --------------------- GL_KHR_parallel_shader_compile -------------------- */ - -#ifndef GL_KHR_parallel_shader_compile -#define GL_KHR_parallel_shader_compile 1 - -#define GL_MAX_SHADER_COMPILER_THREADS_KHR 0x91B0 -#define GL_COMPLETION_STATUS_KHR 0x91B1 - -typedef void (GLAPIENTRY * PFNGLMAXSHADERCOMPILERTHREADSKHRPROC) (GLuint count); - -#define glMaxShaderCompilerThreadsKHR GLEW_GET_FUN(__glewMaxShaderCompilerThreadsKHR) - -#define GLEW_KHR_parallel_shader_compile GLEW_GET_VAR(__GLEW_KHR_parallel_shader_compile) - -#endif /* GL_KHR_parallel_shader_compile */ - -/* ------------------ GL_KHR_robust_buffer_access_behavior ----------------- */ - -#ifndef GL_KHR_robust_buffer_access_behavior -#define GL_KHR_robust_buffer_access_behavior 1 - -#define GLEW_KHR_robust_buffer_access_behavior GLEW_GET_VAR(__GLEW_KHR_robust_buffer_access_behavior) - -#endif /* GL_KHR_robust_buffer_access_behavior */ - -/* --------------------------- GL_KHR_robustness --------------------------- */ - -#ifndef GL_KHR_robustness -#define GL_KHR_robustness 1 - -#define GL_CONTEXT_LOST 0x0507 -#define GL_LOSE_CONTEXT_ON_RESET 0x8252 -#define GL_GUILTY_CONTEXT_RESET 0x8253 -#define GL_INNOCENT_CONTEXT_RESET 0x8254 -#define GL_UNKNOWN_CONTEXT_RESET 0x8255 -#define GL_RESET_NOTIFICATION_STRATEGY 0x8256 -#define GL_NO_RESET_NOTIFICATION 0x8261 -#define GL_CONTEXT_ROBUST_ACCESS 0x90F3 - -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params); -typedef void (GLAPIENTRY * PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); - -#define glGetnUniformfv GLEW_GET_FUN(__glewGetnUniformfv) -#define glGetnUniformiv GLEW_GET_FUN(__glewGetnUniformiv) -#define glGetnUniformuiv GLEW_GET_FUN(__glewGetnUniformuiv) -#define glReadnPixels GLEW_GET_FUN(__glewReadnPixels) - -#define GLEW_KHR_robustness GLEW_GET_VAR(__GLEW_KHR_robustness) - -#endif /* GL_KHR_robustness */ - -/* ------------------------- GL_KHR_shader_subgroup ------------------------ */ - -#ifndef GL_KHR_shader_subgroup -#define GL_KHR_shader_subgroup 1 - -#define GL_SUBGROUP_FEATURE_BASIC_BIT_KHR 0x00000001 -#define GL_SUBGROUP_FEATURE_VOTE_BIT_KHR 0x00000002 -#define GL_SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR 0x00000004 -#define GL_SUBGROUP_FEATURE_BALLOT_BIT_KHR 0x00000008 -#define GL_SUBGROUP_FEATURE_SHUFFLE_BIT_KHR 0x00000010 -#define GL_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR 0x00000020 -#define GL_SUBGROUP_FEATURE_CLUSTERED_BIT_KHR 0x00000040 -#define GL_SUBGROUP_FEATURE_QUAD_BIT_KHR 0x00000080 -#define GL_SUBGROUP_SIZE_KHR 0x9532 -#define GL_SUBGROUP_SUPPORTED_STAGES_KHR 0x9533 -#define GL_SUBGROUP_SUPPORTED_FEATURES_KHR 0x9534 -#define GL_SUBGROUP_QUAD_ALL_STAGES_KHR 0x9535 - -#define GLEW_KHR_shader_subgroup GLEW_GET_VAR(__GLEW_KHR_shader_subgroup) - -#endif /* GL_KHR_shader_subgroup */ - -/* ------------------ GL_KHR_texture_compression_astc_hdr ------------------ */ - -#ifndef GL_KHR_texture_compression_astc_hdr -#define GL_KHR_texture_compression_astc_hdr 1 - -#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 -#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 -#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 -#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 -#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 -#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 -#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 -#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 -#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 -#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 -#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA -#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB -#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC -#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD -#define GL_COMPRESSED_RGBA_ASTC_3x3x3_OES 0x93C0 -#define GL_COMPRESSED_RGBA_ASTC_4x3x3_OES 0x93C1 -#define GL_COMPRESSED_RGBA_ASTC_4x4x3_OES 0x93C2 -#define GL_COMPRESSED_RGBA_ASTC_4x4x4_OES 0x93C3 -#define GL_COMPRESSED_RGBA_ASTC_5x4x4_OES 0x93C4 -#define GL_COMPRESSED_RGBA_ASTC_5x5x4_OES 0x93C5 -#define GL_COMPRESSED_RGBA_ASTC_5x5x5_OES 0x93C6 -#define GL_COMPRESSED_RGBA_ASTC_6x5x5_OES 0x93C7 -#define GL_COMPRESSED_RGBA_ASTC_6x6x5_OES 0x93C8 -#define GL_COMPRESSED_RGBA_ASTC_6x6x6_OES 0x93C9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES 0x93E0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES 0x93E1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES 0x93E2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES 0x93E3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES 0x93E4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES 0x93E5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES 0x93E6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES 0x93E7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES 0x93E8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES 0x93E9 - -#define GLEW_KHR_texture_compression_astc_hdr GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_hdr) - -#endif /* GL_KHR_texture_compression_astc_hdr */ - -/* ------------------ GL_KHR_texture_compression_astc_ldr ------------------ */ - -#ifndef GL_KHR_texture_compression_astc_ldr -#define GL_KHR_texture_compression_astc_ldr 1 - -#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 -#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 -#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 -#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 -#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 -#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 -#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 -#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 -#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 -#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 -#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA -#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB -#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC -#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD -#define GL_COMPRESSED_RGBA_ASTC_3x3x3_OES 0x93C0 -#define GL_COMPRESSED_RGBA_ASTC_4x3x3_OES 0x93C1 -#define GL_COMPRESSED_RGBA_ASTC_4x4x3_OES 0x93C2 -#define GL_COMPRESSED_RGBA_ASTC_4x4x4_OES 0x93C3 -#define GL_COMPRESSED_RGBA_ASTC_5x4x4_OES 0x93C4 -#define GL_COMPRESSED_RGBA_ASTC_5x5x4_OES 0x93C5 -#define GL_COMPRESSED_RGBA_ASTC_5x5x5_OES 0x93C6 -#define GL_COMPRESSED_RGBA_ASTC_6x5x5_OES 0x93C7 -#define GL_COMPRESSED_RGBA_ASTC_6x6x5_OES 0x93C8 -#define GL_COMPRESSED_RGBA_ASTC_6x6x6_OES 0x93C9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES 0x93E0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES 0x93E1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES 0x93E2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES 0x93E3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES 0x93E4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES 0x93E5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES 0x93E6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES 0x93E7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES 0x93E8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES 0x93E9 - -#define GLEW_KHR_texture_compression_astc_ldr GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_ldr) - -#endif /* GL_KHR_texture_compression_astc_ldr */ - -/* --------------- GL_KHR_texture_compression_astc_sliced_3d --------------- */ - -#ifndef GL_KHR_texture_compression_astc_sliced_3d -#define GL_KHR_texture_compression_astc_sliced_3d 1 - -#define GLEW_KHR_texture_compression_astc_sliced_3d GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_sliced_3d) - -#endif /* GL_KHR_texture_compression_astc_sliced_3d */ - -/* -------------------------- GL_KTX_buffer_region ------------------------- */ - -#ifndef GL_KTX_buffer_region -#define GL_KTX_buffer_region 1 - -#define GL_KTX_FRONT_REGION 0x0 -#define GL_KTX_BACK_REGION 0x1 -#define GL_KTX_Z_REGION 0x2 -#define GL_KTX_STENCIL_REGION 0x3 - -typedef GLuint (GLAPIENTRY * PFNGLBUFFERREGIONENABLEDPROC) (void); -typedef void (GLAPIENTRY * PFNGLDELETEBUFFERREGIONPROC) (GLenum region); -typedef void (GLAPIENTRY * PFNGLDRAWBUFFERREGIONPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height, GLint xDest, GLint yDest); -typedef GLuint (GLAPIENTRY * PFNGLNEWBUFFERREGIONPROC) (GLenum region); -typedef void (GLAPIENTRY * PFNGLREADBUFFERREGIONPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height); - -#define glBufferRegionEnabled GLEW_GET_FUN(__glewBufferRegionEnabled) -#define glDeleteBufferRegion GLEW_GET_FUN(__glewDeleteBufferRegion) -#define glDrawBufferRegion GLEW_GET_FUN(__glewDrawBufferRegion) -#define glNewBufferRegion GLEW_GET_FUN(__glewNewBufferRegion) -#define glReadBufferRegion GLEW_GET_FUN(__glewReadBufferRegion) - -#define GLEW_KTX_buffer_region GLEW_GET_VAR(__GLEW_KTX_buffer_region) - -#endif /* GL_KTX_buffer_region */ - -/* ------------------------- GL_MESAX_texture_stack ------------------------ */ - -#ifndef GL_MESAX_texture_stack -#define GL_MESAX_texture_stack 1 - -#define GL_TEXTURE_1D_STACK_MESAX 0x8759 -#define GL_TEXTURE_2D_STACK_MESAX 0x875A -#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B -#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C -#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D -#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E - -#define GLEW_MESAX_texture_stack GLEW_GET_VAR(__GLEW_MESAX_texture_stack) - -#endif /* GL_MESAX_texture_stack */ - -/* ----------------------- GL_MESA_framebuffer_flip_y ---------------------- */ - -#ifndef GL_MESA_framebuffer_flip_y -#define GL_MESA_framebuffer_flip_y 1 - -#define GL_FRAMEBUFFER_FLIP_Y_MESA 0x8BBB - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERPARAMETERIMESAPROC) (GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVMESAPROC) (GLenum target, GLenum pname, GLint* params); - -#define glFramebufferParameteriMESA GLEW_GET_FUN(__glewFramebufferParameteriMESA) -#define glGetFramebufferParameterivMESA GLEW_GET_FUN(__glewGetFramebufferParameterivMESA) - -#define GLEW_MESA_framebuffer_flip_y GLEW_GET_VAR(__GLEW_MESA_framebuffer_flip_y) - -#endif /* GL_MESA_framebuffer_flip_y */ - -/* -------------------------- GL_MESA_pack_invert -------------------------- */ - -#ifndef GL_MESA_pack_invert -#define GL_MESA_pack_invert 1 - -#define GL_PACK_INVERT_MESA 0x8758 - -#define GLEW_MESA_pack_invert GLEW_GET_VAR(__GLEW_MESA_pack_invert) - -#endif /* GL_MESA_pack_invert */ - -/* --------------------- GL_MESA_program_binary_formats -------------------- */ - -#ifndef GL_MESA_program_binary_formats -#define GL_MESA_program_binary_formats 1 - -#define GL_PROGRAM_BINARY_FORMAT_MESA 0x875F - -#define GLEW_MESA_program_binary_formats GLEW_GET_VAR(__GLEW_MESA_program_binary_formats) - -#endif /* GL_MESA_program_binary_formats */ - -/* ------------------------- GL_MESA_resize_buffers ------------------------ */ - -#ifndef GL_MESA_resize_buffers -#define GL_MESA_resize_buffers 1 - -typedef void (GLAPIENTRY * PFNGLRESIZEBUFFERSMESAPROC) (void); - -#define glResizeBuffersMESA GLEW_GET_FUN(__glewResizeBuffersMESA) - -#define GLEW_MESA_resize_buffers GLEW_GET_VAR(__GLEW_MESA_resize_buffers) - -#endif /* GL_MESA_resize_buffers */ - -/* -------------------- GL_MESA_shader_integer_functions ------------------- */ - -#ifndef GL_MESA_shader_integer_functions -#define GL_MESA_shader_integer_functions 1 - -#define GLEW_MESA_shader_integer_functions GLEW_GET_VAR(__GLEW_MESA_shader_integer_functions) - -#endif /* GL_MESA_shader_integer_functions */ - -/* ----------------------- GL_MESA_tile_raster_order ----------------------- */ - -#ifndef GL_MESA_tile_raster_order -#define GL_MESA_tile_raster_order 1 - -#define GLEW_MESA_tile_raster_order GLEW_GET_VAR(__GLEW_MESA_tile_raster_order) - -#endif /* GL_MESA_tile_raster_order */ - -/* --------------------------- GL_MESA_window_pos -------------------------- */ - -#ifndef GL_MESA_window_pos -#define GL_MESA_window_pos 1 - -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort* p); - -#define glWindowPos2dMESA GLEW_GET_FUN(__glewWindowPos2dMESA) -#define glWindowPos2dvMESA GLEW_GET_FUN(__glewWindowPos2dvMESA) -#define glWindowPos2fMESA GLEW_GET_FUN(__glewWindowPos2fMESA) -#define glWindowPos2fvMESA GLEW_GET_FUN(__glewWindowPos2fvMESA) -#define glWindowPos2iMESA GLEW_GET_FUN(__glewWindowPos2iMESA) -#define glWindowPos2ivMESA GLEW_GET_FUN(__glewWindowPos2ivMESA) -#define glWindowPos2sMESA GLEW_GET_FUN(__glewWindowPos2sMESA) -#define glWindowPos2svMESA GLEW_GET_FUN(__glewWindowPos2svMESA) -#define glWindowPos3dMESA GLEW_GET_FUN(__glewWindowPos3dMESA) -#define glWindowPos3dvMESA GLEW_GET_FUN(__glewWindowPos3dvMESA) -#define glWindowPos3fMESA GLEW_GET_FUN(__glewWindowPos3fMESA) -#define glWindowPos3fvMESA GLEW_GET_FUN(__glewWindowPos3fvMESA) -#define glWindowPos3iMESA GLEW_GET_FUN(__glewWindowPos3iMESA) -#define glWindowPos3ivMESA GLEW_GET_FUN(__glewWindowPos3ivMESA) -#define glWindowPos3sMESA GLEW_GET_FUN(__glewWindowPos3sMESA) -#define glWindowPos3svMESA GLEW_GET_FUN(__glewWindowPos3svMESA) -#define glWindowPos4dMESA GLEW_GET_FUN(__glewWindowPos4dMESA) -#define glWindowPos4dvMESA GLEW_GET_FUN(__glewWindowPos4dvMESA) -#define glWindowPos4fMESA GLEW_GET_FUN(__glewWindowPos4fMESA) -#define glWindowPos4fvMESA GLEW_GET_FUN(__glewWindowPos4fvMESA) -#define glWindowPos4iMESA GLEW_GET_FUN(__glewWindowPos4iMESA) -#define glWindowPos4ivMESA GLEW_GET_FUN(__glewWindowPos4ivMESA) -#define glWindowPos4sMESA GLEW_GET_FUN(__glewWindowPos4sMESA) -#define glWindowPos4svMESA GLEW_GET_FUN(__glewWindowPos4svMESA) - -#define GLEW_MESA_window_pos GLEW_GET_VAR(__GLEW_MESA_window_pos) - -#endif /* GL_MESA_window_pos */ - -/* ------------------------- GL_MESA_ycbcr_texture ------------------------- */ - -#ifndef GL_MESA_ycbcr_texture -#define GL_MESA_ycbcr_texture 1 - -#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB -#define GL_YCBCR_MESA 0x8757 - -#define GLEW_MESA_ycbcr_texture GLEW_GET_VAR(__GLEW_MESA_ycbcr_texture) - -#endif /* GL_MESA_ycbcr_texture */ - -/* ----------- GL_NVX_blend_equation_advanced_multi_draw_buffers ----------- */ - -#ifndef GL_NVX_blend_equation_advanced_multi_draw_buffers -#define GL_NVX_blend_equation_advanced_multi_draw_buffers 1 - -#define GLEW_NVX_blend_equation_advanced_multi_draw_buffers GLEW_GET_VAR(__GLEW_NVX_blend_equation_advanced_multi_draw_buffers) - -#endif /* GL_NVX_blend_equation_advanced_multi_draw_buffers */ - -/* ----------------------- GL_NVX_conditional_render ----------------------- */ - -#ifndef GL_NVX_conditional_render -#define GL_NVX_conditional_render 1 - -typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVXPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVXPROC) (void); - -#define glBeginConditionalRenderNVX GLEW_GET_FUN(__glewBeginConditionalRenderNVX) -#define glEndConditionalRenderNVX GLEW_GET_FUN(__glewEndConditionalRenderNVX) - -#define GLEW_NVX_conditional_render GLEW_GET_VAR(__GLEW_NVX_conditional_render) - -#endif /* GL_NVX_conditional_render */ - -/* ------------------------- GL_NVX_gpu_memory_info ------------------------ */ - -#ifndef GL_NVX_gpu_memory_info -#define GL_NVX_gpu_memory_info 1 - -#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047 -#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048 -#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049 -#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A -#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B - -#define GLEW_NVX_gpu_memory_info GLEW_GET_VAR(__GLEW_NVX_gpu_memory_info) - -#endif /* GL_NVX_gpu_memory_info */ - -/* ------------------------- GL_NVX_gpu_multicast2 ------------------------- */ - -#ifndef GL_NVX_gpu_multicast2 -#define GL_NVX_gpu_multicast2 1 - -#define GL_UPLOAD_GPU_MASK_NVX 0x954A - -typedef GLsync (GLAPIENTRY * PFNGLASYNCCOPYBUFFERSUBDATANVXPROC) (GLsizei waitSemaphoreCount, const GLuint* waitSemaphoreArray, const GLuint64 *fenceValueArray, GLuint readGpu, GLbitfield writeGpuMask, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size, GLsizei signalSemaphoreCount, const GLuint *signalSemaphoreArray, const GLuint64 *signalValueArray); -typedef GLuint (GLAPIENTRY * PFNGLASYNCCOPYIMAGESUBDATANVXPROC) (GLsizei waitSemaphoreCount, const GLuint* waitSemaphoreArray, const GLuint64 *waitValueArray, GLuint srcGpu, GLbitfield dstGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth, GLsizei signalSemaphoreCount, const GLuint *signalSemaphoreArray, const GLuint64 *signalValueArray); -typedef void (GLAPIENTRY * PFNGLMULTICASTSCISSORARRAYVNVXPROC) (GLuint gpu, GLuint first, GLsizei count, const GLint* v); -typedef void (GLAPIENTRY * PFNGLMULTICASTVIEWPORTARRAYVNVXPROC) (GLuint gpu, GLuint first, GLsizei count, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLMULTICASTVIEWPORTPOSITIONWSCALENVXPROC) (GLuint gpu, GLuint index, GLfloat xcoeff, GLfloat ycoeff); -typedef void (GLAPIENTRY * PFNGLUPLOADGPUMASKNVXPROC) (GLbitfield mask); - -#define glAsyncCopyBufferSubDataNVX GLEW_GET_FUN(__glewAsyncCopyBufferSubDataNVX) -#define glAsyncCopyImageSubDataNVX GLEW_GET_FUN(__glewAsyncCopyImageSubDataNVX) -#define glMulticastScissorArrayvNVX GLEW_GET_FUN(__glewMulticastScissorArrayvNVX) -#define glMulticastViewportArrayvNVX GLEW_GET_FUN(__glewMulticastViewportArrayvNVX) -#define glMulticastViewportPositionWScaleNVX GLEW_GET_FUN(__glewMulticastViewportPositionWScaleNVX) -#define glUploadGpuMaskNVX GLEW_GET_FUN(__glewUploadGpuMaskNVX) - -#define GLEW_NVX_gpu_multicast2 GLEW_GET_VAR(__GLEW_NVX_gpu_multicast2) - -#endif /* GL_NVX_gpu_multicast2 */ - -/* ---------------------- GL_NVX_linked_gpu_multicast ---------------------- */ - -#ifndef GL_NVX_linked_gpu_multicast -#define GL_NVX_linked_gpu_multicast 1 - -#define GL_LGPU_SEPARATE_STORAGE_BIT_NVX 0x0800 -#define GL_MAX_LGPU_GPUS_NVX 0x92BA - -typedef void (GLAPIENTRY * PFNGLLGPUCOPYIMAGESUBDATANVXPROC) (GLuint sourceGpu, GLbitfield destinationGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srxY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); -typedef void (GLAPIENTRY * PFNGLLGPUINTERLOCKNVXPROC) (void); -typedef void (GLAPIENTRY * PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC) (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); - -#define glLGPUCopyImageSubDataNVX GLEW_GET_FUN(__glewLGPUCopyImageSubDataNVX) -#define glLGPUInterlockNVX GLEW_GET_FUN(__glewLGPUInterlockNVX) -#define glLGPUNamedBufferSubDataNVX GLEW_GET_FUN(__glewLGPUNamedBufferSubDataNVX) - -#define GLEW_NVX_linked_gpu_multicast GLEW_GET_VAR(__GLEW_NVX_linked_gpu_multicast) - -#endif /* GL_NVX_linked_gpu_multicast */ - -/* ------------------------- GL_NVX_progress_fence ------------------------- */ - -#ifndef GL_NVX_progress_fence -#define GL_NVX_progress_fence 1 - -typedef void (GLAPIENTRY * PFNGLCLIENTWAITSEMAPHOREUI64NVXPROC) (GLsizei fenceObjectCount, const GLuint* semaphoreArray, const GLuint64 *fenceValueArray); -typedef void (GLAPIENTRY * PFNGLSIGNALSEMAPHOREUI64NVXPROC) (GLuint signalGpu, GLsizei fenceObjectCount, const GLuint* semaphoreArray, const GLuint64 *fenceValueArray); -typedef void (GLAPIENTRY * PFNGLWAITSEMAPHOREUI64NVXPROC) (GLuint waitGpu, GLsizei fenceObjectCount, const GLuint* semaphoreArray, const GLuint64 *fenceValueArray); - -#define glClientWaitSemaphoreui64NVX GLEW_GET_FUN(__glewClientWaitSemaphoreui64NVX) -#define glSignalSemaphoreui64NVX GLEW_GET_FUN(__glewSignalSemaphoreui64NVX) -#define glWaitSemaphoreui64NVX GLEW_GET_FUN(__glewWaitSemaphoreui64NVX) - -#define GLEW_NVX_progress_fence GLEW_GET_VAR(__GLEW_NVX_progress_fence) - -#endif /* GL_NVX_progress_fence */ - -/* ------------------------ GL_NV_3dvision_settings ------------------------ */ - -#ifndef GL_NV_3dvision_settings -#define GL_NV_3dvision_settings 1 - -#define GL_3DVISION_STEREO_NV 0x90F4 -#define GL_STEREO_SEPARATION_NV 0x90F5 -#define GL_STEREO_CONVERGENCE_NV 0x90F6 -#define GL_STEREO_CUTOFF_NV 0x90F7 -#define GL_STEREO_PROJECTION_NV 0x90F8 -#define GL_STEREO_PROJECTION_PERSPECTIVE_NV 0x90F9 -#define GL_STEREO_PROJECTION_ORTHO_NV 0x90FA - -typedef void (GLAPIENTRY * PFNGLSTEREOPARAMETERFNVPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLSTEREOPARAMETERINVPROC) (GLenum pname, GLint param); - -#define glStereoParameterfNV GLEW_GET_FUN(__glewStereoParameterfNV) -#define glStereoParameteriNV GLEW_GET_FUN(__glewStereoParameteriNV) - -#define GLEW_NV_3dvision_settings GLEW_GET_VAR(__GLEW_NV_3dvision_settings) - -#endif /* GL_NV_3dvision_settings */ - -/* ------------------- GL_NV_EGL_stream_consumer_external ------------------ */ - -#ifndef GL_NV_EGL_stream_consumer_external -#define GL_NV_EGL_stream_consumer_external 1 - -#define GL_TEXTURE_EXTERNAL_OES 0x8D65 -#define GL_SAMPLER_EXTERNAL_OES 0x8D66 -#define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 -#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68 - -#define GLEW_NV_EGL_stream_consumer_external GLEW_GET_VAR(__GLEW_NV_EGL_stream_consumer_external) - -#endif /* GL_NV_EGL_stream_consumer_external */ - -/* ----------------- GL_NV_alpha_to_coverage_dither_control ---------------- */ - -#ifndef GL_NV_alpha_to_coverage_dither_control -#define GL_NV_alpha_to_coverage_dither_control 1 - -#define GL_ALPHA_TO_COVERAGE_DITHER_MODE_NV 0x92BF -#define GL_ALPHA_TO_COVERAGE_DITHER_DEFAULT_NV 0x934D -#define GL_ALPHA_TO_COVERAGE_DITHER_ENABLE_NV 0x934E -#define GL_ALPHA_TO_COVERAGE_DITHER_DISABLE_NV 0x934F - -typedef void (GLAPIENTRY * PFNGLALPHATOCOVERAGEDITHERCONTROLNVPROC) (GLenum mode); - -#define glAlphaToCoverageDitherControlNV GLEW_GET_FUN(__glewAlphaToCoverageDitherControlNV) - -#define GLEW_NV_alpha_to_coverage_dither_control GLEW_GET_VAR(__GLEW_NV_alpha_to_coverage_dither_control) - -#endif /* GL_NV_alpha_to_coverage_dither_control */ - -/* ------------------------------- GL_NV_bgr ------------------------------- */ - -#ifndef GL_NV_bgr -#define GL_NV_bgr 1 - -#define GL_BGR_NV 0x80E0 - -#define GLEW_NV_bgr GLEW_GET_VAR(__GLEW_NV_bgr) - -#endif /* GL_NV_bgr */ - -/* ------------------- GL_NV_bindless_multi_draw_indirect ------------------ */ - -#ifndef GL_NV_bindless_multi_draw_indirect -#define GL_NV_bindless_multi_draw_indirect 1 - -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); - -#define glMultiDrawArraysIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawArraysIndirectBindlessNV) -#define glMultiDrawElementsIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawElementsIndirectBindlessNV) - -#define GLEW_NV_bindless_multi_draw_indirect GLEW_GET_VAR(__GLEW_NV_bindless_multi_draw_indirect) - -#endif /* GL_NV_bindless_multi_draw_indirect */ - -/* ---------------- GL_NV_bindless_multi_draw_indirect_count --------------- */ - -#ifndef GL_NV_bindless_multi_draw_indirect_count -#define GL_NV_bindless_multi_draw_indirect_count 1 - -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, const void *indirect, GLintptr drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); - -#define glMultiDrawArraysIndirectBindlessCountNV GLEW_GET_FUN(__glewMultiDrawArraysIndirectBindlessCountNV) -#define glMultiDrawElementsIndirectBindlessCountNV GLEW_GET_FUN(__glewMultiDrawElementsIndirectBindlessCountNV) - -#define GLEW_NV_bindless_multi_draw_indirect_count GLEW_GET_VAR(__GLEW_NV_bindless_multi_draw_indirect_count) - -#endif /* GL_NV_bindless_multi_draw_indirect_count */ - -/* ------------------------- GL_NV_bindless_texture ------------------------ */ - -#ifndef GL_NV_bindless_texture -#define GL_NV_bindless_texture 1 - -typedef GLuint64 (GLAPIENTRY * PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); -typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture); -typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); -typedef GLboolean (GLAPIENTRY * PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); -typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); -typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values); -typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); -typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64* value); - -#define glGetImageHandleNV GLEW_GET_FUN(__glewGetImageHandleNV) -#define glGetTextureHandleNV GLEW_GET_FUN(__glewGetTextureHandleNV) -#define glGetTextureSamplerHandleNV GLEW_GET_FUN(__glewGetTextureSamplerHandleNV) -#define glIsImageHandleResidentNV GLEW_GET_FUN(__glewIsImageHandleResidentNV) -#define glIsTextureHandleResidentNV GLEW_GET_FUN(__glewIsTextureHandleResidentNV) -#define glMakeImageHandleNonResidentNV GLEW_GET_FUN(__glewMakeImageHandleNonResidentNV) -#define glMakeImageHandleResidentNV GLEW_GET_FUN(__glewMakeImageHandleResidentNV) -#define glMakeTextureHandleNonResidentNV GLEW_GET_FUN(__glewMakeTextureHandleNonResidentNV) -#define glMakeTextureHandleResidentNV GLEW_GET_FUN(__glewMakeTextureHandleResidentNV) -#define glProgramUniformHandleui64NV GLEW_GET_FUN(__glewProgramUniformHandleui64NV) -#define glProgramUniformHandleui64vNV GLEW_GET_FUN(__glewProgramUniformHandleui64vNV) -#define glUniformHandleui64NV GLEW_GET_FUN(__glewUniformHandleui64NV) -#define glUniformHandleui64vNV GLEW_GET_FUN(__glewUniformHandleui64vNV) - -#define GLEW_NV_bindless_texture GLEW_GET_VAR(__GLEW_NV_bindless_texture) - -#endif /* GL_NV_bindless_texture */ - -/* --------------------- GL_NV_blend_equation_advanced --------------------- */ - -#ifndef GL_NV_blend_equation_advanced -#define GL_NV_blend_equation_advanced 1 - -#define GL_XOR_NV 0x1506 -#define GL_RED_NV 0x1903 -#define GL_GREEN_NV 0x1904 -#define GL_BLUE_NV 0x1905 -#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 -#define GL_BLEND_OVERLAP_NV 0x9281 -#define GL_UNCORRELATED_NV 0x9282 -#define GL_DISJOINT_NV 0x9283 -#define GL_CONJOINT_NV 0x9284 -#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 -#define GL_SRC_NV 0x9286 -#define GL_DST_NV 0x9287 -#define GL_SRC_OVER_NV 0x9288 -#define GL_DST_OVER_NV 0x9289 -#define GL_SRC_IN_NV 0x928A -#define GL_DST_IN_NV 0x928B -#define GL_SRC_OUT_NV 0x928C -#define GL_DST_OUT_NV 0x928D -#define GL_SRC_ATOP_NV 0x928E -#define GL_DST_ATOP_NV 0x928F -#define GL_PLUS_NV 0x9291 -#define GL_PLUS_DARKER_NV 0x9292 -#define GL_MULTIPLY_NV 0x9294 -#define GL_SCREEN_NV 0x9295 -#define GL_OVERLAY_NV 0x9296 -#define GL_DARKEN_NV 0x9297 -#define GL_LIGHTEN_NV 0x9298 -#define GL_COLORDODGE_NV 0x9299 -#define GL_COLORBURN_NV 0x929A -#define GL_HARDLIGHT_NV 0x929B -#define GL_SOFTLIGHT_NV 0x929C -#define GL_DIFFERENCE_NV 0x929E -#define GL_MINUS_NV 0x929F -#define GL_EXCLUSION_NV 0x92A0 -#define GL_CONTRAST_NV 0x92A1 -#define GL_INVERT_RGB_NV 0x92A3 -#define GL_LINEARDODGE_NV 0x92A4 -#define GL_LINEARBURN_NV 0x92A5 -#define GL_VIVIDLIGHT_NV 0x92A6 -#define GL_LINEARLIGHT_NV 0x92A7 -#define GL_PINLIGHT_NV 0x92A8 -#define GL_HARDMIX_NV 0x92A9 -#define GL_HSL_HUE_NV 0x92AD -#define GL_HSL_SATURATION_NV 0x92AE -#define GL_HSL_COLOR_NV 0x92AF -#define GL_HSL_LUMINOSITY_NV 0x92B0 -#define GL_PLUS_CLAMPED_NV 0x92B1 -#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 -#define GL_MINUS_CLAMPED_NV 0x92B3 -#define GL_INVERT_OVG_NV 0x92B4 - -typedef void (GLAPIENTRY * PFNGLBLENDBARRIERNVPROC) (void); -typedef void (GLAPIENTRY * PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); - -#define glBlendBarrierNV GLEW_GET_FUN(__glewBlendBarrierNV) -#define glBlendParameteriNV GLEW_GET_FUN(__glewBlendParameteriNV) - -#define GLEW_NV_blend_equation_advanced GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced) - -#endif /* GL_NV_blend_equation_advanced */ - -/* ----------------- GL_NV_blend_equation_advanced_coherent ---------------- */ - -#ifndef GL_NV_blend_equation_advanced_coherent -#define GL_NV_blend_equation_advanced_coherent 1 - -#define GLEW_NV_blend_equation_advanced_coherent GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced_coherent) - -#endif /* GL_NV_blend_equation_advanced_coherent */ - -/* ----------------------- GL_NV_blend_minmax_factor ----------------------- */ - -#ifndef GL_NV_blend_minmax_factor -#define GL_NV_blend_minmax_factor 1 - -#define GL_FACTOR_MIN_AMD 0x901C -#define GL_FACTOR_MAX_AMD 0x901D - -#define GLEW_NV_blend_minmax_factor GLEW_GET_VAR(__GLEW_NV_blend_minmax_factor) - -#endif /* GL_NV_blend_minmax_factor */ - -/* --------------------------- GL_NV_blend_square -------------------------- */ - -#ifndef GL_NV_blend_square -#define GL_NV_blend_square 1 - -#define GLEW_NV_blend_square GLEW_GET_VAR(__GLEW_NV_blend_square) - -#endif /* GL_NV_blend_square */ - -/* ----------------------- GL_NV_clip_space_w_scaling ---------------------- */ - -#ifndef GL_NV_clip_space_w_scaling -#define GL_NV_clip_space_w_scaling 1 - -#define GL_VIEWPORT_POSITION_W_SCALE_NV 0x937C -#define GL_VIEWPORT_POSITION_W_SCALE_X_COEFF_NV 0x937D -#define GL_VIEWPORT_POSITION_W_SCALE_Y_COEFF_NV 0x937E - -typedef void (GLAPIENTRY * PFNGLVIEWPORTPOSITIONWSCALENVPROC) (GLuint index, GLfloat xcoeff, GLfloat ycoeff); - -#define glViewportPositionWScaleNV GLEW_GET_FUN(__glewViewportPositionWScaleNV) - -#define GLEW_NV_clip_space_w_scaling GLEW_GET_VAR(__GLEW_NV_clip_space_w_scaling) - -#endif /* GL_NV_clip_space_w_scaling */ - -/* --------------------------- GL_NV_command_list -------------------------- */ - -#ifndef GL_NV_command_list -#define GL_NV_command_list 1 - -#define GL_TERMINATE_SEQUENCE_COMMAND_NV 0x0000 -#define GL_NOP_COMMAND_NV 0x0001 -#define GL_DRAW_ELEMENTS_COMMAND_NV 0x0002 -#define GL_DRAW_ARRAYS_COMMAND_NV 0x0003 -#define GL_DRAW_ELEMENTS_STRIP_COMMAND_NV 0x0004 -#define GL_DRAW_ARRAYS_STRIP_COMMAND_NV 0x0005 -#define GL_DRAW_ELEMENTS_INSTANCED_COMMAND_NV 0x0006 -#define GL_DRAW_ARRAYS_INSTANCED_COMMAND_NV 0x0007 -#define GL_ELEMENT_ADDRESS_COMMAND_NV 0x0008 -#define GL_ATTRIBUTE_ADDRESS_COMMAND_NV 0x0009 -#define GL_UNIFORM_ADDRESS_COMMAND_NV 0x000a -#define GL_BLEND_COLOR_COMMAND_NV 0x000b -#define GL_STENCIL_REF_COMMAND_NV 0x000c -#define GL_LINE_WIDTH_COMMAND_NV 0x000d -#define GL_POLYGON_OFFSET_COMMAND_NV 0x000e -#define GL_ALPHA_REF_COMMAND_NV 0x000f -#define GL_VIEWPORT_COMMAND_NV 0x0010 -#define GL_SCISSOR_COMMAND_NV 0x0011 -#define GL_FRONT_FACE_COMMAND_NV 0x0012 - -typedef void (GLAPIENTRY * PFNGLCALLCOMMANDLISTNVPROC) (GLuint list); -typedef void (GLAPIENTRY * PFNGLCOMMANDLISTSEGMENTSNVPROC) (GLuint list, GLuint segments); -typedef void (GLAPIENTRY * PFNGLCOMPILECOMMANDLISTNVPROC) (GLuint list); -typedef void (GLAPIENTRY * PFNGLCREATECOMMANDLISTSNVPROC) (GLsizei n, GLuint* lists); -typedef void (GLAPIENTRY * PFNGLCREATESTATESNVPROC) (GLsizei n, GLuint* states); -typedef void (GLAPIENTRY * PFNGLDELETECOMMANDLISTSNVPROC) (GLsizei n, const GLuint* lists); -typedef void (GLAPIENTRY * PFNGLDELETESTATESNVPROC) (GLsizei n, const GLuint* states); -typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSADDRESSNVPROC) (GLenum primitiveMode, const GLuint64* indirects, const GLsizei* sizes, GLuint count); -typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSNVPROC) (GLenum primitiveMode, GLuint buffer, const GLintptr* indirects, const GLsizei* sizes, GLuint count); -typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC) (const GLuint64* indirects, const GLsizei* sizes, const GLuint* states, const GLuint* fbos, GLuint count); -typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSSTATESNVPROC) (GLuint buffer, const GLintptr* indirects, const GLsizei* sizes, const GLuint* states, const GLuint* fbos, GLuint count); -typedef GLuint (GLAPIENTRY * PFNGLGETCOMMANDHEADERNVPROC) (GLenum tokenID, GLuint size); -typedef GLushort (GLAPIENTRY * PFNGLGETSTAGEINDEXNVPROC) (GLenum shadertype); -typedef GLboolean (GLAPIENTRY * PFNGLISCOMMANDLISTNVPROC) (GLuint list); -typedef GLboolean (GLAPIENTRY * PFNGLISSTATENVPROC) (GLuint state); -typedef void (GLAPIENTRY * PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC) (GLuint list, GLuint segment, const void** indirects, const GLsizei* sizes, const GLuint* states, const GLuint* fbos, GLuint count); -typedef void (GLAPIENTRY * PFNGLSTATECAPTURENVPROC) (GLuint state, GLenum mode); - -#define glCallCommandListNV GLEW_GET_FUN(__glewCallCommandListNV) -#define glCommandListSegmentsNV GLEW_GET_FUN(__glewCommandListSegmentsNV) -#define glCompileCommandListNV GLEW_GET_FUN(__glewCompileCommandListNV) -#define glCreateCommandListsNV GLEW_GET_FUN(__glewCreateCommandListsNV) -#define glCreateStatesNV GLEW_GET_FUN(__glewCreateStatesNV) -#define glDeleteCommandListsNV GLEW_GET_FUN(__glewDeleteCommandListsNV) -#define glDeleteStatesNV GLEW_GET_FUN(__glewDeleteStatesNV) -#define glDrawCommandsAddressNV GLEW_GET_FUN(__glewDrawCommandsAddressNV) -#define glDrawCommandsNV GLEW_GET_FUN(__glewDrawCommandsNV) -#define glDrawCommandsStatesAddressNV GLEW_GET_FUN(__glewDrawCommandsStatesAddressNV) -#define glDrawCommandsStatesNV GLEW_GET_FUN(__glewDrawCommandsStatesNV) -#define glGetCommandHeaderNV GLEW_GET_FUN(__glewGetCommandHeaderNV) -#define glGetStageIndexNV GLEW_GET_FUN(__glewGetStageIndexNV) -#define glIsCommandListNV GLEW_GET_FUN(__glewIsCommandListNV) -#define glIsStateNV GLEW_GET_FUN(__glewIsStateNV) -#define glListDrawCommandsStatesClientNV GLEW_GET_FUN(__glewListDrawCommandsStatesClientNV) -#define glStateCaptureNV GLEW_GET_FUN(__glewStateCaptureNV) - -#define GLEW_NV_command_list GLEW_GET_VAR(__GLEW_NV_command_list) - -#endif /* GL_NV_command_list */ - -/* ------------------------- GL_NV_compute_program5 ------------------------ */ - -#ifndef GL_NV_compute_program5 -#define GL_NV_compute_program5 1 - -#define GL_COMPUTE_PROGRAM_NV 0x90FB -#define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC - -#define GLEW_NV_compute_program5 GLEW_GET_VAR(__GLEW_NV_compute_program5) - -#endif /* GL_NV_compute_program5 */ - -/* -------------------- GL_NV_compute_shader_derivatives ------------------- */ - -#ifndef GL_NV_compute_shader_derivatives -#define GL_NV_compute_shader_derivatives 1 - -#define GLEW_NV_compute_shader_derivatives GLEW_GET_VAR(__GLEW_NV_compute_shader_derivatives) - -#endif /* GL_NV_compute_shader_derivatives */ - -/* ------------------------ GL_NV_conditional_render ----------------------- */ - -#ifndef GL_NV_conditional_render -#define GL_NV_conditional_render 1 - -#define GL_QUERY_WAIT_NV 0x8E13 -#define GL_QUERY_NO_WAIT_NV 0x8E14 -#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 -#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 - -typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); -typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVPROC) (void); - -#define glBeginConditionalRenderNV GLEW_GET_FUN(__glewBeginConditionalRenderNV) -#define glEndConditionalRenderNV GLEW_GET_FUN(__glewEndConditionalRenderNV) - -#define GLEW_NV_conditional_render GLEW_GET_VAR(__GLEW_NV_conditional_render) - -#endif /* GL_NV_conditional_render */ - -/* ----------------------- GL_NV_conservative_raster ----------------------- */ - -#ifndef GL_NV_conservative_raster -#define GL_NV_conservative_raster 1 - -#define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346 -#define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347 -#define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348 -#define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349 - -typedef void (GLAPIENTRY * PFNGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits); - -#define glSubpixelPrecisionBiasNV GLEW_GET_FUN(__glewSubpixelPrecisionBiasNV) - -#define GLEW_NV_conservative_raster GLEW_GET_VAR(__GLEW_NV_conservative_raster) - -#endif /* GL_NV_conservative_raster */ - -/* -------------------- GL_NV_conservative_raster_dilate ------------------- */ - -#ifndef GL_NV_conservative_raster_dilate -#define GL_NV_conservative_raster_dilate 1 - -#define GL_CONSERVATIVE_RASTER_DILATE_NV 0x9379 -#define GL_CONSERVATIVE_RASTER_DILATE_RANGE_NV 0x937A -#define GL_CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV 0x937B - -typedef void (GLAPIENTRY * PFNGLCONSERVATIVERASTERPARAMETERFNVPROC) (GLenum pname, GLfloat value); - -#define glConservativeRasterParameterfNV GLEW_GET_FUN(__glewConservativeRasterParameterfNV) - -#define GLEW_NV_conservative_raster_dilate GLEW_GET_VAR(__GLEW_NV_conservative_raster_dilate) - -#endif /* GL_NV_conservative_raster_dilate */ - -/* ------------------- GL_NV_conservative_raster_pre_snap ------------------ */ - -#ifndef GL_NV_conservative_raster_pre_snap -#define GL_NV_conservative_raster_pre_snap 1 - -#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_NV 0x9550 - -#define GLEW_NV_conservative_raster_pre_snap GLEW_GET_VAR(__GLEW_NV_conservative_raster_pre_snap) - -#endif /* GL_NV_conservative_raster_pre_snap */ - -/* -------------- GL_NV_conservative_raster_pre_snap_triangles ------------- */ - -#ifndef GL_NV_conservative_raster_pre_snap_triangles -#define GL_NV_conservative_raster_pre_snap_triangles 1 - -#define GL_CONSERVATIVE_RASTER_MODE_NV 0x954D -#define GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV 0x954E -#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV 0x954F - -typedef void (GLAPIENTRY * PFNGLCONSERVATIVERASTERPARAMETERINVPROC) (GLenum pname, GLint param); - -#define glConservativeRasterParameteriNV GLEW_GET_FUN(__glewConservativeRasterParameteriNV) - -#define GLEW_NV_conservative_raster_pre_snap_triangles GLEW_GET_VAR(__GLEW_NV_conservative_raster_pre_snap_triangles) - -#endif /* GL_NV_conservative_raster_pre_snap_triangles */ - -/* --------------- GL_NV_conservative_raster_underestimation --------------- */ - -#ifndef GL_NV_conservative_raster_underestimation -#define GL_NV_conservative_raster_underestimation 1 - -#define GLEW_NV_conservative_raster_underestimation GLEW_GET_VAR(__GLEW_NV_conservative_raster_underestimation) - -#endif /* GL_NV_conservative_raster_underestimation */ - -/* --------------------------- GL_NV_copy_buffer --------------------------- */ - -#ifndef GL_NV_copy_buffer -#define GL_NV_copy_buffer 1 - -#define GL_COPY_READ_BUFFER_NV 0x8F36 -#define GL_COPY_WRITE_BUFFER_NV 0x8F37 - -typedef void (GLAPIENTRY * PFNGLCOPYBUFFERSUBDATANVPROC) (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size); - -#define glCopyBufferSubDataNV GLEW_GET_FUN(__glewCopyBufferSubDataNV) - -#define GLEW_NV_copy_buffer GLEW_GET_VAR(__GLEW_NV_copy_buffer) - -#endif /* GL_NV_copy_buffer */ - -/* ----------------------- GL_NV_copy_depth_to_color ----------------------- */ - -#ifndef GL_NV_copy_depth_to_color -#define GL_NV_copy_depth_to_color 1 - -#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E -#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F - -#define GLEW_NV_copy_depth_to_color GLEW_GET_VAR(__GLEW_NV_copy_depth_to_color) - -#endif /* GL_NV_copy_depth_to_color */ - -/* ---------------------------- GL_NV_copy_image --------------------------- */ - -#ifndef GL_NV_copy_image -#define GL_NV_copy_image 1 - -typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); - -#define glCopyImageSubDataNV GLEW_GET_FUN(__glewCopyImageSubDataNV) - -#define GLEW_NV_copy_image GLEW_GET_VAR(__GLEW_NV_copy_image) - -#endif /* GL_NV_copy_image */ - -/* -------------------------- GL_NV_deep_texture3D ------------------------- */ - -#ifndef GL_NV_deep_texture3D -#define GL_NV_deep_texture3D 1 - -#define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0 -#define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV 0x90D1 - -#define GLEW_NV_deep_texture3D GLEW_GET_VAR(__GLEW_NV_deep_texture3D) - -#endif /* GL_NV_deep_texture3D */ - -/* ------------------------ GL_NV_depth_buffer_float ----------------------- */ - -#ifndef GL_NV_depth_buffer_float -#define GL_NV_depth_buffer_float 1 - -#define GL_DEPTH_COMPONENT32F_NV 0x8DAB -#define GL_DEPTH32F_STENCIL8_NV 0x8DAC -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD -#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF - -typedef void (GLAPIENTRY * PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); -typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); -typedef void (GLAPIENTRY * PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); - -#define glClearDepthdNV GLEW_GET_FUN(__glewClearDepthdNV) -#define glDepthBoundsdNV GLEW_GET_FUN(__glewDepthBoundsdNV) -#define glDepthRangedNV GLEW_GET_FUN(__glewDepthRangedNV) - -#define GLEW_NV_depth_buffer_float GLEW_GET_VAR(__GLEW_NV_depth_buffer_float) - -#endif /* GL_NV_depth_buffer_float */ - -/* --------------------------- GL_NV_depth_clamp --------------------------- */ - -#ifndef GL_NV_depth_clamp -#define GL_NV_depth_clamp 1 - -#define GL_DEPTH_CLAMP_NV 0x864F - -#define GLEW_NV_depth_clamp GLEW_GET_VAR(__GLEW_NV_depth_clamp) - -#endif /* GL_NV_depth_clamp */ - -/* ------------------------- GL_NV_depth_nonlinear ------------------------- */ - -#ifndef GL_NV_depth_nonlinear -#define GL_NV_depth_nonlinear 1 - -#define GL_DEPTH_COMPONENT16_NONLINEAR_NV 0x8E2C - -#define GLEW_NV_depth_nonlinear GLEW_GET_VAR(__GLEW_NV_depth_nonlinear) - -#endif /* GL_NV_depth_nonlinear */ - -/* ---------------------- GL_NV_depth_range_unclamped ---------------------- */ - -#ifndef GL_NV_depth_range_unclamped -#define GL_NV_depth_range_unclamped 1 - -#define GL_SAMPLE_COUNT_BITS_NV 0x8864 -#define GL_CURRENT_SAMPLE_COUNT_QUERY_NV 0x8865 -#define GL_QUERY_RESULT_NV 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_NV 0x8867 -#define GL_SAMPLE_COUNT_NV 0x8914 - -#define GLEW_NV_depth_range_unclamped GLEW_GET_VAR(__GLEW_NV_depth_range_unclamped) - -#endif /* GL_NV_depth_range_unclamped */ - -/* --------------------------- GL_NV_draw_buffers -------------------------- */ - -#ifndef GL_NV_draw_buffers -#define GL_NV_draw_buffers 1 - -#define GL_MAX_DRAW_BUFFERS_NV 0x8824 -#define GL_DRAW_BUFFER0_NV 0x8825 -#define GL_DRAW_BUFFER1_NV 0x8826 -#define GL_DRAW_BUFFER2_NV 0x8827 -#define GL_DRAW_BUFFER3_NV 0x8828 -#define GL_DRAW_BUFFER4_NV 0x8829 -#define GL_DRAW_BUFFER5_NV 0x882A -#define GL_DRAW_BUFFER6_NV 0x882B -#define GL_DRAW_BUFFER7_NV 0x882C -#define GL_DRAW_BUFFER8_NV 0x882D -#define GL_DRAW_BUFFER9_NV 0x882E -#define GL_DRAW_BUFFER10_NV 0x882F -#define GL_DRAW_BUFFER11_NV 0x8830 -#define GL_DRAW_BUFFER12_NV 0x8831 -#define GL_DRAW_BUFFER13_NV 0x8832 -#define GL_DRAW_BUFFER14_NV 0x8833 -#define GL_DRAW_BUFFER15_NV 0x8834 -#define GL_COLOR_ATTACHMENT0_NV 0x8CE0 -#define GL_COLOR_ATTACHMENT1_NV 0x8CE1 -#define GL_COLOR_ATTACHMENT2_NV 0x8CE2 -#define GL_COLOR_ATTACHMENT3_NV 0x8CE3 -#define GL_COLOR_ATTACHMENT4_NV 0x8CE4 -#define GL_COLOR_ATTACHMENT5_NV 0x8CE5 -#define GL_COLOR_ATTACHMENT6_NV 0x8CE6 -#define GL_COLOR_ATTACHMENT7_NV 0x8CE7 -#define GL_COLOR_ATTACHMENT8_NV 0x8CE8 -#define GL_COLOR_ATTACHMENT9_NV 0x8CE9 -#define GL_COLOR_ATTACHMENT10_NV 0x8CEA -#define GL_COLOR_ATTACHMENT11_NV 0x8CEB -#define GL_COLOR_ATTACHMENT12_NV 0x8CEC -#define GL_COLOR_ATTACHMENT13_NV 0x8CED -#define GL_COLOR_ATTACHMENT14_NV 0x8CEE -#define GL_COLOR_ATTACHMENT15_NV 0x8CEF - -typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSNVPROC) (GLsizei n, const GLenum* bufs); - -#define glDrawBuffersNV GLEW_GET_FUN(__glewDrawBuffersNV) - -#define GLEW_NV_draw_buffers GLEW_GET_VAR(__GLEW_NV_draw_buffers) - -#endif /* GL_NV_draw_buffers */ - -/* -------------------------- GL_NV_draw_instanced ------------------------- */ - -#ifndef GL_NV_draw_instanced -#define GL_NV_draw_instanced 1 - -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDNVPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDNVPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); - -#define glDrawArraysInstancedNV GLEW_GET_FUN(__glewDrawArraysInstancedNV) -#define glDrawElementsInstancedNV GLEW_GET_FUN(__glewDrawElementsInstancedNV) - -#define GLEW_NV_draw_instanced GLEW_GET_VAR(__GLEW_NV_draw_instanced) - -#endif /* GL_NV_draw_instanced */ - -/* --------------------------- GL_NV_draw_texture -------------------------- */ - -#ifndef GL_NV_draw_texture -#define GL_NV_draw_texture 1 - -typedef void (GLAPIENTRY * PFNGLDRAWTEXTURENVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); - -#define glDrawTextureNV GLEW_GET_FUN(__glewDrawTextureNV) - -#define GLEW_NV_draw_texture GLEW_GET_VAR(__GLEW_NV_draw_texture) - -#endif /* GL_NV_draw_texture */ - -/* ------------------------ GL_NV_draw_vulkan_image ------------------------ */ - -#ifndef GL_NV_draw_vulkan_image -#define GL_NV_draw_vulkan_image 1 - -typedef void (APIENTRY *GLVULKANPROCNV)(void); - -typedef void (GLAPIENTRY * PFNGLDRAWVKIMAGENVPROC) (GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); -typedef GLVULKANPROCNV (GLAPIENTRY * PFNGLGETVKPROCADDRNVPROC) (const GLchar* name); -typedef void (GLAPIENTRY * PFNGLSIGNALVKFENCENVPROC) (GLuint64 vkFence); -typedef void (GLAPIENTRY * PFNGLSIGNALVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); -typedef void (GLAPIENTRY * PFNGLWAITVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); - -#define glDrawVkImageNV GLEW_GET_FUN(__glewDrawVkImageNV) -#define glGetVkProcAddrNV GLEW_GET_FUN(__glewGetVkProcAddrNV) -#define glSignalVkFenceNV GLEW_GET_FUN(__glewSignalVkFenceNV) -#define glSignalVkSemaphoreNV GLEW_GET_FUN(__glewSignalVkSemaphoreNV) -#define glWaitVkSemaphoreNV GLEW_GET_FUN(__glewWaitVkSemaphoreNV) - -#define GLEW_NV_draw_vulkan_image GLEW_GET_VAR(__GLEW_NV_draw_vulkan_image) - -#endif /* GL_NV_draw_vulkan_image */ - -/* ---------------------------- GL_NV_evaluators --------------------------- */ - -#ifndef GL_NV_evaluators -#define GL_NV_evaluators 1 - -#define GL_EVAL_2D_NV 0x86C0 -#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 -#define GL_MAP_TESSELLATION_NV 0x86C2 -#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 -#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 -#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 -#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 -#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 -#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 -#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 -#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA -#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB -#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC -#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD -#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE -#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF -#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 -#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 -#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 -#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 -#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 -#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 -#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 -#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 - -typedef void (GLAPIENTRY * PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); -typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); -typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); -typedef void (GLAPIENTRY * PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint* params); - -#define glEvalMapsNV GLEW_GET_FUN(__glewEvalMapsNV) -#define glGetMapAttribParameterfvNV GLEW_GET_FUN(__glewGetMapAttribParameterfvNV) -#define glGetMapAttribParameterivNV GLEW_GET_FUN(__glewGetMapAttribParameterivNV) -#define glGetMapControlPointsNV GLEW_GET_FUN(__glewGetMapControlPointsNV) -#define glGetMapParameterfvNV GLEW_GET_FUN(__glewGetMapParameterfvNV) -#define glGetMapParameterivNV GLEW_GET_FUN(__glewGetMapParameterivNV) -#define glMapControlPointsNV GLEW_GET_FUN(__glewMapControlPointsNV) -#define glMapParameterfvNV GLEW_GET_FUN(__glewMapParameterfvNV) -#define glMapParameterivNV GLEW_GET_FUN(__glewMapParameterivNV) - -#define GLEW_NV_evaluators GLEW_GET_VAR(__GLEW_NV_evaluators) - -#endif /* GL_NV_evaluators */ - -/* --------------------- GL_NV_explicit_attrib_location -------------------- */ - -#ifndef GL_NV_explicit_attrib_location -#define GL_NV_explicit_attrib_location 1 - -#define GLEW_NV_explicit_attrib_location GLEW_GET_VAR(__GLEW_NV_explicit_attrib_location) - -#endif /* GL_NV_explicit_attrib_location */ - -/* ----------------------- GL_NV_explicit_multisample ---------------------- */ - -#ifndef GL_NV_explicit_multisample -#define GL_NV_explicit_multisample 1 - -#define GL_SAMPLE_POSITION_NV 0x8E50 -#define GL_SAMPLE_MASK_NV 0x8E51 -#define GL_SAMPLE_MASK_VALUE_NV 0x8E52 -#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 -#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 -#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 -#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 -#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 -#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 -#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 - -typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat* val); -typedef void (GLAPIENTRY * PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); -typedef void (GLAPIENTRY * PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); - -#define glGetMultisamplefvNV GLEW_GET_FUN(__glewGetMultisamplefvNV) -#define glSampleMaskIndexedNV GLEW_GET_FUN(__glewSampleMaskIndexedNV) -#define glTexRenderbufferNV GLEW_GET_FUN(__glewTexRenderbufferNV) - -#define GLEW_NV_explicit_multisample GLEW_GET_VAR(__GLEW_NV_explicit_multisample) - -#endif /* GL_NV_explicit_multisample */ - -/* ---------------------- GL_NV_fbo_color_attachments ---------------------- */ - -#ifndef GL_NV_fbo_color_attachments -#define GL_NV_fbo_color_attachments 1 - -#define GL_MAX_COLOR_ATTACHMENTS_NV 0x8CDF -#define GL_COLOR_ATTACHMENT0_NV 0x8CE0 -#define GL_COLOR_ATTACHMENT1_NV 0x8CE1 -#define GL_COLOR_ATTACHMENT2_NV 0x8CE2 -#define GL_COLOR_ATTACHMENT3_NV 0x8CE3 -#define GL_COLOR_ATTACHMENT4_NV 0x8CE4 -#define GL_COLOR_ATTACHMENT5_NV 0x8CE5 -#define GL_COLOR_ATTACHMENT6_NV 0x8CE6 -#define GL_COLOR_ATTACHMENT7_NV 0x8CE7 -#define GL_COLOR_ATTACHMENT8_NV 0x8CE8 -#define GL_COLOR_ATTACHMENT9_NV 0x8CE9 -#define GL_COLOR_ATTACHMENT10_NV 0x8CEA -#define GL_COLOR_ATTACHMENT11_NV 0x8CEB -#define GL_COLOR_ATTACHMENT12_NV 0x8CEC -#define GL_COLOR_ATTACHMENT13_NV 0x8CED -#define GL_COLOR_ATTACHMENT14_NV 0x8CEE -#define GL_COLOR_ATTACHMENT15_NV 0x8CEF - -#define GLEW_NV_fbo_color_attachments GLEW_GET_VAR(__GLEW_NV_fbo_color_attachments) - -#endif /* GL_NV_fbo_color_attachments */ - -/* ------------------------------ GL_NV_fence ------------------------------ */ - -#ifndef GL_NV_fence -#define GL_NV_fence 1 - -#define GL_ALL_COMPLETED_NV 0x84F2 -#define GL_FENCE_STATUS_NV 0x84F3 -#define GL_FENCE_CONDITION_NV 0x84F4 - -typedef void (GLAPIENTRY * PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint* fences); -typedef void (GLAPIENTRY * PFNGLFINISHFENCENVPROC) (GLuint fence); -typedef void (GLAPIENTRY * PFNGLGENFENCESNVPROC) (GLsizei n, GLuint* fences); -typedef void (GLAPIENTRY * PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISFENCENVPROC) (GLuint fence); -typedef void (GLAPIENTRY * PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); -typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCENVPROC) (GLuint fence); - -#define glDeleteFencesNV GLEW_GET_FUN(__glewDeleteFencesNV) -#define glFinishFenceNV GLEW_GET_FUN(__glewFinishFenceNV) -#define glGenFencesNV GLEW_GET_FUN(__glewGenFencesNV) -#define glGetFenceivNV GLEW_GET_FUN(__glewGetFenceivNV) -#define glIsFenceNV GLEW_GET_FUN(__glewIsFenceNV) -#define glSetFenceNV GLEW_GET_FUN(__glewSetFenceNV) -#define glTestFenceNV GLEW_GET_FUN(__glewTestFenceNV) - -#define GLEW_NV_fence GLEW_GET_VAR(__GLEW_NV_fence) - -#endif /* GL_NV_fence */ - -/* -------------------------- GL_NV_fill_rectangle ------------------------- */ - -#ifndef GL_NV_fill_rectangle -#define GL_NV_fill_rectangle 1 - -#define GL_FILL_RECTANGLE_NV 0x933C - -#define GLEW_NV_fill_rectangle GLEW_GET_VAR(__GLEW_NV_fill_rectangle) - -#endif /* GL_NV_fill_rectangle */ - -/* --------------------------- GL_NV_float_buffer -------------------------- */ - -#ifndef GL_NV_float_buffer -#define GL_NV_float_buffer 1 - -#define GL_FLOAT_R_NV 0x8880 -#define GL_FLOAT_RG_NV 0x8881 -#define GL_FLOAT_RGB_NV 0x8882 -#define GL_FLOAT_RGBA_NV 0x8883 -#define GL_FLOAT_R16_NV 0x8884 -#define GL_FLOAT_R32_NV 0x8885 -#define GL_FLOAT_RG16_NV 0x8886 -#define GL_FLOAT_RG32_NV 0x8887 -#define GL_FLOAT_RGB16_NV 0x8888 -#define GL_FLOAT_RGB32_NV 0x8889 -#define GL_FLOAT_RGBA16_NV 0x888A -#define GL_FLOAT_RGBA32_NV 0x888B -#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C -#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D -#define GL_FLOAT_RGBA_MODE_NV 0x888E - -#define GLEW_NV_float_buffer GLEW_GET_VAR(__GLEW_NV_float_buffer) - -#endif /* GL_NV_float_buffer */ - -/* --------------------------- GL_NV_fog_distance -------------------------- */ - -#ifndef GL_NV_fog_distance -#define GL_NV_fog_distance 1 - -#define GL_FOG_DISTANCE_MODE_NV 0x855A -#define GL_EYE_RADIAL_NV 0x855B -#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C - -#define GLEW_NV_fog_distance GLEW_GET_VAR(__GLEW_NV_fog_distance) - -#endif /* GL_NV_fog_distance */ - -/* -------------------- GL_NV_fragment_coverage_to_color ------------------- */ - -#ifndef GL_NV_fragment_coverage_to_color -#define GL_NV_fragment_coverage_to_color 1 - -#define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD -#define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE - -typedef void (GLAPIENTRY * PFNGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color); - -#define glFragmentCoverageColorNV GLEW_GET_FUN(__glewFragmentCoverageColorNV) - -#define GLEW_NV_fragment_coverage_to_color GLEW_GET_VAR(__GLEW_NV_fragment_coverage_to_color) - -#endif /* GL_NV_fragment_coverage_to_color */ - -/* ------------------------- GL_NV_fragment_program ------------------------ */ - -#ifndef GL_NV_fragment_program -#define GL_NV_fragment_program 1 - -#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 -#define GL_FRAGMENT_PROGRAM_NV 0x8870 -#define GL_MAX_TEXTURE_COORDS_NV 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 -#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 -#define GL_PROGRAM_ERROR_STRING_NV 0x8874 - -typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble *params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLdouble v[]); -typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLfloat v[]); - -#define glGetProgramNamedParameterdvNV GLEW_GET_FUN(__glewGetProgramNamedParameterdvNV) -#define glGetProgramNamedParameterfvNV GLEW_GET_FUN(__glewGetProgramNamedParameterfvNV) -#define glProgramNamedParameter4dNV GLEW_GET_FUN(__glewProgramNamedParameter4dNV) -#define glProgramNamedParameter4dvNV GLEW_GET_FUN(__glewProgramNamedParameter4dvNV) -#define glProgramNamedParameter4fNV GLEW_GET_FUN(__glewProgramNamedParameter4fNV) -#define glProgramNamedParameter4fvNV GLEW_GET_FUN(__glewProgramNamedParameter4fvNV) - -#define GLEW_NV_fragment_program GLEW_GET_VAR(__GLEW_NV_fragment_program) - -#endif /* GL_NV_fragment_program */ - -/* ------------------------ GL_NV_fragment_program2 ------------------------ */ - -#ifndef GL_NV_fragment_program2 -#define GL_NV_fragment_program2 1 - -#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 -#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 -#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 -#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 -#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 - -#define GLEW_NV_fragment_program2 GLEW_GET_VAR(__GLEW_NV_fragment_program2) - -#endif /* GL_NV_fragment_program2 */ - -/* ------------------------ GL_NV_fragment_program4 ------------------------ */ - -#ifndef GL_NV_fragment_program4 -#define GL_NV_fragment_program4 1 - -#define GLEW_NV_fragment_program4 GLEW_GET_VAR(__GLEW_NV_fragment_program4) - -#endif /* GL_NV_fragment_program4 */ - -/* --------------------- GL_NV_fragment_program_option --------------------- */ - -#ifndef GL_NV_fragment_program_option -#define GL_NV_fragment_program_option 1 - -#define GLEW_NV_fragment_program_option GLEW_GET_VAR(__GLEW_NV_fragment_program_option) - -#endif /* GL_NV_fragment_program_option */ - -/* ------------------- GL_NV_fragment_shader_barycentric ------------------- */ - -#ifndef GL_NV_fragment_shader_barycentric -#define GL_NV_fragment_shader_barycentric 1 - -#define GLEW_NV_fragment_shader_barycentric GLEW_GET_VAR(__GLEW_NV_fragment_shader_barycentric) - -#endif /* GL_NV_fragment_shader_barycentric */ - -/* -------------------- GL_NV_fragment_shader_interlock -------------------- */ - -#ifndef GL_NV_fragment_shader_interlock -#define GL_NV_fragment_shader_interlock 1 - -#define GLEW_NV_fragment_shader_interlock GLEW_GET_VAR(__GLEW_NV_fragment_shader_interlock) - -#endif /* GL_NV_fragment_shader_interlock */ - -/* ------------------------- GL_NV_framebuffer_blit ------------------------ */ - -#ifndef GL_NV_framebuffer_blit -#define GL_NV_framebuffer_blit 1 - -#define GL_DRAW_FRAMEBUFFER_BINDING_NV 0x8CA6 -#define GL_READ_FRAMEBUFFER_NV 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_NV 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING_NV 0x8CAA - -typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERNVPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); - -#define glBlitFramebufferNV GLEW_GET_FUN(__glewBlitFramebufferNV) - -#define GLEW_NV_framebuffer_blit GLEW_GET_VAR(__GLEW_NV_framebuffer_blit) - -#endif /* GL_NV_framebuffer_blit */ - -/* -------------------- GL_NV_framebuffer_mixed_samples -------------------- */ - -#ifndef GL_NV_framebuffer_mixed_samples -#define GL_NV_framebuffer_mixed_samples 1 - -#define GL_COLOR_SAMPLES_NV 0x8E20 -#define GL_RASTER_MULTISAMPLE_EXT 0x9327 -#define GL_RASTER_SAMPLES_EXT 0x9328 -#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 -#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A -#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B -#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C -#define GL_DEPTH_SAMPLES_NV 0x932D -#define GL_STENCIL_SAMPLES_NV 0x932E -#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F -#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 -#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 -#define GL_COVERAGE_MODULATION_NV 0x9332 -#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 - -#define GLEW_NV_framebuffer_mixed_samples GLEW_GET_VAR(__GLEW_NV_framebuffer_mixed_samples) - -#endif /* GL_NV_framebuffer_mixed_samples */ - -/* --------------------- GL_NV_framebuffer_multisample --------------------- */ - -#ifndef GL_NV_framebuffer_multisample -#define GL_NV_framebuffer_multisample 1 - -#define GL_RENDERBUFFER_SAMPLES_NV 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV 0x8D56 -#define GL_MAX_SAMPLES_NV 0x8D57 - -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - -#define glRenderbufferStorageMultisampleNV GLEW_GET_FUN(__glewRenderbufferStorageMultisampleNV) - -#define GLEW_NV_framebuffer_multisample GLEW_GET_VAR(__GLEW_NV_framebuffer_multisample) - -#endif /* GL_NV_framebuffer_multisample */ - -/* ----------------- GL_NV_framebuffer_multisample_coverage ---------------- */ - -#ifndef GL_NV_framebuffer_multisample_coverage -#define GL_NV_framebuffer_multisample_coverage 1 - -#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB -#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 -#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 -#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 - -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); - -#define glRenderbufferStorageMultisampleCoverageNV GLEW_GET_FUN(__glewRenderbufferStorageMultisampleCoverageNV) - -#define GLEW_NV_framebuffer_multisample_coverage GLEW_GET_VAR(__GLEW_NV_framebuffer_multisample_coverage) - -#endif /* GL_NV_framebuffer_multisample_coverage */ - -/* ----------------------- GL_NV_generate_mipmap_sRGB ---------------------- */ - -#ifndef GL_NV_generate_mipmap_sRGB -#define GL_NV_generate_mipmap_sRGB 1 - -#define GLEW_NV_generate_mipmap_sRGB GLEW_GET_VAR(__GLEW_NV_generate_mipmap_sRGB) - -#endif /* GL_NV_generate_mipmap_sRGB */ - -/* ------------------------ GL_NV_geometry_program4 ------------------------ */ - -#ifndef GL_NV_geometry_program4 -#define GL_NV_geometry_program4 1 - -#define GL_GEOMETRY_PROGRAM_NV 0x8C26 -#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 -#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 - -typedef void (GLAPIENTRY * PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); - -#define glProgramVertexLimitNV GLEW_GET_FUN(__glewProgramVertexLimitNV) - -#define GLEW_NV_geometry_program4 GLEW_GET_VAR(__GLEW_NV_geometry_program4) - -#endif /* GL_NV_geometry_program4 */ - -/* ------------------------- GL_NV_geometry_shader4 ------------------------ */ - -#ifndef GL_NV_geometry_shader4 -#define GL_NV_geometry_shader4 1 - -#define GLEW_NV_geometry_shader4 GLEW_GET_VAR(__GLEW_NV_geometry_shader4) - -#endif /* GL_NV_geometry_shader4 */ - -/* ------------------- GL_NV_geometry_shader_passthrough ------------------- */ - -#ifndef GL_NV_geometry_shader_passthrough -#define GL_NV_geometry_shader_passthrough 1 - -#define GLEW_NV_geometry_shader_passthrough GLEW_GET_VAR(__GLEW_NV_geometry_shader_passthrough) - -#endif /* GL_NV_geometry_shader_passthrough */ - -/* -------------------------- GL_NV_gpu_multicast -------------------------- */ - -#ifndef GL_NV_gpu_multicast -#define GL_NV_gpu_multicast 1 - -#define GL_PER_GPU_STORAGE_BIT_NV 0x0800 -#define GL_MULTICAST_GPUS_NV 0x92BA -#define GL_PER_GPU_STORAGE_NV 0x9548 -#define GL_MULTICAST_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9549 -#define GL_RENDER_GPU_MASK_NV 0x9558 - -typedef void (GLAPIENTRY * PFNGLMULTICASTBARRIERNVPROC) (void); -typedef void (GLAPIENTRY * PFNGLMULTICASTBLITFRAMEBUFFERNVPROC) (GLuint srcGpu, GLuint dstGpu, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef void (GLAPIENTRY * PFNGLMULTICASTBUFFERSUBDATANVPROC) (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); -typedef void (GLAPIENTRY * PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC) (GLuint readGpu, GLbitfield writeGpuMask, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLMULTICASTCOPYIMAGESUBDATANVPROC) (GLuint srcGpu, GLbitfield dstGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); -typedef void (GLAPIENTRY * PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint gpu, GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLint64* params); -typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTIVNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLuint64* params); -typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLMULTICASTWAITSYNCNVPROC) (GLuint signalGpu, GLbitfield waitGpuMask); -typedef void (GLAPIENTRY * PFNGLRENDERGPUMASKNVPROC) (GLbitfield mask); - -#define glMulticastBarrierNV GLEW_GET_FUN(__glewMulticastBarrierNV) -#define glMulticastBlitFramebufferNV GLEW_GET_FUN(__glewMulticastBlitFramebufferNV) -#define glMulticastBufferSubDataNV GLEW_GET_FUN(__glewMulticastBufferSubDataNV) -#define glMulticastCopyBufferSubDataNV GLEW_GET_FUN(__glewMulticastCopyBufferSubDataNV) -#define glMulticastCopyImageSubDataNV GLEW_GET_FUN(__glewMulticastCopyImageSubDataNV) -#define glMulticastFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewMulticastFramebufferSampleLocationsfvNV) -#define glMulticastGetQueryObjecti64vNV GLEW_GET_FUN(__glewMulticastGetQueryObjecti64vNV) -#define glMulticastGetQueryObjectivNV GLEW_GET_FUN(__glewMulticastGetQueryObjectivNV) -#define glMulticastGetQueryObjectui64vNV GLEW_GET_FUN(__glewMulticastGetQueryObjectui64vNV) -#define glMulticastGetQueryObjectuivNV GLEW_GET_FUN(__glewMulticastGetQueryObjectuivNV) -#define glMulticastWaitSyncNV GLEW_GET_FUN(__glewMulticastWaitSyncNV) -#define glRenderGpuMaskNV GLEW_GET_FUN(__glewRenderGpuMaskNV) - -#define GLEW_NV_gpu_multicast GLEW_GET_VAR(__GLEW_NV_gpu_multicast) - -#endif /* GL_NV_gpu_multicast */ - -/* --------------------------- GL_NV_gpu_program4 -------------------------- */ - -#ifndef GL_NV_gpu_program4 -#define GL_NV_gpu_program4 1 - -#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 -#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 -#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 -#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 -#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 -#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 -#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 -#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 - -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); - -#define glProgramEnvParameterI4iNV GLEW_GET_FUN(__glewProgramEnvParameterI4iNV) -#define glProgramEnvParameterI4ivNV GLEW_GET_FUN(__glewProgramEnvParameterI4ivNV) -#define glProgramEnvParameterI4uiNV GLEW_GET_FUN(__glewProgramEnvParameterI4uiNV) -#define glProgramEnvParameterI4uivNV GLEW_GET_FUN(__glewProgramEnvParameterI4uivNV) -#define glProgramEnvParametersI4ivNV GLEW_GET_FUN(__glewProgramEnvParametersI4ivNV) -#define glProgramEnvParametersI4uivNV GLEW_GET_FUN(__glewProgramEnvParametersI4uivNV) -#define glProgramLocalParameterI4iNV GLEW_GET_FUN(__glewProgramLocalParameterI4iNV) -#define glProgramLocalParameterI4ivNV GLEW_GET_FUN(__glewProgramLocalParameterI4ivNV) -#define glProgramLocalParameterI4uiNV GLEW_GET_FUN(__glewProgramLocalParameterI4uiNV) -#define glProgramLocalParameterI4uivNV GLEW_GET_FUN(__glewProgramLocalParameterI4uivNV) -#define glProgramLocalParametersI4ivNV GLEW_GET_FUN(__glewProgramLocalParametersI4ivNV) -#define glProgramLocalParametersI4uivNV GLEW_GET_FUN(__glewProgramLocalParametersI4uivNV) - -#define GLEW_NV_gpu_program4 GLEW_GET_VAR(__GLEW_NV_gpu_program4) - -#endif /* GL_NV_gpu_program4 */ - -/* --------------------------- GL_NV_gpu_program5 -------------------------- */ - -#ifndef GL_NV_gpu_program5 -#define GL_NV_gpu_program5 1 - -#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A -#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B -#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C -#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F - -#define GLEW_NV_gpu_program5 GLEW_GET_VAR(__GLEW_NV_gpu_program5) - -#endif /* GL_NV_gpu_program5 */ - -/* -------------------- GL_NV_gpu_program5_mem_extended -------------------- */ - -#ifndef GL_NV_gpu_program5_mem_extended -#define GL_NV_gpu_program5_mem_extended 1 - -#define GLEW_NV_gpu_program5_mem_extended GLEW_GET_VAR(__GLEW_NV_gpu_program5_mem_extended) - -#endif /* GL_NV_gpu_program5_mem_extended */ - -/* ------------------------- GL_NV_gpu_program_fp64 ------------------------ */ - -#ifndef GL_NV_gpu_program_fp64 -#define GL_NV_gpu_program_fp64 1 - -#define GLEW_NV_gpu_program_fp64 GLEW_GET_VAR(__GLEW_NV_gpu_program_fp64) - -#endif /* GL_NV_gpu_program_fp64 */ - -/* --------------------------- GL_NV_gpu_shader5 --------------------------- */ - -#ifndef GL_NV_gpu_shader5 -#define GL_NV_gpu_shader5 1 - -#define GL_INT64_NV 0x140E -#define GL_UNSIGNED_INT64_NV 0x140F -#define GL_INT8_NV 0x8FE0 -#define GL_INT8_VEC2_NV 0x8FE1 -#define GL_INT8_VEC3_NV 0x8FE2 -#define GL_INT8_VEC4_NV 0x8FE3 -#define GL_INT16_NV 0x8FE4 -#define GL_INT16_VEC2_NV 0x8FE5 -#define GL_INT16_VEC3_NV 0x8FE6 -#define GL_INT16_VEC4_NV 0x8FE7 -#define GL_INT64_VEC2_NV 0x8FE9 -#define GL_INT64_VEC3_NV 0x8FEA -#define GL_INT64_VEC4_NV 0x8FEB -#define GL_UNSIGNED_INT8_NV 0x8FEC -#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED -#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE -#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF -#define GL_UNSIGNED_INT16_NV 0x8FF0 -#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 -#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 -#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 -#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 -#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 -#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 -#define GL_FLOAT16_NV 0x8FF8 -#define GL_FLOAT16_VEC2_NV 0x8FF9 -#define GL_FLOAT16_VEC3_NV 0x8FFA -#define GL_FLOAT16_VEC4_NV 0x8FFB - -typedef void (GLAPIENTRY * PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT* params); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); -typedef void (GLAPIENTRY * PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); -typedef void (GLAPIENTRY * PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (GLAPIENTRY * PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (GLAPIENTRY * PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); - -#define glGetUniformi64vNV GLEW_GET_FUN(__glewGetUniformi64vNV) -#define glGetUniformui64vNV GLEW_GET_FUN(__glewGetUniformui64vNV) -#define glProgramUniform1i64NV GLEW_GET_FUN(__glewProgramUniform1i64NV) -#define glProgramUniform1i64vNV GLEW_GET_FUN(__glewProgramUniform1i64vNV) -#define glProgramUniform1ui64NV GLEW_GET_FUN(__glewProgramUniform1ui64NV) -#define glProgramUniform1ui64vNV GLEW_GET_FUN(__glewProgramUniform1ui64vNV) -#define glProgramUniform2i64NV GLEW_GET_FUN(__glewProgramUniform2i64NV) -#define glProgramUniform2i64vNV GLEW_GET_FUN(__glewProgramUniform2i64vNV) -#define glProgramUniform2ui64NV GLEW_GET_FUN(__glewProgramUniform2ui64NV) -#define glProgramUniform2ui64vNV GLEW_GET_FUN(__glewProgramUniform2ui64vNV) -#define glProgramUniform3i64NV GLEW_GET_FUN(__glewProgramUniform3i64NV) -#define glProgramUniform3i64vNV GLEW_GET_FUN(__glewProgramUniform3i64vNV) -#define glProgramUniform3ui64NV GLEW_GET_FUN(__glewProgramUniform3ui64NV) -#define glProgramUniform3ui64vNV GLEW_GET_FUN(__glewProgramUniform3ui64vNV) -#define glProgramUniform4i64NV GLEW_GET_FUN(__glewProgramUniform4i64NV) -#define glProgramUniform4i64vNV GLEW_GET_FUN(__glewProgramUniform4i64vNV) -#define glProgramUniform4ui64NV GLEW_GET_FUN(__glewProgramUniform4ui64NV) -#define glProgramUniform4ui64vNV GLEW_GET_FUN(__glewProgramUniform4ui64vNV) -#define glUniform1i64NV GLEW_GET_FUN(__glewUniform1i64NV) -#define glUniform1i64vNV GLEW_GET_FUN(__glewUniform1i64vNV) -#define glUniform1ui64NV GLEW_GET_FUN(__glewUniform1ui64NV) -#define glUniform1ui64vNV GLEW_GET_FUN(__glewUniform1ui64vNV) -#define glUniform2i64NV GLEW_GET_FUN(__glewUniform2i64NV) -#define glUniform2i64vNV GLEW_GET_FUN(__glewUniform2i64vNV) -#define glUniform2ui64NV GLEW_GET_FUN(__glewUniform2ui64NV) -#define glUniform2ui64vNV GLEW_GET_FUN(__glewUniform2ui64vNV) -#define glUniform3i64NV GLEW_GET_FUN(__glewUniform3i64NV) -#define glUniform3i64vNV GLEW_GET_FUN(__glewUniform3i64vNV) -#define glUniform3ui64NV GLEW_GET_FUN(__glewUniform3ui64NV) -#define glUniform3ui64vNV GLEW_GET_FUN(__glewUniform3ui64vNV) -#define glUniform4i64NV GLEW_GET_FUN(__glewUniform4i64NV) -#define glUniform4i64vNV GLEW_GET_FUN(__glewUniform4i64vNV) -#define glUniform4ui64NV GLEW_GET_FUN(__glewUniform4ui64NV) -#define glUniform4ui64vNV GLEW_GET_FUN(__glewUniform4ui64vNV) - -#define GLEW_NV_gpu_shader5 GLEW_GET_VAR(__GLEW_NV_gpu_shader5) - -#endif /* GL_NV_gpu_shader5 */ - -/* ---------------------------- GL_NV_half_float --------------------------- */ - -#ifndef GL_NV_half_float -#define GL_NV_half_float 1 - -#define GL_HALF_FLOAT_NV 0x140B - -typedef unsigned short GLhalf; - -typedef void (GLAPIENTRY * PFNGLCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); -typedef void (GLAPIENTRY * PFNGLCOLOR3HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLCOLOR4HNVPROC) (GLhalf red, GLhalf green, GLhalf blue, GLhalf alpha); -typedef void (GLAPIENTRY * PFNGLCOLOR4HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLFOGCOORDHNVPROC) (GLhalf fog); -typedef void (GLAPIENTRY * PFNGLFOGCOORDHVNVPROC) (const GLhalf* fog); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalf s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalf s, GLhalf t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r, GLhalf q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLNORMAL3HNVPROC) (GLhalf nx, GLhalf ny, GLhalf nz); -typedef void (GLAPIENTRY * PFNGLNORMAL3HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD1HNVPROC) (GLhalf s); -typedef void (GLAPIENTRY * PFNGLTEXCOORD1HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2HNVPROC) (GLhalf s, GLhalf t); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD3HNVPROC) (GLhalf s, GLhalf t, GLhalf r); -typedef void (GLAPIENTRY * PFNGLTEXCOORD3HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4HNVPROC) (GLhalf s, GLhalf t, GLhalf r, GLhalf q); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEX2HNVPROC) (GLhalf x, GLhalf y); -typedef void (GLAPIENTRY * PFNGLVERTEX2HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEX3HNVPROC) (GLhalf x, GLhalf y, GLhalf z); -typedef void (GLAPIENTRY * PFNGLVERTEX3HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEX4HNVPROC) (GLhalf x, GLhalf y, GLhalf z, GLhalf w); -typedef void (GLAPIENTRY * PFNGLVERTEX4HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalf x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalf x, GLhalf y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z, GLhalf w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHNVPROC) (GLhalf weight); -typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalf* weight); - -#define glColor3hNV GLEW_GET_FUN(__glewColor3hNV) -#define glColor3hvNV GLEW_GET_FUN(__glewColor3hvNV) -#define glColor4hNV GLEW_GET_FUN(__glewColor4hNV) -#define glColor4hvNV GLEW_GET_FUN(__glewColor4hvNV) -#define glFogCoordhNV GLEW_GET_FUN(__glewFogCoordhNV) -#define glFogCoordhvNV GLEW_GET_FUN(__glewFogCoordhvNV) -#define glMultiTexCoord1hNV GLEW_GET_FUN(__glewMultiTexCoord1hNV) -#define glMultiTexCoord1hvNV GLEW_GET_FUN(__glewMultiTexCoord1hvNV) -#define glMultiTexCoord2hNV GLEW_GET_FUN(__glewMultiTexCoord2hNV) -#define glMultiTexCoord2hvNV GLEW_GET_FUN(__glewMultiTexCoord2hvNV) -#define glMultiTexCoord3hNV GLEW_GET_FUN(__glewMultiTexCoord3hNV) -#define glMultiTexCoord3hvNV GLEW_GET_FUN(__glewMultiTexCoord3hvNV) -#define glMultiTexCoord4hNV GLEW_GET_FUN(__glewMultiTexCoord4hNV) -#define glMultiTexCoord4hvNV GLEW_GET_FUN(__glewMultiTexCoord4hvNV) -#define glNormal3hNV GLEW_GET_FUN(__glewNormal3hNV) -#define glNormal3hvNV GLEW_GET_FUN(__glewNormal3hvNV) -#define glSecondaryColor3hNV GLEW_GET_FUN(__glewSecondaryColor3hNV) -#define glSecondaryColor3hvNV GLEW_GET_FUN(__glewSecondaryColor3hvNV) -#define glTexCoord1hNV GLEW_GET_FUN(__glewTexCoord1hNV) -#define glTexCoord1hvNV GLEW_GET_FUN(__glewTexCoord1hvNV) -#define glTexCoord2hNV GLEW_GET_FUN(__glewTexCoord2hNV) -#define glTexCoord2hvNV GLEW_GET_FUN(__glewTexCoord2hvNV) -#define glTexCoord3hNV GLEW_GET_FUN(__glewTexCoord3hNV) -#define glTexCoord3hvNV GLEW_GET_FUN(__glewTexCoord3hvNV) -#define glTexCoord4hNV GLEW_GET_FUN(__glewTexCoord4hNV) -#define glTexCoord4hvNV GLEW_GET_FUN(__glewTexCoord4hvNV) -#define glVertex2hNV GLEW_GET_FUN(__glewVertex2hNV) -#define glVertex2hvNV GLEW_GET_FUN(__glewVertex2hvNV) -#define glVertex3hNV GLEW_GET_FUN(__glewVertex3hNV) -#define glVertex3hvNV GLEW_GET_FUN(__glewVertex3hvNV) -#define glVertex4hNV GLEW_GET_FUN(__glewVertex4hNV) -#define glVertex4hvNV GLEW_GET_FUN(__glewVertex4hvNV) -#define glVertexAttrib1hNV GLEW_GET_FUN(__glewVertexAttrib1hNV) -#define glVertexAttrib1hvNV GLEW_GET_FUN(__glewVertexAttrib1hvNV) -#define glVertexAttrib2hNV GLEW_GET_FUN(__glewVertexAttrib2hNV) -#define glVertexAttrib2hvNV GLEW_GET_FUN(__glewVertexAttrib2hvNV) -#define glVertexAttrib3hNV GLEW_GET_FUN(__glewVertexAttrib3hNV) -#define glVertexAttrib3hvNV GLEW_GET_FUN(__glewVertexAttrib3hvNV) -#define glVertexAttrib4hNV GLEW_GET_FUN(__glewVertexAttrib4hNV) -#define glVertexAttrib4hvNV GLEW_GET_FUN(__glewVertexAttrib4hvNV) -#define glVertexAttribs1hvNV GLEW_GET_FUN(__glewVertexAttribs1hvNV) -#define glVertexAttribs2hvNV GLEW_GET_FUN(__glewVertexAttribs2hvNV) -#define glVertexAttribs3hvNV GLEW_GET_FUN(__glewVertexAttribs3hvNV) -#define glVertexAttribs4hvNV GLEW_GET_FUN(__glewVertexAttribs4hvNV) -#define glVertexWeighthNV GLEW_GET_FUN(__glewVertexWeighthNV) -#define glVertexWeighthvNV GLEW_GET_FUN(__glewVertexWeighthvNV) - -#define GLEW_NV_half_float GLEW_GET_VAR(__GLEW_NV_half_float) - -#endif /* GL_NV_half_float */ - -/* -------------------------- GL_NV_image_formats -------------------------- */ - -#ifndef GL_NV_image_formats -#define GL_NV_image_formats 1 - -#define GLEW_NV_image_formats GLEW_GET_VAR(__GLEW_NV_image_formats) - -#endif /* GL_NV_image_formats */ - -/* ------------------------- GL_NV_instanced_arrays ------------------------ */ - -#ifndef GL_NV_instanced_arrays -#define GL_NV_instanced_arrays 1 - -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_NV 0x88FE - -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORNVPROC) (GLuint index, GLuint divisor); - -#define glVertexAttribDivisorNV GLEW_GET_FUN(__glewVertexAttribDivisorNV) - -#define GLEW_NV_instanced_arrays GLEW_GET_VAR(__GLEW_NV_instanced_arrays) - -#endif /* GL_NV_instanced_arrays */ - -/* ------------------- GL_NV_internalformat_sample_query ------------------- */ - -#ifndef GL_NV_internalformat_sample_query -#define GL_NV_internalformat_sample_query 1 - -#define GL_MULTISAMPLES_NV 0x9371 -#define GL_SUPERSAMPLE_SCALE_X_NV 0x9372 -#define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373 -#define GL_CONFORMANT_NV 0x9374 - -typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint* params); - -#define glGetInternalformatSampleivNV GLEW_GET_FUN(__glewGetInternalformatSampleivNV) - -#define GLEW_NV_internalformat_sample_query GLEW_GET_VAR(__GLEW_NV_internalformat_sample_query) - -#endif /* GL_NV_internalformat_sample_query */ - -/* ------------------------ GL_NV_light_max_exponent ----------------------- */ - -#ifndef GL_NV_light_max_exponent -#define GL_NV_light_max_exponent 1 - -#define GL_MAX_SHININESS_NV 0x8504 -#define GL_MAX_SPOT_EXPONENT_NV 0x8505 - -#define GLEW_NV_light_max_exponent GLEW_GET_VAR(__GLEW_NV_light_max_exponent) - -#endif /* GL_NV_light_max_exponent */ - -/* ------------------------ GL_NV_memory_attachment ------------------------ */ - -#ifndef GL_NV_memory_attachment -#define GL_NV_memory_attachment 1 - -#define GL_ATTACHED_MEMORY_OBJECT_NV 0x95A4 -#define GL_ATTACHED_MEMORY_OFFSET_NV 0x95A5 -#define GL_MEMORY_ATTACHABLE_ALIGNMENT_NV 0x95A6 -#define GL_MEMORY_ATTACHABLE_SIZE_NV 0x95A7 -#define GL_MEMORY_ATTACHABLE_NV 0x95A8 -#define GL_DETACHED_MEMORY_INCARNATION_NV 0x95A9 -#define GL_DETACHED_TEXTURES_NV 0x95AA -#define GL_DETACHED_BUFFERS_NV 0x95AB -#define GL_MAX_DETACHED_TEXTURES_NV 0x95AC -#define GL_MAX_DETACHED_BUFFERS_NV 0x95AD - -typedef void (GLAPIENTRY * PFNGLBUFFERATTACHMEMORYNVPROC) (GLenum target, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLGETMEMORYOBJECTDETACHEDRESOURCESUIVNVPROC) (GLuint memory, GLenum pname, GLint first, GLsizei count, GLuint* params); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERATTACHMEMORYNVPROC) (GLuint buffer, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLRESETMEMORYOBJECTPARAMETERNVPROC) (GLuint memory, GLenum pname); -typedef void (GLAPIENTRY * PFNGLTEXATTACHMEMORYNVPROC) (GLenum target, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLTEXTUREATTACHMEMORYNVPROC) (GLuint texture, GLuint memory, GLuint64 offset); - -#define glBufferAttachMemoryNV GLEW_GET_FUN(__glewBufferAttachMemoryNV) -#define glGetMemoryObjectDetachedResourcesuivNV GLEW_GET_FUN(__glewGetMemoryObjectDetachedResourcesuivNV) -#define glNamedBufferAttachMemoryNV GLEW_GET_FUN(__glewNamedBufferAttachMemoryNV) -#define glResetMemoryObjectParameterNV GLEW_GET_FUN(__glewResetMemoryObjectParameterNV) -#define glTexAttachMemoryNV GLEW_GET_FUN(__glewTexAttachMemoryNV) -#define glTextureAttachMemoryNV GLEW_GET_FUN(__glewTextureAttachMemoryNV) - -#define GLEW_NV_memory_attachment GLEW_GET_VAR(__GLEW_NV_memory_attachment) - -#endif /* GL_NV_memory_attachment */ - -/* --------------------------- GL_NV_mesh_shader --------------------------- */ - -#ifndef GL_NV_mesh_shader -#define GL_NV_mesh_shader 1 - -#define GL_MESH_SHADER_BIT_NV 0x00000040 -#define GL_TASK_SHADER_BIT_NV 0x00000080 -#define GL_MAX_MESH_UNIFORM_BLOCKS_NV 0x8E60 -#define GL_MAX_MESH_TEXTURE_IMAGE_UNITS_NV 0x8E61 -#define GL_MAX_MESH_IMAGE_UNIFORMS_NV 0x8E62 -#define GL_MAX_MESH_UNIFORM_COMPONENTS_NV 0x8E63 -#define GL_MAX_MESH_ATOMIC_COUNTER_BUFFERS_NV 0x8E64 -#define GL_MAX_MESH_ATOMIC_COUNTERS_NV 0x8E65 -#define GL_MAX_MESH_SHADER_STORAGE_BLOCKS_NV 0x8E66 -#define GL_MAX_COMBINED_MESH_UNIFORM_COMPONENTS_NV 0x8E67 -#define GL_MAX_TASK_UNIFORM_BLOCKS_NV 0x8E68 -#define GL_MAX_TASK_TEXTURE_IMAGE_UNITS_NV 0x8E69 -#define GL_MAX_TASK_IMAGE_UNIFORMS_NV 0x8E6A -#define GL_MAX_TASK_UNIFORM_COMPONENTS_NV 0x8E6B -#define GL_MAX_TASK_ATOMIC_COUNTER_BUFFERS_NV 0x8E6C -#define GL_MAX_TASK_ATOMIC_COUNTERS_NV 0x8E6D -#define GL_MAX_TASK_SHADER_STORAGE_BLOCKS_NV 0x8E6E -#define GL_MAX_COMBINED_TASK_UNIFORM_COMPONENTS_NV 0x8E6F -#define GL_MESH_OUTPUT_PER_VERTEX_GRANULARITY_NV 0x92DF -#define GL_MAX_MESH_TOTAL_MEMORY_SIZE_NV 0x9536 -#define GL_MAX_TASK_TOTAL_MEMORY_SIZE_NV 0x9537 -#define GL_MAX_MESH_OUTPUT_VERTICES_NV 0x9538 -#define GL_MAX_MESH_OUTPUT_PRIMITIVES_NV 0x9539 -#define GL_MAX_TASK_OUTPUT_COUNT_NV 0x953A -#define GL_MAX_MESH_WORK_GROUP_SIZE_NV 0x953B -#define GL_MAX_TASK_WORK_GROUP_SIZE_NV 0x953C -#define GL_MAX_DRAW_MESH_TASKS_COUNT_NV 0x953D -#define GL_MESH_WORK_GROUP_SIZE_NV 0x953E -#define GL_TASK_WORK_GROUP_SIZE_NV 0x953F -#define GL_MESH_OUTPUT_PER_PRIMITIVE_GRANULARITY_NV 0x9543 -#define GL_MAX_MESH_VIEWS_NV 0x9557 -#define GL_MESH_SHADER_NV 0x9559 -#define GL_TASK_SHADER_NV 0x955A -#define GL_MESH_VERTICES_OUT_NV 0x9579 -#define GL_MESH_PRIMITIVES_OUT_NV 0x957A -#define GL_MESH_OUTPUT_TYPE_NV 0x957B -#define GL_MESH_SUBROUTINE_NV 0x957C -#define GL_TASK_SUBROUTINE_NV 0x957D -#define GL_MESH_SUBROUTINE_UNIFORM_NV 0x957E -#define GL_TASK_SUBROUTINE_UNIFORM_NV 0x957F -#define GL_UNIFORM_BLOCK_REFERENCED_BY_MESH_SHADER_NV 0x959C -#define GL_UNIFORM_BLOCK_REFERENCED_BY_TASK_SHADER_NV 0x959D -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_MESH_SHADER_NV 0x959E -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TASK_SHADER_NV 0x959F -#define GL_REFERENCED_BY_MESH_SHADER_NV 0x95A0 -#define GL_REFERENCED_BY_TASK_SHADER_NV 0x95A1 -#define GL_MAX_MESH_WORK_GROUP_INVOCATIONS_NV 0x95A2 -#define GL_MAX_TASK_WORK_GROUP_INVOCATIONS_NV 0x95A3 - -typedef void (GLAPIENTRY * PFNGLDRAWMESHTASKSINDIRECTNVPROC) (GLintptr indirect); -typedef void (GLAPIENTRY * PFNGLDRAWMESHTASKSNVPROC) (GLuint first, GLuint count); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWMESHTASKSINDIRECTCOUNTNVPROC) (GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWMESHTASKSINDIRECTNVPROC) (GLintptr indirect, GLsizei drawcount, GLsizei stride); - -#define glDrawMeshTasksIndirectNV GLEW_GET_FUN(__glewDrawMeshTasksIndirectNV) -#define glDrawMeshTasksNV GLEW_GET_FUN(__glewDrawMeshTasksNV) -#define glMultiDrawMeshTasksIndirectCountNV GLEW_GET_FUN(__glewMultiDrawMeshTasksIndirectCountNV) -#define glMultiDrawMeshTasksIndirectNV GLEW_GET_FUN(__glewMultiDrawMeshTasksIndirectNV) - -#define GLEW_NV_mesh_shader GLEW_GET_VAR(__GLEW_NV_mesh_shader) - -#endif /* GL_NV_mesh_shader */ - -/* ----------------------- GL_NV_multisample_coverage ---------------------- */ - -#ifndef GL_NV_multisample_coverage -#define GL_NV_multisample_coverage 1 - -#define GL_COLOR_SAMPLES_NV 0x8E20 - -#define GLEW_NV_multisample_coverage GLEW_GET_VAR(__GLEW_NV_multisample_coverage) - -#endif /* GL_NV_multisample_coverage */ - -/* --------------------- GL_NV_multisample_filter_hint --------------------- */ - -#ifndef GL_NV_multisample_filter_hint -#define GL_NV_multisample_filter_hint 1 - -#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 - -#define GLEW_NV_multisample_filter_hint GLEW_GET_VAR(__GLEW_NV_multisample_filter_hint) - -#endif /* GL_NV_multisample_filter_hint */ - -/* ----------------------- GL_NV_non_square_matrices ----------------------- */ - -#ifndef GL_NV_non_square_matrices -#define GL_NV_non_square_matrices 1 - -#define GL_FLOAT_MAT2x3_NV 0x8B65 -#define GL_FLOAT_MAT2x4_NV 0x8B66 -#define GL_FLOAT_MAT3x2_NV 0x8B67 -#define GL_FLOAT_MAT3x4_NV 0x8B68 -#define GL_FLOAT_MAT4x2_NV 0x8B69 -#define GL_FLOAT_MAT4x3_NV 0x8B6A - -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); - -#define glUniformMatrix2x3fvNV GLEW_GET_FUN(__glewUniformMatrix2x3fvNV) -#define glUniformMatrix2x4fvNV GLEW_GET_FUN(__glewUniformMatrix2x4fvNV) -#define glUniformMatrix3x2fvNV GLEW_GET_FUN(__glewUniformMatrix3x2fvNV) -#define glUniformMatrix3x4fvNV GLEW_GET_FUN(__glewUniformMatrix3x4fvNV) -#define glUniformMatrix4x2fvNV GLEW_GET_FUN(__glewUniformMatrix4x2fvNV) -#define glUniformMatrix4x3fvNV GLEW_GET_FUN(__glewUniformMatrix4x3fvNV) - -#define GLEW_NV_non_square_matrices GLEW_GET_VAR(__GLEW_NV_non_square_matrices) - -#endif /* GL_NV_non_square_matrices */ - -/* ------------------------- GL_NV_occlusion_query ------------------------- */ - -#ifndef GL_NV_occlusion_query -#define GL_NV_occlusion_query 1 - -#define GL_PIXEL_COUNTER_BITS_NV 0x8864 -#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 -#define GL_PIXEL_COUNT_NV 0x8866 -#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 - -typedef void (GLAPIENTRY * PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLENDOCCLUSIONQUERYNVPROC) (void); -typedef void (GLAPIENTRY * PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); - -#define glBeginOcclusionQueryNV GLEW_GET_FUN(__glewBeginOcclusionQueryNV) -#define glDeleteOcclusionQueriesNV GLEW_GET_FUN(__glewDeleteOcclusionQueriesNV) -#define glEndOcclusionQueryNV GLEW_GET_FUN(__glewEndOcclusionQueryNV) -#define glGenOcclusionQueriesNV GLEW_GET_FUN(__glewGenOcclusionQueriesNV) -#define glGetOcclusionQueryivNV GLEW_GET_FUN(__glewGetOcclusionQueryivNV) -#define glGetOcclusionQueryuivNV GLEW_GET_FUN(__glewGetOcclusionQueryuivNV) -#define glIsOcclusionQueryNV GLEW_GET_FUN(__glewIsOcclusionQueryNV) - -#define GLEW_NV_occlusion_query GLEW_GET_VAR(__GLEW_NV_occlusion_query) - -#endif /* GL_NV_occlusion_query */ - -/* -------------------------- GL_NV_pack_subimage -------------------------- */ - -#ifndef GL_NV_pack_subimage -#define GL_NV_pack_subimage 1 - -#define GL_PACK_ROW_LENGTH_NV 0x0D02 -#define GL_PACK_SKIP_ROWS_NV 0x0D03 -#define GL_PACK_SKIP_PIXELS_NV 0x0D04 - -#define GLEW_NV_pack_subimage GLEW_GET_VAR(__GLEW_NV_pack_subimage) - -#endif /* GL_NV_pack_subimage */ - -/* ----------------------- GL_NV_packed_depth_stencil ---------------------- */ - -#ifndef GL_NV_packed_depth_stencil -#define GL_NV_packed_depth_stencil 1 - -#define GL_DEPTH_STENCIL_NV 0x84F9 -#define GL_UNSIGNED_INT_24_8_NV 0x84FA - -#define GLEW_NV_packed_depth_stencil GLEW_GET_VAR(__GLEW_NV_packed_depth_stencil) - -#endif /* GL_NV_packed_depth_stencil */ - -/* --------------------------- GL_NV_packed_float -------------------------- */ - -#ifndef GL_NV_packed_float -#define GL_NV_packed_float 1 - -#define GL_R11F_G11F_B10F_NV 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV_NV 0x8C3B - -#define GLEW_NV_packed_float GLEW_GET_VAR(__GLEW_NV_packed_float) - -#endif /* GL_NV_packed_float */ - -/* ----------------------- GL_NV_packed_float_linear ----------------------- */ - -#ifndef GL_NV_packed_float_linear -#define GL_NV_packed_float_linear 1 - -#define GL_R11F_G11F_B10F_NV 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV_NV 0x8C3B - -#define GLEW_NV_packed_float_linear GLEW_GET_VAR(__GLEW_NV_packed_float_linear) - -#endif /* GL_NV_packed_float_linear */ - -/* --------------------- GL_NV_parameter_buffer_object --------------------- */ - -#ifndef GL_NV_parameter_buffer_object -#define GL_NV_parameter_buffer_object 1 - -#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 -#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 -#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 -#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 -#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 - -typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); - -#define glProgramBufferParametersIivNV GLEW_GET_FUN(__glewProgramBufferParametersIivNV) -#define glProgramBufferParametersIuivNV GLEW_GET_FUN(__glewProgramBufferParametersIuivNV) -#define glProgramBufferParametersfvNV GLEW_GET_FUN(__glewProgramBufferParametersfvNV) - -#define GLEW_NV_parameter_buffer_object GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object) - -#endif /* GL_NV_parameter_buffer_object */ - -/* --------------------- GL_NV_parameter_buffer_object2 -------------------- */ - -#ifndef GL_NV_parameter_buffer_object2 -#define GL_NV_parameter_buffer_object2 1 - -#define GLEW_NV_parameter_buffer_object2 GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object2) - -#endif /* GL_NV_parameter_buffer_object2 */ - -/* -------------------------- GL_NV_path_rendering ------------------------- */ - -#ifndef GL_NV_path_rendering -#define GL_NV_path_rendering 1 - -#define GL_CLOSE_PATH_NV 0x00 -#define GL_BOLD_BIT_NV 0x01 -#define GL_GLYPH_WIDTH_BIT_NV 0x01 -#define GL_GLYPH_HEIGHT_BIT_NV 0x02 -#define GL_ITALIC_BIT_NV 0x02 -#define GL_MOVE_TO_NV 0x02 -#define GL_RELATIVE_MOVE_TO_NV 0x03 -#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 -#define GL_LINE_TO_NV 0x04 -#define GL_RELATIVE_LINE_TO_NV 0x05 -#define GL_HORIZONTAL_LINE_TO_NV 0x06 -#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 -#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08 -#define GL_VERTICAL_LINE_TO_NV 0x08 -#define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09 -#define GL_QUADRATIC_CURVE_TO_NV 0x0A -#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B -#define GL_CUBIC_CURVE_TO_NV 0x0C -#define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D -#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E -#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F -#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10 -#define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10 -#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11 -#define GL_SMALL_CCW_ARC_TO_NV 0x12 -#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13 -#define GL_SMALL_CW_ARC_TO_NV 0x14 -#define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15 -#define GL_LARGE_CCW_ARC_TO_NV 0x16 -#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17 -#define GL_LARGE_CW_ARC_TO_NV 0x18 -#define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19 -#define GL_CONIC_CURVE_TO_NV 0x1A -#define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B -#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20 -#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40 -#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80 -#define GL_ROUNDED_RECT_NV 0xE8 -#define GL_RELATIVE_ROUNDED_RECT_NV 0xE9 -#define GL_ROUNDED_RECT2_NV 0xEA -#define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB -#define GL_ROUNDED_RECT4_NV 0xEC -#define GL_RELATIVE_ROUNDED_RECT4_NV 0xED -#define GL_ROUNDED_RECT8_NV 0xEE -#define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF -#define GL_RESTART_PATH_NV 0xF0 -#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2 -#define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4 -#define GL_RECT_NV 0xF6 -#define GL_RELATIVE_RECT_NV 0xF7 -#define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8 -#define GL_CIRCULAR_CW_ARC_TO_NV 0xFA -#define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC -#define GL_ARC_TO_NV 0xFE -#define GL_RELATIVE_ARC_TO_NV 0xFF -#define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 -#define GL_PRIMARY_COLOR_NV 0x852C -#define GL_SECONDARY_COLOR_NV 0x852D -#define GL_PRIMARY_COLOR 0x8577 -#define GL_PATH_FORMAT_SVG_NV 0x9070 -#define GL_PATH_FORMAT_PS_NV 0x9071 -#define GL_STANDARD_FONT_NAME_NV 0x9072 -#define GL_SYSTEM_FONT_NAME_NV 0x9073 -#define GL_FILE_NAME_NV 0x9074 -#define GL_PATH_STROKE_WIDTH_NV 0x9075 -#define GL_PATH_END_CAPS_NV 0x9076 -#define GL_PATH_INITIAL_END_CAP_NV 0x9077 -#define GL_PATH_TERMINAL_END_CAP_NV 0x9078 -#define GL_PATH_JOIN_STYLE_NV 0x9079 -#define GL_PATH_MITER_LIMIT_NV 0x907A -#define GL_PATH_DASH_CAPS_NV 0x907B -#define GL_PATH_INITIAL_DASH_CAP_NV 0x907C -#define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D -#define GL_PATH_DASH_OFFSET_NV 0x907E -#define GL_PATH_CLIENT_LENGTH_NV 0x907F -#define GL_PATH_FILL_MODE_NV 0x9080 -#define GL_PATH_FILL_MASK_NV 0x9081 -#define GL_PATH_FILL_COVER_MODE_NV 0x9082 -#define GL_PATH_STROKE_COVER_MODE_NV 0x9083 -#define GL_PATH_STROKE_MASK_NV 0x9084 -#define GL_PATH_STROKE_BOUND_NV 0x9086 -#define GL_COUNT_UP_NV 0x9088 -#define GL_COUNT_DOWN_NV 0x9089 -#define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A -#define GL_CONVEX_HULL_NV 0x908B -#define GL_BOUNDING_BOX_NV 0x908D -#define GL_TRANSLATE_X_NV 0x908E -#define GL_TRANSLATE_Y_NV 0x908F -#define GL_TRANSLATE_2D_NV 0x9090 -#define GL_TRANSLATE_3D_NV 0x9091 -#define GL_AFFINE_2D_NV 0x9092 -#define GL_AFFINE_3D_NV 0x9094 -#define GL_TRANSPOSE_AFFINE_2D_NV 0x9096 -#define GL_TRANSPOSE_AFFINE_3D_NV 0x9098 -#define GL_UTF8_NV 0x909A -#define GL_UTF16_NV 0x909B -#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C -#define GL_PATH_COMMAND_COUNT_NV 0x909D -#define GL_PATH_COORD_COUNT_NV 0x909E -#define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F -#define GL_PATH_COMPUTED_LENGTH_NV 0x90A0 -#define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1 -#define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2 -#define GL_SQUARE_NV 0x90A3 -#define GL_ROUND_NV 0x90A4 -#define GL_TRIANGULAR_NV 0x90A5 -#define GL_BEVEL_NV 0x90A6 -#define GL_MITER_REVERT_NV 0x90A7 -#define GL_MITER_TRUNCATE_NV 0x90A8 -#define GL_SKIP_MISSING_GLYPH_NV 0x90A9 -#define GL_USE_MISSING_GLYPH_NV 0x90AA -#define GL_PATH_ERROR_POSITION_NV 0x90AB -#define GL_PATH_FOG_GEN_MODE_NV 0x90AC -#define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD -#define GL_ADJACENT_PAIRS_NV 0x90AE -#define GL_FIRST_TO_REST_NV 0x90AF -#define GL_PATH_GEN_MODE_NV 0x90B0 -#define GL_PATH_GEN_COEFF_NV 0x90B1 -#define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2 -#define GL_PATH_GEN_COMPONENTS_NV 0x90B3 -#define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4 -#define GL_MOVE_TO_RESETS_NV 0x90B5 -#define GL_MOVE_TO_CONTINUES_NV 0x90B6 -#define GL_PATH_STENCIL_FUNC_NV 0x90B7 -#define GL_PATH_STENCIL_REF_NV 0x90B8 -#define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9 -#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD -#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE -#define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF -#define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368 -#define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369 -#define GL_FONT_UNAVAILABLE_NV 0x936A -#define GL_FONT_UNINTELLIGIBLE_NV 0x936B -#define GL_STANDARD_FONT_FORMAT_NV 0x936C -#define GL_FRAGMENT_INPUT_NV 0x936D -#define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000 -#define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000 -#define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000 -#define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000 -#define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000 -#define GL_FONT_ASCENDER_BIT_NV 0x00200000 -#define GL_FONT_DESCENDER_BIT_NV 0x00400000 -#define GL_FONT_HEIGHT_BIT_NV 0x00800000 -#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000 -#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000 -#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 -#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 -#define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 -#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000 - -typedef void (GLAPIENTRY * PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath); -typedef void (GLAPIENTRY * PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef void (GLAPIENTRY * PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode); -typedef void (GLAPIENTRY * PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef void (GLAPIENTRY * PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode); -typedef void (GLAPIENTRY * PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range); -typedef GLuint (GLAPIENTRY * PFNGLGENPATHSNVPROC) (GLsizei range); -typedef void (GLAPIENTRY * PFNGLGETPATHCOLORGENFVNVPROC) (GLenum color, GLenum pname, GLfloat* value); -typedef void (GLAPIENTRY * PFNGLGETPATHCOLORGENIVNVPROC) (GLenum color, GLenum pname, GLint* value); -typedef void (GLAPIENTRY * PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte* commands); -typedef void (GLAPIENTRY * PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat* coords); -typedef void (GLAPIENTRY * PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat* dashArray); -typedef GLfloat (GLAPIENTRY * PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); -typedef void (GLAPIENTRY * PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat* metrics); -typedef void (GLAPIENTRY * PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); -typedef void (GLAPIENTRY * PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat* value); -typedef void (GLAPIENTRY * PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint* value); -typedef void (GLAPIENTRY * PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); -typedef void (GLAPIENTRY * PFNGLGETPATHTEXGENFVNVPROC) (GLenum texCoordSet, GLenum pname, GLfloat* value); -typedef void (GLAPIENTRY * PFNGLGETPATHTEXGENIVNVPROC) (GLenum texCoordSet, GLenum pname, GLint* value); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei *length, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); -typedef GLboolean (GLAPIENTRY * PFNGLISPATHNVPROC) (GLuint path); -typedef GLboolean (GLAPIENTRY * PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); -typedef GLboolean (GLAPIENTRY * PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLPATHCOLORGENNVPROC) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat* coeffs); -typedef void (GLAPIENTRY * PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void*coords); -typedef void (GLAPIENTRY * PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); -typedef void (GLAPIENTRY * PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum zfunc); -typedef void (GLAPIENTRY * PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat* dashArray); -typedef void (GLAPIENTRY * PFNGLPATHFOGGENNVPROC) (GLenum genMode); -typedef GLenum (GLAPIENTRY * PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef GLenum (GLAPIENTRY * PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); -typedef void (GLAPIENTRY * PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef void (GLAPIENTRY * PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void*charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef GLenum (GLAPIENTRY * PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef void (GLAPIENTRY * PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value); -typedef void (GLAPIENTRY * PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value); -typedef void (GLAPIENTRY * PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units); -typedef void (GLAPIENTRY * PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask); -typedef void (GLAPIENTRY * PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString); -typedef void (GLAPIENTRY * PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void*coords); -typedef void (GLAPIENTRY * PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); -typedef void (GLAPIENTRY * PFNGLPATHTEXGENNVPROC) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat* coeffs); -typedef GLboolean (GLAPIENTRY * PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat* x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); -typedef void (GLAPIENTRY * PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat* coeffs); -typedef void (GLAPIENTRY * PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); -typedef void (GLAPIENTRY * PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask); -typedef void (GLAPIENTRY * PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); -typedef void (GLAPIENTRY * PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask); -typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); -typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode); -typedef void (GLAPIENTRY * PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat* transformValues); -typedef void (GLAPIENTRY * PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint paths[], const GLfloat weights[]); - -#define glCopyPathNV GLEW_GET_FUN(__glewCopyPathNV) -#define glCoverFillPathInstancedNV GLEW_GET_FUN(__glewCoverFillPathInstancedNV) -#define glCoverFillPathNV GLEW_GET_FUN(__glewCoverFillPathNV) -#define glCoverStrokePathInstancedNV GLEW_GET_FUN(__glewCoverStrokePathInstancedNV) -#define glCoverStrokePathNV GLEW_GET_FUN(__glewCoverStrokePathNV) -#define glDeletePathsNV GLEW_GET_FUN(__glewDeletePathsNV) -#define glGenPathsNV GLEW_GET_FUN(__glewGenPathsNV) -#define glGetPathColorGenfvNV GLEW_GET_FUN(__glewGetPathColorGenfvNV) -#define glGetPathColorGenivNV GLEW_GET_FUN(__glewGetPathColorGenivNV) -#define glGetPathCommandsNV GLEW_GET_FUN(__glewGetPathCommandsNV) -#define glGetPathCoordsNV GLEW_GET_FUN(__glewGetPathCoordsNV) -#define glGetPathDashArrayNV GLEW_GET_FUN(__glewGetPathDashArrayNV) -#define glGetPathLengthNV GLEW_GET_FUN(__glewGetPathLengthNV) -#define glGetPathMetricRangeNV GLEW_GET_FUN(__glewGetPathMetricRangeNV) -#define glGetPathMetricsNV GLEW_GET_FUN(__glewGetPathMetricsNV) -#define glGetPathParameterfvNV GLEW_GET_FUN(__glewGetPathParameterfvNV) -#define glGetPathParameterivNV GLEW_GET_FUN(__glewGetPathParameterivNV) -#define glGetPathSpacingNV GLEW_GET_FUN(__glewGetPathSpacingNV) -#define glGetPathTexGenfvNV GLEW_GET_FUN(__glewGetPathTexGenfvNV) -#define glGetPathTexGenivNV GLEW_GET_FUN(__glewGetPathTexGenivNV) -#define glGetProgramResourcefvNV GLEW_GET_FUN(__glewGetProgramResourcefvNV) -#define glInterpolatePathsNV GLEW_GET_FUN(__glewInterpolatePathsNV) -#define glIsPathNV GLEW_GET_FUN(__glewIsPathNV) -#define glIsPointInFillPathNV GLEW_GET_FUN(__glewIsPointInFillPathNV) -#define glIsPointInStrokePathNV GLEW_GET_FUN(__glewIsPointInStrokePathNV) -#define glMatrixLoad3x2fNV GLEW_GET_FUN(__glewMatrixLoad3x2fNV) -#define glMatrixLoad3x3fNV GLEW_GET_FUN(__glewMatrixLoad3x3fNV) -#define glMatrixLoadTranspose3x3fNV GLEW_GET_FUN(__glewMatrixLoadTranspose3x3fNV) -#define glMatrixMult3x2fNV GLEW_GET_FUN(__glewMatrixMult3x2fNV) -#define glMatrixMult3x3fNV GLEW_GET_FUN(__glewMatrixMult3x3fNV) -#define glMatrixMultTranspose3x3fNV GLEW_GET_FUN(__glewMatrixMultTranspose3x3fNV) -#define glPathColorGenNV GLEW_GET_FUN(__glewPathColorGenNV) -#define glPathCommandsNV GLEW_GET_FUN(__glewPathCommandsNV) -#define glPathCoordsNV GLEW_GET_FUN(__glewPathCoordsNV) -#define glPathCoverDepthFuncNV GLEW_GET_FUN(__glewPathCoverDepthFuncNV) -#define glPathDashArrayNV GLEW_GET_FUN(__glewPathDashArrayNV) -#define glPathFogGenNV GLEW_GET_FUN(__glewPathFogGenNV) -#define glPathGlyphIndexArrayNV GLEW_GET_FUN(__glewPathGlyphIndexArrayNV) -#define glPathGlyphIndexRangeNV GLEW_GET_FUN(__glewPathGlyphIndexRangeNV) -#define glPathGlyphRangeNV GLEW_GET_FUN(__glewPathGlyphRangeNV) -#define glPathGlyphsNV GLEW_GET_FUN(__glewPathGlyphsNV) -#define glPathMemoryGlyphIndexArrayNV GLEW_GET_FUN(__glewPathMemoryGlyphIndexArrayNV) -#define glPathParameterfNV GLEW_GET_FUN(__glewPathParameterfNV) -#define glPathParameterfvNV GLEW_GET_FUN(__glewPathParameterfvNV) -#define glPathParameteriNV GLEW_GET_FUN(__glewPathParameteriNV) -#define glPathParameterivNV GLEW_GET_FUN(__glewPathParameterivNV) -#define glPathStencilDepthOffsetNV GLEW_GET_FUN(__glewPathStencilDepthOffsetNV) -#define glPathStencilFuncNV GLEW_GET_FUN(__glewPathStencilFuncNV) -#define glPathStringNV GLEW_GET_FUN(__glewPathStringNV) -#define glPathSubCommandsNV GLEW_GET_FUN(__glewPathSubCommandsNV) -#define glPathSubCoordsNV GLEW_GET_FUN(__glewPathSubCoordsNV) -#define glPathTexGenNV GLEW_GET_FUN(__glewPathTexGenNV) -#define glPointAlongPathNV GLEW_GET_FUN(__glewPointAlongPathNV) -#define glProgramPathFragmentInputGenNV GLEW_GET_FUN(__glewProgramPathFragmentInputGenNV) -#define glStencilFillPathInstancedNV GLEW_GET_FUN(__glewStencilFillPathInstancedNV) -#define glStencilFillPathNV GLEW_GET_FUN(__glewStencilFillPathNV) -#define glStencilStrokePathInstancedNV GLEW_GET_FUN(__glewStencilStrokePathInstancedNV) -#define glStencilStrokePathNV GLEW_GET_FUN(__glewStencilStrokePathNV) -#define glStencilThenCoverFillPathInstancedNV GLEW_GET_FUN(__glewStencilThenCoverFillPathInstancedNV) -#define glStencilThenCoverFillPathNV GLEW_GET_FUN(__glewStencilThenCoverFillPathNV) -#define glStencilThenCoverStrokePathInstancedNV GLEW_GET_FUN(__glewStencilThenCoverStrokePathInstancedNV) -#define glStencilThenCoverStrokePathNV GLEW_GET_FUN(__glewStencilThenCoverStrokePathNV) -#define glTransformPathNV GLEW_GET_FUN(__glewTransformPathNV) -#define glWeightPathsNV GLEW_GET_FUN(__glewWeightPathsNV) - -#define GLEW_NV_path_rendering GLEW_GET_VAR(__GLEW_NV_path_rendering) - -#endif /* GL_NV_path_rendering */ - -/* -------------------- GL_NV_path_rendering_shared_edge ------------------- */ - -#ifndef GL_NV_path_rendering_shared_edge -#define GL_NV_path_rendering_shared_edge 1 - -#define GL_SHARED_EDGE_NV 0xC0 - -#define GLEW_NV_path_rendering_shared_edge GLEW_GET_VAR(__GLEW_NV_path_rendering_shared_edge) - -#endif /* GL_NV_path_rendering_shared_edge */ - -/* ----------------------- GL_NV_pixel_buffer_object ----------------------- */ - -#ifndef GL_NV_pixel_buffer_object -#define GL_NV_pixel_buffer_object 1 - -#define GL_PIXEL_PACK_BUFFER_NV 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_NV 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_NV 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_NV 0x88EF - -#define GLEW_NV_pixel_buffer_object GLEW_GET_VAR(__GLEW_NV_pixel_buffer_object) - -#endif /* GL_NV_pixel_buffer_object */ - -/* ------------------------- GL_NV_pixel_data_range ------------------------ */ - -#ifndef GL_NV_pixel_data_range -#define GL_NV_pixel_data_range 1 - -#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 -#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 -#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A -#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B -#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C -#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D - -typedef void (GLAPIENTRY * PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, void *pointer); - -#define glFlushPixelDataRangeNV GLEW_GET_FUN(__glewFlushPixelDataRangeNV) -#define glPixelDataRangeNV GLEW_GET_FUN(__glewPixelDataRangeNV) - -#define GLEW_NV_pixel_data_range GLEW_GET_VAR(__GLEW_NV_pixel_data_range) - -#endif /* GL_NV_pixel_data_range */ - -/* ------------------------- GL_NV_platform_binary ------------------------- */ - -#ifndef GL_NV_platform_binary -#define GL_NV_platform_binary 1 - -#define GL_NVIDIA_PLATFORM_BINARY_NV 0x890B - -#define GLEW_NV_platform_binary GLEW_GET_VAR(__GLEW_NV_platform_binary) - -#endif /* GL_NV_platform_binary */ - -/* --------------------------- GL_NV_point_sprite -------------------------- */ - -#ifndef GL_NV_point_sprite -#define GL_NV_point_sprite 1 - -#define GL_POINT_SPRITE_NV 0x8861 -#define GL_COORD_REPLACE_NV 0x8862 -#define GL_POINT_SPRITE_R_MODE_NV 0x8863 - -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint* params); - -#define glPointParameteriNV GLEW_GET_FUN(__glewPointParameteriNV) -#define glPointParameterivNV GLEW_GET_FUN(__glewPointParameterivNV) - -#define GLEW_NV_point_sprite GLEW_GET_VAR(__GLEW_NV_point_sprite) - -#endif /* GL_NV_point_sprite */ - -/* --------------------------- GL_NV_polygon_mode -------------------------- */ - -#ifndef GL_NV_polygon_mode -#define GL_NV_polygon_mode 1 - -#define GL_POLYGON_MODE_NV 0x0B40 -#define GL_POINT_NV 0x1B00 -#define GL_LINE_NV 0x1B01 -#define GL_FILL_NV 0x1B02 -#define GL_POLYGON_OFFSET_POINT_NV 0x2A01 -#define GL_POLYGON_OFFSET_LINE_NV 0x2A02 - -typedef void (GLAPIENTRY * PFNGLPOLYGONMODENVPROC) (GLenum face, GLenum mode); - -#define glPolygonModeNV GLEW_GET_FUN(__glewPolygonModeNV) - -#define GLEW_NV_polygon_mode GLEW_GET_VAR(__GLEW_NV_polygon_mode) - -#endif /* GL_NV_polygon_mode */ - -/* -------------------------- GL_NV_present_video -------------------------- */ - -#ifndef GL_NV_present_video -#define GL_NV_present_video 1 - -#define GL_FRAME_NV 0x8E26 -#define GL_FIELDS_NV 0x8E27 -#define GL_CURRENT_TIME_NV 0x8E28 -#define GL_NUM_FILL_STREAMS_NV 0x8E29 -#define GL_PRESENT_TIME_NV 0x8E2A -#define GL_PRESENT_DURATION_NV 0x8E2B - -typedef void (GLAPIENTRY * PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT* params); -typedef void (GLAPIENTRY * PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT* params); -typedef void (GLAPIENTRY * PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); -typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); - -#define glGetVideoi64vNV GLEW_GET_FUN(__glewGetVideoi64vNV) -#define glGetVideoivNV GLEW_GET_FUN(__glewGetVideoivNV) -#define glGetVideoui64vNV GLEW_GET_FUN(__glewGetVideoui64vNV) -#define glGetVideouivNV GLEW_GET_FUN(__glewGetVideouivNV) -#define glPresentFrameDualFillNV GLEW_GET_FUN(__glewPresentFrameDualFillNV) -#define glPresentFrameKeyedNV GLEW_GET_FUN(__glewPresentFrameKeyedNV) - -#define GLEW_NV_present_video GLEW_GET_VAR(__GLEW_NV_present_video) - -#endif /* GL_NV_present_video */ - -/* ------------------------ GL_NV_primitive_restart ------------------------ */ - -#ifndef GL_NV_primitive_restart -#define GL_NV_primitive_restart 1 - -#define GL_PRIMITIVE_RESTART_NV 0x8558 -#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 - -typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); -typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTNVPROC) (void); - -#define glPrimitiveRestartIndexNV GLEW_GET_FUN(__glewPrimitiveRestartIndexNV) -#define glPrimitiveRestartNV GLEW_GET_FUN(__glewPrimitiveRestartNV) - -#define GLEW_NV_primitive_restart GLEW_GET_VAR(__GLEW_NV_primitive_restart) - -#endif /* GL_NV_primitive_restart */ - -/* ------------------------ GL_NV_query_resource_tag ----------------------- */ - -#ifndef GL_NV_query_resource_tag -#define GL_NV_query_resource_tag 1 - -#define GLEW_NV_query_resource_tag GLEW_GET_VAR(__GLEW_NV_query_resource_tag) - -#endif /* GL_NV_query_resource_tag */ - -/* --------------------------- GL_NV_read_buffer --------------------------- */ - -#ifndef GL_NV_read_buffer -#define GL_NV_read_buffer 1 - -#define GL_READ_BUFFER_NV 0x0C02 - -typedef void (GLAPIENTRY * PFNGLREADBUFFERNVPROC) (GLenum mode); - -#define glReadBufferNV GLEW_GET_FUN(__glewReadBufferNV) - -#define GLEW_NV_read_buffer GLEW_GET_VAR(__GLEW_NV_read_buffer) - -#endif /* GL_NV_read_buffer */ - -/* ------------------------ GL_NV_read_buffer_front ------------------------ */ - -#ifndef GL_NV_read_buffer_front -#define GL_NV_read_buffer_front 1 - -#define GL_READ_BUFFER_NV 0x0C02 - -#define GLEW_NV_read_buffer_front GLEW_GET_VAR(__GLEW_NV_read_buffer_front) - -#endif /* GL_NV_read_buffer_front */ - -/* ---------------------------- GL_NV_read_depth --------------------------- */ - -#ifndef GL_NV_read_depth -#define GL_NV_read_depth 1 - -#define GLEW_NV_read_depth GLEW_GET_VAR(__GLEW_NV_read_depth) - -#endif /* GL_NV_read_depth */ - -/* ------------------------ GL_NV_read_depth_stencil ----------------------- */ - -#ifndef GL_NV_read_depth_stencil -#define GL_NV_read_depth_stencil 1 - -#define GLEW_NV_read_depth_stencil GLEW_GET_VAR(__GLEW_NV_read_depth_stencil) - -#endif /* GL_NV_read_depth_stencil */ - -/* --------------------------- GL_NV_read_stencil -------------------------- */ - -#ifndef GL_NV_read_stencil -#define GL_NV_read_stencil 1 - -#define GLEW_NV_read_stencil GLEW_GET_VAR(__GLEW_NV_read_stencil) - -#endif /* GL_NV_read_stencil */ - -/* ------------------------ GL_NV_register_combiners ----------------------- */ - -#ifndef GL_NV_register_combiners -#define GL_NV_register_combiners 1 - -#define GL_REGISTER_COMBINERS_NV 0x8522 -#define GL_VARIABLE_A_NV 0x8523 -#define GL_VARIABLE_B_NV 0x8524 -#define GL_VARIABLE_C_NV 0x8525 -#define GL_VARIABLE_D_NV 0x8526 -#define GL_VARIABLE_E_NV 0x8527 -#define GL_VARIABLE_F_NV 0x8528 -#define GL_VARIABLE_G_NV 0x8529 -#define GL_CONSTANT_COLOR0_NV 0x852A -#define GL_CONSTANT_COLOR1_NV 0x852B -#define GL_PRIMARY_COLOR_NV 0x852C -#define GL_SECONDARY_COLOR_NV 0x852D -#define GL_SPARE0_NV 0x852E -#define GL_SPARE1_NV 0x852F -#define GL_DISCARD_NV 0x8530 -#define GL_E_TIMES_F_NV 0x8531 -#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 -#define GL_UNSIGNED_IDENTITY_NV 0x8536 -#define GL_UNSIGNED_INVERT_NV 0x8537 -#define GL_EXPAND_NORMAL_NV 0x8538 -#define GL_EXPAND_NEGATE_NV 0x8539 -#define GL_HALF_BIAS_NORMAL_NV 0x853A -#define GL_HALF_BIAS_NEGATE_NV 0x853B -#define GL_SIGNED_IDENTITY_NV 0x853C -#define GL_SIGNED_NEGATE_NV 0x853D -#define GL_SCALE_BY_TWO_NV 0x853E -#define GL_SCALE_BY_FOUR_NV 0x853F -#define GL_SCALE_BY_ONE_HALF_NV 0x8540 -#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 -#define GL_COMBINER_INPUT_NV 0x8542 -#define GL_COMBINER_MAPPING_NV 0x8543 -#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 -#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 -#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 -#define GL_COMBINER_MUX_SUM_NV 0x8547 -#define GL_COMBINER_SCALE_NV 0x8548 -#define GL_COMBINER_BIAS_NV 0x8549 -#define GL_COMBINER_AB_OUTPUT_NV 0x854A -#define GL_COMBINER_CD_OUTPUT_NV 0x854B -#define GL_COMBINER_SUM_OUTPUT_NV 0x854C -#define GL_MAX_GENERAL_COMBINERS_NV 0x854D -#define GL_NUM_GENERAL_COMBINERS_NV 0x854E -#define GL_COLOR_SUM_CLAMP_NV 0x854F -#define GL_COMBINER0_NV 0x8550 -#define GL_COMBINER1_NV 0x8551 -#define GL_COMBINER2_NV 0x8552 -#define GL_COMBINER3_NV 0x8553 -#define GL_COMBINER4_NV 0x8554 -#define GL_COMBINER5_NV 0x8555 -#define GL_COMBINER6_NV 0x8556 -#define GL_COMBINER7_NV 0x8557 - -typedef void (GLAPIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (GLAPIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); -typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint* params); - -#define glCombinerInputNV GLEW_GET_FUN(__glewCombinerInputNV) -#define glCombinerOutputNV GLEW_GET_FUN(__glewCombinerOutputNV) -#define glCombinerParameterfNV GLEW_GET_FUN(__glewCombinerParameterfNV) -#define glCombinerParameterfvNV GLEW_GET_FUN(__glewCombinerParameterfvNV) -#define glCombinerParameteriNV GLEW_GET_FUN(__glewCombinerParameteriNV) -#define glCombinerParameterivNV GLEW_GET_FUN(__glewCombinerParameterivNV) -#define glFinalCombinerInputNV GLEW_GET_FUN(__glewFinalCombinerInputNV) -#define glGetCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetCombinerInputParameterfvNV) -#define glGetCombinerInputParameterivNV GLEW_GET_FUN(__glewGetCombinerInputParameterivNV) -#define glGetCombinerOutputParameterfvNV GLEW_GET_FUN(__glewGetCombinerOutputParameterfvNV) -#define glGetCombinerOutputParameterivNV GLEW_GET_FUN(__glewGetCombinerOutputParameterivNV) -#define glGetFinalCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterfvNV) -#define glGetFinalCombinerInputParameterivNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterivNV) - -#define GLEW_NV_register_combiners GLEW_GET_VAR(__GLEW_NV_register_combiners) - -#endif /* GL_NV_register_combiners */ - -/* ----------------------- GL_NV_register_combiners2 ----------------------- */ - -#ifndef GL_NV_register_combiners2 -#define GL_NV_register_combiners2 1 - -#define GL_PER_STAGE_CONSTANTS_NV 0x8535 - -typedef void (GLAPIENTRY * PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat* params); - -#define glCombinerStageParameterfvNV GLEW_GET_FUN(__glewCombinerStageParameterfvNV) -#define glGetCombinerStageParameterfvNV GLEW_GET_FUN(__glewGetCombinerStageParameterfvNV) - -#define GLEW_NV_register_combiners2 GLEW_GET_VAR(__GLEW_NV_register_combiners2) - -#endif /* GL_NV_register_combiners2 */ - -/* ------------------- GL_NV_representative_fragment_test ------------------ */ - -#ifndef GL_NV_representative_fragment_test -#define GL_NV_representative_fragment_test 1 - -#define GL_REPRESENTATIVE_FRAGMENT_TEST_NV 0x937F - -#define GLEW_NV_representative_fragment_test GLEW_GET_VAR(__GLEW_NV_representative_fragment_test) - -#endif /* GL_NV_representative_fragment_test */ - -/* ------------------ GL_NV_robustness_video_memory_purge ------------------ */ - -#ifndef GL_NV_robustness_video_memory_purge -#define GL_NV_robustness_video_memory_purge 1 - -#define GL_PURGED_CONTEXT_RESET_NV 0x92BB - -#define GLEW_NV_robustness_video_memory_purge GLEW_GET_VAR(__GLEW_NV_robustness_video_memory_purge) - -#endif /* GL_NV_robustness_video_memory_purge */ - -/* --------------------------- GL_NV_sRGB_formats -------------------------- */ - -#ifndef GL_NV_sRGB_formats -#define GL_NV_sRGB_formats 1 - -#define GL_ETC1_SRGB8_NV 0x88EE -#define GL_SRGB8_NV 0x8C41 -#define GL_SLUMINANCE_ALPHA_NV 0x8C44 -#define GL_SLUMINANCE8_ALPHA8_NV 0x8C45 -#define GL_SLUMINANCE_NV 0x8C46 -#define GL_SLUMINANCE8_NV 0x8C47 -#define GL_COMPRESSED_SRGB_S3TC_DXT1_NV 0x8C4C -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV 0x8C4D -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV 0x8C4E -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV 0x8C4F - -#define GLEW_NV_sRGB_formats GLEW_GET_VAR(__GLEW_NV_sRGB_formats) - -#endif /* GL_NV_sRGB_formats */ - -/* ------------------------- GL_NV_sample_locations ------------------------ */ - -#ifndef GL_NV_sample_locations -#define GL_NV_sample_locations 1 - -#define GL_SAMPLE_LOCATION_NV 0x8E50 -#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D -#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E -#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F -#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340 -#define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341 -#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342 -#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLRESOLVEDEPTHVALUESNVPROC) (void); - -#define glFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewFramebufferSampleLocationsfvNV) -#define glNamedFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewNamedFramebufferSampleLocationsfvNV) -#define glResolveDepthValuesNV GLEW_GET_FUN(__glewResolveDepthValuesNV) - -#define GLEW_NV_sample_locations GLEW_GET_VAR(__GLEW_NV_sample_locations) - -#endif /* GL_NV_sample_locations */ - -/* ------------------ GL_NV_sample_mask_override_coverage ------------------ */ - -#ifndef GL_NV_sample_mask_override_coverage -#define GL_NV_sample_mask_override_coverage 1 - -#define GLEW_NV_sample_mask_override_coverage GLEW_GET_VAR(__GLEW_NV_sample_mask_override_coverage) - -#endif /* GL_NV_sample_mask_override_coverage */ - -/* ------------------------ GL_NV_scissor_exclusive ------------------------ */ - -#ifndef GL_NV_scissor_exclusive -#define GL_NV_scissor_exclusive 1 - -#define GL_SCISSOR_TEST_EXCLUSIVE_NV 0x9555 -#define GL_SCISSOR_BOX_EXCLUSIVE_NV 0x9556 - -typedef void (GLAPIENTRY * PFNGLSCISSOREXCLUSIVEARRAYVNVPROC) (GLuint first, GLsizei count, const GLint* v); -typedef void (GLAPIENTRY * PFNGLSCISSOREXCLUSIVENVPROC) (GLint x, GLint y, GLsizei width, GLsizei height); - -#define glScissorExclusiveArrayvNV GLEW_GET_FUN(__glewScissorExclusiveArrayvNV) -#define glScissorExclusiveNV GLEW_GET_FUN(__glewScissorExclusiveNV) - -#define GLEW_NV_scissor_exclusive GLEW_GET_VAR(__GLEW_NV_scissor_exclusive) - -#endif /* GL_NV_scissor_exclusive */ - -/* ---------------------- GL_NV_shader_atomic_counters --------------------- */ - -#ifndef GL_NV_shader_atomic_counters -#define GL_NV_shader_atomic_counters 1 - -#define GLEW_NV_shader_atomic_counters GLEW_GET_VAR(__GLEW_NV_shader_atomic_counters) - -#endif /* GL_NV_shader_atomic_counters */ - -/* ----------------------- GL_NV_shader_atomic_float ----------------------- */ - -#ifndef GL_NV_shader_atomic_float -#define GL_NV_shader_atomic_float 1 - -#define GLEW_NV_shader_atomic_float GLEW_GET_VAR(__GLEW_NV_shader_atomic_float) - -#endif /* GL_NV_shader_atomic_float */ - -/* ---------------------- GL_NV_shader_atomic_float64 ---------------------- */ - -#ifndef GL_NV_shader_atomic_float64 -#define GL_NV_shader_atomic_float64 1 - -#define GLEW_NV_shader_atomic_float64 GLEW_GET_VAR(__GLEW_NV_shader_atomic_float64) - -#endif /* GL_NV_shader_atomic_float64 */ - -/* -------------------- GL_NV_shader_atomic_fp16_vector -------------------- */ - -#ifndef GL_NV_shader_atomic_fp16_vector -#define GL_NV_shader_atomic_fp16_vector 1 - -#define GLEW_NV_shader_atomic_fp16_vector GLEW_GET_VAR(__GLEW_NV_shader_atomic_fp16_vector) - -#endif /* GL_NV_shader_atomic_fp16_vector */ - -/* ----------------------- GL_NV_shader_atomic_int64 ----------------------- */ - -#ifndef GL_NV_shader_atomic_int64 -#define GL_NV_shader_atomic_int64 1 - -#define GLEW_NV_shader_atomic_int64 GLEW_GET_VAR(__GLEW_NV_shader_atomic_int64) - -#endif /* GL_NV_shader_atomic_int64 */ - -/* ------------------------ GL_NV_shader_buffer_load ----------------------- */ - -#ifndef GL_NV_shader_buffer_load -#define GL_NV_shader_buffer_load 1 - -#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D -#define GL_GPU_ADDRESS_NV 0x8F34 -#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 - -typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT* params); -typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT* result); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT* params); -typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); -typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); -typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); -typedef void (GLAPIENTRY * PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); - -#define glGetBufferParameterui64vNV GLEW_GET_FUN(__glewGetBufferParameterui64vNV) -#define glGetIntegerui64vNV GLEW_GET_FUN(__glewGetIntegerui64vNV) -#define glGetNamedBufferParameterui64vNV GLEW_GET_FUN(__glewGetNamedBufferParameterui64vNV) -#define glIsBufferResidentNV GLEW_GET_FUN(__glewIsBufferResidentNV) -#define glIsNamedBufferResidentNV GLEW_GET_FUN(__glewIsNamedBufferResidentNV) -#define glMakeBufferNonResidentNV GLEW_GET_FUN(__glewMakeBufferNonResidentNV) -#define glMakeBufferResidentNV GLEW_GET_FUN(__glewMakeBufferResidentNV) -#define glMakeNamedBufferNonResidentNV GLEW_GET_FUN(__glewMakeNamedBufferNonResidentNV) -#define glMakeNamedBufferResidentNV GLEW_GET_FUN(__glewMakeNamedBufferResidentNV) -#define glProgramUniformui64NV GLEW_GET_FUN(__glewProgramUniformui64NV) -#define glProgramUniformui64vNV GLEW_GET_FUN(__glewProgramUniformui64vNV) -#define glUniformui64NV GLEW_GET_FUN(__glewUniformui64NV) -#define glUniformui64vNV GLEW_GET_FUN(__glewUniformui64vNV) - -#define GLEW_NV_shader_buffer_load GLEW_GET_VAR(__GLEW_NV_shader_buffer_load) - -#endif /* GL_NV_shader_buffer_load */ - -/* ---------------- GL_NV_shader_noperspective_interpolation --------------- */ - -#ifndef GL_NV_shader_noperspective_interpolation -#define GL_NV_shader_noperspective_interpolation 1 - -#define GLEW_NV_shader_noperspective_interpolation GLEW_GET_VAR(__GLEW_NV_shader_noperspective_interpolation) - -#endif /* GL_NV_shader_noperspective_interpolation */ - -/* ------------------- GL_NV_shader_storage_buffer_object ------------------ */ - -#ifndef GL_NV_shader_storage_buffer_object -#define GL_NV_shader_storage_buffer_object 1 - -#define GLEW_NV_shader_storage_buffer_object GLEW_GET_VAR(__GLEW_NV_shader_storage_buffer_object) - -#endif /* GL_NV_shader_storage_buffer_object */ - -/* ------------------- GL_NV_shader_subgroup_partitioned ------------------- */ - -#ifndef GL_NV_shader_subgroup_partitioned -#define GL_NV_shader_subgroup_partitioned 1 - -#define GL_SUBGROUP_FEATURE_PARTITIONED_BIT_NV 0x00000100 - -#define GLEW_NV_shader_subgroup_partitioned GLEW_GET_VAR(__GLEW_NV_shader_subgroup_partitioned) - -#endif /* GL_NV_shader_subgroup_partitioned */ - -/* --------------------- GL_NV_shader_texture_footprint -------------------- */ - -#ifndef GL_NV_shader_texture_footprint -#define GL_NV_shader_texture_footprint 1 - -#define GLEW_NV_shader_texture_footprint GLEW_GET_VAR(__GLEW_NV_shader_texture_footprint) - -#endif /* GL_NV_shader_texture_footprint */ - -/* ----------------------- GL_NV_shader_thread_group ----------------------- */ - -#ifndef GL_NV_shader_thread_group -#define GL_NV_shader_thread_group 1 - -#define GL_WARP_SIZE_NV 0x9339 -#define GL_WARPS_PER_SM_NV 0x933A -#define GL_SM_COUNT_NV 0x933B - -#define GLEW_NV_shader_thread_group GLEW_GET_VAR(__GLEW_NV_shader_thread_group) - -#endif /* GL_NV_shader_thread_group */ - -/* ---------------------- GL_NV_shader_thread_shuffle ---------------------- */ - -#ifndef GL_NV_shader_thread_shuffle -#define GL_NV_shader_thread_shuffle 1 - -#define GLEW_NV_shader_thread_shuffle GLEW_GET_VAR(__GLEW_NV_shader_thread_shuffle) - -#endif /* GL_NV_shader_thread_shuffle */ - -/* ------------------------ GL_NV_shading_rate_image ----------------------- */ - -#ifndef GL_NV_shading_rate_image -#define GL_NV_shading_rate_image 1 - -#define GL_SHADING_RATE_IMAGE_BINDING_NV 0x955B -#define GL_SHADING_RATE_IMAGE_TEXEL_WIDTH_NV 0x955C -#define GL_SHADING_RATE_IMAGE_TEXEL_HEIGHT_NV 0x955D -#define GL_SHADING_RATE_IMAGE_PALETTE_SIZE_NV 0x955E -#define GL_MAX_COARSE_FRAGMENT_SAMPLES_NV 0x955F -#define GL_SHADING_RATE_IMAGE_NV 0x9563 -#define GL_SHADING_RATE_NO_INVOCATIONS_NV 0x9564 -#define GL_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV 0x9565 -#define GL_SHADING_RATE_1_INVOCATION_PER_1X2_PIXELS_NV 0x9566 -#define GL_SHADING_RATE_1_INVOCATION_PER_2X1_PIXELS_NV 0x9567 -#define GL_SHADING_RATE_1_INVOCATION_PER_2X2_PIXELS_NV 0x9568 -#define GL_SHADING_RATE_1_INVOCATION_PER_2X4_PIXELS_NV 0x9569 -#define GL_SHADING_RATE_1_INVOCATION_PER_4X2_PIXELS_NV 0x956A -#define GL_SHADING_RATE_1_INVOCATION_PER_4X4_PIXELS_NV 0x956B -#define GL_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NV 0x956C -#define GL_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NV 0x956D -#define GL_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NV 0x956E -#define GL_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV 0x956F -#define GL_SHADING_RATE_SAMPLE_ORDER_DEFAULT_NV 0x95AE -#define GL_SHADING_RATE_SAMPLE_ORDER_PIXEL_MAJOR_NV 0x95AF -#define GL_SHADING_RATE_SAMPLE_ORDER_SAMPLE_MAJOR_NV 0x95B0 - -typedef void (GLAPIENTRY * PFNGLBINDSHADINGRATEIMAGENVPROC) (GLuint texture); -typedef void (GLAPIENTRY * PFNGLGETSHADINGRATEIMAGEPALETTENVPROC) (GLuint viewport, GLuint entry, GLenum* rate); -typedef void (GLAPIENTRY * PFNGLGETSHADINGRATESAMPLELOCATIONIVNVPROC) (GLenum rate, GLuint samples, GLuint index, GLint* location); -typedef void (GLAPIENTRY * PFNGLSHADINGRATEIMAGEBARRIERNVPROC) (GLenum order); -typedef void (GLAPIENTRY * PFNGLSHADINGRATEIMAGEPALETTENVPROC) (GLuint viewport, GLuint first, GLsizei count, const GLenum* rates); -typedef void (GLAPIENTRY * PFNGLSHADINGRATESAMPLEORDERCUSTOMNVPROC) (GLenum rate, GLuint samples, const GLint* locations); - -#define glBindShadingRateImageNV GLEW_GET_FUN(__glewBindShadingRateImageNV) -#define glGetShadingRateImagePaletteNV GLEW_GET_FUN(__glewGetShadingRateImagePaletteNV) -#define glGetShadingRateSampleLocationivNV GLEW_GET_FUN(__glewGetShadingRateSampleLocationivNV) -#define glShadingRateImageBarrierNV GLEW_GET_FUN(__glewShadingRateImageBarrierNV) -#define glShadingRateImagePaletteNV GLEW_GET_FUN(__glewShadingRateImagePaletteNV) -#define glShadingRateSampleOrderCustomNV GLEW_GET_FUN(__glewShadingRateSampleOrderCustomNV) - -#define GLEW_NV_shading_rate_image GLEW_GET_VAR(__GLEW_NV_shading_rate_image) - -#endif /* GL_NV_shading_rate_image */ - -/* ---------------------- GL_NV_shadow_samplers_array ---------------------- */ - -#ifndef GL_NV_shadow_samplers_array -#define GL_NV_shadow_samplers_array 1 - -#define GL_SAMPLER_2D_ARRAY_SHADOW_NV 0x8DC4 - -#define GLEW_NV_shadow_samplers_array GLEW_GET_VAR(__GLEW_NV_shadow_samplers_array) - -#endif /* GL_NV_shadow_samplers_array */ - -/* ----------------------- GL_NV_shadow_samplers_cube ---------------------- */ - -#ifndef GL_NV_shadow_samplers_cube -#define GL_NV_shadow_samplers_cube 1 - -#define GL_SAMPLER_CUBE_SHADOW_NV 0x8DC5 - -#define GLEW_NV_shadow_samplers_cube GLEW_GET_VAR(__GLEW_NV_shadow_samplers_cube) - -#endif /* GL_NV_shadow_samplers_cube */ - -/* ---------------------- GL_NV_stereo_view_rendering ---------------------- */ - -#ifndef GL_NV_stereo_view_rendering -#define GL_NV_stereo_view_rendering 1 - -#define GLEW_NV_stereo_view_rendering GLEW_GET_VAR(__GLEW_NV_stereo_view_rendering) - -#endif /* GL_NV_stereo_view_rendering */ - -/* ---------------------- GL_NV_tessellation_program5 ---------------------- */ - -#ifndef GL_NV_tessellation_program5 -#define GL_NV_tessellation_program5 1 - -#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 -#define GL_TESS_CONTROL_PROGRAM_NV 0x891E -#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F -#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 -#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 - -#define GLEW_NV_tessellation_program5 GLEW_GET_VAR(__GLEW_NV_tessellation_program5) - -#endif /* GL_NV_tessellation_program5 */ - -/* -------------------------- GL_NV_texgen_emboss -------------------------- */ - -#ifndef GL_NV_texgen_emboss -#define GL_NV_texgen_emboss 1 - -#define GL_EMBOSS_LIGHT_NV 0x855D -#define GL_EMBOSS_CONSTANT_NV 0x855E -#define GL_EMBOSS_MAP_NV 0x855F - -#define GLEW_NV_texgen_emboss GLEW_GET_VAR(__GLEW_NV_texgen_emboss) - -#endif /* GL_NV_texgen_emboss */ - -/* ------------------------ GL_NV_texgen_reflection ------------------------ */ - -#ifndef GL_NV_texgen_reflection -#define GL_NV_texgen_reflection 1 - -#define GL_NORMAL_MAP_NV 0x8511 -#define GL_REFLECTION_MAP_NV 0x8512 - -#define GLEW_NV_texgen_reflection GLEW_GET_VAR(__GLEW_NV_texgen_reflection) - -#endif /* GL_NV_texgen_reflection */ - -/* -------------------------- GL_NV_texture_array -------------------------- */ - -#ifndef GL_NV_texture_array -#define GL_NV_texture_array 1 - -#define GL_UNPACK_SKIP_IMAGES_NV 0x806D -#define GL_UNPACK_IMAGE_HEIGHT_NV 0x806E -#define GL_MAX_ARRAY_TEXTURE_LAYERS_NV 0x88FF -#define GL_TEXTURE_2D_ARRAY_NV 0x8C1A -#define GL_TEXTURE_BINDING_2D_ARRAY_NV 0x8C1D -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_NV 0x8CD4 -#define GL_SAMPLER_2D_ARRAY_NV 0x8DC1 - -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DNVPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DNVPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DNVPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERNVPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DNVPROC) (GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DNVPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); - -#define glCompressedTexImage3DNV GLEW_GET_FUN(__glewCompressedTexImage3DNV) -#define glCompressedTexSubImage3DNV GLEW_GET_FUN(__glewCompressedTexSubImage3DNV) -#define glCopyTexSubImage3DNV GLEW_GET_FUN(__glewCopyTexSubImage3DNV) -#define glFramebufferTextureLayerNV GLEW_GET_FUN(__glewFramebufferTextureLayerNV) -#define glTexImage3DNV GLEW_GET_FUN(__glewTexImage3DNV) -#define glTexSubImage3DNV GLEW_GET_FUN(__glewTexSubImage3DNV) - -#define GLEW_NV_texture_array GLEW_GET_VAR(__GLEW_NV_texture_array) - -#endif /* GL_NV_texture_array */ - -/* ------------------------- GL_NV_texture_barrier ------------------------- */ - -#ifndef GL_NV_texture_barrier -#define GL_NV_texture_barrier 1 - -typedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERNVPROC) (void); - -#define glTextureBarrierNV GLEW_GET_FUN(__glewTextureBarrierNV) - -#define GLEW_NV_texture_barrier GLEW_GET_VAR(__GLEW_NV_texture_barrier) - -#endif /* GL_NV_texture_barrier */ - -/* ----------------------- GL_NV_texture_border_clamp ---------------------- */ - -#ifndef GL_NV_texture_border_clamp -#define GL_NV_texture_border_clamp 1 - -#define GL_TEXTURE_BORDER_COLOR_NV 0x1004 -#define GL_CLAMP_TO_BORDER_NV 0x812D - -#define GLEW_NV_texture_border_clamp GLEW_GET_VAR(__GLEW_NV_texture_border_clamp) - -#endif /* GL_NV_texture_border_clamp */ - -/* --------------------- GL_NV_texture_compression_latc -------------------- */ - -#ifndef GL_NV_texture_compression_latc -#define GL_NV_texture_compression_latc 1 - -#define GL_COMPRESSED_LUMINANCE_LATC1_NV 0x8C70 -#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_NV 0x8C71 -#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_NV 0x8C72 -#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_NV 0x8C73 - -#define GLEW_NV_texture_compression_latc GLEW_GET_VAR(__GLEW_NV_texture_compression_latc) - -#endif /* GL_NV_texture_compression_latc */ - -/* --------------------- GL_NV_texture_compression_s3tc -------------------- */ - -#ifndef GL_NV_texture_compression_s3tc -#define GL_NV_texture_compression_s3tc 1 - -#define GL_COMPRESSED_RGB_S3TC_DXT1_NV 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_NV 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_NV 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_NV 0x83F3 - -#define GLEW_NV_texture_compression_s3tc GLEW_GET_VAR(__GLEW_NV_texture_compression_s3tc) - -#endif /* GL_NV_texture_compression_s3tc */ - -/* ----------------- GL_NV_texture_compression_s3tc_update ----------------- */ - -#ifndef GL_NV_texture_compression_s3tc_update -#define GL_NV_texture_compression_s3tc_update 1 - -#define GLEW_NV_texture_compression_s3tc_update GLEW_GET_VAR(__GLEW_NV_texture_compression_s3tc_update) - -#endif /* GL_NV_texture_compression_s3tc_update */ - -/* --------------------- GL_NV_texture_compression_vtc --------------------- */ - -#ifndef GL_NV_texture_compression_vtc -#define GL_NV_texture_compression_vtc 1 - -#define GLEW_NV_texture_compression_vtc GLEW_GET_VAR(__GLEW_NV_texture_compression_vtc) - -#endif /* GL_NV_texture_compression_vtc */ - -/* ----------------------- GL_NV_texture_env_combine4 ---------------------- */ - -#ifndef GL_NV_texture_env_combine4 -#define GL_NV_texture_env_combine4 1 - -#define GL_COMBINE4_NV 0x8503 -#define GL_SOURCE3_RGB_NV 0x8583 -#define GL_SOURCE3_ALPHA_NV 0x858B -#define GL_OPERAND3_RGB_NV 0x8593 -#define GL_OPERAND3_ALPHA_NV 0x859B - -#define GLEW_NV_texture_env_combine4 GLEW_GET_VAR(__GLEW_NV_texture_env_combine4) - -#endif /* GL_NV_texture_env_combine4 */ - -/* ---------------------- GL_NV_texture_expand_normal ---------------------- */ - -#ifndef GL_NV_texture_expand_normal -#define GL_NV_texture_expand_normal 1 - -#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F - -#define GLEW_NV_texture_expand_normal GLEW_GET_VAR(__GLEW_NV_texture_expand_normal) - -#endif /* GL_NV_texture_expand_normal */ - -/* ----------------------- GL_NV_texture_multisample ----------------------- */ - -#ifndef GL_NV_texture_multisample -#define GL_NV_texture_multisample 1 - -#define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045 -#define GL_TEXTURE_COLOR_SAMPLES_NV 0x9046 - -typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); -typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); - -#define glTexImage2DMultisampleCoverageNV GLEW_GET_FUN(__glewTexImage2DMultisampleCoverageNV) -#define glTexImage3DMultisampleCoverageNV GLEW_GET_FUN(__glewTexImage3DMultisampleCoverageNV) -#define glTextureImage2DMultisampleCoverageNV GLEW_GET_FUN(__glewTextureImage2DMultisampleCoverageNV) -#define glTextureImage2DMultisampleNV GLEW_GET_FUN(__glewTextureImage2DMultisampleNV) -#define glTextureImage3DMultisampleCoverageNV GLEW_GET_FUN(__glewTextureImage3DMultisampleCoverageNV) -#define glTextureImage3DMultisampleNV GLEW_GET_FUN(__glewTextureImage3DMultisampleNV) - -#define GLEW_NV_texture_multisample GLEW_GET_VAR(__GLEW_NV_texture_multisample) - -#endif /* GL_NV_texture_multisample */ - -/* ---------------------- GL_NV_texture_npot_2D_mipmap --------------------- */ - -#ifndef GL_NV_texture_npot_2D_mipmap -#define GL_NV_texture_npot_2D_mipmap 1 - -#define GLEW_NV_texture_npot_2D_mipmap GLEW_GET_VAR(__GLEW_NV_texture_npot_2D_mipmap) - -#endif /* GL_NV_texture_npot_2D_mipmap */ - -/* ------------------------ GL_NV_texture_rectangle ------------------------ */ - -#ifndef GL_NV_texture_rectangle -#define GL_NV_texture_rectangle 1 - -#define GL_TEXTURE_RECTANGLE_NV 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 - -#define GLEW_NV_texture_rectangle GLEW_GET_VAR(__GLEW_NV_texture_rectangle) - -#endif /* GL_NV_texture_rectangle */ - -/* ------------------- GL_NV_texture_rectangle_compressed ------------------ */ - -#ifndef GL_NV_texture_rectangle_compressed -#define GL_NV_texture_rectangle_compressed 1 - -#define GLEW_NV_texture_rectangle_compressed GLEW_GET_VAR(__GLEW_NV_texture_rectangle_compressed) - -#endif /* GL_NV_texture_rectangle_compressed */ - -/* -------------------------- GL_NV_texture_shader ------------------------- */ - -#ifndef GL_NV_texture_shader -#define GL_NV_texture_shader 1 - -#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C -#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D -#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E -#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 -#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA -#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB -#define GL_DSDT_MAG_INTENSITY_NV 0x86DC -#define GL_SHADER_CONSISTENT_NV 0x86DD -#define GL_TEXTURE_SHADER_NV 0x86DE -#define GL_SHADER_OPERATION_NV 0x86DF -#define GL_CULL_MODES_NV 0x86E0 -#define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1 -#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 -#define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 -#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 -#define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 -#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 -#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 -#define GL_CONST_EYE_NV 0x86E5 -#define GL_PASS_THROUGH_NV 0x86E6 -#define GL_CULL_FRAGMENT_NV 0x86E7 -#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 -#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 -#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA -#define GL_DOT_PRODUCT_NV 0x86EC -#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED -#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE -#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 -#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 -#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 -#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 -#define GL_HILO_NV 0x86F4 -#define GL_DSDT_NV 0x86F5 -#define GL_DSDT_MAG_NV 0x86F6 -#define GL_DSDT_MAG_VIB_NV 0x86F7 -#define GL_HILO16_NV 0x86F8 -#define GL_SIGNED_HILO_NV 0x86F9 -#define GL_SIGNED_HILO16_NV 0x86FA -#define GL_SIGNED_RGBA_NV 0x86FB -#define GL_SIGNED_RGBA8_NV 0x86FC -#define GL_SIGNED_RGB_NV 0x86FE -#define GL_SIGNED_RGB8_NV 0x86FF -#define GL_SIGNED_LUMINANCE_NV 0x8701 -#define GL_SIGNED_LUMINANCE8_NV 0x8702 -#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 -#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 -#define GL_SIGNED_ALPHA_NV 0x8705 -#define GL_SIGNED_ALPHA8_NV 0x8706 -#define GL_SIGNED_INTENSITY_NV 0x8707 -#define GL_SIGNED_INTENSITY8_NV 0x8708 -#define GL_DSDT8_NV 0x8709 -#define GL_DSDT8_MAG8_NV 0x870A -#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B -#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C -#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D -#define GL_HI_SCALE_NV 0x870E -#define GL_LO_SCALE_NV 0x870F -#define GL_DS_SCALE_NV 0x8710 -#define GL_DT_SCALE_NV 0x8711 -#define GL_MAGNITUDE_SCALE_NV 0x8712 -#define GL_VIBRANCE_SCALE_NV 0x8713 -#define GL_HI_BIAS_NV 0x8714 -#define GL_LO_BIAS_NV 0x8715 -#define GL_DS_BIAS_NV 0x8716 -#define GL_DT_BIAS_NV 0x8717 -#define GL_MAGNITUDE_BIAS_NV 0x8718 -#define GL_VIBRANCE_BIAS_NV 0x8719 -#define GL_TEXTURE_BORDER_VALUES_NV 0x871A -#define GL_TEXTURE_HI_SIZE_NV 0x871B -#define GL_TEXTURE_LO_SIZE_NV 0x871C -#define GL_TEXTURE_DS_SIZE_NV 0x871D -#define GL_TEXTURE_DT_SIZE_NV 0x871E -#define GL_TEXTURE_MAG_SIZE_NV 0x871F - -#define GLEW_NV_texture_shader GLEW_GET_VAR(__GLEW_NV_texture_shader) - -#endif /* GL_NV_texture_shader */ - -/* ------------------------- GL_NV_texture_shader2 ------------------------- */ - -#ifndef GL_NV_texture_shader2 -#define GL_NV_texture_shader2 1 - -#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA -#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB -#define GL_DSDT_MAG_INTENSITY_NV 0x86DC -#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF -#define GL_HILO_NV 0x86F4 -#define GL_DSDT_NV 0x86F5 -#define GL_DSDT_MAG_NV 0x86F6 -#define GL_DSDT_MAG_VIB_NV 0x86F7 -#define GL_HILO16_NV 0x86F8 -#define GL_SIGNED_HILO_NV 0x86F9 -#define GL_SIGNED_HILO16_NV 0x86FA -#define GL_SIGNED_RGBA_NV 0x86FB -#define GL_SIGNED_RGBA8_NV 0x86FC -#define GL_SIGNED_RGB_NV 0x86FE -#define GL_SIGNED_RGB8_NV 0x86FF -#define GL_SIGNED_LUMINANCE_NV 0x8701 -#define GL_SIGNED_LUMINANCE8_NV 0x8702 -#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 -#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 -#define GL_SIGNED_ALPHA_NV 0x8705 -#define GL_SIGNED_ALPHA8_NV 0x8706 -#define GL_SIGNED_INTENSITY_NV 0x8707 -#define GL_SIGNED_INTENSITY8_NV 0x8708 -#define GL_DSDT8_NV 0x8709 -#define GL_DSDT8_MAG8_NV 0x870A -#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B -#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C -#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D - -#define GLEW_NV_texture_shader2 GLEW_GET_VAR(__GLEW_NV_texture_shader2) - -#endif /* GL_NV_texture_shader2 */ - -/* ------------------------- GL_NV_texture_shader3 ------------------------- */ - -#ifndef GL_NV_texture_shader3 -#define GL_NV_texture_shader3 1 - -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 -#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 -#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 -#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 -#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 -#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A -#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B -#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C -#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D -#define GL_HILO8_NV 0x885E -#define GL_SIGNED_HILO8_NV 0x885F -#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 - -#define GLEW_NV_texture_shader3 GLEW_GET_VAR(__GLEW_NV_texture_shader3) - -#endif /* GL_NV_texture_shader3 */ - -/* ------------------------ GL_NV_transform_feedback ----------------------- */ - -#ifndef GL_NV_transform_feedback -#define GL_NV_transform_feedback 1 - -#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 -#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 -#define GL_TEXTURE_COORD_NV 0x8C79 -#define GL_CLIP_DISTANCE_NV 0x8C7A -#define GL_VERTEX_ID_NV 0x8C7B -#define GL_PRIMITIVE_ID_NV 0x8C7C -#define GL_GENERIC_ATTRIB_NV 0x8C7D -#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 -#define GL_ACTIVE_VARYINGS_NV 0x8C81 -#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 -#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 -#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 -#define GL_PRIMITIVES_GENERATED_NV 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 -#define GL_RASTERIZER_DISCARD_NV 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B -#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C -#define GL_SEPARATE_ATTRIBS_NV 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F - -typedef void (GLAPIENTRY * PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); -typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); -typedef void (GLAPIENTRY * PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); -typedef GLint (GLAPIENTRY * PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); -typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode); -typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); - -#define glActiveVaryingNV GLEW_GET_FUN(__glewActiveVaryingNV) -#define glBeginTransformFeedbackNV GLEW_GET_FUN(__glewBeginTransformFeedbackNV) -#define glBindBufferBaseNV GLEW_GET_FUN(__glewBindBufferBaseNV) -#define glBindBufferOffsetNV GLEW_GET_FUN(__glewBindBufferOffsetNV) -#define glBindBufferRangeNV GLEW_GET_FUN(__glewBindBufferRangeNV) -#define glEndTransformFeedbackNV GLEW_GET_FUN(__glewEndTransformFeedbackNV) -#define glGetActiveVaryingNV GLEW_GET_FUN(__glewGetActiveVaryingNV) -#define glGetTransformFeedbackVaryingNV GLEW_GET_FUN(__glewGetTransformFeedbackVaryingNV) -#define glGetVaryingLocationNV GLEW_GET_FUN(__glewGetVaryingLocationNV) -#define glTransformFeedbackAttribsNV GLEW_GET_FUN(__glewTransformFeedbackAttribsNV) -#define glTransformFeedbackVaryingsNV GLEW_GET_FUN(__glewTransformFeedbackVaryingsNV) - -#define GLEW_NV_transform_feedback GLEW_GET_VAR(__GLEW_NV_transform_feedback) - -#endif /* GL_NV_transform_feedback */ - -/* ----------------------- GL_NV_transform_feedback2 ----------------------- */ - -#ifndef GL_NV_transform_feedback2 -#define GL_NV_transform_feedback2 1 - -#define GL_TRANSFORM_FEEDBACK_NV 0x8E22 -#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 -#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 -#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 - -typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); -typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint* ids); -typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void); -typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void); - -#define glBindTransformFeedbackNV GLEW_GET_FUN(__glewBindTransformFeedbackNV) -#define glDeleteTransformFeedbacksNV GLEW_GET_FUN(__glewDeleteTransformFeedbacksNV) -#define glDrawTransformFeedbackNV GLEW_GET_FUN(__glewDrawTransformFeedbackNV) -#define glGenTransformFeedbacksNV GLEW_GET_FUN(__glewGenTransformFeedbacksNV) -#define glIsTransformFeedbackNV GLEW_GET_FUN(__glewIsTransformFeedbackNV) -#define glPauseTransformFeedbackNV GLEW_GET_FUN(__glewPauseTransformFeedbackNV) -#define glResumeTransformFeedbackNV GLEW_GET_FUN(__glewResumeTransformFeedbackNV) - -#define GLEW_NV_transform_feedback2 GLEW_GET_VAR(__GLEW_NV_transform_feedback2) - -#endif /* GL_NV_transform_feedback2 */ - -/* ------------------ GL_NV_uniform_buffer_unified_memory ------------------ */ - -#ifndef GL_NV_uniform_buffer_unified_memory -#define GL_NV_uniform_buffer_unified_memory 1 - -#define GL_UNIFORM_BUFFER_UNIFIED_NV 0x936E -#define GL_UNIFORM_BUFFER_ADDRESS_NV 0x936F -#define GL_UNIFORM_BUFFER_LENGTH_NV 0x9370 - -#define GLEW_NV_uniform_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_uniform_buffer_unified_memory) - -#endif /* GL_NV_uniform_buffer_unified_memory */ - -/* -------------------------- GL_NV_vdpau_interop -------------------------- */ - -#ifndef GL_NV_vdpau_interop -#define GL_NV_vdpau_interop 1 - -#define GL_SURFACE_STATE_NV 0x86EB -#define GL_SURFACE_REGISTERED_NV 0x86FD -#define GL_SURFACE_MAPPED_NV 0x8700 -#define GL_WRITE_DISCARD_NV 0x88BE - -typedef GLintptr GLvdpauSurfaceNV; - -typedef void (GLAPIENTRY * PFNGLVDPAUFININVPROC) (void); -typedef void (GLAPIENTRY * PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei* length, GLint *values); -typedef void (GLAPIENTRY * PFNGLVDPAUINITNVPROC) (const void* vdpDevice, const void*getProcAddress); -typedef void (GLAPIENTRY * PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); -typedef void (GLAPIENTRY * PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV* surfaces); -typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); -typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); -typedef void (GLAPIENTRY * PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); -typedef void (GLAPIENTRY * PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV* surfaces); -typedef void (GLAPIENTRY * PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); - -#define glVDPAUFiniNV GLEW_GET_FUN(__glewVDPAUFiniNV) -#define glVDPAUGetSurfaceivNV GLEW_GET_FUN(__glewVDPAUGetSurfaceivNV) -#define glVDPAUInitNV GLEW_GET_FUN(__glewVDPAUInitNV) -#define glVDPAUIsSurfaceNV GLEW_GET_FUN(__glewVDPAUIsSurfaceNV) -#define glVDPAUMapSurfacesNV GLEW_GET_FUN(__glewVDPAUMapSurfacesNV) -#define glVDPAURegisterOutputSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterOutputSurfaceNV) -#define glVDPAURegisterVideoSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterVideoSurfaceNV) -#define glVDPAUSurfaceAccessNV GLEW_GET_FUN(__glewVDPAUSurfaceAccessNV) -#define glVDPAUUnmapSurfacesNV GLEW_GET_FUN(__glewVDPAUUnmapSurfacesNV) -#define glVDPAUUnregisterSurfaceNV GLEW_GET_FUN(__glewVDPAUUnregisterSurfaceNV) - -#define GLEW_NV_vdpau_interop GLEW_GET_VAR(__GLEW_NV_vdpau_interop) - -#endif /* GL_NV_vdpau_interop */ - -/* -------------------------- GL_NV_vdpau_interop2 ------------------------- */ - -#ifndef GL_NV_vdpau_interop2 -#define GL_NV_vdpau_interop2 1 - -typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTERVIDEOSURFACEWITHPICTURESTRUCTURENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames, GLboolean isFrameStructure); - -#define glVDPAURegisterVideoSurfaceWithPictureStructureNV GLEW_GET_FUN(__glewVDPAURegisterVideoSurfaceWithPictureStructureNV) - -#define GLEW_NV_vdpau_interop2 GLEW_GET_VAR(__GLEW_NV_vdpau_interop2) - -#endif /* GL_NV_vdpau_interop2 */ - -/* ------------------------ GL_NV_vertex_array_range ----------------------- */ - -#ifndef GL_NV_vertex_array_range -#define GL_NV_vertex_array_range 1 - -#define GL_VERTEX_ARRAY_RANGE_NV 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E -#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F -#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 -#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 - -typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, void *pointer); - -#define glFlushVertexArrayRangeNV GLEW_GET_FUN(__glewFlushVertexArrayRangeNV) -#define glVertexArrayRangeNV GLEW_GET_FUN(__glewVertexArrayRangeNV) - -#define GLEW_NV_vertex_array_range GLEW_GET_VAR(__GLEW_NV_vertex_array_range) - -#endif /* GL_NV_vertex_array_range */ - -/* ----------------------- GL_NV_vertex_array_range2 ----------------------- */ - -#ifndef GL_NV_vertex_array_range2 -#define GL_NV_vertex_array_range2 1 - -#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 - -#define GLEW_NV_vertex_array_range2 GLEW_GET_VAR(__GLEW_NV_vertex_array_range2) - -#endif /* GL_NV_vertex_array_range2 */ - -/* ------------------- GL_NV_vertex_attrib_integer_64bit ------------------- */ - -#ifndef GL_NV_vertex_attrib_integer_64bit -#define GL_NV_vertex_attrib_integer_64bit 1 - -#define GL_INT64_NV 0x140E -#define GL_UNSIGNED_INT64_NV 0x140F - -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT* params); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); - -#define glGetVertexAttribLi64vNV GLEW_GET_FUN(__glewGetVertexAttribLi64vNV) -#define glGetVertexAttribLui64vNV GLEW_GET_FUN(__glewGetVertexAttribLui64vNV) -#define glVertexAttribL1i64NV GLEW_GET_FUN(__glewVertexAttribL1i64NV) -#define glVertexAttribL1i64vNV GLEW_GET_FUN(__glewVertexAttribL1i64vNV) -#define glVertexAttribL1ui64NV GLEW_GET_FUN(__glewVertexAttribL1ui64NV) -#define glVertexAttribL1ui64vNV GLEW_GET_FUN(__glewVertexAttribL1ui64vNV) -#define glVertexAttribL2i64NV GLEW_GET_FUN(__glewVertexAttribL2i64NV) -#define glVertexAttribL2i64vNV GLEW_GET_FUN(__glewVertexAttribL2i64vNV) -#define glVertexAttribL2ui64NV GLEW_GET_FUN(__glewVertexAttribL2ui64NV) -#define glVertexAttribL2ui64vNV GLEW_GET_FUN(__glewVertexAttribL2ui64vNV) -#define glVertexAttribL3i64NV GLEW_GET_FUN(__glewVertexAttribL3i64NV) -#define glVertexAttribL3i64vNV GLEW_GET_FUN(__glewVertexAttribL3i64vNV) -#define glVertexAttribL3ui64NV GLEW_GET_FUN(__glewVertexAttribL3ui64NV) -#define glVertexAttribL3ui64vNV GLEW_GET_FUN(__glewVertexAttribL3ui64vNV) -#define glVertexAttribL4i64NV GLEW_GET_FUN(__glewVertexAttribL4i64NV) -#define glVertexAttribL4i64vNV GLEW_GET_FUN(__glewVertexAttribL4i64vNV) -#define glVertexAttribL4ui64NV GLEW_GET_FUN(__glewVertexAttribL4ui64NV) -#define glVertexAttribL4ui64vNV GLEW_GET_FUN(__glewVertexAttribL4ui64vNV) -#define glVertexAttribLFormatNV GLEW_GET_FUN(__glewVertexAttribLFormatNV) - -#define GLEW_NV_vertex_attrib_integer_64bit GLEW_GET_VAR(__GLEW_NV_vertex_attrib_integer_64bit) - -#endif /* GL_NV_vertex_attrib_integer_64bit */ - -/* ------------------- GL_NV_vertex_buffer_unified_memory ------------------ */ - -#ifndef GL_NV_vertex_buffer_unified_memory -#define GL_NV_vertex_buffer_unified_memory 1 - -#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E -#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F -#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 -#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 -#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 -#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 -#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 -#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 -#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 -#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 -#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 -#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 -#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A -#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B -#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C -#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D -#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E -#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F -#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 -#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 -#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 -#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 -#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 -#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 -#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 - -typedef void (GLAPIENTRY * PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); -typedef void (GLAPIENTRY * PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); -typedef void (GLAPIENTRY * PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT result[]); -typedef void (GLAPIENTRY * PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); - -#define glBufferAddressRangeNV GLEW_GET_FUN(__glewBufferAddressRangeNV) -#define glColorFormatNV GLEW_GET_FUN(__glewColorFormatNV) -#define glEdgeFlagFormatNV GLEW_GET_FUN(__glewEdgeFlagFormatNV) -#define glFogCoordFormatNV GLEW_GET_FUN(__glewFogCoordFormatNV) -#define glGetIntegerui64i_vNV GLEW_GET_FUN(__glewGetIntegerui64i_vNV) -#define glIndexFormatNV GLEW_GET_FUN(__glewIndexFormatNV) -#define glNormalFormatNV GLEW_GET_FUN(__glewNormalFormatNV) -#define glSecondaryColorFormatNV GLEW_GET_FUN(__glewSecondaryColorFormatNV) -#define glTexCoordFormatNV GLEW_GET_FUN(__glewTexCoordFormatNV) -#define glVertexAttribFormatNV GLEW_GET_FUN(__glewVertexAttribFormatNV) -#define glVertexAttribIFormatNV GLEW_GET_FUN(__glewVertexAttribIFormatNV) -#define glVertexFormatNV GLEW_GET_FUN(__glewVertexFormatNV) - -#define GLEW_NV_vertex_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_vertex_buffer_unified_memory) - -#endif /* GL_NV_vertex_buffer_unified_memory */ - -/* -------------------------- GL_NV_vertex_program ------------------------- */ - -#ifndef GL_NV_vertex_program -#define GL_NV_vertex_program 1 - -#define GL_VERTEX_PROGRAM_NV 0x8620 -#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 -#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 -#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 -#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 -#define GL_CURRENT_ATTRIB_NV 0x8626 -#define GL_PROGRAM_LENGTH_NV 0x8627 -#define GL_PROGRAM_STRING_NV 0x8628 -#define GL_MODELVIEW_PROJECTION_NV 0x8629 -#define GL_IDENTITY_NV 0x862A -#define GL_INVERSE_NV 0x862B -#define GL_TRANSPOSE_NV 0x862C -#define GL_INVERSE_TRANSPOSE_NV 0x862D -#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E -#define GL_MAX_TRACK_MATRICES_NV 0x862F -#define GL_MATRIX0_NV 0x8630 -#define GL_MATRIX1_NV 0x8631 -#define GL_MATRIX2_NV 0x8632 -#define GL_MATRIX3_NV 0x8633 -#define GL_MATRIX4_NV 0x8634 -#define GL_MATRIX5_NV 0x8635 -#define GL_MATRIX6_NV 0x8636 -#define GL_MATRIX7_NV 0x8637 -#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 -#define GL_CURRENT_MATRIX_NV 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 -#define GL_PROGRAM_PARAMETER_NV 0x8644 -#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 -#define GL_PROGRAM_TARGET_NV 0x8646 -#define GL_PROGRAM_RESIDENT_NV 0x8647 -#define GL_TRACK_MATRIX_NV 0x8648 -#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 -#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A -#define GL_PROGRAM_ERROR_POSITION_NV 0x864B -#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 -#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 -#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 -#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 -#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 -#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 -#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 -#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 -#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 -#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 -#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A -#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B -#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C -#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D -#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E -#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F -#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 -#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 -#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 -#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 -#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 -#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 -#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 -#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 -#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 -#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 -#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A -#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B -#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C -#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D -#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E -#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F -#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 -#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 -#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 -#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 -#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 -#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 -#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 -#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 -#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 -#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 -#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A -#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B -#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C -#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D -#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E -#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F - -typedef GLboolean (GLAPIENTRY * PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint* ids, GLboolean *residences); -typedef void (GLAPIENTRY * PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte* program); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, void** pointer); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMNVPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte* program); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei n, const GLubyte* v); - -#define glAreProgramsResidentNV GLEW_GET_FUN(__glewAreProgramsResidentNV) -#define glBindProgramNV GLEW_GET_FUN(__glewBindProgramNV) -#define glDeleteProgramsNV GLEW_GET_FUN(__glewDeleteProgramsNV) -#define glExecuteProgramNV GLEW_GET_FUN(__glewExecuteProgramNV) -#define glGenProgramsNV GLEW_GET_FUN(__glewGenProgramsNV) -#define glGetProgramParameterdvNV GLEW_GET_FUN(__glewGetProgramParameterdvNV) -#define glGetProgramParameterfvNV GLEW_GET_FUN(__glewGetProgramParameterfvNV) -#define glGetProgramStringNV GLEW_GET_FUN(__glewGetProgramStringNV) -#define glGetProgramivNV GLEW_GET_FUN(__glewGetProgramivNV) -#define glGetTrackMatrixivNV GLEW_GET_FUN(__glewGetTrackMatrixivNV) -#define glGetVertexAttribPointervNV GLEW_GET_FUN(__glewGetVertexAttribPointervNV) -#define glGetVertexAttribdvNV GLEW_GET_FUN(__glewGetVertexAttribdvNV) -#define glGetVertexAttribfvNV GLEW_GET_FUN(__glewGetVertexAttribfvNV) -#define glGetVertexAttribivNV GLEW_GET_FUN(__glewGetVertexAttribivNV) -#define glIsProgramNV GLEW_GET_FUN(__glewIsProgramNV) -#define glLoadProgramNV GLEW_GET_FUN(__glewLoadProgramNV) -#define glProgramParameter4dNV GLEW_GET_FUN(__glewProgramParameter4dNV) -#define glProgramParameter4dvNV GLEW_GET_FUN(__glewProgramParameter4dvNV) -#define glProgramParameter4fNV GLEW_GET_FUN(__glewProgramParameter4fNV) -#define glProgramParameter4fvNV GLEW_GET_FUN(__glewProgramParameter4fvNV) -#define glProgramParameters4dvNV GLEW_GET_FUN(__glewProgramParameters4dvNV) -#define glProgramParameters4fvNV GLEW_GET_FUN(__glewProgramParameters4fvNV) -#define glRequestResidentProgramsNV GLEW_GET_FUN(__glewRequestResidentProgramsNV) -#define glTrackMatrixNV GLEW_GET_FUN(__glewTrackMatrixNV) -#define glVertexAttrib1dNV GLEW_GET_FUN(__glewVertexAttrib1dNV) -#define glVertexAttrib1dvNV GLEW_GET_FUN(__glewVertexAttrib1dvNV) -#define glVertexAttrib1fNV GLEW_GET_FUN(__glewVertexAttrib1fNV) -#define glVertexAttrib1fvNV GLEW_GET_FUN(__glewVertexAttrib1fvNV) -#define glVertexAttrib1sNV GLEW_GET_FUN(__glewVertexAttrib1sNV) -#define glVertexAttrib1svNV GLEW_GET_FUN(__glewVertexAttrib1svNV) -#define glVertexAttrib2dNV GLEW_GET_FUN(__glewVertexAttrib2dNV) -#define glVertexAttrib2dvNV GLEW_GET_FUN(__glewVertexAttrib2dvNV) -#define glVertexAttrib2fNV GLEW_GET_FUN(__glewVertexAttrib2fNV) -#define glVertexAttrib2fvNV GLEW_GET_FUN(__glewVertexAttrib2fvNV) -#define glVertexAttrib2sNV GLEW_GET_FUN(__glewVertexAttrib2sNV) -#define glVertexAttrib2svNV GLEW_GET_FUN(__glewVertexAttrib2svNV) -#define glVertexAttrib3dNV GLEW_GET_FUN(__glewVertexAttrib3dNV) -#define glVertexAttrib3dvNV GLEW_GET_FUN(__glewVertexAttrib3dvNV) -#define glVertexAttrib3fNV GLEW_GET_FUN(__glewVertexAttrib3fNV) -#define glVertexAttrib3fvNV GLEW_GET_FUN(__glewVertexAttrib3fvNV) -#define glVertexAttrib3sNV GLEW_GET_FUN(__glewVertexAttrib3sNV) -#define glVertexAttrib3svNV GLEW_GET_FUN(__glewVertexAttrib3svNV) -#define glVertexAttrib4dNV GLEW_GET_FUN(__glewVertexAttrib4dNV) -#define glVertexAttrib4dvNV GLEW_GET_FUN(__glewVertexAttrib4dvNV) -#define glVertexAttrib4fNV GLEW_GET_FUN(__glewVertexAttrib4fNV) -#define glVertexAttrib4fvNV GLEW_GET_FUN(__glewVertexAttrib4fvNV) -#define glVertexAttrib4sNV GLEW_GET_FUN(__glewVertexAttrib4sNV) -#define glVertexAttrib4svNV GLEW_GET_FUN(__glewVertexAttrib4svNV) -#define glVertexAttrib4ubNV GLEW_GET_FUN(__glewVertexAttrib4ubNV) -#define glVertexAttrib4ubvNV GLEW_GET_FUN(__glewVertexAttrib4ubvNV) -#define glVertexAttribPointerNV GLEW_GET_FUN(__glewVertexAttribPointerNV) -#define glVertexAttribs1dvNV GLEW_GET_FUN(__glewVertexAttribs1dvNV) -#define glVertexAttribs1fvNV GLEW_GET_FUN(__glewVertexAttribs1fvNV) -#define glVertexAttribs1svNV GLEW_GET_FUN(__glewVertexAttribs1svNV) -#define glVertexAttribs2dvNV GLEW_GET_FUN(__glewVertexAttribs2dvNV) -#define glVertexAttribs2fvNV GLEW_GET_FUN(__glewVertexAttribs2fvNV) -#define glVertexAttribs2svNV GLEW_GET_FUN(__glewVertexAttribs2svNV) -#define glVertexAttribs3dvNV GLEW_GET_FUN(__glewVertexAttribs3dvNV) -#define glVertexAttribs3fvNV GLEW_GET_FUN(__glewVertexAttribs3fvNV) -#define glVertexAttribs3svNV GLEW_GET_FUN(__glewVertexAttribs3svNV) -#define glVertexAttribs4dvNV GLEW_GET_FUN(__glewVertexAttribs4dvNV) -#define glVertexAttribs4fvNV GLEW_GET_FUN(__glewVertexAttribs4fvNV) -#define glVertexAttribs4svNV GLEW_GET_FUN(__glewVertexAttribs4svNV) -#define glVertexAttribs4ubvNV GLEW_GET_FUN(__glewVertexAttribs4ubvNV) - -#define GLEW_NV_vertex_program GLEW_GET_VAR(__GLEW_NV_vertex_program) - -#endif /* GL_NV_vertex_program */ - -/* ------------------------ GL_NV_vertex_program1_1 ------------------------ */ - -#ifndef GL_NV_vertex_program1_1 -#define GL_NV_vertex_program1_1 1 - -#define GLEW_NV_vertex_program1_1 GLEW_GET_VAR(__GLEW_NV_vertex_program1_1) - -#endif /* GL_NV_vertex_program1_1 */ - -/* ------------------------- GL_NV_vertex_program2 ------------------------- */ - -#ifndef GL_NV_vertex_program2 -#define GL_NV_vertex_program2 1 - -#define GLEW_NV_vertex_program2 GLEW_GET_VAR(__GLEW_NV_vertex_program2) - -#endif /* GL_NV_vertex_program2 */ - -/* ---------------------- GL_NV_vertex_program2_option --------------------- */ - -#ifndef GL_NV_vertex_program2_option -#define GL_NV_vertex_program2_option 1 - -#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 -#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 - -#define GLEW_NV_vertex_program2_option GLEW_GET_VAR(__GLEW_NV_vertex_program2_option) - -#endif /* GL_NV_vertex_program2_option */ - -/* ------------------------- GL_NV_vertex_program3 ------------------------- */ - -#ifndef GL_NV_vertex_program3 -#define GL_NV_vertex_program3 1 - -#define MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C - -#define GLEW_NV_vertex_program3 GLEW_GET_VAR(__GLEW_NV_vertex_program3) - -#endif /* GL_NV_vertex_program3 */ - -/* ------------------------- GL_NV_vertex_program4 ------------------------- */ - -#ifndef GL_NV_vertex_program4 -#define GL_NV_vertex_program4 1 - -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD - -#define GLEW_NV_vertex_program4 GLEW_GET_VAR(__GLEW_NV_vertex_program4) - -#endif /* GL_NV_vertex_program4 */ - -/* -------------------------- GL_NV_video_capture -------------------------- */ - -#ifndef GL_NV_video_capture -#define GL_NV_video_capture 1 - -#define GL_VIDEO_BUFFER_NV 0x9020 -#define GL_VIDEO_BUFFER_BINDING_NV 0x9021 -#define GL_FIELD_UPPER_NV 0x9022 -#define GL_FIELD_LOWER_NV 0x9023 -#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 -#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 -#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 -#define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 -#define GL_VIDEO_BUFFER_PITCH_NV 0x9028 -#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 -#define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A -#define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B -#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C -#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D -#define GL_PARTIAL_SUCCESS_NV 0x902E -#define GL_SUCCESS_NV 0x902F -#define GL_FAILURE_NV 0x9030 -#define GL_YCBYCR8_422_NV 0x9031 -#define GL_YCBAYCR8A_4224_NV 0x9032 -#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 -#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 -#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 -#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 -#define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 -#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 -#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 -#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A -#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B -#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C - -typedef void (GLAPIENTRY * PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot); -typedef void (GLAPIENTRY * PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); -typedef void (GLAPIENTRY * PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); -typedef void (GLAPIENTRY * PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot); -typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint* params); -typedef GLenum (GLAPIENTRY * PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint* sequence_num, GLuint64EXT *capture_time); -typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint* params); - -#define glBeginVideoCaptureNV GLEW_GET_FUN(__glewBeginVideoCaptureNV) -#define glBindVideoCaptureStreamBufferNV GLEW_GET_FUN(__glewBindVideoCaptureStreamBufferNV) -#define glBindVideoCaptureStreamTextureNV GLEW_GET_FUN(__glewBindVideoCaptureStreamTextureNV) -#define glEndVideoCaptureNV GLEW_GET_FUN(__glewEndVideoCaptureNV) -#define glGetVideoCaptureStreamdvNV GLEW_GET_FUN(__glewGetVideoCaptureStreamdvNV) -#define glGetVideoCaptureStreamfvNV GLEW_GET_FUN(__glewGetVideoCaptureStreamfvNV) -#define glGetVideoCaptureStreamivNV GLEW_GET_FUN(__glewGetVideoCaptureStreamivNV) -#define glGetVideoCaptureivNV GLEW_GET_FUN(__glewGetVideoCaptureivNV) -#define glVideoCaptureNV GLEW_GET_FUN(__glewVideoCaptureNV) -#define glVideoCaptureStreamParameterdvNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterdvNV) -#define glVideoCaptureStreamParameterfvNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterfvNV) -#define glVideoCaptureStreamParameterivNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterivNV) - -#define GLEW_NV_video_capture GLEW_GET_VAR(__GLEW_NV_video_capture) - -#endif /* GL_NV_video_capture */ - -/* -------------------------- GL_NV_viewport_array ------------------------- */ - -#ifndef GL_NV_viewport_array -#define GL_NV_viewport_array 1 - -#define GL_DEPTH_RANGE 0x0B70 -#define GL_VIEWPORT 0x0BA2 -#define GL_SCISSOR_BOX 0x0C10 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_MAX_VIEWPORTS_NV 0x825B -#define GL_VIEWPORT_SUBPIXEL_BITS_NV 0x825C -#define GL_VIEWPORT_BOUNDS_RANGE_NV 0x825D -#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX_NV 0x825F - -typedef void (GLAPIENTRY * PFNGLDEPTHRANGEARRAYFVNVPROC) (GLuint first, GLsizei count, const GLfloat * v); -typedef void (GLAPIENTRY * PFNGLDEPTHRANGEINDEXEDFNVPROC) (GLuint index, GLfloat n, GLfloat f); -typedef void (GLAPIENTRY * PFNGLDISABLEINVPROC) (GLenum target, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEINVPROC) (GLenum target, GLuint index); -typedef void (GLAPIENTRY * PFNGLGETFLOATI_VNVPROC) (GLenum target, GLuint index, GLfloat* data); -typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINVPROC) (GLenum target, GLuint index); -typedef void (GLAPIENTRY * PFNGLSCISSORARRAYVNVPROC) (GLuint first, GLsizei count, const GLint * v); -typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDNVPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDVNVPROC) (GLuint index, const GLint * v); -typedef void (GLAPIENTRY * PFNGLVIEWPORTARRAYVNVPROC) (GLuint first, GLsizei count, const GLfloat * v); -typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); -typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFVNVPROC) (GLuint index, const GLfloat * v); - -#define glDepthRangeArrayfvNV GLEW_GET_FUN(__glewDepthRangeArrayfvNV) -#define glDepthRangeIndexedfNV GLEW_GET_FUN(__glewDepthRangeIndexedfNV) -#define glDisableiNV GLEW_GET_FUN(__glewDisableiNV) -#define glEnableiNV GLEW_GET_FUN(__glewEnableiNV) -#define glGetFloati_vNV GLEW_GET_FUN(__glewGetFloati_vNV) -#define glIsEnablediNV GLEW_GET_FUN(__glewIsEnablediNV) -#define glScissorArrayvNV GLEW_GET_FUN(__glewScissorArrayvNV) -#define glScissorIndexedNV GLEW_GET_FUN(__glewScissorIndexedNV) -#define glScissorIndexedvNV GLEW_GET_FUN(__glewScissorIndexedvNV) -#define glViewportArrayvNV GLEW_GET_FUN(__glewViewportArrayvNV) -#define glViewportIndexedfNV GLEW_GET_FUN(__glewViewportIndexedfNV) -#define glViewportIndexedfvNV GLEW_GET_FUN(__glewViewportIndexedfvNV) - -#define GLEW_NV_viewport_array GLEW_GET_VAR(__GLEW_NV_viewport_array) - -#endif /* GL_NV_viewport_array */ - -/* ------------------------- GL_NV_viewport_array2 ------------------------- */ - -#ifndef GL_NV_viewport_array2 -#define GL_NV_viewport_array2 1 - -#define GLEW_NV_viewport_array2 GLEW_GET_VAR(__GLEW_NV_viewport_array2) - -#endif /* GL_NV_viewport_array2 */ - -/* ------------------------- GL_NV_viewport_swizzle ------------------------ */ - -#ifndef GL_NV_viewport_swizzle -#define GL_NV_viewport_swizzle 1 - -#define GL_VIEWPORT_SWIZZLE_POSITIVE_X_NV 0x9350 -#define GL_VIEWPORT_SWIZZLE_NEGATIVE_X_NV 0x9351 -#define GL_VIEWPORT_SWIZZLE_POSITIVE_Y_NV 0x9352 -#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Y_NV 0x9353 -#define GL_VIEWPORT_SWIZZLE_POSITIVE_Z_NV 0x9354 -#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Z_NV 0x9355 -#define GL_VIEWPORT_SWIZZLE_POSITIVE_W_NV 0x9356 -#define GL_VIEWPORT_SWIZZLE_NEGATIVE_W_NV 0x9357 -#define GL_VIEWPORT_SWIZZLE_X_NV 0x9358 -#define GL_VIEWPORT_SWIZZLE_Y_NV 0x9359 -#define GL_VIEWPORT_SWIZZLE_Z_NV 0x935A -#define GL_VIEWPORT_SWIZZLE_W_NV 0x935B - -typedef void (GLAPIENTRY * PFNGLVIEWPORTSWIZZLENVPROC) (GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew); - -#define glViewportSwizzleNV GLEW_GET_FUN(__glewViewportSwizzleNV) - -#define GLEW_NV_viewport_swizzle GLEW_GET_VAR(__GLEW_NV_viewport_swizzle) - -#endif /* GL_NV_viewport_swizzle */ - -/* ---------------------------- GL_OES_EGL_image --------------------------- */ - -#ifndef GL_OES_EGL_image -#define GL_OES_EGL_image 1 - -typedef void (GLAPIENTRY * PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image); -typedef void (GLAPIENTRY * PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image); - -#define glEGLImageTargetRenderbufferStorageOES GLEW_GET_FUN(__glewEGLImageTargetRenderbufferStorageOES) -#define glEGLImageTargetTexture2DOES GLEW_GET_FUN(__glewEGLImageTargetTexture2DOES) - -#define GLEW_OES_EGL_image GLEW_GET_VAR(__GLEW_OES_EGL_image) - -#endif /* GL_OES_EGL_image */ - -/* ----------------------- GL_OES_EGL_image_external ----------------------- */ - -#ifndef GL_OES_EGL_image_external -#define GL_OES_EGL_image_external 1 - -#define GL_TEXTURE_EXTERNAL_OES 0x8D65 -#define GL_SAMPLER_EXTERNAL_OES 0x8D66 -#define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 -#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68 - -#define GLEW_OES_EGL_image_external GLEW_GET_VAR(__GLEW_OES_EGL_image_external) - -#endif /* GL_OES_EGL_image_external */ - -/* -------------------- GL_OES_EGL_image_external_essl3 -------------------- */ - -#ifndef GL_OES_EGL_image_external_essl3 -#define GL_OES_EGL_image_external_essl3 1 - -#define GLEW_OES_EGL_image_external_essl3 GLEW_GET_VAR(__GLEW_OES_EGL_image_external_essl3) - -#endif /* GL_OES_EGL_image_external_essl3 */ - -/* --------------------- GL_OES_blend_equation_separate -------------------- */ - -#ifndef GL_OES_blend_equation_separate -#define GL_OES_blend_equation_separate 1 - -#define GL_BLEND_EQUATION_RGB_OES 0x8009 -#define GL_BLEND_EQUATION_ALPHA_OES 0x883D - -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEOESPROC) (GLenum modeRGB, GLenum modeAlpha); - -#define glBlendEquationSeparateOES GLEW_GET_FUN(__glewBlendEquationSeparateOES) - -#define GLEW_OES_blend_equation_separate GLEW_GET_VAR(__GLEW_OES_blend_equation_separate) - -#endif /* GL_OES_blend_equation_separate */ - -/* ----------------------- GL_OES_blend_func_separate ---------------------- */ - -#ifndef GL_OES_blend_func_separate -#define GL_OES_blend_func_separate 1 - -#define GL_BLEND_DST_RGB_OES 0x80C8 -#define GL_BLEND_SRC_RGB_OES 0x80C9 -#define GL_BLEND_DST_ALPHA_OES 0x80CA -#define GL_BLEND_SRC_ALPHA_OES 0x80CB - -typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEOESPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); - -#define glBlendFuncSeparateOES GLEW_GET_FUN(__glewBlendFuncSeparateOES) - -#define GLEW_OES_blend_func_separate GLEW_GET_VAR(__GLEW_OES_blend_func_separate) - -#endif /* GL_OES_blend_func_separate */ - -/* ------------------------- GL_OES_blend_subtract ------------------------- */ - -#ifndef GL_OES_blend_subtract -#define GL_OES_blend_subtract 1 - -#define GL_FUNC_ADD_OES 0x8006 -#define GL_BLEND_EQUATION_OES 0x8009 -#define GL_FUNC_SUBTRACT_OES 0x800A -#define GL_FUNC_REVERSE_SUBTRACT_OES 0x800B - -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONOESPROC) (GLenum mode); - -#define glBlendEquationOES GLEW_GET_FUN(__glewBlendEquationOES) - -#define GLEW_OES_blend_subtract GLEW_GET_VAR(__GLEW_OES_blend_subtract) - -#endif /* GL_OES_blend_subtract */ - -/* ------------------------ GL_OES_byte_coordinates ------------------------ */ - -#ifndef GL_OES_byte_coordinates -#define GL_OES_byte_coordinates 1 - -#define GLEW_OES_byte_coordinates GLEW_GET_VAR(__GLEW_OES_byte_coordinates) - -#endif /* GL_OES_byte_coordinates */ - -/* ------------------ GL_OES_compressed_ETC1_RGB8_texture ------------------ */ - -#ifndef GL_OES_compressed_ETC1_RGB8_texture -#define GL_OES_compressed_ETC1_RGB8_texture 1 - -#define GL_ETC1_RGB8_OES 0x8D64 - -#define GLEW_OES_compressed_ETC1_RGB8_texture GLEW_GET_VAR(__GLEW_OES_compressed_ETC1_RGB8_texture) - -#endif /* GL_OES_compressed_ETC1_RGB8_texture */ - -/* ------------------- GL_OES_compressed_paletted_texture ------------------ */ - -#ifndef GL_OES_compressed_paletted_texture -#define GL_OES_compressed_paletted_texture 1 - -#define GL_PALETTE4_RGB8_OES 0x8B90 -#define GL_PALETTE4_RGBA8_OES 0x8B91 -#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 -#define GL_PALETTE4_RGBA4_OES 0x8B93 -#define GL_PALETTE4_RGB5_A1_OES 0x8B94 -#define GL_PALETTE8_RGB8_OES 0x8B95 -#define GL_PALETTE8_RGBA8_OES 0x8B96 -#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 -#define GL_PALETTE8_RGBA4_OES 0x8B98 -#define GL_PALETTE8_RGB5_A1_OES 0x8B99 - -#define GLEW_OES_compressed_paletted_texture GLEW_GET_VAR(__GLEW_OES_compressed_paletted_texture) - -#endif /* GL_OES_compressed_paletted_texture */ - -/* --------------------------- GL_OES_copy_image --------------------------- */ - -#ifndef GL_OES_copy_image -#define GL_OES_copy_image 1 - -typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATAOESPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); - -#define glCopyImageSubDataOES GLEW_GET_FUN(__glewCopyImageSubDataOES) - -#define GLEW_OES_copy_image GLEW_GET_VAR(__GLEW_OES_copy_image) - -#endif /* GL_OES_copy_image */ - -/* ----------------------------- GL_OES_depth24 ---------------------------- */ - -#ifndef GL_OES_depth24 -#define GL_OES_depth24 1 - -#define GL_DEPTH_COMPONENT24_OES 0x81A6 - -#define GLEW_OES_depth24 GLEW_GET_VAR(__GLEW_OES_depth24) - -#endif /* GL_OES_depth24 */ - -/* ----------------------------- GL_OES_depth32 ---------------------------- */ - -#ifndef GL_OES_depth32 -#define GL_OES_depth32 1 - -#define GL_DEPTH_COMPONENT32_OES 0x81A7 - -#define GLEW_OES_depth32 GLEW_GET_VAR(__GLEW_OES_depth32) - -#endif /* GL_OES_depth32 */ - -/* -------------------------- GL_OES_depth_texture ------------------------- */ - -#ifndef GL_OES_depth_texture -#define GL_OES_depth_texture 1 - -#define GL_UNSIGNED_SHORT 0x1403 -#define GL_UNSIGNED_INT 0x1405 -#define GL_DEPTH_COMPONENT 0x1902 - -#define GLEW_OES_depth_texture GLEW_GET_VAR(__GLEW_OES_depth_texture) - -#endif /* GL_OES_depth_texture */ - -/* --------------------- GL_OES_depth_texture_cube_map --------------------- */ - -#ifndef GL_OES_depth_texture_cube_map -#define GL_OES_depth_texture_cube_map 1 - -#define GL_UNSIGNED_SHORT 0x1403 -#define GL_UNSIGNED_INT 0x1405 -#define GL_DEPTH_COMPONENT 0x1902 -#define GL_DEPTH_STENCIL_OES 0x84F9 -#define GL_DEPTH24_STENCIL8_OES 0x88F0 - -#define GLEW_OES_depth_texture_cube_map GLEW_GET_VAR(__GLEW_OES_depth_texture_cube_map) - -#endif /* GL_OES_depth_texture_cube_map */ - -/* ---------------------- GL_OES_draw_buffers_indexed ---------------------- */ - -#ifndef GL_OES_draw_buffers_indexed -#define GL_OES_draw_buffers_indexed 1 - -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIOESPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIOESPROC) (GLuint buf, GLenum mode); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIOESPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCIOESPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (GLAPIENTRY * PFNGLCOLORMASKIOESPROC) (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef void (GLAPIENTRY * PFNGLDISABLEIOESPROC) (GLenum target, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEIOESPROC) (GLenum target, GLuint index); -typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDIOESPROC) (GLenum target, GLuint index); - -#define glBlendEquationSeparateiOES GLEW_GET_FUN(__glewBlendEquationSeparateiOES) -#define glBlendEquationiOES GLEW_GET_FUN(__glewBlendEquationiOES) -#define glBlendFuncSeparateiOES GLEW_GET_FUN(__glewBlendFuncSeparateiOES) -#define glBlendFunciOES GLEW_GET_FUN(__glewBlendFunciOES) -#define glColorMaskiOES GLEW_GET_FUN(__glewColorMaskiOES) -#define glDisableiOES GLEW_GET_FUN(__glewDisableiOES) -#define glEnableiOES GLEW_GET_FUN(__glewEnableiOES) -#define glIsEnablediOES GLEW_GET_FUN(__glewIsEnablediOES) - -#define GLEW_OES_draw_buffers_indexed GLEW_GET_VAR(__GLEW_OES_draw_buffers_indexed) - -#endif /* GL_OES_draw_buffers_indexed */ - -/* -------------------------- GL_OES_draw_texture -------------------------- */ - -#ifndef GL_OES_draw_texture -#define GL_OES_draw_texture 1 - -#define GL_TEXTURE_CROP_RECT_OES 0x8B9D - -#define GLEW_OES_draw_texture GLEW_GET_VAR(__GLEW_OES_draw_texture) - -#endif /* GL_OES_draw_texture */ - -/* ----------------------- GL_OES_element_index_uint ----------------------- */ - -#ifndef GL_OES_element_index_uint -#define GL_OES_element_index_uint 1 - -#define GL_UNSIGNED_INT 0x1405 - -#define GLEW_OES_element_index_uint GLEW_GET_VAR(__GLEW_OES_element_index_uint) - -#endif /* GL_OES_element_index_uint */ - -/* --------------------- GL_OES_extended_matrix_palette -------------------- */ - -#ifndef GL_OES_extended_matrix_palette -#define GL_OES_extended_matrix_palette 1 - -#define GLEW_OES_extended_matrix_palette GLEW_GET_VAR(__GLEW_OES_extended_matrix_palette) - -#endif /* GL_OES_extended_matrix_palette */ - -/* ------------------------ GL_OES_fbo_render_mipmap ----------------------- */ - -#ifndef GL_OES_fbo_render_mipmap -#define GL_OES_fbo_render_mipmap 1 - -#define GLEW_OES_fbo_render_mipmap GLEW_GET_VAR(__GLEW_OES_fbo_render_mipmap) - -#endif /* GL_OES_fbo_render_mipmap */ - -/* --------------------- GL_OES_fragment_precision_high -------------------- */ - -#ifndef GL_OES_fragment_precision_high -#define GL_OES_fragment_precision_high 1 - -#define GLEW_OES_fragment_precision_high GLEW_GET_VAR(__GLEW_OES_fragment_precision_high) - -#endif /* GL_OES_fragment_precision_high */ - -/* ----------------------- GL_OES_framebuffer_object ----------------------- */ - -#ifndef GL_OES_framebuffer_object -#define GL_OES_framebuffer_object 1 - -#define GL_NONE_OES 0 -#define GL_INVALID_FRAMEBUFFER_OPERATION_OES 0x0506 -#define GL_RGBA4_OES 0x8056 -#define GL_RGB5_A1_OES 0x8057 -#define GL_DEPTH_COMPONENT16_OES 0x81A5 -#define GL_MAX_RENDERBUFFER_SIZE_OES 0x84E8 -#define GL_FRAMEBUFFER_BINDING_OES 0x8CA6 -#define GL_RENDERBUFFER_BINDING_OES 0x8CA7 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE_OES 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES 0x8CD9 -#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES 0x8CDA -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_OES 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_OES 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED_OES 0x8CDD -#define GL_COLOR_ATTACHMENT0_OES 0x8CE0 -#define GL_DEPTH_ATTACHMENT_OES 0x8D00 -#define GL_STENCIL_ATTACHMENT_OES 0x8D20 -#define GL_FRAMEBUFFER_OES 0x8D40 -#define GL_RENDERBUFFER_OES 0x8D41 -#define GL_RENDERBUFFER_WIDTH_OES 0x8D42 -#define GL_RENDERBUFFER_HEIGHT_OES 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT_OES 0x8D44 -#define GL_STENCIL_INDEX1_OES 0x8D46 -#define GL_STENCIL_INDEX4_OES 0x8D47 -#define GL_STENCIL_INDEX8_OES 0x8D48 -#define GL_RENDERBUFFER_RED_SIZE_OES 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE_OES 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE_OES 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE_OES 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE_OES 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE_OES 0x8D55 -#define GL_RGB565_OES 0x8D62 - -typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFEROESPROC) (GLenum target, GLuint framebuffer); -typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFEROESPROC) (GLenum target, GLuint renderbuffer); -typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSOESPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSOESPROC) (GLsizei n, const GLuint* framebuffers); -typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSOESPROC) (GLsizei n, const GLuint* renderbuffers); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFEROESPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DOESPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSOESPROC) (GLsizei n, GLuint* framebuffers); -typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSOESPROC) (GLsizei n, GLuint* renderbuffers); -typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPOESPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVOESPROC) (GLenum target, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFEROESPROC) (GLuint framebuffer); -typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFEROESPROC) (GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); - -#define glBindFramebufferOES GLEW_GET_FUN(__glewBindFramebufferOES) -#define glBindRenderbufferOES GLEW_GET_FUN(__glewBindRenderbufferOES) -#define glCheckFramebufferStatusOES GLEW_GET_FUN(__glewCheckFramebufferStatusOES) -#define glDeleteFramebuffersOES GLEW_GET_FUN(__glewDeleteFramebuffersOES) -#define glDeleteRenderbuffersOES GLEW_GET_FUN(__glewDeleteRenderbuffersOES) -#define glFramebufferRenderbufferOES GLEW_GET_FUN(__glewFramebufferRenderbufferOES) -#define glFramebufferTexture2DOES GLEW_GET_FUN(__glewFramebufferTexture2DOES) -#define glGenFramebuffersOES GLEW_GET_FUN(__glewGenFramebuffersOES) -#define glGenRenderbuffersOES GLEW_GET_FUN(__glewGenRenderbuffersOES) -#define glGenerateMipmapOES GLEW_GET_FUN(__glewGenerateMipmapOES) -#define glGetFramebufferAttachmentParameterivOES GLEW_GET_FUN(__glewGetFramebufferAttachmentParameterivOES) -#define glGetRenderbufferParameterivOES GLEW_GET_FUN(__glewGetRenderbufferParameterivOES) -#define glIsFramebufferOES GLEW_GET_FUN(__glewIsFramebufferOES) -#define glIsRenderbufferOES GLEW_GET_FUN(__glewIsRenderbufferOES) -#define glRenderbufferStorageOES GLEW_GET_FUN(__glewRenderbufferStorageOES) - -#define GLEW_OES_framebuffer_object GLEW_GET_VAR(__GLEW_OES_framebuffer_object) - -#endif /* GL_OES_framebuffer_object */ - -/* ----------------------- GL_OES_geometry_point_size ---------------------- */ - -#ifndef GL_OES_geometry_point_size -#define GL_OES_geometry_point_size 1 - -#define GL_GEOMETRY_SHADER_BIT_OES 0x00000004 -#define GL_LINES_ADJACENCY_OES 0xA -#define GL_LINE_STRIP_ADJACENCY_OES 0xB -#define GL_TRIANGLES_ADJACENCY_OES 0xC -#define GL_TRIANGLE_STRIP_ADJACENCY_OES 0xD -#define GL_LAYER_PROVOKING_VERTEX_OES 0x825E -#define GL_UNDEFINED_VERTEX_OES 0x8260 -#define GL_GEOMETRY_SHADER_INVOCATIONS_OES 0x887F -#define GL_GEOMETRY_LINKED_VERTICES_OUT_OES 0x8916 -#define GL_GEOMETRY_LINKED_INPUT_TYPE_OES 0x8917 -#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_OES 0x8918 -#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_OES 0x8A2C -#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_OES 0x8A32 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_OES 0x8C29 -#define GL_PRIMITIVES_GENERATED_OES 0x8C87 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_OES 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_OES 0x8DA8 -#define GL_GEOMETRY_SHADER_OES 0x8DD9 -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_OES 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_OES 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_OES 0x8DE1 -#define GL_FIRST_VERTEX_CONVENTION_OES 0x8E4D -#define GL_LAST_VERTEX_CONVENTION_OES 0x8E4E -#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_OES 0x8E5A -#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_OES 0x90CD -#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_OES 0x90D7 -#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_OES 0x9123 -#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_OES 0x9124 -#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_OES 0x92CF -#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_OES 0x92D5 -#define GL_REFERENCED_BY_GEOMETRY_SHADER_OES 0x9309 -#define GL_FRAMEBUFFER_DEFAULT_LAYERS_OES 0x9312 -#define GL_MAX_FRAMEBUFFER_LAYERS_OES 0x9317 - -#define GLEW_OES_geometry_point_size GLEW_GET_VAR(__GLEW_OES_geometry_point_size) - -#endif /* GL_OES_geometry_point_size */ - -/* ------------------------- GL_OES_geometry_shader ------------------------ */ - -#ifndef GL_OES_geometry_shader -#define GL_OES_geometry_shader 1 - -#define GL_GEOMETRY_SHADER_BIT_OES 0x00000004 -#define GL_LINES_ADJACENCY_OES 0xA -#define GL_LINE_STRIP_ADJACENCY_OES 0xB -#define GL_TRIANGLES_ADJACENCY_OES 0xC -#define GL_TRIANGLE_STRIP_ADJACENCY_OES 0xD -#define GL_LAYER_PROVOKING_VERTEX_OES 0x825E -#define GL_UNDEFINED_VERTEX_OES 0x8260 -#define GL_GEOMETRY_SHADER_INVOCATIONS_OES 0x887F -#define GL_GEOMETRY_LINKED_VERTICES_OUT_OES 0x8916 -#define GL_GEOMETRY_LINKED_INPUT_TYPE_OES 0x8917 -#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_OES 0x8918 -#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_OES 0x8A2C -#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_OES 0x8A32 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_OES 0x8C29 -#define GL_PRIMITIVES_GENERATED_OES 0x8C87 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_OES 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_OES 0x8DA8 -#define GL_GEOMETRY_SHADER_OES 0x8DD9 -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_OES 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_OES 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_OES 0x8DE1 -#define GL_FIRST_VERTEX_CONVENTION_OES 0x8E4D -#define GL_LAST_VERTEX_CONVENTION_OES 0x8E4E -#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_OES 0x8E5A -#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_OES 0x90CD -#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_OES 0x90D7 -#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_OES 0x9123 -#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_OES 0x9124 -#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_OES 0x92CF -#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_OES 0x92D5 -#define GL_REFERENCED_BY_GEOMETRY_SHADER_OES 0x9309 -#define GL_FRAMEBUFFER_DEFAULT_LAYERS_OES 0x9312 -#define GL_MAX_FRAMEBUFFER_LAYERS_OES 0x9317 - -#define GLEW_OES_geometry_shader GLEW_GET_VAR(__GLEW_OES_geometry_shader) - -#endif /* GL_OES_geometry_shader */ - -/* ----------------------- GL_OES_get_program_binary ----------------------- */ - -#ifndef GL_OES_get_program_binary -#define GL_OES_get_program_binary 1 - -#define GL_PROGRAM_BINARY_LENGTH_OES 0x8741 -#define GL_NUM_PROGRAM_BINARY_FORMATS_OES 0x87FE -#define GL_PROGRAM_BINARY_FORMATS_OES 0x87FF - -typedef void (GLAPIENTRY * PFNGLGETPROGRAMBINARYOESPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum *binaryFormat, void*binary); -typedef void (GLAPIENTRY * PFNGLPROGRAMBINARYOESPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLint length); - -#define glGetProgramBinaryOES GLEW_GET_FUN(__glewGetProgramBinaryOES) -#define glProgramBinaryOES GLEW_GET_FUN(__glewProgramBinaryOES) - -#define GLEW_OES_get_program_binary GLEW_GET_VAR(__GLEW_OES_get_program_binary) - -#endif /* GL_OES_get_program_binary */ - -/* --------------------------- GL_OES_gpu_shader5 -------------------------- */ - -#ifndef GL_OES_gpu_shader5 -#define GL_OES_gpu_shader5 1 - -#define GLEW_OES_gpu_shader5 GLEW_GET_VAR(__GLEW_OES_gpu_shader5) - -#endif /* GL_OES_gpu_shader5 */ - -/* ---------------------------- GL_OES_mapbuffer --------------------------- */ - -#ifndef GL_OES_mapbuffer -#define GL_OES_mapbuffer 1 - -#define GL_WRITE_ONLY_OES 0x88B9 -#define GL_BUFFER_ACCESS_OES 0x88BB -#define GL_BUFFER_MAPPED_OES 0x88BC -#define GL_BUFFER_MAP_POINTER_OES 0x88BD - -typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVOESPROC) (GLenum target, GLenum pname, void** params); -typedef void * (GLAPIENTRY * PFNGLMAPBUFFEROESPROC) (GLenum target, GLenum access); -typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFEROESPROC) (GLenum target); - -#define glGetBufferPointervOES GLEW_GET_FUN(__glewGetBufferPointervOES) -#define glMapBufferOES GLEW_GET_FUN(__glewMapBufferOES) -#define glUnmapBufferOES GLEW_GET_FUN(__glewUnmapBufferOES) - -#define GLEW_OES_mapbuffer GLEW_GET_VAR(__GLEW_OES_mapbuffer) - -#endif /* GL_OES_mapbuffer */ - -/* --------------------------- GL_OES_matrix_get --------------------------- */ - -#ifndef GL_OES_matrix_get -#define GL_OES_matrix_get 1 - -#define GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES 0x898d -#define GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES 0x898e -#define GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES 0x898f - -#define GLEW_OES_matrix_get GLEW_GET_VAR(__GLEW_OES_matrix_get) - -#endif /* GL_OES_matrix_get */ - -/* ------------------------- GL_OES_matrix_palette ------------------------- */ - -#ifndef GL_OES_matrix_palette -#define GL_OES_matrix_palette 1 - -#define GL_MAX_VERTEX_UNITS_OES 0x86A4 -#define GL_WEIGHT_ARRAY_TYPE_OES 0x86A9 -#define GL_WEIGHT_ARRAY_STRIDE_OES 0x86AA -#define GL_WEIGHT_ARRAY_SIZE_OES 0x86AB -#define GL_WEIGHT_ARRAY_POINTER_OES 0x86AC -#define GL_WEIGHT_ARRAY_OES 0x86AD -#define GL_MATRIX_PALETTE_OES 0x8840 -#define GL_MAX_PALETTE_MATRICES_OES 0x8842 -#define GL_CURRENT_PALETTE_MATRIX_OES 0x8843 -#define GL_MATRIX_INDEX_ARRAY_OES 0x8844 -#define GL_MATRIX_INDEX_ARRAY_SIZE_OES 0x8846 -#define GL_MATRIX_INDEX_ARRAY_TYPE_OES 0x8847 -#define GL_MATRIX_INDEX_ARRAY_STRIDE_OES 0x8848 -#define GL_MATRIX_INDEX_ARRAY_POINTER_OES 0x8849 -#define GL_WEIGHT_ARRAY_BUFFER_BINDING_OES 0x889E -#define GL_MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES 0x8B9E - -typedef void (GLAPIENTRY * PFNGLCURRENTPALETTEMATRIXOESPROC) (GLuint index); -typedef void (GLAPIENTRY * PFNGLMATRIXINDEXPOINTEROESPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); -typedef void (GLAPIENTRY * PFNGLWEIGHTPOINTEROESPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); - -#define glCurrentPaletteMatrixOES GLEW_GET_FUN(__glewCurrentPaletteMatrixOES) -#define glMatrixIndexPointerOES GLEW_GET_FUN(__glewMatrixIndexPointerOES) -#define glWeightPointerOES GLEW_GET_FUN(__glewWeightPointerOES) - -#define GLEW_OES_matrix_palette GLEW_GET_VAR(__GLEW_OES_matrix_palette) - -#endif /* GL_OES_matrix_palette */ - -/* ---------------------- GL_OES_packed_depth_stencil ---------------------- */ - -#ifndef GL_OES_packed_depth_stencil -#define GL_OES_packed_depth_stencil 1 - -#define GL_DEPTH_STENCIL_OES 0x84F9 -#define GL_UNSIGNED_INT_24_8_OES 0x84FA -#define GL_DEPTH24_STENCIL8_OES 0x88F0 - -#define GLEW_OES_packed_depth_stencil GLEW_GET_VAR(__GLEW_OES_packed_depth_stencil) - -#endif /* GL_OES_packed_depth_stencil */ - -/* ------------------------ GL_OES_point_size_array ------------------------ */ - -#ifndef GL_OES_point_size_array -#define GL_OES_point_size_array 1 - -#define GL_POINT_SIZE_ARRAY_TYPE_OES 0x898A -#define GL_POINT_SIZE_ARRAY_STRIDE_OES 0x898B -#define GL_POINT_SIZE_ARRAY_POINTER_OES 0x898C -#define GL_POINT_SIZE_ARRAY_OES 0x8B9C -#define GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES 0x8B9F - -#define GLEW_OES_point_size_array GLEW_GET_VAR(__GLEW_OES_point_size_array) - -#endif /* GL_OES_point_size_array */ - -/* -------------------------- GL_OES_point_sprite -------------------------- */ - -#ifndef GL_OES_point_sprite -#define GL_OES_point_sprite 1 - -#define GL_POINT_SPRITE_OES 0x8861 -#define GL_COORD_REPLACE_OES 0x8862 - -#define GLEW_OES_point_sprite GLEW_GET_VAR(__GLEW_OES_point_sprite) - -#endif /* GL_OES_point_sprite */ - -/* --------------------------- GL_OES_read_format -------------------------- */ - -#ifndef GL_OES_read_format -#define GL_OES_read_format 1 - -#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B - -#define GLEW_OES_read_format GLEW_GET_VAR(__GLEW_OES_read_format) - -#endif /* GL_OES_read_format */ - -/* --------------------- GL_OES_required_internalformat -------------------- */ - -#ifndef GL_OES_required_internalformat -#define GL_OES_required_internalformat 1 - -#define GL_ALPHA8_OES 0x803C -#define GL_LUMINANCE8_OES 0x8040 -#define GL_LUMINANCE4_ALPHA4_OES 0x8043 -#define GL_LUMINANCE8_ALPHA8_OES 0x8045 -#define GL_RGB8_OES 0x8051 -#define GL_RGB10_EXT 0x8052 -#define GL_RGBA4_OES 0x8056 -#define GL_RGB5_A1_OES 0x8057 -#define GL_RGBA8_OES 0x8058 -#define GL_RGB10_A2_EXT 0x8059 -#define GL_DEPTH_COMPONENT16_OES 0x81A5 -#define GL_DEPTH_COMPONENT24_OES 0x81A6 -#define GL_DEPTH_COMPONENT32_OES 0x81A7 -#define GL_DEPTH24_STENCIL8_OES 0x88F0 -#define GL_RGB565_OES 0x8D62 - -#define GLEW_OES_required_internalformat GLEW_GET_VAR(__GLEW_OES_required_internalformat) - -#endif /* GL_OES_required_internalformat */ - -/* --------------------------- GL_OES_rgb8_rgba8 --------------------------- */ - -#ifndef GL_OES_rgb8_rgba8 -#define GL_OES_rgb8_rgba8 1 - -#define GL_RGB8_OES 0x8051 -#define GL_RGBA8_OES 0x8058 - -#define GLEW_OES_rgb8_rgba8 GLEW_GET_VAR(__GLEW_OES_rgb8_rgba8) - -#endif /* GL_OES_rgb8_rgba8 */ - -/* ------------------------- GL_OES_sample_shading ------------------------- */ - -#ifndef GL_OES_sample_shading -#define GL_OES_sample_shading 1 - -#define GL_SAMPLE_SHADING_OES 0x8C36 -#define GL_MIN_SAMPLE_SHADING_VALUE_OES 0x8C37 - -typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGOESPROC) (GLfloat value); - -#define glMinSampleShadingOES GLEW_GET_FUN(__glewMinSampleShadingOES) - -#define GLEW_OES_sample_shading GLEW_GET_VAR(__GLEW_OES_sample_shading) - -#endif /* GL_OES_sample_shading */ - -/* ------------------------ GL_OES_sample_variables ------------------------ */ - -#ifndef GL_OES_sample_variables -#define GL_OES_sample_variables 1 - -#define GLEW_OES_sample_variables GLEW_GET_VAR(__GLEW_OES_sample_variables) - -#endif /* GL_OES_sample_variables */ - -/* ----------------------- GL_OES_shader_image_atomic ---------------------- */ - -#ifndef GL_OES_shader_image_atomic -#define GL_OES_shader_image_atomic 1 - -#define GLEW_OES_shader_image_atomic GLEW_GET_VAR(__GLEW_OES_shader_image_atomic) - -#endif /* GL_OES_shader_image_atomic */ - -/* ------------------------ GL_OES_shader_io_blocks ------------------------ */ - -#ifndef GL_OES_shader_io_blocks -#define GL_OES_shader_io_blocks 1 - -#define GLEW_OES_shader_io_blocks GLEW_GET_VAR(__GLEW_OES_shader_io_blocks) - -#endif /* GL_OES_shader_io_blocks */ - -/* ---------------- GL_OES_shader_multisample_interpolation ---------------- */ - -#ifndef GL_OES_shader_multisample_interpolation -#define GL_OES_shader_multisample_interpolation 1 - -#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_OES 0x8E5B -#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_OES 0x8E5C -#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS_OES 0x8E5D - -#define GLEW_OES_shader_multisample_interpolation GLEW_GET_VAR(__GLEW_OES_shader_multisample_interpolation) - -#endif /* GL_OES_shader_multisample_interpolation */ - -/* ------------------------ GL_OES_single_precision ------------------------ */ - -#ifndef GL_OES_single_precision -#define GL_OES_single_precision 1 - -typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFOESPROC) (GLclampf depth); -typedef void (GLAPIENTRY * PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat* equation); -typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); -typedef void (GLAPIENTRY * PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); -typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat* equation); -typedef void (GLAPIENTRY * PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); - -#define glClearDepthfOES GLEW_GET_FUN(__glewClearDepthfOES) -#define glClipPlanefOES GLEW_GET_FUN(__glewClipPlanefOES) -#define glDepthRangefOES GLEW_GET_FUN(__glewDepthRangefOES) -#define glFrustumfOES GLEW_GET_FUN(__glewFrustumfOES) -#define glGetClipPlanefOES GLEW_GET_FUN(__glewGetClipPlanefOES) -#define glOrthofOES GLEW_GET_FUN(__glewOrthofOES) - -#define GLEW_OES_single_precision GLEW_GET_VAR(__GLEW_OES_single_precision) - -#endif /* GL_OES_single_precision */ - -/* ---------------------- GL_OES_standard_derivatives ---------------------- */ - -#ifndef GL_OES_standard_derivatives -#define GL_OES_standard_derivatives 1 - -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES 0x8B8B - -#define GLEW_OES_standard_derivatives GLEW_GET_VAR(__GLEW_OES_standard_derivatives) - -#endif /* GL_OES_standard_derivatives */ - -/* ---------------------------- GL_OES_stencil1 ---------------------------- */ - -#ifndef GL_OES_stencil1 -#define GL_OES_stencil1 1 - -#define GL_STENCIL_INDEX1_OES 0x8D46 - -#define GLEW_OES_stencil1 GLEW_GET_VAR(__GLEW_OES_stencil1) - -#endif /* GL_OES_stencil1 */ - -/* ---------------------------- GL_OES_stencil4 ---------------------------- */ - -#ifndef GL_OES_stencil4 -#define GL_OES_stencil4 1 - -#define GL_STENCIL_INDEX4_OES 0x8D47 - -#define GLEW_OES_stencil4 GLEW_GET_VAR(__GLEW_OES_stencil4) - -#endif /* GL_OES_stencil4 */ - -/* ---------------------------- GL_OES_stencil8 ---------------------------- */ - -#ifndef GL_OES_stencil8 -#define GL_OES_stencil8 1 - -#define GL_STENCIL_INDEX8_OES 0x8D48 - -#define GLEW_OES_stencil8 GLEW_GET_VAR(__GLEW_OES_stencil8) - -#endif /* GL_OES_stencil8 */ - -/* ----------------------- GL_OES_surfaceless_context ---------------------- */ - -#ifndef GL_OES_surfaceless_context -#define GL_OES_surfaceless_context 1 - -#define GL_FRAMEBUFFER_UNDEFINED_OES 0x8219 - -#define GLEW_OES_surfaceless_context GLEW_GET_VAR(__GLEW_OES_surfaceless_context) - -#endif /* GL_OES_surfaceless_context */ - -/* --------------------- GL_OES_tessellation_point_size -------------------- */ - -#ifndef GL_OES_tessellation_point_size -#define GL_OES_tessellation_point_size 1 - -#define GL_QUADS_OES 0x0007 -#define GL_TESS_CONTROL_SHADER_BIT_OES 0x00000008 -#define GL_PATCHES_OES 0xE -#define GL_TESS_EVALUATION_SHADER_BIT_OES 0x00000010 -#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED_OES 0x8221 -#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_OES 0x886C -#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_OES 0x886D -#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_OES 0x8E1E -#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_OES 0x8E1F -#define GL_PATCH_VERTICES_OES 0x8E72 -#define GL_TESS_CONTROL_OUTPUT_VERTICES_OES 0x8E75 -#define GL_TESS_GEN_MODE_OES 0x8E76 -#define GL_TESS_GEN_SPACING_OES 0x8E77 -#define GL_TESS_GEN_VERTEX_ORDER_OES 0x8E78 -#define GL_TESS_GEN_POINT_MODE_OES 0x8E79 -#define GL_ISOLINES_OES 0x8E7A -#define GL_FRACTIONAL_ODD_OES 0x8E7B -#define GL_FRACTIONAL_EVEN_OES 0x8E7C -#define GL_MAX_PATCH_VERTICES_OES 0x8E7D -#define GL_MAX_TESS_GEN_LEVEL_OES 0x8E7E -#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_OES 0x8E7F -#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_OES 0x8E80 -#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_OES 0x8E81 -#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_OES 0x8E82 -#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_OES 0x8E83 -#define GL_MAX_TESS_PATCH_COMPONENTS_OES 0x8E84 -#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_OES 0x8E85 -#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_OES 0x8E86 -#define GL_TESS_EVALUATION_SHADER_OES 0x8E87 -#define GL_TESS_CONTROL_SHADER_OES 0x8E88 -#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_OES 0x8E89 -#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_OES 0x8E8A -#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_OES 0x90CB -#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_OES 0x90CC -#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_OES 0x90D8 -#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_OES 0x90D9 -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_OES 0x92CD -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_OES 0x92CE -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_OES 0x92D3 -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_OES 0x92D4 -#define GL_IS_PER_PATCH_OES 0x92E7 -#define GL_REFERENCED_BY_TESS_CONTROL_SHADER_OES 0x9307 -#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER_OES 0x9308 - -#define GLEW_OES_tessellation_point_size GLEW_GET_VAR(__GLEW_OES_tessellation_point_size) - -#endif /* GL_OES_tessellation_point_size */ - -/* ----------------------- GL_OES_tessellation_shader ---------------------- */ - -#ifndef GL_OES_tessellation_shader -#define GL_OES_tessellation_shader 1 - -#define GL_QUADS_OES 0x0007 -#define GL_TESS_CONTROL_SHADER_BIT_OES 0x00000008 -#define GL_PATCHES_OES 0xE -#define GL_TESS_EVALUATION_SHADER_BIT_OES 0x00000010 -#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED_OES 0x8221 -#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_OES 0x886C -#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_OES 0x886D -#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_OES 0x8E1E -#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_OES 0x8E1F -#define GL_PATCH_VERTICES_OES 0x8E72 -#define GL_TESS_CONTROL_OUTPUT_VERTICES_OES 0x8E75 -#define GL_TESS_GEN_MODE_OES 0x8E76 -#define GL_TESS_GEN_SPACING_OES 0x8E77 -#define GL_TESS_GEN_VERTEX_ORDER_OES 0x8E78 -#define GL_TESS_GEN_POINT_MODE_OES 0x8E79 -#define GL_ISOLINES_OES 0x8E7A -#define GL_FRACTIONAL_ODD_OES 0x8E7B -#define GL_FRACTIONAL_EVEN_OES 0x8E7C -#define GL_MAX_PATCH_VERTICES_OES 0x8E7D -#define GL_MAX_TESS_GEN_LEVEL_OES 0x8E7E -#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_OES 0x8E7F -#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_OES 0x8E80 -#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_OES 0x8E81 -#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_OES 0x8E82 -#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_OES 0x8E83 -#define GL_MAX_TESS_PATCH_COMPONENTS_OES 0x8E84 -#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_OES 0x8E85 -#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_OES 0x8E86 -#define GL_TESS_EVALUATION_SHADER_OES 0x8E87 -#define GL_TESS_CONTROL_SHADER_OES 0x8E88 -#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_OES 0x8E89 -#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_OES 0x8E8A -#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_OES 0x90CB -#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_OES 0x90CC -#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_OES 0x90D8 -#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_OES 0x90D9 -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_OES 0x92CD -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_OES 0x92CE -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_OES 0x92D3 -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_OES 0x92D4 -#define GL_IS_PER_PATCH_OES 0x92E7 -#define GL_REFERENCED_BY_TESS_CONTROL_SHADER_OES 0x9307 -#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER_OES 0x9308 - -#define GLEW_OES_tessellation_shader GLEW_GET_VAR(__GLEW_OES_tessellation_shader) - -#endif /* GL_OES_tessellation_shader */ - -/* --------------------------- GL_OES_texture_3D --------------------------- */ - -#ifndef GL_OES_texture_3D -#define GL_OES_texture_3D 1 - -#define GL_TEXTURE_BINDING_3D_OES 0x806A -#define GL_TEXTURE_3D_OES 0x806F -#define GL_TEXTURE_WRAP_R_OES 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE_OES 0x8073 - -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DOESPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); - -#define glCompressedTexImage3DOES GLEW_GET_FUN(__glewCompressedTexImage3DOES) -#define glCompressedTexSubImage3DOES GLEW_GET_FUN(__glewCompressedTexSubImage3DOES) -#define glCopyTexSubImage3DOES GLEW_GET_FUN(__glewCopyTexSubImage3DOES) -#define glFramebufferTexture3DOES GLEW_GET_FUN(__glewFramebufferTexture3DOES) -#define glTexImage3DOES GLEW_GET_FUN(__glewTexImage3DOES) -#define glTexSubImage3DOES GLEW_GET_FUN(__glewTexSubImage3DOES) - -#define GLEW_OES_texture_3D GLEW_GET_VAR(__GLEW_OES_texture_3D) - -#endif /* GL_OES_texture_3D */ - -/* ---------------------- GL_OES_texture_border_clamp ---------------------- */ - -#ifndef GL_OES_texture_border_clamp -#define GL_OES_texture_border_clamp 1 - -#define GL_TEXTURE_BORDER_COLOR_OES 0x1004 -#define GL_CLAMP_TO_BORDER_OES 0x812D - -typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIIVOESPROC) (GLuint sampler, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIUIVOESPROC) (GLuint sampler, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVOESPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVOESPROC) (GLenum target, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIIVOESPROC) (GLuint sampler, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIUIVOESPROC) (GLuint sampler, GLenum pname, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVOESPROC) (GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVOESPROC) (GLenum target, GLenum pname, const GLuint* params); - -#define glGetSamplerParameterIivOES GLEW_GET_FUN(__glewGetSamplerParameterIivOES) -#define glGetSamplerParameterIuivOES GLEW_GET_FUN(__glewGetSamplerParameterIuivOES) -#define glGetTexParameterIivOES GLEW_GET_FUN(__glewGetTexParameterIivOES) -#define glGetTexParameterIuivOES GLEW_GET_FUN(__glewGetTexParameterIuivOES) -#define glSamplerParameterIivOES GLEW_GET_FUN(__glewSamplerParameterIivOES) -#define glSamplerParameterIuivOES GLEW_GET_FUN(__glewSamplerParameterIuivOES) -#define glTexParameterIivOES GLEW_GET_FUN(__glewTexParameterIivOES) -#define glTexParameterIuivOES GLEW_GET_FUN(__glewTexParameterIuivOES) - -#define GLEW_OES_texture_border_clamp GLEW_GET_VAR(__GLEW_OES_texture_border_clamp) - -#endif /* GL_OES_texture_border_clamp */ - -/* ------------------------- GL_OES_texture_buffer ------------------------- */ - -#ifndef GL_OES_texture_buffer -#define GL_OES_texture_buffer 1 - -#define GL_TEXTURE_BUFFER_BINDING_OES 0x8C2A -#define GL_TEXTURE_BUFFER_OES 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE_OES 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER_OES 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_OES 0x8C2D -#define GL_SAMPLER_BUFFER_OES 0x8DC2 -#define GL_INT_SAMPLER_BUFFER_OES 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER_OES 0x8DD8 -#define GL_IMAGE_BUFFER_OES 0x9051 -#define GL_INT_IMAGE_BUFFER_OES 0x905C -#define GL_UNSIGNED_INT_IMAGE_BUFFER_OES 0x9067 -#define GL_TEXTURE_BUFFER_OFFSET_OES 0x919D -#define GL_TEXTURE_BUFFER_SIZE_OES 0x919E -#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_OES 0x919F - -typedef void (GLAPIENTRY * PFNGLTEXBUFFEROESPROC) (GLenum target, GLenum internalformat, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLTEXBUFFERRANGEOESPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); - -#define glTexBufferOES GLEW_GET_FUN(__glewTexBufferOES) -#define glTexBufferRangeOES GLEW_GET_FUN(__glewTexBufferRangeOES) - -#define GLEW_OES_texture_buffer GLEW_GET_VAR(__GLEW_OES_texture_buffer) - -#endif /* GL_OES_texture_buffer */ - -/* -------------------- GL_OES_texture_compression_astc -------------------- */ - -#ifndef GL_OES_texture_compression_astc -#define GL_OES_texture_compression_astc 1 - -#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 -#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 -#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 -#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 -#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 -#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 -#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 -#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 -#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 -#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 -#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA -#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB -#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC -#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD -#define GL_COMPRESSED_RGBA_ASTC_3x3x3_OES 0x93C0 -#define GL_COMPRESSED_RGBA_ASTC_4x3x3_OES 0x93C1 -#define GL_COMPRESSED_RGBA_ASTC_4x4x3_OES 0x93C2 -#define GL_COMPRESSED_RGBA_ASTC_4x4x4_OES 0x93C3 -#define GL_COMPRESSED_RGBA_ASTC_5x4x4_OES 0x93C4 -#define GL_COMPRESSED_RGBA_ASTC_5x5x4_OES 0x93C5 -#define GL_COMPRESSED_RGBA_ASTC_5x5x5_OES 0x93C6 -#define GL_COMPRESSED_RGBA_ASTC_6x5x5_OES 0x93C7 -#define GL_COMPRESSED_RGBA_ASTC_6x6x5_OES 0x93C8 -#define GL_COMPRESSED_RGBA_ASTC_6x6x6_OES 0x93C9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES 0x93E0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES 0x93E1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES 0x93E2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES 0x93E3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES 0x93E4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES 0x93E5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES 0x93E6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES 0x93E7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES 0x93E8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES 0x93E9 - -#define GLEW_OES_texture_compression_astc GLEW_GET_VAR(__GLEW_OES_texture_compression_astc) - -#endif /* GL_OES_texture_compression_astc */ - -/* ------------------------ GL_OES_texture_cube_map ------------------------ */ - -#ifndef GL_OES_texture_cube_map -#define GL_OES_texture_cube_map 1 - -#define GL_TEXTURE_GEN_MODE_OES 0x2500 -#define GL_NORMAL_MAP_OES 0x8511 -#define GL_REFLECTION_MAP_OES 0x8512 -#define GL_TEXTURE_CUBE_MAP_OES 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_OES 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES 0x851A -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_OES 0x851C -#define GL_TEXTURE_GEN_STR_OES 0x8D60 - -typedef void (GLAPIENTRY * PFNGLGETTEXGENFVOESPROC) (GLenum coord, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETTEXGENIVOESPROC) (GLenum coord, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXGENXVOESPROC) (GLenum coord, GLenum pname, GLfixed* params); -typedef void (GLAPIENTRY * PFNGLTEXGENFOESPROC) (GLenum coord, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLTEXGENFVOESPROC) (GLenum coord, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLTEXGENIOESPROC) (GLenum coord, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLTEXGENIVOESPROC) (GLenum coord, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLTEXGENXOESPROC) (GLenum coord, GLenum pname, GLfixed param); -typedef void (GLAPIENTRY * PFNGLTEXGENXVOESPROC) (GLenum coord, GLenum pname, const GLfixed* params); - -#define glGetTexGenfvOES GLEW_GET_FUN(__glewGetTexGenfvOES) -#define glGetTexGenivOES GLEW_GET_FUN(__glewGetTexGenivOES) -#define glGetTexGenxvOES GLEW_GET_FUN(__glewGetTexGenxvOES) -#define glTexGenfOES GLEW_GET_FUN(__glewTexGenfOES) -#define glTexGenfvOES GLEW_GET_FUN(__glewTexGenfvOES) -#define glTexGeniOES GLEW_GET_FUN(__glewTexGeniOES) -#define glTexGenivOES GLEW_GET_FUN(__glewTexGenivOES) -#define glTexGenxOES GLEW_GET_FUN(__glewTexGenxOES) -#define glTexGenxvOES GLEW_GET_FUN(__glewTexGenxvOES) - -#define GLEW_OES_texture_cube_map GLEW_GET_VAR(__GLEW_OES_texture_cube_map) - -#endif /* GL_OES_texture_cube_map */ - -/* --------------------- GL_OES_texture_cube_map_array --------------------- */ - -#ifndef GL_OES_texture_cube_map_array -#define GL_OES_texture_cube_map_array 1 - -#define GL_TEXTURE_CUBE_MAP_ARRAY_OES 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_OES 0x900A -#define GL_SAMPLER_CUBE_MAP_ARRAY_OES 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_OES 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_OES 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_OES 0x900F -#define GL_IMAGE_CUBE_MAP_ARRAY_OES 0x9054 -#define GL_INT_IMAGE_CUBE_MAP_ARRAY_OES 0x905F -#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_OES 0x906A - -#define GLEW_OES_texture_cube_map_array GLEW_GET_VAR(__GLEW_OES_texture_cube_map_array) - -#endif /* GL_OES_texture_cube_map_array */ - -/* ---------------------- GL_OES_texture_env_crossbar ---------------------- */ - -#ifndef GL_OES_texture_env_crossbar -#define GL_OES_texture_env_crossbar 1 - -#define GLEW_OES_texture_env_crossbar GLEW_GET_VAR(__GLEW_OES_texture_env_crossbar) - -#endif /* GL_OES_texture_env_crossbar */ - -/* --------------------- GL_OES_texture_mirrored_repeat -------------------- */ - -#ifndef GL_OES_texture_mirrored_repeat -#define GL_OES_texture_mirrored_repeat 1 - -#define GL_MIRRORED_REPEAT 0x8370 - -#define GLEW_OES_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_OES_texture_mirrored_repeat) - -#endif /* GL_OES_texture_mirrored_repeat */ - -/* -------------------------- GL_OES_texture_npot -------------------------- */ - -#ifndef GL_OES_texture_npot -#define GL_OES_texture_npot 1 - -#define GLEW_OES_texture_npot GLEW_GET_VAR(__GLEW_OES_texture_npot) - -#endif /* GL_OES_texture_npot */ - -/* ------------------------ GL_OES_texture_stencil8 ------------------------ */ - -#ifndef GL_OES_texture_stencil8 -#define GL_OES_texture_stencil8 1 - -#define GL_STENCIL_INDEX 0x1901 -#define GL_STENCIL_INDEX8 0x8D48 - -#define GLEW_OES_texture_stencil8 GLEW_GET_VAR(__GLEW_OES_texture_stencil8) - -#endif /* GL_OES_texture_stencil8 */ - -/* -------------- GL_OES_texture_storage_multisample_2d_array -------------- */ - -#ifndef GL_OES_texture_storage_multisample_2d_array -#define GL_OES_texture_storage_multisample_2d_array 1 - -#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES 0x9102 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY_OES 0x9105 -#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910B -#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910C -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910D - -typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DMULTISAMPLEOESPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); - -#define glTexStorage3DMultisampleOES GLEW_GET_FUN(__glewTexStorage3DMultisampleOES) - -#define GLEW_OES_texture_storage_multisample_2d_array GLEW_GET_VAR(__GLEW_OES_texture_storage_multisample_2d_array) - -#endif /* GL_OES_texture_storage_multisample_2d_array */ - -/* -------------------------- GL_OES_texture_view -------------------------- */ - -#ifndef GL_OES_texture_view -#define GL_OES_texture_view 1 - -#define GL_TEXTURE_VIEW_MIN_LEVEL_OES 0x82DB -#define GL_TEXTURE_VIEW_NUM_LEVELS_OES 0x82DC -#define GL_TEXTURE_VIEW_MIN_LAYER_OES 0x82DD -#define GL_TEXTURE_VIEW_NUM_LAYERS_OES 0x82DE -#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF - -typedef void (GLAPIENTRY * PFNGLTEXTUREVIEWOESPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); - -#define glTextureViewOES GLEW_GET_FUN(__glewTextureViewOES) - -#define GLEW_OES_texture_view GLEW_GET_VAR(__GLEW_OES_texture_view) - -#endif /* GL_OES_texture_view */ - -/* ----------------------- GL_OES_vertex_array_object ---------------------- */ - -#ifndef GL_OES_vertex_array_object -#define GL_OES_vertex_array_object 1 - -#define GL_VERTEX_ARRAY_BINDING_OES 0x85B5 - -typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYOESPROC) (GLuint array); -typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSOESPROC) (GLsizei n, const GLuint* arrays); -typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSOESPROC) (GLsizei n, GLuint* arrays); -typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYOESPROC) (GLuint array); - -#define glBindVertexArrayOES GLEW_GET_FUN(__glewBindVertexArrayOES) -#define glDeleteVertexArraysOES GLEW_GET_FUN(__glewDeleteVertexArraysOES) -#define glGenVertexArraysOES GLEW_GET_FUN(__glewGenVertexArraysOES) -#define glIsVertexArrayOES GLEW_GET_FUN(__glewIsVertexArrayOES) - -#define GLEW_OES_vertex_array_object GLEW_GET_VAR(__GLEW_OES_vertex_array_object) - -#endif /* GL_OES_vertex_array_object */ - -/* ------------------------ GL_OES_vertex_half_float ----------------------- */ - -#ifndef GL_OES_vertex_half_float -#define GL_OES_vertex_half_float 1 - -#define GL_HALF_FLOAT_OES 0x8D61 - -#define GLEW_OES_vertex_half_float GLEW_GET_VAR(__GLEW_OES_vertex_half_float) - -#endif /* GL_OES_vertex_half_float */ - -/* --------------------- GL_OES_vertex_type_10_10_10_2 --------------------- */ - -#ifndef GL_OES_vertex_type_10_10_10_2 -#define GL_OES_vertex_type_10_10_10_2 1 - -#define GL_UNSIGNED_INT_10_10_10_2_OES 0x8DF6 -#define GL_INT_10_10_10_2_OES 0x8DF7 - -#define GLEW_OES_vertex_type_10_10_10_2 GLEW_GET_VAR(__GLEW_OES_vertex_type_10_10_10_2) - -#endif /* GL_OES_vertex_type_10_10_10_2 */ - -/* ---------------------------- GL_OML_interlace --------------------------- */ - -#ifndef GL_OML_interlace -#define GL_OML_interlace 1 - -#define GL_INTERLACE_OML 0x8980 -#define GL_INTERLACE_READ_OML 0x8981 - -#define GLEW_OML_interlace GLEW_GET_VAR(__GLEW_OML_interlace) - -#endif /* GL_OML_interlace */ - -/* ---------------------------- GL_OML_resample ---------------------------- */ - -#ifndef GL_OML_resample -#define GL_OML_resample 1 - -#define GL_PACK_RESAMPLE_OML 0x8984 -#define GL_UNPACK_RESAMPLE_OML 0x8985 -#define GL_RESAMPLE_REPLICATE_OML 0x8986 -#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 -#define GL_RESAMPLE_AVERAGE_OML 0x8988 -#define GL_RESAMPLE_DECIMATE_OML 0x8989 - -#define GLEW_OML_resample GLEW_GET_VAR(__GLEW_OML_resample) - -#endif /* GL_OML_resample */ - -/* ---------------------------- GL_OML_subsample --------------------------- */ - -#ifndef GL_OML_subsample -#define GL_OML_subsample 1 - -#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 -#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 - -#define GLEW_OML_subsample GLEW_GET_VAR(__GLEW_OML_subsample) - -#endif /* GL_OML_subsample */ - -/* ---------------------------- GL_OVR_multiview --------------------------- */ - -#ifndef GL_OVR_multiview -#define GL_OVR_multiview 1 - -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR 0x9630 -#define GL_MAX_VIEWS_OVR 0x9631 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR 0x9632 -#define GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR 0x9633 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); - -#define glFramebufferTextureMultiviewOVR GLEW_GET_FUN(__glewFramebufferTextureMultiviewOVR) -#define glNamedFramebufferTextureMultiviewOVR GLEW_GET_FUN(__glewNamedFramebufferTextureMultiviewOVR) - -#define GLEW_OVR_multiview GLEW_GET_VAR(__GLEW_OVR_multiview) - -#endif /* GL_OVR_multiview */ - -/* --------------------------- GL_OVR_multiview2 --------------------------- */ - -#ifndef GL_OVR_multiview2 -#define GL_OVR_multiview2 1 - -#define GLEW_OVR_multiview2 GLEW_GET_VAR(__GLEW_OVR_multiview2) - -#endif /* GL_OVR_multiview2 */ - -/* ------------ GL_OVR_multiview_multisampled_render_to_texture ------------ */ - -#ifndef GL_OVR_multiview_multisampled_render_to_texture -#define GL_OVR_multiview_multisampled_render_to_texture 1 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews); - -#define glFramebufferTextureMultisampleMultiviewOVR GLEW_GET_FUN(__glewFramebufferTextureMultisampleMultiviewOVR) - -#define GLEW_OVR_multiview_multisampled_render_to_texture GLEW_GET_VAR(__GLEW_OVR_multiview_multisampled_render_to_texture) - -#endif /* GL_OVR_multiview_multisampled_render_to_texture */ - -/* --------------------------- GL_PGI_misc_hints --------------------------- */ - -#ifndef GL_PGI_misc_hints -#define GL_PGI_misc_hints 1 - -#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 107000 -#define GL_CONSERVE_MEMORY_HINT_PGI 107005 -#define GL_RECLAIM_MEMORY_HINT_PGI 107006 -#define GL_NATIVE_GRAPHICS_HANDLE_PGI 107010 -#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 107011 -#define GL_NATIVE_GRAPHICS_END_HINT_PGI 107012 -#define GL_ALWAYS_FAST_HINT_PGI 107020 -#define GL_ALWAYS_SOFT_HINT_PGI 107021 -#define GL_ALLOW_DRAW_OBJ_HINT_PGI 107022 -#define GL_ALLOW_DRAW_WIN_HINT_PGI 107023 -#define GL_ALLOW_DRAW_FRG_HINT_PGI 107024 -#define GL_ALLOW_DRAW_MEM_HINT_PGI 107025 -#define GL_STRICT_DEPTHFUNC_HINT_PGI 107030 -#define GL_STRICT_LIGHTING_HINT_PGI 107031 -#define GL_STRICT_SCISSOR_HINT_PGI 107032 -#define GL_FULL_STIPPLE_HINT_PGI 107033 -#define GL_CLIP_NEAR_HINT_PGI 107040 -#define GL_CLIP_FAR_HINT_PGI 107041 -#define GL_WIDE_LINE_HINT_PGI 107042 -#define GL_BACK_NORMALS_HINT_PGI 107043 - -#define GLEW_PGI_misc_hints GLEW_GET_VAR(__GLEW_PGI_misc_hints) - -#endif /* GL_PGI_misc_hints */ - -/* -------------------------- GL_PGI_vertex_hints -------------------------- */ - -#ifndef GL_PGI_vertex_hints -#define GL_PGI_vertex_hints 1 - -#define GL_VERTEX23_BIT_PGI 0x00000004 -#define GL_VERTEX4_BIT_PGI 0x00000008 -#define GL_COLOR3_BIT_PGI 0x00010000 -#define GL_COLOR4_BIT_PGI 0x00020000 -#define GL_EDGEFLAG_BIT_PGI 0x00040000 -#define GL_INDEX_BIT_PGI 0x00080000 -#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 -#define GL_VERTEX_DATA_HINT_PGI 107050 -#define GL_VERTEX_CONSISTENT_HINT_PGI 107051 -#define GL_MATERIAL_SIDE_HINT_PGI 107052 -#define GL_MAX_VERTEX_HINT_PGI 107053 -#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 -#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 -#define GL_MAT_EMISSION_BIT_PGI 0x00800000 -#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 -#define GL_MAT_SHININESS_BIT_PGI 0x02000000 -#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 -#define GL_NORMAL_BIT_PGI 0x08000000 -#define GL_TEXCOORD1_BIT_PGI 0x10000000 -#define GL_TEXCOORD2_BIT_PGI 0x20000000 -#define GL_TEXCOORD3_BIT_PGI 0x40000000 -#define GL_TEXCOORD4_BIT_PGI 0x80000000 - -#define GLEW_PGI_vertex_hints GLEW_GET_VAR(__GLEW_PGI_vertex_hints) - -#endif /* GL_PGI_vertex_hints */ - -/* ----------------------- GL_QCOM_YUV_texture_gather ---------------------- */ - -#ifndef GL_QCOM_YUV_texture_gather -#define GL_QCOM_YUV_texture_gather 1 - -#define GLEW_QCOM_YUV_texture_gather GLEW_GET_VAR(__GLEW_QCOM_YUV_texture_gather) - -#endif /* GL_QCOM_YUV_texture_gather */ - -/* --------------------------- GL_QCOM_alpha_test -------------------------- */ - -#ifndef GL_QCOM_alpha_test -#define GL_QCOM_alpha_test 1 - -#define GL_ALPHA_TEST_QCOM 0x0BC0 -#define GL_ALPHA_TEST_FUNC_QCOM 0x0BC1 -#define GL_ALPHA_TEST_REF_QCOM 0x0BC2 - -typedef void (GLAPIENTRY * PFNGLALPHAFUNCQCOMPROC) (GLenum func, GLclampf ref); - -#define glAlphaFuncQCOM GLEW_GET_FUN(__glewAlphaFuncQCOM) - -#define GLEW_QCOM_alpha_test GLEW_GET_VAR(__GLEW_QCOM_alpha_test) - -#endif /* GL_QCOM_alpha_test */ - -/* ------------------------ GL_QCOM_binning_control ------------------------ */ - -#ifndef GL_QCOM_binning_control -#define GL_QCOM_binning_control 1 - -#define GL_DONT_CARE 0x1100 -#define GL_BINNING_CONTROL_HINT_QCOM 0x8FB0 -#define GL_CPU_OPTIMIZED_QCOM 0x8FB1 -#define GL_GPU_OPTIMIZED_QCOM 0x8FB2 -#define GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM 0x8FB3 - -#define GLEW_QCOM_binning_control GLEW_GET_VAR(__GLEW_QCOM_binning_control) - -#endif /* GL_QCOM_binning_control */ - -/* ------------------------- GL_QCOM_driver_control ------------------------ */ - -#ifndef GL_QCOM_driver_control -#define GL_QCOM_driver_control 1 - -typedef void (GLAPIENTRY * PFNGLDISABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); -typedef void (GLAPIENTRY * PFNGLENABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); -typedef void (GLAPIENTRY * PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei* length, GLchar *driverControlString); -typedef void (GLAPIENTRY * PFNGLGETDRIVERCONTROLSQCOMPROC) (GLint* num, GLsizei size, GLuint *driverControls); - -#define glDisableDriverControlQCOM GLEW_GET_FUN(__glewDisableDriverControlQCOM) -#define glEnableDriverControlQCOM GLEW_GET_FUN(__glewEnableDriverControlQCOM) -#define glGetDriverControlStringQCOM GLEW_GET_FUN(__glewGetDriverControlStringQCOM) -#define glGetDriverControlsQCOM GLEW_GET_FUN(__glewGetDriverControlsQCOM) - -#define GLEW_QCOM_driver_control GLEW_GET_VAR(__GLEW_QCOM_driver_control) - -#endif /* GL_QCOM_driver_control */ - -/* -------------------------- GL_QCOM_extended_get ------------------------- */ - -#ifndef GL_QCOM_extended_get -#define GL_QCOM_extended_get 1 - -#define GL_TEXTURE_WIDTH_QCOM 0x8BD2 -#define GL_TEXTURE_HEIGHT_QCOM 0x8BD3 -#define GL_TEXTURE_DEPTH_QCOM 0x8BD4 -#define GL_TEXTURE_INTERNAL_FORMAT_QCOM 0x8BD5 -#define GL_TEXTURE_FORMAT_QCOM 0x8BD6 -#define GL_TEXTURE_TYPE_QCOM 0x8BD7 -#define GL_TEXTURE_IMAGE_VALID_QCOM 0x8BD8 -#define GL_TEXTURE_NUM_LEVELS_QCOM 0x8BD9 -#define GL_TEXTURE_TARGET_QCOM 0x8BDA -#define GL_TEXTURE_OBJECT_VALID_QCOM 0x8BDB -#define GL_STATE_RESTORE 0x8BDC - -typedef void (GLAPIENTRY * PFNGLEXTGETBUFFERPOINTERVQCOMPROC) (GLenum target, void** params); -typedef void (GLAPIENTRY * PFNGLEXTGETBUFFERSQCOMPROC) (GLuint* buffers, GLint maxBuffers, GLint* numBuffers); -typedef void (GLAPIENTRY * PFNGLEXTGETFRAMEBUFFERSQCOMPROC) (GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers); -typedef void (GLAPIENTRY * PFNGLEXTGETRENDERBUFFERSQCOMPROC) (GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers); -typedef void (GLAPIENTRY * PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLEXTGETTEXSUBIMAGEQCOMPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels); -typedef void (GLAPIENTRY * PFNGLEXTGETTEXTURESQCOMPROC) (GLuint* textures, GLint maxTextures, GLint* numTextures); -typedef void (GLAPIENTRY * PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) (GLenum target, GLenum pname, GLint param); - -#define glExtGetBufferPointervQCOM GLEW_GET_FUN(__glewExtGetBufferPointervQCOM) -#define glExtGetBuffersQCOM GLEW_GET_FUN(__glewExtGetBuffersQCOM) -#define glExtGetFramebuffersQCOM GLEW_GET_FUN(__glewExtGetFramebuffersQCOM) -#define glExtGetRenderbuffersQCOM GLEW_GET_FUN(__glewExtGetRenderbuffersQCOM) -#define glExtGetTexLevelParameterivQCOM GLEW_GET_FUN(__glewExtGetTexLevelParameterivQCOM) -#define glExtGetTexSubImageQCOM GLEW_GET_FUN(__glewExtGetTexSubImageQCOM) -#define glExtGetTexturesQCOM GLEW_GET_FUN(__glewExtGetTexturesQCOM) -#define glExtTexObjectStateOverrideiQCOM GLEW_GET_FUN(__glewExtTexObjectStateOverrideiQCOM) - -#define GLEW_QCOM_extended_get GLEW_GET_VAR(__GLEW_QCOM_extended_get) - -#endif /* GL_QCOM_extended_get */ - -/* ------------------------- GL_QCOM_extended_get2 ------------------------- */ - -#ifndef GL_QCOM_extended_get2 -#define GL_QCOM_extended_get2 1 - -typedef void (GLAPIENTRY * PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) (GLuint program, GLenum shadertype, GLchar* source, GLint* length); -typedef void (GLAPIENTRY * PFNGLEXTGETPROGRAMSQCOMPROC) (GLuint* programs, GLint maxPrograms, GLint* numPrograms); -typedef void (GLAPIENTRY * PFNGLEXTGETSHADERSQCOMPROC) (GLuint* shaders, GLint maxShaders, GLint* numShaders); -typedef GLboolean (GLAPIENTRY * PFNGLEXTISPROGRAMBINARYQCOMPROC) (GLuint program); - -#define glExtGetProgramBinarySourceQCOM GLEW_GET_FUN(__glewExtGetProgramBinarySourceQCOM) -#define glExtGetProgramsQCOM GLEW_GET_FUN(__glewExtGetProgramsQCOM) -#define glExtGetShadersQCOM GLEW_GET_FUN(__glewExtGetShadersQCOM) -#define glExtIsProgramBinaryQCOM GLEW_GET_FUN(__glewExtIsProgramBinaryQCOM) - -#define GLEW_QCOM_extended_get2 GLEW_GET_VAR(__GLEW_QCOM_extended_get2) - -#endif /* GL_QCOM_extended_get2 */ - -/* ---------------------- GL_QCOM_framebuffer_foveated --------------------- */ - -#ifndef GL_QCOM_framebuffer_foveated -#define GL_QCOM_framebuffer_foveated 1 - -#define GL_FOVEATION_ENABLE_BIT_QCOM 0x1 -#define GL_FOVEATION_SCALED_BIN_METHOD_BIT_QCOM 0x2 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC) (GLuint fbo, GLuint numLayers, GLuint focalPointsPerLayer, GLuint requestedFeatures, GLuint* providedFeatures); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC) (GLuint fbo, GLuint layer, GLuint focalPoint, GLfloat focalX, GLfloat focalY, GLfloat gainX, GLfloat gainY, GLfloat foveaArea); - -#define glFramebufferFoveationConfigQCOM GLEW_GET_FUN(__glewFramebufferFoveationConfigQCOM) -#define glFramebufferFoveationParametersQCOM GLEW_GET_FUN(__glewFramebufferFoveationParametersQCOM) - -#define GLEW_QCOM_framebuffer_foveated GLEW_GET_VAR(__GLEW_QCOM_framebuffer_foveated) - -#endif /* GL_QCOM_framebuffer_foveated */ - -/* ---------------------- GL_QCOM_perfmon_global_mode ---------------------- */ - -#ifndef GL_QCOM_perfmon_global_mode -#define GL_QCOM_perfmon_global_mode 1 - -#define GL_PERFMON_GLOBAL_MODE_QCOM 0x8FA0 - -#define GLEW_QCOM_perfmon_global_mode GLEW_GET_VAR(__GLEW_QCOM_perfmon_global_mode) - -#endif /* GL_QCOM_perfmon_global_mode */ - -/* -------------- GL_QCOM_shader_framebuffer_fetch_noncoherent ------------- */ - -#ifndef GL_QCOM_shader_framebuffer_fetch_noncoherent -#define GL_QCOM_shader_framebuffer_fetch_noncoherent 1 - -#define GL_FRAMEBUFFER_FETCH_NONCOHERENT_QCOM 0x96A2 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC) (void); - -#define glFramebufferFetchBarrierQCOM GLEW_GET_FUN(__glewFramebufferFetchBarrierQCOM) - -#define GLEW_QCOM_shader_framebuffer_fetch_noncoherent GLEW_GET_VAR(__GLEW_QCOM_shader_framebuffer_fetch_noncoherent) - -#endif /* GL_QCOM_shader_framebuffer_fetch_noncoherent */ - -/* ----------------- GL_QCOM_shader_framebuffer_fetch_rate ----------------- */ - -#ifndef GL_QCOM_shader_framebuffer_fetch_rate -#define GL_QCOM_shader_framebuffer_fetch_rate 1 - -#define GLEW_QCOM_shader_framebuffer_fetch_rate GLEW_GET_VAR(__GLEW_QCOM_shader_framebuffer_fetch_rate) - -#endif /* GL_QCOM_shader_framebuffer_fetch_rate */ - -/* ------------------------ GL_QCOM_texture_foveated ----------------------- */ - -#ifndef GL_QCOM_texture_foveated -#define GL_QCOM_texture_foveated 1 - -#define GL_FOVEATION_ENABLE_BIT_QCOM 0x1 -#define GL_FOVEATION_SCALED_BIN_METHOD_BIT_QCOM 0x2 -#define GL_TEXTURE_FOVEATED_FEATURE_BITS_QCOM 0x8BFB -#define GL_TEXTURE_FOVEATED_MIN_PIXEL_DENSITY_QCOM 0x8BFC -#define GL_TEXTURE_FOVEATED_FEATURE_QUERY_QCOM 0x8BFD -#define GL_TEXTURE_FOVEATED_NUM_FOCAL_POINTS_QUERY_QCOM 0x8BFE -#define GL_FRAMEBUFFER_INCOMPLETE_FOVEATION_QCOM 0x8BFF - -typedef void (GLAPIENTRY * PFNGLTEXTUREFOVEATIONPARAMETERSQCOMPROC) (GLuint texture, GLuint layer, GLuint focalPoint, GLfloat focalX, GLfloat focalY, GLfloat gainX, GLfloat gainY, GLfloat foveaArea); - -#define glTextureFoveationParametersQCOM GLEW_GET_FUN(__glewTextureFoveationParametersQCOM) - -#define GLEW_QCOM_texture_foveated GLEW_GET_VAR(__GLEW_QCOM_texture_foveated) - -#endif /* GL_QCOM_texture_foveated */ - -/* --------------- GL_QCOM_texture_foveated_subsampled_layout -------------- */ - -#ifndef GL_QCOM_texture_foveated_subsampled_layout -#define GL_QCOM_texture_foveated_subsampled_layout 1 - -#define GL_FOVEATION_SUBSAMPLED_LAYOUT_METHOD_BIT_QCOM 0x4 -#define GL_MAX_SHADER_SUBSAMPLED_IMAGE_UNITS_QCOM 0x8FA1 - -#define GLEW_QCOM_texture_foveated_subsampled_layout GLEW_GET_VAR(__GLEW_QCOM_texture_foveated_subsampled_layout) - -#endif /* GL_QCOM_texture_foveated_subsampled_layout */ - -/* ------------------------ GL_QCOM_tiled_rendering ------------------------ */ - -#ifndef GL_QCOM_tiled_rendering -#define GL_QCOM_tiled_rendering 1 - -#define GL_COLOR_BUFFER_BIT0_QCOM 0x00000001 -#define GL_COLOR_BUFFER_BIT1_QCOM 0x00000002 -#define GL_COLOR_BUFFER_BIT2_QCOM 0x00000004 -#define GL_COLOR_BUFFER_BIT3_QCOM 0x00000008 -#define GL_COLOR_BUFFER_BIT4_QCOM 0x00000010 -#define GL_COLOR_BUFFER_BIT5_QCOM 0x00000020 -#define GL_COLOR_BUFFER_BIT6_QCOM 0x00000040 -#define GL_COLOR_BUFFER_BIT7_QCOM 0x00000080 -#define GL_DEPTH_BUFFER_BIT0_QCOM 0x00000100 -#define GL_DEPTH_BUFFER_BIT1_QCOM 0x00000200 -#define GL_DEPTH_BUFFER_BIT2_QCOM 0x00000400 -#define GL_DEPTH_BUFFER_BIT3_QCOM 0x00000800 -#define GL_DEPTH_BUFFER_BIT4_QCOM 0x00001000 -#define GL_DEPTH_BUFFER_BIT5_QCOM 0x00002000 -#define GL_DEPTH_BUFFER_BIT6_QCOM 0x00004000 -#define GL_DEPTH_BUFFER_BIT7_QCOM 0x00008000 -#define GL_STENCIL_BUFFER_BIT0_QCOM 0x00010000 -#define GL_STENCIL_BUFFER_BIT1_QCOM 0x00020000 -#define GL_STENCIL_BUFFER_BIT2_QCOM 0x00040000 -#define GL_STENCIL_BUFFER_BIT3_QCOM 0x00080000 -#define GL_STENCIL_BUFFER_BIT4_QCOM 0x00100000 -#define GL_STENCIL_BUFFER_BIT5_QCOM 0x00200000 -#define GL_STENCIL_BUFFER_BIT6_QCOM 0x00400000 -#define GL_STENCIL_BUFFER_BIT7_QCOM 0x00800000 -#define GL_MULTISAMPLE_BUFFER_BIT0_QCOM 0x01000000 -#define GL_MULTISAMPLE_BUFFER_BIT1_QCOM 0x02000000 -#define GL_MULTISAMPLE_BUFFER_BIT2_QCOM 0x04000000 -#define GL_MULTISAMPLE_BUFFER_BIT3_QCOM 0x08000000 -#define GL_MULTISAMPLE_BUFFER_BIT4_QCOM 0x10000000 -#define GL_MULTISAMPLE_BUFFER_BIT5_QCOM 0x20000000 -#define GL_MULTISAMPLE_BUFFER_BIT6_QCOM 0x40000000 -#define GL_MULTISAMPLE_BUFFER_BIT7_QCOM 0x80000000 - -typedef void (GLAPIENTRY * PFNGLENDTILINGQCOMPROC) (GLbitfield preserveMask); -typedef void (GLAPIENTRY * PFNGLSTARTTILINGQCOMPROC) (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); - -#define glEndTilingQCOM GLEW_GET_FUN(__glewEndTilingQCOM) -#define glStartTilingQCOM GLEW_GET_FUN(__glewStartTilingQCOM) - -#define GLEW_QCOM_tiled_rendering GLEW_GET_VAR(__GLEW_QCOM_tiled_rendering) - -#endif /* GL_QCOM_tiled_rendering */ - -/* ---------------------- GL_QCOM_writeonly_rendering ---------------------- */ - -#ifndef GL_QCOM_writeonly_rendering -#define GL_QCOM_writeonly_rendering 1 - -#define GL_WRITEONLY_RENDERING_QCOM 0x8823 - -#define GLEW_QCOM_writeonly_rendering GLEW_GET_VAR(__GLEW_QCOM_writeonly_rendering) - -#endif /* GL_QCOM_writeonly_rendering */ - -/* ---------------------- GL_REGAL_ES1_0_compatibility --------------------- */ - -#ifndef GL_REGAL_ES1_0_compatibility -#define GL_REGAL_ES1_0_compatibility 1 - -typedef int GLclampx; - -typedef void (GLAPIENTRY * PFNGLALPHAFUNCXPROC) (GLenum func, GLclampx ref); -typedef void (GLAPIENTRY * PFNGLCLEARCOLORXPROC) (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha); -typedef void (GLAPIENTRY * PFNGLCLEARDEPTHXPROC) (GLclampx depth); -typedef void (GLAPIENTRY * PFNGLCOLOR4XPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -typedef void (GLAPIENTRY * PFNGLDEPTHRANGEXPROC) (GLclampx zNear, GLclampx zFar); -typedef void (GLAPIENTRY * PFNGLFOGXPROC) (GLenum pname, GLfixed param); -typedef void (GLAPIENTRY * PFNGLFOGXVPROC) (GLenum pname, const GLfixed* params); -typedef void (GLAPIENTRY * PFNGLFRUSTUMFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); -typedef void (GLAPIENTRY * PFNGLFRUSTUMXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); -typedef void (GLAPIENTRY * PFNGLLIGHTMODELXPROC) (GLenum pname, GLfixed param); -typedef void (GLAPIENTRY * PFNGLLIGHTMODELXVPROC) (GLenum pname, const GLfixed* params); -typedef void (GLAPIENTRY * PFNGLLIGHTXPROC) (GLenum light, GLenum pname, GLfixed param); -typedef void (GLAPIENTRY * PFNGLLIGHTXVPROC) (GLenum light, GLenum pname, const GLfixed* params); -typedef void (GLAPIENTRY * PFNGLLINEWIDTHXPROC) (GLfixed width); -typedef void (GLAPIENTRY * PFNGLLOADMATRIXXPROC) (const GLfixed* m); -typedef void (GLAPIENTRY * PFNGLMATERIALXPROC) (GLenum face, GLenum pname, GLfixed param); -typedef void (GLAPIENTRY * PFNGLMATERIALXVPROC) (GLenum face, GLenum pname, const GLfixed* params); -typedef void (GLAPIENTRY * PFNGLMULTMATRIXXPROC) (const GLfixed* m); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4XPROC) (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q); -typedef void (GLAPIENTRY * PFNGLNORMAL3XPROC) (GLfixed nx, GLfixed ny, GLfixed nz); -typedef void (GLAPIENTRY * PFNGLORTHOFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); -typedef void (GLAPIENTRY * PFNGLORTHOXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); -typedef void (GLAPIENTRY * PFNGLPOINTSIZEXPROC) (GLfixed size); -typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETXPROC) (GLfixed factor, GLfixed units); -typedef void (GLAPIENTRY * PFNGLROTATEXPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); -typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEXPROC) (GLclampx value, GLboolean invert); -typedef void (GLAPIENTRY * PFNGLSCALEXPROC) (GLfixed x, GLfixed y, GLfixed z); -typedef void (GLAPIENTRY * PFNGLTEXENVXPROC) (GLenum target, GLenum pname, GLfixed param); -typedef void (GLAPIENTRY * PFNGLTEXENVXVPROC) (GLenum target, GLenum pname, const GLfixed* params); -typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXPROC) (GLenum target, GLenum pname, GLfixed param); -typedef void (GLAPIENTRY * PFNGLTRANSLATEXPROC) (GLfixed x, GLfixed y, GLfixed z); - -#define glAlphaFuncx GLEW_GET_FUN(__glewAlphaFuncx) -#define glClearColorx GLEW_GET_FUN(__glewClearColorx) -#define glClearDepthx GLEW_GET_FUN(__glewClearDepthx) -#define glColor4x GLEW_GET_FUN(__glewColor4x) -#define glDepthRangex GLEW_GET_FUN(__glewDepthRangex) -#define glFogx GLEW_GET_FUN(__glewFogx) -#define glFogxv GLEW_GET_FUN(__glewFogxv) -#define glFrustumf GLEW_GET_FUN(__glewFrustumf) -#define glFrustumx GLEW_GET_FUN(__glewFrustumx) -#define glLightModelx GLEW_GET_FUN(__glewLightModelx) -#define glLightModelxv GLEW_GET_FUN(__glewLightModelxv) -#define glLightx GLEW_GET_FUN(__glewLightx) -#define glLightxv GLEW_GET_FUN(__glewLightxv) -#define glLineWidthx GLEW_GET_FUN(__glewLineWidthx) -#define glLoadMatrixx GLEW_GET_FUN(__glewLoadMatrixx) -#define glMaterialx GLEW_GET_FUN(__glewMaterialx) -#define glMaterialxv GLEW_GET_FUN(__glewMaterialxv) -#define glMultMatrixx GLEW_GET_FUN(__glewMultMatrixx) -#define glMultiTexCoord4x GLEW_GET_FUN(__glewMultiTexCoord4x) -#define glNormal3x GLEW_GET_FUN(__glewNormal3x) -#define glOrthof GLEW_GET_FUN(__glewOrthof) -#define glOrthox GLEW_GET_FUN(__glewOrthox) -#define glPointSizex GLEW_GET_FUN(__glewPointSizex) -#define glPolygonOffsetx GLEW_GET_FUN(__glewPolygonOffsetx) -#define glRotatex GLEW_GET_FUN(__glewRotatex) -#define glSampleCoveragex GLEW_GET_FUN(__glewSampleCoveragex) -#define glScalex GLEW_GET_FUN(__glewScalex) -#define glTexEnvx GLEW_GET_FUN(__glewTexEnvx) -#define glTexEnvxv GLEW_GET_FUN(__glewTexEnvxv) -#define glTexParameterx GLEW_GET_FUN(__glewTexParameterx) -#define glTranslatex GLEW_GET_FUN(__glewTranslatex) - -#define GLEW_REGAL_ES1_0_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_0_compatibility) - -#endif /* GL_REGAL_ES1_0_compatibility */ - -/* ---------------------- GL_REGAL_ES1_1_compatibility --------------------- */ - -#ifndef GL_REGAL_ES1_1_compatibility -#define GL_REGAL_ES1_1_compatibility 1 - -typedef void (GLAPIENTRY * PFNGLCLIPPLANEFPROC) (GLenum plane, const GLfloat* equation); -typedef void (GLAPIENTRY * PFNGLCLIPPLANEXPROC) (GLenum plane, const GLfixed* equation); -typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFPROC) (GLenum pname, GLfloat eqn[4]); -typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEXPROC) (GLenum pname, GLfixed eqn[4]); -typedef void (GLAPIENTRY * PFNGLGETFIXEDVPROC) (GLenum pname, GLfixed* params); -typedef void (GLAPIENTRY * PFNGLGETLIGHTXVPROC) (GLenum light, GLenum pname, GLfixed* params); -typedef void (GLAPIENTRY * PFNGLGETMATERIALXVPROC) (GLenum face, GLenum pname, GLfixed* params); -typedef void (GLAPIENTRY * PFNGLGETTEXENVXVPROC) (GLenum env, GLenum pname, GLfixed* params); -typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERXVPROC) (GLenum target, GLenum pname, GLfixed* params); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXPROC) (GLenum pname, GLfixed param); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXVPROC) (GLenum pname, const GLfixed* params); -typedef void (GLAPIENTRY * PFNGLPOINTSIZEPOINTEROESPROC) (GLenum type, GLsizei stride, const void *pointer); -typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXVPROC) (GLenum target, GLenum pname, const GLfixed* params); - -#define glClipPlanef GLEW_GET_FUN(__glewClipPlanef) -#define glClipPlanex GLEW_GET_FUN(__glewClipPlanex) -#define glGetClipPlanef GLEW_GET_FUN(__glewGetClipPlanef) -#define glGetClipPlanex GLEW_GET_FUN(__glewGetClipPlanex) -#define glGetFixedv GLEW_GET_FUN(__glewGetFixedv) -#define glGetLightxv GLEW_GET_FUN(__glewGetLightxv) -#define glGetMaterialxv GLEW_GET_FUN(__glewGetMaterialxv) -#define glGetTexEnvxv GLEW_GET_FUN(__glewGetTexEnvxv) -#define glGetTexParameterxv GLEW_GET_FUN(__glewGetTexParameterxv) -#define glPointParameterx GLEW_GET_FUN(__glewPointParameterx) -#define glPointParameterxv GLEW_GET_FUN(__glewPointParameterxv) -#define glPointSizePointerOES GLEW_GET_FUN(__glewPointSizePointerOES) -#define glTexParameterxv GLEW_GET_FUN(__glewTexParameterxv) - -#define GLEW_REGAL_ES1_1_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_1_compatibility) - -#endif /* GL_REGAL_ES1_1_compatibility */ - -/* ---------------------------- GL_REGAL_enable ---------------------------- */ - -#ifndef GL_REGAL_enable -#define GL_REGAL_enable 1 - -#define GL_ERROR_REGAL 0x9322 -#define GL_DEBUG_REGAL 0x9323 -#define GL_LOG_REGAL 0x9324 -#define GL_EMULATION_REGAL 0x9325 -#define GL_DRIVER_REGAL 0x9326 -#define GL_MISSING_REGAL 0x9360 -#define GL_TRACE_REGAL 0x9361 -#define GL_CACHE_REGAL 0x9362 -#define GL_CODE_REGAL 0x9363 -#define GL_STATISTICS_REGAL 0x9364 - -#define GLEW_REGAL_enable GLEW_GET_VAR(__GLEW_REGAL_enable) - -#endif /* GL_REGAL_enable */ - -/* ------------------------- GL_REGAL_error_string ------------------------- */ - -#ifndef GL_REGAL_error_string -#define GL_REGAL_error_string 1 - -typedef const GLchar* (GLAPIENTRY * PFNGLERRORSTRINGREGALPROC) (GLenum error); - -#define glErrorStringREGAL GLEW_GET_FUN(__glewErrorStringREGAL) - -#define GLEW_REGAL_error_string GLEW_GET_VAR(__GLEW_REGAL_error_string) - -#endif /* GL_REGAL_error_string */ - -/* ------------------------ GL_REGAL_extension_query ----------------------- */ - -#ifndef GL_REGAL_extension_query -#define GL_REGAL_extension_query 1 - -typedef GLboolean (GLAPIENTRY * PFNGLGETEXTENSIONREGALPROC) (const GLchar* ext); -typedef GLboolean (GLAPIENTRY * PFNGLISSUPPORTEDREGALPROC) (const GLchar* ext); - -#define glGetExtensionREGAL GLEW_GET_FUN(__glewGetExtensionREGAL) -#define glIsSupportedREGAL GLEW_GET_FUN(__glewIsSupportedREGAL) - -#define GLEW_REGAL_extension_query GLEW_GET_VAR(__GLEW_REGAL_extension_query) - -#endif /* GL_REGAL_extension_query */ - -/* ------------------------------ GL_REGAL_log ----------------------------- */ - -#ifndef GL_REGAL_log -#define GL_REGAL_log 1 - -#define GL_LOG_ERROR_REGAL 0x9319 -#define GL_LOG_WARNING_REGAL 0x931A -#define GL_LOG_INFO_REGAL 0x931B -#define GL_LOG_APP_REGAL 0x931C -#define GL_LOG_DRIVER_REGAL 0x931D -#define GL_LOG_INTERNAL_REGAL 0x931E -#define GL_LOG_DEBUG_REGAL 0x931F -#define GL_LOG_STATUS_REGAL 0x9320 -#define GL_LOG_HTTP_REGAL 0x9321 - -typedef void (APIENTRY *GLLOGPROCREGAL)(GLenum stream, GLsizei length, const GLchar *message, void *context); - -typedef void (GLAPIENTRY * PFNGLLOGMESSAGECALLBACKREGALPROC) (GLLOGPROCREGAL callback); - -#define glLogMessageCallbackREGAL GLEW_GET_FUN(__glewLogMessageCallbackREGAL) - -#define GLEW_REGAL_log GLEW_GET_VAR(__GLEW_REGAL_log) - -#endif /* GL_REGAL_log */ - -/* ------------------------- GL_REGAL_proc_address ------------------------- */ - -#ifndef GL_REGAL_proc_address -#define GL_REGAL_proc_address 1 - -typedef void * (GLAPIENTRY * PFNGLGETPROCADDRESSREGALPROC) (const GLchar *name); - -#define glGetProcAddressREGAL GLEW_GET_FUN(__glewGetProcAddressREGAL) - -#define GLEW_REGAL_proc_address GLEW_GET_VAR(__GLEW_REGAL_proc_address) - -#endif /* GL_REGAL_proc_address */ - -/* ----------------------- GL_REND_screen_coordinates ---------------------- */ - -#ifndef GL_REND_screen_coordinates -#define GL_REND_screen_coordinates 1 - -#define GL_SCREEN_COORDINATES_REND 0x8490 -#define GL_INVERTED_SCREEN_W_REND 0x8491 - -#define GLEW_REND_screen_coordinates GLEW_GET_VAR(__GLEW_REND_screen_coordinates) - -#endif /* GL_REND_screen_coordinates */ - -/* ------------------------------- GL_S3_s3tc ------------------------------ */ - -#ifndef GL_S3_s3tc -#define GL_S3_s3tc 1 - -#define GL_RGB_S3TC 0x83A0 -#define GL_RGB4_S3TC 0x83A1 -#define GL_RGBA_S3TC 0x83A2 -#define GL_RGBA4_S3TC 0x83A3 -#define GL_RGBA_DXT5_S3TC 0x83A4 -#define GL_RGBA4_DXT5_S3TC 0x83A5 - -#define GLEW_S3_s3tc GLEW_GET_VAR(__GLEW_S3_s3tc) - -#endif /* GL_S3_s3tc */ - -/* ------------------------- GL_SGIS_clip_band_hint ------------------------ */ - -#ifndef GL_SGIS_clip_band_hint -#define GL_SGIS_clip_band_hint 1 - -#define GLEW_SGIS_clip_band_hint GLEW_GET_VAR(__GLEW_SGIS_clip_band_hint) - -#endif /* GL_SGIS_clip_band_hint */ - -/* -------------------------- GL_SGIS_color_range -------------------------- */ - -#ifndef GL_SGIS_color_range -#define GL_SGIS_color_range 1 - -#define GL_EXTENDED_RANGE_SGIS 0x85A5 -#define GL_MIN_RED_SGIS 0x85A6 -#define GL_MAX_RED_SGIS 0x85A7 -#define GL_MIN_GREEN_SGIS 0x85A8 -#define GL_MAX_GREEN_SGIS 0x85A9 -#define GL_MIN_BLUE_SGIS 0x85AA -#define GL_MAX_BLUE_SGIS 0x85AB -#define GL_MIN_ALPHA_SGIS 0x85AC -#define GL_MAX_ALPHA_SGIS 0x85AD - -#define GLEW_SGIS_color_range GLEW_GET_VAR(__GLEW_SGIS_color_range) - -#endif /* GL_SGIS_color_range */ - -/* ------------------------- GL_SGIS_detail_texture ------------------------ */ - -#ifndef GL_SGIS_detail_texture -#define GL_SGIS_detail_texture 1 - -typedef void (GLAPIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); -typedef void (GLAPIENTRY * PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat* points); - -#define glDetailTexFuncSGIS GLEW_GET_FUN(__glewDetailTexFuncSGIS) -#define glGetDetailTexFuncSGIS GLEW_GET_FUN(__glewGetDetailTexFuncSGIS) - -#define GLEW_SGIS_detail_texture GLEW_GET_VAR(__GLEW_SGIS_detail_texture) - -#endif /* GL_SGIS_detail_texture */ - -/* -------------------------- GL_SGIS_fog_function ------------------------- */ - -#ifndef GL_SGIS_fog_function -#define GL_SGIS_fog_function 1 - -typedef void (GLAPIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat* points); -typedef void (GLAPIENTRY * PFNGLGETFOGFUNCSGISPROC) (GLfloat* points); - -#define glFogFuncSGIS GLEW_GET_FUN(__glewFogFuncSGIS) -#define glGetFogFuncSGIS GLEW_GET_FUN(__glewGetFogFuncSGIS) - -#define GLEW_SGIS_fog_function GLEW_GET_VAR(__GLEW_SGIS_fog_function) - -#endif /* GL_SGIS_fog_function */ - -/* ------------------------ GL_SGIS_generate_mipmap ------------------------ */ - -#ifndef GL_SGIS_generate_mipmap -#define GL_SGIS_generate_mipmap 1 - -#define GL_GENERATE_MIPMAP_SGIS 0x8191 -#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 - -#define GLEW_SGIS_generate_mipmap GLEW_GET_VAR(__GLEW_SGIS_generate_mipmap) - -#endif /* GL_SGIS_generate_mipmap */ - -/* -------------------------- GL_SGIS_line_texgen -------------------------- */ - -#ifndef GL_SGIS_line_texgen -#define GL_SGIS_line_texgen 1 - -#define GLEW_SGIS_line_texgen GLEW_GET_VAR(__GLEW_SGIS_line_texgen) - -#endif /* GL_SGIS_line_texgen */ - -/* -------------------------- GL_SGIS_multisample -------------------------- */ - -#ifndef GL_SGIS_multisample -#define GL_SGIS_multisample 1 - -#define GL_MULTISAMPLE_SGIS 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F -#define GL_SAMPLE_MASK_SGIS 0x80A0 -#define GL_1PASS_SGIS 0x80A1 -#define GL_2PASS_0_SGIS 0x80A2 -#define GL_2PASS_1_SGIS 0x80A3 -#define GL_4PASS_0_SGIS 0x80A4 -#define GL_4PASS_1_SGIS 0x80A5 -#define GL_4PASS_2_SGIS 0x80A6 -#define GL_4PASS_3_SGIS 0x80A7 -#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 -#define GL_SAMPLES_SGIS 0x80A9 -#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA -#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB -#define GL_SAMPLE_PATTERN_SGIS 0x80AC - -typedef void (GLAPIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); -typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); - -#define glSampleMaskSGIS GLEW_GET_FUN(__glewSampleMaskSGIS) -#define glSamplePatternSGIS GLEW_GET_FUN(__glewSamplePatternSGIS) - -#define GLEW_SGIS_multisample GLEW_GET_VAR(__GLEW_SGIS_multisample) - -#endif /* GL_SGIS_multisample */ - -/* -------------------------- GL_SGIS_multitexture ------------------------- */ - -#ifndef GL_SGIS_multitexture -#define GL_SGIS_multitexture 1 - -#define GL_SELECTED_TEXTURE_SGIS 0x83C0 -#define GL_SELECTED_TEXTURE_COORD_SET_SGIS 0x83C1 -#define GL_SELECTED_TEXTURE_TRANSFORM_SGIS 0x83C2 -#define GL_MAX_TEXTURES_SGIS 0x83C3 -#define GL_MAX_TEXTURE_COORD_SETS_SGIS 0x83C4 -#define GL_TEXTURE_COORD_SET_INTERLEAVE_FACTOR_SGIS 0x83C5 -#define GL_TEXTURE_ENV_COORD_SET_SGIS 0x83C6 -#define GL_TEXTURE0_SGIS 0x83C7 -#define GL_TEXTURE1_SGIS 0x83C8 -#define GL_TEXTURE2_SGIS 0x83C9 -#define GL_TEXTURE3_SGIS 0x83CA - -typedef void (GLAPIENTRY * PFNGLINTERLEAVEDTEXTURECOORDSETSSGISPROC) (GLint factor); -typedef void (GLAPIENTRY * PFNGLSELECTTEXTURECOORDSETSGISPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLSELECTTEXTURESGISPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLSELECTTEXTURETRANSFORMSGISPROC) (GLenum target); - -#define glInterleavedTextureCoordSetsSGIS GLEW_GET_FUN(__glewInterleavedTextureCoordSetsSGIS) -#define glSelectTextureCoordSetSGIS GLEW_GET_FUN(__glewSelectTextureCoordSetSGIS) -#define glSelectTextureSGIS GLEW_GET_FUN(__glewSelectTextureSGIS) -#define glSelectTextureTransformSGIS GLEW_GET_FUN(__glewSelectTextureTransformSGIS) - -#define GLEW_SGIS_multitexture GLEW_GET_VAR(__GLEW_SGIS_multitexture) - -#endif /* GL_SGIS_multitexture */ - -/* ------------------------- GL_SGIS_pixel_texture ------------------------- */ - -#ifndef GL_SGIS_pixel_texture -#define GL_SGIS_pixel_texture 1 - -#define GLEW_SGIS_pixel_texture GLEW_GET_VAR(__GLEW_SGIS_pixel_texture) - -#endif /* GL_SGIS_pixel_texture */ - -/* ----------------------- GL_SGIS_point_line_texgen ----------------------- */ - -#ifndef GL_SGIS_point_line_texgen -#define GL_SGIS_point_line_texgen 1 - -#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 -#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 -#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 -#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 -#define GL_EYE_POINT_SGIS 0x81F4 -#define GL_OBJECT_POINT_SGIS 0x81F5 -#define GL_EYE_LINE_SGIS 0x81F6 -#define GL_OBJECT_LINE_SGIS 0x81F7 - -#define GLEW_SGIS_point_line_texgen GLEW_GET_VAR(__GLEW_SGIS_point_line_texgen) - -#endif /* GL_SGIS_point_line_texgen */ - -/* ----------------------- GL_SGIS_shared_multisample ---------------------- */ - -#ifndef GL_SGIS_shared_multisample -#define GL_SGIS_shared_multisample 1 - -typedef void (GLAPIENTRY * PFNGLMULTISAMPLESUBRECTPOSSGISPROC) (GLint x, GLint y); - -#define glMultisampleSubRectPosSGIS GLEW_GET_FUN(__glewMultisampleSubRectPosSGIS) - -#define GLEW_SGIS_shared_multisample GLEW_GET_VAR(__GLEW_SGIS_shared_multisample) - -#endif /* GL_SGIS_shared_multisample */ - -/* ------------------------ GL_SGIS_sharpen_texture ------------------------ */ - -#ifndef GL_SGIS_sharpen_texture -#define GL_SGIS_sharpen_texture 1 - -typedef void (GLAPIENTRY * PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat* points); -typedef void (GLAPIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); - -#define glGetSharpenTexFuncSGIS GLEW_GET_FUN(__glewGetSharpenTexFuncSGIS) -#define glSharpenTexFuncSGIS GLEW_GET_FUN(__glewSharpenTexFuncSGIS) - -#define GLEW_SGIS_sharpen_texture GLEW_GET_VAR(__GLEW_SGIS_sharpen_texture) - -#endif /* GL_SGIS_sharpen_texture */ - -/* --------------------------- GL_SGIS_texture4D --------------------------- */ - -#ifndef GL_SGIS_texture4D -#define GL_SGIS_texture4D 1 - -typedef void (GLAPIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLenum format, GLenum type, const void *pixels); - -#define glTexImage4DSGIS GLEW_GET_FUN(__glewTexImage4DSGIS) -#define glTexSubImage4DSGIS GLEW_GET_FUN(__glewTexSubImage4DSGIS) - -#define GLEW_SGIS_texture4D GLEW_GET_VAR(__GLEW_SGIS_texture4D) - -#endif /* GL_SGIS_texture4D */ - -/* ---------------------- GL_SGIS_texture_border_clamp --------------------- */ - -#ifndef GL_SGIS_texture_border_clamp -#define GL_SGIS_texture_border_clamp 1 - -#define GL_CLAMP_TO_BORDER_SGIS 0x812D - -#define GLEW_SGIS_texture_border_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_border_clamp) - -#endif /* GL_SGIS_texture_border_clamp */ - -/* ----------------------- GL_SGIS_texture_edge_clamp ---------------------- */ - -#ifndef GL_SGIS_texture_edge_clamp -#define GL_SGIS_texture_edge_clamp 1 - -#define GL_CLAMP_TO_EDGE_SGIS 0x812F - -#define GLEW_SGIS_texture_edge_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_edge_clamp) - -#endif /* GL_SGIS_texture_edge_clamp */ - -/* ------------------------ GL_SGIS_texture_filter4 ------------------------ */ - -#ifndef GL_SGIS_texture_filter4 -#define GL_SGIS_texture_filter4 1 - -typedef void (GLAPIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat* weights); -typedef void (GLAPIENTRY * PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat* weights); - -#define glGetTexFilterFuncSGIS GLEW_GET_FUN(__glewGetTexFilterFuncSGIS) -#define glTexFilterFuncSGIS GLEW_GET_FUN(__glewTexFilterFuncSGIS) - -#define GLEW_SGIS_texture_filter4 GLEW_GET_VAR(__GLEW_SGIS_texture_filter4) - -#endif /* GL_SGIS_texture_filter4 */ - -/* -------------------------- GL_SGIS_texture_lod -------------------------- */ - -#ifndef GL_SGIS_texture_lod -#define GL_SGIS_texture_lod 1 - -#define GL_TEXTURE_MIN_LOD_SGIS 0x813A -#define GL_TEXTURE_MAX_LOD_SGIS 0x813B -#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C -#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D - -#define GLEW_SGIS_texture_lod GLEW_GET_VAR(__GLEW_SGIS_texture_lod) - -#endif /* GL_SGIS_texture_lod */ - -/* ------------------------- GL_SGIS_texture_select ------------------------ */ - -#ifndef GL_SGIS_texture_select -#define GL_SGIS_texture_select 1 - -#define GLEW_SGIS_texture_select GLEW_GET_VAR(__GLEW_SGIS_texture_select) - -#endif /* GL_SGIS_texture_select */ - -/* ----------------------------- GL_SGIX_async ----------------------------- */ - -#ifndef GL_SGIX_async -#define GL_SGIX_async 1 - -#define GL_ASYNC_MARKER_SGIX 0x8329 - -typedef void (GLAPIENTRY * PFNGLASYNCMARKERSGIXPROC) (GLuint marker); -typedef void (GLAPIENTRY * PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); -typedef GLint (GLAPIENTRY * PFNGLFINISHASYNCSGIXPROC) (GLuint* markerp); -typedef GLuint (GLAPIENTRY * PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); -typedef GLboolean (GLAPIENTRY * PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); -typedef GLint (GLAPIENTRY * PFNGLPOLLASYNCSGIXPROC) (GLuint* markerp); - -#define glAsyncMarkerSGIX GLEW_GET_FUN(__glewAsyncMarkerSGIX) -#define glDeleteAsyncMarkersSGIX GLEW_GET_FUN(__glewDeleteAsyncMarkersSGIX) -#define glFinishAsyncSGIX GLEW_GET_FUN(__glewFinishAsyncSGIX) -#define glGenAsyncMarkersSGIX GLEW_GET_FUN(__glewGenAsyncMarkersSGIX) -#define glIsAsyncMarkerSGIX GLEW_GET_FUN(__glewIsAsyncMarkerSGIX) -#define glPollAsyncSGIX GLEW_GET_FUN(__glewPollAsyncSGIX) - -#define GLEW_SGIX_async GLEW_GET_VAR(__GLEW_SGIX_async) - -#endif /* GL_SGIX_async */ - -/* ------------------------ GL_SGIX_async_histogram ------------------------ */ - -#ifndef GL_SGIX_async_histogram -#define GL_SGIX_async_histogram 1 - -#define GL_ASYNC_HISTOGRAM_SGIX 0x832C -#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D - -#define GLEW_SGIX_async_histogram GLEW_GET_VAR(__GLEW_SGIX_async_histogram) - -#endif /* GL_SGIX_async_histogram */ - -/* -------------------------- GL_SGIX_async_pixel -------------------------- */ - -#ifndef GL_SGIX_async_pixel -#define GL_SGIX_async_pixel 1 - -#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C -#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D -#define GL_ASYNC_READ_PIXELS_SGIX 0x835E -#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F -#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 -#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 - -#define GLEW_SGIX_async_pixel GLEW_GET_VAR(__GLEW_SGIX_async_pixel) - -#endif /* GL_SGIX_async_pixel */ - -/* ----------------------- GL_SGIX_bali_g_instruments ---------------------- */ - -#ifndef GL_SGIX_bali_g_instruments -#define GL_SGIX_bali_g_instruments 1 - -#define GL_BALI_NUM_TRIS_CULLED_INSTRUMENT 0x6080 -#define GL_BALI_NUM_PRIMS_CLIPPED_INSTRUMENT 0x6081 -#define GL_BALI_NUM_PRIMS_REJECT_INSTRUMENT 0x6082 -#define GL_BALI_NUM_PRIMS_CLIP_RESULT_INSTRUMENT 0x6083 - -#define GLEW_SGIX_bali_g_instruments GLEW_GET_VAR(__GLEW_SGIX_bali_g_instruments) - -#endif /* GL_SGIX_bali_g_instruments */ - -/* ----------------------- GL_SGIX_bali_r_instruments ---------------------- */ - -#ifndef GL_SGIX_bali_r_instruments -#define GL_SGIX_bali_r_instruments 1 - -#define GL_BALI_FRAGMENTS_GENERATED_INSTRUMENT 0x6090 -#define GL_BALI_DEPTH_PASS_INSTRUMENT 0x6091 -#define GL_BALI_R_CHIP_COUNT 0x6092 - -#define GLEW_SGIX_bali_r_instruments GLEW_GET_VAR(__GLEW_SGIX_bali_r_instruments) - -#endif /* GL_SGIX_bali_r_instruments */ - -/* --------------------- GL_SGIX_bali_timer_instruments -------------------- */ - -#ifndef GL_SGIX_bali_timer_instruments -#define GL_SGIX_bali_timer_instruments 1 - -#define GLEW_SGIX_bali_timer_instruments GLEW_GET_VAR(__GLEW_SGIX_bali_timer_instruments) - -#endif /* GL_SGIX_bali_timer_instruments */ - -/* ----------------------- GL_SGIX_blend_alpha_minmax ---------------------- */ - -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_SGIX_blend_alpha_minmax 1 - -#define GL_ALPHA_MIN_SGIX 0x8320 -#define GL_ALPHA_MAX_SGIX 0x8321 - -#define GLEW_SGIX_blend_alpha_minmax GLEW_GET_VAR(__GLEW_SGIX_blend_alpha_minmax) - -#endif /* GL_SGIX_blend_alpha_minmax */ - -/* --------------------------- GL_SGIX_blend_cadd -------------------------- */ - -#ifndef GL_SGIX_blend_cadd -#define GL_SGIX_blend_cadd 1 - -#define GL_FUNC_COMPLEX_ADD_EXT 0x601C - -#define GLEW_SGIX_blend_cadd GLEW_GET_VAR(__GLEW_SGIX_blend_cadd) - -#endif /* GL_SGIX_blend_cadd */ - -/* ------------------------ GL_SGIX_blend_cmultiply ------------------------ */ - -#ifndef GL_SGIX_blend_cmultiply -#define GL_SGIX_blend_cmultiply 1 - -#define GL_FUNC_COMPLEX_MULTIPLY_EXT 0x601B - -#define GLEW_SGIX_blend_cmultiply GLEW_GET_VAR(__GLEW_SGIX_blend_cmultiply) - -#endif /* GL_SGIX_blend_cmultiply */ - -/* --------------------- GL_SGIX_calligraphic_fragment --------------------- */ - -#ifndef GL_SGIX_calligraphic_fragment -#define GL_SGIX_calligraphic_fragment 1 - -#define GLEW_SGIX_calligraphic_fragment GLEW_GET_VAR(__GLEW_SGIX_calligraphic_fragment) - -#endif /* GL_SGIX_calligraphic_fragment */ - -/* ---------------------------- GL_SGIX_clipmap ---------------------------- */ - -#ifndef GL_SGIX_clipmap -#define GL_SGIX_clipmap 1 - -#define GLEW_SGIX_clipmap GLEW_GET_VAR(__GLEW_SGIX_clipmap) - -#endif /* GL_SGIX_clipmap */ - -/* --------------------- GL_SGIX_color_matrix_accuracy --------------------- */ - -#ifndef GL_SGIX_color_matrix_accuracy -#define GL_SGIX_color_matrix_accuracy 1 - -#define GL_COLOR_MATRIX_HINT 0x8317 - -#define GLEW_SGIX_color_matrix_accuracy GLEW_GET_VAR(__GLEW_SGIX_color_matrix_accuracy) - -#endif /* GL_SGIX_color_matrix_accuracy */ - -/* --------------------- GL_SGIX_color_table_index_mode -------------------- */ - -#ifndef GL_SGIX_color_table_index_mode -#define GL_SGIX_color_table_index_mode 1 - -#define GLEW_SGIX_color_table_index_mode GLEW_GET_VAR(__GLEW_SGIX_color_table_index_mode) - -#endif /* GL_SGIX_color_table_index_mode */ - -/* ------------------------- GL_SGIX_complex_polar ------------------------- */ - -#ifndef GL_SGIX_complex_polar -#define GL_SGIX_complex_polar 1 - -#define GLEW_SGIX_complex_polar GLEW_GET_VAR(__GLEW_SGIX_complex_polar) - -#endif /* GL_SGIX_complex_polar */ - -/* ---------------------- GL_SGIX_convolution_accuracy --------------------- */ - -#ifndef GL_SGIX_convolution_accuracy -#define GL_SGIX_convolution_accuracy 1 - -#define GL_CONVOLUTION_HINT_SGIX 0x8316 - -#define GLEW_SGIX_convolution_accuracy GLEW_GET_VAR(__GLEW_SGIX_convolution_accuracy) - -#endif /* GL_SGIX_convolution_accuracy */ - -/* ---------------------------- GL_SGIX_cube_map --------------------------- */ - -#ifndef GL_SGIX_cube_map -#define GL_SGIX_cube_map 1 - -#define GL_ENV_MAP_SGIX 0x8340 -#define GL_CUBE_MAP_SGIX 0x8341 -#define GL_CUBE_MAP_ZP_SGIX 0x8342 -#define GL_CUBE_MAP_ZN_SGIX 0x8343 -#define GL_CUBE_MAP_XN_SGIX 0x8344 -#define GL_CUBE_MAP_XP_SGIX 0x8345 -#define GL_CUBE_MAP_YN_SGIX 0x8346 -#define GL_CUBE_MAP_YP_SGIX 0x8347 -#define GL_CUBE_MAP_BINDING_SGIX 0x8348 - -#define GLEW_SGIX_cube_map GLEW_GET_VAR(__GLEW_SGIX_cube_map) - -#endif /* GL_SGIX_cube_map */ - -/* ------------------------ GL_SGIX_cylinder_texgen ------------------------ */ - -#ifndef GL_SGIX_cylinder_texgen -#define GL_SGIX_cylinder_texgen 1 - -#define GLEW_SGIX_cylinder_texgen GLEW_GET_VAR(__GLEW_SGIX_cylinder_texgen) - -#endif /* GL_SGIX_cylinder_texgen */ - -/* ---------------------------- GL_SGIX_datapipe --------------------------- */ - -#ifndef GL_SGIX_datapipe -#define GL_SGIX_datapipe 1 - -#define GL_GEOMETRY_BIT 0x1 -#define GL_IMAGE_BIT 0x2 - -typedef void (GLAPIENTRY * PFNGLADDRESSSPACEPROC) (GLenum space, GLbitfield mask); -typedef GLint (GLAPIENTRY * PFNGLDATAPIPEPROC) (GLenum space); - -#define glAddressSpace GLEW_GET_FUN(__glewAddressSpace) -#define glDataPipe GLEW_GET_FUN(__glewDataPipe) - -#define GLEW_SGIX_datapipe GLEW_GET_VAR(__GLEW_SGIX_datapipe) - -#endif /* GL_SGIX_datapipe */ - -/* --------------------------- GL_SGIX_decimation -------------------------- */ - -#ifndef GL_SGIX_decimation -#define GL_SGIX_decimation 1 - -#define GLEW_SGIX_decimation GLEW_GET_VAR(__GLEW_SGIX_decimation) - -#endif /* GL_SGIX_decimation */ - -/* --------------------- GL_SGIX_depth_pass_instrument --------------------- */ - -#ifndef GL_SGIX_depth_pass_instrument -#define GL_SGIX_depth_pass_instrument 1 - -#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 -#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 -#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 - -#define GLEW_SGIX_depth_pass_instrument GLEW_GET_VAR(__GLEW_SGIX_depth_pass_instrument) - -#endif /* GL_SGIX_depth_pass_instrument */ - -/* ------------------------- GL_SGIX_depth_texture ------------------------- */ - -#ifndef GL_SGIX_depth_texture -#define GL_SGIX_depth_texture 1 - -#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 -#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 -#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 - -#define GLEW_SGIX_depth_texture GLEW_GET_VAR(__GLEW_SGIX_depth_texture) - -#endif /* GL_SGIX_depth_texture */ - -/* ------------------------------ GL_SGIX_dvc ------------------------------ */ - -#ifndef GL_SGIX_dvc -#define GL_SGIX_dvc 1 - -#define GLEW_SGIX_dvc GLEW_GET_VAR(__GLEW_SGIX_dvc) - -#endif /* GL_SGIX_dvc */ - -/* -------------------------- GL_SGIX_flush_raster ------------------------- */ - -#ifndef GL_SGIX_flush_raster -#define GL_SGIX_flush_raster 1 - -typedef void (GLAPIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void); - -#define glFlushRasterSGIX GLEW_GET_FUN(__glewFlushRasterSGIX) - -#define GLEW_SGIX_flush_raster GLEW_GET_VAR(__GLEW_SGIX_flush_raster) - -#endif /* GL_SGIX_flush_raster */ - -/* --------------------------- GL_SGIX_fog_blend --------------------------- */ - -#ifndef GL_SGIX_fog_blend -#define GL_SGIX_fog_blend 1 - -#define GL_FOG_BLEND_ALPHA_SGIX 0x81FE -#define GL_FOG_BLEND_COLOR_SGIX 0x81FF - -#define GLEW_SGIX_fog_blend GLEW_GET_VAR(__GLEW_SGIX_fog_blend) - -#endif /* GL_SGIX_fog_blend */ - -/* ---------------------- GL_SGIX_fog_factor_to_alpha ---------------------- */ - -#ifndef GL_SGIX_fog_factor_to_alpha -#define GL_SGIX_fog_factor_to_alpha 1 - -#define GLEW_SGIX_fog_factor_to_alpha GLEW_GET_VAR(__GLEW_SGIX_fog_factor_to_alpha) - -#endif /* GL_SGIX_fog_factor_to_alpha */ - -/* --------------------------- GL_SGIX_fog_layers -------------------------- */ - -#ifndef GL_SGIX_fog_layers -#define GL_SGIX_fog_layers 1 - -#define GL_FOG_TYPE_SGIX 0x8323 -#define GL_UNIFORM_SGIX 0x8324 -#define GL_LAYERED_SGIX 0x8325 -#define GL_FOG_GROUND_PLANE_SGIX 0x8326 -#define GL_FOG_LAYERS_POINTS_SGIX 0x8327 -#define GL_MAX_FOG_LAYERS_POINTS_SGIX 0x8328 - -typedef void (GLAPIENTRY * PFNGLFOGLAYERSSGIXPROC) (GLsizei n, const GLfloat* points); -typedef void (GLAPIENTRY * PFNGLGETFOGLAYERSSGIXPROC) (GLfloat* points); - -#define glFogLayersSGIX GLEW_GET_FUN(__glewFogLayersSGIX) -#define glGetFogLayersSGIX GLEW_GET_FUN(__glewGetFogLayersSGIX) - -#define GLEW_SGIX_fog_layers GLEW_GET_VAR(__GLEW_SGIX_fog_layers) - -#endif /* GL_SGIX_fog_layers */ - -/* --------------------------- GL_SGIX_fog_offset -------------------------- */ - -#ifndef GL_SGIX_fog_offset -#define GL_SGIX_fog_offset 1 - -#define GL_FOG_OFFSET_SGIX 0x8198 -#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 - -#define GLEW_SGIX_fog_offset GLEW_GET_VAR(__GLEW_SGIX_fog_offset) - -#endif /* GL_SGIX_fog_offset */ - -/* --------------------------- GL_SGIX_fog_patchy -------------------------- */ - -#ifndef GL_SGIX_fog_patchy -#define GL_SGIX_fog_patchy 1 - -#define GLEW_SGIX_fog_patchy GLEW_GET_VAR(__GLEW_SGIX_fog_patchy) - -#endif /* GL_SGIX_fog_patchy */ - -/* --------------------------- GL_SGIX_fog_scale --------------------------- */ - -#ifndef GL_SGIX_fog_scale -#define GL_SGIX_fog_scale 1 - -#define GL_FOG_SCALE_SGIX 0x81FC -#define GL_FOG_SCALE_VALUE_SGIX 0x81FD - -#define GLEW_SGIX_fog_scale GLEW_GET_VAR(__GLEW_SGIX_fog_scale) - -#endif /* GL_SGIX_fog_scale */ - -/* -------------------------- GL_SGIX_fog_texture -------------------------- */ - -#ifndef GL_SGIX_fog_texture -#define GL_SGIX_fog_texture 1 - -typedef void (GLAPIENTRY * PFNGLTEXTUREFOGSGIXPROC) (GLenum pname); - -#define glTextureFogSGIX GLEW_GET_FUN(__glewTextureFogSGIX) - -#define GLEW_SGIX_fog_texture GLEW_GET_VAR(__GLEW_SGIX_fog_texture) - -#endif /* GL_SGIX_fog_texture */ - -/* -------------------- GL_SGIX_fragment_lighting_space -------------------- */ - -#ifndef GL_SGIX_fragment_lighting_space -#define GL_SGIX_fragment_lighting_space 1 - -#define GL_EYE_SPACE_SGIX 0x8436 -#define GL_TANGENT_SPACE_SGIX 0x8437 -#define GL_OBJECT_SPACE_SGIX 0x8438 -#define GL_FRAGMENT_LIGHT_SPACE_SGIX 0x843D - -#define GLEW_SGIX_fragment_lighting_space GLEW_GET_VAR(__GLEW_SGIX_fragment_lighting_space) - -#endif /* GL_SGIX_fragment_lighting_space */ - -/* ------------------- GL_SGIX_fragment_specular_lighting ------------------ */ - -#ifndef GL_SGIX_fragment_specular_lighting -#define GL_SGIX_fragment_specular_lighting 1 - -typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, const GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, const GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum value, GLfloat* data); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum value, GLint* data); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat* data); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint* data); - -#define glFragmentColorMaterialSGIX GLEW_GET_FUN(__glewFragmentColorMaterialSGIX) -#define glFragmentLightModelfSGIX GLEW_GET_FUN(__glewFragmentLightModelfSGIX) -#define glFragmentLightModelfvSGIX GLEW_GET_FUN(__glewFragmentLightModelfvSGIX) -#define glFragmentLightModeliSGIX GLEW_GET_FUN(__glewFragmentLightModeliSGIX) -#define glFragmentLightModelivSGIX GLEW_GET_FUN(__glewFragmentLightModelivSGIX) -#define glFragmentLightfSGIX GLEW_GET_FUN(__glewFragmentLightfSGIX) -#define glFragmentLightfvSGIX GLEW_GET_FUN(__glewFragmentLightfvSGIX) -#define glFragmentLightiSGIX GLEW_GET_FUN(__glewFragmentLightiSGIX) -#define glFragmentLightivSGIX GLEW_GET_FUN(__glewFragmentLightivSGIX) -#define glFragmentMaterialfSGIX GLEW_GET_FUN(__glewFragmentMaterialfSGIX) -#define glFragmentMaterialfvSGIX GLEW_GET_FUN(__glewFragmentMaterialfvSGIX) -#define glFragmentMaterialiSGIX GLEW_GET_FUN(__glewFragmentMaterialiSGIX) -#define glFragmentMaterialivSGIX GLEW_GET_FUN(__glewFragmentMaterialivSGIX) -#define glGetFragmentLightfvSGIX GLEW_GET_FUN(__glewGetFragmentLightfvSGIX) -#define glGetFragmentLightivSGIX GLEW_GET_FUN(__glewGetFragmentLightivSGIX) -#define glGetFragmentMaterialfvSGIX GLEW_GET_FUN(__glewGetFragmentMaterialfvSGIX) -#define glGetFragmentMaterialivSGIX GLEW_GET_FUN(__glewGetFragmentMaterialivSGIX) - -#define GLEW_SGIX_fragment_specular_lighting GLEW_GET_VAR(__GLEW_SGIX_fragment_specular_lighting) - -#endif /* GL_SGIX_fragment_specular_lighting */ - -/* ---------------------- GL_SGIX_fragments_instrument --------------------- */ - -#ifndef GL_SGIX_fragments_instrument -#define GL_SGIX_fragments_instrument 1 - -#define GL_FRAGMENTS_INSTRUMENT_SGIX 0x8313 -#define GL_FRAGMENTS_INSTRUMENT_COUNTERS_SGIX 0x8314 -#define GL_FRAGMENTS_INSTRUMENT_MAX_SGIX 0x8315 - -#define GLEW_SGIX_fragments_instrument GLEW_GET_VAR(__GLEW_SGIX_fragments_instrument) - -#endif /* GL_SGIX_fragments_instrument */ - -/* --------------------------- GL_SGIX_framezoom --------------------------- */ - -#ifndef GL_SGIX_framezoom -#define GL_SGIX_framezoom 1 - -typedef void (GLAPIENTRY * PFNGLFRAMEZOOMSGIXPROC) (GLint factor); - -#define glFrameZoomSGIX GLEW_GET_FUN(__glewFrameZoomSGIX) - -#define GLEW_SGIX_framezoom GLEW_GET_VAR(__GLEW_SGIX_framezoom) - -#endif /* GL_SGIX_framezoom */ - -/* -------------------------- GL_SGIX_icc_texture -------------------------- */ - -#ifndef GL_SGIX_icc_texture -#define GL_SGIX_icc_texture 1 - -#define GL_RGB_ICC_SGIX 0x8460 -#define GL_RGBA_ICC_SGIX 0x8461 -#define GL_ALPHA_ICC_SGIX 0x8462 -#define GL_LUMINANCE_ICC_SGIX 0x8463 -#define GL_INTENSITY_ICC_SGIX 0x8464 -#define GL_LUMINANCE_ALPHA_ICC_SGIX 0x8465 -#define GL_R5_G6_B5_ICC_SGIX 0x8466 -#define GL_R5_G6_B5_A8_ICC_SGIX 0x8467 -#define GL_ALPHA16_ICC_SGIX 0x8468 -#define GL_LUMINANCE16_ICC_SGIX 0x8469 -#define GL_INTENSITY16_ICC_SGIX 0x846A -#define GL_LUMINANCE16_ALPHA8_ICC_SGIX 0x846B - -#define GLEW_SGIX_icc_texture GLEW_GET_VAR(__GLEW_SGIX_icc_texture) - -#endif /* GL_SGIX_icc_texture */ - -/* ------------------------ GL_SGIX_igloo_interface ------------------------ */ - -#ifndef GL_SGIX_igloo_interface -#define GL_SGIX_igloo_interface 1 - -#define GL_IGLOO_FULLSCREEN_SGIX 0x819E -#define GL_IGLOO_VIEWPORT_OFFSET_SGIX 0x819F -#define GL_IGLOO_SWAPTMESH_SGIX 0x81A0 -#define GL_IGLOO_COLORNORMAL_SGIX 0x81A1 -#define GL_IGLOO_IRISGL_MODE_SGIX 0x81A2 -#define GL_IGLOO_LMC_COLOR_SGIX 0x81A3 -#define GL_IGLOO_TMESHMODE_SGIX 0x81A4 -#define GL_LIGHT31 0xBEAD - -typedef void (GLAPIENTRY * PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, void *param); - -#define glIglooInterfaceSGIX GLEW_GET_FUN(__glewIglooInterfaceSGIX) - -#define GLEW_SGIX_igloo_interface GLEW_GET_VAR(__GLEW_SGIX_igloo_interface) - -#endif /* GL_SGIX_igloo_interface */ - -/* ----------------------- GL_SGIX_image_compression ----------------------- */ - -#ifndef GL_SGIX_image_compression -#define GL_SGIX_image_compression 1 - -#define GLEW_SGIX_image_compression GLEW_GET_VAR(__GLEW_SGIX_image_compression) - -#endif /* GL_SGIX_image_compression */ - -/* ---------------------- GL_SGIX_impact_pixel_texture --------------------- */ - -#ifndef GL_SGIX_impact_pixel_texture -#define GL_SGIX_impact_pixel_texture 1 - -#define GLEW_SGIX_impact_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_impact_pixel_texture) - -#endif /* GL_SGIX_impact_pixel_texture */ - -/* ------------------------ GL_SGIX_instrument_error ----------------------- */ - -#ifndef GL_SGIX_instrument_error -#define GL_SGIX_instrument_error 1 - -#define GLEW_SGIX_instrument_error GLEW_GET_VAR(__GLEW_SGIX_instrument_error) - -#endif /* GL_SGIX_instrument_error */ - -/* --------------------------- GL_SGIX_interlace --------------------------- */ - -#ifndef GL_SGIX_interlace -#define GL_SGIX_interlace 1 - -#define GL_INTERLACE_SGIX 0x8094 - -#define GLEW_SGIX_interlace GLEW_GET_VAR(__GLEW_SGIX_interlace) - -#endif /* GL_SGIX_interlace */ - -/* ------------------------- GL_SGIX_ir_instrument1 ------------------------ */ - -#ifndef GL_SGIX_ir_instrument1 -#define GL_SGIX_ir_instrument1 1 - -#define GLEW_SGIX_ir_instrument1 GLEW_GET_VAR(__GLEW_SGIX_ir_instrument1) - -#endif /* GL_SGIX_ir_instrument1 */ - -/* ----------------------- GL_SGIX_line_quality_hint ----------------------- */ - -#ifndef GL_SGIX_line_quality_hint -#define GL_SGIX_line_quality_hint 1 - -#define GL_LINE_QUALITY_HINT_SGIX 0x835B - -#define GLEW_SGIX_line_quality_hint GLEW_GET_VAR(__GLEW_SGIX_line_quality_hint) - -#endif /* GL_SGIX_line_quality_hint */ - -/* ------------------------- GL_SGIX_list_priority ------------------------- */ - -#ifndef GL_SGIX_list_priority -#define GL_SGIX_list_priority 1 - -#define GLEW_SGIX_list_priority GLEW_GET_VAR(__GLEW_SGIX_list_priority) - -#endif /* GL_SGIX_list_priority */ - -/* ----------------------------- GL_SGIX_mpeg1 ----------------------------- */ - -#ifndef GL_SGIX_mpeg1 -#define GL_SGIX_mpeg1 1 - -typedef void (GLAPIENTRY * PFNGLALLOCMPEGPREDICTORSSGIXPROC) (GLsizei width, GLsizei height, GLsizei n, GLuint* predictors); -typedef void (GLAPIENTRY * PFNGLDELETEMPEGPREDICTORSSGIXPROC) (GLsizei n, GLuint* predictors); -typedef void (GLAPIENTRY * PFNGLGENMPEGPREDICTORSSGIXPROC) (GLsizei n, GLuint* predictors); -typedef void (GLAPIENTRY * PFNGLGETMPEGPARAMETERFVSGIXPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMPEGPARAMETERIVSGIXPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMPEGPREDICTORSGIXPROC) (GLenum target, GLenum format, GLenum type, void *pixels); -typedef void (GLAPIENTRY * PFNGLGETMPEGQUANTTABLEUBVPROC) (GLenum target, GLubyte* values); -typedef GLboolean (GLAPIENTRY * PFNGLISMPEGPREDICTORSGIXPROC) (GLuint predictor); -typedef void (GLAPIENTRY * PFNGLMPEGPREDICTORSGIXPROC) (GLenum target, GLenum format, GLenum type, void *pixels); -typedef void (GLAPIENTRY * PFNGLMPEGQUANTTABLEUBVPROC) (GLenum target, GLubyte* values); -typedef void (GLAPIENTRY * PFNGLSWAPMPEGPREDICTORSSGIXPROC) (GLenum target0, GLenum target1); - -#define glAllocMPEGPredictorsSGIX GLEW_GET_FUN(__glewAllocMPEGPredictorsSGIX) -#define glDeleteMPEGPredictorsSGIX GLEW_GET_FUN(__glewDeleteMPEGPredictorsSGIX) -#define glGenMPEGPredictorsSGIX GLEW_GET_FUN(__glewGenMPEGPredictorsSGIX) -#define glGetMPEGParameterfvSGIX GLEW_GET_FUN(__glewGetMPEGParameterfvSGIX) -#define glGetMPEGParameterivSGIX GLEW_GET_FUN(__glewGetMPEGParameterivSGIX) -#define glGetMPEGPredictorSGIX GLEW_GET_FUN(__glewGetMPEGPredictorSGIX) -#define glGetMPEGQuantTableubv GLEW_GET_FUN(__glewGetMPEGQuantTableubv) -#define glIsMPEGPredictorSGIX GLEW_GET_FUN(__glewIsMPEGPredictorSGIX) -#define glMPEGPredictorSGIX GLEW_GET_FUN(__glewMPEGPredictorSGIX) -#define glMPEGQuantTableubv GLEW_GET_FUN(__glewMPEGQuantTableubv) -#define glSwapMPEGPredictorsSGIX GLEW_GET_FUN(__glewSwapMPEGPredictorsSGIX) - -#define GLEW_SGIX_mpeg1 GLEW_GET_VAR(__GLEW_SGIX_mpeg1) - -#endif /* GL_SGIX_mpeg1 */ - -/* ----------------------------- GL_SGIX_mpeg2 ----------------------------- */ - -#ifndef GL_SGIX_mpeg2 -#define GL_SGIX_mpeg2 1 - -#define GLEW_SGIX_mpeg2 GLEW_GET_VAR(__GLEW_SGIX_mpeg2) - -#endif /* GL_SGIX_mpeg2 */ - -/* ------------------ GL_SGIX_nonlinear_lighting_pervertex ----------------- */ - -#ifndef GL_SGIX_nonlinear_lighting_pervertex -#define GL_SGIX_nonlinear_lighting_pervertex 1 - -typedef void (GLAPIENTRY * PFNGLGETNONLINLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLint* terms, GLfloat *data); -typedef void (GLAPIENTRY * PFNGLGETNONLINMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLint* terms, const GLfloat *data); -typedef void (GLAPIENTRY * PFNGLNONLINLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLint terms, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLNONLINMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLint terms, const GLfloat* params); - -#define glGetNonlinLightfvSGIX GLEW_GET_FUN(__glewGetNonlinLightfvSGIX) -#define glGetNonlinMaterialfvSGIX GLEW_GET_FUN(__glewGetNonlinMaterialfvSGIX) -#define glNonlinLightfvSGIX GLEW_GET_FUN(__glewNonlinLightfvSGIX) -#define glNonlinMaterialfvSGIX GLEW_GET_FUN(__glewNonlinMaterialfvSGIX) - -#define GLEW_SGIX_nonlinear_lighting_pervertex GLEW_GET_VAR(__GLEW_SGIX_nonlinear_lighting_pervertex) - -#endif /* GL_SGIX_nonlinear_lighting_pervertex */ - -/* --------------------------- GL_SGIX_nurbs_eval -------------------------- */ - -#ifndef GL_SGIX_nurbs_eval -#define GL_SGIX_nurbs_eval 1 - -#define GL_MAP1_VERTEX_3_NURBS_SGIX 0x81CB -#define GL_MAP1_VERTEX_4_NURBS_SGIX 0x81CC -#define GL_MAP1_INDEX_NURBS_SGIX 0x81CD -#define GL_MAP1_COLOR_4_NURBS_SGIX 0x81CE -#define GL_MAP1_NORMAL_NURBS_SGIX 0x81CF -#define GL_MAP1_TEXTURE_COORD_1_NURBS_SGIX 0x81E0 -#define GL_MAP1_TEXTURE_COORD_2_NURBS_SGIX 0x81E1 -#define GL_MAP1_TEXTURE_COORD_3_NURBS_SGIX 0x81E2 -#define GL_MAP1_TEXTURE_COORD_4_NURBS_SGIX 0x81E3 -#define GL_MAP2_VERTEX_3_NURBS_SGIX 0x81E4 -#define GL_MAP2_VERTEX_4_NURBS_SGIX 0x81E5 -#define GL_MAP2_INDEX_NURBS_SGIX 0x81E6 -#define GL_MAP2_COLOR_4_NURBS_SGIX 0x81E7 -#define GL_MAP2_NORMAL_NURBS_SGIX 0x81E8 -#define GL_MAP2_TEXTURE_COORD_1_NURBS_SGIX 0x81E9 -#define GL_MAP2_TEXTURE_COORD_2_NURBS_SGIX 0x81EA -#define GL_MAP2_TEXTURE_COORD_3_NURBS_SGIX 0x81EB -#define GL_MAP2_TEXTURE_COORD_4_NURBS_SGIX 0x81EC -#define GL_NURBS_KNOT_COUNT_SGIX 0x81ED -#define GL_NURBS_KNOT_VECTOR_SGIX 0x81EE - -#define GLEW_SGIX_nurbs_eval GLEW_GET_VAR(__GLEW_SGIX_nurbs_eval) - -#endif /* GL_SGIX_nurbs_eval */ - -/* ---------------------- GL_SGIX_occlusion_instrument --------------------- */ - -#ifndef GL_SGIX_occlusion_instrument -#define GL_SGIX_occlusion_instrument 1 - -#define GL_OCCLUSION_INSTRUMENT_SGIX 0x6060 - -#define GLEW_SGIX_occlusion_instrument GLEW_GET_VAR(__GLEW_SGIX_occlusion_instrument) - -#endif /* GL_SGIX_occlusion_instrument */ - -/* ------------------------- GL_SGIX_packed_6bytes ------------------------- */ - -#ifndef GL_SGIX_packed_6bytes -#define GL_SGIX_packed_6bytes 1 - -#define GLEW_SGIX_packed_6bytes GLEW_GET_VAR(__GLEW_SGIX_packed_6bytes) - -#endif /* GL_SGIX_packed_6bytes */ - -/* ------------------------- GL_SGIX_pixel_texture ------------------------- */ - -#ifndef GL_SGIX_pixel_texture -#define GL_SGIX_pixel_texture 1 - -typedef void (GLAPIENTRY * PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); - -#define glPixelTexGenSGIX GLEW_GET_FUN(__glewPixelTexGenSGIX) - -#define GLEW_SGIX_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_pixel_texture) - -#endif /* GL_SGIX_pixel_texture */ - -/* ----------------------- GL_SGIX_pixel_texture_bits ---------------------- */ - -#ifndef GL_SGIX_pixel_texture_bits -#define GL_SGIX_pixel_texture_bits 1 - -#define GLEW_SGIX_pixel_texture_bits GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_bits) - -#endif /* GL_SGIX_pixel_texture_bits */ - -/* ----------------------- GL_SGIX_pixel_texture_lod ----------------------- */ - -#ifndef GL_SGIX_pixel_texture_lod -#define GL_SGIX_pixel_texture_lod 1 - -#define GLEW_SGIX_pixel_texture_lod GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_lod) - -#endif /* GL_SGIX_pixel_texture_lod */ - -/* -------------------------- GL_SGIX_pixel_tiles -------------------------- */ - -#ifndef GL_SGIX_pixel_tiles -#define GL_SGIX_pixel_tiles 1 - -#define GLEW_SGIX_pixel_tiles GLEW_GET_VAR(__GLEW_SGIX_pixel_tiles) - -#endif /* GL_SGIX_pixel_tiles */ - -/* ------------------------- GL_SGIX_polynomial_ffd ------------------------ */ - -#ifndef GL_SGIX_polynomial_ffd -#define GL_SGIX_polynomial_ffd 1 - -#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x1 -#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x2 - -typedef void (GLAPIENTRY * PFNGLDEFORMSGIXPROC) (GLbitfield mask); -typedef void (GLAPIENTRY * PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); - -#define glDeformSGIX GLEW_GET_FUN(__glewDeformSGIX) -#define glLoadIdentityDeformationMapSGIX GLEW_GET_FUN(__glewLoadIdentityDeformationMapSGIX) - -#define GLEW_SGIX_polynomial_ffd GLEW_GET_VAR(__GLEW_SGIX_polynomial_ffd) - -#endif /* GL_SGIX_polynomial_ffd */ - -/* --------------------------- GL_SGIX_quad_mesh --------------------------- */ - -#ifndef GL_SGIX_quad_mesh -#define GL_SGIX_quad_mesh 1 - -typedef void (GLAPIENTRY * PFNGLMESHBREADTHSGIXPROC) (GLint breadth); -typedef void (GLAPIENTRY * PFNGLMESHSTRIDESGIXPROC) (GLint stride); - -#define glMeshBreadthSGIX GLEW_GET_FUN(__glewMeshBreadthSGIX) -#define glMeshStrideSGIX GLEW_GET_FUN(__glewMeshStrideSGIX) - -#define GLEW_SGIX_quad_mesh GLEW_GET_VAR(__GLEW_SGIX_quad_mesh) - -#endif /* GL_SGIX_quad_mesh */ - -/* ------------------------ GL_SGIX_reference_plane ------------------------ */ - -#ifndef GL_SGIX_reference_plane -#define GL_SGIX_reference_plane 1 - -typedef void (GLAPIENTRY * PFNGLREFERENCEPLANESGIXPROC) (const GLdouble* equation); - -#define glReferencePlaneSGIX GLEW_GET_FUN(__glewReferencePlaneSGIX) - -#define GLEW_SGIX_reference_plane GLEW_GET_VAR(__GLEW_SGIX_reference_plane) - -#endif /* GL_SGIX_reference_plane */ - -/* ---------------------------- GL_SGIX_resample --------------------------- */ - -#ifndef GL_SGIX_resample -#define GL_SGIX_resample 1 - -#define GL_PACK_RESAMPLE_SGIX 0x842E -#define GL_UNPACK_RESAMPLE_SGIX 0x842F -#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 -#define GL_RESAMPLE_REPLICATE_SGIX 0x8433 -#define GL_RESAMPLE_ZERO_FILL_SGIX 0x8434 - -#define GLEW_SGIX_resample GLEW_GET_VAR(__GLEW_SGIX_resample) - -#endif /* GL_SGIX_resample */ - -/* ------------------------- GL_SGIX_scalebias_hint ------------------------ */ - -#ifndef GL_SGIX_scalebias_hint -#define GL_SGIX_scalebias_hint 1 - -#define GL_SCALEBIAS_HINT_SGIX 0x8322 - -#define GLEW_SGIX_scalebias_hint GLEW_GET_VAR(__GLEW_SGIX_scalebias_hint) - -#endif /* GL_SGIX_scalebias_hint */ - -/* ----------------------------- GL_SGIX_shadow ---------------------------- */ - -#ifndef GL_SGIX_shadow -#define GL_SGIX_shadow 1 - -#define GL_TEXTURE_COMPARE_SGIX 0x819A -#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B -#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C -#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D - -#define GLEW_SGIX_shadow GLEW_GET_VAR(__GLEW_SGIX_shadow) - -#endif /* GL_SGIX_shadow */ - -/* ------------------------- GL_SGIX_shadow_ambient ------------------------ */ - -#ifndef GL_SGIX_shadow_ambient -#define GL_SGIX_shadow_ambient 1 - -#define GL_SHADOW_AMBIENT_SGIX 0x80BF - -#define GLEW_SGIX_shadow_ambient GLEW_GET_VAR(__GLEW_SGIX_shadow_ambient) - -#endif /* GL_SGIX_shadow_ambient */ - -/* ------------------------------ GL_SGIX_slim ----------------------------- */ - -#ifndef GL_SGIX_slim -#define GL_SGIX_slim 1 - -#define GL_PACK_MAX_COMPRESSED_SIZE_SGIX 0x831B -#define GL_SLIM8U_SGIX 0x831D -#define GL_SLIM10U_SGIX 0x831E -#define GL_SLIM12S_SGIX 0x831F - -#define GLEW_SGIX_slim GLEW_GET_VAR(__GLEW_SGIX_slim) - -#endif /* GL_SGIX_slim */ - -/* ------------------------ GL_SGIX_spotlight_cutoff ----------------------- */ - -#ifndef GL_SGIX_spotlight_cutoff -#define GL_SGIX_spotlight_cutoff 1 - -#define GL_SPOT_CUTOFF_DELTA_SGIX 0x8193 - -#define GLEW_SGIX_spotlight_cutoff GLEW_GET_VAR(__GLEW_SGIX_spotlight_cutoff) - -#endif /* GL_SGIX_spotlight_cutoff */ - -/* ----------------------------- GL_SGIX_sprite ---------------------------- */ - -#ifndef GL_SGIX_sprite -#define GL_SGIX_sprite 1 - -typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, GLint* params); - -#define glSpriteParameterfSGIX GLEW_GET_FUN(__glewSpriteParameterfSGIX) -#define glSpriteParameterfvSGIX GLEW_GET_FUN(__glewSpriteParameterfvSGIX) -#define glSpriteParameteriSGIX GLEW_GET_FUN(__glewSpriteParameteriSGIX) -#define glSpriteParameterivSGIX GLEW_GET_FUN(__glewSpriteParameterivSGIX) - -#define GLEW_SGIX_sprite GLEW_GET_VAR(__GLEW_SGIX_sprite) - -#endif /* GL_SGIX_sprite */ - -/* -------------------------- GL_SGIX_subdiv_patch ------------------------- */ - -#ifndef GL_SGIX_subdiv_patch -#define GL_SGIX_subdiv_patch 1 - -#define GLEW_SGIX_subdiv_patch GLEW_GET_VAR(__GLEW_SGIX_subdiv_patch) - -#endif /* GL_SGIX_subdiv_patch */ - -/* --------------------------- GL_SGIX_subsample --------------------------- */ - -#ifndef GL_SGIX_subsample -#define GL_SGIX_subsample 1 - -#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 -#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 -#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 -#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 -#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 - -#define GLEW_SGIX_subsample GLEW_GET_VAR(__GLEW_SGIX_subsample) - -#endif /* GL_SGIX_subsample */ - -/* ----------------------- GL_SGIX_tag_sample_buffer ----------------------- */ - -#ifndef GL_SGIX_tag_sample_buffer -#define GL_SGIX_tag_sample_buffer 1 - -typedef void (GLAPIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); - -#define glTagSampleBufferSGIX GLEW_GET_FUN(__glewTagSampleBufferSGIX) - -#define GLEW_SGIX_tag_sample_buffer GLEW_GET_VAR(__GLEW_SGIX_tag_sample_buffer) - -#endif /* GL_SGIX_tag_sample_buffer */ - -/* ------------------------ GL_SGIX_texture_add_env ------------------------ */ - -#ifndef GL_SGIX_texture_add_env -#define GL_SGIX_texture_add_env 1 - -#define GLEW_SGIX_texture_add_env GLEW_GET_VAR(__GLEW_SGIX_texture_add_env) - -#endif /* GL_SGIX_texture_add_env */ - -/* -------------------- GL_SGIX_texture_coordinate_clamp ------------------- */ - -#ifndef GL_SGIX_texture_coordinate_clamp -#define GL_SGIX_texture_coordinate_clamp 1 - -#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 -#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A -#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B - -#define GLEW_SGIX_texture_coordinate_clamp GLEW_GET_VAR(__GLEW_SGIX_texture_coordinate_clamp) - -#endif /* GL_SGIX_texture_coordinate_clamp */ - -/* ------------------------ GL_SGIX_texture_lod_bias ----------------------- */ - -#ifndef GL_SGIX_texture_lod_bias -#define GL_SGIX_texture_lod_bias 1 - -#define GLEW_SGIX_texture_lod_bias GLEW_GET_VAR(__GLEW_SGIX_texture_lod_bias) - -#endif /* GL_SGIX_texture_lod_bias */ - -/* ------------------- GL_SGIX_texture_mipmap_anisotropic ------------------ */ - -#ifndef GL_SGIX_texture_mipmap_anisotropic -#define GL_SGIX_texture_mipmap_anisotropic 1 - -#define GL_TEXTURE_MIPMAP_ANISOTROPY_SGIX 0x832E -#define GL_MAX_MIPMAP_ANISOTROPY_SGIX 0x832F - -#define GLEW_SGIX_texture_mipmap_anisotropic GLEW_GET_VAR(__GLEW_SGIX_texture_mipmap_anisotropic) - -#endif /* GL_SGIX_texture_mipmap_anisotropic */ - -/* ---------------------- GL_SGIX_texture_multi_buffer --------------------- */ - -#ifndef GL_SGIX_texture_multi_buffer -#define GL_SGIX_texture_multi_buffer 1 - -#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E - -#define GLEW_SGIX_texture_multi_buffer GLEW_GET_VAR(__GLEW_SGIX_texture_multi_buffer) - -#endif /* GL_SGIX_texture_multi_buffer */ - -/* ------------------------- GL_SGIX_texture_phase ------------------------- */ - -#ifndef GL_SGIX_texture_phase -#define GL_SGIX_texture_phase 1 - -#define GL_PHASE_SGIX 0x832A - -#define GLEW_SGIX_texture_phase GLEW_GET_VAR(__GLEW_SGIX_texture_phase) - -#endif /* GL_SGIX_texture_phase */ - -/* ------------------------- GL_SGIX_texture_range ------------------------- */ - -#ifndef GL_SGIX_texture_range -#define GL_SGIX_texture_range 1 - -#define GL_RGB_SIGNED_SGIX 0x85E0 -#define GL_RGBA_SIGNED_SGIX 0x85E1 -#define GL_ALPHA_SIGNED_SGIX 0x85E2 -#define GL_LUMINANCE_SIGNED_SGIX 0x85E3 -#define GL_INTENSITY_SIGNED_SGIX 0x85E4 -#define GL_LUMINANCE_ALPHA_SIGNED_SGIX 0x85E5 -#define GL_RGB16_SIGNED_SGIX 0x85E6 -#define GL_RGBA16_SIGNED_SGIX 0x85E7 -#define GL_ALPHA16_SIGNED_SGIX 0x85E8 -#define GL_LUMINANCE16_SIGNED_SGIX 0x85E9 -#define GL_INTENSITY16_SIGNED_SGIX 0x85EA -#define GL_LUMINANCE16_ALPHA16_SIGNED_SGIX 0x85EB -#define GL_RGB_EXTENDED_RANGE_SGIX 0x85EC -#define GL_RGBA_EXTENDED_RANGE_SGIX 0x85ED -#define GL_ALPHA_EXTENDED_RANGE_SGIX 0x85EE -#define GL_LUMINANCE_EXTENDED_RANGE_SGIX 0x85EF -#define GL_INTENSITY_EXTENDED_RANGE_SGIX 0x85F0 -#define GL_LUMINANCE_ALPHA_EXTENDED_RANGE_SGIX 0x85F1 -#define GL_RGB16_EXTENDED_RANGE_SGIX 0x85F2 -#define GL_RGBA16_EXTENDED_RANGE_SGIX 0x85F3 -#define GL_ALPHA16_EXTENDED_RANGE_SGIX 0x85F4 -#define GL_LUMINANCE16_EXTENDED_RANGE_SGIX 0x85F5 -#define GL_INTENSITY16_EXTENDED_RANGE_SGIX 0x85F6 -#define GL_LUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX 0x85F7 -#define GL_MIN_LUMINANCE_SGIS 0x85F8 -#define GL_MAX_LUMINANCE_SGIS 0x85F9 -#define GL_MIN_INTENSITY_SGIS 0x85FA -#define GL_MAX_INTENSITY_SGIS 0x85FB - -#define GLEW_SGIX_texture_range GLEW_GET_VAR(__GLEW_SGIX_texture_range) - -#endif /* GL_SGIX_texture_range */ - -/* ----------------------- GL_SGIX_texture_scale_bias ---------------------- */ - -#ifndef GL_SGIX_texture_scale_bias -#define GL_SGIX_texture_scale_bias 1 - -#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 -#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A -#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B -#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C - -#define GLEW_SGIX_texture_scale_bias GLEW_GET_VAR(__GLEW_SGIX_texture_scale_bias) - -#endif /* GL_SGIX_texture_scale_bias */ - -/* ---------------------- GL_SGIX_texture_supersample ---------------------- */ - -#ifndef GL_SGIX_texture_supersample -#define GL_SGIX_texture_supersample 1 - -#define GLEW_SGIX_texture_supersample GLEW_GET_VAR(__GLEW_SGIX_texture_supersample) - -#endif /* GL_SGIX_texture_supersample */ - -/* --------------------------- GL_SGIX_vector_ops -------------------------- */ - -#ifndef GL_SGIX_vector_ops -#define GL_SGIX_vector_ops 1 - -typedef void (GLAPIENTRY * PFNGLGETVECTOROPERATIONSGIXPROC) (GLenum operation); -typedef void (GLAPIENTRY * PFNGLVECTOROPERATIONSGIXPROC) (GLenum operation); - -#define glGetVectorOperationSGIX GLEW_GET_FUN(__glewGetVectorOperationSGIX) -#define glVectorOperationSGIX GLEW_GET_FUN(__glewVectorOperationSGIX) - -#define GLEW_SGIX_vector_ops GLEW_GET_VAR(__GLEW_SGIX_vector_ops) - -#endif /* GL_SGIX_vector_ops */ - -/* ---------------------- GL_SGIX_vertex_array_object ---------------------- */ - -#ifndef GL_SGIX_vertex_array_object -#define GL_SGIX_vertex_array_object 1 - -typedef GLboolean (GLAPIENTRY * PFNGLAREVERTEXARRAYSRESIDENTSGIXPROC) (GLsizei n, const GLuint* arrays, GLboolean* residences); -typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYSGIXPROC) (GLuint array); -typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSSGIXPROC) (GLsizei n, const GLuint* arrays); -typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSSGIXPROC) (GLsizei n, GLuint* arrays); -typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYSGIXPROC) (GLuint array); -typedef void (GLAPIENTRY * PFNGLPRIORITIZEVERTEXARRAYSSGIXPROC) (GLsizei n, const GLuint* arrays, const GLclampf* priorities); - -#define glAreVertexArraysResidentSGIX GLEW_GET_FUN(__glewAreVertexArraysResidentSGIX) -#define glBindVertexArraySGIX GLEW_GET_FUN(__glewBindVertexArraySGIX) -#define glDeleteVertexArraysSGIX GLEW_GET_FUN(__glewDeleteVertexArraysSGIX) -#define glGenVertexArraysSGIX GLEW_GET_FUN(__glewGenVertexArraysSGIX) -#define glIsVertexArraySGIX GLEW_GET_FUN(__glewIsVertexArraySGIX) -#define glPrioritizeVertexArraysSGIX GLEW_GET_FUN(__glewPrioritizeVertexArraysSGIX) - -#define GLEW_SGIX_vertex_array_object GLEW_GET_VAR(__GLEW_SGIX_vertex_array_object) - -#endif /* GL_SGIX_vertex_array_object */ - -/* ------------------------- GL_SGIX_vertex_preclip ------------------------ */ - -#ifndef GL_SGIX_vertex_preclip -#define GL_SGIX_vertex_preclip 1 - -#define GL_VERTEX_PRECLIP_SGIX 0x83EE -#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF - -#define GLEW_SGIX_vertex_preclip GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip) - -#endif /* GL_SGIX_vertex_preclip */ - -/* ---------------------- GL_SGIX_vertex_preclip_hint ---------------------- */ - -#ifndef GL_SGIX_vertex_preclip_hint -#define GL_SGIX_vertex_preclip_hint 1 - -#define GL_VERTEX_PRECLIP_SGIX 0x83EE -#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF - -#define GLEW_SGIX_vertex_preclip_hint GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip_hint) - -#endif /* GL_SGIX_vertex_preclip_hint */ - -/* ----------------------------- GL_SGIX_ycrcb ----------------------------- */ - -#ifndef GL_SGIX_ycrcb -#define GL_SGIX_ycrcb 1 - -#define GLEW_SGIX_ycrcb GLEW_GET_VAR(__GLEW_SGIX_ycrcb) - -#endif /* GL_SGIX_ycrcb */ - -/* ------------------------ GL_SGIX_ycrcb_subsample ------------------------ */ - -#ifndef GL_SGIX_ycrcb_subsample -#define GL_SGIX_ycrcb_subsample 1 - -#define GLEW_SGIX_ycrcb_subsample GLEW_GET_VAR(__GLEW_SGIX_ycrcb_subsample) - -#endif /* GL_SGIX_ycrcb_subsample */ - -/* ----------------------------- GL_SGIX_ycrcba ---------------------------- */ - -#ifndef GL_SGIX_ycrcba -#define GL_SGIX_ycrcba 1 - -#define GL_YCRCB_SGIX 0x8318 -#define GL_YCRCBA_SGIX 0x8319 - -#define GLEW_SGIX_ycrcba GLEW_GET_VAR(__GLEW_SGIX_ycrcba) - -#endif /* GL_SGIX_ycrcba */ - -/* -------------------------- GL_SGI_color_matrix -------------------------- */ - -#ifndef GL_SGI_color_matrix -#define GL_SGI_color_matrix 1 - -#define GL_COLOR_MATRIX_SGI 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB - -#define GLEW_SGI_color_matrix GLEW_GET_VAR(__GLEW_SGI_color_matrix) - -#endif /* GL_SGI_color_matrix */ - -/* --------------------------- GL_SGI_color_table -------------------------- */ - -#ifndef GL_SGI_color_table -#define GL_SGI_color_table 1 - -#define GL_COLOR_TABLE_SGI 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 -#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 -#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 -#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 -#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 -#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF - -typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); -typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void *table); - -#define glColorTableParameterfvSGI GLEW_GET_FUN(__glewColorTableParameterfvSGI) -#define glColorTableParameterivSGI GLEW_GET_FUN(__glewColorTableParameterivSGI) -#define glColorTableSGI GLEW_GET_FUN(__glewColorTableSGI) -#define glCopyColorTableSGI GLEW_GET_FUN(__glewCopyColorTableSGI) -#define glGetColorTableParameterfvSGI GLEW_GET_FUN(__glewGetColorTableParameterfvSGI) -#define glGetColorTableParameterivSGI GLEW_GET_FUN(__glewGetColorTableParameterivSGI) -#define glGetColorTableSGI GLEW_GET_FUN(__glewGetColorTableSGI) - -#define GLEW_SGI_color_table GLEW_GET_VAR(__GLEW_SGI_color_table) - -#endif /* GL_SGI_color_table */ - -/* ----------------------------- GL_SGI_complex ---------------------------- */ - -#ifndef GL_SGI_complex -#define GL_SGI_complex 1 - -#define GLEW_SGI_complex GLEW_GET_VAR(__GLEW_SGI_complex) - -#endif /* GL_SGI_complex */ - -/* -------------------------- GL_SGI_complex_type -------------------------- */ - -#ifndef GL_SGI_complex_type -#define GL_SGI_complex_type 1 - -#define GL_COMPLEX_UNSIGNED_BYTE_SGI 0x81BD -#define GL_COMPLEX_BYTE_SGI 0x81BE -#define GL_COMPLEX_UNSIGNED_SHORT_SGI 0x81BF -#define GL_COMPLEX_SHORT_SGI 0x81C0 -#define GL_COMPLEX_UNSIGNED_INT_SGI 0x81C1 -#define GL_COMPLEX_INT_SGI 0x81C2 -#define GL_COMPLEX_FLOAT_SGI 0x81C3 - -#define GLEW_SGI_complex_type GLEW_GET_VAR(__GLEW_SGI_complex_type) - -#endif /* GL_SGI_complex_type */ - -/* ------------------------------- GL_SGI_fft ------------------------------ */ - -#ifndef GL_SGI_fft -#define GL_SGI_fft 1 - -#define GL_PIXEL_TRANSFORM_OPERATOR_SGI 0x81C4 -#define GL_CONVOLUTION_SGI 0x81C5 -#define GL_FFT_1D_SGI 0x81C6 -#define GL_PIXEL_TRANSFORM_SGI 0x81C7 -#define GL_MAX_FFT_WIDTH_SGI 0x81C8 - -typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFSGIPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERISGIPROC) (GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMSGIPROC) (GLenum target); - -#define glGetPixelTransformParameterfvSGI GLEW_GET_FUN(__glewGetPixelTransformParameterfvSGI) -#define glGetPixelTransformParameterivSGI GLEW_GET_FUN(__glewGetPixelTransformParameterivSGI) -#define glPixelTransformParameterfSGI GLEW_GET_FUN(__glewPixelTransformParameterfSGI) -#define glPixelTransformParameterfvSGI GLEW_GET_FUN(__glewPixelTransformParameterfvSGI) -#define glPixelTransformParameteriSGI GLEW_GET_FUN(__glewPixelTransformParameteriSGI) -#define glPixelTransformParameterivSGI GLEW_GET_FUN(__glewPixelTransformParameterivSGI) -#define glPixelTransformSGI GLEW_GET_FUN(__glewPixelTransformSGI) - -#define GLEW_SGI_fft GLEW_GET_VAR(__GLEW_SGI_fft) - -#endif /* GL_SGI_fft */ - -/* ----------------------- GL_SGI_texture_color_table ---------------------- */ - -#ifndef GL_SGI_texture_color_table -#define GL_SGI_texture_color_table 1 - -#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC -#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD - -#define GLEW_SGI_texture_color_table GLEW_GET_VAR(__GLEW_SGI_texture_color_table) - -#endif /* GL_SGI_texture_color_table */ - -/* ------------------------- GL_SUNX_constant_data ------------------------- */ - -#ifndef GL_SUNX_constant_data -#define GL_SUNX_constant_data 1 - -#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 -#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 - -typedef void (GLAPIENTRY * PFNGLFINISHTEXTURESUNXPROC) (void); - -#define glFinishTextureSUNX GLEW_GET_FUN(__glewFinishTextureSUNX) - -#define GLEW_SUNX_constant_data GLEW_GET_VAR(__GLEW_SUNX_constant_data) - -#endif /* GL_SUNX_constant_data */ - -/* -------------------- GL_SUN_convolution_border_modes -------------------- */ - -#ifndef GL_SUN_convolution_border_modes -#define GL_SUN_convolution_border_modes 1 - -#define GL_WRAP_BORDER_SUN 0x81D4 - -#define GLEW_SUN_convolution_border_modes GLEW_GET_VAR(__GLEW_SUN_convolution_border_modes) - -#endif /* GL_SUN_convolution_border_modes */ - -/* -------------------------- GL_SUN_global_alpha -------------------------- */ - -#ifndef GL_SUN_global_alpha -#define GL_SUN_global_alpha 1 - -#define GL_GLOBAL_ALPHA_SUN 0x81D9 -#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA - -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); - -#define glGlobalAlphaFactorbSUN GLEW_GET_FUN(__glewGlobalAlphaFactorbSUN) -#define glGlobalAlphaFactordSUN GLEW_GET_FUN(__glewGlobalAlphaFactordSUN) -#define glGlobalAlphaFactorfSUN GLEW_GET_FUN(__glewGlobalAlphaFactorfSUN) -#define glGlobalAlphaFactoriSUN GLEW_GET_FUN(__glewGlobalAlphaFactoriSUN) -#define glGlobalAlphaFactorsSUN GLEW_GET_FUN(__glewGlobalAlphaFactorsSUN) -#define glGlobalAlphaFactorubSUN GLEW_GET_FUN(__glewGlobalAlphaFactorubSUN) -#define glGlobalAlphaFactoruiSUN GLEW_GET_FUN(__glewGlobalAlphaFactoruiSUN) -#define glGlobalAlphaFactorusSUN GLEW_GET_FUN(__glewGlobalAlphaFactorusSUN) - -#define GLEW_SUN_global_alpha GLEW_GET_VAR(__GLEW_SUN_global_alpha) - -#endif /* GL_SUN_global_alpha */ - -/* --------------------------- GL_SUN_mesh_array --------------------------- */ - -#ifndef GL_SUN_mesh_array -#define GL_SUN_mesh_array 1 - -#define GL_QUAD_MESH_SUN 0x8614 -#define GL_TRIANGLE_MESH_SUN 0x8615 - -#define GLEW_SUN_mesh_array GLEW_GET_VAR(__GLEW_SUN_mesh_array) - -#endif /* GL_SUN_mesh_array */ - -/* ------------------------ GL_SUN_read_video_pixels ----------------------- */ - -#ifndef GL_SUN_read_video_pixels -#define GL_SUN_read_video_pixels 1 - -typedef void (GLAPIENTRY * PFNGLREADVIDEOPIXELSSUNPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels); - -#define glReadVideoPixelsSUN GLEW_GET_FUN(__glewReadVideoPixelsSUN) - -#define GLEW_SUN_read_video_pixels GLEW_GET_VAR(__GLEW_SUN_read_video_pixels) - -#endif /* GL_SUN_read_video_pixels */ - -/* --------------------------- GL_SUN_slice_accum -------------------------- */ - -#ifndef GL_SUN_slice_accum -#define GL_SUN_slice_accum 1 - -#define GL_SLICE_ACCUM_SUN 0x85CC - -#define GLEW_SUN_slice_accum GLEW_GET_VAR(__GLEW_SUN_slice_accum) - -#endif /* GL_SUN_slice_accum */ - -/* -------------------------- GL_SUN_triangle_list ------------------------- */ - -#ifndef GL_SUN_triangle_list -#define GL_SUN_triangle_list 1 - -#define GL_RESTART_SUN 0x01 -#define GL_REPLACE_MIDDLE_SUN 0x02 -#define GL_REPLACE_OLDEST_SUN 0x03 -#define GL_TRIANGLE_LIST_SUN 0x81D7 -#define GL_REPLACEMENT_CODE_SUN 0x81D8 -#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 -#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 -#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 -#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 -#define GL_R1UI_V3F_SUN 0x85C4 -#define GL_R1UI_C4UB_V3F_SUN 0x85C5 -#define GL_R1UI_C3F_V3F_SUN 0x85C6 -#define GL_R1UI_N3F_V3F_SUN 0x85C7 -#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 -#define GL_R1UI_T2F_V3F_SUN 0x85C9 -#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA -#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB - -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void *pointer); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte* code); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint* code); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort* code); - -#define glReplacementCodePointerSUN GLEW_GET_FUN(__glewReplacementCodePointerSUN) -#define glReplacementCodeubSUN GLEW_GET_FUN(__glewReplacementCodeubSUN) -#define glReplacementCodeubvSUN GLEW_GET_FUN(__glewReplacementCodeubvSUN) -#define glReplacementCodeuiSUN GLEW_GET_FUN(__glewReplacementCodeuiSUN) -#define glReplacementCodeuivSUN GLEW_GET_FUN(__glewReplacementCodeuivSUN) -#define glReplacementCodeusSUN GLEW_GET_FUN(__glewReplacementCodeusSUN) -#define glReplacementCodeusvSUN GLEW_GET_FUN(__glewReplacementCodeusvSUN) - -#define GLEW_SUN_triangle_list GLEW_GET_VAR(__GLEW_SUN_triangle_list) - -#endif /* GL_SUN_triangle_list */ - -/* ----------------------------- GL_SUN_vertex ----------------------------- */ - -#ifndef GL_SUN_vertex -#define GL_SUN_vertex 1 - -typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte* c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte* c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint* rc, const GLubyte *c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat* tc, const GLubyte *c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *v); - -#define glColor3fVertex3fSUN GLEW_GET_FUN(__glewColor3fVertex3fSUN) -#define glColor3fVertex3fvSUN GLEW_GET_FUN(__glewColor3fVertex3fvSUN) -#define glColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fSUN) -#define glColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fvSUN) -#define glColor4ubVertex2fSUN GLEW_GET_FUN(__glewColor4ubVertex2fSUN) -#define glColor4ubVertex2fvSUN GLEW_GET_FUN(__glewColor4ubVertex2fvSUN) -#define glColor4ubVertex3fSUN GLEW_GET_FUN(__glewColor4ubVertex3fSUN) -#define glColor4ubVertex3fvSUN GLEW_GET_FUN(__glewColor4ubVertex3fvSUN) -#define glNormal3fVertex3fSUN GLEW_GET_FUN(__glewNormal3fVertex3fSUN) -#define glNormal3fVertex3fvSUN GLEW_GET_FUN(__glewNormal3fVertex3fvSUN) -#define glReplacementCodeuiColor3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fSUN) -#define glReplacementCodeuiColor3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fvSUN) -#define glReplacementCodeuiColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fSUN) -#define glReplacementCodeuiColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fvSUN) -#define glReplacementCodeuiColor4ubVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fSUN) -#define glReplacementCodeuiColor4ubVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fvSUN) -#define glReplacementCodeuiNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fSUN) -#define glReplacementCodeuiNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fvSUN) -#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN) -#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN) -#define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN) -#define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN) -#define glReplacementCodeuiTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fSUN) -#define glReplacementCodeuiTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fvSUN) -#define glReplacementCodeuiVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fSUN) -#define glReplacementCodeuiVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fvSUN) -#define glTexCoord2fColor3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fSUN) -#define glTexCoord2fColor3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fvSUN) -#define glTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fSUN) -#define glTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fvSUN) -#define glTexCoord2fColor4ubVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fSUN) -#define glTexCoord2fColor4ubVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fvSUN) -#define glTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fSUN) -#define glTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fvSUN) -#define glTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fSUN) -#define glTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fvSUN) -#define glTexCoord4fColor4fNormal3fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fSUN) -#define glTexCoord4fColor4fNormal3fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fvSUN) -#define glTexCoord4fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fSUN) -#define glTexCoord4fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fvSUN) - -#define GLEW_SUN_vertex GLEW_GET_VAR(__GLEW_SUN_vertex) - -#endif /* GL_SUN_vertex */ - -/* -------------------------- GL_VIV_shader_binary ------------------------- */ - -#ifndef GL_VIV_shader_binary -#define GL_VIV_shader_binary 1 - -#define GL_SHADER_BINARY_VIV 0x8FC4 - -#define GLEW_VIV_shader_binary GLEW_GET_VAR(__GLEW_VIV_shader_binary) - -#endif /* GL_VIV_shader_binary */ - -/* -------------------------- GL_WIN_phong_shading ------------------------- */ - -#ifndef GL_WIN_phong_shading -#define GL_WIN_phong_shading 1 - -#define GL_PHONG_WIN 0x80EA -#define GL_PHONG_HINT_WIN 0x80EB - -#define GLEW_WIN_phong_shading GLEW_GET_VAR(__GLEW_WIN_phong_shading) - -#endif /* GL_WIN_phong_shading */ - -/* ------------------------- GL_WIN_scene_markerXXX ------------------------ */ - -#ifndef GL_WIN_scene_markerXXX -#define GL_WIN_scene_markerXXX 1 - -#define GLEW_WIN_scene_markerXXX GLEW_GET_VAR(__GLEW_WIN_scene_markerXXX) - -#endif /* GL_WIN_scene_markerXXX */ - -/* -------------------------- GL_WIN_specular_fog -------------------------- */ - -#ifndef GL_WIN_specular_fog -#define GL_WIN_specular_fog 1 - -#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC - -#define GLEW_WIN_specular_fog GLEW_GET_VAR(__GLEW_WIN_specular_fog) - -#endif /* GL_WIN_specular_fog */ - -/* ---------------------------- GL_WIN_swap_hint --------------------------- */ - -#ifndef GL_WIN_swap_hint -#define GL_WIN_swap_hint 1 - -typedef void (GLAPIENTRY * PFNGLADDSWAPHINTRECTWINPROC) (GLint x, GLint y, GLsizei width, GLsizei height); - -#define glAddSwapHintRectWIN GLEW_GET_FUN(__glewAddSwapHintRectWIN) - -#define GLEW_WIN_swap_hint GLEW_GET_VAR(__GLEW_WIN_swap_hint) - -#endif /* GL_WIN_swap_hint */ - -/* ------------------------------------------------------------------------- */ - - - -GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D; -GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements; -GLEW_FUN_EXPORT PFNGLTEXIMAGE3DPROC __glewTexImage3D; -GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D; - -GLEW_FUN_EXPORT PFNGLACTIVETEXTUREPROC __glewActiveTexture; -GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D; -GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage; -GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd; -GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf; -GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd; -GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv; -GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage; - -GLEW_FUN_EXPORT PFNGLBLENDCOLORPROC __glewBlendColor; -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONPROC __glewBlendEquation; -GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate; -GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer; -GLEW_FUN_EXPORT PFNGLFOGCOORDDPROC __glewFogCoordd; -GLEW_FUN_EXPORT PFNGLFOGCOORDDVPROC __glewFogCoorddv; -GLEW_FUN_EXPORT PFNGLFOGCOORDFPROC __glewFogCoordf; -GLEW_FUN_EXPORT PFNGLFOGCOORDFVPROC __glewFogCoordfv; -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFPROC __glewPointParameterf; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIPROC __glewPointParameteri; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DPROC __glewWindowPos2d; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FPROC __glewWindowPos2f; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IPROC __glewWindowPos2i; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SPROC __glewWindowPos2s; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DPROC __glewWindowPos3d; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FPROC __glewWindowPos3f; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IPROC __glewWindowPos3i; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SPROC __glewWindowPos3s; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv; - -GLEW_FUN_EXPORT PFNGLBEGINQUERYPROC __glewBeginQuery; -GLEW_FUN_EXPORT PFNGLBINDBUFFERPROC __glewBindBuffer; -GLEW_FUN_EXPORT PFNGLBUFFERDATAPROC __glewBufferData; -GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAPROC __glewBufferSubData; -GLEW_FUN_EXPORT PFNGLDELETEBUFFERSPROC __glewDeleteBuffers; -GLEW_FUN_EXPORT PFNGLDELETEQUERIESPROC __glewDeleteQueries; -GLEW_FUN_EXPORT PFNGLENDQUERYPROC __glewEndQuery; -GLEW_FUN_EXPORT PFNGLGENBUFFERSPROC __glewGenBuffers; -GLEW_FUN_EXPORT PFNGLGENQUERIESPROC __glewGenQueries; -GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv; -GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv; -GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv; -GLEW_FUN_EXPORT PFNGLGETQUERYIVPROC __glewGetQueryiv; -GLEW_FUN_EXPORT PFNGLISBUFFERPROC __glewIsBuffer; -GLEW_FUN_EXPORT PFNGLISQUERYPROC __glewIsQuery; -GLEW_FUN_EXPORT PFNGLMAPBUFFERPROC __glewMapBuffer; -GLEW_FUN_EXPORT PFNGLUNMAPBUFFERPROC __glewUnmapBuffer; - -GLEW_FUN_EXPORT PFNGLATTACHSHADERPROC __glewAttachShader; -GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation; -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate; -GLEW_FUN_EXPORT PFNGLCOMPILESHADERPROC __glewCompileShader; -GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPROC __glewCreateProgram; -GLEW_FUN_EXPORT PFNGLCREATESHADERPROC __glewCreateShader; -GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPROC __glewDeleteProgram; -GLEW_FUN_EXPORT PFNGLDELETESHADERPROC __glewDeleteShader; -GLEW_FUN_EXPORT PFNGLDETACHSHADERPROC __glewDetachShader; -GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray; -GLEW_FUN_EXPORT PFNGLDRAWBUFFERSPROC __glewDrawBuffers; -GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray; -GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib; -GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform; -GLEW_FUN_EXPORT PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders; -GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation; -GLEW_FUN_EXPORT PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog; -GLEW_FUN_EXPORT PFNGLGETPROGRAMIVPROC __glewGetProgramiv; -GLEW_FUN_EXPORT PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog; -GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEPROC __glewGetShaderSource; -GLEW_FUN_EXPORT PFNGLGETSHADERIVPROC __glewGetShaderiv; -GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation; -GLEW_FUN_EXPORT PFNGLGETUNIFORMFVPROC __glewGetUniformfv; -GLEW_FUN_EXPORT PFNGLGETUNIFORMIVPROC __glewGetUniformiv; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv; -GLEW_FUN_EXPORT PFNGLISPROGRAMPROC __glewIsProgram; -GLEW_FUN_EXPORT PFNGLISSHADERPROC __glewIsShader; -GLEW_FUN_EXPORT PFNGLLINKPROGRAMPROC __glewLinkProgram; -GLEW_FUN_EXPORT PFNGLSHADERSOURCEPROC __glewShaderSource; -GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate; -GLEW_FUN_EXPORT PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate; -GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate; -GLEW_FUN_EXPORT PFNGLUNIFORM1FPROC __glewUniform1f; -GLEW_FUN_EXPORT PFNGLUNIFORM1FVPROC __glewUniform1fv; -GLEW_FUN_EXPORT PFNGLUNIFORM1IPROC __glewUniform1i; -GLEW_FUN_EXPORT PFNGLUNIFORM1IVPROC __glewUniform1iv; -GLEW_FUN_EXPORT PFNGLUNIFORM2FPROC __glewUniform2f; -GLEW_FUN_EXPORT PFNGLUNIFORM2FVPROC __glewUniform2fv; -GLEW_FUN_EXPORT PFNGLUNIFORM2IPROC __glewUniform2i; -GLEW_FUN_EXPORT PFNGLUNIFORM2IVPROC __glewUniform2iv; -GLEW_FUN_EXPORT PFNGLUNIFORM3FPROC __glewUniform3f; -GLEW_FUN_EXPORT PFNGLUNIFORM3FVPROC __glewUniform3fv; -GLEW_FUN_EXPORT PFNGLUNIFORM3IPROC __glewUniform3i; -GLEW_FUN_EXPORT PFNGLUNIFORM3IVPROC __glewUniform3iv; -GLEW_FUN_EXPORT PFNGLUNIFORM4FPROC __glewUniform4f; -GLEW_FUN_EXPORT PFNGLUNIFORM4FVPROC __glewUniform4fv; -GLEW_FUN_EXPORT PFNGLUNIFORM4IPROC __glewUniform4i; -GLEW_FUN_EXPORT PFNGLUNIFORM4IVPROC __glewUniform4iv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv; -GLEW_FUN_EXPORT PFNGLUSEPROGRAMPROC __glewUseProgram; -GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPROC __glewValidateProgram; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer; - -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv; - -GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender; -GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback; -GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation; -GLEW_FUN_EXPORT PFNGLCLAMPCOLORPROC __glewClampColor; -GLEW_FUN_EXPORT PFNGLCLEARBUFFERFIPROC __glewClearBufferfi; -GLEW_FUN_EXPORT PFNGLCLEARBUFFERFVPROC __glewClearBufferfv; -GLEW_FUN_EXPORT PFNGLCLEARBUFFERIVPROC __glewClearBufferiv; -GLEW_FUN_EXPORT PFNGLCLEARBUFFERUIVPROC __glewClearBufferuiv; -GLEW_FUN_EXPORT PFNGLCOLORMASKIPROC __glewColorMaski; -GLEW_FUN_EXPORT PFNGLDISABLEIPROC __glewDisablei; -GLEW_FUN_EXPORT PFNGLENABLEIPROC __glewEnablei; -GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender; -GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback; -GLEW_FUN_EXPORT PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v; -GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation; -GLEW_FUN_EXPORT PFNGLGETSTRINGIPROC __glewGetStringi; -GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv; -GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv; -GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGPROC __glewGetTransformFeedbackVarying; -GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVPROC __glewGetUniformuiv; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVPROC __glewGetVertexAttribIiv; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVPROC __glewGetVertexAttribIuiv; -GLEW_FUN_EXPORT PFNGLISENABLEDIPROC __glewIsEnabledi; -GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVPROC __glewTexParameterIiv; -GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVPROC __glewTexParameterIuiv; -GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSPROC __glewTransformFeedbackVaryings; -GLEW_FUN_EXPORT PFNGLUNIFORM1UIPROC __glewUniform1ui; -GLEW_FUN_EXPORT PFNGLUNIFORM1UIVPROC __glewUniform1uiv; -GLEW_FUN_EXPORT PFNGLUNIFORM2UIPROC __glewUniform2ui; -GLEW_FUN_EXPORT PFNGLUNIFORM2UIVPROC __glewUniform2uiv; -GLEW_FUN_EXPORT PFNGLUNIFORM3UIPROC __glewUniform3ui; -GLEW_FUN_EXPORT PFNGLUNIFORM3UIVPROC __glewUniform3uiv; -GLEW_FUN_EXPORT PFNGLUNIFORM4UIPROC __glewUniform4ui; -GLEW_FUN_EXPORT PFNGLUNIFORM4UIVPROC __glewUniform4uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IPROC __glewVertexAttribI1i; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVPROC __glewVertexAttribI1iv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIPROC __glewVertexAttribI1ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVPROC __glewVertexAttribI1uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IPROC __glewVertexAttribI2i; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVPROC __glewVertexAttribI2iv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIPROC __glewVertexAttribI2ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVPROC __glewVertexAttribI2uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IPROC __glewVertexAttribI3i; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVPROC __glewVertexAttribI3iv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIPROC __glewVertexAttribI3ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVPROC __glewVertexAttribI3uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVPROC __glewVertexAttribI4bv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IPROC __glewVertexAttribI4i; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVPROC __glewVertexAttribI4iv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVPROC __glewVertexAttribI4sv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVPROC __glewVertexAttribI4ubv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIPROC __glewVertexAttribI4ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer; - -GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced; -GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex; -GLEW_FUN_EXPORT PFNGLTEXBUFFERPROC __glewTexBuffer; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture; -GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v; -GLEW_FUN_EXPORT PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v; - -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORPROC __glewVertexAttribDivisor; - -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIPROC __glewBlendEquationSeparatei; -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIPROC __glewBlendEquationi; -GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIPROC __glewBlendFuncSeparatei; -GLEW_FUN_EXPORT PFNGLBLENDFUNCIPROC __glewBlendFunci; -GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGPROC __glewMinSampleShading; - -GLEW_FUN_EXPORT PFNGLGETGRAPHICSRESETSTATUSPROC __glewGetGraphicsResetStatus; -GLEW_FUN_EXPORT PFNGLGETNCOMPRESSEDTEXIMAGEPROC __glewGetnCompressedTexImage; -GLEW_FUN_EXPORT PFNGLGETNTEXIMAGEPROC __glewGetnTexImage; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMDVPROC __glewGetnUniformdv; - -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC __glewMultiDrawArraysIndirectCount; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC __glewMultiDrawElementsIndirectCount; -GLEW_FUN_EXPORT PFNGLSPECIALIZESHADERPROC __glewSpecializeShader; - -GLEW_FUN_EXPORT PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX; - -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKAMDPROC __glewDebugMessageCallbackAMD; -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEENABLEAMDPROC __glewDebugMessageEnableAMD; -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTAMDPROC __glewDebugMessageInsertAMD; -GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGAMDPROC __glewGetDebugMessageLogAMD; - -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD; -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD; -GLEW_FUN_EXPORT PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD; -GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD; - -GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC __glewNamedRenderbufferStorageMultisampleAdvancedAMD; -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC __glewRenderbufferStorageMultisampleAdvancedAMD; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC __glewFramebufferSamplePositionsfvAMD; -GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC __glewGetFramebufferParameterfvAMD; -GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC __glewGetNamedFramebufferParameterfvAMD; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC __glewNamedFramebufferSamplePositionsfvAMD; - -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPARAMETERIAMDPROC __glewVertexAttribParameteriAMD; - -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD; - -GLEW_FUN_EXPORT PFNGLDELETENAMESAMDPROC __glewDeleteNamesAMD; -GLEW_FUN_EXPORT PFNGLGENNAMESAMDPROC __glewGenNamesAMD; -GLEW_FUN_EXPORT PFNGLISNAMEAMDPROC __glewIsNameAMD; - -GLEW_FUN_EXPORT PFNGLQUERYOBJECTPARAMETERUIAMDPROC __glewQueryObjectParameteruiAMD; - -GLEW_FUN_EXPORT PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD; -GLEW_FUN_EXPORT PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD; -GLEW_FUN_EXPORT PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD; -GLEW_FUN_EXPORT PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD; -GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD; -GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD; -GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD; -GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD; -GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD; -GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD; -GLEW_FUN_EXPORT PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD; - -GLEW_FUN_EXPORT PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD; - -GLEW_FUN_EXPORT PFNGLTEXSTORAGESPARSEAMDPROC __glewTexStorageSparseAMD; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGESPARSEAMDPROC __glewTextureStorageSparseAMD; - -GLEW_FUN_EXPORT PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD; - -GLEW_FUN_EXPORT PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD; -GLEW_FUN_EXPORT PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD; - -GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERANGLEPROC __glewBlitFramebufferANGLE; - -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC __glewRenderbufferStorageMultisampleANGLE; - -GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDANGLEPROC __glewDrawArraysInstancedANGLE; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDANGLEPROC __glewDrawElementsInstancedANGLE; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORANGLEPROC __glewVertexAttribDivisorANGLE; - -GLEW_FUN_EXPORT PFNGLBEGINQUERYANGLEPROC __glewBeginQueryANGLE; -GLEW_FUN_EXPORT PFNGLDELETEQUERIESANGLEPROC __glewDeleteQueriesANGLE; -GLEW_FUN_EXPORT PFNGLENDQUERYANGLEPROC __glewEndQueryANGLE; -GLEW_FUN_EXPORT PFNGLGENQUERIESANGLEPROC __glewGenQueriesANGLE; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VANGLEPROC __glewGetQueryObjecti64vANGLE; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVANGLEPROC __glewGetQueryObjectivANGLE; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VANGLEPROC __glewGetQueryObjectui64vANGLE; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVANGLEPROC __glewGetQueryObjectuivANGLE; -GLEW_FUN_EXPORT PFNGLGETQUERYIVANGLEPROC __glewGetQueryivANGLE; -GLEW_FUN_EXPORT PFNGLISQUERYANGLEPROC __glewIsQueryANGLE; -GLEW_FUN_EXPORT PFNGLQUERYCOUNTERANGLEPROC __glewQueryCounterANGLE; - -GLEW_FUN_EXPORT PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC __glewGetTranslatedShaderSourceANGLE; - -GLEW_FUN_EXPORT PFNGLCOPYTEXTURELEVELSAPPLEPROC __glewCopyTextureLevelsAPPLE; - -GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE; -GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE; -GLEW_FUN_EXPORT PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE; -GLEW_FUN_EXPORT PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE; - -GLEW_FUN_EXPORT PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE; -GLEW_FUN_EXPORT PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE; -GLEW_FUN_EXPORT PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE; -GLEW_FUN_EXPORT PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE; -GLEW_FUN_EXPORT PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE; -GLEW_FUN_EXPORT PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE; -GLEW_FUN_EXPORT PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE; -GLEW_FUN_EXPORT PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE; - -GLEW_FUN_EXPORT PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE; -GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE; - -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC __glewRenderbufferStorageMultisampleAPPLE; -GLEW_FUN_EXPORT PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC __glewResolveMultisampleFramebufferAPPLE; - -GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE; -GLEW_FUN_EXPORT PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE; -GLEW_FUN_EXPORT PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE; - -GLEW_FUN_EXPORT PFNGLCLIENTWAITSYNCAPPLEPROC __glewClientWaitSyncAPPLE; -GLEW_FUN_EXPORT PFNGLDELETESYNCAPPLEPROC __glewDeleteSyncAPPLE; -GLEW_FUN_EXPORT PFNGLFENCESYNCAPPLEPROC __glewFenceSyncAPPLE; -GLEW_FUN_EXPORT PFNGLGETINTEGER64VAPPLEPROC __glewGetInteger64vAPPLE; -GLEW_FUN_EXPORT PFNGLGETSYNCIVAPPLEPROC __glewGetSyncivAPPLE; -GLEW_FUN_EXPORT PFNGLISSYNCAPPLEPROC __glewIsSyncAPPLE; -GLEW_FUN_EXPORT PFNGLWAITSYNCAPPLEPROC __glewWaitSyncAPPLE; - -GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE; -GLEW_FUN_EXPORT PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE; - -GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE; -GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE; -GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE; -GLEW_FUN_EXPORT PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE; - -GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE; - -GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE; -GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE; -GLEW_FUN_EXPORT PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE; -GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE; -GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE; -GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE; -GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE; - -GLEW_FUN_EXPORT PFNGLCLEARDEPTHFPROC __glewClearDepthf; -GLEW_FUN_EXPORT PFNGLDEPTHRANGEFPROC __glewDepthRangef; -GLEW_FUN_EXPORT PFNGLGETSHADERPRECISIONFORMATPROC __glewGetShaderPrecisionFormat; -GLEW_FUN_EXPORT PFNGLRELEASESHADERCOMPILERPROC __glewReleaseShaderCompiler; -GLEW_FUN_EXPORT PFNGLSHADERBINARYPROC __glewShaderBinary; - -GLEW_FUN_EXPORT PFNGLMEMORYBARRIERBYREGIONPROC __glewMemoryBarrierByRegion; - -GLEW_FUN_EXPORT PFNGLPRIMITIVEBOUNDINGBOXARBPROC __glewPrimitiveBoundingBoxARB; - -GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstancedBaseInstance; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance; - -GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLEARBPROC __glewGetImageHandleARB; -GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLEARBPROC __glewGetTextureHandleARB; -GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLEARBPROC __glewGetTextureSamplerHandleARB; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VARBPROC __glewGetVertexAttribLui64vARB; -GLEW_FUN_EXPORT PFNGLISIMAGEHANDLERESIDENTARBPROC __glewIsImageHandleResidentARB; -GLEW_FUN_EXPORT PFNGLISTEXTUREHANDLERESIDENTARBPROC __glewIsTextureHandleResidentARB; -GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC __glewMakeImageHandleNonResidentARB; -GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLERESIDENTARBPROC __glewMakeImageHandleResidentARB; -GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC __glewMakeTextureHandleNonResidentARB; -GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLERESIDENTARBPROC __glewMakeTextureHandleResidentARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC __glewProgramUniformHandleui64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC __glewProgramUniformHandleui64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64ARBPROC __glewUniformHandleui64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VARBPROC __glewUniformHandleui64vARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64ARBPROC __glewVertexAttribL1ui64ARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VARBPROC __glewVertexAttribL1ui64vARB; - -GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed; -GLEW_FUN_EXPORT PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex; - -GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEPROC __glewBufferStorage; - -GLEW_FUN_EXPORT PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB; - -GLEW_FUN_EXPORT PFNGLCLEARBUFFERDATAPROC __glewClearBufferData; -GLEW_FUN_EXPORT PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT; - -GLEW_FUN_EXPORT PFNGLCLEARTEXIMAGEPROC __glewClearTexImage; -GLEW_FUN_EXPORT PFNGLCLEARTEXSUBIMAGEPROC __glewClearTexSubImage; - -GLEW_FUN_EXPORT PFNGLCLIPCONTROLPROC __glewClipControl; - -GLEW_FUN_EXPORT PFNGLCLAMPCOLORARBPROC __glewClampColorARB; - -GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute; -GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect; - -GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC __glewDispatchComputeGroupSizeARB; - -GLEW_FUN_EXPORT PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData; - -GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData; - -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB; -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB; -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB; -GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB; - -GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPROC __glewBindTextureUnit; -GLEW_FUN_EXPORT PFNGLBLITNAMEDFRAMEBUFFERPROC __glewBlitNamedFramebuffer; -GLEW_FUN_EXPORT PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC __glewCheckNamedFramebufferStatus; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERDATAPROC __glewClearNamedBufferData; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERSUBDATAPROC __glewClearNamedBufferSubData; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERFIPROC __glewClearNamedFramebufferfi; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERFVPROC __glewClearNamedFramebufferfv; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERIVPROC __glewClearNamedFramebufferiv; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC __glewClearNamedFramebufferuiv; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC __glewCompressedTextureSubImage1D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC __glewCompressedTextureSubImage2D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC __glewCompressedTextureSubImage3D; -GLEW_FUN_EXPORT PFNGLCOPYNAMEDBUFFERSUBDATAPROC __glewCopyNamedBufferSubData; -GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DPROC __glewCopyTextureSubImage1D; -GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DPROC __glewCopyTextureSubImage2D; -GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DPROC __glewCopyTextureSubImage3D; -GLEW_FUN_EXPORT PFNGLCREATEBUFFERSPROC __glewCreateBuffers; -GLEW_FUN_EXPORT PFNGLCREATEFRAMEBUFFERSPROC __glewCreateFramebuffers; -GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPIPELINESPROC __glewCreateProgramPipelines; -GLEW_FUN_EXPORT PFNGLCREATEQUERIESPROC __glewCreateQueries; -GLEW_FUN_EXPORT PFNGLCREATERENDERBUFFERSPROC __glewCreateRenderbuffers; -GLEW_FUN_EXPORT PFNGLCREATESAMPLERSPROC __glewCreateSamplers; -GLEW_FUN_EXPORT PFNGLCREATETEXTURESPROC __glewCreateTextures; -GLEW_FUN_EXPORT PFNGLCREATETRANSFORMFEEDBACKSPROC __glewCreateTransformFeedbacks; -GLEW_FUN_EXPORT PFNGLCREATEVERTEXARRAYSPROC __glewCreateVertexArrays; -GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBPROC __glewDisableVertexArrayAttrib; -GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBPROC __glewEnableVertexArrayAttrib; -GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC __glewFlushMappedNamedBufferRange; -GLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPPROC __glewGenerateTextureMipmap; -GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC __glewGetCompressedTextureImage; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERI64VPROC __glewGetNamedBufferParameteri64v; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERIVPROC __glewGetNamedBufferParameteriv; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPOINTERVPROC __glewGetNamedBufferPointerv; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERSUBDATAPROC __glewGetNamedBufferSubData; -GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetNamedFramebufferAttachmentParameteriv; -GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC __glewGetNamedFramebufferParameteriv; -GLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC __glewGetNamedRenderbufferParameteriv; -GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTI64VPROC __glewGetQueryBufferObjecti64v; -GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTIVPROC __glewGetQueryBufferObjectiv; -GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTUI64VPROC __glewGetQueryBufferObjectui64v; -GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTUIVPROC __glewGetQueryBufferObjectuiv; -GLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEPROC __glewGetTextureImage; -GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVPROC __glewGetTextureLevelParameterfv; -GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVPROC __glewGetTextureLevelParameteriv; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVPROC __glewGetTextureParameterIiv; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVPROC __glewGetTextureParameterIuiv; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVPROC __glewGetTextureParameterfv; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVPROC __glewGetTextureParameteriv; -GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKI64_VPROC __glewGetTransformFeedbacki64_v; -GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKI_VPROC __glewGetTransformFeedbacki_v; -GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKIVPROC __glewGetTransformFeedbackiv; -GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINDEXED64IVPROC __glewGetVertexArrayIndexed64iv; -GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINDEXEDIVPROC __glewGetVertexArrayIndexediv; -GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYIVPROC __glewGetVertexArrayiv; -GLEW_FUN_EXPORT PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC __glewInvalidateNamedFramebufferData; -GLEW_FUN_EXPORT PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC __glewInvalidateNamedFramebufferSubData; -GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERPROC __glewMapNamedBuffer; -GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEPROC __glewMapNamedBufferRange; -GLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAPROC __glewNamedBufferData; -GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEPROC __glewNamedBufferStorage; -GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAPROC __glewNamedBufferSubData; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC __glewNamedFramebufferDrawBuffer; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC __glewNamedFramebufferDrawBuffers; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC __glewNamedFramebufferParameteri; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC __glewNamedFramebufferReadBuffer; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC __glewNamedFramebufferRenderbuffer; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREPROC __glewNamedFramebufferTexture; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC __glewNamedFramebufferTextureLayer; -GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEPROC __glewNamedRenderbufferStorage; -GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewNamedRenderbufferStorageMultisample; -GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERPROC __glewTextureBuffer; -GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERRANGEPROC __glewTextureBufferRange; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIIVPROC __glewTextureParameterIiv; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIUIVPROC __glewTextureParameterIuiv; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFPROC __glewTextureParameterf; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFVPROC __glewTextureParameterfv; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIPROC __glewTextureParameteri; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIVPROC __glewTextureParameteriv; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE1DPROC __glewTextureStorage1D; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DPROC __glewTextureStorage2D; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC __glewTextureStorage2DMultisample; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DPROC __glewTextureStorage3D; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC __glewTextureStorage3DMultisample; -GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DPROC __glewTextureSubImage1D; -GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DPROC __glewTextureSubImage2D; -GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DPROC __glewTextureSubImage3D; -GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC __glewTransformFeedbackBufferBase; -GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC __glewTransformFeedbackBufferRange; -GLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFERPROC __glewUnmapNamedBuffer; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBBINDINGPROC __glewVertexArrayAttribBinding; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBFORMATPROC __glewVertexArrayAttribFormat; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBIFORMATPROC __glewVertexArrayAttribIFormat; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBLFORMATPROC __glewVertexArrayAttribLFormat; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYBINDINGDIVISORPROC __glewVertexArrayBindingDivisor; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYELEMENTBUFFERPROC __glewVertexArrayElementBuffer; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBUFFERPROC __glewVertexArrayVertexBuffer; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBUFFERSPROC __glewVertexArrayVertexBuffers; - -GLEW_FUN_EXPORT PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB; - -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB; -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB; -GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB; -GLEW_FUN_EXPORT PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB; - -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex; -GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex; - -GLEW_FUN_EXPORT PFNGLDRAWARRAYSINDIRECTPROC __glewDrawArraysIndirect; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINDIRECTPROC __glewDrawElementsIndirect; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERPARAMETERIPROC __glewFramebufferParameteri; -GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVPROC __glewGetFramebufferParameteriv; -GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC __glewGetNamedFramebufferParameterivEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC __glewNamedFramebufferParameteriEXT; - -GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFERPROC __glewBindFramebuffer; -GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFERPROC __glewBindRenderbuffer; -GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERPROC __glewBlitFramebuffer; -GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus; -GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers; -GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer; -GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers; -GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers; -GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap; -GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetFramebufferAttachmentParameteriv; -GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVPROC __glewGetRenderbufferParameteriv; -GLEW_FUN_EXPORT PFNGLISFRAMEBUFFERPROC __glewIsFramebuffer; -GLEW_FUN_EXPORT PFNGLISRENDERBUFFERPROC __glewIsRenderbuffer; -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEPROC __glewRenderbufferStorage; -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewRenderbufferStorageMultisample; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREARBPROC __glewFramebufferTextureARB; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB; - -GLEW_FUN_EXPORT PFNGLGETPROGRAMBINARYPROC __glewGetProgramBinary; -GLEW_FUN_EXPORT PFNGLPROGRAMBINARYPROC __glewProgramBinary; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIPROC __glewProgramParameteri; - -GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC __glewGetCompressedTextureSubImage; -GLEW_FUN_EXPORT PFNGLGETTEXTURESUBIMAGEPROC __glewGetTextureSubImage; - -GLEW_FUN_EXPORT PFNGLSPECIALIZESHADERARBPROC __glewSpecializeShaderARB; - -GLEW_FUN_EXPORT PFNGLGETUNIFORMDVPROC __glewGetUniformdv; -GLEW_FUN_EXPORT PFNGLUNIFORM1DPROC __glewUniform1d; -GLEW_FUN_EXPORT PFNGLUNIFORM1DVPROC __glewUniform1dv; -GLEW_FUN_EXPORT PFNGLUNIFORM2DPROC __glewUniform2d; -GLEW_FUN_EXPORT PFNGLUNIFORM2DVPROC __glewUniform2dv; -GLEW_FUN_EXPORT PFNGLUNIFORM3DPROC __glewUniform3d; -GLEW_FUN_EXPORT PFNGLUNIFORM3DVPROC __glewUniform3dv; -GLEW_FUN_EXPORT PFNGLUNIFORM4DPROC __glewUniform4d; -GLEW_FUN_EXPORT PFNGLUNIFORM4DVPROC __glewUniform4dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2DVPROC __glewUniformMatrix2dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3DVPROC __glewUniformMatrix2x3dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4DVPROC __glewUniformMatrix2x4dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3DVPROC __glewUniformMatrix3dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2DVPROC __glewUniformMatrix3x2dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4DVPROC __glewUniformMatrix3x4dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4DVPROC __glewUniformMatrix4dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2DVPROC __glewUniformMatrix4x2dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3DVPROC __glewUniformMatrix4x3dv; - -GLEW_FUN_EXPORT PFNGLGETUNIFORMI64VARBPROC __glewGetUniformi64vARB; -GLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VARBPROC __glewGetUniformui64vARB; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMI64VARBPROC __glewGetnUniformi64vARB; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMUI64VARBPROC __glewGetnUniformui64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64ARBPROC __glewProgramUniform1i64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64VARBPROC __glewProgramUniform1i64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64ARBPROC __glewProgramUniform1ui64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64VARBPROC __glewProgramUniform1ui64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64ARBPROC __glewProgramUniform2i64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64VARBPROC __glewProgramUniform2i64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64ARBPROC __glewProgramUniform2ui64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64VARBPROC __glewProgramUniform2ui64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64ARBPROC __glewProgramUniform3i64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64VARBPROC __glewProgramUniform3i64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64ARBPROC __glewProgramUniform3ui64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64VARBPROC __glewProgramUniform3ui64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64ARBPROC __glewProgramUniform4i64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64VARBPROC __glewProgramUniform4i64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64ARBPROC __glewProgramUniform4ui64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64VARBPROC __glewProgramUniform4ui64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1I64ARBPROC __glewUniform1i64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1I64VARBPROC __glewUniform1i64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1UI64ARBPROC __glewUniform1ui64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1UI64VARBPROC __glewUniform1ui64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2I64ARBPROC __glewUniform2i64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2I64VARBPROC __glewUniform2i64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2UI64ARBPROC __glewUniform2ui64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2UI64VARBPROC __glewUniform2ui64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3I64ARBPROC __glewUniform3i64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3I64VARBPROC __glewUniform3i64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3UI64ARBPROC __glewUniform3ui64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3UI64VARBPROC __glewUniform3ui64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4I64ARBPROC __glewUniform4i64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4I64VARBPROC __glewUniform4i64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4UI64ARBPROC __glewUniform4ui64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4UI64VARBPROC __glewUniform4ui64vARB; - -GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEPROC __glewColorSubTable; -GLEW_FUN_EXPORT PFNGLCOLORTABLEPROC __glewColorTable; -GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv; -GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv; -GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable; -GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable; -GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D; -GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPROC __glewGetColorTable; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv; -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPROC __glewGetHistogram; -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv; -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv; -GLEW_FUN_EXPORT PFNGLGETMINMAXPROC __glewGetMinmax; -GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv; -GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv; -GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter; -GLEW_FUN_EXPORT PFNGLHISTOGRAMPROC __glewHistogram; -GLEW_FUN_EXPORT PFNGLMINMAXPROC __glewMinmax; -GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMPROC __glewResetHistogram; -GLEW_FUN_EXPORT PFNGLRESETMINMAXPROC __glewResetMinmax; -GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D; - -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __glewMultiDrawArraysIndirectCountARB; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __glewMultiDrawElementsIndirectCountARB; - -GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB; - -GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATIVPROC __glewGetInternalformativ; - -GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATI64VPROC __glewGetInternalformati64v; - -GLEW_FUN_EXPORT PFNGLINVALIDATEBUFFERDATAPROC __glewInvalidateBufferData; -GLEW_FUN_EXPORT PFNGLINVALIDATEBUFFERSUBDATAPROC __glewInvalidateBufferSubData; -GLEW_FUN_EXPORT PFNGLINVALIDATEFRAMEBUFFERPROC __glewInvalidateFramebuffer; -GLEW_FUN_EXPORT PFNGLINVALIDATESUBFRAMEBUFFERPROC __glewInvalidateSubFramebuffer; -GLEW_FUN_EXPORT PFNGLINVALIDATETEXIMAGEPROC __glewInvalidateTexImage; -GLEW_FUN_EXPORT PFNGLINVALIDATETEXSUBIMAGEPROC __glewInvalidateTexSubImage; - -GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEPROC __glewFlushMappedBufferRange; -GLEW_FUN_EXPORT PFNGLMAPBUFFERRANGEPROC __glewMapBufferRange; - -GLEW_FUN_EXPORT PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB; -GLEW_FUN_EXPORT PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB; -GLEW_FUN_EXPORT PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB; -GLEW_FUN_EXPORT PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB; -GLEW_FUN_EXPORT PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB; - -GLEW_FUN_EXPORT PFNGLBINDBUFFERSBASEPROC __glewBindBuffersBase; -GLEW_FUN_EXPORT PFNGLBINDBUFFERSRANGEPROC __glewBindBuffersRange; -GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTURESPROC __glewBindImageTextures; -GLEW_FUN_EXPORT PFNGLBINDSAMPLERSPROC __glewBindSamplers; -GLEW_FUN_EXPORT PFNGLBINDTEXTURESPROC __glewBindTextures; -GLEW_FUN_EXPORT PFNGLBINDVERTEXBUFFERSPROC __glewBindVertexBuffers; - -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect; - -GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB; - -GLEW_FUN_EXPORT PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB; -GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB; - -GLEW_FUN_EXPORT PFNGLBEGINQUERYARBPROC __glewBeginQueryARB; -GLEW_FUN_EXPORT PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB; -GLEW_FUN_EXPORT PFNGLENDQUERYARBPROC __glewEndQueryARB; -GLEW_FUN_EXPORT PFNGLGENQUERIESARBPROC __glewGenQueriesARB; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB; -GLEW_FUN_EXPORT PFNGLGETQUERYIVARBPROC __glewGetQueryivARB; -GLEW_FUN_EXPORT PFNGLISQUERYARBPROC __glewIsQueryARB; - -GLEW_FUN_EXPORT PFNGLMAXSHADERCOMPILERTHREADSARBPROC __glewMaxShaderCompilerThreadsARB; - -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB; - -GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETCLAMPPROC __glewPolygonOffsetClamp; - -GLEW_FUN_EXPORT PFNGLGETPROGRAMINTERFACEIVPROC __glewGetProgramInterfaceiv; -GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEINDEXPROC __glewGetProgramResourceIndex; -GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONPROC __glewGetProgramResourceLocation; -GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC __glewGetProgramResourceLocationIndex; -GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCENAMEPROC __glewGetProgramResourceName; -GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEIVPROC __glewGetProgramResourceiv; - -GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex; - -GLEW_FUN_EXPORT PFNGLGETGRAPHICSRESETSTATUSARBPROC __glewGetGraphicsResetStatusARB; -GLEW_FUN_EXPORT PFNGLGETNCOLORTABLEARBPROC __glewGetnColorTableARB; -GLEW_FUN_EXPORT PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC __glewGetnCompressedTexImageARB; -GLEW_FUN_EXPORT PFNGLGETNCONVOLUTIONFILTERARBPROC __glewGetnConvolutionFilterARB; -GLEW_FUN_EXPORT PFNGLGETNHISTOGRAMARBPROC __glewGetnHistogramARB; -GLEW_FUN_EXPORT PFNGLGETNMAPDVARBPROC __glewGetnMapdvARB; -GLEW_FUN_EXPORT PFNGLGETNMAPFVARBPROC __glewGetnMapfvARB; -GLEW_FUN_EXPORT PFNGLGETNMAPIVARBPROC __glewGetnMapivARB; -GLEW_FUN_EXPORT PFNGLGETNMINMAXARBPROC __glewGetnMinmaxARB; -GLEW_FUN_EXPORT PFNGLGETNPIXELMAPFVARBPROC __glewGetnPixelMapfvARB; -GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUIVARBPROC __glewGetnPixelMapuivARB; -GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUSVARBPROC __glewGetnPixelMapusvARB; -GLEW_FUN_EXPORT PFNGLGETNPOLYGONSTIPPLEARBPROC __glewGetnPolygonStippleARB; -GLEW_FUN_EXPORT PFNGLGETNSEPARABLEFILTERARBPROC __glewGetnSeparableFilterARB; -GLEW_FUN_EXPORT PFNGLGETNTEXIMAGEARBPROC __glewGetnTexImageARB; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMDVARBPROC __glewGetnUniformdvARB; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVARBPROC __glewGetnUniformfvARB; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVARBPROC __glewGetnUniformivARB; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMUIVARBPROC __glewGetnUniformuivARB; -GLEW_FUN_EXPORT PFNGLREADNPIXELSARBPROC __glewReadnPixelsARB; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewFramebufferSampleLocationsfvARB; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewNamedFramebufferSampleLocationsfvARB; - -GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB; - -GLEW_FUN_EXPORT PFNGLBINDSAMPLERPROC __glewBindSampler; -GLEW_FUN_EXPORT PFNGLDELETESAMPLERSPROC __glewDeleteSamplers; -GLEW_FUN_EXPORT PFNGLGENSAMPLERSPROC __glewGenSamplers; -GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIIVPROC __glewGetSamplerParameterIiv; -GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIUIVPROC __glewGetSamplerParameterIuiv; -GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERFVPROC __glewGetSamplerParameterfv; -GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIVPROC __glewGetSamplerParameteriv; -GLEW_FUN_EXPORT PFNGLISSAMPLERPROC __glewIsSampler; -GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIIVPROC __glewSamplerParameterIiv; -GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIUIVPROC __glewSamplerParameterIuiv; -GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFPROC __glewSamplerParameterf; -GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFVPROC __glewSamplerParameterfv; -GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIPROC __glewSamplerParameteri; -GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIVPROC __glewSamplerParameteriv; - -GLEW_FUN_EXPORT PFNGLACTIVESHADERPROGRAMPROC __glewActiveShaderProgram; -GLEW_FUN_EXPORT PFNGLBINDPROGRAMPIPELINEPROC __glewBindProgramPipeline; -GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMVPROC __glewCreateShaderProgramv; -GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPIPELINESPROC __glewDeleteProgramPipelines; -GLEW_FUN_EXPORT PFNGLGENPROGRAMPIPELINESPROC __glewGenProgramPipelines; -GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEINFOLOGPROC __glewGetProgramPipelineInfoLog; -GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEIVPROC __glewGetProgramPipelineiv; -GLEW_FUN_EXPORT PFNGLISPROGRAMPIPELINEPROC __glewIsProgramPipeline; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DPROC __glewProgramUniform1d; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DVPROC __glewProgramUniform1dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FPROC __glewProgramUniform1f; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVPROC __glewProgramUniform1fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IPROC __glewProgramUniform1i; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVPROC __glewProgramUniform1iv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIPROC __glewProgramUniform1ui; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVPROC __glewProgramUniform1uiv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DPROC __glewProgramUniform2d; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DVPROC __glewProgramUniform2dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FPROC __glewProgramUniform2f; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVPROC __glewProgramUniform2fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IPROC __glewProgramUniform2i; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVPROC __glewProgramUniform2iv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIPROC __glewProgramUniform2ui; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVPROC __glewProgramUniform2uiv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DPROC __glewProgramUniform3d; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DVPROC __glewProgramUniform3dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FPROC __glewProgramUniform3f; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVPROC __glewProgramUniform3fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IPROC __glewProgramUniform3i; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVPROC __glewProgramUniform3iv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIPROC __glewProgramUniform3ui; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVPROC __glewProgramUniform3uiv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DPROC __glewProgramUniform4d; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DVPROC __glewProgramUniform4dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FPROC __glewProgramUniform4f; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVPROC __glewProgramUniform4fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IPROC __glewProgramUniform4i; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVPROC __glewProgramUniform4iv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIPROC __glewProgramUniform4ui; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVPROC __glewProgramUniform4uiv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2DVPROC __glewProgramUniformMatrix2dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVPROC __glewProgramUniformMatrix2fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC __glewProgramUniformMatrix2x3dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC __glewProgramUniformMatrix2x3fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC __glewProgramUniformMatrix2x4dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC __glewProgramUniformMatrix2x4fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3DVPROC __glewProgramUniformMatrix3dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVPROC __glewProgramUniformMatrix3fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC __glewProgramUniformMatrix3x2dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC __glewProgramUniformMatrix3x2fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC __glewProgramUniformMatrix3x4dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC __glewProgramUniformMatrix3x4fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4DVPROC __glewProgramUniformMatrix4dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVPROC __glewProgramUniformMatrix4fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC __glewProgramUniformMatrix4x2dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC __glewProgramUniformMatrix4x2fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC __glewProgramUniformMatrix4x3dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC __glewProgramUniformMatrix4x3fv; -GLEW_FUN_EXPORT PFNGLUSEPROGRAMSTAGESPROC __glewUseProgramStages; -GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPIPELINEPROC __glewValidateProgramPipeline; - -GLEW_FUN_EXPORT PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC __glewGetActiveAtomicCounterBufferiv; - -GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREPROC __glewBindImageTexture; -GLEW_FUN_EXPORT PFNGLMEMORYBARRIERPROC __glewMemoryBarrier; - -GLEW_FUN_EXPORT PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB; -GLEW_FUN_EXPORT PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB; -GLEW_FUN_EXPORT PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB; -GLEW_FUN_EXPORT PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB; -GLEW_FUN_EXPORT PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB; -GLEW_FUN_EXPORT PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB; -GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB; -GLEW_FUN_EXPORT PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB; -GLEW_FUN_EXPORT PFNGLGETHANDLEARBPROC __glewGetHandleARB; -GLEW_FUN_EXPORT PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB; -GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB; -GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB; -GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB; -GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB; -GLEW_FUN_EXPORT PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB; -GLEW_FUN_EXPORT PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB; -GLEW_FUN_EXPORT PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB; -GLEW_FUN_EXPORT PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1FARBPROC __glewUniform1fARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1IARBPROC __glewUniform1iARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2FARBPROC __glewUniform2fARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2IARBPROC __glewUniform2iARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3FARBPROC __glewUniform3fARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3IARBPROC __glewUniform3iARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4FARBPROC __glewUniform4fARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4IARBPROC __glewUniform4iARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB; -GLEW_FUN_EXPORT PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB; -GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB; - -GLEW_FUN_EXPORT PFNGLSHADERSTORAGEBLOCKBINDINGPROC __glewShaderStorageBlockBinding; - -GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINENAMEPROC __glewGetActiveSubroutineName; -GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __glewGetActiveSubroutineUniformName; -GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC __glewGetActiveSubroutineUniformiv; -GLEW_FUN_EXPORT PFNGLGETPROGRAMSTAGEIVPROC __glewGetProgramStageiv; -GLEW_FUN_EXPORT PFNGLGETSUBROUTINEINDEXPROC __glewGetSubroutineIndex; -GLEW_FUN_EXPORT PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC __glewGetSubroutineUniformLocation; -GLEW_FUN_EXPORT PFNGLGETUNIFORMSUBROUTINEUIVPROC __glewGetUniformSubroutineuiv; -GLEW_FUN_EXPORT PFNGLUNIFORMSUBROUTINESUIVPROC __glewUniformSubroutinesuiv; - -GLEW_FUN_EXPORT PFNGLCOMPILESHADERINCLUDEARBPROC __glewCompileShaderIncludeARB; -GLEW_FUN_EXPORT PFNGLDELETENAMEDSTRINGARBPROC __glewDeleteNamedStringARB; -GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGARBPROC __glewGetNamedStringARB; -GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB; -GLEW_FUN_EXPORT PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB; -GLEW_FUN_EXPORT PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB; - -GLEW_FUN_EXPORT PFNGLBUFFERPAGECOMMITMENTARBPROC __glewBufferPageCommitmentARB; - -GLEW_FUN_EXPORT PFNGLTEXPAGECOMMITMENTARBPROC __glewTexPageCommitmentARB; - -GLEW_FUN_EXPORT PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync; -GLEW_FUN_EXPORT PFNGLDELETESYNCPROC __glewDeleteSync; -GLEW_FUN_EXPORT PFNGLFENCESYNCPROC __glewFenceSync; -GLEW_FUN_EXPORT PFNGLGETINTEGER64VPROC __glewGetInteger64v; -GLEW_FUN_EXPORT PFNGLGETSYNCIVPROC __glewGetSynciv; -GLEW_FUN_EXPORT PFNGLISSYNCPROC __glewIsSync; -GLEW_FUN_EXPORT PFNGLWAITSYNCPROC __glewWaitSync; - -GLEW_FUN_EXPORT PFNGLPATCHPARAMETERFVPROC __glewPatchParameterfv; -GLEW_FUN_EXPORT PFNGLPATCHPARAMETERIPROC __glewPatchParameteri; - -GLEW_FUN_EXPORT PFNGLTEXTUREBARRIERPROC __glewTextureBarrier; - -GLEW_FUN_EXPORT PFNGLTEXBUFFERARBPROC __glewTexBufferARB; - -GLEW_FUN_EXPORT PFNGLTEXBUFFERRANGEPROC __glewTexBufferRange; -GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERRANGEEXTPROC __glewTextureBufferRangeEXT; - -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB; -GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB; - -GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv; -GLEW_FUN_EXPORT PFNGLSAMPLEMASKIPROC __glewSampleMaski; -GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample; -GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample; - -GLEW_FUN_EXPORT PFNGLTEXSTORAGE1DPROC __glewTexStorage1D; -GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DPROC __glewTexStorage2D; -GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DPROC __glewTexStorage3D; - -GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DMULTISAMPLEPROC __glewTexStorage2DMultisample; -GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DMULTISAMPLEPROC __glewTexStorage3DMultisample; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC __glewTextureStorage2DMultisampleEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC __glewTextureStorage3DMultisampleEXT; - -GLEW_FUN_EXPORT PFNGLTEXTUREVIEWPROC __glewTextureView; - -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VPROC __glewGetQueryObjecti64v; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VPROC __glewGetQueryObjectui64v; -GLEW_FUN_EXPORT PFNGLQUERYCOUNTERPROC __glewQueryCounter; - -GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKPROC __glewBindTransformFeedback; -GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSPROC __glewDeleteTransformFeedbacks; -GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKPROC __glewDrawTransformFeedback; -GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSPROC __glewGenTransformFeedbacks; -GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKPROC __glewIsTransformFeedback; -GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKPROC __glewPauseTransformFeedback; -GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKPROC __glewResumeTransformFeedback; - -GLEW_FUN_EXPORT PFNGLBEGINQUERYINDEXEDPROC __glewBeginQueryIndexed; -GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC __glewDrawTransformFeedbackStream; -GLEW_FUN_EXPORT PFNGLENDQUERYINDEXEDPROC __glewEndQueryIndexed; -GLEW_FUN_EXPORT PFNGLGETQUERYINDEXEDIVPROC __glewGetQueryIndexediv; - -GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC __glewDrawTransformFeedbackInstanced; -GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC __glewDrawTransformFeedbackStreamInstanced; - -GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB; -GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB; -GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB; -GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB; - -GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEPROC __glewBindBufferBase; -GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange; -GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName; -GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv; -GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName; -GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv; -GLEW_FUN_EXPORT PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v; -GLEW_FUN_EXPORT PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex; -GLEW_FUN_EXPORT PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices; -GLEW_FUN_EXPORT PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding; - -GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray; -GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays; -GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays; -GLEW_FUN_EXPORT PFNGLISVERTEXARRAYPROC __glewIsVertexArray; - -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVPROC __glewGetVertexAttribLdv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DPROC __glewVertexAttribL1d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVPROC __glewVertexAttribL1dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DPROC __glewVertexAttribL2d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVPROC __glewVertexAttribL2dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DPROC __glewVertexAttribL3d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVPROC __glewVertexAttribL3dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DPROC __glewVertexAttribL4d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVPROC __glewVertexAttribL4dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTERPROC __glewVertexAttribLPointer; - -GLEW_FUN_EXPORT PFNGLBINDVERTEXBUFFERPROC __glewBindVertexBuffer; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC __glewVertexArrayBindVertexBufferEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC __glewVertexArrayVertexAttribBindingEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC __glewVertexArrayVertexAttribFormatEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC __glewVertexArrayVertexAttribIFormatEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC __glewVertexArrayVertexAttribLFormatEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC __glewVertexArrayVertexBindingDivisorEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBBINDINGPROC __glewVertexAttribBinding; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATPROC __glewVertexAttribFormat; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATPROC __glewVertexAttribIFormat; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATPROC __glewVertexAttribLFormat; -GLEW_FUN_EXPORT PFNGLVERTEXBINDINGDIVISORPROC __glewVertexBindingDivisor; - -GLEW_FUN_EXPORT PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB; -GLEW_FUN_EXPORT PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB; -GLEW_FUN_EXPORT PFNGLWEIGHTBVARBPROC __glewWeightbvARB; -GLEW_FUN_EXPORT PFNGLWEIGHTDVARBPROC __glewWeightdvARB; -GLEW_FUN_EXPORT PFNGLWEIGHTFVARBPROC __glewWeightfvARB; -GLEW_FUN_EXPORT PFNGLWEIGHTIVARBPROC __glewWeightivARB; -GLEW_FUN_EXPORT PFNGLWEIGHTSVARBPROC __glewWeightsvARB; -GLEW_FUN_EXPORT PFNGLWEIGHTUBVARBPROC __glewWeightubvARB; -GLEW_FUN_EXPORT PFNGLWEIGHTUIVARBPROC __glewWeightuivARB; -GLEW_FUN_EXPORT PFNGLWEIGHTUSVARBPROC __glewWeightusvARB; - -GLEW_FUN_EXPORT PFNGLBINDBUFFERARBPROC __glewBindBufferARB; -GLEW_FUN_EXPORT PFNGLBUFFERDATAARBPROC __glewBufferDataARB; -GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB; -GLEW_FUN_EXPORT PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB; -GLEW_FUN_EXPORT PFNGLGENBUFFERSARBPROC __glewGenBuffersARB; -GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB; -GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB; -GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB; -GLEW_FUN_EXPORT PFNGLISBUFFERARBPROC __glewIsBufferARB; -GLEW_FUN_EXPORT PFNGLMAPBUFFERARBPROC __glewMapBufferARB; -GLEW_FUN_EXPORT PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB; - -GLEW_FUN_EXPORT PFNGLBINDPROGRAMARBPROC __glewBindProgramARB; -GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB; -GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB; -GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB; -GLEW_FUN_EXPORT PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB; -GLEW_FUN_EXPORT PFNGLISPROGRAMARBPROC __glewIsProgramARB; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB; -GLEW_FUN_EXPORT PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB; - -GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB; -GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB; -GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB; - -GLEW_FUN_EXPORT PFNGLCOLORP3UIPROC __glewColorP3ui; -GLEW_FUN_EXPORT PFNGLCOLORP3UIVPROC __glewColorP3uiv; -GLEW_FUN_EXPORT PFNGLCOLORP4UIPROC __glewColorP4ui; -GLEW_FUN_EXPORT PFNGLCOLORP4UIVPROC __glewColorP4uiv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIPROC __glewMultiTexCoordP1ui; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIVPROC __glewMultiTexCoordP1uiv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIPROC __glewMultiTexCoordP2ui; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIVPROC __glewMultiTexCoordP2uiv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIPROC __glewMultiTexCoordP3ui; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIVPROC __glewMultiTexCoordP3uiv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIPROC __glewMultiTexCoordP4ui; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIVPROC __glewMultiTexCoordP4uiv; -GLEW_FUN_EXPORT PFNGLNORMALP3UIPROC __glewNormalP3ui; -GLEW_FUN_EXPORT PFNGLNORMALP3UIVPROC __glewNormalP3uiv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIPROC __glewSecondaryColorP3ui; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIVPROC __glewSecondaryColorP3uiv; -GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIPROC __glewTexCoordP1ui; -GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIVPROC __glewTexCoordP1uiv; -GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIPROC __glewTexCoordP2ui; -GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIVPROC __glewTexCoordP2uiv; -GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIPROC __glewTexCoordP3ui; -GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIVPROC __glewTexCoordP3uiv; -GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIPROC __glewTexCoordP4ui; -GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIVPROC __glewTexCoordP4uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIPROC __glewVertexAttribP1ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIVPROC __glewVertexAttribP1uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIPROC __glewVertexAttribP2ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIVPROC __glewVertexAttribP2uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIPROC __glewVertexAttribP3ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIVPROC __glewVertexAttribP3uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIPROC __glewVertexAttribP4ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIVPROC __glewVertexAttribP4uiv; -GLEW_FUN_EXPORT PFNGLVERTEXP2UIPROC __glewVertexP2ui; -GLEW_FUN_EXPORT PFNGLVERTEXP2UIVPROC __glewVertexP2uiv; -GLEW_FUN_EXPORT PFNGLVERTEXP3UIPROC __glewVertexP3ui; -GLEW_FUN_EXPORT PFNGLVERTEXP3UIVPROC __glewVertexP3uiv; -GLEW_FUN_EXPORT PFNGLVERTEXP4UIPROC __glewVertexP4ui; -GLEW_FUN_EXPORT PFNGLVERTEXP4UIVPROC __glewVertexP4uiv; - -GLEW_FUN_EXPORT PFNGLDEPTHRANGEARRAYVPROC __glewDepthRangeArrayv; -GLEW_FUN_EXPORT PFNGLDEPTHRANGEINDEXEDPROC __glewDepthRangeIndexed; -GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VPROC __glewGetDoublei_v; -GLEW_FUN_EXPORT PFNGLGETFLOATI_VPROC __glewGetFloati_v; -GLEW_FUN_EXPORT PFNGLSCISSORARRAYVPROC __glewScissorArrayv; -GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDPROC __glewScissorIndexed; -GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDVPROC __glewScissorIndexedv; -GLEW_FUN_EXPORT PFNGLVIEWPORTARRAYVPROC __glewViewportArrayv; -GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFPROC __glewViewportIndexedf; -GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFVPROC __glewViewportIndexedfv; - -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB; - -GLEW_FUN_EXPORT PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI; - -GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI; -GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI; -GLEW_FUN_EXPORT PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI; - -GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI; -GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI; -GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI; -GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI; - -GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI; -GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI; -GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI; -GLEW_FUN_EXPORT PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI; -GLEW_FUN_EXPORT PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI; -GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI; -GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI; -GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI; -GLEW_FUN_EXPORT PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI; -GLEW_FUN_EXPORT PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI; -GLEW_FUN_EXPORT PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI; -GLEW_FUN_EXPORT PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI; -GLEW_FUN_EXPORT PFNGLSAMPLEMAPATIPROC __glewSampleMapATI; -GLEW_FUN_EXPORT PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI; - -GLEW_FUN_EXPORT PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI; -GLEW_FUN_EXPORT PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI; - -GLEW_FUN_EXPORT PFNGLPNTRIANGLESFATIPROC __glewPNTrianglesfATI; -GLEW_FUN_EXPORT PFNGLPNTRIANGLESIATIPROC __glewPNTrianglesiATI; - -GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI; -GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI; - -GLEW_FUN_EXPORT PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI; -GLEW_FUN_EXPORT PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI; -GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI; -GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI; -GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI; -GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI; -GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI; -GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI; -GLEW_FUN_EXPORT PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI; -GLEW_FUN_EXPORT PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI; -GLEW_FUN_EXPORT PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI; -GLEW_FUN_EXPORT PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI; - -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI; - -GLEW_FUN_EXPORT PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI; -GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI; -GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1DATIPROC __glewVertexStream1dATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1DVATIPROC __glewVertexStream1dvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1FATIPROC __glewVertexStream1fATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1FVATIPROC __glewVertexStream1fvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1IATIPROC __glewVertexStream1iATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1IVATIPROC __glewVertexStream1ivATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1SATIPROC __glewVertexStream1sATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1SVATIPROC __glewVertexStream1svATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI; - -GLEW_FUN_EXPORT PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC __glewEGLImageTargetTexStorageEXT; -GLEW_FUN_EXPORT PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC __glewEGLImageTargetTextureStorageEXT; - -GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC __glewDrawArraysInstancedBaseInstanceEXT; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC __glewDrawElementsInstancedBaseInstanceEXT; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC __glewDrawElementsInstancedBaseVertexBaseInstanceEXT; - -GLEW_FUN_EXPORT PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT; -GLEW_FUN_EXPORT PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT; -GLEW_FUN_EXPORT PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT; - -GLEW_FUN_EXPORT PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT; - -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT; - -GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC __glewBindFragDataLocationIndexedEXT; -GLEW_FUN_EXPORT PFNGLGETFRAGDATAINDEXEXTPROC __glewGetFragDataIndexEXT; -GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC __glewGetProgramResourceLocationIndexEXT; - -GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT; - -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT; - -GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEEXTPROC __glewBufferStorageEXT; -GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEEXTPROC __glewNamedBufferStorageEXT; - -GLEW_FUN_EXPORT PFNGLCLEARTEXIMAGEEXTPROC __glewClearTexImageEXT; -GLEW_FUN_EXPORT PFNGLCLEARTEXSUBIMAGEEXTPROC __glewClearTexSubImageEXT; - -GLEW_FUN_EXPORT PFNGLCLIPCONTROLEXTPROC __glewClipControlEXT; - -GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT; -GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT; - -GLEW_FUN_EXPORT PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT; -GLEW_FUN_EXPORT PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT; - -GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT; -GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT; -GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT; - -GLEW_FUN_EXPORT PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT; -GLEW_FUN_EXPORT PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT; - -GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATAEXTPROC __glewCopyImageSubDataEXT; - -GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT; - -GLEW_FUN_EXPORT PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT; -GLEW_FUN_EXPORT PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT; - -GLEW_FUN_EXPORT PFNGLGETOBJECTLABELEXTPROC __glewGetObjectLabelEXT; -GLEW_FUN_EXPORT PFNGLLABELOBJECTEXTPROC __glewLabelObjectEXT; - -GLEW_FUN_EXPORT PFNGLINSERTEVENTMARKEREXTPROC __glewInsertEventMarkerEXT; -GLEW_FUN_EXPORT PFNGLPOPGROUPMARKEREXTPROC __glewPopGroupMarkerEXT; -GLEW_FUN_EXPORT PFNGLPUSHGROUPMARKEREXTPROC __glewPushGroupMarkerEXT; - -GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT; - -GLEW_FUN_EXPORT PFNGLBINDMULTITEXTUREEXTPROC __glewBindMultiTextureEXT; -GLEW_FUN_EXPORT PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __glewCheckNamedFramebufferStatusEXT; -GLEW_FUN_EXPORT PFNGLCLIENTATTRIBDEFAULTEXTPROC __glewClientAttribDefaultEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __glewCompressedMultiTexImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __glewCompressedMultiTexImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __glewCompressedMultiTexImage3DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __glewCompressedMultiTexSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __glewCompressedMultiTexSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __glewCompressedMultiTexSubImage3DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __glewCompressedTextureImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __glewCompressedTextureImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __glewCompressedTextureImage3DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __glewCompressedTextureSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __glewCompressedTextureSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __glewCompressedTextureSubImage3DEXT; -GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE1DEXTPROC __glewCopyMultiTexImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE2DEXTPROC __glewCopyMultiTexImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC __glewCopyMultiTexSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC __glewCopyMultiTexSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC __glewCopyMultiTexSubImage3DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE1DEXTPROC __glewCopyTextureImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE2DEXTPROC __glewCopyTextureImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT; -GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT; -GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT; -GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT; -GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT; -GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT; -GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT; -GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT; -GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT; -GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT; -GLEW_FUN_EXPORT PFNGLGENERATEMULTITEXMIPMAPEXTPROC __glewGenerateMultiTexMipmapEXT; -GLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT; -GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT; -GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT; -GLEW_FUN_EXPORT PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT; -GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT; -GLEW_FUN_EXPORT PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT; -GLEW_FUN_EXPORT PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT; -GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXGENDVEXTPROC __glewGetMultiTexGendvEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXGENFVEXTPROC __glewGetMultiTexGenfvEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXGENIVEXTPROC __glewGetMultiTexGenivEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXIMAGEEXTPROC __glewGetMultiTexImageEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC __glewGetMultiTexLevelParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC __glewGetMultiTexLevelParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIIVEXTPROC __glewGetMultiTexParameterIivEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIUIVEXTPROC __glewGetMultiTexParameterIuivEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERFVEXTPROC __glewGetMultiTexParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIVEXTPROC __glewGetMultiTexParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC __glewGetNamedBufferParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPOINTERVEXTPROC __glewGetNamedBufferPointervEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERSUBDATAEXTPROC __glewGetNamedBufferSubDataEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetNamedFramebufferAttachmentParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __glewGetNamedProgramLocalParameterIivEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __glewGetNamedProgramLocalParameterIuivEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __glewGetNamedProgramLocalParameterdvEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __glewGetNamedProgramLocalParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT; -GLEW_FUN_EXPORT PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT; -GLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT; -GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT; -GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT; -GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT; -GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT; -GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT; -GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT; -GLEW_FUN_EXPORT PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT; -GLEW_FUN_EXPORT PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT; -GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT; -GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEFEXTPROC __glewMatrixLoadTransposefEXT; -GLEW_FUN_EXPORT PFNGLMATRIXLOADDEXTPROC __glewMatrixLoaddEXT; -GLEW_FUN_EXPORT PFNGLMATRIXLOADFEXTPROC __glewMatrixLoadfEXT; -GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEDEXTPROC __glewMatrixMultTransposedEXT; -GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEFEXTPROC __glewMatrixMultTransposefEXT; -GLEW_FUN_EXPORT PFNGLMATRIXMULTDEXTPROC __glewMatrixMultdEXT; -GLEW_FUN_EXPORT PFNGLMATRIXMULTFEXTPROC __glewMatrixMultfEXT; -GLEW_FUN_EXPORT PFNGLMATRIXORTHOEXTPROC __glewMatrixOrthoEXT; -GLEW_FUN_EXPORT PFNGLMATRIXPOPEXTPROC __glewMatrixPopEXT; -GLEW_FUN_EXPORT PFNGLMATRIXPUSHEXTPROC __glewMatrixPushEXT; -GLEW_FUN_EXPORT PFNGLMATRIXROTATEDEXTPROC __glewMatrixRotatedEXT; -GLEW_FUN_EXPORT PFNGLMATRIXROTATEFEXTPROC __glewMatrixRotatefEXT; -GLEW_FUN_EXPORT PFNGLMATRIXSCALEDEXTPROC __glewMatrixScaledEXT; -GLEW_FUN_EXPORT PFNGLMATRIXSCALEFEXTPROC __glewMatrixScalefEXT; -GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEDEXTPROC __glewMatrixTranslatedEXT; -GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEFEXTPROC __glewMatrixTranslatefEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXBUFFEREXTPROC __glewMultiTexBufferEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDPOINTEREXTPROC __glewMultiTexCoordPointerEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXENVFEXTPROC __glewMultiTexEnvfEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXENVFVEXTPROC __glewMultiTexEnvfvEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXENVIEXTPROC __glewMultiTexEnviEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXENVIVEXTPROC __glewMultiTexEnvivEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXGENDEXTPROC __glewMultiTexGendEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXGENDVEXTPROC __glewMultiTexGendvEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXGENFEXTPROC __glewMultiTexGenfEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXGENFVEXTPROC __glewMultiTexGenfvEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXGENIEXTPROC __glewMultiTexGeniEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXGENIVEXTPROC __glewMultiTexGenivEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE1DEXTPROC __glewMultiTexImage1DEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE2DEXTPROC __glewMultiTexImage2DEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE3DEXTPROC __glewMultiTexImage3DEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIIVEXTPROC __glewMultiTexParameterIivEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIUIVEXTPROC __glewMultiTexParameterIuivEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFEXTPROC __glewMultiTexParameterfEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFVEXTPROC __glewMultiTexParameterfvEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIEXTPROC __glewMultiTexParameteriEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIVEXTPROC __glewMultiTexParameterivEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXRENDERBUFFEREXTPROC __glewMultiTexRenderbufferEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE1DEXTPROC __glewMultiTexSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT; -GLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT; -GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT; -GLEW_FUN_EXPORT PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __glewNamedFramebufferTexture3DEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __glewNamedFramebufferTextureEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __glewNamedFramebufferTextureFaceEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __glewNamedFramebufferTextureLayerEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __glewNamedProgramLocalParameter4dEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __glewNamedProgramLocalParameter4dvEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __glewNamedProgramLocalParameter4fEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __glewNamedProgramLocalParameter4fvEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __glewNamedProgramLocalParameterI4iEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __glewNamedProgramLocalParameterI4ivEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __glewNamedProgramLocalParameterI4uiEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __glewNamedProgramLocalParameterI4uivEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __glewNamedProgramLocalParameters4fvEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __glewNamedProgramLocalParametersI4ivEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __glewNamedProgramLocalParametersI4uivEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT; -GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT; -GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT; -GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT; -GLEW_FUN_EXPORT PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE1DEXTPROC __glewTextureImage1DEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DEXTPROC __glewTextureImage2DEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DEXTPROC __glewTextureImage3DEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIIVEXTPROC __glewTextureParameterIivEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIUIVEXTPROC __glewTextureParameterIuivEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFEXTPROC __glewTextureParameterfEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFVEXTPROC __glewTextureParameterfvEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIEXTPROC __glewTextureParameteriEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIVEXTPROC __glewTextureParameterivEXT; -GLEW_FUN_EXPORT PFNGLTEXTURERENDERBUFFEREXTPROC __glewTextureRenderbufferEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT; -GLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC __glewVertexArrayVertexAttribDivisorEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT; - -GLEW_FUN_EXPORT PFNGLDISCARDFRAMEBUFFEREXTPROC __glewDiscardFramebufferEXT; - -GLEW_FUN_EXPORT PFNGLBEGINQUERYEXTPROC __glewBeginQueryEXT; -GLEW_FUN_EXPORT PFNGLDELETEQUERIESEXTPROC __glewDeleteQueriesEXT; -GLEW_FUN_EXPORT PFNGLENDQUERYEXTPROC __glewEndQueryEXT; -GLEW_FUN_EXPORT PFNGLGENQUERIESEXTPROC __glewGenQueriesEXT; -GLEW_FUN_EXPORT PFNGLGETINTEGER64VEXTPROC __glewGetInteger64vEXT; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVEXTPROC __glewGetQueryObjectivEXT; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVEXTPROC __glewGetQueryObjectuivEXT; -GLEW_FUN_EXPORT PFNGLGETQUERYIVEXTPROC __glewGetQueryivEXT; -GLEW_FUN_EXPORT PFNGLISQUERYEXTPROC __glewIsQueryEXT; -GLEW_FUN_EXPORT PFNGLQUERYCOUNTEREXTPROC __glewQueryCounterEXT; - -GLEW_FUN_EXPORT PFNGLDRAWBUFFERSEXTPROC __glewDrawBuffersEXT; - -GLEW_FUN_EXPORT PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT; -GLEW_FUN_EXPORT PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT; -GLEW_FUN_EXPORT PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT; -GLEW_FUN_EXPORT PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT; -GLEW_FUN_EXPORT PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT; -GLEW_FUN_EXPORT PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT; - -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIEXTPROC __glewBlendEquationSeparateiEXT; -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIEXTPROC __glewBlendEquationiEXT; -GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIEXTPROC __glewBlendFuncSeparateiEXT; -GLEW_FUN_EXPORT PFNGLBLENDFUNCIEXTPROC __glewBlendFunciEXT; -GLEW_FUN_EXPORT PFNGLCOLORMASKIEXTPROC __glewColorMaskiEXT; -GLEW_FUN_EXPORT PFNGLDISABLEIEXTPROC __glewDisableiEXT; -GLEW_FUN_EXPORT PFNGLENABLEIEXTPROC __glewEnableiEXT; -GLEW_FUN_EXPORT PFNGLISENABLEDIEXTPROC __glewIsEnablediEXT; - -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSBASEVERTEXEXTPROC __glewDrawElementsBaseVertexEXT; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC __glewDrawElementsInstancedBaseVertexEXT; -GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC __glewDrawRangeElementsBaseVertexEXT; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC __glewMultiDrawElementsBaseVertexEXT; - -GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT; - -GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT; - -GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKEXTPROC __glewDrawTransformFeedbackEXT; -GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDEXTPROC __glewDrawTransformFeedbackInstancedEXT; - -GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEEXTERNALEXTPROC __glewBufferStorageExternalEXT; -GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC __glewNamedBufferStorageExternalEXT; - -GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT; -GLEW_FUN_EXPORT PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT; -GLEW_FUN_EXPORT PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT; -GLEW_FUN_EXPORT PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT; -GLEW_FUN_EXPORT PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT; - -GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT; -GLEW_FUN_EXPORT PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT; - -GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT; - -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT; - -GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT; -GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT; -GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT; -GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT; -GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT; -GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT; -GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT; -GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT; -GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT; -GLEW_FUN_EXPORT PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT; -GLEW_FUN_EXPORT PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT; -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT; - -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT; - -GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT; -GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT; -GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT; - -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT; -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT; -GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT; -GLEW_FUN_EXPORT PFNGLHISTOGRAMEXTPROC __glewHistogramEXT; -GLEW_FUN_EXPORT PFNGLMINMAXEXTPROC __glewMinmaxEXT; -GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT; -GLEW_FUN_EXPORT PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT; - -GLEW_FUN_EXPORT PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT; - -GLEW_FUN_EXPORT PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT; - -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISOREXTPROC __glewVertexAttribDivisorEXT; - -GLEW_FUN_EXPORT PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT; -GLEW_FUN_EXPORT PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT; - -GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC __glewFlushMappedBufferRangeEXT; -GLEW_FUN_EXPORT PFNGLMAPBUFFERRANGEEXTPROC __glewMapBufferRangeEXT; - -GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEMEMEXTPROC __glewBufferStorageMemEXT; -GLEW_FUN_EXPORT PFNGLCREATEMEMORYOBJECTSEXTPROC __glewCreateMemoryObjectsEXT; -GLEW_FUN_EXPORT PFNGLDELETEMEMORYOBJECTSEXTPROC __glewDeleteMemoryObjectsEXT; -GLEW_FUN_EXPORT PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC __glewGetMemoryObjectParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETUNSIGNEDBYTEI_VEXTPROC __glewGetUnsignedBytei_vEXT; -GLEW_FUN_EXPORT PFNGLGETUNSIGNEDBYTEVEXTPROC __glewGetUnsignedBytevEXT; -GLEW_FUN_EXPORT PFNGLISMEMORYOBJECTEXTPROC __glewIsMemoryObjectEXT; -GLEW_FUN_EXPORT PFNGLMEMORYOBJECTPARAMETERIVEXTPROC __glewMemoryObjectParameterivEXT; -GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC __glewNamedBufferStorageMemEXT; -GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM1DEXTPROC __glewTexStorageMem1DEXT; -GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM2DEXTPROC __glewTexStorageMem2DEXT; -GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC __glewTexStorageMem2DMultisampleEXT; -GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM3DEXTPROC __glewTexStorageMem3DEXT; -GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC __glewTexStorageMem3DMultisampleEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM1DEXTPROC __glewTextureStorageMem1DEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM2DEXTPROC __glewTextureStorageMem2DEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC __glewTextureStorageMem2DMultisampleEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM3DEXTPROC __glewTextureStorageMem3DEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC __glewTextureStorageMem3DMultisampleEXT; - -GLEW_FUN_EXPORT PFNGLIMPORTMEMORYFDEXTPROC __glewImportMemoryFdEXT; - -GLEW_FUN_EXPORT PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC __glewImportMemoryWin32HandleEXT; -GLEW_FUN_EXPORT PFNGLIMPORTMEMORYWIN32NAMEEXTPROC __glewImportMemoryWin32NameEXT; - -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT; - -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC __glewMultiDrawArraysIndirectEXT; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC __glewMultiDrawElementsIndirectEXT; - -GLEW_FUN_EXPORT PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT; -GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC __glewFramebufferTexture2DMultisampleEXT; - -GLEW_FUN_EXPORT PFNGLDRAWBUFFERSINDEXEDEXTPROC __glewDrawBuffersIndexedEXT; -GLEW_FUN_EXPORT PFNGLGETINTEGERI_VEXTPROC __glewGetIntegeri_vEXT; -GLEW_FUN_EXPORT PFNGLREADBUFFERINDEXEDEXTPROC __glewReadBufferIndexedEXT; - -GLEW_FUN_EXPORT PFNGLCOLORTABLEEXTPROC __glewColorTableEXT; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT; - -GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT; - -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT; - -GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT; - -GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETCLAMPEXTPROC __glewPolygonOffsetClampEXT; - -GLEW_FUN_EXPORT PFNGLPRIMITIVEBOUNDINGBOXEXTPROC __glewPrimitiveBoundingBoxEXT; - -GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT; - -GLEW_FUN_EXPORT PFNGLCOVERAGEMODULATIONNVPROC __glewCoverageModulationNV; -GLEW_FUN_EXPORT PFNGLCOVERAGEMODULATIONTABLENVPROC __glewCoverageModulationTableNV; -GLEW_FUN_EXPORT PFNGLGETCOVERAGEMODULATIONTABLENVPROC __glewGetCoverageModulationTableNV; -GLEW_FUN_EXPORT PFNGLRASTERSAMPLESEXTPROC __glewRasterSamplesEXT; - -GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVEXTPROC __glewGetnUniformfvEXT; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVEXTPROC __glewGetnUniformivEXT; -GLEW_FUN_EXPORT PFNGLREADNPIXELSEXTPROC __glewReadnPixelsEXT; - -GLEW_FUN_EXPORT PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT; -GLEW_FUN_EXPORT PFNGLENDSCENEEXTPROC __glewEndSceneEXT; - -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT; - -GLEW_FUN_EXPORT PFNGLDELETESEMAPHORESEXTPROC __glewDeleteSemaphoresEXT; -GLEW_FUN_EXPORT PFNGLGENSEMAPHORESEXTPROC __glewGenSemaphoresEXT; -GLEW_FUN_EXPORT PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC __glewGetSemaphoreParameterui64vEXT; -GLEW_FUN_EXPORT PFNGLISSEMAPHOREEXTPROC __glewIsSemaphoreEXT; -GLEW_FUN_EXPORT PFNGLSEMAPHOREPARAMETERUI64VEXTPROC __glewSemaphoreParameterui64vEXT; -GLEW_FUN_EXPORT PFNGLSIGNALSEMAPHOREEXTPROC __glewSignalSemaphoreEXT; -GLEW_FUN_EXPORT PFNGLWAITSEMAPHOREEXTPROC __glewWaitSemaphoreEXT; - -GLEW_FUN_EXPORT PFNGLIMPORTSEMAPHOREFDEXTPROC __glewImportSemaphoreFdEXT; - -GLEW_FUN_EXPORT PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC __glewImportSemaphoreWin32HandleEXT; -GLEW_FUN_EXPORT PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC __glewImportSemaphoreWin32NameEXT; - -GLEW_FUN_EXPORT PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT; -GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT; -GLEW_FUN_EXPORT PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERFETCHBARRIEREXTPROC __glewFramebufferFetchBarrierEXT; - -GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREEXTPROC __glewBindImageTextureEXT; -GLEW_FUN_EXPORT PFNGLMEMORYBARRIEREXTPROC __glewMemoryBarrierEXT; - -GLEW_FUN_EXPORT PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC __glewClearPixelLocalStorageuiEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __glewFramebufferPixelLocalStorageSizeEXT; -GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __glewGetFramebufferPixelLocalStorageSizeEXT; - -GLEW_FUN_EXPORT PFNGLTEXPAGECOMMITMENTEXTPROC __glewTexPageCommitmentEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREPAGECOMMITMENTEXTPROC __glewTexturePageCommitmentEXT; - -GLEW_FUN_EXPORT PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT; - -GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT; - -GLEW_FUN_EXPORT PFNGLPATCHPARAMETERIEXTPROC __glewPatchParameteriEXT; - -GLEW_FUN_EXPORT PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT; - -GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIIVEXTPROC __glewGetSamplerParameterIivEXT; -GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIUIVEXTPROC __glewGetSamplerParameterIuivEXT; -GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIIVEXTPROC __glewSamplerParameterIivEXT; -GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIUIVEXTPROC __glewSamplerParameterIuivEXT; - -GLEW_FUN_EXPORT PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT; - -GLEW_FUN_EXPORT PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT; -GLEW_FUN_EXPORT PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT; -GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT; -GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT; -GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT; -GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT; - -GLEW_FUN_EXPORT PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT; -GLEW_FUN_EXPORT PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT; -GLEW_FUN_EXPORT PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT; -GLEW_FUN_EXPORT PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT; -GLEW_FUN_EXPORT PFNGLISTEXTUREEXTPROC __glewIsTextureEXT; -GLEW_FUN_EXPORT PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT; - -GLEW_FUN_EXPORT PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT; - -GLEW_FUN_EXPORT PFNGLTEXSTORAGE1DEXTPROC __glewTexStorage1DEXT; -GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DEXTPROC __glewTexStorage2DEXT; -GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DEXTPROC __glewTexStorage3DEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE1DEXTPROC __glewTextureStorage1DEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DEXTPROC __glewTextureStorage2DEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DEXTPROC __glewTextureStorage3DEXT; - -GLEW_FUN_EXPORT PFNGLTEXTUREVIEWEXTPROC __glewTextureViewEXT; - -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT; - -GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKEXTPROC __glewBeginTransformFeedbackEXT; -GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEEXTPROC __glewBindBufferBaseEXT; -GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETEXTPROC __glewBindBufferOffsetEXT; -GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEEXTPROC __glewBindBufferRangeEXT; -GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKEXTPROC __glewEndTransformFeedbackEXT; -GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC __glewGetTransformFeedbackVaryingEXT; -GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC __glewTransformFeedbackVaryingsEXT; - -GLEW_FUN_EXPORT PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT; -GLEW_FUN_EXPORT PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT; -GLEW_FUN_EXPORT PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT; -GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT; -GLEW_FUN_EXPORT PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT; -GLEW_FUN_EXPORT PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT; -GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT; -GLEW_FUN_EXPORT PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT; - -GLEW_FUN_EXPORT PFNGLBINDARRAYSETEXTPROC __glewBindArraySetEXT; -GLEW_FUN_EXPORT PFNGLCREATEARRAYSETEXTPROC __glewCreateArraySetExt; -GLEW_FUN_EXPORT PFNGLDELETEARRAYSETSEXTPROC __glewDeleteArraySetsEXT; - -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVEXTPROC __glewGetVertexAttribLdvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __glewVertexArrayVertexAttribLOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DEXTPROC __glewVertexAttribL1dEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVEXTPROC __glewVertexAttribL1dvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DEXTPROC __glewVertexAttribL2dEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVEXTPROC __glewVertexAttribL2dvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DEXTPROC __glewVertexAttribL3dEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVEXTPROC __glewVertexAttribL3dvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DEXTPROC __glewVertexAttribL4dEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVEXTPROC __glewVertexAttribL4dvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTEREXTPROC __glewVertexAttribLPointerEXT; - -GLEW_FUN_EXPORT PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT; -GLEW_FUN_EXPORT PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT; -GLEW_FUN_EXPORT PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT; -GLEW_FUN_EXPORT PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT; -GLEW_FUN_EXPORT PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT; -GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT; -GLEW_FUN_EXPORT PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT; -GLEW_FUN_EXPORT PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT; -GLEW_FUN_EXPORT PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT; -GLEW_FUN_EXPORT PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT; -GLEW_FUN_EXPORT PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT; -GLEW_FUN_EXPORT PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT; -GLEW_FUN_EXPORT PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT; -GLEW_FUN_EXPORT PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT; -GLEW_FUN_EXPORT PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT; -GLEW_FUN_EXPORT PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT; -GLEW_FUN_EXPORT PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT; -GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT; -GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT; -GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT; -GLEW_FUN_EXPORT PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT; -GLEW_FUN_EXPORT PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT; -GLEW_FUN_EXPORT PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT; -GLEW_FUN_EXPORT PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT; -GLEW_FUN_EXPORT PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT; -GLEW_FUN_EXPORT PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT; -GLEW_FUN_EXPORT PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT; -GLEW_FUN_EXPORT PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT; -GLEW_FUN_EXPORT PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT; -GLEW_FUN_EXPORT PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT; -GLEW_FUN_EXPORT PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT; -GLEW_FUN_EXPORT PFNGLSWIZZLEEXTPROC __glewSwizzleEXT; -GLEW_FUN_EXPORT PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT; -GLEW_FUN_EXPORT PFNGLVARIANTBVEXTPROC __glewVariantbvEXT; -GLEW_FUN_EXPORT PFNGLVARIANTDVEXTPROC __glewVariantdvEXT; -GLEW_FUN_EXPORT PFNGLVARIANTFVEXTPROC __glewVariantfvEXT; -GLEW_FUN_EXPORT PFNGLVARIANTIVEXTPROC __glewVariantivEXT; -GLEW_FUN_EXPORT PFNGLVARIANTSVEXTPROC __glewVariantsvEXT; -GLEW_FUN_EXPORT PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT; -GLEW_FUN_EXPORT PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT; -GLEW_FUN_EXPORT PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT; -GLEW_FUN_EXPORT PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT; - -GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT; -GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT; -GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT; - -GLEW_FUN_EXPORT PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC __glewAcquireKeyedMutexWin32EXT; -GLEW_FUN_EXPORT PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC __glewReleaseKeyedMutexWin32EXT; - -GLEW_FUN_EXPORT PFNGLWINDOWRECTANGLESEXTPROC __glewWindowRectanglesEXT; - -GLEW_FUN_EXPORT PFNGLIMPORTSYNCEXTPROC __glewImportSyncEXT; - -GLEW_FUN_EXPORT PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY; - -GLEW_FUN_EXPORT PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY; - -GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP; -GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP; -GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP; -GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP; -GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP; -GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP; - -GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM; -GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM; - -GLEW_FUN_EXPORT PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM; -GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM; -GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM; -GLEW_FUN_EXPORT PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM; -GLEW_FUN_EXPORT PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM; -GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM; -GLEW_FUN_EXPORT PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM; - -GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLEIMGPROC __glewGetTextureHandleIMG; -GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLEIMGPROC __glewGetTextureSamplerHandleIMG; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64IMGPROC __glewProgramUniformHandleui64IMG; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VIMGPROC __glewProgramUniformHandleui64vIMG; -GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64IMGPROC __glewUniformHandleui64IMG; -GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VIMGPROC __glewUniformHandleui64vIMG; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DDOWNSAMPLEIMGPROC __glewFramebufferTexture2DDownsampleIMG; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERDOWNSAMPLEIMGPROC __glewFramebufferTextureLayerDownsampleIMG; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC __glewFramebufferTexture2DMultisampleIMG; -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC __glewRenderbufferStorageMultisampleIMG; - -GLEW_FUN_EXPORT PFNGLMAPTEXTURE2DINTELPROC __glewMapTexture2DINTEL; -GLEW_FUN_EXPORT PFNGLSYNCTEXTUREINTELPROC __glewSyncTextureINTEL; -GLEW_FUN_EXPORT PFNGLUNMAPTEXTURE2DINTELPROC __glewUnmapTexture2DINTEL; - -GLEW_FUN_EXPORT PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL; -GLEW_FUN_EXPORT PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL; -GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL; -GLEW_FUN_EXPORT PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL; - -GLEW_FUN_EXPORT PFNGLBEGINPERFQUERYINTELPROC __glewBeginPerfQueryINTEL; -GLEW_FUN_EXPORT PFNGLCREATEPERFQUERYINTELPROC __glewCreatePerfQueryINTEL; -GLEW_FUN_EXPORT PFNGLDELETEPERFQUERYINTELPROC __glewDeletePerfQueryINTEL; -GLEW_FUN_EXPORT PFNGLENDPERFQUERYINTELPROC __glewEndPerfQueryINTEL; -GLEW_FUN_EXPORT PFNGLGETFIRSTPERFQUERYIDINTELPROC __glewGetFirstPerfQueryIdINTEL; -GLEW_FUN_EXPORT PFNGLGETNEXTPERFQUERYIDINTELPROC __glewGetNextPerfQueryIdINTEL; -GLEW_FUN_EXPORT PFNGLGETPERFCOUNTERINFOINTELPROC __glewGetPerfCounterInfoINTEL; -GLEW_FUN_EXPORT PFNGLGETPERFQUERYDATAINTELPROC __glewGetPerfQueryDataINTEL; -GLEW_FUN_EXPORT PFNGLGETPERFQUERYIDBYNAMEINTELPROC __glewGetPerfQueryIdByNameINTEL; -GLEW_FUN_EXPORT PFNGLGETPERFQUERYINFOINTELPROC __glewGetPerfQueryInfoINTEL; - -GLEW_FUN_EXPORT PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL; -GLEW_FUN_EXPORT PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL; - -GLEW_FUN_EXPORT PFNGLBLENDBARRIERKHRPROC __glewBlendBarrierKHR; - -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKPROC __glewDebugMessageCallback; -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLPROC __glewDebugMessageControl; -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert; -GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog; -GLEW_FUN_EXPORT PFNGLGETOBJECTLABELPROC __glewGetObjectLabel; -GLEW_FUN_EXPORT PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel; -GLEW_FUN_EXPORT PFNGLOBJECTLABELPROC __glewObjectLabel; -GLEW_FUN_EXPORT PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel; -GLEW_FUN_EXPORT PFNGLPOPDEBUGGROUPPROC __glewPopDebugGroup; -GLEW_FUN_EXPORT PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup; - -GLEW_FUN_EXPORT PFNGLMAXSHADERCOMPILERTHREADSKHRPROC __glewMaxShaderCompilerThreadsKHR; - -GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVPROC __glewGetnUniformfv; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVPROC __glewGetnUniformiv; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMUIVPROC __glewGetnUniformuiv; -GLEW_FUN_EXPORT PFNGLREADNPIXELSPROC __glewReadnPixels; - -GLEW_FUN_EXPORT PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled; -GLEW_FUN_EXPORT PFNGLDELETEBUFFERREGIONPROC __glewDeleteBufferRegion; -GLEW_FUN_EXPORT PFNGLDRAWBUFFERREGIONPROC __glewDrawBufferRegion; -GLEW_FUN_EXPORT PFNGLNEWBUFFERREGIONPROC __glewNewBufferRegion; -GLEW_FUN_EXPORT PFNGLREADBUFFERREGIONPROC __glewReadBufferRegion; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERPARAMETERIMESAPROC __glewFramebufferParameteriMESA; -GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVMESAPROC __glewGetFramebufferParameterivMESA; - -GLEW_FUN_EXPORT PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA; - -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA; - -GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVXPROC __glewBeginConditionalRenderNVX; -GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVXPROC __glewEndConditionalRenderNVX; - -GLEW_FUN_EXPORT PFNGLASYNCCOPYBUFFERSUBDATANVXPROC __glewAsyncCopyBufferSubDataNVX; -GLEW_FUN_EXPORT PFNGLASYNCCOPYIMAGESUBDATANVXPROC __glewAsyncCopyImageSubDataNVX; -GLEW_FUN_EXPORT PFNGLMULTICASTSCISSORARRAYVNVXPROC __glewMulticastScissorArrayvNVX; -GLEW_FUN_EXPORT PFNGLMULTICASTVIEWPORTARRAYVNVXPROC __glewMulticastViewportArrayvNVX; -GLEW_FUN_EXPORT PFNGLMULTICASTVIEWPORTPOSITIONWSCALENVXPROC __glewMulticastViewportPositionWScaleNVX; -GLEW_FUN_EXPORT PFNGLUPLOADGPUMASKNVXPROC __glewUploadGpuMaskNVX; - -GLEW_FUN_EXPORT PFNGLLGPUCOPYIMAGESUBDATANVXPROC __glewLGPUCopyImageSubDataNVX; -GLEW_FUN_EXPORT PFNGLLGPUINTERLOCKNVXPROC __glewLGPUInterlockNVX; -GLEW_FUN_EXPORT PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC __glewLGPUNamedBufferSubDataNVX; - -GLEW_FUN_EXPORT PFNGLCLIENTWAITSEMAPHOREUI64NVXPROC __glewClientWaitSemaphoreui64NVX; -GLEW_FUN_EXPORT PFNGLSIGNALSEMAPHOREUI64NVXPROC __glewSignalSemaphoreui64NVX; -GLEW_FUN_EXPORT PFNGLWAITSEMAPHOREUI64NVXPROC __glewWaitSemaphoreui64NVX; - -GLEW_FUN_EXPORT PFNGLSTEREOPARAMETERFNVPROC __glewStereoParameterfNV; -GLEW_FUN_EXPORT PFNGLSTEREOPARAMETERINVPROC __glewStereoParameteriNV; - -GLEW_FUN_EXPORT PFNGLALPHATOCOVERAGEDITHERCONTROLNVPROC __glewAlphaToCoverageDitherControlNV; - -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __glewMultiDrawArraysIndirectBindlessNV; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __glewMultiDrawElementsIndirectBindlessNV; - -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawArraysIndirectBindlessCountNV; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawElementsIndirectBindlessCountNV; - -GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV; -GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV; -GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV; -GLEW_FUN_EXPORT PFNGLISIMAGEHANDLERESIDENTNVPROC __glewIsImageHandleResidentNV; -GLEW_FUN_EXPORT PFNGLISTEXTUREHANDLERESIDENTNVPROC __glewIsTextureHandleResidentNV; -GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC __glewMakeImageHandleNonResidentNV; -GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLERESIDENTNVPROC __glewMakeImageHandleResidentNV; -GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC __glewMakeTextureHandleNonResidentNV; -GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLERESIDENTNVPROC __glewMakeTextureHandleResidentNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC __glewProgramUniformHandleui64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleui64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV; -GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV; - -GLEW_FUN_EXPORT PFNGLBLENDBARRIERNVPROC __glewBlendBarrierNV; -GLEW_FUN_EXPORT PFNGLBLENDPARAMETERINVPROC __glewBlendParameteriNV; - -GLEW_FUN_EXPORT PFNGLVIEWPORTPOSITIONWSCALENVPROC __glewViewportPositionWScaleNV; - -GLEW_FUN_EXPORT PFNGLCALLCOMMANDLISTNVPROC __glewCallCommandListNV; -GLEW_FUN_EXPORT PFNGLCOMMANDLISTSEGMENTSNVPROC __glewCommandListSegmentsNV; -GLEW_FUN_EXPORT PFNGLCOMPILECOMMANDLISTNVPROC __glewCompileCommandListNV; -GLEW_FUN_EXPORT PFNGLCREATECOMMANDLISTSNVPROC __glewCreateCommandListsNV; -GLEW_FUN_EXPORT PFNGLCREATESTATESNVPROC __glewCreateStatesNV; -GLEW_FUN_EXPORT PFNGLDELETECOMMANDLISTSNVPROC __glewDeleteCommandListsNV; -GLEW_FUN_EXPORT PFNGLDELETESTATESNVPROC __glewDeleteStatesNV; -GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSADDRESSNVPROC __glewDrawCommandsAddressNV; -GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSNVPROC __glewDrawCommandsNV; -GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC __glewDrawCommandsStatesAddressNV; -GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSSTATESNVPROC __glewDrawCommandsStatesNV; -GLEW_FUN_EXPORT PFNGLGETCOMMANDHEADERNVPROC __glewGetCommandHeaderNV; -GLEW_FUN_EXPORT PFNGLGETSTAGEINDEXNVPROC __glewGetStageIndexNV; -GLEW_FUN_EXPORT PFNGLISCOMMANDLISTNVPROC __glewIsCommandListNV; -GLEW_FUN_EXPORT PFNGLISSTATENVPROC __glewIsStateNV; -GLEW_FUN_EXPORT PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC __glewListDrawCommandsStatesClientNV; -GLEW_FUN_EXPORT PFNGLSTATECAPTURENVPROC __glewStateCaptureNV; - -GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV; -GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV; - -GLEW_FUN_EXPORT PFNGLSUBPIXELPRECISIONBIASNVPROC __glewSubpixelPrecisionBiasNV; - -GLEW_FUN_EXPORT PFNGLCONSERVATIVERASTERPARAMETERFNVPROC __glewConservativeRasterParameterfNV; - -GLEW_FUN_EXPORT PFNGLCONSERVATIVERASTERPARAMETERINVPROC __glewConservativeRasterParameteriNV; - -GLEW_FUN_EXPORT PFNGLCOPYBUFFERSUBDATANVPROC __glewCopyBufferSubDataNV; - -GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV; - -GLEW_FUN_EXPORT PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV; -GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV; -GLEW_FUN_EXPORT PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV; - -GLEW_FUN_EXPORT PFNGLDRAWBUFFERSNVPROC __glewDrawBuffersNV; - -GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDNVPROC __glewDrawArraysInstancedNV; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDNVPROC __glewDrawElementsInstancedNV; - -GLEW_FUN_EXPORT PFNGLDRAWTEXTURENVPROC __glewDrawTextureNV; - -GLEW_FUN_EXPORT PFNGLDRAWVKIMAGENVPROC __glewDrawVkImageNV; -GLEW_FUN_EXPORT PFNGLGETVKPROCADDRNVPROC __glewGetVkProcAddrNV; -GLEW_FUN_EXPORT PFNGLSIGNALVKFENCENVPROC __glewSignalVkFenceNV; -GLEW_FUN_EXPORT PFNGLSIGNALVKSEMAPHORENVPROC __glewSignalVkSemaphoreNV; -GLEW_FUN_EXPORT PFNGLWAITVKSEMAPHORENVPROC __glewWaitVkSemaphoreNV; - -GLEW_FUN_EXPORT PFNGLEVALMAPSNVPROC __glewEvalMapsNV; -GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV; -GLEW_FUN_EXPORT PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV; -GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV; -GLEW_FUN_EXPORT PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV; -GLEW_FUN_EXPORT PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV; -GLEW_FUN_EXPORT PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV; - -GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVNVPROC __glewGetMultisamplefvNV; -GLEW_FUN_EXPORT PFNGLSAMPLEMASKINDEXEDNVPROC __glewSampleMaskIndexedNV; -GLEW_FUN_EXPORT PFNGLTEXRENDERBUFFERNVPROC __glewTexRenderbufferNV; - -GLEW_FUN_EXPORT PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV; -GLEW_FUN_EXPORT PFNGLFINISHFENCENVPROC __glewFinishFenceNV; -GLEW_FUN_EXPORT PFNGLGENFENCESNVPROC __glewGenFencesNV; -GLEW_FUN_EXPORT PFNGLGETFENCEIVNVPROC __glewGetFenceivNV; -GLEW_FUN_EXPORT PFNGLISFENCENVPROC __glewIsFenceNV; -GLEW_FUN_EXPORT PFNGLSETFENCENVPROC __glewSetFenceNV; -GLEW_FUN_EXPORT PFNGLTESTFENCENVPROC __glewTestFenceNV; - -GLEW_FUN_EXPORT PFNGLFRAGMENTCOVERAGECOLORNVPROC __glewFragmentCoverageColorNV; - -GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV; -GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV; -GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV; -GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV; -GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV; -GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV; - -GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERNVPROC __glewBlitFramebufferNV; - -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC __glewRenderbufferStorageMultisampleNV; - -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV; - -GLEW_FUN_EXPORT PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV; - -GLEW_FUN_EXPORT PFNGLMULTICASTBARRIERNVPROC __glewMulticastBarrierNV; -GLEW_FUN_EXPORT PFNGLMULTICASTBLITFRAMEBUFFERNVPROC __glewMulticastBlitFramebufferNV; -GLEW_FUN_EXPORT PFNGLMULTICASTBUFFERSUBDATANVPROC __glewMulticastBufferSubDataNV; -GLEW_FUN_EXPORT PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC __glewMulticastCopyBufferSubDataNV; -GLEW_FUN_EXPORT PFNGLMULTICASTCOPYIMAGESUBDATANVPROC __glewMulticastCopyImageSubDataNV; -GLEW_FUN_EXPORT PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewMulticastFramebufferSampleLocationsfvNV; -GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC __glewMulticastGetQueryObjecti64vNV; -GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTIVNVPROC __glewMulticastGetQueryObjectivNV; -GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC __glewMulticastGetQueryObjectui64vNV; -GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC __glewMulticastGetQueryObjectuivNV; -GLEW_FUN_EXPORT PFNGLMULTICASTWAITSYNCNVPROC __glewMulticastWaitSyncNV; -GLEW_FUN_EXPORT PFNGLRENDERGPUMASKNVPROC __glewRenderGpuMaskNV; - -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV; - -GLEW_FUN_EXPORT PFNGLGETUNIFORMI64VNVPROC __glewGetUniformi64vNV; -GLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64NVPROC __glewProgramUniform1i64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64VNVPROC __glewProgramUniform1i64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64NVPROC __glewProgramUniform1ui64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64VNVPROC __glewProgramUniform1ui64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64NVPROC __glewProgramUniform2i64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64VNVPROC __glewProgramUniform2i64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64NVPROC __glewProgramUniform2ui64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64VNVPROC __glewProgramUniform2ui64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64NVPROC __glewProgramUniform3i64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64VNVPROC __glewProgramUniform3i64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64NVPROC __glewProgramUniform3ui64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64VNVPROC __glewProgramUniform3ui64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64NVPROC __glewProgramUniform4i64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64VNVPROC __glewProgramUniform4i64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64NVPROC __glewProgramUniform4ui64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64VNVPROC __glewProgramUniform4ui64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM1I64NVPROC __glewUniform1i64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM1I64VNVPROC __glewUniform1i64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM1UI64NVPROC __glewUniform1ui64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM1UI64VNVPROC __glewUniform1ui64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM2I64NVPROC __glewUniform2i64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM2I64VNVPROC __glewUniform2i64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM2UI64NVPROC __glewUniform2ui64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM2UI64VNVPROC __glewUniform2ui64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM3I64NVPROC __glewUniform3i64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM3I64VNVPROC __glewUniform3i64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM3UI64NVPROC __glewUniform3ui64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM3UI64VNVPROC __glewUniform3ui64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM4I64NVPROC __glewUniform4i64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM4I64VNVPROC __glewUniform4i64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM4UI64NVPROC __glewUniform4ui64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM4UI64VNVPROC __glewUniform4ui64vNV; - -GLEW_FUN_EXPORT PFNGLCOLOR3HNVPROC __glewColor3hNV; -GLEW_FUN_EXPORT PFNGLCOLOR3HVNVPROC __glewColor3hvNV; -GLEW_FUN_EXPORT PFNGLCOLOR4HNVPROC __glewColor4hNV; -GLEW_FUN_EXPORT PFNGLCOLOR4HVNVPROC __glewColor4hvNV; -GLEW_FUN_EXPORT PFNGLFOGCOORDHNVPROC __glewFogCoordhNV; -GLEW_FUN_EXPORT PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV; -GLEW_FUN_EXPORT PFNGLNORMAL3HNVPROC __glewNormal3hNV; -GLEW_FUN_EXPORT PFNGLNORMAL3HVNVPROC __glewNormal3hvNV; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV; -GLEW_FUN_EXPORT PFNGLVERTEX2HNVPROC __glewVertex2hNV; -GLEW_FUN_EXPORT PFNGLVERTEX2HVNVPROC __glewVertex2hvNV; -GLEW_FUN_EXPORT PFNGLVERTEX3HNVPROC __glewVertex3hNV; -GLEW_FUN_EXPORT PFNGLVERTEX3HVNVPROC __glewVertex3hvNV; -GLEW_FUN_EXPORT PFNGLVERTEX4HNVPROC __glewVertex4hNV; -GLEW_FUN_EXPORT PFNGLVERTEX4HVNVPROC __glewVertex4hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV; -GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV; - -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORNVPROC __glewVertexAttribDivisorNV; - -GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATSAMPLEIVNVPROC __glewGetInternalformatSampleivNV; - -GLEW_FUN_EXPORT PFNGLBUFFERATTACHMEMORYNVPROC __glewBufferAttachMemoryNV; -GLEW_FUN_EXPORT PFNGLGETMEMORYOBJECTDETACHEDRESOURCESUIVNVPROC __glewGetMemoryObjectDetachedResourcesuivNV; -GLEW_FUN_EXPORT PFNGLNAMEDBUFFERATTACHMEMORYNVPROC __glewNamedBufferAttachMemoryNV; -GLEW_FUN_EXPORT PFNGLRESETMEMORYOBJECTPARAMETERNVPROC __glewResetMemoryObjectParameterNV; -GLEW_FUN_EXPORT PFNGLTEXATTACHMEMORYNVPROC __glewTexAttachMemoryNV; -GLEW_FUN_EXPORT PFNGLTEXTUREATTACHMEMORYNVPROC __glewTextureAttachMemoryNV; - -GLEW_FUN_EXPORT PFNGLDRAWMESHTASKSINDIRECTNVPROC __glewDrawMeshTasksIndirectNV; -GLEW_FUN_EXPORT PFNGLDRAWMESHTASKSNVPROC __glewDrawMeshTasksNV; -GLEW_FUN_EXPORT PFNGLMULTIDRAWMESHTASKSINDIRECTCOUNTNVPROC __glewMultiDrawMeshTasksIndirectCountNV; -GLEW_FUN_EXPORT PFNGLMULTIDRAWMESHTASKSINDIRECTNVPROC __glewMultiDrawMeshTasksIndirectNV; - -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3FVNVPROC __glewUniformMatrix2x3fvNV; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4FVNVPROC __glewUniformMatrix2x4fvNV; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2FVNVPROC __glewUniformMatrix3x2fvNV; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4FVNVPROC __glewUniformMatrix3x4fvNV; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2FVNVPROC __glewUniformMatrix4x2fvNV; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVNVPROC __glewUniformMatrix4x3fvNV; - -GLEW_FUN_EXPORT PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV; -GLEW_FUN_EXPORT PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV; -GLEW_FUN_EXPORT PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV; -GLEW_FUN_EXPORT PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV; -GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV; -GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV; -GLEW_FUN_EXPORT PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV; - -GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV; - -GLEW_FUN_EXPORT PFNGLCOPYPATHNVPROC __glewCopyPathNV; -GLEW_FUN_EXPORT PFNGLCOVERFILLPATHINSTANCEDNVPROC __glewCoverFillPathInstancedNV; -GLEW_FUN_EXPORT PFNGLCOVERFILLPATHNVPROC __glewCoverFillPathNV; -GLEW_FUN_EXPORT PFNGLCOVERSTROKEPATHINSTANCEDNVPROC __glewCoverStrokePathInstancedNV; -GLEW_FUN_EXPORT PFNGLCOVERSTROKEPATHNVPROC __glewCoverStrokePathNV; -GLEW_FUN_EXPORT PFNGLDELETEPATHSNVPROC __glewDeletePathsNV; -GLEW_FUN_EXPORT PFNGLGENPATHSNVPROC __glewGenPathsNV; -GLEW_FUN_EXPORT PFNGLGETPATHCOLORGENFVNVPROC __glewGetPathColorGenfvNV; -GLEW_FUN_EXPORT PFNGLGETPATHCOLORGENIVNVPROC __glewGetPathColorGenivNV; -GLEW_FUN_EXPORT PFNGLGETPATHCOMMANDSNVPROC __glewGetPathCommandsNV; -GLEW_FUN_EXPORT PFNGLGETPATHCOORDSNVPROC __glewGetPathCoordsNV; -GLEW_FUN_EXPORT PFNGLGETPATHDASHARRAYNVPROC __glewGetPathDashArrayNV; -GLEW_FUN_EXPORT PFNGLGETPATHLENGTHNVPROC __glewGetPathLengthNV; -GLEW_FUN_EXPORT PFNGLGETPATHMETRICRANGENVPROC __glewGetPathMetricRangeNV; -GLEW_FUN_EXPORT PFNGLGETPATHMETRICSNVPROC __glewGetPathMetricsNV; -GLEW_FUN_EXPORT PFNGLGETPATHPARAMETERFVNVPROC __glewGetPathParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETPATHPARAMETERIVNVPROC __glewGetPathParameterivNV; -GLEW_FUN_EXPORT PFNGLGETPATHSPACINGNVPROC __glewGetPathSpacingNV; -GLEW_FUN_EXPORT PFNGLGETPATHTEXGENFVNVPROC __glewGetPathTexGenfvNV; -GLEW_FUN_EXPORT PFNGLGETPATHTEXGENIVNVPROC __glewGetPathTexGenivNV; -GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEFVNVPROC __glewGetProgramResourcefvNV; -GLEW_FUN_EXPORT PFNGLINTERPOLATEPATHSNVPROC __glewInterpolatePathsNV; -GLEW_FUN_EXPORT PFNGLISPATHNVPROC __glewIsPathNV; -GLEW_FUN_EXPORT PFNGLISPOINTINFILLPATHNVPROC __glewIsPointInFillPathNV; -GLEW_FUN_EXPORT PFNGLISPOINTINSTROKEPATHNVPROC __glewIsPointInStrokePathNV; -GLEW_FUN_EXPORT PFNGLMATRIXLOAD3X2FNVPROC __glewMatrixLoad3x2fNV; -GLEW_FUN_EXPORT PFNGLMATRIXLOAD3X3FNVPROC __glewMatrixLoad3x3fNV; -GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC __glewMatrixLoadTranspose3x3fNV; -GLEW_FUN_EXPORT PFNGLMATRIXMULT3X2FNVPROC __glewMatrixMult3x2fNV; -GLEW_FUN_EXPORT PFNGLMATRIXMULT3X3FNVPROC __glewMatrixMult3x3fNV; -GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC __glewMatrixMultTranspose3x3fNV; -GLEW_FUN_EXPORT PFNGLPATHCOLORGENNVPROC __glewPathColorGenNV; -GLEW_FUN_EXPORT PFNGLPATHCOMMANDSNVPROC __glewPathCommandsNV; -GLEW_FUN_EXPORT PFNGLPATHCOORDSNVPROC __glewPathCoordsNV; -GLEW_FUN_EXPORT PFNGLPATHCOVERDEPTHFUNCNVPROC __glewPathCoverDepthFuncNV; -GLEW_FUN_EXPORT PFNGLPATHDASHARRAYNVPROC __glewPathDashArrayNV; -GLEW_FUN_EXPORT PFNGLPATHFOGGENNVPROC __glewPathFogGenNV; -GLEW_FUN_EXPORT PFNGLPATHGLYPHINDEXARRAYNVPROC __glewPathGlyphIndexArrayNV; -GLEW_FUN_EXPORT PFNGLPATHGLYPHINDEXRANGENVPROC __glewPathGlyphIndexRangeNV; -GLEW_FUN_EXPORT PFNGLPATHGLYPHRANGENVPROC __glewPathGlyphRangeNV; -GLEW_FUN_EXPORT PFNGLPATHGLYPHSNVPROC __glewPathGlyphsNV; -GLEW_FUN_EXPORT PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC __glewPathMemoryGlyphIndexArrayNV; -GLEW_FUN_EXPORT PFNGLPATHPARAMETERFNVPROC __glewPathParameterfNV; -GLEW_FUN_EXPORT PFNGLPATHPARAMETERFVNVPROC __glewPathParameterfvNV; -GLEW_FUN_EXPORT PFNGLPATHPARAMETERINVPROC __glewPathParameteriNV; -GLEW_FUN_EXPORT PFNGLPATHPARAMETERIVNVPROC __glewPathParameterivNV; -GLEW_FUN_EXPORT PFNGLPATHSTENCILDEPTHOFFSETNVPROC __glewPathStencilDepthOffsetNV; -GLEW_FUN_EXPORT PFNGLPATHSTENCILFUNCNVPROC __glewPathStencilFuncNV; -GLEW_FUN_EXPORT PFNGLPATHSTRINGNVPROC __glewPathStringNV; -GLEW_FUN_EXPORT PFNGLPATHSUBCOMMANDSNVPROC __glewPathSubCommandsNV; -GLEW_FUN_EXPORT PFNGLPATHSUBCOORDSNVPROC __glewPathSubCoordsNV; -GLEW_FUN_EXPORT PFNGLPATHTEXGENNVPROC __glewPathTexGenNV; -GLEW_FUN_EXPORT PFNGLPOINTALONGPATHNVPROC __glewPointAlongPathNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC __glewProgramPathFragmentInputGenNV; -GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHINSTANCEDNVPROC __glewStencilFillPathInstancedNV; -GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHNVPROC __glewStencilFillPathNV; -GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC __glewStencilStrokePathInstancedNV; -GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHNVPROC __glewStencilStrokePathNV; -GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC __glewStencilThenCoverFillPathInstancedNV; -GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERFILLPATHNVPROC __glewStencilThenCoverFillPathNV; -GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC __glewStencilThenCoverStrokePathInstancedNV; -GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC __glewStencilThenCoverStrokePathNV; -GLEW_FUN_EXPORT PFNGLTRANSFORMPATHNVPROC __glewTransformPathNV; -GLEW_FUN_EXPORT PFNGLWEIGHTPATHSNVPROC __glewWeightPathsNV; - -GLEW_FUN_EXPORT PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV; -GLEW_FUN_EXPORT PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV; - -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV; - -GLEW_FUN_EXPORT PFNGLPOLYGONMODENVPROC __glewPolygonModeNV; - -GLEW_FUN_EXPORT PFNGLGETVIDEOI64VNVPROC __glewGetVideoi64vNV; -GLEW_FUN_EXPORT PFNGLGETVIDEOIVNVPROC __glewGetVideoivNV; -GLEW_FUN_EXPORT PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV; -GLEW_FUN_EXPORT PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV; -GLEW_FUN_EXPORT PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV; -GLEW_FUN_EXPORT PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV; - -GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV; -GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV; - -GLEW_FUN_EXPORT PFNGLREADBUFFERNVPROC __glewReadBufferNV; - -GLEW_FUN_EXPORT PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV; -GLEW_FUN_EXPORT PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV; -GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV; -GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV; -GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV; -GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV; -GLEW_FUN_EXPORT PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV; -GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV; -GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV; -GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV; - -GLEW_FUN_EXPORT PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewFramebufferSampleLocationsfvNV; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewNamedFramebufferSampleLocationsfvNV; -GLEW_FUN_EXPORT PFNGLRESOLVEDEPTHVALUESNVPROC __glewResolveDepthValuesNV; - -GLEW_FUN_EXPORT PFNGLSCISSOREXCLUSIVEARRAYVNVPROC __glewScissorExclusiveArrayvNV; -GLEW_FUN_EXPORT PFNGLSCISSOREXCLUSIVENVPROC __glewScissorExclusiveNV; - -GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV; -GLEW_FUN_EXPORT PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV; -GLEW_FUN_EXPORT PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV; -GLEW_FUN_EXPORT PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV; -GLEW_FUN_EXPORT PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV; -GLEW_FUN_EXPORT PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV; -GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV; -GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORMUI64NVPROC __glewUniformui64NV; -GLEW_FUN_EXPORT PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV; - -GLEW_FUN_EXPORT PFNGLBINDSHADINGRATEIMAGENVPROC __glewBindShadingRateImageNV; -GLEW_FUN_EXPORT PFNGLGETSHADINGRATEIMAGEPALETTENVPROC __glewGetShadingRateImagePaletteNV; -GLEW_FUN_EXPORT PFNGLGETSHADINGRATESAMPLELOCATIONIVNVPROC __glewGetShadingRateSampleLocationivNV; -GLEW_FUN_EXPORT PFNGLSHADINGRATEIMAGEBARRIERNVPROC __glewShadingRateImageBarrierNV; -GLEW_FUN_EXPORT PFNGLSHADINGRATEIMAGEPALETTENVPROC __glewShadingRateImagePaletteNV; -GLEW_FUN_EXPORT PFNGLSHADINGRATESAMPLEORDERCUSTOMNVPROC __glewShadingRateSampleOrderCustomNV; - -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DNVPROC __glewCompressedTexImage3DNV; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DNVPROC __glewCompressedTexSubImage3DNV; -GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DNVPROC __glewCopyTexSubImage3DNV; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERNVPROC __glewFramebufferTextureLayerNV; -GLEW_FUN_EXPORT PFNGLTEXIMAGE3DNVPROC __glewTexImage3DNV; -GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DNVPROC __glewTexSubImage3DNV; - -GLEW_FUN_EXPORT PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV; - -GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTexImage2DMultisampleCoverageNV; -GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTexImage3DMultisampleCoverageNV; -GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTextureImage2DMultisampleCoverageNV; -GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC __glewTextureImage2DMultisampleNV; -GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTextureImage3DMultisampleCoverageNV; -GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC __glewTextureImage3DMultisampleNV; - -GLEW_FUN_EXPORT PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV; -GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV; -GLEW_FUN_EXPORT PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV; -GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV; -GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV; -GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV; -GLEW_FUN_EXPORT PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV; -GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV; -GLEW_FUN_EXPORT PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV; -GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV; -GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV; - -GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV; -GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV; -GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV; -GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV; -GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV; -GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV; -GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV; - -GLEW_FUN_EXPORT PFNGLVDPAUFININVPROC __glewVDPAUFiniNV; -GLEW_FUN_EXPORT PFNGLVDPAUGETSURFACEIVNVPROC __glewVDPAUGetSurfaceivNV; -GLEW_FUN_EXPORT PFNGLVDPAUINITNVPROC __glewVDPAUInitNV; -GLEW_FUN_EXPORT PFNGLVDPAUISSURFACENVPROC __glewVDPAUIsSurfaceNV; -GLEW_FUN_EXPORT PFNGLVDPAUMAPSURFACESNVPROC __glewVDPAUMapSurfacesNV; -GLEW_FUN_EXPORT PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC __glewVDPAURegisterOutputSurfaceNV; -GLEW_FUN_EXPORT PFNGLVDPAUREGISTERVIDEOSURFACENVPROC __glewVDPAURegisterVideoSurfaceNV; -GLEW_FUN_EXPORT PFNGLVDPAUSURFACEACCESSNVPROC __glewVDPAUSurfaceAccessNV; -GLEW_FUN_EXPORT PFNGLVDPAUUNMAPSURFACESNVPROC __glewVDPAUUnmapSurfacesNV; -GLEW_FUN_EXPORT PFNGLVDPAUUNREGISTERSURFACENVPROC __glewVDPAUUnregisterSurfaceNV; - -GLEW_FUN_EXPORT PFNGLVDPAUREGISTERVIDEOSURFACEWITHPICTURESTRUCTURENVPROC __glewVDPAURegisterVideoSurfaceWithPictureStructureNV; - -GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV; - -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLI64VNVPROC __glewGetVertexAttribLi64vNV; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VNVPROC __glewGetVertexAttribLui64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64NVPROC __glewVertexAttribL1i64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64VNVPROC __glewVertexAttribL1i64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64NVPROC __glewVertexAttribL1ui64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VNVPROC __glewVertexAttribL1ui64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64NVPROC __glewVertexAttribL2i64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64VNVPROC __glewVertexAttribL2i64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64NVPROC __glewVertexAttribL2ui64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64VNVPROC __glewVertexAttribL2ui64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64NVPROC __glewVertexAttribL3i64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64VNVPROC __glewVertexAttribL3i64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64NVPROC __glewVertexAttribL3ui64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64VNVPROC __glewVertexAttribL3ui64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64NVPROC __glewVertexAttribL4i64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64VNVPROC __glewVertexAttribL4i64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64NVPROC __glewVertexAttribL4ui64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64VNVPROC __glewVertexAttribL4ui64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATNVPROC __glewVertexAttribLFormatNV; - -GLEW_FUN_EXPORT PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV; -GLEW_FUN_EXPORT PFNGLCOLORFORMATNVPROC __glewColorFormatNV; -GLEW_FUN_EXPORT PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV; -GLEW_FUN_EXPORT PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV; -GLEW_FUN_EXPORT PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV; -GLEW_FUN_EXPORT PFNGLINDEXFORMATNVPROC __glewIndexFormatNV; -GLEW_FUN_EXPORT PFNGLNORMALFORMATNVPROC __glewNormalFormatNV; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV; -GLEW_FUN_EXPORT PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV; -GLEW_FUN_EXPORT PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV; - -GLEW_FUN_EXPORT PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV; -GLEW_FUN_EXPORT PFNGLBINDPROGRAMNVPROC __glewBindProgramNV; -GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV; -GLEW_FUN_EXPORT PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV; -GLEW_FUN_EXPORT PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV; -GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV; -GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV; -GLEW_FUN_EXPORT PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV; -GLEW_FUN_EXPORT PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV; -GLEW_FUN_EXPORT PFNGLISPROGRAMNVPROC __glewIsProgramNV; -GLEW_FUN_EXPORT PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV; -GLEW_FUN_EXPORT PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV; -GLEW_FUN_EXPORT PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV; - -GLEW_FUN_EXPORT PFNGLBEGINVIDEOCAPTURENVPROC __glewBeginVideoCaptureNV; -GLEW_FUN_EXPORT PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC __glewBindVideoCaptureStreamBufferNV; -GLEW_FUN_EXPORT PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC __glewBindVideoCaptureStreamTextureNV; -GLEW_FUN_EXPORT PFNGLENDVIDEOCAPTURENVPROC __glewEndVideoCaptureNV; -GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMDVNVPROC __glewGetVideoCaptureStreamdvNV; -GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMFVNVPROC __glewGetVideoCaptureStreamfvNV; -GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMIVNVPROC __glewGetVideoCaptureStreamivNV; -GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTUREIVNVPROC __glewGetVideoCaptureivNV; -GLEW_FUN_EXPORT PFNGLVIDEOCAPTURENVPROC __glewVideoCaptureNV; -GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC __glewVideoCaptureStreamParameterdvNV; -GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC __glewVideoCaptureStreamParameterfvNV; -GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC __glewVideoCaptureStreamParameterivNV; - -GLEW_FUN_EXPORT PFNGLDEPTHRANGEARRAYFVNVPROC __glewDepthRangeArrayfvNV; -GLEW_FUN_EXPORT PFNGLDEPTHRANGEINDEXEDFNVPROC __glewDepthRangeIndexedfNV; -GLEW_FUN_EXPORT PFNGLDISABLEINVPROC __glewDisableiNV; -GLEW_FUN_EXPORT PFNGLENABLEINVPROC __glewEnableiNV; -GLEW_FUN_EXPORT PFNGLGETFLOATI_VNVPROC __glewGetFloati_vNV; -GLEW_FUN_EXPORT PFNGLISENABLEDINVPROC __glewIsEnablediNV; -GLEW_FUN_EXPORT PFNGLSCISSORARRAYVNVPROC __glewScissorArrayvNV; -GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDNVPROC __glewScissorIndexedNV; -GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDVNVPROC __glewScissorIndexedvNV; -GLEW_FUN_EXPORT PFNGLVIEWPORTARRAYVNVPROC __glewViewportArrayvNV; -GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFNVPROC __glewViewportIndexedfNV; -GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFVNVPROC __glewViewportIndexedfvNV; - -GLEW_FUN_EXPORT PFNGLVIEWPORTSWIZZLENVPROC __glewViewportSwizzleNV; - -GLEW_FUN_EXPORT PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC __glewEGLImageTargetRenderbufferStorageOES; -GLEW_FUN_EXPORT PFNGLEGLIMAGETARGETTEXTURE2DOESPROC __glewEGLImageTargetTexture2DOES; - -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEOESPROC __glewBlendEquationSeparateOES; - -GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEOESPROC __glewBlendFuncSeparateOES; - -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONOESPROC __glewBlendEquationOES; - -GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATAOESPROC __glewCopyImageSubDataOES; - -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIOESPROC __glewBlendEquationSeparateiOES; -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIOESPROC __glewBlendEquationiOES; -GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIOESPROC __glewBlendFuncSeparateiOES; -GLEW_FUN_EXPORT PFNGLBLENDFUNCIOESPROC __glewBlendFunciOES; -GLEW_FUN_EXPORT PFNGLCOLORMASKIOESPROC __glewColorMaskiOES; -GLEW_FUN_EXPORT PFNGLDISABLEIOESPROC __glewDisableiOES; -GLEW_FUN_EXPORT PFNGLENABLEIOESPROC __glewEnableiOES; -GLEW_FUN_EXPORT PFNGLISENABLEDIOESPROC __glewIsEnablediOES; - -GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFEROESPROC __glewBindFramebufferOES; -GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFEROESPROC __glewBindRenderbufferOES; -GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSOESPROC __glewCheckFramebufferStatusOES; -GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSOESPROC __glewDeleteFramebuffersOES; -GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSOESPROC __glewDeleteRenderbuffersOES; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFEROESPROC __glewFramebufferRenderbufferOES; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DOESPROC __glewFramebufferTexture2DOES; -GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSOESPROC __glewGenFramebuffersOES; -GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSOESPROC __glewGenRenderbuffersOES; -GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPOESPROC __glewGenerateMipmapOES; -GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC __glewGetFramebufferAttachmentParameterivOES; -GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVOESPROC __glewGetRenderbufferParameterivOES; -GLEW_FUN_EXPORT PFNGLISFRAMEBUFFEROESPROC __glewIsFramebufferOES; -GLEW_FUN_EXPORT PFNGLISRENDERBUFFEROESPROC __glewIsRenderbufferOES; -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEOESPROC __glewRenderbufferStorageOES; - -GLEW_FUN_EXPORT PFNGLGETPROGRAMBINARYOESPROC __glewGetProgramBinaryOES; -GLEW_FUN_EXPORT PFNGLPROGRAMBINARYOESPROC __glewProgramBinaryOES; - -GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVOESPROC __glewGetBufferPointervOES; -GLEW_FUN_EXPORT PFNGLMAPBUFFEROESPROC __glewMapBufferOES; -GLEW_FUN_EXPORT PFNGLUNMAPBUFFEROESPROC __glewUnmapBufferOES; - -GLEW_FUN_EXPORT PFNGLCURRENTPALETTEMATRIXOESPROC __glewCurrentPaletteMatrixOES; -GLEW_FUN_EXPORT PFNGLMATRIXINDEXPOINTEROESPROC __glewMatrixIndexPointerOES; -GLEW_FUN_EXPORT PFNGLWEIGHTPOINTEROESPROC __glewWeightPointerOES; - -GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGOESPROC __glewMinSampleShadingOES; - -GLEW_FUN_EXPORT PFNGLCLEARDEPTHFOESPROC __glewClearDepthfOES; -GLEW_FUN_EXPORT PFNGLCLIPPLANEFOESPROC __glewClipPlanefOES; -GLEW_FUN_EXPORT PFNGLDEPTHRANGEFOESPROC __glewDepthRangefOES; -GLEW_FUN_EXPORT PFNGLFRUSTUMFOESPROC __glewFrustumfOES; -GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES; -GLEW_FUN_EXPORT PFNGLORTHOFOESPROC __glewOrthofOES; - -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DOESPROC __glewCompressedTexImage3DOES; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DOESPROC __glewCompressedTexSubImage3DOES; -GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DOESPROC __glewCopyTexSubImage3DOES; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DOESPROC __glewFramebufferTexture3DOES; -GLEW_FUN_EXPORT PFNGLTEXIMAGE3DOESPROC __glewTexImage3DOES; -GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DOESPROC __glewTexSubImage3DOES; - -GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIIVOESPROC __glewGetSamplerParameterIivOES; -GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIUIVOESPROC __glewGetSamplerParameterIuivOES; -GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVOESPROC __glewGetTexParameterIivOES; -GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVOESPROC __glewGetTexParameterIuivOES; -GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIIVOESPROC __glewSamplerParameterIivOES; -GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIUIVOESPROC __glewSamplerParameterIuivOES; -GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVOESPROC __glewTexParameterIivOES; -GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVOESPROC __glewTexParameterIuivOES; - -GLEW_FUN_EXPORT PFNGLTEXBUFFEROESPROC __glewTexBufferOES; -GLEW_FUN_EXPORT PFNGLTEXBUFFERRANGEOESPROC __glewTexBufferRangeOES; - -GLEW_FUN_EXPORT PFNGLGETTEXGENFVOESPROC __glewGetTexGenfvOES; -GLEW_FUN_EXPORT PFNGLGETTEXGENIVOESPROC __glewGetTexGenivOES; -GLEW_FUN_EXPORT PFNGLGETTEXGENXVOESPROC __glewGetTexGenxvOES; -GLEW_FUN_EXPORT PFNGLTEXGENFOESPROC __glewTexGenfOES; -GLEW_FUN_EXPORT PFNGLTEXGENFVOESPROC __glewTexGenfvOES; -GLEW_FUN_EXPORT PFNGLTEXGENIOESPROC __glewTexGeniOES; -GLEW_FUN_EXPORT PFNGLTEXGENIVOESPROC __glewTexGenivOES; -GLEW_FUN_EXPORT PFNGLTEXGENXOESPROC __glewTexGenxOES; -GLEW_FUN_EXPORT PFNGLTEXGENXVOESPROC __glewTexGenxvOES; - -GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DMULTISAMPLEOESPROC __glewTexStorage3DMultisampleOES; - -GLEW_FUN_EXPORT PFNGLTEXTUREVIEWOESPROC __glewTextureViewOES; - -GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYOESPROC __glewBindVertexArrayOES; -GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSOESPROC __glewDeleteVertexArraysOES; -GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSOESPROC __glewGenVertexArraysOES; -GLEW_FUN_EXPORT PFNGLISVERTEXARRAYOESPROC __glewIsVertexArrayOES; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __glewFramebufferTextureMultiviewOVR; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __glewNamedFramebufferTextureMultiviewOVR; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC __glewFramebufferTextureMultisampleMultiviewOVR; - -GLEW_FUN_EXPORT PFNGLALPHAFUNCQCOMPROC __glewAlphaFuncQCOM; - -GLEW_FUN_EXPORT PFNGLDISABLEDRIVERCONTROLQCOMPROC __glewDisableDriverControlQCOM; -GLEW_FUN_EXPORT PFNGLENABLEDRIVERCONTROLQCOMPROC __glewEnableDriverControlQCOM; -GLEW_FUN_EXPORT PFNGLGETDRIVERCONTROLSTRINGQCOMPROC __glewGetDriverControlStringQCOM; -GLEW_FUN_EXPORT PFNGLGETDRIVERCONTROLSQCOMPROC __glewGetDriverControlsQCOM; - -GLEW_FUN_EXPORT PFNGLEXTGETBUFFERPOINTERVQCOMPROC __glewExtGetBufferPointervQCOM; -GLEW_FUN_EXPORT PFNGLEXTGETBUFFERSQCOMPROC __glewExtGetBuffersQCOM; -GLEW_FUN_EXPORT PFNGLEXTGETFRAMEBUFFERSQCOMPROC __glewExtGetFramebuffersQCOM; -GLEW_FUN_EXPORT PFNGLEXTGETRENDERBUFFERSQCOMPROC __glewExtGetRenderbuffersQCOM; -GLEW_FUN_EXPORT PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC __glewExtGetTexLevelParameterivQCOM; -GLEW_FUN_EXPORT PFNGLEXTGETTEXSUBIMAGEQCOMPROC __glewExtGetTexSubImageQCOM; -GLEW_FUN_EXPORT PFNGLEXTGETTEXTURESQCOMPROC __glewExtGetTexturesQCOM; -GLEW_FUN_EXPORT PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC __glewExtTexObjectStateOverrideiQCOM; - -GLEW_FUN_EXPORT PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC __glewExtGetProgramBinarySourceQCOM; -GLEW_FUN_EXPORT PFNGLEXTGETPROGRAMSQCOMPROC __glewExtGetProgramsQCOM; -GLEW_FUN_EXPORT PFNGLEXTGETSHADERSQCOMPROC __glewExtGetShadersQCOM; -GLEW_FUN_EXPORT PFNGLEXTISPROGRAMBINARYQCOMPROC __glewExtIsProgramBinaryQCOM; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC __glewFramebufferFoveationConfigQCOM; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC __glewFramebufferFoveationParametersQCOM; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC __glewFramebufferFetchBarrierQCOM; - -GLEW_FUN_EXPORT PFNGLTEXTUREFOVEATIONPARAMETERSQCOMPROC __glewTextureFoveationParametersQCOM; - -GLEW_FUN_EXPORT PFNGLENDTILINGQCOMPROC __glewEndTilingQCOM; -GLEW_FUN_EXPORT PFNGLSTARTTILINGQCOMPROC __glewStartTilingQCOM; - -GLEW_FUN_EXPORT PFNGLALPHAFUNCXPROC __glewAlphaFuncx; -GLEW_FUN_EXPORT PFNGLCLEARCOLORXPROC __glewClearColorx; -GLEW_FUN_EXPORT PFNGLCLEARDEPTHXPROC __glewClearDepthx; -GLEW_FUN_EXPORT PFNGLCOLOR4XPROC __glewColor4x; -GLEW_FUN_EXPORT PFNGLDEPTHRANGEXPROC __glewDepthRangex; -GLEW_FUN_EXPORT PFNGLFOGXPROC __glewFogx; -GLEW_FUN_EXPORT PFNGLFOGXVPROC __glewFogxv; -GLEW_FUN_EXPORT PFNGLFRUSTUMFPROC __glewFrustumf; -GLEW_FUN_EXPORT PFNGLFRUSTUMXPROC __glewFrustumx; -GLEW_FUN_EXPORT PFNGLLIGHTMODELXPROC __glewLightModelx; -GLEW_FUN_EXPORT PFNGLLIGHTMODELXVPROC __glewLightModelxv; -GLEW_FUN_EXPORT PFNGLLIGHTXPROC __glewLightx; -GLEW_FUN_EXPORT PFNGLLIGHTXVPROC __glewLightxv; -GLEW_FUN_EXPORT PFNGLLINEWIDTHXPROC __glewLineWidthx; -GLEW_FUN_EXPORT PFNGLLOADMATRIXXPROC __glewLoadMatrixx; -GLEW_FUN_EXPORT PFNGLMATERIALXPROC __glewMaterialx; -GLEW_FUN_EXPORT PFNGLMATERIALXVPROC __glewMaterialxv; -GLEW_FUN_EXPORT PFNGLMULTMATRIXXPROC __glewMultMatrixx; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4XPROC __glewMultiTexCoord4x; -GLEW_FUN_EXPORT PFNGLNORMAL3XPROC __glewNormal3x; -GLEW_FUN_EXPORT PFNGLORTHOFPROC __glewOrthof; -GLEW_FUN_EXPORT PFNGLORTHOXPROC __glewOrthox; -GLEW_FUN_EXPORT PFNGLPOINTSIZEXPROC __glewPointSizex; -GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETXPROC __glewPolygonOffsetx; -GLEW_FUN_EXPORT PFNGLROTATEXPROC __glewRotatex; -GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEXPROC __glewSampleCoveragex; -GLEW_FUN_EXPORT PFNGLSCALEXPROC __glewScalex; -GLEW_FUN_EXPORT PFNGLTEXENVXPROC __glewTexEnvx; -GLEW_FUN_EXPORT PFNGLTEXENVXVPROC __glewTexEnvxv; -GLEW_FUN_EXPORT PFNGLTEXPARAMETERXPROC __glewTexParameterx; -GLEW_FUN_EXPORT PFNGLTRANSLATEXPROC __glewTranslatex; - -GLEW_FUN_EXPORT PFNGLCLIPPLANEFPROC __glewClipPlanef; -GLEW_FUN_EXPORT PFNGLCLIPPLANEXPROC __glewClipPlanex; -GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFPROC __glewGetClipPlanef; -GLEW_FUN_EXPORT PFNGLGETCLIPPLANEXPROC __glewGetClipPlanex; -GLEW_FUN_EXPORT PFNGLGETFIXEDVPROC __glewGetFixedv; -GLEW_FUN_EXPORT PFNGLGETLIGHTXVPROC __glewGetLightxv; -GLEW_FUN_EXPORT PFNGLGETMATERIALXVPROC __glewGetMaterialxv; -GLEW_FUN_EXPORT PFNGLGETTEXENVXVPROC __glewGetTexEnvxv; -GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERXVPROC __glewGetTexParameterxv; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXPROC __glewPointParameterx; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXVPROC __glewPointParameterxv; -GLEW_FUN_EXPORT PFNGLPOINTSIZEPOINTEROESPROC __glewPointSizePointerOES; -GLEW_FUN_EXPORT PFNGLTEXPARAMETERXVPROC __glewTexParameterxv; - -GLEW_FUN_EXPORT PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL; - -GLEW_FUN_EXPORT PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL; -GLEW_FUN_EXPORT PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL; - -GLEW_FUN_EXPORT PFNGLLOGMESSAGECALLBACKREGALPROC __glewLogMessageCallbackREGAL; - -GLEW_FUN_EXPORT PFNGLGETPROCADDRESSREGALPROC __glewGetProcAddressREGAL; - -GLEW_FUN_EXPORT PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS; -GLEW_FUN_EXPORT PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS; - -GLEW_FUN_EXPORT PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS; -GLEW_FUN_EXPORT PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS; - -GLEW_FUN_EXPORT PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS; -GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS; - -GLEW_FUN_EXPORT PFNGLINTERLEAVEDTEXTURECOORDSETSSGISPROC __glewInterleavedTextureCoordSetsSGIS; -GLEW_FUN_EXPORT PFNGLSELECTTEXTURECOORDSETSGISPROC __glewSelectTextureCoordSetSGIS; -GLEW_FUN_EXPORT PFNGLSELECTTEXTURESGISPROC __glewSelectTextureSGIS; -GLEW_FUN_EXPORT PFNGLSELECTTEXTURETRANSFORMSGISPROC __glewSelectTextureTransformSGIS; - -GLEW_FUN_EXPORT PFNGLMULTISAMPLESUBRECTPOSSGISPROC __glewMultisampleSubRectPosSGIS; - -GLEW_FUN_EXPORT PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS; -GLEW_FUN_EXPORT PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS; - -GLEW_FUN_EXPORT PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS; -GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS; - -GLEW_FUN_EXPORT PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS; -GLEW_FUN_EXPORT PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS; - -GLEW_FUN_EXPORT PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX; -GLEW_FUN_EXPORT PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX; -GLEW_FUN_EXPORT PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX; -GLEW_FUN_EXPORT PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX; -GLEW_FUN_EXPORT PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX; -GLEW_FUN_EXPORT PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX; - -GLEW_FUN_EXPORT PFNGLADDRESSSPACEPROC __glewAddressSpace; -GLEW_FUN_EXPORT PFNGLDATAPIPEPROC __glewDataPipe; - -GLEW_FUN_EXPORT PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX; - -GLEW_FUN_EXPORT PFNGLFOGLAYERSSGIXPROC __glewFogLayersSGIX; -GLEW_FUN_EXPORT PFNGLGETFOGLAYERSSGIXPROC __glewGetFogLayersSGIX; - -GLEW_FUN_EXPORT PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX; - -GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX; - -GLEW_FUN_EXPORT PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX; - -GLEW_FUN_EXPORT PFNGLIGLOOINTERFACESGIXPROC __glewIglooInterfaceSGIX; - -GLEW_FUN_EXPORT PFNGLALLOCMPEGPREDICTORSSGIXPROC __glewAllocMPEGPredictorsSGIX; -GLEW_FUN_EXPORT PFNGLDELETEMPEGPREDICTORSSGIXPROC __glewDeleteMPEGPredictorsSGIX; -GLEW_FUN_EXPORT PFNGLGENMPEGPREDICTORSSGIXPROC __glewGenMPEGPredictorsSGIX; -GLEW_FUN_EXPORT PFNGLGETMPEGPARAMETERFVSGIXPROC __glewGetMPEGParameterfvSGIX; -GLEW_FUN_EXPORT PFNGLGETMPEGPARAMETERIVSGIXPROC __glewGetMPEGParameterivSGIX; -GLEW_FUN_EXPORT PFNGLGETMPEGPREDICTORSGIXPROC __glewGetMPEGPredictorSGIX; -GLEW_FUN_EXPORT PFNGLGETMPEGQUANTTABLEUBVPROC __glewGetMPEGQuantTableubv; -GLEW_FUN_EXPORT PFNGLISMPEGPREDICTORSGIXPROC __glewIsMPEGPredictorSGIX; -GLEW_FUN_EXPORT PFNGLMPEGPREDICTORSGIXPROC __glewMPEGPredictorSGIX; -GLEW_FUN_EXPORT PFNGLMPEGQUANTTABLEUBVPROC __glewMPEGQuantTableubv; -GLEW_FUN_EXPORT PFNGLSWAPMPEGPREDICTORSSGIXPROC __glewSwapMPEGPredictorsSGIX; - -GLEW_FUN_EXPORT PFNGLGETNONLINLIGHTFVSGIXPROC __glewGetNonlinLightfvSGIX; -GLEW_FUN_EXPORT PFNGLGETNONLINMATERIALFVSGIXPROC __glewGetNonlinMaterialfvSGIX; -GLEW_FUN_EXPORT PFNGLNONLINLIGHTFVSGIXPROC __glewNonlinLightfvSGIX; -GLEW_FUN_EXPORT PFNGLNONLINMATERIALFVSGIXPROC __glewNonlinMaterialfvSGIX; - -GLEW_FUN_EXPORT PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX; - -GLEW_FUN_EXPORT PFNGLDEFORMSGIXPROC __glewDeformSGIX; -GLEW_FUN_EXPORT PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC __glewLoadIdentityDeformationMapSGIX; - -GLEW_FUN_EXPORT PFNGLMESHBREADTHSGIXPROC __glewMeshBreadthSGIX; -GLEW_FUN_EXPORT PFNGLMESHSTRIDESGIXPROC __glewMeshStrideSGIX; - -GLEW_FUN_EXPORT PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX; - -GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX; -GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX; -GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX; -GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX; - -GLEW_FUN_EXPORT PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX; - -GLEW_FUN_EXPORT PFNGLGETVECTOROPERATIONSGIXPROC __glewGetVectorOperationSGIX; -GLEW_FUN_EXPORT PFNGLVECTOROPERATIONSGIXPROC __glewVectorOperationSGIX; - -GLEW_FUN_EXPORT PFNGLAREVERTEXARRAYSRESIDENTSGIXPROC __glewAreVertexArraysResidentSGIX; -GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYSGIXPROC __glewBindVertexArraySGIX; -GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSSGIXPROC __glewDeleteVertexArraysSGIX; -GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSSGIXPROC __glewGenVertexArraysSGIX; -GLEW_FUN_EXPORT PFNGLISVERTEXARRAYSGIXPROC __glewIsVertexArraySGIX; -GLEW_FUN_EXPORT PFNGLPRIORITIZEVERTEXARRAYSSGIXPROC __glewPrioritizeVertexArraysSGIX; - -GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI; -GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI; -GLEW_FUN_EXPORT PFNGLCOLORTABLESGIPROC __glewColorTableSGI; -GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI; - -GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERFVSGIPROC __glewGetPixelTransformParameterfvSGI; -GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVSGIPROC __glewGetPixelTransformParameterivSGI; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFSGIPROC __glewPixelTransformParameterfSGI; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVSGIPROC __glewPixelTransformParameterfvSGI; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERISGIPROC __glewPixelTransformParameteriSGI; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVSGIPROC __glewPixelTransformParameterivSGI; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMSGIPROC __glewPixelTransformSGI; - -GLEW_FUN_EXPORT PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX; - -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN; - -GLEW_FUN_EXPORT PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN; - -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN; - -GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN; - -GLEW_FUN_EXPORT PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_1; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2_1; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_3; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_4; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_5; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_0; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_1; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_0; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_1; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_2; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_3; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_0; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_1; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_2; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_3; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_4; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_5; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_6; -GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_tbuffer; -GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_texture_compression_FXT1; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_blend_minmax_factor; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_compressed_3DC_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_compressed_ATC_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_conservative_depth; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_debug_output; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_depth_clamp_separate; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_draw_buffers_blend; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_framebuffer_multisample_advanced; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_framebuffer_sample_positions; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gcn_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_half_float; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_half_float_fetch; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_int16; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_int64; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_interleaved_elements; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_multi_draw_indirect; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_name_gen_delete; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_occlusion_query_event; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_performance_monitor; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_pinned_memory; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_program_binary_Z400; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_query_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sample_positions; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_seamless_cubemap_per_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_atomic_counter_ops; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_ballot; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_explicit_vertex_parameter; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_image_load_store_lod; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_export; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_value_export; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_trinary_minmax; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sparse_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_stencil_operation_extended; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_gather_bias_lod; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_texture4; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback3_lines_triangles; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback4; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_layer; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_tessellator; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_viewport_index; -GLEW_VAR_EXPORT GLboolean __GLEW_ANDROID_extension_pack_es31a; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_depth_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_blit; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_instanced_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_pack_reverse_row_order; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_program_binary; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt1; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt3; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt5; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_usage; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_timer_query; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_translated_shader_source; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_aux_depth_stencil; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_client_storage; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_clip_distance; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_color_buffer_packed_float; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_copy_texture_levels; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_element_array; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_fence; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_float_pixels; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_flush_buffer_range; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_framebuffer_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_object_purgeable; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_pixel_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_rgb_422; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_row_bytes; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_specular_vector; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_sync; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_2D_limited_npot; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_format_BGRA8888; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_max_level; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_packed_float; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_range; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_transform_hint; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_object; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_range; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_program_evaluators; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_ycbcr_422; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES2_compatibility; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_1_compatibility; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_2_compatibility; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_compatibility; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_arrays_of_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_base_instance; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_bindless_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_blend_func_extended; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_buffer_storage; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cl_event; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clip_control; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_color_buffer_float; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compatibility; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compressed_texture_pixel_storage; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_variable_group_size; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conditional_render_inverted; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conservative_depth; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_image; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cull_distance; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_debug_output; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_buffer_float; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_derivative_control; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_direct_state_access; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers_blend; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_elements_base_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_indirect; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_instanced; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_enhanced_layouts; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_attrib_location; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_uniform_location; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_coord_conventions; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_layer_viewport; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program_shadow; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader_interlock; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_no_attachments; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_sRGB; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_geometry_shader4; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_get_program_binary; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_get_texture_sub_image; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gl_spirv; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader5; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_fp64; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_int64; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_pixel; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_imaging; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_indirect_parameters; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_instanced_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query2; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_invalidate_subdata; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_alignment; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_range; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_matrix_palette; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_bind; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_draw_indirect; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multitexture; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query2; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_parallel_shader_compile; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pipeline_statistics_query; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pixel_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_parameters; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_sprite; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_polygon_offset_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_post_depth_coverage; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_program_interface_query; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_provoking_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_query_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robust_buffer_access_behavior; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_application_isolation; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_share_group_isolation; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_locations; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_shading; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sampler_objects; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cube_map; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cubemap_per_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_separate_shader_objects; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counter_ops; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counters; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_ballot; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_bit_encoding; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_clock; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_draw_parameters; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_group_vote; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_load_store; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_size; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_objects; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_precision; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_stencil_export; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_storage_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_subroutine; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_image_samples; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_lod; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_viewport_layer_array; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_100; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_420pack; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_include; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_packing; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow_ambient; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture2; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_spirv_extensions; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_stencil_texturing; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sync; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_tessellation_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_barrier; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_border_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object_rgb32; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_range; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_bptc; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_rgtc; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map_array; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_add; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_combine; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_crossbar; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_dot3; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_filter_anisotropic; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_filter_minmax; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_float; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_gather; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirror_clamp_to_edge; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirrored_repeat; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_non_power_of_two; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_levels; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_lod; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rectangle; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rg; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rgb10_a2ui; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_stencil8; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_swizzle; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_view; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_timer_query; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback2; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback3; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback_instanced; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback_overflow_query; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transpose_matrix; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_uniform_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_bgra; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_attrib_64bit; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_attrib_binding; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_blend; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_program; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_10f_11f_11f_rev; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_viewport_array; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_window_pos; -GLEW_VAR_EXPORT GLboolean __GLEW_ARM_mali_program_binary; -GLEW_VAR_EXPORT GLboolean __GLEW_ARM_mali_shader_binary; -GLEW_VAR_EXPORT GLboolean __GLEW_ARM_rgba8; -GLEW_VAR_EXPORT GLboolean __GLEW_ARM_shader_framebuffer_fetch; -GLEW_VAR_EXPORT GLboolean __GLEW_ARM_shader_framebuffer_fetch_depth_stencil; -GLEW_VAR_EXPORT GLboolean __GLEW_ARM_texture_unnormalized_coordinates; -GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_point_sprites; -GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_combine3; -GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_route; -GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_vertex_shader_output_point_size; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_draw_buffers; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_element_array; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_envmap_bumpmap; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_fragment_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_map_object_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_meminfo; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_pn_triangles; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_separate_stencil; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_shader_texture_lod; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_text_fragment_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_compression_3dc; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_env_combine3; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_float; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_mirror_once; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_array_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_attrib_array_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_streams; -GLEW_VAR_EXPORT GLboolean __GLEW_DMP_program_binary; -GLEW_VAR_EXPORT GLboolean __GLEW_DMP_shader_binary; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_422_pixels; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_Cg_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_EGL_image_array; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_EGL_image_external_wrap_modes; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_EGL_image_storage; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_EGL_sync; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_YUV_target; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_abgr; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_base_instance; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bgra; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bindable_uniform; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_color; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_equation_separate; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_func_extended; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_func_separate; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_logic_op; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_minmax; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_subtract; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_buffer_storage; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clear_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_control; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_cull_distance; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_volume_hint; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cmyka; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_buffer_float; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_buffer_half_float; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_subtable; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compiled_vertex_array; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compressed_ETC1_RGB8_sub_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_conservative_depth; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_convolution; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_coordinate_frame; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_image; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cull_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_debug_label; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_debug_marker; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_depth_bounds_test; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_depth_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_direct_state_access; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_discard_framebuffer; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_disjoint_timer_query; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers2; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers_indexed; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_elements_base_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_instanced; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_range_elements; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_transform_feedback; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_external_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_float_blend; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fog_coord; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_frag_depth; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fragment_lighting; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_blit; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample_blit_scaled; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_sRGB; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_point_size; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_shader4; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_program_parameters; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_shader4; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_shader5; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_histogram; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_array_formats; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_func; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_material; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_instanced_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_light_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_map_buffer_range; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_memory_object; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_memory_object_fd; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_memory_object_win32; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_misc_attribute; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_indirect; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multiple_textures; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample_compatibility; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisampled_render_to_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisampled_render_to_texture2; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multiview_draw_buffers; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multiview_tessellation_geometry_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multiview_texture_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multiview_timer_query; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_occlusion_query_boolean; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_depth_stencil; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_float; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_pixels; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_paletted_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform_color_table; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_point_parameters; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_post_depth_coverage; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_primitive_bounding_box; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_protected_textures; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_provoking_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pvrtc_sRGB; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_raster_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_read_format_bgra; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_render_snorm; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_rescale_normal; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_robustness; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sRGB; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sRGB_write_control; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_scene_marker; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_secondary_color; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_semaphore; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_semaphore_fd; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_semaphore_win32; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_shader_objects; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_specular_color; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_framebuffer_fetch; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_framebuffer_fetch_non_coherent; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_group_vote; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_formatted; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_store; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_implicit_conversions; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_integer_mix; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_io_blocks; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_non_constant_global_initializers; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_pixel_local_storage; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_pixel_local_storage2; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_texture_lod; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_funcs; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_samplers; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shared_texture_palette; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sparse_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sparse_texture2; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_static_vertex_array; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_clear_tag; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_two_side; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_wrap; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_subtexture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_tessellation_point_size; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_tessellation_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture3D; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_array; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_border_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_astc_decode_mode; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_bptc; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_dxt1; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_latc; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_rgtc; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_s3tc; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_s3tc_srgb; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_cube_map; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_cube_map_array; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_edge_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_add; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_combine; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_dot3; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_anisotropic; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_minmax; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_format_BGRA8888; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_format_sRGB_override; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_integer; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_lod_bias; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_mirror_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_mirror_clamp_to_edge; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_norm16; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_object; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_perturb_normal; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_query_lod; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rectangle; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rg; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_R8; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_RG8; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_decode; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_shadow_lod; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_shared_exponent; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_snorm; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_storage; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_swizzle; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_type_2_10_10_10_REV; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_view; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_timer_query; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_transform_feedback; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_unpack_subimage; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array_bgra; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array_setXXX; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_attrib_64bit; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_weighting; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_win32_keyed_mutex; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_window_rectangles; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_x11_sync_object; -GLEW_VAR_EXPORT GLboolean __GLEW_FJ_shader_binary_GCCSO; -GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_frame_terminator; -GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_string_marker; -GLEW_VAR_EXPORT GLboolean __GLEW_HP_convolution_border_modes; -GLEW_VAR_EXPORT GLboolean __GLEW_HP_image_transform; -GLEW_VAR_EXPORT GLboolean __GLEW_HP_occlusion_test; -GLEW_VAR_EXPORT GLboolean __GLEW_HP_texture_lighting; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_cull_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_multimode_draw_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_rasterpos_clip; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_static_data; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_texture_mirrored_repeat; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_vertex_array_lists; -GLEW_VAR_EXPORT GLboolean __GLEW_IMG_bindless_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_IMG_framebuffer_downsample; -GLEW_VAR_EXPORT GLboolean __GLEW_IMG_multisampled_render_to_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_IMG_program_binary; -GLEW_VAR_EXPORT GLboolean __GLEW_IMG_read_format; -GLEW_VAR_EXPORT GLboolean __GLEW_IMG_shader_binary; -GLEW_VAR_EXPORT GLboolean __GLEW_IMG_texture_compression_pvrtc; -GLEW_VAR_EXPORT GLboolean __GLEW_IMG_texture_compression_pvrtc2; -GLEW_VAR_EXPORT GLboolean __GLEW_IMG_texture_env_enhanced_fixed_function; -GLEW_VAR_EXPORT GLboolean __GLEW_IMG_texture_filter_cubic; -GLEW_VAR_EXPORT GLboolean __GLEW_INGR_color_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_INGR_interlace_read; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_blackhole_render; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_conservative_rasterization; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_fragment_shader_ordering; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_framebuffer_CMAA; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_map_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_parallel_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_performance_query; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_shader_integer_functions2; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_texture_scissor; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_blend_equation_advanced; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_blend_equation_advanced_coherent; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_context_flush_control; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_debug; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_no_error; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_parallel_shader_compile; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_robust_buffer_access_behavior; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_robustness; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_shader_subgroup; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_hdr; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_ldr; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_sliced_3d; -GLEW_VAR_EXPORT GLboolean __GLEW_KTX_buffer_region; -GLEW_VAR_EXPORT GLboolean __GLEW_MESAX_texture_stack; -GLEW_VAR_EXPORT GLboolean __GLEW_MESA_framebuffer_flip_y; -GLEW_VAR_EXPORT GLboolean __GLEW_MESA_pack_invert; -GLEW_VAR_EXPORT GLboolean __GLEW_MESA_program_binary_formats; -GLEW_VAR_EXPORT GLboolean __GLEW_MESA_resize_buffers; -GLEW_VAR_EXPORT GLboolean __GLEW_MESA_shader_integer_functions; -GLEW_VAR_EXPORT GLboolean __GLEW_MESA_tile_raster_order; -GLEW_VAR_EXPORT GLboolean __GLEW_MESA_window_pos; -GLEW_VAR_EXPORT GLboolean __GLEW_MESA_ycbcr_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_NVX_blend_equation_advanced_multi_draw_buffers; -GLEW_VAR_EXPORT GLboolean __GLEW_NVX_conditional_render; -GLEW_VAR_EXPORT GLboolean __GLEW_NVX_gpu_memory_info; -GLEW_VAR_EXPORT GLboolean __GLEW_NVX_gpu_multicast2; -GLEW_VAR_EXPORT GLboolean __GLEW_NVX_linked_gpu_multicast; -GLEW_VAR_EXPORT GLboolean __GLEW_NVX_progress_fence; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_3dvision_settings; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_EGL_stream_consumer_external; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_alpha_to_coverage_dither_control; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_bgr; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_multi_draw_indirect; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_multi_draw_indirect_count; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced_coherent; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_minmax_factor; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_square; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_clip_space_w_scaling; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_command_list; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_compute_program5; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_compute_shader_derivatives; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_conditional_render; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster_dilate; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster_pre_snap; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster_pre_snap_triangles; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster_underestimation; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_depth_to_color; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_image; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_deep_texture3D; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_buffer_float; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_nonlinear; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_range_unclamped; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_buffers; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_instanced; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_vulkan_image; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_evaluators; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_explicit_attrib_location; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_explicit_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fbo_color_attachments; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fence; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fill_rectangle; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_float_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fog_distance; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_coverage_to_color; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program4; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program_option; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_shader_barycentric; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_shader_interlock; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_blit; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_mixed_samples; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample_coverage; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_generate_mipmap_sRGB; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_program4; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader4; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader_passthrough; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_multicast; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program4; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5_mem_extended; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program_fp64; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_shader5; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_half_float; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_image_formats; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_instanced_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_internalformat_sample_query; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_light_max_exponent; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_memory_attachment; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_mesh_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_coverage; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_filter_hint; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_non_square_matrices; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_occlusion_query; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_pack_subimage; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_depth_stencil; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_float; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_float_linear; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_path_rendering; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_path_rendering_shared_edge; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_data_range; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_platform_binary; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_point_sprite; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_polygon_mode; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_present_video; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_primitive_restart; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_query_resource_tag; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_read_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_read_buffer_front; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_read_depth; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_read_depth_stencil; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_read_stencil; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_representative_fragment_test; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_robustness_video_memory_purge; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_sRGB_formats; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_sample_locations; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_sample_mask_override_coverage; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_scissor_exclusive; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_counters; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_float; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_float64; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_fp16_vector; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_int64; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_buffer_load; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_noperspective_interpolation; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_storage_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_subgroup_partitioned; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_texture_footprint; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_thread_group; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_thread_shuffle; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shading_rate_image; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shadow_samplers_array; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shadow_samplers_cube; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_stereo_view_rendering; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_tessellation_program5; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_emboss; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_reflection; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_array; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_barrier; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_border_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_latc; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_s3tc; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_s3tc_update; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_vtc; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_env_combine4; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_expand_normal; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_npot_2D_mipmap; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle_compressed; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader3; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_uniform_buffer_unified_memory; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vdpau_interop; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vdpau_interop2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_attrib_integer_64bit; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_buffer_unified_memory; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program1_1; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2_option; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program3; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program4; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_video_capture; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_viewport_array; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_viewport_array2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_viewport_swizzle; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_EGL_image; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_EGL_image_external; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_EGL_image_external_essl3; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_blend_equation_separate; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_blend_func_separate; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_blend_subtract; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_byte_coordinates; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_compressed_ETC1_RGB8_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_compressed_paletted_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_copy_image; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_depth24; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_depth32; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_depth_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_depth_texture_cube_map; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_draw_buffers_indexed; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_draw_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_element_index_uint; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_extended_matrix_palette; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_fbo_render_mipmap; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_fragment_precision_high; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_framebuffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_geometry_point_size; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_geometry_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_get_program_binary; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_gpu_shader5; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_mapbuffer; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_matrix_get; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_matrix_palette; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_packed_depth_stencil; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_point_size_array; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_point_sprite; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_read_format; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_required_internalformat; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_rgb8_rgba8; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_sample_shading; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_sample_variables; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_shader_image_atomic; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_shader_io_blocks; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_shader_multisample_interpolation; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_single_precision; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_standard_derivatives; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_stencil1; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_stencil4; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_stencil8; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_surfaceless_context; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_tessellation_point_size; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_tessellation_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_texture_3D; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_texture_border_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_texture_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_texture_compression_astc; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_texture_cube_map; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_texture_cube_map_array; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_texture_env_crossbar; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_texture_mirrored_repeat; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_texture_npot; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_texture_stencil8; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_texture_storage_multisample_2d_array; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_texture_view; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_vertex_array_object; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_vertex_half_float; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_vertex_type_10_10_10_2; -GLEW_VAR_EXPORT GLboolean __GLEW_OML_interlace; -GLEW_VAR_EXPORT GLboolean __GLEW_OML_resample; -GLEW_VAR_EXPORT GLboolean __GLEW_OML_subsample; -GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview; -GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview2; -GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview_multisampled_render_to_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_PGI_misc_hints; -GLEW_VAR_EXPORT GLboolean __GLEW_PGI_vertex_hints; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_YUV_texture_gather; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_alpha_test; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_binning_control; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_driver_control; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_extended_get; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_extended_get2; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_framebuffer_foveated; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_perfmon_global_mode; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_shader_framebuffer_fetch_noncoherent; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_shader_framebuffer_fetch_rate; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_texture_foveated; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_texture_foveated_subsampled_layout; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_tiled_rendering; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_writeonly_rendering; -GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_ES1_0_compatibility; -GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_ES1_1_compatibility; -GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_enable; -GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_error_string; -GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_extension_query; -GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_log; -GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_proc_address; -GLEW_VAR_EXPORT GLboolean __GLEW_REND_screen_coordinates; -GLEW_VAR_EXPORT GLboolean __GLEW_S3_s3tc; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_clip_band_hint; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_color_range; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_detail_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_fog_function; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_generate_mipmap; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_line_texgen; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multitexture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_pixel_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_point_line_texgen; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_shared_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_sharpen_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture4D; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_border_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_edge_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_filter4; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_lod; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_select; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_histogram; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_pixel; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_bali_g_instruments; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_bali_r_instruments; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_bali_timer_instruments; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_alpha_minmax; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_cadd; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_cmultiply; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_calligraphic_fragment; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_clipmap; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_color_matrix_accuracy; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_color_table_index_mode; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_complex_polar; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_convolution_accuracy; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_cube_map; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_cylinder_texgen; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_datapipe; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_decimation; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_pass_instrument; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_dvc; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_flush_raster; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_blend; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_factor_to_alpha; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_layers; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_offset; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_patchy; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_scale; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_lighting_space; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_specular_lighting; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragments_instrument; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_framezoom; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_icc_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_igloo_interface; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_image_compression; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_impact_pixel_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_instrument_error; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_interlace; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ir_instrument1; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_line_quality_hint; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_list_priority; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_mpeg1; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_mpeg2; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_nonlinear_lighting_pervertex; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_nurbs_eval; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_occlusion_instrument; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_packed_6bytes; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_bits; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_lod; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_tiles; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_polynomial_ffd; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_quad_mesh; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_reference_plane; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_resample; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_scalebias_hint; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow_ambient; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_slim; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_spotlight_cutoff; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_sprite; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_subdiv_patch; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_subsample; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_tag_sample_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_add_env; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_coordinate_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_lod_bias; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_mipmap_anisotropic; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_multi_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_phase; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_range; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_scale_bias; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_supersample; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vector_ops; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_array_object; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip_hint; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcb; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcb_subsample; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcba; -GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_matrix; -GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_table; -GLEW_VAR_EXPORT GLboolean __GLEW_SGI_complex; -GLEW_VAR_EXPORT GLboolean __GLEW_SGI_complex_type; -GLEW_VAR_EXPORT GLboolean __GLEW_SGI_fft; -GLEW_VAR_EXPORT GLboolean __GLEW_SGI_texture_color_table; -GLEW_VAR_EXPORT GLboolean __GLEW_SUNX_constant_data; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_convolution_border_modes; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_global_alpha; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_mesh_array; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_read_video_pixels; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_slice_accum; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_triangle_list; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_VIV_shader_binary; -GLEW_VAR_EXPORT GLboolean __GLEW_WIN_phong_shading; -GLEW_VAR_EXPORT GLboolean __GLEW_WIN_scene_markerXXX; -GLEW_VAR_EXPORT GLboolean __GLEW_WIN_specular_fog; -GLEW_VAR_EXPORT GLboolean __GLEW_WIN_swap_hint; -/* ------------------------------------------------------------------------- */ - -/* error codes */ -#define GLEW_OK 0 -#define GLEW_NO_ERROR 0 -#define GLEW_ERROR_NO_GL_VERSION 1 /* missing GL version */ -#define GLEW_ERROR_GL_VERSION_10_ONLY 2 /* Need at least OpenGL 1.1 */ -#define GLEW_ERROR_GLX_VERSION_11_ONLY 3 /* Need at least GLX 1.2 */ -#define GLEW_ERROR_NO_GLX_DISPLAY 4 /* Need GLX display for GLX support */ - -/* string codes */ -#define GLEW_VERSION 1 -#define GLEW_VERSION_MAJOR 2 -#define GLEW_VERSION_MINOR 3 -#define GLEW_VERSION_MICRO 4 - -/* ------------------------------------------------------------------------- */ - -/* GLEW version info */ - -/* -VERSION 2.2.0 -VERSION_MAJOR 2 -VERSION_MINOR 2 -VERSION_MICRO 0 -*/ - -/* API */ -GLEWAPI GLenum GLEWAPIENTRY glewInit (void); -GLEWAPI GLboolean GLEWAPIENTRY glewIsSupported (const char *name); -#define glewIsExtensionSupported(x) glewIsSupported(x) - -#ifndef GLEW_GET_VAR -#define GLEW_GET_VAR(x) (*(const GLboolean*)&x) -#endif - -#ifndef GLEW_GET_FUN -#define GLEW_GET_FUN(x) x -#endif - -GLEWAPI GLboolean glewExperimental; -GLEWAPI GLboolean GLEWAPIENTRY glewGetExtension (const char *name); -GLEWAPI const GLubyte * GLEWAPIENTRY glewGetErrorString (GLenum error); -GLEWAPI const GLubyte * GLEWAPIENTRY glewGetString (GLenum name); - -#ifdef __cplusplus -} -#endif - -#ifdef GLEW_APIENTRY_DEFINED -#undef GLEW_APIENTRY_DEFINED -#undef APIENTRY -#endif - -#ifdef GLEW_CALLBACK_DEFINED -#undef GLEW_CALLBACK_DEFINED -#undef CALLBACK -#endif - -#ifdef GLEW_WINGDIAPI_DEFINED -#undef GLEW_WINGDIAPI_DEFINED -#undef WINGDIAPI -#endif - -#undef GLAPI -/* #undef GLEWAPI */ - -#endif /* __glew_h__ */ diff --git a/src/glew/include/GL/glxew.h b/src/glew/include/GL/glxew.h deleted file mode 100644 index 0474ed5ed8c..00000000000 --- a/src/glew/include/GL/glxew.h +++ /dev/null @@ -1,1831 +0,0 @@ -/* -** The OpenGL Extension Wrangler Library -** Copyright (C) 2008-2019, Nigel Stewart -** Copyright (C) 2002-2008, Milan Ikits -** Copyright (C) 2002-2008, Marcelo E. Magallon -** Copyright (C) 2002, Lev Povalahev -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are met: -** -** * Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** * The name of the author may be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -** THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Mesa 3-D graphics library - * Version: 7.0 - * - * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* -** Copyright (c) 2007 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ - -#ifndef __glxew_h__ -#define __glxew_h__ -#define __GLXEW_H__ - -#ifdef __glxext_h_ -#error glxext.h included before glxew.h -#endif - -#if defined(GLX_H) || defined(__GLX_glx_h__) || defined(__glx_h__) -#error glx.h included before glxew.h -#endif - -#define __glxext_h_ - -#define GLX_H -#define __GLX_glx_h__ -#define __glx_h__ - -#include -#include -#include - -#ifndef GLEW_INCLUDE -# include -#else -# include GLEW_INCLUDE -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* ---------------------------- GLX_VERSION_1_0 --------------------------- */ - -#ifndef GLX_VERSION_1_0 -#define GLX_VERSION_1_0 1 - -#define GLX_USE_GL 1 -#define GLX_BUFFER_SIZE 2 -#define GLX_LEVEL 3 -#define GLX_RGBA 4 -#define GLX_DOUBLEBUFFER 5 -#define GLX_STEREO 6 -#define GLX_AUX_BUFFERS 7 -#define GLX_RED_SIZE 8 -#define GLX_GREEN_SIZE 9 -#define GLX_BLUE_SIZE 10 -#define GLX_ALPHA_SIZE 11 -#define GLX_DEPTH_SIZE 12 -#define GLX_STENCIL_SIZE 13 -#define GLX_ACCUM_RED_SIZE 14 -#define GLX_ACCUM_GREEN_SIZE 15 -#define GLX_ACCUM_BLUE_SIZE 16 -#define GLX_ACCUM_ALPHA_SIZE 17 -#define GLX_BAD_SCREEN 1 -#define GLX_BAD_ATTRIBUTE 2 -#define GLX_NO_EXTENSION 3 -#define GLX_BAD_VISUAL 4 -#define GLX_BAD_CONTEXT 5 -#define GLX_BAD_VALUE 6 -#define GLX_BAD_ENUM 7 - -typedef XID GLXDrawable; -typedef XID GLXPixmap; -#ifdef __sun -typedef struct __glXContextRec *GLXContext; -#else -typedef struct __GLXcontextRec *GLXContext; -#endif - -typedef unsigned int GLXVideoDeviceNV; - -extern Bool glXQueryExtension (Display *dpy, int *errorBase, int *eventBase); -extern Bool glXQueryVersion (Display *dpy, int *major, int *minor); -extern int glXGetConfig (Display *dpy, XVisualInfo *vis, int attrib, int *value); -extern XVisualInfo* glXChooseVisual (Display *dpy, int screen, int *attribList); -extern GLXPixmap glXCreateGLXPixmap (Display *dpy, XVisualInfo *vis, Pixmap pixmap); -extern void glXDestroyGLXPixmap (Display *dpy, GLXPixmap pix); -extern GLXContext glXCreateContext (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct); -extern void glXDestroyContext (Display *dpy, GLXContext ctx); -extern Bool glXIsDirect (Display *dpy, GLXContext ctx); -extern void glXCopyContext (Display *dpy, GLXContext src, GLXContext dst, GLulong mask); -extern Bool glXMakeCurrent (Display *dpy, GLXDrawable drawable, GLXContext ctx); -extern GLXContext glXGetCurrentContext (void); -extern GLXDrawable glXGetCurrentDrawable (void); -extern void glXWaitGL (void); -extern void glXWaitX (void); -extern void glXSwapBuffers (Display *dpy, GLXDrawable drawable); -extern void glXUseXFont (Font font, int first, int count, int listBase); - -#define GLXEW_VERSION_1_0 GLXEW_GET_VAR(__GLXEW_VERSION_1_0) - -#endif /* GLX_VERSION_1_0 */ - -/* ---------------------------- GLX_VERSION_1_1 --------------------------- */ - -#ifndef GLX_VERSION_1_1 -#define GLX_VERSION_1_1 - -#define GLX_VENDOR 0x1 -#define GLX_VERSION 0x2 -#define GLX_EXTENSIONS 0x3 - -extern const char* glXQueryExtensionsString (Display *dpy, int screen); -extern const char* glXGetClientString (Display *dpy, int name); -extern const char* glXQueryServerString (Display *dpy, int screen, int name); - -#define GLXEW_VERSION_1_1 GLXEW_GET_VAR(__GLXEW_VERSION_1_1) - -#endif /* GLX_VERSION_1_1 */ - -/* ---------------------------- GLX_VERSION_1_2 ---------------------------- */ - -#ifndef GLX_VERSION_1_2 -#define GLX_VERSION_1_2 1 - -typedef Display* ( * PFNGLXGETCURRENTDISPLAYPROC) (void); - -#define glXGetCurrentDisplay GLXEW_GET_FUN(__glewXGetCurrentDisplay) - -#define GLXEW_VERSION_1_2 GLXEW_GET_VAR(__GLXEW_VERSION_1_2) - -#endif /* GLX_VERSION_1_2 */ - -/* ---------------------------- GLX_VERSION_1_3 ---------------------------- */ - -#ifndef GLX_VERSION_1_3 -#define GLX_VERSION_1_3 1 - -#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 -#define GLX_RGBA_BIT 0x00000001 -#define GLX_WINDOW_BIT 0x00000001 -#define GLX_COLOR_INDEX_BIT 0x00000002 -#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 -#define GLX_PIXMAP_BIT 0x00000002 -#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 -#define GLX_PBUFFER_BIT 0x00000004 -#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 -#define GLX_AUX_BUFFERS_BIT 0x00000010 -#define GLX_CONFIG_CAVEAT 0x20 -#define GLX_DEPTH_BUFFER_BIT 0x00000020 -#define GLX_X_VISUAL_TYPE 0x22 -#define GLX_TRANSPARENT_TYPE 0x23 -#define GLX_TRANSPARENT_INDEX_VALUE 0x24 -#define GLX_TRANSPARENT_RED_VALUE 0x25 -#define GLX_TRANSPARENT_GREEN_VALUE 0x26 -#define GLX_TRANSPARENT_BLUE_VALUE 0x27 -#define GLX_TRANSPARENT_ALPHA_VALUE 0x28 -#define GLX_STENCIL_BUFFER_BIT 0x00000040 -#define GLX_ACCUM_BUFFER_BIT 0x00000080 -#define GLX_NONE 0x8000 -#define GLX_SLOW_CONFIG 0x8001 -#define GLX_TRUE_COLOR 0x8002 -#define GLX_DIRECT_COLOR 0x8003 -#define GLX_PSEUDO_COLOR 0x8004 -#define GLX_STATIC_COLOR 0x8005 -#define GLX_GRAY_SCALE 0x8006 -#define GLX_STATIC_GRAY 0x8007 -#define GLX_TRANSPARENT_RGB 0x8008 -#define GLX_TRANSPARENT_INDEX 0x8009 -#define GLX_VISUAL_ID 0x800B -#define GLX_SCREEN 0x800C -#define GLX_NON_CONFORMANT_CONFIG 0x800D -#define GLX_DRAWABLE_TYPE 0x8010 -#define GLX_RENDER_TYPE 0x8011 -#define GLX_X_RENDERABLE 0x8012 -#define GLX_FBCONFIG_ID 0x8013 -#define GLX_RGBA_TYPE 0x8014 -#define GLX_COLOR_INDEX_TYPE 0x8015 -#define GLX_MAX_PBUFFER_WIDTH 0x8016 -#define GLX_MAX_PBUFFER_HEIGHT 0x8017 -#define GLX_MAX_PBUFFER_PIXELS 0x8018 -#define GLX_PRESERVED_CONTENTS 0x801B -#define GLX_LARGEST_PBUFFER 0x801C -#define GLX_WIDTH 0x801D -#define GLX_HEIGHT 0x801E -#define GLX_EVENT_MASK 0x801F -#define GLX_DAMAGED 0x8020 -#define GLX_SAVED 0x8021 -#define GLX_WINDOW 0x8022 -#define GLX_PBUFFER 0x8023 -#define GLX_PBUFFER_HEIGHT 0x8040 -#define GLX_PBUFFER_WIDTH 0x8041 -#define GLX_PBUFFER_CLOBBER_MASK 0x08000000 -#define GLX_DONT_CARE 0xFFFFFFFF - -typedef XID GLXFBConfigID; -typedef XID GLXPbuffer; -typedef XID GLXWindow; -typedef struct __GLXFBConfigRec *GLXFBConfig; - -typedef struct { - int event_type; - int draw_type; - unsigned long serial; - Bool send_event; - Display *display; - GLXDrawable drawable; - unsigned int buffer_mask; - unsigned int aux_buffer; - int x, y; - int width, height; - int count; -} GLXPbufferClobberEvent; -typedef union __GLXEvent { - GLXPbufferClobberEvent glxpbufferclobber; - long pad[24]; -} GLXEvent; - -typedef GLXFBConfig* ( * PFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); -typedef GLXContext ( * PFNGLXCREATENEWCONTEXTPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); -typedef GLXPbuffer ( * PFNGLXCREATEPBUFFERPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list); -typedef GLXPixmap ( * PFNGLXCREATEPIXMAPPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list); -typedef GLXWindow ( * PFNGLXCREATEWINDOWPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list); -typedef void ( * PFNGLXDESTROYPBUFFERPROC) (Display *dpy, GLXPbuffer pbuf); -typedef void ( * PFNGLXDESTROYPIXMAPPROC) (Display *dpy, GLXPixmap pixmap); -typedef void ( * PFNGLXDESTROYWINDOWPROC) (Display *dpy, GLXWindow win); -typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLEPROC) (void); -typedef int ( * PFNGLXGETFBCONFIGATTRIBPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value); -typedef GLXFBConfig* ( * PFNGLXGETFBCONFIGSPROC) (Display *dpy, int screen, int *nelements); -typedef void ( * PFNGLXGETSELECTEDEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask); -typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGPROC) (Display *dpy, GLXFBConfig config); -typedef Bool ( * PFNGLXMAKECONTEXTCURRENTPROC) (Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx); -typedef int ( * PFNGLXQUERYCONTEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value); -typedef void ( * PFNGLXQUERYDRAWABLEPROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value); -typedef void ( * PFNGLXSELECTEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask); - -#define glXChooseFBConfig GLXEW_GET_FUN(__glewXChooseFBConfig) -#define glXCreateNewContext GLXEW_GET_FUN(__glewXCreateNewContext) -#define glXCreatePbuffer GLXEW_GET_FUN(__glewXCreatePbuffer) -#define glXCreatePixmap GLXEW_GET_FUN(__glewXCreatePixmap) -#define glXCreateWindow GLXEW_GET_FUN(__glewXCreateWindow) -#define glXDestroyPbuffer GLXEW_GET_FUN(__glewXDestroyPbuffer) -#define glXDestroyPixmap GLXEW_GET_FUN(__glewXDestroyPixmap) -#define glXDestroyWindow GLXEW_GET_FUN(__glewXDestroyWindow) -#define glXGetCurrentReadDrawable GLXEW_GET_FUN(__glewXGetCurrentReadDrawable) -#define glXGetFBConfigAttrib GLXEW_GET_FUN(__glewXGetFBConfigAttrib) -#define glXGetFBConfigs GLXEW_GET_FUN(__glewXGetFBConfigs) -#define glXGetSelectedEvent GLXEW_GET_FUN(__glewXGetSelectedEvent) -#define glXGetVisualFromFBConfig GLXEW_GET_FUN(__glewXGetVisualFromFBConfig) -#define glXMakeContextCurrent GLXEW_GET_FUN(__glewXMakeContextCurrent) -#define glXQueryContext GLXEW_GET_FUN(__glewXQueryContext) -#define glXQueryDrawable GLXEW_GET_FUN(__glewXQueryDrawable) -#define glXSelectEvent GLXEW_GET_FUN(__glewXSelectEvent) - -#define GLXEW_VERSION_1_3 GLXEW_GET_VAR(__GLXEW_VERSION_1_3) - -#endif /* GLX_VERSION_1_3 */ - -/* ---------------------------- GLX_VERSION_1_4 ---------------------------- */ - -#ifndef GLX_VERSION_1_4 -#define GLX_VERSION_1_4 1 - -#define GLX_SAMPLE_BUFFERS 100000 -#define GLX_SAMPLES 100001 - -extern void ( * glXGetProcAddress (const GLubyte *procName)) (void); - -#define GLXEW_VERSION_1_4 GLXEW_GET_VAR(__GLXEW_VERSION_1_4) - -#endif /* GLX_VERSION_1_4 */ - -/* -------------------------- GLX_3DFX_multisample ------------------------- */ - -#ifndef GLX_3DFX_multisample -#define GLX_3DFX_multisample 1 - -#define GLX_SAMPLE_BUFFERS_3DFX 0x8050 -#define GLX_SAMPLES_3DFX 0x8051 - -#define GLXEW_3DFX_multisample GLXEW_GET_VAR(__GLXEW_3DFX_multisample) - -#endif /* GLX_3DFX_multisample */ - -/* ------------------------ GLX_AMD_gpu_association ------------------------ */ - -#ifndef GLX_AMD_gpu_association -#define GLX_AMD_gpu_association 1 - -#define GLX_GPU_VENDOR_AMD 0x1F00 -#define GLX_GPU_RENDERER_STRING_AMD 0x1F01 -#define GLX_GPU_OPENGL_VERSION_STRING_AMD 0x1F02 -#define GLX_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2 -#define GLX_GPU_RAM_AMD 0x21A3 -#define GLX_GPU_CLOCK_AMD 0x21A4 -#define GLX_GPU_NUM_PIPES_AMD 0x21A5 -#define GLX_GPU_NUM_SIMD_AMD 0x21A6 -#define GLX_GPU_NUM_RB_AMD 0x21A7 -#define GLX_GPU_NUM_SPI_AMD 0x21A8 - -typedef void ( * PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC) (GLXContext dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef GLXContext ( * PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC) (unsigned int id, GLXContext share_list); -typedef GLXContext ( * PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (unsigned int id, GLXContext share_context, const int* attribList); -typedef Bool ( * PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC) (GLXContext ctx); -typedef unsigned int ( * PFNGLXGETCONTEXTGPUIDAMDPROC) (GLXContext ctx); -typedef GLXContext ( * PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void); -typedef unsigned int ( * PFNGLXGETGPUIDSAMDPROC) (unsigned int maxCount, unsigned int* ids); -typedef int ( * PFNGLXGETGPUINFOAMDPROC) (unsigned int id, int property, GLenum dataType, unsigned int size, void* data); -typedef Bool ( * PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (GLXContext ctx); - -#define glXBlitContextFramebufferAMD GLXEW_GET_FUN(__glewXBlitContextFramebufferAMD) -#define glXCreateAssociatedContextAMD GLXEW_GET_FUN(__glewXCreateAssociatedContextAMD) -#define glXCreateAssociatedContextAttribsAMD GLXEW_GET_FUN(__glewXCreateAssociatedContextAttribsAMD) -#define glXDeleteAssociatedContextAMD GLXEW_GET_FUN(__glewXDeleteAssociatedContextAMD) -#define glXGetContextGPUIDAMD GLXEW_GET_FUN(__glewXGetContextGPUIDAMD) -#define glXGetCurrentAssociatedContextAMD GLXEW_GET_FUN(__glewXGetCurrentAssociatedContextAMD) -#define glXGetGPUIDsAMD GLXEW_GET_FUN(__glewXGetGPUIDsAMD) -#define glXGetGPUInfoAMD GLXEW_GET_FUN(__glewXGetGPUInfoAMD) -#define glXMakeAssociatedContextCurrentAMD GLXEW_GET_FUN(__glewXMakeAssociatedContextCurrentAMD) - -#define GLXEW_AMD_gpu_association GLXEW_GET_VAR(__GLXEW_AMD_gpu_association) - -#endif /* GLX_AMD_gpu_association */ - -/* --------------------- GLX_ARB_context_flush_control --------------------- */ - -#ifndef GLX_ARB_context_flush_control -#define GLX_ARB_context_flush_control 1 - -#define GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB 0 -#define GLX_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097 -#define GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB 0x2098 - -#define GLXEW_ARB_context_flush_control GLXEW_GET_VAR(__GLXEW_ARB_context_flush_control) - -#endif /* GLX_ARB_context_flush_control */ - -/* ------------------------- GLX_ARB_create_context ------------------------ */ - -#ifndef GLX_ARB_create_context -#define GLX_ARB_create_context 1 - -#define GLX_CONTEXT_DEBUG_BIT_ARB 0x00000001 -#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002 -#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 -#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 -#define GLX_CONTEXT_FLAGS_ARB 0x2094 - -typedef GLXContext ( * PFNGLXCREATECONTEXTATTRIBSARBPROC) (Display* dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int* attrib_list); - -#define glXCreateContextAttribsARB GLXEW_GET_FUN(__glewXCreateContextAttribsARB) - -#define GLXEW_ARB_create_context GLXEW_GET_VAR(__GLXEW_ARB_create_context) - -#endif /* GLX_ARB_create_context */ - -/* -------------------- GLX_ARB_create_context_no_error -------------------- */ - -#ifndef GLX_ARB_create_context_no_error -#define GLX_ARB_create_context_no_error 1 - -#define GLX_CONTEXT_OPENGL_NO_ERROR_ARB 0x31B3 - -#define GLXEW_ARB_create_context_no_error GLXEW_GET_VAR(__GLXEW_ARB_create_context_no_error) - -#endif /* GLX_ARB_create_context_no_error */ - -/* --------------------- GLX_ARB_create_context_profile -------------------- */ - -#ifndef GLX_ARB_create_context_profile -#define GLX_ARB_create_context_profile 1 - -#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 -#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 -#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126 - -#define GLXEW_ARB_create_context_profile GLXEW_GET_VAR(__GLXEW_ARB_create_context_profile) - -#endif /* GLX_ARB_create_context_profile */ - -/* ------------------- GLX_ARB_create_context_robustness ------------------- */ - -#ifndef GLX_ARB_create_context_robustness -#define GLX_ARB_create_context_robustness 1 - -#define GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 -#define GLX_LOSE_CONTEXT_ON_RESET_ARB 0x8252 -#define GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 -#define GLX_NO_RESET_NOTIFICATION_ARB 0x8261 - -#define GLXEW_ARB_create_context_robustness GLXEW_GET_VAR(__GLXEW_ARB_create_context_robustness) - -#endif /* GLX_ARB_create_context_robustness */ - -/* ------------------------- GLX_ARB_fbconfig_float ------------------------ */ - -#ifndef GLX_ARB_fbconfig_float -#define GLX_ARB_fbconfig_float 1 - -#define GLX_RGBA_FLOAT_BIT_ARB 0x00000004 -#define GLX_RGBA_FLOAT_TYPE_ARB 0x20B9 - -#define GLXEW_ARB_fbconfig_float GLXEW_GET_VAR(__GLXEW_ARB_fbconfig_float) - -#endif /* GLX_ARB_fbconfig_float */ - -/* ------------------------ GLX_ARB_framebuffer_sRGB ----------------------- */ - -#ifndef GLX_ARB_framebuffer_sRGB -#define GLX_ARB_framebuffer_sRGB 1 - -#define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2 - -#define GLXEW_ARB_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_ARB_framebuffer_sRGB) - -#endif /* GLX_ARB_framebuffer_sRGB */ - -/* ------------------------ GLX_ARB_get_proc_address ----------------------- */ - -#ifndef GLX_ARB_get_proc_address -#define GLX_ARB_get_proc_address 1 - -extern void ( * glXGetProcAddressARB (const GLubyte *procName)) (void); - -#define GLXEW_ARB_get_proc_address GLXEW_GET_VAR(__GLXEW_ARB_get_proc_address) - -#endif /* GLX_ARB_get_proc_address */ - -/* -------------------------- GLX_ARB_multisample -------------------------- */ - -#ifndef GLX_ARB_multisample -#define GLX_ARB_multisample 1 - -#define GLX_SAMPLE_BUFFERS_ARB 100000 -#define GLX_SAMPLES_ARB 100001 - -#define GLXEW_ARB_multisample GLXEW_GET_VAR(__GLXEW_ARB_multisample) - -#endif /* GLX_ARB_multisample */ - -/* ---------------- GLX_ARB_robustness_application_isolation --------------- */ - -#ifndef GLX_ARB_robustness_application_isolation -#define GLX_ARB_robustness_application_isolation 1 - -#define GLX_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 - -#define GLXEW_ARB_robustness_application_isolation GLXEW_GET_VAR(__GLXEW_ARB_robustness_application_isolation) - -#endif /* GLX_ARB_robustness_application_isolation */ - -/* ---------------- GLX_ARB_robustness_share_group_isolation --------------- */ - -#ifndef GLX_ARB_robustness_share_group_isolation -#define GLX_ARB_robustness_share_group_isolation 1 - -#define GLX_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 - -#define GLXEW_ARB_robustness_share_group_isolation GLXEW_GET_VAR(__GLXEW_ARB_robustness_share_group_isolation) - -#endif /* GLX_ARB_robustness_share_group_isolation */ - -/* ---------------------- GLX_ARB_vertex_buffer_object --------------------- */ - -#ifndef GLX_ARB_vertex_buffer_object -#define GLX_ARB_vertex_buffer_object 1 - -#define GLX_CONTEXT_ALLOW_BUFFER_BYTE_ORDER_MISMATCH_ARB 0x2095 - -#define GLXEW_ARB_vertex_buffer_object GLXEW_GET_VAR(__GLXEW_ARB_vertex_buffer_object) - -#endif /* GLX_ARB_vertex_buffer_object */ - -/* ----------------------- GLX_ATI_pixel_format_float ---------------------- */ - -#ifndef GLX_ATI_pixel_format_float -#define GLX_ATI_pixel_format_float 1 - -#define GLX_RGBA_FLOAT_ATI_BIT 0x00000100 - -#define GLXEW_ATI_pixel_format_float GLXEW_GET_VAR(__GLXEW_ATI_pixel_format_float) - -#endif /* GLX_ATI_pixel_format_float */ - -/* ------------------------- GLX_ATI_render_texture ------------------------ */ - -#ifndef GLX_ATI_render_texture -#define GLX_ATI_render_texture 1 - -#define GLX_BIND_TO_TEXTURE_RGB_ATI 0x9800 -#define GLX_BIND_TO_TEXTURE_RGBA_ATI 0x9801 -#define GLX_TEXTURE_FORMAT_ATI 0x9802 -#define GLX_TEXTURE_TARGET_ATI 0x9803 -#define GLX_MIPMAP_TEXTURE_ATI 0x9804 -#define GLX_TEXTURE_RGB_ATI 0x9805 -#define GLX_TEXTURE_RGBA_ATI 0x9806 -#define GLX_NO_TEXTURE_ATI 0x9807 -#define GLX_TEXTURE_CUBE_MAP_ATI 0x9808 -#define GLX_TEXTURE_1D_ATI 0x9809 -#define GLX_TEXTURE_2D_ATI 0x980A -#define GLX_MIPMAP_LEVEL_ATI 0x980B -#define GLX_CUBE_MAP_FACE_ATI 0x980C -#define GLX_TEXTURE_CUBE_MAP_POSITIVE_X_ATI 0x980D -#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_X_ATI 0x980E -#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Y_ATI 0x980F -#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Y_ATI 0x9810 -#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Z_ATI 0x9811 -#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Z_ATI 0x9812 -#define GLX_FRONT_LEFT_ATI 0x9813 -#define GLX_FRONT_RIGHT_ATI 0x9814 -#define GLX_BACK_LEFT_ATI 0x9815 -#define GLX_BACK_RIGHT_ATI 0x9816 -#define GLX_AUX0_ATI 0x9817 -#define GLX_AUX1_ATI 0x9818 -#define GLX_AUX2_ATI 0x9819 -#define GLX_AUX3_ATI 0x981A -#define GLX_AUX4_ATI 0x981B -#define GLX_AUX5_ATI 0x981C -#define GLX_AUX6_ATI 0x981D -#define GLX_AUX7_ATI 0x981E -#define GLX_AUX8_ATI 0x981F -#define GLX_AUX9_ATI 0x9820 -#define GLX_BIND_TO_TEXTURE_LUMINANCE_ATI 0x9821 -#define GLX_BIND_TO_TEXTURE_INTENSITY_ATI 0x9822 - -typedef void ( * PFNGLXBINDTEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); -typedef void ( * PFNGLXDRAWABLEATTRIBATIPROC) (Display *dpy, GLXDrawable draw, const int *attrib_list); -typedef void ( * PFNGLXRELEASETEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); - -#define glXBindTexImageATI GLXEW_GET_FUN(__glewXBindTexImageATI) -#define glXDrawableAttribATI GLXEW_GET_FUN(__glewXDrawableAttribATI) -#define glXReleaseTexImageATI GLXEW_GET_FUN(__glewXReleaseTexImageATI) - -#define GLXEW_ATI_render_texture GLXEW_GET_VAR(__GLXEW_ATI_render_texture) - -#endif /* GLX_ATI_render_texture */ - -/* --------------------------- GLX_EXT_buffer_age -------------------------- */ - -#ifndef GLX_EXT_buffer_age -#define GLX_EXT_buffer_age 1 - -#define GLX_BACK_BUFFER_AGE_EXT 0x20F4 - -#define GLXEW_EXT_buffer_age GLXEW_GET_VAR(__GLXEW_EXT_buffer_age) - -#endif /* GLX_EXT_buffer_age */ - -/* ------------------------ GLX_EXT_context_priority ----------------------- */ - -#ifndef GLX_EXT_context_priority -#define GLX_EXT_context_priority 1 - -#define GLX_CONTEXT_PRIORITY_LEVEL_EXT 0x3100 -#define GLX_CONTEXT_PRIORITY_HIGH_EXT 0x3101 -#define GLX_CONTEXT_PRIORITY_MEDIUM_EXT 0x3102 -#define GLX_CONTEXT_PRIORITY_LOW_EXT 0x3103 - -#define GLXEW_EXT_context_priority GLXEW_GET_VAR(__GLXEW_EXT_context_priority) - -#endif /* GLX_EXT_context_priority */ - -/* ------------------- GLX_EXT_create_context_es2_profile ------------------ */ - -#ifndef GLX_EXT_create_context_es2_profile -#define GLX_EXT_create_context_es2_profile 1 - -#define GLX_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 - -#define GLXEW_EXT_create_context_es2_profile GLXEW_GET_VAR(__GLXEW_EXT_create_context_es2_profile) - -#endif /* GLX_EXT_create_context_es2_profile */ - -/* ------------------- GLX_EXT_create_context_es_profile ------------------- */ - -#ifndef GLX_EXT_create_context_es_profile -#define GLX_EXT_create_context_es_profile 1 - -#define GLX_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004 - -#define GLXEW_EXT_create_context_es_profile GLXEW_GET_VAR(__GLXEW_EXT_create_context_es_profile) - -#endif /* GLX_EXT_create_context_es_profile */ - -/* --------------------- GLX_EXT_fbconfig_packed_float --------------------- */ - -#ifndef GLX_EXT_fbconfig_packed_float -#define GLX_EXT_fbconfig_packed_float 1 - -#define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008 -#define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1 - -#define GLXEW_EXT_fbconfig_packed_float GLXEW_GET_VAR(__GLXEW_EXT_fbconfig_packed_float) - -#endif /* GLX_EXT_fbconfig_packed_float */ - -/* ------------------------ GLX_EXT_framebuffer_sRGB ----------------------- */ - -#ifndef GLX_EXT_framebuffer_sRGB -#define GLX_EXT_framebuffer_sRGB 1 - -#define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2 - -#define GLXEW_EXT_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_EXT_framebuffer_sRGB) - -#endif /* GLX_EXT_framebuffer_sRGB */ - -/* ------------------------- GLX_EXT_import_context ------------------------ */ - -#ifndef GLX_EXT_import_context -#define GLX_EXT_import_context 1 - -#define GLX_SHARE_CONTEXT_EXT 0x800A -#define GLX_VISUAL_ID_EXT 0x800B -#define GLX_SCREEN_EXT 0x800C - -typedef XID GLXContextID; - -typedef void ( * PFNGLXFREECONTEXTEXTPROC) (Display* dpy, GLXContext context); -typedef GLXContextID ( * PFNGLXGETCONTEXTIDEXTPROC) (const GLXContext context); -typedef Display* ( * PFNGLXGETCURRENTDISPLAYEXTPROC) (void); -typedef GLXContext ( * PFNGLXIMPORTCONTEXTEXTPROC) (Display* dpy, GLXContextID contextID); -typedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display* dpy, GLXContext context, int attribute, int* value); - -#define glXFreeContextEXT GLXEW_GET_FUN(__glewXFreeContextEXT) -#define glXGetContextIDEXT GLXEW_GET_FUN(__glewXGetContextIDEXT) -#define glXGetCurrentDisplayEXT GLXEW_GET_FUN(__glewXGetCurrentDisplayEXT) -#define glXImportContextEXT GLXEW_GET_FUN(__glewXImportContextEXT) -#define glXQueryContextInfoEXT GLXEW_GET_FUN(__glewXQueryContextInfoEXT) - -#define GLXEW_EXT_import_context GLXEW_GET_VAR(__GLXEW_EXT_import_context) - -#endif /* GLX_EXT_import_context */ - -/* ---------------------------- GLX_EXT_libglvnd --------------------------- */ - -#ifndef GLX_EXT_libglvnd -#define GLX_EXT_libglvnd 1 - -#define GLX_VENDOR_NAMES_EXT 0x20F6 - -#define GLXEW_EXT_libglvnd GLXEW_GET_VAR(__GLXEW_EXT_libglvnd) - -#endif /* GLX_EXT_libglvnd */ - -/* ----------------------- GLX_EXT_no_config_context ----------------------- */ - -#ifndef GLX_EXT_no_config_context -#define GLX_EXT_no_config_context 1 - -#define GLXEW_EXT_no_config_context GLXEW_GET_VAR(__GLXEW_EXT_no_config_context) - -#endif /* GLX_EXT_no_config_context */ - -/* -------------------------- GLX_EXT_scene_marker ------------------------- */ - -#ifndef GLX_EXT_scene_marker -#define GLX_EXT_scene_marker 1 - -#define GLXEW_EXT_scene_marker GLXEW_GET_VAR(__GLXEW_EXT_scene_marker) - -#endif /* GLX_EXT_scene_marker */ - -/* -------------------------- GLX_EXT_stereo_tree -------------------------- */ - -#ifndef GLX_EXT_stereo_tree -#define GLX_EXT_stereo_tree 1 - -#define GLX_STEREO_NOTIFY_EXT 0x00000000 -#define GLX_STEREO_NOTIFY_MASK_EXT 0x00000001 -#define GLX_STEREO_TREE_EXT 0x20F5 - -#define GLXEW_EXT_stereo_tree GLXEW_GET_VAR(__GLXEW_EXT_stereo_tree) - -#endif /* GLX_EXT_stereo_tree */ - -/* -------------------------- GLX_EXT_swap_control ------------------------- */ - -#ifndef GLX_EXT_swap_control -#define GLX_EXT_swap_control 1 - -#define GLX_SWAP_INTERVAL_EXT 0x20F1 -#define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2 - -typedef void ( * PFNGLXSWAPINTERVALEXTPROC) (Display* dpy, GLXDrawable drawable, int interval); - -#define glXSwapIntervalEXT GLXEW_GET_FUN(__glewXSwapIntervalEXT) - -#define GLXEW_EXT_swap_control GLXEW_GET_VAR(__GLXEW_EXT_swap_control) - -#endif /* GLX_EXT_swap_control */ - -/* ----------------------- GLX_EXT_swap_control_tear ----------------------- */ - -#ifndef GLX_EXT_swap_control_tear -#define GLX_EXT_swap_control_tear 1 - -#define GLX_LATE_SWAPS_TEAR_EXT 0x20F3 - -#define GLXEW_EXT_swap_control_tear GLXEW_GET_VAR(__GLXEW_EXT_swap_control_tear) - -#endif /* GLX_EXT_swap_control_tear */ - -/* ---------------------- GLX_EXT_texture_from_pixmap ---------------------- */ - -#ifndef GLX_EXT_texture_from_pixmap -#define GLX_EXT_texture_from_pixmap 1 - -#define GLX_TEXTURE_1D_BIT_EXT 0x00000001 -#define GLX_TEXTURE_2D_BIT_EXT 0x00000002 -#define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004 -#define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0 -#define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1 -#define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2 -#define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3 -#define GLX_Y_INVERTED_EXT 0x20D4 -#define GLX_TEXTURE_FORMAT_EXT 0x20D5 -#define GLX_TEXTURE_TARGET_EXT 0x20D6 -#define GLX_MIPMAP_TEXTURE_EXT 0x20D7 -#define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8 -#define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9 -#define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA -#define GLX_TEXTURE_1D_EXT 0x20DB -#define GLX_TEXTURE_2D_EXT 0x20DC -#define GLX_TEXTURE_RECTANGLE_EXT 0x20DD -#define GLX_FRONT_EXT 0x20DE -#define GLX_FRONT_LEFT_EXT 0x20DE -#define GLX_FRONT_RIGHT_EXT 0x20DF -#define GLX_BACK_EXT 0x20E0 -#define GLX_BACK_LEFT_EXT 0x20E0 -#define GLX_BACK_RIGHT_EXT 0x20E1 -#define GLX_AUX0_EXT 0x20E2 -#define GLX_AUX1_EXT 0x20E3 -#define GLX_AUX2_EXT 0x20E4 -#define GLX_AUX3_EXT 0x20E5 -#define GLX_AUX4_EXT 0x20E6 -#define GLX_AUX5_EXT 0x20E7 -#define GLX_AUX6_EXT 0x20E8 -#define GLX_AUX7_EXT 0x20E9 -#define GLX_AUX8_EXT 0x20EA -#define GLX_AUX9_EXT 0x20EB - -typedef void ( * PFNGLXBINDTEXIMAGEEXTPROC) (Display* dpy, GLXDrawable drawable, int buffer, const int* attrib_list); -typedef void ( * PFNGLXRELEASETEXIMAGEEXTPROC) (Display* dpy, GLXDrawable drawable, int buffer); - -#define glXBindTexImageEXT GLXEW_GET_FUN(__glewXBindTexImageEXT) -#define glXReleaseTexImageEXT GLXEW_GET_FUN(__glewXReleaseTexImageEXT) - -#define GLXEW_EXT_texture_from_pixmap GLXEW_GET_VAR(__GLXEW_EXT_texture_from_pixmap) - -#endif /* GLX_EXT_texture_from_pixmap */ - -/* -------------------------- GLX_EXT_visual_info -------------------------- */ - -#ifndef GLX_EXT_visual_info -#define GLX_EXT_visual_info 1 - -#define GLX_X_VISUAL_TYPE_EXT 0x22 -#define GLX_TRANSPARENT_TYPE_EXT 0x23 -#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24 -#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25 -#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26 -#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27 -#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28 -#define GLX_NONE_EXT 0x8000 -#define GLX_TRUE_COLOR_EXT 0x8002 -#define GLX_DIRECT_COLOR_EXT 0x8003 -#define GLX_PSEUDO_COLOR_EXT 0x8004 -#define GLX_STATIC_COLOR_EXT 0x8005 -#define GLX_GRAY_SCALE_EXT 0x8006 -#define GLX_STATIC_GRAY_EXT 0x8007 -#define GLX_TRANSPARENT_RGB_EXT 0x8008 -#define GLX_TRANSPARENT_INDEX_EXT 0x8009 - -#define GLXEW_EXT_visual_info GLXEW_GET_VAR(__GLXEW_EXT_visual_info) - -#endif /* GLX_EXT_visual_info */ - -/* ------------------------- GLX_EXT_visual_rating ------------------------- */ - -#ifndef GLX_EXT_visual_rating -#define GLX_EXT_visual_rating 1 - -#define GLX_VISUAL_CAVEAT_EXT 0x20 -#define GLX_SLOW_VISUAL_EXT 0x8001 -#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D - -#define GLXEW_EXT_visual_rating GLXEW_GET_VAR(__GLXEW_EXT_visual_rating) - -#endif /* GLX_EXT_visual_rating */ - -/* -------------------------- GLX_INTEL_swap_event ------------------------- */ - -#ifndef GLX_INTEL_swap_event -#define GLX_INTEL_swap_event 1 - -#define GLX_EXCHANGE_COMPLETE_INTEL 0x8180 -#define GLX_COPY_COMPLETE_INTEL 0x8181 -#define GLX_FLIP_COMPLETE_INTEL 0x8182 -#define GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK 0x04000000 - -#define GLXEW_INTEL_swap_event GLXEW_GET_VAR(__GLXEW_INTEL_swap_event) - -#endif /* GLX_INTEL_swap_event */ - -/* -------------------------- GLX_MESA_agp_offset -------------------------- */ - -#ifndef GLX_MESA_agp_offset -#define GLX_MESA_agp_offset 1 - -typedef unsigned int ( * PFNGLXGETAGPOFFSETMESAPROC) (const void* pointer); - -#define glXGetAGPOffsetMESA GLXEW_GET_FUN(__glewXGetAGPOffsetMESA) - -#define GLXEW_MESA_agp_offset GLXEW_GET_VAR(__GLXEW_MESA_agp_offset) - -#endif /* GLX_MESA_agp_offset */ - -/* ------------------------ GLX_MESA_copy_sub_buffer ----------------------- */ - -#ifndef GLX_MESA_copy_sub_buffer -#define GLX_MESA_copy_sub_buffer 1 - -typedef void ( * PFNGLXCOPYSUBBUFFERMESAPROC) (Display* dpy, GLXDrawable drawable, int x, int y, int width, int height); - -#define glXCopySubBufferMESA GLXEW_GET_FUN(__glewXCopySubBufferMESA) - -#define GLXEW_MESA_copy_sub_buffer GLXEW_GET_VAR(__GLXEW_MESA_copy_sub_buffer) - -#endif /* GLX_MESA_copy_sub_buffer */ - -/* ------------------------ GLX_MESA_pixmap_colormap ----------------------- */ - -#ifndef GLX_MESA_pixmap_colormap -#define GLX_MESA_pixmap_colormap 1 - -typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPMESAPROC) (Display* dpy, XVisualInfo* visual, Pixmap pixmap, Colormap cmap); - -#define glXCreateGLXPixmapMESA GLXEW_GET_FUN(__glewXCreateGLXPixmapMESA) - -#define GLXEW_MESA_pixmap_colormap GLXEW_GET_VAR(__GLXEW_MESA_pixmap_colormap) - -#endif /* GLX_MESA_pixmap_colormap */ - -/* ------------------------ GLX_MESA_query_renderer ------------------------ */ - -#ifndef GLX_MESA_query_renderer -#define GLX_MESA_query_renderer 1 - -#define GLX_RENDERER_VENDOR_ID_MESA 0x8183 -#define GLX_RENDERER_DEVICE_ID_MESA 0x8184 -#define GLX_RENDERER_VERSION_MESA 0x8185 -#define GLX_RENDERER_ACCELERATED_MESA 0x8186 -#define GLX_RENDERER_VIDEO_MEMORY_MESA 0x8187 -#define GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA 0x8188 -#define GLX_RENDERER_PREFERRED_PROFILE_MESA 0x8189 -#define GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA 0x818A -#define GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA 0x818B -#define GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA 0x818C -#define GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA 0x818D - -typedef Bool ( * PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC) (int attribute, unsigned int* value); -typedef const char* ( * PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC) (int attribute); -typedef Bool ( * PFNGLXQUERYRENDERERINTEGERMESAPROC) (Display* dpy, int screen, int renderer, int attribute, unsigned int* value); -typedef const char* ( * PFNGLXQUERYRENDERERSTRINGMESAPROC) (Display* dpy, int screen, int renderer, int attribute); - -#define glXQueryCurrentRendererIntegerMESA GLXEW_GET_FUN(__glewXQueryCurrentRendererIntegerMESA) -#define glXQueryCurrentRendererStringMESA GLXEW_GET_FUN(__glewXQueryCurrentRendererStringMESA) -#define glXQueryRendererIntegerMESA GLXEW_GET_FUN(__glewXQueryRendererIntegerMESA) -#define glXQueryRendererStringMESA GLXEW_GET_FUN(__glewXQueryRendererStringMESA) - -#define GLXEW_MESA_query_renderer GLXEW_GET_VAR(__GLXEW_MESA_query_renderer) - -#endif /* GLX_MESA_query_renderer */ - -/* ------------------------ GLX_MESA_release_buffers ----------------------- */ - -#ifndef GLX_MESA_release_buffers -#define GLX_MESA_release_buffers 1 - -typedef Bool ( * PFNGLXRELEASEBUFFERSMESAPROC) (Display* dpy, GLXDrawable drawable); - -#define glXReleaseBuffersMESA GLXEW_GET_FUN(__glewXReleaseBuffersMESA) - -#define GLXEW_MESA_release_buffers GLXEW_GET_VAR(__GLXEW_MESA_release_buffers) - -#endif /* GLX_MESA_release_buffers */ - -/* ------------------------- GLX_MESA_set_3dfx_mode ------------------------ */ - -#ifndef GLX_MESA_set_3dfx_mode -#define GLX_MESA_set_3dfx_mode 1 - -#define GLX_3DFX_WINDOW_MODE_MESA 0x1 -#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2 - -typedef GLboolean ( * PFNGLXSET3DFXMODEMESAPROC) (GLint mode); - -#define glXSet3DfxModeMESA GLXEW_GET_FUN(__glewXSet3DfxModeMESA) - -#define GLXEW_MESA_set_3dfx_mode GLXEW_GET_VAR(__GLXEW_MESA_set_3dfx_mode) - -#endif /* GLX_MESA_set_3dfx_mode */ - -/* ------------------------- GLX_MESA_swap_control ------------------------- */ - -#ifndef GLX_MESA_swap_control -#define GLX_MESA_swap_control 1 - -typedef int ( * PFNGLXGETSWAPINTERVALMESAPROC) (void); -typedef int ( * PFNGLXSWAPINTERVALMESAPROC) (unsigned int interval); - -#define glXGetSwapIntervalMESA GLXEW_GET_FUN(__glewXGetSwapIntervalMESA) -#define glXSwapIntervalMESA GLXEW_GET_FUN(__glewXSwapIntervalMESA) - -#define GLXEW_MESA_swap_control GLXEW_GET_VAR(__GLXEW_MESA_swap_control) - -#endif /* GLX_MESA_swap_control */ - -/* --------------------------- GLX_NV_copy_buffer -------------------------- */ - -#ifndef GLX_NV_copy_buffer -#define GLX_NV_copy_buffer 1 - -typedef void ( * PFNGLXCOPYBUFFERSUBDATANVPROC) (Display* dpy, GLXContext readCtx, GLXContext writeCtx, GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void ( * PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC) (Display* dpy, GLXContext readCtx, GLXContext writeCtx, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); - -#define glXCopyBufferSubDataNV GLXEW_GET_FUN(__glewXCopyBufferSubDataNV) -#define glXNamedCopyBufferSubDataNV GLXEW_GET_FUN(__glewXNamedCopyBufferSubDataNV) - -#define GLXEW_NV_copy_buffer GLXEW_GET_VAR(__GLXEW_NV_copy_buffer) - -#endif /* GLX_NV_copy_buffer */ - -/* --------------------------- GLX_NV_copy_image --------------------------- */ - -#ifndef GLX_NV_copy_image -#define GLX_NV_copy_image 1 - -typedef void ( * PFNGLXCOPYIMAGESUBDATANVPROC) (Display *dpy, GLXContext srcCtx, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLXContext dstCtx, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); - -#define glXCopyImageSubDataNV GLXEW_GET_FUN(__glewXCopyImageSubDataNV) - -#define GLXEW_NV_copy_image GLXEW_GET_VAR(__GLXEW_NV_copy_image) - -#endif /* GLX_NV_copy_image */ - -/* ------------------------ GLX_NV_delay_before_swap ----------------------- */ - -#ifndef GLX_NV_delay_before_swap -#define GLX_NV_delay_before_swap 1 - -typedef Bool ( * PFNGLXDELAYBEFORESWAPNVPROC) (Display* dpy, GLXDrawable drawable, GLfloat seconds); - -#define glXDelayBeforeSwapNV GLXEW_GET_FUN(__glewXDelayBeforeSwapNV) - -#define GLXEW_NV_delay_before_swap GLXEW_GET_VAR(__GLXEW_NV_delay_before_swap) - -#endif /* GLX_NV_delay_before_swap */ - -/* -------------------------- GLX_NV_float_buffer -------------------------- */ - -#ifndef GLX_NV_float_buffer -#define GLX_NV_float_buffer 1 - -#define GLX_FLOAT_COMPONENTS_NV 0x20B0 - -#define GLXEW_NV_float_buffer GLXEW_GET_VAR(__GLXEW_NV_float_buffer) - -#endif /* GLX_NV_float_buffer */ - -/* ------------------------ GLX_NV_multigpu_context ------------------------ */ - -#ifndef GLX_NV_multigpu_context -#define GLX_NV_multigpu_context 1 - -#define GLX_CONTEXT_MULTIGPU_ATTRIB_NV 0x20AA -#define GLX_CONTEXT_MULTIGPU_ATTRIB_SINGLE_NV 0x20AB -#define GLX_CONTEXT_MULTIGPU_ATTRIB_AFR_NV 0x20AC -#define GLX_CONTEXT_MULTIGPU_ATTRIB_MULTICAST_NV 0x20AD -#define GLX_CONTEXT_MULTIGPU_ATTRIB_MULTI_DISPLAY_MULTICAST_NV 0x20AE - -#define GLXEW_NV_multigpu_context GLXEW_GET_VAR(__GLXEW_NV_multigpu_context) - -#endif /* GLX_NV_multigpu_context */ - -/* ---------------------- GLX_NV_multisample_coverage ---------------------- */ - -#ifndef GLX_NV_multisample_coverage -#define GLX_NV_multisample_coverage 1 - -#define GLX_COLOR_SAMPLES_NV 0x20B3 -#define GLX_COVERAGE_SAMPLES_NV 100001 - -#define GLXEW_NV_multisample_coverage GLXEW_GET_VAR(__GLXEW_NV_multisample_coverage) - -#endif /* GLX_NV_multisample_coverage */ - -/* -------------------------- GLX_NV_present_video ------------------------- */ - -#ifndef GLX_NV_present_video -#define GLX_NV_present_video 1 - -#define GLX_NUM_VIDEO_SLOTS_NV 0x20F0 - -typedef int ( * PFNGLXBINDVIDEODEVICENVPROC) (Display* dpy, unsigned int video_slot, unsigned int video_device, const int* attrib_list); -typedef unsigned int* ( * PFNGLXENUMERATEVIDEODEVICESNVPROC) (Display* dpy, int screen, int* nelements); - -#define glXBindVideoDeviceNV GLXEW_GET_FUN(__glewXBindVideoDeviceNV) -#define glXEnumerateVideoDevicesNV GLXEW_GET_FUN(__glewXEnumerateVideoDevicesNV) - -#define GLXEW_NV_present_video GLXEW_GET_VAR(__GLXEW_NV_present_video) - -#endif /* GLX_NV_present_video */ - -/* ------------------ GLX_NV_robustness_video_memory_purge ----------------- */ - -#ifndef GLX_NV_robustness_video_memory_purge -#define GLX_NV_robustness_video_memory_purge 1 - -#define GLX_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x20F7 - -#define GLXEW_NV_robustness_video_memory_purge GLXEW_GET_VAR(__GLXEW_NV_robustness_video_memory_purge) - -#endif /* GLX_NV_robustness_video_memory_purge */ - -/* --------------------------- GLX_NV_swap_group --------------------------- */ - -#ifndef GLX_NV_swap_group -#define GLX_NV_swap_group 1 - -typedef Bool ( * PFNGLXBINDSWAPBARRIERNVPROC) (Display* dpy, GLuint group, GLuint barrier); -typedef Bool ( * PFNGLXJOINSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint group); -typedef Bool ( * PFNGLXQUERYFRAMECOUNTNVPROC) (Display* dpy, int screen, GLuint* count); -typedef Bool ( * PFNGLXQUERYMAXSWAPGROUPSNVPROC) (Display* dpy, int screen, GLuint* maxGroups, GLuint* maxBarriers); -typedef Bool ( * PFNGLXQUERYSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint* group, GLuint* barrier); -typedef Bool ( * PFNGLXRESETFRAMECOUNTNVPROC) (Display* dpy, int screen); - -#define glXBindSwapBarrierNV GLXEW_GET_FUN(__glewXBindSwapBarrierNV) -#define glXJoinSwapGroupNV GLXEW_GET_FUN(__glewXJoinSwapGroupNV) -#define glXQueryFrameCountNV GLXEW_GET_FUN(__glewXQueryFrameCountNV) -#define glXQueryMaxSwapGroupsNV GLXEW_GET_FUN(__glewXQueryMaxSwapGroupsNV) -#define glXQuerySwapGroupNV GLXEW_GET_FUN(__glewXQuerySwapGroupNV) -#define glXResetFrameCountNV GLXEW_GET_FUN(__glewXResetFrameCountNV) - -#define GLXEW_NV_swap_group GLXEW_GET_VAR(__GLXEW_NV_swap_group) - -#endif /* GLX_NV_swap_group */ - -/* ----------------------- GLX_NV_vertex_array_range ----------------------- */ - -#ifndef GLX_NV_vertex_array_range -#define GLX_NV_vertex_array_range 1 - -typedef void * ( * PFNGLXALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); -typedef void ( * PFNGLXFREEMEMORYNVPROC) (void *pointer); - -#define glXAllocateMemoryNV GLXEW_GET_FUN(__glewXAllocateMemoryNV) -#define glXFreeMemoryNV GLXEW_GET_FUN(__glewXFreeMemoryNV) - -#define GLXEW_NV_vertex_array_range GLXEW_GET_VAR(__GLXEW_NV_vertex_array_range) - -#endif /* GLX_NV_vertex_array_range */ - -/* -------------------------- GLX_NV_video_capture ------------------------- */ - -#ifndef GLX_NV_video_capture -#define GLX_NV_video_capture 1 - -#define GLX_DEVICE_ID_NV 0x20CD -#define GLX_UNIQUE_ID_NV 0x20CE -#define GLX_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF - -typedef XID GLXVideoCaptureDeviceNV; - -typedef int ( * PFNGLXBINDVIDEOCAPTUREDEVICENVPROC) (Display* dpy, unsigned int video_capture_slot, GLXVideoCaptureDeviceNV device); -typedef GLXVideoCaptureDeviceNV* ( * PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC) (Display* dpy, int screen, int* nelements); -typedef void ( * PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device); -typedef int ( * PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device, int attribute, int* value); -typedef void ( * PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device); - -#define glXBindVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXBindVideoCaptureDeviceNV) -#define glXEnumerateVideoCaptureDevicesNV GLXEW_GET_FUN(__glewXEnumerateVideoCaptureDevicesNV) -#define glXLockVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXLockVideoCaptureDeviceNV) -#define glXQueryVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXQueryVideoCaptureDeviceNV) -#define glXReleaseVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXReleaseVideoCaptureDeviceNV) - -#define GLXEW_NV_video_capture GLXEW_GET_VAR(__GLXEW_NV_video_capture) - -#endif /* GLX_NV_video_capture */ - -/* ---------------------------- GLX_NV_video_out --------------------------- */ - -#ifndef GLX_NV_video_out -#define GLX_NV_video_out 1 - -#define GLX_VIDEO_OUT_COLOR_NV 0x20C3 -#define GLX_VIDEO_OUT_ALPHA_NV 0x20C4 -#define GLX_VIDEO_OUT_DEPTH_NV 0x20C5 -#define GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 -#define GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 -#define GLX_VIDEO_OUT_FRAME_NV 0x20C8 -#define GLX_VIDEO_OUT_FIELD_1_NV 0x20C9 -#define GLX_VIDEO_OUT_FIELD_2_NV 0x20CA -#define GLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV 0x20CB -#define GLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV 0x20CC - -typedef int ( * PFNGLXBINDVIDEOIMAGENVPROC) (Display* dpy, GLXVideoDeviceNV VideoDevice, GLXPbuffer pbuf, int iVideoBuffer); -typedef int ( * PFNGLXGETVIDEODEVICENVPROC) (Display* dpy, int screen, int numVideoDevices, GLXVideoDeviceNV* pVideoDevice); -typedef int ( * PFNGLXGETVIDEOINFONVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice, unsigned long* pulCounterOutputPbuffer, unsigned long* pulCounterOutputVideo); -typedef int ( * PFNGLXRELEASEVIDEODEVICENVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice); -typedef int ( * PFNGLXRELEASEVIDEOIMAGENVPROC) (Display* dpy, GLXPbuffer pbuf); -typedef int ( * PFNGLXSENDPBUFFERTOVIDEONVPROC) (Display* dpy, GLXPbuffer pbuf, int iBufferType, unsigned long* pulCounterPbuffer, GLboolean bBlock); - -#define glXBindVideoImageNV GLXEW_GET_FUN(__glewXBindVideoImageNV) -#define glXGetVideoDeviceNV GLXEW_GET_FUN(__glewXGetVideoDeviceNV) -#define glXGetVideoInfoNV GLXEW_GET_FUN(__glewXGetVideoInfoNV) -#define glXReleaseVideoDeviceNV GLXEW_GET_FUN(__glewXReleaseVideoDeviceNV) -#define glXReleaseVideoImageNV GLXEW_GET_FUN(__glewXReleaseVideoImageNV) -#define glXSendPbufferToVideoNV GLXEW_GET_FUN(__glewXSendPbufferToVideoNV) - -#define GLXEW_NV_video_out GLXEW_GET_VAR(__GLXEW_NV_video_out) - -#endif /* GLX_NV_video_out */ - -/* -------------------------- GLX_OML_swap_method -------------------------- */ - -#ifndef GLX_OML_swap_method -#define GLX_OML_swap_method 1 - -#define GLX_SWAP_METHOD_OML 0x8060 -#define GLX_SWAP_EXCHANGE_OML 0x8061 -#define GLX_SWAP_COPY_OML 0x8062 -#define GLX_SWAP_UNDEFINED_OML 0x8063 - -#define GLXEW_OML_swap_method GLXEW_GET_VAR(__GLXEW_OML_swap_method) - -#endif /* GLX_OML_swap_method */ - -/* -------------------------- GLX_OML_sync_control ------------------------- */ - -#ifndef GLX_OML_sync_control -#define GLX_OML_sync_control 1 - -typedef Bool ( * PFNGLXGETMSCRATEOMLPROC) (Display* dpy, GLXDrawable drawable, int32_t* numerator, int32_t* denominator); -typedef Bool ( * PFNGLXGETSYNCVALUESOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t* ust, int64_t* msc, int64_t* sbc); -typedef int64_t ( * PFNGLXSWAPBUFFERSMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder); -typedef Bool ( * PFNGLXWAITFORMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t* ust, int64_t* msc, int64_t* sbc); -typedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_sbc, int64_t* ust, int64_t* msc, int64_t* sbc); - -#define glXGetMscRateOML GLXEW_GET_FUN(__glewXGetMscRateOML) -#define glXGetSyncValuesOML GLXEW_GET_FUN(__glewXGetSyncValuesOML) -#define glXSwapBuffersMscOML GLXEW_GET_FUN(__glewXSwapBuffersMscOML) -#define glXWaitForMscOML GLXEW_GET_FUN(__glewXWaitForMscOML) -#define glXWaitForSbcOML GLXEW_GET_FUN(__glewXWaitForSbcOML) - -#define GLXEW_OML_sync_control GLXEW_GET_VAR(__GLXEW_OML_sync_control) - -#endif /* GLX_OML_sync_control */ - -/* ------------------------ GLX_SGIS_blended_overlay ----------------------- */ - -#ifndef GLX_SGIS_blended_overlay -#define GLX_SGIS_blended_overlay 1 - -#define GLX_BLENDED_RGBA_SGIS 0x8025 - -#define GLXEW_SGIS_blended_overlay GLXEW_GET_VAR(__GLXEW_SGIS_blended_overlay) - -#endif /* GLX_SGIS_blended_overlay */ - -/* -------------------------- GLX_SGIS_color_range ------------------------- */ - -#ifndef GLX_SGIS_color_range -#define GLX_SGIS_color_range 1 - -#define GLXEW_SGIS_color_range GLXEW_GET_VAR(__GLXEW_SGIS_color_range) - -#endif /* GLX_SGIS_color_range */ - -/* -------------------------- GLX_SGIS_multisample ------------------------- */ - -#ifndef GLX_SGIS_multisample -#define GLX_SGIS_multisample 1 - -#define GLX_SAMPLE_BUFFERS_SGIS 100000 -#define GLX_SAMPLES_SGIS 100001 - -#define GLXEW_SGIS_multisample GLXEW_GET_VAR(__GLXEW_SGIS_multisample) - -#endif /* GLX_SGIS_multisample */ - -/* ---------------------- GLX_SGIS_shared_multisample ---------------------- */ - -#ifndef GLX_SGIS_shared_multisample -#define GLX_SGIS_shared_multisample 1 - -#define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026 -#define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027 - -#define GLXEW_SGIS_shared_multisample GLXEW_GET_VAR(__GLXEW_SGIS_shared_multisample) - -#endif /* GLX_SGIS_shared_multisample */ - -/* --------------------------- GLX_SGIX_fbconfig --------------------------- */ - -#ifndef GLX_SGIX_fbconfig -#define GLX_SGIX_fbconfig 1 - -#define GLX_RGBA_BIT_SGIX 0x00000001 -#define GLX_WINDOW_BIT_SGIX 0x00000001 -#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002 -#define GLX_PIXMAP_BIT_SGIX 0x00000002 -#define GLX_SCREEN_EXT 0x800C -#define GLX_DRAWABLE_TYPE_SGIX 0x8010 -#define GLX_RENDER_TYPE_SGIX 0x8011 -#define GLX_X_RENDERABLE_SGIX 0x8012 -#define GLX_FBCONFIG_ID_SGIX 0x8013 -#define GLX_RGBA_TYPE_SGIX 0x8014 -#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015 - -typedef XID GLXFBConfigIDSGIX; -typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; - -typedef GLXFBConfigSGIX* ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display* dpy, int screen, int* attrib_list, int* nelements); -typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct); -typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfigSGIX config, Pixmap pixmap); -typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display* dpy, GLXFBConfigSGIX config, int attribute, int* value); -typedef GLXFBConfigSGIX ( * PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display* dpy, XVisualInfo* vis); -typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display* dpy, GLXFBConfigSGIX config); - -#define glXChooseFBConfigSGIX GLXEW_GET_FUN(__glewXChooseFBConfigSGIX) -#define glXCreateContextWithConfigSGIX GLXEW_GET_FUN(__glewXCreateContextWithConfigSGIX) -#define glXCreateGLXPixmapWithConfigSGIX GLXEW_GET_FUN(__glewXCreateGLXPixmapWithConfigSGIX) -#define glXGetFBConfigAttribSGIX GLXEW_GET_FUN(__glewXGetFBConfigAttribSGIX) -#define glXGetFBConfigFromVisualSGIX GLXEW_GET_FUN(__glewXGetFBConfigFromVisualSGIX) -#define glXGetVisualFromFBConfigSGIX GLXEW_GET_FUN(__glewXGetVisualFromFBConfigSGIX) - -#define GLXEW_SGIX_fbconfig GLXEW_GET_VAR(__GLXEW_SGIX_fbconfig) - -#endif /* GLX_SGIX_fbconfig */ - -/* --------------------------- GLX_SGIX_hyperpipe -------------------------- */ - -#ifndef GLX_SGIX_hyperpipe -#define GLX_SGIX_hyperpipe 1 - -#define GLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001 -#define GLX_PIPE_RECT_SGIX 0x00000001 -#define GLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002 -#define GLX_PIPE_RECT_LIMITS_SGIX 0x00000002 -#define GLX_HYPERPIPE_STEREO_SGIX 0x00000003 -#define GLX_HYPERPIPE_PIXEL_AVERAGE_SGIX 0x00000004 -#define GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80 -#define GLX_BAD_HYPERPIPE_CONFIG_SGIX 91 -#define GLX_BAD_HYPERPIPE_SGIX 92 -#define GLX_HYPERPIPE_ID_SGIX 0x8030 - -typedef struct { - char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; - int networkId; -} GLXHyperpipeNetworkSGIX; -typedef struct { - char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; - int XOrigin; - int YOrigin; - int maxHeight; - int maxWidth; -} GLXPipeRectLimits; -typedef struct { - char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; - int channel; - unsigned int participationType; - int timeSlice; -} GLXHyperpipeConfigSGIX; -typedef struct { - char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; - int srcXOrigin; - int srcYOrigin; - int srcWidth; - int srcHeight; - int destXOrigin; - int destYOrigin; - int destWidth; - int destHeight; -} GLXPipeRect; - -typedef int ( * PFNGLXBINDHYPERPIPESGIXPROC) (Display *dpy, int hpId); -typedef int ( * PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId); -typedef int ( * PFNGLXHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList); -typedef int ( * PFNGLXHYPERPIPECONFIGSGIXPROC) (Display *dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX *cfg, int *hpId); -typedef int ( * PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *returnAttribList); -typedef int ( * PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList, void *returnAttribList); -typedef GLXHyperpipeConfigSGIX * ( * PFNGLXQUERYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId, int *npipes); -typedef GLXHyperpipeNetworkSGIX * ( * PFNGLXQUERYHYPERPIPENETWORKSGIXPROC) (Display *dpy, int *npipes); - -#define glXBindHyperpipeSGIX GLXEW_GET_FUN(__glewXBindHyperpipeSGIX) -#define glXDestroyHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXDestroyHyperpipeConfigSGIX) -#define glXHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXHyperpipeAttribSGIX) -#define glXHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXHyperpipeConfigSGIX) -#define glXQueryHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeAttribSGIX) -#define glXQueryHyperpipeBestAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeBestAttribSGIX) -#define glXQueryHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeConfigSGIX) -#define glXQueryHyperpipeNetworkSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeNetworkSGIX) - -#define GLXEW_SGIX_hyperpipe GLXEW_GET_VAR(__GLXEW_SGIX_hyperpipe) - -#endif /* GLX_SGIX_hyperpipe */ - -/* ---------------------------- GLX_SGIX_pbuffer --------------------------- */ - -#ifndef GLX_SGIX_pbuffer -#define GLX_SGIX_pbuffer 1 - -#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001 -#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002 -#define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004 -#define GLX_PBUFFER_BIT_SGIX 0x00000004 -#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008 -#define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010 -#define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020 -#define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040 -#define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080 -#define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100 -#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016 -#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017 -#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018 -#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019 -#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A -#define GLX_PRESERVED_CONTENTS_SGIX 0x801B -#define GLX_LARGEST_PBUFFER_SGIX 0x801C -#define GLX_WIDTH_SGIX 0x801D -#define GLX_HEIGHT_SGIX 0x801E -#define GLX_EVENT_MASK_SGIX 0x801F -#define GLX_DAMAGED_SGIX 0x8020 -#define GLX_SAVED_SGIX 0x8021 -#define GLX_WINDOW_SGIX 0x8022 -#define GLX_PBUFFER_SGIX 0x8023 -#define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000 - -typedef XID GLXPbufferSGIX; -typedef struct { int type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; int event_type; int draw_type; unsigned int mask; int x, y; int width, height; int count; } GLXBufferClobberEventSGIX; - -typedef GLXPbufferSGIX ( * PFNGLXCREATEGLXPBUFFERSGIXPROC) (Display* dpy, GLXFBConfigSGIX config, unsigned int width, unsigned int height, int* attrib_list); -typedef void ( * PFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbufferSGIX pbuf); -typedef void ( * PFNGLXGETSELECTEDEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long* mask); -typedef void ( * PFNGLXQUERYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbufferSGIX pbuf, int attribute, unsigned int* value); -typedef void ( * PFNGLXSELECTEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long mask); - -#define glXCreateGLXPbufferSGIX GLXEW_GET_FUN(__glewXCreateGLXPbufferSGIX) -#define glXDestroyGLXPbufferSGIX GLXEW_GET_FUN(__glewXDestroyGLXPbufferSGIX) -#define glXGetSelectedEventSGIX GLXEW_GET_FUN(__glewXGetSelectedEventSGIX) -#define glXQueryGLXPbufferSGIX GLXEW_GET_FUN(__glewXQueryGLXPbufferSGIX) -#define glXSelectEventSGIX GLXEW_GET_FUN(__glewXSelectEventSGIX) - -#define GLXEW_SGIX_pbuffer GLXEW_GET_VAR(__GLXEW_SGIX_pbuffer) - -#endif /* GLX_SGIX_pbuffer */ - -/* ------------------------- GLX_SGIX_swap_barrier ------------------------- */ - -#ifndef GLX_SGIX_swap_barrier -#define GLX_SGIX_swap_barrier 1 - -typedef void ( * PFNGLXBINDSWAPBARRIERSGIXPROC) (Display* dpy, GLXDrawable drawable, int barrier); -typedef Bool ( * PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display* dpy, int screen, int* max); - -#define glXBindSwapBarrierSGIX GLXEW_GET_FUN(__glewXBindSwapBarrierSGIX) -#define glXQueryMaxSwapBarriersSGIX GLXEW_GET_FUN(__glewXQueryMaxSwapBarriersSGIX) - -#define GLXEW_SGIX_swap_barrier GLXEW_GET_VAR(__GLXEW_SGIX_swap_barrier) - -#endif /* GLX_SGIX_swap_barrier */ - -/* -------------------------- GLX_SGIX_swap_group -------------------------- */ - -#ifndef GLX_SGIX_swap_group -#define GLX_SGIX_swap_group 1 - -typedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display* dpy, GLXDrawable drawable, GLXDrawable member); - -#define glXJoinSwapGroupSGIX GLXEW_GET_FUN(__glewXJoinSwapGroupSGIX) - -#define GLXEW_SGIX_swap_group GLXEW_GET_VAR(__GLXEW_SGIX_swap_group) - -#endif /* GLX_SGIX_swap_group */ - -/* ------------------------- GLX_SGIX_video_resize ------------------------- */ - -#ifndef GLX_SGIX_video_resize -#define GLX_SGIX_video_resize 1 - -#define GLX_SYNC_FRAME_SGIX 0x00000000 -#define GLX_SYNC_SWAP_SGIX 0x00000001 - -typedef int ( * PFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display* display, int screen, int channel, Window window); -typedef int ( * PFNGLXCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int x, int y, int w, int h); -typedef int ( * PFNGLXCHANNELRECTSYNCSGIXPROC) (Display* display, int screen, int channel, GLenum synctype); -typedef int ( * PFNGLXQUERYCHANNELDELTASSGIXPROC) (Display* display, int screen, int channel, int* x, int* y, int* w, int* h); -typedef int ( * PFNGLXQUERYCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int* dx, int* dy, int* dw, int* dh); - -#define glXBindChannelToWindowSGIX GLXEW_GET_FUN(__glewXBindChannelToWindowSGIX) -#define glXChannelRectSGIX GLXEW_GET_FUN(__glewXChannelRectSGIX) -#define glXChannelRectSyncSGIX GLXEW_GET_FUN(__glewXChannelRectSyncSGIX) -#define glXQueryChannelDeltasSGIX GLXEW_GET_FUN(__glewXQueryChannelDeltasSGIX) -#define glXQueryChannelRectSGIX GLXEW_GET_FUN(__glewXQueryChannelRectSGIX) - -#define GLXEW_SGIX_video_resize GLXEW_GET_VAR(__GLXEW_SGIX_video_resize) - -#endif /* GLX_SGIX_video_resize */ - -/* ---------------------- GLX_SGIX_visual_select_group --------------------- */ - -#ifndef GLX_SGIX_visual_select_group -#define GLX_SGIX_visual_select_group 1 - -#define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028 - -#define GLXEW_SGIX_visual_select_group GLXEW_GET_VAR(__GLXEW_SGIX_visual_select_group) - -#endif /* GLX_SGIX_visual_select_group */ - -/* ---------------------------- GLX_SGI_cushion ---------------------------- */ - -#ifndef GLX_SGI_cushion -#define GLX_SGI_cushion 1 - -typedef void ( * PFNGLXCUSHIONSGIPROC) (Display* dpy, Window window, float cushion); - -#define glXCushionSGI GLXEW_GET_FUN(__glewXCushionSGI) - -#define GLXEW_SGI_cushion GLXEW_GET_VAR(__GLXEW_SGI_cushion) - -#endif /* GLX_SGI_cushion */ - -/* ----------------------- GLX_SGI_make_current_read ----------------------- */ - -#ifndef GLX_SGI_make_current_read -#define GLX_SGI_make_current_read 1 - -typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLESGIPROC) (void); -typedef Bool ( * PFNGLXMAKECURRENTREADSGIPROC) (Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); - -#define glXGetCurrentReadDrawableSGI GLXEW_GET_FUN(__glewXGetCurrentReadDrawableSGI) -#define glXMakeCurrentReadSGI GLXEW_GET_FUN(__glewXMakeCurrentReadSGI) - -#define GLXEW_SGI_make_current_read GLXEW_GET_VAR(__GLXEW_SGI_make_current_read) - -#endif /* GLX_SGI_make_current_read */ - -/* -------------------------- GLX_SGI_swap_control ------------------------- */ - -#ifndef GLX_SGI_swap_control -#define GLX_SGI_swap_control 1 - -typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval); - -#define glXSwapIntervalSGI GLXEW_GET_FUN(__glewXSwapIntervalSGI) - -#define GLXEW_SGI_swap_control GLXEW_GET_VAR(__GLXEW_SGI_swap_control) - -#endif /* GLX_SGI_swap_control */ - -/* --------------------------- GLX_SGI_video_sync -------------------------- */ - -#ifndef GLX_SGI_video_sync -#define GLX_SGI_video_sync 1 - -typedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (unsigned int* count); -typedef int ( * PFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int* count); - -#define glXGetVideoSyncSGI GLXEW_GET_FUN(__glewXGetVideoSyncSGI) -#define glXWaitVideoSyncSGI GLXEW_GET_FUN(__glewXWaitVideoSyncSGI) - -#define GLXEW_SGI_video_sync GLXEW_GET_VAR(__GLXEW_SGI_video_sync) - -#endif /* GLX_SGI_video_sync */ - -/* --------------------- GLX_SUN_get_transparent_index --------------------- */ - -#ifndef GLX_SUN_get_transparent_index -#define GLX_SUN_get_transparent_index 1 - -typedef Status ( * PFNGLXGETTRANSPARENTINDEXSUNPROC) (Display* dpy, Window overlay, Window underlay, unsigned long* pTransparentIndex); - -#define glXGetTransparentIndexSUN GLXEW_GET_FUN(__glewXGetTransparentIndexSUN) - -#define GLXEW_SUN_get_transparent_index GLXEW_GET_VAR(__GLXEW_SUN_get_transparent_index) - -#endif /* GLX_SUN_get_transparent_index */ - -/* -------------------------- GLX_SUN_video_resize ------------------------- */ - -#ifndef GLX_SUN_video_resize -#define GLX_SUN_video_resize 1 - -#define GLX_VIDEO_RESIZE_SUN 0x8171 -#define GL_VIDEO_RESIZE_COMPENSATION_SUN 0x85CD - -typedef int ( * PFNGLXGETVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float* factor); -typedef int ( * PFNGLXVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float factor); - -#define glXGetVideoResizeSUN GLXEW_GET_FUN(__glewXGetVideoResizeSUN) -#define glXVideoResizeSUN GLXEW_GET_FUN(__glewXVideoResizeSUN) - -#define GLXEW_SUN_video_resize GLXEW_GET_VAR(__GLXEW_SUN_video_resize) - -#endif /* GLX_SUN_video_resize */ - -/* ------------------------------------------------------------------------- */ - -#define GLXEW_FUN_EXPORT GLEW_FUN_EXPORT -#define GLXEW_VAR_EXPORT GLEW_VAR_EXPORT - -GLXEW_FUN_EXPORT PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay; - -GLXEW_FUN_EXPORT PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig; -GLXEW_FUN_EXPORT PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext; -GLXEW_FUN_EXPORT PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer; -GLXEW_FUN_EXPORT PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap; -GLXEW_FUN_EXPORT PFNGLXCREATEWINDOWPROC __glewXCreateWindow; -GLXEW_FUN_EXPORT PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer; -GLXEW_FUN_EXPORT PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap; -GLXEW_FUN_EXPORT PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow; -GLXEW_FUN_EXPORT PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable; -GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib; -GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs; -GLXEW_FUN_EXPORT PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent; -GLXEW_FUN_EXPORT PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig; -GLXEW_FUN_EXPORT PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent; -GLXEW_FUN_EXPORT PFNGLXQUERYCONTEXTPROC __glewXQueryContext; -GLXEW_FUN_EXPORT PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable; -GLXEW_FUN_EXPORT PFNGLXSELECTEVENTPROC __glewXSelectEvent; - -GLXEW_FUN_EXPORT PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC __glewXBlitContextFramebufferAMD; -GLXEW_FUN_EXPORT PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC __glewXCreateAssociatedContextAMD; -GLXEW_FUN_EXPORT PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __glewXCreateAssociatedContextAttribsAMD; -GLXEW_FUN_EXPORT PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC __glewXDeleteAssociatedContextAMD; -GLXEW_FUN_EXPORT PFNGLXGETCONTEXTGPUIDAMDPROC __glewXGetContextGPUIDAMD; -GLXEW_FUN_EXPORT PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC __glewXGetCurrentAssociatedContextAMD; -GLXEW_FUN_EXPORT PFNGLXGETGPUIDSAMDPROC __glewXGetGPUIDsAMD; -GLXEW_FUN_EXPORT PFNGLXGETGPUINFOAMDPROC __glewXGetGPUInfoAMD; -GLXEW_FUN_EXPORT PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __glewXMakeAssociatedContextCurrentAMD; - -GLXEW_FUN_EXPORT PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB; - -GLXEW_FUN_EXPORT PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI; -GLXEW_FUN_EXPORT PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI; -GLXEW_FUN_EXPORT PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI; - -GLXEW_FUN_EXPORT PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT; -GLXEW_FUN_EXPORT PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT; -GLXEW_FUN_EXPORT PFNGLXGETCURRENTDISPLAYEXTPROC __glewXGetCurrentDisplayEXT; -GLXEW_FUN_EXPORT PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT; -GLXEW_FUN_EXPORT PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT; - -GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT; - -GLXEW_FUN_EXPORT PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT; -GLXEW_FUN_EXPORT PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT; - -GLXEW_FUN_EXPORT PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA; - -GLXEW_FUN_EXPORT PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA; - -GLXEW_FUN_EXPORT PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA; - -GLXEW_FUN_EXPORT PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC __glewXQueryCurrentRendererIntegerMESA; -GLXEW_FUN_EXPORT PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC __glewXQueryCurrentRendererStringMESA; -GLXEW_FUN_EXPORT PFNGLXQUERYRENDERERINTEGERMESAPROC __glewXQueryRendererIntegerMESA; -GLXEW_FUN_EXPORT PFNGLXQUERYRENDERERSTRINGMESAPROC __glewXQueryRendererStringMESA; - -GLXEW_FUN_EXPORT PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA; - -GLXEW_FUN_EXPORT PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA; - -GLXEW_FUN_EXPORT PFNGLXGETSWAPINTERVALMESAPROC __glewXGetSwapIntervalMESA; -GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALMESAPROC __glewXSwapIntervalMESA; - -GLXEW_FUN_EXPORT PFNGLXCOPYBUFFERSUBDATANVPROC __glewXCopyBufferSubDataNV; -GLXEW_FUN_EXPORT PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC __glewXNamedCopyBufferSubDataNV; - -GLXEW_FUN_EXPORT PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV; - -GLXEW_FUN_EXPORT PFNGLXDELAYBEFORESWAPNVPROC __glewXDelayBeforeSwapNV; - -GLXEW_FUN_EXPORT PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV; -GLXEW_FUN_EXPORT PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV; - -GLXEW_FUN_EXPORT PFNGLXBINDSWAPBARRIERNVPROC __glewXBindSwapBarrierNV; -GLXEW_FUN_EXPORT PFNGLXJOINSWAPGROUPNVPROC __glewXJoinSwapGroupNV; -GLXEW_FUN_EXPORT PFNGLXQUERYFRAMECOUNTNVPROC __glewXQueryFrameCountNV; -GLXEW_FUN_EXPORT PFNGLXQUERYMAXSWAPGROUPSNVPROC __glewXQueryMaxSwapGroupsNV; -GLXEW_FUN_EXPORT PFNGLXQUERYSWAPGROUPNVPROC __glewXQuerySwapGroupNV; -GLXEW_FUN_EXPORT PFNGLXRESETFRAMECOUNTNVPROC __glewXResetFrameCountNV; - -GLXEW_FUN_EXPORT PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV; -GLXEW_FUN_EXPORT PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV; - -GLXEW_FUN_EXPORT PFNGLXBINDVIDEOCAPTUREDEVICENVPROC __glewXBindVideoCaptureDeviceNV; -GLXEW_FUN_EXPORT PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC __glewXEnumerateVideoCaptureDevicesNV; -GLXEW_FUN_EXPORT PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC __glewXLockVideoCaptureDeviceNV; -GLXEW_FUN_EXPORT PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC __glewXQueryVideoCaptureDeviceNV; -GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC __glewXReleaseVideoCaptureDeviceNV; - -GLXEW_FUN_EXPORT PFNGLXBINDVIDEOIMAGENVPROC __glewXBindVideoImageNV; -GLXEW_FUN_EXPORT PFNGLXGETVIDEODEVICENVPROC __glewXGetVideoDeviceNV; -GLXEW_FUN_EXPORT PFNGLXGETVIDEOINFONVPROC __glewXGetVideoInfoNV; -GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEODEVICENVPROC __glewXReleaseVideoDeviceNV; -GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEOIMAGENVPROC __glewXReleaseVideoImageNV; -GLXEW_FUN_EXPORT PFNGLXSENDPBUFFERTOVIDEONVPROC __glewXSendPbufferToVideoNV; - -GLXEW_FUN_EXPORT PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML; -GLXEW_FUN_EXPORT PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML; -GLXEW_FUN_EXPORT PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML; -GLXEW_FUN_EXPORT PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML; -GLXEW_FUN_EXPORT PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML; - -GLXEW_FUN_EXPORT PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX; -GLXEW_FUN_EXPORT PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX; -GLXEW_FUN_EXPORT PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX; -GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX; -GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX; -GLXEW_FUN_EXPORT PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX; - -GLXEW_FUN_EXPORT PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX; -GLXEW_FUN_EXPORT PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX; -GLXEW_FUN_EXPORT PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX; -GLXEW_FUN_EXPORT PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX; - -GLXEW_FUN_EXPORT PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX; -GLXEW_FUN_EXPORT PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX; -GLXEW_FUN_EXPORT PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX; -GLXEW_FUN_EXPORT PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX; - -GLXEW_FUN_EXPORT PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX; - -GLXEW_FUN_EXPORT PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX; - -GLXEW_FUN_EXPORT PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX; -GLXEW_FUN_EXPORT PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX; -GLXEW_FUN_EXPORT PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX; - -GLXEW_FUN_EXPORT PFNGLXCUSHIONSGIPROC __glewXCushionSGI; - -GLXEW_FUN_EXPORT PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI; -GLXEW_FUN_EXPORT PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI; - -GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI; - -GLXEW_FUN_EXPORT PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI; -GLXEW_FUN_EXPORT PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI; - -GLXEW_FUN_EXPORT PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN; - -GLXEW_FUN_EXPORT PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN; -GLXEW_FUN_EXPORT PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN; -GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_0; -GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_1; -GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_2; -GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_3; -GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_4; -GLXEW_VAR_EXPORT GLboolean __GLXEW_3DFX_multisample; -GLXEW_VAR_EXPORT GLboolean __GLXEW_AMD_gpu_association; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_context_flush_control; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_no_error; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_profile; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_robustness; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_fbconfig_float; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_framebuffer_sRGB; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_get_proc_address; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_multisample; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_robustness_application_isolation; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_robustness_share_group_isolation; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_vertex_buffer_object; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_pixel_format_float; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_render_texture; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_buffer_age; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_context_priority; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es2_profile; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es_profile; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_fbconfig_packed_float; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_framebuffer_sRGB; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_import_context; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_libglvnd; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_no_config_context; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_scene_marker; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_stereo_tree; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_swap_control; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_swap_control_tear; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_texture_from_pixmap; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_visual_info; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_visual_rating; -GLXEW_VAR_EXPORT GLboolean __GLXEW_INTEL_swap_event; -GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_agp_offset; -GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_copy_sub_buffer; -GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_pixmap_colormap; -GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_query_renderer; -GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_release_buffers; -GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_set_3dfx_mode; -GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_swap_control; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_copy_buffer; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_copy_image; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_delay_before_swap; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_float_buffer; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_multigpu_context; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_multisample_coverage; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_present_video; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_robustness_video_memory_purge; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_swap_group; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_vertex_array_range; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_capture; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_out; -GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_swap_method; -GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_sync_control; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_blended_overlay; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_color_range; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_multisample; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_shared_multisample; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_fbconfig; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_hyperpipe; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_pbuffer; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_swap_barrier; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_swap_group; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_video_resize; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_visual_select_group; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_cushion; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_make_current_read; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_swap_control; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_video_sync; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SUN_get_transparent_index; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SUN_video_resize; -/* ------------------------------------------------------------------------ */ - -GLEWAPI GLenum GLEWAPIENTRY glxewInit (); -GLEWAPI GLboolean GLEWAPIENTRY glxewIsSupported (const char *name); - -#ifndef GLXEW_GET_VAR -#define GLXEW_GET_VAR(x) (*(const GLboolean*)&x) -#endif - -#ifndef GLXEW_GET_FUN -#define GLXEW_GET_FUN(x) x -#endif - -GLEWAPI GLboolean GLEWAPIENTRY glxewGetExtension (const char *name); - -#ifdef __cplusplus -} -#endif - -#endif /* __glxew_h__ */ diff --git a/src/glew/include/GL/wglew.h b/src/glew/include/GL/wglew.h deleted file mode 100644 index 7e2d0904cbd..00000000000 --- a/src/glew/include/GL/wglew.h +++ /dev/null @@ -1,1468 +0,0 @@ -/* -** The OpenGL Extension Wrangler Library -** Copyright (C) 2008-2019, Nigel Stewart -** Copyright (C) 2002-2008, Milan Ikits -** Copyright (C) 2002-2008, Marcelo E. Magallon -** Copyright (C) 2002, Lev Povalahev -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are met: -** -** * Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** * The name of the author may be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -** THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* -** Copyright (c) 2007 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ - -#ifndef __wglew_h__ -#define __wglew_h__ -#define __WGLEW_H__ - -#ifdef __wglext_h_ -#error wglext.h included before wglew.h -#endif - -#define __wglext_h_ - -#if !defined(WINAPI) -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN 1 -# endif -#include -# undef WIN32_LEAN_AND_MEAN -#endif - -/* - * GLEW_STATIC needs to be set when using the static version. - * GLEW_BUILD is set when building the DLL version. - */ -#ifdef GLEW_STATIC -# define GLEWAPI extern -#else -# ifdef GLEW_BUILD -# define GLEWAPI extern __declspec(dllexport) -# else -# define GLEWAPI extern __declspec(dllimport) -# endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* -------------------------- WGL_3DFX_multisample ------------------------- */ - -#ifndef WGL_3DFX_multisample -#define WGL_3DFX_multisample 1 - -#define WGL_SAMPLE_BUFFERS_3DFX 0x2060 -#define WGL_SAMPLES_3DFX 0x2061 - -#define WGLEW_3DFX_multisample WGLEW_GET_VAR(__WGLEW_3DFX_multisample) - -#endif /* WGL_3DFX_multisample */ - -/* ------------------------- WGL_3DL_stereo_control ------------------------ */ - -#ifndef WGL_3DL_stereo_control -#define WGL_3DL_stereo_control 1 - -#define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055 -#define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056 -#define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057 -#define WGL_STEREO_POLARITY_INVERT_3DL 0x2058 - -typedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState); - -#define wglSetStereoEmitterState3DL WGLEW_GET_FUN(__wglewSetStereoEmitterState3DL) - -#define WGLEW_3DL_stereo_control WGLEW_GET_VAR(__WGLEW_3DL_stereo_control) - -#endif /* WGL_3DL_stereo_control */ - -/* ------------------------ WGL_AMD_gpu_association ------------------------ */ - -#ifndef WGL_AMD_gpu_association -#define WGL_AMD_gpu_association 1 - -#define WGL_GPU_VENDOR_AMD 0x1F00 -#define WGL_GPU_RENDERER_STRING_AMD 0x1F01 -#define WGL_GPU_OPENGL_VERSION_STRING_AMD 0x1F02 -#define WGL_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2 -#define WGL_GPU_RAM_AMD 0x21A3 -#define WGL_GPU_CLOCK_AMD 0x21A4 -#define WGL_GPU_NUM_PIPES_AMD 0x21A5 -#define WGL_GPU_NUM_SIMD_AMD 0x21A6 -#define WGL_GPU_NUM_RB_AMD 0x21A7 -#define WGL_GPU_NUM_SPI_AMD 0x21A8 - -typedef VOID (WINAPI * PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC) (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC) (UINT id); -typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (UINT id, HGLRC hShareContext, const int* attribList); -typedef BOOL (WINAPI * PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC) (HGLRC hglrc); -typedef UINT (WINAPI * PFNWGLGETCONTEXTGPUIDAMDPROC) (HGLRC hglrc); -typedef HGLRC (WINAPI * PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void); -typedef UINT (WINAPI * PFNWGLGETGPUIDSAMDPROC) (UINT maxCount, UINT* ids); -typedef INT (WINAPI * PFNWGLGETGPUINFOAMDPROC) (UINT id, INT property, GLenum dataType, UINT size, void* data); -typedef BOOL (WINAPI * PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (HGLRC hglrc); - -#define wglBlitContextFramebufferAMD WGLEW_GET_FUN(__wglewBlitContextFramebufferAMD) -#define wglCreateAssociatedContextAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAMD) -#define wglCreateAssociatedContextAttribsAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAttribsAMD) -#define wglDeleteAssociatedContextAMD WGLEW_GET_FUN(__wglewDeleteAssociatedContextAMD) -#define wglGetContextGPUIDAMD WGLEW_GET_FUN(__wglewGetContextGPUIDAMD) -#define wglGetCurrentAssociatedContextAMD WGLEW_GET_FUN(__wglewGetCurrentAssociatedContextAMD) -#define wglGetGPUIDsAMD WGLEW_GET_FUN(__wglewGetGPUIDsAMD) -#define wglGetGPUInfoAMD WGLEW_GET_FUN(__wglewGetGPUInfoAMD) -#define wglMakeAssociatedContextCurrentAMD WGLEW_GET_FUN(__wglewMakeAssociatedContextCurrentAMD) - -#define WGLEW_AMD_gpu_association WGLEW_GET_VAR(__WGLEW_AMD_gpu_association) - -#endif /* WGL_AMD_gpu_association */ - -/* ------------------------- WGL_ARB_buffer_region ------------------------- */ - -#ifndef WGL_ARB_buffer_region -#define WGL_ARB_buffer_region 1 - -#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001 -#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002 -#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004 -#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008 - -typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType); -typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion); -typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); -typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height); - -#define wglCreateBufferRegionARB WGLEW_GET_FUN(__wglewCreateBufferRegionARB) -#define wglDeleteBufferRegionARB WGLEW_GET_FUN(__wglewDeleteBufferRegionARB) -#define wglRestoreBufferRegionARB WGLEW_GET_FUN(__wglewRestoreBufferRegionARB) -#define wglSaveBufferRegionARB WGLEW_GET_FUN(__wglewSaveBufferRegionARB) - -#define WGLEW_ARB_buffer_region WGLEW_GET_VAR(__WGLEW_ARB_buffer_region) - -#endif /* WGL_ARB_buffer_region */ - -/* --------------------- WGL_ARB_context_flush_control --------------------- */ - -#ifndef WGL_ARB_context_flush_control -#define WGL_ARB_context_flush_control 1 - -#define WGL_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB 0 -#define WGL_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097 -#define WGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB 0x2098 - -#define WGLEW_ARB_context_flush_control WGLEW_GET_VAR(__WGLEW_ARB_context_flush_control) - -#endif /* WGL_ARB_context_flush_control */ - -/* ------------------------- WGL_ARB_create_context ------------------------ */ - -#ifndef WGL_ARB_create_context -#define WGL_ARB_create_context 1 - -#define WGL_CONTEXT_DEBUG_BIT_ARB 0x00000001 -#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002 -#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 -#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 -#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 -#define WGL_CONTEXT_FLAGS_ARB 0x2094 -#define ERROR_INVALID_VERSION_ARB 0x2095 - -typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int* attribList); - -#define wglCreateContextAttribsARB WGLEW_GET_FUN(__wglewCreateContextAttribsARB) - -#define WGLEW_ARB_create_context WGLEW_GET_VAR(__WGLEW_ARB_create_context) - -#endif /* WGL_ARB_create_context */ - -/* -------------------- WGL_ARB_create_context_no_error -------------------- */ - -#ifndef WGL_ARB_create_context_no_error -#define WGL_ARB_create_context_no_error 1 - -#define WGL_CONTEXT_OPENGL_NO_ERROR_ARB 0x31B3 - -#define WGLEW_ARB_create_context_no_error WGLEW_GET_VAR(__WGLEW_ARB_create_context_no_error) - -#endif /* WGL_ARB_create_context_no_error */ - -/* --------------------- WGL_ARB_create_context_profile -------------------- */ - -#ifndef WGL_ARB_create_context_profile -#define WGL_ARB_create_context_profile 1 - -#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 -#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 -#define ERROR_INVALID_PROFILE_ARB 0x2096 -#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 - -#define WGLEW_ARB_create_context_profile WGLEW_GET_VAR(__WGLEW_ARB_create_context_profile) - -#endif /* WGL_ARB_create_context_profile */ - -/* ------------------- WGL_ARB_create_context_robustness ------------------- */ - -#ifndef WGL_ARB_create_context_robustness -#define WGL_ARB_create_context_robustness 1 - -#define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 -#define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 -#define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 -#define WGL_NO_RESET_NOTIFICATION_ARB 0x8261 - -#define WGLEW_ARB_create_context_robustness WGLEW_GET_VAR(__WGLEW_ARB_create_context_robustness) - -#endif /* WGL_ARB_create_context_robustness */ - -/* ----------------------- WGL_ARB_extensions_string ----------------------- */ - -#ifndef WGL_ARB_extensions_string -#define WGL_ARB_extensions_string 1 - -typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); - -#define wglGetExtensionsStringARB WGLEW_GET_FUN(__wglewGetExtensionsStringARB) - -#define WGLEW_ARB_extensions_string WGLEW_GET_VAR(__WGLEW_ARB_extensions_string) - -#endif /* WGL_ARB_extensions_string */ - -/* ------------------------ WGL_ARB_framebuffer_sRGB ----------------------- */ - -#ifndef WGL_ARB_framebuffer_sRGB -#define WGL_ARB_framebuffer_sRGB 1 - -#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9 - -#define WGLEW_ARB_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_ARB_framebuffer_sRGB) - -#endif /* WGL_ARB_framebuffer_sRGB */ - -/* ----------------------- WGL_ARB_make_current_read ----------------------- */ - -#ifndef WGL_ARB_make_current_read -#define WGL_ARB_make_current_read 1 - -#define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 -#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 - -typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (void); -typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); - -#define wglGetCurrentReadDCARB WGLEW_GET_FUN(__wglewGetCurrentReadDCARB) -#define wglMakeContextCurrentARB WGLEW_GET_FUN(__wglewMakeContextCurrentARB) - -#define WGLEW_ARB_make_current_read WGLEW_GET_VAR(__WGLEW_ARB_make_current_read) - -#endif /* WGL_ARB_make_current_read */ - -/* -------------------------- WGL_ARB_multisample -------------------------- */ - -#ifndef WGL_ARB_multisample -#define WGL_ARB_multisample 1 - -#define WGL_SAMPLE_BUFFERS_ARB 0x2041 -#define WGL_SAMPLES_ARB 0x2042 - -#define WGLEW_ARB_multisample WGLEW_GET_VAR(__WGLEW_ARB_multisample) - -#endif /* WGL_ARB_multisample */ - -/* ---------------------------- WGL_ARB_pbuffer ---------------------------- */ - -#ifndef WGL_ARB_pbuffer -#define WGL_ARB_pbuffer 1 - -#define WGL_DRAW_TO_PBUFFER_ARB 0x202D -#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E -#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F -#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 -#define WGL_PBUFFER_LARGEST_ARB 0x2033 -#define WGL_PBUFFER_WIDTH_ARB 0x2034 -#define WGL_PBUFFER_HEIGHT_ARB 0x2035 -#define WGL_PBUFFER_LOST_ARB 0x2036 - -DECLARE_HANDLE(HPBUFFERARB); - -typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); -typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); -typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); -typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int* piValue); -typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); - -#define wglCreatePbufferARB WGLEW_GET_FUN(__wglewCreatePbufferARB) -#define wglDestroyPbufferARB WGLEW_GET_FUN(__wglewDestroyPbufferARB) -#define wglGetPbufferDCARB WGLEW_GET_FUN(__wglewGetPbufferDCARB) -#define wglQueryPbufferARB WGLEW_GET_FUN(__wglewQueryPbufferARB) -#define wglReleasePbufferDCARB WGLEW_GET_FUN(__wglewReleasePbufferDCARB) - -#define WGLEW_ARB_pbuffer WGLEW_GET_VAR(__WGLEW_ARB_pbuffer) - -#endif /* WGL_ARB_pbuffer */ - -/* -------------------------- WGL_ARB_pixel_format ------------------------- */ - -#ifndef WGL_ARB_pixel_format -#define WGL_ARB_pixel_format 1 - -#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 -#define WGL_DRAW_TO_WINDOW_ARB 0x2001 -#define WGL_DRAW_TO_BITMAP_ARB 0x2002 -#define WGL_ACCELERATION_ARB 0x2003 -#define WGL_NEED_PALETTE_ARB 0x2004 -#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 -#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 -#define WGL_SWAP_METHOD_ARB 0x2007 -#define WGL_NUMBER_OVERLAYS_ARB 0x2008 -#define WGL_NUMBER_UNDERLAYS_ARB 0x2009 -#define WGL_TRANSPARENT_ARB 0x200A -#define WGL_SHARE_DEPTH_ARB 0x200C -#define WGL_SHARE_STENCIL_ARB 0x200D -#define WGL_SHARE_ACCUM_ARB 0x200E -#define WGL_SUPPORT_GDI_ARB 0x200F -#define WGL_SUPPORT_OPENGL_ARB 0x2010 -#define WGL_DOUBLE_BUFFER_ARB 0x2011 -#define WGL_STEREO_ARB 0x2012 -#define WGL_PIXEL_TYPE_ARB 0x2013 -#define WGL_COLOR_BITS_ARB 0x2014 -#define WGL_RED_BITS_ARB 0x2015 -#define WGL_RED_SHIFT_ARB 0x2016 -#define WGL_GREEN_BITS_ARB 0x2017 -#define WGL_GREEN_SHIFT_ARB 0x2018 -#define WGL_BLUE_BITS_ARB 0x2019 -#define WGL_BLUE_SHIFT_ARB 0x201A -#define WGL_ALPHA_BITS_ARB 0x201B -#define WGL_ALPHA_SHIFT_ARB 0x201C -#define WGL_ACCUM_BITS_ARB 0x201D -#define WGL_ACCUM_RED_BITS_ARB 0x201E -#define WGL_ACCUM_GREEN_BITS_ARB 0x201F -#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 -#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 -#define WGL_DEPTH_BITS_ARB 0x2022 -#define WGL_STENCIL_BITS_ARB 0x2023 -#define WGL_AUX_BUFFERS_ARB 0x2024 -#define WGL_NO_ACCELERATION_ARB 0x2025 -#define WGL_GENERIC_ACCELERATION_ARB 0x2026 -#define WGL_FULL_ACCELERATION_ARB 0x2027 -#define WGL_SWAP_EXCHANGE_ARB 0x2028 -#define WGL_SWAP_COPY_ARB 0x2029 -#define WGL_SWAP_UNDEFINED_ARB 0x202A -#define WGL_TYPE_RGBA_ARB 0x202B -#define WGL_TYPE_COLORINDEX_ARB 0x202C -#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 -#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 -#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 -#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A -#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B - -typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int* piAttribIList, const FLOAT* pfAttribFList, UINT nMaxFormats, int* piFormats, UINT* nNumFormats); -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, FLOAT* pfValues); -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, int* piValues); - -#define wglChoosePixelFormatARB WGLEW_GET_FUN(__wglewChoosePixelFormatARB) -#define wglGetPixelFormatAttribfvARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvARB) -#define wglGetPixelFormatAttribivARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribivARB) - -#define WGLEW_ARB_pixel_format WGLEW_GET_VAR(__WGLEW_ARB_pixel_format) - -#endif /* WGL_ARB_pixel_format */ - -/* ----------------------- WGL_ARB_pixel_format_float ---------------------- */ - -#ifndef WGL_ARB_pixel_format_float -#define WGL_ARB_pixel_format_float 1 - -#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0 - -#define WGLEW_ARB_pixel_format_float WGLEW_GET_VAR(__WGLEW_ARB_pixel_format_float) - -#endif /* WGL_ARB_pixel_format_float */ - -/* ------------------------- WGL_ARB_render_texture ------------------------ */ - -#ifndef WGL_ARB_render_texture -#define WGL_ARB_render_texture 1 - -#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 -#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 -#define WGL_TEXTURE_FORMAT_ARB 0x2072 -#define WGL_TEXTURE_TARGET_ARB 0x2073 -#define WGL_MIPMAP_TEXTURE_ARB 0x2074 -#define WGL_TEXTURE_RGB_ARB 0x2075 -#define WGL_TEXTURE_RGBA_ARB 0x2076 -#define WGL_NO_TEXTURE_ARB 0x2077 -#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078 -#define WGL_TEXTURE_1D_ARB 0x2079 -#define WGL_TEXTURE_2D_ARB 0x207A -#define WGL_MIPMAP_LEVEL_ARB 0x207B -#define WGL_CUBE_MAP_FACE_ARB 0x207C -#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D -#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E -#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F -#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 -#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 -#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 -#define WGL_FRONT_LEFT_ARB 0x2083 -#define WGL_FRONT_RIGHT_ARB 0x2084 -#define WGL_BACK_LEFT_ARB 0x2085 -#define WGL_BACK_RIGHT_ARB 0x2086 -#define WGL_AUX0_ARB 0x2087 -#define WGL_AUX1_ARB 0x2088 -#define WGL_AUX2_ARB 0x2089 -#define WGL_AUX3_ARB 0x208A -#define WGL_AUX4_ARB 0x208B -#define WGL_AUX5_ARB 0x208C -#define WGL_AUX6_ARB 0x208D -#define WGL_AUX7_ARB 0x208E -#define WGL_AUX8_ARB 0x208F -#define WGL_AUX9_ARB 0x2090 - -typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); -typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); -typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int* piAttribList); - -#define wglBindTexImageARB WGLEW_GET_FUN(__wglewBindTexImageARB) -#define wglReleaseTexImageARB WGLEW_GET_FUN(__wglewReleaseTexImageARB) -#define wglSetPbufferAttribARB WGLEW_GET_FUN(__wglewSetPbufferAttribARB) - -#define WGLEW_ARB_render_texture WGLEW_GET_VAR(__WGLEW_ARB_render_texture) - -#endif /* WGL_ARB_render_texture */ - -/* ---------------- WGL_ARB_robustness_application_isolation --------------- */ - -#ifndef WGL_ARB_robustness_application_isolation -#define WGL_ARB_robustness_application_isolation 1 - -#define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 - -#define WGLEW_ARB_robustness_application_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_application_isolation) - -#endif /* WGL_ARB_robustness_application_isolation */ - -/* ---------------- WGL_ARB_robustness_share_group_isolation --------------- */ - -#ifndef WGL_ARB_robustness_share_group_isolation -#define WGL_ARB_robustness_share_group_isolation 1 - -#define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 - -#define WGLEW_ARB_robustness_share_group_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_share_group_isolation) - -#endif /* WGL_ARB_robustness_share_group_isolation */ - -/* ----------------------- WGL_ATI_pixel_format_float ---------------------- */ - -#ifndef WGL_ATI_pixel_format_float -#define WGL_ATI_pixel_format_float 1 - -#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0 -#define GL_RGBA_FLOAT_MODE_ATI 0x8820 -#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 - -#define WGLEW_ATI_pixel_format_float WGLEW_GET_VAR(__WGLEW_ATI_pixel_format_float) - -#endif /* WGL_ATI_pixel_format_float */ - -/* -------------------- WGL_ATI_render_texture_rectangle ------------------- */ - -#ifndef WGL_ATI_render_texture_rectangle -#define WGL_ATI_render_texture_rectangle 1 - -#define WGL_TEXTURE_RECTANGLE_ATI 0x21A5 - -#define WGLEW_ATI_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_ATI_render_texture_rectangle) - -#endif /* WGL_ATI_render_texture_rectangle */ - -/* --------------------------- WGL_EXT_colorspace -------------------------- */ - -#ifndef WGL_EXT_colorspace -#define WGL_EXT_colorspace 1 - -#define WGL_COLORSPACE_SRGB_EXT 0x3089 -#define WGL_COLORSPACE_LINEAR_EXT 0x308A -#define WGL_COLORSPACE_EXT 0x309D - -#define WGLEW_EXT_colorspace WGLEW_GET_VAR(__WGLEW_EXT_colorspace) - -#endif /* WGL_EXT_colorspace */ - -/* ------------------- WGL_EXT_create_context_es2_profile ------------------ */ - -#ifndef WGL_EXT_create_context_es2_profile -#define WGL_EXT_create_context_es2_profile 1 - -#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 - -#define WGLEW_EXT_create_context_es2_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es2_profile) - -#endif /* WGL_EXT_create_context_es2_profile */ - -/* ------------------- WGL_EXT_create_context_es_profile ------------------- */ - -#ifndef WGL_EXT_create_context_es_profile -#define WGL_EXT_create_context_es_profile 1 - -#define WGL_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004 - -#define WGLEW_EXT_create_context_es_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es_profile) - -#endif /* WGL_EXT_create_context_es_profile */ - -/* -------------------------- WGL_EXT_depth_float -------------------------- */ - -#ifndef WGL_EXT_depth_float -#define WGL_EXT_depth_float 1 - -#define WGL_DEPTH_FLOAT_EXT 0x2040 - -#define WGLEW_EXT_depth_float WGLEW_GET_VAR(__WGLEW_EXT_depth_float) - -#endif /* WGL_EXT_depth_float */ - -/* ---------------------- WGL_EXT_display_color_table ---------------------- */ - -#ifndef WGL_EXT_display_color_table -#define WGL_EXT_display_color_table 1 - -typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id); -typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id); -typedef VOID (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id); -typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (const GLushort* table, GLuint length); - -#define wglBindDisplayColorTableEXT WGLEW_GET_FUN(__wglewBindDisplayColorTableEXT) -#define wglCreateDisplayColorTableEXT WGLEW_GET_FUN(__wglewCreateDisplayColorTableEXT) -#define wglDestroyDisplayColorTableEXT WGLEW_GET_FUN(__wglewDestroyDisplayColorTableEXT) -#define wglLoadDisplayColorTableEXT WGLEW_GET_FUN(__wglewLoadDisplayColorTableEXT) - -#define WGLEW_EXT_display_color_table WGLEW_GET_VAR(__WGLEW_EXT_display_color_table) - -#endif /* WGL_EXT_display_color_table */ - -/* ----------------------- WGL_EXT_extensions_string ----------------------- */ - -#ifndef WGL_EXT_extensions_string -#define WGL_EXT_extensions_string 1 - -typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void); - -#define wglGetExtensionsStringEXT WGLEW_GET_FUN(__wglewGetExtensionsStringEXT) - -#define WGLEW_EXT_extensions_string WGLEW_GET_VAR(__WGLEW_EXT_extensions_string) - -#endif /* WGL_EXT_extensions_string */ - -/* ------------------------ WGL_EXT_framebuffer_sRGB ----------------------- */ - -#ifndef WGL_EXT_framebuffer_sRGB -#define WGL_EXT_framebuffer_sRGB 1 - -#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9 - -#define WGLEW_EXT_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_EXT_framebuffer_sRGB) - -#endif /* WGL_EXT_framebuffer_sRGB */ - -/* ----------------------- WGL_EXT_make_current_read ----------------------- */ - -#ifndef WGL_EXT_make_current_read -#define WGL_EXT_make_current_read 1 - -#define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043 - -typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (void); -typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); - -#define wglGetCurrentReadDCEXT WGLEW_GET_FUN(__wglewGetCurrentReadDCEXT) -#define wglMakeContextCurrentEXT WGLEW_GET_FUN(__wglewMakeContextCurrentEXT) - -#define WGLEW_EXT_make_current_read WGLEW_GET_VAR(__WGLEW_EXT_make_current_read) - -#endif /* WGL_EXT_make_current_read */ - -/* -------------------------- WGL_EXT_multisample -------------------------- */ - -#ifndef WGL_EXT_multisample -#define WGL_EXT_multisample 1 - -#define WGL_SAMPLE_BUFFERS_EXT 0x2041 -#define WGL_SAMPLES_EXT 0x2042 - -#define WGLEW_EXT_multisample WGLEW_GET_VAR(__WGLEW_EXT_multisample) - -#endif /* WGL_EXT_multisample */ - -/* ---------------------------- WGL_EXT_pbuffer ---------------------------- */ - -#ifndef WGL_EXT_pbuffer -#define WGL_EXT_pbuffer 1 - -#define WGL_DRAW_TO_PBUFFER_EXT 0x202D -#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E -#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F -#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030 -#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031 -#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032 -#define WGL_PBUFFER_LARGEST_EXT 0x2033 -#define WGL_PBUFFER_WIDTH_EXT 0x2034 -#define WGL_PBUFFER_HEIGHT_EXT 0x2035 - -DECLARE_HANDLE(HPBUFFEREXT); - -typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); -typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer); -typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer); -typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int* piValue); -typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC); - -#define wglCreatePbufferEXT WGLEW_GET_FUN(__wglewCreatePbufferEXT) -#define wglDestroyPbufferEXT WGLEW_GET_FUN(__wglewDestroyPbufferEXT) -#define wglGetPbufferDCEXT WGLEW_GET_FUN(__wglewGetPbufferDCEXT) -#define wglQueryPbufferEXT WGLEW_GET_FUN(__wglewQueryPbufferEXT) -#define wglReleasePbufferDCEXT WGLEW_GET_FUN(__wglewReleasePbufferDCEXT) - -#define WGLEW_EXT_pbuffer WGLEW_GET_VAR(__WGLEW_EXT_pbuffer) - -#endif /* WGL_EXT_pbuffer */ - -/* -------------------------- WGL_EXT_pixel_format ------------------------- */ - -#ifndef WGL_EXT_pixel_format -#define WGL_EXT_pixel_format 1 - -#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000 -#define WGL_DRAW_TO_WINDOW_EXT 0x2001 -#define WGL_DRAW_TO_BITMAP_EXT 0x2002 -#define WGL_ACCELERATION_EXT 0x2003 -#define WGL_NEED_PALETTE_EXT 0x2004 -#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005 -#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006 -#define WGL_SWAP_METHOD_EXT 0x2007 -#define WGL_NUMBER_OVERLAYS_EXT 0x2008 -#define WGL_NUMBER_UNDERLAYS_EXT 0x2009 -#define WGL_TRANSPARENT_EXT 0x200A -#define WGL_TRANSPARENT_VALUE_EXT 0x200B -#define WGL_SHARE_DEPTH_EXT 0x200C -#define WGL_SHARE_STENCIL_EXT 0x200D -#define WGL_SHARE_ACCUM_EXT 0x200E -#define WGL_SUPPORT_GDI_EXT 0x200F -#define WGL_SUPPORT_OPENGL_EXT 0x2010 -#define WGL_DOUBLE_BUFFER_EXT 0x2011 -#define WGL_STEREO_EXT 0x2012 -#define WGL_PIXEL_TYPE_EXT 0x2013 -#define WGL_COLOR_BITS_EXT 0x2014 -#define WGL_RED_BITS_EXT 0x2015 -#define WGL_RED_SHIFT_EXT 0x2016 -#define WGL_GREEN_BITS_EXT 0x2017 -#define WGL_GREEN_SHIFT_EXT 0x2018 -#define WGL_BLUE_BITS_EXT 0x2019 -#define WGL_BLUE_SHIFT_EXT 0x201A -#define WGL_ALPHA_BITS_EXT 0x201B -#define WGL_ALPHA_SHIFT_EXT 0x201C -#define WGL_ACCUM_BITS_EXT 0x201D -#define WGL_ACCUM_RED_BITS_EXT 0x201E -#define WGL_ACCUM_GREEN_BITS_EXT 0x201F -#define WGL_ACCUM_BLUE_BITS_EXT 0x2020 -#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021 -#define WGL_DEPTH_BITS_EXT 0x2022 -#define WGL_STENCIL_BITS_EXT 0x2023 -#define WGL_AUX_BUFFERS_EXT 0x2024 -#define WGL_NO_ACCELERATION_EXT 0x2025 -#define WGL_GENERIC_ACCELERATION_EXT 0x2026 -#define WGL_FULL_ACCELERATION_EXT 0x2027 -#define WGL_SWAP_EXCHANGE_EXT 0x2028 -#define WGL_SWAP_COPY_EXT 0x2029 -#define WGL_SWAP_UNDEFINED_EXT 0x202A -#define WGL_TYPE_RGBA_EXT 0x202B -#define WGL_TYPE_COLORINDEX_EXT 0x202C - -typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int* piAttribIList, const FLOAT* pfAttribFList, UINT nMaxFormats, int* piFormats, UINT* nNumFormats); -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, FLOAT* pfValues); -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, int* piValues); - -#define wglChoosePixelFormatEXT WGLEW_GET_FUN(__wglewChoosePixelFormatEXT) -#define wglGetPixelFormatAttribfvEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvEXT) -#define wglGetPixelFormatAttribivEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribivEXT) - -#define WGLEW_EXT_pixel_format WGLEW_GET_VAR(__WGLEW_EXT_pixel_format) - -#endif /* WGL_EXT_pixel_format */ - -/* ------------------- WGL_EXT_pixel_format_packed_float ------------------- */ - -#ifndef WGL_EXT_pixel_format_packed_float -#define WGL_EXT_pixel_format_packed_float 1 - -#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8 - -#define WGLEW_EXT_pixel_format_packed_float WGLEW_GET_VAR(__WGLEW_EXT_pixel_format_packed_float) - -#endif /* WGL_EXT_pixel_format_packed_float */ - -/* -------------------------- WGL_EXT_swap_control ------------------------- */ - -#ifndef WGL_EXT_swap_control -#define WGL_EXT_swap_control 1 - -typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void); -typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); - -#define wglGetSwapIntervalEXT WGLEW_GET_FUN(__wglewGetSwapIntervalEXT) -#define wglSwapIntervalEXT WGLEW_GET_FUN(__wglewSwapIntervalEXT) - -#define WGLEW_EXT_swap_control WGLEW_GET_VAR(__WGLEW_EXT_swap_control) - -#endif /* WGL_EXT_swap_control */ - -/* ----------------------- WGL_EXT_swap_control_tear ----------------------- */ - -#ifndef WGL_EXT_swap_control_tear -#define WGL_EXT_swap_control_tear 1 - -#define WGLEW_EXT_swap_control_tear WGLEW_GET_VAR(__WGLEW_EXT_swap_control_tear) - -#endif /* WGL_EXT_swap_control_tear */ - -/* --------------------- WGL_I3D_digital_video_control --------------------- */ - -#ifndef WGL_I3D_digital_video_control -#define WGL_I3D_digital_video_control 1 - -#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050 -#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051 -#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052 -#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053 - -typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); -typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); - -#define wglGetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewGetDigitalVideoParametersI3D) -#define wglSetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewSetDigitalVideoParametersI3D) - -#define WGLEW_I3D_digital_video_control WGLEW_GET_VAR(__WGLEW_I3D_digital_video_control) - -#endif /* WGL_I3D_digital_video_control */ - -/* ----------------------------- WGL_I3D_gamma ----------------------------- */ - -#ifndef WGL_I3D_gamma -#define WGL_I3D_gamma 1 - -#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E -#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F - -typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT* puRed, USHORT* puGreen, USHORT* puBlue); -typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); -typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT* puRed, const USHORT* puGreen, const USHORT* puBlue); -typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); - -#define wglGetGammaTableI3D WGLEW_GET_FUN(__wglewGetGammaTableI3D) -#define wglGetGammaTableParametersI3D WGLEW_GET_FUN(__wglewGetGammaTableParametersI3D) -#define wglSetGammaTableI3D WGLEW_GET_FUN(__wglewSetGammaTableI3D) -#define wglSetGammaTableParametersI3D WGLEW_GET_FUN(__wglewSetGammaTableParametersI3D) - -#define WGLEW_I3D_gamma WGLEW_GET_VAR(__WGLEW_I3D_gamma) - -#endif /* WGL_I3D_gamma */ - -/* ---------------------------- WGL_I3D_genlock ---------------------------- */ - -#ifndef WGL_I3D_genlock -#define WGL_I3D_genlock 1 - -#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044 -#define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045 -#define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046 -#define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047 -#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048 -#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049 -#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A -#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B -#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C - -typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC); -typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC); -typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate); -typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay); -typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge); -typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource); -typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT* uRate); -typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT* uDelay); -typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT* uEdge); -typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT* uSource); -typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL* pFlag); -typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT* uMaxLineDelay, UINT* uMaxPixelDelay); - -#define wglDisableGenlockI3D WGLEW_GET_FUN(__wglewDisableGenlockI3D) -#define wglEnableGenlockI3D WGLEW_GET_FUN(__wglewEnableGenlockI3D) -#define wglGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGenlockSampleRateI3D) -#define wglGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGenlockSourceDelayI3D) -#define wglGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGenlockSourceEdgeI3D) -#define wglGenlockSourceI3D WGLEW_GET_FUN(__wglewGenlockSourceI3D) -#define wglGetGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGetGenlockSampleRateI3D) -#define wglGetGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGetGenlockSourceDelayI3D) -#define wglGetGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGetGenlockSourceEdgeI3D) -#define wglGetGenlockSourceI3D WGLEW_GET_FUN(__wglewGetGenlockSourceI3D) -#define wglIsEnabledGenlockI3D WGLEW_GET_FUN(__wglewIsEnabledGenlockI3D) -#define wglQueryGenlockMaxSourceDelayI3D WGLEW_GET_FUN(__wglewQueryGenlockMaxSourceDelayI3D) - -#define WGLEW_I3D_genlock WGLEW_GET_VAR(__WGLEW_I3D_genlock) - -#endif /* WGL_I3D_genlock */ - -/* -------------------------- WGL_I3D_image_buffer ------------------------- */ - -#ifndef WGL_I3D_image_buffer -#define WGL_I3D_image_buffer 1 - -#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001 -#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002 - -typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hDC, const HANDLE* pEvent, const LPVOID* pAddress, const DWORD* pSize, UINT count); -typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags); -typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress); -typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hDC, const LPVOID* pAddress, UINT count); - -#define wglAssociateImageBufferEventsI3D WGLEW_GET_FUN(__wglewAssociateImageBufferEventsI3D) -#define wglCreateImageBufferI3D WGLEW_GET_FUN(__wglewCreateImageBufferI3D) -#define wglDestroyImageBufferI3D WGLEW_GET_FUN(__wglewDestroyImageBufferI3D) -#define wglReleaseImageBufferEventsI3D WGLEW_GET_FUN(__wglewReleaseImageBufferEventsI3D) - -#define WGLEW_I3D_image_buffer WGLEW_GET_VAR(__WGLEW_I3D_image_buffer) - -#endif /* WGL_I3D_image_buffer */ - -/* ------------------------ WGL_I3D_swap_frame_lock ------------------------ */ - -#ifndef WGL_I3D_swap_frame_lock -#define WGL_I3D_swap_frame_lock 1 - -typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (void); -typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (void); -typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL* pFlag); -typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL* pFlag); - -#define wglDisableFrameLockI3D WGLEW_GET_FUN(__wglewDisableFrameLockI3D) -#define wglEnableFrameLockI3D WGLEW_GET_FUN(__wglewEnableFrameLockI3D) -#define wglIsEnabledFrameLockI3D WGLEW_GET_FUN(__wglewIsEnabledFrameLockI3D) -#define wglQueryFrameLockMasterI3D WGLEW_GET_FUN(__wglewQueryFrameLockMasterI3D) - -#define WGLEW_I3D_swap_frame_lock WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_lock) - -#endif /* WGL_I3D_swap_frame_lock */ - -/* ------------------------ WGL_I3D_swap_frame_usage ----------------------- */ - -#ifndef WGL_I3D_swap_frame_usage -#define WGL_I3D_swap_frame_usage 1 - -typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void); -typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void); -typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float* pUsage); -typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD* pFrameCount, DWORD* pMissedFrames, float* pLastMissedUsage); - -#define wglBeginFrameTrackingI3D WGLEW_GET_FUN(__wglewBeginFrameTrackingI3D) -#define wglEndFrameTrackingI3D WGLEW_GET_FUN(__wglewEndFrameTrackingI3D) -#define wglGetFrameUsageI3D WGLEW_GET_FUN(__wglewGetFrameUsageI3D) -#define wglQueryFrameTrackingI3D WGLEW_GET_FUN(__wglewQueryFrameTrackingI3D) - -#define WGLEW_I3D_swap_frame_usage WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_usage) - -#endif /* WGL_I3D_swap_frame_usage */ - -/* --------------------------- WGL_NV_DX_interop --------------------------- */ - -#ifndef WGL_NV_DX_interop -#define WGL_NV_DX_interop 1 - -#define WGL_ACCESS_READ_ONLY_NV 0x00000000 -#define WGL_ACCESS_READ_WRITE_NV 0x00000001 -#define WGL_ACCESS_WRITE_DISCARD_NV 0x00000002 - -typedef BOOL (WINAPI * PFNWGLDXCLOSEDEVICENVPROC) (HANDLE hDevice); -typedef BOOL (WINAPI * PFNWGLDXLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects); -typedef BOOL (WINAPI * PFNWGLDXOBJECTACCESSNVPROC) (HANDLE hObject, GLenum access); -typedef HANDLE (WINAPI * PFNWGLDXOPENDEVICENVPROC) (void* dxDevice); -typedef HANDLE (WINAPI * PFNWGLDXREGISTEROBJECTNVPROC) (HANDLE hDevice, void* dxObject, GLuint name, GLenum type, GLenum access); -typedef BOOL (WINAPI * PFNWGLDXSETRESOURCESHAREHANDLENVPROC) (void* dxObject, HANDLE shareHandle); -typedef BOOL (WINAPI * PFNWGLDXUNLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects); -typedef BOOL (WINAPI * PFNWGLDXUNREGISTEROBJECTNVPROC) (HANDLE hDevice, HANDLE hObject); - -#define wglDXCloseDeviceNV WGLEW_GET_FUN(__wglewDXCloseDeviceNV) -#define wglDXLockObjectsNV WGLEW_GET_FUN(__wglewDXLockObjectsNV) -#define wglDXObjectAccessNV WGLEW_GET_FUN(__wglewDXObjectAccessNV) -#define wglDXOpenDeviceNV WGLEW_GET_FUN(__wglewDXOpenDeviceNV) -#define wglDXRegisterObjectNV WGLEW_GET_FUN(__wglewDXRegisterObjectNV) -#define wglDXSetResourceShareHandleNV WGLEW_GET_FUN(__wglewDXSetResourceShareHandleNV) -#define wglDXUnlockObjectsNV WGLEW_GET_FUN(__wglewDXUnlockObjectsNV) -#define wglDXUnregisterObjectNV WGLEW_GET_FUN(__wglewDXUnregisterObjectNV) - -#define WGLEW_NV_DX_interop WGLEW_GET_VAR(__WGLEW_NV_DX_interop) - -#endif /* WGL_NV_DX_interop */ - -/* --------------------------- WGL_NV_DX_interop2 -------------------------- */ - -#ifndef WGL_NV_DX_interop2 -#define WGL_NV_DX_interop2 1 - -#define WGLEW_NV_DX_interop2 WGLEW_GET_VAR(__WGLEW_NV_DX_interop2) - -#endif /* WGL_NV_DX_interop2 */ - -/* --------------------------- WGL_NV_copy_image --------------------------- */ - -#ifndef WGL_NV_copy_image -#define WGL_NV_copy_image 1 - -typedef BOOL (WINAPI * PFNWGLCOPYIMAGESUBDATANVPROC) (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); - -#define wglCopyImageSubDataNV WGLEW_GET_FUN(__wglewCopyImageSubDataNV) - -#define WGLEW_NV_copy_image WGLEW_GET_VAR(__WGLEW_NV_copy_image) - -#endif /* WGL_NV_copy_image */ - -/* ------------------------ WGL_NV_delay_before_swap ----------------------- */ - -#ifndef WGL_NV_delay_before_swap -#define WGL_NV_delay_before_swap 1 - -typedef BOOL (WINAPI * PFNWGLDELAYBEFORESWAPNVPROC) (HDC hDC, GLfloat seconds); - -#define wglDelayBeforeSwapNV WGLEW_GET_FUN(__wglewDelayBeforeSwapNV) - -#define WGLEW_NV_delay_before_swap WGLEW_GET_VAR(__WGLEW_NV_delay_before_swap) - -#endif /* WGL_NV_delay_before_swap */ - -/* -------------------------- WGL_NV_float_buffer -------------------------- */ - -#ifndef WGL_NV_float_buffer -#define WGL_NV_float_buffer 1 - -#define WGL_FLOAT_COMPONENTS_NV 0x20B0 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4 -#define WGL_TEXTURE_FLOAT_R_NV 0x20B5 -#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6 -#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7 -#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8 - -#define WGLEW_NV_float_buffer WGLEW_GET_VAR(__WGLEW_NV_float_buffer) - -#endif /* WGL_NV_float_buffer */ - -/* -------------------------- WGL_NV_gpu_affinity -------------------------- */ - -#ifndef WGL_NV_gpu_affinity -#define WGL_NV_gpu_affinity 1 - -#define WGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0 -#define WGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1 - -DECLARE_HANDLE(HGPUNV); -typedef struct _GPU_DEVICE { - DWORD cb; - CHAR DeviceName[32]; - CHAR DeviceString[128]; - DWORD Flags; - RECT rcVirtualScreen; -} GPU_DEVICE, *PGPU_DEVICE; - -typedef HDC (WINAPI * PFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV *phGpuList); -typedef BOOL (WINAPI * PFNWGLDELETEDCNVPROC) (HDC hdc); -typedef BOOL (WINAPI * PFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice); -typedef BOOL (WINAPI * PFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu); -typedef BOOL (WINAPI * PFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV *phGpu); - -#define wglCreateAffinityDCNV WGLEW_GET_FUN(__wglewCreateAffinityDCNV) -#define wglDeleteDCNV WGLEW_GET_FUN(__wglewDeleteDCNV) -#define wglEnumGpuDevicesNV WGLEW_GET_FUN(__wglewEnumGpuDevicesNV) -#define wglEnumGpusFromAffinityDCNV WGLEW_GET_FUN(__wglewEnumGpusFromAffinityDCNV) -#define wglEnumGpusNV WGLEW_GET_FUN(__wglewEnumGpusNV) - -#define WGLEW_NV_gpu_affinity WGLEW_GET_VAR(__WGLEW_NV_gpu_affinity) - -#endif /* WGL_NV_gpu_affinity */ - -/* ------------------------ WGL_NV_multigpu_context ------------------------ */ - -#ifndef WGL_NV_multigpu_context -#define WGL_NV_multigpu_context 1 - -#define WGL_CONTEXT_MULTIGPU_ATTRIB_NV 0x20AA -#define WGL_CONTEXT_MULTIGPU_ATTRIB_SINGLE_NV 0x20AB -#define WGL_CONTEXT_MULTIGPU_ATTRIB_AFR_NV 0x20AC -#define WGL_CONTEXT_MULTIGPU_ATTRIB_MULTICAST_NV 0x20AD -#define WGL_CONTEXT_MULTIGPU_ATTRIB_MULTI_DISPLAY_MULTICAST_NV 0x20AE - -#define WGLEW_NV_multigpu_context WGLEW_GET_VAR(__WGLEW_NV_multigpu_context) - -#endif /* WGL_NV_multigpu_context */ - -/* ---------------------- WGL_NV_multisample_coverage ---------------------- */ - -#ifndef WGL_NV_multisample_coverage -#define WGL_NV_multisample_coverage 1 - -#define WGL_COVERAGE_SAMPLES_NV 0x2042 -#define WGL_COLOR_SAMPLES_NV 0x20B9 - -#define WGLEW_NV_multisample_coverage WGLEW_GET_VAR(__WGLEW_NV_multisample_coverage) - -#endif /* WGL_NV_multisample_coverage */ - -/* -------------------------- WGL_NV_present_video ------------------------- */ - -#ifndef WGL_NV_present_video -#define WGL_NV_present_video 1 - -#define WGL_NUM_VIDEO_SLOTS_NV 0x20F0 - -DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV); - -typedef BOOL (WINAPI * PFNWGLBINDVIDEODEVICENVPROC) (HDC hDc, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int* piAttribList); -typedef int (WINAPI * PFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDc, HVIDEOOUTPUTDEVICENV* phDeviceList); -typedef BOOL (WINAPI * PFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int* piValue); - -#define wglBindVideoDeviceNV WGLEW_GET_FUN(__wglewBindVideoDeviceNV) -#define wglEnumerateVideoDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoDevicesNV) -#define wglQueryCurrentContextNV WGLEW_GET_FUN(__wglewQueryCurrentContextNV) - -#define WGLEW_NV_present_video WGLEW_GET_VAR(__WGLEW_NV_present_video) - -#endif /* WGL_NV_present_video */ - -/* ---------------------- WGL_NV_render_depth_texture ---------------------- */ - -#ifndef WGL_NV_render_depth_texture -#define WGL_NV_render_depth_texture 1 - -#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 -#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 -#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 -#define WGL_DEPTH_COMPONENT_NV 0x20A7 - -#define WGLEW_NV_render_depth_texture WGLEW_GET_VAR(__WGLEW_NV_render_depth_texture) - -#endif /* WGL_NV_render_depth_texture */ - -/* -------------------- WGL_NV_render_texture_rectangle -------------------- */ - -#ifndef WGL_NV_render_texture_rectangle -#define WGL_NV_render_texture_rectangle 1 - -#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1 -#define WGL_TEXTURE_RECTANGLE_NV 0x20A2 - -#define WGLEW_NV_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_NV_render_texture_rectangle) - -#endif /* WGL_NV_render_texture_rectangle */ - -/* --------------------------- WGL_NV_swap_group --------------------------- */ - -#ifndef WGL_NV_swap_group -#define WGL_NV_swap_group 1 - -typedef BOOL (WINAPI * PFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier); -typedef BOOL (WINAPI * PFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group); -typedef BOOL (WINAPI * PFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint* count); -typedef BOOL (WINAPI * PFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint* maxGroups, GLuint* maxBarriers); -typedef BOOL (WINAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint* group, GLuint* barrier); -typedef BOOL (WINAPI * PFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC); - -#define wglBindSwapBarrierNV WGLEW_GET_FUN(__wglewBindSwapBarrierNV) -#define wglJoinSwapGroupNV WGLEW_GET_FUN(__wglewJoinSwapGroupNV) -#define wglQueryFrameCountNV WGLEW_GET_FUN(__wglewQueryFrameCountNV) -#define wglQueryMaxSwapGroupsNV WGLEW_GET_FUN(__wglewQueryMaxSwapGroupsNV) -#define wglQuerySwapGroupNV WGLEW_GET_FUN(__wglewQuerySwapGroupNV) -#define wglResetFrameCountNV WGLEW_GET_FUN(__wglewResetFrameCountNV) - -#define WGLEW_NV_swap_group WGLEW_GET_VAR(__WGLEW_NV_swap_group) - -#endif /* WGL_NV_swap_group */ - -/* ----------------------- WGL_NV_vertex_array_range ----------------------- */ - -#ifndef WGL_NV_vertex_array_range -#define WGL_NV_vertex_array_range 1 - -typedef void* (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority); -typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void* pointer); - -#define wglAllocateMemoryNV WGLEW_GET_FUN(__wglewAllocateMemoryNV) -#define wglFreeMemoryNV WGLEW_GET_FUN(__wglewFreeMemoryNV) - -#define WGLEW_NV_vertex_array_range WGLEW_GET_VAR(__WGLEW_NV_vertex_array_range) - -#endif /* WGL_NV_vertex_array_range */ - -/* -------------------------- WGL_NV_video_capture ------------------------- */ - -#ifndef WGL_NV_video_capture -#define WGL_NV_video_capture 1 - -#define WGL_UNIQUE_ID_NV 0x20CE -#define WGL_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF - -DECLARE_HANDLE(HVIDEOINPUTDEVICENV); - -typedef BOOL (WINAPI * PFNWGLBINDVIDEOCAPTUREDEVICENVPROC) (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice); -typedef UINT (WINAPI * PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC) (HDC hDc, HVIDEOINPUTDEVICENV* phDeviceList); -typedef BOOL (WINAPI * PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); -typedef BOOL (WINAPI * PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int* piValue); -typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); - -#define wglBindVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewBindVideoCaptureDeviceNV) -#define wglEnumerateVideoCaptureDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoCaptureDevicesNV) -#define wglLockVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewLockVideoCaptureDeviceNV) -#define wglQueryVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewQueryVideoCaptureDeviceNV) -#define wglReleaseVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoCaptureDeviceNV) - -#define WGLEW_NV_video_capture WGLEW_GET_VAR(__WGLEW_NV_video_capture) - -#endif /* WGL_NV_video_capture */ - -/* -------------------------- WGL_NV_video_output -------------------------- */ - -#ifndef WGL_NV_video_output -#define WGL_NV_video_output 1 - -#define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0 -#define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1 -#define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2 -#define WGL_VIDEO_OUT_COLOR_NV 0x20C3 -#define WGL_VIDEO_OUT_ALPHA_NV 0x20C4 -#define WGL_VIDEO_OUT_DEPTH_NV 0x20C5 -#define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 -#define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 -#define WGL_VIDEO_OUT_FRAME 0x20C8 -#define WGL_VIDEO_OUT_FIELD_1 0x20C9 -#define WGL_VIDEO_OUT_FIELD_2 0x20CA -#define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB -#define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC - -DECLARE_HANDLE(HPVIDEODEV); - -typedef BOOL (WINAPI * PFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer); -typedef BOOL (WINAPI * PFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV* hVideoDevice); -typedef BOOL (WINAPI * PFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long* pulCounterOutputPbuffer, unsigned long* pulCounterOutputVideo); -typedef BOOL (WINAPI * PFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice); -typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer); -typedef BOOL (WINAPI * PFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long* pulCounterPbuffer, BOOL bBlock); - -#define wglBindVideoImageNV WGLEW_GET_FUN(__wglewBindVideoImageNV) -#define wglGetVideoDeviceNV WGLEW_GET_FUN(__wglewGetVideoDeviceNV) -#define wglGetVideoInfoNV WGLEW_GET_FUN(__wglewGetVideoInfoNV) -#define wglReleaseVideoDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoDeviceNV) -#define wglReleaseVideoImageNV WGLEW_GET_FUN(__wglewReleaseVideoImageNV) -#define wglSendPbufferToVideoNV WGLEW_GET_FUN(__wglewSendPbufferToVideoNV) - -#define WGLEW_NV_video_output WGLEW_GET_VAR(__WGLEW_NV_video_output) - -#endif /* WGL_NV_video_output */ - -/* -------------------------- WGL_OML_sync_control ------------------------- */ - -#ifndef WGL_OML_sync_control -#define WGL_OML_sync_control 1 - -typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32* numerator, INT32* denominator); -typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64* ust, INT64* msc, INT64* sbc); -typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); -typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); -typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64* ust, INT64* msc, INT64* sbc); -typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64* ust, INT64* msc, INT64* sbc); - -#define wglGetMscRateOML WGLEW_GET_FUN(__wglewGetMscRateOML) -#define wglGetSyncValuesOML WGLEW_GET_FUN(__wglewGetSyncValuesOML) -#define wglSwapBuffersMscOML WGLEW_GET_FUN(__wglewSwapBuffersMscOML) -#define wglSwapLayerBuffersMscOML WGLEW_GET_FUN(__wglewSwapLayerBuffersMscOML) -#define wglWaitForMscOML WGLEW_GET_FUN(__wglewWaitForMscOML) -#define wglWaitForSbcOML WGLEW_GET_FUN(__wglewWaitForSbcOML) - -#define WGLEW_OML_sync_control WGLEW_GET_VAR(__WGLEW_OML_sync_control) - -#endif /* WGL_OML_sync_control */ - -/* ------------------------------------------------------------------------- */ - -#define WGLEW_FUN_EXPORT GLEW_FUN_EXPORT -#define WGLEW_VAR_EXPORT GLEW_VAR_EXPORT - -WGLEW_FUN_EXPORT PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL; - -WGLEW_FUN_EXPORT PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD; -WGLEW_FUN_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD; -WGLEW_FUN_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD; -WGLEW_FUN_EXPORT PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD; -WGLEW_FUN_EXPORT PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD; -WGLEW_FUN_EXPORT PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD; -WGLEW_FUN_EXPORT PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD; -WGLEW_FUN_EXPORT PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD; -WGLEW_FUN_EXPORT PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD; - -WGLEW_FUN_EXPORT PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB; -WGLEW_FUN_EXPORT PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB; -WGLEW_FUN_EXPORT PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB; -WGLEW_FUN_EXPORT PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB; - -WGLEW_FUN_EXPORT PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB; - -WGLEW_FUN_EXPORT PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB; - -WGLEW_FUN_EXPORT PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB; -WGLEW_FUN_EXPORT PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB; - -WGLEW_FUN_EXPORT PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB; -WGLEW_FUN_EXPORT PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB; -WGLEW_FUN_EXPORT PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB; -WGLEW_FUN_EXPORT PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB; -WGLEW_FUN_EXPORT PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB; - -WGLEW_FUN_EXPORT PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB; -WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB; -WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB; - -WGLEW_FUN_EXPORT PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB; -WGLEW_FUN_EXPORT PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB; -WGLEW_FUN_EXPORT PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB; - -WGLEW_FUN_EXPORT PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT; -WGLEW_FUN_EXPORT PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT; -WGLEW_FUN_EXPORT PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT; -WGLEW_FUN_EXPORT PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT; - -WGLEW_FUN_EXPORT PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT; - -WGLEW_FUN_EXPORT PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT; -WGLEW_FUN_EXPORT PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT; - -WGLEW_FUN_EXPORT PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT; -WGLEW_FUN_EXPORT PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT; -WGLEW_FUN_EXPORT PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT; -WGLEW_FUN_EXPORT PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT; -WGLEW_FUN_EXPORT PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT; - -WGLEW_FUN_EXPORT PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT; -WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT; -WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT; - -WGLEW_FUN_EXPORT PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT; -WGLEW_FUN_EXPORT PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT; - -WGLEW_FUN_EXPORT PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D; -WGLEW_FUN_EXPORT PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D; - -WGLEW_FUN_EXPORT PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D; -WGLEW_FUN_EXPORT PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D; -WGLEW_FUN_EXPORT PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D; -WGLEW_FUN_EXPORT PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D; - -WGLEW_FUN_EXPORT PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D; -WGLEW_FUN_EXPORT PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D; -WGLEW_FUN_EXPORT PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D; -WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D; -WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D; -WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D; -WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D; -WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D; -WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D; -WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D; -WGLEW_FUN_EXPORT PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D; -WGLEW_FUN_EXPORT PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D; - -WGLEW_FUN_EXPORT PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D; -WGLEW_FUN_EXPORT PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D; -WGLEW_FUN_EXPORT PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D; -WGLEW_FUN_EXPORT PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D; - -WGLEW_FUN_EXPORT PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D; -WGLEW_FUN_EXPORT PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D; -WGLEW_FUN_EXPORT PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D; -WGLEW_FUN_EXPORT PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D; - -WGLEW_FUN_EXPORT PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D; -WGLEW_FUN_EXPORT PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D; -WGLEW_FUN_EXPORT PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D; -WGLEW_FUN_EXPORT PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D; - -WGLEW_FUN_EXPORT PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV; -WGLEW_FUN_EXPORT PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV; -WGLEW_FUN_EXPORT PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV; -WGLEW_FUN_EXPORT PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV; -WGLEW_FUN_EXPORT PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV; -WGLEW_FUN_EXPORT PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV; -WGLEW_FUN_EXPORT PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV; -WGLEW_FUN_EXPORT PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV; - -WGLEW_FUN_EXPORT PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV; - -WGLEW_FUN_EXPORT PFNWGLDELAYBEFORESWAPNVPROC __wglewDelayBeforeSwapNV; - -WGLEW_FUN_EXPORT PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV; -WGLEW_FUN_EXPORT PFNWGLDELETEDCNVPROC __wglewDeleteDCNV; -WGLEW_FUN_EXPORT PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV; -WGLEW_FUN_EXPORT PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV; -WGLEW_FUN_EXPORT PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV; - -WGLEW_FUN_EXPORT PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV; -WGLEW_FUN_EXPORT PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV; -WGLEW_FUN_EXPORT PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV; - -WGLEW_FUN_EXPORT PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV; -WGLEW_FUN_EXPORT PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV; -WGLEW_FUN_EXPORT PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV; -WGLEW_FUN_EXPORT PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV; -WGLEW_FUN_EXPORT PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV; -WGLEW_FUN_EXPORT PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV; - -WGLEW_FUN_EXPORT PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV; -WGLEW_FUN_EXPORT PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV; - -WGLEW_FUN_EXPORT PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV; -WGLEW_FUN_EXPORT PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV; -WGLEW_FUN_EXPORT PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV; -WGLEW_FUN_EXPORT PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV; -WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV; - -WGLEW_FUN_EXPORT PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV; -WGLEW_FUN_EXPORT PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV; -WGLEW_FUN_EXPORT PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV; -WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV; -WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV; -WGLEW_FUN_EXPORT PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV; - -WGLEW_FUN_EXPORT PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML; -WGLEW_FUN_EXPORT PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML; -WGLEW_FUN_EXPORT PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML; -WGLEW_FUN_EXPORT PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML; -WGLEW_FUN_EXPORT PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML; -WGLEW_FUN_EXPORT PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML; -WGLEW_VAR_EXPORT GLboolean __WGLEW_3DFX_multisample; -WGLEW_VAR_EXPORT GLboolean __WGLEW_3DL_stereo_control; -WGLEW_VAR_EXPORT GLboolean __WGLEW_AMD_gpu_association; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_buffer_region; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_context_flush_control; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_no_error; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_profile; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_robustness; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_extensions_string; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_framebuffer_sRGB; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_make_current_read; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_multisample; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pbuffer; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format_float; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_render_texture; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_application_isolation; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_share_group_isolation; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_pixel_format_float; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_render_texture_rectangle; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_colorspace; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es2_profile; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es_profile; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_depth_float; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_display_color_table; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_extensions_string; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_framebuffer_sRGB; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_make_current_read; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_multisample; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pbuffer; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pixel_format; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pixel_format_packed_float; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_swap_control; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_swap_control_tear; -WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_digital_video_control; -WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_gamma; -WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_genlock; -WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_image_buffer; -WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_swap_frame_lock; -WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_swap_frame_usage; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_DX_interop; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_DX_interop2; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_copy_image; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_delay_before_swap; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_float_buffer; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_gpu_affinity; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_multigpu_context; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_multisample_coverage; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_present_video; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_render_depth_texture; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_render_texture_rectangle; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_swap_group; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_vertex_array_range; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_video_capture; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_video_output; -WGLEW_VAR_EXPORT GLboolean __WGLEW_OML_sync_control; -/* ------------------------------------------------------------------------- */ - -GLEWAPI GLenum GLEWAPIENTRY wglewInit (); -GLEWAPI GLboolean GLEWAPIENTRY wglewIsSupported (const char *name); - -#ifndef WGLEW_GET_VAR -#define WGLEW_GET_VAR(x) (*(const GLboolean*)&x) -#endif - -#ifndef WGLEW_GET_FUN -#define WGLEW_GET_FUN(x) x -#endif - -GLEWAPI GLboolean GLEWAPIENTRY wglewGetExtension (const char *name); - -#ifdef __cplusplus -} -#endif - -#undef GLEWAPI - -#endif /* __wglew_h__ */ diff --git a/src/glew/src/glew.c b/src/glew/src/glew.c deleted file mode 100644 index 967c5c91f95..00000000000 --- a/src/glew/src/glew.c +++ /dev/null @@ -1,31949 +0,0 @@ -/* -** The OpenGL Extension Wrangler Library -** Copyright (C) 2008-2019, Nigel Stewart -** Copyright (C) 2002-2008, Milan Ikits -** Copyright (C) 2002-2008, Marcelo E. Magallon -** Copyright (C) 2002, Lev Povalahev -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are met: -** -** * Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** * The name of the author may be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -** THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef GLEW_INCLUDE -# include -#else -# include GLEW_INCLUDE -#endif - -#if defined(GLEW_OSMESA) -# define GLAPI extern -# include -#elif defined(GLEW_EGL) -# include -#elif defined(_WIN32) -/* - * If NOGDI is defined, wingdi.h won't be included by windows.h, and thus - * wglGetProcAddress won't be declared. It will instead be implicitly declared, - * potentially incorrectly, which we don't want. - */ -# if defined(NOGDI) -# undef NOGDI -# endif -# include -#elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) -# include -#endif - -#include /* For size_t */ - -#if defined(GLEW_EGL) -#elif defined(GLEW_REGAL) - -/* In GLEW_REGAL mode we call direcly into the linked - libRegal.so glGetProcAddressREGAL for looking up - the GL function pointers. */ - -# undef glGetProcAddressREGAL -# ifdef WIN32 -extern void * __stdcall glGetProcAddressREGAL(const GLchar *name); -static void * (__stdcall * regalGetProcAddress) (const GLchar *) = glGetProcAddressREGAL; -# else -extern void * glGetProcAddressREGAL(const GLchar *name); -static void * (*regalGetProcAddress) (const GLchar *) = glGetProcAddressREGAL; -# endif -# define glGetProcAddressREGAL GLEW_GET_FUN(__glewGetProcAddressREGAL) - -#elif defined(__sgi) || defined (__sun) || defined(__HAIKU__) || defined(GLEW_APPLE_GLX) -#include -#include -#include - -void* dlGetProcAddress (const GLubyte* name) -{ - static void* h = NULL; - static void* gpa; - - if (h == NULL) - { - if ((h = dlopen(NULL, RTLD_LAZY | RTLD_LOCAL)) == NULL) return NULL; - gpa = dlsym(h, "glXGetProcAddress"); - } - - if (gpa != NULL) - return ((void*(*)(const GLubyte*))gpa)(name); - else - return dlsym(h, (const char*)name); -} -#endif /* __sgi || __sun || GLEW_APPLE_GLX */ - -#if defined(__APPLE__) -#include -#include -#include - -#ifdef MAC_OS_X_VERSION_10_3 - -#include - -void* NSGLGetProcAddress (const GLubyte *name) -{ - static void* image = NULL; - void* addr; - if (NULL == image) - { - image = dlopen("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", RTLD_LAZY); - } - if( !image ) return NULL; - addr = dlsym(image, (const char*)name); - if( addr ) return addr; -#ifdef GLEW_APPLE_GLX - return dlGetProcAddress( name ); // try next for glx symbols -#else - return NULL; -#endif -} -#else - -#include - -void* NSGLGetProcAddress (const GLubyte *name) -{ - static const struct mach_header* image = NULL; - NSSymbol symbol; - char* symbolName; - if (NULL == image) - { - image = NSAddImage("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", NSADDIMAGE_OPTION_RETURN_ON_ERROR); - } - /* prepend a '_' for the Unix C symbol mangling convention */ - symbolName = malloc(strlen((const char*)name) + 2); - strcpy(symbolName+1, (const char*)name); - symbolName[0] = '_'; - symbol = NULL; - /* if (NSIsSymbolNameDefined(symbolName)) - symbol = NSLookupAndBindSymbol(symbolName); */ - symbol = image ? NSLookupSymbolInImage(image, symbolName, NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR) : NULL; - free(symbolName); - if( symbol ) return NSAddressOfSymbol(symbol); -#ifdef GLEW_APPLE_GLX - return dlGetProcAddress( name ); // try next for glx symbols -#else - return NULL; -#endif -} -#endif /* MAC_OS_X_VERSION_10_3 */ -#endif /* __APPLE__ */ - -/* - * Define glewGetProcAddress. - */ -#if defined(GLEW_REGAL) -# define glewGetProcAddress(name) regalGetProcAddress((const GLchar *)name) -#elif defined(GLEW_OSMESA) -# define glewGetProcAddress(name) OSMesaGetProcAddress((const char *)name) -#elif defined(GLEW_EGL) -# define glewGetProcAddress(name) eglGetProcAddress((const char *)name) -#elif defined(_WIN32) -# define glewGetProcAddress(name) wglGetProcAddress((LPCSTR)name) -#elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX) -# define glewGetProcAddress(name) NSGLGetProcAddress(name) -#elif defined(__sgi) || defined(__sun) || defined(__HAIKU__) -# define glewGetProcAddress(name) dlGetProcAddress(name) -#elif defined(__ANDROID__) -# define glewGetProcAddress(name) NULL /* TODO */ -#elif defined(__native_client__) -# define glewGetProcAddress(name) NULL /* TODO */ -#else /* __linux */ -# define glewGetProcAddress(name) (*glXGetProcAddressARB)(name) -#endif - -/* - * Redefine GLEW_GET_VAR etc without const cast - */ - -#undef GLEW_GET_VAR -# define GLEW_GET_VAR(x) (x) - -#ifdef WGLEW_GET_VAR -# undef WGLEW_GET_VAR -# define WGLEW_GET_VAR(x) (x) -#endif /* WGLEW_GET_VAR */ - -#ifdef GLXEW_GET_VAR -# undef GLXEW_GET_VAR -# define GLXEW_GET_VAR(x) (x) -#endif /* GLXEW_GET_VAR */ - -#ifdef EGLEW_GET_VAR -# undef EGLEW_GET_VAR -# define EGLEW_GET_VAR(x) (x) -#endif /* EGLEW_GET_VAR */ - -/* - * GLEW, just like OpenGL or GLU, does not rely on the standard C library. - * These functions implement the functionality required in this file. - */ - -static GLuint _glewStrLen (const GLubyte* s) -{ - GLuint i=0; - if (s == NULL) return 0; - while (s[i] != '\0') i++; - return i; -} - -static GLuint _glewStrCLen (const GLubyte* s, GLubyte c) -{ - GLuint i=0; - if (s == NULL) return 0; - while (s[i] != '\0' && s[i] != c) i++; - return i; -} - -static GLuint _glewStrCopy(char *d, const char *s, char c) -{ - GLuint i=0; - if (s == NULL) return 0; - while (s[i] != '\0' && s[i] != c) { d[i] = s[i]; i++; } - d[i] = '\0'; - return i; -} - -#if !defined(GLEW_OSMESA) -#if !defined(__APPLE__) || defined(GLEW_APPLE_GLX) -static GLboolean _glewStrSame (const GLubyte* a, const GLubyte* b, GLuint n) -{ - GLuint i=0; - if(a == NULL || b == NULL) - return (a == NULL && b == NULL && n == 0) ? GL_TRUE : GL_FALSE; - while (i < n && a[i] != '\0' && b[i] != '\0' && a[i] == b[i]) i++; - return i == n ? GL_TRUE : GL_FALSE; -} -#endif -#endif - -static GLboolean _glewStrSame1 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) -{ - while (*na > 0 && (**a == ' ' || **a == '\n' || **a == '\r' || **a == '\t')) - { - (*a)++; - (*na)--; - } - if(*na >= nb) - { - GLuint i=0; - while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; - if(i == nb) - { - *a = *a + nb; - *na = *na - nb; - return GL_TRUE; - } - } - return GL_FALSE; -} - -static GLboolean _glewStrSame2 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) -{ - if(*na >= nb) - { - GLuint i=0; - while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; - if(i == nb) - { - *a = *a + nb; - *na = *na - nb; - return GL_TRUE; - } - } - return GL_FALSE; -} - -static GLboolean _glewStrSame3 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) -{ - if(*na >= nb) - { - GLuint i=0; - while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; - if (i == nb && (*na == nb || (*a)[i] == ' ' || (*a)[i] == '\n' || (*a)[i] == '\r' || (*a)[i] == '\t')) - { - *a = *a + nb; - *na = *na - nb; - return GL_TRUE; - } - } - return GL_FALSE; -} - -/* - * Search for name in the extensions string. Use of strstr() - * is not sufficient because extension names can be prefixes of - * other extension names. Could use strtok() but the constant - * string returned by glGetString might be in read-only memory. - */ -#if !defined(GLEW_OSMESA) -#if !defined(__APPLE__) || defined(GLEW_APPLE_GLX) -static GLboolean _glewSearchExtension (const char* name, const GLubyte *start, const GLubyte *end) -{ - const GLubyte* p; - GLuint len = _glewStrLen((const GLubyte*)name); - p = start; - while (p < end) - { - GLuint n = _glewStrCLen(p, ' '); - if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE; - p += n+1; - } - return GL_FALSE; -} -#endif -#endif - -PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D = NULL; -PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements = NULL; -PFNGLTEXIMAGE3DPROC __glewTexImage3D = NULL; -PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D = NULL; - -PFNGLACTIVETEXTUREPROC __glewActiveTexture = NULL; -PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture = NULL; -PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D = NULL; -PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D = NULL; -PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D = NULL; -PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage = NULL; -PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd = NULL; -PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf = NULL; -PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd = NULL; -PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf = NULL; -PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d = NULL; -PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv = NULL; -PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f = NULL; -PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv = NULL; -PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i = NULL; -PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv = NULL; -PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s = NULL; -PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv = NULL; -PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d = NULL; -PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv = NULL; -PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f = NULL; -PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv = NULL; -PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i = NULL; -PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv = NULL; -PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s = NULL; -PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv = NULL; -PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d = NULL; -PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv = NULL; -PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f = NULL; -PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv = NULL; -PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i = NULL; -PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv = NULL; -PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s = NULL; -PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv = NULL; -PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d = NULL; -PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv = NULL; -PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f = NULL; -PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv = NULL; -PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i = NULL; -PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv = NULL; -PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s = NULL; -PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv = NULL; -PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage = NULL; - -PFNGLBLENDCOLORPROC __glewBlendColor = NULL; -PFNGLBLENDEQUATIONPROC __glewBlendEquation = NULL; -PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate = NULL; -PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer = NULL; -PFNGLFOGCOORDDPROC __glewFogCoordd = NULL; -PFNGLFOGCOORDDVPROC __glewFogCoorddv = NULL; -PFNGLFOGCOORDFPROC __glewFogCoordf = NULL; -PFNGLFOGCOORDFVPROC __glewFogCoordfv = NULL; -PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays = NULL; -PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements = NULL; -PFNGLPOINTPARAMETERFPROC __glewPointParameterf = NULL; -PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv = NULL; -PFNGLPOINTPARAMETERIPROC __glewPointParameteri = NULL; -PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv = NULL; -PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b = NULL; -PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv = NULL; -PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d = NULL; -PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv = NULL; -PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f = NULL; -PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv = NULL; -PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i = NULL; -PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv = NULL; -PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s = NULL; -PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv = NULL; -PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub = NULL; -PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv = NULL; -PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui = NULL; -PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv = NULL; -PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us = NULL; -PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv = NULL; -PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer = NULL; -PFNGLWINDOWPOS2DPROC __glewWindowPos2d = NULL; -PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv = NULL; -PFNGLWINDOWPOS2FPROC __glewWindowPos2f = NULL; -PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv = NULL; -PFNGLWINDOWPOS2IPROC __glewWindowPos2i = NULL; -PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv = NULL; -PFNGLWINDOWPOS2SPROC __glewWindowPos2s = NULL; -PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv = NULL; -PFNGLWINDOWPOS3DPROC __glewWindowPos3d = NULL; -PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv = NULL; -PFNGLWINDOWPOS3FPROC __glewWindowPos3f = NULL; -PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv = NULL; -PFNGLWINDOWPOS3IPROC __glewWindowPos3i = NULL; -PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv = NULL; -PFNGLWINDOWPOS3SPROC __glewWindowPos3s = NULL; -PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv = NULL; - -PFNGLBEGINQUERYPROC __glewBeginQuery = NULL; -PFNGLBINDBUFFERPROC __glewBindBuffer = NULL; -PFNGLBUFFERDATAPROC __glewBufferData = NULL; -PFNGLBUFFERSUBDATAPROC __glewBufferSubData = NULL; -PFNGLDELETEBUFFERSPROC __glewDeleteBuffers = NULL; -PFNGLDELETEQUERIESPROC __glewDeleteQueries = NULL; -PFNGLENDQUERYPROC __glewEndQuery = NULL; -PFNGLGENBUFFERSPROC __glewGenBuffers = NULL; -PFNGLGENQUERIESPROC __glewGenQueries = NULL; -PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv = NULL; -PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv = NULL; -PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData = NULL; -PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv = NULL; -PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv = NULL; -PFNGLGETQUERYIVPROC __glewGetQueryiv = NULL; -PFNGLISBUFFERPROC __glewIsBuffer = NULL; -PFNGLISQUERYPROC __glewIsQuery = NULL; -PFNGLMAPBUFFERPROC __glewMapBuffer = NULL; -PFNGLUNMAPBUFFERPROC __glewUnmapBuffer = NULL; - -PFNGLATTACHSHADERPROC __glewAttachShader = NULL; -PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation = NULL; -PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate = NULL; -PFNGLCOMPILESHADERPROC __glewCompileShader = NULL; -PFNGLCREATEPROGRAMPROC __glewCreateProgram = NULL; -PFNGLCREATESHADERPROC __glewCreateShader = NULL; -PFNGLDELETEPROGRAMPROC __glewDeleteProgram = NULL; -PFNGLDELETESHADERPROC __glewDeleteShader = NULL; -PFNGLDETACHSHADERPROC __glewDetachShader = NULL; -PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray = NULL; -PFNGLDRAWBUFFERSPROC __glewDrawBuffers = NULL; -PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray = NULL; -PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib = NULL; -PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform = NULL; -PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders = NULL; -PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation = NULL; -PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog = NULL; -PFNGLGETPROGRAMIVPROC __glewGetProgramiv = NULL; -PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog = NULL; -PFNGLGETSHADERSOURCEPROC __glewGetShaderSource = NULL; -PFNGLGETSHADERIVPROC __glewGetShaderiv = NULL; -PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation = NULL; -PFNGLGETUNIFORMFVPROC __glewGetUniformfv = NULL; -PFNGLGETUNIFORMIVPROC __glewGetUniformiv = NULL; -PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv = NULL; -PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv = NULL; -PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv = NULL; -PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv = NULL; -PFNGLISPROGRAMPROC __glewIsProgram = NULL; -PFNGLISSHADERPROC __glewIsShader = NULL; -PFNGLLINKPROGRAMPROC __glewLinkProgram = NULL; -PFNGLSHADERSOURCEPROC __glewShaderSource = NULL; -PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate = NULL; -PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate = NULL; -PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate = NULL; -PFNGLUNIFORM1FPROC __glewUniform1f = NULL; -PFNGLUNIFORM1FVPROC __glewUniform1fv = NULL; -PFNGLUNIFORM1IPROC __glewUniform1i = NULL; -PFNGLUNIFORM1IVPROC __glewUniform1iv = NULL; -PFNGLUNIFORM2FPROC __glewUniform2f = NULL; -PFNGLUNIFORM2FVPROC __glewUniform2fv = NULL; -PFNGLUNIFORM2IPROC __glewUniform2i = NULL; -PFNGLUNIFORM2IVPROC __glewUniform2iv = NULL; -PFNGLUNIFORM3FPROC __glewUniform3f = NULL; -PFNGLUNIFORM3FVPROC __glewUniform3fv = NULL; -PFNGLUNIFORM3IPROC __glewUniform3i = NULL; -PFNGLUNIFORM3IVPROC __glewUniform3iv = NULL; -PFNGLUNIFORM4FPROC __glewUniform4f = NULL; -PFNGLUNIFORM4FVPROC __glewUniform4fv = NULL; -PFNGLUNIFORM4IPROC __glewUniform4i = NULL; -PFNGLUNIFORM4IVPROC __glewUniform4iv = NULL; -PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv = NULL; -PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv = NULL; -PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv = NULL; -PFNGLUSEPROGRAMPROC __glewUseProgram = NULL; -PFNGLVALIDATEPROGRAMPROC __glewValidateProgram = NULL; -PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d = NULL; -PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv = NULL; -PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f = NULL; -PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv = NULL; -PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s = NULL; -PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv = NULL; -PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d = NULL; -PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv = NULL; -PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f = NULL; -PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv = NULL; -PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s = NULL; -PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv = NULL; -PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d = NULL; -PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv = NULL; -PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f = NULL; -PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv = NULL; -PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s = NULL; -PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv = NULL; -PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv = NULL; -PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv = NULL; -PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv = NULL; -PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub = NULL; -PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv = NULL; -PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv = NULL; -PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv = NULL; -PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv = NULL; -PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d = NULL; -PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv = NULL; -PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f = NULL; -PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv = NULL; -PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv = NULL; -PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s = NULL; -PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv = NULL; -PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv = NULL; -PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv = NULL; -PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv = NULL; -PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer = NULL; - -PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv = NULL; -PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv = NULL; -PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv = NULL; -PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv = NULL; -PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv = NULL; -PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv = NULL; - -PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender = NULL; -PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback = NULL; -PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation = NULL; -PFNGLCLAMPCOLORPROC __glewClampColor = NULL; -PFNGLCLEARBUFFERFIPROC __glewClearBufferfi = NULL; -PFNGLCLEARBUFFERFVPROC __glewClearBufferfv = NULL; -PFNGLCLEARBUFFERIVPROC __glewClearBufferiv = NULL; -PFNGLCLEARBUFFERUIVPROC __glewClearBufferuiv = NULL; -PFNGLCOLORMASKIPROC __glewColorMaski = NULL; -PFNGLDISABLEIPROC __glewDisablei = NULL; -PFNGLENABLEIPROC __glewEnablei = NULL; -PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender = NULL; -PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback = NULL; -PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v = NULL; -PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation = NULL; -PFNGLGETSTRINGIPROC __glewGetStringi = NULL; -PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv = NULL; -PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv = NULL; -PFNGLGETTRANSFORMFEEDBACKVARYINGPROC __glewGetTransformFeedbackVarying = NULL; -PFNGLGETUNIFORMUIVPROC __glewGetUniformuiv = NULL; -PFNGLGETVERTEXATTRIBIIVPROC __glewGetVertexAttribIiv = NULL; -PFNGLGETVERTEXATTRIBIUIVPROC __glewGetVertexAttribIuiv = NULL; -PFNGLISENABLEDIPROC __glewIsEnabledi = NULL; -PFNGLTEXPARAMETERIIVPROC __glewTexParameterIiv = NULL; -PFNGLTEXPARAMETERIUIVPROC __glewTexParameterIuiv = NULL; -PFNGLTRANSFORMFEEDBACKVARYINGSPROC __glewTransformFeedbackVaryings = NULL; -PFNGLUNIFORM1UIPROC __glewUniform1ui = NULL; -PFNGLUNIFORM1UIVPROC __glewUniform1uiv = NULL; -PFNGLUNIFORM2UIPROC __glewUniform2ui = NULL; -PFNGLUNIFORM2UIVPROC __glewUniform2uiv = NULL; -PFNGLUNIFORM3UIPROC __glewUniform3ui = NULL; -PFNGLUNIFORM3UIVPROC __glewUniform3uiv = NULL; -PFNGLUNIFORM4UIPROC __glewUniform4ui = NULL; -PFNGLUNIFORM4UIVPROC __glewUniform4uiv = NULL; -PFNGLVERTEXATTRIBI1IPROC __glewVertexAttribI1i = NULL; -PFNGLVERTEXATTRIBI1IVPROC __glewVertexAttribI1iv = NULL; -PFNGLVERTEXATTRIBI1UIPROC __glewVertexAttribI1ui = NULL; -PFNGLVERTEXATTRIBI1UIVPROC __glewVertexAttribI1uiv = NULL; -PFNGLVERTEXATTRIBI2IPROC __glewVertexAttribI2i = NULL; -PFNGLVERTEXATTRIBI2IVPROC __glewVertexAttribI2iv = NULL; -PFNGLVERTEXATTRIBI2UIPROC __glewVertexAttribI2ui = NULL; -PFNGLVERTEXATTRIBI2UIVPROC __glewVertexAttribI2uiv = NULL; -PFNGLVERTEXATTRIBI3IPROC __glewVertexAttribI3i = NULL; -PFNGLVERTEXATTRIBI3IVPROC __glewVertexAttribI3iv = NULL; -PFNGLVERTEXATTRIBI3UIPROC __glewVertexAttribI3ui = NULL; -PFNGLVERTEXATTRIBI3UIVPROC __glewVertexAttribI3uiv = NULL; -PFNGLVERTEXATTRIBI4BVPROC __glewVertexAttribI4bv = NULL; -PFNGLVERTEXATTRIBI4IPROC __glewVertexAttribI4i = NULL; -PFNGLVERTEXATTRIBI4IVPROC __glewVertexAttribI4iv = NULL; -PFNGLVERTEXATTRIBI4SVPROC __glewVertexAttribI4sv = NULL; -PFNGLVERTEXATTRIBI4UBVPROC __glewVertexAttribI4ubv = NULL; -PFNGLVERTEXATTRIBI4UIPROC __glewVertexAttribI4ui = NULL; -PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv = NULL; -PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv = NULL; -PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer = NULL; - -PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced = NULL; -PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced = NULL; -PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex = NULL; -PFNGLTEXBUFFERPROC __glewTexBuffer = NULL; - -PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture = NULL; -PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v = NULL; -PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v = NULL; - -PFNGLVERTEXATTRIBDIVISORPROC __glewVertexAttribDivisor = NULL; - -PFNGLBLENDEQUATIONSEPARATEIPROC __glewBlendEquationSeparatei = NULL; -PFNGLBLENDEQUATIONIPROC __glewBlendEquationi = NULL; -PFNGLBLENDFUNCSEPARATEIPROC __glewBlendFuncSeparatei = NULL; -PFNGLBLENDFUNCIPROC __glewBlendFunci = NULL; -PFNGLMINSAMPLESHADINGPROC __glewMinSampleShading = NULL; - -PFNGLGETGRAPHICSRESETSTATUSPROC __glewGetGraphicsResetStatus = NULL; -PFNGLGETNCOMPRESSEDTEXIMAGEPROC __glewGetnCompressedTexImage = NULL; -PFNGLGETNTEXIMAGEPROC __glewGetnTexImage = NULL; -PFNGLGETNUNIFORMDVPROC __glewGetnUniformdv = NULL; - -PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC __glewMultiDrawArraysIndirectCount = NULL; -PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC __glewMultiDrawElementsIndirectCount = NULL; -PFNGLSPECIALIZESHADERPROC __glewSpecializeShader = NULL; - -PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX = NULL; - -PFNGLDEBUGMESSAGECALLBACKAMDPROC __glewDebugMessageCallbackAMD = NULL; -PFNGLDEBUGMESSAGEENABLEAMDPROC __glewDebugMessageEnableAMD = NULL; -PFNGLDEBUGMESSAGEINSERTAMDPROC __glewDebugMessageInsertAMD = NULL; -PFNGLGETDEBUGMESSAGELOGAMDPROC __glewGetDebugMessageLogAMD = NULL; - -PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD = NULL; -PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD = NULL; -PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD = NULL; -PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD = NULL; - -PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC __glewNamedRenderbufferStorageMultisampleAdvancedAMD = NULL; -PFNGLRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC __glewRenderbufferStorageMultisampleAdvancedAMD = NULL; - -PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC __glewFramebufferSamplePositionsfvAMD = NULL; -PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC __glewGetFramebufferParameterfvAMD = NULL; -PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC __glewGetNamedFramebufferParameterfvAMD = NULL; -PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC __glewNamedFramebufferSamplePositionsfvAMD = NULL; - -PFNGLVERTEXATTRIBPARAMETERIAMDPROC __glewVertexAttribParameteriAMD = NULL; - -PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD = NULL; -PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD = NULL; - -PFNGLDELETENAMESAMDPROC __glewDeleteNamesAMD = NULL; -PFNGLGENNAMESAMDPROC __glewGenNamesAMD = NULL; -PFNGLISNAMEAMDPROC __glewIsNameAMD = NULL; - -PFNGLQUERYOBJECTPARAMETERUIAMDPROC __glewQueryObjectParameteruiAMD = NULL; - -PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD = NULL; -PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD = NULL; -PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD = NULL; -PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD = NULL; -PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD = NULL; -PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD = NULL; -PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD = NULL; -PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD = NULL; -PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD = NULL; -PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD = NULL; -PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD = NULL; - -PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD = NULL; - -PFNGLTEXSTORAGESPARSEAMDPROC __glewTexStorageSparseAMD = NULL; -PFNGLTEXTURESTORAGESPARSEAMDPROC __glewTextureStorageSparseAMD = NULL; - -PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD = NULL; - -PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD = NULL; -PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD = NULL; - -PFNGLBLITFRAMEBUFFERANGLEPROC __glewBlitFramebufferANGLE = NULL; - -PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC __glewRenderbufferStorageMultisampleANGLE = NULL; - -PFNGLDRAWARRAYSINSTANCEDANGLEPROC __glewDrawArraysInstancedANGLE = NULL; -PFNGLDRAWELEMENTSINSTANCEDANGLEPROC __glewDrawElementsInstancedANGLE = NULL; -PFNGLVERTEXATTRIBDIVISORANGLEPROC __glewVertexAttribDivisorANGLE = NULL; - -PFNGLBEGINQUERYANGLEPROC __glewBeginQueryANGLE = NULL; -PFNGLDELETEQUERIESANGLEPROC __glewDeleteQueriesANGLE = NULL; -PFNGLENDQUERYANGLEPROC __glewEndQueryANGLE = NULL; -PFNGLGENQUERIESANGLEPROC __glewGenQueriesANGLE = NULL; -PFNGLGETQUERYOBJECTI64VANGLEPROC __glewGetQueryObjecti64vANGLE = NULL; -PFNGLGETQUERYOBJECTIVANGLEPROC __glewGetQueryObjectivANGLE = NULL; -PFNGLGETQUERYOBJECTUI64VANGLEPROC __glewGetQueryObjectui64vANGLE = NULL; -PFNGLGETQUERYOBJECTUIVANGLEPROC __glewGetQueryObjectuivANGLE = NULL; -PFNGLGETQUERYIVANGLEPROC __glewGetQueryivANGLE = NULL; -PFNGLISQUERYANGLEPROC __glewIsQueryANGLE = NULL; -PFNGLQUERYCOUNTERANGLEPROC __glewQueryCounterANGLE = NULL; - -PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC __glewGetTranslatedShaderSourceANGLE = NULL; - -PFNGLCOPYTEXTURELEVELSAPPLEPROC __glewCopyTextureLevelsAPPLE = NULL; - -PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE = NULL; -PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE = NULL; -PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE = NULL; -PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE = NULL; -PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE = NULL; - -PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE = NULL; -PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE = NULL; -PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE = NULL; -PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE = NULL; -PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE = NULL; -PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE = NULL; -PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE = NULL; -PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE = NULL; - -PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE = NULL; -PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE = NULL; - -PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC __glewRenderbufferStorageMultisampleAPPLE = NULL; -PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC __glewResolveMultisampleFramebufferAPPLE = NULL; - -PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE = NULL; -PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE = NULL; -PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE = NULL; - -PFNGLCLIENTWAITSYNCAPPLEPROC __glewClientWaitSyncAPPLE = NULL; -PFNGLDELETESYNCAPPLEPROC __glewDeleteSyncAPPLE = NULL; -PFNGLFENCESYNCAPPLEPROC __glewFenceSyncAPPLE = NULL; -PFNGLGETINTEGER64VAPPLEPROC __glewGetInteger64vAPPLE = NULL; -PFNGLGETSYNCIVAPPLEPROC __glewGetSyncivAPPLE = NULL; -PFNGLISSYNCAPPLEPROC __glewIsSyncAPPLE = NULL; -PFNGLWAITSYNCAPPLEPROC __glewWaitSyncAPPLE = NULL; - -PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE = NULL; -PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE = NULL; - -PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE = NULL; -PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE = NULL; -PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE = NULL; -PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE = NULL; - -PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE = NULL; -PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE = NULL; -PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE = NULL; - -PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE = NULL; -PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE = NULL; -PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE = NULL; -PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE = NULL; -PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE = NULL; -PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE = NULL; -PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE = NULL; - -PFNGLCLEARDEPTHFPROC __glewClearDepthf = NULL; -PFNGLDEPTHRANGEFPROC __glewDepthRangef = NULL; -PFNGLGETSHADERPRECISIONFORMATPROC __glewGetShaderPrecisionFormat = NULL; -PFNGLRELEASESHADERCOMPILERPROC __glewReleaseShaderCompiler = NULL; -PFNGLSHADERBINARYPROC __glewShaderBinary = NULL; - -PFNGLMEMORYBARRIERBYREGIONPROC __glewMemoryBarrierByRegion = NULL; - -PFNGLPRIMITIVEBOUNDINGBOXARBPROC __glewPrimitiveBoundingBoxARB = NULL; - -PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstancedBaseInstance = NULL; -PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance = NULL; -PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance = NULL; - -PFNGLGETIMAGEHANDLEARBPROC __glewGetImageHandleARB = NULL; -PFNGLGETTEXTUREHANDLEARBPROC __glewGetTextureHandleARB = NULL; -PFNGLGETTEXTURESAMPLERHANDLEARBPROC __glewGetTextureSamplerHandleARB = NULL; -PFNGLGETVERTEXATTRIBLUI64VARBPROC __glewGetVertexAttribLui64vARB = NULL; -PFNGLISIMAGEHANDLERESIDENTARBPROC __glewIsImageHandleResidentARB = NULL; -PFNGLISTEXTUREHANDLERESIDENTARBPROC __glewIsTextureHandleResidentARB = NULL; -PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC __glewMakeImageHandleNonResidentARB = NULL; -PFNGLMAKEIMAGEHANDLERESIDENTARBPROC __glewMakeImageHandleResidentARB = NULL; -PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC __glewMakeTextureHandleNonResidentARB = NULL; -PFNGLMAKETEXTUREHANDLERESIDENTARBPROC __glewMakeTextureHandleResidentARB = NULL; -PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC __glewProgramUniformHandleui64ARB = NULL; -PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC __glewProgramUniformHandleui64vARB = NULL; -PFNGLUNIFORMHANDLEUI64ARBPROC __glewUniformHandleui64ARB = NULL; -PFNGLUNIFORMHANDLEUI64VARBPROC __glewUniformHandleui64vARB = NULL; -PFNGLVERTEXATTRIBL1UI64ARBPROC __glewVertexAttribL1ui64ARB = NULL; -PFNGLVERTEXATTRIBL1UI64VARBPROC __glewVertexAttribL1ui64vARB = NULL; - -PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed = NULL; -PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex = NULL; - -PFNGLBUFFERSTORAGEPROC __glewBufferStorage = NULL; - -PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB = NULL; - -PFNGLCLEARBUFFERDATAPROC __glewClearBufferData = NULL; -PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData = NULL; -PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT = NULL; -PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT = NULL; - -PFNGLCLEARTEXIMAGEPROC __glewClearTexImage = NULL; -PFNGLCLEARTEXSUBIMAGEPROC __glewClearTexSubImage = NULL; - -PFNGLCLIPCONTROLPROC __glewClipControl = NULL; - -PFNGLCLAMPCOLORARBPROC __glewClampColorARB = NULL; - -PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute = NULL; -PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect = NULL; - -PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC __glewDispatchComputeGroupSizeARB = NULL; - -PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData = NULL; - -PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData = NULL; - -PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB = NULL; -PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB = NULL; -PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB = NULL; -PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB = NULL; - -PFNGLBINDTEXTUREUNITPROC __glewBindTextureUnit = NULL; -PFNGLBLITNAMEDFRAMEBUFFERPROC __glewBlitNamedFramebuffer = NULL; -PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC __glewCheckNamedFramebufferStatus = NULL; -PFNGLCLEARNAMEDBUFFERDATAPROC __glewClearNamedBufferData = NULL; -PFNGLCLEARNAMEDBUFFERSUBDATAPROC __glewClearNamedBufferSubData = NULL; -PFNGLCLEARNAMEDFRAMEBUFFERFIPROC __glewClearNamedFramebufferfi = NULL; -PFNGLCLEARNAMEDFRAMEBUFFERFVPROC __glewClearNamedFramebufferfv = NULL; -PFNGLCLEARNAMEDFRAMEBUFFERIVPROC __glewClearNamedFramebufferiv = NULL; -PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC __glewClearNamedFramebufferuiv = NULL; -PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC __glewCompressedTextureSubImage1D = NULL; -PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC __glewCompressedTextureSubImage2D = NULL; -PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC __glewCompressedTextureSubImage3D = NULL; -PFNGLCOPYNAMEDBUFFERSUBDATAPROC __glewCopyNamedBufferSubData = NULL; -PFNGLCOPYTEXTURESUBIMAGE1DPROC __glewCopyTextureSubImage1D = NULL; -PFNGLCOPYTEXTURESUBIMAGE2DPROC __glewCopyTextureSubImage2D = NULL; -PFNGLCOPYTEXTURESUBIMAGE3DPROC __glewCopyTextureSubImage3D = NULL; -PFNGLCREATEBUFFERSPROC __glewCreateBuffers = NULL; -PFNGLCREATEFRAMEBUFFERSPROC __glewCreateFramebuffers = NULL; -PFNGLCREATEPROGRAMPIPELINESPROC __glewCreateProgramPipelines = NULL; -PFNGLCREATEQUERIESPROC __glewCreateQueries = NULL; -PFNGLCREATERENDERBUFFERSPROC __glewCreateRenderbuffers = NULL; -PFNGLCREATESAMPLERSPROC __glewCreateSamplers = NULL; -PFNGLCREATETEXTURESPROC __glewCreateTextures = NULL; -PFNGLCREATETRANSFORMFEEDBACKSPROC __glewCreateTransformFeedbacks = NULL; -PFNGLCREATEVERTEXARRAYSPROC __glewCreateVertexArrays = NULL; -PFNGLDISABLEVERTEXARRAYATTRIBPROC __glewDisableVertexArrayAttrib = NULL; -PFNGLENABLEVERTEXARRAYATTRIBPROC __glewEnableVertexArrayAttrib = NULL; -PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC __glewFlushMappedNamedBufferRange = NULL; -PFNGLGENERATETEXTUREMIPMAPPROC __glewGenerateTextureMipmap = NULL; -PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC __glewGetCompressedTextureImage = NULL; -PFNGLGETNAMEDBUFFERPARAMETERI64VPROC __glewGetNamedBufferParameteri64v = NULL; -PFNGLGETNAMEDBUFFERPARAMETERIVPROC __glewGetNamedBufferParameteriv = NULL; -PFNGLGETNAMEDBUFFERPOINTERVPROC __glewGetNamedBufferPointerv = NULL; -PFNGLGETNAMEDBUFFERSUBDATAPROC __glewGetNamedBufferSubData = NULL; -PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetNamedFramebufferAttachmentParameteriv = NULL; -PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC __glewGetNamedFramebufferParameteriv = NULL; -PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC __glewGetNamedRenderbufferParameteriv = NULL; -PFNGLGETQUERYBUFFEROBJECTI64VPROC __glewGetQueryBufferObjecti64v = NULL; -PFNGLGETQUERYBUFFEROBJECTIVPROC __glewGetQueryBufferObjectiv = NULL; -PFNGLGETQUERYBUFFEROBJECTUI64VPROC __glewGetQueryBufferObjectui64v = NULL; -PFNGLGETQUERYBUFFEROBJECTUIVPROC __glewGetQueryBufferObjectuiv = NULL; -PFNGLGETTEXTUREIMAGEPROC __glewGetTextureImage = NULL; -PFNGLGETTEXTURELEVELPARAMETERFVPROC __glewGetTextureLevelParameterfv = NULL; -PFNGLGETTEXTURELEVELPARAMETERIVPROC __glewGetTextureLevelParameteriv = NULL; -PFNGLGETTEXTUREPARAMETERIIVPROC __glewGetTextureParameterIiv = NULL; -PFNGLGETTEXTUREPARAMETERIUIVPROC __glewGetTextureParameterIuiv = NULL; -PFNGLGETTEXTUREPARAMETERFVPROC __glewGetTextureParameterfv = NULL; -PFNGLGETTEXTUREPARAMETERIVPROC __glewGetTextureParameteriv = NULL; -PFNGLGETTRANSFORMFEEDBACKI64_VPROC __glewGetTransformFeedbacki64_v = NULL; -PFNGLGETTRANSFORMFEEDBACKI_VPROC __glewGetTransformFeedbacki_v = NULL; -PFNGLGETTRANSFORMFEEDBACKIVPROC __glewGetTransformFeedbackiv = NULL; -PFNGLGETVERTEXARRAYINDEXED64IVPROC __glewGetVertexArrayIndexed64iv = NULL; -PFNGLGETVERTEXARRAYINDEXEDIVPROC __glewGetVertexArrayIndexediv = NULL; -PFNGLGETVERTEXARRAYIVPROC __glewGetVertexArrayiv = NULL; -PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC __glewInvalidateNamedFramebufferData = NULL; -PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC __glewInvalidateNamedFramebufferSubData = NULL; -PFNGLMAPNAMEDBUFFERPROC __glewMapNamedBuffer = NULL; -PFNGLMAPNAMEDBUFFERRANGEPROC __glewMapNamedBufferRange = NULL; -PFNGLNAMEDBUFFERDATAPROC __glewNamedBufferData = NULL; -PFNGLNAMEDBUFFERSTORAGEPROC __glewNamedBufferStorage = NULL; -PFNGLNAMEDBUFFERSUBDATAPROC __glewNamedBufferSubData = NULL; -PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC __glewNamedFramebufferDrawBuffer = NULL; -PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC __glewNamedFramebufferDrawBuffers = NULL; -PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC __glewNamedFramebufferParameteri = NULL; -PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC __glewNamedFramebufferReadBuffer = NULL; -PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC __glewNamedFramebufferRenderbuffer = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTUREPROC __glewNamedFramebufferTexture = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC __glewNamedFramebufferTextureLayer = NULL; -PFNGLNAMEDRENDERBUFFERSTORAGEPROC __glewNamedRenderbufferStorage = NULL; -PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewNamedRenderbufferStorageMultisample = NULL; -PFNGLTEXTUREBUFFERPROC __glewTextureBuffer = NULL; -PFNGLTEXTUREBUFFERRANGEPROC __glewTextureBufferRange = NULL; -PFNGLTEXTUREPARAMETERIIVPROC __glewTextureParameterIiv = NULL; -PFNGLTEXTUREPARAMETERIUIVPROC __glewTextureParameterIuiv = NULL; -PFNGLTEXTUREPARAMETERFPROC __glewTextureParameterf = NULL; -PFNGLTEXTUREPARAMETERFVPROC __glewTextureParameterfv = NULL; -PFNGLTEXTUREPARAMETERIPROC __glewTextureParameteri = NULL; -PFNGLTEXTUREPARAMETERIVPROC __glewTextureParameteriv = NULL; -PFNGLTEXTURESTORAGE1DPROC __glewTextureStorage1D = NULL; -PFNGLTEXTURESTORAGE2DPROC __glewTextureStorage2D = NULL; -PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC __glewTextureStorage2DMultisample = NULL; -PFNGLTEXTURESTORAGE3DPROC __glewTextureStorage3D = NULL; -PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC __glewTextureStorage3DMultisample = NULL; -PFNGLTEXTURESUBIMAGE1DPROC __glewTextureSubImage1D = NULL; -PFNGLTEXTURESUBIMAGE2DPROC __glewTextureSubImage2D = NULL; -PFNGLTEXTURESUBIMAGE3DPROC __glewTextureSubImage3D = NULL; -PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC __glewTransformFeedbackBufferBase = NULL; -PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC __glewTransformFeedbackBufferRange = NULL; -PFNGLUNMAPNAMEDBUFFERPROC __glewUnmapNamedBuffer = NULL; -PFNGLVERTEXARRAYATTRIBBINDINGPROC __glewVertexArrayAttribBinding = NULL; -PFNGLVERTEXARRAYATTRIBFORMATPROC __glewVertexArrayAttribFormat = NULL; -PFNGLVERTEXARRAYATTRIBIFORMATPROC __glewVertexArrayAttribIFormat = NULL; -PFNGLVERTEXARRAYATTRIBLFORMATPROC __glewVertexArrayAttribLFormat = NULL; -PFNGLVERTEXARRAYBINDINGDIVISORPROC __glewVertexArrayBindingDivisor = NULL; -PFNGLVERTEXARRAYELEMENTBUFFERPROC __glewVertexArrayElementBuffer = NULL; -PFNGLVERTEXARRAYVERTEXBUFFERPROC __glewVertexArrayVertexBuffer = NULL; -PFNGLVERTEXARRAYVERTEXBUFFERSPROC __glewVertexArrayVertexBuffers = NULL; - -PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB = NULL; - -PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB = NULL; -PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB = NULL; -PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB = NULL; -PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB = NULL; - -PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex = NULL; -PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex = NULL; -PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex = NULL; -PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex = NULL; - -PFNGLDRAWARRAYSINDIRECTPROC __glewDrawArraysIndirect = NULL; -PFNGLDRAWELEMENTSINDIRECTPROC __glewDrawElementsIndirect = NULL; - -PFNGLFRAMEBUFFERPARAMETERIPROC __glewFramebufferParameteri = NULL; -PFNGLGETFRAMEBUFFERPARAMETERIVPROC __glewGetFramebufferParameteriv = NULL; -PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC __glewGetNamedFramebufferParameterivEXT = NULL; -PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC __glewNamedFramebufferParameteriEXT = NULL; - -PFNGLBINDFRAMEBUFFERPROC __glewBindFramebuffer = NULL; -PFNGLBINDRENDERBUFFERPROC __glewBindRenderbuffer = NULL; -PFNGLBLITFRAMEBUFFERPROC __glewBlitFramebuffer = NULL; -PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus = NULL; -PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers = NULL; -PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers = NULL; -PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer = NULL; -PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D = NULL; -PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D = NULL; -PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D = NULL; -PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer = NULL; -PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers = NULL; -PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers = NULL; -PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap = NULL; -PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetFramebufferAttachmentParameteriv = NULL; -PFNGLGETRENDERBUFFERPARAMETERIVPROC __glewGetRenderbufferParameteriv = NULL; -PFNGLISFRAMEBUFFERPROC __glewIsFramebuffer = NULL; -PFNGLISRENDERBUFFERPROC __glewIsRenderbuffer = NULL; -PFNGLRENDERBUFFERSTORAGEPROC __glewRenderbufferStorage = NULL; -PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewRenderbufferStorageMultisample = NULL; - -PFNGLFRAMEBUFFERTEXTUREARBPROC __glewFramebufferTextureARB = NULL; -PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB = NULL; -PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB = NULL; -PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB = NULL; - -PFNGLGETPROGRAMBINARYPROC __glewGetProgramBinary = NULL; -PFNGLPROGRAMBINARYPROC __glewProgramBinary = NULL; -PFNGLPROGRAMPARAMETERIPROC __glewProgramParameteri = NULL; - -PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC __glewGetCompressedTextureSubImage = NULL; -PFNGLGETTEXTURESUBIMAGEPROC __glewGetTextureSubImage = NULL; - -PFNGLSPECIALIZESHADERARBPROC __glewSpecializeShaderARB = NULL; - -PFNGLGETUNIFORMDVPROC __glewGetUniformdv = NULL; -PFNGLUNIFORM1DPROC __glewUniform1d = NULL; -PFNGLUNIFORM1DVPROC __glewUniform1dv = NULL; -PFNGLUNIFORM2DPROC __glewUniform2d = NULL; -PFNGLUNIFORM2DVPROC __glewUniform2dv = NULL; -PFNGLUNIFORM3DPROC __glewUniform3d = NULL; -PFNGLUNIFORM3DVPROC __glewUniform3dv = NULL; -PFNGLUNIFORM4DPROC __glewUniform4d = NULL; -PFNGLUNIFORM4DVPROC __glewUniform4dv = NULL; -PFNGLUNIFORMMATRIX2DVPROC __glewUniformMatrix2dv = NULL; -PFNGLUNIFORMMATRIX2X3DVPROC __glewUniformMatrix2x3dv = NULL; -PFNGLUNIFORMMATRIX2X4DVPROC __glewUniformMatrix2x4dv = NULL; -PFNGLUNIFORMMATRIX3DVPROC __glewUniformMatrix3dv = NULL; -PFNGLUNIFORMMATRIX3X2DVPROC __glewUniformMatrix3x2dv = NULL; -PFNGLUNIFORMMATRIX3X4DVPROC __glewUniformMatrix3x4dv = NULL; -PFNGLUNIFORMMATRIX4DVPROC __glewUniformMatrix4dv = NULL; -PFNGLUNIFORMMATRIX4X2DVPROC __glewUniformMatrix4x2dv = NULL; -PFNGLUNIFORMMATRIX4X3DVPROC __glewUniformMatrix4x3dv = NULL; - -PFNGLGETUNIFORMI64VARBPROC __glewGetUniformi64vARB = NULL; -PFNGLGETUNIFORMUI64VARBPROC __glewGetUniformui64vARB = NULL; -PFNGLGETNUNIFORMI64VARBPROC __glewGetnUniformi64vARB = NULL; -PFNGLGETNUNIFORMUI64VARBPROC __glewGetnUniformui64vARB = NULL; -PFNGLPROGRAMUNIFORM1I64ARBPROC __glewProgramUniform1i64ARB = NULL; -PFNGLPROGRAMUNIFORM1I64VARBPROC __glewProgramUniform1i64vARB = NULL; -PFNGLPROGRAMUNIFORM1UI64ARBPROC __glewProgramUniform1ui64ARB = NULL; -PFNGLPROGRAMUNIFORM1UI64VARBPROC __glewProgramUniform1ui64vARB = NULL; -PFNGLPROGRAMUNIFORM2I64ARBPROC __glewProgramUniform2i64ARB = NULL; -PFNGLPROGRAMUNIFORM2I64VARBPROC __glewProgramUniform2i64vARB = NULL; -PFNGLPROGRAMUNIFORM2UI64ARBPROC __glewProgramUniform2ui64ARB = NULL; -PFNGLPROGRAMUNIFORM2UI64VARBPROC __glewProgramUniform2ui64vARB = NULL; -PFNGLPROGRAMUNIFORM3I64ARBPROC __glewProgramUniform3i64ARB = NULL; -PFNGLPROGRAMUNIFORM3I64VARBPROC __glewProgramUniform3i64vARB = NULL; -PFNGLPROGRAMUNIFORM3UI64ARBPROC __glewProgramUniform3ui64ARB = NULL; -PFNGLPROGRAMUNIFORM3UI64VARBPROC __glewProgramUniform3ui64vARB = NULL; -PFNGLPROGRAMUNIFORM4I64ARBPROC __glewProgramUniform4i64ARB = NULL; -PFNGLPROGRAMUNIFORM4I64VARBPROC __glewProgramUniform4i64vARB = NULL; -PFNGLPROGRAMUNIFORM4UI64ARBPROC __glewProgramUniform4ui64ARB = NULL; -PFNGLPROGRAMUNIFORM4UI64VARBPROC __glewProgramUniform4ui64vARB = NULL; -PFNGLUNIFORM1I64ARBPROC __glewUniform1i64ARB = NULL; -PFNGLUNIFORM1I64VARBPROC __glewUniform1i64vARB = NULL; -PFNGLUNIFORM1UI64ARBPROC __glewUniform1ui64ARB = NULL; -PFNGLUNIFORM1UI64VARBPROC __glewUniform1ui64vARB = NULL; -PFNGLUNIFORM2I64ARBPROC __glewUniform2i64ARB = NULL; -PFNGLUNIFORM2I64VARBPROC __glewUniform2i64vARB = NULL; -PFNGLUNIFORM2UI64ARBPROC __glewUniform2ui64ARB = NULL; -PFNGLUNIFORM2UI64VARBPROC __glewUniform2ui64vARB = NULL; -PFNGLUNIFORM3I64ARBPROC __glewUniform3i64ARB = NULL; -PFNGLUNIFORM3I64VARBPROC __glewUniform3i64vARB = NULL; -PFNGLUNIFORM3UI64ARBPROC __glewUniform3ui64ARB = NULL; -PFNGLUNIFORM3UI64VARBPROC __glewUniform3ui64vARB = NULL; -PFNGLUNIFORM4I64ARBPROC __glewUniform4i64ARB = NULL; -PFNGLUNIFORM4I64VARBPROC __glewUniform4i64vARB = NULL; -PFNGLUNIFORM4UI64ARBPROC __glewUniform4ui64ARB = NULL; -PFNGLUNIFORM4UI64VARBPROC __glewUniform4ui64vARB = NULL; - -PFNGLCOLORSUBTABLEPROC __glewColorSubTable = NULL; -PFNGLCOLORTABLEPROC __glewColorTable = NULL; -PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv = NULL; -PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv = NULL; -PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D = NULL; -PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D = NULL; -PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf = NULL; -PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv = NULL; -PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri = NULL; -PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv = NULL; -PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable = NULL; -PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable = NULL; -PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D = NULL; -PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D = NULL; -PFNGLGETCOLORTABLEPROC __glewGetColorTable = NULL; -PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv = NULL; -PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv = NULL; -PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter = NULL; -PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv = NULL; -PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv = NULL; -PFNGLGETHISTOGRAMPROC __glewGetHistogram = NULL; -PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv = NULL; -PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv = NULL; -PFNGLGETMINMAXPROC __glewGetMinmax = NULL; -PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv = NULL; -PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv = NULL; -PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter = NULL; -PFNGLHISTOGRAMPROC __glewHistogram = NULL; -PFNGLMINMAXPROC __glewMinmax = NULL; -PFNGLRESETHISTOGRAMPROC __glewResetHistogram = NULL; -PFNGLRESETMINMAXPROC __glewResetMinmax = NULL; -PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D = NULL; - -PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __glewMultiDrawArraysIndirectCountARB = NULL; -PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __glewMultiDrawElementsIndirectCountARB = NULL; - -PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB = NULL; -PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB = NULL; -PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB = NULL; - -PFNGLGETINTERNALFORMATIVPROC __glewGetInternalformativ = NULL; - -PFNGLGETINTERNALFORMATI64VPROC __glewGetInternalformati64v = NULL; - -PFNGLINVALIDATEBUFFERDATAPROC __glewInvalidateBufferData = NULL; -PFNGLINVALIDATEBUFFERSUBDATAPROC __glewInvalidateBufferSubData = NULL; -PFNGLINVALIDATEFRAMEBUFFERPROC __glewInvalidateFramebuffer = NULL; -PFNGLINVALIDATESUBFRAMEBUFFERPROC __glewInvalidateSubFramebuffer = NULL; -PFNGLINVALIDATETEXIMAGEPROC __glewInvalidateTexImage = NULL; -PFNGLINVALIDATETEXSUBIMAGEPROC __glewInvalidateTexSubImage = NULL; - -PFNGLFLUSHMAPPEDBUFFERRANGEPROC __glewFlushMappedBufferRange = NULL; -PFNGLMAPBUFFERRANGEPROC __glewMapBufferRange = NULL; - -PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB = NULL; -PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB = NULL; -PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB = NULL; -PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB = NULL; -PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB = NULL; - -PFNGLBINDBUFFERSBASEPROC __glewBindBuffersBase = NULL; -PFNGLBINDBUFFERSRANGEPROC __glewBindBuffersRange = NULL; -PFNGLBINDIMAGETEXTURESPROC __glewBindImageTextures = NULL; -PFNGLBINDSAMPLERSPROC __glewBindSamplers = NULL; -PFNGLBINDTEXTURESPROC __glewBindTextures = NULL; -PFNGLBINDVERTEXBUFFERSPROC __glewBindVertexBuffers = NULL; - -PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect = NULL; -PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect = NULL; - -PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB = NULL; - -PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB = NULL; -PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB = NULL; -PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB = NULL; -PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB = NULL; -PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB = NULL; -PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB = NULL; -PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB = NULL; -PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB = NULL; -PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB = NULL; -PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB = NULL; -PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB = NULL; -PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB = NULL; -PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB = NULL; -PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB = NULL; -PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB = NULL; -PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB = NULL; -PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB = NULL; -PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB = NULL; -PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB = NULL; -PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB = NULL; -PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB = NULL; -PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB = NULL; -PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB = NULL; -PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB = NULL; -PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB = NULL; -PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB = NULL; -PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB = NULL; -PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB = NULL; -PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB = NULL; -PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB = NULL; -PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB = NULL; -PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB = NULL; -PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB = NULL; -PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB = NULL; - -PFNGLBEGINQUERYARBPROC __glewBeginQueryARB = NULL; -PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB = NULL; -PFNGLENDQUERYARBPROC __glewEndQueryARB = NULL; -PFNGLGENQUERIESARBPROC __glewGenQueriesARB = NULL; -PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB = NULL; -PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB = NULL; -PFNGLGETQUERYIVARBPROC __glewGetQueryivARB = NULL; -PFNGLISQUERYARBPROC __glewIsQueryARB = NULL; - -PFNGLMAXSHADERCOMPILERTHREADSARBPROC __glewMaxShaderCompilerThreadsARB = NULL; - -PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB = NULL; -PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB = NULL; - -PFNGLPOLYGONOFFSETCLAMPPROC __glewPolygonOffsetClamp = NULL; - -PFNGLGETPROGRAMINTERFACEIVPROC __glewGetProgramInterfaceiv = NULL; -PFNGLGETPROGRAMRESOURCEINDEXPROC __glewGetProgramResourceIndex = NULL; -PFNGLGETPROGRAMRESOURCELOCATIONPROC __glewGetProgramResourceLocation = NULL; -PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC __glewGetProgramResourceLocationIndex = NULL; -PFNGLGETPROGRAMRESOURCENAMEPROC __glewGetProgramResourceName = NULL; -PFNGLGETPROGRAMRESOURCEIVPROC __glewGetProgramResourceiv = NULL; - -PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex = NULL; - -PFNGLGETGRAPHICSRESETSTATUSARBPROC __glewGetGraphicsResetStatusARB = NULL; -PFNGLGETNCOLORTABLEARBPROC __glewGetnColorTableARB = NULL; -PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC __glewGetnCompressedTexImageARB = NULL; -PFNGLGETNCONVOLUTIONFILTERARBPROC __glewGetnConvolutionFilterARB = NULL; -PFNGLGETNHISTOGRAMARBPROC __glewGetnHistogramARB = NULL; -PFNGLGETNMAPDVARBPROC __glewGetnMapdvARB = NULL; -PFNGLGETNMAPFVARBPROC __glewGetnMapfvARB = NULL; -PFNGLGETNMAPIVARBPROC __glewGetnMapivARB = NULL; -PFNGLGETNMINMAXARBPROC __glewGetnMinmaxARB = NULL; -PFNGLGETNPIXELMAPFVARBPROC __glewGetnPixelMapfvARB = NULL; -PFNGLGETNPIXELMAPUIVARBPROC __glewGetnPixelMapuivARB = NULL; -PFNGLGETNPIXELMAPUSVARBPROC __glewGetnPixelMapusvARB = NULL; -PFNGLGETNPOLYGONSTIPPLEARBPROC __glewGetnPolygonStippleARB = NULL; -PFNGLGETNSEPARABLEFILTERARBPROC __glewGetnSeparableFilterARB = NULL; -PFNGLGETNTEXIMAGEARBPROC __glewGetnTexImageARB = NULL; -PFNGLGETNUNIFORMDVARBPROC __glewGetnUniformdvARB = NULL; -PFNGLGETNUNIFORMFVARBPROC __glewGetnUniformfvARB = NULL; -PFNGLGETNUNIFORMIVARBPROC __glewGetnUniformivARB = NULL; -PFNGLGETNUNIFORMUIVARBPROC __glewGetnUniformuivARB = NULL; -PFNGLREADNPIXELSARBPROC __glewReadnPixelsARB = NULL; - -PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewFramebufferSampleLocationsfvARB = NULL; -PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewNamedFramebufferSampleLocationsfvARB = NULL; - -PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB = NULL; - -PFNGLBINDSAMPLERPROC __glewBindSampler = NULL; -PFNGLDELETESAMPLERSPROC __glewDeleteSamplers = NULL; -PFNGLGENSAMPLERSPROC __glewGenSamplers = NULL; -PFNGLGETSAMPLERPARAMETERIIVPROC __glewGetSamplerParameterIiv = NULL; -PFNGLGETSAMPLERPARAMETERIUIVPROC __glewGetSamplerParameterIuiv = NULL; -PFNGLGETSAMPLERPARAMETERFVPROC __glewGetSamplerParameterfv = NULL; -PFNGLGETSAMPLERPARAMETERIVPROC __glewGetSamplerParameteriv = NULL; -PFNGLISSAMPLERPROC __glewIsSampler = NULL; -PFNGLSAMPLERPARAMETERIIVPROC __glewSamplerParameterIiv = NULL; -PFNGLSAMPLERPARAMETERIUIVPROC __glewSamplerParameterIuiv = NULL; -PFNGLSAMPLERPARAMETERFPROC __glewSamplerParameterf = NULL; -PFNGLSAMPLERPARAMETERFVPROC __glewSamplerParameterfv = NULL; -PFNGLSAMPLERPARAMETERIPROC __glewSamplerParameteri = NULL; -PFNGLSAMPLERPARAMETERIVPROC __glewSamplerParameteriv = NULL; - -PFNGLACTIVESHADERPROGRAMPROC __glewActiveShaderProgram = NULL; -PFNGLBINDPROGRAMPIPELINEPROC __glewBindProgramPipeline = NULL; -PFNGLCREATESHADERPROGRAMVPROC __glewCreateShaderProgramv = NULL; -PFNGLDELETEPROGRAMPIPELINESPROC __glewDeleteProgramPipelines = NULL; -PFNGLGENPROGRAMPIPELINESPROC __glewGenProgramPipelines = NULL; -PFNGLGETPROGRAMPIPELINEINFOLOGPROC __glewGetProgramPipelineInfoLog = NULL; -PFNGLGETPROGRAMPIPELINEIVPROC __glewGetProgramPipelineiv = NULL; -PFNGLISPROGRAMPIPELINEPROC __glewIsProgramPipeline = NULL; -PFNGLPROGRAMUNIFORM1DPROC __glewProgramUniform1d = NULL; -PFNGLPROGRAMUNIFORM1DVPROC __glewProgramUniform1dv = NULL; -PFNGLPROGRAMUNIFORM1FPROC __glewProgramUniform1f = NULL; -PFNGLPROGRAMUNIFORM1FVPROC __glewProgramUniform1fv = NULL; -PFNGLPROGRAMUNIFORM1IPROC __glewProgramUniform1i = NULL; -PFNGLPROGRAMUNIFORM1IVPROC __glewProgramUniform1iv = NULL; -PFNGLPROGRAMUNIFORM1UIPROC __glewProgramUniform1ui = NULL; -PFNGLPROGRAMUNIFORM1UIVPROC __glewProgramUniform1uiv = NULL; -PFNGLPROGRAMUNIFORM2DPROC __glewProgramUniform2d = NULL; -PFNGLPROGRAMUNIFORM2DVPROC __glewProgramUniform2dv = NULL; -PFNGLPROGRAMUNIFORM2FPROC __glewProgramUniform2f = NULL; -PFNGLPROGRAMUNIFORM2FVPROC __glewProgramUniform2fv = NULL; -PFNGLPROGRAMUNIFORM2IPROC __glewProgramUniform2i = NULL; -PFNGLPROGRAMUNIFORM2IVPROC __glewProgramUniform2iv = NULL; -PFNGLPROGRAMUNIFORM2UIPROC __glewProgramUniform2ui = NULL; -PFNGLPROGRAMUNIFORM2UIVPROC __glewProgramUniform2uiv = NULL; -PFNGLPROGRAMUNIFORM3DPROC __glewProgramUniform3d = NULL; -PFNGLPROGRAMUNIFORM3DVPROC __glewProgramUniform3dv = NULL; -PFNGLPROGRAMUNIFORM3FPROC __glewProgramUniform3f = NULL; -PFNGLPROGRAMUNIFORM3FVPROC __glewProgramUniform3fv = NULL; -PFNGLPROGRAMUNIFORM3IPROC __glewProgramUniform3i = NULL; -PFNGLPROGRAMUNIFORM3IVPROC __glewProgramUniform3iv = NULL; -PFNGLPROGRAMUNIFORM3UIPROC __glewProgramUniform3ui = NULL; -PFNGLPROGRAMUNIFORM3UIVPROC __glewProgramUniform3uiv = NULL; -PFNGLPROGRAMUNIFORM4DPROC __glewProgramUniform4d = NULL; -PFNGLPROGRAMUNIFORM4DVPROC __glewProgramUniform4dv = NULL; -PFNGLPROGRAMUNIFORM4FPROC __glewProgramUniform4f = NULL; -PFNGLPROGRAMUNIFORM4FVPROC __glewProgramUniform4fv = NULL; -PFNGLPROGRAMUNIFORM4IPROC __glewProgramUniform4i = NULL; -PFNGLPROGRAMUNIFORM4IVPROC __glewProgramUniform4iv = NULL; -PFNGLPROGRAMUNIFORM4UIPROC __glewProgramUniform4ui = NULL; -PFNGLPROGRAMUNIFORM4UIVPROC __glewProgramUniform4uiv = NULL; -PFNGLPROGRAMUNIFORMMATRIX2DVPROC __glewProgramUniformMatrix2dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX2FVPROC __glewProgramUniformMatrix2fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC __glewProgramUniformMatrix2x3dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC __glewProgramUniformMatrix2x3fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC __glewProgramUniformMatrix2x4dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC __glewProgramUniformMatrix2x4fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX3DVPROC __glewProgramUniformMatrix3dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX3FVPROC __glewProgramUniformMatrix3fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC __glewProgramUniformMatrix3x2dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC __glewProgramUniformMatrix3x2fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC __glewProgramUniformMatrix3x4dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC __glewProgramUniformMatrix3x4fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX4DVPROC __glewProgramUniformMatrix4dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX4FVPROC __glewProgramUniformMatrix4fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC __glewProgramUniformMatrix4x2dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC __glewProgramUniformMatrix4x2fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC __glewProgramUniformMatrix4x3dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC __glewProgramUniformMatrix4x3fv = NULL; -PFNGLUSEPROGRAMSTAGESPROC __glewUseProgramStages = NULL; -PFNGLVALIDATEPROGRAMPIPELINEPROC __glewValidateProgramPipeline = NULL; - -PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC __glewGetActiveAtomicCounterBufferiv = NULL; - -PFNGLBINDIMAGETEXTUREPROC __glewBindImageTexture = NULL; -PFNGLMEMORYBARRIERPROC __glewMemoryBarrier = NULL; - -PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB = NULL; -PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB = NULL; -PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB = NULL; -PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB = NULL; -PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB = NULL; -PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB = NULL; -PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB = NULL; -PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB = NULL; -PFNGLGETHANDLEARBPROC __glewGetHandleARB = NULL; -PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB = NULL; -PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB = NULL; -PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB = NULL; -PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB = NULL; -PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB = NULL; -PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB = NULL; -PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB = NULL; -PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB = NULL; -PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB = NULL; -PFNGLUNIFORM1FARBPROC __glewUniform1fARB = NULL; -PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB = NULL; -PFNGLUNIFORM1IARBPROC __glewUniform1iARB = NULL; -PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB = NULL; -PFNGLUNIFORM2FARBPROC __glewUniform2fARB = NULL; -PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB = NULL; -PFNGLUNIFORM2IARBPROC __glewUniform2iARB = NULL; -PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB = NULL; -PFNGLUNIFORM3FARBPROC __glewUniform3fARB = NULL; -PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB = NULL; -PFNGLUNIFORM3IARBPROC __glewUniform3iARB = NULL; -PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB = NULL; -PFNGLUNIFORM4FARBPROC __glewUniform4fARB = NULL; -PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB = NULL; -PFNGLUNIFORM4IARBPROC __glewUniform4iARB = NULL; -PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB = NULL; -PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB = NULL; -PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB = NULL; -PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB = NULL; -PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB = NULL; -PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB = NULL; - -PFNGLSHADERSTORAGEBLOCKBINDINGPROC __glewShaderStorageBlockBinding = NULL; - -PFNGLGETACTIVESUBROUTINENAMEPROC __glewGetActiveSubroutineName = NULL; -PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __glewGetActiveSubroutineUniformName = NULL; -PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC __glewGetActiveSubroutineUniformiv = NULL; -PFNGLGETPROGRAMSTAGEIVPROC __glewGetProgramStageiv = NULL; -PFNGLGETSUBROUTINEINDEXPROC __glewGetSubroutineIndex = NULL; -PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC __glewGetSubroutineUniformLocation = NULL; -PFNGLGETUNIFORMSUBROUTINEUIVPROC __glewGetUniformSubroutineuiv = NULL; -PFNGLUNIFORMSUBROUTINESUIVPROC __glewUniformSubroutinesuiv = NULL; - -PFNGLCOMPILESHADERINCLUDEARBPROC __glewCompileShaderIncludeARB = NULL; -PFNGLDELETENAMEDSTRINGARBPROC __glewDeleteNamedStringARB = NULL; -PFNGLGETNAMEDSTRINGARBPROC __glewGetNamedStringARB = NULL; -PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB = NULL; -PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB = NULL; -PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB = NULL; - -PFNGLBUFFERPAGECOMMITMENTARBPROC __glewBufferPageCommitmentARB = NULL; - -PFNGLTEXPAGECOMMITMENTARBPROC __glewTexPageCommitmentARB = NULL; - -PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync = NULL; -PFNGLDELETESYNCPROC __glewDeleteSync = NULL; -PFNGLFENCESYNCPROC __glewFenceSync = NULL; -PFNGLGETINTEGER64VPROC __glewGetInteger64v = NULL; -PFNGLGETSYNCIVPROC __glewGetSynciv = NULL; -PFNGLISSYNCPROC __glewIsSync = NULL; -PFNGLWAITSYNCPROC __glewWaitSync = NULL; - -PFNGLPATCHPARAMETERFVPROC __glewPatchParameterfv = NULL; -PFNGLPATCHPARAMETERIPROC __glewPatchParameteri = NULL; - -PFNGLTEXTUREBARRIERPROC __glewTextureBarrier = NULL; - -PFNGLTEXBUFFERARBPROC __glewTexBufferARB = NULL; - -PFNGLTEXBUFFERRANGEPROC __glewTexBufferRange = NULL; -PFNGLTEXTUREBUFFERRANGEEXTPROC __glewTextureBufferRangeEXT = NULL; - -PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB = NULL; -PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB = NULL; -PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB = NULL; -PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB = NULL; - -PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv = NULL; -PFNGLSAMPLEMASKIPROC __glewSampleMaski = NULL; -PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample = NULL; -PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample = NULL; - -PFNGLTEXSTORAGE1DPROC __glewTexStorage1D = NULL; -PFNGLTEXSTORAGE2DPROC __glewTexStorage2D = NULL; -PFNGLTEXSTORAGE3DPROC __glewTexStorage3D = NULL; - -PFNGLTEXSTORAGE2DMULTISAMPLEPROC __glewTexStorage2DMultisample = NULL; -PFNGLTEXSTORAGE3DMULTISAMPLEPROC __glewTexStorage3DMultisample = NULL; -PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC __glewTextureStorage2DMultisampleEXT = NULL; -PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC __glewTextureStorage3DMultisampleEXT = NULL; - -PFNGLTEXTUREVIEWPROC __glewTextureView = NULL; - -PFNGLGETQUERYOBJECTI64VPROC __glewGetQueryObjecti64v = NULL; -PFNGLGETQUERYOBJECTUI64VPROC __glewGetQueryObjectui64v = NULL; -PFNGLQUERYCOUNTERPROC __glewQueryCounter = NULL; - -PFNGLBINDTRANSFORMFEEDBACKPROC __glewBindTransformFeedback = NULL; -PFNGLDELETETRANSFORMFEEDBACKSPROC __glewDeleteTransformFeedbacks = NULL; -PFNGLDRAWTRANSFORMFEEDBACKPROC __glewDrawTransformFeedback = NULL; -PFNGLGENTRANSFORMFEEDBACKSPROC __glewGenTransformFeedbacks = NULL; -PFNGLISTRANSFORMFEEDBACKPROC __glewIsTransformFeedback = NULL; -PFNGLPAUSETRANSFORMFEEDBACKPROC __glewPauseTransformFeedback = NULL; -PFNGLRESUMETRANSFORMFEEDBACKPROC __glewResumeTransformFeedback = NULL; - -PFNGLBEGINQUERYINDEXEDPROC __glewBeginQueryIndexed = NULL; -PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC __glewDrawTransformFeedbackStream = NULL; -PFNGLENDQUERYINDEXEDPROC __glewEndQueryIndexed = NULL; -PFNGLGETQUERYINDEXEDIVPROC __glewGetQueryIndexediv = NULL; - -PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC __glewDrawTransformFeedbackInstanced = NULL; -PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC __glewDrawTransformFeedbackStreamInstanced = NULL; - -PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB = NULL; -PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB = NULL; -PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB = NULL; -PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB = NULL; - -PFNGLBINDBUFFERBASEPROC __glewBindBufferBase = NULL; -PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange = NULL; -PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName = NULL; -PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv = NULL; -PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName = NULL; -PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv = NULL; -PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v = NULL; -PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex = NULL; -PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices = NULL; -PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding = NULL; - -PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray = NULL; -PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays = NULL; -PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays = NULL; -PFNGLISVERTEXARRAYPROC __glewIsVertexArray = NULL; - -PFNGLGETVERTEXATTRIBLDVPROC __glewGetVertexAttribLdv = NULL; -PFNGLVERTEXATTRIBL1DPROC __glewVertexAttribL1d = NULL; -PFNGLVERTEXATTRIBL1DVPROC __glewVertexAttribL1dv = NULL; -PFNGLVERTEXATTRIBL2DPROC __glewVertexAttribL2d = NULL; -PFNGLVERTEXATTRIBL2DVPROC __glewVertexAttribL2dv = NULL; -PFNGLVERTEXATTRIBL3DPROC __glewVertexAttribL3d = NULL; -PFNGLVERTEXATTRIBL3DVPROC __glewVertexAttribL3dv = NULL; -PFNGLVERTEXATTRIBL4DPROC __glewVertexAttribL4d = NULL; -PFNGLVERTEXATTRIBL4DVPROC __glewVertexAttribL4dv = NULL; -PFNGLVERTEXATTRIBLPOINTERPROC __glewVertexAttribLPointer = NULL; - -PFNGLBINDVERTEXBUFFERPROC __glewBindVertexBuffer = NULL; -PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC __glewVertexArrayBindVertexBufferEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC __glewVertexArrayVertexAttribBindingEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC __glewVertexArrayVertexAttribFormatEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC __glewVertexArrayVertexAttribIFormatEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC __glewVertexArrayVertexAttribLFormatEXT = NULL; -PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC __glewVertexArrayVertexBindingDivisorEXT = NULL; -PFNGLVERTEXATTRIBBINDINGPROC __glewVertexAttribBinding = NULL; -PFNGLVERTEXATTRIBFORMATPROC __glewVertexAttribFormat = NULL; -PFNGLVERTEXATTRIBIFORMATPROC __glewVertexAttribIFormat = NULL; -PFNGLVERTEXATTRIBLFORMATPROC __glewVertexAttribLFormat = NULL; -PFNGLVERTEXBINDINGDIVISORPROC __glewVertexBindingDivisor = NULL; - -PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB = NULL; -PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB = NULL; -PFNGLWEIGHTBVARBPROC __glewWeightbvARB = NULL; -PFNGLWEIGHTDVARBPROC __glewWeightdvARB = NULL; -PFNGLWEIGHTFVARBPROC __glewWeightfvARB = NULL; -PFNGLWEIGHTIVARBPROC __glewWeightivARB = NULL; -PFNGLWEIGHTSVARBPROC __glewWeightsvARB = NULL; -PFNGLWEIGHTUBVARBPROC __glewWeightubvARB = NULL; -PFNGLWEIGHTUIVARBPROC __glewWeightuivARB = NULL; -PFNGLWEIGHTUSVARBPROC __glewWeightusvARB = NULL; - -PFNGLBINDBUFFERARBPROC __glewBindBufferARB = NULL; -PFNGLBUFFERDATAARBPROC __glewBufferDataARB = NULL; -PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB = NULL; -PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB = NULL; -PFNGLGENBUFFERSARBPROC __glewGenBuffersARB = NULL; -PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB = NULL; -PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB = NULL; -PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB = NULL; -PFNGLISBUFFERARBPROC __glewIsBufferARB = NULL; -PFNGLMAPBUFFERARBPROC __glewMapBufferARB = NULL; -PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB = NULL; - -PFNGLBINDPROGRAMARBPROC __glewBindProgramARB = NULL; -PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB = NULL; -PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB = NULL; -PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB = NULL; -PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB = NULL; -PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB = NULL; -PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB = NULL; -PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB = NULL; -PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB = NULL; -PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB = NULL; -PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB = NULL; -PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB = NULL; -PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB = NULL; -PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB = NULL; -PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB = NULL; -PFNGLISPROGRAMARBPROC __glewIsProgramARB = NULL; -PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB = NULL; -PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB = NULL; -PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB = NULL; -PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB = NULL; -PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB = NULL; -PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB = NULL; -PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB = NULL; -PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB = NULL; -PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB = NULL; -PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB = NULL; -PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB = NULL; -PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB = NULL; -PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB = NULL; -PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB = NULL; -PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB = NULL; -PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB = NULL; -PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB = NULL; -PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB = NULL; -PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB = NULL; -PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB = NULL; -PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB = NULL; -PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB = NULL; -PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB = NULL; -PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB = NULL; -PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB = NULL; -PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB = NULL; -PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB = NULL; -PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB = NULL; -PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB = NULL; -PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB = NULL; -PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB = NULL; -PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB = NULL; -PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB = NULL; -PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB = NULL; -PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB = NULL; -PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB = NULL; -PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB = NULL; -PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB = NULL; -PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB = NULL; -PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB = NULL; -PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB = NULL; -PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB = NULL; - -PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB = NULL; -PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB = NULL; -PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB = NULL; - -PFNGLCOLORP3UIPROC __glewColorP3ui = NULL; -PFNGLCOLORP3UIVPROC __glewColorP3uiv = NULL; -PFNGLCOLORP4UIPROC __glewColorP4ui = NULL; -PFNGLCOLORP4UIVPROC __glewColorP4uiv = NULL; -PFNGLMULTITEXCOORDP1UIPROC __glewMultiTexCoordP1ui = NULL; -PFNGLMULTITEXCOORDP1UIVPROC __glewMultiTexCoordP1uiv = NULL; -PFNGLMULTITEXCOORDP2UIPROC __glewMultiTexCoordP2ui = NULL; -PFNGLMULTITEXCOORDP2UIVPROC __glewMultiTexCoordP2uiv = NULL; -PFNGLMULTITEXCOORDP3UIPROC __glewMultiTexCoordP3ui = NULL; -PFNGLMULTITEXCOORDP3UIVPROC __glewMultiTexCoordP3uiv = NULL; -PFNGLMULTITEXCOORDP4UIPROC __glewMultiTexCoordP4ui = NULL; -PFNGLMULTITEXCOORDP4UIVPROC __glewMultiTexCoordP4uiv = NULL; -PFNGLNORMALP3UIPROC __glewNormalP3ui = NULL; -PFNGLNORMALP3UIVPROC __glewNormalP3uiv = NULL; -PFNGLSECONDARYCOLORP3UIPROC __glewSecondaryColorP3ui = NULL; -PFNGLSECONDARYCOLORP3UIVPROC __glewSecondaryColorP3uiv = NULL; -PFNGLTEXCOORDP1UIPROC __glewTexCoordP1ui = NULL; -PFNGLTEXCOORDP1UIVPROC __glewTexCoordP1uiv = NULL; -PFNGLTEXCOORDP2UIPROC __glewTexCoordP2ui = NULL; -PFNGLTEXCOORDP2UIVPROC __glewTexCoordP2uiv = NULL; -PFNGLTEXCOORDP3UIPROC __glewTexCoordP3ui = NULL; -PFNGLTEXCOORDP3UIVPROC __glewTexCoordP3uiv = NULL; -PFNGLTEXCOORDP4UIPROC __glewTexCoordP4ui = NULL; -PFNGLTEXCOORDP4UIVPROC __glewTexCoordP4uiv = NULL; -PFNGLVERTEXATTRIBP1UIPROC __glewVertexAttribP1ui = NULL; -PFNGLVERTEXATTRIBP1UIVPROC __glewVertexAttribP1uiv = NULL; -PFNGLVERTEXATTRIBP2UIPROC __glewVertexAttribP2ui = NULL; -PFNGLVERTEXATTRIBP2UIVPROC __glewVertexAttribP2uiv = NULL; -PFNGLVERTEXATTRIBP3UIPROC __glewVertexAttribP3ui = NULL; -PFNGLVERTEXATTRIBP3UIVPROC __glewVertexAttribP3uiv = NULL; -PFNGLVERTEXATTRIBP4UIPROC __glewVertexAttribP4ui = NULL; -PFNGLVERTEXATTRIBP4UIVPROC __glewVertexAttribP4uiv = NULL; -PFNGLVERTEXP2UIPROC __glewVertexP2ui = NULL; -PFNGLVERTEXP2UIVPROC __glewVertexP2uiv = NULL; -PFNGLVERTEXP3UIPROC __glewVertexP3ui = NULL; -PFNGLVERTEXP3UIVPROC __glewVertexP3uiv = NULL; -PFNGLVERTEXP4UIPROC __glewVertexP4ui = NULL; -PFNGLVERTEXP4UIVPROC __glewVertexP4uiv = NULL; - -PFNGLDEPTHRANGEARRAYVPROC __glewDepthRangeArrayv = NULL; -PFNGLDEPTHRANGEINDEXEDPROC __glewDepthRangeIndexed = NULL; -PFNGLGETDOUBLEI_VPROC __glewGetDoublei_v = NULL; -PFNGLGETFLOATI_VPROC __glewGetFloati_v = NULL; -PFNGLSCISSORARRAYVPROC __glewScissorArrayv = NULL; -PFNGLSCISSORINDEXEDPROC __glewScissorIndexed = NULL; -PFNGLSCISSORINDEXEDVPROC __glewScissorIndexedv = NULL; -PFNGLVIEWPORTARRAYVPROC __glewViewportArrayv = NULL; -PFNGLVIEWPORTINDEXEDFPROC __glewViewportIndexedf = NULL; -PFNGLVIEWPORTINDEXEDFVPROC __glewViewportIndexedfv = NULL; - -PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB = NULL; -PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB = NULL; -PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB = NULL; -PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB = NULL; -PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB = NULL; -PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB = NULL; -PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB = NULL; -PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB = NULL; -PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB = NULL; -PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB = NULL; -PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB = NULL; -PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB = NULL; -PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB = NULL; -PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB = NULL; -PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB = NULL; -PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB = NULL; - -PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI = NULL; - -PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI = NULL; -PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI = NULL; -PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI = NULL; - -PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI = NULL; -PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI = NULL; -PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI = NULL; -PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI = NULL; - -PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI = NULL; -PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI = NULL; -PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI = NULL; -PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI = NULL; -PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI = NULL; -PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI = NULL; -PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI = NULL; -PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI = NULL; -PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI = NULL; -PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI = NULL; -PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI = NULL; -PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI = NULL; -PFNGLSAMPLEMAPATIPROC __glewSampleMapATI = NULL; -PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI = NULL; - -PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI = NULL; -PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI = NULL; - -PFNGLPNTRIANGLESFATIPROC __glewPNTrianglesfATI = NULL; -PFNGLPNTRIANGLESIATIPROC __glewPNTrianglesiATI = NULL; - -PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI = NULL; -PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI = NULL; - -PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI = NULL; -PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI = NULL; -PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI = NULL; -PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI = NULL; -PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI = NULL; -PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI = NULL; -PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI = NULL; -PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI = NULL; -PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI = NULL; -PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI = NULL; -PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI = NULL; -PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI = NULL; - -PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI = NULL; -PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI = NULL; -PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI = NULL; - -PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI = NULL; -PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI = NULL; -PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI = NULL; -PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI = NULL; -PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI = NULL; -PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI = NULL; -PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI = NULL; -PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI = NULL; -PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI = NULL; -PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI = NULL; -PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI = NULL; -PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI = NULL; -PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI = NULL; -PFNGLVERTEXSTREAM1DATIPROC __glewVertexStream1dATI = NULL; -PFNGLVERTEXSTREAM1DVATIPROC __glewVertexStream1dvATI = NULL; -PFNGLVERTEXSTREAM1FATIPROC __glewVertexStream1fATI = NULL; -PFNGLVERTEXSTREAM1FVATIPROC __glewVertexStream1fvATI = NULL; -PFNGLVERTEXSTREAM1IATIPROC __glewVertexStream1iATI = NULL; -PFNGLVERTEXSTREAM1IVATIPROC __glewVertexStream1ivATI = NULL; -PFNGLVERTEXSTREAM1SATIPROC __glewVertexStream1sATI = NULL; -PFNGLVERTEXSTREAM1SVATIPROC __glewVertexStream1svATI = NULL; -PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI = NULL; -PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI = NULL; -PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI = NULL; -PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI = NULL; -PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI = NULL; -PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI = NULL; -PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI = NULL; -PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI = NULL; -PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI = NULL; -PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI = NULL; -PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI = NULL; -PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI = NULL; -PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI = NULL; -PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI = NULL; -PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI = NULL; -PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI = NULL; -PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI = NULL; -PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI = NULL; -PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI = NULL; -PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI = NULL; -PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI = NULL; -PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI = NULL; -PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI = NULL; -PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI = NULL; - -PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC __glewEGLImageTargetTexStorageEXT = NULL; -PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC __glewEGLImageTargetTextureStorageEXT = NULL; - -PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC __glewDrawArraysInstancedBaseInstanceEXT = NULL; -PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC __glewDrawElementsInstancedBaseInstanceEXT = NULL; -PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC __glewDrawElementsInstancedBaseVertexBaseInstanceEXT = NULL; - -PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT = NULL; -PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT = NULL; -PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT = NULL; - -PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT = NULL; - -PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT = NULL; - -PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC __glewBindFragDataLocationIndexedEXT = NULL; -PFNGLGETFRAGDATAINDEXEXTPROC __glewGetFragDataIndexEXT = NULL; -PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC __glewGetProgramResourceLocationIndexEXT = NULL; - -PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT = NULL; - -PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT = NULL; - -PFNGLBUFFERSTORAGEEXTPROC __glewBufferStorageEXT = NULL; -PFNGLNAMEDBUFFERSTORAGEEXTPROC __glewNamedBufferStorageEXT = NULL; - -PFNGLCLEARTEXIMAGEEXTPROC __glewClearTexImageEXT = NULL; -PFNGLCLEARTEXSUBIMAGEEXTPROC __glewClearTexSubImageEXT = NULL; - -PFNGLCLIPCONTROLEXTPROC __glewClipControlEXT = NULL; - -PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT = NULL; -PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT = NULL; - -PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT = NULL; -PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT = NULL; - -PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT = NULL; -PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT = NULL; -PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT = NULL; -PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT = NULL; -PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT = NULL; -PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT = NULL; -PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT = NULL; -PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT = NULL; -PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT = NULL; -PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT = NULL; -PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT = NULL; -PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT = NULL; -PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT = NULL; - -PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT = NULL; -PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT = NULL; - -PFNGLCOPYIMAGESUBDATAEXTPROC __glewCopyImageSubDataEXT = NULL; - -PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT = NULL; -PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT = NULL; -PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT = NULL; -PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT = NULL; -PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT = NULL; - -PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT = NULL; -PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT = NULL; - -PFNGLGETOBJECTLABELEXTPROC __glewGetObjectLabelEXT = NULL; -PFNGLLABELOBJECTEXTPROC __glewLabelObjectEXT = NULL; - -PFNGLINSERTEVENTMARKEREXTPROC __glewInsertEventMarkerEXT = NULL; -PFNGLPOPGROUPMARKEREXTPROC __glewPopGroupMarkerEXT = NULL; -PFNGLPUSHGROUPMARKEREXTPROC __glewPushGroupMarkerEXT = NULL; - -PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT = NULL; - -PFNGLBINDMULTITEXTUREEXTPROC __glewBindMultiTextureEXT = NULL; -PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __glewCheckNamedFramebufferStatusEXT = NULL; -PFNGLCLIENTATTRIBDEFAULTEXTPROC __glewClientAttribDefaultEXT = NULL; -PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __glewCompressedMultiTexImage1DEXT = NULL; -PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __glewCompressedMultiTexImage2DEXT = NULL; -PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __glewCompressedMultiTexImage3DEXT = NULL; -PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __glewCompressedMultiTexSubImage1DEXT = NULL; -PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __glewCompressedMultiTexSubImage2DEXT = NULL; -PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __glewCompressedMultiTexSubImage3DEXT = NULL; -PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __glewCompressedTextureImage1DEXT = NULL; -PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __glewCompressedTextureImage2DEXT = NULL; -PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __glewCompressedTextureImage3DEXT = NULL; -PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __glewCompressedTextureSubImage1DEXT = NULL; -PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __glewCompressedTextureSubImage2DEXT = NULL; -PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __glewCompressedTextureSubImage3DEXT = NULL; -PFNGLCOPYMULTITEXIMAGE1DEXTPROC __glewCopyMultiTexImage1DEXT = NULL; -PFNGLCOPYMULTITEXIMAGE2DEXTPROC __glewCopyMultiTexImage2DEXT = NULL; -PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC __glewCopyMultiTexSubImage1DEXT = NULL; -PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC __glewCopyMultiTexSubImage2DEXT = NULL; -PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC __glewCopyMultiTexSubImage3DEXT = NULL; -PFNGLCOPYTEXTUREIMAGE1DEXTPROC __glewCopyTextureImage1DEXT = NULL; -PFNGLCOPYTEXTUREIMAGE2DEXTPROC __glewCopyTextureImage2DEXT = NULL; -PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT = NULL; -PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT = NULL; -PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT = NULL; -PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT = NULL; -PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT = NULL; -PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT = NULL; -PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT = NULL; -PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT = NULL; -PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT = NULL; -PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT = NULL; -PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT = NULL; -PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT = NULL; -PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT = NULL; -PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT = NULL; -PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT = NULL; -PFNGLGENERATEMULTITEXMIPMAPEXTPROC __glewGenerateMultiTexMipmapEXT = NULL; -PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT = NULL; -PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT = NULL; -PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT = NULL; -PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT = NULL; -PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT = NULL; -PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT = NULL; -PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT = NULL; -PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT = NULL; -PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT = NULL; -PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT = NULL; -PFNGLGETMULTITEXGENDVEXTPROC __glewGetMultiTexGendvEXT = NULL; -PFNGLGETMULTITEXGENFVEXTPROC __glewGetMultiTexGenfvEXT = NULL; -PFNGLGETMULTITEXGENIVEXTPROC __glewGetMultiTexGenivEXT = NULL; -PFNGLGETMULTITEXIMAGEEXTPROC __glewGetMultiTexImageEXT = NULL; -PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC __glewGetMultiTexLevelParameterfvEXT = NULL; -PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC __glewGetMultiTexLevelParameterivEXT = NULL; -PFNGLGETMULTITEXPARAMETERIIVEXTPROC __glewGetMultiTexParameterIivEXT = NULL; -PFNGLGETMULTITEXPARAMETERIUIVEXTPROC __glewGetMultiTexParameterIuivEXT = NULL; -PFNGLGETMULTITEXPARAMETERFVEXTPROC __glewGetMultiTexParameterfvEXT = NULL; -PFNGLGETMULTITEXPARAMETERIVEXTPROC __glewGetMultiTexParameterivEXT = NULL; -PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC __glewGetNamedBufferParameterivEXT = NULL; -PFNGLGETNAMEDBUFFERPOINTERVEXTPROC __glewGetNamedBufferPointervEXT = NULL; -PFNGLGETNAMEDBUFFERSUBDATAEXTPROC __glewGetNamedBufferSubDataEXT = NULL; -PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetNamedFramebufferAttachmentParameterivEXT = NULL; -PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __glewGetNamedProgramLocalParameterIivEXT = NULL; -PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __glewGetNamedProgramLocalParameterIuivEXT = NULL; -PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __glewGetNamedProgramLocalParameterdvEXT = NULL; -PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __glewGetNamedProgramLocalParameterfvEXT = NULL; -PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT = NULL; -PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT = NULL; -PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT = NULL; -PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT = NULL; -PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT = NULL; -PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT = NULL; -PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT = NULL; -PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT = NULL; -PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT = NULL; -PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT = NULL; -PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT = NULL; -PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT = NULL; -PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT = NULL; -PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT = NULL; -PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT = NULL; -PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT = NULL; -PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT = NULL; -PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT = NULL; -PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT = NULL; -PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT = NULL; -PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT = NULL; -PFNGLMATRIXLOADTRANSPOSEFEXTPROC __glewMatrixLoadTransposefEXT = NULL; -PFNGLMATRIXLOADDEXTPROC __glewMatrixLoaddEXT = NULL; -PFNGLMATRIXLOADFEXTPROC __glewMatrixLoadfEXT = NULL; -PFNGLMATRIXMULTTRANSPOSEDEXTPROC __glewMatrixMultTransposedEXT = NULL; -PFNGLMATRIXMULTTRANSPOSEFEXTPROC __glewMatrixMultTransposefEXT = NULL; -PFNGLMATRIXMULTDEXTPROC __glewMatrixMultdEXT = NULL; -PFNGLMATRIXMULTFEXTPROC __glewMatrixMultfEXT = NULL; -PFNGLMATRIXORTHOEXTPROC __glewMatrixOrthoEXT = NULL; -PFNGLMATRIXPOPEXTPROC __glewMatrixPopEXT = NULL; -PFNGLMATRIXPUSHEXTPROC __glewMatrixPushEXT = NULL; -PFNGLMATRIXROTATEDEXTPROC __glewMatrixRotatedEXT = NULL; -PFNGLMATRIXROTATEFEXTPROC __glewMatrixRotatefEXT = NULL; -PFNGLMATRIXSCALEDEXTPROC __glewMatrixScaledEXT = NULL; -PFNGLMATRIXSCALEFEXTPROC __glewMatrixScalefEXT = NULL; -PFNGLMATRIXTRANSLATEDEXTPROC __glewMatrixTranslatedEXT = NULL; -PFNGLMATRIXTRANSLATEFEXTPROC __glewMatrixTranslatefEXT = NULL; -PFNGLMULTITEXBUFFEREXTPROC __glewMultiTexBufferEXT = NULL; -PFNGLMULTITEXCOORDPOINTEREXTPROC __glewMultiTexCoordPointerEXT = NULL; -PFNGLMULTITEXENVFEXTPROC __glewMultiTexEnvfEXT = NULL; -PFNGLMULTITEXENVFVEXTPROC __glewMultiTexEnvfvEXT = NULL; -PFNGLMULTITEXENVIEXTPROC __glewMultiTexEnviEXT = NULL; -PFNGLMULTITEXENVIVEXTPROC __glewMultiTexEnvivEXT = NULL; -PFNGLMULTITEXGENDEXTPROC __glewMultiTexGendEXT = NULL; -PFNGLMULTITEXGENDVEXTPROC __glewMultiTexGendvEXT = NULL; -PFNGLMULTITEXGENFEXTPROC __glewMultiTexGenfEXT = NULL; -PFNGLMULTITEXGENFVEXTPROC __glewMultiTexGenfvEXT = NULL; -PFNGLMULTITEXGENIEXTPROC __glewMultiTexGeniEXT = NULL; -PFNGLMULTITEXGENIVEXTPROC __glewMultiTexGenivEXT = NULL; -PFNGLMULTITEXIMAGE1DEXTPROC __glewMultiTexImage1DEXT = NULL; -PFNGLMULTITEXIMAGE2DEXTPROC __glewMultiTexImage2DEXT = NULL; -PFNGLMULTITEXIMAGE3DEXTPROC __glewMultiTexImage3DEXT = NULL; -PFNGLMULTITEXPARAMETERIIVEXTPROC __glewMultiTexParameterIivEXT = NULL; -PFNGLMULTITEXPARAMETERIUIVEXTPROC __glewMultiTexParameterIuivEXT = NULL; -PFNGLMULTITEXPARAMETERFEXTPROC __glewMultiTexParameterfEXT = NULL; -PFNGLMULTITEXPARAMETERFVEXTPROC __glewMultiTexParameterfvEXT = NULL; -PFNGLMULTITEXPARAMETERIEXTPROC __glewMultiTexParameteriEXT = NULL; -PFNGLMULTITEXPARAMETERIVEXTPROC __glewMultiTexParameterivEXT = NULL; -PFNGLMULTITEXRENDERBUFFEREXTPROC __glewMultiTexRenderbufferEXT = NULL; -PFNGLMULTITEXSUBIMAGE1DEXTPROC __glewMultiTexSubImage1DEXT = NULL; -PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT = NULL; -PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT = NULL; -PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT = NULL; -PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT = NULL; -PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT = NULL; -PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __glewNamedFramebufferTexture3DEXT = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __glewNamedFramebufferTextureEXT = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __glewNamedFramebufferTextureFaceEXT = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __glewNamedFramebufferTextureLayerEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __glewNamedProgramLocalParameter4dEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __glewNamedProgramLocalParameter4dvEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __glewNamedProgramLocalParameter4fEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __glewNamedProgramLocalParameter4fvEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __glewNamedProgramLocalParameterI4iEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __glewNamedProgramLocalParameterI4ivEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __glewNamedProgramLocalParameterI4uiEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __glewNamedProgramLocalParameterI4uivEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __glewNamedProgramLocalParameters4fvEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __glewNamedProgramLocalParametersI4ivEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __glewNamedProgramLocalParametersI4uivEXT = NULL; -PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT = NULL; -PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT = NULL; -PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT = NULL; -PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT = NULL; -PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT = NULL; -PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT = NULL; -PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT = NULL; -PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT = NULL; -PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT = NULL; -PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT = NULL; -PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT = NULL; -PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT = NULL; -PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT = NULL; -PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT = NULL; -PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT = NULL; -PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT = NULL; -PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT = NULL; -PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT = NULL; -PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT = NULL; -PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT = NULL; -PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT = NULL; -PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT = NULL; -PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT = NULL; -PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT = NULL; -PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT = NULL; -PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT = NULL; -PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT = NULL; -PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT = NULL; -PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT = NULL; -PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT = NULL; -PFNGLTEXTUREIMAGE1DEXTPROC __glewTextureImage1DEXT = NULL; -PFNGLTEXTUREIMAGE2DEXTPROC __glewTextureImage2DEXT = NULL; -PFNGLTEXTUREIMAGE3DEXTPROC __glewTextureImage3DEXT = NULL; -PFNGLTEXTUREPARAMETERIIVEXTPROC __glewTextureParameterIivEXT = NULL; -PFNGLTEXTUREPARAMETERIUIVEXTPROC __glewTextureParameterIuivEXT = NULL; -PFNGLTEXTUREPARAMETERFEXTPROC __glewTextureParameterfEXT = NULL; -PFNGLTEXTUREPARAMETERFVEXTPROC __glewTextureParameterfvEXT = NULL; -PFNGLTEXTUREPARAMETERIEXTPROC __glewTextureParameteriEXT = NULL; -PFNGLTEXTUREPARAMETERIVEXTPROC __glewTextureParameterivEXT = NULL; -PFNGLTEXTURERENDERBUFFEREXTPROC __glewTextureRenderbufferEXT = NULL; -PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT = NULL; -PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT = NULL; -PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT = NULL; -PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT = NULL; -PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT = NULL; -PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT = NULL; -PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT = NULL; -PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT = NULL; -PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT = NULL; -PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT = NULL; -PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT = NULL; -PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC __glewVertexArrayVertexAttribDivisorEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT = NULL; -PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT = NULL; - -PFNGLDISCARDFRAMEBUFFEREXTPROC __glewDiscardFramebufferEXT = NULL; - -PFNGLBEGINQUERYEXTPROC __glewBeginQueryEXT = NULL; -PFNGLDELETEQUERIESEXTPROC __glewDeleteQueriesEXT = NULL; -PFNGLENDQUERYEXTPROC __glewEndQueryEXT = NULL; -PFNGLGENQUERIESEXTPROC __glewGenQueriesEXT = NULL; -PFNGLGETINTEGER64VEXTPROC __glewGetInteger64vEXT = NULL; -PFNGLGETQUERYOBJECTIVEXTPROC __glewGetQueryObjectivEXT = NULL; -PFNGLGETQUERYOBJECTUIVEXTPROC __glewGetQueryObjectuivEXT = NULL; -PFNGLGETQUERYIVEXTPROC __glewGetQueryivEXT = NULL; -PFNGLISQUERYEXTPROC __glewIsQueryEXT = NULL; -PFNGLQUERYCOUNTEREXTPROC __glewQueryCounterEXT = NULL; - -PFNGLDRAWBUFFERSEXTPROC __glewDrawBuffersEXT = NULL; - -PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT = NULL; -PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT = NULL; -PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT = NULL; -PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT = NULL; -PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT = NULL; -PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT = NULL; - -PFNGLBLENDEQUATIONSEPARATEIEXTPROC __glewBlendEquationSeparateiEXT = NULL; -PFNGLBLENDEQUATIONIEXTPROC __glewBlendEquationiEXT = NULL; -PFNGLBLENDFUNCSEPARATEIEXTPROC __glewBlendFuncSeparateiEXT = NULL; -PFNGLBLENDFUNCIEXTPROC __glewBlendFunciEXT = NULL; -PFNGLCOLORMASKIEXTPROC __glewColorMaskiEXT = NULL; -PFNGLDISABLEIEXTPROC __glewDisableiEXT = NULL; -PFNGLENABLEIEXTPROC __glewEnableiEXT = NULL; -PFNGLISENABLEDIEXTPROC __glewIsEnablediEXT = NULL; - -PFNGLDRAWELEMENTSBASEVERTEXEXTPROC __glewDrawElementsBaseVertexEXT = NULL; -PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC __glewDrawElementsInstancedBaseVertexEXT = NULL; -PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC __glewDrawRangeElementsBaseVertexEXT = NULL; -PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC __glewMultiDrawElementsBaseVertexEXT = NULL; - -PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT = NULL; -PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT = NULL; - -PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT = NULL; - -PFNGLDRAWTRANSFORMFEEDBACKEXTPROC __glewDrawTransformFeedbackEXT = NULL; -PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDEXTPROC __glewDrawTransformFeedbackInstancedEXT = NULL; - -PFNGLBUFFERSTORAGEEXTERNALEXTPROC __glewBufferStorageExternalEXT = NULL; -PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC __glewNamedBufferStorageExternalEXT = NULL; - -PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT = NULL; -PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT = NULL; -PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT = NULL; -PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT = NULL; -PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT = NULL; - -PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT = NULL; -PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT = NULL; -PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT = NULL; -PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT = NULL; -PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT = NULL; -PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT = NULL; -PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT = NULL; -PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT = NULL; -PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT = NULL; -PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT = NULL; -PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT = NULL; -PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT = NULL; -PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT = NULL; -PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT = NULL; -PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT = NULL; -PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT = NULL; -PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT = NULL; -PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT = NULL; - -PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT = NULL; - -PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT = NULL; - -PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT = NULL; -PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT = NULL; -PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT = NULL; -PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT = NULL; -PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT = NULL; -PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT = NULL; -PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT = NULL; -PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT = NULL; -PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT = NULL; -PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT = NULL; -PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT = NULL; -PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT = NULL; -PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT = NULL; -PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT = NULL; -PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT = NULL; -PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT = NULL; -PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT = NULL; - -PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT = NULL; -PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT = NULL; -PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT = NULL; - -PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT = NULL; -PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT = NULL; - -PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT = NULL; -PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT = NULL; -PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT = NULL; -PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT = NULL; -PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT = NULL; -PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT = NULL; -PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT = NULL; -PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT = NULL; -PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT = NULL; -PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT = NULL; -PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT = NULL; -PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT = NULL; -PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT = NULL; -PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT = NULL; -PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT = NULL; -PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT = NULL; -PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT = NULL; -PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT = NULL; -PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT = NULL; -PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT = NULL; -PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT = NULL; -PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT = NULL; -PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT = NULL; -PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT = NULL; -PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT = NULL; -PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT = NULL; -PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT = NULL; -PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT = NULL; -PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT = NULL; -PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT = NULL; -PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT = NULL; -PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT = NULL; -PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT = NULL; -PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT = NULL; - -PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT = NULL; -PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT = NULL; -PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT = NULL; -PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT = NULL; -PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT = NULL; -PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT = NULL; -PFNGLHISTOGRAMEXTPROC __glewHistogramEXT = NULL; -PFNGLMINMAXEXTPROC __glewMinmaxEXT = NULL; -PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT = NULL; -PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT = NULL; - -PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT = NULL; - -PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT = NULL; - -PFNGLVERTEXATTRIBDIVISOREXTPROC __glewVertexAttribDivisorEXT = NULL; - -PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT = NULL; -PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT = NULL; -PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT = NULL; - -PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC __glewFlushMappedBufferRangeEXT = NULL; -PFNGLMAPBUFFERRANGEEXTPROC __glewMapBufferRangeEXT = NULL; - -PFNGLBUFFERSTORAGEMEMEXTPROC __glewBufferStorageMemEXT = NULL; -PFNGLCREATEMEMORYOBJECTSEXTPROC __glewCreateMemoryObjectsEXT = NULL; -PFNGLDELETEMEMORYOBJECTSEXTPROC __glewDeleteMemoryObjectsEXT = NULL; -PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC __glewGetMemoryObjectParameterivEXT = NULL; -PFNGLGETUNSIGNEDBYTEI_VEXTPROC __glewGetUnsignedBytei_vEXT = NULL; -PFNGLGETUNSIGNEDBYTEVEXTPROC __glewGetUnsignedBytevEXT = NULL; -PFNGLISMEMORYOBJECTEXTPROC __glewIsMemoryObjectEXT = NULL; -PFNGLMEMORYOBJECTPARAMETERIVEXTPROC __glewMemoryObjectParameterivEXT = NULL; -PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC __glewNamedBufferStorageMemEXT = NULL; -PFNGLTEXSTORAGEMEM1DEXTPROC __glewTexStorageMem1DEXT = NULL; -PFNGLTEXSTORAGEMEM2DEXTPROC __glewTexStorageMem2DEXT = NULL; -PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC __glewTexStorageMem2DMultisampleEXT = NULL; -PFNGLTEXSTORAGEMEM3DEXTPROC __glewTexStorageMem3DEXT = NULL; -PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC __glewTexStorageMem3DMultisampleEXT = NULL; -PFNGLTEXTURESTORAGEMEM1DEXTPROC __glewTextureStorageMem1DEXT = NULL; -PFNGLTEXTURESTORAGEMEM2DEXTPROC __glewTextureStorageMem2DEXT = NULL; -PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC __glewTextureStorageMem2DMultisampleEXT = NULL; -PFNGLTEXTURESTORAGEMEM3DEXTPROC __glewTextureStorageMem3DEXT = NULL; -PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC __glewTextureStorageMem3DMultisampleEXT = NULL; - -PFNGLIMPORTMEMORYFDEXTPROC __glewImportMemoryFdEXT = NULL; - -PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC __glewImportMemoryWin32HandleEXT = NULL; -PFNGLIMPORTMEMORYWIN32NAMEEXTPROC __glewImportMemoryWin32NameEXT = NULL; - -PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT = NULL; -PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT = NULL; - -PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC __glewMultiDrawArraysIndirectEXT = NULL; -PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC __glewMultiDrawElementsIndirectEXT = NULL; - -PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT = NULL; -PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT = NULL; - -PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC __glewFramebufferTexture2DMultisampleEXT = NULL; - -PFNGLDRAWBUFFERSINDEXEDEXTPROC __glewDrawBuffersIndexedEXT = NULL; -PFNGLGETINTEGERI_VEXTPROC __glewGetIntegeri_vEXT = NULL; -PFNGLREADBUFFERINDEXEDEXTPROC __glewReadBufferIndexedEXT = NULL; - -PFNGLCOLORTABLEEXTPROC __glewColorTableEXT = NULL; -PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT = NULL; -PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT = NULL; -PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT = NULL; - -PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT = NULL; -PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT = NULL; -PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT = NULL; -PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT = NULL; -PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT = NULL; -PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT = NULL; - -PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT = NULL; -PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT = NULL; - -PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT = NULL; - -PFNGLPOLYGONOFFSETCLAMPEXTPROC __glewPolygonOffsetClampEXT = NULL; - -PFNGLPRIMITIVEBOUNDINGBOXEXTPROC __glewPrimitiveBoundingBoxEXT = NULL; - -PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT = NULL; - -PFNGLCOVERAGEMODULATIONNVPROC __glewCoverageModulationNV = NULL; -PFNGLCOVERAGEMODULATIONTABLENVPROC __glewCoverageModulationTableNV = NULL; -PFNGLGETCOVERAGEMODULATIONTABLENVPROC __glewGetCoverageModulationTableNV = NULL; -PFNGLRASTERSAMPLESEXTPROC __glewRasterSamplesEXT = NULL; - -PFNGLGETNUNIFORMFVEXTPROC __glewGetnUniformfvEXT = NULL; -PFNGLGETNUNIFORMIVEXTPROC __glewGetnUniformivEXT = NULL; -PFNGLREADNPIXELSEXTPROC __glewReadnPixelsEXT = NULL; - -PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT = NULL; -PFNGLENDSCENEEXTPROC __glewEndSceneEXT = NULL; - -PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT = NULL; -PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT = NULL; -PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT = NULL; -PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT = NULL; -PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT = NULL; -PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT = NULL; -PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT = NULL; -PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT = NULL; -PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT = NULL; -PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT = NULL; -PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT = NULL; -PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT = NULL; -PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT = NULL; -PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT = NULL; -PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT = NULL; -PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT = NULL; -PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT = NULL; - -PFNGLDELETESEMAPHORESEXTPROC __glewDeleteSemaphoresEXT = NULL; -PFNGLGENSEMAPHORESEXTPROC __glewGenSemaphoresEXT = NULL; -PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC __glewGetSemaphoreParameterui64vEXT = NULL; -PFNGLISSEMAPHOREEXTPROC __glewIsSemaphoreEXT = NULL; -PFNGLSEMAPHOREPARAMETERUI64VEXTPROC __glewSemaphoreParameterui64vEXT = NULL; -PFNGLSIGNALSEMAPHOREEXTPROC __glewSignalSemaphoreEXT = NULL; -PFNGLWAITSEMAPHOREEXTPROC __glewWaitSemaphoreEXT = NULL; - -PFNGLIMPORTSEMAPHOREFDEXTPROC __glewImportSemaphoreFdEXT = NULL; - -PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC __glewImportSemaphoreWin32HandleEXT = NULL; -PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC __glewImportSemaphoreWin32NameEXT = NULL; - -PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT = NULL; -PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT = NULL; -PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT = NULL; - -PFNGLFRAMEBUFFERFETCHBARRIEREXTPROC __glewFramebufferFetchBarrierEXT = NULL; - -PFNGLBINDIMAGETEXTUREEXTPROC __glewBindImageTextureEXT = NULL; -PFNGLMEMORYBARRIEREXTPROC __glewMemoryBarrierEXT = NULL; - -PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC __glewClearPixelLocalStorageuiEXT = NULL; -PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __glewFramebufferPixelLocalStorageSizeEXT = NULL; -PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __glewGetFramebufferPixelLocalStorageSizeEXT = NULL; - -PFNGLTEXPAGECOMMITMENTEXTPROC __glewTexPageCommitmentEXT = NULL; -PFNGLTEXTUREPAGECOMMITMENTEXTPROC __glewTexturePageCommitmentEXT = NULL; - -PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT = NULL; - -PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT = NULL; -PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT = NULL; -PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT = NULL; - -PFNGLPATCHPARAMETERIEXTPROC __glewPatchParameteriEXT = NULL; - -PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT = NULL; - -PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT = NULL; - -PFNGLGETSAMPLERPARAMETERIIVEXTPROC __glewGetSamplerParameterIivEXT = NULL; -PFNGLGETSAMPLERPARAMETERIUIVEXTPROC __glewGetSamplerParameterIuivEXT = NULL; -PFNGLSAMPLERPARAMETERIIVEXTPROC __glewSamplerParameterIivEXT = NULL; -PFNGLSAMPLERPARAMETERIUIVEXTPROC __glewSamplerParameterIuivEXT = NULL; - -PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT = NULL; - -PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT = NULL; -PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT = NULL; -PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT = NULL; -PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT = NULL; -PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT = NULL; -PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT = NULL; - -PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT = NULL; -PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT = NULL; -PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT = NULL; -PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT = NULL; -PFNGLISTEXTUREEXTPROC __glewIsTextureEXT = NULL; -PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT = NULL; - -PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT = NULL; - -PFNGLTEXSTORAGE1DEXTPROC __glewTexStorage1DEXT = NULL; -PFNGLTEXSTORAGE2DEXTPROC __glewTexStorage2DEXT = NULL; -PFNGLTEXSTORAGE3DEXTPROC __glewTexStorage3DEXT = NULL; -PFNGLTEXTURESTORAGE1DEXTPROC __glewTextureStorage1DEXT = NULL; -PFNGLTEXTURESTORAGE2DEXTPROC __glewTextureStorage2DEXT = NULL; -PFNGLTEXTURESTORAGE3DEXTPROC __glewTextureStorage3DEXT = NULL; - -PFNGLTEXTUREVIEWEXTPROC __glewTextureViewEXT = NULL; - -PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT = NULL; -PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT = NULL; - -PFNGLBEGINTRANSFORMFEEDBACKEXTPROC __glewBeginTransformFeedbackEXT = NULL; -PFNGLBINDBUFFERBASEEXTPROC __glewBindBufferBaseEXT = NULL; -PFNGLBINDBUFFEROFFSETEXTPROC __glewBindBufferOffsetEXT = NULL; -PFNGLBINDBUFFERRANGEEXTPROC __glewBindBufferRangeEXT = NULL; -PFNGLENDTRANSFORMFEEDBACKEXTPROC __glewEndTransformFeedbackEXT = NULL; -PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC __glewGetTransformFeedbackVaryingEXT = NULL; -PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC __glewTransformFeedbackVaryingsEXT = NULL; - -PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT = NULL; -PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT = NULL; -PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT = NULL; -PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT = NULL; -PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT = NULL; -PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT = NULL; -PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT = NULL; -PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT = NULL; - -PFNGLBINDARRAYSETEXTPROC __glewBindArraySetEXT = NULL; -PFNGLCREATEARRAYSETEXTPROC __glewCreateArraySetExt = NULL; -PFNGLDELETEARRAYSETSEXTPROC __glewDeleteArraySetsEXT = NULL; - -PFNGLGETVERTEXATTRIBLDVEXTPROC __glewGetVertexAttribLdvEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __glewVertexArrayVertexAttribLOffsetEXT = NULL; -PFNGLVERTEXATTRIBL1DEXTPROC __glewVertexAttribL1dEXT = NULL; -PFNGLVERTEXATTRIBL1DVEXTPROC __glewVertexAttribL1dvEXT = NULL; -PFNGLVERTEXATTRIBL2DEXTPROC __glewVertexAttribL2dEXT = NULL; -PFNGLVERTEXATTRIBL2DVEXTPROC __glewVertexAttribL2dvEXT = NULL; -PFNGLVERTEXATTRIBL3DEXTPROC __glewVertexAttribL3dEXT = NULL; -PFNGLVERTEXATTRIBL3DVEXTPROC __glewVertexAttribL3dvEXT = NULL; -PFNGLVERTEXATTRIBL4DEXTPROC __glewVertexAttribL4dEXT = NULL; -PFNGLVERTEXATTRIBL4DVEXTPROC __glewVertexAttribL4dvEXT = NULL; -PFNGLVERTEXATTRIBLPOINTEREXTPROC __glewVertexAttribLPointerEXT = NULL; - -PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT = NULL; -PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT = NULL; -PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT = NULL; -PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT = NULL; -PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT = NULL; -PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT = NULL; -PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT = NULL; -PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT = NULL; -PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT = NULL; -PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT = NULL; -PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT = NULL; -PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT = NULL; -PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT = NULL; -PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT = NULL; -PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT = NULL; -PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT = NULL; -PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT = NULL; -PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT = NULL; -PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT = NULL; -PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT = NULL; -PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT = NULL; -PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT = NULL; -PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT = NULL; -PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT = NULL; -PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT = NULL; -PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT = NULL; -PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT = NULL; -PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT = NULL; -PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT = NULL; -PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT = NULL; -PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT = NULL; -PFNGLSWIZZLEEXTPROC __glewSwizzleEXT = NULL; -PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT = NULL; -PFNGLVARIANTBVEXTPROC __glewVariantbvEXT = NULL; -PFNGLVARIANTDVEXTPROC __glewVariantdvEXT = NULL; -PFNGLVARIANTFVEXTPROC __glewVariantfvEXT = NULL; -PFNGLVARIANTIVEXTPROC __glewVariantivEXT = NULL; -PFNGLVARIANTSVEXTPROC __glewVariantsvEXT = NULL; -PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT = NULL; -PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT = NULL; -PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT = NULL; -PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT = NULL; - -PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT = NULL; -PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT = NULL; -PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT = NULL; - -PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC __glewAcquireKeyedMutexWin32EXT = NULL; -PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC __glewReleaseKeyedMutexWin32EXT = NULL; - -PFNGLWINDOWRECTANGLESEXTPROC __glewWindowRectanglesEXT = NULL; - -PFNGLIMPORTSYNCEXTPROC __glewImportSyncEXT = NULL; - -PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY = NULL; - -PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY = NULL; - -PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP = NULL; -PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP = NULL; -PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP = NULL; -PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP = NULL; -PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP = NULL; -PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP = NULL; - -PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM = NULL; -PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM = NULL; - -PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM = NULL; -PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM = NULL; -PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM = NULL; -PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM = NULL; -PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM = NULL; -PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM = NULL; -PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM = NULL; -PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM = NULL; - -PFNGLGETTEXTUREHANDLEIMGPROC __glewGetTextureHandleIMG = NULL; -PFNGLGETTEXTURESAMPLERHANDLEIMGPROC __glewGetTextureSamplerHandleIMG = NULL; -PFNGLPROGRAMUNIFORMHANDLEUI64IMGPROC __glewProgramUniformHandleui64IMG = NULL; -PFNGLPROGRAMUNIFORMHANDLEUI64VIMGPROC __glewProgramUniformHandleui64vIMG = NULL; -PFNGLUNIFORMHANDLEUI64IMGPROC __glewUniformHandleui64IMG = NULL; -PFNGLUNIFORMHANDLEUI64VIMGPROC __glewUniformHandleui64vIMG = NULL; - -PFNGLFRAMEBUFFERTEXTURE2DDOWNSAMPLEIMGPROC __glewFramebufferTexture2DDownsampleIMG = NULL; -PFNGLFRAMEBUFFERTEXTURELAYERDOWNSAMPLEIMGPROC __glewFramebufferTextureLayerDownsampleIMG = NULL; - -PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC __glewFramebufferTexture2DMultisampleIMG = NULL; -PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC __glewRenderbufferStorageMultisampleIMG = NULL; - -PFNGLMAPTEXTURE2DINTELPROC __glewMapTexture2DINTEL = NULL; -PFNGLSYNCTEXTUREINTELPROC __glewSyncTextureINTEL = NULL; -PFNGLUNMAPTEXTURE2DINTELPROC __glewUnmapTexture2DINTEL = NULL; - -PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL = NULL; -PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL = NULL; -PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL = NULL; -PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL = NULL; - -PFNGLBEGINPERFQUERYINTELPROC __glewBeginPerfQueryINTEL = NULL; -PFNGLCREATEPERFQUERYINTELPROC __glewCreatePerfQueryINTEL = NULL; -PFNGLDELETEPERFQUERYINTELPROC __glewDeletePerfQueryINTEL = NULL; -PFNGLENDPERFQUERYINTELPROC __glewEndPerfQueryINTEL = NULL; -PFNGLGETFIRSTPERFQUERYIDINTELPROC __glewGetFirstPerfQueryIdINTEL = NULL; -PFNGLGETNEXTPERFQUERYIDINTELPROC __glewGetNextPerfQueryIdINTEL = NULL; -PFNGLGETPERFCOUNTERINFOINTELPROC __glewGetPerfCounterInfoINTEL = NULL; -PFNGLGETPERFQUERYDATAINTELPROC __glewGetPerfQueryDataINTEL = NULL; -PFNGLGETPERFQUERYIDBYNAMEINTELPROC __glewGetPerfQueryIdByNameINTEL = NULL; -PFNGLGETPERFQUERYINFOINTELPROC __glewGetPerfQueryInfoINTEL = NULL; - -PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL = NULL; -PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL = NULL; - -PFNGLBLENDBARRIERKHRPROC __glewBlendBarrierKHR = NULL; - -PFNGLDEBUGMESSAGECALLBACKPROC __glewDebugMessageCallback = NULL; -PFNGLDEBUGMESSAGECONTROLPROC __glewDebugMessageControl = NULL; -PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert = NULL; -PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog = NULL; -PFNGLGETOBJECTLABELPROC __glewGetObjectLabel = NULL; -PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel = NULL; -PFNGLOBJECTLABELPROC __glewObjectLabel = NULL; -PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel = NULL; -PFNGLPOPDEBUGGROUPPROC __glewPopDebugGroup = NULL; -PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup = NULL; - -PFNGLMAXSHADERCOMPILERTHREADSKHRPROC __glewMaxShaderCompilerThreadsKHR = NULL; - -PFNGLGETNUNIFORMFVPROC __glewGetnUniformfv = NULL; -PFNGLGETNUNIFORMIVPROC __glewGetnUniformiv = NULL; -PFNGLGETNUNIFORMUIVPROC __glewGetnUniformuiv = NULL; -PFNGLREADNPIXELSPROC __glewReadnPixels = NULL; - -PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled = NULL; -PFNGLDELETEBUFFERREGIONPROC __glewDeleteBufferRegion = NULL; -PFNGLDRAWBUFFERREGIONPROC __glewDrawBufferRegion = NULL; -PFNGLNEWBUFFERREGIONPROC __glewNewBufferRegion = NULL; -PFNGLREADBUFFERREGIONPROC __glewReadBufferRegion = NULL; - -PFNGLFRAMEBUFFERPARAMETERIMESAPROC __glewFramebufferParameteriMESA = NULL; -PFNGLGETFRAMEBUFFERPARAMETERIVMESAPROC __glewGetFramebufferParameterivMESA = NULL; - -PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA = NULL; - -PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA = NULL; -PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA = NULL; -PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA = NULL; -PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA = NULL; -PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA = NULL; -PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA = NULL; -PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA = NULL; -PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA = NULL; -PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA = NULL; -PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA = NULL; -PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA = NULL; -PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA = NULL; -PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA = NULL; -PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA = NULL; -PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA = NULL; -PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA = NULL; -PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA = NULL; -PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA = NULL; -PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA = NULL; -PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA = NULL; -PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA = NULL; -PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA = NULL; -PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA = NULL; -PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA = NULL; - -PFNGLBEGINCONDITIONALRENDERNVXPROC __glewBeginConditionalRenderNVX = NULL; -PFNGLENDCONDITIONALRENDERNVXPROC __glewEndConditionalRenderNVX = NULL; - -PFNGLASYNCCOPYBUFFERSUBDATANVXPROC __glewAsyncCopyBufferSubDataNVX = NULL; -PFNGLASYNCCOPYIMAGESUBDATANVXPROC __glewAsyncCopyImageSubDataNVX = NULL; -PFNGLMULTICASTSCISSORARRAYVNVXPROC __glewMulticastScissorArrayvNVX = NULL; -PFNGLMULTICASTVIEWPORTARRAYVNVXPROC __glewMulticastViewportArrayvNVX = NULL; -PFNGLMULTICASTVIEWPORTPOSITIONWSCALENVXPROC __glewMulticastViewportPositionWScaleNVX = NULL; -PFNGLUPLOADGPUMASKNVXPROC __glewUploadGpuMaskNVX = NULL; - -PFNGLLGPUCOPYIMAGESUBDATANVXPROC __glewLGPUCopyImageSubDataNVX = NULL; -PFNGLLGPUINTERLOCKNVXPROC __glewLGPUInterlockNVX = NULL; -PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC __glewLGPUNamedBufferSubDataNVX = NULL; - -PFNGLCLIENTWAITSEMAPHOREUI64NVXPROC __glewClientWaitSemaphoreui64NVX = NULL; -PFNGLSIGNALSEMAPHOREUI64NVXPROC __glewSignalSemaphoreui64NVX = NULL; -PFNGLWAITSEMAPHOREUI64NVXPROC __glewWaitSemaphoreui64NVX = NULL; - -PFNGLSTEREOPARAMETERFNVPROC __glewStereoParameterfNV = NULL; -PFNGLSTEREOPARAMETERINVPROC __glewStereoParameteriNV = NULL; - -PFNGLALPHATOCOVERAGEDITHERCONTROLNVPROC __glewAlphaToCoverageDitherControlNV = NULL; - -PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __glewMultiDrawArraysIndirectBindlessNV = NULL; -PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __glewMultiDrawElementsIndirectBindlessNV = NULL; - -PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawArraysIndirectBindlessCountNV = NULL; -PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawElementsIndirectBindlessCountNV = NULL; - -PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV = NULL; -PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV = NULL; -PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV = NULL; -PFNGLISIMAGEHANDLERESIDENTNVPROC __glewIsImageHandleResidentNV = NULL; -PFNGLISTEXTUREHANDLERESIDENTNVPROC __glewIsTextureHandleResidentNV = NULL; -PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC __glewMakeImageHandleNonResidentNV = NULL; -PFNGLMAKEIMAGEHANDLERESIDENTNVPROC __glewMakeImageHandleResidentNV = NULL; -PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC __glewMakeTextureHandleNonResidentNV = NULL; -PFNGLMAKETEXTUREHANDLERESIDENTNVPROC __glewMakeTextureHandleResidentNV = NULL; -PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC __glewProgramUniformHandleui64NV = NULL; -PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleui64vNV = NULL; -PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV = NULL; -PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV = NULL; - -PFNGLBLENDBARRIERNVPROC __glewBlendBarrierNV = NULL; -PFNGLBLENDPARAMETERINVPROC __glewBlendParameteriNV = NULL; - -PFNGLVIEWPORTPOSITIONWSCALENVPROC __glewViewportPositionWScaleNV = NULL; - -PFNGLCALLCOMMANDLISTNVPROC __glewCallCommandListNV = NULL; -PFNGLCOMMANDLISTSEGMENTSNVPROC __glewCommandListSegmentsNV = NULL; -PFNGLCOMPILECOMMANDLISTNVPROC __glewCompileCommandListNV = NULL; -PFNGLCREATECOMMANDLISTSNVPROC __glewCreateCommandListsNV = NULL; -PFNGLCREATESTATESNVPROC __glewCreateStatesNV = NULL; -PFNGLDELETECOMMANDLISTSNVPROC __glewDeleteCommandListsNV = NULL; -PFNGLDELETESTATESNVPROC __glewDeleteStatesNV = NULL; -PFNGLDRAWCOMMANDSADDRESSNVPROC __glewDrawCommandsAddressNV = NULL; -PFNGLDRAWCOMMANDSNVPROC __glewDrawCommandsNV = NULL; -PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC __glewDrawCommandsStatesAddressNV = NULL; -PFNGLDRAWCOMMANDSSTATESNVPROC __glewDrawCommandsStatesNV = NULL; -PFNGLGETCOMMANDHEADERNVPROC __glewGetCommandHeaderNV = NULL; -PFNGLGETSTAGEINDEXNVPROC __glewGetStageIndexNV = NULL; -PFNGLISCOMMANDLISTNVPROC __glewIsCommandListNV = NULL; -PFNGLISSTATENVPROC __glewIsStateNV = NULL; -PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC __glewListDrawCommandsStatesClientNV = NULL; -PFNGLSTATECAPTURENVPROC __glewStateCaptureNV = NULL; - -PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV = NULL; -PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV = NULL; - -PFNGLSUBPIXELPRECISIONBIASNVPROC __glewSubpixelPrecisionBiasNV = NULL; - -PFNGLCONSERVATIVERASTERPARAMETERFNVPROC __glewConservativeRasterParameterfNV = NULL; - -PFNGLCONSERVATIVERASTERPARAMETERINVPROC __glewConservativeRasterParameteriNV = NULL; - -PFNGLCOPYBUFFERSUBDATANVPROC __glewCopyBufferSubDataNV = NULL; - -PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV = NULL; - -PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV = NULL; -PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV = NULL; -PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV = NULL; - -PFNGLDRAWBUFFERSNVPROC __glewDrawBuffersNV = NULL; - -PFNGLDRAWARRAYSINSTANCEDNVPROC __glewDrawArraysInstancedNV = NULL; -PFNGLDRAWELEMENTSINSTANCEDNVPROC __glewDrawElementsInstancedNV = NULL; - -PFNGLDRAWTEXTURENVPROC __glewDrawTextureNV = NULL; - -PFNGLDRAWVKIMAGENVPROC __glewDrawVkImageNV = NULL; -PFNGLGETVKPROCADDRNVPROC __glewGetVkProcAddrNV = NULL; -PFNGLSIGNALVKFENCENVPROC __glewSignalVkFenceNV = NULL; -PFNGLSIGNALVKSEMAPHORENVPROC __glewSignalVkSemaphoreNV = NULL; -PFNGLWAITVKSEMAPHORENVPROC __glewWaitVkSemaphoreNV = NULL; - -PFNGLEVALMAPSNVPROC __glewEvalMapsNV = NULL; -PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV = NULL; -PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV = NULL; -PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV = NULL; -PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV = NULL; -PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV = NULL; -PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV = NULL; -PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV = NULL; -PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV = NULL; - -PFNGLGETMULTISAMPLEFVNVPROC __glewGetMultisamplefvNV = NULL; -PFNGLSAMPLEMASKINDEXEDNVPROC __glewSampleMaskIndexedNV = NULL; -PFNGLTEXRENDERBUFFERNVPROC __glewTexRenderbufferNV = NULL; - -PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV = NULL; -PFNGLFINISHFENCENVPROC __glewFinishFenceNV = NULL; -PFNGLGENFENCESNVPROC __glewGenFencesNV = NULL; -PFNGLGETFENCEIVNVPROC __glewGetFenceivNV = NULL; -PFNGLISFENCENVPROC __glewIsFenceNV = NULL; -PFNGLSETFENCENVPROC __glewSetFenceNV = NULL; -PFNGLTESTFENCENVPROC __glewTestFenceNV = NULL; - -PFNGLFRAGMENTCOVERAGECOLORNVPROC __glewFragmentCoverageColorNV = NULL; - -PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV = NULL; -PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV = NULL; -PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV = NULL; -PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV = NULL; -PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV = NULL; -PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV = NULL; - -PFNGLBLITFRAMEBUFFERNVPROC __glewBlitFramebufferNV = NULL; - -PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC __glewRenderbufferStorageMultisampleNV = NULL; - -PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV = NULL; - -PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV = NULL; - -PFNGLMULTICASTBARRIERNVPROC __glewMulticastBarrierNV = NULL; -PFNGLMULTICASTBLITFRAMEBUFFERNVPROC __glewMulticastBlitFramebufferNV = NULL; -PFNGLMULTICASTBUFFERSUBDATANVPROC __glewMulticastBufferSubDataNV = NULL; -PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC __glewMulticastCopyBufferSubDataNV = NULL; -PFNGLMULTICASTCOPYIMAGESUBDATANVPROC __glewMulticastCopyImageSubDataNV = NULL; -PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewMulticastFramebufferSampleLocationsfvNV = NULL; -PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC __glewMulticastGetQueryObjecti64vNV = NULL; -PFNGLMULTICASTGETQUERYOBJECTIVNVPROC __glewMulticastGetQueryObjectivNV = NULL; -PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC __glewMulticastGetQueryObjectui64vNV = NULL; -PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC __glewMulticastGetQueryObjectuivNV = NULL; -PFNGLMULTICASTWAITSYNCNVPROC __glewMulticastWaitSyncNV = NULL; -PFNGLRENDERGPUMASKNVPROC __glewRenderGpuMaskNV = NULL; - -PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV = NULL; -PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV = NULL; -PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV = NULL; -PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV = NULL; -PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV = NULL; -PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV = NULL; -PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV = NULL; -PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV = NULL; -PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV = NULL; -PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV = NULL; -PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV = NULL; -PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV = NULL; - -PFNGLGETUNIFORMI64VNVPROC __glewGetUniformi64vNV = NULL; -PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV = NULL; -PFNGLPROGRAMUNIFORM1I64NVPROC __glewProgramUniform1i64NV = NULL; -PFNGLPROGRAMUNIFORM1I64VNVPROC __glewProgramUniform1i64vNV = NULL; -PFNGLPROGRAMUNIFORM1UI64NVPROC __glewProgramUniform1ui64NV = NULL; -PFNGLPROGRAMUNIFORM1UI64VNVPROC __glewProgramUniform1ui64vNV = NULL; -PFNGLPROGRAMUNIFORM2I64NVPROC __glewProgramUniform2i64NV = NULL; -PFNGLPROGRAMUNIFORM2I64VNVPROC __glewProgramUniform2i64vNV = NULL; -PFNGLPROGRAMUNIFORM2UI64NVPROC __glewProgramUniform2ui64NV = NULL; -PFNGLPROGRAMUNIFORM2UI64VNVPROC __glewProgramUniform2ui64vNV = NULL; -PFNGLPROGRAMUNIFORM3I64NVPROC __glewProgramUniform3i64NV = NULL; -PFNGLPROGRAMUNIFORM3I64VNVPROC __glewProgramUniform3i64vNV = NULL; -PFNGLPROGRAMUNIFORM3UI64NVPROC __glewProgramUniform3ui64NV = NULL; -PFNGLPROGRAMUNIFORM3UI64VNVPROC __glewProgramUniform3ui64vNV = NULL; -PFNGLPROGRAMUNIFORM4I64NVPROC __glewProgramUniform4i64NV = NULL; -PFNGLPROGRAMUNIFORM4I64VNVPROC __glewProgramUniform4i64vNV = NULL; -PFNGLPROGRAMUNIFORM4UI64NVPROC __glewProgramUniform4ui64NV = NULL; -PFNGLPROGRAMUNIFORM4UI64VNVPROC __glewProgramUniform4ui64vNV = NULL; -PFNGLUNIFORM1I64NVPROC __glewUniform1i64NV = NULL; -PFNGLUNIFORM1I64VNVPROC __glewUniform1i64vNV = NULL; -PFNGLUNIFORM1UI64NVPROC __glewUniform1ui64NV = NULL; -PFNGLUNIFORM1UI64VNVPROC __glewUniform1ui64vNV = NULL; -PFNGLUNIFORM2I64NVPROC __glewUniform2i64NV = NULL; -PFNGLUNIFORM2I64VNVPROC __glewUniform2i64vNV = NULL; -PFNGLUNIFORM2UI64NVPROC __glewUniform2ui64NV = NULL; -PFNGLUNIFORM2UI64VNVPROC __glewUniform2ui64vNV = NULL; -PFNGLUNIFORM3I64NVPROC __glewUniform3i64NV = NULL; -PFNGLUNIFORM3I64VNVPROC __glewUniform3i64vNV = NULL; -PFNGLUNIFORM3UI64NVPROC __glewUniform3ui64NV = NULL; -PFNGLUNIFORM3UI64VNVPROC __glewUniform3ui64vNV = NULL; -PFNGLUNIFORM4I64NVPROC __glewUniform4i64NV = NULL; -PFNGLUNIFORM4I64VNVPROC __glewUniform4i64vNV = NULL; -PFNGLUNIFORM4UI64NVPROC __glewUniform4ui64NV = NULL; -PFNGLUNIFORM4UI64VNVPROC __glewUniform4ui64vNV = NULL; - -PFNGLCOLOR3HNVPROC __glewColor3hNV = NULL; -PFNGLCOLOR3HVNVPROC __glewColor3hvNV = NULL; -PFNGLCOLOR4HNVPROC __glewColor4hNV = NULL; -PFNGLCOLOR4HVNVPROC __glewColor4hvNV = NULL; -PFNGLFOGCOORDHNVPROC __glewFogCoordhNV = NULL; -PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV = NULL; -PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV = NULL; -PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV = NULL; -PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV = NULL; -PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV = NULL; -PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV = NULL; -PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV = NULL; -PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV = NULL; -PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV = NULL; -PFNGLNORMAL3HNVPROC __glewNormal3hNV = NULL; -PFNGLNORMAL3HVNVPROC __glewNormal3hvNV = NULL; -PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV = NULL; -PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV = NULL; -PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV = NULL; -PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV = NULL; -PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV = NULL; -PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV = NULL; -PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV = NULL; -PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV = NULL; -PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV = NULL; -PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV = NULL; -PFNGLVERTEX2HNVPROC __glewVertex2hNV = NULL; -PFNGLVERTEX2HVNVPROC __glewVertex2hvNV = NULL; -PFNGLVERTEX3HNVPROC __glewVertex3hNV = NULL; -PFNGLVERTEX3HVNVPROC __glewVertex3hvNV = NULL; -PFNGLVERTEX4HNVPROC __glewVertex4hNV = NULL; -PFNGLVERTEX4HVNVPROC __glewVertex4hvNV = NULL; -PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV = NULL; -PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV = NULL; -PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV = NULL; -PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV = NULL; -PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV = NULL; -PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV = NULL; -PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV = NULL; -PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV = NULL; -PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV = NULL; -PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV = NULL; -PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV = NULL; -PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV = NULL; -PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV = NULL; -PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV = NULL; - -PFNGLVERTEXATTRIBDIVISORNVPROC __glewVertexAttribDivisorNV = NULL; - -PFNGLGETINTERNALFORMATSAMPLEIVNVPROC __glewGetInternalformatSampleivNV = NULL; - -PFNGLBUFFERATTACHMEMORYNVPROC __glewBufferAttachMemoryNV = NULL; -PFNGLGETMEMORYOBJECTDETACHEDRESOURCESUIVNVPROC __glewGetMemoryObjectDetachedResourcesuivNV = NULL; -PFNGLNAMEDBUFFERATTACHMEMORYNVPROC __glewNamedBufferAttachMemoryNV = NULL; -PFNGLRESETMEMORYOBJECTPARAMETERNVPROC __glewResetMemoryObjectParameterNV = NULL; -PFNGLTEXATTACHMEMORYNVPROC __glewTexAttachMemoryNV = NULL; -PFNGLTEXTUREATTACHMEMORYNVPROC __glewTextureAttachMemoryNV = NULL; - -PFNGLDRAWMESHTASKSINDIRECTNVPROC __glewDrawMeshTasksIndirectNV = NULL; -PFNGLDRAWMESHTASKSNVPROC __glewDrawMeshTasksNV = NULL; -PFNGLMULTIDRAWMESHTASKSINDIRECTCOUNTNVPROC __glewMultiDrawMeshTasksIndirectCountNV = NULL; -PFNGLMULTIDRAWMESHTASKSINDIRECTNVPROC __glewMultiDrawMeshTasksIndirectNV = NULL; - -PFNGLUNIFORMMATRIX2X3FVNVPROC __glewUniformMatrix2x3fvNV = NULL; -PFNGLUNIFORMMATRIX2X4FVNVPROC __glewUniformMatrix2x4fvNV = NULL; -PFNGLUNIFORMMATRIX3X2FVNVPROC __glewUniformMatrix3x2fvNV = NULL; -PFNGLUNIFORMMATRIX3X4FVNVPROC __glewUniformMatrix3x4fvNV = NULL; -PFNGLUNIFORMMATRIX4X2FVNVPROC __glewUniformMatrix4x2fvNV = NULL; -PFNGLUNIFORMMATRIX4X3FVNVPROC __glewUniformMatrix4x3fvNV = NULL; - -PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV = NULL; -PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV = NULL; -PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV = NULL; -PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV = NULL; -PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV = NULL; -PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV = NULL; -PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV = NULL; - -PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV = NULL; -PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV = NULL; -PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV = NULL; - -PFNGLCOPYPATHNVPROC __glewCopyPathNV = NULL; -PFNGLCOVERFILLPATHINSTANCEDNVPROC __glewCoverFillPathInstancedNV = NULL; -PFNGLCOVERFILLPATHNVPROC __glewCoverFillPathNV = NULL; -PFNGLCOVERSTROKEPATHINSTANCEDNVPROC __glewCoverStrokePathInstancedNV = NULL; -PFNGLCOVERSTROKEPATHNVPROC __glewCoverStrokePathNV = NULL; -PFNGLDELETEPATHSNVPROC __glewDeletePathsNV = NULL; -PFNGLGENPATHSNVPROC __glewGenPathsNV = NULL; -PFNGLGETPATHCOLORGENFVNVPROC __glewGetPathColorGenfvNV = NULL; -PFNGLGETPATHCOLORGENIVNVPROC __glewGetPathColorGenivNV = NULL; -PFNGLGETPATHCOMMANDSNVPROC __glewGetPathCommandsNV = NULL; -PFNGLGETPATHCOORDSNVPROC __glewGetPathCoordsNV = NULL; -PFNGLGETPATHDASHARRAYNVPROC __glewGetPathDashArrayNV = NULL; -PFNGLGETPATHLENGTHNVPROC __glewGetPathLengthNV = NULL; -PFNGLGETPATHMETRICRANGENVPROC __glewGetPathMetricRangeNV = NULL; -PFNGLGETPATHMETRICSNVPROC __glewGetPathMetricsNV = NULL; -PFNGLGETPATHPARAMETERFVNVPROC __glewGetPathParameterfvNV = NULL; -PFNGLGETPATHPARAMETERIVNVPROC __glewGetPathParameterivNV = NULL; -PFNGLGETPATHSPACINGNVPROC __glewGetPathSpacingNV = NULL; -PFNGLGETPATHTEXGENFVNVPROC __glewGetPathTexGenfvNV = NULL; -PFNGLGETPATHTEXGENIVNVPROC __glewGetPathTexGenivNV = NULL; -PFNGLGETPROGRAMRESOURCEFVNVPROC __glewGetProgramResourcefvNV = NULL; -PFNGLINTERPOLATEPATHSNVPROC __glewInterpolatePathsNV = NULL; -PFNGLISPATHNVPROC __glewIsPathNV = NULL; -PFNGLISPOINTINFILLPATHNVPROC __glewIsPointInFillPathNV = NULL; -PFNGLISPOINTINSTROKEPATHNVPROC __glewIsPointInStrokePathNV = NULL; -PFNGLMATRIXLOAD3X2FNVPROC __glewMatrixLoad3x2fNV = NULL; -PFNGLMATRIXLOAD3X3FNVPROC __glewMatrixLoad3x3fNV = NULL; -PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC __glewMatrixLoadTranspose3x3fNV = NULL; -PFNGLMATRIXMULT3X2FNVPROC __glewMatrixMult3x2fNV = NULL; -PFNGLMATRIXMULT3X3FNVPROC __glewMatrixMult3x3fNV = NULL; -PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC __glewMatrixMultTranspose3x3fNV = NULL; -PFNGLPATHCOLORGENNVPROC __glewPathColorGenNV = NULL; -PFNGLPATHCOMMANDSNVPROC __glewPathCommandsNV = NULL; -PFNGLPATHCOORDSNVPROC __glewPathCoordsNV = NULL; -PFNGLPATHCOVERDEPTHFUNCNVPROC __glewPathCoverDepthFuncNV = NULL; -PFNGLPATHDASHARRAYNVPROC __glewPathDashArrayNV = NULL; -PFNGLPATHFOGGENNVPROC __glewPathFogGenNV = NULL; -PFNGLPATHGLYPHINDEXARRAYNVPROC __glewPathGlyphIndexArrayNV = NULL; -PFNGLPATHGLYPHINDEXRANGENVPROC __glewPathGlyphIndexRangeNV = NULL; -PFNGLPATHGLYPHRANGENVPROC __glewPathGlyphRangeNV = NULL; -PFNGLPATHGLYPHSNVPROC __glewPathGlyphsNV = NULL; -PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC __glewPathMemoryGlyphIndexArrayNV = NULL; -PFNGLPATHPARAMETERFNVPROC __glewPathParameterfNV = NULL; -PFNGLPATHPARAMETERFVNVPROC __glewPathParameterfvNV = NULL; -PFNGLPATHPARAMETERINVPROC __glewPathParameteriNV = NULL; -PFNGLPATHPARAMETERIVNVPROC __glewPathParameterivNV = NULL; -PFNGLPATHSTENCILDEPTHOFFSETNVPROC __glewPathStencilDepthOffsetNV = NULL; -PFNGLPATHSTENCILFUNCNVPROC __glewPathStencilFuncNV = NULL; -PFNGLPATHSTRINGNVPROC __glewPathStringNV = NULL; -PFNGLPATHSUBCOMMANDSNVPROC __glewPathSubCommandsNV = NULL; -PFNGLPATHSUBCOORDSNVPROC __glewPathSubCoordsNV = NULL; -PFNGLPATHTEXGENNVPROC __glewPathTexGenNV = NULL; -PFNGLPOINTALONGPATHNVPROC __glewPointAlongPathNV = NULL; -PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC __glewProgramPathFragmentInputGenNV = NULL; -PFNGLSTENCILFILLPATHINSTANCEDNVPROC __glewStencilFillPathInstancedNV = NULL; -PFNGLSTENCILFILLPATHNVPROC __glewStencilFillPathNV = NULL; -PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC __glewStencilStrokePathInstancedNV = NULL; -PFNGLSTENCILSTROKEPATHNVPROC __glewStencilStrokePathNV = NULL; -PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC __glewStencilThenCoverFillPathInstancedNV = NULL; -PFNGLSTENCILTHENCOVERFILLPATHNVPROC __glewStencilThenCoverFillPathNV = NULL; -PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC __glewStencilThenCoverStrokePathInstancedNV = NULL; -PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC __glewStencilThenCoverStrokePathNV = NULL; -PFNGLTRANSFORMPATHNVPROC __glewTransformPathNV = NULL; -PFNGLWEIGHTPATHSNVPROC __glewWeightPathsNV = NULL; - -PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV = NULL; -PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV = NULL; - -PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV = NULL; -PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV = NULL; - -PFNGLPOLYGONMODENVPROC __glewPolygonModeNV = NULL; - -PFNGLGETVIDEOI64VNVPROC __glewGetVideoi64vNV = NULL; -PFNGLGETVIDEOIVNVPROC __glewGetVideoivNV = NULL; -PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV = NULL; -PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV = NULL; -PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV = NULL; -PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV = NULL; - -PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV = NULL; -PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV = NULL; - -PFNGLREADBUFFERNVPROC __glewReadBufferNV = NULL; - -PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV = NULL; -PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV = NULL; -PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV = NULL; -PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV = NULL; -PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV = NULL; -PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV = NULL; -PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV = NULL; -PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV = NULL; -PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV = NULL; -PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV = NULL; -PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV = NULL; -PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV = NULL; -PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV = NULL; - -PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV = NULL; -PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV = NULL; - -PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewFramebufferSampleLocationsfvNV = NULL; -PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewNamedFramebufferSampleLocationsfvNV = NULL; -PFNGLRESOLVEDEPTHVALUESNVPROC __glewResolveDepthValuesNV = NULL; - -PFNGLSCISSOREXCLUSIVEARRAYVNVPROC __glewScissorExclusiveArrayvNV = NULL; -PFNGLSCISSOREXCLUSIVENVPROC __glewScissorExclusiveNV = NULL; - -PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV = NULL; -PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV = NULL; -PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV = NULL; -PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV = NULL; -PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV = NULL; -PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV = NULL; -PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV = NULL; -PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV = NULL; -PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV = NULL; -PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV = NULL; -PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV = NULL; -PFNGLUNIFORMUI64NVPROC __glewUniformui64NV = NULL; -PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV = NULL; - -PFNGLBINDSHADINGRATEIMAGENVPROC __glewBindShadingRateImageNV = NULL; -PFNGLGETSHADINGRATEIMAGEPALETTENVPROC __glewGetShadingRateImagePaletteNV = NULL; -PFNGLGETSHADINGRATESAMPLELOCATIONIVNVPROC __glewGetShadingRateSampleLocationivNV = NULL; -PFNGLSHADINGRATEIMAGEBARRIERNVPROC __glewShadingRateImageBarrierNV = NULL; -PFNGLSHADINGRATEIMAGEPALETTENVPROC __glewShadingRateImagePaletteNV = NULL; -PFNGLSHADINGRATESAMPLEORDERCUSTOMNVPROC __glewShadingRateSampleOrderCustomNV = NULL; - -PFNGLCOMPRESSEDTEXIMAGE3DNVPROC __glewCompressedTexImage3DNV = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE3DNVPROC __glewCompressedTexSubImage3DNV = NULL; -PFNGLCOPYTEXSUBIMAGE3DNVPROC __glewCopyTexSubImage3DNV = NULL; -PFNGLFRAMEBUFFERTEXTURELAYERNVPROC __glewFramebufferTextureLayerNV = NULL; -PFNGLTEXIMAGE3DNVPROC __glewTexImage3DNV = NULL; -PFNGLTEXSUBIMAGE3DNVPROC __glewTexSubImage3DNV = NULL; - -PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV = NULL; - -PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTexImage2DMultisampleCoverageNV = NULL; -PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTexImage3DMultisampleCoverageNV = NULL; -PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTextureImage2DMultisampleCoverageNV = NULL; -PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC __glewTextureImage2DMultisampleNV = NULL; -PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTextureImage3DMultisampleCoverageNV = NULL; -PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC __glewTextureImage3DMultisampleNV = NULL; - -PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV = NULL; -PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV = NULL; -PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV = NULL; -PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV = NULL; -PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV = NULL; -PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV = NULL; -PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV = NULL; -PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV = NULL; -PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV = NULL; -PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV = NULL; -PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV = NULL; - -PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV = NULL; -PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV = NULL; -PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV = NULL; -PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV = NULL; -PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV = NULL; -PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV = NULL; -PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV = NULL; - -PFNGLVDPAUFININVPROC __glewVDPAUFiniNV = NULL; -PFNGLVDPAUGETSURFACEIVNVPROC __glewVDPAUGetSurfaceivNV = NULL; -PFNGLVDPAUINITNVPROC __glewVDPAUInitNV = NULL; -PFNGLVDPAUISSURFACENVPROC __glewVDPAUIsSurfaceNV = NULL; -PFNGLVDPAUMAPSURFACESNVPROC __glewVDPAUMapSurfacesNV = NULL; -PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC __glewVDPAURegisterOutputSurfaceNV = NULL; -PFNGLVDPAUREGISTERVIDEOSURFACENVPROC __glewVDPAURegisterVideoSurfaceNV = NULL; -PFNGLVDPAUSURFACEACCESSNVPROC __glewVDPAUSurfaceAccessNV = NULL; -PFNGLVDPAUUNMAPSURFACESNVPROC __glewVDPAUUnmapSurfacesNV = NULL; -PFNGLVDPAUUNREGISTERSURFACENVPROC __glewVDPAUUnregisterSurfaceNV = NULL; - -PFNGLVDPAUREGISTERVIDEOSURFACEWITHPICTURESTRUCTURENVPROC __glewVDPAURegisterVideoSurfaceWithPictureStructureNV = NULL; - -PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV = NULL; -PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV = NULL; - -PFNGLGETVERTEXATTRIBLI64VNVPROC __glewGetVertexAttribLi64vNV = NULL; -PFNGLGETVERTEXATTRIBLUI64VNVPROC __glewGetVertexAttribLui64vNV = NULL; -PFNGLVERTEXATTRIBL1I64NVPROC __glewVertexAttribL1i64NV = NULL; -PFNGLVERTEXATTRIBL1I64VNVPROC __glewVertexAttribL1i64vNV = NULL; -PFNGLVERTEXATTRIBL1UI64NVPROC __glewVertexAttribL1ui64NV = NULL; -PFNGLVERTEXATTRIBL1UI64VNVPROC __glewVertexAttribL1ui64vNV = NULL; -PFNGLVERTEXATTRIBL2I64NVPROC __glewVertexAttribL2i64NV = NULL; -PFNGLVERTEXATTRIBL2I64VNVPROC __glewVertexAttribL2i64vNV = NULL; -PFNGLVERTEXATTRIBL2UI64NVPROC __glewVertexAttribL2ui64NV = NULL; -PFNGLVERTEXATTRIBL2UI64VNVPROC __glewVertexAttribL2ui64vNV = NULL; -PFNGLVERTEXATTRIBL3I64NVPROC __glewVertexAttribL3i64NV = NULL; -PFNGLVERTEXATTRIBL3I64VNVPROC __glewVertexAttribL3i64vNV = NULL; -PFNGLVERTEXATTRIBL3UI64NVPROC __glewVertexAttribL3ui64NV = NULL; -PFNGLVERTEXATTRIBL3UI64VNVPROC __glewVertexAttribL3ui64vNV = NULL; -PFNGLVERTEXATTRIBL4I64NVPROC __glewVertexAttribL4i64NV = NULL; -PFNGLVERTEXATTRIBL4I64VNVPROC __glewVertexAttribL4i64vNV = NULL; -PFNGLVERTEXATTRIBL4UI64NVPROC __glewVertexAttribL4ui64NV = NULL; -PFNGLVERTEXATTRIBL4UI64VNVPROC __glewVertexAttribL4ui64vNV = NULL; -PFNGLVERTEXATTRIBLFORMATNVPROC __glewVertexAttribLFormatNV = NULL; - -PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV = NULL; -PFNGLCOLORFORMATNVPROC __glewColorFormatNV = NULL; -PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV = NULL; -PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV = NULL; -PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV = NULL; -PFNGLINDEXFORMATNVPROC __glewIndexFormatNV = NULL; -PFNGLNORMALFORMATNVPROC __glewNormalFormatNV = NULL; -PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV = NULL; -PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV = NULL; -PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV = NULL; -PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV = NULL; -PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV = NULL; - -PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV = NULL; -PFNGLBINDPROGRAMNVPROC __glewBindProgramNV = NULL; -PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV = NULL; -PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV = NULL; -PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV = NULL; -PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV = NULL; -PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV = NULL; -PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV = NULL; -PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV = NULL; -PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV = NULL; -PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV = NULL; -PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV = NULL; -PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV = NULL; -PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV = NULL; -PFNGLISPROGRAMNVPROC __glewIsProgramNV = NULL; -PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV = NULL; -PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV = NULL; -PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV = NULL; -PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV = NULL; -PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV = NULL; -PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV = NULL; -PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV = NULL; -PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV = NULL; -PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV = NULL; -PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV = NULL; -PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV = NULL; -PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV = NULL; -PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV = NULL; -PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV = NULL; -PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV = NULL; -PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV = NULL; -PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV = NULL; -PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV = NULL; -PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV = NULL; -PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV = NULL; -PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV = NULL; -PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV = NULL; -PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV = NULL; -PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV = NULL; -PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV = NULL; -PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV = NULL; -PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV = NULL; -PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV = NULL; -PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV = NULL; -PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV = NULL; -PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV = NULL; -PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV = NULL; -PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV = NULL; -PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV = NULL; -PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV = NULL; -PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV = NULL; -PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV = NULL; -PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV = NULL; -PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV = NULL; -PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV = NULL; -PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV = NULL; -PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV = NULL; -PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV = NULL; -PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV = NULL; -PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV = NULL; -PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV = NULL; -PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV = NULL; -PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV = NULL; -PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV = NULL; - -PFNGLBEGINVIDEOCAPTURENVPROC __glewBeginVideoCaptureNV = NULL; -PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC __glewBindVideoCaptureStreamBufferNV = NULL; -PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC __glewBindVideoCaptureStreamTextureNV = NULL; -PFNGLENDVIDEOCAPTURENVPROC __glewEndVideoCaptureNV = NULL; -PFNGLGETVIDEOCAPTURESTREAMDVNVPROC __glewGetVideoCaptureStreamdvNV = NULL; -PFNGLGETVIDEOCAPTURESTREAMFVNVPROC __glewGetVideoCaptureStreamfvNV = NULL; -PFNGLGETVIDEOCAPTURESTREAMIVNVPROC __glewGetVideoCaptureStreamivNV = NULL; -PFNGLGETVIDEOCAPTUREIVNVPROC __glewGetVideoCaptureivNV = NULL; -PFNGLVIDEOCAPTURENVPROC __glewVideoCaptureNV = NULL; -PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC __glewVideoCaptureStreamParameterdvNV = NULL; -PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC __glewVideoCaptureStreamParameterfvNV = NULL; -PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC __glewVideoCaptureStreamParameterivNV = NULL; - -PFNGLDEPTHRANGEARRAYFVNVPROC __glewDepthRangeArrayfvNV = NULL; -PFNGLDEPTHRANGEINDEXEDFNVPROC __glewDepthRangeIndexedfNV = NULL; -PFNGLDISABLEINVPROC __glewDisableiNV = NULL; -PFNGLENABLEINVPROC __glewEnableiNV = NULL; -PFNGLGETFLOATI_VNVPROC __glewGetFloati_vNV = NULL; -PFNGLISENABLEDINVPROC __glewIsEnablediNV = NULL; -PFNGLSCISSORARRAYVNVPROC __glewScissorArrayvNV = NULL; -PFNGLSCISSORINDEXEDNVPROC __glewScissorIndexedNV = NULL; -PFNGLSCISSORINDEXEDVNVPROC __glewScissorIndexedvNV = NULL; -PFNGLVIEWPORTARRAYVNVPROC __glewViewportArrayvNV = NULL; -PFNGLVIEWPORTINDEXEDFNVPROC __glewViewportIndexedfNV = NULL; -PFNGLVIEWPORTINDEXEDFVNVPROC __glewViewportIndexedfvNV = NULL; - -PFNGLVIEWPORTSWIZZLENVPROC __glewViewportSwizzleNV = NULL; - -PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC __glewEGLImageTargetRenderbufferStorageOES = NULL; -PFNGLEGLIMAGETARGETTEXTURE2DOESPROC __glewEGLImageTargetTexture2DOES = NULL; - -PFNGLBLENDEQUATIONSEPARATEOESPROC __glewBlendEquationSeparateOES = NULL; - -PFNGLBLENDFUNCSEPARATEOESPROC __glewBlendFuncSeparateOES = NULL; - -PFNGLBLENDEQUATIONOESPROC __glewBlendEquationOES = NULL; - -PFNGLCOPYIMAGESUBDATAOESPROC __glewCopyImageSubDataOES = NULL; - -PFNGLBLENDEQUATIONSEPARATEIOESPROC __glewBlendEquationSeparateiOES = NULL; -PFNGLBLENDEQUATIONIOESPROC __glewBlendEquationiOES = NULL; -PFNGLBLENDFUNCSEPARATEIOESPROC __glewBlendFuncSeparateiOES = NULL; -PFNGLBLENDFUNCIOESPROC __glewBlendFunciOES = NULL; -PFNGLCOLORMASKIOESPROC __glewColorMaskiOES = NULL; -PFNGLDISABLEIOESPROC __glewDisableiOES = NULL; -PFNGLENABLEIOESPROC __glewEnableiOES = NULL; -PFNGLISENABLEDIOESPROC __glewIsEnablediOES = NULL; - -PFNGLBINDFRAMEBUFFEROESPROC __glewBindFramebufferOES = NULL; -PFNGLBINDRENDERBUFFEROESPROC __glewBindRenderbufferOES = NULL; -PFNGLCHECKFRAMEBUFFERSTATUSOESPROC __glewCheckFramebufferStatusOES = NULL; -PFNGLDELETEFRAMEBUFFERSOESPROC __glewDeleteFramebuffersOES = NULL; -PFNGLDELETERENDERBUFFERSOESPROC __glewDeleteRenderbuffersOES = NULL; -PFNGLFRAMEBUFFERRENDERBUFFEROESPROC __glewFramebufferRenderbufferOES = NULL; -PFNGLFRAMEBUFFERTEXTURE2DOESPROC __glewFramebufferTexture2DOES = NULL; -PFNGLGENFRAMEBUFFERSOESPROC __glewGenFramebuffersOES = NULL; -PFNGLGENRENDERBUFFERSOESPROC __glewGenRenderbuffersOES = NULL; -PFNGLGENERATEMIPMAPOESPROC __glewGenerateMipmapOES = NULL; -PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC __glewGetFramebufferAttachmentParameterivOES = NULL; -PFNGLGETRENDERBUFFERPARAMETERIVOESPROC __glewGetRenderbufferParameterivOES = NULL; -PFNGLISFRAMEBUFFEROESPROC __glewIsFramebufferOES = NULL; -PFNGLISRENDERBUFFEROESPROC __glewIsRenderbufferOES = NULL; -PFNGLRENDERBUFFERSTORAGEOESPROC __glewRenderbufferStorageOES = NULL; - -PFNGLGETPROGRAMBINARYOESPROC __glewGetProgramBinaryOES = NULL; -PFNGLPROGRAMBINARYOESPROC __glewProgramBinaryOES = NULL; - -PFNGLGETBUFFERPOINTERVOESPROC __glewGetBufferPointervOES = NULL; -PFNGLMAPBUFFEROESPROC __glewMapBufferOES = NULL; -PFNGLUNMAPBUFFEROESPROC __glewUnmapBufferOES = NULL; - -PFNGLCURRENTPALETTEMATRIXOESPROC __glewCurrentPaletteMatrixOES = NULL; -PFNGLMATRIXINDEXPOINTEROESPROC __glewMatrixIndexPointerOES = NULL; -PFNGLWEIGHTPOINTEROESPROC __glewWeightPointerOES = NULL; - -PFNGLMINSAMPLESHADINGOESPROC __glewMinSampleShadingOES = NULL; - -PFNGLCLEARDEPTHFOESPROC __glewClearDepthfOES = NULL; -PFNGLCLIPPLANEFOESPROC __glewClipPlanefOES = NULL; -PFNGLDEPTHRANGEFOESPROC __glewDepthRangefOES = NULL; -PFNGLFRUSTUMFOESPROC __glewFrustumfOES = NULL; -PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES = NULL; -PFNGLORTHOFOESPROC __glewOrthofOES = NULL; - -PFNGLCOMPRESSEDTEXIMAGE3DOESPROC __glewCompressedTexImage3DOES = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE3DOESPROC __glewCompressedTexSubImage3DOES = NULL; -PFNGLCOPYTEXSUBIMAGE3DOESPROC __glewCopyTexSubImage3DOES = NULL; -PFNGLFRAMEBUFFERTEXTURE3DOESPROC __glewFramebufferTexture3DOES = NULL; -PFNGLTEXIMAGE3DOESPROC __glewTexImage3DOES = NULL; -PFNGLTEXSUBIMAGE3DOESPROC __glewTexSubImage3DOES = NULL; - -PFNGLGETSAMPLERPARAMETERIIVOESPROC __glewGetSamplerParameterIivOES = NULL; -PFNGLGETSAMPLERPARAMETERIUIVOESPROC __glewGetSamplerParameterIuivOES = NULL; -PFNGLGETTEXPARAMETERIIVOESPROC __glewGetTexParameterIivOES = NULL; -PFNGLGETTEXPARAMETERIUIVOESPROC __glewGetTexParameterIuivOES = NULL; -PFNGLSAMPLERPARAMETERIIVOESPROC __glewSamplerParameterIivOES = NULL; -PFNGLSAMPLERPARAMETERIUIVOESPROC __glewSamplerParameterIuivOES = NULL; -PFNGLTEXPARAMETERIIVOESPROC __glewTexParameterIivOES = NULL; -PFNGLTEXPARAMETERIUIVOESPROC __glewTexParameterIuivOES = NULL; - -PFNGLTEXBUFFEROESPROC __glewTexBufferOES = NULL; -PFNGLTEXBUFFERRANGEOESPROC __glewTexBufferRangeOES = NULL; - -PFNGLGETTEXGENFVOESPROC __glewGetTexGenfvOES = NULL; -PFNGLGETTEXGENIVOESPROC __glewGetTexGenivOES = NULL; -PFNGLGETTEXGENXVOESPROC __glewGetTexGenxvOES = NULL; -PFNGLTEXGENFOESPROC __glewTexGenfOES = NULL; -PFNGLTEXGENFVOESPROC __glewTexGenfvOES = NULL; -PFNGLTEXGENIOESPROC __glewTexGeniOES = NULL; -PFNGLTEXGENIVOESPROC __glewTexGenivOES = NULL; -PFNGLTEXGENXOESPROC __glewTexGenxOES = NULL; -PFNGLTEXGENXVOESPROC __glewTexGenxvOES = NULL; - -PFNGLTEXSTORAGE3DMULTISAMPLEOESPROC __glewTexStorage3DMultisampleOES = NULL; - -PFNGLTEXTUREVIEWOESPROC __glewTextureViewOES = NULL; - -PFNGLBINDVERTEXARRAYOESPROC __glewBindVertexArrayOES = NULL; -PFNGLDELETEVERTEXARRAYSOESPROC __glewDeleteVertexArraysOES = NULL; -PFNGLGENVERTEXARRAYSOESPROC __glewGenVertexArraysOES = NULL; -PFNGLISVERTEXARRAYOESPROC __glewIsVertexArrayOES = NULL; - -PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __glewFramebufferTextureMultiviewOVR = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __glewNamedFramebufferTextureMultiviewOVR = NULL; - -PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC __glewFramebufferTextureMultisampleMultiviewOVR = NULL; - -PFNGLALPHAFUNCQCOMPROC __glewAlphaFuncQCOM = NULL; - -PFNGLDISABLEDRIVERCONTROLQCOMPROC __glewDisableDriverControlQCOM = NULL; -PFNGLENABLEDRIVERCONTROLQCOMPROC __glewEnableDriverControlQCOM = NULL; -PFNGLGETDRIVERCONTROLSTRINGQCOMPROC __glewGetDriverControlStringQCOM = NULL; -PFNGLGETDRIVERCONTROLSQCOMPROC __glewGetDriverControlsQCOM = NULL; - -PFNGLEXTGETBUFFERPOINTERVQCOMPROC __glewExtGetBufferPointervQCOM = NULL; -PFNGLEXTGETBUFFERSQCOMPROC __glewExtGetBuffersQCOM = NULL; -PFNGLEXTGETFRAMEBUFFERSQCOMPROC __glewExtGetFramebuffersQCOM = NULL; -PFNGLEXTGETRENDERBUFFERSQCOMPROC __glewExtGetRenderbuffersQCOM = NULL; -PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC __glewExtGetTexLevelParameterivQCOM = NULL; -PFNGLEXTGETTEXSUBIMAGEQCOMPROC __glewExtGetTexSubImageQCOM = NULL; -PFNGLEXTGETTEXTURESQCOMPROC __glewExtGetTexturesQCOM = NULL; -PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC __glewExtTexObjectStateOverrideiQCOM = NULL; - -PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC __glewExtGetProgramBinarySourceQCOM = NULL; -PFNGLEXTGETPROGRAMSQCOMPROC __glewExtGetProgramsQCOM = NULL; -PFNGLEXTGETSHADERSQCOMPROC __glewExtGetShadersQCOM = NULL; -PFNGLEXTISPROGRAMBINARYQCOMPROC __glewExtIsProgramBinaryQCOM = NULL; - -PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC __glewFramebufferFoveationConfigQCOM = NULL; -PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC __glewFramebufferFoveationParametersQCOM = NULL; - -PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC __glewFramebufferFetchBarrierQCOM = NULL; - -PFNGLTEXTUREFOVEATIONPARAMETERSQCOMPROC __glewTextureFoveationParametersQCOM = NULL; - -PFNGLENDTILINGQCOMPROC __glewEndTilingQCOM = NULL; -PFNGLSTARTTILINGQCOMPROC __glewStartTilingQCOM = NULL; - -PFNGLALPHAFUNCXPROC __glewAlphaFuncx = NULL; -PFNGLCLEARCOLORXPROC __glewClearColorx = NULL; -PFNGLCLEARDEPTHXPROC __glewClearDepthx = NULL; -PFNGLCOLOR4XPROC __glewColor4x = NULL; -PFNGLDEPTHRANGEXPROC __glewDepthRangex = NULL; -PFNGLFOGXPROC __glewFogx = NULL; -PFNGLFOGXVPROC __glewFogxv = NULL; -PFNGLFRUSTUMFPROC __glewFrustumf = NULL; -PFNGLFRUSTUMXPROC __glewFrustumx = NULL; -PFNGLLIGHTMODELXPROC __glewLightModelx = NULL; -PFNGLLIGHTMODELXVPROC __glewLightModelxv = NULL; -PFNGLLIGHTXPROC __glewLightx = NULL; -PFNGLLIGHTXVPROC __glewLightxv = NULL; -PFNGLLINEWIDTHXPROC __glewLineWidthx = NULL; -PFNGLLOADMATRIXXPROC __glewLoadMatrixx = NULL; -PFNGLMATERIALXPROC __glewMaterialx = NULL; -PFNGLMATERIALXVPROC __glewMaterialxv = NULL; -PFNGLMULTMATRIXXPROC __glewMultMatrixx = NULL; -PFNGLMULTITEXCOORD4XPROC __glewMultiTexCoord4x = NULL; -PFNGLNORMAL3XPROC __glewNormal3x = NULL; -PFNGLORTHOFPROC __glewOrthof = NULL; -PFNGLORTHOXPROC __glewOrthox = NULL; -PFNGLPOINTSIZEXPROC __glewPointSizex = NULL; -PFNGLPOLYGONOFFSETXPROC __glewPolygonOffsetx = NULL; -PFNGLROTATEXPROC __glewRotatex = NULL; -PFNGLSAMPLECOVERAGEXPROC __glewSampleCoveragex = NULL; -PFNGLSCALEXPROC __glewScalex = NULL; -PFNGLTEXENVXPROC __glewTexEnvx = NULL; -PFNGLTEXENVXVPROC __glewTexEnvxv = NULL; -PFNGLTEXPARAMETERXPROC __glewTexParameterx = NULL; -PFNGLTRANSLATEXPROC __glewTranslatex = NULL; - -PFNGLCLIPPLANEFPROC __glewClipPlanef = NULL; -PFNGLCLIPPLANEXPROC __glewClipPlanex = NULL; -PFNGLGETCLIPPLANEFPROC __glewGetClipPlanef = NULL; -PFNGLGETCLIPPLANEXPROC __glewGetClipPlanex = NULL; -PFNGLGETFIXEDVPROC __glewGetFixedv = NULL; -PFNGLGETLIGHTXVPROC __glewGetLightxv = NULL; -PFNGLGETMATERIALXVPROC __glewGetMaterialxv = NULL; -PFNGLGETTEXENVXVPROC __glewGetTexEnvxv = NULL; -PFNGLGETTEXPARAMETERXVPROC __glewGetTexParameterxv = NULL; -PFNGLPOINTPARAMETERXPROC __glewPointParameterx = NULL; -PFNGLPOINTPARAMETERXVPROC __glewPointParameterxv = NULL; -PFNGLPOINTSIZEPOINTEROESPROC __glewPointSizePointerOES = NULL; -PFNGLTEXPARAMETERXVPROC __glewTexParameterxv = NULL; - -PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL = NULL; - -PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL = NULL; -PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL = NULL; - -PFNGLLOGMESSAGECALLBACKREGALPROC __glewLogMessageCallbackREGAL = NULL; - -PFNGLGETPROCADDRESSREGALPROC __glewGetProcAddressREGAL = NULL; - -PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS = NULL; -PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS = NULL; - -PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS = NULL; -PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS = NULL; - -PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS = NULL; -PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS = NULL; - -PFNGLINTERLEAVEDTEXTURECOORDSETSSGISPROC __glewInterleavedTextureCoordSetsSGIS = NULL; -PFNGLSELECTTEXTURECOORDSETSGISPROC __glewSelectTextureCoordSetSGIS = NULL; -PFNGLSELECTTEXTURESGISPROC __glewSelectTextureSGIS = NULL; -PFNGLSELECTTEXTURETRANSFORMSGISPROC __glewSelectTextureTransformSGIS = NULL; - -PFNGLMULTISAMPLESUBRECTPOSSGISPROC __glewMultisampleSubRectPosSGIS = NULL; - -PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS = NULL; -PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS = NULL; - -PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS = NULL; -PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS = NULL; - -PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS = NULL; -PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS = NULL; - -PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX = NULL; -PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX = NULL; -PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX = NULL; -PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX = NULL; -PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX = NULL; -PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX = NULL; - -PFNGLADDRESSSPACEPROC __glewAddressSpace = NULL; -PFNGLDATAPIPEPROC __glewDataPipe = NULL; - -PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX = NULL; - -PFNGLFOGLAYERSSGIXPROC __glewFogLayersSGIX = NULL; -PFNGLGETFOGLAYERSSGIXPROC __glewGetFogLayersSGIX = NULL; - -PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX = NULL; - -PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX = NULL; -PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX = NULL; -PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX = NULL; -PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX = NULL; -PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX = NULL; -PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX = NULL; -PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX = NULL; -PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX = NULL; -PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX = NULL; -PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX = NULL; -PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX = NULL; -PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX = NULL; -PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX = NULL; -PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX = NULL; -PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX = NULL; -PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX = NULL; -PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX = NULL; - -PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX = NULL; - -PFNGLIGLOOINTERFACESGIXPROC __glewIglooInterfaceSGIX = NULL; - -PFNGLALLOCMPEGPREDICTORSSGIXPROC __glewAllocMPEGPredictorsSGIX = NULL; -PFNGLDELETEMPEGPREDICTORSSGIXPROC __glewDeleteMPEGPredictorsSGIX = NULL; -PFNGLGENMPEGPREDICTORSSGIXPROC __glewGenMPEGPredictorsSGIX = NULL; -PFNGLGETMPEGPARAMETERFVSGIXPROC __glewGetMPEGParameterfvSGIX = NULL; -PFNGLGETMPEGPARAMETERIVSGIXPROC __glewGetMPEGParameterivSGIX = NULL; -PFNGLGETMPEGPREDICTORSGIXPROC __glewGetMPEGPredictorSGIX = NULL; -PFNGLGETMPEGQUANTTABLEUBVPROC __glewGetMPEGQuantTableubv = NULL; -PFNGLISMPEGPREDICTORSGIXPROC __glewIsMPEGPredictorSGIX = NULL; -PFNGLMPEGPREDICTORSGIXPROC __glewMPEGPredictorSGIX = NULL; -PFNGLMPEGQUANTTABLEUBVPROC __glewMPEGQuantTableubv = NULL; -PFNGLSWAPMPEGPREDICTORSSGIXPROC __glewSwapMPEGPredictorsSGIX = NULL; - -PFNGLGETNONLINLIGHTFVSGIXPROC __glewGetNonlinLightfvSGIX = NULL; -PFNGLGETNONLINMATERIALFVSGIXPROC __glewGetNonlinMaterialfvSGIX = NULL; -PFNGLNONLINLIGHTFVSGIXPROC __glewNonlinLightfvSGIX = NULL; -PFNGLNONLINMATERIALFVSGIXPROC __glewNonlinMaterialfvSGIX = NULL; - -PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX = NULL; - -PFNGLDEFORMSGIXPROC __glewDeformSGIX = NULL; -PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC __glewLoadIdentityDeformationMapSGIX = NULL; - -PFNGLMESHBREADTHSGIXPROC __glewMeshBreadthSGIX = NULL; -PFNGLMESHSTRIDESGIXPROC __glewMeshStrideSGIX = NULL; - -PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX = NULL; - -PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX = NULL; -PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX = NULL; -PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX = NULL; -PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX = NULL; - -PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX = NULL; - -PFNGLGETVECTOROPERATIONSGIXPROC __glewGetVectorOperationSGIX = NULL; -PFNGLVECTOROPERATIONSGIXPROC __glewVectorOperationSGIX = NULL; - -PFNGLAREVERTEXARRAYSRESIDENTSGIXPROC __glewAreVertexArraysResidentSGIX = NULL; -PFNGLBINDVERTEXARRAYSGIXPROC __glewBindVertexArraySGIX = NULL; -PFNGLDELETEVERTEXARRAYSSGIXPROC __glewDeleteVertexArraysSGIX = NULL; -PFNGLGENVERTEXARRAYSSGIXPROC __glewGenVertexArraysSGIX = NULL; -PFNGLISVERTEXARRAYSGIXPROC __glewIsVertexArraySGIX = NULL; -PFNGLPRIORITIZEVERTEXARRAYSSGIXPROC __glewPrioritizeVertexArraysSGIX = NULL; - -PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI = NULL; -PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI = NULL; -PFNGLCOLORTABLESGIPROC __glewColorTableSGI = NULL; -PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI = NULL; -PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI = NULL; -PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI = NULL; -PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI = NULL; - -PFNGLGETPIXELTRANSFORMPARAMETERFVSGIPROC __glewGetPixelTransformParameterfvSGI = NULL; -PFNGLGETPIXELTRANSFORMPARAMETERIVSGIPROC __glewGetPixelTransformParameterivSGI = NULL; -PFNGLPIXELTRANSFORMPARAMETERFSGIPROC __glewPixelTransformParameterfSGI = NULL; -PFNGLPIXELTRANSFORMPARAMETERFVSGIPROC __glewPixelTransformParameterfvSGI = NULL; -PFNGLPIXELTRANSFORMPARAMETERISGIPROC __glewPixelTransformParameteriSGI = NULL; -PFNGLPIXELTRANSFORMPARAMETERIVSGIPROC __glewPixelTransformParameterivSGI = NULL; -PFNGLPIXELTRANSFORMSGIPROC __glewPixelTransformSGI = NULL; - -PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX = NULL; - -PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN = NULL; -PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN = NULL; -PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN = NULL; -PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN = NULL; -PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN = NULL; -PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN = NULL; -PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN = NULL; -PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN = NULL; - -PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN = NULL; - -PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN = NULL; -PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN = NULL; -PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN = NULL; -PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN = NULL; -PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN = NULL; -PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN = NULL; -PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN = NULL; - -PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN = NULL; -PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN = NULL; -PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN = NULL; -PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN = NULL; -PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN = NULL; -PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN = NULL; -PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN = NULL; -PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN = NULL; -PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN = NULL; -PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN = NULL; -PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN = NULL; -PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN = NULL; -PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN = NULL; -PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN = NULL; -PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN = NULL; -PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN = NULL; -PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN = NULL; -PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN = NULL; -PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN = NULL; -PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN = NULL; -PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN = NULL; -PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN = NULL; -PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN = NULL; -PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN = NULL; - -PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN = NULL; - -GLboolean __GLEW_VERSION_1_1 = GL_FALSE; -GLboolean __GLEW_VERSION_1_2 = GL_FALSE; -GLboolean __GLEW_VERSION_1_2_1 = GL_FALSE; -GLboolean __GLEW_VERSION_1_3 = GL_FALSE; -GLboolean __GLEW_VERSION_1_4 = GL_FALSE; -GLboolean __GLEW_VERSION_1_5 = GL_FALSE; -GLboolean __GLEW_VERSION_2_0 = GL_FALSE; -GLboolean __GLEW_VERSION_2_1 = GL_FALSE; -GLboolean __GLEW_VERSION_3_0 = GL_FALSE; -GLboolean __GLEW_VERSION_3_1 = GL_FALSE; -GLboolean __GLEW_VERSION_3_2 = GL_FALSE; -GLboolean __GLEW_VERSION_3_3 = GL_FALSE; -GLboolean __GLEW_VERSION_4_0 = GL_FALSE; -GLboolean __GLEW_VERSION_4_1 = GL_FALSE; -GLboolean __GLEW_VERSION_4_2 = GL_FALSE; -GLboolean __GLEW_VERSION_4_3 = GL_FALSE; -GLboolean __GLEW_VERSION_4_4 = GL_FALSE; -GLboolean __GLEW_VERSION_4_5 = GL_FALSE; -GLboolean __GLEW_VERSION_4_6 = GL_FALSE; -GLboolean __GLEW_3DFX_multisample = GL_FALSE; -GLboolean __GLEW_3DFX_tbuffer = GL_FALSE; -GLboolean __GLEW_3DFX_texture_compression_FXT1 = GL_FALSE; -GLboolean __GLEW_AMD_blend_minmax_factor = GL_FALSE; -GLboolean __GLEW_AMD_compressed_3DC_texture = GL_FALSE; -GLboolean __GLEW_AMD_compressed_ATC_texture = GL_FALSE; -GLboolean __GLEW_AMD_conservative_depth = GL_FALSE; -GLboolean __GLEW_AMD_debug_output = GL_FALSE; -GLboolean __GLEW_AMD_depth_clamp_separate = GL_FALSE; -GLboolean __GLEW_AMD_draw_buffers_blend = GL_FALSE; -GLboolean __GLEW_AMD_framebuffer_multisample_advanced = GL_FALSE; -GLboolean __GLEW_AMD_framebuffer_sample_positions = GL_FALSE; -GLboolean __GLEW_AMD_gcn_shader = GL_FALSE; -GLboolean __GLEW_AMD_gpu_shader_half_float = GL_FALSE; -GLboolean __GLEW_AMD_gpu_shader_half_float_fetch = GL_FALSE; -GLboolean __GLEW_AMD_gpu_shader_int16 = GL_FALSE; -GLboolean __GLEW_AMD_gpu_shader_int64 = GL_FALSE; -GLboolean __GLEW_AMD_interleaved_elements = GL_FALSE; -GLboolean __GLEW_AMD_multi_draw_indirect = GL_FALSE; -GLboolean __GLEW_AMD_name_gen_delete = GL_FALSE; -GLboolean __GLEW_AMD_occlusion_query_event = GL_FALSE; -GLboolean __GLEW_AMD_performance_monitor = GL_FALSE; -GLboolean __GLEW_AMD_pinned_memory = GL_FALSE; -GLboolean __GLEW_AMD_program_binary_Z400 = GL_FALSE; -GLboolean __GLEW_AMD_query_buffer_object = GL_FALSE; -GLboolean __GLEW_AMD_sample_positions = GL_FALSE; -GLboolean __GLEW_AMD_seamless_cubemap_per_texture = GL_FALSE; -GLboolean __GLEW_AMD_shader_atomic_counter_ops = GL_FALSE; -GLboolean __GLEW_AMD_shader_ballot = GL_FALSE; -GLboolean __GLEW_AMD_shader_explicit_vertex_parameter = GL_FALSE; -GLboolean __GLEW_AMD_shader_image_load_store_lod = GL_FALSE; -GLboolean __GLEW_AMD_shader_stencil_export = GL_FALSE; -GLboolean __GLEW_AMD_shader_stencil_value_export = GL_FALSE; -GLboolean __GLEW_AMD_shader_trinary_minmax = GL_FALSE; -GLboolean __GLEW_AMD_sparse_texture = GL_FALSE; -GLboolean __GLEW_AMD_stencil_operation_extended = GL_FALSE; -GLboolean __GLEW_AMD_texture_gather_bias_lod = GL_FALSE; -GLboolean __GLEW_AMD_texture_texture4 = GL_FALSE; -GLboolean __GLEW_AMD_transform_feedback3_lines_triangles = GL_FALSE; -GLboolean __GLEW_AMD_transform_feedback4 = GL_FALSE; -GLboolean __GLEW_AMD_vertex_shader_layer = GL_FALSE; -GLboolean __GLEW_AMD_vertex_shader_tessellator = GL_FALSE; -GLboolean __GLEW_AMD_vertex_shader_viewport_index = GL_FALSE; -GLboolean __GLEW_ANDROID_extension_pack_es31a = GL_FALSE; -GLboolean __GLEW_ANGLE_depth_texture = GL_FALSE; -GLboolean __GLEW_ANGLE_framebuffer_blit = GL_FALSE; -GLboolean __GLEW_ANGLE_framebuffer_multisample = GL_FALSE; -GLboolean __GLEW_ANGLE_instanced_arrays = GL_FALSE; -GLboolean __GLEW_ANGLE_pack_reverse_row_order = GL_FALSE; -GLboolean __GLEW_ANGLE_program_binary = GL_FALSE; -GLboolean __GLEW_ANGLE_texture_compression_dxt1 = GL_FALSE; -GLboolean __GLEW_ANGLE_texture_compression_dxt3 = GL_FALSE; -GLboolean __GLEW_ANGLE_texture_compression_dxt5 = GL_FALSE; -GLboolean __GLEW_ANGLE_texture_usage = GL_FALSE; -GLboolean __GLEW_ANGLE_timer_query = GL_FALSE; -GLboolean __GLEW_ANGLE_translated_shader_source = GL_FALSE; -GLboolean __GLEW_APPLE_aux_depth_stencil = GL_FALSE; -GLboolean __GLEW_APPLE_client_storage = GL_FALSE; -GLboolean __GLEW_APPLE_clip_distance = GL_FALSE; -GLboolean __GLEW_APPLE_color_buffer_packed_float = GL_FALSE; -GLboolean __GLEW_APPLE_copy_texture_levels = GL_FALSE; -GLboolean __GLEW_APPLE_element_array = GL_FALSE; -GLboolean __GLEW_APPLE_fence = GL_FALSE; -GLboolean __GLEW_APPLE_float_pixels = GL_FALSE; -GLboolean __GLEW_APPLE_flush_buffer_range = GL_FALSE; -GLboolean __GLEW_APPLE_framebuffer_multisample = GL_FALSE; -GLboolean __GLEW_APPLE_object_purgeable = GL_FALSE; -GLboolean __GLEW_APPLE_pixel_buffer = GL_FALSE; -GLboolean __GLEW_APPLE_rgb_422 = GL_FALSE; -GLboolean __GLEW_APPLE_row_bytes = GL_FALSE; -GLboolean __GLEW_APPLE_specular_vector = GL_FALSE; -GLboolean __GLEW_APPLE_sync = GL_FALSE; -GLboolean __GLEW_APPLE_texture_2D_limited_npot = GL_FALSE; -GLboolean __GLEW_APPLE_texture_format_BGRA8888 = GL_FALSE; -GLboolean __GLEW_APPLE_texture_max_level = GL_FALSE; -GLboolean __GLEW_APPLE_texture_packed_float = GL_FALSE; -GLboolean __GLEW_APPLE_texture_range = GL_FALSE; -GLboolean __GLEW_APPLE_transform_hint = GL_FALSE; -GLboolean __GLEW_APPLE_vertex_array_object = GL_FALSE; -GLboolean __GLEW_APPLE_vertex_array_range = GL_FALSE; -GLboolean __GLEW_APPLE_vertex_program_evaluators = GL_FALSE; -GLboolean __GLEW_APPLE_ycbcr_422 = GL_FALSE; -GLboolean __GLEW_ARB_ES2_compatibility = GL_FALSE; -GLboolean __GLEW_ARB_ES3_1_compatibility = GL_FALSE; -GLboolean __GLEW_ARB_ES3_2_compatibility = GL_FALSE; -GLboolean __GLEW_ARB_ES3_compatibility = GL_FALSE; -GLboolean __GLEW_ARB_arrays_of_arrays = GL_FALSE; -GLboolean __GLEW_ARB_base_instance = GL_FALSE; -GLboolean __GLEW_ARB_bindless_texture = GL_FALSE; -GLboolean __GLEW_ARB_blend_func_extended = GL_FALSE; -GLboolean __GLEW_ARB_buffer_storage = GL_FALSE; -GLboolean __GLEW_ARB_cl_event = GL_FALSE; -GLboolean __GLEW_ARB_clear_buffer_object = GL_FALSE; -GLboolean __GLEW_ARB_clear_texture = GL_FALSE; -GLboolean __GLEW_ARB_clip_control = GL_FALSE; -GLboolean __GLEW_ARB_color_buffer_float = GL_FALSE; -GLboolean __GLEW_ARB_compatibility = GL_FALSE; -GLboolean __GLEW_ARB_compressed_texture_pixel_storage = GL_FALSE; -GLboolean __GLEW_ARB_compute_shader = GL_FALSE; -GLboolean __GLEW_ARB_compute_variable_group_size = GL_FALSE; -GLboolean __GLEW_ARB_conditional_render_inverted = GL_FALSE; -GLboolean __GLEW_ARB_conservative_depth = GL_FALSE; -GLboolean __GLEW_ARB_copy_buffer = GL_FALSE; -GLboolean __GLEW_ARB_copy_image = GL_FALSE; -GLboolean __GLEW_ARB_cull_distance = GL_FALSE; -GLboolean __GLEW_ARB_debug_output = GL_FALSE; -GLboolean __GLEW_ARB_depth_buffer_float = GL_FALSE; -GLboolean __GLEW_ARB_depth_clamp = GL_FALSE; -GLboolean __GLEW_ARB_depth_texture = GL_FALSE; -GLboolean __GLEW_ARB_derivative_control = GL_FALSE; -GLboolean __GLEW_ARB_direct_state_access = GL_FALSE; -GLboolean __GLEW_ARB_draw_buffers = GL_FALSE; -GLboolean __GLEW_ARB_draw_buffers_blend = GL_FALSE; -GLboolean __GLEW_ARB_draw_elements_base_vertex = GL_FALSE; -GLboolean __GLEW_ARB_draw_indirect = GL_FALSE; -GLboolean __GLEW_ARB_draw_instanced = GL_FALSE; -GLboolean __GLEW_ARB_enhanced_layouts = GL_FALSE; -GLboolean __GLEW_ARB_explicit_attrib_location = GL_FALSE; -GLboolean __GLEW_ARB_explicit_uniform_location = GL_FALSE; -GLboolean __GLEW_ARB_fragment_coord_conventions = GL_FALSE; -GLboolean __GLEW_ARB_fragment_layer_viewport = GL_FALSE; -GLboolean __GLEW_ARB_fragment_program = GL_FALSE; -GLboolean __GLEW_ARB_fragment_program_shadow = GL_FALSE; -GLboolean __GLEW_ARB_fragment_shader = GL_FALSE; -GLboolean __GLEW_ARB_fragment_shader_interlock = GL_FALSE; -GLboolean __GLEW_ARB_framebuffer_no_attachments = GL_FALSE; -GLboolean __GLEW_ARB_framebuffer_object = GL_FALSE; -GLboolean __GLEW_ARB_framebuffer_sRGB = GL_FALSE; -GLboolean __GLEW_ARB_geometry_shader4 = GL_FALSE; -GLboolean __GLEW_ARB_get_program_binary = GL_FALSE; -GLboolean __GLEW_ARB_get_texture_sub_image = GL_FALSE; -GLboolean __GLEW_ARB_gl_spirv = GL_FALSE; -GLboolean __GLEW_ARB_gpu_shader5 = GL_FALSE; -GLboolean __GLEW_ARB_gpu_shader_fp64 = GL_FALSE; -GLboolean __GLEW_ARB_gpu_shader_int64 = GL_FALSE; -GLboolean __GLEW_ARB_half_float_pixel = GL_FALSE; -GLboolean __GLEW_ARB_half_float_vertex = GL_FALSE; -GLboolean __GLEW_ARB_imaging = GL_FALSE; -GLboolean __GLEW_ARB_indirect_parameters = GL_FALSE; -GLboolean __GLEW_ARB_instanced_arrays = GL_FALSE; -GLboolean __GLEW_ARB_internalformat_query = GL_FALSE; -GLboolean __GLEW_ARB_internalformat_query2 = GL_FALSE; -GLboolean __GLEW_ARB_invalidate_subdata = GL_FALSE; -GLboolean __GLEW_ARB_map_buffer_alignment = GL_FALSE; -GLboolean __GLEW_ARB_map_buffer_range = GL_FALSE; -GLboolean __GLEW_ARB_matrix_palette = GL_FALSE; -GLboolean __GLEW_ARB_multi_bind = GL_FALSE; -GLboolean __GLEW_ARB_multi_draw_indirect = GL_FALSE; -GLboolean __GLEW_ARB_multisample = GL_FALSE; -GLboolean __GLEW_ARB_multitexture = GL_FALSE; -GLboolean __GLEW_ARB_occlusion_query = GL_FALSE; -GLboolean __GLEW_ARB_occlusion_query2 = GL_FALSE; -GLboolean __GLEW_ARB_parallel_shader_compile = GL_FALSE; -GLboolean __GLEW_ARB_pipeline_statistics_query = GL_FALSE; -GLboolean __GLEW_ARB_pixel_buffer_object = GL_FALSE; -GLboolean __GLEW_ARB_point_parameters = GL_FALSE; -GLboolean __GLEW_ARB_point_sprite = GL_FALSE; -GLboolean __GLEW_ARB_polygon_offset_clamp = GL_FALSE; -GLboolean __GLEW_ARB_post_depth_coverage = GL_FALSE; -GLboolean __GLEW_ARB_program_interface_query = GL_FALSE; -GLboolean __GLEW_ARB_provoking_vertex = GL_FALSE; -GLboolean __GLEW_ARB_query_buffer_object = GL_FALSE; -GLboolean __GLEW_ARB_robust_buffer_access_behavior = GL_FALSE; -GLboolean __GLEW_ARB_robustness = GL_FALSE; -GLboolean __GLEW_ARB_robustness_application_isolation = GL_FALSE; -GLboolean __GLEW_ARB_robustness_share_group_isolation = GL_FALSE; -GLboolean __GLEW_ARB_sample_locations = GL_FALSE; -GLboolean __GLEW_ARB_sample_shading = GL_FALSE; -GLboolean __GLEW_ARB_sampler_objects = GL_FALSE; -GLboolean __GLEW_ARB_seamless_cube_map = GL_FALSE; -GLboolean __GLEW_ARB_seamless_cubemap_per_texture = GL_FALSE; -GLboolean __GLEW_ARB_separate_shader_objects = GL_FALSE; -GLboolean __GLEW_ARB_shader_atomic_counter_ops = GL_FALSE; -GLboolean __GLEW_ARB_shader_atomic_counters = GL_FALSE; -GLboolean __GLEW_ARB_shader_ballot = GL_FALSE; -GLboolean __GLEW_ARB_shader_bit_encoding = GL_FALSE; -GLboolean __GLEW_ARB_shader_clock = GL_FALSE; -GLboolean __GLEW_ARB_shader_draw_parameters = GL_FALSE; -GLboolean __GLEW_ARB_shader_group_vote = GL_FALSE; -GLboolean __GLEW_ARB_shader_image_load_store = GL_FALSE; -GLboolean __GLEW_ARB_shader_image_size = GL_FALSE; -GLboolean __GLEW_ARB_shader_objects = GL_FALSE; -GLboolean __GLEW_ARB_shader_precision = GL_FALSE; -GLboolean __GLEW_ARB_shader_stencil_export = GL_FALSE; -GLboolean __GLEW_ARB_shader_storage_buffer_object = GL_FALSE; -GLboolean __GLEW_ARB_shader_subroutine = GL_FALSE; -GLboolean __GLEW_ARB_shader_texture_image_samples = GL_FALSE; -GLboolean __GLEW_ARB_shader_texture_lod = GL_FALSE; -GLboolean __GLEW_ARB_shader_viewport_layer_array = GL_FALSE; -GLboolean __GLEW_ARB_shading_language_100 = GL_FALSE; -GLboolean __GLEW_ARB_shading_language_420pack = GL_FALSE; -GLboolean __GLEW_ARB_shading_language_include = GL_FALSE; -GLboolean __GLEW_ARB_shading_language_packing = GL_FALSE; -GLboolean __GLEW_ARB_shadow = GL_FALSE; -GLboolean __GLEW_ARB_shadow_ambient = GL_FALSE; -GLboolean __GLEW_ARB_sparse_buffer = GL_FALSE; -GLboolean __GLEW_ARB_sparse_texture = GL_FALSE; -GLboolean __GLEW_ARB_sparse_texture2 = GL_FALSE; -GLboolean __GLEW_ARB_sparse_texture_clamp = GL_FALSE; -GLboolean __GLEW_ARB_spirv_extensions = GL_FALSE; -GLboolean __GLEW_ARB_stencil_texturing = GL_FALSE; -GLboolean __GLEW_ARB_sync = GL_FALSE; -GLboolean __GLEW_ARB_tessellation_shader = GL_FALSE; -GLboolean __GLEW_ARB_texture_barrier = GL_FALSE; -GLboolean __GLEW_ARB_texture_border_clamp = GL_FALSE; -GLboolean __GLEW_ARB_texture_buffer_object = GL_FALSE; -GLboolean __GLEW_ARB_texture_buffer_object_rgb32 = GL_FALSE; -GLboolean __GLEW_ARB_texture_buffer_range = GL_FALSE; -GLboolean __GLEW_ARB_texture_compression = GL_FALSE; -GLboolean __GLEW_ARB_texture_compression_bptc = GL_FALSE; -GLboolean __GLEW_ARB_texture_compression_rgtc = GL_FALSE; -GLboolean __GLEW_ARB_texture_cube_map = GL_FALSE; -GLboolean __GLEW_ARB_texture_cube_map_array = GL_FALSE; -GLboolean __GLEW_ARB_texture_env_add = GL_FALSE; -GLboolean __GLEW_ARB_texture_env_combine = GL_FALSE; -GLboolean __GLEW_ARB_texture_env_crossbar = GL_FALSE; -GLboolean __GLEW_ARB_texture_env_dot3 = GL_FALSE; -GLboolean __GLEW_ARB_texture_filter_anisotropic = GL_FALSE; -GLboolean __GLEW_ARB_texture_filter_minmax = GL_FALSE; -GLboolean __GLEW_ARB_texture_float = GL_FALSE; -GLboolean __GLEW_ARB_texture_gather = GL_FALSE; -GLboolean __GLEW_ARB_texture_mirror_clamp_to_edge = GL_FALSE; -GLboolean __GLEW_ARB_texture_mirrored_repeat = GL_FALSE; -GLboolean __GLEW_ARB_texture_multisample = GL_FALSE; -GLboolean __GLEW_ARB_texture_non_power_of_two = GL_FALSE; -GLboolean __GLEW_ARB_texture_query_levels = GL_FALSE; -GLboolean __GLEW_ARB_texture_query_lod = GL_FALSE; -GLboolean __GLEW_ARB_texture_rectangle = GL_FALSE; -GLboolean __GLEW_ARB_texture_rg = GL_FALSE; -GLboolean __GLEW_ARB_texture_rgb10_a2ui = GL_FALSE; -GLboolean __GLEW_ARB_texture_stencil8 = GL_FALSE; -GLboolean __GLEW_ARB_texture_storage = GL_FALSE; -GLboolean __GLEW_ARB_texture_storage_multisample = GL_FALSE; -GLboolean __GLEW_ARB_texture_swizzle = GL_FALSE; -GLboolean __GLEW_ARB_texture_view = GL_FALSE; -GLboolean __GLEW_ARB_timer_query = GL_FALSE; -GLboolean __GLEW_ARB_transform_feedback2 = GL_FALSE; -GLboolean __GLEW_ARB_transform_feedback3 = GL_FALSE; -GLboolean __GLEW_ARB_transform_feedback_instanced = GL_FALSE; -GLboolean __GLEW_ARB_transform_feedback_overflow_query = GL_FALSE; -GLboolean __GLEW_ARB_transpose_matrix = GL_FALSE; -GLboolean __GLEW_ARB_uniform_buffer_object = GL_FALSE; -GLboolean __GLEW_ARB_vertex_array_bgra = GL_FALSE; -GLboolean __GLEW_ARB_vertex_array_object = GL_FALSE; -GLboolean __GLEW_ARB_vertex_attrib_64bit = GL_FALSE; -GLboolean __GLEW_ARB_vertex_attrib_binding = GL_FALSE; -GLboolean __GLEW_ARB_vertex_blend = GL_FALSE; -GLboolean __GLEW_ARB_vertex_buffer_object = GL_FALSE; -GLboolean __GLEW_ARB_vertex_program = GL_FALSE; -GLboolean __GLEW_ARB_vertex_shader = GL_FALSE; -GLboolean __GLEW_ARB_vertex_type_10f_11f_11f_rev = GL_FALSE; -GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev = GL_FALSE; -GLboolean __GLEW_ARB_viewport_array = GL_FALSE; -GLboolean __GLEW_ARB_window_pos = GL_FALSE; -GLboolean __GLEW_ARM_mali_program_binary = GL_FALSE; -GLboolean __GLEW_ARM_mali_shader_binary = GL_FALSE; -GLboolean __GLEW_ARM_rgba8 = GL_FALSE; -GLboolean __GLEW_ARM_shader_framebuffer_fetch = GL_FALSE; -GLboolean __GLEW_ARM_shader_framebuffer_fetch_depth_stencil = GL_FALSE; -GLboolean __GLEW_ARM_texture_unnormalized_coordinates = GL_FALSE; -GLboolean __GLEW_ATIX_point_sprites = GL_FALSE; -GLboolean __GLEW_ATIX_texture_env_combine3 = GL_FALSE; -GLboolean __GLEW_ATIX_texture_env_route = GL_FALSE; -GLboolean __GLEW_ATIX_vertex_shader_output_point_size = GL_FALSE; -GLboolean __GLEW_ATI_draw_buffers = GL_FALSE; -GLboolean __GLEW_ATI_element_array = GL_FALSE; -GLboolean __GLEW_ATI_envmap_bumpmap = GL_FALSE; -GLboolean __GLEW_ATI_fragment_shader = GL_FALSE; -GLboolean __GLEW_ATI_map_object_buffer = GL_FALSE; -GLboolean __GLEW_ATI_meminfo = GL_FALSE; -GLboolean __GLEW_ATI_pn_triangles = GL_FALSE; -GLboolean __GLEW_ATI_separate_stencil = GL_FALSE; -GLboolean __GLEW_ATI_shader_texture_lod = GL_FALSE; -GLboolean __GLEW_ATI_text_fragment_shader = GL_FALSE; -GLboolean __GLEW_ATI_texture_compression_3dc = GL_FALSE; -GLboolean __GLEW_ATI_texture_env_combine3 = GL_FALSE; -GLboolean __GLEW_ATI_texture_float = GL_FALSE; -GLboolean __GLEW_ATI_texture_mirror_once = GL_FALSE; -GLboolean __GLEW_ATI_vertex_array_object = GL_FALSE; -GLboolean __GLEW_ATI_vertex_attrib_array_object = GL_FALSE; -GLboolean __GLEW_ATI_vertex_streams = GL_FALSE; -GLboolean __GLEW_DMP_program_binary = GL_FALSE; -GLboolean __GLEW_DMP_shader_binary = GL_FALSE; -GLboolean __GLEW_EXT_422_pixels = GL_FALSE; -GLboolean __GLEW_EXT_Cg_shader = GL_FALSE; -GLboolean __GLEW_EXT_EGL_image_array = GL_FALSE; -GLboolean __GLEW_EXT_EGL_image_external_wrap_modes = GL_FALSE; -GLboolean __GLEW_EXT_EGL_image_storage = GL_FALSE; -GLboolean __GLEW_EXT_EGL_sync = GL_FALSE; -GLboolean __GLEW_EXT_YUV_target = GL_FALSE; -GLboolean __GLEW_EXT_abgr = GL_FALSE; -GLboolean __GLEW_EXT_base_instance = GL_FALSE; -GLboolean __GLEW_EXT_bgra = GL_FALSE; -GLboolean __GLEW_EXT_bindable_uniform = GL_FALSE; -GLboolean __GLEW_EXT_blend_color = GL_FALSE; -GLboolean __GLEW_EXT_blend_equation_separate = GL_FALSE; -GLboolean __GLEW_EXT_blend_func_extended = GL_FALSE; -GLboolean __GLEW_EXT_blend_func_separate = GL_FALSE; -GLboolean __GLEW_EXT_blend_logic_op = GL_FALSE; -GLboolean __GLEW_EXT_blend_minmax = GL_FALSE; -GLboolean __GLEW_EXT_blend_subtract = GL_FALSE; -GLboolean __GLEW_EXT_buffer_storage = GL_FALSE; -GLboolean __GLEW_EXT_clear_texture = GL_FALSE; -GLboolean __GLEW_EXT_clip_control = GL_FALSE; -GLboolean __GLEW_EXT_clip_cull_distance = GL_FALSE; -GLboolean __GLEW_EXT_clip_volume_hint = GL_FALSE; -GLboolean __GLEW_EXT_cmyka = GL_FALSE; -GLboolean __GLEW_EXT_color_buffer_float = GL_FALSE; -GLboolean __GLEW_EXT_color_buffer_half_float = GL_FALSE; -GLboolean __GLEW_EXT_color_subtable = GL_FALSE; -GLboolean __GLEW_EXT_compiled_vertex_array = GL_FALSE; -GLboolean __GLEW_EXT_compressed_ETC1_RGB8_sub_texture = GL_FALSE; -GLboolean __GLEW_EXT_conservative_depth = GL_FALSE; -GLboolean __GLEW_EXT_convolution = GL_FALSE; -GLboolean __GLEW_EXT_coordinate_frame = GL_FALSE; -GLboolean __GLEW_EXT_copy_image = GL_FALSE; -GLboolean __GLEW_EXT_copy_texture = GL_FALSE; -GLboolean __GLEW_EXT_cull_vertex = GL_FALSE; -GLboolean __GLEW_EXT_debug_label = GL_FALSE; -GLboolean __GLEW_EXT_debug_marker = GL_FALSE; -GLboolean __GLEW_EXT_depth_bounds_test = GL_FALSE; -GLboolean __GLEW_EXT_depth_clamp = GL_FALSE; -GLboolean __GLEW_EXT_direct_state_access = GL_FALSE; -GLboolean __GLEW_EXT_discard_framebuffer = GL_FALSE; -GLboolean __GLEW_EXT_disjoint_timer_query = GL_FALSE; -GLboolean __GLEW_EXT_draw_buffers = GL_FALSE; -GLboolean __GLEW_EXT_draw_buffers2 = GL_FALSE; -GLboolean __GLEW_EXT_draw_buffers_indexed = GL_FALSE; -GLboolean __GLEW_EXT_draw_elements_base_vertex = GL_FALSE; -GLboolean __GLEW_EXT_draw_instanced = GL_FALSE; -GLboolean __GLEW_EXT_draw_range_elements = GL_FALSE; -GLboolean __GLEW_EXT_draw_transform_feedback = GL_FALSE; -GLboolean __GLEW_EXT_external_buffer = GL_FALSE; -GLboolean __GLEW_EXT_float_blend = GL_FALSE; -GLboolean __GLEW_EXT_fog_coord = GL_FALSE; -GLboolean __GLEW_EXT_frag_depth = GL_FALSE; -GLboolean __GLEW_EXT_fragment_lighting = GL_FALSE; -GLboolean __GLEW_EXT_framebuffer_blit = GL_FALSE; -GLboolean __GLEW_EXT_framebuffer_multisample = GL_FALSE; -GLboolean __GLEW_EXT_framebuffer_multisample_blit_scaled = GL_FALSE; -GLboolean __GLEW_EXT_framebuffer_object = GL_FALSE; -GLboolean __GLEW_EXT_framebuffer_sRGB = GL_FALSE; -GLboolean __GLEW_EXT_geometry_point_size = GL_FALSE; -GLboolean __GLEW_EXT_geometry_shader = GL_FALSE; -GLboolean __GLEW_EXT_geometry_shader4 = GL_FALSE; -GLboolean __GLEW_EXT_gpu_program_parameters = GL_FALSE; -GLboolean __GLEW_EXT_gpu_shader4 = GL_FALSE; -GLboolean __GLEW_EXT_gpu_shader5 = GL_FALSE; -GLboolean __GLEW_EXT_histogram = GL_FALSE; -GLboolean __GLEW_EXT_index_array_formats = GL_FALSE; -GLboolean __GLEW_EXT_index_func = GL_FALSE; -GLboolean __GLEW_EXT_index_material = GL_FALSE; -GLboolean __GLEW_EXT_index_texture = GL_FALSE; -GLboolean __GLEW_EXT_instanced_arrays = GL_FALSE; -GLboolean __GLEW_EXT_light_texture = GL_FALSE; -GLboolean __GLEW_EXT_map_buffer_range = GL_FALSE; -GLboolean __GLEW_EXT_memory_object = GL_FALSE; -GLboolean __GLEW_EXT_memory_object_fd = GL_FALSE; -GLboolean __GLEW_EXT_memory_object_win32 = GL_FALSE; -GLboolean __GLEW_EXT_misc_attribute = GL_FALSE; -GLboolean __GLEW_EXT_multi_draw_arrays = GL_FALSE; -GLboolean __GLEW_EXT_multi_draw_indirect = GL_FALSE; -GLboolean __GLEW_EXT_multiple_textures = GL_FALSE; -GLboolean __GLEW_EXT_multisample = GL_FALSE; -GLboolean __GLEW_EXT_multisample_compatibility = GL_FALSE; -GLboolean __GLEW_EXT_multisampled_render_to_texture = GL_FALSE; -GLboolean __GLEW_EXT_multisampled_render_to_texture2 = GL_FALSE; -GLboolean __GLEW_EXT_multiview_draw_buffers = GL_FALSE; -GLboolean __GLEW_EXT_multiview_tessellation_geometry_shader = GL_FALSE; -GLboolean __GLEW_EXT_multiview_texture_multisample = GL_FALSE; -GLboolean __GLEW_EXT_multiview_timer_query = GL_FALSE; -GLboolean __GLEW_EXT_occlusion_query_boolean = GL_FALSE; -GLboolean __GLEW_EXT_packed_depth_stencil = GL_FALSE; -GLboolean __GLEW_EXT_packed_float = GL_FALSE; -GLboolean __GLEW_EXT_packed_pixels = GL_FALSE; -GLboolean __GLEW_EXT_paletted_texture = GL_FALSE; -GLboolean __GLEW_EXT_pixel_buffer_object = GL_FALSE; -GLboolean __GLEW_EXT_pixel_transform = GL_FALSE; -GLboolean __GLEW_EXT_pixel_transform_color_table = GL_FALSE; -GLboolean __GLEW_EXT_point_parameters = GL_FALSE; -GLboolean __GLEW_EXT_polygon_offset = GL_FALSE; -GLboolean __GLEW_EXT_polygon_offset_clamp = GL_FALSE; -GLboolean __GLEW_EXT_post_depth_coverage = GL_FALSE; -GLboolean __GLEW_EXT_primitive_bounding_box = GL_FALSE; -GLboolean __GLEW_EXT_protected_textures = GL_FALSE; -GLboolean __GLEW_EXT_provoking_vertex = GL_FALSE; -GLboolean __GLEW_EXT_pvrtc_sRGB = GL_FALSE; -GLboolean __GLEW_EXT_raster_multisample = GL_FALSE; -GLboolean __GLEW_EXT_read_format_bgra = GL_FALSE; -GLboolean __GLEW_EXT_render_snorm = GL_FALSE; -GLboolean __GLEW_EXT_rescale_normal = GL_FALSE; -GLboolean __GLEW_EXT_robustness = GL_FALSE; -GLboolean __GLEW_EXT_sRGB = GL_FALSE; -GLboolean __GLEW_EXT_sRGB_write_control = GL_FALSE; -GLboolean __GLEW_EXT_scene_marker = GL_FALSE; -GLboolean __GLEW_EXT_secondary_color = GL_FALSE; -GLboolean __GLEW_EXT_semaphore = GL_FALSE; -GLboolean __GLEW_EXT_semaphore_fd = GL_FALSE; -GLboolean __GLEW_EXT_semaphore_win32 = GL_FALSE; -GLboolean __GLEW_EXT_separate_shader_objects = GL_FALSE; -GLboolean __GLEW_EXT_separate_specular_color = GL_FALSE; -GLboolean __GLEW_EXT_shader_framebuffer_fetch = GL_FALSE; -GLboolean __GLEW_EXT_shader_framebuffer_fetch_non_coherent = GL_FALSE; -GLboolean __GLEW_EXT_shader_group_vote = GL_FALSE; -GLboolean __GLEW_EXT_shader_image_load_formatted = GL_FALSE; -GLboolean __GLEW_EXT_shader_image_load_store = GL_FALSE; -GLboolean __GLEW_EXT_shader_implicit_conversions = GL_FALSE; -GLboolean __GLEW_EXT_shader_integer_mix = GL_FALSE; -GLboolean __GLEW_EXT_shader_io_blocks = GL_FALSE; -GLboolean __GLEW_EXT_shader_non_constant_global_initializers = GL_FALSE; -GLboolean __GLEW_EXT_shader_pixel_local_storage = GL_FALSE; -GLboolean __GLEW_EXT_shader_pixel_local_storage2 = GL_FALSE; -GLboolean __GLEW_EXT_shader_texture_lod = GL_FALSE; -GLboolean __GLEW_EXT_shadow_funcs = GL_FALSE; -GLboolean __GLEW_EXT_shadow_samplers = GL_FALSE; -GLboolean __GLEW_EXT_shared_texture_palette = GL_FALSE; -GLboolean __GLEW_EXT_sparse_texture = GL_FALSE; -GLboolean __GLEW_EXT_sparse_texture2 = GL_FALSE; -GLboolean __GLEW_EXT_static_vertex_array = GL_FALSE; -GLboolean __GLEW_EXT_stencil_clear_tag = GL_FALSE; -GLboolean __GLEW_EXT_stencil_two_side = GL_FALSE; -GLboolean __GLEW_EXT_stencil_wrap = GL_FALSE; -GLboolean __GLEW_EXT_subtexture = GL_FALSE; -GLboolean __GLEW_EXT_tessellation_point_size = GL_FALSE; -GLboolean __GLEW_EXT_tessellation_shader = GL_FALSE; -GLboolean __GLEW_EXT_texture = GL_FALSE; -GLboolean __GLEW_EXT_texture3D = GL_FALSE; -GLboolean __GLEW_EXT_texture_array = GL_FALSE; -GLboolean __GLEW_EXT_texture_border_clamp = GL_FALSE; -GLboolean __GLEW_EXT_texture_buffer = GL_FALSE; -GLboolean __GLEW_EXT_texture_buffer_object = GL_FALSE; -GLboolean __GLEW_EXT_texture_compression_astc_decode_mode = GL_FALSE; -GLboolean __GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5 = GL_FALSE; -GLboolean __GLEW_EXT_texture_compression_bptc = GL_FALSE; -GLboolean __GLEW_EXT_texture_compression_dxt1 = GL_FALSE; -GLboolean __GLEW_EXT_texture_compression_latc = GL_FALSE; -GLboolean __GLEW_EXT_texture_compression_rgtc = GL_FALSE; -GLboolean __GLEW_EXT_texture_compression_s3tc = GL_FALSE; -GLboolean __GLEW_EXT_texture_compression_s3tc_srgb = GL_FALSE; -GLboolean __GLEW_EXT_texture_cube_map = GL_FALSE; -GLboolean __GLEW_EXT_texture_cube_map_array = GL_FALSE; -GLboolean __GLEW_EXT_texture_edge_clamp = GL_FALSE; -GLboolean __GLEW_EXT_texture_env = GL_FALSE; -GLboolean __GLEW_EXT_texture_env_add = GL_FALSE; -GLboolean __GLEW_EXT_texture_env_combine = GL_FALSE; -GLboolean __GLEW_EXT_texture_env_dot3 = GL_FALSE; -GLboolean __GLEW_EXT_texture_filter_anisotropic = GL_FALSE; -GLboolean __GLEW_EXT_texture_filter_minmax = GL_FALSE; -GLboolean __GLEW_EXT_texture_format_BGRA8888 = GL_FALSE; -GLboolean __GLEW_EXT_texture_format_sRGB_override = GL_FALSE; -GLboolean __GLEW_EXT_texture_integer = GL_FALSE; -GLboolean __GLEW_EXT_texture_lod_bias = GL_FALSE; -GLboolean __GLEW_EXT_texture_mirror_clamp = GL_FALSE; -GLboolean __GLEW_EXT_texture_mirror_clamp_to_edge = GL_FALSE; -GLboolean __GLEW_EXT_texture_norm16 = GL_FALSE; -GLboolean __GLEW_EXT_texture_object = GL_FALSE; -GLboolean __GLEW_EXT_texture_perturb_normal = GL_FALSE; -GLboolean __GLEW_EXT_texture_query_lod = GL_FALSE; -GLboolean __GLEW_EXT_texture_rectangle = GL_FALSE; -GLboolean __GLEW_EXT_texture_rg = GL_FALSE; -GLboolean __GLEW_EXT_texture_sRGB = GL_FALSE; -GLboolean __GLEW_EXT_texture_sRGB_R8 = GL_FALSE; -GLboolean __GLEW_EXT_texture_sRGB_RG8 = GL_FALSE; -GLboolean __GLEW_EXT_texture_sRGB_decode = GL_FALSE; -GLboolean __GLEW_EXT_texture_shadow_lod = GL_FALSE; -GLboolean __GLEW_EXT_texture_shared_exponent = GL_FALSE; -GLboolean __GLEW_EXT_texture_snorm = GL_FALSE; -GLboolean __GLEW_EXT_texture_storage = GL_FALSE; -GLboolean __GLEW_EXT_texture_swizzle = GL_FALSE; -GLboolean __GLEW_EXT_texture_type_2_10_10_10_REV = GL_FALSE; -GLboolean __GLEW_EXT_texture_view = GL_FALSE; -GLboolean __GLEW_EXT_timer_query = GL_FALSE; -GLboolean __GLEW_EXT_transform_feedback = GL_FALSE; -GLboolean __GLEW_EXT_unpack_subimage = GL_FALSE; -GLboolean __GLEW_EXT_vertex_array = GL_FALSE; -GLboolean __GLEW_EXT_vertex_array_bgra = GL_FALSE; -GLboolean __GLEW_EXT_vertex_array_setXXX = GL_FALSE; -GLboolean __GLEW_EXT_vertex_attrib_64bit = GL_FALSE; -GLboolean __GLEW_EXT_vertex_shader = GL_FALSE; -GLboolean __GLEW_EXT_vertex_weighting = GL_FALSE; -GLboolean __GLEW_EXT_win32_keyed_mutex = GL_FALSE; -GLboolean __GLEW_EXT_window_rectangles = GL_FALSE; -GLboolean __GLEW_EXT_x11_sync_object = GL_FALSE; -GLboolean __GLEW_FJ_shader_binary_GCCSO = GL_FALSE; -GLboolean __GLEW_GREMEDY_frame_terminator = GL_FALSE; -GLboolean __GLEW_GREMEDY_string_marker = GL_FALSE; -GLboolean __GLEW_HP_convolution_border_modes = GL_FALSE; -GLboolean __GLEW_HP_image_transform = GL_FALSE; -GLboolean __GLEW_HP_occlusion_test = GL_FALSE; -GLboolean __GLEW_HP_texture_lighting = GL_FALSE; -GLboolean __GLEW_IBM_cull_vertex = GL_FALSE; -GLboolean __GLEW_IBM_multimode_draw_arrays = GL_FALSE; -GLboolean __GLEW_IBM_rasterpos_clip = GL_FALSE; -GLboolean __GLEW_IBM_static_data = GL_FALSE; -GLboolean __GLEW_IBM_texture_mirrored_repeat = GL_FALSE; -GLboolean __GLEW_IBM_vertex_array_lists = GL_FALSE; -GLboolean __GLEW_IMG_bindless_texture = GL_FALSE; -GLboolean __GLEW_IMG_framebuffer_downsample = GL_FALSE; -GLboolean __GLEW_IMG_multisampled_render_to_texture = GL_FALSE; -GLboolean __GLEW_IMG_program_binary = GL_FALSE; -GLboolean __GLEW_IMG_read_format = GL_FALSE; -GLboolean __GLEW_IMG_shader_binary = GL_FALSE; -GLboolean __GLEW_IMG_texture_compression_pvrtc = GL_FALSE; -GLboolean __GLEW_IMG_texture_compression_pvrtc2 = GL_FALSE; -GLboolean __GLEW_IMG_texture_env_enhanced_fixed_function = GL_FALSE; -GLboolean __GLEW_IMG_texture_filter_cubic = GL_FALSE; -GLboolean __GLEW_INGR_color_clamp = GL_FALSE; -GLboolean __GLEW_INGR_interlace_read = GL_FALSE; -GLboolean __GLEW_INTEL_blackhole_render = GL_FALSE; -GLboolean __GLEW_INTEL_conservative_rasterization = GL_FALSE; -GLboolean __GLEW_INTEL_fragment_shader_ordering = GL_FALSE; -GLboolean __GLEW_INTEL_framebuffer_CMAA = GL_FALSE; -GLboolean __GLEW_INTEL_map_texture = GL_FALSE; -GLboolean __GLEW_INTEL_parallel_arrays = GL_FALSE; -GLboolean __GLEW_INTEL_performance_query = GL_FALSE; -GLboolean __GLEW_INTEL_shader_integer_functions2 = GL_FALSE; -GLboolean __GLEW_INTEL_texture_scissor = GL_FALSE; -GLboolean __GLEW_KHR_blend_equation_advanced = GL_FALSE; -GLboolean __GLEW_KHR_blend_equation_advanced_coherent = GL_FALSE; -GLboolean __GLEW_KHR_context_flush_control = GL_FALSE; -GLboolean __GLEW_KHR_debug = GL_FALSE; -GLboolean __GLEW_KHR_no_error = GL_FALSE; -GLboolean __GLEW_KHR_parallel_shader_compile = GL_FALSE; -GLboolean __GLEW_KHR_robust_buffer_access_behavior = GL_FALSE; -GLboolean __GLEW_KHR_robustness = GL_FALSE; -GLboolean __GLEW_KHR_shader_subgroup = GL_FALSE; -GLboolean __GLEW_KHR_texture_compression_astc_hdr = GL_FALSE; -GLboolean __GLEW_KHR_texture_compression_astc_ldr = GL_FALSE; -GLboolean __GLEW_KHR_texture_compression_astc_sliced_3d = GL_FALSE; -GLboolean __GLEW_KTX_buffer_region = GL_FALSE; -GLboolean __GLEW_MESAX_texture_stack = GL_FALSE; -GLboolean __GLEW_MESA_framebuffer_flip_y = GL_FALSE; -GLboolean __GLEW_MESA_pack_invert = GL_FALSE; -GLboolean __GLEW_MESA_program_binary_formats = GL_FALSE; -GLboolean __GLEW_MESA_resize_buffers = GL_FALSE; -GLboolean __GLEW_MESA_shader_integer_functions = GL_FALSE; -GLboolean __GLEW_MESA_tile_raster_order = GL_FALSE; -GLboolean __GLEW_MESA_window_pos = GL_FALSE; -GLboolean __GLEW_MESA_ycbcr_texture = GL_FALSE; -GLboolean __GLEW_NVX_blend_equation_advanced_multi_draw_buffers = GL_FALSE; -GLboolean __GLEW_NVX_conditional_render = GL_FALSE; -GLboolean __GLEW_NVX_gpu_memory_info = GL_FALSE; -GLboolean __GLEW_NVX_gpu_multicast2 = GL_FALSE; -GLboolean __GLEW_NVX_linked_gpu_multicast = GL_FALSE; -GLboolean __GLEW_NVX_progress_fence = GL_FALSE; -GLboolean __GLEW_NV_3dvision_settings = GL_FALSE; -GLboolean __GLEW_NV_EGL_stream_consumer_external = GL_FALSE; -GLboolean __GLEW_NV_alpha_to_coverage_dither_control = GL_FALSE; -GLboolean __GLEW_NV_bgr = GL_FALSE; -GLboolean __GLEW_NV_bindless_multi_draw_indirect = GL_FALSE; -GLboolean __GLEW_NV_bindless_multi_draw_indirect_count = GL_FALSE; -GLboolean __GLEW_NV_bindless_texture = GL_FALSE; -GLboolean __GLEW_NV_blend_equation_advanced = GL_FALSE; -GLboolean __GLEW_NV_blend_equation_advanced_coherent = GL_FALSE; -GLboolean __GLEW_NV_blend_minmax_factor = GL_FALSE; -GLboolean __GLEW_NV_blend_square = GL_FALSE; -GLboolean __GLEW_NV_clip_space_w_scaling = GL_FALSE; -GLboolean __GLEW_NV_command_list = GL_FALSE; -GLboolean __GLEW_NV_compute_program5 = GL_FALSE; -GLboolean __GLEW_NV_compute_shader_derivatives = GL_FALSE; -GLboolean __GLEW_NV_conditional_render = GL_FALSE; -GLboolean __GLEW_NV_conservative_raster = GL_FALSE; -GLboolean __GLEW_NV_conservative_raster_dilate = GL_FALSE; -GLboolean __GLEW_NV_conservative_raster_pre_snap = GL_FALSE; -GLboolean __GLEW_NV_conservative_raster_pre_snap_triangles = GL_FALSE; -GLboolean __GLEW_NV_conservative_raster_underestimation = GL_FALSE; -GLboolean __GLEW_NV_copy_buffer = GL_FALSE; -GLboolean __GLEW_NV_copy_depth_to_color = GL_FALSE; -GLboolean __GLEW_NV_copy_image = GL_FALSE; -GLboolean __GLEW_NV_deep_texture3D = GL_FALSE; -GLboolean __GLEW_NV_depth_buffer_float = GL_FALSE; -GLboolean __GLEW_NV_depth_clamp = GL_FALSE; -GLboolean __GLEW_NV_depth_nonlinear = GL_FALSE; -GLboolean __GLEW_NV_depth_range_unclamped = GL_FALSE; -GLboolean __GLEW_NV_draw_buffers = GL_FALSE; -GLboolean __GLEW_NV_draw_instanced = GL_FALSE; -GLboolean __GLEW_NV_draw_texture = GL_FALSE; -GLboolean __GLEW_NV_draw_vulkan_image = GL_FALSE; -GLboolean __GLEW_NV_evaluators = GL_FALSE; -GLboolean __GLEW_NV_explicit_attrib_location = GL_FALSE; -GLboolean __GLEW_NV_explicit_multisample = GL_FALSE; -GLboolean __GLEW_NV_fbo_color_attachments = GL_FALSE; -GLboolean __GLEW_NV_fence = GL_FALSE; -GLboolean __GLEW_NV_fill_rectangle = GL_FALSE; -GLboolean __GLEW_NV_float_buffer = GL_FALSE; -GLboolean __GLEW_NV_fog_distance = GL_FALSE; -GLboolean __GLEW_NV_fragment_coverage_to_color = GL_FALSE; -GLboolean __GLEW_NV_fragment_program = GL_FALSE; -GLboolean __GLEW_NV_fragment_program2 = GL_FALSE; -GLboolean __GLEW_NV_fragment_program4 = GL_FALSE; -GLboolean __GLEW_NV_fragment_program_option = GL_FALSE; -GLboolean __GLEW_NV_fragment_shader_barycentric = GL_FALSE; -GLboolean __GLEW_NV_fragment_shader_interlock = GL_FALSE; -GLboolean __GLEW_NV_framebuffer_blit = GL_FALSE; -GLboolean __GLEW_NV_framebuffer_mixed_samples = GL_FALSE; -GLboolean __GLEW_NV_framebuffer_multisample = GL_FALSE; -GLboolean __GLEW_NV_framebuffer_multisample_coverage = GL_FALSE; -GLboolean __GLEW_NV_generate_mipmap_sRGB = GL_FALSE; -GLboolean __GLEW_NV_geometry_program4 = GL_FALSE; -GLboolean __GLEW_NV_geometry_shader4 = GL_FALSE; -GLboolean __GLEW_NV_geometry_shader_passthrough = GL_FALSE; -GLboolean __GLEW_NV_gpu_multicast = GL_FALSE; -GLboolean __GLEW_NV_gpu_program4 = GL_FALSE; -GLboolean __GLEW_NV_gpu_program5 = GL_FALSE; -GLboolean __GLEW_NV_gpu_program5_mem_extended = GL_FALSE; -GLboolean __GLEW_NV_gpu_program_fp64 = GL_FALSE; -GLboolean __GLEW_NV_gpu_shader5 = GL_FALSE; -GLboolean __GLEW_NV_half_float = GL_FALSE; -GLboolean __GLEW_NV_image_formats = GL_FALSE; -GLboolean __GLEW_NV_instanced_arrays = GL_FALSE; -GLboolean __GLEW_NV_internalformat_sample_query = GL_FALSE; -GLboolean __GLEW_NV_light_max_exponent = GL_FALSE; -GLboolean __GLEW_NV_memory_attachment = GL_FALSE; -GLboolean __GLEW_NV_mesh_shader = GL_FALSE; -GLboolean __GLEW_NV_multisample_coverage = GL_FALSE; -GLboolean __GLEW_NV_multisample_filter_hint = GL_FALSE; -GLboolean __GLEW_NV_non_square_matrices = GL_FALSE; -GLboolean __GLEW_NV_occlusion_query = GL_FALSE; -GLboolean __GLEW_NV_pack_subimage = GL_FALSE; -GLboolean __GLEW_NV_packed_depth_stencil = GL_FALSE; -GLboolean __GLEW_NV_packed_float = GL_FALSE; -GLboolean __GLEW_NV_packed_float_linear = GL_FALSE; -GLboolean __GLEW_NV_parameter_buffer_object = GL_FALSE; -GLboolean __GLEW_NV_parameter_buffer_object2 = GL_FALSE; -GLboolean __GLEW_NV_path_rendering = GL_FALSE; -GLboolean __GLEW_NV_path_rendering_shared_edge = GL_FALSE; -GLboolean __GLEW_NV_pixel_buffer_object = GL_FALSE; -GLboolean __GLEW_NV_pixel_data_range = GL_FALSE; -GLboolean __GLEW_NV_platform_binary = GL_FALSE; -GLboolean __GLEW_NV_point_sprite = GL_FALSE; -GLboolean __GLEW_NV_polygon_mode = GL_FALSE; -GLboolean __GLEW_NV_present_video = GL_FALSE; -GLboolean __GLEW_NV_primitive_restart = GL_FALSE; -GLboolean __GLEW_NV_query_resource_tag = GL_FALSE; -GLboolean __GLEW_NV_read_buffer = GL_FALSE; -GLboolean __GLEW_NV_read_buffer_front = GL_FALSE; -GLboolean __GLEW_NV_read_depth = GL_FALSE; -GLboolean __GLEW_NV_read_depth_stencil = GL_FALSE; -GLboolean __GLEW_NV_read_stencil = GL_FALSE; -GLboolean __GLEW_NV_register_combiners = GL_FALSE; -GLboolean __GLEW_NV_register_combiners2 = GL_FALSE; -GLboolean __GLEW_NV_representative_fragment_test = GL_FALSE; -GLboolean __GLEW_NV_robustness_video_memory_purge = GL_FALSE; -GLboolean __GLEW_NV_sRGB_formats = GL_FALSE; -GLboolean __GLEW_NV_sample_locations = GL_FALSE; -GLboolean __GLEW_NV_sample_mask_override_coverage = GL_FALSE; -GLboolean __GLEW_NV_scissor_exclusive = GL_FALSE; -GLboolean __GLEW_NV_shader_atomic_counters = GL_FALSE; -GLboolean __GLEW_NV_shader_atomic_float = GL_FALSE; -GLboolean __GLEW_NV_shader_atomic_float64 = GL_FALSE; -GLboolean __GLEW_NV_shader_atomic_fp16_vector = GL_FALSE; -GLboolean __GLEW_NV_shader_atomic_int64 = GL_FALSE; -GLboolean __GLEW_NV_shader_buffer_load = GL_FALSE; -GLboolean __GLEW_NV_shader_noperspective_interpolation = GL_FALSE; -GLboolean __GLEW_NV_shader_storage_buffer_object = GL_FALSE; -GLboolean __GLEW_NV_shader_subgroup_partitioned = GL_FALSE; -GLboolean __GLEW_NV_shader_texture_footprint = GL_FALSE; -GLboolean __GLEW_NV_shader_thread_group = GL_FALSE; -GLboolean __GLEW_NV_shader_thread_shuffle = GL_FALSE; -GLboolean __GLEW_NV_shading_rate_image = GL_FALSE; -GLboolean __GLEW_NV_shadow_samplers_array = GL_FALSE; -GLboolean __GLEW_NV_shadow_samplers_cube = GL_FALSE; -GLboolean __GLEW_NV_stereo_view_rendering = GL_FALSE; -GLboolean __GLEW_NV_tessellation_program5 = GL_FALSE; -GLboolean __GLEW_NV_texgen_emboss = GL_FALSE; -GLboolean __GLEW_NV_texgen_reflection = GL_FALSE; -GLboolean __GLEW_NV_texture_array = GL_FALSE; -GLboolean __GLEW_NV_texture_barrier = GL_FALSE; -GLboolean __GLEW_NV_texture_border_clamp = GL_FALSE; -GLboolean __GLEW_NV_texture_compression_latc = GL_FALSE; -GLboolean __GLEW_NV_texture_compression_s3tc = GL_FALSE; -GLboolean __GLEW_NV_texture_compression_s3tc_update = GL_FALSE; -GLboolean __GLEW_NV_texture_compression_vtc = GL_FALSE; -GLboolean __GLEW_NV_texture_env_combine4 = GL_FALSE; -GLboolean __GLEW_NV_texture_expand_normal = GL_FALSE; -GLboolean __GLEW_NV_texture_multisample = GL_FALSE; -GLboolean __GLEW_NV_texture_npot_2D_mipmap = GL_FALSE; -GLboolean __GLEW_NV_texture_rectangle = GL_FALSE; -GLboolean __GLEW_NV_texture_rectangle_compressed = GL_FALSE; -GLboolean __GLEW_NV_texture_shader = GL_FALSE; -GLboolean __GLEW_NV_texture_shader2 = GL_FALSE; -GLboolean __GLEW_NV_texture_shader3 = GL_FALSE; -GLboolean __GLEW_NV_transform_feedback = GL_FALSE; -GLboolean __GLEW_NV_transform_feedback2 = GL_FALSE; -GLboolean __GLEW_NV_uniform_buffer_unified_memory = GL_FALSE; -GLboolean __GLEW_NV_vdpau_interop = GL_FALSE; -GLboolean __GLEW_NV_vdpau_interop2 = GL_FALSE; -GLboolean __GLEW_NV_vertex_array_range = GL_FALSE; -GLboolean __GLEW_NV_vertex_array_range2 = GL_FALSE; -GLboolean __GLEW_NV_vertex_attrib_integer_64bit = GL_FALSE; -GLboolean __GLEW_NV_vertex_buffer_unified_memory = GL_FALSE; -GLboolean __GLEW_NV_vertex_program = GL_FALSE; -GLboolean __GLEW_NV_vertex_program1_1 = GL_FALSE; -GLboolean __GLEW_NV_vertex_program2 = GL_FALSE; -GLboolean __GLEW_NV_vertex_program2_option = GL_FALSE; -GLboolean __GLEW_NV_vertex_program3 = GL_FALSE; -GLboolean __GLEW_NV_vertex_program4 = GL_FALSE; -GLboolean __GLEW_NV_video_capture = GL_FALSE; -GLboolean __GLEW_NV_viewport_array = GL_FALSE; -GLboolean __GLEW_NV_viewport_array2 = GL_FALSE; -GLboolean __GLEW_NV_viewport_swizzle = GL_FALSE; -GLboolean __GLEW_OES_EGL_image = GL_FALSE; -GLboolean __GLEW_OES_EGL_image_external = GL_FALSE; -GLboolean __GLEW_OES_EGL_image_external_essl3 = GL_FALSE; -GLboolean __GLEW_OES_blend_equation_separate = GL_FALSE; -GLboolean __GLEW_OES_blend_func_separate = GL_FALSE; -GLboolean __GLEW_OES_blend_subtract = GL_FALSE; -GLboolean __GLEW_OES_byte_coordinates = GL_FALSE; -GLboolean __GLEW_OES_compressed_ETC1_RGB8_texture = GL_FALSE; -GLboolean __GLEW_OES_compressed_paletted_texture = GL_FALSE; -GLboolean __GLEW_OES_copy_image = GL_FALSE; -GLboolean __GLEW_OES_depth24 = GL_FALSE; -GLboolean __GLEW_OES_depth32 = GL_FALSE; -GLboolean __GLEW_OES_depth_texture = GL_FALSE; -GLboolean __GLEW_OES_depth_texture_cube_map = GL_FALSE; -GLboolean __GLEW_OES_draw_buffers_indexed = GL_FALSE; -GLboolean __GLEW_OES_draw_texture = GL_FALSE; -GLboolean __GLEW_OES_element_index_uint = GL_FALSE; -GLboolean __GLEW_OES_extended_matrix_palette = GL_FALSE; -GLboolean __GLEW_OES_fbo_render_mipmap = GL_FALSE; -GLboolean __GLEW_OES_fragment_precision_high = GL_FALSE; -GLboolean __GLEW_OES_framebuffer_object = GL_FALSE; -GLboolean __GLEW_OES_geometry_point_size = GL_FALSE; -GLboolean __GLEW_OES_geometry_shader = GL_FALSE; -GLboolean __GLEW_OES_get_program_binary = GL_FALSE; -GLboolean __GLEW_OES_gpu_shader5 = GL_FALSE; -GLboolean __GLEW_OES_mapbuffer = GL_FALSE; -GLboolean __GLEW_OES_matrix_get = GL_FALSE; -GLboolean __GLEW_OES_matrix_palette = GL_FALSE; -GLboolean __GLEW_OES_packed_depth_stencil = GL_FALSE; -GLboolean __GLEW_OES_point_size_array = GL_FALSE; -GLboolean __GLEW_OES_point_sprite = GL_FALSE; -GLboolean __GLEW_OES_read_format = GL_FALSE; -GLboolean __GLEW_OES_required_internalformat = GL_FALSE; -GLboolean __GLEW_OES_rgb8_rgba8 = GL_FALSE; -GLboolean __GLEW_OES_sample_shading = GL_FALSE; -GLboolean __GLEW_OES_sample_variables = GL_FALSE; -GLboolean __GLEW_OES_shader_image_atomic = GL_FALSE; -GLboolean __GLEW_OES_shader_io_blocks = GL_FALSE; -GLboolean __GLEW_OES_shader_multisample_interpolation = GL_FALSE; -GLboolean __GLEW_OES_single_precision = GL_FALSE; -GLboolean __GLEW_OES_standard_derivatives = GL_FALSE; -GLboolean __GLEW_OES_stencil1 = GL_FALSE; -GLboolean __GLEW_OES_stencil4 = GL_FALSE; -GLboolean __GLEW_OES_stencil8 = GL_FALSE; -GLboolean __GLEW_OES_surfaceless_context = GL_FALSE; -GLboolean __GLEW_OES_tessellation_point_size = GL_FALSE; -GLboolean __GLEW_OES_tessellation_shader = GL_FALSE; -GLboolean __GLEW_OES_texture_3D = GL_FALSE; -GLboolean __GLEW_OES_texture_border_clamp = GL_FALSE; -GLboolean __GLEW_OES_texture_buffer = GL_FALSE; -GLboolean __GLEW_OES_texture_compression_astc = GL_FALSE; -GLboolean __GLEW_OES_texture_cube_map = GL_FALSE; -GLboolean __GLEW_OES_texture_cube_map_array = GL_FALSE; -GLboolean __GLEW_OES_texture_env_crossbar = GL_FALSE; -GLboolean __GLEW_OES_texture_mirrored_repeat = GL_FALSE; -GLboolean __GLEW_OES_texture_npot = GL_FALSE; -GLboolean __GLEW_OES_texture_stencil8 = GL_FALSE; -GLboolean __GLEW_OES_texture_storage_multisample_2d_array = GL_FALSE; -GLboolean __GLEW_OES_texture_view = GL_FALSE; -GLboolean __GLEW_OES_vertex_array_object = GL_FALSE; -GLboolean __GLEW_OES_vertex_half_float = GL_FALSE; -GLboolean __GLEW_OES_vertex_type_10_10_10_2 = GL_FALSE; -GLboolean __GLEW_OML_interlace = GL_FALSE; -GLboolean __GLEW_OML_resample = GL_FALSE; -GLboolean __GLEW_OML_subsample = GL_FALSE; -GLboolean __GLEW_OVR_multiview = GL_FALSE; -GLboolean __GLEW_OVR_multiview2 = GL_FALSE; -GLboolean __GLEW_OVR_multiview_multisampled_render_to_texture = GL_FALSE; -GLboolean __GLEW_PGI_misc_hints = GL_FALSE; -GLboolean __GLEW_PGI_vertex_hints = GL_FALSE; -GLboolean __GLEW_QCOM_YUV_texture_gather = GL_FALSE; -GLboolean __GLEW_QCOM_alpha_test = GL_FALSE; -GLboolean __GLEW_QCOM_binning_control = GL_FALSE; -GLboolean __GLEW_QCOM_driver_control = GL_FALSE; -GLboolean __GLEW_QCOM_extended_get = GL_FALSE; -GLboolean __GLEW_QCOM_extended_get2 = GL_FALSE; -GLboolean __GLEW_QCOM_framebuffer_foveated = GL_FALSE; -GLboolean __GLEW_QCOM_perfmon_global_mode = GL_FALSE; -GLboolean __GLEW_QCOM_shader_framebuffer_fetch_noncoherent = GL_FALSE; -GLboolean __GLEW_QCOM_shader_framebuffer_fetch_rate = GL_FALSE; -GLboolean __GLEW_QCOM_texture_foveated = GL_FALSE; -GLboolean __GLEW_QCOM_texture_foveated_subsampled_layout = GL_FALSE; -GLboolean __GLEW_QCOM_tiled_rendering = GL_FALSE; -GLboolean __GLEW_QCOM_writeonly_rendering = GL_FALSE; -GLboolean __GLEW_REGAL_ES1_0_compatibility = GL_FALSE; -GLboolean __GLEW_REGAL_ES1_1_compatibility = GL_FALSE; -GLboolean __GLEW_REGAL_enable = GL_FALSE; -GLboolean __GLEW_REGAL_error_string = GL_FALSE; -GLboolean __GLEW_REGAL_extension_query = GL_FALSE; -GLboolean __GLEW_REGAL_log = GL_FALSE; -GLboolean __GLEW_REGAL_proc_address = GL_FALSE; -GLboolean __GLEW_REND_screen_coordinates = GL_FALSE; -GLboolean __GLEW_S3_s3tc = GL_FALSE; -GLboolean __GLEW_SGIS_clip_band_hint = GL_FALSE; -GLboolean __GLEW_SGIS_color_range = GL_FALSE; -GLboolean __GLEW_SGIS_detail_texture = GL_FALSE; -GLboolean __GLEW_SGIS_fog_function = GL_FALSE; -GLboolean __GLEW_SGIS_generate_mipmap = GL_FALSE; -GLboolean __GLEW_SGIS_line_texgen = GL_FALSE; -GLboolean __GLEW_SGIS_multisample = GL_FALSE; -GLboolean __GLEW_SGIS_multitexture = GL_FALSE; -GLboolean __GLEW_SGIS_pixel_texture = GL_FALSE; -GLboolean __GLEW_SGIS_point_line_texgen = GL_FALSE; -GLboolean __GLEW_SGIS_shared_multisample = GL_FALSE; -GLboolean __GLEW_SGIS_sharpen_texture = GL_FALSE; -GLboolean __GLEW_SGIS_texture4D = GL_FALSE; -GLboolean __GLEW_SGIS_texture_border_clamp = GL_FALSE; -GLboolean __GLEW_SGIS_texture_edge_clamp = GL_FALSE; -GLboolean __GLEW_SGIS_texture_filter4 = GL_FALSE; -GLboolean __GLEW_SGIS_texture_lod = GL_FALSE; -GLboolean __GLEW_SGIS_texture_select = GL_FALSE; -GLboolean __GLEW_SGIX_async = GL_FALSE; -GLboolean __GLEW_SGIX_async_histogram = GL_FALSE; -GLboolean __GLEW_SGIX_async_pixel = GL_FALSE; -GLboolean __GLEW_SGIX_bali_g_instruments = GL_FALSE; -GLboolean __GLEW_SGIX_bali_r_instruments = GL_FALSE; -GLboolean __GLEW_SGIX_bali_timer_instruments = GL_FALSE; -GLboolean __GLEW_SGIX_blend_alpha_minmax = GL_FALSE; -GLboolean __GLEW_SGIX_blend_cadd = GL_FALSE; -GLboolean __GLEW_SGIX_blend_cmultiply = GL_FALSE; -GLboolean __GLEW_SGIX_calligraphic_fragment = GL_FALSE; -GLboolean __GLEW_SGIX_clipmap = GL_FALSE; -GLboolean __GLEW_SGIX_color_matrix_accuracy = GL_FALSE; -GLboolean __GLEW_SGIX_color_table_index_mode = GL_FALSE; -GLboolean __GLEW_SGIX_complex_polar = GL_FALSE; -GLboolean __GLEW_SGIX_convolution_accuracy = GL_FALSE; -GLboolean __GLEW_SGIX_cube_map = GL_FALSE; -GLboolean __GLEW_SGIX_cylinder_texgen = GL_FALSE; -GLboolean __GLEW_SGIX_datapipe = GL_FALSE; -GLboolean __GLEW_SGIX_decimation = GL_FALSE; -GLboolean __GLEW_SGIX_depth_pass_instrument = GL_FALSE; -GLboolean __GLEW_SGIX_depth_texture = GL_FALSE; -GLboolean __GLEW_SGIX_dvc = GL_FALSE; -GLboolean __GLEW_SGIX_flush_raster = GL_FALSE; -GLboolean __GLEW_SGIX_fog_blend = GL_FALSE; -GLboolean __GLEW_SGIX_fog_factor_to_alpha = GL_FALSE; -GLboolean __GLEW_SGIX_fog_layers = GL_FALSE; -GLboolean __GLEW_SGIX_fog_offset = GL_FALSE; -GLboolean __GLEW_SGIX_fog_patchy = GL_FALSE; -GLboolean __GLEW_SGIX_fog_scale = GL_FALSE; -GLboolean __GLEW_SGIX_fog_texture = GL_FALSE; -GLboolean __GLEW_SGIX_fragment_lighting_space = GL_FALSE; -GLboolean __GLEW_SGIX_fragment_specular_lighting = GL_FALSE; -GLboolean __GLEW_SGIX_fragments_instrument = GL_FALSE; -GLboolean __GLEW_SGIX_framezoom = GL_FALSE; -GLboolean __GLEW_SGIX_icc_texture = GL_FALSE; -GLboolean __GLEW_SGIX_igloo_interface = GL_FALSE; -GLboolean __GLEW_SGIX_image_compression = GL_FALSE; -GLboolean __GLEW_SGIX_impact_pixel_texture = GL_FALSE; -GLboolean __GLEW_SGIX_instrument_error = GL_FALSE; -GLboolean __GLEW_SGIX_interlace = GL_FALSE; -GLboolean __GLEW_SGIX_ir_instrument1 = GL_FALSE; -GLboolean __GLEW_SGIX_line_quality_hint = GL_FALSE; -GLboolean __GLEW_SGIX_list_priority = GL_FALSE; -GLboolean __GLEW_SGIX_mpeg1 = GL_FALSE; -GLboolean __GLEW_SGIX_mpeg2 = GL_FALSE; -GLboolean __GLEW_SGIX_nonlinear_lighting_pervertex = GL_FALSE; -GLboolean __GLEW_SGIX_nurbs_eval = GL_FALSE; -GLboolean __GLEW_SGIX_occlusion_instrument = GL_FALSE; -GLboolean __GLEW_SGIX_packed_6bytes = GL_FALSE; -GLboolean __GLEW_SGIX_pixel_texture = GL_FALSE; -GLboolean __GLEW_SGIX_pixel_texture_bits = GL_FALSE; -GLboolean __GLEW_SGIX_pixel_texture_lod = GL_FALSE; -GLboolean __GLEW_SGIX_pixel_tiles = GL_FALSE; -GLboolean __GLEW_SGIX_polynomial_ffd = GL_FALSE; -GLboolean __GLEW_SGIX_quad_mesh = GL_FALSE; -GLboolean __GLEW_SGIX_reference_plane = GL_FALSE; -GLboolean __GLEW_SGIX_resample = GL_FALSE; -GLboolean __GLEW_SGIX_scalebias_hint = GL_FALSE; -GLboolean __GLEW_SGIX_shadow = GL_FALSE; -GLboolean __GLEW_SGIX_shadow_ambient = GL_FALSE; -GLboolean __GLEW_SGIX_slim = GL_FALSE; -GLboolean __GLEW_SGIX_spotlight_cutoff = GL_FALSE; -GLboolean __GLEW_SGIX_sprite = GL_FALSE; -GLboolean __GLEW_SGIX_subdiv_patch = GL_FALSE; -GLboolean __GLEW_SGIX_subsample = GL_FALSE; -GLboolean __GLEW_SGIX_tag_sample_buffer = GL_FALSE; -GLboolean __GLEW_SGIX_texture_add_env = GL_FALSE; -GLboolean __GLEW_SGIX_texture_coordinate_clamp = GL_FALSE; -GLboolean __GLEW_SGIX_texture_lod_bias = GL_FALSE; -GLboolean __GLEW_SGIX_texture_mipmap_anisotropic = GL_FALSE; -GLboolean __GLEW_SGIX_texture_multi_buffer = GL_FALSE; -GLboolean __GLEW_SGIX_texture_phase = GL_FALSE; -GLboolean __GLEW_SGIX_texture_range = GL_FALSE; -GLboolean __GLEW_SGIX_texture_scale_bias = GL_FALSE; -GLboolean __GLEW_SGIX_texture_supersample = GL_FALSE; -GLboolean __GLEW_SGIX_vector_ops = GL_FALSE; -GLboolean __GLEW_SGIX_vertex_array_object = GL_FALSE; -GLboolean __GLEW_SGIX_vertex_preclip = GL_FALSE; -GLboolean __GLEW_SGIX_vertex_preclip_hint = GL_FALSE; -GLboolean __GLEW_SGIX_ycrcb = GL_FALSE; -GLboolean __GLEW_SGIX_ycrcb_subsample = GL_FALSE; -GLboolean __GLEW_SGIX_ycrcba = GL_FALSE; -GLboolean __GLEW_SGI_color_matrix = GL_FALSE; -GLboolean __GLEW_SGI_color_table = GL_FALSE; -GLboolean __GLEW_SGI_complex = GL_FALSE; -GLboolean __GLEW_SGI_complex_type = GL_FALSE; -GLboolean __GLEW_SGI_fft = GL_FALSE; -GLboolean __GLEW_SGI_texture_color_table = GL_FALSE; -GLboolean __GLEW_SUNX_constant_data = GL_FALSE; -GLboolean __GLEW_SUN_convolution_border_modes = GL_FALSE; -GLboolean __GLEW_SUN_global_alpha = GL_FALSE; -GLboolean __GLEW_SUN_mesh_array = GL_FALSE; -GLboolean __GLEW_SUN_read_video_pixels = GL_FALSE; -GLboolean __GLEW_SUN_slice_accum = GL_FALSE; -GLboolean __GLEW_SUN_triangle_list = GL_FALSE; -GLboolean __GLEW_SUN_vertex = GL_FALSE; -GLboolean __GLEW_VIV_shader_binary = GL_FALSE; -GLboolean __GLEW_WIN_phong_shading = GL_FALSE; -GLboolean __GLEW_WIN_scene_markerXXX = GL_FALSE; -GLboolean __GLEW_WIN_specular_fog = GL_FALSE; -GLboolean __GLEW_WIN_swap_hint = GL_FALSE; - -static const char * _glewExtensionLookup[] = { -#ifdef GL_3DFX_multisample - "GL_3DFX_multisample", -#endif -#ifdef GL_3DFX_tbuffer - "GL_3DFX_tbuffer", -#endif -#ifdef GL_3DFX_texture_compression_FXT1 - "GL_3DFX_texture_compression_FXT1", -#endif -#ifdef GL_AMD_blend_minmax_factor - "GL_AMD_blend_minmax_factor", -#endif -#ifdef GL_AMD_compressed_3DC_texture - "GL_AMD_compressed_3DC_texture", -#endif -#ifdef GL_AMD_compressed_ATC_texture - "GL_AMD_compressed_ATC_texture", -#endif -#ifdef GL_AMD_conservative_depth - "GL_AMD_conservative_depth", -#endif -#ifdef GL_AMD_debug_output - "GL_AMD_debug_output", -#endif -#ifdef GL_AMD_depth_clamp_separate - "GL_AMD_depth_clamp_separate", -#endif -#ifdef GL_AMD_draw_buffers_blend - "GL_AMD_draw_buffers_blend", -#endif -#ifdef GL_AMD_framebuffer_multisample_advanced - "GL_AMD_framebuffer_multisample_advanced", -#endif -#ifdef GL_AMD_framebuffer_sample_positions - "GL_AMD_framebuffer_sample_positions", -#endif -#ifdef GL_AMD_gcn_shader - "GL_AMD_gcn_shader", -#endif -#ifdef GL_AMD_gpu_shader_half_float - "GL_AMD_gpu_shader_half_float", -#endif -#ifdef GL_AMD_gpu_shader_half_float_fetch - "GL_AMD_gpu_shader_half_float_fetch", -#endif -#ifdef GL_AMD_gpu_shader_int16 - "GL_AMD_gpu_shader_int16", -#endif -#ifdef GL_AMD_gpu_shader_int64 - "GL_AMD_gpu_shader_int64", -#endif -#ifdef GL_AMD_interleaved_elements - "GL_AMD_interleaved_elements", -#endif -#ifdef GL_AMD_multi_draw_indirect - "GL_AMD_multi_draw_indirect", -#endif -#ifdef GL_AMD_name_gen_delete - "GL_AMD_name_gen_delete", -#endif -#ifdef GL_AMD_occlusion_query_event - "GL_AMD_occlusion_query_event", -#endif -#ifdef GL_AMD_performance_monitor - "GL_AMD_performance_monitor", -#endif -#ifdef GL_AMD_pinned_memory - "GL_AMD_pinned_memory", -#endif -#ifdef GL_AMD_program_binary_Z400 - "GL_AMD_program_binary_Z400", -#endif -#ifdef GL_AMD_query_buffer_object - "GL_AMD_query_buffer_object", -#endif -#ifdef GL_AMD_sample_positions - "GL_AMD_sample_positions", -#endif -#ifdef GL_AMD_seamless_cubemap_per_texture - "GL_AMD_seamless_cubemap_per_texture", -#endif -#ifdef GL_AMD_shader_atomic_counter_ops - "GL_AMD_shader_atomic_counter_ops", -#endif -#ifdef GL_AMD_shader_ballot - "GL_AMD_shader_ballot", -#endif -#ifdef GL_AMD_shader_explicit_vertex_parameter - "GL_AMD_shader_explicit_vertex_parameter", -#endif -#ifdef GL_AMD_shader_image_load_store_lod - "GL_AMD_shader_image_load_store_lod", -#endif -#ifdef GL_AMD_shader_stencil_export - "GL_AMD_shader_stencil_export", -#endif -#ifdef GL_AMD_shader_stencil_value_export - "GL_AMD_shader_stencil_value_export", -#endif -#ifdef GL_AMD_shader_trinary_minmax - "GL_AMD_shader_trinary_minmax", -#endif -#ifdef GL_AMD_sparse_texture - "GL_AMD_sparse_texture", -#endif -#ifdef GL_AMD_stencil_operation_extended - "GL_AMD_stencil_operation_extended", -#endif -#ifdef GL_AMD_texture_gather_bias_lod - "GL_AMD_texture_gather_bias_lod", -#endif -#ifdef GL_AMD_texture_texture4 - "GL_AMD_texture_texture4", -#endif -#ifdef GL_AMD_transform_feedback3_lines_triangles - "GL_AMD_transform_feedback3_lines_triangles", -#endif -#ifdef GL_AMD_transform_feedback4 - "GL_AMD_transform_feedback4", -#endif -#ifdef GL_AMD_vertex_shader_layer - "GL_AMD_vertex_shader_layer", -#endif -#ifdef GL_AMD_vertex_shader_tessellator - "GL_AMD_vertex_shader_tessellator", -#endif -#ifdef GL_AMD_vertex_shader_viewport_index - "GL_AMD_vertex_shader_viewport_index", -#endif -#ifdef GL_ANDROID_extension_pack_es31a - "GL_ANDROID_extension_pack_es31a", -#endif -#ifdef GL_ANGLE_depth_texture - "GL_ANGLE_depth_texture", -#endif -#ifdef GL_ANGLE_framebuffer_blit - "GL_ANGLE_framebuffer_blit", -#endif -#ifdef GL_ANGLE_framebuffer_multisample - "GL_ANGLE_framebuffer_multisample", -#endif -#ifdef GL_ANGLE_instanced_arrays - "GL_ANGLE_instanced_arrays", -#endif -#ifdef GL_ANGLE_pack_reverse_row_order - "GL_ANGLE_pack_reverse_row_order", -#endif -#ifdef GL_ANGLE_program_binary - "GL_ANGLE_program_binary", -#endif -#ifdef GL_ANGLE_texture_compression_dxt1 - "GL_ANGLE_texture_compression_dxt1", -#endif -#ifdef GL_ANGLE_texture_compression_dxt3 - "GL_ANGLE_texture_compression_dxt3", -#endif -#ifdef GL_ANGLE_texture_compression_dxt5 - "GL_ANGLE_texture_compression_dxt5", -#endif -#ifdef GL_ANGLE_texture_usage - "GL_ANGLE_texture_usage", -#endif -#ifdef GL_ANGLE_timer_query - "GL_ANGLE_timer_query", -#endif -#ifdef GL_ANGLE_translated_shader_source - "GL_ANGLE_translated_shader_source", -#endif -#ifdef GL_APPLE_aux_depth_stencil - "GL_APPLE_aux_depth_stencil", -#endif -#ifdef GL_APPLE_client_storage - "GL_APPLE_client_storage", -#endif -#ifdef GL_APPLE_clip_distance - "GL_APPLE_clip_distance", -#endif -#ifdef GL_APPLE_color_buffer_packed_float - "GL_APPLE_color_buffer_packed_float", -#endif -#ifdef GL_APPLE_copy_texture_levels - "GL_APPLE_copy_texture_levels", -#endif -#ifdef GL_APPLE_element_array - "GL_APPLE_element_array", -#endif -#ifdef GL_APPLE_fence - "GL_APPLE_fence", -#endif -#ifdef GL_APPLE_float_pixels - "GL_APPLE_float_pixels", -#endif -#ifdef GL_APPLE_flush_buffer_range - "GL_APPLE_flush_buffer_range", -#endif -#ifdef GL_APPLE_framebuffer_multisample - "GL_APPLE_framebuffer_multisample", -#endif -#ifdef GL_APPLE_object_purgeable - "GL_APPLE_object_purgeable", -#endif -#ifdef GL_APPLE_pixel_buffer - "GL_APPLE_pixel_buffer", -#endif -#ifdef GL_APPLE_rgb_422 - "GL_APPLE_rgb_422", -#endif -#ifdef GL_APPLE_row_bytes - "GL_APPLE_row_bytes", -#endif -#ifdef GL_APPLE_specular_vector - "GL_APPLE_specular_vector", -#endif -#ifdef GL_APPLE_sync - "GL_APPLE_sync", -#endif -#ifdef GL_APPLE_texture_2D_limited_npot - "GL_APPLE_texture_2D_limited_npot", -#endif -#ifdef GL_APPLE_texture_format_BGRA8888 - "GL_APPLE_texture_format_BGRA8888", -#endif -#ifdef GL_APPLE_texture_max_level - "GL_APPLE_texture_max_level", -#endif -#ifdef GL_APPLE_texture_packed_float - "GL_APPLE_texture_packed_float", -#endif -#ifdef GL_APPLE_texture_range - "GL_APPLE_texture_range", -#endif -#ifdef GL_APPLE_transform_hint - "GL_APPLE_transform_hint", -#endif -#ifdef GL_APPLE_vertex_array_object - "GL_APPLE_vertex_array_object", -#endif -#ifdef GL_APPLE_vertex_array_range - "GL_APPLE_vertex_array_range", -#endif -#ifdef GL_APPLE_vertex_program_evaluators - "GL_APPLE_vertex_program_evaluators", -#endif -#ifdef GL_APPLE_ycbcr_422 - "GL_APPLE_ycbcr_422", -#endif -#ifdef GL_ARB_ES2_compatibility - "GL_ARB_ES2_compatibility", -#endif -#ifdef GL_ARB_ES3_1_compatibility - "GL_ARB_ES3_1_compatibility", -#endif -#ifdef GL_ARB_ES3_2_compatibility - "GL_ARB_ES3_2_compatibility", -#endif -#ifdef GL_ARB_ES3_compatibility - "GL_ARB_ES3_compatibility", -#endif -#ifdef GL_ARB_arrays_of_arrays - "GL_ARB_arrays_of_arrays", -#endif -#ifdef GL_ARB_base_instance - "GL_ARB_base_instance", -#endif -#ifdef GL_ARB_bindless_texture - "GL_ARB_bindless_texture", -#endif -#ifdef GL_ARB_blend_func_extended - "GL_ARB_blend_func_extended", -#endif -#ifdef GL_ARB_buffer_storage - "GL_ARB_buffer_storage", -#endif -#ifdef GL_ARB_cl_event - "GL_ARB_cl_event", -#endif -#ifdef GL_ARB_clear_buffer_object - "GL_ARB_clear_buffer_object", -#endif -#ifdef GL_ARB_clear_texture - "GL_ARB_clear_texture", -#endif -#ifdef GL_ARB_clip_control - "GL_ARB_clip_control", -#endif -#ifdef GL_ARB_color_buffer_float - "GL_ARB_color_buffer_float", -#endif -#ifdef GL_ARB_compatibility - "GL_ARB_compatibility", -#endif -#ifdef GL_ARB_compressed_texture_pixel_storage - "GL_ARB_compressed_texture_pixel_storage", -#endif -#ifdef GL_ARB_compute_shader - "GL_ARB_compute_shader", -#endif -#ifdef GL_ARB_compute_variable_group_size - "GL_ARB_compute_variable_group_size", -#endif -#ifdef GL_ARB_conditional_render_inverted - "GL_ARB_conditional_render_inverted", -#endif -#ifdef GL_ARB_conservative_depth - "GL_ARB_conservative_depth", -#endif -#ifdef GL_ARB_copy_buffer - "GL_ARB_copy_buffer", -#endif -#ifdef GL_ARB_copy_image - "GL_ARB_copy_image", -#endif -#ifdef GL_ARB_cull_distance - "GL_ARB_cull_distance", -#endif -#ifdef GL_ARB_debug_output - "GL_ARB_debug_output", -#endif -#ifdef GL_ARB_depth_buffer_float - "GL_ARB_depth_buffer_float", -#endif -#ifdef GL_ARB_depth_clamp - "GL_ARB_depth_clamp", -#endif -#ifdef GL_ARB_depth_texture - "GL_ARB_depth_texture", -#endif -#ifdef GL_ARB_derivative_control - "GL_ARB_derivative_control", -#endif -#ifdef GL_ARB_direct_state_access - "GL_ARB_direct_state_access", -#endif -#ifdef GL_ARB_draw_buffers - "GL_ARB_draw_buffers", -#endif -#ifdef GL_ARB_draw_buffers_blend - "GL_ARB_draw_buffers_blend", -#endif -#ifdef GL_ARB_draw_elements_base_vertex - "GL_ARB_draw_elements_base_vertex", -#endif -#ifdef GL_ARB_draw_indirect - "GL_ARB_draw_indirect", -#endif -#ifdef GL_ARB_draw_instanced - "GL_ARB_draw_instanced", -#endif -#ifdef GL_ARB_enhanced_layouts - "GL_ARB_enhanced_layouts", -#endif -#ifdef GL_ARB_explicit_attrib_location - "GL_ARB_explicit_attrib_location", -#endif -#ifdef GL_ARB_explicit_uniform_location - "GL_ARB_explicit_uniform_location", -#endif -#ifdef GL_ARB_fragment_coord_conventions - "GL_ARB_fragment_coord_conventions", -#endif -#ifdef GL_ARB_fragment_layer_viewport - "GL_ARB_fragment_layer_viewport", -#endif -#ifdef GL_ARB_fragment_program - "GL_ARB_fragment_program", -#endif -#ifdef GL_ARB_fragment_program_shadow - "GL_ARB_fragment_program_shadow", -#endif -#ifdef GL_ARB_fragment_shader - "GL_ARB_fragment_shader", -#endif -#ifdef GL_ARB_fragment_shader_interlock - "GL_ARB_fragment_shader_interlock", -#endif -#ifdef GL_ARB_framebuffer_no_attachments - "GL_ARB_framebuffer_no_attachments", -#endif -#ifdef GL_ARB_framebuffer_object - "GL_ARB_framebuffer_object", -#endif -#ifdef GL_ARB_framebuffer_sRGB - "GL_ARB_framebuffer_sRGB", -#endif -#ifdef GL_ARB_geometry_shader4 - "GL_ARB_geometry_shader4", -#endif -#ifdef GL_ARB_get_program_binary - "GL_ARB_get_program_binary", -#endif -#ifdef GL_ARB_get_texture_sub_image - "GL_ARB_get_texture_sub_image", -#endif -#ifdef GL_ARB_gl_spirv - "GL_ARB_gl_spirv", -#endif -#ifdef GL_ARB_gpu_shader5 - "GL_ARB_gpu_shader5", -#endif -#ifdef GL_ARB_gpu_shader_fp64 - "GL_ARB_gpu_shader_fp64", -#endif -#ifdef GL_ARB_gpu_shader_int64 - "GL_ARB_gpu_shader_int64", -#endif -#ifdef GL_ARB_half_float_pixel - "GL_ARB_half_float_pixel", -#endif -#ifdef GL_ARB_half_float_vertex - "GL_ARB_half_float_vertex", -#endif -#ifdef GL_ARB_imaging - "GL_ARB_imaging", -#endif -#ifdef GL_ARB_indirect_parameters - "GL_ARB_indirect_parameters", -#endif -#ifdef GL_ARB_instanced_arrays - "GL_ARB_instanced_arrays", -#endif -#ifdef GL_ARB_internalformat_query - "GL_ARB_internalformat_query", -#endif -#ifdef GL_ARB_internalformat_query2 - "GL_ARB_internalformat_query2", -#endif -#ifdef GL_ARB_invalidate_subdata - "GL_ARB_invalidate_subdata", -#endif -#ifdef GL_ARB_map_buffer_alignment - "GL_ARB_map_buffer_alignment", -#endif -#ifdef GL_ARB_map_buffer_range - "GL_ARB_map_buffer_range", -#endif -#ifdef GL_ARB_matrix_palette - "GL_ARB_matrix_palette", -#endif -#ifdef GL_ARB_multi_bind - "GL_ARB_multi_bind", -#endif -#ifdef GL_ARB_multi_draw_indirect - "GL_ARB_multi_draw_indirect", -#endif -#ifdef GL_ARB_multisample - "GL_ARB_multisample", -#endif -#ifdef GL_ARB_multitexture - "GL_ARB_multitexture", -#endif -#ifdef GL_ARB_occlusion_query - "GL_ARB_occlusion_query", -#endif -#ifdef GL_ARB_occlusion_query2 - "GL_ARB_occlusion_query2", -#endif -#ifdef GL_ARB_parallel_shader_compile - "GL_ARB_parallel_shader_compile", -#endif -#ifdef GL_ARB_pipeline_statistics_query - "GL_ARB_pipeline_statistics_query", -#endif -#ifdef GL_ARB_pixel_buffer_object - "GL_ARB_pixel_buffer_object", -#endif -#ifdef GL_ARB_point_parameters - "GL_ARB_point_parameters", -#endif -#ifdef GL_ARB_point_sprite - "GL_ARB_point_sprite", -#endif -#ifdef GL_ARB_polygon_offset_clamp - "GL_ARB_polygon_offset_clamp", -#endif -#ifdef GL_ARB_post_depth_coverage - "GL_ARB_post_depth_coverage", -#endif -#ifdef GL_ARB_program_interface_query - "GL_ARB_program_interface_query", -#endif -#ifdef GL_ARB_provoking_vertex - "GL_ARB_provoking_vertex", -#endif -#ifdef GL_ARB_query_buffer_object - "GL_ARB_query_buffer_object", -#endif -#ifdef GL_ARB_robust_buffer_access_behavior - "GL_ARB_robust_buffer_access_behavior", -#endif -#ifdef GL_ARB_robustness - "GL_ARB_robustness", -#endif -#ifdef GL_ARB_robustness_application_isolation - "GL_ARB_robustness_application_isolation", -#endif -#ifdef GL_ARB_robustness_share_group_isolation - "GL_ARB_robustness_share_group_isolation", -#endif -#ifdef GL_ARB_sample_locations - "GL_ARB_sample_locations", -#endif -#ifdef GL_ARB_sample_shading - "GL_ARB_sample_shading", -#endif -#ifdef GL_ARB_sampler_objects - "GL_ARB_sampler_objects", -#endif -#ifdef GL_ARB_seamless_cube_map - "GL_ARB_seamless_cube_map", -#endif -#ifdef GL_ARB_seamless_cubemap_per_texture - "GL_ARB_seamless_cubemap_per_texture", -#endif -#ifdef GL_ARB_separate_shader_objects - "GL_ARB_separate_shader_objects", -#endif -#ifdef GL_ARB_shader_atomic_counter_ops - "GL_ARB_shader_atomic_counter_ops", -#endif -#ifdef GL_ARB_shader_atomic_counters - "GL_ARB_shader_atomic_counters", -#endif -#ifdef GL_ARB_shader_ballot - "GL_ARB_shader_ballot", -#endif -#ifdef GL_ARB_shader_bit_encoding - "GL_ARB_shader_bit_encoding", -#endif -#ifdef GL_ARB_shader_clock - "GL_ARB_shader_clock", -#endif -#ifdef GL_ARB_shader_draw_parameters - "GL_ARB_shader_draw_parameters", -#endif -#ifdef GL_ARB_shader_group_vote - "GL_ARB_shader_group_vote", -#endif -#ifdef GL_ARB_shader_image_load_store - "GL_ARB_shader_image_load_store", -#endif -#ifdef GL_ARB_shader_image_size - "GL_ARB_shader_image_size", -#endif -#ifdef GL_ARB_shader_objects - "GL_ARB_shader_objects", -#endif -#ifdef GL_ARB_shader_precision - "GL_ARB_shader_precision", -#endif -#ifdef GL_ARB_shader_stencil_export - "GL_ARB_shader_stencil_export", -#endif -#ifdef GL_ARB_shader_storage_buffer_object - "GL_ARB_shader_storage_buffer_object", -#endif -#ifdef GL_ARB_shader_subroutine - "GL_ARB_shader_subroutine", -#endif -#ifdef GL_ARB_shader_texture_image_samples - "GL_ARB_shader_texture_image_samples", -#endif -#ifdef GL_ARB_shader_texture_lod - "GL_ARB_shader_texture_lod", -#endif -#ifdef GL_ARB_shader_viewport_layer_array - "GL_ARB_shader_viewport_layer_array", -#endif -#ifdef GL_ARB_shading_language_100 - "GL_ARB_shading_language_100", -#endif -#ifdef GL_ARB_shading_language_420pack - "GL_ARB_shading_language_420pack", -#endif -#ifdef GL_ARB_shading_language_include - "GL_ARB_shading_language_include", -#endif -#ifdef GL_ARB_shading_language_packing - "GL_ARB_shading_language_packing", -#endif -#ifdef GL_ARB_shadow - "GL_ARB_shadow", -#endif -#ifdef GL_ARB_shadow_ambient - "GL_ARB_shadow_ambient", -#endif -#ifdef GL_ARB_sparse_buffer - "GL_ARB_sparse_buffer", -#endif -#ifdef GL_ARB_sparse_texture - "GL_ARB_sparse_texture", -#endif -#ifdef GL_ARB_sparse_texture2 - "GL_ARB_sparse_texture2", -#endif -#ifdef GL_ARB_sparse_texture_clamp - "GL_ARB_sparse_texture_clamp", -#endif -#ifdef GL_ARB_spirv_extensions - "GL_ARB_spirv_extensions", -#endif -#ifdef GL_ARB_stencil_texturing - "GL_ARB_stencil_texturing", -#endif -#ifdef GL_ARB_sync - "GL_ARB_sync", -#endif -#ifdef GL_ARB_tessellation_shader - "GL_ARB_tessellation_shader", -#endif -#ifdef GL_ARB_texture_barrier - "GL_ARB_texture_barrier", -#endif -#ifdef GL_ARB_texture_border_clamp - "GL_ARB_texture_border_clamp", -#endif -#ifdef GL_ARB_texture_buffer_object - "GL_ARB_texture_buffer_object", -#endif -#ifdef GL_ARB_texture_buffer_object_rgb32 - "GL_ARB_texture_buffer_object_rgb32", -#endif -#ifdef GL_ARB_texture_buffer_range - "GL_ARB_texture_buffer_range", -#endif -#ifdef GL_ARB_texture_compression - "GL_ARB_texture_compression", -#endif -#ifdef GL_ARB_texture_compression_bptc - "GL_ARB_texture_compression_bptc", -#endif -#ifdef GL_ARB_texture_compression_rgtc - "GL_ARB_texture_compression_rgtc", -#endif -#ifdef GL_ARB_texture_cube_map - "GL_ARB_texture_cube_map", -#endif -#ifdef GL_ARB_texture_cube_map_array - "GL_ARB_texture_cube_map_array", -#endif -#ifdef GL_ARB_texture_env_add - "GL_ARB_texture_env_add", -#endif -#ifdef GL_ARB_texture_env_combine - "GL_ARB_texture_env_combine", -#endif -#ifdef GL_ARB_texture_env_crossbar - "GL_ARB_texture_env_crossbar", -#endif -#ifdef GL_ARB_texture_env_dot3 - "GL_ARB_texture_env_dot3", -#endif -#ifdef GL_ARB_texture_filter_anisotropic - "GL_ARB_texture_filter_anisotropic", -#endif -#ifdef GL_ARB_texture_filter_minmax - "GL_ARB_texture_filter_minmax", -#endif -#ifdef GL_ARB_texture_float - "GL_ARB_texture_float", -#endif -#ifdef GL_ARB_texture_gather - "GL_ARB_texture_gather", -#endif -#ifdef GL_ARB_texture_mirror_clamp_to_edge - "GL_ARB_texture_mirror_clamp_to_edge", -#endif -#ifdef GL_ARB_texture_mirrored_repeat - "GL_ARB_texture_mirrored_repeat", -#endif -#ifdef GL_ARB_texture_multisample - "GL_ARB_texture_multisample", -#endif -#ifdef GL_ARB_texture_non_power_of_two - "GL_ARB_texture_non_power_of_two", -#endif -#ifdef GL_ARB_texture_query_levels - "GL_ARB_texture_query_levels", -#endif -#ifdef GL_ARB_texture_query_lod - "GL_ARB_texture_query_lod", -#endif -#ifdef GL_ARB_texture_rectangle - "GL_ARB_texture_rectangle", -#endif -#ifdef GL_ARB_texture_rg - "GL_ARB_texture_rg", -#endif -#ifdef GL_ARB_texture_rgb10_a2ui - "GL_ARB_texture_rgb10_a2ui", -#endif -#ifdef GL_ARB_texture_stencil8 - "GL_ARB_texture_stencil8", -#endif -#ifdef GL_ARB_texture_storage - "GL_ARB_texture_storage", -#endif -#ifdef GL_ARB_texture_storage_multisample - "GL_ARB_texture_storage_multisample", -#endif -#ifdef GL_ARB_texture_swizzle - "GL_ARB_texture_swizzle", -#endif -#ifdef GL_ARB_texture_view - "GL_ARB_texture_view", -#endif -#ifdef GL_ARB_timer_query - "GL_ARB_timer_query", -#endif -#ifdef GL_ARB_transform_feedback2 - "GL_ARB_transform_feedback2", -#endif -#ifdef GL_ARB_transform_feedback3 - "GL_ARB_transform_feedback3", -#endif -#ifdef GL_ARB_transform_feedback_instanced - "GL_ARB_transform_feedback_instanced", -#endif -#ifdef GL_ARB_transform_feedback_overflow_query - "GL_ARB_transform_feedback_overflow_query", -#endif -#ifdef GL_ARB_transpose_matrix - "GL_ARB_transpose_matrix", -#endif -#ifdef GL_ARB_uniform_buffer_object - "GL_ARB_uniform_buffer_object", -#endif -#ifdef GL_ARB_vertex_array_bgra - "GL_ARB_vertex_array_bgra", -#endif -#ifdef GL_ARB_vertex_array_object - "GL_ARB_vertex_array_object", -#endif -#ifdef GL_ARB_vertex_attrib_64bit - "GL_ARB_vertex_attrib_64bit", -#endif -#ifdef GL_ARB_vertex_attrib_binding - "GL_ARB_vertex_attrib_binding", -#endif -#ifdef GL_ARB_vertex_blend - "GL_ARB_vertex_blend", -#endif -#ifdef GL_ARB_vertex_buffer_object - "GL_ARB_vertex_buffer_object", -#endif -#ifdef GL_ARB_vertex_program - "GL_ARB_vertex_program", -#endif -#ifdef GL_ARB_vertex_shader - "GL_ARB_vertex_shader", -#endif -#ifdef GL_ARB_vertex_type_10f_11f_11f_rev - "GL_ARB_vertex_type_10f_11f_11f_rev", -#endif -#ifdef GL_ARB_vertex_type_2_10_10_10_rev - "GL_ARB_vertex_type_2_10_10_10_rev", -#endif -#ifdef GL_ARB_viewport_array - "GL_ARB_viewport_array", -#endif -#ifdef GL_ARB_window_pos - "GL_ARB_window_pos", -#endif -#ifdef GL_ARM_mali_program_binary - "GL_ARM_mali_program_binary", -#endif -#ifdef GL_ARM_mali_shader_binary - "GL_ARM_mali_shader_binary", -#endif -#ifdef GL_ARM_rgba8 - "GL_ARM_rgba8", -#endif -#ifdef GL_ARM_shader_framebuffer_fetch - "GL_ARM_shader_framebuffer_fetch", -#endif -#ifdef GL_ARM_shader_framebuffer_fetch_depth_stencil - "GL_ARM_shader_framebuffer_fetch_depth_stencil", -#endif -#ifdef GL_ARM_texture_unnormalized_coordinates - "GL_ARM_texture_unnormalized_coordinates", -#endif -#ifdef GL_ATIX_point_sprites - "GL_ATIX_point_sprites", -#endif -#ifdef GL_ATIX_texture_env_combine3 - "GL_ATIX_texture_env_combine3", -#endif -#ifdef GL_ATIX_texture_env_route - "GL_ATIX_texture_env_route", -#endif -#ifdef GL_ATIX_vertex_shader_output_point_size - "GL_ATIX_vertex_shader_output_point_size", -#endif -#ifdef GL_ATI_draw_buffers - "GL_ATI_draw_buffers", -#endif -#ifdef GL_ATI_element_array - "GL_ATI_element_array", -#endif -#ifdef GL_ATI_envmap_bumpmap - "GL_ATI_envmap_bumpmap", -#endif -#ifdef GL_ATI_fragment_shader - "GL_ATI_fragment_shader", -#endif -#ifdef GL_ATI_map_object_buffer - "GL_ATI_map_object_buffer", -#endif -#ifdef GL_ATI_meminfo - "GL_ATI_meminfo", -#endif -#ifdef GL_ATI_pn_triangles - "GL_ATI_pn_triangles", -#endif -#ifdef GL_ATI_separate_stencil - "GL_ATI_separate_stencil", -#endif -#ifdef GL_ATI_shader_texture_lod - "GL_ATI_shader_texture_lod", -#endif -#ifdef GL_ATI_text_fragment_shader - "GL_ATI_text_fragment_shader", -#endif -#ifdef GL_ATI_texture_compression_3dc - "GL_ATI_texture_compression_3dc", -#endif -#ifdef GL_ATI_texture_env_combine3 - "GL_ATI_texture_env_combine3", -#endif -#ifdef GL_ATI_texture_float - "GL_ATI_texture_float", -#endif -#ifdef GL_ATI_texture_mirror_once - "GL_ATI_texture_mirror_once", -#endif -#ifdef GL_ATI_vertex_array_object - "GL_ATI_vertex_array_object", -#endif -#ifdef GL_ATI_vertex_attrib_array_object - "GL_ATI_vertex_attrib_array_object", -#endif -#ifdef GL_ATI_vertex_streams - "GL_ATI_vertex_streams", -#endif -#ifdef GL_DMP_program_binary - "GL_DMP_program_binary", -#endif -#ifdef GL_DMP_shader_binary - "GL_DMP_shader_binary", -#endif -#ifdef GL_EXT_422_pixels - "GL_EXT_422_pixels", -#endif -#ifdef GL_EXT_Cg_shader - "GL_EXT_Cg_shader", -#endif -#ifdef GL_EXT_EGL_image_array - "GL_EXT_EGL_image_array", -#endif -#ifdef GL_EXT_EGL_image_external_wrap_modes - "GL_EXT_EGL_image_external_wrap_modes", -#endif -#ifdef GL_EXT_EGL_image_storage - "GL_EXT_EGL_image_storage", -#endif -#ifdef GL_EXT_EGL_sync - "GL_EXT_EGL_sync", -#endif -#ifdef GL_EXT_YUV_target - "GL_EXT_YUV_target", -#endif -#ifdef GL_EXT_abgr - "GL_EXT_abgr", -#endif -#ifdef GL_EXT_base_instance - "GL_EXT_base_instance", -#endif -#ifdef GL_EXT_bgra - "GL_EXT_bgra", -#endif -#ifdef GL_EXT_bindable_uniform - "GL_EXT_bindable_uniform", -#endif -#ifdef GL_EXT_blend_color - "GL_EXT_blend_color", -#endif -#ifdef GL_EXT_blend_equation_separate - "GL_EXT_blend_equation_separate", -#endif -#ifdef GL_EXT_blend_func_extended - "GL_EXT_blend_func_extended", -#endif -#ifdef GL_EXT_blend_func_separate - "GL_EXT_blend_func_separate", -#endif -#ifdef GL_EXT_blend_logic_op - "GL_EXT_blend_logic_op", -#endif -#ifdef GL_EXT_blend_minmax - "GL_EXT_blend_minmax", -#endif -#ifdef GL_EXT_blend_subtract - "GL_EXT_blend_subtract", -#endif -#ifdef GL_EXT_buffer_storage - "GL_EXT_buffer_storage", -#endif -#ifdef GL_EXT_clear_texture - "GL_EXT_clear_texture", -#endif -#ifdef GL_EXT_clip_control - "GL_EXT_clip_control", -#endif -#ifdef GL_EXT_clip_cull_distance - "GL_EXT_clip_cull_distance", -#endif -#ifdef GL_EXT_clip_volume_hint - "GL_EXT_clip_volume_hint", -#endif -#ifdef GL_EXT_cmyka - "GL_EXT_cmyka", -#endif -#ifdef GL_EXT_color_buffer_float - "GL_EXT_color_buffer_float", -#endif -#ifdef GL_EXT_color_buffer_half_float - "GL_EXT_color_buffer_half_float", -#endif -#ifdef GL_EXT_color_subtable - "GL_EXT_color_subtable", -#endif -#ifdef GL_EXT_compiled_vertex_array - "GL_EXT_compiled_vertex_array", -#endif -#ifdef GL_EXT_compressed_ETC1_RGB8_sub_texture - "GL_EXT_compressed_ETC1_RGB8_sub_texture", -#endif -#ifdef GL_EXT_conservative_depth - "GL_EXT_conservative_depth", -#endif -#ifdef GL_EXT_convolution - "GL_EXT_convolution", -#endif -#ifdef GL_EXT_coordinate_frame - "GL_EXT_coordinate_frame", -#endif -#ifdef GL_EXT_copy_image - "GL_EXT_copy_image", -#endif -#ifdef GL_EXT_copy_texture - "GL_EXT_copy_texture", -#endif -#ifdef GL_EXT_cull_vertex - "GL_EXT_cull_vertex", -#endif -#ifdef GL_EXT_debug_label - "GL_EXT_debug_label", -#endif -#ifdef GL_EXT_debug_marker - "GL_EXT_debug_marker", -#endif -#ifdef GL_EXT_depth_bounds_test - "GL_EXT_depth_bounds_test", -#endif -#ifdef GL_EXT_depth_clamp - "GL_EXT_depth_clamp", -#endif -#ifdef GL_EXT_direct_state_access - "GL_EXT_direct_state_access", -#endif -#ifdef GL_EXT_discard_framebuffer - "GL_EXT_discard_framebuffer", -#endif -#ifdef GL_EXT_disjoint_timer_query - "GL_EXT_disjoint_timer_query", -#endif -#ifdef GL_EXT_draw_buffers - "GL_EXT_draw_buffers", -#endif -#ifdef GL_EXT_draw_buffers2 - "GL_EXT_draw_buffers2", -#endif -#ifdef GL_EXT_draw_buffers_indexed - "GL_EXT_draw_buffers_indexed", -#endif -#ifdef GL_EXT_draw_elements_base_vertex - "GL_EXT_draw_elements_base_vertex", -#endif -#ifdef GL_EXT_draw_instanced - "GL_EXT_draw_instanced", -#endif -#ifdef GL_EXT_draw_range_elements - "GL_EXT_draw_range_elements", -#endif -#ifdef GL_EXT_draw_transform_feedback - "GL_EXT_draw_transform_feedback", -#endif -#ifdef GL_EXT_external_buffer - "GL_EXT_external_buffer", -#endif -#ifdef GL_EXT_float_blend - "GL_EXT_float_blend", -#endif -#ifdef GL_EXT_fog_coord - "GL_EXT_fog_coord", -#endif -#ifdef GL_EXT_frag_depth - "GL_EXT_frag_depth", -#endif -#ifdef GL_EXT_fragment_lighting - "GL_EXT_fragment_lighting", -#endif -#ifdef GL_EXT_framebuffer_blit - "GL_EXT_framebuffer_blit", -#endif -#ifdef GL_EXT_framebuffer_multisample - "GL_EXT_framebuffer_multisample", -#endif -#ifdef GL_EXT_framebuffer_multisample_blit_scaled - "GL_EXT_framebuffer_multisample_blit_scaled", -#endif -#ifdef GL_EXT_framebuffer_object - "GL_EXT_framebuffer_object", -#endif -#ifdef GL_EXT_framebuffer_sRGB - "GL_EXT_framebuffer_sRGB", -#endif -#ifdef GL_EXT_geometry_point_size - "GL_EXT_geometry_point_size", -#endif -#ifdef GL_EXT_geometry_shader - "GL_EXT_geometry_shader", -#endif -#ifdef GL_EXT_geometry_shader4 - "GL_EXT_geometry_shader4", -#endif -#ifdef GL_EXT_gpu_program_parameters - "GL_EXT_gpu_program_parameters", -#endif -#ifdef GL_EXT_gpu_shader4 - "GL_EXT_gpu_shader4", -#endif -#ifdef GL_EXT_gpu_shader5 - "GL_EXT_gpu_shader5", -#endif -#ifdef GL_EXT_histogram - "GL_EXT_histogram", -#endif -#ifdef GL_EXT_index_array_formats - "GL_EXT_index_array_formats", -#endif -#ifdef GL_EXT_index_func - "GL_EXT_index_func", -#endif -#ifdef GL_EXT_index_material - "GL_EXT_index_material", -#endif -#ifdef GL_EXT_index_texture - "GL_EXT_index_texture", -#endif -#ifdef GL_EXT_instanced_arrays - "GL_EXT_instanced_arrays", -#endif -#ifdef GL_EXT_light_texture - "GL_EXT_light_texture", -#endif -#ifdef GL_EXT_map_buffer_range - "GL_EXT_map_buffer_range", -#endif -#ifdef GL_EXT_memory_object - "GL_EXT_memory_object", -#endif -#ifdef GL_EXT_memory_object_fd - "GL_EXT_memory_object_fd", -#endif -#ifdef GL_EXT_memory_object_win32 - "GL_EXT_memory_object_win32", -#endif -#ifdef GL_EXT_misc_attribute - "GL_EXT_misc_attribute", -#endif -#ifdef GL_EXT_multi_draw_arrays - "GL_EXT_multi_draw_arrays", -#endif -#ifdef GL_EXT_multi_draw_indirect - "GL_EXT_multi_draw_indirect", -#endif -#ifdef GL_EXT_multiple_textures - "GL_EXT_multiple_textures", -#endif -#ifdef GL_EXT_multisample - "GL_EXT_multisample", -#endif -#ifdef GL_EXT_multisample_compatibility - "GL_EXT_multisample_compatibility", -#endif -#ifdef GL_EXT_multisampled_render_to_texture - "GL_EXT_multisampled_render_to_texture", -#endif -#ifdef GL_EXT_multisampled_render_to_texture2 - "GL_EXT_multisampled_render_to_texture2", -#endif -#ifdef GL_EXT_multiview_draw_buffers - "GL_EXT_multiview_draw_buffers", -#endif -#ifdef GL_EXT_multiview_tessellation_geometry_shader - "GL_EXT_multiview_tessellation_geometry_shader", -#endif -#ifdef GL_EXT_multiview_texture_multisample - "GL_EXT_multiview_texture_multisample", -#endif -#ifdef GL_EXT_multiview_timer_query - "GL_EXT_multiview_timer_query", -#endif -#ifdef GL_EXT_occlusion_query_boolean - "GL_EXT_occlusion_query_boolean", -#endif -#ifdef GL_EXT_packed_depth_stencil - "GL_EXT_packed_depth_stencil", -#endif -#ifdef GL_EXT_packed_float - "GL_EXT_packed_float", -#endif -#ifdef GL_EXT_packed_pixels - "GL_EXT_packed_pixels", -#endif -#ifdef GL_EXT_paletted_texture - "GL_EXT_paletted_texture", -#endif -#ifdef GL_EXT_pixel_buffer_object - "GL_EXT_pixel_buffer_object", -#endif -#ifdef GL_EXT_pixel_transform - "GL_EXT_pixel_transform", -#endif -#ifdef GL_EXT_pixel_transform_color_table - "GL_EXT_pixel_transform_color_table", -#endif -#ifdef GL_EXT_point_parameters - "GL_EXT_point_parameters", -#endif -#ifdef GL_EXT_polygon_offset - "GL_EXT_polygon_offset", -#endif -#ifdef GL_EXT_polygon_offset_clamp - "GL_EXT_polygon_offset_clamp", -#endif -#ifdef GL_EXT_post_depth_coverage - "GL_EXT_post_depth_coverage", -#endif -#ifdef GL_EXT_primitive_bounding_box - "GL_EXT_primitive_bounding_box", -#endif -#ifdef GL_EXT_protected_textures - "GL_EXT_protected_textures", -#endif -#ifdef GL_EXT_provoking_vertex - "GL_EXT_provoking_vertex", -#endif -#ifdef GL_EXT_pvrtc_sRGB - "GL_EXT_pvrtc_sRGB", -#endif -#ifdef GL_EXT_raster_multisample - "GL_EXT_raster_multisample", -#endif -#ifdef GL_EXT_read_format_bgra - "GL_EXT_read_format_bgra", -#endif -#ifdef GL_EXT_render_snorm - "GL_EXT_render_snorm", -#endif -#ifdef GL_EXT_rescale_normal - "GL_EXT_rescale_normal", -#endif -#ifdef GL_EXT_robustness - "GL_EXT_robustness", -#endif -#ifdef GL_EXT_sRGB - "GL_EXT_sRGB", -#endif -#ifdef GL_EXT_sRGB_write_control - "GL_EXT_sRGB_write_control", -#endif -#ifdef GL_EXT_scene_marker - "GL_EXT_scene_marker", -#endif -#ifdef GL_EXT_secondary_color - "GL_EXT_secondary_color", -#endif -#ifdef GL_EXT_semaphore - "GL_EXT_semaphore", -#endif -#ifdef GL_EXT_semaphore_fd - "GL_EXT_semaphore_fd", -#endif -#ifdef GL_EXT_semaphore_win32 - "GL_EXT_semaphore_win32", -#endif -#ifdef GL_EXT_separate_shader_objects - "GL_EXT_separate_shader_objects", -#endif -#ifdef GL_EXT_separate_specular_color - "GL_EXT_separate_specular_color", -#endif -#ifdef GL_EXT_shader_framebuffer_fetch - "GL_EXT_shader_framebuffer_fetch", -#endif -#ifdef GL_EXT_shader_framebuffer_fetch_non_coherent - "GL_EXT_shader_framebuffer_fetch_non_coherent", -#endif -#ifdef GL_EXT_shader_group_vote - "GL_EXT_shader_group_vote", -#endif -#ifdef GL_EXT_shader_image_load_formatted - "GL_EXT_shader_image_load_formatted", -#endif -#ifdef GL_EXT_shader_image_load_store - "GL_EXT_shader_image_load_store", -#endif -#ifdef GL_EXT_shader_implicit_conversions - "GL_EXT_shader_implicit_conversions", -#endif -#ifdef GL_EXT_shader_integer_mix - "GL_EXT_shader_integer_mix", -#endif -#ifdef GL_EXT_shader_io_blocks - "GL_EXT_shader_io_blocks", -#endif -#ifdef GL_EXT_shader_non_constant_global_initializers - "GL_EXT_shader_non_constant_global_initializers", -#endif -#ifdef GL_EXT_shader_pixel_local_storage - "GL_EXT_shader_pixel_local_storage", -#endif -#ifdef GL_EXT_shader_pixel_local_storage2 - "GL_EXT_shader_pixel_local_storage2", -#endif -#ifdef GL_EXT_shader_texture_lod - "GL_EXT_shader_texture_lod", -#endif -#ifdef GL_EXT_shadow_funcs - "GL_EXT_shadow_funcs", -#endif -#ifdef GL_EXT_shadow_samplers - "GL_EXT_shadow_samplers", -#endif -#ifdef GL_EXT_shared_texture_palette - "GL_EXT_shared_texture_palette", -#endif -#ifdef GL_EXT_sparse_texture - "GL_EXT_sparse_texture", -#endif -#ifdef GL_EXT_sparse_texture2 - "GL_EXT_sparse_texture2", -#endif -#ifdef GL_EXT_static_vertex_array - "GL_EXT_static_vertex_array", -#endif -#ifdef GL_EXT_stencil_clear_tag - "GL_EXT_stencil_clear_tag", -#endif -#ifdef GL_EXT_stencil_two_side - "GL_EXT_stencil_two_side", -#endif -#ifdef GL_EXT_stencil_wrap - "GL_EXT_stencil_wrap", -#endif -#ifdef GL_EXT_subtexture - "GL_EXT_subtexture", -#endif -#ifdef GL_EXT_tessellation_point_size - "GL_EXT_tessellation_point_size", -#endif -#ifdef GL_EXT_tessellation_shader - "GL_EXT_tessellation_shader", -#endif -#ifdef GL_EXT_texture - "GL_EXT_texture", -#endif -#ifdef GL_EXT_texture3D - "GL_EXT_texture3D", -#endif -#ifdef GL_EXT_texture_array - "GL_EXT_texture_array", -#endif -#ifdef GL_EXT_texture_border_clamp - "GL_EXT_texture_border_clamp", -#endif -#ifdef GL_EXT_texture_buffer - "GL_EXT_texture_buffer", -#endif -#ifdef GL_EXT_texture_buffer_object - "GL_EXT_texture_buffer_object", -#endif -#ifdef GL_EXT_texture_compression_astc_decode_mode - "GL_EXT_texture_compression_astc_decode_mode", -#endif -#ifdef GL_EXT_texture_compression_astc_decode_mode_rgb9e5 - "GL_EXT_texture_compression_astc_decode_mode_rgb9e5", -#endif -#ifdef GL_EXT_texture_compression_bptc - "GL_EXT_texture_compression_bptc", -#endif -#ifdef GL_EXT_texture_compression_dxt1 - "GL_EXT_texture_compression_dxt1", -#endif -#ifdef GL_EXT_texture_compression_latc - "GL_EXT_texture_compression_latc", -#endif -#ifdef GL_EXT_texture_compression_rgtc - "GL_EXT_texture_compression_rgtc", -#endif -#ifdef GL_EXT_texture_compression_s3tc - "GL_EXT_texture_compression_s3tc", -#endif -#ifdef GL_EXT_texture_compression_s3tc_srgb - "GL_EXT_texture_compression_s3tc_srgb", -#endif -#ifdef GL_EXT_texture_cube_map - "GL_EXT_texture_cube_map", -#endif -#ifdef GL_EXT_texture_cube_map_array - "GL_EXT_texture_cube_map_array", -#endif -#ifdef GL_EXT_texture_edge_clamp - "GL_EXT_texture_edge_clamp", -#endif -#ifdef GL_EXT_texture_env - "GL_EXT_texture_env", -#endif -#ifdef GL_EXT_texture_env_add - "GL_EXT_texture_env_add", -#endif -#ifdef GL_EXT_texture_env_combine - "GL_EXT_texture_env_combine", -#endif -#ifdef GL_EXT_texture_env_dot3 - "GL_EXT_texture_env_dot3", -#endif -#ifdef GL_EXT_texture_filter_anisotropic - "GL_EXT_texture_filter_anisotropic", -#endif -#ifdef GL_EXT_texture_filter_minmax - "GL_EXT_texture_filter_minmax", -#endif -#ifdef GL_EXT_texture_format_BGRA8888 - "GL_EXT_texture_format_BGRA8888", -#endif -#ifdef GL_EXT_texture_format_sRGB_override - "GL_EXT_texture_format_sRGB_override", -#endif -#ifdef GL_EXT_texture_integer - "GL_EXT_texture_integer", -#endif -#ifdef GL_EXT_texture_lod_bias - "GL_EXT_texture_lod_bias", -#endif -#ifdef GL_EXT_texture_mirror_clamp - "GL_EXT_texture_mirror_clamp", -#endif -#ifdef GL_EXT_texture_mirror_clamp_to_edge - "GL_EXT_texture_mirror_clamp_to_edge", -#endif -#ifdef GL_EXT_texture_norm16 - "GL_EXT_texture_norm16", -#endif -#ifdef GL_EXT_texture_object - "GL_EXT_texture_object", -#endif -#ifdef GL_EXT_texture_perturb_normal - "GL_EXT_texture_perturb_normal", -#endif -#ifdef GL_EXT_texture_query_lod - "GL_EXT_texture_query_lod", -#endif -#ifdef GL_EXT_texture_rectangle - "GL_EXT_texture_rectangle", -#endif -#ifdef GL_EXT_texture_rg - "GL_EXT_texture_rg", -#endif -#ifdef GL_EXT_texture_sRGB - "GL_EXT_texture_sRGB", -#endif -#ifdef GL_EXT_texture_sRGB_R8 - "GL_EXT_texture_sRGB_R8", -#endif -#ifdef GL_EXT_texture_sRGB_RG8 - "GL_EXT_texture_sRGB_RG8", -#endif -#ifdef GL_EXT_texture_sRGB_decode - "GL_EXT_texture_sRGB_decode", -#endif -#ifdef GL_EXT_texture_shadow_lod - "GL_EXT_texture_shadow_lod", -#endif -#ifdef GL_EXT_texture_shared_exponent - "GL_EXT_texture_shared_exponent", -#endif -#ifdef GL_EXT_texture_snorm - "GL_EXT_texture_snorm", -#endif -#ifdef GL_EXT_texture_storage - "GL_EXT_texture_storage", -#endif -#ifdef GL_EXT_texture_swizzle - "GL_EXT_texture_swizzle", -#endif -#ifdef GL_EXT_texture_type_2_10_10_10_REV - "GL_EXT_texture_type_2_10_10_10_REV", -#endif -#ifdef GL_EXT_texture_view - "GL_EXT_texture_view", -#endif -#ifdef GL_EXT_timer_query - "GL_EXT_timer_query", -#endif -#ifdef GL_EXT_transform_feedback - "GL_EXT_transform_feedback", -#endif -#ifdef GL_EXT_unpack_subimage - "GL_EXT_unpack_subimage", -#endif -#ifdef GL_EXT_vertex_array - "GL_EXT_vertex_array", -#endif -#ifdef GL_EXT_vertex_array_bgra - "GL_EXT_vertex_array_bgra", -#endif -#ifdef GL_EXT_vertex_array_setXXX - "GL_EXT_vertex_array_setXXX", -#endif -#ifdef GL_EXT_vertex_attrib_64bit - "GL_EXT_vertex_attrib_64bit", -#endif -#ifdef GL_EXT_vertex_shader - "GL_EXT_vertex_shader", -#endif -#ifdef GL_EXT_vertex_weighting - "GL_EXT_vertex_weighting", -#endif -#ifdef GL_EXT_win32_keyed_mutex - "GL_EXT_win32_keyed_mutex", -#endif -#ifdef GL_EXT_window_rectangles - "GL_EXT_window_rectangles", -#endif -#ifdef GL_EXT_x11_sync_object - "GL_EXT_x11_sync_object", -#endif -#ifdef GL_FJ_shader_binary_GCCSO - "GL_FJ_shader_binary_GCCSO", -#endif -#ifdef GL_GREMEDY_frame_terminator - "GL_GREMEDY_frame_terminator", -#endif -#ifdef GL_GREMEDY_string_marker - "GL_GREMEDY_string_marker", -#endif -#ifdef GL_HP_convolution_border_modes - "GL_HP_convolution_border_modes", -#endif -#ifdef GL_HP_image_transform - "GL_HP_image_transform", -#endif -#ifdef GL_HP_occlusion_test - "GL_HP_occlusion_test", -#endif -#ifdef GL_HP_texture_lighting - "GL_HP_texture_lighting", -#endif -#ifdef GL_IBM_cull_vertex - "GL_IBM_cull_vertex", -#endif -#ifdef GL_IBM_multimode_draw_arrays - "GL_IBM_multimode_draw_arrays", -#endif -#ifdef GL_IBM_rasterpos_clip - "GL_IBM_rasterpos_clip", -#endif -#ifdef GL_IBM_static_data - "GL_IBM_static_data", -#endif -#ifdef GL_IBM_texture_mirrored_repeat - "GL_IBM_texture_mirrored_repeat", -#endif -#ifdef GL_IBM_vertex_array_lists - "GL_IBM_vertex_array_lists", -#endif -#ifdef GL_IMG_bindless_texture - "GL_IMG_bindless_texture", -#endif -#ifdef GL_IMG_framebuffer_downsample - "GL_IMG_framebuffer_downsample", -#endif -#ifdef GL_IMG_multisampled_render_to_texture - "GL_IMG_multisampled_render_to_texture", -#endif -#ifdef GL_IMG_program_binary - "GL_IMG_program_binary", -#endif -#ifdef GL_IMG_read_format - "GL_IMG_read_format", -#endif -#ifdef GL_IMG_shader_binary - "GL_IMG_shader_binary", -#endif -#ifdef GL_IMG_texture_compression_pvrtc - "GL_IMG_texture_compression_pvrtc", -#endif -#ifdef GL_IMG_texture_compression_pvrtc2 - "GL_IMG_texture_compression_pvrtc2", -#endif -#ifdef GL_IMG_texture_env_enhanced_fixed_function - "GL_IMG_texture_env_enhanced_fixed_function", -#endif -#ifdef GL_IMG_texture_filter_cubic - "GL_IMG_texture_filter_cubic", -#endif -#ifdef GL_INGR_color_clamp - "GL_INGR_color_clamp", -#endif -#ifdef GL_INGR_interlace_read - "GL_INGR_interlace_read", -#endif -#ifdef GL_INTEL_blackhole_render - "GL_INTEL_blackhole_render", -#endif -#ifdef GL_INTEL_conservative_rasterization - "GL_INTEL_conservative_rasterization", -#endif -#ifdef GL_INTEL_fragment_shader_ordering - "GL_INTEL_fragment_shader_ordering", -#endif -#ifdef GL_INTEL_framebuffer_CMAA - "GL_INTEL_framebuffer_CMAA", -#endif -#ifdef GL_INTEL_map_texture - "GL_INTEL_map_texture", -#endif -#ifdef GL_INTEL_parallel_arrays - "GL_INTEL_parallel_arrays", -#endif -#ifdef GL_INTEL_performance_query - "GL_INTEL_performance_query", -#endif -#ifdef GL_INTEL_shader_integer_functions2 - "GL_INTEL_shader_integer_functions2", -#endif -#ifdef GL_INTEL_texture_scissor - "GL_INTEL_texture_scissor", -#endif -#ifdef GL_KHR_blend_equation_advanced - "GL_KHR_blend_equation_advanced", -#endif -#ifdef GL_KHR_blend_equation_advanced_coherent - "GL_KHR_blend_equation_advanced_coherent", -#endif -#ifdef GL_KHR_context_flush_control - "GL_KHR_context_flush_control", -#endif -#ifdef GL_KHR_debug - "GL_KHR_debug", -#endif -#ifdef GL_KHR_no_error - "GL_KHR_no_error", -#endif -#ifdef GL_KHR_parallel_shader_compile - "GL_KHR_parallel_shader_compile", -#endif -#ifdef GL_KHR_robust_buffer_access_behavior - "GL_KHR_robust_buffer_access_behavior", -#endif -#ifdef GL_KHR_robustness - "GL_KHR_robustness", -#endif -#ifdef GL_KHR_shader_subgroup - "GL_KHR_shader_subgroup", -#endif -#ifdef GL_KHR_texture_compression_astc_hdr - "GL_KHR_texture_compression_astc_hdr", -#endif -#ifdef GL_KHR_texture_compression_astc_ldr - "GL_KHR_texture_compression_astc_ldr", -#endif -#ifdef GL_KHR_texture_compression_astc_sliced_3d - "GL_KHR_texture_compression_astc_sliced_3d", -#endif -#ifdef GL_KTX_buffer_region - "GL_KTX_buffer_region", -#endif -#ifdef GL_MESAX_texture_stack - "GL_MESAX_texture_stack", -#endif -#ifdef GL_MESA_framebuffer_flip_y - "GL_MESA_framebuffer_flip_y", -#endif -#ifdef GL_MESA_pack_invert - "GL_MESA_pack_invert", -#endif -#ifdef GL_MESA_program_binary_formats - "GL_MESA_program_binary_formats", -#endif -#ifdef GL_MESA_resize_buffers - "GL_MESA_resize_buffers", -#endif -#ifdef GL_MESA_shader_integer_functions - "GL_MESA_shader_integer_functions", -#endif -#ifdef GL_MESA_tile_raster_order - "GL_MESA_tile_raster_order", -#endif -#ifdef GL_MESA_window_pos - "GL_MESA_window_pos", -#endif -#ifdef GL_MESA_ycbcr_texture - "GL_MESA_ycbcr_texture", -#endif -#ifdef GL_NVX_blend_equation_advanced_multi_draw_buffers - "GL_NVX_blend_equation_advanced_multi_draw_buffers", -#endif -#ifdef GL_NVX_conditional_render - "GL_NVX_conditional_render", -#endif -#ifdef GL_NVX_gpu_memory_info - "GL_NVX_gpu_memory_info", -#endif -#ifdef GL_NVX_gpu_multicast2 - "GL_NVX_gpu_multicast2", -#endif -#ifdef GL_NVX_linked_gpu_multicast - "GL_NVX_linked_gpu_multicast", -#endif -#ifdef GL_NVX_progress_fence - "GL_NVX_progress_fence", -#endif -#ifdef GL_NV_3dvision_settings - "GL_NV_3dvision_settings", -#endif -#ifdef GL_NV_EGL_stream_consumer_external - "GL_NV_EGL_stream_consumer_external", -#endif -#ifdef GL_NV_alpha_to_coverage_dither_control - "GL_NV_alpha_to_coverage_dither_control", -#endif -#ifdef GL_NV_bgr - "GL_NV_bgr", -#endif -#ifdef GL_NV_bindless_multi_draw_indirect - "GL_NV_bindless_multi_draw_indirect", -#endif -#ifdef GL_NV_bindless_multi_draw_indirect_count - "GL_NV_bindless_multi_draw_indirect_count", -#endif -#ifdef GL_NV_bindless_texture - "GL_NV_bindless_texture", -#endif -#ifdef GL_NV_blend_equation_advanced - "GL_NV_blend_equation_advanced", -#endif -#ifdef GL_NV_blend_equation_advanced_coherent - "GL_NV_blend_equation_advanced_coherent", -#endif -#ifdef GL_NV_blend_minmax_factor - "GL_NV_blend_minmax_factor", -#endif -#ifdef GL_NV_blend_square - "GL_NV_blend_square", -#endif -#ifdef GL_NV_clip_space_w_scaling - "GL_NV_clip_space_w_scaling", -#endif -#ifdef GL_NV_command_list - "GL_NV_command_list", -#endif -#ifdef GL_NV_compute_program5 - "GL_NV_compute_program5", -#endif -#ifdef GL_NV_compute_shader_derivatives - "GL_NV_compute_shader_derivatives", -#endif -#ifdef GL_NV_conditional_render - "GL_NV_conditional_render", -#endif -#ifdef GL_NV_conservative_raster - "GL_NV_conservative_raster", -#endif -#ifdef GL_NV_conservative_raster_dilate - "GL_NV_conservative_raster_dilate", -#endif -#ifdef GL_NV_conservative_raster_pre_snap - "GL_NV_conservative_raster_pre_snap", -#endif -#ifdef GL_NV_conservative_raster_pre_snap_triangles - "GL_NV_conservative_raster_pre_snap_triangles", -#endif -#ifdef GL_NV_conservative_raster_underestimation - "GL_NV_conservative_raster_underestimation", -#endif -#ifdef GL_NV_copy_buffer - "GL_NV_copy_buffer", -#endif -#ifdef GL_NV_copy_depth_to_color - "GL_NV_copy_depth_to_color", -#endif -#ifdef GL_NV_copy_image - "GL_NV_copy_image", -#endif -#ifdef GL_NV_deep_texture3D - "GL_NV_deep_texture3D", -#endif -#ifdef GL_NV_depth_buffer_float - "GL_NV_depth_buffer_float", -#endif -#ifdef GL_NV_depth_clamp - "GL_NV_depth_clamp", -#endif -#ifdef GL_NV_depth_nonlinear - "GL_NV_depth_nonlinear", -#endif -#ifdef GL_NV_depth_range_unclamped - "GL_NV_depth_range_unclamped", -#endif -#ifdef GL_NV_draw_buffers - "GL_NV_draw_buffers", -#endif -#ifdef GL_NV_draw_instanced - "GL_NV_draw_instanced", -#endif -#ifdef GL_NV_draw_texture - "GL_NV_draw_texture", -#endif -#ifdef GL_NV_draw_vulkan_image - "GL_NV_draw_vulkan_image", -#endif -#ifdef GL_NV_evaluators - "GL_NV_evaluators", -#endif -#ifdef GL_NV_explicit_attrib_location - "GL_NV_explicit_attrib_location", -#endif -#ifdef GL_NV_explicit_multisample - "GL_NV_explicit_multisample", -#endif -#ifdef GL_NV_fbo_color_attachments - "GL_NV_fbo_color_attachments", -#endif -#ifdef GL_NV_fence - "GL_NV_fence", -#endif -#ifdef GL_NV_fill_rectangle - "GL_NV_fill_rectangle", -#endif -#ifdef GL_NV_float_buffer - "GL_NV_float_buffer", -#endif -#ifdef GL_NV_fog_distance - "GL_NV_fog_distance", -#endif -#ifdef GL_NV_fragment_coverage_to_color - "GL_NV_fragment_coverage_to_color", -#endif -#ifdef GL_NV_fragment_program - "GL_NV_fragment_program", -#endif -#ifdef GL_NV_fragment_program2 - "GL_NV_fragment_program2", -#endif -#ifdef GL_NV_fragment_program4 - "GL_NV_fragment_program4", -#endif -#ifdef GL_NV_fragment_program_option - "GL_NV_fragment_program_option", -#endif -#ifdef GL_NV_fragment_shader_barycentric - "GL_NV_fragment_shader_barycentric", -#endif -#ifdef GL_NV_fragment_shader_interlock - "GL_NV_fragment_shader_interlock", -#endif -#ifdef GL_NV_framebuffer_blit - "GL_NV_framebuffer_blit", -#endif -#ifdef GL_NV_framebuffer_mixed_samples - "GL_NV_framebuffer_mixed_samples", -#endif -#ifdef GL_NV_framebuffer_multisample - "GL_NV_framebuffer_multisample", -#endif -#ifdef GL_NV_framebuffer_multisample_coverage - "GL_NV_framebuffer_multisample_coverage", -#endif -#ifdef GL_NV_generate_mipmap_sRGB - "GL_NV_generate_mipmap_sRGB", -#endif -#ifdef GL_NV_geometry_program4 - "GL_NV_geometry_program4", -#endif -#ifdef GL_NV_geometry_shader4 - "GL_NV_geometry_shader4", -#endif -#ifdef GL_NV_geometry_shader_passthrough - "GL_NV_geometry_shader_passthrough", -#endif -#ifdef GL_NV_gpu_multicast - "GL_NV_gpu_multicast", -#endif -#ifdef GL_NV_gpu_program4 - "GL_NV_gpu_program4", -#endif -#ifdef GL_NV_gpu_program5 - "GL_NV_gpu_program5", -#endif -#ifdef GL_NV_gpu_program5_mem_extended - "GL_NV_gpu_program5_mem_extended", -#endif -#ifdef GL_NV_gpu_program_fp64 - "GL_NV_gpu_program_fp64", -#endif -#ifdef GL_NV_gpu_shader5 - "GL_NV_gpu_shader5", -#endif -#ifdef GL_NV_half_float - "GL_NV_half_float", -#endif -#ifdef GL_NV_image_formats - "GL_NV_image_formats", -#endif -#ifdef GL_NV_instanced_arrays - "GL_NV_instanced_arrays", -#endif -#ifdef GL_NV_internalformat_sample_query - "GL_NV_internalformat_sample_query", -#endif -#ifdef GL_NV_light_max_exponent - "GL_NV_light_max_exponent", -#endif -#ifdef GL_NV_memory_attachment - "GL_NV_memory_attachment", -#endif -#ifdef GL_NV_mesh_shader - "GL_NV_mesh_shader", -#endif -#ifdef GL_NV_multisample_coverage - "GL_NV_multisample_coverage", -#endif -#ifdef GL_NV_multisample_filter_hint - "GL_NV_multisample_filter_hint", -#endif -#ifdef GL_NV_non_square_matrices - "GL_NV_non_square_matrices", -#endif -#ifdef GL_NV_occlusion_query - "GL_NV_occlusion_query", -#endif -#ifdef GL_NV_pack_subimage - "GL_NV_pack_subimage", -#endif -#ifdef GL_NV_packed_depth_stencil - "GL_NV_packed_depth_stencil", -#endif -#ifdef GL_NV_packed_float - "GL_NV_packed_float", -#endif -#ifdef GL_NV_packed_float_linear - "GL_NV_packed_float_linear", -#endif -#ifdef GL_NV_parameter_buffer_object - "GL_NV_parameter_buffer_object", -#endif -#ifdef GL_NV_parameter_buffer_object2 - "GL_NV_parameter_buffer_object2", -#endif -#ifdef GL_NV_path_rendering - "GL_NV_path_rendering", -#endif -#ifdef GL_NV_path_rendering_shared_edge - "GL_NV_path_rendering_shared_edge", -#endif -#ifdef GL_NV_pixel_buffer_object - "GL_NV_pixel_buffer_object", -#endif -#ifdef GL_NV_pixel_data_range - "GL_NV_pixel_data_range", -#endif -#ifdef GL_NV_platform_binary - "GL_NV_platform_binary", -#endif -#ifdef GL_NV_point_sprite - "GL_NV_point_sprite", -#endif -#ifdef GL_NV_polygon_mode - "GL_NV_polygon_mode", -#endif -#ifdef GL_NV_present_video - "GL_NV_present_video", -#endif -#ifdef GL_NV_primitive_restart - "GL_NV_primitive_restart", -#endif -#ifdef GL_NV_query_resource_tag - "GL_NV_query_resource_tag", -#endif -#ifdef GL_NV_read_buffer - "GL_NV_read_buffer", -#endif -#ifdef GL_NV_read_buffer_front - "GL_NV_read_buffer_front", -#endif -#ifdef GL_NV_read_depth - "GL_NV_read_depth", -#endif -#ifdef GL_NV_read_depth_stencil - "GL_NV_read_depth_stencil", -#endif -#ifdef GL_NV_read_stencil - "GL_NV_read_stencil", -#endif -#ifdef GL_NV_register_combiners - "GL_NV_register_combiners", -#endif -#ifdef GL_NV_register_combiners2 - "GL_NV_register_combiners2", -#endif -#ifdef GL_NV_representative_fragment_test - "GL_NV_representative_fragment_test", -#endif -#ifdef GL_NV_robustness_video_memory_purge - "GL_NV_robustness_video_memory_purge", -#endif -#ifdef GL_NV_sRGB_formats - "GL_NV_sRGB_formats", -#endif -#ifdef GL_NV_sample_locations - "GL_NV_sample_locations", -#endif -#ifdef GL_NV_sample_mask_override_coverage - "GL_NV_sample_mask_override_coverage", -#endif -#ifdef GL_NV_scissor_exclusive - "GL_NV_scissor_exclusive", -#endif -#ifdef GL_NV_shader_atomic_counters - "GL_NV_shader_atomic_counters", -#endif -#ifdef GL_NV_shader_atomic_float - "GL_NV_shader_atomic_float", -#endif -#ifdef GL_NV_shader_atomic_float64 - "GL_NV_shader_atomic_float64", -#endif -#ifdef GL_NV_shader_atomic_fp16_vector - "GL_NV_shader_atomic_fp16_vector", -#endif -#ifdef GL_NV_shader_atomic_int64 - "GL_NV_shader_atomic_int64", -#endif -#ifdef GL_NV_shader_buffer_load - "GL_NV_shader_buffer_load", -#endif -#ifdef GL_NV_shader_noperspective_interpolation - "GL_NV_shader_noperspective_interpolation", -#endif -#ifdef GL_NV_shader_storage_buffer_object - "GL_NV_shader_storage_buffer_object", -#endif -#ifdef GL_NV_shader_subgroup_partitioned - "GL_NV_shader_subgroup_partitioned", -#endif -#ifdef GL_NV_shader_texture_footprint - "GL_NV_shader_texture_footprint", -#endif -#ifdef GL_NV_shader_thread_group - "GL_NV_shader_thread_group", -#endif -#ifdef GL_NV_shader_thread_shuffle - "GL_NV_shader_thread_shuffle", -#endif -#ifdef GL_NV_shading_rate_image - "GL_NV_shading_rate_image", -#endif -#ifdef GL_NV_shadow_samplers_array - "GL_NV_shadow_samplers_array", -#endif -#ifdef GL_NV_shadow_samplers_cube - "GL_NV_shadow_samplers_cube", -#endif -#ifdef GL_NV_stereo_view_rendering - "GL_NV_stereo_view_rendering", -#endif -#ifdef GL_NV_tessellation_program5 - "GL_NV_tessellation_program5", -#endif -#ifdef GL_NV_texgen_emboss - "GL_NV_texgen_emboss", -#endif -#ifdef GL_NV_texgen_reflection - "GL_NV_texgen_reflection", -#endif -#ifdef GL_NV_texture_array - "GL_NV_texture_array", -#endif -#ifdef GL_NV_texture_barrier - "GL_NV_texture_barrier", -#endif -#ifdef GL_NV_texture_border_clamp - "GL_NV_texture_border_clamp", -#endif -#ifdef GL_NV_texture_compression_latc - "GL_NV_texture_compression_latc", -#endif -#ifdef GL_NV_texture_compression_s3tc - "GL_NV_texture_compression_s3tc", -#endif -#ifdef GL_NV_texture_compression_s3tc_update - "GL_NV_texture_compression_s3tc_update", -#endif -#ifdef GL_NV_texture_compression_vtc - "GL_NV_texture_compression_vtc", -#endif -#ifdef GL_NV_texture_env_combine4 - "GL_NV_texture_env_combine4", -#endif -#ifdef GL_NV_texture_expand_normal - "GL_NV_texture_expand_normal", -#endif -#ifdef GL_NV_texture_multisample - "GL_NV_texture_multisample", -#endif -#ifdef GL_NV_texture_npot_2D_mipmap - "GL_NV_texture_npot_2D_mipmap", -#endif -#ifdef GL_NV_texture_rectangle - "GL_NV_texture_rectangle", -#endif -#ifdef GL_NV_texture_rectangle_compressed - "GL_NV_texture_rectangle_compressed", -#endif -#ifdef GL_NV_texture_shader - "GL_NV_texture_shader", -#endif -#ifdef GL_NV_texture_shader2 - "GL_NV_texture_shader2", -#endif -#ifdef GL_NV_texture_shader3 - "GL_NV_texture_shader3", -#endif -#ifdef GL_NV_transform_feedback - "GL_NV_transform_feedback", -#endif -#ifdef GL_NV_transform_feedback2 - "GL_NV_transform_feedback2", -#endif -#ifdef GL_NV_uniform_buffer_unified_memory - "GL_NV_uniform_buffer_unified_memory", -#endif -#ifdef GL_NV_vdpau_interop - "GL_NV_vdpau_interop", -#endif -#ifdef GL_NV_vdpau_interop2 - "GL_NV_vdpau_interop2", -#endif -#ifdef GL_NV_vertex_array_range - "GL_NV_vertex_array_range", -#endif -#ifdef GL_NV_vertex_array_range2 - "GL_NV_vertex_array_range2", -#endif -#ifdef GL_NV_vertex_attrib_integer_64bit - "GL_NV_vertex_attrib_integer_64bit", -#endif -#ifdef GL_NV_vertex_buffer_unified_memory - "GL_NV_vertex_buffer_unified_memory", -#endif -#ifdef GL_NV_vertex_program - "GL_NV_vertex_program", -#endif -#ifdef GL_NV_vertex_program1_1 - "GL_NV_vertex_program1_1", -#endif -#ifdef GL_NV_vertex_program2 - "GL_NV_vertex_program2", -#endif -#ifdef GL_NV_vertex_program2_option - "GL_NV_vertex_program2_option", -#endif -#ifdef GL_NV_vertex_program3 - "GL_NV_vertex_program3", -#endif -#ifdef GL_NV_vertex_program4 - "GL_NV_vertex_program4", -#endif -#ifdef GL_NV_video_capture - "GL_NV_video_capture", -#endif -#ifdef GL_NV_viewport_array - "GL_NV_viewport_array", -#endif -#ifdef GL_NV_viewport_array2 - "GL_NV_viewport_array2", -#endif -#ifdef GL_NV_viewport_swizzle - "GL_NV_viewport_swizzle", -#endif -#ifdef GL_OES_EGL_image - "GL_OES_EGL_image", -#endif -#ifdef GL_OES_EGL_image_external - "GL_OES_EGL_image_external", -#endif -#ifdef GL_OES_EGL_image_external_essl3 - "GL_OES_EGL_image_external_essl3", -#endif -#ifdef GL_OES_blend_equation_separate - "GL_OES_blend_equation_separate", -#endif -#ifdef GL_OES_blend_func_separate - "GL_OES_blend_func_separate", -#endif -#ifdef GL_OES_blend_subtract - "GL_OES_blend_subtract", -#endif -#ifdef GL_OES_byte_coordinates - "GL_OES_byte_coordinates", -#endif -#ifdef GL_OES_compressed_ETC1_RGB8_texture - "GL_OES_compressed_ETC1_RGB8_texture", -#endif -#ifdef GL_OES_compressed_paletted_texture - "GL_OES_compressed_paletted_texture", -#endif -#ifdef GL_OES_copy_image - "GL_OES_copy_image", -#endif -#ifdef GL_OES_depth24 - "GL_OES_depth24", -#endif -#ifdef GL_OES_depth32 - "GL_OES_depth32", -#endif -#ifdef GL_OES_depth_texture - "GL_OES_depth_texture", -#endif -#ifdef GL_OES_depth_texture_cube_map - "GL_OES_depth_texture_cube_map", -#endif -#ifdef GL_OES_draw_buffers_indexed - "GL_OES_draw_buffers_indexed", -#endif -#ifdef GL_OES_draw_texture - "GL_OES_draw_texture", -#endif -#ifdef GL_OES_element_index_uint - "GL_OES_element_index_uint", -#endif -#ifdef GL_OES_extended_matrix_palette - "GL_OES_extended_matrix_palette", -#endif -#ifdef GL_OES_fbo_render_mipmap - "GL_OES_fbo_render_mipmap", -#endif -#ifdef GL_OES_fragment_precision_high - "GL_OES_fragment_precision_high", -#endif -#ifdef GL_OES_framebuffer_object - "GL_OES_framebuffer_object", -#endif -#ifdef GL_OES_geometry_point_size - "GL_OES_geometry_point_size", -#endif -#ifdef GL_OES_geometry_shader - "GL_OES_geometry_shader", -#endif -#ifdef GL_OES_get_program_binary - "GL_OES_get_program_binary", -#endif -#ifdef GL_OES_gpu_shader5 - "GL_OES_gpu_shader5", -#endif -#ifdef GL_OES_mapbuffer - "GL_OES_mapbuffer", -#endif -#ifdef GL_OES_matrix_get - "GL_OES_matrix_get", -#endif -#ifdef GL_OES_matrix_palette - "GL_OES_matrix_palette", -#endif -#ifdef GL_OES_packed_depth_stencil - "GL_OES_packed_depth_stencil", -#endif -#ifdef GL_OES_point_size_array - "GL_OES_point_size_array", -#endif -#ifdef GL_OES_point_sprite - "GL_OES_point_sprite", -#endif -#ifdef GL_OES_read_format - "GL_OES_read_format", -#endif -#ifdef GL_OES_required_internalformat - "GL_OES_required_internalformat", -#endif -#ifdef GL_OES_rgb8_rgba8 - "GL_OES_rgb8_rgba8", -#endif -#ifdef GL_OES_sample_shading - "GL_OES_sample_shading", -#endif -#ifdef GL_OES_sample_variables - "GL_OES_sample_variables", -#endif -#ifdef GL_OES_shader_image_atomic - "GL_OES_shader_image_atomic", -#endif -#ifdef GL_OES_shader_io_blocks - "GL_OES_shader_io_blocks", -#endif -#ifdef GL_OES_shader_multisample_interpolation - "GL_OES_shader_multisample_interpolation", -#endif -#ifdef GL_OES_single_precision - "GL_OES_single_precision", -#endif -#ifdef GL_OES_standard_derivatives - "GL_OES_standard_derivatives", -#endif -#ifdef GL_OES_stencil1 - "GL_OES_stencil1", -#endif -#ifdef GL_OES_stencil4 - "GL_OES_stencil4", -#endif -#ifdef GL_OES_stencil8 - "GL_OES_stencil8", -#endif -#ifdef GL_OES_surfaceless_context - "GL_OES_surfaceless_context", -#endif -#ifdef GL_OES_tessellation_point_size - "GL_OES_tessellation_point_size", -#endif -#ifdef GL_OES_tessellation_shader - "GL_OES_tessellation_shader", -#endif -#ifdef GL_OES_texture_3D - "GL_OES_texture_3D", -#endif -#ifdef GL_OES_texture_border_clamp - "GL_OES_texture_border_clamp", -#endif -#ifdef GL_OES_texture_buffer - "GL_OES_texture_buffer", -#endif -#ifdef GL_OES_texture_compression_astc - "GL_OES_texture_compression_astc", -#endif -#ifdef GL_OES_texture_cube_map - "GL_OES_texture_cube_map", -#endif -#ifdef GL_OES_texture_cube_map_array - "GL_OES_texture_cube_map_array", -#endif -#ifdef GL_OES_texture_env_crossbar - "GL_OES_texture_env_crossbar", -#endif -#ifdef GL_OES_texture_mirrored_repeat - "GL_OES_texture_mirrored_repeat", -#endif -#ifdef GL_OES_texture_npot - "GL_OES_texture_npot", -#endif -#ifdef GL_OES_texture_stencil8 - "GL_OES_texture_stencil8", -#endif -#ifdef GL_OES_texture_storage_multisample_2d_array - "GL_OES_texture_storage_multisample_2d_array", -#endif -#ifdef GL_OES_texture_view - "GL_OES_texture_view", -#endif -#ifdef GL_OES_vertex_array_object - "GL_OES_vertex_array_object", -#endif -#ifdef GL_OES_vertex_half_float - "GL_OES_vertex_half_float", -#endif -#ifdef GL_OES_vertex_type_10_10_10_2 - "GL_OES_vertex_type_10_10_10_2", -#endif -#ifdef GL_OML_interlace - "GL_OML_interlace", -#endif -#ifdef GL_OML_resample - "GL_OML_resample", -#endif -#ifdef GL_OML_subsample - "GL_OML_subsample", -#endif -#ifdef GL_OVR_multiview - "GL_OVR_multiview", -#endif -#ifdef GL_OVR_multiview2 - "GL_OVR_multiview2", -#endif -#ifdef GL_OVR_multiview_multisampled_render_to_texture - "GL_OVR_multiview_multisampled_render_to_texture", -#endif -#ifdef GL_PGI_misc_hints - "GL_PGI_misc_hints", -#endif -#ifdef GL_PGI_vertex_hints - "GL_PGI_vertex_hints", -#endif -#ifdef GL_QCOM_YUV_texture_gather - "GL_QCOM_YUV_texture_gather", -#endif -#ifdef GL_QCOM_alpha_test - "GL_QCOM_alpha_test", -#endif -#ifdef GL_QCOM_binning_control - "GL_QCOM_binning_control", -#endif -#ifdef GL_QCOM_driver_control - "GL_QCOM_driver_control", -#endif -#ifdef GL_QCOM_extended_get - "GL_QCOM_extended_get", -#endif -#ifdef GL_QCOM_extended_get2 - "GL_QCOM_extended_get2", -#endif -#ifdef GL_QCOM_framebuffer_foveated - "GL_QCOM_framebuffer_foveated", -#endif -#ifdef GL_QCOM_perfmon_global_mode - "GL_QCOM_perfmon_global_mode", -#endif -#ifdef GL_QCOM_shader_framebuffer_fetch_noncoherent - "GL_QCOM_shader_framebuffer_fetch_noncoherent", -#endif -#ifdef GL_QCOM_shader_framebuffer_fetch_rate - "GL_QCOM_shader_framebuffer_fetch_rate", -#endif -#ifdef GL_QCOM_texture_foveated - "GL_QCOM_texture_foveated", -#endif -#ifdef GL_QCOM_texture_foveated_subsampled_layout - "GL_QCOM_texture_foveated_subsampled_layout", -#endif -#ifdef GL_QCOM_tiled_rendering - "GL_QCOM_tiled_rendering", -#endif -#ifdef GL_QCOM_writeonly_rendering - "GL_QCOM_writeonly_rendering", -#endif -#ifdef GL_REGAL_ES1_0_compatibility - "GL_REGAL_ES1_0_compatibility", -#endif -#ifdef GL_REGAL_ES1_1_compatibility - "GL_REGAL_ES1_1_compatibility", -#endif -#ifdef GL_REGAL_enable - "GL_REGAL_enable", -#endif -#ifdef GL_REGAL_error_string - "GL_REGAL_error_string", -#endif -#ifdef GL_REGAL_extension_query - "GL_REGAL_extension_query", -#endif -#ifdef GL_REGAL_log - "GL_REGAL_log", -#endif -#ifdef GL_REGAL_proc_address - "GL_REGAL_proc_address", -#endif -#ifdef GL_REND_screen_coordinates - "GL_REND_screen_coordinates", -#endif -#ifdef GL_S3_s3tc - "GL_S3_s3tc", -#endif -#ifdef GL_SGIS_clip_band_hint - "GL_SGIS_clip_band_hint", -#endif -#ifdef GL_SGIS_color_range - "GL_SGIS_color_range", -#endif -#ifdef GL_SGIS_detail_texture - "GL_SGIS_detail_texture", -#endif -#ifdef GL_SGIS_fog_function - "GL_SGIS_fog_function", -#endif -#ifdef GL_SGIS_generate_mipmap - "GL_SGIS_generate_mipmap", -#endif -#ifdef GL_SGIS_line_texgen - "GL_SGIS_line_texgen", -#endif -#ifdef GL_SGIS_multisample - "GL_SGIS_multisample", -#endif -#ifdef GL_SGIS_multitexture - "GL_SGIS_multitexture", -#endif -#ifdef GL_SGIS_pixel_texture - "GL_SGIS_pixel_texture", -#endif -#ifdef GL_SGIS_point_line_texgen - "GL_SGIS_point_line_texgen", -#endif -#ifdef GL_SGIS_shared_multisample - "GL_SGIS_shared_multisample", -#endif -#ifdef GL_SGIS_sharpen_texture - "GL_SGIS_sharpen_texture", -#endif -#ifdef GL_SGIS_texture4D - "GL_SGIS_texture4D", -#endif -#ifdef GL_SGIS_texture_border_clamp - "GL_SGIS_texture_border_clamp", -#endif -#ifdef GL_SGIS_texture_edge_clamp - "GL_SGIS_texture_edge_clamp", -#endif -#ifdef GL_SGIS_texture_filter4 - "GL_SGIS_texture_filter4", -#endif -#ifdef GL_SGIS_texture_lod - "GL_SGIS_texture_lod", -#endif -#ifdef GL_SGIS_texture_select - "GL_SGIS_texture_select", -#endif -#ifdef GL_SGIX_async - "GL_SGIX_async", -#endif -#ifdef GL_SGIX_async_histogram - "GL_SGIX_async_histogram", -#endif -#ifdef GL_SGIX_async_pixel - "GL_SGIX_async_pixel", -#endif -#ifdef GL_SGIX_bali_g_instruments - "GL_SGIX_bali_g_instruments", -#endif -#ifdef GL_SGIX_bali_r_instruments - "GL_SGIX_bali_r_instruments", -#endif -#ifdef GL_SGIX_bali_timer_instruments - "GL_SGIX_bali_timer_instruments", -#endif -#ifdef GL_SGIX_blend_alpha_minmax - "GL_SGIX_blend_alpha_minmax", -#endif -#ifdef GL_SGIX_blend_cadd - "GL_SGIX_blend_cadd", -#endif -#ifdef GL_SGIX_blend_cmultiply - "GL_SGIX_blend_cmultiply", -#endif -#ifdef GL_SGIX_calligraphic_fragment - "GL_SGIX_calligraphic_fragment", -#endif -#ifdef GL_SGIX_clipmap - "GL_SGIX_clipmap", -#endif -#ifdef GL_SGIX_color_matrix_accuracy - "GL_SGIX_color_matrix_accuracy", -#endif -#ifdef GL_SGIX_color_table_index_mode - "GL_SGIX_color_table_index_mode", -#endif -#ifdef GL_SGIX_complex_polar - "GL_SGIX_complex_polar", -#endif -#ifdef GL_SGIX_convolution_accuracy - "GL_SGIX_convolution_accuracy", -#endif -#ifdef GL_SGIX_cube_map - "GL_SGIX_cube_map", -#endif -#ifdef GL_SGIX_cylinder_texgen - "GL_SGIX_cylinder_texgen", -#endif -#ifdef GL_SGIX_datapipe - "GL_SGIX_datapipe", -#endif -#ifdef GL_SGIX_decimation - "GL_SGIX_decimation", -#endif -#ifdef GL_SGIX_depth_pass_instrument - "GL_SGIX_depth_pass_instrument", -#endif -#ifdef GL_SGIX_depth_texture - "GL_SGIX_depth_texture", -#endif -#ifdef GL_SGIX_dvc - "GL_SGIX_dvc", -#endif -#ifdef GL_SGIX_flush_raster - "GL_SGIX_flush_raster", -#endif -#ifdef GL_SGIX_fog_blend - "GL_SGIX_fog_blend", -#endif -#ifdef GL_SGIX_fog_factor_to_alpha - "GL_SGIX_fog_factor_to_alpha", -#endif -#ifdef GL_SGIX_fog_layers - "GL_SGIX_fog_layers", -#endif -#ifdef GL_SGIX_fog_offset - "GL_SGIX_fog_offset", -#endif -#ifdef GL_SGIX_fog_patchy - "GL_SGIX_fog_patchy", -#endif -#ifdef GL_SGIX_fog_scale - "GL_SGIX_fog_scale", -#endif -#ifdef GL_SGIX_fog_texture - "GL_SGIX_fog_texture", -#endif -#ifdef GL_SGIX_fragment_lighting_space - "GL_SGIX_fragment_lighting_space", -#endif -#ifdef GL_SGIX_fragment_specular_lighting - "GL_SGIX_fragment_specular_lighting", -#endif -#ifdef GL_SGIX_fragments_instrument - "GL_SGIX_fragments_instrument", -#endif -#ifdef GL_SGIX_framezoom - "GL_SGIX_framezoom", -#endif -#ifdef GL_SGIX_icc_texture - "GL_SGIX_icc_texture", -#endif -#ifdef GL_SGIX_igloo_interface - "GL_SGIX_igloo_interface", -#endif -#ifdef GL_SGIX_image_compression - "GL_SGIX_image_compression", -#endif -#ifdef GL_SGIX_impact_pixel_texture - "GL_SGIX_impact_pixel_texture", -#endif -#ifdef GL_SGIX_instrument_error - "GL_SGIX_instrument_error", -#endif -#ifdef GL_SGIX_interlace - "GL_SGIX_interlace", -#endif -#ifdef GL_SGIX_ir_instrument1 - "GL_SGIX_ir_instrument1", -#endif -#ifdef GL_SGIX_line_quality_hint - "GL_SGIX_line_quality_hint", -#endif -#ifdef GL_SGIX_list_priority - "GL_SGIX_list_priority", -#endif -#ifdef GL_SGIX_mpeg1 - "GL_SGIX_mpeg1", -#endif -#ifdef GL_SGIX_mpeg2 - "GL_SGIX_mpeg2", -#endif -#ifdef GL_SGIX_nonlinear_lighting_pervertex - "GL_SGIX_nonlinear_lighting_pervertex", -#endif -#ifdef GL_SGIX_nurbs_eval - "GL_SGIX_nurbs_eval", -#endif -#ifdef GL_SGIX_occlusion_instrument - "GL_SGIX_occlusion_instrument", -#endif -#ifdef GL_SGIX_packed_6bytes - "GL_SGIX_packed_6bytes", -#endif -#ifdef GL_SGIX_pixel_texture - "GL_SGIX_pixel_texture", -#endif -#ifdef GL_SGIX_pixel_texture_bits - "GL_SGIX_pixel_texture_bits", -#endif -#ifdef GL_SGIX_pixel_texture_lod - "GL_SGIX_pixel_texture_lod", -#endif -#ifdef GL_SGIX_pixel_tiles - "GL_SGIX_pixel_tiles", -#endif -#ifdef GL_SGIX_polynomial_ffd - "GL_SGIX_polynomial_ffd", -#endif -#ifdef GL_SGIX_quad_mesh - "GL_SGIX_quad_mesh", -#endif -#ifdef GL_SGIX_reference_plane - "GL_SGIX_reference_plane", -#endif -#ifdef GL_SGIX_resample - "GL_SGIX_resample", -#endif -#ifdef GL_SGIX_scalebias_hint - "GL_SGIX_scalebias_hint", -#endif -#ifdef GL_SGIX_shadow - "GL_SGIX_shadow", -#endif -#ifdef GL_SGIX_shadow_ambient - "GL_SGIX_shadow_ambient", -#endif -#ifdef GL_SGIX_slim - "GL_SGIX_slim", -#endif -#ifdef GL_SGIX_spotlight_cutoff - "GL_SGIX_spotlight_cutoff", -#endif -#ifdef GL_SGIX_sprite - "GL_SGIX_sprite", -#endif -#ifdef GL_SGIX_subdiv_patch - "GL_SGIX_subdiv_patch", -#endif -#ifdef GL_SGIX_subsample - "GL_SGIX_subsample", -#endif -#ifdef GL_SGIX_tag_sample_buffer - "GL_SGIX_tag_sample_buffer", -#endif -#ifdef GL_SGIX_texture_add_env - "GL_SGIX_texture_add_env", -#endif -#ifdef GL_SGIX_texture_coordinate_clamp - "GL_SGIX_texture_coordinate_clamp", -#endif -#ifdef GL_SGIX_texture_lod_bias - "GL_SGIX_texture_lod_bias", -#endif -#ifdef GL_SGIX_texture_mipmap_anisotropic - "GL_SGIX_texture_mipmap_anisotropic", -#endif -#ifdef GL_SGIX_texture_multi_buffer - "GL_SGIX_texture_multi_buffer", -#endif -#ifdef GL_SGIX_texture_phase - "GL_SGIX_texture_phase", -#endif -#ifdef GL_SGIX_texture_range - "GL_SGIX_texture_range", -#endif -#ifdef GL_SGIX_texture_scale_bias - "GL_SGIX_texture_scale_bias", -#endif -#ifdef GL_SGIX_texture_supersample - "GL_SGIX_texture_supersample", -#endif -#ifdef GL_SGIX_vector_ops - "GL_SGIX_vector_ops", -#endif -#ifdef GL_SGIX_vertex_array_object - "GL_SGIX_vertex_array_object", -#endif -#ifdef GL_SGIX_vertex_preclip - "GL_SGIX_vertex_preclip", -#endif -#ifdef GL_SGIX_vertex_preclip_hint - "GL_SGIX_vertex_preclip_hint", -#endif -#ifdef GL_SGIX_ycrcb - "GL_SGIX_ycrcb", -#endif -#ifdef GL_SGIX_ycrcb_subsample - "GL_SGIX_ycrcb_subsample", -#endif -#ifdef GL_SGIX_ycrcba - "GL_SGIX_ycrcba", -#endif -#ifdef GL_SGI_color_matrix - "GL_SGI_color_matrix", -#endif -#ifdef GL_SGI_color_table - "GL_SGI_color_table", -#endif -#ifdef GL_SGI_complex - "GL_SGI_complex", -#endif -#ifdef GL_SGI_complex_type - "GL_SGI_complex_type", -#endif -#ifdef GL_SGI_fft - "GL_SGI_fft", -#endif -#ifdef GL_SGI_texture_color_table - "GL_SGI_texture_color_table", -#endif -#ifdef GL_SUNX_constant_data - "GL_SUNX_constant_data", -#endif -#ifdef GL_SUN_convolution_border_modes - "GL_SUN_convolution_border_modes", -#endif -#ifdef GL_SUN_global_alpha - "GL_SUN_global_alpha", -#endif -#ifdef GL_SUN_mesh_array - "GL_SUN_mesh_array", -#endif -#ifdef GL_SUN_read_video_pixels - "GL_SUN_read_video_pixels", -#endif -#ifdef GL_SUN_slice_accum - "GL_SUN_slice_accum", -#endif -#ifdef GL_SUN_triangle_list - "GL_SUN_triangle_list", -#endif -#ifdef GL_SUN_vertex - "GL_SUN_vertex", -#endif -#ifdef GL_VERSION_1_2 - "GL_VERSION_1_2", -#endif -#ifdef GL_VERSION_1_2_1 - "GL_VERSION_1_2_1", -#endif -#ifdef GL_VERSION_1_3 - "GL_VERSION_1_3", -#endif -#ifdef GL_VERSION_1_4 - "GL_VERSION_1_4", -#endif -#ifdef GL_VERSION_1_5 - "GL_VERSION_1_5", -#endif -#ifdef GL_VERSION_2_0 - "GL_VERSION_2_0", -#endif -#ifdef GL_VERSION_2_1 - "GL_VERSION_2_1", -#endif -#ifdef GL_VERSION_3_0 - "GL_VERSION_3_0", -#endif -#ifdef GL_VERSION_3_1 - "GL_VERSION_3_1", -#endif -#ifdef GL_VERSION_3_2 - "GL_VERSION_3_2", -#endif -#ifdef GL_VERSION_3_3 - "GL_VERSION_3_3", -#endif -#ifdef GL_VERSION_4_0 - "GL_VERSION_4_0", -#endif -#ifdef GL_VERSION_4_1 - "GL_VERSION_4_1", -#endif -#ifdef GL_VERSION_4_2 - "GL_VERSION_4_2", -#endif -#ifdef GL_VERSION_4_3 - "GL_VERSION_4_3", -#endif -#ifdef GL_VERSION_4_4 - "GL_VERSION_4_4", -#endif -#ifdef GL_VERSION_4_5 - "GL_VERSION_4_5", -#endif -#ifdef GL_VERSION_4_6 - "GL_VERSION_4_6", -#endif -#ifdef GL_VIV_shader_binary - "GL_VIV_shader_binary", -#endif -#ifdef GL_WIN_phong_shading - "GL_WIN_phong_shading", -#endif -#ifdef GL_WIN_scene_markerXXX - "GL_WIN_scene_markerXXX", -#endif -#ifdef GL_WIN_specular_fog - "GL_WIN_specular_fog", -#endif -#ifdef GL_WIN_swap_hint - "GL_WIN_swap_hint", -#endif - NULL -}; - - -/* Detected in the extension string or strings */ -static GLboolean _glewExtensionString[931]; -/* Detected via extension string or experimental mode */ -static GLboolean* _glewExtensionEnabled[] = { -#ifdef GL_3DFX_multisample - &__GLEW_3DFX_multisample, -#endif -#ifdef GL_3DFX_tbuffer - &__GLEW_3DFX_tbuffer, -#endif -#ifdef GL_3DFX_texture_compression_FXT1 - &__GLEW_3DFX_texture_compression_FXT1, -#endif -#ifdef GL_AMD_blend_minmax_factor - &__GLEW_AMD_blend_minmax_factor, -#endif -#ifdef GL_AMD_compressed_3DC_texture - &__GLEW_AMD_compressed_3DC_texture, -#endif -#ifdef GL_AMD_compressed_ATC_texture - &__GLEW_AMD_compressed_ATC_texture, -#endif -#ifdef GL_AMD_conservative_depth - &__GLEW_AMD_conservative_depth, -#endif -#ifdef GL_AMD_debug_output - &__GLEW_AMD_debug_output, -#endif -#ifdef GL_AMD_depth_clamp_separate - &__GLEW_AMD_depth_clamp_separate, -#endif -#ifdef GL_AMD_draw_buffers_blend - &__GLEW_AMD_draw_buffers_blend, -#endif -#ifdef GL_AMD_framebuffer_multisample_advanced - &__GLEW_AMD_framebuffer_multisample_advanced, -#endif -#ifdef GL_AMD_framebuffer_sample_positions - &__GLEW_AMD_framebuffer_sample_positions, -#endif -#ifdef GL_AMD_gcn_shader - &__GLEW_AMD_gcn_shader, -#endif -#ifdef GL_AMD_gpu_shader_half_float - &__GLEW_AMD_gpu_shader_half_float, -#endif -#ifdef GL_AMD_gpu_shader_half_float_fetch - &__GLEW_AMD_gpu_shader_half_float_fetch, -#endif -#ifdef GL_AMD_gpu_shader_int16 - &__GLEW_AMD_gpu_shader_int16, -#endif -#ifdef GL_AMD_gpu_shader_int64 - &__GLEW_AMD_gpu_shader_int64, -#endif -#ifdef GL_AMD_interleaved_elements - &__GLEW_AMD_interleaved_elements, -#endif -#ifdef GL_AMD_multi_draw_indirect - &__GLEW_AMD_multi_draw_indirect, -#endif -#ifdef GL_AMD_name_gen_delete - &__GLEW_AMD_name_gen_delete, -#endif -#ifdef GL_AMD_occlusion_query_event - &__GLEW_AMD_occlusion_query_event, -#endif -#ifdef GL_AMD_performance_monitor - &__GLEW_AMD_performance_monitor, -#endif -#ifdef GL_AMD_pinned_memory - &__GLEW_AMD_pinned_memory, -#endif -#ifdef GL_AMD_program_binary_Z400 - &__GLEW_AMD_program_binary_Z400, -#endif -#ifdef GL_AMD_query_buffer_object - &__GLEW_AMD_query_buffer_object, -#endif -#ifdef GL_AMD_sample_positions - &__GLEW_AMD_sample_positions, -#endif -#ifdef GL_AMD_seamless_cubemap_per_texture - &__GLEW_AMD_seamless_cubemap_per_texture, -#endif -#ifdef GL_AMD_shader_atomic_counter_ops - &__GLEW_AMD_shader_atomic_counter_ops, -#endif -#ifdef GL_AMD_shader_ballot - &__GLEW_AMD_shader_ballot, -#endif -#ifdef GL_AMD_shader_explicit_vertex_parameter - &__GLEW_AMD_shader_explicit_vertex_parameter, -#endif -#ifdef GL_AMD_shader_image_load_store_lod - &__GLEW_AMD_shader_image_load_store_lod, -#endif -#ifdef GL_AMD_shader_stencil_export - &__GLEW_AMD_shader_stencil_export, -#endif -#ifdef GL_AMD_shader_stencil_value_export - &__GLEW_AMD_shader_stencil_value_export, -#endif -#ifdef GL_AMD_shader_trinary_minmax - &__GLEW_AMD_shader_trinary_minmax, -#endif -#ifdef GL_AMD_sparse_texture - &__GLEW_AMD_sparse_texture, -#endif -#ifdef GL_AMD_stencil_operation_extended - &__GLEW_AMD_stencil_operation_extended, -#endif -#ifdef GL_AMD_texture_gather_bias_lod - &__GLEW_AMD_texture_gather_bias_lod, -#endif -#ifdef GL_AMD_texture_texture4 - &__GLEW_AMD_texture_texture4, -#endif -#ifdef GL_AMD_transform_feedback3_lines_triangles - &__GLEW_AMD_transform_feedback3_lines_triangles, -#endif -#ifdef GL_AMD_transform_feedback4 - &__GLEW_AMD_transform_feedback4, -#endif -#ifdef GL_AMD_vertex_shader_layer - &__GLEW_AMD_vertex_shader_layer, -#endif -#ifdef GL_AMD_vertex_shader_tessellator - &__GLEW_AMD_vertex_shader_tessellator, -#endif -#ifdef GL_AMD_vertex_shader_viewport_index - &__GLEW_AMD_vertex_shader_viewport_index, -#endif -#ifdef GL_ANDROID_extension_pack_es31a - &__GLEW_ANDROID_extension_pack_es31a, -#endif -#ifdef GL_ANGLE_depth_texture - &__GLEW_ANGLE_depth_texture, -#endif -#ifdef GL_ANGLE_framebuffer_blit - &__GLEW_ANGLE_framebuffer_blit, -#endif -#ifdef GL_ANGLE_framebuffer_multisample - &__GLEW_ANGLE_framebuffer_multisample, -#endif -#ifdef GL_ANGLE_instanced_arrays - &__GLEW_ANGLE_instanced_arrays, -#endif -#ifdef GL_ANGLE_pack_reverse_row_order - &__GLEW_ANGLE_pack_reverse_row_order, -#endif -#ifdef GL_ANGLE_program_binary - &__GLEW_ANGLE_program_binary, -#endif -#ifdef GL_ANGLE_texture_compression_dxt1 - &__GLEW_ANGLE_texture_compression_dxt1, -#endif -#ifdef GL_ANGLE_texture_compression_dxt3 - &__GLEW_ANGLE_texture_compression_dxt3, -#endif -#ifdef GL_ANGLE_texture_compression_dxt5 - &__GLEW_ANGLE_texture_compression_dxt5, -#endif -#ifdef GL_ANGLE_texture_usage - &__GLEW_ANGLE_texture_usage, -#endif -#ifdef GL_ANGLE_timer_query - &__GLEW_ANGLE_timer_query, -#endif -#ifdef GL_ANGLE_translated_shader_source - &__GLEW_ANGLE_translated_shader_source, -#endif -#ifdef GL_APPLE_aux_depth_stencil - &__GLEW_APPLE_aux_depth_stencil, -#endif -#ifdef GL_APPLE_client_storage - &__GLEW_APPLE_client_storage, -#endif -#ifdef GL_APPLE_clip_distance - &__GLEW_APPLE_clip_distance, -#endif -#ifdef GL_APPLE_color_buffer_packed_float - &__GLEW_APPLE_color_buffer_packed_float, -#endif -#ifdef GL_APPLE_copy_texture_levels - &__GLEW_APPLE_copy_texture_levels, -#endif -#ifdef GL_APPLE_element_array - &__GLEW_APPLE_element_array, -#endif -#ifdef GL_APPLE_fence - &__GLEW_APPLE_fence, -#endif -#ifdef GL_APPLE_float_pixels - &__GLEW_APPLE_float_pixels, -#endif -#ifdef GL_APPLE_flush_buffer_range - &__GLEW_APPLE_flush_buffer_range, -#endif -#ifdef GL_APPLE_framebuffer_multisample - &__GLEW_APPLE_framebuffer_multisample, -#endif -#ifdef GL_APPLE_object_purgeable - &__GLEW_APPLE_object_purgeable, -#endif -#ifdef GL_APPLE_pixel_buffer - &__GLEW_APPLE_pixel_buffer, -#endif -#ifdef GL_APPLE_rgb_422 - &__GLEW_APPLE_rgb_422, -#endif -#ifdef GL_APPLE_row_bytes - &__GLEW_APPLE_row_bytes, -#endif -#ifdef GL_APPLE_specular_vector - &__GLEW_APPLE_specular_vector, -#endif -#ifdef GL_APPLE_sync - &__GLEW_APPLE_sync, -#endif -#ifdef GL_APPLE_texture_2D_limited_npot - &__GLEW_APPLE_texture_2D_limited_npot, -#endif -#ifdef GL_APPLE_texture_format_BGRA8888 - &__GLEW_APPLE_texture_format_BGRA8888, -#endif -#ifdef GL_APPLE_texture_max_level - &__GLEW_APPLE_texture_max_level, -#endif -#ifdef GL_APPLE_texture_packed_float - &__GLEW_APPLE_texture_packed_float, -#endif -#ifdef GL_APPLE_texture_range - &__GLEW_APPLE_texture_range, -#endif -#ifdef GL_APPLE_transform_hint - &__GLEW_APPLE_transform_hint, -#endif -#ifdef GL_APPLE_vertex_array_object - &__GLEW_APPLE_vertex_array_object, -#endif -#ifdef GL_APPLE_vertex_array_range - &__GLEW_APPLE_vertex_array_range, -#endif -#ifdef GL_APPLE_vertex_program_evaluators - &__GLEW_APPLE_vertex_program_evaluators, -#endif -#ifdef GL_APPLE_ycbcr_422 - &__GLEW_APPLE_ycbcr_422, -#endif -#ifdef GL_ARB_ES2_compatibility - &__GLEW_ARB_ES2_compatibility, -#endif -#ifdef GL_ARB_ES3_1_compatibility - &__GLEW_ARB_ES3_1_compatibility, -#endif -#ifdef GL_ARB_ES3_2_compatibility - &__GLEW_ARB_ES3_2_compatibility, -#endif -#ifdef GL_ARB_ES3_compatibility - &__GLEW_ARB_ES3_compatibility, -#endif -#ifdef GL_ARB_arrays_of_arrays - &__GLEW_ARB_arrays_of_arrays, -#endif -#ifdef GL_ARB_base_instance - &__GLEW_ARB_base_instance, -#endif -#ifdef GL_ARB_bindless_texture - &__GLEW_ARB_bindless_texture, -#endif -#ifdef GL_ARB_blend_func_extended - &__GLEW_ARB_blend_func_extended, -#endif -#ifdef GL_ARB_buffer_storage - &__GLEW_ARB_buffer_storage, -#endif -#ifdef GL_ARB_cl_event - &__GLEW_ARB_cl_event, -#endif -#ifdef GL_ARB_clear_buffer_object - &__GLEW_ARB_clear_buffer_object, -#endif -#ifdef GL_ARB_clear_texture - &__GLEW_ARB_clear_texture, -#endif -#ifdef GL_ARB_clip_control - &__GLEW_ARB_clip_control, -#endif -#ifdef GL_ARB_color_buffer_float - &__GLEW_ARB_color_buffer_float, -#endif -#ifdef GL_ARB_compatibility - &__GLEW_ARB_compatibility, -#endif -#ifdef GL_ARB_compressed_texture_pixel_storage - &__GLEW_ARB_compressed_texture_pixel_storage, -#endif -#ifdef GL_ARB_compute_shader - &__GLEW_ARB_compute_shader, -#endif -#ifdef GL_ARB_compute_variable_group_size - &__GLEW_ARB_compute_variable_group_size, -#endif -#ifdef GL_ARB_conditional_render_inverted - &__GLEW_ARB_conditional_render_inverted, -#endif -#ifdef GL_ARB_conservative_depth - &__GLEW_ARB_conservative_depth, -#endif -#ifdef GL_ARB_copy_buffer - &__GLEW_ARB_copy_buffer, -#endif -#ifdef GL_ARB_copy_image - &__GLEW_ARB_copy_image, -#endif -#ifdef GL_ARB_cull_distance - &__GLEW_ARB_cull_distance, -#endif -#ifdef GL_ARB_debug_output - &__GLEW_ARB_debug_output, -#endif -#ifdef GL_ARB_depth_buffer_float - &__GLEW_ARB_depth_buffer_float, -#endif -#ifdef GL_ARB_depth_clamp - &__GLEW_ARB_depth_clamp, -#endif -#ifdef GL_ARB_depth_texture - &__GLEW_ARB_depth_texture, -#endif -#ifdef GL_ARB_derivative_control - &__GLEW_ARB_derivative_control, -#endif -#ifdef GL_ARB_direct_state_access - &__GLEW_ARB_direct_state_access, -#endif -#ifdef GL_ARB_draw_buffers - &__GLEW_ARB_draw_buffers, -#endif -#ifdef GL_ARB_draw_buffers_blend - &__GLEW_ARB_draw_buffers_blend, -#endif -#ifdef GL_ARB_draw_elements_base_vertex - &__GLEW_ARB_draw_elements_base_vertex, -#endif -#ifdef GL_ARB_draw_indirect - &__GLEW_ARB_draw_indirect, -#endif -#ifdef GL_ARB_draw_instanced - &__GLEW_ARB_draw_instanced, -#endif -#ifdef GL_ARB_enhanced_layouts - &__GLEW_ARB_enhanced_layouts, -#endif -#ifdef GL_ARB_explicit_attrib_location - &__GLEW_ARB_explicit_attrib_location, -#endif -#ifdef GL_ARB_explicit_uniform_location - &__GLEW_ARB_explicit_uniform_location, -#endif -#ifdef GL_ARB_fragment_coord_conventions - &__GLEW_ARB_fragment_coord_conventions, -#endif -#ifdef GL_ARB_fragment_layer_viewport - &__GLEW_ARB_fragment_layer_viewport, -#endif -#ifdef GL_ARB_fragment_program - &__GLEW_ARB_fragment_program, -#endif -#ifdef GL_ARB_fragment_program_shadow - &__GLEW_ARB_fragment_program_shadow, -#endif -#ifdef GL_ARB_fragment_shader - &__GLEW_ARB_fragment_shader, -#endif -#ifdef GL_ARB_fragment_shader_interlock - &__GLEW_ARB_fragment_shader_interlock, -#endif -#ifdef GL_ARB_framebuffer_no_attachments - &__GLEW_ARB_framebuffer_no_attachments, -#endif -#ifdef GL_ARB_framebuffer_object - &__GLEW_ARB_framebuffer_object, -#endif -#ifdef GL_ARB_framebuffer_sRGB - &__GLEW_ARB_framebuffer_sRGB, -#endif -#ifdef GL_ARB_geometry_shader4 - &__GLEW_ARB_geometry_shader4, -#endif -#ifdef GL_ARB_get_program_binary - &__GLEW_ARB_get_program_binary, -#endif -#ifdef GL_ARB_get_texture_sub_image - &__GLEW_ARB_get_texture_sub_image, -#endif -#ifdef GL_ARB_gl_spirv - &__GLEW_ARB_gl_spirv, -#endif -#ifdef GL_ARB_gpu_shader5 - &__GLEW_ARB_gpu_shader5, -#endif -#ifdef GL_ARB_gpu_shader_fp64 - &__GLEW_ARB_gpu_shader_fp64, -#endif -#ifdef GL_ARB_gpu_shader_int64 - &__GLEW_ARB_gpu_shader_int64, -#endif -#ifdef GL_ARB_half_float_pixel - &__GLEW_ARB_half_float_pixel, -#endif -#ifdef GL_ARB_half_float_vertex - &__GLEW_ARB_half_float_vertex, -#endif -#ifdef GL_ARB_imaging - &__GLEW_ARB_imaging, -#endif -#ifdef GL_ARB_indirect_parameters - &__GLEW_ARB_indirect_parameters, -#endif -#ifdef GL_ARB_instanced_arrays - &__GLEW_ARB_instanced_arrays, -#endif -#ifdef GL_ARB_internalformat_query - &__GLEW_ARB_internalformat_query, -#endif -#ifdef GL_ARB_internalformat_query2 - &__GLEW_ARB_internalformat_query2, -#endif -#ifdef GL_ARB_invalidate_subdata - &__GLEW_ARB_invalidate_subdata, -#endif -#ifdef GL_ARB_map_buffer_alignment - &__GLEW_ARB_map_buffer_alignment, -#endif -#ifdef GL_ARB_map_buffer_range - &__GLEW_ARB_map_buffer_range, -#endif -#ifdef GL_ARB_matrix_palette - &__GLEW_ARB_matrix_palette, -#endif -#ifdef GL_ARB_multi_bind - &__GLEW_ARB_multi_bind, -#endif -#ifdef GL_ARB_multi_draw_indirect - &__GLEW_ARB_multi_draw_indirect, -#endif -#ifdef GL_ARB_multisample - &__GLEW_ARB_multisample, -#endif -#ifdef GL_ARB_multitexture - &__GLEW_ARB_multitexture, -#endif -#ifdef GL_ARB_occlusion_query - &__GLEW_ARB_occlusion_query, -#endif -#ifdef GL_ARB_occlusion_query2 - &__GLEW_ARB_occlusion_query2, -#endif -#ifdef GL_ARB_parallel_shader_compile - &__GLEW_ARB_parallel_shader_compile, -#endif -#ifdef GL_ARB_pipeline_statistics_query - &__GLEW_ARB_pipeline_statistics_query, -#endif -#ifdef GL_ARB_pixel_buffer_object - &__GLEW_ARB_pixel_buffer_object, -#endif -#ifdef GL_ARB_point_parameters - &__GLEW_ARB_point_parameters, -#endif -#ifdef GL_ARB_point_sprite - &__GLEW_ARB_point_sprite, -#endif -#ifdef GL_ARB_polygon_offset_clamp - &__GLEW_ARB_polygon_offset_clamp, -#endif -#ifdef GL_ARB_post_depth_coverage - &__GLEW_ARB_post_depth_coverage, -#endif -#ifdef GL_ARB_program_interface_query - &__GLEW_ARB_program_interface_query, -#endif -#ifdef GL_ARB_provoking_vertex - &__GLEW_ARB_provoking_vertex, -#endif -#ifdef GL_ARB_query_buffer_object - &__GLEW_ARB_query_buffer_object, -#endif -#ifdef GL_ARB_robust_buffer_access_behavior - &__GLEW_ARB_robust_buffer_access_behavior, -#endif -#ifdef GL_ARB_robustness - &__GLEW_ARB_robustness, -#endif -#ifdef GL_ARB_robustness_application_isolation - &__GLEW_ARB_robustness_application_isolation, -#endif -#ifdef GL_ARB_robustness_share_group_isolation - &__GLEW_ARB_robustness_share_group_isolation, -#endif -#ifdef GL_ARB_sample_locations - &__GLEW_ARB_sample_locations, -#endif -#ifdef GL_ARB_sample_shading - &__GLEW_ARB_sample_shading, -#endif -#ifdef GL_ARB_sampler_objects - &__GLEW_ARB_sampler_objects, -#endif -#ifdef GL_ARB_seamless_cube_map - &__GLEW_ARB_seamless_cube_map, -#endif -#ifdef GL_ARB_seamless_cubemap_per_texture - &__GLEW_ARB_seamless_cubemap_per_texture, -#endif -#ifdef GL_ARB_separate_shader_objects - &__GLEW_ARB_separate_shader_objects, -#endif -#ifdef GL_ARB_shader_atomic_counter_ops - &__GLEW_ARB_shader_atomic_counter_ops, -#endif -#ifdef GL_ARB_shader_atomic_counters - &__GLEW_ARB_shader_atomic_counters, -#endif -#ifdef GL_ARB_shader_ballot - &__GLEW_ARB_shader_ballot, -#endif -#ifdef GL_ARB_shader_bit_encoding - &__GLEW_ARB_shader_bit_encoding, -#endif -#ifdef GL_ARB_shader_clock - &__GLEW_ARB_shader_clock, -#endif -#ifdef GL_ARB_shader_draw_parameters - &__GLEW_ARB_shader_draw_parameters, -#endif -#ifdef GL_ARB_shader_group_vote - &__GLEW_ARB_shader_group_vote, -#endif -#ifdef GL_ARB_shader_image_load_store - &__GLEW_ARB_shader_image_load_store, -#endif -#ifdef GL_ARB_shader_image_size - &__GLEW_ARB_shader_image_size, -#endif -#ifdef GL_ARB_shader_objects - &__GLEW_ARB_shader_objects, -#endif -#ifdef GL_ARB_shader_precision - &__GLEW_ARB_shader_precision, -#endif -#ifdef GL_ARB_shader_stencil_export - &__GLEW_ARB_shader_stencil_export, -#endif -#ifdef GL_ARB_shader_storage_buffer_object - &__GLEW_ARB_shader_storage_buffer_object, -#endif -#ifdef GL_ARB_shader_subroutine - &__GLEW_ARB_shader_subroutine, -#endif -#ifdef GL_ARB_shader_texture_image_samples - &__GLEW_ARB_shader_texture_image_samples, -#endif -#ifdef GL_ARB_shader_texture_lod - &__GLEW_ARB_shader_texture_lod, -#endif -#ifdef GL_ARB_shader_viewport_layer_array - &__GLEW_ARB_shader_viewport_layer_array, -#endif -#ifdef GL_ARB_shading_language_100 - &__GLEW_ARB_shading_language_100, -#endif -#ifdef GL_ARB_shading_language_420pack - &__GLEW_ARB_shading_language_420pack, -#endif -#ifdef GL_ARB_shading_language_include - &__GLEW_ARB_shading_language_include, -#endif -#ifdef GL_ARB_shading_language_packing - &__GLEW_ARB_shading_language_packing, -#endif -#ifdef GL_ARB_shadow - &__GLEW_ARB_shadow, -#endif -#ifdef GL_ARB_shadow_ambient - &__GLEW_ARB_shadow_ambient, -#endif -#ifdef GL_ARB_sparse_buffer - &__GLEW_ARB_sparse_buffer, -#endif -#ifdef GL_ARB_sparse_texture - &__GLEW_ARB_sparse_texture, -#endif -#ifdef GL_ARB_sparse_texture2 - &__GLEW_ARB_sparse_texture2, -#endif -#ifdef GL_ARB_sparse_texture_clamp - &__GLEW_ARB_sparse_texture_clamp, -#endif -#ifdef GL_ARB_spirv_extensions - &__GLEW_ARB_spirv_extensions, -#endif -#ifdef GL_ARB_stencil_texturing - &__GLEW_ARB_stencil_texturing, -#endif -#ifdef GL_ARB_sync - &__GLEW_ARB_sync, -#endif -#ifdef GL_ARB_tessellation_shader - &__GLEW_ARB_tessellation_shader, -#endif -#ifdef GL_ARB_texture_barrier - &__GLEW_ARB_texture_barrier, -#endif -#ifdef GL_ARB_texture_border_clamp - &__GLEW_ARB_texture_border_clamp, -#endif -#ifdef GL_ARB_texture_buffer_object - &__GLEW_ARB_texture_buffer_object, -#endif -#ifdef GL_ARB_texture_buffer_object_rgb32 - &__GLEW_ARB_texture_buffer_object_rgb32, -#endif -#ifdef GL_ARB_texture_buffer_range - &__GLEW_ARB_texture_buffer_range, -#endif -#ifdef GL_ARB_texture_compression - &__GLEW_ARB_texture_compression, -#endif -#ifdef GL_ARB_texture_compression_bptc - &__GLEW_ARB_texture_compression_bptc, -#endif -#ifdef GL_ARB_texture_compression_rgtc - &__GLEW_ARB_texture_compression_rgtc, -#endif -#ifdef GL_ARB_texture_cube_map - &__GLEW_ARB_texture_cube_map, -#endif -#ifdef GL_ARB_texture_cube_map_array - &__GLEW_ARB_texture_cube_map_array, -#endif -#ifdef GL_ARB_texture_env_add - &__GLEW_ARB_texture_env_add, -#endif -#ifdef GL_ARB_texture_env_combine - &__GLEW_ARB_texture_env_combine, -#endif -#ifdef GL_ARB_texture_env_crossbar - &__GLEW_ARB_texture_env_crossbar, -#endif -#ifdef GL_ARB_texture_env_dot3 - &__GLEW_ARB_texture_env_dot3, -#endif -#ifdef GL_ARB_texture_filter_anisotropic - &__GLEW_ARB_texture_filter_anisotropic, -#endif -#ifdef GL_ARB_texture_filter_minmax - &__GLEW_ARB_texture_filter_minmax, -#endif -#ifdef GL_ARB_texture_float - &__GLEW_ARB_texture_float, -#endif -#ifdef GL_ARB_texture_gather - &__GLEW_ARB_texture_gather, -#endif -#ifdef GL_ARB_texture_mirror_clamp_to_edge - &__GLEW_ARB_texture_mirror_clamp_to_edge, -#endif -#ifdef GL_ARB_texture_mirrored_repeat - &__GLEW_ARB_texture_mirrored_repeat, -#endif -#ifdef GL_ARB_texture_multisample - &__GLEW_ARB_texture_multisample, -#endif -#ifdef GL_ARB_texture_non_power_of_two - &__GLEW_ARB_texture_non_power_of_two, -#endif -#ifdef GL_ARB_texture_query_levels - &__GLEW_ARB_texture_query_levels, -#endif -#ifdef GL_ARB_texture_query_lod - &__GLEW_ARB_texture_query_lod, -#endif -#ifdef GL_ARB_texture_rectangle - &__GLEW_ARB_texture_rectangle, -#endif -#ifdef GL_ARB_texture_rg - &__GLEW_ARB_texture_rg, -#endif -#ifdef GL_ARB_texture_rgb10_a2ui - &__GLEW_ARB_texture_rgb10_a2ui, -#endif -#ifdef GL_ARB_texture_stencil8 - &__GLEW_ARB_texture_stencil8, -#endif -#ifdef GL_ARB_texture_storage - &__GLEW_ARB_texture_storage, -#endif -#ifdef GL_ARB_texture_storage_multisample - &__GLEW_ARB_texture_storage_multisample, -#endif -#ifdef GL_ARB_texture_swizzle - &__GLEW_ARB_texture_swizzle, -#endif -#ifdef GL_ARB_texture_view - &__GLEW_ARB_texture_view, -#endif -#ifdef GL_ARB_timer_query - &__GLEW_ARB_timer_query, -#endif -#ifdef GL_ARB_transform_feedback2 - &__GLEW_ARB_transform_feedback2, -#endif -#ifdef GL_ARB_transform_feedback3 - &__GLEW_ARB_transform_feedback3, -#endif -#ifdef GL_ARB_transform_feedback_instanced - &__GLEW_ARB_transform_feedback_instanced, -#endif -#ifdef GL_ARB_transform_feedback_overflow_query - &__GLEW_ARB_transform_feedback_overflow_query, -#endif -#ifdef GL_ARB_transpose_matrix - &__GLEW_ARB_transpose_matrix, -#endif -#ifdef GL_ARB_uniform_buffer_object - &__GLEW_ARB_uniform_buffer_object, -#endif -#ifdef GL_ARB_vertex_array_bgra - &__GLEW_ARB_vertex_array_bgra, -#endif -#ifdef GL_ARB_vertex_array_object - &__GLEW_ARB_vertex_array_object, -#endif -#ifdef GL_ARB_vertex_attrib_64bit - &__GLEW_ARB_vertex_attrib_64bit, -#endif -#ifdef GL_ARB_vertex_attrib_binding - &__GLEW_ARB_vertex_attrib_binding, -#endif -#ifdef GL_ARB_vertex_blend - &__GLEW_ARB_vertex_blend, -#endif -#ifdef GL_ARB_vertex_buffer_object - &__GLEW_ARB_vertex_buffer_object, -#endif -#ifdef GL_ARB_vertex_program - &__GLEW_ARB_vertex_program, -#endif -#ifdef GL_ARB_vertex_shader - &__GLEW_ARB_vertex_shader, -#endif -#ifdef GL_ARB_vertex_type_10f_11f_11f_rev - &__GLEW_ARB_vertex_type_10f_11f_11f_rev, -#endif -#ifdef GL_ARB_vertex_type_2_10_10_10_rev - &__GLEW_ARB_vertex_type_2_10_10_10_rev, -#endif -#ifdef GL_ARB_viewport_array - &__GLEW_ARB_viewport_array, -#endif -#ifdef GL_ARB_window_pos - &__GLEW_ARB_window_pos, -#endif -#ifdef GL_ARM_mali_program_binary - &__GLEW_ARM_mali_program_binary, -#endif -#ifdef GL_ARM_mali_shader_binary - &__GLEW_ARM_mali_shader_binary, -#endif -#ifdef GL_ARM_rgba8 - &__GLEW_ARM_rgba8, -#endif -#ifdef GL_ARM_shader_framebuffer_fetch - &__GLEW_ARM_shader_framebuffer_fetch, -#endif -#ifdef GL_ARM_shader_framebuffer_fetch_depth_stencil - &__GLEW_ARM_shader_framebuffer_fetch_depth_stencil, -#endif -#ifdef GL_ARM_texture_unnormalized_coordinates - &__GLEW_ARM_texture_unnormalized_coordinates, -#endif -#ifdef GL_ATIX_point_sprites - &__GLEW_ATIX_point_sprites, -#endif -#ifdef GL_ATIX_texture_env_combine3 - &__GLEW_ATIX_texture_env_combine3, -#endif -#ifdef GL_ATIX_texture_env_route - &__GLEW_ATIX_texture_env_route, -#endif -#ifdef GL_ATIX_vertex_shader_output_point_size - &__GLEW_ATIX_vertex_shader_output_point_size, -#endif -#ifdef GL_ATI_draw_buffers - &__GLEW_ATI_draw_buffers, -#endif -#ifdef GL_ATI_element_array - &__GLEW_ATI_element_array, -#endif -#ifdef GL_ATI_envmap_bumpmap - &__GLEW_ATI_envmap_bumpmap, -#endif -#ifdef GL_ATI_fragment_shader - &__GLEW_ATI_fragment_shader, -#endif -#ifdef GL_ATI_map_object_buffer - &__GLEW_ATI_map_object_buffer, -#endif -#ifdef GL_ATI_meminfo - &__GLEW_ATI_meminfo, -#endif -#ifdef GL_ATI_pn_triangles - &__GLEW_ATI_pn_triangles, -#endif -#ifdef GL_ATI_separate_stencil - &__GLEW_ATI_separate_stencil, -#endif -#ifdef GL_ATI_shader_texture_lod - &__GLEW_ATI_shader_texture_lod, -#endif -#ifdef GL_ATI_text_fragment_shader - &__GLEW_ATI_text_fragment_shader, -#endif -#ifdef GL_ATI_texture_compression_3dc - &__GLEW_ATI_texture_compression_3dc, -#endif -#ifdef GL_ATI_texture_env_combine3 - &__GLEW_ATI_texture_env_combine3, -#endif -#ifdef GL_ATI_texture_float - &__GLEW_ATI_texture_float, -#endif -#ifdef GL_ATI_texture_mirror_once - &__GLEW_ATI_texture_mirror_once, -#endif -#ifdef GL_ATI_vertex_array_object - &__GLEW_ATI_vertex_array_object, -#endif -#ifdef GL_ATI_vertex_attrib_array_object - &__GLEW_ATI_vertex_attrib_array_object, -#endif -#ifdef GL_ATI_vertex_streams - &__GLEW_ATI_vertex_streams, -#endif -#ifdef GL_DMP_program_binary - &__GLEW_DMP_program_binary, -#endif -#ifdef GL_DMP_shader_binary - &__GLEW_DMP_shader_binary, -#endif -#ifdef GL_EXT_422_pixels - &__GLEW_EXT_422_pixels, -#endif -#ifdef GL_EXT_Cg_shader - &__GLEW_EXT_Cg_shader, -#endif -#ifdef GL_EXT_EGL_image_array - &__GLEW_EXT_EGL_image_array, -#endif -#ifdef GL_EXT_EGL_image_external_wrap_modes - &__GLEW_EXT_EGL_image_external_wrap_modes, -#endif -#ifdef GL_EXT_EGL_image_storage - &__GLEW_EXT_EGL_image_storage, -#endif -#ifdef GL_EXT_EGL_sync - &__GLEW_EXT_EGL_sync, -#endif -#ifdef GL_EXT_YUV_target - &__GLEW_EXT_YUV_target, -#endif -#ifdef GL_EXT_abgr - &__GLEW_EXT_abgr, -#endif -#ifdef GL_EXT_base_instance - &__GLEW_EXT_base_instance, -#endif -#ifdef GL_EXT_bgra - &__GLEW_EXT_bgra, -#endif -#ifdef GL_EXT_bindable_uniform - &__GLEW_EXT_bindable_uniform, -#endif -#ifdef GL_EXT_blend_color - &__GLEW_EXT_blend_color, -#endif -#ifdef GL_EXT_blend_equation_separate - &__GLEW_EXT_blend_equation_separate, -#endif -#ifdef GL_EXT_blend_func_extended - &__GLEW_EXT_blend_func_extended, -#endif -#ifdef GL_EXT_blend_func_separate - &__GLEW_EXT_blend_func_separate, -#endif -#ifdef GL_EXT_blend_logic_op - &__GLEW_EXT_blend_logic_op, -#endif -#ifdef GL_EXT_blend_minmax - &__GLEW_EXT_blend_minmax, -#endif -#ifdef GL_EXT_blend_subtract - &__GLEW_EXT_blend_subtract, -#endif -#ifdef GL_EXT_buffer_storage - &__GLEW_EXT_buffer_storage, -#endif -#ifdef GL_EXT_clear_texture - &__GLEW_EXT_clear_texture, -#endif -#ifdef GL_EXT_clip_control - &__GLEW_EXT_clip_control, -#endif -#ifdef GL_EXT_clip_cull_distance - &__GLEW_EXT_clip_cull_distance, -#endif -#ifdef GL_EXT_clip_volume_hint - &__GLEW_EXT_clip_volume_hint, -#endif -#ifdef GL_EXT_cmyka - &__GLEW_EXT_cmyka, -#endif -#ifdef GL_EXT_color_buffer_float - &__GLEW_EXT_color_buffer_float, -#endif -#ifdef GL_EXT_color_buffer_half_float - &__GLEW_EXT_color_buffer_half_float, -#endif -#ifdef GL_EXT_color_subtable - &__GLEW_EXT_color_subtable, -#endif -#ifdef GL_EXT_compiled_vertex_array - &__GLEW_EXT_compiled_vertex_array, -#endif -#ifdef GL_EXT_compressed_ETC1_RGB8_sub_texture - &__GLEW_EXT_compressed_ETC1_RGB8_sub_texture, -#endif -#ifdef GL_EXT_conservative_depth - &__GLEW_EXT_conservative_depth, -#endif -#ifdef GL_EXT_convolution - &__GLEW_EXT_convolution, -#endif -#ifdef GL_EXT_coordinate_frame - &__GLEW_EXT_coordinate_frame, -#endif -#ifdef GL_EXT_copy_image - &__GLEW_EXT_copy_image, -#endif -#ifdef GL_EXT_copy_texture - &__GLEW_EXT_copy_texture, -#endif -#ifdef GL_EXT_cull_vertex - &__GLEW_EXT_cull_vertex, -#endif -#ifdef GL_EXT_debug_label - &__GLEW_EXT_debug_label, -#endif -#ifdef GL_EXT_debug_marker - &__GLEW_EXT_debug_marker, -#endif -#ifdef GL_EXT_depth_bounds_test - &__GLEW_EXT_depth_bounds_test, -#endif -#ifdef GL_EXT_depth_clamp - &__GLEW_EXT_depth_clamp, -#endif -#ifdef GL_EXT_direct_state_access - &__GLEW_EXT_direct_state_access, -#endif -#ifdef GL_EXT_discard_framebuffer - &__GLEW_EXT_discard_framebuffer, -#endif -#ifdef GL_EXT_disjoint_timer_query - &__GLEW_EXT_disjoint_timer_query, -#endif -#ifdef GL_EXT_draw_buffers - &__GLEW_EXT_draw_buffers, -#endif -#ifdef GL_EXT_draw_buffers2 - &__GLEW_EXT_draw_buffers2, -#endif -#ifdef GL_EXT_draw_buffers_indexed - &__GLEW_EXT_draw_buffers_indexed, -#endif -#ifdef GL_EXT_draw_elements_base_vertex - &__GLEW_EXT_draw_elements_base_vertex, -#endif -#ifdef GL_EXT_draw_instanced - &__GLEW_EXT_draw_instanced, -#endif -#ifdef GL_EXT_draw_range_elements - &__GLEW_EXT_draw_range_elements, -#endif -#ifdef GL_EXT_draw_transform_feedback - &__GLEW_EXT_draw_transform_feedback, -#endif -#ifdef GL_EXT_external_buffer - &__GLEW_EXT_external_buffer, -#endif -#ifdef GL_EXT_float_blend - &__GLEW_EXT_float_blend, -#endif -#ifdef GL_EXT_fog_coord - &__GLEW_EXT_fog_coord, -#endif -#ifdef GL_EXT_frag_depth - &__GLEW_EXT_frag_depth, -#endif -#ifdef GL_EXT_fragment_lighting - &__GLEW_EXT_fragment_lighting, -#endif -#ifdef GL_EXT_framebuffer_blit - &__GLEW_EXT_framebuffer_blit, -#endif -#ifdef GL_EXT_framebuffer_multisample - &__GLEW_EXT_framebuffer_multisample, -#endif -#ifdef GL_EXT_framebuffer_multisample_blit_scaled - &__GLEW_EXT_framebuffer_multisample_blit_scaled, -#endif -#ifdef GL_EXT_framebuffer_object - &__GLEW_EXT_framebuffer_object, -#endif -#ifdef GL_EXT_framebuffer_sRGB - &__GLEW_EXT_framebuffer_sRGB, -#endif -#ifdef GL_EXT_geometry_point_size - &__GLEW_EXT_geometry_point_size, -#endif -#ifdef GL_EXT_geometry_shader - &__GLEW_EXT_geometry_shader, -#endif -#ifdef GL_EXT_geometry_shader4 - &__GLEW_EXT_geometry_shader4, -#endif -#ifdef GL_EXT_gpu_program_parameters - &__GLEW_EXT_gpu_program_parameters, -#endif -#ifdef GL_EXT_gpu_shader4 - &__GLEW_EXT_gpu_shader4, -#endif -#ifdef GL_EXT_gpu_shader5 - &__GLEW_EXT_gpu_shader5, -#endif -#ifdef GL_EXT_histogram - &__GLEW_EXT_histogram, -#endif -#ifdef GL_EXT_index_array_formats - &__GLEW_EXT_index_array_formats, -#endif -#ifdef GL_EXT_index_func - &__GLEW_EXT_index_func, -#endif -#ifdef GL_EXT_index_material - &__GLEW_EXT_index_material, -#endif -#ifdef GL_EXT_index_texture - &__GLEW_EXT_index_texture, -#endif -#ifdef GL_EXT_instanced_arrays - &__GLEW_EXT_instanced_arrays, -#endif -#ifdef GL_EXT_light_texture - &__GLEW_EXT_light_texture, -#endif -#ifdef GL_EXT_map_buffer_range - &__GLEW_EXT_map_buffer_range, -#endif -#ifdef GL_EXT_memory_object - &__GLEW_EXT_memory_object, -#endif -#ifdef GL_EXT_memory_object_fd - &__GLEW_EXT_memory_object_fd, -#endif -#ifdef GL_EXT_memory_object_win32 - &__GLEW_EXT_memory_object_win32, -#endif -#ifdef GL_EXT_misc_attribute - &__GLEW_EXT_misc_attribute, -#endif -#ifdef GL_EXT_multi_draw_arrays - &__GLEW_EXT_multi_draw_arrays, -#endif -#ifdef GL_EXT_multi_draw_indirect - &__GLEW_EXT_multi_draw_indirect, -#endif -#ifdef GL_EXT_multiple_textures - &__GLEW_EXT_multiple_textures, -#endif -#ifdef GL_EXT_multisample - &__GLEW_EXT_multisample, -#endif -#ifdef GL_EXT_multisample_compatibility - &__GLEW_EXT_multisample_compatibility, -#endif -#ifdef GL_EXT_multisampled_render_to_texture - &__GLEW_EXT_multisampled_render_to_texture, -#endif -#ifdef GL_EXT_multisampled_render_to_texture2 - &__GLEW_EXT_multisampled_render_to_texture2, -#endif -#ifdef GL_EXT_multiview_draw_buffers - &__GLEW_EXT_multiview_draw_buffers, -#endif -#ifdef GL_EXT_multiview_tessellation_geometry_shader - &__GLEW_EXT_multiview_tessellation_geometry_shader, -#endif -#ifdef GL_EXT_multiview_texture_multisample - &__GLEW_EXT_multiview_texture_multisample, -#endif -#ifdef GL_EXT_multiview_timer_query - &__GLEW_EXT_multiview_timer_query, -#endif -#ifdef GL_EXT_occlusion_query_boolean - &__GLEW_EXT_occlusion_query_boolean, -#endif -#ifdef GL_EXT_packed_depth_stencil - &__GLEW_EXT_packed_depth_stencil, -#endif -#ifdef GL_EXT_packed_float - &__GLEW_EXT_packed_float, -#endif -#ifdef GL_EXT_packed_pixels - &__GLEW_EXT_packed_pixels, -#endif -#ifdef GL_EXT_paletted_texture - &__GLEW_EXT_paletted_texture, -#endif -#ifdef GL_EXT_pixel_buffer_object - &__GLEW_EXT_pixel_buffer_object, -#endif -#ifdef GL_EXT_pixel_transform - &__GLEW_EXT_pixel_transform, -#endif -#ifdef GL_EXT_pixel_transform_color_table - &__GLEW_EXT_pixel_transform_color_table, -#endif -#ifdef GL_EXT_point_parameters - &__GLEW_EXT_point_parameters, -#endif -#ifdef GL_EXT_polygon_offset - &__GLEW_EXT_polygon_offset, -#endif -#ifdef GL_EXT_polygon_offset_clamp - &__GLEW_EXT_polygon_offset_clamp, -#endif -#ifdef GL_EXT_post_depth_coverage - &__GLEW_EXT_post_depth_coverage, -#endif -#ifdef GL_EXT_primitive_bounding_box - &__GLEW_EXT_primitive_bounding_box, -#endif -#ifdef GL_EXT_protected_textures - &__GLEW_EXT_protected_textures, -#endif -#ifdef GL_EXT_provoking_vertex - &__GLEW_EXT_provoking_vertex, -#endif -#ifdef GL_EXT_pvrtc_sRGB - &__GLEW_EXT_pvrtc_sRGB, -#endif -#ifdef GL_EXT_raster_multisample - &__GLEW_EXT_raster_multisample, -#endif -#ifdef GL_EXT_read_format_bgra - &__GLEW_EXT_read_format_bgra, -#endif -#ifdef GL_EXT_render_snorm - &__GLEW_EXT_render_snorm, -#endif -#ifdef GL_EXT_rescale_normal - &__GLEW_EXT_rescale_normal, -#endif -#ifdef GL_EXT_robustness - &__GLEW_EXT_robustness, -#endif -#ifdef GL_EXT_sRGB - &__GLEW_EXT_sRGB, -#endif -#ifdef GL_EXT_sRGB_write_control - &__GLEW_EXT_sRGB_write_control, -#endif -#ifdef GL_EXT_scene_marker - &__GLEW_EXT_scene_marker, -#endif -#ifdef GL_EXT_secondary_color - &__GLEW_EXT_secondary_color, -#endif -#ifdef GL_EXT_semaphore - &__GLEW_EXT_semaphore, -#endif -#ifdef GL_EXT_semaphore_fd - &__GLEW_EXT_semaphore_fd, -#endif -#ifdef GL_EXT_semaphore_win32 - &__GLEW_EXT_semaphore_win32, -#endif -#ifdef GL_EXT_separate_shader_objects - &__GLEW_EXT_separate_shader_objects, -#endif -#ifdef GL_EXT_separate_specular_color - &__GLEW_EXT_separate_specular_color, -#endif -#ifdef GL_EXT_shader_framebuffer_fetch - &__GLEW_EXT_shader_framebuffer_fetch, -#endif -#ifdef GL_EXT_shader_framebuffer_fetch_non_coherent - &__GLEW_EXT_shader_framebuffer_fetch_non_coherent, -#endif -#ifdef GL_EXT_shader_group_vote - &__GLEW_EXT_shader_group_vote, -#endif -#ifdef GL_EXT_shader_image_load_formatted - &__GLEW_EXT_shader_image_load_formatted, -#endif -#ifdef GL_EXT_shader_image_load_store - &__GLEW_EXT_shader_image_load_store, -#endif -#ifdef GL_EXT_shader_implicit_conversions - &__GLEW_EXT_shader_implicit_conversions, -#endif -#ifdef GL_EXT_shader_integer_mix - &__GLEW_EXT_shader_integer_mix, -#endif -#ifdef GL_EXT_shader_io_blocks - &__GLEW_EXT_shader_io_blocks, -#endif -#ifdef GL_EXT_shader_non_constant_global_initializers - &__GLEW_EXT_shader_non_constant_global_initializers, -#endif -#ifdef GL_EXT_shader_pixel_local_storage - &__GLEW_EXT_shader_pixel_local_storage, -#endif -#ifdef GL_EXT_shader_pixel_local_storage2 - &__GLEW_EXT_shader_pixel_local_storage2, -#endif -#ifdef GL_EXT_shader_texture_lod - &__GLEW_EXT_shader_texture_lod, -#endif -#ifdef GL_EXT_shadow_funcs - &__GLEW_EXT_shadow_funcs, -#endif -#ifdef GL_EXT_shadow_samplers - &__GLEW_EXT_shadow_samplers, -#endif -#ifdef GL_EXT_shared_texture_palette - &__GLEW_EXT_shared_texture_palette, -#endif -#ifdef GL_EXT_sparse_texture - &__GLEW_EXT_sparse_texture, -#endif -#ifdef GL_EXT_sparse_texture2 - &__GLEW_EXT_sparse_texture2, -#endif -#ifdef GL_EXT_static_vertex_array - &__GLEW_EXT_static_vertex_array, -#endif -#ifdef GL_EXT_stencil_clear_tag - &__GLEW_EXT_stencil_clear_tag, -#endif -#ifdef GL_EXT_stencil_two_side - &__GLEW_EXT_stencil_two_side, -#endif -#ifdef GL_EXT_stencil_wrap - &__GLEW_EXT_stencil_wrap, -#endif -#ifdef GL_EXT_subtexture - &__GLEW_EXT_subtexture, -#endif -#ifdef GL_EXT_tessellation_point_size - &__GLEW_EXT_tessellation_point_size, -#endif -#ifdef GL_EXT_tessellation_shader - &__GLEW_EXT_tessellation_shader, -#endif -#ifdef GL_EXT_texture - &__GLEW_EXT_texture, -#endif -#ifdef GL_EXT_texture3D - &__GLEW_EXT_texture3D, -#endif -#ifdef GL_EXT_texture_array - &__GLEW_EXT_texture_array, -#endif -#ifdef GL_EXT_texture_border_clamp - &__GLEW_EXT_texture_border_clamp, -#endif -#ifdef GL_EXT_texture_buffer - &__GLEW_EXT_texture_buffer, -#endif -#ifdef GL_EXT_texture_buffer_object - &__GLEW_EXT_texture_buffer_object, -#endif -#ifdef GL_EXT_texture_compression_astc_decode_mode - &__GLEW_EXT_texture_compression_astc_decode_mode, -#endif -#ifdef GL_EXT_texture_compression_astc_decode_mode_rgb9e5 - &__GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5, -#endif -#ifdef GL_EXT_texture_compression_bptc - &__GLEW_EXT_texture_compression_bptc, -#endif -#ifdef GL_EXT_texture_compression_dxt1 - &__GLEW_EXT_texture_compression_dxt1, -#endif -#ifdef GL_EXT_texture_compression_latc - &__GLEW_EXT_texture_compression_latc, -#endif -#ifdef GL_EXT_texture_compression_rgtc - &__GLEW_EXT_texture_compression_rgtc, -#endif -#ifdef GL_EXT_texture_compression_s3tc - &__GLEW_EXT_texture_compression_s3tc, -#endif -#ifdef GL_EXT_texture_compression_s3tc_srgb - &__GLEW_EXT_texture_compression_s3tc_srgb, -#endif -#ifdef GL_EXT_texture_cube_map - &__GLEW_EXT_texture_cube_map, -#endif -#ifdef GL_EXT_texture_cube_map_array - &__GLEW_EXT_texture_cube_map_array, -#endif -#ifdef GL_EXT_texture_edge_clamp - &__GLEW_EXT_texture_edge_clamp, -#endif -#ifdef GL_EXT_texture_env - &__GLEW_EXT_texture_env, -#endif -#ifdef GL_EXT_texture_env_add - &__GLEW_EXT_texture_env_add, -#endif -#ifdef GL_EXT_texture_env_combine - &__GLEW_EXT_texture_env_combine, -#endif -#ifdef GL_EXT_texture_env_dot3 - &__GLEW_EXT_texture_env_dot3, -#endif -#ifdef GL_EXT_texture_filter_anisotropic - &__GLEW_EXT_texture_filter_anisotropic, -#endif -#ifdef GL_EXT_texture_filter_minmax - &__GLEW_EXT_texture_filter_minmax, -#endif -#ifdef GL_EXT_texture_format_BGRA8888 - &__GLEW_EXT_texture_format_BGRA8888, -#endif -#ifdef GL_EXT_texture_format_sRGB_override - &__GLEW_EXT_texture_format_sRGB_override, -#endif -#ifdef GL_EXT_texture_integer - &__GLEW_EXT_texture_integer, -#endif -#ifdef GL_EXT_texture_lod_bias - &__GLEW_EXT_texture_lod_bias, -#endif -#ifdef GL_EXT_texture_mirror_clamp - &__GLEW_EXT_texture_mirror_clamp, -#endif -#ifdef GL_EXT_texture_mirror_clamp_to_edge - &__GLEW_EXT_texture_mirror_clamp_to_edge, -#endif -#ifdef GL_EXT_texture_norm16 - &__GLEW_EXT_texture_norm16, -#endif -#ifdef GL_EXT_texture_object - &__GLEW_EXT_texture_object, -#endif -#ifdef GL_EXT_texture_perturb_normal - &__GLEW_EXT_texture_perturb_normal, -#endif -#ifdef GL_EXT_texture_query_lod - &__GLEW_EXT_texture_query_lod, -#endif -#ifdef GL_EXT_texture_rectangle - &__GLEW_EXT_texture_rectangle, -#endif -#ifdef GL_EXT_texture_rg - &__GLEW_EXT_texture_rg, -#endif -#ifdef GL_EXT_texture_sRGB - &__GLEW_EXT_texture_sRGB, -#endif -#ifdef GL_EXT_texture_sRGB_R8 - &__GLEW_EXT_texture_sRGB_R8, -#endif -#ifdef GL_EXT_texture_sRGB_RG8 - &__GLEW_EXT_texture_sRGB_RG8, -#endif -#ifdef GL_EXT_texture_sRGB_decode - &__GLEW_EXT_texture_sRGB_decode, -#endif -#ifdef GL_EXT_texture_shadow_lod - &__GLEW_EXT_texture_shadow_lod, -#endif -#ifdef GL_EXT_texture_shared_exponent - &__GLEW_EXT_texture_shared_exponent, -#endif -#ifdef GL_EXT_texture_snorm - &__GLEW_EXT_texture_snorm, -#endif -#ifdef GL_EXT_texture_storage - &__GLEW_EXT_texture_storage, -#endif -#ifdef GL_EXT_texture_swizzle - &__GLEW_EXT_texture_swizzle, -#endif -#ifdef GL_EXT_texture_type_2_10_10_10_REV - &__GLEW_EXT_texture_type_2_10_10_10_REV, -#endif -#ifdef GL_EXT_texture_view - &__GLEW_EXT_texture_view, -#endif -#ifdef GL_EXT_timer_query - &__GLEW_EXT_timer_query, -#endif -#ifdef GL_EXT_transform_feedback - &__GLEW_EXT_transform_feedback, -#endif -#ifdef GL_EXT_unpack_subimage - &__GLEW_EXT_unpack_subimage, -#endif -#ifdef GL_EXT_vertex_array - &__GLEW_EXT_vertex_array, -#endif -#ifdef GL_EXT_vertex_array_bgra - &__GLEW_EXT_vertex_array_bgra, -#endif -#ifdef GL_EXT_vertex_array_setXXX - &__GLEW_EXT_vertex_array_setXXX, -#endif -#ifdef GL_EXT_vertex_attrib_64bit - &__GLEW_EXT_vertex_attrib_64bit, -#endif -#ifdef GL_EXT_vertex_shader - &__GLEW_EXT_vertex_shader, -#endif -#ifdef GL_EXT_vertex_weighting - &__GLEW_EXT_vertex_weighting, -#endif -#ifdef GL_EXT_win32_keyed_mutex - &__GLEW_EXT_win32_keyed_mutex, -#endif -#ifdef GL_EXT_window_rectangles - &__GLEW_EXT_window_rectangles, -#endif -#ifdef GL_EXT_x11_sync_object - &__GLEW_EXT_x11_sync_object, -#endif -#ifdef GL_FJ_shader_binary_GCCSO - &__GLEW_FJ_shader_binary_GCCSO, -#endif -#ifdef GL_GREMEDY_frame_terminator - &__GLEW_GREMEDY_frame_terminator, -#endif -#ifdef GL_GREMEDY_string_marker - &__GLEW_GREMEDY_string_marker, -#endif -#ifdef GL_HP_convolution_border_modes - &__GLEW_HP_convolution_border_modes, -#endif -#ifdef GL_HP_image_transform - &__GLEW_HP_image_transform, -#endif -#ifdef GL_HP_occlusion_test - &__GLEW_HP_occlusion_test, -#endif -#ifdef GL_HP_texture_lighting - &__GLEW_HP_texture_lighting, -#endif -#ifdef GL_IBM_cull_vertex - &__GLEW_IBM_cull_vertex, -#endif -#ifdef GL_IBM_multimode_draw_arrays - &__GLEW_IBM_multimode_draw_arrays, -#endif -#ifdef GL_IBM_rasterpos_clip - &__GLEW_IBM_rasterpos_clip, -#endif -#ifdef GL_IBM_static_data - &__GLEW_IBM_static_data, -#endif -#ifdef GL_IBM_texture_mirrored_repeat - &__GLEW_IBM_texture_mirrored_repeat, -#endif -#ifdef GL_IBM_vertex_array_lists - &__GLEW_IBM_vertex_array_lists, -#endif -#ifdef GL_IMG_bindless_texture - &__GLEW_IMG_bindless_texture, -#endif -#ifdef GL_IMG_framebuffer_downsample - &__GLEW_IMG_framebuffer_downsample, -#endif -#ifdef GL_IMG_multisampled_render_to_texture - &__GLEW_IMG_multisampled_render_to_texture, -#endif -#ifdef GL_IMG_program_binary - &__GLEW_IMG_program_binary, -#endif -#ifdef GL_IMG_read_format - &__GLEW_IMG_read_format, -#endif -#ifdef GL_IMG_shader_binary - &__GLEW_IMG_shader_binary, -#endif -#ifdef GL_IMG_texture_compression_pvrtc - &__GLEW_IMG_texture_compression_pvrtc, -#endif -#ifdef GL_IMG_texture_compression_pvrtc2 - &__GLEW_IMG_texture_compression_pvrtc2, -#endif -#ifdef GL_IMG_texture_env_enhanced_fixed_function - &__GLEW_IMG_texture_env_enhanced_fixed_function, -#endif -#ifdef GL_IMG_texture_filter_cubic - &__GLEW_IMG_texture_filter_cubic, -#endif -#ifdef GL_INGR_color_clamp - &__GLEW_INGR_color_clamp, -#endif -#ifdef GL_INGR_interlace_read - &__GLEW_INGR_interlace_read, -#endif -#ifdef GL_INTEL_blackhole_render - &__GLEW_INTEL_blackhole_render, -#endif -#ifdef GL_INTEL_conservative_rasterization - &__GLEW_INTEL_conservative_rasterization, -#endif -#ifdef GL_INTEL_fragment_shader_ordering - &__GLEW_INTEL_fragment_shader_ordering, -#endif -#ifdef GL_INTEL_framebuffer_CMAA - &__GLEW_INTEL_framebuffer_CMAA, -#endif -#ifdef GL_INTEL_map_texture - &__GLEW_INTEL_map_texture, -#endif -#ifdef GL_INTEL_parallel_arrays - &__GLEW_INTEL_parallel_arrays, -#endif -#ifdef GL_INTEL_performance_query - &__GLEW_INTEL_performance_query, -#endif -#ifdef GL_INTEL_shader_integer_functions2 - &__GLEW_INTEL_shader_integer_functions2, -#endif -#ifdef GL_INTEL_texture_scissor - &__GLEW_INTEL_texture_scissor, -#endif -#ifdef GL_KHR_blend_equation_advanced - &__GLEW_KHR_blend_equation_advanced, -#endif -#ifdef GL_KHR_blend_equation_advanced_coherent - &__GLEW_KHR_blend_equation_advanced_coherent, -#endif -#ifdef GL_KHR_context_flush_control - &__GLEW_KHR_context_flush_control, -#endif -#ifdef GL_KHR_debug - &__GLEW_KHR_debug, -#endif -#ifdef GL_KHR_no_error - &__GLEW_KHR_no_error, -#endif -#ifdef GL_KHR_parallel_shader_compile - &__GLEW_KHR_parallel_shader_compile, -#endif -#ifdef GL_KHR_robust_buffer_access_behavior - &__GLEW_KHR_robust_buffer_access_behavior, -#endif -#ifdef GL_KHR_robustness - &__GLEW_KHR_robustness, -#endif -#ifdef GL_KHR_shader_subgroup - &__GLEW_KHR_shader_subgroup, -#endif -#ifdef GL_KHR_texture_compression_astc_hdr - &__GLEW_KHR_texture_compression_astc_hdr, -#endif -#ifdef GL_KHR_texture_compression_astc_ldr - &__GLEW_KHR_texture_compression_astc_ldr, -#endif -#ifdef GL_KHR_texture_compression_astc_sliced_3d - &__GLEW_KHR_texture_compression_astc_sliced_3d, -#endif -#ifdef GL_KTX_buffer_region - &__GLEW_KTX_buffer_region, -#endif -#ifdef GL_MESAX_texture_stack - &__GLEW_MESAX_texture_stack, -#endif -#ifdef GL_MESA_framebuffer_flip_y - &__GLEW_MESA_framebuffer_flip_y, -#endif -#ifdef GL_MESA_pack_invert - &__GLEW_MESA_pack_invert, -#endif -#ifdef GL_MESA_program_binary_formats - &__GLEW_MESA_program_binary_formats, -#endif -#ifdef GL_MESA_resize_buffers - &__GLEW_MESA_resize_buffers, -#endif -#ifdef GL_MESA_shader_integer_functions - &__GLEW_MESA_shader_integer_functions, -#endif -#ifdef GL_MESA_tile_raster_order - &__GLEW_MESA_tile_raster_order, -#endif -#ifdef GL_MESA_window_pos - &__GLEW_MESA_window_pos, -#endif -#ifdef GL_MESA_ycbcr_texture - &__GLEW_MESA_ycbcr_texture, -#endif -#ifdef GL_NVX_blend_equation_advanced_multi_draw_buffers - &__GLEW_NVX_blend_equation_advanced_multi_draw_buffers, -#endif -#ifdef GL_NVX_conditional_render - &__GLEW_NVX_conditional_render, -#endif -#ifdef GL_NVX_gpu_memory_info - &__GLEW_NVX_gpu_memory_info, -#endif -#ifdef GL_NVX_gpu_multicast2 - &__GLEW_NVX_gpu_multicast2, -#endif -#ifdef GL_NVX_linked_gpu_multicast - &__GLEW_NVX_linked_gpu_multicast, -#endif -#ifdef GL_NVX_progress_fence - &__GLEW_NVX_progress_fence, -#endif -#ifdef GL_NV_3dvision_settings - &__GLEW_NV_3dvision_settings, -#endif -#ifdef GL_NV_EGL_stream_consumer_external - &__GLEW_NV_EGL_stream_consumer_external, -#endif -#ifdef GL_NV_alpha_to_coverage_dither_control - &__GLEW_NV_alpha_to_coverage_dither_control, -#endif -#ifdef GL_NV_bgr - &__GLEW_NV_bgr, -#endif -#ifdef GL_NV_bindless_multi_draw_indirect - &__GLEW_NV_bindless_multi_draw_indirect, -#endif -#ifdef GL_NV_bindless_multi_draw_indirect_count - &__GLEW_NV_bindless_multi_draw_indirect_count, -#endif -#ifdef GL_NV_bindless_texture - &__GLEW_NV_bindless_texture, -#endif -#ifdef GL_NV_blend_equation_advanced - &__GLEW_NV_blend_equation_advanced, -#endif -#ifdef GL_NV_blend_equation_advanced_coherent - &__GLEW_NV_blend_equation_advanced_coherent, -#endif -#ifdef GL_NV_blend_minmax_factor - &__GLEW_NV_blend_minmax_factor, -#endif -#ifdef GL_NV_blend_square - &__GLEW_NV_blend_square, -#endif -#ifdef GL_NV_clip_space_w_scaling - &__GLEW_NV_clip_space_w_scaling, -#endif -#ifdef GL_NV_command_list - &__GLEW_NV_command_list, -#endif -#ifdef GL_NV_compute_program5 - &__GLEW_NV_compute_program5, -#endif -#ifdef GL_NV_compute_shader_derivatives - &__GLEW_NV_compute_shader_derivatives, -#endif -#ifdef GL_NV_conditional_render - &__GLEW_NV_conditional_render, -#endif -#ifdef GL_NV_conservative_raster - &__GLEW_NV_conservative_raster, -#endif -#ifdef GL_NV_conservative_raster_dilate - &__GLEW_NV_conservative_raster_dilate, -#endif -#ifdef GL_NV_conservative_raster_pre_snap - &__GLEW_NV_conservative_raster_pre_snap, -#endif -#ifdef GL_NV_conservative_raster_pre_snap_triangles - &__GLEW_NV_conservative_raster_pre_snap_triangles, -#endif -#ifdef GL_NV_conservative_raster_underestimation - &__GLEW_NV_conservative_raster_underestimation, -#endif -#ifdef GL_NV_copy_buffer - &__GLEW_NV_copy_buffer, -#endif -#ifdef GL_NV_copy_depth_to_color - &__GLEW_NV_copy_depth_to_color, -#endif -#ifdef GL_NV_copy_image - &__GLEW_NV_copy_image, -#endif -#ifdef GL_NV_deep_texture3D - &__GLEW_NV_deep_texture3D, -#endif -#ifdef GL_NV_depth_buffer_float - &__GLEW_NV_depth_buffer_float, -#endif -#ifdef GL_NV_depth_clamp - &__GLEW_NV_depth_clamp, -#endif -#ifdef GL_NV_depth_nonlinear - &__GLEW_NV_depth_nonlinear, -#endif -#ifdef GL_NV_depth_range_unclamped - &__GLEW_NV_depth_range_unclamped, -#endif -#ifdef GL_NV_draw_buffers - &__GLEW_NV_draw_buffers, -#endif -#ifdef GL_NV_draw_instanced - &__GLEW_NV_draw_instanced, -#endif -#ifdef GL_NV_draw_texture - &__GLEW_NV_draw_texture, -#endif -#ifdef GL_NV_draw_vulkan_image - &__GLEW_NV_draw_vulkan_image, -#endif -#ifdef GL_NV_evaluators - &__GLEW_NV_evaluators, -#endif -#ifdef GL_NV_explicit_attrib_location - &__GLEW_NV_explicit_attrib_location, -#endif -#ifdef GL_NV_explicit_multisample - &__GLEW_NV_explicit_multisample, -#endif -#ifdef GL_NV_fbo_color_attachments - &__GLEW_NV_fbo_color_attachments, -#endif -#ifdef GL_NV_fence - &__GLEW_NV_fence, -#endif -#ifdef GL_NV_fill_rectangle - &__GLEW_NV_fill_rectangle, -#endif -#ifdef GL_NV_float_buffer - &__GLEW_NV_float_buffer, -#endif -#ifdef GL_NV_fog_distance - &__GLEW_NV_fog_distance, -#endif -#ifdef GL_NV_fragment_coverage_to_color - &__GLEW_NV_fragment_coverage_to_color, -#endif -#ifdef GL_NV_fragment_program - &__GLEW_NV_fragment_program, -#endif -#ifdef GL_NV_fragment_program2 - &__GLEW_NV_fragment_program2, -#endif -#ifdef GL_NV_fragment_program4 - &__GLEW_NV_fragment_program4, -#endif -#ifdef GL_NV_fragment_program_option - &__GLEW_NV_fragment_program_option, -#endif -#ifdef GL_NV_fragment_shader_barycentric - &__GLEW_NV_fragment_shader_barycentric, -#endif -#ifdef GL_NV_fragment_shader_interlock - &__GLEW_NV_fragment_shader_interlock, -#endif -#ifdef GL_NV_framebuffer_blit - &__GLEW_NV_framebuffer_blit, -#endif -#ifdef GL_NV_framebuffer_mixed_samples - &__GLEW_NV_framebuffer_mixed_samples, -#endif -#ifdef GL_NV_framebuffer_multisample - &__GLEW_NV_framebuffer_multisample, -#endif -#ifdef GL_NV_framebuffer_multisample_coverage - &__GLEW_NV_framebuffer_multisample_coverage, -#endif -#ifdef GL_NV_generate_mipmap_sRGB - &__GLEW_NV_generate_mipmap_sRGB, -#endif -#ifdef GL_NV_geometry_program4 - &__GLEW_NV_geometry_program4, -#endif -#ifdef GL_NV_geometry_shader4 - &__GLEW_NV_geometry_shader4, -#endif -#ifdef GL_NV_geometry_shader_passthrough - &__GLEW_NV_geometry_shader_passthrough, -#endif -#ifdef GL_NV_gpu_multicast - &__GLEW_NV_gpu_multicast, -#endif -#ifdef GL_NV_gpu_program4 - &__GLEW_NV_gpu_program4, -#endif -#ifdef GL_NV_gpu_program5 - &__GLEW_NV_gpu_program5, -#endif -#ifdef GL_NV_gpu_program5_mem_extended - &__GLEW_NV_gpu_program5_mem_extended, -#endif -#ifdef GL_NV_gpu_program_fp64 - &__GLEW_NV_gpu_program_fp64, -#endif -#ifdef GL_NV_gpu_shader5 - &__GLEW_NV_gpu_shader5, -#endif -#ifdef GL_NV_half_float - &__GLEW_NV_half_float, -#endif -#ifdef GL_NV_image_formats - &__GLEW_NV_image_formats, -#endif -#ifdef GL_NV_instanced_arrays - &__GLEW_NV_instanced_arrays, -#endif -#ifdef GL_NV_internalformat_sample_query - &__GLEW_NV_internalformat_sample_query, -#endif -#ifdef GL_NV_light_max_exponent - &__GLEW_NV_light_max_exponent, -#endif -#ifdef GL_NV_memory_attachment - &__GLEW_NV_memory_attachment, -#endif -#ifdef GL_NV_mesh_shader - &__GLEW_NV_mesh_shader, -#endif -#ifdef GL_NV_multisample_coverage - &__GLEW_NV_multisample_coverage, -#endif -#ifdef GL_NV_multisample_filter_hint - &__GLEW_NV_multisample_filter_hint, -#endif -#ifdef GL_NV_non_square_matrices - &__GLEW_NV_non_square_matrices, -#endif -#ifdef GL_NV_occlusion_query - &__GLEW_NV_occlusion_query, -#endif -#ifdef GL_NV_pack_subimage - &__GLEW_NV_pack_subimage, -#endif -#ifdef GL_NV_packed_depth_stencil - &__GLEW_NV_packed_depth_stencil, -#endif -#ifdef GL_NV_packed_float - &__GLEW_NV_packed_float, -#endif -#ifdef GL_NV_packed_float_linear - &__GLEW_NV_packed_float_linear, -#endif -#ifdef GL_NV_parameter_buffer_object - &__GLEW_NV_parameter_buffer_object, -#endif -#ifdef GL_NV_parameter_buffer_object2 - &__GLEW_NV_parameter_buffer_object2, -#endif -#ifdef GL_NV_path_rendering - &__GLEW_NV_path_rendering, -#endif -#ifdef GL_NV_path_rendering_shared_edge - &__GLEW_NV_path_rendering_shared_edge, -#endif -#ifdef GL_NV_pixel_buffer_object - &__GLEW_NV_pixel_buffer_object, -#endif -#ifdef GL_NV_pixel_data_range - &__GLEW_NV_pixel_data_range, -#endif -#ifdef GL_NV_platform_binary - &__GLEW_NV_platform_binary, -#endif -#ifdef GL_NV_point_sprite - &__GLEW_NV_point_sprite, -#endif -#ifdef GL_NV_polygon_mode - &__GLEW_NV_polygon_mode, -#endif -#ifdef GL_NV_present_video - &__GLEW_NV_present_video, -#endif -#ifdef GL_NV_primitive_restart - &__GLEW_NV_primitive_restart, -#endif -#ifdef GL_NV_query_resource_tag - &__GLEW_NV_query_resource_tag, -#endif -#ifdef GL_NV_read_buffer - &__GLEW_NV_read_buffer, -#endif -#ifdef GL_NV_read_buffer_front - &__GLEW_NV_read_buffer_front, -#endif -#ifdef GL_NV_read_depth - &__GLEW_NV_read_depth, -#endif -#ifdef GL_NV_read_depth_stencil - &__GLEW_NV_read_depth_stencil, -#endif -#ifdef GL_NV_read_stencil - &__GLEW_NV_read_stencil, -#endif -#ifdef GL_NV_register_combiners - &__GLEW_NV_register_combiners, -#endif -#ifdef GL_NV_register_combiners2 - &__GLEW_NV_register_combiners2, -#endif -#ifdef GL_NV_representative_fragment_test - &__GLEW_NV_representative_fragment_test, -#endif -#ifdef GL_NV_robustness_video_memory_purge - &__GLEW_NV_robustness_video_memory_purge, -#endif -#ifdef GL_NV_sRGB_formats - &__GLEW_NV_sRGB_formats, -#endif -#ifdef GL_NV_sample_locations - &__GLEW_NV_sample_locations, -#endif -#ifdef GL_NV_sample_mask_override_coverage - &__GLEW_NV_sample_mask_override_coverage, -#endif -#ifdef GL_NV_scissor_exclusive - &__GLEW_NV_scissor_exclusive, -#endif -#ifdef GL_NV_shader_atomic_counters - &__GLEW_NV_shader_atomic_counters, -#endif -#ifdef GL_NV_shader_atomic_float - &__GLEW_NV_shader_atomic_float, -#endif -#ifdef GL_NV_shader_atomic_float64 - &__GLEW_NV_shader_atomic_float64, -#endif -#ifdef GL_NV_shader_atomic_fp16_vector - &__GLEW_NV_shader_atomic_fp16_vector, -#endif -#ifdef GL_NV_shader_atomic_int64 - &__GLEW_NV_shader_atomic_int64, -#endif -#ifdef GL_NV_shader_buffer_load - &__GLEW_NV_shader_buffer_load, -#endif -#ifdef GL_NV_shader_noperspective_interpolation - &__GLEW_NV_shader_noperspective_interpolation, -#endif -#ifdef GL_NV_shader_storage_buffer_object - &__GLEW_NV_shader_storage_buffer_object, -#endif -#ifdef GL_NV_shader_subgroup_partitioned - &__GLEW_NV_shader_subgroup_partitioned, -#endif -#ifdef GL_NV_shader_texture_footprint - &__GLEW_NV_shader_texture_footprint, -#endif -#ifdef GL_NV_shader_thread_group - &__GLEW_NV_shader_thread_group, -#endif -#ifdef GL_NV_shader_thread_shuffle - &__GLEW_NV_shader_thread_shuffle, -#endif -#ifdef GL_NV_shading_rate_image - &__GLEW_NV_shading_rate_image, -#endif -#ifdef GL_NV_shadow_samplers_array - &__GLEW_NV_shadow_samplers_array, -#endif -#ifdef GL_NV_shadow_samplers_cube - &__GLEW_NV_shadow_samplers_cube, -#endif -#ifdef GL_NV_stereo_view_rendering - &__GLEW_NV_stereo_view_rendering, -#endif -#ifdef GL_NV_tessellation_program5 - &__GLEW_NV_tessellation_program5, -#endif -#ifdef GL_NV_texgen_emboss - &__GLEW_NV_texgen_emboss, -#endif -#ifdef GL_NV_texgen_reflection - &__GLEW_NV_texgen_reflection, -#endif -#ifdef GL_NV_texture_array - &__GLEW_NV_texture_array, -#endif -#ifdef GL_NV_texture_barrier - &__GLEW_NV_texture_barrier, -#endif -#ifdef GL_NV_texture_border_clamp - &__GLEW_NV_texture_border_clamp, -#endif -#ifdef GL_NV_texture_compression_latc - &__GLEW_NV_texture_compression_latc, -#endif -#ifdef GL_NV_texture_compression_s3tc - &__GLEW_NV_texture_compression_s3tc, -#endif -#ifdef GL_NV_texture_compression_s3tc_update - &__GLEW_NV_texture_compression_s3tc_update, -#endif -#ifdef GL_NV_texture_compression_vtc - &__GLEW_NV_texture_compression_vtc, -#endif -#ifdef GL_NV_texture_env_combine4 - &__GLEW_NV_texture_env_combine4, -#endif -#ifdef GL_NV_texture_expand_normal - &__GLEW_NV_texture_expand_normal, -#endif -#ifdef GL_NV_texture_multisample - &__GLEW_NV_texture_multisample, -#endif -#ifdef GL_NV_texture_npot_2D_mipmap - &__GLEW_NV_texture_npot_2D_mipmap, -#endif -#ifdef GL_NV_texture_rectangle - &__GLEW_NV_texture_rectangle, -#endif -#ifdef GL_NV_texture_rectangle_compressed - &__GLEW_NV_texture_rectangle_compressed, -#endif -#ifdef GL_NV_texture_shader - &__GLEW_NV_texture_shader, -#endif -#ifdef GL_NV_texture_shader2 - &__GLEW_NV_texture_shader2, -#endif -#ifdef GL_NV_texture_shader3 - &__GLEW_NV_texture_shader3, -#endif -#ifdef GL_NV_transform_feedback - &__GLEW_NV_transform_feedback, -#endif -#ifdef GL_NV_transform_feedback2 - &__GLEW_NV_transform_feedback2, -#endif -#ifdef GL_NV_uniform_buffer_unified_memory - &__GLEW_NV_uniform_buffer_unified_memory, -#endif -#ifdef GL_NV_vdpau_interop - &__GLEW_NV_vdpau_interop, -#endif -#ifdef GL_NV_vdpau_interop2 - &__GLEW_NV_vdpau_interop2, -#endif -#ifdef GL_NV_vertex_array_range - &__GLEW_NV_vertex_array_range, -#endif -#ifdef GL_NV_vertex_array_range2 - &__GLEW_NV_vertex_array_range2, -#endif -#ifdef GL_NV_vertex_attrib_integer_64bit - &__GLEW_NV_vertex_attrib_integer_64bit, -#endif -#ifdef GL_NV_vertex_buffer_unified_memory - &__GLEW_NV_vertex_buffer_unified_memory, -#endif -#ifdef GL_NV_vertex_program - &__GLEW_NV_vertex_program, -#endif -#ifdef GL_NV_vertex_program1_1 - &__GLEW_NV_vertex_program1_1, -#endif -#ifdef GL_NV_vertex_program2 - &__GLEW_NV_vertex_program2, -#endif -#ifdef GL_NV_vertex_program2_option - &__GLEW_NV_vertex_program2_option, -#endif -#ifdef GL_NV_vertex_program3 - &__GLEW_NV_vertex_program3, -#endif -#ifdef GL_NV_vertex_program4 - &__GLEW_NV_vertex_program4, -#endif -#ifdef GL_NV_video_capture - &__GLEW_NV_video_capture, -#endif -#ifdef GL_NV_viewport_array - &__GLEW_NV_viewport_array, -#endif -#ifdef GL_NV_viewport_array2 - &__GLEW_NV_viewport_array2, -#endif -#ifdef GL_NV_viewport_swizzle - &__GLEW_NV_viewport_swizzle, -#endif -#ifdef GL_OES_EGL_image - &__GLEW_OES_EGL_image, -#endif -#ifdef GL_OES_EGL_image_external - &__GLEW_OES_EGL_image_external, -#endif -#ifdef GL_OES_EGL_image_external_essl3 - &__GLEW_OES_EGL_image_external_essl3, -#endif -#ifdef GL_OES_blend_equation_separate - &__GLEW_OES_blend_equation_separate, -#endif -#ifdef GL_OES_blend_func_separate - &__GLEW_OES_blend_func_separate, -#endif -#ifdef GL_OES_blend_subtract - &__GLEW_OES_blend_subtract, -#endif -#ifdef GL_OES_byte_coordinates - &__GLEW_OES_byte_coordinates, -#endif -#ifdef GL_OES_compressed_ETC1_RGB8_texture - &__GLEW_OES_compressed_ETC1_RGB8_texture, -#endif -#ifdef GL_OES_compressed_paletted_texture - &__GLEW_OES_compressed_paletted_texture, -#endif -#ifdef GL_OES_copy_image - &__GLEW_OES_copy_image, -#endif -#ifdef GL_OES_depth24 - &__GLEW_OES_depth24, -#endif -#ifdef GL_OES_depth32 - &__GLEW_OES_depth32, -#endif -#ifdef GL_OES_depth_texture - &__GLEW_OES_depth_texture, -#endif -#ifdef GL_OES_depth_texture_cube_map - &__GLEW_OES_depth_texture_cube_map, -#endif -#ifdef GL_OES_draw_buffers_indexed - &__GLEW_OES_draw_buffers_indexed, -#endif -#ifdef GL_OES_draw_texture - &__GLEW_OES_draw_texture, -#endif -#ifdef GL_OES_element_index_uint - &__GLEW_OES_element_index_uint, -#endif -#ifdef GL_OES_extended_matrix_palette - &__GLEW_OES_extended_matrix_palette, -#endif -#ifdef GL_OES_fbo_render_mipmap - &__GLEW_OES_fbo_render_mipmap, -#endif -#ifdef GL_OES_fragment_precision_high - &__GLEW_OES_fragment_precision_high, -#endif -#ifdef GL_OES_framebuffer_object - &__GLEW_OES_framebuffer_object, -#endif -#ifdef GL_OES_geometry_point_size - &__GLEW_OES_geometry_point_size, -#endif -#ifdef GL_OES_geometry_shader - &__GLEW_OES_geometry_shader, -#endif -#ifdef GL_OES_get_program_binary - &__GLEW_OES_get_program_binary, -#endif -#ifdef GL_OES_gpu_shader5 - &__GLEW_OES_gpu_shader5, -#endif -#ifdef GL_OES_mapbuffer - &__GLEW_OES_mapbuffer, -#endif -#ifdef GL_OES_matrix_get - &__GLEW_OES_matrix_get, -#endif -#ifdef GL_OES_matrix_palette - &__GLEW_OES_matrix_palette, -#endif -#ifdef GL_OES_packed_depth_stencil - &__GLEW_OES_packed_depth_stencil, -#endif -#ifdef GL_OES_point_size_array - &__GLEW_OES_point_size_array, -#endif -#ifdef GL_OES_point_sprite - &__GLEW_OES_point_sprite, -#endif -#ifdef GL_OES_read_format - &__GLEW_OES_read_format, -#endif -#ifdef GL_OES_required_internalformat - &__GLEW_OES_required_internalformat, -#endif -#ifdef GL_OES_rgb8_rgba8 - &__GLEW_OES_rgb8_rgba8, -#endif -#ifdef GL_OES_sample_shading - &__GLEW_OES_sample_shading, -#endif -#ifdef GL_OES_sample_variables - &__GLEW_OES_sample_variables, -#endif -#ifdef GL_OES_shader_image_atomic - &__GLEW_OES_shader_image_atomic, -#endif -#ifdef GL_OES_shader_io_blocks - &__GLEW_OES_shader_io_blocks, -#endif -#ifdef GL_OES_shader_multisample_interpolation - &__GLEW_OES_shader_multisample_interpolation, -#endif -#ifdef GL_OES_single_precision - &__GLEW_OES_single_precision, -#endif -#ifdef GL_OES_standard_derivatives - &__GLEW_OES_standard_derivatives, -#endif -#ifdef GL_OES_stencil1 - &__GLEW_OES_stencil1, -#endif -#ifdef GL_OES_stencil4 - &__GLEW_OES_stencil4, -#endif -#ifdef GL_OES_stencil8 - &__GLEW_OES_stencil8, -#endif -#ifdef GL_OES_surfaceless_context - &__GLEW_OES_surfaceless_context, -#endif -#ifdef GL_OES_tessellation_point_size - &__GLEW_OES_tessellation_point_size, -#endif -#ifdef GL_OES_tessellation_shader - &__GLEW_OES_tessellation_shader, -#endif -#ifdef GL_OES_texture_3D - &__GLEW_OES_texture_3D, -#endif -#ifdef GL_OES_texture_border_clamp - &__GLEW_OES_texture_border_clamp, -#endif -#ifdef GL_OES_texture_buffer - &__GLEW_OES_texture_buffer, -#endif -#ifdef GL_OES_texture_compression_astc - &__GLEW_OES_texture_compression_astc, -#endif -#ifdef GL_OES_texture_cube_map - &__GLEW_OES_texture_cube_map, -#endif -#ifdef GL_OES_texture_cube_map_array - &__GLEW_OES_texture_cube_map_array, -#endif -#ifdef GL_OES_texture_env_crossbar - &__GLEW_OES_texture_env_crossbar, -#endif -#ifdef GL_OES_texture_mirrored_repeat - &__GLEW_OES_texture_mirrored_repeat, -#endif -#ifdef GL_OES_texture_npot - &__GLEW_OES_texture_npot, -#endif -#ifdef GL_OES_texture_stencil8 - &__GLEW_OES_texture_stencil8, -#endif -#ifdef GL_OES_texture_storage_multisample_2d_array - &__GLEW_OES_texture_storage_multisample_2d_array, -#endif -#ifdef GL_OES_texture_view - &__GLEW_OES_texture_view, -#endif -#ifdef GL_OES_vertex_array_object - &__GLEW_OES_vertex_array_object, -#endif -#ifdef GL_OES_vertex_half_float - &__GLEW_OES_vertex_half_float, -#endif -#ifdef GL_OES_vertex_type_10_10_10_2 - &__GLEW_OES_vertex_type_10_10_10_2, -#endif -#ifdef GL_OML_interlace - &__GLEW_OML_interlace, -#endif -#ifdef GL_OML_resample - &__GLEW_OML_resample, -#endif -#ifdef GL_OML_subsample - &__GLEW_OML_subsample, -#endif -#ifdef GL_OVR_multiview - &__GLEW_OVR_multiview, -#endif -#ifdef GL_OVR_multiview2 - &__GLEW_OVR_multiview2, -#endif -#ifdef GL_OVR_multiview_multisampled_render_to_texture - &__GLEW_OVR_multiview_multisampled_render_to_texture, -#endif -#ifdef GL_PGI_misc_hints - &__GLEW_PGI_misc_hints, -#endif -#ifdef GL_PGI_vertex_hints - &__GLEW_PGI_vertex_hints, -#endif -#ifdef GL_QCOM_YUV_texture_gather - &__GLEW_QCOM_YUV_texture_gather, -#endif -#ifdef GL_QCOM_alpha_test - &__GLEW_QCOM_alpha_test, -#endif -#ifdef GL_QCOM_binning_control - &__GLEW_QCOM_binning_control, -#endif -#ifdef GL_QCOM_driver_control - &__GLEW_QCOM_driver_control, -#endif -#ifdef GL_QCOM_extended_get - &__GLEW_QCOM_extended_get, -#endif -#ifdef GL_QCOM_extended_get2 - &__GLEW_QCOM_extended_get2, -#endif -#ifdef GL_QCOM_framebuffer_foveated - &__GLEW_QCOM_framebuffer_foveated, -#endif -#ifdef GL_QCOM_perfmon_global_mode - &__GLEW_QCOM_perfmon_global_mode, -#endif -#ifdef GL_QCOM_shader_framebuffer_fetch_noncoherent - &__GLEW_QCOM_shader_framebuffer_fetch_noncoherent, -#endif -#ifdef GL_QCOM_shader_framebuffer_fetch_rate - &__GLEW_QCOM_shader_framebuffer_fetch_rate, -#endif -#ifdef GL_QCOM_texture_foveated - &__GLEW_QCOM_texture_foveated, -#endif -#ifdef GL_QCOM_texture_foveated_subsampled_layout - &__GLEW_QCOM_texture_foveated_subsampled_layout, -#endif -#ifdef GL_QCOM_tiled_rendering - &__GLEW_QCOM_tiled_rendering, -#endif -#ifdef GL_QCOM_writeonly_rendering - &__GLEW_QCOM_writeonly_rendering, -#endif -#ifdef GL_REGAL_ES1_0_compatibility - &__GLEW_REGAL_ES1_0_compatibility, -#endif -#ifdef GL_REGAL_ES1_1_compatibility - &__GLEW_REGAL_ES1_1_compatibility, -#endif -#ifdef GL_REGAL_enable - &__GLEW_REGAL_enable, -#endif -#ifdef GL_REGAL_error_string - &__GLEW_REGAL_error_string, -#endif -#ifdef GL_REGAL_extension_query - &__GLEW_REGAL_extension_query, -#endif -#ifdef GL_REGAL_log - &__GLEW_REGAL_log, -#endif -#ifdef GL_REGAL_proc_address - &__GLEW_REGAL_proc_address, -#endif -#ifdef GL_REND_screen_coordinates - &__GLEW_REND_screen_coordinates, -#endif -#ifdef GL_S3_s3tc - &__GLEW_S3_s3tc, -#endif -#ifdef GL_SGIS_clip_band_hint - &__GLEW_SGIS_clip_band_hint, -#endif -#ifdef GL_SGIS_color_range - &__GLEW_SGIS_color_range, -#endif -#ifdef GL_SGIS_detail_texture - &__GLEW_SGIS_detail_texture, -#endif -#ifdef GL_SGIS_fog_function - &__GLEW_SGIS_fog_function, -#endif -#ifdef GL_SGIS_generate_mipmap - &__GLEW_SGIS_generate_mipmap, -#endif -#ifdef GL_SGIS_line_texgen - &__GLEW_SGIS_line_texgen, -#endif -#ifdef GL_SGIS_multisample - &__GLEW_SGIS_multisample, -#endif -#ifdef GL_SGIS_multitexture - &__GLEW_SGIS_multitexture, -#endif -#ifdef GL_SGIS_pixel_texture - &__GLEW_SGIS_pixel_texture, -#endif -#ifdef GL_SGIS_point_line_texgen - &__GLEW_SGIS_point_line_texgen, -#endif -#ifdef GL_SGIS_shared_multisample - &__GLEW_SGIS_shared_multisample, -#endif -#ifdef GL_SGIS_sharpen_texture - &__GLEW_SGIS_sharpen_texture, -#endif -#ifdef GL_SGIS_texture4D - &__GLEW_SGIS_texture4D, -#endif -#ifdef GL_SGIS_texture_border_clamp - &__GLEW_SGIS_texture_border_clamp, -#endif -#ifdef GL_SGIS_texture_edge_clamp - &__GLEW_SGIS_texture_edge_clamp, -#endif -#ifdef GL_SGIS_texture_filter4 - &__GLEW_SGIS_texture_filter4, -#endif -#ifdef GL_SGIS_texture_lod - &__GLEW_SGIS_texture_lod, -#endif -#ifdef GL_SGIS_texture_select - &__GLEW_SGIS_texture_select, -#endif -#ifdef GL_SGIX_async - &__GLEW_SGIX_async, -#endif -#ifdef GL_SGIX_async_histogram - &__GLEW_SGIX_async_histogram, -#endif -#ifdef GL_SGIX_async_pixel - &__GLEW_SGIX_async_pixel, -#endif -#ifdef GL_SGIX_bali_g_instruments - &__GLEW_SGIX_bali_g_instruments, -#endif -#ifdef GL_SGIX_bali_r_instruments - &__GLEW_SGIX_bali_r_instruments, -#endif -#ifdef GL_SGIX_bali_timer_instruments - &__GLEW_SGIX_bali_timer_instruments, -#endif -#ifdef GL_SGIX_blend_alpha_minmax - &__GLEW_SGIX_blend_alpha_minmax, -#endif -#ifdef GL_SGIX_blend_cadd - &__GLEW_SGIX_blend_cadd, -#endif -#ifdef GL_SGIX_blend_cmultiply - &__GLEW_SGIX_blend_cmultiply, -#endif -#ifdef GL_SGIX_calligraphic_fragment - &__GLEW_SGIX_calligraphic_fragment, -#endif -#ifdef GL_SGIX_clipmap - &__GLEW_SGIX_clipmap, -#endif -#ifdef GL_SGIX_color_matrix_accuracy - &__GLEW_SGIX_color_matrix_accuracy, -#endif -#ifdef GL_SGIX_color_table_index_mode - &__GLEW_SGIX_color_table_index_mode, -#endif -#ifdef GL_SGIX_complex_polar - &__GLEW_SGIX_complex_polar, -#endif -#ifdef GL_SGIX_convolution_accuracy - &__GLEW_SGIX_convolution_accuracy, -#endif -#ifdef GL_SGIX_cube_map - &__GLEW_SGIX_cube_map, -#endif -#ifdef GL_SGIX_cylinder_texgen - &__GLEW_SGIX_cylinder_texgen, -#endif -#ifdef GL_SGIX_datapipe - &__GLEW_SGIX_datapipe, -#endif -#ifdef GL_SGIX_decimation - &__GLEW_SGIX_decimation, -#endif -#ifdef GL_SGIX_depth_pass_instrument - &__GLEW_SGIX_depth_pass_instrument, -#endif -#ifdef GL_SGIX_depth_texture - &__GLEW_SGIX_depth_texture, -#endif -#ifdef GL_SGIX_dvc - &__GLEW_SGIX_dvc, -#endif -#ifdef GL_SGIX_flush_raster - &__GLEW_SGIX_flush_raster, -#endif -#ifdef GL_SGIX_fog_blend - &__GLEW_SGIX_fog_blend, -#endif -#ifdef GL_SGIX_fog_factor_to_alpha - &__GLEW_SGIX_fog_factor_to_alpha, -#endif -#ifdef GL_SGIX_fog_layers - &__GLEW_SGIX_fog_layers, -#endif -#ifdef GL_SGIX_fog_offset - &__GLEW_SGIX_fog_offset, -#endif -#ifdef GL_SGIX_fog_patchy - &__GLEW_SGIX_fog_patchy, -#endif -#ifdef GL_SGIX_fog_scale - &__GLEW_SGIX_fog_scale, -#endif -#ifdef GL_SGIX_fog_texture - &__GLEW_SGIX_fog_texture, -#endif -#ifdef GL_SGIX_fragment_lighting_space - &__GLEW_SGIX_fragment_lighting_space, -#endif -#ifdef GL_SGIX_fragment_specular_lighting - &__GLEW_SGIX_fragment_specular_lighting, -#endif -#ifdef GL_SGIX_fragments_instrument - &__GLEW_SGIX_fragments_instrument, -#endif -#ifdef GL_SGIX_framezoom - &__GLEW_SGIX_framezoom, -#endif -#ifdef GL_SGIX_icc_texture - &__GLEW_SGIX_icc_texture, -#endif -#ifdef GL_SGIX_igloo_interface - &__GLEW_SGIX_igloo_interface, -#endif -#ifdef GL_SGIX_image_compression - &__GLEW_SGIX_image_compression, -#endif -#ifdef GL_SGIX_impact_pixel_texture - &__GLEW_SGIX_impact_pixel_texture, -#endif -#ifdef GL_SGIX_instrument_error - &__GLEW_SGIX_instrument_error, -#endif -#ifdef GL_SGIX_interlace - &__GLEW_SGIX_interlace, -#endif -#ifdef GL_SGIX_ir_instrument1 - &__GLEW_SGIX_ir_instrument1, -#endif -#ifdef GL_SGIX_line_quality_hint - &__GLEW_SGIX_line_quality_hint, -#endif -#ifdef GL_SGIX_list_priority - &__GLEW_SGIX_list_priority, -#endif -#ifdef GL_SGIX_mpeg1 - &__GLEW_SGIX_mpeg1, -#endif -#ifdef GL_SGIX_mpeg2 - &__GLEW_SGIX_mpeg2, -#endif -#ifdef GL_SGIX_nonlinear_lighting_pervertex - &__GLEW_SGIX_nonlinear_lighting_pervertex, -#endif -#ifdef GL_SGIX_nurbs_eval - &__GLEW_SGIX_nurbs_eval, -#endif -#ifdef GL_SGIX_occlusion_instrument - &__GLEW_SGIX_occlusion_instrument, -#endif -#ifdef GL_SGIX_packed_6bytes - &__GLEW_SGIX_packed_6bytes, -#endif -#ifdef GL_SGIX_pixel_texture - &__GLEW_SGIX_pixel_texture, -#endif -#ifdef GL_SGIX_pixel_texture_bits - &__GLEW_SGIX_pixel_texture_bits, -#endif -#ifdef GL_SGIX_pixel_texture_lod - &__GLEW_SGIX_pixel_texture_lod, -#endif -#ifdef GL_SGIX_pixel_tiles - &__GLEW_SGIX_pixel_tiles, -#endif -#ifdef GL_SGIX_polynomial_ffd - &__GLEW_SGIX_polynomial_ffd, -#endif -#ifdef GL_SGIX_quad_mesh - &__GLEW_SGIX_quad_mesh, -#endif -#ifdef GL_SGIX_reference_plane - &__GLEW_SGIX_reference_plane, -#endif -#ifdef GL_SGIX_resample - &__GLEW_SGIX_resample, -#endif -#ifdef GL_SGIX_scalebias_hint - &__GLEW_SGIX_scalebias_hint, -#endif -#ifdef GL_SGIX_shadow - &__GLEW_SGIX_shadow, -#endif -#ifdef GL_SGIX_shadow_ambient - &__GLEW_SGIX_shadow_ambient, -#endif -#ifdef GL_SGIX_slim - &__GLEW_SGIX_slim, -#endif -#ifdef GL_SGIX_spotlight_cutoff - &__GLEW_SGIX_spotlight_cutoff, -#endif -#ifdef GL_SGIX_sprite - &__GLEW_SGIX_sprite, -#endif -#ifdef GL_SGIX_subdiv_patch - &__GLEW_SGIX_subdiv_patch, -#endif -#ifdef GL_SGIX_subsample - &__GLEW_SGIX_subsample, -#endif -#ifdef GL_SGIX_tag_sample_buffer - &__GLEW_SGIX_tag_sample_buffer, -#endif -#ifdef GL_SGIX_texture_add_env - &__GLEW_SGIX_texture_add_env, -#endif -#ifdef GL_SGIX_texture_coordinate_clamp - &__GLEW_SGIX_texture_coordinate_clamp, -#endif -#ifdef GL_SGIX_texture_lod_bias - &__GLEW_SGIX_texture_lod_bias, -#endif -#ifdef GL_SGIX_texture_mipmap_anisotropic - &__GLEW_SGIX_texture_mipmap_anisotropic, -#endif -#ifdef GL_SGIX_texture_multi_buffer - &__GLEW_SGIX_texture_multi_buffer, -#endif -#ifdef GL_SGIX_texture_phase - &__GLEW_SGIX_texture_phase, -#endif -#ifdef GL_SGIX_texture_range - &__GLEW_SGIX_texture_range, -#endif -#ifdef GL_SGIX_texture_scale_bias - &__GLEW_SGIX_texture_scale_bias, -#endif -#ifdef GL_SGIX_texture_supersample - &__GLEW_SGIX_texture_supersample, -#endif -#ifdef GL_SGIX_vector_ops - &__GLEW_SGIX_vector_ops, -#endif -#ifdef GL_SGIX_vertex_array_object - &__GLEW_SGIX_vertex_array_object, -#endif -#ifdef GL_SGIX_vertex_preclip - &__GLEW_SGIX_vertex_preclip, -#endif -#ifdef GL_SGIX_vertex_preclip_hint - &__GLEW_SGIX_vertex_preclip_hint, -#endif -#ifdef GL_SGIX_ycrcb - &__GLEW_SGIX_ycrcb, -#endif -#ifdef GL_SGIX_ycrcb_subsample - &__GLEW_SGIX_ycrcb_subsample, -#endif -#ifdef GL_SGIX_ycrcba - &__GLEW_SGIX_ycrcba, -#endif -#ifdef GL_SGI_color_matrix - &__GLEW_SGI_color_matrix, -#endif -#ifdef GL_SGI_color_table - &__GLEW_SGI_color_table, -#endif -#ifdef GL_SGI_complex - &__GLEW_SGI_complex, -#endif -#ifdef GL_SGI_complex_type - &__GLEW_SGI_complex_type, -#endif -#ifdef GL_SGI_fft - &__GLEW_SGI_fft, -#endif -#ifdef GL_SGI_texture_color_table - &__GLEW_SGI_texture_color_table, -#endif -#ifdef GL_SUNX_constant_data - &__GLEW_SUNX_constant_data, -#endif -#ifdef GL_SUN_convolution_border_modes - &__GLEW_SUN_convolution_border_modes, -#endif -#ifdef GL_SUN_global_alpha - &__GLEW_SUN_global_alpha, -#endif -#ifdef GL_SUN_mesh_array - &__GLEW_SUN_mesh_array, -#endif -#ifdef GL_SUN_read_video_pixels - &__GLEW_SUN_read_video_pixels, -#endif -#ifdef GL_SUN_slice_accum - &__GLEW_SUN_slice_accum, -#endif -#ifdef GL_SUN_triangle_list - &__GLEW_SUN_triangle_list, -#endif -#ifdef GL_SUN_vertex - &__GLEW_SUN_vertex, -#endif -#ifdef GL_VERSION_1_2 - &__GLEW_VERSION_1_2, -#endif -#ifdef GL_VERSION_1_2_1 - &__GLEW_VERSION_1_2_1, -#endif -#ifdef GL_VERSION_1_3 - &__GLEW_VERSION_1_3, -#endif -#ifdef GL_VERSION_1_4 - &__GLEW_VERSION_1_4, -#endif -#ifdef GL_VERSION_1_5 - &__GLEW_VERSION_1_5, -#endif -#ifdef GL_VERSION_2_0 - &__GLEW_VERSION_2_0, -#endif -#ifdef GL_VERSION_2_1 - &__GLEW_VERSION_2_1, -#endif -#ifdef GL_VERSION_3_0 - &__GLEW_VERSION_3_0, -#endif -#ifdef GL_VERSION_3_1 - &__GLEW_VERSION_3_1, -#endif -#ifdef GL_VERSION_3_2 - &__GLEW_VERSION_3_2, -#endif -#ifdef GL_VERSION_3_3 - &__GLEW_VERSION_3_3, -#endif -#ifdef GL_VERSION_4_0 - &__GLEW_VERSION_4_0, -#endif -#ifdef GL_VERSION_4_1 - &__GLEW_VERSION_4_1, -#endif -#ifdef GL_VERSION_4_2 - &__GLEW_VERSION_4_2, -#endif -#ifdef GL_VERSION_4_3 - &__GLEW_VERSION_4_3, -#endif -#ifdef GL_VERSION_4_4 - &__GLEW_VERSION_4_4, -#endif -#ifdef GL_VERSION_4_5 - &__GLEW_VERSION_4_5, -#endif -#ifdef GL_VERSION_4_6 - &__GLEW_VERSION_4_6, -#endif -#ifdef GL_VIV_shader_binary - &__GLEW_VIV_shader_binary, -#endif -#ifdef GL_WIN_phong_shading - &__GLEW_WIN_phong_shading, -#endif -#ifdef GL_WIN_scene_markerXXX - &__GLEW_WIN_scene_markerXXX, -#endif -#ifdef GL_WIN_specular_fog - &__GLEW_WIN_specular_fog, -#endif -#ifdef GL_WIN_swap_hint - &__GLEW_WIN_swap_hint, -#endif - NULL -}; - -static GLboolean _glewInit_GL_VERSION_1_2 (); -static GLboolean _glewInit_GL_VERSION_1_3 (); -static GLboolean _glewInit_GL_VERSION_1_4 (); -static GLboolean _glewInit_GL_VERSION_1_5 (); -static GLboolean _glewInit_GL_VERSION_2_0 (); -static GLboolean _glewInit_GL_VERSION_2_1 (); -static GLboolean _glewInit_GL_VERSION_3_0 (); -static GLboolean _glewInit_GL_VERSION_3_1 (); -static GLboolean _glewInit_GL_VERSION_3_2 (); -static GLboolean _glewInit_GL_VERSION_3_3 (); -static GLboolean _glewInit_GL_VERSION_4_0 (); -static GLboolean _glewInit_GL_VERSION_4_5 (); -static GLboolean _glewInit_GL_VERSION_4_6 (); -static GLboolean _glewInit_GL_3DFX_tbuffer (); -static GLboolean _glewInit_GL_AMD_debug_output (); -static GLboolean _glewInit_GL_AMD_draw_buffers_blend (); -static GLboolean _glewInit_GL_AMD_framebuffer_multisample_advanced (); -static GLboolean _glewInit_GL_AMD_framebuffer_sample_positions (); -static GLboolean _glewInit_GL_AMD_interleaved_elements (); -static GLboolean _glewInit_GL_AMD_multi_draw_indirect (); -static GLboolean _glewInit_GL_AMD_name_gen_delete (); -static GLboolean _glewInit_GL_AMD_occlusion_query_event (); -static GLboolean _glewInit_GL_AMD_performance_monitor (); -static GLboolean _glewInit_GL_AMD_sample_positions (); -static GLboolean _glewInit_GL_AMD_sparse_texture (); -static GLboolean _glewInit_GL_AMD_stencil_operation_extended (); -static GLboolean _glewInit_GL_AMD_vertex_shader_tessellator (); -static GLboolean _glewInit_GL_ANGLE_framebuffer_blit (); -static GLboolean _glewInit_GL_ANGLE_framebuffer_multisample (); -static GLboolean _glewInit_GL_ANGLE_instanced_arrays (); -static GLboolean _glewInit_GL_ANGLE_timer_query (); -static GLboolean _glewInit_GL_ANGLE_translated_shader_source (); -static GLboolean _glewInit_GL_APPLE_copy_texture_levels (); -static GLboolean _glewInit_GL_APPLE_element_array (); -static GLboolean _glewInit_GL_APPLE_fence (); -static GLboolean _glewInit_GL_APPLE_flush_buffer_range (); -static GLboolean _glewInit_GL_APPLE_framebuffer_multisample (); -static GLboolean _glewInit_GL_APPLE_object_purgeable (); -static GLboolean _glewInit_GL_APPLE_sync (); -static GLboolean _glewInit_GL_APPLE_texture_range (); -static GLboolean _glewInit_GL_APPLE_vertex_array_object (); -static GLboolean _glewInit_GL_APPLE_vertex_array_range (); -static GLboolean _glewInit_GL_APPLE_vertex_program_evaluators (); -static GLboolean _glewInit_GL_ARB_ES2_compatibility (); -static GLboolean _glewInit_GL_ARB_ES3_1_compatibility (); -static GLboolean _glewInit_GL_ARB_ES3_2_compatibility (); -static GLboolean _glewInit_GL_ARB_base_instance (); -static GLboolean _glewInit_GL_ARB_bindless_texture (); -static GLboolean _glewInit_GL_ARB_blend_func_extended (); -static GLboolean _glewInit_GL_ARB_buffer_storage (); -static GLboolean _glewInit_GL_ARB_cl_event (); -static GLboolean _glewInit_GL_ARB_clear_buffer_object (); -static GLboolean _glewInit_GL_ARB_clear_texture (); -static GLboolean _glewInit_GL_ARB_clip_control (); -static GLboolean _glewInit_GL_ARB_color_buffer_float (); -static GLboolean _glewInit_GL_ARB_compute_shader (); -static GLboolean _glewInit_GL_ARB_compute_variable_group_size (); -static GLboolean _glewInit_GL_ARB_copy_buffer (); -static GLboolean _glewInit_GL_ARB_copy_image (); -static GLboolean _glewInit_GL_ARB_debug_output (); -static GLboolean _glewInit_GL_ARB_direct_state_access (); -static GLboolean _glewInit_GL_ARB_draw_buffers (); -static GLboolean _glewInit_GL_ARB_draw_buffers_blend (); -static GLboolean _glewInit_GL_ARB_draw_elements_base_vertex (); -static GLboolean _glewInit_GL_ARB_draw_indirect (); -static GLboolean _glewInit_GL_ARB_framebuffer_no_attachments (); -static GLboolean _glewInit_GL_ARB_framebuffer_object (); -static GLboolean _glewInit_GL_ARB_geometry_shader4 (); -static GLboolean _glewInit_GL_ARB_get_program_binary (); -static GLboolean _glewInit_GL_ARB_get_texture_sub_image (); -static GLboolean _glewInit_GL_ARB_gl_spirv (); -static GLboolean _glewInit_GL_ARB_gpu_shader_fp64 (); -static GLboolean _glewInit_GL_ARB_gpu_shader_int64 (); -static GLboolean _glewInit_GL_ARB_imaging (); -static GLboolean _glewInit_GL_ARB_indirect_parameters (); -static GLboolean _glewInit_GL_ARB_instanced_arrays (); -static GLboolean _glewInit_GL_ARB_internalformat_query (); -static GLboolean _glewInit_GL_ARB_internalformat_query2 (); -static GLboolean _glewInit_GL_ARB_invalidate_subdata (); -static GLboolean _glewInit_GL_ARB_map_buffer_range (); -static GLboolean _glewInit_GL_ARB_matrix_palette (); -static GLboolean _glewInit_GL_ARB_multi_bind (); -static GLboolean _glewInit_GL_ARB_multi_draw_indirect (); -static GLboolean _glewInit_GL_ARB_multisample (); -static GLboolean _glewInit_GL_ARB_multitexture (); -static GLboolean _glewInit_GL_ARB_occlusion_query (); -static GLboolean _glewInit_GL_ARB_parallel_shader_compile (); -static GLboolean _glewInit_GL_ARB_point_parameters (); -static GLboolean _glewInit_GL_ARB_polygon_offset_clamp (); -static GLboolean _glewInit_GL_ARB_program_interface_query (); -static GLboolean _glewInit_GL_ARB_provoking_vertex (); -static GLboolean _glewInit_GL_ARB_robustness (); -static GLboolean _glewInit_GL_ARB_sample_locations (); -static GLboolean _glewInit_GL_ARB_sample_shading (); -static GLboolean _glewInit_GL_ARB_sampler_objects (); -static GLboolean _glewInit_GL_ARB_separate_shader_objects (); -static GLboolean _glewInit_GL_ARB_shader_atomic_counters (); -static GLboolean _glewInit_GL_ARB_shader_image_load_store (); -static GLboolean _glewInit_GL_ARB_shader_objects (); -static GLboolean _glewInit_GL_ARB_shader_storage_buffer_object (); -static GLboolean _glewInit_GL_ARB_shader_subroutine (); -static GLboolean _glewInit_GL_ARB_shading_language_include (); -static GLboolean _glewInit_GL_ARB_sparse_buffer (); -static GLboolean _glewInit_GL_ARB_sparse_texture (); -static GLboolean _glewInit_GL_ARB_sync (); -static GLboolean _glewInit_GL_ARB_tessellation_shader (); -static GLboolean _glewInit_GL_ARB_texture_barrier (); -static GLboolean _glewInit_GL_ARB_texture_buffer_object (); -static GLboolean _glewInit_GL_ARB_texture_buffer_range (); -static GLboolean _glewInit_GL_ARB_texture_compression (); -static GLboolean _glewInit_GL_ARB_texture_multisample (); -static GLboolean _glewInit_GL_ARB_texture_storage (); -static GLboolean _glewInit_GL_ARB_texture_storage_multisample (); -static GLboolean _glewInit_GL_ARB_texture_view (); -static GLboolean _glewInit_GL_ARB_timer_query (); -static GLboolean _glewInit_GL_ARB_transform_feedback2 (); -static GLboolean _glewInit_GL_ARB_transform_feedback3 (); -static GLboolean _glewInit_GL_ARB_transform_feedback_instanced (); -static GLboolean _glewInit_GL_ARB_transpose_matrix (); -static GLboolean _glewInit_GL_ARB_uniform_buffer_object (); -static GLboolean _glewInit_GL_ARB_vertex_array_object (); -static GLboolean _glewInit_GL_ARB_vertex_attrib_64bit (); -static GLboolean _glewInit_GL_ARB_vertex_attrib_binding (); -static GLboolean _glewInit_GL_ARB_vertex_blend (); -static GLboolean _glewInit_GL_ARB_vertex_buffer_object (); -static GLboolean _glewInit_GL_ARB_vertex_program (); -static GLboolean _glewInit_GL_ARB_vertex_shader (); -static GLboolean _glewInit_GL_ARB_vertex_type_2_10_10_10_rev (); -static GLboolean _glewInit_GL_ARB_viewport_array (); -static GLboolean _glewInit_GL_ARB_window_pos (); -static GLboolean _glewInit_GL_ATI_draw_buffers (); -static GLboolean _glewInit_GL_ATI_element_array (); -static GLboolean _glewInit_GL_ATI_envmap_bumpmap (); -static GLboolean _glewInit_GL_ATI_fragment_shader (); -static GLboolean _glewInit_GL_ATI_map_object_buffer (); -static GLboolean _glewInit_GL_ATI_pn_triangles (); -static GLboolean _glewInit_GL_ATI_separate_stencil (); -static GLboolean _glewInit_GL_ATI_vertex_array_object (); -static GLboolean _glewInit_GL_ATI_vertex_attrib_array_object (); -static GLboolean _glewInit_GL_ATI_vertex_streams (); -static GLboolean _glewInit_GL_EXT_EGL_image_storage (); -static GLboolean _glewInit_GL_EXT_base_instance (); -static GLboolean _glewInit_GL_EXT_bindable_uniform (); -static GLboolean _glewInit_GL_EXT_blend_color (); -static GLboolean _glewInit_GL_EXT_blend_equation_separate (); -static GLboolean _glewInit_GL_EXT_blend_func_extended (); -static GLboolean _glewInit_GL_EXT_blend_func_separate (); -static GLboolean _glewInit_GL_EXT_blend_minmax (); -static GLboolean _glewInit_GL_EXT_buffer_storage (); -static GLboolean _glewInit_GL_EXT_clear_texture (); -static GLboolean _glewInit_GL_EXT_clip_control (); -static GLboolean _glewInit_GL_EXT_color_subtable (); -static GLboolean _glewInit_GL_EXT_compiled_vertex_array (); -static GLboolean _glewInit_GL_EXT_convolution (); -static GLboolean _glewInit_GL_EXT_coordinate_frame (); -static GLboolean _glewInit_GL_EXT_copy_image (); -static GLboolean _glewInit_GL_EXT_copy_texture (); -static GLboolean _glewInit_GL_EXT_cull_vertex (); -static GLboolean _glewInit_GL_EXT_debug_label (); -static GLboolean _glewInit_GL_EXT_debug_marker (); -static GLboolean _glewInit_GL_EXT_depth_bounds_test (); -static GLboolean _glewInit_GL_EXT_direct_state_access (); -static GLboolean _glewInit_GL_EXT_discard_framebuffer (); -static GLboolean _glewInit_GL_EXT_disjoint_timer_query (); -static GLboolean _glewInit_GL_EXT_draw_buffers (); -static GLboolean _glewInit_GL_EXT_draw_buffers2 (); -static GLboolean _glewInit_GL_EXT_draw_buffers_indexed (); -static GLboolean _glewInit_GL_EXT_draw_elements_base_vertex (); -static GLboolean _glewInit_GL_EXT_draw_instanced (); -static GLboolean _glewInit_GL_EXT_draw_range_elements (); -static GLboolean _glewInit_GL_EXT_draw_transform_feedback (); -static GLboolean _glewInit_GL_EXT_external_buffer (); -static GLboolean _glewInit_GL_EXT_fog_coord (); -static GLboolean _glewInit_GL_EXT_fragment_lighting (); -static GLboolean _glewInit_GL_EXT_framebuffer_blit (); -static GLboolean _glewInit_GL_EXT_framebuffer_multisample (); -static GLboolean _glewInit_GL_EXT_framebuffer_object (); -static GLboolean _glewInit_GL_EXT_geometry_shader4 (); -static GLboolean _glewInit_GL_EXT_gpu_program_parameters (); -static GLboolean _glewInit_GL_EXT_gpu_shader4 (); -static GLboolean _glewInit_GL_EXT_histogram (); -static GLboolean _glewInit_GL_EXT_index_func (); -static GLboolean _glewInit_GL_EXT_index_material (); -static GLboolean _glewInit_GL_EXT_instanced_arrays (); -static GLboolean _glewInit_GL_EXT_light_texture (); -static GLboolean _glewInit_GL_EXT_map_buffer_range (); -static GLboolean _glewInit_GL_EXT_memory_object (); -static GLboolean _glewInit_GL_EXT_memory_object_fd (); -static GLboolean _glewInit_GL_EXT_memory_object_win32 (); -static GLboolean _glewInit_GL_EXT_multi_draw_arrays (); -static GLboolean _glewInit_GL_EXT_multi_draw_indirect (); -static GLboolean _glewInit_GL_EXT_multisample (); -static GLboolean _glewInit_GL_EXT_multisampled_render_to_texture (); -static GLboolean _glewInit_GL_EXT_multiview_draw_buffers (); -static GLboolean _glewInit_GL_EXT_paletted_texture (); -static GLboolean _glewInit_GL_EXT_pixel_transform (); -static GLboolean _glewInit_GL_EXT_point_parameters (); -static GLboolean _glewInit_GL_EXT_polygon_offset (); -static GLboolean _glewInit_GL_EXT_polygon_offset_clamp (); -static GLboolean _glewInit_GL_EXT_primitive_bounding_box (); -static GLboolean _glewInit_GL_EXT_provoking_vertex (); -static GLboolean _glewInit_GL_EXT_raster_multisample (); -static GLboolean _glewInit_GL_EXT_robustness (); -static GLboolean _glewInit_GL_EXT_scene_marker (); -static GLboolean _glewInit_GL_EXT_secondary_color (); -static GLboolean _glewInit_GL_EXT_semaphore (); -static GLboolean _glewInit_GL_EXT_semaphore_fd (); -static GLboolean _glewInit_GL_EXT_semaphore_win32 (); -static GLboolean _glewInit_GL_EXT_separate_shader_objects (); -static GLboolean _glewInit_GL_EXT_shader_framebuffer_fetch (); -static GLboolean _glewInit_GL_EXT_shader_image_load_store (); -static GLboolean _glewInit_GL_EXT_shader_pixel_local_storage2 (); -static GLboolean _glewInit_GL_EXT_sparse_texture (); -static GLboolean _glewInit_GL_EXT_stencil_two_side (); -static GLboolean _glewInit_GL_EXT_subtexture (); -static GLboolean _glewInit_GL_EXT_tessellation_point_size (); -static GLboolean _glewInit_GL_EXT_texture3D (); -static GLboolean _glewInit_GL_EXT_texture_array (); -static GLboolean _glewInit_GL_EXT_texture_border_clamp (); -static GLboolean _glewInit_GL_EXT_texture_buffer_object (); -static GLboolean _glewInit_GL_EXT_texture_integer (); -static GLboolean _glewInit_GL_EXT_texture_object (); -static GLboolean _glewInit_GL_EXT_texture_perturb_normal (); -static GLboolean _glewInit_GL_EXT_texture_storage (); -static GLboolean _glewInit_GL_EXT_texture_view (); -static GLboolean _glewInit_GL_EXT_timer_query (); -static GLboolean _glewInit_GL_EXT_transform_feedback (); -static GLboolean _glewInit_GL_EXT_vertex_array (); -static GLboolean _glewInit_GL_EXT_vertex_array_setXXX (); -static GLboolean _glewInit_GL_EXT_vertex_attrib_64bit (); -static GLboolean _glewInit_GL_EXT_vertex_shader (); -static GLboolean _glewInit_GL_EXT_vertex_weighting (); -static GLboolean _glewInit_GL_EXT_win32_keyed_mutex (); -static GLboolean _glewInit_GL_EXT_window_rectangles (); -static GLboolean _glewInit_GL_EXT_x11_sync_object (); -static GLboolean _glewInit_GL_GREMEDY_frame_terminator (); -static GLboolean _glewInit_GL_GREMEDY_string_marker (); -static GLboolean _glewInit_GL_HP_image_transform (); -static GLboolean _glewInit_GL_IBM_multimode_draw_arrays (); -static GLboolean _glewInit_GL_IBM_vertex_array_lists (); -static GLboolean _glewInit_GL_IMG_bindless_texture (); -static GLboolean _glewInit_GL_IMG_framebuffer_downsample (); -static GLboolean _glewInit_GL_IMG_multisampled_render_to_texture (); -static GLboolean _glewInit_GL_INTEL_map_texture (); -static GLboolean _glewInit_GL_INTEL_parallel_arrays (); -static GLboolean _glewInit_GL_INTEL_performance_query (); -static GLboolean _glewInit_GL_INTEL_texture_scissor (); -static GLboolean _glewInit_GL_KHR_blend_equation_advanced (); -static GLboolean _glewInit_GL_KHR_debug (); -static GLboolean _glewInit_GL_KHR_parallel_shader_compile (); -static GLboolean _glewInit_GL_KHR_robustness (); -static GLboolean _glewInit_GL_KTX_buffer_region (); -static GLboolean _glewInit_GL_MESA_framebuffer_flip_y (); -static GLboolean _glewInit_GL_MESA_resize_buffers (); -static GLboolean _glewInit_GL_MESA_window_pos (); -static GLboolean _glewInit_GL_NVX_conditional_render (); -static GLboolean _glewInit_GL_NVX_gpu_multicast2 (); -static GLboolean _glewInit_GL_NVX_linked_gpu_multicast (); -static GLboolean _glewInit_GL_NVX_progress_fence (); -static GLboolean _glewInit_GL_NV_3dvision_settings (); -static GLboolean _glewInit_GL_NV_alpha_to_coverage_dither_control (); -static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect (); -static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect_count (); -static GLboolean _glewInit_GL_NV_bindless_texture (); -static GLboolean _glewInit_GL_NV_blend_equation_advanced (); -static GLboolean _glewInit_GL_NV_clip_space_w_scaling (); -static GLboolean _glewInit_GL_NV_command_list (); -static GLboolean _glewInit_GL_NV_conditional_render (); -static GLboolean _glewInit_GL_NV_conservative_raster (); -static GLboolean _glewInit_GL_NV_conservative_raster_dilate (); -static GLboolean _glewInit_GL_NV_conservative_raster_pre_snap_triangles (); -static GLboolean _glewInit_GL_NV_copy_buffer (); -static GLboolean _glewInit_GL_NV_copy_image (); -static GLboolean _glewInit_GL_NV_depth_buffer_float (); -static GLboolean _glewInit_GL_NV_draw_buffers (); -static GLboolean _glewInit_GL_NV_draw_instanced (); -static GLboolean _glewInit_GL_NV_draw_texture (); -static GLboolean _glewInit_GL_NV_draw_vulkan_image (); -static GLboolean _glewInit_GL_NV_evaluators (); -static GLboolean _glewInit_GL_NV_explicit_multisample (); -static GLboolean _glewInit_GL_NV_fence (); -static GLboolean _glewInit_GL_NV_fragment_coverage_to_color (); -static GLboolean _glewInit_GL_NV_fragment_program (); -static GLboolean _glewInit_GL_NV_framebuffer_blit (); -static GLboolean _glewInit_GL_NV_framebuffer_multisample (); -static GLboolean _glewInit_GL_NV_framebuffer_multisample_coverage (); -static GLboolean _glewInit_GL_NV_geometry_program4 (); -static GLboolean _glewInit_GL_NV_gpu_multicast (); -static GLboolean _glewInit_GL_NV_gpu_program4 (); -static GLboolean _glewInit_GL_NV_gpu_shader5 (); -static GLboolean _glewInit_GL_NV_half_float (); -static GLboolean _glewInit_GL_NV_instanced_arrays (); -static GLboolean _glewInit_GL_NV_internalformat_sample_query (); -static GLboolean _glewInit_GL_NV_memory_attachment (); -static GLboolean _glewInit_GL_NV_mesh_shader (); -static GLboolean _glewInit_GL_NV_non_square_matrices (); -static GLboolean _glewInit_GL_NV_occlusion_query (); -static GLboolean _glewInit_GL_NV_parameter_buffer_object (); -static GLboolean _glewInit_GL_NV_path_rendering (); -static GLboolean _glewInit_GL_NV_pixel_data_range (); -static GLboolean _glewInit_GL_NV_point_sprite (); -static GLboolean _glewInit_GL_NV_polygon_mode (); -static GLboolean _glewInit_GL_NV_present_video (); -static GLboolean _glewInit_GL_NV_primitive_restart (); -static GLboolean _glewInit_GL_NV_read_buffer (); -static GLboolean _glewInit_GL_NV_register_combiners (); -static GLboolean _glewInit_GL_NV_register_combiners2 (); -static GLboolean _glewInit_GL_NV_sample_locations (); -static GLboolean _glewInit_GL_NV_scissor_exclusive (); -static GLboolean _glewInit_GL_NV_shader_buffer_load (); -static GLboolean _glewInit_GL_NV_shading_rate_image (); -static GLboolean _glewInit_GL_NV_texture_array (); -static GLboolean _glewInit_GL_NV_texture_barrier (); -static GLboolean _glewInit_GL_NV_texture_multisample (); -static GLboolean _glewInit_GL_NV_transform_feedback (); -static GLboolean _glewInit_GL_NV_transform_feedback2 (); -static GLboolean _glewInit_GL_NV_vdpau_interop (); -static GLboolean _glewInit_GL_NV_vdpau_interop2 (); -static GLboolean _glewInit_GL_NV_vertex_array_range (); -static GLboolean _glewInit_GL_NV_vertex_attrib_integer_64bit (); -static GLboolean _glewInit_GL_NV_vertex_buffer_unified_memory (); -static GLboolean _glewInit_GL_NV_vertex_program (); -static GLboolean _glewInit_GL_NV_video_capture (); -static GLboolean _glewInit_GL_NV_viewport_array (); -static GLboolean _glewInit_GL_NV_viewport_swizzle (); -static GLboolean _glewInit_GL_OES_EGL_image (); -static GLboolean _glewInit_GL_OES_blend_equation_separate (); -static GLboolean _glewInit_GL_OES_blend_func_separate (); -static GLboolean _glewInit_GL_OES_blend_subtract (); -static GLboolean _glewInit_GL_OES_copy_image (); -static GLboolean _glewInit_GL_OES_draw_buffers_indexed (); -static GLboolean _glewInit_GL_OES_framebuffer_object (); -static GLboolean _glewInit_GL_OES_get_program_binary (); -static GLboolean _glewInit_GL_OES_mapbuffer (); -static GLboolean _glewInit_GL_OES_matrix_palette (); -static GLboolean _glewInit_GL_OES_sample_shading (); -static GLboolean _glewInit_GL_OES_single_precision (); -static GLboolean _glewInit_GL_OES_texture_3D (); -static GLboolean _glewInit_GL_OES_texture_border_clamp (); -static GLboolean _glewInit_GL_OES_texture_buffer (); -static GLboolean _glewInit_GL_OES_texture_cube_map (); -static GLboolean _glewInit_GL_OES_texture_storage_multisample_2d_array (); -static GLboolean _glewInit_GL_OES_texture_view (); -static GLboolean _glewInit_GL_OES_vertex_array_object (); -static GLboolean _glewInit_GL_OVR_multiview (); -static GLboolean _glewInit_GL_OVR_multiview_multisampled_render_to_texture (); -static GLboolean _glewInit_GL_QCOM_alpha_test (); -static GLboolean _glewInit_GL_QCOM_driver_control (); -static GLboolean _glewInit_GL_QCOM_extended_get (); -static GLboolean _glewInit_GL_QCOM_extended_get2 (); -static GLboolean _glewInit_GL_QCOM_framebuffer_foveated (); -static GLboolean _glewInit_GL_QCOM_shader_framebuffer_fetch_noncoherent (); -static GLboolean _glewInit_GL_QCOM_texture_foveated (); -static GLboolean _glewInit_GL_QCOM_tiled_rendering (); -static GLboolean _glewInit_GL_REGAL_ES1_0_compatibility (); -static GLboolean _glewInit_GL_REGAL_ES1_1_compatibility (); -static GLboolean _glewInit_GL_REGAL_error_string (); -static GLboolean _glewInit_GL_REGAL_extension_query (); -static GLboolean _glewInit_GL_REGAL_log (); -static GLboolean _glewInit_GL_REGAL_proc_address (); -static GLboolean _glewInit_GL_SGIS_detail_texture (); -static GLboolean _glewInit_GL_SGIS_fog_function (); -static GLboolean _glewInit_GL_SGIS_multisample (); -static GLboolean _glewInit_GL_SGIS_multitexture (); -static GLboolean _glewInit_GL_SGIS_shared_multisample (); -static GLboolean _glewInit_GL_SGIS_sharpen_texture (); -static GLboolean _glewInit_GL_SGIS_texture4D (); -static GLboolean _glewInit_GL_SGIS_texture_filter4 (); -static GLboolean _glewInit_GL_SGIX_async (); -static GLboolean _glewInit_GL_SGIX_datapipe (); -static GLboolean _glewInit_GL_SGIX_flush_raster (); -static GLboolean _glewInit_GL_SGIX_fog_layers (); -static GLboolean _glewInit_GL_SGIX_fog_texture (); -static GLboolean _glewInit_GL_SGIX_fragment_specular_lighting (); -static GLboolean _glewInit_GL_SGIX_framezoom (); -static GLboolean _glewInit_GL_SGIX_igloo_interface (); -static GLboolean _glewInit_GL_SGIX_mpeg1 (); -static GLboolean _glewInit_GL_SGIX_nonlinear_lighting_pervertex (); -static GLboolean _glewInit_GL_SGIX_pixel_texture (); -static GLboolean _glewInit_GL_SGIX_polynomial_ffd (); -static GLboolean _glewInit_GL_SGIX_quad_mesh (); -static GLboolean _glewInit_GL_SGIX_reference_plane (); -static GLboolean _glewInit_GL_SGIX_sprite (); -static GLboolean _glewInit_GL_SGIX_tag_sample_buffer (); -static GLboolean _glewInit_GL_SGIX_vector_ops (); -static GLboolean _glewInit_GL_SGIX_vertex_array_object (); -static GLboolean _glewInit_GL_SGI_color_table (); -static GLboolean _glewInit_GL_SGI_fft (); -static GLboolean _glewInit_GL_SUNX_constant_data (); -static GLboolean _glewInit_GL_SUN_global_alpha (); -static GLboolean _glewInit_GL_SUN_read_video_pixels (); -static GLboolean _glewInit_GL_SUN_triangle_list (); -static GLboolean _glewInit_GL_SUN_vertex (); -static GLboolean _glewInit_GL_WIN_swap_hint (); - -#ifdef GL_VERSION_1_2 - -static GLboolean _glewInit_GL_VERSION_1_2 () -{ - GLboolean r = GL_FALSE; - - r = ((glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3D")) == NULL) || r; - r = ((glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElements")) == NULL) || r; - r = ((glTexImage3D = (PFNGLTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexImage3D")) == NULL) || r; - r = ((glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3D")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_1_2 */ - -#ifdef GL_VERSION_1_3 - -static GLboolean _glewInit_GL_VERSION_1_3 () -{ - GLboolean r = GL_FALSE; - - r = ((glActiveTexture = (PFNGLACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glActiveTexture")) == NULL) || r; - r = ((glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glClientActiveTexture")) == NULL) || r; - r = ((glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage1D")) == NULL) || r; - r = ((glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage2D")) == NULL) || r; - r = ((glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3D")) == NULL) || r; - r = ((glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage1D")) == NULL) || r; - r = ((glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage2D")) == NULL) || r; - r = ((glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3D")) == NULL) || r; - r = ((glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTexImage")) == NULL) || r; - r = ((glLoadTransposeMatrixd = (PFNGLLOADTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixd")) == NULL) || r; - r = ((glLoadTransposeMatrixf = (PFNGLLOADTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixf")) == NULL) || r; - r = ((glMultTransposeMatrixd = (PFNGLMULTTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixd")) == NULL) || r; - r = ((glMultTransposeMatrixf = (PFNGLMULTTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixf")) == NULL) || r; - r = ((glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1d")) == NULL) || r; - r = ((glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dv")) == NULL) || r; - r = ((glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1f")) == NULL) || r; - r = ((glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fv")) == NULL) || r; - r = ((glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1i")) == NULL) || r; - r = ((glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1iv")) == NULL) || r; - r = ((glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1s")) == NULL) || r; - r = ((glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1sv")) == NULL) || r; - r = ((glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2d")) == NULL) || r; - r = ((glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dv")) == NULL) || r; - r = ((glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2f")) == NULL) || r; - r = ((glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fv")) == NULL) || r; - r = ((glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2i")) == NULL) || r; - r = ((glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2iv")) == NULL) || r; - r = ((glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2s")) == NULL) || r; - r = ((glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2sv")) == NULL) || r; - r = ((glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3d")) == NULL) || r; - r = ((glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dv")) == NULL) || r; - r = ((glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3f")) == NULL) || r; - r = ((glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fv")) == NULL) || r; - r = ((glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3i")) == NULL) || r; - r = ((glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3iv")) == NULL) || r; - r = ((glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3s")) == NULL) || r; - r = ((glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3sv")) == NULL) || r; - r = ((glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4d")) == NULL) || r; - r = ((glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dv")) == NULL) || r; - r = ((glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4f")) == NULL) || r; - r = ((glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fv")) == NULL) || r; - r = ((glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4i")) == NULL) || r; - r = ((glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4iv")) == NULL) || r; - r = ((glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4s")) == NULL) || r; - r = ((glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4sv")) == NULL) || r; - r = ((glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC)glewGetProcAddress((const GLubyte*)"glSampleCoverage")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_1_3 */ - -#ifdef GL_VERSION_1_4 - -static GLboolean _glewInit_GL_VERSION_1_4 () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendColor = (PFNGLBLENDCOLORPROC)glewGetProcAddress((const GLubyte*)"glBlendColor")) == NULL) || r; - r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)"glBlendEquation")) == NULL) || r; - r = ((glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparate")) == NULL) || r; - r = ((glFogCoordPointer = (PFNGLFOGCOORDPOINTERPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointer")) == NULL) || r; - r = ((glFogCoordd = (PFNGLFOGCOORDDPROC)glewGetProcAddress((const GLubyte*)"glFogCoordd")) == NULL) || r; - r = ((glFogCoorddv = (PFNGLFOGCOORDDVPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddv")) == NULL) || r; - r = ((glFogCoordf = (PFNGLFOGCOORDFPROC)glewGetProcAddress((const GLubyte*)"glFogCoordf")) == NULL) || r; - r = ((glFogCoordfv = (PFNGLFOGCOORDFVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfv")) == NULL) || r; - r = ((glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArrays")) == NULL) || r; - r = ((glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElements")) == NULL) || r; - r = ((glPointParameterf = (PFNGLPOINTPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glPointParameterf")) == NULL) || r; - r = ((glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfv")) == NULL) || r; - r = ((glPointParameteri = (PFNGLPOINTPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glPointParameteri")) == NULL) || r; - r = ((glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glPointParameteriv")) == NULL) || r; - r = ((glSecondaryColor3b = (PFNGLSECONDARYCOLOR3BPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3b")) == NULL) || r; - r = ((glSecondaryColor3bv = (PFNGLSECONDARYCOLOR3BVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bv")) == NULL) || r; - r = ((glSecondaryColor3d = (PFNGLSECONDARYCOLOR3DPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3d")) == NULL) || r; - r = ((glSecondaryColor3dv = (PFNGLSECONDARYCOLOR3DVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dv")) == NULL) || r; - r = ((glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3f")) == NULL) || r; - r = ((glSecondaryColor3fv = (PFNGLSECONDARYCOLOR3FVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fv")) == NULL) || r; - r = ((glSecondaryColor3i = (PFNGLSECONDARYCOLOR3IPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3i")) == NULL) || r; - r = ((glSecondaryColor3iv = (PFNGLSECONDARYCOLOR3IVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3iv")) == NULL) || r; - r = ((glSecondaryColor3s = (PFNGLSECONDARYCOLOR3SPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3s")) == NULL) || r; - r = ((glSecondaryColor3sv = (PFNGLSECONDARYCOLOR3SVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3sv")) == NULL) || r; - r = ((glSecondaryColor3ub = (PFNGLSECONDARYCOLOR3UBPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ub")) == NULL) || r; - r = ((glSecondaryColor3ubv = (PFNGLSECONDARYCOLOR3UBVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubv")) == NULL) || r; - r = ((glSecondaryColor3ui = (PFNGLSECONDARYCOLOR3UIPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ui")) == NULL) || r; - r = ((glSecondaryColor3uiv = (PFNGLSECONDARYCOLOR3UIVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uiv")) == NULL) || r; - r = ((glSecondaryColor3us = (PFNGLSECONDARYCOLOR3USPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3us")) == NULL) || r; - r = ((glSecondaryColor3usv = (PFNGLSECONDARYCOLOR3USVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usv")) == NULL) || r; - r = ((glSecondaryColorPointer = (PFNGLSECONDARYCOLORPOINTERPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointer")) == NULL) || r; - r = ((glWindowPos2d = (PFNGLWINDOWPOS2DPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2d")) == NULL) || r; - r = ((glWindowPos2dv = (PFNGLWINDOWPOS2DVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dv")) == NULL) || r; - r = ((glWindowPos2f = (PFNGLWINDOWPOS2FPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2f")) == NULL) || r; - r = ((glWindowPos2fv = (PFNGLWINDOWPOS2FVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fv")) == NULL) || r; - r = ((glWindowPos2i = (PFNGLWINDOWPOS2IPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2i")) == NULL) || r; - r = ((glWindowPos2iv = (PFNGLWINDOWPOS2IVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iv")) == NULL) || r; - r = ((glWindowPos2s = (PFNGLWINDOWPOS2SPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2s")) == NULL) || r; - r = ((glWindowPos2sv = (PFNGLWINDOWPOS2SVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sv")) == NULL) || r; - r = ((glWindowPos3d = (PFNGLWINDOWPOS3DPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3d")) == NULL) || r; - r = ((glWindowPos3dv = (PFNGLWINDOWPOS3DVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dv")) == NULL) || r; - r = ((glWindowPos3f = (PFNGLWINDOWPOS3FPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3f")) == NULL) || r; - r = ((glWindowPos3fv = (PFNGLWINDOWPOS3FVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fv")) == NULL) || r; - r = ((glWindowPos3i = (PFNGLWINDOWPOS3IPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3i")) == NULL) || r; - r = ((glWindowPos3iv = (PFNGLWINDOWPOS3IVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iv")) == NULL) || r; - r = ((glWindowPos3s = (PFNGLWINDOWPOS3SPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3s")) == NULL) || r; - r = ((glWindowPos3sv = (PFNGLWINDOWPOS3SVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sv")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_1_4 */ - -#ifdef GL_VERSION_1_5 - -static GLboolean _glewInit_GL_VERSION_1_5 () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginQuery = (PFNGLBEGINQUERYPROC)glewGetProcAddress((const GLubyte*)"glBeginQuery")) == NULL) || r; - r = ((glBindBuffer = (PFNGLBINDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindBuffer")) == NULL) || r; - r = ((glBufferData = (PFNGLBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glBufferData")) == NULL) || r; - r = ((glBufferSubData = (PFNGLBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glBufferSubData")) == NULL) || r; - r = ((glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteBuffers")) == NULL) || r; - r = ((glDeleteQueries = (PFNGLDELETEQUERIESPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueries")) == NULL) || r; - r = ((glEndQuery = (PFNGLENDQUERYPROC)glewGetProcAddress((const GLubyte*)"glEndQuery")) == NULL) || r; - r = ((glGenBuffers = (PFNGLGENBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenBuffers")) == NULL) || r; - r = ((glGenQueries = (PFNGLGENQUERIESPROC)glewGetProcAddress((const GLubyte*)"glGenQueries")) == NULL) || r; - r = ((glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameteriv")) == NULL) || r; - r = ((glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferPointerv")) == NULL) || r; - r = ((glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glGetBufferSubData")) == NULL) || r; - r = ((glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectiv")) == NULL) || r; - r = ((glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuiv")) == NULL) || r; - r = ((glGetQueryiv = (PFNGLGETQUERYIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryiv")) == NULL) || r; - r = ((glIsBuffer = (PFNGLISBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsBuffer")) == NULL) || r; - r = ((glIsQuery = (PFNGLISQUERYPROC)glewGetProcAddress((const GLubyte*)"glIsQuery")) == NULL) || r; - r = ((glMapBuffer = (PFNGLMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glMapBuffer")) == NULL) || r; - r = ((glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glUnmapBuffer")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_1_5 */ - -#ifdef GL_VERSION_2_0 - -static GLboolean _glewInit_GL_VERSION_2_0 () -{ - GLboolean r = GL_FALSE; - - r = ((glAttachShader = (PFNGLATTACHSHADERPROC)glewGetProcAddress((const GLubyte*)"glAttachShader")) == NULL) || r; - r = ((glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glBindAttribLocation")) == NULL) || r; - r = ((glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparate")) == NULL) || r; - r = ((glCompileShader = (PFNGLCOMPILESHADERPROC)glewGetProcAddress((const GLubyte*)"glCompileShader")) == NULL) || r; - r = ((glCreateProgram = (PFNGLCREATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glCreateProgram")) == NULL) || r; - r = ((glCreateShader = (PFNGLCREATESHADERPROC)glewGetProcAddress((const GLubyte*)"glCreateShader")) == NULL) || r; - r = ((glDeleteProgram = (PFNGLDELETEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgram")) == NULL) || r; - r = ((glDeleteShader = (PFNGLDELETESHADERPROC)glewGetProcAddress((const GLubyte*)"glDeleteShader")) == NULL) || r; - r = ((glDetachShader = (PFNGLDETACHSHADERPROC)glewGetProcAddress((const GLubyte*)"glDetachShader")) == NULL) || r; - r = ((glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribArray")) == NULL) || r; - r = ((glDrawBuffers = (PFNGLDRAWBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffers")) == NULL) || r; - r = ((glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribArray")) == NULL) || r; - r = ((glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAttrib")) == NULL) || r; - r = ((glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniform")) == NULL) || r; - r = ((glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC)glewGetProcAddress((const GLubyte*)"glGetAttachedShaders")) == NULL) || r; - r = ((glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetAttribLocation")) == NULL) || r; - r = ((glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetProgramInfoLog")) == NULL) || r; - r = ((glGetProgramiv = (PFNGLGETPROGRAMIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramiv")) == NULL) || r; - r = ((glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetShaderInfoLog")) == NULL) || r; - r = ((glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)"glGetShaderSource")) == NULL) || r; - r = ((glGetShaderiv = (PFNGLGETSHADERIVPROC)glewGetProcAddress((const GLubyte*)"glGetShaderiv")) == NULL) || r; - r = ((glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetUniformLocation")) == NULL) || r; - r = ((glGetUniformfv = (PFNGLGETUNIFORMFVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformfv")) == NULL) || r; - r = ((glGetUniformiv = (PFNGLGETUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformiv")) == NULL) || r; - r = ((glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointerv")) == NULL) || r; - r = ((glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdv")) == NULL) || r; - r = ((glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfv")) == NULL) || r; - r = ((glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribiv")) == NULL) || r; - r = ((glIsProgram = (PFNGLISPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glIsProgram")) == NULL) || r; - r = ((glIsShader = (PFNGLISSHADERPROC)glewGetProcAddress((const GLubyte*)"glIsShader")) == NULL) || r; - r = ((glLinkProgram = (PFNGLLINKPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glLinkProgram")) == NULL) || r; - r = ((glShaderSource = (PFNGLSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)"glShaderSource")) == NULL) || r; - r = ((glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilFuncSeparate")) == NULL) || r; - r = ((glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilMaskSeparate")) == NULL) || r; - r = ((glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilOpSeparate")) == NULL) || r; - r = ((glUniform1f = (PFNGLUNIFORM1FPROC)glewGetProcAddress((const GLubyte*)"glUniform1f")) == NULL) || r; - r = ((glUniform1fv = (PFNGLUNIFORM1FVPROC)glewGetProcAddress((const GLubyte*)"glUniform1fv")) == NULL) || r; - r = ((glUniform1i = (PFNGLUNIFORM1IPROC)glewGetProcAddress((const GLubyte*)"glUniform1i")) == NULL) || r; - r = ((glUniform1iv = (PFNGLUNIFORM1IVPROC)glewGetProcAddress((const GLubyte*)"glUniform1iv")) == NULL) || r; - r = ((glUniform2f = (PFNGLUNIFORM2FPROC)glewGetProcAddress((const GLubyte*)"glUniform2f")) == NULL) || r; - r = ((glUniform2fv = (PFNGLUNIFORM2FVPROC)glewGetProcAddress((const GLubyte*)"glUniform2fv")) == NULL) || r; - r = ((glUniform2i = (PFNGLUNIFORM2IPROC)glewGetProcAddress((const GLubyte*)"glUniform2i")) == NULL) || r; - r = ((glUniform2iv = (PFNGLUNIFORM2IVPROC)glewGetProcAddress((const GLubyte*)"glUniform2iv")) == NULL) || r; - r = ((glUniform3f = (PFNGLUNIFORM3FPROC)glewGetProcAddress((const GLubyte*)"glUniform3f")) == NULL) || r; - r = ((glUniform3fv = (PFNGLUNIFORM3FVPROC)glewGetProcAddress((const GLubyte*)"glUniform3fv")) == NULL) || r; - r = ((glUniform3i = (PFNGLUNIFORM3IPROC)glewGetProcAddress((const GLubyte*)"glUniform3i")) == NULL) || r; - r = ((glUniform3iv = (PFNGLUNIFORM3IVPROC)glewGetProcAddress((const GLubyte*)"glUniform3iv")) == NULL) || r; - r = ((glUniform4f = (PFNGLUNIFORM4FPROC)glewGetProcAddress((const GLubyte*)"glUniform4f")) == NULL) || r; - r = ((glUniform4fv = (PFNGLUNIFORM4FVPROC)glewGetProcAddress((const GLubyte*)"glUniform4fv")) == NULL) || r; - r = ((glUniform4i = (PFNGLUNIFORM4IPROC)glewGetProcAddress((const GLubyte*)"glUniform4i")) == NULL) || r; - r = ((glUniform4iv = (PFNGLUNIFORM4IVPROC)glewGetProcAddress((const GLubyte*)"glUniform4iv")) == NULL) || r; - r = ((glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2fv")) == NULL) || r; - r = ((glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3fv")) == NULL) || r; - r = ((glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4fv")) == NULL) || r; - r = ((glUseProgram = (PFNGLUSEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glUseProgram")) == NULL) || r; - r = ((glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glValidateProgram")) == NULL) || r; - r = ((glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1d")) == NULL) || r; - r = ((glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dv")) == NULL) || r; - r = ((glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1f")) == NULL) || r; - r = ((glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fv")) == NULL) || r; - r = ((glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1s")) == NULL) || r; - r = ((glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sv")) == NULL) || r; - r = ((glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2d")) == NULL) || r; - r = ((glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dv")) == NULL) || r; - r = ((glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2f")) == NULL) || r; - r = ((glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fv")) == NULL) || r; - r = ((glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2s")) == NULL) || r; - r = ((glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sv")) == NULL) || r; - r = ((glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3d")) == NULL) || r; - r = ((glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dv")) == NULL) || r; - r = ((glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3f")) == NULL) || r; - r = ((glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fv")) == NULL) || r; - r = ((glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3s")) == NULL) || r; - r = ((glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sv")) == NULL) || r; - r = ((glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nbv")) == NULL) || r; - r = ((glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Niv")) == NULL) || r; - r = ((glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nsv")) == NULL) || r; - r = ((glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nub")) == NULL) || r; - r = ((glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nubv")) == NULL) || r; - r = ((glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nuiv")) == NULL) || r; - r = ((glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nusv")) == NULL) || r; - r = ((glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4bv")) == NULL) || r; - r = ((glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4d")) == NULL) || r; - r = ((glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dv")) == NULL) || r; - r = ((glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4f")) == NULL) || r; - r = ((glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fv")) == NULL) || r; - r = ((glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4iv")) == NULL) || r; - r = ((glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4s")) == NULL) || r; - r = ((glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sv")) == NULL) || r; - r = ((glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubv")) == NULL) || r; - r = ((glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4uiv")) == NULL) || r; - r = ((glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4usv")) == NULL) || r; - r = ((glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointer")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_2_0 */ - -#ifdef GL_VERSION_2_1 - -static GLboolean _glewInit_GL_VERSION_2_1 () -{ - GLboolean r = GL_FALSE; - - r = ((glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3fv")) == NULL) || r; - r = ((glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4fv")) == NULL) || r; - r = ((glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2fv")) == NULL) || r; - r = ((glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4fv")) == NULL) || r; - r = ((glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2fv")) == NULL) || r; - r = ((glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3fv")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_2_1 */ - -#ifdef GL_VERSION_3_0 - -static GLboolean _glewInit_GL_VERSION_3_0 () -{ - GLboolean r = GL_FALSE; - - r = _glewInit_GL_ARB_framebuffer_object() || r; - r = _glewInit_GL_ARB_map_buffer_range() || r; - r = _glewInit_GL_ARB_uniform_buffer_object() || r; - r = _glewInit_GL_ARB_vertex_array_object() || r; - - r = ((glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRender")) == NULL) || r; - r = ((glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedback")) == NULL) || r; - r = ((glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocation")) == NULL) || r; - r = ((glClampColor = (PFNGLCLAMPCOLORPROC)glewGetProcAddress((const GLubyte*)"glClampColor")) == NULL) || r; - r = ((glClearBufferfi = (PFNGLCLEARBUFFERFIPROC)glewGetProcAddress((const GLubyte*)"glClearBufferfi")) == NULL) || r; - r = ((glClearBufferfv = (PFNGLCLEARBUFFERFVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferfv")) == NULL) || r; - r = ((glClearBufferiv = (PFNGLCLEARBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferiv")) == NULL) || r; - r = ((glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferuiv")) == NULL) || r; - r = ((glColorMaski = (PFNGLCOLORMASKIPROC)glewGetProcAddress((const GLubyte*)"glColorMaski")) == NULL) || r; - r = ((glDisablei = (PFNGLDISABLEIPROC)glewGetProcAddress((const GLubyte*)"glDisablei")) == NULL) || r; - r = ((glEnablei = (PFNGLENABLEIPROC)glewGetProcAddress((const GLubyte*)"glEnablei")) == NULL) || r; - r = ((glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRender")) == NULL) || r; - r = ((glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedback")) == NULL) || r; - r = ((glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC)glewGetProcAddress((const GLubyte*)"glGetBooleani_v")) == NULL) || r; - r = ((glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataLocation")) == NULL) || r; - r = ((glGetStringi = (PFNGLGETSTRINGIPROC)glewGetProcAddress((const GLubyte*)"glGetStringi")) == NULL) || r; - r = ((glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIiv")) == NULL) || r; - r = ((glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIuiv")) == NULL) || r; - r = ((glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVarying")) == NULL) || r; - r = ((glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformuiv")) == NULL) || r; - r = ((glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIiv")) == NULL) || r; - r = ((glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIuiv")) == NULL) || r; - r = ((glIsEnabledi = (PFNGLISENABLEDIPROC)glewGetProcAddress((const GLubyte*)"glIsEnabledi")) == NULL) || r; - r = ((glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIiv")) == NULL) || r; - r = ((glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIuiv")) == NULL) || r; - r = ((glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryings")) == NULL) || r; - r = ((glUniform1ui = (PFNGLUNIFORM1UIPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui")) == NULL) || r; - r = ((glUniform1uiv = (PFNGLUNIFORM1UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform1uiv")) == NULL) || r; - r = ((glUniform2ui = (PFNGLUNIFORM2UIPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui")) == NULL) || r; - r = ((glUniform2uiv = (PFNGLUNIFORM2UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform2uiv")) == NULL) || r; - r = ((glUniform3ui = (PFNGLUNIFORM3UIPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui")) == NULL) || r; - r = ((glUniform3uiv = (PFNGLUNIFORM3UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform3uiv")) == NULL) || r; - r = ((glUniform4ui = (PFNGLUNIFORM4UIPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui")) == NULL) || r; - r = ((glUniform4uiv = (PFNGLUNIFORM4UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform4uiv")) == NULL) || r; - r = ((glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1i")) == NULL) || r; - r = ((glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1iv")) == NULL) || r; - r = ((glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1ui")) == NULL) || r; - r = ((glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uiv")) == NULL) || r; - r = ((glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2i")) == NULL) || r; - r = ((glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2iv")) == NULL) || r; - r = ((glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2ui")) == NULL) || r; - r = ((glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uiv")) == NULL) || r; - r = ((glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3i")) == NULL) || r; - r = ((glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3iv")) == NULL) || r; - r = ((glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3ui")) == NULL) || r; - r = ((glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uiv")) == NULL) || r; - r = ((glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4bv")) == NULL) || r; - r = ((glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4i")) == NULL) || r; - r = ((glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4iv")) == NULL) || r; - r = ((glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4sv")) == NULL) || r; - r = ((glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ubv")) == NULL) || r; - r = ((glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ui")) == NULL) || r; - r = ((glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uiv")) == NULL) || r; - r = ((glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4usv")) == NULL) || r; - r = ((glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIPointer")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_3_0 */ - -#ifdef GL_VERSION_3_1 - -static GLboolean _glewInit_GL_VERSION_3_1 () -{ - GLboolean r = GL_FALSE; - - r = _glewInit_GL_ARB_copy_buffer() || r; - - r = ((glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstanced")) == NULL) || r; - r = ((glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstanced")) == NULL) || r; - r = ((glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartIndex")) == NULL) || r; - r = ((glTexBuffer = (PFNGLTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glTexBuffer")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_3_1 */ - -#ifdef GL_VERSION_3_2 - -static GLboolean _glewInit_GL_VERSION_3_2 () -{ - GLboolean r = GL_FALSE; - - r = _glewInit_GL_ARB_draw_elements_base_vertex() || r; - r = _glewInit_GL_ARB_provoking_vertex() || r; - r = _glewInit_GL_ARB_sync() || r; - r = _glewInit_GL_ARB_texture_multisample() || r; - - r = ((glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture")) == NULL) || r; - r = ((glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameteri64v")) == NULL) || r; - r = ((glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64i_v")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_3_2 */ - -#ifdef GL_VERSION_3_3 - -static GLboolean _glewInit_GL_VERSION_3_3 () -{ - GLboolean r = GL_FALSE; - - r = ((glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisor")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_3_3 */ - -#ifdef GL_VERSION_4_0 - -static GLboolean _glewInit_GL_VERSION_4_0 () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquationSeparatei = (PFNGLBLENDEQUATIONSEPARATEIPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparatei")) == NULL) || r; - r = ((glBlendEquationi = (PFNGLBLENDEQUATIONIPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationi")) == NULL) || r; - r = ((glBlendFuncSeparatei = (PFNGLBLENDFUNCSEPARATEIPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparatei")) == NULL) || r; - r = ((glBlendFunci = (PFNGLBLENDFUNCIPROC)glewGetProcAddress((const GLubyte*)"glBlendFunci")) == NULL) || r; - r = ((glMinSampleShading = (PFNGLMINSAMPLESHADINGPROC)glewGetProcAddress((const GLubyte*)"glMinSampleShading")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_4_0 */ - -#ifdef GL_VERSION_4_5 - -static GLboolean _glewInit_GL_VERSION_4_5 () -{ - GLboolean r = GL_FALSE; - - r = ((glGetGraphicsResetStatus = (PFNGLGETGRAPHICSRESETSTATUSPROC)glewGetProcAddress((const GLubyte*)"glGetGraphicsResetStatus")) == NULL) || r; - r = ((glGetnCompressedTexImage = (PFNGLGETNCOMPRESSEDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetnCompressedTexImage")) == NULL) || r; - r = ((glGetnTexImage = (PFNGLGETNTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetnTexImage")) == NULL) || r; - r = ((glGetnUniformdv = (PFNGLGETNUNIFORMDVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformdv")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_4_5 */ - -#ifdef GL_VERSION_4_6 - -static GLboolean _glewInit_GL_VERSION_4_6 () -{ - GLboolean r = GL_FALSE; - - r = ((glMultiDrawArraysIndirectCount = (PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectCount")) == NULL) || r; - r = ((glMultiDrawElementsIndirectCount = (PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectCount")) == NULL) || r; - r = ((glSpecializeShader = (PFNGLSPECIALIZESHADERPROC)glewGetProcAddress((const GLubyte*)"glSpecializeShader")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_4_6 */ - -#ifdef GL_3DFX_tbuffer - -static GLboolean _glewInit_GL_3DFX_tbuffer () -{ - GLboolean r = GL_FALSE; - - r = ((glTbufferMask3DFX = (PFNGLTBUFFERMASK3DFXPROC)glewGetProcAddress((const GLubyte*)"glTbufferMask3DFX")) == NULL) || r; - - return r; -} - -#endif /* GL_3DFX_tbuffer */ - -#ifdef GL_AMD_debug_output - -static GLboolean _glewInit_GL_AMD_debug_output () -{ - GLboolean r = GL_FALSE; - - r = ((glDebugMessageCallbackAMD = (PFNGLDEBUGMESSAGECALLBACKAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallbackAMD")) == NULL) || r; - r = ((glDebugMessageEnableAMD = (PFNGLDEBUGMESSAGEENABLEAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageEnableAMD")) == NULL) || r; - r = ((glDebugMessageInsertAMD = (PFNGLDEBUGMESSAGEINSERTAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsertAMD")) == NULL) || r; - r = ((glGetDebugMessageLogAMD = (PFNGLGETDEBUGMESSAGELOGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLogAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_debug_output */ - -#ifdef GL_AMD_draw_buffers_blend - -static GLboolean _glewInit_GL_AMD_draw_buffers_blend () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquationIndexedAMD = (PFNGLBLENDEQUATIONINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationIndexedAMD")) == NULL) || r; - r = ((glBlendEquationSeparateIndexedAMD = (PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateIndexedAMD")) == NULL) || r; - r = ((glBlendFuncIndexedAMD = (PFNGLBLENDFUNCINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncIndexedAMD")) == NULL) || r; - r = ((glBlendFuncSeparateIndexedAMD = (PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateIndexedAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_draw_buffers_blend */ - -#ifdef GL_AMD_framebuffer_multisample_advanced - -static GLboolean _glewInit_GL_AMD_framebuffer_multisample_advanced () -{ - GLboolean r = GL_FALSE; - - r = ((glNamedRenderbufferStorageMultisampleAdvancedAMD = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisampleAdvancedAMD")) == NULL) || r; - r = ((glRenderbufferStorageMultisampleAdvancedAMD = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleAdvancedAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_framebuffer_multisample_advanced */ - -#ifdef GL_AMD_framebuffer_sample_positions - -static GLboolean _glewInit_GL_AMD_framebuffer_sample_positions () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferSamplePositionsfvAMD = (PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC)glewGetProcAddress((const GLubyte*)"glFramebufferSamplePositionsfvAMD")) == NULL) || r; - r = ((glGetFramebufferParameterfvAMD = (PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameterfvAMD")) == NULL) || r; - r = ((glGetNamedFramebufferParameterfvAMD = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferParameterfvAMD")) == NULL) || r; - r = ((glNamedFramebufferSamplePositionsfvAMD = (PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferSamplePositionsfvAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_framebuffer_sample_positions */ - -#ifdef GL_AMD_interleaved_elements - -static GLboolean _glewInit_GL_AMD_interleaved_elements () -{ - GLboolean r = GL_FALSE; - - r = ((glVertexAttribParameteriAMD = (PFNGLVERTEXATTRIBPARAMETERIAMDPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribParameteriAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_interleaved_elements */ - -#ifdef GL_AMD_multi_draw_indirect - -static GLboolean _glewInit_GL_AMD_multi_draw_indirect () -{ - GLboolean r = GL_FALSE; - - r = ((glMultiDrawArraysIndirectAMD = (PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectAMD")) == NULL) || r; - r = ((glMultiDrawElementsIndirectAMD = (PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_multi_draw_indirect */ - -#ifdef GL_AMD_name_gen_delete - -static GLboolean _glewInit_GL_AMD_name_gen_delete () -{ - GLboolean r = GL_FALSE; - - r = ((glDeleteNamesAMD = (PFNGLDELETENAMESAMDPROC)glewGetProcAddress((const GLubyte*)"glDeleteNamesAMD")) == NULL) || r; - r = ((glGenNamesAMD = (PFNGLGENNAMESAMDPROC)glewGetProcAddress((const GLubyte*)"glGenNamesAMD")) == NULL) || r; - r = ((glIsNameAMD = (PFNGLISNAMEAMDPROC)glewGetProcAddress((const GLubyte*)"glIsNameAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_name_gen_delete */ - -#ifdef GL_AMD_occlusion_query_event - -static GLboolean _glewInit_GL_AMD_occlusion_query_event () -{ - GLboolean r = GL_FALSE; - - r = ((glQueryObjectParameteruiAMD = (PFNGLQUERYOBJECTPARAMETERUIAMDPROC)glewGetProcAddress((const GLubyte*)"glQueryObjectParameteruiAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_occlusion_query_event */ - -#ifdef GL_AMD_performance_monitor - -static GLboolean _glewInit_GL_AMD_performance_monitor () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginPerfMonitorAMD = (PFNGLBEGINPERFMONITORAMDPROC)glewGetProcAddress((const GLubyte*)"glBeginPerfMonitorAMD")) == NULL) || r; - r = ((glDeletePerfMonitorsAMD = (PFNGLDELETEPERFMONITORSAMDPROC)glewGetProcAddress((const GLubyte*)"glDeletePerfMonitorsAMD")) == NULL) || r; - r = ((glEndPerfMonitorAMD = (PFNGLENDPERFMONITORAMDPROC)glewGetProcAddress((const GLubyte*)"glEndPerfMonitorAMD")) == NULL) || r; - r = ((glGenPerfMonitorsAMD = (PFNGLGENPERFMONITORSAMDPROC)glewGetProcAddress((const GLubyte*)"glGenPerfMonitorsAMD")) == NULL) || r; - r = ((glGetPerfMonitorCounterDataAMD = (PFNGLGETPERFMONITORCOUNTERDATAAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterDataAMD")) == NULL) || r; - r = ((glGetPerfMonitorCounterInfoAMD = (PFNGLGETPERFMONITORCOUNTERINFOAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterInfoAMD")) == NULL) || r; - r = ((glGetPerfMonitorCounterStringAMD = (PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterStringAMD")) == NULL) || r; - r = ((glGetPerfMonitorCountersAMD = (PFNGLGETPERFMONITORCOUNTERSAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCountersAMD")) == NULL) || r; - r = ((glGetPerfMonitorGroupStringAMD = (PFNGLGETPERFMONITORGROUPSTRINGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorGroupStringAMD")) == NULL) || r; - r = ((glGetPerfMonitorGroupsAMD = (PFNGLGETPERFMONITORGROUPSAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorGroupsAMD")) == NULL) || r; - r = ((glSelectPerfMonitorCountersAMD = (PFNGLSELECTPERFMONITORCOUNTERSAMDPROC)glewGetProcAddress((const GLubyte*)"glSelectPerfMonitorCountersAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_performance_monitor */ - -#ifdef GL_AMD_sample_positions - -static GLboolean _glewInit_GL_AMD_sample_positions () -{ - GLboolean r = GL_FALSE; - - r = ((glSetMultisamplefvAMD = (PFNGLSETMULTISAMPLEFVAMDPROC)glewGetProcAddress((const GLubyte*)"glSetMultisamplefvAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_sample_positions */ - -#ifdef GL_AMD_sparse_texture - -static GLboolean _glewInit_GL_AMD_sparse_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glTexStorageSparseAMD = (PFNGLTEXSTORAGESPARSEAMDPROC)glewGetProcAddress((const GLubyte*)"glTexStorageSparseAMD")) == NULL) || r; - r = ((glTextureStorageSparseAMD = (PFNGLTEXTURESTORAGESPARSEAMDPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageSparseAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_sparse_texture */ - -#ifdef GL_AMD_stencil_operation_extended - -static GLboolean _glewInit_GL_AMD_stencil_operation_extended () -{ - GLboolean r = GL_FALSE; - - r = ((glStencilOpValueAMD = (PFNGLSTENCILOPVALUEAMDPROC)glewGetProcAddress((const GLubyte*)"glStencilOpValueAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_stencil_operation_extended */ - -#ifdef GL_AMD_vertex_shader_tessellator - -static GLboolean _glewInit_GL_AMD_vertex_shader_tessellator () -{ - GLboolean r = GL_FALSE; - - r = ((glTessellationFactorAMD = (PFNGLTESSELLATIONFACTORAMDPROC)glewGetProcAddress((const GLubyte*)"glTessellationFactorAMD")) == NULL) || r; - r = ((glTessellationModeAMD = (PFNGLTESSELLATIONMODEAMDPROC)glewGetProcAddress((const GLubyte*)"glTessellationModeAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_vertex_shader_tessellator */ - -#ifdef GL_ANGLE_framebuffer_blit - -static GLboolean _glewInit_GL_ANGLE_framebuffer_blit () -{ - GLboolean r = GL_FALSE; - - r = ((glBlitFramebufferANGLE = (PFNGLBLITFRAMEBUFFERANGLEPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferANGLE")) == NULL) || r; - - return r; -} - -#endif /* GL_ANGLE_framebuffer_blit */ - -#ifdef GL_ANGLE_framebuffer_multisample - -static GLboolean _glewInit_GL_ANGLE_framebuffer_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glRenderbufferStorageMultisampleANGLE = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleANGLE")) == NULL) || r; - - return r; -} - -#endif /* GL_ANGLE_framebuffer_multisample */ - -#ifdef GL_ANGLE_instanced_arrays - -static GLboolean _glewInit_GL_ANGLE_instanced_arrays () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawArraysInstancedANGLE = (PFNGLDRAWARRAYSINSTANCEDANGLEPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedANGLE")) == NULL) || r; - r = ((glDrawElementsInstancedANGLE = (PFNGLDRAWELEMENTSINSTANCEDANGLEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedANGLE")) == NULL) || r; - r = ((glVertexAttribDivisorANGLE = (PFNGLVERTEXATTRIBDIVISORANGLEPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorANGLE")) == NULL) || r; - - return r; -} - -#endif /* GL_ANGLE_instanced_arrays */ - -#ifdef GL_ANGLE_timer_query - -static GLboolean _glewInit_GL_ANGLE_timer_query () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginQueryANGLE = (PFNGLBEGINQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryANGLE")) == NULL) || r; - r = ((glDeleteQueriesANGLE = (PFNGLDELETEQUERIESANGLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueriesANGLE")) == NULL) || r; - r = ((glEndQueryANGLE = (PFNGLENDQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glEndQueryANGLE")) == NULL) || r; - r = ((glGenQueriesANGLE = (PFNGLGENQUERIESANGLEPROC)glewGetProcAddress((const GLubyte*)"glGenQueriesANGLE")) == NULL) || r; - r = ((glGetQueryObjecti64vANGLE = (PFNGLGETQUERYOBJECTI64VANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64vANGLE")) == NULL) || r; - r = ((glGetQueryObjectivANGLE = (PFNGLGETQUERYOBJECTIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectivANGLE")) == NULL) || r; - r = ((glGetQueryObjectui64vANGLE = (PFNGLGETQUERYOBJECTUI64VANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64vANGLE")) == NULL) || r; - r = ((glGetQueryObjectuivANGLE = (PFNGLGETQUERYOBJECTUIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuivANGLE")) == NULL) || r; - r = ((glGetQueryivANGLE = (PFNGLGETQUERYIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryivANGLE")) == NULL) || r; - r = ((glIsQueryANGLE = (PFNGLISQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glIsQueryANGLE")) == NULL) || r; - r = ((glQueryCounterANGLE = (PFNGLQUERYCOUNTERANGLEPROC)glewGetProcAddress((const GLubyte*)"glQueryCounterANGLE")) == NULL) || r; - - return r; -} - -#endif /* GL_ANGLE_timer_query */ - -#ifdef GL_ANGLE_translated_shader_source - -static GLboolean _glewInit_GL_ANGLE_translated_shader_source () -{ - GLboolean r = GL_FALSE; - - r = ((glGetTranslatedShaderSourceANGLE = (PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetTranslatedShaderSourceANGLE")) == NULL) || r; - - return r; -} - -#endif /* GL_ANGLE_translated_shader_source */ - -#ifdef GL_APPLE_copy_texture_levels - -static GLboolean _glewInit_GL_APPLE_copy_texture_levels () -{ - GLboolean r = GL_FALSE; - - r = ((glCopyTextureLevelsAPPLE = (PFNGLCOPYTEXTURELEVELSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureLevelsAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_copy_texture_levels */ - -#ifdef GL_APPLE_element_array - -static GLboolean _glewInit_GL_APPLE_element_array () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawElementArrayAPPLE = (PFNGLDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementArrayAPPLE")) == NULL) || r; - r = ((glDrawRangeElementArrayAPPLE = (PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementArrayAPPLE")) == NULL) || r; - r = ((glElementPointerAPPLE = (PFNGLELEMENTPOINTERAPPLEPROC)glewGetProcAddress((const GLubyte*)"glElementPointerAPPLE")) == NULL) || r; - r = ((glMultiDrawElementArrayAPPLE = (PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementArrayAPPLE")) == NULL) || r; - r = ((glMultiDrawRangeElementArrayAPPLE = (PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawRangeElementArrayAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_element_array */ - -#ifdef GL_APPLE_fence - -static GLboolean _glewInit_GL_APPLE_fence () -{ - GLboolean r = GL_FALSE; - - r = ((glDeleteFencesAPPLE = (PFNGLDELETEFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteFencesAPPLE")) == NULL) || r; - r = ((glFinishFenceAPPLE = (PFNGLFINISHFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFinishFenceAPPLE")) == NULL) || r; - r = ((glFinishObjectAPPLE = (PFNGLFINISHOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFinishObjectAPPLE")) == NULL) || r; - r = ((glGenFencesAPPLE = (PFNGLGENFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGenFencesAPPLE")) == NULL) || r; - r = ((glIsFenceAPPLE = (PFNGLISFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsFenceAPPLE")) == NULL) || r; - r = ((glSetFenceAPPLE = (PFNGLSETFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glSetFenceAPPLE")) == NULL) || r; - r = ((glTestFenceAPPLE = (PFNGLTESTFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTestFenceAPPLE")) == NULL) || r; - r = ((glTestObjectAPPLE = (PFNGLTESTOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTestObjectAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_fence */ - -#ifdef GL_APPLE_flush_buffer_range - -static GLboolean _glewInit_GL_APPLE_flush_buffer_range () -{ - GLboolean r = GL_FALSE; - - r = ((glBufferParameteriAPPLE = (PFNGLBUFFERPARAMETERIAPPLEPROC)glewGetProcAddress((const GLubyte*)"glBufferParameteriAPPLE")) == NULL) || r; - r = ((glFlushMappedBufferRangeAPPLE = (PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedBufferRangeAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_flush_buffer_range */ - -#ifdef GL_APPLE_framebuffer_multisample - -static GLboolean _glewInit_GL_APPLE_framebuffer_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glRenderbufferStorageMultisampleAPPLE = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleAPPLE")) == NULL) || r; - r = ((glResolveMultisampleFramebufferAPPLE = (PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC)glewGetProcAddress((const GLubyte*)"glResolveMultisampleFramebufferAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_framebuffer_multisample */ - -#ifdef GL_APPLE_object_purgeable - -static GLboolean _glewInit_GL_APPLE_object_purgeable () -{ - GLboolean r = GL_FALSE; - - r = ((glGetObjectParameterivAPPLE = (PFNGLGETOBJECTPARAMETERIVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterivAPPLE")) == NULL) || r; - r = ((glObjectPurgeableAPPLE = (PFNGLOBJECTPURGEABLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glObjectPurgeableAPPLE")) == NULL) || r; - r = ((glObjectUnpurgeableAPPLE = (PFNGLOBJECTUNPURGEABLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glObjectUnpurgeableAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_object_purgeable */ - -#ifdef GL_APPLE_sync - -static GLboolean _glewInit_GL_APPLE_sync () -{ - GLboolean r = GL_FALSE; - - r = ((glClientWaitSyncAPPLE = (PFNGLCLIENTWAITSYNCAPPLEPROC)glewGetProcAddress((const GLubyte*)"glClientWaitSyncAPPLE")) == NULL) || r; - r = ((glDeleteSyncAPPLE = (PFNGLDELETESYNCAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteSyncAPPLE")) == NULL) || r; - r = ((glFenceSyncAPPLE = (PFNGLFENCESYNCAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFenceSyncAPPLE")) == NULL) || r; - r = ((glGetInteger64vAPPLE = (PFNGLGETINTEGER64VAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64vAPPLE")) == NULL) || r; - r = ((glGetSyncivAPPLE = (PFNGLGETSYNCIVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetSyncivAPPLE")) == NULL) || r; - r = ((glIsSyncAPPLE = (PFNGLISSYNCAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsSyncAPPLE")) == NULL) || r; - r = ((glWaitSyncAPPLE = (PFNGLWAITSYNCAPPLEPROC)glewGetProcAddress((const GLubyte*)"glWaitSyncAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_sync */ - -#ifdef GL_APPLE_texture_range - -static GLboolean _glewInit_GL_APPLE_texture_range () -{ - GLboolean r = GL_FALSE; - - r = ((glGetTexParameterPointervAPPLE = (PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterPointervAPPLE")) == NULL) || r; - r = ((glTextureRangeAPPLE = (PFNGLTEXTURERANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureRangeAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_texture_range */ - -#ifdef GL_APPLE_vertex_array_object - -static GLboolean _glewInit_GL_APPLE_vertex_array_object () -{ - GLboolean r = GL_FALSE; - - r = ((glBindVertexArrayAPPLE = (PFNGLBINDVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArrayAPPLE")) == NULL) || r; - r = ((glDeleteVertexArraysAPPLE = (PFNGLDELETEVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArraysAPPLE")) == NULL) || r; - r = ((glGenVertexArraysAPPLE = (PFNGLGENVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArraysAPPLE")) == NULL) || r; - r = ((glIsVertexArrayAPPLE = (PFNGLISVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArrayAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_vertex_array_object */ - -#ifdef GL_APPLE_vertex_array_range - -static GLboolean _glewInit_GL_APPLE_vertex_array_range () -{ - GLboolean r = GL_FALSE; - - r = ((glFlushVertexArrayRangeAPPLE = (PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFlushVertexArrayRangeAPPLE")) == NULL) || r; - r = ((glVertexArrayParameteriAPPLE = (PFNGLVERTEXARRAYPARAMETERIAPPLEPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayParameteriAPPLE")) == NULL) || r; - r = ((glVertexArrayRangeAPPLE = (PFNGLVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayRangeAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_vertex_array_range */ - -#ifdef GL_APPLE_vertex_program_evaluators - -static GLboolean _glewInit_GL_APPLE_vertex_program_evaluators () -{ - GLboolean r = GL_FALSE; - - r = ((glDisableVertexAttribAPPLE = (PFNGLDISABLEVERTEXATTRIBAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribAPPLE")) == NULL) || r; - r = ((glEnableVertexAttribAPPLE = (PFNGLENABLEVERTEXATTRIBAPPLEPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribAPPLE")) == NULL) || r; - r = ((glIsVertexAttribEnabledAPPLE = (PFNGLISVERTEXATTRIBENABLEDAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsVertexAttribEnabledAPPLE")) == NULL) || r; - r = ((glMapVertexAttrib1dAPPLE = (PFNGLMAPVERTEXATTRIB1DAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib1dAPPLE")) == NULL) || r; - r = ((glMapVertexAttrib1fAPPLE = (PFNGLMAPVERTEXATTRIB1FAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib1fAPPLE")) == NULL) || r; - r = ((glMapVertexAttrib2dAPPLE = (PFNGLMAPVERTEXATTRIB2DAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib2dAPPLE")) == NULL) || r; - r = ((glMapVertexAttrib2fAPPLE = (PFNGLMAPVERTEXATTRIB2FAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib2fAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_vertex_program_evaluators */ - -#ifdef GL_ARB_ES2_compatibility - -static GLboolean _glewInit_GL_ARB_ES2_compatibility () -{ - GLboolean r = GL_FALSE; - - r = ((glClearDepthf = (PFNGLCLEARDEPTHFPROC)glewGetProcAddress((const GLubyte*)"glClearDepthf")) == NULL) || r; - r = ((glDepthRangef = (PFNGLDEPTHRANGEFPROC)glewGetProcAddress((const GLubyte*)"glDepthRangef")) == NULL) || r; - r = ((glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC)glewGetProcAddress((const GLubyte*)"glGetShaderPrecisionFormat")) == NULL) || r; - r = ((glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC)glewGetProcAddress((const GLubyte*)"glReleaseShaderCompiler")) == NULL) || r; - r = ((glShaderBinary = (PFNGLSHADERBINARYPROC)glewGetProcAddress((const GLubyte*)"glShaderBinary")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_ES2_compatibility */ - -#ifdef GL_ARB_ES3_1_compatibility - -static GLboolean _glewInit_GL_ARB_ES3_1_compatibility () -{ - GLboolean r = GL_FALSE; - - r = ((glMemoryBarrierByRegion = (PFNGLMEMORYBARRIERBYREGIONPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrierByRegion")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_ES3_1_compatibility */ - -#ifdef GL_ARB_ES3_2_compatibility - -static GLboolean _glewInit_GL_ARB_ES3_2_compatibility () -{ - GLboolean r = GL_FALSE; - - r = ((glPrimitiveBoundingBoxARB = (PFNGLPRIMITIVEBOUNDINGBOXARBPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveBoundingBoxARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_ES3_2_compatibility */ - -#ifdef GL_ARB_base_instance - -static GLboolean _glewInit_GL_ARB_base_instance () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedBaseInstance")) == NULL) || r; - r = ((glDrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseInstance")) == NULL) || r; - r = ((glDrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertexBaseInstance")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_base_instance */ - -#ifdef GL_ARB_bindless_texture - -static GLboolean _glewInit_GL_ARB_bindless_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glGetImageHandleARB = (PFNGLGETIMAGEHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetImageHandleARB")) == NULL) || r; - r = ((glGetTextureHandleARB = (PFNGLGETTEXTUREHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetTextureHandleARB")) == NULL) || r; - r = ((glGetTextureSamplerHandleARB = (PFNGLGETTEXTURESAMPLERHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSamplerHandleARB")) == NULL) || r; - r = ((glGetVertexAttribLui64vARB = (PFNGLGETVERTEXATTRIBLUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLui64vARB")) == NULL) || r; - r = ((glIsImageHandleResidentARB = (PFNGLISIMAGEHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glIsImageHandleResidentARB")) == NULL) || r; - r = ((glIsTextureHandleResidentARB = (PFNGLISTEXTUREHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glIsTextureHandleResidentARB")) == NULL) || r; - r = ((glMakeImageHandleNonResidentARB = (PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleNonResidentARB")) == NULL) || r; - r = ((glMakeImageHandleResidentARB = (PFNGLMAKEIMAGEHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleResidentARB")) == NULL) || r; - r = ((glMakeTextureHandleNonResidentARB = (PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleNonResidentARB")) == NULL) || r; - r = ((glMakeTextureHandleResidentARB = (PFNGLMAKETEXTUREHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleResidentARB")) == NULL) || r; - r = ((glProgramUniformHandleui64ARB = (PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64ARB")) == NULL) || r; - r = ((glProgramUniformHandleui64vARB = (PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64vARB")) == NULL) || r; - r = ((glUniformHandleui64ARB = (PFNGLUNIFORMHANDLEUI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64ARB")) == NULL) || r; - r = ((glUniformHandleui64vARB = (PFNGLUNIFORMHANDLEUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64vARB")) == NULL) || r; - r = ((glVertexAttribL1ui64ARB = (PFNGLVERTEXATTRIBL1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64ARB")) == NULL) || r; - r = ((glVertexAttribL1ui64vARB = (PFNGLVERTEXATTRIBL1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64vARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_bindless_texture */ - -#ifdef GL_ARB_blend_func_extended - -static GLboolean _glewInit_GL_ARB_blend_func_extended () -{ - GLboolean r = GL_FALSE; - - r = ((glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationIndexed")) == NULL) || r; - r = ((glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataIndex")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_blend_func_extended */ - -#ifdef GL_ARB_buffer_storage - -static GLboolean _glewInit_GL_ARB_buffer_storage () -{ - GLboolean r = GL_FALSE; - - r = ((glBufferStorage = (PFNGLBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glBufferStorage")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_buffer_storage */ - -#ifdef GL_ARB_cl_event - -static GLboolean _glewInit_GL_ARB_cl_event () -{ - GLboolean r = GL_FALSE; - - r = ((glCreateSyncFromCLeventARB = (PFNGLCREATESYNCFROMCLEVENTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateSyncFromCLeventARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_cl_event */ - -#ifdef GL_ARB_clear_buffer_object - -static GLboolean _glewInit_GL_ARB_clear_buffer_object () -{ - GLboolean r = GL_FALSE; - - r = ((glClearBufferData = (PFNGLCLEARBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glClearBufferData")) == NULL) || r; - r = ((glClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glClearBufferSubData")) == NULL) || r; - r = ((glClearNamedBufferDataEXT = (PFNGLCLEARNAMEDBUFFERDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferDataEXT")) == NULL) || r; - r = ((glClearNamedBufferSubDataEXT = (PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferSubDataEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_clear_buffer_object */ - -#ifdef GL_ARB_clear_texture - -static GLboolean _glewInit_GL_ARB_clear_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glClearTexImage = (PFNGLCLEARTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glClearTexImage")) == NULL) || r; - r = ((glClearTexSubImage = (PFNGLCLEARTEXSUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glClearTexSubImage")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_clear_texture */ - -#ifdef GL_ARB_clip_control - -static GLboolean _glewInit_GL_ARB_clip_control () -{ - GLboolean r = GL_FALSE; - - r = ((glClipControl = (PFNGLCLIPCONTROLPROC)glewGetProcAddress((const GLubyte*)"glClipControl")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_clip_control */ - -#ifdef GL_ARB_color_buffer_float - -static GLboolean _glewInit_GL_ARB_color_buffer_float () -{ - GLboolean r = GL_FALSE; - - r = ((glClampColorARB = (PFNGLCLAMPCOLORARBPROC)glewGetProcAddress((const GLubyte*)"glClampColorARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_color_buffer_float */ - -#ifdef GL_ARB_compute_shader - -static GLboolean _glewInit_GL_ARB_compute_shader () -{ - GLboolean r = GL_FALSE; - - r = ((glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC)glewGetProcAddress((const GLubyte*)"glDispatchCompute")) == NULL) || r; - r = ((glDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDispatchComputeIndirect")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_compute_shader */ - -#ifdef GL_ARB_compute_variable_group_size - -static GLboolean _glewInit_GL_ARB_compute_variable_group_size () -{ - GLboolean r = GL_FALSE; - - r = ((glDispatchComputeGroupSizeARB = (PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC)glewGetProcAddress((const GLubyte*)"glDispatchComputeGroupSizeARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_compute_variable_group_size */ - -#ifdef GL_ARB_copy_buffer - -static GLboolean _glewInit_GL_ARB_copy_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyBufferSubData")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_copy_buffer */ - -#ifdef GL_ARB_copy_image - -static GLboolean _glewInit_GL_ARB_copy_image () -{ - GLboolean r = GL_FALSE; - - r = ((glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubData")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_copy_image */ - -#ifdef GL_ARB_debug_output - -static GLboolean _glewInit_GL_ARB_debug_output () -{ - GLboolean r = GL_FALSE; - - r = ((glDebugMessageCallbackARB = (PFNGLDEBUGMESSAGECALLBACKARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallbackARB")) == NULL) || r; - r = ((glDebugMessageControlARB = (PFNGLDEBUGMESSAGECONTROLARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageControlARB")) == NULL) || r; - r = ((glDebugMessageInsertARB = (PFNGLDEBUGMESSAGEINSERTARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsertARB")) == NULL) || r; - r = ((glGetDebugMessageLogARB = (PFNGLGETDEBUGMESSAGELOGARBPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLogARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_debug_output */ - -#ifdef GL_ARB_direct_state_access - -static GLboolean _glewInit_GL_ARB_direct_state_access () -{ - GLboolean r = GL_FALSE; - - r = ((glBindTextureUnit = (PFNGLBINDTEXTUREUNITPROC)glewGetProcAddress((const GLubyte*)"glBindTextureUnit")) == NULL) || r; - r = ((glBlitNamedFramebuffer = (PFNGLBLITNAMEDFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBlitNamedFramebuffer")) == NULL) || r; - r = ((glCheckNamedFramebufferStatus = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC)glewGetProcAddress((const GLubyte*)"glCheckNamedFramebufferStatus")) == NULL) || r; - r = ((glClearNamedBufferData = (PFNGLCLEARNAMEDBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferData")) == NULL) || r; - r = ((glClearNamedBufferSubData = (PFNGLCLEARNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferSubData")) == NULL) || r; - r = ((glClearNamedFramebufferfi = (PFNGLCLEARNAMEDFRAMEBUFFERFIPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferfi")) == NULL) || r; - r = ((glClearNamedFramebufferfv = (PFNGLCLEARNAMEDFRAMEBUFFERFVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferfv")) == NULL) || r; - r = ((glClearNamedFramebufferiv = (PFNGLCLEARNAMEDFRAMEBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferiv")) == NULL) || r; - r = ((glClearNamedFramebufferuiv = (PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferuiv")) == NULL) || r; - r = ((glCompressedTextureSubImage1D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage1D")) == NULL) || r; - r = ((glCompressedTextureSubImage2D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage2D")) == NULL) || r; - r = ((glCompressedTextureSubImage3D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage3D")) == NULL) || r; - r = ((glCopyNamedBufferSubData = (PFNGLCOPYNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyNamedBufferSubData")) == NULL) || r; - r = ((glCopyTextureSubImage1D = (PFNGLCOPYTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage1D")) == NULL) || r; - r = ((glCopyTextureSubImage2D = (PFNGLCOPYTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage2D")) == NULL) || r; - r = ((glCopyTextureSubImage3D = (PFNGLCOPYTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage3D")) == NULL) || r; - r = ((glCreateBuffers = (PFNGLCREATEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateBuffers")) == NULL) || r; - r = ((glCreateFramebuffers = (PFNGLCREATEFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateFramebuffers")) == NULL) || r; - r = ((glCreateProgramPipelines = (PFNGLCREATEPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glCreateProgramPipelines")) == NULL) || r; - r = ((glCreateQueries = (PFNGLCREATEQUERIESPROC)glewGetProcAddress((const GLubyte*)"glCreateQueries")) == NULL) || r; - r = ((glCreateRenderbuffers = (PFNGLCREATERENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateRenderbuffers")) == NULL) || r; - r = ((glCreateSamplers = (PFNGLCREATESAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glCreateSamplers")) == NULL) || r; - r = ((glCreateTextures = (PFNGLCREATETEXTURESPROC)glewGetProcAddress((const GLubyte*)"glCreateTextures")) == NULL) || r; - r = ((glCreateTransformFeedbacks = (PFNGLCREATETRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glCreateTransformFeedbacks")) == NULL) || r; - r = ((glCreateVertexArrays = (PFNGLCREATEVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glCreateVertexArrays")) == NULL) || r; - r = ((glDisableVertexArrayAttrib = (PFNGLDISABLEVERTEXARRAYATTRIBPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayAttrib")) == NULL) || r; - r = ((glEnableVertexArrayAttrib = (PFNGLENABLEVERTEXARRAYATTRIBPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayAttrib")) == NULL) || r; - r = ((glFlushMappedNamedBufferRange = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedNamedBufferRange")) == NULL) || r; - r = ((glGenerateTextureMipmap = (PFNGLGENERATETEXTUREMIPMAPPROC)glewGetProcAddress((const GLubyte*)"glGenerateTextureMipmap")) == NULL) || r; - r = ((glGetCompressedTextureImage = (PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureImage")) == NULL) || r; - r = ((glGetNamedBufferParameteri64v = (PFNGLGETNAMEDBUFFERPARAMETERI64VPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameteri64v")) == NULL) || r; - r = ((glGetNamedBufferParameteriv = (PFNGLGETNAMEDBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameteriv")) == NULL) || r; - r = ((glGetNamedBufferPointerv = (PFNGLGETNAMEDBUFFERPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferPointerv")) == NULL) || r; - r = ((glGetNamedBufferSubData = (PFNGLGETNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferSubData")) == NULL) || r; - r = ((glGetNamedFramebufferAttachmentParameteriv = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferAttachmentParameteriv")) == NULL) || r; - r = ((glGetNamedFramebufferParameteriv = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferParameteriv")) == NULL) || r; - r = ((glGetNamedRenderbufferParameteriv = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedRenderbufferParameteriv")) == NULL) || r; - r = ((glGetQueryBufferObjecti64v = (PFNGLGETQUERYBUFFEROBJECTI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjecti64v")) == NULL) || r; - r = ((glGetQueryBufferObjectiv = (PFNGLGETQUERYBUFFEROBJECTIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectiv")) == NULL) || r; - r = ((glGetQueryBufferObjectui64v = (PFNGLGETQUERYBUFFEROBJECTUI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectui64v")) == NULL) || r; - r = ((glGetQueryBufferObjectuiv = (PFNGLGETQUERYBUFFEROBJECTUIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectuiv")) == NULL) || r; - r = ((glGetTextureImage = (PFNGLGETTEXTUREIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetTextureImage")) == NULL) || r; - r = ((glGetTextureLevelParameterfv = (PFNGLGETTEXTURELEVELPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterfv")) == NULL) || r; - r = ((glGetTextureLevelParameteriv = (PFNGLGETTEXTURELEVELPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameteriv")) == NULL) || r; - r = ((glGetTextureParameterIiv = (PFNGLGETTEXTUREPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIiv")) == NULL) || r; - r = ((glGetTextureParameterIuiv = (PFNGLGETTEXTUREPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIuiv")) == NULL) || r; - r = ((glGetTextureParameterfv = (PFNGLGETTEXTUREPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterfv")) == NULL) || r; - r = ((glGetTextureParameteriv = (PFNGLGETTEXTUREPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameteriv")) == NULL) || r; - r = ((glGetTransformFeedbacki64_v = (PFNGLGETTRANSFORMFEEDBACKI64_VPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbacki64_v")) == NULL) || r; - r = ((glGetTransformFeedbacki_v = (PFNGLGETTRANSFORMFEEDBACKI_VPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbacki_v")) == NULL) || r; - r = ((glGetTransformFeedbackiv = (PFNGLGETTRANSFORMFEEDBACKIVPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackiv")) == NULL) || r; - r = ((glGetVertexArrayIndexed64iv = (PFNGLGETVERTEXARRAYINDEXED64IVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIndexed64iv")) == NULL) || r; - r = ((glGetVertexArrayIndexediv = (PFNGLGETVERTEXARRAYINDEXEDIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIndexediv")) == NULL) || r; - r = ((glGetVertexArrayiv = (PFNGLGETVERTEXARRAYIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayiv")) == NULL) || r; - r = ((glInvalidateNamedFramebufferData = (PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateNamedFramebufferData")) == NULL) || r; - r = ((glInvalidateNamedFramebufferSubData = (PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateNamedFramebufferSubData")) == NULL) || r; - r = ((glMapNamedBuffer = (PFNGLMAPNAMEDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBuffer")) == NULL) || r; - r = ((glMapNamedBufferRange = (PFNGLMAPNAMEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferRange")) == NULL) || r; - r = ((glNamedBufferData = (PFNGLNAMEDBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferData")) == NULL) || r; - r = ((glNamedBufferStorage = (PFNGLNAMEDBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorage")) == NULL) || r; - r = ((glNamedBufferSubData = (PFNGLNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferSubData")) == NULL) || r; - r = ((glNamedFramebufferDrawBuffer = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferDrawBuffer")) == NULL) || r; - r = ((glNamedFramebufferDrawBuffers = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferDrawBuffers")) == NULL) || r; - r = ((glNamedFramebufferParameteri = (PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferParameteri")) == NULL) || r; - r = ((glNamedFramebufferReadBuffer = (PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferReadBuffer")) == NULL) || r; - r = ((glNamedFramebufferRenderbuffer = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferRenderbuffer")) == NULL) || r; - r = ((glNamedFramebufferTexture = (PFNGLNAMEDFRAMEBUFFERTEXTUREPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture")) == NULL) || r; - r = ((glNamedFramebufferTextureLayer = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureLayer")) == NULL) || r; - r = ((glNamedRenderbufferStorage = (PFNGLNAMEDRENDERBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorage")) == NULL) || r; - r = ((glNamedRenderbufferStorageMultisample = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisample")) == NULL) || r; - r = ((glTextureBuffer = (PFNGLTEXTUREBUFFERPROC)glewGetProcAddress((const GLubyte*)"glTextureBuffer")) == NULL) || r; - r = ((glTextureBufferRange = (PFNGLTEXTUREBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferRange")) == NULL) || r; - r = ((glTextureParameterIiv = (PFNGLTEXTUREPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIiv")) == NULL) || r; - r = ((glTextureParameterIuiv = (PFNGLTEXTUREPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIuiv")) == NULL) || r; - r = ((glTextureParameterf = (PFNGLTEXTUREPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterf")) == NULL) || r; - r = ((glTextureParameterfv = (PFNGLTEXTUREPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfv")) == NULL) || r; - r = ((glTextureParameteri = (PFNGLTEXTUREPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteri")) == NULL) || r; - r = ((glTextureParameteriv = (PFNGLTEXTUREPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteriv")) == NULL) || r; - r = ((glTextureStorage1D = (PFNGLTEXTURESTORAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage1D")) == NULL) || r; - r = ((glTextureStorage2D = (PFNGLTEXTURESTORAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2D")) == NULL) || r; - r = ((glTextureStorage2DMultisample = (PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DMultisample")) == NULL) || r; - r = ((glTextureStorage3D = (PFNGLTEXTURESTORAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3D")) == NULL) || r; - r = ((glTextureStorage3DMultisample = (PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DMultisample")) == NULL) || r; - r = ((glTextureSubImage1D = (PFNGLTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage1D")) == NULL) || r; - r = ((glTextureSubImage2D = (PFNGLTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage2D")) == NULL) || r; - r = ((glTextureSubImage3D = (PFNGLTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage3D")) == NULL) || r; - r = ((glTransformFeedbackBufferBase = (PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackBufferBase")) == NULL) || r; - r = ((glTransformFeedbackBufferRange = (PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackBufferRange")) == NULL) || r; - r = ((glUnmapNamedBuffer = (PFNGLUNMAPNAMEDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glUnmapNamedBuffer")) == NULL) || r; - r = ((glVertexArrayAttribBinding = (PFNGLVERTEXARRAYATTRIBBINDINGPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribBinding")) == NULL) || r; - r = ((glVertexArrayAttribFormat = (PFNGLVERTEXARRAYATTRIBFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribFormat")) == NULL) || r; - r = ((glVertexArrayAttribIFormat = (PFNGLVERTEXARRAYATTRIBIFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribIFormat")) == NULL) || r; - r = ((glVertexArrayAttribLFormat = (PFNGLVERTEXARRAYATTRIBLFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribLFormat")) == NULL) || r; - r = ((glVertexArrayBindingDivisor = (PFNGLVERTEXARRAYBINDINGDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayBindingDivisor")) == NULL) || r; - r = ((glVertexArrayElementBuffer = (PFNGLVERTEXARRAYELEMENTBUFFERPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayElementBuffer")) == NULL) || r; - r = ((glVertexArrayVertexBuffer = (PFNGLVERTEXARRAYVERTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBuffer")) == NULL) || r; - r = ((glVertexArrayVertexBuffers = (PFNGLVERTEXARRAYVERTEXBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBuffers")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_direct_state_access */ - -#ifdef GL_ARB_draw_buffers - -static GLboolean _glewInit_GL_ARB_draw_buffers () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawBuffersARB = (PFNGLDRAWBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_draw_buffers */ - -#ifdef GL_ARB_draw_buffers_blend - -static GLboolean _glewInit_GL_ARB_draw_buffers_blend () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquationSeparateiARB = (PFNGLBLENDEQUATIONSEPARATEIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateiARB")) == NULL) || r; - r = ((glBlendEquationiARB = (PFNGLBLENDEQUATIONIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationiARB")) == NULL) || r; - r = ((glBlendFuncSeparateiARB = (PFNGLBLENDFUNCSEPARATEIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateiARB")) == NULL) || r; - r = ((glBlendFunciARB = (PFNGLBLENDFUNCIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendFunciARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_draw_buffers_blend */ - -#ifdef GL_ARB_draw_elements_base_vertex - -static GLboolean _glewInit_GL_ARB_draw_elements_base_vertex () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsBaseVertex")) == NULL) || r; - r = ((glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertex")) == NULL) || r; - r = ((glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsBaseVertex")) == NULL) || r; - r = ((glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsBaseVertex")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_draw_elements_base_vertex */ - -#ifdef GL_ARB_draw_indirect - -static GLboolean _glewInit_GL_ARB_draw_indirect () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysIndirect")) == NULL) || r; - r = ((glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsIndirect")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_draw_indirect */ - -#ifdef GL_ARB_framebuffer_no_attachments - -static GLboolean _glewInit_GL_ARB_framebuffer_no_attachments () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glFramebufferParameteri")) == NULL) || r; - r = ((glGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameteriv")) == NULL) || r; - r = ((glGetNamedFramebufferParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferParameterivEXT")) == NULL) || r; - r = ((glNamedFramebufferParameteriEXT = (PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferParameteriEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_framebuffer_no_attachments */ - -#ifdef GL_ARB_framebuffer_object - -static GLboolean _glewInit_GL_ARB_framebuffer_object () -{ - GLboolean r = GL_FALSE; - - r = ((glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindFramebuffer")) == NULL) || r; - r = ((glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindRenderbuffer")) == NULL) || r; - r = ((glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebuffer")) == NULL) || r; - r = ((glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)glewGetProcAddress((const GLubyte*)"glCheckFramebufferStatus")) == NULL) || r; - r = ((glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffers")) == NULL) || r; - r = ((glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffers")) == NULL) || r; - r = ((glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbuffer")) == NULL) || r; - r = ((glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture1D")) == NULL) || r; - r = ((glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2D")) == NULL) || r; - r = ((glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3D")) == NULL) || r; - r = ((glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayer")) == NULL) || r; - r = ((glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenFramebuffers")) == NULL) || r; - r = ((glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenRenderbuffers")) == NULL) || r; - r = ((glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)glewGetProcAddress((const GLubyte*)"glGenerateMipmap")) == NULL) || r; - r = ((glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferAttachmentParameteriv")) == NULL) || r; - r = ((glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetRenderbufferParameteriv")) == NULL) || r; - r = ((glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsFramebuffer")) == NULL) || r; - r = ((glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsRenderbuffer")) == NULL) || r; - r = ((glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorage")) == NULL) || r; - r = ((glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisample")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_framebuffer_object */ - -#ifdef GL_ARB_geometry_shader4 - -static GLboolean _glewInit_GL_ARB_geometry_shader4 () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureARB")) == NULL) || r; - r = ((glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureFaceARB")) == NULL) || r; - r = ((glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerARB")) == NULL) || r; - r = ((glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteriARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_geometry_shader4 */ - -#ifdef GL_ARB_get_program_binary - -static GLboolean _glewInit_GL_ARB_get_program_binary () -{ - GLboolean r = GL_FALSE; - - r = ((glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC)glewGetProcAddress((const GLubyte*)"glGetProgramBinary")) == NULL) || r; - r = ((glProgramBinary = (PFNGLPROGRAMBINARYPROC)glewGetProcAddress((const GLubyte*)"glProgramBinary")) == NULL) || r; - r = ((glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteri")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_get_program_binary */ - -#ifdef GL_ARB_get_texture_sub_image - -static GLboolean _glewInit_GL_ARB_get_texture_sub_image () -{ - GLboolean r = GL_FALSE; - - r = ((glGetCompressedTextureSubImage = (PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureSubImage")) == NULL) || r; - r = ((glGetTextureSubImage = (PFNGLGETTEXTURESUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSubImage")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_get_texture_sub_image */ - -#ifdef GL_ARB_gl_spirv - -static GLboolean _glewInit_GL_ARB_gl_spirv () -{ - GLboolean r = GL_FALSE; - - r = ((glSpecializeShaderARB = (PFNGLSPECIALIZESHADERARBPROC)glewGetProcAddress((const GLubyte*)"glSpecializeShaderARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_gl_spirv */ - -#ifdef GL_ARB_gpu_shader_fp64 - -static GLboolean _glewInit_GL_ARB_gpu_shader_fp64 () -{ - GLboolean r = GL_FALSE; - - r = ((glGetUniformdv = (PFNGLGETUNIFORMDVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformdv")) == NULL) || r; - r = ((glUniform1d = (PFNGLUNIFORM1DPROC)glewGetProcAddress((const GLubyte*)"glUniform1d")) == NULL) || r; - r = ((glUniform1dv = (PFNGLUNIFORM1DVPROC)glewGetProcAddress((const GLubyte*)"glUniform1dv")) == NULL) || r; - r = ((glUniform2d = (PFNGLUNIFORM2DPROC)glewGetProcAddress((const GLubyte*)"glUniform2d")) == NULL) || r; - r = ((glUniform2dv = (PFNGLUNIFORM2DVPROC)glewGetProcAddress((const GLubyte*)"glUniform2dv")) == NULL) || r; - r = ((glUniform3d = (PFNGLUNIFORM3DPROC)glewGetProcAddress((const GLubyte*)"glUniform3d")) == NULL) || r; - r = ((glUniform3dv = (PFNGLUNIFORM3DVPROC)glewGetProcAddress((const GLubyte*)"glUniform3dv")) == NULL) || r; - r = ((glUniform4d = (PFNGLUNIFORM4DPROC)glewGetProcAddress((const GLubyte*)"glUniform4d")) == NULL) || r; - r = ((glUniform4dv = (PFNGLUNIFORM4DVPROC)glewGetProcAddress((const GLubyte*)"glUniform4dv")) == NULL) || r; - r = ((glUniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2dv")) == NULL) || r; - r = ((glUniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3dv")) == NULL) || r; - r = ((glUniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4dv")) == NULL) || r; - r = ((glUniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3dv")) == NULL) || r; - r = ((glUniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2dv")) == NULL) || r; - r = ((glUniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4dv")) == NULL) || r; - r = ((glUniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4dv")) == NULL) || r; - r = ((glUniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2dv")) == NULL) || r; - r = ((glUniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3dv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_gpu_shader_fp64 */ - -#ifdef GL_ARB_gpu_shader_int64 - -static GLboolean _glewInit_GL_ARB_gpu_shader_int64 () -{ - GLboolean r = GL_FALSE; - - r = ((glGetUniformi64vARB = (PFNGLGETUNIFORMI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformi64vARB")) == NULL) || r; - r = ((glGetUniformui64vARB = (PFNGLGETUNIFORMUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformui64vARB")) == NULL) || r; - r = ((glGetnUniformi64vARB = (PFNGLGETNUNIFORMI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformi64vARB")) == NULL) || r; - r = ((glGetnUniformui64vARB = (PFNGLGETNUNIFORMUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformui64vARB")) == NULL) || r; - r = ((glProgramUniform1i64ARB = (PFNGLPROGRAMUNIFORM1I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64ARB")) == NULL) || r; - r = ((glProgramUniform1i64vARB = (PFNGLPROGRAMUNIFORM1I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64vARB")) == NULL) || r; - r = ((glProgramUniform1ui64ARB = (PFNGLPROGRAMUNIFORM1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64ARB")) == NULL) || r; - r = ((glProgramUniform1ui64vARB = (PFNGLPROGRAMUNIFORM1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64vARB")) == NULL) || r; - r = ((glProgramUniform2i64ARB = (PFNGLPROGRAMUNIFORM2I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64ARB")) == NULL) || r; - r = ((glProgramUniform2i64vARB = (PFNGLPROGRAMUNIFORM2I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64vARB")) == NULL) || r; - r = ((glProgramUniform2ui64ARB = (PFNGLPROGRAMUNIFORM2UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64ARB")) == NULL) || r; - r = ((glProgramUniform2ui64vARB = (PFNGLPROGRAMUNIFORM2UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64vARB")) == NULL) || r; - r = ((glProgramUniform3i64ARB = (PFNGLPROGRAMUNIFORM3I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64ARB")) == NULL) || r; - r = ((glProgramUniform3i64vARB = (PFNGLPROGRAMUNIFORM3I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64vARB")) == NULL) || r; - r = ((glProgramUniform3ui64ARB = (PFNGLPROGRAMUNIFORM3UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64ARB")) == NULL) || r; - r = ((glProgramUniform3ui64vARB = (PFNGLPROGRAMUNIFORM3UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64vARB")) == NULL) || r; - r = ((glProgramUniform4i64ARB = (PFNGLPROGRAMUNIFORM4I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64ARB")) == NULL) || r; - r = ((glProgramUniform4i64vARB = (PFNGLPROGRAMUNIFORM4I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64vARB")) == NULL) || r; - r = ((glProgramUniform4ui64ARB = (PFNGLPROGRAMUNIFORM4UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64ARB")) == NULL) || r; - r = ((glProgramUniform4ui64vARB = (PFNGLPROGRAMUNIFORM4UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64vARB")) == NULL) || r; - r = ((glUniform1i64ARB = (PFNGLUNIFORM1I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64ARB")) == NULL) || r; - r = ((glUniform1i64vARB = (PFNGLUNIFORM1I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64vARB")) == NULL) || r; - r = ((glUniform1ui64ARB = (PFNGLUNIFORM1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64ARB")) == NULL) || r; - r = ((glUniform1ui64vARB = (PFNGLUNIFORM1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64vARB")) == NULL) || r; - r = ((glUniform2i64ARB = (PFNGLUNIFORM2I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64ARB")) == NULL) || r; - r = ((glUniform2i64vARB = (PFNGLUNIFORM2I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64vARB")) == NULL) || r; - r = ((glUniform2ui64ARB = (PFNGLUNIFORM2UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64ARB")) == NULL) || r; - r = ((glUniform2ui64vARB = (PFNGLUNIFORM2UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64vARB")) == NULL) || r; - r = ((glUniform3i64ARB = (PFNGLUNIFORM3I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64ARB")) == NULL) || r; - r = ((glUniform3i64vARB = (PFNGLUNIFORM3I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64vARB")) == NULL) || r; - r = ((glUniform3ui64ARB = (PFNGLUNIFORM3UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64ARB")) == NULL) || r; - r = ((glUniform3ui64vARB = (PFNGLUNIFORM3UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64vARB")) == NULL) || r; - r = ((glUniform4i64ARB = (PFNGLUNIFORM4I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64ARB")) == NULL) || r; - r = ((glUniform4i64vARB = (PFNGLUNIFORM4I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64vARB")) == NULL) || r; - r = ((glUniform4ui64ARB = (PFNGLUNIFORM4UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64ARB")) == NULL) || r; - r = ((glUniform4ui64vARB = (PFNGLUNIFORM4UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64vARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_gpu_shader_int64 */ - -#ifdef GL_ARB_imaging - -static GLboolean _glewInit_GL_ARB_imaging () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)"glBlendEquation")) == NULL) || r; - r = ((glColorSubTable = (PFNGLCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)"glColorSubTable")) == NULL) || r; - r = ((glColorTable = (PFNGLCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glColorTable")) == NULL) || r; - r = ((glColorTableParameterfv = (PFNGLCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterfv")) == NULL) || r; - r = ((glColorTableParameteriv = (PFNGLCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameteriv")) == NULL) || r; - r = ((glConvolutionFilter1D = (PFNGLCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter1D")) == NULL) || r; - r = ((glConvolutionFilter2D = (PFNGLCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter2D")) == NULL) || r; - r = ((glConvolutionParameterf = (PFNGLCONVOLUTIONPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterf")) == NULL) || r; - r = ((glConvolutionParameterfv = (PFNGLCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfv")) == NULL) || r; - r = ((glConvolutionParameteri = (PFNGLCONVOLUTIONPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteri")) == NULL) || r; - r = ((glConvolutionParameteriv = (PFNGLCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteriv")) == NULL) || r; - r = ((glCopyColorSubTable = (PFNGLCOPYCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)"glCopyColorSubTable")) == NULL) || r; - r = ((glCopyColorTable = (PFNGLCOPYCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glCopyColorTable")) == NULL) || r; - r = ((glCopyConvolutionFilter1D = (PFNGLCOPYCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter1D")) == NULL) || r; - r = ((glCopyConvolutionFilter2D = (PFNGLCOPYCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter2D")) == NULL) || r; - r = ((glGetColorTable = (PFNGLGETCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glGetColorTable")) == NULL) || r; - r = ((glGetColorTableParameterfv = (PFNGLGETCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfv")) == NULL) || r; - r = ((glGetColorTableParameteriv = (PFNGLGETCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameteriv")) == NULL) || r; - r = ((glGetConvolutionFilter = (PFNGLGETCONVOLUTIONFILTERPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionFilter")) == NULL) || r; - r = ((glGetConvolutionParameterfv = (PFNGLGETCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterfv")) == NULL) || r; - r = ((glGetConvolutionParameteriv = (PFNGLGETCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameteriv")) == NULL) || r; - r = ((glGetHistogram = (PFNGLGETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glGetHistogram")) == NULL) || r; - r = ((glGetHistogramParameterfv = (PFNGLGETHISTOGRAMPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterfv")) == NULL) || r; - r = ((glGetHistogramParameteriv = (PFNGLGETHISTOGRAMPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameteriv")) == NULL) || r; - r = ((glGetMinmax = (PFNGLGETMINMAXPROC)glewGetProcAddress((const GLubyte*)"glGetMinmax")) == NULL) || r; - r = ((glGetMinmaxParameterfv = (PFNGLGETMINMAXPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterfv")) == NULL) || r; - r = ((glGetMinmaxParameteriv = (PFNGLGETMINMAXPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameteriv")) == NULL) || r; - r = ((glGetSeparableFilter = (PFNGLGETSEPARABLEFILTERPROC)glewGetProcAddress((const GLubyte*)"glGetSeparableFilter")) == NULL) || r; - r = ((glHistogram = (PFNGLHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glHistogram")) == NULL) || r; - r = ((glMinmax = (PFNGLMINMAXPROC)glewGetProcAddress((const GLubyte*)"glMinmax")) == NULL) || r; - r = ((glResetHistogram = (PFNGLRESETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glResetHistogram")) == NULL) || r; - r = ((glResetMinmax = (PFNGLRESETMINMAXPROC)glewGetProcAddress((const GLubyte*)"glResetMinmax")) == NULL) || r; - r = ((glSeparableFilter2D = (PFNGLSEPARABLEFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glSeparableFilter2D")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_imaging */ - -#ifdef GL_ARB_indirect_parameters - -static GLboolean _glewInit_GL_ARB_indirect_parameters () -{ - GLboolean r = GL_FALSE; - - r = ((glMultiDrawArraysIndirectCountARB = (PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectCountARB")) == NULL) || r; - r = ((glMultiDrawElementsIndirectCountARB = (PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectCountARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_indirect_parameters */ - -#ifdef GL_ARB_instanced_arrays - -static GLboolean _glewInit_GL_ARB_instanced_arrays () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawArraysInstancedARB = (PFNGLDRAWARRAYSINSTANCEDARBPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedARB")) == NULL) || r; - r = ((glDrawElementsInstancedARB = (PFNGLDRAWELEMENTSINSTANCEDARBPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedARB")) == NULL) || r; - r = ((glVertexAttribDivisorARB = (PFNGLVERTEXATTRIBDIVISORARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_instanced_arrays */ - -#ifdef GL_ARB_internalformat_query - -static GLboolean _glewInit_GL_ARB_internalformat_query () -{ - GLboolean r = GL_FALSE; - - r = ((glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformativ")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_internalformat_query */ - -#ifdef GL_ARB_internalformat_query2 - -static GLboolean _glewInit_GL_ARB_internalformat_query2 () -{ - GLboolean r = GL_FALSE; - - r = ((glGetInternalformati64v = (PFNGLGETINTERNALFORMATI64VPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformati64v")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_internalformat_query2 */ - -#ifdef GL_ARB_invalidate_subdata - -static GLboolean _glewInit_GL_ARB_invalidate_subdata () -{ - GLboolean r = GL_FALSE; - - r = ((glInvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateBufferData")) == NULL) || r; - r = ((glInvalidateBufferSubData = (PFNGLINVALIDATEBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateBufferSubData")) == NULL) || r; - r = ((glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glInvalidateFramebuffer")) == NULL) || r; - r = ((glInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glInvalidateSubFramebuffer")) == NULL) || r; - r = ((glInvalidateTexImage = (PFNGLINVALIDATETEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glInvalidateTexImage")) == NULL) || r; - r = ((glInvalidateTexSubImage = (PFNGLINVALIDATETEXSUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glInvalidateTexSubImage")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_invalidate_subdata */ - -#ifdef GL_ARB_map_buffer_range - -static GLboolean _glewInit_GL_ARB_map_buffer_range () -{ - GLboolean r = GL_FALSE; - - r = ((glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedBufferRange")) == NULL) || r; - r = ((glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glMapBufferRange")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_map_buffer_range */ - -#ifdef GL_ARB_matrix_palette - -static GLboolean _glewInit_GL_ARB_matrix_palette () -{ - GLboolean r = GL_FALSE; - - r = ((glCurrentPaletteMatrixARB = (PFNGLCURRENTPALETTEMATRIXARBPROC)glewGetProcAddress((const GLubyte*)"glCurrentPaletteMatrixARB")) == NULL) || r; - r = ((glMatrixIndexPointerARB = (PFNGLMATRIXINDEXPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexPointerARB")) == NULL) || r; - r = ((glMatrixIndexubvARB = (PFNGLMATRIXINDEXUBVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexubvARB")) == NULL) || r; - r = ((glMatrixIndexuivARB = (PFNGLMATRIXINDEXUIVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexuivARB")) == NULL) || r; - r = ((glMatrixIndexusvARB = (PFNGLMATRIXINDEXUSVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexusvARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_matrix_palette */ - -#ifdef GL_ARB_multi_bind - -static GLboolean _glewInit_GL_ARB_multi_bind () -{ - GLboolean r = GL_FALSE; - - r = ((glBindBuffersBase = (PFNGLBINDBUFFERSBASEPROC)glewGetProcAddress((const GLubyte*)"glBindBuffersBase")) == NULL) || r; - r = ((glBindBuffersRange = (PFNGLBINDBUFFERSRANGEPROC)glewGetProcAddress((const GLubyte*)"glBindBuffersRange")) == NULL) || r; - r = ((glBindImageTextures = (PFNGLBINDIMAGETEXTURESPROC)glewGetProcAddress((const GLubyte*)"glBindImageTextures")) == NULL) || r; - r = ((glBindSamplers = (PFNGLBINDSAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glBindSamplers")) == NULL) || r; - r = ((glBindTextures = (PFNGLBINDTEXTURESPROC)glewGetProcAddress((const GLubyte*)"glBindTextures")) == NULL) || r; - r = ((glBindVertexBuffers = (PFNGLBINDVERTEXBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glBindVertexBuffers")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_multi_bind */ - -#ifdef GL_ARB_multi_draw_indirect - -static GLboolean _glewInit_GL_ARB_multi_draw_indirect () -{ - GLboolean r = GL_FALSE; - - r = ((glMultiDrawArraysIndirect = (PFNGLMULTIDRAWARRAYSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirect")) == NULL) || r; - r = ((glMultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirect")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_multi_draw_indirect */ - -#ifdef GL_ARB_multisample - -static GLboolean _glewInit_GL_ARB_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glSampleCoverageARB = (PFNGLSAMPLECOVERAGEARBPROC)glewGetProcAddress((const GLubyte*)"glSampleCoverageARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_multisample */ - -#ifdef GL_ARB_multitexture - -static GLboolean _glewInit_GL_ARB_multitexture () -{ - GLboolean r = GL_FALSE; - - r = ((glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glActiveTextureARB")) == NULL) || r; - r = ((glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glClientActiveTextureARB")) == NULL) || r; - r = ((glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dARB")) == NULL) || r; - r = ((glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dvARB")) == NULL) || r; - r = ((glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fARB")) == NULL) || r; - r = ((glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fvARB")) == NULL) || r; - r = ((glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1iARB")) == NULL) || r; - r = ((glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1ivARB")) == NULL) || r; - r = ((glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1sARB")) == NULL) || r; - r = ((glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1svARB")) == NULL) || r; - r = ((glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dARB")) == NULL) || r; - r = ((glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dvARB")) == NULL) || r; - r = ((glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fARB")) == NULL) || r; - r = ((glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fvARB")) == NULL) || r; - r = ((glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2iARB")) == NULL) || r; - r = ((glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2ivARB")) == NULL) || r; - r = ((glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2sARB")) == NULL) || r; - r = ((glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2svARB")) == NULL) || r; - r = ((glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dARB")) == NULL) || r; - r = ((glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dvARB")) == NULL) || r; - r = ((glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fARB")) == NULL) || r; - r = ((glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fvARB")) == NULL) || r; - r = ((glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3iARB")) == NULL) || r; - r = ((glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3ivARB")) == NULL) || r; - r = ((glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3sARB")) == NULL) || r; - r = ((glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3svARB")) == NULL) || r; - r = ((glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dARB")) == NULL) || r; - r = ((glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dvARB")) == NULL) || r; - r = ((glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fARB")) == NULL) || r; - r = ((glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fvARB")) == NULL) || r; - r = ((glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4iARB")) == NULL) || r; - r = ((glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4ivARB")) == NULL) || r; - r = ((glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4sARB")) == NULL) || r; - r = ((glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4svARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_multitexture */ - -#ifdef GL_ARB_occlusion_query - -static GLboolean _glewInit_GL_ARB_occlusion_query () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginQueryARB = (PFNGLBEGINQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryARB")) == NULL) || r; - r = ((glDeleteQueriesARB = (PFNGLDELETEQUERIESARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueriesARB")) == NULL) || r; - r = ((glEndQueryARB = (PFNGLENDQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glEndQueryARB")) == NULL) || r; - r = ((glGenQueriesARB = (PFNGLGENQUERIESARBPROC)glewGetProcAddress((const GLubyte*)"glGenQueriesARB")) == NULL) || r; - r = ((glGetQueryObjectivARB = (PFNGLGETQUERYOBJECTIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectivARB")) == NULL) || r; - r = ((glGetQueryObjectuivARB = (PFNGLGETQUERYOBJECTUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuivARB")) == NULL) || r; - r = ((glGetQueryivARB = (PFNGLGETQUERYIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryivARB")) == NULL) || r; - r = ((glIsQueryARB = (PFNGLISQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glIsQueryARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_occlusion_query */ - -#ifdef GL_ARB_parallel_shader_compile - -static GLboolean _glewInit_GL_ARB_parallel_shader_compile () -{ - GLboolean r = GL_FALSE; - - r = ((glMaxShaderCompilerThreadsARB = (PFNGLMAXSHADERCOMPILERTHREADSARBPROC)glewGetProcAddress((const GLubyte*)"glMaxShaderCompilerThreadsARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_parallel_shader_compile */ - -#ifdef GL_ARB_point_parameters - -static GLboolean _glewInit_GL_ARB_point_parameters () -{ - GLboolean r = GL_FALSE; - - r = ((glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfARB")) == NULL) || r; - r = ((glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfvARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_point_parameters */ - -#ifdef GL_ARB_polygon_offset_clamp - -static GLboolean _glewInit_GL_ARB_polygon_offset_clamp () -{ - GLboolean r = GL_FALSE; - - r = ((glPolygonOffsetClamp = (PFNGLPOLYGONOFFSETCLAMPPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetClamp")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_polygon_offset_clamp */ - -#ifdef GL_ARB_program_interface_query - -static GLboolean _glewInit_GL_ARB_program_interface_query () -{ - GLboolean r = GL_FALSE; - - r = ((glGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramInterfaceiv")) == NULL) || r; - r = ((glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceIndex")) == NULL) || r; - r = ((glGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceLocation")) == NULL) || r; - r = ((glGetProgramResourceLocationIndex = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceLocationIndex")) == NULL) || r; - r = ((glGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceName")) == NULL) || r; - r = ((glGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceiv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_program_interface_query */ - -#ifdef GL_ARB_provoking_vertex - -static GLboolean _glewInit_GL_ARB_provoking_vertex () -{ - GLboolean r = GL_FALSE; - - r = ((glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC)glewGetProcAddress((const GLubyte*)"glProvokingVertex")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_provoking_vertex */ - -#ifdef GL_ARB_robustness - -static GLboolean _glewInit_GL_ARB_robustness () -{ - GLboolean r = GL_FALSE; - - r = ((glGetGraphicsResetStatusARB = (PFNGLGETGRAPHICSRESETSTATUSARBPROC)glewGetProcAddress((const GLubyte*)"glGetGraphicsResetStatusARB")) == NULL) || r; - r = ((glGetnColorTableARB = (PFNGLGETNCOLORTABLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnColorTableARB")) == NULL) || r; - r = ((glGetnCompressedTexImageARB = (PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnCompressedTexImageARB")) == NULL) || r; - r = ((glGetnConvolutionFilterARB = (PFNGLGETNCONVOLUTIONFILTERARBPROC)glewGetProcAddress((const GLubyte*)"glGetnConvolutionFilterARB")) == NULL) || r; - r = ((glGetnHistogramARB = (PFNGLGETNHISTOGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glGetnHistogramARB")) == NULL) || r; - r = ((glGetnMapdvARB = (PFNGLGETNMAPDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapdvARB")) == NULL) || r; - r = ((glGetnMapfvARB = (PFNGLGETNMAPFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapfvARB")) == NULL) || r; - r = ((glGetnMapivARB = (PFNGLGETNMAPIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapivARB")) == NULL) || r; - r = ((glGetnMinmaxARB = (PFNGLGETNMINMAXARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMinmaxARB")) == NULL) || r; - r = ((glGetnPixelMapfvARB = (PFNGLGETNPIXELMAPFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapfvARB")) == NULL) || r; - r = ((glGetnPixelMapuivARB = (PFNGLGETNPIXELMAPUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapuivARB")) == NULL) || r; - r = ((glGetnPixelMapusvARB = (PFNGLGETNPIXELMAPUSVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapusvARB")) == NULL) || r; - r = ((glGetnPolygonStippleARB = (PFNGLGETNPOLYGONSTIPPLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPolygonStippleARB")) == NULL) || r; - r = ((glGetnSeparableFilterARB = (PFNGLGETNSEPARABLEFILTERARBPROC)glewGetProcAddress((const GLubyte*)"glGetnSeparableFilterARB")) == NULL) || r; - r = ((glGetnTexImageARB = (PFNGLGETNTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnTexImageARB")) == NULL) || r; - r = ((glGetnUniformdvARB = (PFNGLGETNUNIFORMDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformdvARB")) == NULL) || r; - r = ((glGetnUniformfvARB = (PFNGLGETNUNIFORMFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformfvARB")) == NULL) || r; - r = ((glGetnUniformivARB = (PFNGLGETNUNIFORMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformivARB")) == NULL) || r; - r = ((glGetnUniformuivARB = (PFNGLGETNUNIFORMUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformuivARB")) == NULL) || r; - r = ((glReadnPixelsARB = (PFNGLREADNPIXELSARBPROC)glewGetProcAddress((const GLubyte*)"glReadnPixelsARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_robustness */ - -#ifdef GL_ARB_sample_locations - -static GLboolean _glewInit_GL_ARB_sample_locations () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferSampleLocationsfvARB = (PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferSampleLocationsfvARB")) == NULL) || r; - r = ((glNamedFramebufferSampleLocationsfvARB = (PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferSampleLocationsfvARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_sample_locations */ - -#ifdef GL_ARB_sample_shading - -static GLboolean _glewInit_GL_ARB_sample_shading () -{ - GLboolean r = GL_FALSE; - - r = ((glMinSampleShadingARB = (PFNGLMINSAMPLESHADINGARBPROC)glewGetProcAddress((const GLubyte*)"glMinSampleShadingARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_sample_shading */ - -#ifdef GL_ARB_sampler_objects - -static GLboolean _glewInit_GL_ARB_sampler_objects () -{ - GLboolean r = GL_FALSE; - - r = ((glBindSampler = (PFNGLBINDSAMPLERPROC)glewGetProcAddress((const GLubyte*)"glBindSampler")) == NULL) || r; - r = ((glDeleteSamplers = (PFNGLDELETESAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteSamplers")) == NULL) || r; - r = ((glGenSamplers = (PFNGLGENSAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glGenSamplers")) == NULL) || r; - r = ((glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIiv")) == NULL) || r; - r = ((glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIuiv")) == NULL) || r; - r = ((glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterfv")) == NULL) || r; - r = ((glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameteriv")) == NULL) || r; - r = ((glIsSampler = (PFNGLISSAMPLERPROC)glewGetProcAddress((const GLubyte*)"glIsSampler")) == NULL) || r; - r = ((glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIiv")) == NULL) || r; - r = ((glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIuiv")) == NULL) || r; - r = ((glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterf")) == NULL) || r; - r = ((glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterfv")) == NULL) || r; - r = ((glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameteri")) == NULL) || r; - r = ((glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameteriv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_sampler_objects */ - -#ifdef GL_ARB_separate_shader_objects - -static GLboolean _glewInit_GL_ARB_separate_shader_objects () -{ - GLboolean r = GL_FALSE; - - r = ((glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glActiveShaderProgram")) == NULL) || r; - r = ((glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glBindProgramPipeline")) == NULL) || r; - r = ((glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderProgramv")) == NULL) || r; - r = ((glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramPipelines")) == NULL) || r; - r = ((glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glGenProgramPipelines")) == NULL) || r; - r = ((glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetProgramPipelineInfoLog")) == NULL) || r; - r = ((glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramPipelineiv")) == NULL) || r; - r = ((glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glIsProgramPipeline")) == NULL) || r; - r = ((glProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1d")) == NULL) || r; - r = ((glProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1dv")) == NULL) || r; - r = ((glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1f")) == NULL) || r; - r = ((glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fv")) == NULL) || r; - r = ((glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i")) == NULL) || r; - r = ((glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1iv")) == NULL) || r; - r = ((glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui")) == NULL) || r; - r = ((glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uiv")) == NULL) || r; - r = ((glProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2d")) == NULL) || r; - r = ((glProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2dv")) == NULL) || r; - r = ((glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2f")) == NULL) || r; - r = ((glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fv")) == NULL) || r; - r = ((glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i")) == NULL) || r; - r = ((glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2iv")) == NULL) || r; - r = ((glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui")) == NULL) || r; - r = ((glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uiv")) == NULL) || r; - r = ((glProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3d")) == NULL) || r; - r = ((glProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3dv")) == NULL) || r; - r = ((glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3f")) == NULL) || r; - r = ((glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fv")) == NULL) || r; - r = ((glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i")) == NULL) || r; - r = ((glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3iv")) == NULL) || r; - r = ((glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui")) == NULL) || r; - r = ((glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uiv")) == NULL) || r; - r = ((glProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4d")) == NULL) || r; - r = ((glProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4dv")) == NULL) || r; - r = ((glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4f")) == NULL) || r; - r = ((glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fv")) == NULL) || r; - r = ((glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i")) == NULL) || r; - r = ((glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4iv")) == NULL) || r; - r = ((glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui")) == NULL) || r; - r = ((glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uiv")) == NULL) || r; - r = ((glProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2dv")) == NULL) || r; - r = ((glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2fv")) == NULL) || r; - r = ((glProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3dv")) == NULL) || r; - r = ((glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3fv")) == NULL) || r; - r = ((glProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4dv")) == NULL) || r; - r = ((glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4fv")) == NULL) || r; - r = ((glProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3dv")) == NULL) || r; - r = ((glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3fv")) == NULL) || r; - r = ((glProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2dv")) == NULL) || r; - r = ((glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2fv")) == NULL) || r; - r = ((glProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4dv")) == NULL) || r; - r = ((glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4fv")) == NULL) || r; - r = ((glProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4dv")) == NULL) || r; - r = ((glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4fv")) == NULL) || r; - r = ((glProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2dv")) == NULL) || r; - r = ((glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2fv")) == NULL) || r; - r = ((glProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3dv")) == NULL) || r; - r = ((glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3fv")) == NULL) || r; - r = ((glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC)glewGetProcAddress((const GLubyte*)"glUseProgramStages")) == NULL) || r; - r = ((glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glValidateProgramPipeline")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_separate_shader_objects */ - -#ifdef GL_ARB_shader_atomic_counters - -static GLboolean _glewInit_GL_ARB_shader_atomic_counters () -{ - GLboolean r = GL_FALSE; - - r = ((glGetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAtomicCounterBufferiv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_shader_atomic_counters */ - -#ifdef GL_ARB_shader_image_load_store - -static GLboolean _glewInit_GL_ARB_shader_image_load_store () -{ - GLboolean r = GL_FALSE; - - r = ((glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glBindImageTexture")) == NULL) || r; - r = ((glMemoryBarrier = (PFNGLMEMORYBARRIERPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrier")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_shader_image_load_store */ - -#ifdef GL_ARB_shader_objects - -static GLboolean _glewInit_GL_ARB_shader_objects () -{ - GLboolean r = GL_FALSE; - - r = ((glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glAttachObjectARB")) == NULL) || r; - r = ((glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)glewGetProcAddress((const GLubyte*)"glCompileShaderARB")) == NULL) || r; - r = ((glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateProgramObjectARB")) == NULL) || r; - r = ((glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderObjectARB")) == NULL) || r; - r = ((glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteObjectARB")) == NULL) || r; - r = ((glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glDetachObjectARB")) == NULL) || r; - r = ((glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformARB")) == NULL) || r; - r = ((glGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC)glewGetProcAddress((const GLubyte*)"glGetAttachedObjectsARB")) == NULL) || r; - r = ((glGetHandleARB = (PFNGLGETHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetHandleARB")) == NULL) || r; - r = ((glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)glewGetProcAddress((const GLubyte*)"glGetInfoLogARB")) == NULL) || r; - r = ((glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterfvARB")) == NULL) || r; - r = ((glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterivARB")) == NULL) || r; - r = ((glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)"glGetShaderSourceARB")) == NULL) || r; - r = ((glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformLocationARB")) == NULL) || r; - r = ((glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformfvARB")) == NULL) || r; - r = ((glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformivARB")) == NULL) || r; - r = ((glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glLinkProgramARB")) == NULL) || r; - r = ((glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)"glShaderSourceARB")) == NULL) || r; - r = ((glUniform1fARB = (PFNGLUNIFORM1FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1fARB")) == NULL) || r; - r = ((glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1fvARB")) == NULL) || r; - r = ((glUniform1iARB = (PFNGLUNIFORM1IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1iARB")) == NULL) || r; - r = ((glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ivARB")) == NULL) || r; - r = ((glUniform2fARB = (PFNGLUNIFORM2FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2fARB")) == NULL) || r; - r = ((glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2fvARB")) == NULL) || r; - r = ((glUniform2iARB = (PFNGLUNIFORM2IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2iARB")) == NULL) || r; - r = ((glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ivARB")) == NULL) || r; - r = ((glUniform3fARB = (PFNGLUNIFORM3FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3fARB")) == NULL) || r; - r = ((glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3fvARB")) == NULL) || r; - r = ((glUniform3iARB = (PFNGLUNIFORM3IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3iARB")) == NULL) || r; - r = ((glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ivARB")) == NULL) || r; - r = ((glUniform4fARB = (PFNGLUNIFORM4FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4fARB")) == NULL) || r; - r = ((glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4fvARB")) == NULL) || r; - r = ((glUniform4iARB = (PFNGLUNIFORM4IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4iARB")) == NULL) || r; - r = ((glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ivARB")) == NULL) || r; - r = ((glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2fvARB")) == NULL) || r; - r = ((glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3fvARB")) == NULL) || r; - r = ((glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4fvARB")) == NULL) || r; - r = ((glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glUseProgramObjectARB")) == NULL) || r; - r = ((glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glValidateProgramARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_shader_objects */ - -#ifdef GL_ARB_shader_storage_buffer_object - -static GLboolean _glewInit_GL_ARB_shader_storage_buffer_object () -{ - GLboolean r = GL_FALSE; - - r = ((glShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC)glewGetProcAddress((const GLubyte*)"glShaderStorageBlockBinding")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_shader_storage_buffer_object */ - -#ifdef GL_ARB_shader_subroutine - -static GLboolean _glewInit_GL_ARB_shader_subroutine () -{ - GLboolean r = GL_FALSE; - - r = ((glGetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineName")) == NULL) || r; - r = ((glGetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineUniformName")) == NULL) || r; - r = ((glGetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineUniformiv")) == NULL) || r; - r = ((glGetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStageiv")) == NULL) || r; - r = ((glGetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetSubroutineIndex")) == NULL) || r; - r = ((glGetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetSubroutineUniformLocation")) == NULL) || r; - r = ((glGetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformSubroutineuiv")) == NULL) || r; - r = ((glUniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC)glewGetProcAddress((const GLubyte*)"glUniformSubroutinesuiv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_shader_subroutine */ - -#ifdef GL_ARB_shading_language_include - -static GLboolean _glewInit_GL_ARB_shading_language_include () -{ - GLboolean r = GL_FALSE; - - r = ((glCompileShaderIncludeARB = (PFNGLCOMPILESHADERINCLUDEARBPROC)glewGetProcAddress((const GLubyte*)"glCompileShaderIncludeARB")) == NULL) || r; - r = ((glDeleteNamedStringARB = (PFNGLDELETENAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteNamedStringARB")) == NULL) || r; - r = ((glGetNamedStringARB = (PFNGLGETNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glGetNamedStringARB")) == NULL) || r; - r = ((glGetNamedStringivARB = (PFNGLGETNAMEDSTRINGIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetNamedStringivARB")) == NULL) || r; - r = ((glIsNamedStringARB = (PFNGLISNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glIsNamedStringARB")) == NULL) || r; - r = ((glNamedStringARB = (PFNGLNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glNamedStringARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_shading_language_include */ - -#ifdef GL_ARB_sparse_buffer - -static GLboolean _glewInit_GL_ARB_sparse_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((glBufferPageCommitmentARB = (PFNGLBUFFERPAGECOMMITMENTARBPROC)glewGetProcAddress((const GLubyte*)"glBufferPageCommitmentARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_sparse_buffer */ - -#ifdef GL_ARB_sparse_texture - -static GLboolean _glewInit_GL_ARB_sparse_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glTexPageCommitmentARB = (PFNGLTEXPAGECOMMITMENTARBPROC)glewGetProcAddress((const GLubyte*)"glTexPageCommitmentARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_sparse_texture */ - -#ifdef GL_ARB_sync - -static GLboolean _glewInit_GL_ARB_sync () -{ - GLboolean r = GL_FALSE; - - r = ((glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"glClientWaitSync")) == NULL) || r; - r = ((glDeleteSync = (PFNGLDELETESYNCPROC)glewGetProcAddress((const GLubyte*)"glDeleteSync")) == NULL) || r; - r = ((glFenceSync = (PFNGLFENCESYNCPROC)glewGetProcAddress((const GLubyte*)"glFenceSync")) == NULL) || r; - r = ((glGetInteger64v = (PFNGLGETINTEGER64VPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64v")) == NULL) || r; - r = ((glGetSynciv = (PFNGLGETSYNCIVPROC)glewGetProcAddress((const GLubyte*)"glGetSynciv")) == NULL) || r; - r = ((glIsSync = (PFNGLISSYNCPROC)glewGetProcAddress((const GLubyte*)"glIsSync")) == NULL) || r; - r = ((glWaitSync = (PFNGLWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"glWaitSync")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_sync */ - -#ifdef GL_ARB_tessellation_shader - -static GLboolean _glewInit_GL_ARB_tessellation_shader () -{ - GLboolean r = GL_FALSE; - - r = ((glPatchParameterfv = (PFNGLPATCHPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glPatchParameterfv")) == NULL) || r; - r = ((glPatchParameteri = (PFNGLPATCHPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glPatchParameteri")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_tessellation_shader */ - -#ifdef GL_ARB_texture_barrier - -static GLboolean _glewInit_GL_ARB_texture_barrier () -{ - GLboolean r = GL_FALSE; - - r = ((glTextureBarrier = (PFNGLTEXTUREBARRIERPROC)glewGetProcAddress((const GLubyte*)"glTextureBarrier")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_barrier */ - -#ifdef GL_ARB_texture_buffer_object - -static GLboolean _glewInit_GL_ARB_texture_buffer_object () -{ - GLboolean r = GL_FALSE; - - r = ((glTexBufferARB = (PFNGLTEXBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glTexBufferARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_buffer_object */ - -#ifdef GL_ARB_texture_buffer_range - -static GLboolean _glewInit_GL_ARB_texture_buffer_range () -{ - GLboolean r = GL_FALSE; - - r = ((glTexBufferRange = (PFNGLTEXBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTexBufferRange")) == NULL) || r; - r = ((glTextureBufferRangeEXT = (PFNGLTEXTUREBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferRangeEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_buffer_range */ - -#ifdef GL_ARB_texture_compression - -static GLboolean _glewInit_GL_ARB_texture_compression () -{ - GLboolean r = GL_FALSE; - - r = ((glCompressedTexImage1DARB = (PFNGLCOMPRESSEDTEXIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage1DARB")) == NULL) || r; - r = ((glCompressedTexImage2DARB = (PFNGLCOMPRESSEDTEXIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage2DARB")) == NULL) || r; - r = ((glCompressedTexImage3DARB = (PFNGLCOMPRESSEDTEXIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3DARB")) == NULL) || r; - r = ((glCompressedTexSubImage1DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage1DARB")) == NULL) || r; - r = ((glCompressedTexSubImage2DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage2DARB")) == NULL) || r; - r = ((glCompressedTexSubImage3DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3DARB")) == NULL) || r; - r = ((glGetCompressedTexImageARB = (PFNGLGETCOMPRESSEDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTexImageARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_compression */ - -#ifdef GL_ARB_texture_multisample - -static GLboolean _glewInit_GL_ARB_texture_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC)glewGetProcAddress((const GLubyte*)"glGetMultisamplefv")) == NULL) || r; - r = ((glSampleMaski = (PFNGLSAMPLEMASKIPROC)glewGetProcAddress((const GLubyte*)"glSampleMaski")) == NULL) || r; - r = ((glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexImage2DMultisample")) == NULL) || r; - r = ((glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DMultisample")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_multisample */ - -#ifdef GL_ARB_texture_storage - -static GLboolean _glewInit_GL_ARB_texture_storage () -{ - GLboolean r = GL_FALSE; - - r = ((glTexStorage1D = (PFNGLTEXSTORAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage1D")) == NULL) || r; - r = ((glTexStorage2D = (PFNGLTEXSTORAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage2D")) == NULL) || r; - r = ((glTexStorage3D = (PFNGLTEXSTORAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage3D")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_storage */ - -#ifdef GL_ARB_texture_storage_multisample - -static GLboolean _glewInit_GL_ARB_texture_storage_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexStorage2DMultisample")) == NULL) || r; - r = ((glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexStorage3DMultisample")) == NULL) || r; - r = ((glTextureStorage2DMultisampleEXT = (PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DMultisampleEXT")) == NULL) || r; - r = ((glTextureStorage3DMultisampleEXT = (PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DMultisampleEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_storage_multisample */ - -#ifdef GL_ARB_texture_view - -static GLboolean _glewInit_GL_ARB_texture_view () -{ - GLboolean r = GL_FALSE; - - r = ((glTextureView = (PFNGLTEXTUREVIEWPROC)glewGetProcAddress((const GLubyte*)"glTextureView")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_view */ - -#ifdef GL_ARB_timer_query - -static GLboolean _glewInit_GL_ARB_timer_query () -{ - GLboolean r = GL_FALSE; - - r = ((glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64v")) == NULL) || r; - r = ((glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64v")) == NULL) || r; - r = ((glQueryCounter = (PFNGLQUERYCOUNTERPROC)glewGetProcAddress((const GLubyte*)"glQueryCounter")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_timer_query */ - -#ifdef GL_ARB_transform_feedback2 - -static GLboolean _glewInit_GL_ARB_transform_feedback2 () -{ - GLboolean r = GL_FALSE; - - r = ((glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glBindTransformFeedback")) == NULL) || r; - r = ((glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glDeleteTransformFeedbacks")) == NULL) || r; - r = ((glDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedback")) == NULL) || r; - r = ((glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glGenTransformFeedbacks")) == NULL) || r; - r = ((glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glIsTransformFeedback")) == NULL) || r; - r = ((glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glPauseTransformFeedback")) == NULL) || r; - r = ((glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glResumeTransformFeedback")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_transform_feedback2 */ - -#ifdef GL_ARB_transform_feedback3 - -static GLboolean _glewInit_GL_ARB_transform_feedback3 () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryIndexed")) == NULL) || r; - r = ((glDrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackStream")) == NULL) || r; - r = ((glEndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glEndQueryIndexed")) == NULL) || r; - r = ((glGetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryIndexediv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_transform_feedback3 */ - -#ifdef GL_ARB_transform_feedback_instanced - -static GLboolean _glewInit_GL_ARB_transform_feedback_instanced () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawTransformFeedbackInstanced = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackInstanced")) == NULL) || r; - r = ((glDrawTransformFeedbackStreamInstanced = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackStreamInstanced")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_transform_feedback_instanced */ - -#ifdef GL_ARB_transpose_matrix - -static GLboolean _glewInit_GL_ARB_transpose_matrix () -{ - GLboolean r = GL_FALSE; - - r = ((glLoadTransposeMatrixdARB = (PFNGLLOADTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixdARB")) == NULL) || r; - r = ((glLoadTransposeMatrixfARB = (PFNGLLOADTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixfARB")) == NULL) || r; - r = ((glMultTransposeMatrixdARB = (PFNGLMULTTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixdARB")) == NULL) || r; - r = ((glMultTransposeMatrixfARB = (PFNGLMULTTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixfARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_transpose_matrix */ - -#ifdef GL_ARB_uniform_buffer_object - -static GLboolean _glewInit_GL_ARB_uniform_buffer_object () -{ - GLboolean r = GL_FALSE; - - r = ((glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBase")) == NULL) || r; - r = ((glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRange")) == NULL) || r; - r = ((glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformBlockName")) == NULL) || r; - r = ((glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformBlockiv")) == NULL) || r; - r = ((glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformName")) == NULL) || r; - r = ((glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformsiv")) == NULL) || r; - r = ((glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)glewGetProcAddress((const GLubyte*)"glGetIntegeri_v")) == NULL) || r; - r = ((glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetUniformBlockIndex")) == NULL) || r; - r = ((glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC)glewGetProcAddress((const GLubyte*)"glGetUniformIndices")) == NULL) || r; - r = ((glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)glewGetProcAddress((const GLubyte*)"glUniformBlockBinding")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_uniform_buffer_object */ - -#ifdef GL_ARB_vertex_array_object - -static GLboolean _glewInit_GL_ARB_vertex_array_object () -{ - GLboolean r = GL_FALSE; - - r = ((glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArray")) == NULL) || r; - r = ((glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArrays")) == NULL) || r; - r = ((glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArrays")) == NULL) || r; - r = ((glIsVertexArray = (PFNGLISVERTEXARRAYPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArray")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_array_object */ - -#ifdef GL_ARB_vertex_attrib_64bit - -static GLboolean _glewInit_GL_ARB_vertex_attrib_64bit () -{ - GLboolean r = GL_FALSE; - - r = ((glGetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLdv")) == NULL) || r; - r = ((glVertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1d")) == NULL) || r; - r = ((glVertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dv")) == NULL) || r; - r = ((glVertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2d")) == NULL) || r; - r = ((glVertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dv")) == NULL) || r; - r = ((glVertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3d")) == NULL) || r; - r = ((glVertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dv")) == NULL) || r; - r = ((glVertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4d")) == NULL) || r; - r = ((glVertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dv")) == NULL) || r; - r = ((glVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLPointer")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_attrib_64bit */ - -#ifdef GL_ARB_vertex_attrib_binding - -static GLboolean _glewInit_GL_ARB_vertex_attrib_binding () -{ - GLboolean r = GL_FALSE; - - r = ((glBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindVertexBuffer")) == NULL) || r; - r = ((glVertexArrayBindVertexBufferEXT = (PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayBindVertexBufferEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribBindingEXT = (PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribBindingEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribFormatEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribIFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribIFormatEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribLFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribLFormatEXT")) == NULL) || r; - r = ((glVertexArrayVertexBindingDivisorEXT = (PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBindingDivisorEXT")) == NULL) || r; - r = ((glVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribBinding")) == NULL) || r; - r = ((glVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribFormat")) == NULL) || r; - r = ((glVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIFormat")) == NULL) || r; - r = ((glVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLFormat")) == NULL) || r; - r = ((glVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexBindingDivisor")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_attrib_binding */ - -#ifdef GL_ARB_vertex_blend - -static GLboolean _glewInit_GL_ARB_vertex_blend () -{ - GLboolean r = GL_FALSE; - - r = ((glVertexBlendARB = (PFNGLVERTEXBLENDARBPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendARB")) == NULL) || r; - r = ((glWeightPointerARB = (PFNGLWEIGHTPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glWeightPointerARB")) == NULL) || r; - r = ((glWeightbvARB = (PFNGLWEIGHTBVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightbvARB")) == NULL) || r; - r = ((glWeightdvARB = (PFNGLWEIGHTDVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightdvARB")) == NULL) || r; - r = ((glWeightfvARB = (PFNGLWEIGHTFVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightfvARB")) == NULL) || r; - r = ((glWeightivARB = (PFNGLWEIGHTIVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightivARB")) == NULL) || r; - r = ((glWeightsvARB = (PFNGLWEIGHTSVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightsvARB")) == NULL) || r; - r = ((glWeightubvARB = (PFNGLWEIGHTUBVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightubvARB")) == NULL) || r; - r = ((glWeightuivARB = (PFNGLWEIGHTUIVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightuivARB")) == NULL) || r; - r = ((glWeightusvARB = (PFNGLWEIGHTUSVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightusvARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_blend */ - -#ifdef GL_ARB_vertex_buffer_object - -static GLboolean _glewInit_GL_ARB_vertex_buffer_object () -{ - GLboolean r = GL_FALSE; - - r = ((glBindBufferARB = (PFNGLBINDBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glBindBufferARB")) == NULL) || r; - r = ((glBufferDataARB = (PFNGLBUFFERDATAARBPROC)glewGetProcAddress((const GLubyte*)"glBufferDataARB")) == NULL) || r; - r = ((glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)"glBufferSubDataARB")) == NULL) || r; - r = ((glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteBuffersARB")) == NULL) || r; - r = ((glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glGenBuffersARB")) == NULL) || r; - r = ((glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameterivARB")) == NULL) || r; - r = ((glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferPointervARB")) == NULL) || r; - r = ((glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferSubDataARB")) == NULL) || r; - r = ((glIsBufferARB = (PFNGLISBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glIsBufferARB")) == NULL) || r; - r = ((glMapBufferARB = (PFNGLMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glMapBufferARB")) == NULL) || r; - r = ((glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glUnmapBufferARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_buffer_object */ - -#ifdef GL_ARB_vertex_program - -static GLboolean _glewInit_GL_ARB_vertex_program () -{ - GLboolean r = GL_FALSE; - - r = ((glBindProgramARB = (PFNGLBINDPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glBindProgramARB")) == NULL) || r; - r = ((glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramsARB")) == NULL) || r; - r = ((glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribArrayARB")) == NULL) || r; - r = ((glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribArrayARB")) == NULL) || r; - r = ((glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)"glGenProgramsARB")) == NULL) || r; - r = ((glGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramEnvParameterdvARB")) == NULL) || r; - r = ((glGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramEnvParameterfvARB")) == NULL) || r; - r = ((glGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramLocalParameterdvARB")) == NULL) || r; - r = ((glGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramLocalParameterfvARB")) == NULL) || r; - r = ((glGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStringARB")) == NULL) || r; - r = ((glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramivARB")) == NULL) || r; - r = ((glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointervARB")) == NULL) || r; - r = ((glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdvARB")) == NULL) || r; - r = ((glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfvARB")) == NULL) || r; - r = ((glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribivARB")) == NULL) || r; - r = ((glIsProgramARB = (PFNGLISPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glIsProgramARB")) == NULL) || r; - r = ((glProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4dARB")) == NULL) || r; - r = ((glProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4dvARB")) == NULL) || r; - r = ((glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4fARB")) == NULL) || r; - r = ((glProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4fvARB")) == NULL) || r; - r = ((glProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4dARB")) == NULL) || r; - r = ((glProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4dvARB")) == NULL) || r; - r = ((glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4fARB")) == NULL) || r; - r = ((glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4fvARB")) == NULL) || r; - r = ((glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glProgramStringARB")) == NULL) || r; - r = ((glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dARB")) == NULL) || r; - r = ((glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dvARB")) == NULL) || r; - r = ((glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fARB")) == NULL) || r; - r = ((glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fvARB")) == NULL) || r; - r = ((glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sARB")) == NULL) || r; - r = ((glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1svARB")) == NULL) || r; - r = ((glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dARB")) == NULL) || r; - r = ((glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dvARB")) == NULL) || r; - r = ((glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fARB")) == NULL) || r; - r = ((glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fvARB")) == NULL) || r; - r = ((glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sARB")) == NULL) || r; - r = ((glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2svARB")) == NULL) || r; - r = ((glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dARB")) == NULL) || r; - r = ((glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dvARB")) == NULL) || r; - r = ((glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fARB")) == NULL) || r; - r = ((glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fvARB")) == NULL) || r; - r = ((glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sARB")) == NULL) || r; - r = ((glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3svARB")) == NULL) || r; - r = ((glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NbvARB")) == NULL) || r; - r = ((glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NivARB")) == NULL) || r; - r = ((glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NsvARB")) == NULL) || r; - r = ((glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NubARB")) == NULL) || r; - r = ((glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NubvARB")) == NULL) || r; - r = ((glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NuivARB")) == NULL) || r; - r = ((glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NusvARB")) == NULL) || r; - r = ((glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4bvARB")) == NULL) || r; - r = ((glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dARB")) == NULL) || r; - r = ((glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dvARB")) == NULL) || r; - r = ((glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fARB")) == NULL) || r; - r = ((glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fvARB")) == NULL) || r; - r = ((glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ivARB")) == NULL) || r; - r = ((glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sARB")) == NULL) || r; - r = ((glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4svARB")) == NULL) || r; - r = ((glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubvARB")) == NULL) || r; - r = ((glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4uivARB")) == NULL) || r; - r = ((glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4usvARB")) == NULL) || r; - r = ((glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointerARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_program */ - -#ifdef GL_ARB_vertex_shader - -static GLboolean _glewInit_GL_ARB_vertex_shader () -{ - GLboolean r = GL_FALSE; - - r = ((glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glBindAttribLocationARB")) == NULL) || r; - r = ((glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAttribARB")) == NULL) || r; - r = ((glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glGetAttribLocationARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_shader */ - -#ifdef GL_ARB_vertex_type_2_10_10_10_rev - -static GLboolean _glewInit_GL_ARB_vertex_type_2_10_10_10_rev () -{ - GLboolean r = GL_FALSE; - - r = ((glColorP3ui = (PFNGLCOLORP3UIPROC)glewGetProcAddress((const GLubyte*)"glColorP3ui")) == NULL) || r; - r = ((glColorP3uiv = (PFNGLCOLORP3UIVPROC)glewGetProcAddress((const GLubyte*)"glColorP3uiv")) == NULL) || r; - r = ((glColorP4ui = (PFNGLCOLORP4UIPROC)glewGetProcAddress((const GLubyte*)"glColorP4ui")) == NULL) || r; - r = ((glColorP4uiv = (PFNGLCOLORP4UIVPROC)glewGetProcAddress((const GLubyte*)"glColorP4uiv")) == NULL) || r; - r = ((glMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP1ui")) == NULL) || r; - r = ((glMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP1uiv")) == NULL) || r; - r = ((glMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP2ui")) == NULL) || r; - r = ((glMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP2uiv")) == NULL) || r; - r = ((glMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP3ui")) == NULL) || r; - r = ((glMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP3uiv")) == NULL) || r; - r = ((glMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP4ui")) == NULL) || r; - r = ((glMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP4uiv")) == NULL) || r; - r = ((glNormalP3ui = (PFNGLNORMALP3UIPROC)glewGetProcAddress((const GLubyte*)"glNormalP3ui")) == NULL) || r; - r = ((glNormalP3uiv = (PFNGLNORMALP3UIVPROC)glewGetProcAddress((const GLubyte*)"glNormalP3uiv")) == NULL) || r; - r = ((glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorP3ui")) == NULL) || r; - r = ((glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorP3uiv")) == NULL) || r; - r = ((glTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP1ui")) == NULL) || r; - r = ((glTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP1uiv")) == NULL) || r; - r = ((glTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP2ui")) == NULL) || r; - r = ((glTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP2uiv")) == NULL) || r; - r = ((glTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP3ui")) == NULL) || r; - r = ((glTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP3uiv")) == NULL) || r; - r = ((glTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP4ui")) == NULL) || r; - r = ((glTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP4uiv")) == NULL) || r; - r = ((glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP1ui")) == NULL) || r; - r = ((glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP1uiv")) == NULL) || r; - r = ((glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP2ui")) == NULL) || r; - r = ((glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP2uiv")) == NULL) || r; - r = ((glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP3ui")) == NULL) || r; - r = ((glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP3uiv")) == NULL) || r; - r = ((glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP4ui")) == NULL) || r; - r = ((glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP4uiv")) == NULL) || r; - r = ((glVertexP2ui = (PFNGLVERTEXP2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP2ui")) == NULL) || r; - r = ((glVertexP2uiv = (PFNGLVERTEXP2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP2uiv")) == NULL) || r; - r = ((glVertexP3ui = (PFNGLVERTEXP3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP3ui")) == NULL) || r; - r = ((glVertexP3uiv = (PFNGLVERTEXP3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP3uiv")) == NULL) || r; - r = ((glVertexP4ui = (PFNGLVERTEXP4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP4ui")) == NULL) || r; - r = ((glVertexP4uiv = (PFNGLVERTEXP4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP4uiv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ - -#ifdef GL_ARB_viewport_array - -static GLboolean _glewInit_GL_ARB_viewport_array () -{ - GLboolean r = GL_FALSE; - - r = ((glDepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeArrayv")) == NULL) || r; - r = ((glDepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeIndexed")) == NULL) || r; - r = ((glGetDoublei_v = (PFNGLGETDOUBLEI_VPROC)glewGetProcAddress((const GLubyte*)"glGetDoublei_v")) == NULL) || r; - r = ((glGetFloati_v = (PFNGLGETFLOATI_VPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_v")) == NULL) || r; - r = ((glScissorArrayv = (PFNGLSCISSORARRAYVPROC)glewGetProcAddress((const GLubyte*)"glScissorArrayv")) == NULL) || r; - r = ((glScissorIndexed = (PFNGLSCISSORINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexed")) == NULL) || r; - r = ((glScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexedv")) == NULL) || r; - r = ((glViewportArrayv = (PFNGLVIEWPORTARRAYVPROC)glewGetProcAddress((const GLubyte*)"glViewportArrayv")) == NULL) || r; - r = ((glViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedf")) == NULL) || r; - r = ((glViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedfv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_viewport_array */ - -#ifdef GL_ARB_window_pos - -static GLboolean _glewInit_GL_ARB_window_pos () -{ - GLboolean r = GL_FALSE; - - r = ((glWindowPos2dARB = (PFNGLWINDOWPOS2DARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dARB")) == NULL) || r; - r = ((glWindowPos2dvARB = (PFNGLWINDOWPOS2DVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dvARB")) == NULL) || r; - r = ((glWindowPos2fARB = (PFNGLWINDOWPOS2FARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fARB")) == NULL) || r; - r = ((glWindowPos2fvARB = (PFNGLWINDOWPOS2FVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fvARB")) == NULL) || r; - r = ((glWindowPos2iARB = (PFNGLWINDOWPOS2IARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iARB")) == NULL) || r; - r = ((glWindowPos2ivARB = (PFNGLWINDOWPOS2IVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2ivARB")) == NULL) || r; - r = ((glWindowPos2sARB = (PFNGLWINDOWPOS2SARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sARB")) == NULL) || r; - r = ((glWindowPos2svARB = (PFNGLWINDOWPOS2SVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2svARB")) == NULL) || r; - r = ((glWindowPos3dARB = (PFNGLWINDOWPOS3DARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dARB")) == NULL) || r; - r = ((glWindowPos3dvARB = (PFNGLWINDOWPOS3DVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dvARB")) == NULL) || r; - r = ((glWindowPos3fARB = (PFNGLWINDOWPOS3FARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fARB")) == NULL) || r; - r = ((glWindowPos3fvARB = (PFNGLWINDOWPOS3FVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fvARB")) == NULL) || r; - r = ((glWindowPos3iARB = (PFNGLWINDOWPOS3IARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iARB")) == NULL) || r; - r = ((glWindowPos3ivARB = (PFNGLWINDOWPOS3IVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3ivARB")) == NULL) || r; - r = ((glWindowPos3sARB = (PFNGLWINDOWPOS3SARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sARB")) == NULL) || r; - r = ((glWindowPos3svARB = (PFNGLWINDOWPOS3SVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3svARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_window_pos */ - -#ifdef GL_ATI_draw_buffers - -static GLboolean _glewInit_GL_ATI_draw_buffers () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawBuffersATI = (PFNGLDRAWBUFFERSATIPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_draw_buffers */ - -#ifdef GL_ATI_element_array - -static GLboolean _glewInit_GL_ATI_element_array () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawElementArrayATI = (PFNGLDRAWELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)"glDrawElementArrayATI")) == NULL) || r; - r = ((glDrawRangeElementArrayATI = (PFNGLDRAWRANGEELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementArrayATI")) == NULL) || r; - r = ((glElementPointerATI = (PFNGLELEMENTPOINTERATIPROC)glewGetProcAddress((const GLubyte*)"glElementPointerATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_element_array */ - -#ifdef GL_ATI_envmap_bumpmap - -static GLboolean _glewInit_GL_ATI_envmap_bumpmap () -{ - GLboolean r = GL_FALSE; - - r = ((glGetTexBumpParameterfvATI = (PFNGLGETTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetTexBumpParameterfvATI")) == NULL) || r; - r = ((glGetTexBumpParameterivATI = (PFNGLGETTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetTexBumpParameterivATI")) == NULL) || r; - r = ((glTexBumpParameterfvATI = (PFNGLTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)"glTexBumpParameterfvATI")) == NULL) || r; - r = ((glTexBumpParameterivATI = (PFNGLTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)"glTexBumpParameterivATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_envmap_bumpmap */ - -#ifdef GL_ATI_fragment_shader - -static GLboolean _glewInit_GL_ATI_fragment_shader () -{ - GLboolean r = GL_FALSE; - - r = ((glAlphaFragmentOp1ATI = (PFNGLALPHAFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp1ATI")) == NULL) || r; - r = ((glAlphaFragmentOp2ATI = (PFNGLALPHAFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp2ATI")) == NULL) || r; - r = ((glAlphaFragmentOp3ATI = (PFNGLALPHAFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp3ATI")) == NULL) || r; - r = ((glBeginFragmentShaderATI = (PFNGLBEGINFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glBeginFragmentShaderATI")) == NULL) || r; - r = ((glBindFragmentShaderATI = (PFNGLBINDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glBindFragmentShaderATI")) == NULL) || r; - r = ((glColorFragmentOp1ATI = (PFNGLCOLORFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp1ATI")) == NULL) || r; - r = ((glColorFragmentOp2ATI = (PFNGLCOLORFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp2ATI")) == NULL) || r; - r = ((glColorFragmentOp3ATI = (PFNGLCOLORFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp3ATI")) == NULL) || r; - r = ((glDeleteFragmentShaderATI = (PFNGLDELETEFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glDeleteFragmentShaderATI")) == NULL) || r; - r = ((glEndFragmentShaderATI = (PFNGLENDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glEndFragmentShaderATI")) == NULL) || r; - r = ((glGenFragmentShadersATI = (PFNGLGENFRAGMENTSHADERSATIPROC)glewGetProcAddress((const GLubyte*)"glGenFragmentShadersATI")) == NULL) || r; - r = ((glPassTexCoordATI = (PFNGLPASSTEXCOORDATIPROC)glewGetProcAddress((const GLubyte*)"glPassTexCoordATI")) == NULL) || r; - r = ((glSampleMapATI = (PFNGLSAMPLEMAPATIPROC)glewGetProcAddress((const GLubyte*)"glSampleMapATI")) == NULL) || r; - r = ((glSetFragmentShaderConstantATI = (PFNGLSETFRAGMENTSHADERCONSTANTATIPROC)glewGetProcAddress((const GLubyte*)"glSetFragmentShaderConstantATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_fragment_shader */ - -#ifdef GL_ATI_map_object_buffer - -static GLboolean _glewInit_GL_ATI_map_object_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((glMapObjectBufferATI = (PFNGLMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glMapObjectBufferATI")) == NULL) || r; - r = ((glUnmapObjectBufferATI = (PFNGLUNMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glUnmapObjectBufferATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_map_object_buffer */ - -#ifdef GL_ATI_pn_triangles - -static GLboolean _glewInit_GL_ATI_pn_triangles () -{ - GLboolean r = GL_FALSE; - - r = ((glPNTrianglesfATI = (PFNGLPNTRIANGLESFATIPROC)glewGetProcAddress((const GLubyte*)"glPNTrianglesfATI")) == NULL) || r; - r = ((glPNTrianglesiATI = (PFNGLPNTRIANGLESIATIPROC)glewGetProcAddress((const GLubyte*)"glPNTrianglesiATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_pn_triangles */ - -#ifdef GL_ATI_separate_stencil - -static GLboolean _glewInit_GL_ATI_separate_stencil () -{ - GLboolean r = GL_FALSE; - - r = ((glStencilFuncSeparateATI = (PFNGLSTENCILFUNCSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)"glStencilFuncSeparateATI")) == NULL) || r; - r = ((glStencilOpSeparateATI = (PFNGLSTENCILOPSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)"glStencilOpSeparateATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_separate_stencil */ - -#ifdef GL_ATI_vertex_array_object - -static GLboolean _glewInit_GL_ATI_vertex_array_object () -{ - GLboolean r = GL_FALSE; - - r = ((glArrayObjectATI = (PFNGLARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glArrayObjectATI")) == NULL) || r; - r = ((glFreeObjectBufferATI = (PFNGLFREEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glFreeObjectBufferATI")) == NULL) || r; - r = ((glGetArrayObjectfvATI = (PFNGLGETARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetArrayObjectfvATI")) == NULL) || r; - r = ((glGetArrayObjectivATI = (PFNGLGETARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetArrayObjectivATI")) == NULL) || r; - r = ((glGetObjectBufferfvATI = (PFNGLGETOBJECTBUFFERFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetObjectBufferfvATI")) == NULL) || r; - r = ((glGetObjectBufferivATI = (PFNGLGETOBJECTBUFFERIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetObjectBufferivATI")) == NULL) || r; - r = ((glGetVariantArrayObjectfvATI = (PFNGLGETVARIANTARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVariantArrayObjectfvATI")) == NULL) || r; - r = ((glGetVariantArrayObjectivATI = (PFNGLGETVARIANTARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVariantArrayObjectivATI")) == NULL) || r; - r = ((glIsObjectBufferATI = (PFNGLISOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glIsObjectBufferATI")) == NULL) || r; - r = ((glNewObjectBufferATI = (PFNGLNEWOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glNewObjectBufferATI")) == NULL) || r; - r = ((glUpdateObjectBufferATI = (PFNGLUPDATEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glUpdateObjectBufferATI")) == NULL) || r; - r = ((glVariantArrayObjectATI = (PFNGLVARIANTARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glVariantArrayObjectATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_vertex_array_object */ - -#ifdef GL_ATI_vertex_attrib_array_object - -static GLboolean _glewInit_GL_ATI_vertex_attrib_array_object () -{ - GLboolean r = GL_FALSE; - - r = ((glGetVertexAttribArrayObjectfvATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribArrayObjectfvATI")) == NULL) || r; - r = ((glGetVertexAttribArrayObjectivATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribArrayObjectivATI")) == NULL) || r; - r = ((glVertexAttribArrayObjectATI = (PFNGLVERTEXATTRIBARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribArrayObjectATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_vertex_attrib_array_object */ - -#ifdef GL_ATI_vertex_streams - -static GLboolean _glewInit_GL_ATI_vertex_streams () -{ - GLboolean r = GL_FALSE; - - r = ((glClientActiveVertexStreamATI = (PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC)glewGetProcAddress((const GLubyte*)"glClientActiveVertexStreamATI")) == NULL) || r; - r = ((glNormalStream3bATI = (PFNGLNORMALSTREAM3BATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3bATI")) == NULL) || r; - r = ((glNormalStream3bvATI = (PFNGLNORMALSTREAM3BVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3bvATI")) == NULL) || r; - r = ((glNormalStream3dATI = (PFNGLNORMALSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3dATI")) == NULL) || r; - r = ((glNormalStream3dvATI = (PFNGLNORMALSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3dvATI")) == NULL) || r; - r = ((glNormalStream3fATI = (PFNGLNORMALSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3fATI")) == NULL) || r; - r = ((glNormalStream3fvATI = (PFNGLNORMALSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3fvATI")) == NULL) || r; - r = ((glNormalStream3iATI = (PFNGLNORMALSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3iATI")) == NULL) || r; - r = ((glNormalStream3ivATI = (PFNGLNORMALSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3ivATI")) == NULL) || r; - r = ((glNormalStream3sATI = (PFNGLNORMALSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3sATI")) == NULL) || r; - r = ((glNormalStream3svATI = (PFNGLNORMALSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3svATI")) == NULL) || r; - r = ((glVertexBlendEnvfATI = (PFNGLVERTEXBLENDENVFATIPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendEnvfATI")) == NULL) || r; - r = ((glVertexBlendEnviATI = (PFNGLVERTEXBLENDENVIATIPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendEnviATI")) == NULL) || r; - r = ((glVertexStream1dATI = (PFNGLVERTEXSTREAM1DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1dATI")) == NULL) || r; - r = ((glVertexStream1dvATI = (PFNGLVERTEXSTREAM1DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1dvATI")) == NULL) || r; - r = ((glVertexStream1fATI = (PFNGLVERTEXSTREAM1FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1fATI")) == NULL) || r; - r = ((glVertexStream1fvATI = (PFNGLVERTEXSTREAM1FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1fvATI")) == NULL) || r; - r = ((glVertexStream1iATI = (PFNGLVERTEXSTREAM1IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1iATI")) == NULL) || r; - r = ((glVertexStream1ivATI = (PFNGLVERTEXSTREAM1IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1ivATI")) == NULL) || r; - r = ((glVertexStream1sATI = (PFNGLVERTEXSTREAM1SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1sATI")) == NULL) || r; - r = ((glVertexStream1svATI = (PFNGLVERTEXSTREAM1SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1svATI")) == NULL) || r; - r = ((glVertexStream2dATI = (PFNGLVERTEXSTREAM2DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2dATI")) == NULL) || r; - r = ((glVertexStream2dvATI = (PFNGLVERTEXSTREAM2DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2dvATI")) == NULL) || r; - r = ((glVertexStream2fATI = (PFNGLVERTEXSTREAM2FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2fATI")) == NULL) || r; - r = ((glVertexStream2fvATI = (PFNGLVERTEXSTREAM2FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2fvATI")) == NULL) || r; - r = ((glVertexStream2iATI = (PFNGLVERTEXSTREAM2IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2iATI")) == NULL) || r; - r = ((glVertexStream2ivATI = (PFNGLVERTEXSTREAM2IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2ivATI")) == NULL) || r; - r = ((glVertexStream2sATI = (PFNGLVERTEXSTREAM2SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2sATI")) == NULL) || r; - r = ((glVertexStream2svATI = (PFNGLVERTEXSTREAM2SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2svATI")) == NULL) || r; - r = ((glVertexStream3dATI = (PFNGLVERTEXSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3dATI")) == NULL) || r; - r = ((glVertexStream3dvATI = (PFNGLVERTEXSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3dvATI")) == NULL) || r; - r = ((glVertexStream3fATI = (PFNGLVERTEXSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3fATI")) == NULL) || r; - r = ((glVertexStream3fvATI = (PFNGLVERTEXSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3fvATI")) == NULL) || r; - r = ((glVertexStream3iATI = (PFNGLVERTEXSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3iATI")) == NULL) || r; - r = ((glVertexStream3ivATI = (PFNGLVERTEXSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3ivATI")) == NULL) || r; - r = ((glVertexStream3sATI = (PFNGLVERTEXSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3sATI")) == NULL) || r; - r = ((glVertexStream3svATI = (PFNGLVERTEXSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3svATI")) == NULL) || r; - r = ((glVertexStream4dATI = (PFNGLVERTEXSTREAM4DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4dATI")) == NULL) || r; - r = ((glVertexStream4dvATI = (PFNGLVERTEXSTREAM4DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4dvATI")) == NULL) || r; - r = ((glVertexStream4fATI = (PFNGLVERTEXSTREAM4FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4fATI")) == NULL) || r; - r = ((glVertexStream4fvATI = (PFNGLVERTEXSTREAM4FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4fvATI")) == NULL) || r; - r = ((glVertexStream4iATI = (PFNGLVERTEXSTREAM4IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4iATI")) == NULL) || r; - r = ((glVertexStream4ivATI = (PFNGLVERTEXSTREAM4IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4ivATI")) == NULL) || r; - r = ((glVertexStream4sATI = (PFNGLVERTEXSTREAM4SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4sATI")) == NULL) || r; - r = ((glVertexStream4svATI = (PFNGLVERTEXSTREAM4SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4svATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_vertex_streams */ - -#ifdef GL_EXT_EGL_image_storage - -static GLboolean _glewInit_GL_EXT_EGL_image_storage () -{ - GLboolean r = GL_FALSE; - - r = ((glEGLImageTargetTexStorageEXT = (PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glEGLImageTargetTexStorageEXT")) == NULL) || r; - r = ((glEGLImageTargetTextureStorageEXT = (PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glEGLImageTargetTextureStorageEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_EGL_image_storage */ - -#ifdef GL_EXT_base_instance - -static GLboolean _glewInit_GL_EXT_base_instance () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawArraysInstancedBaseInstanceEXT = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedBaseInstanceEXT")) == NULL) || r; - r = ((glDrawElementsInstancedBaseInstanceEXT = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseInstanceEXT")) == NULL) || r; - r = ((glDrawElementsInstancedBaseVertexBaseInstanceEXT = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertexBaseInstanceEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_base_instance */ - -#ifdef GL_EXT_bindable_uniform - -static GLboolean _glewInit_GL_EXT_bindable_uniform () -{ - GLboolean r = GL_FALSE; - - r = ((glGetUniformBufferSizeEXT = (PFNGLGETUNIFORMBUFFERSIZEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformBufferSizeEXT")) == NULL) || r; - r = ((glGetUniformOffsetEXT = (PFNGLGETUNIFORMOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformOffsetEXT")) == NULL) || r; - r = ((glUniformBufferEXT = (PFNGLUNIFORMBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glUniformBufferEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_bindable_uniform */ - -#ifdef GL_EXT_blend_color - -static GLboolean _glewInit_GL_EXT_blend_color () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendColorEXT = (PFNGLBLENDCOLOREXTPROC)glewGetProcAddress((const GLubyte*)"glBlendColorEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_blend_color */ - -#ifdef GL_EXT_blend_equation_separate - -static GLboolean _glewInit_GL_EXT_blend_equation_separate () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_blend_equation_separate */ - -#ifdef GL_EXT_blend_func_extended - -static GLboolean _glewInit_GL_EXT_blend_func_extended () -{ - GLboolean r = GL_FALSE; - - r = ((glBindFragDataLocationIndexedEXT = (PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationIndexedEXT")) == NULL) || r; - r = ((glGetFragDataIndexEXT = (PFNGLGETFRAGDATAINDEXEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataIndexEXT")) == NULL) || r; - r = ((glGetProgramResourceLocationIndexEXT = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceLocationIndexEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_blend_func_extended */ - -#ifdef GL_EXT_blend_func_separate - -static GLboolean _glewInit_GL_EXT_blend_func_separate () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_blend_func_separate */ - -#ifdef GL_EXT_blend_minmax - -static GLboolean _glewInit_GL_EXT_blend_minmax () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_blend_minmax */ - -#ifdef GL_EXT_buffer_storage - -static GLboolean _glewInit_GL_EXT_buffer_storage () -{ - GLboolean r = GL_FALSE; - - r = ((glBufferStorageEXT = (PFNGLBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glBufferStorageEXT")) == NULL) || r; - r = ((glNamedBufferStorageEXT = (PFNGLNAMEDBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorageEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_buffer_storage */ - -#ifdef GL_EXT_clear_texture - -static GLboolean _glewInit_GL_EXT_clear_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glClearTexImageEXT = (PFNGLCLEARTEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glClearTexImageEXT")) == NULL) || r; - r = ((glClearTexSubImageEXT = (PFNGLCLEARTEXSUBIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glClearTexSubImageEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_clear_texture */ - -#ifdef GL_EXT_clip_control - -static GLboolean _glewInit_GL_EXT_clip_control () -{ - GLboolean r = GL_FALSE; - - r = ((glClipControlEXT = (PFNGLCLIPCONTROLEXTPROC)glewGetProcAddress((const GLubyte*)"glClipControlEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_clip_control */ - -#ifdef GL_EXT_color_subtable - -static GLboolean _glewInit_GL_EXT_color_subtable () -{ - GLboolean r = GL_FALSE; - - r = ((glColorSubTableEXT = (PFNGLCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glColorSubTableEXT")) == NULL) || r; - r = ((glCopyColorSubTableEXT = (PFNGLCOPYCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyColorSubTableEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_color_subtable */ - -#ifdef GL_EXT_compiled_vertex_array - -static GLboolean _glewInit_GL_EXT_compiled_vertex_array () -{ - GLboolean r = GL_FALSE; - - r = ((glLockArraysEXT = (PFNGLLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glLockArraysEXT")) == NULL) || r; - r = ((glUnlockArraysEXT = (PFNGLUNLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glUnlockArraysEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_compiled_vertex_array */ - -#ifdef GL_EXT_convolution - -static GLboolean _glewInit_GL_EXT_convolution () -{ - GLboolean r = GL_FALSE; - - r = ((glConvolutionFilter1DEXT = (PFNGLCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter1DEXT")) == NULL) || r; - r = ((glConvolutionFilter2DEXT = (PFNGLCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter2DEXT")) == NULL) || r; - r = ((glConvolutionParameterfEXT = (PFNGLCONVOLUTIONPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfEXT")) == NULL) || r; - r = ((glConvolutionParameterfvEXT = (PFNGLCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfvEXT")) == NULL) || r; - r = ((glConvolutionParameteriEXT = (PFNGLCONVOLUTIONPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteriEXT")) == NULL) || r; - r = ((glConvolutionParameterivEXT = (PFNGLCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterivEXT")) == NULL) || r; - r = ((glCopyConvolutionFilter1DEXT = (PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter1DEXT")) == NULL) || r; - r = ((glCopyConvolutionFilter2DEXT = (PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter2DEXT")) == NULL) || r; - r = ((glGetConvolutionFilterEXT = (PFNGLGETCONVOLUTIONFILTEREXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionFilterEXT")) == NULL) || r; - r = ((glGetConvolutionParameterfvEXT = (PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterfvEXT")) == NULL) || r; - r = ((glGetConvolutionParameterivEXT = (PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterivEXT")) == NULL) || r; - r = ((glGetSeparableFilterEXT = (PFNGLGETSEPARABLEFILTEREXTPROC)glewGetProcAddress((const GLubyte*)"glGetSeparableFilterEXT")) == NULL) || r; - r = ((glSeparableFilter2DEXT = (PFNGLSEPARABLEFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glSeparableFilter2DEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_convolution */ - -#ifdef GL_EXT_coordinate_frame - -static GLboolean _glewInit_GL_EXT_coordinate_frame () -{ - GLboolean r = GL_FALSE; - - r = ((glBinormalPointerEXT = (PFNGLBINORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glBinormalPointerEXT")) == NULL) || r; - r = ((glTangentPointerEXT = (PFNGLTANGENTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glTangentPointerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_coordinate_frame */ - -#ifdef GL_EXT_copy_image - -static GLboolean _glewInit_GL_EXT_copy_image () -{ - GLboolean r = GL_FALSE; - - r = ((glCopyImageSubDataEXT = (PFNGLCOPYIMAGESUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubDataEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_copy_image */ - -#ifdef GL_EXT_copy_texture - -static GLboolean _glewInit_GL_EXT_copy_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexImage1DEXT")) == NULL) || r; - r = ((glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexImage2DEXT")) == NULL) || r; - r = ((glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage1DEXT")) == NULL) || r; - r = ((glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage2DEXT")) == NULL) || r; - r = ((glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3DEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_copy_texture */ - -#ifdef GL_EXT_cull_vertex - -static GLboolean _glewInit_GL_EXT_cull_vertex () -{ - GLboolean r = GL_FALSE; - - r = ((glCullParameterdvEXT = (PFNGLCULLPARAMETERDVEXTPROC)glewGetProcAddress((const GLubyte*)"glCullParameterdvEXT")) == NULL) || r; - r = ((glCullParameterfvEXT = (PFNGLCULLPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glCullParameterfvEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_cull_vertex */ - -#ifdef GL_EXT_debug_label - -static GLboolean _glewInit_GL_EXT_debug_label () -{ - GLboolean r = GL_FALSE; - - r = ((glGetObjectLabelEXT = (PFNGLGETOBJECTLABELEXTPROC)glewGetProcAddress((const GLubyte*)"glGetObjectLabelEXT")) == NULL) || r; - r = ((glLabelObjectEXT = (PFNGLLABELOBJECTEXTPROC)glewGetProcAddress((const GLubyte*)"glLabelObjectEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_debug_label */ - -#ifdef GL_EXT_debug_marker - -static GLboolean _glewInit_GL_EXT_debug_marker () -{ - GLboolean r = GL_FALSE; - - r = ((glInsertEventMarkerEXT = (PFNGLINSERTEVENTMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glInsertEventMarkerEXT")) == NULL) || r; - r = ((glPopGroupMarkerEXT = (PFNGLPOPGROUPMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glPopGroupMarkerEXT")) == NULL) || r; - r = ((glPushGroupMarkerEXT = (PFNGLPUSHGROUPMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glPushGroupMarkerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_debug_marker */ - -#ifdef GL_EXT_depth_bounds_test - -static GLboolean _glewInit_GL_EXT_depth_bounds_test () -{ - GLboolean r = GL_FALSE; - - r = ((glDepthBoundsEXT = (PFNGLDEPTHBOUNDSEXTPROC)glewGetProcAddress((const GLubyte*)"glDepthBoundsEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_depth_bounds_test */ - -#ifdef GL_EXT_direct_state_access - -static GLboolean _glewInit_GL_EXT_direct_state_access () -{ - GLboolean r = GL_FALSE; - - r = ((glBindMultiTextureEXT = (PFNGLBINDMULTITEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindMultiTextureEXT")) == NULL) || r; - r = ((glCheckNamedFramebufferStatusEXT = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC)glewGetProcAddress((const GLubyte*)"glCheckNamedFramebufferStatusEXT")) == NULL) || r; - r = ((glClientAttribDefaultEXT = (PFNGLCLIENTATTRIBDEFAULTEXTPROC)glewGetProcAddress((const GLubyte*)"glClientAttribDefaultEXT")) == NULL) || r; - r = ((glCompressedMultiTexImage1DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage1DEXT")) == NULL) || r; - r = ((glCompressedMultiTexImage2DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage2DEXT")) == NULL) || r; - r = ((glCompressedMultiTexImage3DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage3DEXT")) == NULL) || r; - r = ((glCompressedMultiTexSubImage1DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage1DEXT")) == NULL) || r; - r = ((glCompressedMultiTexSubImage2DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage2DEXT")) == NULL) || r; - r = ((glCompressedMultiTexSubImage3DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage3DEXT")) == NULL) || r; - r = ((glCompressedTextureImage1DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage1DEXT")) == NULL) || r; - r = ((glCompressedTextureImage2DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage2DEXT")) == NULL) || r; - r = ((glCompressedTextureImage3DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage3DEXT")) == NULL) || r; - r = ((glCompressedTextureSubImage1DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage1DEXT")) == NULL) || r; - r = ((glCompressedTextureSubImage2DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage2DEXT")) == NULL) || r; - r = ((glCompressedTextureSubImage3DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage3DEXT")) == NULL) || r; - r = ((glCopyMultiTexImage1DEXT = (PFNGLCOPYMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexImage1DEXT")) == NULL) || r; - r = ((glCopyMultiTexImage2DEXT = (PFNGLCOPYMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexImage2DEXT")) == NULL) || r; - r = ((glCopyMultiTexSubImage1DEXT = (PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage1DEXT")) == NULL) || r; - r = ((glCopyMultiTexSubImage2DEXT = (PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage2DEXT")) == NULL) || r; - r = ((glCopyMultiTexSubImage3DEXT = (PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage3DEXT")) == NULL) || r; - r = ((glCopyTextureImage1DEXT = (PFNGLCOPYTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureImage1DEXT")) == NULL) || r; - r = ((glCopyTextureImage2DEXT = (PFNGLCOPYTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureImage2DEXT")) == NULL) || r; - r = ((glCopyTextureSubImage1DEXT = (PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage1DEXT")) == NULL) || r; - r = ((glCopyTextureSubImage2DEXT = (PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage2DEXT")) == NULL) || r; - r = ((glCopyTextureSubImage3DEXT = (PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage3DEXT")) == NULL) || r; - r = ((glDisableClientStateIndexedEXT = (PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableClientStateIndexedEXT")) == NULL) || r; - r = ((glDisableClientStateiEXT = (PFNGLDISABLECLIENTSTATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableClientStateiEXT")) == NULL) || r; - r = ((glDisableVertexArrayAttribEXT = (PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayAttribEXT")) == NULL) || r; - r = ((glDisableVertexArrayEXT = (PFNGLDISABLEVERTEXARRAYEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayEXT")) == NULL) || r; - r = ((glEnableClientStateIndexedEXT = (PFNGLENABLECLIENTSTATEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableClientStateIndexedEXT")) == NULL) || r; - r = ((glEnableClientStateiEXT = (PFNGLENABLECLIENTSTATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableClientStateiEXT")) == NULL) || r; - r = ((glEnableVertexArrayAttribEXT = (PFNGLENABLEVERTEXARRAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayAttribEXT")) == NULL) || r; - r = ((glEnableVertexArrayEXT = (PFNGLENABLEVERTEXARRAYEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayEXT")) == NULL) || r; - r = ((glFlushMappedNamedBufferRangeEXT = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedNamedBufferRangeEXT")) == NULL) || r; - r = ((glFramebufferDrawBufferEXT = (PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferDrawBufferEXT")) == NULL) || r; - r = ((glFramebufferDrawBuffersEXT = (PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferDrawBuffersEXT")) == NULL) || r; - r = ((glFramebufferReadBufferEXT = (PFNGLFRAMEBUFFERREADBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferReadBufferEXT")) == NULL) || r; - r = ((glGenerateMultiTexMipmapEXT = (PFNGLGENERATEMULTITEXMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateMultiTexMipmapEXT")) == NULL) || r; - r = ((glGenerateTextureMipmapEXT = (PFNGLGENERATETEXTUREMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateTextureMipmapEXT")) == NULL) || r; - r = ((glGetCompressedMultiTexImageEXT = (PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedMultiTexImageEXT")) == NULL) || r; - r = ((glGetCompressedTextureImageEXT = (PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureImageEXT")) == NULL) || r; - r = ((glGetDoubleIndexedvEXT = (PFNGLGETDOUBLEINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetDoubleIndexedvEXT")) == NULL) || r; - r = ((glGetDoublei_vEXT = (PFNGLGETDOUBLEI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetDoublei_vEXT")) == NULL) || r; - r = ((glGetFloatIndexedvEXT = (PFNGLGETFLOATINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFloatIndexedvEXT")) == NULL) || r; - r = ((glGetFloati_vEXT = (PFNGLGETFLOATI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_vEXT")) == NULL) || r; - r = ((glGetFramebufferParameterivEXT = (PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameterivEXT")) == NULL) || r; - r = ((glGetMultiTexEnvfvEXT = (PFNGLGETMULTITEXENVFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexEnvfvEXT")) == NULL) || r; - r = ((glGetMultiTexEnvivEXT = (PFNGLGETMULTITEXENVIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexEnvivEXT")) == NULL) || r; - r = ((glGetMultiTexGendvEXT = (PFNGLGETMULTITEXGENDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGendvEXT")) == NULL) || r; - r = ((glGetMultiTexGenfvEXT = (PFNGLGETMULTITEXGENFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGenfvEXT")) == NULL) || r; - r = ((glGetMultiTexGenivEXT = (PFNGLGETMULTITEXGENIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGenivEXT")) == NULL) || r; - r = ((glGetMultiTexImageEXT = (PFNGLGETMULTITEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexImageEXT")) == NULL) || r; - r = ((glGetMultiTexLevelParameterfvEXT = (PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexLevelParameterfvEXT")) == NULL) || r; - r = ((glGetMultiTexLevelParameterivEXT = (PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexLevelParameterivEXT")) == NULL) || r; - r = ((glGetMultiTexParameterIivEXT = (PFNGLGETMULTITEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterIivEXT")) == NULL) || r; - r = ((glGetMultiTexParameterIuivEXT = (PFNGLGETMULTITEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterIuivEXT")) == NULL) || r; - r = ((glGetMultiTexParameterfvEXT = (PFNGLGETMULTITEXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterfvEXT")) == NULL) || r; - r = ((glGetMultiTexParameterivEXT = (PFNGLGETMULTITEXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterivEXT")) == NULL) || r; - r = ((glGetNamedBufferParameterivEXT = (PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameterivEXT")) == NULL) || r; - r = ((glGetNamedBufferPointervEXT = (PFNGLGETNAMEDBUFFERPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferPointervEXT")) == NULL) || r; - r = ((glGetNamedBufferSubDataEXT = (PFNGLGETNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferSubDataEXT")) == NULL) || r; - r = ((glGetNamedFramebufferAttachmentParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferAttachmentParameterivEXT")) == NULL) || r; - r = ((glGetNamedProgramLocalParameterIivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterIivEXT")) == NULL) || r; - r = ((glGetNamedProgramLocalParameterIuivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterIuivEXT")) == NULL) || r; - r = ((glGetNamedProgramLocalParameterdvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterdvEXT")) == NULL) || r; - r = ((glGetNamedProgramLocalParameterfvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterfvEXT")) == NULL) || r; - r = ((glGetNamedProgramStringEXT = (PFNGLGETNAMEDPROGRAMSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramStringEXT")) == NULL) || r; - r = ((glGetNamedProgramivEXT = (PFNGLGETNAMEDPROGRAMIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramivEXT")) == NULL) || r; - r = ((glGetNamedRenderbufferParameterivEXT = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedRenderbufferParameterivEXT")) == NULL) || r; - r = ((glGetPointerIndexedvEXT = (PFNGLGETPOINTERINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPointerIndexedvEXT")) == NULL) || r; - r = ((glGetPointeri_vEXT = (PFNGLGETPOINTERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPointeri_vEXT")) == NULL) || r; - r = ((glGetTextureImageEXT = (PFNGLGETTEXTUREIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureImageEXT")) == NULL) || r; - r = ((glGetTextureLevelParameterfvEXT = (PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterfvEXT")) == NULL) || r; - r = ((glGetTextureLevelParameterivEXT = (PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterivEXT")) == NULL) || r; - r = ((glGetTextureParameterIivEXT = (PFNGLGETTEXTUREPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIivEXT")) == NULL) || r; - r = ((glGetTextureParameterIuivEXT = (PFNGLGETTEXTUREPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIuivEXT")) == NULL) || r; - r = ((glGetTextureParameterfvEXT = (PFNGLGETTEXTUREPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterfvEXT")) == NULL) || r; - r = ((glGetTextureParameterivEXT = (PFNGLGETTEXTUREPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterivEXT")) == NULL) || r; - r = ((glGetVertexArrayIntegeri_vEXT = (PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIntegeri_vEXT")) == NULL) || r; - r = ((glGetVertexArrayIntegervEXT = (PFNGLGETVERTEXARRAYINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIntegervEXT")) == NULL) || r; - r = ((glGetVertexArrayPointeri_vEXT = (PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayPointeri_vEXT")) == NULL) || r; - r = ((glGetVertexArrayPointervEXT = (PFNGLGETVERTEXARRAYPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayPointervEXT")) == NULL) || r; - r = ((glMapNamedBufferEXT = (PFNGLMAPNAMEDBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferEXT")) == NULL) || r; - r = ((glMapNamedBufferRangeEXT = (PFNGLMAPNAMEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferRangeEXT")) == NULL) || r; - r = ((glMatrixFrustumEXT = (PFNGLMATRIXFRUSTUMEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixFrustumEXT")) == NULL) || r; - r = ((glMatrixLoadIdentityEXT = (PFNGLMATRIXLOADIDENTITYEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadIdentityEXT")) == NULL) || r; - r = ((glMatrixLoadTransposedEXT = (PFNGLMATRIXLOADTRANSPOSEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTransposedEXT")) == NULL) || r; - r = ((glMatrixLoadTransposefEXT = (PFNGLMATRIXLOADTRANSPOSEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTransposefEXT")) == NULL) || r; - r = ((glMatrixLoaddEXT = (PFNGLMATRIXLOADDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoaddEXT")) == NULL) || r; - r = ((glMatrixLoadfEXT = (PFNGLMATRIXLOADFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadfEXT")) == NULL) || r; - r = ((glMatrixMultTransposedEXT = (PFNGLMATRIXMULTTRANSPOSEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTransposedEXT")) == NULL) || r; - r = ((glMatrixMultTransposefEXT = (PFNGLMATRIXMULTTRANSPOSEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTransposefEXT")) == NULL) || r; - r = ((glMatrixMultdEXT = (PFNGLMATRIXMULTDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultdEXT")) == NULL) || r; - r = ((glMatrixMultfEXT = (PFNGLMATRIXMULTFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultfEXT")) == NULL) || r; - r = ((glMatrixOrthoEXT = (PFNGLMATRIXORTHOEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixOrthoEXT")) == NULL) || r; - r = ((glMatrixPopEXT = (PFNGLMATRIXPOPEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixPopEXT")) == NULL) || r; - r = ((glMatrixPushEXT = (PFNGLMATRIXPUSHEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixPushEXT")) == NULL) || r; - r = ((glMatrixRotatedEXT = (PFNGLMATRIXROTATEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixRotatedEXT")) == NULL) || r; - r = ((glMatrixRotatefEXT = (PFNGLMATRIXROTATEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixRotatefEXT")) == NULL) || r; - r = ((glMatrixScaledEXT = (PFNGLMATRIXSCALEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixScaledEXT")) == NULL) || r; - r = ((glMatrixScalefEXT = (PFNGLMATRIXSCALEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixScalefEXT")) == NULL) || r; - r = ((glMatrixTranslatedEXT = (PFNGLMATRIXTRANSLATEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixTranslatedEXT")) == NULL) || r; - r = ((glMatrixTranslatefEXT = (PFNGLMATRIXTRANSLATEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixTranslatefEXT")) == NULL) || r; - r = ((glMultiTexBufferEXT = (PFNGLMULTITEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexBufferEXT")) == NULL) || r; - r = ((glMultiTexCoordPointerEXT = (PFNGLMULTITEXCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordPointerEXT")) == NULL) || r; - r = ((glMultiTexEnvfEXT = (PFNGLMULTITEXENVFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvfEXT")) == NULL) || r; - r = ((glMultiTexEnvfvEXT = (PFNGLMULTITEXENVFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvfvEXT")) == NULL) || r; - r = ((glMultiTexEnviEXT = (PFNGLMULTITEXENVIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnviEXT")) == NULL) || r; - r = ((glMultiTexEnvivEXT = (PFNGLMULTITEXENVIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvivEXT")) == NULL) || r; - r = ((glMultiTexGendEXT = (PFNGLMULTITEXGENDEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGendEXT")) == NULL) || r; - r = ((glMultiTexGendvEXT = (PFNGLMULTITEXGENDVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGendvEXT")) == NULL) || r; - r = ((glMultiTexGenfEXT = (PFNGLMULTITEXGENFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenfEXT")) == NULL) || r; - r = ((glMultiTexGenfvEXT = (PFNGLMULTITEXGENFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenfvEXT")) == NULL) || r; - r = ((glMultiTexGeniEXT = (PFNGLMULTITEXGENIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGeniEXT")) == NULL) || r; - r = ((glMultiTexGenivEXT = (PFNGLMULTITEXGENIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenivEXT")) == NULL) || r; - r = ((glMultiTexImage1DEXT = (PFNGLMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage1DEXT")) == NULL) || r; - r = ((glMultiTexImage2DEXT = (PFNGLMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage2DEXT")) == NULL) || r; - r = ((glMultiTexImage3DEXT = (PFNGLMULTITEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage3DEXT")) == NULL) || r; - r = ((glMultiTexParameterIivEXT = (PFNGLMULTITEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterIivEXT")) == NULL) || r; - r = ((glMultiTexParameterIuivEXT = (PFNGLMULTITEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterIuivEXT")) == NULL) || r; - r = ((glMultiTexParameterfEXT = (PFNGLMULTITEXPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterfEXT")) == NULL) || r; - r = ((glMultiTexParameterfvEXT = (PFNGLMULTITEXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterfvEXT")) == NULL) || r; - r = ((glMultiTexParameteriEXT = (PFNGLMULTITEXPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameteriEXT")) == NULL) || r; - r = ((glMultiTexParameterivEXT = (PFNGLMULTITEXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterivEXT")) == NULL) || r; - r = ((glMultiTexRenderbufferEXT = (PFNGLMULTITEXRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexRenderbufferEXT")) == NULL) || r; - r = ((glMultiTexSubImage1DEXT = (PFNGLMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage1DEXT")) == NULL) || r; - r = ((glMultiTexSubImage2DEXT = (PFNGLMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage2DEXT")) == NULL) || r; - r = ((glMultiTexSubImage3DEXT = (PFNGLMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage3DEXT")) == NULL) || r; - r = ((glNamedBufferDataEXT = (PFNGLNAMEDBUFFERDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferDataEXT")) == NULL) || r; - r = ((glNamedBufferSubDataEXT = (PFNGLNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferSubDataEXT")) == NULL) || r; - r = ((glNamedCopyBufferSubDataEXT = (PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedCopyBufferSubDataEXT")) == NULL) || r; - r = ((glNamedFramebufferRenderbufferEXT = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferRenderbufferEXT")) == NULL) || r; - r = ((glNamedFramebufferTexture1DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture1DEXT")) == NULL) || r; - r = ((glNamedFramebufferTexture2DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture2DEXT")) == NULL) || r; - r = ((glNamedFramebufferTexture3DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture3DEXT")) == NULL) || r; - r = ((glNamedFramebufferTextureEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureEXT")) == NULL) || r; - r = ((glNamedFramebufferTextureFaceEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureFaceEXT")) == NULL) || r; - r = ((glNamedFramebufferTextureLayerEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureLayerEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameter4dEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4dEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameter4dvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4dvEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameter4fEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4fEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameter4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4fvEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameterI4iEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4iEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameterI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4ivEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameterI4uiEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4uiEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameterI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4uivEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameters4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameters4fvEXT")) == NULL) || r; - r = ((glNamedProgramLocalParametersI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParametersI4ivEXT")) == NULL) || r; - r = ((glNamedProgramLocalParametersI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParametersI4uivEXT")) == NULL) || r; - r = ((glNamedProgramStringEXT = (PFNGLNAMEDPROGRAMSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramStringEXT")) == NULL) || r; - r = ((glNamedRenderbufferStorageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageEXT")) == NULL) || r; - r = ((glNamedRenderbufferStorageMultisampleCoverageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisampleCoverageEXT")) == NULL) || r; - r = ((glNamedRenderbufferStorageMultisampleEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisampleEXT")) == NULL) || r; - r = ((glProgramUniform1fEXT = (PFNGLPROGRAMUNIFORM1FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fEXT")) == NULL) || r; - r = ((glProgramUniform1fvEXT = (PFNGLPROGRAMUNIFORM1FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fvEXT")) == NULL) || r; - r = ((glProgramUniform1iEXT = (PFNGLPROGRAMUNIFORM1IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1iEXT")) == NULL) || r; - r = ((glProgramUniform1ivEXT = (PFNGLPROGRAMUNIFORM1IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ivEXT")) == NULL) || r; - r = ((glProgramUniform1uiEXT = (PFNGLPROGRAMUNIFORM1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uiEXT")) == NULL) || r; - r = ((glProgramUniform1uivEXT = (PFNGLPROGRAMUNIFORM1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uivEXT")) == NULL) || r; - r = ((glProgramUniform2fEXT = (PFNGLPROGRAMUNIFORM2FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fEXT")) == NULL) || r; - r = ((glProgramUniform2fvEXT = (PFNGLPROGRAMUNIFORM2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fvEXT")) == NULL) || r; - r = ((glProgramUniform2iEXT = (PFNGLPROGRAMUNIFORM2IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2iEXT")) == NULL) || r; - r = ((glProgramUniform2ivEXT = (PFNGLPROGRAMUNIFORM2IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ivEXT")) == NULL) || r; - r = ((glProgramUniform2uiEXT = (PFNGLPROGRAMUNIFORM2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uiEXT")) == NULL) || r; - r = ((glProgramUniform2uivEXT = (PFNGLPROGRAMUNIFORM2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uivEXT")) == NULL) || r; - r = ((glProgramUniform3fEXT = (PFNGLPROGRAMUNIFORM3FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fEXT")) == NULL) || r; - r = ((glProgramUniform3fvEXT = (PFNGLPROGRAMUNIFORM3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fvEXT")) == NULL) || r; - r = ((glProgramUniform3iEXT = (PFNGLPROGRAMUNIFORM3IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3iEXT")) == NULL) || r; - r = ((glProgramUniform3ivEXT = (PFNGLPROGRAMUNIFORM3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ivEXT")) == NULL) || r; - r = ((glProgramUniform3uiEXT = (PFNGLPROGRAMUNIFORM3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uiEXT")) == NULL) || r; - r = ((glProgramUniform3uivEXT = (PFNGLPROGRAMUNIFORM3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uivEXT")) == NULL) || r; - r = ((glProgramUniform4fEXT = (PFNGLPROGRAMUNIFORM4FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fEXT")) == NULL) || r; - r = ((glProgramUniform4fvEXT = (PFNGLPROGRAMUNIFORM4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fvEXT")) == NULL) || r; - r = ((glProgramUniform4iEXT = (PFNGLPROGRAMUNIFORM4IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4iEXT")) == NULL) || r; - r = ((glProgramUniform4ivEXT = (PFNGLPROGRAMUNIFORM4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ivEXT")) == NULL) || r; - r = ((glProgramUniform4uiEXT = (PFNGLPROGRAMUNIFORM4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uiEXT")) == NULL) || r; - r = ((glProgramUniform4uivEXT = (PFNGLPROGRAMUNIFORM4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uivEXT")) == NULL) || r; - r = ((glProgramUniformMatrix2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix2x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix2x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix3x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix3x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix4x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix4x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3fvEXT")) == NULL) || r; - r = ((glPushClientAttribDefaultEXT = (PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC)glewGetProcAddress((const GLubyte*)"glPushClientAttribDefaultEXT")) == NULL) || r; - r = ((glTextureBufferEXT = (PFNGLTEXTUREBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferEXT")) == NULL) || r; - r = ((glTextureImage1DEXT = (PFNGLTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage1DEXT")) == NULL) || r; - r = ((glTextureImage2DEXT = (PFNGLTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DEXT")) == NULL) || r; - r = ((glTextureImage3DEXT = (PFNGLTEXTUREIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DEXT")) == NULL) || r; - r = ((glTextureParameterIivEXT = (PFNGLTEXTUREPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIivEXT")) == NULL) || r; - r = ((glTextureParameterIuivEXT = (PFNGLTEXTUREPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIuivEXT")) == NULL) || r; - r = ((glTextureParameterfEXT = (PFNGLTEXTUREPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfEXT")) == NULL) || r; - r = ((glTextureParameterfvEXT = (PFNGLTEXTUREPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfvEXT")) == NULL) || r; - r = ((glTextureParameteriEXT = (PFNGLTEXTUREPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteriEXT")) == NULL) || r; - r = ((glTextureParameterivEXT = (PFNGLTEXTUREPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterivEXT")) == NULL) || r; - r = ((glTextureRenderbufferEXT = (PFNGLTEXTURERENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTextureRenderbufferEXT")) == NULL) || r; - r = ((glTextureSubImage1DEXT = (PFNGLTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage1DEXT")) == NULL) || r; - r = ((glTextureSubImage2DEXT = (PFNGLTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage2DEXT")) == NULL) || r; - r = ((glTextureSubImage3DEXT = (PFNGLTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage3DEXT")) == NULL) || r; - r = ((glUnmapNamedBufferEXT = (PFNGLUNMAPNAMEDBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glUnmapNamedBufferEXT")) == NULL) || r; - r = ((glVertexArrayColorOffsetEXT = (PFNGLVERTEXARRAYCOLOROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayColorOffsetEXT")) == NULL) || r; - r = ((glVertexArrayEdgeFlagOffsetEXT = (PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayEdgeFlagOffsetEXT")) == NULL) || r; - r = ((glVertexArrayFogCoordOffsetEXT = (PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayFogCoordOffsetEXT")) == NULL) || r; - r = ((glVertexArrayIndexOffsetEXT = (PFNGLVERTEXARRAYINDEXOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayIndexOffsetEXT")) == NULL) || r; - r = ((glVertexArrayMultiTexCoordOffsetEXT = (PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayMultiTexCoordOffsetEXT")) == NULL) || r; - r = ((glVertexArrayNormalOffsetEXT = (PFNGLVERTEXARRAYNORMALOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayNormalOffsetEXT")) == NULL) || r; - r = ((glVertexArraySecondaryColorOffsetEXT = (PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArraySecondaryColorOffsetEXT")) == NULL) || r; - r = ((glVertexArrayTexCoordOffsetEXT = (PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayTexCoordOffsetEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribDivisorEXT = (PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribDivisorEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribIOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribIOffsetEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribOffsetEXT")) == NULL) || r; - r = ((glVertexArrayVertexOffsetEXT = (PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexOffsetEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_direct_state_access */ - -#ifdef GL_EXT_discard_framebuffer - -static GLboolean _glewInit_GL_EXT_discard_framebuffer () -{ - GLboolean r = GL_FALSE; - - r = ((glDiscardFramebufferEXT = (PFNGLDISCARDFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glDiscardFramebufferEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_discard_framebuffer */ - -#ifdef GL_EXT_disjoint_timer_query - -static GLboolean _glewInit_GL_EXT_disjoint_timer_query () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginQueryEXT = (PFNGLBEGINQUERYEXTPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryEXT")) == NULL) || r; - r = ((glDeleteQueriesEXT = (PFNGLDELETEQUERIESEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueriesEXT")) == NULL) || r; - r = ((glEndQueryEXT = (PFNGLENDQUERYEXTPROC)glewGetProcAddress((const GLubyte*)"glEndQueryEXT")) == NULL) || r; - r = ((glGenQueriesEXT = (PFNGLGENQUERIESEXTPROC)glewGetProcAddress((const GLubyte*)"glGenQueriesEXT")) == NULL) || r; - r = ((glGetInteger64vEXT = (PFNGLGETINTEGER64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64vEXT")) == NULL) || r; - r = ((glGetQueryObjectivEXT = (PFNGLGETQUERYOBJECTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectivEXT")) == NULL) || r; - r = ((glGetQueryObjectuivEXT = (PFNGLGETQUERYOBJECTUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuivEXT")) == NULL) || r; - r = ((glGetQueryivEXT = (PFNGLGETQUERYIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetQueryivEXT")) == NULL) || r; - r = ((glIsQueryEXT = (PFNGLISQUERYEXTPROC)glewGetProcAddress((const GLubyte*)"glIsQueryEXT")) == NULL) || r; - r = ((glQueryCounterEXT = (PFNGLQUERYCOUNTEREXTPROC)glewGetProcAddress((const GLubyte*)"glQueryCounterEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_disjoint_timer_query */ - -#ifdef GL_EXT_draw_buffers - -static GLboolean _glewInit_GL_EXT_draw_buffers () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawBuffersEXT = (PFNGLDRAWBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_draw_buffers */ - -#ifdef GL_EXT_draw_buffers2 - -static GLboolean _glewInit_GL_EXT_draw_buffers2 () -{ - GLboolean r = GL_FALSE; - - r = ((glColorMaskIndexedEXT = (PFNGLCOLORMASKINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glColorMaskIndexedEXT")) == NULL) || r; - r = ((glDisableIndexedEXT = (PFNGLDISABLEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableIndexedEXT")) == NULL) || r; - r = ((glEnableIndexedEXT = (PFNGLENABLEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableIndexedEXT")) == NULL) || r; - r = ((glGetBooleanIndexedvEXT = (PFNGLGETBOOLEANINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetBooleanIndexedvEXT")) == NULL) || r; - r = ((glGetIntegerIndexedvEXT = (PFNGLGETINTEGERINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerIndexedvEXT")) == NULL) || r; - r = ((glIsEnabledIndexedEXT = (PFNGLISENABLEDINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glIsEnabledIndexedEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_draw_buffers2 */ - -#ifdef GL_EXT_draw_buffers_indexed - -static GLboolean _glewInit_GL_EXT_draw_buffers_indexed () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquationSeparateiEXT = (PFNGLBLENDEQUATIONSEPARATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateiEXT")) == NULL) || r; - r = ((glBlendEquationiEXT = (PFNGLBLENDEQUATIONIEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationiEXT")) == NULL) || r; - r = ((glBlendFuncSeparateiEXT = (PFNGLBLENDFUNCSEPARATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateiEXT")) == NULL) || r; - r = ((glBlendFunciEXT = (PFNGLBLENDFUNCIEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendFunciEXT")) == NULL) || r; - r = ((glColorMaskiEXT = (PFNGLCOLORMASKIEXTPROC)glewGetProcAddress((const GLubyte*)"glColorMaskiEXT")) == NULL) || r; - r = ((glDisableiEXT = (PFNGLDISABLEIEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableiEXT")) == NULL) || r; - r = ((glEnableiEXT = (PFNGLENABLEIEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableiEXT")) == NULL) || r; - r = ((glIsEnablediEXT = (PFNGLISENABLEDIEXTPROC)glewGetProcAddress((const GLubyte*)"glIsEnablediEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_draw_buffers_indexed */ - -#ifdef GL_EXT_draw_elements_base_vertex - -static GLboolean _glewInit_GL_EXT_draw_elements_base_vertex () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawElementsBaseVertexEXT = (PFNGLDRAWELEMENTSBASEVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsBaseVertexEXT")) == NULL) || r; - r = ((glDrawElementsInstancedBaseVertexEXT = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertexEXT")) == NULL) || r; - r = ((glDrawRangeElementsBaseVertexEXT = (PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsBaseVertexEXT")) == NULL) || r; - r = ((glMultiDrawElementsBaseVertexEXT = (PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsBaseVertexEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_draw_elements_base_vertex */ - -#ifdef GL_EXT_draw_instanced - -static GLboolean _glewInit_GL_EXT_draw_instanced () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawArraysInstancedEXT = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedEXT")) == NULL) || r; - r = ((glDrawElementsInstancedEXT = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_draw_instanced */ - -#ifdef GL_EXT_draw_range_elements - -static GLboolean _glewInit_GL_EXT_draw_range_elements () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawRangeElementsEXT = (PFNGLDRAWRANGEELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_draw_range_elements */ - -#ifdef GL_EXT_draw_transform_feedback - -static GLboolean _glewInit_GL_EXT_draw_transform_feedback () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawTransformFeedbackEXT = (PFNGLDRAWTRANSFORMFEEDBACKEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackEXT")) == NULL) || r; - r = ((glDrawTransformFeedbackInstancedEXT = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackInstancedEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_draw_transform_feedback */ - -#ifdef GL_EXT_external_buffer - -static GLboolean _glewInit_GL_EXT_external_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((glBufferStorageExternalEXT = (PFNGLBUFFERSTORAGEEXTERNALEXTPROC)glewGetProcAddress((const GLubyte*)"glBufferStorageExternalEXT")) == NULL) || r; - r = ((glNamedBufferStorageExternalEXT = (PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorageExternalEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_external_buffer */ - -#ifdef GL_EXT_fog_coord - -static GLboolean _glewInit_GL_EXT_fog_coord () -{ - GLboolean r = GL_FALSE; - - r = ((glFogCoordPointerEXT = (PFNGLFOGCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointerEXT")) == NULL) || r; - r = ((glFogCoorddEXT = (PFNGLFOGCOORDDEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddEXT")) == NULL) || r; - r = ((glFogCoorddvEXT = (PFNGLFOGCOORDDVEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddvEXT")) == NULL) || r; - r = ((glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfEXT")) == NULL) || r; - r = ((glFogCoordfvEXT = (PFNGLFOGCOORDFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfvEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_fog_coord */ - -#ifdef GL_EXT_fragment_lighting - -static GLboolean _glewInit_GL_EXT_fragment_lighting () -{ - GLboolean r = GL_FALSE; - - r = ((glFragmentColorMaterialEXT = (PFNGLFRAGMENTCOLORMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentColorMaterialEXT")) == NULL) || r; - r = ((glFragmentLightModelfEXT = (PFNGLFRAGMENTLIGHTMODELFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfEXT")) == NULL) || r; - r = ((glFragmentLightModelfvEXT = (PFNGLFRAGMENTLIGHTMODELFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfvEXT")) == NULL) || r; - r = ((glFragmentLightModeliEXT = (PFNGLFRAGMENTLIGHTMODELIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModeliEXT")) == NULL) || r; - r = ((glFragmentLightModelivEXT = (PFNGLFRAGMENTLIGHTMODELIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelivEXT")) == NULL) || r; - r = ((glFragmentLightfEXT = (PFNGLFRAGMENTLIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfEXT")) == NULL) || r; - r = ((glFragmentLightfvEXT = (PFNGLFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfvEXT")) == NULL) || r; - r = ((glFragmentLightiEXT = (PFNGLFRAGMENTLIGHTIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightiEXT")) == NULL) || r; - r = ((glFragmentLightivEXT = (PFNGLFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightivEXT")) == NULL) || r; - r = ((glFragmentMaterialfEXT = (PFNGLFRAGMENTMATERIALFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfEXT")) == NULL) || r; - r = ((glFragmentMaterialfvEXT = (PFNGLFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfvEXT")) == NULL) || r; - r = ((glFragmentMaterialiEXT = (PFNGLFRAGMENTMATERIALIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialiEXT")) == NULL) || r; - r = ((glFragmentMaterialivEXT = (PFNGLFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialivEXT")) == NULL) || r; - r = ((glGetFragmentLightfvEXT = (PFNGLGETFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightfvEXT")) == NULL) || r; - r = ((glGetFragmentLightivEXT = (PFNGLGETFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightivEXT")) == NULL) || r; - r = ((glGetFragmentMaterialfvEXT = (PFNGLGETFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialfvEXT")) == NULL) || r; - r = ((glGetFragmentMaterialivEXT = (PFNGLGETFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialivEXT")) == NULL) || r; - r = ((glLightEnviEXT = (PFNGLLIGHTENVIEXTPROC)glewGetProcAddress((const GLubyte*)"glLightEnviEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_fragment_lighting */ - -#ifdef GL_EXT_framebuffer_blit - -static GLboolean _glewInit_GL_EXT_framebuffer_blit () -{ - GLboolean r = GL_FALSE; - - r = ((glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_framebuffer_blit */ - -#ifdef GL_EXT_framebuffer_multisample - -static GLboolean _glewInit_GL_EXT_framebuffer_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_framebuffer_multisample */ - -#ifdef GL_EXT_framebuffer_object - -static GLboolean _glewInit_GL_EXT_framebuffer_object () -{ - GLboolean r = GL_FALSE; - - r = ((glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindFramebufferEXT")) == NULL) || r; - r = ((glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindRenderbufferEXT")) == NULL) || r; - r = ((glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)glewGetProcAddress((const GLubyte*)"glCheckFramebufferStatusEXT")) == NULL) || r; - r = ((glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffersEXT")) == NULL) || r; - r = ((glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffersEXT")) == NULL) || r; - r = ((glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbufferEXT")) == NULL) || r; - r = ((glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture1DEXT")) == NULL) || r; - r = ((glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2DEXT")) == NULL) || r; - r = ((glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3DEXT")) == NULL) || r; - r = ((glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenFramebuffersEXT")) == NULL) || r; - r = ((glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenRenderbuffersEXT")) == NULL) || r; - r = ((glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateMipmapEXT")) == NULL) || r; - r = ((glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferAttachmentParameterivEXT")) == NULL) || r; - r = ((glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetRenderbufferParameterivEXT")) == NULL) || r; - r = ((glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glIsFramebufferEXT")) == NULL) || r; - r = ((glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glIsRenderbufferEXT")) == NULL) || r; - r = ((glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_framebuffer_object */ - -#ifdef GL_EXT_geometry_shader4 - -static GLboolean _glewInit_GL_EXT_geometry_shader4 () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureEXT")) == NULL) || r; - r = ((glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureFaceEXT")) == NULL) || r; - r = ((glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteriEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_geometry_shader4 */ - -#ifdef GL_EXT_gpu_program_parameters - -static GLboolean _glewInit_GL_EXT_gpu_program_parameters () -{ - GLboolean r = GL_FALSE; - - r = ((glProgramEnvParameters4fvEXT = (PFNGLPROGRAMENVPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameters4fvEXT")) == NULL) || r; - r = ((glProgramLocalParameters4fvEXT = (PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameters4fvEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_gpu_program_parameters */ - -#ifdef GL_EXT_gpu_shader4 - -static GLboolean _glewInit_GL_EXT_gpu_shader4 () -{ - GLboolean r = GL_FALSE; - - r = ((glBindFragDataLocationEXT = (PFNGLBINDFRAGDATALOCATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationEXT")) == NULL) || r; - r = ((glGetFragDataLocationEXT = (PFNGLGETFRAGDATALOCATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataLocationEXT")) == NULL) || r; - r = ((glGetUniformuivEXT = (PFNGLGETUNIFORMUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformuivEXT")) == NULL) || r; - r = ((glGetVertexAttribIivEXT = (PFNGLGETVERTEXATTRIBIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIivEXT")) == NULL) || r; - r = ((glGetVertexAttribIuivEXT = (PFNGLGETVERTEXATTRIBIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIuivEXT")) == NULL) || r; - r = ((glUniform1uiEXT = (PFNGLUNIFORM1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform1uiEXT")) == NULL) || r; - r = ((glUniform1uivEXT = (PFNGLUNIFORM1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform1uivEXT")) == NULL) || r; - r = ((glUniform2uiEXT = (PFNGLUNIFORM2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform2uiEXT")) == NULL) || r; - r = ((glUniform2uivEXT = (PFNGLUNIFORM2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform2uivEXT")) == NULL) || r; - r = ((glUniform3uiEXT = (PFNGLUNIFORM3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform3uiEXT")) == NULL) || r; - r = ((glUniform3uivEXT = (PFNGLUNIFORM3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform3uivEXT")) == NULL) || r; - r = ((glUniform4uiEXT = (PFNGLUNIFORM4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform4uiEXT")) == NULL) || r; - r = ((glUniform4uivEXT = (PFNGLUNIFORM4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform4uivEXT")) == NULL) || r; - r = ((glVertexAttribI1iEXT = (PFNGLVERTEXATTRIBI1IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1iEXT")) == NULL) || r; - r = ((glVertexAttribI1ivEXT = (PFNGLVERTEXATTRIBI1IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1ivEXT")) == NULL) || r; - r = ((glVertexAttribI1uiEXT = (PFNGLVERTEXATTRIBI1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uiEXT")) == NULL) || r; - r = ((glVertexAttribI1uivEXT = (PFNGLVERTEXATTRIBI1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uivEXT")) == NULL) || r; - r = ((glVertexAttribI2iEXT = (PFNGLVERTEXATTRIBI2IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2iEXT")) == NULL) || r; - r = ((glVertexAttribI2ivEXT = (PFNGLVERTEXATTRIBI2IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2ivEXT")) == NULL) || r; - r = ((glVertexAttribI2uiEXT = (PFNGLVERTEXATTRIBI2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uiEXT")) == NULL) || r; - r = ((glVertexAttribI2uivEXT = (PFNGLVERTEXATTRIBI2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uivEXT")) == NULL) || r; - r = ((glVertexAttribI3iEXT = (PFNGLVERTEXATTRIBI3IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3iEXT")) == NULL) || r; - r = ((glVertexAttribI3ivEXT = (PFNGLVERTEXATTRIBI3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3ivEXT")) == NULL) || r; - r = ((glVertexAttribI3uiEXT = (PFNGLVERTEXATTRIBI3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uiEXT")) == NULL) || r; - r = ((glVertexAttribI3uivEXT = (PFNGLVERTEXATTRIBI3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uivEXT")) == NULL) || r; - r = ((glVertexAttribI4bvEXT = (PFNGLVERTEXATTRIBI4BVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4bvEXT")) == NULL) || r; - r = ((glVertexAttribI4iEXT = (PFNGLVERTEXATTRIBI4IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4iEXT")) == NULL) || r; - r = ((glVertexAttribI4ivEXT = (PFNGLVERTEXATTRIBI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ivEXT")) == NULL) || r; - r = ((glVertexAttribI4svEXT = (PFNGLVERTEXATTRIBI4SVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4svEXT")) == NULL) || r; - r = ((glVertexAttribI4ubvEXT = (PFNGLVERTEXATTRIBI4UBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ubvEXT")) == NULL) || r; - r = ((glVertexAttribI4uiEXT = (PFNGLVERTEXATTRIBI4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uiEXT")) == NULL) || r; - r = ((glVertexAttribI4uivEXT = (PFNGLVERTEXATTRIBI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uivEXT")) == NULL) || r; - r = ((glVertexAttribI4usvEXT = (PFNGLVERTEXATTRIBI4USVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4usvEXT")) == NULL) || r; - r = ((glVertexAttribIPointerEXT = (PFNGLVERTEXATTRIBIPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIPointerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_gpu_shader4 */ - -#ifdef GL_EXT_histogram - -static GLboolean _glewInit_GL_EXT_histogram () -{ - GLboolean r = GL_FALSE; - - r = ((glGetHistogramEXT = (PFNGLGETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramEXT")) == NULL) || r; - r = ((glGetHistogramParameterfvEXT = (PFNGLGETHISTOGRAMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterfvEXT")) == NULL) || r; - r = ((glGetHistogramParameterivEXT = (PFNGLGETHISTOGRAMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterivEXT")) == NULL) || r; - r = ((glGetMinmaxEXT = (PFNGLGETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxEXT")) == NULL) || r; - r = ((glGetMinmaxParameterfvEXT = (PFNGLGETMINMAXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterfvEXT")) == NULL) || r; - r = ((glGetMinmaxParameterivEXT = (PFNGLGETMINMAXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterivEXT")) == NULL) || r; - r = ((glHistogramEXT = (PFNGLHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glHistogramEXT")) == NULL) || r; - r = ((glMinmaxEXT = (PFNGLMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glMinmaxEXT")) == NULL) || r; - r = ((glResetHistogramEXT = (PFNGLRESETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glResetHistogramEXT")) == NULL) || r; - r = ((glResetMinmaxEXT = (PFNGLRESETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glResetMinmaxEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_histogram */ - -#ifdef GL_EXT_index_func - -static GLboolean _glewInit_GL_EXT_index_func () -{ - GLboolean r = GL_FALSE; - - r = ((glIndexFuncEXT = (PFNGLINDEXFUNCEXTPROC)glewGetProcAddress((const GLubyte*)"glIndexFuncEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_index_func */ - -#ifdef GL_EXT_index_material - -static GLboolean _glewInit_GL_EXT_index_material () -{ - GLboolean r = GL_FALSE; - - r = ((glIndexMaterialEXT = (PFNGLINDEXMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glIndexMaterialEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_index_material */ - -#ifdef GL_EXT_instanced_arrays - -static GLboolean _glewInit_GL_EXT_instanced_arrays () -{ - GLboolean r = GL_FALSE; - - r = ((glVertexAttribDivisorEXT = (PFNGLVERTEXATTRIBDIVISOREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_instanced_arrays */ - -#ifdef GL_EXT_light_texture - -static GLboolean _glewInit_GL_EXT_light_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glApplyTextureEXT = (PFNGLAPPLYTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glApplyTextureEXT")) == NULL) || r; - r = ((glTextureLightEXT = (PFNGLTEXTURELIGHTEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureLightEXT")) == NULL) || r; - r = ((glTextureMaterialEXT = (PFNGLTEXTUREMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureMaterialEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_light_texture */ - -#ifdef GL_EXT_map_buffer_range - -static GLboolean _glewInit_GL_EXT_map_buffer_range () -{ - GLboolean r = GL_FALSE; - - r = ((glFlushMappedBufferRangeEXT = (PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedBufferRangeEXT")) == NULL) || r; - r = ((glMapBufferRangeEXT = (PFNGLMAPBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glMapBufferRangeEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_map_buffer_range */ - -#ifdef GL_EXT_memory_object - -static GLboolean _glewInit_GL_EXT_memory_object () -{ - GLboolean r = GL_FALSE; - - r = ((glBufferStorageMemEXT = (PFNGLBUFFERSTORAGEMEMEXTPROC)glewGetProcAddress((const GLubyte*)"glBufferStorageMemEXT")) == NULL) || r; - r = ((glCreateMemoryObjectsEXT = (PFNGLCREATEMEMORYOBJECTSEXTPROC)glewGetProcAddress((const GLubyte*)"glCreateMemoryObjectsEXT")) == NULL) || r; - r = ((glDeleteMemoryObjectsEXT = (PFNGLDELETEMEMORYOBJECTSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteMemoryObjectsEXT")) == NULL) || r; - r = ((glGetMemoryObjectParameterivEXT = (PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMemoryObjectParameterivEXT")) == NULL) || r; - r = ((glGetUnsignedBytei_vEXT = (PFNGLGETUNSIGNEDBYTEI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUnsignedBytei_vEXT")) == NULL) || r; - r = ((glGetUnsignedBytevEXT = (PFNGLGETUNSIGNEDBYTEVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUnsignedBytevEXT")) == NULL) || r; - r = ((glIsMemoryObjectEXT = (PFNGLISMEMORYOBJECTEXTPROC)glewGetProcAddress((const GLubyte*)"glIsMemoryObjectEXT")) == NULL) || r; - r = ((glMemoryObjectParameterivEXT = (PFNGLMEMORYOBJECTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMemoryObjectParameterivEXT")) == NULL) || r; - r = ((glNamedBufferStorageMemEXT = (PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorageMemEXT")) == NULL) || r; - r = ((glTexStorageMem1DEXT = (PFNGLTEXSTORAGEMEM1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorageMem1DEXT")) == NULL) || r; - r = ((glTexStorageMem2DEXT = (PFNGLTEXSTORAGEMEM2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorageMem2DEXT")) == NULL) || r; - r = ((glTexStorageMem2DMultisampleEXT = (PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorageMem2DMultisampleEXT")) == NULL) || r; - r = ((glTexStorageMem3DEXT = (PFNGLTEXSTORAGEMEM3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorageMem3DEXT")) == NULL) || r; - r = ((glTexStorageMem3DMultisampleEXT = (PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorageMem3DMultisampleEXT")) == NULL) || r; - r = ((glTextureStorageMem1DEXT = (PFNGLTEXTURESTORAGEMEM1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageMem1DEXT")) == NULL) || r; - r = ((glTextureStorageMem2DEXT = (PFNGLTEXTURESTORAGEMEM2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageMem2DEXT")) == NULL) || r; - r = ((glTextureStorageMem2DMultisampleEXT = (PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageMem2DMultisampleEXT")) == NULL) || r; - r = ((glTextureStorageMem3DEXT = (PFNGLTEXTURESTORAGEMEM3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageMem3DEXT")) == NULL) || r; - r = ((glTextureStorageMem3DMultisampleEXT = (PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageMem3DMultisampleEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_memory_object */ - -#ifdef GL_EXT_memory_object_fd - -static GLboolean _glewInit_GL_EXT_memory_object_fd () -{ - GLboolean r = GL_FALSE; - - r = ((glImportMemoryFdEXT = (PFNGLIMPORTMEMORYFDEXTPROC)glewGetProcAddress((const GLubyte*)"glImportMemoryFdEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_memory_object_fd */ - -#ifdef GL_EXT_memory_object_win32 - -static GLboolean _glewInit_GL_EXT_memory_object_win32 () -{ - GLboolean r = GL_FALSE; - - r = ((glImportMemoryWin32HandleEXT = (PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC)glewGetProcAddress((const GLubyte*)"glImportMemoryWin32HandleEXT")) == NULL) || r; - r = ((glImportMemoryWin32NameEXT = (PFNGLIMPORTMEMORYWIN32NAMEEXTPROC)glewGetProcAddress((const GLubyte*)"glImportMemoryWin32NameEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_memory_object_win32 */ - -#ifdef GL_EXT_multi_draw_arrays - -static GLboolean _glewInit_GL_EXT_multi_draw_arrays () -{ - GLboolean r = GL_FALSE; - - r = ((glMultiDrawArraysEXT = (PFNGLMULTIDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysEXT")) == NULL) || r; - r = ((glMultiDrawElementsEXT = (PFNGLMULTIDRAWELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_multi_draw_arrays */ - -#ifdef GL_EXT_multi_draw_indirect - -static GLboolean _glewInit_GL_EXT_multi_draw_indirect () -{ - GLboolean r = GL_FALSE; - - r = ((glMultiDrawArraysIndirectEXT = (PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectEXT")) == NULL) || r; - r = ((glMultiDrawElementsIndirectEXT = (PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_multi_draw_indirect */ - -#ifdef GL_EXT_multisample - -static GLboolean _glewInit_GL_EXT_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glSampleMaskEXT = (PFNGLSAMPLEMASKEXTPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskEXT")) == NULL) || r; - r = ((glSamplePatternEXT = (PFNGLSAMPLEPATTERNEXTPROC)glewGetProcAddress((const GLubyte*)"glSamplePatternEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_multisample */ - -#ifdef GL_EXT_multisampled_render_to_texture - -static GLboolean _glewInit_GL_EXT_multisampled_render_to_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferTexture2DMultisampleEXT = (PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2DMultisampleEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_multisampled_render_to_texture */ - -#ifdef GL_EXT_multiview_draw_buffers - -static GLboolean _glewInit_GL_EXT_multiview_draw_buffers () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawBuffersIndexedEXT = (PFNGLDRAWBUFFERSINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersIndexedEXT")) == NULL) || r; - r = ((glGetIntegeri_vEXT = (PFNGLGETINTEGERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetIntegeri_vEXT")) == NULL) || r; - r = ((glReadBufferIndexedEXT = (PFNGLREADBUFFERINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glReadBufferIndexedEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_multiview_draw_buffers */ - -#ifdef GL_EXT_paletted_texture - -static GLboolean _glewInit_GL_EXT_paletted_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glColorTableEXT = (PFNGLCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glColorTableEXT")) == NULL) || r; - r = ((glGetColorTableEXT = (PFNGLGETCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableEXT")) == NULL) || r; - r = ((glGetColorTableParameterfvEXT = (PFNGLGETCOLORTABLEPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfvEXT")) == NULL) || r; - r = ((glGetColorTableParameterivEXT = (PFNGLGETCOLORTABLEPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterivEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_paletted_texture */ - -#ifdef GL_EXT_pixel_transform - -static GLboolean _glewInit_GL_EXT_pixel_transform () -{ - GLboolean r = GL_FALSE; - - r = ((glGetPixelTransformParameterfvEXT = (PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterfvEXT")) == NULL) || r; - r = ((glGetPixelTransformParameterivEXT = (PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterivEXT")) == NULL) || r; - r = ((glPixelTransformParameterfEXT = (PFNGLPIXELTRANSFORMPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfEXT")) == NULL) || r; - r = ((glPixelTransformParameterfvEXT = (PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfvEXT")) == NULL) || r; - r = ((glPixelTransformParameteriEXT = (PFNGLPIXELTRANSFORMPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameteriEXT")) == NULL) || r; - r = ((glPixelTransformParameterivEXT = (PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterivEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_pixel_transform */ - -#ifdef GL_EXT_point_parameters - -static GLboolean _glewInit_GL_EXT_point_parameters () -{ - GLboolean r = GL_FALSE; - - r = ((glPointParameterfEXT = (PFNGLPOINTPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfEXT")) == NULL) || r; - r = ((glPointParameterfvEXT = (PFNGLPOINTPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfvEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_point_parameters */ - -#ifdef GL_EXT_polygon_offset - -static GLboolean _glewInit_GL_EXT_polygon_offset () -{ - GLboolean r = GL_FALSE; - - r = ((glPolygonOffsetEXT = (PFNGLPOLYGONOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_polygon_offset */ - -#ifdef GL_EXT_polygon_offset_clamp - -static GLboolean _glewInit_GL_EXT_polygon_offset_clamp () -{ - GLboolean r = GL_FALSE; - - r = ((glPolygonOffsetClampEXT = (PFNGLPOLYGONOFFSETCLAMPEXTPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetClampEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_polygon_offset_clamp */ - -#ifdef GL_EXT_primitive_bounding_box - -static GLboolean _glewInit_GL_EXT_primitive_bounding_box () -{ - GLboolean r = GL_FALSE; - - r = ((glPrimitiveBoundingBoxEXT = (PFNGLPRIMITIVEBOUNDINGBOXEXTPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveBoundingBoxEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_primitive_bounding_box */ - -#ifdef GL_EXT_provoking_vertex - -static GLboolean _glewInit_GL_EXT_provoking_vertex () -{ - GLboolean r = GL_FALSE; - - r = ((glProvokingVertexEXT = (PFNGLPROVOKINGVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glProvokingVertexEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_provoking_vertex */ - -#ifdef GL_EXT_raster_multisample - -static GLboolean _glewInit_GL_EXT_raster_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glCoverageModulationNV = (PFNGLCOVERAGEMODULATIONNVPROC)glewGetProcAddress((const GLubyte*)"glCoverageModulationNV")) == NULL) || r; - r = ((glCoverageModulationTableNV = (PFNGLCOVERAGEMODULATIONTABLENVPROC)glewGetProcAddress((const GLubyte*)"glCoverageModulationTableNV")) == NULL) || r; - r = ((glGetCoverageModulationTableNV = (PFNGLGETCOVERAGEMODULATIONTABLENVPROC)glewGetProcAddress((const GLubyte*)"glGetCoverageModulationTableNV")) == NULL) || r; - r = ((glRasterSamplesEXT = (PFNGLRASTERSAMPLESEXTPROC)glewGetProcAddress((const GLubyte*)"glRasterSamplesEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_raster_multisample */ - -#ifdef GL_EXT_robustness - -static GLboolean _glewInit_GL_EXT_robustness () -{ - GLboolean r = GL_FALSE; - - r = ((glGetnUniformfvEXT = (PFNGLGETNUNIFORMFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformfvEXT")) == NULL) || r; - r = ((glGetnUniformivEXT = (PFNGLGETNUNIFORMIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformivEXT")) == NULL) || r; - r = ((glReadnPixelsEXT = (PFNGLREADNPIXELSEXTPROC)glewGetProcAddress((const GLubyte*)"glReadnPixelsEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_robustness */ - -#ifdef GL_EXT_scene_marker - -static GLboolean _glewInit_GL_EXT_scene_marker () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginSceneEXT = (PFNGLBEGINSCENEEXTPROC)glewGetProcAddress((const GLubyte*)"glBeginSceneEXT")) == NULL) || r; - r = ((glEndSceneEXT = (PFNGLENDSCENEEXTPROC)glewGetProcAddress((const GLubyte*)"glEndSceneEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_scene_marker */ - -#ifdef GL_EXT_secondary_color - -static GLboolean _glewInit_GL_EXT_secondary_color () -{ - GLboolean r = GL_FALSE; - - r = ((glSecondaryColor3bEXT = (PFNGLSECONDARYCOLOR3BEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bEXT")) == NULL) || r; - r = ((glSecondaryColor3bvEXT = (PFNGLSECONDARYCOLOR3BVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bvEXT")) == NULL) || r; - r = ((glSecondaryColor3dEXT = (PFNGLSECONDARYCOLOR3DEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dEXT")) == NULL) || r; - r = ((glSecondaryColor3dvEXT = (PFNGLSECONDARYCOLOR3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dvEXT")) == NULL) || r; - r = ((glSecondaryColor3fEXT = (PFNGLSECONDARYCOLOR3FEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fEXT")) == NULL) || r; - r = ((glSecondaryColor3fvEXT = (PFNGLSECONDARYCOLOR3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fvEXT")) == NULL) || r; - r = ((glSecondaryColor3iEXT = (PFNGLSECONDARYCOLOR3IEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3iEXT")) == NULL) || r; - r = ((glSecondaryColor3ivEXT = (PFNGLSECONDARYCOLOR3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ivEXT")) == NULL) || r; - r = ((glSecondaryColor3sEXT = (PFNGLSECONDARYCOLOR3SEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3sEXT")) == NULL) || r; - r = ((glSecondaryColor3svEXT = (PFNGLSECONDARYCOLOR3SVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3svEXT")) == NULL) || r; - r = ((glSecondaryColor3ubEXT = (PFNGLSECONDARYCOLOR3UBEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubEXT")) == NULL) || r; - r = ((glSecondaryColor3ubvEXT = (PFNGLSECONDARYCOLOR3UBVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubvEXT")) == NULL) || r; - r = ((glSecondaryColor3uiEXT = (PFNGLSECONDARYCOLOR3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uiEXT")) == NULL) || r; - r = ((glSecondaryColor3uivEXT = (PFNGLSECONDARYCOLOR3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uivEXT")) == NULL) || r; - r = ((glSecondaryColor3usEXT = (PFNGLSECONDARYCOLOR3USEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usEXT")) == NULL) || r; - r = ((glSecondaryColor3usvEXT = (PFNGLSECONDARYCOLOR3USVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usvEXT")) == NULL) || r; - r = ((glSecondaryColorPointerEXT = (PFNGLSECONDARYCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_secondary_color */ - -#ifdef GL_EXT_semaphore - -static GLboolean _glewInit_GL_EXT_semaphore () -{ - GLboolean r = GL_FALSE; - - r = ((glDeleteSemaphoresEXT = (PFNGLDELETESEMAPHORESEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteSemaphoresEXT")) == NULL) || r; - r = ((glGenSemaphoresEXT = (PFNGLGENSEMAPHORESEXTPROC)glewGetProcAddress((const GLubyte*)"glGenSemaphoresEXT")) == NULL) || r; - r = ((glGetSemaphoreParameterui64vEXT = (PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetSemaphoreParameterui64vEXT")) == NULL) || r; - r = ((glIsSemaphoreEXT = (PFNGLISSEMAPHOREEXTPROC)glewGetProcAddress((const GLubyte*)"glIsSemaphoreEXT")) == NULL) || r; - r = ((glSemaphoreParameterui64vEXT = (PFNGLSEMAPHOREPARAMETERUI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glSemaphoreParameterui64vEXT")) == NULL) || r; - r = ((glSignalSemaphoreEXT = (PFNGLSIGNALSEMAPHOREEXTPROC)glewGetProcAddress((const GLubyte*)"glSignalSemaphoreEXT")) == NULL) || r; - r = ((glWaitSemaphoreEXT = (PFNGLWAITSEMAPHOREEXTPROC)glewGetProcAddress((const GLubyte*)"glWaitSemaphoreEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_semaphore */ - -#ifdef GL_EXT_semaphore_fd - -static GLboolean _glewInit_GL_EXT_semaphore_fd () -{ - GLboolean r = GL_FALSE; - - r = ((glImportSemaphoreFdEXT = (PFNGLIMPORTSEMAPHOREFDEXTPROC)glewGetProcAddress((const GLubyte*)"glImportSemaphoreFdEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_semaphore_fd */ - -#ifdef GL_EXT_semaphore_win32 - -static GLboolean _glewInit_GL_EXT_semaphore_win32 () -{ - GLboolean r = GL_FALSE; - - r = ((glImportSemaphoreWin32HandleEXT = (PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC)glewGetProcAddress((const GLubyte*)"glImportSemaphoreWin32HandleEXT")) == NULL) || r; - r = ((glImportSemaphoreWin32NameEXT = (PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC)glewGetProcAddress((const GLubyte*)"glImportSemaphoreWin32NameEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_semaphore_win32 */ - -#ifdef GL_EXT_separate_shader_objects - -static GLboolean _glewInit_GL_EXT_separate_shader_objects () -{ - GLboolean r = GL_FALSE; - - r = ((glActiveProgramEXT = (PFNGLACTIVEPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glActiveProgramEXT")) == NULL) || r; - r = ((glCreateShaderProgramEXT = (PFNGLCREATESHADERPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderProgramEXT")) == NULL) || r; - r = ((glUseShaderProgramEXT = (PFNGLUSESHADERPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glUseShaderProgramEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_separate_shader_objects */ - -#ifdef GL_EXT_shader_framebuffer_fetch - -static GLboolean _glewInit_GL_EXT_shader_framebuffer_fetch () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferFetchBarrierEXT = (PFNGLFRAMEBUFFERFETCHBARRIEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferFetchBarrierEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_shader_framebuffer_fetch */ - -#ifdef GL_EXT_shader_image_load_store - -static GLboolean _glewInit_GL_EXT_shader_image_load_store () -{ - GLboolean r = GL_FALSE; - - r = ((glBindImageTextureEXT = (PFNGLBINDIMAGETEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindImageTextureEXT")) == NULL) || r; - r = ((glMemoryBarrierEXT = (PFNGLMEMORYBARRIEREXTPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrierEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_shader_image_load_store */ - -#ifdef GL_EXT_shader_pixel_local_storage2 - -static GLboolean _glewInit_GL_EXT_shader_pixel_local_storage2 () -{ - GLboolean r = GL_FALSE; - - r = ((glClearPixelLocalStorageuiEXT = (PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearPixelLocalStorageuiEXT")) == NULL) || r; - r = ((glFramebufferPixelLocalStorageSizeEXT = (PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferPixelLocalStorageSizeEXT")) == NULL) || r; - r = ((glGetFramebufferPixelLocalStorageSizeEXT = (PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferPixelLocalStorageSizeEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_shader_pixel_local_storage2 */ - -#ifdef GL_EXT_sparse_texture - -static GLboolean _glewInit_GL_EXT_sparse_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glTexPageCommitmentEXT = (PFNGLTEXPAGECOMMITMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glTexPageCommitmentEXT")) == NULL) || r; - r = ((glTexturePageCommitmentEXT = (PFNGLTEXTUREPAGECOMMITMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glTexturePageCommitmentEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_sparse_texture */ - -#ifdef GL_EXT_stencil_two_side - -static GLboolean _glewInit_GL_EXT_stencil_two_side () -{ - GLboolean r = GL_FALSE; - - r = ((glActiveStencilFaceEXT = (PFNGLACTIVESTENCILFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glActiveStencilFaceEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_stencil_two_side */ - -#ifdef GL_EXT_subtexture - -static GLboolean _glewInit_GL_EXT_subtexture () -{ - GLboolean r = GL_FALSE; - - r = ((glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage1DEXT")) == NULL) || r; - r = ((glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage2DEXT")) == NULL) || r; - r = ((glTexSubImage3DEXT = (PFNGLTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3DEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_subtexture */ - -#ifdef GL_EXT_tessellation_point_size - -static GLboolean _glewInit_GL_EXT_tessellation_point_size () -{ - GLboolean r = GL_FALSE; - - r = ((glPatchParameteriEXT = (PFNGLPATCHPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glPatchParameteriEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_tessellation_point_size */ - -#ifdef GL_EXT_texture3D - -static GLboolean _glewInit_GL_EXT_texture3D () -{ - GLboolean r = GL_FALSE; - - r = ((glTexImage3DEXT = (PFNGLTEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture3D */ - -#ifdef GL_EXT_texture_array - -static GLboolean _glewInit_GL_EXT_texture_array () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture_array */ - -#ifdef GL_EXT_texture_border_clamp - -static GLboolean _glewInit_GL_EXT_texture_border_clamp () -{ - GLboolean r = GL_FALSE; - - r = ((glGetSamplerParameterIivEXT = (PFNGLGETSAMPLERPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIivEXT")) == NULL) || r; - r = ((glGetSamplerParameterIuivEXT = (PFNGLGETSAMPLERPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIuivEXT")) == NULL) || r; - r = ((glSamplerParameterIivEXT = (PFNGLSAMPLERPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIivEXT")) == NULL) || r; - r = ((glSamplerParameterIuivEXT = (PFNGLSAMPLERPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIuivEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture_border_clamp */ - -#ifdef GL_EXT_texture_buffer_object - -static GLboolean _glewInit_GL_EXT_texture_buffer_object () -{ - GLboolean r = GL_FALSE; - - r = ((glTexBufferEXT = (PFNGLTEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTexBufferEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture_buffer_object */ - -#ifdef GL_EXT_texture_integer - -static GLboolean _glewInit_GL_EXT_texture_integer () -{ - GLboolean r = GL_FALSE; - - r = ((glClearColorIiEXT = (PFNGLCLEARCOLORIIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearColorIiEXT")) == NULL) || r; - r = ((glClearColorIuiEXT = (PFNGLCLEARCOLORIUIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearColorIuiEXT")) == NULL) || r; - r = ((glGetTexParameterIivEXT = (PFNGLGETTEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIivEXT")) == NULL) || r; - r = ((glGetTexParameterIuivEXT = (PFNGLGETTEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIuivEXT")) == NULL) || r; - r = ((glTexParameterIivEXT = (PFNGLTEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIivEXT")) == NULL) || r; - r = ((glTexParameterIuivEXT = (PFNGLTEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIuivEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture_integer */ - -#ifdef GL_EXT_texture_object - -static GLboolean _glewInit_GL_EXT_texture_object () -{ - GLboolean r = GL_FALSE; - - r = ((glAreTexturesResidentEXT = (PFNGLARETEXTURESRESIDENTEXTPROC)glewGetProcAddress((const GLubyte*)"glAreTexturesResidentEXT")) == NULL) || r; - r = ((glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindTextureEXT")) == NULL) || r; - r = ((glDeleteTexturesEXT = (PFNGLDELETETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteTexturesEXT")) == NULL) || r; - r = ((glGenTexturesEXT = (PFNGLGENTEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glGenTexturesEXT")) == NULL) || r; - r = ((glIsTextureEXT = (PFNGLISTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glIsTextureEXT")) == NULL) || r; - r = ((glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glPrioritizeTexturesEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture_object */ - -#ifdef GL_EXT_texture_perturb_normal - -static GLboolean _glewInit_GL_EXT_texture_perturb_normal () -{ - GLboolean r = GL_FALSE; - - r = ((glTextureNormalEXT = (PFNGLTEXTURENORMALEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureNormalEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture_perturb_normal */ - -#ifdef GL_EXT_texture_storage - -static GLboolean _glewInit_GL_EXT_texture_storage () -{ - GLboolean r = GL_FALSE; - - r = ((glTexStorage1DEXT = (PFNGLTEXSTORAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorage1DEXT")) == NULL) || r; - r = ((glTexStorage2DEXT = (PFNGLTEXSTORAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorage2DEXT")) == NULL) || r; - r = ((glTexStorage3DEXT = (PFNGLTEXSTORAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorage3DEXT")) == NULL) || r; - r = ((glTextureStorage1DEXT = (PFNGLTEXTURESTORAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage1DEXT")) == NULL) || r; - r = ((glTextureStorage2DEXT = (PFNGLTEXTURESTORAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DEXT")) == NULL) || r; - r = ((glTextureStorage3DEXT = (PFNGLTEXTURESTORAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture_storage */ - -#ifdef GL_EXT_texture_view - -static GLboolean _glewInit_GL_EXT_texture_view () -{ - GLboolean r = GL_FALSE; - - r = ((glTextureViewEXT = (PFNGLTEXTUREVIEWEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureViewEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture_view */ - -#ifdef GL_EXT_timer_query - -static GLboolean _glewInit_GL_EXT_timer_query () -{ - GLboolean r = GL_FALSE; - - r = ((glGetQueryObjecti64vEXT = (PFNGLGETQUERYOBJECTI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64vEXT")) == NULL) || r; - r = ((glGetQueryObjectui64vEXT = (PFNGLGETQUERYOBJECTUI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64vEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_timer_query */ - -#ifdef GL_EXT_transform_feedback - -static GLboolean _glewInit_GL_EXT_transform_feedback () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginTransformFeedbackEXT = (PFNGLBEGINTRANSFORMFEEDBACKEXTPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedbackEXT")) == NULL) || r; - r = ((glBindBufferBaseEXT = (PFNGLBINDBUFFERBASEEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBaseEXT")) == NULL) || r; - r = ((glBindBufferOffsetEXT = (PFNGLBINDBUFFEROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferOffsetEXT")) == NULL) || r; - r = ((glBindBufferRangeEXT = (PFNGLBINDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRangeEXT")) == NULL) || r; - r = ((glEndTransformFeedbackEXT = (PFNGLENDTRANSFORMFEEDBACKEXTPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedbackEXT")) == NULL) || r; - r = ((glGetTransformFeedbackVaryingEXT = (PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVaryingEXT")) == NULL) || r; - r = ((glTransformFeedbackVaryingsEXT = (PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryingsEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_transform_feedback */ - -#ifdef GL_EXT_vertex_array - -static GLboolean _glewInit_GL_EXT_vertex_array () -{ - GLboolean r = GL_FALSE; - - r = ((glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glArrayElementEXT")) == NULL) || r; - r = ((glColorPointerEXT = (PFNGLCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glColorPointerEXT")) == NULL) || r; - r = ((glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysEXT")) == NULL) || r; - r = ((glEdgeFlagPointerEXT = (PFNGLEDGEFLAGPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagPointerEXT")) == NULL) || r; - r = ((glIndexPointerEXT = (PFNGLINDEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glIndexPointerEXT")) == NULL) || r; - r = ((glNormalPointerEXT = (PFNGLNORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glNormalPointerEXT")) == NULL) || r; - r = ((glTexCoordPointerEXT = (PFNGLTEXCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointerEXT")) == NULL) || r; - r = ((glVertexPointerEXT = (PFNGLVERTEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexPointerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_vertex_array */ - -#ifdef GL_EXT_vertex_array_setXXX - -static GLboolean _glewInit_GL_EXT_vertex_array_setXXX () -{ - GLboolean r = GL_FALSE; - - r = ((glBindArraySetEXT = (PFNGLBINDARRAYSETEXTPROC)glewGetProcAddress((const GLubyte*)"glBindArraySetEXT")) == NULL) || r; - r = ((glCreateArraySetExt = (PFNGLCREATEARRAYSETEXTPROC)glewGetProcAddress((const GLubyte*)"glCreateArraySetExt")) == NULL) || r; - r = ((glDeleteArraySetsEXT = (PFNGLDELETEARRAYSETSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteArraySetsEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_vertex_array_setXXX */ - -#ifdef GL_EXT_vertex_attrib_64bit - -static GLboolean _glewInit_GL_EXT_vertex_attrib_64bit () -{ - GLboolean r = GL_FALSE; - - r = ((glGetVertexAttribLdvEXT = (PFNGLGETVERTEXATTRIBLDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLdvEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribLOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribLOffsetEXT")) == NULL) || r; - r = ((glVertexAttribL1dEXT = (PFNGLVERTEXATTRIBL1DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dEXT")) == NULL) || r; - r = ((glVertexAttribL1dvEXT = (PFNGLVERTEXATTRIBL1DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dvEXT")) == NULL) || r; - r = ((glVertexAttribL2dEXT = (PFNGLVERTEXATTRIBL2DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dEXT")) == NULL) || r; - r = ((glVertexAttribL2dvEXT = (PFNGLVERTEXATTRIBL2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dvEXT")) == NULL) || r; - r = ((glVertexAttribL3dEXT = (PFNGLVERTEXATTRIBL3DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dEXT")) == NULL) || r; - r = ((glVertexAttribL3dvEXT = (PFNGLVERTEXATTRIBL3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dvEXT")) == NULL) || r; - r = ((glVertexAttribL4dEXT = (PFNGLVERTEXATTRIBL4DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dEXT")) == NULL) || r; - r = ((glVertexAttribL4dvEXT = (PFNGLVERTEXATTRIBL4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dvEXT")) == NULL) || r; - r = ((glVertexAttribLPointerEXT = (PFNGLVERTEXATTRIBLPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLPointerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_vertex_attrib_64bit */ - -#ifdef GL_EXT_vertex_shader - -static GLboolean _glewInit_GL_EXT_vertex_shader () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginVertexShaderEXT = (PFNGLBEGINVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glBeginVertexShaderEXT")) == NULL) || r; - r = ((glBindLightParameterEXT = (PFNGLBINDLIGHTPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindLightParameterEXT")) == NULL) || r; - r = ((glBindMaterialParameterEXT = (PFNGLBINDMATERIALPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindMaterialParameterEXT")) == NULL) || r; - r = ((glBindParameterEXT = (PFNGLBINDPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindParameterEXT")) == NULL) || r; - r = ((glBindTexGenParameterEXT = (PFNGLBINDTEXGENPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindTexGenParameterEXT")) == NULL) || r; - r = ((glBindTextureUnitParameterEXT = (PFNGLBINDTEXTUREUNITPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindTextureUnitParameterEXT")) == NULL) || r; - r = ((glBindVertexShaderEXT = (PFNGLBINDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindVertexShaderEXT")) == NULL) || r; - r = ((glDeleteVertexShaderEXT = (PFNGLDELETEVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexShaderEXT")) == NULL) || r; - r = ((glDisableVariantClientStateEXT = (PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVariantClientStateEXT")) == NULL) || r; - r = ((glEnableVariantClientStateEXT = (PFNGLENABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVariantClientStateEXT")) == NULL) || r; - r = ((glEndVertexShaderEXT = (PFNGLENDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glEndVertexShaderEXT")) == NULL) || r; - r = ((glExtractComponentEXT = (PFNGLEXTRACTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)"glExtractComponentEXT")) == NULL) || r; - r = ((glGenSymbolsEXT = (PFNGLGENSYMBOLSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenSymbolsEXT")) == NULL) || r; - r = ((glGenVertexShadersEXT = (PFNGLGENVERTEXSHADERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenVertexShadersEXT")) == NULL) || r; - r = ((glGetInvariantBooleanvEXT = (PFNGLGETINVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantBooleanvEXT")) == NULL) || r; - r = ((glGetInvariantFloatvEXT = (PFNGLGETINVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantFloatvEXT")) == NULL) || r; - r = ((glGetInvariantIntegervEXT = (PFNGLGETINVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantIntegervEXT")) == NULL) || r; - r = ((glGetLocalConstantBooleanvEXT = (PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantBooleanvEXT")) == NULL) || r; - r = ((glGetLocalConstantFloatvEXT = (PFNGLGETLOCALCONSTANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantFloatvEXT")) == NULL) || r; - r = ((glGetLocalConstantIntegervEXT = (PFNGLGETLOCALCONSTANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantIntegervEXT")) == NULL) || r; - r = ((glGetVariantBooleanvEXT = (PFNGLGETVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantBooleanvEXT")) == NULL) || r; - r = ((glGetVariantFloatvEXT = (PFNGLGETVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantFloatvEXT")) == NULL) || r; - r = ((glGetVariantIntegervEXT = (PFNGLGETVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantIntegervEXT")) == NULL) || r; - r = ((glGetVariantPointervEXT = (PFNGLGETVARIANTPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantPointervEXT")) == NULL) || r; - r = ((glInsertComponentEXT = (PFNGLINSERTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)"glInsertComponentEXT")) == NULL) || r; - r = ((glIsVariantEnabledEXT = (PFNGLISVARIANTENABLEDEXTPROC)glewGetProcAddress((const GLubyte*)"glIsVariantEnabledEXT")) == NULL) || r; - r = ((glSetInvariantEXT = (PFNGLSETINVARIANTEXTPROC)glewGetProcAddress((const GLubyte*)"glSetInvariantEXT")) == NULL) || r; - r = ((glSetLocalConstantEXT = (PFNGLSETLOCALCONSTANTEXTPROC)glewGetProcAddress((const GLubyte*)"glSetLocalConstantEXT")) == NULL) || r; - r = ((glShaderOp1EXT = (PFNGLSHADEROP1EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp1EXT")) == NULL) || r; - r = ((glShaderOp2EXT = (PFNGLSHADEROP2EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp2EXT")) == NULL) || r; - r = ((glShaderOp3EXT = (PFNGLSHADEROP3EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp3EXT")) == NULL) || r; - r = ((glSwizzleEXT = (PFNGLSWIZZLEEXTPROC)glewGetProcAddress((const GLubyte*)"glSwizzleEXT")) == NULL) || r; - r = ((glVariantPointerEXT = (PFNGLVARIANTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVariantPointerEXT")) == NULL) || r; - r = ((glVariantbvEXT = (PFNGLVARIANTBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantbvEXT")) == NULL) || r; - r = ((glVariantdvEXT = (PFNGLVARIANTDVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantdvEXT")) == NULL) || r; - r = ((glVariantfvEXT = (PFNGLVARIANTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantfvEXT")) == NULL) || r; - r = ((glVariantivEXT = (PFNGLVARIANTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantivEXT")) == NULL) || r; - r = ((glVariantsvEXT = (PFNGLVARIANTSVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantsvEXT")) == NULL) || r; - r = ((glVariantubvEXT = (PFNGLVARIANTUBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantubvEXT")) == NULL) || r; - r = ((glVariantuivEXT = (PFNGLVARIANTUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantuivEXT")) == NULL) || r; - r = ((glVariantusvEXT = (PFNGLVARIANTUSVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantusvEXT")) == NULL) || r; - r = ((glWriteMaskEXT = (PFNGLWRITEMASKEXTPROC)glewGetProcAddress((const GLubyte*)"glWriteMaskEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_vertex_shader */ - -#ifdef GL_EXT_vertex_weighting - -static GLboolean _glewInit_GL_EXT_vertex_weighting () -{ - GLboolean r = GL_FALSE; - - r = ((glVertexWeightPointerEXT = (PFNGLVERTEXWEIGHTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightPointerEXT")) == NULL) || r; - r = ((glVertexWeightfEXT = (PFNGLVERTEXWEIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightfEXT")) == NULL) || r; - r = ((glVertexWeightfvEXT = (PFNGLVERTEXWEIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightfvEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_vertex_weighting */ - -#ifdef GL_EXT_win32_keyed_mutex - -static GLboolean _glewInit_GL_EXT_win32_keyed_mutex () -{ - GLboolean r = GL_FALSE; - - r = ((glAcquireKeyedMutexWin32EXT = (PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC)glewGetProcAddress((const GLubyte*)"glAcquireKeyedMutexWin32EXT")) == NULL) || r; - r = ((glReleaseKeyedMutexWin32EXT = (PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC)glewGetProcAddress((const GLubyte*)"glReleaseKeyedMutexWin32EXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_win32_keyed_mutex */ - -#ifdef GL_EXT_window_rectangles - -static GLboolean _glewInit_GL_EXT_window_rectangles () -{ - GLboolean r = GL_FALSE; - - r = ((glWindowRectanglesEXT = (PFNGLWINDOWRECTANGLESEXTPROC)glewGetProcAddress((const GLubyte*)"glWindowRectanglesEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_window_rectangles */ - -#ifdef GL_EXT_x11_sync_object - -static GLboolean _glewInit_GL_EXT_x11_sync_object () -{ - GLboolean r = GL_FALSE; - - r = ((glImportSyncEXT = (PFNGLIMPORTSYNCEXTPROC)glewGetProcAddress((const GLubyte*)"glImportSyncEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_x11_sync_object */ - -#ifdef GL_GREMEDY_frame_terminator - -static GLboolean _glewInit_GL_GREMEDY_frame_terminator () -{ - GLboolean r = GL_FALSE; - - r = ((glFrameTerminatorGREMEDY = (PFNGLFRAMETERMINATORGREMEDYPROC)glewGetProcAddress((const GLubyte*)"glFrameTerminatorGREMEDY")) == NULL) || r; - - return r; -} - -#endif /* GL_GREMEDY_frame_terminator */ - -#ifdef GL_GREMEDY_string_marker - -static GLboolean _glewInit_GL_GREMEDY_string_marker () -{ - GLboolean r = GL_FALSE; - - r = ((glStringMarkerGREMEDY = (PFNGLSTRINGMARKERGREMEDYPROC)glewGetProcAddress((const GLubyte*)"glStringMarkerGREMEDY")) == NULL) || r; - - return r; -} - -#endif /* GL_GREMEDY_string_marker */ - -#ifdef GL_HP_image_transform - -static GLboolean _glewInit_GL_HP_image_transform () -{ - GLboolean r = GL_FALSE; - - r = ((glGetImageTransformParameterfvHP = (PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)"glGetImageTransformParameterfvHP")) == NULL) || r; - r = ((glGetImageTransformParameterivHP = (PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)"glGetImageTransformParameterivHP")) == NULL) || r; - r = ((glImageTransformParameterfHP = (PFNGLIMAGETRANSFORMPARAMETERFHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterfHP")) == NULL) || r; - r = ((glImageTransformParameterfvHP = (PFNGLIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterfvHP")) == NULL) || r; - r = ((glImageTransformParameteriHP = (PFNGLIMAGETRANSFORMPARAMETERIHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameteriHP")) == NULL) || r; - r = ((glImageTransformParameterivHP = (PFNGLIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterivHP")) == NULL) || r; - - return r; -} - -#endif /* GL_HP_image_transform */ - -#ifdef GL_IBM_multimode_draw_arrays - -static GLboolean _glewInit_GL_IBM_multimode_draw_arrays () -{ - GLboolean r = GL_FALSE; - - r = ((glMultiModeDrawArraysIBM = (PFNGLMULTIMODEDRAWARRAYSIBMPROC)glewGetProcAddress((const GLubyte*)"glMultiModeDrawArraysIBM")) == NULL) || r; - r = ((glMultiModeDrawElementsIBM = (PFNGLMULTIMODEDRAWELEMENTSIBMPROC)glewGetProcAddress((const GLubyte*)"glMultiModeDrawElementsIBM")) == NULL) || r; - - return r; -} - -#endif /* GL_IBM_multimode_draw_arrays */ - -#ifdef GL_IBM_vertex_array_lists - -static GLboolean _glewInit_GL_IBM_vertex_array_lists () -{ - GLboolean r = GL_FALSE; - - r = ((glColorPointerListIBM = (PFNGLCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glColorPointerListIBM")) == NULL) || r; - r = ((glEdgeFlagPointerListIBM = (PFNGLEDGEFLAGPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagPointerListIBM")) == NULL) || r; - r = ((glFogCoordPointerListIBM = (PFNGLFOGCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointerListIBM")) == NULL) || r; - r = ((glIndexPointerListIBM = (PFNGLINDEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glIndexPointerListIBM")) == NULL) || r; - r = ((glNormalPointerListIBM = (PFNGLNORMALPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glNormalPointerListIBM")) == NULL) || r; - r = ((glSecondaryColorPointerListIBM = (PFNGLSECONDARYCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointerListIBM")) == NULL) || r; - r = ((glTexCoordPointerListIBM = (PFNGLTEXCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointerListIBM")) == NULL) || r; - r = ((glVertexPointerListIBM = (PFNGLVERTEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glVertexPointerListIBM")) == NULL) || r; - - return r; -} - -#endif /* GL_IBM_vertex_array_lists */ - -#ifdef GL_IMG_bindless_texture - -static GLboolean _glewInit_GL_IMG_bindless_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glGetTextureHandleIMG = (PFNGLGETTEXTUREHANDLEIMGPROC)glewGetProcAddress((const GLubyte*)"glGetTextureHandleIMG")) == NULL) || r; - r = ((glGetTextureSamplerHandleIMG = (PFNGLGETTEXTURESAMPLERHANDLEIMGPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSamplerHandleIMG")) == NULL) || r; - r = ((glProgramUniformHandleui64IMG = (PFNGLPROGRAMUNIFORMHANDLEUI64IMGPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64IMG")) == NULL) || r; - r = ((glProgramUniformHandleui64vIMG = (PFNGLPROGRAMUNIFORMHANDLEUI64VIMGPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64vIMG")) == NULL) || r; - r = ((glUniformHandleui64IMG = (PFNGLUNIFORMHANDLEUI64IMGPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64IMG")) == NULL) || r; - r = ((glUniformHandleui64vIMG = (PFNGLUNIFORMHANDLEUI64VIMGPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64vIMG")) == NULL) || r; - - return r; -} - -#endif /* GL_IMG_bindless_texture */ - -#ifdef GL_IMG_framebuffer_downsample - -static GLboolean _glewInit_GL_IMG_framebuffer_downsample () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferTexture2DDownsampleIMG = (PFNGLFRAMEBUFFERTEXTURE2DDOWNSAMPLEIMGPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2DDownsampleIMG")) == NULL) || r; - r = ((glFramebufferTextureLayerDownsampleIMG = (PFNGLFRAMEBUFFERTEXTURELAYERDOWNSAMPLEIMGPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerDownsampleIMG")) == NULL) || r; - - return r; -} - -#endif /* GL_IMG_framebuffer_downsample */ - -#ifdef GL_IMG_multisampled_render_to_texture - -static GLboolean _glewInit_GL_IMG_multisampled_render_to_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferTexture2DMultisampleIMG = (PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2DMultisampleIMG")) == NULL) || r; - r = ((glRenderbufferStorageMultisampleIMG = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleIMG")) == NULL) || r; - - return r; -} - -#endif /* GL_IMG_multisampled_render_to_texture */ - -#ifdef GL_INTEL_map_texture - -static GLboolean _glewInit_GL_INTEL_map_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glMapTexture2DINTEL = (PFNGLMAPTEXTURE2DINTELPROC)glewGetProcAddress((const GLubyte*)"glMapTexture2DINTEL")) == NULL) || r; - r = ((glSyncTextureINTEL = (PFNGLSYNCTEXTUREINTELPROC)glewGetProcAddress((const GLubyte*)"glSyncTextureINTEL")) == NULL) || r; - r = ((glUnmapTexture2DINTEL = (PFNGLUNMAPTEXTURE2DINTELPROC)glewGetProcAddress((const GLubyte*)"glUnmapTexture2DINTEL")) == NULL) || r; - - return r; -} - -#endif /* GL_INTEL_map_texture */ - -#ifdef GL_INTEL_parallel_arrays - -static GLboolean _glewInit_GL_INTEL_parallel_arrays () -{ - GLboolean r = GL_FALSE; - - r = ((glColorPointervINTEL = (PFNGLCOLORPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glColorPointervINTEL")) == NULL) || r; - r = ((glNormalPointervINTEL = (PFNGLNORMALPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glNormalPointervINTEL")) == NULL) || r; - r = ((glTexCoordPointervINTEL = (PFNGLTEXCOORDPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointervINTEL")) == NULL) || r; - r = ((glVertexPointervINTEL = (PFNGLVERTEXPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glVertexPointervINTEL")) == NULL) || r; - - return r; -} - -#endif /* GL_INTEL_parallel_arrays */ - -#ifdef GL_INTEL_performance_query - -static GLboolean _glewInit_GL_INTEL_performance_query () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginPerfQueryINTEL = (PFNGLBEGINPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glBeginPerfQueryINTEL")) == NULL) || r; - r = ((glCreatePerfQueryINTEL = (PFNGLCREATEPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glCreatePerfQueryINTEL")) == NULL) || r; - r = ((glDeletePerfQueryINTEL = (PFNGLDELETEPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glDeletePerfQueryINTEL")) == NULL) || r; - r = ((glEndPerfQueryINTEL = (PFNGLENDPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glEndPerfQueryINTEL")) == NULL) || r; - r = ((glGetFirstPerfQueryIdINTEL = (PFNGLGETFIRSTPERFQUERYIDINTELPROC)glewGetProcAddress((const GLubyte*)"glGetFirstPerfQueryIdINTEL")) == NULL) || r; - r = ((glGetNextPerfQueryIdINTEL = (PFNGLGETNEXTPERFQUERYIDINTELPROC)glewGetProcAddress((const GLubyte*)"glGetNextPerfQueryIdINTEL")) == NULL) || r; - r = ((glGetPerfCounterInfoINTEL = (PFNGLGETPERFCOUNTERINFOINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfCounterInfoINTEL")) == NULL) || r; - r = ((glGetPerfQueryDataINTEL = (PFNGLGETPERFQUERYDATAINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryDataINTEL")) == NULL) || r; - r = ((glGetPerfQueryIdByNameINTEL = (PFNGLGETPERFQUERYIDBYNAMEINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryIdByNameINTEL")) == NULL) || r; - r = ((glGetPerfQueryInfoINTEL = (PFNGLGETPERFQUERYINFOINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryInfoINTEL")) == NULL) || r; - - return r; -} - -#endif /* GL_INTEL_performance_query */ - -#ifdef GL_INTEL_texture_scissor - -static GLboolean _glewInit_GL_INTEL_texture_scissor () -{ - GLboolean r = GL_FALSE; - - r = ((glTexScissorFuncINTEL = (PFNGLTEXSCISSORFUNCINTELPROC)glewGetProcAddress((const GLubyte*)"glTexScissorFuncINTEL")) == NULL) || r; - r = ((glTexScissorINTEL = (PFNGLTEXSCISSORINTELPROC)glewGetProcAddress((const GLubyte*)"glTexScissorINTEL")) == NULL) || r; - - return r; -} - -#endif /* GL_INTEL_texture_scissor */ - -#ifdef GL_KHR_blend_equation_advanced - -static GLboolean _glewInit_GL_KHR_blend_equation_advanced () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendBarrierKHR = (PFNGLBLENDBARRIERKHRPROC)glewGetProcAddress((const GLubyte*)"glBlendBarrierKHR")) == NULL) || r; - - return r; -} - -#endif /* GL_KHR_blend_equation_advanced */ - -#ifdef GL_KHR_debug - -static GLboolean _glewInit_GL_KHR_debug () -{ - GLboolean r = GL_FALSE; - - r = ((glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallback")) == NULL) || r; - r = ((glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageControl")) == NULL) || r; - r = ((glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsert")) == NULL) || r; - r = ((glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLog")) == NULL) || r; - r = ((glGetObjectLabel = (PFNGLGETOBJECTLABELPROC)glewGetProcAddress((const GLubyte*)"glGetObjectLabel")) == NULL) || r; - r = ((glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC)glewGetProcAddress((const GLubyte*)"glGetObjectPtrLabel")) == NULL) || r; - r = ((glObjectLabel = (PFNGLOBJECTLABELPROC)glewGetProcAddress((const GLubyte*)"glObjectLabel")) == NULL) || r; - r = ((glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC)glewGetProcAddress((const GLubyte*)"glObjectPtrLabel")) == NULL) || r; - r = ((glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC)glewGetProcAddress((const GLubyte*)"glPopDebugGroup")) == NULL) || r; - r = ((glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC)glewGetProcAddress((const GLubyte*)"glPushDebugGroup")) == NULL) || r; - - return r; -} - -#endif /* GL_KHR_debug */ - -#ifdef GL_KHR_parallel_shader_compile - -static GLboolean _glewInit_GL_KHR_parallel_shader_compile () -{ - GLboolean r = GL_FALSE; - - r = ((glMaxShaderCompilerThreadsKHR = (PFNGLMAXSHADERCOMPILERTHREADSKHRPROC)glewGetProcAddress((const GLubyte*)"glMaxShaderCompilerThreadsKHR")) == NULL) || r; - - return r; -} - -#endif /* GL_KHR_parallel_shader_compile */ - -#ifdef GL_KHR_robustness - -static GLboolean _glewInit_GL_KHR_robustness () -{ - GLboolean r = GL_FALSE; - - r = ((glGetnUniformfv = (PFNGLGETNUNIFORMFVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformfv")) == NULL) || r; - r = ((glGetnUniformiv = (PFNGLGETNUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformiv")) == NULL) || r; - r = ((glGetnUniformuiv = (PFNGLGETNUNIFORMUIVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformuiv")) == NULL) || r; - r = ((glReadnPixels = (PFNGLREADNPIXELSPROC)glewGetProcAddress((const GLubyte*)"glReadnPixels")) == NULL) || r; - - return r; -} - -#endif /* GL_KHR_robustness */ - -#ifdef GL_KTX_buffer_region - -static GLboolean _glewInit_GL_KTX_buffer_region () -{ - GLboolean r = GL_FALSE; - - r = ((glBufferRegionEnabled = (PFNGLBUFFERREGIONENABLEDPROC)glewGetProcAddress((const GLubyte*)"glBufferRegionEnabled")) == NULL) || r; - r = ((glDeleteBufferRegion = (PFNGLDELETEBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glDeleteBufferRegion")) == NULL) || r; - r = ((glDrawBufferRegion = (PFNGLDRAWBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glDrawBufferRegion")) == NULL) || r; - r = ((glNewBufferRegion = (PFNGLNEWBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glNewBufferRegion")) == NULL) || r; - r = ((glReadBufferRegion = (PFNGLREADBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glReadBufferRegion")) == NULL) || r; - - return r; -} - -#endif /* GL_KTX_buffer_region */ - -#ifdef GL_MESA_framebuffer_flip_y - -static GLboolean _glewInit_GL_MESA_framebuffer_flip_y () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferParameteriMESA = (PFNGLFRAMEBUFFERPARAMETERIMESAPROC)glewGetProcAddress((const GLubyte*)"glFramebufferParameteriMESA")) == NULL) || r; - r = ((glGetFramebufferParameterivMESA = (PFNGLGETFRAMEBUFFERPARAMETERIVMESAPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameterivMESA")) == NULL) || r; - - return r; -} - -#endif /* GL_MESA_framebuffer_flip_y */ - -#ifdef GL_MESA_resize_buffers - -static GLboolean _glewInit_GL_MESA_resize_buffers () -{ - GLboolean r = GL_FALSE; - - r = ((glResizeBuffersMESA = (PFNGLRESIZEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)"glResizeBuffersMESA")) == NULL) || r; - - return r; -} - -#endif /* GL_MESA_resize_buffers */ - -#ifdef GL_MESA_window_pos - -static GLboolean _glewInit_GL_MESA_window_pos () -{ - GLboolean r = GL_FALSE; - - r = ((glWindowPos2dMESA = (PFNGLWINDOWPOS2DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dMESA")) == NULL) || r; - r = ((glWindowPos2dvMESA = (PFNGLWINDOWPOS2DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dvMESA")) == NULL) || r; - r = ((glWindowPos2fMESA = (PFNGLWINDOWPOS2FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fMESA")) == NULL) || r; - r = ((glWindowPos2fvMESA = (PFNGLWINDOWPOS2FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fvMESA")) == NULL) || r; - r = ((glWindowPos2iMESA = (PFNGLWINDOWPOS2IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iMESA")) == NULL) || r; - r = ((glWindowPos2ivMESA = (PFNGLWINDOWPOS2IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2ivMESA")) == NULL) || r; - r = ((glWindowPos2sMESA = (PFNGLWINDOWPOS2SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sMESA")) == NULL) || r; - r = ((glWindowPos2svMESA = (PFNGLWINDOWPOS2SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2svMESA")) == NULL) || r; - r = ((glWindowPos3dMESA = (PFNGLWINDOWPOS3DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dMESA")) == NULL) || r; - r = ((glWindowPos3dvMESA = (PFNGLWINDOWPOS3DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dvMESA")) == NULL) || r; - r = ((glWindowPos3fMESA = (PFNGLWINDOWPOS3FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fMESA")) == NULL) || r; - r = ((glWindowPos3fvMESA = (PFNGLWINDOWPOS3FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fvMESA")) == NULL) || r; - r = ((glWindowPos3iMESA = (PFNGLWINDOWPOS3IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iMESA")) == NULL) || r; - r = ((glWindowPos3ivMESA = (PFNGLWINDOWPOS3IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3ivMESA")) == NULL) || r; - r = ((glWindowPos3sMESA = (PFNGLWINDOWPOS3SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sMESA")) == NULL) || r; - r = ((glWindowPos3svMESA = (PFNGLWINDOWPOS3SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3svMESA")) == NULL) || r; - r = ((glWindowPos4dMESA = (PFNGLWINDOWPOS4DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4dMESA")) == NULL) || r; - r = ((glWindowPos4dvMESA = (PFNGLWINDOWPOS4DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4dvMESA")) == NULL) || r; - r = ((glWindowPos4fMESA = (PFNGLWINDOWPOS4FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4fMESA")) == NULL) || r; - r = ((glWindowPos4fvMESA = (PFNGLWINDOWPOS4FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4fvMESA")) == NULL) || r; - r = ((glWindowPos4iMESA = (PFNGLWINDOWPOS4IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4iMESA")) == NULL) || r; - r = ((glWindowPos4ivMESA = (PFNGLWINDOWPOS4IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4ivMESA")) == NULL) || r; - r = ((glWindowPos4sMESA = (PFNGLWINDOWPOS4SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4sMESA")) == NULL) || r; - r = ((glWindowPos4svMESA = (PFNGLWINDOWPOS4SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4svMESA")) == NULL) || r; - - return r; -} - -#endif /* GL_MESA_window_pos */ - -#ifdef GL_NVX_conditional_render - -static GLboolean _glewInit_GL_NVX_conditional_render () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginConditionalRenderNVX = (PFNGLBEGINCONDITIONALRENDERNVXPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRenderNVX")) == NULL) || r; - r = ((glEndConditionalRenderNVX = (PFNGLENDCONDITIONALRENDERNVXPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRenderNVX")) == NULL) || r; - - return r; -} - -#endif /* GL_NVX_conditional_render */ - -#ifdef GL_NVX_gpu_multicast2 - -static GLboolean _glewInit_GL_NVX_gpu_multicast2 () -{ - GLboolean r = GL_FALSE; - - r = ((glAsyncCopyBufferSubDataNVX = (PFNGLASYNCCOPYBUFFERSUBDATANVXPROC)glewGetProcAddress((const GLubyte*)"glAsyncCopyBufferSubDataNVX")) == NULL) || r; - r = ((glAsyncCopyImageSubDataNVX = (PFNGLASYNCCOPYIMAGESUBDATANVXPROC)glewGetProcAddress((const GLubyte*)"glAsyncCopyImageSubDataNVX")) == NULL) || r; - r = ((glMulticastScissorArrayvNVX = (PFNGLMULTICASTSCISSORARRAYVNVXPROC)glewGetProcAddress((const GLubyte*)"glMulticastScissorArrayvNVX")) == NULL) || r; - r = ((glMulticastViewportArrayvNVX = (PFNGLMULTICASTVIEWPORTARRAYVNVXPROC)glewGetProcAddress((const GLubyte*)"glMulticastViewportArrayvNVX")) == NULL) || r; - r = ((glMulticastViewportPositionWScaleNVX = (PFNGLMULTICASTVIEWPORTPOSITIONWSCALENVXPROC)glewGetProcAddress((const GLubyte*)"glMulticastViewportPositionWScaleNVX")) == NULL) || r; - r = ((glUploadGpuMaskNVX = (PFNGLUPLOADGPUMASKNVXPROC)glewGetProcAddress((const GLubyte*)"glUploadGpuMaskNVX")) == NULL) || r; - - return r; -} - -#endif /* GL_NVX_gpu_multicast2 */ - -#ifdef GL_NVX_linked_gpu_multicast - -static GLboolean _glewInit_GL_NVX_linked_gpu_multicast () -{ - GLboolean r = GL_FALSE; - - r = ((glLGPUCopyImageSubDataNVX = (PFNGLLGPUCOPYIMAGESUBDATANVXPROC)glewGetProcAddress((const GLubyte*)"glLGPUCopyImageSubDataNVX")) == NULL) || r; - r = ((glLGPUInterlockNVX = (PFNGLLGPUINTERLOCKNVXPROC)glewGetProcAddress((const GLubyte*)"glLGPUInterlockNVX")) == NULL) || r; - r = ((glLGPUNamedBufferSubDataNVX = (PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC)glewGetProcAddress((const GLubyte*)"glLGPUNamedBufferSubDataNVX")) == NULL) || r; - - return r; -} - -#endif /* GL_NVX_linked_gpu_multicast */ - -#ifdef GL_NVX_progress_fence - -static GLboolean _glewInit_GL_NVX_progress_fence () -{ - GLboolean r = GL_FALSE; - - r = ((glClientWaitSemaphoreui64NVX = (PFNGLCLIENTWAITSEMAPHOREUI64NVXPROC)glewGetProcAddress((const GLubyte*)"glClientWaitSemaphoreui64NVX")) == NULL) || r; - r = ((glSignalSemaphoreui64NVX = (PFNGLSIGNALSEMAPHOREUI64NVXPROC)glewGetProcAddress((const GLubyte*)"glSignalSemaphoreui64NVX")) == NULL) || r; - r = ((glWaitSemaphoreui64NVX = (PFNGLWAITSEMAPHOREUI64NVXPROC)glewGetProcAddress((const GLubyte*)"glWaitSemaphoreui64NVX")) == NULL) || r; - - return r; -} - -#endif /* GL_NVX_progress_fence */ - -#ifdef GL_NV_3dvision_settings - -static GLboolean _glewInit_GL_NV_3dvision_settings () -{ - GLboolean r = GL_FALSE; - - r = ((glStereoParameterfNV = (PFNGLSTEREOPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glStereoParameterfNV")) == NULL) || r; - r = ((glStereoParameteriNV = (PFNGLSTEREOPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glStereoParameteriNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_3dvision_settings */ - -#ifdef GL_NV_alpha_to_coverage_dither_control - -static GLboolean _glewInit_GL_NV_alpha_to_coverage_dither_control () -{ - GLboolean r = GL_FALSE; - - r = ((glAlphaToCoverageDitherControlNV = (PFNGLALPHATOCOVERAGEDITHERCONTROLNVPROC)glewGetProcAddress((const GLubyte*)"glAlphaToCoverageDitherControlNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_alpha_to_coverage_dither_control */ - -#ifdef GL_NV_bindless_multi_draw_indirect - -static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect () -{ - GLboolean r = GL_FALSE; - - r = ((glMultiDrawArraysIndirectBindlessNV = (PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectBindlessNV")) == NULL) || r; - r = ((glMultiDrawElementsIndirectBindlessNV = (PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectBindlessNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_bindless_multi_draw_indirect */ - -#ifdef GL_NV_bindless_multi_draw_indirect_count - -static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect_count () -{ - GLboolean r = GL_FALSE; - - r = ((glMultiDrawArraysIndirectBindlessCountNV = (PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectBindlessCountNV")) == NULL) || r; - r = ((glMultiDrawElementsIndirectBindlessCountNV = (PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectBindlessCountNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_bindless_multi_draw_indirect_count */ - -#ifdef GL_NV_bindless_texture - -static GLboolean _glewInit_GL_NV_bindless_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glGetImageHandleNV = (PFNGLGETIMAGEHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetImageHandleNV")) == NULL) || r; - r = ((glGetTextureHandleNV = (PFNGLGETTEXTUREHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureHandleNV")) == NULL) || r; - r = ((glGetTextureSamplerHandleNV = (PFNGLGETTEXTURESAMPLERHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSamplerHandleNV")) == NULL) || r; - r = ((glIsImageHandleResidentNV = (PFNGLISIMAGEHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsImageHandleResidentNV")) == NULL) || r; - r = ((glIsTextureHandleResidentNV = (PFNGLISTEXTUREHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsTextureHandleResidentNV")) == NULL) || r; - r = ((glMakeImageHandleNonResidentNV = (PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleNonResidentNV")) == NULL) || r; - r = ((glMakeImageHandleResidentNV = (PFNGLMAKEIMAGEHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleResidentNV")) == NULL) || r; - r = ((glMakeTextureHandleNonResidentNV = (PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleNonResidentNV")) == NULL) || r; - r = ((glMakeTextureHandleResidentNV = (PFNGLMAKETEXTUREHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleResidentNV")) == NULL) || r; - r = ((glProgramUniformHandleui64NV = (PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64NV")) == NULL) || r; - r = ((glProgramUniformHandleui64vNV = (PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64vNV")) == NULL) || r; - r = ((glUniformHandleui64NV = (PFNGLUNIFORMHANDLEUI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64NV")) == NULL) || r; - r = ((glUniformHandleui64vNV = (PFNGLUNIFORMHANDLEUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64vNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_bindless_texture */ - -#ifdef GL_NV_blend_equation_advanced - -static GLboolean _glewInit_GL_NV_blend_equation_advanced () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendBarrierNV = (PFNGLBLENDBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glBlendBarrierNV")) == NULL) || r; - r = ((glBlendParameteriNV = (PFNGLBLENDPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glBlendParameteriNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_blend_equation_advanced */ - -#ifdef GL_NV_clip_space_w_scaling - -static GLboolean _glewInit_GL_NV_clip_space_w_scaling () -{ - GLboolean r = GL_FALSE; - - r = ((glViewportPositionWScaleNV = (PFNGLVIEWPORTPOSITIONWSCALENVPROC)glewGetProcAddress((const GLubyte*)"glViewportPositionWScaleNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_clip_space_w_scaling */ - -#ifdef GL_NV_command_list - -static GLboolean _glewInit_GL_NV_command_list () -{ - GLboolean r = GL_FALSE; - - r = ((glCallCommandListNV = (PFNGLCALLCOMMANDLISTNVPROC)glewGetProcAddress((const GLubyte*)"glCallCommandListNV")) == NULL) || r; - r = ((glCommandListSegmentsNV = (PFNGLCOMMANDLISTSEGMENTSNVPROC)glewGetProcAddress((const GLubyte*)"glCommandListSegmentsNV")) == NULL) || r; - r = ((glCompileCommandListNV = (PFNGLCOMPILECOMMANDLISTNVPROC)glewGetProcAddress((const GLubyte*)"glCompileCommandListNV")) == NULL) || r; - r = ((glCreateCommandListsNV = (PFNGLCREATECOMMANDLISTSNVPROC)glewGetProcAddress((const GLubyte*)"glCreateCommandListsNV")) == NULL) || r; - r = ((glCreateStatesNV = (PFNGLCREATESTATESNVPROC)glewGetProcAddress((const GLubyte*)"glCreateStatesNV")) == NULL) || r; - r = ((glDeleteCommandListsNV = (PFNGLDELETECOMMANDLISTSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteCommandListsNV")) == NULL) || r; - r = ((glDeleteStatesNV = (PFNGLDELETESTATESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteStatesNV")) == NULL) || r; - r = ((glDrawCommandsAddressNV = (PFNGLDRAWCOMMANDSADDRESSNVPROC)glewGetProcAddress((const GLubyte*)"glDrawCommandsAddressNV")) == NULL) || r; - r = ((glDrawCommandsNV = (PFNGLDRAWCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glDrawCommandsNV")) == NULL) || r; - r = ((glDrawCommandsStatesAddressNV = (PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC)glewGetProcAddress((const GLubyte*)"glDrawCommandsStatesAddressNV")) == NULL) || r; - r = ((glDrawCommandsStatesNV = (PFNGLDRAWCOMMANDSSTATESNVPROC)glewGetProcAddress((const GLubyte*)"glDrawCommandsStatesNV")) == NULL) || r; - r = ((glGetCommandHeaderNV = (PFNGLGETCOMMANDHEADERNVPROC)glewGetProcAddress((const GLubyte*)"glGetCommandHeaderNV")) == NULL) || r; - r = ((glGetStageIndexNV = (PFNGLGETSTAGEINDEXNVPROC)glewGetProcAddress((const GLubyte*)"glGetStageIndexNV")) == NULL) || r; - r = ((glIsCommandListNV = (PFNGLISCOMMANDLISTNVPROC)glewGetProcAddress((const GLubyte*)"glIsCommandListNV")) == NULL) || r; - r = ((glIsStateNV = (PFNGLISSTATENVPROC)glewGetProcAddress((const GLubyte*)"glIsStateNV")) == NULL) || r; - r = ((glListDrawCommandsStatesClientNV = (PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC)glewGetProcAddress((const GLubyte*)"glListDrawCommandsStatesClientNV")) == NULL) || r; - r = ((glStateCaptureNV = (PFNGLSTATECAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glStateCaptureNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_command_list */ - -#ifdef GL_NV_conditional_render - -static GLboolean _glewInit_GL_NV_conditional_render () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginConditionalRenderNV = (PFNGLBEGINCONDITIONALRENDERNVPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRenderNV")) == NULL) || r; - r = ((glEndConditionalRenderNV = (PFNGLENDCONDITIONALRENDERNVPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRenderNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_conditional_render */ - -#ifdef GL_NV_conservative_raster - -static GLboolean _glewInit_GL_NV_conservative_raster () -{ - GLboolean r = GL_FALSE; - - r = ((glSubpixelPrecisionBiasNV = (PFNGLSUBPIXELPRECISIONBIASNVPROC)glewGetProcAddress((const GLubyte*)"glSubpixelPrecisionBiasNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_conservative_raster */ - -#ifdef GL_NV_conservative_raster_dilate - -static GLboolean _glewInit_GL_NV_conservative_raster_dilate () -{ - GLboolean r = GL_FALSE; - - r = ((glConservativeRasterParameterfNV = (PFNGLCONSERVATIVERASTERPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glConservativeRasterParameterfNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_conservative_raster_dilate */ - -#ifdef GL_NV_conservative_raster_pre_snap_triangles - -static GLboolean _glewInit_GL_NV_conservative_raster_pre_snap_triangles () -{ - GLboolean r = GL_FALSE; - - r = ((glConservativeRasterParameteriNV = (PFNGLCONSERVATIVERASTERPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glConservativeRasterParameteriNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_conservative_raster_pre_snap_triangles */ - -#ifdef GL_NV_copy_buffer - -static GLboolean _glewInit_GL_NV_copy_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((glCopyBufferSubDataNV = (PFNGLCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glCopyBufferSubDataNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_copy_buffer */ - -#ifdef GL_NV_copy_image - -static GLboolean _glewInit_GL_NV_copy_image () -{ - GLboolean r = GL_FALSE; - - r = ((glCopyImageSubDataNV = (PFNGLCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubDataNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_copy_image */ - -#ifdef GL_NV_depth_buffer_float - -static GLboolean _glewInit_GL_NV_depth_buffer_float () -{ - GLboolean r = GL_FALSE; - - r = ((glClearDepthdNV = (PFNGLCLEARDEPTHDNVPROC)glewGetProcAddress((const GLubyte*)"glClearDepthdNV")) == NULL) || r; - r = ((glDepthBoundsdNV = (PFNGLDEPTHBOUNDSDNVPROC)glewGetProcAddress((const GLubyte*)"glDepthBoundsdNV")) == NULL) || r; - r = ((glDepthRangedNV = (PFNGLDEPTHRANGEDNVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangedNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_depth_buffer_float */ - -#ifdef GL_NV_draw_buffers - -static GLboolean _glewInit_GL_NV_draw_buffers () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawBuffersNV = (PFNGLDRAWBUFFERSNVPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_draw_buffers */ - -#ifdef GL_NV_draw_instanced - -static GLboolean _glewInit_GL_NV_draw_instanced () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawArraysInstancedNV = (PFNGLDRAWARRAYSINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedNV")) == NULL) || r; - r = ((glDrawElementsInstancedNV = (PFNGLDRAWELEMENTSINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_draw_instanced */ - -#ifdef GL_NV_draw_texture - -static GLboolean _glewInit_GL_NV_draw_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawTextureNV = (PFNGLDRAWTEXTURENVPROC)glewGetProcAddress((const GLubyte*)"glDrawTextureNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_draw_texture */ - -#ifdef GL_NV_draw_vulkan_image - -static GLboolean _glewInit_GL_NV_draw_vulkan_image () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawVkImageNV = (PFNGLDRAWVKIMAGENVPROC)glewGetProcAddress((const GLubyte*)"glDrawVkImageNV")) == NULL) || r; - r = ((glGetVkProcAddrNV = (PFNGLGETVKPROCADDRNVPROC)glewGetProcAddress((const GLubyte*)"glGetVkProcAddrNV")) == NULL) || r; - r = ((glSignalVkFenceNV = (PFNGLSIGNALVKFENCENVPROC)glewGetProcAddress((const GLubyte*)"glSignalVkFenceNV")) == NULL) || r; - r = ((glSignalVkSemaphoreNV = (PFNGLSIGNALVKSEMAPHORENVPROC)glewGetProcAddress((const GLubyte*)"glSignalVkSemaphoreNV")) == NULL) || r; - r = ((glWaitVkSemaphoreNV = (PFNGLWAITVKSEMAPHORENVPROC)glewGetProcAddress((const GLubyte*)"glWaitVkSemaphoreNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_draw_vulkan_image */ - -#ifdef GL_NV_evaluators - -static GLboolean _glewInit_GL_NV_evaluators () -{ - GLboolean r = GL_FALSE; - - r = ((glEvalMapsNV = (PFNGLEVALMAPSNVPROC)glewGetProcAddress((const GLubyte*)"glEvalMapsNV")) == NULL) || r; - r = ((glGetMapAttribParameterfvNV = (PFNGLGETMAPATTRIBPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapAttribParameterfvNV")) == NULL) || r; - r = ((glGetMapAttribParameterivNV = (PFNGLGETMAPATTRIBPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapAttribParameterivNV")) == NULL) || r; - r = ((glGetMapControlPointsNV = (PFNGLGETMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapControlPointsNV")) == NULL) || r; - r = ((glGetMapParameterfvNV = (PFNGLGETMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapParameterfvNV")) == NULL) || r; - r = ((glGetMapParameterivNV = (PFNGLGETMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapParameterivNV")) == NULL) || r; - r = ((glMapControlPointsNV = (PFNGLMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)"glMapControlPointsNV")) == NULL) || r; - r = ((glMapParameterfvNV = (PFNGLMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glMapParameterfvNV")) == NULL) || r; - r = ((glMapParameterivNV = (PFNGLMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glMapParameterivNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_evaluators */ - -#ifdef GL_NV_explicit_multisample - -static GLboolean _glewInit_GL_NV_explicit_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glGetMultisamplefvNV = (PFNGLGETMULTISAMPLEFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMultisamplefvNV")) == NULL) || r; - r = ((glSampleMaskIndexedNV = (PFNGLSAMPLEMASKINDEXEDNVPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskIndexedNV")) == NULL) || r; - r = ((glTexRenderbufferNV = (PFNGLTEXRENDERBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glTexRenderbufferNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_explicit_multisample */ - -#ifdef GL_NV_fence - -static GLboolean _glewInit_GL_NV_fence () -{ - GLboolean r = GL_FALSE; - - r = ((glDeleteFencesNV = (PFNGLDELETEFENCESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteFencesNV")) == NULL) || r; - r = ((glFinishFenceNV = (PFNGLFINISHFENCENVPROC)glewGetProcAddress((const GLubyte*)"glFinishFenceNV")) == NULL) || r; - r = ((glGenFencesNV = (PFNGLGENFENCESNVPROC)glewGetProcAddress((const GLubyte*)"glGenFencesNV")) == NULL) || r; - r = ((glGetFenceivNV = (PFNGLGETFENCEIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFenceivNV")) == NULL) || r; - r = ((glIsFenceNV = (PFNGLISFENCENVPROC)glewGetProcAddress((const GLubyte*)"glIsFenceNV")) == NULL) || r; - r = ((glSetFenceNV = (PFNGLSETFENCENVPROC)glewGetProcAddress((const GLubyte*)"glSetFenceNV")) == NULL) || r; - r = ((glTestFenceNV = (PFNGLTESTFENCENVPROC)glewGetProcAddress((const GLubyte*)"glTestFenceNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_fence */ - -#ifdef GL_NV_fragment_coverage_to_color - -static GLboolean _glewInit_GL_NV_fragment_coverage_to_color () -{ - GLboolean r = GL_FALSE; - - r = ((glFragmentCoverageColorNV = (PFNGLFRAGMENTCOVERAGECOLORNVPROC)glewGetProcAddress((const GLubyte*)"glFragmentCoverageColorNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_fragment_coverage_to_color */ - -#ifdef GL_NV_fragment_program - -static GLboolean _glewInit_GL_NV_fragment_program () -{ - GLboolean r = GL_FALSE; - - r = ((glGetProgramNamedParameterdvNV = (PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramNamedParameterdvNV")) == NULL) || r; - r = ((glGetProgramNamedParameterfvNV = (PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramNamedParameterfvNV")) == NULL) || r; - r = ((glProgramNamedParameter4dNV = (PFNGLPROGRAMNAMEDPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4dNV")) == NULL) || r; - r = ((glProgramNamedParameter4dvNV = (PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4dvNV")) == NULL) || r; - r = ((glProgramNamedParameter4fNV = (PFNGLPROGRAMNAMEDPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4fNV")) == NULL) || r; - r = ((glProgramNamedParameter4fvNV = (PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4fvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_fragment_program */ - -#ifdef GL_NV_framebuffer_blit - -static GLboolean _glewInit_GL_NV_framebuffer_blit () -{ - GLboolean r = GL_FALSE; - - r = ((glBlitFramebufferNV = (PFNGLBLITFRAMEBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_framebuffer_blit */ - -#ifdef GL_NV_framebuffer_multisample - -static GLboolean _glewInit_GL_NV_framebuffer_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glRenderbufferStorageMultisampleNV = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_framebuffer_multisample */ - -#ifdef GL_NV_framebuffer_multisample_coverage - -static GLboolean _glewInit_GL_NV_framebuffer_multisample_coverage () -{ - GLboolean r = GL_FALSE; - - r = ((glRenderbufferStorageMultisampleCoverageNV = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleCoverageNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_framebuffer_multisample_coverage */ - -#ifdef GL_NV_geometry_program4 - -static GLboolean _glewInit_GL_NV_geometry_program4 () -{ - GLboolean r = GL_FALSE; - - r = ((glProgramVertexLimitNV = (PFNGLPROGRAMVERTEXLIMITNVPROC)glewGetProcAddress((const GLubyte*)"glProgramVertexLimitNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_geometry_program4 */ - -#ifdef GL_NV_gpu_multicast - -static GLboolean _glewInit_GL_NV_gpu_multicast () -{ - GLboolean r = GL_FALSE; - - r = ((glMulticastBarrierNV = (PFNGLMULTICASTBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastBarrierNV")) == NULL) || r; - r = ((glMulticastBlitFramebufferNV = (PFNGLMULTICASTBLITFRAMEBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastBlitFramebufferNV")) == NULL) || r; - r = ((glMulticastBufferSubDataNV = (PFNGLMULTICASTBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glMulticastBufferSubDataNV")) == NULL) || r; - r = ((glMulticastCopyBufferSubDataNV = (PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glMulticastCopyBufferSubDataNV")) == NULL) || r; - r = ((glMulticastCopyImageSubDataNV = (PFNGLMULTICASTCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glMulticastCopyImageSubDataNV")) == NULL) || r; - r = ((glMulticastFramebufferSampleLocationsfvNV = (PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastFramebufferSampleLocationsfvNV")) == NULL) || r; - r = ((glMulticastGetQueryObjecti64vNV = (PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastGetQueryObjecti64vNV")) == NULL) || r; - r = ((glMulticastGetQueryObjectivNV = (PFNGLMULTICASTGETQUERYOBJECTIVNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastGetQueryObjectivNV")) == NULL) || r; - r = ((glMulticastGetQueryObjectui64vNV = (PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastGetQueryObjectui64vNV")) == NULL) || r; - r = ((glMulticastGetQueryObjectuivNV = (PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastGetQueryObjectuivNV")) == NULL) || r; - r = ((glMulticastWaitSyncNV = (PFNGLMULTICASTWAITSYNCNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastWaitSyncNV")) == NULL) || r; - r = ((glRenderGpuMaskNV = (PFNGLRENDERGPUMASKNVPROC)glewGetProcAddress((const GLubyte*)"glRenderGpuMaskNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_gpu_multicast */ - -#ifdef GL_NV_gpu_program4 - -static GLboolean _glewInit_GL_NV_gpu_program4 () -{ - GLboolean r = GL_FALSE; - - r = ((glProgramEnvParameterI4iNV = (PFNGLPROGRAMENVPARAMETERI4INVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4iNV")) == NULL) || r; - r = ((glProgramEnvParameterI4ivNV = (PFNGLPROGRAMENVPARAMETERI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4ivNV")) == NULL) || r; - r = ((glProgramEnvParameterI4uiNV = (PFNGLPROGRAMENVPARAMETERI4UINVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4uiNV")) == NULL) || r; - r = ((glProgramEnvParameterI4uivNV = (PFNGLPROGRAMENVPARAMETERI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4uivNV")) == NULL) || r; - r = ((glProgramEnvParametersI4ivNV = (PFNGLPROGRAMENVPARAMETERSI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParametersI4ivNV")) == NULL) || r; - r = ((glProgramEnvParametersI4uivNV = (PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParametersI4uivNV")) == NULL) || r; - r = ((glProgramLocalParameterI4iNV = (PFNGLPROGRAMLOCALPARAMETERI4INVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4iNV")) == NULL) || r; - r = ((glProgramLocalParameterI4ivNV = (PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4ivNV")) == NULL) || r; - r = ((glProgramLocalParameterI4uiNV = (PFNGLPROGRAMLOCALPARAMETERI4UINVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4uiNV")) == NULL) || r; - r = ((glProgramLocalParameterI4uivNV = (PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4uivNV")) == NULL) || r; - r = ((glProgramLocalParametersI4ivNV = (PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParametersI4ivNV")) == NULL) || r; - r = ((glProgramLocalParametersI4uivNV = (PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParametersI4uivNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_gpu_program4 */ - -#ifdef GL_NV_gpu_shader5 - -static GLboolean _glewInit_GL_NV_gpu_shader5 () -{ - GLboolean r = GL_FALSE; - - r = ((glGetUniformi64vNV = (PFNGLGETUNIFORMI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformi64vNV")) == NULL) || r; - r = ((glGetUniformui64vNV = (PFNGLGETUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformui64vNV")) == NULL) || r; - r = ((glProgramUniform1i64NV = (PFNGLPROGRAMUNIFORM1I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64NV")) == NULL) || r; - r = ((glProgramUniform1i64vNV = (PFNGLPROGRAMUNIFORM1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64vNV")) == NULL) || r; - r = ((glProgramUniform1ui64NV = (PFNGLPROGRAMUNIFORM1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64NV")) == NULL) || r; - r = ((glProgramUniform1ui64vNV = (PFNGLPROGRAMUNIFORM1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64vNV")) == NULL) || r; - r = ((glProgramUniform2i64NV = (PFNGLPROGRAMUNIFORM2I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64NV")) == NULL) || r; - r = ((glProgramUniform2i64vNV = (PFNGLPROGRAMUNIFORM2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64vNV")) == NULL) || r; - r = ((glProgramUniform2ui64NV = (PFNGLPROGRAMUNIFORM2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64NV")) == NULL) || r; - r = ((glProgramUniform2ui64vNV = (PFNGLPROGRAMUNIFORM2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64vNV")) == NULL) || r; - r = ((glProgramUniform3i64NV = (PFNGLPROGRAMUNIFORM3I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64NV")) == NULL) || r; - r = ((glProgramUniform3i64vNV = (PFNGLPROGRAMUNIFORM3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64vNV")) == NULL) || r; - r = ((glProgramUniform3ui64NV = (PFNGLPROGRAMUNIFORM3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64NV")) == NULL) || r; - r = ((glProgramUniform3ui64vNV = (PFNGLPROGRAMUNIFORM3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64vNV")) == NULL) || r; - r = ((glProgramUniform4i64NV = (PFNGLPROGRAMUNIFORM4I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64NV")) == NULL) || r; - r = ((glProgramUniform4i64vNV = (PFNGLPROGRAMUNIFORM4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64vNV")) == NULL) || r; - r = ((glProgramUniform4ui64NV = (PFNGLPROGRAMUNIFORM4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64NV")) == NULL) || r; - r = ((glProgramUniform4ui64vNV = (PFNGLPROGRAMUNIFORM4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64vNV")) == NULL) || r; - r = ((glUniform1i64NV = (PFNGLUNIFORM1I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64NV")) == NULL) || r; - r = ((glUniform1i64vNV = (PFNGLUNIFORM1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64vNV")) == NULL) || r; - r = ((glUniform1ui64NV = (PFNGLUNIFORM1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64NV")) == NULL) || r; - r = ((glUniform1ui64vNV = (PFNGLUNIFORM1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64vNV")) == NULL) || r; - r = ((glUniform2i64NV = (PFNGLUNIFORM2I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64NV")) == NULL) || r; - r = ((glUniform2i64vNV = (PFNGLUNIFORM2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64vNV")) == NULL) || r; - r = ((glUniform2ui64NV = (PFNGLUNIFORM2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64NV")) == NULL) || r; - r = ((glUniform2ui64vNV = (PFNGLUNIFORM2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64vNV")) == NULL) || r; - r = ((glUniform3i64NV = (PFNGLUNIFORM3I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64NV")) == NULL) || r; - r = ((glUniform3i64vNV = (PFNGLUNIFORM3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64vNV")) == NULL) || r; - r = ((glUniform3ui64NV = (PFNGLUNIFORM3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64NV")) == NULL) || r; - r = ((glUniform3ui64vNV = (PFNGLUNIFORM3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64vNV")) == NULL) || r; - r = ((glUniform4i64NV = (PFNGLUNIFORM4I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64NV")) == NULL) || r; - r = ((glUniform4i64vNV = (PFNGLUNIFORM4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64vNV")) == NULL) || r; - r = ((glUniform4ui64NV = (PFNGLUNIFORM4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64NV")) == NULL) || r; - r = ((glUniform4ui64vNV = (PFNGLUNIFORM4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64vNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_gpu_shader5 */ - -#ifdef GL_NV_half_float - -static GLboolean _glewInit_GL_NV_half_float () -{ - GLboolean r = GL_FALSE; - - r = ((glColor3hNV = (PFNGLCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)"glColor3hNV")) == NULL) || r; - r = ((glColor3hvNV = (PFNGLCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)"glColor3hvNV")) == NULL) || r; - r = ((glColor4hNV = (PFNGLCOLOR4HNVPROC)glewGetProcAddress((const GLubyte*)"glColor4hNV")) == NULL) || r; - r = ((glColor4hvNV = (PFNGLCOLOR4HVNVPROC)glewGetProcAddress((const GLubyte*)"glColor4hvNV")) == NULL) || r; - r = ((glFogCoordhNV = (PFNGLFOGCOORDHNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordhNV")) == NULL) || r; - r = ((glFogCoordhvNV = (PFNGLFOGCOORDHVNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordhvNV")) == NULL) || r; - r = ((glMultiTexCoord1hNV = (PFNGLMULTITEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1hNV")) == NULL) || r; - r = ((glMultiTexCoord1hvNV = (PFNGLMULTITEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1hvNV")) == NULL) || r; - r = ((glMultiTexCoord2hNV = (PFNGLMULTITEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2hNV")) == NULL) || r; - r = ((glMultiTexCoord2hvNV = (PFNGLMULTITEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2hvNV")) == NULL) || r; - r = ((glMultiTexCoord3hNV = (PFNGLMULTITEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3hNV")) == NULL) || r; - r = ((glMultiTexCoord3hvNV = (PFNGLMULTITEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3hvNV")) == NULL) || r; - r = ((glMultiTexCoord4hNV = (PFNGLMULTITEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4hNV")) == NULL) || r; - r = ((glMultiTexCoord4hvNV = (PFNGLMULTITEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4hvNV")) == NULL) || r; - r = ((glNormal3hNV = (PFNGLNORMAL3HNVPROC)glewGetProcAddress((const GLubyte*)"glNormal3hNV")) == NULL) || r; - r = ((glNormal3hvNV = (PFNGLNORMAL3HVNVPROC)glewGetProcAddress((const GLubyte*)"glNormal3hvNV")) == NULL) || r; - r = ((glSecondaryColor3hNV = (PFNGLSECONDARYCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3hNV")) == NULL) || r; - r = ((glSecondaryColor3hvNV = (PFNGLSECONDARYCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3hvNV")) == NULL) || r; - r = ((glTexCoord1hNV = (PFNGLTEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord1hNV")) == NULL) || r; - r = ((glTexCoord1hvNV = (PFNGLTEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord1hvNV")) == NULL) || r; - r = ((glTexCoord2hNV = (PFNGLTEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2hNV")) == NULL) || r; - r = ((glTexCoord2hvNV = (PFNGLTEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2hvNV")) == NULL) || r; - r = ((glTexCoord3hNV = (PFNGLTEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord3hNV")) == NULL) || r; - r = ((glTexCoord3hvNV = (PFNGLTEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord3hvNV")) == NULL) || r; - r = ((glTexCoord4hNV = (PFNGLTEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4hNV")) == NULL) || r; - r = ((glTexCoord4hvNV = (PFNGLTEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4hvNV")) == NULL) || r; - r = ((glVertex2hNV = (PFNGLVERTEX2HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex2hNV")) == NULL) || r; - r = ((glVertex2hvNV = (PFNGLVERTEX2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex2hvNV")) == NULL) || r; - r = ((glVertex3hNV = (PFNGLVERTEX3HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex3hNV")) == NULL) || r; - r = ((glVertex3hvNV = (PFNGLVERTEX3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex3hvNV")) == NULL) || r; - r = ((glVertex4hNV = (PFNGLVERTEX4HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex4hNV")) == NULL) || r; - r = ((glVertex4hvNV = (PFNGLVERTEX4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex4hvNV")) == NULL) || r; - r = ((glVertexAttrib1hNV = (PFNGLVERTEXATTRIB1HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1hNV")) == NULL) || r; - r = ((glVertexAttrib1hvNV = (PFNGLVERTEXATTRIB1HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1hvNV")) == NULL) || r; - r = ((glVertexAttrib2hNV = (PFNGLVERTEXATTRIB2HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2hNV")) == NULL) || r; - r = ((glVertexAttrib2hvNV = (PFNGLVERTEXATTRIB2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2hvNV")) == NULL) || r; - r = ((glVertexAttrib3hNV = (PFNGLVERTEXATTRIB3HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3hNV")) == NULL) || r; - r = ((glVertexAttrib3hvNV = (PFNGLVERTEXATTRIB3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3hvNV")) == NULL) || r; - r = ((glVertexAttrib4hNV = (PFNGLVERTEXATTRIB4HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4hNV")) == NULL) || r; - r = ((glVertexAttrib4hvNV = (PFNGLVERTEXATTRIB4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4hvNV")) == NULL) || r; - r = ((glVertexAttribs1hvNV = (PFNGLVERTEXATTRIBS1HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1hvNV")) == NULL) || r; - r = ((glVertexAttribs2hvNV = (PFNGLVERTEXATTRIBS2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2hvNV")) == NULL) || r; - r = ((glVertexAttribs3hvNV = (PFNGLVERTEXATTRIBS3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3hvNV")) == NULL) || r; - r = ((glVertexAttribs4hvNV = (PFNGLVERTEXATTRIBS4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4hvNV")) == NULL) || r; - r = ((glVertexWeighthNV = (PFNGLVERTEXWEIGHTHNVPROC)glewGetProcAddress((const GLubyte*)"glVertexWeighthNV")) == NULL) || r; - r = ((glVertexWeighthvNV = (PFNGLVERTEXWEIGHTHVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexWeighthvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_half_float */ - -#ifdef GL_NV_instanced_arrays - -static GLboolean _glewInit_GL_NV_instanced_arrays () -{ - GLboolean r = GL_FALSE; - - r = ((glVertexAttribDivisorNV = (PFNGLVERTEXATTRIBDIVISORNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_instanced_arrays */ - -#ifdef GL_NV_internalformat_sample_query - -static GLboolean _glewInit_GL_NV_internalformat_sample_query () -{ - GLboolean r = GL_FALSE; - - r = ((glGetInternalformatSampleivNV = (PFNGLGETINTERNALFORMATSAMPLEIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformatSampleivNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_internalformat_sample_query */ - -#ifdef GL_NV_memory_attachment - -static GLboolean _glewInit_GL_NV_memory_attachment () -{ - GLboolean r = GL_FALSE; - - r = ((glBufferAttachMemoryNV = (PFNGLBUFFERATTACHMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glBufferAttachMemoryNV")) == NULL) || r; - r = ((glGetMemoryObjectDetachedResourcesuivNV = (PFNGLGETMEMORYOBJECTDETACHEDRESOURCESUIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMemoryObjectDetachedResourcesuivNV")) == NULL) || r; - r = ((glNamedBufferAttachMemoryNV = (PFNGLNAMEDBUFFERATTACHMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferAttachMemoryNV")) == NULL) || r; - r = ((glResetMemoryObjectParameterNV = (PFNGLRESETMEMORYOBJECTPARAMETERNVPROC)glewGetProcAddress((const GLubyte*)"glResetMemoryObjectParameterNV")) == NULL) || r; - r = ((glTexAttachMemoryNV = (PFNGLTEXATTACHMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glTexAttachMemoryNV")) == NULL) || r; - r = ((glTextureAttachMemoryNV = (PFNGLTEXTUREATTACHMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glTextureAttachMemoryNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_memory_attachment */ - -#ifdef GL_NV_mesh_shader - -static GLboolean _glewInit_GL_NV_mesh_shader () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawMeshTasksIndirectNV = (PFNGLDRAWMESHTASKSINDIRECTNVPROC)glewGetProcAddress((const GLubyte*)"glDrawMeshTasksIndirectNV")) == NULL) || r; - r = ((glDrawMeshTasksNV = (PFNGLDRAWMESHTASKSNVPROC)glewGetProcAddress((const GLubyte*)"glDrawMeshTasksNV")) == NULL) || r; - r = ((glMultiDrawMeshTasksIndirectCountNV = (PFNGLMULTIDRAWMESHTASKSINDIRECTCOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawMeshTasksIndirectCountNV")) == NULL) || r; - r = ((glMultiDrawMeshTasksIndirectNV = (PFNGLMULTIDRAWMESHTASKSINDIRECTNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawMeshTasksIndirectNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_mesh_shader */ - -#ifdef GL_NV_non_square_matrices - -static GLboolean _glewInit_GL_NV_non_square_matrices () -{ - GLboolean r = GL_FALSE; - - r = ((glUniformMatrix2x3fvNV = (PFNGLUNIFORMMATRIX2X3FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3fvNV")) == NULL) || r; - r = ((glUniformMatrix2x4fvNV = (PFNGLUNIFORMMATRIX2X4FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4fvNV")) == NULL) || r; - r = ((glUniformMatrix3x2fvNV = (PFNGLUNIFORMMATRIX3X2FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2fvNV")) == NULL) || r; - r = ((glUniformMatrix3x4fvNV = (PFNGLUNIFORMMATRIX3X4FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4fvNV")) == NULL) || r; - r = ((glUniformMatrix4x2fvNV = (PFNGLUNIFORMMATRIX4X2FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2fvNV")) == NULL) || r; - r = ((glUniformMatrix4x3fvNV = (PFNGLUNIFORMMATRIX4X3FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3fvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_non_square_matrices */ - -#ifdef GL_NV_occlusion_query - -static GLboolean _glewInit_GL_NV_occlusion_query () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginOcclusionQueryNV = (PFNGLBEGINOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glBeginOcclusionQueryNV")) == NULL) || r; - r = ((glDeleteOcclusionQueriesNV = (PFNGLDELETEOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteOcclusionQueriesNV")) == NULL) || r; - r = ((glEndOcclusionQueryNV = (PFNGLENDOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glEndOcclusionQueryNV")) == NULL) || r; - r = ((glGenOcclusionQueriesNV = (PFNGLGENOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)"glGenOcclusionQueriesNV")) == NULL) || r; - r = ((glGetOcclusionQueryivNV = (PFNGLGETOCCLUSIONQUERYIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetOcclusionQueryivNV")) == NULL) || r; - r = ((glGetOcclusionQueryuivNV = (PFNGLGETOCCLUSIONQUERYUIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetOcclusionQueryuivNV")) == NULL) || r; - r = ((glIsOcclusionQueryNV = (PFNGLISOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glIsOcclusionQueryNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_occlusion_query */ - -#ifdef GL_NV_parameter_buffer_object - -static GLboolean _glewInit_GL_NV_parameter_buffer_object () -{ - GLboolean r = GL_FALSE; - - r = ((glProgramBufferParametersIivNV = (PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersIivNV")) == NULL) || r; - r = ((glProgramBufferParametersIuivNV = (PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersIuivNV")) == NULL) || r; - r = ((glProgramBufferParametersfvNV = (PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersfvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_parameter_buffer_object */ - -#ifdef GL_NV_path_rendering - -static GLboolean _glewInit_GL_NV_path_rendering () -{ - GLboolean r = GL_FALSE; - - r = ((glCopyPathNV = (PFNGLCOPYPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCopyPathNV")) == NULL) || r; - r = ((glCoverFillPathInstancedNV = (PFNGLCOVERFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glCoverFillPathInstancedNV")) == NULL) || r; - r = ((glCoverFillPathNV = (PFNGLCOVERFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCoverFillPathNV")) == NULL) || r; - r = ((glCoverStrokePathInstancedNV = (PFNGLCOVERSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glCoverStrokePathInstancedNV")) == NULL) || r; - r = ((glCoverStrokePathNV = (PFNGLCOVERSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCoverStrokePathNV")) == NULL) || r; - r = ((glDeletePathsNV = (PFNGLDELETEPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glDeletePathsNV")) == NULL) || r; - r = ((glGenPathsNV = (PFNGLGENPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glGenPathsNV")) == NULL) || r; - r = ((glGetPathColorGenfvNV = (PFNGLGETPATHCOLORGENFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathColorGenfvNV")) == NULL) || r; - r = ((glGetPathColorGenivNV = (PFNGLGETPATHCOLORGENIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathColorGenivNV")) == NULL) || r; - r = ((glGetPathCommandsNV = (PFNGLGETPATHCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathCommandsNV")) == NULL) || r; - r = ((glGetPathCoordsNV = (PFNGLGETPATHCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathCoordsNV")) == NULL) || r; - r = ((glGetPathDashArrayNV = (PFNGLGETPATHDASHARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathDashArrayNV")) == NULL) || r; - r = ((glGetPathLengthNV = (PFNGLGETPATHLENGTHNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathLengthNV")) == NULL) || r; - r = ((glGetPathMetricRangeNV = (PFNGLGETPATHMETRICRANGENVPROC)glewGetProcAddress((const GLubyte*)"glGetPathMetricRangeNV")) == NULL) || r; - r = ((glGetPathMetricsNV = (PFNGLGETPATHMETRICSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathMetricsNV")) == NULL) || r; - r = ((glGetPathParameterfvNV = (PFNGLGETPATHPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathParameterfvNV")) == NULL) || r; - r = ((glGetPathParameterivNV = (PFNGLGETPATHPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathParameterivNV")) == NULL) || r; - r = ((glGetPathSpacingNV = (PFNGLGETPATHSPACINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathSpacingNV")) == NULL) || r; - r = ((glGetPathTexGenfvNV = (PFNGLGETPATHTEXGENFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathTexGenfvNV")) == NULL) || r; - r = ((glGetPathTexGenivNV = (PFNGLGETPATHTEXGENIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathTexGenivNV")) == NULL) || r; - r = ((glGetProgramResourcefvNV = (PFNGLGETPROGRAMRESOURCEFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourcefvNV")) == NULL) || r; - r = ((glInterpolatePathsNV = (PFNGLINTERPOLATEPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glInterpolatePathsNV")) == NULL) || r; - r = ((glIsPathNV = (PFNGLISPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPathNV")) == NULL) || r; - r = ((glIsPointInFillPathNV = (PFNGLISPOINTINFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPointInFillPathNV")) == NULL) || r; - r = ((glIsPointInStrokePathNV = (PFNGLISPOINTINSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPointInStrokePathNV")) == NULL) || r; - r = ((glMatrixLoad3x2fNV = (PFNGLMATRIXLOAD3X2FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoad3x2fNV")) == NULL) || r; - r = ((glMatrixLoad3x3fNV = (PFNGLMATRIXLOAD3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoad3x3fNV")) == NULL) || r; - r = ((glMatrixLoadTranspose3x3fNV = (PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTranspose3x3fNV")) == NULL) || r; - r = ((glMatrixMult3x2fNV = (PFNGLMATRIXMULT3X2FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMult3x2fNV")) == NULL) || r; - r = ((glMatrixMult3x3fNV = (PFNGLMATRIXMULT3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMult3x3fNV")) == NULL) || r; - r = ((glMatrixMultTranspose3x3fNV = (PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTranspose3x3fNV")) == NULL) || r; - r = ((glPathColorGenNV = (PFNGLPATHCOLORGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathColorGenNV")) == NULL) || r; - r = ((glPathCommandsNV = (PFNGLPATHCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathCommandsNV")) == NULL) || r; - r = ((glPathCoordsNV = (PFNGLPATHCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathCoordsNV")) == NULL) || r; - r = ((glPathCoverDepthFuncNV = (PFNGLPATHCOVERDEPTHFUNCNVPROC)glewGetProcAddress((const GLubyte*)"glPathCoverDepthFuncNV")) == NULL) || r; - r = ((glPathDashArrayNV = (PFNGLPATHDASHARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathDashArrayNV")) == NULL) || r; - r = ((glPathFogGenNV = (PFNGLPATHFOGGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathFogGenNV")) == NULL) || r; - r = ((glPathGlyphIndexArrayNV = (PFNGLPATHGLYPHINDEXARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphIndexArrayNV")) == NULL) || r; - r = ((glPathGlyphIndexRangeNV = (PFNGLPATHGLYPHINDEXRANGENVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphIndexRangeNV")) == NULL) || r; - r = ((glPathGlyphRangeNV = (PFNGLPATHGLYPHRANGENVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphRangeNV")) == NULL) || r; - r = ((glPathGlyphsNV = (PFNGLPATHGLYPHSNVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphsNV")) == NULL) || r; - r = ((glPathMemoryGlyphIndexArrayNV = (PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathMemoryGlyphIndexArrayNV")) == NULL) || r; - r = ((glPathParameterfNV = (PFNGLPATHPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterfNV")) == NULL) || r; - r = ((glPathParameterfvNV = (PFNGLPATHPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterfvNV")) == NULL) || r; - r = ((glPathParameteriNV = (PFNGLPATHPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glPathParameteriNV")) == NULL) || r; - r = ((glPathParameterivNV = (PFNGLPATHPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterivNV")) == NULL) || r; - r = ((glPathStencilDepthOffsetNV = (PFNGLPATHSTENCILDEPTHOFFSETNVPROC)glewGetProcAddress((const GLubyte*)"glPathStencilDepthOffsetNV")) == NULL) || r; - r = ((glPathStencilFuncNV = (PFNGLPATHSTENCILFUNCNVPROC)glewGetProcAddress((const GLubyte*)"glPathStencilFuncNV")) == NULL) || r; - r = ((glPathStringNV = (PFNGLPATHSTRINGNVPROC)glewGetProcAddress((const GLubyte*)"glPathStringNV")) == NULL) || r; - r = ((glPathSubCommandsNV = (PFNGLPATHSUBCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathSubCommandsNV")) == NULL) || r; - r = ((glPathSubCoordsNV = (PFNGLPATHSUBCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathSubCoordsNV")) == NULL) || r; - r = ((glPathTexGenNV = (PFNGLPATHTEXGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathTexGenNV")) == NULL) || r; - r = ((glPointAlongPathNV = (PFNGLPOINTALONGPATHNVPROC)glewGetProcAddress((const GLubyte*)"glPointAlongPathNV")) == NULL) || r; - r = ((glProgramPathFragmentInputGenNV = (PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC)glewGetProcAddress((const GLubyte*)"glProgramPathFragmentInputGenNV")) == NULL) || r; - r = ((glStencilFillPathInstancedNV = (PFNGLSTENCILFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilFillPathInstancedNV")) == NULL) || r; - r = ((glStencilFillPathNV = (PFNGLSTENCILFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilFillPathNV")) == NULL) || r; - r = ((glStencilStrokePathInstancedNV = (PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilStrokePathInstancedNV")) == NULL) || r; - r = ((glStencilStrokePathNV = (PFNGLSTENCILSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilStrokePathNV")) == NULL) || r; - r = ((glStencilThenCoverFillPathInstancedNV = (PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverFillPathInstancedNV")) == NULL) || r; - r = ((glStencilThenCoverFillPathNV = (PFNGLSTENCILTHENCOVERFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverFillPathNV")) == NULL) || r; - r = ((glStencilThenCoverStrokePathInstancedNV = (PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverStrokePathInstancedNV")) == NULL) || r; - r = ((glStencilThenCoverStrokePathNV = (PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverStrokePathNV")) == NULL) || r; - r = ((glTransformPathNV = (PFNGLTRANSFORMPATHNVPROC)glewGetProcAddress((const GLubyte*)"glTransformPathNV")) == NULL) || r; - r = ((glWeightPathsNV = (PFNGLWEIGHTPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glWeightPathsNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_path_rendering */ - -#ifdef GL_NV_pixel_data_range - -static GLboolean _glewInit_GL_NV_pixel_data_range () -{ - GLboolean r = GL_FALSE; - - r = ((glFlushPixelDataRangeNV = (PFNGLFLUSHPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)"glFlushPixelDataRangeNV")) == NULL) || r; - r = ((glPixelDataRangeNV = (PFNGLPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)"glPixelDataRangeNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_pixel_data_range */ - -#ifdef GL_NV_point_sprite - -static GLboolean _glewInit_GL_NV_point_sprite () -{ - GLboolean r = GL_FALSE; - - r = ((glPointParameteriNV = (PFNGLPOINTPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glPointParameteriNV")) == NULL) || r; - r = ((glPointParameterivNV = (PFNGLPOINTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterivNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_point_sprite */ - -#ifdef GL_NV_polygon_mode - -static GLboolean _glewInit_GL_NV_polygon_mode () -{ - GLboolean r = GL_FALSE; - - r = ((glPolygonModeNV = (PFNGLPOLYGONMODENVPROC)glewGetProcAddress((const GLubyte*)"glPolygonModeNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_polygon_mode */ - -#ifdef GL_NV_present_video - -static GLboolean _glewInit_GL_NV_present_video () -{ - GLboolean r = GL_FALSE; - - r = ((glGetVideoi64vNV = (PFNGLGETVIDEOI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoi64vNV")) == NULL) || r; - r = ((glGetVideoivNV = (PFNGLGETVIDEOIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoivNV")) == NULL) || r; - r = ((glGetVideoui64vNV = (PFNGLGETVIDEOUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoui64vNV")) == NULL) || r; - r = ((glGetVideouivNV = (PFNGLGETVIDEOUIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideouivNV")) == NULL) || r; - r = ((glPresentFrameDualFillNV = (PFNGLPRESENTFRAMEDUALFILLNVPROC)glewGetProcAddress((const GLubyte*)"glPresentFrameDualFillNV")) == NULL) || r; - r = ((glPresentFrameKeyedNV = (PFNGLPRESENTFRAMEKEYEDNVPROC)glewGetProcAddress((const GLubyte*)"glPresentFrameKeyedNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_present_video */ - -#ifdef GL_NV_primitive_restart - -static GLboolean _glewInit_GL_NV_primitive_restart () -{ - GLboolean r = GL_FALSE; - - r = ((glPrimitiveRestartIndexNV = (PFNGLPRIMITIVERESTARTINDEXNVPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartIndexNV")) == NULL) || r; - r = ((glPrimitiveRestartNV = (PFNGLPRIMITIVERESTARTNVPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_primitive_restart */ - -#ifdef GL_NV_read_buffer - -static GLboolean _glewInit_GL_NV_read_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((glReadBufferNV = (PFNGLREADBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glReadBufferNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_read_buffer */ - -#ifdef GL_NV_register_combiners - -static GLboolean _glewInit_GL_NV_register_combiners () -{ - GLboolean r = GL_FALSE; - - r = ((glCombinerInputNV = (PFNGLCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerInputNV")) == NULL) || r; - r = ((glCombinerOutputNV = (PFNGLCOMBINEROUTPUTNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerOutputNV")) == NULL) || r; - r = ((glCombinerParameterfNV = (PFNGLCOMBINERPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterfNV")) == NULL) || r; - r = ((glCombinerParameterfvNV = (PFNGLCOMBINERPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterfvNV")) == NULL) || r; - r = ((glCombinerParameteriNV = (PFNGLCOMBINERPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameteriNV")) == NULL) || r; - r = ((glCombinerParameterivNV = (PFNGLCOMBINERPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterivNV")) == NULL) || r; - r = ((glFinalCombinerInputNV = (PFNGLFINALCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)"glFinalCombinerInputNV")) == NULL) || r; - r = ((glGetCombinerInputParameterfvNV = (PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerInputParameterfvNV")) == NULL) || r; - r = ((glGetCombinerInputParameterivNV = (PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerInputParameterivNV")) == NULL) || r; - r = ((glGetCombinerOutputParameterfvNV = (PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerOutputParameterfvNV")) == NULL) || r; - r = ((glGetCombinerOutputParameterivNV = (PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerOutputParameterivNV")) == NULL) || r; - r = ((glGetFinalCombinerInputParameterfvNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFinalCombinerInputParameterfvNV")) == NULL) || r; - r = ((glGetFinalCombinerInputParameterivNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFinalCombinerInputParameterivNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_register_combiners */ - -#ifdef GL_NV_register_combiners2 - -static GLboolean _glewInit_GL_NV_register_combiners2 () -{ - GLboolean r = GL_FALSE; - - r = ((glCombinerStageParameterfvNV = (PFNGLCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerStageParameterfvNV")) == NULL) || r; - r = ((glGetCombinerStageParameterfvNV = (PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerStageParameterfvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_register_combiners2 */ - -#ifdef GL_NV_sample_locations - -static GLboolean _glewInit_GL_NV_sample_locations () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferSampleLocationsfvNV = (PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)glewGetProcAddress((const GLubyte*)"glFramebufferSampleLocationsfvNV")) == NULL) || r; - r = ((glNamedFramebufferSampleLocationsfvNV = (PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferSampleLocationsfvNV")) == NULL) || r; - r = ((glResolveDepthValuesNV = (PFNGLRESOLVEDEPTHVALUESNVPROC)glewGetProcAddress((const GLubyte*)"glResolveDepthValuesNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_sample_locations */ - -#ifdef GL_NV_scissor_exclusive - -static GLboolean _glewInit_GL_NV_scissor_exclusive () -{ - GLboolean r = GL_FALSE; - - r = ((glScissorExclusiveArrayvNV = (PFNGLSCISSOREXCLUSIVEARRAYVNVPROC)glewGetProcAddress((const GLubyte*)"glScissorExclusiveArrayvNV")) == NULL) || r; - r = ((glScissorExclusiveNV = (PFNGLSCISSOREXCLUSIVENVPROC)glewGetProcAddress((const GLubyte*)"glScissorExclusiveNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_scissor_exclusive */ - -#ifdef GL_NV_shader_buffer_load - -static GLboolean _glewInit_GL_NV_shader_buffer_load () -{ - GLboolean r = GL_FALSE; - - r = ((glGetBufferParameterui64vNV = (PFNGLGETBUFFERPARAMETERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameterui64vNV")) == NULL) || r; - r = ((glGetIntegerui64vNV = (PFNGLGETINTEGERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerui64vNV")) == NULL) || r; - r = ((glGetNamedBufferParameterui64vNV = (PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameterui64vNV")) == NULL) || r; - r = ((glIsBufferResidentNV = (PFNGLISBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsBufferResidentNV")) == NULL) || r; - r = ((glIsNamedBufferResidentNV = (PFNGLISNAMEDBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsNamedBufferResidentNV")) == NULL) || r; - r = ((glMakeBufferNonResidentNV = (PFNGLMAKEBUFFERNONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeBufferNonResidentNV")) == NULL) || r; - r = ((glMakeBufferResidentNV = (PFNGLMAKEBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeBufferResidentNV")) == NULL) || r; - r = ((glMakeNamedBufferNonResidentNV = (PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeNamedBufferNonResidentNV")) == NULL) || r; - r = ((glMakeNamedBufferResidentNV = (PFNGLMAKENAMEDBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeNamedBufferResidentNV")) == NULL) || r; - r = ((glProgramUniformui64NV = (PFNGLPROGRAMUNIFORMUI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformui64NV")) == NULL) || r; - r = ((glProgramUniformui64vNV = (PFNGLPROGRAMUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformui64vNV")) == NULL) || r; - r = ((glUniformui64NV = (PFNGLUNIFORMUI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniformui64NV")) == NULL) || r; - r = ((glUniformui64vNV = (PFNGLUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniformui64vNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_shader_buffer_load */ - -#ifdef GL_NV_shading_rate_image - -static GLboolean _glewInit_GL_NV_shading_rate_image () -{ - GLboolean r = GL_FALSE; - - r = ((glBindShadingRateImageNV = (PFNGLBINDSHADINGRATEIMAGENVPROC)glewGetProcAddress((const GLubyte*)"glBindShadingRateImageNV")) == NULL) || r; - r = ((glGetShadingRateImagePaletteNV = (PFNGLGETSHADINGRATEIMAGEPALETTENVPROC)glewGetProcAddress((const GLubyte*)"glGetShadingRateImagePaletteNV")) == NULL) || r; - r = ((glGetShadingRateSampleLocationivNV = (PFNGLGETSHADINGRATESAMPLELOCATIONIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetShadingRateSampleLocationivNV")) == NULL) || r; - r = ((glShadingRateImageBarrierNV = (PFNGLSHADINGRATEIMAGEBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glShadingRateImageBarrierNV")) == NULL) || r; - r = ((glShadingRateImagePaletteNV = (PFNGLSHADINGRATEIMAGEPALETTENVPROC)glewGetProcAddress((const GLubyte*)"glShadingRateImagePaletteNV")) == NULL) || r; - r = ((glShadingRateSampleOrderCustomNV = (PFNGLSHADINGRATESAMPLEORDERCUSTOMNVPROC)glewGetProcAddress((const GLubyte*)"glShadingRateSampleOrderCustomNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_shading_rate_image */ - -#ifdef GL_NV_texture_array - -static GLboolean _glewInit_GL_NV_texture_array () -{ - GLboolean r = GL_FALSE; - - r = ((glCompressedTexImage3DNV = (PFNGLCOMPRESSEDTEXIMAGE3DNVPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3DNV")) == NULL) || r; - r = ((glCompressedTexSubImage3DNV = (PFNGLCOMPRESSEDTEXSUBIMAGE3DNVPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3DNV")) == NULL) || r; - r = ((glCopyTexSubImage3DNV = (PFNGLCOPYTEXSUBIMAGE3DNVPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3DNV")) == NULL) || r; - r = ((glFramebufferTextureLayerNV = (PFNGLFRAMEBUFFERTEXTURELAYERNVPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerNV")) == NULL) || r; - r = ((glTexImage3DNV = (PFNGLTEXIMAGE3DNVPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DNV")) == NULL) || r; - r = ((glTexSubImage3DNV = (PFNGLTEXSUBIMAGE3DNVPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3DNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_texture_array */ - -#ifdef GL_NV_texture_barrier - -static GLboolean _glewInit_GL_NV_texture_barrier () -{ - GLboolean r = GL_FALSE; - - r = ((glTextureBarrierNV = (PFNGLTEXTUREBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glTextureBarrierNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_texture_barrier */ - -#ifdef GL_NV_texture_multisample - -static GLboolean _glewInit_GL_NV_texture_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glTexImage2DMultisampleCoverageNV = (PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTexImage2DMultisampleCoverageNV")) == NULL) || r; - r = ((glTexImage3DMultisampleCoverageNV = (PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DMultisampleCoverageNV")) == NULL) || r; - r = ((glTextureImage2DMultisampleCoverageNV = (PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DMultisampleCoverageNV")) == NULL) || r; - r = ((glTextureImage2DMultisampleNV = (PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DMultisampleNV")) == NULL) || r; - r = ((glTextureImage3DMultisampleCoverageNV = (PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DMultisampleCoverageNV")) == NULL) || r; - r = ((glTextureImage3DMultisampleNV = (PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DMultisampleNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_texture_multisample */ - -#ifdef GL_NV_transform_feedback - -static GLboolean _glewInit_GL_NV_transform_feedback () -{ - GLboolean r = GL_FALSE; - - r = ((glActiveVaryingNV = (PFNGLACTIVEVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glActiveVaryingNV")) == NULL) || r; - r = ((glBeginTransformFeedbackNV = (PFNGLBEGINTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedbackNV")) == NULL) || r; - r = ((glBindBufferBaseNV = (PFNGLBINDBUFFERBASENVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBaseNV")) == NULL) || r; - r = ((glBindBufferOffsetNV = (PFNGLBINDBUFFEROFFSETNVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferOffsetNV")) == NULL) || r; - r = ((glBindBufferRangeNV = (PFNGLBINDBUFFERRANGENVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRangeNV")) == NULL) || r; - r = ((glEndTransformFeedbackNV = (PFNGLENDTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedbackNV")) == NULL) || r; - r = ((glGetActiveVaryingNV = (PFNGLGETACTIVEVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveVaryingNV")) == NULL) || r; - r = ((glGetTransformFeedbackVaryingNV = (PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVaryingNV")) == NULL) || r; - r = ((glGetVaryingLocationNV = (PFNGLGETVARYINGLOCATIONNVPROC)glewGetProcAddress((const GLubyte*)"glGetVaryingLocationNV")) == NULL) || r; - r = ((glTransformFeedbackAttribsNV = (PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackAttribsNV")) == NULL) || r; - r = ((glTransformFeedbackVaryingsNV = (PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryingsNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_transform_feedback */ - -#ifdef GL_NV_transform_feedback2 - -static GLboolean _glewInit_GL_NV_transform_feedback2 () -{ - GLboolean r = GL_FALSE; - - r = ((glBindTransformFeedbackNV = (PFNGLBINDTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glBindTransformFeedbackNV")) == NULL) || r; - r = ((glDeleteTransformFeedbacksNV = (PFNGLDELETETRANSFORMFEEDBACKSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteTransformFeedbacksNV")) == NULL) || r; - r = ((glDrawTransformFeedbackNV = (PFNGLDRAWTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackNV")) == NULL) || r; - r = ((glGenTransformFeedbacksNV = (PFNGLGENTRANSFORMFEEDBACKSNVPROC)glewGetProcAddress((const GLubyte*)"glGenTransformFeedbacksNV")) == NULL) || r; - r = ((glIsTransformFeedbackNV = (PFNGLISTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glIsTransformFeedbackNV")) == NULL) || r; - r = ((glPauseTransformFeedbackNV = (PFNGLPAUSETRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glPauseTransformFeedbackNV")) == NULL) || r; - r = ((glResumeTransformFeedbackNV = (PFNGLRESUMETRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glResumeTransformFeedbackNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_transform_feedback2 */ - -#ifdef GL_NV_vdpau_interop - -static GLboolean _glewInit_GL_NV_vdpau_interop () -{ - GLboolean r = GL_FALSE; - - r = ((glVDPAUFiniNV = (PFNGLVDPAUFININVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUFiniNV")) == NULL) || r; - r = ((glVDPAUGetSurfaceivNV = (PFNGLVDPAUGETSURFACEIVNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUGetSurfaceivNV")) == NULL) || r; - r = ((glVDPAUInitNV = (PFNGLVDPAUINITNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUInitNV")) == NULL) || r; - r = ((glVDPAUIsSurfaceNV = (PFNGLVDPAUISSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUIsSurfaceNV")) == NULL) || r; - r = ((glVDPAUMapSurfacesNV = (PFNGLVDPAUMAPSURFACESNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUMapSurfacesNV")) == NULL) || r; - r = ((glVDPAURegisterOutputSurfaceNV = (PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAURegisterOutputSurfaceNV")) == NULL) || r; - r = ((glVDPAURegisterVideoSurfaceNV = (PFNGLVDPAUREGISTERVIDEOSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAURegisterVideoSurfaceNV")) == NULL) || r; - r = ((glVDPAUSurfaceAccessNV = (PFNGLVDPAUSURFACEACCESSNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUSurfaceAccessNV")) == NULL) || r; - r = ((glVDPAUUnmapSurfacesNV = (PFNGLVDPAUUNMAPSURFACESNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUUnmapSurfacesNV")) == NULL) || r; - r = ((glVDPAUUnregisterSurfaceNV = (PFNGLVDPAUUNREGISTERSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUUnregisterSurfaceNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_vdpau_interop */ - -#ifdef GL_NV_vdpau_interop2 - -static GLboolean _glewInit_GL_NV_vdpau_interop2 () -{ - GLboolean r = GL_FALSE; - - r = ((glVDPAURegisterVideoSurfaceWithPictureStructureNV = (PFNGLVDPAUREGISTERVIDEOSURFACEWITHPICTURESTRUCTURENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAURegisterVideoSurfaceWithPictureStructureNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_vdpau_interop2 */ - -#ifdef GL_NV_vertex_array_range - -static GLboolean _glewInit_GL_NV_vertex_array_range () -{ - GLboolean r = GL_FALSE; - - r = ((glFlushVertexArrayRangeNV = (PFNGLFLUSHVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)"glFlushVertexArrayRangeNV")) == NULL) || r; - r = ((glVertexArrayRangeNV = (PFNGLVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayRangeNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_vertex_array_range */ - -#ifdef GL_NV_vertex_attrib_integer_64bit - -static GLboolean _glewInit_GL_NV_vertex_attrib_integer_64bit () -{ - GLboolean r = GL_FALSE; - - r = ((glGetVertexAttribLi64vNV = (PFNGLGETVERTEXATTRIBLI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLi64vNV")) == NULL) || r; - r = ((glGetVertexAttribLui64vNV = (PFNGLGETVERTEXATTRIBLUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLui64vNV")) == NULL) || r; - r = ((glVertexAttribL1i64NV = (PFNGLVERTEXATTRIBL1I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1i64NV")) == NULL) || r; - r = ((glVertexAttribL1i64vNV = (PFNGLVERTEXATTRIBL1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1i64vNV")) == NULL) || r; - r = ((glVertexAttribL1ui64NV = (PFNGLVERTEXATTRIBL1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64NV")) == NULL) || r; - r = ((glVertexAttribL1ui64vNV = (PFNGLVERTEXATTRIBL1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64vNV")) == NULL) || r; - r = ((glVertexAttribL2i64NV = (PFNGLVERTEXATTRIBL2I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2i64NV")) == NULL) || r; - r = ((glVertexAttribL2i64vNV = (PFNGLVERTEXATTRIBL2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2i64vNV")) == NULL) || r; - r = ((glVertexAttribL2ui64NV = (PFNGLVERTEXATTRIBL2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2ui64NV")) == NULL) || r; - r = ((glVertexAttribL2ui64vNV = (PFNGLVERTEXATTRIBL2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2ui64vNV")) == NULL) || r; - r = ((glVertexAttribL3i64NV = (PFNGLVERTEXATTRIBL3I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3i64NV")) == NULL) || r; - r = ((glVertexAttribL3i64vNV = (PFNGLVERTEXATTRIBL3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3i64vNV")) == NULL) || r; - r = ((glVertexAttribL3ui64NV = (PFNGLVERTEXATTRIBL3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3ui64NV")) == NULL) || r; - r = ((glVertexAttribL3ui64vNV = (PFNGLVERTEXATTRIBL3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3ui64vNV")) == NULL) || r; - r = ((glVertexAttribL4i64NV = (PFNGLVERTEXATTRIBL4I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4i64NV")) == NULL) || r; - r = ((glVertexAttribL4i64vNV = (PFNGLVERTEXATTRIBL4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4i64vNV")) == NULL) || r; - r = ((glVertexAttribL4ui64NV = (PFNGLVERTEXATTRIBL4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4ui64NV")) == NULL) || r; - r = ((glVertexAttribL4ui64vNV = (PFNGLVERTEXATTRIBL4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4ui64vNV")) == NULL) || r; - r = ((glVertexAttribLFormatNV = (PFNGLVERTEXATTRIBLFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLFormatNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_vertex_attrib_integer_64bit */ - -#ifdef GL_NV_vertex_buffer_unified_memory - -static GLboolean _glewInit_GL_NV_vertex_buffer_unified_memory () -{ - GLboolean r = GL_FALSE; - - r = ((glBufferAddressRangeNV = (PFNGLBUFFERADDRESSRANGENVPROC)glewGetProcAddress((const GLubyte*)"glBufferAddressRangeNV")) == NULL) || r; - r = ((glColorFormatNV = (PFNGLCOLORFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glColorFormatNV")) == NULL) || r; - r = ((glEdgeFlagFormatNV = (PFNGLEDGEFLAGFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagFormatNV")) == NULL) || r; - r = ((glFogCoordFormatNV = (PFNGLFOGCOORDFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordFormatNV")) == NULL) || r; - r = ((glGetIntegerui64i_vNV = (PFNGLGETINTEGERUI64I_VNVPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerui64i_vNV")) == NULL) || r; - r = ((glIndexFormatNV = (PFNGLINDEXFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glIndexFormatNV")) == NULL) || r; - r = ((glNormalFormatNV = (PFNGLNORMALFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glNormalFormatNV")) == NULL) || r; - r = ((glSecondaryColorFormatNV = (PFNGLSECONDARYCOLORFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorFormatNV")) == NULL) || r; - r = ((glTexCoordFormatNV = (PFNGLTEXCOORDFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordFormatNV")) == NULL) || r; - r = ((glVertexAttribFormatNV = (PFNGLVERTEXATTRIBFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribFormatNV")) == NULL) || r; - r = ((glVertexAttribIFormatNV = (PFNGLVERTEXATTRIBIFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIFormatNV")) == NULL) || r; - r = ((glVertexFormatNV = (PFNGLVERTEXFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexFormatNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_vertex_buffer_unified_memory */ - -#ifdef GL_NV_vertex_program - -static GLboolean _glewInit_GL_NV_vertex_program () -{ - GLboolean r = GL_FALSE; - - r = ((glAreProgramsResidentNV = (PFNGLAREPROGRAMSRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glAreProgramsResidentNV")) == NULL) || r; - r = ((glBindProgramNV = (PFNGLBINDPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glBindProgramNV")) == NULL) || r; - r = ((glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramsNV")) == NULL) || r; - r = ((glExecuteProgramNV = (PFNGLEXECUTEPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glExecuteProgramNV")) == NULL) || r; - r = ((glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glGenProgramsNV")) == NULL) || r; - r = ((glGetProgramParameterdvNV = (PFNGLGETPROGRAMPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramParameterdvNV")) == NULL) || r; - r = ((glGetProgramParameterfvNV = (PFNGLGETPROGRAMPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramParameterfvNV")) == NULL) || r; - r = ((glGetProgramStringNV = (PFNGLGETPROGRAMSTRINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStringNV")) == NULL) || r; - r = ((glGetProgramivNV = (PFNGLGETPROGRAMIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramivNV")) == NULL) || r; - r = ((glGetTrackMatrixivNV = (PFNGLGETTRACKMATRIXIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetTrackMatrixivNV")) == NULL) || r; - r = ((glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointervNV")) == NULL) || r; - r = ((glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdvNV")) == NULL) || r; - r = ((glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfvNV")) == NULL) || r; - r = ((glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribivNV")) == NULL) || r; - r = ((glIsProgramNV = (PFNGLISPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glIsProgramNV")) == NULL) || r; - r = ((glLoadProgramNV = (PFNGLLOADPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glLoadProgramNV")) == NULL) || r; - r = ((glProgramParameter4dNV = (PFNGLPROGRAMPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4dNV")) == NULL) || r; - r = ((glProgramParameter4dvNV = (PFNGLPROGRAMPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4dvNV")) == NULL) || r; - r = ((glProgramParameter4fNV = (PFNGLPROGRAMPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4fNV")) == NULL) || r; - r = ((glProgramParameter4fvNV = (PFNGLPROGRAMPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4fvNV")) == NULL) || r; - r = ((glProgramParameters4dvNV = (PFNGLPROGRAMPARAMETERS4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameters4dvNV")) == NULL) || r; - r = ((glProgramParameters4fvNV = (PFNGLPROGRAMPARAMETERS4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameters4fvNV")) == NULL) || r; - r = ((glRequestResidentProgramsNV = (PFNGLREQUESTRESIDENTPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glRequestResidentProgramsNV")) == NULL) || r; - r = ((glTrackMatrixNV = (PFNGLTRACKMATRIXNVPROC)glewGetProcAddress((const GLubyte*)"glTrackMatrixNV")) == NULL) || r; - r = ((glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dNV")) == NULL) || r; - r = ((glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dvNV")) == NULL) || r; - r = ((glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fNV")) == NULL) || r; - r = ((glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fvNV")) == NULL) || r; - r = ((glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sNV")) == NULL) || r; - r = ((glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1svNV")) == NULL) || r; - r = ((glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dNV")) == NULL) || r; - r = ((glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dvNV")) == NULL) || r; - r = ((glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fNV")) == NULL) || r; - r = ((glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fvNV")) == NULL) || r; - r = ((glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sNV")) == NULL) || r; - r = ((glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2svNV")) == NULL) || r; - r = ((glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dNV")) == NULL) || r; - r = ((glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dvNV")) == NULL) || r; - r = ((glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fNV")) == NULL) || r; - r = ((glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fvNV")) == NULL) || r; - r = ((glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sNV")) == NULL) || r; - r = ((glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3svNV")) == NULL) || r; - r = ((glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dNV")) == NULL) || r; - r = ((glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dvNV")) == NULL) || r; - r = ((glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fNV")) == NULL) || r; - r = ((glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fvNV")) == NULL) || r; - r = ((glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sNV")) == NULL) || r; - r = ((glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4svNV")) == NULL) || r; - r = ((glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubNV")) == NULL) || r; - r = ((glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubvNV")) == NULL) || r; - r = ((glVertexAttribPointerNV = (PFNGLVERTEXATTRIBPOINTERNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointerNV")) == NULL) || r; - r = ((glVertexAttribs1dvNV = (PFNGLVERTEXATTRIBS1DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1dvNV")) == NULL) || r; - r = ((glVertexAttribs1fvNV = (PFNGLVERTEXATTRIBS1FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1fvNV")) == NULL) || r; - r = ((glVertexAttribs1svNV = (PFNGLVERTEXATTRIBS1SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1svNV")) == NULL) || r; - r = ((glVertexAttribs2dvNV = (PFNGLVERTEXATTRIBS2DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2dvNV")) == NULL) || r; - r = ((glVertexAttribs2fvNV = (PFNGLVERTEXATTRIBS2FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2fvNV")) == NULL) || r; - r = ((glVertexAttribs2svNV = (PFNGLVERTEXATTRIBS2SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2svNV")) == NULL) || r; - r = ((glVertexAttribs3dvNV = (PFNGLVERTEXATTRIBS3DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3dvNV")) == NULL) || r; - r = ((glVertexAttribs3fvNV = (PFNGLVERTEXATTRIBS3FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3fvNV")) == NULL) || r; - r = ((glVertexAttribs3svNV = (PFNGLVERTEXATTRIBS3SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3svNV")) == NULL) || r; - r = ((glVertexAttribs4dvNV = (PFNGLVERTEXATTRIBS4DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4dvNV")) == NULL) || r; - r = ((glVertexAttribs4fvNV = (PFNGLVERTEXATTRIBS4FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4fvNV")) == NULL) || r; - r = ((glVertexAttribs4svNV = (PFNGLVERTEXATTRIBS4SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4svNV")) == NULL) || r; - r = ((glVertexAttribs4ubvNV = (PFNGLVERTEXATTRIBS4UBVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4ubvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_vertex_program */ - -#ifdef GL_NV_video_capture - -static GLboolean _glewInit_GL_NV_video_capture () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginVideoCaptureNV = (PFNGLBEGINVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glBeginVideoCaptureNV")) == NULL) || r; - r = ((glBindVideoCaptureStreamBufferNV = (PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glBindVideoCaptureStreamBufferNV")) == NULL) || r; - r = ((glBindVideoCaptureStreamTextureNV = (PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC)glewGetProcAddress((const GLubyte*)"glBindVideoCaptureStreamTextureNV")) == NULL) || r; - r = ((glEndVideoCaptureNV = (PFNGLENDVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glEndVideoCaptureNV")) == NULL) || r; - r = ((glGetVideoCaptureStreamdvNV = (PFNGLGETVIDEOCAPTURESTREAMDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamdvNV")) == NULL) || r; - r = ((glGetVideoCaptureStreamfvNV = (PFNGLGETVIDEOCAPTURESTREAMFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamfvNV")) == NULL) || r; - r = ((glGetVideoCaptureStreamivNV = (PFNGLGETVIDEOCAPTURESTREAMIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamivNV")) == NULL) || r; - r = ((glGetVideoCaptureivNV = (PFNGLGETVIDEOCAPTUREIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureivNV")) == NULL) || r; - r = ((glVideoCaptureNV = (PFNGLVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureNV")) == NULL) || r; - r = ((glVideoCaptureStreamParameterdvNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterdvNV")) == NULL) || r; - r = ((glVideoCaptureStreamParameterfvNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterfvNV")) == NULL) || r; - r = ((glVideoCaptureStreamParameterivNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterivNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_video_capture */ - -#ifdef GL_NV_viewport_array - -static GLboolean _glewInit_GL_NV_viewport_array () -{ - GLboolean r = GL_FALSE; - - r = ((glDepthRangeArrayfvNV = (PFNGLDEPTHRANGEARRAYFVNVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeArrayfvNV")) == NULL) || r; - r = ((glDepthRangeIndexedfNV = (PFNGLDEPTHRANGEINDEXEDFNVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeIndexedfNV")) == NULL) || r; - r = ((glDisableiNV = (PFNGLDISABLEINVPROC)glewGetProcAddress((const GLubyte*)"glDisableiNV")) == NULL) || r; - r = ((glEnableiNV = (PFNGLENABLEINVPROC)glewGetProcAddress((const GLubyte*)"glEnableiNV")) == NULL) || r; - r = ((glGetFloati_vNV = (PFNGLGETFLOATI_VNVPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_vNV")) == NULL) || r; - r = ((glIsEnablediNV = (PFNGLISENABLEDINVPROC)glewGetProcAddress((const GLubyte*)"glIsEnablediNV")) == NULL) || r; - r = ((glScissorArrayvNV = (PFNGLSCISSORARRAYVNVPROC)glewGetProcAddress((const GLubyte*)"glScissorArrayvNV")) == NULL) || r; - r = ((glScissorIndexedNV = (PFNGLSCISSORINDEXEDNVPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexedNV")) == NULL) || r; - r = ((glScissorIndexedvNV = (PFNGLSCISSORINDEXEDVNVPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexedvNV")) == NULL) || r; - r = ((glViewportArrayvNV = (PFNGLVIEWPORTARRAYVNVPROC)glewGetProcAddress((const GLubyte*)"glViewportArrayvNV")) == NULL) || r; - r = ((glViewportIndexedfNV = (PFNGLVIEWPORTINDEXEDFNVPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedfNV")) == NULL) || r; - r = ((glViewportIndexedfvNV = (PFNGLVIEWPORTINDEXEDFVNVPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedfvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_viewport_array */ - -#ifdef GL_NV_viewport_swizzle - -static GLboolean _glewInit_GL_NV_viewport_swizzle () -{ - GLboolean r = GL_FALSE; - - r = ((glViewportSwizzleNV = (PFNGLVIEWPORTSWIZZLENVPROC)glewGetProcAddress((const GLubyte*)"glViewportSwizzleNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_viewport_swizzle */ - -#ifdef GL_OES_EGL_image - -static GLboolean _glewInit_GL_OES_EGL_image () -{ - GLboolean r = GL_FALSE; - - r = ((glEGLImageTargetRenderbufferStorageOES = (PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC)glewGetProcAddress((const GLubyte*)"glEGLImageTargetRenderbufferStorageOES")) == NULL) || r; - r = ((glEGLImageTargetTexture2DOES = (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)glewGetProcAddress((const GLubyte*)"glEGLImageTargetTexture2DOES")) == NULL) || r; - - return r; -} - -#endif /* GL_OES_EGL_image */ - -#ifdef GL_OES_blend_equation_separate - -static GLboolean _glewInit_GL_OES_blend_equation_separate () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquationSeparateOES = (PFNGLBLENDEQUATIONSEPARATEOESPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateOES")) == NULL) || r; - - return r; -} - -#endif /* GL_OES_blend_equation_separate */ - -#ifdef GL_OES_blend_func_separate - -static GLboolean _glewInit_GL_OES_blend_func_separate () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendFuncSeparateOES = (PFNGLBLENDFUNCSEPARATEOESPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateOES")) == NULL) || r; - - return r; -} - -#endif /* GL_OES_blend_func_separate */ - -#ifdef GL_OES_blend_subtract - -static GLboolean _glewInit_GL_OES_blend_subtract () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquationOES = (PFNGLBLENDEQUATIONOESPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationOES")) == NULL) || r; - - return r; -} - -#endif /* GL_OES_blend_subtract */ - -#ifdef GL_OES_copy_image - -static GLboolean _glewInit_GL_OES_copy_image () -{ - GLboolean r = GL_FALSE; - - r = ((glCopyImageSubDataOES = (PFNGLCOPYIMAGESUBDATAOESPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubDataOES")) == NULL) || r; - - return r; -} - -#endif /* GL_OES_copy_image */ - -#ifdef GL_OES_draw_buffers_indexed - -static GLboolean _glewInit_GL_OES_draw_buffers_indexed () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquationSeparateiOES = (PFNGLBLENDEQUATIONSEPARATEIOESPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateiOES")) == NULL) || r; - r = ((glBlendEquationiOES = (PFNGLBLENDEQUATIONIOESPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationiOES")) == NULL) || r; - r = ((glBlendFuncSeparateiOES = (PFNGLBLENDFUNCSEPARATEIOESPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateiOES")) == NULL) || r; - r = ((glBlendFunciOES = (PFNGLBLENDFUNCIOESPROC)glewGetProcAddress((const GLubyte*)"glBlendFunciOES")) == NULL) || r; - r = ((glColorMaskiOES = (PFNGLCOLORMASKIOESPROC)glewGetProcAddress((const GLubyte*)"glColorMaskiOES")) == NULL) || r; - r = ((glDisableiOES = (PFNGLDISABLEIOESPROC)glewGetProcAddress((const GLubyte*)"glDisableiOES")) == NULL) || r; - r = ((glEnableiOES = (PFNGLENABLEIOESPROC)glewGetProcAddress((const GLubyte*)"glEnableiOES")) == NULL) || r; - r = ((glIsEnablediOES = (PFNGLISENABLEDIOESPROC)glewGetProcAddress((const GLubyte*)"glIsEnablediOES")) == NULL) || r; - - return r; -} - -#endif /* GL_OES_draw_buffers_indexed */ - -#ifdef GL_OES_framebuffer_object - -static GLboolean _glewInit_GL_OES_framebuffer_object () -{ - GLboolean r = GL_FALSE; - - r = ((glBindFramebufferOES = (PFNGLBINDFRAMEBUFFEROESPROC)glewGetProcAddress((const GLubyte*)"glBindFramebufferOES")) == NULL) || r; - r = ((glBindRenderbufferOES = (PFNGLBINDRENDERBUFFEROESPROC)glewGetProcAddress((const GLubyte*)"glBindRenderbufferOES")) == NULL) || r; - r = ((glCheckFramebufferStatusOES = (PFNGLCHECKFRAMEBUFFERSTATUSOESPROC)glewGetProcAddress((const GLubyte*)"glCheckFramebufferStatusOES")) == NULL) || r; - r = ((glDeleteFramebuffersOES = (PFNGLDELETEFRAMEBUFFERSOESPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffersOES")) == NULL) || r; - r = ((glDeleteRenderbuffersOES = (PFNGLDELETERENDERBUFFERSOESPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffersOES")) == NULL) || r; - r = ((glFramebufferRenderbufferOES = (PFNGLFRAMEBUFFERRENDERBUFFEROESPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbufferOES")) == NULL) || r; - r = ((glFramebufferTexture2DOES = (PFNGLFRAMEBUFFERTEXTURE2DOESPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2DOES")) == NULL) || r; - r = ((glGenFramebuffersOES = (PFNGLGENFRAMEBUFFERSOESPROC)glewGetProcAddress((const GLubyte*)"glGenFramebuffersOES")) == NULL) || r; - r = ((glGenRenderbuffersOES = (PFNGLGENRENDERBUFFERSOESPROC)glewGetProcAddress((const GLubyte*)"glGenRenderbuffersOES")) == NULL) || r; - r = ((glGenerateMipmapOES = (PFNGLGENERATEMIPMAPOESPROC)glewGetProcAddress((const GLubyte*)"glGenerateMipmapOES")) == NULL) || r; - r = ((glGetFramebufferAttachmentParameterivOES = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferAttachmentParameterivOES")) == NULL) || r; - r = ((glGetRenderbufferParameterivOES = (PFNGLGETRENDERBUFFERPARAMETERIVOESPROC)glewGetProcAddress((const GLubyte*)"glGetRenderbufferParameterivOES")) == NULL) || r; - r = ((glIsFramebufferOES = (PFNGLISFRAMEBUFFEROESPROC)glewGetProcAddress((const GLubyte*)"glIsFramebufferOES")) == NULL) || r; - r = ((glIsRenderbufferOES = (PFNGLISRENDERBUFFEROESPROC)glewGetProcAddress((const GLubyte*)"glIsRenderbufferOES")) == NULL) || r; - r = ((glRenderbufferStorageOES = (PFNGLRENDERBUFFERSTORAGEOESPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageOES")) == NULL) || r; - - return r; -} - -#endif /* GL_OES_framebuffer_object */ - -#ifdef GL_OES_get_program_binary - -static GLboolean _glewInit_GL_OES_get_program_binary () -{ - GLboolean r = GL_FALSE; - - r = ((glGetProgramBinaryOES = (PFNGLGETPROGRAMBINARYOESPROC)glewGetProcAddress((const GLubyte*)"glGetProgramBinaryOES")) == NULL) || r; - r = ((glProgramBinaryOES = (PFNGLPROGRAMBINARYOESPROC)glewGetProcAddress((const GLubyte*)"glProgramBinaryOES")) == NULL) || r; - - return r; -} - -#endif /* GL_OES_get_program_binary */ - -#ifdef GL_OES_mapbuffer - -static GLboolean _glewInit_GL_OES_mapbuffer () -{ - GLboolean r = GL_FALSE; - - r = ((glGetBufferPointervOES = (PFNGLGETBUFFERPOINTERVOESPROC)glewGetProcAddress((const GLubyte*)"glGetBufferPointervOES")) == NULL) || r; - r = ((glMapBufferOES = (PFNGLMAPBUFFEROESPROC)glewGetProcAddress((const GLubyte*)"glMapBufferOES")) == NULL) || r; - r = ((glUnmapBufferOES = (PFNGLUNMAPBUFFEROESPROC)glewGetProcAddress((const GLubyte*)"glUnmapBufferOES")) == NULL) || r; - - return r; -} - -#endif /* GL_OES_mapbuffer */ - -#ifdef GL_OES_matrix_palette - -static GLboolean _glewInit_GL_OES_matrix_palette () -{ - GLboolean r = GL_FALSE; - - r = ((glCurrentPaletteMatrixOES = (PFNGLCURRENTPALETTEMATRIXOESPROC)glewGetProcAddress((const GLubyte*)"glCurrentPaletteMatrixOES")) == NULL) || r; - r = ((glMatrixIndexPointerOES = (PFNGLMATRIXINDEXPOINTEROESPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexPointerOES")) == NULL) || r; - r = ((glWeightPointerOES = (PFNGLWEIGHTPOINTEROESPROC)glewGetProcAddress((const GLubyte*)"glWeightPointerOES")) == NULL) || r; - - return r; -} - -#endif /* GL_OES_matrix_palette */ - -#ifdef GL_OES_sample_shading - -static GLboolean _glewInit_GL_OES_sample_shading () -{ - GLboolean r = GL_FALSE; - - r = ((glMinSampleShadingOES = (PFNGLMINSAMPLESHADINGOESPROC)glewGetProcAddress((const GLubyte*)"glMinSampleShadingOES")) == NULL) || r; - - return r; -} - -#endif /* GL_OES_sample_shading */ - -#ifdef GL_OES_single_precision - -static GLboolean _glewInit_GL_OES_single_precision () -{ - GLboolean r = GL_FALSE; - - r = ((glClearDepthfOES = (PFNGLCLEARDEPTHFOESPROC)glewGetProcAddress((const GLubyte*)"glClearDepthfOES")) == NULL) || r; - r = ((glClipPlanefOES = (PFNGLCLIPPLANEFOESPROC)glewGetProcAddress((const GLubyte*)"glClipPlanefOES")) == NULL) || r; - r = ((glDepthRangefOES = (PFNGLDEPTHRANGEFOESPROC)glewGetProcAddress((const GLubyte*)"glDepthRangefOES")) == NULL) || r; - r = ((glFrustumfOES = (PFNGLFRUSTUMFOESPROC)glewGetProcAddress((const GLubyte*)"glFrustumfOES")) == NULL) || r; - r = ((glGetClipPlanefOES = (PFNGLGETCLIPPLANEFOESPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanefOES")) == NULL) || r; - r = ((glOrthofOES = (PFNGLORTHOFOESPROC)glewGetProcAddress((const GLubyte*)"glOrthofOES")) == NULL) || r; - - return r; -} - -#endif /* GL_OES_single_precision */ - -#ifdef GL_OES_texture_3D - -static GLboolean _glewInit_GL_OES_texture_3D () -{ - GLboolean r = GL_FALSE; - - r = ((glCompressedTexImage3DOES = (PFNGLCOMPRESSEDTEXIMAGE3DOESPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3DOES")) == NULL) || r; - r = ((glCompressedTexSubImage3DOES = (PFNGLCOMPRESSEDTEXSUBIMAGE3DOESPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3DOES")) == NULL) || r; - r = ((glCopyTexSubImage3DOES = (PFNGLCOPYTEXSUBIMAGE3DOESPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3DOES")) == NULL) || r; - r = ((glFramebufferTexture3DOES = (PFNGLFRAMEBUFFERTEXTURE3DOESPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3DOES")) == NULL) || r; - r = ((glTexImage3DOES = (PFNGLTEXIMAGE3DOESPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DOES")) == NULL) || r; - r = ((glTexSubImage3DOES = (PFNGLTEXSUBIMAGE3DOESPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3DOES")) == NULL) || r; - - return r; -} - -#endif /* GL_OES_texture_3D */ - -#ifdef GL_OES_texture_border_clamp - -static GLboolean _glewInit_GL_OES_texture_border_clamp () -{ - GLboolean r = GL_FALSE; - - r = ((glGetSamplerParameterIivOES = (PFNGLGETSAMPLERPARAMETERIIVOESPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIivOES")) == NULL) || r; - r = ((glGetSamplerParameterIuivOES = (PFNGLGETSAMPLERPARAMETERIUIVOESPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIuivOES")) == NULL) || r; - r = ((glGetTexParameterIivOES = (PFNGLGETTEXPARAMETERIIVOESPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIivOES")) == NULL) || r; - r = ((glGetTexParameterIuivOES = (PFNGLGETTEXPARAMETERIUIVOESPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIuivOES")) == NULL) || r; - r = ((glSamplerParameterIivOES = (PFNGLSAMPLERPARAMETERIIVOESPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIivOES")) == NULL) || r; - r = ((glSamplerParameterIuivOES = (PFNGLSAMPLERPARAMETERIUIVOESPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIuivOES")) == NULL) || r; - r = ((glTexParameterIivOES = (PFNGLTEXPARAMETERIIVOESPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIivOES")) == NULL) || r; - r = ((glTexParameterIuivOES = (PFNGLTEXPARAMETERIUIVOESPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIuivOES")) == NULL) || r; - - return r; -} - -#endif /* GL_OES_texture_border_clamp */ - -#ifdef GL_OES_texture_buffer - -static GLboolean _glewInit_GL_OES_texture_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((glTexBufferOES = (PFNGLTEXBUFFEROESPROC)glewGetProcAddress((const GLubyte*)"glTexBufferOES")) == NULL) || r; - r = ((glTexBufferRangeOES = (PFNGLTEXBUFFERRANGEOESPROC)glewGetProcAddress((const GLubyte*)"glTexBufferRangeOES")) == NULL) || r; - - return r; -} - -#endif /* GL_OES_texture_buffer */ - -#ifdef GL_OES_texture_cube_map - -static GLboolean _glewInit_GL_OES_texture_cube_map () -{ - GLboolean r = GL_FALSE; - - r = ((glGetTexGenfvOES = (PFNGLGETTEXGENFVOESPROC)glewGetProcAddress((const GLubyte*)"glGetTexGenfvOES")) == NULL) || r; - r = ((glGetTexGenivOES = (PFNGLGETTEXGENIVOESPROC)glewGetProcAddress((const GLubyte*)"glGetTexGenivOES")) == NULL) || r; - r = ((glGetTexGenxvOES = (PFNGLGETTEXGENXVOESPROC)glewGetProcAddress((const GLubyte*)"glGetTexGenxvOES")) == NULL) || r; - r = ((glTexGenfOES = (PFNGLTEXGENFOESPROC)glewGetProcAddress((const GLubyte*)"glTexGenfOES")) == NULL) || r; - r = ((glTexGenfvOES = (PFNGLTEXGENFVOESPROC)glewGetProcAddress((const GLubyte*)"glTexGenfvOES")) == NULL) || r; - r = ((glTexGeniOES = (PFNGLTEXGENIOESPROC)glewGetProcAddress((const GLubyte*)"glTexGeniOES")) == NULL) || r; - r = ((glTexGenivOES = (PFNGLTEXGENIVOESPROC)glewGetProcAddress((const GLubyte*)"glTexGenivOES")) == NULL) || r; - r = ((glTexGenxOES = (PFNGLTEXGENXOESPROC)glewGetProcAddress((const GLubyte*)"glTexGenxOES")) == NULL) || r; - r = ((glTexGenxvOES = (PFNGLTEXGENXVOESPROC)glewGetProcAddress((const GLubyte*)"glTexGenxvOES")) == NULL) || r; - - return r; -} - -#endif /* GL_OES_texture_cube_map */ - -#ifdef GL_OES_texture_storage_multisample_2d_array - -static GLboolean _glewInit_GL_OES_texture_storage_multisample_2d_array () -{ - GLboolean r = GL_FALSE; - - r = ((glTexStorage3DMultisampleOES = (PFNGLTEXSTORAGE3DMULTISAMPLEOESPROC)glewGetProcAddress((const GLubyte*)"glTexStorage3DMultisampleOES")) == NULL) || r; - - return r; -} - -#endif /* GL_OES_texture_storage_multisample_2d_array */ - -#ifdef GL_OES_texture_view - -static GLboolean _glewInit_GL_OES_texture_view () -{ - GLboolean r = GL_FALSE; - - r = ((glTextureViewOES = (PFNGLTEXTUREVIEWOESPROC)glewGetProcAddress((const GLubyte*)"glTextureViewOES")) == NULL) || r; - - return r; -} - -#endif /* GL_OES_texture_view */ - -#ifdef GL_OES_vertex_array_object - -static GLboolean _glewInit_GL_OES_vertex_array_object () -{ - GLboolean r = GL_FALSE; - - r = ((glBindVertexArrayOES = (PFNGLBINDVERTEXARRAYOESPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArrayOES")) == NULL) || r; - r = ((glDeleteVertexArraysOES = (PFNGLDELETEVERTEXARRAYSOESPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArraysOES")) == NULL) || r; - r = ((glGenVertexArraysOES = (PFNGLGENVERTEXARRAYSOESPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArraysOES")) == NULL) || r; - r = ((glIsVertexArrayOES = (PFNGLISVERTEXARRAYOESPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArrayOES")) == NULL) || r; - - return r; -} - -#endif /* GL_OES_vertex_array_object */ - -#ifdef GL_OVR_multiview - -static GLboolean _glewInit_GL_OVR_multiview () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferTextureMultiviewOVR = (PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureMultiviewOVR")) == NULL) || r; - r = ((glNamedFramebufferTextureMultiviewOVR = (PFNGLNAMEDFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureMultiviewOVR")) == NULL) || r; - - return r; -} - -#endif /* GL_OVR_multiview */ - -#ifdef GL_OVR_multiview_multisampled_render_to_texture - -static GLboolean _glewInit_GL_OVR_multiview_multisampled_render_to_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferTextureMultisampleMultiviewOVR = (PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureMultisampleMultiviewOVR")) == NULL) || r; - - return r; -} - -#endif /* GL_OVR_multiview_multisampled_render_to_texture */ - -#ifdef GL_QCOM_alpha_test - -static GLboolean _glewInit_GL_QCOM_alpha_test () -{ - GLboolean r = GL_FALSE; - - r = ((glAlphaFuncQCOM = (PFNGLALPHAFUNCQCOMPROC)glewGetProcAddress((const GLubyte*)"glAlphaFuncQCOM")) == NULL) || r; - - return r; -} - -#endif /* GL_QCOM_alpha_test */ - -#ifdef GL_QCOM_driver_control - -static GLboolean _glewInit_GL_QCOM_driver_control () -{ - GLboolean r = GL_FALSE; - - r = ((glDisableDriverControlQCOM = (PFNGLDISABLEDRIVERCONTROLQCOMPROC)glewGetProcAddress((const GLubyte*)"glDisableDriverControlQCOM")) == NULL) || r; - r = ((glEnableDriverControlQCOM = (PFNGLENABLEDRIVERCONTROLQCOMPROC)glewGetProcAddress((const GLubyte*)"glEnableDriverControlQCOM")) == NULL) || r; - r = ((glGetDriverControlStringQCOM = (PFNGLGETDRIVERCONTROLSTRINGQCOMPROC)glewGetProcAddress((const GLubyte*)"glGetDriverControlStringQCOM")) == NULL) || r; - r = ((glGetDriverControlsQCOM = (PFNGLGETDRIVERCONTROLSQCOMPROC)glewGetProcAddress((const GLubyte*)"glGetDriverControlsQCOM")) == NULL) || r; - - return r; -} - -#endif /* GL_QCOM_driver_control */ - -#ifdef GL_QCOM_extended_get - -static GLboolean _glewInit_GL_QCOM_extended_get () -{ - GLboolean r = GL_FALSE; - - r = ((glExtGetBufferPointervQCOM = (PFNGLEXTGETBUFFERPOINTERVQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetBufferPointervQCOM")) == NULL) || r; - r = ((glExtGetBuffersQCOM = (PFNGLEXTGETBUFFERSQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetBuffersQCOM")) == NULL) || r; - r = ((glExtGetFramebuffersQCOM = (PFNGLEXTGETFRAMEBUFFERSQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetFramebuffersQCOM")) == NULL) || r; - r = ((glExtGetRenderbuffersQCOM = (PFNGLEXTGETRENDERBUFFERSQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetRenderbuffersQCOM")) == NULL) || r; - r = ((glExtGetTexLevelParameterivQCOM = (PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetTexLevelParameterivQCOM")) == NULL) || r; - r = ((glExtGetTexSubImageQCOM = (PFNGLEXTGETTEXSUBIMAGEQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetTexSubImageQCOM")) == NULL) || r; - r = ((glExtGetTexturesQCOM = (PFNGLEXTGETTEXTURESQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetTexturesQCOM")) == NULL) || r; - r = ((glExtTexObjectStateOverrideiQCOM = (PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtTexObjectStateOverrideiQCOM")) == NULL) || r; - - return r; -} - -#endif /* GL_QCOM_extended_get */ - -#ifdef GL_QCOM_extended_get2 - -static GLboolean _glewInit_GL_QCOM_extended_get2 () -{ - GLboolean r = GL_FALSE; - - r = ((glExtGetProgramBinarySourceQCOM = (PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetProgramBinarySourceQCOM")) == NULL) || r; - r = ((glExtGetProgramsQCOM = (PFNGLEXTGETPROGRAMSQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetProgramsQCOM")) == NULL) || r; - r = ((glExtGetShadersQCOM = (PFNGLEXTGETSHADERSQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetShadersQCOM")) == NULL) || r; - r = ((glExtIsProgramBinaryQCOM = (PFNGLEXTISPROGRAMBINARYQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtIsProgramBinaryQCOM")) == NULL) || r; - - return r; -} - -#endif /* GL_QCOM_extended_get2 */ - -#ifdef GL_QCOM_framebuffer_foveated - -static GLboolean _glewInit_GL_QCOM_framebuffer_foveated () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferFoveationConfigQCOM = (PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC)glewGetProcAddress((const GLubyte*)"glFramebufferFoveationConfigQCOM")) == NULL) || r; - r = ((glFramebufferFoveationParametersQCOM = (PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC)glewGetProcAddress((const GLubyte*)"glFramebufferFoveationParametersQCOM")) == NULL) || r; - - return r; -} - -#endif /* GL_QCOM_framebuffer_foveated */ - -#ifdef GL_QCOM_shader_framebuffer_fetch_noncoherent - -static GLboolean _glewInit_GL_QCOM_shader_framebuffer_fetch_noncoherent () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferFetchBarrierQCOM = (PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC)glewGetProcAddress((const GLubyte*)"glFramebufferFetchBarrierQCOM")) == NULL) || r; - - return r; -} - -#endif /* GL_QCOM_shader_framebuffer_fetch_noncoherent */ - -#ifdef GL_QCOM_texture_foveated - -static GLboolean _glewInit_GL_QCOM_texture_foveated () -{ - GLboolean r = GL_FALSE; - - r = ((glTextureFoveationParametersQCOM = (PFNGLTEXTUREFOVEATIONPARAMETERSQCOMPROC)glewGetProcAddress((const GLubyte*)"glTextureFoveationParametersQCOM")) == NULL) || r; - - return r; -} - -#endif /* GL_QCOM_texture_foveated */ - -#ifdef GL_QCOM_tiled_rendering - -static GLboolean _glewInit_GL_QCOM_tiled_rendering () -{ - GLboolean r = GL_FALSE; - - r = ((glEndTilingQCOM = (PFNGLENDTILINGQCOMPROC)glewGetProcAddress((const GLubyte*)"glEndTilingQCOM")) == NULL) || r; - r = ((glStartTilingQCOM = (PFNGLSTARTTILINGQCOMPROC)glewGetProcAddress((const GLubyte*)"glStartTilingQCOM")) == NULL) || r; - - return r; -} - -#endif /* GL_QCOM_tiled_rendering */ - -#ifdef GL_REGAL_ES1_0_compatibility - -static GLboolean _glewInit_GL_REGAL_ES1_0_compatibility () -{ - GLboolean r = GL_FALSE; - - r = ((glAlphaFuncx = (PFNGLALPHAFUNCXPROC)glewGetProcAddress((const GLubyte*)"glAlphaFuncx")) == NULL) || r; - r = ((glClearColorx = (PFNGLCLEARCOLORXPROC)glewGetProcAddress((const GLubyte*)"glClearColorx")) == NULL) || r; - r = ((glClearDepthx = (PFNGLCLEARDEPTHXPROC)glewGetProcAddress((const GLubyte*)"glClearDepthx")) == NULL) || r; - r = ((glColor4x = (PFNGLCOLOR4XPROC)glewGetProcAddress((const GLubyte*)"glColor4x")) == NULL) || r; - r = ((glDepthRangex = (PFNGLDEPTHRANGEXPROC)glewGetProcAddress((const GLubyte*)"glDepthRangex")) == NULL) || r; - r = ((glFogx = (PFNGLFOGXPROC)glewGetProcAddress((const GLubyte*)"glFogx")) == NULL) || r; - r = ((glFogxv = (PFNGLFOGXVPROC)glewGetProcAddress((const GLubyte*)"glFogxv")) == NULL) || r; - r = ((glFrustumf = (PFNGLFRUSTUMFPROC)glewGetProcAddress((const GLubyte*)"glFrustumf")) == NULL) || r; - r = ((glFrustumx = (PFNGLFRUSTUMXPROC)glewGetProcAddress((const GLubyte*)"glFrustumx")) == NULL) || r; - r = ((glLightModelx = (PFNGLLIGHTMODELXPROC)glewGetProcAddress((const GLubyte*)"glLightModelx")) == NULL) || r; - r = ((glLightModelxv = (PFNGLLIGHTMODELXVPROC)glewGetProcAddress((const GLubyte*)"glLightModelxv")) == NULL) || r; - r = ((glLightx = (PFNGLLIGHTXPROC)glewGetProcAddress((const GLubyte*)"glLightx")) == NULL) || r; - r = ((glLightxv = (PFNGLLIGHTXVPROC)glewGetProcAddress((const GLubyte*)"glLightxv")) == NULL) || r; - r = ((glLineWidthx = (PFNGLLINEWIDTHXPROC)glewGetProcAddress((const GLubyte*)"glLineWidthx")) == NULL) || r; - r = ((glLoadMatrixx = (PFNGLLOADMATRIXXPROC)glewGetProcAddress((const GLubyte*)"glLoadMatrixx")) == NULL) || r; - r = ((glMaterialx = (PFNGLMATERIALXPROC)glewGetProcAddress((const GLubyte*)"glMaterialx")) == NULL) || r; - r = ((glMaterialxv = (PFNGLMATERIALXVPROC)glewGetProcAddress((const GLubyte*)"glMaterialxv")) == NULL) || r; - r = ((glMultMatrixx = (PFNGLMULTMATRIXXPROC)glewGetProcAddress((const GLubyte*)"glMultMatrixx")) == NULL) || r; - r = ((glMultiTexCoord4x = (PFNGLMULTITEXCOORD4XPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4x")) == NULL) || r; - r = ((glNormal3x = (PFNGLNORMAL3XPROC)glewGetProcAddress((const GLubyte*)"glNormal3x")) == NULL) || r; - r = ((glOrthof = (PFNGLORTHOFPROC)glewGetProcAddress((const GLubyte*)"glOrthof")) == NULL) || r; - r = ((glOrthox = (PFNGLORTHOXPROC)glewGetProcAddress((const GLubyte*)"glOrthox")) == NULL) || r; - r = ((glPointSizex = (PFNGLPOINTSIZEXPROC)glewGetProcAddress((const GLubyte*)"glPointSizex")) == NULL) || r; - r = ((glPolygonOffsetx = (PFNGLPOLYGONOFFSETXPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetx")) == NULL) || r; - r = ((glRotatex = (PFNGLROTATEXPROC)glewGetProcAddress((const GLubyte*)"glRotatex")) == NULL) || r; - r = ((glSampleCoveragex = (PFNGLSAMPLECOVERAGEXPROC)glewGetProcAddress((const GLubyte*)"glSampleCoveragex")) == NULL) || r; - r = ((glScalex = (PFNGLSCALEXPROC)glewGetProcAddress((const GLubyte*)"glScalex")) == NULL) || r; - r = ((glTexEnvx = (PFNGLTEXENVXPROC)glewGetProcAddress((const GLubyte*)"glTexEnvx")) == NULL) || r; - r = ((glTexEnvxv = (PFNGLTEXENVXVPROC)glewGetProcAddress((const GLubyte*)"glTexEnvxv")) == NULL) || r; - r = ((glTexParameterx = (PFNGLTEXPARAMETERXPROC)glewGetProcAddress((const GLubyte*)"glTexParameterx")) == NULL) || r; - r = ((glTranslatex = (PFNGLTRANSLATEXPROC)glewGetProcAddress((const GLubyte*)"glTranslatex")) == NULL) || r; - - return r; -} - -#endif /* GL_REGAL_ES1_0_compatibility */ - -#ifdef GL_REGAL_ES1_1_compatibility - -static GLboolean _glewInit_GL_REGAL_ES1_1_compatibility () -{ - GLboolean r = GL_FALSE; - - r = ((glClipPlanef = (PFNGLCLIPPLANEFPROC)glewGetProcAddress((const GLubyte*)"glClipPlanef")) == NULL) || r; - r = ((glClipPlanex = (PFNGLCLIPPLANEXPROC)glewGetProcAddress((const GLubyte*)"glClipPlanex")) == NULL) || r; - r = ((glGetClipPlanef = (PFNGLGETCLIPPLANEFPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanef")) == NULL) || r; - r = ((glGetClipPlanex = (PFNGLGETCLIPPLANEXPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanex")) == NULL) || r; - r = ((glGetFixedv = (PFNGLGETFIXEDVPROC)glewGetProcAddress((const GLubyte*)"glGetFixedv")) == NULL) || r; - r = ((glGetLightxv = (PFNGLGETLIGHTXVPROC)glewGetProcAddress((const GLubyte*)"glGetLightxv")) == NULL) || r; - r = ((glGetMaterialxv = (PFNGLGETMATERIALXVPROC)glewGetProcAddress((const GLubyte*)"glGetMaterialxv")) == NULL) || r; - r = ((glGetTexEnvxv = (PFNGLGETTEXENVXVPROC)glewGetProcAddress((const GLubyte*)"glGetTexEnvxv")) == NULL) || r; - r = ((glGetTexParameterxv = (PFNGLGETTEXPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterxv")) == NULL) || r; - r = ((glPointParameterx = (PFNGLPOINTPARAMETERXPROC)glewGetProcAddress((const GLubyte*)"glPointParameterx")) == NULL) || r; - r = ((glPointParameterxv = (PFNGLPOINTPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterxv")) == NULL) || r; - r = ((glPointSizePointerOES = (PFNGLPOINTSIZEPOINTEROESPROC)glewGetProcAddress((const GLubyte*)"glPointSizePointerOES")) == NULL) || r; - r = ((glTexParameterxv = (PFNGLTEXPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterxv")) == NULL) || r; - - return r; -} - -#endif /* GL_REGAL_ES1_1_compatibility */ - -#ifdef GL_REGAL_error_string - -static GLboolean _glewInit_GL_REGAL_error_string () -{ - GLboolean r = GL_FALSE; - - r = ((glErrorStringREGAL = (PFNGLERRORSTRINGREGALPROC)glewGetProcAddress((const GLubyte*)"glErrorStringREGAL")) == NULL) || r; - - return r; -} - -#endif /* GL_REGAL_error_string */ - -#ifdef GL_REGAL_extension_query - -static GLboolean _glewInit_GL_REGAL_extension_query () -{ - GLboolean r = GL_FALSE; - - r = ((glGetExtensionREGAL = (PFNGLGETEXTENSIONREGALPROC)glewGetProcAddress((const GLubyte*)"glGetExtensionREGAL")) == NULL) || r; - r = ((glIsSupportedREGAL = (PFNGLISSUPPORTEDREGALPROC)glewGetProcAddress((const GLubyte*)"glIsSupportedREGAL")) == NULL) || r; - - return r; -} - -#endif /* GL_REGAL_extension_query */ - -#ifdef GL_REGAL_log - -static GLboolean _glewInit_GL_REGAL_log () -{ - GLboolean r = GL_FALSE; - - r = ((glLogMessageCallbackREGAL = (PFNGLLOGMESSAGECALLBACKREGALPROC)glewGetProcAddress((const GLubyte*)"glLogMessageCallbackREGAL")) == NULL) || r; - - return r; -} - -#endif /* GL_REGAL_log */ - -#ifdef GL_REGAL_proc_address - -static GLboolean _glewInit_GL_REGAL_proc_address () -{ - GLboolean r = GL_FALSE; - - r = ((glGetProcAddressREGAL = (PFNGLGETPROCADDRESSREGALPROC)glewGetProcAddress((const GLubyte*)"glGetProcAddressREGAL")) == NULL) || r; - - return r; -} - -#endif /* GL_REGAL_proc_address */ - -#ifdef GL_SGIS_detail_texture - -static GLboolean _glewInit_GL_SGIS_detail_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glDetailTexFuncSGIS = (PFNGLDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glDetailTexFuncSGIS")) == NULL) || r; - r = ((glGetDetailTexFuncSGIS = (PFNGLGETDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetDetailTexFuncSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_detail_texture */ - -#ifdef GL_SGIS_fog_function - -static GLboolean _glewInit_GL_SGIS_fog_function () -{ - GLboolean r = GL_FALSE; - - r = ((glFogFuncSGIS = (PFNGLFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glFogFuncSGIS")) == NULL) || r; - r = ((glGetFogFuncSGIS = (PFNGLGETFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetFogFuncSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_fog_function */ - -#ifdef GL_SGIS_multisample - -static GLboolean _glewInit_GL_SGIS_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glSampleMaskSGIS = (PFNGLSAMPLEMASKSGISPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskSGIS")) == NULL) || r; - r = ((glSamplePatternSGIS = (PFNGLSAMPLEPATTERNSGISPROC)glewGetProcAddress((const GLubyte*)"glSamplePatternSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_multisample */ - -#ifdef GL_SGIS_multitexture - -static GLboolean _glewInit_GL_SGIS_multitexture () -{ - GLboolean r = GL_FALSE; - - r = ((glInterleavedTextureCoordSetsSGIS = (PFNGLINTERLEAVEDTEXTURECOORDSETSSGISPROC)glewGetProcAddress((const GLubyte*)"glInterleavedTextureCoordSetsSGIS")) == NULL) || r; - r = ((glSelectTextureCoordSetSGIS = (PFNGLSELECTTEXTURECOORDSETSGISPROC)glewGetProcAddress((const GLubyte*)"glSelectTextureCoordSetSGIS")) == NULL) || r; - r = ((glSelectTextureSGIS = (PFNGLSELECTTEXTURESGISPROC)glewGetProcAddress((const GLubyte*)"glSelectTextureSGIS")) == NULL) || r; - r = ((glSelectTextureTransformSGIS = (PFNGLSELECTTEXTURETRANSFORMSGISPROC)glewGetProcAddress((const GLubyte*)"glSelectTextureTransformSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_multitexture */ - -#ifdef GL_SGIS_shared_multisample - -static GLboolean _glewInit_GL_SGIS_shared_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glMultisampleSubRectPosSGIS = (PFNGLMULTISAMPLESUBRECTPOSSGISPROC)glewGetProcAddress((const GLubyte*)"glMultisampleSubRectPosSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_shared_multisample */ - -#ifdef GL_SGIS_sharpen_texture - -static GLboolean _glewInit_GL_SGIS_sharpen_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glGetSharpenTexFuncSGIS = (PFNGLGETSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetSharpenTexFuncSGIS")) == NULL) || r; - r = ((glSharpenTexFuncSGIS = (PFNGLSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glSharpenTexFuncSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_sharpen_texture */ - -#ifdef GL_SGIS_texture4D - -static GLboolean _glewInit_GL_SGIS_texture4D () -{ - GLboolean r = GL_FALSE; - - r = ((glTexImage4DSGIS = (PFNGLTEXIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)"glTexImage4DSGIS")) == NULL) || r; - r = ((glTexSubImage4DSGIS = (PFNGLTEXSUBIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage4DSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_texture4D */ - -#ifdef GL_SGIS_texture_filter4 - -static GLboolean _glewInit_GL_SGIS_texture_filter4 () -{ - GLboolean r = GL_FALSE; - - r = ((glGetTexFilterFuncSGIS = (PFNGLGETTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetTexFilterFuncSGIS")) == NULL) || r; - r = ((glTexFilterFuncSGIS = (PFNGLTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glTexFilterFuncSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_texture_filter4 */ - -#ifdef GL_SGIX_async - -static GLboolean _glewInit_GL_SGIX_async () -{ - GLboolean r = GL_FALSE; - - r = ((glAsyncMarkerSGIX = (PFNGLASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)"glAsyncMarkerSGIX")) == NULL) || r; - r = ((glDeleteAsyncMarkersSGIX = (PFNGLDELETEASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glDeleteAsyncMarkersSGIX")) == NULL) || r; - r = ((glFinishAsyncSGIX = (PFNGLFINISHASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glFinishAsyncSGIX")) == NULL) || r; - r = ((glGenAsyncMarkersSGIX = (PFNGLGENASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glGenAsyncMarkersSGIX")) == NULL) || r; - r = ((glIsAsyncMarkerSGIX = (PFNGLISASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)"glIsAsyncMarkerSGIX")) == NULL) || r; - r = ((glPollAsyncSGIX = (PFNGLPOLLASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glPollAsyncSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_async */ - -#ifdef GL_SGIX_datapipe - -static GLboolean _glewInit_GL_SGIX_datapipe () -{ - GLboolean r = GL_FALSE; - - r = ((glAddressSpace = (PFNGLADDRESSSPACEPROC)glewGetProcAddress((const GLubyte*)"glAddressSpace")) == NULL) || r; - r = ((glDataPipe = (PFNGLDATAPIPEPROC)glewGetProcAddress((const GLubyte*)"glDataPipe")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_datapipe */ - -#ifdef GL_SGIX_flush_raster - -static GLboolean _glewInit_GL_SGIX_flush_raster () -{ - GLboolean r = GL_FALSE; - - r = ((glFlushRasterSGIX = (PFNGLFLUSHRASTERSGIXPROC)glewGetProcAddress((const GLubyte*)"glFlushRasterSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_flush_raster */ - -#ifdef GL_SGIX_fog_layers - -static GLboolean _glewInit_GL_SGIX_fog_layers () -{ - GLboolean r = GL_FALSE; - - r = ((glFogLayersSGIX = (PFNGLFOGLAYERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glFogLayersSGIX")) == NULL) || r; - r = ((glGetFogLayersSGIX = (PFNGLGETFOGLAYERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFogLayersSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_fog_layers */ - -#ifdef GL_SGIX_fog_texture - -static GLboolean _glewInit_GL_SGIX_fog_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glTextureFogSGIX = (PFNGLTEXTUREFOGSGIXPROC)glewGetProcAddress((const GLubyte*)"glTextureFogSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_fog_texture */ - -#ifdef GL_SGIX_fragment_specular_lighting - -static GLboolean _glewInit_GL_SGIX_fragment_specular_lighting () -{ - GLboolean r = GL_FALSE; - - r = ((glFragmentColorMaterialSGIX = (PFNGLFRAGMENTCOLORMATERIALSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentColorMaterialSGIX")) == NULL) || r; - r = ((glFragmentLightModelfSGIX = (PFNGLFRAGMENTLIGHTMODELFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfSGIX")) == NULL) || r; - r = ((glFragmentLightModelfvSGIX = (PFNGLFRAGMENTLIGHTMODELFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfvSGIX")) == NULL) || r; - r = ((glFragmentLightModeliSGIX = (PFNGLFRAGMENTLIGHTMODELISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModeliSGIX")) == NULL) || r; - r = ((glFragmentLightModelivSGIX = (PFNGLFRAGMENTLIGHTMODELIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelivSGIX")) == NULL) || r; - r = ((glFragmentLightfSGIX = (PFNGLFRAGMENTLIGHTFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfSGIX")) == NULL) || r; - r = ((glFragmentLightfvSGIX = (PFNGLFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfvSGIX")) == NULL) || r; - r = ((glFragmentLightiSGIX = (PFNGLFRAGMENTLIGHTISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightiSGIX")) == NULL) || r; - r = ((glFragmentLightivSGIX = (PFNGLFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightivSGIX")) == NULL) || r; - r = ((glFragmentMaterialfSGIX = (PFNGLFRAGMENTMATERIALFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfSGIX")) == NULL) || r; - r = ((glFragmentMaterialfvSGIX = (PFNGLFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfvSGIX")) == NULL) || r; - r = ((glFragmentMaterialiSGIX = (PFNGLFRAGMENTMATERIALISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialiSGIX")) == NULL) || r; - r = ((glFragmentMaterialivSGIX = (PFNGLFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialivSGIX")) == NULL) || r; - r = ((glGetFragmentLightfvSGIX = (PFNGLGETFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightfvSGIX")) == NULL) || r; - r = ((glGetFragmentLightivSGIX = (PFNGLGETFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightivSGIX")) == NULL) || r; - r = ((glGetFragmentMaterialfvSGIX = (PFNGLGETFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialfvSGIX")) == NULL) || r; - r = ((glGetFragmentMaterialivSGIX = (PFNGLGETFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialivSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_fragment_specular_lighting */ - -#ifdef GL_SGIX_framezoom - -static GLboolean _glewInit_GL_SGIX_framezoom () -{ - GLboolean r = GL_FALSE; - - r = ((glFrameZoomSGIX = (PFNGLFRAMEZOOMSGIXPROC)glewGetProcAddress((const GLubyte*)"glFrameZoomSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_framezoom */ - -#ifdef GL_SGIX_igloo_interface - -static GLboolean _glewInit_GL_SGIX_igloo_interface () -{ - GLboolean r = GL_FALSE; - - r = ((glIglooInterfaceSGIX = (PFNGLIGLOOINTERFACESGIXPROC)glewGetProcAddress((const GLubyte*)"glIglooInterfaceSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_igloo_interface */ - -#ifdef GL_SGIX_mpeg1 - -static GLboolean _glewInit_GL_SGIX_mpeg1 () -{ - GLboolean r = GL_FALSE; - - r = ((glAllocMPEGPredictorsSGIX = (PFNGLALLOCMPEGPREDICTORSSGIXPROC)glewGetProcAddress((const GLubyte*)"glAllocMPEGPredictorsSGIX")) == NULL) || r; - r = ((glDeleteMPEGPredictorsSGIX = (PFNGLDELETEMPEGPREDICTORSSGIXPROC)glewGetProcAddress((const GLubyte*)"glDeleteMPEGPredictorsSGIX")) == NULL) || r; - r = ((glGenMPEGPredictorsSGIX = (PFNGLGENMPEGPREDICTORSSGIXPROC)glewGetProcAddress((const GLubyte*)"glGenMPEGPredictorsSGIX")) == NULL) || r; - r = ((glGetMPEGParameterfvSGIX = (PFNGLGETMPEGPARAMETERFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetMPEGParameterfvSGIX")) == NULL) || r; - r = ((glGetMPEGParameterivSGIX = (PFNGLGETMPEGPARAMETERIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetMPEGParameterivSGIX")) == NULL) || r; - r = ((glGetMPEGPredictorSGIX = (PFNGLGETMPEGPREDICTORSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetMPEGPredictorSGIX")) == NULL) || r; - r = ((glGetMPEGQuantTableubv = (PFNGLGETMPEGQUANTTABLEUBVPROC)glewGetProcAddress((const GLubyte*)"glGetMPEGQuantTableubv")) == NULL) || r; - r = ((glIsMPEGPredictorSGIX = (PFNGLISMPEGPREDICTORSGIXPROC)glewGetProcAddress((const GLubyte*)"glIsMPEGPredictorSGIX")) == NULL) || r; - r = ((glMPEGPredictorSGIX = (PFNGLMPEGPREDICTORSGIXPROC)glewGetProcAddress((const GLubyte*)"glMPEGPredictorSGIX")) == NULL) || r; - r = ((glMPEGQuantTableubv = (PFNGLMPEGQUANTTABLEUBVPROC)glewGetProcAddress((const GLubyte*)"glMPEGQuantTableubv")) == NULL) || r; - r = ((glSwapMPEGPredictorsSGIX = (PFNGLSWAPMPEGPREDICTORSSGIXPROC)glewGetProcAddress((const GLubyte*)"glSwapMPEGPredictorsSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_mpeg1 */ - -#ifdef GL_SGIX_nonlinear_lighting_pervertex - -static GLboolean _glewInit_GL_SGIX_nonlinear_lighting_pervertex () -{ - GLboolean r = GL_FALSE; - - r = ((glGetNonlinLightfvSGIX = (PFNGLGETNONLINLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetNonlinLightfvSGIX")) == NULL) || r; - r = ((glGetNonlinMaterialfvSGIX = (PFNGLGETNONLINMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetNonlinMaterialfvSGIX")) == NULL) || r; - r = ((glNonlinLightfvSGIX = (PFNGLNONLINLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glNonlinLightfvSGIX")) == NULL) || r; - r = ((glNonlinMaterialfvSGIX = (PFNGLNONLINMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glNonlinMaterialfvSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_nonlinear_lighting_pervertex */ - -#ifdef GL_SGIX_pixel_texture - -static GLboolean _glewInit_GL_SGIX_pixel_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glPixelTexGenSGIX = (PFNGLPIXELTEXGENSGIXPROC)glewGetProcAddress((const GLubyte*)"glPixelTexGenSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_pixel_texture */ - -#ifdef GL_SGIX_polynomial_ffd - -static GLboolean _glewInit_GL_SGIX_polynomial_ffd () -{ - GLboolean r = GL_FALSE; - - r = ((glDeformSGIX = (PFNGLDEFORMSGIXPROC)glewGetProcAddress((const GLubyte*)"glDeformSGIX")) == NULL) || r; - r = ((glLoadIdentityDeformationMapSGIX = (PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC)glewGetProcAddress((const GLubyte*)"glLoadIdentityDeformationMapSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_polynomial_ffd */ - -#ifdef GL_SGIX_quad_mesh - -static GLboolean _glewInit_GL_SGIX_quad_mesh () -{ - GLboolean r = GL_FALSE; - - r = ((glMeshBreadthSGIX = (PFNGLMESHBREADTHSGIXPROC)glewGetProcAddress((const GLubyte*)"glMeshBreadthSGIX")) == NULL) || r; - r = ((glMeshStrideSGIX = (PFNGLMESHSTRIDESGIXPROC)glewGetProcAddress((const GLubyte*)"glMeshStrideSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_quad_mesh */ - -#ifdef GL_SGIX_reference_plane - -static GLboolean _glewInit_GL_SGIX_reference_plane () -{ - GLboolean r = GL_FALSE; - - r = ((glReferencePlaneSGIX = (PFNGLREFERENCEPLANESGIXPROC)glewGetProcAddress((const GLubyte*)"glReferencePlaneSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_reference_plane */ - -#ifdef GL_SGIX_sprite - -static GLboolean _glewInit_GL_SGIX_sprite () -{ - GLboolean r = GL_FALSE; - - r = ((glSpriteParameterfSGIX = (PFNGLSPRITEPARAMETERFSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterfSGIX")) == NULL) || r; - r = ((glSpriteParameterfvSGIX = (PFNGLSPRITEPARAMETERFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterfvSGIX")) == NULL) || r; - r = ((glSpriteParameteriSGIX = (PFNGLSPRITEPARAMETERISGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameteriSGIX")) == NULL) || r; - r = ((glSpriteParameterivSGIX = (PFNGLSPRITEPARAMETERIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterivSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_sprite */ - -#ifdef GL_SGIX_tag_sample_buffer - -static GLboolean _glewInit_GL_SGIX_tag_sample_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((glTagSampleBufferSGIX = (PFNGLTAGSAMPLEBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glTagSampleBufferSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_tag_sample_buffer */ - -#ifdef GL_SGIX_vector_ops - -static GLboolean _glewInit_GL_SGIX_vector_ops () -{ - GLboolean r = GL_FALSE; - - r = ((glGetVectorOperationSGIX = (PFNGLGETVECTOROPERATIONSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetVectorOperationSGIX")) == NULL) || r; - r = ((glVectorOperationSGIX = (PFNGLVECTOROPERATIONSGIXPROC)glewGetProcAddress((const GLubyte*)"glVectorOperationSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_vector_ops */ - -#ifdef GL_SGIX_vertex_array_object - -static GLboolean _glewInit_GL_SGIX_vertex_array_object () -{ - GLboolean r = GL_FALSE; - - r = ((glAreVertexArraysResidentSGIX = (PFNGLAREVERTEXARRAYSRESIDENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glAreVertexArraysResidentSGIX")) == NULL) || r; - r = ((glBindVertexArraySGIX = (PFNGLBINDVERTEXARRAYSGIXPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArraySGIX")) == NULL) || r; - r = ((glDeleteVertexArraysSGIX = (PFNGLDELETEVERTEXARRAYSSGIXPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArraysSGIX")) == NULL) || r; - r = ((glGenVertexArraysSGIX = (PFNGLGENVERTEXARRAYSSGIXPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArraysSGIX")) == NULL) || r; - r = ((glIsVertexArraySGIX = (PFNGLISVERTEXARRAYSGIXPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArraySGIX")) == NULL) || r; - r = ((glPrioritizeVertexArraysSGIX = (PFNGLPRIORITIZEVERTEXARRAYSSGIXPROC)glewGetProcAddress((const GLubyte*)"glPrioritizeVertexArraysSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_vertex_array_object */ - -#ifdef GL_SGI_color_table - -static GLboolean _glewInit_GL_SGI_color_table () -{ - GLboolean r = GL_FALSE; - - r = ((glColorTableParameterfvSGI = (PFNGLCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterfvSGI")) == NULL) || r; - r = ((glColorTableParameterivSGI = (PFNGLCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterivSGI")) == NULL) || r; - r = ((glColorTableSGI = (PFNGLCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableSGI")) == NULL) || r; - r = ((glCopyColorTableSGI = (PFNGLCOPYCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glCopyColorTableSGI")) == NULL) || r; - r = ((glGetColorTableParameterfvSGI = (PFNGLGETCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfvSGI")) == NULL) || r; - r = ((glGetColorTableParameterivSGI = (PFNGLGETCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterivSGI")) == NULL) || r; - r = ((glGetColorTableSGI = (PFNGLGETCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableSGI")) == NULL) || r; - - return r; -} - -#endif /* GL_SGI_color_table */ - -#ifdef GL_SGI_fft - -static GLboolean _glewInit_GL_SGI_fft () -{ - GLboolean r = GL_FALSE; - - r = ((glGetPixelTransformParameterfvSGI = (PFNGLGETPIXELTRANSFORMPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterfvSGI")) == NULL) || r; - r = ((glGetPixelTransformParameterivSGI = (PFNGLGETPIXELTRANSFORMPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterivSGI")) == NULL) || r; - r = ((glPixelTransformParameterfSGI = (PFNGLPIXELTRANSFORMPARAMETERFSGIPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfSGI")) == NULL) || r; - r = ((glPixelTransformParameterfvSGI = (PFNGLPIXELTRANSFORMPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfvSGI")) == NULL) || r; - r = ((glPixelTransformParameteriSGI = (PFNGLPIXELTRANSFORMPARAMETERISGIPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameteriSGI")) == NULL) || r; - r = ((glPixelTransformParameterivSGI = (PFNGLPIXELTRANSFORMPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterivSGI")) == NULL) || r; - r = ((glPixelTransformSGI = (PFNGLPIXELTRANSFORMSGIPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformSGI")) == NULL) || r; - - return r; -} - -#endif /* GL_SGI_fft */ - -#ifdef GL_SUNX_constant_data - -static GLboolean _glewInit_GL_SUNX_constant_data () -{ - GLboolean r = GL_FALSE; - - r = ((glFinishTextureSUNX = (PFNGLFINISHTEXTURESUNXPROC)glewGetProcAddress((const GLubyte*)"glFinishTextureSUNX")) == NULL) || r; - - return r; -} - -#endif /* GL_SUNX_constant_data */ - -#ifdef GL_SUN_global_alpha - -static GLboolean _glewInit_GL_SUN_global_alpha () -{ - GLboolean r = GL_FALSE; - - r = ((glGlobalAlphaFactorbSUN = (PFNGLGLOBALALPHAFACTORBSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorbSUN")) == NULL) || r; - r = ((glGlobalAlphaFactordSUN = (PFNGLGLOBALALPHAFACTORDSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactordSUN")) == NULL) || r; - r = ((glGlobalAlphaFactorfSUN = (PFNGLGLOBALALPHAFACTORFSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorfSUN")) == NULL) || r; - r = ((glGlobalAlphaFactoriSUN = (PFNGLGLOBALALPHAFACTORISUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactoriSUN")) == NULL) || r; - r = ((glGlobalAlphaFactorsSUN = (PFNGLGLOBALALPHAFACTORSSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorsSUN")) == NULL) || r; - r = ((glGlobalAlphaFactorubSUN = (PFNGLGLOBALALPHAFACTORUBSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorubSUN")) == NULL) || r; - r = ((glGlobalAlphaFactoruiSUN = (PFNGLGLOBALALPHAFACTORUISUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactoruiSUN")) == NULL) || r; - r = ((glGlobalAlphaFactorusSUN = (PFNGLGLOBALALPHAFACTORUSSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorusSUN")) == NULL) || r; - - return r; -} - -#endif /* GL_SUN_global_alpha */ - -#ifdef GL_SUN_read_video_pixels - -static GLboolean _glewInit_GL_SUN_read_video_pixels () -{ - GLboolean r = GL_FALSE; - - r = ((glReadVideoPixelsSUN = (PFNGLREADVIDEOPIXELSSUNPROC)glewGetProcAddress((const GLubyte*)"glReadVideoPixelsSUN")) == NULL) || r; - - return r; -} - -#endif /* GL_SUN_read_video_pixels */ - -#ifdef GL_SUN_triangle_list - -static GLboolean _glewInit_GL_SUN_triangle_list () -{ - GLboolean r = GL_FALSE; - - r = ((glReplacementCodePointerSUN = (PFNGLREPLACEMENTCODEPOINTERSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodePointerSUN")) == NULL) || r; - r = ((glReplacementCodeubSUN = (PFNGLREPLACEMENTCODEUBSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeubSUN")) == NULL) || r; - r = ((glReplacementCodeubvSUN = (PFNGLREPLACEMENTCODEUBVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeubvSUN")) == NULL) || r; - r = ((glReplacementCodeuiSUN = (PFNGLREPLACEMENTCODEUISUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiSUN")) == NULL) || r; - r = ((glReplacementCodeuivSUN = (PFNGLREPLACEMENTCODEUIVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuivSUN")) == NULL) || r; - r = ((glReplacementCodeusSUN = (PFNGLREPLACEMENTCODEUSSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeusSUN")) == NULL) || r; - r = ((glReplacementCodeusvSUN = (PFNGLREPLACEMENTCODEUSVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeusvSUN")) == NULL) || r; - - return r; -} - -#endif /* GL_SUN_triangle_list */ - -#ifdef GL_SUN_vertex - -static GLboolean _glewInit_GL_SUN_vertex () -{ - GLboolean r = GL_FALSE; - - r = ((glColor3fVertex3fSUN = (PFNGLCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor3fVertex3fSUN")) == NULL) || r; - r = ((glColor3fVertex3fvSUN = (PFNGLCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor3fVertex3fvSUN")) == NULL) || r; - r = ((glColor4fNormal3fVertex3fSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glColor4fNormal3fVertex3fvSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glColor4ubVertex2fSUN = (PFNGLCOLOR4UBVERTEX2FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex2fSUN")) == NULL) || r; - r = ((glColor4ubVertex2fvSUN = (PFNGLCOLOR4UBVERTEX2FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex2fvSUN")) == NULL) || r; - r = ((glColor4ubVertex3fSUN = (PFNGLCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex3fSUN")) == NULL) || r; - r = ((glColor4ubVertex3fvSUN = (PFNGLCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex3fvSUN")) == NULL) || r; - r = ((glNormal3fVertex3fSUN = (PFNGLNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glNormal3fVertex3fSUN")) == NULL) || r; - r = ((glNormal3fVertex3fvSUN = (PFNGLNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor3fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor4ubVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4ubVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor4ubVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4ubVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiNormal3fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiVertex3fSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiVertex3fvSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord2fColor3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor3fVertex3fSUN")) == NULL) || r; - r = ((glTexCoord2fColor3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor3fVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord2fColor4ubVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4ubVertex3fSUN")) == NULL) || r; - r = ((glTexCoord2fColor4ubVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4ubVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord2fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glTexCoord2fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord2fVertex3fSUN = (PFNGLTEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fVertex3fSUN")) == NULL) || r; - r = ((glTexCoord2fVertex3fvSUN = (PFNGLTEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord4fColor4fNormal3fVertex4fSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fColor4fNormal3fVertex4fSUN")) == NULL) || r; - r = ((glTexCoord4fColor4fNormal3fVertex4fvSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fColor4fNormal3fVertex4fvSUN")) == NULL) || r; - r = ((glTexCoord4fVertex4fSUN = (PFNGLTEXCOORD4FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fVertex4fSUN")) == NULL) || r; - r = ((glTexCoord4fVertex4fvSUN = (PFNGLTEXCOORD4FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fVertex4fvSUN")) == NULL) || r; - - return r; -} - -#endif /* GL_SUN_vertex */ - -#ifdef GL_WIN_swap_hint - -static GLboolean _glewInit_GL_WIN_swap_hint () -{ - GLboolean r = GL_FALSE; - - r = ((glAddSwapHintRectWIN = (PFNGLADDSWAPHINTRECTWINPROC)glewGetProcAddress((const GLubyte*)"glAddSwapHintRectWIN")) == NULL) || r; - - return r; -} - -#endif /* GL_WIN_swap_hint */ - -/* ------------------------------------------------------------------------- */ - -static int _glewExtensionCompare(const char *s1, const char *s2) -{ - /* http://www.chanduthedev.com/2012/07/strcmp-implementation-in-c.html */ - while (*s1 || *s2) - { - if (*s1 > *s2) - return 1; - if (*s1 < *s2) - return -1; - s1++; - s2++; - } - return 0; -} - -static ptrdiff_t _glewBsearchExtension(const char* name) -{ - ptrdiff_t lo = 0, hi = sizeof(_glewExtensionLookup) / sizeof(char*) - 2; - - while (lo <= hi) - { - ptrdiff_t mid = (lo + hi) / 2; - const int cmp = _glewExtensionCompare(name, _glewExtensionLookup[mid]); - if (cmp < 0) hi = mid - 1; - else if (cmp > 0) lo = mid + 1; - else return mid; - } - return -1; -} - -static GLboolean *_glewGetExtensionString(const char *name) -{ - ptrdiff_t n = _glewBsearchExtension(name); - if (n >= 0) return &_glewExtensionString[n]; - return NULL; -} - -static GLboolean *_glewGetExtensionEnable(const char *name) -{ - ptrdiff_t n = _glewBsearchExtension(name); - if (n >= 0) return _glewExtensionEnabled[n]; - return NULL; -} - -static const char *_glewNextSpace(const char *i) -{ - const char *j = i; - if (j) - while (*j!=' ' && *j) ++j; - return j; -} - -static const char *_glewNextNonSpace(const char *i) -{ - const char *j = i; - if (j) - while (*j==' ') ++j; - return j; -} - -GLboolean GLEWAPIENTRY glewGetExtension (const char* name) -{ - GLboolean *enable = _glewGetExtensionString(name); - if (enable) - return *enable; - return GL_FALSE; -} - -/* ------------------------------------------------------------------------- */ - -typedef const GLubyte* (GLAPIENTRY * PFNGLGETSTRINGPROC) (GLenum name); -typedef void (GLAPIENTRY * PFNGLGETINTEGERVPROC) (GLenum pname, GLint *params); - -static GLenum GLEWAPIENTRY glewContextInit () -{ - PFNGLGETSTRINGPROC getString; - const GLubyte* s; - GLuint dot; - GLint major, minor; - - #ifdef _WIN32 - getString = glGetString; - #else - getString = (PFNGLGETSTRINGPROC) glewGetProcAddress((const GLubyte*)"glGetString"); - if (!getString) - return GLEW_ERROR_NO_GL_VERSION; - #endif - - /* query opengl version */ - s = getString(GL_VERSION); - dot = _glewStrCLen(s, '.'); - if (dot == 0) - return GLEW_ERROR_NO_GL_VERSION; - - major = s[dot-1]-'0'; - minor = s[dot+1]-'0'; - - if (minor < 0 || minor > 9) - minor = 0; - if (major<0 || major>9) - return GLEW_ERROR_NO_GL_VERSION; - - if (major == 1 && minor == 0) - { - return GLEW_ERROR_GL_VERSION_10_ONLY; - } - else - { - GLEW_VERSION_4_6 = ( major > 4 ) || ( major == 4 && minor >= 6 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_4_5 = GLEW_VERSION_4_6 == GL_TRUE || ( major == 4 && minor >= 5 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_4_4 = GLEW_VERSION_4_5 == GL_TRUE || ( major == 4 && minor >= 4 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_4_3 = GLEW_VERSION_4_4 == GL_TRUE || ( major == 4 && minor >= 3 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_4_2 = GLEW_VERSION_4_3 == GL_TRUE || ( major == 4 && minor >= 2 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_4_1 = GLEW_VERSION_4_2 == GL_TRUE || ( major == 4 && minor >= 1 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_4_0 = GLEW_VERSION_4_1 == GL_TRUE || ( major == 4 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_3_3 = GLEW_VERSION_4_0 == GL_TRUE || ( major == 3 && minor >= 3 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_3_2 = GLEW_VERSION_3_3 == GL_TRUE || ( major == 3 && minor >= 2 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_3_1 = GLEW_VERSION_3_2 == GL_TRUE || ( major == 3 && minor >= 1 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_3_0 = GLEW_VERSION_3_1 == GL_TRUE || ( major == 3 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_2_1 = GLEW_VERSION_3_0 == GL_TRUE || ( major == 2 && minor >= 1 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_2_0 = GLEW_VERSION_2_1 == GL_TRUE || ( major == 2 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_1_5 = GLEW_VERSION_2_0 == GL_TRUE || ( major == 1 && minor >= 5 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_1_4 = GLEW_VERSION_1_5 == GL_TRUE || ( major == 1 && minor >= 4 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_1_3 = GLEW_VERSION_1_4 == GL_TRUE || ( major == 1 && minor >= 3 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_1_2_1 = GLEW_VERSION_1_3 == GL_TRUE ? GL_TRUE : GL_FALSE; - GLEW_VERSION_1_2 = GLEW_VERSION_1_2_1 == GL_TRUE || ( major == 1 && minor >= 2 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_1_1 = GLEW_VERSION_1_2 == GL_TRUE || ( major == 1 && minor >= 1 ) ? GL_TRUE : GL_FALSE; - } - - { - size_t i; - for (i = 0; i < sizeof(_glewExtensionString) / sizeof(_glewExtensionString[0]); ++i) - _glewExtensionString[i] = GL_FALSE; - } - - if (GLEW_VERSION_3_0) - { - GLint n = 0; - GLint i; - PFNGLGETINTEGERVPROC getIntegerv; - PFNGLGETSTRINGIPROC getStringi; - const char *ext; - GLboolean *enable; - - #ifdef _WIN32 - getIntegerv = glGetIntegerv; - #else - getIntegerv = (PFNGLGETINTEGERVPROC) glewGetProcAddress((const GLubyte*)"glGetIntegerv"); - #endif - - if (getIntegerv) - getIntegerv(GL_NUM_EXTENSIONS, &n); - - /* glGetStringi is OpenGL 3.0 */ - getStringi = (PFNGLGETSTRINGIPROC) glewGetProcAddress((const GLubyte*)"glGetStringi"); - if (getStringi) - for (i = 0; i= (ptrdiff_t) sizeof(ext)) - continue; - _glewStrCopy(ext, i, ' '); - - /* Based on extension string(s), glewGetExtension purposes */ - enable = _glewGetExtensionString(ext); - if (enable) - *enable = GL_TRUE; - - /* Based on extension string(s), experimental mode, glewIsSupported purposes */ - enable = _glewGetExtensionEnable(ext); - if (enable) - *enable = GL_TRUE; - } - } - } -#ifdef GL_VERSION_1_2 - if (glewExperimental || GLEW_VERSION_1_2) GLEW_VERSION_1_2 = !_glewInit_GL_VERSION_1_2(); -#endif /* GL_VERSION_1_2 */ -#ifdef GL_VERSION_1_3 - if (glewExperimental || GLEW_VERSION_1_3) GLEW_VERSION_1_3 = !_glewInit_GL_VERSION_1_3(); -#endif /* GL_VERSION_1_3 */ -#ifdef GL_VERSION_1_4 - if (glewExperimental || GLEW_VERSION_1_4) GLEW_VERSION_1_4 = !_glewInit_GL_VERSION_1_4(); -#endif /* GL_VERSION_1_4 */ -#ifdef GL_VERSION_1_5 - if (glewExperimental || GLEW_VERSION_1_5) GLEW_VERSION_1_5 = !_glewInit_GL_VERSION_1_5(); -#endif /* GL_VERSION_1_5 */ -#ifdef GL_VERSION_2_0 - if (glewExperimental || GLEW_VERSION_2_0) GLEW_VERSION_2_0 = !_glewInit_GL_VERSION_2_0(); -#endif /* GL_VERSION_2_0 */ -#ifdef GL_VERSION_2_1 - if (glewExperimental || GLEW_VERSION_2_1) GLEW_VERSION_2_1 = !_glewInit_GL_VERSION_2_1(); -#endif /* GL_VERSION_2_1 */ -#ifdef GL_VERSION_3_0 - if (glewExperimental || GLEW_VERSION_3_0) GLEW_VERSION_3_0 = !_glewInit_GL_VERSION_3_0(); -#endif /* GL_VERSION_3_0 */ -#ifdef GL_VERSION_3_1 - if (glewExperimental || GLEW_VERSION_3_1) GLEW_VERSION_3_1 = !_glewInit_GL_VERSION_3_1(); -#endif /* GL_VERSION_3_1 */ -#ifdef GL_VERSION_3_2 - if (glewExperimental || GLEW_VERSION_3_2) GLEW_VERSION_3_2 = !_glewInit_GL_VERSION_3_2(); -#endif /* GL_VERSION_3_2 */ -#ifdef GL_VERSION_3_3 - if (glewExperimental || GLEW_VERSION_3_3) GLEW_VERSION_3_3 = !_glewInit_GL_VERSION_3_3(); -#endif /* GL_VERSION_3_3 */ -#ifdef GL_VERSION_4_0 - if (glewExperimental || GLEW_VERSION_4_0) GLEW_VERSION_4_0 = !_glewInit_GL_VERSION_4_0(); -#endif /* GL_VERSION_4_0 */ -#ifdef GL_VERSION_4_5 - if (glewExperimental || GLEW_VERSION_4_5) GLEW_VERSION_4_5 = !_glewInit_GL_VERSION_4_5(); -#endif /* GL_VERSION_4_5 */ -#ifdef GL_VERSION_4_6 - if (glewExperimental || GLEW_VERSION_4_6) GLEW_VERSION_4_6 = !_glewInit_GL_VERSION_4_6(); -#endif /* GL_VERSION_4_6 */ -#ifdef GL_3DFX_tbuffer - if (glewExperimental || GLEW_3DFX_tbuffer) GLEW_3DFX_tbuffer = !_glewInit_GL_3DFX_tbuffer(); -#endif /* GL_3DFX_tbuffer */ -#ifdef GL_AMD_debug_output - if (glewExperimental || GLEW_AMD_debug_output) GLEW_AMD_debug_output = !_glewInit_GL_AMD_debug_output(); -#endif /* GL_AMD_debug_output */ -#ifdef GL_AMD_draw_buffers_blend - if (glewExperimental || GLEW_AMD_draw_buffers_blend) GLEW_AMD_draw_buffers_blend = !_glewInit_GL_AMD_draw_buffers_blend(); -#endif /* GL_AMD_draw_buffers_blend */ -#ifdef GL_AMD_framebuffer_multisample_advanced - if (glewExperimental || GLEW_AMD_framebuffer_multisample_advanced) GLEW_AMD_framebuffer_multisample_advanced = !_glewInit_GL_AMD_framebuffer_multisample_advanced(); -#endif /* GL_AMD_framebuffer_multisample_advanced */ -#ifdef GL_AMD_framebuffer_sample_positions - if (glewExperimental || GLEW_AMD_framebuffer_sample_positions) GLEW_AMD_framebuffer_sample_positions = !_glewInit_GL_AMD_framebuffer_sample_positions(); -#endif /* GL_AMD_framebuffer_sample_positions */ -#ifdef GL_AMD_interleaved_elements - if (glewExperimental || GLEW_AMD_interleaved_elements) GLEW_AMD_interleaved_elements = !_glewInit_GL_AMD_interleaved_elements(); -#endif /* GL_AMD_interleaved_elements */ -#ifdef GL_AMD_multi_draw_indirect - if (glewExperimental || GLEW_AMD_multi_draw_indirect) GLEW_AMD_multi_draw_indirect = !_glewInit_GL_AMD_multi_draw_indirect(); -#endif /* GL_AMD_multi_draw_indirect */ -#ifdef GL_AMD_name_gen_delete - if (glewExperimental || GLEW_AMD_name_gen_delete) GLEW_AMD_name_gen_delete = !_glewInit_GL_AMD_name_gen_delete(); -#endif /* GL_AMD_name_gen_delete */ -#ifdef GL_AMD_occlusion_query_event - if (glewExperimental || GLEW_AMD_occlusion_query_event) GLEW_AMD_occlusion_query_event = !_glewInit_GL_AMD_occlusion_query_event(); -#endif /* GL_AMD_occlusion_query_event */ -#ifdef GL_AMD_performance_monitor - if (glewExperimental || GLEW_AMD_performance_monitor) GLEW_AMD_performance_monitor = !_glewInit_GL_AMD_performance_monitor(); -#endif /* GL_AMD_performance_monitor */ -#ifdef GL_AMD_sample_positions - if (glewExperimental || GLEW_AMD_sample_positions) GLEW_AMD_sample_positions = !_glewInit_GL_AMD_sample_positions(); -#endif /* GL_AMD_sample_positions */ -#ifdef GL_AMD_sparse_texture - if (glewExperimental || GLEW_AMD_sparse_texture) GLEW_AMD_sparse_texture = !_glewInit_GL_AMD_sparse_texture(); -#endif /* GL_AMD_sparse_texture */ -#ifdef GL_AMD_stencil_operation_extended - if (glewExperimental || GLEW_AMD_stencil_operation_extended) GLEW_AMD_stencil_operation_extended = !_glewInit_GL_AMD_stencil_operation_extended(); -#endif /* GL_AMD_stencil_operation_extended */ -#ifdef GL_AMD_vertex_shader_tessellator - if (glewExperimental || GLEW_AMD_vertex_shader_tessellator) GLEW_AMD_vertex_shader_tessellator = !_glewInit_GL_AMD_vertex_shader_tessellator(); -#endif /* GL_AMD_vertex_shader_tessellator */ -#ifdef GL_ANGLE_framebuffer_blit - if (glewExperimental || GLEW_ANGLE_framebuffer_blit) GLEW_ANGLE_framebuffer_blit = !_glewInit_GL_ANGLE_framebuffer_blit(); -#endif /* GL_ANGLE_framebuffer_blit */ -#ifdef GL_ANGLE_framebuffer_multisample - if (glewExperimental || GLEW_ANGLE_framebuffer_multisample) GLEW_ANGLE_framebuffer_multisample = !_glewInit_GL_ANGLE_framebuffer_multisample(); -#endif /* GL_ANGLE_framebuffer_multisample */ -#ifdef GL_ANGLE_instanced_arrays - if (glewExperimental || GLEW_ANGLE_instanced_arrays) GLEW_ANGLE_instanced_arrays = !_glewInit_GL_ANGLE_instanced_arrays(); -#endif /* GL_ANGLE_instanced_arrays */ -#ifdef GL_ANGLE_timer_query - if (glewExperimental || GLEW_ANGLE_timer_query) GLEW_ANGLE_timer_query = !_glewInit_GL_ANGLE_timer_query(); -#endif /* GL_ANGLE_timer_query */ -#ifdef GL_ANGLE_translated_shader_source - if (glewExperimental || GLEW_ANGLE_translated_shader_source) GLEW_ANGLE_translated_shader_source = !_glewInit_GL_ANGLE_translated_shader_source(); -#endif /* GL_ANGLE_translated_shader_source */ -#ifdef GL_APPLE_copy_texture_levels - if (glewExperimental || GLEW_APPLE_copy_texture_levels) GLEW_APPLE_copy_texture_levels = !_glewInit_GL_APPLE_copy_texture_levels(); -#endif /* GL_APPLE_copy_texture_levels */ -#ifdef GL_APPLE_element_array - if (glewExperimental || GLEW_APPLE_element_array) GLEW_APPLE_element_array = !_glewInit_GL_APPLE_element_array(); -#endif /* GL_APPLE_element_array */ -#ifdef GL_APPLE_fence - if (glewExperimental || GLEW_APPLE_fence) GLEW_APPLE_fence = !_glewInit_GL_APPLE_fence(); -#endif /* GL_APPLE_fence */ -#ifdef GL_APPLE_flush_buffer_range - if (glewExperimental || GLEW_APPLE_flush_buffer_range) GLEW_APPLE_flush_buffer_range = !_glewInit_GL_APPLE_flush_buffer_range(); -#endif /* GL_APPLE_flush_buffer_range */ -#ifdef GL_APPLE_framebuffer_multisample - if (glewExperimental || GLEW_APPLE_framebuffer_multisample) GLEW_APPLE_framebuffer_multisample = !_glewInit_GL_APPLE_framebuffer_multisample(); -#endif /* GL_APPLE_framebuffer_multisample */ -#ifdef GL_APPLE_object_purgeable - if (glewExperimental || GLEW_APPLE_object_purgeable) GLEW_APPLE_object_purgeable = !_glewInit_GL_APPLE_object_purgeable(); -#endif /* GL_APPLE_object_purgeable */ -#ifdef GL_APPLE_sync - if (glewExperimental || GLEW_APPLE_sync) GLEW_APPLE_sync = !_glewInit_GL_APPLE_sync(); -#endif /* GL_APPLE_sync */ -#ifdef GL_APPLE_texture_range - if (glewExperimental || GLEW_APPLE_texture_range) GLEW_APPLE_texture_range = !_glewInit_GL_APPLE_texture_range(); -#endif /* GL_APPLE_texture_range */ -#ifdef GL_APPLE_vertex_array_object - if (glewExperimental || GLEW_APPLE_vertex_array_object) GLEW_APPLE_vertex_array_object = !_glewInit_GL_APPLE_vertex_array_object(); -#endif /* GL_APPLE_vertex_array_object */ -#ifdef GL_APPLE_vertex_array_range - if (glewExperimental || GLEW_APPLE_vertex_array_range) GLEW_APPLE_vertex_array_range = !_glewInit_GL_APPLE_vertex_array_range(); -#endif /* GL_APPLE_vertex_array_range */ -#ifdef GL_APPLE_vertex_program_evaluators - if (glewExperimental || GLEW_APPLE_vertex_program_evaluators) GLEW_APPLE_vertex_program_evaluators = !_glewInit_GL_APPLE_vertex_program_evaluators(); -#endif /* GL_APPLE_vertex_program_evaluators */ -#ifdef GL_ARB_ES2_compatibility - if (glewExperimental || GLEW_ARB_ES2_compatibility) GLEW_ARB_ES2_compatibility = !_glewInit_GL_ARB_ES2_compatibility(); -#endif /* GL_ARB_ES2_compatibility */ -#ifdef GL_ARB_ES3_1_compatibility - if (glewExperimental || GLEW_ARB_ES3_1_compatibility) GLEW_ARB_ES3_1_compatibility = !_glewInit_GL_ARB_ES3_1_compatibility(); -#endif /* GL_ARB_ES3_1_compatibility */ -#ifdef GL_ARB_ES3_2_compatibility - if (glewExperimental || GLEW_ARB_ES3_2_compatibility) GLEW_ARB_ES3_2_compatibility = !_glewInit_GL_ARB_ES3_2_compatibility(); -#endif /* GL_ARB_ES3_2_compatibility */ -#ifdef GL_ARB_base_instance - if (glewExperimental || GLEW_ARB_base_instance) GLEW_ARB_base_instance = !_glewInit_GL_ARB_base_instance(); -#endif /* GL_ARB_base_instance */ -#ifdef GL_ARB_bindless_texture - if (glewExperimental || GLEW_ARB_bindless_texture) GLEW_ARB_bindless_texture = !_glewInit_GL_ARB_bindless_texture(); -#endif /* GL_ARB_bindless_texture */ -#ifdef GL_ARB_blend_func_extended - if (glewExperimental || GLEW_ARB_blend_func_extended) GLEW_ARB_blend_func_extended = !_glewInit_GL_ARB_blend_func_extended(); -#endif /* GL_ARB_blend_func_extended */ -#ifdef GL_ARB_buffer_storage - if (glewExperimental || GLEW_ARB_buffer_storage) GLEW_ARB_buffer_storage = !_glewInit_GL_ARB_buffer_storage(); -#endif /* GL_ARB_buffer_storage */ -#ifdef GL_ARB_cl_event - if (glewExperimental || GLEW_ARB_cl_event) GLEW_ARB_cl_event = !_glewInit_GL_ARB_cl_event(); -#endif /* GL_ARB_cl_event */ -#ifdef GL_ARB_clear_buffer_object - if (glewExperimental || GLEW_ARB_clear_buffer_object) GLEW_ARB_clear_buffer_object = !_glewInit_GL_ARB_clear_buffer_object(); -#endif /* GL_ARB_clear_buffer_object */ -#ifdef GL_ARB_clear_texture - if (glewExperimental || GLEW_ARB_clear_texture) GLEW_ARB_clear_texture = !_glewInit_GL_ARB_clear_texture(); -#endif /* GL_ARB_clear_texture */ -#ifdef GL_ARB_clip_control - if (glewExperimental || GLEW_ARB_clip_control) GLEW_ARB_clip_control = !_glewInit_GL_ARB_clip_control(); -#endif /* GL_ARB_clip_control */ -#ifdef GL_ARB_color_buffer_float - if (glewExperimental || GLEW_ARB_color_buffer_float) GLEW_ARB_color_buffer_float = !_glewInit_GL_ARB_color_buffer_float(); -#endif /* GL_ARB_color_buffer_float */ -#ifdef GL_ARB_compute_shader - if (glewExperimental || GLEW_ARB_compute_shader) GLEW_ARB_compute_shader = !_glewInit_GL_ARB_compute_shader(); -#endif /* GL_ARB_compute_shader */ -#ifdef GL_ARB_compute_variable_group_size - if (glewExperimental || GLEW_ARB_compute_variable_group_size) GLEW_ARB_compute_variable_group_size = !_glewInit_GL_ARB_compute_variable_group_size(); -#endif /* GL_ARB_compute_variable_group_size */ -#ifdef GL_ARB_copy_buffer - if (glewExperimental || GLEW_ARB_copy_buffer) GLEW_ARB_copy_buffer = !_glewInit_GL_ARB_copy_buffer(); -#endif /* GL_ARB_copy_buffer */ -#ifdef GL_ARB_copy_image - if (glewExperimental || GLEW_ARB_copy_image) GLEW_ARB_copy_image = !_glewInit_GL_ARB_copy_image(); -#endif /* GL_ARB_copy_image */ -#ifdef GL_ARB_debug_output - if (glewExperimental || GLEW_ARB_debug_output) GLEW_ARB_debug_output = !_glewInit_GL_ARB_debug_output(); -#endif /* GL_ARB_debug_output */ -#ifdef GL_ARB_direct_state_access - if (glewExperimental || GLEW_ARB_direct_state_access) GLEW_ARB_direct_state_access = !_glewInit_GL_ARB_direct_state_access(); -#endif /* GL_ARB_direct_state_access */ -#ifdef GL_ARB_draw_buffers - if (glewExperimental || GLEW_ARB_draw_buffers) GLEW_ARB_draw_buffers = !_glewInit_GL_ARB_draw_buffers(); -#endif /* GL_ARB_draw_buffers */ -#ifdef GL_ARB_draw_buffers_blend - if (glewExperimental || GLEW_ARB_draw_buffers_blend) GLEW_ARB_draw_buffers_blend = !_glewInit_GL_ARB_draw_buffers_blend(); -#endif /* GL_ARB_draw_buffers_blend */ -#ifdef GL_ARB_draw_elements_base_vertex - if (glewExperimental || GLEW_ARB_draw_elements_base_vertex) GLEW_ARB_draw_elements_base_vertex = !_glewInit_GL_ARB_draw_elements_base_vertex(); -#endif /* GL_ARB_draw_elements_base_vertex */ -#ifdef GL_ARB_draw_indirect - if (glewExperimental || GLEW_ARB_draw_indirect) GLEW_ARB_draw_indirect = !_glewInit_GL_ARB_draw_indirect(); -#endif /* GL_ARB_draw_indirect */ -#ifdef GL_ARB_framebuffer_no_attachments - if (glewExperimental || GLEW_ARB_framebuffer_no_attachments) GLEW_ARB_framebuffer_no_attachments = !_glewInit_GL_ARB_framebuffer_no_attachments(); -#endif /* GL_ARB_framebuffer_no_attachments */ -#ifdef GL_ARB_framebuffer_object - if (glewExperimental || GLEW_ARB_framebuffer_object) GLEW_ARB_framebuffer_object = !_glewInit_GL_ARB_framebuffer_object(); -#endif /* GL_ARB_framebuffer_object */ -#ifdef GL_ARB_geometry_shader4 - if (glewExperimental || GLEW_ARB_geometry_shader4) GLEW_ARB_geometry_shader4 = !_glewInit_GL_ARB_geometry_shader4(); -#endif /* GL_ARB_geometry_shader4 */ -#ifdef GL_ARB_get_program_binary - if (glewExperimental || GLEW_ARB_get_program_binary) GLEW_ARB_get_program_binary = !_glewInit_GL_ARB_get_program_binary(); -#endif /* GL_ARB_get_program_binary */ -#ifdef GL_ARB_get_texture_sub_image - if (glewExperimental || GLEW_ARB_get_texture_sub_image) GLEW_ARB_get_texture_sub_image = !_glewInit_GL_ARB_get_texture_sub_image(); -#endif /* GL_ARB_get_texture_sub_image */ -#ifdef GL_ARB_gl_spirv - if (glewExperimental || GLEW_ARB_gl_spirv) GLEW_ARB_gl_spirv = !_glewInit_GL_ARB_gl_spirv(); -#endif /* GL_ARB_gl_spirv */ -#ifdef GL_ARB_gpu_shader_fp64 - if (glewExperimental || GLEW_ARB_gpu_shader_fp64) GLEW_ARB_gpu_shader_fp64 = !_glewInit_GL_ARB_gpu_shader_fp64(); -#endif /* GL_ARB_gpu_shader_fp64 */ -#ifdef GL_ARB_gpu_shader_int64 - if (glewExperimental || GLEW_ARB_gpu_shader_int64) GLEW_ARB_gpu_shader_int64 = !_glewInit_GL_ARB_gpu_shader_int64(); -#endif /* GL_ARB_gpu_shader_int64 */ -#ifdef GL_ARB_imaging - if (glewExperimental || GLEW_ARB_imaging) GLEW_ARB_imaging = !_glewInit_GL_ARB_imaging(); -#endif /* GL_ARB_imaging */ -#ifdef GL_ARB_indirect_parameters - if (glewExperimental || GLEW_ARB_indirect_parameters) GLEW_ARB_indirect_parameters = !_glewInit_GL_ARB_indirect_parameters(); -#endif /* GL_ARB_indirect_parameters */ -#ifdef GL_ARB_instanced_arrays - if (glewExperimental || GLEW_ARB_instanced_arrays) GLEW_ARB_instanced_arrays = !_glewInit_GL_ARB_instanced_arrays(); -#endif /* GL_ARB_instanced_arrays */ -#ifdef GL_ARB_internalformat_query - if (glewExperimental || GLEW_ARB_internalformat_query) GLEW_ARB_internalformat_query = !_glewInit_GL_ARB_internalformat_query(); -#endif /* GL_ARB_internalformat_query */ -#ifdef GL_ARB_internalformat_query2 - if (glewExperimental || GLEW_ARB_internalformat_query2) GLEW_ARB_internalformat_query2 = !_glewInit_GL_ARB_internalformat_query2(); -#endif /* GL_ARB_internalformat_query2 */ -#ifdef GL_ARB_invalidate_subdata - if (glewExperimental || GLEW_ARB_invalidate_subdata) GLEW_ARB_invalidate_subdata = !_glewInit_GL_ARB_invalidate_subdata(); -#endif /* GL_ARB_invalidate_subdata */ -#ifdef GL_ARB_map_buffer_range - if (glewExperimental || GLEW_ARB_map_buffer_range) GLEW_ARB_map_buffer_range = !_glewInit_GL_ARB_map_buffer_range(); -#endif /* GL_ARB_map_buffer_range */ -#ifdef GL_ARB_matrix_palette - if (glewExperimental || GLEW_ARB_matrix_palette) GLEW_ARB_matrix_palette = !_glewInit_GL_ARB_matrix_palette(); -#endif /* GL_ARB_matrix_palette */ -#ifdef GL_ARB_multi_bind - if (glewExperimental || GLEW_ARB_multi_bind) GLEW_ARB_multi_bind = !_glewInit_GL_ARB_multi_bind(); -#endif /* GL_ARB_multi_bind */ -#ifdef GL_ARB_multi_draw_indirect - if (glewExperimental || GLEW_ARB_multi_draw_indirect) GLEW_ARB_multi_draw_indirect = !_glewInit_GL_ARB_multi_draw_indirect(); -#endif /* GL_ARB_multi_draw_indirect */ -#ifdef GL_ARB_multisample - if (glewExperimental || GLEW_ARB_multisample) GLEW_ARB_multisample = !_glewInit_GL_ARB_multisample(); -#endif /* GL_ARB_multisample */ -#ifdef GL_ARB_multitexture - if (glewExperimental || GLEW_ARB_multitexture) GLEW_ARB_multitexture = !_glewInit_GL_ARB_multitexture(); -#endif /* GL_ARB_multitexture */ -#ifdef GL_ARB_occlusion_query - if (glewExperimental || GLEW_ARB_occlusion_query) GLEW_ARB_occlusion_query = !_glewInit_GL_ARB_occlusion_query(); -#endif /* GL_ARB_occlusion_query */ -#ifdef GL_ARB_parallel_shader_compile - if (glewExperimental || GLEW_ARB_parallel_shader_compile) GLEW_ARB_parallel_shader_compile = !_glewInit_GL_ARB_parallel_shader_compile(); -#endif /* GL_ARB_parallel_shader_compile */ -#ifdef GL_ARB_point_parameters - if (glewExperimental || GLEW_ARB_point_parameters) GLEW_ARB_point_parameters = !_glewInit_GL_ARB_point_parameters(); -#endif /* GL_ARB_point_parameters */ -#ifdef GL_ARB_polygon_offset_clamp - if (glewExperimental || GLEW_ARB_polygon_offset_clamp) GLEW_ARB_polygon_offset_clamp = !_glewInit_GL_ARB_polygon_offset_clamp(); -#endif /* GL_ARB_polygon_offset_clamp */ -#ifdef GL_ARB_program_interface_query - if (glewExperimental || GLEW_ARB_program_interface_query) GLEW_ARB_program_interface_query = !_glewInit_GL_ARB_program_interface_query(); -#endif /* GL_ARB_program_interface_query */ -#ifdef GL_ARB_provoking_vertex - if (glewExperimental || GLEW_ARB_provoking_vertex) GLEW_ARB_provoking_vertex = !_glewInit_GL_ARB_provoking_vertex(); -#endif /* GL_ARB_provoking_vertex */ -#ifdef GL_ARB_robustness - if (glewExperimental || GLEW_ARB_robustness) GLEW_ARB_robustness = !_glewInit_GL_ARB_robustness(); -#endif /* GL_ARB_robustness */ -#ifdef GL_ARB_sample_locations - if (glewExperimental || GLEW_ARB_sample_locations) GLEW_ARB_sample_locations = !_glewInit_GL_ARB_sample_locations(); -#endif /* GL_ARB_sample_locations */ -#ifdef GL_ARB_sample_shading - if (glewExperimental || GLEW_ARB_sample_shading) GLEW_ARB_sample_shading = !_glewInit_GL_ARB_sample_shading(); -#endif /* GL_ARB_sample_shading */ -#ifdef GL_ARB_sampler_objects - if (glewExperimental || GLEW_ARB_sampler_objects) GLEW_ARB_sampler_objects = !_glewInit_GL_ARB_sampler_objects(); -#endif /* GL_ARB_sampler_objects */ -#ifdef GL_ARB_separate_shader_objects - if (glewExperimental || GLEW_ARB_separate_shader_objects) GLEW_ARB_separate_shader_objects = !_glewInit_GL_ARB_separate_shader_objects(); -#endif /* GL_ARB_separate_shader_objects */ -#ifdef GL_ARB_shader_atomic_counters - if (glewExperimental || GLEW_ARB_shader_atomic_counters) GLEW_ARB_shader_atomic_counters = !_glewInit_GL_ARB_shader_atomic_counters(); -#endif /* GL_ARB_shader_atomic_counters */ -#ifdef GL_ARB_shader_image_load_store - if (glewExperimental || GLEW_ARB_shader_image_load_store) GLEW_ARB_shader_image_load_store = !_glewInit_GL_ARB_shader_image_load_store(); -#endif /* GL_ARB_shader_image_load_store */ -#ifdef GL_ARB_shader_objects - if (glewExperimental || GLEW_ARB_shader_objects) GLEW_ARB_shader_objects = !_glewInit_GL_ARB_shader_objects(); -#endif /* GL_ARB_shader_objects */ -#ifdef GL_ARB_shader_storage_buffer_object - if (glewExperimental || GLEW_ARB_shader_storage_buffer_object) GLEW_ARB_shader_storage_buffer_object = !_glewInit_GL_ARB_shader_storage_buffer_object(); -#endif /* GL_ARB_shader_storage_buffer_object */ -#ifdef GL_ARB_shader_subroutine - if (glewExperimental || GLEW_ARB_shader_subroutine) GLEW_ARB_shader_subroutine = !_glewInit_GL_ARB_shader_subroutine(); -#endif /* GL_ARB_shader_subroutine */ -#ifdef GL_ARB_shading_language_include - if (glewExperimental || GLEW_ARB_shading_language_include) GLEW_ARB_shading_language_include = !_glewInit_GL_ARB_shading_language_include(); -#endif /* GL_ARB_shading_language_include */ -#ifdef GL_ARB_sparse_buffer - if (glewExperimental || GLEW_ARB_sparse_buffer) GLEW_ARB_sparse_buffer = !_glewInit_GL_ARB_sparse_buffer(); -#endif /* GL_ARB_sparse_buffer */ -#ifdef GL_ARB_sparse_texture - if (glewExperimental || GLEW_ARB_sparse_texture) GLEW_ARB_sparse_texture = !_glewInit_GL_ARB_sparse_texture(); -#endif /* GL_ARB_sparse_texture */ -#ifdef GL_ARB_sync - if (glewExperimental || GLEW_ARB_sync) GLEW_ARB_sync = !_glewInit_GL_ARB_sync(); -#endif /* GL_ARB_sync */ -#ifdef GL_ARB_tessellation_shader - if (glewExperimental || GLEW_ARB_tessellation_shader) GLEW_ARB_tessellation_shader = !_glewInit_GL_ARB_tessellation_shader(); -#endif /* GL_ARB_tessellation_shader */ -#ifdef GL_ARB_texture_barrier - if (glewExperimental || GLEW_ARB_texture_barrier) GLEW_ARB_texture_barrier = !_glewInit_GL_ARB_texture_barrier(); -#endif /* GL_ARB_texture_barrier */ -#ifdef GL_ARB_texture_buffer_object - if (glewExperimental || GLEW_ARB_texture_buffer_object) GLEW_ARB_texture_buffer_object = !_glewInit_GL_ARB_texture_buffer_object(); -#endif /* GL_ARB_texture_buffer_object */ -#ifdef GL_ARB_texture_buffer_range - if (glewExperimental || GLEW_ARB_texture_buffer_range) GLEW_ARB_texture_buffer_range = !_glewInit_GL_ARB_texture_buffer_range(); -#endif /* GL_ARB_texture_buffer_range */ -#ifdef GL_ARB_texture_compression - if (glewExperimental || GLEW_ARB_texture_compression) GLEW_ARB_texture_compression = !_glewInit_GL_ARB_texture_compression(); -#endif /* GL_ARB_texture_compression */ -#ifdef GL_ARB_texture_multisample - if (glewExperimental || GLEW_ARB_texture_multisample) GLEW_ARB_texture_multisample = !_glewInit_GL_ARB_texture_multisample(); -#endif /* GL_ARB_texture_multisample */ -#ifdef GL_ARB_texture_storage - if (glewExperimental || GLEW_ARB_texture_storage) GLEW_ARB_texture_storage = !_glewInit_GL_ARB_texture_storage(); -#endif /* GL_ARB_texture_storage */ -#ifdef GL_ARB_texture_storage_multisample - if (glewExperimental || GLEW_ARB_texture_storage_multisample) GLEW_ARB_texture_storage_multisample = !_glewInit_GL_ARB_texture_storage_multisample(); -#endif /* GL_ARB_texture_storage_multisample */ -#ifdef GL_ARB_texture_view - if (glewExperimental || GLEW_ARB_texture_view) GLEW_ARB_texture_view = !_glewInit_GL_ARB_texture_view(); -#endif /* GL_ARB_texture_view */ -#ifdef GL_ARB_timer_query - if (glewExperimental || GLEW_ARB_timer_query) GLEW_ARB_timer_query = !_glewInit_GL_ARB_timer_query(); -#endif /* GL_ARB_timer_query */ -#ifdef GL_ARB_transform_feedback2 - if (glewExperimental || GLEW_ARB_transform_feedback2) GLEW_ARB_transform_feedback2 = !_glewInit_GL_ARB_transform_feedback2(); -#endif /* GL_ARB_transform_feedback2 */ -#ifdef GL_ARB_transform_feedback3 - if (glewExperimental || GLEW_ARB_transform_feedback3) GLEW_ARB_transform_feedback3 = !_glewInit_GL_ARB_transform_feedback3(); -#endif /* GL_ARB_transform_feedback3 */ -#ifdef GL_ARB_transform_feedback_instanced - if (glewExperimental || GLEW_ARB_transform_feedback_instanced) GLEW_ARB_transform_feedback_instanced = !_glewInit_GL_ARB_transform_feedback_instanced(); -#endif /* GL_ARB_transform_feedback_instanced */ -#ifdef GL_ARB_transpose_matrix - if (glewExperimental || GLEW_ARB_transpose_matrix) GLEW_ARB_transpose_matrix = !_glewInit_GL_ARB_transpose_matrix(); -#endif /* GL_ARB_transpose_matrix */ -#ifdef GL_ARB_uniform_buffer_object - if (glewExperimental || GLEW_ARB_uniform_buffer_object) GLEW_ARB_uniform_buffer_object = !_glewInit_GL_ARB_uniform_buffer_object(); -#endif /* GL_ARB_uniform_buffer_object */ -#ifdef GL_ARB_vertex_array_object - if (glewExperimental || GLEW_ARB_vertex_array_object) GLEW_ARB_vertex_array_object = !_glewInit_GL_ARB_vertex_array_object(); -#endif /* GL_ARB_vertex_array_object */ -#ifdef GL_ARB_vertex_attrib_64bit - if (glewExperimental || GLEW_ARB_vertex_attrib_64bit) GLEW_ARB_vertex_attrib_64bit = !_glewInit_GL_ARB_vertex_attrib_64bit(); -#endif /* GL_ARB_vertex_attrib_64bit */ -#ifdef GL_ARB_vertex_attrib_binding - if (glewExperimental || GLEW_ARB_vertex_attrib_binding) GLEW_ARB_vertex_attrib_binding = !_glewInit_GL_ARB_vertex_attrib_binding(); -#endif /* GL_ARB_vertex_attrib_binding */ -#ifdef GL_ARB_vertex_blend - if (glewExperimental || GLEW_ARB_vertex_blend) GLEW_ARB_vertex_blend = !_glewInit_GL_ARB_vertex_blend(); -#endif /* GL_ARB_vertex_blend */ -#ifdef GL_ARB_vertex_buffer_object - if (glewExperimental || GLEW_ARB_vertex_buffer_object) GLEW_ARB_vertex_buffer_object = !_glewInit_GL_ARB_vertex_buffer_object(); -#endif /* GL_ARB_vertex_buffer_object */ -#ifdef GL_ARB_vertex_program - if (glewExperimental || GLEW_ARB_vertex_program) GLEW_ARB_vertex_program = !_glewInit_GL_ARB_vertex_program(); -#endif /* GL_ARB_vertex_program */ -#ifdef GL_ARB_vertex_shader - if (glewExperimental || GLEW_ARB_vertex_shader) { GLEW_ARB_vertex_shader = !_glewInit_GL_ARB_vertex_shader(); _glewInit_GL_ARB_vertex_program(); } -#endif /* GL_ARB_vertex_shader */ -#ifdef GL_ARB_vertex_type_2_10_10_10_rev - if (glewExperimental || GLEW_ARB_vertex_type_2_10_10_10_rev) GLEW_ARB_vertex_type_2_10_10_10_rev = !_glewInit_GL_ARB_vertex_type_2_10_10_10_rev(); -#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ -#ifdef GL_ARB_viewport_array - if (glewExperimental || GLEW_ARB_viewport_array) GLEW_ARB_viewport_array = !_glewInit_GL_ARB_viewport_array(); -#endif /* GL_ARB_viewport_array */ -#ifdef GL_ARB_window_pos - if (glewExperimental || GLEW_ARB_window_pos) GLEW_ARB_window_pos = !_glewInit_GL_ARB_window_pos(); -#endif /* GL_ARB_window_pos */ -#ifdef GL_ATI_draw_buffers - if (glewExperimental || GLEW_ATI_draw_buffers) GLEW_ATI_draw_buffers = !_glewInit_GL_ATI_draw_buffers(); -#endif /* GL_ATI_draw_buffers */ -#ifdef GL_ATI_element_array - if (glewExperimental || GLEW_ATI_element_array) GLEW_ATI_element_array = !_glewInit_GL_ATI_element_array(); -#endif /* GL_ATI_element_array */ -#ifdef GL_ATI_envmap_bumpmap - if (glewExperimental || GLEW_ATI_envmap_bumpmap) GLEW_ATI_envmap_bumpmap = !_glewInit_GL_ATI_envmap_bumpmap(); -#endif /* GL_ATI_envmap_bumpmap */ -#ifdef GL_ATI_fragment_shader - if (glewExperimental || GLEW_ATI_fragment_shader) GLEW_ATI_fragment_shader = !_glewInit_GL_ATI_fragment_shader(); -#endif /* GL_ATI_fragment_shader */ -#ifdef GL_ATI_map_object_buffer - if (glewExperimental || GLEW_ATI_map_object_buffer) GLEW_ATI_map_object_buffer = !_glewInit_GL_ATI_map_object_buffer(); -#endif /* GL_ATI_map_object_buffer */ -#ifdef GL_ATI_pn_triangles - if (glewExperimental || GLEW_ATI_pn_triangles) GLEW_ATI_pn_triangles = !_glewInit_GL_ATI_pn_triangles(); -#endif /* GL_ATI_pn_triangles */ -#ifdef GL_ATI_separate_stencil - if (glewExperimental || GLEW_ATI_separate_stencil) GLEW_ATI_separate_stencil = !_glewInit_GL_ATI_separate_stencil(); -#endif /* GL_ATI_separate_stencil */ -#ifdef GL_ATI_vertex_array_object - if (glewExperimental || GLEW_ATI_vertex_array_object) GLEW_ATI_vertex_array_object = !_glewInit_GL_ATI_vertex_array_object(); -#endif /* GL_ATI_vertex_array_object */ -#ifdef GL_ATI_vertex_attrib_array_object - if (glewExperimental || GLEW_ATI_vertex_attrib_array_object) GLEW_ATI_vertex_attrib_array_object = !_glewInit_GL_ATI_vertex_attrib_array_object(); -#endif /* GL_ATI_vertex_attrib_array_object */ -#ifdef GL_ATI_vertex_streams - if (glewExperimental || GLEW_ATI_vertex_streams) GLEW_ATI_vertex_streams = !_glewInit_GL_ATI_vertex_streams(); -#endif /* GL_ATI_vertex_streams */ -#ifdef GL_EXT_EGL_image_storage - if (glewExperimental || GLEW_EXT_EGL_image_storage) GLEW_EXT_EGL_image_storage = !_glewInit_GL_EXT_EGL_image_storage(); -#endif /* GL_EXT_EGL_image_storage */ -#ifdef GL_EXT_base_instance - if (glewExperimental || GLEW_EXT_base_instance) GLEW_EXT_base_instance = !_glewInit_GL_EXT_base_instance(); -#endif /* GL_EXT_base_instance */ -#ifdef GL_EXT_bindable_uniform - if (glewExperimental || GLEW_EXT_bindable_uniform) GLEW_EXT_bindable_uniform = !_glewInit_GL_EXT_bindable_uniform(); -#endif /* GL_EXT_bindable_uniform */ -#ifdef GL_EXT_blend_color - if (glewExperimental || GLEW_EXT_blend_color) GLEW_EXT_blend_color = !_glewInit_GL_EXT_blend_color(); -#endif /* GL_EXT_blend_color */ -#ifdef GL_EXT_blend_equation_separate - if (glewExperimental || GLEW_EXT_blend_equation_separate) GLEW_EXT_blend_equation_separate = !_glewInit_GL_EXT_blend_equation_separate(); -#endif /* GL_EXT_blend_equation_separate */ -#ifdef GL_EXT_blend_func_extended - if (glewExperimental || GLEW_EXT_blend_func_extended) GLEW_EXT_blend_func_extended = !_glewInit_GL_EXT_blend_func_extended(); -#endif /* GL_EXT_blend_func_extended */ -#ifdef GL_EXT_blend_func_separate - if (glewExperimental || GLEW_EXT_blend_func_separate) GLEW_EXT_blend_func_separate = !_glewInit_GL_EXT_blend_func_separate(); -#endif /* GL_EXT_blend_func_separate */ -#ifdef GL_EXT_blend_minmax - if (glewExperimental || GLEW_EXT_blend_minmax) GLEW_EXT_blend_minmax = !_glewInit_GL_EXT_blend_minmax(); -#endif /* GL_EXT_blend_minmax */ -#ifdef GL_EXT_buffer_storage - if (glewExperimental || GLEW_EXT_buffer_storage) GLEW_EXT_buffer_storage = !_glewInit_GL_EXT_buffer_storage(); -#endif /* GL_EXT_buffer_storage */ -#ifdef GL_EXT_clear_texture - if (glewExperimental || GLEW_EXT_clear_texture) GLEW_EXT_clear_texture = !_glewInit_GL_EXT_clear_texture(); -#endif /* GL_EXT_clear_texture */ -#ifdef GL_EXT_clip_control - if (glewExperimental || GLEW_EXT_clip_control) GLEW_EXT_clip_control = !_glewInit_GL_EXT_clip_control(); -#endif /* GL_EXT_clip_control */ -#ifdef GL_EXT_color_subtable - if (glewExperimental || GLEW_EXT_color_subtable) GLEW_EXT_color_subtable = !_glewInit_GL_EXT_color_subtable(); -#endif /* GL_EXT_color_subtable */ -#ifdef GL_EXT_compiled_vertex_array - if (glewExperimental || GLEW_EXT_compiled_vertex_array) GLEW_EXT_compiled_vertex_array = !_glewInit_GL_EXT_compiled_vertex_array(); -#endif /* GL_EXT_compiled_vertex_array */ -#ifdef GL_EXT_convolution - if (glewExperimental || GLEW_EXT_convolution) GLEW_EXT_convolution = !_glewInit_GL_EXT_convolution(); -#endif /* GL_EXT_convolution */ -#ifdef GL_EXT_coordinate_frame - if (glewExperimental || GLEW_EXT_coordinate_frame) GLEW_EXT_coordinate_frame = !_glewInit_GL_EXT_coordinate_frame(); -#endif /* GL_EXT_coordinate_frame */ -#ifdef GL_EXT_copy_image - if (glewExperimental || GLEW_EXT_copy_image) GLEW_EXT_copy_image = !_glewInit_GL_EXT_copy_image(); -#endif /* GL_EXT_copy_image */ -#ifdef GL_EXT_copy_texture - if (glewExperimental || GLEW_EXT_copy_texture) GLEW_EXT_copy_texture = !_glewInit_GL_EXT_copy_texture(); -#endif /* GL_EXT_copy_texture */ -#ifdef GL_EXT_cull_vertex - if (glewExperimental || GLEW_EXT_cull_vertex) GLEW_EXT_cull_vertex = !_glewInit_GL_EXT_cull_vertex(); -#endif /* GL_EXT_cull_vertex */ -#ifdef GL_EXT_debug_label - if (glewExperimental || GLEW_EXT_debug_label) GLEW_EXT_debug_label = !_glewInit_GL_EXT_debug_label(); -#endif /* GL_EXT_debug_label */ -#ifdef GL_EXT_debug_marker - if (glewExperimental || GLEW_EXT_debug_marker) GLEW_EXT_debug_marker = !_glewInit_GL_EXT_debug_marker(); -#endif /* GL_EXT_debug_marker */ -#ifdef GL_EXT_depth_bounds_test - if (glewExperimental || GLEW_EXT_depth_bounds_test) GLEW_EXT_depth_bounds_test = !_glewInit_GL_EXT_depth_bounds_test(); -#endif /* GL_EXT_depth_bounds_test */ -#ifdef GL_EXT_direct_state_access - if (glewExperimental || GLEW_EXT_direct_state_access) GLEW_EXT_direct_state_access = !_glewInit_GL_EXT_direct_state_access(); -#endif /* GL_EXT_direct_state_access */ -#ifdef GL_EXT_discard_framebuffer - if (glewExperimental || GLEW_EXT_discard_framebuffer) GLEW_EXT_discard_framebuffer = !_glewInit_GL_EXT_discard_framebuffer(); -#endif /* GL_EXT_discard_framebuffer */ -#ifdef GL_EXT_disjoint_timer_query - if (glewExperimental || GLEW_EXT_disjoint_timer_query) GLEW_EXT_disjoint_timer_query = !_glewInit_GL_EXT_disjoint_timer_query(); -#endif /* GL_EXT_disjoint_timer_query */ -#ifdef GL_EXT_draw_buffers - if (glewExperimental || GLEW_EXT_draw_buffers) GLEW_EXT_draw_buffers = !_glewInit_GL_EXT_draw_buffers(); -#endif /* GL_EXT_draw_buffers */ -#ifdef GL_EXT_draw_buffers2 - if (glewExperimental || GLEW_EXT_draw_buffers2) GLEW_EXT_draw_buffers2 = !_glewInit_GL_EXT_draw_buffers2(); -#endif /* GL_EXT_draw_buffers2 */ -#ifdef GL_EXT_draw_buffers_indexed - if (glewExperimental || GLEW_EXT_draw_buffers_indexed) GLEW_EXT_draw_buffers_indexed = !_glewInit_GL_EXT_draw_buffers_indexed(); -#endif /* GL_EXT_draw_buffers_indexed */ -#ifdef GL_EXT_draw_elements_base_vertex - if (glewExperimental || GLEW_EXT_draw_elements_base_vertex) GLEW_EXT_draw_elements_base_vertex = !_glewInit_GL_EXT_draw_elements_base_vertex(); -#endif /* GL_EXT_draw_elements_base_vertex */ -#ifdef GL_EXT_draw_instanced - if (glewExperimental || GLEW_EXT_draw_instanced) GLEW_EXT_draw_instanced = !_glewInit_GL_EXT_draw_instanced(); -#endif /* GL_EXT_draw_instanced */ -#ifdef GL_EXT_draw_range_elements - if (glewExperimental || GLEW_EXT_draw_range_elements) GLEW_EXT_draw_range_elements = !_glewInit_GL_EXT_draw_range_elements(); -#endif /* GL_EXT_draw_range_elements */ -#ifdef GL_EXT_draw_transform_feedback - if (glewExperimental || GLEW_EXT_draw_transform_feedback) GLEW_EXT_draw_transform_feedback = !_glewInit_GL_EXT_draw_transform_feedback(); -#endif /* GL_EXT_draw_transform_feedback */ -#ifdef GL_EXT_external_buffer - if (glewExperimental || GLEW_EXT_external_buffer) GLEW_EXT_external_buffer = !_glewInit_GL_EXT_external_buffer(); -#endif /* GL_EXT_external_buffer */ -#ifdef GL_EXT_fog_coord - if (glewExperimental || GLEW_EXT_fog_coord) GLEW_EXT_fog_coord = !_glewInit_GL_EXT_fog_coord(); -#endif /* GL_EXT_fog_coord */ -#ifdef GL_EXT_fragment_lighting - if (glewExperimental || GLEW_EXT_fragment_lighting) GLEW_EXT_fragment_lighting = !_glewInit_GL_EXT_fragment_lighting(); -#endif /* GL_EXT_fragment_lighting */ -#ifdef GL_EXT_framebuffer_blit - if (glewExperimental || GLEW_EXT_framebuffer_blit) GLEW_EXT_framebuffer_blit = !_glewInit_GL_EXT_framebuffer_blit(); -#endif /* GL_EXT_framebuffer_blit */ -#ifdef GL_EXT_framebuffer_multisample - if (glewExperimental || GLEW_EXT_framebuffer_multisample) GLEW_EXT_framebuffer_multisample = !_glewInit_GL_EXT_framebuffer_multisample(); -#endif /* GL_EXT_framebuffer_multisample */ -#ifdef GL_EXT_framebuffer_object - if (glewExperimental || GLEW_EXT_framebuffer_object) GLEW_EXT_framebuffer_object = !_glewInit_GL_EXT_framebuffer_object(); -#endif /* GL_EXT_framebuffer_object */ -#ifdef GL_EXT_geometry_shader4 - if (glewExperimental || GLEW_EXT_geometry_shader4) GLEW_EXT_geometry_shader4 = !_glewInit_GL_EXT_geometry_shader4(); -#endif /* GL_EXT_geometry_shader4 */ -#ifdef GL_EXT_gpu_program_parameters - if (glewExperimental || GLEW_EXT_gpu_program_parameters) GLEW_EXT_gpu_program_parameters = !_glewInit_GL_EXT_gpu_program_parameters(); -#endif /* GL_EXT_gpu_program_parameters */ -#ifdef GL_EXT_gpu_shader4 - if (glewExperimental || GLEW_EXT_gpu_shader4) GLEW_EXT_gpu_shader4 = !_glewInit_GL_EXT_gpu_shader4(); -#endif /* GL_EXT_gpu_shader4 */ -#ifdef GL_EXT_histogram - if (glewExperimental || GLEW_EXT_histogram) GLEW_EXT_histogram = !_glewInit_GL_EXT_histogram(); -#endif /* GL_EXT_histogram */ -#ifdef GL_EXT_index_func - if (glewExperimental || GLEW_EXT_index_func) GLEW_EXT_index_func = !_glewInit_GL_EXT_index_func(); -#endif /* GL_EXT_index_func */ -#ifdef GL_EXT_index_material - if (glewExperimental || GLEW_EXT_index_material) GLEW_EXT_index_material = !_glewInit_GL_EXT_index_material(); -#endif /* GL_EXT_index_material */ -#ifdef GL_EXT_instanced_arrays - if (glewExperimental || GLEW_EXT_instanced_arrays) GLEW_EXT_instanced_arrays = !_glewInit_GL_EXT_instanced_arrays(); -#endif /* GL_EXT_instanced_arrays */ -#ifdef GL_EXT_light_texture - if (glewExperimental || GLEW_EXT_light_texture) GLEW_EXT_light_texture = !_glewInit_GL_EXT_light_texture(); -#endif /* GL_EXT_light_texture */ -#ifdef GL_EXT_map_buffer_range - if (glewExperimental || GLEW_EXT_map_buffer_range) GLEW_EXT_map_buffer_range = !_glewInit_GL_EXT_map_buffer_range(); -#endif /* GL_EXT_map_buffer_range */ -#ifdef GL_EXT_memory_object - if (glewExperimental || GLEW_EXT_memory_object) GLEW_EXT_memory_object = !_glewInit_GL_EXT_memory_object(); -#endif /* GL_EXT_memory_object */ -#ifdef GL_EXT_memory_object_fd - if (glewExperimental || GLEW_EXT_memory_object_fd) GLEW_EXT_memory_object_fd = !_glewInit_GL_EXT_memory_object_fd(); -#endif /* GL_EXT_memory_object_fd */ -#ifdef GL_EXT_memory_object_win32 - if (glewExperimental || GLEW_EXT_memory_object_win32) GLEW_EXT_memory_object_win32 = !_glewInit_GL_EXT_memory_object_win32(); -#endif /* GL_EXT_memory_object_win32 */ -#ifdef GL_EXT_multi_draw_arrays - if (glewExperimental || GLEW_EXT_multi_draw_arrays) GLEW_EXT_multi_draw_arrays = !_glewInit_GL_EXT_multi_draw_arrays(); -#endif /* GL_EXT_multi_draw_arrays */ -#ifdef GL_EXT_multi_draw_indirect - if (glewExperimental || GLEW_EXT_multi_draw_indirect) GLEW_EXT_multi_draw_indirect = !_glewInit_GL_EXT_multi_draw_indirect(); -#endif /* GL_EXT_multi_draw_indirect */ -#ifdef GL_EXT_multisample - if (glewExperimental || GLEW_EXT_multisample) GLEW_EXT_multisample = !_glewInit_GL_EXT_multisample(); -#endif /* GL_EXT_multisample */ -#ifdef GL_EXT_multisampled_render_to_texture - if (glewExperimental || GLEW_EXT_multisampled_render_to_texture) GLEW_EXT_multisampled_render_to_texture = !_glewInit_GL_EXT_multisampled_render_to_texture(); -#endif /* GL_EXT_multisampled_render_to_texture */ -#ifdef GL_EXT_multiview_draw_buffers - if (glewExperimental || GLEW_EXT_multiview_draw_buffers) GLEW_EXT_multiview_draw_buffers = !_glewInit_GL_EXT_multiview_draw_buffers(); -#endif /* GL_EXT_multiview_draw_buffers */ -#ifdef GL_EXT_paletted_texture - if (glewExperimental || GLEW_EXT_paletted_texture) GLEW_EXT_paletted_texture = !_glewInit_GL_EXT_paletted_texture(); -#endif /* GL_EXT_paletted_texture */ -#ifdef GL_EXT_pixel_transform - if (glewExperimental || GLEW_EXT_pixel_transform) GLEW_EXT_pixel_transform = !_glewInit_GL_EXT_pixel_transform(); -#endif /* GL_EXT_pixel_transform */ -#ifdef GL_EXT_point_parameters - if (glewExperimental || GLEW_EXT_point_parameters) GLEW_EXT_point_parameters = !_glewInit_GL_EXT_point_parameters(); -#endif /* GL_EXT_point_parameters */ -#ifdef GL_EXT_polygon_offset - if (glewExperimental || GLEW_EXT_polygon_offset) GLEW_EXT_polygon_offset = !_glewInit_GL_EXT_polygon_offset(); -#endif /* GL_EXT_polygon_offset */ -#ifdef GL_EXT_polygon_offset_clamp - if (glewExperimental || GLEW_EXT_polygon_offset_clamp) GLEW_EXT_polygon_offset_clamp = !_glewInit_GL_EXT_polygon_offset_clamp(); -#endif /* GL_EXT_polygon_offset_clamp */ -#ifdef GL_EXT_primitive_bounding_box - if (glewExperimental || GLEW_EXT_primitive_bounding_box) GLEW_EXT_primitive_bounding_box = !_glewInit_GL_EXT_primitive_bounding_box(); -#endif /* GL_EXT_primitive_bounding_box */ -#ifdef GL_EXT_provoking_vertex - if (glewExperimental || GLEW_EXT_provoking_vertex) GLEW_EXT_provoking_vertex = !_glewInit_GL_EXT_provoking_vertex(); -#endif /* GL_EXT_provoking_vertex */ -#ifdef GL_EXT_raster_multisample - if (glewExperimental || GLEW_EXT_raster_multisample) GLEW_EXT_raster_multisample = !_glewInit_GL_EXT_raster_multisample(); -#endif /* GL_EXT_raster_multisample */ -#ifdef GL_EXT_robustness - if (glewExperimental || GLEW_EXT_robustness) GLEW_EXT_robustness = !_glewInit_GL_EXT_robustness(); -#endif /* GL_EXT_robustness */ -#ifdef GL_EXT_scene_marker - if (glewExperimental || GLEW_EXT_scene_marker) GLEW_EXT_scene_marker = !_glewInit_GL_EXT_scene_marker(); -#endif /* GL_EXT_scene_marker */ -#ifdef GL_EXT_secondary_color - if (glewExperimental || GLEW_EXT_secondary_color) GLEW_EXT_secondary_color = !_glewInit_GL_EXT_secondary_color(); -#endif /* GL_EXT_secondary_color */ -#ifdef GL_EXT_semaphore - if (glewExperimental || GLEW_EXT_semaphore) GLEW_EXT_semaphore = !_glewInit_GL_EXT_semaphore(); -#endif /* GL_EXT_semaphore */ -#ifdef GL_EXT_semaphore_fd - if (glewExperimental || GLEW_EXT_semaphore_fd) GLEW_EXT_semaphore_fd = !_glewInit_GL_EXT_semaphore_fd(); -#endif /* GL_EXT_semaphore_fd */ -#ifdef GL_EXT_semaphore_win32 - if (glewExperimental || GLEW_EXT_semaphore_win32) GLEW_EXT_semaphore_win32 = !_glewInit_GL_EXT_semaphore_win32(); -#endif /* GL_EXT_semaphore_win32 */ -#ifdef GL_EXT_separate_shader_objects - if (glewExperimental || GLEW_EXT_separate_shader_objects) GLEW_EXT_separate_shader_objects = !_glewInit_GL_EXT_separate_shader_objects(); -#endif /* GL_EXT_separate_shader_objects */ -#ifdef GL_EXT_shader_framebuffer_fetch - if (glewExperimental || GLEW_EXT_shader_framebuffer_fetch) GLEW_EXT_shader_framebuffer_fetch = !_glewInit_GL_EXT_shader_framebuffer_fetch(); -#endif /* GL_EXT_shader_framebuffer_fetch */ -#ifdef GL_EXT_shader_image_load_store - if (glewExperimental || GLEW_EXT_shader_image_load_store) GLEW_EXT_shader_image_load_store = !_glewInit_GL_EXT_shader_image_load_store(); -#endif /* GL_EXT_shader_image_load_store */ -#ifdef GL_EXT_shader_pixel_local_storage2 - if (glewExperimental || GLEW_EXT_shader_pixel_local_storage2) GLEW_EXT_shader_pixel_local_storage2 = !_glewInit_GL_EXT_shader_pixel_local_storage2(); -#endif /* GL_EXT_shader_pixel_local_storage2 */ -#ifdef GL_EXT_sparse_texture - if (glewExperimental || GLEW_EXT_sparse_texture) GLEW_EXT_sparse_texture = !_glewInit_GL_EXT_sparse_texture(); -#endif /* GL_EXT_sparse_texture */ -#ifdef GL_EXT_stencil_two_side - if (glewExperimental || GLEW_EXT_stencil_two_side) GLEW_EXT_stencil_two_side = !_glewInit_GL_EXT_stencil_two_side(); -#endif /* GL_EXT_stencil_two_side */ -#ifdef GL_EXT_subtexture - if (glewExperimental || GLEW_EXT_subtexture) GLEW_EXT_subtexture = !_glewInit_GL_EXT_subtexture(); -#endif /* GL_EXT_subtexture */ -#ifdef GL_EXT_tessellation_point_size - if (glewExperimental || GLEW_EXT_tessellation_point_size) GLEW_EXT_tessellation_point_size = !_glewInit_GL_EXT_tessellation_point_size(); -#endif /* GL_EXT_tessellation_point_size */ -#ifdef GL_EXT_texture3D - if (glewExperimental || GLEW_EXT_texture3D) GLEW_EXT_texture3D = !_glewInit_GL_EXT_texture3D(); -#endif /* GL_EXT_texture3D */ -#ifdef GL_EXT_texture_array - if (glewExperimental || GLEW_EXT_texture_array) GLEW_EXT_texture_array = !_glewInit_GL_EXT_texture_array(); -#endif /* GL_EXT_texture_array */ -#ifdef GL_EXT_texture_border_clamp - if (glewExperimental || GLEW_EXT_texture_border_clamp) GLEW_EXT_texture_border_clamp = !_glewInit_GL_EXT_texture_border_clamp(); -#endif /* GL_EXT_texture_border_clamp */ -#ifdef GL_EXT_texture_buffer_object - if (glewExperimental || GLEW_EXT_texture_buffer_object) GLEW_EXT_texture_buffer_object = !_glewInit_GL_EXT_texture_buffer_object(); -#endif /* GL_EXT_texture_buffer_object */ -#ifdef GL_EXT_texture_integer - if (glewExperimental || GLEW_EXT_texture_integer) GLEW_EXT_texture_integer = !_glewInit_GL_EXT_texture_integer(); -#endif /* GL_EXT_texture_integer */ -#ifdef GL_EXT_texture_object - if (glewExperimental || GLEW_EXT_texture_object) GLEW_EXT_texture_object = !_glewInit_GL_EXT_texture_object(); -#endif /* GL_EXT_texture_object */ -#ifdef GL_EXT_texture_perturb_normal - if (glewExperimental || GLEW_EXT_texture_perturb_normal) GLEW_EXT_texture_perturb_normal = !_glewInit_GL_EXT_texture_perturb_normal(); -#endif /* GL_EXT_texture_perturb_normal */ -#ifdef GL_EXT_texture_storage - if (glewExperimental || GLEW_EXT_texture_storage) GLEW_EXT_texture_storage = !_glewInit_GL_EXT_texture_storage(); -#endif /* GL_EXT_texture_storage */ -#ifdef GL_EXT_texture_view - if (glewExperimental || GLEW_EXT_texture_view) GLEW_EXT_texture_view = !_glewInit_GL_EXT_texture_view(); -#endif /* GL_EXT_texture_view */ -#ifdef GL_EXT_timer_query - if (glewExperimental || GLEW_EXT_timer_query) GLEW_EXT_timer_query = !_glewInit_GL_EXT_timer_query(); -#endif /* GL_EXT_timer_query */ -#ifdef GL_EXT_transform_feedback - if (glewExperimental || GLEW_EXT_transform_feedback) GLEW_EXT_transform_feedback = !_glewInit_GL_EXT_transform_feedback(); -#endif /* GL_EXT_transform_feedback */ -#ifdef GL_EXT_vertex_array - if (glewExperimental || GLEW_EXT_vertex_array) GLEW_EXT_vertex_array = !_glewInit_GL_EXT_vertex_array(); -#endif /* GL_EXT_vertex_array */ -#ifdef GL_EXT_vertex_array_setXXX - if (glewExperimental || GLEW_EXT_vertex_array_setXXX) GLEW_EXT_vertex_array_setXXX = !_glewInit_GL_EXT_vertex_array_setXXX(); -#endif /* GL_EXT_vertex_array_setXXX */ -#ifdef GL_EXT_vertex_attrib_64bit - if (glewExperimental || GLEW_EXT_vertex_attrib_64bit) GLEW_EXT_vertex_attrib_64bit = !_glewInit_GL_EXT_vertex_attrib_64bit(); -#endif /* GL_EXT_vertex_attrib_64bit */ -#ifdef GL_EXT_vertex_shader - if (glewExperimental || GLEW_EXT_vertex_shader) GLEW_EXT_vertex_shader = !_glewInit_GL_EXT_vertex_shader(); -#endif /* GL_EXT_vertex_shader */ -#ifdef GL_EXT_vertex_weighting - if (glewExperimental || GLEW_EXT_vertex_weighting) GLEW_EXT_vertex_weighting = !_glewInit_GL_EXT_vertex_weighting(); -#endif /* GL_EXT_vertex_weighting */ -#ifdef GL_EXT_win32_keyed_mutex - if (glewExperimental || GLEW_EXT_win32_keyed_mutex) GLEW_EXT_win32_keyed_mutex = !_glewInit_GL_EXT_win32_keyed_mutex(); -#endif /* GL_EXT_win32_keyed_mutex */ -#ifdef GL_EXT_window_rectangles - if (glewExperimental || GLEW_EXT_window_rectangles) GLEW_EXT_window_rectangles = !_glewInit_GL_EXT_window_rectangles(); -#endif /* GL_EXT_window_rectangles */ -#ifdef GL_EXT_x11_sync_object - if (glewExperimental || GLEW_EXT_x11_sync_object) GLEW_EXT_x11_sync_object = !_glewInit_GL_EXT_x11_sync_object(); -#endif /* GL_EXT_x11_sync_object */ -#ifdef GL_GREMEDY_frame_terminator - if (glewExperimental || GLEW_GREMEDY_frame_terminator) GLEW_GREMEDY_frame_terminator = !_glewInit_GL_GREMEDY_frame_terminator(); -#endif /* GL_GREMEDY_frame_terminator */ -#ifdef GL_GREMEDY_string_marker - if (glewExperimental || GLEW_GREMEDY_string_marker) GLEW_GREMEDY_string_marker = !_glewInit_GL_GREMEDY_string_marker(); -#endif /* GL_GREMEDY_string_marker */ -#ifdef GL_HP_image_transform - if (glewExperimental || GLEW_HP_image_transform) GLEW_HP_image_transform = !_glewInit_GL_HP_image_transform(); -#endif /* GL_HP_image_transform */ -#ifdef GL_IBM_multimode_draw_arrays - if (glewExperimental || GLEW_IBM_multimode_draw_arrays) GLEW_IBM_multimode_draw_arrays = !_glewInit_GL_IBM_multimode_draw_arrays(); -#endif /* GL_IBM_multimode_draw_arrays */ -#ifdef GL_IBM_vertex_array_lists - if (glewExperimental || GLEW_IBM_vertex_array_lists) GLEW_IBM_vertex_array_lists = !_glewInit_GL_IBM_vertex_array_lists(); -#endif /* GL_IBM_vertex_array_lists */ -#ifdef GL_IMG_bindless_texture - if (glewExperimental || GLEW_IMG_bindless_texture) GLEW_IMG_bindless_texture = !_glewInit_GL_IMG_bindless_texture(); -#endif /* GL_IMG_bindless_texture */ -#ifdef GL_IMG_framebuffer_downsample - if (glewExperimental || GLEW_IMG_framebuffer_downsample) GLEW_IMG_framebuffer_downsample = !_glewInit_GL_IMG_framebuffer_downsample(); -#endif /* GL_IMG_framebuffer_downsample */ -#ifdef GL_IMG_multisampled_render_to_texture - if (glewExperimental || GLEW_IMG_multisampled_render_to_texture) GLEW_IMG_multisampled_render_to_texture = !_glewInit_GL_IMG_multisampled_render_to_texture(); -#endif /* GL_IMG_multisampled_render_to_texture */ -#ifdef GL_INTEL_map_texture - if (glewExperimental || GLEW_INTEL_map_texture) GLEW_INTEL_map_texture = !_glewInit_GL_INTEL_map_texture(); -#endif /* GL_INTEL_map_texture */ -#ifdef GL_INTEL_parallel_arrays - if (glewExperimental || GLEW_INTEL_parallel_arrays) GLEW_INTEL_parallel_arrays = !_glewInit_GL_INTEL_parallel_arrays(); -#endif /* GL_INTEL_parallel_arrays */ -#ifdef GL_INTEL_performance_query - if (glewExperimental || GLEW_INTEL_performance_query) GLEW_INTEL_performance_query = !_glewInit_GL_INTEL_performance_query(); -#endif /* GL_INTEL_performance_query */ -#ifdef GL_INTEL_texture_scissor - if (glewExperimental || GLEW_INTEL_texture_scissor) GLEW_INTEL_texture_scissor = !_glewInit_GL_INTEL_texture_scissor(); -#endif /* GL_INTEL_texture_scissor */ -#ifdef GL_KHR_blend_equation_advanced - if (glewExperimental || GLEW_KHR_blend_equation_advanced) GLEW_KHR_blend_equation_advanced = !_glewInit_GL_KHR_blend_equation_advanced(); -#endif /* GL_KHR_blend_equation_advanced */ -#ifdef GL_KHR_debug - if (glewExperimental || GLEW_KHR_debug) GLEW_KHR_debug = !_glewInit_GL_KHR_debug(); -#endif /* GL_KHR_debug */ -#ifdef GL_KHR_parallel_shader_compile - if (glewExperimental || GLEW_KHR_parallel_shader_compile) GLEW_KHR_parallel_shader_compile = !_glewInit_GL_KHR_parallel_shader_compile(); -#endif /* GL_KHR_parallel_shader_compile */ -#ifdef GL_KHR_robustness - if (glewExperimental || GLEW_KHR_robustness) GLEW_KHR_robustness = !_glewInit_GL_KHR_robustness(); -#endif /* GL_KHR_robustness */ -#ifdef GL_KTX_buffer_region - if (glewExperimental || GLEW_KTX_buffer_region) GLEW_KTX_buffer_region = !_glewInit_GL_KTX_buffer_region(); -#endif /* GL_KTX_buffer_region */ -#ifdef GL_MESA_framebuffer_flip_y - if (glewExperimental || GLEW_MESA_framebuffer_flip_y) GLEW_MESA_framebuffer_flip_y = !_glewInit_GL_MESA_framebuffer_flip_y(); -#endif /* GL_MESA_framebuffer_flip_y */ -#ifdef GL_MESA_resize_buffers - if (glewExperimental || GLEW_MESA_resize_buffers) GLEW_MESA_resize_buffers = !_glewInit_GL_MESA_resize_buffers(); -#endif /* GL_MESA_resize_buffers */ -#ifdef GL_MESA_window_pos - if (glewExperimental || GLEW_MESA_window_pos) GLEW_MESA_window_pos = !_glewInit_GL_MESA_window_pos(); -#endif /* GL_MESA_window_pos */ -#ifdef GL_NVX_conditional_render - if (glewExperimental || GLEW_NVX_conditional_render) GLEW_NVX_conditional_render = !_glewInit_GL_NVX_conditional_render(); -#endif /* GL_NVX_conditional_render */ -#ifdef GL_NVX_gpu_multicast2 - if (glewExperimental || GLEW_NVX_gpu_multicast2) GLEW_NVX_gpu_multicast2 = !_glewInit_GL_NVX_gpu_multicast2(); -#endif /* GL_NVX_gpu_multicast2 */ -#ifdef GL_NVX_linked_gpu_multicast - if (glewExperimental || GLEW_NVX_linked_gpu_multicast) GLEW_NVX_linked_gpu_multicast = !_glewInit_GL_NVX_linked_gpu_multicast(); -#endif /* GL_NVX_linked_gpu_multicast */ -#ifdef GL_NVX_progress_fence - if (glewExperimental || GLEW_NVX_progress_fence) GLEW_NVX_progress_fence = !_glewInit_GL_NVX_progress_fence(); -#endif /* GL_NVX_progress_fence */ -#ifdef GL_NV_3dvision_settings - if (glewExperimental || GLEW_NV_3dvision_settings) GLEW_NV_3dvision_settings = !_glewInit_GL_NV_3dvision_settings(); -#endif /* GL_NV_3dvision_settings */ -#ifdef GL_NV_alpha_to_coverage_dither_control - if (glewExperimental || GLEW_NV_alpha_to_coverage_dither_control) GLEW_NV_alpha_to_coverage_dither_control = !_glewInit_GL_NV_alpha_to_coverage_dither_control(); -#endif /* GL_NV_alpha_to_coverage_dither_control */ -#ifdef GL_NV_bindless_multi_draw_indirect - if (glewExperimental || GLEW_NV_bindless_multi_draw_indirect) GLEW_NV_bindless_multi_draw_indirect = !_glewInit_GL_NV_bindless_multi_draw_indirect(); -#endif /* GL_NV_bindless_multi_draw_indirect */ -#ifdef GL_NV_bindless_multi_draw_indirect_count - if (glewExperimental || GLEW_NV_bindless_multi_draw_indirect_count) GLEW_NV_bindless_multi_draw_indirect_count = !_glewInit_GL_NV_bindless_multi_draw_indirect_count(); -#endif /* GL_NV_bindless_multi_draw_indirect_count */ -#ifdef GL_NV_bindless_texture - if (glewExperimental || GLEW_NV_bindless_texture) GLEW_NV_bindless_texture = !_glewInit_GL_NV_bindless_texture(); -#endif /* GL_NV_bindless_texture */ -#ifdef GL_NV_blend_equation_advanced - if (glewExperimental || GLEW_NV_blend_equation_advanced) GLEW_NV_blend_equation_advanced = !_glewInit_GL_NV_blend_equation_advanced(); -#endif /* GL_NV_blend_equation_advanced */ -#ifdef GL_NV_clip_space_w_scaling - if (glewExperimental || GLEW_NV_clip_space_w_scaling) GLEW_NV_clip_space_w_scaling = !_glewInit_GL_NV_clip_space_w_scaling(); -#endif /* GL_NV_clip_space_w_scaling */ -#ifdef GL_NV_command_list - if (glewExperimental || GLEW_NV_command_list) GLEW_NV_command_list = !_glewInit_GL_NV_command_list(); -#endif /* GL_NV_command_list */ -#ifdef GL_NV_conditional_render - if (glewExperimental || GLEW_NV_conditional_render) GLEW_NV_conditional_render = !_glewInit_GL_NV_conditional_render(); -#endif /* GL_NV_conditional_render */ -#ifdef GL_NV_conservative_raster - if (glewExperimental || GLEW_NV_conservative_raster) GLEW_NV_conservative_raster = !_glewInit_GL_NV_conservative_raster(); -#endif /* GL_NV_conservative_raster */ -#ifdef GL_NV_conservative_raster_dilate - if (glewExperimental || GLEW_NV_conservative_raster_dilate) GLEW_NV_conservative_raster_dilate = !_glewInit_GL_NV_conservative_raster_dilate(); -#endif /* GL_NV_conservative_raster_dilate */ -#ifdef GL_NV_conservative_raster_pre_snap_triangles - if (glewExperimental || GLEW_NV_conservative_raster_pre_snap_triangles) GLEW_NV_conservative_raster_pre_snap_triangles = !_glewInit_GL_NV_conservative_raster_pre_snap_triangles(); -#endif /* GL_NV_conservative_raster_pre_snap_triangles */ -#ifdef GL_NV_copy_buffer - if (glewExperimental || GLEW_NV_copy_buffer) GLEW_NV_copy_buffer = !_glewInit_GL_NV_copy_buffer(); -#endif /* GL_NV_copy_buffer */ -#ifdef GL_NV_copy_image - if (glewExperimental || GLEW_NV_copy_image) GLEW_NV_copy_image = !_glewInit_GL_NV_copy_image(); -#endif /* GL_NV_copy_image */ -#ifdef GL_NV_depth_buffer_float - if (glewExperimental || GLEW_NV_depth_buffer_float) GLEW_NV_depth_buffer_float = !_glewInit_GL_NV_depth_buffer_float(); -#endif /* GL_NV_depth_buffer_float */ -#ifdef GL_NV_draw_buffers - if (glewExperimental || GLEW_NV_draw_buffers) GLEW_NV_draw_buffers = !_glewInit_GL_NV_draw_buffers(); -#endif /* GL_NV_draw_buffers */ -#ifdef GL_NV_draw_instanced - if (glewExperimental || GLEW_NV_draw_instanced) GLEW_NV_draw_instanced = !_glewInit_GL_NV_draw_instanced(); -#endif /* GL_NV_draw_instanced */ -#ifdef GL_NV_draw_texture - if (glewExperimental || GLEW_NV_draw_texture) GLEW_NV_draw_texture = !_glewInit_GL_NV_draw_texture(); -#endif /* GL_NV_draw_texture */ -#ifdef GL_NV_draw_vulkan_image - if (glewExperimental || GLEW_NV_draw_vulkan_image) GLEW_NV_draw_vulkan_image = !_glewInit_GL_NV_draw_vulkan_image(); -#endif /* GL_NV_draw_vulkan_image */ -#ifdef GL_NV_evaluators - if (glewExperimental || GLEW_NV_evaluators) GLEW_NV_evaluators = !_glewInit_GL_NV_evaluators(); -#endif /* GL_NV_evaluators */ -#ifdef GL_NV_explicit_multisample - if (glewExperimental || GLEW_NV_explicit_multisample) GLEW_NV_explicit_multisample = !_glewInit_GL_NV_explicit_multisample(); -#endif /* GL_NV_explicit_multisample */ -#ifdef GL_NV_fence - if (glewExperimental || GLEW_NV_fence) GLEW_NV_fence = !_glewInit_GL_NV_fence(); -#endif /* GL_NV_fence */ -#ifdef GL_NV_fragment_coverage_to_color - if (glewExperimental || GLEW_NV_fragment_coverage_to_color) GLEW_NV_fragment_coverage_to_color = !_glewInit_GL_NV_fragment_coverage_to_color(); -#endif /* GL_NV_fragment_coverage_to_color */ -#ifdef GL_NV_fragment_program - if (glewExperimental || GLEW_NV_fragment_program) GLEW_NV_fragment_program = !_glewInit_GL_NV_fragment_program(); -#endif /* GL_NV_fragment_program */ -#ifdef GL_NV_framebuffer_blit - if (glewExperimental || GLEW_NV_framebuffer_blit) GLEW_NV_framebuffer_blit = !_glewInit_GL_NV_framebuffer_blit(); -#endif /* GL_NV_framebuffer_blit */ -#ifdef GL_NV_framebuffer_multisample - if (glewExperimental || GLEW_NV_framebuffer_multisample) GLEW_NV_framebuffer_multisample = !_glewInit_GL_NV_framebuffer_multisample(); -#endif /* GL_NV_framebuffer_multisample */ -#ifdef GL_NV_framebuffer_multisample_coverage - if (glewExperimental || GLEW_NV_framebuffer_multisample_coverage) GLEW_NV_framebuffer_multisample_coverage = !_glewInit_GL_NV_framebuffer_multisample_coverage(); -#endif /* GL_NV_framebuffer_multisample_coverage */ -#ifdef GL_NV_geometry_program4 - if (glewExperimental || GLEW_NV_geometry_program4) GLEW_NV_geometry_program4 = !_glewInit_GL_NV_geometry_program4(); -#endif /* GL_NV_geometry_program4 */ -#ifdef GL_NV_gpu_multicast - if (glewExperimental || GLEW_NV_gpu_multicast) GLEW_NV_gpu_multicast = !_glewInit_GL_NV_gpu_multicast(); -#endif /* GL_NV_gpu_multicast */ -#ifdef GL_NV_gpu_program4 - if (glewExperimental || GLEW_NV_gpu_program4) GLEW_NV_gpu_program4 = !_glewInit_GL_NV_gpu_program4(); -#endif /* GL_NV_gpu_program4 */ -#ifdef GL_NV_gpu_shader5 - if (glewExperimental || GLEW_NV_gpu_shader5) GLEW_NV_gpu_shader5 = !_glewInit_GL_NV_gpu_shader5(); -#endif /* GL_NV_gpu_shader5 */ -#ifdef GL_NV_half_float - if (glewExperimental || GLEW_NV_half_float) GLEW_NV_half_float = !_glewInit_GL_NV_half_float(); -#endif /* GL_NV_half_float */ -#ifdef GL_NV_instanced_arrays - if (glewExperimental || GLEW_NV_instanced_arrays) GLEW_NV_instanced_arrays = !_glewInit_GL_NV_instanced_arrays(); -#endif /* GL_NV_instanced_arrays */ -#ifdef GL_NV_internalformat_sample_query - if (glewExperimental || GLEW_NV_internalformat_sample_query) GLEW_NV_internalformat_sample_query = !_glewInit_GL_NV_internalformat_sample_query(); -#endif /* GL_NV_internalformat_sample_query */ -#ifdef GL_NV_memory_attachment - if (glewExperimental || GLEW_NV_memory_attachment) GLEW_NV_memory_attachment = !_glewInit_GL_NV_memory_attachment(); -#endif /* GL_NV_memory_attachment */ -#ifdef GL_NV_mesh_shader - if (glewExperimental || GLEW_NV_mesh_shader) GLEW_NV_mesh_shader = !_glewInit_GL_NV_mesh_shader(); -#endif /* GL_NV_mesh_shader */ -#ifdef GL_NV_non_square_matrices - if (glewExperimental || GLEW_NV_non_square_matrices) GLEW_NV_non_square_matrices = !_glewInit_GL_NV_non_square_matrices(); -#endif /* GL_NV_non_square_matrices */ -#ifdef GL_NV_occlusion_query - if (glewExperimental || GLEW_NV_occlusion_query) GLEW_NV_occlusion_query = !_glewInit_GL_NV_occlusion_query(); -#endif /* GL_NV_occlusion_query */ -#ifdef GL_NV_parameter_buffer_object - if (glewExperimental || GLEW_NV_parameter_buffer_object) GLEW_NV_parameter_buffer_object = !_glewInit_GL_NV_parameter_buffer_object(); -#endif /* GL_NV_parameter_buffer_object */ -#ifdef GL_NV_path_rendering - if (glewExperimental || GLEW_NV_path_rendering) GLEW_NV_path_rendering = !_glewInit_GL_NV_path_rendering(); -#endif /* GL_NV_path_rendering */ -#ifdef GL_NV_pixel_data_range - if (glewExperimental || GLEW_NV_pixel_data_range) GLEW_NV_pixel_data_range = !_glewInit_GL_NV_pixel_data_range(); -#endif /* GL_NV_pixel_data_range */ -#ifdef GL_NV_point_sprite - if (glewExperimental || GLEW_NV_point_sprite) GLEW_NV_point_sprite = !_glewInit_GL_NV_point_sprite(); -#endif /* GL_NV_point_sprite */ -#ifdef GL_NV_polygon_mode - if (glewExperimental || GLEW_NV_polygon_mode) GLEW_NV_polygon_mode = !_glewInit_GL_NV_polygon_mode(); -#endif /* GL_NV_polygon_mode */ -#ifdef GL_NV_present_video - if (glewExperimental || GLEW_NV_present_video) GLEW_NV_present_video = !_glewInit_GL_NV_present_video(); -#endif /* GL_NV_present_video */ -#ifdef GL_NV_primitive_restart - if (glewExperimental || GLEW_NV_primitive_restart) GLEW_NV_primitive_restart = !_glewInit_GL_NV_primitive_restart(); -#endif /* GL_NV_primitive_restart */ -#ifdef GL_NV_read_buffer - if (glewExperimental || GLEW_NV_read_buffer) GLEW_NV_read_buffer = !_glewInit_GL_NV_read_buffer(); -#endif /* GL_NV_read_buffer */ -#ifdef GL_NV_register_combiners - if (glewExperimental || GLEW_NV_register_combiners) GLEW_NV_register_combiners = !_glewInit_GL_NV_register_combiners(); -#endif /* GL_NV_register_combiners */ -#ifdef GL_NV_register_combiners2 - if (glewExperimental || GLEW_NV_register_combiners2) GLEW_NV_register_combiners2 = !_glewInit_GL_NV_register_combiners2(); -#endif /* GL_NV_register_combiners2 */ -#ifdef GL_NV_sample_locations - if (glewExperimental || GLEW_NV_sample_locations) GLEW_NV_sample_locations = !_glewInit_GL_NV_sample_locations(); -#endif /* GL_NV_sample_locations */ -#ifdef GL_NV_scissor_exclusive - if (glewExperimental || GLEW_NV_scissor_exclusive) GLEW_NV_scissor_exclusive = !_glewInit_GL_NV_scissor_exclusive(); -#endif /* GL_NV_scissor_exclusive */ -#ifdef GL_NV_shader_buffer_load - if (glewExperimental || GLEW_NV_shader_buffer_load) GLEW_NV_shader_buffer_load = !_glewInit_GL_NV_shader_buffer_load(); -#endif /* GL_NV_shader_buffer_load */ -#ifdef GL_NV_shading_rate_image - if (glewExperimental || GLEW_NV_shading_rate_image) GLEW_NV_shading_rate_image = !_glewInit_GL_NV_shading_rate_image(); -#endif /* GL_NV_shading_rate_image */ -#ifdef GL_NV_texture_array - if (glewExperimental || GLEW_NV_texture_array) GLEW_NV_texture_array = !_glewInit_GL_NV_texture_array(); -#endif /* GL_NV_texture_array */ -#ifdef GL_NV_texture_barrier - if (glewExperimental || GLEW_NV_texture_barrier) GLEW_NV_texture_barrier = !_glewInit_GL_NV_texture_barrier(); -#endif /* GL_NV_texture_barrier */ -#ifdef GL_NV_texture_multisample - if (glewExperimental || GLEW_NV_texture_multisample) GLEW_NV_texture_multisample = !_glewInit_GL_NV_texture_multisample(); -#endif /* GL_NV_texture_multisample */ -#ifdef GL_NV_transform_feedback - if (glewExperimental || GLEW_NV_transform_feedback) GLEW_NV_transform_feedback = !_glewInit_GL_NV_transform_feedback(); -#endif /* GL_NV_transform_feedback */ -#ifdef GL_NV_transform_feedback2 - if (glewExperimental || GLEW_NV_transform_feedback2) GLEW_NV_transform_feedback2 = !_glewInit_GL_NV_transform_feedback2(); -#endif /* GL_NV_transform_feedback2 */ -#ifdef GL_NV_vdpau_interop - if (glewExperimental || GLEW_NV_vdpau_interop) GLEW_NV_vdpau_interop = !_glewInit_GL_NV_vdpau_interop(); -#endif /* GL_NV_vdpau_interop */ -#ifdef GL_NV_vdpau_interop2 - if (glewExperimental || GLEW_NV_vdpau_interop2) GLEW_NV_vdpau_interop2 = !_glewInit_GL_NV_vdpau_interop2(); -#endif /* GL_NV_vdpau_interop2 */ -#ifdef GL_NV_vertex_array_range - if (glewExperimental || GLEW_NV_vertex_array_range) GLEW_NV_vertex_array_range = !_glewInit_GL_NV_vertex_array_range(); -#endif /* GL_NV_vertex_array_range */ -#ifdef GL_NV_vertex_attrib_integer_64bit - if (glewExperimental || GLEW_NV_vertex_attrib_integer_64bit) GLEW_NV_vertex_attrib_integer_64bit = !_glewInit_GL_NV_vertex_attrib_integer_64bit(); -#endif /* GL_NV_vertex_attrib_integer_64bit */ -#ifdef GL_NV_vertex_buffer_unified_memory - if (glewExperimental || GLEW_NV_vertex_buffer_unified_memory) GLEW_NV_vertex_buffer_unified_memory = !_glewInit_GL_NV_vertex_buffer_unified_memory(); -#endif /* GL_NV_vertex_buffer_unified_memory */ -#ifdef GL_NV_vertex_program - if (glewExperimental || GLEW_NV_vertex_program) GLEW_NV_vertex_program = !_glewInit_GL_NV_vertex_program(); -#endif /* GL_NV_vertex_program */ -#ifdef GL_NV_video_capture - if (glewExperimental || GLEW_NV_video_capture) GLEW_NV_video_capture = !_glewInit_GL_NV_video_capture(); -#endif /* GL_NV_video_capture */ -#ifdef GL_NV_viewport_array - if (glewExperimental || GLEW_NV_viewport_array) GLEW_NV_viewport_array = !_glewInit_GL_NV_viewport_array(); -#endif /* GL_NV_viewport_array */ -#ifdef GL_NV_viewport_swizzle - if (glewExperimental || GLEW_NV_viewport_swizzle) GLEW_NV_viewport_swizzle = !_glewInit_GL_NV_viewport_swizzle(); -#endif /* GL_NV_viewport_swizzle */ -#ifdef GL_OES_EGL_image - if (glewExperimental || GLEW_OES_EGL_image) GLEW_OES_EGL_image = !_glewInit_GL_OES_EGL_image(); -#endif /* GL_OES_EGL_image */ -#ifdef GL_OES_blend_equation_separate - if (glewExperimental || GLEW_OES_blend_equation_separate) GLEW_OES_blend_equation_separate = !_glewInit_GL_OES_blend_equation_separate(); -#endif /* GL_OES_blend_equation_separate */ -#ifdef GL_OES_blend_func_separate - if (glewExperimental || GLEW_OES_blend_func_separate) GLEW_OES_blend_func_separate = !_glewInit_GL_OES_blend_func_separate(); -#endif /* GL_OES_blend_func_separate */ -#ifdef GL_OES_blend_subtract - if (glewExperimental || GLEW_OES_blend_subtract) GLEW_OES_blend_subtract = !_glewInit_GL_OES_blend_subtract(); -#endif /* GL_OES_blend_subtract */ -#ifdef GL_OES_copy_image - if (glewExperimental || GLEW_OES_copy_image) GLEW_OES_copy_image = !_glewInit_GL_OES_copy_image(); -#endif /* GL_OES_copy_image */ -#ifdef GL_OES_draw_buffers_indexed - if (glewExperimental || GLEW_OES_draw_buffers_indexed) GLEW_OES_draw_buffers_indexed = !_glewInit_GL_OES_draw_buffers_indexed(); -#endif /* GL_OES_draw_buffers_indexed */ -#ifdef GL_OES_framebuffer_object - if (glewExperimental || GLEW_OES_framebuffer_object) GLEW_OES_framebuffer_object = !_glewInit_GL_OES_framebuffer_object(); -#endif /* GL_OES_framebuffer_object */ -#ifdef GL_OES_get_program_binary - if (glewExperimental || GLEW_OES_get_program_binary) GLEW_OES_get_program_binary = !_glewInit_GL_OES_get_program_binary(); -#endif /* GL_OES_get_program_binary */ -#ifdef GL_OES_mapbuffer - if (glewExperimental || GLEW_OES_mapbuffer) GLEW_OES_mapbuffer = !_glewInit_GL_OES_mapbuffer(); -#endif /* GL_OES_mapbuffer */ -#ifdef GL_OES_matrix_palette - if (glewExperimental || GLEW_OES_matrix_palette) GLEW_OES_matrix_palette = !_glewInit_GL_OES_matrix_palette(); -#endif /* GL_OES_matrix_palette */ -#ifdef GL_OES_sample_shading - if (glewExperimental || GLEW_OES_sample_shading) GLEW_OES_sample_shading = !_glewInit_GL_OES_sample_shading(); -#endif /* GL_OES_sample_shading */ -#ifdef GL_OES_single_precision - if (glewExperimental || GLEW_OES_single_precision) GLEW_OES_single_precision = !_glewInit_GL_OES_single_precision(); -#endif /* GL_OES_single_precision */ -#ifdef GL_OES_texture_3D - if (glewExperimental || GLEW_OES_texture_3D) GLEW_OES_texture_3D = !_glewInit_GL_OES_texture_3D(); -#endif /* GL_OES_texture_3D */ -#ifdef GL_OES_texture_border_clamp - if (glewExperimental || GLEW_OES_texture_border_clamp) GLEW_OES_texture_border_clamp = !_glewInit_GL_OES_texture_border_clamp(); -#endif /* GL_OES_texture_border_clamp */ -#ifdef GL_OES_texture_buffer - if (glewExperimental || GLEW_OES_texture_buffer) GLEW_OES_texture_buffer = !_glewInit_GL_OES_texture_buffer(); -#endif /* GL_OES_texture_buffer */ -#ifdef GL_OES_texture_cube_map - if (glewExperimental || GLEW_OES_texture_cube_map) GLEW_OES_texture_cube_map = !_glewInit_GL_OES_texture_cube_map(); -#endif /* GL_OES_texture_cube_map */ -#ifdef GL_OES_texture_storage_multisample_2d_array - if (glewExperimental || GLEW_OES_texture_storage_multisample_2d_array) GLEW_OES_texture_storage_multisample_2d_array = !_glewInit_GL_OES_texture_storage_multisample_2d_array(); -#endif /* GL_OES_texture_storage_multisample_2d_array */ -#ifdef GL_OES_texture_view - if (glewExperimental || GLEW_OES_texture_view) GLEW_OES_texture_view = !_glewInit_GL_OES_texture_view(); -#endif /* GL_OES_texture_view */ -#ifdef GL_OES_vertex_array_object - if (glewExperimental || GLEW_OES_vertex_array_object) GLEW_OES_vertex_array_object = !_glewInit_GL_OES_vertex_array_object(); -#endif /* GL_OES_vertex_array_object */ -#ifdef GL_OVR_multiview - if (glewExperimental || GLEW_OVR_multiview) GLEW_OVR_multiview = !_glewInit_GL_OVR_multiview(); -#endif /* GL_OVR_multiview */ -#ifdef GL_OVR_multiview_multisampled_render_to_texture - if (glewExperimental || GLEW_OVR_multiview_multisampled_render_to_texture) GLEW_OVR_multiview_multisampled_render_to_texture = !_glewInit_GL_OVR_multiview_multisampled_render_to_texture(); -#endif /* GL_OVR_multiview_multisampled_render_to_texture */ -#ifdef GL_QCOM_alpha_test - if (glewExperimental || GLEW_QCOM_alpha_test) GLEW_QCOM_alpha_test = !_glewInit_GL_QCOM_alpha_test(); -#endif /* GL_QCOM_alpha_test */ -#ifdef GL_QCOM_driver_control - if (glewExperimental || GLEW_QCOM_driver_control) GLEW_QCOM_driver_control = !_glewInit_GL_QCOM_driver_control(); -#endif /* GL_QCOM_driver_control */ -#ifdef GL_QCOM_extended_get - if (glewExperimental || GLEW_QCOM_extended_get) GLEW_QCOM_extended_get = !_glewInit_GL_QCOM_extended_get(); -#endif /* GL_QCOM_extended_get */ -#ifdef GL_QCOM_extended_get2 - if (glewExperimental || GLEW_QCOM_extended_get2) GLEW_QCOM_extended_get2 = !_glewInit_GL_QCOM_extended_get2(); -#endif /* GL_QCOM_extended_get2 */ -#ifdef GL_QCOM_framebuffer_foveated - if (glewExperimental || GLEW_QCOM_framebuffer_foveated) GLEW_QCOM_framebuffer_foveated = !_glewInit_GL_QCOM_framebuffer_foveated(); -#endif /* GL_QCOM_framebuffer_foveated */ -#ifdef GL_QCOM_shader_framebuffer_fetch_noncoherent - if (glewExperimental || GLEW_QCOM_shader_framebuffer_fetch_noncoherent) GLEW_QCOM_shader_framebuffer_fetch_noncoherent = !_glewInit_GL_QCOM_shader_framebuffer_fetch_noncoherent(); -#endif /* GL_QCOM_shader_framebuffer_fetch_noncoherent */ -#ifdef GL_QCOM_texture_foveated - if (glewExperimental || GLEW_QCOM_texture_foveated) GLEW_QCOM_texture_foveated = !_glewInit_GL_QCOM_texture_foveated(); -#endif /* GL_QCOM_texture_foveated */ -#ifdef GL_QCOM_tiled_rendering - if (glewExperimental || GLEW_QCOM_tiled_rendering) GLEW_QCOM_tiled_rendering = !_glewInit_GL_QCOM_tiled_rendering(); -#endif /* GL_QCOM_tiled_rendering */ -#ifdef GL_REGAL_ES1_0_compatibility - if (glewExperimental || GLEW_REGAL_ES1_0_compatibility) GLEW_REGAL_ES1_0_compatibility = !_glewInit_GL_REGAL_ES1_0_compatibility(); -#endif /* GL_REGAL_ES1_0_compatibility */ -#ifdef GL_REGAL_ES1_1_compatibility - if (glewExperimental || GLEW_REGAL_ES1_1_compatibility) GLEW_REGAL_ES1_1_compatibility = !_glewInit_GL_REGAL_ES1_1_compatibility(); -#endif /* GL_REGAL_ES1_1_compatibility */ -#ifdef GL_REGAL_error_string - if (glewExperimental || GLEW_REGAL_error_string) GLEW_REGAL_error_string = !_glewInit_GL_REGAL_error_string(); -#endif /* GL_REGAL_error_string */ -#ifdef GL_REGAL_extension_query - if (glewExperimental || GLEW_REGAL_extension_query) GLEW_REGAL_extension_query = !_glewInit_GL_REGAL_extension_query(); -#endif /* GL_REGAL_extension_query */ -#ifdef GL_REGAL_log - if (glewExperimental || GLEW_REGAL_log) GLEW_REGAL_log = !_glewInit_GL_REGAL_log(); -#endif /* GL_REGAL_log */ -#ifdef GL_REGAL_proc_address - if (glewExperimental || GLEW_REGAL_proc_address) GLEW_REGAL_proc_address = !_glewInit_GL_REGAL_proc_address(); -#endif /* GL_REGAL_proc_address */ -#ifdef GL_SGIS_detail_texture - if (glewExperimental || GLEW_SGIS_detail_texture) GLEW_SGIS_detail_texture = !_glewInit_GL_SGIS_detail_texture(); -#endif /* GL_SGIS_detail_texture */ -#ifdef GL_SGIS_fog_function - if (glewExperimental || GLEW_SGIS_fog_function) GLEW_SGIS_fog_function = !_glewInit_GL_SGIS_fog_function(); -#endif /* GL_SGIS_fog_function */ -#ifdef GL_SGIS_multisample - if (glewExperimental || GLEW_SGIS_multisample) GLEW_SGIS_multisample = !_glewInit_GL_SGIS_multisample(); -#endif /* GL_SGIS_multisample */ -#ifdef GL_SGIS_multitexture - if (glewExperimental || GLEW_SGIS_multitexture) GLEW_SGIS_multitexture = !_glewInit_GL_SGIS_multitexture(); -#endif /* GL_SGIS_multitexture */ -#ifdef GL_SGIS_shared_multisample - if (glewExperimental || GLEW_SGIS_shared_multisample) GLEW_SGIS_shared_multisample = !_glewInit_GL_SGIS_shared_multisample(); -#endif /* GL_SGIS_shared_multisample */ -#ifdef GL_SGIS_sharpen_texture - if (glewExperimental || GLEW_SGIS_sharpen_texture) GLEW_SGIS_sharpen_texture = !_glewInit_GL_SGIS_sharpen_texture(); -#endif /* GL_SGIS_sharpen_texture */ -#ifdef GL_SGIS_texture4D - if (glewExperimental || GLEW_SGIS_texture4D) GLEW_SGIS_texture4D = !_glewInit_GL_SGIS_texture4D(); -#endif /* GL_SGIS_texture4D */ -#ifdef GL_SGIS_texture_filter4 - if (glewExperimental || GLEW_SGIS_texture_filter4) GLEW_SGIS_texture_filter4 = !_glewInit_GL_SGIS_texture_filter4(); -#endif /* GL_SGIS_texture_filter4 */ -#ifdef GL_SGIX_async - if (glewExperimental || GLEW_SGIX_async) GLEW_SGIX_async = !_glewInit_GL_SGIX_async(); -#endif /* GL_SGIX_async */ -#ifdef GL_SGIX_datapipe - if (glewExperimental || GLEW_SGIX_datapipe) GLEW_SGIX_datapipe = !_glewInit_GL_SGIX_datapipe(); -#endif /* GL_SGIX_datapipe */ -#ifdef GL_SGIX_flush_raster - if (glewExperimental || GLEW_SGIX_flush_raster) GLEW_SGIX_flush_raster = !_glewInit_GL_SGIX_flush_raster(); -#endif /* GL_SGIX_flush_raster */ -#ifdef GL_SGIX_fog_layers - if (glewExperimental || GLEW_SGIX_fog_layers) GLEW_SGIX_fog_layers = !_glewInit_GL_SGIX_fog_layers(); -#endif /* GL_SGIX_fog_layers */ -#ifdef GL_SGIX_fog_texture - if (glewExperimental || GLEW_SGIX_fog_texture) GLEW_SGIX_fog_texture = !_glewInit_GL_SGIX_fog_texture(); -#endif /* GL_SGIX_fog_texture */ -#ifdef GL_SGIX_fragment_specular_lighting - if (glewExperimental || GLEW_SGIX_fragment_specular_lighting) GLEW_SGIX_fragment_specular_lighting = !_glewInit_GL_SGIX_fragment_specular_lighting(); -#endif /* GL_SGIX_fragment_specular_lighting */ -#ifdef GL_SGIX_framezoom - if (glewExperimental || GLEW_SGIX_framezoom) GLEW_SGIX_framezoom = !_glewInit_GL_SGIX_framezoom(); -#endif /* GL_SGIX_framezoom */ -#ifdef GL_SGIX_igloo_interface - if (glewExperimental || GLEW_SGIX_igloo_interface) GLEW_SGIX_igloo_interface = !_glewInit_GL_SGIX_igloo_interface(); -#endif /* GL_SGIX_igloo_interface */ -#ifdef GL_SGIX_mpeg1 - if (glewExperimental || GLEW_SGIX_mpeg1) GLEW_SGIX_mpeg1 = !_glewInit_GL_SGIX_mpeg1(); -#endif /* GL_SGIX_mpeg1 */ -#ifdef GL_SGIX_nonlinear_lighting_pervertex - if (glewExperimental || GLEW_SGIX_nonlinear_lighting_pervertex) GLEW_SGIX_nonlinear_lighting_pervertex = !_glewInit_GL_SGIX_nonlinear_lighting_pervertex(); -#endif /* GL_SGIX_nonlinear_lighting_pervertex */ -#ifdef GL_SGIX_pixel_texture - if (glewExperimental || GLEW_SGIX_pixel_texture) GLEW_SGIX_pixel_texture = !_glewInit_GL_SGIX_pixel_texture(); -#endif /* GL_SGIX_pixel_texture */ -#ifdef GL_SGIX_polynomial_ffd - if (glewExperimental || GLEW_SGIX_polynomial_ffd) GLEW_SGIX_polynomial_ffd = !_glewInit_GL_SGIX_polynomial_ffd(); -#endif /* GL_SGIX_polynomial_ffd */ -#ifdef GL_SGIX_quad_mesh - if (glewExperimental || GLEW_SGIX_quad_mesh) GLEW_SGIX_quad_mesh = !_glewInit_GL_SGIX_quad_mesh(); -#endif /* GL_SGIX_quad_mesh */ -#ifdef GL_SGIX_reference_plane - if (glewExperimental || GLEW_SGIX_reference_plane) GLEW_SGIX_reference_plane = !_glewInit_GL_SGIX_reference_plane(); -#endif /* GL_SGIX_reference_plane */ -#ifdef GL_SGIX_sprite - if (glewExperimental || GLEW_SGIX_sprite) GLEW_SGIX_sprite = !_glewInit_GL_SGIX_sprite(); -#endif /* GL_SGIX_sprite */ -#ifdef GL_SGIX_tag_sample_buffer - if (glewExperimental || GLEW_SGIX_tag_sample_buffer) GLEW_SGIX_tag_sample_buffer = !_glewInit_GL_SGIX_tag_sample_buffer(); -#endif /* GL_SGIX_tag_sample_buffer */ -#ifdef GL_SGIX_vector_ops - if (glewExperimental || GLEW_SGIX_vector_ops) GLEW_SGIX_vector_ops = !_glewInit_GL_SGIX_vector_ops(); -#endif /* GL_SGIX_vector_ops */ -#ifdef GL_SGIX_vertex_array_object - if (glewExperimental || GLEW_SGIX_vertex_array_object) GLEW_SGIX_vertex_array_object = !_glewInit_GL_SGIX_vertex_array_object(); -#endif /* GL_SGIX_vertex_array_object */ -#ifdef GL_SGI_color_table - if (glewExperimental || GLEW_SGI_color_table) GLEW_SGI_color_table = !_glewInit_GL_SGI_color_table(); -#endif /* GL_SGI_color_table */ -#ifdef GL_SGI_fft - if (glewExperimental || GLEW_SGI_fft) GLEW_SGI_fft = !_glewInit_GL_SGI_fft(); -#endif /* GL_SGI_fft */ -#ifdef GL_SUNX_constant_data - if (glewExperimental || GLEW_SUNX_constant_data) GLEW_SUNX_constant_data = !_glewInit_GL_SUNX_constant_data(); -#endif /* GL_SUNX_constant_data */ -#ifdef GL_SUN_global_alpha - if (glewExperimental || GLEW_SUN_global_alpha) GLEW_SUN_global_alpha = !_glewInit_GL_SUN_global_alpha(); -#endif /* GL_SUN_global_alpha */ -#ifdef GL_SUN_read_video_pixels - if (glewExperimental || GLEW_SUN_read_video_pixels) GLEW_SUN_read_video_pixels = !_glewInit_GL_SUN_read_video_pixels(); -#endif /* GL_SUN_read_video_pixels */ -#ifdef GL_SUN_triangle_list - if (glewExperimental || GLEW_SUN_triangle_list) GLEW_SUN_triangle_list = !_glewInit_GL_SUN_triangle_list(); -#endif /* GL_SUN_triangle_list */ -#ifdef GL_SUN_vertex - if (glewExperimental || GLEW_SUN_vertex) GLEW_SUN_vertex = !_glewInit_GL_SUN_vertex(); -#endif /* GL_SUN_vertex */ -#ifdef GL_WIN_swap_hint - if (glewExperimental || GLEW_WIN_swap_hint) GLEW_WIN_swap_hint = !_glewInit_GL_WIN_swap_hint(); -#endif /* GL_WIN_swap_hint */ -#ifdef GL_NV_fragment_program4 - GLEW_NV_fragment_program4 = GLEW_NV_gpu_program4; -#endif /* GL_NV_fragment_program4 */ -#ifdef GL_NV_geometry_program4 - GLEW_NV_geometry_program4 = GLEW_NV_gpu_program4; -#endif /* GL_NV_geometry_program4 */ -#ifdef GL_NV_tessellation_program5 - GLEW_NV_tessellation_program5 = GLEW_NV_gpu_program5; -#endif /* GL_NV_tessellation_program5 */ -#ifdef GL_NV_vertex_program4 - GLEW_NV_vertex_program4 = GLEW_NV_gpu_program4; -#endif /* GL_NV_vertex_program4 */ - - return GLEW_OK; -} - - -#if defined(GLEW_OSMESA) - -#elif defined(GLEW_EGL) - -PFNEGLCHOOSECONFIGPROC __eglewChooseConfig = NULL; -PFNEGLCOPYBUFFERSPROC __eglewCopyBuffers = NULL; -PFNEGLCREATECONTEXTPROC __eglewCreateContext = NULL; -PFNEGLCREATEPBUFFERSURFACEPROC __eglewCreatePbufferSurface = NULL; -PFNEGLCREATEPIXMAPSURFACEPROC __eglewCreatePixmapSurface = NULL; -PFNEGLCREATEWINDOWSURFACEPROC __eglewCreateWindowSurface = NULL; -PFNEGLDESTROYCONTEXTPROC __eglewDestroyContext = NULL; -PFNEGLDESTROYSURFACEPROC __eglewDestroySurface = NULL; -PFNEGLGETCONFIGATTRIBPROC __eglewGetConfigAttrib = NULL; -PFNEGLGETCONFIGSPROC __eglewGetConfigs = NULL; -PFNEGLGETCURRENTDISPLAYPROC __eglewGetCurrentDisplay = NULL; -PFNEGLGETCURRENTSURFACEPROC __eglewGetCurrentSurface = NULL; -PFNEGLGETDISPLAYPROC __eglewGetDisplay = NULL; -PFNEGLGETERRORPROC __eglewGetError = NULL; -PFNEGLINITIALIZEPROC __eglewInitialize = NULL; -PFNEGLMAKECURRENTPROC __eglewMakeCurrent = NULL; -PFNEGLQUERYCONTEXTPROC __eglewQueryContext = NULL; -PFNEGLQUERYSTRINGPROC __eglewQueryString = NULL; -PFNEGLQUERYSURFACEPROC __eglewQuerySurface = NULL; -PFNEGLSWAPBUFFERSPROC __eglewSwapBuffers = NULL; -PFNEGLTERMINATEPROC __eglewTerminate = NULL; -PFNEGLWAITGLPROC __eglewWaitGL = NULL; -PFNEGLWAITNATIVEPROC __eglewWaitNative = NULL; - -PFNEGLBINDTEXIMAGEPROC __eglewBindTexImage = NULL; -PFNEGLRELEASETEXIMAGEPROC __eglewReleaseTexImage = NULL; -PFNEGLSURFACEATTRIBPROC __eglewSurfaceAttrib = NULL; -PFNEGLSWAPINTERVALPROC __eglewSwapInterval = NULL; - -PFNEGLBINDAPIPROC __eglewBindAPI = NULL; -PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC __eglewCreatePbufferFromClientBuffer = NULL; -PFNEGLQUERYAPIPROC __eglewQueryAPI = NULL; -PFNEGLRELEASETHREADPROC __eglewReleaseThread = NULL; -PFNEGLWAITCLIENTPROC __eglewWaitClient = NULL; - -PFNEGLGETCURRENTCONTEXTPROC __eglewGetCurrentContext = NULL; - -PFNEGLCLIENTWAITSYNCPROC __eglewClientWaitSync = NULL; -PFNEGLCREATEIMAGEPROC __eglewCreateImage = NULL; -PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC __eglewCreatePlatformPixmapSurface = NULL; -PFNEGLCREATEPLATFORMWINDOWSURFACEPROC __eglewCreatePlatformWindowSurface = NULL; -PFNEGLCREATESYNCPROC __eglewCreateSync = NULL; -PFNEGLDESTROYIMAGEPROC __eglewDestroyImage = NULL; -PFNEGLDESTROYSYNCPROC __eglewDestroySync = NULL; -PFNEGLGETPLATFORMDISPLAYPROC __eglewGetPlatformDisplay = NULL; -PFNEGLGETSYNCATTRIBPROC __eglewGetSyncAttrib = NULL; -PFNEGLWAITSYNCPROC __eglewWaitSync = NULL; - -PFNEGLSETBLOBCACHEFUNCSANDROIDPROC __eglewSetBlobCacheFuncsANDROID = NULL; - -PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC __eglewCreateNativeClientBufferANDROID = NULL; - -PFNEGLGETCOMPOSITORTIMINGANDROIDPROC __eglewGetCompositorTimingANDROID = NULL; -PFNEGLGETCOMPOSITORTIMINGSUPPORTEDANDROIDPROC __eglewGetCompositorTimingSupportedANDROID = NULL; -PFNEGLGETFRAMETIMESTAMPSUPPORTEDANDROIDPROC __eglewGetFrameTimestampSupportedANDROID = NULL; -PFNEGLGETFRAMETIMESTAMPSANDROIDPROC __eglewGetFrameTimestampsANDROID = NULL; -PFNEGLGETNEXTFRAMEIDANDROIDPROC __eglewGetNextFrameIdANDROID = NULL; - -PFNEGLGETNATIVECLIENTBUFFERANDROIDPROC __eglewGetNativeClientBufferANDROID = NULL; - -PFNEGLDUPNATIVEFENCEFDANDROIDPROC __eglewDupNativeFenceFDANDROID = NULL; - -PFNEGLPRESENTATIONTIMEANDROIDPROC __eglewPresentationTimeANDROID = NULL; - -PFNEGLQUERYSURFACEPOINTERANGLEPROC __eglewQuerySurfacePointerANGLE = NULL; - -PFNEGLCLIENTSIGNALSYNCEXTPROC __eglewClientSignalSyncEXT = NULL; - -PFNEGLCOMPOSITORBINDTEXWINDOWEXTPROC __eglewCompositorBindTexWindowEXT = NULL; -PFNEGLCOMPOSITORSETCONTEXTATTRIBUTESEXTPROC __eglewCompositorSetContextAttributesEXT = NULL; -PFNEGLCOMPOSITORSETCONTEXTLISTEXTPROC __eglewCompositorSetContextListEXT = NULL; -PFNEGLCOMPOSITORSETSIZEEXTPROC __eglewCompositorSetSizeEXT = NULL; -PFNEGLCOMPOSITORSETWINDOWATTRIBUTESEXTPROC __eglewCompositorSetWindowAttributesEXT = NULL; -PFNEGLCOMPOSITORSETWINDOWLISTEXTPROC __eglewCompositorSetWindowListEXT = NULL; -PFNEGLCOMPOSITORSWAPPOLICYEXTPROC __eglewCompositorSwapPolicyEXT = NULL; - -PFNEGLQUERYDEVICESEXTPROC __eglewQueryDevicesEXT = NULL; - -PFNEGLQUERYDEVICEATTRIBEXTPROC __eglewQueryDeviceAttribEXT = NULL; -PFNEGLQUERYDEVICESTRINGEXTPROC __eglewQueryDeviceStringEXT = NULL; -PFNEGLQUERYDISPLAYATTRIBEXTPROC __eglewQueryDisplayAttribEXT = NULL; - -PFNEGLQUERYDMABUFFORMATSEXTPROC __eglewQueryDmaBufFormatsEXT = NULL; -PFNEGLQUERYDMABUFMODIFIERSEXTPROC __eglewQueryDmaBufModifiersEXT = NULL; - -PFNEGLGETOUTPUTLAYERSEXTPROC __eglewGetOutputLayersEXT = NULL; -PFNEGLGETOUTPUTPORTSEXTPROC __eglewGetOutputPortsEXT = NULL; -PFNEGLOUTPUTLAYERATTRIBEXTPROC __eglewOutputLayerAttribEXT = NULL; -PFNEGLOUTPUTPORTATTRIBEXTPROC __eglewOutputPortAttribEXT = NULL; -PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC __eglewQueryOutputLayerAttribEXT = NULL; -PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC __eglewQueryOutputLayerStringEXT = NULL; -PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC __eglewQueryOutputPortAttribEXT = NULL; -PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC __eglewQueryOutputPortStringEXT = NULL; - -PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC __eglewCreatePlatformPixmapSurfaceEXT = NULL; -PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC __eglewCreatePlatformWindowSurfaceEXT = NULL; -PFNEGLGETPLATFORMDISPLAYEXTPROC __eglewGetPlatformDisplayEXT = NULL; - -PFNEGLSTREAMCONSUMEROUTPUTEXTPROC __eglewStreamConsumerOutputEXT = NULL; - -PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC __eglewSwapBuffersWithDamageEXT = NULL; - -PFNEGLUNSIGNALSYNCEXTPROC __eglewUnsignalSyncEXT = NULL; - -PFNEGLCREATEPIXMAPSURFACEHIPROC __eglewCreatePixmapSurfaceHI = NULL; - -PFNEGLCREATESYNC64KHRPROC __eglewCreateSync64KHR = NULL; - -PFNEGLDEBUGMESSAGECONTROLKHRPROC __eglewDebugMessageControlKHR = NULL; -PFNEGLLABELOBJECTKHRPROC __eglewLabelObjectKHR = NULL; -PFNEGLQUERYDEBUGKHRPROC __eglewQueryDebugKHR = NULL; - -PFNEGLQUERYDISPLAYATTRIBKHRPROC __eglewQueryDisplayAttribKHR = NULL; - -PFNEGLCREATEIMAGEKHRPROC __eglewCreateImageKHR = NULL; -PFNEGLDESTROYIMAGEKHRPROC __eglewDestroyImageKHR = NULL; - -PFNEGLLOCKSURFACEKHRPROC __eglewLockSurfaceKHR = NULL; -PFNEGLUNLOCKSURFACEKHRPROC __eglewUnlockSurfaceKHR = NULL; - -PFNEGLQUERYSURFACE64KHRPROC __eglewQuerySurface64KHR = NULL; - -PFNEGLSETDAMAGEREGIONKHRPROC __eglewSetDamageRegionKHR = NULL; - -PFNEGLCLIENTWAITSYNCKHRPROC __eglewClientWaitSyncKHR = NULL; -PFNEGLCREATESYNCKHRPROC __eglewCreateSyncKHR = NULL; -PFNEGLDESTROYSYNCKHRPROC __eglewDestroySyncKHR = NULL; -PFNEGLGETSYNCATTRIBKHRPROC __eglewGetSyncAttribKHR = NULL; -PFNEGLSIGNALSYNCKHRPROC __eglewSignalSyncKHR = NULL; - -PFNEGLCREATESTREAMKHRPROC __eglewCreateStreamKHR = NULL; -PFNEGLDESTROYSTREAMKHRPROC __eglewDestroyStreamKHR = NULL; -PFNEGLQUERYSTREAMKHRPROC __eglewQueryStreamKHR = NULL; -PFNEGLQUERYSTREAMU64KHRPROC __eglewQueryStreamu64KHR = NULL; -PFNEGLSTREAMATTRIBKHRPROC __eglewStreamAttribKHR = NULL; - -PFNEGLCREATESTREAMATTRIBKHRPROC __eglewCreateStreamAttribKHR = NULL; -PFNEGLQUERYSTREAMATTRIBKHRPROC __eglewQueryStreamAttribKHR = NULL; -PFNEGLSETSTREAMATTRIBKHRPROC __eglewSetStreamAttribKHR = NULL; -PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC __eglewStreamConsumerAcquireAttribKHR = NULL; -PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC __eglewStreamConsumerReleaseAttribKHR = NULL; - -PFNEGLSTREAMCONSUMERACQUIREKHRPROC __eglewStreamConsumerAcquireKHR = NULL; -PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC __eglewStreamConsumerGLTextureExternalKHR = NULL; -PFNEGLSTREAMCONSUMERRELEASEKHRPROC __eglewStreamConsumerReleaseKHR = NULL; - -PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC __eglewCreateStreamFromFileDescriptorKHR = NULL; -PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC __eglewGetStreamFileDescriptorKHR = NULL; - -PFNEGLQUERYSTREAMTIMEKHRPROC __eglewQueryStreamTimeKHR = NULL; - -PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC __eglewCreateStreamProducerSurfaceKHR = NULL; - -PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC __eglewSwapBuffersWithDamageKHR = NULL; - -PFNEGLWAITSYNCKHRPROC __eglewWaitSyncKHR = NULL; - -PFNEGLCREATEDRMIMAGEMESAPROC __eglewCreateDRMImageMESA = NULL; -PFNEGLEXPORTDRMIMAGEMESAPROC __eglewExportDRMImageMESA = NULL; - -PFNEGLEXPORTDMABUFIMAGEMESAPROC __eglewExportDMABUFImageMESA = NULL; -PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC __eglewExportDMABUFImageQueryMESA = NULL; - -PFNEGLGETDISPLAYDRIVERCONFIGPROC __eglewGetDisplayDriverConfig = NULL; -PFNEGLGETDISPLAYDRIVERNAMEPROC __eglewGetDisplayDriverName = NULL; - -PFNEGLSWAPBUFFERSREGIONNOKPROC __eglewSwapBuffersRegionNOK = NULL; - -PFNEGLSWAPBUFFERSREGION2NOKPROC __eglewSwapBuffersRegion2NOK = NULL; - -PFNEGLQUERYNATIVEDISPLAYNVPROC __eglewQueryNativeDisplayNV = NULL; -PFNEGLQUERYNATIVEPIXMAPNVPROC __eglewQueryNativePixmapNV = NULL; -PFNEGLQUERYNATIVEWINDOWNVPROC __eglewQueryNativeWindowNV = NULL; - -PFNEGLPOSTSUBBUFFERNVPROC __eglewPostSubBufferNV = NULL; - -PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC __eglewStreamConsumerGLTextureExternalAttribsNV = NULL; - -PFNEGLSTREAMFLUSHNVPROC __eglewStreamFlushNV = NULL; - -PFNEGLQUERYDISPLAYATTRIBNVPROC __eglewQueryDisplayAttribNV = NULL; -PFNEGLQUERYSTREAMMETADATANVPROC __eglewQueryStreamMetadataNV = NULL; -PFNEGLSETSTREAMMETADATANVPROC __eglewSetStreamMetadataNV = NULL; - -PFNEGLRESETSTREAMNVPROC __eglewResetStreamNV = NULL; - -PFNEGLCREATESTREAMSYNCNVPROC __eglewCreateStreamSyncNV = NULL; - -PFNEGLCLIENTWAITSYNCNVPROC __eglewClientWaitSyncNV = NULL; -PFNEGLCREATEFENCESYNCNVPROC __eglewCreateFenceSyncNV = NULL; -PFNEGLDESTROYSYNCNVPROC __eglewDestroySyncNV = NULL; -PFNEGLFENCENVPROC __eglewFenceNV = NULL; -PFNEGLGETSYNCATTRIBNVPROC __eglewGetSyncAttribNV = NULL; -PFNEGLSIGNALSYNCNVPROC __eglewSignalSyncNV = NULL; - -PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC __eglewGetSystemTimeFrequencyNV = NULL; -PFNEGLGETSYSTEMTIMENVPROC __eglewGetSystemTimeNV = NULL; - -PFNEGLBINDWAYLANDDISPLAYWLPROC __eglewBindWaylandDisplayWL = NULL; -PFNEGLQUERYWAYLANDBUFFERWLPROC __eglewQueryWaylandBufferWL = NULL; -PFNEGLUNBINDWAYLANDDISPLAYWLPROC __eglewUnbindWaylandDisplayWL = NULL; - -PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC __eglewCreateWaylandBufferFromImageWL = NULL; -GLboolean __EGLEW_VERSION_1_0 = GL_FALSE; -GLboolean __EGLEW_VERSION_1_1 = GL_FALSE; -GLboolean __EGLEW_VERSION_1_2 = GL_FALSE; -GLboolean __EGLEW_VERSION_1_3 = GL_FALSE; -GLboolean __EGLEW_VERSION_1_4 = GL_FALSE; -GLboolean __EGLEW_VERSION_1_5 = GL_FALSE; -GLboolean __EGLEW_ANDROID_GLES_layers = GL_FALSE; -GLboolean __EGLEW_ANDROID_blob_cache = GL_FALSE; -GLboolean __EGLEW_ANDROID_create_native_client_buffer = GL_FALSE; -GLboolean __EGLEW_ANDROID_framebuffer_target = GL_FALSE; -GLboolean __EGLEW_ANDROID_front_buffer_auto_refresh = GL_FALSE; -GLboolean __EGLEW_ANDROID_get_frame_timestamps = GL_FALSE; -GLboolean __EGLEW_ANDROID_get_native_client_buffer = GL_FALSE; -GLboolean __EGLEW_ANDROID_image_native_buffer = GL_FALSE; -GLboolean __EGLEW_ANDROID_native_fence_sync = GL_FALSE; -GLboolean __EGLEW_ANDROID_presentation_time = GL_FALSE; -GLboolean __EGLEW_ANDROID_recordable = GL_FALSE; -GLboolean __EGLEW_ANGLE_d3d_share_handle_client_buffer = GL_FALSE; -GLboolean __EGLEW_ANGLE_device_d3d = GL_FALSE; -GLboolean __EGLEW_ANGLE_query_surface_pointer = GL_FALSE; -GLboolean __EGLEW_ANGLE_surface_d3d_texture_2d_share_handle = GL_FALSE; -GLboolean __EGLEW_ANGLE_window_fixed_size = GL_FALSE; -GLboolean __EGLEW_ARM_image_format = GL_FALSE; -GLboolean __EGLEW_ARM_implicit_external_sync = GL_FALSE; -GLboolean __EGLEW_ARM_pixmap_multisample_discard = GL_FALSE; -GLboolean __EGLEW_EXT_bind_to_front = GL_FALSE; -GLboolean __EGLEW_EXT_buffer_age = GL_FALSE; -GLboolean __EGLEW_EXT_client_extensions = GL_FALSE; -GLboolean __EGLEW_EXT_client_sync = GL_FALSE; -GLboolean __EGLEW_EXT_compositor = GL_FALSE; -GLboolean __EGLEW_EXT_create_context_robustness = GL_FALSE; -GLboolean __EGLEW_EXT_device_base = GL_FALSE; -GLboolean __EGLEW_EXT_device_drm = GL_FALSE; -GLboolean __EGLEW_EXT_device_enumeration = GL_FALSE; -GLboolean __EGLEW_EXT_device_openwf = GL_FALSE; -GLboolean __EGLEW_EXT_device_query = GL_FALSE; -GLboolean __EGLEW_EXT_gl_colorspace_bt2020_linear = GL_FALSE; -GLboolean __EGLEW_EXT_gl_colorspace_bt2020_pq = GL_FALSE; -GLboolean __EGLEW_EXT_gl_colorspace_display_p3 = GL_FALSE; -GLboolean __EGLEW_EXT_gl_colorspace_display_p3_linear = GL_FALSE; -GLboolean __EGLEW_EXT_gl_colorspace_display_p3_passthrough = GL_FALSE; -GLboolean __EGLEW_EXT_gl_colorspace_scrgb = GL_FALSE; -GLboolean __EGLEW_EXT_gl_colorspace_scrgb_linear = GL_FALSE; -GLboolean __EGLEW_EXT_image_dma_buf_import = GL_FALSE; -GLboolean __EGLEW_EXT_image_dma_buf_import_modifiers = GL_FALSE; -GLboolean __EGLEW_EXT_image_gl_colorspace = GL_FALSE; -GLboolean __EGLEW_EXT_image_implicit_sync_control = GL_FALSE; -GLboolean __EGLEW_EXT_multiview_window = GL_FALSE; -GLboolean __EGLEW_EXT_output_base = GL_FALSE; -GLboolean __EGLEW_EXT_output_drm = GL_FALSE; -GLboolean __EGLEW_EXT_output_openwf = GL_FALSE; -GLboolean __EGLEW_EXT_pixel_format_float = GL_FALSE; -GLboolean __EGLEW_EXT_platform_base = GL_FALSE; -GLboolean __EGLEW_EXT_platform_device = GL_FALSE; -GLboolean __EGLEW_EXT_platform_wayland = GL_FALSE; -GLboolean __EGLEW_EXT_platform_x11 = GL_FALSE; -GLboolean __EGLEW_EXT_protected_content = GL_FALSE; -GLboolean __EGLEW_EXT_protected_surface = GL_FALSE; -GLboolean __EGLEW_EXT_stream_consumer_egloutput = GL_FALSE; -GLboolean __EGLEW_EXT_surface_CTA861_3_metadata = GL_FALSE; -GLboolean __EGLEW_EXT_surface_SMPTE2086_metadata = GL_FALSE; -GLboolean __EGLEW_EXT_swap_buffers_with_damage = GL_FALSE; -GLboolean __EGLEW_EXT_sync_reuse = GL_FALSE; -GLboolean __EGLEW_EXT_yuv_surface = GL_FALSE; -GLboolean __EGLEW_HI_clientpixmap = GL_FALSE; -GLboolean __EGLEW_HI_colorformats = GL_FALSE; -GLboolean __EGLEW_IMG_context_priority = GL_FALSE; -GLboolean __EGLEW_IMG_image_plane_attribs = GL_FALSE; -GLboolean __EGLEW_KHR_cl_event = GL_FALSE; -GLboolean __EGLEW_KHR_cl_event2 = GL_FALSE; -GLboolean __EGLEW_KHR_client_get_all_proc_addresses = GL_FALSE; -GLboolean __EGLEW_KHR_config_attribs = GL_FALSE; -GLboolean __EGLEW_KHR_context_flush_control = GL_FALSE; -GLboolean __EGLEW_KHR_create_context = GL_FALSE; -GLboolean __EGLEW_KHR_create_context_no_error = GL_FALSE; -GLboolean __EGLEW_KHR_debug = GL_FALSE; -GLboolean __EGLEW_KHR_display_reference = GL_FALSE; -GLboolean __EGLEW_KHR_fence_sync = GL_FALSE; -GLboolean __EGLEW_KHR_get_all_proc_addresses = GL_FALSE; -GLboolean __EGLEW_KHR_gl_colorspace = GL_FALSE; -GLboolean __EGLEW_KHR_gl_renderbuffer_image = GL_FALSE; -GLboolean __EGLEW_KHR_gl_texture_2D_image = GL_FALSE; -GLboolean __EGLEW_KHR_gl_texture_3D_image = GL_FALSE; -GLboolean __EGLEW_KHR_gl_texture_cubemap_image = GL_FALSE; -GLboolean __EGLEW_KHR_image = GL_FALSE; -GLboolean __EGLEW_KHR_image_base = GL_FALSE; -GLboolean __EGLEW_KHR_image_pixmap = GL_FALSE; -GLboolean __EGLEW_KHR_lock_surface = GL_FALSE; -GLboolean __EGLEW_KHR_lock_surface2 = GL_FALSE; -GLboolean __EGLEW_KHR_lock_surface3 = GL_FALSE; -GLboolean __EGLEW_KHR_mutable_render_buffer = GL_FALSE; -GLboolean __EGLEW_KHR_no_config_context = GL_FALSE; -GLboolean __EGLEW_KHR_partial_update = GL_FALSE; -GLboolean __EGLEW_KHR_platform_android = GL_FALSE; -GLboolean __EGLEW_KHR_platform_gbm = GL_FALSE; -GLboolean __EGLEW_KHR_platform_wayland = GL_FALSE; -GLboolean __EGLEW_KHR_platform_x11 = GL_FALSE; -GLboolean __EGLEW_KHR_reusable_sync = GL_FALSE; -GLboolean __EGLEW_KHR_stream = GL_FALSE; -GLboolean __EGLEW_KHR_stream_attrib = GL_FALSE; -GLboolean __EGLEW_KHR_stream_consumer_gltexture = GL_FALSE; -GLboolean __EGLEW_KHR_stream_cross_process_fd = GL_FALSE; -GLboolean __EGLEW_KHR_stream_fifo = GL_FALSE; -GLboolean __EGLEW_KHR_stream_producer_aldatalocator = GL_FALSE; -GLboolean __EGLEW_KHR_stream_producer_eglsurface = GL_FALSE; -GLboolean __EGLEW_KHR_surfaceless_context = GL_FALSE; -GLboolean __EGLEW_KHR_swap_buffers_with_damage = GL_FALSE; -GLboolean __EGLEW_KHR_vg_parent_image = GL_FALSE; -GLboolean __EGLEW_KHR_wait_sync = GL_FALSE; -GLboolean __EGLEW_MESA_drm_image = GL_FALSE; -GLboolean __EGLEW_MESA_image_dma_buf_export = GL_FALSE; -GLboolean __EGLEW_MESA_platform_gbm = GL_FALSE; -GLboolean __EGLEW_MESA_platform_surfaceless = GL_FALSE; -GLboolean __EGLEW_MESA_query_driver = GL_FALSE; -GLboolean __EGLEW_NOK_swap_region = GL_FALSE; -GLboolean __EGLEW_NOK_swap_region2 = GL_FALSE; -GLboolean __EGLEW_NOK_texture_from_pixmap = GL_FALSE; -GLboolean __EGLEW_NV_3dvision_surface = GL_FALSE; -GLboolean __EGLEW_NV_context_priority_realtime = GL_FALSE; -GLboolean __EGLEW_NV_coverage_sample = GL_FALSE; -GLboolean __EGLEW_NV_coverage_sample_resolve = GL_FALSE; -GLboolean __EGLEW_NV_cuda_event = GL_FALSE; -GLboolean __EGLEW_NV_depth_nonlinear = GL_FALSE; -GLboolean __EGLEW_NV_device_cuda = GL_FALSE; -GLboolean __EGLEW_NV_native_query = GL_FALSE; -GLboolean __EGLEW_NV_post_convert_rounding = GL_FALSE; -GLboolean __EGLEW_NV_post_sub_buffer = GL_FALSE; -GLboolean __EGLEW_NV_quadruple_buffer = GL_FALSE; -GLboolean __EGLEW_NV_robustness_video_memory_purge = GL_FALSE; -GLboolean __EGLEW_NV_stream_consumer_gltexture_yuv = GL_FALSE; -GLboolean __EGLEW_NV_stream_cross_display = GL_FALSE; -GLboolean __EGLEW_NV_stream_cross_object = GL_FALSE; -GLboolean __EGLEW_NV_stream_cross_partition = GL_FALSE; -GLboolean __EGLEW_NV_stream_cross_process = GL_FALSE; -GLboolean __EGLEW_NV_stream_cross_system = GL_FALSE; -GLboolean __EGLEW_NV_stream_dma = GL_FALSE; -GLboolean __EGLEW_NV_stream_fifo_next = GL_FALSE; -GLboolean __EGLEW_NV_stream_fifo_synchronous = GL_FALSE; -GLboolean __EGLEW_NV_stream_flush = GL_FALSE; -GLboolean __EGLEW_NV_stream_frame_limits = GL_FALSE; -GLboolean __EGLEW_NV_stream_metadata = GL_FALSE; -GLboolean __EGLEW_NV_stream_origin = GL_FALSE; -GLboolean __EGLEW_NV_stream_remote = GL_FALSE; -GLboolean __EGLEW_NV_stream_reset = GL_FALSE; -GLboolean __EGLEW_NV_stream_socket = GL_FALSE; -GLboolean __EGLEW_NV_stream_socket_inet = GL_FALSE; -GLboolean __EGLEW_NV_stream_socket_unix = GL_FALSE; -GLboolean __EGLEW_NV_stream_sync = GL_FALSE; -GLboolean __EGLEW_NV_sync = GL_FALSE; -GLboolean __EGLEW_NV_system_time = GL_FALSE; -GLboolean __EGLEW_NV_triple_buffer = GL_FALSE; -GLboolean __EGLEW_TIZEN_image_native_buffer = GL_FALSE; -GLboolean __EGLEW_TIZEN_image_native_surface = GL_FALSE; -GLboolean __EGLEW_WL_bind_wayland_display = GL_FALSE; -GLboolean __EGLEW_WL_create_wayland_buffer_from_image = GL_FALSE; -#ifdef EGL_VERSION_1_0 - -static GLboolean _glewInit_EGL_VERSION_1_0 () -{ - GLboolean r = GL_FALSE; - - r = ((eglChooseConfig = (PFNEGLCHOOSECONFIGPROC)glewGetProcAddress((const GLubyte*)"eglChooseConfig")) == NULL) || r; - r = ((eglCopyBuffers = (PFNEGLCOPYBUFFERSPROC)glewGetProcAddress((const GLubyte*)"eglCopyBuffers")) == NULL) || r; - r = ((eglCreateContext = (PFNEGLCREATECONTEXTPROC)glewGetProcAddress((const GLubyte*)"eglCreateContext")) == NULL) || r; - r = ((eglCreatePbufferSurface = (PFNEGLCREATEPBUFFERSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglCreatePbufferSurface")) == NULL) || r; - r = ((eglCreatePixmapSurface = (PFNEGLCREATEPIXMAPSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglCreatePixmapSurface")) == NULL) || r; - r = ((eglCreateWindowSurface = (PFNEGLCREATEWINDOWSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglCreateWindowSurface")) == NULL) || r; - r = ((eglDestroyContext = (PFNEGLDESTROYCONTEXTPROC)glewGetProcAddress((const GLubyte*)"eglDestroyContext")) == NULL) || r; - r = ((eglDestroySurface = (PFNEGLDESTROYSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglDestroySurface")) == NULL) || r; - r = ((eglGetConfigAttrib = (PFNEGLGETCONFIGATTRIBPROC)glewGetProcAddress((const GLubyte*)"eglGetConfigAttrib")) == NULL) || r; - r = ((eglGetConfigs = (PFNEGLGETCONFIGSPROC)glewGetProcAddress((const GLubyte*)"eglGetConfigs")) == NULL) || r; - r = ((eglGetCurrentDisplay = (PFNEGLGETCURRENTDISPLAYPROC)glewGetProcAddress((const GLubyte*)"eglGetCurrentDisplay")) == NULL) || r; - r = ((eglGetCurrentSurface = (PFNEGLGETCURRENTSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglGetCurrentSurface")) == NULL) || r; - r = ((eglGetDisplay = (PFNEGLGETDISPLAYPROC)glewGetProcAddress((const GLubyte*)"eglGetDisplay")) == NULL) || r; - r = ((eglGetError = (PFNEGLGETERRORPROC)glewGetProcAddress((const GLubyte*)"eglGetError")) == NULL) || r; - r = ((eglInitialize = (PFNEGLINITIALIZEPROC)glewGetProcAddress((const GLubyte*)"eglInitialize")) == NULL) || r; - r = ((eglMakeCurrent = (PFNEGLMAKECURRENTPROC)glewGetProcAddress((const GLubyte*)"eglMakeCurrent")) == NULL) || r; - r = ((eglQueryContext = (PFNEGLQUERYCONTEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryContext")) == NULL) || r; - r = ((eglQueryString = (PFNEGLQUERYSTRINGPROC)glewGetProcAddress((const GLubyte*)"eglQueryString")) == NULL) || r; - r = ((eglQuerySurface = (PFNEGLQUERYSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglQuerySurface")) == NULL) || r; - r = ((eglSwapBuffers = (PFNEGLSWAPBUFFERSPROC)glewGetProcAddress((const GLubyte*)"eglSwapBuffers")) == NULL) || r; - r = ((eglTerminate = (PFNEGLTERMINATEPROC)glewGetProcAddress((const GLubyte*)"eglTerminate")) == NULL) || r; - r = ((eglWaitGL = (PFNEGLWAITGLPROC)glewGetProcAddress((const GLubyte*)"eglWaitGL")) == NULL) || r; - r = ((eglWaitNative = (PFNEGLWAITNATIVEPROC)glewGetProcAddress((const GLubyte*)"eglWaitNative")) == NULL) || r; - - return r; -} - -#endif /* EGL_VERSION_1_0 */ - -#ifdef EGL_VERSION_1_1 - -static GLboolean _glewInit_EGL_VERSION_1_1 () -{ - GLboolean r = GL_FALSE; - - r = ((eglBindTexImage = (PFNEGLBINDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"eglBindTexImage")) == NULL) || r; - r = ((eglReleaseTexImage = (PFNEGLRELEASETEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"eglReleaseTexImage")) == NULL) || r; - r = ((eglSurfaceAttrib = (PFNEGLSURFACEATTRIBPROC)glewGetProcAddress((const GLubyte*)"eglSurfaceAttrib")) == NULL) || r; - r = ((eglSwapInterval = (PFNEGLSWAPINTERVALPROC)glewGetProcAddress((const GLubyte*)"eglSwapInterval")) == NULL) || r; - - return r; -} - -#endif /* EGL_VERSION_1_1 */ - -#ifdef EGL_VERSION_1_2 - -static GLboolean _glewInit_EGL_VERSION_1_2 () -{ - GLboolean r = GL_FALSE; - - r = ((eglBindAPI = (PFNEGLBINDAPIPROC)glewGetProcAddress((const GLubyte*)"eglBindAPI")) == NULL) || r; - r = ((eglCreatePbufferFromClientBuffer = (PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC)glewGetProcAddress((const GLubyte*)"eglCreatePbufferFromClientBuffer")) == NULL) || r; - r = ((eglQueryAPI = (PFNEGLQUERYAPIPROC)glewGetProcAddress((const GLubyte*)"eglQueryAPI")) == NULL) || r; - r = ((eglReleaseThread = (PFNEGLRELEASETHREADPROC)glewGetProcAddress((const GLubyte*)"eglReleaseThread")) == NULL) || r; - r = ((eglWaitClient = (PFNEGLWAITCLIENTPROC)glewGetProcAddress((const GLubyte*)"eglWaitClient")) == NULL) || r; - - return r; -} - -#endif /* EGL_VERSION_1_2 */ - -#ifdef EGL_VERSION_1_4 - -static GLboolean _glewInit_EGL_VERSION_1_4 () -{ - GLboolean r = GL_FALSE; - - r = ((eglGetCurrentContext = (PFNEGLGETCURRENTCONTEXTPROC)glewGetProcAddress((const GLubyte*)"eglGetCurrentContext")) == NULL) || r; - - return r; -} - -#endif /* EGL_VERSION_1_4 */ - -#ifdef EGL_VERSION_1_5 - -static GLboolean _glewInit_EGL_VERSION_1_5 () -{ - GLboolean r = GL_FALSE; - - r = ((eglClientWaitSync = (PFNEGLCLIENTWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"eglClientWaitSync")) == NULL) || r; - r = ((eglCreateImage = (PFNEGLCREATEIMAGEPROC)glewGetProcAddress((const GLubyte*)"eglCreateImage")) == NULL) || r; - r = ((eglCreatePlatformPixmapSurface = (PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglCreatePlatformPixmapSurface")) == NULL) || r; - r = ((eglCreatePlatformWindowSurface = (PFNEGLCREATEPLATFORMWINDOWSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglCreatePlatformWindowSurface")) == NULL) || r; - r = ((eglCreateSync = (PFNEGLCREATESYNCPROC)glewGetProcAddress((const GLubyte*)"eglCreateSync")) == NULL) || r; - r = ((eglDestroyImage = (PFNEGLDESTROYIMAGEPROC)glewGetProcAddress((const GLubyte*)"eglDestroyImage")) == NULL) || r; - r = ((eglDestroySync = (PFNEGLDESTROYSYNCPROC)glewGetProcAddress((const GLubyte*)"eglDestroySync")) == NULL) || r; - r = ((eglGetPlatformDisplay = (PFNEGLGETPLATFORMDISPLAYPROC)glewGetProcAddress((const GLubyte*)"eglGetPlatformDisplay")) == NULL) || r; - r = ((eglGetSyncAttrib = (PFNEGLGETSYNCATTRIBPROC)glewGetProcAddress((const GLubyte*)"eglGetSyncAttrib")) == NULL) || r; - r = ((eglWaitSync = (PFNEGLWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"eglWaitSync")) == NULL) || r; - - return r; -} - -#endif /* EGL_VERSION_1_5 */ - -#ifdef EGL_ANDROID_blob_cache - -static GLboolean _glewInit_EGL_ANDROID_blob_cache () -{ - GLboolean r = GL_FALSE; - - r = ((eglSetBlobCacheFuncsANDROID = (PFNEGLSETBLOBCACHEFUNCSANDROIDPROC)glewGetProcAddress((const GLubyte*)"eglSetBlobCacheFuncsANDROID")) == NULL) || r; - - return r; -} - -#endif /* EGL_ANDROID_blob_cache */ - -#ifdef EGL_ANDROID_create_native_client_buffer - -static GLboolean _glewInit_EGL_ANDROID_create_native_client_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((eglCreateNativeClientBufferANDROID = (PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC)glewGetProcAddress((const GLubyte*)"eglCreateNativeClientBufferANDROID")) == NULL) || r; - - return r; -} - -#endif /* EGL_ANDROID_create_native_client_buffer */ - -#ifdef EGL_ANDROID_get_frame_timestamps - -static GLboolean _glewInit_EGL_ANDROID_get_frame_timestamps () -{ - GLboolean r = GL_FALSE; - - r = ((eglGetCompositorTimingANDROID = (PFNEGLGETCOMPOSITORTIMINGANDROIDPROC)glewGetProcAddress((const GLubyte*)"eglGetCompositorTimingANDROID")) == NULL) || r; - r = ((eglGetCompositorTimingSupportedANDROID = (PFNEGLGETCOMPOSITORTIMINGSUPPORTEDANDROIDPROC)glewGetProcAddress((const GLubyte*)"eglGetCompositorTimingSupportedANDROID")) == NULL) || r; - r = ((eglGetFrameTimestampSupportedANDROID = (PFNEGLGETFRAMETIMESTAMPSUPPORTEDANDROIDPROC)glewGetProcAddress((const GLubyte*)"eglGetFrameTimestampSupportedANDROID")) == NULL) || r; - r = ((eglGetFrameTimestampsANDROID = (PFNEGLGETFRAMETIMESTAMPSANDROIDPROC)glewGetProcAddress((const GLubyte*)"eglGetFrameTimestampsANDROID")) == NULL) || r; - r = ((eglGetNextFrameIdANDROID = (PFNEGLGETNEXTFRAMEIDANDROIDPROC)glewGetProcAddress((const GLubyte*)"eglGetNextFrameIdANDROID")) == NULL) || r; - - return r; -} - -#endif /* EGL_ANDROID_get_frame_timestamps */ - -#ifdef EGL_ANDROID_get_native_client_buffer - -static GLboolean _glewInit_EGL_ANDROID_get_native_client_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((eglGetNativeClientBufferANDROID = (PFNEGLGETNATIVECLIENTBUFFERANDROIDPROC)glewGetProcAddress((const GLubyte*)"eglGetNativeClientBufferANDROID")) == NULL) || r; - - return r; -} - -#endif /* EGL_ANDROID_get_native_client_buffer */ - -#ifdef EGL_ANDROID_native_fence_sync - -static GLboolean _glewInit_EGL_ANDROID_native_fence_sync () -{ - GLboolean r = GL_FALSE; - - r = ((eglDupNativeFenceFDANDROID = (PFNEGLDUPNATIVEFENCEFDANDROIDPROC)glewGetProcAddress((const GLubyte*)"eglDupNativeFenceFDANDROID")) == NULL) || r; - - return r; -} - -#endif /* EGL_ANDROID_native_fence_sync */ - -#ifdef EGL_ANDROID_presentation_time - -static GLboolean _glewInit_EGL_ANDROID_presentation_time () -{ - GLboolean r = GL_FALSE; - - r = ((eglPresentationTimeANDROID = (PFNEGLPRESENTATIONTIMEANDROIDPROC)glewGetProcAddress((const GLubyte*)"eglPresentationTimeANDROID")) == NULL) || r; - - return r; -} - -#endif /* EGL_ANDROID_presentation_time */ - -#ifdef EGL_ANGLE_query_surface_pointer - -static GLboolean _glewInit_EGL_ANGLE_query_surface_pointer () -{ - GLboolean r = GL_FALSE; - - r = ((eglQuerySurfacePointerANGLE = (PFNEGLQUERYSURFACEPOINTERANGLEPROC)glewGetProcAddress((const GLubyte*)"eglQuerySurfacePointerANGLE")) == NULL) || r; - - return r; -} - -#endif /* EGL_ANGLE_query_surface_pointer */ - -#ifdef EGL_EXT_client_sync - -static GLboolean _glewInit_EGL_EXT_client_sync () -{ - GLboolean r = GL_FALSE; - - r = ((eglClientSignalSyncEXT = (PFNEGLCLIENTSIGNALSYNCEXTPROC)glewGetProcAddress((const GLubyte*)"eglClientSignalSyncEXT")) == NULL) || r; - - return r; -} - -#endif /* EGL_EXT_client_sync */ - -#ifdef EGL_EXT_compositor - -static GLboolean _glewInit_EGL_EXT_compositor () -{ - GLboolean r = GL_FALSE; - - r = ((eglCompositorBindTexWindowEXT = (PFNEGLCOMPOSITORBINDTEXWINDOWEXTPROC)glewGetProcAddress((const GLubyte*)"eglCompositorBindTexWindowEXT")) == NULL) || r; - r = ((eglCompositorSetContextAttributesEXT = (PFNEGLCOMPOSITORSETCONTEXTATTRIBUTESEXTPROC)glewGetProcAddress((const GLubyte*)"eglCompositorSetContextAttributesEXT")) == NULL) || r; - r = ((eglCompositorSetContextListEXT = (PFNEGLCOMPOSITORSETCONTEXTLISTEXTPROC)glewGetProcAddress((const GLubyte*)"eglCompositorSetContextListEXT")) == NULL) || r; - r = ((eglCompositorSetSizeEXT = (PFNEGLCOMPOSITORSETSIZEEXTPROC)glewGetProcAddress((const GLubyte*)"eglCompositorSetSizeEXT")) == NULL) || r; - r = ((eglCompositorSetWindowAttributesEXT = (PFNEGLCOMPOSITORSETWINDOWATTRIBUTESEXTPROC)glewGetProcAddress((const GLubyte*)"eglCompositorSetWindowAttributesEXT")) == NULL) || r; - r = ((eglCompositorSetWindowListEXT = (PFNEGLCOMPOSITORSETWINDOWLISTEXTPROC)glewGetProcAddress((const GLubyte*)"eglCompositorSetWindowListEXT")) == NULL) || r; - r = ((eglCompositorSwapPolicyEXT = (PFNEGLCOMPOSITORSWAPPOLICYEXTPROC)glewGetProcAddress((const GLubyte*)"eglCompositorSwapPolicyEXT")) == NULL) || r; - - return r; -} - -#endif /* EGL_EXT_compositor */ - -#ifdef EGL_EXT_device_enumeration - -static GLboolean _glewInit_EGL_EXT_device_enumeration () -{ - GLboolean r = GL_FALSE; - - r = ((eglQueryDevicesEXT = (PFNEGLQUERYDEVICESEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDevicesEXT")) == NULL) || r; - - return r; -} - -#endif /* EGL_EXT_device_enumeration */ - -#ifdef EGL_EXT_device_query - -static GLboolean _glewInit_EGL_EXT_device_query () -{ - GLboolean r = GL_FALSE; - - r = ((eglQueryDeviceAttribEXT = (PFNEGLQUERYDEVICEATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDeviceAttribEXT")) == NULL) || r; - r = ((eglQueryDeviceStringEXT = (PFNEGLQUERYDEVICESTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDeviceStringEXT")) == NULL) || r; - r = ((eglQueryDisplayAttribEXT = (PFNEGLQUERYDISPLAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDisplayAttribEXT")) == NULL) || r; - - return r; -} - -#endif /* EGL_EXT_device_query */ - -#ifdef EGL_EXT_image_dma_buf_import_modifiers - -static GLboolean _glewInit_EGL_EXT_image_dma_buf_import_modifiers () -{ - GLboolean r = GL_FALSE; - - r = ((eglQueryDmaBufFormatsEXT = (PFNEGLQUERYDMABUFFORMATSEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDmaBufFormatsEXT")) == NULL) || r; - r = ((eglQueryDmaBufModifiersEXT = (PFNEGLQUERYDMABUFMODIFIERSEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDmaBufModifiersEXT")) == NULL) || r; - - return r; -} - -#endif /* EGL_EXT_image_dma_buf_import_modifiers */ - -#ifdef EGL_EXT_output_base - -static GLboolean _glewInit_EGL_EXT_output_base () -{ - GLboolean r = GL_FALSE; - - r = ((eglGetOutputLayersEXT = (PFNEGLGETOUTPUTLAYERSEXTPROC)glewGetProcAddress((const GLubyte*)"eglGetOutputLayersEXT")) == NULL) || r; - r = ((eglGetOutputPortsEXT = (PFNEGLGETOUTPUTPORTSEXTPROC)glewGetProcAddress((const GLubyte*)"eglGetOutputPortsEXT")) == NULL) || r; - r = ((eglOutputLayerAttribEXT = (PFNEGLOUTPUTLAYERATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglOutputLayerAttribEXT")) == NULL) || r; - r = ((eglOutputPortAttribEXT = (PFNEGLOUTPUTPORTATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglOutputPortAttribEXT")) == NULL) || r; - r = ((eglQueryOutputLayerAttribEXT = (PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryOutputLayerAttribEXT")) == NULL) || r; - r = ((eglQueryOutputLayerStringEXT = (PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryOutputLayerStringEXT")) == NULL) || r; - r = ((eglQueryOutputPortAttribEXT = (PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryOutputPortAttribEXT")) == NULL) || r; - r = ((eglQueryOutputPortStringEXT = (PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryOutputPortStringEXT")) == NULL) || r; - - return r; -} - -#endif /* EGL_EXT_output_base */ - -#ifdef EGL_EXT_platform_base - -static GLboolean _glewInit_EGL_EXT_platform_base () -{ - GLboolean r = GL_FALSE; - - r = ((eglCreatePlatformPixmapSurfaceEXT = (PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC)glewGetProcAddress((const GLubyte*)"eglCreatePlatformPixmapSurfaceEXT")) == NULL) || r; - r = ((eglCreatePlatformWindowSurfaceEXT = (PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC)glewGetProcAddress((const GLubyte*)"eglCreatePlatformWindowSurfaceEXT")) == NULL) || r; - r = ((eglGetPlatformDisplayEXT = (PFNEGLGETPLATFORMDISPLAYEXTPROC)glewGetProcAddress((const GLubyte*)"eglGetPlatformDisplayEXT")) == NULL) || r; - - return r; -} - -#endif /* EGL_EXT_platform_base */ - -#ifdef EGL_EXT_stream_consumer_egloutput - -static GLboolean _glewInit_EGL_EXT_stream_consumer_egloutput () -{ - GLboolean r = GL_FALSE; - - r = ((eglStreamConsumerOutputEXT = (PFNEGLSTREAMCONSUMEROUTPUTEXTPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerOutputEXT")) == NULL) || r; - - return r; -} - -#endif /* EGL_EXT_stream_consumer_egloutput */ - -#ifdef EGL_EXT_swap_buffers_with_damage - -static GLboolean _glewInit_EGL_EXT_swap_buffers_with_damage () -{ - GLboolean r = GL_FALSE; - - r = ((eglSwapBuffersWithDamageEXT = (PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"eglSwapBuffersWithDamageEXT")) == NULL) || r; - - return r; -} - -#endif /* EGL_EXT_swap_buffers_with_damage */ - -#ifdef EGL_EXT_sync_reuse - -static GLboolean _glewInit_EGL_EXT_sync_reuse () -{ - GLboolean r = GL_FALSE; - - r = ((eglUnsignalSyncEXT = (PFNEGLUNSIGNALSYNCEXTPROC)glewGetProcAddress((const GLubyte*)"eglUnsignalSyncEXT")) == NULL) || r; - - return r; -} - -#endif /* EGL_EXT_sync_reuse */ - -#ifdef EGL_HI_clientpixmap - -static GLboolean _glewInit_EGL_HI_clientpixmap () -{ - GLboolean r = GL_FALSE; - - r = ((eglCreatePixmapSurfaceHI = (PFNEGLCREATEPIXMAPSURFACEHIPROC)glewGetProcAddress((const GLubyte*)"eglCreatePixmapSurfaceHI")) == NULL) || r; - - return r; -} - -#endif /* EGL_HI_clientpixmap */ - -#ifdef EGL_KHR_cl_event2 - -static GLboolean _glewInit_EGL_KHR_cl_event2 () -{ - GLboolean r = GL_FALSE; - - r = ((eglCreateSync64KHR = (PFNEGLCREATESYNC64KHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateSync64KHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_cl_event2 */ - -#ifdef EGL_KHR_debug - -static GLboolean _glewInit_EGL_KHR_debug () -{ - GLboolean r = GL_FALSE; - - r = ((eglDebugMessageControlKHR = (PFNEGLDEBUGMESSAGECONTROLKHRPROC)glewGetProcAddress((const GLubyte*)"eglDebugMessageControlKHR")) == NULL) || r; - r = ((eglLabelObjectKHR = (PFNEGLLABELOBJECTKHRPROC)glewGetProcAddress((const GLubyte*)"eglLabelObjectKHR")) == NULL) || r; - r = ((eglQueryDebugKHR = (PFNEGLQUERYDEBUGKHRPROC)glewGetProcAddress((const GLubyte*)"eglQueryDebugKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_debug */ - -#ifdef EGL_KHR_display_reference - -static GLboolean _glewInit_EGL_KHR_display_reference () -{ - GLboolean r = GL_FALSE; - - r = ((eglQueryDisplayAttribKHR = (PFNEGLQUERYDISPLAYATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglQueryDisplayAttribKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_display_reference */ - -#ifdef EGL_KHR_image - -static GLboolean _glewInit_EGL_KHR_image () -{ - GLboolean r = GL_FALSE; - - r = ((eglCreateImageKHR = (PFNEGLCREATEIMAGEKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateImageKHR")) == NULL) || r; - r = ((eglDestroyImageKHR = (PFNEGLDESTROYIMAGEKHRPROC)glewGetProcAddress((const GLubyte*)"eglDestroyImageKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_image */ - -#ifdef EGL_KHR_lock_surface - -static GLboolean _glewInit_EGL_KHR_lock_surface () -{ - GLboolean r = GL_FALSE; - - r = ((eglLockSurfaceKHR = (PFNEGLLOCKSURFACEKHRPROC)glewGetProcAddress((const GLubyte*)"eglLockSurfaceKHR")) == NULL) || r; - r = ((eglUnlockSurfaceKHR = (PFNEGLUNLOCKSURFACEKHRPROC)glewGetProcAddress((const GLubyte*)"eglUnlockSurfaceKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_lock_surface */ - -#ifdef EGL_KHR_lock_surface3 - -static GLboolean _glewInit_EGL_KHR_lock_surface3 () -{ - GLboolean r = GL_FALSE; - - r = ((eglQuerySurface64KHR = (PFNEGLQUERYSURFACE64KHRPROC)glewGetProcAddress((const GLubyte*)"eglQuerySurface64KHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_lock_surface3 */ - -#ifdef EGL_KHR_partial_update - -static GLboolean _glewInit_EGL_KHR_partial_update () -{ - GLboolean r = GL_FALSE; - - r = ((eglSetDamageRegionKHR = (PFNEGLSETDAMAGEREGIONKHRPROC)glewGetProcAddress((const GLubyte*)"eglSetDamageRegionKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_partial_update */ - -#ifdef EGL_KHR_reusable_sync - -static GLboolean _glewInit_EGL_KHR_reusable_sync () -{ - GLboolean r = GL_FALSE; - - r = ((eglClientWaitSyncKHR = (PFNEGLCLIENTWAITSYNCKHRPROC)glewGetProcAddress((const GLubyte*)"eglClientWaitSyncKHR")) == NULL) || r; - r = ((eglCreateSyncKHR = (PFNEGLCREATESYNCKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateSyncKHR")) == NULL) || r; - r = ((eglDestroySyncKHR = (PFNEGLDESTROYSYNCKHRPROC)glewGetProcAddress((const GLubyte*)"eglDestroySyncKHR")) == NULL) || r; - r = ((eglGetSyncAttribKHR = (PFNEGLGETSYNCATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglGetSyncAttribKHR")) == NULL) || r; - r = ((eglSignalSyncKHR = (PFNEGLSIGNALSYNCKHRPROC)glewGetProcAddress((const GLubyte*)"eglSignalSyncKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_reusable_sync */ - -#ifdef EGL_KHR_stream - -static GLboolean _glewInit_EGL_KHR_stream () -{ - GLboolean r = GL_FALSE; - - r = ((eglCreateStreamKHR = (PFNEGLCREATESTREAMKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateStreamKHR")) == NULL) || r; - r = ((eglDestroyStreamKHR = (PFNEGLDESTROYSTREAMKHRPROC)glewGetProcAddress((const GLubyte*)"eglDestroyStreamKHR")) == NULL) || r; - r = ((eglQueryStreamKHR = (PFNEGLQUERYSTREAMKHRPROC)glewGetProcAddress((const GLubyte*)"eglQueryStreamKHR")) == NULL) || r; - r = ((eglQueryStreamu64KHR = (PFNEGLQUERYSTREAMU64KHRPROC)glewGetProcAddress((const GLubyte*)"eglQueryStreamu64KHR")) == NULL) || r; - r = ((eglStreamAttribKHR = (PFNEGLSTREAMATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamAttribKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_stream */ - -#ifdef EGL_KHR_stream_attrib - -static GLboolean _glewInit_EGL_KHR_stream_attrib () -{ - GLboolean r = GL_FALSE; - - r = ((eglCreateStreamAttribKHR = (PFNEGLCREATESTREAMATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateStreamAttribKHR")) == NULL) || r; - r = ((eglQueryStreamAttribKHR = (PFNEGLQUERYSTREAMATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglQueryStreamAttribKHR")) == NULL) || r; - r = ((eglSetStreamAttribKHR = (PFNEGLSETSTREAMATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglSetStreamAttribKHR")) == NULL) || r; - r = ((eglStreamConsumerAcquireAttribKHR = (PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerAcquireAttribKHR")) == NULL) || r; - r = ((eglStreamConsumerReleaseAttribKHR = (PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerReleaseAttribKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_stream_attrib */ - -#ifdef EGL_KHR_stream_consumer_gltexture - -static GLboolean _glewInit_EGL_KHR_stream_consumer_gltexture () -{ - GLboolean r = GL_FALSE; - - r = ((eglStreamConsumerAcquireKHR = (PFNEGLSTREAMCONSUMERACQUIREKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerAcquireKHR")) == NULL) || r; - r = ((eglStreamConsumerGLTextureExternalKHR = (PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerGLTextureExternalKHR")) == NULL) || r; - r = ((eglStreamConsumerReleaseKHR = (PFNEGLSTREAMCONSUMERRELEASEKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerReleaseKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_stream_consumer_gltexture */ - -#ifdef EGL_KHR_stream_cross_process_fd - -static GLboolean _glewInit_EGL_KHR_stream_cross_process_fd () -{ - GLboolean r = GL_FALSE; - - r = ((eglCreateStreamFromFileDescriptorKHR = (PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateStreamFromFileDescriptorKHR")) == NULL) || r; - r = ((eglGetStreamFileDescriptorKHR = (PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC)glewGetProcAddress((const GLubyte*)"eglGetStreamFileDescriptorKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_stream_cross_process_fd */ - -#ifdef EGL_KHR_stream_fifo - -static GLboolean _glewInit_EGL_KHR_stream_fifo () -{ - GLboolean r = GL_FALSE; - - r = ((eglQueryStreamTimeKHR = (PFNEGLQUERYSTREAMTIMEKHRPROC)glewGetProcAddress((const GLubyte*)"eglQueryStreamTimeKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_stream_fifo */ - -#ifdef EGL_KHR_stream_producer_eglsurface - -static GLboolean _glewInit_EGL_KHR_stream_producer_eglsurface () -{ - GLboolean r = GL_FALSE; - - r = ((eglCreateStreamProducerSurfaceKHR = (PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateStreamProducerSurfaceKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_stream_producer_eglsurface */ - -#ifdef EGL_KHR_swap_buffers_with_damage - -static GLboolean _glewInit_EGL_KHR_swap_buffers_with_damage () -{ - GLboolean r = GL_FALSE; - - r = ((eglSwapBuffersWithDamageKHR = (PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC)glewGetProcAddress((const GLubyte*)"eglSwapBuffersWithDamageKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_swap_buffers_with_damage */ - -#ifdef EGL_KHR_wait_sync - -static GLboolean _glewInit_EGL_KHR_wait_sync () -{ - GLboolean r = GL_FALSE; - - r = ((eglWaitSyncKHR = (PFNEGLWAITSYNCKHRPROC)glewGetProcAddress((const GLubyte*)"eglWaitSyncKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_wait_sync */ - -#ifdef EGL_MESA_drm_image - -static GLboolean _glewInit_EGL_MESA_drm_image () -{ - GLboolean r = GL_FALSE; - - r = ((eglCreateDRMImageMESA = (PFNEGLCREATEDRMIMAGEMESAPROC)glewGetProcAddress((const GLubyte*)"eglCreateDRMImageMESA")) == NULL) || r; - r = ((eglExportDRMImageMESA = (PFNEGLEXPORTDRMIMAGEMESAPROC)glewGetProcAddress((const GLubyte*)"eglExportDRMImageMESA")) == NULL) || r; - - return r; -} - -#endif /* EGL_MESA_drm_image */ - -#ifdef EGL_MESA_image_dma_buf_export - -static GLboolean _glewInit_EGL_MESA_image_dma_buf_export () -{ - GLboolean r = GL_FALSE; - - r = ((eglExportDMABUFImageMESA = (PFNEGLEXPORTDMABUFIMAGEMESAPROC)glewGetProcAddress((const GLubyte*)"eglExportDMABUFImageMESA")) == NULL) || r; - r = ((eglExportDMABUFImageQueryMESA = (PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC)glewGetProcAddress((const GLubyte*)"eglExportDMABUFImageQueryMESA")) == NULL) || r; - - return r; -} - -#endif /* EGL_MESA_image_dma_buf_export */ - -#ifdef EGL_MESA_query_driver - -static GLboolean _glewInit_EGL_MESA_query_driver () -{ - GLboolean r = GL_FALSE; - - r = ((eglGetDisplayDriverConfig = (PFNEGLGETDISPLAYDRIVERCONFIGPROC)glewGetProcAddress((const GLubyte*)"eglGetDisplayDriverConfig")) == NULL) || r; - r = ((eglGetDisplayDriverName = (PFNEGLGETDISPLAYDRIVERNAMEPROC)glewGetProcAddress((const GLubyte*)"eglGetDisplayDriverName")) == NULL) || r; - - return r; -} - -#endif /* EGL_MESA_query_driver */ - -#ifdef EGL_NOK_swap_region - -static GLboolean _glewInit_EGL_NOK_swap_region () -{ - GLboolean r = GL_FALSE; - - r = ((eglSwapBuffersRegionNOK = (PFNEGLSWAPBUFFERSREGIONNOKPROC)glewGetProcAddress((const GLubyte*)"eglSwapBuffersRegionNOK")) == NULL) || r; - - return r; -} - -#endif /* EGL_NOK_swap_region */ - -#ifdef EGL_NOK_swap_region2 - -static GLboolean _glewInit_EGL_NOK_swap_region2 () -{ - GLboolean r = GL_FALSE; - - r = ((eglSwapBuffersRegion2NOK = (PFNEGLSWAPBUFFERSREGION2NOKPROC)glewGetProcAddress((const GLubyte*)"eglSwapBuffersRegion2NOK")) == NULL) || r; - - return r; -} - -#endif /* EGL_NOK_swap_region2 */ - -#ifdef EGL_NV_native_query - -static GLboolean _glewInit_EGL_NV_native_query () -{ - GLboolean r = GL_FALSE; - - r = ((eglQueryNativeDisplayNV = (PFNEGLQUERYNATIVEDISPLAYNVPROC)glewGetProcAddress((const GLubyte*)"eglQueryNativeDisplayNV")) == NULL) || r; - r = ((eglQueryNativePixmapNV = (PFNEGLQUERYNATIVEPIXMAPNVPROC)glewGetProcAddress((const GLubyte*)"eglQueryNativePixmapNV")) == NULL) || r; - r = ((eglQueryNativeWindowNV = (PFNEGLQUERYNATIVEWINDOWNVPROC)glewGetProcAddress((const GLubyte*)"eglQueryNativeWindowNV")) == NULL) || r; - - return r; -} - -#endif /* EGL_NV_native_query */ - -#ifdef EGL_NV_post_sub_buffer - -static GLboolean _glewInit_EGL_NV_post_sub_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((eglPostSubBufferNV = (PFNEGLPOSTSUBBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"eglPostSubBufferNV")) == NULL) || r; - - return r; -} - -#endif /* EGL_NV_post_sub_buffer */ - -#ifdef EGL_NV_stream_consumer_gltexture_yuv - -static GLboolean _glewInit_EGL_NV_stream_consumer_gltexture_yuv () -{ - GLboolean r = GL_FALSE; - - r = ((eglStreamConsumerGLTextureExternalAttribsNV = (PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerGLTextureExternalAttribsNV")) == NULL) || r; - - return r; -} - -#endif /* EGL_NV_stream_consumer_gltexture_yuv */ - -#ifdef EGL_NV_stream_flush - -static GLboolean _glewInit_EGL_NV_stream_flush () -{ - GLboolean r = GL_FALSE; - - r = ((eglStreamFlushNV = (PFNEGLSTREAMFLUSHNVPROC)glewGetProcAddress((const GLubyte*)"eglStreamFlushNV")) == NULL) || r; - - return r; -} - -#endif /* EGL_NV_stream_flush */ - -#ifdef EGL_NV_stream_metadata - -static GLboolean _glewInit_EGL_NV_stream_metadata () -{ - GLboolean r = GL_FALSE; - - r = ((eglQueryDisplayAttribNV = (PFNEGLQUERYDISPLAYATTRIBNVPROC)glewGetProcAddress((const GLubyte*)"eglQueryDisplayAttribNV")) == NULL) || r; - r = ((eglQueryStreamMetadataNV = (PFNEGLQUERYSTREAMMETADATANVPROC)glewGetProcAddress((const GLubyte*)"eglQueryStreamMetadataNV")) == NULL) || r; - r = ((eglSetStreamMetadataNV = (PFNEGLSETSTREAMMETADATANVPROC)glewGetProcAddress((const GLubyte*)"eglSetStreamMetadataNV")) == NULL) || r; - - return r; -} - -#endif /* EGL_NV_stream_metadata */ - -#ifdef EGL_NV_stream_reset - -static GLboolean _glewInit_EGL_NV_stream_reset () -{ - GLboolean r = GL_FALSE; - - r = ((eglResetStreamNV = (PFNEGLRESETSTREAMNVPROC)glewGetProcAddress((const GLubyte*)"eglResetStreamNV")) == NULL) || r; - - return r; -} - -#endif /* EGL_NV_stream_reset */ - -#ifdef EGL_NV_stream_sync - -static GLboolean _glewInit_EGL_NV_stream_sync () -{ - GLboolean r = GL_FALSE; - - r = ((eglCreateStreamSyncNV = (PFNEGLCREATESTREAMSYNCNVPROC)glewGetProcAddress((const GLubyte*)"eglCreateStreamSyncNV")) == NULL) || r; - - return r; -} - -#endif /* EGL_NV_stream_sync */ - -#ifdef EGL_NV_sync - -static GLboolean _glewInit_EGL_NV_sync () -{ - GLboolean r = GL_FALSE; - - r = ((eglClientWaitSyncNV = (PFNEGLCLIENTWAITSYNCNVPROC)glewGetProcAddress((const GLubyte*)"eglClientWaitSyncNV")) == NULL) || r; - r = ((eglCreateFenceSyncNV = (PFNEGLCREATEFENCESYNCNVPROC)glewGetProcAddress((const GLubyte*)"eglCreateFenceSyncNV")) == NULL) || r; - r = ((eglDestroySyncNV = (PFNEGLDESTROYSYNCNVPROC)glewGetProcAddress((const GLubyte*)"eglDestroySyncNV")) == NULL) || r; - r = ((eglFenceNV = (PFNEGLFENCENVPROC)glewGetProcAddress((const GLubyte*)"eglFenceNV")) == NULL) || r; - r = ((eglGetSyncAttribNV = (PFNEGLGETSYNCATTRIBNVPROC)glewGetProcAddress((const GLubyte*)"eglGetSyncAttribNV")) == NULL) || r; - r = ((eglSignalSyncNV = (PFNEGLSIGNALSYNCNVPROC)glewGetProcAddress((const GLubyte*)"eglSignalSyncNV")) == NULL) || r; - - return r; -} - -#endif /* EGL_NV_sync */ - -#ifdef EGL_NV_system_time - -static GLboolean _glewInit_EGL_NV_system_time () -{ - GLboolean r = GL_FALSE; - - r = ((eglGetSystemTimeFrequencyNV = (PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC)glewGetProcAddress((const GLubyte*)"eglGetSystemTimeFrequencyNV")) == NULL) || r; - r = ((eglGetSystemTimeNV = (PFNEGLGETSYSTEMTIMENVPROC)glewGetProcAddress((const GLubyte*)"eglGetSystemTimeNV")) == NULL) || r; - - return r; -} - -#endif /* EGL_NV_system_time */ - -#ifdef EGL_WL_bind_wayland_display - -static GLboolean _glewInit_EGL_WL_bind_wayland_display () -{ - GLboolean r = GL_FALSE; - - r = ((eglBindWaylandDisplayWL = (PFNEGLBINDWAYLANDDISPLAYWLPROC)glewGetProcAddress((const GLubyte*)"eglBindWaylandDisplayWL")) == NULL) || r; - r = ((eglQueryWaylandBufferWL = (PFNEGLQUERYWAYLANDBUFFERWLPROC)glewGetProcAddress((const GLubyte*)"eglQueryWaylandBufferWL")) == NULL) || r; - r = ((eglUnbindWaylandDisplayWL = (PFNEGLUNBINDWAYLANDDISPLAYWLPROC)glewGetProcAddress((const GLubyte*)"eglUnbindWaylandDisplayWL")) == NULL) || r; - - return r; -} - -#endif /* EGL_WL_bind_wayland_display */ - -#ifdef EGL_WL_create_wayland_buffer_from_image - -static GLboolean _glewInit_EGL_WL_create_wayland_buffer_from_image () -{ - GLboolean r = GL_FALSE; - - r = ((eglCreateWaylandBufferFromImageWL = (PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC)glewGetProcAddress((const GLubyte*)"eglCreateWaylandBufferFromImageWL")) == NULL) || r; - - return r; -} - -#endif /* EGL_WL_create_wayland_buffer_from_image */ - - /* ------------------------------------------------------------------------ */ - -GLboolean eglewGetExtension (const char* name) -{ - const GLubyte* start; - const GLubyte* end; - - start = (const GLubyte*) eglQueryString(eglGetCurrentDisplay(), EGL_EXTENSIONS); - if (0 == start) return GL_FALSE; - end = start + _glewStrLen(start); - return _glewSearchExtension(name, start, end); -} - -GLenum eglewInit (EGLDisplay display) -{ - EGLint major, minor; - const GLubyte* extStart; - const GLubyte* extEnd; - PFNEGLINITIALIZEPROC initialize = NULL; - PFNEGLQUERYSTRINGPROC queryString = NULL; - - /* Load necessary entry points */ - initialize = (PFNEGLINITIALIZEPROC) glewGetProcAddress("eglInitialize"); - queryString = (PFNEGLQUERYSTRINGPROC) glewGetProcAddress("eglQueryString"); - if (!initialize || !queryString) - return 1; - - /* query EGK version */ - if (initialize(display, &major, &minor) != EGL_TRUE) - return 1; - - EGLEW_VERSION_1_5 = ( major > 1 ) || ( major == 1 && minor >= 5 ) ? GL_TRUE : GL_FALSE; - EGLEW_VERSION_1_4 = EGLEW_VERSION_1_5 == GL_TRUE || ( major == 1 && minor >= 4 ) ? GL_TRUE : GL_FALSE; - EGLEW_VERSION_1_3 = EGLEW_VERSION_1_4 == GL_TRUE || ( major == 1 && minor >= 3 ) ? GL_TRUE : GL_FALSE; - EGLEW_VERSION_1_2 = EGLEW_VERSION_1_3 == GL_TRUE || ( major == 1 && minor >= 2 ) ? GL_TRUE : GL_FALSE; - EGLEW_VERSION_1_1 = EGLEW_VERSION_1_2 == GL_TRUE || ( major == 1 && minor >= 1 ) ? GL_TRUE : GL_FALSE; - EGLEW_VERSION_1_0 = EGLEW_VERSION_1_1 == GL_TRUE || ( major == 1 && minor >= 0 ) ? GL_TRUE : GL_FALSE; - - /* query EGL extension string */ - extStart = (const GLubyte*) queryString(display, EGL_EXTENSIONS); - if (extStart == 0) - extStart = (const GLubyte *)""; - extEnd = extStart + _glewStrLen(extStart); - - /* initialize extensions */ -#ifdef EGL_VERSION_1_0 - if (glewExperimental || EGLEW_VERSION_1_0) EGLEW_VERSION_1_0 = !_glewInit_EGL_VERSION_1_0(); -#endif /* EGL_VERSION_1_0 */ -#ifdef EGL_VERSION_1_1 - if (glewExperimental || EGLEW_VERSION_1_1) EGLEW_VERSION_1_1 = !_glewInit_EGL_VERSION_1_1(); -#endif /* EGL_VERSION_1_1 */ -#ifdef EGL_VERSION_1_2 - if (glewExperimental || EGLEW_VERSION_1_2) EGLEW_VERSION_1_2 = !_glewInit_EGL_VERSION_1_2(); -#endif /* EGL_VERSION_1_2 */ -#ifdef EGL_VERSION_1_4 - if (glewExperimental || EGLEW_VERSION_1_4) EGLEW_VERSION_1_4 = !_glewInit_EGL_VERSION_1_4(); -#endif /* EGL_VERSION_1_4 */ -#ifdef EGL_VERSION_1_5 - if (glewExperimental || EGLEW_VERSION_1_5) EGLEW_VERSION_1_5 = !_glewInit_EGL_VERSION_1_5(); -#endif /* EGL_VERSION_1_5 */ -#ifdef EGL_ANDROID_GLES_layers - EGLEW_ANDROID_GLES_layers = _glewSearchExtension("EGL_ANDROID_GLES_layers", extStart, extEnd); -#endif /* EGL_ANDROID_GLES_layers */ -#ifdef EGL_ANDROID_blob_cache - EGLEW_ANDROID_blob_cache = _glewSearchExtension("EGL_ANDROID_blob_cache", extStart, extEnd); - if (glewExperimental || EGLEW_ANDROID_blob_cache) EGLEW_ANDROID_blob_cache = !_glewInit_EGL_ANDROID_blob_cache(); -#endif /* EGL_ANDROID_blob_cache */ -#ifdef EGL_ANDROID_create_native_client_buffer - EGLEW_ANDROID_create_native_client_buffer = _glewSearchExtension("EGL_ANDROID_create_native_client_buffer", extStart, extEnd); - if (glewExperimental || EGLEW_ANDROID_create_native_client_buffer) EGLEW_ANDROID_create_native_client_buffer = !_glewInit_EGL_ANDROID_create_native_client_buffer(); -#endif /* EGL_ANDROID_create_native_client_buffer */ -#ifdef EGL_ANDROID_framebuffer_target - EGLEW_ANDROID_framebuffer_target = _glewSearchExtension("EGL_ANDROID_framebuffer_target", extStart, extEnd); -#endif /* EGL_ANDROID_framebuffer_target */ -#ifdef EGL_ANDROID_front_buffer_auto_refresh - EGLEW_ANDROID_front_buffer_auto_refresh = _glewSearchExtension("EGL_ANDROID_front_buffer_auto_refresh", extStart, extEnd); -#endif /* EGL_ANDROID_front_buffer_auto_refresh */ -#ifdef EGL_ANDROID_get_frame_timestamps - EGLEW_ANDROID_get_frame_timestamps = _glewSearchExtension("EGL_ANDROID_get_frame_timestamps", extStart, extEnd); - if (glewExperimental || EGLEW_ANDROID_get_frame_timestamps) EGLEW_ANDROID_get_frame_timestamps = !_glewInit_EGL_ANDROID_get_frame_timestamps(); -#endif /* EGL_ANDROID_get_frame_timestamps */ -#ifdef EGL_ANDROID_get_native_client_buffer - EGLEW_ANDROID_get_native_client_buffer = _glewSearchExtension("EGL_ANDROID_get_native_client_buffer", extStart, extEnd); - if (glewExperimental || EGLEW_ANDROID_get_native_client_buffer) EGLEW_ANDROID_get_native_client_buffer = !_glewInit_EGL_ANDROID_get_native_client_buffer(); -#endif /* EGL_ANDROID_get_native_client_buffer */ -#ifdef EGL_ANDROID_image_native_buffer - EGLEW_ANDROID_image_native_buffer = _glewSearchExtension("EGL_ANDROID_image_native_buffer", extStart, extEnd); -#endif /* EGL_ANDROID_image_native_buffer */ -#ifdef EGL_ANDROID_native_fence_sync - EGLEW_ANDROID_native_fence_sync = _glewSearchExtension("EGL_ANDROID_native_fence_sync", extStart, extEnd); - if (glewExperimental || EGLEW_ANDROID_native_fence_sync) EGLEW_ANDROID_native_fence_sync = !_glewInit_EGL_ANDROID_native_fence_sync(); -#endif /* EGL_ANDROID_native_fence_sync */ -#ifdef EGL_ANDROID_presentation_time - EGLEW_ANDROID_presentation_time = _glewSearchExtension("EGL_ANDROID_presentation_time", extStart, extEnd); - if (glewExperimental || EGLEW_ANDROID_presentation_time) EGLEW_ANDROID_presentation_time = !_glewInit_EGL_ANDROID_presentation_time(); -#endif /* EGL_ANDROID_presentation_time */ -#ifdef EGL_ANDROID_recordable - EGLEW_ANDROID_recordable = _glewSearchExtension("EGL_ANDROID_recordable", extStart, extEnd); -#endif /* EGL_ANDROID_recordable */ -#ifdef EGL_ANGLE_d3d_share_handle_client_buffer - EGLEW_ANGLE_d3d_share_handle_client_buffer = _glewSearchExtension("EGL_ANGLE_d3d_share_handle_client_buffer", extStart, extEnd); -#endif /* EGL_ANGLE_d3d_share_handle_client_buffer */ -#ifdef EGL_ANGLE_device_d3d - EGLEW_ANGLE_device_d3d = _glewSearchExtension("EGL_ANGLE_device_d3d", extStart, extEnd); -#endif /* EGL_ANGLE_device_d3d */ -#ifdef EGL_ANGLE_query_surface_pointer - EGLEW_ANGLE_query_surface_pointer = _glewSearchExtension("EGL_ANGLE_query_surface_pointer", extStart, extEnd); - if (glewExperimental || EGLEW_ANGLE_query_surface_pointer) EGLEW_ANGLE_query_surface_pointer = !_glewInit_EGL_ANGLE_query_surface_pointer(); -#endif /* EGL_ANGLE_query_surface_pointer */ -#ifdef EGL_ANGLE_surface_d3d_texture_2d_share_handle - EGLEW_ANGLE_surface_d3d_texture_2d_share_handle = _glewSearchExtension("EGL_ANGLE_surface_d3d_texture_2d_share_handle", extStart, extEnd); -#endif /* EGL_ANGLE_surface_d3d_texture_2d_share_handle */ -#ifdef EGL_ANGLE_window_fixed_size - EGLEW_ANGLE_window_fixed_size = _glewSearchExtension("EGL_ANGLE_window_fixed_size", extStart, extEnd); -#endif /* EGL_ANGLE_window_fixed_size */ -#ifdef EGL_ARM_image_format - EGLEW_ARM_image_format = _glewSearchExtension("EGL_ARM_image_format", extStart, extEnd); -#endif /* EGL_ARM_image_format */ -#ifdef EGL_ARM_implicit_external_sync - EGLEW_ARM_implicit_external_sync = _glewSearchExtension("EGL_ARM_implicit_external_sync", extStart, extEnd); -#endif /* EGL_ARM_implicit_external_sync */ -#ifdef EGL_ARM_pixmap_multisample_discard - EGLEW_ARM_pixmap_multisample_discard = _glewSearchExtension("EGL_ARM_pixmap_multisample_discard", extStart, extEnd); -#endif /* EGL_ARM_pixmap_multisample_discard */ -#ifdef EGL_EXT_bind_to_front - EGLEW_EXT_bind_to_front = _glewSearchExtension("EGL_EXT_bind_to_front", extStart, extEnd); -#endif /* EGL_EXT_bind_to_front */ -#ifdef EGL_EXT_buffer_age - EGLEW_EXT_buffer_age = _glewSearchExtension("EGL_EXT_buffer_age", extStart, extEnd); -#endif /* EGL_EXT_buffer_age */ -#ifdef EGL_EXT_client_extensions - EGLEW_EXT_client_extensions = _glewSearchExtension("EGL_EXT_client_extensions", extStart, extEnd); -#endif /* EGL_EXT_client_extensions */ -#ifdef EGL_EXT_client_sync - EGLEW_EXT_client_sync = _glewSearchExtension("EGL_EXT_client_sync", extStart, extEnd); - if (glewExperimental || EGLEW_EXT_client_sync) EGLEW_EXT_client_sync = !_glewInit_EGL_EXT_client_sync(); -#endif /* EGL_EXT_client_sync */ -#ifdef EGL_EXT_compositor - EGLEW_EXT_compositor = _glewSearchExtension("EGL_EXT_compositor", extStart, extEnd); - if (glewExperimental || EGLEW_EXT_compositor) EGLEW_EXT_compositor = !_glewInit_EGL_EXT_compositor(); -#endif /* EGL_EXT_compositor */ -#ifdef EGL_EXT_create_context_robustness - EGLEW_EXT_create_context_robustness = _glewSearchExtension("EGL_EXT_create_context_robustness", extStart, extEnd); -#endif /* EGL_EXT_create_context_robustness */ -#ifdef EGL_EXT_device_base - EGLEW_EXT_device_base = _glewSearchExtension("EGL_EXT_device_base", extStart, extEnd); -#endif /* EGL_EXT_device_base */ -#ifdef EGL_EXT_device_drm - EGLEW_EXT_device_drm = _glewSearchExtension("EGL_EXT_device_drm", extStart, extEnd); -#endif /* EGL_EXT_device_drm */ -#ifdef EGL_EXT_device_enumeration - EGLEW_EXT_device_enumeration = _glewSearchExtension("EGL_EXT_device_enumeration", extStart, extEnd); - if (glewExperimental || EGLEW_EXT_device_enumeration) EGLEW_EXT_device_enumeration = !_glewInit_EGL_EXT_device_enumeration(); -#endif /* EGL_EXT_device_enumeration */ -#ifdef EGL_EXT_device_openwf - EGLEW_EXT_device_openwf = _glewSearchExtension("EGL_EXT_device_openwf", extStart, extEnd); -#endif /* EGL_EXT_device_openwf */ -#ifdef EGL_EXT_device_query - EGLEW_EXT_device_query = _glewSearchExtension("EGL_EXT_device_query", extStart, extEnd); - if (glewExperimental || EGLEW_EXT_device_query) EGLEW_EXT_device_query = !_glewInit_EGL_EXT_device_query(); -#endif /* EGL_EXT_device_query */ -#ifdef EGL_EXT_gl_colorspace_bt2020_linear - EGLEW_EXT_gl_colorspace_bt2020_linear = _glewSearchExtension("EGL_EXT_gl_colorspace_bt2020_linear", extStart, extEnd); -#endif /* EGL_EXT_gl_colorspace_bt2020_linear */ -#ifdef EGL_EXT_gl_colorspace_bt2020_pq - EGLEW_EXT_gl_colorspace_bt2020_pq = _glewSearchExtension("EGL_EXT_gl_colorspace_bt2020_pq", extStart, extEnd); -#endif /* EGL_EXT_gl_colorspace_bt2020_pq */ -#ifdef EGL_EXT_gl_colorspace_display_p3 - EGLEW_EXT_gl_colorspace_display_p3 = _glewSearchExtension("EGL_EXT_gl_colorspace_display_p3", extStart, extEnd); -#endif /* EGL_EXT_gl_colorspace_display_p3 */ -#ifdef EGL_EXT_gl_colorspace_display_p3_linear - EGLEW_EXT_gl_colorspace_display_p3_linear = _glewSearchExtension("EGL_EXT_gl_colorspace_display_p3_linear", extStart, extEnd); -#endif /* EGL_EXT_gl_colorspace_display_p3_linear */ -#ifdef EGL_EXT_gl_colorspace_display_p3_passthrough - EGLEW_EXT_gl_colorspace_display_p3_passthrough = _glewSearchExtension("EGL_EXT_gl_colorspace_display_p3_passthrough", extStart, extEnd); -#endif /* EGL_EXT_gl_colorspace_display_p3_passthrough */ -#ifdef EGL_EXT_gl_colorspace_scrgb - EGLEW_EXT_gl_colorspace_scrgb = _glewSearchExtension("EGL_EXT_gl_colorspace_scrgb", extStart, extEnd); -#endif /* EGL_EXT_gl_colorspace_scrgb */ -#ifdef EGL_EXT_gl_colorspace_scrgb_linear - EGLEW_EXT_gl_colorspace_scrgb_linear = _glewSearchExtension("EGL_EXT_gl_colorspace_scrgb_linear", extStart, extEnd); -#endif /* EGL_EXT_gl_colorspace_scrgb_linear */ -#ifdef EGL_EXT_image_dma_buf_import - EGLEW_EXT_image_dma_buf_import = _glewSearchExtension("EGL_EXT_image_dma_buf_import", extStart, extEnd); -#endif /* EGL_EXT_image_dma_buf_import */ -#ifdef EGL_EXT_image_dma_buf_import_modifiers - EGLEW_EXT_image_dma_buf_import_modifiers = _glewSearchExtension("EGL_EXT_image_dma_buf_import_modifiers", extStart, extEnd); - if (glewExperimental || EGLEW_EXT_image_dma_buf_import_modifiers) EGLEW_EXT_image_dma_buf_import_modifiers = !_glewInit_EGL_EXT_image_dma_buf_import_modifiers(); -#endif /* EGL_EXT_image_dma_buf_import_modifiers */ -#ifdef EGL_EXT_image_gl_colorspace - EGLEW_EXT_image_gl_colorspace = _glewSearchExtension("EGL_EXT_image_gl_colorspace", extStart, extEnd); -#endif /* EGL_EXT_image_gl_colorspace */ -#ifdef EGL_EXT_image_implicit_sync_control - EGLEW_EXT_image_implicit_sync_control = _glewSearchExtension("EGL_EXT_image_implicit_sync_control", extStart, extEnd); -#endif /* EGL_EXT_image_implicit_sync_control */ -#ifdef EGL_EXT_multiview_window - EGLEW_EXT_multiview_window = _glewSearchExtension("EGL_EXT_multiview_window", extStart, extEnd); -#endif /* EGL_EXT_multiview_window */ -#ifdef EGL_EXT_output_base - EGLEW_EXT_output_base = _glewSearchExtension("EGL_EXT_output_base", extStart, extEnd); - if (glewExperimental || EGLEW_EXT_output_base) EGLEW_EXT_output_base = !_glewInit_EGL_EXT_output_base(); -#endif /* EGL_EXT_output_base */ -#ifdef EGL_EXT_output_drm - EGLEW_EXT_output_drm = _glewSearchExtension("EGL_EXT_output_drm", extStart, extEnd); -#endif /* EGL_EXT_output_drm */ -#ifdef EGL_EXT_output_openwf - EGLEW_EXT_output_openwf = _glewSearchExtension("EGL_EXT_output_openwf", extStart, extEnd); -#endif /* EGL_EXT_output_openwf */ -#ifdef EGL_EXT_pixel_format_float - EGLEW_EXT_pixel_format_float = _glewSearchExtension("EGL_EXT_pixel_format_float", extStart, extEnd); -#endif /* EGL_EXT_pixel_format_float */ -#ifdef EGL_EXT_platform_base - EGLEW_EXT_platform_base = _glewSearchExtension("EGL_EXT_platform_base", extStart, extEnd); - if (glewExperimental || EGLEW_EXT_platform_base) EGLEW_EXT_platform_base = !_glewInit_EGL_EXT_platform_base(); -#endif /* EGL_EXT_platform_base */ -#ifdef EGL_EXT_platform_device - EGLEW_EXT_platform_device = _glewSearchExtension("EGL_EXT_platform_device", extStart, extEnd); -#endif /* EGL_EXT_platform_device */ -#ifdef EGL_EXT_platform_wayland - EGLEW_EXT_platform_wayland = _glewSearchExtension("EGL_EXT_platform_wayland", extStart, extEnd); -#endif /* EGL_EXT_platform_wayland */ -#ifdef EGL_EXT_platform_x11 - EGLEW_EXT_platform_x11 = _glewSearchExtension("EGL_EXT_platform_x11", extStart, extEnd); -#endif /* EGL_EXT_platform_x11 */ -#ifdef EGL_EXT_protected_content - EGLEW_EXT_protected_content = _glewSearchExtension("EGL_EXT_protected_content", extStart, extEnd); -#endif /* EGL_EXT_protected_content */ -#ifdef EGL_EXT_protected_surface - EGLEW_EXT_protected_surface = _glewSearchExtension("EGL_EXT_protected_surface", extStart, extEnd); -#endif /* EGL_EXT_protected_surface */ -#ifdef EGL_EXT_stream_consumer_egloutput - EGLEW_EXT_stream_consumer_egloutput = _glewSearchExtension("EGL_EXT_stream_consumer_egloutput", extStart, extEnd); - if (glewExperimental || EGLEW_EXT_stream_consumer_egloutput) EGLEW_EXT_stream_consumer_egloutput = !_glewInit_EGL_EXT_stream_consumer_egloutput(); -#endif /* EGL_EXT_stream_consumer_egloutput */ -#ifdef EGL_EXT_surface_CTA861_3_metadata - EGLEW_EXT_surface_CTA861_3_metadata = _glewSearchExtension("EGL_EXT_surface_CTA861_3_metadata", extStart, extEnd); -#endif /* EGL_EXT_surface_CTA861_3_metadata */ -#ifdef EGL_EXT_surface_SMPTE2086_metadata - EGLEW_EXT_surface_SMPTE2086_metadata = _glewSearchExtension("EGL_EXT_surface_SMPTE2086_metadata", extStart, extEnd); -#endif /* EGL_EXT_surface_SMPTE2086_metadata */ -#ifdef EGL_EXT_swap_buffers_with_damage - EGLEW_EXT_swap_buffers_with_damage = _glewSearchExtension("EGL_EXT_swap_buffers_with_damage", extStart, extEnd); - if (glewExperimental || EGLEW_EXT_swap_buffers_with_damage) EGLEW_EXT_swap_buffers_with_damage = !_glewInit_EGL_EXT_swap_buffers_with_damage(); -#endif /* EGL_EXT_swap_buffers_with_damage */ -#ifdef EGL_EXT_sync_reuse - EGLEW_EXT_sync_reuse = _glewSearchExtension("EGL_EXT_sync_reuse", extStart, extEnd); - if (glewExperimental || EGLEW_EXT_sync_reuse) EGLEW_EXT_sync_reuse = !_glewInit_EGL_EXT_sync_reuse(); -#endif /* EGL_EXT_sync_reuse */ -#ifdef EGL_EXT_yuv_surface - EGLEW_EXT_yuv_surface = _glewSearchExtension("EGL_EXT_yuv_surface", extStart, extEnd); -#endif /* EGL_EXT_yuv_surface */ -#ifdef EGL_HI_clientpixmap - EGLEW_HI_clientpixmap = _glewSearchExtension("EGL_HI_clientpixmap", extStart, extEnd); - if (glewExperimental || EGLEW_HI_clientpixmap) EGLEW_HI_clientpixmap = !_glewInit_EGL_HI_clientpixmap(); -#endif /* EGL_HI_clientpixmap */ -#ifdef EGL_HI_colorformats - EGLEW_HI_colorformats = _glewSearchExtension("EGL_HI_colorformats", extStart, extEnd); -#endif /* EGL_HI_colorformats */ -#ifdef EGL_IMG_context_priority - EGLEW_IMG_context_priority = _glewSearchExtension("EGL_IMG_context_priority", extStart, extEnd); -#endif /* EGL_IMG_context_priority */ -#ifdef EGL_IMG_image_plane_attribs - EGLEW_IMG_image_plane_attribs = _glewSearchExtension("EGL_IMG_image_plane_attribs", extStart, extEnd); -#endif /* EGL_IMG_image_plane_attribs */ -#ifdef EGL_KHR_cl_event - EGLEW_KHR_cl_event = _glewSearchExtension("EGL_KHR_cl_event", extStart, extEnd); -#endif /* EGL_KHR_cl_event */ -#ifdef EGL_KHR_cl_event2 - EGLEW_KHR_cl_event2 = _glewSearchExtension("EGL_KHR_cl_event2", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_cl_event2) EGLEW_KHR_cl_event2 = !_glewInit_EGL_KHR_cl_event2(); -#endif /* EGL_KHR_cl_event2 */ -#ifdef EGL_KHR_client_get_all_proc_addresses - EGLEW_KHR_client_get_all_proc_addresses = _glewSearchExtension("EGL_KHR_client_get_all_proc_addresses", extStart, extEnd); -#endif /* EGL_KHR_client_get_all_proc_addresses */ -#ifdef EGL_KHR_config_attribs - EGLEW_KHR_config_attribs = _glewSearchExtension("EGL_KHR_config_attribs", extStart, extEnd); -#endif /* EGL_KHR_config_attribs */ -#ifdef EGL_KHR_context_flush_control - EGLEW_KHR_context_flush_control = _glewSearchExtension("EGL_KHR_context_flush_control", extStart, extEnd); -#endif /* EGL_KHR_context_flush_control */ -#ifdef EGL_KHR_create_context - EGLEW_KHR_create_context = _glewSearchExtension("EGL_KHR_create_context", extStart, extEnd); -#endif /* EGL_KHR_create_context */ -#ifdef EGL_KHR_create_context_no_error - EGLEW_KHR_create_context_no_error = _glewSearchExtension("EGL_KHR_create_context_no_error", extStart, extEnd); -#endif /* EGL_KHR_create_context_no_error */ -#ifdef EGL_KHR_debug - EGLEW_KHR_debug = _glewSearchExtension("EGL_KHR_debug", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_debug) EGLEW_KHR_debug = !_glewInit_EGL_KHR_debug(); -#endif /* EGL_KHR_debug */ -#ifdef EGL_KHR_display_reference - EGLEW_KHR_display_reference = _glewSearchExtension("EGL_KHR_display_reference", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_display_reference) EGLEW_KHR_display_reference = !_glewInit_EGL_KHR_display_reference(); -#endif /* EGL_KHR_display_reference */ -#ifdef EGL_KHR_fence_sync - EGLEW_KHR_fence_sync = _glewSearchExtension("EGL_KHR_fence_sync", extStart, extEnd); -#endif /* EGL_KHR_fence_sync */ -#ifdef EGL_KHR_get_all_proc_addresses - EGLEW_KHR_get_all_proc_addresses = _glewSearchExtension("EGL_KHR_get_all_proc_addresses", extStart, extEnd); -#endif /* EGL_KHR_get_all_proc_addresses */ -#ifdef EGL_KHR_gl_colorspace - EGLEW_KHR_gl_colorspace = _glewSearchExtension("EGL_KHR_gl_colorspace", extStart, extEnd); -#endif /* EGL_KHR_gl_colorspace */ -#ifdef EGL_KHR_gl_renderbuffer_image - EGLEW_KHR_gl_renderbuffer_image = _glewSearchExtension("EGL_KHR_gl_renderbuffer_image", extStart, extEnd); -#endif /* EGL_KHR_gl_renderbuffer_image */ -#ifdef EGL_KHR_gl_texture_2D_image - EGLEW_KHR_gl_texture_2D_image = _glewSearchExtension("EGL_KHR_gl_texture_2D_image", extStart, extEnd); -#endif /* EGL_KHR_gl_texture_2D_image */ -#ifdef EGL_KHR_gl_texture_3D_image - EGLEW_KHR_gl_texture_3D_image = _glewSearchExtension("EGL_KHR_gl_texture_3D_image", extStart, extEnd); -#endif /* EGL_KHR_gl_texture_3D_image */ -#ifdef EGL_KHR_gl_texture_cubemap_image - EGLEW_KHR_gl_texture_cubemap_image = _glewSearchExtension("EGL_KHR_gl_texture_cubemap_image", extStart, extEnd); -#endif /* EGL_KHR_gl_texture_cubemap_image */ -#ifdef EGL_KHR_image - EGLEW_KHR_image = _glewSearchExtension("EGL_KHR_image", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_image) EGLEW_KHR_image = !_glewInit_EGL_KHR_image(); -#endif /* EGL_KHR_image */ -#ifdef EGL_KHR_image_base - EGLEW_KHR_image_base = _glewSearchExtension("EGL_KHR_image_base", extStart, extEnd); -#endif /* EGL_KHR_image_base */ -#ifdef EGL_KHR_image_pixmap - EGLEW_KHR_image_pixmap = _glewSearchExtension("EGL_KHR_image_pixmap", extStart, extEnd); -#endif /* EGL_KHR_image_pixmap */ -#ifdef EGL_KHR_lock_surface - EGLEW_KHR_lock_surface = _glewSearchExtension("EGL_KHR_lock_surface", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_lock_surface) EGLEW_KHR_lock_surface = !_glewInit_EGL_KHR_lock_surface(); -#endif /* EGL_KHR_lock_surface */ -#ifdef EGL_KHR_lock_surface2 - EGLEW_KHR_lock_surface2 = _glewSearchExtension("EGL_KHR_lock_surface2", extStart, extEnd); -#endif /* EGL_KHR_lock_surface2 */ -#ifdef EGL_KHR_lock_surface3 - EGLEW_KHR_lock_surface3 = _glewSearchExtension("EGL_KHR_lock_surface3", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_lock_surface3) EGLEW_KHR_lock_surface3 = !_glewInit_EGL_KHR_lock_surface3(); -#endif /* EGL_KHR_lock_surface3 */ -#ifdef EGL_KHR_mutable_render_buffer - EGLEW_KHR_mutable_render_buffer = _glewSearchExtension("EGL_KHR_mutable_render_buffer", extStart, extEnd); -#endif /* EGL_KHR_mutable_render_buffer */ -#ifdef EGL_KHR_no_config_context - EGLEW_KHR_no_config_context = _glewSearchExtension("EGL_KHR_no_config_context", extStart, extEnd); -#endif /* EGL_KHR_no_config_context */ -#ifdef EGL_KHR_partial_update - EGLEW_KHR_partial_update = _glewSearchExtension("EGL_KHR_partial_update", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_partial_update) EGLEW_KHR_partial_update = !_glewInit_EGL_KHR_partial_update(); -#endif /* EGL_KHR_partial_update */ -#ifdef EGL_KHR_platform_android - EGLEW_KHR_platform_android = _glewSearchExtension("EGL_KHR_platform_android", extStart, extEnd); -#endif /* EGL_KHR_platform_android */ -#ifdef EGL_KHR_platform_gbm - EGLEW_KHR_platform_gbm = _glewSearchExtension("EGL_KHR_platform_gbm", extStart, extEnd); -#endif /* EGL_KHR_platform_gbm */ -#ifdef EGL_KHR_platform_wayland - EGLEW_KHR_platform_wayland = _glewSearchExtension("EGL_KHR_platform_wayland", extStart, extEnd); -#endif /* EGL_KHR_platform_wayland */ -#ifdef EGL_KHR_platform_x11 - EGLEW_KHR_platform_x11 = _glewSearchExtension("EGL_KHR_platform_x11", extStart, extEnd); -#endif /* EGL_KHR_platform_x11 */ -#ifdef EGL_KHR_reusable_sync - EGLEW_KHR_reusable_sync = _glewSearchExtension("EGL_KHR_reusable_sync", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_reusable_sync) EGLEW_KHR_reusable_sync = !_glewInit_EGL_KHR_reusable_sync(); -#endif /* EGL_KHR_reusable_sync */ -#ifdef EGL_KHR_stream - EGLEW_KHR_stream = _glewSearchExtension("EGL_KHR_stream", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_stream) EGLEW_KHR_stream = !_glewInit_EGL_KHR_stream(); -#endif /* EGL_KHR_stream */ -#ifdef EGL_KHR_stream_attrib - EGLEW_KHR_stream_attrib = _glewSearchExtension("EGL_KHR_stream_attrib", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_stream_attrib) EGLEW_KHR_stream_attrib = !_glewInit_EGL_KHR_stream_attrib(); -#endif /* EGL_KHR_stream_attrib */ -#ifdef EGL_KHR_stream_consumer_gltexture - EGLEW_KHR_stream_consumer_gltexture = _glewSearchExtension("EGL_KHR_stream_consumer_gltexture", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_stream_consumer_gltexture) EGLEW_KHR_stream_consumer_gltexture = !_glewInit_EGL_KHR_stream_consumer_gltexture(); -#endif /* EGL_KHR_stream_consumer_gltexture */ -#ifdef EGL_KHR_stream_cross_process_fd - EGLEW_KHR_stream_cross_process_fd = _glewSearchExtension("EGL_KHR_stream_cross_process_fd", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_stream_cross_process_fd) EGLEW_KHR_stream_cross_process_fd = !_glewInit_EGL_KHR_stream_cross_process_fd(); -#endif /* EGL_KHR_stream_cross_process_fd */ -#ifdef EGL_KHR_stream_fifo - EGLEW_KHR_stream_fifo = _glewSearchExtension("EGL_KHR_stream_fifo", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_stream_fifo) EGLEW_KHR_stream_fifo = !_glewInit_EGL_KHR_stream_fifo(); -#endif /* EGL_KHR_stream_fifo */ -#ifdef EGL_KHR_stream_producer_aldatalocator - EGLEW_KHR_stream_producer_aldatalocator = _glewSearchExtension("EGL_KHR_stream_producer_aldatalocator", extStart, extEnd); -#endif /* EGL_KHR_stream_producer_aldatalocator */ -#ifdef EGL_KHR_stream_producer_eglsurface - EGLEW_KHR_stream_producer_eglsurface = _glewSearchExtension("EGL_KHR_stream_producer_eglsurface", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_stream_producer_eglsurface) EGLEW_KHR_stream_producer_eglsurface = !_glewInit_EGL_KHR_stream_producer_eglsurface(); -#endif /* EGL_KHR_stream_producer_eglsurface */ -#ifdef EGL_KHR_surfaceless_context - EGLEW_KHR_surfaceless_context = _glewSearchExtension("EGL_KHR_surfaceless_context", extStart, extEnd); -#endif /* EGL_KHR_surfaceless_context */ -#ifdef EGL_KHR_swap_buffers_with_damage - EGLEW_KHR_swap_buffers_with_damage = _glewSearchExtension("EGL_KHR_swap_buffers_with_damage", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_swap_buffers_with_damage) EGLEW_KHR_swap_buffers_with_damage = !_glewInit_EGL_KHR_swap_buffers_with_damage(); -#endif /* EGL_KHR_swap_buffers_with_damage */ -#ifdef EGL_KHR_vg_parent_image - EGLEW_KHR_vg_parent_image = _glewSearchExtension("EGL_KHR_vg_parent_image", extStart, extEnd); -#endif /* EGL_KHR_vg_parent_image */ -#ifdef EGL_KHR_wait_sync - EGLEW_KHR_wait_sync = _glewSearchExtension("EGL_KHR_wait_sync", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_wait_sync) EGLEW_KHR_wait_sync = !_glewInit_EGL_KHR_wait_sync(); -#endif /* EGL_KHR_wait_sync */ -#ifdef EGL_MESA_drm_image - EGLEW_MESA_drm_image = _glewSearchExtension("EGL_MESA_drm_image", extStart, extEnd); - if (glewExperimental || EGLEW_MESA_drm_image) EGLEW_MESA_drm_image = !_glewInit_EGL_MESA_drm_image(); -#endif /* EGL_MESA_drm_image */ -#ifdef EGL_MESA_image_dma_buf_export - EGLEW_MESA_image_dma_buf_export = _glewSearchExtension("EGL_MESA_image_dma_buf_export", extStart, extEnd); - if (glewExperimental || EGLEW_MESA_image_dma_buf_export) EGLEW_MESA_image_dma_buf_export = !_glewInit_EGL_MESA_image_dma_buf_export(); -#endif /* EGL_MESA_image_dma_buf_export */ -#ifdef EGL_MESA_platform_gbm - EGLEW_MESA_platform_gbm = _glewSearchExtension("EGL_MESA_platform_gbm", extStart, extEnd); -#endif /* EGL_MESA_platform_gbm */ -#ifdef EGL_MESA_platform_surfaceless - EGLEW_MESA_platform_surfaceless = _glewSearchExtension("EGL_MESA_platform_surfaceless", extStart, extEnd); -#endif /* EGL_MESA_platform_surfaceless */ -#ifdef EGL_MESA_query_driver - EGLEW_MESA_query_driver = _glewSearchExtension("EGL_MESA_query_driver", extStart, extEnd); - if (glewExperimental || EGLEW_MESA_query_driver) EGLEW_MESA_query_driver = !_glewInit_EGL_MESA_query_driver(); -#endif /* EGL_MESA_query_driver */ -#ifdef EGL_NOK_swap_region - EGLEW_NOK_swap_region = _glewSearchExtension("EGL_NOK_swap_region", extStart, extEnd); - if (glewExperimental || EGLEW_NOK_swap_region) EGLEW_NOK_swap_region = !_glewInit_EGL_NOK_swap_region(); -#endif /* EGL_NOK_swap_region */ -#ifdef EGL_NOK_swap_region2 - EGLEW_NOK_swap_region2 = _glewSearchExtension("EGL_NOK_swap_region2", extStart, extEnd); - if (glewExperimental || EGLEW_NOK_swap_region2) EGLEW_NOK_swap_region2 = !_glewInit_EGL_NOK_swap_region2(); -#endif /* EGL_NOK_swap_region2 */ -#ifdef EGL_NOK_texture_from_pixmap - EGLEW_NOK_texture_from_pixmap = _glewSearchExtension("EGL_NOK_texture_from_pixmap", extStart, extEnd); -#endif /* EGL_NOK_texture_from_pixmap */ -#ifdef EGL_NV_3dvision_surface - EGLEW_NV_3dvision_surface = _glewSearchExtension("EGL_NV_3dvision_surface", extStart, extEnd); -#endif /* EGL_NV_3dvision_surface */ -#ifdef EGL_NV_context_priority_realtime - EGLEW_NV_context_priority_realtime = _glewSearchExtension("EGL_NV_context_priority_realtime", extStart, extEnd); -#endif /* EGL_NV_context_priority_realtime */ -#ifdef EGL_NV_coverage_sample - EGLEW_NV_coverage_sample = _glewSearchExtension("EGL_NV_coverage_sample", extStart, extEnd); -#endif /* EGL_NV_coverage_sample */ -#ifdef EGL_NV_coverage_sample_resolve - EGLEW_NV_coverage_sample_resolve = _glewSearchExtension("EGL_NV_coverage_sample_resolve", extStart, extEnd); -#endif /* EGL_NV_coverage_sample_resolve */ -#ifdef EGL_NV_cuda_event - EGLEW_NV_cuda_event = _glewSearchExtension("EGL_NV_cuda_event", extStart, extEnd); -#endif /* EGL_NV_cuda_event */ -#ifdef EGL_NV_depth_nonlinear - EGLEW_NV_depth_nonlinear = _glewSearchExtension("EGL_NV_depth_nonlinear", extStart, extEnd); -#endif /* EGL_NV_depth_nonlinear */ -#ifdef EGL_NV_device_cuda - EGLEW_NV_device_cuda = _glewSearchExtension("EGL_NV_device_cuda", extStart, extEnd); -#endif /* EGL_NV_device_cuda */ -#ifdef EGL_NV_native_query - EGLEW_NV_native_query = _glewSearchExtension("EGL_NV_native_query", extStart, extEnd); - if (glewExperimental || EGLEW_NV_native_query) EGLEW_NV_native_query = !_glewInit_EGL_NV_native_query(); -#endif /* EGL_NV_native_query */ -#ifdef EGL_NV_post_convert_rounding - EGLEW_NV_post_convert_rounding = _glewSearchExtension("EGL_NV_post_convert_rounding", extStart, extEnd); -#endif /* EGL_NV_post_convert_rounding */ -#ifdef EGL_NV_post_sub_buffer - EGLEW_NV_post_sub_buffer = _glewSearchExtension("EGL_NV_post_sub_buffer", extStart, extEnd); - if (glewExperimental || EGLEW_NV_post_sub_buffer) EGLEW_NV_post_sub_buffer = !_glewInit_EGL_NV_post_sub_buffer(); -#endif /* EGL_NV_post_sub_buffer */ -#ifdef EGL_NV_quadruple_buffer - EGLEW_NV_quadruple_buffer = _glewSearchExtension("EGL_NV_quadruple_buffer", extStart, extEnd); -#endif /* EGL_NV_quadruple_buffer */ -#ifdef EGL_NV_robustness_video_memory_purge - EGLEW_NV_robustness_video_memory_purge = _glewSearchExtension("EGL_NV_robustness_video_memory_purge", extStart, extEnd); -#endif /* EGL_NV_robustness_video_memory_purge */ -#ifdef EGL_NV_stream_consumer_gltexture_yuv - EGLEW_NV_stream_consumer_gltexture_yuv = _glewSearchExtension("EGL_NV_stream_consumer_gltexture_yuv", extStart, extEnd); - if (glewExperimental || EGLEW_NV_stream_consumer_gltexture_yuv) EGLEW_NV_stream_consumer_gltexture_yuv = !_glewInit_EGL_NV_stream_consumer_gltexture_yuv(); -#endif /* EGL_NV_stream_consumer_gltexture_yuv */ -#ifdef EGL_NV_stream_cross_display - EGLEW_NV_stream_cross_display = _glewSearchExtension("EGL_NV_stream_cross_display", extStart, extEnd); -#endif /* EGL_NV_stream_cross_display */ -#ifdef EGL_NV_stream_cross_object - EGLEW_NV_stream_cross_object = _glewSearchExtension("EGL_NV_stream_cross_object", extStart, extEnd); -#endif /* EGL_NV_stream_cross_object */ -#ifdef EGL_NV_stream_cross_partition - EGLEW_NV_stream_cross_partition = _glewSearchExtension("EGL_NV_stream_cross_partition", extStart, extEnd); -#endif /* EGL_NV_stream_cross_partition */ -#ifdef EGL_NV_stream_cross_process - EGLEW_NV_stream_cross_process = _glewSearchExtension("EGL_NV_stream_cross_process", extStart, extEnd); -#endif /* EGL_NV_stream_cross_process */ -#ifdef EGL_NV_stream_cross_system - EGLEW_NV_stream_cross_system = _glewSearchExtension("EGL_NV_stream_cross_system", extStart, extEnd); -#endif /* EGL_NV_stream_cross_system */ -#ifdef EGL_NV_stream_dma - EGLEW_NV_stream_dma = _glewSearchExtension("EGL_NV_stream_dma", extStart, extEnd); -#endif /* EGL_NV_stream_dma */ -#ifdef EGL_NV_stream_fifo_next - EGLEW_NV_stream_fifo_next = _glewSearchExtension("EGL_NV_stream_fifo_next", extStart, extEnd); -#endif /* EGL_NV_stream_fifo_next */ -#ifdef EGL_NV_stream_fifo_synchronous - EGLEW_NV_stream_fifo_synchronous = _glewSearchExtension("EGL_NV_stream_fifo_synchronous", extStart, extEnd); -#endif /* EGL_NV_stream_fifo_synchronous */ -#ifdef EGL_NV_stream_flush - EGLEW_NV_stream_flush = _glewSearchExtension("EGL_NV_stream_flush", extStart, extEnd); - if (glewExperimental || EGLEW_NV_stream_flush) EGLEW_NV_stream_flush = !_glewInit_EGL_NV_stream_flush(); -#endif /* EGL_NV_stream_flush */ -#ifdef EGL_NV_stream_frame_limits - EGLEW_NV_stream_frame_limits = _glewSearchExtension("EGL_NV_stream_frame_limits", extStart, extEnd); -#endif /* EGL_NV_stream_frame_limits */ -#ifdef EGL_NV_stream_metadata - EGLEW_NV_stream_metadata = _glewSearchExtension("EGL_NV_stream_metadata", extStart, extEnd); - if (glewExperimental || EGLEW_NV_stream_metadata) EGLEW_NV_stream_metadata = !_glewInit_EGL_NV_stream_metadata(); -#endif /* EGL_NV_stream_metadata */ -#ifdef EGL_NV_stream_origin - EGLEW_NV_stream_origin = _glewSearchExtension("EGL_NV_stream_origin", extStart, extEnd); -#endif /* EGL_NV_stream_origin */ -#ifdef EGL_NV_stream_remote - EGLEW_NV_stream_remote = _glewSearchExtension("EGL_NV_stream_remote", extStart, extEnd); -#endif /* EGL_NV_stream_remote */ -#ifdef EGL_NV_stream_reset - EGLEW_NV_stream_reset = _glewSearchExtension("EGL_NV_stream_reset", extStart, extEnd); - if (glewExperimental || EGLEW_NV_stream_reset) EGLEW_NV_stream_reset = !_glewInit_EGL_NV_stream_reset(); -#endif /* EGL_NV_stream_reset */ -#ifdef EGL_NV_stream_socket - EGLEW_NV_stream_socket = _glewSearchExtension("EGL_NV_stream_socket", extStart, extEnd); -#endif /* EGL_NV_stream_socket */ -#ifdef EGL_NV_stream_socket_inet - EGLEW_NV_stream_socket_inet = _glewSearchExtension("EGL_NV_stream_socket_inet", extStart, extEnd); -#endif /* EGL_NV_stream_socket_inet */ -#ifdef EGL_NV_stream_socket_unix - EGLEW_NV_stream_socket_unix = _glewSearchExtension("EGL_NV_stream_socket_unix", extStart, extEnd); -#endif /* EGL_NV_stream_socket_unix */ -#ifdef EGL_NV_stream_sync - EGLEW_NV_stream_sync = _glewSearchExtension("EGL_NV_stream_sync", extStart, extEnd); - if (glewExperimental || EGLEW_NV_stream_sync) EGLEW_NV_stream_sync = !_glewInit_EGL_NV_stream_sync(); -#endif /* EGL_NV_stream_sync */ -#ifdef EGL_NV_sync - EGLEW_NV_sync = _glewSearchExtension("EGL_NV_sync", extStart, extEnd); - if (glewExperimental || EGLEW_NV_sync) EGLEW_NV_sync = !_glewInit_EGL_NV_sync(); -#endif /* EGL_NV_sync */ -#ifdef EGL_NV_system_time - EGLEW_NV_system_time = _glewSearchExtension("EGL_NV_system_time", extStart, extEnd); - if (glewExperimental || EGLEW_NV_system_time) EGLEW_NV_system_time = !_glewInit_EGL_NV_system_time(); -#endif /* EGL_NV_system_time */ -#ifdef EGL_NV_triple_buffer - EGLEW_NV_triple_buffer = _glewSearchExtension("EGL_NV_triple_buffer", extStart, extEnd); -#endif /* EGL_NV_triple_buffer */ -#ifdef EGL_TIZEN_image_native_buffer - EGLEW_TIZEN_image_native_buffer = _glewSearchExtension("EGL_TIZEN_image_native_buffer", extStart, extEnd); -#endif /* EGL_TIZEN_image_native_buffer */ -#ifdef EGL_TIZEN_image_native_surface - EGLEW_TIZEN_image_native_surface = _glewSearchExtension("EGL_TIZEN_image_native_surface", extStart, extEnd); -#endif /* EGL_TIZEN_image_native_surface */ -#ifdef EGL_WL_bind_wayland_display - EGLEW_WL_bind_wayland_display = _glewSearchExtension("EGL_WL_bind_wayland_display", extStart, extEnd); - if (glewExperimental || EGLEW_WL_bind_wayland_display) EGLEW_WL_bind_wayland_display = !_glewInit_EGL_WL_bind_wayland_display(); -#endif /* EGL_WL_bind_wayland_display */ -#ifdef EGL_WL_create_wayland_buffer_from_image - EGLEW_WL_create_wayland_buffer_from_image = _glewSearchExtension("EGL_WL_create_wayland_buffer_from_image", extStart, extEnd); - if (glewExperimental || EGLEW_WL_create_wayland_buffer_from_image) EGLEW_WL_create_wayland_buffer_from_image = !_glewInit_EGL_WL_create_wayland_buffer_from_image(); -#endif /* EGL_WL_create_wayland_buffer_from_image */ - - return GLEW_OK; -} - -#elif defined(_WIN32) - -PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL = NULL; - -PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD = NULL; -PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD = NULL; -PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD = NULL; -PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD = NULL; -PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD = NULL; -PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD = NULL; -PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD = NULL; -PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD = NULL; -PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD = NULL; - -PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB = NULL; -PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB = NULL; -PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB = NULL; -PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB = NULL; - -PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB = NULL; - -PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB = NULL; - -PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB = NULL; -PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB = NULL; - -PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB = NULL; -PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB = NULL; -PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB = NULL; -PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB = NULL; -PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB = NULL; - -PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB = NULL; -PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB = NULL; -PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB = NULL; - -PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB = NULL; -PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB = NULL; -PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB = NULL; - -PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT = NULL; -PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT = NULL; -PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT = NULL; -PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT = NULL; - -PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT = NULL; - -PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT = NULL; -PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT = NULL; - -PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT = NULL; -PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT = NULL; -PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT = NULL; -PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT = NULL; -PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT = NULL; - -PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT = NULL; -PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT = NULL; -PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT = NULL; - -PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT = NULL; -PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT = NULL; - -PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D = NULL; -PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D = NULL; - -PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D = NULL; -PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D = NULL; -PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D = NULL; -PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D = NULL; - -PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D = NULL; -PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D = NULL; -PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D = NULL; -PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D = NULL; -PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D = NULL; -PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D = NULL; -PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D = NULL; -PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D = NULL; -PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D = NULL; -PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D = NULL; -PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D = NULL; -PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D = NULL; - -PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D = NULL; -PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D = NULL; -PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D = NULL; -PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D = NULL; - -PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D = NULL; -PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D = NULL; -PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D = NULL; -PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D = NULL; - -PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D = NULL; -PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D = NULL; -PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D = NULL; -PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D = NULL; - -PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV = NULL; -PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV = NULL; -PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV = NULL; -PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV = NULL; -PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV = NULL; -PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV = NULL; -PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV = NULL; -PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV = NULL; - -PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV = NULL; - -PFNWGLDELAYBEFORESWAPNVPROC __wglewDelayBeforeSwapNV = NULL; - -PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV = NULL; -PFNWGLDELETEDCNVPROC __wglewDeleteDCNV = NULL; -PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV = NULL; -PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV = NULL; -PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV = NULL; - -PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV = NULL; -PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV = NULL; -PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV = NULL; - -PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV = NULL; -PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV = NULL; -PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV = NULL; -PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV = NULL; -PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV = NULL; -PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV = NULL; - -PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV = NULL; -PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV = NULL; - -PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV = NULL; -PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV = NULL; -PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV = NULL; -PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV = NULL; -PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV = NULL; - -PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV = NULL; -PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV = NULL; -PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV = NULL; -PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV = NULL; -PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV = NULL; -PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV = NULL; - -PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML = NULL; -PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML = NULL; -PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML = NULL; -PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML = NULL; -PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML = NULL; -PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML = NULL; -GLboolean __WGLEW_3DFX_multisample = GL_FALSE; -GLboolean __WGLEW_3DL_stereo_control = GL_FALSE; -GLboolean __WGLEW_AMD_gpu_association = GL_FALSE; -GLboolean __WGLEW_ARB_buffer_region = GL_FALSE; -GLboolean __WGLEW_ARB_context_flush_control = GL_FALSE; -GLboolean __WGLEW_ARB_create_context = GL_FALSE; -GLboolean __WGLEW_ARB_create_context_no_error = GL_FALSE; -GLboolean __WGLEW_ARB_create_context_profile = GL_FALSE; -GLboolean __WGLEW_ARB_create_context_robustness = GL_FALSE; -GLboolean __WGLEW_ARB_extensions_string = GL_FALSE; -GLboolean __WGLEW_ARB_framebuffer_sRGB = GL_FALSE; -GLboolean __WGLEW_ARB_make_current_read = GL_FALSE; -GLboolean __WGLEW_ARB_multisample = GL_FALSE; -GLboolean __WGLEW_ARB_pbuffer = GL_FALSE; -GLboolean __WGLEW_ARB_pixel_format = GL_FALSE; -GLboolean __WGLEW_ARB_pixel_format_float = GL_FALSE; -GLboolean __WGLEW_ARB_render_texture = GL_FALSE; -GLboolean __WGLEW_ARB_robustness_application_isolation = GL_FALSE; -GLboolean __WGLEW_ARB_robustness_share_group_isolation = GL_FALSE; -GLboolean __WGLEW_ATI_pixel_format_float = GL_FALSE; -GLboolean __WGLEW_ATI_render_texture_rectangle = GL_FALSE; -GLboolean __WGLEW_EXT_colorspace = GL_FALSE; -GLboolean __WGLEW_EXT_create_context_es2_profile = GL_FALSE; -GLboolean __WGLEW_EXT_create_context_es_profile = GL_FALSE; -GLboolean __WGLEW_EXT_depth_float = GL_FALSE; -GLboolean __WGLEW_EXT_display_color_table = GL_FALSE; -GLboolean __WGLEW_EXT_extensions_string = GL_FALSE; -GLboolean __WGLEW_EXT_framebuffer_sRGB = GL_FALSE; -GLboolean __WGLEW_EXT_make_current_read = GL_FALSE; -GLboolean __WGLEW_EXT_multisample = GL_FALSE; -GLboolean __WGLEW_EXT_pbuffer = GL_FALSE; -GLboolean __WGLEW_EXT_pixel_format = GL_FALSE; -GLboolean __WGLEW_EXT_pixel_format_packed_float = GL_FALSE; -GLboolean __WGLEW_EXT_swap_control = GL_FALSE; -GLboolean __WGLEW_EXT_swap_control_tear = GL_FALSE; -GLboolean __WGLEW_I3D_digital_video_control = GL_FALSE; -GLboolean __WGLEW_I3D_gamma = GL_FALSE; -GLboolean __WGLEW_I3D_genlock = GL_FALSE; -GLboolean __WGLEW_I3D_image_buffer = GL_FALSE; -GLboolean __WGLEW_I3D_swap_frame_lock = GL_FALSE; -GLboolean __WGLEW_I3D_swap_frame_usage = GL_FALSE; -GLboolean __WGLEW_NV_DX_interop = GL_FALSE; -GLboolean __WGLEW_NV_DX_interop2 = GL_FALSE; -GLboolean __WGLEW_NV_copy_image = GL_FALSE; -GLboolean __WGLEW_NV_delay_before_swap = GL_FALSE; -GLboolean __WGLEW_NV_float_buffer = GL_FALSE; -GLboolean __WGLEW_NV_gpu_affinity = GL_FALSE; -GLboolean __WGLEW_NV_multigpu_context = GL_FALSE; -GLboolean __WGLEW_NV_multisample_coverage = GL_FALSE; -GLboolean __WGLEW_NV_present_video = GL_FALSE; -GLboolean __WGLEW_NV_render_depth_texture = GL_FALSE; -GLboolean __WGLEW_NV_render_texture_rectangle = GL_FALSE; -GLboolean __WGLEW_NV_swap_group = GL_FALSE; -GLboolean __WGLEW_NV_vertex_array_range = GL_FALSE; -GLboolean __WGLEW_NV_video_capture = GL_FALSE; -GLboolean __WGLEW_NV_video_output = GL_FALSE; -GLboolean __WGLEW_OML_sync_control = GL_FALSE; -#ifdef WGL_3DL_stereo_control - -static GLboolean _glewInit_WGL_3DL_stereo_control () -{ - GLboolean r = GL_FALSE; - - r = ((wglSetStereoEmitterState3DL = (PFNWGLSETSTEREOEMITTERSTATE3DLPROC)glewGetProcAddress((const GLubyte*)"wglSetStereoEmitterState3DL")) == NULL) || r; - - return r; -} - -#endif /* WGL_3DL_stereo_control */ - -#ifdef WGL_AMD_gpu_association - -static GLboolean _glewInit_WGL_AMD_gpu_association () -{ - GLboolean r = GL_FALSE; - - r = ((wglBlitContextFramebufferAMD = (PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC)glewGetProcAddress((const GLubyte*)"wglBlitContextFramebufferAMD")) == NULL) || r; - r = ((wglCreateAssociatedContextAMD = (PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglCreateAssociatedContextAMD")) == NULL) || r; - r = ((wglCreateAssociatedContextAttribsAMD = (PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)glewGetProcAddress((const GLubyte*)"wglCreateAssociatedContextAttribsAMD")) == NULL) || r; - r = ((wglDeleteAssociatedContextAMD = (PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglDeleteAssociatedContextAMD")) == NULL) || r; - r = ((wglGetContextGPUIDAMD = (PFNWGLGETCONTEXTGPUIDAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetContextGPUIDAMD")) == NULL) || r; - r = ((wglGetCurrentAssociatedContextAMD = (PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentAssociatedContextAMD")) == NULL) || r; - r = ((wglGetGPUIDsAMD = (PFNWGLGETGPUIDSAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetGPUIDsAMD")) == NULL) || r; - r = ((wglGetGPUInfoAMD = (PFNWGLGETGPUINFOAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetGPUInfoAMD")) == NULL) || r; - r = ((wglMakeAssociatedContextCurrentAMD = (PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)glewGetProcAddress((const GLubyte*)"wglMakeAssociatedContextCurrentAMD")) == NULL) || r; - - return r; -} - -#endif /* WGL_AMD_gpu_association */ - -#ifdef WGL_ARB_buffer_region - -static GLboolean _glewInit_WGL_ARB_buffer_region () -{ - GLboolean r = GL_FALSE; - - r = ((wglCreateBufferRegionARB = (PFNWGLCREATEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglCreateBufferRegionARB")) == NULL) || r; - r = ((wglDeleteBufferRegionARB = (PFNWGLDELETEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglDeleteBufferRegionARB")) == NULL) || r; - r = ((wglRestoreBufferRegionARB = (PFNWGLRESTOREBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglRestoreBufferRegionARB")) == NULL) || r; - r = ((wglSaveBufferRegionARB = (PFNWGLSAVEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglSaveBufferRegionARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_buffer_region */ - -#ifdef WGL_ARB_create_context - -static GLboolean _glewInit_WGL_ARB_create_context () -{ - GLboolean r = GL_FALSE; - - r = ((wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)glewGetProcAddress((const GLubyte*)"wglCreateContextAttribsARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_create_context */ - -#ifdef WGL_ARB_extensions_string - -static GLboolean _glewInit_WGL_ARB_extensions_string () -{ - GLboolean r = GL_FALSE; - - r = ((wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_extensions_string */ - -#ifdef WGL_ARB_make_current_read - -static GLboolean _glewInit_WGL_ARB_make_current_read () -{ - GLboolean r = GL_FALSE; - - r = ((wglGetCurrentReadDCARB = (PFNWGLGETCURRENTREADDCARBPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentReadDCARB")) == NULL) || r; - r = ((wglMakeContextCurrentARB = (PFNWGLMAKECONTEXTCURRENTARBPROC)glewGetProcAddress((const GLubyte*)"wglMakeContextCurrentARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_make_current_read */ - -#ifdef WGL_ARB_pbuffer - -static GLboolean _glewInit_WGL_ARB_pbuffer () -{ - GLboolean r = GL_FALSE; - - r = ((wglCreatePbufferARB = (PFNWGLCREATEPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglCreatePbufferARB")) == NULL) || r; - r = ((wglDestroyPbufferARB = (PFNWGLDESTROYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglDestroyPbufferARB")) == NULL) || r; - r = ((wglGetPbufferDCARB = (PFNWGLGETPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPbufferDCARB")) == NULL) || r; - r = ((wglQueryPbufferARB = (PFNWGLQUERYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglQueryPbufferARB")) == NULL) || r; - r = ((wglReleasePbufferDCARB = (PFNWGLRELEASEPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)"wglReleasePbufferDCARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_pbuffer */ - -#ifdef WGL_ARB_pixel_format - -static GLboolean _glewInit_WGL_ARB_pixel_format () -{ - GLboolean r = GL_FALSE; - - r = ((wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)glewGetProcAddress((const GLubyte*)"wglChoosePixelFormatARB")) == NULL) || r; - r = ((wglGetPixelFormatAttribfvARB = (PFNWGLGETPIXELFORMATATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribfvARB")) == NULL) || r; - r = ((wglGetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribivARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_pixel_format */ - -#ifdef WGL_ARB_render_texture - -static GLboolean _glewInit_WGL_ARB_render_texture () -{ - GLboolean r = GL_FALSE; - - r = ((wglBindTexImageARB = (PFNWGLBINDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"wglBindTexImageARB")) == NULL) || r; - r = ((wglReleaseTexImageARB = (PFNWGLRELEASETEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"wglReleaseTexImageARB")) == NULL) || r; - r = ((wglSetPbufferAttribARB = (PFNWGLSETPBUFFERATTRIBARBPROC)glewGetProcAddress((const GLubyte*)"wglSetPbufferAttribARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_render_texture */ - -#ifdef WGL_EXT_display_color_table - -static GLboolean _glewInit_WGL_EXT_display_color_table () -{ - GLboolean r = GL_FALSE; - - r = ((wglBindDisplayColorTableEXT = (PFNWGLBINDDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglBindDisplayColorTableEXT")) == NULL) || r; - r = ((wglCreateDisplayColorTableEXT = (PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglCreateDisplayColorTableEXT")) == NULL) || r; - r = ((wglDestroyDisplayColorTableEXT = (PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglDestroyDisplayColorTableEXT")) == NULL) || r; - r = ((wglLoadDisplayColorTableEXT = (PFNWGLLOADDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglLoadDisplayColorTableEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_display_color_table */ - -#ifdef WGL_EXT_extensions_string - -static GLboolean _glewInit_WGL_EXT_extensions_string () -{ - GLboolean r = GL_FALSE; - - r = ((wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_extensions_string */ - -#ifdef WGL_EXT_make_current_read - -static GLboolean _glewInit_WGL_EXT_make_current_read () -{ - GLboolean r = GL_FALSE; - - r = ((wglGetCurrentReadDCEXT = (PFNWGLGETCURRENTREADDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentReadDCEXT")) == NULL) || r; - r = ((wglMakeContextCurrentEXT = (PFNWGLMAKECONTEXTCURRENTEXTPROC)glewGetProcAddress((const GLubyte*)"wglMakeContextCurrentEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_make_current_read */ - -#ifdef WGL_EXT_pbuffer - -static GLboolean _glewInit_WGL_EXT_pbuffer () -{ - GLboolean r = GL_FALSE; - - r = ((wglCreatePbufferEXT = (PFNWGLCREATEPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglCreatePbufferEXT")) == NULL) || r; - r = ((wglDestroyPbufferEXT = (PFNWGLDESTROYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglDestroyPbufferEXT")) == NULL) || r; - r = ((wglGetPbufferDCEXT = (PFNWGLGETPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPbufferDCEXT")) == NULL) || r; - r = ((wglQueryPbufferEXT = (PFNWGLQUERYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglQueryPbufferEXT")) == NULL) || r; - r = ((wglReleasePbufferDCEXT = (PFNWGLRELEASEPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglReleasePbufferDCEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_pbuffer */ - -#ifdef WGL_EXT_pixel_format - -static GLboolean _glewInit_WGL_EXT_pixel_format () -{ - GLboolean r = GL_FALSE; - - r = ((wglChoosePixelFormatEXT = (PFNWGLCHOOSEPIXELFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"wglChoosePixelFormatEXT")) == NULL) || r; - r = ((wglGetPixelFormatAttribfvEXT = (PFNWGLGETPIXELFORMATATTRIBFVEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribfvEXT")) == NULL) || r; - r = ((wglGetPixelFormatAttribivEXT = (PFNWGLGETPIXELFORMATATTRIBIVEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribivEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_pixel_format */ - -#ifdef WGL_EXT_swap_control - -static GLboolean _glewInit_WGL_EXT_swap_control () -{ - GLboolean r = GL_FALSE; - - r = ((wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetSwapIntervalEXT")) == NULL) || r; - r = ((wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"wglSwapIntervalEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_swap_control */ - -#ifdef WGL_I3D_digital_video_control - -static GLboolean _glewInit_WGL_I3D_digital_video_control () -{ - GLboolean r = GL_FALSE; - - r = ((wglGetDigitalVideoParametersI3D = (PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetDigitalVideoParametersI3D")) == NULL) || r; - r = ((wglSetDigitalVideoParametersI3D = (PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetDigitalVideoParametersI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_digital_video_control */ - -#ifdef WGL_I3D_gamma - -static GLboolean _glewInit_WGL_I3D_gamma () -{ - GLboolean r = GL_FALSE; - - r = ((wglGetGammaTableI3D = (PFNWGLGETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGammaTableI3D")) == NULL) || r; - r = ((wglGetGammaTableParametersI3D = (PFNWGLGETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGammaTableParametersI3D")) == NULL) || r; - r = ((wglSetGammaTableI3D = (PFNWGLSETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetGammaTableI3D")) == NULL) || r; - r = ((wglSetGammaTableParametersI3D = (PFNWGLSETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetGammaTableParametersI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_gamma */ - -#ifdef WGL_I3D_genlock - -static GLboolean _glewInit_WGL_I3D_genlock () -{ - GLboolean r = GL_FALSE; - - r = ((wglDisableGenlockI3D = (PFNWGLDISABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglDisableGenlockI3D")) == NULL) || r; - r = ((wglEnableGenlockI3D = (PFNWGLENABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglEnableGenlockI3D")) == NULL) || r; - r = ((wglGenlockSampleRateI3D = (PFNWGLGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSampleRateI3D")) == NULL) || r; - r = ((wglGenlockSourceDelayI3D = (PFNWGLGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceDelayI3D")) == NULL) || r; - r = ((wglGenlockSourceEdgeI3D = (PFNWGLGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceEdgeI3D")) == NULL) || r; - r = ((wglGenlockSourceI3D = (PFNWGLGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceI3D")) == NULL) || r; - r = ((wglGetGenlockSampleRateI3D = (PFNWGLGETGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSampleRateI3D")) == NULL) || r; - r = ((wglGetGenlockSourceDelayI3D = (PFNWGLGETGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceDelayI3D")) == NULL) || r; - r = ((wglGetGenlockSourceEdgeI3D = (PFNWGLGETGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceEdgeI3D")) == NULL) || r; - r = ((wglGetGenlockSourceI3D = (PFNWGLGETGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceI3D")) == NULL) || r; - r = ((wglIsEnabledGenlockI3D = (PFNWGLISENABLEDGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglIsEnabledGenlockI3D")) == NULL) || r; - r = ((wglQueryGenlockMaxSourceDelayI3D = (PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryGenlockMaxSourceDelayI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_genlock */ - -#ifdef WGL_I3D_image_buffer - -static GLboolean _glewInit_WGL_I3D_image_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((wglAssociateImageBufferEventsI3D = (PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)"wglAssociateImageBufferEventsI3D")) == NULL) || r; - r = ((wglCreateImageBufferI3D = (PFNWGLCREATEIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)"wglCreateImageBufferI3D")) == NULL) || r; - r = ((wglDestroyImageBufferI3D = (PFNWGLDESTROYIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)"wglDestroyImageBufferI3D")) == NULL) || r; - r = ((wglReleaseImageBufferEventsI3D = (PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)"wglReleaseImageBufferEventsI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_image_buffer */ - -#ifdef WGL_I3D_swap_frame_lock - -static GLboolean _glewInit_WGL_I3D_swap_frame_lock () -{ - GLboolean r = GL_FALSE; - - r = ((wglDisableFrameLockI3D = (PFNWGLDISABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglDisableFrameLockI3D")) == NULL) || r; - r = ((wglEnableFrameLockI3D = (PFNWGLENABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglEnableFrameLockI3D")) == NULL) || r; - r = ((wglIsEnabledFrameLockI3D = (PFNWGLISENABLEDFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglIsEnabledFrameLockI3D")) == NULL) || r; - r = ((wglQueryFrameLockMasterI3D = (PFNWGLQUERYFRAMELOCKMASTERI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameLockMasterI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_swap_frame_lock */ - -#ifdef WGL_I3D_swap_frame_usage - -static GLboolean _glewInit_WGL_I3D_swap_frame_usage () -{ - GLboolean r = GL_FALSE; - - r = ((wglBeginFrameTrackingI3D = (PFNWGLBEGINFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglBeginFrameTrackingI3D")) == NULL) || r; - r = ((wglEndFrameTrackingI3D = (PFNWGLENDFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglEndFrameTrackingI3D")) == NULL) || r; - r = ((wglGetFrameUsageI3D = (PFNWGLGETFRAMEUSAGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetFrameUsageI3D")) == NULL) || r; - r = ((wglQueryFrameTrackingI3D = (PFNWGLQUERYFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameTrackingI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_swap_frame_usage */ - -#ifdef WGL_NV_DX_interop - -static GLboolean _glewInit_WGL_NV_DX_interop () -{ - GLboolean r = GL_FALSE; - - r = ((wglDXCloseDeviceNV = (PFNWGLDXCLOSEDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglDXCloseDeviceNV")) == NULL) || r; - r = ((wglDXLockObjectsNV = (PFNWGLDXLOCKOBJECTSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXLockObjectsNV")) == NULL) || r; - r = ((wglDXObjectAccessNV = (PFNWGLDXOBJECTACCESSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXObjectAccessNV")) == NULL) || r; - r = ((wglDXOpenDeviceNV = (PFNWGLDXOPENDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglDXOpenDeviceNV")) == NULL) || r; - r = ((wglDXRegisterObjectNV = (PFNWGLDXREGISTEROBJECTNVPROC)glewGetProcAddress((const GLubyte*)"wglDXRegisterObjectNV")) == NULL) || r; - r = ((wglDXSetResourceShareHandleNV = (PFNWGLDXSETRESOURCESHAREHANDLENVPROC)glewGetProcAddress((const GLubyte*)"wglDXSetResourceShareHandleNV")) == NULL) || r; - r = ((wglDXUnlockObjectsNV = (PFNWGLDXUNLOCKOBJECTSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXUnlockObjectsNV")) == NULL) || r; - r = ((wglDXUnregisterObjectNV = (PFNWGLDXUNREGISTEROBJECTNVPROC)glewGetProcAddress((const GLubyte*)"wglDXUnregisterObjectNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_DX_interop */ - -#ifdef WGL_NV_copy_image - -static GLboolean _glewInit_WGL_NV_copy_image () -{ - GLboolean r = GL_FALSE; - - r = ((wglCopyImageSubDataNV = (PFNWGLCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"wglCopyImageSubDataNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_copy_image */ - -#ifdef WGL_NV_delay_before_swap - -static GLboolean _glewInit_WGL_NV_delay_before_swap () -{ - GLboolean r = GL_FALSE; - - r = ((wglDelayBeforeSwapNV = (PFNWGLDELAYBEFORESWAPNVPROC)glewGetProcAddress((const GLubyte*)"wglDelayBeforeSwapNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_delay_before_swap */ - -#ifdef WGL_NV_gpu_affinity - -static GLboolean _glewInit_WGL_NV_gpu_affinity () -{ - GLboolean r = GL_FALSE; - - r = ((wglCreateAffinityDCNV = (PFNWGLCREATEAFFINITYDCNVPROC)glewGetProcAddress((const GLubyte*)"wglCreateAffinityDCNV")) == NULL) || r; - r = ((wglDeleteDCNV = (PFNWGLDELETEDCNVPROC)glewGetProcAddress((const GLubyte*)"wglDeleteDCNV")) == NULL) || r; - r = ((wglEnumGpuDevicesNV = (PFNWGLENUMGPUDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpuDevicesNV")) == NULL) || r; - r = ((wglEnumGpusFromAffinityDCNV = (PFNWGLENUMGPUSFROMAFFINITYDCNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpusFromAffinityDCNV")) == NULL) || r; - r = ((wglEnumGpusNV = (PFNWGLENUMGPUSNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpusNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_gpu_affinity */ - -#ifdef WGL_NV_present_video - -static GLboolean _glewInit_WGL_NV_present_video () -{ - GLboolean r = GL_FALSE; - - r = ((wglBindVideoDeviceNV = (PFNWGLBINDVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoDeviceNV")) == NULL) || r; - r = ((wglEnumerateVideoDevicesNV = (PFNWGLENUMERATEVIDEODEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumerateVideoDevicesNV")) == NULL) || r; - r = ((wglQueryCurrentContextNV = (PFNWGLQUERYCURRENTCONTEXTNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryCurrentContextNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_present_video */ - -#ifdef WGL_NV_swap_group - -static GLboolean _glewInit_WGL_NV_swap_group () -{ - GLboolean r = GL_FALSE; - - r = ((wglBindSwapBarrierNV = (PFNWGLBINDSWAPBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"wglBindSwapBarrierNV")) == NULL) || r; - r = ((wglJoinSwapGroupNV = (PFNWGLJOINSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"wglJoinSwapGroupNV")) == NULL) || r; - r = ((wglQueryFrameCountNV = (PFNWGLQUERYFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameCountNV")) == NULL) || r; - r = ((wglQueryMaxSwapGroupsNV = (PFNWGLQUERYMAXSWAPGROUPSNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryMaxSwapGroupsNV")) == NULL) || r; - r = ((wglQuerySwapGroupNV = (PFNWGLQUERYSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"wglQuerySwapGroupNV")) == NULL) || r; - r = ((wglResetFrameCountNV = (PFNWGLRESETFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"wglResetFrameCountNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_swap_group */ - -#ifdef WGL_NV_vertex_array_range - -static GLboolean _glewInit_WGL_NV_vertex_array_range () -{ - GLboolean r = GL_FALSE; - - r = ((wglAllocateMemoryNV = (PFNWGLALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"wglAllocateMemoryNV")) == NULL) || r; - r = ((wglFreeMemoryNV = (PFNWGLFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"wglFreeMemoryNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_vertex_array_range */ - -#ifdef WGL_NV_video_capture - -static GLboolean _glewInit_WGL_NV_video_capture () -{ - GLboolean r = GL_FALSE; - - r = ((wglBindVideoCaptureDeviceNV = (PFNWGLBINDVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoCaptureDeviceNV")) == NULL) || r; - r = ((wglEnumerateVideoCaptureDevicesNV = (PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumerateVideoCaptureDevicesNV")) == NULL) || r; - r = ((wglLockVideoCaptureDeviceNV = (PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglLockVideoCaptureDeviceNV")) == NULL) || r; - r = ((wglQueryVideoCaptureDeviceNV = (PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglQueryVideoCaptureDeviceNV")) == NULL) || r; - r = ((wglReleaseVideoCaptureDeviceNV = (PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoCaptureDeviceNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_video_capture */ - -#ifdef WGL_NV_video_output - -static GLboolean _glewInit_WGL_NV_video_output () -{ - GLboolean r = GL_FALSE; - - r = ((wglBindVideoImageNV = (PFNWGLBINDVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoImageNV")) == NULL) || r; - r = ((wglGetVideoDeviceNV = (PFNWGLGETVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglGetVideoDeviceNV")) == NULL) || r; - r = ((wglGetVideoInfoNV = (PFNWGLGETVIDEOINFONVPROC)glewGetProcAddress((const GLubyte*)"wglGetVideoInfoNV")) == NULL) || r; - r = ((wglReleaseVideoDeviceNV = (PFNWGLRELEASEVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoDeviceNV")) == NULL) || r; - r = ((wglReleaseVideoImageNV = (PFNWGLRELEASEVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoImageNV")) == NULL) || r; - r = ((wglSendPbufferToVideoNV = (PFNWGLSENDPBUFFERTOVIDEONVPROC)glewGetProcAddress((const GLubyte*)"wglSendPbufferToVideoNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_video_output */ - -#ifdef WGL_OML_sync_control - -static GLboolean _glewInit_WGL_OML_sync_control () -{ - GLboolean r = GL_FALSE; - - r = ((wglGetMscRateOML = (PFNWGLGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)"wglGetMscRateOML")) == NULL) || r; - r = ((wglGetSyncValuesOML = (PFNWGLGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)"wglGetSyncValuesOML")) == NULL) || r; - r = ((wglSwapBuffersMscOML = (PFNWGLSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglSwapBuffersMscOML")) == NULL) || r; - r = ((wglSwapLayerBuffersMscOML = (PFNWGLSWAPLAYERBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglSwapLayerBuffersMscOML")) == NULL) || r; - r = ((wglWaitForMscOML = (PFNWGLWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglWaitForMscOML")) == NULL) || r; - r = ((wglWaitForSbcOML = (PFNWGLWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)"wglWaitForSbcOML")) == NULL) || r; - - return r; -} - -#endif /* WGL_OML_sync_control */ - -/* ------------------------------------------------------------------------- */ - -static PFNWGLGETEXTENSIONSSTRINGARBPROC _wglewGetExtensionsStringARB = NULL; -static PFNWGLGETEXTENSIONSSTRINGEXTPROC _wglewGetExtensionsStringEXT = NULL; - -GLboolean GLEWAPIENTRY wglewGetExtension (const char* name) -{ - const GLubyte* start; - const GLubyte* end; - if (_wglewGetExtensionsStringARB == NULL) - if (_wglewGetExtensionsStringEXT == NULL) - return GL_FALSE; - else - start = (const GLubyte*)_wglewGetExtensionsStringEXT(); - else - start = (const GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC()); - if (start == 0) - return GL_FALSE; - end = start + _glewStrLen(start); - return _glewSearchExtension(name, start, end); -} - -GLenum GLEWAPIENTRY wglewInit () -{ - GLboolean crippled; - const GLubyte* extStart; - const GLubyte* extEnd; - /* find wgl extension string query functions */ - _wglewGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB"); - _wglewGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT"); - /* query wgl extension string */ - if (_wglewGetExtensionsStringARB == NULL) - if (_wglewGetExtensionsStringEXT == NULL) - extStart = (const GLubyte*)""; - else - extStart = (const GLubyte*)_wglewGetExtensionsStringEXT(); - else - extStart = (const GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC()); - extEnd = extStart + _glewStrLen(extStart); - /* initialize extensions */ - crippled = _wglewGetExtensionsStringARB == NULL && _wglewGetExtensionsStringEXT == NULL; -#ifdef WGL_3DFX_multisample - WGLEW_3DFX_multisample = _glewSearchExtension("WGL_3DFX_multisample", extStart, extEnd); -#endif /* WGL_3DFX_multisample */ -#ifdef WGL_3DL_stereo_control - WGLEW_3DL_stereo_control = _glewSearchExtension("WGL_3DL_stereo_control", extStart, extEnd); - if (glewExperimental || WGLEW_3DL_stereo_control|| crippled) WGLEW_3DL_stereo_control= !_glewInit_WGL_3DL_stereo_control(); -#endif /* WGL_3DL_stereo_control */ -#ifdef WGL_AMD_gpu_association - WGLEW_AMD_gpu_association = _glewSearchExtension("WGL_AMD_gpu_association", extStart, extEnd); - if (glewExperimental || WGLEW_AMD_gpu_association|| crippled) WGLEW_AMD_gpu_association= !_glewInit_WGL_AMD_gpu_association(); -#endif /* WGL_AMD_gpu_association */ -#ifdef WGL_ARB_buffer_region - WGLEW_ARB_buffer_region = _glewSearchExtension("WGL_ARB_buffer_region", extStart, extEnd); - if (glewExperimental || WGLEW_ARB_buffer_region|| crippled) WGLEW_ARB_buffer_region= !_glewInit_WGL_ARB_buffer_region(); -#endif /* WGL_ARB_buffer_region */ -#ifdef WGL_ARB_context_flush_control - WGLEW_ARB_context_flush_control = _glewSearchExtension("WGL_ARB_context_flush_control", extStart, extEnd); -#endif /* WGL_ARB_context_flush_control */ -#ifdef WGL_ARB_create_context - WGLEW_ARB_create_context = _glewSearchExtension("WGL_ARB_create_context", extStart, extEnd); - if (glewExperimental || WGLEW_ARB_create_context|| crippled) WGLEW_ARB_create_context= !_glewInit_WGL_ARB_create_context(); -#endif /* WGL_ARB_create_context */ -#ifdef WGL_ARB_create_context_no_error - WGLEW_ARB_create_context_no_error = _glewSearchExtension("WGL_ARB_create_context_no_error", extStart, extEnd); -#endif /* WGL_ARB_create_context_no_error */ -#ifdef WGL_ARB_create_context_profile - WGLEW_ARB_create_context_profile = _glewSearchExtension("WGL_ARB_create_context_profile", extStart, extEnd); -#endif /* WGL_ARB_create_context_profile */ -#ifdef WGL_ARB_create_context_robustness - WGLEW_ARB_create_context_robustness = _glewSearchExtension("WGL_ARB_create_context_robustness", extStart, extEnd); -#endif /* WGL_ARB_create_context_robustness */ -#ifdef WGL_ARB_extensions_string - WGLEW_ARB_extensions_string = _glewSearchExtension("WGL_ARB_extensions_string", extStart, extEnd); - if (glewExperimental || WGLEW_ARB_extensions_string|| crippled) WGLEW_ARB_extensions_string= !_glewInit_WGL_ARB_extensions_string(); -#endif /* WGL_ARB_extensions_string */ -#ifdef WGL_ARB_framebuffer_sRGB - WGLEW_ARB_framebuffer_sRGB = _glewSearchExtension("WGL_ARB_framebuffer_sRGB", extStart, extEnd); -#endif /* WGL_ARB_framebuffer_sRGB */ -#ifdef WGL_ARB_make_current_read - WGLEW_ARB_make_current_read = _glewSearchExtension("WGL_ARB_make_current_read", extStart, extEnd); - if (glewExperimental || WGLEW_ARB_make_current_read|| crippled) WGLEW_ARB_make_current_read= !_glewInit_WGL_ARB_make_current_read(); -#endif /* WGL_ARB_make_current_read */ -#ifdef WGL_ARB_multisample - WGLEW_ARB_multisample = _glewSearchExtension("WGL_ARB_multisample", extStart, extEnd); -#endif /* WGL_ARB_multisample */ -#ifdef WGL_ARB_pbuffer - WGLEW_ARB_pbuffer = _glewSearchExtension("WGL_ARB_pbuffer", extStart, extEnd); - if (glewExperimental || WGLEW_ARB_pbuffer|| crippled) WGLEW_ARB_pbuffer= !_glewInit_WGL_ARB_pbuffer(); -#endif /* WGL_ARB_pbuffer */ -#ifdef WGL_ARB_pixel_format - WGLEW_ARB_pixel_format = _glewSearchExtension("WGL_ARB_pixel_format", extStart, extEnd); - if (glewExperimental || WGLEW_ARB_pixel_format|| crippled) WGLEW_ARB_pixel_format= !_glewInit_WGL_ARB_pixel_format(); -#endif /* WGL_ARB_pixel_format */ -#ifdef WGL_ARB_pixel_format_float - WGLEW_ARB_pixel_format_float = _glewSearchExtension("WGL_ARB_pixel_format_float", extStart, extEnd); -#endif /* WGL_ARB_pixel_format_float */ -#ifdef WGL_ARB_render_texture - WGLEW_ARB_render_texture = _glewSearchExtension("WGL_ARB_render_texture", extStart, extEnd); - if (glewExperimental || WGLEW_ARB_render_texture|| crippled) WGLEW_ARB_render_texture= !_glewInit_WGL_ARB_render_texture(); -#endif /* WGL_ARB_render_texture */ -#ifdef WGL_ARB_robustness_application_isolation - WGLEW_ARB_robustness_application_isolation = _glewSearchExtension("WGL_ARB_robustness_application_isolation", extStart, extEnd); -#endif /* WGL_ARB_robustness_application_isolation */ -#ifdef WGL_ARB_robustness_share_group_isolation - WGLEW_ARB_robustness_share_group_isolation = _glewSearchExtension("WGL_ARB_robustness_share_group_isolation", extStart, extEnd); -#endif /* WGL_ARB_robustness_share_group_isolation */ -#ifdef WGL_ATI_pixel_format_float - WGLEW_ATI_pixel_format_float = _glewSearchExtension("WGL_ATI_pixel_format_float", extStart, extEnd); -#endif /* WGL_ATI_pixel_format_float */ -#ifdef WGL_ATI_render_texture_rectangle - WGLEW_ATI_render_texture_rectangle = _glewSearchExtension("WGL_ATI_render_texture_rectangle", extStart, extEnd); -#endif /* WGL_ATI_render_texture_rectangle */ -#ifdef WGL_EXT_colorspace - WGLEW_EXT_colorspace = _glewSearchExtension("WGL_EXT_colorspace", extStart, extEnd); -#endif /* WGL_EXT_colorspace */ -#ifdef WGL_EXT_create_context_es2_profile - WGLEW_EXT_create_context_es2_profile = _glewSearchExtension("WGL_EXT_create_context_es2_profile", extStart, extEnd); -#endif /* WGL_EXT_create_context_es2_profile */ -#ifdef WGL_EXT_create_context_es_profile - WGLEW_EXT_create_context_es_profile = _glewSearchExtension("WGL_EXT_create_context_es_profile", extStart, extEnd); -#endif /* WGL_EXT_create_context_es_profile */ -#ifdef WGL_EXT_depth_float - WGLEW_EXT_depth_float = _glewSearchExtension("WGL_EXT_depth_float", extStart, extEnd); -#endif /* WGL_EXT_depth_float */ -#ifdef WGL_EXT_display_color_table - WGLEW_EXT_display_color_table = _glewSearchExtension("WGL_EXT_display_color_table", extStart, extEnd); - if (glewExperimental || WGLEW_EXT_display_color_table|| crippled) WGLEW_EXT_display_color_table= !_glewInit_WGL_EXT_display_color_table(); -#endif /* WGL_EXT_display_color_table */ -#ifdef WGL_EXT_extensions_string - WGLEW_EXT_extensions_string = _glewSearchExtension("WGL_EXT_extensions_string", extStart, extEnd); - if (glewExperimental || WGLEW_EXT_extensions_string|| crippled) WGLEW_EXT_extensions_string= !_glewInit_WGL_EXT_extensions_string(); -#endif /* WGL_EXT_extensions_string */ -#ifdef WGL_EXT_framebuffer_sRGB - WGLEW_EXT_framebuffer_sRGB = _glewSearchExtension("WGL_EXT_framebuffer_sRGB", extStart, extEnd); -#endif /* WGL_EXT_framebuffer_sRGB */ -#ifdef WGL_EXT_make_current_read - WGLEW_EXT_make_current_read = _glewSearchExtension("WGL_EXT_make_current_read", extStart, extEnd); - if (glewExperimental || WGLEW_EXT_make_current_read|| crippled) WGLEW_EXT_make_current_read= !_glewInit_WGL_EXT_make_current_read(); -#endif /* WGL_EXT_make_current_read */ -#ifdef WGL_EXT_multisample - WGLEW_EXT_multisample = _glewSearchExtension("WGL_EXT_multisample", extStart, extEnd); -#endif /* WGL_EXT_multisample */ -#ifdef WGL_EXT_pbuffer - WGLEW_EXT_pbuffer = _glewSearchExtension("WGL_EXT_pbuffer", extStart, extEnd); - if (glewExperimental || WGLEW_EXT_pbuffer|| crippled) WGLEW_EXT_pbuffer= !_glewInit_WGL_EXT_pbuffer(); -#endif /* WGL_EXT_pbuffer */ -#ifdef WGL_EXT_pixel_format - WGLEW_EXT_pixel_format = _glewSearchExtension("WGL_EXT_pixel_format", extStart, extEnd); - if (glewExperimental || WGLEW_EXT_pixel_format|| crippled) WGLEW_EXT_pixel_format= !_glewInit_WGL_EXT_pixel_format(); -#endif /* WGL_EXT_pixel_format */ -#ifdef WGL_EXT_pixel_format_packed_float - WGLEW_EXT_pixel_format_packed_float = _glewSearchExtension("WGL_EXT_pixel_format_packed_float", extStart, extEnd); -#endif /* WGL_EXT_pixel_format_packed_float */ -#ifdef WGL_EXT_swap_control - WGLEW_EXT_swap_control = _glewSearchExtension("WGL_EXT_swap_control", extStart, extEnd); - if (glewExperimental || WGLEW_EXT_swap_control|| crippled) WGLEW_EXT_swap_control= !_glewInit_WGL_EXT_swap_control(); -#endif /* WGL_EXT_swap_control */ -#ifdef WGL_EXT_swap_control_tear - WGLEW_EXT_swap_control_tear = _glewSearchExtension("WGL_EXT_swap_control_tear", extStart, extEnd); -#endif /* WGL_EXT_swap_control_tear */ -#ifdef WGL_I3D_digital_video_control - WGLEW_I3D_digital_video_control = _glewSearchExtension("WGL_I3D_digital_video_control", extStart, extEnd); - if (glewExperimental || WGLEW_I3D_digital_video_control|| crippled) WGLEW_I3D_digital_video_control= !_glewInit_WGL_I3D_digital_video_control(); -#endif /* WGL_I3D_digital_video_control */ -#ifdef WGL_I3D_gamma - WGLEW_I3D_gamma = _glewSearchExtension("WGL_I3D_gamma", extStart, extEnd); - if (glewExperimental || WGLEW_I3D_gamma|| crippled) WGLEW_I3D_gamma= !_glewInit_WGL_I3D_gamma(); -#endif /* WGL_I3D_gamma */ -#ifdef WGL_I3D_genlock - WGLEW_I3D_genlock = _glewSearchExtension("WGL_I3D_genlock", extStart, extEnd); - if (glewExperimental || WGLEW_I3D_genlock|| crippled) WGLEW_I3D_genlock= !_glewInit_WGL_I3D_genlock(); -#endif /* WGL_I3D_genlock */ -#ifdef WGL_I3D_image_buffer - WGLEW_I3D_image_buffer = _glewSearchExtension("WGL_I3D_image_buffer", extStart, extEnd); - if (glewExperimental || WGLEW_I3D_image_buffer|| crippled) WGLEW_I3D_image_buffer= !_glewInit_WGL_I3D_image_buffer(); -#endif /* WGL_I3D_image_buffer */ -#ifdef WGL_I3D_swap_frame_lock - WGLEW_I3D_swap_frame_lock = _glewSearchExtension("WGL_I3D_swap_frame_lock", extStart, extEnd); - if (glewExperimental || WGLEW_I3D_swap_frame_lock|| crippled) WGLEW_I3D_swap_frame_lock= !_glewInit_WGL_I3D_swap_frame_lock(); -#endif /* WGL_I3D_swap_frame_lock */ -#ifdef WGL_I3D_swap_frame_usage - WGLEW_I3D_swap_frame_usage = _glewSearchExtension("WGL_I3D_swap_frame_usage", extStart, extEnd); - if (glewExperimental || WGLEW_I3D_swap_frame_usage|| crippled) WGLEW_I3D_swap_frame_usage= !_glewInit_WGL_I3D_swap_frame_usage(); -#endif /* WGL_I3D_swap_frame_usage */ -#ifdef WGL_NV_DX_interop - WGLEW_NV_DX_interop = _glewSearchExtension("WGL_NV_DX_interop", extStart, extEnd); - if (glewExperimental || WGLEW_NV_DX_interop|| crippled) WGLEW_NV_DX_interop= !_glewInit_WGL_NV_DX_interop(); -#endif /* WGL_NV_DX_interop */ -#ifdef WGL_NV_DX_interop2 - WGLEW_NV_DX_interop2 = _glewSearchExtension("WGL_NV_DX_interop2", extStart, extEnd); -#endif /* WGL_NV_DX_interop2 */ -#ifdef WGL_NV_copy_image - WGLEW_NV_copy_image = _glewSearchExtension("WGL_NV_copy_image", extStart, extEnd); - if (glewExperimental || WGLEW_NV_copy_image|| crippled) WGLEW_NV_copy_image= !_glewInit_WGL_NV_copy_image(); -#endif /* WGL_NV_copy_image */ -#ifdef WGL_NV_delay_before_swap - WGLEW_NV_delay_before_swap = _glewSearchExtension("WGL_NV_delay_before_swap", extStart, extEnd); - if (glewExperimental || WGLEW_NV_delay_before_swap|| crippled) WGLEW_NV_delay_before_swap= !_glewInit_WGL_NV_delay_before_swap(); -#endif /* WGL_NV_delay_before_swap */ -#ifdef WGL_NV_float_buffer - WGLEW_NV_float_buffer = _glewSearchExtension("WGL_NV_float_buffer", extStart, extEnd); -#endif /* WGL_NV_float_buffer */ -#ifdef WGL_NV_gpu_affinity - WGLEW_NV_gpu_affinity = _glewSearchExtension("WGL_NV_gpu_affinity", extStart, extEnd); - if (glewExperimental || WGLEW_NV_gpu_affinity|| crippled) WGLEW_NV_gpu_affinity= !_glewInit_WGL_NV_gpu_affinity(); -#endif /* WGL_NV_gpu_affinity */ -#ifdef WGL_NV_multigpu_context - WGLEW_NV_multigpu_context = _glewSearchExtension("WGL_NV_multigpu_context", extStart, extEnd); -#endif /* WGL_NV_multigpu_context */ -#ifdef WGL_NV_multisample_coverage - WGLEW_NV_multisample_coverage = _glewSearchExtension("WGL_NV_multisample_coverage", extStart, extEnd); -#endif /* WGL_NV_multisample_coverage */ -#ifdef WGL_NV_present_video - WGLEW_NV_present_video = _glewSearchExtension("WGL_NV_present_video", extStart, extEnd); - if (glewExperimental || WGLEW_NV_present_video|| crippled) WGLEW_NV_present_video= !_glewInit_WGL_NV_present_video(); -#endif /* WGL_NV_present_video */ -#ifdef WGL_NV_render_depth_texture - WGLEW_NV_render_depth_texture = _glewSearchExtension("WGL_NV_render_depth_texture", extStart, extEnd); -#endif /* WGL_NV_render_depth_texture */ -#ifdef WGL_NV_render_texture_rectangle - WGLEW_NV_render_texture_rectangle = _glewSearchExtension("WGL_NV_render_texture_rectangle", extStart, extEnd); -#endif /* WGL_NV_render_texture_rectangle */ -#ifdef WGL_NV_swap_group - WGLEW_NV_swap_group = _glewSearchExtension("WGL_NV_swap_group", extStart, extEnd); - if (glewExperimental || WGLEW_NV_swap_group|| crippled) WGLEW_NV_swap_group= !_glewInit_WGL_NV_swap_group(); -#endif /* WGL_NV_swap_group */ -#ifdef WGL_NV_vertex_array_range - WGLEW_NV_vertex_array_range = _glewSearchExtension("WGL_NV_vertex_array_range", extStart, extEnd); - if (glewExperimental || WGLEW_NV_vertex_array_range|| crippled) WGLEW_NV_vertex_array_range= !_glewInit_WGL_NV_vertex_array_range(); -#endif /* WGL_NV_vertex_array_range */ -#ifdef WGL_NV_video_capture - WGLEW_NV_video_capture = _glewSearchExtension("WGL_NV_video_capture", extStart, extEnd); - if (glewExperimental || WGLEW_NV_video_capture|| crippled) WGLEW_NV_video_capture= !_glewInit_WGL_NV_video_capture(); -#endif /* WGL_NV_video_capture */ -#ifdef WGL_NV_video_output - WGLEW_NV_video_output = _glewSearchExtension("WGL_NV_video_output", extStart, extEnd); - if (glewExperimental || WGLEW_NV_video_output|| crippled) WGLEW_NV_video_output= !_glewInit_WGL_NV_video_output(); -#endif /* WGL_NV_video_output */ -#ifdef WGL_OML_sync_control - WGLEW_OML_sync_control = _glewSearchExtension("WGL_OML_sync_control", extStart, extEnd); - if (glewExperimental || WGLEW_OML_sync_control|| crippled) WGLEW_OML_sync_control= !_glewInit_WGL_OML_sync_control(); -#endif /* WGL_OML_sync_control */ - - return GLEW_OK; -} - -#elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) - -PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay = NULL; - -PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig = NULL; -PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext = NULL; -PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer = NULL; -PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap = NULL; -PFNGLXCREATEWINDOWPROC __glewXCreateWindow = NULL; -PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer = NULL; -PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap = NULL; -PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow = NULL; -PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable = NULL; -PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib = NULL; -PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs = NULL; -PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent = NULL; -PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig = NULL; -PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent = NULL; -PFNGLXQUERYCONTEXTPROC __glewXQueryContext = NULL; -PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable = NULL; -PFNGLXSELECTEVENTPROC __glewXSelectEvent = NULL; - -PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC __glewXBlitContextFramebufferAMD = NULL; -PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC __glewXCreateAssociatedContextAMD = NULL; -PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __glewXCreateAssociatedContextAttribsAMD = NULL; -PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC __glewXDeleteAssociatedContextAMD = NULL; -PFNGLXGETCONTEXTGPUIDAMDPROC __glewXGetContextGPUIDAMD = NULL; -PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC __glewXGetCurrentAssociatedContextAMD = NULL; -PFNGLXGETGPUIDSAMDPROC __glewXGetGPUIDsAMD = NULL; -PFNGLXGETGPUINFOAMDPROC __glewXGetGPUInfoAMD = NULL; -PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __glewXMakeAssociatedContextCurrentAMD = NULL; - -PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB = NULL; - -PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI = NULL; -PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI = NULL; -PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI = NULL; - -PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT = NULL; -PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT = NULL; -PFNGLXGETCURRENTDISPLAYEXTPROC __glewXGetCurrentDisplayEXT = NULL; -PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT = NULL; -PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT = NULL; - -PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT = NULL; - -PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT = NULL; -PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT = NULL; - -PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA = NULL; - -PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA = NULL; - -PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA = NULL; - -PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC __glewXQueryCurrentRendererIntegerMESA = NULL; -PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC __glewXQueryCurrentRendererStringMESA = NULL; -PFNGLXQUERYRENDERERINTEGERMESAPROC __glewXQueryRendererIntegerMESA = NULL; -PFNGLXQUERYRENDERERSTRINGMESAPROC __glewXQueryRendererStringMESA = NULL; - -PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA = NULL; - -PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA = NULL; - -PFNGLXGETSWAPINTERVALMESAPROC __glewXGetSwapIntervalMESA = NULL; -PFNGLXSWAPINTERVALMESAPROC __glewXSwapIntervalMESA = NULL; - -PFNGLXCOPYBUFFERSUBDATANVPROC __glewXCopyBufferSubDataNV = NULL; -PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC __glewXNamedCopyBufferSubDataNV = NULL; - -PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV = NULL; - -PFNGLXDELAYBEFORESWAPNVPROC __glewXDelayBeforeSwapNV = NULL; - -PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV = NULL; -PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV = NULL; - -PFNGLXBINDSWAPBARRIERNVPROC __glewXBindSwapBarrierNV = NULL; -PFNGLXJOINSWAPGROUPNVPROC __glewXJoinSwapGroupNV = NULL; -PFNGLXQUERYFRAMECOUNTNVPROC __glewXQueryFrameCountNV = NULL; -PFNGLXQUERYMAXSWAPGROUPSNVPROC __glewXQueryMaxSwapGroupsNV = NULL; -PFNGLXQUERYSWAPGROUPNVPROC __glewXQuerySwapGroupNV = NULL; -PFNGLXRESETFRAMECOUNTNVPROC __glewXResetFrameCountNV = NULL; - -PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV = NULL; -PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV = NULL; - -PFNGLXBINDVIDEOCAPTUREDEVICENVPROC __glewXBindVideoCaptureDeviceNV = NULL; -PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC __glewXEnumerateVideoCaptureDevicesNV = NULL; -PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC __glewXLockVideoCaptureDeviceNV = NULL; -PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC __glewXQueryVideoCaptureDeviceNV = NULL; -PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC __glewXReleaseVideoCaptureDeviceNV = NULL; - -PFNGLXBINDVIDEOIMAGENVPROC __glewXBindVideoImageNV = NULL; -PFNGLXGETVIDEODEVICENVPROC __glewXGetVideoDeviceNV = NULL; -PFNGLXGETVIDEOINFONVPROC __glewXGetVideoInfoNV = NULL; -PFNGLXRELEASEVIDEODEVICENVPROC __glewXReleaseVideoDeviceNV = NULL; -PFNGLXRELEASEVIDEOIMAGENVPROC __glewXReleaseVideoImageNV = NULL; -PFNGLXSENDPBUFFERTOVIDEONVPROC __glewXSendPbufferToVideoNV = NULL; - -PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML = NULL; -PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML = NULL; -PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML = NULL; -PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML = NULL; -PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML = NULL; - -PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX = NULL; -PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX = NULL; -PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX = NULL; -PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX = NULL; -PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX = NULL; -PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX = NULL; - -PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX = NULL; -PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX = NULL; -PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX = NULL; -PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX = NULL; -PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX = NULL; -PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX = NULL; -PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX = NULL; -PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX = NULL; - -PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX = NULL; -PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX = NULL; -PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX = NULL; -PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX = NULL; -PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX = NULL; - -PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX = NULL; -PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX = NULL; - -PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX = NULL; - -PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX = NULL; -PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX = NULL; -PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX = NULL; -PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX = NULL; -PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX = NULL; - -PFNGLXCUSHIONSGIPROC __glewXCushionSGI = NULL; - -PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI = NULL; -PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI = NULL; - -PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI = NULL; - -PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI = NULL; -PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI = NULL; - -PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN = NULL; - -PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN = NULL; -PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN = NULL; - -GLboolean __GLXEW_VERSION_1_0 = GL_FALSE; -GLboolean __GLXEW_VERSION_1_1 = GL_FALSE; -GLboolean __GLXEW_VERSION_1_2 = GL_FALSE; -GLboolean __GLXEW_VERSION_1_3 = GL_FALSE; -GLboolean __GLXEW_VERSION_1_4 = GL_FALSE; -GLboolean __GLXEW_3DFX_multisample = GL_FALSE; -GLboolean __GLXEW_AMD_gpu_association = GL_FALSE; -GLboolean __GLXEW_ARB_context_flush_control = GL_FALSE; -GLboolean __GLXEW_ARB_create_context = GL_FALSE; -GLboolean __GLXEW_ARB_create_context_no_error = GL_FALSE; -GLboolean __GLXEW_ARB_create_context_profile = GL_FALSE; -GLboolean __GLXEW_ARB_create_context_robustness = GL_FALSE; -GLboolean __GLXEW_ARB_fbconfig_float = GL_FALSE; -GLboolean __GLXEW_ARB_framebuffer_sRGB = GL_FALSE; -GLboolean __GLXEW_ARB_get_proc_address = GL_FALSE; -GLboolean __GLXEW_ARB_multisample = GL_FALSE; -GLboolean __GLXEW_ARB_robustness_application_isolation = GL_FALSE; -GLboolean __GLXEW_ARB_robustness_share_group_isolation = GL_FALSE; -GLboolean __GLXEW_ARB_vertex_buffer_object = GL_FALSE; -GLboolean __GLXEW_ATI_pixel_format_float = GL_FALSE; -GLboolean __GLXEW_ATI_render_texture = GL_FALSE; -GLboolean __GLXEW_EXT_buffer_age = GL_FALSE; -GLboolean __GLXEW_EXT_context_priority = GL_FALSE; -GLboolean __GLXEW_EXT_create_context_es2_profile = GL_FALSE; -GLboolean __GLXEW_EXT_create_context_es_profile = GL_FALSE; -GLboolean __GLXEW_EXT_fbconfig_packed_float = GL_FALSE; -GLboolean __GLXEW_EXT_framebuffer_sRGB = GL_FALSE; -GLboolean __GLXEW_EXT_import_context = GL_FALSE; -GLboolean __GLXEW_EXT_libglvnd = GL_FALSE; -GLboolean __GLXEW_EXT_no_config_context = GL_FALSE; -GLboolean __GLXEW_EXT_scene_marker = GL_FALSE; -GLboolean __GLXEW_EXT_stereo_tree = GL_FALSE; -GLboolean __GLXEW_EXT_swap_control = GL_FALSE; -GLboolean __GLXEW_EXT_swap_control_tear = GL_FALSE; -GLboolean __GLXEW_EXT_texture_from_pixmap = GL_FALSE; -GLboolean __GLXEW_EXT_visual_info = GL_FALSE; -GLboolean __GLXEW_EXT_visual_rating = GL_FALSE; -GLboolean __GLXEW_INTEL_swap_event = GL_FALSE; -GLboolean __GLXEW_MESA_agp_offset = GL_FALSE; -GLboolean __GLXEW_MESA_copy_sub_buffer = GL_FALSE; -GLboolean __GLXEW_MESA_pixmap_colormap = GL_FALSE; -GLboolean __GLXEW_MESA_query_renderer = GL_FALSE; -GLboolean __GLXEW_MESA_release_buffers = GL_FALSE; -GLboolean __GLXEW_MESA_set_3dfx_mode = GL_FALSE; -GLboolean __GLXEW_MESA_swap_control = GL_FALSE; -GLboolean __GLXEW_NV_copy_buffer = GL_FALSE; -GLboolean __GLXEW_NV_copy_image = GL_FALSE; -GLboolean __GLXEW_NV_delay_before_swap = GL_FALSE; -GLboolean __GLXEW_NV_float_buffer = GL_FALSE; -GLboolean __GLXEW_NV_multigpu_context = GL_FALSE; -GLboolean __GLXEW_NV_multisample_coverage = GL_FALSE; -GLboolean __GLXEW_NV_present_video = GL_FALSE; -GLboolean __GLXEW_NV_robustness_video_memory_purge = GL_FALSE; -GLboolean __GLXEW_NV_swap_group = GL_FALSE; -GLboolean __GLXEW_NV_vertex_array_range = GL_FALSE; -GLboolean __GLXEW_NV_video_capture = GL_FALSE; -GLboolean __GLXEW_NV_video_out = GL_FALSE; -GLboolean __GLXEW_OML_swap_method = GL_FALSE; -GLboolean __GLXEW_OML_sync_control = GL_FALSE; -GLboolean __GLXEW_SGIS_blended_overlay = GL_FALSE; -GLboolean __GLXEW_SGIS_color_range = GL_FALSE; -GLboolean __GLXEW_SGIS_multisample = GL_FALSE; -GLboolean __GLXEW_SGIS_shared_multisample = GL_FALSE; -GLboolean __GLXEW_SGIX_fbconfig = GL_FALSE; -GLboolean __GLXEW_SGIX_hyperpipe = GL_FALSE; -GLboolean __GLXEW_SGIX_pbuffer = GL_FALSE; -GLboolean __GLXEW_SGIX_swap_barrier = GL_FALSE; -GLboolean __GLXEW_SGIX_swap_group = GL_FALSE; -GLboolean __GLXEW_SGIX_video_resize = GL_FALSE; -GLboolean __GLXEW_SGIX_visual_select_group = GL_FALSE; -GLboolean __GLXEW_SGI_cushion = GL_FALSE; -GLboolean __GLXEW_SGI_make_current_read = GL_FALSE; -GLboolean __GLXEW_SGI_swap_control = GL_FALSE; -GLboolean __GLXEW_SGI_video_sync = GL_FALSE; -GLboolean __GLXEW_SUN_get_transparent_index = GL_FALSE; -GLboolean __GLXEW_SUN_video_resize = GL_FALSE; -#ifdef GLX_VERSION_1_2 - -static GLboolean _glewInit_GLX_VERSION_1_2 () -{ - GLboolean r = GL_FALSE; - - r = ((glXGetCurrentDisplay = (PFNGLXGETCURRENTDISPLAYPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentDisplay")) == NULL) || r; - - return r; -} - -#endif /* GLX_VERSION_1_2 */ - -#ifdef GLX_VERSION_1_3 - -static GLboolean _glewInit_GLX_VERSION_1_3 () -{ - GLboolean r = GL_FALSE; - - r = ((glXChooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC)glewGetProcAddress((const GLubyte*)"glXChooseFBConfig")) == NULL) || r; - r = ((glXCreateNewContext = (PFNGLXCREATENEWCONTEXTPROC)glewGetProcAddress((const GLubyte*)"glXCreateNewContext")) == NULL) || r; - r = ((glXCreatePbuffer = (PFNGLXCREATEPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glXCreatePbuffer")) == NULL) || r; - r = ((glXCreatePixmap = (PFNGLXCREATEPIXMAPPROC)glewGetProcAddress((const GLubyte*)"glXCreatePixmap")) == NULL) || r; - r = ((glXCreateWindow = (PFNGLXCREATEWINDOWPROC)glewGetProcAddress((const GLubyte*)"glXCreateWindow")) == NULL) || r; - r = ((glXDestroyPbuffer = (PFNGLXDESTROYPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glXDestroyPbuffer")) == NULL) || r; - r = ((glXDestroyPixmap = (PFNGLXDESTROYPIXMAPPROC)glewGetProcAddress((const GLubyte*)"glXDestroyPixmap")) == NULL) || r; - r = ((glXDestroyWindow = (PFNGLXDESTROYWINDOWPROC)glewGetProcAddress((const GLubyte*)"glXDestroyWindow")) == NULL) || r; - r = ((glXGetCurrentReadDrawable = (PFNGLXGETCURRENTREADDRAWABLEPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentReadDrawable")) == NULL) || r; - r = ((glXGetFBConfigAttrib = (PFNGLXGETFBCONFIGATTRIBPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigAttrib")) == NULL) || r; - r = ((glXGetFBConfigs = (PFNGLXGETFBCONFIGSPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigs")) == NULL) || r; - r = ((glXGetSelectedEvent = (PFNGLXGETSELECTEDEVENTPROC)glewGetProcAddress((const GLubyte*)"glXGetSelectedEvent")) == NULL) || r; - r = ((glXGetVisualFromFBConfig = (PFNGLXGETVISUALFROMFBCONFIGPROC)glewGetProcAddress((const GLubyte*)"glXGetVisualFromFBConfig")) == NULL) || r; - r = ((glXMakeContextCurrent = (PFNGLXMAKECONTEXTCURRENTPROC)glewGetProcAddress((const GLubyte*)"glXMakeContextCurrent")) == NULL) || r; - r = ((glXQueryContext = (PFNGLXQUERYCONTEXTPROC)glewGetProcAddress((const GLubyte*)"glXQueryContext")) == NULL) || r; - r = ((glXQueryDrawable = (PFNGLXQUERYDRAWABLEPROC)glewGetProcAddress((const GLubyte*)"glXQueryDrawable")) == NULL) || r; - r = ((glXSelectEvent = (PFNGLXSELECTEVENTPROC)glewGetProcAddress((const GLubyte*)"glXSelectEvent")) == NULL) || r; - - return r; -} - -#endif /* GLX_VERSION_1_3 */ - -#ifdef GLX_AMD_gpu_association - -static GLboolean _glewInit_GLX_AMD_gpu_association () -{ - GLboolean r = GL_FALSE; - - r = ((glXBlitContextFramebufferAMD = (PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC)glewGetProcAddress((const GLubyte*)"glXBlitContextFramebufferAMD")) == NULL) || r; - r = ((glXCreateAssociatedContextAMD = (PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXCreateAssociatedContextAMD")) == NULL) || r; - r = ((glXCreateAssociatedContextAttribsAMD = (PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)glewGetProcAddress((const GLubyte*)"glXCreateAssociatedContextAttribsAMD")) == NULL) || r; - r = ((glXDeleteAssociatedContextAMD = (PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXDeleteAssociatedContextAMD")) == NULL) || r; - r = ((glXGetContextGPUIDAMD = (PFNGLXGETCONTEXTGPUIDAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetContextGPUIDAMD")) == NULL) || r; - r = ((glXGetCurrentAssociatedContextAMD = (PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentAssociatedContextAMD")) == NULL) || r; - r = ((glXGetGPUIDsAMD = (PFNGLXGETGPUIDSAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetGPUIDsAMD")) == NULL) || r; - r = ((glXGetGPUInfoAMD = (PFNGLXGETGPUINFOAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetGPUInfoAMD")) == NULL) || r; - r = ((glXMakeAssociatedContextCurrentAMD = (PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)glewGetProcAddress((const GLubyte*)"glXMakeAssociatedContextCurrentAMD")) == NULL) || r; - - return r; -} - -#endif /* GLX_AMD_gpu_association */ - -#ifdef GLX_ARB_create_context - -static GLboolean _glewInit_GLX_ARB_create_context () -{ - GLboolean r = GL_FALSE; - - r = ((glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)glewGetProcAddress((const GLubyte*)"glXCreateContextAttribsARB")) == NULL) || r; - - return r; -} - -#endif /* GLX_ARB_create_context */ - -#ifdef GLX_ATI_render_texture - -static GLboolean _glewInit_GLX_ATI_render_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glXBindTexImageATI = (PFNGLXBINDTEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)"glXBindTexImageATI")) == NULL) || r; - r = ((glXDrawableAttribATI = (PFNGLXDRAWABLEATTRIBATIPROC)glewGetProcAddress((const GLubyte*)"glXDrawableAttribATI")) == NULL) || r; - r = ((glXReleaseTexImageATI = (PFNGLXRELEASETEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)"glXReleaseTexImageATI")) == NULL) || r; - - return r; -} - -#endif /* GLX_ATI_render_texture */ - -#ifdef GLX_EXT_import_context - -static GLboolean _glewInit_GLX_EXT_import_context () -{ - GLboolean r = GL_FALSE; - - r = ((glXFreeContextEXT = (PFNGLXFREECONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)"glXFreeContextEXT")) == NULL) || r; - r = ((glXGetContextIDEXT = (PFNGLXGETCONTEXTIDEXTPROC)glewGetProcAddress((const GLubyte*)"glXGetContextIDEXT")) == NULL) || r; - r = ((glXGetCurrentDisplayEXT = (PFNGLXGETCURRENTDISPLAYEXTPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentDisplayEXT")) == NULL) || r; - r = ((glXImportContextEXT = (PFNGLXIMPORTCONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)"glXImportContextEXT")) == NULL) || r; - r = ((glXQueryContextInfoEXT = (PFNGLXQUERYCONTEXTINFOEXTPROC)glewGetProcAddress((const GLubyte*)"glXQueryContextInfoEXT")) == NULL) || r; - - return r; -} - -#endif /* GLX_EXT_import_context */ - -#ifdef GLX_EXT_swap_control - -static GLboolean _glewInit_GLX_EXT_swap_control () -{ - GLboolean r = GL_FALSE; - - r = ((glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalEXT")) == NULL) || r; - - return r; -} - -#endif /* GLX_EXT_swap_control */ - -#ifdef GLX_EXT_texture_from_pixmap - -static GLboolean _glewInit_GLX_EXT_texture_from_pixmap () -{ - GLboolean r = GL_FALSE; - - r = ((glXBindTexImageEXT = (PFNGLXBINDTEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glXBindTexImageEXT")) == NULL) || r; - r = ((glXReleaseTexImageEXT = (PFNGLXRELEASETEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glXReleaseTexImageEXT")) == NULL) || r; - - return r; -} - -#endif /* GLX_EXT_texture_from_pixmap */ - -#ifdef GLX_MESA_agp_offset - -static GLboolean _glewInit_GLX_MESA_agp_offset () -{ - GLboolean r = GL_FALSE; - - r = ((glXGetAGPOffsetMESA = (PFNGLXGETAGPOFFSETMESAPROC)glewGetProcAddress((const GLubyte*)"glXGetAGPOffsetMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_agp_offset */ - -#ifdef GLX_MESA_copy_sub_buffer - -static GLboolean _glewInit_GLX_MESA_copy_sub_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((glXCopySubBufferMESA = (PFNGLXCOPYSUBBUFFERMESAPROC)glewGetProcAddress((const GLubyte*)"glXCopySubBufferMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_copy_sub_buffer */ - -#ifdef GLX_MESA_pixmap_colormap - -static GLboolean _glewInit_GLX_MESA_pixmap_colormap () -{ - GLboolean r = GL_FALSE; - - r = ((glXCreateGLXPixmapMESA = (PFNGLXCREATEGLXPIXMAPMESAPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPixmapMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_pixmap_colormap */ - -#ifdef GLX_MESA_query_renderer - -static GLboolean _glewInit_GLX_MESA_query_renderer () -{ - GLboolean r = GL_FALSE; - - r = ((glXQueryCurrentRendererIntegerMESA = (PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryCurrentRendererIntegerMESA")) == NULL) || r; - r = ((glXQueryCurrentRendererStringMESA = (PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryCurrentRendererStringMESA")) == NULL) || r; - r = ((glXQueryRendererIntegerMESA = (PFNGLXQUERYRENDERERINTEGERMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryRendererIntegerMESA")) == NULL) || r; - r = ((glXQueryRendererStringMESA = (PFNGLXQUERYRENDERERSTRINGMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryRendererStringMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_query_renderer */ - -#ifdef GLX_MESA_release_buffers - -static GLboolean _glewInit_GLX_MESA_release_buffers () -{ - GLboolean r = GL_FALSE; - - r = ((glXReleaseBuffersMESA = (PFNGLXRELEASEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)"glXReleaseBuffersMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_release_buffers */ - -#ifdef GLX_MESA_set_3dfx_mode - -static GLboolean _glewInit_GLX_MESA_set_3dfx_mode () -{ - GLboolean r = GL_FALSE; - - r = ((glXSet3DfxModeMESA = (PFNGLXSET3DFXMODEMESAPROC)glewGetProcAddress((const GLubyte*)"glXSet3DfxModeMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_set_3dfx_mode */ - -#ifdef GLX_MESA_swap_control - -static GLboolean _glewInit_GLX_MESA_swap_control () -{ - GLboolean r = GL_FALSE; - - r = ((glXGetSwapIntervalMESA = (PFNGLXGETSWAPINTERVALMESAPROC)glewGetProcAddress((const GLubyte*)"glXGetSwapIntervalMESA")) == NULL) || r; - r = ((glXSwapIntervalMESA = (PFNGLXSWAPINTERVALMESAPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_swap_control */ - -#ifdef GLX_NV_copy_buffer - -static GLboolean _glewInit_GLX_NV_copy_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((glXCopyBufferSubDataNV = (PFNGLXCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXCopyBufferSubDataNV")) == NULL) || r; - r = ((glXNamedCopyBufferSubDataNV = (PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXNamedCopyBufferSubDataNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_copy_buffer */ - -#ifdef GLX_NV_copy_image - -static GLboolean _glewInit_GLX_NV_copy_image () -{ - GLboolean r = GL_FALSE; - - r = ((glXCopyImageSubDataNV = (PFNGLXCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXCopyImageSubDataNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_copy_image */ - -#ifdef GLX_NV_delay_before_swap - -static GLboolean _glewInit_GLX_NV_delay_before_swap () -{ - GLboolean r = GL_FALSE; - - r = ((glXDelayBeforeSwapNV = (PFNGLXDELAYBEFORESWAPNVPROC)glewGetProcAddress((const GLubyte*)"glXDelayBeforeSwapNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_delay_before_swap */ - -#ifdef GLX_NV_present_video - -static GLboolean _glewInit_GLX_NV_present_video () -{ - GLboolean r = GL_FALSE; - - r = ((glXBindVideoDeviceNV = (PFNGLXBINDVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoDeviceNV")) == NULL) || r; - r = ((glXEnumerateVideoDevicesNV = (PFNGLXENUMERATEVIDEODEVICESNVPROC)glewGetProcAddress((const GLubyte*)"glXEnumerateVideoDevicesNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_present_video */ - -#ifdef GLX_NV_swap_group - -static GLboolean _glewInit_GLX_NV_swap_group () -{ - GLboolean r = GL_FALSE; - - r = ((glXBindSwapBarrierNV = (PFNGLXBINDSWAPBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glXBindSwapBarrierNV")) == NULL) || r; - r = ((glXJoinSwapGroupNV = (PFNGLXJOINSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"glXJoinSwapGroupNV")) == NULL) || r; - r = ((glXQueryFrameCountNV = (PFNGLXQUERYFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glXQueryFrameCountNV")) == NULL) || r; - r = ((glXQueryMaxSwapGroupsNV = (PFNGLXQUERYMAXSWAPGROUPSNVPROC)glewGetProcAddress((const GLubyte*)"glXQueryMaxSwapGroupsNV")) == NULL) || r; - r = ((glXQuerySwapGroupNV = (PFNGLXQUERYSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"glXQuerySwapGroupNV")) == NULL) || r; - r = ((glXResetFrameCountNV = (PFNGLXRESETFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glXResetFrameCountNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_swap_group */ - -#ifdef GLX_NV_vertex_array_range - -static GLboolean _glewInit_GLX_NV_vertex_array_range () -{ - GLboolean r = GL_FALSE; - - r = ((glXAllocateMemoryNV = (PFNGLXALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glXAllocateMemoryNV")) == NULL) || r; - r = ((glXFreeMemoryNV = (PFNGLXFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glXFreeMemoryNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_vertex_array_range */ - -#ifdef GLX_NV_video_capture - -static GLboolean _glewInit_GLX_NV_video_capture () -{ - GLboolean r = GL_FALSE; - - r = ((glXBindVideoCaptureDeviceNV = (PFNGLXBINDVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoCaptureDeviceNV")) == NULL) || r; - r = ((glXEnumerateVideoCaptureDevicesNV = (PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"glXEnumerateVideoCaptureDevicesNV")) == NULL) || r; - r = ((glXLockVideoCaptureDeviceNV = (PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXLockVideoCaptureDeviceNV")) == NULL) || r; - r = ((glXQueryVideoCaptureDeviceNV = (PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXQueryVideoCaptureDeviceNV")) == NULL) || r; - r = ((glXReleaseVideoCaptureDeviceNV = (PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoCaptureDeviceNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_video_capture */ - -#ifdef GLX_NV_video_out - -static GLboolean _glewInit_GLX_NV_video_out () -{ - GLboolean r = GL_FALSE; - - r = ((glXBindVideoImageNV = (PFNGLXBINDVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoImageNV")) == NULL) || r; - r = ((glXGetVideoDeviceNV = (PFNGLXGETVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoDeviceNV")) == NULL) || r; - r = ((glXGetVideoInfoNV = (PFNGLXGETVIDEOINFONVPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoInfoNV")) == NULL) || r; - r = ((glXReleaseVideoDeviceNV = (PFNGLXRELEASEVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoDeviceNV")) == NULL) || r; - r = ((glXReleaseVideoImageNV = (PFNGLXRELEASEVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoImageNV")) == NULL) || r; - r = ((glXSendPbufferToVideoNV = (PFNGLXSENDPBUFFERTOVIDEONVPROC)glewGetProcAddress((const GLubyte*)"glXSendPbufferToVideoNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_video_out */ - -#ifdef GLX_OML_sync_control - -static GLboolean _glewInit_GLX_OML_sync_control () -{ - GLboolean r = GL_FALSE; - - r = ((glXGetMscRateOML = (PFNGLXGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)"glXGetMscRateOML")) == NULL) || r; - r = ((glXGetSyncValuesOML = (PFNGLXGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)"glXGetSyncValuesOML")) == NULL) || r; - r = ((glXSwapBuffersMscOML = (PFNGLXSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"glXSwapBuffersMscOML")) == NULL) || r; - r = ((glXWaitForMscOML = (PFNGLXWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)"glXWaitForMscOML")) == NULL) || r; - r = ((glXWaitForSbcOML = (PFNGLXWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)"glXWaitForSbcOML")) == NULL) || r; - - return r; -} - -#endif /* GLX_OML_sync_control */ - -#ifdef GLX_SGIX_fbconfig - -static GLboolean _glewInit_GLX_SGIX_fbconfig () -{ - GLboolean r = GL_FALSE; - - r = ((glXChooseFBConfigSGIX = (PFNGLXCHOOSEFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChooseFBConfigSGIX")) == NULL) || r; - r = ((glXCreateContextWithConfigSGIX = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateContextWithConfigSGIX")) == NULL) || r; - r = ((glXCreateGLXPixmapWithConfigSGIX = (PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPixmapWithConfigSGIX")) == NULL) || r; - r = ((glXGetFBConfigAttribSGIX = (PFNGLXGETFBCONFIGATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigAttribSGIX")) == NULL) || r; - r = ((glXGetFBConfigFromVisualSGIX = (PFNGLXGETFBCONFIGFROMVISUALSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigFromVisualSGIX")) == NULL) || r; - r = ((glXGetVisualFromFBConfigSGIX = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetVisualFromFBConfigSGIX")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGIX_fbconfig */ - -#ifdef GLX_SGIX_hyperpipe - -static GLboolean _glewInit_GLX_SGIX_hyperpipe () -{ - GLboolean r = GL_FALSE; - - r = ((glXBindHyperpipeSGIX = (PFNGLXBINDHYPERPIPESGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindHyperpipeSGIX")) == NULL) || r; - r = ((glXDestroyHyperpipeConfigSGIX = (PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXDestroyHyperpipeConfigSGIX")) == NULL) || r; - r = ((glXHyperpipeAttribSGIX = (PFNGLXHYPERPIPEATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXHyperpipeAttribSGIX")) == NULL) || r; - r = ((glXHyperpipeConfigSGIX = (PFNGLXHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXHyperpipeConfigSGIX")) == NULL) || r; - r = ((glXQueryHyperpipeAttribSGIX = (PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeAttribSGIX")) == NULL) || r; - r = ((glXQueryHyperpipeBestAttribSGIX = (PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeBestAttribSGIX")) == NULL) || r; - r = ((glXQueryHyperpipeConfigSGIX = (PFNGLXQUERYHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeConfigSGIX")) == NULL) || r; - r = ((glXQueryHyperpipeNetworkSGIX = (PFNGLXQUERYHYPERPIPENETWORKSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeNetworkSGIX")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGIX_hyperpipe */ - -#ifdef GLX_SGIX_pbuffer - -static GLboolean _glewInit_GLX_SGIX_pbuffer () -{ - GLboolean r = GL_FALSE; - - r = ((glXCreateGLXPbufferSGIX = (PFNGLXCREATEGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPbufferSGIX")) == NULL) || r; - r = ((glXDestroyGLXPbufferSGIX = (PFNGLXDESTROYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXDestroyGLXPbufferSGIX")) == NULL) || r; - r = ((glXGetSelectedEventSGIX = (PFNGLXGETSELECTEDEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetSelectedEventSGIX")) == NULL) || r; - r = ((glXQueryGLXPbufferSGIX = (PFNGLXQUERYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryGLXPbufferSGIX")) == NULL) || r; - r = ((glXSelectEventSGIX = (PFNGLXSELECTEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXSelectEventSGIX")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGIX_pbuffer */ - -#ifdef GLX_SGIX_swap_barrier - -static GLboolean _glewInit_GLX_SGIX_swap_barrier () -{ - GLboolean r = GL_FALSE; - - r = ((glXBindSwapBarrierSGIX = (PFNGLXBINDSWAPBARRIERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindSwapBarrierSGIX")) == NULL) || r; - r = ((glXQueryMaxSwapBarriersSGIX = (PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryMaxSwapBarriersSGIX")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGIX_swap_barrier */ - -#ifdef GLX_SGIX_swap_group - -static GLboolean _glewInit_GLX_SGIX_swap_group () -{ - GLboolean r = GL_FALSE; - - r = ((glXJoinSwapGroupSGIX = (PFNGLXJOINSWAPGROUPSGIXPROC)glewGetProcAddress((const GLubyte*)"glXJoinSwapGroupSGIX")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGIX_swap_group */ - -#ifdef GLX_SGIX_video_resize - -static GLboolean _glewInit_GLX_SGIX_video_resize () -{ - GLboolean r = GL_FALSE; - - r = ((glXBindChannelToWindowSGIX = (PFNGLXBINDCHANNELTOWINDOWSGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindChannelToWindowSGIX")) == NULL) || r; - r = ((glXChannelRectSGIX = (PFNGLXCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChannelRectSGIX")) == NULL) || r; - r = ((glXChannelRectSyncSGIX = (PFNGLXCHANNELRECTSYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChannelRectSyncSGIX")) == NULL) || r; - r = ((glXQueryChannelDeltasSGIX = (PFNGLXQUERYCHANNELDELTASSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryChannelDeltasSGIX")) == NULL) || r; - r = ((glXQueryChannelRectSGIX = (PFNGLXQUERYCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryChannelRectSGIX")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGIX_video_resize */ - -#ifdef GLX_SGI_cushion - -static GLboolean _glewInit_GLX_SGI_cushion () -{ - GLboolean r = GL_FALSE; - - r = ((glXCushionSGI = (PFNGLXCUSHIONSGIPROC)glewGetProcAddress((const GLubyte*)"glXCushionSGI")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGI_cushion */ - -#ifdef GLX_SGI_make_current_read - -static GLboolean _glewInit_GLX_SGI_make_current_read () -{ - GLboolean r = GL_FALSE; - - r = ((glXGetCurrentReadDrawableSGI = (PFNGLXGETCURRENTREADDRAWABLESGIPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentReadDrawableSGI")) == NULL) || r; - r = ((glXMakeCurrentReadSGI = (PFNGLXMAKECURRENTREADSGIPROC)glewGetProcAddress((const GLubyte*)"glXMakeCurrentReadSGI")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGI_make_current_read */ - -#ifdef GLX_SGI_swap_control - -static GLboolean _glewInit_GLX_SGI_swap_control () -{ - GLboolean r = GL_FALSE; - - r = ((glXSwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalSGI")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGI_swap_control */ - -#ifdef GLX_SGI_video_sync - -static GLboolean _glewInit_GLX_SGI_video_sync () -{ - GLboolean r = GL_FALSE; - - r = ((glXGetVideoSyncSGI = (PFNGLXGETVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoSyncSGI")) == NULL) || r; - r = ((glXWaitVideoSyncSGI = (PFNGLXWAITVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)"glXWaitVideoSyncSGI")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGI_video_sync */ - -#ifdef GLX_SUN_get_transparent_index - -static GLboolean _glewInit_GLX_SUN_get_transparent_index () -{ - GLboolean r = GL_FALSE; - - r = ((glXGetTransparentIndexSUN = (PFNGLXGETTRANSPARENTINDEXSUNPROC)glewGetProcAddress((const GLubyte*)"glXGetTransparentIndexSUN")) == NULL) || r; - - return r; -} - -#endif /* GLX_SUN_get_transparent_index */ - -#ifdef GLX_SUN_video_resize - -static GLboolean _glewInit_GLX_SUN_video_resize () -{ - GLboolean r = GL_FALSE; - - r = ((glXGetVideoResizeSUN = (PFNGLXGETVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoResizeSUN")) == NULL) || r; - r = ((glXVideoResizeSUN = (PFNGLXVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)"glXVideoResizeSUN")) == NULL) || r; - - return r; -} - -#endif /* GLX_SUN_video_resize */ - -/* ------------------------------------------------------------------------ */ - -GLboolean glxewGetExtension (const char* name) -{ - const GLubyte* start; - const GLubyte* end; - - if (glXGetCurrentDisplay == NULL) return GL_FALSE; - start = (const GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS); - if (0 == start) return GL_FALSE; - end = start + _glewStrLen(start); - return _glewSearchExtension(name, start, end); -} - -GLenum glxewInit () -{ - Display* display; - int major, minor; - const GLubyte* extStart; - const GLubyte* extEnd; - /* initialize core GLX 1.2 */ - if (_glewInit_GLX_VERSION_1_2()) return GLEW_ERROR_GLX_VERSION_11_ONLY; - /* check for a display */ - display = glXGetCurrentDisplay(); - if (display == NULL) return GLEW_ERROR_NO_GLX_DISPLAY; - /* initialize flags */ - GLXEW_VERSION_1_0 = GL_TRUE; - GLXEW_VERSION_1_1 = GL_TRUE; - GLXEW_VERSION_1_2 = GL_TRUE; - GLXEW_VERSION_1_3 = GL_TRUE; - GLXEW_VERSION_1_4 = GL_TRUE; - /* query GLX version */ - glXQueryVersion(display, &major, &minor); - if (major == 1 && minor <= 3) - { - switch (minor) - { - case 3: - GLXEW_VERSION_1_4 = GL_FALSE; - break; - case 2: - GLXEW_VERSION_1_4 = GL_FALSE; - GLXEW_VERSION_1_3 = GL_FALSE; - break; - default: - return GLEW_ERROR_GLX_VERSION_11_ONLY; - break; - } - } - /* query GLX extension string */ - extStart = 0; - if (glXGetCurrentDisplay != NULL) - extStart = (const GLubyte*)glXGetClientString(display, GLX_EXTENSIONS); - if (extStart == 0) - extStart = (const GLubyte *)""; - extEnd = extStart + _glewStrLen(extStart); - /* initialize extensions */ -#ifdef GLX_VERSION_1_3 - if (glewExperimental || GLXEW_VERSION_1_3) GLXEW_VERSION_1_3 = !_glewInit_GLX_VERSION_1_3(); -#endif /* GLX_VERSION_1_3 */ -#ifdef GLX_3DFX_multisample - GLXEW_3DFX_multisample = _glewSearchExtension("GLX_3DFX_multisample", extStart, extEnd); -#endif /* GLX_3DFX_multisample */ -#ifdef GLX_AMD_gpu_association - GLXEW_AMD_gpu_association = _glewSearchExtension("GLX_AMD_gpu_association", extStart, extEnd); - if (glewExperimental || GLXEW_AMD_gpu_association) GLXEW_AMD_gpu_association = !_glewInit_GLX_AMD_gpu_association(); -#endif /* GLX_AMD_gpu_association */ -#ifdef GLX_ARB_context_flush_control - GLXEW_ARB_context_flush_control = _glewSearchExtension("GLX_ARB_context_flush_control", extStart, extEnd); -#endif /* GLX_ARB_context_flush_control */ -#ifdef GLX_ARB_create_context - GLXEW_ARB_create_context = _glewSearchExtension("GLX_ARB_create_context", extStart, extEnd); - if (glewExperimental || GLXEW_ARB_create_context) GLXEW_ARB_create_context = !_glewInit_GLX_ARB_create_context(); -#endif /* GLX_ARB_create_context */ -#ifdef GLX_ARB_create_context_no_error - GLXEW_ARB_create_context_no_error = _glewSearchExtension("GLX_ARB_create_context_no_error", extStart, extEnd); -#endif /* GLX_ARB_create_context_no_error */ -#ifdef GLX_ARB_create_context_profile - GLXEW_ARB_create_context_profile = _glewSearchExtension("GLX_ARB_create_context_profile", extStart, extEnd); -#endif /* GLX_ARB_create_context_profile */ -#ifdef GLX_ARB_create_context_robustness - GLXEW_ARB_create_context_robustness = _glewSearchExtension("GLX_ARB_create_context_robustness", extStart, extEnd); -#endif /* GLX_ARB_create_context_robustness */ -#ifdef GLX_ARB_fbconfig_float - GLXEW_ARB_fbconfig_float = _glewSearchExtension("GLX_ARB_fbconfig_float", extStart, extEnd); -#endif /* GLX_ARB_fbconfig_float */ -#ifdef GLX_ARB_framebuffer_sRGB - GLXEW_ARB_framebuffer_sRGB = _glewSearchExtension("GLX_ARB_framebuffer_sRGB", extStart, extEnd); -#endif /* GLX_ARB_framebuffer_sRGB */ -#ifdef GLX_ARB_get_proc_address - GLXEW_ARB_get_proc_address = _glewSearchExtension("GLX_ARB_get_proc_address", extStart, extEnd); -#endif /* GLX_ARB_get_proc_address */ -#ifdef GLX_ARB_multisample - GLXEW_ARB_multisample = _glewSearchExtension("GLX_ARB_multisample", extStart, extEnd); -#endif /* GLX_ARB_multisample */ -#ifdef GLX_ARB_robustness_application_isolation - GLXEW_ARB_robustness_application_isolation = _glewSearchExtension("GLX_ARB_robustness_application_isolation", extStart, extEnd); -#endif /* GLX_ARB_robustness_application_isolation */ -#ifdef GLX_ARB_robustness_share_group_isolation - GLXEW_ARB_robustness_share_group_isolation = _glewSearchExtension("GLX_ARB_robustness_share_group_isolation", extStart, extEnd); -#endif /* GLX_ARB_robustness_share_group_isolation */ -#ifdef GLX_ARB_vertex_buffer_object - GLXEW_ARB_vertex_buffer_object = _glewSearchExtension("GLX_ARB_vertex_buffer_object", extStart, extEnd); -#endif /* GLX_ARB_vertex_buffer_object */ -#ifdef GLX_ATI_pixel_format_float - GLXEW_ATI_pixel_format_float = _glewSearchExtension("GLX_ATI_pixel_format_float", extStart, extEnd); -#endif /* GLX_ATI_pixel_format_float */ -#ifdef GLX_ATI_render_texture - GLXEW_ATI_render_texture = _glewSearchExtension("GLX_ATI_render_texture", extStart, extEnd); - if (glewExperimental || GLXEW_ATI_render_texture) GLXEW_ATI_render_texture = !_glewInit_GLX_ATI_render_texture(); -#endif /* GLX_ATI_render_texture */ -#ifdef GLX_EXT_buffer_age - GLXEW_EXT_buffer_age = _glewSearchExtension("GLX_EXT_buffer_age", extStart, extEnd); -#endif /* GLX_EXT_buffer_age */ -#ifdef GLX_EXT_context_priority - GLXEW_EXT_context_priority = _glewSearchExtension("GLX_EXT_context_priority", extStart, extEnd); -#endif /* GLX_EXT_context_priority */ -#ifdef GLX_EXT_create_context_es2_profile - GLXEW_EXT_create_context_es2_profile = _glewSearchExtension("GLX_EXT_create_context_es2_profile", extStart, extEnd); -#endif /* GLX_EXT_create_context_es2_profile */ -#ifdef GLX_EXT_create_context_es_profile - GLXEW_EXT_create_context_es_profile = _glewSearchExtension("GLX_EXT_create_context_es_profile", extStart, extEnd); -#endif /* GLX_EXT_create_context_es_profile */ -#ifdef GLX_EXT_fbconfig_packed_float - GLXEW_EXT_fbconfig_packed_float = _glewSearchExtension("GLX_EXT_fbconfig_packed_float", extStart, extEnd); -#endif /* GLX_EXT_fbconfig_packed_float */ -#ifdef GLX_EXT_framebuffer_sRGB - GLXEW_EXT_framebuffer_sRGB = _glewSearchExtension("GLX_EXT_framebuffer_sRGB", extStart, extEnd); -#endif /* GLX_EXT_framebuffer_sRGB */ -#ifdef GLX_EXT_import_context - GLXEW_EXT_import_context = _glewSearchExtension("GLX_EXT_import_context", extStart, extEnd); - if (glewExperimental || GLXEW_EXT_import_context) GLXEW_EXT_import_context = !_glewInit_GLX_EXT_import_context(); -#endif /* GLX_EXT_import_context */ -#ifdef GLX_EXT_libglvnd - GLXEW_EXT_libglvnd = _glewSearchExtension("GLX_EXT_libglvnd", extStart, extEnd); -#endif /* GLX_EXT_libglvnd */ -#ifdef GLX_EXT_no_config_context - GLXEW_EXT_no_config_context = _glewSearchExtension("GLX_EXT_no_config_context", extStart, extEnd); -#endif /* GLX_EXT_no_config_context */ -#ifdef GLX_EXT_scene_marker - GLXEW_EXT_scene_marker = _glewSearchExtension("GLX_EXT_scene_marker", extStart, extEnd); -#endif /* GLX_EXT_scene_marker */ -#ifdef GLX_EXT_stereo_tree - GLXEW_EXT_stereo_tree = _glewSearchExtension("GLX_EXT_stereo_tree", extStart, extEnd); -#endif /* GLX_EXT_stereo_tree */ -#ifdef GLX_EXT_swap_control - GLXEW_EXT_swap_control = _glewSearchExtension("GLX_EXT_swap_control", extStart, extEnd); - if (glewExperimental || GLXEW_EXT_swap_control) GLXEW_EXT_swap_control = !_glewInit_GLX_EXT_swap_control(); -#endif /* GLX_EXT_swap_control */ -#ifdef GLX_EXT_swap_control_tear - GLXEW_EXT_swap_control_tear = _glewSearchExtension("GLX_EXT_swap_control_tear", extStart, extEnd); -#endif /* GLX_EXT_swap_control_tear */ -#ifdef GLX_EXT_texture_from_pixmap - GLXEW_EXT_texture_from_pixmap = _glewSearchExtension("GLX_EXT_texture_from_pixmap", extStart, extEnd); - if (glewExperimental || GLXEW_EXT_texture_from_pixmap) GLXEW_EXT_texture_from_pixmap = !_glewInit_GLX_EXT_texture_from_pixmap(); -#endif /* GLX_EXT_texture_from_pixmap */ -#ifdef GLX_EXT_visual_info - GLXEW_EXT_visual_info = _glewSearchExtension("GLX_EXT_visual_info", extStart, extEnd); -#endif /* GLX_EXT_visual_info */ -#ifdef GLX_EXT_visual_rating - GLXEW_EXT_visual_rating = _glewSearchExtension("GLX_EXT_visual_rating", extStart, extEnd); -#endif /* GLX_EXT_visual_rating */ -#ifdef GLX_INTEL_swap_event - GLXEW_INTEL_swap_event = _glewSearchExtension("GLX_INTEL_swap_event", extStart, extEnd); -#endif /* GLX_INTEL_swap_event */ -#ifdef GLX_MESA_agp_offset - GLXEW_MESA_agp_offset = _glewSearchExtension("GLX_MESA_agp_offset", extStart, extEnd); - if (glewExperimental || GLXEW_MESA_agp_offset) GLXEW_MESA_agp_offset = !_glewInit_GLX_MESA_agp_offset(); -#endif /* GLX_MESA_agp_offset */ -#ifdef GLX_MESA_copy_sub_buffer - GLXEW_MESA_copy_sub_buffer = _glewSearchExtension("GLX_MESA_copy_sub_buffer", extStart, extEnd); - if (glewExperimental || GLXEW_MESA_copy_sub_buffer) GLXEW_MESA_copy_sub_buffer = !_glewInit_GLX_MESA_copy_sub_buffer(); -#endif /* GLX_MESA_copy_sub_buffer */ -#ifdef GLX_MESA_pixmap_colormap - GLXEW_MESA_pixmap_colormap = _glewSearchExtension("GLX_MESA_pixmap_colormap", extStart, extEnd); - if (glewExperimental || GLXEW_MESA_pixmap_colormap) GLXEW_MESA_pixmap_colormap = !_glewInit_GLX_MESA_pixmap_colormap(); -#endif /* GLX_MESA_pixmap_colormap */ -#ifdef GLX_MESA_query_renderer - GLXEW_MESA_query_renderer = _glewSearchExtension("GLX_MESA_query_renderer", extStart, extEnd); - if (glewExperimental || GLXEW_MESA_query_renderer) GLXEW_MESA_query_renderer = !_glewInit_GLX_MESA_query_renderer(); -#endif /* GLX_MESA_query_renderer */ -#ifdef GLX_MESA_release_buffers - GLXEW_MESA_release_buffers = _glewSearchExtension("GLX_MESA_release_buffers", extStart, extEnd); - if (glewExperimental || GLXEW_MESA_release_buffers) GLXEW_MESA_release_buffers = !_glewInit_GLX_MESA_release_buffers(); -#endif /* GLX_MESA_release_buffers */ -#ifdef GLX_MESA_set_3dfx_mode - GLXEW_MESA_set_3dfx_mode = _glewSearchExtension("GLX_MESA_set_3dfx_mode", extStart, extEnd); - if (glewExperimental || GLXEW_MESA_set_3dfx_mode) GLXEW_MESA_set_3dfx_mode = !_glewInit_GLX_MESA_set_3dfx_mode(); -#endif /* GLX_MESA_set_3dfx_mode */ -#ifdef GLX_MESA_swap_control - GLXEW_MESA_swap_control = _glewSearchExtension("GLX_MESA_swap_control", extStart, extEnd); - if (glewExperimental || GLXEW_MESA_swap_control) GLXEW_MESA_swap_control = !_glewInit_GLX_MESA_swap_control(); -#endif /* GLX_MESA_swap_control */ -#ifdef GLX_NV_copy_buffer - GLXEW_NV_copy_buffer = _glewSearchExtension("GLX_NV_copy_buffer", extStart, extEnd); - if (glewExperimental || GLXEW_NV_copy_buffer) GLXEW_NV_copy_buffer = !_glewInit_GLX_NV_copy_buffer(); -#endif /* GLX_NV_copy_buffer */ -#ifdef GLX_NV_copy_image - GLXEW_NV_copy_image = _glewSearchExtension("GLX_NV_copy_image", extStart, extEnd); - if (glewExperimental || GLXEW_NV_copy_image) GLXEW_NV_copy_image = !_glewInit_GLX_NV_copy_image(); -#endif /* GLX_NV_copy_image */ -#ifdef GLX_NV_delay_before_swap - GLXEW_NV_delay_before_swap = _glewSearchExtension("GLX_NV_delay_before_swap", extStart, extEnd); - if (glewExperimental || GLXEW_NV_delay_before_swap) GLXEW_NV_delay_before_swap = !_glewInit_GLX_NV_delay_before_swap(); -#endif /* GLX_NV_delay_before_swap */ -#ifdef GLX_NV_float_buffer - GLXEW_NV_float_buffer = _glewSearchExtension("GLX_NV_float_buffer", extStart, extEnd); -#endif /* GLX_NV_float_buffer */ -#ifdef GLX_NV_multigpu_context - GLXEW_NV_multigpu_context = _glewSearchExtension("GLX_NV_multigpu_context", extStart, extEnd); -#endif /* GLX_NV_multigpu_context */ -#ifdef GLX_NV_multisample_coverage - GLXEW_NV_multisample_coverage = _glewSearchExtension("GLX_NV_multisample_coverage", extStart, extEnd); -#endif /* GLX_NV_multisample_coverage */ -#ifdef GLX_NV_present_video - GLXEW_NV_present_video = _glewSearchExtension("GLX_NV_present_video", extStart, extEnd); - if (glewExperimental || GLXEW_NV_present_video) GLXEW_NV_present_video = !_glewInit_GLX_NV_present_video(); -#endif /* GLX_NV_present_video */ -#ifdef GLX_NV_robustness_video_memory_purge - GLXEW_NV_robustness_video_memory_purge = _glewSearchExtension("GLX_NV_robustness_video_memory_purge", extStart, extEnd); -#endif /* GLX_NV_robustness_video_memory_purge */ -#ifdef GLX_NV_swap_group - GLXEW_NV_swap_group = _glewSearchExtension("GLX_NV_swap_group", extStart, extEnd); - if (glewExperimental || GLXEW_NV_swap_group) GLXEW_NV_swap_group = !_glewInit_GLX_NV_swap_group(); -#endif /* GLX_NV_swap_group */ -#ifdef GLX_NV_vertex_array_range - GLXEW_NV_vertex_array_range = _glewSearchExtension("GLX_NV_vertex_array_range", extStart, extEnd); - if (glewExperimental || GLXEW_NV_vertex_array_range) GLXEW_NV_vertex_array_range = !_glewInit_GLX_NV_vertex_array_range(); -#endif /* GLX_NV_vertex_array_range */ -#ifdef GLX_NV_video_capture - GLXEW_NV_video_capture = _glewSearchExtension("GLX_NV_video_capture", extStart, extEnd); - if (glewExperimental || GLXEW_NV_video_capture) GLXEW_NV_video_capture = !_glewInit_GLX_NV_video_capture(); -#endif /* GLX_NV_video_capture */ -#ifdef GLX_NV_video_out - GLXEW_NV_video_out = _glewSearchExtension("GLX_NV_video_out", extStart, extEnd); - if (glewExperimental || GLXEW_NV_video_out) GLXEW_NV_video_out = !_glewInit_GLX_NV_video_out(); -#endif /* GLX_NV_video_out */ -#ifdef GLX_OML_swap_method - GLXEW_OML_swap_method = _glewSearchExtension("GLX_OML_swap_method", extStart, extEnd); -#endif /* GLX_OML_swap_method */ -#ifdef GLX_OML_sync_control - GLXEW_OML_sync_control = _glewSearchExtension("GLX_OML_sync_control", extStart, extEnd); - if (glewExperimental || GLXEW_OML_sync_control) GLXEW_OML_sync_control = !_glewInit_GLX_OML_sync_control(); -#endif /* GLX_OML_sync_control */ -#ifdef GLX_SGIS_blended_overlay - GLXEW_SGIS_blended_overlay = _glewSearchExtension("GLX_SGIS_blended_overlay", extStart, extEnd); -#endif /* GLX_SGIS_blended_overlay */ -#ifdef GLX_SGIS_color_range - GLXEW_SGIS_color_range = _glewSearchExtension("GLX_SGIS_color_range", extStart, extEnd); -#endif /* GLX_SGIS_color_range */ -#ifdef GLX_SGIS_multisample - GLXEW_SGIS_multisample = _glewSearchExtension("GLX_SGIS_multisample", extStart, extEnd); -#endif /* GLX_SGIS_multisample */ -#ifdef GLX_SGIS_shared_multisample - GLXEW_SGIS_shared_multisample = _glewSearchExtension("GLX_SGIS_shared_multisample", extStart, extEnd); -#endif /* GLX_SGIS_shared_multisample */ -#ifdef GLX_SGIX_fbconfig - GLXEW_SGIX_fbconfig = _glewSearchExtension("GLX_SGIX_fbconfig", extStart, extEnd); - if (glewExperimental || GLXEW_SGIX_fbconfig) GLXEW_SGIX_fbconfig = !_glewInit_GLX_SGIX_fbconfig(); -#endif /* GLX_SGIX_fbconfig */ -#ifdef GLX_SGIX_hyperpipe - GLXEW_SGIX_hyperpipe = _glewSearchExtension("GLX_SGIX_hyperpipe", extStart, extEnd); - if (glewExperimental || GLXEW_SGIX_hyperpipe) GLXEW_SGIX_hyperpipe = !_glewInit_GLX_SGIX_hyperpipe(); -#endif /* GLX_SGIX_hyperpipe */ -#ifdef GLX_SGIX_pbuffer - GLXEW_SGIX_pbuffer = _glewSearchExtension("GLX_SGIX_pbuffer", extStart, extEnd); - if (glewExperimental || GLXEW_SGIX_pbuffer) GLXEW_SGIX_pbuffer = !_glewInit_GLX_SGIX_pbuffer(); -#endif /* GLX_SGIX_pbuffer */ -#ifdef GLX_SGIX_swap_barrier - GLXEW_SGIX_swap_barrier = _glewSearchExtension("GLX_SGIX_swap_barrier", extStart, extEnd); - if (glewExperimental || GLXEW_SGIX_swap_barrier) GLXEW_SGIX_swap_barrier = !_glewInit_GLX_SGIX_swap_barrier(); -#endif /* GLX_SGIX_swap_barrier */ -#ifdef GLX_SGIX_swap_group - GLXEW_SGIX_swap_group = _glewSearchExtension("GLX_SGIX_swap_group", extStart, extEnd); - if (glewExperimental || GLXEW_SGIX_swap_group) GLXEW_SGIX_swap_group = !_glewInit_GLX_SGIX_swap_group(); -#endif /* GLX_SGIX_swap_group */ -#ifdef GLX_SGIX_video_resize - GLXEW_SGIX_video_resize = _glewSearchExtension("GLX_SGIX_video_resize", extStart, extEnd); - if (glewExperimental || GLXEW_SGIX_video_resize) GLXEW_SGIX_video_resize = !_glewInit_GLX_SGIX_video_resize(); -#endif /* GLX_SGIX_video_resize */ -#ifdef GLX_SGIX_visual_select_group - GLXEW_SGIX_visual_select_group = _glewSearchExtension("GLX_SGIX_visual_select_group", extStart, extEnd); -#endif /* GLX_SGIX_visual_select_group */ -#ifdef GLX_SGI_cushion - GLXEW_SGI_cushion = _glewSearchExtension("GLX_SGI_cushion", extStart, extEnd); - if (glewExperimental || GLXEW_SGI_cushion) GLXEW_SGI_cushion = !_glewInit_GLX_SGI_cushion(); -#endif /* GLX_SGI_cushion */ -#ifdef GLX_SGI_make_current_read - GLXEW_SGI_make_current_read = _glewSearchExtension("GLX_SGI_make_current_read", extStart, extEnd); - if (glewExperimental || GLXEW_SGI_make_current_read) GLXEW_SGI_make_current_read = !_glewInit_GLX_SGI_make_current_read(); -#endif /* GLX_SGI_make_current_read */ -#ifdef GLX_SGI_swap_control - GLXEW_SGI_swap_control = _glewSearchExtension("GLX_SGI_swap_control", extStart, extEnd); - if (glewExperimental || GLXEW_SGI_swap_control) GLXEW_SGI_swap_control = !_glewInit_GLX_SGI_swap_control(); -#endif /* GLX_SGI_swap_control */ -#ifdef GLX_SGI_video_sync - GLXEW_SGI_video_sync = _glewSearchExtension("GLX_SGI_video_sync", extStart, extEnd); - if (glewExperimental || GLXEW_SGI_video_sync) GLXEW_SGI_video_sync = !_glewInit_GLX_SGI_video_sync(); -#endif /* GLX_SGI_video_sync */ -#ifdef GLX_SUN_get_transparent_index - GLXEW_SUN_get_transparent_index = _glewSearchExtension("GLX_SUN_get_transparent_index", extStart, extEnd); - if (glewExperimental || GLXEW_SUN_get_transparent_index) GLXEW_SUN_get_transparent_index = !_glewInit_GLX_SUN_get_transparent_index(); -#endif /* GLX_SUN_get_transparent_index */ -#ifdef GLX_SUN_video_resize - GLXEW_SUN_video_resize = _glewSearchExtension("GLX_SUN_video_resize", extStart, extEnd); - if (glewExperimental || GLXEW_SUN_video_resize) GLXEW_SUN_video_resize = !_glewInit_GLX_SUN_video_resize(); -#endif /* GLX_SUN_video_resize */ - - return GLEW_OK; -} - -#endif /* !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) */ - -/* ------------------------------------------------------------------------ */ - -const GLubyte * GLEWAPIENTRY glewGetErrorString (GLenum error) -{ - static const GLubyte* _glewErrorString[] = - { - (const GLubyte*)"No error", - (const GLubyte*)"Missing GL version", - (const GLubyte*)"GL 1.1 and up are not supported", - (const GLubyte*)"GLX 1.2 and up are not supported", - (const GLubyte*)"Unknown error" - }; - const size_t max_error = sizeof(_glewErrorString)/sizeof(*_glewErrorString) - 1; - return _glewErrorString[(size_t)error > max_error ? max_error : (size_t)error]; -} - -const GLubyte * GLEWAPIENTRY glewGetString (GLenum name) -{ - static const GLubyte* _glewString[] = - { - (const GLubyte*)NULL, - (const GLubyte*)"2.2.0", - (const GLubyte*)"2", - (const GLubyte*)"2", - (const GLubyte*)"0" - }; - const size_t max_string = sizeof(_glewString)/sizeof(*_glewString) - 1; - return _glewString[(size_t)name > max_string ? 0 : (size_t)name]; -} - -/* ------------------------------------------------------------------------ */ - -GLboolean glewExperimental = GL_FALSE; - -GLenum GLEWAPIENTRY glewInit (void) -{ - GLenum r; -#if defined(GLEW_EGL) - PFNEGLGETCURRENTDISPLAYPROC getCurrentDisplay = NULL; -#endif - r = glewContextInit(); - if ( r != 0 ) return r; -#if defined(GLEW_EGL) - getCurrentDisplay = (PFNEGLGETCURRENTDISPLAYPROC) glewGetProcAddress("eglGetCurrentDisplay"); - return eglewInit(getCurrentDisplay()); -#elif defined(GLEW_OSMESA) || defined(__ANDROID__) || defined(__native_client__) || defined(__HAIKU__) - return r; -#elif defined(_WIN32) - return wglewInit(); -#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) /* _UNIX */ - return glxewInit(); -#else - return r; -#endif /* _WIN32 */ -} - -#if defined(_WIN32) && defined(GLEW_BUILD) && defined(__GNUC__) -/* GCC requires a DLL entry point even without any standard library included. */ -/* Types extracted from windows.h to avoid polluting the rest of the file. */ -int __stdcall DllMainCRTStartup(void* instance, unsigned reason, void* reserved) -{ - (void) instance; - (void) reason; - (void) reserved; - return 1; -} -#endif -GLboolean GLEWAPIENTRY glewIsSupported (const char* name) -{ - const GLubyte* pos = (const GLubyte*)name; - GLuint len = _glewStrLen(pos); - GLboolean ret = GL_TRUE; - while (ret && len > 0) - { - if (_glewStrSame1(&pos, &len, (const GLubyte*)"GL_", 3)) - { - if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) - { -#ifdef GL_VERSION_1_2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) - { - ret = GLEW_VERSION_1_2; - continue; - } -#endif -#ifdef GL_VERSION_1_2_1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2_1", 5)) - { - ret = GLEW_VERSION_1_2_1; - continue; - } -#endif -#ifdef GL_VERSION_1_3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) - { - ret = GLEW_VERSION_1_3; - continue; - } -#endif -#ifdef GL_VERSION_1_4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) - { - ret = GLEW_VERSION_1_4; - continue; - } -#endif -#ifdef GL_VERSION_1_5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_5", 3)) - { - ret = GLEW_VERSION_1_5; - continue; - } -#endif -#ifdef GL_VERSION_2_0 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"2_0", 3)) - { - ret = GLEW_VERSION_2_0; - continue; - } -#endif -#ifdef GL_VERSION_2_1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"2_1", 3)) - { - ret = GLEW_VERSION_2_1; - continue; - } -#endif -#ifdef GL_VERSION_3_0 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_0", 3)) - { - ret = GLEW_VERSION_3_0; - continue; - } -#endif -#ifdef GL_VERSION_3_1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_1", 3)) - { - ret = GLEW_VERSION_3_1; - continue; - } -#endif -#ifdef GL_VERSION_3_2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_2", 3)) - { - ret = GLEW_VERSION_3_2; - continue; - } -#endif -#ifdef GL_VERSION_3_3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_3", 3)) - { - ret = GLEW_VERSION_3_3; - continue; - } -#endif -#ifdef GL_VERSION_4_0 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_0", 3)) - { - ret = GLEW_VERSION_4_0; - continue; - } -#endif -#ifdef GL_VERSION_4_1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_1", 3)) - { - ret = GLEW_VERSION_4_1; - continue; - } -#endif -#ifdef GL_VERSION_4_2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_2", 3)) - { - ret = GLEW_VERSION_4_2; - continue; - } -#endif -#ifdef GL_VERSION_4_3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_3", 3)) - { - ret = GLEW_VERSION_4_3; - continue; - } -#endif -#ifdef GL_VERSION_4_4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_4", 3)) - { - ret = GLEW_VERSION_4_4; - continue; - } -#endif -#ifdef GL_VERSION_4_5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_5", 3)) - { - ret = GLEW_VERSION_4_5; - continue; - } -#endif -#ifdef GL_VERSION_4_6 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_6", 3)) - { - ret = GLEW_VERSION_4_6; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) - { -#ifdef GL_3DFX_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLEW_3DFX_multisample; - continue; - } -#endif -#ifdef GL_3DFX_tbuffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"tbuffer", 7)) - { - ret = GLEW_3DFX_tbuffer; - continue; - } -#endif -#ifdef GL_3DFX_texture_compression_FXT1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_FXT1", 24)) - { - ret = GLEW_3DFX_texture_compression_FXT1; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) - { -#ifdef GL_AMD_blend_minmax_factor - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax_factor", 19)) - { - ret = GLEW_AMD_blend_minmax_factor; - continue; - } -#endif -#ifdef GL_AMD_compressed_3DC_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_3DC_texture", 22)) - { - ret = GLEW_AMD_compressed_3DC_texture; - continue; - } -#endif -#ifdef GL_AMD_compressed_ATC_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_ATC_texture", 22)) - { - ret = GLEW_AMD_compressed_ATC_texture; - continue; - } -#endif -#ifdef GL_AMD_conservative_depth - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18)) - { - ret = GLEW_AMD_conservative_depth; - continue; - } -#endif -#ifdef GL_AMD_debug_output - if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_output", 12)) - { - ret = GLEW_AMD_debug_output; - continue; - } -#endif -#ifdef GL_AMD_depth_clamp_separate - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp_separate", 20)) - { - ret = GLEW_AMD_depth_clamp_separate; - continue; - } -#endif -#ifdef GL_AMD_draw_buffers_blend - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_blend", 18)) - { - ret = GLEW_AMD_draw_buffers_blend; - continue; - } -#endif -#ifdef GL_AMD_framebuffer_multisample_advanced - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample_advanced", 32)) - { - ret = GLEW_AMD_framebuffer_multisample_advanced; - continue; - } -#endif -#ifdef GL_AMD_framebuffer_sample_positions - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sample_positions", 28)) - { - ret = GLEW_AMD_framebuffer_sample_positions; - continue; - } -#endif -#ifdef GL_AMD_gcn_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gcn_shader", 10)) - { - ret = GLEW_AMD_gcn_shader; - continue; - } -#endif -#ifdef GL_AMD_gpu_shader_half_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_half_float", 21)) - { - ret = GLEW_AMD_gpu_shader_half_float; - continue; - } -#endif -#ifdef GL_AMD_gpu_shader_half_float_fetch - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_half_float_fetch", 27)) - { - ret = GLEW_AMD_gpu_shader_half_float_fetch; - continue; - } -#endif -#ifdef GL_AMD_gpu_shader_int16 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_int16", 16)) - { - ret = GLEW_AMD_gpu_shader_int16; - continue; - } -#endif -#ifdef GL_AMD_gpu_shader_int64 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_int64", 16)) - { - ret = GLEW_AMD_gpu_shader_int64; - continue; - } -#endif -#ifdef GL_AMD_interleaved_elements - if (_glewStrSame3(&pos, &len, (const GLubyte*)"interleaved_elements", 20)) - { - ret = GLEW_AMD_interleaved_elements; - continue; - } -#endif -#ifdef GL_AMD_multi_draw_indirect - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) - { - ret = GLEW_AMD_multi_draw_indirect; - continue; - } -#endif -#ifdef GL_AMD_name_gen_delete - if (_glewStrSame3(&pos, &len, (const GLubyte*)"name_gen_delete", 15)) - { - ret = GLEW_AMD_name_gen_delete; - continue; - } -#endif -#ifdef GL_AMD_occlusion_query_event - if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query_event", 21)) - { - ret = GLEW_AMD_occlusion_query_event; - continue; - } -#endif -#ifdef GL_AMD_performance_monitor - if (_glewStrSame3(&pos, &len, (const GLubyte*)"performance_monitor", 19)) - { - ret = GLEW_AMD_performance_monitor; - continue; - } -#endif -#ifdef GL_AMD_pinned_memory - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pinned_memory", 13)) - { - ret = GLEW_AMD_pinned_memory; - continue; - } -#endif -#ifdef GL_AMD_program_binary_Z400 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_binary_Z400", 19)) - { - ret = GLEW_AMD_program_binary_Z400; - continue; - } -#endif -#ifdef GL_AMD_query_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_buffer_object", 19)) - { - ret = GLEW_AMD_query_buffer_object; - continue; - } -#endif -#ifdef GL_AMD_sample_positions - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_positions", 16)) - { - ret = GLEW_AMD_sample_positions; - continue; - } -#endif -#ifdef GL_AMD_seamless_cubemap_per_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cubemap_per_texture", 28)) - { - ret = GLEW_AMD_seamless_cubemap_per_texture; - continue; - } -#endif -#ifdef GL_AMD_shader_atomic_counter_ops - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counter_ops", 25)) - { - ret = GLEW_AMD_shader_atomic_counter_ops; - continue; - } -#endif -#ifdef GL_AMD_shader_ballot - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_ballot", 13)) - { - ret = GLEW_AMD_shader_ballot; - continue; - } -#endif -#ifdef GL_AMD_shader_explicit_vertex_parameter - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_explicit_vertex_parameter", 32)) - { - ret = GLEW_AMD_shader_explicit_vertex_parameter; - continue; - } -#endif -#ifdef GL_AMD_shader_image_load_store_lod - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_store_lod", 27)) - { - ret = GLEW_AMD_shader_image_load_store_lod; - continue; - } -#endif -#ifdef GL_AMD_shader_stencil_export - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_export", 21)) - { - ret = GLEW_AMD_shader_stencil_export; - continue; - } -#endif -#ifdef GL_AMD_shader_stencil_value_export - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_value_export", 27)) - { - ret = GLEW_AMD_shader_stencil_value_export; - continue; - } -#endif -#ifdef GL_AMD_shader_trinary_minmax - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_trinary_minmax", 21)) - { - ret = GLEW_AMD_shader_trinary_minmax; - continue; - } -#endif -#ifdef GL_AMD_sparse_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14)) - { - ret = GLEW_AMD_sparse_texture; - continue; - } -#endif -#ifdef GL_AMD_stencil_operation_extended - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_operation_extended", 26)) - { - ret = GLEW_AMD_stencil_operation_extended; - continue; - } -#endif -#ifdef GL_AMD_texture_gather_bias_lod - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_gather_bias_lod", 23)) - { - ret = GLEW_AMD_texture_gather_bias_lod; - continue; - } -#endif -#ifdef GL_AMD_texture_texture4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_texture4", 16)) - { - ret = GLEW_AMD_texture_texture4; - continue; - } -#endif -#ifdef GL_AMD_transform_feedback3_lines_triangles - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback3_lines_triangles", 35)) - { - ret = GLEW_AMD_transform_feedback3_lines_triangles; - continue; - } -#endif -#ifdef GL_AMD_transform_feedback4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback4", 19)) - { - ret = GLEW_AMD_transform_feedback4; - continue; - } -#endif -#ifdef GL_AMD_vertex_shader_layer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_layer", 19)) - { - ret = GLEW_AMD_vertex_shader_layer; - continue; - } -#endif -#ifdef GL_AMD_vertex_shader_tessellator - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_tessellator", 25)) - { - ret = GLEW_AMD_vertex_shader_tessellator; - continue; - } -#endif -#ifdef GL_AMD_vertex_shader_viewport_index - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_viewport_index", 28)) - { - ret = GLEW_AMD_vertex_shader_viewport_index; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ANDROID_", 8)) - { -#ifdef GL_ANDROID_extension_pack_es31a - if (_glewStrSame3(&pos, &len, (const GLubyte*)"extension_pack_es31a", 20)) - { - ret = GLEW_ANDROID_extension_pack_es31a; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ANGLE_", 6)) - { -#ifdef GL_ANGLE_depth_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) - { - ret = GLEW_ANGLE_depth_texture; - continue; - } -#endif -#ifdef GL_ANGLE_framebuffer_blit - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16)) - { - ret = GLEW_ANGLE_framebuffer_blit; - continue; - } -#endif -#ifdef GL_ANGLE_framebuffer_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) - { - ret = GLEW_ANGLE_framebuffer_multisample; - continue; - } -#endif -#ifdef GL_ANGLE_instanced_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) - { - ret = GLEW_ANGLE_instanced_arrays; - continue; - } -#endif -#ifdef GL_ANGLE_pack_reverse_row_order - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_reverse_row_order", 22)) - { - ret = GLEW_ANGLE_pack_reverse_row_order; - continue; - } -#endif -#ifdef GL_ANGLE_program_binary - if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_binary", 14)) - { - ret = GLEW_ANGLE_program_binary; - continue; - } -#endif -#ifdef GL_ANGLE_texture_compression_dxt1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt1", 24)) - { - ret = GLEW_ANGLE_texture_compression_dxt1; - continue; - } -#endif -#ifdef GL_ANGLE_texture_compression_dxt3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt3", 24)) - { - ret = GLEW_ANGLE_texture_compression_dxt3; - continue; - } -#endif -#ifdef GL_ANGLE_texture_compression_dxt5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt5", 24)) - { - ret = GLEW_ANGLE_texture_compression_dxt5; - continue; - } -#endif -#ifdef GL_ANGLE_texture_usage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_usage", 13)) - { - ret = GLEW_ANGLE_texture_usage; - continue; - } -#endif -#ifdef GL_ANGLE_timer_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) - { - ret = GLEW_ANGLE_timer_query; - continue; - } -#endif -#ifdef GL_ANGLE_translated_shader_source - if (_glewStrSame3(&pos, &len, (const GLubyte*)"translated_shader_source", 24)) - { - ret = GLEW_ANGLE_translated_shader_source; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"APPLE_", 6)) - { -#ifdef GL_APPLE_aux_depth_stencil - if (_glewStrSame3(&pos, &len, (const GLubyte*)"aux_depth_stencil", 17)) - { - ret = GLEW_APPLE_aux_depth_stencil; - continue; - } -#endif -#ifdef GL_APPLE_client_storage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"client_storage", 14)) - { - ret = GLEW_APPLE_client_storage; - continue; - } -#endif -#ifdef GL_APPLE_clip_distance - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_distance", 13)) - { - ret = GLEW_APPLE_clip_distance; - continue; - } -#endif -#ifdef GL_APPLE_color_buffer_packed_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_packed_float", 25)) - { - ret = GLEW_APPLE_color_buffer_packed_float; - continue; - } -#endif -#ifdef GL_APPLE_copy_texture_levels - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_texture_levels", 19)) - { - ret = GLEW_APPLE_copy_texture_levels; - continue; - } -#endif -#ifdef GL_APPLE_element_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"element_array", 13)) - { - ret = GLEW_APPLE_element_array; - continue; - } -#endif -#ifdef GL_APPLE_fence - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence", 5)) - { - ret = GLEW_APPLE_fence; - continue; - } -#endif -#ifdef GL_APPLE_float_pixels - if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_pixels", 12)) - { - ret = GLEW_APPLE_float_pixels; - continue; - } -#endif -#ifdef GL_APPLE_flush_buffer_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"flush_buffer_range", 18)) - { - ret = GLEW_APPLE_flush_buffer_range; - continue; - } -#endif -#ifdef GL_APPLE_framebuffer_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) - { - ret = GLEW_APPLE_framebuffer_multisample; - continue; - } -#endif -#ifdef GL_APPLE_object_purgeable - if (_glewStrSame3(&pos, &len, (const GLubyte*)"object_purgeable", 16)) - { - ret = GLEW_APPLE_object_purgeable; - continue; - } -#endif -#ifdef GL_APPLE_pixel_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer", 12)) - { - ret = GLEW_APPLE_pixel_buffer; - continue; - } -#endif -#ifdef GL_APPLE_rgb_422 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"rgb_422", 7)) - { - ret = GLEW_APPLE_rgb_422; - continue; - } -#endif -#ifdef GL_APPLE_row_bytes - if (_glewStrSame3(&pos, &len, (const GLubyte*)"row_bytes", 9)) - { - ret = GLEW_APPLE_row_bytes; - continue; - } -#endif -#ifdef GL_APPLE_specular_vector - if (_glewStrSame3(&pos, &len, (const GLubyte*)"specular_vector", 15)) - { - ret = GLEW_APPLE_specular_vector; - continue; - } -#endif -#ifdef GL_APPLE_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync", 4)) - { - ret = GLEW_APPLE_sync; - continue; - } -#endif -#ifdef GL_APPLE_texture_2D_limited_npot - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_2D_limited_npot", 23)) - { - ret = GLEW_APPLE_texture_2D_limited_npot; - continue; - } -#endif -#ifdef GL_APPLE_texture_format_BGRA8888 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_format_BGRA8888", 23)) - { - ret = GLEW_APPLE_texture_format_BGRA8888; - continue; - } -#endif -#ifdef GL_APPLE_texture_max_level - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_max_level", 17)) - { - ret = GLEW_APPLE_texture_max_level; - continue; - } -#endif -#ifdef GL_APPLE_texture_packed_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_packed_float", 20)) - { - ret = GLEW_APPLE_texture_packed_float; - continue; - } -#endif -#ifdef GL_APPLE_texture_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_range", 13)) - { - ret = GLEW_APPLE_texture_range; - continue; - } -#endif -#ifdef GL_APPLE_transform_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_hint", 14)) - { - ret = GLEW_APPLE_transform_hint; - continue; - } -#endif -#ifdef GL_APPLE_vertex_array_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) - { - ret = GLEW_APPLE_vertex_array_object; - continue; - } -#endif -#ifdef GL_APPLE_vertex_array_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) - { - ret = GLEW_APPLE_vertex_array_range; - continue; - } -#endif -#ifdef GL_APPLE_vertex_program_evaluators - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program_evaluators", 25)) - { - ret = GLEW_APPLE_vertex_program_evaluators; - continue; - } -#endif -#ifdef GL_APPLE_ycbcr_422 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycbcr_422", 9)) - { - ret = GLEW_APPLE_ycbcr_422; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) - { -#ifdef GL_ARB_ES2_compatibility - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES2_compatibility", 17)) - { - ret = GLEW_ARB_ES2_compatibility; - continue; - } -#endif -#ifdef GL_ARB_ES3_1_compatibility - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_1_compatibility", 19)) - { - ret = GLEW_ARB_ES3_1_compatibility; - continue; - } -#endif -#ifdef GL_ARB_ES3_2_compatibility - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_2_compatibility", 19)) - { - ret = GLEW_ARB_ES3_2_compatibility; - continue; - } -#endif -#ifdef GL_ARB_ES3_compatibility - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_compatibility", 17)) - { - ret = GLEW_ARB_ES3_compatibility; - continue; - } -#endif -#ifdef GL_ARB_arrays_of_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"arrays_of_arrays", 16)) - { - ret = GLEW_ARB_arrays_of_arrays; - continue; - } -#endif -#ifdef GL_ARB_base_instance - if (_glewStrSame3(&pos, &len, (const GLubyte*)"base_instance", 13)) - { - ret = GLEW_ARB_base_instance; - continue; - } -#endif -#ifdef GL_ARB_bindless_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_texture", 16)) - { - ret = GLEW_ARB_bindless_texture; - continue; - } -#endif -#ifdef GL_ARB_blend_func_extended - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_extended", 19)) - { - ret = GLEW_ARB_blend_func_extended; - continue; - } -#endif -#ifdef GL_ARB_buffer_storage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_storage", 14)) - { - ret = GLEW_ARB_buffer_storage; - continue; - } -#endif -#ifdef GL_ARB_cl_event - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cl_event", 8)) - { - ret = GLEW_ARB_cl_event; - continue; - } -#endif -#ifdef GL_ARB_clear_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clear_buffer_object", 19)) - { - ret = GLEW_ARB_clear_buffer_object; - continue; - } -#endif -#ifdef GL_ARB_clear_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clear_texture", 13)) - { - ret = GLEW_ARB_clear_texture; - continue; - } -#endif -#ifdef GL_ARB_clip_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_control", 12)) - { - ret = GLEW_ARB_clip_control; - continue; - } -#endif -#ifdef GL_ARB_color_buffer_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_float", 18)) - { - ret = GLEW_ARB_color_buffer_float; - continue; - } -#endif -#ifdef GL_ARB_compatibility - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compatibility", 13)) - { - ret = GLEW_ARB_compatibility; - continue; - } -#endif -#ifdef GL_ARB_compressed_texture_pixel_storage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_texture_pixel_storage", 32)) - { - ret = GLEW_ARB_compressed_texture_pixel_storage; - continue; - } -#endif -#ifdef GL_ARB_compute_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_shader", 14)) - { - ret = GLEW_ARB_compute_shader; - continue; - } -#endif -#ifdef GL_ARB_compute_variable_group_size - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_variable_group_size", 27)) - { - ret = GLEW_ARB_compute_variable_group_size; - continue; - } -#endif -#ifdef GL_ARB_conditional_render_inverted - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render_inverted", 27)) - { - ret = GLEW_ARB_conditional_render_inverted; - continue; - } -#endif -#ifdef GL_ARB_conservative_depth - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18)) - { - ret = GLEW_ARB_conservative_depth; - continue; - } -#endif -#ifdef GL_ARB_copy_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_buffer", 11)) - { - ret = GLEW_ARB_copy_buffer; - continue; - } -#endif -#ifdef GL_ARB_copy_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) - { - ret = GLEW_ARB_copy_image; - continue; - } -#endif -#ifdef GL_ARB_cull_distance - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_distance", 13)) - { - ret = GLEW_ARB_cull_distance; - continue; - } -#endif -#ifdef GL_ARB_debug_output - if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_output", 12)) - { - ret = GLEW_ARB_debug_output; - continue; - } -#endif -#ifdef GL_ARB_depth_buffer_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_buffer_float", 18)) - { - ret = GLEW_ARB_depth_buffer_float; - continue; - } -#endif -#ifdef GL_ARB_depth_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp", 11)) - { - ret = GLEW_ARB_depth_clamp; - continue; - } -#endif -#ifdef GL_ARB_depth_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) - { - ret = GLEW_ARB_depth_texture; - continue; - } -#endif -#ifdef GL_ARB_derivative_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"derivative_control", 18)) - { - ret = GLEW_ARB_derivative_control; - continue; - } -#endif -#ifdef GL_ARB_direct_state_access - if (_glewStrSame3(&pos, &len, (const GLubyte*)"direct_state_access", 19)) - { - ret = GLEW_ARB_direct_state_access; - continue; - } -#endif -#ifdef GL_ARB_draw_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) - { - ret = GLEW_ARB_draw_buffers; - continue; - } -#endif -#ifdef GL_ARB_draw_buffers_blend - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_blend", 18)) - { - ret = GLEW_ARB_draw_buffers_blend; - continue; - } -#endif -#ifdef GL_ARB_draw_elements_base_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_elements_base_vertex", 25)) - { - ret = GLEW_ARB_draw_elements_base_vertex; - continue; - } -#endif -#ifdef GL_ARB_draw_indirect - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_indirect", 13)) - { - ret = GLEW_ARB_draw_indirect; - continue; - } -#endif -#ifdef GL_ARB_draw_instanced - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14)) - { - ret = GLEW_ARB_draw_instanced; - continue; - } -#endif -#ifdef GL_ARB_enhanced_layouts - if (_glewStrSame3(&pos, &len, (const GLubyte*)"enhanced_layouts", 16)) - { - ret = GLEW_ARB_enhanced_layouts; - continue; - } -#endif -#ifdef GL_ARB_explicit_attrib_location - if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_attrib_location", 24)) - { - ret = GLEW_ARB_explicit_attrib_location; - continue; - } -#endif -#ifdef GL_ARB_explicit_uniform_location - if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_uniform_location", 25)) - { - ret = GLEW_ARB_explicit_uniform_location; - continue; - } -#endif -#ifdef GL_ARB_fragment_coord_conventions - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_coord_conventions", 26)) - { - ret = GLEW_ARB_fragment_coord_conventions; - continue; - } -#endif -#ifdef GL_ARB_fragment_layer_viewport - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_layer_viewport", 23)) - { - ret = GLEW_ARB_fragment_layer_viewport; - continue; - } -#endif -#ifdef GL_ARB_fragment_program - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program", 16)) - { - ret = GLEW_ARB_fragment_program; - continue; - } -#endif -#ifdef GL_ARB_fragment_program_shadow - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program_shadow", 23)) - { - ret = GLEW_ARB_fragment_program_shadow; - continue; - } -#endif -#ifdef GL_ARB_fragment_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader", 15)) - { - ret = GLEW_ARB_fragment_shader; - continue; - } -#endif -#ifdef GL_ARB_fragment_shader_interlock - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_interlock", 25)) - { - ret = GLEW_ARB_fragment_shader_interlock; - continue; - } -#endif -#ifdef GL_ARB_framebuffer_no_attachments - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_no_attachments", 26)) - { - ret = GLEW_ARB_framebuffer_no_attachments; - continue; - } -#endif -#ifdef GL_ARB_framebuffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_object", 18)) - { - ret = GLEW_ARB_framebuffer_object; - continue; - } -#endif -#ifdef GL_ARB_framebuffer_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) - { - ret = GLEW_ARB_framebuffer_sRGB; - continue; - } -#endif -#ifdef GL_ARB_geometry_shader4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) - { - ret = GLEW_ARB_geometry_shader4; - continue; - } -#endif -#ifdef GL_ARB_get_program_binary - if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_program_binary", 18)) - { - ret = GLEW_ARB_get_program_binary; - continue; - } -#endif -#ifdef GL_ARB_get_texture_sub_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_texture_sub_image", 21)) - { - ret = GLEW_ARB_get_texture_sub_image; - continue; - } -#endif -#ifdef GL_ARB_gl_spirv - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_spirv", 8)) - { - ret = GLEW_ARB_gl_spirv; - continue; - } -#endif -#ifdef GL_ARB_gpu_shader5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11)) - { - ret = GLEW_ARB_gpu_shader5; - continue; - } -#endif -#ifdef GL_ARB_gpu_shader_fp64 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_fp64", 15)) - { - ret = GLEW_ARB_gpu_shader_fp64; - continue; - } -#endif -#ifdef GL_ARB_gpu_shader_int64 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_int64", 16)) - { - ret = GLEW_ARB_gpu_shader_int64; - continue; - } -#endif -#ifdef GL_ARB_half_float_pixel - if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float_pixel", 16)) - { - ret = GLEW_ARB_half_float_pixel; - continue; - } -#endif -#ifdef GL_ARB_half_float_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float_vertex", 17)) - { - ret = GLEW_ARB_half_float_vertex; - continue; - } -#endif -#ifdef GL_ARB_imaging - if (_glewStrSame3(&pos, &len, (const GLubyte*)"imaging", 7)) - { - ret = GLEW_ARB_imaging; - continue; - } -#endif -#ifdef GL_ARB_indirect_parameters - if (_glewStrSame3(&pos, &len, (const GLubyte*)"indirect_parameters", 19)) - { - ret = GLEW_ARB_indirect_parameters; - continue; - } -#endif -#ifdef GL_ARB_instanced_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) - { - ret = GLEW_ARB_instanced_arrays; - continue; - } -#endif -#ifdef GL_ARB_internalformat_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_query", 20)) - { - ret = GLEW_ARB_internalformat_query; - continue; - } -#endif -#ifdef GL_ARB_internalformat_query2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_query2", 21)) - { - ret = GLEW_ARB_internalformat_query2; - continue; - } -#endif -#ifdef GL_ARB_invalidate_subdata - if (_glewStrSame3(&pos, &len, (const GLubyte*)"invalidate_subdata", 18)) - { - ret = GLEW_ARB_invalidate_subdata; - continue; - } -#endif -#ifdef GL_ARB_map_buffer_alignment - if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_buffer_alignment", 20)) - { - ret = GLEW_ARB_map_buffer_alignment; - continue; - } -#endif -#ifdef GL_ARB_map_buffer_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_buffer_range", 16)) - { - ret = GLEW_ARB_map_buffer_range; - continue; - } -#endif -#ifdef GL_ARB_matrix_palette - if (_glewStrSame3(&pos, &len, (const GLubyte*)"matrix_palette", 14)) - { - ret = GLEW_ARB_matrix_palette; - continue; - } -#endif -#ifdef GL_ARB_multi_bind - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_bind", 10)) - { - ret = GLEW_ARB_multi_bind; - continue; - } -#endif -#ifdef GL_ARB_multi_draw_indirect - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) - { - ret = GLEW_ARB_multi_draw_indirect; - continue; - } -#endif -#ifdef GL_ARB_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLEW_ARB_multisample; - continue; - } -#endif -#ifdef GL_ARB_multitexture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multitexture", 12)) - { - ret = GLEW_ARB_multitexture; - continue; - } -#endif -#ifdef GL_ARB_occlusion_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query", 15)) - { - ret = GLEW_ARB_occlusion_query; - continue; - } -#endif -#ifdef GL_ARB_occlusion_query2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query2", 16)) - { - ret = GLEW_ARB_occlusion_query2; - continue; - } -#endif -#ifdef GL_ARB_parallel_shader_compile - if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_shader_compile", 23)) - { - ret = GLEW_ARB_parallel_shader_compile; - continue; - } -#endif -#ifdef GL_ARB_pipeline_statistics_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pipeline_statistics_query", 25)) - { - ret = GLEW_ARB_pipeline_statistics_query; - continue; - } -#endif -#ifdef GL_ARB_pixel_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) - { - ret = GLEW_ARB_pixel_buffer_object; - continue; - } -#endif -#ifdef GL_ARB_point_parameters - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_parameters", 16)) - { - ret = GLEW_ARB_point_parameters; - continue; - } -#endif -#ifdef GL_ARB_point_sprite - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprite", 12)) - { - ret = GLEW_ARB_point_sprite; - continue; - } -#endif -#ifdef GL_ARB_polygon_offset_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_offset_clamp", 20)) - { - ret = GLEW_ARB_polygon_offset_clamp; - continue; - } -#endif -#ifdef GL_ARB_post_depth_coverage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_depth_coverage", 19)) - { - ret = GLEW_ARB_post_depth_coverage; - continue; - } -#endif -#ifdef GL_ARB_program_interface_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_interface_query", 23)) - { - ret = GLEW_ARB_program_interface_query; - continue; - } -#endif -#ifdef GL_ARB_provoking_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"provoking_vertex", 16)) - { - ret = GLEW_ARB_provoking_vertex; - continue; - } -#endif -#ifdef GL_ARB_query_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_buffer_object", 19)) - { - ret = GLEW_ARB_query_buffer_object; - continue; - } -#endif -#ifdef GL_ARB_robust_buffer_access_behavior - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robust_buffer_access_behavior", 29)) - { - ret = GLEW_ARB_robust_buffer_access_behavior; - continue; - } -#endif -#ifdef GL_ARB_robustness - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness", 10)) - { - ret = GLEW_ARB_robustness; - continue; - } -#endif -#ifdef GL_ARB_robustness_application_isolation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) - { - ret = GLEW_ARB_robustness_application_isolation; - continue; - } -#endif -#ifdef GL_ARB_robustness_share_group_isolation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) - { - ret = GLEW_ARB_robustness_share_group_isolation; - continue; - } -#endif -#ifdef GL_ARB_sample_locations - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_locations", 16)) - { - ret = GLEW_ARB_sample_locations; - continue; - } -#endif -#ifdef GL_ARB_sample_shading - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_shading", 14)) - { - ret = GLEW_ARB_sample_shading; - continue; - } -#endif -#ifdef GL_ARB_sampler_objects - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sampler_objects", 15)) - { - ret = GLEW_ARB_sampler_objects; - continue; - } -#endif -#ifdef GL_ARB_seamless_cube_map - if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cube_map", 17)) - { - ret = GLEW_ARB_seamless_cube_map; - continue; - } -#endif -#ifdef GL_ARB_seamless_cubemap_per_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cubemap_per_texture", 28)) - { - ret = GLEW_ARB_seamless_cubemap_per_texture; - continue; - } -#endif -#ifdef GL_ARB_separate_shader_objects - if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_shader_objects", 23)) - { - ret = GLEW_ARB_separate_shader_objects; - continue; - } -#endif -#ifdef GL_ARB_shader_atomic_counter_ops - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counter_ops", 25)) - { - ret = GLEW_ARB_shader_atomic_counter_ops; - continue; - } -#endif -#ifdef GL_ARB_shader_atomic_counters - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counters", 22)) - { - ret = GLEW_ARB_shader_atomic_counters; - continue; - } -#endif -#ifdef GL_ARB_shader_ballot - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_ballot", 13)) - { - ret = GLEW_ARB_shader_ballot; - continue; - } -#endif -#ifdef GL_ARB_shader_bit_encoding - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_bit_encoding", 19)) - { - ret = GLEW_ARB_shader_bit_encoding; - continue; - } -#endif -#ifdef GL_ARB_shader_clock - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_clock", 12)) - { - ret = GLEW_ARB_shader_clock; - continue; - } -#endif -#ifdef GL_ARB_shader_draw_parameters - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_draw_parameters", 22)) - { - ret = GLEW_ARB_shader_draw_parameters; - continue; - } -#endif -#ifdef GL_ARB_shader_group_vote - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_group_vote", 17)) - { - ret = GLEW_ARB_shader_group_vote; - continue; - } -#endif -#ifdef GL_ARB_shader_image_load_store - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_store", 23)) - { - ret = GLEW_ARB_shader_image_load_store; - continue; - } -#endif -#ifdef GL_ARB_shader_image_size - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_size", 17)) - { - ret = GLEW_ARB_shader_image_size; - continue; - } -#endif -#ifdef GL_ARB_shader_objects - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_objects", 14)) - { - ret = GLEW_ARB_shader_objects; - continue; - } -#endif -#ifdef GL_ARB_shader_precision - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_precision", 16)) - { - ret = GLEW_ARB_shader_precision; - continue; - } -#endif -#ifdef GL_ARB_shader_stencil_export - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_export", 21)) - { - ret = GLEW_ARB_shader_stencil_export; - continue; - } -#endif -#ifdef GL_ARB_shader_storage_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_storage_buffer_object", 28)) - { - ret = GLEW_ARB_shader_storage_buffer_object; - continue; - } -#endif -#ifdef GL_ARB_shader_subroutine - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_subroutine", 17)) - { - ret = GLEW_ARB_shader_subroutine; - continue; - } -#endif -#ifdef GL_ARB_shader_texture_image_samples - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_image_samples", 28)) - { - ret = GLEW_ARB_shader_texture_image_samples; - continue; - } -#endif -#ifdef GL_ARB_shader_texture_lod - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18)) - { - ret = GLEW_ARB_shader_texture_lod; - continue; - } -#endif -#ifdef GL_ARB_shader_viewport_layer_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_viewport_layer_array", 27)) - { - ret = GLEW_ARB_shader_viewport_layer_array; - continue; - } -#endif -#ifdef GL_ARB_shading_language_100 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_100", 20)) - { - ret = GLEW_ARB_shading_language_100; - continue; - } -#endif -#ifdef GL_ARB_shading_language_420pack - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_420pack", 24)) - { - ret = GLEW_ARB_shading_language_420pack; - continue; - } -#endif -#ifdef GL_ARB_shading_language_include - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_include", 24)) - { - ret = GLEW_ARB_shading_language_include; - continue; - } -#endif -#ifdef GL_ARB_shading_language_packing - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_packing", 24)) - { - ret = GLEW_ARB_shading_language_packing; - continue; - } -#endif -#ifdef GL_ARB_shadow - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow", 6)) - { - ret = GLEW_ARB_shadow; - continue; - } -#endif -#ifdef GL_ARB_shadow_ambient - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_ambient", 14)) - { - ret = GLEW_ARB_shadow_ambient; - continue; - } -#endif -#ifdef GL_ARB_sparse_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_buffer", 13)) - { - ret = GLEW_ARB_sparse_buffer; - continue; - } -#endif -#ifdef GL_ARB_sparse_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14)) - { - ret = GLEW_ARB_sparse_texture; - continue; - } -#endif -#ifdef GL_ARB_sparse_texture2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture2", 15)) - { - ret = GLEW_ARB_sparse_texture2; - continue; - } -#endif -#ifdef GL_ARB_sparse_texture_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture_clamp", 20)) - { - ret = GLEW_ARB_sparse_texture_clamp; - continue; - } -#endif -#ifdef GL_ARB_spirv_extensions - if (_glewStrSame3(&pos, &len, (const GLubyte*)"spirv_extensions", 16)) - { - ret = GLEW_ARB_spirv_extensions; - continue; - } -#endif -#ifdef GL_ARB_stencil_texturing - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_texturing", 17)) - { - ret = GLEW_ARB_stencil_texturing; - continue; - } -#endif -#ifdef GL_ARB_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync", 4)) - { - ret = GLEW_ARB_sync; - continue; - } -#endif -#ifdef GL_ARB_tessellation_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_shader", 19)) - { - ret = GLEW_ARB_tessellation_shader; - continue; - } -#endif -#ifdef GL_ARB_texture_barrier - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_barrier", 15)) - { - ret = GLEW_ARB_texture_barrier; - continue; - } -#endif -#ifdef GL_ARB_texture_border_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) - { - ret = GLEW_ARB_texture_border_clamp; - continue; - } -#endif -#ifdef GL_ARB_texture_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object", 21)) - { - ret = GLEW_ARB_texture_buffer_object; - continue; - } -#endif -#ifdef GL_ARB_texture_buffer_object_rgb32 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object_rgb32", 27)) - { - ret = GLEW_ARB_texture_buffer_object_rgb32; - continue; - } -#endif -#ifdef GL_ARB_texture_buffer_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_range", 20)) - { - ret = GLEW_ARB_texture_buffer_range; - continue; - } -#endif -#ifdef GL_ARB_texture_compression - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression", 19)) - { - ret = GLEW_ARB_texture_compression; - continue; - } -#endif -#ifdef GL_ARB_texture_compression_bptc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_bptc", 24)) - { - ret = GLEW_ARB_texture_compression_bptc; - continue; - } -#endif -#ifdef GL_ARB_texture_compression_rgtc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_rgtc", 24)) - { - ret = GLEW_ARB_texture_compression_rgtc; - continue; - } -#endif -#ifdef GL_ARB_texture_cube_map - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map", 16)) - { - ret = GLEW_ARB_texture_cube_map; - continue; - } -#endif -#ifdef GL_ARB_texture_cube_map_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map_array", 22)) - { - ret = GLEW_ARB_texture_cube_map_array; - continue; - } -#endif -#ifdef GL_ARB_texture_env_add - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_add", 15)) - { - ret = GLEW_ARB_texture_env_add; - continue; - } -#endif -#ifdef GL_ARB_texture_env_combine - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine", 19)) - { - ret = GLEW_ARB_texture_env_combine; - continue; - } -#endif -#ifdef GL_ARB_texture_env_crossbar - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_crossbar", 20)) - { - ret = GLEW_ARB_texture_env_crossbar; - continue; - } -#endif -#ifdef GL_ARB_texture_env_dot3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_dot3", 16)) - { - ret = GLEW_ARB_texture_env_dot3; - continue; - } -#endif -#ifdef GL_ARB_texture_filter_anisotropic - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_anisotropic", 26)) - { - ret = GLEW_ARB_texture_filter_anisotropic; - continue; - } -#endif -#ifdef GL_ARB_texture_filter_minmax - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_minmax", 21)) - { - ret = GLEW_ARB_texture_filter_minmax; - continue; - } -#endif -#ifdef GL_ARB_texture_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_float", 13)) - { - ret = GLEW_ARB_texture_float; - continue; - } -#endif -#ifdef GL_ARB_texture_gather - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_gather", 14)) - { - ret = GLEW_ARB_texture_gather; - continue; - } -#endif -#ifdef GL_ARB_texture_mirror_clamp_to_edge - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_clamp_to_edge", 28)) - { - ret = GLEW_ARB_texture_mirror_clamp_to_edge; - continue; - } -#endif -#ifdef GL_ARB_texture_mirrored_repeat - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23)) - { - ret = GLEW_ARB_texture_mirrored_repeat; - continue; - } -#endif -#ifdef GL_ARB_texture_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multisample", 19)) - { - ret = GLEW_ARB_texture_multisample; - continue; - } -#endif -#ifdef GL_ARB_texture_non_power_of_two - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_non_power_of_two", 24)) - { - ret = GLEW_ARB_texture_non_power_of_two; - continue; - } -#endif -#ifdef GL_ARB_texture_query_levels - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_query_levels", 20)) - { - ret = GLEW_ARB_texture_query_levels; - continue; - } -#endif -#ifdef GL_ARB_texture_query_lod - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_query_lod", 17)) - { - ret = GLEW_ARB_texture_query_lod; - continue; - } -#endif -#ifdef GL_ARB_texture_rectangle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) - { - ret = GLEW_ARB_texture_rectangle; - continue; - } -#endif -#ifdef GL_ARB_texture_rg - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rg", 10)) - { - ret = GLEW_ARB_texture_rg; - continue; - } -#endif -#ifdef GL_ARB_texture_rgb10_a2ui - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rgb10_a2ui", 18)) - { - ret = GLEW_ARB_texture_rgb10_a2ui; - continue; - } -#endif -#ifdef GL_ARB_texture_stencil8 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_stencil8", 16)) - { - ret = GLEW_ARB_texture_stencil8; - continue; - } -#endif -#ifdef GL_ARB_texture_storage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage", 15)) - { - ret = GLEW_ARB_texture_storage; - continue; - } -#endif -#ifdef GL_ARB_texture_storage_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage_multisample", 27)) - { - ret = GLEW_ARB_texture_storage_multisample; - continue; - } -#endif -#ifdef GL_ARB_texture_swizzle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_swizzle", 15)) - { - ret = GLEW_ARB_texture_swizzle; - continue; - } -#endif -#ifdef GL_ARB_texture_view - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_view", 12)) - { - ret = GLEW_ARB_texture_view; - continue; - } -#endif -#ifdef GL_ARB_timer_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) - { - ret = GLEW_ARB_timer_query; - continue; - } -#endif -#ifdef GL_ARB_transform_feedback2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback2", 19)) - { - ret = GLEW_ARB_transform_feedback2; - continue; - } -#endif -#ifdef GL_ARB_transform_feedback3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback3", 19)) - { - ret = GLEW_ARB_transform_feedback3; - continue; - } -#endif -#ifdef GL_ARB_transform_feedback_instanced - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback_instanced", 28)) - { - ret = GLEW_ARB_transform_feedback_instanced; - continue; - } -#endif -#ifdef GL_ARB_transform_feedback_overflow_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback_overflow_query", 33)) - { - ret = GLEW_ARB_transform_feedback_overflow_query; - continue; - } -#endif -#ifdef GL_ARB_transpose_matrix - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transpose_matrix", 16)) - { - ret = GLEW_ARB_transpose_matrix; - continue; - } -#endif -#ifdef GL_ARB_uniform_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"uniform_buffer_object", 21)) - { - ret = GLEW_ARB_uniform_buffer_object; - continue; - } -#endif -#ifdef GL_ARB_vertex_array_bgra - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_bgra", 17)) - { - ret = GLEW_ARB_vertex_array_bgra; - continue; - } -#endif -#ifdef GL_ARB_vertex_array_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) - { - ret = GLEW_ARB_vertex_array_object; - continue; - } -#endif -#ifdef GL_ARB_vertex_attrib_64bit - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_64bit", 19)) - { - ret = GLEW_ARB_vertex_attrib_64bit; - continue; - } -#endif -#ifdef GL_ARB_vertex_attrib_binding - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_binding", 21)) - { - ret = GLEW_ARB_vertex_attrib_binding; - continue; - } -#endif -#ifdef GL_ARB_vertex_blend - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_blend", 12)) - { - ret = GLEW_ARB_vertex_blend; - continue; - } -#endif -#ifdef GL_ARB_vertex_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_object", 20)) - { - ret = GLEW_ARB_vertex_buffer_object; - continue; - } -#endif -#ifdef GL_ARB_vertex_program - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program", 14)) - { - ret = GLEW_ARB_vertex_program; - continue; - } -#endif -#ifdef GL_ARB_vertex_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader", 13)) - { - ret = GLEW_ARB_vertex_shader; - continue; - } -#endif -#ifdef GL_ARB_vertex_type_10f_11f_11f_rev - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_type_10f_11f_11f_rev", 27)) - { - ret = GLEW_ARB_vertex_type_10f_11f_11f_rev; - continue; - } -#endif -#ifdef GL_ARB_vertex_type_2_10_10_10_rev - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_type_2_10_10_10_rev", 26)) - { - ret = GLEW_ARB_vertex_type_2_10_10_10_rev; - continue; - } -#endif -#ifdef GL_ARB_viewport_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_array", 14)) - { - ret = GLEW_ARB_viewport_array; - continue; - } -#endif -#ifdef GL_ARB_window_pos - if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_pos", 10)) - { - ret = GLEW_ARB_window_pos; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARM_", 4)) - { -#ifdef GL_ARM_mali_program_binary - if (_glewStrSame3(&pos, &len, (const GLubyte*)"mali_program_binary", 19)) - { - ret = GLEW_ARM_mali_program_binary; - continue; - } -#endif -#ifdef GL_ARM_mali_shader_binary - if (_glewStrSame3(&pos, &len, (const GLubyte*)"mali_shader_binary", 18)) - { - ret = GLEW_ARM_mali_shader_binary; - continue; - } -#endif -#ifdef GL_ARM_rgba8 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"rgba8", 5)) - { - ret = GLEW_ARM_rgba8; - continue; - } -#endif -#ifdef GL_ARM_shader_framebuffer_fetch - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_framebuffer_fetch", 24)) - { - ret = GLEW_ARM_shader_framebuffer_fetch; - continue; - } -#endif -#ifdef GL_ARM_shader_framebuffer_fetch_depth_stencil - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_framebuffer_fetch_depth_stencil", 38)) - { - ret = GLEW_ARM_shader_framebuffer_fetch_depth_stencil; - continue; - } -#endif -#ifdef GL_ARM_texture_unnormalized_coordinates - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_unnormalized_coordinates", 32)) - { - ret = GLEW_ARM_texture_unnormalized_coordinates; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATIX_", 5)) - { -#ifdef GL_ATIX_point_sprites - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprites", 13)) - { - ret = GLEW_ATIX_point_sprites; - continue; - } -#endif -#ifdef GL_ATIX_texture_env_combine3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine3", 20)) - { - ret = GLEW_ATIX_texture_env_combine3; - continue; - } -#endif -#ifdef GL_ATIX_texture_env_route - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_route", 17)) - { - ret = GLEW_ATIX_texture_env_route; - continue; - } -#endif -#ifdef GL_ATIX_vertex_shader_output_point_size - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_output_point_size", 31)) - { - ret = GLEW_ATIX_vertex_shader_output_point_size; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) - { -#ifdef GL_ATI_draw_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) - { - ret = GLEW_ATI_draw_buffers; - continue; - } -#endif -#ifdef GL_ATI_element_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"element_array", 13)) - { - ret = GLEW_ATI_element_array; - continue; - } -#endif -#ifdef GL_ATI_envmap_bumpmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"envmap_bumpmap", 14)) - { - ret = GLEW_ATI_envmap_bumpmap; - continue; - } -#endif -#ifdef GL_ATI_fragment_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader", 15)) - { - ret = GLEW_ATI_fragment_shader; - continue; - } -#endif -#ifdef GL_ATI_map_object_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_object_buffer", 17)) - { - ret = GLEW_ATI_map_object_buffer; - continue; - } -#endif -#ifdef GL_ATI_meminfo - if (_glewStrSame3(&pos, &len, (const GLubyte*)"meminfo", 7)) - { - ret = GLEW_ATI_meminfo; - continue; - } -#endif -#ifdef GL_ATI_pn_triangles - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pn_triangles", 12)) - { - ret = GLEW_ATI_pn_triangles; - continue; - } -#endif -#ifdef GL_ATI_separate_stencil - if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_stencil", 16)) - { - ret = GLEW_ATI_separate_stencil; - continue; - } -#endif -#ifdef GL_ATI_shader_texture_lod - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18)) - { - ret = GLEW_ATI_shader_texture_lod; - continue; - } -#endif -#ifdef GL_ATI_text_fragment_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"text_fragment_shader", 20)) - { - ret = GLEW_ATI_text_fragment_shader; - continue; - } -#endif -#ifdef GL_ATI_texture_compression_3dc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_3dc", 23)) - { - ret = GLEW_ATI_texture_compression_3dc; - continue; - } -#endif -#ifdef GL_ATI_texture_env_combine3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine3", 20)) - { - ret = GLEW_ATI_texture_env_combine3; - continue; - } -#endif -#ifdef GL_ATI_texture_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_float", 13)) - { - ret = GLEW_ATI_texture_float; - continue; - } -#endif -#ifdef GL_ATI_texture_mirror_once - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_once", 19)) - { - ret = GLEW_ATI_texture_mirror_once; - continue; - } -#endif -#ifdef GL_ATI_vertex_array_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) - { - ret = GLEW_ATI_vertex_array_object; - continue; - } -#endif -#ifdef GL_ATI_vertex_attrib_array_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_array_object", 26)) - { - ret = GLEW_ATI_vertex_attrib_array_object; - continue; - } -#endif -#ifdef GL_ATI_vertex_streams - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_streams", 14)) - { - ret = GLEW_ATI_vertex_streams; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"DMP_", 4)) - { -#ifdef GL_DMP_program_binary - if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_binary", 14)) - { - ret = GLEW_DMP_program_binary; - continue; - } -#endif -#ifdef GL_DMP_shader_binary - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_binary", 13)) - { - ret = GLEW_DMP_shader_binary; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) - { -#ifdef GL_EXT_422_pixels - if (_glewStrSame3(&pos, &len, (const GLubyte*)"422_pixels", 10)) - { - ret = GLEW_EXT_422_pixels; - continue; - } -#endif -#ifdef GL_EXT_Cg_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"Cg_shader", 9)) - { - ret = GLEW_EXT_Cg_shader; - continue; - } -#endif -#ifdef GL_EXT_EGL_image_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"EGL_image_array", 15)) - { - ret = GLEW_EXT_EGL_image_array; - continue; - } -#endif -#ifdef GL_EXT_EGL_image_external_wrap_modes - if (_glewStrSame3(&pos, &len, (const GLubyte*)"EGL_image_external_wrap_modes", 29)) - { - ret = GLEW_EXT_EGL_image_external_wrap_modes; - continue; - } -#endif -#ifdef GL_EXT_EGL_image_storage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"EGL_image_storage", 17)) - { - ret = GLEW_EXT_EGL_image_storage; - continue; - } -#endif -#ifdef GL_EXT_EGL_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"EGL_sync", 8)) - { - ret = GLEW_EXT_EGL_sync; - continue; - } -#endif -#ifdef GL_EXT_YUV_target - if (_glewStrSame3(&pos, &len, (const GLubyte*)"YUV_target", 10)) - { - ret = GLEW_EXT_YUV_target; - continue; - } -#endif -#ifdef GL_EXT_abgr - if (_glewStrSame3(&pos, &len, (const GLubyte*)"abgr", 4)) - { - ret = GLEW_EXT_abgr; - continue; - } -#endif -#ifdef GL_EXT_base_instance - if (_glewStrSame3(&pos, &len, (const GLubyte*)"base_instance", 13)) - { - ret = GLEW_EXT_base_instance; - continue; - } -#endif -#ifdef GL_EXT_bgra - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bgra", 4)) - { - ret = GLEW_EXT_bgra; - continue; - } -#endif -#ifdef GL_EXT_bindable_uniform - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindable_uniform", 16)) - { - ret = GLEW_EXT_bindable_uniform; - continue; - } -#endif -#ifdef GL_EXT_blend_color - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_color", 11)) - { - ret = GLEW_EXT_blend_color; - continue; - } -#endif -#ifdef GL_EXT_blend_equation_separate - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_separate", 23)) - { - ret = GLEW_EXT_blend_equation_separate; - continue; - } -#endif -#ifdef GL_EXT_blend_func_extended - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_extended", 19)) - { - ret = GLEW_EXT_blend_func_extended; - continue; - } -#endif -#ifdef GL_EXT_blend_func_separate - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_separate", 19)) - { - ret = GLEW_EXT_blend_func_separate; - continue; - } -#endif -#ifdef GL_EXT_blend_logic_op - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_logic_op", 14)) - { - ret = GLEW_EXT_blend_logic_op; - continue; - } -#endif -#ifdef GL_EXT_blend_minmax - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax", 12)) - { - ret = GLEW_EXT_blend_minmax; - continue; - } -#endif -#ifdef GL_EXT_blend_subtract - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_subtract", 14)) - { - ret = GLEW_EXT_blend_subtract; - continue; - } -#endif -#ifdef GL_EXT_buffer_storage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_storage", 14)) - { - ret = GLEW_EXT_buffer_storage; - continue; - } -#endif -#ifdef GL_EXT_clear_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clear_texture", 13)) - { - ret = GLEW_EXT_clear_texture; - continue; - } -#endif -#ifdef GL_EXT_clip_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_control", 12)) - { - ret = GLEW_EXT_clip_control; - continue; - } -#endif -#ifdef GL_EXT_clip_cull_distance - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_cull_distance", 18)) - { - ret = GLEW_EXT_clip_cull_distance; - continue; - } -#endif -#ifdef GL_EXT_clip_volume_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_volume_hint", 16)) - { - ret = GLEW_EXT_clip_volume_hint; - continue; - } -#endif -#ifdef GL_EXT_cmyka - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cmyka", 5)) - { - ret = GLEW_EXT_cmyka; - continue; - } -#endif -#ifdef GL_EXT_color_buffer_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_float", 18)) - { - ret = GLEW_EXT_color_buffer_float; - continue; - } -#endif -#ifdef GL_EXT_color_buffer_half_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_half_float", 23)) - { - ret = GLEW_EXT_color_buffer_half_float; - continue; - } -#endif -#ifdef GL_EXT_color_subtable - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_subtable", 14)) - { - ret = GLEW_EXT_color_subtable; - continue; - } -#endif -#ifdef GL_EXT_compiled_vertex_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compiled_vertex_array", 21)) - { - ret = GLEW_EXT_compiled_vertex_array; - continue; - } -#endif -#ifdef GL_EXT_compressed_ETC1_RGB8_sub_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_ETC1_RGB8_sub_texture", 32)) - { - ret = GLEW_EXT_compressed_ETC1_RGB8_sub_texture; - continue; - } -#endif -#ifdef GL_EXT_conservative_depth - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18)) - { - ret = GLEW_EXT_conservative_depth; - continue; - } -#endif -#ifdef GL_EXT_convolution - if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution", 11)) - { - ret = GLEW_EXT_convolution; - continue; - } -#endif -#ifdef GL_EXT_coordinate_frame - if (_glewStrSame3(&pos, &len, (const GLubyte*)"coordinate_frame", 16)) - { - ret = GLEW_EXT_coordinate_frame; - continue; - } -#endif -#ifdef GL_EXT_copy_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) - { - ret = GLEW_EXT_copy_image; - continue; - } -#endif -#ifdef GL_EXT_copy_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_texture", 12)) - { - ret = GLEW_EXT_copy_texture; - continue; - } -#endif -#ifdef GL_EXT_cull_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_vertex", 11)) - { - ret = GLEW_EXT_cull_vertex; - continue; - } -#endif -#ifdef GL_EXT_debug_label - if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_label", 11)) - { - ret = GLEW_EXT_debug_label; - continue; - } -#endif -#ifdef GL_EXT_debug_marker - if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_marker", 12)) - { - ret = GLEW_EXT_debug_marker; - continue; - } -#endif -#ifdef GL_EXT_depth_bounds_test - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_bounds_test", 17)) - { - ret = GLEW_EXT_depth_bounds_test; - continue; - } -#endif -#ifdef GL_EXT_depth_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp", 11)) - { - ret = GLEW_EXT_depth_clamp; - continue; - } -#endif -#ifdef GL_EXT_direct_state_access - if (_glewStrSame3(&pos, &len, (const GLubyte*)"direct_state_access", 19)) - { - ret = GLEW_EXT_direct_state_access; - continue; - } -#endif -#ifdef GL_EXT_discard_framebuffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"discard_framebuffer", 19)) - { - ret = GLEW_EXT_discard_framebuffer; - continue; - } -#endif -#ifdef GL_EXT_disjoint_timer_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"disjoint_timer_query", 20)) - { - ret = GLEW_EXT_disjoint_timer_query; - continue; - } -#endif -#ifdef GL_EXT_draw_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) - { - ret = GLEW_EXT_draw_buffers; - continue; - } -#endif -#ifdef GL_EXT_draw_buffers2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers2", 13)) - { - ret = GLEW_EXT_draw_buffers2; - continue; - } -#endif -#ifdef GL_EXT_draw_buffers_indexed - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_indexed", 20)) - { - ret = GLEW_EXT_draw_buffers_indexed; - continue; - } -#endif -#ifdef GL_EXT_draw_elements_base_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_elements_base_vertex", 25)) - { - ret = GLEW_EXT_draw_elements_base_vertex; - continue; - } -#endif -#ifdef GL_EXT_draw_instanced - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14)) - { - ret = GLEW_EXT_draw_instanced; - continue; - } -#endif -#ifdef GL_EXT_draw_range_elements - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_range_elements", 19)) - { - ret = GLEW_EXT_draw_range_elements; - continue; - } -#endif -#ifdef GL_EXT_draw_transform_feedback - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_transform_feedback", 23)) - { - ret = GLEW_EXT_draw_transform_feedback; - continue; - } -#endif -#ifdef GL_EXT_external_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"external_buffer", 15)) - { - ret = GLEW_EXT_external_buffer; - continue; - } -#endif -#ifdef GL_EXT_float_blend - if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_blend", 11)) - { - ret = GLEW_EXT_float_blend; - continue; - } -#endif -#ifdef GL_EXT_fog_coord - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_coord", 9)) - { - ret = GLEW_EXT_fog_coord; - continue; - } -#endif -#ifdef GL_EXT_frag_depth - if (_glewStrSame3(&pos, &len, (const GLubyte*)"frag_depth", 10)) - { - ret = GLEW_EXT_frag_depth; - continue; - } -#endif -#ifdef GL_EXT_fragment_lighting - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_lighting", 17)) - { - ret = GLEW_EXT_fragment_lighting; - continue; - } -#endif -#ifdef GL_EXT_framebuffer_blit - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16)) - { - ret = GLEW_EXT_framebuffer_blit; - continue; - } -#endif -#ifdef GL_EXT_framebuffer_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) - { - ret = GLEW_EXT_framebuffer_multisample; - continue; - } -#endif -#ifdef GL_EXT_framebuffer_multisample_blit_scaled - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample_blit_scaled", 35)) - { - ret = GLEW_EXT_framebuffer_multisample_blit_scaled; - continue; - } -#endif -#ifdef GL_EXT_framebuffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_object", 18)) - { - ret = GLEW_EXT_framebuffer_object; - continue; - } -#endif -#ifdef GL_EXT_framebuffer_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) - { - ret = GLEW_EXT_framebuffer_sRGB; - continue; - } -#endif -#ifdef GL_EXT_geometry_point_size - if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_point_size", 19)) - { - ret = GLEW_EXT_geometry_point_size; - continue; - } -#endif -#ifdef GL_EXT_geometry_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader", 15)) - { - ret = GLEW_EXT_geometry_shader; - continue; - } -#endif -#ifdef GL_EXT_geometry_shader4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) - { - ret = GLEW_EXT_geometry_shader4; - continue; - } -#endif -#ifdef GL_EXT_gpu_program_parameters - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program_parameters", 22)) - { - ret = GLEW_EXT_gpu_program_parameters; - continue; - } -#endif -#ifdef GL_EXT_gpu_shader4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader4", 11)) - { - ret = GLEW_EXT_gpu_shader4; - continue; - } -#endif -#ifdef GL_EXT_gpu_shader5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11)) - { - ret = GLEW_EXT_gpu_shader5; - continue; - } -#endif -#ifdef GL_EXT_histogram - if (_glewStrSame3(&pos, &len, (const GLubyte*)"histogram", 9)) - { - ret = GLEW_EXT_histogram; - continue; - } -#endif -#ifdef GL_EXT_index_array_formats - if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_array_formats", 19)) - { - ret = GLEW_EXT_index_array_formats; - continue; - } -#endif -#ifdef GL_EXT_index_func - if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_func", 10)) - { - ret = GLEW_EXT_index_func; - continue; - } -#endif -#ifdef GL_EXT_index_material - if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_material", 14)) - { - ret = GLEW_EXT_index_material; - continue; - } -#endif -#ifdef GL_EXT_index_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_texture", 13)) - { - ret = GLEW_EXT_index_texture; - continue; - } -#endif -#ifdef GL_EXT_instanced_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) - { - ret = GLEW_EXT_instanced_arrays; - continue; - } -#endif -#ifdef GL_EXT_light_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"light_texture", 13)) - { - ret = GLEW_EXT_light_texture; - continue; - } -#endif -#ifdef GL_EXT_map_buffer_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_buffer_range", 16)) - { - ret = GLEW_EXT_map_buffer_range; - continue; - } -#endif -#ifdef GL_EXT_memory_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"memory_object", 13)) - { - ret = GLEW_EXT_memory_object; - continue; - } -#endif -#ifdef GL_EXT_memory_object_fd - if (_glewStrSame3(&pos, &len, (const GLubyte*)"memory_object_fd", 16)) - { - ret = GLEW_EXT_memory_object_fd; - continue; - } -#endif -#ifdef GL_EXT_memory_object_win32 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"memory_object_win32", 19)) - { - ret = GLEW_EXT_memory_object_win32; - continue; - } -#endif -#ifdef GL_EXT_misc_attribute - if (_glewStrSame3(&pos, &len, (const GLubyte*)"misc_attribute", 14)) - { - ret = GLEW_EXT_misc_attribute; - continue; - } -#endif -#ifdef GL_EXT_multi_draw_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_arrays", 17)) - { - ret = GLEW_EXT_multi_draw_arrays; - continue; - } -#endif -#ifdef GL_EXT_multi_draw_indirect - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) - { - ret = GLEW_EXT_multi_draw_indirect; - continue; - } -#endif -#ifdef GL_EXT_multiple_textures - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiple_textures", 17)) - { - ret = GLEW_EXT_multiple_textures; - continue; - } -#endif -#ifdef GL_EXT_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLEW_EXT_multisample; - continue; - } -#endif -#ifdef GL_EXT_multisample_compatibility - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_compatibility", 25)) - { - ret = GLEW_EXT_multisample_compatibility; - continue; - } -#endif -#ifdef GL_EXT_multisampled_render_to_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisampled_render_to_texture", 30)) - { - ret = GLEW_EXT_multisampled_render_to_texture; - continue; - } -#endif -#ifdef GL_EXT_multisampled_render_to_texture2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisampled_render_to_texture2", 31)) - { - ret = GLEW_EXT_multisampled_render_to_texture2; - continue; - } -#endif -#ifdef GL_EXT_multiview_draw_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview_draw_buffers", 22)) - { - ret = GLEW_EXT_multiview_draw_buffers; - continue; - } -#endif -#ifdef GL_EXT_multiview_tessellation_geometry_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview_tessellation_geometry_shader", 38)) - { - ret = GLEW_EXT_multiview_tessellation_geometry_shader; - continue; - } -#endif -#ifdef GL_EXT_multiview_texture_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview_texture_multisample", 29)) - { - ret = GLEW_EXT_multiview_texture_multisample; - continue; - } -#endif -#ifdef GL_EXT_multiview_timer_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview_timer_query", 21)) - { - ret = GLEW_EXT_multiview_timer_query; - continue; - } -#endif -#ifdef GL_EXT_occlusion_query_boolean - if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query_boolean", 23)) - { - ret = GLEW_EXT_occlusion_query_boolean; - continue; - } -#endif -#ifdef GL_EXT_packed_depth_stencil - if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_depth_stencil", 20)) - { - ret = GLEW_EXT_packed_depth_stencil; - continue; - } -#endif -#ifdef GL_EXT_packed_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_float", 12)) - { - ret = GLEW_EXT_packed_float; - continue; - } -#endif -#ifdef GL_EXT_packed_pixels - if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_pixels", 13)) - { - ret = GLEW_EXT_packed_pixels; - continue; - } -#endif -#ifdef GL_EXT_paletted_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"paletted_texture", 16)) - { - ret = GLEW_EXT_paletted_texture; - continue; - } -#endif -#ifdef GL_EXT_pixel_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) - { - ret = GLEW_EXT_pixel_buffer_object; - continue; - } -#endif -#ifdef GL_EXT_pixel_transform - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_transform", 15)) - { - ret = GLEW_EXT_pixel_transform; - continue; - } -#endif -#ifdef GL_EXT_pixel_transform_color_table - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_transform_color_table", 27)) - { - ret = GLEW_EXT_pixel_transform_color_table; - continue; - } -#endif -#ifdef GL_EXT_point_parameters - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_parameters", 16)) - { - ret = GLEW_EXT_point_parameters; - continue; - } -#endif -#ifdef GL_EXT_polygon_offset - if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_offset", 14)) - { - ret = GLEW_EXT_polygon_offset; - continue; - } -#endif -#ifdef GL_EXT_polygon_offset_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_offset_clamp", 20)) - { - ret = GLEW_EXT_polygon_offset_clamp; - continue; - } -#endif -#ifdef GL_EXT_post_depth_coverage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_depth_coverage", 19)) - { - ret = GLEW_EXT_post_depth_coverage; - continue; - } -#endif -#ifdef GL_EXT_primitive_bounding_box - if (_glewStrSame3(&pos, &len, (const GLubyte*)"primitive_bounding_box", 22)) - { - ret = GLEW_EXT_primitive_bounding_box; - continue; - } -#endif -#ifdef GL_EXT_protected_textures - if (_glewStrSame3(&pos, &len, (const GLubyte*)"protected_textures", 18)) - { - ret = GLEW_EXT_protected_textures; - continue; - } -#endif -#ifdef GL_EXT_provoking_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"provoking_vertex", 16)) - { - ret = GLEW_EXT_provoking_vertex; - continue; - } -#endif -#ifdef GL_EXT_pvrtc_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pvrtc_sRGB", 10)) - { - ret = GLEW_EXT_pvrtc_sRGB; - continue; - } -#endif -#ifdef GL_EXT_raster_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"raster_multisample", 18)) - { - ret = GLEW_EXT_raster_multisample; - continue; - } -#endif -#ifdef GL_EXT_read_format_bgra - if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_format_bgra", 16)) - { - ret = GLEW_EXT_read_format_bgra; - continue; - } -#endif -#ifdef GL_EXT_render_snorm - if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_snorm", 12)) - { - ret = GLEW_EXT_render_snorm; - continue; - } -#endif -#ifdef GL_EXT_rescale_normal - if (_glewStrSame3(&pos, &len, (const GLubyte*)"rescale_normal", 14)) - { - ret = GLEW_EXT_rescale_normal; - continue; - } -#endif -#ifdef GL_EXT_robustness - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness", 10)) - { - ret = GLEW_EXT_robustness; - continue; - } -#endif -#ifdef GL_EXT_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sRGB", 4)) - { - ret = GLEW_EXT_sRGB; - continue; - } -#endif -#ifdef GL_EXT_sRGB_write_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sRGB_write_control", 18)) - { - ret = GLEW_EXT_sRGB_write_control; - continue; - } -#endif -#ifdef GL_EXT_scene_marker - if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_marker", 12)) - { - ret = GLEW_EXT_scene_marker; - continue; - } -#endif -#ifdef GL_EXT_secondary_color - if (_glewStrSame3(&pos, &len, (const GLubyte*)"secondary_color", 15)) - { - ret = GLEW_EXT_secondary_color; - continue; - } -#endif -#ifdef GL_EXT_semaphore - if (_glewStrSame3(&pos, &len, (const GLubyte*)"semaphore", 9)) - { - ret = GLEW_EXT_semaphore; - continue; - } -#endif -#ifdef GL_EXT_semaphore_fd - if (_glewStrSame3(&pos, &len, (const GLubyte*)"semaphore_fd", 12)) - { - ret = GLEW_EXT_semaphore_fd; - continue; - } -#endif -#ifdef GL_EXT_semaphore_win32 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"semaphore_win32", 15)) - { - ret = GLEW_EXT_semaphore_win32; - continue; - } -#endif -#ifdef GL_EXT_separate_shader_objects - if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_shader_objects", 23)) - { - ret = GLEW_EXT_separate_shader_objects; - continue; - } -#endif -#ifdef GL_EXT_separate_specular_color - if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_specular_color", 23)) - { - ret = GLEW_EXT_separate_specular_color; - continue; - } -#endif -#ifdef GL_EXT_shader_framebuffer_fetch - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_framebuffer_fetch", 24)) - { - ret = GLEW_EXT_shader_framebuffer_fetch; - continue; - } -#endif -#ifdef GL_EXT_shader_framebuffer_fetch_non_coherent - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_framebuffer_fetch_non_coherent", 37)) - { - ret = GLEW_EXT_shader_framebuffer_fetch_non_coherent; - continue; - } -#endif -#ifdef GL_EXT_shader_group_vote - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_group_vote", 17)) - { - ret = GLEW_EXT_shader_group_vote; - continue; - } -#endif -#ifdef GL_EXT_shader_image_load_formatted - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_formatted", 27)) - { - ret = GLEW_EXT_shader_image_load_formatted; - continue; - } -#endif -#ifdef GL_EXT_shader_image_load_store - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_store", 23)) - { - ret = GLEW_EXT_shader_image_load_store; - continue; - } -#endif -#ifdef GL_EXT_shader_implicit_conversions - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_implicit_conversions", 27)) - { - ret = GLEW_EXT_shader_implicit_conversions; - continue; - } -#endif -#ifdef GL_EXT_shader_integer_mix - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_integer_mix", 18)) - { - ret = GLEW_EXT_shader_integer_mix; - continue; - } -#endif -#ifdef GL_EXT_shader_io_blocks - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_io_blocks", 16)) - { - ret = GLEW_EXT_shader_io_blocks; - continue; - } -#endif -#ifdef GL_EXT_shader_non_constant_global_initializers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_non_constant_global_initializers", 39)) - { - ret = GLEW_EXT_shader_non_constant_global_initializers; - continue; - } -#endif -#ifdef GL_EXT_shader_pixel_local_storage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_pixel_local_storage", 26)) - { - ret = GLEW_EXT_shader_pixel_local_storage; - continue; - } -#endif -#ifdef GL_EXT_shader_pixel_local_storage2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_pixel_local_storage2", 27)) - { - ret = GLEW_EXT_shader_pixel_local_storage2; - continue; - } -#endif -#ifdef GL_EXT_shader_texture_lod - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18)) - { - ret = GLEW_EXT_shader_texture_lod; - continue; - } -#endif -#ifdef GL_EXT_shadow_funcs - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_funcs", 12)) - { - ret = GLEW_EXT_shadow_funcs; - continue; - } -#endif -#ifdef GL_EXT_shadow_samplers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_samplers", 15)) - { - ret = GLEW_EXT_shadow_samplers; - continue; - } -#endif -#ifdef GL_EXT_shared_texture_palette - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_texture_palette", 22)) - { - ret = GLEW_EXT_shared_texture_palette; - continue; - } -#endif -#ifdef GL_EXT_sparse_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14)) - { - ret = GLEW_EXT_sparse_texture; - continue; - } -#endif -#ifdef GL_EXT_sparse_texture2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture2", 15)) - { - ret = GLEW_EXT_sparse_texture2; - continue; - } -#endif -#ifdef GL_EXT_static_vertex_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"static_vertex_array", 19)) - { - ret = GLEW_EXT_static_vertex_array; - continue; - } -#endif -#ifdef GL_EXT_stencil_clear_tag - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_clear_tag", 17)) - { - ret = GLEW_EXT_stencil_clear_tag; - continue; - } -#endif -#ifdef GL_EXT_stencil_two_side - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_two_side", 16)) - { - ret = GLEW_EXT_stencil_two_side; - continue; - } -#endif -#ifdef GL_EXT_stencil_wrap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_wrap", 12)) - { - ret = GLEW_EXT_stencil_wrap; - continue; - } -#endif -#ifdef GL_EXT_subtexture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"subtexture", 10)) - { - ret = GLEW_EXT_subtexture; - continue; - } -#endif -#ifdef GL_EXT_tessellation_point_size - if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_point_size", 23)) - { - ret = GLEW_EXT_tessellation_point_size; - continue; - } -#endif -#ifdef GL_EXT_tessellation_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_shader", 19)) - { - ret = GLEW_EXT_tessellation_shader; - continue; - } -#endif -#ifdef GL_EXT_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture", 7)) - { - ret = GLEW_EXT_texture; - continue; - } -#endif -#ifdef GL_EXT_texture3D - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture3D", 9)) - { - ret = GLEW_EXT_texture3D; - continue; - } -#endif -#ifdef GL_EXT_texture_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_array", 13)) - { - ret = GLEW_EXT_texture_array; - continue; - } -#endif -#ifdef GL_EXT_texture_border_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) - { - ret = GLEW_EXT_texture_border_clamp; - continue; - } -#endif -#ifdef GL_EXT_texture_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer", 14)) - { - ret = GLEW_EXT_texture_buffer; - continue; - } -#endif -#ifdef GL_EXT_texture_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object", 21)) - { - ret = GLEW_EXT_texture_buffer_object; - continue; - } -#endif -#ifdef GL_EXT_texture_compression_astc_decode_mode - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_decode_mode", 36)) - { - ret = GLEW_EXT_texture_compression_astc_decode_mode; - continue; - } -#endif -#ifdef GL_EXT_texture_compression_astc_decode_mode_rgb9e5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_decode_mode_rgb9e5", 43)) - { - ret = GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5; - continue; - } -#endif -#ifdef GL_EXT_texture_compression_bptc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_bptc", 24)) - { - ret = GLEW_EXT_texture_compression_bptc; - continue; - } -#endif -#ifdef GL_EXT_texture_compression_dxt1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt1", 24)) - { - ret = GLEW_EXT_texture_compression_dxt1; - continue; - } -#endif -#ifdef GL_EXT_texture_compression_latc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_latc", 24)) - { - ret = GLEW_EXT_texture_compression_latc; - continue; - } -#endif -#ifdef GL_EXT_texture_compression_rgtc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_rgtc", 24)) - { - ret = GLEW_EXT_texture_compression_rgtc; - continue; - } -#endif -#ifdef GL_EXT_texture_compression_s3tc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_s3tc", 24)) - { - ret = GLEW_EXT_texture_compression_s3tc; - continue; - } -#endif -#ifdef GL_EXT_texture_compression_s3tc_srgb - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_s3tc_srgb", 29)) - { - ret = GLEW_EXT_texture_compression_s3tc_srgb; - continue; - } -#endif -#ifdef GL_EXT_texture_cube_map - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map", 16)) - { - ret = GLEW_EXT_texture_cube_map; - continue; - } -#endif -#ifdef GL_EXT_texture_cube_map_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map_array", 22)) - { - ret = GLEW_EXT_texture_cube_map_array; - continue; - } -#endif -#ifdef GL_EXT_texture_edge_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_edge_clamp", 18)) - { - ret = GLEW_EXT_texture_edge_clamp; - continue; - } -#endif -#ifdef GL_EXT_texture_env - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env", 11)) - { - ret = GLEW_EXT_texture_env; - continue; - } -#endif -#ifdef GL_EXT_texture_env_add - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_add", 15)) - { - ret = GLEW_EXT_texture_env_add; - continue; - } -#endif -#ifdef GL_EXT_texture_env_combine - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine", 19)) - { - ret = GLEW_EXT_texture_env_combine; - continue; - } -#endif -#ifdef GL_EXT_texture_env_dot3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_dot3", 16)) - { - ret = GLEW_EXT_texture_env_dot3; - continue; - } -#endif -#ifdef GL_EXT_texture_filter_anisotropic - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_anisotropic", 26)) - { - ret = GLEW_EXT_texture_filter_anisotropic; - continue; - } -#endif -#ifdef GL_EXT_texture_filter_minmax - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_minmax", 21)) - { - ret = GLEW_EXT_texture_filter_minmax; - continue; - } -#endif -#ifdef GL_EXT_texture_format_BGRA8888 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_format_BGRA8888", 23)) - { - ret = GLEW_EXT_texture_format_BGRA8888; - continue; - } -#endif -#ifdef GL_EXT_texture_format_sRGB_override - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_format_sRGB_override", 28)) - { - ret = GLEW_EXT_texture_format_sRGB_override; - continue; - } -#endif -#ifdef GL_EXT_texture_integer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_integer", 15)) - { - ret = GLEW_EXT_texture_integer; - continue; - } -#endif -#ifdef GL_EXT_texture_lod_bias - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod_bias", 16)) - { - ret = GLEW_EXT_texture_lod_bias; - continue; - } -#endif -#ifdef GL_EXT_texture_mirror_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_clamp", 20)) - { - ret = GLEW_EXT_texture_mirror_clamp; - continue; - } -#endif -#ifdef GL_EXT_texture_mirror_clamp_to_edge - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_clamp_to_edge", 28)) - { - ret = GLEW_EXT_texture_mirror_clamp_to_edge; - continue; - } -#endif -#ifdef GL_EXT_texture_norm16 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_norm16", 14)) - { - ret = GLEW_EXT_texture_norm16; - continue; - } -#endif -#ifdef GL_EXT_texture_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_object", 14)) - { - ret = GLEW_EXT_texture_object; - continue; - } -#endif -#ifdef GL_EXT_texture_perturb_normal - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_perturb_normal", 22)) - { - ret = GLEW_EXT_texture_perturb_normal; - continue; - } -#endif -#ifdef GL_EXT_texture_query_lod - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_query_lod", 17)) - { - ret = GLEW_EXT_texture_query_lod; - continue; - } -#endif -#ifdef GL_EXT_texture_rectangle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) - { - ret = GLEW_EXT_texture_rectangle; - continue; - } -#endif -#ifdef GL_EXT_texture_rg - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rg", 10)) - { - ret = GLEW_EXT_texture_rg; - continue; - } -#endif -#ifdef GL_EXT_texture_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB", 12)) - { - ret = GLEW_EXT_texture_sRGB; - continue; - } -#endif -#ifdef GL_EXT_texture_sRGB_R8 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB_R8", 15)) - { - ret = GLEW_EXT_texture_sRGB_R8; - continue; - } -#endif -#ifdef GL_EXT_texture_sRGB_RG8 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB_RG8", 16)) - { - ret = GLEW_EXT_texture_sRGB_RG8; - continue; - } -#endif -#ifdef GL_EXT_texture_sRGB_decode - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB_decode", 19)) - { - ret = GLEW_EXT_texture_sRGB_decode; - continue; - } -#endif -#ifdef GL_EXT_texture_shadow_lod - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shadow_lod", 18)) - { - ret = GLEW_EXT_texture_shadow_lod; - continue; - } -#endif -#ifdef GL_EXT_texture_shared_exponent - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shared_exponent", 23)) - { - ret = GLEW_EXT_texture_shared_exponent; - continue; - } -#endif -#ifdef GL_EXT_texture_snorm - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_snorm", 13)) - { - ret = GLEW_EXT_texture_snorm; - continue; - } -#endif -#ifdef GL_EXT_texture_storage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage", 15)) - { - ret = GLEW_EXT_texture_storage; - continue; - } -#endif -#ifdef GL_EXT_texture_swizzle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_swizzle", 15)) - { - ret = GLEW_EXT_texture_swizzle; - continue; - } -#endif -#ifdef GL_EXT_texture_type_2_10_10_10_REV - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_type_2_10_10_10_REV", 27)) - { - ret = GLEW_EXT_texture_type_2_10_10_10_REV; - continue; - } -#endif -#ifdef GL_EXT_texture_view - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_view", 12)) - { - ret = GLEW_EXT_texture_view; - continue; - } -#endif -#ifdef GL_EXT_timer_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) - { - ret = GLEW_EXT_timer_query; - continue; - } -#endif -#ifdef GL_EXT_transform_feedback - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback", 18)) - { - ret = GLEW_EXT_transform_feedback; - continue; - } -#endif -#ifdef GL_EXT_unpack_subimage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"unpack_subimage", 15)) - { - ret = GLEW_EXT_unpack_subimage; - continue; - } -#endif -#ifdef GL_EXT_vertex_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array", 12)) - { - ret = GLEW_EXT_vertex_array; - continue; - } -#endif -#ifdef GL_EXT_vertex_array_bgra - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_bgra", 17)) - { - ret = GLEW_EXT_vertex_array_bgra; - continue; - } -#endif -#ifdef GL_EXT_vertex_array_setXXX - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_setXXX", 19)) - { - ret = GLEW_EXT_vertex_array_setXXX; - continue; - } -#endif -#ifdef GL_EXT_vertex_attrib_64bit - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_64bit", 19)) - { - ret = GLEW_EXT_vertex_attrib_64bit; - continue; - } -#endif -#ifdef GL_EXT_vertex_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader", 13)) - { - ret = GLEW_EXT_vertex_shader; - continue; - } -#endif -#ifdef GL_EXT_vertex_weighting - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_weighting", 16)) - { - ret = GLEW_EXT_vertex_weighting; - continue; - } -#endif -#ifdef GL_EXT_win32_keyed_mutex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"win32_keyed_mutex", 17)) - { - ret = GLEW_EXT_win32_keyed_mutex; - continue; - } -#endif -#ifdef GL_EXT_window_rectangles - if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_rectangles", 17)) - { - ret = GLEW_EXT_window_rectangles; - continue; - } -#endif -#ifdef GL_EXT_x11_sync_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"x11_sync_object", 15)) - { - ret = GLEW_EXT_x11_sync_object; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"FJ_", 3)) - { -#ifdef GL_FJ_shader_binary_GCCSO - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_binary_GCCSO", 19)) - { - ret = GLEW_FJ_shader_binary_GCCSO; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"GREMEDY_", 8)) - { -#ifdef GL_GREMEDY_frame_terminator - if (_glewStrSame3(&pos, &len, (const GLubyte*)"frame_terminator", 16)) - { - ret = GLEW_GREMEDY_frame_terminator; - continue; - } -#endif -#ifdef GL_GREMEDY_string_marker - if (_glewStrSame3(&pos, &len, (const GLubyte*)"string_marker", 13)) - { - ret = GLEW_GREMEDY_string_marker; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"HP_", 3)) - { -#ifdef GL_HP_convolution_border_modes - if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_border_modes", 24)) - { - ret = GLEW_HP_convolution_border_modes; - continue; - } -#endif -#ifdef GL_HP_image_transform - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_transform", 15)) - { - ret = GLEW_HP_image_transform; - continue; - } -#endif -#ifdef GL_HP_occlusion_test - if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_test", 14)) - { - ret = GLEW_HP_occlusion_test; - continue; - } -#endif -#ifdef GL_HP_texture_lighting - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lighting", 16)) - { - ret = GLEW_HP_texture_lighting; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"IBM_", 4)) - { -#ifdef GL_IBM_cull_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_vertex", 11)) - { - ret = GLEW_IBM_cull_vertex; - continue; - } -#endif -#ifdef GL_IBM_multimode_draw_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multimode_draw_arrays", 21)) - { - ret = GLEW_IBM_multimode_draw_arrays; - continue; - } -#endif -#ifdef GL_IBM_rasterpos_clip - if (_glewStrSame3(&pos, &len, (const GLubyte*)"rasterpos_clip", 14)) - { - ret = GLEW_IBM_rasterpos_clip; - continue; - } -#endif -#ifdef GL_IBM_static_data - if (_glewStrSame3(&pos, &len, (const GLubyte*)"static_data", 11)) - { - ret = GLEW_IBM_static_data; - continue; - } -#endif -#ifdef GL_IBM_texture_mirrored_repeat - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23)) - { - ret = GLEW_IBM_texture_mirrored_repeat; - continue; - } -#endif -#ifdef GL_IBM_vertex_array_lists - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_lists", 18)) - { - ret = GLEW_IBM_vertex_array_lists; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"IMG_", 4)) - { -#ifdef GL_IMG_bindless_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_texture", 16)) - { - ret = GLEW_IMG_bindless_texture; - continue; - } -#endif -#ifdef GL_IMG_framebuffer_downsample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_downsample", 22)) - { - ret = GLEW_IMG_framebuffer_downsample; - continue; - } -#endif -#ifdef GL_IMG_multisampled_render_to_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisampled_render_to_texture", 30)) - { - ret = GLEW_IMG_multisampled_render_to_texture; - continue; - } -#endif -#ifdef GL_IMG_program_binary - if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_binary", 14)) - { - ret = GLEW_IMG_program_binary; - continue; - } -#endif -#ifdef GL_IMG_read_format - if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_format", 11)) - { - ret = GLEW_IMG_read_format; - continue; - } -#endif -#ifdef GL_IMG_shader_binary - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_binary", 13)) - { - ret = GLEW_IMG_shader_binary; - continue; - } -#endif -#ifdef GL_IMG_texture_compression_pvrtc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_pvrtc", 25)) - { - ret = GLEW_IMG_texture_compression_pvrtc; - continue; - } -#endif -#ifdef GL_IMG_texture_compression_pvrtc2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_pvrtc2", 26)) - { - ret = GLEW_IMG_texture_compression_pvrtc2; - continue; - } -#endif -#ifdef GL_IMG_texture_env_enhanced_fixed_function - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_enhanced_fixed_function", 35)) - { - ret = GLEW_IMG_texture_env_enhanced_fixed_function; - continue; - } -#endif -#ifdef GL_IMG_texture_filter_cubic - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_cubic", 20)) - { - ret = GLEW_IMG_texture_filter_cubic; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"INGR_", 5)) - { -#ifdef GL_INGR_color_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_clamp", 11)) - { - ret = GLEW_INGR_color_clamp; - continue; - } -#endif -#ifdef GL_INGR_interlace_read - if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace_read", 14)) - { - ret = GLEW_INGR_interlace_read; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"INTEL_", 6)) - { -#ifdef GL_INTEL_blackhole_render - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blackhole_render", 16)) - { - ret = GLEW_INTEL_blackhole_render; - continue; - } -#endif -#ifdef GL_INTEL_conservative_rasterization - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_rasterization", 26)) - { - ret = GLEW_INTEL_conservative_rasterization; - continue; - } -#endif -#ifdef GL_INTEL_fragment_shader_ordering - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_ordering", 24)) - { - ret = GLEW_INTEL_fragment_shader_ordering; - continue; - } -#endif -#ifdef GL_INTEL_framebuffer_CMAA - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_CMAA", 16)) - { - ret = GLEW_INTEL_framebuffer_CMAA; - continue; - } -#endif -#ifdef GL_INTEL_map_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_texture", 11)) - { - ret = GLEW_INTEL_map_texture; - continue; - } -#endif -#ifdef GL_INTEL_parallel_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_arrays", 15)) - { - ret = GLEW_INTEL_parallel_arrays; - continue; - } -#endif -#ifdef GL_INTEL_performance_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"performance_query", 17)) - { - ret = GLEW_INTEL_performance_query; - continue; - } -#endif -#ifdef GL_INTEL_shader_integer_functions2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_integer_functions2", 25)) - { - ret = GLEW_INTEL_shader_integer_functions2; - continue; - } -#endif -#ifdef GL_INTEL_texture_scissor - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_scissor", 15)) - { - ret = GLEW_INTEL_texture_scissor; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"KHR_", 4)) - { -#ifdef GL_KHR_blend_equation_advanced - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced", 23)) - { - ret = GLEW_KHR_blend_equation_advanced; - continue; - } -#endif -#ifdef GL_KHR_blend_equation_advanced_coherent - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced_coherent", 32)) - { - ret = GLEW_KHR_blend_equation_advanced_coherent; - continue; - } -#endif -#ifdef GL_KHR_context_flush_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) - { - ret = GLEW_KHR_context_flush_control; - continue; - } -#endif -#ifdef GL_KHR_debug - if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug", 5)) - { - ret = GLEW_KHR_debug; - continue; - } -#endif -#ifdef GL_KHR_no_error - if (_glewStrSame3(&pos, &len, (const GLubyte*)"no_error", 8)) - { - ret = GLEW_KHR_no_error; - continue; - } -#endif -#ifdef GL_KHR_parallel_shader_compile - if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_shader_compile", 23)) - { - ret = GLEW_KHR_parallel_shader_compile; - continue; - } -#endif -#ifdef GL_KHR_robust_buffer_access_behavior - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robust_buffer_access_behavior", 29)) - { - ret = GLEW_KHR_robust_buffer_access_behavior; - continue; - } -#endif -#ifdef GL_KHR_robustness - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness", 10)) - { - ret = GLEW_KHR_robustness; - continue; - } -#endif -#ifdef GL_KHR_shader_subgroup - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_subgroup", 15)) - { - ret = GLEW_KHR_shader_subgroup; - continue; - } -#endif -#ifdef GL_KHR_texture_compression_astc_hdr - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_hdr", 28)) - { - ret = GLEW_KHR_texture_compression_astc_hdr; - continue; - } -#endif -#ifdef GL_KHR_texture_compression_astc_ldr - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_ldr", 28)) - { - ret = GLEW_KHR_texture_compression_astc_ldr; - continue; - } -#endif -#ifdef GL_KHR_texture_compression_astc_sliced_3d - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_sliced_3d", 34)) - { - ret = GLEW_KHR_texture_compression_astc_sliced_3d; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"KTX_", 4)) - { -#ifdef GL_KTX_buffer_region - if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_region", 13)) - { - ret = GLEW_KTX_buffer_region; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESAX_", 6)) - { -#ifdef GL_MESAX_texture_stack - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_stack", 13)) - { - ret = GLEW_MESAX_texture_stack; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) - { -#ifdef GL_MESA_framebuffer_flip_y - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_flip_y", 18)) - { - ret = GLEW_MESA_framebuffer_flip_y; - continue; - } -#endif -#ifdef GL_MESA_pack_invert - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_invert", 11)) - { - ret = GLEW_MESA_pack_invert; - continue; - } -#endif -#ifdef GL_MESA_program_binary_formats - if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_binary_formats", 22)) - { - ret = GLEW_MESA_program_binary_formats; - continue; - } -#endif -#ifdef GL_MESA_resize_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"resize_buffers", 14)) - { - ret = GLEW_MESA_resize_buffers; - continue; - } -#endif -#ifdef GL_MESA_shader_integer_functions - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_integer_functions", 24)) - { - ret = GLEW_MESA_shader_integer_functions; - continue; - } -#endif -#ifdef GL_MESA_tile_raster_order - if (_glewStrSame3(&pos, &len, (const GLubyte*)"tile_raster_order", 17)) - { - ret = GLEW_MESA_tile_raster_order; - continue; - } -#endif -#ifdef GL_MESA_window_pos - if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_pos", 10)) - { - ret = GLEW_MESA_window_pos; - continue; - } -#endif -#ifdef GL_MESA_ycbcr_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycbcr_texture", 13)) - { - ret = GLEW_MESA_ycbcr_texture; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"NVX_", 4)) - { -#ifdef GL_NVX_blend_equation_advanced_multi_draw_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced_multi_draw_buffers", 42)) - { - ret = GLEW_NVX_blend_equation_advanced_multi_draw_buffers; - continue; - } -#endif -#ifdef GL_NVX_conditional_render - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render", 18)) - { - ret = GLEW_NVX_conditional_render; - continue; - } -#endif -#ifdef GL_NVX_gpu_memory_info - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_memory_info", 15)) - { - ret = GLEW_NVX_gpu_memory_info; - continue; - } -#endif -#ifdef GL_NVX_gpu_multicast2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_multicast2", 14)) - { - ret = GLEW_NVX_gpu_multicast2; - continue; - } -#endif -#ifdef GL_NVX_linked_gpu_multicast - if (_glewStrSame3(&pos, &len, (const GLubyte*)"linked_gpu_multicast", 20)) - { - ret = GLEW_NVX_linked_gpu_multicast; - continue; - } -#endif -#ifdef GL_NVX_progress_fence - if (_glewStrSame3(&pos, &len, (const GLubyte*)"progress_fence", 14)) - { - ret = GLEW_NVX_progress_fence; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) - { -#ifdef GL_NV_3dvision_settings - if (_glewStrSame3(&pos, &len, (const GLubyte*)"3dvision_settings", 17)) - { - ret = GLEW_NV_3dvision_settings; - continue; - } -#endif -#ifdef GL_NV_EGL_stream_consumer_external - if (_glewStrSame3(&pos, &len, (const GLubyte*)"EGL_stream_consumer_external", 28)) - { - ret = GLEW_NV_EGL_stream_consumer_external; - continue; - } -#endif -#ifdef GL_NV_alpha_to_coverage_dither_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"alpha_to_coverage_dither_control", 32)) - { - ret = GLEW_NV_alpha_to_coverage_dither_control; - continue; - } -#endif -#ifdef GL_NV_bgr - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bgr", 3)) - { - ret = GLEW_NV_bgr; - continue; - } -#endif -#ifdef GL_NV_bindless_multi_draw_indirect - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_multi_draw_indirect", 28)) - { - ret = GLEW_NV_bindless_multi_draw_indirect; - continue; - } -#endif -#ifdef GL_NV_bindless_multi_draw_indirect_count - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_multi_draw_indirect_count", 34)) - { - ret = GLEW_NV_bindless_multi_draw_indirect_count; - continue; - } -#endif -#ifdef GL_NV_bindless_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_texture", 16)) - { - ret = GLEW_NV_bindless_texture; - continue; - } -#endif -#ifdef GL_NV_blend_equation_advanced - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced", 23)) - { - ret = GLEW_NV_blend_equation_advanced; - continue; - } -#endif -#ifdef GL_NV_blend_equation_advanced_coherent - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced_coherent", 32)) - { - ret = GLEW_NV_blend_equation_advanced_coherent; - continue; - } -#endif -#ifdef GL_NV_blend_minmax_factor - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax_factor", 19)) - { - ret = GLEW_NV_blend_minmax_factor; - continue; - } -#endif -#ifdef GL_NV_blend_square - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_square", 12)) - { - ret = GLEW_NV_blend_square; - continue; - } -#endif -#ifdef GL_NV_clip_space_w_scaling - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_space_w_scaling", 20)) - { - ret = GLEW_NV_clip_space_w_scaling; - continue; - } -#endif -#ifdef GL_NV_command_list - if (_glewStrSame3(&pos, &len, (const GLubyte*)"command_list", 12)) - { - ret = GLEW_NV_command_list; - continue; - } -#endif -#ifdef GL_NV_compute_program5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_program5", 16)) - { - ret = GLEW_NV_compute_program5; - continue; - } -#endif -#ifdef GL_NV_compute_shader_derivatives - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_shader_derivatives", 26)) - { - ret = GLEW_NV_compute_shader_derivatives; - continue; - } -#endif -#ifdef GL_NV_conditional_render - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render", 18)) - { - ret = GLEW_NV_conditional_render; - continue; - } -#endif -#ifdef GL_NV_conservative_raster - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_raster", 19)) - { - ret = GLEW_NV_conservative_raster; - continue; - } -#endif -#ifdef GL_NV_conservative_raster_dilate - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_raster_dilate", 26)) - { - ret = GLEW_NV_conservative_raster_dilate; - continue; - } -#endif -#ifdef GL_NV_conservative_raster_pre_snap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_raster_pre_snap", 28)) - { - ret = GLEW_NV_conservative_raster_pre_snap; - continue; - } -#endif -#ifdef GL_NV_conservative_raster_pre_snap_triangles - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_raster_pre_snap_triangles", 38)) - { - ret = GLEW_NV_conservative_raster_pre_snap_triangles; - continue; - } -#endif -#ifdef GL_NV_conservative_raster_underestimation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_raster_underestimation", 35)) - { - ret = GLEW_NV_conservative_raster_underestimation; - continue; - } -#endif -#ifdef GL_NV_copy_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_buffer", 11)) - { - ret = GLEW_NV_copy_buffer; - continue; - } -#endif -#ifdef GL_NV_copy_depth_to_color - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_depth_to_color", 19)) - { - ret = GLEW_NV_copy_depth_to_color; - continue; - } -#endif -#ifdef GL_NV_copy_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) - { - ret = GLEW_NV_copy_image; - continue; - } -#endif -#ifdef GL_NV_deep_texture3D - if (_glewStrSame3(&pos, &len, (const GLubyte*)"deep_texture3D", 14)) - { - ret = GLEW_NV_deep_texture3D; - continue; - } -#endif -#ifdef GL_NV_depth_buffer_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_buffer_float", 18)) - { - ret = GLEW_NV_depth_buffer_float; - continue; - } -#endif -#ifdef GL_NV_depth_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp", 11)) - { - ret = GLEW_NV_depth_clamp; - continue; - } -#endif -#ifdef GL_NV_depth_nonlinear - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_nonlinear", 15)) - { - ret = GLEW_NV_depth_nonlinear; - continue; - } -#endif -#ifdef GL_NV_depth_range_unclamped - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_range_unclamped", 21)) - { - ret = GLEW_NV_depth_range_unclamped; - continue; - } -#endif -#ifdef GL_NV_draw_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) - { - ret = GLEW_NV_draw_buffers; - continue; - } -#endif -#ifdef GL_NV_draw_instanced - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14)) - { - ret = GLEW_NV_draw_instanced; - continue; - } -#endif -#ifdef GL_NV_draw_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_texture", 12)) - { - ret = GLEW_NV_draw_texture; - continue; - } -#endif -#ifdef GL_NV_draw_vulkan_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_vulkan_image", 17)) - { - ret = GLEW_NV_draw_vulkan_image; - continue; - } -#endif -#ifdef GL_NV_evaluators - if (_glewStrSame3(&pos, &len, (const GLubyte*)"evaluators", 10)) - { - ret = GLEW_NV_evaluators; - continue; - } -#endif -#ifdef GL_NV_explicit_attrib_location - if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_attrib_location", 24)) - { - ret = GLEW_NV_explicit_attrib_location; - continue; - } -#endif -#ifdef GL_NV_explicit_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_multisample", 20)) - { - ret = GLEW_NV_explicit_multisample; - continue; - } -#endif -#ifdef GL_NV_fbo_color_attachments - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbo_color_attachments", 21)) - { - ret = GLEW_NV_fbo_color_attachments; - continue; - } -#endif -#ifdef GL_NV_fence - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence", 5)) - { - ret = GLEW_NV_fence; - continue; - } -#endif -#ifdef GL_NV_fill_rectangle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fill_rectangle", 14)) - { - ret = GLEW_NV_fill_rectangle; - continue; - } -#endif -#ifdef GL_NV_float_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) - { - ret = GLEW_NV_float_buffer; - continue; - } -#endif -#ifdef GL_NV_fog_distance - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_distance", 12)) - { - ret = GLEW_NV_fog_distance; - continue; - } -#endif -#ifdef GL_NV_fragment_coverage_to_color - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_coverage_to_color", 26)) - { - ret = GLEW_NV_fragment_coverage_to_color; - continue; - } -#endif -#ifdef GL_NV_fragment_program - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program", 16)) - { - ret = GLEW_NV_fragment_program; - continue; - } -#endif -#ifdef GL_NV_fragment_program2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program2", 17)) - { - ret = GLEW_NV_fragment_program2; - continue; - } -#endif -#ifdef GL_NV_fragment_program4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program4", 17)) - { - ret = GLEW_NV_fragment_program4; - continue; - } -#endif -#ifdef GL_NV_fragment_program_option - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program_option", 23)) - { - ret = GLEW_NV_fragment_program_option; - continue; - } -#endif -#ifdef GL_NV_fragment_shader_barycentric - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_barycentric", 27)) - { - ret = GLEW_NV_fragment_shader_barycentric; - continue; - } -#endif -#ifdef GL_NV_fragment_shader_interlock - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_interlock", 25)) - { - ret = GLEW_NV_fragment_shader_interlock; - continue; - } -#endif -#ifdef GL_NV_framebuffer_blit - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16)) - { - ret = GLEW_NV_framebuffer_blit; - continue; - } -#endif -#ifdef GL_NV_framebuffer_mixed_samples - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_mixed_samples", 25)) - { - ret = GLEW_NV_framebuffer_mixed_samples; - continue; - } -#endif -#ifdef GL_NV_framebuffer_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) - { - ret = GLEW_NV_framebuffer_multisample; - continue; - } -#endif -#ifdef GL_NV_framebuffer_multisample_coverage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample_coverage", 32)) - { - ret = GLEW_NV_framebuffer_multisample_coverage; - continue; - } -#endif -#ifdef GL_NV_generate_mipmap_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"generate_mipmap_sRGB", 20)) - { - ret = GLEW_NV_generate_mipmap_sRGB; - continue; - } -#endif -#ifdef GL_NV_geometry_program4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_program4", 17)) - { - ret = GLEW_NV_geometry_program4; - continue; - } -#endif -#ifdef GL_NV_geometry_shader4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) - { - ret = GLEW_NV_geometry_shader4; - continue; - } -#endif -#ifdef GL_NV_geometry_shader_passthrough - if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader_passthrough", 27)) - { - ret = GLEW_NV_geometry_shader_passthrough; - continue; - } -#endif -#ifdef GL_NV_gpu_multicast - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_multicast", 13)) - { - ret = GLEW_NV_gpu_multicast; - continue; - } -#endif -#ifdef GL_NV_gpu_program4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program4", 12)) - { - ret = GLEW_NV_gpu_program4; - continue; - } -#endif -#ifdef GL_NV_gpu_program5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program5", 12)) - { - ret = GLEW_NV_gpu_program5; - continue; - } -#endif -#ifdef GL_NV_gpu_program5_mem_extended - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program5_mem_extended", 25)) - { - ret = GLEW_NV_gpu_program5_mem_extended; - continue; - } -#endif -#ifdef GL_NV_gpu_program_fp64 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program_fp64", 16)) - { - ret = GLEW_NV_gpu_program_fp64; - continue; - } -#endif -#ifdef GL_NV_gpu_shader5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11)) - { - ret = GLEW_NV_gpu_shader5; - continue; - } -#endif -#ifdef GL_NV_half_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float", 10)) - { - ret = GLEW_NV_half_float; - continue; - } -#endif -#ifdef GL_NV_image_formats - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_formats", 13)) - { - ret = GLEW_NV_image_formats; - continue; - } -#endif -#ifdef GL_NV_instanced_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) - { - ret = GLEW_NV_instanced_arrays; - continue; - } -#endif -#ifdef GL_NV_internalformat_sample_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_sample_query", 27)) - { - ret = GLEW_NV_internalformat_sample_query; - continue; - } -#endif -#ifdef GL_NV_light_max_exponent - if (_glewStrSame3(&pos, &len, (const GLubyte*)"light_max_exponent", 18)) - { - ret = GLEW_NV_light_max_exponent; - continue; - } -#endif -#ifdef GL_NV_memory_attachment - if (_glewStrSame3(&pos, &len, (const GLubyte*)"memory_attachment", 17)) - { - ret = GLEW_NV_memory_attachment; - continue; - } -#endif -#ifdef GL_NV_mesh_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"mesh_shader", 11)) - { - ret = GLEW_NV_mesh_shader; - continue; - } -#endif -#ifdef GL_NV_multisample_coverage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) - { - ret = GLEW_NV_multisample_coverage; - continue; - } -#endif -#ifdef GL_NV_multisample_filter_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_filter_hint", 23)) - { - ret = GLEW_NV_multisample_filter_hint; - continue; - } -#endif -#ifdef GL_NV_non_square_matrices - if (_glewStrSame3(&pos, &len, (const GLubyte*)"non_square_matrices", 19)) - { - ret = GLEW_NV_non_square_matrices; - continue; - } -#endif -#ifdef GL_NV_occlusion_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query", 15)) - { - ret = GLEW_NV_occlusion_query; - continue; - } -#endif -#ifdef GL_NV_pack_subimage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_subimage", 13)) - { - ret = GLEW_NV_pack_subimage; - continue; - } -#endif -#ifdef GL_NV_packed_depth_stencil - if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_depth_stencil", 20)) - { - ret = GLEW_NV_packed_depth_stencil; - continue; - } -#endif -#ifdef GL_NV_packed_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_float", 12)) - { - ret = GLEW_NV_packed_float; - continue; - } -#endif -#ifdef GL_NV_packed_float_linear - if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_float_linear", 19)) - { - ret = GLEW_NV_packed_float_linear; - continue; - } -#endif -#ifdef GL_NV_parameter_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"parameter_buffer_object", 23)) - { - ret = GLEW_NV_parameter_buffer_object; - continue; - } -#endif -#ifdef GL_NV_parameter_buffer_object2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"parameter_buffer_object2", 24)) - { - ret = GLEW_NV_parameter_buffer_object2; - continue; - } -#endif -#ifdef GL_NV_path_rendering - if (_glewStrSame3(&pos, &len, (const GLubyte*)"path_rendering", 14)) - { - ret = GLEW_NV_path_rendering; - continue; - } -#endif -#ifdef GL_NV_path_rendering_shared_edge - if (_glewStrSame3(&pos, &len, (const GLubyte*)"path_rendering_shared_edge", 26)) - { - ret = GLEW_NV_path_rendering_shared_edge; - continue; - } -#endif -#ifdef GL_NV_pixel_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) - { - ret = GLEW_NV_pixel_buffer_object; - continue; - } -#endif -#ifdef GL_NV_pixel_data_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_data_range", 16)) - { - ret = GLEW_NV_pixel_data_range; - continue; - } -#endif -#ifdef GL_NV_platform_binary - if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_binary", 15)) - { - ret = GLEW_NV_platform_binary; - continue; - } -#endif -#ifdef GL_NV_point_sprite - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprite", 12)) - { - ret = GLEW_NV_point_sprite; - continue; - } -#endif -#ifdef GL_NV_polygon_mode - if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_mode", 12)) - { - ret = GLEW_NV_polygon_mode; - continue; - } -#endif -#ifdef GL_NV_present_video - if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) - { - ret = GLEW_NV_present_video; - continue; - } -#endif -#ifdef GL_NV_primitive_restart - if (_glewStrSame3(&pos, &len, (const GLubyte*)"primitive_restart", 17)) - { - ret = GLEW_NV_primitive_restart; - continue; - } -#endif -#ifdef GL_NV_query_resource_tag - if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_resource_tag", 18)) - { - ret = GLEW_NV_query_resource_tag; - continue; - } -#endif -#ifdef GL_NV_read_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_buffer", 11)) - { - ret = GLEW_NV_read_buffer; - continue; - } -#endif -#ifdef GL_NV_read_buffer_front - if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_buffer_front", 17)) - { - ret = GLEW_NV_read_buffer_front; - continue; - } -#endif -#ifdef GL_NV_read_depth - if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_depth", 10)) - { - ret = GLEW_NV_read_depth; - continue; - } -#endif -#ifdef GL_NV_read_depth_stencil - if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_depth_stencil", 18)) - { - ret = GLEW_NV_read_depth_stencil; - continue; - } -#endif -#ifdef GL_NV_read_stencil - if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_stencil", 12)) - { - ret = GLEW_NV_read_stencil; - continue; - } -#endif -#ifdef GL_NV_register_combiners - if (_glewStrSame3(&pos, &len, (const GLubyte*)"register_combiners", 18)) - { - ret = GLEW_NV_register_combiners; - continue; - } -#endif -#ifdef GL_NV_register_combiners2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"register_combiners2", 19)) - { - ret = GLEW_NV_register_combiners2; - continue; - } -#endif -#ifdef GL_NV_representative_fragment_test - if (_glewStrSame3(&pos, &len, (const GLubyte*)"representative_fragment_test", 28)) - { - ret = GLEW_NV_representative_fragment_test; - continue; - } -#endif -#ifdef GL_NV_robustness_video_memory_purge - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_video_memory_purge", 29)) - { - ret = GLEW_NV_robustness_video_memory_purge; - continue; - } -#endif -#ifdef GL_NV_sRGB_formats - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sRGB_formats", 12)) - { - ret = GLEW_NV_sRGB_formats; - continue; - } -#endif -#ifdef GL_NV_sample_locations - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_locations", 16)) - { - ret = GLEW_NV_sample_locations; - continue; - } -#endif -#ifdef GL_NV_sample_mask_override_coverage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_mask_override_coverage", 29)) - { - ret = GLEW_NV_sample_mask_override_coverage; - continue; - } -#endif -#ifdef GL_NV_scissor_exclusive - if (_glewStrSame3(&pos, &len, (const GLubyte*)"scissor_exclusive", 17)) - { - ret = GLEW_NV_scissor_exclusive; - continue; - } -#endif -#ifdef GL_NV_shader_atomic_counters - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counters", 22)) - { - ret = GLEW_NV_shader_atomic_counters; - continue; - } -#endif -#ifdef GL_NV_shader_atomic_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_float", 19)) - { - ret = GLEW_NV_shader_atomic_float; - continue; - } -#endif -#ifdef GL_NV_shader_atomic_float64 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_float64", 21)) - { - ret = GLEW_NV_shader_atomic_float64; - continue; - } -#endif -#ifdef GL_NV_shader_atomic_fp16_vector - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_fp16_vector", 25)) - { - ret = GLEW_NV_shader_atomic_fp16_vector; - continue; - } -#endif -#ifdef GL_NV_shader_atomic_int64 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_int64", 19)) - { - ret = GLEW_NV_shader_atomic_int64; - continue; - } -#endif -#ifdef GL_NV_shader_buffer_load - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_buffer_load", 18)) - { - ret = GLEW_NV_shader_buffer_load; - continue; - } -#endif -#ifdef GL_NV_shader_noperspective_interpolation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_noperspective_interpolation", 34)) - { - ret = GLEW_NV_shader_noperspective_interpolation; - continue; - } -#endif -#ifdef GL_NV_shader_storage_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_storage_buffer_object", 28)) - { - ret = GLEW_NV_shader_storage_buffer_object; - continue; - } -#endif -#ifdef GL_NV_shader_subgroup_partitioned - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_subgroup_partitioned", 27)) - { - ret = GLEW_NV_shader_subgroup_partitioned; - continue; - } -#endif -#ifdef GL_NV_shader_texture_footprint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_footprint", 24)) - { - ret = GLEW_NV_shader_texture_footprint; - continue; - } -#endif -#ifdef GL_NV_shader_thread_group - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_thread_group", 19)) - { - ret = GLEW_NV_shader_thread_group; - continue; - } -#endif -#ifdef GL_NV_shader_thread_shuffle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_thread_shuffle", 21)) - { - ret = GLEW_NV_shader_thread_shuffle; - continue; - } -#endif -#ifdef GL_NV_shading_rate_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_rate_image", 18)) - { - ret = GLEW_NV_shading_rate_image; - continue; - } -#endif -#ifdef GL_NV_shadow_samplers_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_samplers_array", 21)) - { - ret = GLEW_NV_shadow_samplers_array; - continue; - } -#endif -#ifdef GL_NV_shadow_samplers_cube - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_samplers_cube", 20)) - { - ret = GLEW_NV_shadow_samplers_cube; - continue; - } -#endif -#ifdef GL_NV_stereo_view_rendering - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stereo_view_rendering", 21)) - { - ret = GLEW_NV_stereo_view_rendering; - continue; - } -#endif -#ifdef GL_NV_tessellation_program5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_program5", 21)) - { - ret = GLEW_NV_tessellation_program5; - continue; - } -#endif -#ifdef GL_NV_texgen_emboss - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texgen_emboss", 13)) - { - ret = GLEW_NV_texgen_emboss; - continue; - } -#endif -#ifdef GL_NV_texgen_reflection - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texgen_reflection", 17)) - { - ret = GLEW_NV_texgen_reflection; - continue; - } -#endif -#ifdef GL_NV_texture_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_array", 13)) - { - ret = GLEW_NV_texture_array; - continue; - } -#endif -#ifdef GL_NV_texture_barrier - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_barrier", 15)) - { - ret = GLEW_NV_texture_barrier; - continue; - } -#endif -#ifdef GL_NV_texture_border_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) - { - ret = GLEW_NV_texture_border_clamp; - continue; - } -#endif -#ifdef GL_NV_texture_compression_latc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_latc", 24)) - { - ret = GLEW_NV_texture_compression_latc; - continue; - } -#endif -#ifdef GL_NV_texture_compression_s3tc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_s3tc", 24)) - { - ret = GLEW_NV_texture_compression_s3tc; - continue; - } -#endif -#ifdef GL_NV_texture_compression_s3tc_update - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_s3tc_update", 31)) - { - ret = GLEW_NV_texture_compression_s3tc_update; - continue; - } -#endif -#ifdef GL_NV_texture_compression_vtc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_vtc", 23)) - { - ret = GLEW_NV_texture_compression_vtc; - continue; - } -#endif -#ifdef GL_NV_texture_env_combine4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine4", 20)) - { - ret = GLEW_NV_texture_env_combine4; - continue; - } -#endif -#ifdef GL_NV_texture_expand_normal - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_expand_normal", 21)) - { - ret = GLEW_NV_texture_expand_normal; - continue; - } -#endif -#ifdef GL_NV_texture_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multisample", 19)) - { - ret = GLEW_NV_texture_multisample; - continue; - } -#endif -#ifdef GL_NV_texture_npot_2D_mipmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_npot_2D_mipmap", 22)) - { - ret = GLEW_NV_texture_npot_2D_mipmap; - continue; - } -#endif -#ifdef GL_NV_texture_rectangle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) - { - ret = GLEW_NV_texture_rectangle; - continue; - } -#endif -#ifdef GL_NV_texture_rectangle_compressed - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle_compressed", 28)) - { - ret = GLEW_NV_texture_rectangle_compressed; - continue; - } -#endif -#ifdef GL_NV_texture_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader", 14)) - { - ret = GLEW_NV_texture_shader; - continue; - } -#endif -#ifdef GL_NV_texture_shader2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader2", 15)) - { - ret = GLEW_NV_texture_shader2; - continue; - } -#endif -#ifdef GL_NV_texture_shader3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader3", 15)) - { - ret = GLEW_NV_texture_shader3; - continue; - } -#endif -#ifdef GL_NV_transform_feedback - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback", 18)) - { - ret = GLEW_NV_transform_feedback; - continue; - } -#endif -#ifdef GL_NV_transform_feedback2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback2", 19)) - { - ret = GLEW_NV_transform_feedback2; - continue; - } -#endif -#ifdef GL_NV_uniform_buffer_unified_memory - if (_glewStrSame3(&pos, &len, (const GLubyte*)"uniform_buffer_unified_memory", 29)) - { - ret = GLEW_NV_uniform_buffer_unified_memory; - continue; - } -#endif -#ifdef GL_NV_vdpau_interop - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vdpau_interop", 13)) - { - ret = GLEW_NV_vdpau_interop; - continue; - } -#endif -#ifdef GL_NV_vdpau_interop2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vdpau_interop2", 14)) - { - ret = GLEW_NV_vdpau_interop2; - continue; - } -#endif -#ifdef GL_NV_vertex_array_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) - { - ret = GLEW_NV_vertex_array_range; - continue; - } -#endif -#ifdef GL_NV_vertex_array_range2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range2", 19)) - { - ret = GLEW_NV_vertex_array_range2; - continue; - } -#endif -#ifdef GL_NV_vertex_attrib_integer_64bit - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_integer_64bit", 27)) - { - ret = GLEW_NV_vertex_attrib_integer_64bit; - continue; - } -#endif -#ifdef GL_NV_vertex_buffer_unified_memory - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_unified_memory", 28)) - { - ret = GLEW_NV_vertex_buffer_unified_memory; - continue; - } -#endif -#ifdef GL_NV_vertex_program - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program", 14)) - { - ret = GLEW_NV_vertex_program; - continue; - } -#endif -#ifdef GL_NV_vertex_program1_1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program1_1", 17)) - { - ret = GLEW_NV_vertex_program1_1; - continue; - } -#endif -#ifdef GL_NV_vertex_program2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program2", 15)) - { - ret = GLEW_NV_vertex_program2; - continue; - } -#endif -#ifdef GL_NV_vertex_program2_option - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program2_option", 22)) - { - ret = GLEW_NV_vertex_program2_option; - continue; - } -#endif -#ifdef GL_NV_vertex_program3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program3", 15)) - { - ret = GLEW_NV_vertex_program3; - continue; - } -#endif -#ifdef GL_NV_vertex_program4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program4", 15)) - { - ret = GLEW_NV_vertex_program4; - continue; - } -#endif -#ifdef GL_NV_video_capture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) - { - ret = GLEW_NV_video_capture; - continue; - } -#endif -#ifdef GL_NV_viewport_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_array", 14)) - { - ret = GLEW_NV_viewport_array; - continue; - } -#endif -#ifdef GL_NV_viewport_array2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_array2", 15)) - { - ret = GLEW_NV_viewport_array2; - continue; - } -#endif -#ifdef GL_NV_viewport_swizzle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_swizzle", 16)) - { - ret = GLEW_NV_viewport_swizzle; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"OES_", 4)) - { -#ifdef GL_OES_EGL_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"EGL_image", 9)) - { - ret = GLEW_OES_EGL_image; - continue; - } -#endif -#ifdef GL_OES_EGL_image_external - if (_glewStrSame3(&pos, &len, (const GLubyte*)"EGL_image_external", 18)) - { - ret = GLEW_OES_EGL_image_external; - continue; - } -#endif -#ifdef GL_OES_EGL_image_external_essl3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"EGL_image_external_essl3", 24)) - { - ret = GLEW_OES_EGL_image_external_essl3; - continue; - } -#endif -#ifdef GL_OES_blend_equation_separate - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_separate", 23)) - { - ret = GLEW_OES_blend_equation_separate; - continue; - } -#endif -#ifdef GL_OES_blend_func_separate - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_separate", 19)) - { - ret = GLEW_OES_blend_func_separate; - continue; - } -#endif -#ifdef GL_OES_blend_subtract - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_subtract", 14)) - { - ret = GLEW_OES_blend_subtract; - continue; - } -#endif -#ifdef GL_OES_byte_coordinates - if (_glewStrSame3(&pos, &len, (const GLubyte*)"byte_coordinates", 16)) - { - ret = GLEW_OES_byte_coordinates; - continue; - } -#endif -#ifdef GL_OES_compressed_ETC1_RGB8_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_ETC1_RGB8_texture", 28)) - { - ret = GLEW_OES_compressed_ETC1_RGB8_texture; - continue; - } -#endif -#ifdef GL_OES_compressed_paletted_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_paletted_texture", 27)) - { - ret = GLEW_OES_compressed_paletted_texture; - continue; - } -#endif -#ifdef GL_OES_copy_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) - { - ret = GLEW_OES_copy_image; - continue; - } -#endif -#ifdef GL_OES_depth24 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth24", 7)) - { - ret = GLEW_OES_depth24; - continue; - } -#endif -#ifdef GL_OES_depth32 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth32", 7)) - { - ret = GLEW_OES_depth32; - continue; - } -#endif -#ifdef GL_OES_depth_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) - { - ret = GLEW_OES_depth_texture; - continue; - } -#endif -#ifdef GL_OES_depth_texture_cube_map - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture_cube_map", 22)) - { - ret = GLEW_OES_depth_texture_cube_map; - continue; - } -#endif -#ifdef GL_OES_draw_buffers_indexed - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_indexed", 20)) - { - ret = GLEW_OES_draw_buffers_indexed; - continue; - } -#endif -#ifdef GL_OES_draw_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_texture", 12)) - { - ret = GLEW_OES_draw_texture; - continue; - } -#endif -#ifdef GL_OES_element_index_uint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"element_index_uint", 18)) - { - ret = GLEW_OES_element_index_uint; - continue; - } -#endif -#ifdef GL_OES_extended_matrix_palette - if (_glewStrSame3(&pos, &len, (const GLubyte*)"extended_matrix_palette", 23)) - { - ret = GLEW_OES_extended_matrix_palette; - continue; - } -#endif -#ifdef GL_OES_fbo_render_mipmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbo_render_mipmap", 17)) - { - ret = GLEW_OES_fbo_render_mipmap; - continue; - } -#endif -#ifdef GL_OES_fragment_precision_high - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_precision_high", 23)) - { - ret = GLEW_OES_fragment_precision_high; - continue; - } -#endif -#ifdef GL_OES_framebuffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_object", 18)) - { - ret = GLEW_OES_framebuffer_object; - continue; - } -#endif -#ifdef GL_OES_geometry_point_size - if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_point_size", 19)) - { - ret = GLEW_OES_geometry_point_size; - continue; - } -#endif -#ifdef GL_OES_geometry_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader", 15)) - { - ret = GLEW_OES_geometry_shader; - continue; - } -#endif -#ifdef GL_OES_get_program_binary - if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_program_binary", 18)) - { - ret = GLEW_OES_get_program_binary; - continue; - } -#endif -#ifdef GL_OES_gpu_shader5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11)) - { - ret = GLEW_OES_gpu_shader5; - continue; - } -#endif -#ifdef GL_OES_mapbuffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"mapbuffer", 9)) - { - ret = GLEW_OES_mapbuffer; - continue; - } -#endif -#ifdef GL_OES_matrix_get - if (_glewStrSame3(&pos, &len, (const GLubyte*)"matrix_get", 10)) - { - ret = GLEW_OES_matrix_get; - continue; - } -#endif -#ifdef GL_OES_matrix_palette - if (_glewStrSame3(&pos, &len, (const GLubyte*)"matrix_palette", 14)) - { - ret = GLEW_OES_matrix_palette; - continue; - } -#endif -#ifdef GL_OES_packed_depth_stencil - if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_depth_stencil", 20)) - { - ret = GLEW_OES_packed_depth_stencil; - continue; - } -#endif -#ifdef GL_OES_point_size_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_size_array", 16)) - { - ret = GLEW_OES_point_size_array; - continue; - } -#endif -#ifdef GL_OES_point_sprite - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprite", 12)) - { - ret = GLEW_OES_point_sprite; - continue; - } -#endif -#ifdef GL_OES_read_format - if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_format", 11)) - { - ret = GLEW_OES_read_format; - continue; - } -#endif -#ifdef GL_OES_required_internalformat - if (_glewStrSame3(&pos, &len, (const GLubyte*)"required_internalformat", 23)) - { - ret = GLEW_OES_required_internalformat; - continue; - } -#endif -#ifdef GL_OES_rgb8_rgba8 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"rgb8_rgba8", 10)) - { - ret = GLEW_OES_rgb8_rgba8; - continue; - } -#endif -#ifdef GL_OES_sample_shading - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_shading", 14)) - { - ret = GLEW_OES_sample_shading; - continue; - } -#endif -#ifdef GL_OES_sample_variables - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_variables", 16)) - { - ret = GLEW_OES_sample_variables; - continue; - } -#endif -#ifdef GL_OES_shader_image_atomic - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_atomic", 19)) - { - ret = GLEW_OES_shader_image_atomic; - continue; - } -#endif -#ifdef GL_OES_shader_io_blocks - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_io_blocks", 16)) - { - ret = GLEW_OES_shader_io_blocks; - continue; - } -#endif -#ifdef GL_OES_shader_multisample_interpolation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_multisample_interpolation", 32)) - { - ret = GLEW_OES_shader_multisample_interpolation; - continue; - } -#endif -#ifdef GL_OES_single_precision - if (_glewStrSame3(&pos, &len, (const GLubyte*)"single_precision", 16)) - { - ret = GLEW_OES_single_precision; - continue; - } -#endif -#ifdef GL_OES_standard_derivatives - if (_glewStrSame3(&pos, &len, (const GLubyte*)"standard_derivatives", 20)) - { - ret = GLEW_OES_standard_derivatives; - continue; - } -#endif -#ifdef GL_OES_stencil1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil1", 8)) - { - ret = GLEW_OES_stencil1; - continue; - } -#endif -#ifdef GL_OES_stencil4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil4", 8)) - { - ret = GLEW_OES_stencil4; - continue; - } -#endif -#ifdef GL_OES_stencil8 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil8", 8)) - { - ret = GLEW_OES_stencil8; - continue; - } -#endif -#ifdef GL_OES_surfaceless_context - if (_glewStrSame3(&pos, &len, (const GLubyte*)"surfaceless_context", 19)) - { - ret = GLEW_OES_surfaceless_context; - continue; - } -#endif -#ifdef GL_OES_tessellation_point_size - if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_point_size", 23)) - { - ret = GLEW_OES_tessellation_point_size; - continue; - } -#endif -#ifdef GL_OES_tessellation_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_shader", 19)) - { - ret = GLEW_OES_tessellation_shader; - continue; - } -#endif -#ifdef GL_OES_texture_3D - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_3D", 10)) - { - ret = GLEW_OES_texture_3D; - continue; - } -#endif -#ifdef GL_OES_texture_border_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) - { - ret = GLEW_OES_texture_border_clamp; - continue; - } -#endif -#ifdef GL_OES_texture_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer", 14)) - { - ret = GLEW_OES_texture_buffer; - continue; - } -#endif -#ifdef GL_OES_texture_compression_astc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc", 24)) - { - ret = GLEW_OES_texture_compression_astc; - continue; - } -#endif -#ifdef GL_OES_texture_cube_map - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map", 16)) - { - ret = GLEW_OES_texture_cube_map; - continue; - } -#endif -#ifdef GL_OES_texture_cube_map_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map_array", 22)) - { - ret = GLEW_OES_texture_cube_map_array; - continue; - } -#endif -#ifdef GL_OES_texture_env_crossbar - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_crossbar", 20)) - { - ret = GLEW_OES_texture_env_crossbar; - continue; - } -#endif -#ifdef GL_OES_texture_mirrored_repeat - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23)) - { - ret = GLEW_OES_texture_mirrored_repeat; - continue; - } -#endif -#ifdef GL_OES_texture_npot - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_npot", 12)) - { - ret = GLEW_OES_texture_npot; - continue; - } -#endif -#ifdef GL_OES_texture_stencil8 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_stencil8", 16)) - { - ret = GLEW_OES_texture_stencil8; - continue; - } -#endif -#ifdef GL_OES_texture_storage_multisample_2d_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage_multisample_2d_array", 36)) - { - ret = GLEW_OES_texture_storage_multisample_2d_array; - continue; - } -#endif -#ifdef GL_OES_texture_view - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_view", 12)) - { - ret = GLEW_OES_texture_view; - continue; - } -#endif -#ifdef GL_OES_vertex_array_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) - { - ret = GLEW_OES_vertex_array_object; - continue; - } -#endif -#ifdef GL_OES_vertex_half_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_half_float", 17)) - { - ret = GLEW_OES_vertex_half_float; - continue; - } -#endif -#ifdef GL_OES_vertex_type_10_10_10_2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_type_10_10_10_2", 22)) - { - ret = GLEW_OES_vertex_type_10_10_10_2; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) - { -#ifdef GL_OML_interlace - if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace", 9)) - { - ret = GLEW_OML_interlace; - continue; - } -#endif -#ifdef GL_OML_resample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"resample", 8)) - { - ret = GLEW_OML_resample; - continue; - } -#endif -#ifdef GL_OML_subsample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"subsample", 9)) - { - ret = GLEW_OML_subsample; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"OVR_", 4)) - { -#ifdef GL_OVR_multiview - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview", 9)) - { - ret = GLEW_OVR_multiview; - continue; - } -#endif -#ifdef GL_OVR_multiview2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview2", 10)) - { - ret = GLEW_OVR_multiview2; - continue; - } -#endif -#ifdef GL_OVR_multiview_multisampled_render_to_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview_multisampled_render_to_texture", 40)) - { - ret = GLEW_OVR_multiview_multisampled_render_to_texture; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"PGI_", 4)) - { -#ifdef GL_PGI_misc_hints - if (_glewStrSame3(&pos, &len, (const GLubyte*)"misc_hints", 10)) - { - ret = GLEW_PGI_misc_hints; - continue; - } -#endif -#ifdef GL_PGI_vertex_hints - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_hints", 12)) - { - ret = GLEW_PGI_vertex_hints; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"QCOM_", 5)) - { -#ifdef GL_QCOM_YUV_texture_gather - if (_glewStrSame3(&pos, &len, (const GLubyte*)"YUV_texture_gather", 18)) - { - ret = GLEW_QCOM_YUV_texture_gather; - continue; - } -#endif -#ifdef GL_QCOM_alpha_test - if (_glewStrSame3(&pos, &len, (const GLubyte*)"alpha_test", 10)) - { - ret = GLEW_QCOM_alpha_test; - continue; - } -#endif -#ifdef GL_QCOM_binning_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"binning_control", 15)) - { - ret = GLEW_QCOM_binning_control; - continue; - } -#endif -#ifdef GL_QCOM_driver_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"driver_control", 14)) - { - ret = GLEW_QCOM_driver_control; - continue; - } -#endif -#ifdef GL_QCOM_extended_get - if (_glewStrSame3(&pos, &len, (const GLubyte*)"extended_get", 12)) - { - ret = GLEW_QCOM_extended_get; - continue; - } -#endif -#ifdef GL_QCOM_extended_get2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"extended_get2", 13)) - { - ret = GLEW_QCOM_extended_get2; - continue; - } -#endif -#ifdef GL_QCOM_framebuffer_foveated - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_foveated", 20)) - { - ret = GLEW_QCOM_framebuffer_foveated; - continue; - } -#endif -#ifdef GL_QCOM_perfmon_global_mode - if (_glewStrSame3(&pos, &len, (const GLubyte*)"perfmon_global_mode", 19)) - { - ret = GLEW_QCOM_perfmon_global_mode; - continue; - } -#endif -#ifdef GL_QCOM_shader_framebuffer_fetch_noncoherent - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_framebuffer_fetch_noncoherent", 36)) - { - ret = GLEW_QCOM_shader_framebuffer_fetch_noncoherent; - continue; - } -#endif -#ifdef GL_QCOM_shader_framebuffer_fetch_rate - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_framebuffer_fetch_rate", 29)) - { - ret = GLEW_QCOM_shader_framebuffer_fetch_rate; - continue; - } -#endif -#ifdef GL_QCOM_texture_foveated - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_foveated", 16)) - { - ret = GLEW_QCOM_texture_foveated; - continue; - } -#endif -#ifdef GL_QCOM_texture_foveated_subsampled_layout - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_foveated_subsampled_layout", 34)) - { - ret = GLEW_QCOM_texture_foveated_subsampled_layout; - continue; - } -#endif -#ifdef GL_QCOM_tiled_rendering - if (_glewStrSame3(&pos, &len, (const GLubyte*)"tiled_rendering", 15)) - { - ret = GLEW_QCOM_tiled_rendering; - continue; - } -#endif -#ifdef GL_QCOM_writeonly_rendering - if (_glewStrSame3(&pos, &len, (const GLubyte*)"writeonly_rendering", 19)) - { - ret = GLEW_QCOM_writeonly_rendering; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"REGAL_", 6)) - { -#ifdef GL_REGAL_ES1_0_compatibility - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES1_0_compatibility", 19)) - { - ret = GLEW_REGAL_ES1_0_compatibility; - continue; - } -#endif -#ifdef GL_REGAL_ES1_1_compatibility - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES1_1_compatibility", 19)) - { - ret = GLEW_REGAL_ES1_1_compatibility; - continue; - } -#endif -#ifdef GL_REGAL_enable - if (_glewStrSame3(&pos, &len, (const GLubyte*)"enable", 6)) - { - ret = GLEW_REGAL_enable; - continue; - } -#endif -#ifdef GL_REGAL_error_string - if (_glewStrSame3(&pos, &len, (const GLubyte*)"error_string", 12)) - { - ret = GLEW_REGAL_error_string; - continue; - } -#endif -#ifdef GL_REGAL_extension_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"extension_query", 15)) - { - ret = GLEW_REGAL_extension_query; - continue; - } -#endif -#ifdef GL_REGAL_log - if (_glewStrSame3(&pos, &len, (const GLubyte*)"log", 3)) - { - ret = GLEW_REGAL_log; - continue; - } -#endif -#ifdef GL_REGAL_proc_address - if (_glewStrSame3(&pos, &len, (const GLubyte*)"proc_address", 12)) - { - ret = GLEW_REGAL_proc_address; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"REND_", 5)) - { -#ifdef GL_REND_screen_coordinates - if (_glewStrSame3(&pos, &len, (const GLubyte*)"screen_coordinates", 18)) - { - ret = GLEW_REND_screen_coordinates; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"S3_", 3)) - { -#ifdef GL_S3_s3tc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"s3tc", 4)) - { - ret = GLEW_S3_s3tc; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIS_", 5)) - { -#ifdef GL_SGIS_clip_band_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_band_hint", 14)) - { - ret = GLEW_SGIS_clip_band_hint; - continue; - } -#endif -#ifdef GL_SGIS_color_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_range", 11)) - { - ret = GLEW_SGIS_color_range; - continue; - } -#endif -#ifdef GL_SGIS_detail_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"detail_texture", 14)) - { - ret = GLEW_SGIS_detail_texture; - continue; - } -#endif -#ifdef GL_SGIS_fog_function - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_function", 12)) - { - ret = GLEW_SGIS_fog_function; - continue; - } -#endif -#ifdef GL_SGIS_generate_mipmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"generate_mipmap", 15)) - { - ret = GLEW_SGIS_generate_mipmap; - continue; - } -#endif -#ifdef GL_SGIS_line_texgen - if (_glewStrSame3(&pos, &len, (const GLubyte*)"line_texgen", 11)) - { - ret = GLEW_SGIS_line_texgen; - continue; - } -#endif -#ifdef GL_SGIS_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLEW_SGIS_multisample; - continue; - } -#endif -#ifdef GL_SGIS_multitexture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multitexture", 12)) - { - ret = GLEW_SGIS_multitexture; - continue; - } -#endif -#ifdef GL_SGIS_pixel_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture", 13)) - { - ret = GLEW_SGIS_pixel_texture; - continue; - } -#endif -#ifdef GL_SGIS_point_line_texgen - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_line_texgen", 17)) - { - ret = GLEW_SGIS_point_line_texgen; - continue; - } -#endif -#ifdef GL_SGIS_shared_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_multisample", 18)) - { - ret = GLEW_SGIS_shared_multisample; - continue; - } -#endif -#ifdef GL_SGIS_sharpen_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sharpen_texture", 15)) - { - ret = GLEW_SGIS_sharpen_texture; - continue; - } -#endif -#ifdef GL_SGIS_texture4D - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture4D", 9)) - { - ret = GLEW_SGIS_texture4D; - continue; - } -#endif -#ifdef GL_SGIS_texture_border_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) - { - ret = GLEW_SGIS_texture_border_clamp; - continue; - } -#endif -#ifdef GL_SGIS_texture_edge_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_edge_clamp", 18)) - { - ret = GLEW_SGIS_texture_edge_clamp; - continue; - } -#endif -#ifdef GL_SGIS_texture_filter4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter4", 15)) - { - ret = GLEW_SGIS_texture_filter4; - continue; - } -#endif -#ifdef GL_SGIS_texture_lod - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod", 11)) - { - ret = GLEW_SGIS_texture_lod; - continue; - } -#endif -#ifdef GL_SGIS_texture_select - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_select", 14)) - { - ret = GLEW_SGIS_texture_select; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIX_", 5)) - { -#ifdef GL_SGIX_async - if (_glewStrSame3(&pos, &len, (const GLubyte*)"async", 5)) - { - ret = GLEW_SGIX_async; - continue; - } -#endif -#ifdef GL_SGIX_async_histogram - if (_glewStrSame3(&pos, &len, (const GLubyte*)"async_histogram", 15)) - { - ret = GLEW_SGIX_async_histogram; - continue; - } -#endif -#ifdef GL_SGIX_async_pixel - if (_glewStrSame3(&pos, &len, (const GLubyte*)"async_pixel", 11)) - { - ret = GLEW_SGIX_async_pixel; - continue; - } -#endif -#ifdef GL_SGIX_bali_g_instruments - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bali_g_instruments", 18)) - { - ret = GLEW_SGIX_bali_g_instruments; - continue; - } -#endif -#ifdef GL_SGIX_bali_r_instruments - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bali_r_instruments", 18)) - { - ret = GLEW_SGIX_bali_r_instruments; - continue; - } -#endif -#ifdef GL_SGIX_bali_timer_instruments - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bali_timer_instruments", 22)) - { - ret = GLEW_SGIX_bali_timer_instruments; - continue; - } -#endif -#ifdef GL_SGIX_blend_alpha_minmax - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_alpha_minmax", 18)) - { - ret = GLEW_SGIX_blend_alpha_minmax; - continue; - } -#endif -#ifdef GL_SGIX_blend_cadd - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_cadd", 10)) - { - ret = GLEW_SGIX_blend_cadd; - continue; - } -#endif -#ifdef GL_SGIX_blend_cmultiply - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_cmultiply", 15)) - { - ret = GLEW_SGIX_blend_cmultiply; - continue; - } -#endif -#ifdef GL_SGIX_calligraphic_fragment - if (_glewStrSame3(&pos, &len, (const GLubyte*)"calligraphic_fragment", 21)) - { - ret = GLEW_SGIX_calligraphic_fragment; - continue; - } -#endif -#ifdef GL_SGIX_clipmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clipmap", 7)) - { - ret = GLEW_SGIX_clipmap; - continue; - } -#endif -#ifdef GL_SGIX_color_matrix_accuracy - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_matrix_accuracy", 21)) - { - ret = GLEW_SGIX_color_matrix_accuracy; - continue; - } -#endif -#ifdef GL_SGIX_color_table_index_mode - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_table_index_mode", 22)) - { - ret = GLEW_SGIX_color_table_index_mode; - continue; - } -#endif -#ifdef GL_SGIX_complex_polar - if (_glewStrSame3(&pos, &len, (const GLubyte*)"complex_polar", 13)) - { - ret = GLEW_SGIX_complex_polar; - continue; - } -#endif -#ifdef GL_SGIX_convolution_accuracy - if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_accuracy", 20)) - { - ret = GLEW_SGIX_convolution_accuracy; - continue; - } -#endif -#ifdef GL_SGIX_cube_map - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cube_map", 8)) - { - ret = GLEW_SGIX_cube_map; - continue; - } -#endif -#ifdef GL_SGIX_cylinder_texgen - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cylinder_texgen", 15)) - { - ret = GLEW_SGIX_cylinder_texgen; - continue; - } -#endif -#ifdef GL_SGIX_datapipe - if (_glewStrSame3(&pos, &len, (const GLubyte*)"datapipe", 8)) - { - ret = GLEW_SGIX_datapipe; - continue; - } -#endif -#ifdef GL_SGIX_decimation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"decimation", 10)) - { - ret = GLEW_SGIX_decimation; - continue; - } -#endif -#ifdef GL_SGIX_depth_pass_instrument - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_pass_instrument", 21)) - { - ret = GLEW_SGIX_depth_pass_instrument; - continue; - } -#endif -#ifdef GL_SGIX_depth_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) - { - ret = GLEW_SGIX_depth_texture; - continue; - } -#endif -#ifdef GL_SGIX_dvc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"dvc", 3)) - { - ret = GLEW_SGIX_dvc; - continue; - } -#endif -#ifdef GL_SGIX_flush_raster - if (_glewStrSame3(&pos, &len, (const GLubyte*)"flush_raster", 12)) - { - ret = GLEW_SGIX_flush_raster; - continue; - } -#endif -#ifdef GL_SGIX_fog_blend - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_blend", 9)) - { - ret = GLEW_SGIX_fog_blend; - continue; - } -#endif -#ifdef GL_SGIX_fog_factor_to_alpha - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_factor_to_alpha", 19)) - { - ret = GLEW_SGIX_fog_factor_to_alpha; - continue; - } -#endif -#ifdef GL_SGIX_fog_layers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_layers", 10)) - { - ret = GLEW_SGIX_fog_layers; - continue; - } -#endif -#ifdef GL_SGIX_fog_offset - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_offset", 10)) - { - ret = GLEW_SGIX_fog_offset; - continue; - } -#endif -#ifdef GL_SGIX_fog_patchy - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_patchy", 10)) - { - ret = GLEW_SGIX_fog_patchy; - continue; - } -#endif -#ifdef GL_SGIX_fog_scale - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_scale", 9)) - { - ret = GLEW_SGIX_fog_scale; - continue; - } -#endif -#ifdef GL_SGIX_fog_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_texture", 11)) - { - ret = GLEW_SGIX_fog_texture; - continue; - } -#endif -#ifdef GL_SGIX_fragment_lighting_space - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_lighting_space", 23)) - { - ret = GLEW_SGIX_fragment_lighting_space; - continue; - } -#endif -#ifdef GL_SGIX_fragment_specular_lighting - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_specular_lighting", 26)) - { - ret = GLEW_SGIX_fragment_specular_lighting; - continue; - } -#endif -#ifdef GL_SGIX_fragments_instrument - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragments_instrument", 20)) - { - ret = GLEW_SGIX_fragments_instrument; - continue; - } -#endif -#ifdef GL_SGIX_framezoom - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framezoom", 9)) - { - ret = GLEW_SGIX_framezoom; - continue; - } -#endif -#ifdef GL_SGIX_icc_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"icc_texture", 11)) - { - ret = GLEW_SGIX_icc_texture; - continue; - } -#endif -#ifdef GL_SGIX_igloo_interface - if (_glewStrSame3(&pos, &len, (const GLubyte*)"igloo_interface", 15)) - { - ret = GLEW_SGIX_igloo_interface; - continue; - } -#endif -#ifdef GL_SGIX_image_compression - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_compression", 17)) - { - ret = GLEW_SGIX_image_compression; - continue; - } -#endif -#ifdef GL_SGIX_impact_pixel_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"impact_pixel_texture", 20)) - { - ret = GLEW_SGIX_impact_pixel_texture; - continue; - } -#endif -#ifdef GL_SGIX_instrument_error - if (_glewStrSame3(&pos, &len, (const GLubyte*)"instrument_error", 16)) - { - ret = GLEW_SGIX_instrument_error; - continue; - } -#endif -#ifdef GL_SGIX_interlace - if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace", 9)) - { - ret = GLEW_SGIX_interlace; - continue; - } -#endif -#ifdef GL_SGIX_ir_instrument1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ir_instrument1", 14)) - { - ret = GLEW_SGIX_ir_instrument1; - continue; - } -#endif -#ifdef GL_SGIX_line_quality_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"line_quality_hint", 17)) - { - ret = GLEW_SGIX_line_quality_hint; - continue; - } -#endif -#ifdef GL_SGIX_list_priority - if (_glewStrSame3(&pos, &len, (const GLubyte*)"list_priority", 13)) - { - ret = GLEW_SGIX_list_priority; - continue; - } -#endif -#ifdef GL_SGIX_mpeg1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"mpeg1", 5)) - { - ret = GLEW_SGIX_mpeg1; - continue; - } -#endif -#ifdef GL_SGIX_mpeg2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"mpeg2", 5)) - { - ret = GLEW_SGIX_mpeg2; - continue; - } -#endif -#ifdef GL_SGIX_nonlinear_lighting_pervertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"nonlinear_lighting_pervertex", 28)) - { - ret = GLEW_SGIX_nonlinear_lighting_pervertex; - continue; - } -#endif -#ifdef GL_SGIX_nurbs_eval - if (_glewStrSame3(&pos, &len, (const GLubyte*)"nurbs_eval", 10)) - { - ret = GLEW_SGIX_nurbs_eval; - continue; - } -#endif -#ifdef GL_SGIX_occlusion_instrument - if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_instrument", 20)) - { - ret = GLEW_SGIX_occlusion_instrument; - continue; - } -#endif -#ifdef GL_SGIX_packed_6bytes - if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_6bytes", 13)) - { - ret = GLEW_SGIX_packed_6bytes; - continue; - } -#endif -#ifdef GL_SGIX_pixel_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture", 13)) - { - ret = GLEW_SGIX_pixel_texture; - continue; - } -#endif -#ifdef GL_SGIX_pixel_texture_bits - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture_bits", 18)) - { - ret = GLEW_SGIX_pixel_texture_bits; - continue; - } -#endif -#ifdef GL_SGIX_pixel_texture_lod - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture_lod", 17)) - { - ret = GLEW_SGIX_pixel_texture_lod; - continue; - } -#endif -#ifdef GL_SGIX_pixel_tiles - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_tiles", 11)) - { - ret = GLEW_SGIX_pixel_tiles; - continue; - } -#endif -#ifdef GL_SGIX_polynomial_ffd - if (_glewStrSame3(&pos, &len, (const GLubyte*)"polynomial_ffd", 14)) - { - ret = GLEW_SGIX_polynomial_ffd; - continue; - } -#endif -#ifdef GL_SGIX_quad_mesh - if (_glewStrSame3(&pos, &len, (const GLubyte*)"quad_mesh", 9)) - { - ret = GLEW_SGIX_quad_mesh; - continue; - } -#endif -#ifdef GL_SGIX_reference_plane - if (_glewStrSame3(&pos, &len, (const GLubyte*)"reference_plane", 15)) - { - ret = GLEW_SGIX_reference_plane; - continue; - } -#endif -#ifdef GL_SGIX_resample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"resample", 8)) - { - ret = GLEW_SGIX_resample; - continue; - } -#endif -#ifdef GL_SGIX_scalebias_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"scalebias_hint", 14)) - { - ret = GLEW_SGIX_scalebias_hint; - continue; - } -#endif -#ifdef GL_SGIX_shadow - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow", 6)) - { - ret = GLEW_SGIX_shadow; - continue; - } -#endif -#ifdef GL_SGIX_shadow_ambient - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_ambient", 14)) - { - ret = GLEW_SGIX_shadow_ambient; - continue; - } -#endif -#ifdef GL_SGIX_slim - if (_glewStrSame3(&pos, &len, (const GLubyte*)"slim", 4)) - { - ret = GLEW_SGIX_slim; - continue; - } -#endif -#ifdef GL_SGIX_spotlight_cutoff - if (_glewStrSame3(&pos, &len, (const GLubyte*)"spotlight_cutoff", 16)) - { - ret = GLEW_SGIX_spotlight_cutoff; - continue; - } -#endif -#ifdef GL_SGIX_sprite - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sprite", 6)) - { - ret = GLEW_SGIX_sprite; - continue; - } -#endif -#ifdef GL_SGIX_subdiv_patch - if (_glewStrSame3(&pos, &len, (const GLubyte*)"subdiv_patch", 12)) - { - ret = GLEW_SGIX_subdiv_patch; - continue; - } -#endif -#ifdef GL_SGIX_subsample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"subsample", 9)) - { - ret = GLEW_SGIX_subsample; - continue; - } -#endif -#ifdef GL_SGIX_tag_sample_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"tag_sample_buffer", 17)) - { - ret = GLEW_SGIX_tag_sample_buffer; - continue; - } -#endif -#ifdef GL_SGIX_texture_add_env - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_add_env", 15)) - { - ret = GLEW_SGIX_texture_add_env; - continue; - } -#endif -#ifdef GL_SGIX_texture_coordinate_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_coordinate_clamp", 24)) - { - ret = GLEW_SGIX_texture_coordinate_clamp; - continue; - } -#endif -#ifdef GL_SGIX_texture_lod_bias - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod_bias", 16)) - { - ret = GLEW_SGIX_texture_lod_bias; - continue; - } -#endif -#ifdef GL_SGIX_texture_mipmap_anisotropic - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mipmap_anisotropic", 26)) - { - ret = GLEW_SGIX_texture_mipmap_anisotropic; - continue; - } -#endif -#ifdef GL_SGIX_texture_multi_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multi_buffer", 20)) - { - ret = GLEW_SGIX_texture_multi_buffer; - continue; - } -#endif -#ifdef GL_SGIX_texture_phase - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_phase", 13)) - { - ret = GLEW_SGIX_texture_phase; - continue; - } -#endif -#ifdef GL_SGIX_texture_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_range", 13)) - { - ret = GLEW_SGIX_texture_range; - continue; - } -#endif -#ifdef GL_SGIX_texture_scale_bias - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_scale_bias", 18)) - { - ret = GLEW_SGIX_texture_scale_bias; - continue; - } -#endif -#ifdef GL_SGIX_texture_supersample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_supersample", 19)) - { - ret = GLEW_SGIX_texture_supersample; - continue; - } -#endif -#ifdef GL_SGIX_vector_ops - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vector_ops", 10)) - { - ret = GLEW_SGIX_vector_ops; - continue; - } -#endif -#ifdef GL_SGIX_vertex_array_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) - { - ret = GLEW_SGIX_vertex_array_object; - continue; - } -#endif -#ifdef GL_SGIX_vertex_preclip - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_preclip", 14)) - { - ret = GLEW_SGIX_vertex_preclip; - continue; - } -#endif -#ifdef GL_SGIX_vertex_preclip_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_preclip_hint", 19)) - { - ret = GLEW_SGIX_vertex_preclip_hint; - continue; - } -#endif -#ifdef GL_SGIX_ycrcb - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycrcb", 5)) - { - ret = GLEW_SGIX_ycrcb; - continue; - } -#endif -#ifdef GL_SGIX_ycrcb_subsample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycrcb_subsample", 15)) - { - ret = GLEW_SGIX_ycrcb_subsample; - continue; - } -#endif -#ifdef GL_SGIX_ycrcba - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycrcba", 6)) - { - ret = GLEW_SGIX_ycrcba; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGI_", 4)) - { -#ifdef GL_SGI_color_matrix - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_matrix", 12)) - { - ret = GLEW_SGI_color_matrix; - continue; - } -#endif -#ifdef GL_SGI_color_table - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_table", 11)) - { - ret = GLEW_SGI_color_table; - continue; - } -#endif -#ifdef GL_SGI_complex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"complex", 7)) - { - ret = GLEW_SGI_complex; - continue; - } -#endif -#ifdef GL_SGI_complex_type - if (_glewStrSame3(&pos, &len, (const GLubyte*)"complex_type", 12)) - { - ret = GLEW_SGI_complex_type; - continue; - } -#endif -#ifdef GL_SGI_fft - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fft", 3)) - { - ret = GLEW_SGI_fft; - continue; - } -#endif -#ifdef GL_SGI_texture_color_table - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_color_table", 19)) - { - ret = GLEW_SGI_texture_color_table; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUNX_", 5)) - { -#ifdef GL_SUNX_constant_data - if (_glewStrSame3(&pos, &len, (const GLubyte*)"constant_data", 13)) - { - ret = GLEW_SUNX_constant_data; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUN_", 4)) - { -#ifdef GL_SUN_convolution_border_modes - if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_border_modes", 24)) - { - ret = GLEW_SUN_convolution_border_modes; - continue; - } -#endif -#ifdef GL_SUN_global_alpha - if (_glewStrSame3(&pos, &len, (const GLubyte*)"global_alpha", 12)) - { - ret = GLEW_SUN_global_alpha; - continue; - } -#endif -#ifdef GL_SUN_mesh_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"mesh_array", 10)) - { - ret = GLEW_SUN_mesh_array; - continue; - } -#endif -#ifdef GL_SUN_read_video_pixels - if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_video_pixels", 17)) - { - ret = GLEW_SUN_read_video_pixels; - continue; - } -#endif -#ifdef GL_SUN_slice_accum - if (_glewStrSame3(&pos, &len, (const GLubyte*)"slice_accum", 11)) - { - ret = GLEW_SUN_slice_accum; - continue; - } -#endif -#ifdef GL_SUN_triangle_list - if (_glewStrSame3(&pos, &len, (const GLubyte*)"triangle_list", 13)) - { - ret = GLEW_SUN_triangle_list; - continue; - } -#endif -#ifdef GL_SUN_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex", 6)) - { - ret = GLEW_SUN_vertex; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"VIV_", 4)) - { -#ifdef GL_VIV_shader_binary - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_binary", 13)) - { - ret = GLEW_VIV_shader_binary; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"WIN_", 4)) - { -#ifdef GL_WIN_phong_shading - if (_glewStrSame3(&pos, &len, (const GLubyte*)"phong_shading", 13)) - { - ret = GLEW_WIN_phong_shading; - continue; - } -#endif -#ifdef GL_WIN_scene_markerXXX - if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_markerXXX", 15)) - { - ret = GLEW_WIN_scene_markerXXX; - continue; - } -#endif -#ifdef GL_WIN_specular_fog - if (_glewStrSame3(&pos, &len, (const GLubyte*)"specular_fog", 12)) - { - ret = GLEW_WIN_specular_fog; - continue; - } -#endif -#ifdef GL_WIN_swap_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_hint", 9)) - { - ret = GLEW_WIN_swap_hint; - continue; - } -#endif - } - } - ret = (len == 0); - } - return ret; -} - -#if defined(_WIN32) && !defined(GLEW_EGL) && !defined(GLEW_OSMESA) - -GLboolean GLEWAPIENTRY wglewIsSupported (const char* name) -{ - const GLubyte* pos = (const GLubyte*)name; - GLuint len = _glewStrLen(pos); - GLboolean ret = GL_TRUE; - while (ret && len > 0) - { - if (_glewStrSame1(&pos, &len, (const GLubyte*)"WGL_", 4)) - { - if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) - { -#ifdef WGL_3DFX_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = WGLEW_3DFX_multisample; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DL_", 4)) - { -#ifdef WGL_3DL_stereo_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stereo_control", 14)) - { - ret = WGLEW_3DL_stereo_control; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) - { -#ifdef WGL_AMD_gpu_association - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_association", 15)) - { - ret = WGLEW_AMD_gpu_association; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) - { -#ifdef WGL_ARB_buffer_region - if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_region", 13)) - { - ret = WGLEW_ARB_buffer_region; - continue; - } -#endif -#ifdef WGL_ARB_context_flush_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) - { - ret = WGLEW_ARB_context_flush_control; - continue; - } -#endif -#ifdef WGL_ARB_create_context - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context", 14)) - { - ret = WGLEW_ARB_create_context; - continue; - } -#endif -#ifdef WGL_ARB_create_context_no_error - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_no_error", 23)) - { - ret = WGLEW_ARB_create_context_no_error; - continue; - } -#endif -#ifdef WGL_ARB_create_context_profile - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_profile", 22)) - { - ret = WGLEW_ARB_create_context_profile; - continue; - } -#endif -#ifdef WGL_ARB_create_context_robustness - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25)) - { - ret = WGLEW_ARB_create_context_robustness; - continue; - } -#endif -#ifdef WGL_ARB_extensions_string - if (_glewStrSame3(&pos, &len, (const GLubyte*)"extensions_string", 17)) - { - ret = WGLEW_ARB_extensions_string; - continue; - } -#endif -#ifdef WGL_ARB_framebuffer_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) - { - ret = WGLEW_ARB_framebuffer_sRGB; - continue; - } -#endif -#ifdef WGL_ARB_make_current_read - if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) - { - ret = WGLEW_ARB_make_current_read; - continue; - } -#endif -#ifdef WGL_ARB_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = WGLEW_ARB_multisample; - continue; - } -#endif -#ifdef WGL_ARB_pbuffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) - { - ret = WGLEW_ARB_pbuffer; - continue; - } -#endif -#ifdef WGL_ARB_pixel_format - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format", 12)) - { - ret = WGLEW_ARB_pixel_format; - continue; - } -#endif -#ifdef WGL_ARB_pixel_format_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) - { - ret = WGLEW_ARB_pixel_format_float; - continue; - } -#endif -#ifdef WGL_ARB_render_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture", 14)) - { - ret = WGLEW_ARB_render_texture; - continue; - } -#endif -#ifdef WGL_ARB_robustness_application_isolation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) - { - ret = WGLEW_ARB_robustness_application_isolation; - continue; - } -#endif -#ifdef WGL_ARB_robustness_share_group_isolation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) - { - ret = WGLEW_ARB_robustness_share_group_isolation; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) - { -#ifdef WGL_ATI_pixel_format_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) - { - ret = WGLEW_ATI_pixel_format_float; - continue; - } -#endif -#ifdef WGL_ATI_render_texture_rectangle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture_rectangle", 24)) - { - ret = WGLEW_ATI_render_texture_rectangle; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) - { -#ifdef WGL_EXT_colorspace - if (_glewStrSame3(&pos, &len, (const GLubyte*)"colorspace", 10)) - { - ret = WGLEW_EXT_colorspace; - continue; - } -#endif -#ifdef WGL_EXT_create_context_es2_profile - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es2_profile", 26)) - { - ret = WGLEW_EXT_create_context_es2_profile; - continue; - } -#endif -#ifdef WGL_EXT_create_context_es_profile - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es_profile", 25)) - { - ret = WGLEW_EXT_create_context_es_profile; - continue; - } -#endif -#ifdef WGL_EXT_depth_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_float", 11)) - { - ret = WGLEW_EXT_depth_float; - continue; - } -#endif -#ifdef WGL_EXT_display_color_table - if (_glewStrSame3(&pos, &len, (const GLubyte*)"display_color_table", 19)) - { - ret = WGLEW_EXT_display_color_table; - continue; - } -#endif -#ifdef WGL_EXT_extensions_string - if (_glewStrSame3(&pos, &len, (const GLubyte*)"extensions_string", 17)) - { - ret = WGLEW_EXT_extensions_string; - continue; - } -#endif -#ifdef WGL_EXT_framebuffer_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) - { - ret = WGLEW_EXT_framebuffer_sRGB; - continue; - } -#endif -#ifdef WGL_EXT_make_current_read - if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) - { - ret = WGLEW_EXT_make_current_read; - continue; - } -#endif -#ifdef WGL_EXT_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = WGLEW_EXT_multisample; - continue; - } -#endif -#ifdef WGL_EXT_pbuffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) - { - ret = WGLEW_EXT_pbuffer; - continue; - } -#endif -#ifdef WGL_EXT_pixel_format - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format", 12)) - { - ret = WGLEW_EXT_pixel_format; - continue; - } -#endif -#ifdef WGL_EXT_pixel_format_packed_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_packed_float", 25)) - { - ret = WGLEW_EXT_pixel_format_packed_float; - continue; - } -#endif -#ifdef WGL_EXT_swap_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) - { - ret = WGLEW_EXT_swap_control; - continue; - } -#endif -#ifdef WGL_EXT_swap_control_tear - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control_tear", 17)) - { - ret = WGLEW_EXT_swap_control_tear; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"I3D_", 4)) - { -#ifdef WGL_I3D_digital_video_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"digital_video_control", 21)) - { - ret = WGLEW_I3D_digital_video_control; - continue; - } -#endif -#ifdef WGL_I3D_gamma - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gamma", 5)) - { - ret = WGLEW_I3D_gamma; - continue; - } -#endif -#ifdef WGL_I3D_genlock - if (_glewStrSame3(&pos, &len, (const GLubyte*)"genlock", 7)) - { - ret = WGLEW_I3D_genlock; - continue; - } -#endif -#ifdef WGL_I3D_image_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_buffer", 12)) - { - ret = WGLEW_I3D_image_buffer; - continue; - } -#endif -#ifdef WGL_I3D_swap_frame_lock - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_frame_lock", 15)) - { - ret = WGLEW_I3D_swap_frame_lock; - continue; - } -#endif -#ifdef WGL_I3D_swap_frame_usage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_frame_usage", 16)) - { - ret = WGLEW_I3D_swap_frame_usage; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) - { -#ifdef WGL_NV_DX_interop - if (_glewStrSame3(&pos, &len, (const GLubyte*)"DX_interop", 10)) - { - ret = WGLEW_NV_DX_interop; - continue; - } -#endif -#ifdef WGL_NV_DX_interop2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"DX_interop2", 11)) - { - ret = WGLEW_NV_DX_interop2; - continue; - } -#endif -#ifdef WGL_NV_copy_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) - { - ret = WGLEW_NV_copy_image; - continue; - } -#endif -#ifdef WGL_NV_delay_before_swap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"delay_before_swap", 17)) - { - ret = WGLEW_NV_delay_before_swap; - continue; - } -#endif -#ifdef WGL_NV_float_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) - { - ret = WGLEW_NV_float_buffer; - continue; - } -#endif -#ifdef WGL_NV_gpu_affinity - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_affinity", 12)) - { - ret = WGLEW_NV_gpu_affinity; - continue; - } -#endif -#ifdef WGL_NV_multigpu_context - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multigpu_context", 16)) - { - ret = WGLEW_NV_multigpu_context; - continue; - } -#endif -#ifdef WGL_NV_multisample_coverage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) - { - ret = WGLEW_NV_multisample_coverage; - continue; - } -#endif -#ifdef WGL_NV_present_video - if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) - { - ret = WGLEW_NV_present_video; - continue; - } -#endif -#ifdef WGL_NV_render_depth_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_depth_texture", 20)) - { - ret = WGLEW_NV_render_depth_texture; - continue; - } -#endif -#ifdef WGL_NV_render_texture_rectangle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture_rectangle", 24)) - { - ret = WGLEW_NV_render_texture_rectangle; - continue; - } -#endif -#ifdef WGL_NV_swap_group - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) - { - ret = WGLEW_NV_swap_group; - continue; - } -#endif -#ifdef WGL_NV_vertex_array_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) - { - ret = WGLEW_NV_vertex_array_range; - continue; - } -#endif -#ifdef WGL_NV_video_capture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) - { - ret = WGLEW_NV_video_capture; - continue; - } -#endif -#ifdef WGL_NV_video_output - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_output", 12)) - { - ret = WGLEW_NV_video_output; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) - { -#ifdef WGL_OML_sync_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync_control", 12)) - { - ret = WGLEW_OML_sync_control; - continue; - } -#endif - } - } - ret = (len == 0); - } - return ret; -} - -#elif !defined(GLEW_OSMESA) && !defined(GLEW_EGL) && !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) - -GLboolean glxewIsSupported (const char* name) -{ - const GLubyte* pos = (const GLubyte*)name; - GLuint len = _glewStrLen(pos); - GLboolean ret = GL_TRUE; - while (ret && len > 0) - { - if(_glewStrSame1(&pos, &len, (const GLubyte*)"GLX_", 4)) - { - if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) - { -#ifdef GLX_VERSION_1_2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) - { - ret = GLXEW_VERSION_1_2; - continue; - } -#endif -#ifdef GLX_VERSION_1_3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) - { - ret = GLXEW_VERSION_1_3; - continue; - } -#endif -#ifdef GLX_VERSION_1_4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) - { - ret = GLXEW_VERSION_1_4; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) - { -#ifdef GLX_3DFX_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLXEW_3DFX_multisample; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) - { -#ifdef GLX_AMD_gpu_association - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_association", 15)) - { - ret = GLXEW_AMD_gpu_association; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) - { -#ifdef GLX_ARB_context_flush_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) - { - ret = GLXEW_ARB_context_flush_control; - continue; - } -#endif -#ifdef GLX_ARB_create_context - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context", 14)) - { - ret = GLXEW_ARB_create_context; - continue; - } -#endif -#ifdef GLX_ARB_create_context_no_error - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_no_error", 23)) - { - ret = GLXEW_ARB_create_context_no_error; - continue; - } -#endif -#ifdef GLX_ARB_create_context_profile - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_profile", 22)) - { - ret = GLXEW_ARB_create_context_profile; - continue; - } -#endif -#ifdef GLX_ARB_create_context_robustness - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25)) - { - ret = GLXEW_ARB_create_context_robustness; - continue; - } -#endif -#ifdef GLX_ARB_fbconfig_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig_float", 14)) - { - ret = GLXEW_ARB_fbconfig_float; - continue; - } -#endif -#ifdef GLX_ARB_framebuffer_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) - { - ret = GLXEW_ARB_framebuffer_sRGB; - continue; - } -#endif -#ifdef GLX_ARB_get_proc_address - if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_proc_address", 16)) - { - ret = GLXEW_ARB_get_proc_address; - continue; - } -#endif -#ifdef GLX_ARB_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLXEW_ARB_multisample; - continue; - } -#endif -#ifdef GLX_ARB_robustness_application_isolation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) - { - ret = GLXEW_ARB_robustness_application_isolation; - continue; - } -#endif -#ifdef GLX_ARB_robustness_share_group_isolation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) - { - ret = GLXEW_ARB_robustness_share_group_isolation; - continue; - } -#endif -#ifdef GLX_ARB_vertex_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_object", 20)) - { - ret = GLXEW_ARB_vertex_buffer_object; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) - { -#ifdef GLX_ATI_pixel_format_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) - { - ret = GLXEW_ATI_pixel_format_float; - continue; - } -#endif -#ifdef GLX_ATI_render_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture", 14)) - { - ret = GLXEW_ATI_render_texture; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) - { -#ifdef GLX_EXT_buffer_age - if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_age", 10)) - { - ret = GLXEW_EXT_buffer_age; - continue; - } -#endif -#ifdef GLX_EXT_context_priority - if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_priority", 16)) - { - ret = GLXEW_EXT_context_priority; - continue; - } -#endif -#ifdef GLX_EXT_create_context_es2_profile - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es2_profile", 26)) - { - ret = GLXEW_EXT_create_context_es2_profile; - continue; - } -#endif -#ifdef GLX_EXT_create_context_es_profile - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es_profile", 25)) - { - ret = GLXEW_EXT_create_context_es_profile; - continue; - } -#endif -#ifdef GLX_EXT_fbconfig_packed_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig_packed_float", 21)) - { - ret = GLXEW_EXT_fbconfig_packed_float; - continue; - } -#endif -#ifdef GLX_EXT_framebuffer_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) - { - ret = GLXEW_EXT_framebuffer_sRGB; - continue; - } -#endif -#ifdef GLX_EXT_import_context - if (_glewStrSame3(&pos, &len, (const GLubyte*)"import_context", 14)) - { - ret = GLXEW_EXT_import_context; - continue; - } -#endif -#ifdef GLX_EXT_libglvnd - if (_glewStrSame3(&pos, &len, (const GLubyte*)"libglvnd", 8)) - { - ret = GLXEW_EXT_libglvnd; - continue; - } -#endif -#ifdef GLX_EXT_no_config_context - if (_glewStrSame3(&pos, &len, (const GLubyte*)"no_config_context", 17)) - { - ret = GLXEW_EXT_no_config_context; - continue; - } -#endif -#ifdef GLX_EXT_scene_marker - if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_marker", 12)) - { - ret = GLXEW_EXT_scene_marker; - continue; - } -#endif -#ifdef GLX_EXT_stereo_tree - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stereo_tree", 11)) - { - ret = GLXEW_EXT_stereo_tree; - continue; - } -#endif -#ifdef GLX_EXT_swap_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) - { - ret = GLXEW_EXT_swap_control; - continue; - } -#endif -#ifdef GLX_EXT_swap_control_tear - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control_tear", 17)) - { - ret = GLXEW_EXT_swap_control_tear; - continue; - } -#endif -#ifdef GLX_EXT_texture_from_pixmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_from_pixmap", 19)) - { - ret = GLXEW_EXT_texture_from_pixmap; - continue; - } -#endif -#ifdef GLX_EXT_visual_info - if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_info", 11)) - { - ret = GLXEW_EXT_visual_info; - continue; - } -#endif -#ifdef GLX_EXT_visual_rating - if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_rating", 13)) - { - ret = GLXEW_EXT_visual_rating; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"INTEL_", 6)) - { -#ifdef GLX_INTEL_swap_event - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_event", 10)) - { - ret = GLXEW_INTEL_swap_event; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) - { -#ifdef GLX_MESA_agp_offset - if (_glewStrSame3(&pos, &len, (const GLubyte*)"agp_offset", 10)) - { - ret = GLXEW_MESA_agp_offset; - continue; - } -#endif -#ifdef GLX_MESA_copy_sub_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_sub_buffer", 15)) - { - ret = GLXEW_MESA_copy_sub_buffer; - continue; - } -#endif -#ifdef GLX_MESA_pixmap_colormap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixmap_colormap", 15)) - { - ret = GLXEW_MESA_pixmap_colormap; - continue; - } -#endif -#ifdef GLX_MESA_query_renderer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_renderer", 14)) - { - ret = GLXEW_MESA_query_renderer; - continue; - } -#endif -#ifdef GLX_MESA_release_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"release_buffers", 15)) - { - ret = GLXEW_MESA_release_buffers; - continue; - } -#endif -#ifdef GLX_MESA_set_3dfx_mode - if (_glewStrSame3(&pos, &len, (const GLubyte*)"set_3dfx_mode", 13)) - { - ret = GLXEW_MESA_set_3dfx_mode; - continue; - } -#endif -#ifdef GLX_MESA_swap_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) - { - ret = GLXEW_MESA_swap_control; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) - { -#ifdef GLX_NV_copy_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_buffer", 11)) - { - ret = GLXEW_NV_copy_buffer; - continue; - } -#endif -#ifdef GLX_NV_copy_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) - { - ret = GLXEW_NV_copy_image; - continue; - } -#endif -#ifdef GLX_NV_delay_before_swap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"delay_before_swap", 17)) - { - ret = GLXEW_NV_delay_before_swap; - continue; - } -#endif -#ifdef GLX_NV_float_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) - { - ret = GLXEW_NV_float_buffer; - continue; - } -#endif -#ifdef GLX_NV_multigpu_context - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multigpu_context", 16)) - { - ret = GLXEW_NV_multigpu_context; - continue; - } -#endif -#ifdef GLX_NV_multisample_coverage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) - { - ret = GLXEW_NV_multisample_coverage; - continue; - } -#endif -#ifdef GLX_NV_present_video - if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) - { - ret = GLXEW_NV_present_video; - continue; - } -#endif -#ifdef GLX_NV_robustness_video_memory_purge - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_video_memory_purge", 29)) - { - ret = GLXEW_NV_robustness_video_memory_purge; - continue; - } -#endif -#ifdef GLX_NV_swap_group - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) - { - ret = GLXEW_NV_swap_group; - continue; - } -#endif -#ifdef GLX_NV_vertex_array_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) - { - ret = GLXEW_NV_vertex_array_range; - continue; - } -#endif -#ifdef GLX_NV_video_capture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) - { - ret = GLXEW_NV_video_capture; - continue; - } -#endif -#ifdef GLX_NV_video_out - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_out", 9)) - { - ret = GLXEW_NV_video_out; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) - { -#ifdef GLX_OML_swap_method - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_method", 11)) - { - ret = GLXEW_OML_swap_method; - continue; - } -#endif -#ifdef GLX_OML_sync_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync_control", 12)) - { - ret = GLXEW_OML_sync_control; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIS_", 5)) - { -#ifdef GLX_SGIS_blended_overlay - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blended_overlay", 15)) - { - ret = GLXEW_SGIS_blended_overlay; - continue; - } -#endif -#ifdef GLX_SGIS_color_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_range", 11)) - { - ret = GLXEW_SGIS_color_range; - continue; - } -#endif -#ifdef GLX_SGIS_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLXEW_SGIS_multisample; - continue; - } -#endif -#ifdef GLX_SGIS_shared_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_multisample", 18)) - { - ret = GLXEW_SGIS_shared_multisample; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIX_", 5)) - { -#ifdef GLX_SGIX_fbconfig - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig", 8)) - { - ret = GLXEW_SGIX_fbconfig; - continue; - } -#endif -#ifdef GLX_SGIX_hyperpipe - if (_glewStrSame3(&pos, &len, (const GLubyte*)"hyperpipe", 9)) - { - ret = GLXEW_SGIX_hyperpipe; - continue; - } -#endif -#ifdef GLX_SGIX_pbuffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) - { - ret = GLXEW_SGIX_pbuffer; - continue; - } -#endif -#ifdef GLX_SGIX_swap_barrier - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_barrier", 12)) - { - ret = GLXEW_SGIX_swap_barrier; - continue; - } -#endif -#ifdef GLX_SGIX_swap_group - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) - { - ret = GLXEW_SGIX_swap_group; - continue; - } -#endif -#ifdef GLX_SGIX_video_resize - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_resize", 12)) - { - ret = GLXEW_SGIX_video_resize; - continue; - } -#endif -#ifdef GLX_SGIX_visual_select_group - if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_select_group", 19)) - { - ret = GLXEW_SGIX_visual_select_group; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGI_", 4)) - { -#ifdef GLX_SGI_cushion - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cushion", 7)) - { - ret = GLXEW_SGI_cushion; - continue; - } -#endif -#ifdef GLX_SGI_make_current_read - if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) - { - ret = GLXEW_SGI_make_current_read; - continue; - } -#endif -#ifdef GLX_SGI_swap_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) - { - ret = GLXEW_SGI_swap_control; - continue; - } -#endif -#ifdef GLX_SGI_video_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_sync", 10)) - { - ret = GLXEW_SGI_video_sync; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUN_", 4)) - { -#ifdef GLX_SUN_get_transparent_index - if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_transparent_index", 21)) - { - ret = GLXEW_SUN_get_transparent_index; - continue; - } -#endif -#ifdef GLX_SUN_video_resize - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_resize", 12)) - { - ret = GLXEW_SUN_video_resize; - continue; - } -#endif - } - } - ret = (len == 0); - } - return ret; -} - -#elif defined(GLEW_EGL) - -GLboolean eglewIsSupported (const char* name) -{ - const GLubyte* pos = (const GLubyte*)name; - GLuint len = _glewStrLen(pos); - GLboolean ret = GL_TRUE; - while (ret && len > 0) - { - if(_glewStrSame1(&pos, &len, (const GLubyte*)"EGL_", 4)) - { - if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) - { -#ifdef EGL_VERSION_1_0 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_0", 3)) - { - ret = EGLEW_VERSION_1_0; - continue; - } -#endif -#ifdef EGL_VERSION_1_1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_1", 3)) - { - ret = EGLEW_VERSION_1_1; - continue; - } -#endif -#ifdef EGL_VERSION_1_2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) - { - ret = EGLEW_VERSION_1_2; - continue; - } -#endif -#ifdef EGL_VERSION_1_3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) - { - ret = EGLEW_VERSION_1_3; - continue; - } -#endif -#ifdef EGL_VERSION_1_4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) - { - ret = EGLEW_VERSION_1_4; - continue; - } -#endif -#ifdef EGL_VERSION_1_5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_5", 3)) - { - ret = EGLEW_VERSION_1_5; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ANDROID_", 8)) - { -#ifdef EGL_ANDROID_GLES_layers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"GLES_layers", 11)) - { - ret = EGLEW_ANDROID_GLES_layers; - continue; - } -#endif -#ifdef EGL_ANDROID_blob_cache - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blob_cache", 10)) - { - ret = EGLEW_ANDROID_blob_cache; - continue; - } -#endif -#ifdef EGL_ANDROID_create_native_client_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_native_client_buffer", 27)) - { - ret = EGLEW_ANDROID_create_native_client_buffer; - continue; - } -#endif -#ifdef EGL_ANDROID_framebuffer_target - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_target", 18)) - { - ret = EGLEW_ANDROID_framebuffer_target; - continue; - } -#endif -#ifdef EGL_ANDROID_front_buffer_auto_refresh - if (_glewStrSame3(&pos, &len, (const GLubyte*)"front_buffer_auto_refresh", 25)) - { - ret = EGLEW_ANDROID_front_buffer_auto_refresh; - continue; - } -#endif -#ifdef EGL_ANDROID_get_frame_timestamps - if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_frame_timestamps", 20)) - { - ret = EGLEW_ANDROID_get_frame_timestamps; - continue; - } -#endif -#ifdef EGL_ANDROID_get_native_client_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_native_client_buffer", 24)) - { - ret = EGLEW_ANDROID_get_native_client_buffer; - continue; - } -#endif -#ifdef EGL_ANDROID_image_native_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_native_buffer", 19)) - { - ret = EGLEW_ANDROID_image_native_buffer; - continue; - } -#endif -#ifdef EGL_ANDROID_native_fence_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"native_fence_sync", 17)) - { - ret = EGLEW_ANDROID_native_fence_sync; - continue; - } -#endif -#ifdef EGL_ANDROID_presentation_time - if (_glewStrSame3(&pos, &len, (const GLubyte*)"presentation_time", 17)) - { - ret = EGLEW_ANDROID_presentation_time; - continue; - } -#endif -#ifdef EGL_ANDROID_recordable - if (_glewStrSame3(&pos, &len, (const GLubyte*)"recordable", 10)) - { - ret = EGLEW_ANDROID_recordable; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ANGLE_", 6)) - { -#ifdef EGL_ANGLE_d3d_share_handle_client_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"d3d_share_handle_client_buffer", 30)) - { - ret = EGLEW_ANGLE_d3d_share_handle_client_buffer; - continue; - } -#endif -#ifdef EGL_ANGLE_device_d3d - if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_d3d", 10)) - { - ret = EGLEW_ANGLE_device_d3d; - continue; - } -#endif -#ifdef EGL_ANGLE_query_surface_pointer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_surface_pointer", 21)) - { - ret = EGLEW_ANGLE_query_surface_pointer; - continue; - } -#endif -#ifdef EGL_ANGLE_surface_d3d_texture_2d_share_handle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"surface_d3d_texture_2d_share_handle", 35)) - { - ret = EGLEW_ANGLE_surface_d3d_texture_2d_share_handle; - continue; - } -#endif -#ifdef EGL_ANGLE_window_fixed_size - if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_fixed_size", 17)) - { - ret = EGLEW_ANGLE_window_fixed_size; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARM_", 4)) - { -#ifdef EGL_ARM_image_format - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_format", 12)) - { - ret = EGLEW_ARM_image_format; - continue; - } -#endif -#ifdef EGL_ARM_implicit_external_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"implicit_external_sync", 22)) - { - ret = EGLEW_ARM_implicit_external_sync; - continue; - } -#endif -#ifdef EGL_ARM_pixmap_multisample_discard - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixmap_multisample_discard", 26)) - { - ret = EGLEW_ARM_pixmap_multisample_discard; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) - { -#ifdef EGL_EXT_bind_to_front - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bind_to_front", 13)) - { - ret = EGLEW_EXT_bind_to_front; - continue; - } -#endif -#ifdef EGL_EXT_buffer_age - if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_age", 10)) - { - ret = EGLEW_EXT_buffer_age; - continue; - } -#endif -#ifdef EGL_EXT_client_extensions - if (_glewStrSame3(&pos, &len, (const GLubyte*)"client_extensions", 17)) - { - ret = EGLEW_EXT_client_extensions; - continue; - } -#endif -#ifdef EGL_EXT_client_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"client_sync", 11)) - { - ret = EGLEW_EXT_client_sync; - continue; - } -#endif -#ifdef EGL_EXT_compositor - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compositor", 10)) - { - ret = EGLEW_EXT_compositor; - continue; - } -#endif -#ifdef EGL_EXT_create_context_robustness - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25)) - { - ret = EGLEW_EXT_create_context_robustness; - continue; - } -#endif -#ifdef EGL_EXT_device_base - if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_base", 11)) - { - ret = EGLEW_EXT_device_base; - continue; - } -#endif -#ifdef EGL_EXT_device_drm - if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_drm", 10)) - { - ret = EGLEW_EXT_device_drm; - continue; - } -#endif -#ifdef EGL_EXT_device_enumeration - if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_enumeration", 18)) - { - ret = EGLEW_EXT_device_enumeration; - continue; - } -#endif -#ifdef EGL_EXT_device_openwf - if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_openwf", 13)) - { - ret = EGLEW_EXT_device_openwf; - continue; - } -#endif -#ifdef EGL_EXT_device_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_query", 12)) - { - ret = EGLEW_EXT_device_query; - continue; - } -#endif -#ifdef EGL_EXT_gl_colorspace_bt2020_linear - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_colorspace_bt2020_linear", 27)) - { - ret = EGLEW_EXT_gl_colorspace_bt2020_linear; - continue; - } -#endif -#ifdef EGL_EXT_gl_colorspace_bt2020_pq - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_colorspace_bt2020_pq", 23)) - { - ret = EGLEW_EXT_gl_colorspace_bt2020_pq; - continue; - } -#endif -#ifdef EGL_EXT_gl_colorspace_display_p3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_colorspace_display_p3", 24)) - { - ret = EGLEW_EXT_gl_colorspace_display_p3; - continue; - } -#endif -#ifdef EGL_EXT_gl_colorspace_display_p3_linear - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_colorspace_display_p3_linear", 31)) - { - ret = EGLEW_EXT_gl_colorspace_display_p3_linear; - continue; - } -#endif -#ifdef EGL_EXT_gl_colorspace_display_p3_passthrough - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_colorspace_display_p3_passthrough", 36)) - { - ret = EGLEW_EXT_gl_colorspace_display_p3_passthrough; - continue; - } -#endif -#ifdef EGL_EXT_gl_colorspace_scrgb - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_colorspace_scrgb", 19)) - { - ret = EGLEW_EXT_gl_colorspace_scrgb; - continue; - } -#endif -#ifdef EGL_EXT_gl_colorspace_scrgb_linear - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_colorspace_scrgb_linear", 26)) - { - ret = EGLEW_EXT_gl_colorspace_scrgb_linear; - continue; - } -#endif -#ifdef EGL_EXT_image_dma_buf_import - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_dma_buf_import", 20)) - { - ret = EGLEW_EXT_image_dma_buf_import; - continue; - } -#endif -#ifdef EGL_EXT_image_dma_buf_import_modifiers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_dma_buf_import_modifiers", 30)) - { - ret = EGLEW_EXT_image_dma_buf_import_modifiers; - continue; - } -#endif -#ifdef EGL_EXT_image_gl_colorspace - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_gl_colorspace", 19)) - { - ret = EGLEW_EXT_image_gl_colorspace; - continue; - } -#endif -#ifdef EGL_EXT_image_implicit_sync_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_implicit_sync_control", 27)) - { - ret = EGLEW_EXT_image_implicit_sync_control; - continue; - } -#endif -#ifdef EGL_EXT_multiview_window - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview_window", 16)) - { - ret = EGLEW_EXT_multiview_window; - continue; - } -#endif -#ifdef EGL_EXT_output_base - if (_glewStrSame3(&pos, &len, (const GLubyte*)"output_base", 11)) - { - ret = EGLEW_EXT_output_base; - continue; - } -#endif -#ifdef EGL_EXT_output_drm - if (_glewStrSame3(&pos, &len, (const GLubyte*)"output_drm", 10)) - { - ret = EGLEW_EXT_output_drm; - continue; - } -#endif -#ifdef EGL_EXT_output_openwf - if (_glewStrSame3(&pos, &len, (const GLubyte*)"output_openwf", 13)) - { - ret = EGLEW_EXT_output_openwf; - continue; - } -#endif -#ifdef EGL_EXT_pixel_format_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) - { - ret = EGLEW_EXT_pixel_format_float; - continue; - } -#endif -#ifdef EGL_EXT_platform_base - if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_base", 13)) - { - ret = EGLEW_EXT_platform_base; - continue; - } -#endif -#ifdef EGL_EXT_platform_device - if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_device", 15)) - { - ret = EGLEW_EXT_platform_device; - continue; - } -#endif -#ifdef EGL_EXT_platform_wayland - if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_wayland", 16)) - { - ret = EGLEW_EXT_platform_wayland; - continue; - } -#endif -#ifdef EGL_EXT_platform_x11 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_x11", 12)) - { - ret = EGLEW_EXT_platform_x11; - continue; - } -#endif -#ifdef EGL_EXT_protected_content - if (_glewStrSame3(&pos, &len, (const GLubyte*)"protected_content", 17)) - { - ret = EGLEW_EXT_protected_content; - continue; - } -#endif -#ifdef EGL_EXT_protected_surface - if (_glewStrSame3(&pos, &len, (const GLubyte*)"protected_surface", 17)) - { - ret = EGLEW_EXT_protected_surface; - continue; - } -#endif -#ifdef EGL_EXT_stream_consumer_egloutput - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_consumer_egloutput", 25)) - { - ret = EGLEW_EXT_stream_consumer_egloutput; - continue; - } -#endif -#ifdef EGL_EXT_surface_CTA861_3_metadata - if (_glewStrSame3(&pos, &len, (const GLubyte*)"surface_CTA861_3_metadata", 25)) - { - ret = EGLEW_EXT_surface_CTA861_3_metadata; - continue; - } -#endif -#ifdef EGL_EXT_surface_SMPTE2086_metadata - if (_glewStrSame3(&pos, &len, (const GLubyte*)"surface_SMPTE2086_metadata", 26)) - { - ret = EGLEW_EXT_surface_SMPTE2086_metadata; - continue; - } -#endif -#ifdef EGL_EXT_swap_buffers_with_damage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_buffers_with_damage", 24)) - { - ret = EGLEW_EXT_swap_buffers_with_damage; - continue; - } -#endif -#ifdef EGL_EXT_sync_reuse - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync_reuse", 10)) - { - ret = EGLEW_EXT_sync_reuse; - continue; - } -#endif -#ifdef EGL_EXT_yuv_surface - if (_glewStrSame3(&pos, &len, (const GLubyte*)"yuv_surface", 11)) - { - ret = EGLEW_EXT_yuv_surface; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"HI_", 3)) - { -#ifdef EGL_HI_clientpixmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clientpixmap", 12)) - { - ret = EGLEW_HI_clientpixmap; - continue; - } -#endif -#ifdef EGL_HI_colorformats - if (_glewStrSame3(&pos, &len, (const GLubyte*)"colorformats", 12)) - { - ret = EGLEW_HI_colorformats; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"IMG_", 4)) - { -#ifdef EGL_IMG_context_priority - if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_priority", 16)) - { - ret = EGLEW_IMG_context_priority; - continue; - } -#endif -#ifdef EGL_IMG_image_plane_attribs - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_plane_attribs", 19)) - { - ret = EGLEW_IMG_image_plane_attribs; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"KHR_", 4)) - { -#ifdef EGL_KHR_cl_event - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cl_event", 8)) - { - ret = EGLEW_KHR_cl_event; - continue; - } -#endif -#ifdef EGL_KHR_cl_event2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cl_event2", 9)) - { - ret = EGLEW_KHR_cl_event2; - continue; - } -#endif -#ifdef EGL_KHR_client_get_all_proc_addresses - if (_glewStrSame3(&pos, &len, (const GLubyte*)"client_get_all_proc_addresses", 29)) - { - ret = EGLEW_KHR_client_get_all_proc_addresses; - continue; - } -#endif -#ifdef EGL_KHR_config_attribs - if (_glewStrSame3(&pos, &len, (const GLubyte*)"config_attribs", 14)) - { - ret = EGLEW_KHR_config_attribs; - continue; - } -#endif -#ifdef EGL_KHR_context_flush_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) - { - ret = EGLEW_KHR_context_flush_control; - continue; - } -#endif -#ifdef EGL_KHR_create_context - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context", 14)) - { - ret = EGLEW_KHR_create_context; - continue; - } -#endif -#ifdef EGL_KHR_create_context_no_error - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_no_error", 23)) - { - ret = EGLEW_KHR_create_context_no_error; - continue; - } -#endif -#ifdef EGL_KHR_debug - if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug", 5)) - { - ret = EGLEW_KHR_debug; - continue; - } -#endif -#ifdef EGL_KHR_display_reference - if (_glewStrSame3(&pos, &len, (const GLubyte*)"display_reference", 17)) - { - ret = EGLEW_KHR_display_reference; - continue; - } -#endif -#ifdef EGL_KHR_fence_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence_sync", 10)) - { - ret = EGLEW_KHR_fence_sync; - continue; - } -#endif -#ifdef EGL_KHR_get_all_proc_addresses - if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_all_proc_addresses", 22)) - { - ret = EGLEW_KHR_get_all_proc_addresses; - continue; - } -#endif -#ifdef EGL_KHR_gl_colorspace - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_colorspace", 13)) - { - ret = EGLEW_KHR_gl_colorspace; - continue; - } -#endif -#ifdef EGL_KHR_gl_renderbuffer_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_renderbuffer_image", 21)) - { - ret = EGLEW_KHR_gl_renderbuffer_image; - continue; - } -#endif -#ifdef EGL_KHR_gl_texture_2D_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_texture_2D_image", 19)) - { - ret = EGLEW_KHR_gl_texture_2D_image; - continue; - } -#endif -#ifdef EGL_KHR_gl_texture_3D_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_texture_3D_image", 19)) - { - ret = EGLEW_KHR_gl_texture_3D_image; - continue; - } -#endif -#ifdef EGL_KHR_gl_texture_cubemap_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_texture_cubemap_image", 24)) - { - ret = EGLEW_KHR_gl_texture_cubemap_image; - continue; - } -#endif -#ifdef EGL_KHR_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image", 5)) - { - ret = EGLEW_KHR_image; - continue; - } -#endif -#ifdef EGL_KHR_image_base - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_base", 10)) - { - ret = EGLEW_KHR_image_base; - continue; - } -#endif -#ifdef EGL_KHR_image_pixmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_pixmap", 12)) - { - ret = EGLEW_KHR_image_pixmap; - continue; - } -#endif -#ifdef EGL_KHR_lock_surface - if (_glewStrSame3(&pos, &len, (const GLubyte*)"lock_surface", 12)) - { - ret = EGLEW_KHR_lock_surface; - continue; - } -#endif -#ifdef EGL_KHR_lock_surface2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"lock_surface2", 13)) - { - ret = EGLEW_KHR_lock_surface2; - continue; - } -#endif -#ifdef EGL_KHR_lock_surface3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"lock_surface3", 13)) - { - ret = EGLEW_KHR_lock_surface3; - continue; - } -#endif -#ifdef EGL_KHR_mutable_render_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"mutable_render_buffer", 21)) - { - ret = EGLEW_KHR_mutable_render_buffer; - continue; - } -#endif -#ifdef EGL_KHR_no_config_context - if (_glewStrSame3(&pos, &len, (const GLubyte*)"no_config_context", 17)) - { - ret = EGLEW_KHR_no_config_context; - continue; - } -#endif -#ifdef EGL_KHR_partial_update - if (_glewStrSame3(&pos, &len, (const GLubyte*)"partial_update", 14)) - { - ret = EGLEW_KHR_partial_update; - continue; - } -#endif -#ifdef EGL_KHR_platform_android - if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_android", 16)) - { - ret = EGLEW_KHR_platform_android; - continue; - } -#endif -#ifdef EGL_KHR_platform_gbm - if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_gbm", 12)) - { - ret = EGLEW_KHR_platform_gbm; - continue; - } -#endif -#ifdef EGL_KHR_platform_wayland - if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_wayland", 16)) - { - ret = EGLEW_KHR_platform_wayland; - continue; - } -#endif -#ifdef EGL_KHR_platform_x11 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_x11", 12)) - { - ret = EGLEW_KHR_platform_x11; - continue; - } -#endif -#ifdef EGL_KHR_reusable_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"reusable_sync", 13)) - { - ret = EGLEW_KHR_reusable_sync; - continue; - } -#endif -#ifdef EGL_KHR_stream - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream", 6)) - { - ret = EGLEW_KHR_stream; - continue; - } -#endif -#ifdef EGL_KHR_stream_attrib - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_attrib", 13)) - { - ret = EGLEW_KHR_stream_attrib; - continue; - } -#endif -#ifdef EGL_KHR_stream_consumer_gltexture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_consumer_gltexture", 25)) - { - ret = EGLEW_KHR_stream_consumer_gltexture; - continue; - } -#endif -#ifdef EGL_KHR_stream_cross_process_fd - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_process_fd", 23)) - { - ret = EGLEW_KHR_stream_cross_process_fd; - continue; - } -#endif -#ifdef EGL_KHR_stream_fifo - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_fifo", 11)) - { - ret = EGLEW_KHR_stream_fifo; - continue; - } -#endif -#ifdef EGL_KHR_stream_producer_aldatalocator - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_producer_aldatalocator", 29)) - { - ret = EGLEW_KHR_stream_producer_aldatalocator; - continue; - } -#endif -#ifdef EGL_KHR_stream_producer_eglsurface - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_producer_eglsurface", 26)) - { - ret = EGLEW_KHR_stream_producer_eglsurface; - continue; - } -#endif -#ifdef EGL_KHR_surfaceless_context - if (_glewStrSame3(&pos, &len, (const GLubyte*)"surfaceless_context", 19)) - { - ret = EGLEW_KHR_surfaceless_context; - continue; - } -#endif -#ifdef EGL_KHR_swap_buffers_with_damage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_buffers_with_damage", 24)) - { - ret = EGLEW_KHR_swap_buffers_with_damage; - continue; - } -#endif -#ifdef EGL_KHR_vg_parent_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vg_parent_image", 15)) - { - ret = EGLEW_KHR_vg_parent_image; - continue; - } -#endif -#ifdef EGL_KHR_wait_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"wait_sync", 9)) - { - ret = EGLEW_KHR_wait_sync; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) - { -#ifdef EGL_MESA_drm_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"drm_image", 9)) - { - ret = EGLEW_MESA_drm_image; - continue; - } -#endif -#ifdef EGL_MESA_image_dma_buf_export - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_dma_buf_export", 20)) - { - ret = EGLEW_MESA_image_dma_buf_export; - continue; - } -#endif -#ifdef EGL_MESA_platform_gbm - if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_gbm", 12)) - { - ret = EGLEW_MESA_platform_gbm; - continue; - } -#endif -#ifdef EGL_MESA_platform_surfaceless - if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_surfaceless", 20)) - { - ret = EGLEW_MESA_platform_surfaceless; - continue; - } -#endif -#ifdef EGL_MESA_query_driver - if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_driver", 12)) - { - ret = EGLEW_MESA_query_driver; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"NOK_", 4)) - { -#ifdef EGL_NOK_swap_region - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_region", 11)) - { - ret = EGLEW_NOK_swap_region; - continue; - } -#endif -#ifdef EGL_NOK_swap_region2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_region2", 12)) - { - ret = EGLEW_NOK_swap_region2; - continue; - } -#endif -#ifdef EGL_NOK_texture_from_pixmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_from_pixmap", 19)) - { - ret = EGLEW_NOK_texture_from_pixmap; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) - { -#ifdef EGL_NV_3dvision_surface - if (_glewStrSame3(&pos, &len, (const GLubyte*)"3dvision_surface", 16)) - { - ret = EGLEW_NV_3dvision_surface; - continue; - } -#endif -#ifdef EGL_NV_context_priority_realtime - if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_priority_realtime", 25)) - { - ret = EGLEW_NV_context_priority_realtime; - continue; - } -#endif -#ifdef EGL_NV_coverage_sample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"coverage_sample", 15)) - { - ret = EGLEW_NV_coverage_sample; - continue; - } -#endif -#ifdef EGL_NV_coverage_sample_resolve - if (_glewStrSame3(&pos, &len, (const GLubyte*)"coverage_sample_resolve", 23)) - { - ret = EGLEW_NV_coverage_sample_resolve; - continue; - } -#endif -#ifdef EGL_NV_cuda_event - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cuda_event", 10)) - { - ret = EGLEW_NV_cuda_event; - continue; - } -#endif -#ifdef EGL_NV_depth_nonlinear - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_nonlinear", 15)) - { - ret = EGLEW_NV_depth_nonlinear; - continue; - } -#endif -#ifdef EGL_NV_device_cuda - if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_cuda", 11)) - { - ret = EGLEW_NV_device_cuda; - continue; - } -#endif -#ifdef EGL_NV_native_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"native_query", 12)) - { - ret = EGLEW_NV_native_query; - continue; - } -#endif -#ifdef EGL_NV_post_convert_rounding - if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_convert_rounding", 21)) - { - ret = EGLEW_NV_post_convert_rounding; - continue; - } -#endif -#ifdef EGL_NV_post_sub_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_sub_buffer", 15)) - { - ret = EGLEW_NV_post_sub_buffer; - continue; - } -#endif -#ifdef EGL_NV_quadruple_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"quadruple_buffer", 16)) - { - ret = EGLEW_NV_quadruple_buffer; - continue; - } -#endif -#ifdef EGL_NV_robustness_video_memory_purge - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_video_memory_purge", 29)) - { - ret = EGLEW_NV_robustness_video_memory_purge; - continue; - } -#endif -#ifdef EGL_NV_stream_consumer_gltexture_yuv - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_consumer_gltexture_yuv", 29)) - { - ret = EGLEW_NV_stream_consumer_gltexture_yuv; - continue; - } -#endif -#ifdef EGL_NV_stream_cross_display - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_display", 20)) - { - ret = EGLEW_NV_stream_cross_display; - continue; - } -#endif -#ifdef EGL_NV_stream_cross_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_object", 19)) - { - ret = EGLEW_NV_stream_cross_object; - continue; - } -#endif -#ifdef EGL_NV_stream_cross_partition - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_partition", 22)) - { - ret = EGLEW_NV_stream_cross_partition; - continue; - } -#endif -#ifdef EGL_NV_stream_cross_process - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_process", 20)) - { - ret = EGLEW_NV_stream_cross_process; - continue; - } -#endif -#ifdef EGL_NV_stream_cross_system - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_system", 19)) - { - ret = EGLEW_NV_stream_cross_system; - continue; - } -#endif -#ifdef EGL_NV_stream_dma - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_dma", 10)) - { - ret = EGLEW_NV_stream_dma; - continue; - } -#endif -#ifdef EGL_NV_stream_fifo_next - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_fifo_next", 16)) - { - ret = EGLEW_NV_stream_fifo_next; - continue; - } -#endif -#ifdef EGL_NV_stream_fifo_synchronous - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_fifo_synchronous", 23)) - { - ret = EGLEW_NV_stream_fifo_synchronous; - continue; - } -#endif -#ifdef EGL_NV_stream_flush - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_flush", 12)) - { - ret = EGLEW_NV_stream_flush; - continue; - } -#endif -#ifdef EGL_NV_stream_frame_limits - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_frame_limits", 19)) - { - ret = EGLEW_NV_stream_frame_limits; - continue; - } -#endif -#ifdef EGL_NV_stream_metadata - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_metadata", 15)) - { - ret = EGLEW_NV_stream_metadata; - continue; - } -#endif -#ifdef EGL_NV_stream_origin - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_origin", 13)) - { - ret = EGLEW_NV_stream_origin; - continue; - } -#endif -#ifdef EGL_NV_stream_remote - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_remote", 13)) - { - ret = EGLEW_NV_stream_remote; - continue; - } -#endif -#ifdef EGL_NV_stream_reset - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_reset", 12)) - { - ret = EGLEW_NV_stream_reset; - continue; - } -#endif -#ifdef EGL_NV_stream_socket - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_socket", 13)) - { - ret = EGLEW_NV_stream_socket; - continue; - } -#endif -#ifdef EGL_NV_stream_socket_inet - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_socket_inet", 18)) - { - ret = EGLEW_NV_stream_socket_inet; - continue; - } -#endif -#ifdef EGL_NV_stream_socket_unix - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_socket_unix", 18)) - { - ret = EGLEW_NV_stream_socket_unix; - continue; - } -#endif -#ifdef EGL_NV_stream_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_sync", 11)) - { - ret = EGLEW_NV_stream_sync; - continue; - } -#endif -#ifdef EGL_NV_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync", 4)) - { - ret = EGLEW_NV_sync; - continue; - } -#endif -#ifdef EGL_NV_system_time - if (_glewStrSame3(&pos, &len, (const GLubyte*)"system_time", 11)) - { - ret = EGLEW_NV_system_time; - continue; - } -#endif -#ifdef EGL_NV_triple_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"triple_buffer", 13)) - { - ret = EGLEW_NV_triple_buffer; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"TIZEN_", 6)) - { -#ifdef EGL_TIZEN_image_native_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_native_buffer", 19)) - { - ret = EGLEW_TIZEN_image_native_buffer; - continue; - } -#endif -#ifdef EGL_TIZEN_image_native_surface - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_native_surface", 20)) - { - ret = EGLEW_TIZEN_image_native_surface; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"WL_", 3)) - { -#ifdef EGL_WL_bind_wayland_display - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bind_wayland_display", 20)) - { - ret = EGLEW_WL_bind_wayland_display; - continue; - } -#endif -#ifdef EGL_WL_create_wayland_buffer_from_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_wayland_buffer_from_image", 32)) - { - ret = EGLEW_WL_create_wayland_buffer_from_image; - continue; - } -#endif - } - } - ret = (len == 0); - } - return ret; -} - -#endif /* _WIN32 */ diff --git a/src/hints/HintsToPot.cpp b/src/hints/HintsToPot.cpp index 7c8029cdeb8..4791f0612f2 100644 --- a/src/hints/HintsToPot.cpp +++ b/src/hints/HintsToPot.cpp @@ -9,7 +9,7 @@ bool write_to_pot(boost::filesystem::path path, const std::vector>& data) { - boost::filesystem::ofstream file(std::move(path), std::ios_base::app); + boost::nowide::ofstream file(path.string(), std::ios_base::app); for (const auto& element : data) { //Example of .pot element diff --git a/src/imgui/CMakeLists.txt b/src/imgui/CMakeLists.txt index 235afe11050..5239eb3d5c4 100644 --- a/src/imgui/CMakeLists.txt +++ b/src/imgui/CMakeLists.txt @@ -3,14 +3,17 @@ project(imgui) add_library(imgui STATIC imconfig.h + imgui.cpp imgui.h + imgui_demo.cpp + imgui_draw.cpp imgui_internal.h + imgui_stdlib.cpp + imgui_stdlib.h + imgui_tables.cpp + imgui_widgets.cpp + # imgui STB imstb_rectpack.h imstb_textedit.h imstb_truetype.h - imgui_tables.cpp - imgui.cpp - imgui_demo.cpp - imgui_draw.cpp - imgui_widgets.cpp ) diff --git a/src/imgui/README.md b/src/imgui/README.md index c937d975b77..9413811ae2e 100644 --- a/src/imgui/README.md +++ b/src/imgui/README.md @@ -4,6 +4,25 @@ For more information go to https://github.com/ocornut/imgui THIS DIRECTORY CONTAINS THE imgui-1.83 ad5d1a8 SOURCE DISTRIBUTION. + Customized with the following commits: f93d0001baa5443da2c6510d11b03c675e652418 b71d787f695c779e571865d5214d4da8d50aa7c5 + +imgui_stdlib.h + imgui_stdlib.cpp are move from directory /imgui/misc/cpp/ +InputText() wrappers for C++ standard library (STL) type: std::string. +This is also an example of how you may wrap your own similar types. + +imstb_truetype.h modification: + +Hot fix for open symbolic fonts on windows +62bdfe6f8d04b88e8bd511cd613be80c0baa7f55 +Add case STBTT_MS_EID_SYMBOL to swith in file imstb_truetype.h on line 1440. + +Hot fix for open curved fonts mainly on MAC +2148e49f75d82cb19dc6ec409fb7825296ed005c +viz. https://github.com/nothings/stb/issues/1296 +In file imstb_truetype.h line 1667 change malloc size from: +vertices = (stbtt_vertex *) STBTT_malloc((m + 1) * sizeof(vertices[0]), info->userdata); +to: +vertices = (stbtt_vertex *) STBTT_malloc(m * sizeof(vertices[0]), info->userdata); \ No newline at end of file diff --git a/src/imgui/imconfig.h b/src/imgui/imconfig.h index 09c80a9d9b6..dff8aea9f72 100644 --- a/src/imgui/imconfig.h +++ b/src/imgui/imconfig.h @@ -140,6 +140,7 @@ namespace ImGui const wchar_t CancelButton = 0x14; const wchar_t CancelHoverButton = 0x15; // const wchar_t VarLayerHeightMarker = 0x16; + const wchar_t RevertButton = 0x16; const wchar_t RightArrowButton = 0x18; const wchar_t RightArrowHoverButton = 0x19; @@ -149,13 +150,40 @@ namespace ImGui // const wchar_t CustomSupportsMarker = 0x1D; // const wchar_t CustomSeamMarker = 0x1E; // const wchar_t MmuSegmentationMarker = 0x1F; + const wchar_t PlugMarker = 0x1C; + const wchar_t DowelMarker = 0x1D; // Do not forget use following letters only in wstring const wchar_t DocumentationButton = 0x2600; const wchar_t DocumentationHoverButton = 0x2601; const wchar_t ClippyMarker = 0x2602; const wchar_t InfoMarker = 0x2603; const wchar_t SliderFloatEditBtnIcon = 0x2604; - -// void MyFunction(const char* name, const MyMatrix44& v); + const wchar_t SliderFloatEditBtnPressedIcon = 0x2605; + const wchar_t ClipboardBtnIcon = 0x2606; + const wchar_t PlayButton = 0x2618; + const wchar_t PlayHoverButton = 0x2619; + const wchar_t PauseButton = 0x261A; + const wchar_t PauseHoverButton = 0x261B; + const wchar_t OpenButton = 0x261C; + const wchar_t OpenHoverButton = 0x261D; + + const wchar_t LegendTravel = 0x2701; + const wchar_t LegendWipe = 0x2702; + const wchar_t LegendRetract = 0x2703; + const wchar_t LegendDeretract = 0x2704; + const wchar_t LegendSeams = 0x2705; + const wchar_t LegendToolChanges = 0x2706; + const wchar_t LegendColorChanges = 0x2707; + const wchar_t LegendPausePrints = 0x2708; + const wchar_t LegendCustomGCodes = 0x2709; + const wchar_t LegendCOG = 0x2710; + const wchar_t LegendShells = 0x2711; + const wchar_t LegendToolMarker = 0x2712; + const wchar_t WarningMarkerSmall = 0x2713; + const wchar_t ExpandBtn = 0x2714; + const wchar_t InfoMarkerSmall = 0x2716; + const wchar_t CollapseBtn = 0x2715; + + // void MyFunction(const char* name, const MyMatrix44& v); } diff --git a/src/imgui/imgui_stdlib.cpp b/src/imgui/imgui_stdlib.cpp new file mode 100644 index 00000000000..cb1fe1743d8 --- /dev/null +++ b/src/imgui/imgui_stdlib.cpp @@ -0,0 +1,76 @@ +// dear imgui: wrappers for C++ standard library (STL) types (std::string, etc.) +// This is also an example of how you may wrap your own similar types. + +// Compatibility: +// - std::string support is only guaranteed to work from C++11. +// If you try to use it pre-C++11, please share your findings (w/ info about compiler/architecture) + +// Changelog: +// - v0.10: Initial version. Added InputText() / InputTextMultiline() calls with std::string + +#include "imgui.h" +#include "imgui_stdlib.h" + +struct InputTextCallback_UserData +{ + std::string* Str; + ImGuiInputTextCallback ChainCallback; + void* ChainCallbackUserData; +}; + +static int InputTextCallback(ImGuiInputTextCallbackData* data) +{ + InputTextCallback_UserData* user_data = (InputTextCallback_UserData*)data->UserData; + if (data->EventFlag == ImGuiInputTextFlags_CallbackResize) + { + // Resize string callback + // If for some reason we refuse the new length (BufTextLen) and/or capacity (BufSize) we need to set them back to what we want. + std::string* str = user_data->Str; + IM_ASSERT(data->Buf == str->c_str()); + str->resize(data->BufTextLen); + data->Buf = (char*)str->c_str(); + } + else if (user_data->ChainCallback) + { + // Forward to user callback, if any + data->UserData = user_data->ChainCallbackUserData; + return user_data->ChainCallback(data); + } + return 0; +} + +bool ImGui::InputText(const char* label, std::string* str, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) +{ + IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); + flags |= ImGuiInputTextFlags_CallbackResize; + + InputTextCallback_UserData cb_user_data; + cb_user_data.Str = str; + cb_user_data.ChainCallback = callback; + cb_user_data.ChainCallbackUserData = user_data; + return InputText(label, (char*)str->c_str(), str->capacity() + 1, flags, InputTextCallback, &cb_user_data); +} + +bool ImGui::InputTextMultiline(const char* label, std::string* str, const ImVec2& size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) +{ + IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); + flags |= ImGuiInputTextFlags_CallbackResize; + + InputTextCallback_UserData cb_user_data; + cb_user_data.Str = str; + cb_user_data.ChainCallback = callback; + cb_user_data.ChainCallbackUserData = user_data; + return InputTextMultiline(label, (char*)str->c_str(), str->capacity() + 1, size, flags, InputTextCallback, &cb_user_data); +} + +bool ImGui::InputTextWithHint(const char* label, const char* hint, std::string* str, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) +{ + IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); + flags |= ImGuiInputTextFlags_CallbackResize; + + InputTextCallback_UserData cb_user_data; + cb_user_data.Str = str; + cb_user_data.ChainCallback = callback; + cb_user_data.ChainCallbackUserData = user_data; + return InputTextWithHint(label, hint, (char*)str->c_str(), str->capacity() + 1, flags, InputTextCallback, &cb_user_data); +} diff --git a/src/imgui/imgui_stdlib.h b/src/imgui/imgui_stdlib.h new file mode 100644 index 00000000000..f860b0c780b --- /dev/null +++ b/src/imgui/imgui_stdlib.h @@ -0,0 +1,22 @@ +// dear imgui: wrappers for C++ standard library (STL) types (std::string, etc.) +// This is also an example of how you may wrap your own similar types. + +// Compatibility: +// - std::string support is only guaranteed to work from C++11. +// If you try to use it pre-C++11, please share your findings (w/ info about compiler/architecture) + +// Changelog: +// - v0.10: Initial version. Added InputText() / InputTextMultiline() calls with std::string + +#pragma once + +#include + +namespace ImGui +{ + // ImGui::InputText() with std::string + // Because text input needs dynamic resizing, we need to setup a callback to grow the capacity + IMGUI_API bool InputText(const char* label, std::string* str, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); + IMGUI_API bool InputTextMultiline(const char* label, std::string* str, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); + IMGUI_API bool InputTextWithHint(const char* label, const char* hint, std::string* str, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); +} diff --git a/src/imgui/imstb_truetype.h b/src/imgui/imstb_truetype.h index fc815d74522..90a4a31445b 100644 --- a/src/imgui/imstb_truetype.h +++ b/src/imgui/imstb_truetype.h @@ -1437,6 +1437,7 @@ static int stbtt_InitFont_internal(stbtt_fontinfo *info, unsigned char *data, in switch(ttUSHORT(data+encoding_record)) { case STBTT_PLATFORM_ID_MICROSOFT: switch (ttUSHORT(data+encoding_record+2)) { + case STBTT_MS_EID_SYMBOL: case STBTT_MS_EID_UNICODE_BMP: case STBTT_MS_EID_UNICODE_FULL: // MS/Unicode @@ -1734,7 +1735,7 @@ static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, s // now start the new one start_off = !(flags & 1); - if (start_off) { + if (start_off && (i + 1) < n) { // if we start off with an off-curve point, then when we need to find a point on the curve // where we can start, and we need to save some state for when we wraparound. scx = x; diff --git a/src/libnest2d/include/libnest2d/geometry_traits.hpp b/src/libnest2d/include/libnest2d/geometry_traits.hpp index f388e37b115..a179e4c9410 100644 --- a/src/libnest2d/include/libnest2d/geometry_traits.hpp +++ b/src/libnest2d/include/libnest2d/geometry_traits.hpp @@ -198,9 +198,11 @@ class _Box: PointPair

    { inline P center() const BP2D_NOEXCEPT; - template> + template> inline Unit area() const BP2D_NOEXCEPT { - return Unit(width())*height(); + constexpr TCoord

    Zero{0}; + Unit s = width() < Zero || height() < Zero ? Unit(-1) : Unit(1); + return s * libnest2d::abs(Unit(width()) * height()); } static inline _Box infinite(const P ¢er = {TCoord

    (0), TCoord

    (0)}); @@ -869,7 +871,7 @@ template auto rcend(const P& p) -> decltype(_backward(cbegin(p))) template TPoint

    front(const P& p) { return *shapelike::cbegin(p); } template TPoint

    back (const P& p) { - return *backward(shapelike::cend(p)); + return *std::prev(shapelike::cend(p)); } // Optional, does nothing by default diff --git a/src/libnest2d/include/libnest2d/geometry_traits_nfp.hpp b/src/libnest2d/include/libnest2d/geometry_traits_nfp.hpp index d9f94780268..cce1fdc398e 100644 --- a/src/libnest2d/include/libnest2d/geometry_traits_nfp.hpp +++ b/src/libnest2d/include/libnest2d/geometry_traits_nfp.hpp @@ -315,460 +315,6 @@ inline NfpResult nfpConvexOnly(const RawShape& sh, return {rsh, top_nfp}; } -template -NfpResult nfpSimpleSimple(const RawShape& cstationary, - const RawShape& cother) -{ - - // Algorithms are from the original algorithm proposed in paper: - // https://eprints.soton.ac.uk/36850/1/CORMSIS-05-05.pdf - - // ///////////////////////////////////////////////////////////////////////// - // Algorithm 1: Obtaining the minkowski sum - // ///////////////////////////////////////////////////////////////////////// - - // I guess this is not a full minkowski sum of the two input polygons by - // definition. This yields a subset that is compatible with the next 2 - // algorithms. - - using Result = NfpResult; - using Vertex = TPoint; - using Coord = TCoord; - using Edge = _Segment; - namespace sl = shapelike; - using std::signbit; - using std::sort; - using std::vector; - using std::ref; - using std::reference_wrapper; - - // TODO The original algorithms expects the stationary polygon in - // counter clockwise and the orbiter in clockwise order. - // So for preventing any further complication, I will make the input - // the way it should be, than make my way around the orientations. - - // Reverse the stationary contour to counter clockwise - auto stcont = sl::contour(cstationary); - { - std::reverse(sl::begin(stcont), sl::end(stcont)); - stcont.pop_back(); - auto it = std::min_element(sl::begin(stcont), sl::end(stcont), - [](const Vertex& v1, const Vertex& v2) { - return getY(v1) < getY(v2); - }); - std::rotate(sl::begin(stcont), it, sl::end(stcont)); - sl::addVertex(stcont, sl::front(stcont)); - } - RawShape stationary; - sl::contour(stationary) = stcont; - - // Reverse the orbiter contour to counter clockwise - auto orbcont = sl::contour(cother); - { - std::reverse(orbcont.begin(), orbcont.end()); - - // Step 1: Make the orbiter reverse oriented - - orbcont.pop_back(); - auto it = std::min_element(orbcont.begin(), orbcont.end(), - [](const Vertex& v1, const Vertex& v2) { - return getY(v1) < getY(v2); - }); - - std::rotate(orbcont.begin(), it, orbcont.end()); - orbcont.emplace_back(orbcont.front()); - - for(auto &v : orbcont) v = -v; - - } - - // Copy the orbiter (contour only), we will have to work on it - RawShape orbiter; - sl::contour(orbiter) = orbcont; - - // An edge with additional data for marking it - struct MarkedEdge { - Edge e; Radians turn_angle = 0; bool is_turning_point = false; - MarkedEdge() = default; - MarkedEdge(const Edge& ed, Radians ta, bool tp): - e(ed), turn_angle(ta), is_turning_point(tp) {} - - // debug - std::string label; - }; - - // Container for marked edges - using EdgeList = vector; - - EdgeList A, B; - - // This is how an edge list is created from the polygons - auto fillEdgeList = [](EdgeList& L, const RawShape& ppoly, int dir) { - auto& poly = sl::contour(ppoly); - - L.reserve(sl::contourVertexCount(poly)); - - if(dir > 0) { - auto it = poly.begin(); - auto nextit = std::next(it); - - double turn_angle = 0; - bool is_turn_point = false; - - while(nextit != poly.end()) { - L.emplace_back(Edge(*it, *nextit), turn_angle, is_turn_point); - it++; nextit++; - } - } else { - auto it = sl::rbegin(poly); - auto nextit = std::next(it); - - double turn_angle = 0; - bool is_turn_point = false; - - while(nextit != sl::rend(poly)) { - L.emplace_back(Edge(*it, *nextit), turn_angle, is_turn_point); - it++; nextit++; - } - } - - auto getTurnAngle = [](const Edge& e1, const Edge& e2) { - auto phi = e1.angleToXaxis(); - auto phi_prev = e2.angleToXaxis(); - auto turn_angle = phi-phi_prev; - if(turn_angle > Pi) turn_angle -= TwoPi; - if(turn_angle < -Pi) turn_angle += TwoPi; - return turn_angle; - }; - - auto eit = L.begin(); - auto enext = std::next(eit); - - eit->turn_angle = getTurnAngle(L.front().e, L.back().e); - - while(enext != L.end()) { - enext->turn_angle = getTurnAngle( enext->e, eit->e); - eit->is_turning_point = - signbit(enext->turn_angle) != signbit(eit->turn_angle); - ++eit; ++enext; - } - - L.back().is_turning_point = signbit(L.back().turn_angle) != - signbit(L.front().turn_angle); - - }; - - // Step 2: Fill the edgelists - fillEdgeList(A, stationary, 1); - fillEdgeList(B, orbiter, 1); - - int i = 1; - for(MarkedEdge& me : A) { - std::cout << "a" << i << ":\n\t" - << getX(me.e.first()) << " " << getY(me.e.first()) << "\n\t" - << getX(me.e.second()) << " " << getY(me.e.second()) << "\n\t" - << "Turning point: " << (me.is_turning_point ? "yes" : "no") - << std::endl; - - me.label = "a"; me.label += std::to_string(i); - i++; - } - - i = 1; - for(MarkedEdge& me : B) { - std::cout << "b" << i << ":\n\t" - << getX(me.e.first()) << " " << getY(me.e.first()) << "\n\t" - << getX(me.e.second()) << " " << getY(me.e.second()) << "\n\t" - << "Turning point: " << (me.is_turning_point ? "yes" : "no") - << std::endl; - me.label = "b"; me.label += std::to_string(i); - i++; - } - - // A reference to a marked edge that also knows its container - struct MarkedEdgeRef { - reference_wrapper eref; - reference_wrapper> container; - Coord dir = 1; // Direction modifier - - inline Radians angleX() const { return eref.get().e.angleToXaxis(); } - inline const Edge& edge() const { return eref.get().e; } - inline Edge& edge() { return eref.get().e; } - inline bool isTurningPoint() const { - return eref.get().is_turning_point; - } - inline bool isFrom(const vector& cont ) { - return &(container.get()) == &cont; - } - inline bool eq(const MarkedEdgeRef& mr) { - return &(eref.get()) == &(mr.eref.get()); - } - - MarkedEdgeRef(reference_wrapper er, - reference_wrapper> ec): - eref(er), container(ec), dir(1) {} - - MarkedEdgeRef(reference_wrapper er, - reference_wrapper> ec, - Coord d): - eref(er), container(ec), dir(d) {} - }; - - using EdgeRefList = vector; - - // Comparing two marked edges - auto sortfn = [](const MarkedEdgeRef& e1, const MarkedEdgeRef& e2) { - return e1.angleX() < e2.angleX(); - }; - - EdgeRefList Aref, Bref; // We create containers for the references - Aref.reserve(A.size()); Bref.reserve(B.size()); - - // Fill reference container for the stationary polygon - std::for_each(A.begin(), A.end(), [&Aref](MarkedEdge& me) { - Aref.emplace_back( ref(me), ref(Aref) ); - }); - - // Fill reference container for the orbiting polygon - std::for_each(B.begin(), B.end(), [&Bref](MarkedEdge& me) { - Bref.emplace_back( ref(me), ref(Bref) ); - }); - - auto mink = [sortfn] // the Mink(Q, R, direction) sub-procedure - (const EdgeRefList& Q, const EdgeRefList& R, bool positive) - { - - // Step 1 "merge sort_list(Q) and sort_list(R) to form merge_list(Q,R)" - // Sort the containers of edge references and merge them. - // Q could be sorted only once and be reused here but we would still - // need to merge it with sorted(R). - - EdgeRefList merged; - EdgeRefList S, seq; - merged.reserve(Q.size() + R.size()); - - merged.insert(merged.end(), R.begin(), R.end()); - std::stable_sort(merged.begin(), merged.end(), sortfn); - merged.insert(merged.end(), Q.begin(), Q.end()); - std::stable_sort(merged.begin(), merged.end(), sortfn); - - // Step 2 "set i = 1, k = 1, direction = 1, s1 = q1" - // we don't use i, instead, q is an iterator into Q. k would be an index - // into the merged sequence but we use "it" as an iterator for that - - // here we obtain references for the containers for later comparisons - const auto& Rcont = R.begin()->container.get(); - const auto& Qcont = Q.begin()->container.get(); - - // Set the initial direction - Coord dir = 1; - - // roughly i = 1 (so q = Q.begin()) and s1 = q1 so S[0] = q; - if(positive) { - auto q = Q.begin(); - S.emplace_back(*q); - - // Roughly step 3 - - std::cout << "merged size: " << merged.size() << std::endl; - auto mit = merged.begin(); - for(bool finish = false; !finish && q != Q.end();) { - ++q; // "Set i = i + 1" - - while(!finish && mit != merged.end()) { - if(mit->isFrom(Rcont)) { - auto s = *mit; - s.dir = dir; - S.emplace_back(s); - } - - if(mit->eq(*q)) { - S.emplace_back(*q); - if(mit->isTurningPoint()) dir = -dir; - if(q == Q.begin()) finish = true; - break; - } - - mit += dir; - // __nfp::advance(mit, merged, dir > 0); - } - } - } else { - auto q = Q.rbegin(); - S.emplace_back(*q); - - // Roughly step 3 - - std::cout << "merged size: " << merged.size() << std::endl; - auto mit = merged.begin(); - for(bool finish = false; !finish && q != Q.rend();) { - ++q; // "Set i = i + 1" - - while(!finish && mit != merged.end()) { - if(mit->isFrom(Rcont)) { - auto s = *mit; - s.dir = dir; - S.emplace_back(s); - } - - if(mit->eq(*q)) { - S.emplace_back(*q); - S.back().dir = -1; - if(mit->isTurningPoint()) dir = -dir; - if(q == Q.rbegin()) finish = true; - break; - } - - mit += dir; - // __nfp::advance(mit, merged, dir > 0); - } - } - } - - - // Step 4: - - // "Let starting edge r1 be in position si in sequence" - // whaaat? I guess this means the following: - auto it = S.begin(); - while(!it->eq(*R.begin())) ++it; - - // "Set j = 1, next = 2, direction = 1, seq1 = si" - // we don't use j, seq is expanded dynamically. - dir = 1; - auto next = std::next(R.begin()); seq.emplace_back(*it); - - // Step 5: - // "If all si edges have been allocated to seqj" should mean that - // we loop until seq has equal size with S - auto send = it; //it == S.begin() ? it : std::prev(it); - while(it != S.end()) { - ++it; if(it == S.end()) it = S.begin(); - if(it == send) break; - - if(it->isFrom(Qcont)) { - seq.emplace_back(*it); // "If si is from Q, j = j + 1, seqj = si" - - // "If si is a turning point in Q, - // direction = - direction, next = next + direction" - if(it->isTurningPoint()) { - dir = -dir; - next += dir; -// __nfp::advance(next, R, dir > 0); - } - } - - if(it->eq(*next) /*&& dir == next->dir*/) { // "If si = direction.rnext" - // "j = j + 1, seqj = si, next = next + direction" - seq.emplace_back(*it); - next += dir; -// __nfp::advance(next, R, dir > 0); - } - } - - return seq; - }; - - std::vector seqlist; - seqlist.reserve(Bref.size()); - - EdgeRefList Bslope = Bref; // copy Bref, we will make a slope diagram - - // make the slope diagram of B - std::sort(Bslope.begin(), Bslope.end(), sortfn); - - auto slopeit = Bslope.begin(); // search for the first turning point - while(!slopeit->isTurningPoint() && slopeit != Bslope.end()) slopeit++; - - if(slopeit == Bslope.end()) { - // no turning point means convex polygon. - seqlist.emplace_back(mink(Aref, Bref, true)); - } else { - int dir = 1; - - auto firstturn = Bref.begin(); - while(!firstturn->eq(*slopeit)) ++firstturn; - - assert(firstturn != Bref.end()); - - EdgeRefList bgroup; bgroup.reserve(Bref.size()); - bgroup.emplace_back(*slopeit); - - auto b_it = std::next(firstturn); - while(b_it != firstturn) { - if(b_it == Bref.end()) b_it = Bref.begin(); - - while(!slopeit->eq(*b_it)) { - __nfp::advance(slopeit, Bslope, dir > 0); - } - - if(!slopeit->isTurningPoint()) { - bgroup.emplace_back(*slopeit); - } else { - if(!bgroup.empty()) { - if(dir > 0) bgroup.emplace_back(*slopeit); - for(auto& me : bgroup) { - std::cout << me.eref.get().label << ", "; - } - std::cout << std::endl; - seqlist.emplace_back(mink(Aref, bgroup, dir == 1 ? true : false)); - bgroup.clear(); - if(dir < 0) bgroup.emplace_back(*slopeit); - } else { - bgroup.emplace_back(*slopeit); - } - - dir *= -1; - } - ++b_it; - } - } - -// while(it != Bref.end()) // This is step 3 and step 4 in one loop -// if(it->isTurningPoint()) { -// R = {R.last, it++}; -// auto seq = mink(Q, R, orientation); - -// // TODO step 6 (should be 5 shouldn't it?): linking edges from A -// // I don't get this step - -// seqlist.insert(seqlist.end(), seq.begin(), seq.end()); -// orientation = !orientation; -// } else ++it; - -// if(seqlist.empty()) seqlist = mink(Q, {Bref.begin(), Bref.end()}, true); - - // ///////////////////////////////////////////////////////////////////////// - // Algorithm 2: breaking Minkowski sums into track line trips - // ///////////////////////////////////////////////////////////////////////// - - - // ///////////////////////////////////////////////////////////////////////// - // Algorithm 3: finding the boundary of the NFP from track line trips - // ///////////////////////////////////////////////////////////////////////// - - - for(auto& seq : seqlist) { - std::cout << "seqlist size: " << seq.size() << std::endl; - for(auto& s : seq) { - std::cout << (s.dir > 0 ? "" : "-") << s.eref.get().label << ", "; - } - std::cout << std::endl; - } - - auto& seq = seqlist.front(); - RawShape rsh; - Vertex top_nfp; - std::vector edgelist; edgelist.reserve(seq.size()); - for(auto& s : seq) { - edgelist.emplace_back(s.eref.get().e); - } - - __nfp::buildPolygon(edgelist, rsh, top_nfp); - - return Result(rsh, top_nfp); -} - // Specializable NFP implementation class. Specialize it if you have a faster // or better NFP implementation template @@ -793,8 +339,7 @@ inline NfpResult noFitPolygon(const RawShape& sh, return nfps(sh, other); } -} - -} +} // namespace nfp +} // namespace libnest2d #endif // GEOMETRIES_NOFITPOLYGON_HPP diff --git a/src/libnest2d/include/libnest2d/nester.hpp b/src/libnest2d/include/libnest2d/nester.hpp index 52c738a4c18..78da28759c0 100644 --- a/src/libnest2d/include/libnest2d/nester.hpp +++ b/src/libnest2d/include/libnest2d/nester.hpp @@ -70,6 +70,7 @@ class _Item { int binid_{BIN_ID_UNSET}, priority_{0}; bool fixed_{false}; + std::function on_packed_; public: @@ -205,6 +206,23 @@ class _Item { sl::vertex(sh_, idx) = v; } + void setShape(RawShape rsh) + { + sh_ = std::move(rsh); + invalidateCache(); + } + + void setOnPackedFn(std::function onpackedfn) + { + on_packed_ = onpackedfn; + } + + void onPacked() + { + if (on_packed_) + on_packed_(*this); + } + /** * @brief Calculate the shape area. * diff --git a/src/libnest2d/include/libnest2d/placers/bottomleftplacer.hpp b/src/libnest2d/include/libnest2d/placers/bottomleftplacer.hpp index a067194dc91..b48466d1d6b 100644 --- a/src/libnest2d/include/libnest2d/placers/bottomleftplacer.hpp +++ b/src/libnest2d/include/libnest2d/placers/bottomleftplacer.hpp @@ -375,7 +375,7 @@ class _BottomLeftPlacer: public PlacerBoilerplate< sl::addVertex(rsh, item.vertex(static_cast(i))); }; - auto addOthers = [&addOthers_, &reverseAddOthers_]() { + auto addOthers = [&]() { if constexpr (!is_clockwise()) addOthers_(); else @@ -415,7 +415,6 @@ class _BottomLeftPlacer: public PlacerBoilerplate< }; -} -} +}} // namespace libnest2d::placers #endif //BOTTOMLEFT_HPP diff --git a/src/libnest2d/include/libnest2d/placers/nfpplacer.hpp b/src/libnest2d/include/libnest2d/placers/nfpplacer.hpp index 00f6a999fb9..0ef0929e16a 100644 --- a/src/libnest2d/include/libnest2d/placers/nfpplacer.hpp +++ b/src/libnest2d/include/libnest2d/placers/nfpplacer.hpp @@ -157,26 +157,34 @@ template class EdgeCache { void createCache(const RawShape& sh) { { // For the contour - auto first = shapelike::cbegin(sh); - auto next = std::next(first); - auto endit = shapelike::cend(sh); + auto first = sl::cbegin(sh); + auto endit = sl::cend(sh); + auto next = first == endit ? endit : std::next(first); - contour_.distances.reserve(shapelike::contourVertexCount(sh)); + contour_.distances.reserve(sl::contourVertexCount(sh)); while(next != endit) { contour_.emap.emplace_back(*(first++), *(next++)); contour_.full_distance += length(contour_.emap.back()); contour_.distances.emplace_back(contour_.full_distance); } + + if constexpr (ClosureTypeV == Closure::OPEN) { + if (sl::contourVertexCount(sh) > 0) { + contour_.emap.emplace_back(sl::back(sh), sl::front(sh)); + contour_.full_distance += length(contour_.emap.back()); + contour_.distances.emplace_back(contour_.full_distance); + } + } } for(auto& h : shapelike::holes(sh)) { // For the holes - auto first = h.begin(); - auto next = std::next(first); - auto endit = h.end(); + auto first = sl::cbegin(h); + auto endit = sl::cend(h); + auto next = first == endit ? endit :std::next(first); ContourCache hc; - hc.distances.reserve(endit - first); + hc.distances.reserve(sl::contourVertexCount(h)); while(next != endit) { hc.emap.emplace_back(*(first++), *(next++)); @@ -184,6 +192,14 @@ template class EdgeCache { hc.distances.emplace_back(hc.full_distance); } + if constexpr (ClosureTypeV == Closure::OPEN) { + if (sl::contourVertexCount(h) > 0) { + hc.emap.emplace_back(sl::back(sh), sl::front(sh)); + hc.full_distance += length(hc.emap.back()); + hc.distances.emplace_back(hc.full_distance); + } + } + holes_.emplace_back(std::move(hc)); } } @@ -206,7 +222,6 @@ template class EdgeCache { contour_.corners.reserve(N / S + 1); contour_.corners.emplace_back(0.0); auto N_1 = N-1; - contour_.corners.emplace_back(0.0); for(size_t i = 0; i < N_1; i += S) { contour_.corners.emplace_back( contour_.distances.at(i) / contour_.full_distance); @@ -509,28 +524,24 @@ class _NofitPolyPlacer: public PlacerBoilerplate<_NofitPolyPlacer> - PackResult trypack(Item& item, - const Range& remaining = Range()) { - auto result = _trypack(item, remaining); - - // Experimental - // if(!result) repack(item, result); - - return result; - } - ~_NofitPolyPlacer() { clearItems(); } inline void clearItems() { finalAlign(bin_); + merged_pile_ = {}; Base::clearItems(); } void preload(const ItemGroup& packeditems) { Base::preload(packeditems); + + for (const Item& itm : packeditems) + merged_pile_.emplace_back(itm.transformedShape()); + + nfp::merge(merged_pile_); + if (config_.on_preload) config_.on_preload(packeditems, config_); } @@ -606,8 +617,9 @@ class _NofitPolyPlacer: public PlacerBoilerplate<_NofitPolyPlacer; +public: template> - PackResult _trypack( + PackResult trypack( Item& item, const Range& remaining = Range()) { @@ -889,6 +901,7 @@ class _NofitPolyPlacer: public PlacerBoilerplate<_NofitPolyPlacer #include #include @@ -12,9 +12,7 @@ namespace Slic3r { -namespace sla { - -class IndexedMesh::AABBImpl { +class AABBMesh::AABBImpl { private: AABBTreeIndirect::Tree3f m_tree; double m_triangle_ray_epsilon; @@ -68,82 +66,90 @@ class IndexedMesh::AABBImpl { } }; -template void IndexedMesh::init(const M &mesh, bool calculate_epsilon) +template void AABBMesh::init(const M &mesh, bool calculate_epsilon) { - BoundingBoxf3 bb = bounding_box(mesh); - m_ground_level += bb.min(Z); - // Build the AABB accelaration tree m_aabb->init(*m_tm, calculate_epsilon); } -IndexedMesh::IndexedMesh(const indexed_triangle_set& tmesh, bool calculate_epsilon) - : m_aabb(new AABBImpl()), m_tm(&tmesh) +AABBMesh::AABBMesh(const indexed_triangle_set &tmesh, bool calculate_epsilon) + : m_tm(&tmesh) + , m_aabb(new AABBImpl()) + , m_vfidx{tmesh} + , m_fnidx{its_face_neighbors(tmesh)} { init(tmesh, calculate_epsilon); } -IndexedMesh::IndexedMesh(const TriangleMesh &mesh, bool calculate_epsilon) - : m_aabb(new AABBImpl()), m_tm(&mesh.its) +AABBMesh::AABBMesh(const TriangleMesh &mesh, bool calculate_epsilon) + : m_tm(&mesh.its) + , m_aabb(new AABBImpl()) + , m_vfidx{mesh.its} + , m_fnidx{its_face_neighbors(mesh.its)} { init(mesh, calculate_epsilon); } -IndexedMesh::~IndexedMesh() {} - -IndexedMesh::IndexedMesh(const IndexedMesh &other): - m_tm(other.m_tm), m_ground_level(other.m_ground_level), - m_aabb( new AABBImpl(*other.m_aabb) ) {} +AABBMesh::~AABBMesh() {} +AABBMesh::AABBMesh(const AABBMesh &other) + : m_tm(other.m_tm) + , m_aabb(new AABBImpl(*other.m_aabb)) + , m_vfidx{other.m_vfidx} + , m_fnidx{other.m_fnidx} +{} -IndexedMesh &IndexedMesh::operator=(const IndexedMesh &other) +AABBMesh &AABBMesh::operator=(const AABBMesh &other) { m_tm = other.m_tm; - m_ground_level = other.m_ground_level; - m_aabb.reset(new AABBImpl(*other.m_aabb)); return *this; + m_aabb.reset(new AABBImpl(*other.m_aabb)); + m_vfidx = other.m_vfidx; + m_fnidx = other.m_fnidx; + + return *this; } -IndexedMesh &IndexedMesh::operator=(IndexedMesh &&other) = default; +AABBMesh &AABBMesh::operator=(AABBMesh &&other) = default; -IndexedMesh::IndexedMesh(IndexedMesh &&other) = default; +AABBMesh::AABBMesh(AABBMesh &&other) = default; -const std::vector& IndexedMesh::vertices() const +const std::vector& AABBMesh::vertices() const { return m_tm->vertices; } -const std::vector& IndexedMesh::indices() const +const std::vector& AABBMesh::indices() const { return m_tm->indices; } -const Vec3f& IndexedMesh::vertices(size_t idx) const +const Vec3f& AABBMesh::vertices(size_t idx) const { return m_tm->vertices[idx]; } -const Vec3i& IndexedMesh::indices(size_t idx) const +const Vec3i& AABBMesh::indices(size_t idx) const { return m_tm->indices[idx]; } -Vec3d IndexedMesh::normal_by_face_id(int face_id) const { +Vec3d AABBMesh::normal_by_face_id(int face_id) const { return its_unnormalized_normal(*m_tm, face_id).cast().normalized(); } -IndexedMesh::hit_result -IndexedMesh::query_ray_hit(const Vec3d &s, const Vec3d &dir) const +AABBMesh::hit_result +AABBMesh::query_ray_hit(const Vec3d &s, const Vec3d &dir) const { assert(is_approx(dir.norm(), 1.)); igl::Hit hit{-1, -1, 0.f, 0.f, 0.f}; @@ -171,10 +177,10 @@ IndexedMesh::query_ray_hit(const Vec3d &s, const Vec3d &dir) const return ret; } -std::vector -IndexedMesh::query_ray_hits(const Vec3d &s, const Vec3d &dir) const +std::vector +AABBMesh::query_ray_hits(const Vec3d &s, const Vec3d &dir) const { - std::vector outs; + std::vector outs; std::vector hits; m_aabb->intersect_ray(*m_tm, s, dir, hits); @@ -192,7 +198,7 @@ IndexedMesh::query_ray_hits(const Vec3d &s, const Vec3d &dir) const // Convert the igl::Hit into hit_result outs.reserve(hits.size()); for (const igl::Hit& hit : hits) { - outs.emplace_back(IndexedMesh::hit_result(*this)); + outs.emplace_back(AABBMesh::hit_result(*this)); outs.back().m_t = double(hit.t); outs.back().m_dir = dir; outs.back().m_source = s; @@ -207,8 +213,8 @@ IndexedMesh::query_ray_hits(const Vec3d &s, const Vec3d &dir) const #ifdef SLIC3R_HOLE_RAYCASTER -IndexedMesh::hit_result IndexedMesh::filter_hits( - const std::vector& object_hits) const +AABBMesh::hit_result IndexedMesh::filter_hits( + const std::vector& object_hits) const { assert(! m_holes.empty()); hit_result out(*this); @@ -304,7 +310,7 @@ IndexedMesh::hit_result IndexedMesh::filter_hits( #endif -double IndexedMesh::squared_distance(const Vec3d &p, int& i, Vec3d& c) const { +double AABBMesh::squared_distance(const Vec3d &p, int& i, Vec3d& c) const { double sqdst = 0; Eigen::Matrix pp = p; Eigen::Matrix cc; @@ -313,143 +319,4 @@ double IndexedMesh::squared_distance(const Vec3d &p, int& i, Vec3d& c) const { return sqdst; } - -static bool point_on_edge(const Vec3d& p, const Vec3d& e1, const Vec3d& e2, - double eps = 0.05) -{ - using Line3D = Eigen::ParametrizedLine; - - auto line = Line3D::Through(e1, e2); - double d = line.distance(p); - return std::abs(d) < eps; -} - -PointSet normals(const PointSet& points, - const IndexedMesh& mesh, - double eps, - std::function thr, // throw on cancel - const std::vector& pt_indices) -{ - if (points.rows() == 0 || mesh.vertices().empty() || mesh.indices().empty()) - return {}; - - std::vector range = pt_indices; - if (range.empty()) { - range.resize(size_t(points.rows()), 0); - std::iota(range.begin(), range.end(), 0); - } - - PointSet ret(range.size(), 3); - - // for (size_t ridx = 0; ridx < range.size(); ++ridx) - ccr::for_each(size_t(0), range.size(), - [&ret, &mesh, &points, thr, eps, &range](size_t ridx) { - thr(); - unsigned el = range[ridx]; - auto eidx = Eigen::Index(el); - int faceid = 0; - Vec3d p; - - mesh.squared_distance(points.row(eidx), faceid, p); - - auto trindex = mesh.indices(faceid); - - const Vec3d &p1 = mesh.vertices(trindex(0)).cast(); - const Vec3d &p2 = mesh.vertices(trindex(1)).cast(); - const Vec3d &p3 = mesh.vertices(trindex(2)).cast(); - - // We should check if the point lies on an edge of the hosting - // triangle. If it does then all the other triangles using the - // same two points have to be searched and the final normal should - // be some kind of aggregation of the participating triangle - // normals. We should also consider the cases where the support - // point lies right on a vertex of its triangle. The procedure is - // the same, get the neighbor triangles and calculate an average - // normal. - - // mark the vertex indices of the edge. ia and ib marks and edge - // ic will mark a single vertex. - int ia = -1, ib = -1, ic = -1; - - if (std::abs((p - p1).norm()) < eps) { - ic = trindex(0); - } else if (std::abs((p - p2).norm()) < eps) { - ic = trindex(1); - } else if (std::abs((p - p3).norm()) < eps) { - ic = trindex(2); - } else if (point_on_edge(p, p1, p2, eps)) { - ia = trindex(0); - ib = trindex(1); - } else if (point_on_edge(p, p2, p3, eps)) { - ia = trindex(1); - ib = trindex(2); - } else if (point_on_edge(p, p1, p3, eps)) { - ia = trindex(0); - ib = trindex(2); - } - - // vector for the neigboring triangles including the detected one. - std::vector neigh; - if (ic >= 0) { // The point is right on a vertex of the triangle - for (size_t n = 0; n < mesh.indices().size(); ++n) { - thr(); - Vec3i ni = mesh.indices(n); - if ((ni(X) == ic || ni(Y) == ic || ni(Z) == ic)) - neigh.emplace_back(n); - } - } else if (ia >= 0 && ib >= 0) { // the point is on and edge - // now get all the neigboring triangles - for (size_t n = 0; n < mesh.indices().size(); ++n) { - thr(); - Vec3i ni = mesh.indices(n); - if ((ni(X) == ia || ni(Y) == ia || ni(Z) == ia) && - (ni(X) == ib || ni(Y) == ib || ni(Z) == ib)) - neigh.emplace_back(n); - } - } - - // Calculate the normals for the neighboring triangles - std::vector neighnorms; - neighnorms.reserve(neigh.size()); - for (size_t &tri_id : neigh) - neighnorms.emplace_back(mesh.normal_by_face_id(tri_id)); - - // Throw out duplicates. They would cause trouble with summing. We - // will use std::unique which works on sorted ranges. We will sort - // by the coefficient-wise sum of the normals. It should force the - // same elements to be consecutive. - std::sort(neighnorms.begin(), neighnorms.end(), - [](const Vec3d &v1, const Vec3d &v2) { - return v1.sum() < v2.sum(); - }); - - auto lend = std::unique(neighnorms.begin(), neighnorms.end(), - [](const Vec3d &n1, const Vec3d &n2) { - // Compare normals for equivalence. - // This is controvers stuff. - auto deq = [](double a, double b) { - return std::abs(a - b) < 1e-3; - }; - return deq(n1(X), n2(X)) && - deq(n1(Y), n2(Y)) && - deq(n1(Z), n2(Z)); - }); - - if (!neighnorms.empty()) { // there were neighbors to count with - // sum up the normals and then normalize the result again. - // This unification seems to be enough. - Vec3d sumnorm(0, 0, 0); - sumnorm = std::accumulate(neighnorms.begin(), lend, sumnorm); - sumnorm.normalize(); - ret.row(long(ridx)) = sumnorm; - } else { // point lies safely within its triangle - Eigen::Vector3d U = p2 - p1; - Eigen::Vector3d V = p3 - p1; - ret.row(long(ridx)) = U.cross(V).normalized(); - } - }); - - return ret; -} - -}} // namespace Slic3r::sla +} // namespace Slic3r diff --git a/src/libslic3r/SLA/IndexedMesh.hpp b/src/libslic3r/AABBMesh.hpp similarity index 66% rename from src/libslic3r/SLA/IndexedMesh.hpp rename to src/libslic3r/AABBMesh.hpp index 9348a97c9bd..3ef25977b42 100644 --- a/src/libslic3r/SLA/IndexedMesh.hpp +++ b/src/libslic3r/AABBMesh.hpp @@ -1,10 +1,11 @@ -#ifndef SLA_INDEXEDMESH_H -#define SLA_INDEXEDMESH_H +#ifndef PRUSASLICER_AABBMESH_H +#define PRUSASLICER_AABBMESH_H #include #include #include +#include // There is an implementation of a hole-aware raycaster that was eventually // not used in production version. It is now hidden under following define @@ -21,67 +22,59 @@ namespace Slic3r { class TriangleMesh; -namespace sla { - -using PointSet = Eigen::MatrixXd; - -/// An index-triangle structure for libIGL functions. Also serves as an -/// alternative (raw) input format for the SLASupportTree. -// Implemented in libslic3r/SLA/Common.cpp -class IndexedMesh { +// An index-triangle structure coupled with an AABB index to support ray +// casting and other higher level operations. +class AABBMesh { class AABBImpl; - + const indexed_triangle_set* m_tm; - double m_ground_level = 0, m_gnd_offset = 0; - + std::unique_ptr m_aabb; + VertexFaceIndex m_vfidx; // vertex-face index + std::vector m_fnidx; // face-neighbor index #ifdef SLIC3R_HOLE_RAYCASTER // This holds a copy of holes in the mesh. Initialized externally // by load_mesh setter. - std::vector m_holes; + std::vector m_holes; #endif template void init(const M &mesh, bool calculate_epsilon); public: - + // calculate_epsilon ... calculate epsilon for triangle-ray intersection from an average triangle edge length. // If set to false, a default epsilon is used, which works for "reasonable" meshes. - explicit IndexedMesh(const indexed_triangle_set &tmesh, bool calculate_epsilon = false); - explicit IndexedMesh(const TriangleMesh &mesh, bool calculate_epsilon = false); - - IndexedMesh(const IndexedMesh& other); - IndexedMesh& operator=(const IndexedMesh&); - - IndexedMesh(IndexedMesh &&other); - IndexedMesh& operator=(IndexedMesh &&other); - - ~IndexedMesh(); - - inline double ground_level() const { return m_ground_level + m_gnd_offset; } - inline void ground_level_offset(double o) { m_gnd_offset = o; } - inline double ground_level_offset() const { return m_gnd_offset; } + explicit AABBMesh(const indexed_triangle_set &tmesh, bool calculate_epsilon = false); + explicit AABBMesh(const TriangleMesh &mesh, bool calculate_epsilon = false); + AABBMesh(const AABBMesh& other); + AABBMesh& operator=(const AABBMesh&); + + AABBMesh(AABBMesh &&other); + AABBMesh& operator=(AABBMesh &&other); + + ~AABBMesh(); + const std::vector& vertices() const; const std::vector& indices() const; const Vec3f& vertices(size_t idx) const; const Vec3i& indices(size_t idx) const; - + // Result of a raycast class hit_result { // m_t holds a distance from m_source to the intersection. double m_t = infty(); int m_face_id = -1; - const IndexedMesh *m_mesh = nullptr; - Vec3d m_dir; - Vec3d m_source; - Vec3d m_normal; - friend class IndexedMesh; + const AABBMesh *m_mesh = nullptr; + Vec3d m_dir = Vec3d::Zero(); + Vec3d m_source = Vec3d::Zero(); + Vec3d m_normal = Vec3d::Zero(); + friend class AABBMesh; // A valid object of this class can only be obtained from // IndexedMesh::query_ray_hit method. - explicit inline hit_result(const IndexedMesh& em): m_mesh(&em) {} + explicit inline hit_result(const AABBMesh& em): m_mesh(&em) {} public: // This denotes no hit on the mesh. static inline constexpr double infty() { return std::numeric_limits::infinity(); } @@ -109,7 +102,7 @@ class IndexedMesh { #ifdef SLIC3R_HOLE_RAYCASTER // Inform the object about location of holes // creates internal copy of the vector - void load_holes(const std::vector& holes) { + void load_holes(const std::vector& holes) { m_holes = holes; } @@ -118,7 +111,7 @@ class IndexedMesh { // This function is currently not used anywhere, it was written when the // holes were subtracted on slices, that is, before we started using CGAL // to actually cut the holes into the mesh. - hit_result filter_hits(const std::vector& obj_hits) const; + hit_result filter_hits(const std::vector& obj_hits) const; #endif // Casting a ray on the mesh, returns the distance where the hit occures. @@ -138,16 +131,12 @@ class IndexedMesh { Vec3d normal_by_face_id(int face_id) const; const indexed_triangle_set * get_triangle_mesh() const { return m_tm; } + + const VertexFaceIndex &vertex_face_index() const { return m_vfidx; } + const std::vector &face_neighbor_index() const { return m_fnidx; } }; -// Calculate the normals for the selected points (from 'points' set) on the -// mesh. This will call squared distance for each point. -PointSet normals(const PointSet& points, - const IndexedMesh& convert_mesh, - double eps = 0.05, // min distance from edges - std::function throw_on_cancel = [](){}, - const std::vector& selected_points = {}); -}} // namespace Slic3r::sla +} // namespace Slic3r::sla #endif // INDEXEDMESH_H diff --git a/src/libslic3r/AABBTreeIndirect.hpp b/src/libslic3r/AABBTreeIndirect.hpp index 9b9c886ecc8..6d6479508ff 100644 --- a/src/libslic3r/AABBTreeIndirect.hpp +++ b/src/libslic3r/AABBTreeIndirect.hpp @@ -13,6 +13,7 @@ #include +#include "BoundingBox.hpp" #include "Utils.hpp" // for next_highest_power_of_2() // Definition of the ray intersection hit structure. @@ -83,6 +84,13 @@ class Tree // to split around. template void build(std::vector &&input) + { + this->build_modify_input(input); + input.clear(); + } + + template + void build_modify_input(std::vector &input) { if (input.empty()) clear(); @@ -91,7 +99,6 @@ class Tree m_nodes.assign(next_highest_power_of_2(input.size()) * 2 - 1, Node()); build_recursive(input, 0, 0, input.size() - 1); } - input.clear(); } const std::vector& nodes() const { return m_nodes; } @@ -211,6 +218,23 @@ using Tree3f = Tree<3, float>; using Tree2d = Tree<2, double>; using Tree3d = Tree<3, double>; +// Wrap a 2D Slic3r own BoundingBox to be passed to Tree::build() and similar +// to build an AABBTree over coord_t 2D bounding boxes. +class BoundingBoxWrapper { +public: + using BoundingBox = Eigen::AlignedBox; + BoundingBoxWrapper(const size_t idx, const Slic3r::BoundingBox &bbox) : + m_idx(idx), + // Inflate the bounding box a bit to account for numerical issues. + m_bbox(bbox.min - Point(SCALED_EPSILON, SCALED_EPSILON), bbox.max + Point(SCALED_EPSILON, SCALED_EPSILON)) {} + size_t idx() const { return m_idx; } + const BoundingBox& bbox() const { return m_bbox; } + Point centroid() const { return ((m_bbox.min().cast() + m_bbox.max().cast()) / 2).cast(); } +private: + size_t m_idx; + BoundingBox m_bbox; +}; + namespace detail { template struct RayIntersector { @@ -513,7 +537,7 @@ namespace detail { const VectorType origin; inline VectorType closest_point_to_origin(size_t primitive_index, - ScalarType& squared_distance){ + ScalarType& squared_distance) const { const auto &triangle = this->faces[primitive_index]; VectorType closest_point = closest_point_to_triangle(origin, this->vertices[triangle(0)].template cast(), @@ -607,6 +631,37 @@ namespace detail { return up_sqr_d; } + template + static inline void indexed_primitives_within_distance_squared_recurisve(const IndexedPrimitivesDistancerType &distancer, + size_t node_idx, + Scalar squared_distance_limit, + std::vector &found_primitives_indices) + { + const auto &node = distancer.tree.node(node_idx); + assert(node.is_valid()); + if (node.is_leaf()) { + Scalar sqr_dist; + distancer.closest_point_to_origin(node.idx, sqr_dist); + if (sqr_dist < squared_distance_limit) { found_primitives_indices.push_back(node.idx); } + } else { + size_t left_node_idx = node_idx * 2 + 1; + size_t right_node_idx = left_node_idx + 1; + const auto &node_left = distancer.tree.node(left_node_idx); + const auto &node_right = distancer.tree.node(right_node_idx); + assert(node_left.is_valid()); + assert(node_right.is_valid()); + + if (node_left.bbox.squaredExteriorDistance(distancer.origin) < squared_distance_limit) { + indexed_primitives_within_distance_squared_recurisve(distancer, left_node_idx, squared_distance_limit, + found_primitives_indices); + } + if (node_right.bbox.squaredExteriorDistance(distancer.origin) < squared_distance_limit) { + indexed_primitives_within_distance_squared_recurisve(distancer, right_node_idx, squared_distance_limit, + found_primitives_indices); + } + } + } + } // namespace detail // Build a balanced AABB Tree over an indexed triangles set, balancing the tree @@ -793,6 +848,33 @@ inline bool is_any_triangle_in_radius( return hit_point.allFinite(); } +// Returns all triangles within the given radius limit +template +inline std::vector all_triangles_in_radius( + // Indexed triangle set - 3D vertices. + const std::vector &vertices, + // Indexed triangle set - triangular faces, references to vertices. + const std::vector &faces, + // AABBTreeIndirect::Tree over vertices & faces, bounding boxes built with the accuracy of vertices. + const TreeType &tree, + // Point to which the distances on the indexed triangle set is searched for. + const VectorType &point, + //Square of maximum distance in which triangles are searched for + typename VectorType::Scalar max_distance_squared) +{ + auto distancer = detail::IndexedTriangleSetDistancer + { vertices, faces, tree, point }; + + if(tree.empty()) + { + return {}; + } + + std::vector found_triangles{}; + detail::indexed_primitives_within_distance_squared_recurisve(distancer, size_t(0), max_distance_squared, found_triangles); + return found_triangles; +} + // Traverse the tree and return the index of an entity whose bounding box // contains a given point. Returns size_t(-1) when the point is outside. @@ -837,48 +919,54 @@ struct Intersecting> { template auto intersecting(const G &g) { return Intersecting{g}; } -template struct Containing {}; +template struct Within {}; // Intersection predicate specialization for box-box intersections template -struct Containing> { +struct Within> { Eigen::AlignedBox box; - Containing(const Eigen::AlignedBox &bb): box{bb} {} + Within(const Eigen::AlignedBox &bb): box{bb} {} bool operator() (const typename Tree::Node &node) const { - return box.contains(node.bbox); + return node.is_leaf() ? box.contains(node.bbox) : box.intersects(node.bbox); } }; -template auto containing(const G &g) { return Containing{g}; } +template auto within(const G &g) { return Within{g}; } namespace detail { +// Returns true in case traversal should continue, +// returns false if traversal should stop (for example if the first hit was found). template -void traverse_recurse(const Tree &tree, +bool traverse_recurse(const Tree &tree, size_t idx, Pred && pred, Fn && callback) { assert(tree.node(idx).is_valid()); - if (!pred(tree.node(idx))) return; + if (!pred(tree.node(idx))) + // Continue traversal. + return true; if (tree.node(idx).is_leaf()) { - callback(tree.node(idx).idx); + // Callback returns true to continue traversal, false to stop traversal. + return callback(tree.node(idx)); } else { // call this with left and right node idx: - auto trv = [&](size_t idx) { - traverse_recurse(tree, idx, std::forward(pred), - std::forward(callback)); + auto trv = [&](size_t idx) -> bool { + return traverse_recurse(tree, idx, std::forward(pred), + std::forward(callback)); }; // Left / right child node index. - trv(Tree::left_child_idx(idx)); - trv(Tree::right_child_idx(idx)); + // Returns true if both children allow the traversal to continue. + return trv(Tree::left_child_idx(idx)) && + trv(Tree::right_child_idx(idx)); } } @@ -888,6 +976,7 @@ void traverse_recurse(const Tree &tree, // traverse(tree, intersecting(QueryBox), [](size_t face_idx) { // /* ... */ // }); +// Callback shall return true to continue traversal, false if it wants to stop traversal, for example if it found the answer. template void traverse(const Tree &tree, Predicate &&pred, Fn &&callback) { diff --git a/src/libslic3r/AABBTreeLines.hpp b/src/libslic3r/AABBTreeLines.hpp index 7b9595419a5..2136e8edbda 100644 --- a/src/libslic3r/AABBTreeLines.hpp +++ b/src/libslic3r/AABBTreeLines.hpp @@ -1,83 +1,197 @@ #ifndef SRC_LIBSLIC3R_AABBTREELINES_HPP_ #define SRC_LIBSLIC3R_AABBTREELINES_HPP_ -#include "libslic3r/Point.hpp" -#include "libslic3r/EdgeGrid.hpp" +#include "Point.hpp" +#include "Utils.hpp" +#include "libslic3r.h" #include "libslic3r/AABBTreeIndirect.hpp" #include "libslic3r/Line.hpp" +#include +#include +#include +#include -namespace Slic3r { - -namespace AABBTreeLines { +namespace Slic3r { namespace AABBTreeLines { namespace detail { -template -struct IndexedLinesDistancer { - using LineType = ALineType; - using TreeType = ATreeType; +template struct IndexedLinesDistancer +{ + using LineType = ALineType; + using TreeType = ATreeType; using VectorType = AVectorType; using ScalarType = typename VectorType::Scalar; const std::vector &lines; - const TreeType &tree; + const TreeType &tree; const VectorType origin; - inline VectorType closest_point_to_origin(size_t primitive_index, - ScalarType &squared_distance) { - VectorType nearest_point; - const LineType &line = lines[primitive_index]; - squared_distance = line_alg::distance_to_squared(line, origin, &nearest_point); - return nearest_point; + inline VectorType closest_point_to_origin(size_t primitive_index, ScalarType &squared_distance) const + { + Vec nearest_point; + const LineType &line = lines[primitive_index]; + squared_distance = line_alg::distance_to_squared(line, origin.template cast(), &nearest_point); + return nearest_point.template cast(); } }; +// returns number of intersections of ray starting in ray_origin and following the specified coordinate line with lines in tree +// first number is hits in positive direction of ray, second number hits in negative direction. returns neagtive numbers when ray_origin is +// on some line exactly. +template +inline std::tuple coordinate_aligned_ray_hit_count(size_t node_idx, + const TreeType &tree, + const std::vector &lines, + const VectorType &ray_origin) +{ + static constexpr int other_coordinate = (coordinate + 1) % 2; + using Scalar = typename LineType::Scalar; + using Floating = typename std::conditional::value, Scalar, double>::type; + const auto &node = tree.node(node_idx); + assert(node.is_valid()); + if (node.is_leaf()) { + const LineType &line = lines[node.idx]; + if (ray_origin[other_coordinate] < std::min(line.a[other_coordinate], line.b[other_coordinate]) || + ray_origin[other_coordinate] >= std::max(line.a[other_coordinate], line.b[other_coordinate])) { + // the second inequality is nonsharp for a reason + // without it, we may count contour border twice when the lines meet exactly at the spot of intersection. this prevents is + return {0, 0}; + } + + Scalar line_max = std::max(line.a[coordinate], line.b[coordinate]); + Scalar line_min = std::min(line.a[coordinate], line.b[coordinate]); + if (ray_origin[coordinate] > line_max) { + return {1, 0}; + } else if (ray_origin[coordinate] < line_min) { + return {0, 1}; + } else { + // find intersection of ray with line + // that is when ( line.a + t * (line.b - line.a) )[other_coordinate] == ray_origin[other_coordinate] + // t = ray_origin[oc] - line.a[oc] / (line.b[oc] - line.a[oc]); + // then we want to get value of intersection[ coordinate] + // val_c = line.a[c] + t * (line.b[c] - line.a[c]); + // Note that ray and line may overlap, when (line.b[oc] - line.a[oc]) is zero + // In that case, we return negative number + Floating distance_oc = line.b[other_coordinate] - line.a[other_coordinate]; + Floating t = (ray_origin[other_coordinate] - line.a[other_coordinate]) / distance_oc; + Floating val_c = line.a[coordinate] + t * (line.b[coordinate] - line.a[coordinate]); + if (ray_origin[coordinate] > val_c) { + return {1, 0}; + } else if (ray_origin[coordinate] < val_c) { + return {0, 1}; + } else { // ray origin is on boundary + return {-1, -1}; + } + } + } else { + int intersections_above = 0; + int intersections_below = 0; + size_t left_node_idx = node_idx * 2 + 1; + size_t right_node_idx = left_node_idx + 1; + const auto &node_left = tree.node(left_node_idx); + const auto &node_right = tree.node(right_node_idx); + assert(node_left.is_valid()); + assert(node_right.is_valid()); + + if (node_left.bbox.min()[other_coordinate] <= ray_origin[other_coordinate] && + node_left.bbox.max()[other_coordinate] >= + ray_origin[other_coordinate]) { + auto [above, below] = coordinate_aligned_ray_hit_count(left_node_idx, tree, lines, + ray_origin); + if (above < 0 || below < 0) return {-1, -1}; + intersections_above += above; + intersections_below += below; + } + + if (node_right.bbox.min()[other_coordinate] <= ray_origin[other_coordinate] && + node_right.bbox.max()[other_coordinate] >= ray_origin[other_coordinate]) { + auto [above, below] = coordinate_aligned_ray_hit_count(right_node_idx, tree, lines, + ray_origin); + if (above < 0 || below < 0) return {-1, -1}; + intersections_above += above; + intersections_below += below; + } + return {intersections_above, intersections_below}; + } +} + +template +inline std::vector> get_intersections_with_line(size_t node_idx, + const TreeType &tree, + const std::vector &lines, + const LineType &line, + const typename TreeType::BoundingBox &line_bb) +{ + const auto &node = tree.node(node_idx); + assert(node.is_valid()); + if (node.is_leaf()) { + VectorType intersection_pt; + if (line_alg::intersection(line, lines[node.idx], &intersection_pt)) { + return {std::pair(intersection_pt, node.idx)}; + } else { + return {}; + } + } else { + size_t left_node_idx = node_idx * 2 + 1; + size_t right_node_idx = left_node_idx + 1; + const auto &node_left = tree.node(left_node_idx); + const auto &node_right = tree.node(right_node_idx); + assert(node_left.is_valid()); + assert(node_right.is_valid()); + + std::vector> result; + + if (node_left.bbox.intersects(line_bb)) { + std::vector> intersections = + get_intersections_with_line(left_node_idx, tree, lines, line, line_bb); + result.insert(result.end(), intersections.begin(), intersections.end()); + } + + if (node_right.bbox.intersects(line_bb)) { + std::vector> intersections = + get_intersections_with_line(right_node_idx, tree, lines, line, line_bb); + result.insert(result.end(), intersections.begin(), intersections.end()); + } + + return result; + } } -// Build a balanced AABB Tree over a vector of float lines, balancing the tree +} // namespace detail + +// Build a balanced AABB Tree over a vector of lines, balancing the tree // on centroids of the lines. // Epsilon is applied to the bounding boxes of the AABB Tree to cope with numeric inaccuracies // during tree traversal. template -inline AABBTreeIndirect::Tree<2, typename LineType::Scalar> build_aabb_tree_over_indexed_lines( - const std::vector &lines, - //FIXME do we want to apply an epsilon? - const float eps = 0) - { - using TreeType = AABBTreeIndirect::Tree<2, typename LineType::Scalar>; -// using CoordType = typename TreeType::CoordType; - using VectorType = typename TreeType::VectorType; +inline AABBTreeIndirect::Tree build_aabb_tree_over_indexed_lines(const std::vector &lines) +{ + using TreeType = AABBTreeIndirect::Tree; + // using CoordType = typename TreeType::CoordType; + using VectorType = typename TreeType::VectorType; using BoundingBox = typename TreeType::BoundingBox; - struct InputType { - size_t idx() const { - return m_idx; - } - const BoundingBox& bbox() const { - return m_bbox; - } - const VectorType& centroid() const { - return m_centroid; - } + struct InputType + { + size_t idx() const { return m_idx; } + const BoundingBox &bbox() const { return m_bbox; } + const VectorType ¢roid() const { return m_centroid; } - size_t m_idx; + size_t m_idx; BoundingBox m_bbox; - VectorType m_centroid; + VectorType m_centroid; }; std::vector input; input.reserve(lines.size()); - const VectorType veps(eps, eps); for (size_t i = 0; i < lines.size(); ++i) { const LineType &line = lines[i]; - InputType n; - n.m_idx = i; + InputType n; + n.m_idx = i; n.m_centroid = (line.a + line.b) * 0.5; - n.m_bbox = BoundingBox(line.a, line.a); + n.m_bbox = BoundingBox(line.a, line.a); n.m_bbox.extend(line.b); - n.m_bbox.min() -= veps; - n.m_bbox.max() += veps; input.emplace_back(n); } @@ -88,25 +202,164 @@ inline AABBTreeIndirect::Tree<2, typename LineType::Scalar> build_aabb_tree_over // Finding a closest line, its closest point and squared distance to the closest point // Returns squared distance to the closest point or -1 if the input is empty. +// or no closer point than max_sq_dist template inline typename VectorType::Scalar squared_distance_to_indexed_lines( - const std::vector &lines, - const TreeType &tree, - const VectorType &point, - size_t &hit_idx_out, - Eigen::PlainObjectBase &hit_point_out) - { + const std::vector &lines, + const TreeType &tree, + const VectorType &point, + size_t &hit_idx_out, + Eigen::PlainObjectBase &hit_point_out, + typename VectorType::Scalar max_sqr_dist = std::numeric_limits::infinity()) +{ using Scalar = typename VectorType::Scalar; - auto distancer = detail::IndexedLinesDistancer - { lines, tree, point }; - return tree.empty() ? - Scalar(-1) : - AABBTreeIndirect::detail::squared_distance_to_indexed_primitives_recursive(distancer, size_t(0), Scalar(0), - std::numeric_limits::infinity(), hit_idx_out, hit_point_out); + if (tree.empty()) return Scalar(-1); + auto distancer = detail::IndexedLinesDistancer{lines, tree, point}; + return AABBTreeIndirect::detail::squared_distance_to_indexed_primitives_recursive(distancer, size_t(0), Scalar(0), max_sqr_dist, + hit_idx_out, hit_point_out); } +// Returns all lines within the given radius limit +template +inline std::vector all_lines_in_radius(const std::vector &lines, + const TreeType &tree, + const VectorType &point, + typename VectorType::Scalar max_distance_squared) +{ + auto distancer = detail::IndexedLinesDistancer{lines, tree, point}; + + if (tree.empty()) { return {}; } + + std::vector found_lines{}; + AABBTreeIndirect::detail::indexed_primitives_within_distance_squared_recurisve(distancer, size_t(0), max_distance_squared, found_lines); + return found_lines; +} + +// return 1 if true, -1 if false, 0 for point on contour (or if cannot be determined) +template +inline int point_outside_closed_contours(const std::vector &lines, const TreeType &tree, const VectorType &point) +{ + if (tree.empty()) { return 1; } + + auto [hits_above, hits_below] = detail::coordinate_aligned_ray_hit_count(0, tree, lines, point); + if (hits_above < 0 || hits_below < 0) { + return 0; + } else if (hits_above % 2 == 1 && hits_below % 2 == 1) { + return -1; + } else if (hits_above % 2 == 0 && hits_below % 2 == 0) { + return 1; + } else { // this should not happen with closed contours. lets check it in Y direction + auto [hits_above, hits_below] = detail::coordinate_aligned_ray_hit_count(0, tree, lines, point); + if (hits_above < 0 || hits_below < 0) { + return 0; + } else if (hits_above % 2 == 1 && hits_below % 2 == 1) { + return -1; + } else if (hits_above % 2 == 0 && hits_below % 2 == 0) { + return 1; + } else { // both results were unclear + return 0; + } + } } +template +inline std::vector> get_intersections_with_line(const std::vector &lines, + const TreeType &tree, + const LineType &line) +{ + if (tree.empty()) { + return {}; + } + auto line_bb = typename TreeType::BoundingBox(line.a, line.a); + line_bb.extend(line.b); + + auto intersections = detail::get_intersections_with_line(0, tree, lines, line, line_bb); + if (sorted) { + using Floating = + typename std::conditional::value, typename LineType::Scalar, double>::type; + + std::vector>> points_with_sq_distance{}; + for (const auto &p : intersections) { + points_with_sq_distance.emplace_back((p.first - line.a).template cast().squaredNorm(), p); + } + std::sort(points_with_sq_distance.begin(), points_with_sq_distance.end(), + [](const std::pair> &left, + std::pair> &right) { return left.first < right.first; }); + for (size_t i = 0; i < points_with_sq_distance.size(); i++) { + intersections[i] = points_with_sq_distance[i].second; + } + } + + return intersections; } +template class LinesDistancer +{ +public: + using Scalar = typename LineType::Scalar; + using Floating = typename std::conditional::value, Scalar, double>::type; +private: + std::vector lines; + AABBTreeIndirect::Tree<2, Scalar> tree; + +public: + explicit LinesDistancer(const std::vector &lines) : lines(lines) + { + tree = AABBTreeLines::build_aabb_tree_over_indexed_lines(this->lines); + } + + explicit LinesDistancer(std::vector &&lines) : lines(lines) + { + tree = AABBTreeLines::build_aabb_tree_over_indexed_lines(this->lines); + } + + LinesDistancer() = default; + + // 1 true, -1 false, 0 cannot determine + int outside(const Vec<2, Scalar> &point) const { return point_outside_closed_contours(lines, tree, point); } + + // negative sign means inside + template + std::tuple> distance_from_lines_extra(const Vec<2, Scalar> &point) const + { + size_t nearest_line_index_out = size_t(-1); + Vec<2, Floating> nearest_point_out = Vec<2, Floating>::Zero(); + Vec<2, Floating> p = point.template cast(); + auto distance = AABBTreeLines::squared_distance_to_indexed_lines(lines, tree, p, nearest_line_index_out, nearest_point_out); + + if (distance < 0) { + return {std::numeric_limits::infinity(), nearest_line_index_out, nearest_point_out}; + } + distance = sqrt(distance); + + if (SIGNED_DISTANCE) { + distance *= outside(point); + } + + return {distance, nearest_line_index_out, nearest_point_out}; + } + + template Floating distance_from_lines(const Vec<2, typename LineType::Scalar> &point) const + { + auto [dist, idx, np] = distance_from_lines_extra(point); + return dist; + } + + std::vector all_lines_in_radius(const Vec<2, typename LineType::Scalar> &point, Floating radius) + { + return all_lines_in_radius(this->lines, this->tree, point, radius * radius); + } + + template std::vector, size_t>> intersections_with_line(const LineType &line) const + { + return get_intersections_with_line>(lines, tree, line); + } + + const LineType &get_line(size_t line_idx) const { return lines[line_idx]; } + + const std::vector &get_lines() const { return lines; } +}; + +}} // namespace Slic3r::AABBTreeLines + #endif /* SRC_LIBSLIC3R_AABBTREELINES_HPP_ */ diff --git a/src/libslic3r/AStar.hpp b/src/libslic3r/AStar.hpp new file mode 100644 index 00000000000..630257a81a7 --- /dev/null +++ b/src/libslic3r/AStar.hpp @@ -0,0 +1,193 @@ +#ifndef ASTAR_HPP +#define ASTAR_HPP + +#include // std::isinf() is here +#include + +#include "libslic3r/MutablePriorityQueue.hpp" + +namespace Slic3r { namespace astar { + +// Borrowed from C++20 +template +using remove_cvref_t = std::remove_cv_t>; + +// Input interface for the Astar algorithm. Specialize this struct for a +// particular type and implement all the 4 methods and specify the Node type +// to register the new type for the astar implementation. +template struct TracerTraits_ +{ + // The type of a node used by this tracer. Usually a point in space. + using Node = typename T::Node; + + // Call fn for every new node reachable from node 'src'. fn should have the + // candidate node as its only argument. + template + static void foreach_reachable(const T &tracer, const Node &src, Fn &&fn) + { + tracer.foreach_reachable(src, fn); + } + + // Get the distance from node 'a' to node 'b'. This is sometimes referred + // to as the g value of a node in AStar context. + static float distance(const T &tracer, const Node &a, const Node &b) + { + return tracer.distance(a, b); + } + + // Get the estimated distance heuristic from node 'n' to the destination. + // This is referred to as the h value in AStar context. + // If node 'n' is the goal, this function should return a negative value. + // Note that this heuristic should be admissible (never bigger than the real + // cost) in order for Astar to work. + static float goal_heuristic(const T &tracer, const Node &n) + { + return tracer.goal_heuristic(n); + } + + // Return a unique identifier (hash) for node 'n'. + static size_t unique_id(const T &tracer, const Node &n) + { + return tracer.unique_id(n); + } +}; + +// Helper definition to get the node type of a tracer +template +using TracerNodeT = typename TracerTraits_>::Node; + +constexpr auto Unassigned = std::numeric_limits::max(); + +template +struct QNode // Queue node. Keeps track of scores g, and h +{ + TracerNodeT node; // The actual node itself + size_t queue_id; // Position in the open queue or Unassigned if closed + size_t parent; // unique id of the parent or Unassigned + + float g, h; + float f() const { return g + h; } + + QNode(TracerNodeT n = {}, + size_t p = Unassigned, + float gval = std::numeric_limits::infinity(), + float hval = 0.f) + : node{std::move(n)} + , parent{p} + , queue_id{InvalidQueueID} + , g{gval} + , h{hval} + {} +}; + +// Run the AStar algorithm on a tracer implementation. +// The 'tracer' argument encapsulates the domain (grid, point cloud, etc...) +// The 'source' argument is the starting node. +// The 'out' argument is the output iterator into which the output nodes are +// written. For performance reasons, the order is reverse, from the destination +// to the source -- (destination included, source is not). +// The 'cached_nodes' argument is an optional associative container to hold a +// QNode entry for each visited node. Any compatible container can be used +// (like std::map or maps with different allocators, even a sufficiently large +// std::vector). +// +// Note that no destination node is given in the signature. The tracer's +// goal_heuristic() method should return a negative value if a node is a +// destination node. +template>> +bool search_route(const Tracer &tracer, + const TracerNodeT &source, + It out, + NodeMap &&cached_nodes = {}) +{ + using Node = TracerNodeT; + using QNode = QNode; + using TracerTraits = TracerTraits_>; + + struct LessPred { // Comparison functor needed by the priority queue + NodeMap &m; + bool operator ()(size_t node_a, size_t node_b) { + return m[node_a].f() < m[node_b].f(); + } + }; + + auto qopen = make_mutable_priority_queue( + [&cached_nodes](size_t el, size_t qidx) { + cached_nodes[el].queue_id = qidx; + }, + LessPred{cached_nodes}); + + QNode initial{source, /*parent = */ Unassigned, /*g = */0.f}; + size_t source_id = TracerTraits::unique_id(tracer, source); + cached_nodes[source_id] = initial; + qopen.push(source_id); + + size_t goal_id = TracerTraits::goal_heuristic(tracer, source) < 0.f ? + source_id : + Unassigned; + + while (goal_id == Unassigned && !qopen.empty()) { + size_t q_id = qopen.top(); + qopen.pop(); + QNode &q = cached_nodes[q_id]; + + // This should absolutely be initialized in the cache already + assert(!std::isinf(q.g)); + + TracerTraits::foreach_reachable(tracer, q.node, [&](const Node &succ_nd) { + if (goal_id != Unassigned) + return true; + + float h = TracerTraits::goal_heuristic(tracer, succ_nd); + float dst = TracerTraits::distance(tracer, q.node, succ_nd); + size_t succ_id = TracerTraits::unique_id(tracer, succ_nd); + QNode qsucc_nd{succ_nd, q_id, q.g + dst, h}; + + if (h < 0.f) { + goal_id = succ_id; + cached_nodes[succ_id] = qsucc_nd; + } else { + // If succ_id is not in cache, it gets created with g = infinity + QNode &prev_nd = cached_nodes[succ_id]; + + if (qsucc_nd.g < prev_nd.g) { + // new route is better, apply it: + + // Save the old queue id, it would be lost after the next line + size_t queue_id = prev_nd.queue_id; + + // The cache needs to be updated either way + prev_nd = qsucc_nd; + + if (queue_id == InvalidQueueID) + // was in closed or unqueued, rescheduling + qopen.push(succ_id); + else // was in open, updating + qopen.update(queue_id); + } + } + + return goal_id != Unassigned; + }); + } + + // Write the output, do not reverse. Clients can do so if they need to. + if (goal_id != Unassigned) { + const QNode *q = &cached_nodes[goal_id]; + while (q->parent != Unassigned) { + assert(!std::isinf(q->g)); // Uninitialized nodes are NOT allowed + + *out = q->node; + ++out; + q = &cached_nodes[q->parent]; + } + } + + return goal_id != Unassigned; +} + +}} // namespace Slic3r::astar + +#endif // ASTAR_HPP diff --git a/src/libslic3r/Algorithm/RegionExpansion.cpp b/src/libslic3r/Algorithm/RegionExpansion.cpp new file mode 100644 index 00000000000..844cda82239 --- /dev/null +++ b/src/libslic3r/Algorithm/RegionExpansion.cpp @@ -0,0 +1,539 @@ +#include "RegionExpansion.hpp" + +#include +#include +#include +#include + +#include + +namespace Slic3r { +namespace Algorithm { + +// Calculating radius discretization according to ClipperLib offsetter code, see void ClipperOffset::DoOffset(double delta) +inline double clipper_round_offset_error(double offset, double arc_tolerance) +{ + static constexpr const double def_arc_tolerance = 0.25; + const double y = + arc_tolerance <= 0 ? + def_arc_tolerance : + arc_tolerance > offset * def_arc_tolerance ? + offset * def_arc_tolerance : + arc_tolerance; + double steps = std::min(M_PI / std::acos(1. - y / offset), offset * M_PI); + return offset * (1. - cos(M_PI / steps)); +} + +RegionExpansionParameters RegionExpansionParameters::build( + // Scaled expansion value + float full_expansion, + // Expand by waves of expansion_step size (expansion_step is scaled). + float expansion_step, + // Don't take more than max_nr_steps for small expansion_step. + size_t max_nr_expansion_steps) +{ + assert(full_expansion > 0); + assert(expansion_step > 0); + assert(max_nr_expansion_steps > 0); + + RegionExpansionParameters out; + // Initial expansion of src to make the source regions intersect with boundary regions just a bit. + // The expansion should not be too tiny, but also small enough, so the following expansion will + // compensate for tiny_expansion and bring the wave back to the boundary without producing + // ugly cusps where it touches the boundary. + out.tiny_expansion = std::min(0.25f * full_expansion, scaled(0.05f)); + size_t nsteps = size_t(ceil((full_expansion - out.tiny_expansion) / expansion_step)); + if (max_nr_expansion_steps > 0) + nsteps = std::min(nsteps, max_nr_expansion_steps); + assert(nsteps > 0); + out.initial_step = (full_expansion - out.tiny_expansion) / nsteps; + if (nsteps > 1 && 0.25 * out.initial_step < out.tiny_expansion) { + // Decrease the step size by lowering number of steps. + nsteps = std::max(1, (floor((full_expansion - out.tiny_expansion) / (4. * out.tiny_expansion)))); + out.initial_step = (full_expansion - out.tiny_expansion) / nsteps; + } + if (0.25 * out.initial_step < out.tiny_expansion || nsteps == 1) { + out.tiny_expansion = 0.2f * full_expansion; + out.initial_step = 0.8f * full_expansion; + } + out.other_step = out.initial_step; + out.num_other_steps = nsteps - 1; + + // Accuracy of the offsetter for wave propagation. + out.arc_tolerance = scaled(0.1); + out.shortest_edge_length = out.initial_step * ClipperOffsetShortestEdgeFactor; + + // Maximum inflation of seed contours over the boundary. Used to trim boundary to speed up + // clipping during wave propagation. Needs to be in sync with the offsetter accuracy. + // Clipper positive round offset should rather offset less than more. + // Still a little bit of additional offset was added. + out.max_inflation = (out.tiny_expansion + nsteps * out.initial_step) * 1.1; +// (clipper_round_offset_error(out.tiny_expansion, co.ArcTolerance) + nsteps * clipper_round_offset_error(out.initial_step, co.ArcTolerance) * 1.5; // Account for uncertainty + + return out; +} + +// similar to expolygons_to_zpaths(), but each contour is expanded before converted to zpath. +// The expanded contours are then opened (the first point is repeated at the end). +static ClipperLib_Z::Paths expolygons_to_zpaths_expanded_opened( + const ExPolygons &src, const float expansion, coord_t &base_idx) +{ + ClipperLib_Z::Paths out; + out.reserve(2 * std::accumulate(src.begin(), src.end(), size_t(0), + [](const size_t acc, const ExPolygon &expoly) { return acc + expoly.num_contours(); })); + ClipperLib::ClipperOffset offsetter; + offsetter.ShortestEdgeLength = expansion * ClipperOffsetShortestEdgeFactor; + ClipperLib::Paths expansion_cache; + for (const ExPolygon &expoly : src) { + for (size_t icontour = 0; icontour < expoly.num_contours(); ++ icontour) { + // Execute reorients the contours so that the outer most contour has a positive area. Thus the output + // contours will be CCW oriented even though the input paths are CW oriented. + // Offset is applied after contour reorientation, thus the signum of the offset value is reversed. + offsetter.Clear(); + offsetter.AddPath(expoly.contour_or_hole(icontour).points, ClipperLib::jtSquare, ClipperLib::etClosedPolygon); + expansion_cache.clear(); + offsetter.Execute(expansion_cache, icontour == 0 ? expansion : -expansion); + append(out, ClipperZUtils::to_zpaths(expansion_cache, base_idx)); + } + ++ base_idx; + } + return out; +} + +// Paths were created by splitting closed polygons into open paths and then by clipping them. +// Thus some pieces of the clipped polygons may now become split at the ends of the source polygons. +// Those ends are sorted lexicographically in "splits". +// Reconnect those split pieces. +static inline void merge_splits(ClipperLib_Z::Paths &paths, std::vector> &splits) +{ + for (auto it_path = paths.begin(); it_path != paths.end(); ) { + ClipperLib_Z::Path &path = *it_path; + assert(path.size() >= 2); + bool merged = false; + if (path.size() >= 2) { + const ClipperLib_Z::IntPoint &front = path.front(); + const ClipperLib_Z::IntPoint &back = path.back(); + // The path before clipping was supposed to cross the clipping boundary or be fully out of it. + // Thus the clipped contour is supposed to become open, with one exception: The anchor expands into a closed hole. + if (front.x() != back.x() || front.y() != back.y()) { + // Look up the ends in "splits", possibly join the contours. + // "splits" maps into the other piece connected to the same end point. + auto find_end = [&splits](const ClipperLib_Z::IntPoint &pt) -> std::pair* { + auto it = std::lower_bound(splits.begin(), splits.end(), pt, + [](const auto &l, const auto &r){ return ClipperZUtils::zpoint_lower(l.first, r); }); + return it != splits.end() && it->first == pt ? &(*it) : nullptr; + }; + auto *end = find_end(front); + bool end_front = true; + if (! end) { + end_front = false; + end = find_end(back); + } + if (end) { + // This segment ends at a split point of the source closed contour before clipping. + if (end->second == -1) { + // Open end was found, not matched yet. + end->second = int(it_path - paths.begin()); + } else { + // Open end was found and matched with end->second + ClipperLib_Z::Path &other_path = paths[end->second]; + polylines_merge(other_path, other_path.front() == end->first, std::move(path), end_front); + if (std::next(it_path) == paths.end()) { + paths.pop_back(); + break; + } + path = std::move(paths.back()); + paths.pop_back(); + merged = true; + } + } + } + } + if (! merged) + ++ it_path; + } +} + +using AABBTreeBBoxes = AABBTreeIndirect::Tree<2, coord_t>; + +static AABBTreeBBoxes build_aabb_tree_over_expolygons(const ExPolygons &expolygons) +{ + // Calculate bounding boxes of internal slices. + std::vector bboxes; + bboxes.reserve(expolygons.size()); + for (size_t i = 0; i < expolygons.size(); ++ i) + bboxes.emplace_back(i, get_extents(expolygons[i].contour)); + // Build AABB tree over bounding boxes of boundary expolygons. + AABBTreeBBoxes out; + out.build_modify_input(bboxes); + return out; +} + +static int sample_in_expolygons( + // AABB tree over boundary expolygons + const AABBTreeBBoxes &aabb_tree, + const ExPolygons &expolygons, + const Point &sample) +{ + int out = -1; + AABBTreeIndirect::traverse(aabb_tree, + [&sample](const AABBTreeBBoxes::Node &node) { + return node.bbox.contains(sample); + }, + [&expolygons, &sample, &out](const AABBTreeBBoxes::Node &node) { + assert(node.is_leaf()); + assert(node.is_valid()); + if (expolygons[node.idx].contains(sample)) { + out = int(node.idx); + // Stop traversal. + return false; + } + // Continue traversal. + return true; + }); + return out; +} + +std::vector wave_seeds( + // Source regions that are supposed to touch the boundary. + const ExPolygons &src, + // Boundaries of source regions touching the "boundary" regions will be expanded into the "boundary" region. + const ExPolygons &boundary, + // Initial expansion of src to make the source regions intersect with boundary regions just a bit. + float tiny_expansion, + // Sort output by boundary ID and source ID. + bool sorted) +{ + assert(tiny_expansion > 0); + + if (src.empty()) + return {}; + + using Intersection = ClipperZUtils::ClipperZIntersectionVisitor::Intersection; + using Intersections = ClipperZUtils::ClipperZIntersectionVisitor::Intersections; + + ClipperLib_Z::Paths segments; + Intersections intersections; + + coord_t idx_boundary_begin = 1; + coord_t idx_boundary_end = idx_boundary_begin; + coord_t idx_src_end; + + { + ClipperLib_Z::Clipper zclipper; + ClipperZUtils::ClipperZIntersectionVisitor visitor(intersections); + zclipper.ZFillFunction(visitor.clipper_callback()); + // as closed contours + zclipper.AddPaths(ClipperZUtils::expolygons_to_zpaths(boundary, idx_boundary_end), ClipperLib_Z::ptClip, true); + // as open contours + std::vector> zsrc_splits; + { + idx_src_end = idx_boundary_end; + ClipperLib_Z::Paths zsrc = expolygons_to_zpaths_expanded_opened(src, tiny_expansion, idx_src_end); + zclipper.AddPaths(zsrc, ClipperLib_Z::ptSubject, false); + zsrc_splits.reserve(zsrc.size()); + for (const ClipperLib_Z::Path &path : zsrc) { + assert(path.size() >= 2); + assert(path.front() == path.back()); + zsrc_splits.emplace_back(path.front(), -1); + } + std::sort(zsrc_splits.begin(), zsrc_splits.end(), [](const auto &l, const auto &r){ return ClipperZUtils::zpoint_lower(l.first, r.first); }); + } + ClipperLib_Z::PolyTree polytree; + zclipper.Execute(ClipperLib_Z::ctIntersection, polytree, ClipperLib_Z::pftNonZero, ClipperLib_Z::pftNonZero); + ClipperLib_Z::PolyTreeToPaths(std::move(polytree), segments); + merge_splits(segments, zsrc_splits); + } + + // AABBTree over bounding boxes of boundaries. + // Only built if necessary, that is if any of the seed contours is closed, thus there is no intersection point + // with the boundary and all Z coordinates of the closed contour point to the source contour. + AABBTreeBBoxes aabb_tree; + + // Sort paths into their respective islands. + // Each src x boundary will be processed (wave expanded) independently. + // Multiple pieces of a single src may intersect the same boundary. + WaveSeeds out; + out.reserve(segments.size()); + int iseed = 0; + for (const ClipperLib_Z::Path &path : segments) { + assert(path.size() >= 2); + const ClipperLib_Z::IntPoint &front = path.front(); + const ClipperLib_Z::IntPoint &back = path.back(); + // Both ends of a seed segment are supposed to be inside a single boundary expolygon. + // Thus as long as the seed contour is not closed, it should be open at a boundary point. + assert((front == back && front.z() >= idx_boundary_end && front.z() < idx_src_end) || + //(front.z() < 0 && back.z() < 0)); + // Hope that at least one end of an open polyline is clipped by the boundary, thus an intersection point is created. + (front.z() < 0 || back.z() < 0)); + const Intersection *intersection = nullptr; + auto intersection_point_valid = [idx_boundary_end, idx_src_end](const Intersection &is) { + return is.first >= 1 && is.first < idx_boundary_end && + is.second >= idx_boundary_end && is.second < idx_src_end; + }; + if (front.z() < 0) { + const Intersection &is = intersections[- front.z() - 1]; + assert(intersection_point_valid(is)); + if (intersection_point_valid(is)) + intersection = &is; + } + if (! intersection && back.z() < 0) { + const Intersection &is = intersections[- back.z() - 1]; + assert(intersection_point_valid(is)); + if (intersection_point_valid(is)) + intersection = &is; + } + if (intersection) { + // The path intersects the boundary contour at least at one side. + out.push_back({ uint32_t(intersection->second - idx_boundary_end), uint32_t(intersection->first - 1), ClipperZUtils::from_zpath(path) }); + } else { + // This should be a closed contour. + assert(front == back && front.z() >= idx_boundary_end && front.z() < idx_src_end); + // Find a source boundary expolygon of one sample of this closed path. + if (aabb_tree.empty()) + aabb_tree = build_aabb_tree_over_expolygons(boundary); + int boundary_id = sample_in_expolygons(aabb_tree, boundary, Point(front.x(), front.y())); + // Boundary that contains the sample point was found. + assert(boundary_id >= 0); + if (boundary_id >= 0) + out.push_back({ uint32_t(front.z() - idx_boundary_end), uint32_t(boundary_id), ClipperZUtils::from_zpath(path) }); + } + ++ iseed; + } + + if (sorted) + // Sort the seeds by their intersection boundary and source contour. + std::sort(out.begin(), out.end(), lower_by_boundary_and_src); + return out; +} + +static ClipperLib::Paths wavefront_initial(ClipperLib::ClipperOffset &co, const ClipperLib::Paths &polylines, float offset) +{ + ClipperLib::Paths out; + out.reserve(polylines.size()); + ClipperLib::Paths out_this; + for (const ClipperLib::Path &path : polylines) { + assert(path.size() >= 2); + co.Clear(); + co.AddPath(path, jtRound, path.front() == path.back() ? ClipperLib::etClosedLine : ClipperLib::etOpenRound); + co.Execute(out_this, offset); + append(out, std::move(out_this)); + } + return out; +} + +// Input polygons may consist of multiple expolygons, even nested expolygons. +// After inflation some polygons may thus overlap, however the overlap is being resolved during the successive +// clipping operation, thus it is not being done here. +static ClipperLib::Paths wavefront_step(ClipperLib::ClipperOffset &co, const ClipperLib::Paths &polygons, float offset) +{ + ClipperLib::Paths out; + out.reserve(polygons.size()); + ClipperLib::Paths out_this; + for (const ClipperLib::Path &polygon : polygons) { + co.Clear(); + // Execute reorients the contours so that the outer most contour has a positive area. Thus the output + // contours will be CCW oriented even though the input paths are CW oriented. + // Offset is applied after contour reorientation, thus the signum of the offset value is reversed. + co.AddPath(polygon, jtRound, ClipperLib::etClosedPolygon); + bool ccw = ClipperLib::Orientation(polygon); + co.Execute(out_this, ccw ? offset : - offset); + if (! ccw) { + // Reverse the resulting contours. + for (ClipperLib::Path &path : out_this) + std::reverse(path.begin(), path.end()); + } + append(out, std::move(out_this)); + } + return out; +} + +static ClipperLib::Paths wavefront_clip(const ClipperLib::Paths &wavefront, const Polygons &clipping) +{ + ClipperLib::Clipper clipper; + clipper.AddPaths(wavefront, ClipperLib::ptSubject, true); + clipper.AddPaths(ClipperUtils::PolygonsProvider(clipping), ClipperLib::ptClip, true); + ClipperLib::Paths out; + clipper.Execute(ClipperLib::ctIntersection, out, ClipperLib::pftPositive, ClipperLib::pftPositive); + return out; +} + +static Polygons propagate_wave_from_boundary( + ClipperLib::ClipperOffset &co, + // Seed of the wave: Open polylines very close to the boundary. + const ClipperLib::Paths &seed, + // Boundary inside which the waveform will propagate. + const ExPolygon &boundary, + // How much to inflate the seed lines to produce the first wave area. + const float initial_step, + // How much to inflate the first wave area and the successive wave areas in each step. + const float other_step, + // Number of inflate steps after the initial step. + const size_t num_other_steps, + // Maximum inflation of seed contours over the boundary. Used to trim boundary to speed up + // clipping during wave propagation. + const float max_inflation) +{ + assert(! seed.empty() && seed.front().size() >= 2); + Polygons clipping = ClipperUtils::clip_clipper_polygons_with_subject_bbox(boundary, get_extents(seed).inflated(max_inflation)); + ClipperLib::Paths polygons = wavefront_clip(wavefront_initial(co, seed, initial_step), clipping); + // Now offset the remaining + for (size_t ioffset = 0; ioffset < num_other_steps; ++ ioffset) + polygons = wavefront_clip(wavefront_step(co, polygons, other_step), clipping); + return to_polygons(polygons); +} + +// Resulting regions are sorted by boundary id and source id. +std::vector propagate_waves(const WaveSeeds &seeds, const ExPolygons &boundary, const RegionExpansionParameters ¶ms) +{ + std::vector out; + ClipperLib::Paths paths; + ClipperLib::ClipperOffset co; + co.ArcTolerance = params.arc_tolerance; + co.ShortestEdgeLength = params.shortest_edge_length; + for (auto it_seed = seeds.begin(); it_seed != seeds.end();) { + auto it = it_seed; + paths.clear(); + for (; it != seeds.end() && it->boundary == it_seed->boundary && it->src == it_seed->src; ++ it) + paths.emplace_back(it->path); + // Propagate the wavefront while clipping it with the trimmed boundary. + // Collect the expanded polygons, merge them with the source polygons. + RegionExpansion re; + for (Polygon &polygon : propagate_wave_from_boundary(co, paths, boundary[it_seed->boundary], params.initial_step, params.other_step, params.num_other_steps, params.max_inflation)) + out.push_back({ std::move(polygon), it_seed->src, it_seed->boundary }); + it_seed = it; + } + + return out; +} + +std::vector propagate_waves(const ExPolygons &src, const ExPolygons &boundary, const RegionExpansionParameters ¶ms) +{ + return propagate_waves(wave_seeds(src, boundary, params.tiny_expansion, true), boundary, params); +} + +std::vector propagate_waves(const ExPolygons &src, const ExPolygons &boundary, + // Scaled expansion value + float expansion, + // Expand by waves of expansion_step size (expansion_step is scaled). + float expansion_step, + // Don't take more than max_nr_steps for small expansion_step. + size_t max_nr_steps) +{ + return propagate_waves(src, boundary, RegionExpansionParameters::build(expansion, expansion_step, max_nr_steps)); +} + +// Returns regions per source ExPolygon expanded into boundary. +std::vector propagate_waves_ex(const WaveSeeds &seeds, const ExPolygons &boundary, const RegionExpansionParameters ¶ms) +{ + std::vector expanded = propagate_waves(seeds, boundary, params); + assert(std::is_sorted(seeds.begin(), seeds.end(), [](const auto &l, const auto &r){ return l.boundary < r.boundary || (l.boundary == r.boundary && l.src < r.src); })); + Polygons acc; + std::vector out; + for (auto it = expanded.begin(); it != expanded.end(); ) { + auto it2 = it; + acc.clear(); + for (; it2 != expanded.end() && it2->boundary_id == it->boundary_id && it2->src_id == it->src_id; ++ it2) + acc.emplace_back(std::move(it2->polygon)); + size_t size = it2 - it; + if (size == 1) + out.push_back({ ExPolygon{std::move(acc.front())}, it->src_id, it->boundary_id }); + else { + ExPolygons expolys = union_ex(acc); + reserve_more_power_of_2(out, expolys.size()); + for (ExPolygon &ex : expolys) + out.push_back({ std::move(ex), it->src_id, it->boundary_id }); + } + it = it2; + } + return out; +} + +// Returns regions per source ExPolygon expanded into boundary. +std::vector propagate_waves_ex( + // Source regions that are supposed to touch the boundary. + // Boundaries of source regions touching the "boundary" regions will be expanded into the "boundary" region. + const ExPolygons &src, + const ExPolygons &boundary, + // Scaled expansion value + float full_expansion, + // Expand by waves of expansion_step size (expansion_step is scaled). + float expansion_step, + // Don't take more than max_nr_steps for small expansion_step. + size_t max_nr_expansion_steps) +{ + auto params = RegionExpansionParameters::build(full_expansion, expansion_step, max_nr_expansion_steps); + return propagate_waves_ex(wave_seeds(src, boundary, params.tiny_expansion, true), boundary, params); +} + +std::vector expand_expolygons(const ExPolygons &src, const ExPolygons &boundary, + // Scaled expansion value + float expansion, + // Expand by waves of expansion_step size (expansion_step is scaled). + float expansion_step, + // Don't take more than max_nr_steps for small expansion_step. + size_t max_nr_steps) +{ + std::vector out(src.size(), Polygons{}); + for (RegionExpansion &r : propagate_waves(src, boundary, expansion, expansion_step, max_nr_steps)) + out[r.src_id].emplace_back(std::move(r.polygon)); + return out; +} + +std::vector expand_merge_expolygons(ExPolygons &&src, const ExPolygons &boundary, const RegionExpansionParameters ¶ms) +{ + // expanded regions are sorted by boundary id and source id + std::vector expanded = propagate_waves(src, boundary, params); + // expanded regions will be merged into source regions, thus they will be re-sorted by source id. + std::sort(expanded.begin(), expanded.end(), [](const auto &l, const auto &r) { return l.src_id < r.src_id; }); + uint32_t last = 0; + Polygons acc; + ExPolygons out; + out.reserve(src.size()); + for (auto it = expanded.begin(); it != expanded.end();) { + for (; last < it->src_id; ++ last) + out.emplace_back(std::move(src[last])); + acc.clear(); + assert(it->src_id == last); + for (; it != expanded.end() && it->src_id == last; ++ it) + acc.emplace_back(std::move(it->polygon)); + //FIXME offset & merging could be more efficient, for example one does not need to copy the source expolygon + ExPolygon &src_ex = src[last ++]; + assert(! src_ex.contour.empty()); +#if 0 + { + static int iRun = 0; + BoundingBox bbox = get_extents(acc); + bbox.merge(get_extents(src_ex)); + SVG svg(debug_out_path("expand_merge_expolygons-failed-union=%d.svg", iRun ++).c_str(), bbox); + svg.draw(acc); + svg.draw_outline(acc, "black", scale_(0.05)); + svg.draw(src_ex, "red"); + svg.Close(); + } +#endif + Point sample = src_ex.contour.front(); + append(acc, to_polygons(std::move(src_ex))); + ExPolygons merged = union_safety_offset_ex(acc); + // Expanding one expolygon by waves should not change connectivity of the source expolygon: + // Single expolygon should be produced possibly with increased number of holes. + if (merged.size() > 1) { + // assert(merged.size() == 1); + // There is something wrong with the initial waves. Most likely the bridge was not valid at all + // or the boundary region was very close to some bridge edge, but not really touching. + // Pick only a single merged expolygon, which contains one sample point of the source expolygon. + auto aabb_tree = build_aabb_tree_over_expolygons(merged); + int id = sample_in_expolygons(aabb_tree, merged, sample); + assert(id != -1); + if (id != -1) + out.emplace_back(std::move(merged[id])); + } else if (merged.size() == 1) + out.emplace_back(std::move(merged.front())); + } + for (; last < uint32_t(src.size()); ++ last) + out.emplace_back(std::move(src[last])); + return out; +} + +} // Algorithm +} // Slic3r diff --git a/src/libslic3r/Algorithm/RegionExpansion.hpp b/src/libslic3r/Algorithm/RegionExpansion.hpp new file mode 100644 index 00000000000..26aab198a38 --- /dev/null +++ b/src/libslic3r/Algorithm/RegionExpansion.hpp @@ -0,0 +1,114 @@ +#ifndef SRC_LIBSLIC3R_ALGORITHM_REGION_EXPANSION_HPP_ +#define SRC_LIBSLIC3R_ALGORITHM_REGION_EXPANSION_HPP_ + +#include +#include +#include +#include + +namespace Slic3r { +namespace Algorithm { + +struct RegionExpansionParameters +{ + // Initial expansion of src to make the source regions intersect with boundary regions just a bit. + float tiny_expansion; + // How much to inflate the seed lines to produce the first wave area. + float initial_step; + // How much to inflate the first wave area and the successive wave areas in each step. + float other_step; + // Number of inflate steps after the initial step. + size_t num_other_steps; + // Maximum inflation of seed contours over the boundary. Used to trim boundary to speed up + // clipping during wave propagation. + float max_inflation; + + // Accuracy of the offsetter for wave propagation. + double arc_tolerance; + double shortest_edge_length; + + static RegionExpansionParameters build( + // Scaled expansion value + float full_expansion, + // Expand by waves of expansion_step size (expansion_step is scaled). + float expansion_step, + // Don't take more than max_nr_steps for small expansion_step. + size_t max_nr_expansion_steps); +}; + +struct WaveSeed { + uint32_t src; + uint32_t boundary; + Points path; +}; +using WaveSeeds = std::vector; + +inline bool lower_by_boundary_and_src(const WaveSeed &l, const WaveSeed &r) +{ + return l.boundary < r.boundary || (l.boundary == r.boundary && l.src < r.src); +} + +inline bool lower_by_src_and_boundary(const WaveSeed &l, const WaveSeed &r) +{ + return l.src < r.src || (l.src == r.src && l.boundary < r.boundary); +} + +// Expand src slightly outwards to intersect boundaries, trim the offsetted src polylines by the boundaries. +// Return the trimmed paths annotated with their origin (source of the path, index of the boundary region). +WaveSeeds wave_seeds( + // Source regions that are supposed to touch the boundary. + const ExPolygons &src, + // Boundaries of source regions touching the "boundary" regions will be expanded into the "boundary" region. + const ExPolygons &boundary, + // Initial expansion of src to make the source regions intersect with boundary regions just a bit. + float tiny_expansion, + bool sorted); + +struct RegionExpansion +{ + Polygon polygon; + uint32_t src_id; + uint32_t boundary_id; +}; + +std::vector propagate_waves(const WaveSeeds &seeds, const ExPolygons &boundary, const RegionExpansionParameters ¶ms); + +std::vector propagate_waves(const ExPolygons &src, const ExPolygons &boundary, + // Scaled expansion value + float expansion, + // Expand by waves of expansion_step size (expansion_step is scaled). + float expansion_step, + // Don't take more than max_nr_steps for small expansion_step. + size_t max_nr_steps); + +struct RegionExpansionEx +{ + ExPolygon expolygon; + uint32_t src_id; + uint32_t boundary_id; +}; + +std::vector propagate_waves_ex(const WaveSeeds &seeds, const ExPolygons &boundary, const RegionExpansionParameters ¶ms); + +std::vector propagate_waves_ex(const ExPolygons &src, const ExPolygons &boundary, + // Scaled expansion value + float expansion, + // Expand by waves of expansion_step size (expansion_step is scaled). + float expansion_step, + // Don't take more than max_nr_steps for small expansion_step. + size_t max_nr_steps); + +std::vector expand_expolygons(const ExPolygons &src, const ExPolygons &boundary, + // Scaled expansion value + float expansion, + // Expand by waves of expansion_step size (expansion_step is scaled). + float expansion_step, + // Don't take more than max_nr_steps for small expansion_step. + size_t max_nr_steps); + +std::vector expand_merge_expolygons(ExPolygons &&src, const ExPolygons &boundary, const RegionExpansionParameters ¶ms); + +} // Algorithm +} // Slic3r + +#endif /* SRC_LIBSLIC3R_ALGORITHM_REGION_EXPANSION_HPP_ */ diff --git a/src/libslic3r/AnyPtr.hpp b/src/libslic3r/AnyPtr.hpp new file mode 100644 index 00000000000..823fac0808a --- /dev/null +++ b/src/libslic3r/AnyPtr.hpp @@ -0,0 +1,130 @@ +#ifndef ANYPTR_HPP +#define ANYPTR_HPP + +#include +#include +#include + +namespace Slic3r { + +// A general purpose pointer holder that can hold any type of smart pointer +// or raw pointer which can own or not own any object they point to. +// In case a raw pointer is stored, it is not destructed so ownership is +// assumed to be foreign. +// +// The stored pointer is not checked for being null when dereferenced. +// +// This is a movable only object due to the fact that it can possibly hold +// a unique_ptr which a non-copy. +template +class AnyPtr { + enum { RawPtr, UPtr, ShPtr, WkPtr }; + + boost::variant, std::shared_ptr, std::weak_ptr> ptr; + + template static T *get_ptr(Self &&s) + { + switch (s.ptr.which()) { + case RawPtr: return boost::get(s.ptr); + case UPtr: return boost::get>(s.ptr).get(); + case ShPtr: return boost::get>(s.ptr).get(); + case WkPtr: { + auto shptr = boost::get>(s.ptr).lock(); + return shptr.get(); + } + } + + return nullptr; + } + +public: + template>> + AnyPtr(TT *p = nullptr) : ptr{p} + {} + template>> + AnyPtr(std::unique_ptr p) : ptr{std::unique_ptr(std::move(p))} + {} + template>> + AnyPtr(std::shared_ptr p) : ptr{std::shared_ptr(std::move(p))} + {} + template>> + AnyPtr(std::weak_ptr p) : ptr{std::weak_ptr(std::move(p))} + {} + + ~AnyPtr() = default; + + AnyPtr(AnyPtr &&other) noexcept : ptr{std::move(other.ptr)} {} + AnyPtr(const AnyPtr &other) = delete; + + AnyPtr &operator=(AnyPtr &&other) noexcept { ptr = std::move(other.ptr); return *this; } + AnyPtr &operator=(const AnyPtr &other) = delete; + + template>> + AnyPtr &operator=(TT *p) { ptr = p; return *this; } + + template>> + AnyPtr &operator=(std::unique_ptr p) { ptr = std::move(p); return *this; } + + template>> + AnyPtr &operator=(std::shared_ptr p) { ptr = p; return *this; } + + template>> + AnyPtr &operator=(std::weak_ptr p) { ptr = std::move(p); return *this; } + + const T &operator*() const { return *get_ptr(*this); } + T &operator*() { return *get_ptr(*this); } + + T *operator->() { return get_ptr(*this); } + const T *operator->() const { return get_ptr(*this); } + + T *get() { return get_ptr(*this); } + const T *get() const { return get_ptr(*this); } + + operator bool() const + { + switch (ptr.which()) { + case RawPtr: return bool(boost::get(ptr)); + case UPtr: return bool(boost::get>(ptr)); + case ShPtr: return bool(boost::get>(ptr)); + case WkPtr: { + auto shptr = boost::get>(ptr).lock(); + return bool(shptr); + } + } + + return false; + } + + // If the stored pointer is a shared or weak pointer, returns a reference + // counted copy. Empty shared pointer is returned otherwise. + std::shared_ptr get_shared_cpy() const + { + std::shared_ptr ret; + + switch (ptr.which()) { + case ShPtr: ret = boost::get>(ptr); break; + case WkPtr: ret = boost::get>(ptr).lock(); break; + default: + ; + } + + return ret; + } + + // If the underlying pointer is unique, convert to shared pointer + void convert_unique_to_shared() + { + if (ptr.which() == UPtr) + ptr = std::shared_ptr{std::move(boost::get>(ptr))}; + } + + // Returns true if the data is owned by this AnyPtr instance + bool is_owned() const noexcept + { + return ptr.which() == UPtr || ptr.which() == ShPtr; + } +}; + +} // namespace Slic3r + +#endif // ANYPTR_HPP diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index e153f32d14e..f88b80c92ae 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -34,11 +34,17 @@ static const std::string MODEL_PREFIX = "model:"; // to show this notification. On the other hand, we would like PrusaSlicer 2.3.2 to show an update notification of the upcoming PrusaSlicer 2.4.0. // Thus we will let PrusaSlicer 2.3.2 and couple of follow-up versions to download the version number from an alternate file until the PrusaSlicer 2.3.0/2.3.1 // are phased out, then we will revert to the original name. -//static const std::string VERSION_CHECK_URL = "https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaSlicer.version"; -static const std::string VERSION_CHECK_URL = "https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaSlicer.version2"; +// For 2.6.0-alpha1 we have switched back to the original. The file should contain data for AppUpdater.cpp +static const std::string VERSION_CHECK_URL = "https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaSlicer.version"; +//static const std::string VERSION_CHECK_URL = "https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaSlicer.version2"; +// Url to index archive zip that contains latest indicies +static const std::string INDEX_ARCHIVE_URL= "https://files.prusa3d.com/wp-content/uploads/repository/vendor_indices.zip"; +// Url to folder with vendor profile files. Used when downloading new profiles that are not in resources folder. +static const std::string PROFILE_FOLDER_URL = "https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/"; const std::string AppConfig::SECTION_FILAMENTS = "filaments"; const std::string AppConfig::SECTION_MATERIALS = "sla_materials"; +const std::string AppConfig::SECTION_EMBOSS_STYLE = "font"; void AppConfig::reset() { @@ -60,6 +66,9 @@ void AppConfig::set_defaults() // Disable background processing by default as it is not stable. if (get("background_processing").empty()) set("background_processing", "0"); + // Enable support issues alerts by default + if (get("alert_when_supports_needed").empty()) + set("alert_when_supports_needed", "1"); // If set, the "Controller" tab for the control of the printer over serial line and the serial port settings are hidden. // By default, Prusa has the controller hidden. if (get("no_controller").empty()) @@ -67,6 +76,8 @@ void AppConfig::set_defaults() // If set, the "- default -" selections of print/filament/printer are suppressed, if there is a valid preset available. if (get("no_defaults").empty()) set("no_defaults", "1"); + if (get("no_templates").empty()) + set("no_templates", "0"); if (get("show_incompatible_presets").empty()) set("show_incompatible_presets", "0"); @@ -150,6 +161,9 @@ void AppConfig::set_defaults() if (get("order_volumes").empty()) set("order_volumes", "1"); + if (get("non_manifold_edges").empty()) + set("non_manifold_edges", "1"); + if (get("clear_undo_redo_stack_on_new_project").empty()) set("clear_undo_redo_stack_on_new_project", "1"); } @@ -181,6 +195,9 @@ void AppConfig::set_defaults() if (get("show_hints").empty()) set("show_hints", "1"); + if (get("allow_auto_color_change").empty()) + set("allow_auto_color_change", "1"); + if (get("allow_ip_resolve").empty()) set("allow_ip_resolve", "1"); @@ -323,12 +340,6 @@ std::string AppConfig::load(const std::string &path) // Error while parsing config file. We'll customize the error message and rethrow to be displayed. // ! But to avoid the use of _utf8 (related to use of wxWidgets) // we will rethrow this exception from the place of load() call, if returned value wouldn't be empty - /* - throw Slic3r::RuntimeError( - _utf8(L("Error parsing PrusaSlicer config file, it is probably corrupted. " - "Try to manually delete the file to recover from the error. Your user profiles will not be affected.")) + - "\n\n" + AppConfig::config_path() + "\n\n" + ex.what()); - */ return ex.what(); } } @@ -400,12 +411,8 @@ std::string AppConfig::load() void AppConfig::save() { - { - // Returns "undefined" if the thread naming functionality is not supported by the operating system. - std::optional current_thread_name = get_current_thread_name(); - if (current_thread_name && *current_thread_name != "slic3r_main") - throw CriticalException("Calling AppConfig::save() from a worker thread!"); - } + if (! is_main_thread_active()) + throw CriticalException("Calling AppConfig::save() from a worker thread!"); // The config is first written to a file with a PID suffix and then moved // to avoid race conditions with multiple instances of Slic3r @@ -474,6 +481,46 @@ void AppConfig::save() m_dirty = false; } +bool AppConfig::erase(const std::string §ion, const std::string &key) +{ + if (auto it_storage = m_storage.find(section); it_storage != m_storage.end()) { + auto §ion = it_storage->second; + auto it = section.find(key); + if (it != section.end()) { + section.erase(it); + m_dirty = true; + return true; + } + } + return false; +} + +bool AppConfig::set_section(const std::string §ion, std::map data) +{ + auto it_section = m_storage.find(section); + if (it_section == m_storage.end()) { + if (data.empty()) + return false; + it_section = m_storage.insert({ section, {} }).first; + } + auto &dst = it_section->second; + if (dst == data) + return false; + dst = std::move(data); + m_dirty = true; + return true; +} + +bool AppConfig::clear_section(const std::string §ion) +{ + if (auto it_section = m_storage.find(section); it_section != m_storage.end() && ! it_section->second.empty()) { + it_section->second.clear(); + m_dirty = true; + return true; + } + return false; +} + bool AppConfig::get_variant(const std::string &vendor, const std::string &model, const std::string &variant) const { const auto it_v = m_vendors.find(vendor); @@ -482,28 +529,47 @@ bool AppConfig::get_variant(const std::string &vendor, const std::string &model, return it_m == it_v->second.end() ? false : it_m->second.find(variant) != it_m->second.end(); } -void AppConfig::set_variant(const std::string &vendor, const std::string &model, const std::string &variant, bool enable) +bool AppConfig::set_variant(const std::string &vendor, const std::string &model, const std::string &variant, bool enable) { if (enable) { - if (get_variant(vendor, model, variant)) { return; } + if (get_variant(vendor, model, variant)) + return false; m_vendors[vendor][model].insert(variant); } else { auto it_v = m_vendors.find(vendor); - if (it_v == m_vendors.end()) { return; } + if (it_v == m_vendors.end()) + return false; auto it_m = it_v->second.find(model); - if (it_m == it_v->second.end()) { return; } + if (it_m == it_v->second.end()) + return false; auto it_var = it_m->second.find(variant); - if (it_var == it_m->second.end()) { return; } + if (it_var == it_m->second.end()) + return false; it_m->second.erase(it_var); } // If we got here, there was an update m_dirty = true; + return true; } -void AppConfig::set_vendors(const AppConfig &from) +bool AppConfig::set_vendors(const VendorMap &vendors) { - m_vendors = from.m_vendors; - m_dirty = true; + if (m_vendors != vendors) { + m_vendors = vendors; + m_dirty = true; + return true; + } else + return false; +} + +bool AppConfig::set_vendors(VendorMap &&vendors) +{ + if (m_vendors != vendors) { + m_vendors = std::move(vendors); + m_dirty = true; + return true; + } else + return false; } std::string AppConfig::get_last_dir() const @@ -538,34 +604,52 @@ std::vector AppConfig::get_recent_projects() const return ret; } -void AppConfig::set_recent_projects(const std::vector& recent_projects) +bool AppConfig::set_recent_projects(const std::vector& recent_projects) { - auto it = m_storage.find("recent_projects"); - if (it == m_storage.end()) - it = m_storage.insert(std::map>::value_type("recent_projects", std::map())).first; + static constexpr const char *section = "recent_projects"; + auto it_section = m_storage.find(section); + if (it_section == m_storage.end()) { + if (recent_projects.empty()) + return false; + it_section = m_storage.insert({ std::string(section), {} }).first; + } + auto &dst = it_section->second; - it->second.clear(); + std::map src; for (unsigned int i = 0; i < (unsigned int)recent_projects.size(); ++i) - { - it->second[std::to_string(i + 1)] = recent_projects[i]; - } + src[std::to_string(i + 1)] = recent_projects[i]; + + if (src != dst) { + dst = std::move(src); + m_dirty = true; + return true; + } else + return false; } -void AppConfig::set_mouse_device(const std::string& name, double translation_speed, double translation_deadzone, +bool AppConfig::set_mouse_device(const std::string& name, double translation_speed, double translation_deadzone, float rotation_speed, float rotation_deadzone, double zoom_speed, bool swap_yz) { - std::string key = std::string("mouse_device:") + name; - auto it = m_storage.find(key); - if (it == m_storage.end()) - it = m_storage.insert(std::map>::value_type(key, std::map())).first; - - it->second.clear(); - it->second["translation_speed"] = float_to_string_decimal_point(translation_speed); - it->second["translation_deadzone"] = float_to_string_decimal_point(translation_deadzone); - it->second["rotation_speed"] = float_to_string_decimal_point(rotation_speed); - it->second["rotation_deadzone"] = float_to_string_decimal_point(rotation_deadzone); - it->second["zoom_speed"] = float_to_string_decimal_point(zoom_speed); - it->second["swap_yz"] = swap_yz ? "1" : "0"; + const std::string key = std::string("mouse_device:") + name; + auto it_section = m_storage.find(key); + if (it_section == m_storage.end()) + it_section = m_storage.insert({ key, {} }).first; + auto &dst = it_section->second; + + std::map src; + src["translation_speed"] = float_to_string_decimal_point(translation_speed); + src["translation_deadzone"] = float_to_string_decimal_point(translation_deadzone); + src["rotation_speed"] = float_to_string_decimal_point(rotation_speed); + src["rotation_deadzone"] = float_to_string_decimal_point(rotation_deadzone); + src["zoom_speed"] = float_to_string_decimal_point(zoom_speed); + src["swap_yz"] = swap_yz ? "1" : "0"; + + if (src != dst) { + dst = std::move(src); + m_dirty = true; + return true; + } else + return false; } std::vector AppConfig::get_mouse_device_names() const @@ -579,16 +663,16 @@ std::vector AppConfig::get_mouse_device_names() const return out; } -void AppConfig::update_config_dir(const std::string &dir) +bool AppConfig::update_config_dir(const std::string &dir) { - this->set("recent", "config_directory", dir); + return this->set("recent", "config_directory", dir); } -void AppConfig::update_skein_dir(const std::string &dir) +bool AppConfig::update_skein_dir(const std::string &dir) { if (is_shapes_dir(dir)) - return; // do not save "shapes gallery" directory - this->set("recent", "skein_directory", dir); + return false; // do not save "shapes gallery" directory + return this->set("recent", "skein_directory", dir); } /* std::string AppConfig::get_last_output_dir(const std::string &alt) const @@ -623,9 +707,9 @@ std::string AppConfig::get_last_output_dir(const std::string& alt, const bool re return is_shapes_dir(alt) ? get_last_dir() : alt; } -void AppConfig::update_last_output_dir(const std::string& dir, const bool removable) +bool AppConfig::update_last_output_dir(const std::string& dir, const bool removable) { - this->set("", (removable ? "last_output_path_removable" : "last_output_path"), dir); + return this->set("", (removable ? "last_output_path_removable" : "last_output_path"), dir); } @@ -643,7 +727,7 @@ void AppConfig::reset_selections() } } -std::string AppConfig::config_path() +std::string AppConfig::config_path() const { std::string path = (m_mode == EAppMode::Editor) ? (boost::filesystem::path(Slic3r::data_dir()) / (SLIC3R_APP_KEY ".ini")).make_preferred().string() : @@ -658,7 +742,27 @@ std::string AppConfig::version_check_url() const return from_settings.empty() ? VERSION_CHECK_URL : from_settings; } -bool AppConfig::exists() +std::string AppConfig::index_archive_url() const +{ +#if 0 + // this code is for debug & testing purposes only - changed url wont get trough inner checks anyway. + auto from_settings = get("index_archive_url"); + return from_settings.empty() ? INDEX_ARCHIVE_URL : from_settings; +#endif + return INDEX_ARCHIVE_URL; +} + +std::string AppConfig::profile_folder_url() const +{ +#if 0 + // this code is for debug & testing purposes only - changed url wont get trough inner checks anyway. + auto from_settings = get("profile_folder_url"); + return from_settings.empty() ? PROFILE_FOLDER_URL : from_settings; +#endif + return PROFILE_FOLDER_URL; +} + +bool AppConfig::exists() const { return boost::filesystem::exists(config_path()); } diff --git a/src/libslic3r/AppConfig.hpp b/src/libslic3r/AppConfig.hpp index cd0f1a5aeb6..f3e2637692d 100644 --- a/src/libslic3r/AppConfig.hpp +++ b/src/libslic3r/AppConfig.hpp @@ -58,9 +58,13 @@ class AppConfig } std::string get(const std::string §ion, const std::string &key) const { std::string value; this->get(section, key, value); return value; } + bool get_bool(const std::string §ion, const std::string &key) const + { return this->get(section, key) == "1"; } std::string get(const std::string &key) const { std::string value; this->get("", key, value); return value; } - void set(const std::string §ion, const std::string &key, const std::string &value) + bool get_bool(const std::string &key) const + { return this->get(key) == "1"; } + bool set(const std::string §ion, const std::string &key, const std::string &value) { #ifndef NDEBUG { @@ -74,10 +78,12 @@ class AppConfig if (old != value) { old = value; m_dirty = true; + return true; } + return false; } - void set(const std::string &key, const std::string &value) - { this->set("", key, value); } + bool set(const std::string &key, const std::string &value) + { return this->set("", key, value); } bool has(const std::string §ion, const std::string &key) const { auto it = m_storage.find(section); @@ -89,40 +95,32 @@ class AppConfig bool has(const std::string &key) const { return this->has("", key); } - void erase(const std::string §ion, const std::string &key) - { - auto it = m_storage.find(section); - if (it != m_storage.end()) { - it->second.erase(key); - } - } + bool erase(const std::string §ion, const std::string &key); bool has_section(const std::string §ion) const { return m_storage.find(section) != m_storage.end(); } const std::map& get_section(const std::string §ion) const { auto it = m_storage.find(section); assert(it != m_storage.end()); return it->second; } - void set_section(const std::string §ion, const std::map& data) - { m_storage[section] = data; } - void clear_section(const std::string §ion) - { m_storage[section].clear(); } + bool set_section(const std::string §ion, std::map data); + bool clear_section(const std::string §ion); typedef std::map>> VendorMap; bool get_variant(const std::string &vendor, const std::string &model, const std::string &variant) const; - void set_variant(const std::string &vendor, const std::string &model, const std::string &variant, bool enable); - void set_vendors(const AppConfig &from); - void set_vendors(const VendorMap &vendors) { m_vendors = vendors; m_dirty = true; } - void set_vendors(VendorMap &&vendors) { m_vendors = std::move(vendors); m_dirty = true; } + bool set_variant(const std::string &vendor, const std::string &model, const std::string &variant, bool enable); + bool set_vendors(const AppConfig &from) { return this->set_vendors(from.vendors()); } + bool set_vendors(const VendorMap &vendors); + bool set_vendors(VendorMap &&vendors); const VendorMap& vendors() const { return m_vendors; } // return recent/skein_directory or recent/config_directory or empty string. std::string get_last_dir() const; - void update_config_dir(const std::string &dir); - void update_skein_dir(const std::string &dir); + bool update_config_dir(const std::string &dir); + bool update_skein_dir(const std::string &dir); //std::string get_last_output_dir(const std::string &alt) const; //void update_last_output_dir(const std::string &dir); std::string get_last_output_dir(const std::string& alt, const bool removable = false) const; - void update_last_output_dir(const std::string &dir, const bool removable = false); + bool update_last_output_dir(const std::string &dir, const bool removable = false); // reset the current print / filament / printer selections, so that // the PresetBundle::load_selections(const AppConfig &config) call will select @@ -130,7 +128,7 @@ class AppConfig void reset_selections(); // Get the default config path from Slic3r::data_dir(). - std::string config_path(); + std::string config_path() const; // Returns true if the user's data directory comes from before Slic3r 1.40.0 (no updating) bool legacy_datadir() const { return m_legacy_datadir; } @@ -139,18 +137,23 @@ class AppConfig // Get the Slic3r version check url. // This returns a hardcoded string unless it is overriden by "version_check_url" in the ini file. std::string version_check_url() const; + // Get the Slic3r url to vendor index archive zip. + std::string index_archive_url() const; + // Get the Slic3r url to folder with vendor profile files. + std::string profile_folder_url() const; + // Returns the original Slic3r version found in the ini file before it was overwritten // by the current version Semver orig_version() const { return m_orig_version; } // Does the config file exist? - bool exists(); + bool exists() const; std::vector get_recent_projects() const; - void set_recent_projects(const std::vector& recent_projects); + bool set_recent_projects(const std::vector& recent_projects); - void set_mouse_device(const std::string& name, double translation_speed, double translation_deadzone, float rotation_speed, float rotation_deadzone, double zoom_speed, bool swap_yz); + bool set_mouse_device(const std::string& name, double translation_speed, double translation_deadzone, float rotation_speed, float rotation_deadzone, double zoom_speed, bool swap_yz); std::vector get_mouse_device_names() const; bool get_mouse_device_translation_speed(const std::string& name, double& speed) const { return get_3dmouse_device_numeric_value(name, "translation_speed", speed); } @@ -167,6 +170,7 @@ class AppConfig static const std::string SECTION_FILAMENTS; static const std::string SECTION_MATERIALS; + static const std::string SECTION_EMBOSS_STYLE; private: template diff --git a/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp b/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp index 04dede54693..381f18b700d 100644 --- a/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp +++ b/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp @@ -274,7 +274,7 @@ std::vector SkeletalTrapezoidation::discretize(const vd_t::edge_type& vd_ Point right_point = VoronoiUtils::getSourcePoint(*right_cell, segments); coord_t d = (right_point - left_point).cast().norm(); Point middle = (left_point + right_point) / 2; - Point x_axis_dir = Point(right_point - left_point).rotate_90_degree_ccw(); + Point x_axis_dir = perp(Point(right_point - left_point)); coord_t x_axis_length = x_axis_dir.cast().norm(); const auto projected_x = [x_axis_dir, x_axis_length, middle](Point from) //Project a point on the edge. @@ -522,55 +522,120 @@ static bool has_missing_twin_edge(const SkeletalTrapezoidationGraph &graph) return false; } -inline static std::unordered_map try_to_fix_degenerated_voronoi_diagram_by_rotation( +inline static void rotate_back_skeletal_trapezoidation_graph_after_fix(SkeletalTrapezoidationGraph &graph, + const double fix_angle, + const std::unordered_map &vertex_mapping) +{ + for (STHalfEdgeNode &node : graph.nodes) { + // If a mapping exists between a rotated point and an original point, use this mapping. Otherwise, rotate a point in the opposite direction. + if (auto node_it = vertex_mapping.find(node.p); node_it != vertex_mapping.end()) + node.p = node_it->second; + else + node.p.rotate(-fix_angle); + } +} + +bool detect_voronoi_edge_intersecting_input_segment(const Geometry::VoronoiDiagram &voronoi_diagram, const std::vector &segments) +{ + for (VoronoiUtils::vd_t::cell_type cell : voronoi_diagram.cells()) { + if (!cell.incident_edge()) + continue; // Degenerated cell, there is no spoon + + if (!cell.contains_segment()) + continue; // Skip cells that don't contain segments. + + const VoronoiUtils::Segment &source_segment = VoronoiUtils::getSourceSegment(cell, segments); + const Vec2d source_segment_from = source_segment.from().cast(); + const Vec2d source_segment_vec = source_segment.to().cast() - source_segment_from; + + Point start_source_point, end_source_point; + VoronoiUtils::vd_t::edge_type *begin_voronoi_edge = nullptr, *end_voronoi_edge = nullptr; + SkeletalTrapezoidation::computeSegmentCellRange(cell, start_source_point, end_source_point, begin_voronoi_edge, end_voronoi_edge, segments); + // All Voronoi vertices must be on left side of the source segment, otherwise Voronoi diagram is invalid. + // FIXME Lukas H.: Be aware that begin_voronoi_edge and end_voronoi_edge could be nullptr in some specific cases. + // It mostly happens when there is some missing Voronoi, for example, in GH issue #8846 (IssuesWithMysteriousPerimeters.3mf). + if (begin_voronoi_edge != nullptr && end_voronoi_edge != nullptr) + for (VoronoiUtils::vd_t::edge_type *edge = begin_voronoi_edge; edge != end_voronoi_edge; edge = edge->next()) + if (const Vec2d edge_v1(edge->vertex1()->x(), edge->vertex1()->y()); Slic3r::cross2(source_segment_vec, edge_v1 - source_segment_from) < 0) + return true; + } + + return false; +} + +enum class VoronoiDiagramStatus { + NO_ISSUE_DETECTED, + MISSING_VORONOI_VERTEX, + NON_PLANAR_VORONOI_DIAGRAM, + VORONOI_EDGE_INTERSECTING_INPUT_SEGMENT, + OTHER_TYPE_OF_VORONOI_DIAGRAM_DEGENERATION +}; + +// Try to detect cases when some Voronoi vertex is missing, when the Voronoi diagram +// is not planar or some Voronoi edge is intersecting input segment. +VoronoiDiagramStatus detect_voronoi_diagram_known_issues(const Geometry::VoronoiDiagram &voronoi_diagram, + const std::vector &segments) +{ + if (const bool has_missing_voronoi_vertex = detect_missing_voronoi_vertex(voronoi_diagram, segments); has_missing_voronoi_vertex) { + return VoronoiDiagramStatus::MISSING_VORONOI_VERTEX; + } else if (const bool has_voronoi_edge_intersecting_input_segment = detect_voronoi_edge_intersecting_input_segment(voronoi_diagram, segments); has_voronoi_edge_intersecting_input_segment) { + // Detection if Voronoi edge is intersecting input segment detects at least one model in GH issue #8446. + return VoronoiDiagramStatus::VORONOI_EDGE_INTERSECTING_INPUT_SEGMENT; + } else if (const bool is_voronoi_diagram_planar = Geometry::VoronoiUtilsCgal::is_voronoi_diagram_planar_angle(voronoi_diagram, segments); !is_voronoi_diagram_planar) { + // Detection of non-planar Voronoi diagram detects at least GH issues #8474, #8514 and #8446. + return VoronoiDiagramStatus::NON_PLANAR_VORONOI_DIAGRAM; + } + return VoronoiDiagramStatus::NO_ISSUE_DETECTED; +} + +inline static std::pair, double> try_to_fix_degenerated_voronoi_diagram_by_rotation( Geometry::VoronoiDiagram &voronoi_diagram, const Polygons &polys, Polygons &polys_rotated, std::vector &segments, - const double fix_angle) + const std::vector &fix_angles) { + const Polygons polys_rotated_original = polys_rotated; + double fixed_by_angle = fix_angles.front(); std::unordered_map vertex_mapping; - for (Polygon &poly : polys_rotated) - poly.rotate(fix_angle); - assert(polys_rotated.size() == polys.size()); - for (size_t poly_idx = 0; poly_idx < polys.size(); ++poly_idx) { - assert(polys_rotated[poly_idx].size() == polys[poly_idx].size()); - for (size_t point_idx = 0; point_idx < polys[poly_idx].size(); ++point_idx) - vertex_mapping.insert({polys_rotated[poly_idx][point_idx], polys[poly_idx][point_idx]}); - } + for (const double &fix_angle : fix_angles) { + vertex_mapping.clear(); + polys_rotated = polys_rotated_original; + fixed_by_angle = fix_angle; - segments.clear(); - for (size_t poly_idx = 0; poly_idx < polys_rotated.size(); poly_idx++) - for (size_t point_idx = 0; point_idx < polys_rotated[poly_idx].size(); point_idx++) - segments.emplace_back(&polys_rotated, poly_idx, point_idx); + for (Polygon &poly : polys_rotated) + poly.rotate(fix_angle); - voronoi_diagram.clear(); - construct_voronoi(segments.begin(), segments.end(), &voronoi_diagram); + assert(polys_rotated.size() == polys.size()); + for (size_t poly_idx = 0; poly_idx < polys.size(); ++poly_idx) { + assert(polys_rotated[poly_idx].size() == polys[poly_idx].size()); + for (size_t point_idx = 0; point_idx < polys[poly_idx].size(); ++point_idx) + vertex_mapping.insert({polys_rotated[poly_idx][point_idx], polys[poly_idx][point_idx]}); + } + + segments.clear(); + for (size_t poly_idx = 0; poly_idx < polys_rotated.size(); poly_idx++) + for (size_t point_idx = 0; point_idx < polys_rotated[poly_idx].size(); point_idx++) + segments.emplace_back(&polys_rotated, poly_idx, point_idx); + + voronoi_diagram.clear(); + construct_voronoi(segments.begin(), segments.end(), &voronoi_diagram); #ifdef ARACHNE_DEBUG_VORONOI - { - static int iRun = 0; - dump_voronoi_to_svg(debug_out_path("arachne_voronoi-diagram-rotated-%d.svg", iRun++).c_str(), voronoi_diagram, to_points(polys), to_lines(polys)); - } + { + static int iRun = 0; + dump_voronoi_to_svg(debug_out_path("arachne_voronoi-diagram-rotated-%d.svg", iRun++).c_str(), voronoi_diagram, to_points(polys), to_lines(polys)); + } #endif - assert(Geometry::VoronoiUtilsCgal::is_voronoi_diagram_planar_intersection(voronoi_diagram)); + if (detect_voronoi_diagram_known_issues(voronoi_diagram, segments) == VoronoiDiagramStatus::NO_ISSUE_DETECTED) + break; + } - return vertex_mapping; -} + assert(Geometry::VoronoiUtilsCgal::is_voronoi_diagram_planar_intersection(voronoi_diagram)); -inline static void rotate_back_skeletal_trapezoidation_graph_after_fix(SkeletalTrapezoidationGraph &graph, - const double fix_angle, - const std::unordered_map &vertex_mapping) -{ - for (STHalfEdgeNode &node : graph.nodes) { - // If a mapping exists between a rotated point and an original point, use this mapping. Otherwise, rotate a point in the opposite direction. - if (auto node_it = vertex_mapping.find(node.p); node_it != vertex_mapping.end()) - node.p = node_it->second; - else - node.p.rotate(-fix_angle); - } + return {vertex_mapping, fixed_by_angle}; } void SkeletalTrapezoidation::constructFromPolygons(const Polygons& polys) @@ -614,36 +679,35 @@ void SkeletalTrapezoidation::constructFromPolygons(const Polygons& polys) } #endif - // Try to detect cases when some Voronoi vertex is missing and when - // the Voronoi diagram is not planar. - // When any Voronoi vertex is missing, or the Voronoi diagram is not - // planar, rotate the input polygon and try again. - const bool has_missing_voronoi_vertex = detect_missing_voronoi_vertex(voronoi_diagram, segments); - // Detection of non-planar Voronoi diagram detects at least GH issues #8474, #8514 and #8446. - const bool is_voronoi_diagram_planar = Geometry::VoronoiUtilsCgal::is_voronoi_diagram_planar_angle(voronoi_diagram); - const double fix_angle = PI / 6; + // When any Voronoi vertex is missing, the Voronoi diagram is not planar, or some voronoi edge is + // intersecting input segment, rotate the input polygon and try again. + VoronoiDiagramStatus status = detect_voronoi_diagram_known_issues(voronoi_diagram, segments); + const std::vector fix_angles = {PI / 6, PI / 5, PI / 7, PI / 11}; + double fixed_by_angle = fix_angles.front(); std::unordered_map vertex_mapping; // polys_copy is referenced through items stored in the std::vector segments. Polygons polys_copy = polys; - if (has_missing_voronoi_vertex || !is_voronoi_diagram_planar) { - if (has_missing_voronoi_vertex) + if (status != VoronoiDiagramStatus::NO_ISSUE_DETECTED) { + if (status == VoronoiDiagramStatus::MISSING_VORONOI_VERTEX) BOOST_LOG_TRIVIAL(warning) << "Detected missing Voronoi vertex, input polygons will be rotated back and forth."; - else if (!is_voronoi_diagram_planar) + else if (status == VoronoiDiagramStatus::NON_PLANAR_VORONOI_DIAGRAM) BOOST_LOG_TRIVIAL(warning) << "Detected non-planar Voronoi diagram, input polygons will be rotated back and forth."; + else if (status == VoronoiDiagramStatus::VORONOI_EDGE_INTERSECTING_INPUT_SEGMENT) + BOOST_LOG_TRIVIAL(warning) << "Detected Voronoi edge intersecting input segment, input polygons will be rotated back and forth."; - vertex_mapping = try_to_fix_degenerated_voronoi_diagram_by_rotation(voronoi_diagram, polys, polys_copy, segments, fix_angle); + std::tie(vertex_mapping, fixed_by_angle) = try_to_fix_degenerated_voronoi_diagram_by_rotation(voronoi_diagram, polys, polys_copy, segments, fix_angles); - assert(!detect_missing_voronoi_vertex(voronoi_diagram, segments)); - assert(Geometry::VoronoiUtilsCgal::is_voronoi_diagram_planar_angle(voronoi_diagram)); - if (detect_missing_voronoi_vertex(voronoi_diagram, segments)) + VoronoiDiagramStatus status_after_fix = detect_voronoi_diagram_known_issues(voronoi_diagram, segments); + assert(status_after_fix == VoronoiDiagramStatus::NO_ISSUE_DETECTED); + if (status_after_fix == VoronoiDiagramStatus::MISSING_VORONOI_VERTEX) BOOST_LOG_TRIVIAL(error) << "Detected missing Voronoi vertex even after the rotation of input."; - else if (!Geometry::VoronoiUtilsCgal::is_voronoi_diagram_planar_angle(voronoi_diagram)) + else if (status_after_fix == VoronoiDiagramStatus::NON_PLANAR_VORONOI_DIAGRAM) BOOST_LOG_TRIVIAL(error) << "Detected non-planar Voronoi diagram even after the rotation of input."; + else if (status_after_fix == VoronoiDiagramStatus::VORONOI_EDGE_INTERSECTING_INPUT_SEGMENT) + BOOST_LOG_TRIVIAL(error) << "Detected Voronoi edge intersecting input segment even after the rotation of input."; } - bool degenerated_voronoi_diagram = has_missing_voronoi_vertex || !is_voronoi_diagram_planar; - process_voronoi_diagram: assert(this->graph.edges.empty() && this->graph.nodes.empty() && this->vd_edge_to_he_edge.empty() && this->vd_node_to_he_node.empty()); for (vd_t::cell_type cell : voronoi_diagram.cells()) { @@ -652,35 +716,35 @@ void SkeletalTrapezoidation::constructFromPolygons(const Polygons& polys) Point start_source_point; Point end_source_point; - vd_t::edge_type* starting_vonoroi_edge = nullptr; - vd_t::edge_type* ending_vonoroi_edge = nullptr; + vd_t::edge_type* starting_voronoi_edge = nullptr; + vd_t::edge_type* ending_voronoi_edge = nullptr; // Compute and store result in above variables - + if (cell.contains_point()) { - const bool keep_going = computePointCellRange(cell, start_source_point, end_source_point, starting_vonoroi_edge, ending_vonoroi_edge, segments); + const bool keep_going = computePointCellRange(cell, start_source_point, end_source_point, starting_voronoi_edge, ending_voronoi_edge, segments); if (!keep_going) continue; } else { assert(cell.contains_segment()); - computeSegmentCellRange(cell, start_source_point, end_source_point, starting_vonoroi_edge, ending_vonoroi_edge, segments); + computeSegmentCellRange(cell, start_source_point, end_source_point, starting_voronoi_edge, ending_voronoi_edge, segments); } - - if (!starting_vonoroi_edge || !ending_vonoroi_edge) { + + if (!starting_voronoi_edge || !ending_voronoi_edge) { assert(false && "Each cell should start / end in a polygon vertex"); continue; } - + // Copy start to end edge to graph edge_t* prev_edge = nullptr; - assert(VoronoiUtils::p(starting_vonoroi_edge->vertex1()).x() <= std::numeric_limits::max() && VoronoiUtils::p(starting_vonoroi_edge->vertex1()).x() >= std::numeric_limits::lowest()); - assert(VoronoiUtils::p(starting_vonoroi_edge->vertex1()).y() <= std::numeric_limits::max() && VoronoiUtils::p(starting_vonoroi_edge->vertex1()).y() >= std::numeric_limits::lowest()); - transferEdge(start_source_point, VoronoiUtils::p(starting_vonoroi_edge->vertex1()).cast(), *starting_vonoroi_edge, prev_edge, start_source_point, end_source_point, segments); - node_t* starting_node = vd_node_to_he_node[starting_vonoroi_edge->vertex0()]; + assert(VoronoiUtils::p(starting_voronoi_edge->vertex1()).x() <= std::numeric_limits::max() && VoronoiUtils::p(starting_voronoi_edge->vertex1()).x() >= std::numeric_limits::lowest()); + assert(VoronoiUtils::p(starting_voronoi_edge->vertex1()).y() <= std::numeric_limits::max() && VoronoiUtils::p(starting_voronoi_edge->vertex1()).y() >= std::numeric_limits::lowest()); + transferEdge(start_source_point, VoronoiUtils::p(starting_voronoi_edge->vertex1()).cast(), *starting_voronoi_edge, prev_edge, start_source_point, end_source_point, segments); + node_t* starting_node = vd_node_to_he_node[starting_voronoi_edge->vertex0()]; starting_node->data.distance_to_boundary = 0; constexpr bool is_next_to_start_or_end = true; graph.makeRib(prev_edge, start_source_point, end_source_point, is_next_to_start_or_end); - for (vd_t::edge_type* vd_edge = starting_vonoroi_edge->next(); vd_edge != ending_vonoroi_edge; vd_edge = vd_edge->next()) { + for (vd_t::edge_type* vd_edge = starting_voronoi_edge->next(); vd_edge != ending_voronoi_edge; vd_edge = vd_edge->next()) { assert(vd_edge->is_finite()); assert(VoronoiUtils::p(vd_edge->vertex0()).x() <= std::numeric_limits::max() && VoronoiUtils::p(vd_edge->vertex0()).x() >= std::numeric_limits::lowest()); @@ -692,12 +756,12 @@ void SkeletalTrapezoidation::constructFromPolygons(const Polygons& polys) Point v2 = VoronoiUtils::p(vd_edge->vertex1()).cast(); transferEdge(v1, v2, *vd_edge, prev_edge, start_source_point, end_source_point, segments); - graph.makeRib(prev_edge, start_source_point, end_source_point, vd_edge->next() == ending_vonoroi_edge); + graph.makeRib(prev_edge, start_source_point, end_source_point, vd_edge->next() == ending_voronoi_edge); } - assert(VoronoiUtils::p(starting_vonoroi_edge->vertex0()).x() <= std::numeric_limits::max() && VoronoiUtils::p(starting_vonoroi_edge->vertex0()).x() >= std::numeric_limits::lowest()); - assert(VoronoiUtils::p(starting_vonoroi_edge->vertex0()).y() <= std::numeric_limits::max() && VoronoiUtils::p(starting_vonoroi_edge->vertex0()).y() >= std::numeric_limits::lowest()); - transferEdge(VoronoiUtils::p(ending_vonoroi_edge->vertex0()).cast(), end_source_point, *ending_vonoroi_edge, prev_edge, start_source_point, end_source_point, segments); + assert(VoronoiUtils::p(starting_voronoi_edge->vertex0()).x() <= std::numeric_limits::max() && VoronoiUtils::p(starting_voronoi_edge->vertex0()).x() >= std::numeric_limits::lowest()); + assert(VoronoiUtils::p(starting_voronoi_edge->vertex0()).y() <= std::numeric_limits::max() && VoronoiUtils::p(starting_voronoi_edge->vertex0()).y() >= std::numeric_limits::lowest()); + transferEdge(VoronoiUtils::p(ending_voronoi_edge->vertex0()).cast(), end_source_point, *ending_voronoi_edge, prev_edge, start_source_point, end_source_point, segments); prev_edge->to->data.distance_to_boundary = 0; } @@ -705,10 +769,10 @@ void SkeletalTrapezoidation::constructFromPolygons(const Polygons& polys) // When this degenerated Voronoi diagram is processed, the resulting half-edge structure contains some edges that don't have // a twin edge. Based on this, we created a fast mechanism that detects those causes and tries to recompute the Voronoi // diagram on slightly rotated input polygons that usually make the Voronoi generator generate a non-degenerated Voronoi diagram. - if (!degenerated_voronoi_diagram && has_missing_twin_edge(this->graph)) { + if (status == VoronoiDiagramStatus::NO_ISSUE_DETECTED && has_missing_twin_edge(this->graph)) { BOOST_LOG_TRIVIAL(warning) << "Detected degenerated Voronoi diagram, input polygons will be rotated back and forth."; - degenerated_voronoi_diagram = true; - vertex_mapping = try_to_fix_degenerated_voronoi_diagram_by_rotation(voronoi_diagram, polys, polys_copy, segments, fix_angle); + status = VoronoiDiagramStatus::OTHER_TYPE_OF_VORONOI_DIAGRAM_DEGENERATION; + std::tie(vertex_mapping, fixed_by_angle) = try_to_fix_degenerated_voronoi_diagram_by_rotation(voronoi_diagram, polys, polys_copy, segments, fix_angles); assert(!detect_missing_voronoi_vertex(voronoi_diagram, segments)); if (detect_missing_voronoi_vertex(voronoi_diagram, segments)) @@ -724,15 +788,15 @@ void SkeletalTrapezoidation::constructFromPolygons(const Polygons& polys) goto process_voronoi_diagram; } - if (degenerated_voronoi_diagram) { + if (status != VoronoiDiagramStatus::NO_ISSUE_DETECTED) { assert(!has_missing_twin_edge(this->graph)); if (has_missing_twin_edge(this->graph)) BOOST_LOG_TRIVIAL(error) << "Detected degenerated Voronoi diagram even after the rotation of input."; } - if (degenerated_voronoi_diagram) - rotate_back_skeletal_trapezoidation_graph_after_fix(this->graph, fix_angle, vertex_mapping); + if (status != VoronoiDiagramStatus::NO_ISSUE_DETECTED) + rotate_back_skeletal_trapezoidation_graph_after_fix(this->graph, fixed_by_angle, vertex_mapping); #ifdef ARACHNE_DEBUG assert(Geometry::VoronoiUtilsCgal::is_voronoi_diagram_planar_intersection(voronoi_diagram)); @@ -742,7 +806,7 @@ void SkeletalTrapezoidation::constructFromPolygons(const Polygons& polys) graph.collapseSmallEdges(); - // Set [incident_edge] the the first possible edge that way we can iterate over all reachable edges from node.incident_edge, + // Set [incident_edge] the first possible edge that way we can iterate over all reachable edges from node.incident_edge, // without needing to iterate backward for (edge_t& edge : graph.edges) if (!edge.prev) diff --git a/src/libslic3r/Arachne/SkeletalTrapezoidation.hpp b/src/libslic3r/Arachne/SkeletalTrapezoidation.hpp index 819b71367b2..b4029d586dd 100644 --- a/src/libslic3r/Arachne/SkeletalTrapezoidation.hpp +++ b/src/libslic3r/Arachne/SkeletalTrapezoidation.hpp @@ -9,6 +9,7 @@ #include // smart pointers #include #include // pair +#include #include "utils/HalfEdgeGraph.hpp" #include "utils/PolygonsSegmentIndex.hpp" @@ -229,7 +230,7 @@ class SkeletalTrapezoidation * /return Whether the cell is inside of the polygon. If it's outside of the * polygon we should skip processing it altogether. */ - bool computePointCellRange(vd_t::cell_type& cell, Point& start_source_point, Point& end_source_point, vd_t::edge_type*& starting_vd_edge, vd_t::edge_type*& ending_vd_edge, const std::vector& segments); + static bool computePointCellRange(vd_t::cell_type& cell, Point& start_source_point, Point& end_source_point, vd_t::edge_type*& starting_vd_edge, vd_t::edge_type*& ending_vd_edge, const std::vector& segments); /*! * Compute the range of line segments that surround a cell of the skeletal @@ -255,7 +256,7 @@ class SkeletalTrapezoidation * /return Whether the cell is inside of the polygon. If it's outside of the * polygon we should skip processing it altogether. */ - void computeSegmentCellRange(vd_t::cell_type& cell, Point& start_source_point, Point& end_source_point, vd_t::edge_type*& starting_vd_edge, vd_t::edge_type*& ending_vd_edge, const std::vector& segments); + static void computeSegmentCellRange(vd_t::cell_type& cell, Point& start_source_point, Point& end_source_point, vd_t::edge_type*& starting_vd_edge, vd_t::edge_type*& ending_vd_edge, const std::vector& segments); /*! * For VD cells associated with an input polygon vertex, we need to separate the node at the end and start of the cell into two @@ -597,6 +598,8 @@ class SkeletalTrapezoidation * Genrate small segments for local maxima where the beading would only result in a single bead */ void generateLocalMaximaSingleBeads(); + + friend bool detect_voronoi_edge_intersecting_input_segment(const Geometry::VoronoiDiagram &voronoi_diagram, const std::vector &segments); }; } // namespace Slic3r::Arachne diff --git a/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.hpp b/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.hpp index cfdbfecdafc..efda323837e 100644 --- a/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.hpp +++ b/src/libslic3r/Arachne/SkeletalTrapezoidationGraph.hpp @@ -10,6 +10,11 @@ #include "SkeletalTrapezoidationEdge.hpp" #include "SkeletalTrapezoidationJoint.hpp" +namespace Slic3r +{ +class Line; +}; + namespace Slic3r::Arachne { diff --git a/src/libslic3r/Arachne/utils/ExtrusionLine.cpp b/src/libslic3r/Arachne/utils/ExtrusionLine.cpp index 75e4d533890..8631d9e17bb 100644 --- a/src/libslic3r/Arachne/utils/ExtrusionLine.cpp +++ b/src/libslic3r/Arachne/utils/ExtrusionLine.cpp @@ -113,8 +113,7 @@ void ExtrusionLine::simplify(const int64_t smallest_line_segment_squared, const //h^2 = (L / b)^2 [square it] //h^2 = L^2 / b^2 [factor the divisor] const auto height_2 = int64_t(double(area_removed_so_far) * double(area_removed_so_far) / double(base_length_2)); - coord_t weighted_average_width; - const int64_t extrusion_area_error = calculateExtrusionAreaDeviationError(previous, current, next, weighted_average_width); + const int64_t extrusion_area_error = calculateExtrusionAreaDeviationError(previous, current, next); if ((height_2 <= scaled(0.001) //Almost exactly colinear (barring rounding errors). && Line::distance_to_infinite(current.p, previous.p, next.p) <= scaled(0.001)) // Make sure that height_2 is not small because of cancellation of positive and negative areas // We shouldn't remove middle junctions of colinear segments if the area changed for the C-P segment is exceeding the maximum allowed @@ -189,8 +188,7 @@ void ExtrusionLine::simplify(const int64_t smallest_line_segment_squared, const junctions = new_junctions; } -int64_t ExtrusionLine::calculateExtrusionAreaDeviationError(ExtrusionJunction A, ExtrusionJunction B, ExtrusionJunction C, coord_t& weighted_average_width) -{ +int64_t ExtrusionLine::calculateExtrusionAreaDeviationError(ExtrusionJunction A, ExtrusionJunction B, ExtrusionJunction C) { /* * A B C A C * --------------- ************** @@ -208,27 +206,19 @@ int64_t ExtrusionLine::calculateExtrusionAreaDeviationError(ExtrusionJunction A, * weighted-average width for the entire extrusion line. * * */ - const int64_t ab_length = (B - A).cast().norm(); - const int64_t bc_length = (C - B).cast().norm(); - const coord_t width_diff = std::max(std::abs(B.w - A.w), std::abs(C.w - B.w)); - if (width_diff > 1) - { + const int64_t ab_length = (B.p - A.p).cast().norm(); + const int64_t bc_length = (C.p - B.p).cast().norm(); + if (const coord_t width_diff = std::max(std::abs(B.w - A.w), std::abs(C.w - B.w)); width_diff > 1) { // Adjust the width only if there is a difference, or else the rounding errors may produce the wrong // weighted average value. - const int64_t ab_weight = (A.w + B.w) / 2; - const int64_t bc_weight = (B.w + C.w) / 2; - assert(((ab_length * ab_weight + bc_length * bc_weight) / (C - A).cast().norm()) <= std::numeric_limits::max()); - weighted_average_width = (ab_length * ab_weight + bc_length * bc_weight) / (C - A).cast().norm(); - assert((int64_t(std::abs(ab_weight - weighted_average_width)) * ab_length + int64_t(std::abs(bc_weight - weighted_average_width)) * bc_length) <= double(std::numeric_limits::max())); - return std::abs(ab_weight - weighted_average_width) * ab_length + std::abs(bc_weight - weighted_average_width) * bc_length; - } - else - { + const int64_t ab_weight = (A.w + B.w) / 2; + const int64_t bc_weight = (B.w + C.w) / 2; + const int64_t weighted_average_width = (ab_length * ab_weight + bc_length * bc_weight) / (ab_length + bc_length); + const int64_t ac_length = (C.p - A.p).cast().norm(); + return std::abs((ab_weight * ab_length + bc_weight * bc_length) - (weighted_average_width * ac_length)); + } else { // If the width difference is very small, then select the width of the segment that is longer - weighted_average_width = ab_length > bc_length ? A.w : B.w; - assert((int64_t(width_diff) * int64_t(bc_length)) <= std::numeric_limits::max()); - assert((int64_t(width_diff) * int64_t(ab_length)) <= std::numeric_limits::max()); - return ab_length > bc_length ? width_diff * bc_length : width_diff * ab_length; + return ab_length > bc_length ? int64_t(width_diff) * bc_length : int64_t(width_diff) * ab_length; } } @@ -268,13 +258,13 @@ void extrusion_paths_append(ExtrusionPaths &dst, const ClipperLib_Z::Paths &extr { for (const ClipperLib_Z::Path &extrusion_path : extrusion_paths) { ThickPolyline thick_polyline = Arachne::to_thick_polyline(extrusion_path); - Slic3r::append(dst, thick_polyline_to_multi_path(thick_polyline, role, flow, scaled(0.05), float(SCALED_EPSILON)).paths); + Slic3r::append(dst, PerimeterGenerator::thick_polyline_to_multi_path(thick_polyline, role, flow, scaled(0.05), float(SCALED_EPSILON)).paths); } } void extrusion_paths_append(ExtrusionPaths &dst, const Arachne::ExtrusionLine &extrusion, const ExtrusionRole role, const Flow &flow) { ThickPolyline thick_polyline = Arachne::to_thick_polyline(extrusion); - Slic3r::append(dst, thick_polyline_to_multi_path(thick_polyline, role, flow, scaled(0.05), float(SCALED_EPSILON)).paths); + Slic3r::append(dst, PerimeterGenerator::thick_polyline_to_multi_path(thick_polyline, role, flow, scaled(0.05), float(SCALED_EPSILON)).paths); } } // namespace Slic3r \ No newline at end of file diff --git a/src/libslic3r/Arachne/utils/ExtrusionLine.hpp b/src/libslic3r/Arachne/utils/ExtrusionLine.hpp index 7ac1a3c4c8b..d39e1e07b9c 100644 --- a/src/libslic3r/Arachne/utils/ExtrusionLine.hpp +++ b/src/libslic3r/Arachne/utils/ExtrusionLine.hpp @@ -14,7 +14,7 @@ #include "../../../clipper/clipper_z.hpp" namespace Slic3r { -class ThickPolyline; +struct ThickPolyline; } namespace Slic3r::Arachne @@ -186,9 +186,8 @@ struct ExtrusionLine * \param A Start point of the 3-point-straight line * \param B Intermediate point of the 3-point-straight line * \param C End point of the 3-point-straight line - * \param weighted_average_width The weighted average of the widths of the two colinear extrusion segments * */ - static int64_t calculateExtrusionAreaDeviationError(ExtrusionJunction A, ExtrusionJunction B, ExtrusionJunction C, coord_t& weighted_average_width); + static int64_t calculateExtrusionAreaDeviationError(ExtrusionJunction A, ExtrusionJunction B, ExtrusionJunction C); bool is_contour() const; diff --git a/src/libslic3r/Arachne/utils/VoronoiUtils.cpp b/src/libslic3r/Arachne/utils/VoronoiUtils.cpp index 82bd79523fc..069e1f5ad51 100644 --- a/src/libslic3r/Arachne/utils/VoronoiUtils.cpp +++ b/src/libslic3r/Arachne/utils/VoronoiUtils.cpp @@ -165,7 +165,7 @@ std::vector VoronoiUtils::discretizeParabola(const Point& p, const Segmen Line(a, b).distance_to_infinite_squared(p, &pxx); const Point ppxx = pxx - p; const coord_t d = ppxx.cast().norm(); - const PointMatrix rot = PointMatrix(ppxx.rotate_90_degree_ccw()); + const PointMatrix rot = PointMatrix(perp(ppxx)); if (d == 0) { diff --git a/src/libslic3r/Arachne/utils/linearAlg2D.hpp b/src/libslic3r/Arachne/utils/linearAlg2D.hpp index 797bae0b97c..304984b1ca8 100644 --- a/src/libslic3r/Arachne/utils/linearAlg2D.hpp +++ b/src/libslic3r/Arachne/utils/linearAlg2D.hpp @@ -38,15 +38,11 @@ inline static bool isInsideCorner(const Point &a, const Point &b, const Point &c return (p0.cast() * int64_t(len) / _len).cast(); }; - auto rotate_90_degree_ccw = [](const Vec2d &p) -> Vec2d { - return {-p.y(), p.x()}; - }; - constexpr coord_t normal_length = 10000; //Create a normal vector of reasonable length in order to reduce rounding error. const Point ba = normal(a - b, normal_length); const Point bc = normal(c - b, normal_length); const Vec2d bq = query_point.cast() - b.cast(); - const Vec2d perpendicular = rotate_90_degree_ccw(bq); //The query projects to this perpendicular to coordinate 0. + const Vec2d perpendicular = perp(bq); //The query projects to this perpendicular to coordinate 0. const double project_a_perpendicular = ba.cast().dot(perpendicular); //Project vertex A on the perpendicular line. const double project_c_perpendicular = bc.cast().dot(perpendicular); //Project vertex C on the perpendicular line. diff --git a/src/libslic3r/Arrange.cpp b/src/libslic3r/Arrange.cpp index 5776e6d1e83..b3293e17f22 100644 --- a/src/libslic3r/Arrange.cpp +++ b/src/libslic3r/Arrange.cpp @@ -431,24 +431,11 @@ template<> std::function AutoArranger::get_objfn() { auto bincenter = m_bin.center(); return [this, bincenter](const Item &item) { - + auto result = objfunc(item, bincenter); - + double score = std::get<0>(result); - - auto isBig = [this](const Item& itm) { - return itm.area() / m_bin_area > BIG_ITEM_TRESHOLD ; - }; - - if(isBig(item)) { - auto mp = m_merged_pile; - mp.push_back(item.transformedShape()); - auto chull = sl::convexHull(mp); - double miss = Placer::overfit(chull, m_bin); - if(miss < 0) miss = 0; - score += miss*miss; - } - + return score; }; } @@ -495,7 +482,7 @@ void _arrange( { // Integer ceiling the min distance from the bed perimeters coord_t md = params.min_obj_distance; - md = md / 2; + md = md / 2 - params.min_bed_distance; auto corrected_bin = bin; sl::offset(corrected_bin, md); @@ -503,11 +490,11 @@ void _arrange( mod_params.min_obj_distance = 0; AutoArranger arranger{corrected_bin, mod_params, progressfn, stopfn}; - + auto infl = coord_t(std::ceil(params.min_obj_distance / 2.0)); for (Item& itm : shapes) itm.inflate(infl); for (Item& itm : excludes) itm.inflate(infl); - + remove_large_items(excludes, corrected_bin); // If there is something on the plate @@ -517,7 +504,7 @@ void _arrange( inp.reserve(shapes.size() + excludes.size()); for (auto &itm : shapes ) inp.emplace_back(itm); for (auto &itm : excludes) inp.emplace_back(itm); - + // Use the minimum bounding box rotation as a starting point. // TODO: This only works for convex hull. If we ever switch to concave // polygon nesting, a convex hull needs to be calculated. @@ -534,7 +521,13 @@ void _arrange( } } - arranger(inp.begin(), inp.end()); + if (sl::area(corrected_bin) > 0) + arranger(inp.begin(), inp.end()); + else { + for (Item &itm : inp) + itm.binId(BIN_ID_UNSET); + } + for (Item &itm : inp) itm.inflate(-infl); } @@ -558,7 +551,7 @@ static CircleBed to_circle(const Point ¢er, const Points& points) { std::vector vertex_distances; double avg_dist = 0; - for (auto pt : points) + for (const Point& pt : points) { double distance = distance_to(center, pt); vertex_distances.push_back(distance); @@ -587,16 +580,15 @@ static void process_arrangeable(const ArrangePolygon &arrpoly, const Vec2crd &offs = arrpoly.translation; double rotation = arrpoly.rotation; - // This fixes: - // https://github.com/prusa3d/PrusaSlicer/issues/2209 - if (p.points.size() < 3) - return; - outp.emplace_back(std::move(p)); outp.back().rotation(rotation); outp.back().translation({offs.x(), offs.y()}); + outp.back().inflate(arrpoly.inflation); outp.back().binId(arrpoly.bed_idx); outp.back().priority(arrpoly.priority); + outp.back().setOnPackedFn([&arrpoly](Item &itm){ + itm.inflate(-arrpoly.inflation); + }); } template auto call_with_bed(const Points &bed, Fn &&fn) @@ -687,9 +679,7 @@ void arrange(ArrangePolygons &items, const SegmentedRectangleBed &bed, const ArrangeParams ¶ms) { - auto arrbed = bed.bb; - arrbed.offset(-bed.inset); - arrange(items, excludes, arrbed, params); + arrange(items, excludes, bed.bb, params); if (! excludes.empty()) return; @@ -721,21 +711,21 @@ void arrange(ArrangePolygons &items, bb.max.y() = scaled(std::ceil(pilesz.y() / piecesz.y()) * piecesz.y()); switch (params.alignment) { case Pivots::BottomLeft: - bb.translate((bed.bb.min - bb.min)); + bb.translate(bed.bb.min - bb.min); break; case Pivots::TopRight: - bb.translate((bed.bb.max - bb.max)); + bb.translate(bed.bb.max - bb.max); break; case Pivots::BottomRight: { Point bedref{bed.bb.max.x(), bed.bb.min.y()}; Point bbref {bb.max.x(), bb.min.y()}; - bb.translate((bedref - bbref)); + bb.translate(bedref - bbref); break; } case Pivots::TopLeft: { Point bedref{bed.bb.min.x(), bed.bb.max.y()}; Point bbref {bb.min.x(), bb.max.y()}; - bb.translate((bedref - bbref)); + bb.translate(bedref - bbref); break; } case Pivots::Center: { @@ -747,7 +737,7 @@ void arrange(ArrangePolygons &items, Vec2crd d = bb.center() - pilebb[bedidx].center(); auto bedbb = bed.bb; - bedbb.offset(-bed.inset); + bedbb.offset(-params.min_bed_distance); auto pilebbx = pilebb[bedidx]; pilebbx.translate(d); diff --git a/src/libslic3r/Arrange.hpp b/src/libslic3r/Arrange.hpp index d5e5ea7c3ef..4ed00668c9f 100644 --- a/src/libslic3r/Arrange.hpp +++ b/src/libslic3r/Arrange.hpp @@ -28,7 +28,7 @@ class CircleBed { double radius_; public: - inline CircleBed(): center_(0, 0), radius_(std::nan("")) {} + inline CircleBed(): center_(0, 0), radius_(NaNd) {} explicit inline CircleBed(const Point& c, double r): center_(c), radius_(r) {} inline double radius() const { return radius_; } @@ -38,7 +38,6 @@ class CircleBed { struct SegmentedRectangleBed { Vec<2, size_t> segments; BoundingBox bb; - coord_t inset = 0; SegmentedRectangleBed (const BoundingBox &bb, size_t segments_x, @@ -72,18 +71,18 @@ static const constexpr int UNARRANGED = -1; /// polygon belongs: UNARRANGED means no place for the polygon /// (also the initial state before arrange), 0..N means the index of the bed. /// Zero is the physical bed, larger than zero means a virtual bed. -struct ArrangePolygon { +struct ArrangePolygon { ExPolygon poly; /// The 2D silhouette to be arranged Vec2crd translation{0, 0}; /// The translation of the poly double rotation{0.0}; /// The rotation of the poly in radians coord_t inflation = 0; /// Arrange with inflated polygon int bed_idx{UNARRANGED}; /// To which logical bed does poly belong... int priority{0}; - + // If empty, any rotation is allowed (currently unsupported) // If only a zero is there, no rotation is allowed std::vector allowed_rotations = {0.}; - + /// Optional setter function which can store arbitrary data in its closure std::function setter = nullptr; @@ -110,15 +109,18 @@ enum class Pivots { }; struct ArrangeParams { - + /// The minimum distance which is allowed for any /// pair of items on the print bed in any direction. coord_t min_obj_distance = 0; - + + /// The minimum distance of any object from bed edges + coord_t min_bed_distance = 0; + /// The accuracy of optimization. /// Goes from 0.0 to 1.0 and scales performance as well float accuracy = 1.f; - + /// Allow parallel execution. bool parallel = true; @@ -135,10 +137,10 @@ struct ArrangeParams { std::function progressind; std::function on_packed; - + /// A predicate returning true if abort is needed. std::function stopcondition; - + ArrangeParams() = default; explicit ArrangeParams(coord_t md) : min_obj_distance(md) {} }; diff --git a/src/libslic3r/SLA/BoostAdapter.hpp b/src/libslic3r/BoostAdapter.hpp similarity index 63% rename from src/libslic3r/SLA/BoostAdapter.hpp rename to src/libslic3r/BoostAdapter.hpp index 13e0465b142..36256213f9f 100644 --- a/src/libslic3r/SLA/BoostAdapter.hpp +++ b/src/libslic3r/BoostAdapter.hpp @@ -38,54 +38,28 @@ template struct access { } }; -// For Vec2d /////////////////////////////////////////////////////////////////// +// For Vec /////////////////////////////////////////////////////////////// -template<> struct tag { +template struct tag> { using type = point_tag; }; -template<> struct coordinate_type { - using type = double; +template struct coordinate_type> { + using type = T; }; -template<> struct coordinate_system { +template struct coordinate_system> { using type = cs::cartesian; }; -template<> struct dimension: boost::mpl::int_<2> {}; +template struct dimension>: boost::mpl::int_ {}; -template struct access { - static inline double get(Slic3r::Vec2d const& a) { +template struct access, d> { + static inline T get(Slic3r::Vec const& a) { return a(d); } - static inline void set(Slic3r::Vec2d& a, double const& value) { - a(d) = value; - } -}; - -// For Vec3d /////////////////////////////////////////////////////////////////// - -template<> struct tag { - using type = point_tag; -}; - -template<> struct coordinate_type { - using type = double; -}; - -template<> struct coordinate_system { - using type = cs::cartesian; -}; - -template<> struct dimension: boost::mpl::int_<3> {}; - -template struct access { - static inline double get(Slic3r::Vec3d const& a) { - return a(d); - } - - static inline void set(Slic3r::Vec3d& a, double const& value) { + static inline void set(Slic3r::Vec& a, T const& value) { a(d) = value; } }; @@ -122,6 +96,36 @@ struct indexed_access { } }; +template using BB3 = Slic3r::BoundingBox3Base>; + +template struct tag> { + using type = box_tag; +}; + +template struct point_type> { + using type = Slic3r::Vec<3, T>; +}; + +template +struct indexed_access, 0, d> { + static inline coord_t get(BB3 const& box) { + return box.min(d); + } + static inline void set(BB3 &box, coord_t const& coord) { + box.min(d) = coord; + } +}; + +template +struct indexed_access, 1, d> { + static inline coord_t get(BB3 const& box) { + return box.max(d); + } + static inline void set(BB3 &box, coord_t const& coord) { + box.max(d) = coord; + } +}; + } } @@ -129,6 +133,6 @@ template<> struct range_value> { using type = Slic3r::Vec2d; }; -} +} // namespace boost #endif // SLABOOSTADAPTER_HPP diff --git a/src/libslic3r/BoundingBox.hpp b/src/libslic3r/BoundingBox.hpp index d2d363b5a30..d741be36cc4 100644 --- a/src/libslic3r/BoundingBox.hpp +++ b/src/libslic3r/BoundingBox.hpp @@ -18,28 +18,13 @@ class BoundingBoxBase BoundingBoxBase() : min(PointClass::Zero()), max(PointClass::Zero()), defined(false) {} BoundingBoxBase(const PointClass &pmin, const PointClass &pmax) : - min(pmin), max(pmax), defined(pmin(0) < pmax(0) && pmin(1) < pmax(1)) {} + min(pmin), max(pmax), defined(pmin.x() < pmax.x() && pmin.y() < pmax.y()) {} BoundingBoxBase(const PointClass &p1, const PointClass &p2, const PointClass &p3) : min(p1), max(p1), defined(false) { merge(p2); merge(p3); } - template > - BoundingBoxBase(It from, It to) : min(PointClass::Zero()), max(PointClass::Zero()) - { - if (from == to) { - this->defined = false; - // throw Slic3r::InvalidArgument("Empty point set supplied to BoundingBoxBase constructor"); - } else { - auto it = from; - this->min = it->template cast(); - this->max = this->min; - for (++ it; it != to; ++ it) { - auto vec = it->template cast(); - this->min = this->min.cwiseMin(vec); - this->max = this->max.cwiseMax(vec); - } - this->defined = (this->min(0) < this->max(0)) && (this->min(1) < this->max(1)); - } - } + template> + BoundingBoxBase(It from, It to) + { construct(*this, from, to); } BoundingBoxBase(const std::vector &points) : BoundingBoxBase(points.begin(), points.end()) @@ -58,18 +43,42 @@ class BoundingBoxBase BoundingBoxBase inflated(coordf_t delta) const throw() { BoundingBoxBase out(*this); out.offset(delta); return out; } PointClass center() const; bool contains(const PointClass &point) const { - return point(0) >= this->min(0) && point(0) <= this->max(0) - && point(1) >= this->min(1) && point(1) <= this->max(1); + return point.x() >= this->min.x() && point.x() <= this->max.x() + && point.y() >= this->min.y() && point.y() <= this->max.y(); } bool contains(const BoundingBoxBase &other) const { return contains(other.min) && contains(other.max); } bool overlap(const BoundingBoxBase &other) const { - return ! (this->max(0) < other.min(0) || this->min(0) > other.max(0) || - this->max(1) < other.min(1) || this->min(1) > other.max(1)); + return ! (this->max.x() < other.min.x() || this->min.x() > other.max.x() || + this->max.y() < other.min.y() || this->min.y() > other.max.y()); } bool operator==(const BoundingBoxBase &rhs) { return this->min == rhs.min && this->max == rhs.max; } bool operator!=(const BoundingBoxBase &rhs) { return ! (*this == rhs); } + +private: + // to access construct() + friend BoundingBox get_extents(const Points &pts); + friend BoundingBox get_extents(const Points &pts); + + // if IncludeBoundary, then a bounding box is defined even for a single point. + // otherwise a bounding box is only defined if it has a positive area. + // The output bounding box is expected to be set to "undefined" initially. + template> + static void construct(BoundingBoxType &out, It from, It to) + { + if (from != to) { + auto it = from; + out.min = it->template cast(); + out.max = out.min; + for (++ it; it != to; ++ it) { + auto vec = it->template cast(); + out.min = out.min.cwiseMin(vec); + out.max = out.max.cwiseMax(vec); + } + out.defined = IncludeBoundary || (out.min.x() < out.max.x() && out.min.y() < out.max.y()); + } + } }; template @@ -79,7 +88,7 @@ class BoundingBox3Base : public BoundingBoxBase BoundingBox3Base() : BoundingBoxBase() {} BoundingBox3Base(const PointClass &pmin, const PointClass &pmax) : BoundingBoxBase(pmin, pmax) - { if (pmin(2) >= pmax(2)) BoundingBoxBase::defined = false; } + { if (pmin.z() >= pmax.z()) BoundingBoxBase::defined = false; } BoundingBox3Base(const PointClass &p1, const PointClass &p2, const PointClass &p3) : BoundingBoxBase(p1, p1) { merge(p2); merge(p3); } @@ -96,7 +105,7 @@ class BoundingBox3Base : public BoundingBoxBase this->min = this->min.cwiseMin(vec); this->max = this->max.cwiseMax(vec); } - this->defined = (this->min(0) < this->max(0)) && (this->min(1) < this->max(1)) && (this->min(2) < this->max(2)); + this->defined = (this->min.x() < this->max.x()) && (this->min.y() < this->max.y()) && (this->min.z() < this->max.z()); } BoundingBox3Base(const std::vector &points) @@ -116,15 +125,17 @@ class BoundingBox3Base : public BoundingBoxBase coordf_t max_size() const; bool contains(const PointClass &point) const { - return BoundingBoxBase::contains(point) && point(2) >= this->min(2) && point(2) <= this->max(2); + return BoundingBoxBase::contains(point) && point.z() >= this->min.z() && point.z() <= this->max.z(); } bool contains(const BoundingBox3Base& other) const { return contains(other.min) && contains(other.max); } + // Intersects without boundaries. bool intersects(const BoundingBox3Base& other) const { - return (this->min(0) < other.max(0)) && (this->max(0) > other.min(0)) && (this->min(1) < other.max(1)) && (this->max(1) > other.min(1)) && (this->min(2) < other.max(2)) && (this->max(2) > other.min(2)); + return this->min.x() < other.max.x() && this->max.x() > other.min.x() && this->min.y() < other.max.y() && this->max.y() > other.min.y() && + this->min.z() < other.max.z() && this->max.z() > other.min.z(); } }; @@ -185,6 +196,8 @@ class BoundingBox : public BoundingBoxBase friend BoundingBox get_extents_rotated(const Points &points, double angle); }; +using BoundingBoxes = std::vector; + class BoundingBox3 : public BoundingBox3Base { public: @@ -212,18 +225,18 @@ class BoundingBoxf3 : public BoundingBox3Base template inline bool empty(const BoundingBoxBase &bb) { - return ! bb.defined || bb.min(0) >= bb.max(0) || bb.min(1) >= bb.max(1); + return ! bb.defined || bb.min.x() >= bb.max.x() || bb.min.y() >= bb.max.y(); } template inline bool empty(const BoundingBox3Base &bb) { - return ! bb.defined || bb.min(0) >= bb.max(0) || bb.min(1) >= bb.max(1) || bb.min(2) >= bb.max(2); + return ! bb.defined || bb.min.x() >= bb.max.x() || bb.min.y() >= bb.max.y() || bb.min.z() >= bb.max.z(); } inline BoundingBox scaled(const BoundingBoxf &bb) { return {scaled(bb.min), scaled(bb.max)}; } -template +template BoundingBoxBase> scaled(const BoundingBoxf &bb) { return {scaled(bb.min), scaled(bb.max)}; } template @@ -249,6 +262,39 @@ auto cast(const BoundingBox3Base &b) b.max.template cast()}; } +// Distance of a point to a bounding box. Zero inside and on the boundary, positive outside. +inline double bbox_point_distance(const BoundingBox &bbox, const Point &pt) +{ + if (pt.x() < bbox.min.x()) + return pt.y() < bbox.min.y() ? (bbox.min - pt).cast().norm() : + pt.y() > bbox.max.y() ? (Point(bbox.min.x(), bbox.max.y()) - pt).cast().norm() : + double(bbox.min.x() - pt.x()); + else if (pt.x() > bbox.max.x()) + return pt.y() < bbox.min.y() ? (Point(bbox.max.x(), bbox.min.y()) - pt).cast().norm() : + pt.y() > bbox.max.y() ? (bbox.max - pt).cast().norm() : + double(pt.x() - bbox.max.x()); + else + return pt.y() < bbox.min.y() ? bbox.min.y() - pt.y() : + pt.y() > bbox.max.y() ? pt.y() - bbox.max.y() : + coord_t(0); +} + +inline double bbox_point_distance_squared(const BoundingBox &bbox, const Point &pt) +{ + if (pt.x() < bbox.min.x()) + return pt.y() < bbox.min.y() ? (bbox.min - pt).cast().squaredNorm() : + pt.y() > bbox.max.y() ? (Point(bbox.min.x(), bbox.max.y()) - pt).cast().squaredNorm() : + Slic3r::sqr(double(bbox.min.x() - pt.x())); + else if (pt.x() > bbox.max.x()) + return pt.y() < bbox.min.y() ? (Point(bbox.max.x(), bbox.min.y()) - pt).cast().squaredNorm() : + pt.y() > bbox.max.y() ? (bbox.max - pt).cast().squaredNorm() : + Slic3r::sqr(pt.x() - bbox.max.x()); + else + return Slic3r::sqr(pt.y() < bbox.min.y() ? bbox.min.y() - pt.y() : + pt.y() > bbox.max.y() ? pt.y() - bbox.max.y() : + coord_t(0)); +} + } // namespace Slic3r // Serialization through the Cereal library diff --git a/src/libslic3r/BranchingTree/BranchingTree.cpp b/src/libslic3r/BranchingTree/BranchingTree.cpp new file mode 100644 index 00000000000..98261311b14 --- /dev/null +++ b/src/libslic3r/BranchingTree/BranchingTree.cpp @@ -0,0 +1,196 @@ +#include "BranchingTree.hpp" +#include "PointCloud.hpp" + +#include +#include +#include + +#include "libslic3r/TriangleMesh.hpp" + +namespace Slic3r { namespace branchingtree { + +void build_tree(PointCloud &nodes, Builder &builder) +{ + constexpr size_t initK = 5; + + auto ptsqueue = nodes.start_queue(); + auto &properties = nodes.properties(); + + struct NodeDistance + { + size_t node_id = Node::ID_NONE; + float dst_branching = NaNf; + float dst_euql = NaNf; + }; + auto distances = reserve_vector(initK); + double prev_dist_max = 0.; + size_t K = initK; + bool routed = true; + size_t node_id = Node::ID_NONE; + + while ((!ptsqueue.empty() && builder.is_valid()) || !routed) { + if (routed) { + node_id = ptsqueue.top(); + ptsqueue.pop(); + } + + Node node = nodes.get(node_id); + nodes.mark_unreachable(node_id); + + distances.clear(); + distances.reserve(K); + + float dmax = 0.; + nodes.foreach_reachable( + node.pos, + [&distances, &dmax](size_t id, float dst_branching, float dst_euql) { + distances.emplace_back(NodeDistance{id, dst_branching, dst_euql}); + dmax = std::max(dmax, dst_euql); + }, K, prev_dist_max); + + std::sort(distances.begin(), distances.end(), + [](auto &a, auto &b) { return a.dst_branching < b.dst_branching; }); + + if (distances.empty()) { + builder.report_unroutable(node); + K = initK; + prev_dist_max = 0.; + routed = true; + + continue; + } + + prev_dist_max = dmax; + K *= 2; + + auto closest_it = distances.begin(); + routed = false; + while (closest_it != distances.end() && !routed && builder.is_valid()) { + size_t closest_node_id = closest_it->node_id; + Node closest_node = nodes.get(closest_node_id); + + auto type = nodes.get_type(closest_node_id); + float w = nodes.get(node_id).weight + closest_it->dst_branching; + closest_node.Rmin = std::max(node.Rmin, closest_node.Rmin); + + switch (type) { + case BED: { + closest_node.weight = w; + double max_br_len = nodes.properties().max_branch_length(); + if (closest_it->dst_branching > max_br_len) { + std::optional avo = builder.suggest_avoidance(node, max_br_len); + if (!avo) + break; + + Node new_node {*avo, node.Rmin}; + new_node.weight = nodes.get(node_id).weight + (node.pos - *avo).norm(); + new_node.left = node.id; + if ((routed = builder.add_bridge(node, new_node))) { + size_t new_idx = nodes.insert_junction(new_node); + ptsqueue.push(new_idx); + } + } else if ((routed = builder.add_ground_bridge(node, closest_node))) { + closest_node.left = closest_node.right = node_id; + nodes.get(closest_node_id) = closest_node; + nodes.mark_unreachable(closest_node_id); + } + + break; + } + case MESH: { + closest_node.weight = w; + if ((routed = builder.add_mesh_bridge(node, closest_node))) { + closest_node.left = closest_node.right = node_id; + nodes.get(closest_node_id) = closest_node; + nodes.mark_unreachable(closest_node_id); + } + + break; + } + case LEAF: + case JUNCTION: { + auto max_slope = float(properties.max_slope()); + + if (auto mergept = find_merge_pt(node.pos, closest_node.pos, max_slope)) { + + float mergedist_closest = (*mergept - closest_node.pos).norm(); + float mergedist_node = (*mergept - node.pos).norm(); + float Wnode = nodes.get(node_id).weight; + float Wclosest = nodes.get(closest_node_id).weight; + float Wsum = std::max(Wnode, Wclosest); + float distsum = std::max(mergedist_closest, mergedist_node); + w = Wsum + distsum; + + if (mergedist_closest > EPSILON && mergedist_node > EPSILON) { + Node mergenode{*mergept, closest_node.Rmin}; + mergenode.weight = w; + mergenode.id = int(nodes.next_junction_id()); + + if ((routed = builder.add_merger(node, closest_node, mergenode))) { + mergenode.left = node_id; + mergenode.right = closest_node_id; + size_t new_idx = nodes.insert_junction(mergenode); + ptsqueue.push(new_idx); + size_t qid = nodes.get_queue_idx(closest_node_id); + + if (qid != PointCloud::Unqueued) + ptsqueue.remove(nodes.get_queue_idx(closest_node_id)); + + nodes.mark_unreachable(closest_node_id); + } + } else if (closest_node.pos.z() < node.pos.z() && + (closest_node.left == Node::ID_NONE || + closest_node.right == Node::ID_NONE)) { + closest_node.weight = w; + if ((routed = builder.add_bridge(node, closest_node))) { + if (closest_node.left == Node::ID_NONE) + closest_node.left = node_id; + else if (closest_node.right == Node::ID_NONE) + closest_node.right = node_id; + + nodes.get(closest_node_id) = closest_node; + } + } + } + + break; + } + case NONE:; + } + + ++closest_it; + } + + if (routed) { + prev_dist_max = 0.; + K = initK; + } + } +} + +void build_tree(const indexed_triangle_set &its, + const std::vector &support_roots, + Builder &builder, + const Properties &properties) +{ + PointCloud nodes(its, support_roots, properties); + + build_tree(nodes, builder); +} + +ExPolygon make_bed_poly(const indexed_triangle_set &its) +{ + auto bb = bounding_box(its); + + BoundingBox bbcrd{scaled(to_2d(bb.min)), scaled(to_2d(bb.max))}; + bbcrd.offset(scaled(10.)); + Point min = bbcrd.min, max = bbcrd.max; + ExPolygon ret = {{min.x(), min.y()}, + {max.x(), min.y()}, + {max.x(), max.y()}, + {min.x(), max.y()}}; + + return ret; +} + +}} // namespace Slic3r::branchingtree diff --git a/src/libslic3r/BranchingTree/BranchingTree.hpp b/src/libslic3r/BranchingTree/BranchingTree.hpp new file mode 100644 index 00000000000..7e59e6f1ae8 --- /dev/null +++ b/src/libslic3r/BranchingTree/BranchingTree.hpp @@ -0,0 +1,154 @@ +#ifndef SUPPORTTREEBRANCHING_HPP +#define SUPPORTTREEBRANCHING_HPP + +// For indexed_triangle_set +#include + +#include "libslic3r/ExPolygon.hpp" + +namespace Slic3r { namespace branchingtree { + +// Branching tree input parameters. This is an in-line fillable structure with +// setters returning self references. +class Properties +{ + double m_max_slope = PI / 4.; + double m_ground_level = 0.; + double m_sampling_radius = .5; + double m_max_branch_len = 10.; + + ExPolygons m_bed_shape; + +public: + + // Maximum slope for bridges of the tree + Properties &max_slope(double val) noexcept + { + m_max_slope = val; + return *this; + } + // Z level of the ground + Properties &ground_level(double val) noexcept + { + m_ground_level = val; + return *this; + } + // How far should sample points be in the mesh and the ground + Properties &sampling_radius(double val) noexcept + { + m_sampling_radius = val; + return *this; + } + // Shape of the print bed (ground) + Properties &bed_shape(ExPolygons bed) noexcept + { + m_bed_shape = std::move(bed); + return *this; + } + + Properties &max_branch_length(double val) noexcept + { + m_max_branch_len = val; + return *this; + } + + double max_slope() const noexcept { return m_max_slope; } + double ground_level() const noexcept { return m_ground_level; } + double sampling_radius() const noexcept { return m_sampling_radius; } + double max_branch_length() const noexcept { return m_max_branch_len; } + const ExPolygons &bed_shape() const noexcept { return m_bed_shape; } +}; + +// A junction of the branching tree with position and radius. +struct Node +{ + static constexpr int ID_NONE = -1; + + int id = ID_NONE, left = ID_NONE, right = ID_NONE; + + Vec3f pos; + float Rmin = 0.f; + + // Tracking the weight of each junction, which is essentially the sum of + // the lenghts of all branches emanating from this junction. + float weight = 0.f; + + Node(const Vec3f &p, float r_min = .0f) : pos{p}, Rmin{r_min}, weight{0.f} + {} +}; + +inline bool is_occupied(const Node &n) +{ + return n.left != Node::ID_NONE && n.right != Node::ID_NONE; +} + +// An output interface for the branching tree generator function. Consider each +// method as a callback and implement the actions that need to be done. +class Builder +{ +public: + virtual ~Builder() = default; + + // A simple bridge from junction to junction. + virtual bool add_bridge(const Node &from, const Node &to) = 0; + + // An Y shaped structure with two starting points and a merge point below + // them. The angles will respect the max_slope setting. + virtual bool add_merger(const Node &node, + const Node &closest, + const Node &merge_node) = 0; + + // Add an anchor bridge to the ground (print bed) + virtual bool add_ground_bridge(const Node &from, + const Node &to) = 0; + + // Add an anchor bridge to the model body + virtual bool add_mesh_bridge(const Node &from, const Node &to) = 0; + + virtual std::optional suggest_avoidance(const Node &from, + float max_bridge_len) const + { + return {}; + } + + // Report nodes that can not be routed to an endpoint (model or ground) + virtual void report_unroutable(const Node &j) = 0; + + // If returns false, the tree building process shall stop + virtual bool is_valid() const { return true; } +}; + +// Build the actual tree. +// its: The input mesh +// support_leafs: The input support points +// builder: The output interface, describes how to build the tree +// properties: Parameters of the tree +// +// Notes: +// The original algorithm implicitly ensures that the generated tree avoids +// the model body. This implementation uses point sampling of the mesh thus an +// explicit check is needed if the part of the tree being inserted properly +// avoids the model. This can be done in the builder implementation. Each +// method can return a boolean indicating whether the given branch can or +// cannot be inserted. If a particular path is unavailable, the algorithm +// will try a few other paths as well. If all of them fail, one of the +// report_unroutable_* methods will be called as a last resort. +void build_tree(const indexed_triangle_set &its, + const std::vector &support_leafs, + Builder &builder, + const Properties &properties = {}); + +inline void build_tree(const indexed_triangle_set &its, + const std::vector &support_leafs, + Builder &&builder, + const Properties &properties = {}) +{ + build_tree(its, support_leafs, builder, properties); +} + +// Helper function to derive a bed polygon only from the model bounding box. +ExPolygon make_bed_poly(const indexed_triangle_set &its); + +}} // namespace Slic3r::branchingtree + +#endif // SUPPORTTREEBRANCHING_HPP diff --git a/src/libslic3r/BranchingTree/PointCloud.cpp b/src/libslic3r/BranchingTree/PointCloud.cpp new file mode 100644 index 00000000000..1497f089458 --- /dev/null +++ b/src/libslic3r/BranchingTree/PointCloud.cpp @@ -0,0 +1,186 @@ +#include "PointCloud.hpp" + +#include "libslic3r/Tesselate.hpp" +#include "libslic3r/SLA/SupportTreeUtils.hpp" + +#include + +namespace Slic3r { namespace branchingtree { + +std::optional find_merge_pt(const Vec3f &A, const Vec3f &B, float max_slope) +{ + return sla::find_merge_pt(A, B, max_slope); +} + +void to_eigen_mesh(const indexed_triangle_set &its, + Eigen::MatrixXd &V, + Eigen::MatrixXi &F) +{ + V.resize(its.vertices.size(), 3); + F.resize(its.indices.size(), 3); + for (unsigned int i = 0; i < its.indices.size(); ++i) + F.row(i) = its.indices[i]; + + for (unsigned int i = 0; i < its.vertices.size(); ++i) + V.row(i) = its.vertices[i].cast(); +} + +std::vector sample_mesh(const indexed_triangle_set &its, double radius) +{ + std::vector ret; + + double surface_area = 0.; + for (const Vec3i &face : its.indices) { + std::array tri = {its.vertices[face(0)], + its.vertices[face(1)], + its.vertices[face(2)]}; + + auto U = tri[1] - tri[0], V = tri[2] - tri[0]; + surface_area += 0.5 * U.cross(V).norm(); + } + + int N = surface_area / (PI * radius * radius); + + Eigen::MatrixXd B; + Eigen::MatrixXi FI; + Eigen::MatrixXd V; + Eigen::MatrixXi F; + to_eigen_mesh(its, V, F); + igl::random_points_on_mesh(N, V, F, B, FI); + + ret.reserve(size_t(N)); + for (int i = 0; i < FI.size(); i++) { + int face_id = FI(i); + + if (face_id < 0 || face_id >= int(its.indices.size())) + continue; + + Vec3i face = its.indices[face_id]; + + if (face(0) >= int(its.vertices.size()) || + face(1) >= int(its.vertices.size()) || + face(2) >= int(its.vertices.size())) + continue; + + Vec3f c = B.row(i)(0) * its.vertices[face(0)] + + B.row(i)(1) * its.vertices[face(1)] + + B.row(i)(2) * its.vertices[face(2)]; + + ret.emplace_back(c); + } + + return ret; +} + +std::vector sample_bed(const ExPolygons &bed, float z, double radius) +{ + auto triangles = triangulate_expolygons_3d(bed, z); + indexed_triangle_set its; + its.vertices.reserve(triangles.size()); + + for (size_t i = 0; i < triangles.size(); i += 3) { + its.vertices.emplace_back(triangles[i].cast()); + its.vertices.emplace_back(triangles[i + 1].cast()); + its.vertices.emplace_back(triangles[i + 2].cast()); + + its.indices.emplace_back(i, i + 1, i + 2); + } + + return sample_mesh(its, radius); +} + +PointCloud::PointCloud(const indexed_triangle_set &M, + std::vector support_leafs, + const Properties &props) + : PointCloud{sample_mesh(M, props.sampling_radius()), + sample_bed(props.bed_shape(), + props.ground_level(), + props.sampling_radius()), + std::move(support_leafs), props} +{} + +PointCloud::PointCloud(std::vector meshpts, + std::vector bedpts, + std::vector support_leafs, + const Properties &props) + : m_leafs{std::move(support_leafs)} + , m_meshpoints{std::move(meshpts)} + , m_bedpoints{std::move(bedpts)} + , m_props{props} + , cos2bridge_slope{std::cos(props.max_slope()) * + std::abs(std::cos(props.max_slope()))} + , MESHPTS_BEGIN{m_bedpoints.size()} + , LEAFS_BEGIN{MESHPTS_BEGIN + m_meshpoints.size()} + , JUNCTIONS_BEGIN{LEAFS_BEGIN + m_leafs.size()} + , m_searchable_indices(JUNCTIONS_BEGIN + m_junctions.size(), true) + , m_queue_indices(JUNCTIONS_BEGIN + m_junctions.size(), Unqueued) + , m_reachable_cnt{JUNCTIONS_BEGIN + m_junctions.size()} +{ + for (size_t i = 0; i < m_bedpoints.size(); ++i) { + m_bedpoints[i].id = int(i); + m_ktree.insert({m_bedpoints[i].pos, i}); + } + + for (size_t i = 0; i < m_meshpoints.size(); ++i) { + Node &n = m_meshpoints[i]; + n.id = int(MESHPTS_BEGIN + i); + m_ktree.insert({n.pos, n.id}); + } + + for (size_t i = 0; i < m_leafs.size(); ++i) { + Node &n = m_leafs[i]; + n.id = int(LEAFS_BEGIN + i); + n.left = Node::ID_NONE; + n.right = Node::ID_NONE; + + m_ktree.insert({n.pos, n.id}); + } +} + +float PointCloud::get_distance(const Vec3f &p, size_t node_id) const +{ + auto t = get_type(node_id); + auto ret = std::numeric_limits::infinity(); + const auto &node = get(node_id); + + switch (t) { + case MESH: + case BED: { + // Points of mesh or bed which are outside of the support cone of + // 'pos' must be discarded. + if (is_outside_support_cone(p, node.pos)) + ret = std::numeric_limits::infinity(); + else + ret = (node.pos - p).norm(); + + break; + } + case LEAF: + case JUNCTION:{ + auto mergept = find_merge_pt(p, node.pos, m_props.max_slope()); + double maxL2 = m_props.max_branch_length() * m_props.max_branch_length(); + + if (!mergept || mergept->z() < (m_props.ground_level() + 2 * node.Rmin)) + ret = std::numeric_limits::infinity(); + else if (double a = (node.pos - *mergept).squaredNorm(), + b = (p - *mergept).squaredNorm(); + a < maxL2 && b < maxL2) + ret = std::sqrt(b); + + break; + } + case NONE: + ; + } + + // Setting the ret val to infinity will effectively discard this + // connection of nodes. max_branch_length property is used here + // to discard node=>node and node=>mesh connections longer than this + // property. + if (t != BED && ret > m_props.max_branch_length()) + ret = std::numeric_limits::infinity(); + + return ret; +} + +}} // namespace Slic3r::branchingtree diff --git a/src/libslic3r/BranchingTree/PointCloud.hpp b/src/libslic3r/BranchingTree/PointCloud.hpp new file mode 100644 index 00000000000..03b935f765f --- /dev/null +++ b/src/libslic3r/BranchingTree/PointCloud.hpp @@ -0,0 +1,296 @@ +#ifndef POINTCLOUD_HPP +#define POINTCLOUD_HPP + +#include + +#include "BranchingTree.hpp" + +//#include "libslic3r/Execution/Execution.hpp" +#include "libslic3r/MutablePriorityQueue.hpp" + +#include "libslic3r/BoostAdapter.hpp" +#include "boost/geometry/index/rtree.hpp" + +namespace Slic3r { namespace branchingtree { + +std::optional find_merge_pt(const Vec3f &A, + const Vec3f &B, + float max_slope); + +void to_eigen_mesh(const indexed_triangle_set &its, + Eigen::MatrixXd &V, + Eigen::MatrixXi &F); + +std::vector sample_mesh(const indexed_triangle_set &its, double radius); + +std::vector sample_bed(const ExPolygons &bed, + float z, + double radius = 1.); + +enum PtType { LEAF, MESH, BED, JUNCTION, NONE }; + +inline BoundingBox3Base get_support_cone_bb(const Vec3f &p, const Properties &props) +{ + double gnd = props.ground_level() - EPSILON; + double h = p.z() - gnd; + double phi = PI / 2 - props.max_slope(); + auto r = float(std::min(h * std::tan(phi), props.max_branch_length() * std::sin(phi))); + + Vec3f bb_min = {p.x() - r, p.y() - r, float(gnd)}; + Vec3f bb_max = {p.x() + r, p.y() + r, p.z()}; + + return {bb_min, bb_max}; +} + +// A cloud of points including support points, mesh points, junction points +// and anchor points on the bed. Junction points can be added or removed, all +// the other point types are established on creation and remain unchangeable. +class PointCloud { + std::vector m_leafs, m_junctions, m_meshpoints, m_bedpoints; + + const branchingtree::Properties &m_props; + + const double cos2bridge_slope; + const size_t MESHPTS_BEGIN, LEAFS_BEGIN, JUNCTIONS_BEGIN; + +private: + + // These vectors have the same size as there are indices for nodes to keep + // access complexity constant. WARN: there might be cache non-locality costs + std::vector m_searchable_indices; // searchable flag value of a node + std::vector m_queue_indices; // queue id of a node if queued + + size_t m_reachable_cnt; + + struct CoordFn + { + const PointCloud *self; + CoordFn(const PointCloud *s) : self{s} {} + float operator()(size_t nodeid, size_t dim) const + { + return self->get(nodeid).pos(int(dim)); + } + }; + + using PointIndexEl = std::pair; + + boost::geometry::index:: + rtree /* ? */> + m_ktree; + + template + static auto *get_node(PC &&pc, size_t id) + { + auto *ret = decltype(pc.m_bedpoints.data())(nullptr); + + switch(pc.get_type(id)) { + case BED: ret = &pc.m_bedpoints[id]; break; + case MESH: ret = &pc.m_meshpoints[id - pc.MESHPTS_BEGIN]; break; + case LEAF: ret = &pc.m_leafs [id - pc.LEAFS_BEGIN]; break; + case JUNCTION: ret = &pc.m_junctions[id - pc.JUNCTIONS_BEGIN]; break; + case NONE: assert(false); + } + + return ret; + } + +public: + + bool is_outside_support_cone(const Vec3f &supp, const Vec3f &pt) const + { + Vec3d D = (pt - supp).cast(); + double dot_sq = -D.z() * std::abs(-D.z()); + + return dot_sq < D.squaredNorm() * cos2bridge_slope; + } + + static constexpr auto Unqueued = size_t(-1); + + struct ZCompareFn + { + const PointCloud *self; + ZCompareFn(const PointCloud *s) : self{s} {} + bool operator()(size_t node_a, size_t node_b) const + { + return self->get(node_a).pos.z() > self->get(node_b).pos.z(); + } + }; + + PointCloud(const indexed_triangle_set &M, + std::vector support_leafs, + const Properties &props); + + PointCloud(std::vector meshpts, + std::vector bedpts, + std::vector support_leafs, + const Properties &props); + + PtType get_type(size_t node_id) const + { + PtType ret = NONE; + + if (node_id < MESHPTS_BEGIN && !m_bedpoints.empty()) ret = BED; + else if (node_id < LEAFS_BEGIN && !m_meshpoints.empty()) ret = MESH; + else if (node_id < JUNCTIONS_BEGIN && !m_leafs.empty()) ret = LEAF; + else if (node_id >= JUNCTIONS_BEGIN && !m_junctions.empty()) ret = JUNCTION; + + return ret; + } + + const Node &get(size_t node_id) const + { + return *get_node(*this, node_id); + } + + Node &get(size_t node_id) + { + return *get_node(*this, node_id); + } + + const Node *find(size_t node_id) const { return get_node(*this, node_id); } + Node *find(size_t node_id) { return get_node(*this, node_id); } + + // Return the original index of a leaf in the input array, if the given + // node id is indeed of type SUPP + int get_leaf_id(size_t node_id) const + { + return node_id >= LEAFS_BEGIN && node_id < JUNCTIONS_BEGIN ? + node_id - LEAFS_BEGIN : + Node::ID_NONE; + } + + size_t get_queue_idx(size_t node_id) const { return m_queue_indices[node_id]; } + + float get_distance(const Vec3f &p, size_t node) const; + + size_t next_junction_id() const + { + return JUNCTIONS_BEGIN + m_junctions.size(); + } + + size_t insert_junction(const Node &p) + { + size_t new_id = next_junction_id(); + m_junctions.emplace_back(p); + m_junctions.back().id = int(new_id); + m_ktree.insert({m_junctions.back().pos, new_id}); + m_searchable_indices.emplace_back(true); + m_queue_indices.emplace_back(Unqueued); + ++m_reachable_cnt; + + return new_id; + } + + const std::vector &get_junctions() const noexcept { return m_junctions; } + const std::vector &get_bedpoints() const noexcept { return m_bedpoints; } + const std::vector &get_meshpoints() const noexcept { return m_meshpoints; } + const std::vector &get_leafs() const noexcept { return m_leafs; } + const Properties & properties() const noexcept { return m_props; } + + void mark_unreachable(size_t node_id) + { + assert(node_id < m_searchable_indices.size()); + + m_searchable_indices[node_id] = false; + m_queue_indices[node_id] = Unqueued; + --m_reachable_cnt; + } + + size_t reachable_count() const { return m_reachable_cnt; } + + template + void foreach_reachable(const Vec3f &pos, + Fn &&visitor, + size_t k, + double min_dist = 0.) + { + // Fake output iterator + struct Output { + const PointCloud *self; + Vec3f p; + Fn &visitorfn; + + Output& operator *() { return *this; } + void operator=(const PointIndexEl &el) { + visitorfn(el.second, self->get_distance(p, el.second), + (p - el.first).squaredNorm()); + } + Output& operator++() { return *this; } + }; + + namespace bgi = boost::geometry::index; + float brln = 2 * m_props.max_branch_length(); + BoundingBox3Base bb{{pos.x() - brln, pos.y() - brln, + float(m_props.ground_level() - EPSILON)}, + {pos.x() + brln, pos.y() + brln, + m_ktree.bounds().max_corner().get()}}; + + // Extend upwards to find mergable junctions and support points + bb.max.z() = m_ktree.bounds().max_corner().get(); + + auto filter = bgi::satisfies( + [this, &pos, min_dist](const PointIndexEl &e) { + double D_branching = get_distance(pos, e.second); + double D_euql = (pos - e.first).squaredNorm() ; + return m_searchable_indices[e.second] && + !std::isinf(D_branching) && D_euql > min_dist; + }); + + m_ktree.query(bgi::intersects(bb) && filter && bgi::nearest(pos, k), + Output{this, pos, visitor}); + } + + auto start_queue() + { + auto ptsqueue = make_mutable_priority_queue( + [this](size_t el, size_t idx) { m_queue_indices[el] = idx; }, + ZCompareFn{this}); + + ptsqueue.reserve(m_leafs.size()); + size_t iend = LEAFS_BEGIN + m_leafs.size(); + for (size_t i = LEAFS_BEGIN; i < iend; ++i) + ptsqueue.push(i); + + return ptsqueue; + } +}; + +template constexpr bool IsTraverseFn = std::is_invocable_v; + +struct TraverseReturnT +{ + bool to_left : 1; // if true, continue traversing to the left + bool to_right : 1; // if true, continue traversing to the right +}; + +template void traverse(PC &&pc, size_t root, Fn &&fn) +{ + if (auto nodeptr = pc.find(root); nodeptr != nullptr) { + auto &nroot = *nodeptr; + TraverseReturnT ret{true, true}; + + if constexpr (std::is_same_v, void>) { + // Our fn has no return value + fn(nroot); + } else { + // Fn returns instructions about how to continue traversing + ret = fn(nroot); + } + + if (ret.to_left && nroot.left >= 0) + traverse(pc, nroot.left, fn); + if (ret.to_right && nroot.right >= 0) + traverse(pc, nroot.right, fn); + } +} + +void build_tree(PointCloud &pcloud, Builder &builder); + +inline void build_tree(PointCloud &&pc, Builder &builder) +{ + build_tree(pc, builder); +} + +}} // namespace Slic3r::branchingtree + +#endif // POINTCLOUD_HPP diff --git a/src/libslic3r/BridgeDetector.hpp b/src/libslic3r/BridgeDetector.hpp index e97dd45c401..cb182730611 100644 --- a/src/libslic3r/BridgeDetector.hpp +++ b/src/libslic3r/BridgeDetector.hpp @@ -1,9 +1,18 @@ #ifndef slic3r_BridgeDetector_hpp_ #define slic3r_BridgeDetector_hpp_ +#include "ClipperUtils.hpp" +#include "Line.hpp" +#include "Point.hpp" +#include "Polygon.hpp" +#include "Polyline.hpp" +#include "PrincipalComponents2D.hpp" #include "libslic3r.h" #include "ExPolygon.hpp" +#include #include +#include +#include namespace Slic3r { @@ -64,6 +73,62 @@ class BridgeDetector { ExPolygons _anchor_regions; }; + +//return ideal bridge direction and unsupported bridge endpoints distance. +inline std::tuple detect_bridging_direction(const Lines &floating_edges, const Polygons &overhang_area) +{ + if (floating_edges.empty()) { + // consider this area anchored from all sides, pick bridging direction that will likely yield shortest bridges + auto [pc1, pc2] = compute_principal_components(overhang_area); + if (pc2 == Vec2f::Zero()) { // overhang may be smaller than resolution. In this case, any direction is ok + return {Vec2d{1.0,0.0}, 0.0}; + } else { + return {pc2.normalized().cast(), 0.0}; + } + } + + // Overhang is not fully surrounded by anchors, in that case, find such direction that will minimize the number of bridge ends/180turns in the air + std::unordered_map directions{}; + for (const Line &l : floating_edges) { + Vec2d normal = l.normal().cast().normalized(); + double quantized_angle = std::ceil(std::atan2(normal.y(),normal.x()) * 1000.0); + directions.emplace(quantized_angle, normal); + } + std::vector> direction_costs{}; + // it is acutally cost of a perpendicular bridge direction - we find the minimal cost and then return the perpendicular dir + for (const auto& d : directions) { + direction_costs.emplace_back(d.second, 0.0); + } + + for (const Line &l : floating_edges) { + Vec2d line = (l.b - l.a).cast(); + for (auto &dir_cost : direction_costs) { + // the dot product already contains the length of the line. dir_cost.first is normalized. + dir_cost.second += std::abs(line.dot(dir_cost.first)); + } + } + + Vec2d result_dir = Vec2d::Ones(); + double min_cost = std::numeric_limits::max(); + for (const auto &cost : direction_costs) { + if (cost.second < min_cost) { + // now flip the orientation back and return the direction of the bridge extrusions + result_dir = Vec2d{cost.first.y(), -cost.first.x()}; + min_cost = cost.second; + } + } + + return {result_dir, min_cost}; +}; + +//return ideal bridge direction and unsupported bridge endpoints distance. +inline std::tuple detect_bridging_direction(const Polygons &to_cover, const Polygons &anchors_area) +{ + Polygons overhang_area = diff(to_cover, anchors_area); + Lines floating_edges = to_lines(diff_pl(to_polylines(overhang_area), expand(anchors_area, float(SCALED_EPSILON)))); + return detect_bridging_direction(floating_edges, overhang_area); +} + } #endif diff --git a/src/libslic3r/Brim.cpp b/src/libslic3r/Brim.cpp index f48d7ff0a65..bdc1a19c278 100644 --- a/src/libslic3r/Brim.cpp +++ b/src/libslic3r/Brim.cpp @@ -39,7 +39,7 @@ static void append_and_translate(Polygons &dst, const Polygons &src, const Print dst[dst_idx].translate(instance.shift.x(), instance.shift.y()); } -static float max_brim_width(const ConstPrintObjectPtrsAdaptor &objects) +static float max_brim_width(const SpanOfConstPtrs &objects) { assert(!objects.empty()); return float(std::accumulate(objects.begin(), objects.end(), 0., @@ -53,7 +53,7 @@ static ExPolygons get_print_object_bottom_layer_expolygons(const PrintObject &pr { ExPolygons ex_polygons; for (LayerRegion *region : print_object.layers().front()->regions()) - Slic3r::append(ex_polygons, closing_ex(region->slices.surfaces, float(SCALED_EPSILON))); + Slic3r::append(ex_polygons, closing_ex(region->slices().surfaces, float(SCALED_EPSILON))); return ex_polygons; } @@ -332,7 +332,7 @@ static std::vector inner_brim_area(const Print append(no_brim_area_object, diff_ex(offset(ex_poly.contour, no_brim_offset, ClipperLib::jtSquare), ex_poly_holes_reversed)); if (brim_type == BrimType::btOuterOnly || brim_type == BrimType::btNoBrim) - append(no_brim_area_object, diff_ex(ExPolygon(ex_poly.contour), shrink_ex(ex_poly_holes_reversed, no_brim_offset, ClipperLib::jtSquare))); + append(no_brim_area_object, diff_ex(ex_poly.contour, shrink_ex(ex_poly_holes_reversed, no_brim_offset, ClipperLib::jtSquare))); append(holes_reversed_object, ex_poly_holes_reversed); } @@ -490,7 +490,7 @@ static void make_inner_brim(const Print &print, loops = union_pt_chained_outside_in(loops); std::reverse(loops.begin(), loops.end()); - extrusion_entities_append_loops(brim.entities, std::move(loops), erSkirt, float(flow.mm3_per_mm()), + extrusion_entities_append_loops(brim.entities, std::move(loops), ExtrusionRole::Skirt, float(flow.mm3_per_mm()), float(flow.width()), float(print.skirt_first_layer_height())); } @@ -564,7 +564,7 @@ ExtrusionEntityCollection make_brim(const Print &print, PrintTryCancel try_cance } #endif // BRIM_DEBUG_TO_SVG - const bool could_brim_intersects_skirt = std::any_of(print.objects().begin(), print.objects().end(), [&print](PrintObject *object) { + const bool could_brim_intersects_skirt = std::any_of(print.objects().begin(), print.objects().end(), [&print](const PrintObject *object) { const BrimType &bt = object->config().brim_type; return (bt == btOuterOnly || bt == btOuterAndInner) && print.config().skirt_distance.value < object->config().brim_width; }); @@ -641,7 +641,7 @@ ExtrusionEntityCollection make_brim(const Print &print, PrintTryCancel try_cance // perform operation ClipperLib_Z::PolyTree loops_trimmed_tree; clipper.Execute(ClipperLib_Z::ctDifference, loops_trimmed_tree, ClipperLib_Z::pftNonZero, ClipperLib_Z::pftNonZero); - ClipperLib_Z::PolyTreeToPaths(loops_trimmed_tree, loops_trimmed); + ClipperLib_Z::PolyTreeToPaths(std::move(loops_trimmed_tree), loops_trimmed); } // Third, produce the extrusions, sorted by the source loop indices. @@ -672,7 +672,7 @@ ExtrusionEntityCollection make_brim(const Print &print, PrintTryCancel try_cance if (i + 1 == j && first_path.size() > 3 && first_path.front().x() == first_path.back().x() && first_path.front().y() == first_path.back().y()) { auto *loop = new ExtrusionLoop(); brim.entities.emplace_back(loop); - loop->paths.emplace_back(erSkirt, float(flow.mm3_per_mm()), float(flow.width()), float(print.skirt_first_layer_height())); + loop->paths.emplace_back(ExtrusionRole::Skirt, float(flow.mm3_per_mm()), float(flow.width()), float(print.skirt_first_layer_height())); Points &points = loop->paths.front().polyline.points; points.reserve(first_path.size()); for (const ClipperLib_Z::IntPoint &pt : first_path) @@ -683,7 +683,7 @@ ExtrusionEntityCollection make_brim(const Print &print, PrintTryCancel try_cance ExtrusionEntityCollection this_loop_trimmed; this_loop_trimmed.entities.reserve(j - i); for (; i < j; ++ i) { - this_loop_trimmed.entities.emplace_back(new ExtrusionPath(erSkirt, float(flow.mm3_per_mm()), float(flow.width()), float(print.skirt_first_layer_height()))); + this_loop_trimmed.entities.emplace_back(new ExtrusionPath(ExtrusionRole::Skirt, float(flow.mm3_per_mm()), float(flow.width()), float(print.skirt_first_layer_height()))); const ClipperLib_Z::Path &path = *loops_trimmed_order[i].first; Points &points = dynamic_cast(this_loop_trimmed.entities.back())->polyline.points; points.reserve(path.size()); @@ -699,7 +699,7 @@ ExtrusionEntityCollection make_brim(const Print &print, PrintTryCancel try_cance } } } else { - extrusion_entities_append_loops_and_paths(brim.entities, std::move(all_loops), erSkirt, float(flow.mm3_per_mm()), float(flow.width()), float(print.skirt_first_layer_height())); + extrusion_entities_append_loops_and_paths(brim.entities, std::move(all_loops), ExtrusionRole::Skirt, float(flow.mm3_per_mm()), float(flow.width()), float(print.skirt_first_layer_height())); } make_inner_brim(print, top_level_objects_with_brim, bottom_layers_expolygons, brim); diff --git a/src/libslic3r/BuildVolume.cpp b/src/libslic3r/BuildVolume.cpp index c580e6f876e..f639f9ac7d2 100644 --- a/src/libslic3r/BuildVolume.cpp +++ b/src/libslic3r/BuildVolume.cpp @@ -238,7 +238,7 @@ BuildVolume::ObjectState object_state_templ(const indexed_triangle_set &its, con const stl_vertex p2 = trafo * its.vertices[tri(iedge)]; assert(sign(p1) == s[iprev]); assert(sign(p2) == s[iedge]); - assert(p1.z() * p2.z() < 0); + assert((p1.z() - world_min_z) * (p2.z() - world_min_z) < 0); // Edge crosses the z plane. Calculate intersection point with the plane. const float t = (world_min_z - p1.z()) / (p2.z() - p1.z()); (is_inside(Vec3f(p1.x() + (p2.x() - p1.x()) * t, p1.y() + (p2.y() - p1.y()) * t, world_min_z)) ? inside : outside) = true; @@ -320,7 +320,7 @@ BuildVolume::ObjectState BuildVolume::volume_state_bbox(const BoundingBoxf3& vol bool BuildVolume::all_paths_inside(const GCodeProcessorResult& paths, const BoundingBoxf3& paths_bbox, bool ignore_bottom) const { auto move_valid = [](const GCodeProcessorResult::MoveVertex &move) { - return move.type == EMoveType::Extrude && move.extrusion_role != erCustom && move.width != 0.f && move.height != 0.f; + return move.type == EMoveType::Extrude && move.extrusion_role != GCodeExtrusionRole::Custom && move.width != 0.f && move.height != 0.f; }; static constexpr const double epsilon = BedEpsilon; diff --git a/src/libslic3r/BuildVolume.hpp b/src/libslic3r/BuildVolume.hpp index 6b928d48b0f..6537d274524 100644 --- a/src/libslic3r/BuildVolume.hpp +++ b/src/libslic3r/BuildVolume.hpp @@ -94,6 +94,10 @@ class BuildVolume // Called on initial G-code preview on OpenGL vertex buffer interleaved normals and vertices. bool all_paths_inside_vertices_and_normals_interleaved(const std::vector& paths, const Eigen::AlignedBox& bbox, bool ignore_bottom = true) const; + + const std::pair, std::vector>& top_bottom_convex_hull_decomposition_scene() const { return m_top_bottom_convex_hull_decomposition_scene; } + const std::pair, std::vector>& top_bottom_convex_hull_decomposition_bed() const { return m_top_bottom_convex_hull_decomposition_bed; } + private: // Source definition of the print bed geometry (PrintConfig::bed_shape) std::vector m_bed_shape; diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 5998dd6eb73..098131e0086 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -11,12 +11,20 @@ endif () set(OpenVDBUtils_SOURCES "") if (TARGET OpenVDB::openvdb) - set(OpenVDBUtils_SOURCES OpenVDBUtils.cpp OpenVDBUtils.hpp) + set(OpenVDBUtils_SOURCES OpenVDBUtils.cpp OpenVDBUtils.hpp OpenVDBUtilsLegacy.hpp) endif() -add_library(libslic3r STATIC +set(SLIC3R_SOURCES pchheader.cpp pchheader.hpp + AStar.hpp + AABBTreeIndirect.hpp + AABBTreeLines.hpp + AABBMesh.hpp + AABBMesh.cpp + Algorithm/RegionExpansion.cpp + Algorithm/RegionExpansion.hpp + AnyPtr.hpp BoundingBox.cpp BoundingBox.hpp BridgeDetector.cpp @@ -25,27 +33,42 @@ add_library(libslic3r STATIC Brim.hpp BuildVolume.cpp BuildVolume.hpp + BoostAdapter.hpp clipper.cpp clipper.hpp ClipperUtils.cpp ClipperUtils.hpp + ClipperZUtils.hpp + Color.cpp + Color.hpp Config.cpp Config.hpp + CSGMesh/CSGMesh.hpp + CSGMesh/SliceCSGMesh.hpp + CSGMesh/ModelToCSGMesh.hpp + CSGMesh/PerformCSGMeshBooleans.hpp + CSGMesh/VoxelizeCSGMesh.hpp + CSGMesh/TriangleMeshAdapter.hpp + CSGMesh/CSGMeshCopy.hpp EdgeGrid.cpp EdgeGrid.hpp ElephantFootCompensation.cpp ElephantFootCompensation.hpp + Emboss.cpp + Emboss.hpp enum_bitmask.hpp ExPolygon.cpp ExPolygon.hpp - ExPolygonCollection.cpp - ExPolygonCollection.hpp + ExPolygonsIndex.cpp + ExPolygonsIndex.hpp Extruder.cpp Extruder.hpp ExtrusionEntity.cpp ExtrusionEntity.hpp ExtrusionEntityCollection.cpp ExtrusionEntityCollection.hpp + ExtrusionRole.cpp + ExtrusionRole.hpp ExtrusionSimulator.cpp ExtrusionSimulator.hpp FileParserError.hpp @@ -59,6 +82,8 @@ add_library(libslic3r STATIC Fill/FillBase.hpp Fill/FillConcentric.cpp Fill/FillConcentric.hpp + Fill/FillEnsuring.cpp + Fill/FillEnsuring.hpp Fill/FillHoneycomb.cpp Fill/FillHoneycomb.hpp Fill/FillGyroid.cpp @@ -92,8 +117,18 @@ add_library(libslic3r STATIC Format/objparser.hpp Format/STL.cpp Format/STL.hpp + Format/SLAArchiveWriter.hpp + Format/SLAArchiveWriter.cpp + Format/SLAArchiveReader.hpp + Format/SLAArchiveReader.cpp + Format/ZipperArchiveImport.hpp + Format/ZipperArchiveImport.cpp Format/SL1.hpp Format/SL1.cpp + Format/SL1_SVG.hpp + Format/SL1_SVG.cpp + Format/pwmx.hpp + Format/pwmx.cpp Format/STEP.hpp Format/STEP.cpp GCode/ThumbnailData.cpp @@ -110,6 +145,8 @@ add_library(libslic3r STATIC GCode/PressureEqualizer.hpp GCode/PrintExtents.cpp GCode/PrintExtents.hpp + GCode/RetractWhenCrossingPerimeters.cpp + GCode/RetractWhenCrossingPerimeters.hpp GCode/SpiralVase.cpp GCode/SpiralVase.hpp GCode/SeamPlacer.cpp @@ -145,6 +182,8 @@ add_library(libslic3r STATIC Geometry/VoronoiOffset.hpp Geometry/VoronoiVisualUtils.hpp Int128.hpp + JumpPointSearch.cpp + JumpPointSearch.hpp KDTreeIndirect.hpp Layer.cpp Layer.hpp @@ -163,6 +202,11 @@ add_library(libslic3r STATIC ModelArrange.cpp MultiMaterialSegmentation.cpp MultiMaterialSegmentation.hpp + MeshNormals.hpp + MeshNormals.cpp + Measure.hpp + Measure.cpp + MeasureUtils.hpp CustomGCode.cpp CustomGCode.hpp Arrange.hpp @@ -172,6 +216,8 @@ add_library(libslic3r STATIC MutablePriorityQueue.hpp NormalUtils.cpp NormalUtils.hpp + NSVGUtils.cpp + NSVGUtils.hpp ObjectID.cpp ObjectID.hpp PerimeterGenerator.cpp @@ -194,6 +240,8 @@ add_library(libslic3r STATIC Preset.hpp PresetBundle.cpp PresetBundle.hpp + PrincipalComponents2D.hpp + PrincipalComponents2D.cpp AppConfig.cpp AppConfig.hpp Print.cpp @@ -206,6 +254,7 @@ add_library(libslic3r STATIC PrintObject.cpp PrintObjectSlice.cpp PrintRegion.cpp + PointGrid.hpp PNGReadWrite.hpp PNGReadWrite.cpp QuadricEdgeCollapse.cpp @@ -227,34 +276,45 @@ add_library(libslic3r STATIC SlicingAdaptive.hpp Subdivide.cpp Subdivide.hpp + SupportSpotsGenerator.cpp + SupportSpotsGenerator.hpp SupportMaterial.cpp SupportMaterial.hpp Surface.cpp Surface.hpp SurfaceCollection.cpp SurfaceCollection.hpp + SurfaceMesh.hpp SVG.cpp SVG.hpp Technologies.hpp Tesselate.cpp Tesselate.hpp + TextConfiguration.hpp + TreeSupport.cpp + TreeSupport.hpp + TreeModelVolumes.cpp + TreeModelVolumes.hpp TriangleMesh.cpp TriangleMesh.hpp TriangleMeshSlicer.cpp TriangleMeshSlicer.hpp MeshSplitImpl.hpp TriangulateWall.hpp - TriangulateWall.cpp utils.cpp Utils.hpp Time.cpp Time.hpp + Timer.cpp + Timer.hpp Thread.cpp Thread.hpp TriangleSelector.cpp TriangleSelector.hpp TriangleSetSampling.cpp TriangleSetSampling.hpp + TriangleSelectorWrapper.cpp + TriangleSelectorWrapper.hpp MTUtils.hpp Zipper.hpp Zipper.cpp @@ -275,16 +335,15 @@ add_library(libslic3r STATIC SLA/SupportTreeBuilder.hpp SLA/SupportTreeMesher.hpp SLA/SupportTreeMesher.cpp - SLA/SupportTreeBuildsteps.hpp - SLA/SupportTreeBuildsteps.cpp + SLA/SupportTreeUtils.hpp + SLA/SupportTreeUtilsLegacy.hpp SLA/SupportTreeBuilder.cpp - SLA/Concurrency.hpp SLA/SupportTree.hpp SLA/SupportTree.cpp + SLA/SupportTreeStrategies.hpp # SLA/SupportTreeIGL.cpp SLA/Rotfinder.hpp SLA/Rotfinder.cpp - SLA/BoostAdapter.hpp SLA/SpatIndex.hpp SLA/SpatIndex.cpp SLA/RasterBase.hpp @@ -300,11 +359,17 @@ add_library(libslic3r STATIC SLA/SupportPoint.hpp SLA/SupportPointGenerator.hpp SLA/SupportPointGenerator.cpp - SLA/IndexedMesh.hpp - SLA/IndexedMesh.cpp SLA/Clustering.hpp SLA/Clustering.cpp SLA/ReprojectPointsOnMesh.hpp + SLA/DefaultSupportTree.hpp + SLA/DefaultSupportTree.cpp + SLA/BranchingTreeSLA.hpp + SLA/BranchingTreeSLA.cpp + BranchingTree/BranchingTree.cpp + BranchingTree/BranchingTree.hpp + BranchingTree/PointCloud.cpp + BranchingTree/PointCloud.hpp Arachne/BeadingStrategy/BeadingStrategy.hpp Arachne/BeadingStrategy/BeadingStrategy.cpp @@ -348,6 +413,14 @@ add_library(libslic3r STATIC Arachne/WallToolPaths.cpp ) +add_library(libslic3r STATIC ${SLIC3R_SOURCES}) + +foreach(_source IN ITEMS ${SLIC3R_SOURCES}) + get_filename_component(_source_path "${_source}" PATH) + string(REPLACE "/" "\\" _group_path "${_source_path}") + source_group("${_group_path}" FILES "${_source}") +endforeach() + if (SLIC3R_STATIC) set(CGAL_Boost_USE_STATIC_LIBS ON CACHE BOOL "" FORCE) endif () @@ -358,8 +431,14 @@ cmake_policy(SET CMP0011 NEW) find_package(CGAL REQUIRED) cmake_policy(POP) -add_library(libslic3r_cgal STATIC MeshBoolean.cpp MeshBoolean.hpp TryCatchSignal.hpp - TryCatchSignal.cpp Geometry/VoronoiUtilsCgal.hpp Geometry/VoronoiUtilsCgal.cpp) +add_library(libslic3r_cgal STATIC + CutSurface.hpp CutSurface.cpp + Geometry/VoronoiUtilsCgal.hpp Geometry/VoronoiUtilsCgal.cpp + IntersectionPoints.hpp IntersectionPoints.cpp + MeshBoolean.hpp MeshBoolean.cpp + TryCatchSignal.hpp TryCatchSignal.cpp + Triangulation.hpp Triangulation.cpp +) target_include_directories(libslic3r_cgal PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) # Reset compile options of libslic3r_cgal. Despite it being linked privately, CGAL options @@ -395,7 +474,7 @@ find_package(JPEG REQUIRED) target_link_libraries(libslic3r libnest2d admesh - cereal + libcereal libigl miniz boost_libs @@ -427,14 +506,11 @@ if(WIN32) target_link_libraries(libslic3r Psapi.lib) endif() -if(SLIC3R_PROFILE) - target_link_libraries(libslic3r Shiny) -endif() - if (APPLE) # This flag prevents the need for minimum SDK version 10.14 # currently, PS targets v10.12 target_compile_options(libslic3r PUBLIC "-fno-aligned-allocation") + target_compile_options(libslic3r_cgal PUBLIC "-fno-aligned-allocation") endif () if (SLIC3R_PCH AND NOT SLIC3R_SYNTAXONLY) diff --git a/src/libslic3r/CSGMesh/CSGMesh.hpp b/src/libslic3r/CSGMesh/CSGMesh.hpp new file mode 100644 index 00000000000..d14ed765959 --- /dev/null +++ b/src/libslic3r/CSGMesh/CSGMesh.hpp @@ -0,0 +1,86 @@ +#ifndef CSGMESH_HPP +#define CSGMESH_HPP + +#include +#include + +namespace Slic3r { namespace csg { + +// A CSGPartT should be an object that can provide at least a mesh + trafo and an +// associated csg operation. A collection of CSGPartT objects can then +// be interpreted as one model and used in various contexts. It can be assembled +// with CGAL or OpenVDB, rendered with OpenCSG or provided to a ray-tracer to +// deal with various parts of it according to the supported CSG types... +// +// A few simple templated interface functions are provided here and a default +// CSGPart class that implements the necessary means to be usable as a +// CSGPartT object. + +// Supported CSG operation types +enum class CSGType { Union, Difference, Intersection }; + +// A CSG part can instruct the processing to push the sub-result until a new +// csg part with a pop instruction appears. This can be used to implement +// parentheses in a CSG expression represented by the collection of csg parts. +// A CSG part can not contain another CSG collection, only a mesh, this is why +// its easier to do this stacking instead of recursion in the data definition. +// CSGStackOp::Continue means no stack operation required. +// When a CSG part contains a Push instruction, it is expected that the CSG +// operation it contains refers to the whole collection spanning to the nearest +// part with a Pop instruction. +// e.g.: +// { +// CUBE1: { mesh: cube, op: Union, stack op: Continue }, +// CUBE2: { mesh: cube, op: Difference, stack op: Push}, +// CUBE3: { mesh: cube, op: Union, stack op: Pop} +// } +// is a collection of csg parts representing the expression CUBE1 - (CUBE2 + CUBE3) +enum class CSGStackOp { Push, Continue, Pop }; + +// Get the CSG operation of the part. Can be overriden for any type +template CSGType get_operation(const CSGPartT &part) +{ + return part.operation; +} + +// Get the stack operation required by the CSG part. +template CSGStackOp get_stack_operation(const CSGPartT &part) +{ + return part.stack_operation; +} + +// Get the mesh for the part. Can be overriden for any type +template +const indexed_triangle_set *get_mesh(const CSGPartT &part) +{ + return part.its_ptr.get(); +} + +// Get the transformation associated with the mesh inside a CSGPartT object. +// Can be overriden for any type. +template +Transform3f get_transform(const CSGPartT &part) +{ + return part.trafo; +} + +// Default implementation +struct CSGPart { + AnyPtr its_ptr; + Transform3f trafo; + CSGType operation; + CSGStackOp stack_operation; + + CSGPart(AnyPtr ptr = {}, + CSGType op = CSGType::Union, + const Transform3f &tr = Transform3f::Identity()) + : its_ptr{std::move(ptr)} + , operation{op} + , stack_operation{CSGStackOp::Continue} + , trafo{tr} + {} +}; + +}} // namespace Slic3r::csg + +#endif // CSGMESH_HPP diff --git a/src/libslic3r/CSGMesh/CSGMeshCopy.hpp b/src/libslic3r/CSGMesh/CSGMeshCopy.hpp new file mode 100644 index 00000000000..78800f9bbb8 --- /dev/null +++ b/src/libslic3r/CSGMesh/CSGMeshCopy.hpp @@ -0,0 +1,80 @@ +#ifndef CSGMESHCOPY_HPP +#define CSGMESHCOPY_HPP + +#include "CSGMesh.hpp" + +namespace Slic3r { namespace csg { + +// Copy a csg range but for the meshes, only copy the pointers. If the copy +// is made from a CSGPart compatible object, and the pointer is a shared one, +// it will be copied with reference counting. +template +void copy_csgrange_shallow(const Range &csgrange, OutIt out) +{ + for (const auto &part : csgrange) { + CSGPart cpy{{}, + get_operation(part), + get_transform(part)}; + + cpy.stack_operation = get_stack_operation(part); + + if constexpr (std::is_convertible_v) { + if (auto shptr = part.its_ptr.get_shared_cpy()) { + cpy.its_ptr = shptr; + } + } + + if (!cpy.its_ptr) + cpy.its_ptr = AnyPtr{get_mesh(part)}; + + *out = std::move(cpy); + ++out; + } +} + +// Copy the csg range, allocating new meshes +template +void copy_csgrange_deep(const Range &csgrange, OutIt out) +{ + for (const auto &part : csgrange) { + + CSGPart cpy{{}, get_operation(part), get_transform(part)}; + + if (auto meshptr = get_mesh(part)) { + cpy.its_ptr = std::make_unique(*meshptr); + } + + cpy.stack_operation = get_stack_operation(part); + + *out = std::move(cpy); + ++out; + } +} + +template +bool is_same(const Range &A, const Range &B) +{ + bool ret = true; + + size_t s = A.size(); + + if (B.size() != s) + ret = false; + + size_t i = 0; + auto itA = A.begin(); + auto itB = B.begin(); + for (; ret && i < s; ++itA, ++itB, ++i) { + ret = ret && + get_mesh(*itA) == get_mesh(*itB) && + get_operation(*itA) == get_operation(*itB) && + get_stack_operation(*itA) == get_stack_operation(*itB) && + get_transform(*itA).isApprox(get_transform(*itB)); + } + + return ret; +} + +}} // namespace Slic3r::csg + +#endif // CSGCOPY_HPP diff --git a/src/libslic3r/CSGMesh/ModelToCSGMesh.hpp b/src/libslic3r/CSGMesh/ModelToCSGMesh.hpp new file mode 100644 index 00000000000..9e413594ed5 --- /dev/null +++ b/src/libslic3r/CSGMesh/ModelToCSGMesh.hpp @@ -0,0 +1,88 @@ +#ifndef MODELTOCSGMESH_HPP +#define MODELTOCSGMESH_HPP + +#include "CSGMesh.hpp" + +#include "libslic3r/Model.hpp" +#include "libslic3r/SLA/Hollowing.hpp" +#include "libslic3r/MeshSplitImpl.hpp" + +namespace Slic3r { namespace csg { + +// Flags to select which parts to export from Model into a csg part collection. +// These flags can be chained with the | operator +enum ModelParts { + mpartsPositive = 1, // Include positive parts + mpartsNegative = 2, // Include negative parts + mpartsDrillHoles = 4, // Include drill holes + mpartsDoSplits = 8, // Split each splitable mesh and export as a union of csg parts +}; + +template +void model_to_csgmesh(const ModelObject &mo, + const Transform3d &trafo, // Applies to all exported parts + OutIt out, // Output iterator + // values of ModelParts OR-ed + int parts_to_include = mpartsPositive + ) +{ + bool do_positives = parts_to_include & mpartsPositive; + bool do_negatives = parts_to_include & mpartsNegative; + bool do_drillholes = parts_to_include & mpartsDrillHoles; + bool do_splits = parts_to_include & mpartsDoSplits; + + for (const ModelVolume *vol : mo.volumes) { + if (vol && vol->mesh_ptr() && + ((do_positives && vol->is_model_part()) || + (do_negatives && vol->is_negative_volume()))) { + + if (do_splits && its_is_splittable(vol->mesh().its)) { + CSGPart part_begin{{}, vol->is_model_part() ? CSGType::Union : CSGType::Difference}; + part_begin.stack_operation = CSGStackOp::Push; + *out = std::move(part_begin); + ++out; + + its_split(vol->mesh().its, SplitOutputFn{[&out, &vol, &trafo](indexed_triangle_set &&its) { + if (its.empty()) + return; + + CSGPart part{std::make_unique(std::move(its)), + CSGType::Union, + (trafo * vol->get_matrix()).cast()}; + + *out = std::move(part); + ++out; + }}); + + CSGPart part_end{{}}; + part_end.stack_operation = CSGStackOp::Pop; + *out = std::move(part_end); + ++out; + } else { + CSGPart part{&(vol->mesh().its), + vol->is_model_part() ? CSGType::Union : CSGType::Difference, + (trafo * vol->get_matrix()).cast()}; + + *out = std::move(part); + ++out; + } + } + } + + if (do_drillholes) { + sla::DrainHoles drainholes = sla::transformed_drainhole_points(mo, trafo); + + for (const sla::DrainHole &dhole : drainholes) { + CSGPart part{std::make_unique( + dhole.to_mesh()), + CSGType::Difference}; + + *out = std::move(part); + ++out; + } + } +} + +}} // namespace Slic3r::csg + +#endif // MODELTOCSGMESH_HPP diff --git a/src/libslic3r/CSGMesh/PerformCSGMeshBooleans.hpp b/src/libslic3r/CSGMesh/PerformCSGMeshBooleans.hpp new file mode 100644 index 00000000000..555e9abbe08 --- /dev/null +++ b/src/libslic3r/CSGMesh/PerformCSGMeshBooleans.hpp @@ -0,0 +1,204 @@ +#ifndef PERFORMCSGMESHBOOLEANS_HPP +#define PERFORMCSGMESHBOOLEANS_HPP + +#include +#include + +#include "CSGMesh.hpp" + +#include "libslic3r/Execution/ExecutionTBB.hpp" +//#include "libslic3r/Execution/ExecutionSeq.hpp" +#include "libslic3r/MeshBoolean.hpp" + +namespace Slic3r { namespace csg { + +// This method can be overriden when a specific CSGPart type supports caching +// of the voxel grid +template +MeshBoolean::cgal::CGALMeshPtr get_cgalmesh(const CSGPartT &csgpart) +{ + const indexed_triangle_set *its = csg::get_mesh(csgpart); + indexed_triangle_set dummy; + + if (!its) + its = &dummy; + + MeshBoolean::cgal::CGALMeshPtr ret; + + indexed_triangle_set m = *its; + its_transform(m, get_transform(csgpart), true); + + try { + ret = MeshBoolean::cgal::triangle_mesh_to_cgal(m); + } catch (...) { + // errors are ignored, simply return null + ret = nullptr; + } + + return ret; +} + +namespace detail_cgal { + +using MeshBoolean::cgal::CGALMeshPtr; + +inline void perform_csg(CSGType op, CGALMeshPtr &dst, CGALMeshPtr &src) +{ + if (!dst && op == CSGType::Union && src) { + dst = std::move(src); + return; + } + + if (!dst || !src) + return; + + switch (op) { + case CSGType::Union: + MeshBoolean::cgal::plus(*dst, *src); + break; + case CSGType::Difference: + MeshBoolean::cgal::minus(*dst, *src); + break; + case CSGType::Intersection: + MeshBoolean::cgal::intersect(*dst, *src); + break; + } +} + +template +std::vector get_cgalptrs(Ex policy, const Range &csgrange) +{ + std::vector ret(csgrange.size()); + execution::for_each(policy, size_t(0), csgrange.size(), + [&csgrange, &ret](size_t i) { + auto it = csgrange.begin(); + std::advance(it, i); + auto &csgpart = *it; + ret[i] = get_cgalmesh(csgpart); + }); + + return ret; +} + +} // namespace detail + +// Process the sequence of CSG parts with CGAL. +template +void perform_csgmesh_booleans(MeshBoolean::cgal::CGALMeshPtr &cgalm, + const Range &csgrange) +{ + using MeshBoolean::cgal::CGALMesh; + using MeshBoolean::cgal::CGALMeshPtr; + using namespace detail_cgal; + + struct Frame { + CSGType op; CGALMeshPtr cgalptr; + explicit Frame(CSGType csgop = CSGType::Union) + : op{csgop} + , cgalptr{MeshBoolean::cgal::triangle_mesh_to_cgal(indexed_triangle_set{})} + {} + }; + + std::stack opstack{std::vector{}}; + + opstack.push(Frame{}); + + std::vector cgalmeshes = get_cgalptrs(ex_tbb, csgrange); + + size_t csgidx = 0; + for (auto &csgpart : csgrange) { + + auto op = get_operation(csgpart); + CGALMeshPtr &cgalptr = cgalmeshes[csgidx++]; + + if (get_stack_operation(csgpart) == CSGStackOp::Push) { + opstack.push(Frame{op}); + op = CSGType::Union; + } + + Frame *top = &opstack.top(); + + perform_csg(get_operation(csgpart), top->cgalptr, cgalptr); + + if (get_stack_operation(csgpart) == CSGStackOp::Pop) { + CGALMeshPtr src = std::move(top->cgalptr); + auto popop = opstack.top().op; + opstack.pop(); + CGALMeshPtr &dst = opstack.top().cgalptr; + perform_csg(popop, dst, src); + } + } + + cgalm = std::move(opstack.top().cgalptr); +} + +template +It check_csgmesh_booleans(const Range &csgrange, Visitor &&vfn) +{ + using namespace detail_cgal; + + std::vector cgalmeshes(csgrange.size()); + auto check_part = [&csgrange, &cgalmeshes](size_t i) + { + auto it = csgrange.begin(); + std::advance(it, i); + auto &csgpart = *it; + auto m = get_cgalmesh(csgpart); + + // mesh can be nullptr if this is a stack push or pull + if (!get_mesh(csgpart) && get_stack_operation(csgpart) != CSGStackOp::Continue) { + cgalmeshes[i] = MeshBoolean::cgal::triangle_mesh_to_cgal(indexed_triangle_set{}); + return; + } + + try { + if (!m || MeshBoolean::cgal::empty(*m)) + return; + + if (!MeshBoolean::cgal::does_bound_a_volume(*m)) + return; + + if (MeshBoolean::cgal::does_self_intersect(*m)) + return; + } + catch (...) { return; } + + cgalmeshes[i] = std::move(m); + }; + execution::for_each(ex_tbb, size_t(0), csgrange.size(), check_part); + + It ret = csgrange.end(); + for (size_t i = 0; i < csgrange.size(); ++i) { + if (!cgalmeshes[i]) { + auto it = csgrange.begin(); + std::advance(it, i); + vfn(it); + + if (ret == csgrange.end()) + ret = it; + } + } + + return ret; +} + +template +It check_csgmesh_booleans(const Range &csgrange) +{ + return check_csgmesh_booleans(csgrange, [](auto &) {}); +} + +template +MeshBoolean::cgal::CGALMeshPtr perform_csgmesh_booleans(const Range &csgparts) +{ + auto ret = MeshBoolean::cgal::triangle_mesh_to_cgal(indexed_triangle_set{}); + if (ret) + perform_csgmesh_booleans(ret, csgparts); + + return ret; +} + +} // namespace csg +} // namespace Slic3r + +#endif // PERFORMCSGMESHBOOLEANS_HPP diff --git a/src/libslic3r/CSGMesh/SliceCSGMesh.hpp b/src/libslic3r/CSGMesh/SliceCSGMesh.hpp new file mode 100644 index 00000000000..9d7b9a077d2 --- /dev/null +++ b/src/libslic3r/CSGMesh/SliceCSGMesh.hpp @@ -0,0 +1,131 @@ +#ifndef SLICECSGMESH_HPP +#define SLICECSGMESH_HPP + +#include "CSGMesh.hpp" + +#include + +#include "libslic3r/TriangleMeshSlicer.hpp" +#include "libslic3r/ClipperUtils.hpp" +#include "libslic3r/Execution/ExecutionTBB.hpp" + +namespace Slic3r { namespace csg { + +namespace detail { + +inline void merge_slices(csg::CSGType op, size_t i, + std::vector &target, + std::vector &source) +{ + switch(op) { + case CSGType::Union: + for (ExPolygon &expoly : source[i]) + target[i].emplace_back(std::move(expoly)); + break; + case CSGType::Difference: + target[i] = diff_ex(target[i], source[i]); + break; + case CSGType::Intersection: + target[i] = intersection_ex(target[i], source[i]); + break; + } +} + +inline void collect_nonempty_indices(csg::CSGType op, + const std::vector &slicegrid, + const std::vector &slices, + std::vector &indices) +{ + indices.clear(); + for (size_t i = 0; i < slicegrid.size(); ++i) { + if (op == CSGType::Intersection || !slices[i].empty()) + indices.emplace_back(i); + } +} + +} // namespace detail + +template +std::vector slice_csgmesh_ex( + const Range &csgrange, + const std::vector &slicegrid, + const MeshSlicingParamsEx ¶ms, + const std::function &throw_on_cancel = [] {}) +{ + using namespace detail; + + struct Frame { CSGType op; std::vector slices; }; + + std::stack opstack{std::vector{}}; + + MeshSlicingParamsEx params_cpy = params; + auto trafo = params.trafo; + auto nonempty_indices = reserve_vector(slicegrid.size()); + + opstack.push({CSGType::Union, std::vector(slicegrid.size())}); + + for (const auto &csgpart : csgrange) { + const indexed_triangle_set *its = csg::get_mesh(csgpart); + + auto op = get_operation(csgpart); + + if (get_stack_operation(csgpart) == CSGStackOp::Push) { + opstack.push({op, std::vector(slicegrid.size())}); + op = CSGType::Union; + } + + Frame *top = &opstack.top(); + + if (its) { + params_cpy.trafo = trafo * csg::get_transform(csgpart).template cast(); + std::vector slices = slice_mesh_ex(*its, + slicegrid, params_cpy, + throw_on_cancel); + + assert(slices.size() == slicegrid.size()); + + collect_nonempty_indices(op, slicegrid, slices, nonempty_indices); + + execution::for_each( + ex_tbb, nonempty_indices.begin(), nonempty_indices.end(), + [op, &slices, &top](size_t i) { + merge_slices(op, i, top->slices, slices); + }, execution::max_concurrency(ex_tbb)); + } + + if (get_stack_operation(csgpart) == CSGStackOp::Pop) { + std::vector popslices = std::move(top->slices); + auto popop = opstack.top().op; + opstack.pop(); + std::vector &prev_slices = opstack.top().slices; + + collect_nonempty_indices(popop, slicegrid, popslices, nonempty_indices); + + execution::for_each( + ex_tbb, nonempty_indices.begin(), nonempty_indices.end(), + [&popslices, &prev_slices, popop](size_t i) { + merge_slices(popop, i, prev_slices, popslices); + }, execution::max_concurrency(ex_tbb)); + } + } + + std::vector ret = std::move(opstack.top().slices); + + // TODO: verify if this part can be omitted or not. + execution::for_each(ex_tbb, ret.begin(), ret.end(), [](ExPolygons &slice) { + auto it = std::remove_if(slice.begin(), slice.end(), [](const ExPolygon &p){ + return p.area() < double(SCALED_EPSILON) * double(SCALED_EPSILON); + }); + + // Hopefully, ExPolygons are moved, not copied to new positions + // and that is cheap for expolygons + slice.erase(it, slice.end()); + slice = union_ex(slice); + }, execution::max_concurrency(ex_tbb)); + + return ret; +} + +}} // namespace Slic3r::csg + +#endif // SLICECSGMESH_HPP diff --git a/src/libslic3r/CSGMesh/TriangleMeshAdapter.hpp b/src/libslic3r/CSGMesh/TriangleMeshAdapter.hpp new file mode 100644 index 00000000000..81b05b04634 --- /dev/null +++ b/src/libslic3r/CSGMesh/TriangleMeshAdapter.hpp @@ -0,0 +1,95 @@ +#ifndef TRIANGLEMESHADAPTER_HPP +#define TRIANGLEMESHADAPTER_HPP + +#include "CSGMesh.hpp" + +#include "libslic3r/TriangleMesh.hpp" + +namespace Slic3r { namespace csg { + +// Provide default overloads for indexed_triangle_set to be usable as a plain +// CSGPart with an implicit union operation + +inline CSGType get_operation(const indexed_triangle_set &part) +{ + return CSGType::Union; +} + +inline CSGStackOp get_stack_operation(const indexed_triangle_set &part) +{ + return CSGStackOp::Continue; +} + +inline const indexed_triangle_set * get_mesh(const indexed_triangle_set &part) +{ + return ∂ +} + +inline Transform3f get_transform(const indexed_triangle_set &part) +{ + return Transform3f::Identity(); +} + +inline CSGType get_operation(const indexed_triangle_set *const part) +{ + return CSGType::Union; +} + +inline CSGStackOp get_stack_operation(const indexed_triangle_set *const part) +{ + return CSGStackOp::Continue; +} + +inline const indexed_triangle_set * get_mesh(const indexed_triangle_set *const part) +{ + return part; +} + +inline Transform3f get_transform(const indexed_triangle_set *const part) +{ + return Transform3f::Identity(); +} + +inline CSGType get_operation(const TriangleMesh &part) +{ + return CSGType::Union; +} + +inline CSGStackOp get_stack_operation(const TriangleMesh &part) +{ + return CSGStackOp::Continue; +} + +inline const indexed_triangle_set * get_mesh(const TriangleMesh &part) +{ + return &part.its; +} + +inline Transform3f get_transform(const TriangleMesh &part) +{ + return Transform3f::Identity(); +} + +inline CSGType get_operation(const TriangleMesh * const part) +{ + return CSGType::Union; +} + +inline CSGStackOp get_stack_operation(const TriangleMesh * const part) +{ + return CSGStackOp::Continue; +} + +inline const indexed_triangle_set * get_mesh(const TriangleMesh * const part) +{ + return &part->its; +} + +inline Transform3f get_transform(const TriangleMesh * const part) +{ + return Transform3f::Identity(); +} + +}} // namespace Slic3r::csg + +#endif // TRIANGLEMESHADAPTER_HPP diff --git a/src/libslic3r/CSGMesh/VoxelizeCSGMesh.hpp b/src/libslic3r/CSGMesh/VoxelizeCSGMesh.hpp new file mode 100644 index 00000000000..f64d17b9a4b --- /dev/null +++ b/src/libslic3r/CSGMesh/VoxelizeCSGMesh.hpp @@ -0,0 +1,116 @@ +#ifndef VOXELIZECSGMESH_HPP +#define VOXELIZECSGMESH_HPP + +#include +#include + +#include "CSGMesh.hpp" +#include "libslic3r/OpenVDBUtils.hpp" +#include "libslic3r/Execution/ExecutionTBB.hpp" + +namespace Slic3r { namespace csg { + +using VoxelizeParams = MeshToGridParams; + +// This method can be overriden when a specific CSGPart type supports caching +// of the voxel grid +template +VoxelGridPtr get_voxelgrid(const CSGPartT &csgpart, VoxelizeParams params) +{ + const indexed_triangle_set *its = csg::get_mesh(csgpart); + VoxelGridPtr ret; + + params.trafo(params.trafo() * csg::get_transform(csgpart)); + + if (its) + ret = mesh_to_grid(*its, params); + + return ret; +} + +namespace detail { + +inline void perform_csg(CSGType op, VoxelGridPtr &dst, VoxelGridPtr &src) +{ + if (!dst || !src) + return; + + switch (op) { + case CSGType::Union: + if (is_grid_empty(*dst) && !is_grid_empty(*src)) + dst = clone(*src); + else + grid_union(*dst, *src); + + break; + case CSGType::Difference: + grid_difference(*dst, *src); + break; + case CSGType::Intersection: + grid_intersection(*dst, *src); + break; + } +} + +} // namespace detail + +template +VoxelGridPtr voxelize_csgmesh(const Range &csgrange, + const VoxelizeParams ¶ms = {}) +{ + using namespace detail; + + VoxelGridPtr ret; + + std::vector grids (csgrange.size()); + + execution::for_each(ex_tbb, size_t(0), csgrange.size(), [&](size_t csgidx) { + if (params.statusfn() && params.statusfn()(-1)) + return; + + auto it = csgrange.begin(); + std::advance(it, csgidx); + auto &csgpart = *it; + grids[csgidx] = get_voxelgrid(csgpart, params); + }, execution::max_concurrency(ex_tbb)); + + size_t csgidx = 0; + struct Frame { CSGType op = CSGType::Union; VoxelGridPtr grid; }; + std::stack opstack{std::vector{}}; + + opstack.push({CSGType::Union, mesh_to_grid({}, params)}); + + for (auto &csgpart : csgrange) { + if (params.statusfn() && params.statusfn()(-1)) + break; + + auto &partgrid = grids[csgidx++]; + + auto op = get_operation(csgpart); + + if (get_stack_operation(csgpart) == CSGStackOp::Push) { + opstack.push({op, mesh_to_grid({}, params)}); + op = CSGType::Union; + } + + Frame *top = &opstack.top(); + + perform_csg(get_operation(csgpart), top->grid, partgrid); + + if (get_stack_operation(csgpart) == CSGStackOp::Pop) { + VoxelGridPtr popgrid = std::move(top->grid); + auto popop = opstack.top().op; + opstack.pop(); + VoxelGridPtr &grid = opstack.top().grid; + perform_csg(popop, grid, popgrid); + } + } + + ret = std::move(opstack.top().grid); + + return ret; +} + +}} // namespace Slic3r::csg + +#endif // VOXELIZECSGMESH_HPP diff --git a/src/libslic3r/ClipperUtils.cpp b/src/libslic3r/ClipperUtils.cpp index fe964f592fc..ed76fc66a83 100644 --- a/src/libslic3r/ClipperUtils.cpp +++ b/src/libslic3r/ClipperUtils.cpp @@ -8,19 +8,6 @@ #include "SVG.hpp" #endif /* CLIPPER_UTILS_DEBUG */ -// Profiling support using the Shiny intrusive profiler -//#define CLIPPER_UTILS_PROFILE -#if defined(SLIC3R_PROFILE) && defined(CLIPPER_UTILS_PROFILE) - #include - #define CLIPPERUTILS_PROFILE_FUNC() PROFILE_FUNC() - #define CLIPPERUTILS_PROFILE_BLOCK(name) PROFILE_BLOCK(name) -#else - #define CLIPPERUTILS_PROFILE_FUNC() - #define CLIPPERUTILS_PROFILE_BLOCK(name) -#endif - -#define CLIPPER_OFFSET_SHORTEST_EDGE_FACTOR (0.005f) - namespace Slic3r { #ifdef CLIPPER_UTILS_DEBUG @@ -59,6 +46,115 @@ bool export_clipper_input_polygons_bin(const char *path, const ClipperLib::Paths namespace ClipperUtils { Points EmptyPathsProvider::s_empty_points; Points SinglePathProvider::s_end; + + // Clip source polygon to be used as a clipping polygon with a bouding box around the source (to be clipped) polygon. + // Useful as an optimization for expensive ClipperLib operations, for example when clipping source polygons one by one + // with a set of polygons covering the whole layer below. + template + inline void clip_clipper_polygon_with_subject_bbox_templ(const std::vector &src, const BoundingBox &bbox, std::vector &out) + { + out.clear(); + const size_t cnt = src.size(); + if (cnt < 3) + return; + + enum class Side { + Left = 1, + Right = 2, + Top = 4, + Bottom = 8 + }; + + auto sides = [bbox](const PointType &p) { + return int(p.x() < bbox.min.x()) * int(Side::Left) + + int(p.x() > bbox.max.x()) * int(Side::Right) + + int(p.y() < bbox.min.y()) * int(Side::Bottom) + + int(p.y() > bbox.max.y()) * int(Side::Top); + }; + + int sides_prev = sides(src.back()); + int sides_this = sides(src.front()); + const size_t last = cnt - 1; + for (size_t i = 0; i < last; ++ i) { + int sides_next = sides(src[i + 1]); + if (// This point is inside. Take it. + sides_this == 0 || + // Either this point is outside and previous or next is inside, or + // the edge possibly cuts corner of the bounding box. + (sides_prev & sides_this & sides_next) == 0) { + out.emplace_back(src[i]); + sides_prev = sides_this; + } else { + // All the three points (this, prev, next) are outside at the same side. + // Ignore this point. + } + sides_this = sides_next; + } + + // Never produce just a single point output polygon. + if (! out.empty()) + if (int sides_next = sides(out.front()); + // The last point is inside. Take it. + sides_this == 0 || + // Either this point is outside and previous or next is inside, or + // the edge possibly cuts corner of the bounding box. + (sides_prev & sides_this & sides_next) == 0) + out.emplace_back(src.back()); + } + + void clip_clipper_polygon_with_subject_bbox(const Points &src, const BoundingBox &bbox, Points &out) + { clip_clipper_polygon_with_subject_bbox_templ(src, bbox, out); } + void clip_clipper_polygon_with_subject_bbox(const ZPoints &src, const BoundingBox &bbox, ZPoints &out) + { clip_clipper_polygon_with_subject_bbox_templ(src, bbox, out); } + + template + [[nodiscard]] std::vector clip_clipper_polygon_with_subject_bbox_templ(const std::vector &src, const BoundingBox &bbox) + { + std::vector out; + clip_clipper_polygon_with_subject_bbox(src, bbox, out); + return out; + } + + [[nodiscard]] Points clip_clipper_polygon_with_subject_bbox(const Points &src, const BoundingBox &bbox) + { return clip_clipper_polygon_with_subject_bbox_templ(src, bbox); } + [[nodiscard]] ZPoints clip_clipper_polygon_with_subject_bbox(const ZPoints &src, const BoundingBox &bbox) + { return clip_clipper_polygon_with_subject_bbox_templ(src, bbox); } + + void clip_clipper_polygon_with_subject_bbox(const Polygon &src, const BoundingBox &bbox, Polygon &out) + { + clip_clipper_polygon_with_subject_bbox(src.points, bbox, out.points); + } + + [[nodiscard]] Polygon clip_clipper_polygon_with_subject_bbox(const Polygon &src, const BoundingBox &bbox) + { + Polygon out; + clip_clipper_polygon_with_subject_bbox(src.points, bbox, out.points); + return out; + } + + [[nodiscard]] Polygons clip_clipper_polygons_with_subject_bbox(const Polygons &src, const BoundingBox &bbox) + { + Polygons out; + out.reserve(src.size()); + for (const Polygon &p : src) + out.emplace_back(clip_clipper_polygon_with_subject_bbox(p, bbox)); + out.erase( + std::remove_if(out.begin(), out.end(), [](const Polygon &polygon) { return polygon.empty(); }), + out.end()); + return out; + } + [[nodiscard]] Polygons clip_clipper_polygons_with_subject_bbox(const ExPolygon &src, const BoundingBox &bbox) + { + Polygons out; + out.reserve(src.num_contours()); + out.emplace_back(clip_clipper_polygon_with_subject_bbox(src.contour, bbox)); + for (const Polygon &p : src.holes) + out.emplace_back(clip_clipper_polygon_with_subject_bbox(p, bbox)); + out.erase( + std::remove_if(out.begin(), out.end(), [](const Polygon &polygon) { return polygon.empty(); }), + out.end()); + return out; + } } static ExPolygons PolyTreeToExPolygons(ClipperLib::PolyTree &&polytree) @@ -169,7 +265,7 @@ static ClipperLib::Paths raw_offset(PathsProvider &&paths, float offset, Clipper co.ArcTolerance = miterLimit; else co.MiterLimit = miterLimit; - co.ShortestEdgeLength = double(std::abs(offset * CLIPPER_OFFSET_SHORTEST_EDGE_FACTOR)); + co.ShortestEdgeLength = std::abs(offset * ClipperOffsetShortestEdgeFactor); for (const ClipperLib::Path &path : paths) { co.Clear(); // Execute reorients the contours so that the outer most contour has a positive area. Thus the output @@ -240,7 +336,7 @@ TResult clipper_union( // Perform union of input polygons using the positive rule, convert to ExPolygons. //FIXME is there any benefit of not doing the boolean / using pftEvenOdd? -ExPolygons ClipperPaths_to_Slic3rExPolygons(const ClipperLib::Paths &input, bool do_union) +inline ExPolygons ClipperPaths_to_Slic3rExPolygons(const ClipperLib::Paths &input, bool do_union) { return PolyTreeToExPolygons(clipper_union(input, do_union ? ClipperLib::pftNonZero : ClipperLib::pftEvenOdd)); } @@ -316,7 +412,7 @@ static int offset_expolygon_inner(const Slic3r::ExPolygon &expoly, const float d co.ArcTolerance = miterLimit; else co.MiterLimit = miterLimit; - co.ShortestEdgeLength = double(std::abs(delta * CLIPPER_OFFSET_SHORTEST_EDGE_FACTOR)); + co.ShortestEdgeLength = std::abs(delta * ClipperOffsetShortestEdgeFactor); co.AddPath(expoly.contour.points, joinType, ClipperLib::etClosedPolygon); co.Execute(contours, delta); } @@ -337,7 +433,7 @@ static int offset_expolygon_inner(const Slic3r::ExPolygon &expoly, const float d co.ArcTolerance = miterLimit; else co.MiterLimit = miterLimit; - co.ShortestEdgeLength = double(std::abs(delta * CLIPPER_OFFSET_SHORTEST_EDGE_FACTOR)); + co.ShortestEdgeLength = std::abs(delta * ClipperOffsetShortestEdgeFactor); co.AddPath(hole.points, joinType, ClipperLib::etClosedPolygon); ClipperLib::Paths out2; // Execute reorients the contours so that the outer most contour has a positive area. Thus the output @@ -438,11 +534,13 @@ Slic3r::Polygons offset(const Slic3r::SurfacesPtr &surfaces, const float delta, { return to_polygons(expolygons_offset(surfaces, delta, joinType, miterLimit)); } Slic3r::ExPolygons offset_ex(const Slic3r::ExPolygon &expolygon, const float delta, ClipperLib::JoinType joinType, double miterLimit) //FIXME one may spare one Clipper Union call. - { return ClipperPaths_to_Slic3rExPolygons(expolygon_offset(expolygon, delta, joinType, miterLimit)); } + { return ClipperPaths_to_Slic3rExPolygons(expolygon_offset(expolygon, delta, joinType, miterLimit), /* do union */ false); } Slic3r::ExPolygons offset_ex(const Slic3r::ExPolygons &expolygons, const float delta, ClipperLib::JoinType joinType, double miterLimit) { return PolyTreeToExPolygons(expolygons_offset_pt(expolygons, delta, joinType, miterLimit)); } Slic3r::ExPolygons offset_ex(const Slic3r::Surfaces &surfaces, const float delta, ClipperLib::JoinType joinType, double miterLimit) { return PolyTreeToExPolygons(expolygons_offset_pt(surfaces, delta, joinType, miterLimit)); } +Slic3r::ExPolygons offset_ex(const Slic3r::SurfacesPtr &surfaces, const float delta, ClipperLib::JoinType joinType, double miterLimit) + { return PolyTreeToExPolygons(expolygons_offset_pt(surfaces, delta, joinType, miterLimit)); } Polygons offset2(const ExPolygons &expolygons, const float delta1, const float delta2, ClipperLib::JoinType joinType, double miterLimit) { @@ -546,6 +644,8 @@ Slic3r::Polygons diff(const Slic3r::Polygon &subject, const Slic3r::Polygon &cli { return _clipper(ClipperLib::ctDifference, ClipperUtils::SinglePathProvider(subject.points), ClipperUtils::SinglePathProvider(clip.points), do_safety_offset); } Slic3r::Polygons diff(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset) { return _clipper(ClipperLib::ctDifference, ClipperUtils::PolygonsProvider(subject), ClipperUtils::PolygonsProvider(clip), do_safety_offset); } +Slic3r::Polygons diff_clipped(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset) + { return diff(subject, ClipperUtils::clip_clipper_polygons_with_subject_bbox(clip, get_extents(subject).inflated(SCALED_EPSILON)), do_safety_offset); } Slic3r::Polygons diff(const Slic3r::Polygons &subject, const Slic3r::ExPolygons &clip, ApplySafetyOffset do_safety_offset) { return _clipper(ClipperLib::ctDifference, ClipperUtils::PolygonsProvider(subject), ClipperUtils::ExPolygonsProvider(clip), do_safety_offset); } Slic3r::Polygons diff(const Slic3r::ExPolygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset) @@ -556,6 +656,8 @@ Slic3r::Polygons diff(const Slic3r::Surfaces &subject, const Slic3r::Polygons &c { return _clipper(ClipperLib::ctDifference, ClipperUtils::SurfacesProvider(subject), ClipperUtils::PolygonsProvider(clip), do_safety_offset); } Slic3r::Polygons intersection(const Slic3r::Polygon &subject, const Slic3r::Polygon &clip, ApplySafetyOffset do_safety_offset) { return _clipper(ClipperLib::ctIntersection, ClipperUtils::SinglePathProvider(subject.points), ClipperUtils::SinglePathProvider(clip.points), do_safety_offset); } +Slic3r::Polygons intersection(const Slic3r::Polygons &subject, const Slic3r::ExPolygon &clip, ApplySafetyOffset do_safety_offset) + { return _clipper(ClipperLib::ctIntersection, ClipperUtils::PolygonsProvider(subject), ClipperUtils::ExPolygonProvider(clip), do_safety_offset); } Slic3r::Polygons intersection(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset) { return _clipper(ClipperLib::ctIntersection, ClipperUtils::PolygonsProvider(subject), ClipperUtils::PolygonsProvider(clip), do_safety_offset); } Slic3r::Polygons intersection(const Slic3r::ExPolygon &subject, const Slic3r::ExPolygon &clip, ApplySafetyOffset do_safety_offset) @@ -576,6 +678,15 @@ Slic3r::Polygons union_(const Slic3r::ExPolygons &subject) { return _clipper(ClipperLib::ctUnion, ClipperUtils::ExPolygonsProvider(subject), ClipperUtils::EmptyPathsProvider(), ApplySafetyOffset::No); } Slic3r::Polygons union_(const Slic3r::Polygons &subject, const Slic3r::Polygons &subject2) { return _clipper(ClipperLib::ctUnion, ClipperUtils::PolygonsProvider(subject), ClipperUtils::PolygonsProvider(subject2), ApplySafetyOffset::No); } +Slic3r::Polygons union_(Slic3r::Polygons &&subject, const Slic3r::Polygons &subject2) { + if (subject.empty()) + return subject2; + if (subject2.empty()) + return std::move(subject); + return union_(subject, subject2); +} +Slic3r::Polygons union_(const Slic3r::Polygons &subject, const Slic3r::ExPolygon &subject2) + { return _clipper(ClipperLib::ctUnion, ClipperUtils::PolygonsProvider(subject), ClipperUtils::ExPolygonProvider(subject2), ApplySafetyOffset::No); } template static ExPolygons _clipper_ex(ClipperLib::ClipType clipType, TSubject &&subject, TClip &&clip, ApplySafetyOffset do_safety_offset, ClipperLib::PolyFillType fill_type = ClipperLib::pftNonZero) @@ -585,6 +696,8 @@ Slic3r::ExPolygons diff_ex(const Slic3r::Polygons &subject, const Slic3r::Polygo { return _clipper_ex(ClipperLib::ctDifference, ClipperUtils::PolygonsProvider(subject), ClipperUtils::PolygonsProvider(clip), do_safety_offset); } Slic3r::ExPolygons diff_ex(const Slic3r::Polygons &subject, const Slic3r::Surfaces &clip, ApplySafetyOffset do_safety_offset) { return _clipper_ex(ClipperLib::ctDifference, ClipperUtils::PolygonsProvider(subject), ClipperUtils::SurfacesProvider(clip), do_safety_offset); } +Slic3r::ExPolygons diff_ex(const Slic3r::Polygon &subject, const Slic3r::ExPolygons &clip, ApplySafetyOffset do_safety_offset) + { return _clipper_ex(ClipperLib::ctDifference, ClipperUtils::SinglePathProvider(subject.points), ClipperUtils::ExPolygonsProvider(clip), do_safety_offset); } Slic3r::ExPolygons diff_ex(const Slic3r::Polygons &subject, const Slic3r::ExPolygons &clip, ApplySafetyOffset do_safety_offset) { return _clipper_ex(ClipperLib::ctDifference, ClipperUtils::PolygonsProvider(subject), ClipperUtils::ExPolygonsProvider(clip), do_safety_offset); } Slic3r::ExPolygons diff_ex(const Slic3r::ExPolygon &subject, const Slic3r::Polygon &clip, ApplySafetyOffset do_safety_offset) @@ -605,6 +718,8 @@ Slic3r::ExPolygons diff_ex(const Slic3r::Surfaces &subject, const Slic3r::Surfac { return _clipper_ex(ClipperLib::ctDifference, ClipperUtils::SurfacesProvider(subject), ClipperUtils::SurfacesProvider(clip), do_safety_offset); } Slic3r::ExPolygons diff_ex(const Slic3r::SurfacesPtr &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset) { return _clipper_ex(ClipperLib::ctDifference, ClipperUtils::SurfacesPtrProvider(subject), ClipperUtils::PolygonsProvider(clip), do_safety_offset); } +Slic3r::ExPolygons diff_ex(const Slic3r::SurfacesPtr &subject, const Slic3r::ExPolygons &clip, ApplySafetyOffset do_safety_offset) + { return _clipper_ex(ClipperLib::ctDifference, ClipperUtils::SurfacesPtrProvider(subject), ClipperUtils::ExPolygonsProvider(clip), do_safety_offset); } Slic3r::ExPolygons intersection_ex(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset) { return _clipper_ex(ClipperLib::ctIntersection, ClipperUtils::PolygonsProvider(subject), ClipperUtils::PolygonsProvider(clip), do_safety_offset); } @@ -701,10 +816,14 @@ Polylines _clipper_pl_closed(ClipperLib::ClipType clipType, PathProvider1 &&subj return retval; } +Slic3r::Polylines diff_pl(const Slic3r::Polyline &subject, const Slic3r::Polygons &clip) + { return _clipper_pl_open(ClipperLib::ctDifference, ClipperUtils::SinglePathProvider(subject.points), ClipperUtils::PolygonsProvider(clip)); } Slic3r::Polylines diff_pl(const Slic3r::Polylines &subject, const Slic3r::Polygons &clip) { return _clipper_pl_open(ClipperLib::ctDifference, ClipperUtils::PolylinesProvider(subject), ClipperUtils::PolygonsProvider(clip)); } Slic3r::Polylines diff_pl(const Slic3r::Polyline &subject, const Slic3r::ExPolygon &clip) { return _clipper_pl_open(ClipperLib::ctDifference, ClipperUtils::SinglePathProvider(subject.points), ClipperUtils::ExPolygonProvider(clip)); } +Slic3r::Polylines diff_pl(const Slic3r::Polyline &subject, const Slic3r::ExPolygons &clip) + { return _clipper_pl_open(ClipperLib::ctDifference, ClipperUtils::SinglePathProvider(subject.points), ClipperUtils::ExPolygonsProvider(clip)); } Slic3r::Polylines diff_pl(const Slic3r::Polylines &subject, const Slic3r::ExPolygon &clip) { return _clipper_pl_open(ClipperLib::ctDifference, ClipperUtils::PolylinesProvider(subject), ClipperUtils::ExPolygonProvider(clip)); } Slic3r::Polylines diff_pl(const Slic3r::Polylines &subject, const Slic3r::ExPolygons &clip) @@ -713,8 +832,14 @@ Slic3r::Polylines diff_pl(const Slic3r::Polygons &subject, const Slic3r::Polygon { return _clipper_pl_closed(ClipperLib::ctDifference, ClipperUtils::PolygonsProvider(subject), ClipperUtils::PolygonsProvider(clip)); } Slic3r::Polylines intersection_pl(const Slic3r::Polylines &subject, const Slic3r::Polygon &clip) { return _clipper_pl_open(ClipperLib::ctIntersection, ClipperUtils::PolylinesProvider(subject), ClipperUtils::SinglePathProvider(clip.points)); } +Slic3r::Polylines intersection_pl(const Slic3r::Polyline &subject, const Slic3r::ExPolygon &clip) + { return _clipper_pl_open(ClipperLib::ctIntersection, ClipperUtils::SinglePathProvider(subject.points), ClipperUtils::ExPolygonProvider(clip)); } +Slic3r::Polylines intersection_pl(const Slic3r::Polylines &subject, const Slic3r::ExPolygon &clip) + { return _clipper_pl_open(ClipperLib::ctIntersection, ClipperUtils::PolylinesProvider(subject), ClipperUtils::ExPolygonProvider(clip)); } Slic3r::Polylines intersection_pl(const Slic3r::Polyline &subject, const Slic3r::Polygons &clip) { return _clipper_pl_open(ClipperLib::ctIntersection, ClipperUtils::SinglePathProvider(subject.points), ClipperUtils::PolygonsProvider(clip)); } +Slic3r::Polylines intersection_pl(const Slic3r::Polyline &subject, const Slic3r::ExPolygons &clip) + { return _clipper_pl_open(ClipperLib::ctIntersection, ClipperUtils::SinglePathProvider(subject.points), ClipperUtils::ExPolygonsProvider(clip)); } Slic3r::Polylines intersection_pl(const Slic3r::Polylines &subject, const Slic3r::Polygons &clip) { return _clipper_pl_open(ClipperLib::ctIntersection, ClipperUtils::PolylinesProvider(subject), ClipperUtils::PolygonsProvider(clip)); } Slic3r::Polylines intersection_pl(const Slic3r::Polylines &subject, const Slic3r::ExPolygons &clip) @@ -830,7 +955,7 @@ ExPolygons simplify_polygons_ex(const Polygons &subject, bool preserve_collinear if (! preserve_collinear) return union_ex(simplify_polygons(subject, false)); - ClipperLib::PolyTree polytree; + ClipperLib::PolyTree polytree; ClipperLib::Clipper c; c.PreserveCollinear(true); c.StrictlySimple(true); @@ -937,7 +1062,7 @@ ClipperLib::Path mittered_offset_path_scaled(const Points &contour, const std::v }; // Minimum edge length, squared. - double lmin = *std::max_element(deltas.begin(), deltas.end()) * CLIPPER_OFFSET_SHORTEST_EDGE_FACTOR; + double lmin = *std::max_element(deltas.begin(), deltas.end()) * ClipperOffsetShortestEdgeFactor; double l2min = lmin * lmin; // Minimum angle to consider two edges to be parallel. // Vojtech's estimate. diff --git a/src/libslic3r/ClipperUtils.hpp b/src/libslic3r/ClipperUtils.hpp index aff6b56c9de..5f495788b03 100644 --- a/src/libslic3r/ClipperUtils.hpp +++ b/src/libslic3r/ClipperUtils.hpp @@ -1,19 +1,31 @@ #ifndef slic3r_ClipperUtils_hpp_ #define slic3r_ClipperUtils_hpp_ +//#define SLIC3R_USE_CLIPPER2 + #include "libslic3r.h" -#include "clipper.hpp" #include "ExPolygon.hpp" #include "Polygon.hpp" #include "Surface.hpp" +#ifdef SLIC3R_USE_CLIPPER2 + +#include + +#else /* SLIC3R_USE_CLIPPER2 */ + +#include "clipper.hpp" // import these wherever we're included using Slic3r::ClipperLib::jtMiter; using Slic3r::ClipperLib::jtRound; using Slic3r::ClipperLib::jtSquare; +#endif /* SLIC3R_USE_CLIPPER2 */ + namespace Slic3r { +class BoundingBox; + static constexpr const float ClipperSafetyOffset = 10.f; static constexpr const Slic3r::ClipperLib::JoinType DefaultJoinType = Slic3r::ClipperLib::jtMiter; @@ -27,6 +39,9 @@ static constexpr const Slic3r::ClipperLib::JoinType DefaultLineJoinType = Sl // Miter limit is ignored for jtSquare. static constexpr const double DefaultLineMiterLimit = 0.; +// Decimation factor applied on input contour when doing offset, multiplied by the offset distance. +static constexpr const double ClipperOffsetShortestEdgeFactor = 0.005; + enum class ApplySafetyOffset { No, Yes @@ -296,10 +311,23 @@ namespace ClipperUtils { const SurfacesPtr &m_surfaces; size_t m_size; }; -} -// Perform union of input polygons using the non-zero rule, convert to ExPolygons. -ExPolygons ClipperPaths_to_Slic3rExPolygons(const ClipperLib::Paths &input, bool do_union = false); + // For ClipperLib with Z coordinates. + using ZPoint = Vec3i32; + using ZPoints = std::vector; + + // Clip source polygon to be used as a clipping polygon with a bouding box around the source (to be clipped) polygon. + // Useful as an optimization for expensive ClipperLib operations, for example when clipping source polygons one by one + // with a set of polygons covering the whole layer below. + void clip_clipper_polygon_with_subject_bbox(const Points &src, const BoundingBox &bbox, Points &out); + void clip_clipper_polygon_with_subject_bbox(const ZPoints &src, const BoundingBox &bbox, ZPoints &out); + [[nodiscard]] Points clip_clipper_polygon_with_subject_bbox(const Points &src, const BoundingBox &bbox); + [[nodiscard]] ZPoints clip_clipper_polygon_with_subject_bbox(const ZPoints &src, const BoundingBox &bbox); + void clip_clipper_polygon_with_subject_bbox(const Polygon &src, const BoundingBox &bbox, Polygon &out); + [[nodiscard]] Polygon clip_clipper_polygon_with_subject_bbox(const Polygon &src, const BoundingBox &bbox); + [[nodiscard]] Polygons clip_clipper_polygons_with_subject_bbox(const Polygons &src, const BoundingBox &bbox); + [[nodiscard]] Polygons clip_clipper_polygons_with_subject_bbox(const ExPolygon &src, const BoundingBox &bbox); +} // offset Polygons // Wherever applicable, please use the expand() / shrink() variants instead, they convey their purpose better. @@ -319,6 +347,7 @@ Slic3r::ExPolygons offset_ex(const Slic3r::Polygons &polygons, const float delta Slic3r::ExPolygons offset_ex(const Slic3r::ExPolygon &expolygon, const float delta, ClipperLib::JoinType joinType = DefaultJoinType, double miterLimit = DefaultMiterLimit); Slic3r::ExPolygons offset_ex(const Slic3r::ExPolygons &expolygons, const float delta, ClipperLib::JoinType joinType = DefaultJoinType, double miterLimit = DefaultMiterLimit); Slic3r::ExPolygons offset_ex(const Slic3r::Surfaces &surfaces, const float delta, ClipperLib::JoinType joinType = DefaultJoinType, double miterLimit = DefaultMiterLimit); +Slic3r::ExPolygons offset_ex(const Slic3r::SurfacesPtr &surfaces, const float delta, ClipperLib::JoinType joinType = DefaultJoinType, double miterLimit = DefaultMiterLimit); inline Slic3r::Polygons union_safety_offset (const Slic3r::Polygons &polygons) { return offset (polygons, ClipperSafetyOffset); } inline Slic3r::Polygons union_safety_offset (const Slic3r::ExPolygons &expolygons) { return offset (expolygons, ClipperSafetyOffset); } @@ -335,6 +364,8 @@ inline Slic3r::Polygons expand(const Slic3r::Polygon &polygon, const float del { assert(delta > 0); return offset(polygon, delta, joinType, miterLimit); } inline Slic3r::Polygons expand(const Slic3r::Polygons &polygons, const float delta, ClipperLib::JoinType joinType = DefaultJoinType, double miterLimit = DefaultMiterLimit) { assert(delta > 0); return offset(polygons, delta, joinType, miterLimit); } +inline Slic3r::Polygons expand(const Slic3r::ExPolygons &polygons, const float delta, ClipperLib::JoinType joinType = DefaultJoinType, double miterLimit = DefaultMiterLimit) + { assert(delta > 0); return offset(polygons, delta, joinType, miterLimit); } inline Slic3r::ExPolygons expand_ex(const Slic3r::Polygons &polygons, const float delta, ClipperLib::JoinType joinType = DefaultJoinType, double miterLimit = DefaultMiterLimit) { assert(delta > 0); return offset_ex(polygons, delta, joinType, miterLimit); } // Input polygons for shrinking shall be "normalized": There must be no overlap / intersections between the input polygons. @@ -342,6 +373,8 @@ inline Slic3r::Polygons shrink(const Slic3r::Polygons &polygons, const float d { assert(delta > 0); return offset(polygons, -delta, joinType, miterLimit); } inline Slic3r::ExPolygons shrink_ex(const Slic3r::Polygons &polygons, const float delta, ClipperLib::JoinType joinType = DefaultJoinType, double miterLimit = DefaultMiterLimit) { assert(delta > 0); return offset_ex(polygons, -delta, joinType, miterLimit); } +inline Slic3r::ExPolygons shrink_ex(const Slic3r::ExPolygons &polygons, const float delta, ClipperLib::JoinType joinType = DefaultJoinType, double miterLimit = DefaultMiterLimit) + { assert(delta > 0); return offset_ex(polygons, -delta, joinType, miterLimit); } // Wherever applicable, please use the opening() / closing() variants instead, they convey their purpose better. // Input polygons for negative offset shall be "normalized": There must be no overlap / intersections between the input polygons. @@ -383,6 +416,9 @@ Slic3r::Lines _clipper_ln(ClipperLib::ClipType clipType, const Slic3r::Lines &su Slic3r::Polygons diff(const Slic3r::Polygon &subject, const Slic3r::Polygon &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::Polygons diff(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::Polygons diff(const Slic3r::Polygons &subject, const Slic3r::ExPolygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); +// Optimized version clipping the "clipping" polygon using clip_clipper_polygon_with_subject_bbox(). +// To be used with complex clipping polygons, where majority of the clipping polygons are outside of the source polygon. +Slic3r::Polygons diff_clipped(const Slic3r::Polygons &src, const Slic3r::Polygons &clipping, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::Polygons diff(const Slic3r::ExPolygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::Polygons diff(const Slic3r::ExPolygons &subject, const Slic3r::ExPolygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::Polygons diff(const Slic3r::Surfaces &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); @@ -399,8 +435,11 @@ Slic3r::ExPolygons diff_ex(const Slic3r::Surfaces &subject, const Slic3r::ExPoly Slic3r::ExPolygons diff_ex(const Slic3r::ExPolygons &subject, const Slic3r::Surfaces &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::ExPolygons diff_ex(const Slic3r::Surfaces &subject, const Slic3r::Surfaces &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::ExPolygons diff_ex(const Slic3r::SurfacesPtr &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); +Slic3r::ExPolygons diff_ex(const Slic3r::SurfacesPtr &subject, const Slic3r::ExPolygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); +Slic3r::Polylines diff_pl(const Slic3r::Polyline &subject, const Slic3r::Polygons &clip); Slic3r::Polylines diff_pl(const Slic3r::Polylines &subject, const Slic3r::Polygons &clip); Slic3r::Polylines diff_pl(const Slic3r::Polyline &subject, const Slic3r::ExPolygon &clip); +Slic3r::Polylines diff_pl(const Slic3r::Polyline &subject, const Slic3r::ExPolygons &clip); Slic3r::Polylines diff_pl(const Slic3r::Polylines &subject, const Slic3r::ExPolygon &clip); Slic3r::Polylines diff_pl(const Slic3r::Polylines &subject, const Slic3r::ExPolygons &clip); Slic3r::Polylines diff_pl(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip); @@ -412,6 +451,7 @@ inline Slic3r::Lines diff_ln(const Slic3r::Lines &subject, const Slic3r::Polygon // Safety offset is applied to the clipping polygons only. Slic3r::Polygons intersection(const Slic3r::Polygon &subject, const Slic3r::Polygon &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); +Slic3r::Polygons intersection(const Slic3r::Polygons &subject, const Slic3r::ExPolygon &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::Polygons intersection(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::Polygons intersection(const Slic3r::ExPolygon &subject, const Slic3r::ExPolygon &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::Polygons intersection(const Slic3r::ExPolygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); @@ -428,7 +468,10 @@ Slic3r::ExPolygons intersection_ex(const Slic3r::Surfaces &subject, const Slic3r Slic3r::ExPolygons intersection_ex(const Slic3r::Surfaces &subject, const Slic3r::Surfaces &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::ExPolygons intersection_ex(const Slic3r::SurfacesPtr &subject, const Slic3r::ExPolygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::Polylines intersection_pl(const Slic3r::Polylines &subject, const Slic3r::Polygon &clip); +Slic3r::Polylines intersection_pl(const Slic3r::Polyline &subject, const Slic3r::ExPolygon &clip); +Slic3r::Polylines intersection_pl(const Slic3r::Polylines &subject, const Slic3r::ExPolygon &clip); Slic3r::Polylines intersection_pl(const Slic3r::Polyline &subject, const Slic3r::Polygons &clip); +Slic3r::Polylines intersection_pl(const Slic3r::Polyline &subject, const Slic3r::ExPolygons &clip); Slic3r::Polylines intersection_pl(const Slic3r::Polylines &subject, const Slic3r::Polygons &clip); Slic3r::Polylines intersection_pl(const Slic3r::Polylines &subject, const Slic3r::ExPolygons &clip); Slic3r::Polylines intersection_pl(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip); @@ -449,6 +492,7 @@ Slic3r::Polygons union_(const Slic3r::Polygons &subject); Slic3r::Polygons union_(const Slic3r::ExPolygons &subject); Slic3r::Polygons union_(const Slic3r::Polygons &subject, const ClipperLib::PolyFillType fillType); Slic3r::Polygons union_(const Slic3r::Polygons &subject, const Slic3r::Polygons &subject2); +Slic3r::Polygons union_(const Slic3r::Polygons &subject, const Slic3r::ExPolygon &subject2); // May be used to "heal" unusual models (3DLabPrints etc.) by providing fill_type (pftEvenOdd, pftNonZero, pftPositive, pftNegative). Slic3r::ExPolygons union_ex(const Slic3r::Polygons &subject, ClipperLib::PolyFillType fill_type = ClipperLib::pftNonZero); Slic3r::ExPolygons union_ex(const Slic3r::ExPolygons &subject); @@ -563,6 +607,6 @@ Polygons variable_offset_outer(const ExPolygon &expoly, const std::vector> &deltas, double miter_limit = 2.); ExPolygons variable_offset_inner_ex(const ExPolygon &expoly, const std::vector> &deltas, double miter_limit = 2.); -} +} // namespace Slic3r -#endif +#endif // slic3r_ClipperUtils_hpp_ diff --git a/src/libslic3r/ClipperZUtils.hpp b/src/libslic3r/ClipperZUtils.hpp new file mode 100644 index 00000000000..4ae78ae2356 --- /dev/null +++ b/src/libslic3r/ClipperZUtils.hpp @@ -0,0 +1,143 @@ +#ifndef slic3r_ClipperZUtils_hpp_ +#define slic3r_ClipperZUtils_hpp_ + +#include +#include + +#include +#include + +namespace Slic3r { + +namespace ClipperZUtils { + +using ZPoint = ClipperLib_Z::IntPoint; +using ZPoints = ClipperLib_Z::Path; +using ZPath = ClipperLib_Z::Path; +using ZPaths = ClipperLib_Z::Paths; + +inline bool zpoint_lower(const ZPoint &l, const ZPoint &r) +{ + return l.x() < r.x() || (l.x() == r.x() && (l.y() < r.y() || (l.y() == r.y() && l.z() < r.z()))); +} + +// Convert a single path to path with a given Z coordinate. +// If Open, then duplicate the first point at the end. +template +inline ZPath to_zpath(const Points &path, coord_t z) +{ + ZPath out; + if (! path.empty()) { + out.reserve((path.size() + Open) ? 1 : 0); + for (const Point &p : path) + out.emplace_back(p.x(), p.y(), z); + if (Open) + out.emplace_back(out.front()); + } + return out; +} + +// Convert multiple paths to paths with a given Z coordinate. +// If Open, then duplicate the first point of each path at its end. +template +inline ZPaths to_zpaths(const std::vector &paths, coord_t z) +{ + ZPaths out; + out.reserve(paths.size()); + for (const Points &path : paths) + out.emplace_back(to_zpath(path, z)); + return out; +} + +// Convert multiple expolygons into z-paths with Z specified by an index of the source expolygon +// offsetted by base_index. +// If Open, then duplicate the first point of each path at its end. +template +inline ZPaths expolygons_to_zpaths(const ExPolygons &src, coord_t &base_idx) +{ + ZPaths out; + out.reserve(std::accumulate(src.begin(), src.end(), size_t(0), + [](const size_t acc, const ExPolygon &expoly) { return acc + expoly.num_contours(); })); + for (const ExPolygon &expoly : src) { + out.emplace_back(to_zpath(expoly.contour.points, base_idx)); + for (const Polygon &hole : expoly.holes) + out.emplace_back(to_zpath(hole.points, base_idx)); + ++ base_idx; + } + return out; +} + +// Convert a single path to path with a given Z coordinate. +// If Open, then duplicate the first point at the end. +template +inline Points from_zpath(const ZPoints &path) +{ + Points out; + if (! path.empty()) { + out.reserve((path.size() + Open) ? 1 : 0); + for (const ZPoint &p : path) + out.emplace_back(p.x(), p.y()); + if (Open) + out.emplace_back(out.front()); + } + return out; +} + +// Convert multiple paths to paths with a given Z coordinate. +// If Open, then duplicate the first point of each path at its end. +template +inline void from_zpaths(const ZPaths &paths, std::vector &out) +{ + out.reserve(out.size() + paths.size()); + for (const ZPoints &path : paths) + out.emplace_back(from_zpath(path)); +} +template +inline std::vector from_zpaths(const ZPaths &paths) +{ + std::vector out; + from_zpaths(paths, out); + return out; +} + +class ClipperZIntersectionVisitor { +public: + using Intersection = std::pair; + using Intersections = std::vector; + ClipperZIntersectionVisitor(Intersections &intersections) : m_intersections(intersections) {} + void reset() { m_intersections.clear(); } + void operator()(const ZPoint &e1bot, const ZPoint &e1top, const ZPoint &e2bot, const ZPoint &e2top, ZPoint &pt) { + coord_t srcs[4]{ e1bot.z(), e1top.z(), e2bot.z(), e2top.z() }; + coord_t *begin = srcs; + coord_t *end = srcs + 4; + //FIXME bubble sort manually? + std::sort(begin, end); + end = std::unique(begin, end); + if (begin + 1 == end) { + // Self intersection may happen on source contour. Just copy the Z value. + pt.z() = *begin; + } else { + assert(begin + 2 == end); + if (begin + 2 <= end) { + // store a -1 based negative index into the "intersections" vector here. + m_intersections.emplace_back(srcs[0], srcs[1]); + pt.z() = -coord_t(m_intersections.size()); + } + } + } + ClipperLib_Z::ZFillCallback clipper_callback() { + return [this](const ZPoint &e1bot, const ZPoint &e1top, + const ZPoint &e2bot, const ZPoint &e2top, ZPoint &pt) + { return (*this)(e1bot, e1top, e2bot, e2top, pt); }; + } + + const std::vector>& intersections() const { return m_intersections; } + +private: + std::vector> &m_intersections; +}; + +} // namespace ClipperZUtils +} // namespace Slic3r + +#endif // slic3r_ClipperZUtils_hpp_ diff --git a/src/libslic3r/Color.cpp b/src/libslic3r/Color.cpp new file mode 100644 index 00000000000..6d8daa00adb --- /dev/null +++ b/src/libslic3r/Color.cpp @@ -0,0 +1,408 @@ +#include "libslic3r.h" +#include "Color.hpp" + +#include + +static const float INV_255 = 1.0f / 255.0f; + +namespace Slic3r { + +// Conversion from RGB to HSV color space +// The input RGB values are in the range [0, 1] +// The output HSV values are in the ranges h = [0, 360], and s, v = [0, 1] +static void RGBtoHSV(float r, float g, float b, float& h, float& s, float& v) +{ + assert(0.0f <= r && r <= 1.0f); + assert(0.0f <= g && g <= 1.0f); + assert(0.0f <= b && b <= 1.0f); + + const float max_comp = std::max(std::max(r, g), b); + const float min_comp = std::min(std::min(r, g), b); + const float delta = max_comp - min_comp; + + if (delta > 0.0f) { + if (max_comp == r) + h = 60.0f * (std::fmod(((g - b) / delta), 6.0f)); + else if (max_comp == g) + h = 60.0f * (((b - r) / delta) + 2.0f); + else if (max_comp == b) + h = 60.0f * (((r - g) / delta) + 4.0f); + + s = (max_comp > 0.0f) ? delta / max_comp : 0.0f; + } + else { + h = 0.0f; + s = 0.0f; + } + v = max_comp; + + while (h < 0.0f) { h += 360.0f; } + while (h > 360.0f) { h -= 360.0f; } + + assert(0.0f <= s && s <= 1.0f); + assert(0.0f <= v && v <= 1.0f); + assert(0.0f <= h && h <= 360.0f); +} + +// Conversion from HSV to RGB color space +// The input HSV values are in the ranges h = [0, 360], and s, v = [0, 1] +// The output RGB values are in the range [0, 1] +static void HSVtoRGB(float h, float s, float v, float& r, float& g, float& b) +{ + assert(0.0f <= s && s <= 1.0f); + assert(0.0f <= v && v <= 1.0f); + assert(0.0f <= h && h <= 360.0f); + + const float chroma = v * s; + const float h_prime = std::fmod(h / 60.0f, 6.0f); + const float x = chroma * (1.0f - std::abs(std::fmod(h_prime, 2.0f) - 1.0f)); + const float m = v - chroma; + + if (0.0f <= h_prime && h_prime < 1.0f) { + r = chroma; + g = x; + b = 0.0f; + } + else if (1.0f <= h_prime && h_prime < 2.0f) { + r = x; + g = chroma; + b = 0.0f; + } + else if (2.0f <= h_prime && h_prime < 3.0f) { + r = 0.0f; + g = chroma; + b = x; + } + else if (3.0f <= h_prime && h_prime < 4.0f) { + r = 0.0f; + g = x; + b = chroma; + } + else if (4.0f <= h_prime && h_prime < 5.0f) { + r = x; + g = 0.0f; + b = chroma; + } + else if (5.0f <= h_prime && h_prime < 6.0f) { + r = chroma; + g = 0.0f; + b = x; + } + else { + r = 0.0f; + g = 0.0f; + b = 0.0f; + } + + r += m; + g += m; + b += m; + + assert(0.0f <= r && r <= 1.0f); + assert(0.0f <= g && g <= 1.0f); + assert(0.0f <= b && b <= 1.0f); +} + +class Randomizer +{ + std::random_device m_rd; + +public: + float random_float(float min, float max) { + std::mt19937 rand_generator(m_rd()); + std::uniform_real_distribution distrib(min, max); + return distrib(rand_generator); + } +}; + +ColorRGB::ColorRGB(float r, float g, float b) +: m_data({ std::clamp(r, 0.0f, 1.0f), std::clamp(g, 0.0f, 1.0f), std::clamp(b, 0.0f, 1.0f) }) +{ +} + +ColorRGB::ColorRGB(unsigned char r, unsigned char g, unsigned char b) +: m_data({ std::clamp(r * INV_255, 0.0f, 1.0f), std::clamp(g * INV_255, 0.0f, 1.0f), std::clamp(b * INV_255, 0.0f, 1.0f) }) +{ +} + +bool ColorRGB::operator < (const ColorRGB& other) const +{ + for (size_t i = 0; i < 3; ++i) { + if (m_data[i] < other.m_data[i]) + return true; + else if (m_data[i] > other.m_data[i]) + return false; + } + + return false; +} + +bool ColorRGB::operator > (const ColorRGB& other) const +{ + for (size_t i = 0; i < 3; ++i) { + if (m_data[i] > other.m_data[i]) + return true; + else if (m_data[i] < other.m_data[i]) + return false; + } + + return false; +} + +ColorRGB ColorRGB::operator + (const ColorRGB& other) const +{ + ColorRGB ret; + for (size_t i = 0; i < 3; ++i) { + ret.m_data[i] = std::clamp(m_data[i] + other.m_data[i], 0.0f, 1.0f); + } + return ret; +} + +ColorRGB ColorRGB::operator * (float value) const +{ + assert(value >= 0.0f); + ColorRGB ret; + for (size_t i = 0; i < 3; ++i) { + ret.m_data[i] = std::clamp(value * m_data[i], 0.0f, 1.0f); + } + return ret; +} + +ColorRGBA::ColorRGBA(float r, float g, float b, float a) +: m_data({ std::clamp(r, 0.0f, 1.0f), std::clamp(g, 0.0f, 1.0f), std::clamp(b, 0.0f, 1.0f), std::clamp(a, 0.0f, 1.0f) }) +{ +} + +ColorRGBA::ColorRGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a) +: m_data({ std::clamp(r * INV_255, 0.0f, 1.0f), std::clamp(g * INV_255, 0.0f, 1.0f), std::clamp(b * INV_255, 0.0f, 1.0f), std::clamp(a * INV_255, 0.0f, 1.0f) }) +{ +} + +bool ColorRGBA::operator < (const ColorRGBA& other) const +{ + for (size_t i = 0; i < 3; ++i) { + if (m_data[i] < other.m_data[i]) + return true; + else if (m_data[i] > other.m_data[i]) + return false; + } + + return false; +} + +bool ColorRGBA::operator > (const ColorRGBA& other) const +{ + for (size_t i = 0; i < 3; ++i) { + if (m_data[i] > other.m_data[i]) + return true; + else if (m_data[i] < other.m_data[i]) + return false; + } + + return false; +} + +ColorRGBA ColorRGBA::operator + (const ColorRGBA& other) const +{ + ColorRGBA ret; + for (size_t i = 0; i < 3; ++i) { + ret.m_data[i] = std::clamp(m_data[i] + other.m_data[i], 0.0f, 1.0f); + } + return ret; +} + +ColorRGBA ColorRGBA::operator * (float value) const +{ + assert(value >= 0.0f); + ColorRGBA ret; + for (size_t i = 0; i < 3; ++i) { + ret.m_data[i] = std::clamp(value * m_data[i], 0.0f, 1.0f); + } + ret.m_data[3] = m_data[3]; + return ret; +} + +ColorRGB operator * (float value, const ColorRGB& other) { return other * value; } +ColorRGBA operator * (float value, const ColorRGBA& other) { return other * value; } + +ColorRGB lerp(const ColorRGB& a, const ColorRGB& b, float t) +{ + assert(0.0f <= t && t <= 1.0f); + return (1.0f - t) * a + t * b; +} + +ColorRGBA lerp(const ColorRGBA& a, const ColorRGBA& b, float t) +{ + assert(0.0f <= t && t <= 1.0f); + return (1.0f - t) * a + t * b; +} + +ColorRGB complementary(const ColorRGB& color) +{ + return { 1.0f - color.r(), 1.0f - color.g(), 1.0f - color.b() }; +} + +ColorRGBA complementary(const ColorRGBA& color) +{ + return { 1.0f - color.r(), 1.0f - color.g(), 1.0f - color.b(), color.a() }; +} + +ColorRGB saturate(const ColorRGB& color, float factor) +{ + float h, s, v; + RGBtoHSV(color.r(), color.g(), color.b(), h, s, v); + s = std::clamp(s * factor, 0.0f, 1.0f); + float r, g, b; + HSVtoRGB(h, s, v, r, g, b); + return { r, g, b }; +} + +ColorRGBA saturate(const ColorRGBA& color, float factor) +{ + return to_rgba(saturate(to_rgb(color), factor), color.a()); +} + +ColorRGB opposite(const ColorRGB& color) +{ + float h, s, v; + RGBtoHSV(color.r(), color.g(), color.b(), h, s, v); + + h += 65.0f; // 65 instead 60 to avoid circle values + if (h > 360.0f) + h -= 360.0f; + + Randomizer rnd; + s = rnd.random_float(0.65f, 1.0f); + v = rnd.random_float(0.65f, 1.0f); + + float r, g, b; + HSVtoRGB(h, s, v, r, g, b); + return { r, g, b }; +} + +ColorRGB opposite(const ColorRGB& a, const ColorRGB& b) +{ + float ha, sa, va; + RGBtoHSV(a.r(), a.g(), a.b(), ha, sa, va); + float hb, sb, vb; + RGBtoHSV(b.r(), b.g(), b.b(), hb, sb, vb); + + float delta_h = std::abs(ha - hb); + float start_h = (delta_h > 180.0f) ? std::min(ha, hb) : std::max(ha, hb); + + start_h += 5.0f; // to avoid circle change of colors for 120 deg + if (delta_h < 180.0f) + delta_h = 360.0f - delta_h; + + Randomizer rnd; + float out_h = start_h + 0.5f * delta_h; + if (out_h > 360.0f) + out_h -= 360.0f; + float out_s = rnd.random_float(0.65f, 1.0f); + float out_v = rnd.random_float(0.65f, 1.0f); + + float out_r, out_g, out_b; + HSVtoRGB(out_h, out_s, out_v, out_r, out_g, out_b); + return { out_r, out_g, out_b }; +} + +bool can_decode_color(const std::string& color) { return color.size() == 7 && color.front() == '#'; } + +bool decode_color(const std::string& color_in, ColorRGB& color_out) +{ + auto hex_digit_to_int = [](const char c) { + return + (c >= '0' && c <= '9') ? int(c - '0') : + (c >= 'A' && c <= 'F') ? int(c - 'A') + 10 : + (c >= 'a' && c <= 'f') ? int(c - 'a') + 10 : -1; + }; + + color_out = ColorRGB::BLACK(); + if (can_decode_color(color_in)) { + const char* c = color_in.data() + 1; + for (unsigned int i = 0; i < 3; ++i) { + const int digit1 = hex_digit_to_int(*c++); + const int digit2 = hex_digit_to_int(*c++); + if (digit1 != -1 && digit2 != -1) + color_out.set(i, float(digit1 * 16 + digit2) * INV_255); + } + } + else + return false; + + assert(0.0f <= color_out.r() && color_out.r() <= 1.0f); + assert(0.0f <= color_out.g() && color_out.g() <= 1.0f); + assert(0.0f <= color_out.b() && color_out.b() <= 1.0f); + return true; +} + +bool decode_color(const std::string& color_in, ColorRGBA& color_out) +{ + ColorRGB rgb; + if (!decode_color(color_in, rgb)) + return false; + + color_out = to_rgba(rgb, color_out.a()); + return true; +} + +bool decode_colors(const std::vector& colors_in, std::vector& colors_out) +{ + colors_out = std::vector(colors_in.size(), ColorRGB::BLACK()); + for (size_t i = 0; i < colors_in.size(); ++i) { + if (!decode_color(colors_in[i], colors_out[i])) + return false; + } + return true; +} + +bool decode_colors(const std::vector& colors_in, std::vector& colors_out) +{ + colors_out = std::vector(colors_in.size(), ColorRGBA::BLACK()); + for (size_t i = 0; i < colors_in.size(); ++i) { + if (!decode_color(colors_in[i], colors_out[i])) + return false; + } + return true; +} + +std::string encode_color(const ColorRGB& color) +{ + char buffer[64]; + ::sprintf(buffer, "#%02X%02X%02X", color.r_uchar(), color.g_uchar(), color.b_uchar()); + return std::string(buffer); +} + +std::string encode_color(const ColorRGBA& color) { return encode_color(to_rgb(color)); } + +ColorRGB to_rgb(const ColorRGBA& other_rgba) { return { other_rgba.r(), other_rgba.g(), other_rgba.b() }; } +ColorRGBA to_rgba(const ColorRGB& other_rgb) { return { other_rgb.r(), other_rgb.g(), other_rgb.b(), 1.0f }; } +ColorRGBA to_rgba(const ColorRGB& other_rgb, float alpha) { return { other_rgb.r(), other_rgb.g(), other_rgb.b(), alpha }; } + +ColorRGBA picking_decode(unsigned int id) +{ + return { + float((id >> 0) & 0xff) * INV_255, // red + float((id >> 8) & 0xff) * INV_255, // green + float((id >> 16) & 0xff) * INV_255, // blue + float(picking_checksum_alpha_channel(id & 0xff, (id >> 8) & 0xff, (id >> 16) & 0xff)) * INV_255 // checksum for validating against unwanted alpha blending and multi sampling + }; +} + +unsigned int picking_encode(unsigned char r, unsigned char g, unsigned char b) { return r + (g << 8) + (b << 16); } + +unsigned char picking_checksum_alpha_channel(unsigned char red, unsigned char green, unsigned char blue) +{ + // 8 bit hash for the color + unsigned char b = ((((37 * red) + green) & 0x0ff) * 37 + blue) & 0x0ff; + // Increase enthropy by a bit reversal + b = (b & 0xF0) >> 4 | (b & 0x0F) << 4; + b = (b & 0xCC) >> 2 | (b & 0x33) << 2; + b = (b & 0xAA) >> 1 | (b & 0x55) << 1; + // Flip every second bit to increase the enthropy even more. + b ^= 0x55; + return b; +} + +} // namespace Slic3r + diff --git a/src/libslic3r/Color.hpp b/src/libslic3r/Color.hpp new file mode 100644 index 00000000000..8044a0318e8 --- /dev/null +++ b/src/libslic3r/Color.hpp @@ -0,0 +1,192 @@ +#ifndef slic3r_Color_hpp_ +#define slic3r_Color_hpp_ + +#include +#include + +#include "Point.hpp" + +namespace Slic3r { + +class ColorRGB +{ + std::array m_data{1.0f, 1.0f, 1.0f}; + +public: + ColorRGB() = default; + ColorRGB(float r, float g, float b); + ColorRGB(unsigned char r, unsigned char g, unsigned char b); + ColorRGB(const ColorRGB& other) = default; + + ColorRGB& operator = (const ColorRGB& other) { m_data = other.m_data; return *this; } + + bool operator == (const ColorRGB& other) const { return m_data == other.m_data; } + bool operator != (const ColorRGB& other) const { return !operator==(other); } + bool operator < (const ColorRGB& other) const; + bool operator > (const ColorRGB& other) const; + + ColorRGB operator + (const ColorRGB& other) const; + ColorRGB operator * (float value) const; + + const float* const data() const { return m_data.data(); } + + float r() const { return m_data[0]; } + float g() const { return m_data[1]; } + float b() const { return m_data[2]; } + + void r(float r) { m_data[0] = std::clamp(r, 0.0f, 1.0f); } + void g(float g) { m_data[1] = std::clamp(g, 0.0f, 1.0f); } + void b(float b) { m_data[2] = std::clamp(b, 0.0f, 1.0f); } + + void set(unsigned int comp, float value) { + assert(0 <= comp && comp <= 2); + m_data[comp] = std::clamp(value, 0.0f, 1.0f); + } + + unsigned char r_uchar() const { return static_cast(m_data[0] * 255.0f); } + unsigned char g_uchar() const { return static_cast(m_data[1] * 255.0f); } + unsigned char b_uchar() const { return static_cast(m_data[2] * 255.0f); } + + static const ColorRGB BLACK() { return { 0.0f, 0.0f, 0.0f }; } + static const ColorRGB BLUE() { return { 0.0f, 0.0f, 1.0f }; } + static const ColorRGB BLUEISH() { return { 0.5f, 0.5f, 1.0f }; } + static const ColorRGB CYAN() { return { 0.0f, 1.0f, 1.0f }; } + static const ColorRGB DARK_GRAY() { return { 0.25f, 0.25f, 0.25f }; } + static const ColorRGB DARK_YELLOW() { return { 0.5f, 0.5f, 0.0f }; } + static const ColorRGB GRAY() { return { 0.5f, 0.5f, 0.5f }; } + static const ColorRGB GREEN() { return { 0.0f, 1.0f, 0.0f }; } + static const ColorRGB GREENISH() { return { 0.5f, 1.0f, 0.5f }; } + static const ColorRGB LIGHT_GRAY() { return { 0.75f, 0.75f, 0.75f }; } + static const ColorRGB MAGENTA() { return { 1.0f, 0.0f, 1.0f }; } + static const ColorRGB ORANGE() { return { 0.92f, 0.50f, 0.26f }; } + static const ColorRGB RED() { return { 1.0f, 0.0f, 0.0f }; } + static const ColorRGB REDISH() { return { 1.0f, 0.5f, 0.5f }; } + static const ColorRGB YELLOW() { return { 1.0f, 1.0f, 0.0f }; } + static const ColorRGB WHITE() { return { 1.0f, 1.0f, 1.0f }; } + + static const ColorRGB X() { return { 0.75f, 0.0f, 0.0f }; } + static const ColorRGB Y() { return { 0.0f, 0.75f, 0.0f }; } + static const ColorRGB Z() { return { 0.0f, 0.0f, 0.75f }; } +}; + +class ColorRGBA +{ + std::array m_data{ 1.0f, 1.0f, 1.0f, 1.0f }; + +public: + ColorRGBA() = default; + ColorRGBA(float r, float g, float b, float a); + ColorRGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a); + ColorRGBA(const ColorRGBA& other) = default; + + ColorRGBA& operator = (const ColorRGBA& other) { m_data = other.m_data; return *this; } + + bool operator == (const ColorRGBA& other) const { return m_data == other.m_data; } + bool operator != (const ColorRGBA& other) const { return !operator==(other); } + bool operator < (const ColorRGBA& other) const; + bool operator > (const ColorRGBA& other) const; + + ColorRGBA operator + (const ColorRGBA& other) const; + ColorRGBA operator * (float value) const; + + const float* const data() const { return m_data.data(); } + + float r() const { return m_data[0]; } + float g() const { return m_data[1]; } + float b() const { return m_data[2]; } + float a() const { return m_data[3]; } + + void r(float r) { m_data[0] = std::clamp(r, 0.0f, 1.0f); } + void g(float g) { m_data[1] = std::clamp(g, 0.0f, 1.0f); } + void b(float b) { m_data[2] = std::clamp(b, 0.0f, 1.0f); } + void a(float a) { m_data[3] = std::clamp(a, 0.0f, 1.0f); } + + void set(unsigned int comp, float value) { + assert(0 <= comp && comp <= 3); + m_data[comp] = std::clamp(value, 0.0f, 1.0f); + } + + unsigned char r_uchar() const { return static_cast(m_data[0] * 255.0f); } + unsigned char g_uchar() const { return static_cast(m_data[1] * 255.0f); } + unsigned char b_uchar() const { return static_cast(m_data[2] * 255.0f); } + unsigned char a_uchar() const { return static_cast(m_data[3] * 255.0f); } + + bool is_transparent() const { return m_data[3] < 1.0f; } + + static const ColorRGBA BLACK() { return { 0.0f, 0.0f, 0.0f, 1.0f }; } + static const ColorRGBA BLUE() { return { 0.0f, 0.0f, 1.0f, 1.0f }; } + static const ColorRGBA BLUEISH() { return { 0.5f, 0.5f, 1.0f, 1.0f }; } + static const ColorRGBA CYAN() { return { 0.0f, 1.0f, 1.0f, 1.0f }; } + static const ColorRGBA DARK_GRAY() { return { 0.25f, 0.25f, 0.25f, 1.0f }; } + static const ColorRGBA DARK_YELLOW() { return { 0.5f, 0.5f, 0.0f, 1.0f }; } + static const ColorRGBA GRAY() { return { 0.5f, 0.5f, 0.5f, 1.0f }; } + static const ColorRGBA GREEN() { return { 0.0f, 1.0f, 0.0f, 1.0f }; } + static const ColorRGBA GREENISH() { return { 0.5f, 1.0f, 0.5f, 1.0f }; } + static const ColorRGBA LIGHT_GRAY() { return { 0.75f, 0.75f, 0.75f, 1.0f }; } + static const ColorRGBA MAGENTA() { return { 1.0f, 0.0f, 1.0f, 1.0f }; } + static const ColorRGBA ORANGE() { return { 0.923f, 0.504f, 0.264f, 1.0f }; } + static const ColorRGBA RED() { return { 1.0f, 0.0f, 0.0f, 1.0f }; } + static const ColorRGBA REDISH() { return { 1.0f, 0.5f, 0.5f, 1.0f }; } + static const ColorRGBA YELLOW() { return { 1.0f, 1.0f, 0.0f, 1.0f }; } + static const ColorRGBA WHITE() { return { 1.0f, 1.0f, 1.0f, 1.0f }; } + + static const ColorRGBA X() { return { 0.75f, 0.0f, 0.0f, 1.0f }; } + static const ColorRGBA Y() { return { 0.0f, 0.75f, 0.0f, 1.0f }; } + static const ColorRGBA Z() { return { 0.0f, 0.0f, 0.75f, 1.0f }; } +}; + +ColorRGB operator * (float value, const ColorRGB& other); +ColorRGBA operator * (float value, const ColorRGBA& other); + +ColorRGB lerp(const ColorRGB& a, const ColorRGB& b, float t); +ColorRGBA lerp(const ColorRGBA& a, const ColorRGBA& b, float t); + +ColorRGB complementary(const ColorRGB& color); +ColorRGBA complementary(const ColorRGBA& color); + +ColorRGB saturate(const ColorRGB& color, float factor); +ColorRGBA saturate(const ColorRGBA& color, float factor); + +ColorRGB opposite(const ColorRGB& color); +ColorRGB opposite(const ColorRGB& a, const ColorRGB& b); + +bool can_decode_color(const std::string& color); + +bool decode_color(const std::string& color_in, ColorRGB& color_out); +bool decode_color(const std::string& color_in, ColorRGBA& color_out); + +bool decode_colors(const std::vector& colors_in, std::vector& colors_out); +bool decode_colors(const std::vector& colors_in, std::vector& colors_out); + +std::string encode_color(const ColorRGB& color); +std::string encode_color(const ColorRGBA& color); + +ColorRGB to_rgb(const ColorRGBA& other_rgba); +ColorRGBA to_rgba(const ColorRGB& other_rgb); +ColorRGBA to_rgba(const ColorRGB& other_rgb, float alpha); + +// Color mapping of a value into RGB false colors. +inline Vec3f value_to_rgbf(float minimum, float maximum, float value) +{ + float ratio = 2.0f * (value - minimum) / (maximum - minimum); + float b = std::max(0.0f, (1.0f - ratio)); + float r = std::max(0.0f, (ratio - 1.0f)); + float g = 1.0f - b - r; + return Vec3f { r, g, b }; +} + +// Color mapping of a value into RGB false colors. +inline Vec3i value_to_rgbi(float minimum, float maximum, float value) +{ + return (value_to_rgbf(minimum, maximum, value) * 255).cast(); +} + +ColorRGBA picking_decode(unsigned int id); +unsigned int picking_encode(unsigned char r, unsigned char g, unsigned char b); +// Produce an alpha channel checksum for the red green blue components. The alpha channel may then be used to verify, whether the rgb components +// were not interpolated by alpha blending or multi sampling. +unsigned char picking_checksum_alpha_channel(unsigned char red, unsigned char green, unsigned char blue); + +} // namespace Slic3r + +#endif /* slic3r_Color_hpp_ */ diff --git a/src/libslic3r/Config.cpp b/src/libslic3r/Config.cpp index e04dd9d7ecc..51870e93d72 100644 --- a/src/libslic3r/Config.cpp +++ b/src/libslic3r/Config.cpp @@ -268,7 +268,7 @@ ConfigOption* ConfigOptionDef::create_empty_option() const // case coPoint3s: return new ConfigOptionPoint3s(); case coBool: return new ConfigOptionBool(); case coBools: return new ConfigOptionBools(); - case coEnum: return new ConfigOptionEnumGeneric(this->enum_keys_map); + case coEnum: return new ConfigOptionEnumGeneric(this->enum_def->m_enum_keys_map); default: throw ConfigurationError(std::string("Unknown option type for option ") + this->label); } } @@ -279,7 +279,7 @@ ConfigOption* ConfigOptionDef::create_default_option() const if (this->default_value) return (this->default_value->type() == coEnum) ? // Special case: For a DynamicConfig, convert a templated enum to a generic enum. - new ConfigOptionEnumGeneric(this->enum_keys_map, this->default_value->getInt()) : + new ConfigOptionEnumGeneric(this->enum_def->m_enum_keys_map, this->default_value->getInt()) : this->default_value->clone(); return this->create_empty_option(); } @@ -303,10 +303,35 @@ ConfigOptionDef* ConfigDef::add_nullable(const t_config_option_key &opt_key, Con return def; } +void ConfigDef::finalize() +{ + // Validate & finalize open & closed enums. + for (std::pair &kvp : options) { + ConfigOptionDef& def = kvp.second; + if (def.type == coEnum) { + assert(def.enum_def); + assert(def.enum_def->is_valid_closed_enum()); + assert(def.gui_type != ConfigOptionDef::GUIType::i_enum_open && + def.gui_type != ConfigOptionDef::GUIType::f_enum_open && + def.gui_type != ConfigOptionDef::GUIType::select_open); + def.enum_def->finalize_closed_enum(); + } else if (def.gui_type == ConfigOptionDef::GUIType::i_enum_open || def.gui_type == ConfigOptionDef::GUIType::f_enum_open || + def.gui_type == ConfigOptionDef::GUIType::select_open) { + assert(def.enum_def); + assert(def.enum_def->is_valid_open_enum()); + assert(def.gui_type != ConfigOptionDef::GUIType::i_enum_open || def.type == coInt || def.type == coInts); + assert(def.gui_type != ConfigOptionDef::GUIType::f_enum_open || def.type == coFloat || def.type == coPercent || def.type == coFloatOrPercent); + assert(def.gui_type != ConfigOptionDef::GUIType::select_open || def.type == coString || def.type == coStrings); + } else { + assert(! def.enum_def); + } + } +} + std::ostream& ConfigDef::print_cli_help(std::ostream& out, bool show_defaults, std::function filter) const { // prepare a function for wrapping text - auto wrap = [](std::string text, size_t line_length) -> std::string { + auto wrap = [](const std::string& text, size_t line_length) -> std::string { std::istringstream words(text); std::ostringstream wrapped; std::string word; @@ -335,7 +360,7 @@ std::ostream& ConfigDef::print_cli_help(std::ostream& out, bool show_defaults, s categories.insert(def.category); } - for (auto category : categories) { + for (const std::string& category : categories) { if (category != "") { out << category << ":" << std::endl; } else if (categories.size() > 1) { @@ -378,8 +403,8 @@ std::ostream& ConfigDef::print_cli_help(std::ostream& out, bool show_defaults, s descr += " ("; if (!def.sidetext.empty()) { descr += def.sidetext + ", "; - } else if (!def.enum_values.empty()) { - descr += boost::algorithm::join(def.enum_values, ", ") + "; "; + } else if (def.enum_def->has_values()) { + descr += boost::algorithm::join(def.enum_def->values(), ", ") + "; "; } descr += "default: " + def.default_value->serialize() + ")"; } @@ -402,6 +427,42 @@ std::ostream& ConfigDef::print_cli_help(std::ostream& out, bool show_defaults, s return out; } +std::string ConfigBase::SetDeserializeItem::format(std::initializer_list values) +{ + std::string out; + int i = 0; + for (int v : values) { + if (i ++ > 0) + out += ", "; + out += std::to_string(v); + } + return out; +} + +std::string ConfigBase::SetDeserializeItem::format(std::initializer_list values) +{ + std::string out; + int i = 0; + for (float v : values) { + if (i ++ > 0) + out += ", "; + out += float_to_string_decimal_point(double(v)); + } + return out; +} + +std::string ConfigBase::SetDeserializeItem::format(std::initializer_list values) +{ + std::string out; + int i = 0; + for (float v : values) { + if (i ++ > 0) + out += ", "; + out += float_to_string_decimal_point(v); + } + return out; +} + void ConfigBase::apply_only(const ConfigBase &other, const t_config_option_keys &keys, bool ignore_nonexistent) { // loop through options and apply them @@ -1106,7 +1167,7 @@ bool DynamicConfig::read_cli(int argc, const char* const argv[], t_config_option } const t_config_option_key &opt_key = it->second; - const ConfigOptionDef &optdef = this->def()->options.at(opt_key); + const ConfigOptionDef &optdef = *this->option_def(opt_key); // If the option type expects a value and it was not already provided, // look for it in the next token. diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp index a087dd85407..538580d5067 100644 --- a/src/libslic3r/Config.hpp +++ b/src/libslic3r/Config.hpp @@ -10,7 +10,10 @@ #include #include #include +#include +#include #include +#include #include "libslic3r.h" #include "clonable_ptr.hpp" #include "Exception.hpp" @@ -224,6 +227,7 @@ enum ForwardCompatibilitySubstitutionRule EnableSilentDisableSystem, }; +class ConfigDef; class ConfigOption; class ConfigOptionDef; // For forward definition of ConfigOption in ConfigOptionUniquePtr, we have to define a custom deleter. @@ -299,7 +303,7 @@ template class ConfigOptionSingle : public ConfigOption { public: T value; - explicit ConfigOptionSingle(T value) : value(value) {} + explicit ConfigOptionSingle(T value) : value(std::move(value)) {} operator T() const { return this->value; } void set(const ConfigOption *rhs) override @@ -613,7 +617,7 @@ class ConfigOptionFloatsTempl : public ConfigOptionVector static double nil_value() { return std::numeric_limits::quiet_NaN(); } // A scalar is nil, or all values of a vector are nil. bool is_nil() const override { for (auto v : this->values) if (! std::isnan(v)) return false; return true; } - bool is_nil(size_t idx) const override { return std::isnan(this->values[idx]); } + bool is_nil(size_t idx) const override { return std::isnan(this->values[idx < values.size() ? idx : 0]); } std::string serialize() const override { @@ -774,7 +778,7 @@ class ConfigOptionIntsTempl : public ConfigOptionVector static int nil_value() { return std::numeric_limits::max(); } // A scalar is nil, or all values of a vector are nil. bool is_nil() const override { for (auto v : this->values) if (v != nil_value()) return false; return true; } - bool is_nil(size_t idx) const override { return this->values[idx] == nil_value(); } + bool is_nil(size_t idx) const override { return values[idx < this->values.size() ? idx : 0] == nil_value(); } std::string serialize() const override { @@ -843,9 +847,9 @@ using ConfigOptionIntsNullable = ConfigOptionIntsTempl; class ConfigOptionString : public ConfigOptionSingle { public: - ConfigOptionString() : ConfigOptionSingle("") {} - explicit ConfigOptionString(const std::string &value) : ConfigOptionSingle(value) {} - + ConfigOptionString() : ConfigOptionSingle(std::string{}) {} + explicit ConfigOptionString(std::string value) : ConfigOptionSingle(std::move(value)) {} + static ConfigOptionType static_type() { return coString; } ConfigOptionType type() const override { return static_type(); } ConfigOption* clone() const override { return new ConfigOptionString(*this); } @@ -1090,7 +1094,7 @@ class ConfigOptionFloatsOrPercentsTempl : public ConfigOptionVector::quiet_NaN(), false }; } // A scalar is nil, or all values of a vector are nil. bool is_nil() const override { for (auto v : this->values) if (! std::isnan(v.value)) return false; return true; } - bool is_nil(size_t idx) const override { return std::isnan(this->values[idx].value); } + bool is_nil(size_t idx) const override { return std::isnan(this->values[idx < values.size() ? idx : 0].value); } std::string serialize() const override { @@ -1402,7 +1406,7 @@ class ConfigOptionBoolsTempl : public ConfigOptionVector static unsigned char nil_value() { return std::numeric_limits::max(); } // A scalar is nil, or all values of a vector are nil. bool is_nil() const override { for (auto v : this->values) if (v != nil_value()) return false; return true; } - bool is_nil(size_t idx) const override { return this->values[idx] == nil_value(); } + bool is_nil(size_t idx) const override { return this->values[idx < values.size() ? idx : 0] == nil_value(); } bool& get_at(size_t i) { assert(! this->values.empty()); @@ -1545,7 +1549,7 @@ class ConfigOptionEnum : public ConfigOptionSingle return false; } - // Map from an enum name to an enum integer value. + // Map from an enum integer value to name. static const t_config_enum_names& get_enum_names(); // Map from an enum name to an enum integer value. static const t_config_enum_values& get_enum_values(); @@ -1617,6 +1621,177 @@ class ConfigOptionEnumGeneric : public ConfigOptionInt template void serialize(Archive& ar) { ar(cereal::base_class(this)); } }; +// Definition of values / labels for a combo box. +// Mostly used for closed enums (when type == coEnum), but may be used for +// open enums with ints resp. floats, if gui_type is set to GUIType::i_enum_open" resp. GUIType::f_enum_open. +class ConfigOptionEnumDef { +public: + bool has_values() const { return ! m_values.empty(); } + bool has_labels() const { return ! m_labels.empty(); } + const std::vector& values() const { return m_values; } + const std::string& value(int idx) const { return m_values[idx]; } + // Used for open enums (gui_type is set to GUIType::i_enum_open" resp. GUIType::f_enum_open). + // If values not defined, use labels. + const std::vector& enums() const { + assert(this->is_valid_open_enum()); + return this->has_values() ? m_values : m_labels; + } + // Used for closed enums. If labels are not defined, use values instead. + const std::vector& labels() const { return this->has_labels() ? m_labels : m_values; } + const std::string& label(int idx) const { return this->labels()[idx]; } + + // Look up a closed enum value of this combo box based on an index of the combo box value / label. + // Such a mapping should always succeed. + int index_to_enum(int index) const { + // It has to be a closed enum, thus values have to be defined. + assert(this->is_valid_closed_enum()); + assert(index >= 0 && index < int(m_values.size())); + if (m_values_ordinary) + return index; + else { + auto it = m_enum_keys_map->find(m_values[index]); + assert(it != m_enum_keys_map->end()); + return it->second; + } + } + + // Look up an index of value / label of this combo box based on enum value. + // Such a mapping may fail, thus an optional is returned. + std::optional enum_to_index(int enum_val) const { + assert(this->is_valid_closed_enum()); + assert(enum_val >= 0 && enum_val < int(m_enum_names->size())); + if (m_values_ordinary) + return { enum_val }; + else { + auto it = std::find(m_values.begin(), m_values.end(), (*m_enum_names)[enum_val]); + return it == m_values.end() ? std::optional{} : std::optional{ int(it - m_values.begin()) }; + } + } + + // Look up an index of value / label of this combo box based on value string. + std::optional value_to_index(const std::string &value) const { + assert(this->is_valid_open_enum() || this->is_valid_closed_enum()); + auto it = std::find(m_values.begin(), m_values.end(), value); + return it == m_values.end() ? + std::optional{} : std::optional{ it - m_values.begin() }; + } + + // Look up an index of label of this combo box. Used for open enums. + std::optional label_to_index(const std::string &value) const { + assert(is_valid_open_enum()); + const auto &ls = this->labels(); + auto it = std::find(ls.begin(), ls.end(), value); + return it == ls.end() ? + std::optional{} : std::optional{ it - ls.begin() }; + } + + std::optional> enum_to_value(int enum_val) const { + assert(this->is_valid_closed_enum()); + auto opt = this->enum_to_index(enum_val); + return opt.has_value() ? + std::optional>{ this->value(*opt) } : + std::optional>{}; + } + + std::optional> enum_to_label(int enum_val) const { + assert(this->is_valid_closed_enum()); + auto opt = this->enum_to_index(enum_val); + return opt.has_value() ? + std::optional>{ this->label(*opt) } : + std::optional>{}; + } + +#ifndef NDEBUG + bool is_valid_closed_enum() const { + return m_enum_names != nullptr && m_enum_keys_map != nullptr && + ! m_values.empty() && (m_labels.empty() || m_values.size() == m_labels.size()); + } + bool is_valid_open_enum() const { + return m_enum_names == nullptr && m_enum_keys_map == nullptr && + (! m_values.empty() || ! m_labels.empty()) && (m_values.empty() || m_labels.empty() || m_values.size() == m_labels.size()); + } +#endif // NDEBUG + + void clear() { + m_values_ordinary = false; + m_enum_names = nullptr; + m_enum_keys_map = nullptr; + m_values.clear(); + m_labels.clear(); + } + + ConfigOptionEnumDef* clone() const { return new ConfigOptionEnumDef{ *this }; } + +private: + friend ConfigDef; + friend ConfigOptionDef; + + // Only allow ConfigOptionEnumDef() to be created from ConfigOptionDef. + ConfigOptionEnumDef() = default; + + void set_values(const std::vector &v) { + m_values = v; + assert(m_labels.empty() || m_labels.size() == m_values.size()); + } + void set_values(const std::initializer_list il) { + m_values.clear(); + m_values.reserve(il.size()); + for (const std::string_view& p : il) + m_values.emplace_back(p); + assert(m_labels.empty() || m_labels.size() == m_values.size()); + } + void set_values(const std::initializer_list> il) { + m_values.clear(); + m_values.reserve(il.size()); + m_labels.clear(); + m_labels.reserve(il.size()); + for (const std::pair& p : il) { + m_values.emplace_back(p.first); + m_labels.emplace_back(p.second); + } + } + void set_labels(const std::initializer_list il) { + m_labels.clear(); + m_labels.reserve(il.size()); + for (const std::string_view& p : il) + m_labels.emplace_back(p); + assert(m_values.empty() || m_labels.size() == m_values.size()); + } + void finalize_closed_enum() { + assert(this->is_valid_closed_enum()); + // Check whether def.enum_values contains all the values of def.enum_keys_map and + // that they are sorted by their ordinary values. + m_values_ordinary = true; + for (const auto& [enum_name, enum_int] : *m_enum_keys_map) { + assert(enum_int >= 0); + if (enum_int >= int(this->values().size()) || this->value(enum_int) != enum_name) { + m_values_ordinary = false; + break; + } + } + } + + std::vector m_values; + std::vector m_labels; + // If true, then enum_values are sorted and they contain all the values, thus the UI element ordinary + // to enum value could be converted directly. + bool m_values_ordinary { false }; + + template + void set_enum_map() + { + m_enum_names = &ConfigOptionEnum::get_enum_names(); + m_enum_keys_map = &ConfigOptionEnum::get_enum_values(); + } + + // For enums (when type == coEnum). Maps enums to enum names. + // Initialized by ConfigOptionEnum::get_enum_names() + const t_config_enum_names* m_enum_names{ nullptr }; + // For enums (when type == coEnum). Maps enum_values to enums. + // Initialized by ConfigOptionEnum::get_enum_values() + const t_config_enum_values* m_enum_keys_map{ nullptr }; +}; + // Definition of a configuration value for the purpose of GUI presentation, editing, value mapping and config file handling. class ConfigOptionDef { @@ -1627,16 +1802,18 @@ class ConfigOptionDef i_enum_open, // Open enums, float value could be one of the enumerated values or something else. f_enum_open, + // Open enums, string value could be one of the enumerated values or something else. + select_open, // Color picker, string value. color, - // ??? - select_open, // Currently unused. slider, // Static text legend, // Vector value, but edited as a single string. one_string, + // Close parameter, string value could be one of the list values. + select_close, }; // Identifier of this option. It is stored here so that it is accessible through the by_serialization_key_ordinal map. @@ -1675,12 +1852,13 @@ class ConfigOptionDef case coPercent: { auto opt = new ConfigOptionPercent(); archive(*opt); return opt; } case coPercents: { auto opt = new ConfigOptionPercents(); archive(*opt); return opt; } case coFloatOrPercent: { auto opt = new ConfigOptionFloatOrPercent(); archive(*opt); return opt; } + case coFloatsOrPercents:{ auto opt = new ConfigOptionFloatsOrPercents();archive(*opt); return opt; } case coPoint: { auto opt = new ConfigOptionPoint(); archive(*opt); return opt; } case coPoints: { auto opt = new ConfigOptionPoints(); archive(*opt); return opt; } case coPoint3: { auto opt = new ConfigOptionPoint3(); archive(*opt); return opt; } case coBool: { auto opt = new ConfigOptionBool(); archive(*opt); return opt; } case coBools: { auto opt = new ConfigOptionBools(); archive(*opt); return opt; } - case coEnum: { auto opt = new ConfigOptionEnumGeneric(this->enum_keys_map); archive(*opt); return opt; } + case coEnum: { auto opt = new ConfigOptionEnumGeneric(this->enum_def->m_enum_keys_map); archive(*opt); return opt; } default: throw ConfigurationError(std::string("ConfigOptionDef::load_option_from_archive(): Unknown option type for option ") + this->opt_key); } } @@ -1706,6 +1884,7 @@ class ConfigOptionDef case coPercent: archive(*static_cast(opt)); break; case coPercents: archive(*static_cast(opt)); break; case coFloatOrPercent: archive(*static_cast(opt)); break; + case coFloatsOrPercents:archive(*static_cast(opt));break; case coPoint: archive(*static_cast(opt)); break; case coPoints: archive(*static_cast(opt)); break; case coPoint3: archive(*static_cast(opt)); break; @@ -1765,8 +1944,8 @@ class ConfigOptionDef // limit of a numeric input. // If not set, the is set to // By setting min=0, only nonnegative input is allowed. - int min = INT_MIN; - int max = INT_MAX; + float min = -FLT_MAX; + float max = FLT_MAX; // To check if it's not a typo and a % is missing double max_literal = 1; ConfigOptionMode mode = comSimple; @@ -1776,19 +1955,73 @@ class ConfigOptionDef // Sometimes a single value may well define multiple values in a "beginner" mode. // Currently used for aliasing "solid_layers" to "top_solid_layers", "bottom_solid_layers". std::vector shortcut; - // Definition of values / labels for a combo box. - // Mostly used for enums (when type == coEnum), but may be used for ints resp. floats, if gui_type is set to "i_enum_open" resp. "f_enum_open". - std::vector enum_values; - std::vector enum_labels; - // For enums (when type == coEnum). Maps enum_values to enums. - // Initialized by ConfigOptionEnum::get_enum_values() - const t_config_enum_values *enum_keys_map = nullptr; + + Slic3r::clonable_ptr enum_def; + + void set_enum_values(const std::initializer_list il) { + this->enum_def_new(); + enum_def->set_values(il); + } + + void set_enum_values(GUIType gui_type, const std::initializer_list il) { + this->enum_def_new(); + assert(gui_type == GUIType::i_enum_open || gui_type == GUIType::f_enum_open || gui_type == GUIType::select_open); + this->gui_type = gui_type; + enum_def->set_values(il); + } + + void set_enum_values(const std::initializer_list> il) { + this->enum_def_new(); + enum_def->set_values(il); + } + + void set_enum_values(GUIType gui_type, const std::initializer_list> il) { + this->enum_def_new(); + assert(gui_type == GUIType::i_enum_open || gui_type == GUIType::f_enum_open); + this->gui_type = gui_type; + enum_def->set_values(il); + } + + template + void set_enum_values(Values &&values, Labels &&labels) { + this->enum_def_new(); + enum_def->set_values(std::move(values)); + enum_def->set_labels(std::move(labels)); + } + + void set_enum_labels(GUIType gui_type, const std::initializer_list il) { + this->enum_def_new(); + assert(gui_type == GUIType::i_enum_open || gui_type == GUIType::f_enum_open || gui_type == ConfigOptionDef::GUIType::select_open); + this->gui_type = gui_type; + enum_def->set_labels(il); + } + + template + void set_enum(std::initializer_list il) { + this->set_enum_values(il); + enum_def->set_enum_map(); + } + + template + void set_enum(std::initializer_list> il) { + this->set_enum_values(il); + enum_def->set_enum_map(); + } + + template + void set_enum(Values &&values, Labels &&labels) { + this->set_enum_values(std::move(values), std::move(labels)); + enum_def->set_enum_map(); + } + + template + void set_enum(Values &&values, const std::initializer_list labels) { + this->set_enum_values(std::move(values), labels); + enum_def->set_enum_map(); + } bool has_enum_value(const std::string &value) const { - for (const std::string &v : enum_values) - if (v == value) - return true; - return false; + return enum_def && enum_def->value_to_index(value).has_value(); } // 0 is an invalid key. @@ -1800,6 +2033,14 @@ class ConfigOptionDef // Assign this key to cli to disable CLI for this option. static const constexpr char *nocli = "~~~noCLI"; + +private: + void enum_def_new() { + if (enum_def) + enum_def->clear(); + else + enum_def = Slic3r::clonable_ptr(new ConfigOptionEnumDef{}); + } }; inline bool operator<(const ConfigSubstitution &lhs, const ConfigSubstitution &rhs) throw() { @@ -1845,6 +2086,8 @@ class ConfigDef protected: ConfigOptionDef* add(const t_config_option_key &opt_key, ConfigOptionType type); ConfigOptionDef* add_nullable(const t_config_option_key &opt_key, ConfigOptionType type); + // Finalize open / close enums, validate everything. + void finalize(); }; // A pure interface to resolving ConfigOptions. @@ -1949,7 +2192,17 @@ class ConfigBase : public ConfigOptionResolver throw BadOptionTypeException("Conversion to a wrong type"); return static_cast(opt); } - + + template T* opt(const t_config_option_key &opt_key, bool create = false) + { return dynamic_cast(this->optptr(opt_key, create)); } + template const T* opt(const t_config_option_key &opt_key) const + { return dynamic_cast(this->optptr(opt_key)); } + + // Get definition for a particular option. + // Returns null if such an option definition does not exist. + const ConfigOptionDef* option_def(const t_config_option_key &opt_key) const + { return this->def()->get(opt_key); } + // Apply all keys of other ConfigBase defined by this->def() to this ConfigBase. // An UnknownOptionException is thrown in case some option keys of other are not defined by this->def(), // or this ConfigBase is of a StaticConfig type and it does not support some of the keys, and ignore_nonexistent is not set. @@ -1989,15 +2242,28 @@ class ConfigBase : public ConfigOptionResolver struct SetDeserializeItem { SetDeserializeItem(const char *opt_key, const char *opt_value, bool append = false) : opt_key(opt_key), opt_value(opt_value), append(append) {} SetDeserializeItem(const std::string &opt_key, const std::string &opt_value, bool append = false) : opt_key(opt_key), opt_value(opt_value), append(append) {} + SetDeserializeItem(const std::string &opt_key, const std::string_view opt_value, bool append = false) : opt_key(opt_key), opt_value(opt_value), append(append) {} SetDeserializeItem(const char *opt_key, const bool value, bool append = false) : opt_key(opt_key), opt_value(value ? "1" : "0"), append(append) {} SetDeserializeItem(const std::string &opt_key, const bool value, bool append = false) : opt_key(opt_key), opt_value(value ? "1" : "0"), append(append) {} SetDeserializeItem(const char *opt_key, const int value, bool append = false) : opt_key(opt_key), opt_value(std::to_string(value)), append(append) {} SetDeserializeItem(const std::string &opt_key, const int value, bool append = false) : opt_key(opt_key), opt_value(std::to_string(value)), append(append) {} + SetDeserializeItem(const char *opt_key, const std::initializer_list values, bool append = false) : opt_key(opt_key), opt_value(format(values)), append(append) {} + SetDeserializeItem(const std::string &opt_key, const std::initializer_list values, bool append = false) : opt_key(opt_key), opt_value(format(values)), append(append) {} SetDeserializeItem(const char *opt_key, const float value, bool append = false) : opt_key(opt_key), opt_value(float_to_string_decimal_point(value)), append(append) {} SetDeserializeItem(const std::string &opt_key, const float value, bool append = false) : opt_key(opt_key), opt_value(float_to_string_decimal_point(value)), append(append) {} SetDeserializeItem(const char *opt_key, const double value, bool append = false) : opt_key(opt_key), opt_value(float_to_string_decimal_point(value)), append(append) {} SetDeserializeItem(const std::string &opt_key, const double value, bool append = false) : opt_key(opt_key), opt_value(float_to_string_decimal_point(value)), append(append) {} + SetDeserializeItem(const char *opt_key, const std::initializer_list values, bool append = false) : opt_key(opt_key), opt_value(format(values)), append(append) {} + SetDeserializeItem(const std::string &opt_key, const std::initializer_list values, bool append = false) : opt_key(opt_key), opt_value(format(values)), append(append) {} + SetDeserializeItem(const char *opt_key, const std::initializer_list values, bool append = false) : opt_key(opt_key), opt_value(format(values)), append(append) {} + SetDeserializeItem(const std::string &opt_key, const std::initializer_list values, bool append = false) : opt_key(opt_key), opt_value(format(values)), append(append) {} + std::string opt_key; std::string opt_value; bool append = false; + + private: + static std::string format(std::initializer_list values); + static std::string format(std::initializer_list values); + static std::string format(std::initializer_list values); }; // May throw BadOptionTypeException() if the operation fails. void set_deserialize(std::initializer_list items, ConfigSubstitutionContext& substitutions); @@ -2006,7 +2272,31 @@ class ConfigBase : public ConfigOptionResolver double get_abs_value(const t_config_option_key &opt_key) const; double get_abs_value(const t_config_option_key &opt_key, double ratio_over) const; - void setenv_() const; + + std::string& opt_string(const t_config_option_key &opt_key, bool create = false) { return this->option(opt_key, create)->value; } + const std::string& opt_string(const t_config_option_key &opt_key) const { return const_cast(this)->opt_string(opt_key); } + std::string& opt_string(const t_config_option_key &opt_key, unsigned int idx) { return this->option(opt_key)->get_at(idx); } + const std::string& opt_string(const t_config_option_key &opt_key, unsigned int idx) const { return const_cast(this)->opt_string(opt_key, idx); } + + double& opt_float(const t_config_option_key &opt_key) { return this->option(opt_key)->value; } + const double& opt_float(const t_config_option_key &opt_key) const { return dynamic_cast(this->option(opt_key))->value; } + double& opt_float(const t_config_option_key &opt_key, unsigned int idx) { return this->option(opt_key)->get_at(idx); } + const double& opt_float(const t_config_option_key &opt_key, unsigned int idx) const { return dynamic_cast(this->option(opt_key))->get_at(idx); } + + int& opt_int(const t_config_option_key &opt_key) { return this->option(opt_key)->value; } + int opt_int(const t_config_option_key &opt_key) const { return dynamic_cast(this->option(opt_key))->value; } + int& opt_int(const t_config_option_key &opt_key, unsigned int idx) { return this->option(opt_key)->get_at(idx); } + int opt_int(const t_config_option_key &opt_key, unsigned int idx) const { return dynamic_cast(this->option(opt_key))->get_at(idx); } + + // In ConfigManipulation::toggle_print_fff_options, it is called on option with type ConfigOptionEnumGeneric* and also ConfigOptionEnum*. + // Thus the virtual method getInt() is used to retrieve the enum value. + template + ENUM opt_enum(const t_config_option_key &opt_key) const { return static_cast(this->option(opt_key)->getInt()); } + + bool opt_bool(const t_config_option_key &opt_key) const { return this->option(opt_key)->value != 0; } + bool opt_bool(const t_config_option_key &opt_key, unsigned int idx) const { return this->option(opt_key)->get_at(idx) != 0; } + + void setenv_() const; ConfigSubstitutions load(const std::string &file, ForwardCompatibilitySubstitutionRule compatibility_rule); ConfigSubstitutions load_from_ini(const std::string &file, ForwardCompatibilitySubstitutionRule compatibility_rule); ConfigSubstitutions load_from_ini_string(const std::string &data, ForwardCompatibilitySubstitutionRule compatibility_rule); @@ -2015,10 +2305,10 @@ class ConfigBase : public ConfigOptionResolver ConfigSubstitutions load_from_ini_string_commented(std::string &&data, ForwardCompatibilitySubstitutionRule compatibility_rule); ConfigSubstitutions load_from_gcode_file(const std::string &file, ForwardCompatibilitySubstitutionRule compatibility_rule); ConfigSubstitutions load(const boost::property_tree::ptree &tree, ForwardCompatibilitySubstitutionRule compatibility_rule); - void save(const std::string &file) const; + void save(const std::string &file) const; // Set all the nullable values to nils. - void null_nullables(); + void null_nullables(); static size_t load_from_gcode_string_legacy(ConfigBase& config, const char* str, ConfigSubstitutionContext& substitutions); @@ -2127,10 +2417,6 @@ class DynamicConfig : public virtual ConfigBase // Allow DynamicConfig to be instantiated on ints own without a definition. // If the definition is not defined, the method requiring the definition will throw NoDefinitionException. const ConfigDef* def() const override { return nullptr; } - template T* opt(const t_config_option_key &opt_key, bool create = false) - { return dynamic_cast(this->option(opt_key, create)); } - template const T* opt(const t_config_option_key &opt_key) const - { return dynamic_cast(this->option(opt_key)); } // Overrides ConfigResolver::optptr(). const ConfigOption* optptr(const t_config_option_key &opt_key) const override; // Overrides ConfigBase::optptr(). Find ando/or create a ConfigOption instance for a given name. @@ -2161,29 +2447,6 @@ class DynamicConfig : public virtual ConfigBase // Returns options being equal in the two configs, ignoring options not present in both configs. t_config_option_keys equal(const DynamicConfig &other) const; - std::string& opt_string(const t_config_option_key &opt_key, bool create = false) { return this->option(opt_key, create)->value; } - const std::string& opt_string(const t_config_option_key &opt_key) const { return const_cast(this)->opt_string(opt_key); } - std::string& opt_string(const t_config_option_key &opt_key, unsigned int idx) { return this->option(opt_key)->get_at(idx); } - const std::string& opt_string(const t_config_option_key &opt_key, unsigned int idx) const { return const_cast(this)->opt_string(opt_key, idx); } - - double& opt_float(const t_config_option_key &opt_key) { return this->option(opt_key)->value; } - const double& opt_float(const t_config_option_key &opt_key) const { return dynamic_cast(this->option(opt_key))->value; } - double& opt_float(const t_config_option_key &opt_key, unsigned int idx) { return this->option(opt_key)->get_at(idx); } - const double& opt_float(const t_config_option_key &opt_key, unsigned int idx) const { return dynamic_cast(this->option(opt_key))->get_at(idx); } - - int& opt_int(const t_config_option_key &opt_key) { return this->option(opt_key)->value; } - int opt_int(const t_config_option_key &opt_key) const { return dynamic_cast(this->option(opt_key))->value; } - int& opt_int(const t_config_option_key &opt_key, unsigned int idx) { return this->option(opt_key)->get_at(idx); } - int opt_int(const t_config_option_key &opt_key, unsigned int idx) const { return dynamic_cast(this->option(opt_key))->get_at(idx); } - - // In ConfigManipulation::toggle_print_fff_options, it is called on option with type ConfigOptionEnumGeneric* and also ConfigOptionEnum*. - // Thus the virtual method getInt() is used to retrieve the enum value. - template - ENUM opt_enum(const t_config_option_key &opt_key) const { return static_cast(this->option(opt_key)->getInt()); } - - bool opt_bool(const t_config_option_key &opt_key) const { return this->option(opt_key)->value != 0; } - bool opt_bool(const t_config_option_key &opt_key, unsigned int idx) const { return this->option(opt_key)->get_at(idx) != 0; } - // Command line processing bool read_cli(int argc, const char* const argv[], t_config_option_keys* extra, t_config_option_keys* keys = nullptr); diff --git a/src/libslic3r/CustomGCode.cpp b/src/libslic3r/CustomGCode.cpp index 193235bf832..213437782fe 100644 --- a/src/libslic3r/CustomGCode.cpp +++ b/src/libslic3r/CustomGCode.cpp @@ -41,7 +41,7 @@ extern void check_mode_for_custom_gcode_per_print_z(Info& info) return; bool is_single_extruder = true; - for (auto item : info.gcodes) + for (const Item& item : info.gcodes) { if (item.type == ToolChange) { info.mode = MultiAsSingle; diff --git a/src/libslic3r/CustomGCode.hpp b/src/libslic3r/CustomGCode.hpp index 334b4043130..c4a47b9a3ea 100644 --- a/src/libslic3r/CustomGCode.hpp +++ b/src/libslic3r/CustomGCode.hpp @@ -66,6 +66,8 @@ struct Info bool operator==(const Info& rhs) const { + if (rhs.gcodes.empty() && this->gcodes.empty()) + return true; // don't respect to the comparison of the mode, when g_codes are empty return (rhs.mode == this->mode ) && (rhs.gcodes == this->gcodes ); } diff --git a/src/libslic3r/CutSurface.cpp b/src/libslic3r/CutSurface.cpp new file mode 100644 index 00000000000..a8db9e41838 --- /dev/null +++ b/src/libslic3r/CutSurface.cpp @@ -0,0 +1,4052 @@ +#include "CutSurface.hpp" + +/// models_input.obj - Check transormation of model to each others +/// projection_center.obj - circle representing center of projection with correct distance +/// {M} .. model index +/// model/model{M}.off - CGAL model created from index_triangle_set +/// model_neg/model{M}.off - CGAL model created for differenciate (multi volume object) +/// shape.off - CGAL model created from shapes +/// constrained/model{M}.off - Visualization of inside and outside triangles +/// Green - not along constrained edge +/// Red - sure that are inside +/// Purple - sure that are outside +/// (only along constrained edge) +/// filled/model{M}.off - flood fill green triangles inside of red area +/// - Same meaning of color as constrained +/// {N} .. Order of cutted Area of Interestmodel from model surface +/// model_AOIs/{M}/cutAOI{N}.obj - Extracted Area of interest from corefined model +/// model_AOIs/{M}/outline{N}.obj - Outline of Cutted Area +/// {O} .. Order number of patch +/// patches/patch{O}.off +/// result.obj - Merged result its +/// result_contours/{O}.obj - visualization of contours for result patches +//#define DEBUG_OUTPUT_DIR std::string("C:/data/temp/cutSurface/") + +using namespace Slic3r; +#include "ExPolygonsIndex.hpp" + +#include +#include +#include +#include +#include + +// libslic3r +#include "TriangleMesh.hpp" // its_merge +#include "Utils.hpp" // next_highest_power_of_2 +#include "ClipperUtils.hpp" // union_ex + offset_ex + +namespace priv { + +using Project = Emboss::IProjection; +using Project3d = Emboss::IProject3d; + +///

    +/// Set true for indices out of area of interest +/// +/// Flag to convert triangle to cgal +/// model +/// Convert 2d point to pair of 3d points +/// 2d bounding box define AOI +void set_skip_for_out_of_aoi(std::vector &skip_indicies, + const indexed_triangle_set &its, + const Project &projection, + const BoundingBox &shapes_bb); + +/// +/// Set true for indicies outward and almost parallel together. +/// Note: internally calculate normals +/// +/// Flag to convert triangle to cgal +/// model +/// Direction to measure angle +/// Maximal allowed angle between opposit normal and +/// projection direction [in DEG] +void set_skip_by_angle(std::vector &skip_indicies, + const indexed_triangle_set &its, + const Project3d &projection, + double max_angle = 89.); + + +using EpicKernel = CGAL::Exact_predicates_inexact_constructions_kernel; +using CutMesh = CGAL::Surface_mesh; +using CutMeshes = std::vector; + +using VI = CGAL::SM_Vertex_index; +using HI = CGAL::SM_Halfedge_index; +using EI = CGAL::SM_Edge_index; +using FI = CGAL::SM_Face_index; +using P3 = CGAL::Epick::Point_3; + +inline Vec3d to_vec3d(const P3 &p) { return Vec3d(p.x(),p.y(),p.z()); } + +/// +/// Convert triangle mesh model to CGAL Surface_mesh +/// Filtrate out opposite triangles +/// Add property map for source face index +/// +/// Model +/// Flags that triangle should be skiped +/// When true triangle will flip normal +/// CGAL mesh - half edge mesh +CutMesh to_cgal(const indexed_triangle_set &its, + const std::vector &skip_indicies, + bool flip = false); + +/// +/// Covert 2d shape (e.g. Glyph) to CGAL model +/// NOTE: internaly create +/// edge_shape_map .. Property map to store conversion from edge to contour +/// face_shape_map .. Property map to store conversion from face to contour +/// +/// 2d shapes to project +/// Define transformation 2d point into 3d +/// CGAL model of extruded shape +CutMesh to_cgal(const ExPolygons &shapes, const Project &projection); +// function to check result of projection. 2d int32_t -> 3d double +bool exist_duplicit_vertex(const CutMesh& mesh); + + +/// +/// IntersectingElement +/// +/// Adress polygon inside of ExPolygon +/// Keep information about source of vertex: +/// - from face (one of 2 possible) +/// - from edge (one of 2 possible) +/// +/// V1~~~~~V2 +/// | f1 /: +/// | / : +/// e1| /e2: +/// | / : +/// |/ f2 : +/// V1'~~~~V2' +/// +/// | .. edge +/// / .. edge +/// : .. foreign edge - neighbor +/// ~ .. no care edge - idealy should not cross model +/// V1,V1' .. projected 2d point to 3d +/// V2,V2' .. projected 2d point to 3d +/// +/// Vertex indexing +/// V1 .. i (vertex_base + 2x index of point in polygon) +/// V1' .. i + 1 +/// V2 .. j = i + 2 || 0 (for last i in polygon) +/// V2' .. j + 1 +/// +/// f1 .. text_face_1 (triangle face made by side of shape contour) +/// f2 .. text_face_2 +/// e1 .. text_edge_1 (edge on side of face made by side of shape contour) +/// e2 .. text_edge_2 +/// +/// +struct IntersectingElement +{ + // identify source point in shapes + uint32_t shape_point_index{std::numeric_limits::max()}; + + // store together type, is_first, is_last + unsigned char attr{std::numeric_limits::max()}; + + // vertex or edge ID, where edge ID is the index of the source point. + // There are 4 consecutive indices generated for a single contour edge: + // 0th - 1st text edge (straight) + // 1th - 1st text face + // 2nd - 2nd text edge (diagonal) + // 3th - 2nd text face + // Type of intersecting element from extruded shape( 3d ) + // NOTE: type must be storable to 3bit -> max value is 7 + enum class Type: unsigned char { + edge_1 = 0, + face_1 = 1, + edge_2 = 2, + face_2 = 3, + undefined = 4 + }; + + IntersectingElement &set_type(Type t) + { + attr = static_cast( + attr + (int) t - (int) get_type()); + return *this; + } + void set_is_first(){ attr += 8; } + void set_is_last(){ attr += 16; } + Type get_type() const { return static_cast(attr % 8);} + bool is_first() const { return 8 <= attr && attr < 16; } + bool is_last() const { return attr >= 16; } +}; + +// stored in model made by shape +using EdgeShapeMap = CutMesh::Property_map; +using FaceShapeMap = CutMesh::Property_map; + +// stored in surface source - pointer to EdgeShapeMap | FaceShapeMap +using VertexShapeMap = CutMesh::Property_map; + +// stored in model made by shape +const std::string edge_shape_map_name = "e:IntersectingElement"; +const std::string face_shape_map_name = "f:IntersectingElement"; + +// stored in surface source +const std::string vert_shape_map_name = "v:IntersectingElement"; + +/// +/// Flag for faces in CGAL mesh +/// +enum class FaceType { + // face inside of the cutted shape + inside, + // face outside of the cutted shape + outside, + // face without constrained edge (In or Out) + not_constrained, + + // Helper flag that inside was processed + inside_processed +}; +using FaceTypeMap = CutMesh::Property_map; +const std::string face_type_map_name = "f:side"; + +// Conversion one vertex index to another +using CvtVI2VI = CutMesh::Property_map; +// Each Patch track outline vertex conversion to tource model +const std::string patch_source_name = "v:patch_source"; + +// For VI that should be reduced, contain VI to use instead of reduced +// Other VI are invalid +using ReductionMap = CvtVI2VI; +const std::string vertex_reduction_map_name = "v:reduction"; + +// A property map containing the constrained-or-not status of each edge +using EdgeBoolMap = CutMesh::Property_map; +const std::string is_constrained_edge_name = "e:is_constrained"; + +/// +/// Create map to reduce unnecesary triangles, +/// Triangles are made by divided quad to two triangles +/// on side of cutting shape mesh +/// Note: also use from mesh (have to be created) +/// face_type_map .. Type of shape inside / outside +/// vert_shape_map .. Source of outline vertex +/// +/// Reduction map from vertex to vertex, +/// when key == value than no reduction +/// Faces of one +/// Input object +void create_reduce_map(ReductionMap &reduction_map, const CutMesh &meshes); + +// Patch made by Cut area of interest from model +// connected faces(triangles) and outlines(halfEdges) for one surface cut +using CutAOI = std::pair, std::vector>; +// vector of Cutted Area of interest cutted from one CGAL model +using CutAOIs = std::vector; +// vector of CutAOIs for each model +using VCutAOIs = std::vector; + +/// +/// Create AOIs(area of interest) on model surface +/// +/// Input model converted to CGAL +/// NOTE: will be extended by corefine edge +/// 2d contours +/// [const]Model made by shapes +/// NOTE: Can't be definde as const because of corefine function input definition, +/// but it is. +/// Wanted projection distance +/// Convert index to shape point from ExPolygons +/// Patches from model surface +CutAOIs cut_from_model(CutMesh &cgal_model, + const ExPolygons &shapes, + /*const*/ CutMesh &cgal_shape, + float projection_ratio, + const ExPolygonsIndices &s2i); + +using Loop = std::vector; +using Loops = std::vector; + +/// +/// Create closed loops of contour vertices created from open half edges +/// +/// Unsorted half edges +/// Source mesh for half edges +/// Closed loops +Loops create_loops(const std::vector &outlines, const CutMesh &mesh); + +// To track during diff_models, +// what was cutted off, from CutAOI +struct SurfacePatch +{ + // converted cut to CGAL mesh + // Mesh is reduced. + // (do not contain divided triangles on contour - created by side Quad) + CutMesh mesh; + // CvtVI2VI cvt = mesh.property_map(patch_source_name); + // Conversion VI from this patch to source VI(model) is stored in mesh property + + // Outlines - converted CutAOI.second (half edges) + // to loops (vertex indicies) by function create_loops + Loops loops; + + // bounding box of mesh + BoundingBoxf3 bb; + + //// Data needed to find best projection distances + // index of source model in models + size_t model_id; + // index of source CutAOI + size_t aoi_id; + // index of shape from ExPolygons + size_t shape_id = 0; + + // flag that this patch contain whole CutAOI + bool is_whole_aoi = true; +}; +using SurfacePatches = std::vector; + +struct ModelCutId +{ + // index of model + uint32_t model_index; + // index of cut inside model + uint32_t cut_index; +}; + +/// +/// Keep conversion from VCutAOIs to Index and vice versa +/// Model_index .. contour(or hole) poin from ExPolygons +/// Index .. continous number +/// +class ModelCut2index +{ + std::vector m_offsets; + // for check range of index + uint32_t m_count; + +public: + ModelCut2index(const VCutAOIs &cuts); + uint32_t calc_index(const ModelCutId &id) const; + ModelCutId calc_id(uint32_t index) const; + uint32_t get_count() const { return m_count; }; + const std::vector &get_offsets() const { return m_offsets; } +}; + +/// +/// Differenciate other models +/// +/// Patches from meshes +/// Source points for Cutted AOIs +/// NOTE: Create Reduction map as mesh property - clean on end +/// Original models without cut modifications +/// used for differenciation +/// NOTE: Clip function modify Mesh +/// Define projection direction +/// Cuts differenciate by models - Patch +SurfacePatches diff_models(VCutAOIs &cuts, + /*const*/ CutMeshes &cut_models, + /*const*/ CutMeshes &models, + const Project3d &projection); + +/// +/// Checking whether patch is uninterrupted cover of whole expolygon it belongs. +/// +/// Part of surface to check +/// Source shape +/// Source of cut +/// True when cover whole expolygon otherwise false +bool is_over_whole_expoly(const CutAOI &cutAOI, + const ExPolygon &shape, + const CutMesh &mesh); + +/// +/// Checking whether patch is uninterrupted cover of whole expolygon it belongs. +/// +/// Part of surface to check +/// Source shape +/// True when cover whole expolygon otherwise false +bool is_over_whole_expoly(const SurfacePatch &patch, + const ExPolygons &shapes, + const VCutAOIs &cutAOIs, + const CutMeshes &meshes); +/// +/// Unptoject points from outline loops of patch +/// +/// Contain loops and vertices +/// Know how to project from 3d to 2d +/// Range of unprojected points x .. min, y .. max value +/// Unprojected points in loops +Polygons unproject_loops(const SurfacePatch &patch, const Project &projection, Vec2d &depth_range); + +/// +/// Unproject points from loops and create expolygons +/// +/// Patch to convert on expolygon +/// Convert 3d point to 2d +/// Range of unprojected points x .. min, y .. max value +/// Expolygon represent patch in 2d +ExPolygon to_expoly(const SurfacePatch &patch, const Project &projection, Vec2d &depth_range); + +/// +/// To select surface near projection distance +/// +struct ProjectionDistance +{ + // index of source model + uint32_t model_index = std::numeric_limits::max(); + + // index of CutAOI + uint32_t aoi_index = std::numeric_limits::max(); + + // index of Patch + uint32_t patch_index = std::numeric_limits::max(); + + // signed distance to projection + float distance = std::numeric_limits::max(); +}; +// addresed by ExPolygonsIndices +using ProjectionDistances = std::vector; + +// each point in shapes has its ProjectionDistances +using VDistances = std::vector; + +/// +/// Calculate distances for SurfacePatches outline points +/// NOTE: +/// each model has to have "vert_shape_map" .. Know source of new vertices +/// +/// Part of surface +/// Vertices position +/// Mesh created by shapes +/// Count of contour points in shapes +/// Define best distnace +/// Projection distances of cutted shape points +VDistances calc_distances(const SurfacePatches &patches, + const CutMeshes &models, + const CutMesh &shapes_mesh, + size_t count_shapes_points, + float projection_ratio); + +/// +/// Select distances in similar depth between expolygons +/// +/// All distances - Vector distances for each shape point +/// Vector of letters +/// Pivot for start projection in 2d +/// Convert index to addresss inside of shape +/// Cutted parts from surface +/// Closest distance projection indexed by points in shapes(see s2i) +ProjectionDistances choose_best_distance( + const VDistances &distances, + const ExPolygons &shapes, + const Point &start, + const ExPolygonsIndices &s2i, + const SurfacePatches &patches); + +/// +/// Create mask for patches +/// +/// For each point selected closest distance +/// All patches +/// All patches +/// Mask of used patch +std::vector select_patches(const ProjectionDistances &best_distances, + const SurfacePatches &patches, + + const ExPolygons &shapes, + const ExPolygonsIndices &s2i, + const VCutAOIs &cutAOIs, + const CutMeshes &meshes, + const Project &projection); + +/// +/// Merge two surface cuts together +/// Added surface cut will be consumed +/// +/// Surface cut to extend +/// Surface cut to consume +void append(SurfaceCut &sc, SurfaceCut &&sc_add); + +/// +/// Convert patch to indexed_triangle_set +/// +/// Part of surface +/// Converted patch +SurfaceCut patch2cut(SurfacePatch &patch); + +/// +/// Merge masked patches to one surface cut +/// +/// All patches +/// NOTE: Not const because One needs to add property for Convert indices +/// Mash for using patch +/// Result surface cut +SurfaceCut merge_patches(/*const*/ SurfacePatches &patches, + const std::vector &mask); + +#ifdef DEBUG_OUTPUT_DIR +void prepare_dir(const std::string &dir); +void initialize_store(const std::string &dir_to_clear); +/// +/// Debug purpose store of mesh with colored face by face type +/// +/// Input mesh, could add property color +/// NOTE: Not const because need to [optionaly] append color property map +/// Color source +/// File to store +void store(const CutMesh &mesh, const FaceTypeMap &face_type_map, const std::string &dir, bool is_filled = false); +void store(const ExPolygons &shapes, const std::string &svg_file); +void store(const CutMesh &mesh, const ReductionMap &reduction_map, const std::string &dir); +void store(const CutAOIs &aois, const CutMesh &mesh, const std::string &dir); +void store(const SurfacePatches &patches, const std::string &dir); +void store(const Vec3f &vertex, const Vec3f &normal, const std::string &file, float size = 2.f); +//void store(const ProjectionDistances &pds, const VCutAOIs &aois, const CutMeshes &meshes, const std::string &file, float width = 0.2f/* [in mm] */); +using Connection = std::pair; using Connections = std::vector; +void store(const ExPolygons &shapes, const std::vector &mask_distances, const Connections &connections, const std::string &file_svg); +void store(const SurfaceCut &cut, const std::string &file, const std::string &contour_dir); +void store(const std::vector &models, const std::string &obj_filename); +void store(const std::vector&models, const std::string &dir); +void store(const Emboss::IProjection &projection, const Point &point_to_project, float projection_ratio, const std::string &obj_filename); +#endif // DEBUG_OUTPUT_DIR +} // namespace privat + +#ifdef DEBUG_OUTPUT_DIR +#include "libslic3r/SVG.hpp" +#include +#include +#endif // DEBUG_OUTPUT_DIR + +SurfaceCut Slic3r::cut_surface(const ExPolygons &shapes, + const std::vector &models, + const Emboss::IProjection &projection, + float projection_ratio) +{ + assert(!models.empty()); + assert(!shapes.empty()); + if (models.empty() || shapes.empty() ) return {}; + +#ifdef DEBUG_OUTPUT_DIR + priv::initialize_store(DEBUG_OUTPUT_DIR); + priv::store(models, DEBUG_OUTPUT_DIR + "models_input.obj"); + priv::store(shapes, DEBUG_OUTPUT_DIR + "shapes.svg"); +#endif // DEBUG_OUTPUT_DIR + + // for filter out triangles out of bounding box + BoundingBox shapes_bb = get_extents(shapes); +#ifdef DEBUG_OUTPUT_DIR + priv::store(projection, shapes_bb.center(), projection_ratio, DEBUG_OUTPUT_DIR + "projection_center.obj"); +#endif // DEBUG_OUTPUT_DIR + + // for filttrate opposite triangles and a little more + const float max_angle = 89.9f; + priv::CutMeshes cgal_models; // source for patch + priv::CutMeshes cgal_neg_models; // model used for differenciate patches + cgal_models.reserve(models.size()); + for (const indexed_triangle_set &its : models) { + std::vector skip_indicies(its.indices.size(), {false}); + priv::set_skip_for_out_of_aoi(skip_indicies, its, projection, shapes_bb); + + // create model for differenciate cutted patches + bool flip = true; + cgal_neg_models.push_back(priv::to_cgal(its, skip_indicies, flip)); + + // cut out more than only opposit triangles + priv::set_skip_by_angle(skip_indicies, its, projection, max_angle); + cgal_models.push_back(priv::to_cgal(its, skip_indicies)); + } +#ifdef DEBUG_OUTPUT_DIR + priv::store(cgal_models, DEBUG_OUTPUT_DIR + "model/");// model[0-N].off + priv::store(cgal_neg_models, DEBUG_OUTPUT_DIR + "model_neg/"); // model[0-N].off +#endif // DEBUG_OUTPUT_DIR + + priv::CutMesh cgal_shape = priv::to_cgal(shapes, projection); +#ifdef DEBUG_OUTPUT_DIR + CGAL::IO::write_OFF(DEBUG_OUTPUT_DIR + "shape.off", cgal_shape); // only debug +#endif // DEBUG_OUTPUT_DIR + + // create tool for convert index to shape Point adress and vice versa + ExPolygonsIndices s2i(shapes); + priv::VCutAOIs model_cuts; + // cut shape from each cgal model + for (priv::CutMesh &cgal_model : cgal_models) { + priv::CutAOIs cutAOIs = priv::cut_from_model( + cgal_model, shapes, cgal_shape, projection_ratio, s2i); +#ifdef DEBUG_OUTPUT_DIR + size_t index = &cgal_model - &cgal_models.front(); + priv::store(cutAOIs, cgal_model, DEBUG_OUTPUT_DIR + "model_AOIs/" + std::to_string(index) + "/"); // only debug +#endif // DEBUG_OUTPUT_DIR + model_cuts.push_back(std::move(cutAOIs)); + } + + priv::SurfacePatches patches = priv::diff_models(model_cuts, cgal_models, cgal_neg_models, projection); +#ifdef DEBUG_OUTPUT_DIR + priv::store(patches, DEBUG_OUTPUT_DIR + "patches/"); +#endif // DEBUG_OUTPUT_DIR + if (patches.empty()) return {}; + + // fix - convert shape_point_id to expolygon index + // save 1 param(s2i) from diff_models call + for (priv::SurfacePatch &patch : patches) + patch.shape_id = s2i.cvt(patch.shape_id).expolygons_index; + + // calc distance to projection for all outline points of cutAOI(shape) + // it is used for distiguish the top one + uint32_t shapes_points = s2i.get_count(); + // for each point collect all projection distances + priv::VDistances distances = priv::calc_distances(patches, cgal_models, cgal_shape, shapes_points, projection_ratio); + + Point start = shapes_bb.center(); // only align center + + // Use only outline points + // for each point select best projection + priv::ProjectionDistances best_projection = priv::choose_best_distance(distances, shapes, start, s2i, patches); + std::vector use_patch = priv::select_patches(best_projection, patches, + shapes, s2i,model_cuts, cgal_models, projection); + SurfaceCut result = merge_patches(patches, use_patch); + //*/ + +#ifdef DEBUG_OUTPUT_DIR + priv::store(result, DEBUG_OUTPUT_DIR + "result.obj", DEBUG_OUTPUT_DIR + "result_contours/"); +#endif // DEBUG_OUTPUT_DIR + return result; +} + +indexed_triangle_set Slic3r::cut2model(const SurfaceCut &cut, + const Emboss::IProject3d &projection) +{ + assert(!cut.empty()); + size_t count_vertices = cut.vertices.size() * 2; + size_t count_indices = cut.indices.size() * 2; + + // indices from from zig zag + for (const auto &c : cut.contours) { + assert(!c.empty()); + count_indices += c.size() * 2; + } + + indexed_triangle_set result; + result.vertices.reserve(count_vertices); + result.indices.reserve(count_indices); + + // front + result.vertices.insert(result.vertices.end(), + cut.vertices.begin(), cut.vertices.end()); + result.indices.insert(result.indices.end(), + cut.indices.begin(), cut.indices.end()); + + // back + for (const Vec3f &v : cut.vertices) { + Vec3d vd = v.cast(); + Vec3d vd2 = projection.project(vd); + result.vertices.push_back(vd2.cast()); + } + + size_t back_offset = cut.vertices.size(); + for (const auto &i : cut.indices) { + // check range of indices in cut + assert(i.x() + back_offset < result.vertices.size()); + assert(i.y() + back_offset < result.vertices.size()); + assert(i.z() + back_offset < result.vertices.size()); + assert(i.x() >= 0 && i.x() < cut.vertices.size()); + assert(i.y() >= 0 && i.y() < cut.vertices.size()); + assert(i.z() >= 0 && i.z() < cut.vertices.size()); + // Y and Z is swapped CCW triangles for back side + result.indices.emplace_back(i.x() + back_offset, + i.z() + back_offset, + i.y() + back_offset); + } + + // zig zag indices + for (const auto &contour : cut.contours) { + size_t prev_front_index = contour.back(); + size_t prev_back_index = back_offset + prev_front_index; + for (size_t front_index : contour) { + assert(front_index < cut.vertices.size()); + size_t back_index = back_offset + front_index; + result.indices.emplace_back(front_index, prev_front_index, back_index); + result.indices.emplace_back(prev_front_index, prev_back_index, back_index); + prev_front_index = front_index; + prev_back_index = back_index; + } + } + + assert(count_vertices == result.vertices.size()); + assert(count_indices == result.indices.size()); + return result; +} + +// set_skip_for_out_of_aoi helping functions +namespace priv { +// define plane +using PointNormal = std::pair; +using PointNormals = std::array; + +/// +/// Check +/// +/// +/// +/// +/// +bool is_out_of(const Vec3d &v, const PointNormal &point_normal); + +using IsOnSides = std::vector>; +/// +/// Check if triangle t has all vertices out of any plane +/// +/// Triangle +/// Flag is vertex index out of plane +/// True when triangle is out of one of plane +bool is_all_on_one_side(const Vec3i &t, const IsOnSides& is_on_sides); + +} // namespace priv + +bool priv::is_out_of(const Vec3d &v, const PointNormal &point_normal) +{ + const Vec3d& p = point_normal.first; + const Vec3d& n = point_normal.second; + double signed_distance = (v - p).dot(n); + return signed_distance > 1e-5; +}; + +bool priv::is_all_on_one_side(const Vec3i &t, const IsOnSides& is_on_sides) { + for (size_t side = 0; side < 4; side++) { + bool result = true; + for (auto vi : t) { + if (!is_on_sides[vi][side]) { + result = false; + break; + } + } + if (result) return true; + } + return false; +} + +void priv::set_skip_for_out_of_aoi(std::vector &skip_indicies, + const indexed_triangle_set &its, + const Project &projection, + const BoundingBox &shapes_bb) +{ + assert(skip_indicies.size() == its.indices.size()); + // 1`*----* 2` + // / 2 /| + // 1 *----* | + // | | * 3` + // | |/ + // 0 *----* 3 + ////////////////// + std::array, 4> bb; + int index = 0; + for (Point v : + {shapes_bb.min, Point{shapes_bb.min.x(), shapes_bb.max.y()}, + shapes_bb.max, Point{shapes_bb.max.x(), shapes_bb.min.y()}}) + bb[index++] = projection.create_front_back(v); + + // define planes to test + // 0 .. under + // 1 .. left + // 2 .. above + // 3 .. right + size_t prev_i = 3; + // plane is defined by point and normal + PointNormals point_normals; + for (size_t i = 0; i < 4; i++) { + const Vec3d &p1 = bb[i].first; + const Vec3d &p2 = bb[i].second; + const Vec3d &p3 = bb[prev_i].first; + prev_i = i; + + Vec3d v1 = p2 - p1; + v1.normalize(); + Vec3d v2 = p3 - p1; + v2.normalize(); + + Vec3d normal = v2.cross(v1); + normal.normalize(); + + point_normals[i] = {p1, normal}; + } + + // check that projection is not left handed + // Fix for reflected projection + if (is_out_of(point_normals[2].first, point_normals[0])) { + // projection is reflected so normals are reflected + for (auto &pn : point_normals) + pn.second *= -1; + } + + // same meaning as point normal + IsOnSides is_on_sides(its.vertices.size(), {false,false,false,false}); + + // inspect all vertices when it is out of bounding box + tbb::parallel_for(tbb::blocked_range(0, its.vertices.size()), + [&its, &point_normals, &is_on_sides](const tbb::blocked_range &range) { + for (size_t i = range.begin(); i < range.end(); ++i) { + Vec3d v = its.vertices[i].cast(); + // under + above + for (int side : {0, 2}) { + if (is_out_of(v, point_normals[side])) { + is_on_sides[i][side] = true; + // when it is under it can't be above + break; + } + } + // left + right + for (int side : {1, 3}) { + if (is_out_of(v, point_normals[side])) { + is_on_sides[i][side] = true; + // when it is on left side it can't be on right + break; + } + } + } + }); // END parallel for + + // inspect all triangles, when it is out of bounding box + tbb::parallel_for(tbb::blocked_range(0, its.indices.size()), + [&its, &is_on_sides, &skip_indicies](const tbb::blocked_range &range) { + for (size_t i = range.begin(); i < range.end(); ++i) { + if (is_all_on_one_side(its.indices[i], is_on_sides)) + skip_indicies[i] = true; + } + }); // END parallel for +} + +indexed_triangle_set Slic3r::its_mask(const indexed_triangle_set &its, + const std::vector &mask) +{ + if (its.indices.size() != mask.size()) { + assert(false); + return {}; + } + + std::vector cvt_vetices(its.vertices.size(), {std::numeric_limits::max()}); + size_t vertices_count = 0; + size_t faces_count = 0; + for (const auto &t : its.indices) { + size_t index = &t - &its.indices.front(); + if (!mask[index]) continue; + ++faces_count; + for (const auto vi : t) { + uint32_t &cvt = cvt_vetices[vi]; + if (cvt == std::numeric_limits::max()) + cvt = vertices_count++; + } + } + if (faces_count == 0) return {}; + + indexed_triangle_set result; + result.indices.reserve(faces_count); + result.vertices = std::vector(vertices_count); + for (size_t i = 0; i < its.vertices.size(); ++i) { + uint32_t index = cvt_vetices[i]; + if (index == std::numeric_limits::max()) continue; + result.vertices[index] = its.vertices[i]; + } + + for (const stl_triangle_vertex_indices &f : its.indices) + if (mask[&f - &its.indices.front()]) + result.indices.push_back(stl_triangle_vertex_indices( + cvt_vetices[f[0]], cvt_vetices[f[1]], cvt_vetices[f[2]])); + + return result; +} + +indexed_triangle_set Slic3r::its_cut_AoI(const indexed_triangle_set &its, + const BoundingBox &bb, + const Emboss::IProjection &projection) +{ + std::vector skip_indicies(its.indices.size(), false); + priv::set_skip_for_out_of_aoi(skip_indicies, its, projection, bb); + // invert values in vector of bool + skip_indicies.flip(); + return its_mask(its, skip_indicies); +} + +void priv::set_skip_by_angle(std::vector &skip_indicies, + const indexed_triangle_set &its, + const Project3d &projection, + double max_angle) +{ + assert(max_angle < 90. && max_angle > 89.); + assert(skip_indicies.size() == its.indices.size()); + float threshold = static_cast(cos(max_angle / 180. * M_PI)); + for (const stl_triangle_vertex_indices& face : its.indices) { + size_t index = &face - &its.indices.front(); + if (skip_indicies[index]) continue; + Vec3f n = its_face_normal(its, face); + const Vec3f& v = its.vertices[face[0]]; + const Vec3d vd = v.cast(); + // Improve: For Orthogonal Projection it is same for each vertex + Vec3d projectedd = projection.project(vd); + Vec3f projected = projectedd.cast(); + Vec3f project_dir = projected - v; + project_dir.normalize(); + float cos_alpha = project_dir.dot(n); + if (cos_alpha > threshold) continue; + skip_indicies[index] = true; + } +} + +priv::CutMesh priv::to_cgal(const indexed_triangle_set &its, + const std::vector &skip_indicies, + bool flip) +{ + const std::vector &vertices = its.vertices; + const std::vector &indices = its.indices; + + std::vector use_vetices(vertices.size(), {false}); + + size_t vertices_count = 0; + size_t faces_count = 0; + size_t edges_count = 0; + + for (const auto &t : indices) { + size_t index = &t - &indices.front(); + if (skip_indicies[index]) continue; + ++faces_count; + size_t count_used_vertices = 0; + for (const auto vi : t) { + if (!use_vetices[vi]) { + ++vertices_count; + use_vetices[vi] = true; + } else { + ++count_used_vertices; + } + } + switch (count_used_vertices) { + case 3: break; // all edges are already counted + case 2: edges_count += 2; break; + case 1: + case 0: edges_count += 3; break; + default: assert(false); + } + } + assert(vertices_count <= vertices.size()); + assert(edges_count <= (indices.size() * 3)); + assert(faces_count <= indices.size()); + + CutMesh result; + result.reserve(vertices_count, edges_count, faces_count); + + std::vector to_filtrated_vertices_index(vertices.size()); + size_t filtrated_vertices_index = 0; + for (size_t i = 0; i < vertices.size(); ++i) + if (use_vetices[i]) { + to_filtrated_vertices_index[i] = VI(filtrated_vertices_index); + ++filtrated_vertices_index; + } + + for (const stl_vertex& v : vertices) { + if (!use_vetices[&v - &vertices.front()]) continue; + result.add_vertex(CutMesh::Point{v.x(), v.y(), v.z()}); + } + + if (!flip) { + for (const stl_triangle_vertex_indices &f : indices) { + if (skip_indicies[&f - &indices.front()]) continue; + result.add_face(to_filtrated_vertices_index[f[0]], + to_filtrated_vertices_index[f[1]], + to_filtrated_vertices_index[f[2]]); + } + } else { + for (const stl_triangle_vertex_indices &f : indices) { + if (skip_indicies[&f - &indices.front()]) continue; + result.add_face(to_filtrated_vertices_index[f[2]], + to_filtrated_vertices_index[f[1]], + to_filtrated_vertices_index[f[0]]); + } + } + + return result; +} + +bool priv::exist_duplicit_vertex(const CutMesh &mesh) { + std::vector points; + points.reserve(mesh.vertices().size()); + // copy points + for (VI vi : mesh.vertices()) { + const P3 &p = mesh.point(vi); + points.emplace_back(p.x(), p.y(), p.z()); + } + std::sort(points.begin(), points.end(), [](const Vec3d &v1, const Vec3d &v2) { + return v1.x() < v2.x() || + (v1.x() == v2.x() && + (v1.y() < v2.y() || + (v1.y() == v2.y() && + v1.z() < v2.z()))); + }); + // find first duplicit + auto it = std::adjacent_find(points.begin(), points.end()); + return it != points.end(); +} + +priv::CutMesh priv::to_cgal(const ExPolygons &shapes, + const Project &projection) +{ + if (shapes.empty()) return {}; + + CutMesh result; + EdgeShapeMap edge_shape_map = result.add_property_map(edge_shape_map_name).first; + FaceShapeMap face_shape_map = result.add_property_map(face_shape_map_name).first; + + std::vector indices; + auto insert_contour = [&projection, &indices, &result, + &edge_shape_map, &face_shape_map] + (const Polygon &polygon) { + indices.clear(); + indices.reserve(polygon.points.size() * 2); + size_t num_vertices_old = result.number_of_vertices(); + for (const Point &polygon_point : polygon.points) { + auto [front, back] = projection.create_front_back(polygon_point); + P3 v_front{front.x(), front.y(), front.z()}; + VI vi1 = result.add_vertex(v_front); + assert(vi1.idx() == (indices.size() + num_vertices_old)); + indices.push_back(vi1); + + P3 v_back{back.x(), back.y(), back.z()}; + VI vi2 = result.add_vertex(v_back); + assert(vi2.idx() == (indices.size() + num_vertices_old)); + indices.push_back(vi2); + } + + auto find_edge = [&result](FI fi, VI from, VI to) { + HI hi = result.halfedge(fi); + for (; result.target(hi) != to; hi = result.next(hi)); + assert(result.source(hi) == from); + assert(result.target(hi) == to); + return result.edge(hi); + }; + + uint32_t contour_index = static_cast(num_vertices_old / 2); + for (int32_t i = 0; i < int32_t(indices.size()); i += 2) { + bool is_first = i == 0; + bool is_last = size_t(i + 2) >= indices.size(); + int32_t j = is_last ? 0 : (i + 2); + + FI fi1 = result.add_face(indices[i], indices[j], indices[i + 1]); + EI ei1 = find_edge(fi1, indices[i + 1], indices[i]); + EI ei2 = find_edge(fi1, indices[j], indices[i + 1]); + FI fi2 = result.add_face(indices[j], indices[j + 1], indices[i + 1]); + IntersectingElement element {contour_index, (unsigned char)IntersectingElement::Type::undefined}; + if (is_first) element.set_is_first(); + if (is_last) element.set_is_last(); + edge_shape_map[ei1] = element.set_type(IntersectingElement::Type::edge_1); + face_shape_map[fi1] = element.set_type(IntersectingElement::Type::face_1); + edge_shape_map[ei2] = element.set_type(IntersectingElement::Type::edge_2); + face_shape_map[fi2] = element.set_type(IntersectingElement::Type::face_2); + ++contour_index; + } + }; + + size_t count_point = count_points(shapes); + result.reserve(result.number_of_vertices() + 2 * count_point, + result.number_of_edges() + 4 * count_point, + result.number_of_faces() + 2 * count_point); + + // Identify polygon + for (const ExPolygon &shape : shapes) { + insert_contour(shape.contour); + for (const Polygon &hole : shape.holes) + insert_contour(hole); + } + assert(!exist_duplicit_vertex(result)); + return result; +} + +priv::ModelCut2index::ModelCut2index(const VCutAOIs &cuts) +{ + // prepare offsets + m_offsets.reserve(cuts.size()); + uint32_t offset = 0; + for (const CutAOIs &model_cuts: cuts) { + m_offsets.push_back(offset); + offset += model_cuts.size(); + } + m_count = offset; +} + +uint32_t priv::ModelCut2index::calc_index(const ModelCutId &id) const +{ + assert(id.model_index < m_offsets.size()); + uint32_t offset = m_offsets[id.model_index]; + uint32_t res = offset + id.cut_index; + assert(((id.model_index+1) < m_offsets.size() && res < m_offsets[id.model_index+1]) || + ((id.model_index+1) == m_offsets.size() && res < m_count)); + return res; +} + +priv::ModelCutId priv::ModelCut2index::calc_id(uint32_t index) const +{ + assert(index < m_count); + ModelCutId result{0,0}; + // find shape index + for (size_t model_index = 1; model_index < m_offsets.size(); ++model_index) { + if (m_offsets[model_index] > index) break; + result.model_index = model_index; + } + result.cut_index = index - m_offsets[result.model_index]; + return result; +} + +// cut_from_model help functions +namespace priv { + +/// +/// Track source of intersection +/// Help for anotate inner and outer faces +/// +struct Visitor : public CGAL::Polygon_mesh_processing::Corefinement::Default_visitor { + Visitor(const CutMesh &object, const CutMesh &shape, EdgeShapeMap edge_shape_map, + FaceShapeMap face_shape_map, VertexShapeMap vert_shape_map, bool* is_valid) : + object(object), shape(shape), edge_shape_map(edge_shape_map), face_shape_map(face_shape_map), + vert_shape_map(vert_shape_map), is_valid(is_valid) + {} + + const CutMesh &object; + const CutMesh &shape; + + // Properties of the shape mesh: + EdgeShapeMap edge_shape_map; + FaceShapeMap face_shape_map; + + // Properties of the object mesh. + VertexShapeMap vert_shape_map; + + // check for anomalities + bool* is_valid; + + // keep source of intersection for each intersection + // used to copy data into vert_shape_map + std::vector intersections; + + /// + /// Called when a new intersection point is detected. + /// The intersection is detected using a face of tm_f and an edge of tm_e. + /// Intersecting an edge hh_edge from tm_f with a face h_e of tm_e. + /// https://doc.cgal.org/latest/Polygon_mesh_processing/classPMPCorefinementVisitor.html#a00ee0ca85db535a48726a92414acda7f + /// + /// The id of the intersection point, starting at 0. Ids are consecutive. + /// Dimension of a simplex part of face(h_e) that is intersected by edge(h_f): + /// 0 for vertex: target(h_e) + /// 1 for edge: h_e + /// 2 for the interior of face: face(h_e) + /// + /// A halfedge from tm_f indicating the simplex intersected: + /// if sdim==0 the target of h_f is the intersection point, + /// if sdim==1 the edge of h_f contains the intersection point in its interior, + /// if sdim==2 the face of h_f contains the intersection point in its interior. + /// @Vojta: Edge of tm_f, see is_target_coplanar & is_source_coplanar whether any vertex of h_f is coplanar with face(h_e). + /// + /// A halfedge from tm_e + /// @Vojta: Vertex, halfedge or face of tm_e intersected by h_f, see comment at sdim. + /// + /// Mesh containing h_f + /// Mesh containing h_e + /// True if the target of h_e is the intersection point + /// @Vojta: source(h_f) is coplanar with face(made by h_e). + /// True if the source of h_e is the intersection point + /// @Vojta: target(h_f) is coplanar with face(h_e). + void intersection_point_detected(std::size_t i_id, + int sdim, + HI h_f, + HI h_e, + const CutMesh &tm_f, + const CutMesh &tm_e, + bool is_target_coplanar, + bool is_source_coplanar); + + /// + /// Called when a new vertex is added in tm (either an edge split or a vertex inserted in the interior of a face). + /// Fill vertex_shape_map by intersections + /// + /// Order number of intersection point + /// New added vertex + /// Affected mesh + void new_vertex_added(std::size_t i_id, VI v, const CutMesh &tm); +}; + +/// +/// Distiquish face type for half edge +/// +/// Define face +/// Mesh to process +/// Vertices of mesh made by shapes +/// Keep information about source of created vertex +/// +/// Convert index to shape point from ExPolygons +/// Face type defined by hi +bool is_face_inside(HI hi, + const CutMesh &mesh, + const CutMesh &shape_mesh, + const VertexShapeMap &vertex_shape_map, + const ExPolygonsIndices &shape2index); + +/// +/// Face with constrained edge are inside/outside by type of intersection +/// Other set to not_constrained(still it could be inside/outside) +/// +/// [Output] property map with type of faces +/// Mesh to process +/// Keep information about source of created vertex +/// Dynamic Edge Constrained Map of bool +/// Vertices of mesh made by shapes +/// Convert index to shape point from ExPolygons +void set_face_type(FaceTypeMap &face_type_map, + const CutMesh &mesh, + const VertexShapeMap &vertex_shape_map, + const EdgeBoolMap &ecm, + const CutMesh &shape_mesh, + const ExPolygonsIndices &shape2index); + +/// +/// Change FaceType from not_constrained to inside +/// For neighbor(or neighbor of neighbor of ...) of inside triangles. +/// Process only not_constrained triangles +/// +/// Corefined mesh +/// In/Out map with faces type +void flood_fill_inner(const CutMesh &mesh, FaceTypeMap &face_type_map); + +/// +/// Collect connected inside faces +/// Collect outline half edges +/// +/// Queue of face to process - find connected +/// [Output] collected Face indices from mesh +/// [Output] collected Halfedge indices from mesh +/// Use flag inside / outside +/// NOTE: Modify in function: inside -> inside_processed +/// mesh to process +void collect_surface_data(std::queue &process, + std::vector &faces, + std::vector &outlines, + FaceTypeMap &face_type_map, + const CutMesh &mesh); + +/// +/// Create areas from mesh surface +/// +/// Model +/// Cutted shapes +/// Define Triangles of interest. +/// Edge between inside / outside. +/// NOTE: Not const because it need to flag proccessed faces +/// Areas of interest from mesh +CutAOIs create_cut_area_of_interests(const CutMesh &mesh, + const ExPolygons &shapes, + FaceTypeMap &face_type_map); + +} // namespace priv + +void priv::Visitor::intersection_point_detected(std::size_t i_id, + int sdim, + HI h_f, + HI h_e, + const CutMesh &tm_f, + const CutMesh &tm_e, + bool is_target_coplanar, + bool is_source_coplanar) +{ + if (i_id >= intersections.size()) { + size_t capacity = Slic3r::next_highest_power_of_2(i_id + 1); + intersections.reserve(capacity); + intersections.resize(capacity); + } + + const IntersectingElement *intersection_ptr = nullptr; + if (&tm_e == &shape) { + assert(&tm_f == &object); + switch (sdim) { + case 1: + // edge x edge intersection + intersection_ptr = &edge_shape_map[shape.edge(h_e)]; + break; + case 2: + // edge x face intersection + intersection_ptr = &face_shape_map[shape.face(h_e)]; + break; + default: assert(false); + } + if (is_target_coplanar) + vert_shape_map[object.source(h_f)] = intersection_ptr; + if (is_source_coplanar) + vert_shape_map[object.target(h_f)] = intersection_ptr; + } else { + assert(&tm_f == &shape && &tm_e == &object); + assert(!is_target_coplanar); + assert(!is_source_coplanar); + if (is_target_coplanar || is_source_coplanar) + *is_valid = false; + intersection_ptr = &edge_shape_map[shape.edge(h_f)]; + if (sdim == 0) vert_shape_map[object.target(h_e)] = intersection_ptr; + } + + if (intersection_ptr->shape_point_index == std::numeric_limits::max()) { + // there is unexpected intersection + // Top (or Bottom) shape contour edge (or vertex) intersection + // Suggest to change projection min/max limits + *is_valid = false; + } + intersections[i_id] = intersection_ptr; +} + +void priv::Visitor::new_vertex_added(std::size_t i_id, VI v, const CutMesh &tm) +{ + assert(&tm == &object); + assert(i_id < intersections.size()); + const IntersectingElement *intersection_ptr = intersections[i_id]; + assert(intersection_ptr != nullptr); + // intersection was not filled in function intersection_point_detected + //assert(intersection_ptr->point_index != std::numeric_limits::max()); + vert_shape_map[v] = intersection_ptr; +} + +bool priv::is_face_inside(HI hi, + const CutMesh &mesh, + const CutMesh &shape_mesh, + const VertexShapeMap &vertex_shape_map, + const ExPolygonsIndices &shape2index) +{ + VI vi_from = mesh.source(hi); + VI vi_to = mesh.target(hi); + // This face has a constrained edge. + const IntersectingElement &shape_from = *vertex_shape_map[vi_from]; + const IntersectingElement &shape_to = *vertex_shape_map[vi_to]; + assert(shape_from.shape_point_index != std::numeric_limits::max()); + assert(shape_from.attr != (unsigned char) IntersectingElement::Type::undefined); + assert(shape_to.shape_point_index != std::numeric_limits::max()); + assert(shape_to.attr != (unsigned char) IntersectingElement::Type::undefined); + + // index into contour + uint32_t i_from = shape_from.shape_point_index; + uint32_t i_to = shape_to.shape_point_index; + IntersectingElement::Type type_from = shape_from.get_type(); + IntersectingElement::Type type_to = shape_to.get_type(); + if (i_from == i_to && type_from == type_to) { + // intersecting element must be face + assert(type_from == IntersectingElement::Type::face_1 || + type_from == IntersectingElement::Type::face_2); + + // count of vertices is twice as count of point in the contour + uint32_t i = i_from * 2; + // j is next contour point in vertices + uint32_t j = i + 2; + if (shape_from.is_last()) { + ExPolygonsIndex point_id = shape2index.cvt(i_from); + point_id.point_index = 0; + j = shape2index.cvt(point_id)*2; + } + + // opposit point(in triangle face) to edge + const P3 &p = mesh.point(mesh.target(mesh.next(hi))); + + // abc is source triangle face + CGAL::Sign abcp = type_from == IntersectingElement::Type::face_1 ? + CGAL::orientation(shape_mesh.point(VI(i)), + shape_mesh.point(VI(i + 1)), + shape_mesh.point(VI(j)), p) : + // type_from == IntersectingElement::Type::face_2 + CGAL::orientation(shape_mesh.point(VI(j)), + shape_mesh.point(VI(i + 1)), + shape_mesh.point(VI(j + 1)), p); + return abcp == CGAL::POSITIVE; + } else if (i_from < i_to || (i_from == i_to && type_from < type_to)) { + bool is_last = shape_to.is_last() && shape_from.is_first(); + // check continuity of indicies + assert(i_from == i_to || is_last || (i_from + 1) == i_to); + return !is_last; + } else { + assert(i_from > i_to || (i_from == i_to && type_from > type_to)); + bool is_last = shape_to.is_first() && shape_from.is_last(); + // check continuity of indicies + assert(i_from == i_to || is_last || (i_to + 1) == i_from); + return is_last; + } + + assert(false); + return false; +} + +void priv::set_face_type(FaceTypeMap &face_type_map, + const CutMesh &mesh, + const VertexShapeMap &vertex_shape_map, + const EdgeBoolMap &ecm, + const CutMesh &shape_mesh, + const ExPolygonsIndices &shape2index) +{ + for (EI ei : mesh.edges()) { + if (!ecm[ei]) continue; + HI hi = mesh.halfedge(ei); + FI fi = mesh.face(hi); + bool is_inside = is_face_inside(hi, mesh, shape_mesh, vertex_shape_map, shape2index); + face_type_map[fi] = is_inside ? FaceType::inside : FaceType::outside; + HI hi_op = mesh.opposite(hi); + assert(hi_op.is_valid()); + if (!hi_op.is_valid()) continue; + FI fi_op = mesh.face(hi_op); + assert(fi_op.is_valid()); + if (!fi_op.is_valid()) continue; + face_type_map[fi_op] = (!is_inside) ? FaceType::inside : FaceType::outside; + } +} + +priv::CutAOIs priv::cut_from_model(CutMesh &cgal_model, + const ExPolygons &shapes, + CutMesh &cgal_shape, + float projection_ratio, + const ExPolygonsIndices &s2i) +{ + // pointer to edge or face shape_map + VertexShapeMap vert_shape_map = cgal_model.add_property_map(vert_shape_map_name, nullptr).first; + + // detect anomalities in visitor. + bool is_valid = true; + // NOTE: map are created when convert shapes to cgal model + const EdgeShapeMap& edge_shape_map = cgal_shape.property_map(edge_shape_map_name).first; + const FaceShapeMap& face_shape_map = cgal_shape.property_map(face_shape_map_name).first; + Visitor visitor{cgal_model, cgal_shape, edge_shape_map, face_shape_map, vert_shape_map, &is_valid}; + + // a property map containing the constrained-or-not status of each edge + EdgeBoolMap ecm = cgal_model.add_property_map(is_constrained_edge_name, false).first; + const auto &p = CGAL::parameters::visitor(visitor) + .edge_is_constrained_map(ecm) + .throw_on_self_intersection(false); + const auto& q = CGAL::parameters::do_not_modify(true); + CGAL::Polygon_mesh_processing::corefine(cgal_model, cgal_shape, p, q); + + if (!is_valid) return {}; + + FaceTypeMap face_type_map = cgal_model.add_property_map(face_type_map_name, FaceType::not_constrained).first; + + // Select inside and outside face in model + set_face_type(face_type_map, cgal_model, vert_shape_map, ecm, cgal_shape, s2i); +#ifdef DEBUG_OUTPUT_DIR + store(cgal_model, face_type_map, DEBUG_OUTPUT_DIR + "constrained/"); // only debug +#endif // DEBUG_OUTPUT_DIR + + // flood fill the other faces inside the region. + flood_fill_inner(cgal_model, face_type_map); + +#ifdef DEBUG_OUTPUT_DIR + store(cgal_model, face_type_map, DEBUG_OUTPUT_DIR + "filled/", true); // only debug +#endif // DEBUG_OUTPUT_DIR + + // IMPROVE: AOIs area could be created during flood fill + return create_cut_area_of_interests(cgal_model, shapes, face_type_map); +} + +void priv::flood_fill_inner(const CutMesh &mesh, + FaceTypeMap &face_type_map) +{ + std::vector process; + // guess count of connected not constrained triangles + size_t guess_size = 128; + process.reserve(guess_size); + + // check if neighbor(one of three in triangle) has type inside + auto has_inside_neighbor = [&mesh, &face_type_map](FI fi) { + HI hi = mesh.halfedge(fi); + HI hi_end = hi; + auto exist_next = [&hi, &hi_end, &mesh]() -> bool { + hi = mesh.next(hi); + return hi != hi_end; + }; + // loop over 3 half edges of face + do { + HI hi_opposite = mesh.opposite(hi); + // open edge doesn't have opposit half edge + if (!hi_opposite.is_valid()) continue; + FI fi_opposite = mesh.face(hi_opposite); + if (!fi_opposite.is_valid()) continue; + if (face_type_map[fi_opposite] == FaceType::inside) return true; + } while (exist_next()); + return false; + }; + + for (FI fi : mesh.faces()) { + FaceType type = face_type_map[fi]; + if (type != FaceType::not_constrained) continue; + if (!has_inside_neighbor(fi)) continue; + assert(process.empty()); + process.push_back(fi); + //store(mesh, face_type_map, DEBUG_OUTPUT_DIR + "progress.off"); + + while (!process.empty()) { + FI process_fi = process.back(); + process.pop_back(); + // Do not fill twice + FaceType& process_type = face_type_map[process_fi]; + if (process_type == FaceType::inside) continue; + process_type = FaceType::inside; + + // check neighbor triangle + HI hi = mesh.halfedge(process_fi); + HI hi_end = hi; + auto exist_next = [&hi, &hi_end, &mesh]() -> bool { + hi = mesh.next(hi); + return hi != hi_end; + }; + do { + HI hi_opposite = mesh.opposite(hi); + // open edge doesn't have opposit half edge + if (!hi_opposite.is_valid()) continue; + FI fi_opposite = mesh.face(hi_opposite); + if (!fi_opposite.is_valid()) continue; + FaceType type_opposite = face_type_map[fi_opposite]; + if (type_opposite == FaceType::not_constrained) + process.push_back(fi_opposite); + } while (exist_next()); + } + } +} + +void priv::collect_surface_data(std::queue &process, + std::vector &faces, + std::vector &outlines, + FaceTypeMap &face_type_map, + const CutMesh &mesh) +{ + assert(!process.empty()); + assert(faces.empty()); + assert(outlines.empty()); + while (!process.empty()) { + FI fi = process.front(); + process.pop(); + + FaceType &fi_type = face_type_map[fi]; + // Do not process twice + if (fi_type == FaceType::inside_processed) continue; + assert(fi_type == FaceType::inside); + // flag face as processed + fi_type = FaceType::inside_processed; + faces.push_back(fi); + + // check neighbor triangle + HI hi = mesh.halfedge(fi); + HI hi_end = hi; + do { + HI hi_opposite = mesh.opposite(hi); + // open edge doesn't have opposit half edge + if (!hi_opposite.is_valid()) { + outlines.push_back(hi); + hi = mesh.next(hi); + continue; + } + FI fi_opposite = mesh.face(hi_opposite); + if (!fi_opposite.is_valid()) { + outlines.push_back(hi); + hi = mesh.next(hi); + continue; + } + FaceType side = face_type_map[fi_opposite]; + if (side == FaceType::inside) { + process.emplace(fi_opposite); + } else if (side == FaceType::outside) { + // store outlines + outlines.push_back(hi); + } + hi = mesh.next(hi); + } while (hi != hi_end); + } +} + +void priv::create_reduce_map(ReductionMap &reduction_map, const CutMesh &mesh) +{ + const VertexShapeMap &vert_shape_map = mesh.property_map(vert_shape_map_name).first; + const EdgeBoolMap &ecm = mesh.property_map(is_constrained_edge_name).first; + + // check if vertex was made by edge_2 which is diagonal of quad + auto is_reducible_vertex = [&vert_shape_map](VI reduction_from) -> bool { + const IntersectingElement *ie = vert_shape_map[reduction_from]; + if (ie == nullptr) return false; + IntersectingElement::Type type = ie->get_type(); + return type == IntersectingElement::Type::edge_2; + }; + + /// + /// Append reduction or change existing one. + /// + /// HalEdge between outside and inside face. + /// Target vertex will be reduced, source vertex left + /// [[maybe_unused]] &face_type_map, &is_reducible_vertex are need only in debug + auto add_reduction = [&] //&reduction_map, &mesh, &face_type_map, &is_reducible_vertex + (HI hi) { + VI erase = mesh.target(hi); + VI left = mesh.source(hi); + assert(is_reducible_vertex(erase)); + assert(!is_reducible_vertex(left)); + VI &vi = reduction_map[erase]; + // check if it is first add + if (vi.is_valid()) + return; + + // check that all triangles after reduction has 'erase' and 'left' vertex + // on same side of opposite line of vertex in triangle + Vec3d v_erase = to_vec3d(mesh.point(erase)); + Vec3d v_left = to_vec3d(mesh.point(left)); + for (FI fi : mesh.faces_around_target(hi)) { + if (!fi.is_valid()) + continue; + // get vertices of rest + VI vi_a, vi_b; + for (VI vi : mesh.vertices_around_face(mesh.halfedge(fi))) { + if (!vi.is_valid()) + continue; + if (vi == erase) + continue; + if (!vi_a.is_valid()) + vi_a = vi; + else { + assert(!vi_b.is_valid()); + vi_b = vi; + } + } + assert(vi_b.is_valid()); + // do not check triangle, which will be removed + if (vi_a == left || vi_b == left) + continue; + + Vec3d v_a = to_vec3d(mesh.point(vi_a)); + Vec3d v_b = to_vec3d(mesh.point(vi_b)); + // Vectors of triangle edges + Vec3d v_ab = v_b - v_a; + Vec3d v_ae = v_erase - v_a; + Vec3d v_al = v_left - v_a; + + Vec3d n1 = v_ab.cross(v_ae); + Vec3d n2 = v_ab.cross(v_al); + // check that normal has same direction + if (((n1.x() > 0) != (n2.x() > 0)) || + ((n1.y() > 0) != (n2.y() > 0)) || + ((n1.z() > 0) != (n2.z() > 0))) + return; // this reduction will create CCW triangle + } + + reduction_map[erase] = left; + // I have no better rule than take the first + // for decide which reduction will be better + // But it could be use only one of them + }; + + for (EI ei : mesh.edges()) { + if (!ecm[ei]) continue; + HI hi = mesh.halfedge(ei); + VI vi = mesh.target(hi); + if (is_reducible_vertex(vi)) add_reduction(hi); + + HI hi_op = mesh.opposite(hi); + VI vi_op = mesh.target(hi_op); + if (is_reducible_vertex(vi_op)) add_reduction(hi_op); + } +#ifdef DEBUG_OUTPUT_DIR + store(mesh, reduction_map, DEBUG_OUTPUT_DIR + "reduces/"); +#endif // DEBUG_OUTPUT_DIR +} + +priv::CutAOIs priv::create_cut_area_of_interests(const CutMesh &mesh, + const ExPolygons &shapes, + FaceTypeMap &face_type_map) +{ + // IMPROVE: Create better heuristic for count. + size_t faces_per_cut = mesh.faces().size() / shapes.size(); + size_t outlines_per_cut = faces_per_cut / 2; + size_t cuts_per_model = shapes.size() * 2; + + CutAOIs result; + result.reserve(cuts_per_model); + + // It is faster to use one queue for all cuts + std::queue process; + for (FI fi : mesh.faces()) { + if (face_type_map[fi] != FaceType::inside) continue; + + CutAOI cut; + std::vector &faces = cut.first; + std::vector &outlines = cut.second; + + // faces for one surface cut + faces.reserve(faces_per_cut); + // outline for one surface cut + outlines.reserve(outlines_per_cut); + + assert(process.empty()); + // Process queue of faces to separate to surface_cut + process.push(fi); + collect_surface_data(process, faces, outlines, face_type_map, mesh); + assert(!faces.empty()); + assert(!outlines.empty()); + result.emplace_back(std::move(cut)); + } + return result; +} + +namespace priv { + +/// +/// Calculate projection distance of point [in mm] +/// +/// Point to calc distance +/// Index of point on contour +/// Model of cutting shape +/// Ratio for best projection distance +/// Distance of point from best projection +float calc_distance(const P3 &p, + uint32_t pi, + const CutMesh &shapes_mesh, + float projection_ratio); + +} + +float priv::calc_distance(const P3 &p, + uint32_t pi, + const CutMesh &shapes_mesh, + float projection_ratio) +{ + // It is known because shapes_mesh is created inside of private space + VI vi_start(2 * pi); + VI vi_end(2 * pi + 1); + + // Get range for intersection + const P3 &start = shapes_mesh.point(vi_start); + const P3 &end = shapes_mesh.point(vi_end); + + // find index in vector with biggest difference + size_t max_i = 0; + float max_val = 0.f; + for (size_t i = 0; i < 3; i++) { + float val = start[i] - end[i]; + // abs value + if (val < 0.f) val *= -1.f; + if (max_val < val) { + max_val = val; + max_i = i; + } + } + + float from_start = p[max_i] - start[max_i]; + float best_distance = projection_ratio * (end[max_i] - start[max_i]); + return from_start - best_distance; +} + +priv::VDistances priv::calc_distances(const SurfacePatches &patches, + const CutMeshes &models, + const CutMesh &shapes_mesh, + size_t count_shapes_points, + float projection_ratio) +{ + priv::VDistances result(count_shapes_points); + for (const SurfacePatch &patch : patches) { + // map is created during intersection by corefine visitor + const VertexShapeMap &vert_shape_map = + models[patch.model_id].property_map(vert_shape_map_name).first; + uint32_t patch_index = &patch - &patches.front(); + // map is created during patch creation / dividing + const CvtVI2VI& cvt = patch.mesh.property_map(patch_source_name).first; + // for each point on outline + for (const Loop &loop : patch.loops) + for (const VI &vi_patch : loop) { + VI vi_model = cvt[vi_patch]; + if (!vi_model.is_valid()) continue; + const IntersectingElement *ie = vert_shape_map[vi_model]; + if (ie == nullptr) continue; + assert(ie->shape_point_index != std::numeric_limits::max()); + assert(ie->attr != (unsigned char) IntersectingElement::Type::undefined); + uint32_t pi = ie->shape_point_index; + assert(pi <= count_shapes_points); + std::vector &pds = result[pi]; + uint32_t model_index = patch.model_id; + uint32_t aoi_index = patch.aoi_id; + //uint32_t hi_index = &hi - &patch.outline.front(); + const P3 &p = patch.mesh.point(vi_patch); + float distance = calc_distance(p, pi, shapes_mesh, projection_ratio); + pds.push_back({model_index, aoi_index, patch_index, distance}); + } + } + return result; +} + + +#include "libslic3r/AABBTreeLines.hpp" +#include "libslic3r/Line.hpp" +// functions for choose_best_distance +namespace priv { + +// euler square size of vector stored in Point +float calc_size_sq(const Point &p); + +// structure to store index and distance together +struct ClosePoint +{ + // index of closest point from another shape + uint32_t index = std::numeric_limits::max(); + // squere distance to index + float dist_sq = std::numeric_limits::max(); +}; + +struct SearchData{ +// IMPROVE: float lines are enough +std::vector lines; +// convert line index into Shape point index +std::vector cvt; +// contain lines from prev point to Point index +AABBTreeIndirect::Tree<2, double> tree; +}; + +SearchData create_search_data(const ExPolygons &shapes, const std::vector& mask); +uint32_t get_closest_point_index(const SearchData &sd, size_t line_idx, const Vec2d &hit_point, const ExPolygons &shapes, const ExPolygonsIndices &s2i); + +// use AABB Tree Lines to find closest point +uint32_t find_closest_point_index(const Point &p, const ExPolygons &shapes, const ExPolygonsIndices &s2i, const std::vector &mask); + +std::pair find_closest_point_pair(const ExPolygons &shapes, const std::vector &done_shapes, const ExPolygonsIndices &s2i, const std::vector &mask); + +// Search for closest projection to wanted distance +const ProjectionDistance *get_closest_projection(const ProjectionDistances &distance, float wanted_distance); + +// fill result around known index inside one polygon +void fill_polygon_distances(const ProjectionDistance &pd, uint32_t index, const ExPolygonsIndex &id, ProjectionDistances & result, const ExPolygon &shape, const VDistances &distances); + +// search for closest projection for expolygon +// choose correct cut by source point +void fill_shape_distances(uint32_t start_index, const ProjectionDistance *start_pd, ProjectionDistances &result, const ExPolygonsIndices &s2i, const ExPolygon &shape, const VDistances &distances); + +// find close points between finished and unfinished ExPolygons +ClosePoint find_close_point(const Point &p, ProjectionDistances &result, std::vector& finished_shapes,const ExPolygonsIndices &s2i, const ExPolygons &shapes); + +} + +float priv::calc_size_sq(const Point &p){ + // NOTE: p.squaredNorm() can't be use due to overflow max int value + return (float) p.x() * p.x() + (float) p.y() * p.y(); +} + +priv::SearchData priv::create_search_data(const ExPolygons &shapes, + const std::vector &mask) +{ + // IMPROVE: Use float precission (it is enough) + SearchData sd; + sd.lines.reserve(mask.size()); + sd.cvt.reserve(mask.size()); + size_t index = 0; + auto add_lines = [&sd, &index, &mask] + (const Polygon &poly) { + Vec2d prev = poly.back().cast(); + bool use_point = mask[index + poly.points.size() - 1]; + for (const Point &p : poly.points) { + if (!use_point) { + use_point = mask[index]; + if (use_point) prev = p.cast(); + } else if (!mask[index]) { + use_point = false; + } else { + Vec2d p_d = p.cast(); + sd.lines.emplace_back(prev, p_d); + sd.cvt.push_back(index); + prev = p_d; + } + ++index; + } + }; + + for (const ExPolygon &shape : shapes) { + add_lines(shape.contour); + for (const Polygon &hole : shape.holes) add_lines(hole); + } + sd.tree = AABBTreeLines::build_aabb_tree_over_indexed_lines(sd.lines); + return sd; +} + +uint32_t priv::get_closest_point_index(const SearchData &sd, + size_t line_idx, + const Vec2d &hit_point, + const ExPolygons &shapes, + const ExPolygonsIndices &s2i) +{ + const Linef &line = sd.lines[line_idx]; + Vec2d dir = line.a - line.b; + Vec2d dir_abs = dir.cwiseAbs(); + // use x coordinate + int i = (dir_abs.x() > dir_abs.y())? 0 :1; + + bool use_index = abs(line.a[i] - hit_point[i]) > + abs(line.b[i] - hit_point[i]); + size_t point_index = sd.cvt[line_idx]; + + // Lambda used only for check result + [[maybe_unused]] auto is_same = [&s2i, &shapes] + (const Vec2d &p, size_t i) -> bool { + auto id = s2i.cvt(i); + const ExPolygon &shape = shapes[id.expolygons_index]; + const Polygon &poly = (id.polygon_index == 0) ? + shape.contour : + shape.holes[id.polygon_index - 1]; + Vec2i p_ = p.cast(); + return p_ == poly[id.point_index]; + }; + + if (use_index) { + assert(is_same(line.b, point_index)); + return point_index; + } + auto id = s2i.cvt(point_index); + if (id.point_index != 0) { + assert(is_same(line.a, point_index - 1)); + return point_index - 1; + } + const ExPolygon &shape = shapes[id.expolygons_index]; + size_t count_polygon_points = (id.polygon_index == 0) ? + shape.contour.size() : + shape.holes[id.polygon_index - 1].size(); + size_t prev_point_index = point_index + (count_polygon_points - 1); + assert(is_same(line.a, prev_point_index)); + // return previous point index + return prev_point_index; +} + +// use AABB Tree Lines +uint32_t priv::find_closest_point_index(const Point &p, + const ExPolygons &shapes, + const ExPolygonsIndices &s2i, + const std::vector &mask) +{ + SearchData sd = create_search_data(shapes, mask); + size_t line_idx = std::numeric_limits::max(); + Vec2d hit_point; + Vec2d p_d = p.cast(); + [[maybe_unused]] double distance_sq = + AABBTreeLines::squared_distance_to_indexed_lines( + sd.lines, sd.tree, p_d, line_idx, hit_point); + assert(distance_sq > 0); + + // IMPROVE: one could use line ratio to find closest point + return get_closest_point_index(sd, line_idx, hit_point, shapes, s2i); +} + +std::pair priv::find_closest_point_pair( + const ExPolygons &shapes, + const std::vector &done_shapes, + const ExPolygonsIndices &s2i, + const std::vector &mask) +{ + assert(mask.size() == s2i.get_count()); + assert(done_shapes.size() == shapes.size()); + std::vector unfinished_mask = mask; // copy + + size_t index = 0; + for (size_t shape_index = 0; shape_index < shapes.size(); shape_index++) { + size_t count = count_points(shapes[shape_index]); + if (done_shapes[shape_index]) { + for (size_t i = 0; i < count; ++i, ++index) + unfinished_mask[index] = false; + } else { + index += count; + } + } + assert(index == s2i.get_count()); + SearchData sd = create_search_data(shapes, unfinished_mask); + + struct ClosestPair + { + size_t finish_idx = std::numeric_limits::max(); + size_t unfinished_line_idx = std::numeric_limits::max(); + Vec2d hit_point = Vec2d(); + double distance_sq = std::numeric_limits::max(); + } cp; + + index = 0; + for (size_t shape_index = 0; shape_index < shapes.size(); shape_index++) { + const ExPolygon shape = shapes[shape_index]; + if (!done_shapes[shape_index]) { + index += count_points(shape); + continue; + } + + auto search_in_polygon = [&index, &cp, &sd, &mask](const Polygon& polygon) { + for (size_t i = 0; i < polygon.size(); ++i, ++index) { + if (mask[index] == false) continue; + Vec2d p_d = polygon[i].cast(); + size_t line_idx = std::numeric_limits::max(); + Vec2d hit_point; + double distance_sq = AABBTreeLines::squared_distance_to_indexed_lines( + sd.lines, sd.tree, p_d, line_idx, hit_point, cp.distance_sq); + if (distance_sq < 0 || + distance_sq >= cp.distance_sq) continue; + assert(line_idx < sd.lines.size()); + cp.distance_sq = distance_sq; + cp.unfinished_line_idx = line_idx; + cp.hit_point = hit_point; + cp.finish_idx = index; + } + }; + search_in_polygon(shape.contour); + for (const Polygon& hole: shape.holes) + search_in_polygon(hole); + } + assert(index == s2i.get_count()); + // check that exists result + if (cp.finish_idx == std::numeric_limits::max()) { + return std::make_pair(std::numeric_limits::max(), + std::numeric_limits::max()); + } + + size_t unfinished_idx = get_closest_point_index(sd, cp.unfinished_line_idx, cp.hit_point, shapes, s2i); + return std::make_pair(cp.finish_idx, unfinished_idx); +} + +const priv::ProjectionDistance *priv::get_closest_projection( + const ProjectionDistances &distance, float wanted_distance) +{ + // minimal distance + float min_d = std::numeric_limits::max(); + const ProjectionDistance *min_pd = nullptr; + for (const ProjectionDistance &pd : distance) { + float d = std::fabs(pd.distance - wanted_distance); + // There should be limit for maximal distance + if (min_d > d) { + min_d = d; + min_pd = &pd; + } + } + return min_pd; +} + +void priv::fill_polygon_distances(const ProjectionDistance &pd, + uint32_t index, + const ExPolygonsIndex &id, + ProjectionDistances &result, + const ExPolygon &shape, + const VDistances &distances) +{ + const Points& points = (id.polygon_index == 0) ? + shape.contour.points : + shape.holes[id.polygon_index - 1].points; + // border of indexes for Polygon + uint32_t first_index = index - id.point_index; + uint32_t last_index = first_index + points.size(); + + uint32_t act_index = index; + const ProjectionDistance* act_pd = &pd; + + // Copy starting pd to result + result[act_index] = pd; + + auto exist_next = [&distances, &act_index, &act_pd, &result] + (uint32_t nxt_index) { + const ProjectionDistance *nxt_pd = get_closest_projection(distances[nxt_index] ,act_pd->distance); + // exist next projection distance ? + if (nxt_pd == nullptr) return false; + + // check no rewrite result + assert(result[nxt_index].aoi_index == std::numeric_limits::max()); + // copy founded projection to result + result[nxt_index] = *nxt_pd; // copy + + // next + act_index = nxt_index; + act_pd = &result[nxt_index]; + return true; + }; + + // last index in circle + uint32_t finish_index = (index == first_index) ? (last_index - 1) : + (index - 1); + // Positive iteration inside polygon + do { + uint32_t nxt_index = act_index + 1; + // close loop of indexes inside of contour + if (nxt_index == last_index) nxt_index = first_index; + // check that exist next + if (!exist_next(nxt_index)) break; + } while (act_index != finish_index); + + // when all results for polygon are set no neccessary to iterate negative + if (act_index == finish_index) return; + + act_index = index; + act_pd = &pd; + // Negative iteration inside polygon + do { + uint32_t nxt_index = (act_index == first_index) ? + (last_index-1) : (act_index - 1); + // When iterate negative it must be split to parts + // and can't iterate in circle + assert(nxt_index != index); + // check that exist next + if (!exist_next(nxt_index)) break; + } while (true); +} + +// IMPROVE: when select distance fill in all distances from Patch +void priv::fill_shape_distances(uint32_t start_index, + const ProjectionDistance *start_pd, + ProjectionDistances &result, + const ExPolygonsIndices &s2i, + const ExPolygon &shape, + const VDistances &distances) +{ + uint32_t expolygons_index = s2i.cvt(start_index).expolygons_index; + uint32_t first_shape_index = s2i.cvt({expolygons_index, 0, 0}); + do { + fill_polygon_distances(*start_pd, start_index, s2i.cvt(start_index),result, shape, distances); + // seaching only inside shape, return index of closed finished point + auto find_close_finished_point = [&first_shape_index, &shape, &result] + (const Point &p) -> ClosePoint { + uint32_t index = first_shape_index; + ClosePoint cp; + auto check_finished_points = [&cp, &result, &index, &p] + (const Points& pts) { + for (const Point &p_ : pts) { + // finished point with some distances + if (result[index].aoi_index == std::numeric_limits::max()) { + ++index; + continue; + } + float distance = calc_size_sq(p_ - p); + if (cp.dist_sq > distance) { + cp.dist_sq = distance; + cp.index = index; + } + ++index; + } + }; + check_finished_points(shape.contour.points); + for (const Polygon &h : shape.holes) + check_finished_points(h.points); + return cp; + }; + + // find next closest pair of points + // (finished + unfinished) in ExPolygon + start_index = std::numeric_limits::max(); // unfinished_index + uint32_t finished_index = std::numeric_limits::max(); + float dist_sq = std::numeric_limits::max(); + + // first index in shape + uint32_t index = first_shape_index; + auto check_unfinished_points = [&index, &result, &distances, &find_close_finished_point, &dist_sq, &start_index, &finished_index] + (const Points& pts) { + for (const Point &p : pts) { + // try find unfinished + if (result[index].aoi_index != + std::numeric_limits::max() || + distances[index].empty()) { + ++index; + continue; + } + ClosePoint cp = find_close_finished_point(p); + if (dist_sq > cp.dist_sq) { + dist_sq = cp.dist_sq; + start_index = index; + finished_index = cp.index; + } + ++index; + } + }; + // for each unfinished points + check_unfinished_points(shape.contour.points); + for (const Polygon &h : shape.holes) + check_unfinished_points(h.points); + } while (start_index != std::numeric_limits::max()); +} + +priv::ClosePoint priv::find_close_point(const Point &p, + ProjectionDistances &result, + std::vector &finished_shapes, + const ExPolygonsIndices &s2i, + const ExPolygons &shapes) +{ + // result + ClosePoint cp; + // for all finished points + for (uint32_t shape_index = 0; shape_index < shapes.size(); ++shape_index) { + if (!finished_shapes[shape_index]) continue; + const ExPolygon &shape = shapes[shape_index]; + uint32_t index = s2i.cvt({shape_index, 0, 0}); + auto find_close_point_in_points = [&p, &cp, &index, &result] + (const Points &pts){ + for (const Point &p_ : pts) { + // Exist result (is finished) ? + if (result[index].aoi_index == + std::numeric_limits::max()) { + ++index; + continue; + } + float distance_sq = calc_size_sq(p - p_); + if (cp.dist_sq > distance_sq) { + cp.dist_sq = distance_sq; + cp.index = index; + } + ++index; + } + }; + find_close_point_in_points(shape.contour.points); + // shape could be inside of another shape's hole + for (const Polygon& h:shape.holes) + find_close_point_in_points(h.points); + } + return cp; +} + +// IMPROVE: when select distance fill in all distances from Patch +priv::ProjectionDistances priv::choose_best_distance( + const VDistances &distances, const ExPolygons &shapes, const Point &start, const ExPolygonsIndices &s2i, const SurfacePatches &patches) +{ + assert(distances.size() == count_points(shapes)); + + // vector of patches for shape + std::vector> shapes_patches(shapes.size()); + for (const SurfacePatch &patch : patches) + shapes_patches[patch.shape_id].push_back(&patch-&patches.front()); + + // collect one closest projection for each outline point + ProjectionDistances result(distances.size()); + + // store info about finished shapes + std::vector finished_shapes(shapes.size(), {false}); + + // wanted distance from ideal projection + // Distances are relative to projection distance + // so first wanted distance is the closest one (ZERO) + float wanted_distance = 0.f; + + std::vector mask_distances(s2i.get_count(), {true}); + for (const auto &d : distances) + if (d.empty()) mask_distances[&d - &distances.front()] = false; + + // Select point from shapes(text contour) which is closest to center (all in 2d) + uint32_t unfinished_index = find_closest_point_index(start, shapes, s2i, mask_distances); + +#ifdef DEBUG_OUTPUT_DIR + Connections connections; + connections.reserve(shapes.size()); + connections.emplace_back(unfinished_index, unfinished_index); +#endif // DEBUG_OUTPUT_DIR + + do { + const ProjectionDistance* pd = get_closest_projection(distances[unfinished_index], wanted_distance); + // selection of closest_id should proove that pd has value + // (functions: get_closest_point_index and find_close_point_in_points) + assert(pd != nullptr); + uint32_t expolygons_index = s2i.cvt(unfinished_index).expolygons_index; + const ExPolygon &shape = shapes[expolygons_index]; + std::vector &shape_patches = shapes_patches[expolygons_index]; + if (shape_patches.size() == 1){ + // Speed up, only one patch so copy distance from patch + uint32_t first_shape_index = s2i.cvt({expolygons_index, 0, 0}); + uint32_t laset_shape_index = first_shape_index + count_points(shape); + for (uint32_t i = first_shape_index; i < laset_shape_index; ++i) { + const ProjectionDistances &pds = distances[i]; + if (pds.empty()) continue; + // check that index belongs to patch + assert(pds.front().patch_index == shape_patches.front()); + result[i] = pds.front(); + if (pds.size() == 1) continue; + + float relative_distance = fabs(result[i].distance - pd->distance); + // patch could contain multiple value for one outline point + // so choose closest to start point + for (uint32_t pds_index = 1; pds_index < pds.size(); ++pds_index) { + // check that index still belongs to same patch + assert(pds[pds_index].patch_index == shape_patches.front()); + float relative_distance2 = fabs(pds[pds_index].distance - pd->distance); + if (relative_distance > relative_distance2) { + relative_distance = relative_distance2; + result[i] = pds[pds_index]; + } + } + } + } else { + // multiple patches for expolygon + // check that exist patch to fill shape + assert(!shape_patches.empty()); + fill_shape_distances(unfinished_index, pd, result, s2i, shape, distances); + } + + finished_shapes[expolygons_index] = true; + // The most close points between finished and unfinished shapes + auto [finished, unfinished] = find_closest_point_pair( + shapes, finished_shapes, s2i, mask_distances); + + // detection of end (best doesn't have value) + if (finished == std::numeric_limits::max()) break; + + assert(unfinished != std::numeric_limits::max()); + const ProjectionDistance &closest_pd = result[finished]; + // check that best_cp is finished and has result + assert(closest_pd.aoi_index != std::numeric_limits::max()); + wanted_distance = closest_pd.distance; + unfinished_index = unfinished; + +#ifdef DEBUG_OUTPUT_DIR + connections.emplace_back(finished, unfinished); +#endif // DEBUG_OUTPUT_DIR + } while (true); //(unfinished_index != std::numeric_limits::max()); +#ifdef DEBUG_OUTPUT_DIR + store(shapes, mask_distances, connections, DEBUG_OUTPUT_DIR + "closest_points.svg"); +#endif // DEBUG_OUTPUT_DIR + return result; +} + +// functions to help 'diff_model' +namespace priv { +const VI default_vi(std::numeric_limits::max()); + +// Keep info about intersection source +struct Source{ HI hi; int sdim=0;}; +using Sources = std::vector; +const std::string vertex_source_map_name = "v:SourceIntersecting"; +using VertexSourceMap = CutMesh::Property_map; + +/// +/// Corefine visitor +/// Store intersection source for vertices of constrained edge of tm1 +/// Must be used with corefine flag no modification of tm2 +/// +struct IntersectionSources +{ + const CutMesh *patch; // patch + const CutMesh *model; // const model + + VertexSourceMap vmap; + + // keep sources from call intersection_point_detected + // until call new_vertex_added + Sources* sources; + + // count intersections + void intersection_point_detected(std::size_t i_id, + int sdim, + HI h_f, + HI h_e, + const CutMesh &tm_f, + const CutMesh &tm_e, + bool is_target_coplanar, + bool is_source_coplanar) + { + Source source; + if (&tm_e == model) { + source = {h_e, sdim}; + // check other CGAL model that is patch + assert(&tm_f == patch); + if (is_target_coplanar) { + assert(sdim == 0); + vmap[tm_f.source(h_f)] = source; + } + if (is_source_coplanar) { + assert(sdim == 0); + vmap[tm_f.target(h_f)] = source; + } + + // clear source to be able check that this intersection source is + // not used any more + if (is_source_coplanar || is_target_coplanar) source = {}; + } else { + source = {h_f, sdim}; + assert(&tm_f == model && &tm_e == patch); + assert(!is_target_coplanar); + assert(!is_source_coplanar); + // if (is_target_coplanar) vmap[tm_e.source(h_e)] = source; + // if (is_source_coplanar) vmap[tm_e.target(h_e)] = source; + // if (sdim == 0) + // vmap[tm_e.target(h_e)] = source; + } + + // By documentation i_id is consecutive. + // check id goes in a row, without skips + assert(sources->size() == i_id); + // add source of intersection + sources->push_back(source); + } + + /// + /// Store VI to intersections by i_id + /// + /// Order number of intersection point + /// New added vertex + /// Affected mesh + void new_vertex_added(std::size_t i_id, VI v, const CutMesh &tm) + { + // check that it is first insertation into item of vmap + assert(!vmap[v].hi.is_valid()); + // check valid addresing into sources + assert(i_id < sources->size()); + // check that source has value + assert(sources->at(i_id).hi.is_valid()); + vmap[v] = sources->at(i_id); + } + + // Not used visitor functions + void before_subface_creations(FI /* f_old */, CutMesh & /* mesh */) {} + void after_subface_created(FI /* f_new */, CutMesh & /* mesh */) {} + void after_subface_creations(CutMesh &) {} + void before_subface_created(CutMesh &) {} + void before_edge_split(HI /* h */, CutMesh & /* tm */) {} + void edge_split(HI /* hnew */, CutMesh & /* tm */) {} + void after_edge_split() {} + void add_retriangulation_edge(HI /* h */, CutMesh & /* tm */) {} +}; + +/// +/// Create map1 and map2 +/// +/// Convert tm1.face to type +/// Corefined mesh +/// Source of intersection +/// Identify constrainde edge +/// Convert tm1.face to type +void create_face_types(FaceTypeMap &map, + const CutMesh &tm1, + const CutMesh &tm2, + const EdgeBoolMap &ecm, + const VertexSourceMap &sources); + +/// +/// Implement 'cut' Minus 'clipper', where clipper is reverse input Volume +/// NOTE: clipper will be modified (corefined by cut) !!! +/// +/// differ from +/// differ what +/// True on succes, otherwise FALSE +bool clip_cut(SurfacePatch &cut, CutMesh clipper); + +BoundingBoxf3 bounding_box(const CutAOI &cut, const CutMesh &mesh); +BoundingBoxf3 bounding_box(const CutMesh &mesh); +BoundingBoxf3 bounding_box(const SurfacePatch &ecut); + +/// +/// Create patch +/// +/// Define patch faces +/// Source of fis +/// NOTE: Need temporary add property map for convert vertices +/// Options to reduce vertices from fis. +/// NOTE: Used for skip vertices made by diagonal edge in rectangle of shape side +/// Patch +SurfacePatch create_surface_patch(const std::vector &fis, + /*const*/ CutMesh &mesh, + const ReductionMap *rmap = nullptr); + +} // namespace priv + +void priv::create_face_types(FaceTypeMap &map, + const CutMesh &tm1, + const CutMesh &tm2, + const EdgeBoolMap &ecm, + const VertexSourceMap &sources) +{ + auto get_intersection_source = [&tm2](const Source& s1, const Source& s2)->FI{ + // when one of sources is face than return it + FI fi1 = tm2.face(s1.hi); + if (s1.sdim == 2) return fi1; + FI fi2 = tm2.face(s2.hi); + if (s2.sdim == 2) return fi2; + // both vertices are made by same source triangle + if (fi1 == fi2) return fi1; + + // when one from sources is edge second one decide side of triangle triangle + HI hi1_opposit = tm2.opposite(s1.hi); + FI fi1_opposit; + if (hi1_opposit.is_valid()) + fi1_opposit = tm2.face(hi1_opposit); + if (fi2 == fi1_opposit) return fi2; + + HI hi2_opposit = tm2.opposite(s2.hi); + FI fi2_opposit; + if (hi2_opposit.is_valid()) + fi2_opposit = tm2.face(hi2_opposit); + if (fi1 == fi2_opposit) return fi1; + if (fi1_opposit.is_valid() && fi1_opposit == fi2_opposit) + return fi1_opposit; + + // when intersection is vertex need loop over neighbor + for (FI fi_around_hi1 : tm2.faces_around_target(s1.hi)) { + for (FI fi_around_hi2 : tm2.faces_around_target(s2.hi)) { + if (fi_around_hi1 == fi_around_hi2) + return fi_around_hi1; + } + } + + // should never rich it + // Exist case when do not know source triangle for decide side of intersection + assert(false); + return FI(); + }; + + for (FI fi : tm1.faces()) map[fi] = FaceType::not_constrained; + for (EI ei1 : tm1.edges()) { + if (!get(ecm, ei1)) continue; + + // get faces from tm1 (f1a + f1b) + HI hi1 = tm1.halfedge(ei1); + assert(hi1.is_valid()); + FI f1a = tm1.face(hi1); + assert(f1a.is_valid()); + HI hi_op = tm1.opposite(hi1); + assert(hi_op.is_valid()); + FI f1b = tm1.face(hi_op); + assert(f1b.is_valid()); + + // get faces from tm2 (f2a + f2b) + VI vi1_source = tm1.source(hi1); + assert(vi1_source.is_valid()); + VI vi1_target = tm1.target(hi1); + assert(vi1_target.is_valid()); + + const Source &s_s = sources[vi1_source]; + const Source &s_t = sources[vi1_target]; + FI fi2 = get_intersection_source(s_s, s_t); + + // in release solve situation that face was NOT deduced + if (!fi2.is_valid()) continue; + + HI hi2 = tm2.halfedge(fi2); + std::array t; + size_t ti =0; + for (VI vi2 : tm2.vertices_around_face(hi2)) + t[ti++] = &tm2.point(vi2); + + // triangle tip from face f1a + VI vi1a_tip = tm1.target(tm1.next(hi1)); + assert(vi1a_tip.is_valid()); + const P3 &p = tm1.point(vi1a_tip); + + // check if f1a is behinde f2a + // inside mean it will be used + // outside will be discarded + if (CGAL::orientation(*t[0], *t[1], *t[2], p) == CGAL::POSITIVE) { + map[f1a] = FaceType::inside; + map[f1b] = FaceType::outside; + } else { + map[f1a] = FaceType::outside; + map[f1b] = FaceType::inside; + } + } +} + +#include +#include +bool priv::clip_cut(SurfacePatch &cut, CutMesh clipper) +{ + CutMesh& tm = cut.mesh; + // create backup for case that there is no intersection + CutMesh backup_copy = tm; + + class ExistIntersectionClipVisitor: public CGAL::Polygon_mesh_processing::Corefinement::Default_visitor + { + bool* exist_intersection; + public: + ExistIntersectionClipVisitor(bool *exist_intersection): exist_intersection(exist_intersection){} + void intersection_point_detected(std::size_t, int , HI, HI, const CutMesh&, const CutMesh&, bool, bool) + { *exist_intersection = true;} + }; + bool exist_intersection = false; + ExistIntersectionClipVisitor visitor{&exist_intersection}; + + // namep parameters for model tm and function clip + const auto &np_tm = CGAL::parameters::visitor(visitor) + .throw_on_self_intersection(false); + + // name parameters for model clipper and function clip + const auto &np_c = CGAL::parameters::throw_on_self_intersection(false); + // Can't use 'do_not_modify', when Ture than clipper has to be closed !! + // .do_not_modify(true); + // .throw_on_self_intersection(false); is set automaticaly by param 'do_not_modify' + // .clip_volume(false); is set automaticaly by param 'do_not_modify' + + bool suc = CGAL::Polygon_mesh_processing::clip(tm, clipper, np_tm, np_c); + + // true if the output surface mesh is manifold. + // If false is returned tm and clipper are only corefined. + assert(suc); + // decide what TODO when can't clip source object !?! + if (!exist_intersection || !suc) { + // TODO: test if cut is fully in or fully out!! + cut.mesh = backup_copy; + return false; + } + return true; +} + +BoundingBoxf3 priv::bounding_box(const CutAOI &cut, const CutMesh &mesh) { + const P3& p_from_cut = mesh.point(mesh.target(mesh.halfedge(cut.first.front()))); + Vec3d min = to_vec3d(p_from_cut); + Vec3d max = min; + for (FI fi : cut.first) { + for(VI vi: mesh.vertices_around_face(mesh.halfedge(fi))){ + const P3& p = mesh.point(vi); + for (size_t i = 0; i < 3; ++i) { + if (min[i] > p[i]) min[i] = p[i]; + if (max[i] < p[i]) max[i] = p[i]; + } + } + } + return BoundingBoxf3(min, max); +} + +BoundingBoxf3 priv::bounding_box(const CutMesh &mesh) +{ + Vec3d min = to_vec3d(*mesh.points().begin()); + Vec3d max = min; + for (VI vi : mesh.vertices()) { + const P3 &p = mesh.point(vi); + for (size_t i = 0; i < 3; ++i) { + if (min[i] > p[i]) min[i] = p[i]; + if (max[i] < p[i]) max[i] = p[i]; + } + } + return BoundingBoxf3(min, max); +} + +BoundingBoxf3 priv::bounding_box(const SurfacePatch &ecut) { + return bounding_box(ecut.mesh); +} + +priv::SurfacePatch priv::create_surface_patch(const std::vector &fis, + /* const */ CutMesh &mesh, + const ReductionMap *rmap) +{ + auto is_counted = mesh.add_property_map("v:is_counted").first; + uint32_t count_vertices = 0; + if (rmap == nullptr) { + for (FI fi : fis) + for (VI vi : mesh.vertices_around_face(mesh.halfedge(fi))) + if (!is_counted[vi]) { + is_counted[vi] = true; + ++count_vertices; + } + } else { + for (FI fi : fis) + for (VI vi : mesh.vertices_around_face(mesh.halfedge(fi))) { + // Will vertex be reduced? + if ((*rmap)[vi].is_valid()) continue; + if (!is_counted[vi]) { + is_counted[vi] = true; + ++count_vertices; + } + } + } + mesh.remove_property_map(is_counted); + + uint32_t count_faces = fis.size(); + // IMPROVE: Value is greater than neccessary, count edges used twice + uint32_t count_edges = count_faces*3; + + CutMesh cm; + cm.reserve(count_vertices, count_edges, count_faces); + + // vertex conversion function from mesh VI to result VI + CvtVI2VI mesh2result = mesh.add_property_map("v:mesh2result").first; + + if (rmap == nullptr) { + for (FI fi : fis) { + std::array t; + int index = 0; + for (VI vi : mesh.vertices_around_face(mesh.halfedge(fi))) { + VI &vi_cvt = mesh2result[vi]; + if (!vi_cvt.is_valid()) { + vi_cvt = VI(cm.vertices().size()); + cm.add_vertex(mesh.point(vi)); + } + t[index++] = vi_cvt; + } + cm.add_face(t[0], t[1], t[2]); + } + } else { + for (FI fi :fis) { + std::array t; + int index = 0; + bool exist_reduction = false; + for (VI vi : mesh.vertices_around_face(mesh.halfedge(fi))) { + VI vi_r = (*rmap)[vi]; + if (vi_r.is_valid()) { + exist_reduction = true; + vi = vi_r; + } + VI &vi_cvt = mesh2result[vi]; + if (!vi_cvt.is_valid()) { + vi_cvt = VI(cm.vertices().size()); + cm.add_vertex(mesh.point(vi)); + } + t[index++] = vi_cvt; + } + + // prevent add reduced triangle + if (exist_reduction && + (t[0] == t[1] || + t[1] == t[2] || + t[2] == t[0])) + continue; + + cm.add_face(t[0], t[1], t[2]); + } + } + + assert(count_vertices == cm.vertices().size()); + assert((rmap == nullptr && count_faces == cm.faces().size()) || + (rmap != nullptr && count_faces >= cm.faces().size())); + assert(count_edges >= cm.edges().size()); + + // convert VI from this patch to source VI, when exist + CvtVI2VI cvt = cm.add_property_map(patch_source_name).first; + // vi_s .. VertexIndex into mesh (source) + // vi_d .. new VertexIndex in cm (destination) + for (VI vi_s : mesh.vertices()) { + VI vi_d = mesh2result[vi_s]; + if (!vi_d.is_valid()) continue; + cvt[vi_d] = vi_s; + } + mesh.remove_property_map(mesh2result); + return {std::move(cm)}; +} + +// diff_models help functions +namespace priv { + +struct SurfacePatchEx +{ + SurfacePatch patch; + + // flag that part will be deleted + bool full_inside = false; + // flag that Patch could contain more than one part + bool just_cliped = false; +}; +using SurfacePatchesEx = std::vector; + + +using BBS = std::vector; +/// +/// Create bounding boxes for AOI +/// +/// Cutted AOI from models +/// Source points of cuts +/// Bounding boxes +BBS create_bbs(const VCutAOIs &cuts, const CutMeshes &cut_models); + +using Primitive = CGAL::AABB_face_graph_triangle_primitive; +using Traits = CGAL::AABB_traits; +using Ray = EpicKernel::Ray_3; +using Tree = CGAL::AABB_tree; +using Trees = std::vector; +/// +/// Create AABB trees for check when patch is whole inside of model +/// +/// Source for trees +/// trees +Trees create_trees(const CutMeshes &models); + +/// +/// Check whether bounding box has intersection with model +/// +/// Bounding box to check +/// Model to check with +/// All bounding boxes from VCutAOIs +/// Help index into VCutAOIs +/// True when exist bounding boxes intersection +bool has_bb_intersection(const BoundingBoxf3 &bb, + size_t model_index, + const BBS &bbs, + const ModelCut2index &m2i); + +/// +/// Only for model without intersection +/// Use ray (in projection direction) from a point from patch +/// and count intersections: pair .. outside | odd .. inside +/// +/// Patch to check +/// Model converted to AABB tree +/// Define direction of projection +/// True when patch point lay inside of model defined by tree, +/// otherwise FALSE +bool is_patch_inside_of_model(const SurfacePatch &patch, + const Tree &tree, + const Project3d &projection); + +/// +/// Return some shape point index which identify shape +/// NOTE: Used to find expolygon index +/// +/// Used to search source shapes poin +/// +/// shape point index +uint32_t get_shape_point_index(const CutAOI &cut, const CutMesh &model); + +using PatchNumber = CutMesh::Property_map; +/// +/// Separate triangles singned with number n +/// +/// Face indices owned by separate patch +/// Original patch +/// NOTE: Can't be const. For indexing vetices need temporary add property map +/// conversion map +/// Just separated patch +SurfacePatch separate_patch(const std::vector &fis, + /* const*/ SurfacePatch &patch, + const CvtVI2VI &cvt_from); + +/// +/// Separate connected triangles into it's own patches +/// new patches are added to back of input patches +/// +/// index into patches +/// In/Out Patches +void divide_patch(size_t i, SurfacePatchesEx &patches); + +/// +/// Fill outline in patches by open edges +/// +/// Input/Output meshes with open edges +void collect_open_edges(SurfacePatches &patches); + +} // namespace priv + +std::vector priv::create_bbs(const VCutAOIs &cuts, + const CutMeshes &cut_models) +{ + size_t count = 0; + for (const CutAOIs &cut : cuts) count += cut.size(); + + std::vector bbs; + bbs.reserve(count); + for (size_t model_index = 0; model_index < cut_models.size(); ++model_index) { + const CutMesh &cut_model = cut_models[model_index]; + const CutAOIs &cutAOIs = cuts[model_index]; + for (size_t cut_index = 0; cut_index < cutAOIs.size(); ++cut_index) { + const CutAOI &cut = cutAOIs[cut_index]; + bbs.push_back(bounding_box(cut, cut_model)); + } + } + return bbs; +} + + +priv::Trees priv::create_trees(const CutMeshes &models) { + Trees result; + result.reserve(models.size()); + for (const CutMesh &model : models) { + Tree tree; + tree.insert(faces(model).first, faces(model).second, model); + tree.build(); + result.emplace_back(std::move(tree)); + } + return result; +} + +bool priv::has_bb_intersection(const BoundingBoxf3 &bb, + size_t model_index, + const BBS &bbs, + const ModelCut2index &m2i) +{ + const auto&offsets = m2i.get_offsets(); + // for cut index with model_index2 + size_t start = offsets[model_index]; + size_t next = model_index + 1; + size_t end = (next < offsets.size()) ? offsets[next] : m2i.get_count(); + for (size_t bb_index = start; bb_index < end; bb_index++) + if (bb.intersects(bbs[bb_index])) return true; + return false; +} + +bool priv::is_patch_inside_of_model(const SurfacePatch &patch, + const Tree &tree, + const Project3d &projection) +{ + // TODO: Solve model with hole in projection direction !!! + const P3 &a = patch.mesh.point(VI(0)); + Vec3d a_ = to_vec3d(a); + Vec3d b_ = projection.project(a_); + P3 b(b_.x(), b_.y(), b_.z()); + + Ray ray_query(a, b); + size_t count = tree.number_of_intersected_primitives(ray_query); + bool is_in = (count % 2) == 1; + + // try opposit direction result should be same, otherwise open model is used + //Vec3f c_ = a_ - (b_ - a_); // opposit direction + //P3 c(c_.x(), c_.y(), c_.z()); + //Ray ray_query2(a, b); + //size_t count2 = tree.number_of_intersected_primitives(ray_query2); + //bool is_in2 = (count2 % 2) == 1; + assert(((tree.number_of_intersected_primitives( + Ray(a, P3(2 * a.x() - b.x(), + 2 * a.y() - b.y(), + 2 * a.z() - b.z()))) % + 2) == 1) == is_in); + return is_in; +} + +uint32_t priv::get_shape_point_index(const CutAOI &cut, const CutMesh &model) +{ + // map is created during intersection by corefine visitor + const VertexShapeMap &vert_shape_map = model.property_map(vert_shape_map_name).first; + // for each half edge of outline + for (HI hi : cut.second) { + VI vi = model.source(hi); + const IntersectingElement *ie = vert_shape_map[vi]; + if (ie == nullptr) continue; + assert(ie->shape_point_index != std::numeric_limits::max()); + return ie->shape_point_index; + } + // can't found any intersecting element in cut + assert(false); + return 0; +} + +priv::SurfacePatch priv::separate_patch(const std::vector& fis, + SurfacePatch &patch, + const CvtVI2VI &cvt_from) +{ + assert(patch.mesh.is_valid()); + SurfacePatch patch_new = create_surface_patch(fis, patch.mesh); + patch_new.bb = bounding_box(patch_new.mesh); + patch_new.aoi_id = patch.aoi_id; + patch_new.model_id = patch.model_id; + patch_new.shape_id = patch.shape_id; + // fix cvt + CvtVI2VI cvt = patch_new.mesh.property_map(patch_source_name).first; + for (VI &vi : cvt) { + if (!vi.is_valid()) continue; + vi = cvt_from[vi]; + } + return patch_new; +} + +void priv::divide_patch(size_t i, SurfacePatchesEx &patches) +{ + SurfacePatchEx &patch_ex = patches[i]; + assert(patch_ex.just_cliped); + patch_ex.just_cliped = false; + + SurfacePatch& patch = patch_ex.patch; + CutMesh& cm = patch.mesh; + assert(!cm.faces().empty()); + std::string patch_number_name = "f:patch_number"; + CutMesh::Property_map is_processed = cm.add_property_map(patch_number_name, false).first; + + const CvtVI2VI& cvt_from = patch.mesh.property_map(patch_source_name).first; + + std::vector fis; + fis.reserve(cm.faces().size()); + + SurfacePatchesEx new_patches; + std::vector queue; + // IMPROVE: create groups around triangles and than connect groups + for (FI fi_cm : cm.faces()) { + if (is_processed[fi_cm]) continue; + assert(queue.empty()); + queue.push_back(fi_cm); + if (!fis.empty()) { + // Be carefull after push to patches, + // all ref on patch contain non valid values + SurfacePatchEx patch_ex_n; + patch_ex_n.patch = separate_patch(fis, patch, cvt_from); + patch_ex_n.patch.is_whole_aoi = false; + new_patches.push_back(std::move(patch_ex_n)); + fis.clear(); + } + // flood fill from triangle fi_cm to surrounding + do { + FI fi_q = queue.back(); + queue.pop_back(); + if (is_processed[fi_q]) continue; + is_processed[fi_q] = true; + fis.push_back(fi_q); + HI hi = cm.halfedge(fi_q); + for (FI fi : cm.faces_around_face(hi)) { + // by documentation The face descriptor may be the null face, and it may be several times the same face descriptor. + if (!fi.is_valid()) continue; + if (!is_processed[fi]) queue.push_back(fi); + } + } while (!queue.empty()); + } + cm.remove_property_map(is_processed); + assert(!fis.empty()); + + // speed up for only one patch - no dividing (the most common) + if (new_patches.empty()) { + patch.bb = bounding_box(cm); + patch.is_whole_aoi = false; + } else { + patch = separate_patch(fis, patch, cvt_from); + patches.insert(patches.end(), new_patches.begin(), new_patches.end()); + } +} + +void priv::collect_open_edges(SurfacePatches &patches) { + std::vector open_half_edges; + for (SurfacePatch &patch : patches) { + open_half_edges.clear(); + const CutMesh &mesh = patch.mesh; + for (FI fi : mesh.faces()) { + HI hi1 = mesh.halfedge(fi); + assert(hi1.is_valid()); + HI hi2 = mesh.next(hi1); + assert(hi2.is_valid()); + HI hi3 = mesh.next(hi2); + assert(hi3.is_valid()); + // Is fi triangle? + assert(mesh.next(hi3) == hi1); + for (HI hi : {hi1, hi2, hi3}) { + HI hi_op = mesh.opposite(hi); + FI fi_op = mesh.face(hi_op); + if (!fi_op.is_valid()) + open_half_edges.push_back(hi); + } + } + patch.loops = create_loops(open_half_edges, mesh); + } +} + +priv::SurfacePatches priv::diff_models(VCutAOIs &cuts, + /*const*/ CutMeshes &cut_models, + /*const*/ CutMeshes &models, + const Project3d &projection) +{ + // IMPROVE: when models contain ONE mesh. It is only about convert cuts to patches + // and reduce unneccessary triangles on contour + + //Convert model_index and cut_index into one index + priv::ModelCut2index m2i(cuts); + + // create bounding boxes for cuts + std::vector bbs = create_bbs(cuts, cut_models); + Trees trees(models.size()); + + SurfacePatches patches; + + // queue of patches for one AOI (permanent with respect to for loop) + SurfacePatchesEx aoi_patches; + + //SurfacePatches aoi_patches; + patches.reserve(m2i.get_count()); // only approximation of count + size_t index = 0; + for (size_t model_index = 0; model_index < models.size(); ++model_index) { + CutAOIs &model_cuts = cuts[model_index]; + CutMesh &cut_model_ = cut_models[model_index]; + const CutMesh &cut_model = cut_model_; + ReductionMap vertex_reduction_map = cut_model_.add_property_map(vertex_reduction_map_name).first; + create_reduce_map(vertex_reduction_map, cut_model); + + for (size_t cut_index = 0; cut_index < model_cuts.size(); ++cut_index, ++index) { + const CutAOI &cut = model_cuts[cut_index]; + SurfacePatchEx patch_ex; + SurfacePatch &patch = patch_ex.patch; + patch = create_surface_patch(cut.first, cut_model_, &vertex_reduction_map); + patch.bb = bbs[index]; + patch.aoi_id = cut_index; + patch.model_id = model_index; + patch.shape_id = get_shape_point_index(cut, cut_model); + patch.is_whole_aoi = true; + + aoi_patches.clear(); + aoi_patches.push_back(patch_ex); + for (size_t model_index2 = 0; model_index2 < models.size(); ++model_index2) { + // do not clip source model itself + if (model_index == model_index2) continue; + for (SurfacePatchEx &patch_ex : aoi_patches) { + SurfacePatch &patch = patch_ex.patch; + if (has_bb_intersection(patch.bb, model_index2, bbs, m2i) && + clip_cut(patch, models[model_index2])){ + patch_ex.just_cliped = true; + } else { + // build tree on demand + // NOTE: it is possible not neccessary: e.g. one model + Tree &tree = trees[model_index2]; + if (tree.empty()) { + const CutMesh &model = models[model_index2]; + auto f_range = faces(model); + tree.insert(f_range.first, f_range.second, model); + tree.build(); + } + if (is_patch_inside_of_model(patch, tree, projection)) + patch_ex.full_inside = true; + } + } + // erase full inside + for (size_t i = aoi_patches.size(); i != 0; --i) { + auto it = aoi_patches.begin() + (i - 1); + if (it->full_inside) aoi_patches.erase(it); + } + + // detection of full AOI inside of model + if (aoi_patches.empty()) break; + + // divide cliped into parts + size_t end = aoi_patches.size(); + for (size_t i = 0; i < end; ++i) + if (aoi_patches[i].just_cliped) + divide_patch(i, aoi_patches); + } + + if (!aoi_patches.empty()) { + patches.reserve(patches.size() + aoi_patches.size()); + for (SurfacePatchEx &patch : aoi_patches) + patches.push_back(std::move(patch.patch)); + + } + } + cut_model_.remove_property_map(vertex_reduction_map); + } + + // Also use outline inside of patches(made by non manifold models) + // IMPROVE: trace outline from AOIs + collect_open_edges(patches); + return patches; +} + +bool priv::is_over_whole_expoly(const SurfacePatch &patch, + const ExPolygons &shapes, + const VCutAOIs &cutAOIs, + const CutMeshes &meshes) +{ + if (!patch.is_whole_aoi) return false; + return is_over_whole_expoly(cutAOIs[patch.model_id][patch.aoi_id], + shapes[patch.shape_id], + meshes[patch.model_id]); +} + +bool priv::is_over_whole_expoly(const CutAOI &cutAOI, + const ExPolygon &shape, + const CutMesh &mesh) +{ + // NonInterupted contour is without other point and contain all from shape + const VertexShapeMap &vert_shape_map = mesh.property_map(vert_shape_map_name).first; + for (HI hi : cutAOI.second) { + const IntersectingElement *ie_s = vert_shape_map[mesh.source(hi)]; + const IntersectingElement *ie_t = vert_shape_map[mesh.target(hi)]; + if (ie_s == nullptr || ie_t == nullptr) + return false; + + assert(ie_s->attr != (unsigned char) IntersectingElement::Type::undefined); + assert(ie_t->attr != (unsigned char) IntersectingElement::Type::undefined); + + // check if it is neighbor indices + uint32_t i_s = ie_s->shape_point_index; + uint32_t i_t = ie_t->shape_point_index; + assert(i_s != std::numeric_limits::max()); + assert(i_t != std::numeric_limits::max()); + if (i_s == std::numeric_limits::max() || + i_t == std::numeric_limits::max()) + return false; + + // made by same index + if (i_s == i_t) continue; + + // order from source to target + if (i_s > i_t) { + std::swap(i_s, i_t); + std::swap(ie_s, ie_t); + } + // Must be after fix order !! + bool is_last_polygon_segment = ie_s->is_first() && ie_t->is_last(); + if (is_last_polygon_segment) { + std::swap(i_s, i_t); + std::swap(ie_s, ie_t); + } + + // Is continous indices + if (!is_last_polygon_segment && + (ie_s->is_last() || (i_s + 1) != i_t)) + return false; + + IntersectingElement::Type t_s = ie_s->get_type(); + IntersectingElement::Type t_t = ie_t->get_type(); + if (t_s == IntersectingElement::Type::undefined || + t_t == IntersectingElement::Type::undefined) + return false; + + // next segment must start with edge intersection + if (t_t != IntersectingElement::Type::edge_1) + return false; + + // After face1 must be edge2 or face2 + if (t_s == IntersectingElement::Type::face_1) + return false; + } + + // When all open edges are on contour than there is NO holes is shape + auto is_open = [&mesh](HI hi)->bool { + HI opposite = mesh.opposite(hi); + return !mesh.face(opposite).is_valid(); + }; + + std::vector opens; // copy + opens.reserve(cutAOI.second.size()); + for (HI hi : cutAOI.second) // from lower to bigger + if (is_open(hi)) opens.push_back(hi); + std::sort(opens.begin(), opens.end()); + + for (FI fi: cutAOI.first) { + HI face_hi = mesh.halfedge(fi); + for (HI hi : mesh.halfedges_around_face(face_hi)) { + if (!is_open(hi)) continue; + // open edge + auto lb = std::lower_bound(opens.begin(), opens.end(), hi); + if (lb == opens.end() || *lb != hi) + return false; // not in contour + } + } + return true; +} + +std::vector priv::select_patches(const ProjectionDistances &best_distances, + const SurfacePatches &patches, + + const ExPolygons &shapes, + const ExPolygonsIndices &s2i, + const VCutAOIs &cutAOIs, + const CutMeshes &meshes, + const Project &projection) +{ + // extension to cover numerical mistake made by back projection patch from 3d to 2d + const float extend_delta = 5.f / Emboss::SHAPE_SCALE; // [Font points scaled by Emboss::SHAPE_SCALE] + + // vector of patches for shape + std::vector> used_shapes_patches(shapes.size()); + std::vector in_distances(patches.size(), {false}); + for (const ProjectionDistance &d : best_distances) { + // exist valid projection for shape point? + if (d.patch_index == std::numeric_limits::max()) continue; + if (in_distances[d.patch_index]) continue; + in_distances[d.patch_index] = true; + + ExPolygonsIndex id = s2i.cvt(&d - &best_distances.front()); + used_shapes_patches[id.expolygons_index].push_back(d.patch_index); + } + + // vector of patches for shape + std::vector> shapes_patches(shapes.size()); + for (const SurfacePatch &patch : patches) + shapes_patches[patch.shape_id].push_back(&patch - &patches.front()); + +#ifdef DEBUG_OUTPUT_DIR + std::string store_dir = DEBUG_OUTPUT_DIR + "select_patches/"; + prepare_dir(store_dir); +#endif // DEBUG_OUTPUT_DIR + + for (size_t shape_index = 0; shape_index < shapes.size(); shape_index++) { + const ExPolygon &shape = shapes[shape_index]; + std::vector &used_shape_patches = used_shapes_patches[shape_index]; + if (used_shape_patches.empty()) continue; + // is used all exist patches? + if (used_shapes_patches.size() == shapes_patches[shape_index].size()) continue; + if (used_shape_patches.size() == 1) { + uint32_t patch_index = used_shape_patches.front(); + const SurfacePatch &patch = patches[patch_index]; + if (is_over_whole_expoly(patch, shapes, cutAOIs, meshes)) continue; + } + + // only shapes containing multiple patches + // or not full filled are back projected (hard processed) + + // intersection of converted patches to 2d + ExPolygons fill; + fill.reserve(used_shape_patches.size()); + + // Heuristics to predict which patch to be used need average patch depth + Vec2d used_patches_depth(std::numeric_limits::max(), std::numeric_limits::min()); + for (uint32_t patch_index : used_shape_patches) { + ExPolygon patch_area = to_expoly(patches[patch_index], projection, used_patches_depth); + //*/ + ExPolygons patch_areas = offset_ex(patch_area, extend_delta); + fill.insert(fill.end(), patch_areas.begin(), patch_areas.end()); + /*/ + // without save extension + fill.push_back(patch_area); + //*/ + } + fill = union_ex(fill); + + // not cutted area of expolygon + ExPolygons rest = diff_ex(ExPolygons{shape}, fill, ApplySafetyOffset::Yes); +#ifdef DEBUG_OUTPUT_DIR + BoundingBox shape_bb = get_extents(shape); + SVG svg(store_dir + "shape_" + std::to_string(shape_index) + ".svg", shape_bb); + svg.draw(fill, "darkgreen"); + svg.draw(rest, "green"); +#endif // DEBUG_OUTPUT_DIR + + // already filled by multiple patches + if (rest.empty()) continue; + + // find patches overlaped rest area + struct PatchShape{ + uint32_t patch_index; + ExPolygon shape; + ExPolygons intersection; + double depth_range_center_distance; // always positive + }; + using PatchShapes = std::vector; + PatchShapes patch_shapes; + + double used_patches_depth_center = (used_patches_depth[0] + used_patches_depth[1]) / 2; + + // sort used_patches for faster search + std::sort(used_shape_patches.begin(), used_shape_patches.end()); + for (uint32_t patch_index : shapes_patches[shape_index]) { + // check is patch already used + auto it = std::lower_bound(used_shape_patches.begin(), used_shape_patches.end(), patch_index); + if (it != used_shape_patches.end() && *it == patch_index) continue; + + // Heuristics to predict which patch to be used need average patch depth + Vec2d patche_depth_range(std::numeric_limits::max(), std::numeric_limits::min()); + ExPolygon patch_shape = to_expoly(patches[patch_index], projection, patche_depth_range); + double depth_center = (patche_depth_range[0] + patche_depth_range[1]) / 2; + double depth_range_center_distance = std::fabs(used_patches_depth_center - depth_center); + + ExPolygons patch_intersection = intersection_ex(ExPolygons{patch_shape}, rest); + if (patch_intersection.empty()) continue; + + patch_shapes.push_back({patch_index, patch_shape, patch_intersection, depth_range_center_distance}); + } + + // nothing to add + if (patch_shapes.empty()) continue; + // only one solution to add + if (patch_shapes.size() == 1) { + used_shape_patches.push_back(patch_shapes.front().patch_index); + continue; + } + + // Idea: Get depth range of used patches and add patches in order by distance to used depth center + std::sort(patch_shapes.begin(), patch_shapes.end(), [](const PatchShape &a, const PatchShape &b) + { return a.depth_range_center_distance < b.depth_range_center_distance; }); + +#ifdef DEBUG_OUTPUT_DIR + for (size_t i = patch_shapes.size(); i > 0; --i) { + const PatchShape &p = patch_shapes[i - 1]; + int gray_level = (i * 200) / patch_shapes.size(); + std::stringstream color; + color << "#" << std::hex << std::setfill('0') << std::setw(2) << gray_level << gray_level << gray_level; + svg.draw(p.shape, color.str()); + Point text_pos = get_extents(p.shape).center().cast(); + svg.draw_text(text_pos, std::to_string(i-1).c_str(), "orange", std::ceil(shape_bb.size().x() / 20 * 0.000001)); + //svg.draw(p.intersection, color.str()); + } +#endif // DEBUG_OUTPUT_DIR + + for (const PatchShape &patch : patch_shapes) { + // Check when exist some place to fill + ExPolygons patch_intersection = intersection_ex(patch.intersection, rest); + if (patch_intersection.empty()) continue; + + // Extend for sure + ExPolygons intersection = offset_ex(patch.intersection, extend_delta); + rest = diff_ex(rest, intersection, ApplySafetyOffset::Yes); + + used_shape_patches.push_back(patch.patch_index); + if (rest.empty()) break; + } + + // QUESTION: How to select which patch to use? How to sort them? + // Now is used back projection distance from used patches + // + // Idealy by outline depth: (need ray cast into patches) + // how to calc wanted depth - idealy by depth of outline help to overlap + // how to calc patch depth - depth in place of outline position + // Which outline to use between + + } + + std::vector result(patches.size(), {false}); + for (const std::vector &patches: used_shapes_patches) + for (uint32_t patch_index : patches) { + assert(patch_index < result.size()); + // check only onece insertation of patch + assert(!result[patch_index]); + result[patch_index] = true; + } + return result; +} + +priv::Loops priv::create_loops(const std::vector &outlines, const CutMesh& mesh) +{ + Loops loops; + Loops unclosed; + for (HI hi : outlines) { + VI vi_s = mesh.source(hi); + VI vi_t = mesh.target(hi); + Loop *loop_move = nullptr; + Loop *loop_connect = nullptr; + for (std::vector &cut : unclosed) { + if (cut.back() != vi_s) continue; + if (cut.front() == vi_t) { + // cut closing + loop_move = &cut; + } else { + loop_connect = &cut; + } + break; + } + if (loop_move != nullptr) { + // index of closed cut + size_t index = loop_move - &unclosed.front(); + // move cut to result + loops.emplace_back(std::move(*loop_move)); + // remove it from unclosed cut + unclosed.erase(unclosed.begin() + index); + } else if (loop_connect != nullptr) { + // try find tail to connect cut + Loop *loop_tail = nullptr; + for (Loop &cut : unclosed) { + if (cut.front() != vi_t) continue; + loop_tail = &cut; + break; + } + if (loop_tail != nullptr) { + // index of tail + size_t index = loop_tail - &unclosed.front(); + // move to connect vector + loop_connect->insert(loop_connect->end(), + make_move_iterator(loop_tail->begin()), + make_move_iterator(loop_tail->end())); + // remove tail from unclosed cut + unclosed.erase(unclosed.begin() + index); + } else { + loop_connect->push_back(vi_t); + } + } else { // not found + bool create_cut = true; + // try to insert to front of cut + for (Loop &cut : unclosed) { + if (cut.front() != vi_t) continue; + cut.insert(cut.begin(), vi_s); + create_cut = false; + break; + } + if (create_cut) + unclosed.emplace_back(std::vector{vi_s, vi_t}); + } + } + assert(unclosed.empty()); + return loops; +} + +Polygons priv::unproject_loops(const SurfacePatch &patch, const Project &projection, Vec2d &depth_range) +{ + assert(!patch.loops.empty()); + if (patch.loops.empty()) return {}; + + // NOTE: this method is working only when patch did not contain outward faces + Polygons polys; + polys.reserve(patch.loops.size()); + // project conture into 2d space to fillconvert outlines to + + size_t count = 0; + for (const Loop &l : patch.loops) count += l.size(); + std::vector depths; + depths.reserve(count); + + Points pts; + for (const Loop &l : patch.loops) { + pts.clear(); + pts.reserve(l.size()); + for (VI vi : l) { + const P3 &p3 = patch.mesh.point(vi); + Vec3d p = to_vec3d(p3); + double depth; + std::optional p2_opt = projection.unproject(p, &depth); + if (depth_range[0] > depth) depth_range[0] = depth; // min + if (depth_range[1] < depth) depth_range[1] = depth; // max + // Check when appear that skip is enough for poit which can't be unprojected + // - it could break contour + assert(p2_opt.has_value()); + if (!p2_opt.has_value()) continue; + + pts.push_back(p2_opt->cast()); + depths.push_back(static_cast(depth)); + } + // minimal is triangle + assert(pts.size() >= 3); + if (pts.size() < 3) continue; + + polys.emplace_back(pts); + } + + assert(!polys.empty()); + return polys; +} + +ExPolygon priv::to_expoly(const SurfacePatch &patch, const Project &projection, Vec2d &depth_range) +{ + Polygons polys = unproject_loops(patch, projection, depth_range); + // should not be used when no opposit triangle are counted so should not create overlaps + ClipperLib::PolyFillType fill_type = ClipperLib::PolyFillType::pftEvenOdd; + ExPolygons expolys = Slic3r::union_ex(polys, fill_type); + if (expolys.size() == 1) + return expolys.front(); + + // It should be one expolygon + assert(false); + + if (expolys.empty()) return {}; + // find biggest + const ExPolygon *biggest = &expolys.front(); + for (size_t index = 1; index < expolys.size(); ++index) { + const ExPolygon *current = &expolys[index]; + if (biggest->contour.size() < current->contour.size()) + biggest = current; + } + return *biggest; +} + +SurfaceCut priv::patch2cut(SurfacePatch &patch) +{ + CutMesh &mesh = patch.mesh; + + std::string convert_map_name = "v:convert"; + CutMesh::Property_map convert_map = + mesh.add_property_map(convert_map_name).first; + + size_t indices_size = mesh.faces().size(); + size_t vertices_size = mesh.vertices().size(); + + SurfaceCut sc; + sc.indices.reserve(indices_size); + sc.vertices.reserve(vertices_size); + for (VI vi : mesh.vertices()) { + // vi order is is not sorted + // assert(vi.idx() == sc.vertices.size()); + // vi is not continous + // assert(vi.idx() < vertices_size); + convert_map[vi] = sc.vertices.size(); + const P3 &p = mesh.point(vi); + sc.vertices.emplace_back(p.x(), p.y(), p.z()); + } + + for (FI fi : mesh.faces()) { + HI hi = mesh.halfedge(fi); + assert(mesh.next(hi).is_valid()); + assert(mesh.next(mesh.next(hi)).is_valid()); + // Is fi triangle? + assert(mesh.next(mesh.next(mesh.next(hi))) == hi); + + // triangle indicies + Vec3i ti; + size_t i = 0; + for (VI vi : { mesh.source(hi), + mesh.target(hi), + mesh.target(mesh.next(hi))}) + ti[i++] = convert_map[vi]; + sc.indices.push_back(ti); + } + + sc.contours.reserve(patch.loops.size()); + for (const Loop &loop : patch.loops) { + sc.contours.push_back({}); + std::vector &contour = sc.contours.back(); + contour.reserve(loop.size()); + for (VI vi : loop) contour.push_back(convert_map[vi]); + } + + // Not neccessary, clean and free memory + mesh.remove_property_map(convert_map); + return sc; +} + +void priv::append(SurfaceCut &sc, SurfaceCut &&sc_add) +{ + if (sc.empty()) { + sc = std::move(sc_add); + return; + } + + if (!sc_add.contours.empty()) { + SurfaceCut::Index offset = static_cast( + sc.vertices.size()); + size_t require = sc.contours.size() + sc_add.contours.size(); + if (sc.contours.capacity() < require) sc.contours.reserve(require); + for (std::vector &cut : sc_add.contours) + for (SurfaceCut::Index &i : cut) i += offset; + Slic3r::append(sc.contours, std::move(sc_add.contours)); + } + its_merge(sc, std::move(sc_add)); +} + +SurfaceCut priv::merge_patches(SurfacePatches &patches, const std::vector& mask) +{ + SurfaceCut result; + for (SurfacePatch &patch : patches) { + size_t index = &patch - &patches.front(); + if (!mask[index]) continue; + append(result, patch2cut(patch)); + } + return result; +} + +#ifdef DEBUG_OUTPUT_DIR +void priv::prepare_dir(const std::string &dir){ + namespace fs = std::filesystem; + if (fs::exists(dir)) { + for (auto &path : fs::directory_iterator(dir)) fs::remove_all(path); + } else { + fs::create_directories(dir); + } +} + +namespace priv{ +int reduction_order = 0; +int filled_order = 0; +int constrained_order = 0; +int diff_patch_order = 0; + +} // namespace priv + +void priv::initialize_store(const std::string& dir) +{ + // clear previous output + prepare_dir(dir); + reduction_order = 0; + filled_order = 0; + constrained_order = 0; + diff_patch_order = 0; +} + +void priv::store(const Vec3f &vertex, + const Vec3f &normal, + const std::string &file, + float size) +{ + int flatten = 20; + size_t min_i = 0; + for (size_t i = 1; i < 3; i++) + if (normal[min_i] > normal[i]) min_i = i; + Vec3f up_ = Vec3f::Zero(); + up_[min_i] = 1.f; + Vec3f side = normal.cross(up_).normalized() * size; + Vec3f up = side.cross(normal).normalized() * size; + + indexed_triangle_set its; + its.vertices.reserve(flatten + 1); + its.indices.reserve(flatten); + + its.vertices.push_back(vertex); + its.vertices.push_back(vertex + up); + size_t max_i = static_cast(flatten); + for (size_t i = 1; i < max_i; i++) { + float angle = i * 2 * M_PI / flatten; + Vec3f v = vertex + sin(angle) * side + cos(angle) * up; + its.vertices.push_back(v); + its.indices.emplace_back(0, i, i + 1); + } + its.indices.emplace_back(0, flatten, 1); + its_write_obj(its, file.c_str()); +} + +void priv::store(const CutMesh &mesh, const FaceTypeMap &face_type_map, const std::string& dir, bool is_filled) +{ + std::string off_file; + if (is_filled) { + if (filled_order == 0) prepare_dir(dir); + off_file = dir + "model" + std::to_string(filled_order++) + ".off"; + }else{ + if (constrained_order == 0) prepare_dir(dir); + off_file = dir + "model" + std::to_string(constrained_order++) + ".off"; + } + + CutMesh &mesh_ = const_cast(mesh); + auto face_colors = mesh_.add_property_map("f:color").first; + for (FI fi : mesh.faces()) { + auto &color = face_colors[fi]; + switch (face_type_map[fi]) { + case FaceType::inside: color = CGAL::Color{100, 250, 100}; break; // light green + case FaceType::inside_processed: color = CGAL::Color{170, 0, 0}; break; // dark red + case FaceType::outside: color = CGAL::Color{100, 0, 100}; break; // purple + case FaceType::not_constrained: color = CGAL::Color{127, 127, 127}; break; // gray + default: color = CGAL::Color{0, 0, 255}; // blue + } + } + CGAL::IO::write_OFF(off_file, mesh, CGAL::parameters::face_color_map(face_colors)); + mesh_.remove_property_map(face_colors); +} + +void priv::store(const ExPolygons &shapes, const std::string &svg_file) { + SVG svg(svg_file); + svg.draw(shapes); +} + +void priv::store(const CutMesh &mesh, const ReductionMap &reduction_map, const std::string& dir) +{ + if (reduction_order == 0) prepare_dir(dir); + std::string off_file = dir + "model" + std::to_string(reduction_order++) + ".off"; + + CutMesh &mesh_ = const_cast(mesh); + auto vertex_colors = mesh_.add_property_map("v:color").first; + // initialize to gray color + for (VI vi: mesh.vertices()) + vertex_colors[vi] = CGAL::Color{127, 127, 127}; + + for (VI reduction_from : mesh.vertices()) { + VI reduction_to = reduction_map[reduction_from]; + if (!reduction_to.is_valid()) continue; + vertex_colors[reduction_from] = CGAL::Color{255, 0, 0}; + vertex_colors[reduction_to] = CGAL::Color{0, 0, 255}; + } + + CGAL::IO::write_OFF(off_file, mesh, CGAL::parameters::vertex_color_map(vertex_colors)); + mesh_.remove_property_map(vertex_colors); +} + +namespace priv { +indexed_triangle_set create_indexed_triangle_set(const std::vector &faces, + const CutMesh &mesh); +} // namespace priv + +indexed_triangle_set priv::create_indexed_triangle_set( + const std::vector &faces, const CutMesh &mesh) +{ + std::vector vertices; + vertices.reserve(faces.size() * 2); + + indexed_triangle_set its; + its.indices.reserve(faces.size()); + for (FI fi : faces) { + HI hi = mesh.halfedge(fi); + HI hi_end = hi; + + int ti = 0; + Vec3i t; + + do { + VI vi = mesh.source(hi); + auto res = std::find(vertices.begin(), vertices.end(), vi); + t[ti++] = res - vertices.begin(); + if (res == vertices.end()) vertices.push_back(vi); + hi = mesh.next(hi); + } while (hi != hi_end); + + its.indices.push_back(t); + } + + its.vertices.reserve(vertices.size()); + for (VI vi : vertices) { + const auto &p = mesh.point(vi); + its.vertices.emplace_back(p.x(), p.y(), p.z()); + } + return its; +} + +void priv::store(const CutAOIs &aois, const CutMesh &mesh, const std::string &dir) { + auto create_outline_its = + [&mesh](const std::vector &outlines) -> indexed_triangle_set { + static const float line_width = 0.1f; + indexed_triangle_set its; + its.indices.reserve(2*outlines.size()); + its.vertices.reserve(outlines.size()*4); + for (HI hi : outlines) { + //FI fi = mesh.face(hi); + VI vi_a = mesh.source(hi); + VI vi_b = mesh.target(hi); + VI vi_c = mesh.target(mesh.next(hi)); + P3 p3_a = mesh.point(vi_a); + P3 p3_b = mesh.point(vi_b); + P3 p3_c = mesh.point(vi_c); + + Vec3f a(p3_a.x(), p3_a.y(), p3_a.z()); + Vec3f b(p3_b.x(), p3_b.y(), p3_b.z()); + Vec3f c(p3_c.x(), p3_c.y(), p3_c.z()); + + Vec3f v1 = b - a; // from a to b + v1.normalize(); + Vec3f v2 = c - a; // from a to c + v2.normalize(); + Vec3f norm = v1.cross(v2); + norm.normalize(); + Vec3f perp_to_edge = norm.cross(v1); + perp_to_edge.normalize(); + Vec3f dir = -perp_to_edge * line_width; + + size_t ai = its.vertices.size(); + its.vertices.push_back(a); + size_t bi = its.vertices.size(); + its.vertices.push_back(b); + size_t ai2 = its.vertices.size(); + its.vertices.push_back(a + dir); + size_t bi2 = its.vertices.size(); + its.vertices.push_back(b + dir); + + its.indices.push_back(Vec3i(ai, ai2, bi)); + its.indices.push_back(Vec3i(ai2, bi2, bi)); + } + return its; + }; + + prepare_dir(dir); + for (const auto &aoi : aois) { + size_t index = &aoi - &aois.front(); + std::string file = dir + "aoi" + std::to_string(index) + ".obj"; + indexed_triangle_set its = create_indexed_triangle_set(aoi.first, mesh); + its_write_obj(its, file.c_str()); + + // exist some outline? + if (aoi.second.empty()) continue; + std::string file_outline = dir + "outline" + std::to_string(index) + ".obj"; + indexed_triangle_set outline = create_outline_its(aoi.second); + its_write_obj(outline, file_outline.c_str()); + } +} + +void priv::store(const SurfacePatches &patches, const std::string &dir) { + prepare_dir(dir); + for (const priv::SurfacePatch &patch : patches) { + size_t index = &patch - &patches.front(); + if (patch.mesh.faces().empty()) continue; + CGAL::IO::write_OFF(dir + "patch" + std::to_string(index) + ".off", patch.mesh); + } +} +// +//void priv::store(const ProjectionDistances &pds, +// const VCutAOIs &aois, +// const CutMeshes &meshes, +// const std::string &file, +// float width) +//{ +// // create rectangle for each half edge from projection distances +// indexed_triangle_set its; +// its.vertices.reserve(4 * pds.size()); +// its.indices.reserve(2 * pds.size()); +// for (const ProjectionDistance &pd : pds) { +// if (pd.aoi_index == std::numeric_limits::max()) continue; +// HI hi = aois[pd.model_index][pd.aoi_index].second[pd.hi_index]; +// const CutMesh &mesh = meshes[pd.model_index]; +// VI vi1 = mesh.source(hi); +// VI vi2 = mesh.target(hi); +// VI vi3 = mesh.target(mesh.next(hi)); +// const P3 &p1 = mesh.point(vi1); +// const P3 &p2 = mesh.point(vi2); +// const P3 &p3 = mesh.point(vi3); +// Vec3f v1(p1.x(), p1.y(), p1.z()); +// Vec3f v2(p2.x(), p2.y(), p2.z()); +// Vec3f v3(p3.x(), p3.y(), p3.z()); +// +// Vec3f v12 = v2 - v1; +// v12.normalize(); +// Vec3f v13 = v3 - v1; +// v13.normalize(); +// Vec3f n = v12.cross(v13); +// n.normalize(); +// Vec3f side = n.cross(v12); +// side.normalize(); +// side *= -width; +// +// uint32_t i = its.vertices.size(); +// its.vertices.push_back(v1); +// its.vertices.push_back(v1+side); +// its.vertices.push_back(v2); +// its.vertices.push_back(v2+side); +// +// its.indices.emplace_back(i, i + 1, i + 2); +// its.indices.emplace_back(i + 2, i + 1, i + 3); +// } +// its_write_obj(its, file.c_str()); +//} + +void priv::store(const ExPolygons &shapes, const std::vector &mask, const Connections &connections, const std::string &file_svg) +{ + auto bb = get_extents(shapes); + int width = get_extents(shapes.front()).size().x() / 70; + + SVG svg(file_svg, bb); + svg.draw(shapes); + + ExPolygonsIndices s2i(shapes); + auto get_point = [&shapes, &s2i](size_t i)->Point { + auto id = s2i.cvt(i); + const ExPolygon &s = shapes[id.expolygons_index]; + const Polygon &p = (id.polygon_index == 0) ? + s.contour : + s.holes[id.polygon_index - 1]; + return p[id.point_index]; + }; + + bool is_first = true; + for (const Connection &c : connections) { + if (is_first) { + is_first = false; + Point p = get_point(c.first); + svg.draw(p, "purple", 4 * width); + continue; + } + Point p1 = get_point(c.first); + Point p2 = get_point(c.second); + svg.draw(Line(p1, p2), "red", width); + } + + for (size_t i = 0; i < s2i.get_count(); i++) { + Point p = get_point(i); + svg.draw(p, "black", 2*width); + if (!mask[i]) + svg.draw(p, "white", width); + } + svg.Close(); +} + +namespace priv { +/// +/// Create model consist of rectangles for each contour edge +/// +/// +/// +/// +indexed_triangle_set create_contour_its(const indexed_triangle_set& its, const std::vector &contour); + +/// +/// Getter on triangle tip (third vertex of face) +/// +/// First vertex index +/// Second vertex index +/// Source model +/// Tip Vertex index +unsigned int get_triangle_tip(unsigned int vi1, + unsigned int vi2, + const indexed_triangle_set &its); +} + + +unsigned int priv::get_triangle_tip(unsigned int vi1, + unsigned int vi2, + const indexed_triangle_set &its) +{ + assert(vi1 < its.vertices.size()); + assert(vi2 < its.vertices.size()); + for (const auto &t : its.indices) { + unsigned int tvi = std::numeric_limits::max(); + for (const auto &vi : t) { + unsigned int vi_ = static_cast(vi); + if (vi_ == vi1) continue; + if (vi_ == vi2) continue; + if (tvi == std::numeric_limits::max()) { + tvi = vi_; + } else { + tvi = std::numeric_limits::max(); + break; + } + } + if (tvi != std::numeric_limits::max()) + return tvi; + } + // triangle with indices vi1 and vi2 doesnt exist + assert(false); + return std::numeric_limits::max(); +} + +indexed_triangle_set priv::create_contour_its( + const indexed_triangle_set &its, const std::vector &contour) +{ + static const float line_width = 0.1f; + indexed_triangle_set result; + result.vertices.reserve((contour.size() + 1) * 4); + result.indices.reserve((contour.size() + 1) * 2); + unsigned int prev_vi = contour.back(); + for (unsigned int vi : contour) { + const Vec3f &a = its.vertices[vi]; + const Vec3f &b = its.vertices[prev_vi]; + const Vec3f &c = its.vertices[get_triangle_tip(vi, prev_vi, its)]; + + Vec3f v1 = b - a; // from a to b + v1.normalize(); + Vec3f v2 = c - a; // from a to c + v2.normalize(); + // triangle normal + Vec3f norm = v1.cross(v2); + norm.normalize(); + // perpendiculat to edge lay on triangle + Vec3f perp_to_edge = norm.cross(v1); + perp_to_edge.normalize(); + + Vec3f dir = -perp_to_edge * line_width; + + size_t ai = result.vertices.size(); + result.vertices.push_back(a); + size_t bi = result.vertices.size(); + result.vertices.push_back(b); + size_t ai2 = result.vertices.size(); + result.vertices.push_back(a + dir); + size_t bi2 = result.vertices.size(); + result.vertices.push_back(b + dir); + + result.indices.push_back(Vec3i(ai, bi, ai2)); + result.indices.push_back(Vec3i(ai2, bi, bi2)); + prev_vi = vi; + } + return result; +} + +//void priv::store(const SurfaceCuts &cut, const std::string &dir) { +// prepare_dir(dir); +// for (const auto &c : cut) { +// size_t index = &c - &cut.front(); +// std::string file = dir + "cut" + std::to_string(index) + ".obj"; +// its_write_obj(c, file.c_str()); +// for (const auto& contour : c.contours) { +// size_t c_index = &contour - &c.contours.front(); +// std::string c_file = dir + "cut" + std::to_string(index) + +// "contour" + std::to_string(c_index) + ".obj"; +// indexed_triangle_set c_its = create_contour_its(c, contour); +// its_write_obj(c_its, c_file.c_str()); +// } +// } +//} + +void priv::store(const SurfaceCut &cut, const std::string &file, const std::string &contour_dir) { + prepare_dir(contour_dir); + its_write_obj(cut, file.c_str()); + for (const auto& contour : cut.contours) { + size_t c_index = &contour - &cut.contours.front(); + std::string c_file = contour_dir + std::to_string(c_index) + ".obj"; + indexed_triangle_set c_its = create_contour_its(cut, contour); + its_write_obj(c_its, c_file.c_str()); + } +} + +void priv::store(const std::vector &models, + const std::string &obj_filename) +{ + indexed_triangle_set merged_model; + for (const indexed_triangle_set &model : models) + its_merge(merged_model, model); + its_write_obj(merged_model, obj_filename.c_str()); +} + +void priv::store(const std::vector &models, + const std::string &dir) +{ + prepare_dir(dir); + if (models.empty()) return; + if (models.size() == 1) { + CGAL::IO::write_OFF(dir + "model.off", models.front()); + return; + } + size_t model_index = 0; + for (const priv::CutMesh& model : models) { + std::string filename = dir + "model" + std::to_string(model_index++) + ".off"; + CGAL::IO::write_OFF(filename, model); + } +} + +// store projection center +void priv::store(const Emboss::IProjection &projection, + const Point &point_to_project, + float projection_ratio, + const std::string &obj_filename) +{ + auto [front, back] = projection.create_front_back(point_to_project); + Vec3d diff = back - front; + Vec3d pos = front + diff * projection_ratio; + priv::store(pos.cast(), diff.normalized().cast(), + DEBUG_OUTPUT_DIR + "projection_center.obj"); // only debug +} + +#endif // DEBUG_OUTPUT_DIR + +bool Slic3r::corefine_test(const std::string &model_path, const std::string &shape_path) { + priv::CutMesh model, shape; + if (!CGAL::IO::read_OFF(model_path, model)) return false; + if (!CGAL::IO::read_OFF(shape_path, shape)) return false; + + CGAL::Polygon_mesh_processing::corefine(model, shape); + return true; +} diff --git a/src/libslic3r/CutSurface.hpp b/src/libslic3r/CutSurface.hpp new file mode 100644 index 00000000000..9f4e3159cfe --- /dev/null +++ b/src/libslic3r/CutSurface.hpp @@ -0,0 +1,74 @@ +#ifndef slic3r_CutSurface_hpp_ +#define slic3r_CutSurface_hpp_ + +#include +#include // indexed_triangle_set +#include "ExPolygon.hpp" +#include "Emboss.hpp" // IProjection + +namespace Slic3r{ + +/// +/// Represents cutted surface from object +/// Extend index triangle set by outlines +/// +struct SurfaceCut : public indexed_triangle_set +{ + // vertex indices(index to mesh vertices) + using Index = unsigned int; + using Contour = std::vector; + using Contours = std::vector; + // list of circulated open surface + Contours contours; +}; + +/// +/// Cut surface shape from models. +/// +/// Multiple shape to cut from model +/// Multi mesh to cut, need to be in same coordinate system +/// Define transformation 2d shape into 3d +/// Define ideal ratio between front and back projection to cut +/// 0 .. means use closest to front projection +/// 1 .. means use closest to back projection +/// value from <0, 1> +/// +/// Cutted surface from model +SurfaceCut cut_surface(const ExPolygons &shapes, + const std::vector &models, + const Emboss::IProjection &projection, + float projection_ratio); + +/// +/// Create model from surface cuts by projection +/// +/// Surface from model with outlines +/// Way of emboss +/// Mesh +indexed_triangle_set cut2model(const SurfaceCut &cut, + const Emboss::IProject3d &projection); + +/// +/// Separate (A)rea (o)f (I)nterest .. AoI from model +/// NOTE: Only 2d filtration, do not filtrate by Z coordinate +/// +/// Input model +/// Bounding box to project into space +/// Define tranformation of BB into space +/// Triangles lay at least partialy inside of projected Bounding box +indexed_triangle_set its_cut_AoI(const indexed_triangle_set &its, + const BoundingBox &bb, + const Emboss::IProjection &projection); + +/// +/// Separate triangles by mask +/// +/// Input model +/// Mask - same size as its::indices +/// Copy of indices by mask(with their vertices) +indexed_triangle_set its_mask(const indexed_triangle_set &its, const std::vector &mask); + +bool corefine_test(const std::string &model_path, const std::string &shape_path); + +} // namespace Slic3r +#endif // slic3r_CutSurface_hpp_ diff --git a/src/libslic3r/EdgeGrid.cpp b/src/libslic3r/EdgeGrid.cpp index 1385a51d8d8..4985b788e4b 100644 --- a/src/libslic3r/EdgeGrid.cpp +++ b/src/libslic3r/EdgeGrid.cpp @@ -136,11 +136,6 @@ void EdgeGrid::Grid::create(const ExPolygons &expolygons, coord_t resolution) create_from_m_contours(resolution); } -void EdgeGrid::Grid::create(const ExPolygonCollection &expolygons, coord_t resolution) -{ - create(expolygons.expolygons, resolution); -} - // m_contours has been initialized. Now fill in the edge grid. void EdgeGrid::Grid::create_from_m_contours(coord_t resolution) { diff --git a/src/libslic3r/EdgeGrid.hpp b/src/libslic3r/EdgeGrid.hpp index 3c992914988..4be2bdd07c5 100644 --- a/src/libslic3r/EdgeGrid.hpp +++ b/src/libslic3r/EdgeGrid.hpp @@ -7,7 +7,6 @@ #include "Point.hpp" #include "BoundingBox.hpp" #include "ExPolygon.hpp" -#include "ExPolygonCollection.hpp" namespace Slic3r { namespace EdgeGrid { @@ -112,7 +111,6 @@ class Grid void create(const std::vector &polygons, coord_t resolution) { this->create(polygons, resolution, false); } void create(const ExPolygon &expoly, coord_t resolution); void create(const ExPolygons &expolygons, coord_t resolution); - void create(const ExPolygonCollection &expolygons, coord_t resolution); const std::vector& contours() const { return m_contours; } @@ -123,7 +121,6 @@ class Grid bool intersect(const Polygons &polygons) { for (size_t i = 0; i < polygons.size(); ++ i) if (intersect(polygons[i])) return true; return false; } bool intersect(const ExPolygon &expoly) { if (intersect(expoly.contour)) return true; for (size_t i = 0; i < expoly.holes.size(); ++ i) if (intersect(expoly.holes[i])) return true; return false; } bool intersect(const ExPolygons &expolygons) { for (size_t i = 0; i < expolygons.size(); ++ i) if (intersect(expolygons[i])) return true; return false; } - bool intersect(const ExPolygonCollection &expolygons) { return intersect(expolygons.expolygons); } // Test, whether a point is inside a contour. bool inside(const Point &pt); @@ -391,7 +388,7 @@ class Grid // Referencing the source contours. // This format allows one to work with any Slic3r fixed point contour format - // (Polygon, ExPolygon, ExPolygonCollection etc). + // (Polygon, ExPolygon, ExPolygons etc). std::vector m_contours; // Referencing a contour and a line segment of m_contours. diff --git a/src/libslic3r/Emboss.cpp b/src/libslic3r/Emboss.cpp new file mode 100644 index 00000000000..f24775e2210 --- /dev/null +++ b/src/libslic3r/Emboss.cpp @@ -0,0 +1,1819 @@ +#include "Emboss.hpp" +#include +#include +#include +#include +#include // union_ex + for boldness(polygon extend(offset)) +#include "IntersectionPoints.hpp" + +#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation +#include "imgui/imstb_truetype.h" // stbtt_fontinfo +#include "Utils.hpp" // ScopeGuard + +#include // CGAL project +#include "libslic3r.h" + +// to heal shape +#include "ExPolygonsIndex.hpp" +#include "libslic3r/AABBTreeLines.hpp" // search structure for found close points +#include "libslic3r/Line.hpp" +#include "libslic3r/BoundingBox.hpp" + +using namespace Slic3r; +using namespace Emboss; +using fontinfo_opt = std::optional; + +// for try approach to heal shape by Clipper::Closing +//#define HEAL_WITH_CLOSING + +// functionality to remove all spikes from shape +//#define REMOVE_SPIKES + +// do not expose out of this file stbtt_ data types +namespace priv{ +using Polygon = Slic3r::Polygon; +bool is_valid(const FontFile &font, unsigned int index); +fontinfo_opt load_font_info(const unsigned char *data, unsigned int index = 0); +std::optional get_glyph(const stbtt_fontinfo &font_info, int unicode_letter, float flatness); + +// take glyph from cache +const Glyph* get_glyph(int unicode, const FontFile &font, const FontProp &font_prop, + Glyphs &cache, fontinfo_opt &font_info_opt); + +EmbossStyle create_style(std::wstring name, std::wstring path); + +// scale and convert float to int coordinate +Point to_point(const stbtt__point &point); + +// bad is contour smaller than 3 points +void remove_bad(Polygons &polygons); +void remove_bad(ExPolygons &expolygons); + +// helpr for heal shape +// Return true when erase otherwise false +bool remove_same_neighbor(Polygon &points); +bool remove_same_neighbor(Polygons &polygons); +bool remove_same_neighbor(ExPolygons &expolygons); + +// Try to remove self intersection by subtracting rect 2x2 px +bool remove_self_intersections(ExPolygons &shape, unsigned max_iteration = 10); +ExPolygon create_bounding_rect(const ExPolygons &shape); + +void remove_small_islands(ExPolygons &shape, double minimal_area); + +// NOTE: expolygons can't contain same_neighbor +Points collect_close_points(const ExPolygons &expolygons, double distance = .6); + +// Heal duplicates points and self intersections +bool heal_dupl_inter(ExPolygons &shape, unsigned max_iteration); + +// for debug purpose +void visualize_heal(const std::string& svg_filepath, const ExPolygons &expolygons); + +const Points pts_2x2({Point(0, 0), Point(1, 0), Point(1, 1), Point(0, 1)}); +const Points pts_3x3({Point(-1, -1), Point(1, -1), Point(1, 1), Point(-1, 1)}); + +struct SpikeDesc +{ + // cosinus of max spike angle + double cos_angle; // speed up to skip acos + + // Half of Wanted bevel size + double half_bevel; + + /// + /// Calculate spike description + /// + /// Size of spike width after cut of the tip, has to be grater than 2.5 + /// When spike has same or more pixels with width less than 1 pixel + SpikeDesc(double bevel_size, double pixel_spike_length = 6) + { + // create min angle given by spike_length + // Use it as minimal height of 1 pixel base spike + double angle = 2. * atan2(pixel_spike_length, .5); // [rad] + cos_angle = std::fabs(cos(angle)); + + // When remove spike this angle is set. + // Value must be grater than min_angle + half_bevel = bevel_size / 2; + } +}; + +// return TRUE when remove point. It could create polygon with 2 points. +bool remove_when_spike(Polygon &polygon, size_t index, const SpikeDesc &spike_desc); +void remove_spikes_in_duplicates(ExPolygons &expolygons, const Points &duplicates); + +#ifdef REMOVE_SPIKES +// Remove long sharp corners aka spikes +// by adding points to bevel tip of spikes - Not printable parts +// Try to not modify long sides of spike and add points on it's side +void remove_spikes(Polygon &polygon, const SpikeDesc &spike_desc); +void remove_spikes(Polygons &polygons, const SpikeDesc &spike_desc); +void remove_spikes(ExPolygons &expolygons, const SpikeDesc &spike_desc); +#endif + +}; + +bool priv::remove_when_spike(Polygon &polygon, size_t index, const SpikeDesc &spike_desc) { + + std::optional add; + bool do_erase = false; + Points &pts = polygon.points; + { + size_t pts_size = pts.size(); + if (pts_size < 3) + return false; + + const Point &a = (index == 0) ? pts.back() : pts[index - 1]; + const Point &b = pts[index]; + const Point &c = (index == (pts_size - 1)) ? pts.front() : pts[index + 1]; + + // calc sides + Vec2d ba = (a - b).cast(); + Vec2d bc = (c - b).cast(); + + double dot_product = ba.dot(bc); + + // sqrt together after multiplication save one sqrt + double ba_size_sq = ba.squaredNorm(); + double bc_size_sq = bc.squaredNorm(); + double norm = sqrt(ba_size_sq * bc_size_sq); + double cos_angle = dot_product / norm; + + // small angle are around 1 --> cos(0) = 1 + if (cos_angle < spike_desc.cos_angle) + return false; // not a spike + + // has to be in range <-1, 1> + // Due to preccission of floating point number could be sligtly out of range + if (cos_angle > 1.) + cos_angle = 1.; + // if (cos_angle < -1.) + // cos_angle = -1.; + + // Current Spike angle + double angle = acos(cos_angle); + double wanted_size = spike_desc.half_bevel / cos(angle / 2.); + double wanted_size_sq = wanted_size * wanted_size; + + bool is_ba_short = ba_size_sq < wanted_size_sq; + bool is_bc_short = bc_size_sq < wanted_size_sq; + + auto a_side = [&b, &ba, &ba_size_sq, &wanted_size]() -> Point { + Vec2d ba_norm = ba / sqrt(ba_size_sq); + return b + (wanted_size * ba_norm).cast(); + }; + auto c_side = [&b, &bc, &bc_size_sq, &wanted_size]() -> Point { + Vec2d bc_norm = bc / sqrt(bc_size_sq); + return b + (wanted_size * bc_norm).cast(); + }; + + if (is_ba_short && is_bc_short) { + // remove short spike + do_erase = true; + } else if (is_ba_short) { + // move point B on C-side + pts[index] = c_side(); + } else if (is_bc_short) { + // move point B on A-side + pts[index] = a_side(); + } else { + // move point B on C-side and add point on A-side(left - before) + pts[index] = c_side(); + add = a_side(); + if (*add == pts[index]) { + // should be very rare, when SpikeDesc has small base + // will be fixed by remove B point + add.reset(); + do_erase = true; + } + } + } + if (do_erase) { + pts.erase(pts.begin() + index); + return true; + } + if (add.has_value()) + pts.insert(pts.begin() + index, *add); + return false; +} + +void priv::remove_spikes_in_duplicates(ExPolygons &expolygons, const Points &duplicates) { + + auto check = [](Polygon &polygon, const Point &d) -> bool { + double spike_bevel = 1 / SHAPE_SCALE; + double spike_length = 5.; + const static SpikeDesc sd(spike_bevel, spike_length); + Points& pts = polygon.points; + bool exist_remove = false; + for (size_t i = 0; i < pts.size(); i++) { + if (pts[i] != d) + continue; + exist_remove |= remove_when_spike(polygon, i, sd); + } + return exist_remove && pts.size() < 3; + }; + + bool exist_remove = false; + for (ExPolygon &expolygon : expolygons) { + BoundingBox bb(to_points(expolygon.contour)); + for (const Point &d : duplicates) { + if (!bb.contains(d)) + continue; + exist_remove |= check(expolygon.contour, d); + for (Polygon &hole : expolygon.holes) + exist_remove |= check(hole, d); + } + } + + if (exist_remove) + remove_bad(expolygons); +} + +bool priv::is_valid(const FontFile &font, unsigned int index) { + if (font.data == nullptr) return false; + if (font.data->empty()) return false; + if (index >= font.infos.size()) return false; + return true; +} + +fontinfo_opt priv::load_font_info( + const unsigned char *data, unsigned int index) +{ + int font_offset = stbtt_GetFontOffsetForIndex(data, index); + if (font_offset < 0) { + assert(false); + // "Font index(" << index << ") doesn't exist."; + return {}; + } + stbtt_fontinfo font_info; + if (stbtt_InitFont(&font_info, data, font_offset) == 0) { + // Can't initialize font. + assert(false); + return {}; + } + return font_info; +} + +void priv::remove_bad(Polygons &polygons) { + polygons.erase( + std::remove_if(polygons.begin(), polygons.end(), + [](const Polygon &p) { return p.size() < 3; }), + polygons.end()); +} + +void priv::remove_bad(ExPolygons &expolygons) { + expolygons.erase( + std::remove_if(expolygons.begin(), expolygons.end(), + [](const ExPolygon &p) { return p.contour.size() < 3; }), + expolygons.end()); + + for (ExPolygon &expolygon : expolygons) + remove_bad(expolygon.holes); +} + +bool priv::remove_same_neighbor(Slic3r::Polygon &polygon) +{ + Points &points = polygon.points; + if (points.empty()) return false; + auto last = std::unique(points.begin(), points.end()); + + // remove first and last neighbor duplication + if (const Point& last_point = *(last - 1); + last_point == points.front()) { + --last; + } + + // no duplicits + if (last == points.end()) return false; + + points.erase(last, points.end()); + return true; +} + +bool priv::remove_same_neighbor(Polygons &polygons) { + if (polygons.empty()) return false; + bool exist = false; + for (Polygon& polygon : polygons) + exist |= remove_same_neighbor(polygon); + // remove empty polygons + polygons.erase( + std::remove_if(polygons.begin(), polygons.end(), + [](const Polygon &p) { return p.points.size() <= 2; }), + polygons.end()); + return exist; +} + +bool priv::remove_same_neighbor(ExPolygons &expolygons) { + if(expolygons.empty()) return false; + bool remove_from_holes = false; + bool remove_from_contour = false; + for (ExPolygon &expoly : expolygons) { + remove_from_contour |= remove_same_neighbor(expoly.contour); + remove_from_holes |= remove_same_neighbor(expoly.holes); + } + // Removing of expolygons without contour + if (remove_from_contour) + expolygons.erase( + std::remove_if(expolygons.begin(), expolygons.end(), + [](const ExPolygon &p) { return p.contour.points.size() <=2; }), + expolygons.end()); + return remove_from_holes || remove_from_contour; +} + +Points priv::collect_close_points(const ExPolygons &expolygons, double distance) { + if (expolygons.empty()) return {}; + if (distance < 0.) return {}; + + // IMPROVE: use int(insted of double) lines and tree + const ExPolygonsIndices ids(expolygons); + const std::vector lines = Slic3r::to_linesf(expolygons, ids.get_count()); + AABBTreeIndirect::Tree<2, double> tree = AABBTreeLines::build_aabb_tree_over_indexed_lines(lines); + // Result close points + Points res; + size_t point_index = 0; + auto collect_close = [&res, &point_index, &lines, &tree, &distance, &ids, &expolygons](const Points &pts) { + for (const Point &p : pts) { + Vec2d p_d = p.cast(); + std::vector close_lines = AABBTreeLines::all_lines_in_radius(lines, tree, p_d, distance); + for (size_t index : close_lines) { + // skip point neighbour lines indices + if (index == point_index) continue; + if (&p != &pts.front()) { + if (index == point_index - 1) continue; + } else if (index == (pts.size()-1)) continue; + + // do not doubled side point of segment + const ExPolygonsIndex id = ids.cvt(index); + const ExPolygon &expoly = expolygons[id.expolygons_index]; + const Polygon &poly = id.is_contour() ? expoly.contour : expoly.holes[id.hole_index()]; + const Points &poly_pts = poly.points; + const Point &line_a = poly_pts[id.point_index]; + const Point &line_b = (!ids.is_last_point(id)) ? poly_pts[id.point_index + 1] : poly_pts.front(); + assert(line_a == lines[index].a.cast()); + assert(line_b == lines[index].b.cast()); + if (p == line_a || p == line_b) continue; + res.push_back(p); + } + ++point_index; + } + }; + for (const ExPolygon &expoly : expolygons) { + collect_close(expoly.contour.points); + for (const Polygon &hole : expoly.holes) + collect_close(hole.points); + } + if (res.empty()) return {}; + std::sort(res.begin(), res.end()); + // only unique points + res.erase(std::unique(res.begin(), res.end()), res.end()); + return res; +} + +bool Emboss::divide_segments_for_close_point(ExPolygons &expolygons, double distance) +{ + if (expolygons.empty()) return false; + if (distance < 0.) return false; + + // ExPolygons can't contain same neigbours + priv::remove_same_neighbor(expolygons); + + // IMPROVE: use int(insted of double) lines and tree + const ExPolygonsIndices ids(expolygons); + const std::vector lines = Slic3r::to_linesf(expolygons, ids.get_count()); + AABBTreeIndirect::Tree<2, double> tree = AABBTreeLines::build_aabb_tree_over_indexed_lines(lines); + using Div = std::pair; + std::vector
    divs; + size_t point_index = 0; + auto check_points = [&divs, &point_index, &lines, &tree, &distance, &ids, &expolygons](const Points &pts) { + for (const Point &p : pts) { + Vec2d p_d = p.cast(); + std::vector close_lines = AABBTreeLines::all_lines_in_radius(lines, tree, p_d, distance); + for (size_t index : close_lines) { + // skip point neighbour lines indices + if (index == point_index) continue; + if (&p != &pts.front()) { + if (index == point_index - 1) continue; + } else if (index == (pts.size()-1)) continue; + + // do not doubled side point of segment + const ExPolygonsIndex id = ids.cvt(index); + const ExPolygon &expoly = expolygons[id.expolygons_index]; + const Polygon &poly = id.is_contour() ? expoly.contour : expoly.holes[id.hole_index()]; + const Points &poly_pts = poly.points; + const Point &line_a = poly_pts[id.point_index]; + const Point &line_b = (!ids.is_last_point(id)) ? poly_pts[id.point_index + 1] : poly_pts.front(); + assert(line_a == lines[index].a.cast()); + assert(line_b == lines[index].b.cast()); + if (p == line_a || p == line_b) continue; + + divs.emplace_back(p, index); + } + ++point_index; + } + }; + for (const ExPolygon &expoly : expolygons) { + check_points(expoly.contour.points); + for (const Polygon &hole : expoly.holes) + check_points(hole.points); + } + + // check if exist division + if (divs.empty()) return false; + + // sort from biggest index to zero + // to be able add points and not interupt indices + std::sort(divs.begin(), divs.end(), + [](const Div &d1, const Div &d2) { return d1.second > d2.second; }); + + auto it = divs.begin(); + // divide close line + while (it != divs.end()) { + // colect division of a line segmen + size_t index = it->second; + auto it2 = it+1; + while (it2 != divs.end() && it2->second == index) ++it2; + + ExPolygonsIndex id = ids.cvt(index); + ExPolygon &expoly = expolygons[id.expolygons_index]; + Polygon &poly = id.is_contour() ? expoly.contour : expoly.holes[id.hole_index()]; + Points &pts = poly.points; + size_t count = it2 - it; + + // add points into polygon to divide in place of near point + if (count == 1) { + pts.insert(pts.begin() + id.point_index + 1, it->first); + ++it; + } else { + // collect points to add into polygon + Points points; + points.reserve(count); + for (; it < it2; ++it) + points.push_back(it->first); + + // need sort by line direction + const Linef &line = lines[index]; + Vec2d dir = line.b - line.a; + // select mayorit direction + int axis = (abs(dir.x()) > abs(dir.y())) ? 0 : 1; + using Fnc = std::function; + Fnc fnc = (dir[axis] < 0) ? Fnc([axis](const Point &p1, const Point &p2) { return p1[axis] > p2[axis]; }) : + Fnc([axis](const Point &p1, const Point &p2) { return p1[axis] < p2[axis]; }) ; + std::sort(points.begin(), points.end(), fnc); + + // use only unique points + points.erase(std::unique(points.begin(), points.end()), points.end()); + + // divide line by adding points into polygon + pts.insert(pts.begin() + id.point_index + 1, + points.begin(), points.end()); + } + assert(it == it2); + } + return true; +} + +bool priv::remove_self_intersections(ExPolygons &shape, unsigned max_iteration) { + if (shape.empty()) + return true; + + Pointfs intersections_f = intersection_points(shape); + if (intersections_f.empty()) + return true; + + // create loop permanent memory + Polygons holes; + Points intersections; + + while (--max_iteration) { + // convert intersections into Points + assert(intersections.empty()); + intersections.reserve(intersections_f.size()); + std::transform(intersections_f.begin(), intersections_f.end(), std::back_inserter(intersections), + [](const Vec2d &p) { return Point(std::floor(p.x()), std::floor(p.y())); }); + + // intersections should be unique poits + std::sort(intersections.begin(), intersections.end()); + auto it = std::unique(intersections.begin(), intersections.end()); + intersections.erase(it, intersections.end()); + + assert(holes.empty()); + holes.reserve(intersections.size()); + + // Fix self intersection in result by subtracting hole 2x2 + for (const Point &p : intersections) { + Polygon hole(priv::pts_2x2); + hole.translate(p); + holes.push_back(hole); + } + // union overlapped holes + if (holes.size() > 1) + holes = Slic3r::union_(holes); + shape = Slic3r::diff_ex(shape, holes, ApplySafetyOffset::Yes); + + // TODO: find where diff ex could create same neighbor + priv::remove_same_neighbor(shape); + + // find new intersections made by diff_ex + intersections_f = intersection_points(shape); + if (intersections_f.empty()) + return true; + else { + // clear permanent vectors + holes.clear(); + intersections.clear(); + } + } + assert(max_iteration == 0); + assert(!intersections_f.empty()); + return false; +} + +ExPolygons Emboss::heal_shape(const Polygons &shape) +{ + // When edit this code check that font 'ALIENATE.TTF' and glyph 'i' still work + // fix of self intersections + // http://www.angusj.com/delphi/clipper/documentation/Docs/Units/ClipperLib/Functions/SimplifyPolygon.htm + ClipperLib::Paths paths = ClipperLib::SimplifyPolygons(ClipperUtils::PolygonsProvider(shape), ClipperLib::pftNonZero); + const double clean_distance = 1.415; // little grater than sqrt(2) + ClipperLib::CleanPolygons(paths, clean_distance); + Polygons polygons = to_polygons(paths); + polygons.erase(std::remove_if(polygons.begin(), polygons.end(), [](const Polygon &p) { return p.size() < 3; }), polygons.end()); + + // Do not remove all duplicates but do it better way + // Overlap all duplicit points by rectangle 3x3 + Points duplicits = collect_duplicates(to_points(polygons)); + if (!duplicits.empty()) { + polygons.reserve(polygons.size() + duplicits.size()); + for (const Point &p : duplicits) { + Polygon rect_3x3(priv::pts_3x3); + rect_3x3.translate(p); + polygons.push_back(rect_3x3); + } + } + + // TrueTypeFonts use non zero winding number + // https://docs.microsoft.com/en-us/typography/opentype/spec/ttch01 + // https://developer.apple.com/fonts/TrueType-Reference-Manual/RM01/Chap1.html + ExPolygons res = Slic3r::union_ex(polygons, ClipperLib::pftNonZero); + heal_shape(res); + return res; +} + +#include "libslic3r/SVG.hpp" +void priv::visualize_heal(const std::string &svg_filepath, const ExPolygons &expolygons) { + Points pts = to_points(expolygons); + BoundingBox bb(pts); + //double svg_scale = SHAPE_SCALE / unscale(1.); + // bb.scale(svg_scale); + SVG svg(svg_filepath, bb); + svg.draw(expolygons); + + Points duplicits = collect_duplicates(pts); + svg.draw(duplicits, "black", 7 / SHAPE_SCALE); + + Pointfs intersections_f = intersection_points(expolygons); + Points intersections; + intersections.reserve(intersections_f.size()); + std::transform(intersections_f.begin(), intersections_f.end(), std::back_inserter(intersections), + [](const Vec2d &p) { return p.cast(); }); + svg.draw(intersections, "red", 8 / SHAPE_SCALE); +} + +bool Emboss::heal_shape(ExPolygons &shape, unsigned max_iteration) +{ + return priv::heal_dupl_inter(shape, max_iteration); +} + +#ifndef HEAL_WITH_CLOSING +bool priv::heal_dupl_inter(ExPolygons &shape, unsigned max_iteration) +{ + if (shape.empty()) return true; + + // create loop permanent memory + Polygons holes; + Points intersections; + while (--max_iteration) { + priv::remove_same_neighbor(shape); + Pointfs intersections_f = intersection_points(shape); + + // convert intersections into Points + assert(intersections.empty()); + intersections.reserve(intersections_f.size()); + std::transform(intersections_f.begin(), intersections_f.end(), std::back_inserter(intersections), + [](const Vec2d &p) { return Point(std::floor(p.x()), std::floor(p.y())); }); + + // intersections should be unique poits + std::sort(intersections.begin(), intersections.end()); + auto it = std::unique(intersections.begin(), intersections.end()); + intersections.erase(it, intersections.end()); + + Points duplicates = collect_duplicates(to_points(shape)); + // duplicates are already uniqua and sorted + + // Check whether shape is already healed + if (intersections.empty() && duplicates.empty()) + return true; + + assert(holes.empty()); + holes.reserve(intersections.size() + duplicates.size()); + + remove_spikes_in_duplicates(shape, duplicates); + + // Fix self intersection in result by subtracting hole 2x2 + for (const Point &p : intersections) { + Polygon hole(priv::pts_2x2); + hole.translate(p); + holes.push_back(hole); + } + + // Fix duplicit points by hole 3x3 around duplicit point + for (const Point &p : duplicates) { + Polygon hole(priv::pts_3x3); + hole.translate(p); + holes.push_back(hole); + } + + holes = Slic3r::union_(holes); + shape = Slic3r::diff_ex(shape, holes, ApplySafetyOffset::Yes); + + // prepare for next loop + holes.clear(); + intersections.clear(); + } + + //priv::visualize_heal("C:/data/temp/heal.svg", shape); + assert(false); + shape = {priv::create_bounding_rect(shape)}; + return false; +} +#else +bool priv::heal_dupl_inter(ExPolygons &shape, unsigned max_iteration) +{ + priv::remove_same_neighbor(shape); + + const float delta = 2.f; + const ClipperLib::JoinType joinType = ClipperLib::JoinType::jtRound; + + // remove double points + while (max_iteration) { + --max_iteration; + + // if(!priv::remove_self_intersections(shape, max_iteration)) break; + shape = Slic3r::union_ex(shape); + shape = Slic3r::closing_ex(shape, delta, joinType); + + // double minimal_area = 1000; + // priv::remove_small_islands(shape, minimal_area); + + // check that duplicates and intersections do NOT exists + Points duplicits = collect_duplicates(to_points(shape)); + Pointfs intersections_f = intersection_points(shape); + if (duplicits.empty() && intersections_f.empty()) + return true; + } + + // priv::visualize_heal("C:/data/temp/heal.svg", shape); + assert(false); + shape = {priv::create_bounding_rect(shape)}; + return false; +} +#endif // !HEAL_WITH_CLOSING + +ExPolygon priv::create_bounding_rect(const ExPolygons &shape) { + BoundingBox bb = get_extents(shape); + Point size = bb.size(); + if (size.x() < 10) + bb.max.x() += 10; + if (size.y() < 10) + bb.max.y() += 10; + + Polygon rect({// CCW + bb.min, + {bb.max.x(), bb.min.y()}, + bb.max, + {bb.min.x(), bb.max.y()}}); + + Point offset = bb.size() * 0.1; + Polygon hole({// CW + bb.min + offset, + {bb.min.x() + offset.x(), bb.max.y() - offset.y()}, + bb.max - offset, + {bb.max.x() - offset.x(), bb.min.y() + offset.y()}}); + + return ExPolygon(rect, hole); +} + +void priv::remove_small_islands(ExPolygons &expolygons, double minimal_area) { + if (expolygons.empty()) + return; + + // remove small expolygons contours + auto expoly_it = std::remove_if(expolygons.begin(), expolygons.end(), + [&minimal_area](const ExPolygon &p) { return p.contour.area() < minimal_area; }); + expolygons.erase(expoly_it, expolygons.end()); + + // remove small holes in expolygons + for (ExPolygon &expoly : expolygons) { + Polygons& holes = expoly.holes; + auto it = std::remove_if(holes.begin(), holes.end(), + [&minimal_area](const Polygon &p) { return -p.area() < minimal_area; }); + holes.erase(it, holes.end()); + } +} + +std::optional priv::get_glyph(const stbtt_fontinfo &font_info, int unicode_letter, float flatness) +{ + int glyph_index = stbtt_FindGlyphIndex(&font_info, unicode_letter); + if (glyph_index == 0) { + //wchar_t wchar = static_cast(unicode_letter); + //<< "Character unicode letter (" + //<< "decimal value = " << std::dec << unicode_letter << ", " + //<< "hexadecimal value = U+" << std::hex << unicode_letter << std::dec << ", " + //<< "wchar value = " << wchar + //<< ") is NOT defined inside of the font. \n"; + return {}; + } + + Glyph glyph; + stbtt_GetGlyphHMetrics(&font_info, glyph_index, &glyph.advance_width, &glyph.left_side_bearing); + + stbtt_vertex *vertices; + int num_verts = stbtt_GetGlyphShape(&font_info, glyph_index, &vertices); + if (num_verts <= 0) return glyph; // no shape + ScopeGuard sg1([&vertices]() { free(vertices); }); + + int *contour_lengths = NULL; + int num_countour_int = 0; + stbtt__point *points = stbtt_FlattenCurves(vertices, num_verts, + flatness, &contour_lengths, &num_countour_int, font_info.userdata); + if (!points) return glyph; // no valid flattening + ScopeGuard sg2([&contour_lengths, &points]() { + free(contour_lengths); + free(points); + }); + + size_t num_contour = static_cast(num_countour_int); + Polygons glyph_polygons; + glyph_polygons.reserve(num_contour); + size_t pi = 0; // point index + for (size_t ci = 0; ci < num_contour; ++ci) { + int length = contour_lengths[ci]; + // check minimal length for triangle + if (length < 4) { + // weird font + pi+=length; + continue; + } + // last point is first point + --length; + Points pts; + pts.reserve(length); + for (int i = 0; i < length; ++i) + pts.emplace_back(to_point(points[pi++])); + + // last point is first point --> closed contour + assert(pts.front() == to_point(points[pi])); + ++pi; + + // change outer cw to ccw and inner ccw to cw order + std::reverse(pts.begin(), pts.end()); + glyph_polygons.emplace_back(pts); + } + if (!glyph_polygons.empty()) + glyph.shape = Emboss::heal_shape(glyph_polygons); + return glyph; +} + +const Glyph* priv::get_glyph( + int unicode, + const FontFile & font, + const FontProp & font_prop, + Glyphs & cache, + fontinfo_opt &font_info_opt) +{ + // TODO: Use resolution by printer configuration, or add it into FontProp + const float RESOLUTION = 0.0125f; // [in mm] + auto glyph_item = cache.find(unicode); + if (glyph_item != cache.end()) return &glyph_item->second; + + unsigned int font_index = font_prop.collection_number.has_value()? + *font_prop.collection_number : 0; + if (!is_valid(font, font_index)) return nullptr; + + if (!font_info_opt.has_value()) { + + font_info_opt = priv::load_font_info(font.data->data(), font_index); + // can load font info? + if (!font_info_opt.has_value()) return nullptr; + } + + float flatness = font.infos[font_index].ascent * RESOLUTION / font_prop.size_in_mm; + + // Fix for very small flatness because it create huge amount of points from curve + if (flatness < RESOLUTION) flatness = RESOLUTION; + + std::optional glyph_opt = + priv::get_glyph(*font_info_opt, unicode, flatness); + + // IMPROVE: multiple loadig glyph without data + // has definition inside of font? + if (!glyph_opt.has_value()) return nullptr; + + if (font_prop.char_gap.has_value()) + glyph_opt->advance_width += *font_prop.char_gap; + + // scale glyph size + glyph_opt->advance_width = + static_cast(glyph_opt->advance_width / SHAPE_SCALE); + glyph_opt->left_side_bearing = + static_cast(glyph_opt->left_side_bearing / SHAPE_SCALE); + + if (!glyph_opt->shape.empty()) { + if (font_prop.boldness.has_value()) { + float delta = *font_prop.boldness / SHAPE_SCALE / + font_prop.size_in_mm; + glyph_opt->shape = Slic3r::union_ex(offset_ex(glyph_opt->shape, delta)); + } + if (font_prop.skew.has_value()) { + const float &ratio = *font_prop.skew; + auto skew = [&ratio](Polygon &polygon) { + for (Slic3r::Point &p : polygon.points) { + p.x() += p.y() * ratio; + } + }; + for (ExPolygon &expolygon : glyph_opt->shape) { + skew(expolygon.contour); + for (Polygon &hole : expolygon.holes) skew(hole); + } + } + } + auto it = cache.insert({unicode, std::move(*glyph_opt)}); + assert(it.second); + return &it.first->second; +} + +EmbossStyle priv::create_style(std::wstring name, std::wstring path) { + return { boost::nowide::narrow(name.c_str()), + boost::nowide::narrow(path.c_str()), + EmbossStyle::Type::file_path, FontProp() }; +} + +Point priv::to_point(const stbtt__point &point) { + return Point(static_cast(std::round(point.x / SHAPE_SCALE)), + static_cast(std::round(point.y / SHAPE_SCALE))); +} + +#ifdef _WIN32 +#include +#include +#include +#include + +// Get system font file path +std::optional Emboss::get_font_path(const std::wstring &font_face_name) +{ +// static const LPWSTR fontRegistryPath = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"; + static const LPCWSTR fontRegistryPath = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"; + HKEY hKey; + LONG result; + + // Open Windows font registry key + result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, fontRegistryPath, 0, KEY_READ, &hKey); + if (result != ERROR_SUCCESS) return {}; + + DWORD maxValueNameSize, maxValueDataSize; + result = RegQueryInfoKey(hKey, 0, 0, 0, 0, 0, 0, 0, &maxValueNameSize, &maxValueDataSize, 0, 0); + if (result != ERROR_SUCCESS) return {}; + + DWORD valueIndex = 0; + LPWSTR valueName = new WCHAR[maxValueNameSize]; + LPBYTE valueData = new BYTE[maxValueDataSize]; + DWORD valueNameSize, valueDataSize, valueType; + std::wstring wsFontFile; + + // Look for a matching font name + do { + wsFontFile.clear(); + valueDataSize = maxValueDataSize; + valueNameSize = maxValueNameSize; + + result = RegEnumValue(hKey, valueIndex, valueName, &valueNameSize, 0, &valueType, valueData, &valueDataSize); + + valueIndex++; + if (result != ERROR_SUCCESS || valueType != REG_SZ) { + continue; + } + + std::wstring wsValueName(valueName, valueNameSize); + + // Found a match + if (_wcsnicmp(font_face_name.c_str(), wsValueName.c_str(), font_face_name.length()) == 0) { + + wsFontFile.assign((LPWSTR)valueData, valueDataSize); + break; + } + }while (result != ERROR_NO_MORE_ITEMS); + + delete[] valueName; + delete[] valueData; + + RegCloseKey(hKey); + + if (wsFontFile.empty()) return {}; + + // Build full font file path + WCHAR winDir[MAX_PATH]; + GetWindowsDirectory(winDir, MAX_PATH); + + std::wstringstream ss; + ss << winDir << "\\Fonts\\" << wsFontFile; + wsFontFile = ss.str(); + + return wsFontFile; +} + +EmbossStyles Emboss::get_font_list() +{ + //EmbossStyles list1 = get_font_list_by_enumeration(); + //EmbossStyles list2 = get_font_list_by_register(); + //EmbossStyles list3 = get_font_list_by_folder(); + return get_font_list_by_register(); +} + +EmbossStyles Emboss::get_font_list_by_register() { +// static const LPWSTR fontRegistryPath = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"; + static const LPCWSTR fontRegistryPath = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"; + HKEY hKey; + LONG result; + + // Open Windows font registry key + result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, fontRegistryPath, 0, KEY_READ, &hKey); + if (result != ERROR_SUCCESS) { + assert(false); + //std::wcerr << L"Can not Open register key (" << fontRegistryPath << ")" + // << L", function 'RegOpenKeyEx' return code: " << result << std::endl; + return {}; + } + + DWORD maxValueNameSize, maxValueDataSize; + result = RegQueryInfoKey(hKey, 0, 0, 0, 0, 0, 0, 0, &maxValueNameSize, + &maxValueDataSize, 0, 0); + if (result != ERROR_SUCCESS) { + assert(false); + // Can not earn query key, function 'RegQueryInfoKey' return code: result + return {}; + } + + // Build full font file path + WCHAR winDir[MAX_PATH]; + GetWindowsDirectory(winDir, MAX_PATH); + std::wstring font_path = std::wstring(winDir) + L"\\Fonts\\"; + + EmbossStyles font_list; + DWORD valueIndex = 0; + // Look for a matching font name + LPWSTR font_name = new WCHAR[maxValueNameSize]; + LPBYTE fileTTF_name = new BYTE[maxValueDataSize]; + DWORD font_name_size, fileTTF_name_size, valueType; + do { + fileTTF_name_size = maxValueDataSize; + font_name_size = maxValueNameSize; + + result = RegEnumValue(hKey, valueIndex, font_name, &font_name_size, 0, + &valueType, fileTTF_name, &fileTTF_name_size); + valueIndex++; + if (result != ERROR_SUCCESS || valueType != REG_SZ) continue; + std::wstring font_name_w(font_name, font_name_size); + std::wstring file_name_w((LPWSTR) fileTTF_name, fileTTF_name_size); + std::wstring path_w = font_path + file_name_w; + + // filtrate .fon from lists + size_t pos = font_name_w.rfind(L" (TrueType)"); + if (pos >= font_name_w.size()) continue; + // remove TrueType text from name + font_name_w = std::wstring(font_name_w, 0, pos); + font_list.emplace_back(priv::create_style(font_name_w, path_w)); + } while (result != ERROR_NO_MORE_ITEMS); + delete[] font_name; + delete[] fileTTF_name; + + RegCloseKey(hKey); + return font_list; +} + +// TODO: Fix global function +bool CALLBACK EnumFamCallBack(LPLOGFONT lplf, + LPNEWTEXTMETRIC lpntm, + DWORD FontType, + LPVOID aFontList) +{ + std::vector *fontList = + (std::vector *) (aFontList); + if (FontType & TRUETYPE_FONTTYPE) { + std::wstring name = lplf->lfFaceName; + fontList->push_back(name); + } + return true; + // UNREFERENCED_PARAMETER(lplf); + UNREFERENCED_PARAMETER(lpntm); +} + +EmbossStyles Emboss::get_font_list_by_enumeration() { + + HDC hDC = GetDC(NULL); + std::vector font_names; + EnumFontFamilies(hDC, (LPCTSTR) NULL, (FONTENUMPROC) EnumFamCallBack, + (LPARAM) &font_names); + + EmbossStyles font_list; + for (const std::wstring &font_name : font_names) { + font_list.emplace_back(priv::create_style(font_name, L"")); + } + return font_list; +} + +EmbossStyles Emboss::get_font_list_by_folder() { + EmbossStyles result; + WCHAR winDir[MAX_PATH]; + UINT winDir_size = GetWindowsDirectory(winDir, MAX_PATH); + std::wstring search_dir = std::wstring(winDir, winDir_size) + L"\\Fonts\\"; + WIN32_FIND_DATA fd; + HANDLE hFind; + // By https://en.wikipedia.org/wiki/TrueType has also suffix .tte + std::vector suffixes = {L"*.ttf", L"*.ttc", L"*.tte"}; + for (const std::wstring &suffix : suffixes) { + hFind = ::FindFirstFile((search_dir + suffix).c_str(), &fd); + if (hFind == INVALID_HANDLE_VALUE) continue; + do { + // skip folder . and .. + if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue; + std::wstring file_name(fd.cFileName); + // TODO: find font name instead of filename + result.emplace_back(priv::create_style(file_name, search_dir + file_name)); + } while (::FindNextFile(hFind, &fd)); + ::FindClose(hFind); + } + return result; +} + +#else +EmbossStyles Emboss::get_font_list() { + // not implemented + return {}; +} + +std::optional Emboss::get_font_path(const std::wstring &font_face_name){ + // not implemented + return {}; +} +#endif + +std::unique_ptr Emboss::create_font_file( + std::unique_ptr> data) +{ + int collection_size = stbtt_GetNumberOfFonts(data->data()); + // at least one font must be inside collection + if (collection_size < 1) { + assert(false); + // There is no font collection inside font data + return nullptr; + } + + unsigned int c_size = static_cast(collection_size); + std::vector infos; + infos.reserve(c_size); + for (unsigned int i = 0; i < c_size; ++i) { + auto font_info = priv::load_font_info(data->data(), i); + if (!font_info.has_value()) return nullptr; + + const stbtt_fontinfo *info = &(*font_info); + // load information about line gap + int ascent, descent, linegap; + stbtt_GetFontVMetrics(info, &ascent, &descent, &linegap); + + float pixels = 1000.; // value is irelevant + float em_pixels = stbtt_ScaleForMappingEmToPixels(info, pixels); + int units_per_em = static_cast(std::round(pixels / em_pixels)); + + infos.emplace_back(FontFile::Info{ascent, descent, linegap, units_per_em}); + } + return std::make_unique(std::move(data), std::move(infos)); +} + +std::unique_ptr Emboss::create_font_file(const char *file_path) +{ + FILE *file = std::fopen(file_path, "rb"); + if (file == nullptr) { + assert(false); + BOOST_LOG_TRIVIAL(error) << "Couldn't open " << file_path << " for reading."; + return nullptr; + } + ScopeGuard sg([&file]() { std::fclose(file); }); + + // find size of file + if (fseek(file, 0L, SEEK_END) != 0) { + assert(false); + BOOST_LOG_TRIVIAL(error) << "Couldn't fseek file " << file_path << " for size measure."; + return nullptr; + } + size_t size = ftell(file); + if (size == 0) { + assert(false); + BOOST_LOG_TRIVIAL(error) << "Size of font file is zero. Can't read."; + return nullptr; + } + rewind(file); + auto buffer = std::make_unique>(size); + size_t count_loaded_bytes = fread((void *) &buffer->front(), 1, size, file); + if (count_loaded_bytes != size) { + assert(false); + BOOST_LOG_TRIVIAL(error) << "Different loaded(from file) data size."; + return nullptr; + } + return create_font_file(std::move(buffer)); +} + + +#ifdef _WIN32 +static bool load_hfont(void* hfont, DWORD &dwTable, DWORD &dwOffset, size_t& size, HDC hdc = nullptr){ + bool del_hdc = false; + if (hdc == nullptr) { + del_hdc = true; + hdc = ::CreateCompatibleDC(NULL); + if (hdc == NULL) return false; + } + + // To retrieve the data from the beginning of the file for TrueType + // Collection files specify 'ttcf' (0x66637474). + dwTable = 0x66637474; + dwOffset = 0; + + ::SelectObject(hdc, hfont); + size = ::GetFontData(hdc, dwTable, dwOffset, NULL, 0); + if (size == GDI_ERROR) { + // HFONT is NOT TTC(collection) + dwTable = 0; + size = ::GetFontData(hdc, dwTable, dwOffset, NULL, 0); + } + + if (size == 0 || size == GDI_ERROR) { + if (del_hdc) ::DeleteDC(hdc); + return false; + } + return true; +} + +void *Emboss::can_load(void *hfont) +{ + DWORD dwTable=0, dwOffset=0; + size_t size = 0; + if (!load_hfont(hfont, dwTable, dwOffset, size)) return nullptr; + return hfont; +} + +std::unique_ptr Emboss::create_font_file(void *hfont) +{ + HDC hdc = ::CreateCompatibleDC(NULL); + if (hdc == NULL) { + assert(false); + BOOST_LOG_TRIVIAL(error) << "Can't create HDC by CreateCompatibleDC(NULL)."; + return nullptr; + } + + DWORD dwTable=0,dwOffset = 0; + size_t size; + if (!load_hfont(hfont, dwTable, dwOffset, size, hdc)) { + ::DeleteDC(hdc); + return nullptr; + } + auto buffer = std::make_unique>(size); + size_t loaded_size = ::GetFontData(hdc, dwTable, dwOffset, buffer->data(), size); + ::DeleteDC(hdc); + if (size != loaded_size) { + assert(false); + BOOST_LOG_TRIVIAL(error) << "Different loaded(from HFONT) data size."; + return nullptr; + } + return create_font_file(std::move(buffer)); +} +#endif // _WIN32 + +std::optional Emboss::letter2glyph(const FontFile &font, + unsigned int font_index, + int letter, + float flatness) +{ + if (!priv::is_valid(font, font_index)) return {}; + auto font_info_opt = priv::load_font_info(font.data->data(), font_index); + if (!font_info_opt.has_value()) return {}; + return priv::get_glyph(*font_info_opt, letter, flatness); +} + +ExPolygons Emboss::text2shapes(FontFileWithCache &font_with_cache, + const char *text, + const FontProp &font_prop, + std::function was_canceled) +{ + assert(font_with_cache.has_value()); + fontinfo_opt font_info_opt; + Point cursor(0, 0); + ExPolygons result; + const FontFile& font = *font_with_cache.font_file; + unsigned int font_index = font_prop.collection_number.has_value()? + *font_prop.collection_number : 0; + if (!priv::is_valid(font, font_index)) return {}; + const FontFile::Info& info = font.infos[font_index]; + Glyphs& cache = *font_with_cache.cache; + std::wstring ws = boost::nowide::widen(text); + for (wchar_t wc: ws){ + if (wc == '\n') { + int line_height = info.ascent - info.descent + info.linegap; + if (font_prop.line_gap.has_value()) + line_height += *font_prop.line_gap; + line_height = static_cast(line_height / SHAPE_SCALE); + + cursor.x() = 0; + cursor.y() -= line_height; + continue; + } + if (wc == '\t') { + // '\t' = 4*space => same as imgui + const int count_spaces = 4; + const Glyph* space = priv::get_glyph(int(' '), font, font_prop, cache, font_info_opt); + if (space == nullptr) continue; + cursor.x() += count_spaces * space->advance_width; + continue; + } + if (wc == '\r') continue; + + int unicode = static_cast(wc); + // check cancelation only before unknown symbol - loading of symbol could be timeconsuming on slow computer and dificult fonts + auto it = cache.find(unicode); + if (it == cache.end() && was_canceled != nullptr && was_canceled()) return {}; + const Glyph *glyph_ptr = (it != cache.end())? &it->second : + priv::get_glyph(unicode, font, font_prop, cache, font_info_opt); + if (glyph_ptr == nullptr) continue; + + // move glyph to cursor position + ExPolygons expolygons = glyph_ptr->shape; // copy + for (ExPolygon &expolygon : expolygons) + expolygon.translate(cursor); + + cursor.x() += glyph_ptr->advance_width; + expolygons_append(result, std::move(expolygons)); + } + result = Slic3r::union_ex(result); + heal_shape(result); + return result; +} + +void Emboss::apply_transformation(const FontProp &font_prop, Transform3d &transformation){ + apply_transformation(font_prop.angle, font_prop.distance, transformation); +} + +void Emboss::apply_transformation(const std::optional& angle, const std::optional& distance, Transform3d &transformation) { + if (angle.has_value()) { + double angle_z = *angle; + transformation *= Eigen::AngleAxisd(angle_z, Vec3d::UnitZ()); + } + if (distance.has_value()) { + Vec3d translate = Vec3d::UnitZ() * (*distance); + transformation.translate(translate); + } +} + +bool Emboss::is_italic(const FontFile &font, unsigned int font_index) +{ + if (font_index >= font.infos.size()) return false; + fontinfo_opt font_info_opt = priv::load_font_info(font.data->data(), font_index); + + if (!font_info_opt.has_value()) return false; + stbtt_fontinfo *info = &(*font_info_opt); + + // https://docs.microsoft.com/cs-cz/typography/opentype/spec/name + // https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6name.html + // 2 ==> Style / Subfamily name + int name_id = 2; + int length; + const char* value = stbtt_GetFontNameString(info, &length, + STBTT_PLATFORM_ID_MICROSOFT, + STBTT_MS_EID_UNICODE_BMP, + STBTT_MS_LANG_ENGLISH, + name_id); + + // value is big endian utf-16 i need extract only normal chars + std::string value_str; + value_str.reserve(length / 2); + for (int i = 1; i < length; i += 2) + value_str.push_back(value[i]); + + // lower case + std::transform(value_str.begin(), value_str.end(), value_str.begin(), + [](unsigned char c) { return std::tolower(c); }); + + const std::vector italics({"italic", "oblique"}); + for (const std::string &it : italics) { + if (value_str.find(it) != std::string::npos) { + return true; + } + } + return false; +} + +std::string Emboss::create_range_text(const std::string &text, + const FontFile &font, + unsigned int font_index, + bool *exist_unknown) +{ + if (!priv::is_valid(font, font_index)) return {}; + + std::wstring ws = boost::nowide::widen(text); + + // need remove symbols not contained in font + std::sort(ws.begin(), ws.end()); + + auto font_info_opt = priv::load_font_info(font.data->data(), 0); + if (!font_info_opt.has_value()) return {}; + const stbtt_fontinfo *font_info = &(*font_info_opt); + + if (exist_unknown != nullptr) *exist_unknown = false; + int prev_unicode = -1; + ws.erase(std::remove_if(ws.begin(), ws.end(), + [&prev_unicode, font_info, exist_unknown](wchar_t wc) -> bool { + int unicode = static_cast(wc); + + // skip white spaces + if (unicode == '\n' || + unicode == '\r' || + unicode == '\t') return true; + + // is duplicit? + if (prev_unicode == unicode) return true; + prev_unicode = unicode; + + // can find in font? + bool is_unknown = !stbtt_FindGlyphIndex(font_info, unicode); + if (is_unknown && exist_unknown != nullptr) + *exist_unknown = true; + return is_unknown; + }), ws.end()); + + return boost::nowide::narrow(ws); +} + +double Emboss::get_shape_scale(const FontProp &fp, const FontFile &ff) +{ + const auto &cn = fp.collection_number; + unsigned int font_index = (cn.has_value()) ? *cn : 0; + int unit_per_em = ff.infos[font_index].unit_per_em; + double scale = fp.size_in_mm / unit_per_em; + // Shape is scaled for store point coordinate as integer + return scale * SHAPE_SCALE; +} + +namespace priv { + +void add_quad(uint32_t i1, + uint32_t i2, + indexed_triangle_set &result, + uint32_t count_point) +{ + // bottom indices + uint32_t i1_ = i1 + count_point; + uint32_t i2_ = i2 + count_point; + result.indices.emplace_back(i2, i2_, i1); + result.indices.emplace_back(i1_, i1, i2_); +}; + +indexed_triangle_set polygons2model_unique( + const ExPolygons &shape2d, + const IProjection &projection, + const Points &points) +{ + // CW order of triangle indices + std::vector shape_triangles=Triangulation::triangulate(shape2d, points); + uint32_t count_point = points.size(); + + indexed_triangle_set result; + result.vertices.reserve(2 * count_point); + std::vector &front_points = result.vertices; // alias + std::vector back_points; + back_points.reserve(count_point); + + for (const Point &p : points) { + auto p2 = projection.create_front_back(p); + front_points.push_back(p2.first.cast()); + back_points.push_back(p2.second.cast()); + } + + // insert back points, front are already in + result.vertices.insert(result.vertices.end(), + std::make_move_iterator(back_points.begin()), + std::make_move_iterator(back_points.end())); + result.indices.reserve(shape_triangles.size() * 2 + points.size() * 2); + // top triangles - change to CCW + for (const Vec3i &t : shape_triangles) + result.indices.emplace_back(t.x(), t.z(), t.y()); + // bottom triangles - use CW + for (const Vec3i &t : shape_triangles) + result.indices.emplace_back(t.x() + count_point, + t.y() + count_point, + t.z() + count_point); + + // quads around - zig zag by triangles + size_t polygon_offset = 0; + auto add_quads = [&polygon_offset,&result, &count_point] + (const Polygon& polygon) { + uint32_t polygon_points = polygon.points.size(); + // previous index + uint32_t prev = polygon_offset + polygon_points - 1; + for (uint32_t p = 0; p < polygon_points; ++p) { + uint32_t index = polygon_offset + p; + add_quad(prev, index, result, count_point); + prev = index; + } + polygon_offset += polygon_points; + }; + + for (const ExPolygon &expolygon : shape2d) { + add_quads(expolygon.contour); + for (const Polygon &hole : expolygon.holes) add_quads(hole); + } + + return result; +} + +indexed_triangle_set polygons2model_duplicit( + const ExPolygons &shape2d, + const IProjection &projection, + const Points &points, + const Points &duplicits) +{ + // CW order of triangle indices + std::vector changes = Triangulation::create_changes(points, duplicits); + std::vector shape_triangles = Triangulation::triangulate(shape2d, points, changes); + uint32_t count_point = *std::max_element(changes.begin(), changes.end()) + 1; + + indexed_triangle_set result; + result.vertices.reserve(2 * count_point); + std::vector &front_points = result.vertices; + std::vector back_points; + back_points.reserve(count_point); + + uint32_t max_index = std::numeric_limits::max(); + for (uint32_t i = 0; i < changes.size(); ++i) { + uint32_t index = changes[i]; + if (max_index != std::numeric_limits::max() && + index <= max_index) continue; // duplicit point + assert(index == max_index + 1); + assert(front_points.size() == index); + assert(back_points.size() == index); + max_index = index; + const Point &p = points[i]; + auto p2 = projection.create_front_back(p); + front_points.push_back(p2.first.cast()); + back_points.push_back(p2.second.cast()); + } + assert(max_index+1 == count_point); + + // insert back points, front are already in + result.vertices.insert(result.vertices.end(), + std::make_move_iterator(back_points.begin()), + std::make_move_iterator(back_points.end())); + + result.indices.reserve(shape_triangles.size() * 2 + points.size() * 2); + // top triangles - change to CCW + for (const Vec3i &t : shape_triangles) + result.indices.emplace_back(t.x(), t.z(), t.y()); + // bottom triangles - use CW + for (const Vec3i &t : shape_triangles) + result.indices.emplace_back(t.x() + count_point, t.y() + count_point, + t.z() + count_point); + + // quads around - zig zag by triangles + size_t polygon_offset = 0; + auto add_quads = [&polygon_offset, &result, count_point, &changes] + (const Polygon &polygon) { + uint32_t polygon_points = polygon.points.size(); + // previous index + uint32_t prev = changes[polygon_offset + polygon_points - 1]; + for (uint32_t p = 0; p < polygon_points; ++p) { + uint32_t index = changes[polygon_offset + p]; + if (prev == index) continue; + add_quad(prev, index, result, count_point); + prev = index; + } + polygon_offset += polygon_points; + }; + + for (const ExPolygon &expolygon : shape2d) { + add_quads(expolygon.contour); + for (const Polygon &hole : expolygon.holes) add_quads(hole); + } + return result; +} +} // namespace priv + +indexed_triangle_set Emboss::polygons2model(const ExPolygons &shape2d, + const IProjection &projection) +{ + Points points = to_points(shape2d); + Points duplicits = collect_duplicates(points); + return (duplicits.empty()) ? + priv::polygons2model_unique(shape2d, projection, points) : + priv::polygons2model_duplicit(shape2d, projection, points, duplicits); +} + +std::pair Emboss::ProjectZ::create_front_back(const Point &p) const +{ + Vec3d front( + p.x() * SHAPE_SCALE, + p.y() * SHAPE_SCALE, + 0.); + return std::make_pair(front, project(front)); +} + +Vec3d Emboss::ProjectZ::project(const Vec3d &point) const +{ + Vec3d res = point; // copy + res.z() = m_depth; + return res; +} + +std::optional Emboss::ProjectZ::unproject(const Vec3d &p, double *depth) const { + if (depth != nullptr) *depth /= SHAPE_SCALE; + return Vec2d(p.x() / SHAPE_SCALE, p.y() / SHAPE_SCALE); +} + + +Vec3d Emboss::suggest_up(const Vec3d normal, double up_limit) +{ + // Normal must be 1 + assert(is_approx(normal.squaredNorm(), 1.)); + + // wanted up direction of result + Vec3d wanted_up_side = + (std::fabs(normal.z()) > up_limit)? + Vec3d::UnitY() : Vec3d::UnitZ(); + + // create perpendicular unit vector to surface triangle normal vector + // lay on surface of triangle and define up vector for text + Vec3d wanted_up_dir = normal.cross(wanted_up_side).cross(normal); + // normal3d is NOT perpendicular to normal_up_dir + wanted_up_dir.normalize(); + + return wanted_up_dir; +} + +std::optional Emboss::calc_up(const Transform3d &tr, double up_limit) +{ + auto tr_linear = tr.linear(); + // z base of transformation ( tr * UnitZ ) + Vec3d normal = tr_linear.col(2); + // scaled matrix has base with different size + normal.normalize(); + Vec3d suggested = suggest_up(normal); + assert(is_approx(suggested.squaredNorm(), 1.)); + + Vec3d up = tr_linear.col(1); // tr * UnitY() + up.normalize(); + + double dot = suggested.dot(up); + if (dot >= 1. || dot <= -1.) + return {}; // zero angle + + Matrix3d m; + m.row(0) = up; + m.row(1) = suggested; + m.row(2) = normal; + double det = m.determinant(); + + return -atan2(det, dot); +} + +Transform3d Emboss::create_transformation_onto_surface(const Vec3d &position, + const Vec3d &normal, + double up_limit) +{ + // is normalized ? + assert(is_approx(normal.squaredNorm(), 1.)); + + // up and emboss direction for generated model + Vec3d up_dir = Vec3d::UnitY(); + Vec3d emboss_dir = Vec3d::UnitZ(); + + // after cast from float it needs to be normalized again + Vec3d wanted_up_dir = suggest_up(normal, up_limit); + + // perpendicular to emboss vector of text and normal + Vec3d axis_view; + double angle_view; + if (normal == -Vec3d::UnitZ()) { + // text_emboss_dir has opposit direction to wanted_emboss_dir + axis_view = Vec3d::UnitY(); + angle_view = M_PI; + } else { + axis_view = emboss_dir.cross(normal); + angle_view = std::acos(emboss_dir.dot(normal)); // in rad + axis_view.normalize(); + } + + Eigen::AngleAxis view_rot(angle_view, axis_view); + Vec3d wanterd_up_rotated = view_rot.matrix().inverse() * wanted_up_dir; + wanterd_up_rotated.normalize(); + double angle_up = std::acos(up_dir.dot(wanterd_up_rotated)); + + Vec3d text_view = up_dir.cross(wanterd_up_rotated); + Vec3d diff_view = emboss_dir - text_view; + if (std::fabs(diff_view.x()) > 1. || + std::fabs(diff_view.y()) > 1. || + std::fabs(diff_view.z()) > 1.) // oposit direction + angle_up *= -1.; + + Eigen::AngleAxis up_rot(angle_up, emboss_dir); + + Transform3d transform = Transform3d::Identity(); + transform.translate(position); + transform.rotate(view_rot); + transform.rotate(up_rot); + return transform; +} + + +// OrthoProject + +std::pair Emboss::OrthoProject::create_front_back(const Point &p) const { + Vec3d front(p.x(), p.y(), 0.); + Vec3d front_tr = m_matrix * front; + return std::make_pair(front_tr, project(front_tr)); +} + +Vec3d Emboss::OrthoProject::project(const Vec3d &point) const +{ + return point + m_direction; +} + +std::optional Emboss::OrthoProject::unproject(const Vec3d &p, double *depth) const +{ + Vec3d pp = m_matrix_inv * p; + if (depth != nullptr) *depth = pp.z(); + return Vec2d(pp.x(), pp.y()); +} + +#ifdef REMOVE_SPIKES +#include +void priv::remove_spikes(Polygon &polygon, const SpikeDesc &spike_desc) +{ + enum class Type { + add, // Move with point B on A-side and add new point on C-side + move, // Only move with point B + erase // left only points A and C without move + }; + struct SpikeHeal + { + Type type; + size_t index; + Point b; + Point add; + }; + using SpikeHeals = std::vector; + SpikeHeals heals; + + size_t count = polygon.size(); + if (count < 3) + return; + + const Point *ptr_a = &polygon[count - 2]; + const Point *ptr_b = &polygon[count - 1]; + for (const Point &c : polygon) { + const Point &a = *ptr_a; + const Point &b = *ptr_b; + ScopeGuard sg([&ptr_a, &ptr_b, &c]() { + // prepare for next loop + ptr_a = ptr_b; + ptr_b = &c; + }); + + // calc sides + Point ba = a - b; + Point bc = c - b; + + Vec2d ba_f = ba.cast(); + Vec2d bc_f = bc.cast(); + double dot_product = ba_f.dot(bc_f); + + // sqrt together after multiplication save one sqrt + double ba_size_sq = ba_f.squaredNorm(); + double bc_size_sq = bc_f.squaredNorm(); + double norm = sqrt(ba_size_sq * bc_size_sq); + double cos_angle = dot_product / norm; + + // small angle are around 1 --> cos(0) = 1 + if (cos_angle < spike_desc.cos_angle) + continue; + + SpikeHeal heal; + heal.index = &b - &polygon.points.front(); + + // has to be in range <-1, 1> + // Due to preccission of floating point number could be sligtly out of range + if (cos_angle > 1.) + cos_angle = 1.; + if (cos_angle < -1.) + cos_angle = -1.; + + // Current Spike angle + double angle = acos(cos_angle); + double wanted_size = spike_desc.half_bevel / cos(angle / 2.); + double wanted_size_sq = wanted_size * wanted_size; + + bool is_ba_short = ba_size_sq < wanted_size_sq; + bool is_bc_short = bc_size_sq < wanted_size_sq; + auto a_side = [&b, &ba_f, &ba_size_sq, &wanted_size]() { + Vec2d ba_norm = ba_f / sqrt(ba_size_sq); + return b + (wanted_size * ba_norm).cast(); + }; + auto c_side = [&b, &bc_f, &bc_size_sq, &wanted_size]() { + Vec2d bc_norm = bc_f / sqrt(bc_size_sq); + return b + (wanted_size * bc_norm).cast(); + }; + if (is_ba_short && is_bc_short) { + // remove short spike + heal.type = Type::erase; + } else if (is_ba_short){ + // move point B on C-side + heal.type = Type::move; + heal.b = c_side(); + } else if (is_bc_short) { + // move point B on A-side + heal.type = Type::move; + heal.b = a_side(); + } else { + // move point B on A-side and add point on C-side + heal.type = Type::add; + heal.b = a_side(); + heal.add = c_side(); + } + heals.push_back(heal); + } + + if (heals.empty()) + return; + + // sort index from high to low + if (heals.front().index == (count - 1)) + std::rotate(heals.begin(), heals.begin()+1, heals.end()); + std::reverse(heals.begin(), heals.end()); + + int extend = 0; + int curr_extend = 0; + for (const SpikeHeal &h : heals) + switch (h.type) { + case Type::add: + ++curr_extend; + if (extend < curr_extend) + extend = curr_extend; + break; + case Type::erase: + --curr_extend; + } + + Points &pts = polygon.points; + if (extend > 0) + pts.reserve(pts.size() + extend); + + for (const SpikeHeal &h : heals) { + switch (h.type) { + case Type::add: + pts[h.index] = h.b; + pts.insert(pts.begin() + h.index+1, h.add); + break; + case Type::erase: + pts.erase(pts.begin() + h.index); + break; + case Type::move: + pts[h.index] = h.b; + break; + default: break; + } + } +} + +void priv::remove_spikes(Polygons &polygons, const SpikeDesc &spike_desc) +{ + for (Polygon &polygon : polygons) + remove_spikes(polygon, spike_desc); + remove_bad(polygons); +} + +void priv::remove_spikes(ExPolygons &expolygons, const SpikeDesc &spike_desc) +{ + for (ExPolygon &expolygon : expolygons) { + remove_spikes(expolygon.contour, spike_desc); + remove_spikes(expolygon.holes, spike_desc); + } + remove_bad(expolygons); +} + +#endif // REMOVE_SPIKES \ No newline at end of file diff --git a/src/libslic3r/Emboss.hpp b/src/libslic3r/Emboss.hpp new file mode 100644 index 00000000000..fc0f0a0a3ca --- /dev/null +++ b/src/libslic3r/Emboss.hpp @@ -0,0 +1,366 @@ +#ifndef slic3r_Emboss_hpp_ +#define slic3r_Emboss_hpp_ + +#include +#include +#include +#include +#include // indexed_triangle_set +#include "Polygon.hpp" +#include "ExPolygon.hpp" +#include "TextConfiguration.hpp" + +namespace Slic3r { + +/// +/// class with only static function add ability to engraved OR raised +/// text OR polygons onto model surface +/// +namespace Emboss +{ + // every glyph's shape point is divided by SHAPE_SCALE - increase precission of fixed point value + // stored in fonts (to be able represents curve by sequence of lines) + static constexpr double SHAPE_SCALE = 0.001; // SCALING_FACTOR promile is fine enough + + /// + /// Collect fonts registred inside OS + /// + /// OS registred TTF font files(full path) with names + EmbossStyles get_font_list(); +#ifdef _WIN32 + EmbossStyles get_font_list_by_register(); + EmbossStyles get_font_list_by_enumeration(); + EmbossStyles get_font_list_by_folder(); +#endif + + /// + /// OS dependent function to get location of font by its name descriptor + /// + /// Unique identificator for font + /// File path to font when found + std::optional get_font_path(const std::wstring &font_face_name); + + // description of one letter + struct Glyph + { + // NOTE: shape is scaled by SHAPE_SCALE + // to be able store points without floating points + ExPolygons shape; + + // values are in font points + int advance_width=0, left_side_bearing=0; + }; + // cache for glyph by unicode + using Glyphs = std::map; + + /// + /// keep information from file about font + /// (store file data itself) + /// + cache data readed from buffer + /// + struct FontFile + { + // loaded data from font file + // must store data size for imgui rasterization + // To not store data on heap and To prevent unneccesary copy + // data are stored inside unique_ptr + std::unique_ptr> data; + + struct Info + { + // vertical position is "scale*(ascent - descent + lineGap)" + int ascent, descent, linegap; + + // for convert font units to pixel + int unit_per_em; + }; + // info for each font in data + std::vector infos; + + FontFile(std::unique_ptr> data, + std::vector &&infos) + : data(std::move(data)), infos(std::move(infos)) + { + assert(this->data != nullptr); + assert(!this->data->empty()); + } + + bool operator==(const FontFile &other) const { + if (data->size() != other.data->size()) + return false; + //if(*data != *other.data) return false; + for (size_t i = 0; i < infos.size(); i++) + if (infos[i].ascent != other.infos[i].ascent || + infos[i].descent == other.infos[i].descent || + infos[i].linegap == other.infos[i].linegap) + return false; + return true; + } + }; + + /// + /// Add caching for shape of glyphs + /// + struct FontFileWithCache + { + // Pointer on data of the font file + std::shared_ptr font_file; + + // Cache for glyph shape + // IMPORTANT: accessible only in plater job thread !!! + // main thread only clear cache by set to another shared_ptr + std::shared_ptr cache; + + FontFileWithCache() : font_file(nullptr), cache(nullptr) {} + FontFileWithCache(std::unique_ptr font_file) + : font_file(std::move(font_file)) + , cache(std::make_shared()) + {} + bool has_value() const { return font_file != nullptr && cache != nullptr; } + }; + + /// + /// Load font file into buffer + /// + /// Location of .ttf or .ttc font file + /// Font object when loaded. + std::unique_ptr create_font_file(const char *file_path); + // data = raw file data + std::unique_ptr create_font_file(std::unique_ptr> data); +#ifdef _WIN32 + // fix for unknown pointer HFONT is replaced with "void *" + void * can_load(void* hfont); + std::unique_ptr create_font_file(void * hfont); +#endif // _WIN32 + + /// + /// convert letter into polygons + /// + /// Define fonts + /// Index of font in collection + /// One character defined by unicode codepoint + /// Precision of lettter outline curve in conversion to lines + /// inner polygon cw(outer ccw) + std::optional letter2glyph(const FontFile &font, unsigned int font_index, int letter, float flatness); + + /// + /// Convert text into polygons + /// + /// Define fonts + cache, which could extend + /// Characters to convert + /// User defined property of the font + /// Way to interupt processing + /// Inner polygon cw(outer ccw) + ExPolygons text2shapes(FontFileWithCache &font, const char *text, const FontProp &font_prop, std::function was_canceled = nullptr); + + /// + /// Fix duplicit points and self intersections in polygons. + /// Also try to reduce amount of points and remove useless polygon parts + /// + /// Define wanted precision of shape after heal + /// Healed shapes + ExPolygons heal_shape(const Polygons &shape); + + /// + /// NOTE: call Slic3r::union_ex before this call + /// + /// Heal (read: Fix) issues in expolygons: + /// - self intersections + /// - duplicit points + /// - points close to line segments + /// + /// In/Out shape to heal + /// Heal could create another issue, + /// After healing it is checked again until shape is good or maximal count of iteration + /// True when shapes is good otherwise False + bool heal_shape(ExPolygons &shape, unsigned max_iteration = 10); + + /// + /// Divide line segments in place near to point + /// (which could lead to self intersection due to preccision) + /// Remove same neighbors + /// Note: Possible part of heal shape + /// + /// Expolygon to edit + /// (epsilon)Euclidean distance from point to line which divide line + /// True when some division was made otherwise false + bool divide_segments_for_close_point(ExPolygons &expolygons, double distance); + + /// + /// Use data from font property to modify transformation + /// + /// Z-move as surface distance(FontProp::distance) + /// Z-rotation as angle to Y axis(FontProp::angle) + /// In / Out transformation to modify by property + void apply_transformation(const FontProp &font_prop, Transform3d &transformation); + void apply_transformation(const std::optional &angle, const std::optional &distance, Transform3d &transformation); + + /// + /// Read information from naming table of font file + /// search for italic (or oblique), bold italic (or bold oblique) + /// + /// Selector of font + /// Index of font in collection + /// True when the font description contains italic/obligue otherwise False + bool is_italic(const FontFile &font, unsigned int font_index); + + /// + /// Create unique character set from string with filtered from text with only character from font + /// + /// Source vector of glyphs + /// Font descriptor + /// Define font in collection + /// True when text contain glyph unknown in font + /// Unique set of character from text contained in font + std::string create_range_text(const std::string &text, const FontFile &font, unsigned int font_index, bool* exist_unknown = nullptr); + + /// + /// Calculate scale for glyph shape convert from shape points to mm + /// + /// Property of font + /// Font data + /// Conversion to mm + double get_shape_scale(const FontProp &fp, const FontFile &ff); + + /// + /// Project spatial point + /// + class IProject3d + { + public: + virtual ~IProject3d() = default; + /// + /// Move point with respect to projection direction + /// e.g. Orthogonal projection will move with point by direction + /// e.g. Spherical projection need to use center of projection + /// + /// Spatial point coordinate + /// Projected spatial point + virtual Vec3d project(const Vec3d &point) const = 0; + }; + + /// + /// Project 2d point into space + /// Could be plane, sphere, cylindric, ... + /// + class IProjection : public IProject3d + { + public: + virtual ~IProjection() = default; + + /// + /// convert 2d point to 3d points + /// + /// 2d coordinate + /// + /// first - front spatial point + /// second - back spatial point + /// + virtual std::pair create_front_back(const Point &p) const = 0; + + /// + /// Back projection + /// + /// Point to project + /// [optional] Depth of 2d projected point. Be careful number is in 2d scale + /// Uprojected point when it is possible + virtual std::optional unproject(const Vec3d &p, double * depth = nullptr) const = 0; + }; + + /// + /// Create triangle model for text + /// + /// text or image + /// Define transformation from 2d to 3d(orientation, position, scale, ...) + /// Projected shape into space + indexed_triangle_set polygons2model(const ExPolygons &shape2d, const IProjection& projection); + + /// + /// Suggest wanted up vector of embossed text by emboss direction + /// + /// Normalized vector of emboss direction in world + /// Is compared with normal.z to suggest up direction + /// Wanted up vector + Vec3d suggest_up(const Vec3d normal, double up_limit = 0.9); + + /// + /// By transformation calculate angle between suggested and actual up vector + /// + /// Transformation of embossed volume in world + /// Is compared with normal.z to suggest up direction + /// Rotation of suggested up-vector[in rad] in the range [-Pi, Pi], When rotation is not zero + std::optional calc_up(const Transform3d &tr, double up_limit = 0.9); + + /// + /// Create transformation for emboss text object to lay on surface point + /// + /// Position of surface point + /// Normal of surface point + /// Is compared with normal.z to suggest up direction + /// Transformation onto surface point + Transform3d create_transformation_onto_surface( + const Vec3d &position, const Vec3d &normal, double up_limit = 0.9); + + class ProjectZ : public IProjection + { + public: + ProjectZ(double depth) : m_depth(depth) {} + // Inherited via IProject + std::pair create_front_back(const Point &p) const override; + Vec3d project(const Vec3d &point) const override; + std::optional unproject(const Vec3d &p, double * depth = nullptr) const override; + double m_depth; + }; + + class ProjectScale : public IProjection + { + std::unique_ptr core; + double m_scale; + public: + ProjectScale(std::unique_ptr core, double scale) + : core(std::move(core)), m_scale(scale) + {} + + // Inherited via IProject + std::pair create_front_back(const Point &p) const override + { + auto res = core->create_front_back(p); + return std::make_pair(res.first * m_scale, res.second * m_scale); + } + Vec3d project(const Vec3d &point) const override{ + return core->project(point); + } + std::optional unproject(const Vec3d &p, double *depth = nullptr) const override { + auto res = core->unproject(p / m_scale, depth); + if (depth != nullptr) *depth *= m_scale; + return res; + } + }; + + class OrthoProject3d : public Emboss::IProject3d + { + // size and direction of emboss for ortho projection + Vec3d m_direction; + public: + OrthoProject3d(Vec3d direction) : m_direction(direction) {} + Vec3d project(const Vec3d &point) const override{ return point + m_direction;} + }; + + class OrthoProject: public Emboss::IProjection { + Transform3d m_matrix; + // size and direction of emboss for ortho projection + Vec3d m_direction; + Transform3d m_matrix_inv; + public: + OrthoProject(Transform3d matrix, Vec3d direction) + : m_matrix(matrix), m_direction(direction), m_matrix_inv(matrix.inverse()) + {} + // Inherited via IProject + std::pair create_front_back(const Point &p) const override; + Vec3d project(const Vec3d &point) const override; + std::optional unproject(const Vec3d &p, double * depth = nullptr) const override; + }; +} // namespace Emboss + +} // namespace Slic3r +#endif // slic3r_Emboss_hpp_ diff --git a/src/libslic3r/ExPolygon.cpp b/src/libslic3r/ExPolygon.cpp index 069c6e60205..dc991e46d4f 100644 --- a/src/libslic3r/ExPolygon.cpp +++ b/src/libslic3r/ExPolygon.cpp @@ -12,27 +12,6 @@ namespace Slic3r { -ExPolygon::operator Points() const -{ - Points points; - Polygons pp = *this; - for (Polygons::const_iterator poly = pp.begin(); poly != pp.end(); ++poly) { - for (Points::const_iterator point = poly->points.begin(); point != poly->points.end(); ++point) - points.push_back(*point); - } - return points; -} - -ExPolygon::operator Polygons() const -{ - return to_polygons(*this); -} - -ExPolygon::operator Polylines() const -{ - return to_polylines(*this); -} - void ExPolygon::scale(double factor) { contour.scale(factor); @@ -40,6 +19,13 @@ void ExPolygon::scale(double factor) hole.scale(factor); } +void ExPolygon::scale(double factor_x, double factor_y) +{ + contour.scale(factor_x, factor_y); + for (Polygon &hole : holes) + hole.scale(factor_x, factor_y); +} + void ExPolygon::translate(const Point &p) { contour.translate(p); @@ -112,34 +98,53 @@ bool ExPolygon::contains(const Polylines &polylines) const return pl_out.empty(); } -bool ExPolygon::contains(const Point &point) const +bool ExPolygon::contains(const Point &point, bool border_result /* = true */) const { - if (! this->contour.contains(point)) + if (! Slic3r::contains(contour, point, border_result)) + // Outside the outer contour, not on the contour boundary. return false; for (const Polygon &hole : this->holes) - if (hole.contains(point)) + if (Slic3r::contains(hole, point, ! border_result)) + // Inside a hole, not on the hole boundary. return false; return true; } -// inclusive version of contains() that also checks whether point is on boundaries -bool ExPolygon::contains_b(const Point &point) const +bool ExPolygon::on_boundary(const Point &point, double eps) const { - return this->contains(point) || this->has_boundary_point(point); + if (this->contour.on_boundary(point, eps)) + return true; + for (const Polygon &hole : this->holes) + if (hole.on_boundary(point, eps)) + return true; + return false; } -bool -ExPolygon::has_boundary_point(const Point &point) const -{ - if (this->contour.has_boundary_point(point)) return true; - for (Polygons::const_iterator h = this->holes.begin(); h != this->holes.end(); ++h) { - if (h->has_boundary_point(point)) return true; +// Projection of a point onto the polygon. +Point ExPolygon::point_projection(const Point &point) const +{ + if (this->holes.empty()) { + return this->contour.point_projection(point); + } else { + double dist_min2 = std::numeric_limits::max(); + Point closest_pt_min; + for (size_t i = 0; i < this->num_contours(); ++ i) { + Point closest_pt = this->contour_or_hole(i).point_projection(point); + double d2 = (closest_pt - point).cast().squaredNorm(); + if (d2 < dist_min2) { + dist_min2 = d2; + closest_pt_min = closest_pt; + } + } + return closest_pt_min; } - return false; } bool ExPolygon::overlaps(const ExPolygon &other) const { + if (this->empty() || other.empty()) + return false; + #if 0 BoundingBox bbox = get_extents(other); bbox.merge(get_extents(*this)); @@ -149,14 +154,18 @@ bool ExPolygon::overlaps(const ExPolygon &other) const svg.draw_outline(*this); svg.draw_outline(other, "blue"); #endif - Polylines pl_out = intersection_pl((Polylines)other, *this); + + Polylines pl_out = intersection_pl(to_polylines(other), *this); + #if 0 svg.draw(pl_out, "red"); #endif - if (! pl_out.empty()) - return true; - //FIXME ExPolygon::overlaps() shall be commutative, it is not! - return ! other.contour.points.empty() && this->contains_b(other.contour.points.front()); + + // See unit test SCENARIO("Clipper diff with polyline", "[Clipper]") + // for in which case the intersection_pl produces any intersection. + return ! pl_out.empty() || + // If *this is completely inside other, then pl_out is empty, but the expolygons overlap. Test for that situation. + other.contains(this->contour.points.front()); } void ExPolygon::simplify_p(double tolerance, Polygons* polygons) const @@ -197,12 +206,10 @@ void ExPolygon::simplify(double tolerance, ExPolygons* expolygons) const append(*expolygons, this->simplify(tolerance)); } -void -ExPolygon::medial_axis(double max_width, double min_width, ThickPolylines* polylines) const +void ExPolygon::medial_axis(double min_width, double max_width, ThickPolylines* polylines) const { // init helper object - Slic3r::Geometry::MedialAxis ma(max_width, min_width, this); - ma.lines = this->lines(); + Slic3r::Geometry::MedialAxis ma(min_width, max_width, *this); // compute the Voronoi diagram and extract medial axis polylines ThickPolylines pp; @@ -233,7 +240,7 @@ ExPolygon::medial_axis(double max_width, double min_width, ThickPolylines* polyl call, so we keep the inner point until we perform the second intersection() as well */ Point new_front = polyline.points.front(); Point new_back = polyline.points.back(); - if (polyline.endpoints.first && !this->has_boundary_point(new_front)) { + if (polyline.endpoints.first && !this->on_boundary(new_front, SCALED_EPSILON)) { Vec2d p1 = polyline.points.front().cast(); Vec2d p2 = polyline.points[1].cast(); // prevent the line from touching on the other side, otherwise intersection() might return that solution @@ -243,7 +250,7 @@ ExPolygon::medial_axis(double max_width, double min_width, ThickPolylines* polyl p1 -= (p2 - p1).normalized() * max_width; this->contour.intersection(Line(p1.cast(), p2.cast()), &new_front); } - if (polyline.endpoints.second && !this->has_boundary_point(new_back)) { + if (polyline.endpoints.second && !this->on_boundary(new_back, SCALED_EPSILON)) { Vec2d p1 = (polyline.points.end() - 2)->cast(); Vec2d p2 = polyline.points.back().cast(); // prevent the line from touching on the other side, otherwise intersection() might return that solution @@ -309,12 +316,13 @@ ExPolygon::medial_axis(double max_width, double min_width, ThickPolylines* polyl polylines->insert(polylines->end(), pp.begin(), pp.end()); } -void -ExPolygon::medial_axis(double max_width, double min_width, Polylines* polylines) const +void ExPolygon::medial_axis(double min_width, double max_width, Polylines* polylines) const { ThickPolylines tp; - this->medial_axis(max_width, min_width, &tp); - polylines->insert(polylines->end(), tp.begin(), tp.end()); + this->medial_axis(min_width, max_width, &tp); + polylines->reserve(polylines->size() + tp.size()); + for (auto &pl : tp) + polylines->emplace_back(pl.points); } Lines ExPolygon::lines() const @@ -327,6 +335,18 @@ Lines ExPolygon::lines() const return lines; } +// Do expolygons match? If they match, they must have the same topology, +// however their contours may be rotated. +bool expolygons_match(const ExPolygon &l, const ExPolygon &r) +{ + if (l.holes.size() != r.holes.size() || ! polygons_match(l.contour, r.contour)) + return false; + for (size_t hole_idx = 0; hole_idx < l.holes.size(); ++ hole_idx) + if (! polygons_match(l.holes[hole_idx], r.holes[hole_idx])) + return false; + return true; +} + BoundingBox get_extents(const ExPolygon &expolygon) { return get_extents(expolygon.contour); diff --git a/src/libslic3r/ExPolygon.hpp b/src/libslic3r/ExPolygon.hpp index 6f38846736e..83b264803c7 100644 --- a/src/libslic3r/ExPolygon.hpp +++ b/src/libslic3r/ExPolygon.hpp @@ -1,6 +1,7 @@ #ifndef slic3r_ExPolygon_hpp_ #define slic3r_ExPolygon_hpp_ +#include "Point.hpp" #include "libslic3r.h" #include "Polygon.hpp" #include "Polyline.hpp" @@ -9,7 +10,7 @@ namespace Slic3r { class ExPolygon; -typedef std::vector ExPolygons; +using ExPolygons = std::vector; class ExPolygon { @@ -31,14 +32,12 @@ class ExPolygon ExPolygon& operator=(const ExPolygon &other) = default; ExPolygon& operator=(ExPolygon &&other) = default; - Polygon contour; - Polygons holes; + Polygon contour; //CCW + Polygons holes; //CW - operator Points() const; - operator Polygons() const; - operator Polylines() const; void clear() { contour.points.clear(); holes.clear(); } void scale(double factor); + void scale(double factor_x, double factor_y); void translate(double x, double y) { this->translate(Point(coord_t(x), coord_t(y))); } void translate(const Point &vector); void rotate(double angle); @@ -52,21 +51,29 @@ class ExPolygon bool contains(const Line &line) const; bool contains(const Polyline &polyline) const; bool contains(const Polylines &polylines) const; - bool contains(const Point &point) const; - bool contains_b(const Point &point) const; - bool has_boundary_point(const Point &point) const; + bool contains(const Point &point, bool border_result = true) const; + // Approximate on boundary test. + bool on_boundary(const Point &point, double eps) const; + // Projection of a point onto the polygon. + Point point_projection(const Point &point) const; // Does this expolygon overlap another expolygon? // Either the ExPolygons intersect, or one is fully inside the other, // and it is not inside a hole of the other expolygon. + // The test may not be commutative if the two expolygons touch by a boundary only, + // see unit test SCENARIO("Clipper diff with polyline", "[Clipper]"). + // Namely expolygons touching at a vertical boundary are considered overlapping, while expolygons touching + // at a horizontal boundary are NOT considered overlapping. bool overlaps(const ExPolygon &other) const; void simplify_p(double tolerance, Polygons* polygons) const; Polygons simplify_p(double tolerance) const; ExPolygons simplify(double tolerance) const; void simplify(double tolerance, ExPolygons* expolygons) const; - void medial_axis(double max_width, double min_width, ThickPolylines* polylines) const; - void medial_axis(double max_width, double min_width, Polylines* polylines) const; + void medial_axis(double min_width, double max_width, ThickPolylines* polylines) const; + void medial_axis(double min_width, double max_width, Polylines* polylines) const; + Polylines medial_axis(double min_width, double max_width) const + { Polylines out; this->medial_axis(min_width, max_width, &out); return out; } Lines lines() const; // Number of contours (outer contour with holes). @@ -78,6 +85,25 @@ class ExPolygon inline bool operator==(const ExPolygon &lhs, const ExPolygon &rhs) { return lhs.contour == rhs.contour && lhs.holes == rhs.holes; } inline bool operator!=(const ExPolygon &lhs, const ExPolygon &rhs) { return lhs.contour != rhs.contour || lhs.holes != rhs.holes; } +inline size_t count_points(const ExPolygons &expolys) +{ + size_t n_points = 0; + for (const auto &expoly : expolys) { + n_points += expoly.contour.points.size(); + for (const auto &hole : expoly.holes) + n_points += hole.points.size(); + } + return n_points; +} + +inline size_t count_points(const ExPolygon &expoly) +{ + size_t n_points = expoly.contour.points.size(); + for (const auto &hole : expoly.holes) + n_points += hole.points.size(); + return n_points; +} + // Count a nuber of polygons stored inside the vector of expolygons. // Useful for allocating space for polygons when converting expolygons to polygons. inline size_t number_polygons(const ExPolygons &expolys) @@ -90,11 +116,8 @@ inline size_t number_polygons(const ExPolygons &expolys) inline Lines to_lines(const ExPolygon &src) { - size_t n_lines = src.contour.points.size(); - for (size_t i = 0; i < src.holes.size(); ++ i) - n_lines += src.holes[i].points.size(); Lines lines; - lines.reserve(n_lines); + lines.reserve(count_points(src)); for (size_t i = 0; i <= src.holes.size(); ++ i) { const Polygon &poly = (i == 0) ? src.contour : src.holes[i - 1]; for (Points::const_iterator it = poly.points.begin(); it != poly.points.end()-1; ++it) @@ -106,14 +129,8 @@ inline Lines to_lines(const ExPolygon &src) inline Lines to_lines(const ExPolygons &src) { - size_t n_lines = 0; - for (ExPolygons::const_iterator it_expoly = src.begin(); it_expoly != src.end(); ++ it_expoly) { - n_lines += it_expoly->contour.points.size(); - for (size_t i = 0; i < it_expoly->holes.size(); ++ i) - n_lines += it_expoly->holes[i].points.size(); - } Lines lines; - lines.reserve(n_lines); + lines.reserve(count_points(src)); for (ExPolygons::const_iterator it_expoly = src.begin(); it_expoly != src.end(); ++ it_expoly) { for (size_t i = 0; i <= it_expoly->holes.size(); ++ i) { const Points &points = ((i == 0) ? it_expoly->contour : it_expoly->holes[i - 1]).points; @@ -125,6 +142,70 @@ inline Lines to_lines(const ExPolygons &src) return lines; } +// Line is from point index(see to_points) to next point. +// Next point of last point in polygon is first polygon point. +inline Linesf to_linesf(const ExPolygons &src, uint32_t count_lines = 0) +{ + assert(count_lines == 0 || count_lines == count_points(src)); + if (count_lines == 0) count_lines = count_points(src); + Linesf lines; + lines.reserve(count_lines); + Vec2d prev_pd; + auto to_lines = [&lines, &prev_pd](const Points &pts) { + assert(pts.size() >= 3); + if (pts.size() < 2) return; + bool is_first = true; + for (const Point &p : pts) { + Vec2d pd = p.cast(); + if (is_first) is_first = false; + else lines.emplace_back(prev_pd, pd); + prev_pd = pd; + } + lines.emplace_back(prev_pd, pts.front().cast()); + }; + for (const ExPolygon& expoly: src) { + to_lines(expoly.contour.points); + for (const Polygon &hole : expoly.holes) + to_lines(hole.points); + } + assert(lines.size() == count_lines); + return lines; +} + +inline Linesf to_unscaled_linesf(const ExPolygons &src) +{ + Linesf lines; + lines.reserve(count_points(src)); + for (ExPolygons::const_iterator it_expoly = src.begin(); it_expoly != src.end(); ++ it_expoly) { + for (size_t i = 0; i <= it_expoly->holes.size(); ++ i) { + const Points &points = ((i == 0) ? it_expoly->contour : it_expoly->holes[i - 1]).points; + Vec2d unscaled_a = unscaled(points.front()); + Vec2d unscaled_b = unscaled_a; + for (Points::const_iterator it = points.begin()+1; it != points.end(); ++it){ + unscaled_b = unscaled(*(it)); + lines.push_back(Linef(unscaled_a, unscaled_b)); + unscaled_a = unscaled_b; + } + lines.push_back(Linef(unscaled_a, unscaled(points.front()))); + } + } + return lines; +} + + +inline Points to_points(const ExPolygons &src) +{ + Points points; + size_t count = count_points(src); + points.reserve(count); + for (const ExPolygon &expolygon : src) { + append(points, expolygon.contour.points); + for (const Polygon &hole : expolygon.holes) + append(points, hole.points); + } + return points; +} + inline Polylines to_polylines(const ExPolygon &src) { Polylines polylines; @@ -169,10 +250,10 @@ inline Polylines to_polylines(ExPolygon &&src) Polyline &pl = polylines[idx ++]; pl.points = std::move(src.contour.points); pl.points.push_back(pl.points.front()); - for (Polygons::const_iterator ith = src.holes.begin(); ith != src.holes.end(); ++ith) { + for (auto ith = src.holes.begin(); ith != src.holes.end(); ++ith) { Polyline &pl = polylines[idx ++]; pl.points = std::move(ith->points); - pl.points.push_back(ith->points.front()); + pl.points.push_back(pl.points.front()); } assert(idx == polylines.size()); return polylines; @@ -183,14 +264,14 @@ inline Polylines to_polylines(ExPolygons &&src) Polylines polylines; polylines.assign(number_polygons(src), Polyline()); size_t idx = 0; - for (ExPolygons::const_iterator it = src.begin(); it != src.end(); ++it) { + for (auto it = src.begin(); it != src.end(); ++it) { Polyline &pl = polylines[idx ++]; pl.points = std::move(it->contour.points); pl.points.push_back(pl.points.front()); - for (Polygons::const_iterator ith = it->holes.begin(); ith != it->holes.end(); ++ith) { + for (auto ith = it->holes.begin(); ith != it->holes.end(); ++ith) { Polyline &pl = polylines[idx ++]; pl.points = std::move(ith->points); - pl.points.push_back(ith->points.front()); + pl.points.push_back(pl.points.front()); } } assert(idx == polylines.size()); @@ -244,8 +325,9 @@ inline Polygons to_polygons(ExPolygon &&src) Polygons polygons; polygons.reserve(src.holes.size() + 1); polygons.push_back(std::move(src.contour)); - std::move(std::begin(src.holes), std::end(src.holes), std::back_inserter(polygons)); - src.holes.clear(); + polygons.insert(polygons.end(), + std::make_move_iterator(src.holes.begin()), + std::make_move_iterator(src.holes.end())); return polygons; } @@ -253,10 +335,11 @@ inline Polygons to_polygons(ExPolygons &&src) { Polygons polygons; polygons.reserve(number_polygons(src)); - for (ExPolygons::iterator it = src.begin(); it != src.end(); ++it) { - polygons.push_back(std::move(it->contour)); - std::move(std::begin(it->holes), std::end(it->holes), std::back_inserter(polygons)); - it->holes.clear(); + for (ExPolygon& expoly: src) { + polygons.push_back(std::move(expoly.contour)); + polygons.insert(polygons.end(), + std::make_move_iterator(expoly.holes.begin()), + std::make_move_iterator(expoly.holes.end())); } return polygons; } @@ -279,6 +362,16 @@ inline ExPolygons to_expolygons(Polygons &&polys) return ex_polys; } +inline Points to_points(const ExPolygon &expoly) +{ + Points out; + out.reserve(count_points(expoly)); + append(out, expoly.contour.points); + for (const Polygon &hole : expoly.holes) + append(out, hole.points); + return out; +} + inline void polygons_append(Polygons &dst, const ExPolygon &src) { dst.reserve(dst.size() + src.holes.size() + 1); @@ -298,18 +391,20 @@ inline void polygons_append(Polygons &dst, const ExPolygons &src) inline void polygons_append(Polygons &dst, ExPolygon &&src) { dst.reserve(dst.size() + src.holes.size() + 1); - dst.push_back(std::move(src.contour)); - std::move(std::begin(src.holes), std::end(src.holes), std::back_inserter(dst)); - src.holes.clear(); + dst.push_back(std::move(src.contour)); + dst.insert(dst.end(), + std::make_move_iterator(src.holes.begin()), + std::make_move_iterator(src.holes.end())); } inline void polygons_append(Polygons &dst, ExPolygons &&src) { dst.reserve(dst.size() + number_polygons(src)); - for (ExPolygons::iterator it = src.begin(); it != src.end(); ++ it) { - dst.push_back(std::move(it->contour)); - std::move(std::begin(it->holes), std::end(it->holes), std::back_inserter(dst)); - it->holes.clear(); + for (ExPolygon& expoly: src) { + dst.push_back(std::move(expoly.contour)); + dst.insert(dst.end(), + std::make_move_iterator(expoly.holes.begin()), + std::make_move_iterator(expoly.holes.end())); } } @@ -323,21 +418,22 @@ inline void expolygons_append(ExPolygons &dst, ExPolygons &&src) if (dst.empty()) { dst = std::move(src); } else { - std::move(std::begin(src), std::end(src), std::back_inserter(dst)); - src.clear(); + dst.insert(dst.end(), + std::make_move_iterator(src.begin()), + std::make_move_iterator(src.end())); } } inline void expolygons_rotate(ExPolygons &expolys, double angle) { - for (ExPolygons::iterator p = expolys.begin(); p != expolys.end(); ++p) - p->rotate(angle); + for (ExPolygon &expoly : expolys) + expoly.rotate(angle); } -inline bool expolygons_contain(ExPolygons &expolys, const Point &pt) +inline bool expolygons_contain(ExPolygons &expolys, const Point &pt, bool border_result = true) { - for (ExPolygons::iterator p = expolys.begin(); p != expolys.end(); ++p) - if (p->contains(pt)) + for (const ExPolygon &expoly : expolys) + if (expoly.contains(pt, border_result)) return true; return false; } @@ -351,6 +447,10 @@ inline ExPolygons expolygons_simplify(const ExPolygons &expolys, double toleranc return out; } +// Do expolygons match? If they match, they must have the same topology, +// however their contours may be rotated. +bool expolygons_match(const ExPolygon &l, const ExPolygon &r); + BoundingBox get_extents(const ExPolygon &expolygon); BoundingBox get_extents(const ExPolygons &expolygons); BoundingBox get_extents_rotated(const ExPolygon &poly, double angle); diff --git a/src/libslic3r/ExPolygonCollection.cpp b/src/libslic3r/ExPolygonCollection.cpp deleted file mode 100644 index a0de8f6de66..00000000000 --- a/src/libslic3r/ExPolygonCollection.cpp +++ /dev/null @@ -1,136 +0,0 @@ -#include "ExPolygonCollection.hpp" -#include "Geometry/ConvexHull.hpp" -#include "BoundingBox.hpp" - -namespace Slic3r { - -ExPolygonCollection::ExPolygonCollection(const ExPolygon &expolygon) -{ - this->expolygons.push_back(expolygon); -} - -ExPolygonCollection::operator Points() const -{ - Points points; - Polygons pp = (Polygons)*this; - for (Polygons::const_iterator poly = pp.begin(); poly != pp.end(); ++poly) { - for (Points::const_iterator point = poly->points.begin(); point != poly->points.end(); ++point) - points.push_back(*point); - } - return points; -} - -ExPolygonCollection::operator Polygons() const -{ - Polygons polygons; - for (ExPolygons::const_iterator it = this->expolygons.begin(); it != this->expolygons.end(); ++it) { - polygons.push_back(it->contour); - for (Polygons::const_iterator ith = it->holes.begin(); ith != it->holes.end(); ++ith) { - polygons.push_back(*ith); - } - } - return polygons; -} - -ExPolygonCollection::operator ExPolygons&() -{ - return this->expolygons; -} - -void -ExPolygonCollection::scale(double factor) -{ - for (ExPolygons::iterator it = expolygons.begin(); it != expolygons.end(); ++it) { - (*it).scale(factor); - } -} - -void -ExPolygonCollection::translate(double x, double y) -{ - for (ExPolygons::iterator it = expolygons.begin(); it != expolygons.end(); ++it) { - (*it).translate(x, y); - } -} - -void -ExPolygonCollection::rotate(double angle, const Point ¢er) -{ - for (ExPolygons::iterator it = expolygons.begin(); it != expolygons.end(); ++it) { - (*it).rotate(angle, center); - } -} - -template -bool ExPolygonCollection::contains(const T &item) const -{ - for (const ExPolygon &poly : this->expolygons) - if (poly.contains(item)) - return true; - return false; -} -template bool ExPolygonCollection::contains(const Point &item) const; -template bool ExPolygonCollection::contains(const Line &item) const; -template bool ExPolygonCollection::contains(const Polyline &item) const; - -bool -ExPolygonCollection::contains_b(const Point &point) const -{ - for (ExPolygons::const_iterator it = this->expolygons.begin(); it != this->expolygons.end(); ++it) { - if (it->contains_b(point)) return true; - } - return false; -} - -void -ExPolygonCollection::simplify(double tolerance) -{ - ExPolygons expp; - for (ExPolygons::const_iterator it = this->expolygons.begin(); it != this->expolygons.end(); ++it) { - it->simplify(tolerance, &expp); - } - this->expolygons = expp; -} - -Polygon -ExPolygonCollection::convex_hull() const -{ - Points pp; - for (ExPolygons::const_iterator it = this->expolygons.begin(); it != this->expolygons.end(); ++it) - pp.insert(pp.end(), it->contour.points.begin(), it->contour.points.end()); - return Slic3r::Geometry::convex_hull(pp); -} - -Lines -ExPolygonCollection::lines() const -{ - Lines lines; - for (ExPolygons::const_iterator it = this->expolygons.begin(); it != this->expolygons.end(); ++it) { - Lines ex_lines = it->lines(); - lines.insert(lines.end(), ex_lines.begin(), ex_lines.end()); - } - return lines; -} - -Polygons -ExPolygonCollection::contours() const -{ - Polygons contours; - contours.reserve(this->expolygons.size()); - for (ExPolygons::const_iterator it = this->expolygons.begin(); it != this->expolygons.end(); ++it) - contours.push_back(it->contour); - return contours; -} - -void -ExPolygonCollection::append(const ExPolygons &expp) -{ - this->expolygons.insert(this->expolygons.end(), expp.begin(), expp.end()); -} - -BoundingBox get_extents(const ExPolygonCollection &expolygon) -{ - return get_extents(expolygon.expolygons); -} - -} diff --git a/src/libslic3r/ExPolygonCollection.hpp b/src/libslic3r/ExPolygonCollection.hpp deleted file mode 100644 index 35e1eef4ebb..00000000000 --- a/src/libslic3r/ExPolygonCollection.hpp +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef slic3r_ExPolygonCollection_hpp_ -#define slic3r_ExPolygonCollection_hpp_ - -#include "libslic3r.h" -#include "ExPolygon.hpp" -#include "Line.hpp" -#include "Polyline.hpp" - -namespace Slic3r { - -class ExPolygonCollection; -typedef std::vector ExPolygonCollections; - -class ExPolygonCollection -{ -public: - ExPolygons expolygons; - - ExPolygonCollection() {} - explicit ExPolygonCollection(const ExPolygon &expolygon); - explicit ExPolygonCollection(const ExPolygons &expolygons) : expolygons(expolygons) {} - explicit operator Points() const; - explicit operator Polygons() const; - explicit operator ExPolygons&(); - void scale(double factor); - void translate(double x, double y); - void rotate(double angle, const Point ¢er); - template bool contains(const T &item) const; - bool contains_b(const Point &point) const; - void simplify(double tolerance); - Polygon convex_hull() const; - Lines lines() const; - Polygons contours() const; - void append(const ExPolygons &expolygons); -}; - -extern BoundingBox get_extents(const ExPolygonCollection &expolygon); - -} - -#endif diff --git a/src/libslic3r/ExPolygonsIndex.cpp b/src/libslic3r/ExPolygonsIndex.cpp new file mode 100644 index 00000000000..976531799ff --- /dev/null +++ b/src/libslic3r/ExPolygonsIndex.cpp @@ -0,0 +1,82 @@ +#include "ExPolygonsIndex.hpp" +using namespace Slic3r; + +// IMPROVE: use one dimensional vector for polygons offset with searching by std::lower_bound +ExPolygonsIndices::ExPolygonsIndices(const ExPolygons &shapes) +{ + // prepare offsets + m_offsets.reserve(shapes.size()); + uint32_t offset = 0; + for (const ExPolygon &shape : shapes) { + assert(!shape.contour.points.empty()); + std::vector shape_offsets; + shape_offsets.reserve(shape.holes.size() + 1); + shape_offsets.push_back(offset); + offset += shape.contour.points.size(); + for (const Polygon &hole: shape.holes) { + shape_offsets.push_back(offset); + offset += hole.points.size(); + } + m_offsets.push_back(std::move(shape_offsets)); + } + m_count = offset; +} + +uint32_t ExPolygonsIndices::cvt(const ExPolygonsIndex &id) const +{ + assert(id.expolygons_index < m_offsets.size()); + const std::vector &shape_offset = m_offsets[id.expolygons_index]; + assert(id.polygon_index < shape_offset.size()); + uint32_t res = shape_offset[id.polygon_index] + id.point_index; + assert(res < m_count); + return res; +} + +ExPolygonsIndex ExPolygonsIndices::cvt(uint32_t index) const +{ + assert(index < m_count); + ExPolygonsIndex result{0, 0, 0}; + // find expolygon index + auto fn = [](const std::vector &offsets, uint32_t index) { return offsets[0] < index; }; + auto it = std::lower_bound(m_offsets.begin() + 1, m_offsets.end(), index, fn); + result.expolygons_index = it - m_offsets.begin(); + if (it == m_offsets.end() || it->at(0) != index) --result.expolygons_index; + + // find polygon index + const std::vector &shape_offset = m_offsets[result.expolygons_index]; + auto it2 = std::lower_bound(shape_offset.begin() + 1, shape_offset.end(), index); + result.polygon_index = it2 - shape_offset.begin(); + if (it2 == shape_offset.end() || *it2 != index) --result.polygon_index; + + // calculate point index + uint32_t polygon_offset = shape_offset[result.polygon_index]; + assert(index >= polygon_offset); + result.point_index = index - polygon_offset; + return result; +} + +bool ExPolygonsIndices::is_last_point(const ExPolygonsIndex &id) const { + assert(id.expolygons_index < m_offsets.size()); + const std::vector &shape_offset = m_offsets[id.expolygons_index]; + assert(id.polygon_index < shape_offset.size()); + uint32_t index = shape_offset[id.polygon_index] + id.point_index; + assert(index < m_count); + // next index + uint32_t next_point_index = index + 1; + uint32_t next_poly_index = id.polygon_index + 1; + uint32_t next_expoly_index = id.expolygons_index + 1; + // is last expoly? + if (next_expoly_index == m_offsets.size()) { + // is last expoly last poly? + if (next_poly_index == shape_offset.size()) + return next_point_index == m_count; + } else { + // (not last expoly) is expoly last poly? + if (next_poly_index == shape_offset.size()) + return next_point_index == m_offsets[next_expoly_index][0]; + } + // Not last polygon in expolygon + return next_point_index == shape_offset[next_poly_index]; +} + +uint32_t ExPolygonsIndices::get_count() const { return m_count; } diff --git a/src/libslic3r/ExPolygonsIndex.hpp b/src/libslic3r/ExPolygonsIndex.hpp new file mode 100644 index 00000000000..b46fd508906 --- /dev/null +++ b/src/libslic3r/ExPolygonsIndex.hpp @@ -0,0 +1,74 @@ +#ifndef slic3r_ExPolygonsIndex_hpp_ +#define slic3r_ExPolygonsIndex_hpp_ + +#include "ExPolygon.hpp" +namespace Slic3r { + +/// +/// Index into ExPolygons +/// Identify expolygon, its contour (or hole) and point +/// +struct ExPolygonsIndex +{ + // index of ExPolygons + uint32_t expolygons_index; + + // index of Polygon + // 0 .. contour + // N .. hole[N-1] + uint32_t polygon_index; + + // index of point in polygon + uint32_t point_index; + + bool is_contour() const { return polygon_index == 0; } + bool is_hole() const { return polygon_index != 0; } + uint32_t hole_index() const { return polygon_index - 1; } +}; + +/// +/// Keep conversion from ExPolygonsIndex to Index and vice versa +/// ExPolygonsIndex .. contour(or hole) point from ExPolygons +/// Index .. continous number +/// +/// index is used to address lines and points as result from function +/// Slic3r::to_lines, Slic3r::to_points +/// +class ExPolygonsIndices +{ + std::vector> m_offsets; + // for check range of index + uint32_t m_count; // count of points +public: + ExPolygonsIndices(const ExPolygons &shapes); + + /// + /// Convert to one index number + /// + /// Compose of adress into expolygons + /// Index + uint32_t cvt(const ExPolygonsIndex &id) const; + + /// + /// Separate to multi index + /// + /// adress into expolygons + /// + ExPolygonsIndex cvt(uint32_t index) const; + + /// + /// Check whether id is last point in polygon + /// + /// Identify point in expolygon + /// True when id is last point in polygon otherwise false + bool is_last_point(const ExPolygonsIndex &id) const; + + /// + /// Count of points in expolygons + /// + /// Count of points in expolygons + uint32_t get_count() const; +}; + +} // namespace Slic3r +#endif // slic3r_ExPolygonsIndex_hpp_ diff --git a/src/libslic3r/Execution/Execution.hpp b/src/libslic3r/Execution/Execution.hpp index 62e49cfeb36..57ad4b41b97 100644 --- a/src/libslic3r/Execution/Execution.hpp +++ b/src/libslic3r/Execution/Execution.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include "libslic3r/libslic3r.h" @@ -29,8 +30,8 @@ template using AsTraits = Traits>; // Each execution policy should declare two types of mutexes. A a spin lock and // a blocking mutex. These types should satisfy the BasicLockable concept. -template using SpinningMutex = typename Traits::SpinningMutex; -template using BlockingMutex = typename Traits::BlockingMutex; +template using SpinningMutex = typename AsTraits::SpinningMutex; +template using BlockingMutex = typename AsTraits::BlockingMutex; // Query the available threads for concurrency. template > @@ -44,7 +45,8 @@ size_t max_concurrency(const EP &ep) template> void for_each(const EP &ep, It from, It to, Fn &&fn, size_t granularity = 1) { - AsTraits::for_each(ep, from, to, std::forward(fn), granularity); + AsTraits::for_each(ep, from, to, std::forward(fn), + std::max(granularity, size_t(1))); } // A reduce operation with the execution policy passed as argument. @@ -68,7 +70,7 @@ T reduce(const EP & ep, return AsTraits::reduce(ep, from, to, init, std::forward(mergefn), std::forward(accessfn), - granularity); + std::max(granularity, size_t(1))); } // An overload of reduce method to be used with iterators as 'from' and 'to' @@ -87,7 +89,7 @@ T reduce(const EP &ep, { return reduce( ep, from, to, init, std::forward(mergefn), - [](const auto &i) { return i; }, granularity); + [](const auto &i) { return i; }, std::max(granularity, size_t(1))); } template{}, - std::forward(accessfn), granularity); + std::forward(accessfn), + std::max(granularity, size_t(1))); } @@ -119,7 +122,7 @@ T accumulate(const EP &ep, { return reduce( ep, from, to, init, std::plus{}, [](const auto &i) { return i; }, - granularity); + std::max(granularity, size_t(1))); } } // namespace execution_policy diff --git a/src/libslic3r/Execution/ExecutionTBB.hpp b/src/libslic3r/Execution/ExecutionTBB.hpp index 2250b8e322a..db4ee243fdd 100644 --- a/src/libslic3r/Execution/ExecutionTBB.hpp +++ b/src/libslic3r/Execution/ExecutionTBB.hpp @@ -53,7 +53,7 @@ template<> struct execution::Traits { I to, const T &init, MergeFn &&mergefn, - AccessFn &&access, + AccessFn &&accessfn, size_t granularity = 1 ) { @@ -61,7 +61,7 @@ template<> struct execution::Traits { tbb::blocked_range{from, to, granularity}, init, [&](const auto &range, T subinit) { T acc = subinit; - loop_(range, [&](auto &i) { acc = mergefn(acc, access(i)); }); + loop_(range, [&](auto &i) { acc = mergefn(acc, accessfn(i)); }); return acc; }, std::forward(mergefn)); diff --git a/src/libslic3r/Extruder.cpp b/src/libslic3r/Extruder.cpp index f7a5c50071c..b1a089d0850 100644 --- a/src/libslic3r/Extruder.cpp +++ b/src/libslic3r/Extruder.cpp @@ -1,4 +1,5 @@ #include "Extruder.hpp" +#include "GCodeWriter.hpp" #include "PrintConfig.hpp" namespace Slic3r { @@ -7,24 +8,24 @@ Extruder::Extruder(unsigned int id, GCodeConfig *config) : m_id(id), m_config(config) { - reset(); - // cache values that are going to be called often m_e_per_mm3 = this->extrusion_multiplier(); if (! m_config->use_volumetric_e) m_e_per_mm3 /= this->filament_crossection(); } -double Extruder::extrude(double dE) +std::pair Extruder::extrude(double dE) { // in case of relative E distances we always reset to 0 before any output if (m_config->use_relative_e_distances) m_E = 0.; + // Quantize extruder delta to G-code resolution. + dE = GCodeFormatter::quantize_e(dE); m_E += dE; m_absolute_E += dE; if (dE < 0.) m_retracted -= dE; - return dE; + return std::make_pair(dE, m_E); } /* This method makes sure the extruder is retracted by the specified amount @@ -34,28 +35,52 @@ double Extruder::extrude(double dE) The restart_extra argument sets the extra length to be used for unretraction. If we're actually performing a retraction, any restart_extra value supplied will overwrite the previous one if any. */ -double Extruder::retract(double length, double restart_extra) +std::pair Extruder::retract(double retract_length, double restart_extra) { + assert(restart_extra >= 0); // in case of relative E distances we always reset to 0 before any output if (m_config->use_relative_e_distances) m_E = 0.; - double to_retract = std::max(0., length - m_retracted); + // Quantize extruder delta to G-code resolution. + double to_retract = this->retract_to_go(retract_length); if (to_retract > 0.) { m_E -= to_retract; m_absolute_E -= to_retract; m_retracted += to_retract; - m_restart_extra = restart_extra; + m_restart_extra = restart_extra; } - return to_retract; + return std::make_pair(to_retract, m_E); } -double Extruder::unretract() +double Extruder::retract_to_go(double retract_length) const { - double dE = m_retracted + m_restart_extra; - this->extrude(dE); + return std::max(0., GCodeFormatter::quantize_e(retract_length - m_retracted)); +} + +std::pair Extruder::unretract() +{ + auto [dE, emitE] = this->extrude(m_retracted + m_restart_extra); m_retracted = 0.; m_restart_extra = 0.; - return dE; + return std::make_pair(dE, emitE); +} + +// Setting the retract state from the script. +// Sets current retraction value & restart extra filament amount if retracted > 0. +void Extruder::set_retracted(double retracted, double restart_extra) +{ + if (retracted < - EPSILON) + throw Slic3r::RuntimeError("Custom G-code reports negative z_retracted."); + if (restart_extra < - EPSILON) + throw Slic3r::RuntimeError("Custom G-code reports negative z_restart_extra."); + + if (retracted > EPSILON) { + m_retracted = retracted; + m_restart_extra = restart_extra < EPSILON ? 0 : restart_extra; + } else { + m_retracted = 0; + m_restart_extra = 0; + } } // Used filament volume in mm^3. diff --git a/src/libslic3r/Extruder.hpp b/src/libslic3r/Extruder.hpp index e9c6927f857..7c37f1934c9 100644 --- a/src/libslic3r/Extruder.hpp +++ b/src/libslic3r/Extruder.hpp @@ -12,28 +12,43 @@ class Extruder { public: Extruder(unsigned int id, GCodeConfig *config); - virtual ~Extruder() {} - - void reset() { - m_E = 0; - m_absolute_E = 0; - m_retracted = 0; - m_restart_extra = 0; - } + ~Extruder() = default; unsigned int id() const { return m_id; } - double extrude(double dE); - double retract(double length, double restart_extra); - double unretract(); - double E() const { return m_E; } - void reset_E() { m_E = 0.; } + // Following three methods emit: + // first - extrusion delta + // second - number to emit to G-code: This may be delta for relative mode or a distance from last reset_E() for absolute mode. + // They also quantize the E axis to G-code resolution. + std::pair extrude(double dE); + std::pair retract(double retract_length, double restart_extra); + std::pair unretract(); + // How much to retract yet before retract_length is reached? + // The value is quantized to G-code resolution. + double retract_to_go(double retract_length) const; + + // Reset the current state of the E axis (this is only needed for relative extruder addressing mode anyways). + // Returns true if the extruder was non-zero before reset. + bool reset_E() { bool modified = m_E != 0; m_E = 0.; return modified; } double e_per_mm(double mm3_per_mm) const { return mm3_per_mm * m_e_per_mm3; } double e_per_mm3() const { return m_e_per_mm3; } // Used filament volume in mm^3. double extruded_volume() const; // Used filament length in mm. double used_filament() const; + + // Getters for the PlaceholderParser. + // Get current extruder position. Only applicable with absolute extruder addressing. + double position() const { return m_E; } + // Get current retraction value. Only non-negative values. + double retracted() const { return m_retracted; } + // Get extra retraction planned after + double restart_extra() const { return m_restart_extra; } + // Setters for the PlaceholderParser. + // Set current extruder position. Only applicable with absolute extruder addressing. + void set_position(double e) { m_E = e; } + // Sets current retraction value & restart extra filament amount if retracted > 0. + void set_retracted(double retracted, double restart_extra); double filament_diameter() const; double filament_crossection() const { return this->filament_diameter() * this->filament_diameter() * 0.25 * PI; } @@ -57,14 +72,16 @@ class Extruder GCodeConfig *m_config; // Print-wide global ID of this extruder. unsigned int m_id; - // Current state of the extruder axis, may be resetted if use_relative_e_distances. - double m_E; + // Current state of the extruder axis. + // For absolute extruder addressing, it is the current state since the last reset (G92 E0) issued at the end of the last retraction. + // For relative extruder addressing, it is the E axis difference emitted into the G-code the last time. + double m_E { 0 }; // Current state of the extruder tachometer, used to output the extruded_volume() and used_filament() statistics. - double m_absolute_E; + double m_absolute_E { 0 }; // Current positive amount of retraction. - double m_retracted; + double m_retracted { 0 }; // When retracted, this value stores the extra amount of priming on deretraction. - double m_restart_extra; + double m_restart_extra { 0 }; double m_e_per_mm3; }; @@ -76,4 +93,4 @@ inline bool operator> (const Extruder &e1, const Extruder &e2) { return e1.id() } -#endif +#endif // slic3r_Extruder_hpp_ diff --git a/src/libslic3r/ExtrusionEntity.cpp b/src/libslic3r/ExtrusionEntity.cpp index b0cef760233..8a1a88b4b11 100644 --- a/src/libslic3r/ExtrusionEntity.cpp +++ b/src/libslic3r/ExtrusionEntity.cpp @@ -1,6 +1,6 @@ #include "ExtrusionEntity.hpp" #include "ExtrusionEntityCollection.hpp" -#include "ExPolygonCollection.hpp" +#include "ExPolygon.hpp" #include "ClipperUtils.hpp" #include "Extruder.hpp" #include "Flow.hpp" @@ -8,18 +8,16 @@ #include #include -#define L(s) (s) - namespace Slic3r { -void ExtrusionPath::intersect_expolygons(const ExPolygonCollection &collection, ExtrusionEntityCollection* retval) const +void ExtrusionPath::intersect_expolygons(const ExPolygons &collection, ExtrusionEntityCollection* retval) const { - this->_inflate_collection(intersection_pl(Polylines{ polyline }, collection.expolygons), retval); + this->_inflate_collection(intersection_pl(Polylines{ polyline }, collection), retval); } -void ExtrusionPath::subtract_expolygons(const ExPolygonCollection &collection, ExtrusionEntityCollection* retval) const +void ExtrusionPath::subtract_expolygons(const ExPolygons &collection, ExtrusionEntityCollection* retval) const { - this->_inflate_collection(diff_pl(Polylines{ this->polyline }, collection.expolygons), retval); + this->_inflate_collection(diff_pl(Polylines{ this->polyline }, collection), retval); } void ExtrusionPath::clip_end(double distance) @@ -52,7 +50,7 @@ void ExtrusionPath::polygons_covered_by_spacing(Polygons &out, const float scale { // Instantiating the Flow class to get the line spacing. // Don't know the nozzle diameter, setting to zero. It shall not matter it shall be optimized out by the compiler. - bool bridge = is_bridge(this->role()); + bool bridge = this->role().is_bridge(); assert(! bridge || this->width == this->height); auto flow = bridge ? Flow::bridging_flow(this->width, 0.f) : Flow(this->width, this->height, 0.f); polygons_append(out, offset(this->polyline, 0.5f * float(flow.scaled_spacing()) + scaled_epsilon)); @@ -210,7 +208,7 @@ ExtrusionLoop::ClosestPathPoint ExtrusionLoop::get_closest_path_and_point(const out.segment_idx = foot_pt_.first; min2 = d2; } - if (prefer_non_overhang && !is_bridge(path.role()) && d2 < min2_non_overhang) { + if (prefer_non_overhang && ! path.role().is_bridge() && d2 < min2_non_overhang) { best_non_overhang.foot_pt = foot_pt_.second; best_non_overhang.path_idx = &path - &this->paths.front(); best_non_overhang.segment_idx = foot_pt_.first; @@ -296,7 +294,7 @@ bool ExtrusionLoop::has_overhang_point(const Point &point) const if (pos != -1) { // point belongs to this path // we consider it overhang only if it's not an endpoint - return (is_bridge(path.role()) && pos > 0 && pos != (int)(path.polyline.points.size())-1); + return (path.role().is_bridge() && pos > 0 && pos != int(path.polyline.points.size())-1); } } return false; @@ -322,65 +320,4 @@ double ExtrusionLoop::min_mm3_per_mm() const return min_mm3_per_mm; } - -std::string ExtrusionEntity::role_to_string(ExtrusionRole role) -{ - switch (role) { - case erNone : return L("Unknown"); - case erPerimeter : return L("Perimeter"); - case erExternalPerimeter : return L("External perimeter"); - case erOverhangPerimeter : return L("Overhang perimeter"); - case erInternalInfill : return L("Internal infill"); - case erSolidInfill : return L("Solid infill"); - case erTopSolidInfill : return L("Top solid infill"); - case erIroning : return L("Ironing"); - case erBridgeInfill : return L("Bridge infill"); - case erGapFill : return L("Gap fill"); - case erSkirt : return L("Skirt/Brim"); - case erSupportMaterial : return L("Support material"); - case erSupportMaterialInterface : return L("Support material interface"); - case erWipeTower : return L("Wipe tower"); - case erCustom : return L("Custom"); - case erMixed : return L("Mixed"); - default : assert(false); - } - return ""; -} - -ExtrusionRole ExtrusionEntity::string_to_role(const std::string_view role) -{ - if (role == L("Perimeter")) - return erPerimeter; - else if (role == L("External perimeter")) - return erExternalPerimeter; - else if (role == L("Overhang perimeter")) - return erOverhangPerimeter; - else if (role == L("Internal infill")) - return erInternalInfill; - else if (role == L("Solid infill")) - return erSolidInfill; - else if (role == L("Top solid infill")) - return erTopSolidInfill; - else if (role == L("Ironing")) - return erIroning; - else if (role == L("Bridge infill")) - return erBridgeInfill; - else if (role == L("Gap fill")) - return erGapFill; - else if (role == L("Skirt") || role == L("Skirt/Brim")) // "Skirt" is for backward compatibility with 2.3.1 and earlier - return erSkirt; - else if (role == L("Support material")) - return erSupportMaterial; - else if (role == L("Support material interface")) - return erSupportMaterialInterface; - else if (role == L("Wipe tower")) - return erWipeTower; - else if (role == L("Custom")) - return erCustom; - else if (role == L("Mixed")) - return erMixed; - else - return erNone; -} - } diff --git a/src/libslic3r/ExtrusionEntity.hpp b/src/libslic3r/ExtrusionEntity.hpp index 682ddad9fe7..277ac78242d 100644 --- a/src/libslic3r/ExtrusionEntity.hpp +++ b/src/libslic3r/ExtrusionEntity.hpp @@ -2,6 +2,7 @@ #define slic3r_ExtrusionEntity_hpp_ #include "libslic3r.h" +#include "ExtrusionRole.hpp" #include "Polygon.hpp" #include "Polyline.hpp" @@ -11,69 +12,11 @@ namespace Slic3r { -class ExPolygonCollection; +class ExPolygon; +using ExPolygons = std::vector; class ExtrusionEntityCollection; class Extruder; -// Each ExtrusionRole value identifies a distinct set of { extruder, speed } -enum ExtrusionRole : uint8_t { - erNone, - erPerimeter, - erExternalPerimeter, - erOverhangPerimeter, - erInternalInfill, - erSolidInfill, - erTopSolidInfill, - erIroning, - erBridgeInfill, - erGapFill, - erSkirt, - erSupportMaterial, - erSupportMaterialInterface, - erWipeTower, - erCustom, - // Extrusion role for a collection with multiple extrusion roles. - erMixed, - erCount -}; - -// Special flags describing loop -enum ExtrusionLoopRole { - elrDefault, - elrContourInternalPerimeter, - elrSkirt, -}; - - -inline bool is_perimeter(ExtrusionRole role) -{ - return role == erPerimeter - || role == erExternalPerimeter - || role == erOverhangPerimeter; -} - -inline bool is_infill(ExtrusionRole role) -{ - return role == erBridgeInfill - || role == erInternalInfill - || role == erSolidInfill - || role == erTopSolidInfill - || role == erIroning; -} - -inline bool is_solid_infill(ExtrusionRole role) -{ - return role == erBridgeInfill - || role == erSolidInfill - || role == erTopSolidInfill - || role == erIroning; -} - -inline bool is_bridge(ExtrusionRole role) { - return role == erBridgeInfill - || role == erOverhangPerimeter; -} - class ExtrusionEntity { public: @@ -88,6 +31,9 @@ class ExtrusionEntity virtual void reverse() = 0; virtual const Point& first_point() const = 0; virtual const Point& last_point() const = 0; + // Returns an approximately middle point of a path, loop or an extrusion collection. + // Used to get a sample point of an extrusion or extrusion collection, which is possibly deep inside its island. + virtual const Point& middle_point() const = 0; // Produce a list of 2D polygons covered by the extruded paths, offsetted by the extrusion width. // Increase the offset by scaled_epsilon to achieve an overlap, so a union will produce no gaps. virtual void polygons_covered_by_width(Polygons &out, const float scaled_epsilon) const = 0; @@ -107,9 +53,6 @@ class ExtrusionEntity virtual Polylines as_polylines() const { Polylines dst; this->collect_polylines(dst); return dst; } virtual double length() const = 0; virtual double total_volume() const = 0; - - static std::string role_to_string(ExtrusionRole role); - static ExtrusionRole string_to_role(const std::string_view role); }; typedef std::vector ExtrusionEntitiesPtr; @@ -141,15 +84,16 @@ class ExtrusionPath : public ExtrusionEntity void reverse() override { this->polyline.reverse(); } const Point& first_point() const override { return this->polyline.points.front(); } const Point& last_point() const override { return this->polyline.points.back(); } + const Point& middle_point() const override { return this->polyline.points[this->polyline.size() / 2]; } size_t size() const { return this->polyline.size(); } bool empty() const { return this->polyline.empty(); } bool is_closed() const { return ! this->empty() && this->polyline.points.front() == this->polyline.points.back(); } - // Produce a list of extrusion paths into retval by clipping this path by ExPolygonCollection. + // Produce a list of extrusion paths into retval by clipping this path by ExPolygons. // Currently not used. - void intersect_expolygons(const ExPolygonCollection &collection, ExtrusionEntityCollection* retval) const; - // Produce a list of extrusion paths into retval by removing parts of this path by ExPolygonCollection. + void intersect_expolygons(const ExPolygons &collection, ExtrusionEntityCollection* retval) const; + // Produce a list of extrusion paths into retval by removing parts of this path by ExPolygons. // Currently not used. - void subtract_expolygons(const ExPolygonCollection &collection, ExtrusionEntityCollection* retval) const; + void subtract_expolygons(const ExPolygons &collection, ExtrusionEntityCollection* retval) const; void clip_end(double distance); void simplify(double tolerance); double length() const override; @@ -178,6 +122,16 @@ class ExtrusionPath : public ExtrusionEntity ExtrusionRole m_role; }; +class ExtrusionPathOriented : public ExtrusionPath +{ +public: + ExtrusionPathOriented(ExtrusionRole role, double mm3_per_mm, float width, float height) : ExtrusionPath(role, mm3_per_mm, width, height) {} + ExtrusionEntity* clone() const override { return new ExtrusionPathOriented(*this); } + // Create a new object, initialize it with this object using the move semantics. + ExtrusionEntity* clone_move() override { return new ExtrusionPathOriented(std::move(*this)); } + virtual bool can_reverse() const override { return false; } +}; + typedef std::vector ExtrusionPaths; // Single continuous extrusion path, possibly with varying extrusion thickness, extrusion height or bridging / non bridging. @@ -203,10 +157,11 @@ class ExtrusionMultiPath : public ExtrusionEntity void reverse() override; const Point& first_point() const override { return this->paths.front().polyline.points.front(); } const Point& last_point() const override { return this->paths.back().polyline.points.back(); } + const Point& middle_point() const override { auto &path = this->paths[this->paths.size() / 2]; return path.polyline.points[path.polyline.size() / 2]; } size_t size() const { return this->paths.size(); } bool empty() const { return this->paths.empty(); } double length() const override; - ExtrusionRole role() const override { return this->paths.empty() ? erNone : this->paths.front().role(); } + ExtrusionRole role() const override { return this->paths.empty() ? ExtrusionRole::None : this->paths.front().role(); } // Produce a list of 2D polygons covered by the extruded paths, offsetted by the extrusion width. // Increase the offset by scaled_epsilon to achieve an overlap, so a union will produce no gaps. void polygons_covered_by_width(Polygons &out, const float scaled_epsilon) const override; @@ -242,7 +197,7 @@ class ExtrusionLoop : public ExtrusionEntity ExtrusionLoop(ExtrusionPaths &&paths, ExtrusionLoopRole role = elrDefault) : paths(std::move(paths)), m_loop_role(role) {} ExtrusionLoop(const ExtrusionPath &path, ExtrusionLoopRole role = elrDefault) : m_loop_role(role) { this->paths.push_back(path); } - ExtrusionLoop(const ExtrusionPath &&path, ExtrusionLoopRole role = elrDefault) : m_loop_role(role) + ExtrusionLoop(ExtrusionPath &&path, ExtrusionLoopRole role = elrDefault) : m_loop_role(role) { this->paths.emplace_back(std::move(path)); } bool is_loop() const override{ return true; } bool can_reverse() const override { return false; } @@ -254,6 +209,7 @@ class ExtrusionLoop : public ExtrusionEntity void reverse() override; const Point& first_point() const override { return this->paths.front().polyline.points.front(); } const Point& last_point() const override { assert(this->first_point() == this->paths.back().polyline.points.back()); return this->first_point(); } + const Point& middle_point() const override { auto& path = this->paths[this->paths.size() / 2]; return path.polyline.points[path.polyline.size() / 2]; } Polygon polygon() const; double length() const override; bool split_at_vertex(const Point &point, const double scaled_epsilon = scaled(0.001)); @@ -268,7 +224,7 @@ class ExtrusionLoop : public ExtrusionEntity // Test, whether the point is extruded by a bridging flow. // This used to be used to avoid placing seams on overhangs, but now the EdgeGrid is used instead. bool has_overhang_point(const Point &point) const; - ExtrusionRole role() const override { return this->paths.empty() ? erNone : this->paths.front().role(); } + ExtrusionRole role() const override { return this->paths.empty() ? ExtrusionRole::None : this->paths.front().role(); } ExtrusionLoopRole loop_role() const { return m_loop_role; } // Produce a list of 2D polygons covered by the extruded paths, offsetted by the extrusion width. // Increase the offset by scaled_epsilon to achieve an overlap, so a union will produce no gaps. @@ -293,8 +249,6 @@ class ExtrusionLoop : public ExtrusionEntity } double total_volume() const override { double volume =0.; for (const auto& path : paths) volume += path.total_volume(); return volume; } - //static inline std::string role_to_string(ExtrusionLoopRole role); - #ifndef NDEBUG bool validate() const { assert(this->first_point() == this->paths.back().polyline.points.back()); @@ -329,23 +283,23 @@ inline void extrusion_paths_append(ExtrusionPaths &dst, Polylines &&polylines, E polylines.clear(); } -inline void extrusion_entities_append_paths(ExtrusionEntitiesPtr &dst, Polylines &polylines, ExtrusionRole role, double mm3_per_mm, float width, float height) +inline void extrusion_entities_append_paths(ExtrusionEntitiesPtr &dst, const Polylines &polylines, ExtrusionRole role, double mm3_per_mm, float width, float height, bool can_reverse = true) { dst.reserve(dst.size() + polylines.size()); - for (Polyline &polyline : polylines) + for (const Polyline &polyline : polylines) if (polyline.is_valid()) { - ExtrusionPath *extrusion_path = new ExtrusionPath(role, mm3_per_mm, width, height); + ExtrusionPath* extrusion_path = can_reverse ? new ExtrusionPath(role, mm3_per_mm, width, height) : new ExtrusionPathOriented(role, mm3_per_mm, width, height); dst.push_back(extrusion_path); extrusion_path->polyline = polyline; } } -inline void extrusion_entities_append_paths(ExtrusionEntitiesPtr &dst, Polylines &&polylines, ExtrusionRole role, double mm3_per_mm, float width, float height) +inline void extrusion_entities_append_paths(ExtrusionEntitiesPtr &dst, Polylines &&polylines, ExtrusionRole role, double mm3_per_mm, float width, float height, bool can_reverse = true) { dst.reserve(dst.size() + polylines.size()); for (Polyline &polyline : polylines) if (polyline.is_valid()) { - ExtrusionPath *extrusion_path = new ExtrusionPath(role, mm3_per_mm, width, height); + ExtrusionPath *extrusion_path = can_reverse ? new ExtrusionPath(role, mm3_per_mm, width, height) : new ExtrusionPathOriented(role, mm3_per_mm, width, height); dst.push_back(extrusion_path); extrusion_path->polyline = std::move(polyline); } diff --git a/src/libslic3r/ExtrusionEntityCollection.cpp b/src/libslic3r/ExtrusionEntityCollection.cpp index 391ac2d5872..55167861c33 100644 --- a/src/libslic3r/ExtrusionEntityCollection.cpp +++ b/src/libslic3r/ExtrusionEntityCollection.cpp @@ -8,7 +8,7 @@ namespace Slic3r { void filter_by_extrusion_role_in_place(ExtrusionEntitiesPtr &extrusion_entities, ExtrusionRole role) { - if (role != erMixed) { + if (role != ExtrusionRole::Mixed) { auto first = extrusion_entities.begin(); auto last = extrusion_entities.end(); extrusion_entities.erase( @@ -56,12 +56,9 @@ ExtrusionEntityCollection::operator ExtrusionPaths() const return paths; } -ExtrusionEntity* ExtrusionEntityCollection::clone() const +ExtrusionEntity *ExtrusionEntityCollection::clone() const { - ExtrusionEntityCollection* coll = new ExtrusionEntityCollection(*this); - for (size_t i = 0; i < coll->entities.size(); ++i) - coll->entities[i] = this->entities[i]->clone(); - return coll; + return new ExtrusionEntityCollection(*this); } void ExtrusionEntityCollection::reverse() diff --git a/src/libslic3r/ExtrusionEntityCollection.hpp b/src/libslic3r/ExtrusionEntityCollection.hpp index 1ecda7dd53e..676bdd891ae 100644 --- a/src/libslic3r/ExtrusionEntityCollection.hpp +++ b/src/libslic3r/ExtrusionEntityCollection.hpp @@ -44,13 +44,20 @@ class ExtrusionEntityCollection : public ExtrusionEntity } ~ExtrusionEntityCollection() override { clear(); } explicit operator ExtrusionPaths() const; - + + ExtrusionEntitiesPtr::const_iterator cbegin() const { return this->entities.cbegin(); } + ExtrusionEntitiesPtr::const_iterator cend() const { return this->entities.cend(); } + ExtrusionEntitiesPtr::const_iterator begin() const { return this->entities.cbegin(); } + ExtrusionEntitiesPtr::const_iterator end() const { return this->entities.cend(); } + ExtrusionEntitiesPtr::iterator begin() { return this->entities.begin(); } + ExtrusionEntitiesPtr::iterator end() { return this->entities.end(); } + bool is_collection() const override { return true; } ExtrusionRole role() const override { - ExtrusionRole out = erNone; + ExtrusionRole out{ ExtrusionRole::None }; for (const ExtrusionEntity *ee : entities) { ExtrusionRole er = ee->role(); - out = (out == erNone || out == er) ? er : erMixed; + out = (out == ExtrusionRole::None || out == er) ? er : ExtrusionRole::Mixed; } return out; } @@ -69,7 +76,11 @@ class ExtrusionEntityCollection : public ExtrusionEntity if (entities.empty()) entities = std::move(src); else { - std::move(std::begin(src), std::end(src), std::back_inserter(entities)); + entities.insert(entities.end(), + std::make_move_iterator(src.begin()), + std::make_move_iterator(src.end())); + // Removing pointers to polymorphic extrusions from the donor object + // so that they will not be deleted twice. src.clear(); } } @@ -85,12 +96,13 @@ class ExtrusionEntityCollection : public ExtrusionEntity } void replace(size_t i, const ExtrusionEntity &entity); void remove(size_t i); - static ExtrusionEntityCollection chained_path_from(const ExtrusionEntitiesPtr &extrusion_entities, const Point &start_near, ExtrusionRole role = erMixed); - ExtrusionEntityCollection chained_path_from(const Point &start_near, ExtrusionRole role = erMixed) const + static ExtrusionEntityCollection chained_path_from(const ExtrusionEntitiesPtr &extrusion_entities, const Point &start_near, ExtrusionRole role = ExtrusionRole::Mixed); + ExtrusionEntityCollection chained_path_from(const Point &start_near, ExtrusionRole role = ExtrusionRole::Mixed) const { return this->no_sort ? *this : chained_path_from(this->entities, start_near, role); } void reverse() override; const Point& first_point() const override { return this->entities.front()->first_point(); } const Point& last_point() const override { return this->entities.back()->last_point(); } + const Point& middle_point() const override { return this->entities[this->entities.size() / 2]->middle_point(); } // Produce a list of 2D polygons covered by the extruded paths, offsetted by the extrusion width. // Increase the offset by scaled_epsilon to achieve an overlap, so a union will produce no gaps. void polygons_covered_by_width(Polygons &out, const float scaled_epsilon) const override; @@ -102,6 +114,9 @@ class ExtrusionEntityCollection : public ExtrusionEntity { Polygons out; this->polygons_covered_by_width(out, scaled_epsilon); return out; } Polygons polygons_covered_by_spacing(const float scaled_epsilon = 0.f) const { Polygons out; this->polygons_covered_by_spacing(out, scaled_epsilon); return out; } + size_t size() const { return entities.size(); } + // Recursively count paths and loops contained in this collection. + // this->items_count() >= this->size() size_t items_count() const; /// Returns a flattened copy of this ExtrusionEntityCollection. That is, all of the items in its entities vector are not collections. /// You should be iterating over flatten().entities if you are interested in the underlying ExtrusionEntities (and don't care about hierarchy). @@ -117,12 +132,12 @@ class ExtrusionEntityCollection : public ExtrusionEntity }; void collect_polylines(Polylines &dst) const override { - for (ExtrusionEntity* extrusion_entity : this->entities) + for (const ExtrusionEntity *extrusion_entity : this->entities) extrusion_entity->collect_polylines(dst); } void collect_points(Points &dst) const override { - for (ExtrusionEntity* extrusion_entity : this->entities) + for (const ExtrusionEntity *extrusion_entity : this->entities) extrusion_entity->collect_points(dst); } diff --git a/src/libslic3r/ExtrusionRole.cpp b/src/libslic3r/ExtrusionRole.cpp new file mode 100644 index 00000000000..a7ec319496c --- /dev/null +++ b/src/libslic3r/ExtrusionRole.cpp @@ -0,0 +1,91 @@ +#include "ExtrusionRole.hpp" +#include "I18N.hpp" + +#include +#include +#include + + +namespace Slic3r { + +// Convert a rich bitmask based ExtrusionRole to a less expressive ordinal GCodeExtrusionRole. +// GCodeExtrusionRole is to be serialized into G-code and deserialized by G-code viewer, +GCodeExtrusionRole extrusion_role_to_gcode_extrusion_role(ExtrusionRole role) +{ + if (role == ExtrusionRole::None) return GCodeExtrusionRole::None; + if (role.is_perimeter()) { + return role.is_bridge() ? GCodeExtrusionRole::OverhangPerimeter : + role.is_external() ? GCodeExtrusionRole::ExternalPerimeter : GCodeExtrusionRole::Perimeter; + } + if (role == ExtrusionRole::InternalInfill) return GCodeExtrusionRole::InternalInfill; + if (role == ExtrusionRole::SolidInfill) return GCodeExtrusionRole::SolidInfill; + if (role == ExtrusionRole::TopSolidInfill) return GCodeExtrusionRole::TopSolidInfill; + if (role == ExtrusionRole::Ironing) return GCodeExtrusionRole::Ironing; + if (role == ExtrusionRole::BridgeInfill) return GCodeExtrusionRole::BridgeInfill; + if (role == ExtrusionRole::GapFill) return GCodeExtrusionRole::GapFill; + if (role == ExtrusionRole::Skirt) return GCodeExtrusionRole::Skirt; + if (role == ExtrusionRole::SupportMaterial) return GCodeExtrusionRole::SupportMaterial; + if (role == ExtrusionRole::SupportMaterialInterface) return GCodeExtrusionRole::SupportMaterialInterface; + if (role == ExtrusionRole::WipeTower) return GCodeExtrusionRole::WipeTower; + assert(false); + return GCodeExtrusionRole::None; +} + +std::string gcode_extrusion_role_to_string(GCodeExtrusionRole role) +{ + switch (role) { + case GCodeExtrusionRole::None : return L("Unknown"); + case GCodeExtrusionRole::Perimeter : return L("Perimeter"); + case GCodeExtrusionRole::ExternalPerimeter : return L("External perimeter"); + case GCodeExtrusionRole::OverhangPerimeter : return L("Overhang perimeter"); + case GCodeExtrusionRole::InternalInfill : return L("Internal infill"); + case GCodeExtrusionRole::SolidInfill : return L("Solid infill"); + case GCodeExtrusionRole::TopSolidInfill : return L("Top solid infill"); + case GCodeExtrusionRole::Ironing : return L("Ironing"); + case GCodeExtrusionRole::BridgeInfill : return L("Bridge infill"); + case GCodeExtrusionRole::GapFill : return L("Gap fill"); + case GCodeExtrusionRole::Skirt : return L("Skirt/Brim"); + case GCodeExtrusionRole::SupportMaterial : return L("Support material"); + case GCodeExtrusionRole::SupportMaterialInterface : return L("Support material interface"); + case GCodeExtrusionRole::WipeTower : return L("Wipe tower"); + case GCodeExtrusionRole::Custom : return L("Custom"); + default : assert(false); + } + return {}; +} + +GCodeExtrusionRole string_to_gcode_extrusion_role(const std::string_view role) +{ + if (role == L("Perimeter")) + return GCodeExtrusionRole::Perimeter; + else if (role == L("External perimeter")) + return GCodeExtrusionRole::ExternalPerimeter; + else if (role == L("Overhang perimeter")) + return GCodeExtrusionRole::OverhangPerimeter; + else if (role == L("Internal infill")) + return GCodeExtrusionRole::InternalInfill; + else if (role == L("Solid infill")) + return GCodeExtrusionRole::SolidInfill; + else if (role == L("Top solid infill")) + return GCodeExtrusionRole::TopSolidInfill; + else if (role == L("Ironing")) + return GCodeExtrusionRole::Ironing; + else if (role == L("Bridge infill")) + return GCodeExtrusionRole::BridgeInfill; + else if (role == L("Gap fill")) + return GCodeExtrusionRole::GapFill; + else if (role == L("Skirt") || role == L("Skirt/Brim")) // "Skirt" is for backward compatibility with 2.3.1 and earlier + return GCodeExtrusionRole::Skirt; + else if (role == L("Support material")) + return GCodeExtrusionRole::SupportMaterial; + else if (role == L("Support material interface")) + return GCodeExtrusionRole::SupportMaterialInterface; + else if (role == L("Wipe tower")) + return GCodeExtrusionRole::WipeTower; + else if (role == L("Custom")) + return GCodeExtrusionRole::Custom; + else + return GCodeExtrusionRole::None; +} + +} diff --git a/src/libslic3r/ExtrusionRole.hpp b/src/libslic3r/ExtrusionRole.hpp new file mode 100644 index 00000000000..5952d3fc567 --- /dev/null +++ b/src/libslic3r/ExtrusionRole.hpp @@ -0,0 +1,133 @@ +#ifndef slic3r_ExtrusionRole_hpp_ +#define slic3r_ExtrusionRole_hpp_ + +#include "enum_bitmask.hpp" + +#include +#include + +namespace Slic3r { + +enum class ExtrusionRoleModifier : uint16_t { +// 1) Extrusion types + // Perimeter (external, inner, ...) + Perimeter, + // Infill (top / bottom / solid inner / sparse inner / bridging inner ...) + Infill, + // Variable width extrusion + Thin, + // Support material extrusion + Support, + Skirt, + Wipe, +// 2) Extrusion modifiers + External, + Solid, + Ironing, + Bridge, +// 3) Special types + // Indicator that the extrusion role was mixed from multiple differing extrusion roles, + // for example from Support and SupportInterface. + Mixed, + // Stopper, there should be maximum 16 modifiers defined for uint16_t bit mask. + Count +}; +// There should be maximum 16 modifiers defined for uint16_t bit mask. +static_assert(int(ExtrusionRoleModifier::Count) <= 16, "ExtrusionRoleModifier: there must be maximum 16 modifiers defined to fit a 16 bit bitmask"); + +using ExtrusionRoleModifiers = enum_bitmask; +ENABLE_ENUM_BITMASK_OPERATORS(ExtrusionRoleModifier); + +struct ExtrusionRole : public ExtrusionRoleModifiers +{ + constexpr ExtrusionRole(const ExtrusionRoleModifier bit) : ExtrusionRoleModifiers(bit) {} + constexpr ExtrusionRole(const ExtrusionRoleModifiers bits) : ExtrusionRoleModifiers(bits) {} + + static constexpr const ExtrusionRoleModifiers None{}; + // Internal perimeter, not bridging. + static constexpr const ExtrusionRoleModifiers Perimeter{ ExtrusionRoleModifier::Perimeter }; + // External perimeter, not bridging. + static constexpr const ExtrusionRoleModifiers ExternalPerimeter{ ExtrusionRoleModifier::Perimeter | ExtrusionRoleModifier::External }; + // Perimeter, bridging. To be or'ed with ExtrusionRoleModifier::External for external bridging perimeter. + static constexpr const ExtrusionRoleModifiers OverhangPerimeter{ ExtrusionRoleModifier::Perimeter | ExtrusionRoleModifier::Bridge }; + // Sparse internal infill. + static constexpr const ExtrusionRoleModifiers InternalInfill{ ExtrusionRoleModifier::Infill }; + // Solid internal infill. + static constexpr const ExtrusionRoleModifiers SolidInfill{ ExtrusionRoleModifier::Infill | ExtrusionRoleModifier::Solid }; + // Top solid infill (visible). + //FIXME why there is no bottom solid infill type? + static constexpr const ExtrusionRoleModifiers TopSolidInfill{ ExtrusionRoleModifier::Infill | ExtrusionRoleModifier::Solid | ExtrusionRoleModifier::External }; + // Ironing infill at the top surfaces. + static constexpr const ExtrusionRoleModifiers Ironing{ ExtrusionRoleModifier::Infill | ExtrusionRoleModifier::Solid | ExtrusionRoleModifier::Ironing | ExtrusionRoleModifier::External }; + // Visible bridging infill at the bottom of an object. + static constexpr const ExtrusionRoleModifiers BridgeInfill{ ExtrusionRoleModifier::Infill | ExtrusionRoleModifier::Solid | ExtrusionRoleModifier::Bridge | ExtrusionRoleModifier::External }; +// static constexpr const ExtrusionRoleModifiers InternalBridgeInfill{ ExtrusionRoleModifier::Infill | ExtrusionRoleModifier::Solid | ExtrusionRoleModifier::Bridge }; + // Gap fill extrusion, currently used for any variable width extrusion: Thin walls outside of the outer extrusion, + // gap fill in between perimeters, gap fill between the inner perimeter and infill. + //FIXME revise GapFill and ThinWall types, split Gap Fill to Gap Fill and ThinWall. + static constexpr const ExtrusionRoleModifiers GapFill{ ExtrusionRoleModifier::Thin }; // | ExtrusionRoleModifier::External }; +// static constexpr const ExtrusionRoleModifiers ThinWall{ ExtrusionRoleModifier::Thin }; + static constexpr const ExtrusionRoleModifiers Skirt{ ExtrusionRoleModifier::Skirt }; + // Support base material, printed with non-soluble plastic. + static constexpr const ExtrusionRoleModifiers SupportMaterial{ ExtrusionRoleModifier::Support }; + // Support interface material, printed with soluble plastic. + static constexpr const ExtrusionRoleModifiers SupportMaterialInterface{ ExtrusionRoleModifier::Support | ExtrusionRoleModifier::External }; + // Wipe tower material. + static constexpr const ExtrusionRoleModifiers WipeTower{ ExtrusionRoleModifier::Wipe }; + // Extrusion role for a collection with multiple extrusion roles. + static constexpr const ExtrusionRoleModifiers Mixed{ ExtrusionRoleModifier::Mixed }; + + bool is_perimeter() const { return this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::Perimeter); } + bool is_external_perimeter() const { return this->is_perimeter() && this->is_external(); } + bool is_infill() const { return this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::Infill); } + bool is_solid_infill() const { return this->is_infill() && this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::Solid); } + bool is_external() const { return this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::External); } + bool is_bridge() const { return this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::Bridge); } + + bool is_support() const { return this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::Support); } + bool is_support_base() const { return this->is_support() && ! this->is_external(); } + bool is_support_interface() const { return this->is_support() && this->is_external(); } + bool is_mixed() const { return this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::Mixed); } +}; + +// Special flags describing loop +enum ExtrusionLoopRole { + elrDefault, + elrContourInternalPerimeter, + elrSkirt, +}; + +// Be careful when editing this list as many parts of the code depend +// on the values of these ordinars, for example +// GCodeViewer::Extrusion_Role_Colors +enum class GCodeExtrusionRole : uint8_t { + None, + Perimeter, + ExternalPerimeter, + OverhangPerimeter, + InternalInfill, + SolidInfill, + TopSolidInfill, + Ironing, + BridgeInfill, + GapFill, + Skirt, + SupportMaterial, + SupportMaterialInterface, + WipeTower, + // Custom (user defined) G-code block, for example start / end G-code. + Custom, + // Stopper to count number of enums. + Count +}; + +// Convert a rich bitmask based ExtrusionRole to a less expressive ordinal GCodeExtrusionRole. +// GCodeExtrusionRole is to be serialized into G-code and deserialized by G-code viewer, +GCodeExtrusionRole extrusion_role_to_gcode_extrusion_role(ExtrusionRole role); + +std::string gcode_extrusion_role_to_string(GCodeExtrusionRole role); +GCodeExtrusionRole string_to_gcode_extrusion_role(const std::string_view role); + +} + +#endif // slic3r_ExtrusionRole_hpp_ diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index d89f75df1af..a6e5e1fb4ac 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -8,15 +8,20 @@ #include "../Print.hpp" #include "../PrintConfig.hpp" #include "../Surface.hpp" +// for Arachne based infills #include "../PerimeterGenerator.hpp" #include "FillBase.hpp" #include "FillRectilinear.hpp" #include "FillLightning.hpp" #include "FillConcentric.hpp" +#include "FillEnsuring.hpp" +#include "Polygon.hpp" namespace Slic3r { +static constexpr const float NarrowInfillAreaThresholdMM = 3.f; + struct SurfaceFillParams { // Zero based extruder ID. @@ -50,7 +55,7 @@ struct SurfaceFillParams Flow flow; // For the output - ExtrusionRole extrusion_role = ExtrusionRole(0); + ExtrusionRole extrusion_role{ ExtrusionRole::None }; // Various print settings? @@ -79,8 +84,7 @@ struct SurfaceFillParams RETURN_COMPARE_NON_EQUAL(flow.height()); RETURN_COMPARE_NON_EQUAL(flow.nozzle_diameter()); RETURN_COMPARE_NON_EQUAL_TYPED(unsigned, bridge); - RETURN_COMPARE_NON_EQUAL_TYPED(unsigned, extrusion_role); - return false; + return this->extrusion_role.lower(rhs.extrusion_role); } bool operator==(const SurfaceFillParams &rhs) const { @@ -125,8 +129,8 @@ std::vector group_fills(const Layer &layer) bool has_internal_voids = false; for (size_t region_id = 0; region_id < layer.regions().size(); ++ region_id) { const LayerRegion &layerm = *layer.regions()[region_id]; - region_to_surface_params[region_id].assign(layerm.fill_surfaces.size(), nullptr); - for (const Surface &surface : layerm.fill_surfaces.surfaces) + region_to_surface_params[region_id].assign(layerm.fill_surfaces().size(), nullptr); + for (const Surface &surface : layerm.fill_surfaces()) if (surface.surface_type == stInternalVoid) has_internal_voids = true; else { @@ -148,17 +152,18 @@ std::vector group_fills(const Layer &layer) params.extrusion_role = is_bridge ? - erBridgeInfill : + ExtrusionRole::BridgeInfill : (surface.is_solid() ? - (surface.is_top() ? erTopSolidInfill : erSolidInfill) : - erInternalInfill); + (surface.is_top() ? ExtrusionRole::TopSolidInfill : ExtrusionRole::SolidInfill) : + ExtrusionRole::InternalInfill); params.bridge_angle = float(surface.bridge_angle); params.angle = float(Geometry::deg2rad(region_config.fill_angle.value)); // Calculate the actual flow we'll be using for this infill. params.bridge = is_bridge || Fill::use_bridge_flow(params.pattern); params.flow = params.bridge ? - layerm.bridging_flow(extrusion_role) : + // Always enable thick bridges for internal bridges. + layerm.bridging_flow(extrusion_role, surface.is_bridge() && ! surface.is_external()) : layerm.flow(extrusion_role, (surface.thickness == -1) ? layer.height : surface.thickness); // Calculate flow spacing for infill pattern generation. @@ -184,7 +189,7 @@ std::vector group_fills(const Layer &layer) auto it_params = set_surface_params.find(params); if (it_params == set_surface_params.end()) it_params = set_surface_params.insert(it_params, params); - region_to_surface_params[region_id][&surface - &layerm.fill_surfaces.surfaces.front()] = &(*it_params); + region_to_surface_params[region_id][&surface - &layerm.fill_surfaces().surfaces.front()] = &(*it_params); } } @@ -196,9 +201,9 @@ std::vector group_fills(const Layer &layer) for (size_t region_id = 0; region_id < layer.regions().size(); ++ region_id) { const LayerRegion &layerm = *layer.regions()[region_id]; - for (const Surface &surface : layerm.fill_surfaces.surfaces) + for (const Surface &surface : layerm.fill_surfaces()) if (surface.surface_type != stInternalVoid) { - const SurfaceFillParams *params = region_to_surface_params[region_id][&surface - &layerm.fill_surfaces.surfaces.front()]; + const SurfaceFillParams *params = region_to_surface_params[region_id][&surface - &layerm.fill_surfaces().surfaces.front()]; if (params != nullptr) { SurfaceFill &fill = surface_fills[params->idx]; if (fill.region_id == size_t(-1)) { @@ -285,7 +290,7 @@ std::vector group_fills(const Layer &layer) params.extruder = layerm.region().extruder(frSolidInfill); params.pattern = fill_type_monotonic(layerm.region().config().top_fill_pattern) ? ipMonotonic : ipRectilinear; params.density = 100.f; - params.extrusion_role = erInternalInfill; + params.extrusion_role = ExtrusionRole::InternalInfill; params.angle = float(Geometry::deg2rad(layerm.region().config().fill_angle.value)); // calculate the actual flow we'll be using for this infill params.flow = layerm.flow(frSolidInfill); @@ -301,6 +306,46 @@ std::vector group_fills(const Layer &layer) } } + // Detect narrow internal solid infill area and use ipEnsuring pattern instead. + { + std::vector narrow_expolygons; + static constexpr const auto narrow_pattern = ipEnsuring; + for (size_t surface_fill_id = 0, num_old_fills = surface_fills.size(); surface_fill_id < num_old_fills; ++ surface_fill_id) + if (SurfaceFill &fill = surface_fills[surface_fill_id]; fill.surface.surface_type == stInternalSolid) { + size_t num_expolygons = fill.expolygons.size(); + narrow_expolygons.clear(); + narrow_expolygons.reserve(num_expolygons); + // Detect narrow expolygons. + int num_narrow = 0; + for (const ExPolygon &ex : fill.expolygons) { + bool narrow = offset_ex(ex, -scaled(NarrowInfillAreaThresholdMM)).empty(); + num_narrow += int(narrow); + narrow_expolygons.emplace_back(narrow); + } + if (num_narrow == num_expolygons) { + // All expolygons are narrow, change the fill pattern. + fill.params.pattern = narrow_pattern; + } else if (num_narrow > 0) { + // Some expolygons are narrow, split the fills. + params = fill.params; + params.pattern = narrow_pattern; + surface_fills.emplace_back(params); + SurfaceFill &old_fill = surface_fills[surface_fill_id]; + SurfaceFill &new_fill = surface_fills.back(); + new_fill.region_id = old_fill.region_id; + new_fill.surface.surface_type = stInternalSolid; + new_fill.surface.thickness = old_fill.surface.thickness; + new_fill.expolygons.reserve(num_narrow); + for (size_t i = 0; i < narrow_expolygons.size(); ++ i) + if (narrow_expolygons[i]) + new_fill.expolygons.emplace_back(std::move(old_fill.expolygons[i])); + old_fill.expolygons.erase(std::remove_if(old_fill.expolygons.begin(), old_fill.expolygons.end(), + [&narrow_expolygons, ex_first = old_fill.expolygons.data()](const ExPolygon& ex) { return narrow_expolygons[&ex - ex_first]; }), + old_fill.expolygons.end()); + } + } + } + return surface_fills; } @@ -325,12 +370,104 @@ void export_group_fills_to_svg(const char *path, const std::vector } #endif -// friend to Layer -void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive::Octree* support_fill_octree, FillLightning::Generator* lightning_generator) +static void insert_fills_into_islands(Layer &layer, uint32_t fill_region_id, uint32_t fill_begin, uint32_t fill_end) { - for (LayerRegion *layerm : m_regions) - layerm->fills.clear(); + if (fill_begin < fill_end) { + // Sort the extrusion range into its LayerIsland. + // Traverse the slices in an increasing order of bounding box size, so that the islands inside another islands are tested first, + // so we can just test a point inside ExPolygon::contour and we may skip testing the holes. + auto point_inside_surface = [&layer](const size_t lslice_idx, const Point &point) { + const BoundingBox &bbox = layer.lslices_ex[lslice_idx].bbox; + return point.x() >= bbox.min.x() && point.x() < bbox.max.x() && + point.y() >= bbox.min.y() && point.y() < bbox.max.y() && + layer.lslices[lslice_idx].contour.contains(point); + }; + Point point = layer.get_region(fill_region_id)->fills().entities[fill_begin]->first_point(); + int lslice_idx = int(layer.lslices_ex.size()) - 1; + for (; lslice_idx >= 0; -- lslice_idx) + if (point_inside_surface(lslice_idx, point)) + break; + assert(lslice_idx >= 0); + if (lslice_idx >= 0) { + LayerSlice &lslice = layer.lslices_ex[lslice_idx]; + // Find an island. + LayerIsland *island = nullptr; + if (lslice.islands.size() == 1) { + // Cool, just save the extrusions in there. + island = &lslice.islands.front(); + } else { + // The infill was created for one of the infills. + // In case of ironing, the infill may not fall into any of the infill expolygons either. + // In case of some numerical error, the infill may not fall into any of the infill expolygons either. + // 1) Try an exact test, it should be cheaper than a closest region test. + for (LayerIsland &li : lslice.islands) { + const BoundingBoxes &bboxes = li.fill_expolygons_composite() ? + layer.get_region(li.perimeters.region())->fill_expolygons_composite_bboxes() : + layer.get_region(li.fill_region_id)->fill_expolygons_bboxes(); + const ExPolygons &expolygons = li.fill_expolygons_composite() ? + layer.get_region(li.perimeters.region())->fill_expolygons_composite() : + layer.get_region(li.fill_region_id)->fill_expolygons(); + for (uint32_t fill_expolygon_id : li.fill_expolygons) + if (bboxes[fill_expolygon_id].contains(point) && expolygons[fill_expolygon_id].contains(point)) { + island = &li; + goto found; + } + } + // 2) Find closest fill_expolygon, branch and bound by distance to bounding box. + { + struct Island { + uint32_t island_idx; + uint32_t expolygon_idx; + double distance2; + }; + std::vector islands_sorted; + for (uint32_t island_idx = 0; island_idx < uint32_t(lslice.islands.size()); ++ island_idx) { + const LayerIsland &li = lslice.islands[island_idx]; + const BoundingBoxes &bboxes = li.fill_expolygons_composite() ? + layer.get_region(li.perimeters.region())->fill_expolygons_composite_bboxes() : + layer.get_region(li.fill_region_id)->fill_expolygons_bboxes(); + for (uint32_t fill_expolygon_id : li.fill_expolygons) + islands_sorted.push_back({ island_idx, fill_expolygon_id, bbox_point_distance_squared(bboxes[fill_expolygon_id], point) }); + } + std::sort(islands_sorted.begin(), islands_sorted.end(), [](auto &l, auto &r){ return l.distance2 < r.distance2; }); + auto dist_min2 = std::numeric_limits::max(); + for (uint32_t sorted_bbox_idx = 0; sorted_bbox_idx < uint32_t(islands_sorted.size()); ++ sorted_bbox_idx) { + const Island &isl = islands_sorted[sorted_bbox_idx]; + if (isl.distance2 > dist_min2) + // Branch & bound condition. + break; + LayerIsland &li = lslice.islands[isl.island_idx]; + const ExPolygons &expolygons = li.fill_expolygons_composite() ? + layer.get_region(li.perimeters.region())->fill_expolygons_composite() : + layer.get_region(li.fill_region_id)->fill_expolygons(); + double d2 = (expolygons[isl.expolygon_idx].point_projection(point) - point).cast().squaredNorm(); + if (d2 < dist_min2) { + dist_min2 = d2; + island = &li; + } + } + } + found:; + } + assert(island); + if (island) + island->add_fill_range(LayerExtrusionRange{ fill_region_id, { fill_begin, fill_end }}); + } + } +} +void Layer::clear_fills() +{ + for (LayerRegion *layerm : m_regions) + layerm->m_fills.clear(); + for (LayerSlice &lslice : lslices_ex) + for (LayerIsland &island : lslice.islands) + island.fills.clear(); +} + +void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive::Octree* support_fill_octree, FillLightning::Generator* lightning_generator) +{ + this->clear_fills(); #ifdef SLIC3R_DEBUG_SLICE_PROCESSING // this->export_region_fill_surfaces_to_svg_debug("10_fill-initial"); @@ -348,23 +485,31 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: } #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ + size_t first_object_layer_id = this->object()->get_layer(0)->id(); for (SurfaceFill &surface_fill : surface_fills) { // Create the filler object. std::unique_ptr f = std::unique_ptr(Fill::new_from_type(surface_fill.params.pattern)); f->set_bounding_box(bbox); - f->layer_id = this->id(); + // Layer ID is used for orienting the infill in alternating directions. + // Layer::id() returns layer ID including raft layers, subtract them to make the infill direction independent + // from raft. + f->layer_id = this->id() - first_object_layer_id; f->z = this->print_z; f->angle = surface_fill.params.angle; - f->adapt_fill_octree = (surface_fill.params.pattern == ipSupportCubic) ? support_fill_octree : adaptive_fill_octree; - - if (surface_fill.params.pattern == ipLightning) - dynamic_cast(f.get())->generator = lightning_generator; + f->adapt_fill_octree = (surface_fill.params.pattern == ipSupportCubic) ? support_fill_octree : adaptive_fill_octree; + f->print_config = &this->object()->print()->config(); + f->print_object_config = &this->object()->config(); + + if (surface_fill.params.pattern == ipLightning) { + auto *lf = dynamic_cast(f.get()); + lf->generator = lightning_generator; + lf->num_raft_layers = this->object()->slicing_parameters().raft_layers(); + } - if (perimeter_generator.value == PerimeterGeneratorType::Arachne && surface_fill.params.pattern == ipConcentric) { - FillConcentric *fill_concentric = dynamic_cast(f.get()); - assert(fill_concentric != nullptr); - fill_concentric->print_config = &this->object()->print()->config(); - fill_concentric->print_object_config = &this->object()->config(); + if (surface_fill.params.pattern == ipEnsuring) { + auto *fill_ensuring = dynamic_cast(f.get()); + assert(fill_ensuring != nullptr); + fill_ensuring->print_region_config = &m_regions[surface_fill.region_id]->region().config(); } // calculate flow spacing for infill pattern generation @@ -385,6 +530,8 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: // Used by the concentric infill pattern to clip the loops to create extrusion paths. f->loop_clipping = coord_t(scale_(surface_fill.params.flow.nozzle_diameter()) * LOOP_CLIPPING_LENGTH_OVER_NOZZLE_DIAMETER); + LayerRegion &layerm = *m_regions[surface_fill.region_id]; + // apply half spacing using this flow's own spacing and generate infill FillParams params; params.density = float(0.01 * surface_fill.params.density); @@ -392,8 +539,8 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: params.anchor_length = surface_fill.params.anchor_length; params.anchor_length_max = surface_fill.params.anchor_length_max; params.resolution = resolution; - params.use_arachne = perimeter_generator == PerimeterGeneratorType::Arachne && surface_fill.params.pattern == ipConcentric; - params.layer_height = m_regions[surface_fill.region_id]->layer()->height; + params.use_arachne = (perimeter_generator == PerimeterGeneratorType::Arachne && surface_fill.params.pattern == ipConcentric) || surface_fill.params.pattern == ipEnsuring; + params.layer_height = layerm.layer()->height; for (ExPolygon &expoly : surface_fill.expolygons) { // Spacing is modified by the filler to indicate adjustments. Reset it for each expolygon. @@ -424,14 +571,15 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: } // Save into layer. ExtrusionEntityCollection* eec = nullptr; - m_regions[surface_fill.region_id]->fills.entities.push_back(eec = new ExtrusionEntityCollection()); + auto fill_begin = uint32_t(layerm.fills().size()); + layerm.m_fills.entities.push_back(eec = new ExtrusionEntityCollection()); // Only concentric fills are not sorted. eec->no_sort = f->no_sort(); if (params.use_arachne) { for (const ThickPolyline &thick_polyline : thick_polylines) { Flow new_flow = surface_fill.params.flow.with_spacing(float(f->spacing)); - ExtrusionMultiPath multi_path = thick_polyline_to_multi_path(thick_polyline, surface_fill.params.extrusion_role, new_flow, scaled(0.05), float(SCALED_EPSILON)); + ExtrusionMultiPath multi_path = PerimeterGenerator::thick_polyline_to_multi_path(thick_polyline, surface_fill.params.extrusion_role, new_flow, scaled(0.05), float(SCALED_EPSILON)); // Append paths to collection. if (!multi_path.empty()) { if (multi_path.paths.front().first_point() == multi_path.paths.back().last_point()) @@ -448,28 +596,147 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: surface_fill.params.extrusion_role, flow_mm3_per_mm, float(flow_width), surface_fill.params.flow.height()); } + insert_fills_into_islands(*this, uint32_t(surface_fill.region_id), fill_begin, uint32_t(layerm.fills().size())); } } } - // add thin fill regions - // Unpacks the collection, creates multiple collections per path. - // The path type could be ExtrusionPath, ExtrusionLoop or ExtrusionEntityCollection. - // Why the paths are unpacked? - for (LayerRegion *layerm : m_regions) - for (const ExtrusionEntity *thin_fill : layerm->thin_fills.entities) { - ExtrusionEntityCollection &collection = *(new ExtrusionEntityCollection()); - layerm->fills.entities.push_back(&collection); - collection.entities.push_back(thin_fill->clone()); - } + for (LayerSlice &lslice : this->lslices_ex) + for (LayerIsland &island : lslice.islands) { + if (! island.thin_fills.empty()) { + // Copy thin fills into fills packed as a collection. + // Fills are always stored as collections, the rest of the pipeline (wipe into infill, G-code generator) relies on it. + LayerRegion &layerm = *this->get_region(island.perimeters.region()); + ExtrusionEntityCollection &collection = *(new ExtrusionEntityCollection()); + layerm.m_fills.entities.push_back(&collection); + collection.entities.reserve(island.thin_fills.size()); + for (uint32_t fill_id : island.thin_fills) + collection.entities.push_back(layerm.thin_fills().entities[fill_id]->clone()); + island.add_fill_range({ island.perimeters.region(), { uint32_t(layerm.m_fills.entities.size() - 1), uint32_t(layerm.m_fills.entities.size()) } }); + } + // Sort the fills by region ID. + std::sort(island.fills.begin(), island.fills.end(), [](auto &l, auto &r){ return l.region() < r.region() || (l.region() == r.region() && *l.begin() < *r.begin()); }); + // Compress continuous fill ranges of the same region. + { + size_t k = 0; + for (size_t i = 0; i < island.fills.size();) { + uint32_t region_id = island.fills[i].region(); + uint32_t begin = *island.fills[i].begin(); + uint32_t end = *island.fills[i].end(); + size_t j = i + 1; + for (; j < island.fills.size() && island.fills[j].region() == region_id && *island.fills[j].begin() == end; ++ j) + end = *island.fills[j].end(); + island.fills[k ++] = { region_id, { begin, end } }; + i = j; + } + island.fills.erase(island.fills.begin() + k, island.fills.end()); + } + } #ifndef NDEBUG for (LayerRegion *layerm : m_regions) - for (size_t i = 0; i < layerm->fills.entities.size(); ++ i) - assert(dynamic_cast(layerm->fills.entities[i]) != nullptr); + for (const ExtrusionEntity *e : layerm->fills()) + assert(dynamic_cast(e) != nullptr); #endif } +Polylines Layer::generate_sparse_infill_polylines_for_anchoring(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive::Octree* support_fill_octree, FillLightning::Generator* lightning_generator) const +{ + std::vector surface_fills = group_fills(*this); + const Slic3r::BoundingBox bbox = this->object()->bounding_box(); + const auto resolution = this->object()->print()->config().gcode_resolution.value; + + Polylines sparse_infill_polylines{}; + + for (SurfaceFill &surface_fill : surface_fills) { + if (surface_fill.surface.surface_type != stInternal) { + continue; + } + + switch (surface_fill.params.pattern) { + case ipCount: continue; break; + case ipSupportBase: continue; break; + case ipEnsuring: continue; break; + case ipLightning: + case ipAdaptiveCubic: + case ipSupportCubic: + case ipRectilinear: + case ipMonotonic: + case ipMonotonicLines: + case ipAlignedRectilinear: + case ipGrid: + case ipTriangles: + case ipStars: + case ipCubic: + case ipLine: + case ipConcentric: + case ipHoneycomb: + case ip3DHoneycomb: + case ipGyroid: + case ipHilbertCurve: + case ipArchimedeanChords: + case ipOctagramSpiral: break; + } + + // Create the filler object. + std::unique_ptr f = std::unique_ptr(Fill::new_from_type(surface_fill.params.pattern)); + f->set_bounding_box(bbox); + f->layer_id = this->id(); + f->z = this->print_z; + f->angle = surface_fill.params.angle; + f->adapt_fill_octree = (surface_fill.params.pattern == ipSupportCubic) ? support_fill_octree : adaptive_fill_octree; + f->print_config = &this->object()->print()->config(); + f->print_object_config = &this->object()->config(); + + if (surface_fill.params.pattern == ipLightning) { + auto *lf = dynamic_cast(f.get()); + lf->generator = lightning_generator; + lf->num_raft_layers = this->object()->slicing_parameters().raft_layers(); + } + + // calculate flow spacing for infill pattern generation + double link_max_length = 0.; + if (!surface_fill.params.bridge) { +#if 0 + link_max_length = layerm.region()->config().get_abs_value(surface.is_external() ? "external_fill_link_max_length" : "fill_link_max_length", flow.spacing()); +// printf("flow spacing: %f, is_external: %d, link_max_length: %lf\n", flow.spacing(), int(surface.is_external()), link_max_length); +#else + if (surface_fill.params.density > 80.) // 80% + link_max_length = 3. * f->spacing; +#endif + } + + // Maximum length of the perimeter segment linking two infill lines. + f->link_max_length = (coord_t) scale_(link_max_length); + // Used by the concentric infill pattern to clip the loops to create extrusion paths. + f->loop_clipping = coord_t(scale_(surface_fill.params.flow.nozzle_diameter()) * LOOP_CLIPPING_LENGTH_OVER_NOZZLE_DIAMETER); + + LayerRegion &layerm = *m_regions[surface_fill.region_id]; + + // apply half spacing using this flow's own spacing and generate infill + FillParams params; + params.density = float(0.01 * surface_fill.params.density); + params.dont_adjust = false; // surface_fill.params.dont_adjust; + params.anchor_length = surface_fill.params.anchor_length; + params.anchor_length_max = surface_fill.params.anchor_length_max; + params.resolution = resolution; + params.use_arachne = false; + params.layer_height = layerm.layer()->height; + + for (ExPolygon &expoly : surface_fill.expolygons) { + // Spacing is modified by the filler to indicate adjustments. Reset it for each expolygon. + f->spacing = surface_fill.params.spacing; + surface_fill.surface.expolygon = std::move(expoly); + try { + Polylines polylines = f->fill_surface(&surface_fill.surface, params); + sparse_infill_polylines.insert(sparse_infill_polylines.end(), polylines.begin(), polylines.end()); + } catch (InfillFailedException &) {} + } + } + + return sparse_infill_polylines; +} + // Create ironing extrusions over top surfaces. void Layer::make_ironing() { @@ -522,7 +789,8 @@ void Layer::make_ironing() this->angle == rhs.angle; } - LayerRegion *layerm = nullptr; + LayerRegion *layerm; + uint32_t region_id; // IdeaMaker: ironing // ironing flowrate (5% percent) @@ -542,8 +810,8 @@ void Layer::make_ironing() std::vector by_extruder; double default_layer_height = this->object()->config().layer_height; - for (LayerRegion *layerm : m_regions) - if (! layerm->slices.empty()) { + for (uint32_t region_id = 0; region_id < uint32_t(this->regions().size()); ++region_id) + if (LayerRegion *layerm = this->get_region(region_id); ! layerm->slices().empty()) { IroningParams ironing_params; const PrintRegionConfig &config = layerm->region().config(); if (config.ironing && @@ -567,6 +835,7 @@ void Layer::make_ironing() ironing_params.speed = config.ironing_speed; ironing_params.angle = config.fill_angle * M_PI / 180.; ironing_params.layerm = layerm; + ironing_params.region_id = region_id; by_extruder.emplace_back(ironing_params); } } @@ -575,7 +844,11 @@ void Layer::make_ironing() FillRectilinear fill; FillParams fill_params; fill.set_bounding_box(this->object()->bounding_box()); - fill.layer_id = this->id(); + // Layer ID is used for orienting the infill in alternating directions. + // Layer::id() returns layer ID including raft layers, subtract them to make the infill direction independent + // from raft. + //FIXME ironing does not take fill angle into account. Shall it? Does it matter? + fill.layer_id = this->id() - this->object()->get_layer(0)->id(); fill.z = this->print_z; fill.overlap = 0; fill_params.density = 1.; @@ -606,7 +879,7 @@ void Layer::make_ironing() if (iron_everything) { // Check whether there is any non-solid hole in the regions. bool internal_infill_solid = region_config.fill_density.value > 95.; - for (const Surface &surface : ironing_params.layerm->fill_surfaces.surfaces) + for (const Surface &surface : ironing_params.layerm->fill_surfaces()) if ((! internal_infill_solid && surface.surface_type == stInternal) || surface.surface_type == stInternalBridge || surface.surface_type == stInternalVoid) { // Some fill region is not quite solid. Don't iron over the whole surface. iron_completely = false; @@ -615,10 +888,10 @@ void Layer::make_ironing() } if (iron_completely) { // Iron everything. This is likely only good for solid transparent objects. - for (const Surface &surface : ironing_params.layerm->slices.surfaces) + for (const Surface &surface : ironing_params.layerm->slices()) polygons_append(polys, surface.expolygon); } else { - for (const Surface &surface : ironing_params.layerm->slices.surfaces) + for (const Surface &surface : ironing_params.layerm->slices()) if (surface.surface_type == stTop || (iron_everything && surface.surface_type == stBottom)) // stBottomBridge is not being ironed on purpose, as it would likely destroy the bridges. polygons_append(polys, surface.expolygon); @@ -626,7 +899,7 @@ void Layer::make_ironing() if (iron_everything && ! iron_completely) { // Add solid fill surfaces. This may not be ideal, as one will not iron perimeters touching these // solid fill surfaces, but it is likely better than nothing. - for (const Surface &surface : ironing_params.layerm->fill_surfaces.surfaces) + for (const Surface &surface : ironing_params.layerm->fill_surfaces()) if (surface.surface_type == stInternalSolid) polygons_append(infills, surface.expolygon); } @@ -662,14 +935,16 @@ void Layer::make_ironing() } if (! polylines.empty()) { // Save into layer. + auto fill_begin = uint32_t(ironing_params.layerm->fills().size()); ExtrusionEntityCollection *eec = nullptr; - ironing_params.layerm->fills.entities.push_back(eec = new ExtrusionEntityCollection()); + ironing_params.layerm->m_fills.entities.push_back(eec = new ExtrusionEntityCollection()); // Don't sort the ironing infill lines as they are monotonicly ordered. eec->no_sort = true; extrusion_entities_append_paths( eec->entities, std::move(polylines), - erIroning, + ExtrusionRole::Ironing, flow_mm3_per_mm, extrusion_width, float(extrusion_height)); + insert_fills_into_islands(*this, ironing_params.region_id, fill_begin, uint32_t(ironing_params.layerm->fills().size())); } } diff --git a/src/libslic3r/Fill/FillAdaptive.cpp b/src/libslic3r/Fill/FillAdaptive.cpp index 29b343db01c..f935d0edfc2 100644 --- a/src/libslic3r/Fill/FillAdaptive.cpp +++ b/src/libslic3r/Fill/FillAdaptive.cpp @@ -316,9 +316,9 @@ std::pair adaptive_fill_line_spacing(const PrintObject &print_ob for (const Layer *layer : print_object.layers()) for (size_t region_id = 0; region_id < layer->regions().size(); ++ region_id) { RegionFillData &rd = region_fill_data[region_id]; - if (rd.has_adaptive_infill == Tristate::Maybe && ! layer->regions()[region_id]->fill_surfaces.empty()) + if (rd.has_adaptive_infill == Tristate::Maybe && ! layer->regions()[region_id]->fill_surfaces().empty()) rd.has_adaptive_infill = Tristate::Yes; - if (rd.has_support_infill == Tristate::Maybe && ! layer->regions()[region_id]->fill_surfaces.empty()) + if (rd.has_support_infill == Tristate::Maybe && ! layer->regions()[region_id]->fill_surfaces().empty()) rd.has_support_infill = Tristate::Yes; } diff --git a/src/libslic3r/Fill/FillBase.cpp b/src/libslic3r/Fill/FillBase.cpp index 2d258c213b6..f55420c312e 100644 --- a/src/libslic3r/Fill/FillBase.cpp +++ b/src/libslic3r/Fill/FillBase.cpp @@ -20,6 +20,9 @@ #include "FillRectilinear.hpp" #include "FillAdaptive.hpp" #include "FillLightning.hpp" +#include "FillEnsuring.hpp" + +#include // #define INFILL_DEBUG_OUTPUT @@ -48,6 +51,7 @@ Fill* Fill::new_from_type(const InfillPattern type) case ipSupportCubic: return new FillAdaptive::Filler(); case ipSupportBase: return new FillSupportBase(); case ipLightning: return new FillLightning::Filler(); + case ipEnsuring: return new FillEnsuring(); default: throw Slic3r::InvalidArgument("unknown type"); } } @@ -130,8 +134,8 @@ std::pair Fill::_infill_direction(const Surface *surface) const float out_angle = this->angle; if (out_angle == FLT_MAX) { - //FIXME Vojtech: Add a warning? - printf("Using undefined infill angle\n"); + assert(false); + BOOST_LOG_TRIVIAL(error) << "Using undefined infill angle"; out_angle = 0.f; } diff --git a/src/libslic3r/Fill/FillBase.hpp b/src/libslic3r/Fill/FillBase.hpp index 88f437b9d2c..cf376675879 100644 --- a/src/libslic3r/Fill/FillBase.hpp +++ b/src/libslic3r/Fill/FillBase.hpp @@ -91,6 +91,10 @@ class Fill // Octree builds on mesh for usage in the adaptive cubic infill FillAdaptive::Octree* adapt_fill_octree = nullptr; + // PrintConfig and PrintObjectConfig are used by infills that use Arachne (Concentric and FillEnsuring). + const PrintConfig *print_config = nullptr; + const PrintObjectConfig *print_object_config = nullptr; + public: virtual ~Fill() {} virtual Fill* clone() const = 0; @@ -132,7 +136,7 @@ class Fill unsigned int /* thickness_layers */, const std::pair & /* direction */, ExPolygon /* expolygon */, - Polylines & /* polylines_out */) {}; + Polylines & /* polylines_out */) {} // Used for concentric infill to generate ThickPolylines using Arachne. virtual void _fill_surface_single(const FillParams ¶ms, diff --git a/src/libslic3r/Fill/FillConcentric.cpp b/src/libslic3r/Fill/FillConcentric.cpp index 69f530720fa..245947cfe08 100644 --- a/src/libslic3r/Fill/FillConcentric.cpp +++ b/src/libslic3r/Fill/FillConcentric.cpp @@ -40,7 +40,7 @@ void FillConcentric::_fill_surface_single( size_t iPathFirst = polylines_out.size(); Point last_pos(0, 0); for (const Polygon &loop : loops) { - polylines_out.emplace_back(loop.split_at_index(last_pos.nearest_point_index(loop.points))); + polylines_out.emplace_back(loop.split_at_index(nearest_point_index(loop.points, last_pos))); last_pos = polylines_out.back().last_point(); } @@ -97,14 +97,8 @@ void FillConcentric::_fill_surface_single(const FillParams ¶ms, continue; ThickPolyline thick_polyline = Arachne::to_thick_polyline(*extrusion); - if (extrusion->is_closed && thick_polyline.points.front() == thick_polyline.points.back() && thick_polyline.width.front() == thick_polyline.width.back()) { - thick_polyline.points.pop_back(); - assert(thick_polyline.points.size() * 2 == thick_polyline.width.size()); - int nearest_idx = last_pos.nearest_point_index(thick_polyline.points); - std::rotate(thick_polyline.points.begin(), thick_polyline.points.begin() + nearest_idx, thick_polyline.points.end()); - std::rotate(thick_polyline.width.begin(), thick_polyline.width.begin() + 2 * nearest_idx, thick_polyline.width.end()); - thick_polyline.points.emplace_back(thick_polyline.points.front()); - } + if (extrusion->is_closed) + thick_polyline.start_at_index(nearest_point_index(thick_polyline.points, last_pos)); thick_polylines_out.emplace_back(std::move(thick_polyline)); last_pos = thick_polylines_out.back().last_point(); } diff --git a/src/libslic3r/Fill/FillConcentric.hpp b/src/libslic3r/Fill/FillConcentric.hpp index 405b7238bfd..c059cc05009 100644 --- a/src/libslic3r/Fill/FillConcentric.hpp +++ b/src/libslic3r/Fill/FillConcentric.hpp @@ -26,11 +26,6 @@ class FillConcentric : public Fill ThickPolylines &thick_polylines_out) override; bool no_sort() const override { return true; } - - const PrintConfig *print_config = nullptr; - const PrintObjectConfig *print_object_config = nullptr; - - friend class Layer; }; } // namespace Slic3r diff --git a/src/libslic3r/Fill/FillEnsuring.cpp b/src/libslic3r/Fill/FillEnsuring.cpp new file mode 100644 index 00000000000..2522aee9386 --- /dev/null +++ b/src/libslic3r/Fill/FillEnsuring.cpp @@ -0,0 +1,82 @@ +#include "../ClipperUtils.hpp" +#include "../ShortestPath.hpp" +#include "../Arachne/WallToolPaths.hpp" + +#include "FillEnsuring.hpp" + +#include + +namespace Slic3r { + +ThickPolylines FillEnsuring::fill_surface_arachne(const Surface *surface, const FillParams ¶ms) +{ + assert(params.use_arachne); + assert(this->print_config != nullptr && this->print_object_config != nullptr && this->print_region_config != nullptr); + + const coord_t scaled_spacing = scaled(this->spacing); + + // Perform offset. + Slic3r::ExPolygons expp = this->overlap != 0. ? offset_ex(surface->expolygon, scaled(this->overlap)) : ExPolygons{surface->expolygon}; + // Create the infills for each of the regions. + ThickPolylines thick_polylines_out; + for (ExPolygon &ex_poly : expp) { + Point bbox_size = ex_poly.contour.bounding_box().size(); + coord_t loops_count = std::max(bbox_size.x(), bbox_size.y()) / scaled_spacing + 1; + Polygons polygons = to_polygons(ex_poly); + Arachne::WallToolPaths wall_tool_paths(polygons, scaled_spacing, scaled_spacing, loops_count, 0, params.layer_height, *this->print_object_config, *this->print_config); + if (std::vector loops = wall_tool_paths.getToolPaths(); !loops.empty()) { + std::vector all_extrusions; + for (Arachne::VariableWidthLines &loop : loops) { + if (loop.empty()) + continue; + for (const Arachne::ExtrusionLine &wall : loop) + all_extrusions.emplace_back(&wall); + } + + // Split paths using a nearest neighbor search. + size_t firts_poly_idx = thick_polylines_out.size(); + Point last_pos(0, 0); + for (const Arachne::ExtrusionLine *extrusion : all_extrusions) { + if (extrusion->empty()) + continue; + + ThickPolyline thick_polyline = Arachne::to_thick_polyline(*extrusion); + if (thick_polyline.length() == 0.) + //FIXME this should not happen. + continue; + assert(thick_polyline.size() > 1); + assert(thick_polyline.length() > 0.); + //assert(thick_polyline.points.size() == thick_polyline.width.size()); + if (extrusion->is_closed) + thick_polyline.start_at_index(nearest_point_index(thick_polyline.points, last_pos)); + + assert(thick_polyline.size() > 1); + //assert(thick_polyline.points.size() == thick_polyline.width.size()); + thick_polylines_out.emplace_back(std::move(thick_polyline)); + last_pos = thick_polylines_out.back().last_point(); + } + + // clip the paths to prevent the extruder from getting exactly on the first point of the loop + // Keep valid paths only. + size_t j = firts_poly_idx; + for (size_t i = firts_poly_idx; i < thick_polylines_out.size(); ++i) { + assert(thick_polylines_out[i].size() > 1); + assert(thick_polylines_out[i].length() > 0.); + //assert(thick_polylines_out[i].points.size() == thick_polylines_out[i].width.size()); + thick_polylines_out[i].clip_end(this->loop_clipping); + assert(thick_polylines_out[i].size() > 1); + if (thick_polylines_out[i].is_valid()) { + if (j < i) + thick_polylines_out[j] = std::move(thick_polylines_out[i]); + ++j; + } + } + if (j < thick_polylines_out.size()) + thick_polylines_out.erase(thick_polylines_out.begin() + int(j), thick_polylines_out.end()); + } + } + + return thick_polylines_out; +} + +} // namespace Slic3r diff --git a/src/libslic3r/Fill/FillEnsuring.hpp b/src/libslic3r/Fill/FillEnsuring.hpp new file mode 100644 index 00000000000..faa08015356 --- /dev/null +++ b/src/libslic3r/Fill/FillEnsuring.hpp @@ -0,0 +1,30 @@ +#ifndef slic3r_FillEnsuring_hpp_ +#define slic3r_FillEnsuring_hpp_ + +#include "FillBase.hpp" +#include "FillRectilinear.hpp" + +namespace Slic3r { + +class FillEnsuring : public FillRectilinear +{ +public: + Fill *clone() const override { return new FillEnsuring(*this); } + ~FillEnsuring() override = default; + Polylines fill_surface(const Surface *surface, const FillParams ¶ms) override { return {}; }; + ThickPolylines fill_surface_arachne(const Surface *surface, const FillParams ¶ms) override; + +protected: + void fill_surface_single_arachne(const Surface &surface, const FillParams ¶ms, ThickPolylines &thick_polylines_out); + + bool no_sort() const override { return true; } + + // PrintRegionConfig is used for computing overlap between boundary contour and inner Rectilinear infill. + const PrintRegionConfig *print_region_config = nullptr; + + friend class Layer; +}; + +} // namespace Slic3r + +#endif // slic3r_FillEnsuring_hpp_ diff --git a/src/libslic3r/Fill/FillLightning.cpp b/src/libslic3r/Fill/FillLightning.cpp index 36a48e5547d..8c3ac8f1ac9 100644 --- a/src/libslic3r/Fill/FillLightning.cpp +++ b/src/libslic3r/Fill/FillLightning.cpp @@ -13,7 +13,7 @@ void Filler::_fill_surface_single( ExPolygon expolygon, Polylines &polylines_out) { - const Layer &layer = generator->getTreesForLayer(this->layer_id); + const Layer &layer = generator->getTreesForLayer(this->layer_id - this->num_raft_layers); Polylines fill_lines = layer.convertToLines(to_polygons(expolygon), scaled(0.5 * this->spacing - this->overlap)); if (params.dont_connect() || fill_lines.size() <= 1) { diff --git a/src/libslic3r/Fill/FillLightning.hpp b/src/libslic3r/Fill/FillLightning.hpp index 341399508f4..0705dc657f2 100644 --- a/src/libslic3r/Fill/FillLightning.hpp +++ b/src/libslic3r/Fill/FillLightning.hpp @@ -22,6 +22,7 @@ class Filler : public Slic3r::Fill ~Filler() override = default; Generator *generator { nullptr }; + size_t num_raft_layers { 0 }; protected: Fill* clone() const override { return new Filler(*this); } diff --git a/src/libslic3r/Fill/FillPlanePath.cpp b/src/libslic3r/Fill/FillPlanePath.cpp index 49b02b54289..183d4bf969b 100644 --- a/src/libslic3r/Fill/FillPlanePath.cpp +++ b/src/libslic3r/Fill/FillPlanePath.cpp @@ -6,6 +6,66 @@ namespace Slic3r { +class InfillPolylineClipper : public FillPlanePath::InfillPolylineOutput { +public: + InfillPolylineClipper(const BoundingBox bbox, const double scale_out) : FillPlanePath::InfillPolylineOutput(scale_out), m_bbox(bbox) {} + + void add_point(const Vec2d &pt); + Points&& result() { return std::move(m_out); } + bool clips() const override { return true; } + +private: + enum class Side { + Left = 1, + Right = 2, + Top = 4, + Bottom = 8 + }; + + int sides(const Point &p) const { + return int(p.x() < m_bbox.min.x()) * int(Side::Left) + + int(p.x() > m_bbox.max.x()) * int(Side::Right) + + int(p.y() < m_bbox.min.y()) * int(Side::Bottom) + + int(p.y() > m_bbox.max.y()) * int(Side::Top); + }; + + // Bounding box to clip the polyline with. + BoundingBox m_bbox; + + // Classification of the two last points processed. + int m_sides_prev; + int m_sides_this; +}; + +void InfillPolylineClipper::add_point(const Vec2d &fpt) +{ + const Point pt{ this->scaled(fpt) }; + + if (m_out.size() < 2) { + // Collect the two first points and their status. + (m_out.empty() ? m_sides_prev : m_sides_this) = sides(pt); + m_out.emplace_back(pt); + } else { + // Classify the last inserted point, possibly remove it. + int sides_next = sides(pt); + if (// This point is inside. Take it. + m_sides_this == 0 || + // Either this point is outside and previous or next is inside, or + // the edge possibly cuts corner of the bounding box. + (m_sides_prev & m_sides_this & sides_next) == 0) { + // Keep the last point. + m_sides_prev = m_sides_this; + } else { + // All the three points (this, prev, next) are outside at the same side. + // Ignore the last point. + m_out.pop_back(); + } + // And save the current point. + m_out.emplace_back(pt); + m_sides_this = sides_next; + } +} + void FillPlanePath::_fill_surface_single( const FillParams ¶ms, unsigned int thickness_layers, @@ -13,37 +73,52 @@ void FillPlanePath::_fill_surface_single( ExPolygon expolygon, Polylines &polylines_out) { - expolygon.rotate(- direction.first); - - coord_t distance_between_lines = coord_t(scale_(this->spacing) / params.density); - - // align infill across layers using the object's bounding box - // Rotated bounding box of the whole object. - BoundingBox bounding_box = this->bounding_box.rotated(- direction.first); - - Point shift = this->_centered() ? + expolygon.rotate(-direction.first); + + //FIXME Vojtech: We are not sure whether the user expects the fill patterns on visible surfaces to be aligned across all the islands of a single layer. + // One may align for this->centered() to align the patterns for Archimedean Chords and Octagram Spiral patterns. + const bool align = params.density < 0.995; + + BoundingBox snug_bounding_box = get_extents(expolygon).inflated(SCALED_EPSILON); + + // Rotated bounding box of the area to fill in with the pattern. + BoundingBox bounding_box = align ? + // Sparse infill needs to be aligned across layers. Align infill across layers using the object's bounding box. + this->bounding_box.rotated(-direction.first) : + // Solid infill does not need to be aligned across layers, generate the infill pattern + // around the clipping expolygon only. + snug_bounding_box; + + Point shift = this->centered() ? bounding_box.center() : bounding_box.min; expolygon.translate(-shift.x(), -shift.y()); bounding_box.translate(-shift.x(), -shift.y()); - Pointfs pts = _generate( - coord_t(ceil(coordf_t(bounding_box.min.x()) / distance_between_lines)), - coord_t(ceil(coordf_t(bounding_box.min.y()) / distance_between_lines)), - coord_t(ceil(coordf_t(bounding_box.max.x()) / distance_between_lines)), - coord_t(ceil(coordf_t(bounding_box.max.y()) / distance_between_lines)), - params.resolution); - - if (pts.size() >= 2) { - // Convert points to a polyline, upscale. - Polylines polylines(1, Polyline()); - Polyline &polyline = polylines.front(); - polyline.points.reserve(pts.size()); - for (const Vec2d &pt : pts) - polyline.points.emplace_back( - coord_t(floor(pt.x() * distance_between_lines + 0.5)), - coord_t(floor(pt.y() * distance_between_lines + 0.5))); - polylines = intersection_pl(polylines, expolygon); + Polyline polyline; + { + auto distance_between_lines = scaled(this->spacing) / params.density; + auto min_x = coord_t(ceil(coordf_t(bounding_box.min.x()) / distance_between_lines)); + auto min_y = coord_t(ceil(coordf_t(bounding_box.min.y()) / distance_between_lines)); + auto max_x = coord_t(ceil(coordf_t(bounding_box.max.x()) / distance_between_lines)); + auto max_y = coord_t(ceil(coordf_t(bounding_box.max.y()) / distance_between_lines)); + auto resolution = scaled(params.resolution) / distance_between_lines; + if (align) { + // Filling in a bounding box over the whole object, clip generated polyline against the snug bounding box. + snug_bounding_box.translate(-shift.x(), -shift.y()); + InfillPolylineClipper output(snug_bounding_box, distance_between_lines); + this->generate(min_x, min_y, max_x, max_y, resolution, output); + polyline.points = std::move(output.result()); + } else { + // Filling in a snug bounding box, no need to clip. + InfillPolylineOutput output(distance_between_lines); + this->generate(min_x, min_y, max_x, max_y, resolution, output); + polyline.points = std::move(output.result()); + } + } + + if (polyline.size() >= 2) { + Polylines polylines = intersection_pl(polyline, expolygon); Polylines chained; if (params.dont_connect() || params.density > 0.5 || polylines.size() <= 1) chained = chain_polylines(std::move(polylines)); @@ -59,7 +134,8 @@ void FillPlanePath::_fill_surface_single( } // Follow an Archimedean spiral, in polar coordinates: r=a+b\theta -Pointfs FillArchimedeanChords::_generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, const double resolution) +template +static void generate_archimedean_chords(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, const double resolution, Output &output) { // Radius to achieve. coordf_t rmax = std::sqrt(coordf_t(max_x)*coordf_t(max_x)+coordf_t(max_y)*coordf_t(max_y)) * std::sqrt(2.) + 1.5; @@ -70,15 +146,22 @@ Pointfs FillArchimedeanChords::_generate(coord_t min_x, coord_t min_y, coord_t m coordf_t r = 1; Pointfs out; //FIXME Vojtech: If used as a solid infill, there is a gap left at the center. - out.emplace_back(0, 0); - out.emplace_back(1, 0); + output.add_point({ 0, 0 }); + output.add_point({ 1, 0 }); while (r < rmax) { // Discretization angle to achieve a discretization error lower than resolution. theta += 2. * acos(1. - resolution / r); r = a + b * theta; - out.emplace_back(r * cos(theta), r * sin(theta)); + output.add_point({ r * cos(theta), r * sin(theta) }); } - return out; +} + +void FillArchimedeanChords::generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, const double resolution, InfillPolylineOutput &output) +{ + if (output.clips()) + generate_archimedean_chords(min_x, min_y, max_x, max_y, resolution, static_cast(output)); + else + generate_archimedean_chords(min_x, min_y, max_x, max_y, resolution, output); } // Adapted from @@ -126,7 +209,8 @@ static inline Point hilbert_n_to_xy(const size_t n) return Point(x, y); } -Pointfs FillHilbertCurve::_generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, const double /* resolution */) +template +static void generate_hilbert_curve(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, Output &output) { // Minimum power of two square to fit the domain. size_t sz = 2; @@ -140,46 +224,59 @@ Pointfs FillHilbertCurve::_generate(coord_t min_x, coord_t min_y, coord_t max_x, } size_t sz2 = sz * sz; - Pointfs line; - line.reserve(sz2); + output.reserve(sz2); for (size_t i = 0; i < sz2; ++ i) { Point p = hilbert_n_to_xy(i); - line.emplace_back(p.x() + min_x, p.y() + min_y); + output.add_point({ p.x() + min_x, p.y() + min_y }); } - return line; } -Pointfs FillOctagramSpiral::_generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, const double /* resolution */) +void FillHilbertCurve::generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, const double /* resolution */, InfillPolylineOutput &output) +{ + if (output.clips()) + generate_hilbert_curve(min_x, min_y, max_x, max_y, static_cast(output)); + else + generate_hilbert_curve(min_x, min_y, max_x, max_y, output); +} + +template +static void generate_octagram_spiral(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, Output &output) { // Radius to achieve. coordf_t rmax = std::sqrt(coordf_t(max_x)*coordf_t(max_x)+coordf_t(max_y)*coordf_t(max_y)) * std::sqrt(2.) + 1.5; // Now unwind the spiral. coordf_t r = 0; coordf_t r_inc = sqrt(2.); - Pointfs out; - out.emplace_back(0., 0.); + output.add_point({ 0., 0. }); while (r < rmax) { r += r_inc; coordf_t rx = r / sqrt(2.); coordf_t r2 = r + rx; - out.emplace_back( r, 0.); - out.emplace_back( r2, rx); - out.emplace_back( rx, rx); - out.emplace_back( rx, r2); - out.emplace_back( 0., r); - out.emplace_back(-rx, r2); - out.emplace_back(-rx, rx); - out.emplace_back(-r2, rx); - out.emplace_back(- r, 0.); - out.emplace_back(-r2, -rx); - out.emplace_back(-rx, -rx); - out.emplace_back(-rx, -r2); - out.emplace_back( 0., -r); - out.emplace_back( rx, -r2); - out.emplace_back( rx, -rx); - out.emplace_back( r2+r_inc, -rx); + output.add_point({ r, 0. }); + output.add_point({ r2, rx }); + output.add_point({ rx, rx }); + output.add_point({ rx, r2 }); + output.add_point({ 0., r }); + output.add_point({-rx, r2 }); + output.add_point({-rx, rx }); + output.add_point({-r2, rx }); + output.add_point({- r, 0. }); + output.add_point({-r2, -rx }); + output.add_point({-rx, -rx }); + output.add_point({-rx, -r2 }); + output.add_point({ 0., -r }); + output.add_point({ rx, -r2 }); + output.add_point({ rx, -rx }); + output.add_point({ r2+r_inc, -rx }); } - return out; +} + +void FillOctagramSpiral::generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, const double /* resolution */, InfillPolylineOutput &output) +{ + if (output.clips()) + generate_octagram_spiral(min_x, min_y, max_x, max_y, static_cast(output)); + else + generate_octagram_spiral(min_x, min_y, max_x, max_y, output); } } // namespace Slic3r diff --git a/src/libslic3r/Fill/FillPlanePath.hpp b/src/libslic3r/Fill/FillPlanePath.hpp index 075f174336b..4c6539f968f 100644 --- a/src/libslic3r/Fill/FillPlanePath.hpp +++ b/src/libslic3r/Fill/FillPlanePath.hpp @@ -27,8 +27,30 @@ class FillPlanePath : public Fill Polylines &polylines_out) override; float _layer_angle(size_t idx) const override { return 0.f; } - virtual bool _centered() const = 0; - virtual Pointfs _generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, const double resolution) = 0; + virtual bool centered() const = 0; + + friend class InfillPolylineClipper; + class InfillPolylineOutput { + public: + InfillPolylineOutput(const double scale_out) : m_scale_out(scale_out) {} + + void reserve(size_t n) { m_out.reserve(n); } + void add_point(const Vec2d& pt) { m_out.emplace_back(this->scaled(pt)); } + Points&& result() { return std::move(m_out); } + virtual bool clips() const { return false; } + + protected: + const Point scaled(const Vec2d &fpt) const { return { coord_t(floor(fpt.x() * m_scale_out + 0.5)), coord_t(floor(fpt.y() * m_scale_out + 0.5)) }; } + + // Output polyline. + Points m_out; + + private: + // Scaling coefficient of the generated points before tested against m_bbox and clipped by bbox. + double m_scale_out; + }; + + virtual void generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, const double resolution, InfillPolylineOutput &output) = 0; }; class FillArchimedeanChords : public FillPlanePath @@ -38,8 +60,8 @@ class FillArchimedeanChords : public FillPlanePath ~FillArchimedeanChords() override = default; protected: - bool _centered() const override { return true; } - Pointfs _generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, const double resolution) override; + bool centered() const override { return true; } + void generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, const double resolution, InfillPolylineOutput &output) override; }; class FillHilbertCurve : public FillPlanePath @@ -49,8 +71,8 @@ class FillHilbertCurve : public FillPlanePath ~FillHilbertCurve() override = default; protected: - bool _centered() const override { return false; } - Pointfs _generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, const double resolution) override; + bool centered() const override { return false; } + void generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, const double resolution, InfillPolylineOutput &output) override; }; class FillOctagramSpiral : public FillPlanePath @@ -60,8 +82,8 @@ class FillOctagramSpiral : public FillPlanePath ~FillOctagramSpiral() override = default; protected: - bool _centered() const override { return true; } - Pointfs _generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, const double resolution) override; + bool centered() const override { return true; } + void generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, const double resolution, InfillPolylineOutput &output) override; }; } // namespace Slic3r diff --git a/src/libslic3r/Fill/FillRectilinear.cpp b/src/libslic3r/Fill/FillRectilinear.cpp index c2cdd8f27b4..e27017b035b 100644 --- a/src/libslic3r/Fill/FillRectilinear.cpp +++ b/src/libslic3r/Fill/FillRectilinear.cpp @@ -414,7 +414,7 @@ struct ExPolygonWithOffset // bool sticks_removed = remove_sticks(polygons_src); // if (sticks_removed) BOOST_LOG_TRIVIAL(error) << "Sticks removed!"; - polygons_outer = aoffset1 == 0 ? polygons_src : offset(polygons_src, float(aoffset1), ClipperLib::jtMiter, miterLimit); + polygons_outer = aoffset1 == 0 ? to_polygons(polygons_src) : offset(polygons_src, float(aoffset1), ClipperLib::jtMiter, miterLimit); if (aoffset2 < 0) polygons_inner = shrink(polygons_outer, float(aoffset1 - aoffset2), ClipperLib::jtMiter, miterLimit); // Filter out contours with zero area or small area, contours with 2 points only. @@ -2393,7 +2393,7 @@ static std::vector chain_monotonic_regions( // Probability (unnormalized) of traversing a link between two monotonic regions. auto path_probability = [ -#ifndef __APPLE__ +#if !defined(__APPLE__) && !defined(__clang__) // clang complains when capturing constexpr constants. pheromone_alpha, pheromone_beta #endif // __APPLE__ diff --git a/src/libslic3r/Fill/FillRectilinear.hpp b/src/libslic3r/Fill/FillRectilinear.hpp index f5228440dc6..aa5c014b3c1 100644 --- a/src/libslic3r/Fill/FillRectilinear.hpp +++ b/src/libslic3r/Fill/FillRectilinear.hpp @@ -7,6 +7,7 @@ namespace Slic3r { +class PrintRegionConfig; class Surface; class FillRectilinear : public Fill diff --git a/src/libslic3r/Fill/Lightning/Generator.cpp b/src/libslic3r/Fill/Lightning/Generator.cpp index bd83bcfffea..185cb60af40 100644 --- a/src/libslic3r/Fill/Lightning/Generator.cpp +++ b/src/libslic3r/Fill/Lightning/Generator.cpp @@ -62,7 +62,7 @@ void Generator::generateInitialInternalOverhangs(const PrintObject &print_object throw_on_cancel_callback(); Polygons infill_area_here; for (const LayerRegion* layerm : print_object.get_layer(layer_nr)->regions()) - for (const Surface& surface : layerm->fill_surfaces.surfaces) + for (const Surface& surface : layerm->fill_surfaces()) if (surface.surface_type == stInternal || surface.surface_type == stInternalVoid) append(infill_area_here, to_polygons(surface.expolygon)); @@ -93,7 +93,7 @@ void Generator::generateTrees(const PrintObject &print_object, const std::functi for (int layer_id = int(print_object.layers().size()) - 1; layer_id >= 0; layer_id--) { throw_on_cancel_callback(); for (const LayerRegion *layerm : print_object.get_layer(layer_id)->regions()) - for (const Surface &surface : layerm->fill_surfaces.surfaces) + for (const Surface &surface : layerm->fill_surfaces()) if (surface.surface_type == stInternal || surface.surface_type == stInternalVoid) append(infill_outlines[layer_id], to_polygons(surface.expolygon)); diff --git a/src/libslic3r/Fill/Lightning/TreeNode.cpp b/src/libslic3r/Fill/Lightning/TreeNode.cpp index 982d47b10ea..801a46df492 100644 --- a/src/libslic3r/Fill/Lightning/TreeNode.cpp +++ b/src/libslic3r/Fill/Lightning/TreeNode.cpp @@ -141,18 +141,6 @@ NodeSPtr Node::closestNode(const Point& loc) return result; } -bool inside(const Polygons &polygons, const Point &p) -{ - int poly_count_inside = 0; - for (const Polygon &poly : polygons) { - const int is_inside_this_poly = ClipperLib::PointInPolygon(p, poly.points); - if (is_inside_this_poly == -1) - return true; - poly_count_inside += is_inside_this_poly; - } - return (poly_count_inside % 2) == 1; -} - bool lineSegmentPolygonsIntersection(const Point& a, const Point& b, const EdgeGrid::Grid& outline_locator, Point& result, const coord_t within_max_dist) { struct Visitor { @@ -192,7 +180,7 @@ bool Node::realign(const Polygons& outlines, const EdgeGrid::Grid& outline_locat if (outlines.empty()) return false; - if (inside(outlines, m_p)) { + if (contains(outlines, m_p)) { // Only keep children that have an unbroken connection to here, realign will put the rest in rerooted parts due to recursion: Point coll; bool reground_me = false; diff --git a/src/libslic3r/Flow.cpp b/src/libslic3r/Flow.cpp index 9f4730261e1..1084e6f102e 100644 --- a/src/libslic3r/Flow.cpp +++ b/src/libslic3r/Flow.cpp @@ -6,9 +6,6 @@ #include -// Mark string for localization and translate. -#define L(s) Slic3r::I18N::translate(s) - namespace Slic3r { FlowErrorNegativeSpacing::FlowErrorNegativeSpacing() : @@ -58,7 +55,7 @@ static inline FlowRole opt_key_to_flow_role(const std::string &opt_key) static inline void throw_on_missing_variable(const std::string &opt_key, const char *dependent_opt_key) { - throw FlowErrorMissingVariable((boost::format(L("Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible.")) % opt_key % dependent_opt_key).str()); + throw FlowErrorMissingVariable((boost::format(_u8L("Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible.")) % opt_key % dependent_opt_key).str()); } // Used to provide hints to the user on default extrusion width values, and to provide reasonable values to the PlaceholderParser. diff --git a/src/libslic3r/Flow.hpp b/src/libslic3r/Flow.hpp index 04ced3e13a4..6d999d1c5ed 100644 --- a/src/libslic3r/Flow.hpp +++ b/src/libslic3r/Flow.hpp @@ -4,7 +4,7 @@ #include "libslic3r.h" #include "Config.hpp" #include "Exception.hpp" -#include "ExtrusionEntity.hpp" +#include "ExtrusionRole.hpp" namespace Slic3r { diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index bf6479ddff8..a0d5e1360dd 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -15,25 +15,28 @@ #include #include +#include +#include + +#include +#include +#include -#include #include -#include #include -#include #include #include #include -#include #include -#include namespace pt = boost::property_tree; #include #include #include "miniz_extension.hpp" +#include "TextConfiguration.hpp" + #include // Slightly faster than sprintf("%.9g"), but there is an issue with the karma floating point formatter, @@ -77,6 +80,7 @@ const std::string LAYER_CONFIG_RANGES_FILE = "Metadata/Prusa_Slicer_layer_config const std::string SLA_SUPPORT_POINTS_FILE = "Metadata/Slic3r_PE_sla_support_points.txt"; const std::string SLA_DRAIN_HOLES_FILE = "Metadata/Slic3r_PE_sla_drain_holes.txt"; const std::string CUSTOM_GCODE_PER_PRINT_Z_FILE = "Metadata/Prusa_Slicer_custom_gcode_per_print_z.xml"; +const std::string CUT_INFORMATION_FILE = "Metadata/Prusa_Slicer_cut_information.xml"; static constexpr const char* MODEL_TAG = "model"; static constexpr const char* RESOURCES_TAG = "resources"; @@ -121,18 +125,19 @@ static constexpr const char* LAST_TRIANGLE_ID_ATTR = "lastid"; static constexpr const char* OBJECT_TYPE = "object"; static constexpr const char* VOLUME_TYPE = "volume"; -static constexpr const char* NAME_KEY = "name"; -static constexpr const char* MODIFIER_KEY = "modifier"; +static constexpr const char* NAME_KEY = "name"; +static constexpr const char* MODIFIER_KEY = "modifier"; static constexpr const char* VOLUME_TYPE_KEY = "volume_type"; -static constexpr const char* MATRIX_KEY = "matrix"; -static constexpr const char* SOURCE_FILE_KEY = "source_file"; -static constexpr const char* SOURCE_OBJECT_ID_KEY = "source_object_id"; -static constexpr const char* SOURCE_VOLUME_ID_KEY = "source_volume_id"; -static constexpr const char* SOURCE_OFFSET_X_KEY = "source_offset_x"; -static constexpr const char* SOURCE_OFFSET_Y_KEY = "source_offset_y"; -static constexpr const char* SOURCE_OFFSET_Z_KEY = "source_offset_z"; -static constexpr const char* SOURCE_IN_INCHES = "source_in_inches"; -static constexpr const char* SOURCE_IN_METERS = "source_in_meters"; +static constexpr const char* MATRIX_KEY = "matrix"; +static constexpr const char* SOURCE_FILE_KEY = "source_file"; +static constexpr const char* SOURCE_OBJECT_ID_KEY = "source_object_id"; +static constexpr const char* SOURCE_VOLUME_ID_KEY = "source_volume_id"; +static constexpr const char* SOURCE_OFFSET_X_KEY = "source_offset_x"; +static constexpr const char* SOURCE_OFFSET_Y_KEY = "source_offset_y"; +static constexpr const char* SOURCE_OFFSET_Z_KEY = "source_offset_z"; +static constexpr const char* SOURCE_IN_INCHES_KEY = "source_in_inches"; +static constexpr const char* SOURCE_IN_METERS_KEY = "source_in_meters"; +static constexpr const char* SOURCE_IS_BUILTIN_VOLUME_KEY = "source_is_builtin_volume"; static constexpr const char* MESH_STAT_EDGES_FIXED = "edges_fixed"; static constexpr const char* MESH_STAT_DEGENERATED_FACETS = "degenerate_facets"; @@ -140,6 +145,30 @@ static constexpr const char* MESH_STAT_FACETS_REMOVED = "facets_removed"; static constexpr const char* MESH_STAT_FACETS_RESERVED = "facets_reversed"; static constexpr const char* MESH_STAT_BACKWARDS_EDGES = "backwards_edges"; +// Store / load of TextConfiguration +static constexpr const char *TEXT_TAG = "slic3rpe:text"; +static constexpr const char *TEXT_DATA_ATTR = "text"; +// TextConfiguration::EmbossStyle +static constexpr const char *STYLE_NAME_ATTR = "style_name"; +static constexpr const char *FONT_DESCRIPTOR_ATTR = "font_descriptor"; +static constexpr const char *FONT_DESCRIPTOR_TYPE_ATTR = "font_descriptor_type"; + +// TextConfiguration::FontProperty +static constexpr const char *CHAR_GAP_ATTR = "char_gap"; +static constexpr const char *LINE_GAP_ATTR = "line_gap"; +static constexpr const char *LINE_HEIGHT_ATTR = "line_height"; +static constexpr const char *DEPTH_ATTR = "depth"; +static constexpr const char *USE_SURFACE_ATTR = "use_surface"; +static constexpr const char *BOLDNESS_ATTR = "boldness"; +static constexpr const char *SKEW_ATTR = "skew"; +static constexpr const char *DISTANCE_ATTR = "distance"; +static constexpr const char *ANGLE_ATTR = "angle"; +static constexpr const char *COLLECTION_NUMBER_ATTR = "collection"; + +static constexpr const char *FONT_FAMILY_ATTR = "family"; +static constexpr const char *FONT_FACE_NAME_ATTR = "face_name"; +static constexpr const char *FONT_STYLE_ATTR = "style"; +static constexpr const char *FONT_WEIGHT_ATTR = "weight"; const unsigned int VALID_OBJECT_TYPES_COUNT = 1; const char* VALID_OBJECT_TYPES[] = @@ -267,11 +296,6 @@ bool is_valid_object_type(const std::string& type) namespace Slic3r { -//! macro used to mark string used at localization, -//! return same string -#define L(s) (s) -#define _(s) Slic3r::I18N::translate(s) - // Base class with error messages management class _3MF_Base { @@ -391,7 +415,7 @@ namespace Slic3r { unsigned int last_triangle_id; MetadataList metadata; RepairedMeshErrors mesh_stats; - + std::optional text_configuration; VolumeMetadata(unsigned int first_triangle_id, unsigned int last_triangle_id) : first_triangle_id(first_triangle_id) , last_triangle_id(last_triangle_id) @@ -405,6 +429,19 @@ namespace Slic3r { VolumeMetadataList volumes; }; + struct CutObjectInfo + { + struct Connector + { + int volume_id; + int type; + float r_tolerance; + float h_tolerance; + }; + CutObjectBase id; + std::vector connectors; + }; + // Map from a 1 based 3MF object ID to a 0 based ModelObject index inside m_model->objects. typedef std::map IdToModelObjectMap; typedef std::map IdToAliasesMap; @@ -413,6 +450,7 @@ namespace Slic3r { typedef std::map IdToGeometryMap; typedef std::map> IdToLayerHeightsProfileMap; typedef std::map IdToLayerConfigRangesMap; + typedef std::map IdToCutObjectInfoMap; typedef std::map> IdToSlaSupportPointsMap; typedef std::map> IdToSlaDrainHolesMap; @@ -440,6 +478,7 @@ namespace Slic3r { IdToGeometryMap m_geometries; CurrentConfig m_curr_config; IdToMetadataMap m_objects_metadata; + IdToCutObjectInfoMap m_cut_object_infos; IdToLayerHeightsProfileMap m_layer_heights_profiles; IdToLayerConfigRangesMap m_layer_config_ranges; IdToSlaSupportPointsMap m_sla_support_points; @@ -471,6 +510,7 @@ namespace Slic3r { bool _load_model_from_file(const std::string& filename, Model& model, DynamicPrintConfig& config, ConfigSubstitutionContext& config_substitutions); bool _extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat); + void _extract_cut_information_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat, ConfigSubstitutionContext& config_substitutions); void _extract_layer_heights_profile_config_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat); void _extract_layer_config_ranges_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat, ConfigSubstitutionContext& config_substitutions); void _extract_sla_support_points_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat); @@ -529,6 +569,8 @@ namespace Slic3r { bool _handle_start_metadata(const char** attributes, unsigned int num_attributes); bool _handle_end_metadata(); + bool _handle_start_text_configuration(const char** attributes, unsigned int num_attributes); + bool _create_object_instance(int object_id, const Transform3d& transform, const bool printable, unsigned int recur_counter); void _apply_transform(ModelInstance& instance, const Transform3d& transform); @@ -673,6 +715,10 @@ namespace Slic3r { // extract slic3r layer heights profile file _extract_layer_heights_profile_config_from_archive(archive, stat); } + else if (boost::algorithm::iequals(name, CUT_INFORMATION_FILE)) { + // extract slic3r layer config ranges file + _extract_cut_information_from_archive(archive, stat, config_substitutions); + } else if (boost::algorithm::iequals(name, LAYER_CONFIG_RANGES_FILE)) { // extract slic3r layer config ranges file _extract_layer_config_ranges_from_archive(archive, stat, config_substitutions); @@ -815,22 +861,55 @@ namespace Slic3r { if (!_generate_volumes(*model_object, obj_geometry->second, *volumes_ptr, config_substitutions)) return false; + + // Apply cut information for object if any was loaded + // m_cut_object_ids are indexed by a 1 based model object index. + IdToCutObjectInfoMap::iterator cut_object_info = m_cut_object_infos.find(object.second + 1); + if (cut_object_info != m_cut_object_infos.end()) { + model_object->cut_id = cut_object_info->second.id; + + for (auto connector : cut_object_info->second.connectors) { + assert(0 <= connector.volume_id && connector.volume_id <= int(model_object->volumes.size())); + model_object->volumes[connector.volume_id]->cut_info = + ModelVolume::CutInfo(CutConnectorType(connector.type), connector.r_tolerance, connector.h_tolerance, true); + } + } } - int object_idx = 0; - for (ModelObject* o : model.objects) { - int volume_idx = 0; - for (ModelVolume* v : o->volumes) { - if (v->source.input_file.empty() && v->type() == ModelVolumeType::MODEL_PART) { - v->source.input_file = filename; - if (v->source.volume_idx == -1) - v->source.volume_idx = volume_idx; - if (v->source.object_idx == -1) - v->source.object_idx = object_idx; + // If instances contain a single volume, the volume offset should be 0,0,0 + // This equals to say that instance world position and volume world position should match + // Correct all instances/volumes for which this does not hold + for (int obj_id = 0; obj_id < int(model.objects.size()); ++obj_id) { + ModelObject* o = model.objects[obj_id]; + if (o->volumes.size() == 1) { + ModelVolume* v = o->volumes.front(); + const Slic3r::Geometry::Transformation& first_inst_trafo = o->instances.front()->get_transformation(); + const Vec3d world_vol_offset = (first_inst_trafo * v->get_transformation()).get_offset(); + const Vec3d world_inst_offset = first_inst_trafo.get_offset(); + + if (!world_vol_offset.isApprox(world_inst_offset)) { + const Slic3r::Geometry::Transformation& vol_trafo = v->get_transformation(); + for (int inst_id = 0; inst_id < int(o->instances.size()); ++inst_id) { + ModelInstance* i = o->instances[inst_id]; + const Slic3r::Geometry::Transformation& inst_trafo = i->get_transformation(); + i->set_offset((inst_trafo * vol_trafo).get_offset()); + } + v->set_offset(Vec3d::Zero()); } - ++volume_idx; } - ++object_idx; + } + + for (int obj_id = 0; obj_id < int(model.objects.size()); ++obj_id) { + ModelObject* o = model.objects[obj_id]; + for (int vol_id = 0; vol_id < int(o->volumes.size()); ++vol_id) { + ModelVolume* v = o->volumes[vol_id]; + if (v->source.input_file.empty()) + v->source.input_file = filename; + if (v->source.volume_idx == -1) + v->source.volume_idx = vol_id; + if (v->source.object_idx == -1) + v->source.object_idx = obj_id; + } } // // fixes the min z of the model if negative @@ -873,7 +952,7 @@ namespace Slic3r { try { - res = mz_zip_reader_extract_file_to_callback(&archive, stat.m_filename, [](void* pOpaque, mz_uint64 file_ofs, const void* pBuf, size_t n)->size_t { + res = mz_zip_reader_extract_to_callback(&archive, stat.m_file_index, [](void* pOpaque, mz_uint64 file_ofs, const void* pBuf, size_t n)->size_t { CallbackData* data = (CallbackData*)pOpaque; if (!XML_Parse(data->parser, (const char*)pBuf, (int)n, (file_ofs + n == data->stat.m_uncomp_size) ? 1 : 0) || data->importer.parse_error()) { char error_buf[1024]; @@ -903,6 +982,65 @@ namespace Slic3r { return true; } + void _3MF_Importer::_extract_cut_information_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat, ConfigSubstitutionContext& config_substitutions) + { + if (stat.m_uncomp_size > 0) { + std::string buffer((size_t)stat.m_uncomp_size, 0); + mz_bool res = mz_zip_reader_extract_to_mem(&archive, stat.m_file_index, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); + if (res == 0) { + add_error("Error while reading cut information data to buffer"); + return; + } + + std::istringstream iss(buffer); // wrap returned xml to istringstream + pt::ptree objects_tree; + pt::read_xml(iss, objects_tree); + + for (const auto& object : objects_tree.get_child("objects")) { + pt::ptree object_tree = object.second; + int obj_idx = object_tree.get(".id", -1); + if (obj_idx <= 0) { + add_error("Found invalid object id"); + continue; + } + + IdToCutObjectInfoMap::iterator object_item = m_cut_object_infos.find(obj_idx); + if (object_item != m_cut_object_infos.end()) { + add_error("Found duplicated cut_object_id"); + continue; + } + + CutObjectBase cut_id; + std::vector connectors; + + for (const auto& obj_cut_info : object_tree) { + if (obj_cut_info.first == "cut_id") { + pt::ptree cut_id_tree = obj_cut_info.second; + cut_id = CutObjectBase(ObjectID( cut_id_tree.get(".id")), + cut_id_tree.get(".check_sum"), + cut_id_tree.get(".connectors_cnt")); + } + if (obj_cut_info.first == "connectors") { + pt::ptree cut_connectors_tree = obj_cut_info.second; + for (const auto& cut_connector : cut_connectors_tree) { + if (cut_connector.first != "connector") + continue; + pt::ptree connector_tree = cut_connector.second; + CutObjectInfo::Connector connector = {connector_tree.get(".volume_id"), + connector_tree.get(".type"), + connector_tree.get(".r_tolerance"), + connector_tree.get(".h_tolerance")}; + connectors.emplace_back(connector); + } + } + } + + CutObjectInfo cut_info {cut_id, connectors}; + m_cut_object_infos.insert({ obj_idx, cut_info }); + } + } + } + void _3MF_Importer::_extract_print_config_from_archive( mz_zip_archive& archive, const mz_zip_archive_file_stat& stat, DynamicPrintConfig& config, ConfigSubstitutionContext& config_substitutions, @@ -910,7 +1048,7 @@ namespace Slic3r { { if (stat.m_uncomp_size > 0) { std::string buffer((size_t)stat.m_uncomp_size, 0); - mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); + mz_bool res = mz_zip_reader_extract_to_mem(&archive, stat.m_file_index, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); if (res == 0) { add_error("Error while reading config data to buffer"); return; @@ -930,7 +1068,7 @@ namespace Slic3r { { if (stat.m_uncomp_size > 0) { std::string buffer((size_t)stat.m_uncomp_size, 0); - mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); + mz_bool res = mz_zip_reader_extract_to_mem(&archive, stat.m_file_index, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); if (res == 0) { add_error("Error while reading layer heights profile data to buffer"); return; @@ -992,7 +1130,7 @@ namespace Slic3r { { if (stat.m_uncomp_size > 0) { std::string buffer((size_t)stat.m_uncomp_size, 0); - mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); + mz_bool res = mz_zip_reader_extract_to_mem(&archive, stat.m_file_index, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); if (res == 0) { add_error("Error while reading layer config ranges data to buffer"); return; @@ -1049,7 +1187,7 @@ namespace Slic3r { { if (stat.m_uncomp_size > 0) { std::string buffer((size_t)stat.m_uncomp_size, 0); - mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); + mz_bool res = mz_zip_reader_extract_to_mem(&archive, stat.m_file_index, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); if (res == 0) { add_error("Error while reading sla support points data to buffer"); return; @@ -1131,7 +1269,7 @@ namespace Slic3r { { if (stat.m_uncomp_size > 0) { std::string buffer(size_t(stat.m_uncomp_size), 0); - mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); + mz_bool res = mz_zip_reader_extract_to_mem(&archive, stat.m_file_index, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); if (res == 0) { add_error("Error while reading sla support points data to buffer"); return; @@ -1236,7 +1374,7 @@ namespace Slic3r { return false; } - mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, parser_buffer, (size_t)stat.m_uncomp_size, 0); + mz_bool res = mz_zip_reader_extract_to_mem(&archive, stat.m_file_index, parser_buffer, (size_t)stat.m_uncomp_size, 0); if (res == 0) { add_error("Error while reading config data to buffer"); return false; @@ -1256,7 +1394,7 @@ namespace Slic3r { { if (stat.m_uncomp_size > 0) { std::string buffer((size_t)stat.m_uncomp_size, 0); - mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); + mz_bool res = mz_zip_reader_extract_to_mem(&archive, stat.m_file_index, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); if (res == 0) { add_error("Error while reading custom Gcodes per height data to buffer"); return; @@ -1411,6 +1549,8 @@ namespace Slic3r { res = _handle_start_config_volume_mesh(attributes, num_attributes); else if (::strcmp(METADATA_TAG, name) == 0) res = _handle_start_config_metadata(attributes, num_attributes); + else if (::strcmp(TEXT_TAG, name) == 0) + res = _handle_start_text_configuration(attributes, num_attributes); if (!res) _stop_xml_parser(); @@ -1730,9 +1870,9 @@ namespace Slic3r { if (m_curr_metadata_name == SLIC3RPE_3MF_VERSION) { m_version = (unsigned int)atoi(m_curr_characters.c_str()); if (m_check_version && (m_version > VERSION_3MF_COMPATIBLE)) { - // std::string msg = _(L("The selected 3mf file has been saved with a newer version of " + std::string(SLIC3R_APP_NAME) + " and is not compatible.")); + // std::string msg = _u8L("The selected 3mf file has been saved with a newer version of " + std::string(SLIC3R_APP_NAME) + " and is not compatible."); // throw version_error(msg.c_str()); - const std::string msg = (boost::format(_(L("The selected 3mf file has been saved with a newer version of %1% and is not compatible."))) % std::string(SLIC3R_APP_NAME)).str(); + const std::string msg = (boost::format(_u8L("The selected 3mf file has been saved with a newer version of %1% and is not compatible.")) % std::string(SLIC3R_APP_NAME)).str(); throw version_error(msg); } } else if (m_curr_metadata_name == "Application") { @@ -1743,20 +1883,64 @@ namespace Slic3r { } else if (m_curr_metadata_name == SLIC3RPE_FDM_SUPPORTS_PAINTING_VERSION) { m_fdm_supports_painting_version = (unsigned int) atoi(m_curr_characters.c_str()); check_painting_version(m_fdm_supports_painting_version, FDM_SUPPORTS_PAINTING_VERSION, - _(L("The selected 3MF contains FDM supports painted object using a newer version of PrusaSlicer and is not compatible."))); + _u8L("The selected 3MF contains FDM supports painted object using a newer version of PrusaSlicer and is not compatible.")); } else if (m_curr_metadata_name == SLIC3RPE_SEAM_PAINTING_VERSION) { m_seam_painting_version = (unsigned int) atoi(m_curr_characters.c_str()); check_painting_version(m_seam_painting_version, SEAM_PAINTING_VERSION, - _(L("The selected 3MF contains seam painted object using a newer version of PrusaSlicer and is not compatible."))); + _u8L("The selected 3MF contains seam painted object using a newer version of PrusaSlicer and is not compatible.")); } else if (m_curr_metadata_name == SLIC3RPE_MM_PAINTING_VERSION) { m_mm_painting_version = (unsigned int) atoi(m_curr_characters.c_str()); check_painting_version(m_mm_painting_version, MM_PAINTING_VERSION, - _(L("The selected 3MF contains multi-material painted object using a newer version of PrusaSlicer and is not compatible."))); + _u8L("The selected 3MF contains multi-material painted object using a newer version of PrusaSlicer and is not compatible.")); } return true; } + struct TextConfigurationSerialization + { + public: + TextConfigurationSerialization() = delete; + + static const boost::bimap type_to_name; + + static EmbossStyle::Type get_type(std::string_view type) { + const auto& to_type = TextConfigurationSerialization::type_to_name.right; + auto type_item = to_type.find(type); + assert(type_item != to_type.end()); + if (type_item == to_type.end()) return EmbossStyle::Type::undefined; + return type_item->second; + } + + static std::string_view get_name(EmbossStyle::Type type) { + const auto& to_name = TextConfigurationSerialization::type_to_name.left; + auto type_name = to_name.find(type); + assert(type_name != to_name.end()); + if (type_name == to_name.end()) return "unknown type"; + return type_name->second; + } + + static void to_xml(std::stringstream &stream, const TextConfiguration &tc); + static void create_fix_and_store(std::stringstream &stream, TextConfiguration tc, const ModelVolume& volume); + static std::optional read(const char **attributes, unsigned int num_attributes); + }; + + bool _3MF_Importer::_handle_start_text_configuration(const char **attributes, unsigned int num_attributes) + { + IdToMetadataMap::iterator object = m_objects_metadata.find(m_curr_config.object_id); + if (object == m_objects_metadata.end()) { + add_error("Cannot assign volume mesh to a valid object"); + return false; + } + if (object->second.volumes.empty()) { + add_error("Cannot assign mesh to a valid volume"); + return false; + } + ObjectMetadata::VolumeMetadata& volume = object->second.volumes.back(); + volume.text_configuration = TextConfigurationSerialization::read(attributes, num_attributes); + return volume.text_configuration.has_value(); + } + bool _3MF_Importer::_create_object_instance(int object_id, const Transform3d& transform, const bool printable, unsigned int recur_counter) { static const unsigned int MAX_RECURSIONS = 10; @@ -1873,7 +2057,7 @@ namespace Slic3r { return false; } if (object->second.volumes.empty()) { - add_error("Cannot assign mesh to a valid olume"); + add_error("Cannot assign mesh to a valid volume"); return false; } @@ -2037,7 +2221,23 @@ namespace Slic3r { volume->supported_facets.shrink_to_fit(); volume->seam_facets.shrink_to_fit(); volume->mmu_segmentation_facets.shrink_to_fit(); - + auto &tc = volume_data.text_configuration; + if (tc.has_value()) { + volume->text_configuration = std::move(tc); + + //// Transformation before store to 3mf + //const Transform3d &pre_trmat = *tc->fix_3mf_tr; + //// Cannot use source tranformation + //// When store transformed againg to 3mf it is not modified !!! + //// const Transform3d &pre_trmat = volume->source.transform.get_matrix(); + + //// create fix transformation + //assert(tc->fix_3mf_tr.has_value()); + //volume->text_configuration->fix_3mf_tr = + // pre_trmat.inverse() * + // volume->get_transformation().get_matrix(); + } + // apply the remaining volume's metadata for (const Metadata& metadata : volume_data.metadata) { if (metadata.key == NAME_KEY) @@ -2053,15 +2253,17 @@ namespace Slic3r { else if (metadata.key == SOURCE_VOLUME_ID_KEY) volume->source.volume_idx = ::atoi(metadata.value.c_str()); else if (metadata.key == SOURCE_OFFSET_X_KEY) - volume->source.mesh_offset(0) = ::atof(metadata.value.c_str()); + volume->source.mesh_offset.x() = ::atof(metadata.value.c_str()); else if (metadata.key == SOURCE_OFFSET_Y_KEY) - volume->source.mesh_offset(1) = ::atof(metadata.value.c_str()); + volume->source.mesh_offset.y() = ::atof(metadata.value.c_str()); else if (metadata.key == SOURCE_OFFSET_Z_KEY) - volume->source.mesh_offset(2) = ::atof(metadata.value.c_str()); - else if (metadata.key == SOURCE_IN_INCHES) + volume->source.mesh_offset.z() = ::atof(metadata.value.c_str()); + else if (metadata.key == SOURCE_IN_INCHES_KEY) volume->source.is_converted_from_inches = metadata.value == "1"; - else if (metadata.key == SOURCE_IN_METERS) + else if (metadata.key == SOURCE_IN_METERS_KEY) volume->source.is_converted_from_meters = metadata.value == "1"; + else if (metadata.key == SOURCE_IS_BUILTIN_VOLUME_KEY) + volume->source.is_from_builtin_objects = metadata.value == "1"; else volume->config.set_deserialize(metadata.key, metadata.value, config_substitutions); } @@ -2164,7 +2366,7 @@ namespace Slic3r { public: bool save_model_to_file(const std::string& filename, Model& model, const DynamicPrintConfig* config, bool fullpath_sources, const ThumbnailData* thumbnail_data, bool zip64); - + static void add_transformation(std::stringstream &stream, const Transform3d &tr); private: bool _save_model_to_file(const std::string& filename, Model& model, const DynamicPrintConfig* config, const ThumbnailData* thumbnail_data); bool _add_content_types_file_to_archive(mz_zip_archive& archive); @@ -2172,8 +2374,9 @@ namespace Slic3r { bool _add_relationships_file_to_archive(mz_zip_archive& archive); bool _add_model_file_to_archive(const std::string& filename, mz_zip_archive& archive, const Model& model, IdToObjectDataMap& objects_data); bool _add_object_to_model_stream(mz_zip_writer_staged_context &context, unsigned int& object_id, ModelObject& object, BuildItemsList& build_items, VolumeToOffsetsMap& volumes_offsets); - bool _add_mesh_to_object_stream(mz_zip_writer_staged_context &context, ModelObject& object, VolumeToOffsetsMap& volumes_offsets); + bool _add_mesh_to_object_stream(mz_zip_writer_staged_context &context, ModelObject& object, VolumeToOffsetsMap& volumes_offsets); bool _add_build_to_model_stream(std::stringstream& stream, const BuildItemsList& build_items); + bool _add_cut_information_file_to_archive(mz_zip_archive& archive, Model& model); bool _add_layer_height_profile_file_to_archive(mz_zip_archive& archive, Model& model); bool _add_layer_config_ranges_file_to_archive(mz_zip_archive& archive, Model& model); bool _add_sla_support_points_file_to_archive(mz_zip_archive& archive, Model& model); @@ -2236,6 +2439,15 @@ namespace Slic3r { return false; } + // Adds file with information for object cut ("Metadata/Slic3r_PE_cut_information.txt"). + // All information for object cut of all ModelObjects are stored here, indexed by 1 based index of the ModelObject in Model. + // The index differes from the index of an object ID of an object instance of a 3MF file! + if (!_add_cut_information_file_to_archive(archive, model)) { + close_zip_writer(&archive); + boost::filesystem::remove(filename); + return false; + } + // Adds layer height profile file ("Metadata/Slic3r_PE_layer_heights_profile.txt"). // All layer height profiles of all ModelObjects are stored here, indexed by 1 based index of the ModelObject in Model. // The index differes from the index of an object ID of an object instance of a 3MF file! @@ -2610,9 +2822,8 @@ namespace Slic3r { vertices_count += (int)its.vertices.size(); const Transform3d& matrix = volume->get_matrix(); - - for (size_t i = 0; i < its.vertices.size(); ++i) { - Vec3f v = (matrix * its.vertices[i].cast()).cast(); + for (const auto& vertex: its.vertices) { + Vec3f v = (matrix * vertex.cast()).cast(); char *ptr = buf; boost::spirit::karma::generate(ptr, boost::spirit::lit(" <") << VERTEX_TAG << " x=\""); ptr = format_coordinate(v.x(), ptr); @@ -2709,6 +2920,16 @@ namespace Slic3r { return flush(true); } + void _3MF_Exporter::add_transformation(std::stringstream &stream, const Transform3d &tr) + { + for (unsigned c = 0; c < 4; ++c) { + for (unsigned r = 0; r < 3; ++r) { + stream << tr(r, c); + if (r != 2 || c != 3) stream << " "; + } + } + } + bool _3MF_Exporter::_add_build_to_model_stream(std::stringstream& stream, const BuildItemsList& build_items) { // This happens for empty projects @@ -2721,13 +2942,7 @@ namespace Slic3r { for (const BuildItem& item : build_items) { stream << " <" << ITEM_TAG << " " << OBJECTID_ATTR << "=\"" << item.id << "\" " << TRANSFORM_ATTR << "=\""; - for (unsigned c = 0; c < 4; ++c) { - for (unsigned r = 0; r < 3; ++r) { - stream << item.transform(r, c); - if (r != 2 || c != 3) - stream << " "; - } - } + add_transformation(stream, item.transform); stream << "\" " << PRINTABLE_ATTR << "=\"" << item.printable << "\"/>\n"; } @@ -2736,6 +2951,69 @@ namespace Slic3r { return true; } + bool _3MF_Exporter::_add_cut_information_file_to_archive(mz_zip_archive& archive, Model& model) + { + std::string out = ""; + pt::ptree tree; + + unsigned int object_cnt = 0; + for (const ModelObject* object : model.objects) { + if (!object->is_cut()) + continue; + object_cnt++; + pt::ptree& obj_tree = tree.add("objects.object", ""); + + obj_tree.put(".id", object_cnt); + + // Store info for cut_id + pt::ptree& cut_id_tree = obj_tree.add("cut_id", ""); + + // store cut_id atributes + cut_id_tree.put(".id", object->cut_id.id().id); + cut_id_tree.put(".check_sum", object->cut_id.check_sum()); + cut_id_tree.put(".connectors_cnt", object->cut_id.connectors_cnt()); + + int volume_idx = -1; + for (const ModelVolume* volume : object->volumes) { + ++volume_idx; + if (volume->is_cut_connector()) { + pt::ptree& connectors_tree = obj_tree.add("connectors.connector", ""); + connectors_tree.put(".volume_id", volume_idx); + connectors_tree.put(".type", int(volume->cut_info.connector_type)); + connectors_tree.put(".r_tolerance", volume->cut_info.radius_tolerance); + connectors_tree.put(".h_tolerance", volume->cut_info.height_tolerance); + } + } + } + + if (!tree.empty()) { + std::ostringstream oss; + pt::write_xml(oss, tree); + out = oss.str(); + + // Post processing("beautification") of the output string for a better preview + boost::replace_all(out, ">\n \n ", ">\n "); + boost::replace_all(out, ">\n ", ">\n "); + boost::replace_all(out, ">\n ", ">\n "); + boost::replace_all(out, ">", ">\n "); + // OR just + boost::replace_all(out, "><", ">\n<"); + } + + if (!out.empty()) { + if (!mz_zip_writer_add_mem(&archive, CUT_INFORMATION_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) { + add_error("Unable to add cut information file to archive"); + return false; + } + } + + return true; + } + bool _3MF_Exporter::_add_layer_height_profile_file_to_archive(mz_zip_archive& archive, Model& model) { assert(is_decimal_separator_point()); @@ -2937,6 +3215,24 @@ namespace Slic3r { bool _3MF_Exporter::_add_model_config_file_to_archive(mz_zip_archive& archive, const Model& model, const IdToObjectDataMap &objects_data) { + enum class MetadataType{ + object, + volume + }; + + auto add_metadata = [](std::stringstream &stream, unsigned indent, MetadataType type, + const std::string &key, const std::string &value) { + const char *type_value; + switch (type) { + case MetadataType::object: type_value = OBJECT_TYPE; break; + case MetadataType::volume: type_value = VOLUME_TYPE; break; + }; + stream << std::string(indent, ' ') << '<' << METADATA_TAG << " " + << TYPE_ATTR << "=\"" << type_value << "\" " + << KEY_ATTR << "=\"" << key << "\" " + << VALUE_ATTR << "=\"" << xml_escape_double_quotes_attribute_value(value) << "\"/>\n"; + }; + std::stringstream stream; // Store mesh transformation in full precision, as the volumes are stored transformed and they need to be transformed back // when loaded as accurately as possible. @@ -2946,92 +3242,94 @@ namespace Slic3r { for (const IdToObjectDataMap::value_type& obj_metadata : objects_data) { const ModelObject* obj = obj_metadata.second.object; - if (obj != nullptr) { - // Output of instances count added because of github #3435, currently not used by PrusaSlicer - stream << " <" << OBJECT_TAG << " " << ID_ATTR << "=\"" << obj_metadata.first << "\" " << INSTANCESCOUNT_ATTR << "=\"" << obj->instances.size() << "\">\n"; - - // stores object's name - if (!obj->name.empty()) - stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << OBJECT_TYPE << "\" " << KEY_ATTR << "=\"name\" " << VALUE_ATTR << "=\"" << xml_escape(obj->name) << "\"/>\n"; - - // stores object's config data - for (const std::string& key : obj->config.keys()) { - stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << OBJECT_TYPE << "\" " << KEY_ATTR << "=\"" << key << "\" " << VALUE_ATTR << "=\"" << obj->config.opt_serialize(key) << "\"/>\n"; - } - - for (const ModelVolume* volume : obj_metadata.second.object->volumes) { - if (volume != nullptr) { - const VolumeToOffsetsMap& offsets = obj_metadata.second.volumes_offsets; - VolumeToOffsetsMap::const_iterator it = offsets.find(volume); - if (it != offsets.end()) { - // stores volume's offsets - stream << " <" << VOLUME_TAG << " "; - stream << FIRST_TRIANGLE_ID_ATTR << "=\"" << it->second.first_triangle_id << "\" "; - stream << LAST_TRIANGLE_ID_ATTR << "=\"" << it->second.last_triangle_id << "\">\n"; - - // stores volume's name - if (!volume->name.empty()) - stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << NAME_KEY << "\" " << VALUE_ATTR << "=\"" << xml_escape(volume->name) << "\"/>\n"; - - // stores volume's modifier field (legacy, to support old slicers) - if (volume->is_modifier()) - stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << MODIFIER_KEY << "\" " << VALUE_ATTR << "=\"1\"/>\n"; - // stores volume's type (overrides the modifier field above) - stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << VOLUME_TYPE_KEY << "\" " << - VALUE_ATTR << "=\"" << ModelVolume::type_to_string(volume->type()) << "\"/>\n"; - - // stores volume's local matrix - stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << MATRIX_KEY << "\" " << VALUE_ATTR << "=\""; - Transform3d matrix = volume->get_matrix() * volume->source.transform.get_matrix(); - for (int r = 0; r < 4; ++r) { - for (int c = 0; c < 4; ++c) { - stream << matrix(r, c); - if (r != 3 || c != 3) - stream << " "; - } - } - stream << "\"/>\n"; - - // stores volume's source data - { - std::string input_file = xml_escape(m_fullpath_sources ? volume->source.input_file : boost::filesystem::path(volume->source.input_file).filename().string()); - std::string prefix = std::string(" <") + METADATA_TAG + " " + TYPE_ATTR + "=\"" + VOLUME_TYPE + "\" " + KEY_ATTR + "=\""; - if (! volume->source.input_file.empty()) { - stream << prefix << SOURCE_FILE_KEY << "\" " << VALUE_ATTR << "=\"" << input_file << "\"/>\n"; - stream << prefix << SOURCE_OBJECT_ID_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.object_idx << "\"/>\n"; - stream << prefix << SOURCE_VOLUME_ID_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.volume_idx << "\"/>\n"; - stream << prefix << SOURCE_OFFSET_X_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.mesh_offset(0) << "\"/>\n"; - stream << prefix << SOURCE_OFFSET_Y_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.mesh_offset(1) << "\"/>\n"; - stream << prefix << SOURCE_OFFSET_Z_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.mesh_offset(2) << "\"/>\n"; - } - assert(! volume->source.is_converted_from_inches || ! volume->source.is_converted_from_meters); - if (volume->source.is_converted_from_inches) - stream << prefix << SOURCE_IN_INCHES << "\" " << VALUE_ATTR << "=\"1\"/>\n"; - else if (volume->source.is_converted_from_meters) - stream << prefix << SOURCE_IN_METERS << "\" " << VALUE_ATTR << "=\"1\"/>\n"; - } + if (obj == nullptr) continue; + // Output of instances count added because of github #3435, currently not used by PrusaSlicer + stream << " <" << OBJECT_TAG << " " << ID_ATTR << "=\"" << obj_metadata.first << "\" " << INSTANCESCOUNT_ATTR << "=\"" << obj->instances.size() << "\">\n"; + + // stores object's name + if (!obj->name.empty()) + add_metadata(stream, 2, MetadataType::object, "name", obj->name); + // stores object's config data + const ModelConfigObject &config = obj->config; + for (const std::string& key : config.keys()) + add_metadata(stream, 2, MetadataType::object, key, config.opt_serialize(key)); + + for (const ModelVolume* volume : obj_metadata.second.object->volumes) { + if (volume == nullptr) continue; + const VolumeToOffsetsMap& offsets = obj_metadata.second.volumes_offsets; + VolumeToOffsetsMap::const_iterator it = offsets.find(volume); + if (it != offsets.end()) { + // stores volume's offsets + stream << " <" << VOLUME_TAG << " "; + stream << FIRST_TRIANGLE_ID_ATTR << "=\"" << it->second.first_triangle_id << "\" "; + stream << LAST_TRIANGLE_ID_ATTR << "=\"" << it->second.last_triangle_id << "\">\n"; + + // stores volume's name + if (!volume->name.empty()) + add_metadata(stream, 3, MetadataType::volume, NAME_KEY, volume->name); + + // stores volume's modifier field (legacy, to support old slicers) + if (volume->is_modifier()) + add_metadata(stream, 3, MetadataType::volume, MODIFIER_KEY, "1"); + // stores volume's type (overrides the modifier field above) + add_metadata(stream, 3, MetadataType::volume, VOLUME_TYPE_KEY, ModelVolume::type_to_string(volume->type())); + + // stores volume's local matrix + stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << MATRIX_KEY << "\" " << VALUE_ATTR << "=\""; + const Transform3d matrix = volume->get_matrix() * volume->source.transform.get_matrix(); + for (int r = 0; r < 4; ++r) { + for (int c = 0; c < 4; ++c) { + stream << matrix(r, c); + if (r != 3 || c != 3) + stream << " "; + } + } + stream << "\"/>\n"; - // stores volume's config data - for (const std::string& key : volume->config.keys()) { - stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << key << "\" " << VALUE_ATTR << "=\"" << volume->config.opt_serialize(key) << "\"/>\n"; - } - - // stores mesh's statistics - const RepairedMeshErrors& stats = volume->mesh().stats().repaired_errors; - stream << " <" << MESH_TAG << " "; - stream << MESH_STAT_EDGES_FIXED << "=\"" << stats.edges_fixed << "\" "; - stream << MESH_STAT_DEGENERATED_FACETS << "=\"" << stats.degenerate_facets << "\" "; - stream << MESH_STAT_FACETS_REMOVED << "=\"" << stats.facets_removed << "\" "; - stream << MESH_STAT_FACETS_RESERVED << "=\"" << stats.facets_reversed << "\" "; - stream << MESH_STAT_BACKWARDS_EDGES << "=\"" << stats.backwards_edges << "\"/>\n"; - - stream << " \n"; + // stores volume's source data + { + std::string input_file = xml_escape(m_fullpath_sources ? volume->source.input_file : boost::filesystem::path(volume->source.input_file).filename().string()); + std::string prefix = std::string(" <") + METADATA_TAG + " " + TYPE_ATTR + "=\"" + VOLUME_TYPE + "\" " + KEY_ATTR + "=\""; + if (! volume->source.input_file.empty()) { + stream << prefix << SOURCE_FILE_KEY << "\" " << VALUE_ATTR << "=\"" << input_file << "\"/>\n"; + stream << prefix << SOURCE_OBJECT_ID_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.object_idx << "\"/>\n"; + stream << prefix << SOURCE_VOLUME_ID_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.volume_idx << "\"/>\n"; + stream << prefix << SOURCE_OFFSET_X_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.mesh_offset(0) << "\"/>\n"; + stream << prefix << SOURCE_OFFSET_Y_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.mesh_offset(1) << "\"/>\n"; + stream << prefix << SOURCE_OFFSET_Z_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.mesh_offset(2) << "\"/>\n"; } + assert(! volume->source.is_converted_from_inches || ! volume->source.is_converted_from_meters); + if (volume->source.is_converted_from_inches) + stream << prefix << SOURCE_IN_INCHES_KEY << "\" " << VALUE_ATTR << "=\"1\"/>\n"; + else if (volume->source.is_converted_from_meters) + stream << prefix << SOURCE_IN_METERS_KEY << "\" " << VALUE_ATTR << "=\"1\"/>\n"; + if (volume->source.is_from_builtin_objects) + stream << prefix << SOURCE_IS_BUILTIN_VOLUME_KEY << "\" " << VALUE_ATTR << "=\"1\"/>\n"; } - } - stream << " \n"; + // stores volume's config data + for (const std::string& key : volume->config.keys()) { + stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << key << "\" " << VALUE_ATTR << "=\"" << volume->config.opt_serialize(key) << "\"/>\n"; + } + + // stores volume's text data + const auto &tc = volume->text_configuration; + if (tc.has_value()) + TextConfigurationSerialization::create_fix_and_store(stream, *tc, *volume); + + // stores mesh's statistics + const RepairedMeshErrors& stats = volume->mesh().stats().repaired_errors; + stream << " <" << MESH_TAG << " "; + stream << MESH_STAT_EDGES_FIXED << "=\"" << stats.edges_fixed << "\" "; + stream << MESH_STAT_DEGENERATED_FACETS << "=\"" << stats.degenerate_facets << "\" "; + stream << MESH_STAT_FACETS_REMOVED << "=\"" << stats.facets_removed << "\" "; + stream << MESH_STAT_FACETS_RESERVED << "=\"" << stats.facets_reversed << "\" "; + stream << MESH_STAT_BACKWARDS_EDGES << "=\"" << stats.backwards_edges << "\"/>\n"; + + stream << " \n"; + } } + stream << " \n"; } stream << "\n"; @@ -3108,7 +3406,7 @@ static void handle_legacy_project_loaded(unsigned int version_project_file, Dyna opt_brim_separation->value = opt_elephant_foot->value; } } - + // In PrusaSlicer 2.5.0-alpha2 and 2.5.0-alpha3, we introduce several parameters for Arachne that depend // on nozzle size . Later we decided to make default values for those parameters computed automatically // until the user changes them. @@ -3165,10 +3463,11 @@ bool load_3mf(const char* path, DynamicPrintConfig& config, ConfigSubstitutionCo // All import should use "C" locales for number formatting. CNumericLocalesSetter locales_setter; _3MF_Importer importer; - bool res = importer.load_model_from_file(path, *model, config, config_substitutions, check_version); + importer.load_model_from_file(path, *model, config, config_substitutions, check_version); importer.log_errors(); handle_legacy_project_loaded(importer.version(), config, importer.prusaslicer_generator_version()); - return res; + + return !model->objects.empty() || !config.empty(); } bool store_3mf(const char* path, Model* model, const DynamicPrintConfig* config, bool fullpath_sources, const ThumbnailData* thumbnail_data, bool zip64) @@ -3186,4 +3485,158 @@ bool store_3mf(const char* path, Model* model, const DynamicPrintConfig* config, return res; } + +/// +/// TextConfiguration serialization +/// +using TypeToName = boost::bimap; +const TypeToName TextConfigurationSerialization::type_to_name = + boost::assign::list_of + (EmbossStyle::Type::file_path, "file_name") + (EmbossStyle::Type::wx_win_font_descr, "wxFontDescriptor_Windows") + (EmbossStyle::Type::wx_lin_font_descr, "wxFontDescriptor_Linux") + (EmbossStyle::Type::wx_mac_font_descr, "wxFontDescriptor_MacOsX"); + +void TextConfigurationSerialization::to_xml(std::stringstream &stream, const TextConfiguration &tc) +{ + stream << " <" << TEXT_TAG << " "; + + stream << TEXT_DATA_ATTR << "=\"" << xml_escape_double_quotes_attribute_value(tc.text) << "\" "; + // font item + const EmbossStyle &fi = tc.style; + stream << STYLE_NAME_ATTR << "=\"" << xml_escape_double_quotes_attribute_value(fi.name) << "\" "; + stream << FONT_DESCRIPTOR_ATTR << "=\"" << xml_escape_double_quotes_attribute_value(fi.path) << "\" "; + stream << FONT_DESCRIPTOR_TYPE_ATTR << "=\"" << TextConfigurationSerialization::get_name(fi.type) << "\" "; + + // font property + const FontProp &fp = tc.style.prop; + if (fp.char_gap.has_value()) + stream << CHAR_GAP_ATTR << "=\"" << *fp.char_gap << "\" "; + if (fp.line_gap.has_value()) + stream << LINE_GAP_ATTR << "=\"" << *fp.line_gap << "\" "; + + stream << LINE_HEIGHT_ATTR << "=\"" << fp.size_in_mm << "\" "; + stream << DEPTH_ATTR << "=\"" << fp.emboss << "\" "; + if (fp.use_surface) + stream << USE_SURFACE_ATTR << "=\"" << 1 << "\" "; + if (fp.boldness.has_value()) + stream << BOLDNESS_ATTR << "=\"" << *fp.boldness << "\" "; + if (fp.skew.has_value()) + stream << SKEW_ATTR << "=\"" << *fp.skew << "\" "; + if (fp.distance.has_value()) + stream << DISTANCE_ATTR << "=\"" << *fp.distance << "\" "; + if (fp.angle.has_value()) + stream << ANGLE_ATTR << "=\"" << *fp.angle << "\" "; + if (fp.collection_number.has_value()) + stream << COLLECTION_NUMBER_ATTR << "=\"" << *fp.collection_number << "\" "; + // font descriptor + if (fp.family.has_value()) + stream << FONT_FAMILY_ATTR << "=\"" << *fp.family << "\" "; + if (fp.face_name.has_value()) + stream << FONT_FACE_NAME_ATTR << "=\"" << *fp.face_name << "\" "; + if (fp.style.has_value()) + stream << FONT_STYLE_ATTR << "=\"" << *fp.style << "\" "; + if (fp.weight.has_value()) + stream << FONT_WEIGHT_ATTR << "=\"" << *fp.weight << "\" "; + + // FIX of baked transformation + assert(tc.fix_3mf_tr.has_value()); + stream << TRANSFORM_ATTR << "=\""; + _3MF_Exporter::add_transformation(stream, *tc.fix_3mf_tr); + stream << "\" "; + + stream << "/>\n"; // end TEXT_TAG +} + +void TextConfigurationSerialization::create_fix_and_store( + std::stringstream &stream, TextConfiguration tc, const ModelVolume &volume) +{ + const auto& vertices = volume.mesh().its.vertices; + assert(!vertices.empty()); + if (vertices.empty()) { + to_xml(stream, tc); + return; + } + + // IMPROVE: check if volume was modified (translated, rotated OR scaled) + // when no change do not calculate transformation only store original fix matrix + + // Create transformation used after load actual stored volume + const Transform3d &actual_trmat = volume.get_transformation().get_matrix(); + Vec3d min = actual_trmat * vertices.front().cast(); + Vec3d max = min; + for (const Vec3f &v : vertices) { + Vec3d vd = actual_trmat * v.cast(); + for (size_t i = 0; i < 3; ++i) { + if (min[i] > vd[i]) min[i] = vd[i]; + if (max[i] < vd[i]) max[i] = vd[i]; + } + } + Vec3d center = (max + min) / 2; + Transform3d post_trmat = Transform3d::Identity(); + post_trmat.translate(center); + + Transform3d fix_trmat = actual_trmat.inverse() * post_trmat; + if (!tc.fix_3mf_tr.has_value()) { + tc.fix_3mf_tr = fix_trmat; + } else if (!fix_trmat.isApprox(Transform3d::Identity(), 1e-5)) { + tc.fix_3mf_tr = *tc.fix_3mf_tr * fix_trmat; + } + to_xml(stream, tc); +} + +std::optional TextConfigurationSerialization::read(const char **attributes, unsigned int num_attributes) +{ + FontProp fp; + int char_gap = get_attribute_value_int(attributes, num_attributes, CHAR_GAP_ATTR); + if (char_gap != 0) fp.char_gap = char_gap; + int line_gap = get_attribute_value_int(attributes, num_attributes, LINE_GAP_ATTR); + if (line_gap != 0) fp.line_gap = line_gap; + float boldness = get_attribute_value_float(attributes, num_attributes, BOLDNESS_ATTR); + if (std::fabs(boldness) > std::numeric_limits::epsilon()) + fp.boldness = boldness; + float skew = get_attribute_value_float(attributes, num_attributes, SKEW_ATTR); + if (std::fabs(skew) > std::numeric_limits::epsilon()) + fp.skew = skew; + float distance = get_attribute_value_float(attributes, num_attributes, DISTANCE_ATTR); + if (std::fabs(distance) > std::numeric_limits::epsilon()) + fp.distance = distance; + int use_surface = get_attribute_value_int(attributes, num_attributes, USE_SURFACE_ATTR); + if (use_surface == 1) fp.use_surface = true; + float angle = get_attribute_value_float(attributes, num_attributes, ANGLE_ATTR); + if (std::fabs(angle) > std::numeric_limits::epsilon()) + fp.angle = angle; + int collection_number = get_attribute_value_int(attributes, num_attributes, COLLECTION_NUMBER_ATTR); + if (collection_number > 0) fp.collection_number = static_cast(collection_number); + + fp.size_in_mm = get_attribute_value_float(attributes, num_attributes, LINE_HEIGHT_ATTR); + fp.emboss = get_attribute_value_float(attributes, num_attributes, DEPTH_ATTR); + + std::string family = get_attribute_value_string(attributes, num_attributes, FONT_FAMILY_ATTR); + if (!family.empty()) fp.family = family; + std::string face_name = get_attribute_value_string(attributes, num_attributes, FONT_FACE_NAME_ATTR); + if (!face_name.empty()) fp.face_name = face_name; + std::string style = get_attribute_value_string(attributes, num_attributes, FONT_STYLE_ATTR); + if (!style.empty()) fp.style = style; + std::string weight = get_attribute_value_string(attributes, num_attributes, FONT_WEIGHT_ATTR); + if (!weight.empty()) fp.weight = weight; + + std::string style_name = get_attribute_value_string(attributes, num_attributes, STYLE_NAME_ATTR); + std::string font_descriptor = get_attribute_value_string(attributes, num_attributes, FONT_DESCRIPTOR_ATTR); + std::string type_str = get_attribute_value_string(attributes, num_attributes, FONT_DESCRIPTOR_TYPE_ATTR); + EmbossStyle::Type type = TextConfigurationSerialization::get_type(type_str); + EmbossStyle fi{ style_name, std::move(font_descriptor), type, std::move(fp) }; + + std::string text = get_attribute_value_string(attributes, num_attributes, TEXT_DATA_ATTR); + + std::optional fix_tr_mat; + std::string fix_tr_mat_str = get_attribute_value_string(attributes, num_attributes, TRANSFORM_ATTR); + if (!fix_tr_mat_str.empty()) { + fix_tr_mat = get_transform_from_3mf_specs_string(fix_tr_mat_str); + } + + return TextConfiguration{std::move(fi), std::move(text), std::move(fix_tr_mat)}; +} + + } // namespace Slic3r diff --git a/src/libslic3r/Format/AMF.cpp b/src/libslic3r/Format/AMF.cpp index 235cdecb5bc..c72855c8855 100644 --- a/src/libslic3r/Format/AMF.cpp +++ b/src/libslic3r/Format/AMF.cpp @@ -57,10 +57,6 @@ const char* SLIC3R_CONFIG_TYPE = "slic3rpe_config"; namespace Slic3r { -//! macro used to mark string used at localization, -//! return same string -#define L(s) (s) -#define _(s) Slic3r::I18N::translate(s) struct AMFParserContext { @@ -283,25 +279,28 @@ void AMFParserContext::startElement(const char *name, const char **atts) m_value[0] = type; node_type_new = NODE_TYPE_METADATA; } - } else if (strcmp(name, "material") == 0) { + } + else if (strcmp(name, "material") == 0) { const char *material_id = get_attribute(atts, "id"); m_material = m_model.add_material((material_id == nullptr) ? "_" : material_id); node_type_new = NODE_TYPE_MATERIAL; - } else if (strcmp(name, "object") == 0) { + } + else if (strcmp(name, "object") == 0) { const char *object_id = get_attribute(atts, "id"); if (object_id == nullptr) this->stop(); else { assert(m_object_vertices.empty()); m_object = m_model.add_object(); + m_object->name = std::string(object_id); m_object_instances_map[object_id].idx = int(m_model.objects.size())-1; node_type_new = NODE_TYPE_OBJECT; } - } else if (strcmp(name, "constellation") == 0) { + } + else if (strcmp(name, "constellation") == 0) node_type_new = NODE_TYPE_CONSTELLATION; - } else if (strcmp(name, "custom_gcodes_per_height") == 0) { + else if (strcmp(name, "custom_gcodes_per_height") == 0) node_type_new = NODE_TYPE_CUSTOM_GCODE; - } break; case 2: if (strcmp(name, "metadata") == 0) { @@ -309,12 +308,14 @@ void AMFParserContext::startElement(const char *name, const char **atts) m_value[0] = get_attribute(atts, "type"); node_type_new = NODE_TYPE_METADATA; } - } else if (strcmp(name, "layer_config_ranges") == 0 && m_path[1] == NODE_TYPE_OBJECT) + } + else if (strcmp(name, "layer_config_ranges") == 0 && m_path[1] == NODE_TYPE_OBJECT) node_type_new = NODE_TYPE_LAYER_CONFIG; else if (strcmp(name, "mesh") == 0) { if (m_path[1] == NODE_TYPE_OBJECT) node_type_new = NODE_TYPE_MESH; - } else if (strcmp(name, "instance") == 0) { + } + else if (strcmp(name, "instance") == 0) { if (m_path[1] == NODE_TYPE_CONSTELLATION) { const char *object_id = get_attribute(atts, "objectid"); if (object_id == nullptr) @@ -652,11 +653,12 @@ void AMFParserContext::endElement(const char * /* name */) if (bool has_transform = !m_volume_transform.isApprox(Transform3d::Identity(), 1e-10); has_transform) m_volume->source.transform = Slic3r::Geometry::Transformation(m_volume_transform); - if (m_volume->source.input_file.empty() && (m_volume->type() == ModelVolumeType::MODEL_PART)) { + if (m_volume->source.input_file.empty()) { m_volume->source.object_idx = (int)m_model.objects.size() - 1; m_volume->source.volume_idx = (int)m_model.objects.back()->volumes.size() - 1; m_volume->center_geometry_after_creation(); - } else + } + else // pass false if the mesh offset has been already taken from the data m_volume->center_geometry_after_creation(m_volume->source.input_file.empty()); @@ -787,46 +789,42 @@ void AMFParserContext::endElement(const char * /* name */) // Is this volume a modifier volume? // "modifier" flag comes first in the XML file, so it may be later overwritten by the "type" flag. m_volume->set_type((atoi(m_value[1].c_str()) == 1) ? ModelVolumeType::PARAMETER_MODIFIER : ModelVolumeType::MODEL_PART); - } else if (strcmp(opt_key, "volume_type") == 0) { - m_volume->set_type(ModelVolume::type_from_string(m_value[1])); } - else if (strcmp(opt_key, "matrix") == 0) { + else if (strcmp(opt_key, "volume_type") == 0) + m_volume->set_type(ModelVolume::type_from_string(m_value[1])); + else if (strcmp(opt_key, "matrix") == 0) m_volume_transform = Slic3r::Geometry::transform3d_from_string(m_value[1]); - } - else if (strcmp(opt_key, "source_file") == 0) { + else if (strcmp(opt_key, "source_file") == 0) m_volume->source.input_file = m_value[1]; - } - else if (strcmp(opt_key, "source_object_id") == 0) { + else if (strcmp(opt_key, "source_object_id") == 0) m_volume->source.object_idx = ::atoi(m_value[1].c_str()); - } - else if (strcmp(opt_key, "source_volume_id") == 0) { + else if (strcmp(opt_key, "source_volume_id") == 0) m_volume->source.volume_idx = ::atoi(m_value[1].c_str()); - } - else if (strcmp(opt_key, "source_offset_x") == 0) { - m_volume->source.mesh_offset(0) = ::atof(m_value[1].c_str()); - } - else if (strcmp(opt_key, "source_offset_y") == 0) { - m_volume->source.mesh_offset(1) = ::atof(m_value[1].c_str()); - } - else if (strcmp(opt_key, "source_offset_z") == 0) { - m_volume->source.mesh_offset(2) = ::atof(m_value[1].c_str()); - } - else if (strcmp(opt_key, "source_in_inches") == 0) { + else if (strcmp(opt_key, "source_offset_x") == 0) + m_volume->source.mesh_offset.x() = ::atof(m_value[1].c_str()); + else if (strcmp(opt_key, "source_offset_y") == 0) + m_volume->source.mesh_offset.y() = ::atof(m_value[1].c_str()); + else if (strcmp(opt_key, "source_offset_z") == 0) + m_volume->source.mesh_offset.z() = ::atof(m_value[1].c_str()); + else if (strcmp(opt_key, "source_in_inches") == 0) m_volume->source.is_converted_from_inches = m_value[1] == "1"; - } - else if (strcmp(opt_key, "source_in_meters") == 0) { + else if (strcmp(opt_key, "source_in_meters") == 0) m_volume->source.is_converted_from_meters = m_value[1] == "1"; - } + else if (strcmp(opt_key, "source_is_builtin_volume") == 0) + m_volume->source.is_from_builtin_objects = m_value[1] == "1"; } - } else if (m_path.size() == 3) { + } + else if (m_path.size() == 3) { if (m_path[1] == NODE_TYPE_MATERIAL) { if (m_material) m_material->attributes[m_value[0]] = m_value[1]; - } else if (m_path[1] == NODE_TYPE_OBJECT) { + } + else if (m_path[1] == NODE_TYPE_OBJECT) { if (m_object && m_value[0] == "name") m_object->name = std::move(m_value[1]); } - } else if (m_path.size() == 5 && m_path[3] == NODE_TYPE_VOLUME) { + } + else if (m_path.size() == 5 && m_path[3] == NODE_TYPE_VOLUME) { if (m_volume && m_value[0] == "name") m_volume->name = std::move(m_value[1]); } @@ -910,12 +908,17 @@ bool load_amf_file(const char *path, DynamicPrintConfig *config, ConfigSubstitut if (result) ctx.endDocument(); - for (ModelObject* o : model->objects) - { - for (ModelVolume* v : o->volumes) - { - if (v->source.input_file.empty() && (v->type() == ModelVolumeType::MODEL_PART)) + for (ModelObject* o : model->objects) { + unsigned int counter = 0; + for (ModelVolume* v : o->volumes) { + ++counter; + if (v->source.input_file.empty()) v->source.input_file = path; + if (v->name.empty()) { + v->name = o->name; + if (o->volumes.size() > 1) + v->name += "_" + std::to_string(counter); + } } } @@ -958,7 +961,7 @@ bool extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_fi try { - res = mz_zip_reader_extract_file_to_callback(&archive, stat.m_filename, [](void* pOpaque, mz_uint64 file_ofs, const void* pBuf, size_t n)->size_t { + res = mz_zip_reader_extract_to_callback(&archive, stat.m_file_index, [](void* pOpaque, mz_uint64 file_ofs, const void* pBuf, size_t n)->size_t { CallbackData* data = (CallbackData*)pOpaque; if (!XML_Parse(data->parser, (const char*)pBuf, (int)n, (file_ofs + n == data->stat.m_uncomp_size) ? 1 : 0) || data->ctx.error()) { @@ -990,7 +993,7 @@ bool extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_fi { // std::string msg = _(L("The selected amf file has been saved with a newer version of " + std::string(SLIC3R_APP_NAME) + " and is not compatible.")); // throw Slic3r::FileIOError(msg.c_str()); - const std::string msg = (boost::format(_(L("The selected amf file has been saved with a newer version of %1% and is not compatible."))) % std::string(SLIC3R_APP_NAME)).str(); + const std::string msg = (boost::format(_u8L("The selected amf file has been saved with a newer version of %1% and is not compatible.")) % std::string(SLIC3R_APP_NAME)).str(); throw Slic3r::FileIOError(msg); } @@ -1058,7 +1061,7 @@ bool load_amf_archive(const char* path, DynamicPrintConfig* config, ConfigSubsti for (ModelObject *o : model->objects) for (ModelVolume *v : o->volumes) - if (v->source.input_file.empty() && (v->type() == ModelVolumeType::MODEL_PART)) + if (v->source.input_file.empty()) v->source.input_file = path; return true; @@ -1227,18 +1230,15 @@ bool store_amf(const char* path, Model* model, const DynamicPrintConfig* config, stream << " "; const Transform3d& matrix = volume->get_matrix() * volume->source.transform.get_matrix(); stream << std::setprecision(std::numeric_limits::max_digits10); - for (int r = 0; r < 4; ++r) - { - for (int c = 0; c < 4; ++c) - { + for (int r = 0; r < 4; ++r) { + for (int c = 0; c < 4; ++c) { stream << matrix(r, c); - if ((r != 3) || (c != 3)) + if (r != 3 || c != 3) stream << " "; } } stream << "\n"; - if (!volume->source.input_file.empty()) - { + if (!volume->source.input_file.empty()) { std::string input_file = xml_escape(fullpath_sources ? volume->source.input_file : boost::filesystem::path(volume->source.input_file).filename().string()); stream << " " << input_file << "\n"; stream << " " << volume->source.object_idx << "\n"; @@ -1252,12 +1252,14 @@ bool store_amf(const char* path, Model* model, const DynamicPrintConfig* config, stream << " 1\n"; else if (volume->source.is_converted_from_meters) stream << " 1\n"; - stream << std::setprecision(std::numeric_limits::max_digits10); + if (volume->source.is_from_builtin_objects) + stream << " 1\n"; + stream << std::setprecision(std::numeric_limits::max_digits10); const indexed_triangle_set &its = volume->mesh().its; for (size_t i = 0; i < its.indices.size(); ++i) { stream << " \n"; for (int j = 0; j < 3; ++j) - stream << " " << its.indices[i][j] + vertices_offset << "\n"; + stream << " " << its.indices[i][j] + vertices_offset << "\n"; stream << " \n"; } stream << " \n"; diff --git a/src/libslic3r/Format/SL1.cpp b/src/libslic3r/Format/SL1.cpp index d44d0ae115c..4a5a25b08c2 100644 --- a/src/libslic3r/Format/SL1.cpp +++ b/src/libslic3r/Format/SL1.cpp @@ -1,356 +1,37 @@ #include "SL1.hpp" -#include "GCode/ThumbnailData.hpp" -#include "libslic3r/Time.hpp" #include #include -#include "libslic3r/Zipper.hpp" -#include "libslic3r/SLAPrint.hpp" - #include +#include "libslic3r/Time.hpp" +#include "libslic3r/Zipper.hpp" +#include "libslic3r/SLAPrint.hpp" #include "libslic3r/Exception.hpp" -#include "libslic3r/SlicesToTriangleMesh.hpp" -#include "libslic3r/MarchingSquares.hpp" -#include "libslic3r/ClipperUtils.hpp" #include "libslic3r/MTUtils.hpp" #include "libslic3r/PrintConfig.hpp" -#include "libslic3r/SLA/RasterBase.hpp" + #include "libslic3r/miniz_extension.hpp" -#include "libslic3r/PNGReadWrite.hpp" #include "libslic3r/LocalesUtils.hpp" +#include "libslic3r/GCode/ThumbnailData.hpp" -#include -#include -#include +#include "SLAArchiveReader.hpp" +#include "ZipperArchiveImport.hpp" -namespace marchsq { - -template<> struct _RasterTraits { - using Rst = Slic3r::png::ImageGreyscale; - - // The type of pixel cell in the raster - using ValueType = uint8_t; - - // Value at a given position - static uint8_t get(const Rst &rst, size_t row, size_t col) - { - return rst.get(row, col); - } +#include "libslic3r/MarchingSquares.hpp" +#include "libslic3r/PNGReadWrite.hpp" +#include "libslic3r/ClipperUtils.hpp" +#include "libslic3r/Execution/ExecutionTBB.hpp" - // Number of rows and cols of the raster - static size_t rows(const Rst &rst) { return rst.rows; } - static size_t cols(const Rst &rst) { return rst.cols; } -}; +#include "libslic3r/SLA/RasterBase.hpp" -} // namespace marchsq +#include +#include +#include namespace Slic3r { -namespace { - -struct PNGBuffer { std::vector buf; std::string fname; }; -struct ArchiveData { - boost::property_tree::ptree profile, config; - std::vector images; -}; - -static const constexpr char *CONFIG_FNAME = "config.ini"; -static const constexpr char *PROFILE_FNAME = "prusaslicer.ini"; - -boost::property_tree::ptree read_ini(const mz_zip_archive_file_stat &entry, - MZ_Archive & zip) -{ - std::string buf(size_t(entry.m_uncomp_size), '\0'); - - if (!mz_zip_reader_extract_file_to_mem(&zip.arch, entry.m_filename, - buf.data(), buf.size(), 0)) - throw Slic3r::FileIOError(zip.get_errorstr()); - - boost::property_tree::ptree tree; - std::stringstream ss(buf); - boost::property_tree::read_ini(ss, tree); - return tree; -} - -PNGBuffer read_png(const mz_zip_archive_file_stat &entry, - MZ_Archive & zip, - const std::string & name) -{ - std::vector buf(entry.m_uncomp_size); - - if (!mz_zip_reader_extract_file_to_mem(&zip.arch, entry.m_filename, - buf.data(), buf.size(), 0)) - throw Slic3r::FileIOError(zip.get_errorstr()); - - return {std::move(buf), (name.empty() ? entry.m_filename : name)}; -} - -ArchiveData extract_sla_archive(const std::string &zipfname, - const std::string &exclude) -{ - ArchiveData arch; - - // Little RAII - struct Arch: public MZ_Archive { - Arch(const std::string &fname) { - if (!open_zip_reader(&arch, fname)) - throw Slic3r::FileIOError(get_errorstr()); - } - - ~Arch() { close_zip_reader(&arch); } - } zip (zipfname); - - mz_uint num_entries = mz_zip_reader_get_num_files(&zip.arch); - - for (mz_uint i = 0; i < num_entries; ++i) - { - mz_zip_archive_file_stat entry; - - if (mz_zip_reader_file_stat(&zip.arch, i, &entry)) - { - std::string name = entry.m_filename; - boost::algorithm::to_lower(name); - - if (boost::algorithm::contains(name, exclude)) continue; - - if (name == CONFIG_FNAME) arch.config = read_ini(entry, zip); - if (name == PROFILE_FNAME) arch.profile = read_ini(entry, zip); - - if (boost::filesystem::path(name).extension().string() == ".png") { - auto it = std::lower_bound( - arch.images.begin(), arch.images.end(), PNGBuffer{{}, name}, - [](const PNGBuffer &r1, const PNGBuffer &r2) { - return std::less()(r1.fname, r2.fname); - }); - - arch.images.insert(it, read_png(entry, zip, name)); - } - } - } - - return arch; -} - -ExPolygons rings_to_expolygons(const std::vector &rings, - double px_w, double px_h) -{ - auto polys = reserve_vector(rings.size()); - - for (const marchsq::Ring &ring : rings) { - Polygon poly; Points &pts = poly.points; - pts.reserve(ring.size()); - - for (const marchsq::Coord &crd : ring) - pts.emplace_back(scaled(crd.c * px_w), scaled(crd.r * px_h)); - - polys.emplace_back(poly); - } - - // TODO: Is a union necessary? - return union_ex(polys); -} - -template void foreach_vertex(ExPolygon &poly, Fn &&fn) -{ - for (auto &p : poly.contour.points) fn(p); - for (auto &h : poly.holes) - for (auto &p : h.points) fn(p); -} - -void invert_raster_trafo(ExPolygons & expolys, - const sla::RasterBase::Trafo &trafo, - coord_t width, - coord_t height) -{ - if (trafo.flipXY) std::swap(height, width); - - for (auto &expoly : expolys) { - if (trafo.mirror_y) - foreach_vertex(expoly, [height](Point &p) {p.y() = height - p.y(); }); - - if (trafo.mirror_x) - foreach_vertex(expoly, [width](Point &p) {p.x() = width - p.x(); }); - - expoly.translate(-trafo.center_x, -trafo.center_y); - - if (trafo.flipXY) - foreach_vertex(expoly, [](Point &p) { std::swap(p.x(), p.y()); }); - - if ((trafo.mirror_x + trafo.mirror_y + trafo.flipXY) % 2) { - expoly.contour.reverse(); - for (auto &h : expoly.holes) h.reverse(); - } - } -} - -struct RasterParams { - sla::RasterBase::Trafo trafo; // Raster transformations - coord_t width, height; // scaled raster dimensions (not resolution) - double px_h, px_w; // pixel dimesions - marchsq::Coord win; // marching squares window size -}; - -RasterParams get_raster_params(const DynamicPrintConfig &cfg) -{ - auto *opt_disp_cols = cfg.option("display_pixels_x"); - auto *opt_disp_rows = cfg.option("display_pixels_y"); - auto *opt_disp_w = cfg.option("display_width"); - auto *opt_disp_h = cfg.option("display_height"); - auto *opt_mirror_x = cfg.option("display_mirror_x"); - auto *opt_mirror_y = cfg.option("display_mirror_y"); - auto *opt_orient = cfg.option>("display_orientation"); - - if (!opt_disp_cols || !opt_disp_rows || !opt_disp_w || !opt_disp_h || - !opt_mirror_x || !opt_mirror_y || !opt_orient) - throw MissingProfileError("Invalid SL1 / SL1S file"); - - RasterParams rstp; - - rstp.px_w = opt_disp_w->value / (opt_disp_cols->value - 1); - rstp.px_h = opt_disp_h->value / (opt_disp_rows->value - 1); - - rstp.trafo = sla::RasterBase::Trafo{opt_orient->value == sladoLandscape ? - sla::RasterBase::roLandscape : - sla::RasterBase::roPortrait, - {opt_mirror_x->value, opt_mirror_y->value}}; - - rstp.height = scaled(opt_disp_h->value); - rstp.width = scaled(opt_disp_w->value); - - return rstp; -} - -struct SliceParams { double layerh = 0., initial_layerh = 0.; }; - -SliceParams get_slice_params(const DynamicPrintConfig &cfg) -{ - auto *opt_layerh = cfg.option("layer_height"); - auto *opt_init_layerh = cfg.option("initial_layer_height"); - - if (!opt_layerh || !opt_init_layerh) - throw MissingProfileError("Invalid SL1 / SL1S file"); - - return SliceParams{opt_layerh->getFloat(), opt_init_layerh->getFloat()}; -} - -std::vector extract_slices_from_sla_archive( - ArchiveData & arch, - const RasterParams & rstp, - std::function progr) -{ - auto jobdir = arch.config.get("jobDir"); - for (auto &c : jobdir) c = std::tolower(c); - - std::vector slices(arch.images.size()); - - struct Status - { - double incr, val, prev; - bool stop = false; - tbb::spin_mutex mutex = {}; - } st {100. / slices.size(), 0., 0.}; - - tbb::parallel_for(size_t(0), arch.images.size(), - [&arch, &slices, &st, &rstp, progr](size_t i) { - // Status indication guarded with the spinlock - { - std::lock_guard lck(st.mutex); - if (st.stop) return; - - st.val += st.incr; - double curr = std::round(st.val); - if (curr > st.prev) { - st.prev = curr; - st.stop = !progr(int(curr)); - } - } - - png::ImageGreyscale img; - png::ReadBuf rb{arch.images[i].buf.data(), arch.images[i].buf.size()}; - if (!png::decode_png(rb, img)) return; - - uint8_t isoval = 128; - auto rings = marchsq::execute(img, isoval, rstp.win); - ExPolygons expolys = rings_to_expolygons(rings, rstp.px_w, rstp.px_h); - - // Invert the raster transformations indicated in the profile metadata - invert_raster_trafo(expolys, rstp.trafo, rstp.width, rstp.height); - - slices[i] = std::move(expolys); - }); - - if (st.stop) slices = {}; - - return slices; -} - -} // namespace - -ConfigSubstitutions import_sla_archive(const std::string &zipfname, DynamicPrintConfig &out) -{ - ArchiveData arch = extract_sla_archive(zipfname, "png"); - return out.load(arch.profile, ForwardCompatibilitySubstitutionRule::Enable); -} - -// If the profile is missing from the archive (older PS versions did not have -// it), profile_out's initial value will be used as fallback. profile_out will be empty on -// function return if the archive did not contain any profile. -ConfigSubstitutions import_sla_archive( - const std::string & zipfname, - Vec2i windowsize, - indexed_triangle_set & out, - DynamicPrintConfig & profile_out, - std::function progr) -{ - // Ensure minimum window size for marching squares - windowsize.x() = std::max(2, windowsize.x()); - windowsize.y() = std::max(2, windowsize.y()); - - std::string exclude_entries{"thumbnail"}; - ArchiveData arch = extract_sla_archive(zipfname, exclude_entries); - DynamicPrintConfig profile_in, profile_use; - ConfigSubstitutions config_substitutions = - profile_in.load(arch.profile, - ForwardCompatibilitySubstitutionRule::Enable); - - if (profile_in.empty()) { // missing profile... do guess work - // try to recover the layer height from the config.ini which was - // present in all versions of sl1 files. - if (auto lh_opt = arch.config.find("layerHeight"); - lh_opt != arch.config.not_found()) - { - auto lh_str = lh_opt->second.data(); - - size_t pos; - double lh = string_to_double_decimal_point(lh_str, &pos); - if (pos) { // TODO: verify that pos is 0 when parsing fails - profile_out.set("layer_height", lh); - profile_out.set("initial_layer_height", lh); - } - } - } - - // If the archive contains an empty profile, use the one that was passed as output argument - // then replace it with the readed profile to report that it was empty. - profile_use = profile_in.empty() ? profile_out : profile_in; - profile_out = profile_in; - - RasterParams rstp = get_raster_params(profile_use); - rstp.win = {windowsize.y(), windowsize.x()}; - - SliceParams slicp = get_slice_params(profile_use); - - std::vector slices = - extract_slices_from_sla_archive(arch, rstp, progr); - - if (!slices.empty()) - out = slices_to_mesh(slices, 0, slicp.layerh, slicp.initial_layerh); - - return config_substitutions; -} - using ConfMap = std::map; namespace { @@ -447,8 +128,8 @@ void fill_slicerconf(ConfMap &m, const SLAPrint &print) std::unique_ptr SL1Archive::create_raster() const { - sla::RasterBase::Resolution res; - sla::RasterBase::PixelDim pxdim; + sla::Resolution res; + sla::PixelDim pxdim; std::array mirror; double w = m_cfg.display_width.getFloat(); @@ -469,8 +150,8 @@ std::unique_ptr SL1Archive::create_raster() const std::swap(pw, ph); } - res = sla::RasterBase::Resolution{pw, ph}; - pxdim = sla::RasterBase::PixelDim{w / pw, h / ph}; + res = sla::Resolution{pw, ph}; + pxdim = sla::PixelDim{w / pw, h / ph}; sla::RasterBase::Trafo tr{orientation, mirror}; double gamma = m_cfg.gamma_correction.getFloat(); @@ -483,18 +164,37 @@ sla::RasterEncoder SL1Archive::get_encoder() const return sla::PNGRasterEncoder{}; } -void SL1Archive::export_print(Zipper& zipper, - const SLAPrint &print, - const std::string &prjname) +static void write_thumbnail(Zipper &zipper, const ThumbnailData &data) +{ + size_t png_size = 0; + + void *png_data = tdefl_write_image_to_png_file_in_memory_ex( + (const void *) data.pixels.data(), data.width, data.height, 4, + &png_size, MZ_DEFAULT_LEVEL, 1); + + if (png_data != nullptr) { + zipper.add_entry("thumbnail/thumbnail" + std::to_string(data.width) + + "x" + std::to_string(data.height) + ".png", + static_cast(png_data), + png_size); + + mz_free(png_data); + } +} + +void SL1Archive::export_print(Zipper &zipper, + const SLAPrint &print, + const ThumbnailsList &thumbnails, + const std::string &prjname) { std::string project = prjname.empty() ? boost::filesystem::path(zipper.get_filename()).stem().string() : prjname; - + ConfMap iniconf, slicerconf; fill_iniconf(iniconf, print); - + iniconf["jobDir"] = project; fill_slicerconf(slicerconf, print); @@ -504,15 +204,21 @@ void SL1Archive::export_print(Zipper& zipper, zipper << to_ini(iniconf); zipper.add_entry("prusaslicer.ini"); zipper << to_ini(slicerconf); - + size_t i = 0; for (const sla::EncodedRaster &rst : m_layers) { std::string imgname = project + string_printf("%.5d", i++) + "." + rst.extension(); - + zipper.add_entry(imgname.c_str(), rst.data(), rst.size()); } + + for (const ThumbnailData& data : thumbnails) + if (data.is_valid()) + write_thumbnail(zipper, data); + + zipper.finalize(); } catch(std::exception& e) { BOOST_LOG_TRIVIAL(error) << e.what(); // Rethrow the exception @@ -520,4 +226,218 @@ void SL1Archive::export_print(Zipper& zipper, } } +void SL1Archive::export_print(const std::string fname, + const SLAPrint &print, + const ThumbnailsList &thumbnails, + const std::string &prjname) +{ + Zipper zipper{fname, Zipper::FAST_COMPRESSION}; + + export_print(zipper, print, thumbnails, prjname); +} + +} // namespace Slic3r + +// ///////////////////////////////////////////////////////////////////////////// +// Reader implementation +// ///////////////////////////////////////////////////////////////////////////// + +namespace marchsq { + +template<> struct _RasterTraits { + using Rst = Slic3r::png::ImageGreyscale; + + // The type of pixel cell in the raster + using ValueType = uint8_t; + + // Value at a given position + static uint8_t get(const Rst &rst, size_t row, size_t col) + { + return rst.get(row, col); + } + + // Number of rows and cols of the raster + static size_t rows(const Rst &rst) { return rst.rows; } + static size_t cols(const Rst &rst) { return rst.cols; } +}; + +} // namespace marchsq + +namespace Slic3r { + +template static void foreach_vertex(ExPolygon &poly, Fn &&fn) +{ + for (auto &p : poly.contour.points) fn(p); + for (auto &h : poly.holes) + for (auto &p : h.points) fn(p); +} + +void invert_raster_trafo(ExPolygons & expolys, + const sla::RasterBase::Trafo &trafo, + coord_t width, + coord_t height) +{ + if (trafo.flipXY) std::swap(height, width); + + for (auto &expoly : expolys) { + if (trafo.mirror_y) + foreach_vertex(expoly, [height](Point &p) {p.y() = height - p.y(); }); + + if (trafo.mirror_x) + foreach_vertex(expoly, [width](Point &p) {p.x() = width - p.x(); }); + + expoly.translate(-trafo.center_x, -trafo.center_y); + + if (trafo.flipXY) + foreach_vertex(expoly, [](Point &p) { std::swap(p.x(), p.y()); }); + + if ((trafo.mirror_x + trafo.mirror_y + trafo.flipXY) % 2) { + expoly.contour.reverse(); + for (auto &h : expoly.holes) h.reverse(); + } + } +} + +RasterParams get_raster_params(const DynamicPrintConfig &cfg) +{ + auto *opt_disp_cols = cfg.option("display_pixels_x"); + auto *opt_disp_rows = cfg.option("display_pixels_y"); + auto *opt_disp_w = cfg.option("display_width"); + auto *opt_disp_h = cfg.option("display_height"); + auto *opt_mirror_x = cfg.option("display_mirror_x"); + auto *opt_mirror_y = cfg.option("display_mirror_y"); + auto *opt_orient = cfg.option>("display_orientation"); + + if (!opt_disp_cols || !opt_disp_rows || !opt_disp_w || !opt_disp_h || + !opt_mirror_x || !opt_mirror_y || !opt_orient) + throw MissingProfileError("Invalid SL1 / SL1S file"); + + RasterParams rstp; + + rstp.px_w = opt_disp_w->value / (opt_disp_cols->value - 1); + rstp.px_h = opt_disp_h->value / (opt_disp_rows->value - 1); + + rstp.trafo = sla::RasterBase::Trafo{opt_orient->value == sladoLandscape ? + sla::RasterBase::roLandscape : + sla::RasterBase::roPortrait, + {opt_mirror_x->value, opt_mirror_y->value}}; + + rstp.height = scaled(opt_disp_h->value); + rstp.width = scaled(opt_disp_w->value); + + return rstp; +} + +namespace { + +ExPolygons rings_to_expolygons(const std::vector &rings, + double px_w, double px_h) +{ + auto polys = reserve_vector(rings.size()); + + for (const marchsq::Ring &ring : rings) { + Polygon poly; Points &pts = poly.points; + pts.reserve(ring.size()); + + for (const marchsq::Coord &crd : ring) + pts.emplace_back(scaled(crd.c * px_w), scaled(crd.r * px_h)); + + polys.emplace_back(poly); + } + + // TODO: Is a union necessary? + return union_ex(polys); +} + +std::vector extract_slices_from_sla_archive( + ZipperArchive &arch, + const RasterParams &rstp, + const marchsq::Coord &win, + std::function progr) +{ + std::vector slices(arch.entries.size()); + + struct Status + { + double incr, val, prev; + bool stop = false; + execution::SpinningMutex mutex = {}; + } st{100. / slices.size(), 0., 0.}; + + execution::for_each( + ex_tbb, size_t(0), arch.entries.size(), + [&arch, &slices, &st, &rstp, &win, progr](size_t i) { + // Status indication guarded with the spinlock + { + std::lock_guard lck(st.mutex); + if (st.stop) return; + + st.val += st.incr; + double curr = std::round(st.val); + if (curr > st.prev) { + st.prev = curr; + st.stop = !progr(int(curr)); + } + } + + png::ImageGreyscale img; + png::ReadBuf rb{arch.entries[i].buf.data(), + arch.entries[i].buf.size()}; + if (!png::decode_png(rb, img)) return; + + constexpr uint8_t isoval = 128; + auto rings = marchsq::execute(img, isoval, win); + ExPolygons expolys = rings_to_expolygons(rings, rstp.px_w, + rstp.px_h); + + // Invert the raster transformations indicated in the profile metadata + invert_raster_trafo(expolys, rstp.trafo, rstp.width, rstp.height); + + slices[i] = std::move(expolys); + }, + execution::max_concurrency(ex_tbb)); + + if (st.stop) slices = {}; + + return slices; +} + +} // namespace + +ConfigSubstitutions SL1Reader::read(std::vector &slices, + DynamicPrintConfig &profile_out) +{ + Vec2i windowsize; + + switch(m_quality) + { + case SLAImportQuality::Fast: windowsize = {8, 8}; break; + case SLAImportQuality::Balanced: windowsize = {4, 4}; break; + default: + case SLAImportQuality::Accurate: + windowsize = {2, 2}; break; + }; + + // Ensure minimum window size for marching squares + windowsize.x() = std::max(2, windowsize.x()); + windowsize.y() = std::max(2, windowsize.y()); + + std::vector includes = { "ini", "png"}; + std::vector excludes = { "thumbnail" }; + ZipperArchive arch = read_zipper_archive(m_fname, includes, excludes); + auto [profile_use, config_substitutions] = extract_profile(arch, profile_out); + + RasterParams rstp = get_raster_params(profile_use); + marchsq::Coord win = {windowsize.y(), windowsize.x()}; + slices = extract_slices_from_sla_archive(arch, rstp, win, m_progr); + + return std::move(config_substitutions); +} + +ConfigSubstitutions SL1Reader::read(DynamicPrintConfig &out) +{ + ZipperArchive arch = read_zipper_archive(m_fname, {}, {"png"}); + return out.load(arch.profile, ForwardCompatibilitySubstitutionRule::Enable); +} + } // namespace Slic3r diff --git a/src/libslic3r/Format/SL1.hpp b/src/libslic3r/Format/SL1.hpp index 46a82e1b85f..6c7a903a63a 100644 --- a/src/libslic3r/Format/SL1.hpp +++ b/src/libslic3r/Format/SL1.hpp @@ -3,61 +3,75 @@ #include +#include "SLAArchiveWriter.hpp" +#include "SLAArchiveReader.hpp" + #include "libslic3r/Zipper.hpp" -#include "libslic3r/SLAPrint.hpp" +#include "libslic3r/PrintConfig.hpp" namespace Slic3r { -class SL1Archive: public SLAArchive { +class SL1Archive: public SLAArchiveWriter { SLAPrinterConfig m_cfg; protected: std::unique_ptr create_raster() const override; sla::RasterEncoder get_encoder() const override; + SLAPrinterConfig & cfg() { return m_cfg; } + const SLAPrinterConfig & cfg() const { return m_cfg; } + + void export_print(Zipper &, + const SLAPrint &print, + const ThumbnailsList &thumbnails, + const std::string &projectname); + public: - + SL1Archive() = default; explicit SL1Archive(const SLAPrinterConfig &cfg): m_cfg(cfg) {} explicit SL1Archive(SLAPrinterConfig &&cfg): m_cfg(std::move(cfg)) {} - - void export_print(Zipper &zipper, const SLAPrint &print, const std::string &projectname = ""); - void export_print(const std::string &fname, const SLAPrint &print, const std::string &projectname = "") - { - Zipper zipper(fname); - export_print(zipper, print, projectname); - } - - void apply(const SLAPrinterConfig &cfg) override - { - auto diff = m_cfg.diff(cfg); - if (!diff.empty()) { - m_cfg.apply_only(cfg, diff); - m_layers = {}; - } - } + + void export_print(const std::string fname, + const SLAPrint &print, + const ThumbnailsList &thumbnails, + const std::string &projectname = "") override; }; - -ConfigSubstitutions import_sla_archive(const std::string &zipfname, DynamicPrintConfig &out); - -ConfigSubstitutions import_sla_archive( - const std::string & zipfname, - Vec2i windowsize, - indexed_triangle_set & out, - DynamicPrintConfig & profile, - std::function progr = [](int) { return true; }); - -inline ConfigSubstitutions import_sla_archive( - const std::string & zipfname, - Vec2i windowsize, - indexed_triangle_set & out, - std::function progr = [](int) { return true; }) -{ - DynamicPrintConfig profile; - return import_sla_archive(zipfname, windowsize, out, profile, progr); -} - -class MissingProfileError : public RuntimeError { using RuntimeError::RuntimeError; }; + +class SL1Reader: public SLAArchiveReader { + SLAImportQuality m_quality = SLAImportQuality::Balanced; + std::function m_progr; + std::string m_fname; + +public: + // If the profile is missing from the archive (older PS versions did not have + // it), profile_out's initial value will be used as fallback. profile_out will be empty on + // function return if the archive did not contain any profile. + ConfigSubstitutions read(std::vector &slices, + DynamicPrintConfig &profile_out) override; + + ConfigSubstitutions read(DynamicPrintConfig &profile) override; + + SL1Reader() = default; + SL1Reader(const std::string &fname, + SLAImportQuality quality, + std::function progr) + : m_quality(quality), m_progr(progr), m_fname(fname) + {} +}; + +struct RasterParams { + sla::RasterBase::Trafo trafo; // Raster transformations + coord_t width, height; // scaled raster dimensions (not resolution) + double px_h, px_w; // pixel dimesions +}; + +RasterParams get_raster_params(const DynamicPrintConfig &cfg); + +void invert_raster_trafo(ExPolygons & expolys, + const sla::RasterBase::Trafo &trafo, + coord_t width, + coord_t height); } // namespace Slic3r::sla diff --git a/src/libslic3r/Format/SL1_SVG.cpp b/src/libslic3r/Format/SL1_SVG.cpp new file mode 100644 index 00000000000..f8b93a8bac1 --- /dev/null +++ b/src/libslic3r/Format/SL1_SVG.cpp @@ -0,0 +1,317 @@ +#include "SL1_SVG.hpp" +#include "SLA/RasterBase.hpp" +#include "libslic3r/LocalesUtils.hpp" +#include "libslic3r/ClipperUtils.hpp" +#include "libslic3r/BoundingBox.hpp" +#include "libslic3r/Format/ZipperArchiveImport.hpp" + +#define NANOSVG_IMPLEMENTATION +#include "nanosvg/nanosvg.h" + +#include +#include +#include +#include +using namespace std::literals; + +namespace Slic3r { + +namespace { + +size_t constexpr coord_t_bufsize = 40; + +// A fast and locale independent implementation of int=>str +char const* decimal_from(coord_t snumber, char* buffer) +{ + std::make_unsigned_t number = 0; + + char* ret = buffer; + + if( snumber < 0 ) { + *buffer++ = '-'; + number = -snumber; + } else + number = snumber; + + if( number == 0 ) { + *buffer++ = '0'; + } else { + char* p_first = buffer; + while( number != 0 ) { + *buffer++ = '0' + number % 10; + number /= 10; + } + std::reverse( p_first, buffer ); + } + + *buffer = '\0'; + + return ret; +} + +inline std::string coord2str(coord_t crd) +{ + char buf[coord_t_bufsize]; + return decimal_from(crd, buf); +} + +// Apply the sla::RasterBase::Trafo onto an ExPolygon +void transform(ExPolygon &ep, const sla::RasterBase::Trafo &tr, const BoundingBox &bb) +{ + if (tr.flipXY) { + for (auto &p : ep.contour.points) std::swap(p.x(), p.y()); + for (auto &h : ep.holes) + for (auto &p : h.points) std::swap(p.x(), p.y()); + } + + if (tr.mirror_x){ + for (auto &p : ep.contour.points) p.x() = bb.max.x() - p.x() + bb.min.x(); + for (auto &h : ep.holes) + for (auto &p : h.points) p.x() = bb.max.x() - p.x() + bb.min.x(); + } + + if (tr.mirror_y){ + for (auto &p : ep.contour.points) p.y() = bb.max.y() - p.y() + bb.min.y(); + for (auto &h : ep.holes) + for (auto &p : h.points) p.y() = bb.max.y() - p.y() + bb.min.y(); + } +} + +// Append the svg string representation of a Polygon to the input 'buf' +void append_svg(std::string &buf, const Polygon &poly) +{ + if (poly.points.empty()) + return; + + Point c = poly.points.front(); + + char intbuf[coord_t_bufsize]; + + buf += "(m_bb.size().x())); + std::string hf = float_to_string_decimal_point(unscaled(m_bb.size().y())); + std::string w = coord2str(coord_t(m_res.width_px)); + std::string h = coord2str(coord_t(m_res.height_px)); + + // Notice the header also defines the fill-rule as nonzero which should + // generate correct results for our ExPolygons. + + // Add svg header. + m_svg = + "\n" + "\n" + "\n"; + } + + void draw(const ExPolygon& poly) override + { + auto cpoly = poly; + + double tol = std::min(m_bb.size().x() / double(m_res.width_px), + m_bb.size().y() / double(m_res.height_px)); + + ExPolygons cpolys = poly.simplify(tol); + + for (auto &cpoly : cpolys) { + transform(cpoly, m_trafo, m_bb); + + for (auto &p : cpoly.contour.points) + p = {std::round(p.x() * m_sc.x()), std::round(p.y() * m_sc.y())}; + + for (auto &h : cpoly.holes) + for (auto &p : h) + p = {std::round(p.x() * m_sc.x()), std::round(p.y() * m_sc.y())}; + + append_svg(m_svg, cpoly.contour); + for (auto &h : cpoly.holes) + append_svg(m_svg, h); + } + } + + Trafo trafo() const override { return m_trafo; } + + // The encoder is ignored here, the svg text does not need any further + // encoding. + sla::EncodedRaster encode(sla::RasterEncoder /*encoder*/) const override + { + std::vector data; + constexpr auto finish = "\n"sv; + + data.reserve(m_svg.size() + std::size(finish)); + + std::copy(m_svg.begin(), m_svg.end(), std::back_inserter(data)); + std::copy(finish.begin(), finish.end() - 1, std::back_inserter(data)); + + return sla::EncodedRaster{std::move(data), "svg"}; + } +}; + +std::unique_ptr SL1_SVGArchive::create_raster() const +{ + auto w = cfg().display_width.getFloat(); + auto h = cfg().display_height.getFloat(); + + float precision_nm = scaled(cfg().sla_output_precision.getFloat()); + auto res_x = size_t(std::round(scaled(w) / precision_nm)); + auto res_y = size_t(std::round(scaled(h) / precision_nm)); + + std::array mirror; + + mirror[X] = cfg().display_mirror_x.getBool(); + mirror[Y] = cfg().display_mirror_y.getBool(); + + auto ro = cfg().display_orientation.getInt(); + sla::RasterBase::Orientation orientation = + ro == sla::RasterBase::roPortrait ? sla::RasterBase::roPortrait : + sla::RasterBase::roLandscape; + + if (orientation == sla::RasterBase::roPortrait) { + std::swap(w, h); + std::swap(res_x, res_y); + } + + BoundingBox svgarea{{0, 0}, {scaled(w), scaled(h)}}; + + sla::RasterBase::Trafo tr{orientation, mirror}; + + // Gamma does not really make sense in an svg, right? + // double gamma = cfg().gamma_correction.getFloat(); + return std::make_unique(svgarea, sla::Resolution{res_x, res_y}, tr); +} + +// SVG does not need additional binary encoding. +sla::RasterEncoder SL1_SVGArchive::get_encoder() const +{ + return nullptr; +} + +void SL1_SVGArchive::export_print(const std::string fname, + const SLAPrint &print, + const ThumbnailsList &thumbnails, + const std::string &projectname) +{ + // Export code is completely identical to SL1, only the compression level + // is elevated, as the SL1 has already compressed PNGs with deflate, + // but the svg is just text. + Zipper zipper{fname, Zipper::TIGHT_COMPRESSION}; + + SL1Archive::export_print(zipper, print, thumbnails, projectname); +} + +struct NanoSVGParser { + NSVGimage *image; + static constexpr const char *Units = "mm"; // Denotes user coordinate system + static constexpr float Dpi = 1.f; // Not needed + explicit NanoSVGParser(char* input): image{nsvgParse(input, Units, Dpi)} {} + ~NanoSVGParser() { nsvgDelete(image); } +}; + +ConfigSubstitutions SL1_SVGReader::read(std::vector &slices, + DynamicPrintConfig &profile_out) +{ + std::vector includes = { CONFIG_FNAME, PROFILE_FNAME, "svg"}; + ZipperArchive arch = read_zipper_archive(m_fname, includes, {}); + auto [profile_use, config_substitutions] = extract_profile(arch, profile_out); + + RasterParams rstp = get_raster_params(profile_use); + + struct Status + { + double incr, val, prev; + bool stop = false; + } st{100. / arch.entries.size(), 0., 0.}; + + for (const EntryBuffer &entry : arch.entries) { + if (st.stop) break; + + st.val += st.incr; + double curr = std::round(st.val); + if (curr > st.prev) { + st.prev = curr; + st.stop = !m_progr(int(curr)); + } + + // Don't want to use dirty casts for the buffer to be usable in + // the NanoSVGParser until performance is not a bottleneck here. + auto svgtxt = reserve_vector(entry.buf.size() + 1); + std::copy(entry.buf.begin(), entry.buf.end(), std::back_inserter(svgtxt)); + svgtxt.emplace_back('\0'); + NanoSVGParser svgp(svgtxt.data()); + + Polygons polys; + for (NSVGshape *shape = svgp.image->shapes; shape != nullptr; shape = shape->next) { + for (NSVGpath *path = shape->paths; path != nullptr; path = path->next) { + Polygon p; + for (int i = 0; i < path->npts; ++i) { + size_t c = 2 * i; + p.points.emplace_back(scaled(Vec2f(path->pts[c], path->pts[c + 1]))); + } + polys.emplace_back(p); + } + } + + // Create the slice from the read polygons. Here, the fill rule has to + // be the same as stated in the svg file which is `nonzero` when exported + // using SL1_SVGArchive. Would be better to parse it from the svg file, + // but if it's different, the file is probably corrupted anyways. + ExPolygons expolys = union_ex(polys, ClipperLib::pftNonZero); + invert_raster_trafo(expolys, rstp.trafo, rstp.width, rstp.height); + slices.emplace_back(expolys); + } + + // Compile error without the move + return std::move(config_substitutions); +} + +ConfigSubstitutions SL1_SVGReader::read(DynamicPrintConfig &out) +{ + ZipperArchive arch = read_zipper_archive(m_fname, {"prusaslicer.ini"}, {}); + return out.load(arch.profile, ForwardCompatibilitySubstitutionRule::Enable); +} + +} // namespace Slic3r diff --git a/src/libslic3r/Format/SL1_SVG.hpp b/src/libslic3r/Format/SL1_SVG.hpp new file mode 100644 index 00000000000..d94a5153a81 --- /dev/null +++ b/src/libslic3r/Format/SL1_SVG.hpp @@ -0,0 +1,48 @@ +#ifndef SL1_SVG_HPP +#define SL1_SVG_HPP + +#include "SL1.hpp" + +namespace Slic3r { + +class SL1_SVGArchive: public SL1Archive { +protected: + + // Override the factory methods to produce svg instead of a real raster. + std::unique_ptr create_raster() const override; + sla::RasterEncoder get_encoder() const override; + +public: + + void export_print(const std::string fname, + const SLAPrint &print, + const ThumbnailsList &thumbnails, + const std::string &projectname = "") override; + + using SL1Archive::SL1Archive; +}; + +class SL1_SVGReader: public SLAArchiveReader { + std::function m_progr; + std::string m_fname; + +public: + // If the profile is missing from the archive (older PS versions did not have + // it), profile_out's initial value will be used as fallback. profile_out will be empty on + // function return if the archive did not contain any profile. + ConfigSubstitutions read(std::vector &slices, + DynamicPrintConfig &profile_out) override; + + ConfigSubstitutions read(DynamicPrintConfig &profile) override; + + SL1_SVGReader() = default; + SL1_SVGReader(const std::string &fname, + SLAImportQuality /*quality*/, + const ProgrFn & progr) + : m_progr(progr), m_fname(fname) + {} +}; + +} // namespace Slic3r + +#endif // SL1_SVG_HPP diff --git a/src/libslic3r/Format/SLAArchiveReader.cpp b/src/libslic3r/Format/SLAArchiveReader.cpp new file mode 100644 index 00000000000..b931ea0e4da --- /dev/null +++ b/src/libslic3r/Format/SLAArchiveReader.cpp @@ -0,0 +1,179 @@ +#include "SLAArchiveReader.hpp" +#include "SL1.hpp" +#include "SL1_SVG.hpp" +#include "I18N.hpp" + +#include "libslic3r/SlicesToTriangleMesh.hpp" + +#include +#include + + +#include +#include + +namespace Slic3r { + +namespace { + +// Factory function that returns an implementation of SLAArchiveReader. +using ArchiveFactory = std::function< + std::unique_ptr(const std::string &fname, + SLAImportQuality quality, + const ProgrFn & progr)>; + +// Entry in the global registry of readable archive formats. +struct ArchiveEntry { + const char *descr; + std::vector extensions; + ArchiveFactory factoryfn; +}; + +// This is where the readable archive formats are registered. +static const std::map REGISTERED_ARCHIVES { + { + "SL1", + { L("SL1 / SL1S archive files"), {"sl1", "sl1s", "zip"}, + [] (const std::string &fname, SLAImportQuality quality, const ProgrFn &progr) { return std::make_unique(fname, quality, progr); } } + }, + { + "SL1SVG", + { L("SL1SVG archive files"), {"sl1_svg"/*, "zip"*/}, // also a zip but unnecessary hassle to implement single extension for multiple archives + [] (const std::string &fname, SLAImportQuality quality, const ProgrFn &progr) { return std::make_unique(fname, quality, progr); }} + }, + // TODO: pwmx and future others. +}; + +} // namespace + +std::unique_ptr SLAArchiveReader::create( + const std::string &fname, + const std::string &format_id, + SLAImportQuality quality, + const ProgrFn & progr) +{ + // Create an instance of SLAArchiveReader using the registered archive + // reader implementations. + // If format_id is specified and valid, that archive format will be + // preferred. When format_id is emtpy, the file extension is compared + // with the advertised extensions of registered readers and the first + // match will be used. + + std::string ext = boost::filesystem::path(fname).extension().string(); + boost::algorithm::to_lower(ext); + + std::unique_ptr ret; + + auto arch_from = REGISTERED_ARCHIVES.begin(); + auto arch_to = REGISTERED_ARCHIVES.end(); + + auto arch_it = REGISTERED_ARCHIVES.find(format_id); + if (arch_it != REGISTERED_ARCHIVES.end()) { + arch_from = arch_it; + arch_to = arch_it; + } + + if (!ext.empty()) { + if (ext.front() == '.') + ext.erase(ext.begin()); + + auto extcmp = [&ext](const auto &e) { return e == ext; }; + + for (auto it = arch_from; it != arch_to; ++it) { + const auto &[format_id, entry] = *it; + if (std::any_of(entry.extensions.begin(), entry.extensions.end(), extcmp)) + ret = entry.factoryfn(fname, quality, progr); + } + } + + return ret; +} + +const std::vector &SLAArchiveReader::registered_archives() +{ + static std::vector archnames; + + if (archnames.empty()) { + archnames.reserve(REGISTERED_ARCHIVES.size()); + + for (auto &[name, _] : REGISTERED_ARCHIVES) + archnames.emplace_back(name.c_str()); + } + + return archnames; +} + +std::vector SLAArchiveReader::get_extensions(const char *archtype) +{ + auto it = REGISTERED_ARCHIVES.find(archtype); + + if (it != REGISTERED_ARCHIVES.end()) + return it->second.extensions; + + return {}; +} + +const char *SLAArchiveReader::get_description(const char *archtype) +{ + auto it = REGISTERED_ARCHIVES.find(archtype); + + if (it != REGISTERED_ARCHIVES.end()) + return it->second.descr; + + return nullptr; +} + +struct SliceParams { double layerh = 0., initial_layerh = 0.; }; + +static SliceParams get_slice_params(const DynamicPrintConfig &cfg) +{ + auto *opt_layerh = cfg.option("layer_height"); + auto *opt_init_layerh = cfg.option("initial_layer_height"); + + if (!opt_layerh || !opt_init_layerh) + throw MissingProfileError("Invalid SL1 / SL1S file"); + + return SliceParams{opt_layerh->getFloat(), opt_init_layerh->getFloat()}; +} + +ConfigSubstitutions import_sla_archive(const std::string &zipfname, + const std::string &format_id, + indexed_triangle_set &out, + DynamicPrintConfig &profile, + SLAImportQuality quality, + const ProgrFn & progr) +{ + ConfigSubstitutions ret; + + if (auto reader = SLAArchiveReader::create(zipfname, format_id, quality, progr)) { + std::vector slices; + ret = reader->read(slices, profile); + + SliceParams slicp = get_slice_params(profile); + + if (!slices.empty()) + out = slices_to_mesh(slices, 0, slicp.layerh, slicp.initial_layerh); + + } else { + throw ReaderUnimplementedError("Reader unimplemented"); + } + + return ret; +} + +ConfigSubstitutions import_sla_archive(const std::string &zipfname, + const std::string &format_id, + DynamicPrintConfig &out) +{ + ConfigSubstitutions ret; + + if (auto reader = SLAArchiveReader::create(zipfname, format_id)) { + ret = reader->read(out); + } else { + throw ReaderUnimplementedError("Reader unimplemented"); + } + + return ret; +} + +} // namespace Slic3r diff --git a/src/libslic3r/Format/SLAArchiveReader.hpp b/src/libslic3r/Format/SLAArchiveReader.hpp new file mode 100644 index 00000000000..e7a99b0430f --- /dev/null +++ b/src/libslic3r/Format/SLAArchiveReader.hpp @@ -0,0 +1,85 @@ +#ifndef SLAARCHIVEREADER_HPP +#define SLAARCHIVEREADER_HPP + +#include "libslic3r/PrintConfig.hpp" +#include "libslic3r/ExPolygon.hpp" + +struct indexed_triangle_set; + +namespace Slic3r { + +// A generic indicator for the quality of an imported model. Obviously, the +// original cannot be fully reconstructed. +enum class SLAImportQuality { Accurate, Balanced, Fast }; + +// Raised when the needed metadata cannot be retrieved or guessed from an archive +class MissingProfileError : public RuntimeError +{ + using RuntimeError::RuntimeError; +}; + +// A shortname for status indication function. +// The argument is the status (from <0, 100>) +// Returns false if cancel was requested. +using ProgrFn = std::function; + +// Abstract interface for an archive reader. This needs to be implemented for +// every supported archive format. +class SLAArchiveReader { +public: + + virtual ~SLAArchiveReader() = default; + + // Read the profile and reconstruct the slices + virtual ConfigSubstitutions read(std::vector &slices, + DynamicPrintConfig &profile) = 0; + + // Overload for reading only the profile contained in the archive (if present) + virtual ConfigSubstitutions read(DynamicPrintConfig &profile) = 0; + + // Creates a reader instance based on the provided file path. + // format_id can be one of the archive type identifiers returned by + // registered_archives(). If left empty, only the file extension will + // be considered. If more archive types have the same extension (like *.zip) + // The first match is used. + static std::unique_ptr create( + const std::string &fname, + const std::string &format_id, + SLAImportQuality quality = SLAImportQuality::Balanced, + const ProgrFn &progr = [](int) { return false; }); + + // Get the names of currently known archive reader implementations + static const std::vector & registered_archives(); + + // Get the understood file extensions belonging to an archive format + static std::vector get_extensions(const char *archtype); + + // Generic description (usable in GUI) about an archive format + static const char * get_description(const char *archtype); +}; + +// Raised in import_sla_archive when a nullptr reader is returned by +// SLAArchiveReader::create() +class ReaderUnimplementedError : public RuntimeError +{ + using RuntimeError::RuntimeError; +}; + +// Helper free functions to import an archive using the above interface. +// Can throw ReaderUnimplementedError or MissingProfileError +ConfigSubstitutions import_sla_archive( + const std::string &zipfname, + const std::string &format_id, + indexed_triangle_set &out, + DynamicPrintConfig &profile, + SLAImportQuality quality = SLAImportQuality::Balanced, + const ProgrFn &progr = [](int) { return true; }); + +// Only reads the profile, doesn't reconstruct the model. +ConfigSubstitutions import_sla_archive(const std::string &zipfname, + const std::string &format_id, + DynamicPrintConfig &out); + +} // namespace Slic3r + +#endif // SLAARCHIVEREADER_HPP diff --git a/src/libslic3r/Format/SLAArchiveWriter.cpp b/src/libslic3r/Format/SLAArchiveWriter.cpp new file mode 100644 index 00000000000..b28c2c68060 --- /dev/null +++ b/src/libslic3r/Format/SLAArchiveWriter.cpp @@ -0,0 +1,78 @@ +#include "SLAArchiveWriter.hpp" + +#include "SL1.hpp" +#include "SL1_SVG.hpp" +#include "pwmx.hpp" + +#include "libslic3r/libslic3r.h" + +#include +#include +#include +#include + +namespace Slic3r { + +using ArchiveFactory = std::function(const SLAPrinterConfig&)>; + +struct ArchiveEntry { + const char *ext; + ArchiveFactory factoryfn; +}; + +static const std::map REGISTERED_ARCHIVES { + { + "SL1", + { "sl1", [] (const auto &cfg) { return std::make_unique(cfg); } } + }, + { + "SL1SVG", + { "sl1_svg", [] (const auto &cfg) { return std::make_unique(cfg); } } + }, + { + "SL2", + { "sl1_svg", [] (const auto &cfg) { return std::make_unique(cfg); } } + }, + { + "pwmx", + { "pwmx", [] (const auto &cfg) { return std::make_unique(cfg); } } + } +}; + +std::unique_ptr +SLAArchiveWriter::create(const std::string &archtype, const SLAPrinterConfig &cfg) +{ + auto entry = REGISTERED_ARCHIVES.find(archtype); + + if (entry != REGISTERED_ARCHIVES.end()) + return entry->second.factoryfn(cfg); + + return nullptr; +} + +const std::vector& SLAArchiveWriter::registered_archives() +{ + static std::vector archnames; + + if (archnames.empty()) { + archnames.reserve(REGISTERED_ARCHIVES.size()); + + for (auto &[name, _] : REGISTERED_ARCHIVES) + archnames.emplace_back(name.c_str()); + } + + return archnames; +} + +const char *SLAArchiveWriter::get_extension(const char *archtype) +{ + constexpr const char* DEFAULT_EXT = "zip"; + + auto entry = REGISTERED_ARCHIVES.find(archtype); + if (entry != REGISTERED_ARCHIVES.end()) + return entry->second.ext; + + return DEFAULT_EXT; +} + +} // namespace Slic3r diff --git a/src/libslic3r/Format/SLAArchiveWriter.hpp b/src/libslic3r/Format/SLAArchiveWriter.hpp new file mode 100644 index 00000000000..86132cceba8 --- /dev/null +++ b/src/libslic3r/Format/SLAArchiveWriter.hpp @@ -0,0 +1,65 @@ +#ifndef SLAARCHIVE_HPP +#define SLAARCHIVE_HPP + +#include + +#include "libslic3r/SLA/RasterBase.hpp" +#include "libslic3r/Execution/ExecutionTBB.hpp" +#include "libslic3r/GCode/ThumbnailData.hpp" + +namespace Slic3r { + +class SLAPrint; +class SLAPrinterConfig; + +class SLAArchiveWriter { +protected: + std::vector m_layers; + + virtual std::unique_ptr create_raster() const = 0; + virtual sla::RasterEncoder get_encoder() const = 0; + +public: + virtual ~SLAArchiveWriter() = default; + + // Fn have to be thread safe: void(sla::RasterBase& raster, size_t lyrid); + template + void draw_layers( + size_t layer_num, + Fn && drawfn, + CancelFn cancelfn = []() { return false; }, + const EP & ep = {}) + { + m_layers.resize(layer_num); + execution::for_each( + ep, size_t(0), m_layers.size(), + [this, &drawfn, &cancelfn](size_t idx) { + if (cancelfn()) return; + + sla::EncodedRaster &enc = m_layers[idx]; + auto rst = create_raster(); + drawfn(*rst, idx); + enc = rst->encode(get_encoder()); + }, + execution::max_concurrency(ep)); + } + + // Export the print into an archive using the provided filename. + virtual void export_print(const std::string fname, + const SLAPrint &print, + const ThumbnailsList &thumbnails, + const std::string &projectname = "") = 0; + + // Factory method to create an archiver instance + static std::unique_ptr create( + const std::string &archtype, const SLAPrinterConfig &); + + // Get the names of currently known archiver implementations + static const std::vector & registered_archives(); + + // Get the default file extension belonging to an archive format + static const char *get_extension(const char *archtype); +}; + +} // namespace Slic3r +#endif // SLAARCHIVE_HPP diff --git a/src/libslic3r/Format/ZipperArchiveImport.cpp b/src/libslic3r/Format/ZipperArchiveImport.cpp new file mode 100644 index 00000000000..2bd5f555b50 --- /dev/null +++ b/src/libslic3r/Format/ZipperArchiveImport.cpp @@ -0,0 +1,136 @@ +#include "ZipperArchiveImport.hpp" + +#include "libslic3r/miniz_extension.hpp" +#include "libslic3r/Exception.hpp" +#include "libslic3r/PrintConfig.hpp" + +#include +#include +#include + +namespace Slic3r { + +namespace { + +// Read an ini file into boost property tree +boost::property_tree::ptree read_ini(const mz_zip_archive_file_stat &entry, + MZ_Archive &zip) +{ + std::string buf(size_t(entry.m_uncomp_size), '\0'); + + if (!mz_zip_reader_extract_to_mem(&zip.arch, entry.m_file_index, + buf.data(), buf.size(), 0)) + throw Slic3r::FileIOError(zip.get_errorstr()); + + boost::property_tree::ptree tree; + std::stringstream ss(buf); + boost::property_tree::read_ini(ss, tree); + return tree; +} + +// Read an arbitrary file into EntryBuffer +EntryBuffer read_entry(const mz_zip_archive_file_stat &entry, + MZ_Archive &zip, + const std::string &name) +{ + std::vector buf(entry.m_uncomp_size); + + if (!mz_zip_reader_extract_to_mem(&zip.arch, entry.m_file_index, + buf.data(), buf.size(), 0)) + throw Slic3r::FileIOError(zip.get_errorstr()); + + return {std::move(buf), (name.empty() ? entry.m_filename : name)}; +} + +} // namespace + +ZipperArchive read_zipper_archive(const std::string &zipfname, + const std::vector &includes, + const std::vector &excludes) +{ + ZipperArchive arch; + + // Little RAII + struct Arch : public MZ_Archive + { + Arch(const std::string &fname) + { + if (!open_zip_reader(&arch, fname)) + throw Slic3r::FileIOError(get_errorstr()); + } + + ~Arch() { close_zip_reader(&arch); } + } zip(zipfname); + + mz_uint num_entries = mz_zip_reader_get_num_files(&zip.arch); + + for (mz_uint i = 0; i < num_entries; ++i) { + mz_zip_archive_file_stat entry; + + if (mz_zip_reader_file_stat(&zip.arch, i, &entry)) { + std::string name = entry.m_filename; + boost::algorithm::to_lower(name); + + if (!std::any_of(includes.begin(), includes.end(), + [&name](const std::string &incl) { + return boost::algorithm::contains(name, incl); + })) + continue; + + if (std::any_of(excludes.begin(), excludes.end(), + [&name](const std::string &excl) { + return boost::algorithm::contains(name, excl); + })) + continue; + + if (name == CONFIG_FNAME) { arch.config = read_ini(entry, zip); continue; } + if (name == PROFILE_FNAME) { arch.profile = read_ini(entry, zip); continue; } + + auto it = std::lower_bound( + arch.entries.begin(), arch.entries.end(), + EntryBuffer{{}, name}, + [](const EntryBuffer &r1, const EntryBuffer &r2) { + return std::less()(r1.fname, r2.fname); + }); + + arch.entries.insert(it, read_entry(entry, zip, name)); + } + } + + return arch; +} + +std::pair extract_profile( + const ZipperArchive &arch, DynamicPrintConfig &profile_out) +{ + DynamicPrintConfig profile_in, profile_use; + ConfigSubstitutions config_substitutions = + profile_in.load(arch.profile, + ForwardCompatibilitySubstitutionRule::Enable); + + if (profile_in.empty()) { // missing profile... do guess work + // try to recover the layer height from the config.ini which was + // present in all versions of sl1 files. + if (auto lh_opt = arch.config.find("layerHeight"); + lh_opt != arch.config.not_found()) { + auto lh_str = lh_opt->second.data(); + + size_t pos = 0; + double lh = string_to_double_decimal_point(lh_str, &pos); + if (pos) { // TODO: verify that pos is 0 when parsing fails + profile_out.set("layer_height", lh); + profile_out.set("initial_layer_height", lh); + } + } + } + + // If the archive contains an empty profile, use the one that was passed + // as output argument then replace it with the readed profile to report + // that it was empty. + profile_use = profile_in.empty() ? profile_out : profile_in; + profile_out = profile_in; + + return {profile_use, std::move(config_substitutions)}; +} + +} // namespace Slic3r diff --git a/src/libslic3r/Format/ZipperArchiveImport.hpp b/src/libslic3r/Format/ZipperArchiveImport.hpp new file mode 100644 index 00000000000..adddcacd401 --- /dev/null +++ b/src/libslic3r/Format/ZipperArchiveImport.hpp @@ -0,0 +1,54 @@ +#ifndef ZIPPERARCHIVEIMPORT_HPP +#define ZIPPERARCHIVEIMPORT_HPP + +#include +#include +#include + +#include + +#include "libslic3r/PrintConfig.hpp" + +namespace Slic3r { + +// Buffer for arbitraryfiles inside a zipper archive. +struct EntryBuffer +{ + std::vector buf; + std::string fname; +}; + +// Structure holding the data read from a zipper archive. +struct ZipperArchive +{ + boost::property_tree::ptree profile, config; + std::vector entries; +}; + +// Names of the files containing metadata inside the archive. +const constexpr char *CONFIG_FNAME = "config.ini"; +const constexpr char *PROFILE_FNAME = "prusaslicer.ini"; + +// Read an archive that was written using the Zipper class. +// The includes parameter is a set of file name substrings that the entries +// must contain to be included in ZipperArchive. +// The excludes parameter may contain substrings that filenames must not +// contain. +// Every file in the archive is read into ZipperArchive::entries +// except the files CONFIG_FNAME, and PROFILE_FNAME which are read into +// ZipperArchive::config and ZipperArchive::profile structures. +ZipperArchive read_zipper_archive(const std::string &zipfname, + const std::vector &includes, + const std::vector &excludes); + +// Extract the print profile form the archive into 'out'. +// Returns a profile that has correct parameters to use for model reconstruction +// even if the needed parameters were not fully found in the archive's metadata. +// The inout argument shall be a usable fallback profile if the archive +// has totally corrupted metadata. +std::pair extract_profile( + const ZipperArchive &arch, DynamicPrintConfig &inout); + +} // namespace Slic3r + +#endif // ZIPPERARCHIVEIMPORT_HPP diff --git a/src/libslic3r/Format/pwmx.cpp b/src/libslic3r/Format/pwmx.cpp new file mode 100644 index 00000000000..f3f0f6802a0 --- /dev/null +++ b/src/libslic3r/Format/pwmx.cpp @@ -0,0 +1,564 @@ +#include "pwmx.hpp" +#include "GCode/ThumbnailData.hpp" +#include "SLA/RasterBase.hpp" +#include "libslic3r/SLAPrint.hpp" + +#include +#include +#include + +#include +#include + + +#define TAG_INTRO "ANYCUBIC\0\0\0\0" +#define TAG_HEADER "HEADER\0\0\0\0\0\0" +#define TAG_PREVIEW "PREVIEW\0\0\0\0\0" +#define TAG_LAYERS "LAYERDEF\0\0\0\0" + +#define CFG_LIFT_DISTANCE "LIFT_DISTANCE" +#define CFG_LIFT_SPEED "LIFT_SPEED" +#define CFG_RETRACT_SPEED "RETRACT_SPEED" +#define CFG_DELAY_BEFORE_EXPOSURE "DELAY_BEFORE_EXPOSURE" +#define CFG_BOTTOM_LIFT_SPEED "BOTTOM_LIFT_SPEED" +#define CFG_BOTTOM_LIFT_DISTANCE "BOTTOM_LIFT_DISTANCE" + +#define PREV_W 224 +#define PREV_H 168 +#define PREV_DPI 42 + +#define LAYER_SIZE_ESTIMATE (32 * 1024) + +namespace Slic3r { + +static void pwx_get_pixel_span(const std::uint8_t* ptr, const std::uint8_t* end, + std::uint8_t& pixel, size_t& span_len) +{ + size_t max_len; + + span_len = 0; + pixel = (*ptr) & 0xF0; + // the maximum length of the span depends on the pixel color + max_len = (pixel == 0 || pixel == 0xF0) ? 0xFFF : 0xF; + while (ptr < end && span_len < max_len && ((*ptr) & 0xF0) == pixel) { + span_len++; + ptr++; + } +} + +struct PWXRasterEncoder +{ + sla::EncodedRaster operator()(const void *ptr, + size_t w, + size_t h, + size_t num_components) + { + std::vector dst; + size_t span_len; + std::uint8_t pixel; + auto size = w * h * num_components; + dst.reserve(size); + + const std::uint8_t *src = reinterpret_cast(ptr); + const std::uint8_t *src_end = src + size; + while (src < src_end) { + pwx_get_pixel_span(src, src_end, pixel, span_len); + src += span_len; + // fully transparent of fully opaque pixel + if (pixel == 0 || pixel == 0xF0) { + pixel = pixel | (span_len >> 8); + std::copy(&pixel, (&pixel) + 1, std::back_inserter(dst)); + pixel = span_len & 0xFF; + std::copy(&pixel, (&pixel) + 1, std::back_inserter(dst)); + } + // antialiased pixel + else { + pixel = pixel | span_len; + std::copy(&pixel, (&pixel) + 1, std::back_inserter(dst)); + } + } + + return sla::EncodedRaster(std::move(dst), "pwx"); + } +}; + +using ConfMap = std::map; + +typedef struct pwmx_format_intro +{ + char tag[12]; + std::uint32_t version; // value 1 + std::uint32_t area_num; // unknown - usually 4 + std::uint32_t header_data_offset; + std::float_t intro24; // unknown - usually 0 + std::uint32_t preview_data_offset; + std::float_t intro32; // unknown + std::uint32_t layer_data_offset; + std::float_t intro40; // unknown + std::uint32_t image_data_offset; +} pwmx_format_intro; + +typedef struct pwmx_format_header +{ + char tag[12]; + std::uint32_t payload_size; + std::float_t pixel_size_um; + std::float_t layer_height_mm; + std::float_t exposure_time_s; + std::float_t delay_before_exposure_s; + std::float_t bottom_exposure_time_s; + std::float_t bottom_layer_count; + std::float_t lift_distance_mm; + std::float_t lift_speed_mms; + std::float_t retract_speed_mms; + std::float_t volume_ml; + std::uint32_t antialiasing; + std::uint32_t res_x; + std::uint32_t res_y; + std::float_t weight_g; + std::float_t price; + std::uint32_t price_currency; + std::uint32_t per_layer_override; // ? unknown meaning ? + std::uint32_t print_time_s; + std::uint32_t transition_layer_count; + std::uint32_t unknown; // ? usually 0 ? + +} pwmx_format_header; + +typedef struct pwmx_format_preview +{ + char tag[12]; + std::uint32_t payload_size; + std::uint32_t preview_w; + std::uint32_t preview_dpi; + std::uint32_t preview_h; + // raw image data in BGR565 format + std::uint8_t pixels[PREV_W * PREV_H * 2]; +} pwmx_format_preview; + +typedef struct pwmx_format_layers_header +{ + char tag[12]; + std::uint32_t payload_size; + std::uint32_t layer_count; +} pwmx_format_layers_header; + +typedef struct pwmx_format_layer +{ + std::uint32_t image_offset; + std::uint32_t image_size; + std::float_t lift_distance_mm; + std::float_t lift_speed_mms; + std::float_t exposure_time_s; + std::float_t layer_height_mm; + std::float_t layer44; // unkown - usually 0 + std::float_t layer48; // unkown - usually 0 +} pwmx_format_layer; + +typedef struct pwmx_format_misc +{ + std::float_t bottom_layer_height_mm; + std::float_t bottom_lift_distance_mm; + std::float_t bottom_lift_speed_mms; + +} pwmx_format_misc; + +class PwmxFormatConfigDef : public ConfigDef +{ +public: + PwmxFormatConfigDef() + { + add(CFG_LIFT_DISTANCE, coFloat); + add(CFG_LIFT_SPEED, coFloat); + add(CFG_RETRACT_SPEED, coFloat); + add(CFG_DELAY_BEFORE_EXPOSURE, coFloat); + add(CFG_BOTTOM_LIFT_DISTANCE, coFloat); + add(CFG_BOTTOM_LIFT_SPEED, coFloat); + } +}; + +class PwmxFormatDynamicConfig : public DynamicConfig +{ +public: + PwmxFormatDynamicConfig(){}; + const ConfigDef *def() const override { return &config_def; } + +private: + PwmxFormatConfigDef config_def; +}; + +namespace { + +std::float_t get_cfg_value_f(const DynamicConfig &cfg, + const std::string &key, + const std::float_t &def = 0.f) +{ + if (cfg.has(key)) { + if (auto opt = cfg.option(key)) + return opt->getFloat(); + } + + return def; +} + +int get_cfg_value_i(const DynamicConfig &cfg, + const std::string &key, + const int &def = 0) +{ + if (cfg.has(key)) { + if (auto opt = cfg.option(key)) + return opt->getInt(); + } + + return def; +} + +template void crop_value(T &val, T val_min, T val_max) +{ + if (val < val_min) { + val = val_min; + } else if (val > val_max) { + val = val_max; + } +} + +void fill_preview(pwmx_format_preview &p, + pwmx_format_misc &/*m*/, + const ThumbnailsList &thumbnails) +{ + + p.preview_w = PREV_W; + p.preview_h = PREV_H; + p.preview_dpi = PREV_DPI; + p.payload_size = sizeof(p) - sizeof(p.tag) - sizeof(p.payload_size); + + std::memset(p.pixels, 0 , sizeof(p.pixels)); + if (!thumbnails.empty()) { + std::uint32_t dst_index; + std::uint32_t i = 0; + size_t len; + size_t pixel_x = 0; + auto t = thumbnails[0]; //use the first thumbnail + len = t.pixels.size(); + //sanity check + if (len != PREV_W * PREV_H * 4) { + printf("incorrect thumbnail size. expected %ix%i\n", PREV_W, PREV_H); + return; + } + // rearange pixels: they seem to be stored from bottom to top. + dst_index = (PREV_W * (PREV_H - 1) * 2); + while (i < len) { + std::uint32_t pixel; + std::uint32_t r = t.pixels[i++]; + std::uint32_t g = t.pixels[i++]; + std::uint32_t b = t.pixels[i++]; + i++; // Alpha + // convert to BGRA565 + pixel = ((b >> 3) << 11) | ((g >>2) << 5) | (r >> 3); + p.pixels[dst_index++] = pixel & 0xFF; + p.pixels[dst_index++] = (pixel >> 8) & 0xFF; + pixel_x++; + if (pixel_x == PREV_W) { + pixel_x = 0; + dst_index -= (PREV_W * 4); + } + } + } +} + + +void fill_header(pwmx_format_header &h, + pwmx_format_misc &m, + const SLAPrint &print, + std::uint32_t layer_count) +{ + CNumericLocalesSetter locales_setter; + + std::float_t bottle_weight_g; + std::float_t bottle_volume_ml; + std::float_t bottle_cost; + std::float_t material_density; + auto &cfg = print.full_print_config(); + auto mat_opt = cfg.option("material_notes"); + std::string mnotes = mat_opt? cfg.option("material_notes")->serialize() : ""; + // create a config parser from the material notes + Slic3r::PwmxFormatDynamicConfig mat_cfg; + SLAPrintStatistics stats = print.print_statistics(); + + // sanitize the string config + boost::replace_all(mnotes, "\\n", "\n"); + boost::replace_all(mnotes, "\\r", "\r"); + mat_cfg.load_from_ini_string(mnotes, + ForwardCompatibilitySubstitutionRule::Enable); + + h.layer_height_mm = get_cfg_value_f(cfg, "layer_height"); + m.bottom_layer_height_mm = get_cfg_value_f(cfg, "initial_layer_height"); + h.exposure_time_s = get_cfg_value_f(cfg, "exposure_time"); + h.bottom_exposure_time_s = get_cfg_value_f(cfg, "initial_exposure_time"); + h.bottom_layer_count = get_cfg_value_i(cfg, "faded_layers"); + if (layer_count < h.bottom_layer_count) { + h.bottom_layer_count = layer_count; + } + h.res_x = get_cfg_value_i(cfg, "display_pixels_x"); + h.res_y = get_cfg_value_i(cfg, "display_pixels_y"); + bottle_weight_g = get_cfg_value_f(cfg, "bottle_weight") * 1000.0f; + bottle_volume_ml = get_cfg_value_f(cfg, "bottle_volume"); + bottle_cost = get_cfg_value_f(cfg, "bottle_cost"); + material_density = bottle_weight_g / bottle_volume_ml; + + h.volume_ml = (stats.objects_used_material + stats.support_used_material) / 1000; + h.weight_g = h.volume_ml * material_density; + h.price = (h.volume_ml * bottle_cost) / bottle_volume_ml; + h.price_currency = '$'; + h.antialiasing = 1; + h.per_layer_override = 0; + + // TODO - expose these variables to the UI rather than using material notes + h.delay_before_exposure_s = get_cfg_value_f(mat_cfg, CFG_DELAY_BEFORE_EXPOSURE, 0.5f); + crop_value(h.delay_before_exposure_s, 0.0f, 1000.0f); + + h.lift_distance_mm = get_cfg_value_f(mat_cfg, CFG_LIFT_DISTANCE, 8.0f); + crop_value(h.lift_distance_mm, 0.0f, 100.0f); + + if (mat_cfg.has(CFG_BOTTOM_LIFT_DISTANCE)) { + m.bottom_lift_distance_mm = get_cfg_value_f(mat_cfg, + CFG_BOTTOM_LIFT_DISTANCE, + 8.0f); + crop_value(h.lift_distance_mm, 0.0f, 100.0f); + } else { + m.bottom_lift_distance_mm = h.lift_distance_mm; + } + + h.lift_speed_mms = get_cfg_value_f(mat_cfg, CFG_LIFT_SPEED, 2.0f); + crop_value(m.bottom_lift_speed_mms, 0.1f, 20.0f); + + if (mat_cfg.has(CFG_BOTTOM_LIFT_SPEED)) { + m.bottom_lift_speed_mms = get_cfg_value_f(mat_cfg, CFG_BOTTOM_LIFT_SPEED, 2.0f); + crop_value(m.bottom_lift_speed_mms, 0.1f, 20.0f); + } else { + m.bottom_lift_speed_mms = h.lift_speed_mms; + } + + h.retract_speed_mms = get_cfg_value_f(mat_cfg, CFG_RETRACT_SPEED, 3.0f); + crop_value(h.lift_speed_mms, 0.1f, 20.0f); + + h.print_time_s = (h.bottom_layer_count * h.bottom_exposure_time_s) + + ((layer_count - h.bottom_layer_count) * + h.exposure_time_s) + + (layer_count * h.lift_distance_mm / h.retract_speed_mms) + + (layer_count * h.lift_distance_mm / h.lift_speed_mms) + + (layer_count * h.delay_before_exposure_s); + + + h.payload_size = sizeof(h) - sizeof(h.tag) - sizeof(h.payload_size); + h.pixel_size_um = 50; +} + +} // namespace + +std::unique_ptr PwmxArchive::create_raster() const +{ + sla::Resolution res; + sla::PixelDim pxdim; + std::array mirror; + + double w = m_cfg.display_width.getFloat(); + double h = m_cfg.display_height.getFloat(); + auto pw = size_t(m_cfg.display_pixels_x.getInt()); + auto ph = size_t(m_cfg.display_pixels_y.getInt()); + + mirror[X] = m_cfg.display_mirror_x.getBool(); + mirror[Y] = m_cfg.display_mirror_y.getBool(); + + auto ro = m_cfg.display_orientation.getInt(); + sla::RasterBase::Orientation orientation = + ro == sla::RasterBase::roPortrait ? sla::RasterBase::roPortrait : + sla::RasterBase::roLandscape; + + if (orientation == sla::RasterBase::roPortrait) { + std::swap(w, h); + std::swap(pw, ph); + } + + res = sla::Resolution{pw, ph}; + pxdim = sla::PixelDim{w / pw, h / ph}; + sla::RasterBase::Trafo tr{orientation, mirror}; + + double gamma = m_cfg.gamma_correction.getFloat(); + + return sla::create_raster_grayscale_aa(res, pxdim, gamma, tr); +} + +sla::RasterEncoder PwmxArchive::get_encoder() const +{ + return PWXRasterEncoder{}; +} + +// Endian safe write of little endian 32bit ints +static void pwmx_write_int32(std::ofstream &out, std::uint32_t val) +{ + const char i1 = (val & 0xFF); + const char i2 = (val >> 8) & 0xFF; + const char i3 = (val >> 16) & 0xFF; + const char i4 = (val >> 24) & 0xFF; + + out.write((const char *) &i1, 1); + out.write((const char *) &i2, 1); + out.write((const char *) &i3, 1); + out.write((const char *) &i4, 1); +} +static void pwmx_write_float(std::ofstream &out, std::float_t val) +{ + std::uint32_t *f = (std::uint32_t *) &val; + pwmx_write_int32(out, *f); +} + +static void pwmx_write_intro(std::ofstream &out, pwmx_format_intro &i) +{ + out.write(TAG_INTRO, sizeof(i.tag)); + pwmx_write_int32(out, i.version); + pwmx_write_int32(out, i.area_num); + pwmx_write_int32(out, i.header_data_offset); + pwmx_write_int32(out, i.intro24); + pwmx_write_int32(out, i.preview_data_offset); + pwmx_write_int32(out, i.intro32); + pwmx_write_int32(out, i.layer_data_offset); + pwmx_write_int32(out, i.intro40); + pwmx_write_int32(out, i.image_data_offset); +} + +static void pwmx_write_header(std::ofstream &out, pwmx_format_header &h) +{ + out.write(TAG_HEADER, sizeof(h.tag)); + pwmx_write_int32(out, h.payload_size); + pwmx_write_float(out, h.pixel_size_um); + pwmx_write_float(out, h.layer_height_mm); + pwmx_write_float(out, h.exposure_time_s); + pwmx_write_float(out, h.delay_before_exposure_s); + pwmx_write_float(out, h.bottom_exposure_time_s); + pwmx_write_float(out, h.bottom_layer_count); + pwmx_write_float(out, h.lift_distance_mm); + pwmx_write_float(out, h.lift_speed_mms); + pwmx_write_float(out, h.retract_speed_mms); + pwmx_write_float(out, h.volume_ml); + pwmx_write_int32(out, h.antialiasing); + pwmx_write_int32(out, h.res_x); + pwmx_write_int32(out, h.res_y); + pwmx_write_float(out, h.weight_g); + pwmx_write_float(out, h.price); + pwmx_write_int32(out, h.price_currency); + pwmx_write_int32(out, h.per_layer_override); + pwmx_write_int32(out, h.print_time_s); + pwmx_write_int32(out, h.transition_layer_count); + pwmx_write_int32(out, h.unknown); +} + +static void pwmx_write_preview(std::ofstream &out, pwmx_format_preview &p) +{ + out.write(TAG_PREVIEW, sizeof(p.tag)); + pwmx_write_int32(out, p.payload_size); + pwmx_write_int32(out, p.preview_w); + pwmx_write_int32(out, p.preview_dpi); + pwmx_write_int32(out, p.preview_h); + out.write((const char*) p.pixels, sizeof(p.pixels)); +} + +static void pwmx_write_layers_header(std::ofstream &out, pwmx_format_layers_header &h) +{ + out.write(TAG_LAYERS, sizeof(h.tag)); + pwmx_write_int32(out, h.payload_size); + pwmx_write_int32(out, h.layer_count); +} + +static void pwmx_write_layer(std::ofstream &out, pwmx_format_layer &l) +{ + pwmx_write_int32(out, l.image_offset); + pwmx_write_int32(out, l.image_size); + pwmx_write_float(out, l.lift_distance_mm); + pwmx_write_float(out, l.lift_speed_mms); + pwmx_write_float(out, l.exposure_time_s); + pwmx_write_float(out, l.layer_height_mm); + pwmx_write_float(out, l.layer44); + pwmx_write_float(out, l.layer48); +} + +void PwmxArchive::export_print(const std::string fname, + const SLAPrint &print, + const ThumbnailsList &thumbnails, + const std::string &/*projectname*/) +{ + std::uint32_t layer_count = m_layers.size(); + + pwmx_format_intro intro = {}; + pwmx_format_header header = {}; + pwmx_format_preview preview = {}; + pwmx_format_layers_header layers_header = {}; + pwmx_format_misc misc = {}; + std::vector layer_images; + std::uint32_t image_offset; + + intro.version = 1; + intro.area_num = 4; + intro.header_data_offset = sizeof(intro); + intro.preview_data_offset = sizeof(intro) + sizeof(header); + intro.layer_data_offset = intro.preview_data_offset + sizeof(preview); + intro.image_data_offset = intro.layer_data_offset + + sizeof(layers_header) + + (sizeof(pwmx_format_layer) * layer_count); + + fill_header(header, misc, print, layer_count); + fill_preview(preview, misc, thumbnails); + + try { + // open the file and write the contents + std::ofstream out; + out.open(fname, std::ios::binary | std::ios::out | std::ios::trunc); + pwmx_write_intro(out, intro); + pwmx_write_header(out, header); + pwmx_write_preview(out, preview); + + layers_header.payload_size = intro.image_data_offset - intro.layer_data_offset - + sizeof(layers_header.tag) - sizeof(layers_header.payload_size); + layers_header.layer_count = layer_count; + pwmx_write_layers_header(out, layers_header); + + //layers + layer_images.reserve(layer_count * LAYER_SIZE_ESTIMATE); + image_offset = intro.image_data_offset; + size_t i = 0; + for (const sla::EncodedRaster &rst : m_layers) { + pwmx_format_layer l; + std::memset(&l, 0, sizeof(l)); + l.image_offset = image_offset; + l.image_size = rst.size(); + if (i < header.bottom_layer_count) { + l.exposure_time_s = header.bottom_exposure_time_s; + l.layer_height_mm = misc.bottom_layer_height_mm; + l.lift_distance_mm = misc.bottom_lift_distance_mm; + l.lift_speed_mms = misc.bottom_lift_speed_mms; + } else { + l.exposure_time_s = header.exposure_time_s; + l.layer_height_mm = header.layer_height_mm; + l.lift_distance_mm = header.lift_distance_mm; + l.lift_speed_mms = header.lift_speed_mms; + } + image_offset += l.image_size; + pwmx_write_layer(out, l); + // add the rle encoded layer image into the buffer + const char* img_start = reinterpret_cast(rst.data()); + const char* img_end = img_start + rst.size(); + std::copy(img_start, img_end, std::back_inserter(layer_images)); + i++; + } + const char* img_buffer = reinterpret_cast(layer_images.data()); + out.write(img_buffer, layer_images.size()); + out.close(); + } catch(std::exception& e) { + BOOST_LOG_TRIVIAL(error) << e.what(); + // Rethrow the exception + throw; + } + +} + +} // namespace Slic3r diff --git a/src/libslic3r/Format/pwmx.hpp b/src/libslic3r/Format/pwmx.hpp new file mode 100644 index 00000000000..6d667fab705 --- /dev/null +++ b/src/libslic3r/Format/pwmx.hpp @@ -0,0 +1,37 @@ +#ifndef _SLIC3R_FORMAT_PWMX_HPP_ +#define _SLIC3R_FORMAT_PWMX_HPP_ + +#include + +#include "SLAArchiveWriter.hpp" + +#include "libslic3r/PrintConfig.hpp" + +namespace Slic3r { + +class PwmxArchive: public SLAArchiveWriter { + SLAPrinterConfig m_cfg; + +protected: + std::unique_ptr create_raster() const override; + sla::RasterEncoder get_encoder() const override; + + SLAPrinterConfig & cfg() { return m_cfg; } + const SLAPrinterConfig & cfg() const { return m_cfg; } + +public: + + PwmxArchive() = default; + explicit PwmxArchive(const SLAPrinterConfig &cfg): m_cfg(cfg) {} + explicit PwmxArchive(SLAPrinterConfig &&cfg): m_cfg(std::move(cfg)) {} + + void export_print(const std::string fname, + const SLAPrint &print, + const ThumbnailsList &thumbnails, + const std::string &projectname = "") override; +}; + + +} // namespace Slic3r::sla + +#endif // _SLIC3R_FORMAT_PWMX_HPP_ diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index c7671b587c7..79d6d191ce7 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1,4 +1,6 @@ +#include "Config.hpp" #include "libslic3r.h" +#include "GCode/ExtrusionProcessor.hpp" #include "I18N.hpp" #include "GCode.hpp" #include "Exception.hpp" @@ -7,8 +9,12 @@ #include "GCode/PrintExtents.hpp" #include "GCode/Thumbnails.hpp" #include "GCode/WipeTower.hpp" +#include "Point.hpp" +#include "Polygon.hpp" +#include "PrintConfig.hpp" #include "ShortestPath.hpp" #include "Print.hpp" +#include "Thread.hpp" #include "Utils.hpp" #include "ClipperUtils.hpp" #include "libslic3r.h" @@ -19,6 +25,7 @@ #include #include #include +#include #include #include @@ -26,7 +33,6 @@ #include #include #include -#include #include #include @@ -35,8 +41,6 @@ #include "SVG.hpp" #include -#include -#include // Intel redesigned some TBB interface considerably when merging TBB with their oneAPI set of libraries, see GH #7332. // We are using quite an old TBB 2017 U7. Before we update our build servers, let's use the old API, which is deprecated in up to date TBB. @@ -54,8 +58,6 @@ using slic3r_tbb_filtermode = tbb::filter; #endif -#include - using namespace std::literals::string_view_literals; #if 0 @@ -69,11 +71,6 @@ using namespace std::literals::string_view_literals; namespace Slic3r { - //! macro used to mark string used at localization, - //! return same string -#define L(s) (s) -#define _(s) Slic3r::I18N::translate(s) - // Only add a newline in case the current G-code does not end with a newline. static inline void check_add_eol(std::string& gcode) { @@ -113,27 +110,23 @@ namespace Slic3r { { std::string gcode; - // move to the nearest standby point - if (!this->standby_points.empty()) { - // get current position in print coordinates - Vec3d writer_pos = gcodegen.writer().get_position(); - Point pos = Point::new_scale(writer_pos(0), writer_pos(1)); - - // find standby point - Point standby_point; - pos.nearest_point(this->standby_points, &standby_point); - - /* We don't call gcodegen.travel_to() because we don't need retraction (it was already - triggered by the caller) nor avoid_crossing_perimeters and also because the coordinates - of the destination point must not be transformed by origin nor current extruder offset. */ - gcode += gcodegen.writer().travel_to_xy(unscale(standby_point), - "move to standby position"); - } - - if (gcodegen.config().standby_temperature_delta.value != 0) { - // we assume that heating is always slower than cooling, so no need to block - gcode += gcodegen.writer().set_temperature - (this->_get_temp(gcodegen) + gcodegen.config().standby_temperature_delta.value, false, gcodegen.writer().extruder()->id()); + unsigned int extruder_id = gcodegen.writer().extruder()->id(); + const ConfigOptionIntsNullable& filament_idle_temp = gcodegen.config().idle_temperature; + if (filament_idle_temp.is_nil(extruder_id)) { + // There is no idle temperature defined in filament settings. + // Use the delta value from print config. + if (gcodegen.config().standby_temperature_delta.value != 0) { + // we assume that heating is always slower than cooling, so no need to block + gcode += gcodegen.writer().set_temperature + (this->_get_temp(gcodegen) + gcodegen.config().standby_temperature_delta.value, false, extruder_id); + gcode.pop_back(); + gcode += " ;cooldown\n"; // this is a marker for GCodeProcessor, so it can supress the commands when needed + } + } else { + // Use the value from filament settings. That one is absolute, not delta. + gcode += gcodegen.writer().set_temperature(filament_idle_temp.get_at(extruder_id), false, extruder_id); + gcode.pop_back(); + gcode += " ;cooldown\n"; // this is a marker for GCodeProcessor, so it can supress the commands when needed } return gcode; @@ -146,73 +139,61 @@ namespace Slic3r { std::string(); } - int - OozePrevention::_get_temp(GCode& gcodegen) + int OozePrevention::_get_temp(const GCode& gcodegen) const { - return (gcodegen.layer() != NULL && gcodegen.layer()->id() == 0) + return (gcodegen.layer() == nullptr || gcodegen.layer()->id() == 0) ? gcodegen.config().first_layer_temperature.get_at(gcodegen.writer().extruder()->id()) : gcodegen.config().temperature.get_at(gcodegen.writer().extruder()->id()); } std::string Wipe::wipe(GCode& gcodegen, bool toolchange) { - std::string gcode; - - /* Reduce feedrate a bit; travel speed is often too high to move on existing material. - Too fast = ripping of existing material; too slow = short wipe path, thus more blob. */ - double wipe_speed = gcodegen.writer().config.travel_speed.value * 0.8; - - // get the retraction length - double length = toolchange - ? gcodegen.writer().extruder()->retract_length_toolchange() - : gcodegen.writer().extruder()->retract_length(); - // Shorten the retraction length by the amount already retracted before wipe. - length *= (1. - gcodegen.writer().extruder()->retract_before_wipe()); - - if (length > 0) { - /* Calculate how long we need to travel in order to consume the required - amount of retraction. In other words, how far do we move in XY at wipe_speed - for the time needed to consume retract_length at retract_speed? */ - double wipe_dist = scale_(length / gcodegen.writer().extruder()->retract_speed() * wipe_speed); - - /* Take the stored wipe path and replace first point with the current actual position - (they might be different, for example, in case of loop clipping). */ - Polyline wipe_path; - wipe_path.append(gcodegen.last_pos()); - wipe_path.append( - this->path.points.begin() + 1, - this->path.points.end() - ); - - wipe_path.clip_end(wipe_path.length() - wipe_dist); - - // subdivide the retraction in segments - if (!wipe_path.empty()) { - // add tag for processor + std::string gcode; + const Extruder &extruder = *gcodegen.writer().extruder(); + + // Remaining quantized retraction length. + if (double retract_length = extruder.retract_to_go(toolchange ? extruder.retract_length_toolchange() : extruder.retract_length()); + retract_length > 0 && this->path.size() >= 2) { + // Reduce feedrate a bit; travel speed is often too high to move on existing material. + // Too fast = ripping of existing material; too slow = short wipe path, thus more blob. + const double wipe_speed = gcodegen.writer().config.travel_speed.value * 0.8; + // Reduce retraction length a bit to avoid effective retraction speed to be greater than the configured one + // due to rounding (TODO: test and/or better math for this). + const double xy_to_e = 0.95 * extruder.retract_speed() / wipe_speed; + // Start with the current position, which may be different from the wipe path start in case of loop clipping. + Vec2d prev = gcodegen.point_to_gcode_quantized(gcodegen.last_pos()); + auto it = this->path.points.begin(); + Vec2d p = gcodegen.point_to_gcode_quantized(*(++ it)); + if (p != prev) { gcode += ";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Wipe_Start) + "\n"; - for (const Line& line : wipe_path.lines()) { - double segment_length = line.length(); - /* Reduce retraction length a bit to avoid effective retraction speed to be greater than the configured one - due to rounding (TODO: test and/or better math for this) */ - double dE = length * (segment_length / wipe_dist) * 0.95; + auto end = this->path.points.end(); + bool done = false; + for (; it != end && ! done; ++ it) { + p = gcodegen.point_to_gcode_quantized(*it); + double segment_length = (p - prev).norm(); + double dE = GCodeFormatter::quantize_e(xy_to_e * segment_length); + if (dE > retract_length - EPSILON) { + if (dE > retract_length + EPSILON) + // Shorten the segment. + p = prev + (p - prev) * (retract_length / dE); + dE = retract_length; + done = true; + } //FIXME one shall not generate the unnecessary G1 Fxxx commands, here wipe_speed is a constant inside this cycle. // Is it here for the cooling markers? Or should it be outside of the cycle? - gcode += gcodegen.writer().set_speed(wipe_speed * 60, "", gcodegen.enable_cooling_markers() ? ";_WIPE" : ""); - gcode += gcodegen.writer().extrude_to_xy( - gcodegen.point_to_gcode(line.b), - -dE, - "wipe and retract" - ); + gcode += gcodegen.writer().set_speed(wipe_speed * 60, {}, gcodegen.enable_cooling_markers() ? ";_WIPE" : ""); + gcode += gcodegen.writer().extrude_to_xy(p, -dE, "wipe and retract"); + prev = p; + retract_length -= dE; } // add tag for processor gcode += ";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Wipe_End) + "\n"; - gcodegen.set_last_pos(wipe_path.points.back()); + gcodegen.set_last_pos(gcodegen.gcode_to_point(prev)); } - - // prevent wiping again on same path - this->reset_path(); } + // Prevent wiping again on the same path. + this->reset_path(); return gcode; } @@ -250,90 +231,56 @@ namespace Slic3r { std::string tcr_rotated_gcode = post_process_wipe_tower_moves(tcr, wipe_tower_offset, wipe_tower_rotation); - if (! tcr.priming) { - // Move over the wipe tower. + gcode += gcodegen.writer().unlift(); // Make sure there is no z-hop (in most cases, there isn't). + + double current_z = gcodegen.writer().get_position().z(); + if (z == -1.) // in case no specific z was provided, print at current_z pos + z = current_z; + + const bool needs_toolchange = gcodegen.writer().need_toolchange(new_extruder_id); + const bool will_go_down = ! is_approx(z, current_z); + if (tcr.force_travel || ! needs_toolchange || (gcodegen.config().single_extruder_multi_material && ! tcr.priming)) { + // Move over the wipe tower. If this is not single-extruder MM, the first wipe tower move following the + // toolchange will travel there anyway (if there is a toolchange). + // FIXME: It would be better if the wipe tower set the force_travel flag for all toolchanges, + // then we could simplify the condition and make it more readable. gcode += gcodegen.retract(); gcodegen.m_avoid_crossing_perimeters.use_external_mp_once(); gcode += gcodegen.travel_to( wipe_tower_point_to_object_point(gcodegen, start_pos), - erMixed, + ExtrusionRole::Mixed, "Travel to a Wipe Tower"); gcode += gcodegen.unretract(); } - - double current_z = gcodegen.writer().get_position().z(); - if (z == -1.) // in case no specific z was provided, print at current_z pos - z = current_z; - if (! is_approx(z, current_z)) { + + if (will_go_down) { gcode += gcodegen.writer().retract(); gcode += gcodegen.writer().travel_to_z(z, "Travel down to the last wipe tower layer."); gcode += gcodegen.writer().unretract(); } - - // Process the end filament gcode. - std::string end_filament_gcode_str; - if (gcodegen.writer().extruder() != nullptr) { - // Process the custom end_filament_gcode in case of single_extruder_multi_material. - unsigned int old_extruder_id = gcodegen.writer().extruder()->id(); - const std::string& end_filament_gcode = gcodegen.config().end_filament_gcode.get_at(old_extruder_id); - if (gcodegen.writer().extruder() != nullptr && !end_filament_gcode.empty()) { - end_filament_gcode_str = gcodegen.placeholder_parser_process("end_filament_gcode", end_filament_gcode, old_extruder_id); - check_add_eol(end_filament_gcode_str); - } - } - - // Process the custom toolchange_gcode. If it is empty, provide a simple Tn command to change the filament. - // Otherwise, leave control to the user completely. std::string toolchange_gcode_str; - const std::string& toolchange_gcode = gcodegen.config().toolchange_gcode.value; -// m_max_layer_z = std::max(m_max_layer_z, tcr.print_z); - if (! toolchange_gcode.empty()) { - DynamicConfig config; - int previous_extruder_id = gcodegen.writer().extruder() ? (int)gcodegen.writer().extruder()->id() : -1; - config.set_key_value("previous_extruder", new ConfigOptionInt(previous_extruder_id)); - config.set_key_value("next_extruder", new ConfigOptionInt((int)new_extruder_id)); - config.set_key_value("layer_num", new ConfigOptionInt(gcodegen.m_layer_index)); - config.set_key_value("layer_z", new ConfigOptionFloat(tcr.print_z)); - config.set_key_value("toolchange_z", new ConfigOptionFloat(z)); -// config.set_key_value("max_layer_z", new ConfigOptionFloat(m_max_layer_z)); - toolchange_gcode_str = gcodegen.placeholder_parser_process("toolchange_gcode", toolchange_gcode, new_extruder_id, &config); - check_add_eol(toolchange_gcode_str); - } - - std::string toolchange_command; - if (tcr.priming || (new_extruder_id >= 0 && gcodegen.writer().need_toolchange(new_extruder_id))) - toolchange_command = gcodegen.writer().toolchange(new_extruder_id); - if (!custom_gcode_changes_tool(toolchange_gcode_str, gcodegen.writer().toolchange_prefix(), new_extruder_id)) - toolchange_gcode_str += toolchange_command; - else { - // We have informed the m_writer about the current extruder_id, we can ignore the generated G-code. + std::string deretraction_str; + if (tcr.priming || (new_extruder_id >= 0 && needs_toolchange)) { + if (gcodegen.config().single_extruder_multi_material) + gcodegen.m_wipe.reset_path(); // We don't want wiping on the ramming lines. + toolchange_gcode_str = gcodegen.set_extruder(new_extruder_id, tcr.print_z); // TODO: toolchange_z vs print_z + if (gcodegen.config().wipe_tower) + deretraction_str = gcodegen.unretract(); } - gcodegen.placeholder_parser().set("current_extruder", new_extruder_id); + - // Process the start filament gcode. - std::string start_filament_gcode_str; - const std::string& start_filament_gcode = gcodegen.config().start_filament_gcode.get_at(new_extruder_id); - if (!start_filament_gcode.empty()) { - // Process the start_filament_gcode for the active filament only. - DynamicConfig config; - config.set_key_value("filament_extruder_id", new ConfigOptionInt(new_extruder_id)); - start_filament_gcode_str = gcodegen.placeholder_parser_process("start_filament_gcode", start_filament_gcode, new_extruder_id, &config); - check_add_eol(start_filament_gcode_str); - } - // Insert the end filament, toolchange, and start filament gcode into the generated gcode. + // Insert the toolchange and deretraction gcode into the generated gcode. DynamicConfig config; - config.set_key_value("end_filament_gcode", new ConfigOptionString(end_filament_gcode_str)); config.set_key_value("toolchange_gcode", new ConfigOptionString(toolchange_gcode_str)); - config.set_key_value("start_filament_gcode", new ConfigOptionString(start_filament_gcode_str)); + config.set_key_value("deretraction_from_wipe_tower_generator", new ConfigOptionString(deretraction_str)); std::string tcr_gcode, tcr_escaped_gcode = gcodegen.placeholder_parser_process("tcr_rotated_gcode", tcr_rotated_gcode, new_extruder_id, &config); unescape_string_cstyle(tcr_escaped_gcode, tcr_gcode); gcode += tcr_gcode; check_add_eol(toolchange_gcode_str); - // A phony move to the end position at the wipe tower. gcodegen.writer().travel_to_xy(end_pos.cast()); gcodegen.set_last_pos(wipe_tower_point_to_object_point(gcodegen, end_pos)); @@ -374,7 +321,7 @@ namespace Slic3r { // All G1 commands should be translated and rotated. X and Y coords are // only pushed to the output when they differ from last time. // WT generator can override this by appending the never_skip_tag - if (line.find("G1 ") == 0) { + if (boost::starts_with(line, "G1 ")) { bool never_skip = false; auto it = line.find(WipeTower::never_skip_tag()); if (it != std::string::npos) { @@ -386,6 +333,7 @@ namespace Slic3r { std::istringstream line_str(line); line_str >> std::noskipws; // don't skip whitespace char ch = 0; + line_str >> ch >> ch; // read the "G1" while (line_str >> ch) { if (ch == 'X' || ch == 'Y') line_str >> (ch == 'X' ? pos.x() : pos.y()); @@ -397,14 +345,16 @@ namespace Slic3r { if (transformed_pos != old_pos || never_skip) { line = line_out.str(); + boost::trim_left(line); // Remove leading spaces std::ostringstream oss; - oss << std::fixed << std::setprecision(3) << "G1 "; + oss << std::fixed << std::setprecision(3) << "G1"; if (transformed_pos.x() != old_pos.x() || never_skip) oss << " X" << transformed_pos.x() - extruder_offset.x(); if (transformed_pos.y() != old_pos.y() || never_skip) oss << " Y" << transformed_pos.y() - extruder_offset.y(); - oss << " "; - line.replace(line.find("G1 "), 3, oss.str()); + if (! line.empty()) + oss << " "; + line = oss.str() + line; old_pos = transformed_pos; } } @@ -473,7 +423,7 @@ namespace Slic3r { std::string WipeTowerIntegration::finalize(GCode& gcodegen) { std::string gcode; - if (std::abs(gcodegen.writer().get_position()(2) - m_final_purge.print_z) > EPSILON) + if (std::abs(gcodegen.writer().get_position().z() - m_final_purge.print_z) > EPSILON) gcode += gcodegen.change_layer(m_final_purge.print_z); gcode += append_tcr(gcodegen, m_final_purge, -1); return gcode; @@ -483,11 +433,120 @@ namespace Slic3r { #define EXTRUDER_CONFIG(OPT) m_config.OPT.get_at(m_writer.extruder()->id()) +void GCode::PlaceholderParserIntegration::reset() +{ + this->failed_templates.clear(); + this->output_config.clear(); + this->opt_position = nullptr; + this->opt_zhop = nullptr; + this->opt_e_position = nullptr; + this->opt_e_retracted = nullptr; + this->opt_e_restart_extra = nullptr; + this->opt_extruded_volume = nullptr; + this->opt_extruded_weight = nullptr; + this->opt_extruded_volume_total = nullptr; + this->opt_extruded_weight_total = nullptr; + this->num_extruders = 0; + this->position.clear(); + this->e_position.clear(); + this->e_retracted.clear(); + this->e_restart_extra.clear(); +} + +void GCode::PlaceholderParserIntegration::init(const GCodeWriter &writer) +{ + this->reset(); + const std::vector &extruders = writer.extruders(); + if (! extruders.empty()) { + this->num_extruders = extruders.back().id() + 1; + this->e_retracted.assign(num_extruders, 0); + this->e_restart_extra.assign(num_extruders, 0); + this->opt_e_retracted = new ConfigOptionFloats(e_retracted); + this->opt_e_restart_extra = new ConfigOptionFloats(e_restart_extra); + this->output_config.set_key_value("e_retracted", this->opt_e_retracted); + this->output_config.set_key_value("e_restart_extra", this->opt_e_restart_extra); + if (! writer.config.use_relative_e_distances) { + e_position.assign(num_extruders, 0); + opt_e_position = new ConfigOptionFloats(e_position); + this->output_config.set_key_value("e_position", opt_e_position); + } + } + this->opt_extruded_volume = new ConfigOptionFloats(this->num_extruders, 0.f); + this->opt_extruded_weight = new ConfigOptionFloats(this->num_extruders, 0.f); + this->opt_extruded_volume_total = new ConfigOptionFloat(0.f); + this->opt_extruded_weight_total = new ConfigOptionFloat(0.f); + this->parser.set("extruded_volume", this->opt_extruded_volume); + this->parser.set("extruded_weight", this->opt_extruded_weight); + this->parser.set("extruded_volume_total", this->opt_extruded_volume_total); + this->parser.set("extruded_weight_total", this->opt_extruded_weight_total); + + // Reserve buffer for current position. + this->position.assign(3, 0); + this->opt_position = new ConfigOptionFloats(this->position); + this->output_config.set_key_value("position", this->opt_position); + // Store zhop variable into the parser itself, it is a read-only variable to the script. + this->opt_zhop = new ConfigOptionFloat(writer.get_zhop()); + this->parser.set("zhop", this->opt_zhop); +} + +void GCode::PlaceholderParserIntegration::update_from_gcodewriter(const GCodeWriter &writer) +{ + memcpy(this->position.data(), writer.get_position().data(), sizeof(double) * 3); + this->opt_position->values = this->position; + this->opt_zhop->value = writer.get_zhop(); + + if (this->num_extruders > 0) { + const std::vector &extruders = writer.extruders(); + assert(! extruders.empty() && num_extruders == extruders.back().id() + 1); + this->e_retracted.assign(num_extruders, 0); + this->e_restart_extra.assign(num_extruders, 0); + this->opt_extruded_volume->values.assign(num_extruders, 0); + this->opt_extruded_weight->values.assign(num_extruders, 0); + double total_volume = 0.; + double total_weight = 0.; + for (const Extruder &e : extruders) { + this->e_retracted[e.id()] = e.retracted(); + this->e_restart_extra[e.id()] = e.restart_extra(); + double v = e.extruded_volume(); + double w = v * e.filament_density() * 0.001; + this->opt_extruded_volume->values[e.id()] = v; + this->opt_extruded_weight->values[e.id()] = w; + total_volume += v; + total_weight += w; + } + opt_extruded_volume_total->value = total_volume; + opt_extruded_weight_total->value = total_weight; + opt_e_retracted->values = this->e_retracted; + opt_e_restart_extra->values = this->e_restart_extra; + if (! writer.config.use_relative_e_distances) { + this->e_position.assign(num_extruders, 0); + for (const Extruder &e : extruders) + this->e_position[e.id()] = e.position(); + this->opt_e_position->values = this->e_position; + } + } +} + +// Throw if any of the output vector variables were resized by the script. +void GCode::PlaceholderParserIntegration::validate_output_vector_variables() +{ + if (this->opt_position->values.size() != 3) + throw Slic3r::RuntimeError("\"position\" output variable must not be resized by the script."); + if (this->num_extruders > 0) { + if (this->opt_e_position && this->opt_e_position->values.size() != this->num_extruders) + throw Slic3r::RuntimeError("\"e_position\" output variable must not be resized by the script."); + if (this->opt_e_retracted->values.size() != this->num_extruders) + throw Slic3r::RuntimeError("\"e_retracted\" output variable must not be resized by the script."); + if (this->opt_e_restart_extra->values.size() != this->num_extruders) + throw Slic3r::RuntimeError("\"e_restart_extra\" output variable must not be resized by the script."); + } +} + // Collect pairs of object_layer + support_layer sorted by print_z. // object_layer & support_layer are considered to be on the same print_z, if they are not further than EPSILON. -std::vector GCode::collect_layers_to_print(const PrintObject& object) +GCode::ObjectsLayerToPrint GCode::collect_layers_to_print(const PrintObject& object) { - std::vector layers_to_print; + GCode::ObjectsLayerToPrint layers_to_print; layers_to_print.reserve(object.layers().size() + object.support_layers().size()); /* @@ -511,9 +570,9 @@ std::vector GCode::collect_layers_to_print(const PrintObjec // Pair the object layers with the support layers by z. size_t idx_object_layer = 0; size_t idx_support_layer = 0; - const LayerToPrint* last_extrusion_layer = nullptr; + const ObjectLayerToPrint* last_extrusion_layer = nullptr; while (idx_object_layer < object.layers().size() || idx_support_layer < object.support_layers().size()) { - LayerToPrint layer_to_print; + ObjectLayerToPrint layer_to_print; layer_to_print.object_layer = (idx_object_layer < object.layers().size()) ? object.layers()[idx_object_layer++] : nullptr; layer_to_print.support_layer = (idx_support_layer < object.support_layers().size()) ? object.support_layers()[idx_support_layer++] : nullptr; if (layer_to_print.object_layer && layer_to_print.support_layer) { @@ -536,8 +595,8 @@ std::vector GCode::collect_layers_to_print(const PrintObjec // first layer may result in skirt/brim in the air and maybe other issues. if (layers_to_print.size() == 1u) { if (!has_extrusions) - throw Slic3r::SlicingError(_(L("There is an object with no extrusions in the first layer.")) + "\n" + - _(L("Object name")) + ": " + object.model_object()->name); + throw Slic3r::SlicingError(_u8L("There is an object with no extrusions in the first layer.") + "\n" + + _u8L("Object name") + ": " + object.model_object()->name); } // In case there are extrusions on this layer, check there is a layer to lay it on. @@ -567,14 +626,14 @@ std::vector GCode::collect_layers_to_print(const PrintObjec std::string warning; size_t i = 0; for (i = 0; i < std::min(warning_ranges.size(), size_t(3)); ++i) - warning += Slic3r::format(_(L("Empty layer between %1% and %2%.")), + warning += Slic3r::format(_u8L("Empty layer between %1% and %2%."), warning_ranges[i].first, warning_ranges[i].second) + "\n"; if (i < warning_ranges.size()) - warning += _(L("(Some lines not shown)")) + "\n"; + warning += _u8L("(Some lines not shown)") + "\n"; warning += "\n"; - warning += Slic3r::format(_(L("Object name: %1%")), object.model_object()->name) + "\n\n" - + _(L("Make sure the object is printable. This is usually caused by negligibly small extrusions or by a faulty model. " - "Try to repair the model or change its orientation on the bed.")); + warning += Slic3r::format(_u8L("Object name: %1%"), object.model_object()->name) + "\n\n" + + _u8L("Make sure the object is printable. This is usually caused by negligibly small extrusions or by a faulty model. " + "Try to repair the model or change its orientation on the bed."); const_cast(object.print())->active_step_add_warning( PrintStateBase::WarningLevel::CRITICAL, warning); @@ -585,8 +644,8 @@ std::vector GCode::collect_layers_to_print(const PrintObjec // Prepare for non-sequential printing of multiple objects: Support resp. object layers with nearly identical print_z // will be printed for all objects at once. -// Return a list of items. -std::vector>> GCode::collect_layers_to_print(const Print& print) +// Return a list of items. +std::vector> GCode::collect_layers_to_print(const Print& print) { struct OrderingItem { coordf_t print_z; @@ -594,15 +653,15 @@ std::vector>> GCode::collec size_t layer_idx; }; - std::vector> per_object(print.objects().size(), std::vector()); - std::vector ordering; + std::vector per_object(print.objects().size(), ObjectsLayerToPrint()); + std::vector ordering; for (size_t i = 0; i < print.objects().size(); ++i) { per_object[i] = collect_layers_to_print(*print.objects()[i]); OrderingItem ordering_item; ordering_item.object_idx = i; ordering.reserve(ordering.size() + per_object[i].size()); - const LayerToPrint& front = per_object[i].front(); - for (const LayerToPrint& ltp : per_object[i]) { + const ObjectLayerToPrint &front = per_object[i].front(); + for (const ObjectLayerToPrint <p : per_object[i]) { ordering_item.print_z = ltp.print_z(); ordering_item.layer_idx = <p - &front; ordering.emplace_back(ordering_item); @@ -611,7 +670,7 @@ std::vector>> GCode::collec std::sort(ordering.begin(), ordering.end(), [](const OrderingItem& oi1, const OrderingItem& oi2) { return oi1.print_z < oi2.print_z; }); - std::vector>> layers_to_print; + std::vector> layers_to_print; // Merge numerically very close Z values. for (size_t i = 0; i < ordering.size();) { @@ -620,10 +679,10 @@ std::vector>> GCode::collec coordf_t zmax = ordering[i].print_z + EPSILON; for (; j < ordering.size() && ordering[j].print_z <= zmax; ++j); // Merge into layers_to_print. - std::pair> merged; + std::pair merged; // Assign an average print_z to the set of layers with nearly equal print_z. merged.first = 0.5 * (ordering[i].print_z + ordering[j - 1].print_z); - merged.second.assign(print.objects().size(), LayerToPrint()); + merged.second.assign(print.objects().size(), ObjectLayerToPrint()); for (; i < j; ++i) { const OrderingItem& oi = ordering[i]; assert(merged.second[oi.object_idx].layer() == nullptr); @@ -704,25 +763,25 @@ namespace DoExport { }; const GCodeConfig& config = print.config(); - check(_(L("Start G-code")), config.start_gcode.value); - if (ret.size() < MAX_TAGS_COUNT) check(_(L("End G-code")), config.end_gcode.value); - if (ret.size() < MAX_TAGS_COUNT) check(_(L("Before layer change G-code")), config.before_layer_gcode.value); - if (ret.size() < MAX_TAGS_COUNT) check(_(L("After layer change G-code")), config.layer_gcode.value); - if (ret.size() < MAX_TAGS_COUNT) check(_(L("Tool change G-code")), config.toolchange_gcode.value); - if (ret.size() < MAX_TAGS_COUNT) check(_(L("Between objects G-code (for sequential printing)")), config.between_objects_gcode.value); - if (ret.size() < MAX_TAGS_COUNT) check(_(L("Color Change G-code")), config.color_change_gcode.value); - if (ret.size() < MAX_TAGS_COUNT) check(_(L("Pause Print G-code")), config.pause_print_gcode.value); - if (ret.size() < MAX_TAGS_COUNT) check(_(L("Template Custom G-code")), config.template_custom_gcode.value); + check(_u8L("Start G-code"), config.start_gcode.value); + if (ret.size() < MAX_TAGS_COUNT) check(_u8L("End G-code"), config.end_gcode.value); + if (ret.size() < MAX_TAGS_COUNT) check(_u8L("Before layer change G-code"), config.before_layer_gcode.value); + if (ret.size() < MAX_TAGS_COUNT) check(_u8L("After layer change G-code"), config.layer_gcode.value); + if (ret.size() < MAX_TAGS_COUNT) check(_u8L("Tool change G-code"), config.toolchange_gcode.value); + if (ret.size() < MAX_TAGS_COUNT) check(_u8L("Between objects G-code (for sequential printing)"), config.between_objects_gcode.value); + if (ret.size() < MAX_TAGS_COUNT) check(_u8L("Color Change G-code"), config.color_change_gcode.value); + if (ret.size() < MAX_TAGS_COUNT) check(_u8L("Pause Print G-code"), config.pause_print_gcode.value); + if (ret.size() < MAX_TAGS_COUNT) check(_u8L("Template Custom G-code"), config.template_custom_gcode.value); if (ret.size() < MAX_TAGS_COUNT) { for (const std::string& value : config.start_filament_gcode.values) { - check(_(L("Filament Start G-code")), value); + check(_u8L("Filament Start G-code"), value); if (ret.size() == MAX_TAGS_COUNT) break; } } if (ret.size() < MAX_TAGS_COUNT) { for (const std::string& value : config.end_filament_gcode.values) { - check(_(L("Filament End G-code")), value); + check(_u8L("Filament End G-code"), value); if (ret.size() == MAX_TAGS_COUNT) break; } @@ -730,7 +789,7 @@ namespace DoExport { if (ret.size() < MAX_TAGS_COUNT) { const CustomGCode::Info& custom_gcode_per_print_z = print.model().custom_gcode_per_print_z; for (const auto& gcode : custom_gcode_per_print_z.gcodes) { - check(_(L("Custom G-code")), gcode.extra); + check(_u8L("Custom G-code"), gcode.extra); if (ret.size() == MAX_TAGS_COUNT) break; } @@ -742,14 +801,16 @@ namespace DoExport { void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* result, ThumbnailsGeneratorCallback thumbnail_cb) { - PROFILE_CLEAR(); - CNumericLocalesSetter locales_setter; // Does the file exist? If so, we hope that it is still valid. - if (print->is_step_done(psGCodeExport) && boost::filesystem::exists(boost::filesystem::path(path))) - return; + { + PrintStateBase::StateWithTimeStamp state = print->step_state_with_timestamp(psGCodeExport); + if (! state.enabled || (state.is_done() && boost::filesystem::exists(boost::filesystem::path(path)))) + return; + } + // Enabled and either not done, or marked as done while the output file is missing. print->set_started(psGCodeExport); // check if any custom gcode contains keywords used by the gcode processor to @@ -761,9 +822,9 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu reports += source + ": \"" + keyword + "\"\n"; } print->active_step_add_warning(PrintStateBase::WarningLevel::NON_CRITICAL, - _(L("In the custom G-code were found reserved keywords:")) + "\n" + + _u8L("In the custom G-code were found reserved keywords:") + "\n" + reports + - _(L("This may cause problems in g-code visualization and printing time estimation."))); + _u8L("This may cause problems in g-code visualization and printing time estimation.")); } BOOST_LOG_TRIVIAL(info) << "Exporting G-code..." << log_memory_info(); @@ -780,7 +841,6 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu throw Slic3r::RuntimeError(std::string("G-code export to ") + path + " failed.\nCannot open the file for writing.\n"); try { - m_placeholder_parser_failed_templates.clear(); this->_do_export(*print, file, thumbnail_cb); file.flush(); if (file.is_error()) { @@ -797,11 +857,11 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu } file.close(); - if (! m_placeholder_parser_failed_templates.empty()) { + if (! m_placeholder_parser_integration.failed_templates.empty()) { // G-code export proceeded, but some of the PlaceholderParser substitutions failed. //FIXME localize! std::string msg = std::string("G-code export to ") + path + " failed due to invalid custom G-code sections:\n\n"; - for (const auto &name_and_error : m_placeholder_parser_failed_templates) + for (const auto &name_and_error : m_placeholder_parser_integration.failed_templates) msg += name_and_error.first + "\n" + name_and_error.second + "\n"; msg += "\nPlease inspect the file "; msg += path_tmp + " for error messages enclosed between\n"; @@ -831,10 +891,6 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu BOOST_LOG_TRIVIAL(info) << "Exporting G-code finished" << log_memory_info(); print->set_done(psGCodeExport); - - // Write the profiler measurements to file - PROFILE_UPDATE(); - PROFILE_OUTPUT(debug_out_path("gcode-export-profile.txt").c_str()); } // free functions called by GCode::_do_export() @@ -861,7 +917,7 @@ namespace DoExport { region.config().get_abs_value("small_perimeter_speed") == 0 || region.config().get_abs_value("external_perimeter_speed") == 0 || region.config().get_abs_value("bridge_speed") == 0) - mm3_per_mm.push_back(layerm->perimeters.min_mm3_per_mm()); + mm3_per_mm.push_back(layerm->perimeters().min_mm3_per_mm()); if (region.config().get_abs_value("infill_speed") == 0 || region.config().get_abs_value("solid_infill_speed") == 0 || region.config().get_abs_value("top_solid_infill_speed") == 0 || @@ -873,12 +929,12 @@ namespace DoExport { auto min_mm3_per_mm_no_ironing = [](const ExtrusionEntityCollection& eec) -> double { double min = std::numeric_limits::max(); for (const ExtrusionEntity* ee : eec.entities) - if (ee->role() != erIroning) + if (ee->role() != ExtrusionRole::Ironing) min = std::min(min, ee->min_mm3_per_mm()); return min; }; - mm3_per_mm.push_back(min_mm3_per_mm_no_ironing(layerm->fills)); + mm3_per_mm.push_back(min_mm3_per_mm_no_ironing(layerm->fills())); } } } @@ -907,34 +963,7 @@ namespace DoExport { static void init_ooze_prevention(const Print &print, OozePrevention &ooze_prevention) { - // Calculate wiping points if needed - if (print.config().ooze_prevention.value && ! print.config().single_extruder_multi_material) { - Points skirt_points; - for (const ExtrusionEntity *ee : print.skirt().entities) - for (const ExtrusionPath &path : dynamic_cast(ee)->paths) - append(skirt_points, path.polyline.points); - if (! skirt_points.empty()) { - Polygon outer_skirt = Slic3r::Geometry::convex_hull(skirt_points); - Polygons skirts; - for (unsigned int extruder_id : print.extruders()) { - const Vec2d &extruder_offset = print.config().extruder_offset.get_at(extruder_id); - Polygon s(outer_skirt); - s.translate(Point::new_scale(-extruder_offset(0), -extruder_offset(1))); - skirts.emplace_back(std::move(s)); - } - ooze_prevention.enable = true; - ooze_prevention.standby_points = offset(Slic3r::Geometry::convex_hull(skirts), float(scale_(3.))).front().equally_spaced_points(float(scale_(10.))); - #if 0 - require "Slic3r/SVG.pm"; - Slic3r::SVG::output( - "ooze_prevention.svg", - red_polygons => \@skirts, - polygons => [$outer_skirt], - points => $gcodegen->ooze_prevention->standby_points, - ); - #endif - } - } + ooze_prevention.enable = print.config().ooze_prevention.value && ! print.config().single_extruder_multi_material; } // Fill in print_statistics and return formatted string containing filament statistics to be inserted into G-code comment section. @@ -1051,8 +1080,6 @@ std::vector sort_object_instances_by_model_order(const Pri void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGeneratorCallback thumbnail_cb) { - PROFILE_FUNC(); - // modifies m_silent_time_estimator_enabled DoExport::init_gcode_processor(print.config(), m_processor, m_silent_time_estimator_enabled); @@ -1085,18 +1112,6 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato std::sort(zs.begin(), zs.end()); m_layer_count += (unsigned int)(object->instances().size() * (std::unique(zs.begin(), zs.end()) - zs.begin())); } - } else { - // Print all objects with the same print_z together. - std::vector zs; - for (auto object : print.objects()) { - zs.reserve(zs.size() + object->layers().size() + object->support_layers().size()); - for (auto layer : object->layers()) - zs.push_back(layer->print_z); - for (auto layer : object->support_layers()) - zs.push_back(layer->print_z); - } - std::sort(zs.begin(), zs.end()); - m_layer_count = (unsigned int)(std::unique(zs.begin(), zs.end()) - zs.begin()); } print.throw_if_canceled(); @@ -1114,6 +1129,10 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato m_pressure_equalizer = make_unique(print.config()); m_enable_extrusion_role_markers = (bool)m_pressure_equalizer; + if (print.config().avoid_crossing_curled_overhangs){ + this->m_avoid_crossing_curled_overhangs.init_bed_shape(get_bed_shape(print.config())); + } + // Write information on the generator. file.write_format("; %s\n\n", Slic3r::header_slic3r_generated().c_str()); @@ -1171,10 +1190,12 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato file.find_replace_enable(); // Prepare the helper object for replacing placeholders in custom G-code and output filename. - m_placeholder_parser = print.placeholder_parser(); - m_placeholder_parser.update_timestamp(); - m_placeholder_parser_context.rng = std::mt19937(std::chrono::high_resolution_clock::now().time_since_epoch().count()); - print.update_object_placeholders(m_placeholder_parser.config_writable(), ".gcode"); + m_placeholder_parser_integration.parser = print.placeholder_parser(); + m_placeholder_parser_integration.parser.update_timestamp(); + m_placeholder_parser_integration.context.rng = std::mt19937(std::chrono::high_resolution_clock::now().time_since_epoch().count()); + // Enable passing global variables between PlaceholderParser invocations. + m_placeholder_parser_integration.context.global_config = std::make_unique(); + print.update_object_placeholders(m_placeholder_parser_integration.parser.config_writable(), ".gcode"); // Get optimal tool ordering to minimize tool switches of a multi-exruder print. // For a print by objects, find the 1st printing object. @@ -1197,7 +1218,7 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato } if (initial_extruder_id == static_cast(-1)) // No object to print was found, cancel the G-code export. - throw Slic3r::SlicingError(_(L("No extrusions were generated for objects."))); + throw Slic3r::SlicingError(_u8L("No extrusions were generated for objects.")); // We don't allow switching of extruders per layer by Model::custom_gcode_per_print_z in sequential mode. // Use the extruder IDs collected from Regions. this->set_extruders(print.extruders()); @@ -1208,7 +1229,7 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato tool_ordering.assign_custom_gcodes(print); if (tool_ordering.all_extruders().empty()) // No object to print was found, cancel the G-code export. - throw Slic3r::SlicingError(_(L("No extrusions were generated for objects."))); + throw Slic3r::SlicingError(_u8L("No extrusions were generated for objects.")); has_wipe_tower = print.has_wipe_tower() && tool_ordering.has_wipe_tower(); initial_extruder_id = (has_wipe_tower && ! print.config().single_extruder_multi_material_priming) ? // The priming towers will be skipped. @@ -1220,6 +1241,7 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato this->set_extruders(tool_ordering.all_extruders()); // Order object instances using a nearest neighbor search. print_object_instances_ordering = chain_print_object_instances(print); + m_layer_count = tool_ordering.layer_tools().size(); } if (initial_extruder_id == (unsigned int)-1) { // Nothing to print! @@ -1237,27 +1259,25 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato // Emit machine envelope limits for the Marlin firmware. this->print_machine_envelope(file, print); - // Disable fan. - if (! print.config().cooling.get_at(initial_extruder_id) || print.config().disable_fan_first_layers.get_at(initial_extruder_id)) - file.write(m_writer.set_fan(0)); - + // Update output variables after the extruders were initialized. + m_placeholder_parser_integration.init(m_writer); // Let the start-up script prime the 1st printing tool. - m_placeholder_parser.set("initial_tool", initial_extruder_id); - m_placeholder_parser.set("initial_extruder", initial_extruder_id); - m_placeholder_parser.set("current_extruder", initial_extruder_id); + this->placeholder_parser().set("initial_tool", initial_extruder_id); + this->placeholder_parser().set("initial_extruder", initial_extruder_id); + this->placeholder_parser().set("current_extruder", initial_extruder_id); //Set variable for total layer count so it can be used in custom gcode. - m_placeholder_parser.set("total_layer_count", m_layer_count); + this->placeholder_parser().set("total_layer_count", m_layer_count); // Useful for sequential prints. - m_placeholder_parser.set("current_object_idx", 0); + this->placeholder_parser().set("current_object_idx", 0); // For the start / end G-code to do the priming and final filament pull in case there is no wipe tower provided. - m_placeholder_parser.set("has_wipe_tower", has_wipe_tower); - m_placeholder_parser.set("has_single_extruder_multi_material_priming", has_wipe_tower && print.config().single_extruder_multi_material_priming); - m_placeholder_parser.set("total_toolchanges", std::max(0, print.wipe_tower_data().number_of_toolchanges)); // Check for negative toolchanges (single extruder mode) and set to 0 (no tool change). + this->placeholder_parser().set("has_wipe_tower", has_wipe_tower); + this->placeholder_parser().set("has_single_extruder_multi_material_priming", has_wipe_tower && print.config().single_extruder_multi_material_priming); + this->placeholder_parser().set("total_toolchanges", std::max(0, print.wipe_tower_data().number_of_toolchanges)); // Check for negative toolchanges (single extruder mode) and set to 0 (no tool change). { BoundingBoxf bbox(print.config().bed_shape.values); - m_placeholder_parser.set("print_bed_min", new ConfigOptionFloats({ bbox.min.x(), bbox.min.y() })); - m_placeholder_parser.set("print_bed_max", new ConfigOptionFloats({ bbox.max.x(), bbox.max.y() })); - m_placeholder_parser.set("print_bed_size", new ConfigOptionFloats({ bbox.size().x(), bbox.size().y() })); + this->placeholder_parser().set("print_bed_min", new ConfigOptionFloats({ bbox.min.x(), bbox.min.y() })); + this->placeholder_parser().set("print_bed_max", new ConfigOptionFloats({ bbox.max.x(), bbox.max.y() })); + this->placeholder_parser().set("print_bed_size", new ConfigOptionFloats({ bbox.size().x(), bbox.size().y() })); } { // Convex hull of the 1st layer extrusions, for bed leveling and placing the initial purge line. @@ -1270,11 +1290,20 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato for (const Point &pt : print.first_layer_convex_hull().points) pts->values.emplace_back(unscale(pt)); BoundingBoxf bbox(pts->values); - m_placeholder_parser.set("first_layer_print_convex_hull", pts.release()); - m_placeholder_parser.set("first_layer_print_min", new ConfigOptionFloats({ bbox.min.x(), bbox.min.y() })); - m_placeholder_parser.set("first_layer_print_max", new ConfigOptionFloats({ bbox.max.x(), bbox.max.y() })); - m_placeholder_parser.set("first_layer_print_size", new ConfigOptionFloats({ bbox.size().x(), bbox.size().y() })); + this->placeholder_parser().set("first_layer_print_convex_hull", pts.release()); + this->placeholder_parser().set("first_layer_print_min", new ConfigOptionFloats({ bbox.min.x(), bbox.min.y() })); + this->placeholder_parser().set("first_layer_print_max", new ConfigOptionFloats({ bbox.max.x(), bbox.max.y() })); + this->placeholder_parser().set("first_layer_print_size", new ConfigOptionFloats({ bbox.size().x(), bbox.size().y() })); + + std::vector is_extruder_used(print.config().nozzle_diameter.size(), 0); + for (unsigned int extruder_id : tool_ordering.all_extruders()) + is_extruder_used[extruder_id] = true; + this->placeholder_parser().set("is_extruder_used", new ConfigOptionBools(is_extruder_used)); } + + // Enable ooze prevention if configured so. + DoExport::init_ooze_prevention(print, m_ooze_prevention); + std::string start_gcode = this->placeholder_parser_process("start_gcode", print.config().start_gcode.value, initial_extruder_id); // Set bed temperature if the start G-code does not contain any bed temp control G-codes. this->_print_first_layer_bed_temperature(file, print, start_gcode, initial_extruder_id, true); @@ -1282,28 +1311,17 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato this->_print_first_layer_extruder_temperatures(file, print, start_gcode, initial_extruder_id, false); // adds tag for processor - file.write_format(";%s%s\n", GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Role).c_str(), ExtrusionEntity::role_to_string(erCustom).c_str()); + file.write_format(";%s%s\n", GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Role).c_str(), gcode_extrusion_role_to_string(GCodeExtrusionRole::Custom).c_str()); // Write the custom start G-code file.writeln(start_gcode); - // Process filament-specific gcode. - /* if (has_wipe_tower) { - // Wipe tower will control the extruder switching, it will call the start_filament_gcode. - } else { - DynamicConfig config; - config.set_key_value("filament_extruder_id", new ConfigOptionInt(int(initial_extruder_id))); - file.writeln(this->placeholder_parser_process("start_filament_gcode", print.config().start_filament_gcode.values[initial_extruder_id], initial_extruder_id, &config)); - } -*/ this->_print_first_layer_extruder_temperatures(file, print, start_gcode, initial_extruder_id, true); print.throw_if_canceled(); // Set other general things. file.write(this->preamble()); - // Calculate wiping points if needed - DoExport::init_ooze_prevention(print, m_ooze_prevention); print.throw_if_canceled(); // Collect custom seam data from all objects. @@ -1340,14 +1358,14 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato m_enable_cooling_markers = false; // we're not filtering these moves through CoolingBuffer m_avoid_crossing_perimeters.use_external_mp_once(); file.write(this->retract()); - file.write(this->travel_to(Point(0, 0), erNone, "move to origin position for next object")); + file.write(this->travel_to(Point(0, 0), ExtrusionRole::None, "move to origin position for next object")); m_enable_cooling_markers = true; // Disable motion planner when traveling to first object point. m_avoid_crossing_perimeters.disable_once(); // Ff we are printing the bottom layer of an object, and we have already finished // another one, set first layer temperatures. This happens before the Z move // is triggered, so machine has more time to reach such temperatures. - m_placeholder_parser.set("current_object_idx", int(finished_objects)); + this->placeholder_parser().set("current_object_idx", int(finished_objects)); std::string between_objects_gcode = this->placeholder_parser_process("between_objects_gcode", print.config().between_objects_gcode.value, initial_extruder_id); // Set first layer bed and extruder temperatures, don't wait for it to reach the temperature. this->_print_first_layer_bed_temperature(file, print, between_objects_gcode, initial_extruder_id, false); @@ -1370,7 +1388,7 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato } else { // Sort layers by Z. // All extrusion moves with the same top layer height are extruded uninterrupted. - std::vector>> layers_to_print = collect_layers_to_print(print); + std::vector> layers_to_print = collect_layers_to_print(print); // Prusa Multi-Material wipe tower. if (has_wipe_tower && ! layers_to_print.empty()) { m_wipe_tower.reset(new WipeTowerIntegration(print.config(), *print.wipe_tower_data().priming.get(), print.wipe_tower_data().tool_changes, *print.wipe_tower_data().final_purge.get())); @@ -1403,8 +1421,8 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato // (See https://github.com/prusa3d/PrusaSlicer/issues/5441.) if (overlap) { print.active_step_add_warning(PrintStateBase::WarningLevel::CRITICAL, - _(L("Your print is very close to the priming regions. " - "Make sure there is no collision."))); + _u8L("Your print is very close to the priming regions. " + "Make sure there is no collision.")); } else { // Just continue printing, no action necessary. } @@ -1427,13 +1445,13 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato file.write(m_writer.set_fan(0)); // adds tag for processor - file.write_format(";%s%s\n", GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Role).c_str(), ExtrusionEntity::role_to_string(erCustom).c_str()); + file.write_format(";%s%s\n", GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Role).c_str(), gcode_extrusion_role_to_string(GCodeExtrusionRole::Custom).c_str()); // Process filament-specific gcode in extruder order. { DynamicConfig config; config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index)); - config.set_key_value("layer_z", new ConfigOptionFloat(m_writer.get_position()(2) - m_config.z_offset.value)); + config.set_key_value("layer_z", new ConfigOptionFloat(m_writer.get_position().z() - m_config.z_offset.value)); config.set_key_value("max_layer_z", new ConfigOptionFloat(m_max_layer_z)); if (print.config().single_extruder_multi_material) { // Process the end_filament_gcode for the active filament only. @@ -1491,32 +1509,6 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato print.throw_if_canceled(); } -// For unknown reasons and in sporadic cases when GCode export is processing, some participating thread -// in tbb::parallel_pipeline has not set locales to "C", probably because this thread is newly spawned. -// So in this class method on_scheduler_entry is called for every thread before it starts participating -// in tbb::parallel_pipeline to ensure that locales are set correctly - -// For tbb::parallel_pipeline, it seems that on_scheduler_entry is called for every layer and every filter. -// We ensure using thread-local storage that locales will be set to "C" just once for any participating thread. -class TBBLocalesSetter : public tbb::task_scheduler_observer -{ -public: - TBBLocalesSetter() { this->observe(true); } - ~TBBLocalesSetter() override { this->observe(false); }; - - void on_scheduler_entry(bool is_worker) override - { - if (bool &is_locales_sets = m_is_locales_sets.local(); !is_locales_sets) { - // Set locales of the worker thread to "C". - set_c_locales(); - is_locales_sets = true; - } - } - -private: - tbb::enumerable_thread_specific, tbb::ets_key_usage_type::ets_key_per_instance> m_is_locales_sets{false}; -}; - // Process all layers of all objects (non-sequential mode) with a parallel pipeline: // Generate G-code, run the filters (vase mode, cooling buffer), run the G-code analyser // and export G-code into file. @@ -1524,7 +1516,7 @@ void GCode::process_layers( const Print &print, const ToolOrdering &tool_ordering, const std::vector &print_object_instances_ordering, - const std::vector>> &layers_to_print, + const std::vector> &layers_to_print, GCodeOutputStream &output_stream) { // The pipeline is variable: The vase mode filter is optional. @@ -1542,7 +1534,7 @@ void GCode::process_layers( return LayerResult::make_nop_layer_result(); } } else { - const std::pair>& layer = layers_to_print[layer_to_print_idx++]; + const std::pair &layer = layers_to_print[layer_to_print_idx++]; const LayerTools& layer_tools = tool_ordering.tools_for_layer(layer.first); if (m_wipe_tower && layer_tools.has_wipe_tower) m_wipe_tower->next_layer(); @@ -1551,27 +1543,27 @@ void GCode::process_layers( } }); const auto spiral_vase = tbb::make_filter(slic3r_tbb_filtermode::serial_in_order, - [&spiral_vase = *this->m_spiral_vase](LayerResult in) -> LayerResult { + [spiral_vase = this->m_spiral_vase.get()](LayerResult in) -> LayerResult { if (in.nop_layer_result) return in; - spiral_vase.enable(in.spiral_vase_enable); - return { spiral_vase.process_layer(std::move(in.gcode)), in.layer_id, in.spiral_vase_enable, in.cooling_buffer_flush}; + spiral_vase->enable(in.spiral_vase_enable); + return { spiral_vase->process_layer(std::move(in.gcode)), in.layer_id, in.spiral_vase_enable, in.cooling_buffer_flush}; }); const auto pressure_equalizer = tbb::make_filter(slic3r_tbb_filtermode::serial_in_order, - [&pressure_equalizer = *this->m_pressure_equalizer](LayerResult in) -> LayerResult { - return pressure_equalizer.process_layer(std::move(in)); + [pressure_equalizer = this->m_pressure_equalizer.get()](LayerResult in) -> LayerResult { + return pressure_equalizer->process_layer(std::move(in)); }); const auto cooling = tbb::make_filter(slic3r_tbb_filtermode::serial_in_order, - [&cooling_buffer = *this->m_cooling_buffer](LayerResult in) -> std::string { + [cooling_buffer = this->m_cooling_buffer.get()](LayerResult in) -> std::string { if (in.nop_layer_result) return in.gcode; - return cooling_buffer.process_layer(std::move(in.gcode), in.layer_id, in.cooling_buffer_flush); + return cooling_buffer->process_layer(std::move(in.gcode), in.layer_id, in.cooling_buffer_flush); }); const auto find_replace = tbb::make_filter(slic3r_tbb_filtermode::serial_in_order, - [&self = *this->m_find_replace](std::string s) -> std::string { - return self.process_layer(std::move(s)); + [find_replace = this->m_find_replace.get()](std::string s) -> std::string { + return find_replace->process_layer(std::move(s)); }); const auto output = tbb::make_filter(slic3r_tbb_filtermode::serial_in_order, [&output_stream](std::string s) { output_stream.write(s); } @@ -1608,7 +1600,7 @@ void GCode::process_layers( void GCode::process_layers( const Print &print, const ToolOrdering &tool_ordering, - std::vector layers_to_print, + ObjectsLayerToPrint layers_to_print, const size_t single_object_idx, GCodeOutputStream &output_stream) { @@ -1627,31 +1619,31 @@ void GCode::process_layers( return LayerResult::make_nop_layer_result(); } } else { - LayerToPrint &layer = layers_to_print[layer_to_print_idx ++]; + ObjectLayerToPrint &layer = layers_to_print[layer_to_print_idx ++]; print.throw_if_canceled(); return this->process_layer(print, { std::move(layer) }, tool_ordering.tools_for_layer(layer.print_z()), &layer == &layers_to_print.back(), nullptr, single_object_idx); } }); const auto spiral_vase = tbb::make_filter(slic3r_tbb_filtermode::serial_in_order, - [&spiral_vase = *this->m_spiral_vase](LayerResult in)->LayerResult { + [spiral_vase = this->m_spiral_vase.get()](LayerResult in)->LayerResult { if (in.nop_layer_result) return in; - spiral_vase.enable(in.spiral_vase_enable); - return { spiral_vase.process_layer(std::move(in.gcode)), in.layer_id, in.spiral_vase_enable, in.cooling_buffer_flush }; + spiral_vase->enable(in.spiral_vase_enable); + return { spiral_vase->process_layer(std::move(in.gcode)), in.layer_id, in.spiral_vase_enable, in.cooling_buffer_flush }; }); const auto pressure_equalizer = tbb::make_filter(slic3r_tbb_filtermode::serial_in_order, - [&pressure_equalizer = *this->m_pressure_equalizer](LayerResult in) -> LayerResult { - return pressure_equalizer.process_layer(std::move(in)); + [pressure_equalizer = this->m_pressure_equalizer.get()](LayerResult in) -> LayerResult { + return pressure_equalizer->process_layer(std::move(in)); }); const auto cooling = tbb::make_filter(slic3r_tbb_filtermode::serial_in_order, - [&cooling_buffer = *this->m_cooling_buffer](LayerResult in)->std::string { + [cooling_buffer = this->m_cooling_buffer.get()](LayerResult in)->std::string { if (in.nop_layer_result) return in.gcode; - return cooling_buffer.process_layer(std::move(in.gcode), in.layer_id, in.cooling_buffer_flush); + return cooling_buffer->process_layer(std::move(in.gcode), in.layer_id, in.cooling_buffer_flush); }); const auto find_replace = tbb::make_filter(slic3r_tbb_filtermode::serial_in_order, - [&self = *this->m_find_replace](std::string s) -> std::string { - return self.process_layer(std::move(s)); + [find_replace = this->m_find_replace.get()](std::string s) -> std::string { + return find_replace->process_layer(std::move(s)); }); const auto output = tbb::make_filter(slic3r_tbb_filtermode::serial_in_order, [&output_stream](std::string s) { output_stream.write(s); } @@ -1682,17 +1674,46 @@ void GCode::process_layers( output_stream.find_replace_enable(); } -std::string GCode::placeholder_parser_process(const std::string &name, const std::string &templ, unsigned int current_extruder_id, const DynamicConfig *config_override) +std::string GCode::placeholder_parser_process( + const std::string &name, + const std::string &templ, + unsigned int current_extruder_id, + const DynamicConfig *config_override) { + PlaceholderParserIntegration &ppi = m_placeholder_parser_integration; try { - return m_placeholder_parser.process(templ, current_extruder_id, config_override, &m_placeholder_parser_context); - } catch (std::runtime_error &err) { + ppi.update_from_gcodewriter(m_writer); + std::string output = ppi.parser.process(templ, current_extruder_id, config_override, &ppi.output_config, &ppi.context); + ppi.validate_output_vector_variables(); + + if (const std::vector &pos = ppi.opt_position->values; ppi.position != pos) { + // Update G-code writer. + m_writer.update_position({ pos[0], pos[1], pos[2] }); + this->set_last_pos(this->gcode_to_point({ pos[0], pos[1] })); + } + + for (const Extruder &e : m_writer.extruders()) { + unsigned int eid = e.id(); + assert(eid < ppi.num_extruders); + if ( eid < ppi.num_extruders) { + if (! m_writer.config.use_relative_e_distances && ! is_approx(ppi.e_position[eid], ppi.opt_e_position->values[eid])) + const_cast(e).set_position(ppi.opt_e_position->values[eid]); + if (! is_approx(ppi.e_retracted[eid], ppi.opt_e_retracted->values[eid]) || + ! is_approx(ppi.e_restart_extra[eid], ppi.opt_e_restart_extra->values[eid])) + const_cast(e).set_retracted(ppi.opt_e_retracted->values[eid], ppi.opt_e_restart_extra->values[eid]); + } + } + + return output; + } + catch (std::runtime_error &err) + { // Collect the names of failed template substitutions for error reporting. - auto it = m_placeholder_parser_failed_templates.find(name); - if (it == m_placeholder_parser_failed_templates.end()) + auto it = ppi.failed_templates.find(name); + if (it == ppi.failed_templates.end()) // Only if there was no error reported for this template, store the first error message into the map to be reported. // We don't want to collect error message for each and every occurence of a single custom G-code section. - m_placeholder_parser_failed_templates.insert(it, std::make_pair(name, std::string(err.what()))); + ppi.failed_templates.insert(it, std::make_pair(name, std::string(err.what()))); // Insert the macro error message into the G-code. return std::string("\n!!!!! Failed to process the custom G-code template ") + name + "\n" + @@ -1785,23 +1806,25 @@ void GCode::print_machine_envelope(GCodeOutputStream &file, Print &print) int(print.config().machine_max_feedrate_e.values.front() * factor + 0.5), factor == 60 ? "mm / min" : "mm / sec"); - // Now M204 - acceleration. This one is quite hairy thanks to how Marlin guys care about - // backwards compatibility: https://github.com/prusa3d/PrusaSlicer/issues/1089 - // Legacy Marlin should export travel acceleration the same as printing acceleration. - // MarlinFirmware has the two separated. - int travel_acc = flavor == gcfMarlinLegacy - ? int(print.config().machine_max_acceleration_extruding.values.front() + 0.5) - : int(print.config().machine_max_acceleration_travel.values.front() + 0.5); - // Retract acceleration not accepted in M204 in RRF + // Now M204 - acceleration. This one is quite hairy... if (flavor == gcfRepRapFirmware) + // Uses M204 P[print] T[travel] file.write_format("M204 P%d T%d ; sets acceleration (P, T), mm/sec^2\n", int(print.config().machine_max_acceleration_extruding.values.front() + 0.5), - travel_acc); - else + int(print.config().machine_max_acceleration_travel.values.front() + 0.5)); + else if (flavor == gcfMarlinLegacy) + // Legacy Marlin uses M204 S[print] T[retract] + file.write_format("M204 S%d T%d ; sets acceleration (S) and retract acceleration (R), mm/sec^2\n", + int(print.config().machine_max_acceleration_extruding.values.front() + 0.5), + int(print.config().machine_max_acceleration_retracting.values.front() + 0.5)); + else if (flavor == gcfMarlinFirmware) + // New Marlin uses M204 P[print] R[retract] T[travel] file.write_format("M204 P%d R%d T%d ; sets acceleration (P, T) and retract acceleration (R), mm/sec^2\n", int(print.config().machine_max_acceleration_extruding.values.front() + 0.5), int(print.config().machine_max_acceleration_retracting.values.front() + 0.5), - travel_acc); + int(print.config().machine_max_acceleration_travel.values.front() + 0.5)); + else + assert(false); assert(is_decimal_separator_point()); file.write_format(flavor == gcfRepRapFirmware @@ -1828,17 +1851,18 @@ void GCode::print_machine_envelope(GCodeOutputStream &file, Print &print) // M190 - Set Extruder Temperature and Wait void GCode::_print_first_layer_bed_temperature(GCodeOutputStream &file, Print &print, const std::string &gcode, unsigned int first_printing_extruder_id, bool wait) { + bool autoemit = print.config().autoemit_temperature_commands; // Initial bed temperature based on the first extruder. int temp = print.config().first_layer_bed_temperature.get_at(first_printing_extruder_id); // Is the bed temperature set by the provided custom G-code? int temp_by_gcode = -1; bool temp_set_by_gcode = custom_gcode_sets_temperature(gcode, 140, 190, false, temp_by_gcode); - if (temp_set_by_gcode && temp_by_gcode >= 0 && temp_by_gcode < 1000) + if (autoemit && temp_set_by_gcode && temp_by_gcode >= 0 && temp_by_gcode < 1000) temp = temp_by_gcode; // Always call m_writer.set_bed_temperature() so it will set the internal "current" state of the bed temp as if // the custom start G-code emited these. std::string set_temp_gcode = m_writer.set_bed_temperature(temp, wait); - if (! temp_set_by_gcode) + if (autoemit && ! temp_set_by_gcode) file.write(set_temp_gcode); } @@ -1849,13 +1873,14 @@ void GCode::_print_first_layer_bed_temperature(GCodeOutputStream &file, Print &p // RepRapFirmware: G10 Sxx void GCode::_print_first_layer_extruder_temperatures(GCodeOutputStream &file, Print &print, const std::string &gcode, unsigned int first_printing_extruder_id, bool wait) { + bool autoemit = print.config().autoemit_temperature_commands; // Is the bed temperature set by the provided custom G-code? int temp_by_gcode = -1; bool include_g10 = print.config().gcode_flavor == gcfRepRapFirmware; - if (custom_gcode_sets_temperature(gcode, 104, 109, include_g10, temp_by_gcode)) { + if (! autoemit || custom_gcode_sets_temperature(gcode, 104, 109, include_g10, temp_by_gcode)) { // Set the extruder temperature at m_writer, but throw away the generated G-code as it will be written with the custom G-code. int temp = print.config().first_layer_temperature.get_at(first_printing_extruder_id); - if (temp_by_gcode >= 0 && temp_by_gcode < 1000) + if (autoemit && temp_by_gcode >= 0 && temp_by_gcode < 1000) temp = temp_by_gcode; m_writer.set_temperature(temp, wait, first_printing_extruder_id); } else { @@ -1869,8 +1894,14 @@ void GCode::_print_first_layer_extruder_temperatures(GCodeOutputStream &file, Pr // Set temperatures of all the printing extruders. for (unsigned int tool_id : print.extruders()) { int temp = print.config().first_layer_temperature.get_at(tool_id); - if (print.config().ooze_prevention.value) - temp += print.config().standby_temperature_delta.value; + + if (print.config().ooze_prevention.value && tool_id != first_printing_extruder_id) { + if (print.config().idle_temperature.is_nil(tool_id)) + temp += print.config().standby_temperature_delta.value; + else + temp = print.config().idle_temperature.get_at(tool_id); + } + if (temp > 0) file.write(m_writer.set_temperature(temp, wait, tool_id)); } @@ -1878,70 +1909,37 @@ void GCode::_print_first_layer_extruder_temperatures(GCodeOutputStream &file, Pr } } -inline GCode::ObjectByExtruder& object_by_extruder( - std::map> &by_extruder, - unsigned int extruder_id, - size_t object_idx, - size_t num_objects) -{ - std::vector &objects_by_extruder = by_extruder[extruder_id]; - if (objects_by_extruder.empty()) - objects_by_extruder.assign(num_objects, GCode::ObjectByExtruder()); - return objects_by_extruder[object_idx]; -} - -inline std::vector& object_islands_by_extruder( - std::map> &by_extruder, - unsigned int extruder_id, - size_t object_idx, - size_t num_objects, - size_t num_islands) -{ - std::vector &islands = object_by_extruder(by_extruder, extruder_id, object_idx, num_objects).islands; - if (islands.empty()) - islands.assign(num_islands, GCode::ObjectByExtruder::Island()); - return islands; -} - std::vector GCode::sort_print_object_instances( - std::vector &objects_by_extruder, - const std::vector &layers, + const std::vector &object_layers, // Ordering must be defined for normal (non-sequential print). - const std::vector *ordering, + const std::vector *ordering, // For sequential print, the instance of the object to be printing has to be defined. - const size_t single_object_instance_idx) + const size_t single_object_instance_idx) { std::vector out; if (ordering == nullptr) { // Sequential print, single object is being printed. - for (ObjectByExtruder &object_by_extruder : objects_by_extruder) { - const size_t layer_id = &object_by_extruder - objects_by_extruder.data(); - const PrintObject *print_object = layers[layer_id].object(); - if (print_object) - out.emplace_back(object_by_extruder, layer_id, *print_object, single_object_instance_idx); - } + assert(object_layers.size() == 1); + out.emplace_back(0, *object_layers.front().object(), single_object_instance_idx); } else { - // Create mapping from PrintObject* to ObjectByExtruder*. - std::vector> sorted; - sorted.reserve(objects_by_extruder.size()); - for (ObjectByExtruder &object_by_extruder : objects_by_extruder) { - const size_t layer_id = &object_by_extruder - objects_by_extruder.data(); - const PrintObject *print_object = layers[layer_id].object(); - if (print_object) - sorted.emplace_back(print_object, &object_by_extruder); - } + // Create mapping from PrintObject* to ObjectLayerToPrint ID. + std::vector> sorted; + sorted.reserve(object_layers.size()); + for (const ObjectLayerToPrint &object : object_layers) + if (const PrintObject* print_object = object.object(); print_object) + sorted.emplace_back(print_object, &object - object_layers.data()); std::sort(sorted.begin(), sorted.end()); if (! sorted.empty()) { out.reserve(sorted.size()); for (const PrintInstance *instance : *ordering) { const PrintObject &print_object = *instance->print_object; - std::pair key(&print_object, nullptr); + std::pair key(&print_object, 0); auto it = std::lower_bound(sorted.begin(), sorted.end(), key); if (it != sorted.end() && it->first == &print_object) - // ObjectByExtruder for this PrintObject was found. - out.emplace_back(*it->second, it->second - objects_by_extruder.data(), print_object, instance - print_object.instances().data()); + // ObjectLayerToPrint for this PrintObject was found. + out.emplace_back(it->second, print_object, instance - print_object.instances().data()); } } } @@ -1991,6 +1989,8 @@ namespace ProcessLayer // && !MMU1 ) { //! FIXME_in_fw show message during print pause + // FIXME: Why is pause_print_gcode here? Why is it supplied "color_change_extruder"? Why is that not + // passed to color_change_gcode below? DynamicConfig cfg; cfg.set_key_value("color_change_extruder", new ConfigOptionInt(m600_extruder_before_layer)); gcode += gcodegen.placeholder_parser_process("pause_print_gcode", config.pause_print_gcode, current_extruder_id, &cfg); @@ -2106,7 +2106,7 @@ namespace Skirt { LayerResult GCode::process_layer( const Print &print, // Set of object & print layers of the same PrintObject and with the same print_z. - const std::vector &layers, + const ObjectsLayerToPrint &layers, const LayerTools &layer_tools, const bool last_layer, // Pairs of PrintObject index and its instance index. @@ -2123,7 +2123,7 @@ LayerResult GCode::process_layer( const Layer *object_layer = nullptr; const SupportLayer *support_layer = nullptr; const SupportLayer *raft_layer = nullptr; - for (const LayerToPrint &l : layers) { + for (const ObjectLayerToPrint &l : layers) { if (l.object_layer && ! object_layer) object_layer = l.object_layer; if (l.support_layer) { @@ -2133,7 +2133,7 @@ LayerResult GCode::process_layer( raft_layer = support_layer; } } - const Layer &layer = (object_layer != nullptr) ? *object_layer : *support_layer; + const Layer &layer = (object_layer != nullptr) ? *object_layer : *support_layer; LayerResult result { {}, layer.id(), false, last_layer, false}; if (layer_tools.extruders.empty()) // Nothing to extrude. @@ -2155,8 +2155,8 @@ LayerResult GCode::process_layer( if (enable) { for (const LayerRegion *layer_region : layer.regions()) if (size_t(layer_region->region().config().bottom_solid_layers.value) > layer.id() || - layer_region->perimeters.items_count() > 1u || - layer_region->fills.items_count() > 0) { + layer_region->perimeters().items_count() > 1u || + layer_region->fills().items_count() > 0) { enable = false; break; } @@ -2201,21 +2201,24 @@ LayerResult GCode::process_layer( DynamicConfig config; config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index)); config.set_key_value("layer_z", new ConfigOptionFloat(print_z)); + config.set_key_value("max_layer_z", new ConfigOptionFloat(m_max_layer_z)); gcode += this->placeholder_parser_process("layer_gcode", print.config().layer_gcode.value, m_writer.extruder()->id(), &config) + "\n"; - config.set_key_value("max_layer_z", new ConfigOptionFloat(m_max_layer_z)); } if (! first_layer && ! m_second_layer_things_done) { // Transition from 1st to 2nd layer. Adjust nozzle temperatures as prescribed by the nozzle dependent // first_layer_temperature vs. temperature settings. for (const Extruder &extruder : m_writer.extruders()) { - if (print.config().single_extruder_multi_material.value && extruder.id() != m_writer.extruder()->id()) + if (print.config().single_extruder_multi_material.value || m_ooze_prevention.enable) { // In single extruder multi material mode, set the temperature for the current extruder only. - continue; + // The same applies when ooze prevention is enabled. + if (extruder.id() != m_writer.extruder()->id()) + continue; + } int temperature = print.config().temperature.get_at(extruder.id()); - if (temperature > 0 && temperature != print.config().first_layer_temperature.get_at(extruder.id())) + if (temperature > 0 && (temperature != print.config().first_layer_temperature.get_at(extruder.id()))) gcode += m_writer.set_temperature(temperature, false, extruder.id()); } gcode += m_writer.set_bed_temperature(print.config().bed_temperature.get_at(first_extruder_id)); @@ -2236,163 +2239,21 @@ LayerResult GCode::process_layer( Skirt::make_skirt_loops_per_extruder_1st_layer(print, layer_tools, m_skirt_done) : Skirt::make_skirt_loops_per_extruder_other_layers(print, layer_tools, m_skirt_done); - // Group extrusions by an extruder, then by an object, an island and a region. - std::map> by_extruder; - bool is_anything_overridden = const_cast(layer_tools).wiping_extrusions().is_anything_overridden(); - for (const LayerToPrint &layer_to_print : layers) { - if (layer_to_print.support_layer != nullptr) { - const SupportLayer &support_layer = *layer_to_print.support_layer; - const PrintObject &object = *support_layer.object(); - if (! support_layer.support_fills.entities.empty()) { - ExtrusionRole role = support_layer.support_fills.role(); - bool has_support = role == erMixed || role == erSupportMaterial; - bool has_interface = role == erMixed || role == erSupportMaterialInterface; - // Extruder ID of the support base. -1 if "don't care". - unsigned int support_extruder = object.config().support_material_extruder.value - 1; - // Shall the support be printed with the active extruder, preferably with non-soluble, to avoid tool changes? - bool support_dontcare = object.config().support_material_extruder.value == 0; - // Extruder ID of the support interface. -1 if "don't care". - unsigned int interface_extruder = object.config().support_material_interface_extruder.value - 1; - // Shall the support interface be printed with the active extruder, preferably with non-soluble, to avoid tool changes? - bool interface_dontcare = object.config().support_material_interface_extruder.value == 0; - if (support_dontcare || interface_dontcare) { - // Some support will be printed with "don't care" material, preferably non-soluble. - // Is the current extruder assigned a soluble filament? - unsigned int dontcare_extruder = first_extruder_id; - if (print.config().filament_soluble.get_at(dontcare_extruder)) { - // The last extruder printed on the previous layer extrudes soluble filament. - // Try to find a non-soluble extruder on the same layer. - for (unsigned int extruder_id : layer_tools.extruders) - if (! print.config().filament_soluble.get_at(extruder_id)) { - dontcare_extruder = extruder_id; - break; - } - } - if (support_dontcare) - support_extruder = dontcare_extruder; - if (interface_dontcare) - interface_extruder = dontcare_extruder; - } - // Both the support and the support interface are printed with the same extruder, therefore - // the interface may be interleaved with the support base. - bool single_extruder = ! has_support || support_extruder == interface_extruder; - // Assign an extruder to the base. - ObjectByExtruder &obj = object_by_extruder(by_extruder, has_support ? support_extruder : interface_extruder, &layer_to_print - layers.data(), layers.size()); - obj.support = &support_layer.support_fills; - obj.support_extrusion_role = single_extruder ? erMixed : erSupportMaterial; - if (! single_extruder && has_interface) { - ObjectByExtruder &obj_interface = object_by_extruder(by_extruder, interface_extruder, &layer_to_print - layers.data(), layers.size()); - obj_interface.support = &support_layer.support_fills; - obj_interface.support_extrusion_role = erSupportMaterialInterface; - } + if (this->config().avoid_crossing_curled_overhangs) { + m_avoid_crossing_curled_overhangs.clear(); + for (const ObjectLayerToPrint &layer_to_print : layers) { + if (layer_to_print.object() == nullptr) + continue; + for (const auto &instance : layer_to_print.object()->instances()) { + m_avoid_crossing_curled_overhangs.add_obstacles(layer_to_print.object_layer, instance.shift); + m_avoid_crossing_curled_overhangs.add_obstacles(layer_to_print.support_layer, instance.shift); } } - if (layer_to_print.object_layer != nullptr) { - const Layer &layer = *layer_to_print.object_layer; - // We now define a strategy for building perimeters and fills. The separation - // between regions doesn't matter in terms of printing order, as we follow - // another logic instead: - // - we group all extrusions by extruder so that we minimize toolchanges - // - we start from the last used extruder - // - for each extruder, we group extrusions by island - // - for each island, we extrude perimeters first, unless user set the infill_first - // option - // (Still, we have to keep track of regions because we need to apply their config) - size_t n_slices = layer.lslices.size(); - const std::vector &layer_surface_bboxes = layer.lslices_bboxes; - // Traverse the slices in an increasing order of bounding box size, so that the islands inside another islands are tested first, - // so we can just test a point inside ExPolygon::contour and we may skip testing the holes. - std::vector slices_test_order; - slices_test_order.reserve(n_slices); - for (size_t i = 0; i < n_slices; ++ i) - slices_test_order.emplace_back(i); - std::sort(slices_test_order.begin(), slices_test_order.end(), [&layer_surface_bboxes](size_t i, size_t j) { - const Vec2d s1 = layer_surface_bboxes[i].size().cast(); - const Vec2d s2 = layer_surface_bboxes[j].size().cast(); - return s1.x() * s1.y() < s2.x() * s2.y(); - }); - auto point_inside_surface = [&layer, &layer_surface_bboxes](const size_t i, const Point &point) { - const BoundingBox &bbox = layer_surface_bboxes[i]; - return point(0) >= bbox.min(0) && point(0) < bbox.max(0) && - point(1) >= bbox.min(1) && point(1) < bbox.max(1) && - layer.lslices[i].contour.contains(point); - }; + } - for (size_t region_id = 0; region_id < layer.regions().size(); ++ region_id) { - const LayerRegion *layerm = layer.regions()[region_id]; - if (layerm == nullptr) - continue; - // PrintObjects own the PrintRegions, thus the pointer to PrintRegion would be unique to a PrintObject, they would not - // identify the content of PrintRegion accross the whole print uniquely. Translate to a Print specific PrintRegion. - const PrintRegion ®ion = print.get_print_region(layerm->region().print_region_id()); - - // Now we must process perimeters and infills and create islands of extrusions in by_region std::map. - // It is also necessary to save which extrusions are part of MM wiping and which are not. - // The process is almost the same for perimeters and infills - we will do it in a cycle that repeats twice: - std::vector printing_extruders; - for (const ObjectByExtruder::Island::Region::Type entity_type : { ObjectByExtruder::Island::Region::INFILL, ObjectByExtruder::Island::Region::PERIMETERS }) { - for (const ExtrusionEntity *ee : (entity_type == ObjectByExtruder::Island::Region::INFILL) ? layerm->fills.entities : layerm->perimeters.entities) { - // extrusions represents infill or perimeter extrusions of a single island. - assert(dynamic_cast(ee) != nullptr); - const auto *extrusions = static_cast(ee); - if (extrusions->entities.empty()) // This shouldn't happen but first_point() would fail. - continue; - - // This extrusion is part of certain Region, which tells us which extruder should be used for it: - int correct_extruder_id = layer_tools.extruder(*extrusions, region); - - // Let's recover vector of extruder overrides: - const WipingExtrusions::ExtruderPerCopy *entity_overrides = nullptr; - if (! layer_tools.has_extruder(correct_extruder_id)) { - // this entity is not overridden, but its extruder is not in layer_tools - we'll print it - // by last extruder on this layer (could happen e.g. when a wiping object is taller than others - dontcare extruders are eradicated from layer_tools) - correct_extruder_id = layer_tools.extruders.back(); - } - printing_extruders.clear(); - if (is_anything_overridden) { - entity_overrides = const_cast(layer_tools).wiping_extrusions().get_extruder_overrides(extrusions, correct_extruder_id, layer_to_print.object()->instances().size()); - if (entity_overrides == nullptr) { - printing_extruders.emplace_back(correct_extruder_id); - } else { - printing_extruders.reserve(entity_overrides->size()); - for (int extruder : *entity_overrides) - printing_extruders.emplace_back(extruder >= 0 ? - // at least one copy is overridden to use this extruder - extruder : - // at least one copy would normally be printed with this extruder (see get_extruder_overrides function for explanation) - static_cast(- extruder - 1)); - Slic3r::sort_remove_duplicates(printing_extruders); - } - } else - printing_extruders.emplace_back(correct_extruder_id); - - // Now we must add this extrusion into the by_extruder map, once for each extruder that will print it: - for (unsigned int extruder : printing_extruders) - { - std::vector &islands = object_islands_by_extruder( - by_extruder, - extruder, - &layer_to_print - layers.data(), - layers.size(), n_slices+1); - for (size_t i = 0; i <= n_slices; ++ i) { - bool last = i == n_slices; - size_t island_idx = last ? n_slices : slices_test_order[i]; - if (// extrusions->first_point does not fit inside any slice - last || - // extrusions->first_point fits inside ith slice - point_inside_surface(island_idx, extrusions->first_point())) { - if (islands[island_idx].by_region.empty()) - islands[island_idx].by_region.assign(print.num_print_regions(), ObjectByExtruder::Island::Region()); - islands[island_idx].by_region[region.print_region_id()].append(entity_type, extrusions, entity_overrides); - break; - } - } - } - } - } - } // for regions - } - } // for objects + for (const ObjectLayerToPrint &layer_to_print : layers) { + m_extrusion_quality_estimator.prepare_for_new_layer(layer_to_print.object_layer); + } // Extrude the skirt, brim, support, perimeters, infill ordered by the extruders. for (unsigned int extruder_id : layer_tools.extruders) @@ -2403,7 +2264,7 @@ LayerResult GCode::process_layer( // let analyzer tag generator aware of a role type change if (layer_tools.has_wipe_tower && m_wipe_tower) - m_last_processor_extrusion_role = erWipeTower; + m_last_processor_extrusion_role = GCodeExtrusionRole::WipeTower; if (auto loops_it = skirt_loops_per_extruder.find(extruder_id); loops_it != skirt_loops_per_extruder.end()) { const std::pair loops = loops_it->second; @@ -2419,7 +2280,7 @@ LayerResult GCode::process_layer( path.mm3_per_mm = mm3_per_mm; } //FIXME using the support_material_speed of the 1st object printed. - gcode += this->extrude_loop(loop, "skirt", m_config.support_material_speed.value); + gcode += this->extrude_loop(loop, "skirt"sv, m_config.support_material_speed.value); } m_avoid_crossing_perimeters.use_external_mp(false); // Allow a straight travel move to the first object point if this is the first layer (but don't in next layers). @@ -2432,7 +2293,7 @@ LayerResult GCode::process_layer( this->set_origin(0., 0.); m_avoid_crossing_perimeters.use_external_mp(); for (const ExtrusionEntity *ee : print.brim().entities) { - gcode += this->extrude_entity(*ee, "brim", m_config.support_material_speed.value); + gcode += this->extrude_entity(*ee, "brim"sv, m_config.support_material_speed.value); } m_brim_done = true; m_avoid_crossing_perimeters.use_external_mp(false); @@ -2440,92 +2301,29 @@ LayerResult GCode::process_layer( m_avoid_crossing_perimeters.disable_once(); } - - auto objects_by_extruder_it = by_extruder.find(extruder_id); - if (objects_by_extruder_it == by_extruder.end()) - continue; - - std::vector instances_to_print = sort_print_object_instances(objects_by_extruder_it->second, layers, ordering, single_object_instance_idx); + std::vector instances_to_print = sort_print_object_instances(layers, ordering, single_object_instance_idx); // We are almost ready to print. However, we must go through all the objects twice to print the the overridden extrusions first (infill/perimeter wiping feature): - std::vector by_region_per_copy_cache; - for (int print_wipe_extrusions = is_anything_overridden; print_wipe_extrusions>=0; --print_wipe_extrusions) { - if (is_anything_overridden && print_wipe_extrusions == 0) + bool is_anything_overridden = layer_tools.wiping_extrusions().is_anything_overridden(); + if (is_anything_overridden) { + // Extrude wipes. + size_t gcode_size_old = gcode.size(); + for (const InstanceToPrint &instance : instances_to_print) + this->process_layer_single_object( + gcode, extruder_id, instance, + layers[instance.object_layer_to_print_id], layer_tools, + is_anything_overridden, true /* print_wipe_extrusions */); + if (gcode_size_old < gcode.size()) gcode+="; PURGING FINISHED\n"; - - for (InstanceToPrint &instance_to_print : instances_to_print) { - const LayerToPrint &layer_to_print = layers[instance_to_print.layer_id]; - // To control print speed of the 1st object layer printed over raft interface. - bool object_layer_over_raft = layer_to_print.object_layer && layer_to_print.object_layer->id() > 0 && - instance_to_print.print_object.slicing_parameters().raft_layers() == layer_to_print.object_layer->id(); - m_config.apply(instance_to_print.print_object.config(), true); - m_layer = layer_to_print.layer(); - m_object_layer_over_raft = object_layer_over_raft; - if (m_config.avoid_crossing_perimeters) - m_avoid_crossing_perimeters.init_layer(*m_layer); - if (this->config().gcode_label_objects) - gcode += std::string("; printing object ") + instance_to_print.print_object.model_object()->name + " id:" + std::to_string(instance_to_print.layer_id) + " copy " + std::to_string(instance_to_print.instance_id) + "\n"; - // When starting a new object, use the external motion planner for the first travel move. - const Point &offset = instance_to_print.print_object.instances()[instance_to_print.instance_id].shift; - std::pair this_object_copy(&instance_to_print.print_object, offset); - if (m_last_obj_copy != this_object_copy) - m_avoid_crossing_perimeters.use_external_mp_once(); - m_last_obj_copy = this_object_copy; - this->set_origin(unscale(offset)); - if (instance_to_print.object_by_extruder.support != nullptr && !print_wipe_extrusions) { - m_layer = layer_to_print.support_layer; - m_object_layer_over_raft = false; - gcode += this->extrude_support( - // support_extrusion_role is erSupportMaterial, erSupportMaterialInterface or erMixed for all extrusion paths. - instance_to_print.object_by_extruder.support->chained_path_from(m_last_pos, instance_to_print.object_by_extruder.support_extrusion_role)); - m_layer = layer_to_print.layer(); - m_object_layer_over_raft = object_layer_over_raft; - } - //FIXME order islands? - // Sequential tool path ordering of multiple parts within the same object, aka. perimeter tracking (#5511) - for (ObjectByExtruder::Island &island : instance_to_print.object_by_extruder.islands) { - const auto& by_region_specific = is_anything_overridden ? island.by_region_per_copy(by_region_per_copy_cache, static_cast(instance_to_print.instance_id), extruder_id, print_wipe_extrusions != 0) : island.by_region; - //FIXME the following code prints regions in the order they are defined, the path is not optimized in any way. - if (print.config().infill_first) { - gcode += this->extrude_infill(print, by_region_specific, false); - gcode += this->extrude_perimeters(print, by_region_specific); - } else { - gcode += this->extrude_perimeters(print, by_region_specific); - gcode += this->extrude_infill(print,by_region_specific, false); - } - // ironing - gcode += this->extrude_infill(print,by_region_specific, true); - } - if (this->config().gcode_label_objects) - gcode += std::string("; stop printing object ") + instance_to_print.print_object.model_object()->name + " id:" + std::to_string(instance_to_print.layer_id) + " copy " + std::to_string(instance_to_print.instance_id) + "\n"; - } } + // Extrude normal extrusions. + for (const InstanceToPrint &instance : instances_to_print) + this->process_layer_single_object( + gcode, extruder_id, instance, + layers[instance.object_layer_to_print_id], layer_tools, + is_anything_overridden, false /* print_wipe_extrusions */); } -#if 0 - // Apply spiral vase post-processing if this layer contains suitable geometry - // (we must feed all the G-code into the post-processor, including the first - // bottom non-spiral layers otherwise it will mess with positions) - // we apply spiral vase at this stage because it requires a full layer. - // Just a reminder: A spiral vase mode is allowed for a single object per layer, single material print only. - if (m_spiral_vase) - gcode = m_spiral_vase->process_layer(std::move(gcode)); - - // Apply cooling logic; this may alter speeds. - if (m_cooling_buffer) - gcode = m_cooling_buffer->process_layer(std::move(gcode), layer.id(), - // Flush the cooling buffer at each object layer or possibly at the last layer, even if it contains just supports (This should not happen). - object_layer || last_layer); - - // Apply pressure equalization if enabled; - // printf("G-code before filter:\n%s\n", gcode.c_str()); - if (m_pressure_equalizer) - gcode = m_pressure_equalizer->process(gcode.c_str(), false); - // printf("G-code after filter:\n%s\n", out.c_str()); - - file.write(gcode); -#endif - BOOST_LOG_TRIVIAL(trace) << "Exported layer " << layer.id() << " print_z " << print_z << log_memory_info(); @@ -2534,6 +2332,225 @@ LayerResult GCode::process_layer( return result; } +static const auto comment_perimeter = "perimeter"sv; +// Comparing string_view pointer & length for speed. +static inline bool comment_is_perimeter(const std::string_view comment) { + return comment.data() == comment_perimeter.data() && comment.size() == comment_perimeter.size(); +} + +void GCode::process_layer_single_object( + // output + std::string &gcode, + // Index of the extruder currently active. + const unsigned int extruder_id, + // What object and instance is going to be printed. + const InstanceToPrint &print_instance, + // and the object & support layer of the above. + const ObjectLayerToPrint &layer_to_print, + // Container for extruder overrides (when wiping into object or infill). + const LayerTools &layer_tools, + // Is any extrusion possibly marked as wiping extrusion? + const bool is_anything_overridden, + // Round 1 (wiping into object or infill) or round 2 (normal extrusions). + const bool print_wipe_extrusions) +{ + //FIXME what the heck ID is this? Layer ID or Object ID? More likely an Object ID. + uint32_t layer_id = 0; + bool first = true; + // Delay layer initialization as many layers may not print with all extruders. + auto init_layer_delayed = [this, &print_instance, &layer_to_print, layer_id, &first, &gcode]() { + if (first) { + first = false; + const PrintObject &print_object = print_instance.print_object; + const Print &print = *print_object.print(); + m_config.apply(print_object.config(), true); + m_layer = layer_to_print.layer(); + if (print.config().avoid_crossing_perimeters) + m_avoid_crossing_perimeters.init_layer(*m_layer); + // When starting a new object, use the external motion planner for the first travel move. + const Point &offset = print_object.instances()[print_instance.instance_id].shift; + std::pair this_object_copy(&print_object, offset); + if (m_last_obj_copy != this_object_copy) + m_avoid_crossing_perimeters.use_external_mp_once(); + m_last_obj_copy = this_object_copy; + this->set_origin(unscale(offset)); + if (this->config().gcode_label_objects) + gcode += std::string("; printing object ") + print_object.model_object()->name + " id:" + std::to_string(layer_id) + " copy " + std::to_string(print_instance.instance_id) + "\n"; + } + }; + + const PrintObject &print_object = print_instance.print_object; + const Print &print = *print_object.print(); + + m_extrusion_quality_estimator.set_current_object(&print_object); + + if (! print_wipe_extrusions && layer_to_print.support_layer != nullptr) + if (const SupportLayer &support_layer = *layer_to_print.support_layer; ! support_layer.support_fills.entities.empty()) { + ExtrusionRole role = support_layer.support_fills.role(); + bool has_support = role.is_mixed() || role.is_support_base(); + bool has_interface = role.is_mixed() || role.is_support_interface(); + // Extruder ID of the support base. -1 if "don't care". + unsigned int support_extruder = print_object.config().support_material_extruder.value - 1; + // Shall the support be printed with the active extruder, preferably with non-soluble, to avoid tool changes? + bool support_dontcare = support_extruder == std::numeric_limits::max(); + // Extruder ID of the support interface. -1 if "don't care". + unsigned int interface_extruder = print_object.config().support_material_interface_extruder.value - 1; + // Shall the support interface be printed with the active extruder, preferably with non-soluble, to avoid tool changes? + bool interface_dontcare = interface_extruder == std::numeric_limits::max(); + if (support_dontcare || interface_dontcare) { + // Some support will be printed with "don't care" material, preferably non-soluble. + // Is the current extruder assigned a soluble filament? + auto it_nonsoluble = std::find_if(layer_tools.extruders.begin(), layer_tools.extruders.end(), + [&soluble = std::as_const(print.config().filament_soluble)](unsigned int extruder_id) { return ! soluble.get_at(extruder_id); }); + // There should be a non-soluble extruder available. + assert(it_nonsoluble != layer_tools.extruders.end()); + unsigned int dontcare_extruder = it_nonsoluble == layer_tools.extruders.end() ? layer_tools.extruders.front() : *it_nonsoluble; + if (support_dontcare) + support_extruder = dontcare_extruder; + if (interface_dontcare) + interface_extruder = dontcare_extruder; + } + bool extrude_support = has_support && support_extruder == extruder_id; + bool extrude_interface = has_interface && interface_extruder == extruder_id; + if (extrude_support || extrude_interface) { + init_layer_delayed(); + m_layer = layer_to_print.support_layer; + m_object_layer_over_raft = false; + gcode += this->extrude_support( + // support_extrusion_role is ExtrusionRole::SupportMaterial, ExtrusionRole::SupportMaterialInterface or ExtrusionRole::Mixed for all extrusion paths. + support_layer.support_fills.chained_path_from(m_last_pos, extrude_support ? (extrude_interface ? ExtrusionRole::Mixed : ExtrusionRole::SupportMaterial) : ExtrusionRole::SupportMaterialInterface)); + } + } + + m_layer = layer_to_print.layer(); + // To control print speed of the 1st object layer printed over raft interface. + m_object_layer_over_raft = layer_to_print.object_layer && layer_to_print.object_layer->id() > 0 && + print_object.slicing_parameters().raft_layers() == layer_to_print.object_layer->id(); + + // Check whether this ExtrusionEntityCollection should be printed now with extruder_id, given print_wipe_extrusions + // (wipe extrusions are printed before regular extrusions). + auto shall_print_this_extrusion_collection = [extruder_id, instance_id = print_instance.instance_id, &layer_tools, is_anything_overridden, print_wipe_extrusions](const ExtrusionEntityCollection *eec, const PrintRegion ®ion) -> bool { + assert(eec != nullptr); + if (eec->entities.empty()) + // This shouldn't happen. FIXME why? but first_point() would fail. + return false; + // This extrusion is part of certain Region, which tells us which extruder should be used for it: + int correct_extruder_id = layer_tools.extruder(*eec, region); + if (! layer_tools.has_extruder(correct_extruder_id)) { + // this entity is not overridden, but its extruder is not in layer_tools - we'll print it + // by last extruder on this layer (could happen e.g. when a wiping object is taller than others - dontcare extruders are eradicated from layer_tools) + correct_extruder_id = layer_tools.extruders.back(); + } + int extruder_override_id = is_anything_overridden ? layer_tools.wiping_extrusions().get_extruder_override(eec, instance_id) : -1; + return print_wipe_extrusions ? + extruder_override_id == int(extruder_id) : + extruder_override_id < 0 && extruder_id == correct_extruder_id; + }; + + ExtrusionEntitiesPtr temp_fill_extrusions; + if (const Layer *layer = layer_to_print.object_layer; layer) + for (size_t idx : layer->lslice_indices_sorted_by_print_order) { + const LayerSlice &lslice = layer->lslices_ex[idx]; + auto extrude_infill_range = [&]( + const LayerRegion &layerm, const ExtrusionEntityCollection &fills, + LayerExtrusionRanges::const_iterator it_fill_ranges_begin, LayerExtrusionRanges::const_iterator it_fill_ranges_end, bool ironing) { + // PrintObjects own the PrintRegions, thus the pointer to PrintRegion would be unique to a PrintObject, they would not + // identify the content of PrintRegion accross the whole print uniquely. Translate to a Print specific PrintRegion. + const PrintRegion ®ion = print.get_print_region(layerm.region().print_region_id()); + temp_fill_extrusions.clear(); + for (auto it_fill_range = it_fill_ranges_begin; it_fill_range != it_fill_ranges_end; ++ it_fill_range) { + assert(it_fill_range->region() == it_fill_ranges_begin->region()); + for (uint32_t fill_id : *it_fill_range) { + assert(dynamic_cast(fills.entities[fill_id])); + if (auto *eec = static_cast(fills.entities[fill_id]); + (eec->role() == ExtrusionRole::Ironing) == ironing && shall_print_this_extrusion_collection(eec, region)) { + if (eec->can_reverse()) + // Flatten the infill collection for better path planning. + for (auto *ee : eec->entities) + temp_fill_extrusions.emplace_back(ee); + else + temp_fill_extrusions.emplace_back(eec); + } + } + } + if (! temp_fill_extrusions.empty()) { + init_layer_delayed(); + m_config.apply(region.config()); + //FIXME The source extrusions may be reversed, thus modifying the extrusions! Is it a problem? How about the initial G-code preview? + // Will parallel access of initial G-code preview to these extrusions while reordering them at backend cause issues? + chain_and_reorder_extrusion_entities(temp_fill_extrusions, &m_last_pos); + const auto extrusion_name = ironing ? "ironing"sv : "infill"sv; + for (const ExtrusionEntity *fill : temp_fill_extrusions) + if (auto *eec = dynamic_cast(fill); eec) { + for (const ExtrusionEntity *ee : eec->chained_path_from(m_last_pos).entities) + gcode += this->extrude_entity(*ee, extrusion_name); + } else + gcode += this->extrude_entity(*fill, extrusion_name); + } + }; + + //FIXME order islands? + // Sequential tool path ordering of multiple parts within the same object, aka. perimeter tracking (#5511) + for (const LayerIsland &island : lslice.islands) { + auto process_perimeters = [&]() { + const LayerRegion &layerm = *layer->get_region(island.perimeters.region()); + // PrintObjects own the PrintRegions, thus the pointer to PrintRegion would be unique to a PrintObject, they would not + // identify the content of PrintRegion accross the whole print uniquely. Translate to a Print specific PrintRegion. + const PrintRegion ®ion = print.get_print_region(layerm.region().print_region_id()); + bool first = true; + for (uint32_t perimeter_id : island.perimeters) { + assert(dynamic_cast(layerm.perimeters().entities[perimeter_id])); + if (const auto *eec = static_cast(layerm.perimeters().entities[perimeter_id]); + shall_print_this_extrusion_collection(eec, region)) { + // This may not apply to Arachne, but maybe the Arachne gap fill should disable reverse as well? + // assert(! eec->can_reverse()); + if (first) { + first = false; + init_layer_delayed(); + m_config.apply(region.config()); + } + for (const ExtrusionEntity *ee : *eec) + gcode += this->extrude_entity(*ee, comment_perimeter, -1.); + } + } + }; + auto process_infill = [&]() { + for (auto it = island.fills.begin(); it != island.fills.end();) { + // Gather range of fill ranges with the same region. + auto it_end = it; + for (++ it_end; it_end != island.fills.end() && it->region() == it_end->region(); ++ it_end) ; + const LayerRegion &layerm = *layer->get_region(it->region()); + extrude_infill_range(layerm, layerm.fills(), it, it_end, false /* normal extrusions, not ironing */); + it = it_end; + } + }; + if (print.config().infill_first) { + process_infill(); + process_perimeters(); + } else { + process_perimeters(); + process_infill(); + } + } + // ironing + //FIXME move ironing into the loop above over LayerIslands? + // First Ironing changes extrusion rate quickly, second single ironing may be done over multiple perimeter regions. + // Ironing in a second phase is safer, but it may be less efficient. + for (const LayerIsland &island : lslice.islands) { + for (auto it = island.fills.begin(); it != island.fills.end();) { + // Gather range of fill ranges with the same region. + auto it_end = it; + for (++ it_end; it_end != island.fills.end() && it->region() == it_end->region(); ++ it_end) ; + const LayerRegion &layerm = *layer->get_region(it->region()); + extrude_infill_range(layerm, layerm.fills(), it, it_end, true /* ironing, not normal extrusions */); + it = it_end; + } + } + } + if (! first && this->config().gcode_label_objects) + gcode += std::string("; stop printing object ") + print_object.model_object()->name + " id:" + std::to_string(layer_id) + " copy " + std::to_string(print_instance.instance_id) + "\n"; +} + void GCode::apply_print_config(const PrintConfig &print_config) { m_writer.apply_print_config(print_config); @@ -2623,7 +2640,7 @@ std::string GCode::change_layer(coordf_t print_z) return gcode; } -std::string GCode::extrude_loop(ExtrusionLoop loop, std::string description, double speed) +std::string GCode::extrude_loop(ExtrusionLoop loop, const std::string_view description, double speed) { // get a copy; don't modify the orientation of the original loop object otherwise // next copies (if any) would not detect the correct orientation @@ -2634,7 +2651,8 @@ std::string GCode::extrude_loop(ExtrusionLoop loop, std::string description, dou // find the point of the loop that is closest to the current extruder position // or randomize if requested Point last_pos = this->last_pos(); - if (! m_config.spiral_vase && description == "perimeter") { + + if (! m_config.spiral_vase && comment_is_perimeter(description)) { assert(m_layer != nullptr); m_seam_placer.place_seam(m_layer, loop, m_config.external_perimeters_first, this->last_pos()); } else @@ -2661,26 +2679,24 @@ std::string GCode::extrude_loop(ExtrusionLoop loop, std::string description, dou if (paths.empty()) return ""; // apply the small perimeter speed - if (is_perimeter(paths.front().role()) && loop.length() <= SMALL_PERIMETER_LENGTH && speed == -1) + if (paths.front().role().is_perimeter() && loop.length() <= SMALL_PERIMETER_LENGTH && speed == -1) speed = m_config.small_perimeter_speed.get_abs_value(m_config.perimeter_speed); // extrude along the path std::string gcode; - for (ExtrusionPaths::iterator path = paths.begin(); path != paths.end(); ++path) { -// description += ExtrusionLoop::role_to_string(loop.loop_role()); -// description += ExtrusionEntity::role_to_string(path->role); - path->simplify(m_scaled_resolution); - gcode += this->_extrude(*path, description, speed); + for (ExtrusionPath &path : paths) { + path.simplify(m_scaled_resolution); + gcode += this->_extrude(path, description, speed); } // reset acceleration - gcode += m_writer.set_acceleration((unsigned int)(m_config.default_acceleration.value + 0.5)); + gcode += m_writer.set_print_acceleration((unsigned int)(m_config.default_acceleration.value + 0.5)); if (m_wipe.enable) { m_wipe.path = paths.front().polyline; for (auto it = std::next(paths.begin()); it != paths.end(); ++it) { - if (is_bridge(it->role())) + if (it->role().is_bridge()) break; // Don't perform a wipe on bridges. assert(it->polyline.points.size() >= 2); @@ -2693,23 +2709,24 @@ std::string GCode::extrude_loop(ExtrusionLoop loop, std::string description, dou } // make a little move inwards before leaving loop - if (paths.back().role() == erExternalPerimeter && m_layer != NULL && m_config.perimeters.value > 1 && paths.front().size() >= 2 && paths.back().polyline.points.size() >= 3) { + if (paths.back().role().is_external_perimeter() && m_layer != NULL && m_config.perimeters.value > 1 && paths.front().size() >= 2 && paths.back().polyline.points.size() >= 3) { // detect angle between last and first segment // the side depends on the original winding order of the polygon (left for contours, right for holes) //FIXME improve the algorithm in case the loop is tiny. //FIXME improve the algorithm in case the loop is split into segments with a low number of points (see the Point b query). - Point a = paths.front().polyline.points[1]; // second point - Point b = *(paths.back().polyline.points.end()-3); // second to last point + // Angle from the 2nd point to the last point. + double angle_inside = angle(paths.front().polyline.points[1] - paths.front().first_point(), + *(paths.back().polyline.points.end()-3) - paths.front().first_point()); + assert(angle_inside >= -M_PI && angle_inside <= M_PI); + // 3rd of this angle will be taken, thus make the angle monotonic before interpolation. if (was_clockwise) { - // swap points - Point c = a; a = b; b = c; + if (angle_inside > 0) + angle_inside -= 2.0 * M_PI; + } else { + if (angle_inside < 0) + angle_inside += 2.0 * M_PI; } - double angle = paths.front().first_point().ccw_angle(a, b) / 3; - - // turn left if contour, turn right if hole - if (was_clockwise) angle *= -1; - // create the destination point along the first segment and rotate it // we make sure we don't exceed the segment length because we don't know // the rotation of the second segment so we might cross the object boundary @@ -2721,7 +2738,8 @@ std::string GCode::extrude_loop(ExtrusionLoop loop, std::string description, dou // Shift by no more than a nozzle diameter. //FIXME Hiding the seams will not work nicely for very densely discretized contours! Point pt = ((nd * nd >= l2) ? p2 : (p1 + v * (nd / sqrt(l2)))).cast(); - pt.rotate(angle, paths.front().polyline.points.front()); + // Rotate pt inside around the seam point. + pt.rotate(angle_inside / 3., paths.front().polyline.points.front()); // generate the travel move gcode += m_writer.travel_to_xy(this->point_to_gcode(pt), "move inwards before travel"); } @@ -2729,7 +2747,7 @@ std::string GCode::extrude_loop(ExtrusionLoop loop, std::string description, dou return gcode; } -std::string GCode::extrude_multi_path(ExtrusionMultiPath multipath, std::string description, double speed) +std::string GCode::extrude_multi_path(ExtrusionMultiPath multipath, const std::string_view description, double speed) { for (auto it = std::next(multipath.paths.begin()); it != multipath.paths.end(); ++it) { assert(it->polyline.points.size() >= 2); @@ -2738,8 +2756,6 @@ std::string GCode::extrude_multi_path(ExtrusionMultiPath multipath, std::string // extrude along the path std::string gcode; for (ExtrusionPath path : multipath.paths) { -// description += ExtrusionLoop::role_to_string(loop.loop_role()); -// description += ExtrusionEntity::role_to_string(path->role); path.simplify(m_scaled_resolution); gcode += this->_extrude(path, description, speed); } @@ -2748,7 +2764,7 @@ std::string GCode::extrude_multi_path(ExtrusionMultiPath multipath, std::string m_wipe.path.reverse(); for (auto it = std::next(multipath.paths.rbegin()); it != multipath.paths.rend(); ++it) { - if (is_bridge(it->role())) + if (it->role().is_bridge()) break; // Do not perform a wipe on bridges. assert(it->polyline.points.size() >= 2); @@ -2760,11 +2776,11 @@ std::string GCode::extrude_multi_path(ExtrusionMultiPath multipath, std::string } } // reset acceleration - gcode += m_writer.set_acceleration((unsigned int)floor(m_config.default_acceleration.value + 0.5)); + gcode += m_writer.set_print_acceleration((unsigned int)floor(m_config.default_acceleration.value + 0.5)); return gcode; } -std::string GCode::extrude_entity(const ExtrusionEntity &entity, std::string description, double speed) +std::string GCode::extrude_entity(const ExtrusionEntity &entity, const std::string_view description, double speed) { if (const ExtrusionPath* path = dynamic_cast(&entity)) return this->extrude_path(*path, description, speed); @@ -2777,9 +2793,8 @@ std::string GCode::extrude_entity(const ExtrusionEntity &entity, std::string des return ""; } -std::string GCode::extrude_path(ExtrusionPath path, std::string description, double speed) +std::string GCode::extrude_path(ExtrusionPath path, std::string_view description, double speed) { -// description += ExtrusionEntity::role_to_string(path.role()); path.simplify(m_scaled_resolution); std::string gcode = this->_extrude(path, description, speed); if (m_wipe.enable) { @@ -2787,57 +2802,14 @@ std::string GCode::extrude_path(ExtrusionPath path, std::string description, dou m_wipe.path.reverse(); } // reset acceleration - gcode += m_writer.set_acceleration((unsigned int)floor(m_config.default_acceleration.value + 0.5)); - return gcode; -} - -// Extrude perimeters: Decide where to put seams (hide or align seams). -std::string GCode::extrude_perimeters(const Print &print, const std::vector &by_region) -{ - std::string gcode; - for (const ObjectByExtruder::Island::Region ®ion : by_region) - if (! region.perimeters.empty()) { - m_config.apply(print.get_print_region(®ion - &by_region.front()).config()); - - for (const ExtrusionEntity* ee : region.perimeters) - gcode += this->extrude_entity(*ee, "perimeter", -1.); - } - return gcode; -} - -// Chain the paths hierarchically by a greedy algorithm to minimize a travel distance. -std::string GCode::extrude_infill(const Print &print, const std::vector &by_region, bool ironing) -{ - std::string gcode; - ExtrusionEntitiesPtr extrusions; - const char* extrusion_name = ironing ? "ironing" : "infill"; - for (const ObjectByExtruder::Island::Region ®ion : by_region) - if (! region.infills.empty()) { - extrusions.clear(); - extrusions.reserve(region.infills.size()); - for (ExtrusionEntity *ee : region.infills) - if ((ee->role() == erIroning) == ironing) - extrusions.emplace_back(ee); - if (! extrusions.empty()) { - m_config.apply(print.get_print_region(®ion - &by_region.front()).config()); - chain_and_reorder_extrusion_entities(extrusions, &m_last_pos); - for (const ExtrusionEntity *fill : extrusions) { - auto *eec = dynamic_cast(fill); - if (eec) { - for (ExtrusionEntity *ee : eec->chained_path_from(m_last_pos).entities) - gcode += this->extrude_entity(*ee, extrusion_name); - } else - gcode += this->extrude_entity(*fill, extrusion_name); - } - } - } + gcode += m_writer.set_print_acceleration((unsigned int)floor(m_config.default_acceleration.value + 0.5)); return gcode; } std::string GCode::extrude_support(const ExtrusionEntityCollection &support_fills) { - static constexpr const char *support_label = "support material"; - static constexpr const char *support_interface_label = "support material interface"; + static constexpr const auto support_label = "support material"sv; + static constexpr const auto support_interface_label = "support material interface"sv; std::string gcode; if (! support_fills.entities.empty()) { @@ -2845,9 +2817,9 @@ std::string GCode::extrude_support(const ExtrusionEntityCollection &support_fill const double support_interface_speed = m_config.support_material_interface_speed.get_abs_value(support_speed); for (const ExtrusionEntity *ee : support_fills.entities) { ExtrusionRole role = ee->role(); - assert(role == erSupportMaterial || role == erSupportMaterialInterface); - const char *label = (role == erSupportMaterial) ? support_label : support_interface_label; - const double speed = (role == erSupportMaterial) ? support_speed : support_interface_speed; + assert(role == ExtrusionRole::SupportMaterial || role == ExtrusionRole::SupportMaterialInterface); + const auto label = (role == ExtrusionRole::SupportMaterial) ? support_label : support_interface_label; + const double speed = (role == ExtrusionRole::SupportMaterial) ? support_speed : support_interface_speed; const ExtrusionPath *path = dynamic_cast(ee); if (path) gcode += this->extrude_path(*path, label, speed); @@ -2934,20 +2906,18 @@ void GCode::GCodeOutputStream::write_format(const char* format, ...) va_end(args); } -std::string GCode::_extrude(const ExtrusionPath &path, std::string description, double speed) +std::string GCode::_extrude(const ExtrusionPath &path, const std::string_view description, double speed) { std::string gcode; - - if (is_bridge(path.role())) - description += " (bridge)"; + const std::string_view description_bridge = path.role().is_bridge() ? " (bridge)"sv : ""sv; // go to first point of extrusion path if (!m_last_pos_defined || m_last_pos != path.first_point()) { - gcode += this->travel_to( - path.first_point(), - path.role(), - "move to first " + description + " point" - ); + std::string comment = "move to first "; + comment += description; + comment += description_bridge; + comment += " point"; + gcode += this->travel_to(path.first_point(), path.role(), comment); } // compensate retraction @@ -2960,22 +2930,22 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, acceleration = m_config.first_layer_acceleration.value; } else if (this->object_layer_over_raft() && m_config.first_layer_acceleration_over_raft.value > 0) { acceleration = m_config.first_layer_acceleration_over_raft.value; - } else if (m_config.bridge_acceleration.value > 0 && is_bridge(path.role())) { + } else if (m_config.bridge_acceleration.value > 0 && path.role().is_bridge()) { acceleration = m_config.bridge_acceleration.value; - } else if (m_config.top_solid_infill_acceleration > 0 && path.role() == erTopSolidInfill) { + } else if (m_config.top_solid_infill_acceleration > 0 && path.role() == ExtrusionRole::TopSolidInfill) { acceleration = m_config.top_solid_infill_acceleration.value; - } else if (m_config.solid_infill_acceleration > 0 && is_solid_infill(path.role())) { + } else if (m_config.solid_infill_acceleration > 0 && path.role().is_solid_infill()) { acceleration = m_config.solid_infill_acceleration.value; - } else if (m_config.infill_acceleration.value > 0 && is_infill(path.role())) { + } else if (m_config.infill_acceleration.value > 0 && path.role().is_infill()) { acceleration = m_config.infill_acceleration.value; - } else if (m_config.external_perimeter_acceleration > 0 && path.role() == erExternalPerimeter) { - acceleration = m_config.external_perimeter_acceleration.value; - } else if (m_config.perimeter_acceleration.value > 0 && is_perimeter(path.role())) { + } else if (m_config.external_perimeter_acceleration > 0 && path.role().is_external_perimeter()) { + acceleration = m_config.external_perimeter_acceleration.value; + } else if (m_config.perimeter_acceleration.value > 0 && path.role().is_perimeter()) { acceleration = m_config.perimeter_acceleration.value; } else { acceleration = m_config.default_acceleration.value; } - gcode += m_writer.set_acceleration((unsigned int)floor(acceleration + 0.5)); + gcode += m_writer.set_print_acceleration((unsigned int)floor(acceleration + 0.5)); } // calculate extrusion length per distance unit @@ -2986,21 +2956,22 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, // set speed if (speed == -1) { - if (path.role() == erPerimeter) { + if (path.role() == ExtrusionRole::Perimeter) { speed = m_config.get_abs_value("perimeter_speed"); - } else if (path.role() == erExternalPerimeter) { + } else if (path.role() == ExtrusionRole::ExternalPerimeter) { speed = m_config.get_abs_value("external_perimeter_speed"); - } else if (path.role() == erOverhangPerimeter || path.role() == erBridgeInfill) { + } else if (path.role().is_bridge()) { + assert(path.role().is_perimeter() || path.role() == ExtrusionRole::BridgeInfill); speed = m_config.get_abs_value("bridge_speed"); - } else if (path.role() == erInternalInfill) { + } else if (path.role() == ExtrusionRole::InternalInfill) { speed = m_config.get_abs_value("infill_speed"); - } else if (path.role() == erSolidInfill) { + } else if (path.role() == ExtrusionRole::SolidInfill) { speed = m_config.get_abs_value("solid_infill_speed"); - } else if (path.role() == erTopSolidInfill) { + } else if (path.role() == ExtrusionRole::TopSolidInfill) { speed = m_config.get_abs_value("top_solid_infill_speed"); - } else if (path.role() == erIroning) { + } else if (path.role() == ExtrusionRole::Ironing) { speed = m_config.get_abs_value("ironing_speed"); - } else if (path.role() == erGapFill) { + } else if (path.role() == ExtrusionRole::GapFill) { speed = m_config.get_abs_value("gap_fill_speed"); } else { throw Slic3r::InvalidArgument("Invalid speed"); @@ -3026,14 +2997,47 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, EXTRUDER_CONFIG(filament_max_volumetric_speed) / path.mm3_per_mm ); } + + bool variable_speed_or_fan_speed = false; + std::vector new_points{}; + if ((this->m_config.enable_dynamic_overhang_speeds || this->config().enable_dynamic_fan_speeds.get_at(m_writer.extruder()->id())) && + !this->on_first_layer() && path.role().is_perimeter()) { + std::vector> overhangs_with_speeds = {{100, ConfigOptionFloatOrPercent{speed, false}}}; + if (this->m_config.enable_dynamic_overhang_speeds) { + overhangs_with_speeds = {{0, m_config.overhang_speed_0}, + {25, m_config.overhang_speed_1}, + {50, m_config.overhang_speed_2}, + {75, m_config.overhang_speed_3}, + {100, ConfigOptionFloatOrPercent{speed, false}}}; + } + + std::vector> overhang_w_fan_speeds = {{100, ConfigOptionInts{0}}}; + if (this->m_config.enable_dynamic_fan_speeds.get_at(m_writer.extruder()->id())) { + overhang_w_fan_speeds = {{0, m_config.overhang_fan_speed_0}, + {25, m_config.overhang_fan_speed_1}, + {50, m_config.overhang_fan_speed_2}, + {75, m_config.overhang_fan_speed_3}, + {100, ConfigOptionInts{0}}}; + } + + double external_perim_reference_speed = std::min(m_config.get_abs_value("external_perimeter_speed"), + std::min(EXTRUDER_CONFIG(filament_max_volumetric_speed) / path.mm3_per_mm, + m_config.max_volumetric_speed.value / path.mm3_per_mm)); + new_points = m_extrusion_quality_estimator.estimate_extrusion_quality(path, overhangs_with_speeds, overhang_w_fan_speeds, + m_writer.extruder()->id(), external_perim_reference_speed, + speed); + variable_speed_or_fan_speed = std::any_of(new_points.begin(), new_points.end(), + [speed](const ProcessedPoint &p) { return p.speed != speed || p.fan_speed != 0; }); + } + double F = speed * 60; // convert mm/sec to mm/min // extrude arc or line if (m_enable_extrusion_role_markers) { - if (path.role() != m_last_extrusion_role) + if (GCodeExtrusionRole role = extrusion_role_to_gcode_extrusion_role(path.role()); role != m_last_extrusion_role) { - m_last_extrusion_role = path.role(); + m_last_extrusion_role = role; if (m_enable_extrusion_role_markers) { char buf[32]; @@ -3045,14 +3049,14 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, // adds processor tags and updates processor tracking data // PrusaMultiMaterial::Writer may generate GCodeProcessor::Height_Tag lines without updating m_last_height - // so, if the last role was erWipeTower we force export of GCodeProcessor::Height_Tag lines - bool last_was_wipe_tower = (m_last_processor_extrusion_role == erWipeTower); + // so, if the last role was GCodeExtrusionRole::WipeTower we force export of GCodeProcessor::Height_Tag lines + bool last_was_wipe_tower = (m_last_processor_extrusion_role == GCodeExtrusionRole::WipeTower); assert(is_decimal_separator_point()); - if (path.role() != m_last_processor_extrusion_role) { - m_last_processor_extrusion_role = path.role(); + if (GCodeExtrusionRole role = extrusion_role_to_gcode_extrusion_role(path.role()); role != m_last_processor_extrusion_role) { + m_last_processor_extrusion_role = role; char buf[64]; - sprintf(buf, ";%s%s\n", GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Role).c_str(), ExtrusionEntity::role_to_string(m_last_processor_extrusion_role).c_str()); + sprintf(buf, ";%s%s\n", GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Role).c_str(), gcode_extrusion_role_to_string(m_last_processor_extrusion_role).c_str()); gcode += buf; } @@ -3077,32 +3081,68 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, + float_to_string_decimal_point(m_last_height) + "\n"; } - std::string comment; + std::string cooling_marker_setspeed_comments; if (m_enable_cooling_markers) { - if (is_bridge(path.role())) + if (path.role().is_bridge() && + (!path.role().is_perimeter() || !this->config().enable_dynamic_fan_speeds.get_at(m_writer.extruder()->id()))) gcode += ";_BRIDGE_FAN_START\n"; else - comment = ";_EXTRUDE_SET_SPEED"; - if (path.role() == erExternalPerimeter) - comment += ";_EXTERNAL_PERIMETER"; - } - - // F is mm per minute. - gcode += m_writer.set_speed(F, "", comment); - double path_length = 0.; - { - std::string comment = m_config.gcode_comments ? description : ""; - for (const Line &line : path.polyline.lines()) { - const double line_length = line.length() * SCALING_FACTOR; + cooling_marker_setspeed_comments = ";_EXTRUDE_SET_SPEED"; + if (path.role() == ExtrusionRole::ExternalPerimeter) + cooling_marker_setspeed_comments += ";_EXTERNAL_PERIMETER"; + } + + if (!variable_speed_or_fan_speed) { + // F is mm per minute. + gcode += m_writer.set_speed(F, "", cooling_marker_setspeed_comments); + double path_length = 0.; + std::string comment; + if (m_config.gcode_comments) { + comment = description; + comment += description_bridge; + } + Vec2d prev = this->point_to_gcode_quantized(path.polyline.points.front()); + auto it = path.polyline.points.begin(); + auto end = path.polyline.points.end(); + for (++ it; it != end; ++ it) { + Vec2d p = this->point_to_gcode_quantized(*it); + const double line_length = (p - prev).norm(); path_length += line_length; - gcode += m_writer.extrude_to_xy( - this->point_to_gcode(line.b), - e_per_mm * line_length, - comment); + gcode += m_writer.extrude_to_xy(p, e_per_mm * line_length, comment); + prev = p; + } + } else { + std::string marked_comment; + if (m_config.gcode_comments) { + marked_comment = description; + marked_comment += description_bridge; + } + double last_set_speed = new_points[0].speed * 60.0; + double last_set_fan_speed = new_points[0].fan_speed; + gcode += m_writer.set_speed(last_set_speed, "", cooling_marker_setspeed_comments); + gcode += ";_SET_FAN_SPEED" + std::to_string(int(last_set_fan_speed)) + "\n"; + Vec2d prev = this->point_to_gcode_quantized(new_points[0].p); + for (size_t i = 1; i < new_points.size(); i++) { + const ProcessedPoint &processed_point = new_points[i]; + Vec2d p = this->point_to_gcode_quantized(processed_point.p); + const double line_length = (p - prev).norm(); + gcode += m_writer.extrude_to_xy(p, e_per_mm * line_length, marked_comment); + prev = p; + double new_speed = processed_point.speed * 60.0; + if (last_set_speed != new_speed) { + gcode += m_writer.set_speed(new_speed, "", cooling_marker_setspeed_comments); + last_set_speed = new_speed; + } + if (last_set_fan_speed != processed_point.fan_speed) { + last_set_fan_speed = processed_point.fan_speed; + gcode += ";_SET_FAN_SPEED" + std::to_string(int(last_set_fan_speed)) + "\n"; + } } + gcode += ";_RESET_FAN_SPEED\n"; } + if (m_enable_cooling_markers) - gcode += is_bridge(path.role()) ? ";_BRIDGE_FAN_END\n" : ";_EXTRUDE_END\n"; + gcode += path.role().is_bridge() ? ";_BRIDGE_FAN_END\n" : ";_EXTRUDE_END\n"; this->set_last_pos(path.last_point()); return gcode; @@ -3116,6 +3156,17 @@ std::string GCode::travel_to(const Point &point, ExtrusionRole role, std::string this->origin in order to get G-code coordinates. */ Polyline travel { this->last_pos(), point }; + if (this->config().avoid_crossing_curled_overhangs) { + if (m_config.avoid_crossing_perimeters) { + BOOST_LOG_TRIVIAL(warning) + << "Option >avoid crossing curled overhangs< is not compatible with avoid crossing perimeters and it will be ignored!"; + } else { + Point scaled_origin = Point(scaled(this->origin())); + travel = m_avoid_crossing_curled_overhangs.find_path(this->last_pos() + scaled_origin, point + scaled_origin); + travel.translate(-scaled_origin); + } + } + // check whether a straight travel move would need retraction bool needs_retraction = this->needs_retraction(travel, role); // check whether wipe could be disabled without causing visible stringing @@ -3163,8 +3214,18 @@ std::string GCode::travel_to(const Point &point, ExtrusionRole role, std::string // use G1 because we rely on paths being straight (G0 may make round paths) if (travel.size() >= 2) { + + gcode += m_writer.set_travel_acceleration((unsigned int)(m_config.travel_acceleration.value + 0.5)); + for (size_t i = 1; i < travel.size(); ++ i) gcode += m_writer.travel_to_xy(this->point_to_gcode(travel.points[i]), comment); + + if (! GCodeWriter::supports_separate_travel_acceleration(config().gcode_flavor)) { + // In case that this flavor does not support separate print and travel acceleration, + // reset acceleration to default. + gcode += m_writer.set_travel_acceleration((unsigned int)(m_config.travel_acceleration.value + 0.5)); + } + this->set_last_pos(travel.points.back()); } return gcode; @@ -3177,18 +3238,29 @@ bool GCode::needs_retraction(const Polyline &travel, ExtrusionRole role) return false; } - if (role == erSupportMaterial) { - const SupportLayer* support_layer = dynamic_cast(m_layer); - //FIXME support_layer->support_islands.contains should use some search structure! - if (support_layer != NULL && support_layer->support_islands.contains(travel)) - // skip retraction if this is a travel move inside a support material island - //FIXME not retracting over a long path may cause oozing, which in turn may result in missing material - // at the end of the extrusion path! - return false; - } + if (role == ExtrusionRole::SupportMaterial) + if (const SupportLayer *support_layer = dynamic_cast(m_layer); + support_layer != nullptr && ! support_layer->support_islands_bboxes.empty()) { + BoundingBox bbox_travel = get_extents(travel); + Polylines trimmed; + bool trimmed_initialized = false; + for (const BoundingBox &bbox : support_layer->support_islands_bboxes) + if (bbox.overlap(bbox_travel)) { + const auto &island = support_layer->support_islands[&bbox - support_layer->support_islands_bboxes.data()]; + trimmed = trimmed_initialized ? diff_pl(trimmed, island) : diff_pl(travel, island); + trimmed_initialized = true; + if (trimmed.empty()) + // skip retraction if this is a travel move inside a support material island + //FIXME not retracting over a long path may cause oozing, which in turn may result in missing material + // at the end of the extrusion path! + return false; + // Not sure whether updating the boudning box isn't too expensive. + //bbox_travel = get_extents(trimmed); + } + } if (m_config.only_retract_when_crossing_perimeters && m_layer != nullptr && - m_config.fill_density.value > 0 && m_layer->any_internal_region_slice_contains(travel)) + m_config.fill_density.value > 0 && m_retract_when_crossing_perimeters.travel_inside_internal_regions(*m_layer, travel)) // Skip retraction if travel is contained in an internal slice *and* // internal infill is enabled (so that stringing is entirely not visible). //FIXME any_internal_region_slice_contains() is potentionally very slow, it shall test for the bounding boxes first. @@ -3231,14 +3303,19 @@ std::string GCode::set_extruder(unsigned int extruder_id, double print_z) // if we are running a single-extruder setup, just set the extruder and return nothing if (!m_writer.multiple_extruders) { - m_placeholder_parser.set("current_extruder", extruder_id); + this->placeholder_parser().set("current_extruder", extruder_id); std::string gcode; // Append the filament start G-code. const std::string &start_filament_gcode = m_config.start_filament_gcode.get_at(extruder_id); if (! start_filament_gcode.empty()) { // Process the start_filament_gcode for the filament. - gcode += this->placeholder_parser_process("start_filament_gcode", start_filament_gcode, extruder_id); + DynamicConfig config; + config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index)); + config.set_key_value("layer_z", new ConfigOptionFloat(this->writer().get_position().z() - m_config.z_offset.value)); + config.set_key_value("max_layer_z", new ConfigOptionFloat(m_max_layer_z)); + config.set_key_value("filament_extruder_id", new ConfigOptionInt(int(extruder_id))); + gcode += this->placeholder_parser_process("start_filament_gcode", start_filament_gcode, extruder_id, &config); check_add_eol(gcode); } gcode += m_writer.toolchange(extruder_id); @@ -3252,8 +3329,7 @@ std::string GCode::set_extruder(unsigned int extruder_id, double print_z) m_wipe.reset_path(); if (m_writer.extruder() != nullptr) { - // Process the custom end_filament_gcode. set_extruder() is only called if there is no wipe tower - // so it should not be injected twice. + // Process the custom end_filament_gcode. unsigned int old_extruder_id = m_writer.extruder()->id(); const std::string &end_filament_gcode = m_config.end_filament_gcode.get_at(old_extruder_id); if (! end_filament_gcode.empty()) { @@ -3263,8 +3339,7 @@ std::string GCode::set_extruder(unsigned int extruder_id, double print_z) } - // If ooze prevention is enabled, park current extruder in the nearest - // standby point and set it to the standby temperature. + // If ooze prevention is enabled, set current extruder to the standby temperature. if (m_ooze_prevention.enable && m_writer.extruder() != nullptr) gcode += m_ooze_prevention.pre_toolchange(*this); @@ -3301,13 +3376,18 @@ std::string GCode::set_extruder(unsigned int extruder_id, double print_z) gcode += m_writer.set_temperature(temp, false); } - m_placeholder_parser.set("current_extruder", extruder_id); + this->placeholder_parser().set("current_extruder", extruder_id); // Append the filament start G-code. const std::string &start_filament_gcode = m_config.start_filament_gcode.get_at(extruder_id); if (! start_filament_gcode.empty()) { // Process the start_filament_gcode for the new filament. - gcode += this->placeholder_parser_process("start_filament_gcode", start_filament_gcode, extruder_id); + DynamicConfig config; + config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index)); + config.set_key_value("layer_z", new ConfigOptionFloat(this->writer().get_position().z() - m_config.z_offset.value)); + config.set_key_value("max_layer_z", new ConfigOptionFloat(m_max_layer_z)); + config.set_key_value("filament_extruder_id", new ConfigOptionInt(int(extruder_id))); + gcode += this->placeholder_parser_process("start_filament_gcode", start_filament_gcode, extruder_id, &config); check_add_eol(gcode); } // Set the new extruder to the operating temperature. @@ -3321,116 +3401,24 @@ std::string GCode::set_extruder(unsigned int extruder_id, double print_z) Vec2d GCode::point_to_gcode(const Point &point) const { Vec2d extruder_offset = EXTRUDER_CONFIG(extruder_offset); - return unscale(point) + m_origin - extruder_offset; -} - -// convert a model-space scaled point into G-code coordinates -Point GCode::gcode_to_point(const Vec2d &point) const -{ - Vec2d extruder_offset = EXTRUDER_CONFIG(extruder_offset); - return Point( - scale_(point(0) - m_origin(0) + extruder_offset(0)), - scale_(point(1) - m_origin(1) + extruder_offset(1))); + return unscaled(point) + m_origin - extruder_offset; } -// Goes through by_region std::vector and returns reference to a subvector of entities, that are to be printed -// during infill/perimeter wiping, or normally (depends on wiping_entities parameter) -// Fills in by_region_per_copy_cache and returns its reference. -const std::vector& GCode::ObjectByExtruder::Island::by_region_per_copy(std::vector &by_region_per_copy_cache, unsigned int copy, unsigned int extruder, bool wiping_entities) const +Vec2d GCode::point_to_gcode_quantized(const Point &point) const { - bool has_overrides = false; - for (const auto& reg : by_region) - if (! reg.infills_overrides.empty() || ! reg.perimeters_overrides.empty()) { - has_overrides = true; - break; - } - - // Data is cleared, but the memory is not. - by_region_per_copy_cache.clear(); - - if (! has_overrides) - // Simple case. No need to copy the regions. - return wiping_entities ? by_region_per_copy_cache : this->by_region; - - // Complex case. Some of the extrusions of some object instances are to be printed first - those are the wiping extrusions. - // Some of the extrusions of some object instances are printed later - those are the clean print extrusions. - // Filter out the extrusions based on the infill_overrides / perimeter_overrides: - - for (const auto& reg : by_region) { - by_region_per_copy_cache.emplace_back(); // creates a region in the newly created Island - - // Now we are going to iterate through perimeters and infills and pick ones that are supposed to be printed - // References are used so that we don't have to repeat the same code - for (int iter = 0; iter < 2; ++iter) { - const ExtrusionEntitiesPtr& entities = (iter ? reg.infills : reg.perimeters); - ExtrusionEntitiesPtr& target_eec = (iter ? by_region_per_copy_cache.back().infills : by_region_per_copy_cache.back().perimeters); - const std::vector& overrides = (iter ? reg.infills_overrides : reg.perimeters_overrides); - - // Now the most important thing - which extrusion should we print. - // See function ToolOrdering::get_extruder_overrides for details about the negative numbers hack. - if (wiping_entities) { - // Apply overrides for this region. - for (unsigned int i = 0; i < overrides.size(); ++ i) { - const WipingExtrusions::ExtruderPerCopy *this_override = overrides[i]; - // This copy (aka object instance) should be printed with this extruder, which overrides the default one. - if (this_override != nullptr && (*this_override)[copy] == int(extruder)) - target_eec.emplace_back(entities[i]); - } - } else { - // Apply normal extrusions (non-overrides) for this region. - unsigned int i = 0; - for (; i < overrides.size(); ++ i) { - const WipingExtrusions::ExtruderPerCopy *this_override = overrides[i]; - // This copy (aka object instance) should be printed with this extruder, which shall be equal to the default one. - if (this_override == nullptr || (*this_override)[copy] == -int(extruder)-1) - target_eec.emplace_back(entities[i]); - } - for (; i < entities.size(); ++ i) - target_eec.emplace_back(entities[i]); - } - } - } - return by_region_per_copy_cache; + Vec2d p = this->point_to_gcode(point); + return { GCodeFormatter::quantize_xyzf(p.x()), GCodeFormatter::quantize_xyzf(p.y()) }; } -// This function takes the eec and appends its entities to either perimeters or infills of this Region (depending on the first parameter) -// It also saves pointer to ExtruderPerCopy struct (for each entity), that holds information about which extruders should be used for which copy. -void GCode::ObjectByExtruder::Island::Region::append(const Type type, const ExtrusionEntityCollection* eec, const WipingExtrusions::ExtruderPerCopy* copies_extruder) +// convert a model-space scaled point into G-code coordinates +Point GCode::gcode_to_point(const Vec2d &point) const { - // We are going to manipulate either perimeters or infills, exactly in the same way. Let's create pointers to the proper structure to not repeat ourselves: - ExtrusionEntitiesPtr* perimeters_or_infills; - std::vector* perimeters_or_infills_overrides; - - switch (type) { - case PERIMETERS: - perimeters_or_infills = &perimeters; - perimeters_or_infills_overrides = &perimeters_overrides; - break; - case INFILL: - perimeters_or_infills = &infills; - perimeters_or_infills_overrides = &infills_overrides; - break; - default: - throw Slic3r::InvalidArgument("Unknown parameter!"); - } - - // First we append the entities, there are eec->entities.size() of them: - size_t old_size = perimeters_or_infills->size(); - size_t new_size = old_size + (eec->can_reverse() ? eec->entities.size() : 1); - perimeters_or_infills->reserve(new_size); - if (eec->can_reverse()) { - for (auto* ee : eec->entities) - perimeters_or_infills->emplace_back(ee); - } else - perimeters_or_infills->emplace_back(const_cast(eec)); - - if (copies_extruder != nullptr) { - // Don't reallocate overrides if not needed. - // Missing overrides are implicitely considered non-overridden. - perimeters_or_infills_overrides->reserve(new_size); - perimeters_or_infills_overrides->resize(old_size, nullptr); - perimeters_or_infills_overrides->resize(new_size, copies_extruder); - } + Vec2d pt = point - m_origin; + if (const Extruder *extruder = m_writer.extruder(); extruder) + // This function may be called at the very start from toolchange G-code when the extruder is not assigned yet. + pt += m_config.extruder_offset.get_at(extruder->id()); + return scaled(pt); + } } // namespace Slic3r diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 783cfcd331b..346ececba71 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -1,6 +1,8 @@ #ifndef slic3r_GCode_hpp_ #define slic3r_GCode_hpp_ +#include "GCode/ExtrusionProcessor.hpp" +#include "JumpPointSearch.hpp" #include "libslic3r.h" #include "ExPolygon.hpp" #include "GCodeWriter.hpp" @@ -11,6 +13,7 @@ #include "GCode/AvoidCrossingPerimeters.hpp" #include "GCode/CoolingBuffer.hpp" #include "GCode/FindReplace.hpp" +#include "GCode/RetractWhenCrossingPerimeters.hpp" #include "GCode/SpiralVase.hpp" #include "GCode/ToolOrdering.hpp" #include "GCode/WipeTower.hpp" @@ -32,19 +35,17 @@ class GCode; namespace { struct Item; } struct PrintInstance; -class ConstPrintObjectPtrsAdaptor; class OozePrevention { public: bool enable; - Points standby_points; OozePrevention() : enable(false) {} std::string pre_toolchange(GCode &gcodegen); std::string post_toolchange(GCode &gcodegen); private: - int _get_temp(GCode &gcodegen); + int _get_temp(const GCode &gcodegen) const; }; class Wipe { @@ -53,9 +54,9 @@ class Wipe { Polyline path; Wipe() : enable(false) {} - bool has_path() const { return !this->path.points.empty(); } - void reset_path() { this->path = Polyline(); } - std::string wipe(GCode &gcodegen, bool toolchange = false); + bool has_path() const { return ! this->path.empty(); } + void reset_path() { this->path.clear(); } + std::string wipe(GCode &gcodegen, bool toolchange); }; class WipeTowerIntegration { @@ -135,14 +136,14 @@ class GCode { m_enable_loop_clipping(true), m_enable_cooling_markers(false), m_enable_extrusion_role_markers(false), - m_last_processor_extrusion_role(erNone), + m_last_processor_extrusion_role(GCodeExtrusionRole::None), m_layer_count(0), m_layer_index(-1), m_layer(nullptr), m_object_layer_over_raft(false), m_volumetric_speed(0), m_last_pos_defined(false), - m_last_extrusion_role(erNone), + m_last_extrusion_role(GCodeExtrusionRole::None), m_last_width(0.0f), #if ENABLE_GCODE_VIEWER_DATA_CHECKING m_last_mm3_per_mm(0.0), @@ -163,14 +164,17 @@ class GCode { void set_origin(const Vec2d &pointf); void set_origin(const coordf_t x, const coordf_t y) { this->set_origin(Vec2d(x, y)); } const Point& last_pos() const { return m_last_pos; } + // Convert coordinates of the active object to G-code coordinates, possibly adjusted for extruder offset. Vec2d point_to_gcode(const Point &point) const; + // Convert coordinates of the active object to G-code coordinates, possibly adjusted for extruder offset and quantized to G-code resolution. + Vec2d point_to_gcode_quantized(const Point &point) const; Point gcode_to_point(const Vec2d &point) const; const FullPrintConfig &config() const { return m_config; } const Layer* layer() const { return m_layer; } GCodeWriter& writer() { return m_writer; } const GCodeWriter& writer() const { return m_writer; } - PlaceholderParser& placeholder_parser() { return m_placeholder_parser; } - const PlaceholderParser& placeholder_parser() const { return m_placeholder_parser; } + PlaceholderParser& placeholder_parser() { return m_placeholder_parser_integration.parser; } + const PlaceholderParser& placeholder_parser() const { return m_placeholder_parser_integration.parser; } // Process a template through the placeholder parser, collect error messages to be reported // inside the generated string and after the G-code export finishes. std::string placeholder_parser_process(const std::string &name, const std::string &templ, unsigned int current_extruder_id, const DynamicConfig *config_override = nullptr); @@ -186,15 +190,16 @@ class GCode { // Object and support extrusions of the same PrintObject at the same print_z. // public, so that it could be accessed by free helper functions from GCode.cpp - struct LayerToPrint + struct ObjectLayerToPrint { - LayerToPrint() : object_layer(nullptr), support_layer(nullptr) {} + ObjectLayerToPrint() : object_layer(nullptr), support_layer(nullptr) {} const Layer* object_layer; const SupportLayer* support_layer; const Layer* layer() const { return (object_layer != nullptr) ? object_layer : support_layer; } const PrintObject* object() const { return (this->layer() != nullptr) ? this->layer()->object() : nullptr; } coordf_t print_z() const { return (object_layer != nullptr && support_layer != nullptr) ? 0.5 * (object_layer->print_z + support_layer->print_z) : this->layer()->print_z; } }; + using ObjectsLayerToPrint = std::vector; private: class GCodeOutputStream { @@ -237,13 +242,13 @@ class GCode { }; void _do_export(Print &print, GCodeOutputStream &file, ThumbnailsGeneratorCallback thumbnail_cb); - static std::vector collect_layers_to_print(const PrintObject &object); - static std::vector>> collect_layers_to_print(const Print &print); + static ObjectsLayerToPrint collect_layers_to_print(const PrintObject &object); + static std::vector> collect_layers_to_print(const Print &print); LayerResult process_layer( const Print &print, // Set of object & print layers of the same PrintObject and with the same print_z. - const std::vector &layers, + const ObjectsLayerToPrint &layers, const LayerTools &layer_tools, const bool last_layer, // Pairs of PrintObject index and its instance index. @@ -255,18 +260,18 @@ class GCode { // Generate G-code, run the filters (vase mode, cooling buffer), run the G-code analyser // and export G-code into file. void process_layers( - const Print &print, - const ToolOrdering &tool_ordering, - const std::vector &print_object_instances_ordering, - const std::vector>> &layers_to_print, - GCodeOutputStream &output_stream); + const Print &print, + const ToolOrdering &tool_ordering, + const std::vector &print_object_instances_ordering, + const std::vector> &layers_to_print, + GCodeOutputStream &output_stream); // Process all layers of a single object instance (sequential mode) with a parallel pipeline: // Generate G-code, run the filters (vase mode, cooling buffer), run the G-code analyser // and export G-code into file. void process_layers( const Print &print, const ToolOrdering &tool_ordering, - std::vector layers_to_print, + ObjectsLayerToPrint layers_to_print, const size_t single_object_idx, GCodeOutputStream &output_stream); @@ -275,80 +280,52 @@ class GCode { void set_extruders(const std::vector &extruder_ids); std::string preamble(); std::string change_layer(coordf_t print_z); - std::string extrude_entity(const ExtrusionEntity &entity, std::string description = "", double speed = -1.); - std::string extrude_loop(ExtrusionLoop loop, std::string description, double speed = -1.); - std::string extrude_multi_path(ExtrusionMultiPath multipath, std::string description = "", double speed = -1.); - std::string extrude_path(ExtrusionPath path, std::string description = "", double speed = -1.); - - // Extruding multiple objects with soluble / non-soluble / combined supports - // on a multi-material printer, trying to minimize tool switches. - // Following structures sort extrusions by the extruder ID, by an order of objects and object islands. - struct ObjectByExtruder + std::string extrude_entity(const ExtrusionEntity &entity, const std::string_view description, double speed = -1.); + std::string extrude_loop(ExtrusionLoop loop, const std::string_view description, double speed = -1.); + std::string extrude_multi_path(ExtrusionMultiPath multipath, const std::string_view description, double speed = -1.); + std::string extrude_path(ExtrusionPath path, const std::string_view description, double speed = -1.); + + struct InstanceToPrint { - ObjectByExtruder() : support(nullptr), support_extrusion_role(erNone) {} - const ExtrusionEntityCollection *support; - // erSupportMaterial / erSupportMaterialInterface or erMixed. - ExtrusionRole support_extrusion_role; - - struct Island - { - struct Region { - // Non-owned references to LayerRegion::perimeters::entities - // std::vector would be better here, but there is no way in C++ to convert from std::vector std::vector without copying. - ExtrusionEntitiesPtr perimeters; - // Non-owned references to LayerRegion::fills::entities - ExtrusionEntitiesPtr infills; - - std::vector infills_overrides; - std::vector perimeters_overrides; - - enum Type { - PERIMETERS, - INFILL, - }; - - // Appends perimeter/infill entities and writes don't indices of those that are not to be extruder as part of perimeter/infill wiping - void append(const Type type, const ExtrusionEntityCollection* eec, const WipingExtrusions::ExtruderPerCopy* copy_extruders); - }; - - - std::vector by_region; // all extrusions for this island, grouped by regions - - // Fills in by_region_per_copy_cache and returns its reference. - const std::vector& by_region_per_copy(std::vector &by_region_per_copy_cache, unsigned int copy, unsigned int extruder, bool wiping_entities = false) const; - }; - std::vector islands; + InstanceToPrint(size_t object_layer_to_print_id, const PrintObject &print_object, size_t instance_id) : + object_layer_to_print_id(object_layer_to_print_id), print_object(print_object), instance_id(instance_id) {} + + // Index into std::vector, which contains Object and Support layers for the current print_z, collected for a single object, or for possibly multiple objects with multiple instances. + const size_t object_layer_to_print_id; + const PrintObject &print_object; + // Instance idx of the copy of a print object. + const size_t instance_id; }; - struct InstanceToPrint - { - InstanceToPrint(ObjectByExtruder &object_by_extruder, size_t layer_id, const PrintObject &print_object, size_t instance_id) : - object_by_extruder(object_by_extruder), layer_id(layer_id), print_object(print_object), instance_id(instance_id) {} - - // Repository - ObjectByExtruder &object_by_extruder; - // Index into std::vector, which contains Object and Support layers for the current print_z, collected for a single object, or for possibly multiple objects with multiple instances. - const size_t layer_id; - const PrintObject &print_object; - // Instance idx of the copy of a print object. - const size_t instance_id; - }; - - std::vector sort_print_object_instances( - std::vector &objects_by_extruder, - // Object and Support layers for the current print_z, collected for a single object, or for possibly multiple objects with multiple instances. - const std::vector &layers, - // Ordering must be defined for normal (non-sequential print). - const std::vector *ordering, - // For sequential print, the instance of the object to be printing has to be defined. - const size_t single_object_instance_idx); - - std::string extrude_perimeters(const Print &print, const std::vector &by_region); - std::string extrude_infill(const Print &print, const std::vector &by_region, bool ironing); + std::vector sort_print_object_instances( + // Object and Support layers for the current print_z, collected for a single object, or for possibly multiple objects with multiple instances. + const std::vector &layers, + // Ordering must be defined for normal (non-sequential print). + const std::vector *ordering, + // For sequential print, the instance of the object to be printing has to be defined. + const size_t single_object_instance_idx); + + // This function will be called for each printing extruder, possibly twice: First for wiping extrusions, second for normal extrusions. + void process_layer_single_object( + // output + std::string &gcode, + // Index of the extruder currently active. + const unsigned int extruder_id, + // What object and instance is going to be printed. + const InstanceToPrint &print_instance, + // and the object & support layer of the above. + const ObjectLayerToPrint &layer_to_print, + // Container for extruder overrides (when wiping into object or infill). + const LayerTools &layer_tools, + // Is any extrusion possibly marked as wiping extrusion? + const bool is_anything_overridden, + // Round 1 (wiping into object or infill) or round 2 (normal extrusions). + const bool print_wipe_extrusions); + std::string extrude_support(const ExtrusionEntityCollection &support_fills); std::string travel_to(const Point &point, ExtrusionRole role, std::string comment); - bool needs_retraction(const Polyline &travel, ExtrusionRole role = erNone); + bool needs_retraction(const Polyline &travel, ExtrusionRole role = ExtrusionRole::None); std::string retract(bool toolchange = false); std::string unretract() { return m_writer.unlift() + m_writer.unretract(); } std::string set_extruder(unsigned int extruder_id, double print_z); @@ -356,6 +333,8 @@ class GCode { // Cache for custom seam enforcers/blockers for each layer. SeamPlacer m_seam_placer; + ExtrusionQualityEstimator m_extrusion_quality_estimator; + /* Origin of print coordinates expressed in unscaled G-code coordinates. This affects the input arguments supplied to the extrude*() and travel_to() methods. */ @@ -364,14 +343,42 @@ class GCode { // scaled G-code resolution double m_scaled_resolution; GCodeWriter m_writer; - PlaceholderParser m_placeholder_parser; - // For random number generator etc. - PlaceholderParser::ContextData m_placeholder_parser_context; - // Collection of templates, on which the placeholder substitution failed. - std::map m_placeholder_parser_failed_templates; + + struct PlaceholderParserIntegration { + void reset(); + void init(const GCodeWriter &config); + void update_from_gcodewriter(const GCodeWriter &writer); + void validate_output_vector_variables(); + + PlaceholderParser parser; + // For random number generator etc. + PlaceholderParser::ContextData context; + // Collection of templates, on which the placeholder substitution failed. + std::map failed_templates; + // Input/output from/to custom G-code block, for returning position, retraction etc. + DynamicConfig output_config; + ConfigOptionFloats *opt_position { nullptr }; + ConfigOptionFloat *opt_zhop { nullptr }; + ConfigOptionFloats *opt_e_position { nullptr }; + ConfigOptionFloats *opt_e_retracted { nullptr }; + ConfigOptionFloats *opt_e_restart_extra { nullptr }; + ConfigOptionFloats *opt_extruded_volume { nullptr }; + ConfigOptionFloats *opt_extruded_weight { nullptr }; + ConfigOptionFloat *opt_extruded_volume_total { nullptr }; + ConfigOptionFloat *opt_extruded_weight_total { nullptr }; + // Caches of the data passed to the script. + size_t num_extruders; + std::vector position; + std::vector e_position; + std::vector e_retracted; + std::vector e_restart_extra; + } m_placeholder_parser_integration; + OozePrevention m_ooze_prevention; Wipe m_wipe; AvoidCrossingPerimeters m_avoid_crossing_perimeters; + JPSPathFinder m_avoid_crossing_curled_overhangs; + RetractWhenCrossingPerimeters m_retract_when_crossing_perimeters; bool m_enable_loop_clipping; // If enabled, the G-code generator will put following comments at the ends // of the G-code lines: _EXTRUDE_SET_SPEED, _WIPE, _BRIDGE_FAN_START, _BRIDGE_FAN_END @@ -381,7 +388,7 @@ class GCode { // The Pressure Equalizer removes the markers from the final G-code. bool m_enable_extrusion_role_markers; // Keeps track of the last extrusion role passed to the processor - ExtrusionRole m_last_processor_extrusion_role; + GCodeExtrusionRole m_last_processor_extrusion_role; // How many times will change_layer() be called? // change_layer() will update the progress bar. unsigned int m_layer_count; @@ -394,7 +401,7 @@ class GCode { bool m_object_layer_over_raft; double m_volumetric_speed; // Support for the extrusion role markers. Which marker is active? - ExtrusionRole m_last_extrusion_role; + GCodeExtrusionRole m_last_extrusion_role; // Support for G-Code Processor float m_last_height{ 0.0f }; float m_last_layer_z{ 0.0f }; @@ -422,32 +429,20 @@ class GCode { // Index of a last object copy extruded. std::pair m_last_obj_copy; - bool m_silent_time_estimator_enabled; + bool m_silent_time_estimator_enabled; // Processor - GCodeProcessor m_processor; + GCodeProcessor m_processor; - std::string _extrude(const ExtrusionPath &path, std::string description = "", double speed = -1); - void print_machine_envelope(GCodeOutputStream &file, Print &print); - void _print_first_layer_bed_temperature(GCodeOutputStream &file, Print &print, const std::string &gcode, unsigned int first_printing_extruder_id, bool wait); - void _print_first_layer_extruder_temperatures(GCodeOutputStream &file, Print &print, const std::string &gcode, unsigned int first_printing_extruder_id, bool wait); + std::string _extrude(const ExtrusionPath &path, const std::string_view description, double speed = -1); + void print_machine_envelope(GCodeOutputStream &file, Print &print); + void _print_first_layer_bed_temperature(GCodeOutputStream &file, Print &print, const std::string &gcode, unsigned int first_printing_extruder_id, bool wait); + void _print_first_layer_extruder_temperatures(GCodeOutputStream &file, Print &print, const std::string &gcode, unsigned int first_printing_extruder_id, bool wait); // On the first printing layer. This flag triggers first layer speeds. bool on_first_layer() const { return m_layer != nullptr && m_layer->id() == 0; } // To control print speed of 1st object layer over raft interface. bool object_layer_over_raft() const { return m_object_layer_over_raft; } - friend ObjectByExtruder& object_by_extruder( - std::map> &by_extruder, - unsigned int extruder_id, - size_t object_idx, - size_t num_objects); - friend std::vector& object_islands_by_extruder( - std::map> &by_extruder, - unsigned int extruder_id, - size_t object_idx, - size_t num_objects, - size_t num_islands); - friend class Wipe; friend class WipeTowerIntegration; friend class PressureEqualizer; diff --git a/src/libslic3r/GCode/AvoidCrossingPerimeters.cpp b/src/libslic3r/GCode/AvoidCrossingPerimeters.cpp index f846d8cecc2..c866e13e4f0 100644 --- a/src/libslic3r/GCode/AvoidCrossingPerimeters.cpp +++ b/src/libslic3r/GCode/AvoidCrossingPerimeters.cpp @@ -13,6 +13,8 @@ #include #include +//#define AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT + namespace Slic3r { struct TravelPoint @@ -354,8 +356,6 @@ static Polyline to_polyline(const std::vector &travel) return result; } -// #define AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT - #ifdef AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT static void export_travel_to_svg(const Polygons &boundary, const Line &original_travel, @@ -487,7 +487,7 @@ static float get_perimeter_spacing(const Layer &layer) size_t regions_count = 0; float perimeter_spacing = 0.f; for (const LayerRegion *layer_region : layer.regions()) - if (layer_region != nullptr && !layer_region->slices.empty()) { + if (layer_region != nullptr && ! layer_region->slices().empty()) { perimeter_spacing += layer_region->flow(frPerimeter).scaled_spacing(); ++regions_count; } @@ -508,7 +508,7 @@ static float get_perimeter_spacing_external(const Layer &layer) for (const PrintObject *object : layer.object()->print()->objects()) if (const Layer *l = object->get_layer_at_printz(layer.print_z, EPSILON); l) for (const LayerRegion *layer_region : l->regions()) - if (layer_region != nullptr && !layer_region->slices.empty()) { + if (layer_region != nullptr && ! layer_region->slices().empty()) { perimeter_spacing += layer_region->flow(frPerimeter).scaled_spacing(); ++ regions_count; } @@ -521,6 +521,25 @@ static float get_perimeter_spacing_external(const Layer &layer) return perimeter_spacing; } +// Returns average perimeter width calculated from all LayerRegion within the layer. +static float get_external_perimeter_width(const Layer &layer) +{ + size_t regions_count = 0; + float perimeter_width = 0.f; + for (const LayerRegion *layer_region : layer.regions()) + if (layer_region != nullptr && ! layer_region->slices().empty()) { + perimeter_width += float(layer_region->flow(frExternalPerimeter).scaled_width()); + ++regions_count; + } + + assert(perimeter_width >= 0.f); + if (regions_count != 0) + perimeter_width /= float(regions_count); + else + perimeter_width = get_default_perimeter_spacing(*layer.object()); + return perimeter_width; +} + // Called by avoid_perimeters() and by simplify_travel_heuristics(). static size_t avoid_perimeters_inner(const AvoidCrossingPerimeters::Boundary &boundary, const Point &start, @@ -659,22 +678,22 @@ static size_t avoid_perimeters(const AvoidCrossingPerimeters::Boundary &boundary // Check if anyone of ExPolygons contains whole travel. // called by need_wipe() and AvoidCrossingPerimeters::travel_to() // FIXME Lukas H.: Maybe similar approach could also be used for ExPolygon::contains() -static bool any_expolygon_contains(const ExPolygons &ex_polygons, - const std::vector &ex_polygons_bboxes, - const EdgeGrid::Grid &grid_lslice, +static bool any_expolygon_contains(const ExPolygons &lslices_offset, + const std::vector &lslices_offset_bboxes, + const EdgeGrid::Grid &grid_lslices_offset, const Line &travel) { - assert(ex_polygons.size() == ex_polygons_bboxes.size()); - if(!grid_lslice.bbox().contains(travel.a) || !grid_lslice.bbox().contains(travel.b)) + assert(lslices_offset.size() == lslices_offset_bboxes.size()); + if(!grid_lslices_offset.bbox().contains(travel.a) || !grid_lslices_offset.bbox().contains(travel.b)) return false; - FirstIntersectionVisitor visitor(grid_lslice); + FirstIntersectionVisitor visitor(grid_lslices_offset); visitor.pt_current = &travel.a; visitor.pt_next = &travel.b; - grid_lslice.visit_cells_intersecting_line(*visitor.pt_current, *visitor.pt_next, visitor); + grid_lslices_offset.visit_cells_intersecting_line(*visitor.pt_current, *visitor.pt_next, visitor); if (!visitor.intersect) { - for (const ExPolygon &ex_polygon : ex_polygons) { - const BoundingBox &bbox = ex_polygons_bboxes[&ex_polygon - &ex_polygons.front()]; + for (const ExPolygon &ex_polygon : lslices_offset) { + const BoundingBox &bbox = lslices_offset_bboxes[&ex_polygon - &lslices_offset.front()]; if (bbox.contains(travel.a) && bbox.contains(travel.b) && ex_polygon.contains(travel.a)) return true; } @@ -684,18 +703,18 @@ static bool any_expolygon_contains(const ExPolygons &ex_polygons, // Check if anyone of ExPolygons contains whole travel. // called by need_wipe() -static bool any_expolygon_contains(const ExPolygons &ex_polygons, const std::vector &ex_polygons_bboxes, const EdgeGrid::Grid &grid_lslice, const Polyline &travel) +static bool any_expolygon_contains(const ExPolygons &ex_polygons, const std::vector &ex_polygons_bboxes, const EdgeGrid::Grid &grid_lslice_offset, const Polyline &travel) { assert(ex_polygons.size() == ex_polygons_bboxes.size()); - if(std::any_of(travel.points.begin(), travel.points.end(), [&grid_lslice](const Point &point) { return !grid_lslice.bbox().contains(point); })) + if(std::any_of(travel.points.begin(), travel.points.end(), [&grid_lslice_offset](const Point &point) { return !grid_lslice_offset.bbox().contains(point); })) return false; - FirstIntersectionVisitor visitor(grid_lslice); + FirstIntersectionVisitor visitor(grid_lslice_offset); bool any_intersection = false; for (size_t line_idx = 1; line_idx < travel.size(); ++line_idx) { visitor.pt_current = &travel.points[line_idx - 1]; visitor.pt_next = &travel.points[line_idx]; - grid_lslice.visit_cells_intersecting_line(*visitor.pt_current, *visitor.pt_next, visitor); + grid_lslice_offset.visit_cells_intersecting_line(*visitor.pt_current, *visitor.pt_next, visitor); any_intersection = visitor.intersect; if (any_intersection) break; } @@ -711,14 +730,14 @@ static bool any_expolygon_contains(const ExPolygons &ex_polygons, const std::vec return false; } -static bool need_wipe(const GCode &gcodegen, - const EdgeGrid::Grid &grid_lslice, - const Line &original_travel, - const Polyline &result_travel, - const size_t intersection_count) +static bool need_wipe(const GCode &gcodegen, + const ExPolygons &lslices_offset, + const std::vector &lslices_offset_bboxes, + const EdgeGrid::Grid &grid_lslices_offset, + const Line &original_travel, + const Polyline &result_travel, + const size_t intersection_count) { - const ExPolygons &lslices = gcodegen.layer()->lslices; - const std::vector &lslices_bboxes = gcodegen.layer()->lslices_bboxes; bool z_lift_enabled = gcodegen.config().retract_lift.get_at(gcodegen.writer().extruder()->id()) > 0.; bool wipe_needed = false; @@ -728,16 +747,16 @@ static bool need_wipe(const GCode &gcodegen, // The original layer is intersected with defined boundaries. Then it is necessary to make a detailed test. // If the z-lift is enabled, then a wipe is needed when the original travel leads above the holes. if (z_lift_enabled) { - if (any_expolygon_contains(lslices, lslices_bboxes, grid_lslice, original_travel)) { + if (any_expolygon_contains(lslices_offset, lslices_offset_bboxes, grid_lslices_offset, original_travel)) { // Check if original_travel and result_travel are not same. // If both are the same, then it is possible to skip testing of result_travel wipe_needed = !(result_travel.size() > 2 && result_travel.first_point() == original_travel.a && result_travel.last_point() == original_travel.b) && - !any_expolygon_contains(lslices, lslices_bboxes, grid_lslice, result_travel); + !any_expolygon_contains(lslices_offset, lslices_offset_bboxes, grid_lslices_offset, result_travel); } else { wipe_needed = true; } } else { - wipe_needed = !any_expolygon_contains(lslices, lslices_bboxes, grid_lslice, result_travel); + wipe_needed = !any_expolygon_contains(lslices_offset, lslices_offset_bboxes, grid_lslices_offset, result_travel); } } @@ -1051,14 +1070,14 @@ static ExPolygons get_boundary(const Layer &layer) // Collect all top layers that will not be crossed. size_t polygons_count = 0; for (const LayerRegion *layer_region : layer.regions()) - for (const Surface &surface : layer_region->fill_surfaces.surfaces) + for (const Surface &surface : layer_region->fill_surfaces()) if (surface.is_top()) ++polygons_count; if (polygons_count > 0) { ExPolygons top_layer_polygons; top_layer_polygons.reserve(polygons_count); for (const LayerRegion *layer_region : layer.regions()) - for (const Surface &surface : layer_region->fill_surfaces.surfaces) + for (const Surface &surface : layer_region->fill_surfaces()) if (surface.is_top()) top_layer_polygons.emplace_back(surface.expolygon); top_layer_polygons = union_ex(top_layer_polygons); @@ -1163,10 +1182,8 @@ Polyline AvoidCrossingPerimeters::travel_to(const GCode &gcodegen, const Point & Vec2d startf = start.cast(); Vec2d endf = end .cast(); - const ExPolygons &lslices = gcodegen.layer()->lslices; - const std::vector &lslices_bboxes = gcodegen.layer()->lslices_bboxes; - bool is_support_layer = dynamic_cast(gcodegen.layer()) != nullptr; - if (!use_external && (is_support_layer || (!lslices.empty() && !any_expolygon_contains(lslices, lslices_bboxes, m_grid_lslice, travel)))) { + bool is_support_layer = dynamic_cast(gcodegen.layer()) != nullptr; + if (!use_external && (is_support_layer || (!m_lslices_offset.empty() && !any_expolygon_contains(m_lslices_offset, m_lslices_offset_bboxes, m_grid_lslices_offset, travel)))) { // Initialize m_internal only when it is necessary. if (m_internal.boundaries.empty()) init_boundary(&m_internal, to_polygons(get_boundary(*gcodegen.layer()))); @@ -1216,7 +1233,7 @@ Polyline AvoidCrossingPerimeters::travel_to(const GCode &gcodegen, const Point & } else if (max_detour_length_exceeded) { *could_be_wipe_disabled = false; } else - *could_be_wipe_disabled = !need_wipe(gcodegen, m_grid_lslice, travel, result_pl, travel_intersection_count); + *could_be_wipe_disabled = !need_wipe(gcodegen, m_lslices_offset, m_lslices_offset_bboxes, m_grid_lslices_offset, travel, result_pl, travel_intersection_count); return result_pl; } @@ -1227,13 +1244,21 @@ void AvoidCrossingPerimeters::init_layer(const Layer &layer) { m_internal.clear(); m_external.clear(); + m_lslices_offset.clear(); + m_lslices_offset_bboxes.clear(); + + float perimeter_offset = -get_external_perimeter_width(layer) / float(2.); + m_lslices_offset = offset_ex(layer.lslices, perimeter_offset); + + m_lslices_offset_bboxes.reserve(m_lslices_offset.size()); + for (const ExPolygon &ex_poly : m_lslices_offset) + m_lslices_offset_bboxes.emplace_back(get_extents(ex_poly)); BoundingBox bbox_slice(get_extents(layer.lslices)); bbox_slice.offset(SCALED_EPSILON); - m_grid_lslice.set_bbox(bbox_slice); - //FIXME 1mm grid? - m_grid_lslice.create(layer.lslices, coord_t(scale_(1.))); + m_grid_lslices_offset.set_bbox(bbox_slice); + m_grid_lslices_offset.create(m_lslices_offset, coord_t(scale_(1.))); } #if 0 diff --git a/src/libslic3r/GCode/AvoidCrossingPerimeters.hpp b/src/libslic3r/GCode/AvoidCrossingPerimeters.hpp index 412822c66e1..eb81c7972e9 100644 --- a/src/libslic3r/GCode/AvoidCrossingPerimeters.hpp +++ b/src/libslic3r/GCode/AvoidCrossingPerimeters.hpp @@ -58,8 +58,11 @@ class AvoidCrossingPerimeters // we enable it by default for the first travel move in print bool m_disabled_once { true }; + // Lslices offseted by half an external perimeter width. Used for detection if line or polyline is inside of any polygon. + ExPolygons m_lslices_offset; + std::vector m_lslices_offset_bboxes; // Used for detection of line or polyline is inside of any polygon. - EdgeGrid::Grid m_grid_lslice; + EdgeGrid::Grid m_grid_lslices_offset; // Store all needed data for travels inside object Boundary m_internal; // Store all needed data for travels outside object diff --git a/src/libslic3r/GCode/CoolingBuffer.cpp b/src/libslic3r/GCode/CoolingBuffer.cpp index ef0d63c93aa..b574c95b378 100644 --- a/src/libslic3r/GCode/CoolingBuffer.cpp +++ b/src/libslic3r/GCode/CoolingBuffer.cpp @@ -1,5 +1,6 @@ #include "../GCode.hpp" #include "CoolingBuffer.hpp" +#include #include #include #include @@ -14,6 +15,8 @@ #include +#include + namespace Slic3r { CoolingBuffer::CoolingBuffer(GCode &gcodegen) : m_config(gcodegen.config()), m_toolchange_prefix(gcodegen.writer().toolchange_prefix()), m_current_extruder(0) @@ -57,6 +60,9 @@ struct CoolingLine // Would be TYPE_ADJUSTABLE, but the block of G-code lines has zero extrusion length, thus the block // cannot have its speed adjusted. This should not happen (sic!). TYPE_ADJUSTABLE_EMPTY = 1 << 12, + // Custom fan speed (introduced for overhang fan speed) + TYPE_SET_FAN_SPEED = 1 << 13, + TYPE_RESET_FAN_SPEED = 1 << 14, }; CoolingLine(unsigned int type, size_t line_start, size_t line_end) : @@ -86,6 +92,8 @@ struct CoolingLine float time; // Maximum duration of this segment. float time_max; + // Requested fan speed + int fan_speed; // If marked with the "slowdown" flag, the line has been slowed down. bool slowdown; }; @@ -339,12 +347,13 @@ std::vector CoolingBuffer::parse_layer_gcode(const std:: // for a sequence of extrusion moves. size_t active_speed_modifier = size_t(-1); + std::vector new_pos; for (; *line_start != 0; line_start = line_end) { while (*line_end != '\n' && *line_end != 0) ++ line_end; // sline will not contain the trailing '\n'. - std::string sline(line_start, line_end); + std::string_view sline(line_start, line_end - line_start); // CoolingLine will contain the trailing '\n'. if (*line_end == '\n') ++ line_end; @@ -358,20 +367,19 @@ std::vector CoolingBuffer::parse_layer_gcode(const std:: if (line.type) { // G0, G1 or G92 // Parse the G-code line. - std::vector new_pos(current_pos); - const char *c = sline.data() + 3; - for (;;) { + new_pos = current_pos; + for (auto c = sline.begin() + 3;;) { // Skip whitespaces. - for (; *c == ' ' || *c == '\t'; ++ c); - if (*c == 0 || *c == ';') + for (; c != sline.end() && (*c == ' ' || *c == '\t'); ++ c); + if (c == sline.end() || *c == ';') break; - assert(is_decimal_separator_point()); // for atof // Parse the axis. size_t axis = (*c >= 'X' && *c <= 'Z') ? (*c - 'X') : (*c == extrusion_axis) ? 3 : (*c == 'F') ? 4 : size_t(-1); if (axis != size_t(-1)) { - new_pos[axis] = float(atof(++c)); + //auto [pend, ec] = + fast_float::from_chars(&*(++ c), sline.data() + sline.size(), new_pos[axis]); if (axis == 4) { // Convert mm/min to mm/sec. new_pos[4] /= 60.f; @@ -381,7 +389,7 @@ std::vector CoolingBuffer::parse_layer_gcode(const std:: } } // Skip this word. - for (; *c != ' ' && *c != '\t' && *c != 0; ++ c); + for (; c != sline.end() && *c != ' ' && *c != '\t'; ++ c); } bool external_perimeter = boost::contains(sline, ";_EXTERNAL_PERIMETER"); bool wipe = boost::contains(sline, ";_WIPE"); @@ -460,22 +468,24 @@ std::vector CoolingBuffer::parse_layer_gcode(const std:: } active_speed_modifier = size_t(-1); } else if (boost::starts_with(sline, m_toolchange_prefix)) { - unsigned int new_extruder = (unsigned int)atoi(sline.c_str() + m_toolchange_prefix.size()); - // Only change extruder in case the number is meaningful. User could provide an out-of-range index through custom gcodes - those shall be ignored. - if (new_extruder < map_extruder_to_per_extruder_adjustment.size()) { - if (new_extruder != current_extruder) { - // Switch the tool. - line.type = CoolingLine::TYPE_SET_TOOL; - current_extruder = new_extruder; - adjustment = &per_extruder_adjustments[map_extruder_to_per_extruder_adjustment[current_extruder]]; + unsigned int new_extruder = 0; + auto res = std::from_chars(sline.data() + m_toolchange_prefix.size(), sline.data() + sline.size(), new_extruder); + if (res.ec != std::errc::invalid_argument) { + // Only change extruder in case the number is meaningful. User could provide an out-of-range index through custom gcodes - those shall be ignored. + if (new_extruder < map_extruder_to_per_extruder_adjustment.size()) { + if (new_extruder != current_extruder) { + // Switch the tool. + line.type = CoolingLine::TYPE_SET_TOOL; + current_extruder = new_extruder; + adjustment = &per_extruder_adjustments[map_extruder_to_per_extruder_adjustment[current_extruder]]; + } + } + else { + // Only log the error in case of MM printer. Single extruder printers likely ignore any T anyway. + if (map_extruder_to_per_extruder_adjustment.size() > 1) + BOOST_LOG_TRIVIAL(error) << "CoolingBuffer encountered an invalid toolchange, maybe from a custom gcode: " << sline; } } - else { - // Only log the error in case of MM printer. Single extruder printers likely ignore any T anyway. - if (map_extruder_to_per_extruder_adjustment.size() > 1) - BOOST_LOG_TRIVIAL(error) << "CoolingBuffer encountered an invalid toolchange, maybe from a custom gcode: " << sline; - } - } else if (boost::starts_with(sline, ";_BRIDGE_FAN_START")) { line.type = CoolingLine::TYPE_BRIDGE_FAN_START; } else if (boost::starts_with(sline, ";_BRIDGE_FAN_END")) { @@ -485,11 +495,28 @@ std::vector CoolingBuffer::parse_layer_gcode(const std:: line.type = CoolingLine::TYPE_G4; size_t pos_S = sline.find('S', 3); size_t pos_P = sline.find('P', 3); - assert(is_decimal_separator_point()); // for atof - line.time = line.time_max = float( - (pos_S > 0) ? atof(sline.c_str() + pos_S + 1) : - (pos_P > 0) ? atof(sline.c_str() + pos_P + 1) * 0.001 : 0.); + bool has_S = pos_S > 0; + bool has_P = pos_P > 0; + if (has_S || has_P) { + //auto [pend, ec] = + fast_float::from_chars(sline.data() + (has_S ? pos_S : pos_P) + 1, sline.data() + sline.size(), line.time); + if (has_P) + line.time *= 0.001f; + } else + line.time = 0; + line.time_max = line.time; + } else if (boost::contains(sline, ";_SET_FAN_SPEED")) { + auto speed_start = sline.find_last_of('D'); + int speed = 0; + for (char num : sline.substr(speed_start + 1)) { + speed = speed * 10 + (num - '0'); + } + line.type = CoolingLine::TYPE_SET_FAN_SPEED; + line.fan_speed = speed; + } else if (boost::contains(sline, ";_RESET_FAN_SPEED")) { + line.type = CoolingLine::TYPE_RESET_FAN_SPEED; } + if (line.type != 0) adjustment->lines.emplace_back(std::move(line)); } @@ -722,10 +749,11 @@ std::string CoolingBuffer::apply_layer_cooldown( new_gcode.reserve(gcode.size() * 2); bool bridge_fan_control = false; int bridge_fan_speed = 0; - auto change_extruder_set_fan = [ this, layer_id, layer_time, &new_gcode, &bridge_fan_control, &bridge_fan_speed ]() { + auto change_extruder_set_fan = [this, layer_id, layer_time, &new_gcode, &bridge_fan_control, &bridge_fan_speed]() { #define EXTRUDER_CONFIG(OPT) m_config.OPT.get_at(m_current_extruder) int min_fan_speed = EXTRUDER_CONFIG(min_fan_speed); int fan_speed_new = EXTRUDER_CONFIG(fan_always_on) ? min_fan_speed : 0; + std::pair custom_fan_speed_limits{fan_speed_new, 100 }; int disable_fan_first_layers = EXTRUDER_CONFIG(disable_fan_first_layers); // Is the fan speed ramp enabled? int full_fan_speed_layer = EXTRUDER_CONFIG(full_fan_speed_layer); @@ -742,11 +770,13 @@ std::string CoolingBuffer::apply_layer_cooldown( if (layer_time < slowdown_below_layer_time) { // Layer time very short. Enable the fan to a full throttle. fan_speed_new = max_fan_speed; + custom_fan_speed_limits.first = fan_speed_new; } else if (layer_time < fan_below_layer_time) { // Layer time quite short. Enable the fan proportionally according to the current layer time. assert(layer_time >= slowdown_below_layer_time); double t = (layer_time - slowdown_below_layer_time) / (fan_below_layer_time - slowdown_below_layer_time); fan_speed_new = int(floor(t * min_fan_speed + (1. - t) * max_fan_speed) + 0.5); + custom_fan_speed_limits.first = fan_speed_new; } } bridge_fan_speed = EXTRUDER_CONFIG(bridge_fan_speed); @@ -755,35 +785,48 @@ std::string CoolingBuffer::apply_layer_cooldown( float factor = float(int(layer_id + 1) - disable_fan_first_layers) / float(full_fan_speed_layer - disable_fan_first_layers); fan_speed_new = std::clamp(int(float(fan_speed_new) * factor + 0.5f), 0, 255); bridge_fan_speed = std::clamp(int(float(bridge_fan_speed) * factor + 0.5f), 0, 255); + custom_fan_speed_limits.second = fan_speed_new; } #undef EXTRUDER_CONFIG bridge_fan_control = bridge_fan_speed > fan_speed_new; - } else { + } else { // fan disabled bridge_fan_control = false; bridge_fan_speed = 0; fan_speed_new = 0; + custom_fan_speed_limits.second = 0; } if (fan_speed_new != m_fan_speed) { m_fan_speed = fan_speed_new; new_gcode += GCodeWriter::set_fan(m_config.gcode_flavor, m_config.gcode_comments, m_fan_speed); } + custom_fan_speed_limits.first = std::min(custom_fan_speed_limits.first, custom_fan_speed_limits.second); + return custom_fan_speed_limits; }; const char *pos = gcode.c_str(); int current_feedrate = 0; - change_extruder_set_fan(); + std::pair fan_speed_limits = change_extruder_set_fan(); for (const CoolingLine *line : lines) { const char *line_start = gcode.c_str() + line->line_start; const char *line_end = gcode.c_str() + line->line_end; if (line_start > pos) new_gcode.append(pos, line_start - pos); if (line->type & CoolingLine::TYPE_SET_TOOL) { - unsigned int new_extruder = (unsigned int)atoi(line_start + m_toolchange_prefix.size()); - if (new_extruder != m_current_extruder) { + unsigned int new_extruder = 0; + auto res = std::from_chars(line_start + m_toolchange_prefix.size(), line_end, new_extruder); + if (res.ec != std::errc::invalid_argument && new_extruder != m_current_extruder) { m_current_extruder = new_extruder; - change_extruder_set_fan(); + fan_speed_limits = change_extruder_set_fan(); } new_gcode.append(line_start, line_end - line_start); + } else if (line->type & CoolingLine::TYPE_SET_FAN_SPEED) { + int new_speed = std::clamp(line->fan_speed, fan_speed_limits.first, fan_speed_limits.second); + if (m_fan_speed != new_speed) { + new_gcode += GCodeWriter::set_fan(m_config.gcode_flavor, m_config.gcode_comments, new_speed); + m_fan_speed = new_speed; + } + } else if (line->type & CoolingLine::TYPE_RESET_FAN_SPEED){ + fan_speed_limits = change_extruder_set_fan(); } else if (line->type & CoolingLine::TYPE_BRIDGE_FAN_START) { if (bridge_fan_control) new_gcode += GCodeWriter::set_fan(m_config.gcode_flavor, m_config.gcode_comments, bridge_fan_speed); @@ -804,7 +847,11 @@ std::string CoolingBuffer::apply_layer_cooldown( // Remove the F word from the current G-code line. bool remove = false; assert(fpos != nullptr); - new_feedrate = line->slowdown ? int(floor(60. * line->feedrate + 0.5)) : atoi(fpos); + if (line->slowdown) + new_feedrate = int(floor(60. * line->feedrate + 0.5)); + else + //auto res = + std::from_chars(fpos, line_end, new_feedrate); if (new_feedrate == current_feedrate) { // No need to change the F value. if ((line->type & (CoolingLine::TYPE_ADJUSTABLE | CoolingLine::TYPE_ADJUSTABLE_EMPTY | CoolingLine::TYPE_EXTERNAL_PERIMETER | CoolingLine::TYPE_WIPE)) || line->length == 0.) diff --git a/src/libslic3r/GCode/CoolingBuffer.hpp b/src/libslic3r/GCode/CoolingBuffer.hpp index 1fe04051847..91a81c7f317 100644 --- a/src/libslic3r/GCode/CoolingBuffer.hpp +++ b/src/libslic3r/GCode/CoolingBuffer.hpp @@ -26,6 +26,8 @@ class CoolingBuffer { void reset(const Vec3d &position); void set_current_extruder(unsigned int extruder_id) { m_current_extruder = extruder_id; } std::string process_layer(std::string &&gcode, size_t layer_id, bool flush); + std::string process_layer(const std::string &gcode, size_t layer_id, bool flush) + { return this->process_layer(std::string(gcode), layer_id, flush); } private: CoolingBuffer& operator=(const CoolingBuffer&) = delete; diff --git a/src/libslic3r/GCode/ExtrusionProcessor.hpp b/src/libslic3r/GCode/ExtrusionProcessor.hpp new file mode 100644 index 00000000000..1b174882756 --- /dev/null +++ b/src/libslic3r/GCode/ExtrusionProcessor.hpp @@ -0,0 +1,321 @@ +#ifndef slic3r_ExtrusionProcessor_hpp_ +#define slic3r_ExtrusionProcessor_hpp_ + +#include "../AABBTreeLines.hpp" +#include "../SupportSpotsGenerator.hpp" +#include "../libslic3r.h" +#include "../ExtrusionEntity.hpp" +#include "../Layer.hpp" +#include "../Point.hpp" +#include "../SVG.hpp" +#include "../BoundingBox.hpp" +#include "../Polygon.hpp" +#include "../ClipperUtils.hpp" +#include "../Flow.hpp" +#include "../Config.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Slic3r { + +class SlidingWindowCurvatureAccumulator +{ + float window_size; + float total_distance = 0; // accumulated distance + float total_curvature = 0; // accumulated signed ccw angles + deque distances; + deque angles; + +public: + SlidingWindowCurvatureAccumulator(float window_size) : window_size(window_size) {} + + void add_point(float distance, float angle) + { + total_distance += distance; + total_curvature += angle; + distances.push_back(distance); + angles.push_back(angle); + + while (distances.size() > 1 && total_distance > window_size) { + total_distance -= distances.front(); + total_curvature -= angles.front(); + distances.pop_front(); + angles.pop_front(); + } + } + + float get_curvature() const + { + return total_curvature / window_size; + } + + void reset() + { + total_curvature = 0; + total_distance = 0; + distances.clear(); + angles.clear(); + } +}; + +class CurvatureEstimator +{ + static const size_t sliders_count = 3; + SlidingWindowCurvatureAccumulator sliders[sliders_count] = {{1.0},{4.0}, {10.0}}; + +public: + void add_point(float distance, float angle) + { + if (distance < EPSILON) + return; + for (SlidingWindowCurvatureAccumulator &slider : sliders) { + slider.add_point(distance, angle); + } + } + float get_curvature() + { + float max_curvature = 0.0f; + for (const SlidingWindowCurvatureAccumulator &slider : sliders) { + if (abs(slider.get_curvature()) > abs(max_curvature)) { + max_curvature = slider.get_curvature(); + } + } + return max_curvature; + } + void reset() + { + for (SlidingWindowCurvatureAccumulator &slider : sliders) { + slider.reset(); + } + } +}; + +struct ExtendedPoint +{ + ExtendedPoint(Vec2d position, float distance = 0.0, size_t nearest_prev_layer_line = size_t(-1), float curvature = 0.0) + : position(position), distance(distance), nearest_prev_layer_line(nearest_prev_layer_line), curvature(curvature) + {} + + Vec2d position; + float distance; + size_t nearest_prev_layer_line; + float curvature; +}; + +template +std::vector estimate_points_properties(const std::vector

    &input_points, + const AABBTreeLines::LinesDistancer &unscaled_prev_layer, + float flow_width, + float max_line_length = -1.0f) +{ + using AABBScalar = typename AABBTreeLines::LinesDistancer::Scalar; + if (input_points.empty()) + return {}; + float boundary_offset = PREV_LAYER_BOUNDARY_OFFSET ? 0.5 * flow_width : 0.0f; + CurvatureEstimator cestim; + auto maybe_unscale = [](const P &p) { return SCALED_INPUT ? unscaled(p) : p.template cast(); }; + + std::vector points; + points.reserve(input_points.size() * (ADD_INTERSECTIONS ? 1.5 : 1)); + + { + ExtendedPoint start_point{maybe_unscale(input_points.front())}; + auto [distance, nearest_line, x] = unscaled_prev_layer.template distance_from_lines_extra(start_point.position.cast()); + start_point.distance = distance + boundary_offset; + start_point.nearest_prev_layer_line = nearest_line; + points.push_back(start_point); + } + for (size_t i = 1; i < input_points.size(); i++) { + ExtendedPoint next_point{maybe_unscale(input_points[i])}; + auto [distance, nearest_line, x] = unscaled_prev_layer.template distance_from_lines_extra(next_point.position.cast()); + next_point.distance = distance + boundary_offset; + next_point.nearest_prev_layer_line = nearest_line; + + if (ADD_INTERSECTIONS && + ((points.back().distance > boundary_offset + EPSILON) != (next_point.distance > boundary_offset + EPSILON))) { + const ExtendedPoint &prev_point = points.back(); + auto intersections = unscaled_prev_layer.template intersections_with_line(L{prev_point.position.cast(), next_point.position.cast()}); + for (const auto &intersection : intersections) { + points.emplace_back(intersection.first.template cast(), boundary_offset, intersection.second); + } + } + points.push_back(next_point); + } + + if (PREV_LAYER_BOUNDARY_OFFSET && ADD_INTERSECTIONS) { + std::vector new_points; + new_points.reserve(points.size()*2); + new_points.push_back(points.front()); + for (int point_idx = 0; point_idx < int(points.size()) - 1; ++point_idx) { + const ExtendedPoint &curr = points[point_idx]; + const ExtendedPoint &next = points[point_idx + 1]; + + if ((curr.distance > 0 && curr.distance < boundary_offset + 2.0f) || + (next.distance > 0 && next.distance < boundary_offset + 2.0f)) { + double line_len = (next.position - curr.position).norm(); + if (line_len > 4.0f) { + double a0 = std::clamp((curr.distance + 2 * boundary_offset) / line_len, 0.0, 1.0); + double a1 = std::clamp(1.0f - (next.distance + 2 * boundary_offset) / line_len, 0.0, 1.0); + double t0 = std::min(a0, a1); + double t1 = std::max(a0, a1); + + if (t0 < 1.0) { + auto p0 = curr.position + t0 * (next.position - curr.position); + auto [p0_dist, p0_near_l, p0_x] = unscaled_prev_layer.template distance_from_lines_extra(p0.cast()); + new_points.push_back(ExtendedPoint{p0, float(p0_dist + boundary_offset), p0_near_l}); + } + if (t1 > 0.0) { + auto p1 = curr.position + t1 * (next.position - curr.position); + auto [p1_dist, p1_near_l, p1_x] = unscaled_prev_layer.template distance_from_lines_extra(p1.cast()); + new_points.push_back(ExtendedPoint{p1, float(p1_dist + boundary_offset), p1_near_l}); + } + } + } + new_points.push_back(next); + } + points = new_points; + } + + if (max_line_length > 0) { + std::vector new_points; + new_points.reserve(points.size()*2); + { + for (size_t i = 0; i + 1 < points.size(); i++) { + const ExtendedPoint &curr = points[i]; + const ExtendedPoint &next = points[i + 1]; + new_points.push_back(curr); + double len = (next.position - curr.position).squaredNorm(); + double t = sqrt((max_line_length * max_line_length) / len); + size_t new_point_count = 1.0 / t; + for (size_t j = 1; j < new_point_count + 1; j++) { + Vec2d pos = curr.position * (1.0 - j * t) + next.position * (j * t); + auto [p_dist, p_near_l, + p_x] = unscaled_prev_layer.template distance_from_lines_extra(pos.cast()); + new_points.push_back(ExtendedPoint{pos, float(p_dist + boundary_offset), p_near_l}); + } + } + new_points.push_back(points.back()); + } + points = new_points; + } + + for (int point_idx = 0; point_idx < int(points.size()); ++point_idx) { + ExtendedPoint &a = points[point_idx]; + ExtendedPoint &prev = points[point_idx > 0 ? point_idx - 1 : point_idx]; + + int prev_point_idx = point_idx; + while (prev_point_idx > 0) { + prev_point_idx--; + if ((a.position - points[prev_point_idx].position).squaredNorm() > EPSILON) { break; } + } + + int next_point_index = point_idx; + while (next_point_index < int(points.size()) - 1) { + next_point_index++; + if ((a.position - points[next_point_index].position).squaredNorm() > EPSILON) { break; } + } + + if (prev_point_idx != point_idx && next_point_index != point_idx) { + float distance = (prev.position - a.position).norm(); + float alfa = angle(a.position - points[prev_point_idx].position, points[next_point_index].position - a.position); + cestim.add_point(distance, alfa); + } + + a.curvature = cestim.get_curvature(); + } + + return points; +} + +struct ProcessedPoint +{ + Point p; + float speed = 1.0f; + int fan_speed = 0; +}; + +class ExtrusionQualityEstimator +{ + std::unordered_map> prev_layer_boundaries; + std::unordered_map> next_layer_boundaries; + const PrintObject *current_object; + +public: + void set_current_object(const PrintObject *object) { current_object = object; } + + void prepare_for_new_layer(const Layer *layer) + { + if (layer == nullptr) return; + const PrintObject *object = layer->object(); + prev_layer_boundaries[object] = next_layer_boundaries[object]; + next_layer_boundaries[object] = AABBTreeLines::LinesDistancer{to_unscaled_linesf(layer->lslices)}; + } + + std::vector estimate_extrusion_quality(const ExtrusionPath &path, + const std::vector> overhangs_w_speeds, + const std::vector> overhangs_w_fan_speeds, + size_t extruder_id, + float ext_perimeter_speed, + float original_speed) + { + float speed_base = ext_perimeter_speed > 0 ? ext_perimeter_speed : original_speed; + std::map speed_sections; + for (size_t i = 0; i < overhangs_w_speeds.size(); i++) { + float distance = path.width * (1.0 - (overhangs_w_speeds[i].first / 100.0)); + float speed = overhangs_w_speeds[i].second.percent ? (speed_base * overhangs_w_speeds[i].second.value / 100.0) : + overhangs_w_speeds[i].second.value; + speed_sections[distance] = speed; + } + + std::map fan_speed_sections; + for (size_t i = 0; i < overhangs_w_fan_speeds.size(); i++) { + float distance = path.width * (1.0 - (overhangs_w_fan_speeds[i].first / 100.0)); + float fan_speed = overhangs_w_fan_speeds[i].second.get_at(extruder_id); + fan_speed_sections[distance] = fan_speed; + } + + std::vector extended_points = + estimate_points_properties(path.polyline.points, prev_layer_boundaries[current_object], path.width); + + std::vector processed_points; + processed_points.reserve(extended_points.size()); + for (size_t i = 0; i < extended_points.size(); i++) { + const ExtendedPoint &curr = extended_points[i]; + const ExtendedPoint &next = extended_points[i + 1 < extended_points.size() ? i + 1 : i]; + + auto interpolate_speed = [](const std::map &values, float distance) { + auto upper_dist = values.lower_bound(distance); + if (upper_dist == values.end()) { + return values.rbegin()->second; + } + if (upper_dist == values.begin()) { + return upper_dist->second; + } + + auto lower_dist = std::prev(upper_dist); + float t = (distance - lower_dist->first) / (upper_dist->first - lower_dist->first); + return (1.0f - t) * lower_dist->second + t * upper_dist->second; + }; + + float extrusion_speed = std::min(interpolate_speed(speed_sections, curr.distance), + interpolate_speed(speed_sections, next.distance)); + float fan_speed = std::min(interpolate_speed(fan_speed_sections, curr.distance), + interpolate_speed(fan_speed_sections, next.distance)); + + processed_points.push_back({scaled(curr.position), extrusion_speed, int(fan_speed)}); + } + return processed_points; + } +}; + +} // namespace Slic3r + +#endif // slic3r_ExtrusionProcessor_hpp_ diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index e67a686fea0..a56c1e13225 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -1,3441 +1,4398 @@ -#include "libslic3r/libslic3r.h" -#include "libslic3r/Utils.hpp" -#include "libslic3r/Print.hpp" -#include "libslic3r/LocalesUtils.hpp" -#include "libslic3r/format.hpp" -#include "GCodeProcessor.hpp" - -#include -#include -#include -#include -#include -#include - -#include -#include - -#if __has_include() - #include - #include -#endif - -#include - -static const float DEFAULT_TOOLPATH_WIDTH = 0.4f; -static const float DEFAULT_TOOLPATH_HEIGHT = 0.2f; - -static const float INCHES_TO_MM = 25.4f; -static const float MMMIN_TO_MMSEC = 1.0f / 60.0f; -static const float DEFAULT_ACCELERATION = 1500.0f; // Prusa Firmware 1_75mm_MK2 -static const float DEFAULT_RETRACT_ACCELERATION = 1500.0f; // Prusa Firmware 1_75mm_MK2 -static const float DEFAULT_TRAVEL_ACCELERATION = 1250.0f; - -static const size_t MIN_EXTRUDERS_COUNT = 5; -static const float DEFAULT_FILAMENT_DIAMETER = 1.75f; -static const float DEFAULT_FILAMENT_DENSITY = 1.245f; -static const Slic3r::Vec3f DEFAULT_EXTRUDER_OFFSET = Slic3r::Vec3f::Zero(); - -namespace Slic3r { - -const std::vector GCodeProcessor::Reserved_Tags = { - "TYPE:", - "WIPE_START", - "WIPE_END", - "HEIGHT:", - "WIDTH:", - "LAYER_CHANGE", - "COLOR_CHANGE", - "PAUSE_PRINT", - "CUSTOM_GCODE", - "_GP_FIRST_LINE_M73_PLACEHOLDER", - "_GP_LAST_LINE_M73_PLACEHOLDER", - "_GP_ESTIMATED_PRINTING_TIME_PLACEHOLDER" -}; - -const float GCodeProcessor::Wipe_Width = 0.05f; -const float GCodeProcessor::Wipe_Height = 0.05f; - -#if ENABLE_GCODE_VIEWER_DATA_CHECKING -const std::string GCodeProcessor::Mm3_Per_Mm_Tag = "MM3_PER_MM:"; -#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING - -static void set_option_value(ConfigOptionFloats& option, size_t id, float value) -{ - if (id < option.values.size()) - option.values[id] = static_cast(value); -}; - -static float get_option_value(const ConfigOptionFloats& option, size_t id) -{ - return option.values.empty() ? 0.0f : - ((id < option.values.size()) ? static_cast(option.values[id]) : static_cast(option.values.back())); -} - -static float estimated_acceleration_distance(float initial_rate, float target_rate, float acceleration) -{ - return (acceleration == 0.0f) ? 0.0f : (sqr(target_rate) - sqr(initial_rate)) / (2.0f * acceleration); -} - -static float intersection_distance(float initial_rate, float final_rate, float acceleration, float distance) -{ - return (acceleration == 0.0f) ? 0.0f : (2.0f * acceleration * distance - sqr(initial_rate) + sqr(final_rate)) / (4.0f * acceleration); -} - -static float speed_from_distance(float initial_feedrate, float distance, float acceleration) -{ - // to avoid invalid negative numbers due to numerical errors - float value = std::max(0.0f, sqr(initial_feedrate) + 2.0f * acceleration * distance); - return ::sqrt(value); -} - -// Calculates the maximum allowable speed at this point when you must be able to reach target_velocity using the -// acceleration within the allotted distance. -static float max_allowable_speed(float acceleration, float target_velocity, float distance) -{ - // to avoid invalid negative numbers due to numerical errors - float value = std::max(0.0f, sqr(target_velocity) - 2.0f * acceleration * distance); - return std::sqrt(value); -} - -static float acceleration_time_from_distance(float initial_feedrate, float distance, float acceleration) -{ - return (acceleration != 0.0f) ? (speed_from_distance(initial_feedrate, distance, acceleration) - initial_feedrate) / acceleration : 0.0f; -} - -void GCodeProcessor::CachedPosition::reset() -{ - std::fill(position.begin(), position.end(), FLT_MAX); - feedrate = FLT_MAX; -} - -void GCodeProcessor::CpColor::reset() -{ - counter = 0; - current = 0; -} - -float GCodeProcessor::Trapezoid::acceleration_time(float entry_feedrate, float acceleration) const -{ - return acceleration_time_from_distance(entry_feedrate, accelerate_until, acceleration); -} - -float GCodeProcessor::Trapezoid::cruise_time() const -{ - return (cruise_feedrate != 0.0f) ? cruise_distance() / cruise_feedrate : 0.0f; -} - -float GCodeProcessor::Trapezoid::deceleration_time(float distance, float acceleration) const -{ - return acceleration_time_from_distance(cruise_feedrate, (distance - decelerate_after), -acceleration); -} - -float GCodeProcessor::Trapezoid::cruise_distance() const -{ - return decelerate_after - accelerate_until; -} - -void GCodeProcessor::TimeBlock::calculate_trapezoid() -{ - trapezoid.cruise_feedrate = feedrate_profile.cruise; - - float accelerate_distance = std::max(0.0f, estimated_acceleration_distance(feedrate_profile.entry, feedrate_profile.cruise, acceleration)); - float decelerate_distance = std::max(0.0f, estimated_acceleration_distance(feedrate_profile.cruise, feedrate_profile.exit, -acceleration)); - float cruise_distance = distance - accelerate_distance - decelerate_distance; - - // Not enough space to reach the nominal feedrate. - // This means no cruising, and we'll have to use intersection_distance() to calculate when to abort acceleration - // and start braking in order to reach the exit_feedrate exactly at the end of this block. - if (cruise_distance < 0.0f) { - accelerate_distance = std::clamp(intersection_distance(feedrate_profile.entry, feedrate_profile.exit, acceleration, distance), 0.0f, distance); - cruise_distance = 0.0f; - trapezoid.cruise_feedrate = speed_from_distance(feedrate_profile.entry, accelerate_distance, acceleration); - } - - trapezoid.accelerate_until = accelerate_distance; - trapezoid.decelerate_after = accelerate_distance + cruise_distance; -} - -float GCodeProcessor::TimeBlock::time() const -{ - return trapezoid.acceleration_time(feedrate_profile.entry, acceleration) - + trapezoid.cruise_time() - + trapezoid.deceleration_time(distance, acceleration); -} - -void GCodeProcessor::TimeMachine::State::reset() -{ - feedrate = 0.0f; - safe_feedrate = 0.0f; - axis_feedrate = { 0.0f, 0.0f, 0.0f, 0.0f }; - abs_axis_feedrate = { 0.0f, 0.0f, 0.0f, 0.0f }; -} - -void GCodeProcessor::TimeMachine::CustomGCodeTime::reset() -{ - needed = false; - cache = 0.0f; - times = std::vector>(); -} - -void GCodeProcessor::TimeMachine::reset() -{ - enabled = false; - acceleration = 0.0f; - max_acceleration = 0.0f; - retract_acceleration = 0.0f; - max_retract_acceleration = 0.0f; - travel_acceleration = 0.0f; - max_travel_acceleration = 0.0f; - extrude_factor_override_percentage = 1.0f; - time = 0.0f; - stop_times = std::vector(); - curr.reset(); - prev.reset(); - gcode_time.reset(); - blocks = std::vector(); - g1_times_cache = std::vector(); - std::fill(moves_time.begin(), moves_time.end(), 0.0f); - std::fill(roles_time.begin(), roles_time.end(), 0.0f); - layers_time = std::vector(); -} - -void GCodeProcessor::TimeMachine::simulate_st_synchronize(float additional_time) -{ - if (!enabled) - return; - - calculate_time(0, additional_time); -} - -static void planner_forward_pass_kernel(GCodeProcessor::TimeBlock& prev, GCodeProcessor::TimeBlock& curr) -{ - // If the previous block is an acceleration block, but it is not long enough to complete the - // full speed change within the block, we need to adjust the entry speed accordingly. Entry - // speeds have already been reset, maximized, and reverse planned by reverse planner. - // If nominal length is true, max junction speed is guaranteed to be reached. No need to recheck. - if (!prev.flags.nominal_length) { - if (prev.feedrate_profile.entry < curr.feedrate_profile.entry) { - float entry_speed = std::min(curr.feedrate_profile.entry, max_allowable_speed(-prev.acceleration, prev.feedrate_profile.entry, prev.distance)); - - // Check for junction speed change - if (curr.feedrate_profile.entry != entry_speed) { - curr.feedrate_profile.entry = entry_speed; - curr.flags.recalculate = true; - } - } - } -} - -void planner_reverse_pass_kernel(GCodeProcessor::TimeBlock& curr, GCodeProcessor::TimeBlock& next) -{ - // If entry speed is already at the maximum entry speed, no need to recheck. Block is cruising. - // If not, block in state of acceleration or deceleration. Reset entry speed to maximum and - // check for maximum allowable speed reductions to ensure maximum possible planned speed. - if (curr.feedrate_profile.entry != curr.max_entry_speed) { - // If nominal length true, max junction speed is guaranteed to be reached. Only compute - // for max allowable speed if block is decelerating and nominal length is false. - if (!curr.flags.nominal_length && curr.max_entry_speed > next.feedrate_profile.entry) - curr.feedrate_profile.entry = std::min(curr.max_entry_speed, max_allowable_speed(-curr.acceleration, next.feedrate_profile.entry, curr.distance)); - else - curr.feedrate_profile.entry = curr.max_entry_speed; - - curr.flags.recalculate = true; - } -} - -static void recalculate_trapezoids(std::vector& blocks) -{ - GCodeProcessor::TimeBlock* curr = nullptr; - GCodeProcessor::TimeBlock* next = nullptr; - - for (size_t i = 0; i < blocks.size(); ++i) { - GCodeProcessor::TimeBlock& b = blocks[i]; - - curr = next; - next = &b; - - if (curr != nullptr) { - // Recalculate if current block entry or exit junction speed has changed. - if (curr->flags.recalculate || next->flags.recalculate) { - // NOTE: Entry and exit factors always > 0 by all previous logic operations. - GCodeProcessor::TimeBlock block = *curr; - block.feedrate_profile.exit = next->feedrate_profile.entry; - block.calculate_trapezoid(); - curr->trapezoid = block.trapezoid; - curr->flags.recalculate = false; // Reset current only to ensure next trapezoid is computed - } - } - } - - // Last/newest block in buffer. Always recalculated. - if (next != nullptr) { - GCodeProcessor::TimeBlock block = *next; - block.feedrate_profile.exit = next->safe_feedrate; - block.calculate_trapezoid(); - next->trapezoid = block.trapezoid; - next->flags.recalculate = false; - } -} - -void GCodeProcessor::TimeMachine::calculate_time(size_t keep_last_n_blocks, float additional_time) -{ - if (!enabled || blocks.size() < 2) - return; - - assert(keep_last_n_blocks <= blocks.size()); - - // forward_pass - for (size_t i = 0; i + 1 < blocks.size(); ++i) { - planner_forward_pass_kernel(blocks[i], blocks[i + 1]); - } - - // reverse_pass - for (int i = static_cast(blocks.size()) - 1; i > 0; --i) - planner_reverse_pass_kernel(blocks[i - 1], blocks[i]); - - recalculate_trapezoids(blocks); - - size_t n_blocks_process = blocks.size() - keep_last_n_blocks; - for (size_t i = 0; i < n_blocks_process; ++i) { - const TimeBlock& block = blocks[i]; - float block_time = block.time(); - if (i == 0) - block_time += additional_time; - - time += block_time; - gcode_time.cache += block_time; - moves_time[static_cast(block.move_type)] += block_time; - roles_time[static_cast(block.role)] += block_time; - if (block.layer_id >= layers_time.size()) { - const size_t curr_size = layers_time.size(); - layers_time.resize(block.layer_id); - for (size_t i = curr_size; i < layers_time.size(); ++i) { - layers_time[i] = 0.0f; - } - } - layers_time[block.layer_id - 1] += block_time; - g1_times_cache.push_back({ block.g1_line_id, time }); - // update times for remaining time to printer stop placeholders - auto it_stop_time = std::lower_bound(stop_times.begin(), stop_times.end(), block.g1_line_id, - [](const StopTime& t, unsigned int value) { return t.g1_line_id < value; }); - if (it_stop_time != stop_times.end() && it_stop_time->g1_line_id == block.g1_line_id) - it_stop_time->elapsed_time = time; - } - - if (keep_last_n_blocks) - blocks.erase(blocks.begin(), blocks.begin() + n_blocks_process); - else - blocks.clear(); -} - -void GCodeProcessor::TimeProcessor::reset() -{ - extruder_unloaded = true; - export_remaining_time_enabled = false; - machine_envelope_processing_enabled = false; - machine_limits = MachineEnvelopeConfig(); - filament_load_times = std::vector(); - filament_unload_times = std::vector(); - for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { - machines[i].reset(); - } - machines[static_cast(PrintEstimatedStatistics::ETimeMode::Normal)].enabled = true; -} - -void GCodeProcessor::TimeProcessor::post_process(const std::string& filename, std::vector& moves, std::vector& lines_ends) -{ - FilePtr in{ boost::nowide::fopen(filename.c_str(), "rb") }; - if (in.f == nullptr) - throw Slic3r::RuntimeError(std::string("Time estimator post process export failed.\nCannot open file for reading.\n")); - - // temporary file to contain modified gcode - std::string out_path = filename + ".postprocess"; - FilePtr out{ boost::nowide::fopen(out_path.c_str(), "wb") }; - if (out.f == nullptr) { - throw Slic3r::RuntimeError(std::string("Time estimator post process export failed.\nCannot open file for writing.\n")); - } - - auto time_in_minutes = [](float time_in_seconds) { - assert(time_in_seconds >= 0.f); - return int((time_in_seconds + 0.5f) / 60.0f); - }; - - auto time_in_last_minute = [](float time_in_seconds) { - assert(time_in_seconds <= 60.0f); - return time_in_seconds / 60.0f; - }; - - auto format_line_M73_main = [](const std::string& mask, int percent, int time) { - char line_M73[64]; - sprintf(line_M73, mask.c_str(), - std::to_string(percent).c_str(), - std::to_string(time).c_str()); - return std::string(line_M73); - }; - - auto format_line_M73_stop_int = [](const std::string& mask, int time) { - char line_M73[64]; - sprintf(line_M73, mask.c_str(), std::to_string(time).c_str()); - return std::string(line_M73); - }; - - auto format_time_float = [](float time) { - return Slic3r::float_to_string_decimal_point(time, 2); - }; - - auto format_line_M73_stop_float = [format_time_float](const std::string& mask, float time) { - char line_M73[64]; - sprintf(line_M73, mask.c_str(), format_time_float(time).c_str()); - return std::string(line_M73); - }; - - std::string gcode_line; - size_t g1_lines_counter = 0; - // keeps track of last exported pair - std::array, static_cast(PrintEstimatedStatistics::ETimeMode::Count)> last_exported_main; - for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { - last_exported_main[i] = { 0, time_in_minutes(machines[i].time) }; - } - - // keeps track of last exported remaining time to next printer stop - std::array(PrintEstimatedStatistics::ETimeMode::Count)> last_exported_stop; - for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { - last_exported_stop[i] = time_in_minutes(machines[i].time); - } - - // buffer line to export only when greater than 64K to reduce writing calls - std::string export_line; - - // replace placeholder lines with the proper final value - // gcode_line is in/out parameter, to reduce expensive memory allocation - auto process_placeholders = [&](std::string& gcode_line) { - unsigned int extra_lines_count = 0; - - // remove trailing '\n' - auto line = std::string_view(gcode_line).substr(0, gcode_line.length() - 1); - - std::string ret; - if (line.length() > 1) { - line = line.substr(1); - if (export_remaining_time_enabled && - (line == reserved_tag(ETags::First_Line_M73_Placeholder) || line == reserved_tag(ETags::Last_Line_M73_Placeholder))) { - for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { - const TimeMachine& machine = machines[i]; - if (machine.enabled) { - // export pair - ret += format_line_M73_main(machine.line_m73_main_mask.c_str(), - (line == reserved_tag(ETags::First_Line_M73_Placeholder)) ? 0 : 100, - (line == reserved_tag(ETags::First_Line_M73_Placeholder)) ? time_in_minutes(machine.time) : 0); - ++extra_lines_count; - - // export remaining time to next printer stop - if (line == reserved_tag(ETags::First_Line_M73_Placeholder) && !machine.stop_times.empty()) { - int to_export_stop = time_in_minutes(machine.stop_times.front().elapsed_time); - ret += format_line_M73_stop_int(machine.line_m73_stop_mask.c_str(), to_export_stop); - last_exported_stop[i] = to_export_stop; - ++extra_lines_count; - } - } - } - } - else if (line == reserved_tag(ETags::Estimated_Printing_Time_Placeholder)) { - for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { - const TimeMachine& machine = machines[i]; - PrintEstimatedStatistics::ETimeMode mode = static_cast(i); - if (mode == PrintEstimatedStatistics::ETimeMode::Normal || machine.enabled) { - char buf[128]; - sprintf(buf, "; estimated printing time (%s mode) = %s\n", - (mode == PrintEstimatedStatistics::ETimeMode::Normal) ? "normal" : "silent", - get_time_dhms(machine.time).c_str()); - ret += buf; - } - } - } - } - - if (! ret.empty()) - // Not moving the move operator on purpose, so that the gcode_line allocation will grow and it will not be reallocated after handful of lines are processed. - gcode_line = ret; - return std::tuple(!ret.empty(), (extra_lines_count == 0) ? extra_lines_count : extra_lines_count - 1); - }; - - // check for temporary lines - auto is_temporary_decoration = [](const std::string_view gcode_line) { - // remove trailing '\n' - assert(! gcode_line.empty()); - assert(gcode_line.back() == '\n'); - - // return true for decorations which are used in processing the gcode but that should not be exported into the final gcode - // i.e.: - // bool ret = gcode_line.substr(0, gcode_line.length() - 1) == ";" + Layer_Change_Tag; - // ... - // return ret; - return false; - }; - - // Iterators for the normal and silent cached time estimate entry recently processed, used by process_line_G1. - auto g1_times_cache_it = Slic3r::reserve_vector::const_iterator>(machines.size()); - for (const auto& machine : machines) - g1_times_cache_it.emplace_back(machine.g1_times_cache.begin()); - - // add lines M73 to exported gcode - auto process_line_G1 = [ - // Lambdas, mostly for string formatting, all with an empty capture block. - time_in_minutes, format_time_float, format_line_M73_main, format_line_M73_stop_int, format_line_M73_stop_float, time_in_last_minute, - &self = std::as_const(*this), - // Caches, to be modified - &g1_times_cache_it, &last_exported_main, &last_exported_stop, - // String output - &export_line] - (const size_t g1_lines_counter) { - unsigned int exported_lines_count = 0; - if (self.export_remaining_time_enabled) { - for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { - const TimeMachine& machine = self.machines[i]; - if (machine.enabled) { - // export pair - // Skip all machine.g1_times_cache below g1_lines_counter. - auto& it = g1_times_cache_it[i]; - while (it != machine.g1_times_cache.end() && it->id < g1_lines_counter) - ++it; - if (it != machine.g1_times_cache.end() && it->id == g1_lines_counter) { - std::pair to_export_main = { int(100.0f * it->elapsed_time / machine.time), - time_in_minutes(machine.time - it->elapsed_time) }; - if (last_exported_main[i] != to_export_main) { - export_line += format_line_M73_main(machine.line_m73_main_mask.c_str(), - to_export_main.first, to_export_main.second); - last_exported_main[i] = to_export_main; - ++exported_lines_count; - } - // export remaining time to next printer stop - auto it_stop = std::upper_bound(machine.stop_times.begin(), machine.stop_times.end(), it->elapsed_time, - [](float value, const TimeMachine::StopTime& t) { return value < t.elapsed_time; }); - if (it_stop != machine.stop_times.end()) { - int to_export_stop = time_in_minutes(it_stop->elapsed_time - it->elapsed_time); - if (last_exported_stop[i] != to_export_stop) { - if (to_export_stop > 0) { - if (last_exported_stop[i] != to_export_stop) { - export_line += format_line_M73_stop_int(machine.line_m73_stop_mask.c_str(), to_export_stop); - last_exported_stop[i] = to_export_stop; - ++exported_lines_count; - } - } - else { - bool is_last = false; - auto next_it = it + 1; - is_last |= (next_it == machine.g1_times_cache.end()); - - if (next_it != machine.g1_times_cache.end()) { - auto next_it_stop = std::upper_bound(machine.stop_times.begin(), machine.stop_times.end(), next_it->elapsed_time, - [](float value, const TimeMachine::StopTime& t) { return value < t.elapsed_time; }); - is_last |= (next_it_stop != it_stop); - - std::string time_float_str = format_time_float(time_in_last_minute(it_stop->elapsed_time - it->elapsed_time)); - std::string next_time_float_str = format_time_float(time_in_last_minute(it_stop->elapsed_time - next_it->elapsed_time)); - is_last |= (string_to_double_decimal_point(time_float_str) > 0. && string_to_double_decimal_point(next_time_float_str) == 0.); - } - - if (is_last) { - if (std::distance(machine.stop_times.begin(), it_stop) == static_cast(machine.stop_times.size() - 1)) - export_line += format_line_M73_stop_int(machine.line_m73_stop_mask.c_str(), to_export_stop); - else - export_line += format_line_M73_stop_float(machine.line_m73_stop_mask.c_str(), time_in_last_minute(it_stop->elapsed_time - it->elapsed_time)); - - last_exported_stop[i] = to_export_stop; - ++exported_lines_count; - } - } - } - } - } - } - } - } - return exported_lines_count; - }; - - // helper function to write to disk - size_t out_file_pos = 0; - lines_ends.clear(); - auto write_string = [&export_line, &out, &out_path, &out_file_pos, &lines_ends](const std::string& str) { - fwrite((const void*)export_line.c_str(), 1, export_line.length(), out.f); - if (ferror(out.f)) { - out.close(); - boost::nowide::remove(out_path.c_str()); - throw Slic3r::RuntimeError(std::string("Time estimator post process export failed.\nIs the disk full?\n")); - } - for (size_t i = 0; i < export_line.size(); ++ i) - if (export_line[i] == '\n') - lines_ends.emplace_back(out_file_pos + i + 1); - out_file_pos += export_line.size(); - export_line.clear(); - }; - - unsigned int line_id = 0; - std::vector> offsets; - - { - // Read the input stream 64kB at a time, extract lines and process them. - std::vector buffer(65536 * 10, 0); - // Line buffer. - assert(gcode_line.empty()); - for (;;) { - size_t cnt_read = ::fread(buffer.data(), 1, buffer.size(), in.f); - if (::ferror(in.f)) - throw Slic3r::RuntimeError(std::string("Time estimator post process export failed.\nError while reading from file.\n")); - bool eof = cnt_read == 0; - auto it = buffer.begin(); - auto it_bufend = buffer.begin() + cnt_read; - while (it != it_bufend || (eof && ! gcode_line.empty())) { - // Find end of line. - bool eol = false; - auto it_end = it; - for (; it_end != it_bufend && ! (eol = *it_end == '\r' || *it_end == '\n'); ++ it_end) ; - // End of line is indicated also if end of file was reached. - eol |= eof && it_end == it_bufend; - gcode_line.insert(gcode_line.end(), it, it_end); - if (eol) { - ++line_id; - - gcode_line += "\n"; - // replace placeholder lines - auto [processed, lines_added_count] = process_placeholders(gcode_line); - if (processed && lines_added_count > 0) - offsets.push_back({ line_id, lines_added_count }); - if (! processed && ! is_temporary_decoration(gcode_line) && GCodeReader::GCodeLine::cmd_is(gcode_line, "G1")) { - // remove temporary lines, add lines M73 where needed - unsigned int extra_lines_count = process_line_G1(g1_lines_counter ++); - if (extra_lines_count > 0) - offsets.push_back({ line_id, extra_lines_count }); - } - - export_line += gcode_line; - if (export_line.length() > 65535) - write_string(export_line); - gcode_line.clear(); - } - // Skip EOL. - it = it_end; - if (it != it_bufend && *it == '\r') - ++ it; - if (it != it_bufend && *it == '\n') - ++ it; - } - if (eof) - break; - } - } - - if (!export_line.empty()) - write_string(export_line); - - out.close(); - in.close(); - - // updates moves' gcode ids which have been modified by the insertion of the M73 lines - unsigned int curr_offset_id = 0; - unsigned int total_offset = 0; - for (GCodeProcessorResult::MoveVertex& move : moves) { - while (curr_offset_id < static_cast(offsets.size()) && offsets[curr_offset_id].first <= move.gcode_id) { - total_offset += offsets[curr_offset_id].second; - ++curr_offset_id; - } - move.gcode_id += total_offset; - } - - if (rename_file(out_path, filename)) - throw Slic3r::RuntimeError(std::string("Failed to rename the output G-code file from ") + out_path + " to " + filename + '\n' + - "Is " + out_path + " locked?" + '\n'); -} - -void GCodeProcessor::UsedFilaments::reset() -{ - color_change_cache = 0.0f; - volumes_per_color_change = std::vector(); - - tool_change_cache = 0.0f; - volumes_per_extruder.clear(); - - role_cache = 0.0f; - filaments_per_role.clear(); - - extruder_retracted_volume.clear(); -} - -void GCodeProcessor::UsedFilaments::increase_caches(double extruded_volume, unsigned char extruder_id, double parking_volume, double extra_loading_volume) -{ - if (extruder_id >= extruder_retracted_volume.size()) - extruder_retracted_volume.resize(extruder_id + 1, parking_volume); - - if (recent_toolchange) { - extruded_volume -= extra_loading_volume; - recent_toolchange = false; - } - - extruder_retracted_volume[extruder_id] -= extruded_volume; - - if (extruder_retracted_volume[extruder_id] < 0.) { - extruded_volume = - extruder_retracted_volume[extruder_id]; - extruder_retracted_volume[extruder_id] = 0.; - - color_change_cache += extruded_volume; - tool_change_cache += extruded_volume; - role_cache += extruded_volume; - } -} - -void GCodeProcessor::UsedFilaments::process_color_change_cache() -{ - if (color_change_cache != 0.0f) { - volumes_per_color_change.push_back(color_change_cache); - color_change_cache = 0.0f; - } -} - -void GCodeProcessor::UsedFilaments::process_extruder_cache(unsigned char extruder_id) -{ - if (tool_change_cache != 0.0) { - volumes_per_extruder[extruder_id] += tool_change_cache; - tool_change_cache = 0.0; - } - recent_toolchange = true; - } - -void GCodeProcessor::UsedFilaments::process_role_cache(const GCodeProcessor* processor) -{ - if (role_cache != 0.0f) { - std::pair filament = { 0.0f, 0.0f }; - - double s = PI * sqr(0.5 * processor->m_result.filament_diameters[processor->m_extruder_id]); - filament.first = role_cache / s * 0.001; - filament.second = role_cache * processor->m_result.filament_densities[processor->m_extruder_id] * 0.001; - - ExtrusionRole active_role = processor->m_extrusion_role; - if (filaments_per_role.find(active_role) != filaments_per_role.end()) { - filaments_per_role[active_role].first += filament.first; - filaments_per_role[active_role].second += filament.second; - } - else - filaments_per_role[active_role] = filament; - role_cache = 0.0f; - } -} - -void GCodeProcessor::UsedFilaments::process_caches(const GCodeProcessor* processor) -{ - process_color_change_cache(); - process_extruder_cache(processor->m_extruder_id); - process_role_cache(processor); -} - -#if ENABLE_GCODE_VIEWER_STATISTICS -void GCodeProcessorResult::reset() { - moves = std::vector(); - bed_shape = Pointfs(); - max_print_height = 0.0f; - settings_ids.reset(); - extruders_count = 0; - extruder_colors = std::vector(); - filament_diameters = std::vector(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_DIAMETER); - filament_densities = std::vector(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_DENSITY); - custom_gcode_per_print_z = std::vector(); -#if ENABLE_SPIRAL_VASE_LAYERS - spiral_vase_layers = std::vector>>(); -#endif // ENABLE_SPIRAL_VASE_LAYERS - time = 0; -} -#else -void GCodeProcessorResult::reset() { - - moves.clear(); - lines_ends.clear(); - bed_shape = Pointfs(); - max_print_height = 0.0f; - settings_ids.reset(); - extruders_count = 0; - extruder_colors = std::vector(); - filament_diameters = std::vector(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_DIAMETER); - filament_densities = std::vector(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_DENSITY); - custom_gcode_per_print_z = std::vector(); -#if ENABLE_SPIRAL_VASE_LAYERS - spiral_vase_layers = std::vector>>(); -#endif // ENABLE_SPIRAL_VASE_LAYERS -} -#endif // ENABLE_GCODE_VIEWER_STATISTICS - -const std::vector> GCodeProcessor::Producers = { - { EProducer::PrusaSlicer, "generated by PrusaSlicer" }, - { EProducer::Slic3rPE, "generated by Slic3r Prusa Edition" }, - { EProducer::Slic3r, "generated by Slic3r" }, - { EProducer::SuperSlicer, "generated by SuperSlicer" }, - { EProducer::Cura, "Cura_SteamEngine" }, - { EProducer::Simplify3D, "G-Code generated by Simplify3D(R)" }, - { EProducer::CraftWare, "CraftWare" }, - { EProducer::ideaMaker, "ideaMaker" }, - { EProducer::KissSlicer, "KISSlicer" } -}; - -unsigned int GCodeProcessor::s_result_id = 0; - -bool GCodeProcessor::contains_reserved_tag(const std::string& gcode, std::string& found_tag) -{ - bool ret = false; - - GCodeReader parser; - parser.parse_buffer(gcode, [&ret, &found_tag](GCodeReader& parser, const GCodeReader::GCodeLine& line) { - std::string comment = line.raw(); - if (comment.length() > 2 && comment.front() == ';') { - comment = comment.substr(1); - for (const std::string& s : Reserved_Tags) { - if (boost::starts_with(comment, s)) { - ret = true; - found_tag = comment; - parser.quit_parsing(); - return; - } - } - } - }); - - return ret; -} - -bool GCodeProcessor::contains_reserved_tags(const std::string& gcode, unsigned int max_count, std::vector& found_tag) -{ - max_count = std::max(max_count, 1U); - - bool ret = false; - - CNumericLocalesSetter locales_setter; - - GCodeReader parser; - parser.parse_buffer(gcode, [&ret, &found_tag, max_count](GCodeReader& parser, const GCodeReader::GCodeLine& line) { - std::string comment = line.raw(); - if (comment.length() > 2 && comment.front() == ';') { - comment = comment.substr(1); - for (const std::string& s : Reserved_Tags) { - if (boost::starts_with(comment, s)) { - ret = true; - found_tag.push_back(comment); - if (found_tag.size() == max_count) { - parser.quit_parsing(); - return; - } - } - } - } - }); - - return ret; -} - -GCodeProcessor::GCodeProcessor() -: m_options_z_corrector(m_result) -{ - reset(); - m_time_processor.machines[static_cast(PrintEstimatedStatistics::ETimeMode::Normal)].line_m73_main_mask = "M73 P%s R%s\n"; - m_time_processor.machines[static_cast(PrintEstimatedStatistics::ETimeMode::Normal)].line_m73_stop_mask = "M73 C%s\n"; - m_time_processor.machines[static_cast(PrintEstimatedStatistics::ETimeMode::Stealth)].line_m73_main_mask = "M73 Q%s S%s\n"; - m_time_processor.machines[static_cast(PrintEstimatedStatistics::ETimeMode::Stealth)].line_m73_stop_mask = "M73 D%s\n"; -} - -void GCodeProcessor::apply_config(const PrintConfig& config) -{ - m_parser.apply_config(config); - - m_flavor = config.gcode_flavor; - - size_t extruders_count = config.nozzle_diameter.values.size(); - m_result.extruders_count = extruders_count; - - m_extruder_offsets.resize(extruders_count); - m_extruder_colors.resize(extruders_count); - m_result.filament_diameters.resize(extruders_count); - m_result.filament_densities.resize(extruders_count); - m_extruder_temps.resize(extruders_count); - - for (size_t i = 0; i < extruders_count; ++ i) { - m_extruder_offsets[i] = to_3d(config.extruder_offset.get_at(i).cast().eval(), 0.f); - m_extruder_colors[i] = static_cast(i); - m_result.filament_diameters[i] = static_cast(config.filament_diameter.get_at(i)); - m_result.filament_densities[i] = static_cast(config.filament_density.get_at(i)); - } - - if ((m_flavor == gcfMarlinLegacy || m_flavor == gcfMarlinFirmware || m_flavor == gcfRepRapFirmware) && config.machine_limits_usage.value != MachineLimitsUsage::Ignore) { - m_time_processor.machine_limits = reinterpret_cast(config); - if (m_flavor == gcfMarlinLegacy) { - // Legacy Marlin does not have separate travel acceleration, it uses the 'extruding' value instead. - m_time_processor.machine_limits.machine_max_acceleration_travel = m_time_processor.machine_limits.machine_max_acceleration_extruding; - } - if (m_flavor == gcfRepRapFirmware) { - // RRF does not support setting min feedrates. Set them to zero. - m_time_processor.machine_limits.machine_min_travel_rate.values.assign(m_time_processor.machine_limits.machine_min_travel_rate.size(), 0.); - m_time_processor.machine_limits.machine_min_extruding_rate.values.assign(m_time_processor.machine_limits.machine_min_extruding_rate.size(), 0.); - } - } - - // Filament load / unload times are not specific to a firmware flavor. Let anybody use it if they find it useful. - // As of now the fields are shown at the UI dialog in the same combo box as the ramming values, so they - // are considered to be active for the single extruder multi-material printers only. - m_time_processor.filament_load_times.resize(config.filament_load_time.values.size()); - for (size_t i = 0; i < config.filament_load_time.values.size(); ++i) { - m_time_processor.filament_load_times[i] = static_cast(config.filament_load_time.values[i]); - } - m_time_processor.filament_unload_times.resize(config.filament_unload_time.values.size()); - for (size_t i = 0; i < config.filament_unload_time.values.size(); ++i) { - m_time_processor.filament_unload_times[i] = static_cast(config.filament_unload_time.values[i]); - } - - // With MM setups like Prusa MMU2, the filaments may be expected to be parked at the beginning. - // Remember the parking position so the initial load is not included in filament estimate. - if (config.single_extruder_multi_material && extruders_count > 1 && config.wipe_tower) { - m_parking_position = float(config.parking_pos_retraction.value); - m_extra_loading_move = float(config.extra_loading_move); - } - - for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { - float max_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_extruding, i); - m_time_processor.machines[i].max_acceleration = max_acceleration; - m_time_processor.machines[i].acceleration = (max_acceleration > 0.0f) ? max_acceleration : DEFAULT_ACCELERATION; - float max_retract_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_retracting, i); - m_time_processor.machines[i].max_retract_acceleration = max_retract_acceleration; - m_time_processor.machines[i].retract_acceleration = (max_retract_acceleration > 0.0f) ? max_retract_acceleration : DEFAULT_RETRACT_ACCELERATION; - float max_travel_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_travel, i); - m_time_processor.machines[i].max_travel_acceleration = max_travel_acceleration; - m_time_processor.machines[i].travel_acceleration = (max_travel_acceleration > 0.0f) ? max_travel_acceleration : DEFAULT_TRAVEL_ACCELERATION; - } - - m_time_processor.export_remaining_time_enabled = config.remaining_times.value; - m_use_volumetric_e = config.use_volumetric_e; - - const ConfigOptionFloatOrPercent* first_layer_height = config.option("first_layer_height"); - if (first_layer_height != nullptr) - m_first_layer_height = std::abs(first_layer_height->value); - - m_result.max_print_height = config.max_print_height; - -#if ENABLE_SPIRAL_VASE_LAYERS - const ConfigOptionBool* spiral_vase = config.option("spiral_vase"); - if (spiral_vase != nullptr) - m_spiral_vase_active = spiral_vase->value; -#endif // ENABLE_SPIRAL_VASE_LAYERS - -#if ENABLE_Z_OFFSET_CORRECTION - const ConfigOptionFloat* z_offset = config.option("z_offset"); - if (z_offset != nullptr) - m_z_offset = z_offset->value; -#endif // ENABLE_Z_OFFSET_CORRECTION -} - -void GCodeProcessor::apply_config(const DynamicPrintConfig& config) -{ - m_parser.apply_config(config); - - const ConfigOptionEnum* gcode_flavor = config.option>("gcode_flavor"); - if (gcode_flavor != nullptr) - m_flavor = gcode_flavor->value; - - const ConfigOptionPoints* bed_shape = config.option("bed_shape"); - if (bed_shape != nullptr) - m_result.bed_shape = bed_shape->values; - - const ConfigOptionString* print_settings_id = config.option("print_settings_id"); - if (print_settings_id != nullptr) - m_result.settings_ids.print = print_settings_id->value; - - const ConfigOptionStrings* filament_settings_id = config.option("filament_settings_id"); - if (filament_settings_id != nullptr) - m_result.settings_ids.filament = filament_settings_id->values; - - const ConfigOptionString* printer_settings_id = config.option("printer_settings_id"); - if (printer_settings_id != nullptr) - m_result.settings_ids.printer = printer_settings_id->value; - - m_result.extruders_count = config.option("nozzle_diameter")->values.size(); - - const ConfigOptionFloats* filament_diameters = config.option("filament_diameter"); - if (filament_diameters != nullptr) { - m_result.filament_diameters.clear(); - m_result.filament_diameters.resize(filament_diameters->values.size()); - for (size_t i = 0; i < filament_diameters->values.size(); ++i) { - m_result.filament_diameters[i] = static_cast(filament_diameters->values[i]); - } - } - - if (m_result.filament_diameters.size() < m_result.extruders_count) { - for (size_t i = m_result.filament_diameters.size(); i < m_result.extruders_count; ++i) { - m_result.filament_diameters.emplace_back(DEFAULT_FILAMENT_DIAMETER); - } - } - - const ConfigOptionFloats* filament_densities = config.option("filament_density"); - if (filament_densities != nullptr) { - m_result.filament_densities.clear(); - m_result.filament_densities.resize(filament_densities->values.size()); - for (size_t i = 0; i < filament_densities->values.size(); ++i) { - m_result.filament_densities[i] = static_cast(filament_densities->values[i]); - } - } - - if (m_result.filament_densities.size() < m_result.extruders_count) { - for (size_t i = m_result.filament_densities.size(); i < m_result.extruders_count; ++i) { - m_result.filament_densities.emplace_back(DEFAULT_FILAMENT_DENSITY); - } - } - - const ConfigOptionPoints* extruder_offset = config.option("extruder_offset"); - if (extruder_offset != nullptr) { - m_extruder_offsets.resize(extruder_offset->values.size()); - for (size_t i = 0; i < extruder_offset->values.size(); ++i) { - Vec2f offset = extruder_offset->values[i].cast(); - m_extruder_offsets[i] = { offset(0), offset(1), 0.0f }; - } - } - - if (m_extruder_offsets.size() < m_result.extruders_count) { - for (size_t i = m_extruder_offsets.size(); i < m_result.extruders_count; ++i) { - m_extruder_offsets.emplace_back(DEFAULT_EXTRUDER_OFFSET); - } - } - - const ConfigOptionStrings* extruder_colour = config.option("extruder_colour"); - if (extruder_colour != nullptr) { - // takes colors from config - m_result.extruder_colors = extruder_colour->values; - // try to replace missing values with filament colors - const ConfigOptionStrings* filament_colour = config.option("filament_colour"); - if (filament_colour != nullptr && filament_colour->values.size() == m_result.extruder_colors.size()) { - for (size_t i = 0; i < m_result.extruder_colors.size(); ++i) { - if (m_result.extruder_colors[i].empty()) - m_result.extruder_colors[i] = filament_colour->values[i]; - } - } - } - - if (m_result.extruder_colors.size() < m_result.extruders_count) { - for (size_t i = m_result.extruder_colors.size(); i < m_result.extruders_count; ++i) { - m_result.extruder_colors.emplace_back(std::string()); - } - } - - // replace missing values with default - for (size_t i = 0; i < m_result.extruder_colors.size(); ++i) { - if (m_result.extruder_colors[i].empty()) - m_result.extruder_colors[i] = "#FF8000"; - } - - m_extruder_colors.resize(m_result.extruder_colors.size()); - for (size_t i = 0; i < m_result.extruder_colors.size(); ++i) { - m_extruder_colors[i] = static_cast(i); - } - - m_extruder_temps.resize(m_result.extruders_count); - - const ConfigOptionFloats* filament_load_time = config.option("filament_load_time"); - if (filament_load_time != nullptr) { - m_time_processor.filament_load_times.resize(filament_load_time->values.size()); - for (size_t i = 0; i < filament_load_time->values.size(); ++i) { - m_time_processor.filament_load_times[i] = static_cast(filament_load_time->values[i]); - } - } - - const ConfigOptionFloats* filament_unload_time = config.option("filament_unload_time"); - if (filament_unload_time != nullptr) { - m_time_processor.filament_unload_times.resize(filament_unload_time->values.size()); - for (size_t i = 0; i < filament_unload_time->values.size(); ++i) { - m_time_processor.filament_unload_times[i] = static_cast(filament_unload_time->values[i]); - } - } - - bool use_machine_limits = false; - const ConfigOptionEnum* machine_limits_usage = config.option>("machine_limits_usage"); - if (machine_limits_usage != nullptr) - use_machine_limits = machine_limits_usage->value != MachineLimitsUsage::Ignore; - - if (use_machine_limits && (m_flavor == gcfMarlinLegacy || m_flavor == gcfMarlinFirmware || m_flavor == gcfRepRapFirmware)) { - const ConfigOptionFloats* machine_max_acceleration_x = config.option("machine_max_acceleration_x"); - if (machine_max_acceleration_x != nullptr) - m_time_processor.machine_limits.machine_max_acceleration_x.values = machine_max_acceleration_x->values; - - const ConfigOptionFloats* machine_max_acceleration_y = config.option("machine_max_acceleration_y"); - if (machine_max_acceleration_y != nullptr) - m_time_processor.machine_limits.machine_max_acceleration_y.values = machine_max_acceleration_y->values; - - const ConfigOptionFloats* machine_max_acceleration_z = config.option("machine_max_acceleration_z"); - if (machine_max_acceleration_z != nullptr) - m_time_processor.machine_limits.machine_max_acceleration_z.values = machine_max_acceleration_z->values; - - const ConfigOptionFloats* machine_max_acceleration_e = config.option("machine_max_acceleration_e"); - if (machine_max_acceleration_e != nullptr) - m_time_processor.machine_limits.machine_max_acceleration_e.values = machine_max_acceleration_e->values; - - const ConfigOptionFloats* machine_max_feedrate_x = config.option("machine_max_feedrate_x"); - if (machine_max_feedrate_x != nullptr) - m_time_processor.machine_limits.machine_max_feedrate_x.values = machine_max_feedrate_x->values; - - const ConfigOptionFloats* machine_max_feedrate_y = config.option("machine_max_feedrate_y"); - if (machine_max_feedrate_y != nullptr) - m_time_processor.machine_limits.machine_max_feedrate_y.values = machine_max_feedrate_y->values; - - const ConfigOptionFloats* machine_max_feedrate_z = config.option("machine_max_feedrate_z"); - if (machine_max_feedrate_z != nullptr) - m_time_processor.machine_limits.machine_max_feedrate_z.values = machine_max_feedrate_z->values; - - const ConfigOptionFloats* machine_max_feedrate_e = config.option("machine_max_feedrate_e"); - if (machine_max_feedrate_e != nullptr) - m_time_processor.machine_limits.machine_max_feedrate_e.values = machine_max_feedrate_e->values; - - const ConfigOptionFloats* machine_max_jerk_x = config.option("machine_max_jerk_x"); - if (machine_max_jerk_x != nullptr) - m_time_processor.machine_limits.machine_max_jerk_x.values = machine_max_jerk_x->values; - - const ConfigOptionFloats* machine_max_jerk_y = config.option("machine_max_jerk_y"); - if (machine_max_jerk_y != nullptr) - m_time_processor.machine_limits.machine_max_jerk_y.values = machine_max_jerk_y->values; - - const ConfigOptionFloats* machine_max_jerk_z = config.option("machine_max_jerkz"); - if (machine_max_jerk_z != nullptr) - m_time_processor.machine_limits.machine_max_jerk_z.values = machine_max_jerk_z->values; - - const ConfigOptionFloats* machine_max_jerk_e = config.option("machine_max_jerk_e"); - if (machine_max_jerk_e != nullptr) - m_time_processor.machine_limits.machine_max_jerk_e.values = machine_max_jerk_e->values; - - const ConfigOptionFloats* machine_max_acceleration_extruding = config.option("machine_max_acceleration_extruding"); - if (machine_max_acceleration_extruding != nullptr) - m_time_processor.machine_limits.machine_max_acceleration_extruding.values = machine_max_acceleration_extruding->values; - - const ConfigOptionFloats* machine_max_acceleration_retracting = config.option("machine_max_acceleration_retracting"); - if (machine_max_acceleration_retracting != nullptr) - m_time_processor.machine_limits.machine_max_acceleration_retracting.values = machine_max_acceleration_retracting->values; - - - // Legacy Marlin does not have separate travel acceleration, it uses the 'extruding' value instead. - const ConfigOptionFloats* machine_max_acceleration_travel = config.option(m_flavor == gcfMarlinLegacy - ? "machine_max_acceleration_extruding" - : "machine_max_acceleration_travel"); - if (machine_max_acceleration_travel != nullptr) - m_time_processor.machine_limits.machine_max_acceleration_travel.values = machine_max_acceleration_travel->values; - - - const ConfigOptionFloats* machine_min_extruding_rate = config.option("machine_min_extruding_rate"); - if (machine_min_extruding_rate != nullptr) { - m_time_processor.machine_limits.machine_min_extruding_rate.values = machine_min_extruding_rate->values; - if (m_flavor == gcfRepRapFirmware) { - // RRF does not support setting min feedrates. Set zero. - m_time_processor.machine_limits.machine_min_extruding_rate.values.assign(m_time_processor.machine_limits.machine_min_extruding_rate.size(), 0.); - } - } - - const ConfigOptionFloats* machine_min_travel_rate = config.option("machine_min_travel_rate"); - if (machine_min_travel_rate != nullptr) { - m_time_processor.machine_limits.machine_min_travel_rate.values = machine_min_travel_rate->values; - if (m_flavor == gcfRepRapFirmware) { - // RRF does not support setting min feedrates. Set zero. - m_time_processor.machine_limits.machine_min_travel_rate.values.assign(m_time_processor.machine_limits.machine_min_travel_rate.size(), 0.); - } - } - } - - for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { - float max_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_extruding, i); - m_time_processor.machines[i].max_acceleration = max_acceleration; - m_time_processor.machines[i].acceleration = (max_acceleration > 0.0f) ? max_acceleration : DEFAULT_ACCELERATION; - float max_retract_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_retracting, i); - m_time_processor.machines[i].max_retract_acceleration = max_retract_acceleration; - m_time_processor.machines[i].retract_acceleration = (max_retract_acceleration > 0.0f) ? max_retract_acceleration : DEFAULT_RETRACT_ACCELERATION; - float max_travel_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_travel, i); - m_time_processor.machines[i].max_travel_acceleration = max_travel_acceleration; - m_time_processor.machines[i].travel_acceleration = (max_travel_acceleration > 0.0f) ? max_travel_acceleration : DEFAULT_TRAVEL_ACCELERATION; - } - - if (m_flavor == gcfMarlinLegacy || m_flavor == gcfMarlinFirmware) { - const ConfigOptionBool* silent_mode = config.option("silent_mode"); - if (silent_mode != nullptr) { - if (silent_mode->value && m_time_processor.machine_limits.machine_max_acceleration_x.values.size() > 1) - enable_stealth_time_estimator(true); - } - } - - const ConfigOptionBool* use_volumetric_e = config.option("use_volumetric_e"); - if (use_volumetric_e != nullptr) - m_use_volumetric_e = use_volumetric_e->value; - - const ConfigOptionFloatOrPercent* first_layer_height = config.option("first_layer_height"); - if (first_layer_height != nullptr) - m_first_layer_height = std::abs(first_layer_height->value); - - const ConfigOptionFloat* max_print_height = config.option("max_print_height"); - if (max_print_height != nullptr) - m_result.max_print_height = max_print_height->value; - -#if ENABLE_SPIRAL_VASE_LAYERS - const ConfigOptionBool* spiral_vase = config.option("spiral_vase"); - if (spiral_vase != nullptr) - m_spiral_vase_active = spiral_vase->value; -#endif // ENABLE_SPIRAL_VASE_LAYERS - -#if ENABLE_Z_OFFSET_CORRECTION - const ConfigOptionFloat* z_offset = config.option("z_offset"); - if (z_offset != nullptr) - m_z_offset = z_offset->value; -#endif // ENABLE_Z_OFFSET_CORRECTION -} - -void GCodeProcessor::enable_stealth_time_estimator(bool enabled) -{ - m_time_processor.machines[static_cast(PrintEstimatedStatistics::ETimeMode::Stealth)].enabled = enabled; -} - -void GCodeProcessor::reset() -{ - m_units = EUnits::Millimeters; - m_global_positioning_type = EPositioningType::Absolute; - m_e_local_positioning_type = EPositioningType::Absolute; - m_extruder_offsets = std::vector(MIN_EXTRUDERS_COUNT, Vec3f::Zero()); - m_flavor = gcfRepRapSprinter; - - m_start_position = { 0.0f, 0.0f, 0.0f, 0.0f }; - m_end_position = { 0.0f, 0.0f, 0.0f, 0.0f }; - m_origin = { 0.0f, 0.0f, 0.0f, 0.0f }; - m_cached_position.reset(); - m_wiping = false; - - m_line_id = 0; - m_last_line_id = 0; - m_feedrate = 0.0f; - m_width = 0.0f; - m_height = 0.0f; - m_forced_width = 0.0f; - m_forced_height = 0.0f; - m_mm3_per_mm = 0.0f; - m_fan_speed = 0.0f; -#if ENABLE_Z_OFFSET_CORRECTION - m_z_offset = 0.0f; -#endif // ENABLE_Z_OFFSET_CORRECTION - - m_extrusion_role = erNone; - m_extruder_id = 0; - m_extruder_colors.resize(MIN_EXTRUDERS_COUNT); - for (size_t i = 0; i < MIN_EXTRUDERS_COUNT; ++i) { - m_extruder_colors[i] = static_cast(i); - } - m_extruder_temps.resize(MIN_EXTRUDERS_COUNT); - for (size_t i = 0; i < MIN_EXTRUDERS_COUNT; ++i) { - m_extruder_temps[i] = 0.0f; - } - - m_parking_position = 0.f; - m_extra_loading_move = 0.f; - m_extruded_last_z = 0.0f; - m_first_layer_height = 0.0f; - m_g1_line_id = 0; - m_layer_id = 0; - m_cp_color.reset(); - - m_producer = EProducer::Unknown; - - m_time_processor.reset(); - m_used_filaments.reset(); - - m_result.reset(); - m_result.id = ++s_result_id; - - m_use_volumetric_e = false; - m_last_default_color_id = 0; - - m_options_z_corrector.reset(); - -#if ENABLE_SPIRAL_VASE_LAYERS - m_spiral_vase_active = false; -#endif // ENABLE_SPIRAL_VASE_LAYERS - -#if ENABLE_GCODE_VIEWER_DATA_CHECKING - m_mm3_per_mm_compare.reset(); - m_height_compare.reset(); - m_width_compare.reset(); -#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING -} - -static inline const char* skip_whitespaces(const char *begin, const char *end) { - for (; begin != end && (*begin == ' ' || *begin == '\t'); ++ begin); - return begin; -} - -static inline const char* remove_eols(const char *begin, const char *end) { - for (; begin != end && (*(end - 1) == '\r' || *(end - 1) == '\n'); -- end); - return end; -} - -// Load a G-code into a stand-alone G-code viewer. -// throws CanceledException through print->throw_if_canceled() (sent by the caller as callback). -void GCodeProcessor::process_file(const std::string& filename, std::function cancel_callback) -{ - CNumericLocalesSetter locales_setter; - -#if ENABLE_GCODE_VIEWER_STATISTICS - m_start_time = std::chrono::high_resolution_clock::now(); -#endif // ENABLE_GCODE_VIEWER_STATISTICS - - // pre-processing - // parse the gcode file to detect its producer - { - m_parser.parse_file_raw(filename, [this](GCodeReader& reader, const char *begin, const char *end) { - begin = skip_whitespaces(begin, end); - if (begin != end && *begin == ';') { - // Comment. - begin = skip_whitespaces(++ begin, end); - end = remove_eols(begin, end); - if (begin != end && detect_producer(std::string_view(begin, end - begin))) - m_parser.quit_parsing(); - } - }); - m_parser.reset(); - - // if the gcode was produced by PrusaSlicer, - // extract the config from it - if (m_producer == EProducer::PrusaSlicer || m_producer == EProducer::Slic3rPE || m_producer == EProducer::Slic3r) { - DynamicPrintConfig config; - config.apply(FullPrintConfig::defaults()); - // Silently substitute unknown values by new ones for loading configurations from PrusaSlicer's own G-code. - // Showing substitution log or errors may make sense, but we are not really reading many values from the G-code config, - // thus a probability of incorrect substitution is low and the G-code viewer is a consumer-only anyways. - config.load_from_gcode_file(filename, ForwardCompatibilitySubstitutionRule::EnableSilent); - apply_config(config); - } - else if (m_producer == EProducer::Simplify3D) - apply_config_simplify3d(filename); - else if (m_producer == EProducer::SuperSlicer) - apply_config_superslicer(filename); - } - - // process gcode - m_result.filename = filename; - m_result.id = ++s_result_id; - // 1st move must be a dummy move - m_result.moves.emplace_back(GCodeProcessorResult::MoveVertex()); - size_t parse_line_callback_cntr = 10000; - m_parser.parse_file(filename, [this, cancel_callback, &parse_line_callback_cntr](GCodeReader& reader, const GCodeReader::GCodeLine& line) { - if (-- parse_line_callback_cntr == 0) { - // Don't call the cancel_callback() too often, do it every at every 10000'th line. - parse_line_callback_cntr = 10000; - if (cancel_callback) - cancel_callback(); - } - this->process_gcode_line(line, true); - }, m_result.lines_ends); - - // Don't post-process the G-code to update time stamps. - this->finalize(false); -} - -void GCodeProcessor::initialize(const std::string& filename) -{ - assert(is_decimal_separator_point()); - -#if ENABLE_GCODE_VIEWER_STATISTICS - m_start_time = std::chrono::high_resolution_clock::now(); -#endif // ENABLE_GCODE_VIEWER_STATISTICS - - // process gcode - m_result.filename = filename; - m_result.id = ++s_result_id; - // 1st move must be a dummy move - m_result.moves.emplace_back(GCodeProcessorResult::MoveVertex()); -} - -void GCodeProcessor::process_buffer(const std::string &buffer) -{ - //FIXME maybe cache GCodeLine gline to be over multiple parse_buffer() invocations. - m_parser.parse_buffer(buffer, [this](GCodeReader&, const GCodeReader::GCodeLine& line) { - this->process_gcode_line(line, false); - }); -} - -void GCodeProcessor::finalize(bool post_process) -{ - // update width/height of wipe moves - for (GCodeProcessorResult::MoveVertex& move : m_result.moves) { - if (move.type == EMoveType::Wipe) { - move.width = Wipe_Width; - move.height = Wipe_Height; - } - } - - // process the time blocks - for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { - TimeMachine& machine = m_time_processor.machines[i]; - TimeMachine::CustomGCodeTime& gcode_time = machine.gcode_time; - machine.calculate_time(); - if (gcode_time.needed && gcode_time.cache != 0.0f) - gcode_time.times.push_back({ CustomGCode::ColorChange, gcode_time.cache }); - } - - m_used_filaments.process_caches(this); - - update_estimated_times_stats(); - -#if ENABLE_GCODE_VIEWER_DATA_CHECKING - std::cout << "\n"; - m_mm3_per_mm_compare.output(); - m_height_compare.output(); - m_width_compare.output(); -#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING - - if (post_process) - m_time_processor.post_process(m_result.filename, m_result.moves, m_result.lines_ends); -#if ENABLE_GCODE_VIEWER_STATISTICS - m_result.time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - m_start_time).count(); -#endif // ENABLE_GCODE_VIEWER_STATISTICS -} - -float GCodeProcessor::get_time(PrintEstimatedStatistics::ETimeMode mode) const -{ - return (mode < PrintEstimatedStatistics::ETimeMode::Count) ? m_time_processor.machines[static_cast(mode)].time : 0.0f; -} - -std::string GCodeProcessor::get_time_dhm(PrintEstimatedStatistics::ETimeMode mode) const -{ - return (mode < PrintEstimatedStatistics::ETimeMode::Count) ? short_time(get_time_dhms(m_time_processor.machines[static_cast(mode)].time)) : std::string("N/A"); -} - -std::vector>> GCodeProcessor::get_custom_gcode_times(PrintEstimatedStatistics::ETimeMode mode, bool include_remaining) const -{ - std::vector>> ret; - if (mode < PrintEstimatedStatistics::ETimeMode::Count) { - const TimeMachine& machine = m_time_processor.machines[static_cast(mode)]; - float total_time = 0.0f; - for (const auto& [type, time] : machine.gcode_time.times) { - float remaining = include_remaining ? machine.time - total_time : 0.0f; - ret.push_back({ type, { time, remaining } }); - total_time += time; - } - } - return ret; -} - -std::vector> GCodeProcessor::get_moves_time(PrintEstimatedStatistics::ETimeMode mode) const -{ - std::vector> ret; - if (mode < PrintEstimatedStatistics::ETimeMode::Count) { - for (size_t i = 0; i < m_time_processor.machines[static_cast(mode)].moves_time.size(); ++i) { - float time = m_time_processor.machines[static_cast(mode)].moves_time[i]; - if (time > 0.0f) - ret.push_back({ static_cast(i), time }); - } - } - return ret; -} - -std::vector> GCodeProcessor::get_roles_time(PrintEstimatedStatistics::ETimeMode mode) const -{ - std::vector> ret; - if (mode < PrintEstimatedStatistics::ETimeMode::Count) { - for (size_t i = 0; i < m_time_processor.machines[static_cast(mode)].roles_time.size(); ++i) { - float time = m_time_processor.machines[static_cast(mode)].roles_time[i]; - if (time > 0.0f) - ret.push_back({ static_cast(i), time }); - } - } - return ret; -} - -ConfigSubstitutions load_from_superslicer_gcode_file(const std::string& filename, DynamicPrintConfig& config, ForwardCompatibilitySubstitutionRule compatibility_rule) -{ - // for reference, see: ConfigBase::load_from_gcode_file() - - boost::nowide::ifstream ifs(filename); - - auto header_end_pos = ifs.tellg(); - ConfigSubstitutionContext substitutions_ctxt(compatibility_rule); - size_t key_value_pairs = 0; - - ifs.seekg(0, ifs.end); - auto file_length = ifs.tellg(); - auto data_length = std::min(65535, file_length - header_end_pos); - ifs.seekg(file_length - data_length, ifs.beg); - std::vector data(size_t(data_length) + 1, 0); - ifs.read(data.data(), data_length); - ifs.close(); - key_value_pairs = ConfigBase::load_from_gcode_string_legacy(config, data.data(), substitutions_ctxt); - - if (key_value_pairs < 80) - throw Slic3r::RuntimeError(format("Suspiciously low number of configuration values extracted from %1%: %2%", filename, key_value_pairs)); - - return std::move(substitutions_ctxt.substitutions); -} - -void GCodeProcessor::apply_config_superslicer(const std::string& filename) -{ - DynamicPrintConfig config; - config.apply(FullPrintConfig::defaults()); - load_from_superslicer_gcode_file(filename, config, ForwardCompatibilitySubstitutionRule::EnableSilent); - apply_config(config); -} - -std::vector GCodeProcessor::get_layers_time(PrintEstimatedStatistics::ETimeMode mode) const -{ - return (mode < PrintEstimatedStatistics::ETimeMode::Count) ? - m_time_processor.machines[static_cast(mode)].layers_time : - std::vector(); -} - -void GCodeProcessor::apply_config_simplify3d(const std::string& filename) -{ - struct BedSize - { - double x{ 0.0 }; - double y{ 0.0 }; - - bool is_defined() const { return x > 0.0 && y > 0.0; } - }; - - BedSize bed_size; - bool producer_detected = false; - - m_parser.parse_file_raw(filename, [this, &bed_size, &producer_detected](GCodeReader& reader, const char* begin, const char* end) { - - auto extract_double = [](const std::string_view cmt, const std::string& key, double& out) { - size_t pos = cmt.find(key); - if (pos != cmt.npos) { - pos = cmt.find(',', pos); - if (pos != cmt.npos) { - out = string_to_double_decimal_point(cmt.substr(pos+1)); - return true; - } - } - return false; - }; - - auto extract_floats = [](const std::string_view cmt, const std::string& key, std::vector& out) { - size_t pos = cmt.find(key); - if (pos != cmt.npos) { - pos = cmt.find(',', pos); - if (pos != cmt.npos) { - const std::string_view data_str = cmt.substr(pos + 1); - std::vector values_str; - boost::split(values_str, data_str, boost::is_any_of("|,"), boost::token_compress_on); - for (const std::string& s : values_str) { - out.emplace_back(static_cast(string_to_double_decimal_point(s))); - } - return true; - } - } - return false; - }; - - begin = skip_whitespaces(begin, end); - end = remove_eols(begin, end); - if (begin != end) { - if (*begin == ';') { - // Comment. - begin = skip_whitespaces(++ begin, end); - if (begin != end) { - std::string_view comment(begin, end - begin); - if (producer_detected) { - if (bed_size.x == 0.0 && comment.find("strokeXoverride") != comment.npos) - extract_double(comment, "strokeXoverride", bed_size.x); - else if (bed_size.y == 0.0 && comment.find("strokeYoverride") != comment.npos) - extract_double(comment, "strokeYoverride", bed_size.y); - else if (comment.find("filamentDiameters") != comment.npos) { - m_result.filament_diameters.clear(); - extract_floats(comment, "filamentDiameters", m_result.filament_diameters); - } else if (comment.find("filamentDensities") != comment.npos) { - m_result.filament_densities.clear(); - extract_floats(comment, "filamentDensities", m_result.filament_densities); - } else if (comment.find("extruderDiameter") != comment.npos) { - std::vector extruder_diameters; - extract_floats(comment, "extruderDiameter", extruder_diameters); - m_result.extruders_count = extruder_diameters.size(); - } - } else if (boost::starts_with(comment, "G-Code generated by Simplify3D(R)")) - producer_detected = true; - } - } else { - // Some non-empty G-code line detected, stop parsing config comments. - reader.quit_parsing(); - } - } - }); - - if (m_result.extruders_count == 0) - m_result.extruders_count = std::max(1, std::min(m_result.filament_diameters.size(), m_result.filament_densities.size())); - - if (bed_size.is_defined()) { - m_result.bed_shape = { - { 0.0, 0.0 }, - { bed_size.x, 0.0 }, - { bed_size.x, bed_size.y }, - { 0.0, bed_size.y } - }; - } -} - -void GCodeProcessor::process_gcode_line(const GCodeReader::GCodeLine& line, bool producers_enabled) -{ -/* std::cout << line.raw() << std::endl; */ - - ++m_line_id; - - // update start position - m_start_position = m_end_position; - - const std::string_view cmd = line.cmd(); - if (cmd.length() > 1) { - // process command lines - switch (cmd[0]) - { - case 'g': - case 'G': - switch (cmd.size()) { - case 2: - switch (cmd[1]) { - case '0': { process_G0(line); break; } // Move - case '1': { process_G1(line); break; } // Move - default: break; - } - break; - case 3: - switch (cmd[1]) { - case '1': - switch (cmd[2]) { - case '0': { process_G10(line); break; } // Retract - case '1': { process_G11(line); break; } // Unretract - default: break; - } - break; - case '2': - switch (cmd[2]) { - case '0': { process_G20(line); break; } // Set Units to Inches - case '1': { process_G21(line); break; } // Set Units to Millimeters - case '2': { process_G22(line); break; } // Firmware controlled retract - case '3': { process_G23(line); break; } // Firmware controlled unretract - case '8': { process_G28(line); break; } // Move to origin - default: break; - } - break; - case '9': - switch (cmd[2]) { - case '0': { process_G90(line); break; } // Set to Absolute Positioning - case '1': { process_G91(line); break; } // Set to Relative Positioning - case '2': { process_G92(line); break; } // Set Position - default: break; - } - break; - } - break; - default: - break; - } - break; - case 'm': - case 'M': - switch (cmd.size()) { - case 2: - switch (cmd[1]) { - case '1': { process_M1(line); break; } // Sleep or Conditional stop - default: break; - } - break; - case 3: - switch (cmd[1]) { - case '8': - switch (cmd[2]) { - case '2': { process_M82(line); break; } // Set extruder to absolute mode - case '3': { process_M83(line); break; } // Set extruder to relative mode - default: break; - } - break; - default: - break; - } - break; - case 4: - switch (cmd[1]) { - case '1': - switch (cmd[2]) { - case '0': - switch (cmd[3]) { - case '4': { process_M104(line); break; } // Set extruder temperature - case '6': { process_M106(line); break; } // Set fan speed - case '7': { process_M107(line); break; } // Disable fan - case '8': { process_M108(line); break; } // Set tool (Sailfish) - case '9': { process_M109(line); break; } // Set extruder temperature and wait - default: break; - } - break; - case '3': - switch (cmd[3]) { - case '2': { process_M132(line); break; } // Recall stored home offsets - case '5': { process_M135(line); break; } // Set tool (MakerWare) - default: break; - } - break; - default: - break; - } - break; - case '2': - switch (cmd[2]) { - case '0': - switch (cmd[3]) { - case '1': { process_M201(line); break; } // Set max printing acceleration - case '3': { process_M203(line); break; } // Set maximum feedrate - case '4': { process_M204(line); break; } // Set default acceleration - case '5': { process_M205(line); break; } // Advanced settings - default: break; - } - break; - case '2': - switch (cmd[3]) { - case '1': { process_M221(line); break; } // Set extrude factor override percentage - default: break; - } - break; - default: - break; - } - break; - case '4': - switch (cmd[2]) { - case '0': - switch (cmd[3]) { - case '1': { process_M401(line); break; } // Repetier: Store x, y and z position - case '2': { process_M402(line); break; } // Repetier: Go to stored position - default: break; - } - break; - default: - break; - } - break; - case '5': - switch (cmd[2]) { - case '6': - switch (cmd[3]) { - case '6': { process_M566(line); break; } // Set allowable instantaneous speed change - default: break; - } - break; - default: - break; - } - break; - case '7': - switch (cmd[2]) { - case '0': - switch (cmd[3]) { - case '2': { process_M702(line); break; } // Unload the current filament into the MK3 MMU2 unit at the end of print. - default: break; - } - break; - default: - break; - } - break; - default: - break; - } - break; - default: - break; - } - break; - case 't': - case 'T': - process_T(line); // Select Tool - break; - default: - break; - } - } - else { - const std::string &comment = line.raw(); - if (comment.length() > 2 && comment.front() == ';') - // Process tags embedded into comments. Tag comments always start at the start of a line - // with a comment and continue with a tag without any whitespace separator. - process_tags(comment.substr(1), producers_enabled); - } -} - -#if __has_include() - template - struct is_from_chars_convertible : std::false_type {}; - template - struct is_from_chars_convertible(), std::declval(), std::declval()))>> : std::true_type {}; -#endif - -// Returns true if the number was parsed correctly into out and the number spanned the whole input string. -template -[[nodiscard]] static inline bool parse_number(const std::string_view sv, T &out) -{ - // https://www.bfilipek.com/2019/07/detect-overload-from-chars.html#example-stdfromchars -#if __has_include() - // Visual Studio 19 supports from_chars all right. - // OSX compiler that we use only implements std::from_chars just for ints. - // GCC that we compile on does not provide at all. - if constexpr (is_from_chars_convertible::value) { - auto str_end = sv.data() + sv.size(); - auto [end_ptr, error_code] = std::from_chars(sv.data(), str_end, out); - return error_code == std::errc() && end_ptr == str_end; - } - else -#endif - { - // Legacy conversion, which is costly due to having to make a copy of the string before conversion. - try { - assert(sv.size() < 1024); - assert(sv.data() != nullptr); - std::string str { sv }; - size_t read = 0; - if constexpr (std::is_same_v) - out = std::stoi(str, &read); - else if constexpr (std::is_same_v) - out = std::stol(str, &read); - else if constexpr (std::is_same_v) - out = string_to_double_decimal_point(str, &read); - else if constexpr (std::is_same_v) - out = string_to_double_decimal_point(str, &read); - return str.size() == read; - } catch (...) { - return false; - } - } -} - -void GCodeProcessor::process_tags(const std::string_view comment, bool producers_enabled) -{ - // producers tags - if (producers_enabled && process_producers_tags(comment)) - return; - - // extrusion role tag - if (boost::starts_with(comment, reserved_tag(ETags::Role))) { - set_extrusion_role(ExtrusionEntity::string_to_role(comment.substr(reserved_tag(ETags::Role).length()))); - if (m_extrusion_role == erExternalPerimeter) - m_seams_detector.activate(true); - return; - } - - // wipe start tag - if (boost::starts_with(comment, reserved_tag(ETags::Wipe_Start))) { - m_wiping = true; - return; - } - - // wipe end tag - if (boost::starts_with(comment, reserved_tag(ETags::Wipe_End))) { - m_wiping = false; - return; - } - - if (!producers_enabled || m_producer == EProducer::PrusaSlicer) { - // height tag - if (boost::starts_with(comment, reserved_tag(ETags::Height))) { - if (!parse_number(comment.substr(reserved_tag(ETags::Height).size()), m_forced_height)) - BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ")."; - return; - } - // width tag - if (boost::starts_with(comment, reserved_tag(ETags::Width))) { - if (!parse_number(comment.substr(reserved_tag(ETags::Width).size()), m_forced_width)) - BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Width (" << comment << ")."; - return; - } - } - - // color change tag - if (boost::starts_with(comment, reserved_tag(ETags::Color_Change))) { - unsigned char extruder_id = 0; - static std::vector Default_Colors = { - "#0B2C7A", // { 0.043f, 0.173f, 0.478f }, // bluish - "#1C8891", // { 0.110f, 0.533f, 0.569f }, - "#AAF200", // { 0.667f, 0.949f, 0.000f }, - "#F5CE0A", // { 0.961f, 0.808f, 0.039f }, - "#D16830", // { 0.820f, 0.408f, 0.188f }, - "#942616", // { 0.581f, 0.149f, 0.087f } // reddish - }; - - std::string color = Default_Colors[0]; - auto is_valid_color = [](const std::string& color) { - auto is_hex_digit = [](char c) { - return ((c >= '0' && c <= '9') || - (c >= 'A' && c <= 'F') || - (c >= 'a' && c <= 'f')); - }; - - if (color[0] != '#' || color.length() != 7) - return false; - for (int i = 1; i <= 6; ++i) { - if (!is_hex_digit(color[i])) - return false; - } - return true; - }; - - std::vector tokens; - boost::split(tokens, comment, boost::is_any_of(","), boost::token_compress_on); - if (tokens.size() > 1) { - if (tokens[1][0] == 'T') { - int eid; - if (!parse_number(tokens[1].substr(1), eid) || eid < 0 || eid > 255) { - BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Color_Change (" << comment << ")."; - return; - } - extruder_id = static_cast(eid); - } - } - if (tokens.size() > 2) { - if (is_valid_color(tokens[2])) - color = tokens[2]; - } - else { - color = Default_Colors[m_last_default_color_id]; - ++m_last_default_color_id; - if (m_last_default_color_id == Default_Colors.size()) - m_last_default_color_id = 0; - } - - if (extruder_id < m_extruder_colors.size()) - m_extruder_colors[extruder_id] = static_cast(m_extruder_offsets.size()) + m_cp_color.counter; // color_change position in list of color for preview - ++m_cp_color.counter; - if (m_cp_color.counter == UCHAR_MAX) - m_cp_color.counter = 0; - - if (m_extruder_id == extruder_id) { - m_cp_color.current = m_extruder_colors[extruder_id]; - store_move_vertex(EMoveType::Color_change); - CustomGCode::Item item = { static_cast(m_end_position[2]), CustomGCode::ColorChange, extruder_id + 1, color, "" }; - m_result.custom_gcode_per_print_z.emplace_back(item); - m_options_z_corrector.set(); - process_custom_gcode_time(CustomGCode::ColorChange); - process_filaments(CustomGCode::ColorChange); - } - - return; - } - - // pause print tag - if (comment == reserved_tag(ETags::Pause_Print)) { - store_move_vertex(EMoveType::Pause_Print); - CustomGCode::Item item = { static_cast(m_end_position[2]), CustomGCode::PausePrint, m_extruder_id + 1, "", "" }; - m_result.custom_gcode_per_print_z.emplace_back(item); - m_options_z_corrector.set(); - process_custom_gcode_time(CustomGCode::PausePrint); - return; - } - - // custom code tag - if (comment == reserved_tag(ETags::Custom_Code)) { - store_move_vertex(EMoveType::Custom_GCode); - CustomGCode::Item item = { static_cast(m_end_position[2]), CustomGCode::Custom, m_extruder_id + 1, "", "" }; - m_result.custom_gcode_per_print_z.emplace_back(item); - m_options_z_corrector.set(); - return; - } - - // layer change tag - if (comment == reserved_tag(ETags::Layer_Change)) { - ++m_layer_id; -#if ENABLE_SPIRAL_VASE_LAYERS - if (m_spiral_vase_active) { - if (m_result.moves.empty()) - m_result.spiral_vase_layers.push_back({ m_first_layer_height, { 0, 0 } }); - else { - const size_t move_id = m_result.moves.size() - 1; - if (!m_result.spiral_vase_layers.empty() && m_end_position[Z] == m_result.spiral_vase_layers.back().first) - m_result.spiral_vase_layers.back().second.second = move_id; - else - m_result.spiral_vase_layers.push_back({ static_cast(m_end_position[Z]), { move_id, move_id } }); - } - } -#endif // ENABLE_SPIRAL_VASE_LAYERS - return; - } - -#if ENABLE_GCODE_VIEWER_DATA_CHECKING - // mm3_per_mm print tag - if (boost::starts_with(comment, Mm3_Per_Mm_Tag)) { - if (! parse_number(comment.substr(Mm3_Per_Mm_Tag.size()), m_mm3_per_mm_compare.last_tag_value)) - BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Mm3_Per_Mm (" << comment << ")."; - return; - } -#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING -} - -bool GCodeProcessor::process_producers_tags(const std::string_view comment) -{ - switch (m_producer) - { - case EProducer::Slic3rPE: - case EProducer::Slic3r: - case EProducer::SuperSlicer: - case EProducer::PrusaSlicer: { return process_prusaslicer_tags(comment); } - case EProducer::Cura: { return process_cura_tags(comment); } - case EProducer::Simplify3D: { return process_simplify3d_tags(comment); } - case EProducer::CraftWare: { return process_craftware_tags(comment); } - case EProducer::ideaMaker: { return process_ideamaker_tags(comment); } - case EProducer::KissSlicer: { return process_kissslicer_tags(comment); } - default: { return false; } - } -} - -bool GCodeProcessor::process_prusaslicer_tags(const std::string_view comment) -{ - return false; -} - -bool GCodeProcessor::process_cura_tags(const std::string_view comment) -{ - // TYPE -> extrusion role - std::string tag = "TYPE:"; - size_t pos = comment.find(tag); - if (pos != comment.npos) { - const std::string_view type = comment.substr(pos + tag.length()); - if (type == "SKIRT") - set_extrusion_role(erSkirt); - else if (type == "WALL-OUTER") - set_extrusion_role(erExternalPerimeter); - else if (type == "WALL-INNER") - set_extrusion_role(erPerimeter); - else if (type == "SKIN") - set_extrusion_role(erSolidInfill); - else if (type == "FILL") - set_extrusion_role(erInternalInfill); - else if (type == "SUPPORT") - set_extrusion_role(erSupportMaterial); - else if (type == "SUPPORT-INTERFACE") - set_extrusion_role(erSupportMaterialInterface); - else if (type == "PRIME-TOWER") - set_extrusion_role(erWipeTower); - else { - set_extrusion_role(erNone); - BOOST_LOG_TRIVIAL(warning) << "GCodeProcessor found unknown extrusion role: " << type; - } - - if (m_extrusion_role == erExternalPerimeter) - m_seams_detector.activate(true); - - return true; - } - - // flavor - tag = "FLAVOR:"; - pos = comment.find(tag); - if (pos != comment.npos) { - const std::string_view flavor = comment.substr(pos + tag.length()); - if (flavor == "BFB") - m_flavor = gcfMarlinLegacy; // is this correct ? - else if (flavor == "Mach3") - m_flavor = gcfMach3; - else if (flavor == "Makerbot") - m_flavor = gcfMakerWare; - else if (flavor == "UltiGCode") - m_flavor = gcfMarlinLegacy; // is this correct ? - else if (flavor == "Marlin(Volumetric)") - m_flavor = gcfMarlinLegacy; // is this correct ? - else if (flavor == "Griffin") - m_flavor = gcfMarlinLegacy; // is this correct ? - else if (flavor == "Repetier") - m_flavor = gcfRepetier; - else if (flavor == "RepRap") - m_flavor = gcfRepRapFirmware; - else if (flavor == "Marlin") - m_flavor = gcfMarlinLegacy; - else - BOOST_LOG_TRIVIAL(warning) << "GCodeProcessor found unknown flavor: " << flavor; - - return true; - } - - // layer - tag = "LAYER:"; - pos = comment.find(tag); - if (pos != comment.npos) { - ++m_layer_id; - return true; - } - - return false; -} - -bool GCodeProcessor::process_simplify3d_tags(const std::string_view comment) -{ - // extrusion roles - - // in older versions the comments did not contain the key 'feature' - std::string_view cmt = comment; - size_t pos = cmt.find(" feature"); - if (pos == 0) - cmt.remove_prefix(8); - - // ; skirt - pos = cmt.find(" skirt"); - if (pos == 0) { - set_extrusion_role(erSkirt); - return true; - } - - // ; outer perimeter - pos = cmt.find(" outer perimeter"); - if (pos == 0) { - set_extrusion_role(erExternalPerimeter); - m_seams_detector.activate(true); - return true; - } - - // ; inner perimeter - pos = cmt.find(" inner perimeter"); - if (pos == 0) { - set_extrusion_role(erPerimeter); - return true; - } - - // ; gap fill - pos = cmt.find(" gap fill"); - if (pos == 0) { - set_extrusion_role(erGapFill); - return true; - } - - // ; infill - pos = cmt.find(" infill"); - if (pos == 0) { - set_extrusion_role(erInternalInfill); - return true; - } - - // ; solid layer - pos = cmt.find(" solid layer"); - if (pos == 0) { - set_extrusion_role(erSolidInfill); - return true; - } - - // ; bridge - pos = cmt.find(" bridge"); - if (pos == 0) { - set_extrusion_role(erBridgeInfill); - return true; - } - - // ; support - pos = cmt.find(" support"); - if (pos == 0) { - set_extrusion_role(erSupportMaterial); - return true; - } - - // ; dense support - pos = cmt.find(" dense support"); - if (pos == 0) { - set_extrusion_role(erSupportMaterialInterface); - return true; - } - - // ; prime pillar - pos = cmt.find(" prime pillar"); - if (pos == 0) { - set_extrusion_role(erWipeTower); - return true; - } - - // ; ooze shield - pos = cmt.find(" ooze shield"); - if (pos == 0) { - set_extrusion_role(erNone); // Missing mapping - return true; - } - - // ; raft - pos = cmt.find(" raft"); - if (pos == 0) { - set_extrusion_role(erSupportMaterial); - return true; - } - - // ; internal single extrusion - pos = cmt.find(" internal single extrusion"); - if (pos == 0) { - set_extrusion_role(erNone); // Missing mapping - return true; - } - - // geometry - // ; tool - std::string tag = " tool"; - pos = cmt.find(tag); - if (pos == 0) { - const std::string_view data = cmt.substr(pos + tag.length()); - std::string h_tag = "H"; - size_t h_start = data.find(h_tag); - size_t h_end = data.find_first_of(' ', h_start); - std::string w_tag = "W"; - size_t w_start = data.find(w_tag); - size_t w_end = data.find_first_of(' ', w_start); - if (h_start != data.npos) { - if (!parse_number(data.substr(h_start + 1, (h_end != data.npos) ? h_end - h_start - 1 : h_end), m_forced_height)) - BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ")."; - } - if (w_start != data.npos) { - if (!parse_number(data.substr(w_start + 1, (w_end != data.npos) ? w_end - w_start - 1 : w_end), m_forced_width)) - BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Width (" << comment << ")."; - } - - return true; - } - - // ; layer - tag = " layer"; - pos = cmt.find(tag); - if (pos == 0) { - // skip lines "; layer end" - const std::string_view data = cmt.substr(pos + tag.length()); - size_t end_start = data.find("end"); - if (end_start == data.npos) - ++m_layer_id; - - return true; - } - - return false; -} - -bool GCodeProcessor::process_craftware_tags(const std::string_view comment) -{ - // segType -> extrusion role - std::string tag = "segType:"; - size_t pos = comment.find(tag); - if (pos != comment.npos) { - const std::string_view type = comment.substr(pos + tag.length()); - if (type == "Skirt") - set_extrusion_role(erSkirt); - else if (type == "Perimeter") - set_extrusion_role(erExternalPerimeter); - else if (type == "HShell") - set_extrusion_role(erNone); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - else if (type == "InnerHair") - set_extrusion_role(erNone); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - else if (type == "Loop") - set_extrusion_role(erNone); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - else if (type == "Infill") - set_extrusion_role(erInternalInfill); - else if (type == "Raft") - set_extrusion_role(erSkirt); - else if (type == "Support") - set_extrusion_role(erSupportMaterial); - else if (type == "SupportTouch") - set_extrusion_role(erSupportMaterial); - else if (type == "SoftSupport") - set_extrusion_role(erSupportMaterialInterface); - else if (type == "Pillar") - set_extrusion_role(erWipeTower); - else { - set_extrusion_role(erNone); - BOOST_LOG_TRIVIAL(warning) << "GCodeProcessor found unknown extrusion role: " << type; - } - - if (m_extrusion_role == erExternalPerimeter) - m_seams_detector.activate(true); - - return true; - } - - // layer - pos = comment.find(" Layer #"); - if (pos == 0) { - ++m_layer_id; - return true; - } - - return false; -} - -bool GCodeProcessor::process_ideamaker_tags(const std::string_view comment) -{ - // TYPE -> extrusion role - std::string tag = "TYPE:"; - size_t pos = comment.find(tag); - if (pos != comment.npos) { - const std::string_view type = comment.substr(pos + tag.length()); - if (type == "RAFT") - set_extrusion_role(erSkirt); - else if (type == "WALL-OUTER") - set_extrusion_role(erExternalPerimeter); - else if (type == "WALL-INNER") - set_extrusion_role(erPerimeter); - else if (type == "SOLID-FILL") - set_extrusion_role(erSolidInfill); - else if (type == "FILL") - set_extrusion_role(erInternalInfill); - else if (type == "BRIDGE") - set_extrusion_role(erBridgeInfill); - else if (type == "SUPPORT") - set_extrusion_role(erSupportMaterial); - else { - set_extrusion_role(erNone); - BOOST_LOG_TRIVIAL(warning) << "GCodeProcessor found unknown extrusion role: " << type; - } - - if (m_extrusion_role == erExternalPerimeter) - m_seams_detector.activate(true); - - return true; - } - - // geometry - // width - tag = "WIDTH:"; - pos = comment.find(tag); - if (pos != comment.npos) { - if (!parse_number(comment.substr(pos + tag.length()), m_forced_width)) - BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Width (" << comment << ")."; - return true; - } - - // height - tag = "HEIGHT:"; - pos = comment.find(tag); - if (pos != comment.npos) { - if (!parse_number(comment.substr(pos + tag.length()), m_forced_height)) - BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ")."; - return true; - } - - // layer - pos = comment.find("LAYER:"); - if (pos == 0) { - ++m_layer_id; - return true; - } - - return false; -} - -bool GCodeProcessor::process_kissslicer_tags(const std::string_view comment) -{ - // extrusion roles - - // ; 'Raft Path' - size_t pos = comment.find(" 'Raft Path'"); - if (pos == 0) { - set_extrusion_role(erSkirt); - return true; - } - - // ; 'Support Interface Path' - pos = comment.find(" 'Support Interface Path'"); - if (pos == 0) { - set_extrusion_role(erSupportMaterialInterface); - return true; - } - - // ; 'Travel/Ironing Path' - pos = comment.find(" 'Travel/Ironing Path'"); - if (pos == 0) { - set_extrusion_role(erIroning); - return true; - } - - // ; 'Support (may Stack) Path' - pos = comment.find(" 'Support (may Stack) Path'"); - if (pos == 0) { - set_extrusion_role(erSupportMaterial); - return true; - } - - // ; 'Perimeter Path' - pos = comment.find(" 'Perimeter Path'"); - if (pos == 0) { - set_extrusion_role(erExternalPerimeter); - m_seams_detector.activate(true); - return true; - } - - // ; 'Pillar Path' - pos = comment.find(" 'Pillar Path'"); - if (pos == 0) { - set_extrusion_role(erNone); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - return true; - } - - // ; 'Destring/Wipe/Jump Path' - pos = comment.find(" 'Destring/Wipe/Jump Path'"); - if (pos == 0) { - set_extrusion_role(erNone); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - return true; - } - - // ; 'Prime Pillar Path' - pos = comment.find(" 'Prime Pillar Path'"); - if (pos == 0) { - set_extrusion_role(erNone); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - return true; - } - - // ; 'Loop Path' - pos = comment.find(" 'Loop Path'"); - if (pos == 0) { - set_extrusion_role(erNone); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - return true; - } - - // ; 'Crown Path' - pos = comment.find(" 'Crown Path'"); - if (pos == 0) { - set_extrusion_role(erNone); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - return true; - } - - // ; 'Solid Path' - pos = comment.find(" 'Solid Path'"); - if (pos == 0) { - set_extrusion_role(erNone); - return true; - } - - // ; 'Stacked Sparse Infill Path' - pos = comment.find(" 'Stacked Sparse Infill Path'"); - if (pos == 0) { - set_extrusion_role(erInternalInfill); - return true; - } - - // ; 'Sparse Infill Path' - pos = comment.find(" 'Sparse Infill Path'"); - if (pos == 0) { - set_extrusion_role(erSolidInfill); - return true; - } - - // geometry - - // layer - pos = comment.find(" BEGIN_LAYER_"); - if (pos == 0) { - ++m_layer_id; - return true; - } - - return false; -} - -bool GCodeProcessor::detect_producer(const std::string_view comment) -{ - for (const auto& [id, search_string] : Producers) { - size_t pos = comment.find(search_string); - if (pos != comment.npos) { - m_producer = id; - BOOST_LOG_TRIVIAL(info) << "Detected gcode producer: " << search_string; - return true; - } - } - return false; -} - -void GCodeProcessor::process_G0(const GCodeReader::GCodeLine& line) -{ - process_G1(line); -} - -void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) -{ - float filament_diameter = (static_cast(m_extruder_id) < m_result.filament_diameters.size()) ? m_result.filament_diameters[m_extruder_id] : m_result.filament_diameters.back(); - float filament_radius = 0.5f * filament_diameter; - float area_filament_cross_section = static_cast(M_PI) * sqr(filament_radius); - auto absolute_position = [this, area_filament_cross_section](Axis axis, const GCodeReader::GCodeLine& lineG1) { - bool is_relative = (m_global_positioning_type == EPositioningType::Relative); - if (axis == E) - is_relative |= (m_e_local_positioning_type == EPositioningType::Relative); - - if (lineG1.has(Slic3r::Axis(axis))) { - float lengthsScaleFactor = (m_units == EUnits::Inches) ? INCHES_TO_MM : 1.0f; - float ret = lineG1.value(Slic3r::Axis(axis)) * lengthsScaleFactor; - if (axis == E && m_use_volumetric_e) - ret /= area_filament_cross_section; - return is_relative ? m_start_position[axis] + ret : m_origin[axis] + ret; - } - else - return m_start_position[axis]; - }; - - auto move_type = [this](const AxisCoords& delta_pos) { - EMoveType type = EMoveType::Noop; - - if (m_wiping) - type = EMoveType::Wipe; - else if (delta_pos[E] < 0.0f) - type = (delta_pos[X] != 0.0f || delta_pos[Y] != 0.0f || delta_pos[Z] != 0.0f) ? EMoveType::Travel : EMoveType::Retract; - else if (delta_pos[E] > 0.0f) { - if (delta_pos[X] == 0.0f && delta_pos[Y] == 0.0f) - type = (delta_pos[Z] == 0.0f) ? EMoveType::Unretract : EMoveType::Travel; - else if (delta_pos[X] != 0.0f || delta_pos[Y] != 0.0f) - type = EMoveType::Extrude; - } - else if (delta_pos[X] != 0.0f || delta_pos[Y] != 0.0f || delta_pos[Z] != 0.0f) - type = EMoveType::Travel; - - return type; - }; - - ++m_g1_line_id; - - // enable processing of lines M201/M203/M204/M205 - m_time_processor.machine_envelope_processing_enabled = true; - - // updates axes positions from line - for (unsigned char a = X; a <= E; ++a) { - m_end_position[a] = absolute_position((Axis)a, line); - } - - // updates feedrate from line, if present - if (line.has_f()) - m_feedrate = line.f() * MMMIN_TO_MMSEC; - - // calculates movement deltas - AxisCoords delta_pos; - for (unsigned char a = X; a <= E; ++a) - delta_pos[a] = m_end_position[a] - m_start_position[a]; - - if (std::all_of(delta_pos.begin(), delta_pos.end(), [](double d) { return d == 0.; })) - return; - - const float volume_extruded_filament = area_filament_cross_section * delta_pos[E]; - - if (volume_extruded_filament != 0.) - m_used_filaments.increase_caches(volume_extruded_filament, - this->m_extruder_id, area_filament_cross_section * this->m_parking_position, - area_filament_cross_section * this->m_extra_loading_move); - - EMoveType type = move_type(delta_pos); - if (type == EMoveType::Extrude) { - float delta_xyz = std::sqrt(sqr(delta_pos[X]) + sqr(delta_pos[Y]) + sqr(delta_pos[Z])); - float area_toolpath_cross_section = volume_extruded_filament / delta_xyz; - - // volume extruded filament / tool displacement = area toolpath cross section - m_mm3_per_mm = area_toolpath_cross_section; -#if ENABLE_GCODE_VIEWER_DATA_CHECKING - m_mm3_per_mm_compare.update(area_toolpath_cross_section, m_extrusion_role); -#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING - - if (m_forced_height > 0.0f) - m_height = m_forced_height; - else if (m_layer_id == 0) - m_height = (m_end_position[Z] <= double(m_first_layer_height)) ? m_end_position[Z] : m_first_layer_height; - else { - if (m_end_position[Z] > m_extruded_last_z + EPSILON) - m_height = m_end_position[Z] - m_extruded_last_z; - } - - if (m_height == 0.0f) - m_height = DEFAULT_TOOLPATH_HEIGHT; - - if (m_end_position[Z] == 0.0f) - m_end_position[Z] = m_height; - - m_extruded_last_z = m_end_position[Z]; - m_options_z_corrector.update(m_height); - -#if ENABLE_GCODE_VIEWER_DATA_CHECKING - m_height_compare.update(m_height, m_extrusion_role); -#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING - - if (m_forced_width > 0.0f) - m_width = m_forced_width; - else if (m_extrusion_role == erExternalPerimeter) - // cross section: rectangle - m_width = delta_pos[E] * static_cast(M_PI * sqr(1.05f * filament_radius)) / (delta_xyz * m_height); - else if (m_extrusion_role == erBridgeInfill || m_extrusion_role == erNone) - // cross section: circle - m_width = static_cast(m_result.filament_diameters[m_extruder_id]) * std::sqrt(delta_pos[E] / delta_xyz); - else - // cross section: rectangle + 2 semicircles - m_width = delta_pos[E] * static_cast(M_PI * sqr(filament_radius)) / (delta_xyz * m_height) + static_cast(1.0 - 0.25 * M_PI) * m_height; - - if (m_width == 0.0f) - m_width = DEFAULT_TOOLPATH_WIDTH; - - // clamp width to avoid artifacts which may arise from wrong values of m_height - m_width = std::min(m_width, std::max(2.0f, 4.0f * m_height)); - -#if ENABLE_GCODE_VIEWER_DATA_CHECKING - m_width_compare.update(m_width, m_extrusion_role); -#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING - } - - // time estimate section - auto move_length = [](const AxisCoords& delta_pos) { - float sq_xyz_length = sqr(delta_pos[X]) + sqr(delta_pos[Y]) + sqr(delta_pos[Z]); - return (sq_xyz_length > 0.0f) ? std::sqrt(sq_xyz_length) : std::abs(delta_pos[E]); - }; - - auto is_extrusion_only_move = [](const AxisCoords& delta_pos) { - return delta_pos[X] == 0.0f && delta_pos[Y] == 0.0f && delta_pos[Z] == 0.0f && delta_pos[E] != 0.0f; - }; - - float distance = move_length(delta_pos); - assert(distance != 0.0f); - float inv_distance = 1.0f / distance; - - for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { - TimeMachine& machine = m_time_processor.machines[i]; - if (!machine.enabled) - continue; - - TimeMachine::State& curr = machine.curr; - TimeMachine::State& prev = machine.prev; - std::vector& blocks = machine.blocks; - - curr.feedrate = (delta_pos[E] == 0.0f) ? - minimum_travel_feedrate(static_cast(i), m_feedrate) : - minimum_feedrate(static_cast(i), m_feedrate); - - TimeBlock block; - block.move_type = type; - block.role = m_extrusion_role; - block.distance = distance; - block.g1_line_id = m_g1_line_id; - block.layer_id = std::max(1, m_layer_id); - - // calculates block cruise feedrate - float min_feedrate_factor = 1.0f; - for (unsigned char a = X; a <= E; ++a) { - curr.axis_feedrate[a] = curr.feedrate * delta_pos[a] * inv_distance; - if (a == E) - curr.axis_feedrate[a] *= machine.extrude_factor_override_percentage; - - curr.abs_axis_feedrate[a] = std::abs(curr.axis_feedrate[a]); - if (curr.abs_axis_feedrate[a] != 0.0f) { - float axis_max_feedrate = get_axis_max_feedrate(static_cast(i), static_cast(a)); - if (axis_max_feedrate != 0.0f) - min_feedrate_factor = std::min(min_feedrate_factor, axis_max_feedrate / curr.abs_axis_feedrate[a]); - } - } - - block.feedrate_profile.cruise = min_feedrate_factor * curr.feedrate; - - if (min_feedrate_factor < 1.0f) { - for (unsigned char a = X; a <= E; ++a) { - curr.axis_feedrate[a] *= min_feedrate_factor; - curr.abs_axis_feedrate[a] *= min_feedrate_factor; - } - } - - // calculates block acceleration - float acceleration = - (type == EMoveType::Travel) ? get_travel_acceleration(static_cast(i)) : - (is_extrusion_only_move(delta_pos) ? - get_retract_acceleration(static_cast(i)) : - get_acceleration(static_cast(i))); - - for (unsigned char a = X; a <= E; ++a) { - float axis_max_acceleration = get_axis_max_acceleration(static_cast(i), static_cast(a)); - if (acceleration * std::abs(delta_pos[a]) * inv_distance > axis_max_acceleration) - acceleration = axis_max_acceleration; - } - - block.acceleration = acceleration; - - // calculates block exit feedrate - curr.safe_feedrate = block.feedrate_profile.cruise; - - for (unsigned char a = X; a <= E; ++a) { - float axis_max_jerk = get_axis_max_jerk(static_cast(i), static_cast(a)); - if (curr.abs_axis_feedrate[a] > axis_max_jerk) - curr.safe_feedrate = std::min(curr.safe_feedrate, axis_max_jerk); - } - - block.feedrate_profile.exit = curr.safe_feedrate; - - static const float PREVIOUS_FEEDRATE_THRESHOLD = 0.0001f; - - // calculates block entry feedrate - float vmax_junction = curr.safe_feedrate; - if (!blocks.empty() && prev.feedrate > PREVIOUS_FEEDRATE_THRESHOLD) { - bool prev_speed_larger = prev.feedrate > block.feedrate_profile.cruise; - float smaller_speed_factor = prev_speed_larger ? (block.feedrate_profile.cruise / prev.feedrate) : (prev.feedrate / block.feedrate_profile.cruise); - // Pick the smaller of the nominal speeds. Higher speed shall not be achieved at the junction during coasting. - vmax_junction = prev_speed_larger ? block.feedrate_profile.cruise : prev.feedrate; - - float v_factor = 1.0f; - bool limited = false; - - for (unsigned char a = X; a <= E; ++a) { - // Limit an axis. We have to differentiate coasting from the reversal of an axis movement, or a full stop. - float v_exit = prev.axis_feedrate[a]; - float v_entry = curr.axis_feedrate[a]; - - if (prev_speed_larger) - v_exit *= smaller_speed_factor; - - if (limited) { - v_exit *= v_factor; - v_entry *= v_factor; - } - - // Calculate the jerk depending on whether the axis is coasting in the same direction or reversing a direction. - float jerk = - (v_exit > v_entry) ? - ((v_entry > 0.0f || v_exit < 0.0f) ? - // coasting - (v_exit - v_entry) : - // axis reversal - std::max(v_exit, -v_entry)) : - // v_exit <= v_entry - ((v_entry < 0.0f || v_exit > 0.0f) ? - // coasting - (v_entry - v_exit) : - // axis reversal - std::max(-v_exit, v_entry)); - - float axis_max_jerk = get_axis_max_jerk(static_cast(i), static_cast(a)); - if (jerk > axis_max_jerk) { - v_factor *= axis_max_jerk / jerk; - limited = true; - } - } - - if (limited) - vmax_junction *= v_factor; - - // Now the transition velocity is known, which maximizes the shared exit / entry velocity while - // respecting the jerk factors, it may be possible, that applying separate safe exit / entry velocities will achieve faster prints. - float vmax_junction_threshold = vmax_junction * 0.99f; - - // Not coasting. The machine will stop and start the movements anyway, better to start the segment from start. - if (prev.safe_feedrate > vmax_junction_threshold && curr.safe_feedrate > vmax_junction_threshold) - vmax_junction = curr.safe_feedrate; - } - - float v_allowable = max_allowable_speed(-acceleration, curr.safe_feedrate, block.distance); - block.feedrate_profile.entry = std::min(vmax_junction, v_allowable); - - block.max_entry_speed = vmax_junction; - block.flags.nominal_length = (block.feedrate_profile.cruise <= v_allowable); - block.flags.recalculate = true; - block.safe_feedrate = curr.safe_feedrate; - - // calculates block trapezoid - block.calculate_trapezoid(); - - // updates previous - prev = curr; - - blocks.push_back(block); - - if (blocks.size() > TimeProcessor::Planner::refresh_threshold) - machine.calculate_time(TimeProcessor::Planner::queue_size); - } - - if (m_seams_detector.is_active()) { - // check for seam starting vertex - if (type == EMoveType::Extrude && m_extrusion_role == erExternalPerimeter && !m_seams_detector.has_first_vertex()) - m_seams_detector.set_first_vertex(m_result.moves.back().position - m_extruder_offsets[m_extruder_id]); - // check for seam ending vertex and store the resulting move - else if ((type != EMoveType::Extrude || (m_extrusion_role != erExternalPerimeter && m_extrusion_role != erOverhangPerimeter)) && m_seams_detector.has_first_vertex()) { - auto set_end_position = [this](const Vec3f& pos) { - m_end_position[X] = pos.x(); m_end_position[Y] = pos.y(); m_end_position[Z] = pos.z(); - }; - - const Vec3f curr_pos(m_end_position[X], m_end_position[Y], m_end_position[Z]); - const Vec3f new_pos = m_result.moves.back().position - m_extruder_offsets[m_extruder_id]; - const std::optional first_vertex = m_seams_detector.get_first_vertex(); - // the threshold value = 0.0625f == 0.25 * 0.25 is arbitrary, we may find some smarter condition later - - if ((new_pos - *first_vertex).squaredNorm() < 0.0625f) { -#if ENABLE_Z_OFFSET_CORRECTION - set_end_position(0.5f * (new_pos + *first_vertex) + m_z_offset * Vec3f::UnitZ()); -#else - set_end_position(0.5f * (new_pos + *first_vertex)); -#endif // ENABLE_Z_OFFSET_CORRECTION - store_move_vertex(EMoveType::Seam); - set_end_position(curr_pos); - } - - m_seams_detector.activate(false); - } - } - else if (type == EMoveType::Extrude && m_extrusion_role == erExternalPerimeter) { - m_seams_detector.activate(true); - m_seams_detector.set_first_vertex(m_result.moves.back().position - m_extruder_offsets[m_extruder_id]); - } - -#if ENABLE_SPIRAL_VASE_LAYERS - if (m_spiral_vase_active && !m_result.spiral_vase_layers.empty() && !m_result.moves.empty()) - m_result.spiral_vase_layers.back().second.second = m_result.moves.size() - 1; -#endif // ENABLE_SPIRAL_VASE_LAYERS - - // store move - store_move_vertex(type); -} - -void GCodeProcessor::process_G10(const GCodeReader::GCodeLine& line) -{ - // stores retract move - store_move_vertex(EMoveType::Retract); -} - -void GCodeProcessor::process_G11(const GCodeReader::GCodeLine& line) -{ - // stores unretract move - store_move_vertex(EMoveType::Unretract); -} - -void GCodeProcessor::process_G20(const GCodeReader::GCodeLine& line) -{ - m_units = EUnits::Inches; -} - -void GCodeProcessor::process_G21(const GCodeReader::GCodeLine& line) -{ - m_units = EUnits::Millimeters; -} - -void GCodeProcessor::process_G22(const GCodeReader::GCodeLine& line) -{ - // stores retract move - store_move_vertex(EMoveType::Retract); -} - -void GCodeProcessor::process_G23(const GCodeReader::GCodeLine& line) -{ - // stores unretract move - store_move_vertex(EMoveType::Unretract); -} - -void GCodeProcessor::process_G28(const GCodeReader::GCodeLine& line) -{ - std::string_view cmd = line.cmd(); - std::string new_line_raw = { cmd.data(), cmd.size() }; - bool found = false; - if (line.has('X')) { - new_line_raw += " X0"; - found = true; - } - if (line.has('Y')) { - new_line_raw += " Y0"; - found = true; - } - if (line.has('Z')) { - new_line_raw += " Z0"; - found = true; - } - if (!found) - new_line_raw += " X0 Y0 Z0"; - - GCodeReader::GCodeLine new_gline; - GCodeReader reader; - reader.parse_line(new_line_raw, [&](GCodeReader& reader, const GCodeReader::GCodeLine& gline) { new_gline = gline; }); - process_G1(new_gline); -} - -void GCodeProcessor::process_G90(const GCodeReader::GCodeLine& line) -{ - m_global_positioning_type = EPositioningType::Absolute; -} - -void GCodeProcessor::process_G91(const GCodeReader::GCodeLine& line) -{ - m_global_positioning_type = EPositioningType::Relative; -} - -void GCodeProcessor::process_G92(const GCodeReader::GCodeLine& line) -{ - float lengths_scale_factor = (m_units == EUnits::Inches) ? INCHES_TO_MM : 1.0f; - bool any_found = false; - - if (line.has_x()) { - m_origin[X] = m_end_position[X] - line.x() * lengths_scale_factor; - any_found = true; - } - - if (line.has_y()) { - m_origin[Y] = m_end_position[Y] - line.y() * lengths_scale_factor; - any_found = true; - } - - if (line.has_z()) { - m_origin[Z] = m_end_position[Z] - line.z() * lengths_scale_factor; - any_found = true; - } - - if (line.has_e()) { - // extruder coordinate can grow to the point where its float representation does not allow for proper addition with small increments, - // we set the value taken from the G92 line as the new current position for it - m_end_position[E] = line.e() * lengths_scale_factor; - any_found = true; - } - else - simulate_st_synchronize(); - - if (!any_found && !line.has_unknown_axis()) { - // The G92 may be called for axes that PrusaSlicer does not recognize, for example see GH issue #3510, - // where G92 A0 B0 is called although the extruder axis is till E. - for (unsigned char a = X; a <= E; ++a) { - m_origin[a] = m_end_position[a]; - } - } -} - -void GCodeProcessor::process_M1(const GCodeReader::GCodeLine& line) -{ - simulate_st_synchronize(); -} - -void GCodeProcessor::process_M82(const GCodeReader::GCodeLine& line) -{ - m_e_local_positioning_type = EPositioningType::Absolute; -} - -void GCodeProcessor::process_M83(const GCodeReader::GCodeLine& line) -{ - m_e_local_positioning_type = EPositioningType::Relative; -} - -void GCodeProcessor::process_M104(const GCodeReader::GCodeLine& line) -{ - float new_temp; - if (line.has_value('S', new_temp)) - m_extruder_temps[m_extruder_id] = new_temp; -} - -void GCodeProcessor::process_M106(const GCodeReader::GCodeLine& line) -{ - if (!line.has('P')) { - // The absence of P means the print cooling fan, so ignore anything else. - float new_fan_speed; - if (line.has_value('S', new_fan_speed)) - m_fan_speed = (100.0f / 255.0f) * new_fan_speed; - else - m_fan_speed = 100.0f; - } -} - -void GCodeProcessor::process_M107(const GCodeReader::GCodeLine& line) -{ - m_fan_speed = 0.0f; -} - -void GCodeProcessor::process_M108(const GCodeReader::GCodeLine& line) -{ - // These M-codes are used by Sailfish to change active tool. - // They have to be processed otherwise toolchanges will be unrecognised - // by the analyzer - see https://github.com/prusa3d/PrusaSlicer/issues/2566 - - if (m_flavor != gcfSailfish) - return; - - std::string cmd = line.raw(); - size_t pos = cmd.find("T"); - if (pos != std::string::npos) - process_T(cmd.substr(pos)); -} - -void GCodeProcessor::process_M109(const GCodeReader::GCodeLine& line) -{ - float new_temp; - if (line.has_value('R', new_temp)) { - float val; - if (line.has_value('T', val)) { - size_t eid = static_cast(val); - if (eid < m_extruder_temps.size()) - m_extruder_temps[eid] = new_temp; - } - else - m_extruder_temps[m_extruder_id] = new_temp; - } - else if (line.has_value('S', new_temp)) - m_extruder_temps[m_extruder_id] = new_temp; -} - -void GCodeProcessor::process_M132(const GCodeReader::GCodeLine& line) -{ - // This command is used by Makerbot to load the current home position from EEPROM - // see: https://github.com/makerbot/s3g/blob/master/doc/GCodeProtocol.md - // Using this command to reset the axis origin to zero helps in fixing: https://github.com/prusa3d/PrusaSlicer/issues/3082 - - if (line.has('X')) - m_origin[X] = 0.0f; - - if (line.has('Y')) - m_origin[Y] = 0.0f; - - if (line.has('Z')) - m_origin[Z] = 0.0f; - - if (line.has('E')) - m_origin[E] = 0.0f; -} - -void GCodeProcessor::process_M135(const GCodeReader::GCodeLine& line) -{ - // These M-codes are used by MakerWare to change active tool. - // They have to be processed otherwise toolchanges will be unrecognised - // by the analyzer - see https://github.com/prusa3d/PrusaSlicer/issues/2566 - - if (m_flavor != gcfMakerWare) - return; - - std::string cmd = line.raw(); - size_t pos = cmd.find("T"); - if (pos != std::string::npos) - process_T(cmd.substr(pos)); -} - -void GCodeProcessor::process_M201(const GCodeReader::GCodeLine& line) -{ - // see http://reprap.org/wiki/G-code#M201:_Set_max_printing_acceleration - float factor = ((m_flavor != gcfRepRapSprinter && m_flavor != gcfRepRapFirmware) && m_units == EUnits::Inches) ? INCHES_TO_MM : 1.0f; - - for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { - if (static_cast(i) == PrintEstimatedStatistics::ETimeMode::Normal || - m_time_processor.machine_envelope_processing_enabled) { - if (line.has_x()) - set_option_value(m_time_processor.machine_limits.machine_max_acceleration_x, i, line.x() * factor); - - if (line.has_y()) - set_option_value(m_time_processor.machine_limits.machine_max_acceleration_y, i, line.y() * factor); - - if (line.has_z()) - set_option_value(m_time_processor.machine_limits.machine_max_acceleration_z, i, line.z() * factor); - - if (line.has_e()) - set_option_value(m_time_processor.machine_limits.machine_max_acceleration_e, i, line.e() * factor); - } - } -} - -void GCodeProcessor::process_M203(const GCodeReader::GCodeLine& line) -{ - // see http://reprap.org/wiki/G-code#M203:_Set_maximum_feedrate - if (m_flavor == gcfRepetier) - return; - - // see http://reprap.org/wiki/G-code#M203:_Set_maximum_feedrate - // http://smoothieware.org/supported-g-codes - float factor = (m_flavor == gcfMarlinLegacy || m_flavor == gcfMarlinFirmware || m_flavor == gcfSmoothie) ? 1.0f : MMMIN_TO_MMSEC; - - for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { - if (static_cast(i) == PrintEstimatedStatistics::ETimeMode::Normal || - m_time_processor.machine_envelope_processing_enabled) { - if (line.has_x()) - set_option_value(m_time_processor.machine_limits.machine_max_feedrate_x, i, line.x() * factor); - - if (line.has_y()) - set_option_value(m_time_processor.machine_limits.machine_max_feedrate_y, i, line.y() * factor); - - if (line.has_z()) - set_option_value(m_time_processor.machine_limits.machine_max_feedrate_z, i, line.z() * factor); - - if (line.has_e()) - set_option_value(m_time_processor.machine_limits.machine_max_feedrate_e, i, line.e() * factor); - } - } -} - -void GCodeProcessor::process_M204(const GCodeReader::GCodeLine& line) -{ - float value; - for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { - if (static_cast(i) == PrintEstimatedStatistics::ETimeMode::Normal || - m_time_processor.machine_envelope_processing_enabled) { - if (line.has_value('S', value)) { - // Legacy acceleration format. This format is used by the legacy Marlin, MK2 or MK3 firmware - // It is also generated by PrusaSlicer to control acceleration per extrusion type - // (perimeters, first layer etc) when 'Marlin (legacy)' flavor is used. - set_acceleration(static_cast(i), value); - set_travel_acceleration(static_cast(i), value); - if (line.has_value('T', value)) - set_retract_acceleration(static_cast(i), value); - } - else { - // New acceleration format, compatible with the upstream Marlin. - if (line.has_value('P', value)) - set_acceleration(static_cast(i), value); - if (line.has_value('R', value)) - set_retract_acceleration(static_cast(i), value); - if (line.has_value('T', value)) - // Interpret the T value as the travel acceleration in the new Marlin format. - set_travel_acceleration(static_cast(i), value); - } - } - } -} - -void GCodeProcessor::process_M205(const GCodeReader::GCodeLine& line) -{ - for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { - if (static_cast(i) == PrintEstimatedStatistics::ETimeMode::Normal || - m_time_processor.machine_envelope_processing_enabled) { - if (line.has_x()) { - float max_jerk = line.x(); - set_option_value(m_time_processor.machine_limits.machine_max_jerk_x, i, max_jerk); - set_option_value(m_time_processor.machine_limits.machine_max_jerk_y, i, max_jerk); - } - - if (line.has_y()) - set_option_value(m_time_processor.machine_limits.machine_max_jerk_y, i, line.y()); - - if (line.has_z()) - set_option_value(m_time_processor.machine_limits.machine_max_jerk_z, i, line.z()); - - if (line.has_e()) - set_option_value(m_time_processor.machine_limits.machine_max_jerk_e, i, line.e()); - - float value; - if (line.has_value('S', value)) - set_option_value(m_time_processor.machine_limits.machine_min_extruding_rate, i, value); - - if (line.has_value('T', value)) - set_option_value(m_time_processor.machine_limits.machine_min_travel_rate, i, value); - } - } -} - -void GCodeProcessor::process_M221(const GCodeReader::GCodeLine& line) -{ - float value_s; - float value_t; - if (line.has_value('S', value_s) && !line.has_value('T', value_t)) { - value_s *= 0.01f; - for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { - m_time_processor.machines[i].extrude_factor_override_percentage = value_s; - } - } -} - -void GCodeProcessor::process_M401(const GCodeReader::GCodeLine& line) -{ - if (m_flavor != gcfRepetier) - return; - - for (unsigned char a = 0; a <= 3; ++a) { - m_cached_position.position[a] = m_start_position[a]; - } - m_cached_position.feedrate = m_feedrate; -} - -void GCodeProcessor::process_M402(const GCodeReader::GCodeLine& line) -{ - if (m_flavor != gcfRepetier) - return; - - // see for reference: - // https://github.com/repetier/Repetier-Firmware/blob/master/src/ArduinoAVR/Repetier/Printer.cpp - // void Printer::GoToMemoryPosition(bool x, bool y, bool z, bool e, float feed) - - bool has_xyz = !(line.has('X') || line.has('Y') || line.has('Z')); - - float p = FLT_MAX; - for (unsigned char a = X; a <= Z; ++a) { - if (has_xyz || line.has(a)) { - p = m_cached_position.position[a]; - if (p != FLT_MAX) - m_start_position[a] = p; - } - } - - p = m_cached_position.position[E]; - if (p != FLT_MAX) - m_start_position[E] = p; - - p = FLT_MAX; - if (!line.has_value(4, p)) - p = m_cached_position.feedrate; - - if (p != FLT_MAX) - m_feedrate = p; -} - -void GCodeProcessor::process_M566(const GCodeReader::GCodeLine& line) -{ - for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { - if (line.has_x()) - set_option_value(m_time_processor.machine_limits.machine_max_jerk_x, i, line.x() * MMMIN_TO_MMSEC); - - if (line.has_y()) - set_option_value(m_time_processor.machine_limits.machine_max_jerk_y, i, line.y() * MMMIN_TO_MMSEC); - - if (line.has_z()) - set_option_value(m_time_processor.machine_limits.machine_max_jerk_z, i, line.z() * MMMIN_TO_MMSEC); - - if (line.has_e()) - set_option_value(m_time_processor.machine_limits.machine_max_jerk_e, i, line.e() * MMMIN_TO_MMSEC); - } -} - -void GCodeProcessor::process_M702(const GCodeReader::GCodeLine& line) -{ - if (line.has('C')) { - // MK3 MMU2 specific M code: - // M702 C is expected to be sent by the custom end G-code when finalizing a print. - // The MK3 unit shall unload and park the active filament into the MMU2 unit. - m_time_processor.extruder_unloaded = true; - simulate_st_synchronize(get_filament_unload_time(m_extruder_id)); - } -} - -void GCodeProcessor::process_T(const GCodeReader::GCodeLine& line) -{ - process_T(line.cmd()); -} - -void GCodeProcessor::process_T(const std::string_view command) -{ - if (command.length() > 1) { - int eid = 0; - if (! parse_number(command.substr(1), eid) || eid < 0 || eid > 255) { - // Specific to the MMU2 V2 (see https://www.help.prusa3d.com/en/article/prusa-specific-g-codes_112173): - if ((m_flavor == gcfMarlinLegacy || m_flavor == gcfMarlinFirmware) && (command == "Tx" || command == "Tc" || command == "T?")) - return; - - // T-1 is a valid gcode line for RepRap Firmwares (used to deselects all tools) see https://github.com/prusa3d/PrusaSlicer/issues/5677 - if ((m_flavor != gcfRepRapFirmware && m_flavor != gcfRepRapSprinter) || eid != -1) - BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid toolchange (" << command << ")."; - } else { - unsigned char id = static_cast(eid); - if (m_extruder_id != id) { - if (id >= m_result.extruders_count) - BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid toolchange, maybe from a custom gcode."; - else { - unsigned char old_extruder_id = m_extruder_id; - process_filaments(CustomGCode::ToolChange); - m_extruder_id = id; - m_cp_color.current = m_extruder_colors[id]; - // Specific to the MK3 MMU2: - // The initial value of extruder_unloaded is set to true indicating - // that the filament is parked in the MMU2 unit and there is nothing to be unloaded yet. - float extra_time = get_filament_unload_time(static_cast(old_extruder_id)); - m_time_processor.extruder_unloaded = false; - extra_time += get_filament_load_time(static_cast(m_extruder_id)); - simulate_st_synchronize(extra_time); - } - - // store tool change move - store_move_vertex(EMoveType::Tool_change); - } - } - } -} - -void GCodeProcessor::store_move_vertex(EMoveType type) -{ - m_last_line_id = (type == EMoveType::Color_change || type == EMoveType::Pause_Print || type == EMoveType::Custom_GCode) ? - m_line_id + 1 : - ((type == EMoveType::Seam) ? m_last_line_id : m_line_id); - - m_result.moves.push_back({ - m_last_line_id, - type, - m_extrusion_role, - m_extruder_id, - m_cp_color.current, -#if ENABLE_Z_OFFSET_CORRECTION - Vec3f(m_end_position[X], m_end_position[Y], m_end_position[Z] - m_z_offset) + m_extruder_offsets[m_extruder_id], -#else - Vec3f(m_end_position[X], m_end_position[Y], m_processing_start_custom_gcode ? m_first_layer_height : m_end_position[Z]) + m_extruder_offsets[m_extruder_id], -#endif // ENABLE_Z_OFFSET_CORRECTION - static_cast(m_end_position[E] - m_start_position[E]), - m_feedrate, - m_width, - m_height, - m_mm3_per_mm, - m_fan_speed, - m_extruder_temps[m_extruder_id], - static_cast(m_result.moves.size()) - }); - - // stores stop time placeholders for later use - if (type == EMoveType::Color_change || type == EMoveType::Pause_Print) { - for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { - TimeMachine& machine = m_time_processor.machines[i]; - if (!machine.enabled) - continue; - - machine.stop_times.push_back({ m_g1_line_id, 0.0f }); - } - } -} - -void GCodeProcessor::set_extrusion_role(ExtrusionRole role) -{ - m_used_filaments.process_role_cache(this); - m_extrusion_role = role; -} - -float GCodeProcessor::minimum_feedrate(PrintEstimatedStatistics::ETimeMode mode, float feedrate) const -{ - if (m_time_processor.machine_limits.machine_min_extruding_rate.empty()) - return feedrate; - - return std::max(feedrate, get_option_value(m_time_processor.machine_limits.machine_min_extruding_rate, static_cast(mode))); -} - -float GCodeProcessor::minimum_travel_feedrate(PrintEstimatedStatistics::ETimeMode mode, float feedrate) const -{ - if (m_time_processor.machine_limits.machine_min_travel_rate.empty()) - return feedrate; - - return std::max(feedrate, get_option_value(m_time_processor.machine_limits.machine_min_travel_rate, static_cast(mode))); -} - -float GCodeProcessor::get_axis_max_feedrate(PrintEstimatedStatistics::ETimeMode mode, Axis axis) const -{ - switch (axis) - { - case X: { return get_option_value(m_time_processor.machine_limits.machine_max_feedrate_x, static_cast(mode)); } - case Y: { return get_option_value(m_time_processor.machine_limits.machine_max_feedrate_y, static_cast(mode)); } - case Z: { return get_option_value(m_time_processor.machine_limits.machine_max_feedrate_z, static_cast(mode)); } - case E: { return get_option_value(m_time_processor.machine_limits.machine_max_feedrate_e, static_cast(mode)); } - default: { return 0.0f; } - } -} - -float GCodeProcessor::get_axis_max_acceleration(PrintEstimatedStatistics::ETimeMode mode, Axis axis) const -{ - switch (axis) - { - case X: { return get_option_value(m_time_processor.machine_limits.machine_max_acceleration_x, static_cast(mode)); } - case Y: { return get_option_value(m_time_processor.machine_limits.machine_max_acceleration_y, static_cast(mode)); } - case Z: { return get_option_value(m_time_processor.machine_limits.machine_max_acceleration_z, static_cast(mode)); } - case E: { return get_option_value(m_time_processor.machine_limits.machine_max_acceleration_e, static_cast(mode)); } - default: { return 0.0f; } - } -} - -float GCodeProcessor::get_axis_max_jerk(PrintEstimatedStatistics::ETimeMode mode, Axis axis) const -{ - switch (axis) - { - case X: { return get_option_value(m_time_processor.machine_limits.machine_max_jerk_x, static_cast(mode)); } - case Y: { return get_option_value(m_time_processor.machine_limits.machine_max_jerk_y, static_cast(mode)); } - case Z: { return get_option_value(m_time_processor.machine_limits.machine_max_jerk_z, static_cast(mode)); } - case E: { return get_option_value(m_time_processor.machine_limits.machine_max_jerk_e, static_cast(mode)); } - default: { return 0.0f; } - } -} - -float GCodeProcessor::get_retract_acceleration(PrintEstimatedStatistics::ETimeMode mode) const -{ - size_t id = static_cast(mode); - return (id < m_time_processor.machines.size()) ? m_time_processor.machines[id].retract_acceleration : DEFAULT_RETRACT_ACCELERATION; -} - -void GCodeProcessor::set_retract_acceleration(PrintEstimatedStatistics::ETimeMode mode, float value) -{ - size_t id = static_cast(mode); - if (id < m_time_processor.machines.size()) { - m_time_processor.machines[id].retract_acceleration = (m_time_processor.machines[id].max_retract_acceleration == 0.0f) ? value : - // Clamp the acceleration with the maximum. - std::min(value, m_time_processor.machines[id].max_retract_acceleration); - } -} - -float GCodeProcessor::get_acceleration(PrintEstimatedStatistics::ETimeMode mode) const -{ - size_t id = static_cast(mode); - return (id < m_time_processor.machines.size()) ? m_time_processor.machines[id].acceleration : DEFAULT_ACCELERATION; -} - -void GCodeProcessor::set_acceleration(PrintEstimatedStatistics::ETimeMode mode, float value) -{ - size_t id = static_cast(mode); - if (id < m_time_processor.machines.size()) { - m_time_processor.machines[id].acceleration = (m_time_processor.machines[id].max_acceleration == 0.0f) ? value : - // Clamp the acceleration with the maximum. - std::min(value, m_time_processor.machines[id].max_acceleration); - } -} - -float GCodeProcessor::get_travel_acceleration(PrintEstimatedStatistics::ETimeMode mode) const -{ - size_t id = static_cast(mode); - return (id < m_time_processor.machines.size()) ? m_time_processor.machines[id].travel_acceleration : DEFAULT_TRAVEL_ACCELERATION; -} - -void GCodeProcessor::set_travel_acceleration(PrintEstimatedStatistics::ETimeMode mode, float value) -{ - size_t id = static_cast(mode); - if (id < m_time_processor.machines.size()) { - m_time_processor.machines[id].travel_acceleration = (m_time_processor.machines[id].max_travel_acceleration == 0.0f) ? value : - // Clamp the acceleration with the maximum. - std::min(value, m_time_processor.machines[id].max_travel_acceleration); - } -} - -float GCodeProcessor::get_filament_load_time(size_t extruder_id) -{ - return (m_time_processor.filament_load_times.empty() || m_time_processor.extruder_unloaded) ? - 0.0f : - ((extruder_id < m_time_processor.filament_load_times.size()) ? - m_time_processor.filament_load_times[extruder_id] : m_time_processor.filament_load_times.front()); -} - -float GCodeProcessor::get_filament_unload_time(size_t extruder_id) -{ - return (m_time_processor.filament_unload_times.empty() || m_time_processor.extruder_unloaded) ? - 0.0f : - ((extruder_id < m_time_processor.filament_unload_times.size()) ? - m_time_processor.filament_unload_times[extruder_id] : m_time_processor.filament_unload_times.front()); -} - -void GCodeProcessor::process_custom_gcode_time(CustomGCode::Type code) -{ - for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { - TimeMachine& machine = m_time_processor.machines[i]; - if (!machine.enabled) - continue; - - TimeMachine::CustomGCodeTime& gcode_time = machine.gcode_time; - gcode_time.needed = true; - //FIXME this simulates st_synchronize! is it correct? - // The estimated time may be longer than the real print time. - machine.simulate_st_synchronize(); - if (gcode_time.cache != 0.0f) { - gcode_time.times.push_back({ code, gcode_time.cache }); - gcode_time.cache = 0.0f; - } - } -} - -void GCodeProcessor::process_filaments(CustomGCode::Type code) -{ - if (code == CustomGCode::ColorChange) - m_used_filaments.process_color_change_cache(); - - if (code == CustomGCode::ToolChange) - m_used_filaments.process_extruder_cache(this->m_extruder_id); -} - -void GCodeProcessor::simulate_st_synchronize(float additional_time) -{ - for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { - m_time_processor.machines[i].simulate_st_synchronize(additional_time); - } -} - -void GCodeProcessor::update_estimated_times_stats() -{ - auto update_mode = [this](PrintEstimatedStatistics::ETimeMode mode) { - PrintEstimatedStatistics::Mode& data = m_result.print_statistics.modes[static_cast(mode)]; - data.time = get_time(mode); - data.custom_gcode_times = get_custom_gcode_times(mode, true); - data.moves_times = get_moves_time(mode); - data.roles_times = get_roles_time(mode); - data.layers_times = get_layers_time(mode); - }; - - update_mode(PrintEstimatedStatistics::ETimeMode::Normal); - if (m_time_processor.machines[static_cast(PrintEstimatedStatistics::ETimeMode::Stealth)].enabled) - update_mode(PrintEstimatedStatistics::ETimeMode::Stealth); - else - m_result.print_statistics.modes[static_cast(PrintEstimatedStatistics::ETimeMode::Stealth)].reset(); - - m_result.print_statistics.volumes_per_color_change = m_used_filaments.volumes_per_color_change; - m_result.print_statistics.volumes_per_extruder = m_used_filaments.volumes_per_extruder; - m_result.print_statistics.used_filaments_per_role = m_used_filaments.filaments_per_role; -} - -} /* namespace Slic3r */ - +#include "libslic3r/libslic3r.h" +#include "libslic3r/Utils.hpp" +#include "libslic3r/Print.hpp" +#include "libslic3r/LocalesUtils.hpp" +#include "libslic3r/format.hpp" +#include "libslic3r/GCodeWriter.hpp" +#include "GCodeProcessor.hpp" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#if __has_include() + #include + #include +#endif + +#include + +static const float DEFAULT_TOOLPATH_WIDTH = 0.4f; +static const float DEFAULT_TOOLPATH_HEIGHT = 0.2f; + +static const float INCHES_TO_MM = 25.4f; +static const float MMMIN_TO_MMSEC = 1.0f / 60.0f; +static const float DEFAULT_ACCELERATION = 1500.0f; // Prusa Firmware 1_75mm_MK2 +static const float DEFAULT_RETRACT_ACCELERATION = 1500.0f; // Prusa Firmware 1_75mm_MK2 +static const float DEFAULT_TRAVEL_ACCELERATION = 1250.0f; + +static const size_t MIN_EXTRUDERS_COUNT = 5; +static const float DEFAULT_FILAMENT_DIAMETER = 1.75f; +static const float DEFAULT_FILAMENT_DENSITY = 1.245f; +static const float DEFAULT_FILAMENT_COST = 0.0f; +static const Slic3r::Vec3f DEFAULT_EXTRUDER_OFFSET = Slic3r::Vec3f::Zero(); +// taken from PrusaResearch.ini - [printer:Original Prusa i3 MK2.5 MMU2] +static const std::vector DEFAULT_EXTRUDER_COLORS = { "#FF8000", "#DB5182", "#3EC0FF", "#FF4F4F", "#FBEB7D" }; + +static const std::string INTERNAL_G2G3_TAG = "!#!#! internal only - from G2/G3 expansion !#!#!"; + +namespace Slic3r { + +const std::vector GCodeProcessor::Reserved_Tags = { + "TYPE:", + "WIPE_START", + "WIPE_END", + "HEIGHT:", + "WIDTH:", + "LAYER_CHANGE", + "COLOR_CHANGE", + "PAUSE_PRINT", + "CUSTOM_GCODE", + "_GP_FIRST_LINE_M73_PLACEHOLDER", + "_GP_LAST_LINE_M73_PLACEHOLDER", + "_GP_ESTIMATED_PRINTING_TIME_PLACEHOLDER" +}; + +const float GCodeProcessor::Wipe_Width = 0.05f; +const float GCodeProcessor::Wipe_Height = 0.05f; + +#if ENABLE_GCODE_VIEWER_DATA_CHECKING +const std::string GCodeProcessor::Mm3_Per_Mm_Tag = "MM3_PER_MM:"; +#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING + +static void set_option_value(ConfigOptionFloats& option, size_t id, float value) +{ + if (id < option.values.size()) + option.values[id] = static_cast(value); +}; + +static float get_option_value(const ConfigOptionFloats& option, size_t id) +{ + return option.values.empty() ? 0.0f : + ((id < option.values.size()) ? static_cast(option.values[id]) : static_cast(option.values.back())); +} + +static float estimated_acceleration_distance(float initial_rate, float target_rate, float acceleration) +{ + return (acceleration == 0.0f) ? 0.0f : (sqr(target_rate) - sqr(initial_rate)) / (2.0f * acceleration); +} + +static float intersection_distance(float initial_rate, float final_rate, float acceleration, float distance) +{ + return (acceleration == 0.0f) ? 0.0f : (2.0f * acceleration * distance - sqr(initial_rate) + sqr(final_rate)) / (4.0f * acceleration); +} + +static float speed_from_distance(float initial_feedrate, float distance, float acceleration) +{ + // to avoid invalid negative numbers due to numerical errors + float value = std::max(0.0f, sqr(initial_feedrate) + 2.0f * acceleration * distance); + return ::sqrt(value); +} + +// Calculates the maximum allowable speed at this point when you must be able to reach target_velocity using the +// acceleration within the allotted distance. +static float max_allowable_speed(float acceleration, float target_velocity, float distance) +{ + // to avoid invalid negative numbers due to numerical errors + float value = std::max(0.0f, sqr(target_velocity) - 2.0f * acceleration * distance); + return std::sqrt(value); +} + +static float acceleration_time_from_distance(float initial_feedrate, float distance, float acceleration) +{ + return (acceleration != 0.0f) ? (speed_from_distance(initial_feedrate, distance, acceleration) - initial_feedrate) / acceleration : 0.0f; +} + +void GCodeProcessor::CachedPosition::reset() +{ + std::fill(position.begin(), position.end(), FLT_MAX); + feedrate = FLT_MAX; +} + +void GCodeProcessor::CpColor::reset() +{ + counter = 0; + current = 0; +} + +float GCodeProcessor::Trapezoid::acceleration_time(float entry_feedrate, float acceleration) const +{ + return acceleration_time_from_distance(entry_feedrate, accelerate_until, acceleration); +} + +float GCodeProcessor::Trapezoid::cruise_time() const +{ + return (cruise_feedrate != 0.0f) ? cruise_distance() / cruise_feedrate : 0.0f; +} + +float GCodeProcessor::Trapezoid::deceleration_time(float distance, float acceleration) const +{ + return acceleration_time_from_distance(cruise_feedrate, (distance - decelerate_after), -acceleration); +} + +float GCodeProcessor::Trapezoid::cruise_distance() const +{ + return decelerate_after - accelerate_until; +} + +void GCodeProcessor::TimeBlock::calculate_trapezoid() +{ + trapezoid.cruise_feedrate = feedrate_profile.cruise; + + float accelerate_distance = std::max(0.0f, estimated_acceleration_distance(feedrate_profile.entry, feedrate_profile.cruise, acceleration)); + float decelerate_distance = std::max(0.0f, estimated_acceleration_distance(feedrate_profile.cruise, feedrate_profile.exit, -acceleration)); + float cruise_distance = distance - accelerate_distance - decelerate_distance; + + // Not enough space to reach the nominal feedrate. + // This means no cruising, and we'll have to use intersection_distance() to calculate when to abort acceleration + // and start braking in order to reach the exit_feedrate exactly at the end of this block. + if (cruise_distance < 0.0f) { + accelerate_distance = std::clamp(intersection_distance(feedrate_profile.entry, feedrate_profile.exit, acceleration, distance), 0.0f, distance); + cruise_distance = 0.0f; + trapezoid.cruise_feedrate = speed_from_distance(feedrate_profile.entry, accelerate_distance, acceleration); + } + + trapezoid.accelerate_until = accelerate_distance; + trapezoid.decelerate_after = accelerate_distance + cruise_distance; +} + +float GCodeProcessor::TimeBlock::time() const +{ + return trapezoid.acceleration_time(feedrate_profile.entry, acceleration) + + trapezoid.cruise_time() + + trapezoid.deceleration_time(distance, acceleration); +} + +void GCodeProcessor::TimeMachine::State::reset() +{ + feedrate = 0.0f; + safe_feedrate = 0.0f; + axis_feedrate = { 0.0f, 0.0f, 0.0f, 0.0f }; + abs_axis_feedrate = { 0.0f, 0.0f, 0.0f, 0.0f }; +} + +void GCodeProcessor::TimeMachine::CustomGCodeTime::reset() +{ + needed = false; + cache = 0.0f; + times = std::vector>(); +} + +void GCodeProcessor::TimeMachine::reset() +{ + enabled = false; + acceleration = 0.0f; + max_acceleration = 0.0f; + retract_acceleration = 0.0f; + max_retract_acceleration = 0.0f; + travel_acceleration = 0.0f; + max_travel_acceleration = 0.0f; + extrude_factor_override_percentage = 1.0f; + time = 0.0f; + travel_time = 0.0f; + stop_times = std::vector(); + curr.reset(); + prev.reset(); + gcode_time.reset(); + blocks = std::vector(); + g1_times_cache = std::vector(); + std::fill(moves_time.begin(), moves_time.end(), 0.0f); + std::fill(roles_time.begin(), roles_time.end(), 0.0f); + layers_time = std::vector(); +} + +void GCodeProcessor::TimeMachine::simulate_st_synchronize(float additional_time) +{ + if (!enabled) + return; + + calculate_time(0, additional_time); +} + +static void planner_forward_pass_kernel(GCodeProcessor::TimeBlock& prev, GCodeProcessor::TimeBlock& curr) +{ + // If the previous block is an acceleration block, but it is not long enough to complete the + // full speed change within the block, we need to adjust the entry speed accordingly. Entry + // speeds have already been reset, maximized, and reverse planned by reverse planner. + // If nominal length is true, max junction speed is guaranteed to be reached. No need to recheck. + if (!prev.flags.nominal_length) { + if (prev.feedrate_profile.entry < curr.feedrate_profile.entry) { + float entry_speed = std::min(curr.feedrate_profile.entry, max_allowable_speed(-prev.acceleration, prev.feedrate_profile.entry, prev.distance)); + + // Check for junction speed change + if (curr.feedrate_profile.entry != entry_speed) { + curr.feedrate_profile.entry = entry_speed; + curr.flags.recalculate = true; + } + } + } +} + +void planner_reverse_pass_kernel(GCodeProcessor::TimeBlock& curr, GCodeProcessor::TimeBlock& next) +{ + // If entry speed is already at the maximum entry speed, no need to recheck. Block is cruising. + // If not, block in state of acceleration or deceleration. Reset entry speed to maximum and + // check for maximum allowable speed reductions to ensure maximum possible planned speed. + if (curr.feedrate_profile.entry != curr.max_entry_speed) { + // If nominal length true, max junction speed is guaranteed to be reached. Only compute + // for max allowable speed if block is decelerating and nominal length is false. + if (!curr.flags.nominal_length && curr.max_entry_speed > next.feedrate_profile.entry) + curr.feedrate_profile.entry = std::min(curr.max_entry_speed, max_allowable_speed(-curr.acceleration, next.feedrate_profile.entry, curr.distance)); + else + curr.feedrate_profile.entry = curr.max_entry_speed; + + curr.flags.recalculate = true; + } +} + +static void recalculate_trapezoids(std::vector& blocks) +{ + GCodeProcessor::TimeBlock* curr = nullptr; + GCodeProcessor::TimeBlock* next = nullptr; + + for (size_t i = 0; i < blocks.size(); ++i) { + GCodeProcessor::TimeBlock& b = blocks[i]; + + curr = next; + next = &b; + + if (curr != nullptr) { + // Recalculate if current block entry or exit junction speed has changed. + if (curr->flags.recalculate || next->flags.recalculate) { + // NOTE: Entry and exit factors always > 0 by all previous logic operations. + GCodeProcessor::TimeBlock block = *curr; + block.feedrate_profile.exit = next->feedrate_profile.entry; + block.calculate_trapezoid(); + curr->trapezoid = block.trapezoid; + curr->flags.recalculate = false; // Reset current only to ensure next trapezoid is computed + } + } + } + + // Last/newest block in buffer. Always recalculated. + if (next != nullptr) { + GCodeProcessor::TimeBlock block = *next; + block.feedrate_profile.exit = next->safe_feedrate; + block.calculate_trapezoid(); + next->trapezoid = block.trapezoid; + next->flags.recalculate = false; + } +} + +void GCodeProcessor::TimeMachine::calculate_time(size_t keep_last_n_blocks, float additional_time) +{ + if (!enabled || blocks.size() < 2) + return; + + assert(keep_last_n_blocks <= blocks.size()); + + // forward_pass + for (size_t i = 0; i + 1 < blocks.size(); ++i) { + planner_forward_pass_kernel(blocks[i], blocks[i + 1]); + } + + // reverse_pass + for (int i = static_cast(blocks.size()) - 1; i > 0; --i) + planner_reverse_pass_kernel(blocks[i - 1], blocks[i]); + + recalculate_trapezoids(blocks); + + size_t n_blocks_process = blocks.size() - keep_last_n_blocks; + for (size_t i = 0; i < n_blocks_process; ++i) { + const TimeBlock& block = blocks[i]; + float block_time = block.time(); + if (i == 0) + block_time += additional_time; + + time += block_time; + if (block.move_type == EMoveType::Travel) + travel_time += block_time; + else + roles_time[static_cast(block.role)] += block_time; + gcode_time.cache += block_time; + moves_time[static_cast(block.move_type)] += block_time; + if (block.layer_id >= layers_time.size()) { + const size_t curr_size = layers_time.size(); + layers_time.resize(block.layer_id); + for (size_t i = curr_size; i < layers_time.size(); ++i) { + layers_time[i] = 0.0f; + } + } + layers_time[block.layer_id - 1] += block_time; + g1_times_cache.push_back({ block.g1_line_id, time }); + // update times for remaining time to printer stop placeholders + auto it_stop_time = std::lower_bound(stop_times.begin(), stop_times.end(), block.g1_line_id, + [](const StopTime& t, unsigned int value) { return t.g1_line_id < value; }); + if (it_stop_time != stop_times.end() && it_stop_time->g1_line_id == block.g1_line_id) + it_stop_time->elapsed_time = time; + } + + if (keep_last_n_blocks) + blocks.erase(blocks.begin(), blocks.begin() + n_blocks_process); + else + blocks.clear(); +} + +void GCodeProcessor::TimeProcessor::reset() +{ + extruder_unloaded = true; + export_remaining_time_enabled = false; + machine_envelope_processing_enabled = false; + machine_limits = MachineEnvelopeConfig(); + filament_load_times = std::vector(); + filament_unload_times = std::vector(); + for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { + machines[i].reset(); + } + machines[static_cast(PrintEstimatedStatistics::ETimeMode::Normal)].enabled = true; +} + +void GCodeProcessor::UsedFilaments::reset() +{ + color_change_cache = 0.0; + volumes_per_color_change = std::vector(); + + tool_change_cache = 0.0; + volumes_per_extruder.clear(); + + role_cache = 0.0; + filaments_per_role.clear(); + + extruder_retracted_volume.clear(); +} + +void GCodeProcessor::UsedFilaments::increase_caches(double extruded_volume, unsigned char extruder_id, double parking_volume, double extra_loading_volume) +{ + if (extruder_id >= extruder_retracted_volume.size()) + extruder_retracted_volume.resize(extruder_id + 1, parking_volume); + + if (recent_toolchange) { + extruded_volume -= extra_loading_volume; + recent_toolchange = false; + } + + extruder_retracted_volume[extruder_id] -= extruded_volume; + + if (extruder_retracted_volume[extruder_id] < 0.) { + extruded_volume = - extruder_retracted_volume[extruder_id]; + extruder_retracted_volume[extruder_id] = 0.; + + color_change_cache += extruded_volume; + tool_change_cache += extruded_volume; + role_cache += extruded_volume; + } +} + +void GCodeProcessor::UsedFilaments::process_color_change_cache() +{ + if (color_change_cache != 0.0f) { + volumes_per_color_change.push_back(color_change_cache); + color_change_cache = 0.0f; + } +} + +void GCodeProcessor::UsedFilaments::process_extruder_cache(unsigned char extruder_id) + { + if (tool_change_cache != 0.0) { + volumes_per_extruder[extruder_id] += tool_change_cache; + tool_change_cache = 0.0; + } + recent_toolchange = true; +} + +void GCodeProcessor::UsedFilaments::process_role_cache(const GCodeProcessor* processor) +{ + if (role_cache != 0.0) { + std::pair filament = { 0.0f, 0.0f }; + + const double s = PI * sqr(0.5 * processor->m_result.filament_diameters[processor->m_extruder_id]); + filament.first = role_cache / s * 0.001; + filament.second = role_cache * processor->m_result.filament_densities[processor->m_extruder_id] * 0.001; + + GCodeExtrusionRole active_role = processor->m_extrusion_role; + if (filaments_per_role.find(active_role) != filaments_per_role.end()) { + filaments_per_role[active_role].first += filament.first; + filaments_per_role[active_role].second += filament.second; + } + else + filaments_per_role[active_role] = filament; + role_cache = 0.0; + } +} + +void GCodeProcessor::UsedFilaments::process_caches(const GCodeProcessor* processor) +{ + process_color_change_cache(); + process_extruder_cache(processor->m_extruder_id); + process_role_cache(processor); +} + +#if ENABLE_GCODE_VIEWER_STATISTICS +void GCodeProcessorResult::reset() { + moves = std::vector(); + bed_shape = Pointfs(); + max_print_height = 0.0f; + settings_ids.reset(); + extruders_count = 0; +#if ENABLE_GCODE_POSTPROCESS_BACKTRACE + backtrace_enabled = false; +#endif // ENABLE_GCODE_POSTPROCESS_BACKTRACE + extruder_colors = std::vector(); + filament_diameters = std::vector(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_DIAMETER); + filament_densities = std::vector(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_DENSITY); + filament_cost = std::vector(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_COST); + custom_gcode_per_print_z = std::vector(); + spiral_vase_layers = std::vector>>(); + time = 0; +} +#else +void GCodeProcessorResult::reset() { + + moves.clear(); + lines_ends.clear(); + bed_shape = Pointfs(); + max_print_height = 0.0f; + settings_ids.reset(); + extruders_count = 0; +#if ENABLE_GCODE_POSTPROCESS_BACKTRACE + backtrace_enabled = false; +#endif // ENABLE_GCODE_POSTPROCESS_BACKTRACE + extruder_colors = std::vector(); + filament_diameters = std::vector(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_DIAMETER); + filament_densities = std::vector(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_DENSITY); + filament_cost = std::vector(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_COST); + custom_gcode_per_print_z = std::vector(); + spiral_vase_layers = std::vector>>(); +} +#endif // ENABLE_GCODE_VIEWER_STATISTICS + +const std::vector> GCodeProcessor::Producers = { + { EProducer::PrusaSlicer, "generated by PrusaSlicer" }, + { EProducer::Slic3rPE, "generated by Slic3r Prusa Edition" }, + { EProducer::Slic3r, "generated by Slic3r" }, + { EProducer::SuperSlicer, "generated by SuperSlicer" }, + { EProducer::Cura, "Cura_SteamEngine" }, + { EProducer::Simplify3D, "generated by Simplify3D(R)" }, + { EProducer::CraftWare, "CraftWare" }, + { EProducer::ideaMaker, "ideaMaker" }, + { EProducer::KissSlicer, "KISSlicer" }, + { EProducer::BambuStudio, "BambuStudio" } +}; + +unsigned int GCodeProcessor::s_result_id = 0; + +bool GCodeProcessor::contains_reserved_tag(const std::string& gcode, std::string& found_tag) +{ + bool ret = false; + + GCodeReader parser; + parser.parse_buffer(gcode, [&ret, &found_tag](GCodeReader& parser, const GCodeReader::GCodeLine& line) { + std::string comment = line.raw(); + if (comment.length() > 2 && comment.front() == ';') { + comment = comment.substr(1); + for (const std::string& s : Reserved_Tags) { + if (boost::starts_with(comment, s)) { + ret = true; + found_tag = comment; + parser.quit_parsing(); + return; + } + } + } + }); + + return ret; +} + +bool GCodeProcessor::contains_reserved_tags(const std::string& gcode, unsigned int max_count, std::vector& found_tag) +{ + max_count = std::max(max_count, 1U); + + bool ret = false; + + CNumericLocalesSetter locales_setter; + + GCodeReader parser; + parser.parse_buffer(gcode, [&ret, &found_tag, max_count](GCodeReader& parser, const GCodeReader::GCodeLine& line) { + std::string comment = line.raw(); + if (comment.length() > 2 && comment.front() == ';') { + comment = comment.substr(1); + for (const std::string& s : Reserved_Tags) { + if (boost::starts_with(comment, s)) { + ret = true; + found_tag.push_back(comment); + if (found_tag.size() == max_count) { + parser.quit_parsing(); + return; + } + } + } + } + }); + + return ret; +} + +GCodeProcessor::GCodeProcessor() +: m_options_z_corrector(m_result) +{ + reset(); + m_time_processor.machines[static_cast(PrintEstimatedStatistics::ETimeMode::Normal)].line_m73_main_mask = "M73 P%s R%s\n"; + m_time_processor.machines[static_cast(PrintEstimatedStatistics::ETimeMode::Normal)].line_m73_stop_mask = "M73 C%s\n"; + m_time_processor.machines[static_cast(PrintEstimatedStatistics::ETimeMode::Stealth)].line_m73_main_mask = "M73 Q%s S%s\n"; + m_time_processor.machines[static_cast(PrintEstimatedStatistics::ETimeMode::Stealth)].line_m73_stop_mask = "M73 D%s\n"; +} + +void GCodeProcessor::apply_config(const PrintConfig& config) +{ + m_parser.apply_config(config); + + m_producer = EProducer::PrusaSlicer; + m_flavor = config.gcode_flavor; + +#if ENABLE_GCODE_POSTPROCESS_BACKTRACE + m_result.backtrace_enabled = is_XL_printer(config); +#endif // ENABLE_GCODE_POSTPROCESS_BACKTRACE + + size_t extruders_count = config.nozzle_diameter.values.size(); + m_result.extruders_count = extruders_count; + + m_extruder_offsets.resize(extruders_count); + m_extruder_colors.resize(extruders_count); + m_result.filament_diameters.resize(extruders_count); + m_result.filament_densities.resize(extruders_count); + m_result.filament_cost.resize(extruders_count); + m_extruder_temps.resize(extruders_count); + m_extruder_temps_config.resize(extruders_count); + m_extruder_temps_first_layer_config.resize(extruders_count); + m_is_XL_printer = is_XL_printer(config); + + for (size_t i = 0; i < extruders_count; ++ i) { + m_extruder_offsets[i] = to_3d(config.extruder_offset.get_at(i).cast().eval(), 0.f); + m_extruder_colors[i] = static_cast(i); + m_extruder_temps_config[i] = static_cast(config.temperature.get_at(i)); + m_extruder_temps_first_layer_config[i] = static_cast(config.first_layer_temperature.get_at(i)); + m_result.filament_diameters[i] = static_cast(config.filament_diameter.get_at(i)); + m_result.filament_densities[i] = static_cast(config.filament_density.get_at(i)); + m_result.filament_cost[i] = static_cast(config.filament_cost.get_at(i)); + } + + if ((m_flavor == gcfMarlinLegacy || m_flavor == gcfMarlinFirmware || m_flavor == gcfRepRapFirmware || m_flavor == gcfKlipper) + && config.machine_limits_usage.value != MachineLimitsUsage::Ignore) { + m_time_processor.machine_limits = reinterpret_cast(config); + if (m_flavor == gcfMarlinLegacy || m_flavor == gcfKlipper) { + // Legacy Marlin and Klipper don't have separate travel acceleration, they use the 'extruding' value instead. + m_time_processor.machine_limits.machine_max_acceleration_travel = m_time_processor.machine_limits.machine_max_acceleration_extruding; + } + if (m_flavor == gcfRepRapFirmware) { + // RRF does not support setting min feedrates. Set them to zero. + m_time_processor.machine_limits.machine_min_travel_rate.values.assign(m_time_processor.machine_limits.machine_min_travel_rate.size(), 0.); + m_time_processor.machine_limits.machine_min_extruding_rate.values.assign(m_time_processor.machine_limits.machine_min_extruding_rate.size(), 0.); + } + } + + // Filament load / unload times are not specific to a firmware flavor. Let anybody use it if they find it useful. + // As of now the fields are shown at the UI dialog in the same combo box as the ramming values, so they + // are considered to be active for the single extruder multi-material printers only. + m_time_processor.filament_load_times.resize(config.filament_load_time.values.size()); + for (size_t i = 0; i < config.filament_load_time.values.size(); ++i) { + m_time_processor.filament_load_times[i] = static_cast(config.filament_load_time.values[i]); + } + m_time_processor.filament_unload_times.resize(config.filament_unload_time.values.size()); + for (size_t i = 0; i < config.filament_unload_time.values.size(); ++i) { + m_time_processor.filament_unload_times[i] = static_cast(config.filament_unload_time.values[i]); + } + + m_single_extruder_multi_material = config.single_extruder_multi_material; + + // With MM setups like Prusa MMU2, the filaments may be expected to be parked at the beginning. + // Remember the parking position so the initial load is not included in filament estimate. + if (m_single_extruder_multi_material && extruders_count > 1 && config.wipe_tower) { + m_parking_position = float(config.parking_pos_retraction.value); + m_extra_loading_move = float(config.extra_loading_move); + } + +for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { + float max_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_extruding, i); + m_time_processor.machines[i].max_acceleration = max_acceleration; + m_time_processor.machines[i].acceleration = (max_acceleration > 0.0f) ? max_acceleration : DEFAULT_ACCELERATION; + float max_retract_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_retracting, i); + m_time_processor.machines[i].max_retract_acceleration = max_retract_acceleration; + m_time_processor.machines[i].retract_acceleration = (max_retract_acceleration > 0.0f) ? max_retract_acceleration : DEFAULT_RETRACT_ACCELERATION; + + float max_travel_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_travel, i); + if ( ! GCodeWriter::supports_separate_travel_acceleration(config.gcode_flavor.value) || config.machine_limits_usage.value != MachineLimitsUsage::EmitToGCode) { + // Only clamp travel acceleration when it is accessible in machine limits. + max_travel_acceleration = 0; + } + m_time_processor.machines[i].max_travel_acceleration = max_travel_acceleration; + m_time_processor.machines[i].travel_acceleration = (max_travel_acceleration > 0.0f) ? max_travel_acceleration : DEFAULT_TRAVEL_ACCELERATION; + } + + m_time_processor.export_remaining_time_enabled = config.remaining_times.value; + m_use_volumetric_e = config.use_volumetric_e; + + const ConfigOptionFloatOrPercent* first_layer_height = config.option("first_layer_height"); + if (first_layer_height != nullptr) + m_first_layer_height = std::abs(first_layer_height->value); + + m_result.max_print_height = config.max_print_height; + + const ConfigOptionBool* spiral_vase = config.option("spiral_vase"); + if (spiral_vase != nullptr) + m_spiral_vase_active = spiral_vase->value; + + const ConfigOptionFloat* z_offset = config.option("z_offset"); + if (z_offset != nullptr) + m_z_offset = z_offset->value; +} + +void GCodeProcessor::apply_config(const DynamicPrintConfig& config) +{ + m_parser.apply_config(config); + + const ConfigOptionEnum* gcode_flavor = config.option>("gcode_flavor"); + if (gcode_flavor != nullptr) + m_flavor = gcode_flavor->value; + + const ConfigOptionPoints* bed_shape = config.option("bed_shape"); + if (bed_shape != nullptr) + m_result.bed_shape = bed_shape->values; + + const ConfigOptionString* print_settings_id = config.option("print_settings_id"); + if (print_settings_id != nullptr) + m_result.settings_ids.print = print_settings_id->value; + + const ConfigOptionStrings* filament_settings_id = config.option("filament_settings_id"); + if (filament_settings_id != nullptr) + m_result.settings_ids.filament = filament_settings_id->values; + + const ConfigOptionString* printer_settings_id = config.option("printer_settings_id"); + if (printer_settings_id != nullptr) + m_result.settings_ids.printer = printer_settings_id->value; + + m_result.extruders_count = config.option("nozzle_diameter")->values.size(); + + const ConfigOptionFloats* filament_diameters = config.option("filament_diameter"); + if (filament_diameters != nullptr) { + m_result.filament_diameters.clear(); + m_result.filament_diameters.resize(filament_diameters->values.size()); + for (size_t i = 0; i < filament_diameters->values.size(); ++i) { + m_result.filament_diameters[i] = static_cast(filament_diameters->values[i]); + } + } + + if (m_result.filament_diameters.size() < m_result.extruders_count) { + for (size_t i = m_result.filament_diameters.size(); i < m_result.extruders_count; ++i) { + m_result.filament_diameters.emplace_back(DEFAULT_FILAMENT_DIAMETER); + } + } + + const ConfigOptionFloats* filament_densities = config.option("filament_density"); + if (filament_densities != nullptr) { + m_result.filament_densities.clear(); + m_result.filament_densities.resize(filament_densities->values.size()); + for (size_t i = 0; i < filament_densities->values.size(); ++i) { + m_result.filament_densities[i] = static_cast(filament_densities->values[i]); + } + } + + if (m_result.filament_densities.size() < m_result.extruders_count) { + for (size_t i = m_result.filament_densities.size(); i < m_result.extruders_count; ++i) { + m_result.filament_densities.emplace_back(DEFAULT_FILAMENT_DENSITY); + } + } + + const ConfigOptionFloats* filament_cost = config.option("filament_cost"); + if (filament_cost != nullptr) { + m_result.filament_cost.clear(); + m_result.filament_cost.resize(filament_cost->values.size()); + for (size_t i = 0; i < filament_cost->values.size(); ++i) { + m_result.filament_cost[i] = static_cast(filament_cost->values[i]); + } + } + + if (m_result.filament_cost.size() < m_result.extruders_count) { + for (size_t i = m_result.filament_cost.size(); i < m_result.extruders_count; ++i) { + m_result.filament_cost.emplace_back(DEFAULT_FILAMENT_COST); + } + } + + const ConfigOptionPoints* extruder_offset = config.option("extruder_offset"); + if (extruder_offset != nullptr) { + m_extruder_offsets.resize(extruder_offset->values.size()); + for (size_t i = 0; i < extruder_offset->values.size(); ++i) { + Vec2f offset = extruder_offset->values[i].cast(); + m_extruder_offsets[i] = { offset(0), offset(1), 0.0f }; + } + } + + if (m_extruder_offsets.size() < m_result.extruders_count) { + for (size_t i = m_extruder_offsets.size(); i < m_result.extruders_count; ++i) { + m_extruder_offsets.emplace_back(DEFAULT_EXTRUDER_OFFSET); + } + } + + const ConfigOptionStrings* extruder_colour = config.option("extruder_colour"); + if (extruder_colour != nullptr) { + // takes colors from config + m_result.extruder_colors = extruder_colour->values; + // try to replace missing values with filament colors + const ConfigOptionStrings* filament_colour = config.option("filament_colour"); + if (filament_colour != nullptr && filament_colour->values.size() == m_result.extruder_colors.size()) { + for (size_t i = 0; i < m_result.extruder_colors.size(); ++i) { + if (m_result.extruder_colors[i].empty()) + m_result.extruder_colors[i] = filament_colour->values[i]; + } + } + } + + if (m_result.extruder_colors.size() < m_result.extruders_count) { + for (size_t i = m_result.extruder_colors.size(); i < m_result.extruders_count; ++i) { + m_result.extruder_colors.emplace_back(std::string()); + } + } + + // replace missing values with default + for (size_t i = 0; i < m_result.extruder_colors.size(); ++i) { + if (m_result.extruder_colors[i].empty()) + m_result.extruder_colors[i] = "#FF8000"; + } + + m_extruder_colors.resize(m_result.extruder_colors.size()); + for (size_t i = 0; i < m_result.extruder_colors.size(); ++i) { + m_extruder_colors[i] = static_cast(i); + } + + m_extruder_temps.resize(m_result.extruders_count); + + const ConfigOptionFloats* filament_load_time = config.option("filament_load_time"); + if (filament_load_time != nullptr) { + m_time_processor.filament_load_times.resize(filament_load_time->values.size()); + for (size_t i = 0; i < filament_load_time->values.size(); ++i) { + m_time_processor.filament_load_times[i] = static_cast(filament_load_time->values[i]); + } + } + + const ConfigOptionFloats* filament_unload_time = config.option("filament_unload_time"); + if (filament_unload_time != nullptr) { + m_time_processor.filament_unload_times.resize(filament_unload_time->values.size()); + for (size_t i = 0; i < filament_unload_time->values.size(); ++i) { + m_time_processor.filament_unload_times[i] = static_cast(filament_unload_time->values[i]); + } + } + + // With MM setups like Prusa MMU2, the filaments may be expected to be parked at the beginning. + // Remember the parking position so the initial load is not included in filament estimate. + const ConfigOptionBool* single_extruder_multi_material = config.option("single_extruder_multi_material"); + const ConfigOptionBool* wipe_tower = config.option("wipe_tower"); + const ConfigOptionFloat* parking_pos_retraction = config.option("parking_pos_retraction"); + const ConfigOptionFloat* extra_loading_move = config.option("extra_loading_move"); + + m_single_extruder_multi_material = single_extruder_multi_material != nullptr && single_extruder_multi_material->value; + + if (m_single_extruder_multi_material && wipe_tower != nullptr && parking_pos_retraction != nullptr && extra_loading_move != nullptr) { + if (m_single_extruder_multi_material && m_result.extruders_count > 1 && wipe_tower->value) { + m_parking_position = float(parking_pos_retraction->value); + m_extra_loading_move = float(extra_loading_move->value); + } + } + + bool use_machine_limits = false; + const ConfigOptionEnum* machine_limits_usage = config.option>("machine_limits_usage"); + if (machine_limits_usage != nullptr) + use_machine_limits = machine_limits_usage->value != MachineLimitsUsage::Ignore; + + if (use_machine_limits && (m_flavor == gcfMarlinLegacy || m_flavor == gcfMarlinFirmware || m_flavor == gcfRepRapFirmware || m_flavor == gcfKlipper)) { + const ConfigOptionFloats* machine_max_acceleration_x = config.option("machine_max_acceleration_x"); + if (machine_max_acceleration_x != nullptr) + m_time_processor.machine_limits.machine_max_acceleration_x.values = machine_max_acceleration_x->values; + + const ConfigOptionFloats* machine_max_acceleration_y = config.option("machine_max_acceleration_y"); + if (machine_max_acceleration_y != nullptr) + m_time_processor.machine_limits.machine_max_acceleration_y.values = machine_max_acceleration_y->values; + + const ConfigOptionFloats* machine_max_acceleration_z = config.option("machine_max_acceleration_z"); + if (machine_max_acceleration_z != nullptr) + m_time_processor.machine_limits.machine_max_acceleration_z.values = machine_max_acceleration_z->values; + + const ConfigOptionFloats* machine_max_acceleration_e = config.option("machine_max_acceleration_e"); + if (machine_max_acceleration_e != nullptr) + m_time_processor.machine_limits.machine_max_acceleration_e.values = machine_max_acceleration_e->values; + + const ConfigOptionFloats* machine_max_feedrate_x = config.option("machine_max_feedrate_x"); + if (machine_max_feedrate_x != nullptr) + m_time_processor.machine_limits.machine_max_feedrate_x.values = machine_max_feedrate_x->values; + + const ConfigOptionFloats* machine_max_feedrate_y = config.option("machine_max_feedrate_y"); + if (machine_max_feedrate_y != nullptr) + m_time_processor.machine_limits.machine_max_feedrate_y.values = machine_max_feedrate_y->values; + + const ConfigOptionFloats* machine_max_feedrate_z = config.option("machine_max_feedrate_z"); + if (machine_max_feedrate_z != nullptr) + m_time_processor.machine_limits.machine_max_feedrate_z.values = machine_max_feedrate_z->values; + + const ConfigOptionFloats* machine_max_feedrate_e = config.option("machine_max_feedrate_e"); + if (machine_max_feedrate_e != nullptr) + m_time_processor.machine_limits.machine_max_feedrate_e.values = machine_max_feedrate_e->values; + + const ConfigOptionFloats* machine_max_jerk_x = config.option("machine_max_jerk_x"); + if (machine_max_jerk_x != nullptr) + m_time_processor.machine_limits.machine_max_jerk_x.values = machine_max_jerk_x->values; + + const ConfigOptionFloats* machine_max_jerk_y = config.option("machine_max_jerk_y"); + if (machine_max_jerk_y != nullptr) + m_time_processor.machine_limits.machine_max_jerk_y.values = machine_max_jerk_y->values; + + const ConfigOptionFloats* machine_max_jerk_z = config.option("machine_max_jerkz"); + if (machine_max_jerk_z != nullptr) + m_time_processor.machine_limits.machine_max_jerk_z.values = machine_max_jerk_z->values; + + const ConfigOptionFloats* machine_max_jerk_e = config.option("machine_max_jerk_e"); + if (machine_max_jerk_e != nullptr) + m_time_processor.machine_limits.machine_max_jerk_e.values = machine_max_jerk_e->values; + + const ConfigOptionFloats* machine_max_acceleration_extruding = config.option("machine_max_acceleration_extruding"); + if (machine_max_acceleration_extruding != nullptr) + m_time_processor.machine_limits.machine_max_acceleration_extruding.values = machine_max_acceleration_extruding->values; + + const ConfigOptionFloats* machine_max_acceleration_retracting = config.option("machine_max_acceleration_retracting"); + if (machine_max_acceleration_retracting != nullptr) + m_time_processor.machine_limits.machine_max_acceleration_retracting.values = machine_max_acceleration_retracting->values; + + + // Legacy Marlin and Klipper don't have separate travel acceleration, they use the 'extruding' value instead. + const ConfigOptionFloats* machine_max_acceleration_travel = config.option((m_flavor == gcfMarlinLegacy || m_flavor == gcfKlipper) + ? "machine_max_acceleration_extruding" + : "machine_max_acceleration_travel"); + if (machine_max_acceleration_travel != nullptr) + m_time_processor.machine_limits.machine_max_acceleration_travel.values = machine_max_acceleration_travel->values; + + + const ConfigOptionFloats* machine_min_extruding_rate = config.option("machine_min_extruding_rate"); + if (machine_min_extruding_rate != nullptr) { + m_time_processor.machine_limits.machine_min_extruding_rate.values = machine_min_extruding_rate->values; + if (m_flavor == gcfRepRapFirmware) { + // RRF does not support setting min feedrates. Set zero. + m_time_processor.machine_limits.machine_min_extruding_rate.values.assign(m_time_processor.machine_limits.machine_min_extruding_rate.size(), 0.); + } + } + + const ConfigOptionFloats* machine_min_travel_rate = config.option("machine_min_travel_rate"); + if (machine_min_travel_rate != nullptr) { + m_time_processor.machine_limits.machine_min_travel_rate.values = machine_min_travel_rate->values; + if (m_flavor == gcfRepRapFirmware) { + // RRF does not support setting min feedrates. Set zero. + m_time_processor.machine_limits.machine_min_travel_rate.values.assign(m_time_processor.machine_limits.machine_min_travel_rate.size(), 0.); + } + } + } + + for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { + float max_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_extruding, i); + m_time_processor.machines[i].max_acceleration = max_acceleration; + m_time_processor.machines[i].acceleration = (max_acceleration > 0.0f) ? max_acceleration : DEFAULT_ACCELERATION; + float max_retract_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_retracting, i); + m_time_processor.machines[i].max_retract_acceleration = max_retract_acceleration; + m_time_processor.machines[i].retract_acceleration = (max_retract_acceleration > 0.0f) ? max_retract_acceleration : DEFAULT_RETRACT_ACCELERATION; + float max_travel_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_travel, i); + m_time_processor.machines[i].max_travel_acceleration = max_travel_acceleration; + m_time_processor.machines[i].travel_acceleration = (max_travel_acceleration > 0.0f) ? max_travel_acceleration : DEFAULT_TRAVEL_ACCELERATION; + } + + if (m_flavor == gcfMarlinLegacy || m_flavor == gcfMarlinFirmware) { // No Klipper here, it does not support silent mode. + const ConfigOptionBool* silent_mode = config.option("silent_mode"); + if (silent_mode != nullptr) { + if (silent_mode->value && m_time_processor.machine_limits.machine_max_acceleration_x.values.size() > 1) + enable_stealth_time_estimator(true); + } + } + + const ConfigOptionBool* use_volumetric_e = config.option("use_volumetric_e"); + if (use_volumetric_e != nullptr) + m_use_volumetric_e = use_volumetric_e->value; + + const ConfigOptionFloatOrPercent* first_layer_height = config.option("first_layer_height"); + if (first_layer_height != nullptr) + m_first_layer_height = std::abs(first_layer_height->value); + + const ConfigOptionFloat* max_print_height = config.option("max_print_height"); + if (max_print_height != nullptr) + m_result.max_print_height = max_print_height->value; + + const ConfigOptionBool* spiral_vase = config.option("spiral_vase"); + if (spiral_vase != nullptr) + m_spiral_vase_active = spiral_vase->value; + + const ConfigOptionFloat* z_offset = config.option("z_offset"); + if (z_offset != nullptr) + m_z_offset = z_offset->value; +} + +void GCodeProcessor::enable_stealth_time_estimator(bool enabled) +{ + m_time_processor.machines[static_cast(PrintEstimatedStatistics::ETimeMode::Stealth)].enabled = enabled; +} + +void GCodeProcessor::reset() +{ + m_units = EUnits::Millimeters; + m_global_positioning_type = EPositioningType::Absolute; + m_e_local_positioning_type = EPositioningType::Absolute; + m_extruder_offsets = std::vector(MIN_EXTRUDERS_COUNT, Vec3f::Zero()); + m_flavor = gcfRepRapSprinter; + + m_start_position = { 0.0f, 0.0f, 0.0f, 0.0f }; + m_end_position = { 0.0f, 0.0f, 0.0f, 0.0f }; + m_saved_position = { 0.0f, 0.0f, 0.0f, 0.0f }; + m_origin = { 0.0f, 0.0f, 0.0f, 0.0f }; + m_cached_position.reset(); + m_wiping = false; + + m_line_id = 0; + m_last_line_id = 0; + m_feedrate = 0.0f; + m_feed_multiply.reset(); + m_width = 0.0f; + m_height = 0.0f; + m_forced_width = 0.0f; + m_forced_height = 0.0f; + m_mm3_per_mm = 0.0f; + m_fan_speed = 0.0f; + m_z_offset = 0.0f; + + m_extrusion_role = GCodeExtrusionRole::None; + m_extruder_id = 0; + m_extruder_colors.resize(MIN_EXTRUDERS_COUNT); + for (size_t i = 0; i < MIN_EXTRUDERS_COUNT; ++i) { + m_extruder_colors[i] = static_cast(i); + } + m_extruder_temps.resize(MIN_EXTRUDERS_COUNT); + for (size_t i = 0; i < MIN_EXTRUDERS_COUNT; ++i) { + m_extruder_temps[i] = 0.0f; + } + + m_parking_position = 0.f; + m_extra_loading_move = 0.f; + m_extruded_last_z = 0.0f; + m_first_layer_height = 0.0f; + m_g1_line_id = 0; + m_layer_id = 0; + m_cp_color.reset(); + + m_producer = EProducer::Unknown; + + m_time_processor.reset(); + m_used_filaments.reset(); + + m_result.reset(); + m_result.id = ++s_result_id; + + m_use_volumetric_e = false; + m_last_default_color_id = 0; + + m_options_z_corrector.reset(); + + m_spiral_vase_active = false; + m_kissslicer_toolchange_time_correction = 0.0f; + + m_single_extruder_multi_material = false; + +#if ENABLE_GCODE_VIEWER_DATA_CHECKING + m_mm3_per_mm_compare.reset(); + m_height_compare.reset(); + m_width_compare.reset(); +#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING +} + +static inline const char* skip_whitespaces(const char *begin, const char *end) { + for (; begin != end && (*begin == ' ' || *begin == '\t'); ++ begin); + return begin; +} + +static inline const char* remove_eols(const char *begin, const char *end) { + for (; begin != end && (*(end - 1) == '\r' || *(end - 1) == '\n'); -- end); + return end; +} + +// Load a G-code into a stand-alone G-code viewer. +// throws CanceledException through print->throw_if_canceled() (sent by the caller as callback). +void GCodeProcessor::process_file(const std::string& filename, std::function cancel_callback) +{ + CNumericLocalesSetter locales_setter; + +#if ENABLE_GCODE_VIEWER_STATISTICS + m_start_time = std::chrono::high_resolution_clock::now(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + // pre-processing + // parse the gcode file to detect its producer + { + m_parser.parse_file_raw(filename, [this](GCodeReader& reader, const char *begin, const char *end) { + begin = skip_whitespaces(begin, end); + if (begin != end && *begin == ';') { + // Comment. + begin = skip_whitespaces(++ begin, end); + end = remove_eols(begin, end); + if (begin != end && detect_producer(std::string_view(begin, end - begin))) + m_parser.quit_parsing(); + } + }); + m_parser.reset(); + + // if the gcode was produced by PrusaSlicer, + // extract the config from it + if (m_producer == EProducer::PrusaSlicer || m_producer == EProducer::Slic3rPE || m_producer == EProducer::Slic3r) { + DynamicPrintConfig config; + config.apply(FullPrintConfig::defaults()); + // Silently substitute unknown values by new ones for loading configurations from PrusaSlicer's own G-code. + // Showing substitution log or errors may make sense, but we are not really reading many values from the G-code config, + // thus a probability of incorrect substitution is low and the G-code viewer is a consumer-only anyways. + config.load_from_gcode_file(filename, ForwardCompatibilitySubstitutionRule::EnableSilent); + apply_config(config); + } + else { + m_result.extruder_colors = DEFAULT_EXTRUDER_COLORS; + + if (m_producer == EProducer::Simplify3D) + apply_config_simplify3d(filename); + else if (m_producer == EProducer::SuperSlicer) + apply_config_superslicer(filename); + else if (m_producer == EProducer::KissSlicer) + apply_config_kissslicer(filename); + } + } + + // process gcode + m_result.filename = filename; + m_result.id = ++s_result_id; + // 1st move must be a dummy move + m_result.moves.emplace_back(GCodeProcessorResult::MoveVertex()); + size_t parse_line_callback_cntr = 10000; + m_parser.parse_file(filename, [this, cancel_callback, &parse_line_callback_cntr](GCodeReader& reader, const GCodeReader::GCodeLine& line) { + if (-- parse_line_callback_cntr == 0) { + // Don't call the cancel_callback() too often, do it every at every 10000'th line. + parse_line_callback_cntr = 10000; + if (cancel_callback) + cancel_callback(); + } + this->process_gcode_line(line, true); + }, m_result.lines_ends); + + // Don't post-process the G-code to update time stamps. + this->finalize(false); +} + +void GCodeProcessor::initialize(const std::string& filename) +{ + assert(is_decimal_separator_point()); + +#if ENABLE_GCODE_VIEWER_STATISTICS + m_start_time = std::chrono::high_resolution_clock::now(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + // process gcode + m_result.filename = filename; + m_result.id = ++s_result_id; + // 1st move must be a dummy move + m_result.moves.emplace_back(GCodeProcessorResult::MoveVertex()); +} + +void GCodeProcessor::process_buffer(const std::string &buffer) +{ + //FIXME maybe cache GCodeLine gline to be over multiple parse_buffer() invocations. + m_parser.parse_buffer(buffer, [this](GCodeReader&, const GCodeReader::GCodeLine& line) { + this->process_gcode_line(line, false); + }); +} + +void GCodeProcessor::finalize(bool perform_post_process) +{ + // update width/height of wipe moves + for (GCodeProcessorResult::MoveVertex& move : m_result.moves) { + if (move.type == EMoveType::Wipe) { + move.width = Wipe_Width; + move.height = Wipe_Height; + } + } + + // process the time blocks + for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { + TimeMachine& machine = m_time_processor.machines[i]; + TimeMachine::CustomGCodeTime& gcode_time = machine.gcode_time; + machine.calculate_time(); + if (gcode_time.needed && gcode_time.cache != 0.0f) + gcode_time.times.push_back({ CustomGCode::ColorChange, gcode_time.cache }); + } + + m_used_filaments.process_caches(this); + + update_estimated_times_stats(); + +#if ENABLE_GCODE_VIEWER_DATA_CHECKING + std::cout << "\n"; + m_mm3_per_mm_compare.output(); + m_height_compare.output(); + m_width_compare.output(); +#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING + + if (perform_post_process) + post_process(); +#if ENABLE_GCODE_VIEWER_STATISTICS + m_result.time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - m_start_time).count(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS +} + +float GCodeProcessor::get_time(PrintEstimatedStatistics::ETimeMode mode) const +{ + return (mode < PrintEstimatedStatistics::ETimeMode::Count) ? m_time_processor.machines[static_cast(mode)].time : 0.0f; +} + +std::string GCodeProcessor::get_time_dhm(PrintEstimatedStatistics::ETimeMode mode) const +{ + return (mode < PrintEstimatedStatistics::ETimeMode::Count) ? short_time(get_time_dhms(m_time_processor.machines[static_cast(mode)].time)) : std::string("N/A"); +} + +float GCodeProcessor::get_travel_time(PrintEstimatedStatistics::ETimeMode mode) const +{ + return (mode < PrintEstimatedStatistics::ETimeMode::Count) ? m_time_processor.machines[static_cast(mode)].travel_time : 0.0f; +} + +std::string GCodeProcessor::get_travel_time_dhm(PrintEstimatedStatistics::ETimeMode mode) const +{ + return (mode < PrintEstimatedStatistics::ETimeMode::Count) ? short_time(get_time_dhms(m_time_processor.machines[static_cast(mode)].travel_time)) : std::string("N/A"); +} + +std::vector>> GCodeProcessor::get_custom_gcode_times(PrintEstimatedStatistics::ETimeMode mode, bool include_remaining) const +{ + std::vector>> ret; + if (mode < PrintEstimatedStatistics::ETimeMode::Count) { + const TimeMachine& machine = m_time_processor.machines[static_cast(mode)]; + float total_time = 0.0f; + for (const auto& [type, time] : machine.gcode_time.times) { + float remaining = include_remaining ? machine.time - total_time : 0.0f; + ret.push_back({ type, { time, remaining } }); + total_time += time; + } + } + return ret; +} + +std::vector> GCodeProcessor::get_moves_time(PrintEstimatedStatistics::ETimeMode mode) const +{ + std::vector> ret; + if (mode < PrintEstimatedStatistics::ETimeMode::Count) { + for (size_t i = 0; i < m_time_processor.machines[static_cast(mode)].moves_time.size(); ++i) { + float time = m_time_processor.machines[static_cast(mode)].moves_time[i]; + if (time > 0.0f) + ret.push_back({ static_cast(i), time }); + } + } + return ret; +} + +std::vector> GCodeProcessor::get_roles_time(PrintEstimatedStatistics::ETimeMode mode) const +{ + std::vector> ret; + if (mode < PrintEstimatedStatistics::ETimeMode::Count) { + for (size_t i = 0; i < m_time_processor.machines[static_cast(mode)].roles_time.size(); ++i) { + float time = m_time_processor.machines[static_cast(mode)].roles_time[i]; + if (time > 0.0f) + ret.push_back({ static_cast(i), time }); + } + } + return ret; +} + +ConfigSubstitutions load_from_superslicer_gcode_file(const std::string& filename, DynamicPrintConfig& config, ForwardCompatibilitySubstitutionRule compatibility_rule) +{ + // for reference, see: ConfigBase::load_from_gcode_file() + + boost::nowide::ifstream ifs(filename); + + auto header_end_pos = ifs.tellg(); + ConfigSubstitutionContext substitutions_ctxt(compatibility_rule); + size_t key_value_pairs = 0; + + ifs.seekg(0, ifs.end); + auto file_length = ifs.tellg(); + auto data_length = std::min(65535, file_length - header_end_pos); + ifs.seekg(file_length - data_length, ifs.beg); + std::vector data(size_t(data_length) + 1, 0); + ifs.read(data.data(), data_length); + ifs.close(); + key_value_pairs = ConfigBase::load_from_gcode_string_legacy(config, data.data(), substitutions_ctxt); + + if (key_value_pairs < 80) + throw Slic3r::RuntimeError(format("Suspiciously low number of configuration values extracted from %1%: %2%", filename, key_value_pairs)); + + return std::move(substitutions_ctxt.substitutions); +} + +void GCodeProcessor::apply_config_superslicer(const std::string& filename) +{ + DynamicPrintConfig config; + config.apply(FullPrintConfig::defaults()); + load_from_superslicer_gcode_file(filename, config, ForwardCompatibilitySubstitutionRule::EnableSilent); + apply_config(config); +} + +void GCodeProcessor::apply_config_kissslicer(const std::string& filename) +{ + size_t found_counter = 0; + m_parser.parse_file_raw(filename, [this, &found_counter](GCodeReader& reader, const char* begin, const char* end) { + auto detect_flavor = [this](const std::string_view comment) { + static const std::string search_str = "firmware_type"; + const size_t pos = comment.find(search_str); + if (pos != comment.npos) { + std::vector elements; + boost::split(elements, comment, boost::is_any_of("=")); + if (elements.size() == 2) { + try + { + switch (std::stoi(elements[1])) + { + default: { break; } + case 1: + case 2: + case 3: { m_flavor = gcfMarlinLegacy; break; } + } + return true; + } + catch (...) + { + // invalid data, do nothing + } + } + } + return false; + }; + + auto detect_printer = [this](const std::string_view comment) { + static const std::string search_str = "printer_name"; + const size_t pos = comment.find(search_str); + if (pos != comment.npos) { + std::vector elements; + boost::split(elements, comment, boost::is_any_of("=")); + if (elements.size() == 2) { + elements[1] = boost::to_upper_copy(elements[1]); + if (boost::contains(elements[1], "MK2.5") || boost::contains(elements[1], "MK3")) + m_kissslicer_toolchange_time_correction = 18.0f; // MMU2 + else if (boost::contains(elements[1], "MK2")) + m_kissslicer_toolchange_time_correction = 5.0f; // MMU + } + return true; + } + + return false; + }; + + begin = skip_whitespaces(begin, end); + if (begin != end) { + if (*begin == ';') { + // Comment. + begin = skip_whitespaces(++begin, end); + end = remove_eols(begin, end); + if (begin != end) { + const std::string_view comment(begin, end - begin); + if (detect_flavor(comment) || detect_printer(comment)) + ++found_counter; + } + + // we got the data, + // force early exit to avoid parsing the entire file + if (found_counter == 2) + m_parser.quit_parsing(); + } + else if (*begin == 'M' || *begin == 'G') + // the header has been fully parsed, quit search + m_parser.quit_parsing(); + } + } + ); + m_parser.reset(); +} + +std::vector GCodeProcessor::get_layers_time(PrintEstimatedStatistics::ETimeMode mode) const +{ + return (mode < PrintEstimatedStatistics::ETimeMode::Count) ? + m_time_processor.machines[static_cast(mode)].layers_time : + std::vector(); +} + +void GCodeProcessor::apply_config_simplify3d(const std::string& filename) +{ + struct BedSize + { + double x{ 0.0 }; + double y{ 0.0 }; + + bool is_defined() const { return x > 0.0 && y > 0.0; } + }; + + BedSize bed_size; + bool producer_detected = false; + + m_parser.parse_file_raw(filename, [this, &bed_size, &producer_detected](GCodeReader& reader, const char* begin, const char* end) { + + auto extract_double = [](const std::string_view cmt, const std::string& key, double& out) { + size_t pos = cmt.find(key); + if (pos != cmt.npos) { + pos = cmt.find(',', pos); + if (pos != cmt.npos) { + out = string_to_double_decimal_point(cmt.substr(pos+1)); + return true; + } + } + return false; + }; + + auto extract_floats = [](const std::string_view cmt, const std::string& key, std::vector& out) { + size_t pos = cmt.find(key); + if (pos != cmt.npos) { + pos = cmt.find(',', pos); + if (pos != cmt.npos) { + const std::string_view data_str = cmt.substr(pos + 1); + std::vector values_str; + boost::split(values_str, data_str, boost::is_any_of("|,"), boost::token_compress_on); + for (const std::string& s : values_str) { + out.emplace_back(static_cast(string_to_double_decimal_point(s))); + } + return true; + } + } + return false; + }; + + begin = skip_whitespaces(begin, end); + end = remove_eols(begin, end); + if (begin != end) { + if (*begin == ';') { + // Comment. + begin = skip_whitespaces(++ begin, end); + if (begin != end) { + std::string_view comment(begin, end - begin); + if (producer_detected) { + if (bed_size.x == 0.0 && comment.find("strokeXoverride") != comment.npos) + extract_double(comment, "strokeXoverride", bed_size.x); + else if (bed_size.y == 0.0 && comment.find("strokeYoverride") != comment.npos) + extract_double(comment, "strokeYoverride", bed_size.y); + else if (comment.find("filamentDiameters") != comment.npos) { + m_result.filament_diameters.clear(); + extract_floats(comment, "filamentDiameters", m_result.filament_diameters); + } else if (comment.find("filamentDensities") != comment.npos) { + m_result.filament_densities.clear(); + extract_floats(comment, "filamentDensities", m_result.filament_densities); + } + else if (comment.find("filamentPricesPerKg") != comment.npos) { + m_result.filament_cost.clear(); + extract_floats(comment, "filamentPricesPerKg", m_result.filament_cost); + } else if (comment.find("extruderDiameter") != comment.npos) { + std::vector extruder_diameters; + extract_floats(comment, "extruderDiameter", extruder_diameters); + m_result.extruders_count = extruder_diameters.size(); + } + } else if (boost::starts_with(comment, "G-Code generated by Simplify3D(R)")) + producer_detected = true; + } + } else { + // Some non-empty G-code line detected, stop parsing config comments. + reader.quit_parsing(); + } + } + }); + + if (m_result.extruders_count == 0) + m_result.extruders_count = std::max(1, std::min(m_result.filament_diameters.size(), + std::min(m_result.filament_densities.size(), m_result.filament_cost.size()))); + + if (bed_size.is_defined()) { + m_result.bed_shape = { + { 0.0, 0.0 }, + { bed_size.x, 0.0 }, + { bed_size.x, bed_size.y }, + { 0.0, bed_size.y } + }; + } +} + +void GCodeProcessor::process_gcode_line(const GCodeReader::GCodeLine& line, bool producers_enabled) +{ +/* std::cout << line.raw() << std::endl; */ + + ++m_line_id; + + // update start position + m_start_position = m_end_position; + + const std::string_view cmd = line.cmd(); + if (cmd.length() > 1) { + // process command lines + switch (cmd[0]) + { + case 'g': + case 'G': + switch (cmd.size()) { + case 2: + switch (cmd[1]) { + case '0': { process_G0(line); break; } // Move + case '1': { process_G1(line); break; } // Move + case '2': { process_G2_G3(line, true); break; } // CW Arc Move + case '3': { process_G2_G3(line, false); break; } // CCW Arc Move + default: break; + } + break; + case 3: + switch (cmd[1]) { + case '1': + switch (cmd[2]) { + case '0': { process_G10(line); break; } // Retract or Set tool temperature + case '1': { process_G11(line); break; } // Unretract + default: break; + } + break; + case '2': + switch (cmd[2]) { + case '0': { process_G20(line); break; } // Set Units to Inches + case '1': { process_G21(line); break; } // Set Units to Millimeters + case '2': { process_G22(line); break; } // Firmware controlled retract + case '3': { process_G23(line); break; } // Firmware controlled unretract + case '8': { process_G28(line); break; } // Move to origin + default: break; + } + break; + case '6': + switch (cmd[2]) { + case '0': { process_G60(line); break; } // Save Current Position + case '1': { process_G61(line); break; } // Return to Saved Position + default: break; + } + break; + case '9': + switch (cmd[2]) { + case '0': { process_G90(line); break; } // Set to Absolute Positioning + case '1': { process_G91(line); break; } // Set to Relative Positioning + case '2': { process_G92(line); break; } // Set Position + default: break; + } + break; + } + break; + default: + break; + } + break; + case 'm': + case 'M': + switch (cmd.size()) { + case 2: + switch (cmd[1]) { + case '1': { process_M1(line); break; } // Sleep or Conditional stop + default: break; + } + break; + case 3: + switch (cmd[1]) { + case '8': + switch (cmd[2]) { + case '2': { process_M82(line); break; } // Set extruder to absolute mode + case '3': { process_M83(line); break; } // Set extruder to relative mode + default: break; + } + break; + default: + break; + } + break; + case 4: + switch (cmd[1]) { + case '1': + switch (cmd[2]) { + case '0': + switch (cmd[3]) { + case '4': { process_M104(line); break; } // Set extruder temperature + case '6': { process_M106(line); break; } // Set fan speed + case '7': { process_M107(line); break; } // Disable fan + case '8': { process_M108(line); break; } // Set tool (Sailfish) + case '9': { process_M109(line); break; } // Set extruder temperature and wait + default: break; + } + break; + case '3': + switch (cmd[3]) { + case '2': { process_M132(line); break; } // Recall stored home offsets + case '5': { process_M135(line); break; } // Set tool (MakerWare) + default: break; + } + break; + default: + break; + } + break; + case '2': + switch (cmd[2]) { + case '0': + switch (cmd[3]) { + case '1': { process_M201(line); break; } // Set max printing acceleration + case '3': { process_M203(line); break; } // Set maximum feedrate + case '4': { process_M204(line); break; } // Set default acceleration + case '5': { process_M205(line); break; } // Advanced settings + default: break; + } + break; + case '2': + switch (cmd[3]) { + case '0': { process_M220(line); break; } // Set Feedrate Percentage + case '1': { process_M221(line); break; } // Set extrude factor override percentage + default: break; + } + break; + default: + break; + } + break; + case '4': + switch (cmd[2]) { + case '0': + switch (cmd[3]) { + case '1': { process_M401(line); break; } // Repetier: Store x, y and z position + case '2': { process_M402(line); break; } // Repetier: Go to stored position + default: break; + } + break; + default: + break; + } + break; + case '5': + switch (cmd[2]) { + case '6': + switch (cmd[3]) { + case '6': { process_M566(line); break; } // Set allowable instantaneous speed change + default: break; + } + break; + default: + break; + } + break; + case '7': + switch (cmd[2]) { + case '0': + switch (cmd[3]) { + case '2': { process_M702(line); break; } // Unload the current filament into the MK3 MMU2 unit at the end of print. + default: break; + } + break; + default: + break; + } + break; + default: + break; + } + break; + default: + break; + } + break; + case 't': + case 'T': + process_T(line); // Select Tool + break; + default: + break; + } + } + else { + const std::string &comment = line.raw(); + if (comment.length() > 2 && comment.front() == ';') + // Process tags embedded into comments. Tag comments always start at the start of a line + // with a comment and continue with a tag without any whitespace separator. + process_tags(comment.substr(1), producers_enabled); + } +} + +#if __has_include() + template + struct is_from_chars_convertible : std::false_type {}; + template + struct is_from_chars_convertible(), std::declval(), std::declval()))>> : std::true_type {}; +#endif + +// Returns true if the number was parsed correctly into out and the number spanned the whole input string. +template +[[nodiscard]] static inline bool parse_number(const std::string_view sv, T &out) +{ + // https://www.bfilipek.com/2019/07/detect-overload-from-chars.html#example-stdfromchars +#if __has_include() + // Visual Studio 19 supports from_chars all right. + // OSX compiler that we use only implements std::from_chars just for ints. + // GCC that we compile on does not provide at all. + if constexpr (is_from_chars_convertible::value) { + auto str_end = sv.data() + sv.size(); + auto [end_ptr, error_code] = std::from_chars(sv.data(), str_end, out); + return error_code == std::errc() && end_ptr == str_end; + } + else +#endif + { + // Legacy conversion, which is costly due to having to make a copy of the string before conversion. + try { + assert(sv.size() < 1024); + assert(sv.data() != nullptr); + std::string str { sv }; + size_t read = 0; + if constexpr (std::is_same_v) + out = std::stoi(str, &read); + else if constexpr (std::is_same_v) + out = std::stol(str, &read); + else if constexpr (std::is_same_v) + out = string_to_double_decimal_point(str, &read); + else if constexpr (std::is_same_v) + out = string_to_double_decimal_point(str, &read); + return str.size() == read; + } catch (...) { + return false; + } + } +} + +void GCodeProcessor::process_tags(const std::string_view comment, bool producers_enabled) +{ + // producers tags + if (producers_enabled && process_producers_tags(comment)) + return; + + // extrusion role tag + if (boost::starts_with(comment, reserved_tag(ETags::Role))) { + set_extrusion_role(string_to_gcode_extrusion_role(comment.substr(reserved_tag(ETags::Role).length()))); + if (m_extrusion_role == GCodeExtrusionRole::ExternalPerimeter) + m_seams_detector.activate(true); + return; + } + + // wipe start tag + if (boost::starts_with(comment, reserved_tag(ETags::Wipe_Start))) { + m_wiping = true; + return; + } + + // wipe end tag + if (boost::starts_with(comment, reserved_tag(ETags::Wipe_End))) { + m_wiping = false; + return; + } + + if (!producers_enabled || m_producer == EProducer::PrusaSlicer) { + // height tag + if (boost::starts_with(comment, reserved_tag(ETags::Height))) { + if (!parse_number(comment.substr(reserved_tag(ETags::Height).size()), m_forced_height)) + BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ")."; + return; + } + // width tag + if (boost::starts_with(comment, reserved_tag(ETags::Width))) { + if (!parse_number(comment.substr(reserved_tag(ETags::Width).size()), m_forced_width)) + BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Width (" << comment << ")."; + return; + } + } + + // color change tag + if (boost::starts_with(comment, reserved_tag(ETags::Color_Change))) { + unsigned char extruder_id = 0; + static std::vector Default_Colors = { + "#0B2C7A", // { 0.043f, 0.173f, 0.478f }, // bluish + "#1C8891", // { 0.110f, 0.533f, 0.569f }, + "#AAF200", // { 0.667f, 0.949f, 0.000f }, + "#F5CE0A", // { 0.961f, 0.808f, 0.039f }, + "#D16830", // { 0.820f, 0.408f, 0.188f }, + "#942616", // { 0.581f, 0.149f, 0.087f } // reddish + }; + + std::string color = Default_Colors[0]; + auto is_valid_color = [](const std::string& color) { + auto is_hex_digit = [](char c) { + return ((c >= '0' && c <= '9') || + (c >= 'A' && c <= 'F') || + (c >= 'a' && c <= 'f')); + }; + + if (color[0] != '#' || color.length() != 7) + return false; + for (int i = 1; i <= 6; ++i) { + if (!is_hex_digit(color[i])) + return false; + } + return true; + }; + + std::vector tokens; + boost::split(tokens, comment, boost::is_any_of(","), boost::token_compress_on); + if (tokens.size() > 1) { + if (tokens[1][0] == 'T') { + int eid; + if (!parse_number(tokens[1].substr(1), eid) || eid < 0 || eid > 255) { + BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Color_Change (" << comment << ")."; + return; + } + extruder_id = static_cast(eid); + } + } + if (tokens.size() > 2) { + if (is_valid_color(tokens[2])) + color = tokens[2]; + } + else { + color = Default_Colors[m_last_default_color_id]; + ++m_last_default_color_id; + if (m_last_default_color_id == Default_Colors.size()) + m_last_default_color_id = 0; + } + + if (extruder_id < m_extruder_colors.size()) + m_extruder_colors[extruder_id] = static_cast(m_extruder_offsets.size()) + m_cp_color.counter; // color_change position in list of color for preview + ++m_cp_color.counter; + if (m_cp_color.counter == UCHAR_MAX) + m_cp_color.counter = 0; + + if (m_extruder_id == extruder_id) { + m_cp_color.current = m_extruder_colors[extruder_id]; + store_move_vertex(EMoveType::Color_change); + CustomGCode::Item item = { static_cast(m_end_position[2]), CustomGCode::ColorChange, extruder_id + 1, color, "" }; + m_result.custom_gcode_per_print_z.emplace_back(item); + m_options_z_corrector.set(); + process_custom_gcode_time(CustomGCode::ColorChange); + process_filaments(CustomGCode::ColorChange); + } + + return; + } + + // pause print tag + if (comment == reserved_tag(ETags::Pause_Print)) { + store_move_vertex(EMoveType::Pause_Print); + CustomGCode::Item item = { static_cast(m_end_position[2]), CustomGCode::PausePrint, m_extruder_id + 1, "", "" }; + m_result.custom_gcode_per_print_z.emplace_back(item); + m_options_z_corrector.set(); + process_custom_gcode_time(CustomGCode::PausePrint); + return; + } + + // custom code tag + if (comment == reserved_tag(ETags::Custom_Code)) { + store_move_vertex(EMoveType::Custom_GCode); + CustomGCode::Item item = { static_cast(m_end_position[2]), CustomGCode::Custom, m_extruder_id + 1, "", "" }; + m_result.custom_gcode_per_print_z.emplace_back(item); + m_options_z_corrector.set(); + return; + } + + // layer change tag + if (comment == reserved_tag(ETags::Layer_Change)) { + ++m_layer_id; + if (m_spiral_vase_active) { + if (m_result.moves.empty() || m_result.spiral_vase_layers.empty()) + // add a placeholder for layer height. the actual value will be set inside process_G1() method + m_result.spiral_vase_layers.push_back({ FLT_MAX, { 0, 0 } }); + else { + const size_t move_id = m_result.moves.size() - 1; + if (!m_result.spiral_vase_layers.empty()) + m_result.spiral_vase_layers.back().second.second = move_id; + // add a placeholder for layer height. the actual value will be set inside process_G1() method + m_result.spiral_vase_layers.push_back({ FLT_MAX, { move_id, move_id } }); + } + } + return; + } + +#if ENABLE_GCODE_VIEWER_DATA_CHECKING + // mm3_per_mm print tag + if (boost::starts_with(comment, Mm3_Per_Mm_Tag)) { + if (! parse_number(comment.substr(Mm3_Per_Mm_Tag.size()), m_mm3_per_mm_compare.last_tag_value)) + BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Mm3_Per_Mm (" << comment << ")."; + return; + } +#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING +} + +bool GCodeProcessor::process_producers_tags(const std::string_view comment) +{ + switch (m_producer) + { + case EProducer::Slic3rPE: + case EProducer::Slic3r: + case EProducer::SuperSlicer: + case EProducer::PrusaSlicer: { return process_prusaslicer_tags(comment); } + case EProducer::Cura: { return process_cura_tags(comment); } + case EProducer::Simplify3D: { return process_simplify3d_tags(comment); } + case EProducer::CraftWare: { return process_craftware_tags(comment); } + case EProducer::ideaMaker: { return process_ideamaker_tags(comment); } + case EProducer::KissSlicer: { return process_kissslicer_tags(comment); } + case EProducer::BambuStudio: { return process_bambustudio_tags(comment); } + default: { return false; } + } +} + +bool GCodeProcessor::process_prusaslicer_tags(const std::string_view comment) +{ + return false; +} + +bool GCodeProcessor::process_cura_tags(const std::string_view comment) +{ + // TYPE -> extrusion role + std::string tag = "TYPE:"; + size_t pos = comment.find(tag); + if (pos != comment.npos) { + const std::string_view type = comment.substr(pos + tag.length()); + if (type == "SKIRT") + set_extrusion_role(GCodeExtrusionRole::Skirt); + else if (type == "WALL-OUTER") + set_extrusion_role(GCodeExtrusionRole::ExternalPerimeter); + else if (type == "WALL-INNER") + set_extrusion_role(GCodeExtrusionRole::Perimeter); + else if (type == "SKIN") + set_extrusion_role(GCodeExtrusionRole::SolidInfill); + else if (type == "FILL") + set_extrusion_role(GCodeExtrusionRole::InternalInfill); + else if (type == "SUPPORT") + set_extrusion_role(GCodeExtrusionRole::SupportMaterial); + else if (type == "SUPPORT-INTERFACE") + set_extrusion_role(GCodeExtrusionRole::SupportMaterialInterface); + else if (type == "PRIME-TOWER") + set_extrusion_role(GCodeExtrusionRole::WipeTower); + else { + set_extrusion_role(GCodeExtrusionRole::None); + BOOST_LOG_TRIVIAL(warning) << "GCodeProcessor found unknown extrusion role: " << type; + } + + if (m_extrusion_role == GCodeExtrusionRole::ExternalPerimeter) + m_seams_detector.activate(true); + + return true; + } + + // flavor + tag = "FLAVOR:"; + pos = comment.find(tag); + if (pos != comment.npos) { + const std::string_view flavor = comment.substr(pos + tag.length()); + if (flavor == "BFB") + m_flavor = gcfMarlinLegacy; // is this correct ? + else if (flavor == "Mach3") + m_flavor = gcfMach3; + else if (flavor == "Makerbot") + m_flavor = gcfMakerWare; + else if (flavor == "UltiGCode") + m_flavor = gcfMarlinLegacy; // is this correct ? + else if (flavor == "Marlin(Volumetric)") + m_flavor = gcfMarlinLegacy; // is this correct ? + else if (flavor == "Griffin") + m_flavor = gcfMarlinLegacy; // is this correct ? + else if (flavor == "Repetier") + m_flavor = gcfRepetier; + else if (flavor == "RepRap") + m_flavor = gcfRepRapFirmware; + else if (flavor == "Marlin") + m_flavor = gcfMarlinLegacy; + else + BOOST_LOG_TRIVIAL(warning) << "GCodeProcessor found unknown flavor: " << flavor; + + return true; + } + + // layer + tag = "LAYER:"; + pos = comment.find(tag); + if (pos != comment.npos) { + ++m_layer_id; + return true; + } + + return false; +} + +bool GCodeProcessor::process_simplify3d_tags(const std::string_view comment) +{ + // extrusion roles + + // in older versions the comments did not contain the key 'feature' + std::string_view cmt = comment; + size_t pos = cmt.find(" feature"); + if (pos == 0) + cmt.remove_prefix(8); + + // ; skirt + pos = cmt.find(" skirt"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::Skirt); + return true; + } + + // ; outer perimeter + pos = cmt.find(" outer perimeter"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::ExternalPerimeter); + m_seams_detector.activate(true); + return true; + } + + // ; inner perimeter + pos = cmt.find(" inner perimeter"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::Perimeter); + return true; + } + + // ; gap fill + pos = cmt.find(" gap fill"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::GapFill); + return true; + } + + // ; infill + pos = cmt.find(" infill"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::InternalInfill); + return true; + } + + // ; solid layer + pos = cmt.find(" solid layer"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::SolidInfill); + return true; + } + + // ; bridge + pos = cmt.find(" bridge"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::BridgeInfill); + return true; + } + + // ; support + pos = cmt.find(" support"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::SupportMaterial); + return true; + } + + // ; dense support + pos = cmt.find(" dense support"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::SupportMaterialInterface); + return true; + } + + // ; prime pillar + pos = cmt.find(" prime pillar"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::WipeTower); + return true; + } + + // ; ooze shield + pos = cmt.find(" ooze shield"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::None); // Missing mapping + return true; + } + + // ; raft + pos = cmt.find(" raft"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::SupportMaterial); + return true; + } + + // ; internal single extrusion + pos = cmt.find(" internal single extrusion"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::None); // Missing mapping + return true; + } + + // geometry + // ; tool + std::string tag = " tool"; + pos = cmt.find(tag); + if (pos == 0) { + const std::string_view data = cmt.substr(pos + tag.length()); + std::string h_tag = "H"; + size_t h_start = data.find(h_tag); + size_t h_end = data.find_first_of(' ', h_start); + std::string w_tag = "W"; + size_t w_start = data.find(w_tag); + size_t w_end = data.find_first_of(' ', w_start); + if (h_start != data.npos) { + if (!parse_number(data.substr(h_start + 1, (h_end != data.npos) ? h_end - h_start - 1 : h_end), m_forced_height)) + BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ")."; + } + if (w_start != data.npos) { + if (!parse_number(data.substr(w_start + 1, (w_end != data.npos) ? w_end - w_start - 1 : w_end), m_forced_width)) + BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Width (" << comment << ")."; + } + + return true; + } + + // ; layer | ;layer + tag = "layer"; + pos = cmt.find(tag); + if (pos == 0 || pos == 1) { + // skip lines "; layer end" + const std::string_view data = cmt.substr(pos + tag.length()); + size_t end_start = data.find("end"); + if (end_start == data.npos) + ++m_layer_id; + + return true; + } + + return false; +} + +bool GCodeProcessor::process_craftware_tags(const std::string_view comment) +{ + // segType -> extrusion role + std::string tag = "segType:"; + size_t pos = comment.find(tag); + if (pos != comment.npos) { + const std::string_view type = comment.substr(pos + tag.length()); + if (type == "Skirt") + set_extrusion_role(GCodeExtrusionRole::Skirt); + else if (type == "Perimeter") + set_extrusion_role(GCodeExtrusionRole::ExternalPerimeter); + else if (type == "HShell") + set_extrusion_role(GCodeExtrusionRole::None); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + else if (type == "InnerHair") + set_extrusion_role(GCodeExtrusionRole::None); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + else if (type == "Loop") + set_extrusion_role(GCodeExtrusionRole::None); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + else if (type == "Infill") + set_extrusion_role(GCodeExtrusionRole::InternalInfill); + else if (type == "Raft") + set_extrusion_role(GCodeExtrusionRole::Skirt); + else if (type == "Support") + set_extrusion_role(GCodeExtrusionRole::SupportMaterial); + else if (type == "SupportTouch") + set_extrusion_role(GCodeExtrusionRole::SupportMaterial); + else if (type == "SoftSupport") + set_extrusion_role(GCodeExtrusionRole::SupportMaterialInterface); + else if (type == "Pillar") + set_extrusion_role(GCodeExtrusionRole::WipeTower); + else { + set_extrusion_role(GCodeExtrusionRole::None); + BOOST_LOG_TRIVIAL(warning) << "GCodeProcessor found unknown extrusion role: " << type; + } + + if (m_extrusion_role == GCodeExtrusionRole::ExternalPerimeter) + m_seams_detector.activate(true); + + return true; + } + + // layer + pos = comment.find(" Layer #"); + if (pos == 0) { + ++m_layer_id; + return true; + } + + return false; +} + +bool GCodeProcessor::process_ideamaker_tags(const std::string_view comment) +{ + // TYPE -> extrusion role + std::string tag = "TYPE:"; + size_t pos = comment.find(tag); + if (pos != comment.npos) { + const std::string_view type = comment.substr(pos + tag.length()); + if (type == "RAFT") + set_extrusion_role(GCodeExtrusionRole::Skirt); + else if (type == "WALL-OUTER") + set_extrusion_role(GCodeExtrusionRole::ExternalPerimeter); + else if (type == "WALL-INNER") + set_extrusion_role(GCodeExtrusionRole::Perimeter); + else if (type == "SOLID-FILL") + set_extrusion_role(GCodeExtrusionRole::SolidInfill); + else if (type == "FILL") + set_extrusion_role(GCodeExtrusionRole::InternalInfill); + else if (type == "BRIDGE") + set_extrusion_role(GCodeExtrusionRole::BridgeInfill); + else if (type == "SUPPORT") + set_extrusion_role(GCodeExtrusionRole::SupportMaterial); + else { + set_extrusion_role(GCodeExtrusionRole::None); + BOOST_LOG_TRIVIAL(warning) << "GCodeProcessor found unknown extrusion role: " << type; + } + + if (m_extrusion_role == GCodeExtrusionRole::ExternalPerimeter) + m_seams_detector.activate(true); + + return true; + } + + // geometry + // width + tag = "WIDTH:"; + pos = comment.find(tag); + if (pos != comment.npos) { + if (!parse_number(comment.substr(pos + tag.length()), m_forced_width)) + BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Width (" << comment << ")."; + return true; + } + + // height + tag = "HEIGHT:"; + pos = comment.find(tag); + if (pos != comment.npos) { + if (!parse_number(comment.substr(pos + tag.length()), m_forced_height)) + BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ")."; + return true; + } + + // layer + pos = comment.find("LAYER:"); + if (pos == 0) { + ++m_layer_id; + return true; + } + + return false; +} + +bool GCodeProcessor::process_kissslicer_tags(const std::string_view comment) +{ + // extrusion roles + + // ; 'Raft Path' + size_t pos = comment.find(" 'Raft Path'"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::Skirt); + return true; + } + + // ; 'Support Interface Path' + pos = comment.find(" 'Support Interface Path'"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::SupportMaterialInterface); + return true; + } + + // ; 'Travel/Ironing Path' + pos = comment.find(" 'Travel/Ironing Path'"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::Ironing); + return true; + } + + // ; 'Support (may Stack) Path' + pos = comment.find(" 'Support (may Stack) Path'"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::SupportMaterial); + return true; + } + + // ; 'Perimeter Path' + pos = comment.find(" 'Perimeter Path'"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::ExternalPerimeter); + m_seams_detector.activate(true); + return true; + } + + // ; 'Pillar Path' + pos = comment.find(" 'Pillar Path'"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::None); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + return true; + } + + // ; 'Destring/Wipe/Jump Path' + pos = comment.find(" 'Destring/Wipe/Jump Path'"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::None); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + return true; + } + + // ; 'Prime Pillar Path' + pos = comment.find(" 'Prime Pillar Path'"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::None); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + return true; + } + + // ; 'Loop Path' + pos = comment.find(" 'Loop Path'"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::None); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + return true; + } + + // ; 'Crown Path' + pos = comment.find(" 'Crown Path'"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::None); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + return true; + } + + // ; 'Solid Path' + pos = comment.find(" 'Solid Path'"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::None); + return true; + } + + // ; 'Stacked Sparse Infill Path' + pos = comment.find(" 'Stacked Sparse Infill Path'"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::InternalInfill); + return true; + } + + // ; 'Sparse Infill Path' + pos = comment.find(" 'Sparse Infill Path'"); + if (pos == 0) { + set_extrusion_role(GCodeExtrusionRole::SolidInfill); + return true; + } + + // geometry + + // layer + pos = comment.find(" BEGIN_LAYER_"); + if (pos == 0) { + ++m_layer_id; + return true; + } + + return false; +} + +bool GCodeProcessor::process_bambustudio_tags(const std::string_view comment) +{ + // extrusion roles + + std::string tag = "FEATURE: "; + size_t pos = comment.find(tag); + if (pos != comment.npos) { + const std::string_view type = comment.substr(pos + tag.length()); + if (type == "Custom") + set_extrusion_role(GCodeExtrusionRole::Custom); + else if (type == "Inner wall") + set_extrusion_role(GCodeExtrusionRole::Perimeter); + else if (type == "Outer wall") + set_extrusion_role(GCodeExtrusionRole::ExternalPerimeter); + else if (type == "Overhang wall") + set_extrusion_role(GCodeExtrusionRole::OverhangPerimeter); + else if (type == "Gap infill") + set_extrusion_role(GCodeExtrusionRole::GapFill); + else if (type == "Bridge") + set_extrusion_role(GCodeExtrusionRole::BridgeInfill); + else if (type == "Sparse infill") + set_extrusion_role(GCodeExtrusionRole::InternalInfill); + else if (type == "Internal solid infill") + set_extrusion_role(GCodeExtrusionRole::SolidInfill); + else if (type == "Top surface") + set_extrusion_role(GCodeExtrusionRole::TopSolidInfill); + else if (type == "Bottom surface") + set_extrusion_role(GCodeExtrusionRole::None); + else if (type == "Ironing") + set_extrusion_role(GCodeExtrusionRole::Ironing); + else if (type == "Skirt") + set_extrusion_role(GCodeExtrusionRole::Skirt); + else if (type == "Brim") + set_extrusion_role(GCodeExtrusionRole::Skirt); + else if (type == "Support") + set_extrusion_role(GCodeExtrusionRole::SupportMaterial); + else if (type == "Support interface") + set_extrusion_role(GCodeExtrusionRole::SupportMaterialInterface); + else if (type == "Support transition") + set_extrusion_role(GCodeExtrusionRole::None); + else if (type == "Prime tower") + set_extrusion_role(GCodeExtrusionRole::WipeTower); + else { + set_extrusion_role(GCodeExtrusionRole::None); + BOOST_LOG_TRIVIAL(warning) << "GCodeProcessor found unknown extrusion role: " << type; + } + + if (m_extrusion_role == GCodeExtrusionRole::ExternalPerimeter) + m_seams_detector.activate(true); + + return true; + } + + return false; +} + +bool GCodeProcessor::detect_producer(const std::string_view comment) +{ + for (const auto& [id, search_string] : Producers) { + const size_t pos = comment.find(search_string); + if (pos != comment.npos) { + m_producer = id; + BOOST_LOG_TRIVIAL(info) << "Detected gcode producer: " << search_string; + return true; + } + } + return false; +} + +void GCodeProcessor::process_G0(const GCodeReader::GCodeLine& line) +{ + process_G1(line); +} + +void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) +{ + const float filament_diameter = (static_cast(m_extruder_id) < m_result.filament_diameters.size()) ? m_result.filament_diameters[m_extruder_id] : m_result.filament_diameters.back(); + const float filament_radius = 0.5f * filament_diameter; + const float area_filament_cross_section = static_cast(M_PI) * sqr(filament_radius); + + auto move_type = [this](const AxisCoords& delta_pos) { + EMoveType type = EMoveType::Noop; + + if (m_wiping) + type = EMoveType::Wipe; + else if (delta_pos[E] < 0.0f) + type = (delta_pos[X] != 0.0f || delta_pos[Y] != 0.0f || delta_pos[Z] != 0.0f) ? EMoveType::Travel : EMoveType::Retract; + else if (delta_pos[E] > 0.0f) { + if (delta_pos[X] == 0.0f && delta_pos[Y] == 0.0f) + type = (delta_pos[Z] == 0.0f) ? EMoveType::Unretract : EMoveType::Travel; + else if (delta_pos[X] != 0.0f || delta_pos[Y] != 0.0f) + type = EMoveType::Extrude; + } + else if (delta_pos[X] != 0.0f || delta_pos[Y] != 0.0f || delta_pos[Z] != 0.0f) + type = EMoveType::Travel; + + return type; + }; + + ++m_g1_line_id; + + // enable processing of lines M201/M203/M204/M205 + m_time_processor.machine_envelope_processing_enabled = true; + + // updates axes positions from line + for (unsigned char a = X; a <= E; ++a) { + m_end_position[a] = extract_absolute_position_on_axis((Axis)a, line, double(area_filament_cross_section)); + } + + // updates feedrate from line, if present + if (line.has_f()) + m_feedrate = m_feed_multiply.current * line.f() * MMMIN_TO_MMSEC; + + // calculates movement deltas + AxisCoords delta_pos; + for (unsigned char a = X; a <= E; ++a) + delta_pos[a] = m_end_position[a] - m_start_position[a]; + + if (std::all_of(delta_pos.begin(), delta_pos.end(), [](double d) { return d == 0.; })) + return; + + const float volume_extruded_filament = area_filament_cross_section * delta_pos[E]; + + if (volume_extruded_filament != 0.) + m_used_filaments.increase_caches(volume_extruded_filament, + m_extruder_id, area_filament_cross_section * m_parking_position, + area_filament_cross_section * m_extra_loading_move); + + const EMoveType type = move_type(delta_pos); + if (type == EMoveType::Extrude) { + const float delta_xyz = std::sqrt(sqr(delta_pos[X]) + sqr(delta_pos[Y]) + sqr(delta_pos[Z])); + const float area_toolpath_cross_section = volume_extruded_filament / delta_xyz; + + // volume extruded filament / tool displacement = area toolpath cross section + m_mm3_per_mm = area_toolpath_cross_section; +#if ENABLE_GCODE_VIEWER_DATA_CHECKING + m_mm3_per_mm_compare.update(area_toolpath_cross_section, m_extrusion_role); +#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING + + if (m_forced_height > 0.0f) + m_height = m_forced_height; + else if (m_layer_id == 0) + m_height = m_first_layer_height + m_z_offset; + else if (line.comment() != INTERNAL_G2G3_TAG){ + if (m_end_position[Z] > m_extruded_last_z + EPSILON && delta_pos[Z] == 0.0) + m_height = m_end_position[Z] - m_extruded_last_z; + } + + if (m_height == 0.0f) + m_height = DEFAULT_TOOLPATH_HEIGHT; + + if (m_end_position[Z] == 0.0f || (m_extrusion_role == GCodeExtrusionRole::Custom && m_layer_id == 0)) + m_end_position[Z] = m_height; + + if (line.comment() != INTERNAL_G2G3_TAG) + m_extruded_last_z = m_end_position[Z]; + m_options_z_corrector.update(m_height); + +#if ENABLE_GCODE_VIEWER_DATA_CHECKING + m_height_compare.update(m_height, m_extrusion_role); +#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING + + if (m_forced_width > 0.0f) + m_width = m_forced_width; + else if (m_extrusion_role == GCodeExtrusionRole::ExternalPerimeter) + // cross section: rectangle + m_width = delta_pos[E] * static_cast(M_PI * sqr(1.05f * filament_radius)) / (delta_xyz * m_height); + else if (m_extrusion_role == GCodeExtrusionRole::BridgeInfill || m_extrusion_role == GCodeExtrusionRole::None) + // cross section: circle + m_width = static_cast(m_result.filament_diameters[m_extruder_id]) * std::sqrt(delta_pos[E] / delta_xyz); + else + // cross section: rectangle + 2 semicircles + m_width = delta_pos[E] * static_cast(M_PI * sqr(filament_radius)) / (delta_xyz * m_height) + static_cast(1.0 - 0.25 * M_PI) * m_height; + + if (m_width == 0.0f) + m_width = DEFAULT_TOOLPATH_WIDTH; + + // clamp width to avoid artifacts which may arise from wrong values of m_height + m_width = std::min(m_width, std::max(2.0f, 4.0f * m_height)); + +#if ENABLE_GCODE_VIEWER_DATA_CHECKING + m_width_compare.update(m_width, m_extrusion_role); +#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING + } + + // time estimate section + auto move_length = [](const AxisCoords& delta_pos) { + float sq_xyz_length = sqr(delta_pos[X]) + sqr(delta_pos[Y]) + sqr(delta_pos[Z]); + return (sq_xyz_length > 0.0f) ? std::sqrt(sq_xyz_length) : std::abs(delta_pos[E]); + }; + + auto is_extrusion_only_move = [](const AxisCoords& delta_pos) { + return delta_pos[X] == 0.0f && delta_pos[Y] == 0.0f && delta_pos[Z] == 0.0f && delta_pos[E] != 0.0f; + }; + + const float distance = move_length(delta_pos); + assert(distance != 0.0f); + const float inv_distance = 1.0f / distance; + + for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { + TimeMachine& machine = m_time_processor.machines[i]; + if (!machine.enabled) + continue; + + TimeMachine::State& curr = machine.curr; + TimeMachine::State& prev = machine.prev; + std::vector& blocks = machine.blocks; + + curr.feedrate = (delta_pos[E] == 0.0f) ? + minimum_travel_feedrate(static_cast(i), m_feedrate) : + minimum_feedrate(static_cast(i), m_feedrate); + + TimeBlock block; + block.move_type = type; + block.role = m_extrusion_role; + block.distance = distance; + block.g1_line_id = m_g1_line_id; + block.layer_id = std::max(1, m_layer_id); + + // calculates block cruise feedrate + float min_feedrate_factor = 1.0f; + for (unsigned char a = X; a <= E; ++a) { + curr.axis_feedrate[a] = curr.feedrate * delta_pos[a] * inv_distance; + if (a == E) + curr.axis_feedrate[a] *= machine.extrude_factor_override_percentage; + + curr.abs_axis_feedrate[a] = std::abs(curr.axis_feedrate[a]); + if (curr.abs_axis_feedrate[a] != 0.0f) { + const float axis_max_feedrate = get_axis_max_feedrate(static_cast(i), static_cast(a)); + if (axis_max_feedrate != 0.0f) + min_feedrate_factor = std::min(min_feedrate_factor, axis_max_feedrate / curr.abs_axis_feedrate[a]); + } + } + + block.feedrate_profile.cruise = min_feedrate_factor * curr.feedrate; + + if (min_feedrate_factor < 1.0f) { + for (unsigned char a = X; a <= E; ++a) { + curr.axis_feedrate[a] *= min_feedrate_factor; + curr.abs_axis_feedrate[a] *= min_feedrate_factor; + } + } + + // calculates block acceleration + float acceleration = + (type == EMoveType::Travel) ? get_travel_acceleration(static_cast(i)) : + (is_extrusion_only_move(delta_pos) ? + get_retract_acceleration(static_cast(i)) : + get_acceleration(static_cast(i))); + + for (unsigned char a = X; a <= E; ++a) { + const float axis_max_acceleration = get_axis_max_acceleration(static_cast(i), static_cast(a)); + if (acceleration * std::abs(delta_pos[a]) * inv_distance > axis_max_acceleration) + acceleration = axis_max_acceleration; + } + + block.acceleration = acceleration; + + // calculates block exit feedrate + curr.safe_feedrate = block.feedrate_profile.cruise; + + for (unsigned char a = X; a <= E; ++a) { + const float axis_max_jerk = get_axis_max_jerk(static_cast(i), static_cast(a)); + if (curr.abs_axis_feedrate[a] > axis_max_jerk) + curr.safe_feedrate = std::min(curr.safe_feedrate, axis_max_jerk); + } + + block.feedrate_profile.exit = curr.safe_feedrate; + + static const float PREVIOUS_FEEDRATE_THRESHOLD = 0.0001f; + + // calculates block entry feedrate + float vmax_junction = curr.safe_feedrate; + if (!blocks.empty() && prev.feedrate > PREVIOUS_FEEDRATE_THRESHOLD) { + bool prev_speed_larger = prev.feedrate > block.feedrate_profile.cruise; + float smaller_speed_factor = prev_speed_larger ? (block.feedrate_profile.cruise / prev.feedrate) : (prev.feedrate / block.feedrate_profile.cruise); + // Pick the smaller of the nominal speeds. Higher speed shall not be achieved at the junction during coasting. + vmax_junction = prev_speed_larger ? block.feedrate_profile.cruise : prev.feedrate; + + float v_factor = 1.0f; + bool limited = false; + + for (unsigned char a = X; a <= E; ++a) { + // Limit an axis. We have to differentiate coasting from the reversal of an axis movement, or a full stop. + float v_exit = prev.axis_feedrate[a]; + float v_entry = curr.axis_feedrate[a]; + + if (prev_speed_larger) + v_exit *= smaller_speed_factor; + + if (limited) { + v_exit *= v_factor; + v_entry *= v_factor; + } + + // Calculate the jerk depending on whether the axis is coasting in the same direction or reversing a direction. + const float jerk = + (v_exit > v_entry) ? + ((v_entry > 0.0f || v_exit < 0.0f) ? + // coasting + (v_exit - v_entry) : + // axis reversal + std::max(v_exit, -v_entry)) : + // v_exit <= v_entry + ((v_entry < 0.0f || v_exit > 0.0f) ? + // coasting + (v_entry - v_exit) : + // axis reversal + std::max(-v_exit, v_entry)); + + const float axis_max_jerk = get_axis_max_jerk(static_cast(i), static_cast(a)); + if (jerk > axis_max_jerk) { + v_factor *= axis_max_jerk / jerk; + limited = true; + } + } + + if (limited) + vmax_junction *= v_factor; + + // Now the transition velocity is known, which maximizes the shared exit / entry velocity while + // respecting the jerk factors, it may be possible, that applying separate safe exit / entry velocities will achieve faster prints. + const float vmax_junction_threshold = vmax_junction * 0.99f; + + // Not coasting. The machine will stop and start the movements anyway, better to start the segment from start. + if (prev.safe_feedrate > vmax_junction_threshold && curr.safe_feedrate > vmax_junction_threshold) + vmax_junction = curr.safe_feedrate; + } + + const float v_allowable = max_allowable_speed(-acceleration, curr.safe_feedrate, block.distance); + block.feedrate_profile.entry = std::min(vmax_junction, v_allowable); + + block.max_entry_speed = vmax_junction; + block.flags.nominal_length = (block.feedrate_profile.cruise <= v_allowable); + block.flags.recalculate = true; + block.safe_feedrate = curr.safe_feedrate; + + // calculates block trapezoid + block.calculate_trapezoid(); + + // updates previous + prev = curr; + + blocks.push_back(block); + + if (blocks.size() > TimeProcessor::Planner::refresh_threshold) + machine.calculate_time(TimeProcessor::Planner::queue_size); + } + + if (m_seams_detector.is_active()) { + // check for seam starting vertex + if (type == EMoveType::Extrude && m_extrusion_role == GCodeExtrusionRole::ExternalPerimeter && !m_seams_detector.has_first_vertex()) + m_seams_detector.set_first_vertex(m_result.moves.back().position - m_extruder_offsets[m_extruder_id]); + // check for seam ending vertex and store the resulting move + else if ((type != EMoveType::Extrude || (m_extrusion_role != GCodeExtrusionRole::ExternalPerimeter && m_extrusion_role != GCodeExtrusionRole::OverhangPerimeter)) && m_seams_detector.has_first_vertex()) { + auto set_end_position = [this](const Vec3f& pos) { + m_end_position[X] = pos.x(); m_end_position[Y] = pos.y(); m_end_position[Z] = pos.z(); + }; + + const Vec3f curr_pos(m_end_position[X], m_end_position[Y], m_end_position[Z]); + const Vec3f new_pos = m_result.moves.back().position - m_extruder_offsets[m_extruder_id]; + const std::optional first_vertex = m_seams_detector.get_first_vertex(); + // the threshold value = 0.0625f == 0.25 * 0.25 is arbitrary, we may find some smarter condition later + + if ((new_pos - *first_vertex).squaredNorm() < 0.0625f) { + set_end_position(0.5f * (new_pos + *first_vertex) + m_z_offset * Vec3f::UnitZ()); + store_move_vertex(EMoveType::Seam); + set_end_position(curr_pos); + } + + m_seams_detector.activate(false); + } + } + else if (type == EMoveType::Extrude && m_extrusion_role == GCodeExtrusionRole::ExternalPerimeter) { + m_seams_detector.activate(true); + m_seams_detector.set_first_vertex(m_result.moves.back().position - m_extruder_offsets[m_extruder_id]); + } + + if (m_spiral_vase_active && !m_result.spiral_vase_layers.empty()) { + if (m_result.spiral_vase_layers.back().first == FLT_MAX && delta_pos[Z] >= 0.0) + // replace layer height placeholder with correct value + m_result.spiral_vase_layers.back().first = static_cast(m_end_position[Z]); + if (!m_result.moves.empty()) + m_result.spiral_vase_layers.back().second.second = m_result.moves.size() - 1; + } + + // store move + store_move_vertex(type, line.comment() == INTERNAL_G2G3_TAG); +} + +void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line, bool clockwise) +{ + if (!line.has('I') || !line.has('J')) + return; + + // relative center + Vec3f rel_center = Vec3f::Zero(); + if (!line.has_value('I', rel_center.x()) || !line.has_value('J', rel_center.y())) + return; + + // scale center, if needed + if (m_units == EUnits::Inches) + rel_center *= INCHES_TO_MM; + + struct Arc + { + Vec3d start{ Vec3d::Zero() }; + Vec3d end{ Vec3d::Zero() }; + Vec3d center{ Vec3d::Zero() }; + + double angle{ 0.0 }; + double delta_x() const { return end.x() - start.x(); } + double delta_y() const { return end.y() - start.y(); } + double delta_z() const { return end.z() - start.z(); } + + double length() const { return angle * start_radius(); } + double travel_length() const { return std::sqrt(sqr(length() + sqr(delta_z()))); } + double start_radius() const { return (start - center).norm(); } + double end_radius() const { return (end - center).norm(); } + + Vec3d relative_start() const { return start - center; } + Vec3d relative_end() const { return end - center; } + + bool is_full_circle() const { return std::abs(delta_x()) < EPSILON && std::abs(delta_y()) < EPSILON; } + }; + + Arc arc; + + // arc start endpoint + arc.start = Vec3d(m_start_position[X], m_start_position[Y], m_start_position[Z]); + + // arc center + arc.center = arc.start + rel_center.cast(); + + const float filament_diameter = (static_cast(m_extruder_id) < m_result.filament_diameters.size()) ? m_result.filament_diameters[m_extruder_id] : m_result.filament_diameters.back(); + const float filament_radius = 0.5f * filament_diameter; + const float area_filament_cross_section = static_cast(M_PI) * sqr(filament_radius); + + AxisCoords end_position = m_start_position; + for (unsigned char a = X; a <= E; ++a) { + end_position[a] = extract_absolute_position_on_axis((Axis)a, line, double(area_filament_cross_section)); + } + + // arc end endpoint + arc.end = Vec3d(end_position[X], end_position[Y], end_position[Z]); + + // radii + if (std::abs(arc.end_radius() - arc.start_radius()) > EPSILON) { + // what to do ??? + } + + // updates feedrate from line + std::optional feedrate; + if (line.has_f()) + feedrate = m_feed_multiply.current * line.f() * MMMIN_TO_MMSEC; + + // updates extrusion from line + std::optional extrusion; + if (line.has_e()) + extrusion = end_position[E] - m_start_position[E]; + + // relative arc endpoints + const Vec3d rel_arc_start = arc.relative_start(); + const Vec3d rel_arc_end = arc.relative_end(); + + // arc angle + if (arc.is_full_circle()) + arc.angle = 2.0 * PI; + else { + arc.angle = std::atan2(rel_arc_start.x() * rel_arc_end.y() - rel_arc_start.y() * rel_arc_end.x(), + rel_arc_start.x() * rel_arc_end.x() + rel_arc_start.y() * rel_arc_end.y()); + if (arc.angle < 0.0) + arc.angle += 2.0 * PI; + if (clockwise) + arc.angle -= 2.0 * PI; + } + + const double travel_length = arc.travel_length(); + if (travel_length < 0.001) + return; + + auto adjust_target = [this, area_filament_cross_section](const AxisCoords& target, const AxisCoords& prev_position) { + AxisCoords ret = target; + if (m_global_positioning_type == EPositioningType::Relative) { + for (unsigned char a = X; a <= E; ++a) { + ret[a] -= prev_position[a]; + } + } + else if (m_e_local_positioning_type == EPositioningType::Relative) + ret[E] -= prev_position[E]; + + if (m_use_volumetric_e) + ret[E] *= area_filament_cross_section; + + const double lengthsScaleFactor = (m_units == EUnits::Inches) ? double(INCHES_TO_MM) : 1.0; + for (unsigned char a = X; a <= E; ++a) { + ret[a] /= lengthsScaleFactor; + } + return ret; + }; + + auto internal_only_g1_line = [](const AxisCoords& target, bool has_z, const std::optional& feedrate, const std::optional& extrusion) { + std::string ret = (boost::format("G1 X%1% Y%2%") % target[X] % target[Y]).str(); + if (has_z) + ret += (boost::format(" Z%1%") % target[Z]).str(); + if (feedrate.has_value()) + ret += (boost::format(" F%1%") % *feedrate).str(); + if (extrusion.has_value()) + ret += (boost::format(" E%1%") % target[E]).str(); + + ret += (boost::format(" ;%1%\n") % INTERNAL_G2G3_TAG).str(); + + return ret; + }; + + // calculate arc segments + // reference: + // Prusa-Firmware\Firmware\motion_control.cpp - mc_arc() + // https://github.com/prusa3d/Prusa-Firmware/blob/MK3/Firmware/motion_control.cpp + + // segments count + static const double MM_PER_ARC_SEGMENT = 0.5; + const size_t segments = std::ceil(travel_length / MM_PER_ARC_SEGMENT); + assert(segments >= 1); + + const double theta_per_segment = arc.angle / double(segments); + const double z_per_segment = arc.delta_z() / double(segments); + const double extruder_per_segment = (extrusion.has_value()) ? *extrusion / double(segments) : 0.0; + + const double sq_theta_per_segment = sqr(theta_per_segment); + const double cos_T = 1.0 - 0.5 * sq_theta_per_segment; // Small angle approximation + const double sin_T = theta_per_segment - sq_theta_per_segment * theta_per_segment / 6.0; // Small angle approximation + + AxisCoords prev_target = m_start_position; + AxisCoords arc_target; + + // Initialize the linear axis + arc_target[Z] = m_start_position[Z]; + + // Initialize the extruder axis + arc_target[E] = m_start_position[E]; + + static const size_t N_ARC_CORRECTION = 25; + + Vec3d curr_rel_arc_start = arc.relative_start(); + + std::string gcode; + + size_t n_arc_correction = N_ARC_CORRECTION; + + for (size_t i = 1; i < segments; ++i) { + if (n_arc_correction-- == 0) { + // Calculate the actual position for r_axis_x and r_axis_y + const double cos_Ti = ::cos((double)i * theta_per_segment); + const double sin_Ti = ::sin((double)i * theta_per_segment); + curr_rel_arc_start.x() = -double(rel_center.x()) * cos_Ti + double(rel_center.y()) * sin_Ti; + curr_rel_arc_start.y() = -double(rel_center.x()) * sin_Ti - double(rel_center.y()) * cos_Ti; + // reset n_arc_correction + n_arc_correction = N_ARC_CORRECTION; + } + else { + // Calculate X and Y using the small angle approximation + const float r_axisi = curr_rel_arc_start.x() * sin_T + curr_rel_arc_start.y() * cos_T; + curr_rel_arc_start.x() = curr_rel_arc_start.x() * cos_T - curr_rel_arc_start.y() * sin_T; + curr_rel_arc_start.y() = r_axisi; + } + + // Update arc_target location + arc_target[X] = arc.center.x() + curr_rel_arc_start.x(); + arc_target[Y] = arc.center.y() + curr_rel_arc_start.y(); + arc_target[Z] += z_per_segment; + arc_target[E] += extruder_per_segment; + + gcode += internal_only_g1_line(adjust_target(arc_target, prev_target), z_per_segment != 0.0, feedrate, extrusion); + prev_target = arc_target; + + // feedrate is constant, we do not need to repeat it + feedrate.reset(); + } + + // Ensure last segment arrives at target location. + gcode += internal_only_g1_line(adjust_target(end_position, prev_target), arc.delta_z() != 0.0, feedrate, extrusion); + + // process fake gcode lines + GCodeReader parser; + parser.parse_buffer(gcode, [this](GCodeReader&, const GCodeReader::GCodeLine& line) { + // force all lines to share the same id + --m_line_id; + process_gcode_line(line, false); + }); +} + +void GCodeProcessor::process_G10(const GCodeReader::GCodeLine& line) +{ + if (m_flavor == gcfRepRapFirmware) { + // similar to M104/M109 + float new_temp; + if (line.has_value('S', new_temp)) { + size_t id = m_extruder_id; + float val; + if (line.has_value('P', val)) { + const size_t eid = static_cast(val); + if (eid < m_extruder_temps.size()) + id = eid; + } + + m_extruder_temps[id] = new_temp; + return; + } + } + + // stores retract move + store_move_vertex(EMoveType::Retract); +} + +void GCodeProcessor::process_G11(const GCodeReader::GCodeLine& line) +{ + // stores unretract move + store_move_vertex(EMoveType::Unretract); +} + +void GCodeProcessor::process_G20(const GCodeReader::GCodeLine& line) +{ + m_units = EUnits::Inches; +} + +void GCodeProcessor::process_G21(const GCodeReader::GCodeLine& line) +{ + m_units = EUnits::Millimeters; +} + +void GCodeProcessor::process_G22(const GCodeReader::GCodeLine& line) +{ + // stores retract move + store_move_vertex(EMoveType::Retract); +} + +void GCodeProcessor::process_G23(const GCodeReader::GCodeLine& line) +{ + // stores unretract move + store_move_vertex(EMoveType::Unretract); +} + +void GCodeProcessor::process_G28(const GCodeReader::GCodeLine& line) +{ + std::string_view cmd = line.cmd(); + std::string new_line_raw = { cmd.data(), cmd.size() }; + bool found = false; + if (line.has('X')) { + new_line_raw += " X0"; + found = true; + } + if (line.has('Y')) { + new_line_raw += " Y0"; + found = true; + } + if (line.has('Z')) { + new_line_raw += " Z0"; + found = true; + } + if (!found) + new_line_raw += " X0 Y0 Z0"; + + GCodeReader::GCodeLine new_gline; + GCodeReader reader; + reader.parse_line(new_line_raw, [&](GCodeReader& reader, const GCodeReader::GCodeLine& gline) { new_gline = gline; }); + process_G1(new_gline); +} + +void GCodeProcessor::process_G60(const GCodeReader::GCodeLine& line) +{ + if (m_flavor == gcfMarlinLegacy || m_flavor == gcfMarlinFirmware) + m_saved_position = m_end_position; +} + +void GCodeProcessor::process_G61(const GCodeReader::GCodeLine& line) +{ + if (m_flavor == gcfMarlinLegacy || m_flavor == gcfMarlinFirmware) { + bool modified = false; + if (line.has_x()) { + m_end_position[X] = m_saved_position[X]; + modified = true; + } + if (line.has_y()) { + m_end_position[Y] = m_saved_position[Y]; + modified = true; + } + if (line.has_z()) { + m_end_position[Z] = m_saved_position[Z]; + modified = true; + } + if (line.has_e()) { + m_end_position[E] = m_saved_position[E]; + modified = true; + } + if (line.has_f()) + m_feedrate = m_feed_multiply.current * line.f(); + + if (!modified) + m_end_position = m_saved_position; + + + store_move_vertex(EMoveType::Travel); + } +} + +void GCodeProcessor::process_G90(const GCodeReader::GCodeLine& line) +{ + m_global_positioning_type = EPositioningType::Absolute; +} + +void GCodeProcessor::process_G91(const GCodeReader::GCodeLine& line) +{ + m_global_positioning_type = EPositioningType::Relative; +} + +void GCodeProcessor::process_G92(const GCodeReader::GCodeLine& line) +{ + float lengths_scale_factor = (m_units == EUnits::Inches) ? INCHES_TO_MM : 1.0f; + bool any_found = false; + + if (line.has_x()) { + m_origin[X] = m_end_position[X] - line.x() * lengths_scale_factor; + any_found = true; + } + + if (line.has_y()) { + m_origin[Y] = m_end_position[Y] - line.y() * lengths_scale_factor; + any_found = true; + } + + if (line.has_z()) { + m_origin[Z] = m_end_position[Z] - line.z() * lengths_scale_factor; + any_found = true; + } + + if (line.has_e()) { + // extruder coordinate can grow to the point where its float representation does not allow for proper addition with small increments, + // we set the value taken from the G92 line as the new current position for it + m_end_position[E] = line.e() * lengths_scale_factor; + any_found = true; + } + else + simulate_st_synchronize(); + + if (!any_found && !line.has_unknown_axis()) { + // The G92 may be called for axes that PrusaSlicer does not recognize, for example see GH issue #3510, + // where G92 A0 B0 is called although the extruder axis is till E. + for (unsigned char a = X; a <= E; ++a) { + m_origin[a] = m_end_position[a]; + } + } +} + +void GCodeProcessor::process_M1(const GCodeReader::GCodeLine& line) +{ + simulate_st_synchronize(); +} + +void GCodeProcessor::process_M82(const GCodeReader::GCodeLine& line) +{ + m_e_local_positioning_type = EPositioningType::Absolute; +} + +void GCodeProcessor::process_M83(const GCodeReader::GCodeLine& line) +{ + m_e_local_positioning_type = EPositioningType::Relative; +} + +void GCodeProcessor::process_M104(const GCodeReader::GCodeLine& line) +{ + float new_temp; + if (line.has_value('S', new_temp)) { + size_t id = m_extruder_id; + float val; + if (line.has_value('T', val)) { + const size_t eid = static_cast(val); + if (eid < m_extruder_temps.size()) + id = eid; + } + + m_extruder_temps[id] = new_temp; + } +} + +void GCodeProcessor::process_M106(const GCodeReader::GCodeLine& line) +{ + if (!line.has('P')) { + // The absence of P means the print cooling fan, so ignore anything else. + float new_fan_speed; + if (line.has_value('S', new_fan_speed)) + m_fan_speed = (100.0f / 255.0f) * new_fan_speed; + else + m_fan_speed = 100.0f; + } +} + +void GCodeProcessor::process_M107(const GCodeReader::GCodeLine& line) +{ + m_fan_speed = 0.0f; +} + +void GCodeProcessor::process_M108(const GCodeReader::GCodeLine& line) +{ + // These M-codes are used by Sailfish to change active tool. + // They have to be processed otherwise toolchanges will be unrecognised + // by the analyzer - see https://github.com/prusa3d/PrusaSlicer/issues/2566 + + if (m_flavor != gcfSailfish) + return; + + std::string cmd = line.raw(); + size_t pos = cmd.find("T"); + if (pos != std::string::npos) + process_T(cmd.substr(pos)); +} + +void GCodeProcessor::process_M109(const GCodeReader::GCodeLine& line) +{ + float new_temp; + size_t id = (size_t)-1; + if (line.has_value('R', new_temp)) { + float val; + if (line.has_value('T', val)) { + const size_t eid = static_cast(val); + if (eid < m_extruder_temps.size()) + id = eid; + } + else + id = m_extruder_id; + } + else if (line.has_value('S', new_temp)) + id = m_extruder_id; + + if (id != (size_t)-1) + m_extruder_temps[id] = new_temp; +} + +void GCodeProcessor::process_M132(const GCodeReader::GCodeLine& line) +{ + // This command is used by Makerbot to load the current home position from EEPROM + // see: https://github.com/makerbot/s3g/blob/master/doc/GCodeProtocol.md + // Using this command to reset the axis origin to zero helps in fixing: https://github.com/prusa3d/PrusaSlicer/issues/3082 + + if (line.has('X')) + m_origin[X] = 0.0f; + + if (line.has('Y')) + m_origin[Y] = 0.0f; + + if (line.has('Z')) + m_origin[Z] = 0.0f; + + if (line.has('E')) + m_origin[E] = 0.0f; +} + +void GCodeProcessor::process_M135(const GCodeReader::GCodeLine& line) +{ + // These M-codes are used by MakerWare to change active tool. + // They have to be processed otherwise toolchanges will be unrecognised + // by the analyzer - see https://github.com/prusa3d/PrusaSlicer/issues/2566 + + if (m_flavor != gcfMakerWare) + return; + + std::string cmd = line.raw(); + size_t pos = cmd.find("T"); + if (pos != std::string::npos) + process_T(cmd.substr(pos)); +} + +void GCodeProcessor::process_M201(const GCodeReader::GCodeLine& line) +{ + // see http://reprap.org/wiki/G-code#M201:_Set_max_printing_acceleration + float factor = ((m_flavor != gcfRepRapSprinter && m_flavor != gcfRepRapFirmware) && m_units == EUnits::Inches) ? INCHES_TO_MM : 1.0f; + + for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { + if (static_cast(i) == PrintEstimatedStatistics::ETimeMode::Normal || + m_time_processor.machine_envelope_processing_enabled) { + if (line.has_x()) + set_option_value(m_time_processor.machine_limits.machine_max_acceleration_x, i, line.x() * factor); + + if (line.has_y()) + set_option_value(m_time_processor.machine_limits.machine_max_acceleration_y, i, line.y() * factor); + + if (line.has_z()) + set_option_value(m_time_processor.machine_limits.machine_max_acceleration_z, i, line.z() * factor); + + if (line.has_e()) + set_option_value(m_time_processor.machine_limits.machine_max_acceleration_e, i, line.e() * factor); + } + } +} + +void GCodeProcessor::process_M203(const GCodeReader::GCodeLine& line) +{ + // see http://reprap.org/wiki/G-code#M203:_Set_maximum_feedrate + if (m_flavor == gcfRepetier) + return; + + // see http://reprap.org/wiki/G-code#M203:_Set_maximum_feedrate + // http://smoothieware.org/supported-g-codes + float factor = (m_flavor == gcfMarlinLegacy || m_flavor == gcfMarlinFirmware || m_flavor == gcfSmoothie) ? 1.0f : MMMIN_TO_MMSEC; + + for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { + if (static_cast(i) == PrintEstimatedStatistics::ETimeMode::Normal || + m_time_processor.machine_envelope_processing_enabled) { + if (line.has_x()) + set_option_value(m_time_processor.machine_limits.machine_max_feedrate_x, i, line.x() * factor); + + if (line.has_y()) + set_option_value(m_time_processor.machine_limits.machine_max_feedrate_y, i, line.y() * factor); + + if (line.has_z()) + set_option_value(m_time_processor.machine_limits.machine_max_feedrate_z, i, line.z() * factor); + + if (line.has_e()) + set_option_value(m_time_processor.machine_limits.machine_max_feedrate_e, i, line.e() * factor); + } + } +} + +void GCodeProcessor::process_M204(const GCodeReader::GCodeLine& line) +{ + float value; + for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { + if (static_cast(i) == PrintEstimatedStatistics::ETimeMode::Normal || + m_time_processor.machine_envelope_processing_enabled) { + if (line.has_value('S', value)) { + // Legacy acceleration format. This format is used by the legacy Marlin, MK2 or MK3 firmware + // It is also generated by PrusaSlicer to control acceleration per extrusion type + // (perimeters, first layer etc) when 'Marlin (legacy)' flavor is used. + set_acceleration(static_cast(i), value); + set_travel_acceleration(static_cast(i), value); + if (line.has_value('T', value)) + set_retract_acceleration(static_cast(i), value); + } + else { + // New acceleration format, compatible with the upstream Marlin. + if (line.has_value('P', value)) + set_acceleration(static_cast(i), value); + if (line.has_value('R', value)) + set_retract_acceleration(static_cast(i), value); + if (line.has_value('T', value)) + // Interpret the T value as the travel acceleration in the new Marlin format. + set_travel_acceleration(static_cast(i), value); + } + } + } +} + +void GCodeProcessor::process_M205(const GCodeReader::GCodeLine& line) +{ + for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { + if (static_cast(i) == PrintEstimatedStatistics::ETimeMode::Normal || + m_time_processor.machine_envelope_processing_enabled) { + if (line.has_x()) { + float max_jerk = line.x(); + set_option_value(m_time_processor.machine_limits.machine_max_jerk_x, i, max_jerk); + set_option_value(m_time_processor.machine_limits.machine_max_jerk_y, i, max_jerk); + } + + if (line.has_y()) + set_option_value(m_time_processor.machine_limits.machine_max_jerk_y, i, line.y()); + + if (line.has_z()) + set_option_value(m_time_processor.machine_limits.machine_max_jerk_z, i, line.z()); + + if (line.has_e()) + set_option_value(m_time_processor.machine_limits.machine_max_jerk_e, i, line.e()); + + float value; + if (line.has_value('S', value)) + set_option_value(m_time_processor.machine_limits.machine_min_extruding_rate, i, value); + + if (line.has_value('T', value)) + set_option_value(m_time_processor.machine_limits.machine_min_travel_rate, i, value); + } + } +} + +void GCodeProcessor::process_M220(const GCodeReader::GCodeLine& line) +{ + if (m_flavor != gcfMarlinLegacy && m_flavor != gcfMarlinFirmware && m_flavor != gcfKlipper) + return; + + if (line.has('B')) + m_feed_multiply.saved = m_feed_multiply.current; + float value; + if (line.has_value('S', value)) + m_feed_multiply.current = value * 0.01f; + if (line.has('R')) + m_feed_multiply.current = m_feed_multiply.saved; +} + +void GCodeProcessor::process_M221(const GCodeReader::GCodeLine& line) +{ + float value_s; + float value_t; + if (line.has_value('S', value_s) && !line.has_value('T', value_t)) { + value_s *= 0.01f; + for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { + m_time_processor.machines[i].extrude_factor_override_percentage = value_s; + } + } +} + +void GCodeProcessor::process_M401(const GCodeReader::GCodeLine& line) +{ + if (m_flavor != gcfRepetier) + return; + + for (unsigned char a = 0; a <= 3; ++a) { + m_cached_position.position[a] = m_start_position[a]; + } + m_cached_position.feedrate = m_feedrate; +} + +void GCodeProcessor::process_M402(const GCodeReader::GCodeLine& line) +{ + if (m_flavor != gcfRepetier) + return; + + // see for reference: + // https://github.com/repetier/Repetier-Firmware/blob/master/src/ArduinoAVR/Repetier/Printer.cpp + // void Printer::GoToMemoryPosition(bool x, bool y, bool z, bool e, float feed) + + bool has_xyz = !(line.has('X') || line.has('Y') || line.has('Z')); + + float p = FLT_MAX; + for (unsigned char a = X; a <= Z; ++a) { + if (has_xyz || line.has(a)) { + p = m_cached_position.position[a]; + if (p != FLT_MAX) + m_start_position[a] = p; + } + } + + p = m_cached_position.position[E]; + if (p != FLT_MAX) + m_start_position[E] = p; + + p = FLT_MAX; + if (!line.has_value(4, p)) + p = m_cached_position.feedrate; + + if (p != FLT_MAX) + m_feedrate = p; +} + +void GCodeProcessor::process_M566(const GCodeReader::GCodeLine& line) +{ + for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { + if (line.has_x()) + set_option_value(m_time_processor.machine_limits.machine_max_jerk_x, i, line.x() * MMMIN_TO_MMSEC); + + if (line.has_y()) + set_option_value(m_time_processor.machine_limits.machine_max_jerk_y, i, line.y() * MMMIN_TO_MMSEC); + + if (line.has_z()) + set_option_value(m_time_processor.machine_limits.machine_max_jerk_z, i, line.z() * MMMIN_TO_MMSEC); + + if (line.has_e()) + set_option_value(m_time_processor.machine_limits.machine_max_jerk_e, i, line.e() * MMMIN_TO_MMSEC); + } +} + +void GCodeProcessor::process_M702(const GCodeReader::GCodeLine& line) +{ + if (line.has('C')) { + // MK3 MMU2 specific M code: + // M702 C is expected to be sent by the custom end G-code when finalizing a print. + // The MK3 unit shall unload and park the active filament into the MMU2 unit. + m_time_processor.extruder_unloaded = true; + simulate_st_synchronize(get_filament_unload_time(m_extruder_id)); + } +} + +void GCodeProcessor::process_T(const GCodeReader::GCodeLine& line) +{ + process_T(line.cmd()); +} + +void GCodeProcessor::process_T(const std::string_view command) +{ + if (command.length() > 1) { + int eid = 0; + if (! parse_number(command.substr(1), eid) || eid < 0 || eid > 255) { + // Specific to the MMU2 V2 (see https://www.help.prusa3d.com/en/article/prusa-specific-g-codes_112173): + if ((m_flavor == gcfMarlinLegacy || m_flavor == gcfMarlinFirmware) && (command == "Tx" || command == "Tc" || command == "T?")) + return; + + // T-1 is a valid gcode line for RepRap Firmwares (used to deselects all tools) see https://github.com/prusa3d/PrusaSlicer/issues/5677 + if ((m_flavor != gcfRepRapFirmware && m_flavor != gcfRepRapSprinter) || eid != -1) + BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid toolchange (" << command << ")."; + } + else { + unsigned char id = static_cast(eid); + if (m_extruder_id != id) { + if (((m_producer == EProducer::PrusaSlicer || m_producer == EProducer::Slic3rPE || m_producer == EProducer::Slic3r) && id >= m_result.extruders_count) || + ((m_producer != EProducer::PrusaSlicer && m_producer != EProducer::Slic3rPE && m_producer != EProducer::Slic3r) && id >= m_result.extruder_colors.size())) + BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid toolchange, maybe from a custom gcode."; + else { + unsigned char old_extruder_id = m_extruder_id; + process_filaments(CustomGCode::ToolChange); + m_extruder_id = id; + m_cp_color.current = m_extruder_colors[id]; + // Specific to the MK3 MMU2: + // The initial value of extruder_unloaded is set to true indicating + // that the filament is parked in the MMU2 unit and there is nothing to be unloaded yet. + float extra_time = get_filament_unload_time(static_cast(old_extruder_id)); + m_time_processor.extruder_unloaded = false; + extra_time += get_filament_load_time(static_cast(m_extruder_id)); + if (m_producer == EProducer::KissSlicer && m_flavor == gcfMarlinLegacy) + extra_time += m_kissslicer_toolchange_time_correction; + simulate_st_synchronize(extra_time); + + // specific to single extruder multi material, set the new extruder temperature + // to match the old one + if (m_single_extruder_multi_material) + m_extruder_temps[m_extruder_id] = m_extruder_temps[old_extruder_id]; + + m_result.extruders_count = std::max(m_result.extruders_count, m_extruder_id + 1); + } + + // store tool change move + store_move_vertex(EMoveType::Tool_change); + } + } + } +} + +void GCodeProcessor::post_process() +{ + FilePtr in{ boost::nowide::fopen(m_result.filename.c_str(), "rb") }; + if (in.f == nullptr) + throw Slic3r::RuntimeError(std::string("GCode processor post process export failed.\nCannot open file for reading.\n")); + + // temporary file to contain modified gcode + std::string out_path = m_result.filename + ".postprocess"; + FilePtr out{ boost::nowide::fopen(out_path.c_str(), "wb") }; + if (out.f == nullptr) { + throw Slic3r::RuntimeError(std::string("GCode processor post process export failed.\nCannot open file for writing.\n")); + } + + auto time_in_minutes = [](float time_in_seconds) { + assert(time_in_seconds >= 0.f); + return int((time_in_seconds + 0.5f) / 60.0f); + }; + + auto time_in_last_minute = [](float time_in_seconds) { + assert(time_in_seconds <= 60.0f); + return time_in_seconds / 60.0f; + }; + + auto format_line_M73_main = [](const std::string& mask, int percent, int time) { + char line_M73[64]; + sprintf(line_M73, mask.c_str(), + std::to_string(percent).c_str(), + std::to_string(time).c_str()); + return std::string(line_M73); + }; + + auto format_line_M73_stop_int = [](const std::string& mask, int time) { + char line_M73[64]; + sprintf(line_M73, mask.c_str(), std::to_string(time).c_str()); + return std::string(line_M73); + }; + + auto format_time_float = [](float time) { + return Slic3r::float_to_string_decimal_point(time, 2); + }; + + auto format_line_M73_stop_float = [format_time_float](const std::string& mask, float time) { + char line_M73[64]; + sprintf(line_M73, mask.c_str(), format_time_float(time).c_str()); + return std::string(line_M73); + }; + + std::string gcode_line; + size_t g1_lines_counter = 0; + // keeps track of last exported pair + std::array, static_cast(PrintEstimatedStatistics::ETimeMode::Count)> last_exported_main; + for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { + last_exported_main[i] = { 0, time_in_minutes(m_time_processor.machines[i].time) }; + } + + // keeps track of last exported remaining time to next printer stop + std::array(PrintEstimatedStatistics::ETimeMode::Count)> last_exported_stop; + for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { + last_exported_stop[i] = time_in_minutes(m_time_processor.machines[i].time); + } + +#if ENABLE_GCODE_POSTPROCESS_BACKTRACE + // Helper class to modify and export gcode to file + class ExportLines + { + public: + struct Backtrace + { + float time{ 60.0f }; + unsigned int steps{ 10 }; + float time_step() const { return time / float(steps); } + }; + + enum class EWriteType + { + BySize, + ByTime + }; + + private: + struct LineData + { + std::string line; + float time; + }; + +#ifndef NDEBUG + class Statistics + { + ExportLines& m_parent; + size_t m_max_size{ 0 }; + size_t m_lines_count{ 0 }; + size_t m_max_lines_count{ 0 }; + + public: + explicit Statistics(ExportLines& parent) + : m_parent(parent) + {} + + void add_line(size_t line_size) { + ++m_lines_count; + m_max_size = std::max(m_max_size, m_parent.get_size() + line_size); + m_max_lines_count = std::max(m_max_lines_count, m_lines_count); + } + + void remove_line() { --m_lines_count; } + void remove_all_lines() { m_lines_count = 0; } + }; + + Statistics m_statistics; +#endif // NDEBUG + + EWriteType m_write_type{ EWriteType::BySize }; + // Time machine containing g1 times cache + TimeMachine& m_machine; + // Current time + float m_time{ 0.0f }; + // Current size in bytes + size_t m_size{ 0 }; + + // gcode lines cache + std::deque m_lines; + size_t m_added_lines_counter{ 0 }; + // map of gcode line ids from original to final + // used to update m_result.moves[].gcode_id + std::vector> m_gcode_lines_map; + + size_t m_curr_g1_id{ 0 }; + size_t m_out_file_pos{ 0 }; + + public: + ExportLines(EWriteType type, TimeMachine& machine) +#ifndef NDEBUG + : m_statistics(*this), m_write_type(type), m_machine(machine) {} +#else + : m_write_type(type), m_machine(machine) {} +#endif // NDEBUG + + void update(size_t lines_counter, size_t g1_lines_counter) { + m_gcode_lines_map.push_back({ lines_counter, 0 }); + + if (g1_lines_counter == 0) + return; + + auto init_it = m_machine.g1_times_cache.begin() + m_curr_g1_id; + auto it = init_it; + while (it != m_machine.g1_times_cache.end() && it->id < g1_lines_counter + 1) { + ++it; + ++m_curr_g1_id; + } + + if (it != init_it || m_curr_g1_id == 0) + m_time = it->elapsed_time; + } + + // add the given gcode line to the cache + void append_line(const std::string& line) { + m_lines.push_back({ line, m_time }); +#ifndef NDEBUG + m_statistics.add_line(line.length()); +#endif // NDEBUG + m_size += line.length(); + ++m_added_lines_counter; + assert(!m_gcode_lines_map.empty()); + m_gcode_lines_map.back().second = m_added_lines_counter; + } + + // Insert the gcode lines required by the command cmd by backtracing into the cache + void insert_lines(const Backtrace& backtrace, const std::string& cmd, std::function line_inserter, + std::function line_replacer) { + assert(!m_lines.empty()); + const float time_step = backtrace.time_step(); + size_t rev_it_dist = 0; // distance from the end of the cache of the starting point of the backtrace + float last_time_insertion = 0.0f; // used to avoid inserting two lines at the same time + for (unsigned int i = 0; i < backtrace.steps; ++i) { + const float backtrace_time_i = (i + 1) * time_step; + const float time_threshold_i = m_time - backtrace_time_i; + auto rev_it = m_lines.rbegin() + rev_it_dist; + auto start_rev_it = rev_it; + + // backtrace into the cache to find the place where to insert the line + while (rev_it != m_lines.rend() && rev_it->time > time_threshold_i && GCodeReader::GCodeLine::extract_cmd(rev_it->line) != cmd) { + rev_it->line = line_replacer(rev_it->line); + ++rev_it; + } + + // we met the previous evenience of cmd. stop inserting lines + if (rev_it != m_lines.rend() && GCodeReader::GCodeLine::extract_cmd(rev_it->line) == cmd) + break; + + // insert the line for the current step + if (rev_it != m_lines.rend() && rev_it != start_rev_it && rev_it->time != last_time_insertion) { + last_time_insertion = rev_it->time; + const std::string out_line = line_inserter(i + 1, last_time_insertion, m_time - last_time_insertion); + rev_it_dist = std::distance(m_lines.rbegin(), rev_it) + 1; + const auto new_it = m_lines.insert(rev_it.base(), { out_line, rev_it->time }); +#ifndef NDEBUG + m_statistics.add_line(out_line.length()); +#endif // NDEBUG + m_size += out_line.length(); + // synchronize gcode lines map + for (auto map_it = m_gcode_lines_map.rbegin(); map_it != m_gcode_lines_map.rbegin() + rev_it_dist - 1; ++map_it) { + ++map_it->second; + } + + ++m_added_lines_counter; + } + } + } + + // write to file: + // m_write_type == EWriteType::ByTime - all lines older than m_time - backtrace_time + // m_write_type == EWriteType::BySize - all lines if current size is greater than 65535 bytes + void write(FilePtr& out, float backtrace_time, GCodeProcessorResult& result, const std::string& out_path) { + if (m_lines.empty()) + return; + + // collect lines to write into a single string + std::string out_string; + if (!m_lines.empty()) { + if (m_write_type == EWriteType::ByTime) { + while (m_lines.front().time < m_time - backtrace_time) { + const LineData& data = m_lines.front(); + out_string += data.line; + m_size -= data.line.length(); + m_lines.pop_front(); +#ifndef NDEBUG + m_statistics.remove_line(); +#endif // NDEBUG + } + } + else { + if (m_size > 65535) { + while (!m_lines.empty()) { + out_string += m_lines.front().line; + m_lines.pop_front(); + } + m_size = 0; +#ifndef NDEBUG + m_statistics.remove_all_lines(); +#endif // NDEBUG + } + } + } + + write_to_file(out, out_string, result, out_path); + } + + // flush the current content of the cache to file + void flush(FilePtr& out, GCodeProcessorResult& result, const std::string& out_path) { + // collect lines to flush into a single string + std::string out_string; + while (!m_lines.empty()) { + out_string += m_lines.front().line; + m_lines.pop_front(); + } + m_size = 0; +#ifndef NDEBUG + m_statistics.remove_all_lines(); +#endif // NDEBUG + + write_to_file(out, out_string, result, out_path); + } + + void synchronize_moves(GCodeProcessorResult& result) const { + auto it = m_gcode_lines_map.begin(); + for (GCodeProcessorResult::MoveVertex& move : result.moves) { + while (it != m_gcode_lines_map.end() && it->first < move.gcode_id) { + ++it; + } + if (it != m_gcode_lines_map.end() && it->first == move.gcode_id) + move.gcode_id = it->second; + } + } + + size_t get_size() const { return m_size; } + + private: + void write_to_file(FilePtr& out, const std::string& out_string, GCodeProcessorResult& result, const std::string& out_path) { + if (!out_string.empty()) { + fwrite((const void*)out_string.c_str(), 1, out_string.length(), out.f); + if (ferror(out.f)) { + out.close(); + boost::nowide::remove(out_path.c_str()); + throw Slic3r::RuntimeError(std::string("GCode processor post process export failed.\nIs the disk full?\n")); + } + for (size_t i = 0; i < out_string.size(); ++i) { + if (out_string[i] == '\n') + result.lines_ends.emplace_back(m_out_file_pos + i + 1); + } + m_out_file_pos += out_string.size(); + } + } + }; + + ExportLines export_lines(m_result.backtrace_enabled ? ExportLines::EWriteType::ByTime : ExportLines::EWriteType::BySize, m_time_processor.machines[0]); +#else + // buffer line to export only when greater than 64K to reduce writing calls + std::string export_line; +#endif // ENABLE_GCODE_POSTPROCESS_BACKTRACE + + // replace placeholder lines with the proper final value + // gcode_line is in/out parameter, to reduce expensive memory allocation + auto process_placeholders = [&](std::string& gcode_line) { +#if ENABLE_GCODE_POSTPROCESS_BACKTRACE + bool processed = false; +#else + unsigned int extra_lines_count = 0; +#endif // ENABLE_GCODE_POSTPROCESS_BACKTRACE + + // remove trailing '\n' + auto line = std::string_view(gcode_line).substr(0, gcode_line.length() - 1); + +#if !ENABLE_GCODE_POSTPROCESS_BACKTRACE + std::string ret; +#endif // !ENABLE_GCODE_POSTPROCESS_BACKTRACE + if (line.length() > 1) { + line = line.substr(1); + if (m_time_processor.export_remaining_time_enabled && + (line == reserved_tag(ETags::First_Line_M73_Placeholder) || line == reserved_tag(ETags::Last_Line_M73_Placeholder))) { + for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { + const TimeMachine& machine = m_time_processor.machines[i]; + if (machine.enabled) { + // export pair +#if ENABLE_GCODE_POSTPROCESS_BACKTRACE + export_lines.append_line(format_line_M73_main(machine.line_m73_main_mask.c_str(), + (line == reserved_tag(ETags::First_Line_M73_Placeholder)) ? 0 : 100, + (line == reserved_tag(ETags::First_Line_M73_Placeholder)) ? time_in_minutes(machine.time) : 0)); + processed = true; +#else + ret += format_line_M73_main(machine.line_m73_main_mask.c_str(), + (line == reserved_tag(ETags::First_Line_M73_Placeholder)) ? 0 : 100, + (line == reserved_tag(ETags::First_Line_M73_Placeholder)) ? time_in_minutes(machine.time) : 0); + ++extra_lines_count; +#endif // ENABLE_GCODE_POSTPROCESS_BACKTRACE + + // export remaining time to next printer stop + if (line == reserved_tag(ETags::First_Line_M73_Placeholder) && !machine.stop_times.empty()) { + const int to_export_stop = time_in_minutes(machine.stop_times.front().elapsed_time); +#if ENABLE_GCODE_POSTPROCESS_BACKTRACE + export_lines.append_line(format_line_M73_stop_int(machine.line_m73_stop_mask.c_str(), to_export_stop)); + last_exported_stop[i] = to_export_stop; +#else + ret += format_line_M73_stop_int(machine.line_m73_stop_mask.c_str(), to_export_stop); + last_exported_stop[i] = to_export_stop; + ++extra_lines_count; +#endif // ENABLE_GCODE_POSTPROCESS_BACKTRACE + } + } + } + } + else if (line == reserved_tag(ETags::Estimated_Printing_Time_Placeholder)) { + for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { + const TimeMachine& machine = m_time_processor.machines[i]; + PrintEstimatedStatistics::ETimeMode mode = static_cast(i); + if (mode == PrintEstimatedStatistics::ETimeMode::Normal || machine.enabled) { + char buf[128]; + sprintf(buf, "; estimated printing time (%s mode) = %s\n", + (mode == PrintEstimatedStatistics::ETimeMode::Normal) ? "normal" : "silent", + get_time_dhms(machine.time).c_str()); +#if ENABLE_GCODE_POSTPROCESS_BACKTRACE + export_lines.append_line(buf); + processed = true; +#else + ret += buf; +#endif // ENABLE_GCODE_POSTPROCESS_BACKTRACE + } + } + for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { + const TimeMachine& machine = m_time_processor.machines[i]; + PrintEstimatedStatistics::ETimeMode mode = static_cast(i); + if (mode == PrintEstimatedStatistics::ETimeMode::Normal || machine.enabled) { + char buf[128]; + sprintf(buf, "; estimated first layer printing time (%s mode) = %s\n", + (mode == PrintEstimatedStatistics::ETimeMode::Normal) ? "normal" : "silent", + get_time_dhms(machine.layers_time.empty() ? 0.f : machine.layers_time.front()).c_str()); +#if ENABLE_GCODE_POSTPROCESS_BACKTRACE + export_lines.append_line(buf); + processed = true; +#else + ret += buf; +#endif // ENABLE_GCODE_POSTPROCESS_BACKTRACE + } + } + } + } + +#if ENABLE_GCODE_POSTPROCESS_BACKTRACE + return processed; +#else + if (!ret.empty()) + // Not moving the move operator on purpose, so that the gcode_line allocation will grow and it will not be reallocated after handful of lines are processed. + gcode_line = ret; + return std::tuple(!ret.empty(), (extra_lines_count == 0) ? extra_lines_count : extra_lines_count - 1); +#endif // ENABLE_GCODE_POSTPROCESS_BACKTRACE + }; + + std::vector filament_mm(m_result.extruders_count, 0.0); + std::vector filament_cm3(m_result.extruders_count, 0.0); + std::vector filament_g(m_result.extruders_count, 0.0); + std::vector filament_cost(m_result.extruders_count, 0.0); + + double filament_total_g = 0.0; + double filament_total_cost = 0.0; + + for (const auto& [id, volume] : m_result.print_statistics.volumes_per_extruder) { + filament_mm[id] = volume / (static_cast(M_PI) * sqr(0.5 * m_result.filament_diameters[id])); + filament_cm3[id] = volume * 0.001; + filament_g[id] = filament_cm3[id] * double(m_result.filament_densities[id]); + filament_cost[id] = filament_g[id] * double(m_result.filament_cost[id]) * 0.001; + filament_total_g += filament_g[id]; + filament_total_cost += filament_cost[id]; + } + + auto process_used_filament = [&](std::string& gcode_line) { + // Prefilter for parsing speed. + if (gcode_line.size() < 8 || gcode_line[0] != ';' || gcode_line[1] != ' ') + return false; + if (const char c = gcode_line[2]; c != 'f' && c != 't') + return false; + auto process_tag = [](std::string& gcode_line, const std::string_view tag, const std::vector& values) { + if (boost::algorithm::starts_with(gcode_line, tag)) { + gcode_line = tag; + char buf[1024]; + for (size_t i = 0; i < values.size(); ++i) { + sprintf(buf, i == values.size() - 1 ? " %.2lf\n" : " %.2lf,", values[i]); + gcode_line += buf; + } + return true; + } + return false; + }; + + bool ret = false; + ret |= process_tag(gcode_line, "; filament used [mm] =", filament_mm); + ret |= process_tag(gcode_line, "; filament used [g] =", filament_g); + ret |= process_tag(gcode_line, "; total filament used [g] =", { filament_total_g }); + ret |= process_tag(gcode_line, "; filament used [cm3] =", filament_cm3); + ret |= process_tag(gcode_line, "; filament cost =", filament_cost); + ret |= process_tag(gcode_line, "; total filament cost =", { filament_total_cost }); + return ret; + }; + + // check for temporary lines + auto is_temporary_decoration = [](const std::string_view gcode_line) { + // remove trailing '\n' + assert(!gcode_line.empty()); + assert(gcode_line.back() == '\n'); + + // return true for decorations which are used in processing the gcode but that should not be exported into the final gcode + // i.e.: + // bool ret = gcode_line.substr(0, gcode_line.length() - 1) == ";" + Layer_Change_Tag; + // ... + // return ret; + return false; + }; + + // Iterators for the normal and silent cached time estimate entry recently processed, used by process_line_G1. + auto g1_times_cache_it = Slic3r::reserve_vector::const_iterator>(m_time_processor.machines.size()); + for (const auto& machine : m_time_processor.machines) + g1_times_cache_it.emplace_back(machine.g1_times_cache.begin()); + + // add lines M73 to exported gcode + auto process_line_G1 = [this, + // Lambdas, mostly for string formatting, all with an empty capture block. + time_in_minutes, format_time_float, format_line_M73_main, format_line_M73_stop_int, format_line_M73_stop_float, time_in_last_minute, + // Caches, to be modified + &g1_times_cache_it, &last_exported_main, &last_exported_stop, +#if ENABLE_GCODE_POSTPROCESS_BACKTRACE + &export_lines] +#else + // String output + &export_line] +#endif // ENABLE_GCODE_POSTPROCESS_BACKTRACE + (const size_t g1_lines_counter) { +#if !ENABLE_GCODE_POSTPROCESS_BACKTRACE + unsigned int exported_lines_count = 0; +#endif // !ENABLE_GCODE_POSTPROCESS_BACKTRACE + if (m_time_processor.export_remaining_time_enabled) { + for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { + const TimeMachine& machine = m_time_processor.machines[i]; + if (machine.enabled) { + // export pair + // Skip all machine.g1_times_cache below g1_lines_counter. + auto& it = g1_times_cache_it[i]; + while (it != machine.g1_times_cache.end() && it->id < g1_lines_counter) + ++it; + if (it != machine.g1_times_cache.end() && it->id == g1_lines_counter) { + std::pair to_export_main = { int(100.0f * it->elapsed_time / machine.time), + time_in_minutes(machine.time - it->elapsed_time) }; + if (last_exported_main[i] != to_export_main) { +#if ENABLE_GCODE_POSTPROCESS_BACKTRACE + export_lines.append_line(format_line_M73_main(machine.line_m73_main_mask.c_str(), + to_export_main.first, to_export_main.second)); +#else + export_line += format_line_M73_main(machine.line_m73_main_mask.c_str(), + to_export_main.first, to_export_main.second); +#endif // ENABLE_GCODE_POSTPROCESS_BACKTRACE + last_exported_main[i] = to_export_main; +#if !ENABLE_GCODE_POSTPROCESS_BACKTRACE + ++exported_lines_count; +#endif // !ENABLE_GCODE_POSTPROCESS_BACKTRACE + } + // export remaining time to next printer stop + auto it_stop = std::upper_bound(machine.stop_times.begin(), machine.stop_times.end(), it->elapsed_time, + [](float value, const TimeMachine::StopTime& t) { return value < t.elapsed_time; }); + if (it_stop != machine.stop_times.end()) { + int to_export_stop = time_in_minutes(it_stop->elapsed_time - it->elapsed_time); + if (last_exported_stop[i] != to_export_stop) { + if (to_export_stop > 0) { + if (last_exported_stop[i] != to_export_stop) { +#if ENABLE_GCODE_POSTPROCESS_BACKTRACE + export_lines.append_line(format_line_M73_stop_int(machine.line_m73_stop_mask.c_str(), to_export_stop)); +#else + export_line += format_line_M73_stop_int(machine.line_m73_stop_mask.c_str(), to_export_stop); +#endif // ENABLE_GCODE_POSTPROCESS_BACKTRACE + last_exported_stop[i] = to_export_stop; +#if !ENABLE_GCODE_POSTPROCESS_BACKTRACE + ++exported_lines_count; +#endif // !ENABLE_GCODE_POSTPROCESS_BACKTRACE + } + } + else { + bool is_last = false; + auto next_it = it + 1; + is_last |= (next_it == machine.g1_times_cache.end()); + + if (next_it != machine.g1_times_cache.end()) { + auto next_it_stop = std::upper_bound(machine.stop_times.begin(), machine.stop_times.end(), next_it->elapsed_time, + [](float value, const TimeMachine::StopTime& t) { return value < t.elapsed_time; }); + is_last |= (next_it_stop != it_stop); + + std::string time_float_str = format_time_float(time_in_last_minute(it_stop->elapsed_time - it->elapsed_time)); + std::string next_time_float_str = format_time_float(time_in_last_minute(it_stop->elapsed_time - next_it->elapsed_time)); + is_last |= (string_to_double_decimal_point(time_float_str) > 0. && string_to_double_decimal_point(next_time_float_str) == 0.); + } + + if (is_last) { +#if ENABLE_GCODE_POSTPROCESS_BACKTRACE + if (std::distance(machine.stop_times.begin(), it_stop) == static_cast(machine.stop_times.size() - 1)) + export_lines.append_line(format_line_M73_stop_int(machine.line_m73_stop_mask.c_str(), to_export_stop)); + else + export_lines.append_line(format_line_M73_stop_float(machine.line_m73_stop_mask.c_str(), time_in_last_minute(it_stop->elapsed_time - it->elapsed_time))); +#else + if (std::distance(machine.stop_times.begin(), it_stop) == static_cast(machine.stop_times.size() - 1)) + export_line += format_line_M73_stop_int(machine.line_m73_stop_mask.c_str(), to_export_stop); + else + export_line += format_line_M73_stop_float(machine.line_m73_stop_mask.c_str(), time_in_last_minute(it_stop->elapsed_time - it->elapsed_time)); +#endif // ENABLE_GCODE_POSTPROCESS_BACKTRACE + + last_exported_stop[i] = to_export_stop; +#if !ENABLE_GCODE_POSTPROCESS_BACKTRACE + ++exported_lines_count; +#endif // !ENABLE_GCODE_POSTPROCESS_BACKTRACE + } + } + } + } + } + } + } + } +#if !ENABLE_GCODE_POSTPROCESS_BACKTRACE + return exported_lines_count; +#endif // !ENABLE_GCODE_POSTPROCESS_BACKTRACE + }; + +#if ENABLE_GCODE_POSTPROCESS_BACKTRACE + // add lines XXX to exported gcode + auto process_line_T = [this, &export_lines](const std::string& gcode_line, const size_t g1_lines_counter, const ExportLines::Backtrace& backtrace) { + const std::string cmd = GCodeReader::GCodeLine::extract_cmd(gcode_line); + if (cmd.size() >= 2) { + std::stringstream ss(cmd.substr(1)); + int tool_number = -1; + ss >> tool_number; + if (tool_number != -1) + export_lines.insert_lines(backtrace, cmd, + // line inserter + [tool_number, this](unsigned int id, float time, float time_diff) { + int temperature = int( m_layer_id != 1 ? m_extruder_temps_config[tool_number] : m_extruder_temps_first_layer_config[tool_number]); + const std::string out = "M104 T" + std::to_string(tool_number) + " P" + std::to_string(int(std::round(time_diff))) + " S" + std::to_string(temperature) + "\n"; + return out; + }, + // line replacer + [this, tool_number](const std::string& line) { + if (GCodeReader::GCodeLine::cmd_is(line, "M104")) { + GCodeReader::GCodeLine gline; + GCodeReader reader; + reader.parse_line(line, [&gline](GCodeReader& reader, const GCodeReader::GCodeLine& l) { gline = l; }); + + float val; + if (gline.has_value('T', val) && gline.raw().find("cooldown") != std::string::npos && m_is_XL_printer) { + if (static_cast(val) == tool_number) + return std::string("; removed M104\n"); + } + } + return line; + }); + } + }; +#endif // ENABLE_GCODE_POSTPROCESS_BACKTRACE + + m_result.lines_ends.clear(); +#if !ENABLE_GCODE_POSTPROCESS_BACKTRACE + // helper function to write to disk + size_t out_file_pos = 0; + auto write_string = [this, &export_line, &out, &out_path, &out_file_pos](const std::string& str) { + fwrite((const void*)export_line.c_str(), 1, export_line.length(), out.f); + if (ferror(out.f)) { + out.close(); + boost::nowide::remove(out_path.c_str()); + throw Slic3r::RuntimeError(std::string("GCode processor post process export failed.\nIs the disk full?\n")); + } + for (size_t i = 0; i < export_line.size(); ++i) + if (export_line[i] == '\n') + m_result.lines_ends.emplace_back(out_file_pos + i + 1); + out_file_pos += export_line.size(); + export_line.clear(); + }; +#endif // !ENABLE_GCODE_POSTPROCESS_BACKTRACE + + unsigned int line_id = 0; +#if ENABLE_GCODE_POSTPROCESS_BACKTRACE + // Backtrace data for Tx gcode lines + static const ExportLines::Backtrace backtrace_T = { 120.0f, 10 }; + // In case there are multiple sources of backtracing, keeps track of the longest backtrack time needed + // to flush the backtrace cache accordingly + float max_backtrace_time = 120.0f; +#else + std::vector> offsets; +#endif // ENABLE_GCODE_POSTPROCESS_BACKTRACE + + { + // Read the input stream 64kB at a time, extract lines and process them. + std::vector buffer(65536 * 10, 0); + // Line buffer. + assert(gcode_line.empty()); + for (;;) { + size_t cnt_read = ::fread(buffer.data(), 1, buffer.size(), in.f); + if (::ferror(in.f)) + throw Slic3r::RuntimeError(std::string("GCode processor post process export failed.\nError while reading from file.\n")); + bool eof = cnt_read == 0; + auto it = buffer.begin(); + auto it_bufend = buffer.begin() + cnt_read; + while (it != it_bufend || (eof && !gcode_line.empty())) { + // Find end of line. + bool eol = false; + auto it_end = it; + for (; it_end != it_bufend && !(eol = *it_end == '\r' || *it_end == '\n'); ++it_end); + // End of line is indicated also if end of file was reached. + eol |= eof && it_end == it_bufend; + gcode_line.insert(gcode_line.end(), it, it_end); + if (eol) { + ++line_id; +#if ENABLE_GCODE_POSTPROCESS_BACKTRACE + export_lines.update(line_id, g1_lines_counter); +#endif // ENABLE_GCODE_POSTPROCESS_BACKTRACE + + gcode_line += "\n"; + // replace placeholder lines +#if ENABLE_GCODE_POSTPROCESS_BACKTRACE + bool processed = process_placeholders(gcode_line); + if (processed) + gcode_line.clear(); +#else + auto [processed, lines_added_count] = process_placeholders(gcode_line); + if (processed && lines_added_count > 0) + offsets.push_back({ line_id, lines_added_count }); +#endif // ENABLE_GCODE_POSTPROCESS_BACKTRACE + if (!processed) + processed = process_used_filament(gcode_line); +#if ENABLE_GCODE_POSTPROCESS_BACKTRACE + if (!processed && !is_temporary_decoration(gcode_line)) { + if (GCodeReader::GCodeLine::cmd_is(gcode_line, "G1")) + // add lines M73 where needed + process_line_G1(g1_lines_counter++); + else if (m_result.backtrace_enabled && GCodeReader::GCodeLine::cmd_starts_with(gcode_line, "T")) { + // add lines XXX where needed + process_line_T(gcode_line, g1_lines_counter, backtrace_T); + max_backtrace_time = std::max(max_backtrace_time, backtrace_T.time); + } + } + + if (!gcode_line.empty()) + export_lines.append_line(gcode_line); + export_lines.write(out, 1.1f * max_backtrace_time, m_result, out_path); +#else + if (!processed && !is_temporary_decoration(gcode_line) && GCodeReader::GCodeLine::cmd_is(gcode_line, "G1")) { + // remove temporary lines, add lines M73 where needed + unsigned int extra_lines_count = process_line_G1(g1_lines_counter++); + if (extra_lines_count > 0) + offsets.push_back({ line_id, extra_lines_count }); + } + + export_line += gcode_line; + if (export_line.length() > 65535) + write_string(export_line); +#endif // ENABLE_GCODE_POSTPROCESS_BACKTRACE + gcode_line.clear(); + } + // Skip EOL. + it = it_end; + if (it != it_bufend && *it == '\r') + ++it; + if (it != it_bufend && *it == '\n') + ++it; + } + if (eof) + break; + } + } + +#if ENABLE_GCODE_POSTPROCESS_BACKTRACE + export_lines.flush(out, m_result, out_path); +#else + if (!export_line.empty()) + write_string(export_line); +#endif // ENABLE_GCODE_POSTPROCESS_BACKTRACE + + out.close(); + in.close(); + +#if ENABLE_GCODE_POSTPROCESS_BACKTRACE + export_lines.synchronize_moves(m_result); +#else + // updates moves' gcode ids which have been modified by the insertion of the M73 lines + unsigned int curr_offset_id = 0; + unsigned int total_offset = 0; + for (GCodeProcessorResult::MoveVertex& move : m_result.moves) { + while (curr_offset_id < static_cast(offsets.size()) && offsets[curr_offset_id].first <= move.gcode_id) { + total_offset += offsets[curr_offset_id].second; + ++curr_offset_id; + } + move.gcode_id += total_offset; + } +#endif // ENABLE_GCODE_POSTPROCESS_BACKTRACE + + if (rename_file(out_path, m_result.filename)) + throw Slic3r::RuntimeError(std::string("Failed to rename the output G-code file from ") + out_path + " to " + m_result.filename + '\n' + + "Is " + out_path + " locked?" + '\n'); +} + +void GCodeProcessor::store_move_vertex(EMoveType type, bool internal_only) +{ + m_last_line_id = (type == EMoveType::Color_change || type == EMoveType::Pause_Print || type == EMoveType::Custom_GCode) ? + m_line_id + 1 : + ((type == EMoveType::Seam) ? m_last_line_id : m_line_id); + + m_result.moves.push_back({ + m_last_line_id, + type, + m_extrusion_role, + m_extruder_id, + m_cp_color.current, + Vec3f(m_end_position[X], m_end_position[Y], m_end_position[Z] - m_z_offset) + m_extruder_offsets[m_extruder_id], + static_cast(m_end_position[E] - m_start_position[E]), + m_feedrate, + m_width, + m_height, + m_mm3_per_mm, + m_fan_speed, + m_extruder_temps[m_extruder_id], + static_cast(m_result.moves.size()), + internal_only + }); + + // stores stop time placeholders for later use + if (type == EMoveType::Color_change || type == EMoveType::Pause_Print) { + for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { + TimeMachine& machine = m_time_processor.machines[i]; + if (!machine.enabled) + continue; + + machine.stop_times.push_back({ m_g1_line_id, 0.0f }); + } + } +} + +void GCodeProcessor::set_extrusion_role(GCodeExtrusionRole role) +{ + m_used_filaments.process_role_cache(this); + m_extrusion_role = role; +} + +float GCodeProcessor::minimum_feedrate(PrintEstimatedStatistics::ETimeMode mode, float feedrate) const +{ + if (m_time_processor.machine_limits.machine_min_extruding_rate.empty()) + return feedrate; + + return std::max(feedrate, get_option_value(m_time_processor.machine_limits.machine_min_extruding_rate, static_cast(mode))); +} + +float GCodeProcessor::minimum_travel_feedrate(PrintEstimatedStatistics::ETimeMode mode, float feedrate) const +{ + if (m_time_processor.machine_limits.machine_min_travel_rate.empty()) + return feedrate; + + return std::max(feedrate, get_option_value(m_time_processor.machine_limits.machine_min_travel_rate, static_cast(mode))); +} + +float GCodeProcessor::get_axis_max_feedrate(PrintEstimatedStatistics::ETimeMode mode, Axis axis) const +{ + switch (axis) + { + case X: { return get_option_value(m_time_processor.machine_limits.machine_max_feedrate_x, static_cast(mode)); } + case Y: { return get_option_value(m_time_processor.machine_limits.machine_max_feedrate_y, static_cast(mode)); } + case Z: { return get_option_value(m_time_processor.machine_limits.machine_max_feedrate_z, static_cast(mode)); } + case E: { return get_option_value(m_time_processor.machine_limits.machine_max_feedrate_e, static_cast(mode)); } + default: { return 0.0f; } + } +} + +float GCodeProcessor::get_axis_max_acceleration(PrintEstimatedStatistics::ETimeMode mode, Axis axis) const +{ + switch (axis) + { + case X: { return get_option_value(m_time_processor.machine_limits.machine_max_acceleration_x, static_cast(mode)); } + case Y: { return get_option_value(m_time_processor.machine_limits.machine_max_acceleration_y, static_cast(mode)); } + case Z: { return get_option_value(m_time_processor.machine_limits.machine_max_acceleration_z, static_cast(mode)); } + case E: { return get_option_value(m_time_processor.machine_limits.machine_max_acceleration_e, static_cast(mode)); } + default: { return 0.0f; } + } +} + +float GCodeProcessor::get_axis_max_jerk(PrintEstimatedStatistics::ETimeMode mode, Axis axis) const +{ + switch (axis) + { + case X: { return get_option_value(m_time_processor.machine_limits.machine_max_jerk_x, static_cast(mode)); } + case Y: { return get_option_value(m_time_processor.machine_limits.machine_max_jerk_y, static_cast(mode)); } + case Z: { return get_option_value(m_time_processor.machine_limits.machine_max_jerk_z, static_cast(mode)); } + case E: { return get_option_value(m_time_processor.machine_limits.machine_max_jerk_e, static_cast(mode)); } + default: { return 0.0f; } + } +} + +float GCodeProcessor::get_retract_acceleration(PrintEstimatedStatistics::ETimeMode mode) const +{ + size_t id = static_cast(mode); + return (id < m_time_processor.machines.size()) ? m_time_processor.machines[id].retract_acceleration : DEFAULT_RETRACT_ACCELERATION; +} + +void GCodeProcessor::set_retract_acceleration(PrintEstimatedStatistics::ETimeMode mode, float value) +{ + size_t id = static_cast(mode); + if (id < m_time_processor.machines.size()) { + m_time_processor.machines[id].retract_acceleration = (m_time_processor.machines[id].max_retract_acceleration == 0.0f) ? value : + // Clamp the acceleration with the maximum. + std::min(value, m_time_processor.machines[id].max_retract_acceleration); + } +} + +float GCodeProcessor::get_acceleration(PrintEstimatedStatistics::ETimeMode mode) const +{ + size_t id = static_cast(mode); + return (id < m_time_processor.machines.size()) ? m_time_processor.machines[id].acceleration : DEFAULT_ACCELERATION; +} + +void GCodeProcessor::set_acceleration(PrintEstimatedStatistics::ETimeMode mode, float value) +{ + size_t id = static_cast(mode); + if (id < m_time_processor.machines.size()) { + m_time_processor.machines[id].acceleration = (m_time_processor.machines[id].max_acceleration == 0.0f) ? value : + // Clamp the acceleration with the maximum. + std::min(value, m_time_processor.machines[id].max_acceleration); + } +} + +float GCodeProcessor::get_travel_acceleration(PrintEstimatedStatistics::ETimeMode mode) const +{ + size_t id = static_cast(mode); + return (id < m_time_processor.machines.size()) ? m_time_processor.machines[id].travel_acceleration : DEFAULT_TRAVEL_ACCELERATION; +} + +void GCodeProcessor::set_travel_acceleration(PrintEstimatedStatistics::ETimeMode mode, float value) +{ + size_t id = static_cast(mode); + if (id < m_time_processor.machines.size()) { + m_time_processor.machines[id].travel_acceleration = (m_time_processor.machines[id].max_travel_acceleration == 0.0f) ? value : + // Clamp the acceleration with the maximum. + std::min(value, m_time_processor.machines[id].max_travel_acceleration); + } +} + +float GCodeProcessor::get_filament_load_time(size_t extruder_id) +{ + if (m_is_XL_printer) + return 4.5f; // FIXME + return (m_time_processor.filament_load_times.empty() || m_time_processor.extruder_unloaded) ? + 0.0f : + ((extruder_id < m_time_processor.filament_load_times.size()) ? + m_time_processor.filament_load_times[extruder_id] : m_time_processor.filament_load_times.front()); +} + +float GCodeProcessor::get_filament_unload_time(size_t extruder_id) +{ + if (m_is_XL_printer) + return 0.f; // FIXME + return (m_time_processor.filament_unload_times.empty() || m_time_processor.extruder_unloaded) ? + 0.0f : + ((extruder_id < m_time_processor.filament_unload_times.size()) ? + m_time_processor.filament_unload_times[extruder_id] : m_time_processor.filament_unload_times.front()); +} + +void GCodeProcessor::process_custom_gcode_time(CustomGCode::Type code) +{ + for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { + TimeMachine& machine = m_time_processor.machines[i]; + if (!machine.enabled) + continue; + + TimeMachine::CustomGCodeTime& gcode_time = machine.gcode_time; + gcode_time.needed = true; + //FIXME this simulates st_synchronize! is it correct? + // The estimated time may be longer than the real print time. + machine.simulate_st_synchronize(); + if (gcode_time.cache != 0.0f) { + gcode_time.times.push_back({ code, gcode_time.cache }); + gcode_time.cache = 0.0f; + } + } +} + +void GCodeProcessor::process_filaments(CustomGCode::Type code) +{ + if (code == CustomGCode::ColorChange) + m_used_filaments.process_color_change_cache(); + + if (code == CustomGCode::ToolChange) + m_used_filaments.process_extruder_cache(m_extruder_id); +} + +void GCodeProcessor::simulate_st_synchronize(float additional_time) +{ + for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { + m_time_processor.machines[i].simulate_st_synchronize(additional_time); + } +} + +void GCodeProcessor::update_estimated_times_stats() +{ + auto update_mode = [this](PrintEstimatedStatistics::ETimeMode mode) { + PrintEstimatedStatistics::Mode& data = m_result.print_statistics.modes[static_cast(mode)]; + data.time = get_time(mode); + data.travel_time = get_travel_time(mode); + data.custom_gcode_times = get_custom_gcode_times(mode, true); + data.moves_times = get_moves_time(mode); + data.roles_times = get_roles_time(mode); + data.layers_times = get_layers_time(mode); + }; + + update_mode(PrintEstimatedStatistics::ETimeMode::Normal); + if (m_time_processor.machines[static_cast(PrintEstimatedStatistics::ETimeMode::Stealth)].enabled) + update_mode(PrintEstimatedStatistics::ETimeMode::Stealth); + else + m_result.print_statistics.modes[static_cast(PrintEstimatedStatistics::ETimeMode::Stealth)].reset(); + + m_result.print_statistics.volumes_per_color_change = m_used_filaments.volumes_per_color_change; + m_result.print_statistics.volumes_per_extruder = m_used_filaments.volumes_per_extruder; + m_result.print_statistics.used_filaments_per_role = m_used_filaments.filaments_per_role; +} + +double GCodeProcessor::extract_absolute_position_on_axis(Axis axis, const GCodeReader::GCodeLine& line, double area_filament_cross_section) +{ + if (line.has(Slic3r::Axis(axis))) { + bool is_relative = (m_global_positioning_type == EPositioningType::Relative); + if (axis == E) + is_relative |= (m_e_local_positioning_type == EPositioningType::Relative); + + const double lengthsScaleFactor = (m_units == EUnits::Inches) ? double(INCHES_TO_MM) : 1.0; + double ret = line.value(Slic3r::Axis(axis)) * lengthsScaleFactor; + if (axis == E && m_use_volumetric_e) + ret /= area_filament_cross_section; + return is_relative ? m_start_position[axis] + ret : m_origin[axis] + ret; + } + else + return m_start_position[axis]; +} + +} /* namespace Slic3r */ + diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index edc2c12728e..856d5b31f0a 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -1,755 +1,798 @@ -#ifndef slic3r_GCodeProcessor_hpp_ -#define slic3r_GCodeProcessor_hpp_ - -#include "libslic3r/GCodeReader.hpp" -#include "libslic3r/Point.hpp" -#include "libslic3r/ExtrusionEntity.hpp" -#include "libslic3r/PrintConfig.hpp" -#include "libslic3r/CustomGCode.hpp" - -#include -#include -#include -#include -#include -#include - -namespace Slic3r { - - enum class EMoveType : unsigned char - { - Noop, - Retract, - Unretract, - Seam, - Tool_change, - Color_change, - Pause_Print, - Custom_GCode, - Travel, - Wipe, - Extrude, - Count - }; - - struct PrintEstimatedStatistics - { - enum class ETimeMode : unsigned char - { - Normal, - Stealth, - Count - }; - - struct Mode - { - float time; - std::vector>> custom_gcode_times; - std::vector> moves_times; - std::vector> roles_times; - std::vector layers_times; - - void reset() { - time = 0.0f; - custom_gcode_times.clear(); - moves_times.clear(); - roles_times.clear(); - layers_times.clear(); - } - }; - - std::vector volumes_per_color_change; - std::map volumes_per_extruder; - std::map> used_filaments_per_role; - - std::array(ETimeMode::Count)> modes; - - PrintEstimatedStatistics() { reset(); } - - void reset() { - for (auto m : modes) { - m.reset(); - } - volumes_per_color_change.clear(); - volumes_per_extruder.clear(); - used_filaments_per_role.clear(); - } - }; - - struct GCodeProcessorResult - { - struct SettingsIds - { - std::string print; - std::vector filament; - std::string printer; - - void reset() { - print.clear(); - filament.clear(); - printer.clear(); - } - }; - - struct MoveVertex - { - unsigned int gcode_id{ 0 }; - EMoveType type{ EMoveType::Noop }; - ExtrusionRole extrusion_role{ erNone }; - unsigned char extruder_id{ 0 }; - unsigned char cp_color_id{ 0 }; - Vec3f position{ Vec3f::Zero() }; // mm - float delta_extruder{ 0.0f }; // mm - float feedrate{ 0.0f }; // mm/s - float width{ 0.0f }; // mm - float height{ 0.0f }; // mm - float mm3_per_mm{ 0.0f }; - float fan_speed{ 0.0f }; // percentage - float temperature{ 0.0f }; // Celsius degrees - float time{ 0.0f }; // s - - float volumetric_rate() const { return feedrate * mm3_per_mm; } - }; - - std::string filename; - unsigned int id; - std::vector moves; - // Positions of ends of lines of the final G-code this->filename after TimeProcessor::post_process() finalizes the G-code. - std::vector lines_ends; - Pointfs bed_shape; - float max_print_height; - SettingsIds settings_ids; - size_t extruders_count; - std::vector extruder_colors; - std::vector filament_diameters; - std::vector filament_densities; - PrintEstimatedStatistics print_statistics; - std::vector custom_gcode_per_print_z; -#if ENABLE_SPIRAL_VASE_LAYERS - std::vector>> spiral_vase_layers; -#endif // ENABLE_SPIRAL_VASE_LAYERS - -#if ENABLE_GCODE_VIEWER_STATISTICS - int64_t time{ 0 }; -#endif // ENABLE_GCODE_VIEWER_STATISTICS - void reset(); - }; - - - class GCodeProcessor - { - static const std::vector Reserved_Tags; - - public: - enum class ETags : unsigned char - { - Role, - Wipe_Start, - Wipe_End, - Height, - Width, - Layer_Change, - Color_Change, - Pause_Print, - Custom_Code, - First_Line_M73_Placeholder, - Last_Line_M73_Placeholder, - Estimated_Printing_Time_Placeholder - }; - - static const std::string& reserved_tag(ETags tag) { return Reserved_Tags[static_cast(tag)]; } - // checks the given gcode for reserved tags and returns true when finding the 1st (which is returned into found_tag) - static bool contains_reserved_tag(const std::string& gcode, std::string& found_tag); - // checks the given gcode for reserved tags and returns true when finding any - // (the first max_count found tags are returned into found_tag) - static bool contains_reserved_tags(const std::string& gcode, unsigned int max_count, std::vector& found_tag); - - static const float Wipe_Width; - static const float Wipe_Height; - -#if ENABLE_GCODE_VIEWER_DATA_CHECKING - static const std::string Mm3_Per_Mm_Tag; -#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING - - private: - using AxisCoords = std::array; - using ExtruderColors = std::vector; - using ExtruderTemps = std::vector; - - enum class EUnits : unsigned char - { - Millimeters, - Inches - }; - - enum class EPositioningType : unsigned char - { - Absolute, - Relative - }; - - struct CachedPosition - { - AxisCoords position; // mm - float feedrate; // mm/s - - void reset(); - }; - - struct CpColor - { - unsigned char counter; - unsigned char current; - - void reset(); - }; - - public: - struct FeedrateProfile - { - float entry{ 0.0f }; // mm/s - float cruise{ 0.0f }; // mm/s - float exit{ 0.0f }; // mm/s - }; - - struct Trapezoid - { - float accelerate_until{ 0.0f }; // mm - float decelerate_after{ 0.0f }; // mm - float cruise_feedrate{ 0.0f }; // mm/sec - - float acceleration_time(float entry_feedrate, float acceleration) const; - float cruise_time() const; - float deceleration_time(float distance, float acceleration) const; - float cruise_distance() const; - }; - - struct TimeBlock - { - struct Flags - { - bool recalculate{ false }; - bool nominal_length{ false }; - }; - - EMoveType move_type{ EMoveType::Noop }; - ExtrusionRole role{ erNone }; - unsigned int g1_line_id{ 0 }; - unsigned int layer_id{ 0 }; - float distance{ 0.0f }; // mm - float acceleration{ 0.0f }; // mm/s^2 - float max_entry_speed{ 0.0f }; // mm/s - float safe_feedrate{ 0.0f }; // mm/s - Flags flags; - FeedrateProfile feedrate_profile; - Trapezoid trapezoid; - - // Calculates this block's trapezoid - void calculate_trapezoid(); - - float time() const; - }; - - private: - struct TimeMachine - { - struct State - { - float feedrate; // mm/s - float safe_feedrate; // mm/s - AxisCoords axis_feedrate; // mm/s - AxisCoords abs_axis_feedrate; // mm/s - - void reset(); - }; - - struct CustomGCodeTime - { - bool needed; - float cache; - std::vector> times; - - void reset(); - }; - - struct G1LinesCacheItem - { - unsigned int id; - float elapsed_time; - }; - - bool enabled; - float acceleration; // mm/s^2 - // hard limit for the acceleration, to which the firmware will clamp. - float max_acceleration; // mm/s^2 - float retract_acceleration; // mm/s^2 - // hard limit for the acceleration, to which the firmware will clamp. - float max_retract_acceleration; // mm/s^2 - float travel_acceleration; // mm/s^2 - // hard limit for the travel acceleration, to which the firmware will clamp. - float max_travel_acceleration; // mm/s^2 - float extrude_factor_override_percentage; - float time; // s - struct StopTime - { - unsigned int g1_line_id; - float elapsed_time; - }; - std::vector stop_times; - std::string line_m73_main_mask; - std::string line_m73_stop_mask; - State curr; - State prev; - CustomGCodeTime gcode_time; - std::vector blocks; - std::vector g1_times_cache; - std::array(EMoveType::Count)> moves_time; - std::array(ExtrusionRole::erCount)> roles_time; - std::vector layers_time; - - void reset(); - - // Simulates firmware st_synchronize() call - void simulate_st_synchronize(float additional_time = 0.0f); - void calculate_time(size_t keep_last_n_blocks = 0, float additional_time = 0.0f); - }; - - struct TimeProcessor - { - struct Planner - { - // Size of the firmware planner queue. The old 8-bit Marlins usually just managed 16 trapezoidal blocks. - // Let's be conservative and plan for newer boards with more memory. - static constexpr size_t queue_size = 64; - // The firmware recalculates last planner_queue_size trapezoidal blocks each time a new block is added. - // We are not simulating the firmware exactly, we calculate a sequence of blocks once a reasonable number of blocks accumulate. - static constexpr size_t refresh_threshold = queue_size * 4; - }; - - // extruder_id is currently used to correctly calculate filament load / unload times into the total print time. - // This is currently only really used by the MK3 MMU2: - // extruder_unloaded = true means no filament is loaded yet, all the filaments are parked in the MK3 MMU2 unit. - bool extruder_unloaded; - // whether or not to export post-process the gcode to export lines M73 in it - bool export_remaining_time_enabled; - // allow to skip the lines M201/M203/M204/M205 generated by GCode::print_machine_envelope() for non-Normal time estimate mode - bool machine_envelope_processing_enabled; - MachineEnvelopeConfig machine_limits; - // Additional load / unload times for a filament exchange sequence. - std::vector filament_load_times; - std::vector filament_unload_times; - std::array(PrintEstimatedStatistics::ETimeMode::Count)> machines; - - void reset(); - - // post process the file with the given filename to add remaining time lines M73 - // and updates moves' gcode ids accordingly - void post_process(const std::string& filename, std::vector& moves, std::vector& lines_ends); - }; - - struct UsedFilaments // filaments per ColorChange - { - double color_change_cache; - std::vector volumes_per_color_change; - - double tool_change_cache; - std::map volumes_per_extruder; - - double role_cache; - std::map> filaments_per_role; // ExtrusionRole -> (m, g) - - - void reset(); - - void increase_caches(double extruded_volume, unsigned char extruder_id, double parking_volume, double extra_loading_volume); - - void process_color_change_cache(); - void process_extruder_cache(unsigned char extruder_id); - void process_role_cache(const GCodeProcessor* processor); - void process_caches(const GCodeProcessor* processor); - private: - std::vector extruder_retracted_volume; - bool recent_toolchange = false; - }; - - public: - class SeamsDetector - { - bool m_active{ false }; - std::optional m_first_vertex; - - public: - void activate(bool active) { - if (m_active != active) { - m_active = active; - if (m_active) - m_first_vertex.reset(); - } - } - - std::optional get_first_vertex() const { return m_first_vertex; } - void set_first_vertex(const Vec3f& vertex) { m_first_vertex = vertex; } - - bool is_active() const { return m_active; } - bool has_first_vertex() const { return m_first_vertex.has_value(); } - }; - - // Helper class used to fix the z for color change, pause print and - // custom gcode markes - class OptionsZCorrector - { - GCodeProcessorResult& m_result; - std::optional m_move_id; - std::optional m_custom_gcode_per_print_z_id; - - public: - explicit OptionsZCorrector(GCodeProcessorResult& result) : m_result(result) { - } - - void set() { - m_move_id = m_result.moves.size() - 1; - m_custom_gcode_per_print_z_id = m_result.custom_gcode_per_print_z.size() - 1; - } - - void update(float height) { - if (!m_move_id.has_value() || !m_custom_gcode_per_print_z_id.has_value()) - return; - - const Vec3f position = m_result.moves.back().position; - - GCodeProcessorResult::MoveVertex& move = m_result.moves.emplace_back(m_result.moves[*m_move_id]); - move.position = position; - move.height = height; - m_result.moves.erase(m_result.moves.begin() + *m_move_id); - m_result.custom_gcode_per_print_z[*m_custom_gcode_per_print_z_id].print_z = position.z(); - reset(); - } - - void reset() { - m_move_id.reset(); - m_custom_gcode_per_print_z_id.reset(); - } - }; - -#if ENABLE_GCODE_VIEWER_DATA_CHECKING - struct DataChecker - { - struct Error - { - float value; - float tag_value; - ExtrusionRole role; - }; - - std::string type; - float threshold{ 0.01f }; - float last_tag_value{ 0.0f }; - unsigned int count{ 0 }; - std::vector errors; - - DataChecker(const std::string& type, float threshold) - : type(type), threshold(threshold) - {} - - void update(float value, ExtrusionRole role) { - if (role != erCustom) { - ++count; - if (last_tag_value != 0.0f) { - if (std::abs(value - last_tag_value) / last_tag_value > threshold) - errors.push_back({ value, last_tag_value, role }); - } - } - } - - void reset() { last_tag_value = 0.0f; errors.clear(); count = 0; } - - std::pair get_min() const { - float delta_min = FLT_MAX; - float perc_min = 0.0f; - for (const Error& e : errors) { - if (delta_min > e.value - e.tag_value) { - delta_min = e.value - e.tag_value; - perc_min = 100.0f * delta_min / e.tag_value; - } - } - return { delta_min, perc_min }; - } - - std::pair get_max() const { - float delta_max = -FLT_MAX; - float perc_max = 0.0f; - for (const Error& e : errors) { - if (delta_max < e.value - e.tag_value) { - delta_max = e.value - e.tag_value; - perc_max = 100.0f * delta_max / e.tag_value; - } - } - return { delta_max, perc_max }; - } - - void output() const { - if (!errors.empty()) { - std::cout << type << ":\n"; - std::cout << "Errors: " << errors.size() << " (" << 100.0f * float(errors.size()) / float(count) << "%)\n"; - auto [min, perc_min] = get_min(); - auto [max, perc_max] = get_max(); - std::cout << "min: " << min << "(" << perc_min << "%) - max: " << max << "(" << perc_max << "%)\n"; - } - } - }; -#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING - - private: - GCodeReader m_parser; - - EUnits m_units; - EPositioningType m_global_positioning_type; - EPositioningType m_e_local_positioning_type; - std::vector m_extruder_offsets; - GCodeFlavor m_flavor; - - AxisCoords m_start_position; // mm - AxisCoords m_end_position; // mm - AxisCoords m_origin; // mm - CachedPosition m_cached_position; - bool m_wiping; - - unsigned int m_line_id; - unsigned int m_last_line_id; - float m_feedrate; // mm/s - float m_width; // mm - float m_height; // mm - float m_forced_width; // mm - float m_forced_height; // mm - float m_mm3_per_mm; - float m_fan_speed; // percentage -#if ENABLE_Z_OFFSET_CORRECTION - float m_z_offset; // mm -#endif // ENABLE_Z_OFFSET_CORRECTION - ExtrusionRole m_extrusion_role; - unsigned char m_extruder_id; - ExtruderColors m_extruder_colors; - ExtruderTemps m_extruder_temps; - float m_parking_position; - float m_extra_loading_move; - float m_extruded_last_z; - float m_first_layer_height; // mm - unsigned int m_g1_line_id; - unsigned int m_layer_id; - CpColor m_cp_color; - bool m_use_volumetric_e; - SeamsDetector m_seams_detector; - OptionsZCorrector m_options_z_corrector; - size_t m_last_default_color_id; -#if ENABLE_SPIRAL_VASE_LAYERS - bool m_spiral_vase_active; -#endif // ENABLE_SPIRAL_VASE_LAYERS -#if ENABLE_GCODE_VIEWER_STATISTICS - std::chrono::time_point m_start_time; -#endif // ENABLE_GCODE_VIEWER_STATISTICS - - enum class EProducer - { - Unknown, - PrusaSlicer, - Slic3rPE, - Slic3r, - SuperSlicer, - Cura, - Simplify3D, - CraftWare, - ideaMaker, - KissSlicer - }; - - static const std::vector> Producers; - EProducer m_producer; - - TimeProcessor m_time_processor; - UsedFilaments m_used_filaments; - - GCodeProcessorResult m_result; - static unsigned int s_result_id; - -#if ENABLE_GCODE_VIEWER_DATA_CHECKING - DataChecker m_mm3_per_mm_compare{ "mm3_per_mm", 0.01f }; - DataChecker m_height_compare{ "height", 0.01f }; - DataChecker m_width_compare{ "width", 0.01f }; -#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING - - public: - GCodeProcessor(); - - void apply_config(const PrintConfig& config); - void enable_stealth_time_estimator(bool enabled); - bool is_stealth_time_estimator_enabled() const { - return m_time_processor.machines[static_cast(PrintEstimatedStatistics::ETimeMode::Stealth)].enabled; - } - void enable_machine_envelope_processing(bool enabled) { m_time_processor.machine_envelope_processing_enabled = enabled; } - void reset(); - - const GCodeProcessorResult& get_result() const { return m_result; } - GCodeProcessorResult&& extract_result() { return std::move(m_result); } - - // Load a G-code into a stand-alone G-code viewer. - // throws CanceledException through print->throw_if_canceled() (sent by the caller as callback). - void process_file(const std::string& filename, std::function cancel_callback = nullptr); - - // Streaming interface, for processing G-codes just generated by PrusaSlicer in a pipelined fashion. - void initialize(const std::string& filename); - void process_buffer(const std::string& buffer); - void finalize(bool post_process); - - float get_time(PrintEstimatedStatistics::ETimeMode mode) const; - std::string get_time_dhm(PrintEstimatedStatistics::ETimeMode mode) const; - std::vector>> get_custom_gcode_times(PrintEstimatedStatistics::ETimeMode mode, bool include_remaining) const; - - std::vector> get_moves_time(PrintEstimatedStatistics::ETimeMode mode) const; - std::vector> get_roles_time(PrintEstimatedStatistics::ETimeMode mode) const; - std::vector get_layers_time(PrintEstimatedStatistics::ETimeMode mode) const; - - private: - void apply_config(const DynamicPrintConfig& config); - void apply_config_simplify3d(const std::string& filename); - void apply_config_superslicer(const std::string& filename); - void process_gcode_line(const GCodeReader::GCodeLine& line, bool producers_enabled); - - // Process tags embedded into comments - void process_tags(const std::string_view comment, bool producers_enabled); - bool process_producers_tags(const std::string_view comment); - bool process_prusaslicer_tags(const std::string_view comment); - bool process_cura_tags(const std::string_view comment); - bool process_simplify3d_tags(const std::string_view comment); - bool process_craftware_tags(const std::string_view comment); - bool process_ideamaker_tags(const std::string_view comment); - bool process_kissslicer_tags(const std::string_view comment); - - bool detect_producer(const std::string_view comment); - - // Move - void process_G0(const GCodeReader::GCodeLine& line); - void process_G1(const GCodeReader::GCodeLine& line); - - // Retract - void process_G10(const GCodeReader::GCodeLine& line); - - // Unretract - void process_G11(const GCodeReader::GCodeLine& line); - - // Set Units to Inches - void process_G20(const GCodeReader::GCodeLine& line); - - // Set Units to Millimeters - void process_G21(const GCodeReader::GCodeLine& line); - - // Firmware controlled Retract - void process_G22(const GCodeReader::GCodeLine& line); - - // Firmware controlled Unretract - void process_G23(const GCodeReader::GCodeLine& line); - - // Move to origin - void process_G28(const GCodeReader::GCodeLine& line); - - // Set to Absolute Positioning - void process_G90(const GCodeReader::GCodeLine& line); - - // Set to Relative Positioning - void process_G91(const GCodeReader::GCodeLine& line); - - // Set Position - void process_G92(const GCodeReader::GCodeLine& line); - - // Sleep or Conditional stop - void process_M1(const GCodeReader::GCodeLine& line); - - // Set extruder to absolute mode - void process_M82(const GCodeReader::GCodeLine& line); - - // Set extruder to relative mode - void process_M83(const GCodeReader::GCodeLine& line); - - // Set extruder temperature - void process_M104(const GCodeReader::GCodeLine& line); - - // Set fan speed - void process_M106(const GCodeReader::GCodeLine& line); - - // Disable fan - void process_M107(const GCodeReader::GCodeLine& line); - - // Set tool (Sailfish) - void process_M108(const GCodeReader::GCodeLine& line); - - // Set extruder temperature and wait - void process_M109(const GCodeReader::GCodeLine& line); - - // Recall stored home offsets - void process_M132(const GCodeReader::GCodeLine& line); - - // Set tool (MakerWare) - void process_M135(const GCodeReader::GCodeLine& line); - - // Set max printing acceleration - void process_M201(const GCodeReader::GCodeLine& line); - - // Set maximum feedrate - void process_M203(const GCodeReader::GCodeLine& line); - - // Set default acceleration - void process_M204(const GCodeReader::GCodeLine& line); - - // Advanced settings - void process_M205(const GCodeReader::GCodeLine& line); - - // Set extrude factor override percentage - void process_M221(const GCodeReader::GCodeLine& line); - - // Repetier: Store x, y and z position - void process_M401(const GCodeReader::GCodeLine& line); - - // Repetier: Go to stored position - void process_M402(const GCodeReader::GCodeLine& line); - - // Set allowable instantaneous speed change - void process_M566(const GCodeReader::GCodeLine& line); - - // Unload the current filament into the MK3 MMU2 unit at the end of print. - void process_M702(const GCodeReader::GCodeLine& line); - - // Processes T line (Select Tool) - void process_T(const GCodeReader::GCodeLine& line); - void process_T(const std::string_view command); - - void store_move_vertex(EMoveType type); - - void set_extrusion_role(ExtrusionRole role); - - float minimum_feedrate(PrintEstimatedStatistics::ETimeMode mode, float feedrate) const; - float minimum_travel_feedrate(PrintEstimatedStatistics::ETimeMode mode, float feedrate) const; - float get_axis_max_feedrate(PrintEstimatedStatistics::ETimeMode mode, Axis axis) const; - float get_axis_max_acceleration(PrintEstimatedStatistics::ETimeMode mode, Axis axis) const; - float get_axis_max_jerk(PrintEstimatedStatistics::ETimeMode mode, Axis axis) const; - float get_retract_acceleration(PrintEstimatedStatistics::ETimeMode mode) const; - void set_retract_acceleration(PrintEstimatedStatistics::ETimeMode mode, float value); - float get_acceleration(PrintEstimatedStatistics::ETimeMode mode) const; - void set_acceleration(PrintEstimatedStatistics::ETimeMode mode, float value); - float get_travel_acceleration(PrintEstimatedStatistics::ETimeMode mode) const; - void set_travel_acceleration(PrintEstimatedStatistics::ETimeMode mode, float value); - float get_filament_load_time(size_t extruder_id); - float get_filament_unload_time(size_t extruder_id); - - void process_custom_gcode_time(CustomGCode::Type code); - void process_filaments(CustomGCode::Type code); - - // Simulates firmware st_synchronize() call - void simulate_st_synchronize(float additional_time = 0.0f); - - void update_estimated_times_stats(); - }; - -} /* namespace Slic3r */ - -#endif /* slic3r_GCodeProcessor_hpp_ */ - - +#ifndef slic3r_GCodeProcessor_hpp_ +#define slic3r_GCodeProcessor_hpp_ + +#include "libslic3r/GCodeReader.hpp" +#include "libslic3r/Point.hpp" +#include "libslic3r/ExtrusionRole.hpp" +#include "libslic3r/PrintConfig.hpp" +#include "libslic3r/CustomGCode.hpp" + +#include +#include +#include +#include +#include +#include + +namespace Slic3r { + + enum class EMoveType : unsigned char + { + Noop, + Retract, + Unretract, + Seam, + Tool_change, + Color_change, + Pause_Print, + Custom_GCode, + Travel, + Wipe, + Extrude, + Count + }; + + struct PrintEstimatedStatistics + { + enum class ETimeMode : unsigned char + { + Normal, + Stealth, + Count + }; + + struct Mode + { + float time; + float travel_time; + std::vector>> custom_gcode_times; + std::vector> moves_times; + std::vector> roles_times; + std::vector layers_times; + + void reset() { + time = 0.0f; + travel_time = 0.0f; + custom_gcode_times.clear(); + moves_times.clear(); + roles_times.clear(); + layers_times.clear(); + } + }; + + std::vector volumes_per_color_change; + std::map volumes_per_extruder; + std::map> used_filaments_per_role; + std::map cost_per_extruder; + + std::array(ETimeMode::Count)> modes; + + PrintEstimatedStatistics() { reset(); } + + void reset() { + for (auto m : modes) { + m.reset(); + } + volumes_per_color_change.clear(); + volumes_per_extruder.clear(); + used_filaments_per_role.clear(); + cost_per_extruder.clear(); + } + }; + + struct GCodeProcessorResult + { + struct SettingsIds + { + std::string print; + std::vector filament; + std::string printer; + + void reset() { + print.clear(); + filament.clear(); + printer.clear(); + } + }; + + struct MoveVertex + { + unsigned int gcode_id{ 0 }; + EMoveType type{ EMoveType::Noop }; + GCodeExtrusionRole extrusion_role{ GCodeExtrusionRole::None }; + unsigned char extruder_id{ 0 }; + unsigned char cp_color_id{ 0 }; + Vec3f position{ Vec3f::Zero() }; // mm + float delta_extruder{ 0.0f }; // mm + float feedrate{ 0.0f }; // mm/s + float width{ 0.0f }; // mm + float height{ 0.0f }; // mm + float mm3_per_mm{ 0.0f }; + float fan_speed{ 0.0f }; // percentage + float temperature{ 0.0f }; // Celsius degrees + float time{ 0.0f }; // s + bool internal_only{ false }; + + float volumetric_rate() const { return feedrate * mm3_per_mm; } + }; + + std::string filename; + unsigned int id; + std::vector moves; + // Positions of ends of lines of the final G-code this->filename after TimeProcessor::post_process() finalizes the G-code. + std::vector lines_ends; + Pointfs bed_shape; + float max_print_height; + SettingsIds settings_ids; + size_t extruders_count; +#if ENABLE_GCODE_POSTPROCESS_BACKTRACE + bool backtrace_enabled; +#endif // ENABLE_GCODE_POSTPROCESS_BACKTRACE + std::vector extruder_colors; + std::vector filament_diameters; + std::vector filament_densities; + std::vector filament_cost; + + PrintEstimatedStatistics print_statistics; + std::vector custom_gcode_per_print_z; + std::vector>> spiral_vase_layers; + +#if ENABLE_GCODE_VIEWER_STATISTICS + int64_t time{ 0 }; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + void reset(); + }; + + + class GCodeProcessor + { + static const std::vector Reserved_Tags; + + public: + enum class ETags : unsigned char + { + Role, + Wipe_Start, + Wipe_End, + Height, + Width, + Layer_Change, + Color_Change, + Pause_Print, + Custom_Code, + First_Line_M73_Placeholder, + Last_Line_M73_Placeholder, + Estimated_Printing_Time_Placeholder + }; + + static const std::string& reserved_tag(ETags tag) { return Reserved_Tags[static_cast(tag)]; } + // checks the given gcode for reserved tags and returns true when finding the 1st (which is returned into found_tag) + static bool contains_reserved_tag(const std::string& gcode, std::string& found_tag); + // checks the given gcode for reserved tags and returns true when finding any + // (the first max_count found tags are returned into found_tag) + static bool contains_reserved_tags(const std::string& gcode, unsigned int max_count, std::vector& found_tag); + + static const float Wipe_Width; + static const float Wipe_Height; + +#if ENABLE_GCODE_VIEWER_DATA_CHECKING + static const std::string Mm3_Per_Mm_Tag; +#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING + + private: + using AxisCoords = std::array; + using ExtruderColors = std::vector; + using ExtruderTemps = std::vector; + + enum class EUnits : unsigned char + { + Millimeters, + Inches + }; + + enum class EPositioningType : unsigned char + { + Absolute, + Relative + }; + + struct CachedPosition + { + AxisCoords position; // mm + float feedrate; // mm/s + + void reset(); + }; + + struct CpColor + { + unsigned char counter; + unsigned char current; + + void reset(); + }; + + public: + struct FeedrateProfile + { + float entry{ 0.0f }; // mm/s + float cruise{ 0.0f }; // mm/s + float exit{ 0.0f }; // mm/s + }; + + struct Trapezoid + { + float accelerate_until{ 0.0f }; // mm + float decelerate_after{ 0.0f }; // mm + float cruise_feedrate{ 0.0f }; // mm/sec + + float acceleration_time(float entry_feedrate, float acceleration) const; + float cruise_time() const; + float deceleration_time(float distance, float acceleration) const; + float cruise_distance() const; + }; + + struct TimeBlock + { + struct Flags + { + bool recalculate{ false }; + bool nominal_length{ false }; + }; + + EMoveType move_type{ EMoveType::Noop }; + GCodeExtrusionRole role{ GCodeExtrusionRole::None }; + unsigned int g1_line_id{ 0 }; + unsigned int layer_id{ 0 }; + float distance{ 0.0f }; // mm + float acceleration{ 0.0f }; // mm/s^2 + float max_entry_speed{ 0.0f }; // mm/s + float safe_feedrate{ 0.0f }; // mm/s + Flags flags; + FeedrateProfile feedrate_profile; + Trapezoid trapezoid; + + // Calculates this block's trapezoid + void calculate_trapezoid(); + + float time() const; + }; + + private: + struct TimeMachine + { + struct State + { + float feedrate; // mm/s + float safe_feedrate; // mm/s + AxisCoords axis_feedrate; // mm/s + AxisCoords abs_axis_feedrate; // mm/s + + void reset(); + }; + + struct CustomGCodeTime + { + bool needed; + float cache; + std::vector> times; + + void reset(); + }; + + struct G1LinesCacheItem + { + unsigned int id; + float elapsed_time; + }; + + bool enabled; + float acceleration; // mm/s^2 + // hard limit for the acceleration, to which the firmware will clamp. + float max_acceleration; // mm/s^2 + float retract_acceleration; // mm/s^2 + // hard limit for the acceleration, to which the firmware will clamp. + float max_retract_acceleration; // mm/s^2 + float travel_acceleration; // mm/s^2 + // hard limit for the travel acceleration, to which the firmware will clamp. + float max_travel_acceleration; // mm/s^2 + float extrude_factor_override_percentage; + float time; // s + float travel_time; // s + struct StopTime + { + unsigned int g1_line_id; + float elapsed_time; + }; + std::vector stop_times; + std::string line_m73_main_mask; + std::string line_m73_stop_mask; + State curr; + State prev; + CustomGCodeTime gcode_time; + std::vector blocks; + std::vector g1_times_cache; + std::array(EMoveType::Count)> moves_time; + std::array(GCodeExtrusionRole::Count)> roles_time; + std::vector layers_time; + + void reset(); + + // Simulates firmware st_synchronize() call + void simulate_st_synchronize(float additional_time = 0.0f); + void calculate_time(size_t keep_last_n_blocks = 0, float additional_time = 0.0f); + }; + + struct TimeProcessor + { + struct Planner + { + // Size of the firmware planner queue. The old 8-bit Marlins usually just managed 16 trapezoidal blocks. + // Let's be conservative and plan for newer boards with more memory. + static constexpr size_t queue_size = 64; + // The firmware recalculates last planner_queue_size trapezoidal blocks each time a new block is added. + // We are not simulating the firmware exactly, we calculate a sequence of blocks once a reasonable number of blocks accumulate. + static constexpr size_t refresh_threshold = queue_size * 4; + }; + + // extruder_id is currently used to correctly calculate filament load / unload times into the total print time. + // This is currently only really used by the MK3 MMU2: + // extruder_unloaded = true means no filament is loaded yet, all the filaments are parked in the MK3 MMU2 unit. + bool extruder_unloaded; + // whether or not to export post-process the gcode to export lines M73 in it + bool export_remaining_time_enabled; + // allow to skip the lines M201/M203/M204/M205 generated by GCode::print_machine_envelope() for non-Normal time estimate mode + bool machine_envelope_processing_enabled; + MachineEnvelopeConfig machine_limits; + // Additional load / unload times for a filament exchange sequence. + std::vector filament_load_times; + std::vector filament_unload_times; + std::array(PrintEstimatedStatistics::ETimeMode::Count)> machines; + + void reset(); + + friend class GCodeProcessor; + }; + + struct UsedFilaments // filaments per ColorChange + { + double color_change_cache; + std::vector volumes_per_color_change; + + double tool_change_cache; + std::map volumes_per_extruder; + + double role_cache; + std::map> filaments_per_role; // ExtrusionRole -> (m, g) + + void reset(); + + void increase_caches(double extruded_volume, unsigned char extruder_id, double parking_volume, double extra_loading_volume); + + void process_color_change_cache(); + void process_extruder_cache(unsigned char extruder_id); + void process_role_cache(const GCodeProcessor* processor); + void process_caches(const GCodeProcessor* processor); + private: + std::vector extruder_retracted_volume; + bool recent_toolchange = false; + }; + + public: + class SeamsDetector + { + bool m_active{ false }; + std::optional m_first_vertex; + + public: + void activate(bool active) { + if (m_active != active) { + m_active = active; + if (m_active) + m_first_vertex.reset(); + } + } + + std::optional get_first_vertex() const { return m_first_vertex; } + void set_first_vertex(const Vec3f& vertex) { m_first_vertex = vertex; } + + bool is_active() const { return m_active; } + bool has_first_vertex() const { return m_first_vertex.has_value(); } + }; + + // Helper class used to fix the z for color change, pause print and + // custom gcode markes + class OptionsZCorrector + { + GCodeProcessorResult& m_result; + std::optional m_move_id; + std::optional m_custom_gcode_per_print_z_id; + + public: + explicit OptionsZCorrector(GCodeProcessorResult& result) : m_result(result) { + } + + void set() { + m_move_id = m_result.moves.size() - 1; + m_custom_gcode_per_print_z_id = m_result.custom_gcode_per_print_z.size() - 1; + } + + void update(float height) { + if (!m_move_id.has_value() || !m_custom_gcode_per_print_z_id.has_value()) + return; + + const Vec3f position = m_result.moves.back().position; + + GCodeProcessorResult::MoveVertex& move = m_result.moves.emplace_back(m_result.moves[*m_move_id]); + move.position = position; + move.height = height; + m_result.moves.erase(m_result.moves.begin() + *m_move_id); + m_result.custom_gcode_per_print_z[*m_custom_gcode_per_print_z_id].print_z = position.z(); + reset(); + } + + void reset() { + m_move_id.reset(); + m_custom_gcode_per_print_z_id.reset(); + } + }; + +#if ENABLE_GCODE_VIEWER_DATA_CHECKING + struct DataChecker + { + struct Error + { + float value; + float tag_value; + GCodeExtrusionRole role; + }; + + std::string type; + float threshold{ 0.01f }; + float last_tag_value{ 0.0f }; + unsigned int count{ 0 }; + std::vector errors; + + DataChecker(const std::string& type, float threshold) + : type(type), threshold(threshold) + {} + + void update(float value, GCodeExtrusionRole role) { + if (role != GCodeExtrusionRole::Custom) { + ++count; + if (last_tag_value != 0.0f) { + if (std::abs(value - last_tag_value) / last_tag_value > threshold) + errors.push_back({ value, last_tag_value, role }); + } + } + } + + void reset() { last_tag_value = 0.0f; errors.clear(); count = 0; } + + std::pair get_min() const { + float delta_min = FLT_MAX; + float perc_min = 0.0f; + for (const Error& e : errors) { + if (delta_min > e.value - e.tag_value) { + delta_min = e.value - e.tag_value; + perc_min = 100.0f * delta_min / e.tag_value; + } + } + return { delta_min, perc_min }; + } + + std::pair get_max() const { + float delta_max = -FLT_MAX; + float perc_max = 0.0f; + for (const Error& e : errors) { + if (delta_max < e.value - e.tag_value) { + delta_max = e.value - e.tag_value; + perc_max = 100.0f * delta_max / e.tag_value; + } + } + return { delta_max, perc_max }; + } + + void output() const { + if (!errors.empty()) { + std::cout << type << ":\n"; + std::cout << "Errors: " << errors.size() << " (" << 100.0f * float(errors.size()) / float(count) << "%)\n"; + auto [min, perc_min] = get_min(); + auto [max, perc_max] = get_max(); + std::cout << "min: " << min << "(" << perc_min << "%) - max: " << max << "(" << perc_max << "%)\n"; + } + } + }; +#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING + + private: + GCodeReader m_parser; + + EUnits m_units; + EPositioningType m_global_positioning_type; + EPositioningType m_e_local_positioning_type; + std::vector m_extruder_offsets; + GCodeFlavor m_flavor; + + AxisCoords m_start_position; // mm + AxisCoords m_end_position; // mm + AxisCoords m_saved_position; // mm + AxisCoords m_origin; // mm + CachedPosition m_cached_position; + bool m_wiping; + + unsigned int m_line_id; + unsigned int m_last_line_id; + float m_feedrate; // mm/s + struct FeedMultiply + { + float current; // percentage + float saved; // percentage + + void reset() { + current = 1.0f; + saved = 1.0f; + } + }; + FeedMultiply m_feed_multiply; + float m_width; // mm + float m_height; // mm + float m_forced_width; // mm + float m_forced_height; // mm + float m_mm3_per_mm; + float m_fan_speed; // percentage + float m_z_offset; // mm + GCodeExtrusionRole m_extrusion_role; + unsigned char m_extruder_id; + ExtruderColors m_extruder_colors; + ExtruderTemps m_extruder_temps; + ExtruderTemps m_extruder_temps_config; + ExtruderTemps m_extruder_temps_first_layer_config; + bool m_is_XL_printer = false; + float m_parking_position; + float m_extra_loading_move; + float m_extruded_last_z; + float m_first_layer_height; // mm + unsigned int m_g1_line_id; + unsigned int m_layer_id; + CpColor m_cp_color; + bool m_use_volumetric_e; + SeamsDetector m_seams_detector; + OptionsZCorrector m_options_z_corrector; + size_t m_last_default_color_id; + bool m_spiral_vase_active; + float m_kissslicer_toolchange_time_correction; +#if ENABLE_GCODE_VIEWER_STATISTICS + std::chrono::time_point m_start_time; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + bool m_single_extruder_multi_material; + + enum class EProducer + { + Unknown, + PrusaSlicer, + Slic3rPE, + Slic3r, + SuperSlicer, + Cura, + Simplify3D, + CraftWare, + ideaMaker, + KissSlicer, + BambuStudio + }; + + static const std::vector> Producers; + EProducer m_producer; + + TimeProcessor m_time_processor; + UsedFilaments m_used_filaments; + + GCodeProcessorResult m_result; + static unsigned int s_result_id; + +#if ENABLE_GCODE_VIEWER_DATA_CHECKING + DataChecker m_mm3_per_mm_compare{ "mm3_per_mm", 0.01f }; + DataChecker m_height_compare{ "height", 0.01f }; + DataChecker m_width_compare{ "width", 0.01f }; +#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING + + public: + GCodeProcessor(); + + void apply_config(const PrintConfig& config); + void enable_stealth_time_estimator(bool enabled); + bool is_stealth_time_estimator_enabled() const { + return m_time_processor.machines[static_cast(PrintEstimatedStatistics::ETimeMode::Stealth)].enabled; + } + void enable_machine_envelope_processing(bool enabled) { m_time_processor.machine_envelope_processing_enabled = enabled; } + void reset(); + + const GCodeProcessorResult& get_result() const { return m_result; } + GCodeProcessorResult&& extract_result() { return std::move(m_result); } + + // Load a G-code into a stand-alone G-code viewer. + // throws CanceledException through print->throw_if_canceled() (sent by the caller as callback). + void process_file(const std::string& filename, std::function cancel_callback = nullptr); + + // Streaming interface, for processing G-codes just generated by PrusaSlicer in a pipelined fashion. + void initialize(const std::string& filename); + void process_buffer(const std::string& buffer); + void finalize(bool post_process); + + float get_time(PrintEstimatedStatistics::ETimeMode mode) const; + std::string get_time_dhm(PrintEstimatedStatistics::ETimeMode mode) const; + float get_travel_time(PrintEstimatedStatistics::ETimeMode mode) const; + std::string get_travel_time_dhm(PrintEstimatedStatistics::ETimeMode mode) const; + std::vector>> get_custom_gcode_times(PrintEstimatedStatistics::ETimeMode mode, bool include_remaining) const; + + std::vector> get_moves_time(PrintEstimatedStatistics::ETimeMode mode) const; + std::vector> get_roles_time(PrintEstimatedStatistics::ETimeMode mode) const; + std::vector get_layers_time(PrintEstimatedStatistics::ETimeMode mode) const; + + private: + void apply_config(const DynamicPrintConfig& config); + void apply_config_simplify3d(const std::string& filename); + void apply_config_superslicer(const std::string& filename); + void apply_config_kissslicer(const std::string& filename); + void process_gcode_line(const GCodeReader::GCodeLine& line, bool producers_enabled); + + // Process tags embedded into comments + void process_tags(const std::string_view comment, bool producers_enabled); + bool process_producers_tags(const std::string_view comment); + bool process_prusaslicer_tags(const std::string_view comment); + bool process_cura_tags(const std::string_view comment); + bool process_simplify3d_tags(const std::string_view comment); + bool process_craftware_tags(const std::string_view comment); + bool process_ideamaker_tags(const std::string_view comment); + bool process_kissslicer_tags(const std::string_view comment); + bool process_bambustudio_tags(const std::string_view comment); + + bool detect_producer(const std::string_view comment); + + // Move + void process_G0(const GCodeReader::GCodeLine& line); + void process_G1(const GCodeReader::GCodeLine& line); + + // Arc Move + void process_G2_G3(const GCodeReader::GCodeLine& line, bool clockwise); + + // Retract or Set tool temperature + void process_G10(const GCodeReader::GCodeLine& line); + + // Unretract + void process_G11(const GCodeReader::GCodeLine& line); + + // Set Units to Inches + void process_G20(const GCodeReader::GCodeLine& line); + + // Set Units to Millimeters + void process_G21(const GCodeReader::GCodeLine& line); + + // Firmware controlled Retract + void process_G22(const GCodeReader::GCodeLine& line); + + // Firmware controlled Unretract + void process_G23(const GCodeReader::GCodeLine& line); + + // Move to origin + void process_G28(const GCodeReader::GCodeLine& line); + + // Save Current Position + void process_G60(const GCodeReader::GCodeLine& line); + + // Return to Saved Position + void process_G61(const GCodeReader::GCodeLine& line); + + // Set to Absolute Positioning + void process_G90(const GCodeReader::GCodeLine& line); + + // Set to Relative Positioning + void process_G91(const GCodeReader::GCodeLine& line); + + // Set Position + void process_G92(const GCodeReader::GCodeLine& line); + + // Sleep or Conditional stop + void process_M1(const GCodeReader::GCodeLine& line); + + // Set extruder to absolute mode + void process_M82(const GCodeReader::GCodeLine& line); + + // Set extruder to relative mode + void process_M83(const GCodeReader::GCodeLine& line); + + // Set extruder temperature + void process_M104(const GCodeReader::GCodeLine& line); + + // Set fan speed + void process_M106(const GCodeReader::GCodeLine& line); + + // Disable fan + void process_M107(const GCodeReader::GCodeLine& line); + + // Set tool (Sailfish) + void process_M108(const GCodeReader::GCodeLine& line); + + // Set extruder temperature and wait + void process_M109(const GCodeReader::GCodeLine& line); + + // Recall stored home offsets + void process_M132(const GCodeReader::GCodeLine& line); + + // Set tool (MakerWare) + void process_M135(const GCodeReader::GCodeLine& line); + + // Set max printing acceleration + void process_M201(const GCodeReader::GCodeLine& line); + + // Set maximum feedrate + void process_M203(const GCodeReader::GCodeLine& line); + + // Set default acceleration + void process_M204(const GCodeReader::GCodeLine& line); + + // Advanced settings + void process_M205(const GCodeReader::GCodeLine& line); + + // Set Feedrate Percentage + void process_M220(const GCodeReader::GCodeLine& line); + + // Set extrude factor override percentage + void process_M221(const GCodeReader::GCodeLine& line); + + // Repetier: Store x, y and z position + void process_M401(const GCodeReader::GCodeLine& line); + + // Repetier: Go to stored position + void process_M402(const GCodeReader::GCodeLine& line); + + // Set allowable instantaneous speed change + void process_M566(const GCodeReader::GCodeLine& line); + + // Unload the current filament into the MK3 MMU2 unit at the end of print. + void process_M702(const GCodeReader::GCodeLine& line); + + // Processes T line (Select Tool) + void process_T(const GCodeReader::GCodeLine& line); + void process_T(const std::string_view command); + + // post process the file with the given filename to: + // 1) add remaining time lines M73 and update moves' gcode ids accordingly + // 2) update used filament data + void post_process(); + + void store_move_vertex(EMoveType type, bool internal_only = false); + + void set_extrusion_role(GCodeExtrusionRole role); + + float minimum_feedrate(PrintEstimatedStatistics::ETimeMode mode, float feedrate) const; + float minimum_travel_feedrate(PrintEstimatedStatistics::ETimeMode mode, float feedrate) const; + float get_axis_max_feedrate(PrintEstimatedStatistics::ETimeMode mode, Axis axis) const; + float get_axis_max_acceleration(PrintEstimatedStatistics::ETimeMode mode, Axis axis) const; + float get_axis_max_jerk(PrintEstimatedStatistics::ETimeMode mode, Axis axis) const; + float get_retract_acceleration(PrintEstimatedStatistics::ETimeMode mode) const; + void set_retract_acceleration(PrintEstimatedStatistics::ETimeMode mode, float value); + float get_acceleration(PrintEstimatedStatistics::ETimeMode mode) const; + void set_acceleration(PrintEstimatedStatistics::ETimeMode mode, float value); + float get_travel_acceleration(PrintEstimatedStatistics::ETimeMode mode) const; + void set_travel_acceleration(PrintEstimatedStatistics::ETimeMode mode, float value); + float get_filament_load_time(size_t extruder_id); + float get_filament_unload_time(size_t extruder_id); + + void process_custom_gcode_time(CustomGCode::Type code); + void process_filaments(CustomGCode::Type code); + + // Simulates firmware st_synchronize() call + void simulate_st_synchronize(float additional_time = 0.0f); + + void update_estimated_times_stats(); + + double extract_absolute_position_on_axis(Axis axis, const GCodeReader::GCodeLine& line, double area_filament_cross_section); + }; + +} /* namespace Slic3r */ + +#endif /* slic3r_GCodeProcessor_hpp_ */ + + diff --git a/src/libslic3r/GCode/PostProcessor.cpp b/src/libslic3r/GCode/PostProcessor.cpp index de1807dbb82..c434aa56035 100644 --- a/src/libslic3r/GCode/PostProcessor.cpp +++ b/src/libslic3r/GCode/PostProcessor.cpp @@ -185,11 +185,6 @@ static int run_script(const std::string &script, const std::string &gcode, std:: namespace Slic3r { -//! macro used to mark string used at localization, -//! return same string -#define L(s) (s) -#define _(s) Slic3r::I18N::translate(s) - // Run post processing script / scripts if defined. // Returns true if a post-processing script was executed. // Returns false if no post-processing script was defined. @@ -285,10 +280,10 @@ bool run_post_process_scripts(std::string &src_path, bool make_copy, const std:: throw Slic3r::RuntimeError(msg); } if (! boost::filesystem::exists(gcode_file)) { - const std::string msg = (boost::format(_(L( + const std::string msg = (boost::format(_u8L( "Post-processing script %1% failed.\n\n" "The post-processing script is expected to change the G-code file %2% in place, but the G-code file was deleted and likely saved under a new name.\n" - "Please adjust the post-processing script to change the G-code in place and consult the manual on how to optionally rename the post-processed G-code file.\n"))) + "Please adjust the post-processing script to change the G-code in place and consult the manual on how to optionally rename the post-processed G-code file.\n")) % script % path).str(); BOOST_LOG_TRIVIAL(error) << msg; throw Slic3r::RuntimeError(msg); diff --git a/src/libslic3r/GCode/PressureEqualizer.cpp b/src/libslic3r/GCode/PressureEqualizer.cpp index 7135c0a5c03..138200e593b 100644 --- a/src/libslic3r/GCode/PressureEqualizer.cpp +++ b/src/libslic3r/GCode/PressureEqualizer.cpp @@ -37,7 +37,7 @@ PressureEqualizer::PressureEqualizer(const Slic3r::GCodeConfig &config) : m_use_ m_current_extruder = 0; // Zero the position of the XYZE axes + the current feed memset(m_current_pos, 0, sizeof(float) * 5); - m_current_extrusion_role = erNone; + m_current_extrusion_role = GCodeExtrusionRole::None; // Expect the first command to fill the nozzle (deretract). m_retracted = true; @@ -60,9 +60,9 @@ PressureEqualizer::PressureEqualizer(const Slic3r::GCodeConfig &config) : m_use_ } // Don't regulate the pressure before and after gap-fill and ironing. - for (const ExtrusionRole er : {erGapFill, erIroning}) { - m_max_volumetric_extrusion_rate_slopes[er].negative = 0; - m_max_volumetric_extrusion_rate_slopes[er].positive = 0; + for (const GCodeExtrusionRole er : {GCodeExtrusionRole::GapFill, GCodeExtrusionRole::Ironing}) { + m_max_volumetric_extrusion_rate_slopes[size_t(er)].negative = 0; + m_max_volumetric_extrusion_rate_slopes[size_t(er)].positive = 0; } opened_extrude_set_speed_block = false; @@ -185,7 +185,7 @@ bool PressureEqualizer::process_line(const char *line, const char *line_end, GCo if (strncmp(line, EXTRUSION_ROLE_TAG.data(), EXTRUSION_ROLE_TAG.length()) == 0) { line += EXTRUSION_ROLE_TAG.length(); int role = atoi(line); - m_current_extrusion_role = ExtrusionRole(role); + m_current_extrusion_role = GCodeExtrusionRole(role); #ifdef PRESSURE_EQUALIZER_DEBUG ++line_idx; #endif @@ -367,7 +367,16 @@ bool PressureEqualizer::process_line(const char *line, const char *line_end, GCo case 'T': { // Activate an extruder head. - int new_extruder = parse_int(line); + int new_extruder = -1; + try { + new_extruder = parse_int(line); + } catch (Slic3r::InvalidArgument &) { + // Ignore invalid GCodes starting with T. + eatws(line); + break; + } + assert(new_extruder != -1); + if (new_extruder != int(m_current_extruder)) { m_current_extruder = new_extruder; m_retracted = true; @@ -510,9 +519,9 @@ void PressureEqualizer::adjust_volumetric_rate() // Nothing to do, the last move is not extruding. return; - std::array feedrate_per_extrusion_role{}; + std::array feedrate_per_extrusion_role{}; feedrate_per_extrusion_role.fill(std::numeric_limits::max()); - feedrate_per_extrusion_role[m_gcode_lines[line_idx].extrusion_role] = m_gcode_lines[line_idx].volumetric_extrusion_rate_start; + feedrate_per_extrusion_role[int(m_gcode_lines[line_idx].extrusion_role)] = m_gcode_lines[line_idx].volumetric_extrusion_rate_start; while (line_idx != fist_line_idx) { size_t idx_prev = line_idx - 1; @@ -520,7 +529,7 @@ void PressureEqualizer::adjust_volumetric_rate() if (!m_gcode_lines[idx_prev].extruding()) break; // Don't decelerate before ironing and gap-fill. - if (m_gcode_lines[line_idx].extrusion_role == erIroning || m_gcode_lines[line_idx].extrusion_role == erGapFill) { + if (m_gcode_lines[line_idx].extrusion_role == GCodeExtrusionRole::Ironing || m_gcode_lines[line_idx].extrusion_role == GCodeExtrusionRole::GapFill) { line_idx = idx_prev; continue; } @@ -530,23 +539,23 @@ void PressureEqualizer::adjust_volumetric_rate() line_idx = idx_prev; GCodeLine &line = m_gcode_lines[line_idx]; - for (size_t iRole = 1; iRole < erCount; ++ iRole) { + for (size_t iRole = 1; iRole < size_t(GCodeExtrusionRole::Count); ++ iRole) { const float &rate_slope = m_max_volumetric_extrusion_rate_slopes[iRole].negative; if (rate_slope == 0 || feedrate_per_extrusion_role[iRole] == std::numeric_limits::max()) - continue; // The negative rate is unlimited or the rate for ExtrusionRole iRole is unlimited. + continue; // The negative rate is unlimited or the rate for GCodeExtrusionRole iRole is unlimited. float rate_end = feedrate_per_extrusion_role[iRole]; - if (iRole == line.extrusion_role && rate_succ < rate_end) + if (iRole == size_t(line.extrusion_role) && rate_succ < rate_end) // Limit by the succeeding volumetric flow rate. rate_end = rate_succ; - if (!line.adjustable_flow || line.extrusion_role == erExternalPerimeter || line.extrusion_role == erGapFill || line.extrusion_role == erBridgeInfill || line.extrusion_role == erIroning) { + if (!line.adjustable_flow || line.extrusion_role == GCodeExtrusionRole::ExternalPerimeter || line.extrusion_role == GCodeExtrusionRole::GapFill || line.extrusion_role == GCodeExtrusionRole::BridgeInfill || line.extrusion_role == GCodeExtrusionRole::Ironing) { rate_end = line.volumetric_extrusion_rate_end; } else if (line.volumetric_extrusion_rate_end > rate_end) { line.volumetric_extrusion_rate_end = rate_end; line.max_volumetric_extrusion_rate_slope_negative = rate_slope; line.modified = true; - } else if (iRole == line.extrusion_role) { + } else if (iRole == size_t(line.extrusion_role)) { rate_end = line.volumetric_extrusion_rate_end; } else { // Use the original, 'floating' extrusion rate as a starting point for the limiter. @@ -564,13 +573,13 @@ void PressureEqualizer::adjust_volumetric_rate() } // feedrate_per_extrusion_role[iRole] = (iRole == line.extrusion_role) ? line.volumetric_extrusion_rate_start : rate_start; // Don't store feed rate for ironing and gap-fill. - if (line.extrusion_role != erIroning && line.extrusion_role != erGapFill) + if (line.extrusion_role != GCodeExtrusionRole::Ironing && line.extrusion_role != GCodeExtrusionRole::GapFill) feedrate_per_extrusion_role[iRole] = line.volumetric_extrusion_rate_start; } } feedrate_per_extrusion_role.fill(std::numeric_limits::max()); - feedrate_per_extrusion_role[m_gcode_lines[line_idx].extrusion_role] = m_gcode_lines[line_idx].volumetric_extrusion_rate_end; + feedrate_per_extrusion_role[size_t(m_gcode_lines[line_idx].extrusion_role)] = m_gcode_lines[line_idx].volumetric_extrusion_rate_end; assert(m_gcode_lines[line_idx].extruding()); while (line_idx != last_line_idx) { @@ -579,7 +588,7 @@ void PressureEqualizer::adjust_volumetric_rate() if (!m_gcode_lines[idx_next].extruding()) break; // Don't accelerate after ironing and gap-fill. - if (m_gcode_lines[line_idx].extrusion_role == erIroning || m_gcode_lines[line_idx].extrusion_role == erGapFill) { + if (m_gcode_lines[line_idx].extrusion_role == GCodeExtrusionRole::Ironing || m_gcode_lines[line_idx].extrusion_role == GCodeExtrusionRole::GapFill) { line_idx = idx_next; continue; } @@ -588,21 +597,21 @@ void PressureEqualizer::adjust_volumetric_rate() line_idx = idx_next; GCodeLine &line = m_gcode_lines[line_idx]; - for (size_t iRole = 1; iRole < erCount; ++ iRole) { + for (size_t iRole = 1; iRole < size_t(GCodeExtrusionRole::Count); ++ iRole) { const float &rate_slope = m_max_volumetric_extrusion_rate_slopes[iRole].positive; if (rate_slope == 0 || feedrate_per_extrusion_role[iRole] == std::numeric_limits::max()) - continue; // The positive rate is unlimited or the rate for ExtrusionRole iRole is unlimited. + continue; // The positive rate is unlimited or the rate for GCodeExtrusionRole iRole is unlimited. float rate_start = feedrate_per_extrusion_role[iRole]; - if (!line.adjustable_flow || line.extrusion_role == erExternalPerimeter || line.extrusion_role == erGapFill || line.extrusion_role == erBridgeInfill || line.extrusion_role == erIroning) { + if (!line.adjustable_flow || line.extrusion_role == GCodeExtrusionRole::ExternalPerimeter || line.extrusion_role == GCodeExtrusionRole::GapFill || line.extrusion_role == GCodeExtrusionRole::BridgeInfill || line.extrusion_role == GCodeExtrusionRole::Ironing) { rate_start = line.volumetric_extrusion_rate_start; - } else if (iRole == line.extrusion_role && rate_prec < rate_start) + } else if (iRole == size_t(line.extrusion_role) && rate_prec < rate_start) rate_start = rate_prec; if (line.volumetric_extrusion_rate_start > rate_start) { line.volumetric_extrusion_rate_start = rate_start; line.max_volumetric_extrusion_rate_slope_positive = rate_slope; line.modified = true; - } else if (iRole == line.extrusion_role) { + } else if (iRole == size_t(line.extrusion_role)) { rate_start = line.volumetric_extrusion_rate_start; } else { // Use the original, 'floating' extrusion rate as a starting point for the limiter. @@ -620,7 +629,7 @@ void PressureEqualizer::adjust_volumetric_rate() } // feedrate_per_extrusion_role[iRole] = (iRole == line.extrusion_role) ? line.volumetric_extrusion_rate_end : rate_end; // Don't store feed rate for ironing and gap-fill. - if (line.extrusion_role != erIroning && line.extrusion_role != erGapFill) + if (line.extrusion_role != GCodeExtrusionRole::Ironing && line.extrusion_role != GCodeExtrusionRole::GapFill) feedrate_per_extrusion_role[iRole] = line.volumetric_extrusion_rate_end; } } @@ -690,7 +699,7 @@ inline bool is_just_line_with_extrude_set_speed_tag(const std::string &line) void PressureEqualizer::push_line_to_output(const size_t line_idx, const float new_feedrate, const char *comment) { - const GCodeLine &line = this->m_gcode_lines[line_idx]; + const GCodeLine &line = m_gcode_lines[line_idx]; if (line_idx > 0 && output_buffer_length > 0) { const std::string prev_line_str = std::string(output_buffer.begin() + int(this->output_buffer_prev_length), output_buffer.begin() + int(this->output_buffer_length) + 1); @@ -704,7 +713,7 @@ void PressureEqualizer::push_line_to_output(const size_t line_idx, const float n GCodeG1Formatter feedrate_formatter; feedrate_formatter.emit_f(new_feedrate); feedrate_formatter.emit_string(std::string(EXTRUDE_SET_SPEED_TAG.data(), EXTRUDE_SET_SPEED_TAG.length())); - if (line.extrusion_role == erExternalPerimeter) + if (line.extrusion_role == GCodeExtrusionRole::ExternalPerimeter) feedrate_formatter.emit_string(std::string(EXTERNAL_PERIMETER_TAG.data(), EXTERNAL_PERIMETER_TAG.length())); push_to_output(feedrate_formatter); diff --git a/src/libslic3r/GCode/PressureEqualizer.hpp b/src/libslic3r/GCode/PressureEqualizer.hpp index d6b7f2a4f11..a2220890471 100644 --- a/src/libslic3r/GCode/PressureEqualizer.hpp +++ b/src/libslic3r/GCode/PressureEqualizer.hpp @@ -3,7 +3,7 @@ #include "../libslic3r.h" #include "../PrintConfig.hpp" -#include "../ExtrusionEntity.hpp" +#include "../ExtrusionRole.hpp" #include @@ -65,7 +65,7 @@ class PressureEqualizer float positive; float negative; }; - ExtrusionRateSlope m_max_volumetric_extrusion_rate_slopes[erCount]; + ExtrusionRateSlope m_max_volumetric_extrusion_rate_slopes[size_t(GCodeExtrusionRole::Count)]; float m_max_volumetric_extrusion_rate_slope_positive; float m_max_volumetric_extrusion_rate_slope_negative; @@ -77,7 +77,7 @@ class PressureEqualizer // X,Y,Z,E,F float m_current_pos[5]; size_t m_current_extruder; - ExtrusionRole m_current_extrusion_role; + GCodeExtrusionRole m_current_extrusion_role; bool m_retracted; bool m_use_relative_e_distances; @@ -149,7 +149,7 @@ class PressureEqualizer // Index of the active extruder. size_t extruder_id; // Extrusion role of this segment. - ExtrusionRole extrusion_role; + GCodeExtrusionRole extrusion_role; // Current volumetric extrusion rate. float volumetric_extrusion_rate; diff --git a/src/libslic3r/GCode/PrintExtents.cpp b/src/libslic3r/GCode/PrintExtents.cpp index a86411519f0..9a01dc8a6c6 100644 --- a/src/libslic3r/GCode/PrintExtents.cpp +++ b/src/libslic3r/GCode/PrintExtents.cpp @@ -113,8 +113,8 @@ BoundingBoxf get_print_object_extrusions_extents(const PrintObject &print_object break; BoundingBoxf bbox_this; for (const LayerRegion *layerm : layer->regions()) { - bbox_this.merge(extrusionentity_extents(layerm->perimeters)); - for (const ExtrusionEntity *ee : layerm->fills.entities) + bbox_this.merge(extrusionentity_extents(layerm->perimeters())); + for (const ExtrusionEntity *ee : layerm->fills()) // fill represents infill extrusions of a single island. bbox_this.merge(extrusionentity_extents(*dynamic_cast(ee))); } diff --git a/src/libslic3r/GCode/RetractWhenCrossingPerimeters.cpp b/src/libslic3r/GCode/RetractWhenCrossingPerimeters.cpp new file mode 100644 index 00000000000..b834ca51803 --- /dev/null +++ b/src/libslic3r/GCode/RetractWhenCrossingPerimeters.cpp @@ -0,0 +1,54 @@ +#include "../ClipperUtils.hpp" +#include "../Layer.hpp" +#include "../Polyline.hpp" + +#include "RetractWhenCrossingPerimeters.hpp" + +namespace Slic3r { + +bool RetractWhenCrossingPerimeters::travel_inside_internal_regions(const Layer &layer, const Polyline &travel) +{ + if (m_layer != &layer) { + // Update cache. + m_layer = &layer; + m_internal_islands.clear(); + m_aabbtree_internal_islands.clear(); + // Collect expolygons of internal slices. + for (const LayerRegion *layerm : layer.regions()) + for (const Surface &surface : layerm->slices().surfaces) + if (surface.is_internal()) + m_internal_islands.emplace_back(&surface.expolygon); + // Calculate bounding boxes of internal slices. + std::vector bboxes; + bboxes.reserve(m_internal_islands.size()); + for (size_t i = 0; i < m_internal_islands.size(); ++ i) + bboxes.emplace_back(i, get_extents(*m_internal_islands[i])); + // Build AABB tree over bounding boxes of internal slices. + m_aabbtree_internal_islands.build_modify_input(bboxes); + } + + BoundingBox bbox_travel = get_extents(travel); + AABBTree::BoundingBox bbox_travel_eigen{ bbox_travel.min, bbox_travel.max }; + int result = -1; + bbox_travel.offset(SCALED_EPSILON); + AABBTreeIndirect::traverse(m_aabbtree_internal_islands, + [&bbox_travel_eigen](const AABBTree::Node &node) { + return bbox_travel_eigen.intersects(node.bbox); + }, + [&travel, &bbox_travel, &result, &islands = m_internal_islands](const AABBTree::Node &node) { + assert(node.is_leaf()); + assert(node.is_valid()); + Polygons clipped = ClipperUtils::clip_clipper_polygons_with_subject_bbox(*islands[node.idx], bbox_travel); + if (diff_pl(travel, clipped).empty()) { + // Travel path is completely inside an "internal" island. Don't retract. + result = int(node.idx); + // Stop traversal. + return false; + } + // Continue traversal. + return true; + }); + return result != -1; +} + +} // namespace Slic3r diff --git a/src/libslic3r/GCode/RetractWhenCrossingPerimeters.hpp b/src/libslic3r/GCode/RetractWhenCrossingPerimeters.hpp new file mode 100644 index 00000000000..fb624d7f901 --- /dev/null +++ b/src/libslic3r/GCode/RetractWhenCrossingPerimeters.hpp @@ -0,0 +1,32 @@ +#ifndef slic3r_RetractWhenCrossingPerimeters_hpp_ +#define slic3r_RetractWhenCrossingPerimeters_hpp_ + +#include + +#include "../AABBTreeIndirect.hpp" + +namespace Slic3r { + +// Forward declarations. +class ExPolygon; +class Layer; +class Polyline; + +class RetractWhenCrossingPerimeters +{ +public: + bool travel_inside_internal_regions(const Layer &layer, const Polyline &travel); + +private: + // Last object layer visited, for which a cache of internal islands was created. + const Layer *m_layer; + // Internal islands only, referencing data owned by m_layer->regions()->surfaces(). + std::vector m_internal_islands; + // Search structure over internal islands. + using AABBTree = AABBTreeIndirect::Tree<2, coord_t>; + AABBTree m_aabbtree_internal_islands; +}; + +} // namespace Slic3r + +#endif // slic3r_RetractWhenCrossingPerimeters_hpp_ diff --git a/src/libslic3r/GCode/SeamPlacer.cpp b/src/libslic3r/GCode/SeamPlacer.cpp index 1028feea8cb..244a103ca8f 100644 --- a/src/libslic3r/GCode/SeamPlacer.cpp +++ b/src/libslic3r/GCode/SeamPlacer.cpp @@ -1,5 +1,8 @@ #include "SeamPlacer.hpp" +#include "Color.hpp" +#include "Polygon.hpp" +#include "PrintConfig.hpp" #include "tbb/parallel_for.h" #include "tbb/blocked_range.h" #include "tbb/parallel_reduce.h" @@ -33,24 +36,6 @@ namespace Slic3r { namespace SeamPlacerImpl { -// ************ FOR BACKPORT COMPATIBILITY ONLY *************** -// Color mapping of a value into RGB false colors. -inline Vec3f value_to_rgbf(float minimum, float maximum, float value) - { - float ratio = 2.0f * (value - minimum) / (maximum - minimum); - float b = std::max(0.0f, (1.0f - ratio)); - float r = std::max(0.0f, (ratio - 1.0f)); - float g = 1.0f - b - r; - return Vec3f { r, g, b }; -} - -// Color mapping of a value into RGB false colors. -inline Vec3i value_to_rgbi(float minimum, float maximum, float value) - { - return (value_to_rgbf(minimum, maximum, value) * 255).cast(); -} -// *************************** - template int sgn(T val) { return int(T(0) < val) - int(val < T(0)); } @@ -413,25 +398,22 @@ struct GlobalModelInfo { ; //Extract perimeter polygons of the given layer -Polygons extract_perimeter_polygons(const Layer *layer, const SeamPosition configured_seam_preference, - std::vector &corresponding_regions_out) { +Polygons extract_perimeter_polygons(const Layer *layer, std::vector &corresponding_regions_out) { Polygons polygons; for (const LayerRegion *layer_region : layer->regions()) { - for (const ExtrusionEntity *ex_entity : layer_region->perimeters.entities) { + for (const ExtrusionEntity *ex_entity : layer_region->perimeters()) { if (ex_entity->is_collection()) { //collection of inner, outer, and overhang perimeters for (const ExtrusionEntity *perimeter : static_cast(ex_entity)->entities) { ExtrusionRole role = perimeter->role(); if (perimeter->is_loop()) { for (const ExtrusionPath &path : static_cast(perimeter)->paths) { - if (path.role() == ExtrusionRole::erExternalPerimeter) { - role = ExtrusionRole::erExternalPerimeter; + if (path.role() == ExtrusionRole::ExternalPerimeter) { + role = ExtrusionRole::ExternalPerimeter; } } } - if (role == ExtrusionRole::erExternalPerimeter - || (is_perimeter(role) - && configured_seam_preference == spRandom)) { //for random seam alignment, extract all perimeters + if (role == ExtrusionRole::ExternalPerimeter) { Points p; perimeter->collect_points(p); polygons.emplace_back(std::move(p)); @@ -1014,62 +996,18 @@ void pick_random_seam_point(const std::vector &perimeter_points, perimeter.finalized = true; } -class PerimeterDistancer { - std::vector lines; - AABBTreeIndirect::Tree<2, double> tree; - -public: - PerimeterDistancer(const Layer *layer) { - ExPolygons layer_outline = layer->lslices; - for (const ExPolygon &island : layer_outline) { - assert(island.contour.is_counter_clockwise()); - for (const auto &line : island.contour.lines()) { - lines.emplace_back(unscale(line.a), unscale(line.b)); - } - for (const Polygon &hole : island.holes) { - assert(hole.is_clockwise()); - for (const auto &line : hole.lines()) { - lines.emplace_back(unscale(line.a), unscale(line.b)); - } - } - } - tree = AABBTreeLines::build_aabb_tree_over_indexed_lines(lines); - } - - float distance_from_perimeter(const Vec2f &point) const { - Vec2d p = point.cast(); - size_t hit_idx_out { }; - Vec2d hit_point_out = Vec2d::Zero(); - auto distance = AABBTreeLines::squared_distance_to_indexed_lines(lines, tree, p, hit_idx_out, hit_point_out); - if (distance < 0) { - return std::numeric_limits::max(); - } - - distance = sqrt(distance); - const Linef &line = lines[hit_idx_out]; - Vec2d v1 = line.b - line.a; - Vec2d v2 = p - line.a; - if ((v1.x() * v2.y()) - (v1.y() * v2.x()) > 0.0) { - distance *= -1; - } - return distance; - } -} -; - } // namespace SeamPlacerImpl // Parallel process and extract each perimeter polygon of the given print object. // Gather SeamCandidates of each layer into vector and build KDtree over them // Store results in the SeamPlacer variables m_seam_per_object -void SeamPlacer::gather_seam_candidates(const PrintObject *po, - const SeamPlacerImpl::GlobalModelInfo &global_model_info, const SeamPosition configured_seam_preference) { +void SeamPlacer::gather_seam_candidates(const PrintObject *po, const SeamPlacerImpl::GlobalModelInfo &global_model_info) { using namespace SeamPlacerImpl; PrintObjectSeamData &seam_data = m_seam_per_object.emplace(po, PrintObjectSeamData { }).first->second; seam_data.layers.resize(po->layer_count()); tbb::parallel_for(tbb::blocked_range(0, po->layers().size()), - [po, configured_seam_preference, &global_model_info, &seam_data] + [po, &global_model_info, &seam_data] (tbb::blocked_range r) { for (size_t layer_idx = r.begin(); layer_idx < r.end(); ++layer_idx) { PrintObjectSeamData::LayerSeams &layer_seams = seam_data.layers[layer_idx]; @@ -1077,7 +1015,7 @@ void SeamPlacer::gather_seam_candidates(const PrintObject *po, auto unscaled_z = layer->slice_z; std::vector regions; //NOTE corresponding region ptr may be null, if the layer has zero perimeters - Polygons polygons = extract_perimeter_polygons(layer, configured_seam_preference, regions); + Polygons polygons = extract_perimeter_polygons(layer, regions); for (size_t poly_index = 0; poly_index < polygons.size(); ++poly_index) { process_perimeter_polygon(polygons[poly_index], unscaled_z, regions[poly_index], global_model_info, layer_seams); @@ -1109,29 +1047,31 @@ void SeamPlacer::calculate_candidates_visibility(const PrintObject *po, void SeamPlacer::calculate_overhangs_and_layer_embedding(const PrintObject *po) { using namespace SeamPlacerImpl; + using PerimeterDistancer = AABBTreeLines::LinesDistancer; std::vector &layers = m_seam_per_object[po].layers; tbb::parallel_for(tbb::blocked_range(0, layers.size()), [po, &layers](tbb::blocked_range r) { std::unique_ptr prev_layer_distancer; if (r.begin() > 0) { // previous layer exists - prev_layer_distancer = std::make_unique(po->layers()[r.begin() - 1]); + prev_layer_distancer = std::make_unique(to_unscaled_linesf(po->layers()[r.begin() - 1]->lslices)); } for (size_t layer_idx = r.begin(); layer_idx < r.end(); ++layer_idx) { size_t regions_with_perimeter = 0; for (const LayerRegion *region : po->layers()[layer_idx]->regions()) { - if (region->perimeters.entities.size() > 0) { + if (region->perimeters().size() > 0) { regions_with_perimeter++; } }; bool should_compute_layer_embedding = regions_with_perimeter > 1; - std::unique_ptr current_layer_distancer = std::make_unique(po->layers()[layer_idx]); + std::unique_ptr current_layer_distancer = std::make_unique( + to_unscaled_linesf(po->layers()[layer_idx]->lslices)); for (SeamCandidate &perimeter_point : layers[layer_idx].points) { Vec2f point = Vec2f { perimeter_point.position.head<2>() }; if (prev_layer_distancer.get() != nullptr) { - perimeter_point.overhang = prev_layer_distancer->distance_from_perimeter(point) + perimeter_point.overhang = prev_layer_distancer->distance_from_lines(point.cast()) + 0.6f * perimeter_point.perimeter.flow_width - tan(SeamPlacer::overhang_angle_threshold) * po->layers()[layer_idx]->height; @@ -1140,7 +1080,7 @@ void SeamPlacer::calculate_overhangs_and_layer_embedding(const PrintObject *po) } if (should_compute_layer_embedding) { // search for embedded perimeter points (points hidden inside the print ,e.g. multimaterial join, best position for seam) - perimeter_point.embedded_distance = current_layer_distancer->distance_from_perimeter(point) + perimeter_point.embedded_distance = current_layer_distancer->distance_from_lines(point.cast()) + 0.6f * perimeter_point.perimeter.flow_width; } } @@ -1399,15 +1339,19 @@ void SeamPlacer::align_seam_points(const PrintObject *po, const SeamPlacerImpl:: observations[index] = current.position.head<2>(); observation_points[index] = current.position.z(); weights[index] = angle_weight(current.local_ccw_angle); - float sign = layer_angle > 2.0 * std::abs(current.local_ccw_angle) ? -0.8f : 1.0f; + float curling_influence = layer_angle > 2.0 * std::abs(current.local_ccw_angle) ? -0.8f : 1.0f; if (current.type == EnforcedBlockedSeamPoint::Enforced) { - sign = 1.0f; + curling_influence = 1.0f; weights[index] += 3.0f; } - total_length += sign * (last_point_pos - current.position).norm(); + total_length += curling_influence * (last_point_pos - current.position).norm(); last_point_pos = current.position; } + if (comparator.setup == spRear) { + total_length *= 0.3f; + } + // Curve Fitting size_t number_of_segments = std::max(size_t(1), size_t(std::max(0.0f,total_length) / SeamPlacer::seam_align_mm_per_segment)); @@ -1486,7 +1430,7 @@ void SeamPlacer::init(const Print &print, std::function throw_if_can throw_if_canceled_func(); BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: gather_seam_candidates: start"; - gather_seam_candidates(po, global_model_info, configured_seam_preference); + gather_seam_candidates(po, global_model_info); BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: gather_seam_candidates: end"; throw_if_canceled_func(); @@ -1551,7 +1495,7 @@ void SeamPlacer::place_seam(const Layer *layer, ExtrusionLoop &loop, bool extern const size_t layer_index = layer->id() - po->slicing_parameters().raft_layers(); const double unscaled_z = layer->slice_z; - auto get_next_loop_point = [&loop](ExtrusionLoop::ClosestPathPoint current) { + auto get_next_loop_point = [loop](ExtrusionLoop::ClosestPathPoint current) { current.segment_idx += 1; if (current.segment_idx >= loop.paths[current.path_idx].polyline.points.size()) { current.path_idx = next_idx_modulo(current.path_idx, loop.paths.size()); @@ -1574,7 +1518,7 @@ void SeamPlacer::place_seam(const Layer *layer, ExtrusionLoop &loop, bool extern size_t points_count = std::accumulate(loop.paths.begin(), loop.paths.end(), 0, [](size_t acc,const ExtrusionPath& p) { return acc + p.polyline.points.size(); }); - for (size_t _ = 0; _ < points_count; ++_) { + for (size_t i = 0; i < points_count; ++i) { Vec2f unscaled_p = unscaled(closest_point.foot_pt); closest_perimeter_point_index = find_closest_point(*layer_perimeters.points_tree.get(), to_3d(unscaled_p, float(unscaled_z))); @@ -1604,13 +1548,12 @@ void SeamPlacer::place_seam(const Layer *layer, ExtrusionLoop &loop, bool extern Point seam_point = Point::new_scale(seam_position.x(), seam_position.y()); - if (const SeamCandidate &perimeter_point = layer_perimeters.points[seam_index]; - (po->config().seam_position == spNearest || po->config().seam_position == spAligned) && - loop.role() == ExtrusionRole::erPerimeter && //Hopefully internal perimeter - (seam_position - perimeter_point.position).squaredNorm() < 4.0f && // seam is on perimeter point - perimeter_point.local_ccw_angle < -EPSILON // In concave angles - ) { // In this case, we are at internal perimeter, where the external perimeter has seam in concave angle. We want to align - // the internal seam into the concave corner, and not on the perpendicular projection on the closest edge (which is what the split_at function does) + if (loop.role() == ExtrusionRole::Perimeter) { //Hopefully inner perimeter + const SeamCandidate &perimeter_point = layer_perimeters.points[seam_index]; + ExtrusionLoop::ClosestPathPoint projected_point = loop.get_closest_path_and_point(seam_point, false); + // determine depth of the seam point. + float depth = (float) unscale(Point(seam_point - projected_point.foot_pt)).norm(); + float beta_angle = cos(perimeter_point.local_ccw_angle / 2.0f); size_t index_of_prev = seam_index == perimeter_point.perimeter.start_index ? perimeter_point.perimeter.end_index - 1 : @@ -1620,18 +1563,46 @@ void SeamPlacer::place_seam(const Layer *layer, ExtrusionLoop &loop, bool extern perimeter_point.perimeter.start_index : seam_index + 1; - Vec2f dir_to_middle = - ((perimeter_point.position - layer_perimeters.points[index_of_prev].position).head<2>().normalized() - + (perimeter_point.position - layer_perimeters.points[index_of_next].position).head<2>().normalized()) - * 0.5; + if ((seam_position - perimeter_point.position).squaredNorm() < depth && // seam is on perimeter point + perimeter_point.local_ccw_angle < -EPSILON // In concave angles + ) { // In this case, we are at internal perimeter, where the external perimeter has seam in concave angle. We want to align + // the internal seam into the concave corner, and not on the perpendicular projection on the closest edge (which is what the split_at function does) + Vec2f dir_to_middle = + ((perimeter_point.position - layer_perimeters.points[index_of_prev].position).head<2>().normalized() + + (perimeter_point.position - layer_perimeters.points[index_of_next].position).head<2>().normalized()) + * 0.5; + depth = 1.4142 * depth / beta_angle; + // There are some nice geometric identities in determination of the correct depth of new seam point. + //overshoot the target depth, in concave angles it will correctly snap to the corner; TODO: find out why such big overshoot is needed. + Vec2f final_pos = perimeter_point.position.head<2>() + depth * dir_to_middle; + projected_point = loop.get_closest_path_and_point(Point::new_scale(final_pos.x(), final_pos.y()), false); + } else { // not concave angle, in that case the nearest point is the good candidate + // but for staggering, we also need to recompute depth of the inner perimter, because in convex corners, the distance is larger than layer width + // we want the perpendicular depth, not distance to nearest point + depth = depth * beta_angle / 1.4142; + } - ExtrusionLoop::ClosestPathPoint projected_point = loop.get_closest_path_and_point(seam_point, true); - //get closest projected point, determine depth of the seam point. - float depth = (float) unscale(Point(seam_point - projected_point.foot_pt)).norm(); - float angle_factor = cos(-perimeter_point.local_ccw_angle / 2.0f); // There are some nice geometric identities in determination of the correct depth of new seam point. - //overshoot the target depth, in concave angles it will correctly snap to the corner; TODO: find out why such big overshoot is needed. - Vec2f final_pos = perimeter_point.position.head<2>() + (1.4142 * depth / angle_factor) * dir_to_middle; - seam_point = Point::new_scale(final_pos.x(), final_pos.y()); + seam_point = projected_point.foot_pt; + + //lastly, for internal perimeters, do the staggering if requested + if (po->config().staggered_inner_seams && loop.length() > 0.0) { + //fix depth, it is sometimes strongly underestimated + depth = std::max(loop.paths[projected_point.path_idx].width, depth); + + while (depth > 0.0f) { + auto next_point = get_next_loop_point(projected_point); + Vec2f a = unscale(projected_point.foot_pt).cast(); + Vec2f b = unscale(next_point.foot_pt).cast(); + float dist = (a - b).norm(); + if (dist > depth) { + Vec2f final_pos = a + (b - a) * depth / dist; + next_point.foot_pt = Point::new_scale(final_pos.x(), final_pos.y()); + } + depth -= dist; + projected_point = next_point; + } + seam_point = projected_point.foot_pt; + } } // Because the G-code export has 1um resolution, don't generate segments shorter than 1.5 microns, diff --git a/src/libslic3r/GCode/SeamPlacer.hpp b/src/libslic3r/GCode/SeamPlacer.hpp index 2e599690581..671f6bcce8f 100644 --- a/src/libslic3r/GCode/SeamPlacer.hpp +++ b/src/libslic3r/GCode/SeamPlacer.hpp @@ -28,19 +28,6 @@ class Grid; namespace SeamPlacerImpl { -// ************ FOR BACKPORT COMPATIBILITY ONLY *************** -// Angle from v1 to v2, returning double atan2(y, x) normalized to <-PI, PI>. -template -inline double angle(const Eigen::MatrixBase &v1, const Eigen::MatrixBase &v2) { - static_assert(Derived::IsVectorAtCompileTime && int(Derived::SizeAtCompileTime) == 2, "angle(): first parameter is not a 2D vector"); - static_assert(Derived2::IsVectorAtCompileTime && int(Derived2::SizeAtCompileTime) == 2, "angle(): second parameter is not a 2D vector"); - auto v1d = v1.template cast(); - auto v2d = v2.template cast(); - return atan2(cross2(v1d, v2d), v1d.dot(v2d)); -} -// *************************** - - struct GlobalModelInfo; struct SeamComparator; @@ -157,8 +144,7 @@ class SeamPlacer { void place_seam(const Layer *layer, ExtrusionLoop &loop, bool external_first, const Point &last_pos) const; private: - void gather_seam_candidates(const PrintObject *po, const SeamPlacerImpl::GlobalModelInfo &global_model_info, - const SeamPosition configured_seam_preference); + void gather_seam_candidates(const PrintObject *po, const SeamPlacerImpl::GlobalModelInfo &global_model_info); void calculate_candidates_visibility(const PrintObject *po, const SeamPlacerImpl::GlobalModelInfo &global_model_info); void calculate_overhangs_and_layer_embedding(const PrintObject *po); diff --git a/src/libslic3r/GCode/ToolOrdering.cpp b/src/libslic3r/GCode/ToolOrdering.cpp index 9dc9f3f96ed..6a8a7a81215 100644 --- a/src/libslic3r/GCode/ToolOrdering.cpp +++ b/src/libslic3r/GCode/ToolOrdering.cpp @@ -14,8 +14,9 @@ #include #include -#include +#include +#include namespace Slic3r { @@ -62,11 +63,11 @@ unsigned int LayerTools::extruder(const ExtrusionEntityCollection &extrusions, c assert(region.config().infill_extruder.value > 0); assert(region.config().solid_infill_extruder.value > 0); // 1 based extruder ID. - unsigned int extruder = ((this->extruder_override == 0) ? - (is_infill(extrusions.role()) ? - (is_solid_infill(extrusions.entities.front()->role()) ? region.config().solid_infill_extruder : region.config().infill_extruder) : + unsigned int extruder = this->extruder_override == 0 ? + (extrusions.role().is_infill() ? + (extrusions.entities.front()->role().is_solid_infill() ? region.config().solid_infill_extruder : region.config().infill_extruder) : region.config().perimeter_extruder.value) : - this->extruder_override); + this->extruder_override; return (extruder == 0) ? 0 : extruder - 1; } @@ -74,7 +75,7 @@ static double calc_max_layer_height(const PrintConfig &config, double max_object { double max_layer_height = std::numeric_limits::max(); for (size_t i = 0; i < config.nozzle_diameter.values.size(); ++ i) { - double mlh = config.max_layer_height.values[i]; + double mlh = config.max_layer_height.get_at(i); if (mlh == 0.) mlh = 0.75 * config.nozzle_diameter.values[i]; max_layer_height = std::min(max_layer_height, mlh); @@ -103,7 +104,7 @@ ToolOrdering::ToolOrdering(const PrintObject &object, unsigned int first_extrude } double max_layer_height = calc_max_layer_height(object.print()->config(), object.config().layer_height); - // Collect extruders reuqired to print the layers. + // Collect extruders required to print the layers. this->collect_extruders(object, std::vector>()); // Reorder the extruders to minimize tool switches. @@ -187,6 +188,21 @@ void ToolOrdering::initialize_layers(std::vector &zs) } } +// Decides whether this entity could be overridden +[[nodiscard]] static bool is_overriddable(const ExtrusionEntityCollection& eec, const LayerTools& lt, const PrintConfig& print_config, const PrintObject& object, const PrintRegion& region) +{ + if (print_config.filament_soluble.get_at(lt.extruder(eec, region))) + return false; + + if (object.config().wipe_into_objects) + return true; + + if (!region.config().wipe_into_infill || eec.role() != ExtrusionRole::InternalInfill) + return false; + + return true; +} + // Collect extruders reuqired to print layers. void ToolOrdering::collect_extruders(const PrintObject &object, const std::vector> &per_layer_extruder_switches) { @@ -194,8 +210,8 @@ void ToolOrdering::collect_extruders(const PrintObject &object, const std::vecto for (auto support_layer : object.support_layers()) { LayerTools &layer_tools = this->tools_for_layer(support_layer->print_z); ExtrusionRole role = support_layer->support_fills.role(); - bool has_support = role == erMixed || role == erSupportMaterial; - bool has_interface = role == erMixed || role == erSupportMaterialInterface; + bool has_support = role == ExtrusionRole::Mixed || role == ExtrusionRole::SupportMaterial; + bool has_interface = role == ExtrusionRole::Mixed || role == ExtrusionRole::SupportMaterialInterface; unsigned int extruder_support = object.config().support_material_extruder.value; unsigned int extruder_interface = object.config().support_material_interface_extruder.value; if (has_support) @@ -226,18 +242,20 @@ void ToolOrdering::collect_extruders(const PrintObject &object, const std::vecto for (const LayerRegion *layerm : layer->regions()) { const PrintRegion ®ion = layerm->region(); - if (! layerm->perimeters.entities.empty()) { + if (! layerm->perimeters().empty()) { bool something_nonoverriddable = true; if (m_print_config_ptr) { // in this case complete_objects is false (see ToolOrdering constructors) something_nonoverriddable = false; - for (const auto& eec : layerm->perimeters.entities) // let's check if there are nonoverriddable entities - if (!layer_tools.wiping_extrusions().is_overriddable_and_mark(dynamic_cast(*eec), *m_print_config_ptr, object, region)) + for (const ExtrusionEntity *eec : layerm->perimeters()) // let's check if there are nonoverriddable entities + if (is_overriddable(dynamic_cast(*eec), layer_tools, *m_print_config_ptr, object, region)) + layer_tools.wiping_extrusions_nonconst().set_something_overridable(); + else something_nonoverriddable = true; } if (something_nonoverriddable) - layer_tools.extruders.emplace_back((extruder_override == 0) ? region.config().perimeter_extruder.value : extruder_override); + layer_tools.extruders.emplace_back(extruder_override == 0 ? region.config().perimeter_extruder.value : extruder_override); layer_tools.has_object = true; } @@ -245,17 +263,19 @@ void ToolOrdering::collect_extruders(const PrintObject &object, const std::vecto bool has_infill = false; bool has_solid_infill = false; bool something_nonoverriddable = false; - for (const ExtrusionEntity *ee : layerm->fills.entities) { + for (const ExtrusionEntity *ee : layerm->fills()) { // fill represents infill extrusions of a single island. const auto *fill = dynamic_cast(ee); - ExtrusionRole role = fill->entities.empty() ? erNone : fill->entities.front()->role(); - if (is_solid_infill(role)) + ExtrusionRole role = fill->entities.empty() ? ExtrusionRole::None : fill->entities.front()->role(); + if (role.is_solid_infill()) has_solid_infill = true; - else if (role != erNone) + else if (role != ExtrusionRole::None) has_infill = true; if (m_print_config_ptr) { - if (! layer_tools.wiping_extrusions().is_overriddable_and_mark(*fill, *m_print_config_ptr, object, region)) + if (is_overriddable(*fill, layer_tools, *m_print_config_ptr, object, region)) + layer_tools.wiping_extrusions_nonconst().set_something_overridable(); + else something_nonoverriddable = true; } } @@ -598,23 +618,23 @@ const LayerTools& ToolOrdering::tools_for_layer(coordf_t print_z) const // This function is called from Print::mark_wiping_extrusions and sets extruder this entity should be printed with (-1 .. as usual) void WipingExtrusions::set_extruder_override(const ExtrusionEntity* entity, size_t copy_id, int extruder, size_t num_of_copies) { - something_overridden = true; + m_something_overridden = true; - auto entity_map_it = (entity_map.emplace(entity, ExtruderPerCopy())).first; // (add and) return iterator + auto entity_map_it = (m_entity_map.emplace(entity, ExtruderPerCopy())).first; // (add and) return iterator ExtruderPerCopy& copies_vector = entity_map_it->second; copies_vector.resize(num_of_copies, -1); + assert(copies_vector[copy_id] == -1); if (copies_vector[copy_id] != -1) - std::cout << "ERROR: Entity extruder overriden multiple times!!!\n"; // A debugging message - this must never happen. + BOOST_LOG_TRIVIAL(error) << "ERROR: Entity extruder overriden multiple times!!!"; copies_vector[copy_id] = extruder; } // Finds first non-soluble extruder on the layer -int WipingExtrusions::first_nonsoluble_extruder_on_layer(const PrintConfig& print_config) const +[[nodiscard]] static int first_nonsoluble_extruder_on_layer(const PrintConfig& print_config, const LayerTools& layer_tools) { - const LayerTools& lt = *m_layer_tools; - for (auto extruders_it = lt.extruders.begin(); extruders_it != lt.extruders.end(); ++extruders_it) + for (auto extruders_it = layer_tools.extruders.begin(); extruders_it != layer_tools.extruders.end(); ++extruders_it) if (!print_config.filament_soluble.get_at(*extruders_it)) return (*extruders_it); @@ -622,44 +642,33 @@ int WipingExtrusions::first_nonsoluble_extruder_on_layer(const PrintConfig& prin } // Finds last non-soluble extruder on the layer -int WipingExtrusions::last_nonsoluble_extruder_on_layer(const PrintConfig& print_config) const +[[nodiscard]] static int last_nonsoluble_extruder_on_layer(const PrintConfig& print_config, const LayerTools& layer_tools) { - const LayerTools& lt = *m_layer_tools; - for (auto extruders_it = lt.extruders.rbegin(); extruders_it != lt.extruders.rend(); ++extruders_it) + for (auto extruders_it = layer_tools.extruders.rbegin(); extruders_it != layer_tools.extruders.rend(); ++extruders_it) if (!print_config.filament_soluble.get_at(*extruders_it)) return (*extruders_it); return (-1); } -// Decides whether this entity could be overridden -bool WipingExtrusions::is_overriddable(const ExtrusionEntityCollection& eec, const PrintConfig& print_config, const PrintObject& object, const PrintRegion& region) const -{ - if (print_config.filament_soluble.get_at(m_layer_tools->extruder(eec, region))) - return false; - - if (object.config().wipe_into_objects) - return true; - - if (!region.config().wipe_into_infill || eec.role() != erInternalInfill) - return false; - - return true; -} - // Following function iterates through all extrusions on the layer, remembers those that could be used for wiping after toolchange // and returns volume that is left to be wiped on the wipe tower. -float WipingExtrusions::mark_wiping_extrusions(const Print& print, unsigned int old_extruder, unsigned int new_extruder, float volume_to_wipe) +// Switching from old_extruder to new_extruder, trying to wipe volume_to_wipe into not yet extruded extrusions, that may change material (overridable). +float WipingExtrusions::mark_wiping_extrusions(const Print& print, const LayerTools <, unsigned int old_extruder, unsigned int new_extruder, float volume_to_wipe) { - const LayerTools& lt = *m_layer_tools; const float min_infill_volume = 0.f; // ignore infill with smaller volume than this - if (! this->something_overridable || volume_to_wipe <= 0. || print.config().filament_soluble.get_at(old_extruder) || print.config().filament_soluble.get_at(new_extruder)) - return std::max(0.f, volume_to_wipe); // Soluble filament cannot be wiped in a random infill, neither the filament after it + if (! m_something_overridable || volume_to_wipe <= 0. || + // Don't wipe a soluble filament into another object. + print.config().filament_soluble.get_at(old_extruder) || + // Don't prime a soluble filament into another object. + print.config().filament_soluble.get_at(new_extruder)) + // Soluble filament cannot be wiped in a random infill, neither the filament after it + return std::max(0.f, volume_to_wipe); // we will sort objects so that dedicated for wiping are at the beginning: - ConstPrintObjectPtrs object_list = print.objects().vector(); - std::sort(object_list.begin(), object_list.end(), [](const PrintObject* a, const PrintObject* b) { return a->config().wipe_into_objects; }); + ConstPrintObjectPtrs object_list(print.objects().begin(), print.objects().end()); + std::sort(object_list.begin(), object_list.end(), [](const PrintObject* a, const PrintObject* b) { return a->config().wipe_into_objects && ! b->config().wipe_into_objects; }); // We will now iterate through // - first the dedicated objects to mark perimeters or infills (depending on infill_first) @@ -692,10 +701,10 @@ float WipingExtrusions::mark_wiping_extrusions(const Print& print, unsigned int bool wipe_into_infill_only = ! object->config().wipe_into_objects && region.config().wipe_into_infill; if (print.config().infill_first != perimeters_done || wipe_into_infill_only) { - for (const ExtrusionEntity* ee : layerm->fills.entities) { // iterate through all infill Collections + for (const ExtrusionEntity* ee : layerm->fills()) { // iterate through all infill Collections auto* fill = dynamic_cast(ee); - if (!is_overriddable(*fill, print.config(), *object, region)) + if (!is_overriddable(*fill, lt, print.config(), *object, region)) continue; if (wipe_into_infill_only && ! print.config().infill_first) @@ -716,9 +725,9 @@ float WipingExtrusions::mark_wiping_extrusions(const Print& print, unsigned int // Now the same for perimeters - see comments above for explanation: if (object->config().wipe_into_objects && print.config().infill_first == perimeters_done) { - for (const ExtrusionEntity* ee : layerm->perimeters.entities) { + for (const ExtrusionEntity* ee : layerm->perimeters()) { auto* fill = dynamic_cast(ee); - if (is_overriddable(*fill, print.config(), *object, region) && !is_entity_overridden(fill, copy) && fill->total_volume() > min_infill_volume) { + if (is_overriddable(*fill, lt, print.config(), *object, region) && !is_entity_overridden(fill, copy) && fill->total_volume() > min_infill_volume) { set_extruder_override(fill, copy, new_extruder, num_of_copies); if ((volume_to_wipe -= float(fill->total_volume())) <= 0.f) // More material was purged already than asked for. @@ -740,14 +749,13 @@ float WipingExtrusions::mark_wiping_extrusions(const Print& print, unsigned int // that were not actually overridden. If they are part of a dedicated object, printing them with the extruder // they were initially assigned to might mean violating the perimeter-infill order. We will therefore go through // them again and make sure we override it. -void WipingExtrusions::ensure_perimeters_infills_order(const Print& print) +void WipingExtrusions::ensure_perimeters_infills_order(const Print& print, const LayerTools <) { - if (! this->something_overridable) + if (! m_something_overridable) return; - const LayerTools& lt = *m_layer_tools; - unsigned int first_nonsoluble_extruder = first_nonsoluble_extruder_on_layer(print.config()); - unsigned int last_nonsoluble_extruder = last_nonsoluble_extruder_on_layer(print.config()); + unsigned int first_nonsoluble_extruder = first_nonsoluble_extruder_on_layer(print.config(), lt); + unsigned int last_nonsoluble_extruder = last_nonsoluble_extruder_on_layer(print.config(), lt); for (const PrintObject* object : print.objects()) { // Finds this layer: @@ -762,10 +770,11 @@ void WipingExtrusions::ensure_perimeters_infills_order(const Print& print) if (!region.config().wipe_into_infill && !object->config().wipe_into_objects) continue; - for (const ExtrusionEntity* ee : layerm->fills.entities) { // iterate through all infill Collections + for (const ExtrusionEntity* ee : layerm->fills()) { // iterate through all infill Collections auto* fill = dynamic_cast(ee); + assert(fill); - if (!is_overriddable(*fill, print.config(), *object, region) + if (!is_overriddable(*fill, lt, print.config(), *object, region) || is_entity_overridden(fill, copy) ) continue; @@ -775,8 +784,8 @@ void WipingExtrusions::ensure_perimeters_infills_order(const Print& print) // Either way, we will now force-override it with something suitable: if (print.config().infill_first || object->config().wipe_into_objects // in this case the perimeter is overridden, so we can override by the last one safely - || lt.is_extruder_order(lt.perimeter_extruder(region), last_nonsoluble_extruder // !infill_first, but perimeter is already printed when last extruder prints - || ! lt.has_extruder(lt.infill_extruder(region)))) // we have to force override - this could violate infill_first (FIXME) + || lt.is_extruder_order(lt.perimeter_extruder(region), last_nonsoluble_extruder) // !infill_first, but perimeter is already printed when last extruder prints + || ! lt.has_extruder(lt.infill_extruder(region))) // we have to force override - this could violate infill_first (FIXME) set_extruder_override(fill, copy, (print.config().infill_first ? first_nonsoluble_extruder : last_nonsoluble_extruder), num_of_copies); else { // In this case we can (and should) leave it to be printed normally. @@ -785,9 +794,10 @@ void WipingExtrusions::ensure_perimeters_infills_order(const Print& print) } // Now the same for perimeters - see comments above for explanation: - for (const ExtrusionEntity* ee : layerm->perimeters.entities) { // iterate through all perimeter Collections + for (const ExtrusionEntity* ee : layerm->perimeters()) { // iterate through all perimeter Collections auto* fill = dynamic_cast(ee); - if (is_overriddable(*fill, print.config(), *object, region) && ! is_entity_overridden(fill, copy)) + assert(fill); + if (is_overriddable(*fill, lt, print.config(), *object, region) && ! is_entity_overridden(fill, copy)) set_extruder_override(fill, copy, (print.config().infill_first ? last_nonsoluble_extruder : first_nonsoluble_extruder), num_of_copies); } } @@ -795,24 +805,4 @@ void WipingExtrusions::ensure_perimeters_infills_order(const Print& print) } } -// Following function is called from GCode::process_layer and returns pointer to vector with information about which extruders should be used for given copy of this entity. -// If this extrusion does not have any override, nullptr is returned. -// Otherwise it modifies the vector in place and changes all -1 to correct_extruder_id (at the time the overrides were created, correct extruders were not known, -// so -1 was used as "print as usual"). -// The resulting vector therefore keeps track of which extrusions are the ones that were overridden and which were not. If the extruder used is overridden, -// its number is saved as is (zero-based index). Regular extrusions are saved as -number-1 (unfortunately there is no negative zero). -const WipingExtrusions::ExtruderPerCopy* WipingExtrusions::get_extruder_overrides(const ExtrusionEntity* entity, int correct_extruder_id, size_t num_of_copies) -{ - ExtruderPerCopy *overrides = nullptr; - auto entity_map_it = entity_map.find(entity); - if (entity_map_it != entity_map.end()) { - overrides = &entity_map_it->second; - overrides->resize(num_of_copies, -1); - // Each -1 now means "print as usual" - we will replace it with actual extruder id (shifted it so we don't lose that information): - std::replace(overrides->begin(), overrides->end(), -1, -correct_extruder_id-1); - } - return overrides; -} - - } // namespace Slic3r diff --git a/src/libslic3r/GCode/ToolOrdering.hpp b/src/libslic3r/GCode/ToolOrdering.hpp index 0367303258e..4fb6e56c065 100644 --- a/src/libslic3r/GCode/ToolOrdering.hpp +++ b/src/libslic3r/GCode/ToolOrdering.hpp @@ -6,6 +6,7 @@ #include "../libslic3r.h" #include +#include #include @@ -14,6 +15,7 @@ namespace Slic3r { class Print; class PrintObject; class LayerTools; +class ToolOrdering; namespace CustomGCode { struct Item; } class PrintRegion; @@ -24,54 +26,51 @@ class WipingExtrusions { public: bool is_anything_overridden() const { // if there are no overrides, all the agenda can be skipped - this function can tell us if that's the case - return something_overridden; + return m_something_overridden; } // When allocating extruder overrides of an object's ExtrusionEntity, overrides for maximum 3 copies are allocated in place. - typedef boost::container::small_vector ExtruderPerCopy; - - // This is called from GCode::process_layer - see implementation for further comments: - const ExtruderPerCopy* get_extruder_overrides(const ExtrusionEntity* entity, int correct_extruder_id, size_t num_of_copies); + using ExtruderPerCopy = +#ifdef NDEBUG + boost::container::small_vector; +#else // NDEBUG + std::vector; +#endif // NDEBUG + + // This is called from GCode::process_layer_single_object() + // Returns positive number if the extruder is overridden. + // Returns -1 if not. + int get_extruder_override(const ExtrusionEntity* entity, uint32_t instance_id) const { + auto entity_map_it = m_entity_map.find(entity); + return entity_map_it == m_entity_map.end() ? -1 : entity_map_it->second[instance_id]; + } // This function goes through all infill entities, decides which ones will be used for wiping and // marks them by the extruder id. Returns volume that remains to be wiped on the wipe tower: - float mark_wiping_extrusions(const Print& print, unsigned int old_extruder, unsigned int new_extruder, float volume_to_wipe); + float mark_wiping_extrusions(const Print& print, const LayerTools& lt, unsigned int old_extruder, unsigned int new_extruder, float volume_to_wipe); - void ensure_perimeters_infills_order(const Print& print); + void ensure_perimeters_infills_order(const Print& print, const LayerTools& lt); - bool is_overriddable(const ExtrusionEntityCollection& ee, const PrintConfig& print_config, const PrintObject& object, const PrintRegion& region) const; - bool is_overriddable_and_mark(const ExtrusionEntityCollection& ee, const PrintConfig& print_config, const PrintObject& object, const PrintRegion& region) { - bool out = this->is_overriddable(ee, print_config, object, region); - this->something_overridable |= out; - return out; - } - - void set_layer_tools_ptr(const LayerTools* lt) { m_layer_tools = lt; } + void set_something_overridable() { m_something_overridable = true; } private: - int first_nonsoluble_extruder_on_layer(const PrintConfig& print_config) const; - int last_nonsoluble_extruder_on_layer(const PrintConfig& print_config) const; - // This function is called from mark_wiping_extrusions and sets extruder that it should be printed with (-1 .. as usual) void set_extruder_override(const ExtrusionEntity* entity, size_t copy_id, int extruder, size_t num_of_copies); // Returns true in case that entity is not printed with its usual extruder for a given copy: bool is_entity_overridden(const ExtrusionEntity* entity, size_t copy_id) const { - auto it = entity_map.find(entity); - return it == entity_map.end() ? false : it->second[copy_id] != -1; + auto it = m_entity_map.find(entity); + return it == m_entity_map.end() ? false : it->second[copy_id] != -1; } - std::map entity_map; // to keep track of who prints what - bool something_overridable = false; - bool something_overridden = false; - const LayerTools* m_layer_tools = nullptr; // so we know which LayerTools object this belongs to + std::map m_entity_map; // to keep track of who prints what + bool m_something_overridable = false; + bool m_something_overridden = false; }; class LayerTools { public: - LayerTools(const coordf_t z) : print_z(z) {} - // Changing these operators to epsilon version can make a problem in cases where support and object layers get close to each other. // In case someone tries to do it, make sure you know what you're doing and test it properly (slice multiple objects at once with supports). bool operator< (const LayerTools &rhs) const { return print_z < rhs.print_z; } @@ -109,12 +108,14 @@ class LayerTools // Custom G-code (color change, extruder switch, pause) to be performed before this layer starts to print. const CustomGCode::Item *custom_gcode = nullptr; - WipingExtrusions& wiping_extrusions() { - m_wiping_extrusions.set_layer_tools_ptr(this); - return m_wiping_extrusions; - } + WipingExtrusions& wiping_extrusions_nonconst() { return m_wiping_extrusions; } + const WipingExtrusions& wiping_extrusions() const { return m_wiping_extrusions; } private: + // to access LayerTools private constructor + friend class ToolOrdering; + LayerTools(const coordf_t z) : print_z(z) {} + // This object holds list of extrusion that will be used for extruder wiping WipingExtrusions m_wiping_extrusions; }; diff --git a/src/libslic3r/GCode/WipeTower.cpp b/src/libslic3r/GCode/WipeTower.cpp index db087a9bad4..54c6199ec08 100644 --- a/src/libslic3r/GCode/WipeTower.cpp +++ b/src/libslic3r/GCode/WipeTower.cpp @@ -4,12 +4,17 @@ #include #include #include +#include #include #include +#include "ClipperUtils.hpp" #include "GCodeProcessor.hpp" #include "BoundingBox.hpp" #include "LocalesUtils.hpp" +#include "Geometry.hpp" +#include "Surface.hpp" +#include "Fill/FillRectilinear.hpp" #include @@ -37,7 +42,7 @@ class WipeTowerWriter // adds tag for analyzer: std::ostringstream str; str << ";" << GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Height) << m_layer_height << "\n"; // don't rely on GCodeAnalyzer knowing the layer height - it knows nothing at priming - str << ";" << GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Role) << ExtrusionEntity::role_to_string(erWipeTower) << "\n"; + str << ";" << GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Role) << gcode_extrusion_role_to_string(GCodeExtrusionRole::WipeTower) << "\n"; m_gcode += str.str(); change_analyzer_line_width(line_width); } @@ -71,6 +76,8 @@ class WipeTowerWriter return *this; } + WipeTowerWriter& set_position(const Vec2f &pos) { m_current_pos = pos; return *this; } + WipeTowerWriter& set_initial_tool(size_t tool) { m_current_tool = tool; return *this; } WipeTowerWriter& set_z(float z) @@ -86,9 +93,12 @@ class WipeTowerWriter } WipeTowerWriter& disable_linear_advance() { - m_gcode += (m_gcode_flavor == gcfRepRapSprinter || m_gcode_flavor == gcfRepRapFirmware - ? (std::string("M572 D") + std::to_string(m_current_tool) + " S0\n") - : std::string("M900 K0\n")); + if (m_gcode_flavor == gcfRepRapSprinter || m_gcode_flavor == gcfRepRapFirmware) + m_gcode += (std::string("M572 D") + std::to_string(m_current_tool) + " S0\n"); + else if (m_gcode_flavor == gcfKlipper) + m_gcode += "SET_PRESSURE_ADVANCE ADVANCE=0\n"; + else + m_gcode += "M900 K0\n"; return *this; } @@ -356,6 +366,8 @@ class WipeTowerWriter // Set digital trimpot motor WipeTowerWriter& set_extruder_trimpot(int current) { + if (m_gcode_flavor == gcfKlipper) + return *this; if (m_gcode_flavor == gcfRepRapSprinter || m_gcode_flavor == gcfRepRapFirmware) m_gcode += "M906 E"; else @@ -510,6 +522,8 @@ WipeTower::WipeTower(const PrintConfig& config, const std::vector m_plan.begin() && m_layer_info < m_plan.end() && (m_layer_info-1!=m_plan.begin() || !m_adhesion )) { + if (m_semm && (m_layer_info > m_plan.begin() && m_layer_info < m_plan.end() && (m_layer_info-1!=m_plan.begin() || !m_adhesion ))) { // this is y of the center of previous sparse infill border float sparse_beginning_y = 0.f; @@ -849,7 +867,7 @@ void WipeTower::toolchange_Unload( writer.disable_linear_advance(); // now the ramming itself: - while (i < m_filpar[m_current_tool].ramming_speed.size()) + while (m_semm && i < m_filpar[m_current_tool].ramming_speed.size()) { const float x = volume_to_length(m_filpar[m_current_tool].ramming_speed[i] * 0.25f, line_width, m_layer_height); const float e = m_filpar[m_current_tool].ramming_speed[i] * 0.25f / filament_area(); // transform volume per sec to E move; @@ -898,7 +916,7 @@ void WipeTower::toolchange_Unload( // Cooling: const int& number_of_moves = m_filpar[m_current_tool].cooling_moves; - if (number_of_moves > 0) { + if (m_semm && number_of_moves > 0) { const float& initial_speed = m_filpar[m_current_tool].cooling_initial_speed; const float& final_speed = m_filpar[m_current_tool].cooling_final_speed; @@ -916,17 +934,23 @@ void WipeTower::toolchange_Unload( } } - // let's wait is necessary: - writer.wait(m_filpar[m_current_tool].delay); - // we should be at the beginning of the cooling tube again - let's move to parking position: - writer.retract(-m_cooling_tube_length/2.f+m_parking_pos_retraction-m_cooling_tube_retraction, 2000); + if (m_semm) { + // let's wait is necessary: + writer.wait(m_filpar[m_current_tool].delay); + // we should be at the beginning of the cooling tube again - let's move to parking position: + writer.retract(-m_cooling_tube_length/2.f+m_parking_pos_retraction-m_cooling_tube_retraction, 2000); + } - // this is to align ramming and future wiping extrusions, so the future y-steps can be uniform from the start: + // this is to align ramming and future wiping extrusions, so the future y-steps can be uniform from the start: // the perimeter_width will later be subtracted, it is there to not load while moving over just extruded material - writer.travel(end_of_ramming.x(), end_of_ramming.y() + (y_step/m_extra_spacing-m_perimeter_width) / 2.f + m_perimeter_width, 2400.f); + Vec2f pos = Vec2f(end_of_ramming.x(), end_of_ramming.y() + (y_step/m_extra_spacing-m_perimeter_width) / 2.f + m_perimeter_width); + if (m_semm) + writer.travel(pos, 2400.f); + else + writer.set_position(pos); - writer.resume_preview() - .flush_planner_queue(); + writer.resume_preview() + .flush_planner_queue(); } // Change the tool, set a speed override for soluble and flex materials. @@ -941,7 +965,7 @@ void WipeTower::toolchange_Change( // This is where we want to place the custom gcodes. We will use placeholders for this. // These will be substituted by the actual gcodes when the gcode is generated. - writer.append("[end_filament_gcode]\n"); + //writer.append("[end_filament_gcode]\n"); writer.append("[toolchange_gcode]\n"); // Travel to where we assume we are. Custom toolchange or some special T code handling (parking extruder etc) @@ -952,11 +976,12 @@ void WipeTower::toolchange_Change( .append(std::string("G1 X") + Slic3r::float_to_string_decimal_point(current_pos.x()) + " Y" + Slic3r::float_to_string_decimal_point(current_pos.y()) + never_skip_tag() + "\n"); + writer.append("[deretraction_from_wipe_tower_generator]"); // The toolchange Tn command will be inserted later, only in case that the user does // not provide a custom toolchange gcode. writer.set_tool(new_tool); // This outputs nothing, the writer just needs to know the tool has changed. - writer.append("[start_filament_gcode]\n"); + //writer.append("[start_filament_gcode]\n"); writer.flush_planner_queue(); m_current_tool = new_tool; @@ -1156,45 +1181,201 @@ WipeTower::ToolChangeResult WipeTower::finish_layer() ";------------------\n\n\n\n\n\n\n"); } - // outer perimeter (always): - writer.rectangle(wt_box, feedrate); + const float spacing = m_perimeter_width - m_layer_height*float(1.-M_PI_4); + + // This block creates the stabilization cone. + // First define a lambda to draw the rectangle with stabilization. + auto supported_rectangle = [this, &writer, spacing](const box_coordinates& wt_box, double feedrate, bool infill_cone) -> Polygon { + const auto [R, support_scale] = get_wipe_tower_cone_base(m_wipe_tower_width, m_wipe_tower_height, m_wipe_tower_depth, m_wipe_tower_cone_angle); + + double z = m_no_sparse_layers ? (m_current_height + m_layer_info->height) : m_layer_info->z; // the former should actually work in both cases, but let's stay on the safe side (the 2.6.0 is close) + + double r = std::tan(Geometry::deg2rad(m_wipe_tower_cone_angle/2.f)) * (m_wipe_tower_height - z); + Vec2f center = (wt_box.lu + wt_box.rd) / 2.; + double w = wt_box.lu.y() - wt_box.ld.y(); + enum Type { + Arc, + Corner, + ArcStart, + ArcEnd + }; + + // First generate vector of annotated point which form the boundary. + std::vector> pts = {{wt_box.ru, Corner}}; + if (double alpha_start = std::asin((0.5*w)/r); ! std::isnan(alpha_start) && r > 0.5*w+0.01) { + for (double alpha = alpha_start; alpha < M_PI-alpha_start+0.001; alpha+=(M_PI-2*alpha_start) / 20.) + pts.emplace_back(Vec2f(center.x() + r*std::cos(alpha)/support_scale, center.y() + r*std::sin(alpha)), alpha == alpha_start ? ArcStart : Arc); + pts.back().second = ArcEnd; + } + pts.emplace_back(wt_box.lu, Corner); + pts.emplace_back(wt_box.ld, Corner); + for (int i=int(pts.size())-3; i>0; --i) + pts.emplace_back(Vec2f(pts[i].first.x(), 2*center.y()-pts[i].first.y()), i == int(pts.size())-3 ? ArcStart : i == 1 ? ArcEnd : Arc); + pts.emplace_back(wt_box.rd, Corner); + + // Create a Polygon from the points. + Polygon poly; + for (const auto& [pt, tag] : pts) + poly.points.push_back(Point::new_scale(pt)); + + // Prepare polygons to be filled by infill. + Polylines polylines; + if (infill_cone && m_wipe_tower_width > 2*spacing && m_wipe_tower_depth > 2*spacing) { + ExPolygons infill_areas; + ExPolygon wt_contour(poly); + Polygon wt_rectangle(Points{Point::new_scale(wt_box.ld), Point::new_scale(wt_box.rd), Point::new_scale(wt_box.ru), Point::new_scale(wt_box.lu)}); + wt_rectangle = offset(wt_rectangle, scale_(-spacing/2.)).front(); + wt_contour = offset_ex(wt_contour, scale_(-spacing/2.)).front(); + infill_areas = diff_ex(wt_contour, wt_rectangle); + if (infill_areas.size() == 2) { + ExPolygon& bottom_expoly = infill_areas.front().contour.points.front().y() < infill_areas.back().contour.points.front().y() ? infill_areas[0] : infill_areas[1]; + std::unique_ptr filler(Fill::new_from_type(ipMonotonicLines)); + filler->angle = Geometry::deg2rad(45.f); + filler->spacing = spacing; + FillParams params; + params.density = 1.f; + Surface surface(stBottom, bottom_expoly); + filler->bounding_box = get_extents(bottom_expoly); + polylines = filler->fill_surface(&surface, params); + if (! polylines.empty()) { + if (polylines.front().points.front().x() > polylines.back().points.back().x()) { + std::reverse(polylines.begin(), polylines.end()); + for (Polyline& p : polylines) + p.reverse(); + } + } + } + } + + // Find the closest corner and travel to it. + int start_i = 0; + double min_dist = std::numeric_limits::max(); + for (int i=0; i() - center)); + for (size_t i=0; i() - center)); + } + writer.travel(pts[i].first); + } + } + if (++i == int(pts.size())) + i = 0; + } + writer.extrude(pts[start_i].first, feedrate); + return poly; + }; + + // outer contour (always) + bool infill_cone = first_layer && m_wipe_tower_width > 2*spacing && m_wipe_tower_depth > 2*spacing; + Polygon poly = supported_rectangle(wt_box, feedrate, infill_cone); + // brim (first layer only) if (first_layer) { box_coordinates box = wt_box; - float spacing = m_perimeter_width - m_layer_height*float(1.-M_PI_4); - // How many perimeters shall the brim have? size_t loops_num = (m_wipe_tower_brim_width + spacing/2.f) / spacing; - + for (size_t i = 0; i < loops_num; ++ i) { - box.expand(spacing); - writer.rectangle(box); + poly = offset(poly, scale_(spacing)).front(); + int cp = poly.closest_point_index(Point::new_scale(writer.x(), writer.y())); + writer.travel(unscale(poly.points[cp]).cast()); + for (int i=cp+1; true; ++i ) { + if (i==int(poly.points.size())) + i = 0; + writer.extrude(unscale(poly.points[i]).cast()); + if (i == cp) + break; + } } // Save actual brim width to be later passed to the Print object, which will use it // for skirt calculation and pass it to GLCanvas for precise preview box - m_wipe_tower_brim_width_real = wt_box.ld.x() - box.ld.x() + spacing/2.f; - wt_box = box; + m_wipe_tower_brim_width_real = loops_num * spacing; } - // Now prepare future wipe. box contains rectangle that was extruded last (ccw). - Vec2f target = (writer.pos() == wt_box.ld ? wt_box.rd : - (writer.pos() == wt_box.rd ? wt_box.ru : - (writer.pos() == wt_box.ru ? wt_box.lu : - wt_box.ld))); - writer.add_wipe_point(writer.pos()) - .add_wipe_point(target); - + // Now prepare future wipe. + int i = poly.closest_point_index(Point::new_scale(writer.x(), writer.y())); + writer.add_wipe_point(writer.pos()); + writer.add_wipe_point(unscale(poly.points[i==0 ? int(poly.points.size())-1 : i-1]).cast()); // Ask our writer about how much material was consumed. // Skip this in case the layer is sparse and config option to not print sparse layers is enabled. - if (! m_no_sparse_layers || toolchanges_on_layer || first_layer) + if (! m_no_sparse_layers || toolchanges_on_layer || first_layer) { if (m_current_tool < m_used_filament_length.size()) m_used_filament_length[m_current_tool] += writer.get_and_reset_used_filament_length(); + m_current_height += m_layer_info->height; + } return construct_tcr(writer, false, old_tool); } +// Static method to get the radius and x-scaling of the stabilizing cone base. +std::pair WipeTower::get_wipe_tower_cone_base(double width, double height, double depth, double angle_deg) +{ + double R = std::tan(Geometry::deg2rad(angle_deg/2.)) * height; + double fake_width = 0.66 * width; + double diag = std::hypot(fake_width / 2., depth / 2.); + double support_scale = 1.; + if (R > diag) { + double w = fake_width; + double sin = 0.5 * depth / diag; + double tan = depth / w; + double t = (R - diag) * sin; + support_scale = (w / 2. + t / tan + t * tan) / (w / 2.); + } + return std::make_pair(R, support_scale); +} + +// Static method to extract wipe_volumes[from][to] from the configuration. +std::vector> WipeTower::extract_wipe_volumes(const PrintConfig& config) +{ + // Get wiping matrix to get number of extruders and convert vector to vector: + std::vector wiping_matrix(cast(config.wiping_volumes_matrix.values)); + + // The values shall only be used when SEMM is enabled. The purging for other printers + // is determined by filament_minimal_purge_on_wipe_tower. + if (! config.single_extruder_multi_material.value) + std::fill(wiping_matrix.begin(), wiping_matrix.end(), 0.f); + + // Extract purging volumes for each extruder pair: + std::vector> wipe_volumes; + const unsigned int number_of_extruders = (unsigned int)(sqrt(wiping_matrix.size())+EPSILON); + for (unsigned int i = 0; i(wiping_matrix.begin()+i*number_of_extruders, wiping_matrix.begin()+(i+1)*number_of_extruders)); + + // Also include filament_minimal_purge_on_wipe_tower. This is needed for the preview. + for (unsigned int i = 0; i= 0; --layer_index) { @@ -1321,8 +1504,6 @@ void WipeTower::generate(std::vector> & if (m_plan.empty()) return; - m_extra_spacing = 1.f; - plan_tower(); for (int i=0;i<5;++i) { save_on_last_wipe(); @@ -1330,6 +1511,7 @@ void WipeTower::generate(std::vector> & } m_layer_info = m_plan.begin(); + m_current_height = 0.f; // we don't know which extruder to start with - we'll set it according to the first toolchange for (const auto& layer : m_plan) { @@ -1345,7 +1527,7 @@ void WipeTower::generate(std::vector> & m_old_temperature = -1; // reset last temperature written in the gcode std::vector layer_result; - for (auto layer : m_plan) + for (const WipeTower::WipeTowerInfo& layer : m_plan) { set_layer(layer.z, layer.height, 0, false/*layer.z == m_plan.front().z*/, layer.z == m_plan.back().z); m_internal_rotation += 180.f; @@ -1374,8 +1556,10 @@ void WipeTower::generate(std::vector> & layer_result.emplace_back(std::move(finish_layer_tcr)); } else { - if (idx == -1) + if (idx == -1) { layer_result[0] = merge_tcr(finish_layer_tcr, layer_result[0]); + layer_result[0].force_travel = true; + } else layer_result[idx] = merge_tcr(layer_result[idx], finish_layer_tcr); } diff --git a/src/libslic3r/GCode/WipeTower.hpp b/src/libslic3r/GCode/WipeTower.hpp index 397b5ab7d8e..8209d13f493 100644 --- a/src/libslic3r/GCode/WipeTower.hpp +++ b/src/libslic3r/GCode/WipeTower.hpp @@ -22,6 +22,8 @@ class WipeTower { public: static const std::string never_skip_tag() { return "_GCODE_WIPE_TOWER_NEVER_SKIP_TAG"; } + static std::pair get_wipe_tower_cone_base(double width, double height, double depth, double angle_deg); + static std::vector> extract_wipe_volumes(const PrintConfig& config); struct Extrusion { @@ -82,6 +84,8 @@ class WipeTower } return e_length; } + + bool force_travel = false; }; struct box_coordinates @@ -140,6 +144,7 @@ class WipeTower float get_depth() const { return m_wipe_tower_depth; } float get_brim_width() const { return m_wipe_tower_brim_width_real; } + float get_wipe_tower_height() const { return m_wipe_tower_height; } @@ -251,6 +256,8 @@ class WipeTower Vec2f m_wipe_tower_pos; // Left front corner of the wipe tower in mm. float m_wipe_tower_width; // Width of the wipe tower. float m_wipe_tower_depth = 0.f; // Depth of the wipe tower + float m_wipe_tower_height = 0.f; + float m_wipe_tower_cone_angle = 0.f; float m_wipe_tower_brim_width = 0.f; // Width of brim (mm) from config float m_wipe_tower_brim_width_real = 0.f; // Width of brim (mm) after generation float m_wipe_tower_rotation_angle = 0.f; // Wipe tower rotation angle in degrees (with respect to x axis) @@ -290,7 +297,6 @@ class WipeTower // Extruder specific parameters. std::vector m_filpar; - // State of the wipe tower generator. unsigned int m_num_layer_changes = 0; // Layer change counter for the output statistics. unsigned int m_num_tool_changes = 0; // Tool change change counter for the output statistics. @@ -358,6 +364,10 @@ class WipeTower std::vector m_plan; // Stores information about all layers and toolchanges for the future wipe tower (filled by plan_toolchange(...)) std::vector::iterator m_layer_info = m_plan.end(); + // This sums height of all extruded layers, not counting the layers which + // will be later removed when the "no_sparse_layers" is used. + float m_current_height = 0.f; + // Stores information about used filament length per extruder: std::vector m_used_filament_length; diff --git a/src/libslic3r/GCodeReader.cpp b/src/libslic3r/GCodeReader.cpp index c8a9b790fcf..a45ea8439e9 100644 --- a/src/libslic3r/GCodeReader.cpp +++ b/src/libslic3r/GCodeReader.cpp @@ -10,7 +10,6 @@ #include "LocalesUtils.hpp" -#include #include namespace Slic3r { @@ -37,14 +36,11 @@ void GCodeReader::apply_config(const DynamicPrintConfig &config) const char* GCodeReader::parse_line_internal(const char *ptr, const char *end, GCodeLine &gline, std::pair &command) { - PROFILE_FUNC(); - assert(is_decimal_separator_point()); // command and args const char *c = ptr; { - PROFILE_BLOCK(command_and_args); // Skip the whitespaces. command.first = skip_whitespaces(c); // Skip the command. @@ -74,7 +70,7 @@ const char* GCodeReader::parse_line_internal(const char *ptr, const char *end, G if (axis != NUM_AXES_WITH_UNKNOWN) { // Try to parse the numeric value. double v; - c = skip_whitespaces(++c); + c = skip_whitespaces(++ c); auto [pend, ec] = fast_float::from_chars(c, end, v); if (pend != c && is_end_of_word(*pend)) { // The axis value has been parsed correctly. @@ -98,10 +94,8 @@ const char* GCodeReader::parse_line_internal(const char *ptr, const char *end, G for (; ! is_end_of_line(*c); ++ c); // Copy the raw string including the comment, without the trailing newlines. - if (c > ptr) { - PROFILE_BLOCK(copy_raw_string); + if (c > ptr) gline.m_raw.assign(ptr, c); - } // Skip the trailing newlines. if (*c == '\r') @@ -117,7 +111,6 @@ const char* GCodeReader::parse_line_internal(const char *ptr, const char *end, G void GCodeReader::update_coordinates(GCodeLine &gline, std::pair &command) { - PROFILE_FUNC(); if (*command.first == 'G') { int cmd_len = int(command.second - command.first); if ((cmd_len == 2 && (command.first[1] == '0' || command.first[1] == '1')) || @@ -215,9 +208,9 @@ bool GCodeReader::parse_file_raw(const std::string &filename, raw_line_callback_ [](size_t){}); } -bool GCodeReader::GCodeLine::has(char axis) const +const char* GCodeReader::axis_pos(const char *raw_str, char axis) { - const char *c = m_raw.c_str(); + const char *c = raw_str; // Skip the whitespaces. c = skip_whitespaces(c); // Skip the command. @@ -230,40 +223,48 @@ bool GCodeReader::GCodeLine::has(char axis) const break; // Check the name of the axis. if (*c == axis) - return true; + return c; // Skip the rest of the word. c = skip_word(c); } - return false; + return nullptr; +} + +bool GCodeReader::GCodeLine::has(char axis) const +{ + const char *c = axis_pos(m_raw.c_str(), axis); + return c != nullptr; } bool GCodeReader::GCodeLine::has_value(char axis, float &value) const { assert(is_decimal_separator_point()); - const char *c = m_raw.c_str(); - // Skip the whitespaces. - c = skip_whitespaces(c); - // Skip the command. - c = skip_word(c); - // Up to the end of line or comment. - while (! is_end_of_gcode_line(*c)) { - // Skip whitespaces. - c = skip_whitespaces(c); - if (is_end_of_gcode_line(*c)) - break; - // Check the name of the axis. - if (*c == axis) { - // Try to parse the numeric value. - char *pend = nullptr; - double v = strtod(++ c, &pend); - if (pend != nullptr && is_end_of_word(*pend)) { - // The axis value has been parsed correctly. - value = float(v); - return true; - } - } - // Skip the rest of the word. - c = skip_word(c); + const char *c = axis_pos(m_raw.c_str(), axis); + if (c == nullptr) + return false; + // Try to parse the numeric value. + char *pend = nullptr; + double v = strtod(++ c, &pend); + if (pend != nullptr && is_end_of_word(*pend)) { + // The axis value has been parsed correctly. + value = float(v); + return true; + } + return false; +} + +bool GCodeReader::GCodeLine::has_value(char axis, int &value) const +{ + const char *c = axis_pos(m_raw.c_str(), axis); + if (c == nullptr) + return false; + // Try to parse the numeric value. + char *pend = nullptr; + long v = strtol(++ c, &pend, 10); + if (pend != nullptr && is_end_of_word(*pend)) { + // The axis value has been parsed correctly. + value = int(v); + return true; } return false; } diff --git a/src/libslic3r/GCodeReader.hpp b/src/libslic3r/GCodeReader.hpp index 0ab268139fb..bf85a5131fa 100644 --- a/src/libslic3r/GCodeReader.hpp +++ b/src/libslic3r/GCodeReader.hpp @@ -30,11 +30,14 @@ class GCodeReader { float value(Axis axis) const { return m_axis[axis]; } bool has(char axis) const; bool has_value(char axis, float &value) const; + bool has_value(char axis, int &value) const; float new_X(const GCodeReader &reader) const { return this->has(X) ? this->x() : reader.x(); } float new_Y(const GCodeReader &reader) const { return this->has(Y) ? this->y() : reader.y(); } float new_Z(const GCodeReader &reader) const { return this->has(Z) ? this->z() : reader.z(); } float new_E(const GCodeReader &reader) const { return this->has(E) ? this->e() : reader.e(); } float new_F(const GCodeReader &reader) const { return this->has(F) ? this->f() : reader.f(); } + Point new_XY_scaled(const GCodeReader &reader) const + { return Point::new_scale(this->new_X(reader), this->new_Y(reader)); } float dist_X(const GCodeReader &reader) const { return this->has(X) ? (this->x() - reader.x()) : 0; } float dist_Y(const GCodeReader &reader) const { return this->has(Y) ? (this->y() - reader.y()) : 0; } float dist_Z(const GCodeReader &reader) const { return this->has(Z) ? (this->z() - reader.z()) : 0; } @@ -68,6 +71,19 @@ class GCodeReader { return strncmp(cmd, cmd_test, len) == 0 && GCodeReader::is_end_of_word(cmd[len]); } +#if ENABLE_GCODE_POSTPROCESS_BACKTRACE + static bool cmd_starts_with(const std::string& gcode_line, const char* cmd_test) { + return strncmp(GCodeReader::skip_whitespaces(gcode_line.c_str()), cmd_test, strlen(cmd_test)) == 0; + } + + static std::string extract_cmd(const std::string& gcode_line) { + GCodeLine temp; + temp.m_raw = gcode_line; + const std::string_view cmd = temp.cmd(); + return { cmd.begin(), cmd.end() }; + } +#endif // ENABLE_GCODE_POSTPROCESS_BACKTRACE + private: std::string m_raw; float m_axis[NUM_AXES]; @@ -134,6 +150,8 @@ class GCodeReader { float e() const { return m_position[E]; } float& f() { return m_position[F]; } float f() const { return m_position[F]; } + Point xy_scaled() const { return Point::new_scale(this->x(), this->y()); } + // Returns 0 for gcfNoExtrusion. char extrusion_axis() const { return m_extrusion_axis; } @@ -162,6 +180,7 @@ class GCodeReader { ; // silence -Wempty-body return c; } + static const char* axis_pos(const char *raw_str, char axis); GCodeConfig m_config; char m_extrusion_axis; diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index 233976b1955..9c330c38e9f 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -15,6 +15,12 @@ namespace Slic3r { +// static +bool GCodeWriter::supports_separate_travel_acceleration(GCodeFlavor flavor) +{ + return (flavor == gcfRepetier || flavor == gcfMarlinFirmware || flavor == gcfRepRapFirmware); +} + void GCodeWriter::apply_print_config(const PrintConfig &print_config) { this->config.apply(print_config, true); @@ -23,8 +29,10 @@ void GCodeWriter::apply_print_config(const PrintConfig &print_config) bool use_mach_limits = print_config.gcode_flavor.value == gcfMarlinLegacy || print_config.gcode_flavor.value == gcfMarlinFirmware || print_config.gcode_flavor.value == gcfRepRapFirmware; - m_max_acceleration = std::lrint((use_mach_limits && print_config.machine_limits_usage.value == MachineLimitsUsage::EmitToGCode) ? - print_config.machine_max_acceleration_extruding.values.front() : 0); + m_max_acceleration = static_cast(std::round((use_mach_limits && print_config.machine_limits_usage.value == MachineLimitsUsage::EmitToGCode) ? + print_config.machine_max_acceleration_extruding.values.front() : 0)); + m_max_travel_acceleration = static_cast(std::round((use_mach_limits && print_config.machine_limits_usage.value == MachineLimitsUsage::EmitToGCode && supports_separate_travel_acceleration(print_config.gcode_flavor.value)) ? + print_config.machine_max_acceleration_travel.values.front() : 0)); } void GCodeWriter::set_extruders(std::vector extruder_ids) @@ -53,6 +61,7 @@ std::string GCodeWriter::preamble() FLAVOR_IS(gcfRepRapFirmware) || FLAVOR_IS(gcfMarlinLegacy) || FLAVOR_IS(gcfMarlinFirmware) || + FLAVOR_IS(gcfKlipper) || FLAVOR_IS(gcfTeacup) || FLAVOR_IS(gcfRepetier) || FLAVOR_IS(gcfSmoothie)) @@ -79,7 +88,7 @@ std::string GCodeWriter::postamble() const std::string GCodeWriter::set_temperature(unsigned int temperature, bool wait, int tool) const { if (wait && (FLAVOR_IS(gcfMakerWare) || FLAVOR_IS(gcfSailfish))) - return ""; + return {}; std::string code, comment; if (wait && FLAVOR_IS_NOT(gcfTeacup) && FLAVOR_IS_NOT(gcfRepRapFirmware)) { @@ -154,36 +163,31 @@ std::string GCodeWriter::set_bed_temperature(unsigned int temperature, bool wait return gcode.str(); } -std::string GCodeWriter::set_acceleration(unsigned int acceleration) +std::string GCodeWriter::set_acceleration_internal(Acceleration type, unsigned int acceleration) { // Clamp the acceleration to the allowed maximum. - if (m_max_acceleration > 0 && acceleration > m_max_acceleration) + if (type == Acceleration::Print && m_max_acceleration > 0 && acceleration > m_max_acceleration) acceleration = m_max_acceleration; + if (type == Acceleration::Travel && m_max_travel_acceleration > 0 && acceleration > m_max_travel_acceleration) + acceleration = m_max_travel_acceleration; - if (acceleration == 0 || acceleration == m_last_acceleration) + // Are we setting travel acceleration for a flavour that supports separate travel and print acc? + bool separate_travel = (type == Acceleration::Travel && supports_separate_travel_acceleration(this->config.gcode_flavor)); + + auto& last_value = separate_travel ? m_last_travel_acceleration : m_last_acceleration ; + if (acceleration == 0 || acceleration == last_value) return std::string(); - m_last_acceleration = acceleration; + last_value = acceleration; std::ostringstream gcode; - if (FLAVOR_IS(gcfRepetier)) { - // M201: Set max printing acceleration - gcode << "M201 X" << acceleration << " Y" << acceleration; - if (this->config.gcode_comments) gcode << " ; adjust acceleration"; - gcode << "\n"; - // M202: Set max travel acceleration - gcode << "M202 X" << acceleration << " Y" << acceleration; - } else if (FLAVOR_IS(gcfRepRapFirmware)) { - // M204: Set default acceleration - gcode << "M204 P" << acceleration; - } else if (FLAVOR_IS(gcfMarlinFirmware)) { - // This is new MarlinFirmware with separated print/retraction/travel acceleration. - // Use M204 P, we don't want to override travel acc by M204 S (which is deprecated anyway). - gcode << "M204 P" << acceleration; - } else { - // M204: Set default acceleration + if (FLAVOR_IS(gcfRepetier)) + gcode << (separate_travel ? "M202 X" : "M201 X") << acceleration << " Y" << acceleration; + else if (FLAVOR_IS(gcfRepRapFirmware) || FLAVOR_IS(gcfMarlinFirmware)) + gcode << (separate_travel ? "M204 T" : "M204 P") << acceleration; + else gcode << "M204 S" << acceleration; - } + if (this->config.gcode_comments) gcode << " ; adjust acceleration"; gcode << "\n"; @@ -192,32 +196,18 @@ std::string GCodeWriter::set_acceleration(unsigned int acceleration) std::string GCodeWriter::reset_e(bool force) { - if (FLAVOR_IS(gcfMach3) - || FLAVOR_IS(gcfMakerWare) - || FLAVOR_IS(gcfSailfish)) - return ""; - - if (m_extruder != nullptr) { - if (m_extruder->E() == 0. && ! force) - return ""; - m_extruder->reset_E(); - } - - if (! m_extrusion_axis.empty() && ! this->config.use_relative_e_distances) { - std::ostringstream gcode; - gcode << "G92 " << m_extrusion_axis << "0"; - if (this->config.gcode_comments) gcode << " ; reset extrusion distance"; - gcode << "\n"; - return gcode.str(); - } else { - return ""; - } + return + FLAVOR_IS(gcfMach3) || FLAVOR_IS(gcfMakerWare) || FLAVOR_IS(gcfSailfish) || this->config.use_relative_e_distances || + (m_extruder != nullptr && ! m_extruder->reset_E() && ! force) || + m_extrusion_axis.empty() ? + std::string{} : + std::string("G92 ") + m_extrusion_axis + (this->config.gcode_comments ? "0 ; reset extrusion distance\n" : "0\n"); } std::string GCodeWriter::update_progress(unsigned int num, unsigned int tot, bool allow_100) const { if (FLAVOR_IS_NOT(gcfMakerWare) && FLAVOR_IS_NOT(gcfSailfish)) - return ""; + return {}; unsigned int percent = (unsigned int)floor(100.0 * num / tot + 0.5); if (!allow_100) percent = std::min(percent, (unsigned int)99); @@ -269,8 +259,8 @@ std::string GCodeWriter::set_speed(double F, const std::string &comment, const s std::string GCodeWriter::travel_to_xy(const Vec2d &point, const std::string &comment) { - m_pos(0) = point(0); - m_pos(1) = point(1); + m_pos.x() = point.x(); + m_pos.y() = point.y(); GCodeG1Formatter w; w.emit_xy(point); @@ -290,9 +280,9 @@ std::string GCodeWriter::travel_to_xyz(const Vec3d &point, const std::string &co don't perform the Z move but we only move in the XY plane and adjust the nominal Z by reducing the lift amount that will be used for unlift. */ - if (!this->will_move_z(point(2))) { - double nominal_z = m_pos(2) - m_lifted; - m_lifted -= (point(2) - nominal_z); + if (!this->will_move_z(point.z())) { + double nominal_z = m_pos.z() - m_lifted; + m_lifted -= (point.z() - nominal_z); // In case that retract_lift == layer_height we could end up with almost zero in_m_lifted // and a retract could be skipped (https://github.com/prusa3d/PrusaSlicer/issues/2154 if (std::abs(m_lifted) < EPSILON) @@ -318,11 +308,11 @@ std::string GCodeWriter::travel_to_z(double z, const std::string &comment) we don't perform the move but we only adjust the nominal Z by reducing the lift amount that will be used for unlift. */ if (!this->will_move_z(z)) { - double nominal_z = m_pos(2) - m_lifted; + double nominal_z = m_pos.z() - m_lifted; m_lifted -= (z - nominal_z); if (std::abs(m_lifted) < EPSILON) m_lifted = 0.; - return ""; + return {}; } /* In all the other cases, we perform an actual Z move and cancel @@ -333,7 +323,7 @@ std::string GCodeWriter::travel_to_z(double z, const std::string &comment) std::string GCodeWriter::_travel_to_z(double z, const std::string &comment) { - m_pos(2) = z; + m_pos.z() = z; double speed = this->config.travel_speed_z.value; if (speed == 0.) @@ -351,8 +341,8 @@ bool GCodeWriter::will_move_z(double z) const /* If target Z is lower than current Z but higher than nominal Z we don't perform an actual Z move. */ if (m_lifted > 0) { - double nominal_z = m_pos(2) - m_lifted; - if (z >= nominal_z && z <= m_pos(2)) + double nominal_z = m_pos.z() - m_lifted; + if (z >= nominal_z && z <= m_pos.z()) return false; } return true; @@ -360,17 +350,17 @@ bool GCodeWriter::will_move_z(double z) const std::string GCodeWriter::extrude_to_xy(const Vec2d &point, double dE, const std::string &comment) { - m_pos(0) = point(0); - m_pos(1) = point(1); - m_extruder->extrude(dE); + m_pos.x() = point.x(); + m_pos.y() = point.y(); GCodeG1Formatter w; w.emit_xy(point); - w.emit_e(m_extrusion_axis, m_extruder->E()); + w.emit_e(m_extrusion_axis, m_extruder->extrude(dE).second); w.emit_comment(this->config.gcode_comments, comment); return w.string(); } +#if 0 std::string GCodeWriter::extrude_to_xyz(const Vec3d &point, double dE, const std::string &comment) { m_pos = point; @@ -383,6 +373,7 @@ std::string GCodeWriter::extrude_to_xyz(const Vec3d &point, double dE, const std w.emit_comment(this->config.gcode_comments, comment); return w.string(); } +#endif std::string GCodeWriter::retract(bool before_wipe) { @@ -422,14 +413,13 @@ std::string GCodeWriter::_retract(double length, double restart_extra, const std restart_extra = restart_extra * area; } - std::string gcode; - if (double dE = m_extruder->retract(length, restart_extra); dE != 0) { + if (auto [dE, emitE] = m_extruder->retract(length, restart_extra); dE != 0) { if (this->config.use_firmware_retraction) { gcode = FLAVOR_IS(gcfMachinekit) ? "G22 ; retract\n" : "G10 ; retract\n"; } else if (! m_extrusion_axis.empty()) { GCodeG1Formatter w; - w.emit_e(m_extrusion_axis, m_extruder->E()); + w.emit_e(m_extrusion_axis, emitE); w.emit_f(m_extruder->retract_speed() * 60.); w.emit_comment(this->config.gcode_comments, comment); gcode = w.string(); @@ -449,14 +439,14 @@ std::string GCodeWriter::unretract() if (FLAVOR_IS(gcfMakerWare)) gcode = "M101 ; extruder on\n"; - if (double dE = m_extruder->unretract(); dE != 0) { + if (auto [dE, emitE] = m_extruder->unretract(); dE != 0) { if (this->config.use_firmware_retraction) { gcode += FLAVOR_IS(gcfMachinekit) ? "G23 ; unretract\n" : "G11 ; unretract\n"; gcode += this->reset_e(); } else if (! m_extrusion_axis.empty()) { // use G1 instead of G0 because G0 will blend the restart with the previous travel move GCodeG1Formatter w; - w.emit_e(m_extrusion_axis, m_extruder->E()); + w.emit_e(m_extrusion_axis, emitE); w.emit_f(m_extruder->deretract_speed() * 60.); w.emit_comment(this->config.gcode_comments, " ; unretract"); gcode += w.string(); @@ -476,26 +466,40 @@ std::string GCodeWriter::lift() { double above = this->config.retract_lift_above.get_at(m_extruder->id()); double below = this->config.retract_lift_below.get_at(m_extruder->id()); - if (m_pos(2) >= above && (below == 0 || m_pos(2) <= below)) + if (m_pos.z() >= above && (below == 0 || m_pos.z() <= below)) target_lift = this->config.retract_lift.get_at(m_extruder->id()); } if (m_lifted == 0 && target_lift > 0) { m_lifted = target_lift; - return this->_travel_to_z(m_pos(2) + target_lift, "lift Z"); + return this->_travel_to_z(m_pos.z() + target_lift, "lift Z"); } - return ""; + return {}; } std::string GCodeWriter::unlift() { std::string gcode; if (m_lifted > 0) { - gcode += this->_travel_to_z(m_pos(2) - m_lifted, "restore layer Z"); + gcode += this->_travel_to_z(m_pos.z() - m_lifted, "restore layer Z"); m_lifted = 0; } return gcode; } +void GCodeWriter::update_position(const Vec3d &new_pos) +{ + assert(this->m_lifted >= 0); + const double nominal_z = m_pos.z() - m_lifted; + m_lifted = new_pos.z() - nominal_z; + if (m_lifted < - EPSILON) + throw Slic3r::RuntimeError("Custom G-code reports negative Z-hop. Final Z position is below the print_z height."); + // In case that retract_lift == layer_height we could end up with almost zero in_m_lifted + // and a retract could be skipped (https://github.com/prusa3d/PrusaSlicer/issues/2154 + if (m_lifted < EPSILON) + m_lifted = 0.; + m_pos = new_pos; +} + std::string GCodeWriter::set_fan(const GCodeFlavor gcode_flavor, bool gcode_comments, unsigned int speed) { std::ostringstream gcode; diff --git a/src/libslic3r/GCodeWriter.hpp b/src/libslic3r/GCodeWriter.hpp index e8a54737e07..0d376cb1592 100644 --- a/src/libslic3r/GCodeWriter.hpp +++ b/src/libslic3r/GCodeWriter.hpp @@ -43,7 +43,8 @@ class GCodeWriter { std::string postamble() const; std::string set_temperature(unsigned int temperature, bool wait = false, int tool = -1) const; std::string set_bed_temperature(unsigned int temperature, bool wait = false); - std::string set_acceleration(unsigned int acceleration); + std::string set_print_acceleration(unsigned int acceleration) { return set_acceleration_internal(Acceleration::Print, acceleration); } + std::string set_travel_acceleration(unsigned int acceleration) { return set_acceleration_internal(Acceleration::Travel, acceleration); } std::string reset_e(bool force = false); std::string update_progress(unsigned int num, unsigned int tot, bool allow_100 = false) const; // return false if this extruder was already selected @@ -61,13 +62,27 @@ class GCodeWriter { std::string travel_to_z(double z, const std::string &comment = std::string()); bool will_move_z(double z) const; std::string extrude_to_xy(const Vec2d &point, double dE, const std::string &comment = std::string()); - std::string extrude_to_xyz(const Vec3d &point, double dE, const std::string &comment = std::string()); +// std::string extrude_to_xyz(const Vec3d &point, double dE, const std::string &comment = std::string()); std::string retract(bool before_wipe = false); std::string retract_for_toolchange(bool before_wipe = false); std::string unretract(); std::string lift(); std::string unlift(); + + // Current position of the printer, in G-code coordinates. + // Z coordinate of current position contains zhop. If zhop is applied (this->zhop() > 0), + // then the print_z = this->get_position().z() - this->zhop(). Vec3d get_position() const { return m_pos; } + // Current Z hop value. + double get_zhop() const { return m_lifted; } + // Update position of the print head based on the final position returned by a custom G-code block. + // The new position Z coordinate contains the Z-hop. + // GCodeWriter expects the custom script to NOT change print_z, only Z-hop, thus the print_z is maintained + // by this function while the current Z-hop accumulator is updated. + void update_position(const Vec3d &new_pos); + + // Returns whether this flavor supports separate print and travel acceleration. + static bool supports_separate_travel_acceleration(GCodeFlavor flavor); // To be called by the CoolingBuffer from another thread. static std::string set_fan(const GCodeFlavor gcode_flavor, bool gcode_comments, unsigned int speed); @@ -81,17 +96,26 @@ class GCodeWriter { std::string m_extrusion_axis; bool m_single_extruder_multi_material; Extruder* m_extruder; - unsigned int m_last_acceleration; + unsigned int m_last_acceleration = (unsigned int)(-1); + unsigned int m_last_travel_acceleration = (unsigned int)(-1); // only used for flavors supporting separate print/travel acc // Limit for setting the acceleration, to respect the machine limits set for the Marlin firmware. // If set to zero, the limit is not in action. unsigned int m_max_acceleration; + unsigned int m_max_travel_acceleration; + unsigned int m_last_bed_temperature; bool m_last_bed_temperature_reached; double m_lifted; Vec3d m_pos = Vec3d::Zero(); + enum class Acceleration { + Travel, + Print + }; + std::string _travel_to_z(double z, const std::string &comment); std::string _retract(double length, double restart_extra, const std::string &comment); + std::string set_acceleration_internal(Acceleration type, unsigned int acceleration); }; class GCodeFormatter { @@ -121,6 +145,14 @@ class GCodeFormatter { // static constexpr const int E_EXPORT_DIGITS = 9; #endif + static constexpr const std::array pow_10 { 1., 10., 100., 1000., 10000., 100000., 1000000., 10000000., 100000000., 1000000000.}; + static constexpr const std::array pow_10_inv{1./1., 1./10., 1./100., 1./1000., 1./10000., 1./100000., 1./1000000., 1./10000000., 1./100000000., 1./1000000000.}; + + // Quantize doubles to a resolution of the G-code. + static double quantize(double v, size_t ndigits) { return std::round(v * pow_10[ndigits]) * pow_10_inv[ndigits]; } + static double quantize_xyzf(double v) { return quantize(v, XYZF_EXPORT_DIGITS); } + static double quantize_e(double v) { return quantize(v, E_EXPORT_DIGITS); } + void emit_axis(const char axis, const double v, size_t digits); void emit_xy(const Vec2d &point) { diff --git a/src/libslic3r/Geometry.cpp b/src/libslic3r/Geometry.cpp index ecb29d4b812..5542d73eeed 100644 --- a/src/libslic3r/Geometry.cpp +++ b/src/libslic3r/Geometry.cpp @@ -50,13 +50,6 @@ bool contains(const std::vector &vector, const Point &point) } template bool contains(const ExPolygons &vector, const Point &point); -double rad2deg_dir(double angle) -{ - angle = (angle < PI) ? (-angle + PI/2.0) : (angle + PI/2.0); - if (angle < 0) angle += PI; - return rad2deg(angle); -} - void simplify_polygons(const Polygons &polygons, double tolerance, Polygons* retval) { Polygons pp; @@ -320,50 +313,78 @@ Transform3d assemble_transform(const Vec3d& translation, const Vec3d& rotation, return transform; } -Vec3d extract_euler_angles(const Eigen::Matrix& rotation_matrix) +void assemble_transform(Transform3d& transform, const Transform3d& translation, const Transform3d& rotation, const Transform3d& scale, const Transform3d& mirror) { - // reference: http://www.gregslabaugh.net/publications/euler.pdf - Vec3d angles1 = Vec3d::Zero(); - Vec3d angles2 = Vec3d::Zero(); - if (std::abs(std::abs(rotation_matrix(2, 0)) - 1.0) < 1e-5) - { - angles1(2) = 0.0; - if (rotation_matrix(2, 0) < 0.0) // == -1.0 - { - angles1(1) = 0.5 * (double)PI; - angles1(0) = angles1(2) + ::atan2(rotation_matrix(0, 1), rotation_matrix(0, 2)); - } - else // == 1.0 - { - angles1(1) = - 0.5 * (double)PI; - angles1(0) = - angles1(2) + ::atan2(- rotation_matrix(0, 1), - rotation_matrix(0, 2)); - } - angles2 = angles1; - } - else - { - angles1(1) = -::asin(rotation_matrix(2, 0)); - double inv_cos1 = 1.0 / ::cos(angles1(1)); - angles1(0) = ::atan2(rotation_matrix(2, 1) * inv_cos1, rotation_matrix(2, 2) * inv_cos1); - angles1(2) = ::atan2(rotation_matrix(1, 0) * inv_cos1, rotation_matrix(0, 0) * inv_cos1); - - angles2(1) = (double)PI - angles1(1); - double inv_cos2 = 1.0 / ::cos(angles2(1)); - angles2(0) = ::atan2(rotation_matrix(2, 1) * inv_cos2, rotation_matrix(2, 2) * inv_cos2); - angles2(2) = ::atan2(rotation_matrix(1, 0) * inv_cos2, rotation_matrix(0, 0) * inv_cos2); - } + transform = translation * rotation * scale * mirror; +} + +Transform3d assemble_transform(const Transform3d& translation, const Transform3d& rotation, const Transform3d& scale, const Transform3d& mirror) +{ + Transform3d transform; + assemble_transform(transform, translation, rotation, scale, mirror); + return transform; +} + +void translation_transform(Transform3d& transform, const Vec3d& translation) +{ + transform = Transform3d::Identity(); + transform.translate(translation); +} + +Transform3d translation_transform(const Vec3d& translation) +{ + Transform3d transform; + translation_transform(transform, translation); + return transform; +} + +void rotation_transform(Transform3d& transform, const Vec3d& rotation) +{ + transform = Transform3d::Identity(); + transform.rotate(Eigen::AngleAxisd(rotation.z(), Vec3d::UnitZ()) * Eigen::AngleAxisd(rotation.y(), Vec3d::UnitY()) * Eigen::AngleAxisd(rotation.x(), Vec3d::UnitX())); +} - // The following euristic is the best found up to now (in the sense that it works fine with the greatest number of edge use-cases) - // but there are other use-cases were it does not - // We need to improve it - double min_1 = angles1.cwiseAbs().minCoeff(); - double min_2 = angles2.cwiseAbs().minCoeff(); - bool use_1 = (min_1 < min_2) || (is_approx(min_1, min_2) && (angles1.norm() <= angles2.norm())); +Transform3d rotation_transform(const Vec3d& rotation) +{ + Transform3d transform; + rotation_transform(transform, rotation); + return transform; +} - return use_1 ? angles1 : angles2; +void scale_transform(Transform3d& transform, double scale) +{ + return scale_transform(transform, scale * Vec3d::Ones()); } -Vec3d extract_euler_angles(const Transform3d& transform) +void scale_transform(Transform3d& transform, const Vec3d& scale) +{ + transform = Transform3d::Identity(); + transform.scale(scale); +} + +Transform3d scale_transform(double scale) +{ + return scale_transform(scale * Vec3d::Ones()); +} + +Transform3d scale_transform(const Vec3d& scale) +{ + Transform3d transform; + scale_transform(transform, scale); + return transform; +} + +Vec3d extract_rotation(const Eigen::Matrix& rotation_matrix) +{ + // The extracted "rotation" is a triplet of numbers such that Geometry::rotation_transform + // returns the original transform. Because of the chosen order of rotations, the triplet + // is not equivalent to Euler angles in the usual sense. + Vec3d angles = rotation_matrix.eulerAngles(2,1,0); + std::swap(angles(0), angles(2)); + return angles; +} + +Vec3d extract_rotation(const Transform3d& transform) { // use only the non-translational part of the transform Eigen::Matrix m = transform.matrix().block(0, 0, 3, 3); @@ -371,97 +392,170 @@ Vec3d extract_euler_angles(const Transform3d& transform) m.col(0).normalize(); m.col(1).normalize(); m.col(2).normalize(); - return extract_euler_angles(m); + return extract_rotation(m); } -Transformation::Flags::Flags() - : dont_translate(true) - , dont_rotate(true) - , dont_scale(true) - , dont_mirror(true) +Transform3d Transformation::get_offset_matrix() const { + return translation_transform(get_offset()); } -bool Transformation::Flags::needs_update(bool dont_translate, bool dont_rotate, bool dont_scale, bool dont_mirror) const +static Transform3d extract_rotation_matrix(const Transform3d& trafo) { - return (this->dont_translate != dont_translate) || (this->dont_rotate != dont_rotate) || (this->dont_scale != dont_scale) || (this->dont_mirror != dont_mirror); + Matrix3d rotation; + Matrix3d scale; + trafo.computeRotationScaling(&rotation, &scale); + return Transform3d(rotation); } -void Transformation::Flags::set(bool dont_translate, bool dont_rotate, bool dont_scale, bool dont_mirror) +static Transform3d extract_scale(const Transform3d& trafo) { - this->dont_translate = dont_translate; - this->dont_rotate = dont_rotate; - this->dont_scale = dont_scale; - this->dont_mirror = dont_mirror; + Matrix3d rotation; + Matrix3d scale; + trafo.computeRotationScaling(&rotation, &scale); + return Transform3d(scale); } -Transformation::Transformation() +static std::pair extract_rotation_scale(const Transform3d& trafo) { - reset(); + Matrix3d rotation; + Matrix3d scale; + trafo.computeRotationScaling(&rotation, &scale); + return { Transform3d(rotation), Transform3d(scale) }; } -Transformation::Transformation(const Transform3d& transform) +static bool contains_skew(const Transform3d& trafo) { - set_from_transform(transform); + Matrix3d rotation; + Matrix3d scale; + trafo.computeRotationScaling(&rotation, &scale); + + if (scale.isDiagonal()) + return false; + + if (scale.determinant() >= 0.0) + return true; + + // the matrix contains mirror + const Matrix3d ratio = scale.cwiseQuotient(trafo.matrix().block<3,3>(0,0)); + + auto check_skew = [&ratio](int i, int j, bool& skew) { + if (!std::isnan(ratio(i, j)) && !std::isnan(ratio(j, i))) + skew |= std::abs(ratio(i, j) * ratio(j, i) - 1.0) > EPSILON; + }; + + bool has_skew = false; + check_skew(0, 1, has_skew); + check_skew(0, 2, has_skew); + check_skew(1, 2, has_skew); + return has_skew; } -void Transformation::set_offset(const Vec3d& offset) +Vec3d Transformation::get_rotation() const { - set_offset(X, offset(0)); - set_offset(Y, offset(1)); - set_offset(Z, offset(2)); + return extract_rotation(extract_rotation_matrix(m_matrix)); } -void Transformation::set_offset(Axis axis, double offset) +Transform3d Transformation::get_rotation_matrix() const { - if (m_offset(axis) != offset) - { - m_offset(axis) = offset; - m_dirty = true; - } + return extract_rotation_matrix(m_matrix); } void Transformation::set_rotation(const Vec3d& rotation) { - set_rotation(X, rotation(0)); - set_rotation(Y, rotation(1)); - set_rotation(Z, rotation(2)); + const Vec3d offset = get_offset(); + m_matrix = rotation_transform(rotation) * extract_scale(m_matrix); + m_matrix.translation() = offset; } void Transformation::set_rotation(Axis axis, double rotation) { rotation = angle_to_0_2PI(rotation); - if (is_approx(std::abs(rotation), 2.0 * (double)PI)) + if (is_approx(std::abs(rotation), 2.0 * double(PI))) rotation = 0.0; - if (m_rotation(axis) != rotation) - { - m_rotation(axis) = rotation; - m_dirty = true; - } + auto [curr_rotation, scale] = extract_rotation_scale(m_matrix); + Vec3d angles = extract_rotation(curr_rotation); + angles[axis] = rotation; + + const Vec3d offset = get_offset(); + m_matrix = rotation_transform(angles) * scale; + m_matrix.translation() = offset; +} + +Vec3d Transformation::get_scaling_factor() const +{ + const Transform3d scale = extract_scale(m_matrix); + return { std::abs(scale(0, 0)), std::abs(scale(1, 1)), std::abs(scale(2, 2)) }; +} + +Transform3d Transformation::get_scaling_factor_matrix() const +{ + Transform3d scale = extract_scale(m_matrix); + scale(0, 0) = std::abs(scale(0, 0)); + scale(1, 1) = std::abs(scale(1, 1)); + scale(2, 2) = std::abs(scale(2, 2)); + return scale; } void Transformation::set_scaling_factor(const Vec3d& scaling_factor) { - set_scaling_factor(X, scaling_factor(0)); - set_scaling_factor(Y, scaling_factor(1)); - set_scaling_factor(Z, scaling_factor(2)); + assert(scaling_factor.x() > 0.0 && scaling_factor.y() > 0.0 && scaling_factor.z() > 0.0); + + const Vec3d offset = get_offset(); + m_matrix = extract_rotation_matrix(m_matrix) * scale_transform(scaling_factor); + m_matrix.translation() = offset; } void Transformation::set_scaling_factor(Axis axis, double scaling_factor) { - if (m_scaling_factor(axis) != std::abs(scaling_factor)) - { - m_scaling_factor(axis) = std::abs(scaling_factor); - m_dirty = true; - } + assert(scaling_factor > 0.0); + + auto [rotation, scale] = extract_rotation_scale(m_matrix); + scale(axis, axis) = scaling_factor; + + const Vec3d offset = get_offset(); + m_matrix = rotation * scale; + m_matrix.translation() = offset; +} + +Vec3d Transformation::get_mirror() const +{ + const Transform3d scale = extract_scale(m_matrix); + return { scale(0, 0) / std::abs(scale(0, 0)), scale(1, 1) / std::abs(scale(1, 1)), scale(2, 2) / std::abs(scale(2, 2)) }; +} + +Transform3d Transformation::get_mirror_matrix() const +{ + Transform3d scale = extract_scale(m_matrix); + scale(0, 0) = scale(0, 0) / std::abs(scale(0, 0)); + scale(1, 1) = scale(1, 1) / std::abs(scale(1, 1)); + scale(2, 2) = scale(2, 2) / std::abs(scale(2, 2)); + return scale; } void Transformation::set_mirror(const Vec3d& mirror) { - set_mirror(X, mirror(0)); - set_mirror(Y, mirror(1)); - set_mirror(Z, mirror(2)); + Vec3d copy(mirror); + const Vec3d abs_mirror = copy.cwiseAbs(); + for (int i = 0; i < 3; ++i) { + if (abs_mirror(i) == 0.0) + copy(i) = 1.0; + else if (abs_mirror(i) != 1.0) + copy(i) /= abs_mirror(i); + } + + auto [rotation, scale] = extract_rotation_scale(m_matrix); + const Vec3d curr_scales = { scale(0, 0), scale(1, 1), scale(2, 2) }; + const Vec3d signs = curr_scales.cwiseProduct(copy); + + if (signs[0] < 0.0) scale(0, 0) = -scale(0, 0); + if (signs[1] < 0.0) scale(1, 1) = -scale(1, 1); + if (signs[2] < 0.0) scale(2, 2) = -scale(2, 2); + + const Vec3d offset = get_offset(); + m_matrix = rotation * scale; + m_matrix.translation() = offset; } void Transformation::set_mirror(Axis axis, double mirror) @@ -472,78 +566,61 @@ void Transformation::set_mirror(Axis axis, double mirror) else if (abs_mirror != 1.0) mirror /= abs_mirror; - if (m_mirror(axis) != mirror) - { - m_mirror(axis) = mirror; - m_dirty = true; - } -} + auto [rotation, scale] = extract_rotation_scale(m_matrix); + const double curr_scale = scale(axis, axis); + const double sign = curr_scale * mirror; -void Transformation::set_from_transform(const Transform3d& transform) -{ - // offset - set_offset(transform.matrix().block(0, 3, 3, 1)); + if (sign < 0.0) scale(axis, axis) = -scale(axis, axis); - Eigen::Matrix m3x3 = transform.matrix().block(0, 0, 3, 3); + const Vec3d offset = get_offset(); + m_matrix = rotation * scale; + m_matrix.translation() = offset; +} - // mirror - // it is impossible to reconstruct the original mirroring factors from a matrix, - // we can only detect if the matrix contains a left handed reference system - // in which case we reorient it back to right handed by mirroring the x axis - Vec3d mirror = Vec3d::Ones(); - if (m3x3.col(0).dot(m3x3.col(1).cross(m3x3.col(2))) < 0.0) - { - mirror(0) = -1.0; - // remove mirror - m3x3.col(0) *= -1.0; - } - set_mirror(mirror); +bool Transformation::has_skew() const +{ + return contains_skew(m_matrix); +} - // scale - set_scaling_factor(Vec3d(m3x3.col(0).norm(), m3x3.col(1).norm(), m3x3.col(2).norm())); +void Transformation::reset() +{ + m_matrix = Transform3d::Identity(); +} - // remove scale - m3x3.col(0).normalize(); - m3x3.col(1).normalize(); - m3x3.col(2).normalize(); +void Transformation::reset_rotation() +{ + const Geometry::TransformationSVD svd(*this); + m_matrix = get_offset_matrix() * Transform3d(svd.v * svd.s * svd.v.transpose()) * svd.mirror_matrix(); +} - // rotation - set_rotation(extract_euler_angles(m3x3)); +void Transformation::reset_scaling_factor() +{ + const Geometry::TransformationSVD svd(*this); + m_matrix = get_offset_matrix() * Transform3d(svd.u) * Transform3d(svd.v.transpose()) * svd.mirror_matrix(); +} - // forces matrix recalculation matrix - m_matrix = get_matrix(); +void Transformation::reset_skew() +{ + auto new_scale_factor = [](const Matrix3d& s) { + return pow(s(0, 0) * s(1, 1) * s(2, 2), 1. / 3.); // scale average + }; -// // debug check -// if (!m_matrix.isApprox(transform)) -// std::cout << "something went wrong in extracting data from matrix" << std::endl; + const Geometry::TransformationSVD svd(*this); + m_matrix = get_offset_matrix() * Transform3d(svd.u) * scale_transform(new_scale_factor(svd.s)) * Transform3d(svd.v.transpose()) * svd.mirror_matrix(); } -void Transformation::reset() +Transform3d Transformation::get_matrix_no_offset() const { - m_offset = Vec3d::Zero(); - m_rotation = Vec3d::Zero(); - m_scaling_factor = Vec3d::Ones(); - m_mirror = Vec3d::Ones(); - m_matrix = Transform3d::Identity(); - m_dirty = false; + Transformation copy(*this); + copy.reset_offset(); + return copy.get_matrix(); } -const Transform3d& Transformation::get_matrix(bool dont_translate, bool dont_rotate, bool dont_scale, bool dont_mirror) const +Transform3d Transformation::get_matrix_no_scaling_factor() const { - if (m_dirty || m_flags.needs_update(dont_translate, dont_rotate, dont_scale, dont_mirror)) - { - m_matrix = Geometry::assemble_transform( - dont_translate ? Vec3d::Zero() : m_offset, - dont_rotate ? Vec3d::Zero() : m_rotation, - dont_scale ? Vec3d::Ones() : m_scaling_factor, - dont_mirror ? Vec3d::Ones() : m_mirror - ); - - m_flags.set(dont_translate, dont_rotate, dont_scale, dont_mirror); - m_dirty = false; - } - - return m_matrix; + Transformation copy(*this); + copy.reset_scaling_factor(); + return copy.get_matrix(); } Transformation Transformation::operator * (const Transformation& other) const @@ -551,61 +628,51 @@ Transformation Transformation::operator * (const Transformation& other) const return Transformation(get_matrix() * other.get_matrix()); } -Transformation Transformation::volume_to_bed_transformation(const Transformation& instance_transformation, const BoundingBoxf3& bbox) +TransformationSVD::TransformationSVD(const Transform3d& trafo) { - Transformation out; + const auto &m0 = trafo.matrix().block<3, 3>(0, 0); + mirror = m0.determinant() < 0.0; - if (instance_transformation.is_scaling_uniform()) { - // No need to run the non-linear least squares fitting for uniform scaling. - // Just set the inverse. - out.set_from_transform(instance_transformation.get_matrix(true).inverse()); - } - else if (is_rotation_ninety_degrees(instance_transformation.get_rotation())) - { - // Anisotropic scaling, rotation by multiples of ninety degrees. - Eigen::Matrix3d instance_rotation_trafo = - (Eigen::AngleAxisd(instance_transformation.get_rotation().z(), Vec3d::UnitZ()) * - Eigen::AngleAxisd(instance_transformation.get_rotation().y(), Vec3d::UnitY()) * - Eigen::AngleAxisd(instance_transformation.get_rotation().x(), Vec3d::UnitX())).toRotationMatrix(); - Eigen::Matrix3d volume_rotation_trafo = - (Eigen::AngleAxisd(-instance_transformation.get_rotation().x(), Vec3d::UnitX()) * - Eigen::AngleAxisd(-instance_transformation.get_rotation().y(), Vec3d::UnitY()) * - Eigen::AngleAxisd(-instance_transformation.get_rotation().z(), Vec3d::UnitZ())).toRotationMatrix(); - - // 8 corners of the bounding box. - auto pts = Eigen::MatrixXd(8, 3); - pts(0, 0) = bbox.min.x(); pts(0, 1) = bbox.min.y(); pts(0, 2) = bbox.min.z(); - pts(1, 0) = bbox.min.x(); pts(1, 1) = bbox.min.y(); pts(1, 2) = bbox.max.z(); - pts(2, 0) = bbox.min.x(); pts(2, 1) = bbox.max.y(); pts(2, 2) = bbox.min.z(); - pts(3, 0) = bbox.min.x(); pts(3, 1) = bbox.max.y(); pts(3, 2) = bbox.max.z(); - pts(4, 0) = bbox.max.x(); pts(4, 1) = bbox.min.y(); pts(4, 2) = bbox.min.z(); - pts(5, 0) = bbox.max.x(); pts(5, 1) = bbox.min.y(); pts(5, 2) = bbox.max.z(); - pts(6, 0) = bbox.max.x(); pts(6, 1) = bbox.max.y(); pts(6, 2) = bbox.min.z(); - pts(7, 0) = bbox.max.x(); pts(7, 1) = bbox.max.y(); pts(7, 2) = bbox.max.z(); - - // Corners of the bounding box transformed into the modifier mesh coordinate space, with inverse rotation applied to the modifier. - auto qs = pts * - (instance_rotation_trafo * - Eigen::Scaling(instance_transformation.get_scaling_factor().cwiseProduct(instance_transformation.get_mirror())) * - volume_rotation_trafo).inverse().transpose(); - // Fill in scaling based on least squares fitting of the bounding box corners. - Vec3d scale; - for (int i = 0; i < 3; ++i) - scale(i) = pts.col(i).dot(qs.col(i)) / pts.col(i).dot(pts.col(i)); - - out.set_rotation(Geometry::extract_euler_angles(volume_rotation_trafo)); - out.set_scaling_factor(Vec3d(std::abs(scale(0)), std::abs(scale(1)), std::abs(scale(2)))); - out.set_mirror(Vec3d(scale(0) > 0 ? 1. : -1, scale(1) > 0 ? 1. : -1, scale(2) > 0 ? 1. : -1)); - } + Matrix3d m; + if (mirror) + m = m0 * Eigen::DiagonalMatrix(-1.0, 1.0, 1.0); else - { - // General anisotropic scaling, general rotation. - // Keep the modifier mesh in the instance coordinate system, so the modifier mesh will not be aligned with the world. - // Scale it to get the required size. - out.set_scaling_factor(instance_transformation.get_scaling_factor().cwiseInverse()); - } + m = m0; + const Eigen::JacobiSVD svd(m, Eigen::ComputeFullU | Eigen::ComputeFullV); + u = svd.matrixU(); + v = svd.matrixV(); + s = svd.singularValues().asDiagonal(); + + scale = !s.isApprox(Matrix3d::Identity()); + anisotropic_scale = ! is_approx(s(0, 0), s(1, 1)) || ! is_approx(s(1, 1), s(2, 2)); + rotation = !v.isApprox(u); + + if (anisotropic_scale) { + rotation_90_degrees = true; + for (int i = 0; i < 3; ++i) { + const Vec3d row = v.row(i).cwiseAbs(); + const size_t num_zeros = is_approx(row[0], 0.) + is_approx(row[1], 0.) + is_approx(row[2], 0.); + const size_t num_ones = is_approx(row[0], 1.) + is_approx(row[1], 1.) + is_approx(row[2], 1.); + if (num_zeros != 2 || num_ones != 1) { + rotation_90_degrees = false; + break; + } + } + // Detect skew by brute force: check if the axes are still orthogonal after transformation + const Matrix3d trafo_linear = trafo.linear(); + const std::array axes = { Vec3d::UnitX(), Vec3d::UnitY(), Vec3d::UnitZ() }; + std::array transformed_axes; + for (int i = 0; i < 3; ++i) { + transformed_axes[i] = trafo_linear * axes[i]; + } + skew = std::abs(transformed_axes[0].dot(transformed_axes[1])) > EPSILON || + std::abs(transformed_axes[1].dot(transformed_axes[2])) > EPSILON || + std::abs(transformed_axes[2].dot(transformed_axes[0])) > EPSILON; - return out; + // This following old code does not work under all conditions. The v matrix can become non diagonal (see SPE-1492) +// skew = ! rotation_90_degrees; + } else + skew = false; } // For parsing a transformation matrix from 3MF / AMF. @@ -614,19 +681,15 @@ Transform3d transform3d_from_string(const std::string& transform_str) assert(is_decimal_separator_point()); // for atof Transform3d transform = Transform3d::Identity(); - if (!transform_str.empty()) - { + if (!transform_str.empty()) { std::vector mat_elements_str; boost::split(mat_elements_str, transform_str, boost::is_any_of(" "), boost::token_compress_on); - unsigned int size = (unsigned int)mat_elements_str.size(); - if (size == 16) - { + const unsigned int size = (unsigned int)mat_elements_str.size(); + if (size == 16) { unsigned int i = 0; - for (unsigned int r = 0; r < 4; ++r) - { - for (unsigned int c = 0; c < 4; ++c) - { + for (unsigned int r = 0; r < 4; ++r) { + for (unsigned int c = 0; c < 4; ++c) { transform(r, c) = ::atof(mat_elements_str[i++].c_str()); } } @@ -640,24 +703,47 @@ Eigen::Quaterniond rotation_xyz_diff(const Vec3d &rot_xyz_from, const Vec3d &rot { return // From the current coordinate system to world. - Eigen::AngleAxisd(rot_xyz_to(2), Vec3d::UnitZ()) * Eigen::AngleAxisd(rot_xyz_to(1), Vec3d::UnitY()) * Eigen::AngleAxisd(rot_xyz_to(0), Vec3d::UnitX()) * + Eigen::AngleAxisd(rot_xyz_to.z(), Vec3d::UnitZ()) * Eigen::AngleAxisd(rot_xyz_to.y(), Vec3d::UnitY()) * Eigen::AngleAxisd(rot_xyz_to.x(), Vec3d::UnitX()) * // From world to the initial coordinate system. - Eigen::AngleAxisd(-rot_xyz_from(0), Vec3d::UnitX()) * Eigen::AngleAxisd(-rot_xyz_from(1), Vec3d::UnitY()) * Eigen::AngleAxisd(-rot_xyz_from(2), Vec3d::UnitZ()); + Eigen::AngleAxisd(-rot_xyz_from.x(), Vec3d::UnitX()) * Eigen::AngleAxisd(-rot_xyz_from.y(), Vec3d::UnitY()) * Eigen::AngleAxisd(-rot_xyz_from.z(), Vec3d::UnitZ()); } // This should only be called if it is known, that the two rotations only differ in rotation around the Z axis. -double rotation_diff_z(const Vec3d &rot_xyz_from, const Vec3d &rot_xyz_to) -{ - Eigen::AngleAxisd angle_axis(rotation_xyz_diff(rot_xyz_from, rot_xyz_to)); - Vec3d axis = angle_axis.axis(); - double angle = angle_axis.angle(); -#ifndef NDEBUG - if (std::abs(angle) > 1e-8) { - assert(std::abs(axis.x()) < 1e-8); - assert(std::abs(axis.y()) < 1e-8); - } -#endif /* NDEBUG */ - return (axis.z() < 0) ? -angle : angle; +double rotation_diff_z(const Transform3d &trafo_from, const Transform3d &trafo_to) +{ + auto m = trafo_to.linear() * trafo_from.linear().inverse(); + assert(std::abs(m.determinant() - 1) < EPSILON); + Vec3d vx = m * Vec3d(1., 0., 0); + // Verify that the linear part of rotation from trafo_from to trafo_to rotates around Z and is unity. + assert(std::abs(std::hypot(vx.x(), vx.y()) - 1.) < 1e-5); + assert(std::abs(vx.z()) < 1e-5); + return atan2(vx.y(), vx.x()); +} + +bool trafos_differ_in_rotation_by_z_and_mirroring_by_xy_only(const Transform3d &t1, const Transform3d &t2) +{ + if (std::abs(t1.translation().z() - t2.translation().z()) > EPSILON) + // One of the object is higher than the other above the build plate (or below the build plate). + return false; + Matrix3d m1 = t1.matrix().block<3, 3>(0, 0); + Matrix3d m2 = t2.matrix().block<3, 3>(0, 0); + Matrix3d m = m2.inverse() * m1; + Vec3d z = m.block<3, 1>(0, 2); + if (std::abs(z.x()) > EPSILON || std::abs(z.y()) > EPSILON || std::abs(z.z() - 1.) > EPSILON) + // Z direction or length changed. + return false; + // Z still points in the same direction and it has the same length. + Vec3d x = m.block<3, 1>(0, 0); + Vec3d y = m.block<3, 1>(0, 1); + if (std::abs(x.z()) > EPSILON || std::abs(y.z()) > EPSILON) + return false; + double lx2 = x.squaredNorm(); + double ly2 = y.squaredNorm(); + if (lx2 - 1. > EPSILON * EPSILON || ly2 - 1. > EPSILON * EPSILON) + return false; + // Verify whether the vectors x, y are still perpendicular. + double d = x.dot(y); + return std::abs(d * d) < EPSILON * lx2 * ly2; } }} // namespace Slic3r::Geometry diff --git a/src/libslic3r/Geometry.hpp b/src/libslic3r/Geometry.hpp index e84a7aace9f..c410a57f205 100644 --- a/src/libslic3r/Geometry.hpp +++ b/src/libslic3r/Geometry.hpp @@ -36,9 +36,9 @@ enum Orientation static inline Orientation orient(const Point &a, const Point &b, const Point &c) { static_assert(sizeof(coord_t) * 2 == sizeof(int64_t), "orient works with 32 bit coordinates"); - int64_t u = int64_t(b(0)) * int64_t(c(1)) - int64_t(b(1)) * int64_t(c(0)); - int64_t v = int64_t(a(0)) * int64_t(c(1)) - int64_t(a(1)) * int64_t(c(0)); - int64_t w = int64_t(a(0)) * int64_t(b(1)) - int64_t(a(1)) * int64_t(b(0)); + int64_t u = int64_t(b.x()) * int64_t(c.y()) - int64_t(b.y()) * int64_t(c.x()); + int64_t v = int64_t(a.x()) * int64_t(c.y()) - int64_t(a.y()) * int64_t(c.x()); + int64_t w = int64_t(a.x()) * int64_t(b.y()) - int64_t(a.y()) * int64_t(b.x()); int64_t d = u - v + w; return (d > 0) ? ORIENTATION_CCW : ((d == 0) ? ORIENTATION_COLINEAR : ORIENTATION_CW); } @@ -291,7 +291,6 @@ bool directions_parallel(double angle1, double angle2, double max_diff = 0); bool directions_perpendicular(double angle1, double angle2, double max_diff = 0); template bool contains(const std::vector &vector, const Point &point); template T rad2deg(T angle) { return T(180.0) * angle / T(PI); } -double rad2deg_dir(double angle); template constexpr T deg2rad(const T angle) { return T(PI) * angle / T(180.0); } template T angle_to_0_2PI(T angle) { @@ -324,7 +323,8 @@ bool arrange( // 4) rotate Y // 5) rotate Z // 6) translate -void assemble_transform(Transform3d& transform, const Vec3d& translation = Vec3d::Zero(), const Vec3d& rotation = Vec3d::Zero(), const Vec3d& scale = Vec3d::Ones(), const Vec3d& mirror = Vec3d::Ones()); +void assemble_transform(Transform3d& transform, const Vec3d& translation = Vec3d::Zero(), const Vec3d& rotation = Vec3d::Zero(), + const Vec3d& scale = Vec3d::Ones(), const Vec3d& mirror = Vec3d::Ones()); // Returns the transform obtained by assembling the given transformations in the following order: // 1) mirror @@ -333,93 +333,149 @@ void assemble_transform(Transform3d& transform, const Vec3d& translation = Vec3d // 4) rotate Y // 5) rotate Z // 6) translate -Transform3d assemble_transform(const Vec3d& translation = Vec3d::Zero(), const Vec3d& rotation = Vec3d::Zero(), const Vec3d& scale = Vec3d::Ones(), const Vec3d& mirror = Vec3d::Ones()); +Transform3d assemble_transform(const Vec3d& translation = Vec3d::Zero(), const Vec3d& rotation = Vec3d::Zero(), + const Vec3d& scale = Vec3d::Ones(), const Vec3d& mirror = Vec3d::Ones()); + +// Sets the given transform by multiplying the given transformations in the following order: +// T = translation * rotation * scale * mirror +void assemble_transform(Transform3d& transform, const Transform3d& translation = Transform3d::Identity(), + const Transform3d& rotation = Transform3d::Identity(), const Transform3d& scale = Transform3d::Identity(), + const Transform3d& mirror = Transform3d::Identity()); + +// Returns the transform obtained by multiplying the given transformations in the following order: +// T = translation * rotation * scale * mirror +Transform3d assemble_transform(const Transform3d& translation = Transform3d::Identity(), const Transform3d& rotation = Transform3d::Identity(), + const Transform3d& scale = Transform3d::Identity(), const Transform3d& mirror = Transform3d::Identity()); + +// Sets the given transform by assembling the given translation +void translation_transform(Transform3d& transform, const Vec3d& translation); + +// Returns the transform obtained by assembling the given translation +Transform3d translation_transform(const Vec3d& translation); + +// Sets the given transform by assembling the given rotations in the following order: +// 1) rotate X +// 2) rotate Y +// 3) rotate Z +void rotation_transform(Transform3d& transform, const Vec3d& rotation); + +// Returns the transform obtained by assembling the given rotations in the following order: +// 1) rotate X +// 2) rotate Y +// 3) rotate Z +Transform3d rotation_transform(const Vec3d& rotation); + +// Sets the given transform by assembling the given scale factors +void scale_transform(Transform3d& transform, double scale); +void scale_transform(Transform3d& transform, const Vec3d& scale); + +// Returns the transform obtained by assembling the given scale factors +Transform3d scale_transform(double scale); +Transform3d scale_transform(const Vec3d& scale); // Returns the euler angles extracted from the given rotation matrix // Warning -> The matrix should not contain any scale or shear !!! -Vec3d extract_euler_angles(const Eigen::Matrix& rotation_matrix); +Vec3d extract_rotation(const Eigen::Matrix& rotation_matrix); // Returns the euler angles extracted from the given affine transform // Warning -> The transform should not contain any shear !!! -Vec3d extract_euler_angles(const Transform3d& transform); +Vec3d extract_rotation(const Transform3d& transform); class Transformation { - struct Flags - { - bool dont_translate; - bool dont_rotate; - bool dont_scale; - bool dont_mirror; - - Flags(); - - bool needs_update(bool dont_translate, bool dont_rotate, bool dont_scale, bool dont_mirror) const; - void set(bool dont_translate, bool dont_rotate, bool dont_scale, bool dont_mirror); - }; + Transform3d m_matrix{ Transform3d::Identity() }; - Vec3d m_offset; // In unscaled coordinates - Vec3d m_rotation; // Rotation around the three axes, in radians around mesh center point - Vec3d m_scaling_factor; // Scaling factors along the three axes - Vec3d m_mirror; // Mirroring along the three axes +public: + Transformation() = default; + explicit Transformation(const Transform3d& transform) : m_matrix(transform) {} - mutable Transform3d m_matrix; - mutable Flags m_flags; - mutable bool m_dirty; + Vec3d get_offset() const { return m_matrix.translation(); } + double get_offset(Axis axis) const { return get_offset()[axis]; } -public: - Transformation(); - explicit Transformation(const Transform3d& transform); + Transform3d get_offset_matrix() const; - const Vec3d& get_offset() const { return m_offset; } - double get_offset(Axis axis) const { return m_offset(axis); } + void set_offset(const Vec3d& offset) { m_matrix.translation() = offset; } + void set_offset(Axis axis, double offset) { m_matrix.translation()[axis] = offset; } - void set_offset(const Vec3d& offset); - void set_offset(Axis axis, double offset); + Vec3d get_rotation() const; + double get_rotation(Axis axis) const { return get_rotation()[axis]; } - const Vec3d& get_rotation() const { return m_rotation; } - double get_rotation(Axis axis) const { return m_rotation(axis); } + Transform3d get_rotation_matrix() const; void set_rotation(const Vec3d& rotation); void set_rotation(Axis axis, double rotation); - const Vec3d& get_scaling_factor() const { return m_scaling_factor; } - double get_scaling_factor(Axis axis) const { return m_scaling_factor(axis); } + Vec3d get_scaling_factor() const; + double get_scaling_factor(Axis axis) const { return get_scaling_factor()[axis]; } + + Transform3d get_scaling_factor_matrix() const; + + bool is_scaling_uniform() const { + const Vec3d scale = get_scaling_factor(); + return std::abs(scale.x() - scale.y()) < 1e-8 && std::abs(scale.x() - scale.z()) < 1e-8; + } void set_scaling_factor(const Vec3d& scaling_factor); void set_scaling_factor(Axis axis, double scaling_factor); - bool is_scaling_uniform() const { return std::abs(m_scaling_factor.x() - m_scaling_factor.y()) < 1e-8 && std::abs(m_scaling_factor.x() - m_scaling_factor.z()) < 1e-8; } - const Vec3d& get_mirror() const { return m_mirror; } - double get_mirror(Axis axis) const { return m_mirror(axis); } - bool is_left_handed() const { return m_mirror.x() * m_mirror.y() * m_mirror.z() < 0.; } + Vec3d get_mirror() const; + double get_mirror(Axis axis) const { return get_mirror()[axis]; } + + Transform3d get_mirror_matrix() const; + + bool is_left_handed() const { + return m_matrix.linear().determinant() < 0; + } void set_mirror(const Vec3d& mirror); void set_mirror(Axis axis, double mirror); - void set_from_transform(const Transform3d& transform); + bool has_skew() const; void reset(); + void reset_offset() { set_offset(Vec3d::Zero()); } + void reset_rotation(); + void reset_scaling_factor(); + void reset_mirror() { set_mirror(Vec3d::Ones()); } + void reset_skew(); - const Transform3d& get_matrix(bool dont_translate = false, bool dont_rotate = false, bool dont_scale = false, bool dont_mirror = false) const; + const Transform3d& get_matrix() const { return m_matrix; } + Transform3d get_matrix_no_offset() const; + Transform3d get_matrix_no_scaling_factor() const; - Transformation operator * (const Transformation& other) const; + void set_matrix(const Transform3d& transform) { m_matrix = transform; } - // Find volume transformation, so that the chained (instance_trafo * volume_trafo) will be as close to identity - // as possible in least squares norm in regard to the 8 corners of bbox. - // Bounding box is expected to be centered around zero in all axes. - static Transformation volume_to_bed_transformation(const Transformation& instance_transformation, const BoundingBoxf3& bbox); + Transformation operator * (const Transformation& other) const; private: - friend class cereal::access; - template void serialize(Archive & ar) { ar(m_offset, m_rotation, m_scaling_factor, m_mirror); } - explicit Transformation(int) : m_dirty(true) {} - template static void load_and_construct(Archive &ar, cereal::construct &construct) - { - // Calling a private constructor with special "int" parameter to indicate that no construction is necessary. - construct(1); - ar(construct.ptr()->m_offset, construct.ptr()->m_rotation, construct.ptr()->m_scaling_factor, construct.ptr()->m_mirror); - } + friend class cereal::access; + template void serialize(Archive& ar) { ar(m_matrix); } + explicit Transformation(int) {} + template static void load_and_construct(Archive& ar, cereal::construct& construct) + { + // Calling a private constructor with special "int" parameter to indicate that no construction is necessary. + construct(1); + ar(construct.ptr()->m_matrix); + } +}; + +struct TransformationSVD +{ + Matrix3d u{ Matrix3d::Identity() }; + Matrix3d s{ Matrix3d::Identity() }; + Matrix3d v{ Matrix3d::Identity() }; + + bool mirror{ false }; + bool scale{ false }; + bool anisotropic_scale{ false }; + bool rotation{ false }; + bool rotation_90_degrees{ false }; + bool skew{ false }; + + explicit TransformationSVD(const Transformation& trafo) : TransformationSVD(trafo.get_matrix()) {} + explicit TransformationSVD(const Transform3d& trafo); + + Eigen::DiagonalMatrix mirror_matrix() const { return Eigen::DiagonalMatrix(this->mirror ? -1. : 1., 1., 1.); } }; // For parsing a transformation matrix from 3MF / AMF. @@ -430,12 +486,12 @@ extern Transform3d transform3d_from_string(const std::string& transform_str); extern Eigen::Quaterniond rotation_xyz_diff(const Vec3d &rot_xyz_from, const Vec3d &rot_xyz_to); // Rotation by Z to align rot_xyz_from to rot_xyz_to. // This should only be called if it is known, that the two rotations only differ in rotation around the Z axis. -extern double rotation_diff_z(const Vec3d &rot_xyz_from, const Vec3d &rot_xyz_to); +extern double rotation_diff_z(const Transform3d &trafo_from, const Transform3d &trafo_to); // Is the angle close to a multiple of 90 degrees? inline bool is_rotation_ninety_degrees(double a) { - a = fmod(std::abs(a), 0.5 * M_PI); + a = fmod(std::abs(a), 0.5 * PI); if (a > 0.25 * PI) a = 0.5 * PI - a; return a < 0.001; @@ -447,6 +503,37 @@ inline bool is_rotation_ninety_degrees(const Vec3d &rotation) return is_rotation_ninety_degrees(rotation.x()) && is_rotation_ninety_degrees(rotation.y()) && is_rotation_ninety_degrees(rotation.z()); } +// Returns true if one transformation may be converted into another transformation by +// rotation around Z and by mirroring in X / Y only. Two objects sharing such transformation +// may share support structures and they share Z height. +bool trafos_differ_in_rotation_by_z_and_mirroring_by_xy_only(const Transform3d &t1, const Transform3d &t2); +inline bool trafos_differ_in_rotation_by_z_and_mirroring_by_xy_only(const Transformation &t1, const Transformation &t2) + { return trafos_differ_in_rotation_by_z_and_mirroring_by_xy_only(t1.get_matrix(), t2.get_matrix()); } + +template +std::pair dir_to_spheric(const Vec<3, Tin> &n, Tout norm = 1.) +{ + Tout z = n.z(); + Tout r = norm; + Tout polar = std::acos(z / r); + Tout azimuth = std::atan2(n(1), n(0)); + return {polar, azimuth}; +} + +template +Vec<3, T> spheric_to_dir(double polar, double azimuth) +{ + return {T(std::cos(azimuth) * std::sin(polar)), + T(std::sin(azimuth) * std::sin(polar)), T(std::cos(polar))}; +} + +template +Vec<3, T> spheric_to_dir(const Pair &v) +{ + double plr = std::get<0>(v), azm = std::get<1>(v); + return spheric_to_dir(plr, azm); +} + } } // namespace Slicer::Geometry #endif diff --git a/src/libslic3r/Geometry/Circle.cpp b/src/libslic3r/Geometry/Circle.cpp index 4d7c38ccc23..67966719549 100644 --- a/src/libslic3r/Geometry/Circle.cpp +++ b/src/libslic3r/Geometry/Circle.cpp @@ -108,7 +108,7 @@ Circled circle_taubin_newton(const Vec2ds& input, size_t cycles) return out; } -Circled circle_ransac(const Vec2ds& input, size_t iterations) +Circled circle_ransac(const Vec2ds& input, size_t iterations, double* min_error) { if (input.size() < 3) return Circled::make_invalid(); @@ -132,6 +132,8 @@ Circled circle_ransac(const Vec2ds& input, size_t iterations) circle_best = c; } } + if (min_error) + *min_error = err_min; return circle_best; } diff --git a/src/libslic3r/Geometry/Circle.hpp b/src/libslic3r/Geometry/Circle.hpp index 39973d916d9..653102e2abd 100644 --- a/src/libslic3r/Geometry/Circle.hpp +++ b/src/libslic3r/Geometry/Circle.hpp @@ -102,7 +102,7 @@ inline Vec2d circle_center_taubin_newton(const Vec2ds& input, size_t cycles = 20 Circled circle_taubin_newton(const Vec2ds& input, size_t cycles = 20); // Find circle using RANSAC randomized algorithm. -Circled circle_ransac(const Vec2ds& input, size_t iterations = 20); +Circled circle_ransac(const Vec2ds& input, size_t iterations = 20, double* min_error = nullptr); // Randomized algorithm by Emo Welzl, working with squared radii for efficiency. The returned circle radius is inflated by epsilon. template diff --git a/src/libslic3r/Geometry/ConvexHull.cpp b/src/libslic3r/Geometry/ConvexHull.cpp index b1ff77f8017..b8bf5eb6966 100644 --- a/src/libslic3r/Geometry/ConvexHull.cpp +++ b/src/libslic3r/Geometry/ConvexHull.cpp @@ -1,6 +1,7 @@ #include "libslic3r.h" #include "ConvexHull.hpp" #include "BoundingBox.hpp" +#include "../Geometry.hpp" #include @@ -19,13 +20,13 @@ Polygon convex_hull(Points pts) hull.points.resize(2 * n); // Build lower hull for (int i = 0; i < n; ++ i) { - while (k >= 2 && pts[i].ccw(hull[k-2], hull[k-1]) <= 0) + while (k >= 2 && Geometry::orient(pts[i], hull[k-2], hull[k-1]) != Geometry::ORIENTATION_CCW) -- k; hull[k ++] = pts[i]; } // Build upper hull for (int i = n-2, t = k+1; i >= 0; i--) { - while (k >= t && pts[i].ccw(hull[k-2], hull[k-1]) <= 0) + while (k >= t && Geometry::orient(pts[i], hull[k-2], hull[k-1]) != Geometry::ORIENTATION_CCW) -- k; hull[k ++] = pts[i]; } @@ -58,7 +59,7 @@ Pointf3s convex_hull(Pointf3s points) Point k1 = Point::new_scale(hull[k - 1](0), hull[k - 1](1)); Point k2 = Point::new_scale(hull[k - 2](0), hull[k - 2](1)); - if (p.ccw(k2, k1) <= 0) + if (Geometry::orient(p, k2, k1) != Geometry::ORIENTATION_CCW) --k; else break; @@ -76,7 +77,7 @@ Pointf3s convex_hull(Pointf3s points) Point k1 = Point::new_scale(hull[k - 1](0), hull[k - 1](1)); Point k2 = Point::new_scale(hull[k - 2](0), hull[k - 2](1)); - if (p.ccw(k2, k1) <= 0) + if (Geometry::orient(p, k2, k1) != Geometry::ORIENTATION_CCW) --k; else break; @@ -103,6 +104,29 @@ Polygon convex_hull(const Polygons &polygons) return convex_hull(std::move(pp)); } +Polygon convex_hull(const ExPolygons &expolygons) +{ + Points pp; + size_t sz = 0; + for (const auto &expoly : expolygons) + sz += expoly.contour.size(); + pp.reserve(sz); + for (const auto &expoly : expolygons) + pp.insert(pp.end(), expoly.contour.points.begin(), expoly.contour.points.end()); + return convex_hull(pp); +} + +Polygon convex_hulll(const Polylines &polylines) +{ + Points pp; + size_t sz = 0; + for (const auto &polyline : polylines) + sz += polyline.points.size(); + pp.reserve(sz); + for (const auto &polyline : polylines) + pp.insert(pp.end(), polyline.points.begin(), polyline.points.end()); + return convex_hull(pp); +} namespace rotcalip { @@ -374,7 +398,7 @@ bool inside_convex_polygon(const std::pair, std::vectorx()); assert(pt.x() == it_top->x()); - assert(it_bottom->y() <= pt.y() <= it_top->y()); + assert(it_bottom->y() <= pt.y() && pt.y() <= it_top->y()); return pt.y() >= it_bottom->y() && pt.y() <= it_top->y(); } diff --git a/src/libslic3r/Geometry/ConvexHull.hpp b/src/libslic3r/Geometry/ConvexHull.hpp index 03f00af6ae6..eb0be4fe1f0 100644 --- a/src/libslic3r/Geometry/ConvexHull.hpp +++ b/src/libslic3r/Geometry/ConvexHull.hpp @@ -1,14 +1,22 @@ #ifndef slic3r_Geometry_ConvexHull_hpp_ #define slic3r_Geometry_ConvexHull_hpp_ +#include + #include "../Polygon.hpp" namespace Slic3r { + +class ExPolygon; +using ExPolygons = std::vector; + namespace Geometry { Pointf3s convex_hull(Pointf3s points); Polygon convex_hull(Points points); Polygon convex_hull(const Polygons &polygons); +Polygon convex_hull(const ExPolygons &expolygons); +Polygon convex_hulll(const Polylines &polylines); // Returns true if the intersection of the two convex polygons A and B // is not an empty set. diff --git a/src/libslic3r/Geometry/MedialAxis.cpp b/src/libslic3r/Geometry/MedialAxis.cpp index ce38a6c7055..0f9d81da660 100644 --- a/src/libslic3r/Geometry/MedialAxis.cpp +++ b/src/libslic3r/Geometry/MedialAxis.cpp @@ -1,6 +1,7 @@ #include "MedialAxis.hpp" #include "clipper.hpp" +#include "VoronoiOffset.hpp" #ifdef SLIC3R_DEBUG namespace boost { namespace polygon { @@ -392,8 +393,7 @@ inline const typename VD::point_type retrieve_cell_point(const typename VD::cell } template -inline std::pair -measure_edge_thickness(const VD &vd, const typename VD::edge_type& edge, const SEGMENTS &segments) +inline std::pair measure_edge_thickness(const VD &vd, const typename VD::edge_type& edge, const SEGMENTS &segments) { typedef typename VD::coord_type T; const typename VD::point_type pa(edge.vertex0()->x(), edge.vertex0()->y()); @@ -442,15 +442,23 @@ class Lines2VDSegments const Lines &lines; }; -void -MedialAxis::build(ThickPolylines* polylines) +MedialAxis::MedialAxis(double min_width, double max_width, const ExPolygon &expolygon) : + m_expolygon(expolygon), m_lines(expolygon.lines()), m_min_width(min_width), m_max_width(max_width) { - construct_voronoi(this->lines.begin(), this->lines.end(), &this->vd); + (void)m_expolygon; // supress unused variable warning +} + +void MedialAxis::build(ThickPolylines* polylines) +{ + construct_voronoi(m_lines.begin(), m_lines.end(), &m_vd); + Slic3r::Voronoi::annotate_inside_outside(m_vd, m_lines); +// static constexpr double threshold_alpha = M_PI / 12.; // 30 degrees +// std::vector skeleton_edges = Slic3r::Voronoi::skeleton_edges_rough(vd, lines, threshold_alpha); /* // DEBUG: dump all Voronoi edges { - for (VD::const_edge_iterator edge = this->vd.edges().begin(); edge != this->vd.edges().end(); ++edge) { + for (VD::const_edge_iterator edge = m_vd.edges().begin(); edge != m_vd.edges().end(); ++edge) { if (edge->is_infinite()) continue; ThickPolyline polyline; @@ -462,74 +470,57 @@ MedialAxis::build(ThickPolylines* polylines) } */ - //typedef const VD::vertex_type vert_t; - typedef const VD::edge_type edge_t; - // collect valid edges (i.e. prune those not belonging to MAT) // note: this keeps twins, so it inserts twice the number of the valid edges - this->valid_edges.clear(); - { - std::set seen_edges; - for (VD::const_edge_iterator edge = this->vd.edges().begin(); edge != this->vd.edges().end(); ++edge) { - // if we only process segments representing closed loops, none if the - // infinite edges (if any) would be part of our MAT anyway - if (edge->is_secondary() || edge->is_infinite()) continue; - - // don't re-validate twins - if (seen_edges.find(&*edge) != seen_edges.end()) continue; // TODO: is this needed? - seen_edges.insert(&*edge); - seen_edges.insert(edge->twin()); - - if (!this->validate_edge(&*edge)) continue; - this->valid_edges.insert(&*edge); - this->valid_edges.insert(edge->twin()); + m_edge_data.assign(m_vd.edges().size() / 2, EdgeData{}); + for (VD::const_edge_iterator edge = m_vd.edges().begin(); edge != m_vd.edges().end(); edge += 2) + if (edge->is_primary() && edge->is_finite() && + (Voronoi::vertex_category(edge->vertex0()) == Voronoi::VertexCategory::Inside || + Voronoi::vertex_category(edge->vertex1()) == Voronoi::VertexCategory::Inside) && + this->validate_edge(&*edge)) { + // Valid skeleton edge. + this->edge_data(*edge).first.active = true; } - } - this->edges = this->valid_edges; // iterate through the valid edges to build polylines - while (!this->edges.empty()) { - const edge_t* edge = *this->edges.begin(); - - // start a polyline - ThickPolyline polyline; - polyline.points.push_back(Point( edge->vertex0()->x(), edge->vertex0()->y() )); - polyline.points.push_back(Point( edge->vertex1()->x(), edge->vertex1()->y() )); - polyline.width.push_back(this->thickness[edge].first); - polyline.width.push_back(this->thickness[edge].second); - - // remove this edge and its twin from the available edges - (void)this->edges.erase(edge); - (void)this->edges.erase(edge->twin()); - - // get next points - this->process_edge_neighbors(edge, &polyline); - - // get previous points - { - ThickPolyline rpolyline; - this->process_edge_neighbors(edge->twin(), &rpolyline); - polyline.points.insert(polyline.points.begin(), rpolyline.points.rbegin(), rpolyline.points.rend()); - polyline.width.insert(polyline.width.begin(), rpolyline.width.rbegin(), rpolyline.width.rend()); - polyline.endpoints.first = rpolyline.endpoints.second; - } + ThickPolyline reverse_polyline; + for (VD::const_edge_iterator seed_edge = m_vd.edges().begin(); seed_edge != m_vd.edges().end(); seed_edge += 2) + if (EdgeData &seed_edge_data = this->edge_data(*seed_edge).first; seed_edge_data.active) { + // Mark this edge as visited. + seed_edge_data.active = false; + + // Start a polyline. + ThickPolyline polyline; + polyline.points.emplace_back(seed_edge->vertex0()->x(), seed_edge->vertex0()->y()); + polyline.points.emplace_back(seed_edge->vertex1()->x(), seed_edge->vertex1()->y()); + polyline.width.emplace_back(seed_edge_data.width_start); + polyline.width.emplace_back(seed_edge_data.width_end); + // Grow the polyline in a forward direction. + this->process_edge_neighbors(&*seed_edge, &polyline); + assert(polyline.width.size() == polyline.points.size() * 2 - 2); - assert(polyline.width.size() == polyline.points.size()*2 - 2); + // Grow the polyline in a backward direction. + reverse_polyline.clear(); + this->process_edge_neighbors(seed_edge->twin(), &reverse_polyline); + polyline.points.insert(polyline.points.begin(), reverse_polyline.points.rbegin(), reverse_polyline.points.rend()); + polyline.width.insert(polyline.width.begin(), reverse_polyline.width.rbegin(), reverse_polyline.width.rend()); + polyline.endpoints.first = reverse_polyline.endpoints.second; + assert(polyline.width.size() == polyline.points.size() * 2 - 2); - // prevent loop endpoints from being extended - if (polyline.first_point() == polyline.last_point()) { - polyline.endpoints.first = false; - polyline.endpoints.second = false; + // Prevent loop endpoints from being extended. + if (polyline.first_point() == polyline.last_point()) { + polyline.endpoints.first = false; + polyline.endpoints.second = false; + } + + // Append polyline to result. + polylines->emplace_back(std::move(polyline)); } - - // append polyline to result - polylines->push_back(polyline); - } #ifdef SLIC3R_DEBUG { static int iRun = 0; - dump_voronoi_to_svg(this->lines, this->vd, polylines, debug_out_path("MedialAxis-%d.svg", iRun ++).c_str()); + dump_voronoi_to_svg(m_lines, m_vd, polylines, debug_out_path("MedialAxis-%d.svg", iRun ++).c_str()); printf("Thick lines: "); for (ThickPolylines::const_iterator it = polylines->begin(); it != polylines->end(); ++ it) { ThickLines lines = it->thicklines(); @@ -542,56 +533,68 @@ MedialAxis::build(ThickPolylines* polylines) #endif /* SLIC3R_DEBUG */ } -void -MedialAxis::build(Polylines* polylines) +void MedialAxis::build(Polylines* polylines) { ThickPolylines tp; this->build(&tp); - polylines->insert(polylines->end(), tp.begin(), tp.end()); + polylines->reserve(polylines->size() + tp.size()); + for (auto &pl : tp) + polylines->emplace_back(pl.points); } -void -MedialAxis::process_edge_neighbors(const VD::edge_type* edge, ThickPolyline* polyline) +void MedialAxis::process_edge_neighbors(const VD::edge_type *edge, ThickPolyline* polyline) { - while (true) { + for (;;) { // Since rot_next() works on the edge starting point but we want // to find neighbors on the ending point, we just swap edge with // its twin. - const VD::edge_type* twin = edge->twin(); + const VD::edge_type *twin = edge->twin(); // count neighbors for this edge - std::vector neighbors; - for (const VD::edge_type* neighbor = twin->rot_next(); neighbor != twin; - neighbor = neighbor->rot_next()) { - if (this->valid_edges.count(neighbor) > 0) neighbors.push_back(neighbor); - } + size_t num_neighbors = 0; + const VD::edge_type *first_neighbor = nullptr; + for (const VD::edge_type *neighbor = twin->rot_next(); neighbor != twin; neighbor = neighbor->rot_next()) + if (this->edge_data(*neighbor).first.active) { + if (num_neighbors == 0) + first_neighbor = neighbor; + ++ num_neighbors; + } // if we have a single neighbor then we can continue recursively - if (neighbors.size() == 1) { - const VD::edge_type* neighbor = neighbors.front(); - - // break if this is a closed loop - if (this->edges.count(neighbor) == 0) return; - - Point new_point(neighbor->vertex1()->x(), neighbor->vertex1()->y()); - polyline->points.push_back(new_point); - polyline->width.push_back(this->thickness[neighbor].first); - polyline->width.push_back(this->thickness[neighbor].second); - (void)this->edges.erase(neighbor); - (void)this->edges.erase(neighbor->twin()); - edge = neighbor; - } else if (neighbors.size() == 0) { + if (num_neighbors == 1) { + if (std::pair neighbor_data = this->edge_data(*first_neighbor); + neighbor_data.first.active) { + neighbor_data.first.active = false; + polyline->points.emplace_back(first_neighbor->vertex1()->x(), first_neighbor->vertex1()->y()); + if (neighbor_data.second) { + polyline->width.push_back(neighbor_data.first.width_end); + polyline->width.push_back(neighbor_data.first.width_start); + } else { + polyline->width.push_back(neighbor_data.first.width_start); + polyline->width.push_back(neighbor_data.first.width_end); + } + edge = first_neighbor; + // Continue chaining. + continue; + } + } else if (num_neighbors == 0) { polyline->endpoints.second = true; - return; } else { - // T-shaped or star-shaped joint - return; + // T-shaped or star-shaped joint } + // Stop chaining. + break; } } bool MedialAxis::validate_edge(const VD::edge_type* edge) { + auto retrieve_segment = [this](const VD::cell_type* cell) -> const Line& { return m_lines[cell->source_index()]; }; + auto retrieve_endpoint = [retrieve_segment](const VD::cell_type* cell) -> const Point& { + const Line &line = retrieve_segment(cell); + return cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT ? line.a : line.b; + }; + // prevent overflows and detect almost-infinite edges #ifndef CLIPPERLIB_INT32 if (std::abs(edge->vertex0()->x()) > double(CLIPPER_MAX_COORD_UNSCALED) || @@ -602,32 +605,18 @@ bool MedialAxis::validate_edge(const VD::edge_type* edge) #endif // CLIPPERLIB_INT32 // construct the line representing this edge of the Voronoi diagram - const Line line( - Point( edge->vertex0()->x(), edge->vertex0()->y() ), - Point( edge->vertex1()->x(), edge->vertex1()->y() ) - ); - - // discard edge if it lies outside the supplied shape - // this could maybe be optimized (checking inclusion of the endpoints - // might give false positives as they might belong to the contour itself) - if (this->expolygon != NULL) { - if (line.a == line.b) { - // in this case, contains(line) returns a false positive - if (!this->expolygon->contains(line.a)) return false; - } else { - if (!this->expolygon->contains(line)) return false; - } - } + const Line line({ edge->vertex0()->x(), edge->vertex0()->y() }, + { edge->vertex1()->x(), edge->vertex1()->y() }); // retrieve the original line segments which generated the edge we're checking const VD::cell_type* cell_l = edge->cell(); const VD::cell_type* cell_r = edge->twin()->cell(); - const Line &segment_l = this->retrieve_segment(cell_l); - const Line &segment_r = this->retrieve_segment(cell_r); + const Line &segment_l = retrieve_segment(cell_l); + const Line &segment_r = retrieve_segment(cell_r); /* SVG svg("edge.svg"); - svg.draw(*this->expolygon); + svg.draw(m_expolygon); svg.draw(line); svg.draw(segment_l, "red"); svg.draw(segment_r, "blue"); @@ -651,30 +640,30 @@ bool MedialAxis::validate_edge(const VD::edge_type* edge) coordf_t w0 = cell_r->contains_segment() ? segment_r.distance_to(line.a)*2 - : (this->retrieve_endpoint(cell_r) - line.a).cast().norm()*2; + : (retrieve_endpoint(cell_r) - line.a).cast().norm()*2; coordf_t w1 = cell_l->contains_segment() ? segment_l.distance_to(line.b)*2 - : (this->retrieve_endpoint(cell_l) - line.b).cast().norm()*2; + : (retrieve_endpoint(cell_l) - line.b).cast().norm()*2; if (cell_l->contains_segment() && cell_r->contains_segment()) { // calculate the relative angle between the two boundary segments double angle = fabs(segment_r.orientation() - segment_l.orientation()); - if (angle > PI) angle = 2*PI - angle; + if (angle > PI) + angle = 2. * PI - angle; assert(angle >= 0 && angle <= PI); - + // fabs(angle) ranges from 0 (collinear, same direction) to PI (collinear, opposite direction) // we're interested only in segments close to the second case (facing segments) // so we allow some tolerance. // this filter ensures that we're dealing with a narrow/oriented area (longer than thick) // we don't run it on edges not generated by two segments (thus generated by one segment // and the endpoint of another segment), since their orientation would not be meaningful - if (PI - angle > PI/8) { + if (PI - angle > PI / 8.) { // angle is not narrow enough - // only apply this filter to segments that are not too short otherwise their // angle could possibly be not meaningful - if (w0 < SCALED_EPSILON || w1 < SCALED_EPSILON || line.length() >= this->min_width) + if (w0 < SCALED_EPSILON || w1 < SCALED_EPSILON || line.length() >= m_min_width) return false; } } else { @@ -682,31 +671,17 @@ bool MedialAxis::validate_edge(const VD::edge_type* edge) return false; } - if (w0 < this->min_width && w1 < this->min_width) - return false; - - if (w0 > this->max_width && w1 > this->max_width) - return false; - - this->thickness[edge] = std::make_pair(w0, w1); - this->thickness[edge->twin()] = std::make_pair(w1, w0); - - return true; -} - -const Line& MedialAxis::retrieve_segment(const VD::cell_type* cell) const -{ - return this->lines[cell->source_index()]; -} - -const Point& MedialAxis::retrieve_endpoint(const VD::cell_type* cell) const -{ - const Line& line = this->retrieve_segment(cell); - if (cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) { - return line.a; - } else { - return line.b; + if ((w0 >= m_min_width || w1 >= m_min_width) && + (w0 <= m_max_width || w1 <= m_max_width)) { + std::pair ed = this->edge_data(*edge); + if (ed.second) + std::swap(w0, w1); + ed.first.width_start = w0; + ed.first.width_end = w1; + return true; } + + return false; } } } // namespace Slicer::Geometry diff --git a/src/libslic3r/Geometry/MedialAxis.hpp b/src/libslic3r/Geometry/MedialAxis.hpp index cfbb5f08054..b1354ddb2f2 100644 --- a/src/libslic3r/Geometry/MedialAxis.hpp +++ b/src/libslic3r/Geometry/MedialAxis.hpp @@ -4,30 +4,43 @@ #include "Voronoi.hpp" #include "../ExPolygon.hpp" -namespace Slic3r { namespace Geometry { +namespace Slic3r::Geometry { class MedialAxis { public: - Lines lines; - const ExPolygon* expolygon; - double max_width; - double min_width; - MedialAxis(double _max_width, double _min_width, const ExPolygon* _expolygon = NULL) - : expolygon(_expolygon), max_width(_max_width), min_width(_min_width) {}; + MedialAxis(double min_width, double max_width, const ExPolygon &expolygon); void build(ThickPolylines* polylines); void build(Polylines* polylines); private: + // Input + const ExPolygon &m_expolygon; + Lines m_lines; + // for filtering of the skeleton edges + double m_min_width; + double m_max_width; + + // Voronoi Diagram. using VD = VoronoiDiagram; - VD vd; - std::set edges, valid_edges; - std::map > thickness; + VD m_vd; + + // Annotations of the VD skeleton edges. + struct EdgeData { + bool active { false }; + double width_start { 0 }; + double width_end { 0 }; + }; + // Returns a reference to EdgeData and a "reversed" boolean. + std::pair edge_data(const VD::edge_type &edge) { + size_t edge_id = &edge - &m_vd.edges().front(); + return { m_edge_data[edge_id / 2], (edge_id & 1) != 0 }; + } + std::vector m_edge_data; + void process_edge_neighbors(const VD::edge_type* edge, ThickPolyline* polyline); bool validate_edge(const VD::edge_type* edge); - const Line& retrieve_segment(const VD::cell_type* cell) const; - const Point& retrieve_endpoint(const VD::cell_type* cell) const; }; -} } // namespace Slicer::Geometry +} // namespace Slicer::Geometry #endif // slic3r_Geometry_MedialAxis_hpp_ diff --git a/src/libslic3r/Geometry/VoronoiOffset.hpp b/src/libslic3r/Geometry/VoronoiOffset.hpp index 359fe010c85..fa72ae2bc21 100644 --- a/src/libslic3r/Geometry/VoronoiOffset.hpp +++ b/src/libslic3r/Geometry/VoronoiOffset.hpp @@ -1,4 +1,4 @@ -// Polygon offsetting using Voronoi diagram prodiced by boost::polygon. +// Polygon offsetting using Voronoi diagram produced by boost::polygon. #ifndef slic3r_VoronoiOffset_hpp_ #define slic3r_VoronoiOffset_hpp_ diff --git a/src/libslic3r/Geometry/VoronoiUtilsCgal.cpp b/src/libslic3r/Geometry/VoronoiUtilsCgal.cpp index 062a3b39793..832152c5fd0 100644 --- a/src/libslic3r/Geometry/VoronoiUtilsCgal.cpp +++ b/src/libslic3r/Geometry/VoronoiUtilsCgal.cpp @@ -8,17 +8,135 @@ #include "VoronoiUtilsCgal.hpp" using VD = Slic3r::Geometry::VoronoiDiagram; +using namespace Slic3r::Arachne; namespace Slic3r::Geometry { -using CGAL_Point = CGAL::Exact_predicates_exact_constructions_kernel::Point_2; -using CGAL_Segment = CGAL::Arr_segment_traits_2::Curve_2; +// The tangent vector of the parabola is computed based on the Proof of the reflective property. +// https://en.wikipedia.org/wiki/Parabola#Proof_of_the_reflective_property +// https://math.stackexchange.com/q/2439647/2439663#comment5039739_2439663 +namespace impl { + using K = CGAL::Simple_cartesian; + using FK = CGAL::Simple_cartesian; + using EK = CGAL::Simple_cartesian; + using C2E = CGAL::Cartesian_converter; + using C2F = CGAL::Cartesian_converter; + class Epick : public CGAL::Filtered_kernel_adaptor::Type, Epick>, true> {}; -inline static CGAL_Point to_cgal_point(const VD::vertex_type &pt) { return {pt.x(), pt.y()}; } + template + inline typename K::Vector_2 calculate_parabolic_tangent_vector( + // Test point on the parabola, where the tangent will be calculated. + const typename K::Point_2 &p, + // Focus point of the parabola. + const typename K::Point_2 &f, + // Points of a directrix of the parabola. + const typename K::Point_2 &u, + const typename K::Point_2 &v, + // On which side of the parabolic segment endpoints the focus point is, which determines the orientation of the tangent. + const typename K::Orientation &tangent_orientation) + { + using RT = typename K::RT; + using Vector_2 = typename K::Vector_2; + + const Vector_2 directrix_vec = v - u; + const RT directrix_vec_sqr_length = CGAL::scalar_product(directrix_vec, directrix_vec); + Vector_2 focus_vec = (f - u) * directrix_vec_sqr_length - directrix_vec * CGAL::scalar_product(directrix_vec, p - u); + Vector_2 tangent_vec = focus_vec.perpendicular(tangent_orientation); + return tangent_vec; + } + + template struct ParabolicTangentToSegmentOrientationPredicate + { + using Point_2 = typename K::Point_2; + using Vector_2 = typename K::Vector_2; + using Orientation = typename K::Orientation; + using result_type = typename K::Orientation; + + result_type operator()( + // Test point on the parabola, where the tangent will be calculated. + const Point_2 &p, + // End of the linear segment (p, q), for which orientation towards the tangent to parabola will be evaluated. + const Point_2 &q, + // Focus point of the parabola. + const Point_2 &f, + // Points of a directrix of the parabola. + const Point_2 &u, + const Point_2 &v, + // On which side of the parabolic segment endpoints the focus point is, which determines the orientation of the tangent. + const Orientation &tangent_orientation) const + { + assert(tangent_orientation == CGAL::Orientation::LEFT_TURN || tangent_orientation == CGAL::Orientation::RIGHT_TURN); + + Vector_2 tangent_vec = calculate_parabolic_tangent_vector(p, f, u, v, tangent_orientation); + Vector_2 linear_vec = q - p; + + return CGAL::sign(tangent_vec.x() * linear_vec.y() - tangent_vec.y() * linear_vec.x()); + } + }; + + template struct ParabolicTangentToParabolicTangentOrientationPredicate + { + using Point_2 = typename K::Point_2; + using Vector_2 = typename K::Vector_2; + using Orientation = typename K::Orientation; + using result_type = typename K::Orientation; + + result_type operator()( + // Common point on both parabolas, where the tangent will be calculated. + const Point_2 &p, + // Focus point of the first parabola. + const Point_2 &f_0, + // Points of a directrix of the first parabola. + const Point_2 &u_0, + const Point_2 &v_0, + // On which side of the parabolic segment endpoints the focus point is, which determines the orientation of the tangent. + const Orientation &tangent_orientation_0, + // Focus point of the second parabola. + const Point_2 &f_1, + // Points of a directrix of the second parabola. + const Point_2 &u_1, + const Point_2 &v_1, + // On which side of the parabolic segment endpoints the focus point is, which determines the orientation of the tangent. + const Orientation &tangent_orientation_1) const + { + assert(tangent_orientation_0 == CGAL::Orientation::LEFT_TURN || tangent_orientation_0 == CGAL::Orientation::RIGHT_TURN); + assert(tangent_orientation_1 == CGAL::Orientation::LEFT_TURN || tangent_orientation_1 == CGAL::Orientation::RIGHT_TURN); + + Vector_2 tangent_vec_0 = calculate_parabolic_tangent_vector(p, f_0, u_0, v_0, tangent_orientation_0); + Vector_2 tangent_vec_1 = calculate_parabolic_tangent_vector(p, f_1, u_1, v_1, tangent_orientation_1); + + return CGAL::sign(tangent_vec_0.x() * tangent_vec_1.y() - tangent_vec_0.y() * tangent_vec_1.x()); + } + }; + + using ParabolicTangentToSegmentOrientationPredicateFiltered = CGAL::Filtered_predicate, ParabolicTangentToSegmentOrientationPredicate, C2E, C2F>; + using ParabolicTangentToParabolicTangentOrientationPredicateFiltered = CGAL::Filtered_predicate, ParabolicTangentToParabolicTangentOrientationPredicate, C2E, C2F>; +} // namespace impl + +using ParabolicTangentToSegmentOrientation = impl::ParabolicTangentToSegmentOrientationPredicateFiltered; +using ParabolicTangentToParabolicTangentOrientation = impl::ParabolicTangentToParabolicTangentOrientationPredicateFiltered; +using CGAL_Point = impl::K::Point_2; + +inline static CGAL_Point to_cgal_point(const VD::vertex_type *pt) { return {pt->x(), pt->y()}; } +inline static CGAL_Point to_cgal_point(const Point &pt) { return {pt.x(), pt.y()}; } +inline static CGAL_Point to_cgal_point(const Vec2d &pt) { return {pt.x(), pt.y()}; } + +inline static Linef make_linef(const VD::edge_type &edge) +{ + const VD::vertex_type *v0 = edge.vertex0(); + const VD::vertex_type *v1 = edge.vertex1(); + return {Vec2d(v0->x(), v0->y()), Vec2d(v1->x(), v1->y())}; +} + +[[maybe_unused]] inline static bool is_equal(const VD::vertex_type &first, const VD::vertex_type &second) { return first.x() == second.x() && first.y() == second.y(); } // FIXME Lukas H.: Also includes parabolic segments. bool VoronoiUtilsCgal::is_voronoi_diagram_planar_intersection(const VD &voronoi_diagram) { + using CGAL_Point = CGAL::Exact_predicates_exact_constructions_kernel::Point_2; + using CGAL_Segment = CGAL::Arr_segment_traits_2::Curve_2; + auto to_cgal_point = [](const VD::vertex_type &pt) -> CGAL_Point { return {pt.x(), pt.y()}; }; + assert(std::all_of(voronoi_diagram.edges().cbegin(), voronoi_diagram.edges().cend(), [](const VD::edge_type &edge) { return edge.color() == 0; })); @@ -30,7 +148,7 @@ bool VoronoiUtilsCgal::is_voronoi_diagram_planar_intersection(const VD &voronoi_ continue; if (edge.is_finite() && edge.is_linear() && edge.vertex0() != nullptr && edge.vertex1() != nullptr && - Arachne::VoronoiUtils::is_finite(*edge.vertex0()) && Arachne::VoronoiUtils::is_finite(*edge.vertex1())) { + VoronoiUtils::is_finite(*edge.vertex0()) && VoronoiUtils::is_finite(*edge.vertex1())) { segments.emplace_back(to_cgal_point(*edge.vertex0()), to_cgal_point(*edge.vertex1())); edge.color(1); assert(edge.twin() != nullptr); @@ -46,37 +164,101 @@ bool VoronoiUtilsCgal::is_voronoi_diagram_planar_intersection(const VD &voronoi_ return intersections_pt.empty(); } -static bool check_if_three_vectors_are_ccw(const CGAL_Point &common_pt, const CGAL_Point &pt_1, const CGAL_Point &pt_2, const CGAL_Point &test_pt) { - CGAL::Orientation orientation = CGAL::orientation(common_pt, pt_1, pt_2); +struct ParabolicSegment +{ + const Point focus; + const Line directrix; + // Two points on the parabola; + const Linef segment; + // Indicate if focus point is on the left side or right side relative to parabolic segment endpoints. + const CGAL::Orientation is_focus_on_left; +}; + +inline static ParabolicSegment get_parabolic_segment(const VD::edge_type &edge, const std::vector &segments) +{ + assert(edge.is_curved()); + + const VD::cell_type *left_cell = edge.cell(); + const VD::cell_type *right_cell = edge.twin()->cell(); + + const Point focus_pt = VoronoiUtils::getSourcePoint(*(left_cell->contains_point() ? left_cell : right_cell), segments); + const VoronoiUtils::Segment &directrix = VoronoiUtils::getSourceSegment(*(left_cell->contains_point() ? right_cell : left_cell), segments); + CGAL::Orientation focus_side = CGAL::opposite(CGAL::orientation(to_cgal_point(edge.vertex0()), to_cgal_point(edge.vertex1()), to_cgal_point(focus_pt))); + + assert(focus_side == CGAL::Orientation::LEFT_TURN || focus_side == CGAL::Orientation::RIGHT_TURN); + return {focus_pt, Line(directrix.from(), directrix.to()), make_linef(edge), focus_side}; +} + +inline static CGAL::Orientation orientation_of_two_edges(const VD::edge_type &edge_a, const VD::edge_type &edge_b, const std::vector &segments) { + assert(is_equal(*edge_a.vertex0(), *edge_b.vertex0())); + CGAL::Orientation orientation; + if (edge_a.is_linear() && edge_b.is_linear()) { + orientation = CGAL::orientation(to_cgal_point(edge_a.vertex0()), to_cgal_point(edge_a.vertex1()), to_cgal_point(edge_b.vertex1())); + } else if (edge_a.is_curved() && edge_b.is_curved()) { + const ParabolicSegment parabolic_a = get_parabolic_segment(edge_a, segments); + const ParabolicSegment parabolic_b = get_parabolic_segment(edge_b, segments); + orientation = ParabolicTangentToParabolicTangentOrientation{}(to_cgal_point(parabolic_a.segment.a), + to_cgal_point(parabolic_a.focus), + to_cgal_point(parabolic_a.directrix.a), + to_cgal_point(parabolic_a.directrix.b), + parabolic_a.is_focus_on_left, + to_cgal_point(parabolic_b.focus), + to_cgal_point(parabolic_b.directrix.a), + to_cgal_point(parabolic_b.directrix.b), + parabolic_b.is_focus_on_left); + return orientation; + } else { + assert(edge_a.is_curved() != edge_b.is_curved()); + + const VD::edge_type &linear_edge = edge_a.is_curved() ? edge_b : edge_a; + const VD::edge_type ¶bolic_edge = edge_a.is_curved() ? edge_a : edge_b; + const ParabolicSegment parabolic = get_parabolic_segment(parabolic_edge, segments); + orientation = ParabolicTangentToSegmentOrientation{}(to_cgal_point(parabolic.segment.a), to_cgal_point(linear_edge.vertex1()), + to_cgal_point(parabolic.focus), + to_cgal_point(parabolic.directrix.a), + to_cgal_point(parabolic.directrix.b), + parabolic.is_focus_on_left); + + if (edge_b.is_curved()) + orientation = CGAL::opposite(orientation); + } + + return orientation; +} + +static bool check_if_three_edges_are_ccw(const VD::edge_type &first, const VD::edge_type &second, const VD::edge_type &third, const std::vector &segments) +{ + assert(is_equal(*first.vertex0(), *second.vertex0()) && is_equal(*second.vertex0(), *third.vertex0())); + + CGAL::Orientation orientation = orientation_of_two_edges(first, second, segments); if (orientation == CGAL::Orientation::COLLINEAR) { // The first two edges are collinear, so the third edge must be on the right side on the first of them. - return CGAL::orientation(common_pt, pt_1, test_pt) == CGAL::Orientation::RIGHT_TURN; + return orientation_of_two_edges(first, third, segments) == CGAL::Orientation::RIGHT_TURN; } else if (orientation == CGAL::Orientation::LEFT_TURN) { // CCW oriented angle between vectors (common_pt, pt1) and (common_pt, pt2) is bellow PI. // So we need to check if test_pt isn't between them. - CGAL::Orientation orientation1 = CGAL::orientation(common_pt, pt_1, test_pt); - CGAL::Orientation orientation2 = CGAL::orientation(common_pt, pt_2, test_pt); + CGAL::Orientation orientation1 = orientation_of_two_edges(first, third, segments); + CGAL::Orientation orientation2 = orientation_of_two_edges(second, third, segments); return (orientation1 != CGAL::Orientation::LEFT_TURN || orientation2 != CGAL::Orientation::RIGHT_TURN); } else { assert(orientation == CGAL::Orientation::RIGHT_TURN); // CCW oriented angle between vectors (common_pt, pt1) and (common_pt, pt2) is upper PI. // So we need to check if test_pt is between them. - CGAL::Orientation orientation1 = CGAL::orientation(common_pt, pt_1, test_pt); - CGAL::Orientation orientation2 = CGAL::orientation(common_pt, pt_2, test_pt); + CGAL::Orientation orientation1 = orientation_of_two_edges(first, third, segments); + CGAL::Orientation orientation2 = orientation_of_two_edges(second, third, segments); return (orientation1 == CGAL::Orientation::RIGHT_TURN || orientation2 == CGAL::Orientation::LEFT_TURN); } } -bool VoronoiUtilsCgal::is_voronoi_diagram_planar_angle(const VoronoiDiagram &voronoi_diagram) +bool VoronoiUtilsCgal::is_voronoi_diagram_planar_angle(const VoronoiDiagram &voronoi_diagram, const std::vector &segments) { for (const VD::vertex_type &vertex : voronoi_diagram.vertices()) { std::vector edges; const VD::edge_type *edge = vertex.incident_edge(); do { - // FIXME Lukas H.: Also process parabolic segments. - if (edge->is_finite() && edge->is_linear() && edge->vertex0() != nullptr && edge->vertex1() != nullptr && - Arachne::VoronoiUtils::is_finite(*edge->vertex0()) && Arachne::VoronoiUtils::is_finite(*edge->vertex1())) + if (edge->is_finite() && edge->vertex0() != nullptr && edge->vertex1() != nullptr && + VoronoiUtils::is_finite(*edge->vertex0()) && VoronoiUtils::is_finite(*edge->vertex1())) edges.emplace_back(edge); edge = edge->rot_next(); @@ -89,8 +271,7 @@ bool VoronoiUtilsCgal::is_voronoi_diagram_planar_angle(const VoronoiDiagram &vor const Geometry::VoronoiDiagram::edge_type *curr_edge = *edge_it; const Geometry::VoronoiDiagram::edge_type *next_edge = std::next(edge_it) == edges.end() ? edges.front() : *std::next(edge_it); - if (!check_if_three_vectors_are_ccw(to_cgal_point(*prev_edge->vertex0()), to_cgal_point(*prev_edge->vertex1()), - to_cgal_point(*curr_edge->vertex1()), to_cgal_point(*next_edge->vertex1()))) + if (!check_if_three_edges_are_ccw(*prev_edge, *curr_edge, *next_edge, segments)) return false; } } @@ -99,5 +280,4 @@ bool VoronoiUtilsCgal::is_voronoi_diagram_planar_angle(const VoronoiDiagram &vor return true; } - } // namespace Slic3r::Geometry \ No newline at end of file diff --git a/src/libslic3r/Geometry/VoronoiUtilsCgal.hpp b/src/libslic3r/Geometry/VoronoiUtilsCgal.hpp index 897891bd933..cad54615bf4 100644 --- a/src/libslic3r/Geometry/VoronoiUtilsCgal.hpp +++ b/src/libslic3r/Geometry/VoronoiUtilsCgal.hpp @@ -2,6 +2,7 @@ #define slic3r_VoronoiUtilsCgal_hpp_ #include "Voronoi.hpp" +#include "../Arachne/utils/VoronoiUtils.hpp" namespace Slic3r::Geometry { class VoronoiDiagram; @@ -13,7 +14,7 @@ class VoronoiUtilsCgal static bool is_voronoi_diagram_planar_intersection(const VoronoiDiagram &voronoi_diagram); // Check if the Voronoi diagram is planar using verification that all neighboring edges are ordered CCW for each vertex. - static bool is_voronoi_diagram_planar_angle(const VoronoiDiagram &voronoi_diagram); + static bool is_voronoi_diagram_planar_angle(const VoronoiDiagram &voronoi_diagram, const std::vector &segments); }; } // namespace Slic3r::Geometry diff --git a/src/libslic3r/I18N.hpp b/src/libslic3r/I18N.hpp index db4fd22dfe0..5d2068a3db5 100644 --- a/src/libslic3r/I18N.hpp +++ b/src/libslic3r/I18N.hpp @@ -3,6 +3,12 @@ #include +#ifdef SLIC3R_CURRENTLY_COMPILING_GUI_MODULE + #ifndef SLIC3R_ALLOW_LIBSLIC3R_I18N_IN_SLIC3R + #error You included libslic3r/I18N.hpp into a file belonging to slic3r module. + #endif +#endif + namespace Slic3r { namespace I18N { @@ -15,4 +21,17 @@ namespace I18N { } // namespace Slic3r +// When this is included from slic3r, better do not define the translation functions. +// Macros from slic3r/GUI/I18N.hpp should be used there. +#ifndef SLIC3R_CURRENTLY_COMPILING_GUI_MODULE + #ifdef L + #error L macro is defined where it shouldn't be. Didn't you include slic3r/GUI/I18N.hpp in libslic3r by mistake? + #endif + namespace { + [[maybe_unused]] const char* L(const char* s) { return s; } + [[maybe_unused]] const char* L_CONTEXT(const char* s, const char* context) { return s; } + [[maybe_unused]] std::string _u8L(const char* s) { return Slic3r::I18N::translate(s); } + } +#endif + #endif /* slic3r_I18N_hpp_ */ diff --git a/src/libslic3r/Int128.hpp b/src/libslic3r/Int128.hpp index 8dc9e012dd8..7aeacbfcee3 100644 --- a/src/libslic3r/Int128.hpp +++ b/src/libslic3r/Int128.hpp @@ -105,6 +105,11 @@ class Int128 static inline Int128 multiply(int64_t lhs, int64_t rhs) { return Int128(__int128(lhs) * __int128(rhs)); } +#if defined(__clang__) + // When Clang is used with enabled UndefinedBehaviorSanitizer, it produces "undefined reference to '__muloti4'" when __int128 is used. + // Because of that, UndefinedBehaviorSanitizer is disabled for this function. + __attribute__((no_sanitize("undefined"))) +#endif // Evaluate signum of a 2x2 determinant. static int sign_determinant_2x2(int64_t a11, int64_t a12, int64_t a21, int64_t a22) { diff --git a/src/libslic3r/IntersectionPoints.cpp b/src/libslic3r/IntersectionPoints.cpp new file mode 100644 index 00000000000..3537e74ab45 --- /dev/null +++ b/src/libslic3r/IntersectionPoints.cpp @@ -0,0 +1,170 @@ +#include "IntersectionPoints.hpp" + +//#define USE_CGAL_SWEEP_LINE +#ifdef USE_CGAL_SWEEP_LINE + +#include +#include +#include +#include +#include + +using NT = CGAL::Quotient; +using Kernel = CGAL::Cartesian; +using P2 = Kernel::Point_2; +using Traits_2 = CGAL::Arr_segment_traits_2; +using Segment = Traits_2::Curve_2; +using Segments = std::vector; + +namespace priv { + +P2 convert(const Slic3r::Point &p) { return P2(p.x(), p.y()); } +Slic3r::Vec2d convert(const P2 &p) +{ + return Slic3r::Vec2d(CGAL::to_double(p.x()), CGAL::to_double(p.y())); +} + +Slic3r::Pointfs compute_intersections(const Segments &segments) +{ + std::vector intersections; + // Compute all intersection points. + CGAL::compute_intersection_points(segments.begin(), segments.end(), + std::back_inserter(intersections)); + if (intersections.empty()) return {}; + Slic3r::Pointfs pts; + pts.reserve(intersections.size()); + for (const P2 &p : intersections) pts.push_back(convert(p)); + return pts; +} + +void add_polygon(const Slic3r::Polygon &polygon, Segments &segments) +{ + if (polygon.points.size() < 2) return; + P2 prev_point = priv::convert(polygon.last_point()); + for (const Slic3r::Point &p : polygon.points) { + P2 act_point = priv::convert(p); + if (prev_point == act_point) continue; + segments.emplace_back(prev_point, act_point); + prev_point = act_point; + } +} +Slic3r::Pointfs Slic3r::intersection_points(const Lines &lines) +{ + return priv::compute_intersections2(lines); + Segments segments; + segments.reserve(lines.size()); + for (Line l : lines) + segments.emplace_back(priv::convert(l.a), priv::convert(l.b)); + return priv::compute_intersections(segments); +} + +Slic3r::Pointfs Slic3r::intersection_points(const Polygon &polygon) +{ + Segments segments; + segments.reserve(polygon.points.size()); + priv::add_polygon(polygon, segments); + return priv::compute_intersections(segments); +} + +Slic3r::Pointfs Slic3r::intersection_points(const Polygons &polygons) +{ + Segments segments; + segments.reserve(count_points(polygons)); + for (const Polygon &polygon : polygons) + priv::add_polygon(polygon, segments); + return priv::compute_intersections(segments); +} + +Slic3r::Pointfs Slic3r::intersection_points(const ExPolygon &expolygon) +{ + Segments segments; + segments.reserve(count_points(expolygon)); + priv::add_polygon(expolygon.contour, segments); + for (const Polygon &hole : expolygon.holes) + priv::add_polygon(hole, segments); + return priv::compute_intersections(segments); +} + +Slic3r::Pointfs Slic3r::intersection_points(const ExPolygons &expolygons) +{ + Segments segments; + segments.reserve(count_points(expolygons)); + for (const ExPolygon &expolygon : expolygons) { + priv::add_polygon(expolygon.contour, segments); + for (const Polygon &hole : expolygon.holes) + priv::add_polygon(hole, segments); + } + return priv::compute_intersections(segments); +} + + +} // namespace priv + +#else // USE_CGAL_SWEEP_LINE + +// use bounding boxes +#include + +namespace priv { +Slic3r::Pointfs compute_intersections(const Slic3r::Lines &lines) +{ + using namespace Slic3r; + // IMPROVE0: BoundingBoxes of Polygons + // IMPROVE1: Polygon's neighbor lines can't intersect + // e.g. use indices to Point to find same points + // IMPROVE2: Use BentleyOttmann algorithm + // https://doc.cgal.org/latest/Surface_sweep_2/index.html -- CGAL implementation is significantly slower + // https://stackoverflow.com/questions/4407493/is-there-a-robust-c-implementation-of-the-bentley-ottmann-algorithm + Pointfs pts; + Point i; + for (size_t li = 0; li < lines.size(); ++li) { + const Line &l = lines[li]; + const Point &a = l.a; + const Point &b = l.b; + Point min(std::min(a.x(), b.x()), std::min(a.y(), b.y())); + Point max(std::max(a.x(), b.x()), std::max(a.y(), b.y())); + BoundingBox bb(min, max); + for (size_t li_ = li + 1; li_ < lines.size(); ++li_) { + const Line &l_ = lines[li_]; + const Point &a_ = l_.a; + const Point &b_ = l_.b; + if (a == b_ || b == a_ || a == a_ || b == b_) continue; + Point min_(std::min(a_.x(), b_.x()), std::min(a_.y(), b_.y())); + Point max_(std::max(a_.x(), b_.x()), std::max(a_.y(), b_.y())); + BoundingBox bb_(min_, max_); + // intersect of BB compare min max + if (bb.overlap(bb_) && + l.intersection(l_, &i)) + pts.push_back(i.cast()); + } + } + return pts; +} +} // namespace priv + +Slic3r::Pointfs Slic3r::intersection_points(const Lines &lines) +{ + return priv::compute_intersections(lines); +} + +Slic3r::Pointfs Slic3r::intersection_points(const Polygon &polygon) +{ + return priv::compute_intersections(to_lines(polygon)); +} + +Slic3r::Pointfs Slic3r::intersection_points(const Polygons &polygons) +{ + return priv::compute_intersections(to_lines(polygons)); +} + +Slic3r::Pointfs Slic3r::intersection_points(const ExPolygon &expolygon) +{ + return priv::compute_intersections(to_lines(expolygon)); +} + +Slic3r::Pointfs Slic3r::intersection_points(const ExPolygons &expolygons) +{ + return priv::compute_intersections(to_lines(expolygons)); +} + +#endif // USE_CGAL_SWEEP_LINE diff --git a/src/libslic3r/IntersectionPoints.hpp b/src/libslic3r/IntersectionPoints.hpp new file mode 100644 index 00000000000..2b1d3aa7323 --- /dev/null +++ b/src/libslic3r/IntersectionPoints.hpp @@ -0,0 +1,16 @@ +#ifndef slic3r_IntersectionPoints_hpp_ +#define slic3r_IntersectionPoints_hpp_ + +#include "ExPolygon.hpp" + +namespace Slic3r { + +// collect all intersecting points +Pointfs intersection_points(const Lines &lines); +Pointfs intersection_points(const Polygon &polygon); +Pointfs intersection_points(const Polygons &polygons); +Pointfs intersection_points(const ExPolygon &expolygon); +Pointfs intersection_points(const ExPolygons &expolygons); + +} // namespace Slic3r +#endif // slic3r_IntersectionPoints_hpp_ \ No newline at end of file diff --git a/src/libslic3r/JumpPointSearch.cpp b/src/libslic3r/JumpPointSearch.cpp new file mode 100644 index 00000000000..ef3dba45e7c --- /dev/null +++ b/src/libslic3r/JumpPointSearch.cpp @@ -0,0 +1,369 @@ +#include "JumpPointSearch.hpp" +#include "BoundingBox.hpp" +#include "ExPolygon.hpp" +#include "Point.hpp" +#include "libslic3r/AStar.hpp" +#include "libslic3r/KDTreeIndirect.hpp" +#include "libslic3r/Polygon.hpp" +#include "libslic3r/Polyline.hpp" +#include "libslic3r/libslic3r.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//#define DEBUG_FILES +#ifdef DEBUG_FILES +#include "libslic3r/SVG.hpp" +#endif + +namespace Slic3r { + +// execute fn for each pixel on the line. If fn returns false, terminate the iteration +template void dda(coord_t x0, coord_t y0, coord_t x1, coord_t y1, const PointFn &fn) +{ + coord_t dx = abs(x1 - x0); + coord_t dy = abs(y1 - y0); + coord_t x = x0; + coord_t y = y0; + coord_t n = 1 + dx + dy; + coord_t x_inc = (x1 > x0) ? 1 : -1; + coord_t y_inc = (y1 > y0) ? 1 : -1; + coord_t error = dx - dy; + dx *= 2; + dy *= 2; + + for (; n > 0; --n) { + if (!fn(x, y)) return; + + if (error > 0) { + x += x_inc; + error -= dy; + } else { + y += y_inc; + error += dx; + } + } +} + +// will draw the line twice, second time with and offset of 1 in the direction of normal +// may call the fn on the same coordiantes multiple times! +template void double_dda_with_offset(coord_t x0, coord_t y0, coord_t x1, coord_t y1, const PointFn &fn) +{ + Vec2d normal = Point{y1 - y0, x1 - x0}.cast().normalized(); + normal.x() = ceil(normal.x()); + normal.y() = ceil(normal.y()); + Point start_offset = Point(x0, y0) + (normal).cast(); + Point end_offset = Point(x1, y1) + (normal).cast(); + + dda(x0, y0, x1, y1, fn); + dda(start_offset.x(), start_offset.y(), end_offset.x(), end_offset.y(), fn); +} + +template class JPSTracer +{ +public: + // Use incoming_dir [0,0] for starting points, so that all directions are checked from that point + struct Node + { + CellPositionType position; + CellPositionType incoming_dir; + }; + + JPSTracer(CellPositionType target, CellQueryFn is_passable) : target(target), is_passable(is_passable) {} + +private: + CellPositionType target; + CellQueryFn is_passable; // should return boolean whether the cell is passable or not + + CellPositionType find_jump_point(CellPositionType start, CellPositionType forward_dir) const + { + CellPositionType next = start + forward_dir; + while (next != target && is_passable(next) && !(is_jump_point(next, forward_dir))) { next = next + forward_dir; } + + if (is_passable(next)) { + return next; + } else { + return start; + } + } + + bool is_jump_point(CellPositionType pos, CellPositionType forward_dir) const + { + if (abs(forward_dir.x()) + abs(forward_dir.y()) == 2) { + // diagonal + CellPositionType horizontal_check_dir = CellPositionType{forward_dir.x(), 0}; + CellPositionType vertical_check_dir = CellPositionType{0, forward_dir.y()}; + + if (!is_passable(pos - horizontal_check_dir) && is_passable(pos + forward_dir - 2 * horizontal_check_dir)) { return true; } + + if (!is_passable(pos - vertical_check_dir) && is_passable(pos + forward_dir - 2 * vertical_check_dir)) { return true; } + + if (find_jump_point(pos, horizontal_check_dir) != pos) { return true; } + + if (find_jump_point(pos, vertical_check_dir) != pos) { return true; } + + return false; + } else { // horizontal or vertical + CellPositionType side_dir = CellPositionType(forward_dir.y(), forward_dir.x()); + + if (!is_passable(pos + side_dir) && is_passable(pos + forward_dir + side_dir)) { return true; } + + if (!is_passable(pos - side_dir) && is_passable(pos + forward_dir - side_dir)) { return true; } + + return false; + } + } + +public: + template void foreach_reachable(const Node &from, Fn &&fn) const + { + const CellPositionType &pos = from.position; + const CellPositionType &forward_dir = from.incoming_dir; + std::vector dirs_to_check{}; + + if (abs(forward_dir.x()) + abs(forward_dir.y()) == 0) { // special case for starting point + dirs_to_check = all_directions; + } else if (abs(forward_dir.x()) + abs(forward_dir.y()) == 2) { + // diagonal + CellPositionType horizontal_check_dir = CellPositionType{forward_dir.x(), 0}; + CellPositionType vertical_check_dir = CellPositionType{0, forward_dir.y()}; + + if (!is_passable(pos - horizontal_check_dir) && is_passable(pos + forward_dir - 2 * horizontal_check_dir)) { + dirs_to_check.push_back(forward_dir - 2 * horizontal_check_dir); + } + + if (!is_passable(pos - vertical_check_dir) && is_passable(pos + forward_dir - 2 * vertical_check_dir)) { + dirs_to_check.push_back(forward_dir - 2 * vertical_check_dir); + } + + dirs_to_check.push_back(horizontal_check_dir); + dirs_to_check.push_back(vertical_check_dir); + dirs_to_check.push_back(forward_dir); + + } else { // horizontal or vertical + CellPositionType side_dir = CellPositionType(forward_dir.y(), forward_dir.x()); + + if (!is_passable(pos + side_dir) && is_passable(pos + forward_dir + side_dir)) { + dirs_to_check.push_back(forward_dir + side_dir); + } + + if (!is_passable(pos - side_dir) && is_passable(pos + forward_dir - side_dir)) { + dirs_to_check.push_back(forward_dir - side_dir); + } + dirs_to_check.push_back(forward_dir); + } + + for (const CellPositionType &dir : dirs_to_check) { + CellPositionType jp = find_jump_point(pos, dir); + if (jp != pos) fn(Node{jp, dir}); + } + } + + float distance(Node a, Node b) const { return (a.position - b.position).template cast().norm(); } + + float goal_heuristic(Node n) const { return n.position == target ? -1.f : (target - n.position).template cast().norm(); } + + size_t unique_id(Node n) const + { + return (static_cast(uint16_t(n.position.x())) << 16) + static_cast(uint16_t(n.position.y())); + } + + const std::vector all_directions{{1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0}, {-1, -1}, {0, -1}, {1, -1}}; +}; + +void JPSPathFinder::clear() +{ + inpassable.clear(); + max_search_box.max = Pixel(std::numeric_limits::min(), std::numeric_limits::min()); + max_search_box.min = Pixel(std::numeric_limits::max(), std::numeric_limits::max()); + add_obstacles(bed_shape); +} + +void JPSPathFinder::add_obstacles(const Lines &obstacles) +{ + auto store_obstacle = [&](coord_t x, coord_t y) { + max_search_box.max.x() = std::max(max_search_box.max.x(), x); + max_search_box.max.y() = std::max(max_search_box.max.y(), y); + max_search_box.min.x() = std::min(max_search_box.min.x(), x); + max_search_box.min.y() = std::min(max_search_box.min.y(), y); + inpassable.insert(Pixel{x, y}); + return true; + }; + + for (const Line &l : obstacles) { + Pixel start = pixelize(l.a); + Pixel end = pixelize(l.b); + double_dda_with_offset(start.x(), start.y(), end.x(), end.y(), store_obstacle); + } +} + +void JPSPathFinder::add_obstacles(const Layer *layer, const Point &global_origin) +{ + if (layer == nullptr) return; + + this->print_z = layer->print_z; + Lines obstacles; + obstacles.reserve(layer->malformed_lines.size()); + for (const Line &l : layer->malformed_lines) { obstacles.push_back(Line{l.a + global_origin, l.b + global_origin}); } + add_obstacles(obstacles); +} + +Polyline JPSPathFinder::find_path(const Point &p0, const Point &p1) +{ + Pixel start = pixelize(p0); + Pixel end = pixelize(p1); + if (inpassable.empty() || (start - end).cast().norm() < 3.0) { return Polyline{p0, p1}; } + + if (inpassable.find(start) != inpassable.end()) { + dda(start.x(), start.y(), end.x(), end.y(), [&](coord_t x, coord_t y) { + if (inpassable.find(Pixel(x, y)) == inpassable.end() || start == end) { // new start not found yet, and xy passable + start = Pixel(x, y); + return false; + } + return true; + }); + } + + if (inpassable.find(end) != inpassable.end()) { + dda(end.x(), end.y(), start.x(), start.y(), [&](coord_t x, coord_t y) { + if (inpassable.find(Pixel(x, y)) == inpassable.end() || start == end) { // new start not found yet, and xy passable + end = Pixel(x, y); + return false; + } + return true; + }); + } + + BoundingBox search_box = max_search_box; + search_box.max -= Pixel(1, 1); + search_box.min += Pixel(1, 1); + + BoundingBox bounding_square(Points{start, end}); + bounding_square.max += Pixel(5, 5); + bounding_square.min -= Pixel(5, 5); + coord_t bounding_square_size = 2 * std::max(bounding_square.size().x(), bounding_square.size().y()); + bounding_square.max.x() += (bounding_square_size - bounding_square.size().x()) / 2; + bounding_square.min.x() -= (bounding_square_size - bounding_square.size().x()) / 2; + bounding_square.max.y() += (bounding_square_size - bounding_square.size().y()) / 2; + bounding_square.min.y() -= (bounding_square_size - bounding_square.size().y()) / 2; + + // Intersection - limit the search box to a square area around the start and end, to fasten the path searching + search_box.max = search_box.max.cwiseMin(bounding_square.max); + search_box.min = search_box.min.cwiseMax(bounding_square.min); + + auto cell_query = [&](Pixel pixel) { + return search_box.contains(pixel) && (pixel == start || pixel == end || inpassable.find(pixel) == inpassable.end()); + }; + + JPSTracer tracer(end, cell_query); + using QNode = astar::QNode>; + + std::unordered_map astar_cache{}; + std::vector out_path; + std::vector out_nodes; + + if (!astar::search_route(tracer, {start, {0, 0}}, std::back_inserter(out_nodes), astar_cache)) { + // path not found - just reconstruct the best path from astar cache. + // Note that astar_cache is NOT empty - at least the starting point should always be there + auto coordiante_func = [&astar_cache](size_t idx, size_t dim) { return float(astar_cache[idx].node.position[dim]); }; + std::vector keys; + keys.reserve(astar_cache.size()); + for (const auto &pair : astar_cache) { keys.push_back(pair.first); } + KDTreeIndirect<2, float, decltype(coordiante_func)> kd_tree(coordiante_func, keys); + size_t closest_qnode = find_closest_point(kd_tree, end.cast()); + + out_path.push_back(end); + while (closest_qnode != astar::Unassigned) { + out_path.push_back(astar_cache[closest_qnode].node.position); + closest_qnode = astar_cache[closest_qnode].parent; + } + } else { + for (const auto &node : out_nodes) { out_path.push_back(node.position); } + out_path.push_back(start); + } + +#ifdef DEBUG_FILES + auto scaled_points = [](const Points &ps) { + Points r; + for (const Point &p : ps) { r.push_back(Point::new_scale(p.x(), p.y())); } + return r; + }; + auto scaled_point = [](const Point &p) { return Point::new_scale(p.x(), p.y()); }; + ::Slic3r::SVG svg(debug_out_path(("path_jps" + std::to_string(print_z) + "_" + std::to_string(rand() % 1000)).c_str()).c_str(), + BoundingBox(scaled_point(search_box.min), scaled_point(search_box.max))); + for (const auto &p : inpassable) { svg.draw(scaled_point(p), "black", scale_(0.4)); } + for (const auto &qn : astar_cache) { svg.draw(scaled_point(qn.second.node.position), "blue", scale_(0.3)); } + svg.draw(Polyline(scaled_points(out_path)), "yellow", scale_(0.25)); + svg.draw(scaled_point(end), "purple", scale_(0.4)); + svg.draw(scaled_point(start), "green", scale_(0.4)); +#endif + + std::vector tmp_path; + tmp_path.reserve(out_path.size()); + // Some path found, reverse and remove points that do not change direction + std::reverse(out_path.begin(), out_path.end()); + { + tmp_path.push_back(out_path.front()); // first point + for (size_t i = 1; i < out_path.size() - 1; i++) { + if ((out_path[i] - out_path[i - 1]).cast().normalized() != (out_path[i + 1] - out_path[i]).cast().normalized()) { + tmp_path.push_back(out_path[i]); + } + } + tmp_path.push_back(out_path.back()); // last_point + out_path = tmp_path; + } + +#ifdef DEBUG_FILES + svg.draw(Polyline(scaled_points(out_path)), "orange", scale_(0.20)); +#endif + + tmp_path.clear(); + // remove redundant jump points - there are points that change direction but are not needed - this inefficiency arises from the + // usage of grid search The removal alg tries to find the longest Px Px+k path without obstacles. If Px Px+k+1 is blocked, it will + // insert the Px+k point to result and continue search from Px+k + { + tmp_path.push_back(out_path.front()); // first point + size_t index_of_last_stored_point = 0; + for (size_t i = 1; i < out_path.size(); i++) { + if (i - index_of_last_stored_point < 2) continue; + bool passable = true; + auto store_obstacle = [&](coord_t x, coord_t y) { + if (Pixel(x, y) != start && Pixel(x, y) != end && inpassable.find(Pixel(x, y)) != inpassable.end()) { + passable = false; + return false; + } + return true; + }; + dda(tmp_path.back().x(), tmp_path.back().y(), out_path[i].x(), out_path[i].y(), store_obstacle); + if (!passable) { + tmp_path.push_back(out_path[i - 1]); + index_of_last_stored_point = i - 1; + } + } + tmp_path.push_back(out_path.back()); // last_point + out_path = tmp_path; + } + +#ifdef DEBUG_FILES + svg.draw(Polyline(scaled_points(out_path)), "red", scale_(0.15)); + svg.Close(); +#endif + + // before returing the path, transform it from pixels back to points. + // Also replace the first and last pixel by input points so that result path patches input params exactly. + for (Pixel &p : out_path) { p = unpixelize(p); } + out_path.front() = p0; + out_path.back() = p1; + + return Polyline(out_path); +} + +} // namespace Slic3r diff --git a/src/libslic3r/JumpPointSearch.hpp b/src/libslic3r/JumpPointSearch.hpp new file mode 100644 index 00000000000..5f3b5fee21f --- /dev/null +++ b/src/libslic3r/JumpPointSearch.hpp @@ -0,0 +1,38 @@ +#ifndef SRC_LIBSLIC3R_JUMPPOINTSEARCH_HPP_ +#define SRC_LIBSLIC3R_JUMPPOINTSEARCH_HPP_ + +#include "BoundingBox.hpp" +#include "Polygon.hpp" +#include "libslic3r/Layer.hpp" +#include "libslic3r/Point.hpp" +#include "libslic3r/Polyline.hpp" +#include "libslic3r/libslic3r.h" +#include +#include + +namespace Slic3r { + +class JPSPathFinder +{ + using Pixel = Point; + std::unordered_set inpassable; + coordf_t print_z; + BoundingBox max_search_box; + Lines bed_shape; + + const coord_t resolution = scaled(1.5); + Pixel pixelize(const Point &p) { return p / resolution; } + Point unpixelize(const Pixel &p) { return p * resolution; } + +public: + JPSPathFinder() = default; + void init_bed_shape(const Points &bed_shape) { this->bed_shape = (to_lines(Polygon{bed_shape})); }; + void clear(); + void add_obstacles(const Lines &obstacles); + void add_obstacles(const Layer *layer, const Point &global_origin); + Polyline find_path(const Point &start, const Point &end); +}; + +} // namespace Slic3r + +#endif /* SRC_LIBSLIC3R_JUMPPOINTSEARCH_HPP_ */ diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp index d273fde9632..2d113228319 100644 --- a/src/libslic3r/Layer.cpp +++ b/src/libslic3r/Layer.cpp @@ -1,10 +1,14 @@ #include "Layer.hpp" +#include "ClipperZUtils.hpp" #include "ClipperUtils.hpp" +#include "Point.hpp" +#include "Polygon.hpp" #include "Print.hpp" #include "Fill/Fill.hpp" #include "ShortestPath.hpp" #include "SVG.hpp" #include "BoundingBox.hpp" +#include "clipper/clipper.hpp" #include @@ -22,7 +26,7 @@ Layer::~Layer() bool Layer::empty() const { for (const LayerRegion *layerm : m_regions) - if (layerm != nullptr && ! layerm->slices.empty()) + if (layerm != nullptr && ! layerm->slices().empty()) // Non empty layer. return false; return true; @@ -37,32 +41,326 @@ LayerRegion* Layer::add_region(const PrintRegion *print_region) // merge all regions' slices to get islands void Layer::make_slices() { - ExPolygons slices; - if (m_regions.size() == 1) { - // optimization: if we only have one region, take its slices - slices = to_expolygons(m_regions.front()->slices.surfaces); - } else { - Polygons slices_p; - for (LayerRegion *layerm : m_regions) - polygons_append(slices_p, to_polygons(layerm->slices.surfaces)); - slices = union_safety_offset_ex(slices_p); + { + ExPolygons slices; + if (m_regions.size() == 1) { + // optimization: if we only have one region, take its slices + slices = to_expolygons(m_regions.front()->slices().surfaces); + } else { + Polygons slices_p; + for (LayerRegion *layerm : m_regions) + polygons_append(slices_p, to_polygons(layerm->slices().surfaces)); + slices = union_safety_offset_ex(slices_p); + } + // lslices are sorted by topological order from outside to inside from the clipper union used above + this->lslices = slices; } - - this->lslices.clear(); - this->lslices.reserve(slices.size()); - - // prepare ordering points - Points ordering_points; - ordering_points.reserve(slices.size()); - for (const ExPolygon &ex : slices) - ordering_points.push_back(ex.contour.first_point()); - - // sort slices - std::vector order = chain_points(ordering_points); - - // populate slices vector - for (size_t i : order) - this->lslices.emplace_back(std::move(slices[i])); + + this->lslice_indices_sorted_by_print_order = chain_expolygons(this->lslices); +} + +// used by Layer::build_up_down_graph() +[[nodiscard]] static ClipperLib_Z::Paths expolygons_to_zpaths(const ExPolygons &expolygons, coord_t isrc) +{ + size_t num_paths = 0; + for (const ExPolygon &expolygon : expolygons) + num_paths += expolygon.num_contours(); + + ClipperLib_Z::Paths out; + out.reserve(num_paths); + + for (const ExPolygon &expolygon : expolygons) { + for (size_t icontour = 0; icontour < expolygon.num_contours(); ++ icontour) { + const Polygon &contour = expolygon.contour_or_hole(icontour); + out.emplace_back(); + ClipperLib_Z::Path &path = out.back(); + path.reserve(contour.size()); + for (const Point &p : contour.points) + path.push_back({ p.x(), p.y(), isrc }); + } + ++ isrc; + } + + return out; +} + +// used by Layer::build_up_down_graph() +static void connect_layer_slices( + Layer &below, + Layer &above, + const ClipperLib_Z::PolyTree &polytree, + const std::vector> &intersections, + const coord_t offset_below, + const coord_t offset_above +#ifndef NDEBUG + , const coord_t offset_end +#endif // NDEBUG + ) +{ + class Visitor { + public: + Visitor(const std::vector> &intersections, + Layer &below, Layer &above, const coord_t offset_below, const coord_t offset_above +#ifndef NDEBUG + , const coord_t offset_end +#endif // NDEBUG + ) : + m_intersections(intersections), m_below(below), m_above(above), m_offset_below(offset_below), m_offset_above(offset_above) +#ifndef NDEBUG + , m_offset_end(offset_end) +#endif // NDEBUG + {} + + void visit(const ClipperLib_Z::PolyNode &polynode) + { +#ifndef NDEBUG + auto assert_intersection_valid = [this](int i, int j) { + assert(i < j); + assert(i >= m_offset_below); + assert(i < m_offset_above); + assert(j >= m_offset_above); + assert(j < m_offset_end); + return true; + }; +#endif // NDEBUG + if (polynode.Contour.size() >= 3) { + // If there is an intersection point, it should indicate which contours (one from layer below, the other from layer above) intersect. + // Otherwise the contour is fully inside another contour. + int32_t i = -1, j = -1; + for (int icontour = 0; icontour <= polynode.ChildCount(); ++ icontour) { + const ClipperLib_Z::Path &contour = icontour == 0 ? polynode.Contour : polynode.Childs[icontour - 1]->Contour; + if (contour.size() >= 3) { + for (const ClipperLib_Z::IntPoint &pt : contour) { + j = pt.z(); + if (j < 0) { + const auto &intersection = m_intersections[-j - 1]; + assert(intersection.first <= intersection.second); + if (intersection.second < m_offset_above) { + // Ignore intersection of polygons on the 1st layer. + assert(intersection.first >= m_offset_below); + j = i; + } else if (intersection.first >= m_offset_above) { + // Ignore intersection of polygons on the 2nd layer + assert(intersection.second < m_offset_end); + j = i; + } else { + std::tie(i, j) = m_intersections[-j - 1]; + assert(assert_intersection_valid(i, j)); + goto end; + } + } else if (i == -1) { + // First source contour of this expolygon was found. + i = j; + } else if (i != j) { + // Second source contour of this expolygon was found. + if (i > j) + std::swap(i, j); + assert(assert_intersection_valid(i, j)); + goto end; + } + } + } + } + end: + bool found = false; + if (i == -1) { + // This should not happen. It may only happen if the source contours had just self intersections or intersections with contours at the same layer. + assert(false); + } else if (i == j) { + // The contour is completely inside another contour. + Point pt(polynode.Contour.front().x(), polynode.Contour.front().y()); + if (i < m_offset_above) { + // Index of an island below. Look-it up in the island above. + assert(i >= m_offset_below); + i -= m_offset_below; + for (int l = int(m_above.lslices_ex.size()) - 1; l >= 0; -- l) { + LayerSlice &lslice = m_above.lslices_ex[l]; + if (lslice.bbox.contains(pt) && m_above.lslices[l].contains(pt)) { + found = true; + j = l; + assert(i >= 0 && i < m_below.lslices_ex.size()); + assert(j >= 0 && j < m_above.lslices_ex.size()); + break; + } + } + if (!found) { + // The check above might sometimes fail when the polygons overlap only on points, which causes the clipper to detect no intersection. + // The problem happens rarely, mostly on simple polygons (in terms of number of points), but regardless of size! + // example of failing link on two layers, each with single polygon without holes. + // layer A = Polygon{(-24931238,-11153865),(-22504249,-8726874),(-22504249,11477151),(-23261469,12235585),(-23752371,12727276),(-25002495,12727276),(-27502745,10227026),(-27502745,-12727274),(-26504645,-12727274)} + // layer B = Polygon{(-24877897,-11100524),(-22504249,-8726874),(-22504249,11477151),(-23244827,12218916),(-23752371,12727276),(-25002495,12727276),(-27502745,10227026),(-27502745,-12727274),(-26504645,-12727274)} + // note that first point is not identical, and the check above picks (-24877897,-11100524) as the first contour point (polynode.Contour.front()). + // that point is sadly slightly outisde of the layer A, so no link is detected, eventhough they are overlaping "completely" + Polygon contour_poly; + for (const auto& p : polynode.Contour) { + contour_poly.points.emplace_back(p.x(), p.y()); + } + BoundingBox contour_aabb{contour_poly.points}; + for (int l = int(m_above.lslices_ex.size()) - 1; l >= 0; --l) { + LayerSlice &lslice = m_above.lslices_ex[l]; + // it is potentially slow, but should be executed rarely + if (contour_aabb.overlap(lslice.bbox) && !intersection(Polygons{contour_poly}, m_above.lslices[l]).empty()) { + found = true; + j = l; + assert(i >= 0 && i < m_below.lslices_ex.size()); + assert(j >= 0 && j < m_above.lslices_ex.size()); + break; + } + } + } + } else { + // Index of an island above. Look-it up in the island below. + assert(j < m_offset_end); + j -= m_offset_above; + for (int l = int(m_below.lslices_ex.size()) - 1; l >= 0; -- l) { + LayerSlice &lslice = m_below.lslices_ex[l]; + if (lslice.bbox.contains(pt) && m_below.lslices[l].contains(pt)) { + found = true; + i = l; + assert(i >= 0 && i < m_below.lslices_ex.size()); + assert(j >= 0 && j < m_above.lslices_ex.size()); + break; + } + } + if (!found) { // Explanation for aditional check is above. + Polygon contour_poly; + for (const auto &p : polynode.Contour) { + contour_poly.points.emplace_back(p.x(), p.y()); + } + BoundingBox contour_aabb{contour_poly.points}; + for (int l = int(m_below.lslices_ex.size()) - 1; l >= 0; --l) { + LayerSlice &lslice = m_below.lslices_ex[l]; + if (contour_aabb.overlap(lslice.bbox) && !intersection(Polygons{contour_poly}, m_below.lslices[l]).empty()) { + found = true; + i = l; + assert(i >= 0 && i < m_below.lslices_ex.size()); + assert(j >= 0 && j < m_above.lslices_ex.size()); + break; + } + } + } + } + } else { + assert(assert_intersection_valid(i, j)); + i -= m_offset_below; + j -= m_offset_above; + assert(i >= 0 && i < m_below.lslices_ex.size()); + assert(j >= 0 && j < m_above.lslices_ex.size()); + found = true; + } + if (found) { + // Subtract area of holes from the area of outer contour. + double area = ClipperLib_Z::Area(polynode.Contour); + for (int icontour = 0; icontour < polynode.ChildCount(); ++ icontour) + area -= ClipperLib_Z::Area(polynode.Childs[icontour]->Contour); + // Store the links and area into the contours. + LayerSlice::Links &links_below = m_below.lslices_ex[i].overlaps_above; + LayerSlice::Links &links_above = m_above.lslices_ex[j].overlaps_below; + LayerSlice::Link key{ j }; + auto it_below = std::lower_bound(links_below.begin(), links_below.end(), key, [](auto &l, auto &r){ return l.slice_idx < r.slice_idx; }); + if (it_below != links_below.end() && it_below->slice_idx == j) { + it_below->area += area; + } else { + auto it_above = std::lower_bound(links_above.begin(), links_above.end(), key, [](auto &l, auto &r){ return l.slice_idx < r.slice_idx; }); + if (it_above != links_above.end() && it_above->slice_idx == i) { + it_above->area += area; + } else { + // Insert into one of the two vectors. + bool take_below = false; + if (links_below.size() < LayerSlice::LinksStaticSize) + take_below = false; + else if (links_above.size() >= LayerSlice::LinksStaticSize) { + size_t shift_below = links_below.end() - it_below; + size_t shift_above = links_above.end() - it_above; + take_below = shift_below < shift_above; + } + if (take_below) + links_below.insert(it_below, { j, float(area) }); + else + links_above.insert(it_above, { i, float(area) }); + } + } + } + } + for (int i = 0; i < polynode.ChildCount(); ++ i) + for (int j = 0; j < polynode.Childs[i]->ChildCount(); ++ j) + this->visit(*polynode.Childs[i]->Childs[j]); + } + + private: + const std::vector> &m_intersections; + Layer &m_below; + Layer &m_above; + const coord_t m_offset_below; + const coord_t m_offset_above; +#ifndef NDEBUG + const coord_t m_offset_end; +#endif // NDEBUG + } visitor(intersections, below, above, offset_below, offset_above +#ifndef NDEBUG + , offset_end +#endif // NDEBUG + ); + + for (int i = 0; i < polytree.ChildCount(); ++ i) + visitor.visit(*polytree.Childs[i]); + +#ifndef NDEBUG + // Verify that only one directional link is stored: either from bottom slice up or from upper slice down. + for (int32_t islice = 0; islice < below.lslices_ex.size(); ++ islice) { + LayerSlice::Links &links1 = below.lslices_ex[islice].overlaps_above; + for (LayerSlice::Link &link1 : links1) { + LayerSlice::Links &links2 = above.lslices_ex[link1.slice_idx].overlaps_below; + assert(! std::binary_search(links2.begin(), links2.end(), link1, [](auto &l, auto &r){ return l.slice_idx < r.slice_idx; })); + } + } + for (int32_t islice = 0; islice < above.lslices_ex.size(); ++ islice) { + LayerSlice::Links &links1 = above.lslices_ex[islice].overlaps_below; + for (LayerSlice::Link &link1 : links1) { + LayerSlice::Links &links2 = below.lslices_ex[link1.slice_idx].overlaps_above; + assert(! std::binary_search(links2.begin(), links2.end(), link1, [](auto &l, auto &r){ return l.slice_idx < r.slice_idx; })); + } + } +#endif // NDEBUG + + // Scatter the links, but don't sort them yet. + for (int32_t islice = 0; islice < below.lslices_ex.size(); ++ islice) + for (LayerSlice::Link &link : below.lslices_ex[islice].overlaps_above) + above.lslices_ex[link.slice_idx].overlaps_below.push_back({ islice, link.area }); + for (int32_t islice = 0; islice < above.lslices_ex.size(); ++ islice) + for (LayerSlice::Link &link : above.lslices_ex[islice].overlaps_below) + below.lslices_ex[link.slice_idx].overlaps_above.push_back({ islice, link.area }); + // Sort the links. + for (LayerSlice &lslice : below.lslices_ex) + std::sort(lslice.overlaps_above.begin(), lslice.overlaps_above.end(), [](const LayerSlice::Link &l, const LayerSlice::Link &r){ return l.slice_idx < r.slice_idx; }); + for (LayerSlice &lslice : above.lslices_ex) + std::sort(lslice.overlaps_below.begin(), lslice.overlaps_below.end(), [](const LayerSlice::Link &l, const LayerSlice::Link &r){ return l.slice_idx < r.slice_idx; }); +} + +void Layer::build_up_down_graph(Layer& below, Layer& above) +{ + coord_t paths_below_offset = 0; + ClipperLib_Z::Paths paths_below = expolygons_to_zpaths(below.lslices, paths_below_offset); + coord_t paths_above_offset = paths_below_offset + coord_t(below.lslices.size()); + ClipperLib_Z::Paths paths_above = expolygons_to_zpaths(above.lslices, paths_above_offset); +#ifndef NDEBUG + coord_t paths_end = paths_above_offset + coord_t(above.lslices.size()); +#endif // NDEBUG + + ClipperLib_Z::Clipper clipper; + ClipperLib_Z::PolyTree result; + ClipperZUtils::ClipperZIntersectionVisitor::Intersections intersections; + ClipperZUtils::ClipperZIntersectionVisitor visitor(intersections); + clipper.ZFillFunction(visitor.clipper_callback()); + clipper.AddPaths(paths_below, ClipperLib_Z::ptSubject, true); + clipper.AddPaths(paths_above, ClipperLib_Z::ptClip, true); + clipper.Execute(ClipperLib_Z::ctIntersection, result, ClipperLib_Z::pftNonZero, ClipperLib_Z::pftNonZero); + + connect_layer_slices(below, above, result, intersections, paths_below_offset, paths_above_offset +#ifndef NDEBUG + , paths_end +#endif // NDEBUG + ); } static inline bool layer_needs_raw_backup(const Layer *layer) @@ -74,10 +372,10 @@ void Layer::backup_untyped_slices() { if (layer_needs_raw_backup(this)) { for (LayerRegion *layerm : m_regions) - layerm->raw_slices = to_expolygons(layerm->slices.surfaces); + layerm->m_raw_slices = to_expolygons(layerm->slices().surfaces); } else { assert(m_regions.size() == 1); - m_regions.front()->raw_slices.clear(); + m_regions.front()->m_raw_slices.clear(); } } @@ -85,10 +383,10 @@ void Layer::restore_untyped_slices() { if (layer_needs_raw_backup(this)) { for (LayerRegion *layerm : m_regions) - layerm->slices.set(layerm->raw_slices, stInternal); + layerm->m_slices.set(layerm->m_raw_slices, stInternal); } else { assert(m_regions.size() == 1); - m_regions.front()->slices.set(this->lslices, stInternal); + m_regions.front()->m_slices.set(this->lslices, stInternal); } } @@ -101,13 +399,13 @@ void Layer::restore_untyped_slices_no_extra_perimeters() if (layer_needs_raw_backup(this)) { for (LayerRegion *layerm : m_regions) if (! layerm->region().config().extra_perimeters.value) - layerm->slices.set(layerm->raw_slices, stInternal); + layerm->m_slices.set(layerm->m_raw_slices, stInternal); } else { assert(m_regions.size() == 1); LayerRegion *layerm = m_regions.front(); // This optimization is correct, as extra_perimeters are only reused by prepare_infill() with multi-regions. //if (! layerm->region().config().extra_perimeters.value) - layerm->slices.set(this->lslices, stInternal); + layerm->m_slices.set(this->lslices, stInternal); } } @@ -125,7 +423,7 @@ ExPolygons Layer::merged(float offset_scaled) const const PrintRegionConfig &config = layerm->region().config(); // Our users learned to bend Slic3r to produce empty volumes to act as subtracters. Only add the region if it is non-empty. if (config.bottom_solid_layers > 0 || config.top_solid_layers > 0 || config.fill_density > 0. || config.perimeters > 0) - append(polygons, offset(layerm->slices.surfaces, offset_scaled)); + append(polygons, offset(layerm->slices().surfaces, offset_scaled)); } ExPolygons out = union_ex(polygons); if (offset_scaled2 != 0.f) @@ -141,96 +439,428 @@ void Layer::make_perimeters() BOOST_LOG_TRIVIAL(trace) << "Generating perimeters for layer " << this->id(); // keep track of regions whose perimeters we have already generated - std::vector done(m_regions.size(), false); - - for (LayerRegionPtrs::iterator layerm = m_regions.begin(); layerm != m_regions.end(); ++ layerm) - if ((*layerm)->slices.empty()) { - (*layerm)->perimeters.clear(); - (*layerm)->fills.clear(); - (*layerm)->thin_fills.clear(); - } else { - size_t region_id = layerm - m_regions.begin(); - if (done[region_id]) - continue; - BOOST_LOG_TRIVIAL(trace) << "Generating perimeters for layer " << this->id() << ", region " << region_id; - done[region_id] = true; - const PrintRegionConfig &config = (*layerm)->region().config(); - - // find compatible regions - LayerRegionPtrs layerms; - layerms.push_back(*layerm); - for (LayerRegionPtrs::const_iterator it = layerm + 1; it != m_regions.end(); ++it) - if (! (*it)->slices.empty()) { - LayerRegion* other_layerm = *it; - const PrintRegionConfig &other_config = other_layerm->region().config(); - if (config.perimeter_extruder == other_config.perimeter_extruder - && config.perimeters == other_config.perimeters - && config.perimeter_speed == other_config.perimeter_speed - && config.external_perimeter_speed == other_config.external_perimeter_speed - && (config.gap_fill_enabled ? config.gap_fill_speed.value : 0.) == - (other_config.gap_fill_enabled ? other_config.gap_fill_speed.value : 0.) - && config.overhangs == other_config.overhangs - && config.opt_serialize("perimeter_extrusion_width") == other_config.opt_serialize("perimeter_extrusion_width") - && config.thin_walls == other_config.thin_walls - && config.external_perimeters_first == other_config.external_perimeters_first - && config.infill_overlap == other_config.infill_overlap - && config.fuzzy_skin == other_config.fuzzy_skin - && config.fuzzy_skin_thickness == other_config.fuzzy_skin_thickness - && config.fuzzy_skin_point_dist == other_config.fuzzy_skin_point_dist) - { - other_layerm->perimeters.clear(); - other_layerm->fills.clear(); - other_layerm->thin_fills.clear(); - layerms.push_back(other_layerm); - done[it - m_regions.begin()] = true; - } - } - - if (layerms.size() == 1) { // optimization - (*layerm)->fill_surfaces.surfaces.clear(); - (*layerm)->make_perimeters((*layerm)->slices, &(*layerm)->fill_surfaces); - (*layerm)->fill_expolygons = to_expolygons((*layerm)->fill_surfaces.surfaces); - } else { - SurfaceCollection new_slices; - // Use the region with highest infill rate, as the make_perimeters() function below decides on the gap fill based on the infill existence. - LayerRegion *layerm_config = layerms.front(); - { - // group slices (surfaces) according to number of extra perimeters - std::map slices; // extra_perimeters => [ surface, surface... ] - for (LayerRegion *layerm : layerms) { - for (const Surface &surface : layerm->slices.surfaces) - slices[surface.extra_perimeters].emplace_back(surface); - if (layerm->region().config().fill_density > layerm_config->region().config().fill_density) - layerm_config = layerm; - } - // merge the surfaces assigned to each group - for (std::pair &surfaces_with_extra_perimeters : slices) - new_slices.append(offset_ex(surfaces_with_extra_perimeters.second, ClipperSafetyOffset), surfaces_with_extra_perimeters.second.front()); - } - - // make perimeters - SurfaceCollection fill_surfaces; - layerm_config->make_perimeters(new_slices, &fill_surfaces); - - // assign fill_surfaces to each layer - if (!fill_surfaces.surfaces.empty()) { - for (LayerRegionPtrs::iterator l = layerms.begin(); l != layerms.end(); ++l) { - // Separate the fill surfaces. - ExPolygons expp = intersection_ex(fill_surfaces.surfaces, (*l)->slices.surfaces); - (*l)->fill_expolygons = expp; - (*l)->fill_surfaces.set(std::move(expp), fill_surfaces.surfaces.front()); - } - } - } - } + std::vector done(m_regions.size(), false); + std::vector layer_region_ids; + std::vector> perimeter_and_gapfill_ranges; + ExPolygons fill_expolygons; + std::vector fill_expolygons_ranges; + SurfacesPtr surfaces_to_merge; + SurfacesPtr surfaces_to_merge_temp; + + auto layer_region_reset_perimeters = [](LayerRegion &layerm) { + layerm.m_perimeters.clear(); + layerm.m_fills.clear(); + layerm.m_thin_fills.clear(); + layerm.m_fill_expolygons.clear(); + layerm.m_fill_expolygons_bboxes.clear(); + layerm.m_fill_expolygons_composite.clear(); + layerm.m_fill_expolygons_composite_bboxes.clear(); + }; + + // Remove layer islands, remove references to perimeters and fills from these layer islands to LayerRegion ExtrusionEntities. + for (LayerSlice &lslice : this->lslices_ex) + lslice.islands.clear(); + + for (LayerRegionPtrs::iterator layerm = m_regions.begin(); layerm != m_regions.end(); ++ layerm) + if (size_t region_id = layerm - m_regions.begin(); ! done[region_id]) { + layer_region_reset_perimeters(**layerm); + if (! (*layerm)->slices().empty()) { + BOOST_LOG_TRIVIAL(trace) << "Generating perimeters for layer " << this->id() << ", region " << region_id; + done[region_id] = true; + const PrintRegionConfig &config = (*layerm)->region().config(); + + perimeter_and_gapfill_ranges.clear(); + fill_expolygons.clear(); + fill_expolygons_ranges.clear(); + surfaces_to_merge.clear(); + + // find compatible regions + layer_region_ids.clear(); + layer_region_ids.push_back(region_id); + for (LayerRegionPtrs::const_iterator it = layerm + 1; it != m_regions.end(); ++it) + if (! (*it)->slices().empty()) { + LayerRegion* other_layerm = *it; + const PrintRegionConfig &other_config = other_layerm->region().config(); + if (config.perimeter_extruder == other_config.perimeter_extruder + && config.perimeters == other_config.perimeters + && config.perimeter_speed == other_config.perimeter_speed + && config.external_perimeter_speed == other_config.external_perimeter_speed + && (config.gap_fill_enabled ? config.gap_fill_speed.value : 0.) == + (other_config.gap_fill_enabled ? other_config.gap_fill_speed.value : 0.) + && config.overhangs == other_config.overhangs + && config.opt_serialize("perimeter_extrusion_width") == other_config.opt_serialize("perimeter_extrusion_width") + && config.thin_walls == other_config.thin_walls + && config.external_perimeters_first == other_config.external_perimeters_first + && config.infill_overlap == other_config.infill_overlap + && config.fuzzy_skin == other_config.fuzzy_skin + && config.fuzzy_skin_thickness == other_config.fuzzy_skin_thickness + && config.fuzzy_skin_point_dist == other_config.fuzzy_skin_point_dist) + { + layer_region_reset_perimeters(*other_layerm); + layer_region_ids.push_back(it - m_regions.begin()); + done[it - m_regions.begin()] = true; + } + } + + if (layer_region_ids.size() == 1) { // optimization + (*layerm)->make_perimeters((*layerm)->slices(), perimeter_and_gapfill_ranges, fill_expolygons, fill_expolygons_ranges); + this->sort_perimeters_into_islands((*layerm)->slices(), region_id, perimeter_and_gapfill_ranges, std::move(fill_expolygons), fill_expolygons_ranges, layer_region_ids); + } else { + SurfaceCollection new_slices; + // Use the region with highest infill rate, as the make_perimeters() function below decides on the gap fill based on the infill existence. + uint32_t region_id_config = layer_region_ids.front(); + LayerRegion* layerm_config = m_regions[region_id_config]; + { + // Merge slices (surfaces) according to number of extra perimeters. + for (uint32_t region_id : layer_region_ids) { + LayerRegion &layerm = *m_regions[region_id]; + for (const Surface &surface : layerm.slices()) + surfaces_to_merge.emplace_back(&surface); + if (layerm.region().config().fill_density > layerm_config->region().config().fill_density) { + region_id_config = region_id; + layerm_config = &layerm; + } + } + std::sort(surfaces_to_merge.begin(), surfaces_to_merge.end(), [](const Surface *l, const Surface *r){ return l->extra_perimeters < r->extra_perimeters; }); + for (size_t i = 0; i < surfaces_to_merge.size();) { + size_t j = i; + const Surface &first = *surfaces_to_merge[i]; + size_t extra_perimeters = first.extra_perimeters; + for (; j < surfaces_to_merge.size() && surfaces_to_merge[j]->extra_perimeters == extra_perimeters; ++ j) ; + if (i + 1 == j) + // Nothing to merge, just copy. + new_slices.surfaces.emplace_back(*surfaces_to_merge[i]); + else { + surfaces_to_merge_temp.assign(surfaces_to_merge.begin() + i, surfaces_to_merge.begin() + j); + new_slices.append(offset_ex(surfaces_to_merge_temp, ClipperSafetyOffset), first); + } + i = j; + } + } + // make perimeters + layerm_config->make_perimeters(new_slices, perimeter_and_gapfill_ranges, fill_expolygons, fill_expolygons_ranges); + this->sort_perimeters_into_islands(new_slices, region_id_config, perimeter_and_gapfill_ranges, std::move(fill_expolygons), fill_expolygons_ranges, layer_region_ids); + } + } + } BOOST_LOG_TRIVIAL(trace) << "Generating perimeters for layer " << this->id() << " - Done"; } +void Layer::sort_perimeters_into_islands( + // Slices for which perimeters and fill_expolygons were just created. + // The slices may have been created by merging multiple source slices with the same perimeter parameters. + const SurfaceCollection &slices, + // Region where the perimeters, gap fills and fill expolygons are stored. + const uint32_t region_id, + // Perimeters and gap fills produced by the perimeter generator for the slices, + // sorted by the source slices. + const std::vector> &perimeter_and_gapfill_ranges, + // Fill expolygons produced for all source slices above. + ExPolygons &&fill_expolygons, + // Fill expolygon ranges sorted by the source slices. + const std::vector &fill_expolygons_ranges, + // If the current layer consists of multiple regions, then the fill_expolygons above are split by the source LayerRegion surfaces. + const std::vector &layer_region_ids) +{ + assert(perimeter_and_gapfill_ranges.size() == fill_expolygons_ranges.size()); + assert(! layer_region_ids.empty()); + + LayerRegion &this_layer_region = *m_regions[region_id]; + + // Bounding boxes of fill_expolygons. + BoundingBoxes fill_expolygons_bboxes; + fill_expolygons_bboxes.reserve(fill_expolygons.size()); + for (const ExPolygon &expolygon : fill_expolygons) + fill_expolygons_bboxes.emplace_back(get_extents(expolygon)); + + // Take one sample point for each source slice, to be used to sort source slices into layer slices. + // source slice index + its sample. + std::vector> perimeter_slices_queue; + perimeter_slices_queue.reserve(slices.size()); + for (uint32_t islice = 0; islice < uint32_t(slices.size()); ++ islice) { + const std::pair &extrusions = perimeter_and_gapfill_ranges[islice]; + Point sample; + bool sample_set = false; + // Take a sample deep inside its island if available. Infills are usually quite far from the island boundary. + for (uint32_t iexpoly : fill_expolygons_ranges[islice]) + if (const ExPolygon &expoly = fill_expolygons[iexpoly]; ! expoly.empty()) { + sample = expoly.contour.points[expoly.contour.points.size() / 2]; + sample_set = true; + break; + } + if (! sample_set) { + // If there is no infill, take a sample of some inner perimeter. + for (uint32_t iperimeter : extrusions.first) { + const ExtrusionEntity &ee = *this_layer_region.perimeters().entities[iperimeter]; + if (ee.is_collection()) { + for (const ExtrusionEntity *ee2 : dynamic_cast(ee).entities) + if (! ee2->role().is_external()) { + sample = ee2->middle_point(); + sample_set = true; + goto loop_end; + } + } else if (! ee.role().is_external()) { + sample = ee.middle_point(); + sample_set = true; + break; + } + } + loop_end: + if (! sample_set) { + if (! extrusions.second.empty()) { + // If there is no inner perimeter, take a sample of some gap fill extrusion. + sample = this_layer_region.thin_fills().entities[*extrusions.second.begin()]->middle_point(); + sample_set = true; + } + if (! sample_set && ! extrusions.first.empty()) { + // As a last resort, take a sample of some external perimeter. + sample = this_layer_region.perimeters().entities[*extrusions.first.begin()]->middle_point(); + sample_set = true; + } + } + } + // There may be a valid empty island. + // assert(sample_set); + if (sample_set) + perimeter_slices_queue.emplace_back(islice, sample); + } + + // Map of source fill_expolygon into region and fill_expolygon of that region. + // -1: not set + struct RegionWithFillIndex { + int region_id{ -1 }; + int fill_in_region_id{ -1 }; + }; + std::vector map_expolygon_to_region_and_fill; + const bool has_multiple_regions = layer_region_ids.size() > 1; + assert(has_multiple_regions || layer_region_ids.size() == 1); + // assign fill_surfaces to each layer + if (! fill_expolygons.empty()) { + if (has_multiple_regions) { + // Sort the bounding boxes lexicographically. + std::vector fill_expolygons_bboxes_sorted(fill_expolygons_bboxes.size()); + std::iota(fill_expolygons_bboxes_sorted.begin(), fill_expolygons_bboxes_sorted.end(), 0); + std::sort(fill_expolygons_bboxes_sorted.begin(), fill_expolygons_bboxes_sorted.end(), [&fill_expolygons_bboxes](uint32_t lhs, uint32_t rhs){ + const BoundingBox &bbl = fill_expolygons_bboxes[lhs]; + const BoundingBox &bbr = fill_expolygons_bboxes[rhs]; + return bbl.min < bbr.min || (bbl.min == bbr.min && bbl.max < bbr.max); + }); + map_expolygon_to_region_and_fill.assign(fill_expolygons.size(), {}); + for (uint32_t region_idx : layer_region_ids) { + LayerRegion &l = *m_regions[region_idx]; + l.m_fill_expolygons = intersection_ex(l.slices().surfaces, fill_expolygons); + l.m_fill_expolygons_bboxes.reserve(l.fill_expolygons().size()); + for (const ExPolygon &expolygon : l.fill_expolygons()) { + BoundingBox bbox = get_extents(expolygon); + l.m_fill_expolygons_bboxes.emplace_back(bbox); + auto it_bbox = std::lower_bound(fill_expolygons_bboxes_sorted.begin(), fill_expolygons_bboxes_sorted.end(), bbox, [&fill_expolygons_bboxes](uint32_t lhs, const BoundingBox &bbr){ + const BoundingBox &bbl = fill_expolygons_bboxes[lhs]; + return bbl.min < bbr.min || (bbl.min == bbr.min && bbl.max < bbr.max); + }); + if (it_bbox != fill_expolygons_bboxes_sorted.end()) + if (uint32_t fill_id = *it_bbox; fill_expolygons_bboxes[fill_id] == bbox) { + // With a very high probability the two expolygons match exactly. Confirm that. + if (expolygons_match(expolygon, fill_expolygons[fill_id])) { + RegionWithFillIndex &ref = map_expolygon_to_region_and_fill[fill_id]; + // Only one expolygon produced by intersection with LayerRegion surface may match an expolygon of fill_expolygons. + assert(ref.region_id == -1 && ref.fill_in_region_id == -1); + ref.region_id = region_idx; + ref.fill_in_region_id = int(&expolygon - l.fill_expolygons().data()); + } + } + } + } + // Check whether any island contains multiple fills that fall into the same region, but not they are not contiguous. + // If so, sort fills in that particular region so that fills of an island become contiguous. + // Index of a region to sort. + int sort_region_id = -1; + // Temporary vector of fills for reordering. + ExPolygons fills_temp; + // Vector of new positions of the above. + std::vector new_positions; + do { + sort_region_id = -1; + for (size_t source_slice_idx = 0; source_slice_idx < fill_expolygons_ranges.size(); ++ source_slice_idx) + if (ExPolygonRange fill_range = fill_expolygons_ranges[source_slice_idx]; fill_range.size() > 1) { + // More than one expolygon exists for a single island. Check whether they are contiguous inside a single LayerRegion::fill_expolygons() vector. + uint32_t fill_idx = *fill_range.begin(); + if (const int fill_regon_id = map_expolygon_to_region_and_fill[fill_idx].region_id; fill_regon_id != -1) { + int fill_in_region_id = map_expolygon_to_region_and_fill[fill_idx].fill_in_region_id; + bool needs_sorting = false; + for (++ fill_idx; fill_idx != *fill_range.end(); ++ fill_idx) { + if (const RegionWithFillIndex &ref = map_expolygon_to_region_and_fill[fill_idx]; ref.region_id != fill_regon_id) { + // This island has expolygons split among multiple regions. + needs_sorting = false; + break; + } else if (ref.fill_in_region_id != ++ fill_in_region_id) { + // This island has all expolygons stored inside the same region, but not sorted. + needs_sorting = true; + } + } + if (needs_sorting) { + sort_region_id = fill_regon_id; + break; + } + } + } + if (sort_region_id != -1) { + // Reorder fills in region with sort_region index. + LayerRegion &layerm = *m_regions[sort_region_id]; + new_positions.assign(layerm.fill_expolygons().size(), -1); + int last = 0; + for (RegionWithFillIndex &ref : map_expolygon_to_region_and_fill) + if (ref.region_id == sort_region_id) { + new_positions[ref.fill_in_region_id] = last; + ref.fill_in_region_id = last ++; + } + for (auto &new_pos : new_positions) + if (new_pos == -1) + // Not referenced by any map_expolygon_to_region_and_fill. + new_pos = last ++; + // Move just the content of m_fill_expolygons to fills_temp, but don't move the container vector. + auto &fills = layerm.m_fill_expolygons; + assert(last == int(fills.size())); + fills_temp.reserve(fills.size()); + fills_temp.insert(fills_temp.end(), std::make_move_iterator(fills.begin()), std::make_move_iterator(fills.end())); + for (ExPolygon &ex : fills) + ex.clear(); + // Move / reoder the expolygons back into m_fill_expolygons. + for (size_t old_pos = 0; old_pos < new_positions.size(); ++ old_pos) + fills[new_positions[old_pos]] = std::move(fills_temp[old_pos]); + } + } while (sort_region_id != -1); + } else { + this_layer_region.m_fill_expolygons = std::move(fill_expolygons); + this_layer_region.m_fill_expolygons_bboxes = std::move(fill_expolygons_bboxes); + } + } + + auto insert_into_island = [ + // Region where the perimeters, gap fills and fill expolygons are stored. + region_id, + // Whether there are infills with different regions generated for this LayerSlice. + has_multiple_regions, + // Perimeters and gap fills to be sorted into islands. + &perimeter_and_gapfill_ranges, + // Infill regions to be sorted into islands. + &fill_expolygons, &fill_expolygons_bboxes, &fill_expolygons_ranges, + // Mapping of fill_expolygon to region and its infill. + &map_expolygon_to_region_and_fill, + // Output + ®ions = m_regions, &lslices_ex = this->lslices_ex] + (int lslice_idx, int source_slice_idx) { + lslices_ex[lslice_idx].islands.push_back({}); + LayerIsland &island = lslices_ex[lslice_idx].islands.back(); + island.perimeters = LayerExtrusionRange(region_id, perimeter_and_gapfill_ranges[source_slice_idx].first); + island.thin_fills = perimeter_and_gapfill_ranges[source_slice_idx].second; + if (ExPolygonRange fill_range = fill_expolygons_ranges[source_slice_idx]; ! fill_range.empty()) { + if (has_multiple_regions) { + // Check whether the fill expolygons of this island were split into multiple regions. + island.fill_region_id = LayerIsland::fill_region_composite_id; + for (uint32_t fill_idx : fill_range) { + if (const int fill_regon_id = map_expolygon_to_region_and_fill[fill_idx].region_id; + fill_regon_id == -1 || (island.fill_region_id != LayerIsland::fill_region_composite_id && island.fill_region_id != fill_regon_id)) { + island.fill_region_id = LayerIsland::fill_region_composite_id; + break; + } else + island.fill_region_id = fill_regon_id; + } + if (island.fill_expolygons_composite()) { + // They were split, thus store the unsplit "composite" expolygons into the region of perimeters. + LayerRegion &this_layer_region = *regions[region_id]; + auto begin = uint32_t(this_layer_region.fill_expolygons_composite().size()); + this_layer_region.m_fill_expolygons_composite.reserve(this_layer_region.fill_expolygons_composite().size() + fill_range.size()); + std::move(fill_expolygons.begin() + *fill_range.begin(), fill_expolygons.begin() + *fill_range.end(), std::back_inserter(this_layer_region.m_fill_expolygons_composite)); + this_layer_region.m_fill_expolygons_composite_bboxes.insert(this_layer_region.m_fill_expolygons_composite_bboxes.end(), + fill_expolygons_bboxes.begin() + *fill_range.begin(), fill_expolygons_bboxes.begin() + *fill_range.end()); + island.fill_expolygons = ExPolygonRange(begin, uint32_t(this_layer_region.fill_expolygons_composite().size())); + } else { + // All expolygons are stored inside a single LayerRegion in a contiguous range. + island.fill_expolygons = ExPolygonRange( + map_expolygon_to_region_and_fill[*fill_range.begin()].fill_in_region_id, + map_expolygon_to_region_and_fill[*fill_range.end() - 1].fill_in_region_id + 1); + } + } else { + // Layer island is made of one fill region only. + island.fill_expolygons = fill_range; + island.fill_region_id = region_id; + } + } + }; + + // First sort into islands using exact fit. + // Traverse the slices in an increasing order of bounding box size, so that the islands inside another islands are tested first, + // so we can just test a point inside ExPolygon::contour and we may skip testing the holes. + auto point_inside_surface = [&lslices = this->lslices, &lslices_ex = this->lslices_ex](size_t lslice_idx, const Point &point) { + const BoundingBox &bbox = lslices_ex[lslice_idx].bbox; + return point.x() >= bbox.min.x() && point.x() < bbox.max.x() && + point.y() >= bbox.min.y() && point.y() < bbox.max.y() && + // Exact match: Don't just test whether a point is inside the outer contour of an island, + // test also whether the point is not inside some hole of the same expolygon. + // This is unfortunatelly necessary because the point may be inside an expolygon of one of this expolygon's hole + // and missed due to numerical issues. + lslices[lslice_idx].contains(point); + }; + for (int lslice_idx = int(lslices_ex.size()) - 1; lslice_idx >= 0 && ! perimeter_slices_queue.empty(); -- lslice_idx) + for (auto it_source_slice = perimeter_slices_queue.begin(); it_source_slice != perimeter_slices_queue.end(); ++ it_source_slice) + if (point_inside_surface(lslice_idx, it_source_slice->second)) { + insert_into_island(lslice_idx, it_source_slice->first); + if (std::next(it_source_slice) != perimeter_slices_queue.end()) + // Remove the current slice & point pair from the queue. + *it_source_slice = perimeter_slices_queue.back(); + perimeter_slices_queue.pop_back(); + break; + } + if (! perimeter_slices_queue.empty()) { + // If the slice sample was not fitted into any slice using exact fit, try to find a closest island as a last resort. + // This should be a rare event especially if the sample point was taken from infill or inner perimeter, + // however we may land here for external perimeter only islands with fuzzy skin applied. + // Check whether fuzzy skin was enabled and adjust the bounding box accordingly. + const PrintConfig &print_config = this->object()->print()->config(); + const PrintRegionConfig ®ion_config = this_layer_region.region().config(); + const auto bbox_eps = scaled( + EPSILON + print_config.gcode_resolution.value + + (region_config.fuzzy_skin.value == FuzzySkinType::None ? 0. : region_config.fuzzy_skin_thickness.value + //FIXME it looks as if Arachne could extend open lines by fuzzy_skin_point_dist, which does not seem right. + + region_config.fuzzy_skin_point_dist.value)); + auto point_inside_surface_dist2 = + [&lslices = this->lslices, &lslices_ex = this->lslices_ex, bbox_eps] + (const size_t lslice_idx, const Point &point) { + const BoundingBox &bbox = lslices_ex[lslice_idx].bbox; + return + point.x() < bbox.min.x() - bbox_eps || point.x() > bbox.max.x() + bbox_eps || + point.y() < bbox.min.y() - bbox_eps || point.y() > bbox.max.y() + bbox_eps ? + std::numeric_limits::max() : + (lslices[lslice_idx].point_projection(point) - point).cast().squaredNorm(); + }; + for (auto it_source_slice = perimeter_slices_queue.begin(); it_source_slice != perimeter_slices_queue.end(); ++ it_source_slice) { + double d2min = std::numeric_limits::max(); + int lslice_idx_min = -1; + for (int lslice_idx = int(lslices_ex.size()) - 1; lslice_idx >= 0; -- lslice_idx) + if (double d2 = point_inside_surface_dist2(lslice_idx, it_source_slice->second); d2 < d2min) { + d2min = d2; + lslice_idx_min = lslice_idx; + } + if (lslice_idx_min == -1) { + // This should not happen, but Arachne seems to produce a perimeter point far outside its source contour. + // As a last resort, find the closest source contours to the sample point. + for (int lslice_idx = int(lslices_ex.size()) - 1; lslice_idx >= 0; -- lslice_idx) + if (double d2 = (lslices[lslice_idx].point_projection(it_source_slice->second) - it_source_slice->second).cast().squaredNorm(); d2 < d2min) { + d2min = d2; + lslice_idx_min = lslice_idx; + } + } + assert(lslice_idx_min != -1); + insert_into_island(lslice_idx_min, it_source_slice->first); + } + } +} + void Layer::export_region_slices_to_svg(const char *path) const { BoundingBox bbox; for (const auto *region : m_regions) - for (const auto &surface : region->slices.surfaces) + for (const auto &surface : region->slices()) bbox.merge(get_extents(surface.expolygon)); Point legend_size = export_surface_type_legend_to_svg_box_size(); Point legend_pos(bbox.min(0), bbox.max(1)); @@ -239,7 +869,7 @@ void Layer::export_region_slices_to_svg(const char *path) const SVG svg(path, bbox); const float transparency = 0.5f; for (const auto *region : m_regions) - for (const auto &surface : region->slices.surfaces) + for (const auto &surface : region->slices()) svg.draw(surface.expolygon, surface_type_to_color_name(surface.surface_type), transparency); export_surface_type_legend_to_svg(svg, legend_pos); svg.Close(); @@ -256,7 +886,7 @@ void Layer::export_region_fill_surfaces_to_svg(const char *path) const { BoundingBox bbox; for (const auto *region : m_regions) - for (const auto &surface : region->slices.surfaces) + for (const auto &surface : region->slices()) bbox.merge(get_extents(surface.expolygon)); Point legend_size = export_surface_type_legend_to_svg_box_size(); Point legend_pos(bbox.min(0), bbox.max(1)); @@ -265,7 +895,7 @@ void Layer::export_region_fill_surfaces_to_svg(const char *path) const SVG svg(path, bbox); const float transparency = 0.5f; for (const auto *region : m_regions) - for (const auto &surface : region->slices.surfaces) + for (const auto &surface : region->slices()) svg.draw(surface.expolygon, surface_type_to_color_name(surface.surface_type), transparency); export_surface_type_legend_to_svg(svg, legend_pos); svg.Close(); @@ -281,9 +911,9 @@ void Layer::export_region_fill_surfaces_to_svg_debug(const char *name) const BoundingBox get_extents(const LayerRegion &layer_region) { BoundingBox bbox; - if (!layer_region.slices.surfaces.empty()) { - bbox = get_extents(layer_region.slices.surfaces.front()); - for (auto it = layer_region.slices.surfaces.cbegin() + 1; it != layer_region.slices.surfaces.cend(); ++it) + if (! layer_region.slices().empty()) { + bbox = get_extents(layer_region.slices().surfaces.front()); + for (auto it = layer_region.slices().surfaces.cbegin() + 1; it != layer_region.slices().surfaces.cend(); ++ it) bbox.merge(get_extents(*it)); } return bbox; diff --git a/src/libslic3r/Layer.hpp b/src/libslic3r/Layer.hpp index a308ac0b621..b3d071c9d2c 100644 --- a/src/libslic3r/Layer.hpp +++ b/src/libslic3r/Layer.hpp @@ -2,13 +2,17 @@ #define slic3r_Layer_hpp_ #include "libslic3r.h" +#include "BoundingBox.hpp" #include "Flow.hpp" #include "SurfaceCollection.hpp" #include "ExtrusionEntityCollection.hpp" -#include "ExPolygonCollection.hpp" + +#include namespace Slic3r { +class ExPolygon; +using ExPolygons = std::vector; class Layer; using LayerPtrs = std::vector; class LayerRegion; @@ -18,60 +22,133 @@ class PrintObject; namespace FillAdaptive { struct Octree; -}; +} namespace FillLightning { class Generator; }; +// Range of indices, providing support for range based loops. +template +class IndexRange +{ +public: + IndexRange(T ibegin, T iend) : m_begin(ibegin), m_end(iend) {} + IndexRange() = default; + + // Just a bare minimum functionality iterator required by range-for loop. + class Iterator { + public: + T operator*() const { return m_idx; } + bool operator!=(const Iterator &rhs) const { return m_idx != rhs.m_idx; } + void operator++() { ++ m_idx; } + private: + friend class IndexRange; + Iterator(T idx) : m_idx(idx) {} + T m_idx; + }; + + Iterator begin() const { assert(m_begin <= m_end); return Iterator(m_begin); }; + Iterator end() const { assert(m_begin <= m_end); return Iterator(m_end); }; + + bool empty() const { assert(m_begin <= m_end); return m_begin >= m_end; } + T size() const { assert(m_begin <= m_end); return m_end - m_begin; } + +private: + // Index of the first extrusion in LayerRegion. + T m_begin { 0 }; + // Index of the last extrusion in LayerRegion. + T m_end { 0 }; +}; + +using ExtrusionRange = IndexRange; +using ExPolygonRange = IndexRange; + +// Range of extrusions, referencing the source region by an index. +class LayerExtrusionRange : public ExtrusionRange +{ +public: + LayerExtrusionRange(uint32_t iregion, ExtrusionRange extrusion_range) : m_region(iregion), ExtrusionRange(extrusion_range) {} + LayerExtrusionRange() = default; + + // Index of LayerRegion in Layer. + uint32_t region() const { return m_region; }; + +private: + // Index of LayerRegion in Layer. + uint32_t m_region { 0 }; +}; + +// One LayerIsland may be filled with solid fill, sparse fill, top / bottom fill. +static constexpr const size_t LayerExtrusionRangesStaticSize = 3; +using LayerExtrusionRanges = +#ifdef NDEBUG + // To reduce memory allocation in release mode. + boost::container::small_vector; +#else // NDEBUG + // To ease debugging. + std::vector; +#endif // NDEBUG + class LayerRegion { public: - Layer* layer() { return m_layer; } - const Layer* layer() const { return m_layer; } - const PrintRegion& region() const { return *m_region; } + [[nodiscard]] Layer* layer() { return m_layer; } + [[nodiscard]] const Layer* layer() const { return m_layer; } + [[nodiscard]] const PrintRegion& region() const { return *m_region; } // collection of surfaces generated by slicing the original geometry // divided by type top/bottom/internal - SurfaceCollection slices; - // Backed up slices before they are split into top/bottom/internal. - // Only backed up for multi-region layers or layers with elephant foot compensation. - //FIXME Review whether not to simplify the code by keeping the raw_slices all the time. - ExPolygons raw_slices; - - // collection of extrusion paths/loops filling gaps - // These fills are generated by the perimeter generator. - // They are not printed on their own, but they are copied to this->fills during infill generation. - ExtrusionEntityCollection thin_fills; + [[nodiscard]] const SurfaceCollection& slices() const { return m_slices; } // Unspecified fill polygons, used for overhang detection ("ensure vertical wall thickness feature") // and for re-starting of infills. - ExPolygons fill_expolygons; - // collection of surfaces for infill generation - SurfaceCollection fill_surfaces; + [[nodiscard]] const ExPolygons& fill_expolygons() const { return m_fill_expolygons; } + // and their bounding boxes + [[nodiscard]] const BoundingBoxes& fill_expolygons_bboxes() const { return m_fill_expolygons_bboxes; } + // Storage for fill regions produced for a single LayerIsland, of which infill splits into multiple islands. + // Not used for a plain single material print with no infill modifiers. + [[nodiscard]] const ExPolygons& fill_expolygons_composite() const { return m_fill_expolygons_composite; } + // and their bounding boxes + [[nodiscard]] const BoundingBoxes& fill_expolygons_composite_bboxes() const { return m_fill_expolygons_composite_bboxes; } - // collection of expolygons representing the bridged areas (thus not - // needing support material) -// Polygons bridged; + // collection of surfaces generated by slicing the original geometry + // divided by type top/bottom/internal + [[nodiscard]] const SurfaceCollection& fill_surfaces() const { return m_fill_surfaces; } + + // collection of extrusion paths/loops filling gaps + // These fills are generated by the perimeter generator. + // They are not printed on their own, but they are copied to this->fills during infill generation. + [[nodiscard]] const ExtrusionEntityCollection& thin_fills() const { return m_thin_fills; } // collection of polylines representing the unsupported bridge edges - Polylines unsupported_bridge_edges; + [[nodiscard]] const Polylines& unsupported_bridge_edges() const { return m_unsupported_bridge_edges; } // ordered collection of extrusion paths/loops to build all perimeters // (this collection contains only ExtrusionEntityCollection objects) - ExtrusionEntityCollection perimeters; + [[nodiscard]] const ExtrusionEntityCollection& perimeters() const { return m_perimeters; } // ordered collection of extrusion paths to fill surfaces // (this collection contains only ExtrusionEntityCollection objects) - ExtrusionEntityCollection fills; + [[nodiscard]] const ExtrusionEntityCollection& fills() const { return m_fills; } Flow flow(FlowRole role) const; Flow flow(FlowRole role, double layer_height) const; - Flow bridging_flow(FlowRole role) const; + Flow bridging_flow(FlowRole role, bool force_thick_bridges = false) const; void slices_to_fill_surfaces_clipped(); void prepare_fill_surfaces(); - void make_perimeters(const SurfaceCollection &slices, SurfaceCollection* fill_surfaces); + // Produce perimeter extrusions, gap fill extrusions and fill polygons for input slices. + void make_perimeters( + // Input slices for which the perimeters, gap fills and fill expolygons are to be generated. + const SurfaceCollection &slices, + // Ranges of perimeter extrusions and gap fill extrusions per suface, referencing + // newly created extrusions stored at this LayerRegion. + std::vector> &perimeter_and_gapfill_ranges, + // All fill areas produced for all input slices above. + ExPolygons &fill_expolygons, + // Ranges of fill areas above per input slice. + std::vector &fill_expolygons_ranges); void process_external_surfaces(const Layer *lower_layer, const Polygons *lower_layer_covered); double infill_area_threshold() const; // Trim surfaces by trimming polygons. Used by the elephant foot compensation at the 1st layer. @@ -87,20 +164,149 @@ class LayerRegion void export_region_fill_surfaces_to_svg_debug(const char *name) const; // Is there any valid extrusion assigned to this LayerRegion? - bool has_extrusions() const { return ! this->perimeters.entities.empty() || ! this->fills.entities.empty(); } + bool has_extrusions() const { return ! this->perimeters().empty() || ! this->fills().empty(); } protected: friend class Layer; friend class PrintObject; LayerRegion(Layer *layer, const PrintRegion *region) : m_layer(layer), m_region(region) {} - ~LayerRegion() {} + ~LayerRegion() = default; + +private: + // Modifying m_slices + friend std::string fix_slicing_errors(LayerPtrs&, const std::function&); + template + friend void apply_mm_segmentation(PrintObject& print_object, ThrowOnCancel throw_on_cancel); + + Layer *m_layer; + const PrintRegion *m_region; + + // Backed up slices before they are split into top/bottom/internal. + // Only backed up for multi-region layers or layers with elephant foot compensation. + //FIXME Review whether not to simplify the code by keeping the raw_slices all the time. + ExPolygons m_raw_slices; + +//FIXME make m_slices public for unit tests +public: + // collection of surfaces generated by slicing the original geometry + // divided by type top/bottom/internal + SurfaceCollection m_slices; private: - Layer *m_layer; - const PrintRegion *m_region; + // Unspecified fill polygons, used for overhang detection ("ensure vertical wall thickness feature") + // and for re-starting of infills. + ExPolygons m_fill_expolygons; + // and their bounding boxes + BoundingBoxes m_fill_expolygons_bboxes; + // Storage for fill regions produced for a single LayerIsland, of which infill splits into multiple islands. + // Not used for a plain single material print with no infill modifiers. + ExPolygons m_fill_expolygons_composite; + // and their bounding boxes + BoundingBoxes m_fill_expolygons_composite_bboxes; + + // Collection of surfaces for infill generation, created by splitting m_slices by m_fill_expolygons. + SurfaceCollection m_fill_surfaces; + + // Collection of extrusion paths/loops filling gaps + // These fills are generated by the perimeter generator. + // They are not printed on their own, but they are copied to this->fills during infill generation. + ExtrusionEntityCollection m_thin_fills; + + // collection of polylines representing the unsupported bridge edges + Polylines m_unsupported_bridge_edges; + + // ordered collection of extrusion paths/loops to build all perimeters + // (this collection contains only ExtrusionEntityCollection objects) + ExtrusionEntityCollection m_perimeters; + + // ordered collection of extrusion paths to fill surfaces + // (this collection contains only ExtrusionEntityCollection objects) + ExtrusionEntityCollection m_fills; + + // collection of expolygons representing the bridged areas (thus not + // needing support material) +// Polygons bridged; +}; + +// LayerSlice contains one or more LayerIsland objects, +// each LayerIsland containing a set of perimeter extrusions extruded with one particular PrintRegionConfig parameters +// and one or multiple +struct LayerIsland +{ +private: + friend class Layer; + static constexpr const uint32_t fill_region_composite_id = std::numeric_limits::max(); + +public: + // Perimeter extrusions in LayerRegion belonging to this island. + LayerExtrusionRange perimeters; + // Thin fills of the same region as perimeters. Generated by classic perimeter generator, while Arachne puts them into perimeters. + ExtrusionRange thin_fills; + // Infill + gapfill extrusions in LayerRegion belonging to this island. + LayerExtrusionRanges fills; + // Region that is to be filled with the fills above (thin fills, regular fills). + // Pointing to either LayerRegion::fill_expolygons() or LayerRegion::fill_expolygons_composite() + // based on this->fill_expolygons_composite() flag. + ExPolygonRange fill_expolygons; + // Index of LayerRegion with LayerRegion::fill_expolygons() if not fill_expolygons_composite(). + uint32_t fill_region_id; + bool fill_expolygons_composite() const { return this->fill_region_id == fill_region_composite_id; } + // Centroid of this island used for path planning. +// Point centroid; + + bool has_extrusions() const { return ! this->perimeters.empty() || ! this->fills.empty(); } + + void add_fill_range(const LayerExtrusionRange &new_fill_range) { + // Compress ranges. + if (! this->fills.empty() && this->fills.back().region() == new_fill_range.region() && *this->fills.back().end() == *new_fill_range.begin()) + this->fills.back() = { new_fill_range.region(), { *this->fills.back().begin(), *new_fill_range.end() } }; + else + this->fills.push_back(new_fill_range); + } }; +static constexpr const size_t LayerIslandsStaticSize = 1; +using LayerIslands = +#ifdef NDEBUG + // To reduce memory allocation in release mode. + boost::container::small_vector; +#else // NDEBUG + // To ease debugging. + std::vector; +#endif // NDEBUG + +// One connected island of a layer. LayerSlice may consist of one or more LayerIslands. +struct LayerSlice +{ + struct Link { + int32_t slice_idx; + float area; + }; + static constexpr const size_t LinksStaticSize = 4; + using Links = +#ifdef NDEBUG + // To reduce memory allocation in release mode. + boost::container::small_vector; +#else // NDEBUG + // To ease debugging. + std::vector; +#endif // NDEBUG + + BoundingBox bbox; + Links overlaps_above; + Links overlaps_below; + // One island for each region or region set that generates its own perimeters. + // For multi-material prints or prints with regions of different perimeter parameters, + // a LayerSlice may be split into multiple LayerIslands. + // For most prints there will be just one island. + LayerIslands islands; + + bool has_extrusions() const { for (const LayerIsland &island : islands) if (island.has_extrusions()) return true; return false; } +}; + +using LayerSlices = std::vector; + class Layer { public: @@ -112,12 +318,15 @@ class Layer Layer *upper_layer; Layer *lower_layer; - bool slicing_errors; +// bool slicing_errors; coordf_t slice_z; // Z used for slicing in unscaled coordinates coordf_t print_z; // Z used for printing in unscaled coordinates coordf_t height; // layer height in unscaled coordinates coordf_t bottom_z() const { return this->print_z - this->height; } + //Extrusions estimated to be seriously malformed, estimated during "Estimating curled extrusions" step. These lines should be avoided during fast travels. + Lines malformed_lines; + // Collection of expolygons generated by slicing the possibly multiple meshes of the source geometry // (with possibly differing extruder ID and slicing parameters) and merged. // For the first layer, if the Elephant foot compensation is applied, this lslice is uncompensated, therefore @@ -126,8 +335,9 @@ class Layer // order will be applied by the G-code generator to the extrusions fitting into these lslices. // These lslices are also used to detect overhangs and overlaps between successive layers, therefore it is important // that the 1st lslice is not compensated by the Elephant foot compensation algorithm. - ExPolygons lslices; - std::vector lslices_bboxes; + ExPolygons lslices; + std::vector lslice_indices_sorted_by_print_order; + LayerSlices lslices_ex; size_t region_count() const { return m_regions.size(); } const LayerRegion* get_region(int idx) const { return m_regions[idx]; } @@ -137,6 +347,8 @@ class Layer // Test whether whether there are any slices assigned to this layer. bool empty() const; void make_slices(); + // After creating the slices on all layers, chain the islands overlapping in Z. + static void build_up_down_graph(Layer &below, Layer &above); // Backup and restore raw sliced regions if needed. //FIXME Review whether not to simplify the code by keeping the raw_slices all the time. void backup_untyped_slices(); @@ -146,17 +358,22 @@ class Layer // Slices merged into islands, to be used by the elephant foot compensation to trim the individual surfaces with the shrunk merged slices. ExPolygons merged(float offset) const; template bool any_internal_region_slice_contains(const T &item) const { - for (const LayerRegion *layerm : m_regions) if (layerm->slices.any_internal_contains(item)) return true; + for (const LayerRegion *layerm : m_regions) if (layerm->slices().any_internal_contains(item)) return true; return false; } template bool any_bottom_region_slice_contains(const T &item) const { - for (const LayerRegion *layerm : m_regions) if (layerm->slices.any_bottom_contains(item)) return true; + for (const LayerRegion *layerm : m_regions) if (layerm->slices().any_bottom_contains(item)) return true; return false; } void make_perimeters(); // Phony version of make_fills() without parameters for Perl integration only. void make_fills() { this->make_fills(nullptr, nullptr, nullptr); } - void make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive::Octree* support_fill_octree, FillLightning::Generator* lightning_generator); + void make_fills(FillAdaptive::Octree *adaptive_fill_octree, + FillAdaptive::Octree *support_fill_octree, + FillLightning::Generator *lightning_generator); + Polylines generate_sparse_infill_polylines_for_anchoring(FillAdaptive::Octree *adaptive_fill_octree, + FillAdaptive::Octree *support_fill_octree, + FillLightning::Generator* lightning_generator) const; void make_ironing(); void export_region_slices_to_svg(const char *path) const; @@ -167,6 +384,7 @@ class Layer // Is there any valid extrusion assigned to this LayerRegion? virtual bool has_extrusions() const { for (auto layerm : m_regions) if (layerm->has_extrusions()) return true; return false; } +// virtual bool has_extrusions() const { for (const LayerSlice &lslice : lslices_ex) if (lslice.has_extrusions()) return true; return false; } protected: friend class PrintObject; @@ -174,12 +392,31 @@ class Layer friend std::string fix_slicing_errors(LayerPtrs&, const std::function&); Layer(size_t id, PrintObject *object, coordf_t height, coordf_t print_z, coordf_t slice_z) : - upper_layer(nullptr), lower_layer(nullptr), slicing_errors(false), + upper_layer(nullptr), lower_layer(nullptr), + //slicing_errors(false), slice_z(slice_z), print_z(print_z), height(height), m_id(id), m_object(object) {} virtual ~Layer(); + // Clear fill extrusions, remove them from layer islands. + void clear_fills(); private: + void sort_perimeters_into_islands( + // Slices for which perimeters and fill_expolygons were just created. + // The slices may have been created by merging multiple source slices with the same perimeter parameters. + const SurfaceCollection &slices, + // Region where the perimeters, gap fills and fill expolygons are stored. + const uint32_t region_id, + // Perimeters and gap fills produced by the perimeter generator for the slices, + // sorted by the source slices. + const std::vector> &perimeter_and_gapfill_ranges, + // Fill expolygons produced for all source slices above. + ExPolygons &&fill_expolygons, + // Fill expolygon ranges sorted by the source slices. + const std::vector &fill_expolygons_ranges, + // If the current layer consists of multiple regions, then the fill_expolygons above are split by the source LayerRegion surfaces. + const std::vector &layer_region_ids); + // Sequential index of layer, 0-based, offsetted by number of raft layers. size_t m_id; PrintObject *m_object; @@ -191,7 +428,9 @@ class SupportLayer : public Layer public: // Polygons covered by the supports: base, interface and contact areas. // Used to suppress retraction if moving for a support extrusion over these support_islands. - ExPolygonCollection support_islands; + ExPolygons support_islands; + // Slightly inflated bounding boxes of the above, for faster intersection query. + BoundingBoxes support_islands_bboxes; // Extrusion paths for the support base and for the support interface and contacts. ExtrusionEntityCollection support_fills; diff --git a/src/libslic3r/LayerRegion.cpp b/src/libslic3r/LayerRegion.cpp index 1996a58b573..d722f1e9ceb 100644 --- a/src/libslic3r/LayerRegion.cpp +++ b/src/libslic3r/LayerRegion.cpp @@ -1,3 +1,4 @@ +#include "ExPolygon.hpp" #include "Layer.hpp" #include "BridgeDetector.hpp" #include "ClipperUtils.hpp" @@ -7,6 +8,7 @@ #include "Surface.hpp" #include "BoundingBox.hpp" #include "SVG.hpp" +#include "Algorithm/RegionExpansion.hpp" #include #include @@ -25,12 +27,12 @@ Flow LayerRegion::flow(FlowRole role, double layer_height) const return m_region->flow(*m_layer->object(), role, layer_height, m_layer->id() == 0); } -Flow LayerRegion::bridging_flow(FlowRole role) const +Flow LayerRegion::bridging_flow(FlowRole role, bool force_thick_bridges) const { const PrintRegion ®ion = this->region(); const PrintRegionConfig ®ion_config = region.config(); const PrintObject &print_object = *this->layer()->object(); - if (print_object.config().thick_bridges) { + if (print_object.config().thick_bridges || force_thick_bridges) { // The old Slic3r way (different from all other slicers): Use rounded extrusions. // Get the configured nozzle_diameter for the extruder associated to the flow role requested. // Here this->extruder(role) - 1 may underflow to MAX_INT, but then the get_at() will follback to zero'th element, so everything is all right. @@ -43,30 +45,41 @@ Flow LayerRegion::bridging_flow(FlowRole role) const } } -// Fill in layerm->fill_surfaces by trimming the layerm->slices by the cummulative layerm->fill_surfaces. +// Fill in layerm->fill_surfaces by trimming the layerm->slices by layerm->fill_expolygons. void LayerRegion::slices_to_fill_surfaces_clipped() { - // Note: this method should be idempotent, but fill_surfaces gets modified - // in place. However we're now only using its boundaries (which are invariant) - // so we're safe. This guarantees idempotence of prepare_infill() also in case - // that combine_infill() turns some fill_surface into VOID surfaces. // Collect polygons per surface type. - std::array by_surface; - for (Surface &surface : this->slices.surfaces) + std::array, size_t(stCount)> by_surface; + for (const Surface &surface : this->slices()) by_surface[size_t(surface.surface_type)].emplace_back(&surface); // Trim surfaces by the fill_boundaries. - this->fill_surfaces.surfaces.clear(); + m_fill_surfaces.surfaces.clear(); for (size_t surface_type = 0; surface_type < size_t(stCount); ++ surface_type) { - const SurfacesPtr &this_surfaces = by_surface[surface_type]; + const std::vector &this_surfaces = by_surface[surface_type]; if (! this_surfaces.empty()) - this->fill_surfaces.append(intersection_ex(this_surfaces, this->fill_expolygons), SurfaceType(surface_type)); + m_fill_surfaces.append(intersection_ex(this_surfaces, this->fill_expolygons()), SurfaceType(surface_type)); } } -void LayerRegion::make_perimeters(const SurfaceCollection &slices, SurfaceCollection* fill_surfaces) +// Produce perimeter extrusions, gap fill extrusions and fill polygons for input slices. +void LayerRegion::make_perimeters( + // Input slices for which the perimeters, gap fills and fill expolygons are to be generated. + const SurfaceCollection &slices, + // Ranges of perimeter extrusions and gap fill extrusions per suface, referencing + // newly created extrusions stored at this LayerRegion. + std::vector> &perimeter_and_gapfill_ranges, + // All fill areas produced for all input slices above. + ExPolygons &fill_expolygons, + // Ranges of fill areas above per input slice. + std::vector &fill_expolygons_ranges) { - this->perimeters.clear(); - this->thin_fills.clear(); + m_perimeters.clear(); + m_thin_fills.clear(); + + perimeter_and_gapfill_ranges.reserve(perimeter_and_gapfill_ranges.size() + slices.size()); + // There may be more expolygons produced per slice, thus this reserve is conservative. + fill_expolygons.reserve(fill_expolygons.size() + slices.size()); + fill_expolygons_ranges.reserve(fill_expolygons_ranges.size() + slices.size()); const PrintConfig &print_config = this->layer()->object()->print()->config(); const PrintRegionConfig ®ion_config = this->region().config(); @@ -76,37 +89,328 @@ void LayerRegion::make_perimeters(const SurfaceCollection &slices, SurfaceCollec (this->layer()->id() >= size_t(region_config.bottom_solid_layers.value) && this->layer()->print_z >= region_config.bottom_solid_min_thickness - EPSILON); - PerimeterGenerator g( - // input: - &slices, + PerimeterGenerator::Parameters params( this->layer()->height, + int(this->layer()->id()), this->flow(frPerimeter), - ®ion_config, - &this->layer()->object()->config(), - &print_config, - spiral_vase, - - // output: - &this->perimeters, - &this->thin_fills, - fill_surfaces + this->flow(frExternalPerimeter), + this->bridging_flow(frPerimeter), + this->flow(frSolidInfill), + region_config, + this->layer()->object()->config(), + print_config, + spiral_vase ); - - if (this->layer()->lower_layer != nullptr) - // Cummulative sum of polygons over all the regions. - g.lower_slices = &this->layer()->lower_layer->lslices; - - g.layer_id = (int)this->layer()->id(); - g.ext_perimeter_flow = this->flow(frExternalPerimeter); - g.overhang_flow = this->bridging_flow(frPerimeter); - g.solid_infill_flow = this->flow(frSolidInfill); - - if (this->layer()->object()->config().perimeter_generator.value == PerimeterGeneratorType::Arachne && !spiral_vase) - g.process_arachne(); - else - g.process_classic(); + + // Cummulative sum of polygons over all the regions. + const ExPolygons *lower_slices = this->layer()->lower_layer ? &this->layer()->lower_layer->lslices : nullptr; + // Cache for offsetted lower_slices + Polygons lower_layer_polygons_cache; + + for (const Surface &surface : slices) { + auto perimeters_begin = uint32_t(m_perimeters.size()); + auto gap_fills_begin = uint32_t(m_thin_fills.size()); + auto fill_expolygons_begin = uint32_t(fill_expolygons.size()); + if (this->layer()->object()->config().perimeter_generator.value == PerimeterGeneratorType::Arachne && !spiral_vase) + PerimeterGenerator::process_arachne( + // input: + params, + surface, + lower_slices, + lower_layer_polygons_cache, + // output: + m_perimeters, + m_thin_fills, + fill_expolygons); + else + PerimeterGenerator::process_classic( + // input: + params, + surface, + lower_slices, + lower_layer_polygons_cache, + // output: + m_perimeters, + m_thin_fills, + fill_expolygons); + perimeter_and_gapfill_ranges.emplace_back( + ExtrusionRange{ perimeters_begin, uint32_t(m_perimeters.size()) }, + ExtrusionRange{ gap_fills_begin, uint32_t(m_thin_fills.size()) }); + fill_expolygons_ranges.emplace_back(ExtrusionRange{ fill_expolygons_begin, uint32_t(fill_expolygons.size()) }); + } +} + +#if 1 + +// Extract surfaces of given type from surfaces, extract fill (layer) thickness of one of the surfaces. +static ExPolygons fill_surfaces_extract_expolygons(Surfaces &surfaces, SurfaceType surface_type, double &thickness) +{ + size_t cnt = 0; + for (const Surface &surface : surfaces) + if (surface.surface_type == surface_type) { + ++ cnt; + thickness = surface.thickness; + } + if (cnt == 0) + return {}; + + ExPolygons out; + out.reserve(cnt); + for (Surface &surface : surfaces) + if (surface.surface_type == surface_type) + out.emplace_back(std::move(surface.expolygon)); + return out; +} + +// Extract bridging surfaces from "surfaces", expand them into "shells" using expansion_params, +// detect bridges. +// Trim "shells" by the expanded bridges. +Surfaces expand_bridges_detect_orientations( + Surfaces &surfaces, + ExPolygons &shells, + const Algorithm::RegionExpansionParameters &expansion_params) +{ + using namespace Slic3r::Algorithm; + + double thickness; + ExPolygons bridges_ex = fill_surfaces_extract_expolygons(surfaces, stBottomBridge, thickness); + if (bridges_ex.empty()) + return {}; + + // Calculate bridge anchors and their expansions in their respective shell region. + WaveSeeds bridge_anchors = wave_seeds(bridges_ex, shells, expansion_params.tiny_expansion, true); + std::vector bridge_expansions = propagate_waves_ex(bridge_anchors, shells, expansion_params); + + // Cache for detecting bridge orientation and merging regions with overlapping expansions. + struct Bridge { + ExPolygon expolygon; + uint32_t group_id; + std::vector::const_iterator bridge_expansion_begin; + double angle = -1; + }; + std::vector bridges; + { + bridges.reserve(bridges_ex.size()); + uint32_t group_id = 0; + for (ExPolygon &ex : bridges_ex) + bridges.push_back({ std::move(ex), group_id ++, bridge_expansions.end() }); + bridges_ex.clear(); + } + + // Group the bridge surfaces by overlaps. + auto group_id = [&bridges](uint32_t src_id) { + uint32_t group_id = bridges[src_id].group_id; + while (group_id != src_id) { + src_id = group_id; + group_id = bridges[src_id].group_id; + } + bridges[src_id].group_id = group_id; + return group_id; + }; + + { + // Cache of bboxes per expansion boundary. + std::vector bboxes; + // Detect overlaps of bridge anchors inside their respective shell regions. + // bridge_expansions are sorted by boundary id and source id. + for (auto it = bridge_expansions.begin(); it != bridge_expansions.end();) { + // For each boundary region: + auto it_begin = it; + auto it_end = std::next(it_begin); + for (; it_end != bridge_expansions.end() && it_end->boundary_id == it_begin->boundary_id; ++ it_end) ; + bboxes.clear(); + bboxes.reserve(it_end - it_begin); + for (auto it2 = it_begin; it2 != it_end; ++ it2) + bboxes.emplace_back(get_extents(it2->expolygon.contour)); + // For each bridge anchor of the current source: + for (; it != it_end; ++ it) { + // A grup id for this bridge. + for (auto it2 = std::next(it); it2 != it_end; ++ it2) + if (it->src_id != it2->src_id && + bboxes[it - it_begin].overlap(bboxes[it2 - it_begin]) && + // One may ignore holes, they are irrelevant for intersection test. + ! intersection(it->expolygon.contour, it2->expolygon.contour).empty()) { + // The two bridge regions intersect. Give them the same group id. + uint32_t id = group_id(it->src_id); + uint32_t id2 = group_id(it2->src_id); + bridges[it->src_id].group_id = bridges[it2->src_id].group_id = std::min(id, id2); + } + } + } + } + + // Detect bridge directions. + { + std::sort(bridge_anchors.begin(), bridge_anchors.end(), Algorithm::lower_by_src_and_boundary); + auto it_bridge_anchor = bridge_anchors.begin(); + Lines lines; + Polygons anchor_areas; + for (uint32_t bridge_id = 0; bridge_id < uint32_t(bridges.size()); ++ bridge_id) { + Bridge &bridge = bridges[bridge_id]; +// lines.clear(); + anchor_areas.clear(); + int32_t last_anchor_id = -1; + for (; it_bridge_anchor != bridge_anchors.end() && it_bridge_anchor->src == bridge_id; ++ it_bridge_anchor) { + if (last_anchor_id != int(it_bridge_anchor->boundary)) { + last_anchor_id = int(it_bridge_anchor->boundary); + append(anchor_areas, to_polygons(shells[last_anchor_id])); + } +// if (Points &polyline = it_bridge_anchor->path; polyline.size() >= 2) { +// reserve_more_power_of_2(lines, polyline.size() - 1); +// for (size_t i = 1; i < polyline.size(); ++ i) +// lines.push_back({ polyline[i - 1], polyline[1] }); +// } + } + lines = to_lines(diff_pl(to_polylines(bridge.expolygon), expand(anchor_areas, float(SCALED_EPSILON)))); + auto [bridging_dir, unsupported_dist] = detect_bridging_direction(lines, to_polygons(bridge.expolygon)); + bridge.angle = M_PI + std::atan2(bridging_dir.y(), bridging_dir.x()); + // #if 1 + // coordf_t stroke_width = scale_(0.06); + // BoundingBox bbox = get_extents(initial); + // bbox.offset(scale_(1.)); + // ::Slic3r::SVG + // svg(debug_out_path(("bridge"+std::to_string(bridges[idx_last].bridge_angle)+"_"+std::to_string(this->layer()->bottom_z())).c_str()), + // bbox); + + // svg.draw(initial, "cyan"); + // svg.draw(to_lines(lower_layer->lslices), "green", stroke_width); + // #endif + } + } + + // Merge the groups with the same group id, produce surfaces by merging source overhangs with their newly expanded anchors. + Surfaces out; + { + Polygons acc; + Surface templ{ stBottomBridge, {} }; + std::sort(bridge_expansions.begin(), bridge_expansions.end(), [](auto &l, auto &r) { + return l.src_id < r.src_id || (l.src_id == r.src_id && l.boundary_id < r.boundary_id); + }); + for (auto it = bridge_expansions.begin(); it != bridge_expansions.end(); ) { + bridges[it->src_id].bridge_expansion_begin = it; + uint32_t src_id = it->src_id; + for (++ it; it != bridge_expansions.end() && it->src_id == src_id; ++ it) ; + } + for (uint32_t bridge_id = 0; bridge_id < uint32_t(bridges.size()); ++ bridge_id) + if (group_id(bridge_id) == bridge_id) { + // Head of the group. + acc.clear(); + for (uint32_t bridge_id2 = bridge_id; bridge_id2 < uint32_t(bridges.size()); ++ bridge_id2) + if (group_id(bridge_id2) == bridge_id) { + append(acc, to_polygons(std::move(bridges[bridge_id2].expolygon))); + auto it_bridge_expansion = bridges[bridge_id2].bridge_expansion_begin; + assert(it_bridge_expansion == bridge_expansions.end() || it_bridge_expansion->src_id == bridge_id2); + for (; it_bridge_expansion != bridge_expansions.end() && it_bridge_expansion->src_id == bridge_id2; ++ it_bridge_expansion) + append(acc, to_polygons(std::move(it_bridge_expansion->expolygon))); + } + //FIXME try to be smart and pick the best bridging angle for all? + templ.bridge_angle = bridges[bridge_id].angle; + // without safety offset, artifacts are generated (GH #2494) + for (ExPolygon &ex : union_safety_offset_ex(acc)) + out.emplace_back(templ, std::move(ex)); + } + } + + // Clip the shells by the expanded bridges. + shells = diff_ex(shells, out); + return out; +} + +// Extract bridging surfaces from "surfaces", expand them into "shells" using expansion_params. +// Trim "shells" by the expanded bridges. +static Surfaces expand_merge_surfaces( + Surfaces &surfaces, + SurfaceType surface_type, + ExPolygons &shells, + const Algorithm::RegionExpansionParameters ¶ms, + const double bridge_angle = -1.) +{ + double thickness; + ExPolygons src = fill_surfaces_extract_expolygons(surfaces, surface_type, thickness); + if (src.empty()) + return {}; + + std::vector expanded = expand_merge_expolygons(std::move(src), shells, params); + // Trim the shells by the expanded expolygons. + shells = diff_ex(shells, expanded); + + Surface templ{ surface_type, {} }; + templ.bridge_angle = bridge_angle; + Surfaces out; + out.reserve(expanded.size()); + for (auto &expoly : expanded) + out.emplace_back(templ, std::move(expoly)); + return out; } +void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Polygons *lower_layer_covered) +{ +#ifdef SLIC3R_DEBUG_SLICE_PROCESSING + export_region_fill_surfaces_to_svg_debug("4_process_external_surfaces-initial"); +#endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ + + // Width of the perimeters. + float shell_width = 0; + if (int num_perimeters = this->region().config().perimeters; num_perimeters > 0) { + Flow external_perimeter_flow = this->flow(frExternalPerimeter); + Flow perimeter_flow = this->flow(frPerimeter); + shell_width += 0.5f * external_perimeter_flow.scaled_width() + external_perimeter_flow.scaled_spacing(); + shell_width += perimeter_flow.scaled_spacing() * (num_perimeters - 1); + } else { + // TODO: Maybe there is better solution when printing with zero perimeters, but this works reasonably well, given the situation + shell_width = float(SCALED_EPSILON); + } + + // Scaled expansions of the respective external surfaces. + float expansion_top = shell_width * sqrt(2.); + float expansion_bottom = expansion_top; + float expansion_bottom_bridge = expansion_top; + // Expand by waves of expansion_step size (expansion_step is scaled), but with no more steps than max_nr_expansion_steps. + static constexpr const float expansion_step = scaled(0.1); + // Don't take more than max_nr_steps for small expansion_step. + static constexpr const size_t max_nr_expansion_steps = 5; + + // Expand the top / bottom / bridge surfaces into the shell thickness solid infills. + double layer_thickness; + ExPolygons shells = union_ex(fill_surfaces_extract_expolygons(m_fill_surfaces.surfaces, stInternalSolid, layer_thickness)); + + SurfaceCollection bridges; + { + BOOST_LOG_TRIVIAL(trace) << "Processing external surface, detecting bridges. layer" << this->layer()->print_z; + const double custom_angle = this->region().config().bridge_angle.value; + const auto params = Algorithm::RegionExpansionParameters::build(expansion_bottom_bridge, expansion_step, max_nr_expansion_steps); + bridges.surfaces = custom_angle > 0 ? + expand_merge_surfaces(m_fill_surfaces.surfaces, stBottomBridge, shells, params, Geometry::deg2rad(custom_angle)) : + expand_bridges_detect_orientations(m_fill_surfaces.surfaces, shells, params); + BOOST_LOG_TRIVIAL(trace) << "Processing external surface, detecting bridges - done"; +#if 0 + { + static int iRun = 0; + bridges.export_to_svg(debug_out_path("bridges-after-grouping-%d.svg", iRun++), true); + } +#endif + } + + Surfaces bottoms = expand_merge_surfaces(m_fill_surfaces.surfaces, stBottom, shells, + Algorithm::RegionExpansionParameters::build(expansion_bottom, expansion_step, max_nr_expansion_steps)); + Surfaces tops = expand_merge_surfaces(m_fill_surfaces.surfaces, stTop, shells, + Algorithm::RegionExpansionParameters::build(expansion_top, expansion_step, max_nr_expansion_steps)); + + m_fill_surfaces.remove_types({ stBottomBridge, stBottom, stTop, stInternalSolid }); + reserve_more(m_fill_surfaces.surfaces, shells.size() + bridges.size() + bottoms.size() + tops.size()); + Surface solid_templ(stInternalSolid, {}); + solid_templ.thickness = layer_thickness; + m_fill_surfaces.append(std::move(shells), solid_templ); + m_fill_surfaces.append(std::move(bridges.surfaces)); + m_fill_surfaces.append(std::move(bottoms)); + m_fill_surfaces.append(std::move(tops)); + +#ifdef SLIC3R_DEBUG_SLICE_PROCESSING + export_region_fill_surfaces_to_svg_debug("4_process_external_surfaces-final"); +#endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ +} +#else + //#define EXTERNAL_SURFACES_OFFSET_PARAMETERS ClipperLib::jtMiter, 3. //#define EXTERNAL_SURFACES_OFFSET_PARAMETERS ClipperLib::jtMiter, 1.5 #define EXTERNAL_SURFACES_OFFSET_PARAMETERS ClipperLib::jtSquare, 0. @@ -114,10 +418,11 @@ void LayerRegion::make_perimeters(const SurfaceCollection &slices, SurfaceCollec void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Polygons *lower_layer_covered) { const bool has_infill = this->region().config().fill_density.value > 0.; - const float margin = float(scale_(EXTERNAL_INFILL_MARGIN)); +// const float margin = scaled(0.1); // float(scale_(EXTERNAL_INFILL_MARGIN)); + const float margin = float(scale_(EXTERNAL_INFILL_MARGIN)); #ifdef SLIC3R_DEBUG_SLICE_PROCESSING - export_region_fill_surfaces_to_svg_debug("3_process_external_surfaces-initial"); + export_region_fill_surfaces_to_svg_debug("4_process_external_surfaces-initial"); #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ // 1) Collect bottom and bridge surfaces, each of them grown by a fixed 3mm offset @@ -131,8 +436,7 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly // Internal surfaces, not grown. Surfaces internal; // Areas, where an infill of various types (top, bottom, bottom bride, sparse, void) could be placed. - Polygons fill_boundaries = to_polygons(this->fill_expolygons); - Polygons lower_layer_covered_tmp; + Polygons fill_boundaries = to_polygons(this->fill_expolygons()); // Collect top surfaces and internal surfaces. // Collect fill_boundaries: If we're slicing with no infill, we can't extend external surfaces over non-existent infill. @@ -141,34 +445,43 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly { // Voids are sparse infills if infill rate is zero. Polygons voids; - for (const Surface &surface : this->fill_surfaces.surfaces) { - if (surface.is_top()) { - // Collect the top surfaces, inflate them and trim them by the bottom surfaces. - // This gives the priority to bottom surfaces. - surfaces_append(top, offset_ex(surface.expolygon, margin, EXTERNAL_SURFACES_OFFSET_PARAMETERS), surface); - } else if (surface.surface_type == stBottom || (surface.surface_type == stBottomBridge && lower_layer == nullptr)) { - // Grown by 3mm. - surfaces_append(bottom, offset_ex(surface.expolygon, margin, EXTERNAL_SURFACES_OFFSET_PARAMETERS), surface); - } else if (surface.surface_type == stBottomBridge) { - if (! surface.empty()) + for (const Surface &surface : this->fill_surfaces()) { + assert(! surface.empty()); + if (! surface.empty()) { + if (surface.is_top()) { + // Collect the top surfaces, inflate them and trim them by the bottom surfaces. + // This gives the priority to bottom surfaces. + surfaces_append(top, offset_ex(surface.expolygon, margin, EXTERNAL_SURFACES_OFFSET_PARAMETERS), surface); + } else if (surface.surface_type == stBottom || (surface.surface_type == stBottomBridge && lower_layer == nullptr)) { + // Grown by 3mm. + surfaces_append(bottom, offset_ex(surface.expolygon, margin, EXTERNAL_SURFACES_OFFSET_PARAMETERS), surface); + } else if (surface.surface_type == stBottomBridge) { bridges.emplace_back(surface); - } - if (surface.is_internal()) { - assert(surface.surface_type == stInternal || surface.surface_type == stInternalSolid); - if (! has_infill && lower_layer != nullptr) - polygons_append(voids, surface.expolygon); - internal.emplace_back(std::move(surface)); + } else { + assert(surface.is_internal()); + assert(surface.surface_type == stInternal || surface.surface_type == stInternalSolid); + if (! has_infill && lower_layer != nullptr) + polygons_append(voids, surface.expolygon); + internal.emplace_back(std::move(surface)); + } } } - if (! has_infill && lower_layer != nullptr && ! voids.empty()) { + if (! voids.empty()) { + // There are some voids (empty infill regions) on this layer. Usually one does not want to expand + // any infill into these voids, with the exception the expanded infills are supported by layers below + // with nonzero inill. + assert(! has_infill && lower_layer != nullptr); // Remove voids from fill_boundaries, that are not supported by the layer below. + Polygons lower_layer_covered_tmp; if (lower_layer_covered == nullptr) { lower_layer_covered = &lower_layer_covered_tmp; lower_layer_covered_tmp = to_polygons(lower_layer->lslices); } if (! lower_layer_covered->empty()) + // Allow the top / bottom surfaces to expand into the voids of this layer if supported by the layer below. voids = diff(voids, *lower_layer_covered); - fill_boundaries = diff(fill_boundaries, voids); + if (! voids.empty()) + fill_boundaries = diff(fill_boundaries, voids); } } @@ -192,13 +505,12 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly #ifdef SLIC3R_DEBUG_SLICE_PROCESSING { static int iRun = 0; - SVG svg(debug_out_path("3_process_external_surfaces-fill_regions-%d.svg", iRun ++).c_str(), get_extents(fill_boundaries_ex)); + SVG svg(debug_out_path("4_process_external_surfaces-fill_regions-%d.svg", iRun ++).c_str(), get_extents(fill_boundaries_ex)); svg.draw(fill_boundaries_ex); svg.draw_outline(fill_boundaries_ex, "black", "blue", scale_(0.05)); svg.Close(); } - -// export_region_fill_surfaces_to_svg_debug("3_process_external_surfaces-initial"); +// export_region_fill_surfaces_to_svg_debug("4_process_external_surfaces-initial"); #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ { @@ -221,7 +533,8 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly if (idx_island == -1) { BOOST_LOG_TRIVIAL(trace) << "Bridge did not fall into the source region!"; } else { - // Found an island, to which this bridge region belongs. Trim it, + // Found an island, to which this bridge region belongs. Trim the expanded bridging region + // with its source region, so it does not overflow into a neighbor region. polys = intersection(polys, fill_boundaries_ex[idx_island]); } bridge_bboxes.push_back(get_extents(polys)); @@ -283,6 +596,27 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly // would get merged into a single one while they need different directions // also, supply the original expolygon instead of the grown one, because in case // of very thin (but still working) anchors, the grown expolygon would go beyond them + double custom_angle = Geometry::deg2rad(this->region().config().bridge_angle.value); + if (custom_angle > 0.0) { + bridges[idx_last].bridge_angle = custom_angle; + } else { + auto [bridging_dir, unsupported_dist] = detect_bridging_direction(to_polygons(initial), to_polygons(lower_layer->lslices)); + bridges[idx_last].bridge_angle = PI + std::atan2(bridging_dir.y(), bridging_dir.x()); + + // #if 1 + // coordf_t stroke_width = scale_(0.06); + // BoundingBox bbox = get_extents(initial); + // bbox.offset(scale_(1.)); + // ::Slic3r::SVG + // svg(debug_out_path(("bridge"+std::to_string(bridges[idx_last].bridge_angle)+"_"+std::to_string(this->layer()->bottom_z())).c_str()), + // bbox); + + // svg.draw(initial, "cyan"); + // svg.draw(to_lines(lower_layer->lslices), "green", stroke_width); + // #endif + } + + /* BridgeDetector bd(initial, lower_layer->lslices, this->bridging_flow(frInfill).scaled_width()); #ifdef SLIC3R_DEBUG printf("Processing bridge at layer %zu:\n", this->layer()->id()); @@ -292,13 +626,14 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly bridges[idx_last].bridge_angle = bd.angle; if (this->layer()->object()->has_support()) { // polygons_append(this->bridged, bd.coverage()); - append(this->unsupported_bridge_edges, bd.unsupported_edges()); + append(m_unsupported_bridge_edges, bd.unsupported_edges()); } } else if (custom_angle > 0) { // Bridge was not detected (likely it is only supported at one side). Still it is a surface filled in // using a bridging flow, therefore it makes sense to respect the custom bridging direction. bridges[idx_last].bridge_angle = custom_angle; } + */ // without safety offset, artifacts are generated (GH #2494) surfaces_append(bottom, union_safety_offset_ex(grown), bridges[idx_last]); } @@ -317,10 +652,10 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly Surfaces new_surfaces; { - // Merge top and bottom in a single collection. - surfaces_append(top, std::move(bottom)); // Intersect the grown surfaces with the actual fill boundaries. Polygons bottom_polygons = to_polygons(bottom); + // Merge top and bottom in a single collection. + surfaces_append(top, std::move(bottom)); for (size_t i = 0; i < top.size(); ++ i) { Surface &s1 = top[i]; if (s1.empty()) @@ -365,12 +700,13 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly surfaces_append(new_surfaces, std::move(new_expolys), s1); } - this->fill_surfaces.surfaces = std::move(new_surfaces); + m_fill_surfaces.surfaces = std::move(new_surfaces); #ifdef SLIC3R_DEBUG_SLICE_PROCESSING - export_region_fill_surfaces_to_svg_debug("3_process_external_surfaces-final"); + export_region_fill_surfaces_to_svg_debug("4_process_external_surfaces-final"); #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ } +#endif void LayerRegion::prepare_fill_surfaces() { @@ -389,12 +725,12 @@ void LayerRegion::prepare_fill_surfaces() // For Lightning infill, infill_only_where_needed is ignored because both // do a similar thing, and their combination doesn't make much sense. if (! spiral_vase && this->region().config().top_solid_layers == 0) { - for (Surface &surface : this->fill_surfaces.surfaces) + for (Surface &surface : m_fill_surfaces) if (surface.is_top()) - surface.surface_type = this->layer()->object()->config().infill_only_where_needed && this->region().config().fill_pattern != ipLightning ? stInternalVoid : stInternal; + surface.surface_type = /*this->layer()->object()->config().infill_only_where_needed && this->region().config().fill_pattern != ipLightning ? stInternalVoid :*/ stInternal; } if (this->region().config().bottom_solid_layers == 0) { - for (Surface &surface : this->fill_surfaces.surfaces) + for (Surface &surface : m_fill_surfaces) if (surface.is_bottom()) // (surface.surface_type == stBottom) surface.surface_type = stInternal; } @@ -403,7 +739,7 @@ void LayerRegion::prepare_fill_surfaces() if (! spiral_vase && this->region().config().fill_density.value > 0) { // scaling an area requires two calls! double min_area = scale_(scale_(this->region().config().solid_infill_below_area.value)); - for (Surface &surface : this->fill_surfaces.surfaces) + for (Surface &surface : m_fill_surfaces) if (surface.surface_type == stInternal && surface.area() <= min_area) surface.surface_type = stInternalSolid; } @@ -423,38 +759,38 @@ double LayerRegion::infill_area_threshold() const void LayerRegion::trim_surfaces(const Polygons &trimming_polygons) { #ifndef NDEBUG - for (const Surface &surface : this->slices.surfaces) + for (const Surface &surface : this->slices()) assert(surface.surface_type == stInternal); #endif /* NDEBUG */ - this->slices.set(intersection_ex(this->slices.surfaces, trimming_polygons), stInternal); + m_slices.set(intersection_ex(this->slices().surfaces, trimming_polygons), stInternal); } void LayerRegion::elephant_foot_compensation_step(const float elephant_foot_compensation_perimeter_step, const Polygons &trimming_polygons) { #ifndef NDEBUG - for (const Surface &surface : this->slices.surfaces) + for (const Surface &surface : this->slices()) assert(surface.surface_type == stInternal); #endif /* NDEBUG */ - Polygons tmp = intersection(this->slices.surfaces, trimming_polygons); - append(tmp, diff(this->slices.surfaces, opening(this->slices.surfaces, elephant_foot_compensation_perimeter_step))); - this->slices.set(union_ex(tmp), stInternal); + Polygons tmp = intersection(this->slices().surfaces, trimming_polygons); + append(tmp, diff(this->slices().surfaces, opening(this->slices().surfaces, elephant_foot_compensation_perimeter_step))); + m_slices.set(union_ex(tmp), stInternal); } void LayerRegion::export_region_slices_to_svg(const char *path) const { BoundingBox bbox; - for (Surfaces::const_iterator surface = this->slices.surfaces.begin(); surface != this->slices.surfaces.end(); ++surface) - bbox.merge(get_extents(surface->expolygon)); + for (const Surface &surface : this->slices()) + bbox.merge(get_extents(surface.expolygon)); Point legend_size = export_surface_type_legend_to_svg_box_size(); Point legend_pos(bbox.min(0), bbox.max(1)); bbox.merge(Point(std::max(bbox.min(0) + legend_size(0), bbox.max(0)), bbox.max(1) + legend_size(1))); SVG svg(path, bbox); const float transparency = 0.5f; - for (Surfaces::const_iterator surface = this->slices.surfaces.begin(); surface != this->slices.surfaces.end(); ++surface) - svg.draw(surface->expolygon, surface_type_to_color_name(surface->surface_type), transparency); - for (Surfaces::const_iterator surface = this->fill_surfaces.surfaces.begin(); surface != this->fill_surfaces.surfaces.end(); ++surface) - svg.draw(surface->expolygon.lines(), surface_type_to_color_name(surface->surface_type)); + for (const Surface &surface : this->slices()) + svg.draw(surface.expolygon, surface_type_to_color_name(surface.surface_type), transparency); + for (const Surface &surface : this->fill_surfaces()) + svg.draw(surface.expolygon.lines(), surface_type_to_color_name(surface.surface_type)); export_surface_type_legend_to_svg(svg, legend_pos); svg.Close(); } @@ -470,15 +806,15 @@ void LayerRegion::export_region_slices_to_svg_debug(const char *name) const void LayerRegion::export_region_fill_surfaces_to_svg(const char *path) const { BoundingBox bbox; - for (Surfaces::const_iterator surface = this->fill_surfaces.surfaces.begin(); surface != this->fill_surfaces.surfaces.end(); ++surface) - bbox.merge(get_extents(surface->expolygon)); + for (const Surface &surface : this->fill_surfaces()) + bbox.merge(get_extents(surface.expolygon)); Point legend_size = export_surface_type_legend_to_svg_box_size(); Point legend_pos(bbox.min(0), bbox.max(1)); bbox.merge(Point(std::max(bbox.min(0) + legend_size(0), bbox.max(0)), bbox.max(1) + legend_size(1))); SVG svg(path, bbox); const float transparency = 0.5f; - for (const Surface &surface : this->fill_surfaces.surfaces) { + for (const Surface &surface : this->fill_surfaces()) { svg.draw(surface.expolygon, surface_type_to_color_name(surface.surface_type), transparency); svg.draw_outline(surface.expolygon, "black", "blue", scale_(0.05)); } diff --git a/src/libslic3r/Line.cpp b/src/libslic3r/Line.cpp index 68a7449c7d6..7e75d563222 100644 --- a/src/libslic3r/Line.cpp +++ b/src/libslic3r/Line.cpp @@ -91,28 +91,7 @@ bool Line::perpendicular_to(const Line& line) const bool Line::intersection(const Line &l2, Point *intersection) const { - const Line &l1 = *this; - const Vec2d v1 = (l1.b - l1.a).cast(); - const Vec2d v2 = (l2.b - l2.a).cast(); - double denom = cross2(v1, v2); - if (fabs(denom) < EPSILON) -#if 0 - // Lines are collinear. Return true if they are coincident (overlappign). - return ! (fabs(nume_a) < EPSILON && fabs(nume_b) < EPSILON); -#else - return false; -#endif - const Vec2d v12 = (l1.a - l2.a).cast(); - double nume_a = cross2(v2, v12); - double nume_b = cross2(v1, v12); - double t1 = nume_a / denom; - double t2 = nume_b / denom; - if (t1 >= 0 && t1 <= 1.0f && t2 >= 0 && t2 <= 1.0f) { - // Get the intersection point. - (*intersection) = (l1.a.cast() + t1 * v1).cast(); - return true; - } - return false; // not intersecting + return line_alg::intersection(*this, l2, intersection); } bool Line::clip_with_bbox(const BoundingBox &bbox) diff --git a/src/libslic3r/Line.hpp b/src/libslic3r/Line.hpp index 781d8cb1401..90f56489809 100644 --- a/src/libslic3r/Line.hpp +++ b/src/libslic3r/Line.hpp @@ -54,11 +54,11 @@ double distance_to_squared(const L &line, const Vec, Scalar> &point, V // We find projection of this point onto the line. // It falls where t = [(this-a) . (b-a)] / |b-a|^2 const double t = va.dot(v) / l2; - if (t < 0.0) { + if (t <= 0.0) { // beyond the 'a' end of the segment *nearest_point = get_a(line); return va.squaredNorm(); - } else if (t > 1.0) { + } else if (t >= 1.0) { // beyond the 'b' end of the segment *nearest_point = get_b(line); return (point - get_b(line)).template cast().squaredNorm(); @@ -120,6 +120,33 @@ double distance_to_infinite(const L &line, const Vec, Scalar> &point) return std::sqrt(distance_to_infinite_squared(line, point)); } +template bool intersection(const L &l1, const L &l2, Vec, Scalar> *intersection_pt) +{ + using Floating = typename std::conditional>::value, Scalar, double>::type; + using VecType = const Vec, Floating>; + const VecType v1 = (l1.b - l1.a).template cast(); + const VecType v2 = (l2.b - l2.a).template cast(); + Floating denom = cross2(v1, v2); + if (fabs(denom) < EPSILON) +#if 0 + // Lines are collinear. Return true if they are coincident (overlappign). + return ! (fabs(nume_a) < EPSILON && fabs(nume_b) < EPSILON); +#else + return false; +#endif + const VecType v12 = (l1.a - l2.a).template cast(); + Floating nume_a = cross2(v2, v12); + Floating nume_b = cross2(v1, v12); + Floating t1 = nume_a / denom; + Floating t2 = nume_b / denom; + if (t1 >= 0 && t1 <= 1.0f && t2 >= 0 && t2 <= 1.0f) { + // Get the intersection point. + (*intersection_pt) = (l1.a.template cast() + t1 * v1).template cast>(); + return true; + } + return false; // not intersecting +} + } // namespace line_alg class Line @@ -152,7 +179,6 @@ class Line Vector vector() const { return this->b - this->a; } Vector normal() const { return Vector((this->b(1) - this->a(1)), -(this->b(0) - this->a(0))); } bool intersection(const Line& line, Point* intersection) const; - double ccw(const Point& point) const { return point.ccw(*this); } // Clip a line with a bounding box. Returns false if the line is completely outside of the bounding box. bool clip_with_bbox(const BoundingBox &bbox); // Extend the line from both sides by an offset. @@ -211,6 +237,7 @@ class Linef static const constexpr int Dim = 2; using Scalar = Vec2d::Scalar; }; +using Linesf = std::vector; class Linef3 { diff --git a/src/libslic3r/LocalesUtils.cpp b/src/libslic3r/LocalesUtils.cpp index da372ba3fdc..1be8e88e15d 100644 --- a/src/libslic3r/LocalesUtils.cpp +++ b/src/libslic3r/LocalesUtils.cpp @@ -51,16 +51,26 @@ bool is_decimal_separator_point() return str[1] == '.'; } - -double string_to_double_decimal_point(const std::string_view str, size_t* pos /* = nullptr*/) +template +static T string_to_floating_decimal_point(const std::string_view str, size_t* pos /* = nullptr*/) { - double out; + T out; size_t p = fast_float::from_chars(str.data(), str.data() + str.size(), out).ptr - str.data(); if (pos) *pos = p; return out; } +double string_to_double_decimal_point(const std::string_view str, size_t* pos /* = nullptr*/) +{ + return string_to_floating_decimal_point(str, pos); +} + +float string_to_float_decimal_point(const std::string_view str, size_t* pos /* = nullptr*/) +{ + return string_to_floating_decimal_point(str, pos); +} + std::string float_to_string_decimal_point(double value, int precision/* = -1*/) { // Our Windows build server fully supports C++17 std::to_chars. Let's use it. diff --git a/src/libslic3r/LocalesUtils.hpp b/src/libslic3r/LocalesUtils.hpp index ce8030cebcd..aec50fd9d16 100644 --- a/src/libslic3r/LocalesUtils.hpp +++ b/src/libslic3r/LocalesUtils.hpp @@ -42,6 +42,7 @@ bool is_decimal_separator_point(); std::string float_to_string_decimal_point(double value, int precision = -1); //std::string float_to_string_decimal_point(float value, int precision = -1); double string_to_double_decimal_point(const std::string_view str, size_t* pos = nullptr); +float string_to_float_decimal_point (const std::string_view str, size_t* pos = nullptr); // Set locales to "C". inline void set_c_locales() diff --git a/src/libslic3r/Measure.cpp b/src/libslic3r/Measure.cpp new file mode 100644 index 00000000000..08c17df47be --- /dev/null +++ b/src/libslic3r/Measure.cpp @@ -0,0 +1,1241 @@ +#include "libslic3r/libslic3r.h" +#include "Measure.hpp" +#include "MeasureUtils.hpp" + +#include "libslic3r/Geometry/Circle.hpp" +#include "libslic3r/SurfaceMesh.hpp" +#include + +#include + +#define DEBUG_EXTRACT_ALL_FEATURES_AT_ONCE 0 + +namespace Slic3r { +namespace Measure { + + +constexpr double feature_hover_limit = 0.5; // how close to a feature the mouse must be to highlight it + +static std::tuple get_center_and_radius(const std::vector& points, const Transform3d& trafo, const Transform3d& trafo_inv) +{ + Vec2ds out; + double z = 0.; + for (const Vec3d& pt : points) { + Vec3d pt_transformed = trafo * pt; + z = pt_transformed.z(); + out.emplace_back(pt_transformed.x(), pt_transformed.y()); + } + + const int iter = points.size() < 10 ? 2 : + points.size() < 100 ? 4 : + 6; + + double error = std::numeric_limits::max(); + auto circle = Geometry::circle_ransac(out, iter, &error); + + return std::make_tuple(trafo.inverse() * Vec3d(circle.center.x(), circle.center.y(), z), circle.radius, error); +} + + + +static std::array orthonormal_basis(const Vec3d& v) +{ + std::array ret; + ret[2] = v.normalized(); + int index; + ret[2].cwiseAbs().maxCoeff(&index); + switch (index) + { + case 0: { ret[0] = Vec3d(ret[2].y(), -ret[2].x(), 0.0).normalized(); break; } + case 1: { ret[0] = Vec3d(0.0, ret[2].z(), -ret[2].y()).normalized(); break; } + case 2: { ret[0] = Vec3d(-ret[2].z(), 0.0, ret[2].x()).normalized(); break; } + } + ret[1] = ret[2].cross(ret[0]).normalized(); + return ret; +} + + + +class MeasuringImpl { +public: + explicit MeasuringImpl(const indexed_triangle_set& its); + struct PlaneData { + std::vector facets; + std::vector> borders; // FIXME: should be in fact local in update_planes() + std::vector surface_features; + Vec3d normal; + float area; + bool features_extracted = false; + }; + + std::optional get_feature(size_t face_idx, const Vec3d& point); + int get_num_of_planes() const; + const std::vector& get_plane_triangle_indices(int idx) const; + const std::vector& get_plane_features(unsigned int plane_id); + const TriangleMesh& get_mesh() const; + +private: + void update_planes(); + void extract_features(int plane_idx); + + std::vector m_planes; + std::vector m_face_to_plane; + TriangleMesh m_mesh; +}; + + + + + + +MeasuringImpl::MeasuringImpl(const indexed_triangle_set& its) +: m_mesh(its) +{ + update_planes(); + + // Extracting features will be done as needed. + // To extract all planes at once, run the following: +#if DEBUG_EXTRACT_ALL_FEATURES_AT_ONCE + for (int i=0; i face_normals = its_face_normals(m_mesh.its); + const std::vector face_neighbors = its_face_neighbors(m_mesh.its); + std::vector facet_queue(num_of_facets, 0); + int facet_queue_cnt = 0; + const stl_normal* normal_ptr = nullptr; + size_t seed_facet_idx = 0; + + auto is_same_normal = [](const stl_normal& a, const stl_normal& b) -> bool { + return (std::abs(a(0) - b(0)) < 0.001 && std::abs(a(1) - b(1)) < 0.001 && std::abs(a(2) - b(2)) < 0.001); + }; + + // First go through all the triangles and fill in m_planes vector. For each "plane" + // detected on the model, it will contain list of facets that are part of it. + // We will also fill in m_face_to_plane, which contains index into m_planes + // for each of the source facets. + while (1) { + // Find next unvisited triangle: + for (; seed_facet_idx < num_of_facets; ++ seed_facet_idx) + if (m_face_to_plane[seed_facet_idx] == size_t(-1)) { + facet_queue[facet_queue_cnt ++] = seed_facet_idx; + normal_ptr = &face_normals[seed_facet_idx]; + m_face_to_plane[seed_facet_idx] = m_planes.size(); + m_planes.emplace_back(); + break; + } + if (seed_facet_idx == num_of_facets) + break; // Everything was visited already + + while (facet_queue_cnt > 0) { + int facet_idx = facet_queue[-- facet_queue_cnt]; + const stl_normal& this_normal = face_normals[facet_idx]; + if (is_same_normal(this_normal, *normal_ptr)) { +// const Vec3i& face = m_its.indices[facet_idx]; + + m_face_to_plane[facet_idx] = m_planes.size() - 1; + m_planes.back().facets.emplace_back(facet_idx); + for (int j = 0; j < 3; ++ j) + if (int neighbor_idx = face_neighbors[facet_idx][j]; neighbor_idx >= 0 && m_face_to_plane[neighbor_idx] == size_t(-1)) + facet_queue[facet_queue_cnt ++] = neighbor_idx; + } + } + + m_planes.back().normal = normal_ptr->cast(); + std::sort(m_planes.back().facets.begin(), m_planes.back().facets.end()); + } + + // Check that each facet is part of one of the planes. + assert(std::none_of(m_face_to_plane.begin(), m_face_to_plane.end(), [](size_t val) { return val == size_t(-1); })); + + // Now we will walk around each of the planes and save vertices which form the border. + SurfaceMesh sm(m_mesh.its); + for (int plane_id=0; plane_id < int(m_planes.size()); ++plane_id) { + const auto& facets = m_planes[plane_id].facets; + m_planes[plane_id].borders.clear(); + std::vector> visited(facets.size(), {false, false, false}); + + + + for (int face_id=0; face_id& last_border = m_planes[plane_id].borders.back(); + last_border.emplace_back(sm.point(sm.source(he)).cast()); + //Vertex_index target = sm.target(he); + const Halfedge_index he_start = he; + + Face_index fi = he.face(); + auto face_it = std::lower_bound(facets.begin(), facets.end(), int(fi)); + assert(face_it != facets.end()); + assert(*face_it == int(fi)); + visited[face_it - facets.begin()][he.side()] = true; + + do { + const Halfedge_index he_orig = he; + he = sm.next_around_target(he); + if (he.is_invalid()) + goto PLANE_FAILURE; + + // For broken meshes, the iteration might never get back to he_orig. + // Remember all halfedges we saw to break out of such infinite loops. + boost::container::small_vector he_seen; + + while ( (int)m_face_to_plane[sm.face(he)] == plane_id && he != he_orig) { + he_seen.emplace_back(he); + he = sm.next_around_target(he); + if (he.is_invalid() || std::find(he_seen.begin(), he_seen.end(), he) != he_seen.end()) + goto PLANE_FAILURE; + } + he = sm.opposite(he); + if (he.is_invalid()) + goto PLANE_FAILURE; + + Face_index fi = he.face(); + auto face_it = std::lower_bound(facets.begin(), facets.end(), int(fi)); + if (face_it == facets.end() || *face_it != int(fi)) // This indicates a broken mesh. + goto PLANE_FAILURE; + + if (visited[face_it - facets.begin()][he.side()] && he != he_start) { + last_border.resize(1); + break; + } + visited[face_it - facets.begin()][he.side()] = true; + + last_border.emplace_back(sm.point(sm.source(he)).cast()); + + // In case of broken meshes, this loop might be infinite. Break + // out in case it is clearly going bad. + if (last_border.size() > 3*facets.size()+1) + goto PLANE_FAILURE; + + } while (he != he_start); + + if (last_border.size() == 1) + m_planes[plane_id].borders.pop_back(); + else { + assert(last_border.front() == last_border.back()); + last_border.pop_back(); + } + } + } + continue; // There was no failure. + + PLANE_FAILURE: + m_planes[plane_id].borders.clear(); + } +} + + + + + + +void MeasuringImpl::extract_features(int plane_idx) +{ + assert(! m_planes[plane_idx].features_extracted); + + PlaneData& plane = m_planes[plane_idx]; + plane.surface_features.clear(); + const Vec3d& normal = plane.normal; + + Eigen::Quaterniond q; + q.setFromTwoVectors(plane.normal, Vec3d::UnitZ()); + Transform3d trafo = Transform3d::Identity(); + trafo.rotate(q); + const Transform3d trafo_inv = trafo.inverse(); + + std::vector angles; // placed in outer scope to prevent reallocations + std::vector lengths; + + for (const std::vector& border : plane.borders) { + if (border.size() <= 1) + continue; + + bool done = false; + + if (border.size() > 4) { + const auto& [center, radius, err] = get_center_and_radius(border, trafo, trafo_inv); + + if (err < 0.05) { + // The whole border is one circle. Just add it into the list of features + // and we are done. + + bool is_polygon = border.size()>4 && border.size()<=8; + bool lengths_match = std::all_of(border.begin()+2, border.end(), [is_polygon](const Vec3d& pt) { + return Slic3r::is_approx((pt - *((&pt)-1)).squaredNorm(), (*((&pt)-1) - *((&pt)-2)).squaredNorm(), is_polygon ? 0.01 : 0.01); + }); + + if (lengths_match && (is_polygon || border.size() > 8)) { + if (is_polygon) { + // This is a polygon, add the separate edges with the center. + for (int j=0; j int { + assert(std::abs(offset) < border_size); + int out = idx+offset; + if (out >= border_size) + out = out - border_size; + else if (out < 0) + out = border_size + out; + + return out; + }; + + // First calculate angles at all the vertices. + angles.clear(); + lengths.clear(); + int first_different_angle_idx = 0; + for (int i=0; i M_PI) + angle = 2*M_PI - angle; + + angles.push_back(angle); + lengths.push_back(v2.norm()); + if (first_different_angle_idx == 0 && angles.size() > 1) { + if (! are_angles_same(angles.back(), angles[angles.size()-2])) + first_different_angle_idx = angles.size()-1; + } + } + assert(border.size() == angles.size()); + assert(border.size() == lengths.size()); + + // First go around the border and pick what might be circular segments. + // Save pair of indices to where such potential segments start and end. + // Also remember the length of these segments. + int start_idx = -1; + bool circle = false; + bool first_iter = true; + std::vector circles; + std::vector edges; + std::vector> circles_idxs; + //std::vector circles_lengths; + std::vector single_circle; // could be in loop-scope, but reallocations + double single_circle_length = 0.; + int first_pt_idx = offset_to_index(first_different_angle_idx, 1); + int i = first_pt_idx; + while (i != first_pt_idx || first_iter) { + if (are_angles_same(angles[i], angles[offset_to_index(i,-1)]) + && i != offset_to_index(first_pt_idx, -1) // not the last point + && i != start_idx ) { + // circle + if (! circle) { + circle = true; + single_circle.clear(); + single_circle_length = 0.; + start_idx = offset_to_index(i, -2); + single_circle = { border[start_idx], border[offset_to_index(start_idx,1)] }; + single_circle_length += lengths[offset_to_index(i, -1)]; + } + single_circle.emplace_back(border[i]); + single_circle_length += lengths[i]; + } else { + if (circle && single_circle.size() >= 5) { // Less than 5 vertices? Not a circle. + single_circle.emplace_back(border[i]); + single_circle_length += lengths[i]; + + bool accept_circle = true; + { + // Check that lengths of internal (!!!) edges match. + int j = offset_to_index(start_idx, 3); + while (j != i) { + if (! are_lengths_same(lengths[offset_to_index(j,-1)], lengths[j])) { + accept_circle = false; + break; + } + j = offset_to_index(j, 1); + } + } + + if (accept_circle) { + const auto& [center, radius, err] = get_center_and_radius(single_circle, trafo, trafo_inv); + + // Check that the fit went well. The tolerance is high, only to + // reject complete failures. + accept_circle &= err < 0.05; + + // If the segment subtends less than 90 degrees, throw it away. + accept_circle &= single_circle_length / radius > 0.9*M_PI/2.; + + if (accept_circle) { + // Add the circle and remember indices into borders. + circles_idxs.emplace_back(start_idx, i); + circles.emplace_back(SurfaceFeature(SurfaceFeatureType::Circle, center, plane.normal, std::nullopt, radius)); + } + } + } + circle = false; + } + // Take care of the wrap around. + first_iter = false; + i = offset_to_index(i, 1); + } + + // We have the circles. Now go around again and pick edges, while jumping over circles. + if (circles_idxs.empty()) { + // Just add all edges. + for (int i=1; i 1 || circles_idxs.front().first != circles_idxs.front().second) { + // There is at least one circular segment. Start at its end and add edges until the start of the next one. + int i = circles_idxs.front().second; + int circle_idx = 1; + while (true) { + i = offset_to_index(i, 1); + edges.emplace_back(SurfaceFeature(SurfaceFeatureType::Edge, border[offset_to_index(i,-1)], border[i])); + if (circle_idx < int(circles_idxs.size()) && i == circles_idxs[circle_idx].first) { + i = circles_idxs[circle_idx].second; + ++circle_idx; + } + if (i == circles_idxs.front().first) + break; + } + } + + // Merge adjacent edges where needed. + assert(std::all_of(edges.begin(), edges.end(), + [](const SurfaceFeature& f) { return f.get_type() == SurfaceFeatureType::Edge; })); + for (int i=edges.size()-1; i>=0; --i) { + const auto& [first_start, first_end] = edges[i==0 ? edges.size()-1 : i-1].get_edge(); + const auto& [second_start, second_end] = edges[i].get_edge(); + + if (Slic3r::is_approx(first_end, second_start) + && Slic3r::is_approx((first_end-first_start).normalized().dot((second_end-second_start).normalized()), 1.)) { + // The edges have the same direction and share a point. Merge them. + edges[i==0 ? edges.size()-1 : i-1] = SurfaceFeature(SurfaceFeatureType::Edge, first_start, second_end); + edges.erase(edges.begin() + i); + } + } + + // Now move the circles and edges into the feature list for the plane. + assert(std::all_of(circles.begin(), circles.end(), [](const SurfaceFeature& f) { + return f.get_type() == SurfaceFeatureType::Circle; + })); + assert(std::all_of(edges.begin(), edges.end(), [](const SurfaceFeature& f) { + return f.get_type() == SurfaceFeatureType::Edge; + })); + plane.surface_features.insert(plane.surface_features.end(), std::make_move_iterator(circles.begin()), + std::make_move_iterator(circles.end())); + plane.surface_features.insert(plane.surface_features.end(), std::make_move_iterator(edges.begin()), + std::make_move_iterator(edges.end())); + } + } + + // The last surface feature is the plane itself. + Vec3d cog = Vec3d::Zero(); + size_t counter = 0; + for (const std::vector& b : plane.borders) { + for (size_t i = 1; i < b.size(); ++i) { + cog += b[i]; + ++counter; + } + } + cog /= double(counter); + plane.surface_features.emplace_back(SurfaceFeature(SurfaceFeatureType::Plane, + plane.normal, cog, std::optional(), plane_idx + 0.0001)); + + plane.borders.clear(); + plane.borders.shrink_to_fit(); + + plane.features_extracted = true; +} + + + + + + + + +std::optional MeasuringImpl::get_feature(size_t face_idx, const Vec3d& point) +{ + if (face_idx >= m_face_to_plane.size()) + return std::optional(); + + const PlaneData& plane = m_planes[m_face_to_plane[face_idx]]; + + if (! plane.features_extracted) + extract_features(m_face_to_plane[face_idx]); + + size_t closest_feature_idx = size_t(-1); + double min_dist = std::numeric_limits::max(); + + MeasurementResult res; + SurfaceFeature point_sf(point); + + assert(plane.surface_features.empty() || plane.surface_features.back().get_type() == SurfaceFeatureType::Plane); + + for (size_t i=0; idist; + if (dist < feature_hover_limit && dist < min_dist) { + min_dist = std::min(dist, min_dist); + closest_feature_idx = i; + } + } + } + + if (closest_feature_idx != size_t(-1)) { + const SurfaceFeature& f = plane.surface_features[closest_feature_idx]; + if (f.get_type() == SurfaceFeatureType::Edge) { + // If this is an edge, check if we are not close to the endpoint. If so, + // we will include the endpoint as well. Close = 10% of the lenghth of + // the edge, clamped between 0.025 and 0.5 mm. + const auto& [sp, ep] = f.get_edge(); + double len_sq = (ep-sp).squaredNorm(); + double limit_sq = std::max(0.025*0.025, std::min(0.5*0.5, 0.1 * 0.1 * len_sq)); + + if ((point-sp).squaredNorm() < limit_sq) + return std::make_optional(SurfaceFeature(sp)); + if ((point-ep).squaredNorm() < limit_sq) + return std::make_optional(SurfaceFeature(ep)); + } + return std::make_optional(f); + } + + // Nothing detected, return the plane as a whole. + assert(plane.surface_features.back().get_type() == SurfaceFeatureType::Plane); + return std::make_optional(plane.surface_features.back()); +} + + + + + +int MeasuringImpl::get_num_of_planes() const +{ + return (m_planes.size()); +} + + + +const std::vector& MeasuringImpl::get_plane_triangle_indices(int idx) const +{ + assert(idx >= 0 && idx < int(m_planes.size())); + return m_planes[idx].facets; +} + +const std::vector& MeasuringImpl::get_plane_features(unsigned int plane_id) +{ + assert(plane_id < m_planes.size()); + if (! m_planes[plane_id].features_extracted) + extract_features(plane_id); + return m_planes[plane_id].surface_features; +} + +const TriangleMesh& MeasuringImpl::get_mesh() const +{ + return this->m_mesh; +} + + + + + + + + + + + +Measuring::Measuring(const indexed_triangle_set& its) +: priv{std::make_unique(its)} +{} + +Measuring::~Measuring() {} + + + +std::optional Measuring::get_feature(size_t face_idx, const Vec3d& point) const +{ + return priv->get_feature(face_idx, point); +} + + +int Measuring::get_num_of_planes() const +{ + return priv->get_num_of_planes(); +} + + +const std::vector& Measuring::get_plane_triangle_indices(int idx) const +{ + return priv->get_plane_triangle_indices(idx); +} + +const std::vector& Measuring::get_plane_features(unsigned int plane_id) const +{ + return priv->get_plane_features(plane_id); +} + +const TriangleMesh& Measuring::get_mesh() const +{ + return priv->get_mesh(); +} + +const AngleAndEdges AngleAndEdges::Dummy = { 0.0, Vec3d::Zero(), { Vec3d::Zero(), Vec3d::Zero() }, { Vec3d::Zero(), Vec3d::Zero() }, 0.0, true }; + +static AngleAndEdges angle_edge_edge(const std::pair& e1, const std::pair& e2) +{ + if (are_parallel(e1, e2)) + return AngleAndEdges::Dummy; + + Vec3d e1_unit = edge_direction(e1.first, e1.second); + Vec3d e2_unit = edge_direction(e2.first, e2.second); + + // project edges on the plane defined by them + Vec3d normal = e1_unit.cross(e2_unit).normalized(); + const Eigen::Hyperplane plane(normal, e1.first); + Vec3d e11_proj = plane.projection(e1.first); + Vec3d e12_proj = plane.projection(e1.second); + Vec3d e21_proj = plane.projection(e2.first); + Vec3d e22_proj = plane.projection(e2.second); + + const bool coplanar = (e2.first - e21_proj).norm() < EPSILON && (e2.second - e22_proj).norm() < EPSILON; + + // rotate the plane to become the XY plane + auto qp = Eigen::Quaternion::FromTwoVectors(normal, Vec3d::UnitZ()); + auto qp_inverse = qp.inverse(); + const Vec3d e11_rot = qp * e11_proj; + const Vec3d e12_rot = qp * e12_proj; + const Vec3d e21_rot = qp * e21_proj; + const Vec3d e22_rot = qp * e22_proj; + + // discard Z + const Vec2d e11_rot_2d = Vec2d(e11_rot.x(), e11_rot.y()); + const Vec2d e12_rot_2d = Vec2d(e12_rot.x(), e12_rot.y()); + const Vec2d e21_rot_2d = Vec2d(e21_rot.x(), e21_rot.y()); + const Vec2d e22_rot_2d = Vec2d(e22_rot.x(), e22_rot.y()); + + // find intersection (arc center) of edges in XY plane + const Eigen::Hyperplane e1_rot_2d_line = Eigen::Hyperplane::Through(e11_rot_2d, e12_rot_2d); + const Eigen::Hyperplane e2_rot_2d_line = Eigen::Hyperplane::Through(e21_rot_2d, e22_rot_2d); + const Vec2d center_rot_2d = e1_rot_2d_line.intersection(e2_rot_2d_line); + + // arc center in original coordinate + const Vec3d center = qp_inverse * Vec3d(center_rot_2d.x(), center_rot_2d.y(), e11_rot.z()); + + // ensure the edges are pointing away from the center + std::pair out_e1 = e1; + std::pair out_e2 = e2; + if ((center_rot_2d - e11_rot_2d).squaredNorm() > (center_rot_2d - e12_rot_2d).squaredNorm()) { + std::swap(e11_proj, e12_proj); + std::swap(out_e1.first, out_e1.second); + e1_unit = -e1_unit; + } + if ((center_rot_2d - e21_rot_2d).squaredNorm() > (center_rot_2d - e22_rot_2d).squaredNorm()) { + std::swap(e21_proj, e22_proj); + std::swap(out_e2.first, out_e2.second); + e2_unit = -e2_unit; + } + + // arc angle + const double angle = std::acos(std::clamp(e1_unit.dot(e2_unit), -1.0, 1.0)); + // arc radius + const Vec3d e1_proj_mid = 0.5 * (e11_proj + e12_proj); + const Vec3d e2_proj_mid = 0.5 * (e21_proj + e22_proj); + const double radius = std::min((center - e1_proj_mid).norm(), (center - e2_proj_mid).norm()); + + return { angle, center, out_e1, out_e2, radius, coplanar }; +} + +static AngleAndEdges angle_edge_plane(const std::pair& e, const std::tuple& p) +{ + const auto& [idx, normal, origin] = p; + Vec3d e1e2_unit = edge_direction(e); + if (are_perpendicular(e1e2_unit, normal)) + return AngleAndEdges::Dummy; + + // ensure the edge is pointing away from the intersection + // 1st calculate instersection between edge and plane + const Eigen::Hyperplane plane(normal, origin); + const Eigen::ParametrizedLine line = Eigen::ParametrizedLine::Through(e.first, e.second); + const Vec3d inters = line.intersectionPoint(plane); + + // then verify edge direction and revert it, if needed + Vec3d e1 = e.first; + Vec3d e2 = e.second; + if ((e1 - inters).squaredNorm() > (e2 - inters).squaredNorm()) { + std::swap(e1, e2); + e1e2_unit = -e1e2_unit; + } + + if (are_parallel(e1e2_unit, normal)) { + const std::array basis = orthonormal_basis(e1e2_unit); + const double radius = (0.5 * (e1 + e2) - inters).norm(); + const Vec3d edge_on_plane_dir = (basis[1].dot(origin - inters) >= 0.0) ? basis[1] : -basis[1]; + std::pair edge_on_plane = std::make_pair(inters, inters + radius * edge_on_plane_dir); + if (!inters.isApprox(e1)) { + edge_on_plane.first += radius * edge_on_plane_dir; + edge_on_plane.second += radius * edge_on_plane_dir; + } + return AngleAndEdges(0.5 * double(PI), inters, std::make_pair(e1, e2), edge_on_plane, radius, inters.isApprox(e1)); + } + + const Vec3d e1e2 = e2 - e1; + const double e1e2_len = e1e2.norm(); + + // calculate 2nd edge (on the plane) + const Vec3d temp = normal.cross(e1e2); + const Vec3d edge_on_plane_unit = normal.cross(temp).normalized(); + std::pair edge_on_plane = { origin, origin + e1e2_len * edge_on_plane_unit }; + + // ensure the 2nd edge is pointing in the correct direction + const Vec3d test_edge = (edge_on_plane.second - edge_on_plane.first).cross(e1e2); + if (test_edge.dot(temp) < 0.0) + edge_on_plane = { origin, origin - e1e2_len * edge_on_plane_unit }; + + AngleAndEdges ret = angle_edge_edge({ e1, e2 }, edge_on_plane); + ret.radius = (inters - 0.5 * (e1 + e2)).norm(); + return ret; +} + +static AngleAndEdges angle_plane_plane(const std::tuple& p1, const std::tuple& p2) +{ + const auto& [idx1, normal1, origin1] = p1; + const auto& [idx2, normal2, origin2] = p2; + + // are planes parallel ? + if (are_parallel(normal1, normal2)) + return AngleAndEdges::Dummy; + + auto intersection_plane_plane = [](const Vec3d& n1, const Vec3d& o1, const Vec3d& n2, const Vec3d& o2) { + Eigen::MatrixXd m(2, 3); + m << n1.x(), n1.y(), n1.z(), n2.x(), n2.y(), n2.z(); + Eigen::VectorXd b(2); + b << o1.dot(n1), o2.dot(n2); + Eigen::VectorXd x = m.colPivHouseholderQr().solve(b); + return std::make_pair(n1.cross(n2).normalized(), Vec3d(x(0), x(1), x(2))); + }; + + // Calculate intersection line between planes + const auto [intersection_line_direction, intersection_line_origin] = intersection_plane_plane(normal1, origin1, normal2, origin2); + + // Project planes' origin on intersection line + const Eigen::ParametrizedLine intersection_line = Eigen::ParametrizedLine(intersection_line_origin, intersection_line_direction); + const Vec3d origin1_proj = intersection_line.projection(origin1); + const Vec3d origin2_proj = intersection_line.projection(origin2); + + // Calculate edges on planes + const Vec3d edge_on_plane1_unit = (origin1 - origin1_proj).normalized(); + const Vec3d edge_on_plane2_unit = (origin2 - origin2_proj).normalized(); + const double radius = std::max(10.0, std::max((origin1 - origin1_proj).norm(), (origin2 - origin2_proj).norm())); + const std::pair edge_on_plane1 = { origin1_proj + radius * edge_on_plane1_unit, origin1_proj + 2.0 * radius * edge_on_plane1_unit }; + const std::pair edge_on_plane2 = { origin2_proj + radius * edge_on_plane2_unit, origin2_proj + 2.0 * radius * edge_on_plane2_unit }; + + AngleAndEdges ret = angle_edge_edge(edge_on_plane1, edge_on_plane2); + ret.radius = radius; + return ret; +} + + + + + + + +MeasurementResult get_measurement(const SurfaceFeature& a, const SurfaceFeature& b, const Measuring* measuring) +{ + assert(a.get_type() != SurfaceFeatureType::Undef && b.get_type() != SurfaceFeatureType::Undef); + + const bool swap = int(a.get_type()) > int(b.get_type()); + const SurfaceFeature& f1 = swap ? b : a; + const SurfaceFeature& f2 = swap ? a : b; + + MeasurementResult result; + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + if (f1.get_type() == SurfaceFeatureType::Point) { + if (f2.get_type() == SurfaceFeatureType::Point) { + Vec3d diff = (f2.get_point() - f1.get_point()); + result.distance_strict = std::make_optional(DistAndPoints{diff.norm(), f1.get_point(), f2.get_point()}); + result.distance_xyz = diff.cwiseAbs(); + + /////////////////////////////////////////////////////////////////////////// + } else if (f2.get_type() == SurfaceFeatureType::Edge) { + const auto [s,e] = f2.get_edge(); + const Eigen::ParametrizedLine line(s, (e-s).normalized()); + const double dist_inf = line.distance(f1.get_point()); + const Vec3d proj = line.projection(f1.get_point()); + const double len_sq = (e-s).squaredNorm(); + const double dist_start_sq = (proj-s).squaredNorm(); + const double dist_end_sq = (proj-e).squaredNorm(); + if (dist_start_sq < len_sq && dist_end_sq < len_sq) { + // projection falls on the line - the strict distance is the same as infinite + result.distance_strict = std::make_optional(DistAndPoints{dist_inf, f1.get_point(), proj}); + } else { // the result is the closer of the endpoints + const bool s_is_closer = dist_start_sq < dist_end_sq; + result.distance_strict = std::make_optional(DistAndPoints{std::sqrt(std::min(dist_start_sq, dist_end_sq) + sqr(dist_inf)), f1.get_point(), s_is_closer ? s : e}); + } + result.distance_infinite = std::make_optional(DistAndPoints{dist_inf, f1.get_point(), proj}); + /////////////////////////////////////////////////////////////////////////// + } else if (f2.get_type() == SurfaceFeatureType::Circle) { + // Find a plane containing normal, center and the point. + const auto [c, radius, n] = f2.get_circle(); + const Eigen::Hyperplane circle_plane(n, c); + const Vec3d proj = circle_plane.projection(f1.get_point()); + if (proj.isApprox(c)) { + const Vec3d p_on_circle = c + radius * get_orthogonal(n, true); + result.distance_strict = std::make_optional(DistAndPoints{ radius, c, p_on_circle }); + } + else { + const Eigen::Hyperplane circle_plane(n, c); + const Vec3d proj = circle_plane.projection(f1.get_point()); + const double dist = std::sqrt(std::pow((proj - c).norm() - radius, 2.) + + (f1.get_point() - proj).squaredNorm()); + + const Vec3d p_on_circle = c + radius * (proj - c).normalized(); + result.distance_strict = std::make_optional(DistAndPoints{ dist, f1.get_point(), p_on_circle }); // TODO + } + /////////////////////////////////////////////////////////////////////////// + } else if (f2.get_type() == SurfaceFeatureType::Plane) { + const auto [idx, normal, pt] = f2.get_plane(); + Eigen::Hyperplane plane(normal, pt); + result.distance_infinite = std::make_optional(DistAndPoints{plane.absDistance(f1.get_point()), f1.get_point(), plane.projection(f1.get_point())}); // TODO + // TODO: result.distance_strict = + } + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + } + else if (f1.get_type() == SurfaceFeatureType::Edge) { + if (f2.get_type() == SurfaceFeatureType::Edge) { + std::vector distances; + + auto add_point_edge_distance = [&distances](const Vec3d& v, const std::pair& e) { + const MeasurementResult res = get_measurement(SurfaceFeature(v), SurfaceFeature(SurfaceFeatureType::Edge, e.first, e.second)); + double distance = res.distance_strict->dist; + Vec3d v2 = res.distance_strict->to; + + const Vec3d e1e2 = e.second - e.first; + const Vec3d e1v2 = v2 - e.first; + if (e1v2.dot(e1e2) >= 0.0 && e1v2.norm() < e1e2.norm()) + distances.emplace_back(distance, v, v2); + }; + + std::pair e1 = f1.get_edge(); + std::pair e2 = f2.get_edge(); + + distances.emplace_back((e2.first - e1.first).norm(), e1.first, e2.first); + distances.emplace_back((e2.second - e1.first).norm(), e1.first, e2.second); + distances.emplace_back((e2.first - e1.second).norm(), e1.second, e2.first); + distances.emplace_back((e2.second - e1.second).norm(), e1.second, e2.second); + add_point_edge_distance(e1.first, e2); + add_point_edge_distance(e1.second, e2); + add_point_edge_distance(e2.first, e1); + add_point_edge_distance(e2.second, e1); + auto it = std::min_element(distances.begin(), distances.end(), + [](const DistAndPoints& item1, const DistAndPoints& item2) { + return item1.dist < item2.dist; + }); + result.distance_infinite = std::make_optional(*it); + + result.angle = angle_edge_edge(f1.get_edge(), f2.get_edge()); + /////////////////////////////////////////////////////////////////////////// + } else if (f2.get_type() == SurfaceFeatureType::Circle) { + const std::pair e = f1.get_edge(); + const auto& [center, radius, normal] = f2.get_circle(); + const Vec3d e1e2 = (e.second - e.first); + const Vec3d e1e2_unit = e1e2.normalized(); + + std::vector distances; + distances.emplace_back(*get_measurement(SurfaceFeature(e.first), f2).distance_strict); + distances.emplace_back(*get_measurement(SurfaceFeature(e.second), f2).distance_strict); + + const Eigen::Hyperplane plane(e1e2_unit, center); + const Eigen::ParametrizedLine line = Eigen::ParametrizedLine::Through(e.first, e.second); + const Vec3d inter = line.intersectionPoint(plane); + const Vec3d e1inter = inter - e.first; + if (e1inter.dot(e1e2) >= 0.0 && e1inter.norm() < e1e2.norm()) + distances.emplace_back(*get_measurement(SurfaceFeature(inter), f2).distance_strict); + + auto it = std::min_element(distances.begin(), distances.end(), + [](const DistAndPoints& item1, const DistAndPoints& item2) { + return item1.dist < item2.dist; + }); + result.distance_infinite = std::make_optional(DistAndPoints{it->dist, it->from, it->to}); + /////////////////////////////////////////////////////////////////////////// + } else if (f2.get_type() == SurfaceFeatureType::Plane) { + assert(measuring != nullptr); + + const auto [from, to] = f1.get_edge(); + const auto [idx, normal, origin] = f2.get_plane(); + + const Vec3d edge_unit = (to - from).normalized(); + if (are_perpendicular(edge_unit, normal)) { + std::vector distances; + const Eigen::Hyperplane plane(normal, origin); + distances.push_back(DistAndPoints{ plane.absDistance(from), from, plane.projection(from) }); + distances.push_back(DistAndPoints{ plane.absDistance(to), to, plane.projection(to) }); + auto it = std::min_element(distances.begin(), distances.end(), + [](const DistAndPoints& item1, const DistAndPoints& item2) { + return item1.dist < item2.dist; + }); + result.distance_infinite = std::make_optional(DistAndPoints{ it->dist, it->from, it->to }); + } + else { + const std::vector& plane_features = measuring->get_plane_features(idx); + std::vector distances; + for (const SurfaceFeature& sf : plane_features) { + if (sf.get_type() == SurfaceFeatureType::Edge) { + const auto m = get_measurement(sf, f1); + if (!m.distance_infinite.has_value()) { + distances.clear(); + break; + } + else + distances.push_back(*m.distance_infinite); + } + } + if (!distances.empty()) { + auto it = std::min_element(distances.begin(), distances.end(), + [](const DistAndPoints& item1, const DistAndPoints& item2) { + return item1.dist < item2.dist; + }); + result.distance_infinite = std::make_optional(DistAndPoints{ it->dist, it->from, it->to }); + } + } + result.angle = angle_edge_plane(f1.get_edge(), f2.get_plane()); + } + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + } else if (f1.get_type() == SurfaceFeatureType::Circle) { + if (f2.get_type() == SurfaceFeatureType::Circle) { + const auto [c0, r0, n0] = f1.get_circle(); + const auto [c1, r1, n1] = f2.get_circle(); + + // The following code is an adaptation of the algorithm found in: + // https://github.com/davideberly/GeometricTools/blob/master/GTE/Mathematics/DistCircle3Circle3.h + // and described in: + // https://www.geometrictools.com/Documentation/DistanceToCircle3.pdf + + struct ClosestInfo + { + double sqrDistance{ 0.0 }; + Vec3d circle0Closest{ Vec3d::Zero() }; + Vec3d circle1Closest{ Vec3d::Zero() }; + + inline bool operator < (const ClosestInfo& other) const { return sqrDistance < other.sqrDistance; } + }; + std::array candidates{}; + + const double zero = 0.0; + + const Vec3d D = c1 - c0; + + if (!are_parallel(n0, n1)) { + // Get parameters for constructing the degree-8 polynomial phi. + const double one = 1.0; + const double two = 2.0; + const double r0sqr = sqr(r0); + const double r1sqr = sqr(r1); + + // Compute U1 and V1 for the plane of circle1. + const std::array basis = orthonormal_basis(n1); + const Vec3d U1 = basis[0]; + const Vec3d V1 = basis[1]; + + // Construct the polynomial phi(cos(theta)). + const Vec3d N0xD = n0.cross(D); + const Vec3d N0xU1 = n0.cross(U1); + const Vec3d N0xV1 = n0.cross(V1); + const double a0 = r1 * D.dot(U1); + const double a1 = r1 * D.dot(V1); + const double a2 = N0xD.dot(N0xD); + const double a3 = r1 * N0xD.dot(N0xU1); + const double a4 = r1 * N0xD.dot(N0xV1); + const double a5 = r1sqr * N0xU1.dot(N0xU1); + const double a6 = r1sqr * N0xU1.dot(N0xV1); + const double a7 = r1sqr * N0xV1.dot(N0xV1); + Polynomial1 p0{ a2 + a7, two * a3, a5 - a7 }; + Polynomial1 p1{ two * a4, two * a6 }; + Polynomial1 p2{ zero, a1 }; + Polynomial1 p3{ -a0 }; + Polynomial1 p4{ -a6, a4, two * a6 }; + Polynomial1 p5{ -a3, a7 - a5 }; + Polynomial1 tmp0{ one, zero, -one }; + Polynomial1 tmp1 = p2 * p2 + tmp0 * p3 * p3; + Polynomial1 tmp2 = two * p2 * p3; + Polynomial1 tmp3 = p4 * p4 + tmp0 * p5 * p5; + Polynomial1 tmp4 = two * p4 * p5; + Polynomial1 p6 = p0 * tmp1 + tmp0 * p1 * tmp2 - r0sqr * tmp3; + Polynomial1 p7 = p0 * tmp2 + p1 * tmp1 - r0sqr * tmp4; + + // Parameters for polynomial root finding. The roots[] array + // stores the roots. We need only the unique ones, which is + // the responsibility of the set uniqueRoots. The pairs[] + // array stores the (cosine,sine) information mentioned in the + // PDF. TODO: Choose the maximum number of iterations for root + // finding based on specific polynomial data? + const uint32_t maxIterations = 128; + int32_t degree = 0; + size_t numRoots = 0; + std::array roots{}; + std::set uniqueRoots{}; + size_t numPairs = 0; + std::array, 16> pairs{}; + double temp = zero; + double sn = zero; + + if (p7.GetDegree() > 0 || p7[0] != zero) { + // H(cs,sn) = p6(cs) + sn * p7(cs) + Polynomial1 phi = p6 * p6 - tmp0 * p7 * p7; + degree = static_cast(phi.GetDegree()); + assert(degree > 0); + numRoots = RootsPolynomial::Find(degree, &phi[0], maxIterations, roots.data()); + for (size_t i = 0; i < numRoots; ++i) { + uniqueRoots.insert(roots[i]); + } + + for (auto const& cs : uniqueRoots) { + if (std::fabs(cs) <= one) { + temp = p7(cs); + if (temp != zero) { + sn = -p6(cs) / temp; + pairs[numPairs++] = std::make_pair(cs, sn); + } + else { + temp = std::max(one - sqr(cs), zero); + sn = std::sqrt(temp); + pairs[numPairs++] = std::make_pair(cs, sn); + if (sn != zero) + pairs[numPairs++] = std::make_pair(cs, -sn); + } + } + } + } + else { + // H(cs,sn) = p6(cs) + degree = static_cast(p6.GetDegree()); + assert(degree > 0); + numRoots = RootsPolynomial::Find(degree, &p6[0], maxIterations, roots.data()); + for (size_t i = 0; i < numRoots; ++i) { + uniqueRoots.insert(roots[i]); + } + + for (auto const& cs : uniqueRoots) { + if (std::fabs(cs) <= one) { + temp = std::max(one - sqr(cs), zero); + sn = std::sqrt(temp); + pairs[numPairs++] = std::make_pair(cs, sn); + if (sn != zero) + pairs[numPairs++] = std::make_pair(cs, -sn); + } + } + } + + for (size_t i = 0; i < numPairs; ++i) { + ClosestInfo& info = candidates[i]; + Vec3d delta = D + r1 * (pairs[i].first * U1 + pairs[i].second * V1); + info.circle1Closest = c0 + delta; + const double N0dDelta = n0.dot(delta); + const double lenN0xDelta = n0.cross(delta).norm(); + if (lenN0xDelta > 0.0) { + const double diff = lenN0xDelta - r0; + info.sqrDistance = sqr(N0dDelta) + sqr(diff); + delta -= N0dDelta * n0; + delta.normalize(); + info.circle0Closest = c0 + r0 * delta; + } + else { + const Vec3d r0U0 = r0 * get_orthogonal(n0, true); + const Vec3d diff = delta - r0U0; + info.sqrDistance = diff.dot(diff); + info.circle0Closest = c0 + r0U0; + } + } + + std::sort(candidates.begin(), candidates.begin() + numPairs); + } + else { + ClosestInfo& info = candidates[0]; + + const double N0dD = n0.dot(D); + const Vec3d normProj = N0dD * n0; + const Vec3d compProj = D - normProj; + Vec3d U = compProj; + const double d = U.norm(); + U.normalize(); + + // The configuration is determined by the relative location of the + // intervals of projection of the circles on to the D-line. + // Circle0 projects to [-r0,r0] and circle1 projects to + // [d-r1,d+r1]. + const double dmr1 = d - r1; + double distance; + if (dmr1 >= r0) { + // d >= r0 + r1 + // The circles are separated (d > r0 + r1) or tangent with one + // outside the other (d = r0 + r1). + distance = dmr1 - r0; + info.circle0Closest = c0 + r0 * U; + info.circle1Closest = c1 - r1 * U; + } + else { + // d < r0 + r1 + // The cases implicitly use the knowledge that d >= 0. + const double dpr1 = d + r1; + if (dpr1 <= r0) { + // Circle1 is inside circle0. + distance = r0 - dpr1; + if (d > 0.0) { + info.circle0Closest = c0 + r0 * U; + info.circle1Closest = c1 + r1 * U; + } + else { + // The circles are concentric, so U = (0,0,0). + // Construct a vector perpendicular to N0 to use for + // closest points. + U = get_orthogonal(n0, true); + info.circle0Closest = c0 + r0 * U; + info.circle1Closest = c1 + r1 * U; + } + } + else if (dmr1 <= -r0) { + // Circle0 is inside circle1. + distance = -r0 - dmr1; + if (d > 0.0) { + info.circle0Closest = c0 - r0 * U; + info.circle1Closest = c1 - r1 * U; + } + else { + // The circles are concentric, so U = (0,0,0). + // Construct a vector perpendicular to N0 to use for + // closest points. + U = get_orthogonal(n0, true); + info.circle0Closest = c0 + r0 * U; + info.circle1Closest = c1 + r1 * U; + } + } + else { + distance = (c1 - c0).norm(); + info.circle0Closest = c0; + info.circle1Closest = c1; + } + } + + info.sqrDistance = distance * distance + N0dD * N0dD; + } + + result.distance_infinite = std::make_optional(DistAndPoints{ std::sqrt(candidates[0].sqrDistance), candidates[0].circle0Closest, candidates[0].circle1Closest }); // TODO + /////////////////////////////////////////////////////////////////////////// + } else if (f2.get_type() == SurfaceFeatureType::Plane) { + assert(measuring != nullptr); + + const auto [center, radius, normal1] = f1.get_circle(); + const auto [idx2, normal2, origin2] = f2.get_plane(); + + const bool coplanar = are_parallel(normal1, normal2) && Eigen::Hyperplane(normal1, center).absDistance(origin2) < EPSILON; + if (!coplanar) { + const std::vector& plane_features = measuring->get_plane_features(idx2); + std::vector distances; + for (const SurfaceFeature& sf : plane_features) { + if (sf.get_type() == SurfaceFeatureType::Edge) { + const auto m = get_measurement(sf, f1); + if (!m.distance_infinite.has_value()) { + distances.clear(); + break; + } + else + distances.push_back(*m.distance_infinite); + } + } + if (!distances.empty()) { + auto it = std::min_element(distances.begin(), distances.end(), + [](const DistAndPoints& item1, const DistAndPoints& item2) { + return item1.dist < item2.dist; + }); + result.distance_infinite = std::make_optional(DistAndPoints{ it->dist, it->from, it->to }); + } + } + } + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + } else if (f1.get_type() == SurfaceFeatureType::Plane) { + const auto [idx1, normal1, pt1] = f1.get_plane(); + const auto [idx2, normal2, pt2] = f2.get_plane(); + + if (are_parallel(normal1, normal2)) { + // The planes are parallel, calculate distance. + const Eigen::Hyperplane plane(normal1, pt1); + result.distance_infinite = std::make_optional(DistAndPoints{ plane.absDistance(pt2), pt2, plane.projection(pt2) }); // TODO + } + else + result.angle = angle_plane_plane(f1.get_plane(), f2.get_plane()); + } + + return result; +} + + + + + + + + +} // namespace Measure +} // namespace Slic3r + diff --git a/src/libslic3r/Measure.hpp b/src/libslic3r/Measure.hpp new file mode 100644 index 00000000000..a273135ca8b --- /dev/null +++ b/src/libslic3r/Measure.hpp @@ -0,0 +1,196 @@ +#ifndef Slic3r_Measure_hpp_ +#define Slic3r_Measure_hpp_ + +#include +#include + +#include "Point.hpp" + + +struct indexed_triangle_set; + + + +namespace Slic3r { + +class TriangleMesh; + +namespace Measure { + + +enum class SurfaceFeatureType : int { + Undef = 0, + Point = 1 << 0, + Edge = 1 << 1, + Circle = 1 << 2, + Plane = 1 << 3 +}; + +class SurfaceFeature { +public: + SurfaceFeature(SurfaceFeatureType type, const Vec3d& pt1, const Vec3d& pt2, std::optional pt3 = std::nullopt, double value = 0.0) + : m_type(type), m_pt1(pt1), m_pt2(pt2), m_pt3(pt3), m_value(value) {} + + explicit SurfaceFeature(const Vec3d& pt) + : m_type{SurfaceFeatureType::Point}, m_pt1{pt} {} + + // Get type of this feature. + SurfaceFeatureType get_type() const { return m_type; } + + // For points, return the point. + Vec3d get_point() const { assert(m_type == SurfaceFeatureType::Point); return m_pt1; } + + // For edges, return start and end. + std::pair get_edge() const { assert(m_type == SurfaceFeatureType::Edge); return std::make_pair(m_pt1, m_pt2); } + + // For circles, return center, radius and normal. + std::tuple get_circle() const { assert(m_type == SurfaceFeatureType::Circle); return std::make_tuple(m_pt1, m_value, m_pt2); } + + // For planes, return index into vector provided by Measuring::get_plane_triangle_indices, normal and point. + std::tuple get_plane() const { assert(m_type == SurfaceFeatureType::Plane); return std::make_tuple(int(m_value), m_pt1, m_pt2); } + + // For anything, return an extra point that should also be considered a part of this. + std::optional get_extra_point() const { assert(m_type != SurfaceFeatureType::Undef); return m_pt3; } + + bool operator == (const SurfaceFeature& other) const { + if (this->m_type != other.m_type) return false; + switch (this->m_type) + { + case SurfaceFeatureType::Undef: { break; } + case SurfaceFeatureType::Point: { return (this->m_pt1.isApprox(other.m_pt1)); } + case SurfaceFeatureType::Edge: { + return (this->m_pt1.isApprox(other.m_pt1) && this->m_pt2.isApprox(other.m_pt2)) || + (this->m_pt1.isApprox(other.m_pt2) && this->m_pt2.isApprox(other.m_pt1)); + } + case SurfaceFeatureType::Plane: + case SurfaceFeatureType::Circle: { + return (this->m_pt1.isApprox(other.m_pt1) && this->m_pt2.isApprox(other.m_pt2) && std::abs(this->m_value - other.m_value) < EPSILON); + } + } + + return false; + } + + bool operator != (const SurfaceFeature& other) const { + return !operator == (other); + } + +private: + SurfaceFeatureType m_type{ SurfaceFeatureType::Undef }; + Vec3d m_pt1{ Vec3d::Zero() }; + Vec3d m_pt2{ Vec3d::Zero() }; + std::optional m_pt3; + double m_value{ 0.0 }; +}; + + + +class MeasuringImpl; + + +class Measuring { +public: + // Construct the measurement object on a given its. + explicit Measuring(const indexed_triangle_set& its); + ~Measuring(); + + + // Given a face_idx where the mouse cursor points, return a feature that + // should be highlighted (if any). + std::optional get_feature(size_t face_idx, const Vec3d& point) const; + + // Return total number of planes. + int get_num_of_planes() const; + + // Returns a list of triangle indices for given plane. + const std::vector& get_plane_triangle_indices(int idx) const; + + // Returns the surface features of the plane with the given index + const std::vector& get_plane_features(unsigned int plane_id) const; + + // Returns the mesh used for measuring + const TriangleMesh& get_mesh() const; + +private: + std::unique_ptr priv; +}; + + +struct DistAndPoints { + DistAndPoints(double dist_, Vec3d from_, Vec3d to_) : dist(dist_), from(from_), to(to_) {} + double dist; + Vec3d from; + Vec3d to; +}; + +struct AngleAndEdges { + AngleAndEdges(double angle_, const Vec3d& center_, const std::pair& e1_, const std::pair& e2_, double radius_, bool coplanar_) + : angle(angle_), center(center_), e1(e1_), e2(e2_), radius(radius_), coplanar(coplanar_) {} + double angle; + Vec3d center; + std::pair e1; + std::pair e2; + double radius; + bool coplanar; + + static const AngleAndEdges Dummy; +}; + +struct MeasurementResult { + std::optional angle; + std::optional distance_infinite; + std::optional distance_strict; + std::optional distance_xyz; + + bool has_distance_data() const { + return distance_infinite.has_value() || distance_strict.has_value(); + } + + bool has_any_data() const { + return angle.has_value() || distance_infinite.has_value() || distance_strict.has_value() || distance_xyz.has_value(); + } +}; + +// Returns distance/angle between two SurfaceFeatures. +MeasurementResult get_measurement(const SurfaceFeature& a, const SurfaceFeature& b, const Measuring* measuring = nullptr); + +inline Vec3d edge_direction(const Vec3d& from, const Vec3d& to) { return (to - from).normalized(); } +inline Vec3d edge_direction(const std::pair& e) { return edge_direction(e.first, e.second); } +inline Vec3d edge_direction(const SurfaceFeature& edge) { + assert(edge.get_type() == SurfaceFeatureType::Edge); + return edge_direction(edge.get_edge()); +} + +inline Vec3d plane_normal(const SurfaceFeature& plane) { + assert(plane.get_type() == SurfaceFeatureType::Plane); + return std::get<1>(plane.get_plane()); +} + +inline bool are_parallel(const Vec3d& v1, const Vec3d& v2) { return std::abs(std::abs(v1.dot(v2)) - 1.0) < EPSILON; } +inline bool are_perpendicular(const Vec3d& v1, const Vec3d& v2) { return std::abs(v1.dot(v2)) < EPSILON; } + +inline bool are_parallel(const std::pair& e1, const std::pair& e2) { + return are_parallel(e1.second - e1.first, e2.second - e2.first); +} +inline bool are_parallel(const SurfaceFeature& f1, const SurfaceFeature& f2) { + if (f1.get_type() == SurfaceFeatureType::Edge && f2.get_type() == SurfaceFeatureType::Edge) + return are_parallel(edge_direction(f1), edge_direction(f2)); + else if (f1.get_type() == SurfaceFeatureType::Edge && f2.get_type() == SurfaceFeatureType::Plane) + return are_perpendicular(edge_direction(f1), plane_normal(f2)); + else + return false; +} + +inline bool are_perpendicular(const SurfaceFeature& f1, const SurfaceFeature& f2) { + if (f1.get_type() == SurfaceFeatureType::Edge && f2.get_type() == SurfaceFeatureType::Edge) + return are_perpendicular(edge_direction(f1), edge_direction(f2)); + else if (f1.get_type() == SurfaceFeatureType::Edge && f2.get_type() == SurfaceFeatureType::Plane) + return are_parallel(edge_direction(f1), plane_normal(f2)); + else + return false; +} + +} // namespace Measure +} // namespace Slic3r + +#endif // Slic3r_Measure_hpp_ diff --git a/src/libslic3r/MeasureUtils.hpp b/src/libslic3r/MeasureUtils.hpp new file mode 100644 index 00000000000..0ab4ac121d8 --- /dev/null +++ b/src/libslic3r/MeasureUtils.hpp @@ -0,0 +1,386 @@ +#ifndef Slic3r_MeasureUtils_hpp_ +#define Slic3r_MeasureUtils_hpp_ + +#include + +namespace Slic3r { +namespace Measure { + +// Utility class used to calculate distance circle-circle +// Adaptation of code found in: +// https://github.com/davideberly/GeometricTools/blob/master/GTE/Mathematics/Polynomial1.h + +class Polynomial1 +{ +public: + Polynomial1(std::initializer_list values) + { + // C++ 11 will call the default constructor for + // Polynomial1 p{}, so it is guaranteed that + // values.size() > 0. + m_coefficient.resize(values.size()); + std::copy(values.begin(), values.end(), m_coefficient.begin()); + EliminateLeadingZeros(); + } + + // Construction and destruction. The first constructor creates a + // polynomial of the specified degree but sets all coefficients to + // zero (to ensure initialization). You are responsible for setting + // the coefficients, presumably with the degree-term set to a nonzero + // number. In the second constructor, the degree is the number of + // initializers plus 1, but then adjusted so that coefficient[degree] + // is not zero (unless all initializer values are zero). + explicit Polynomial1(uint32_t degree) + : m_coefficient(static_cast(degree) + 1, 0.0) + {} + + // Eliminate any leading zeros in the polynomial, except in the case + // the degree is 0 and the coefficient is 0. The elimination is + // necessary when arithmetic operations cause a decrease in the degree + // of the result. For example, (1 + x + x^2) + (1 + 2*x - x^2) = + // (2 + 3*x). The inputs both have degree 2, so the result is created + // with degree 2. After the addition we find that the degree is in + // fact 1 and resize the array of coefficients. This function is + // called internally by the arithmetic operators, but it is exposed in + // the public interface in case you need it for your own purposes. + void EliminateLeadingZeros() + { + const size_t size = m_coefficient.size(); + if (size > 1) { + const double zero = 0.0; + int32_t leading; + for (leading = static_cast(size) - 1; leading > 0; --leading) { + if (m_coefficient[leading] != zero) + break; + } + + m_coefficient.resize(++leading); + } + } + + // Set all coefficients to the specified value. + void SetCoefficients(double value) + { + std::fill(m_coefficient.begin(), m_coefficient.end(), value); + } + + inline uint32_t GetDegree() const + { + // By design, m_coefficient.size() > 0. + return static_cast(m_coefficient.size() - 1); + } + + inline const double& operator[](uint32_t i) const { return m_coefficient[i]; } + inline double& operator[](uint32_t i) { return m_coefficient[i]; } + + // Evaluate the polynomial. If the polynomial is invalid, the + // function returns zero. + double operator()(double t) const + { + int32_t i = static_cast(m_coefficient.size()); + double result = m_coefficient[--i]; + for (--i; i >= 0; --i) { + result *= t; + result += m_coefficient[i]; + } + return result; + } + +protected: + // The class is designed so that m_coefficient.size() >= 1. + std::vector m_coefficient; +}; + +inline Polynomial1 operator * (const Polynomial1& p0, const Polynomial1& p1) +{ + const uint32_t p0Degree = p0.GetDegree(); + const uint32_t p1Degree = p1.GetDegree(); + Polynomial1 result(p0Degree + p1Degree); + result.SetCoefficients(0.0); + for (uint32_t i0 = 0; i0 <= p0Degree; ++i0) { + for (uint32_t i1 = 0; i1 <= p1Degree; ++i1) { + result[i0 + i1] += p0[i0] * p1[i1]; + } + } + return result; +} + +inline Polynomial1 operator + (const Polynomial1& p0, const Polynomial1& p1) +{ + const uint32_t p0Degree = p0.GetDegree(); + const uint32_t p1Degree = p1.GetDegree(); + uint32_t i; + if (p0Degree >= p1Degree) { + Polynomial1 result(p0Degree); + for (i = 0; i <= p1Degree; ++i) { + result[i] = p0[i] + p1[i]; + } + for (/**/; i <= p0Degree; ++i) { + result[i] = p0[i]; + } + result.EliminateLeadingZeros(); + return result; + } + else { + Polynomial1 result(p1Degree); + for (i = 0; i <= p0Degree; ++i) { + result[i] = p0[i] + p1[i]; + } + for (/**/; i <= p1Degree; ++i) { + result[i] = p1[i]; + } + result.EliminateLeadingZeros(); + return result; + } +} + +inline Polynomial1 operator - (const Polynomial1& p0, const Polynomial1& p1) +{ + const uint32_t p0Degree = p0.GetDegree(); + const uint32_t p1Degree = p1.GetDegree(); + uint32_t i; + if (p0Degree >= p1Degree) { + Polynomial1 result(p0Degree); + for (i = 0; i <= p1Degree; ++i) { + result[i] = p0[i] - p1[i]; + } + for (/**/; i <= p0Degree; ++i) { + result[i] = p0[i]; + } + result.EliminateLeadingZeros(); + return result; + } + else { + Polynomial1 result(p1Degree); + for (i = 0; i <= p0Degree; ++i) { + result[i] = p0[i] - p1[i]; + } + for (/**/; i <= p1Degree; ++i) { + result[i] = -p1[i]; + } + result.EliminateLeadingZeros(); + return result; + } +} + +inline Polynomial1 operator * (double scalar, const Polynomial1& p) +{ + const uint32_t degree = p.GetDegree(); + Polynomial1 result(degree); + for (uint32_t i = 0; i <= degree; ++i) { + result[i] = scalar * p[i]; + } + return result; +} + +// Utility class used to calculate distance circle-circle +// Adaptation of code found in: +// https://github.com/davideberly/GeometricTools/blob/master/GTE/Mathematics/RootsPolynomial.h + +class RootsPolynomial +{ +public: + // General equations: sum_{i=0}^{d} c(i)*t^i = 0. The input array 'c' + // must have at least d+1 elements and the output array 'root' must + // have at least d elements. + + // Find the roots on (-infinity,+infinity). + static int32_t Find(int32_t degree, const double* c, uint32_t maxIterations, double* roots) + { + if (degree >= 0 && c != nullptr) { + const double zero = 0.0; + while (degree >= 0 && c[degree] == zero) { + --degree; + } + + if (degree > 0) { + // Compute the Cauchy bound. + const double one = 1.0; + const double invLeading = one / c[degree]; + double maxValue = zero; + for (int32_t i = 0; i < degree; ++i) { + const double value = std::fabs(c[i] * invLeading); + if (value > maxValue) + maxValue = value; + } + const double bound = one + maxValue; + + return FindRecursive(degree, c, -bound, bound, maxIterations, roots); + } + else if (degree == 0) + // The polynomial is a nonzero constant. + return 0; + else { + // The polynomial is identically zero. + roots[0] = zero; + return 1; + } + } + else + // Invalid degree or c. + return 0; + } + + // If you know that p(tmin) * p(tmax) <= 0, then there must be at + // least one root in [tmin, tmax]. Compute it using bisection. + static bool Find(int32_t degree, const double* c, double tmin, double tmax, uint32_t maxIterations, double& root) + { + const double zero = 0.0; + double pmin = Evaluate(degree, c, tmin); + if (pmin == zero) { + root = tmin; + return true; + } + double pmax = Evaluate(degree, c, tmax); + if (pmax == zero) { + root = tmax; + return true; + } + + if (pmin * pmax > zero) + // It is not known whether the interval bounds a root. + return false; + + if (tmin >= tmax) + // Invalid ordering of interval endpoitns. + return false; + + for (uint32_t i = 1; i <= maxIterations; ++i) { + root = 0.5 * (tmin + tmax); + + // This test is designed for 'float' or 'double' when tmin + // and tmax are consecutive floating-point numbers. + if (root == tmin || root == tmax) + break; + + const double p = Evaluate(degree, c, root); + const double product = p * pmin; + if (product < zero) { + tmax = root; + pmax = p; + } + else if (product > zero) { + tmin = root; + pmin = p; + } + else + break; + } + + return true; + } + + // Support for the Find functions. + static int32_t FindRecursive(int32_t degree, double const* c, double tmin, double tmax, uint32_t maxIterations, double* roots) + { + // The base of the recursion. + const double zero = 0.0; + double root = zero; + if (degree == 1) { + int32_t numRoots; + if (c[1] != zero) { + root = -c[0] / c[1]; + numRoots = 1; + } + else if (c[0] == zero) { + root = zero; + numRoots = 1; + } + else + numRoots = 0; + + if (numRoots > 0 && tmin <= root && root <= tmax) { + roots[0] = root; + return 1; + } + return 0; + } + + // Find the roots of the derivative polynomial scaled by 1/degree. + // The scaling avoids the factorial growth in the coefficients; + // for example, without the scaling, the high-order term x^d + // becomes (d!)*x through multiple differentiations. With the + // scaling we instead get x. This leads to better numerical + // behavior of the root finder. + const int32_t derivDegree = degree - 1; + std::vector derivCoeff(static_cast(derivDegree) + 1); + std::vector derivRoots(derivDegree); + for (int32_t i = 0, ip1 = 1; i <= derivDegree; ++i, ++ip1) { + derivCoeff[i] = c[ip1] * (double)(ip1) / (double)degree; + } + const int32_t numDerivRoots = FindRecursive(degree - 1, &derivCoeff[0], tmin, tmax, maxIterations, &derivRoots[0]); + + int32_t numRoots = 0; + if (numDerivRoots > 0) { + // Find root on [tmin,derivRoots[0]]. + if (Find(degree, c, tmin, derivRoots[0], maxIterations, root)) + roots[numRoots++] = root; + + // Find root on [derivRoots[i],derivRoots[i+1]]. + for (int32_t i = 0, ip1 = 1; i <= numDerivRoots - 2; ++i, ++ip1) { + if (Find(degree, c, derivRoots[i], derivRoots[ip1], maxIterations, root)) + roots[numRoots++] = root; + } + + // Find root on [derivRoots[numDerivRoots-1],tmax]. + if (Find(degree, c, derivRoots[static_cast(numDerivRoots) - 1], tmax, maxIterations, root)) + roots[numRoots++] = root; + } + else { + // The polynomial is monotone on [tmin,tmax], so has at most one root. + if (Find(degree, c, tmin, tmax, maxIterations, root)) + roots[numRoots++] = root; + } + return numRoots; + } + + static double Evaluate(int32_t degree, const double* c, double t) + { + int32_t i = degree; + double result = c[i]; + while (--i >= 0) { + result = t * result + c[i]; + } + return result; + } +}; + +// Adaptation of code found in: +// https://github.com/davideberly/GeometricTools/blob/master/GTE/Mathematics/Vector.h + +// Construct a single vector orthogonal to the nonzero input vector. If +// the maximum absolute component occurs at index i, then the orthogonal +// vector U has u[i] = v[i+1], u[i+1] = -v[i], and all other components +// zero. The index addition i+1 is computed modulo N. +inline Vec3d get_orthogonal(const Vec3d& v, bool unitLength) +{ + double cmax = std::fabs(v[0]); + int32_t imax = 0; + for (int32_t i = 1; i < 3; ++i) { + double c = std::fabs(v[i]); + if (c > cmax) { + cmax = c; + imax = i; + } + } + + Vec3d result = Vec3d::Zero(); + int32_t inext = imax + 1; + if (inext == 3) + inext = 0; + + result[imax] = v[inext]; + result[inext] = -v[imax]; + if (unitLength) { + const double sqrDistance = result[imax] * result[imax] + result[inext] * result[inext]; + const double invLength = 1.0 / std::sqrt(sqrDistance); + result[imax] *= invLength; + result[inext] *= invLength; + } + return result; +} + +} // namespace Slic3r +} // namespace Measure + +#endif // Slic3r_MeasureUtils_hpp_ diff --git a/src/libslic3r/MeshBoolean.cpp b/src/libslic3r/MeshBoolean.cpp index 00ee1717f6f..c7ebcbd19e0 100644 --- a/src/libslic3r/MeshBoolean.cpp +++ b/src/libslic3r/MeshBoolean.cpp @@ -137,7 +137,8 @@ inline Vec3f to_vec3f(const _EpecMesh::Point& v) return { float(iv.x()), float(iv.y()), float(iv.z()) }; } -template TriangleMesh cgal_to_triangle_mesh(const _Mesh &cgalmesh) +template +indexed_triangle_set cgal_to_indexed_triangle_set(const _Mesh &cgalmesh) { indexed_triangle_set its; its.vertices.reserve(cgalmesh.num_vertices()); @@ -167,7 +168,7 @@ template TriangleMesh cgal_to_triangle_mesh(const _Mesh &cgalmesh) its.indices.emplace_back(facet); } - return TriangleMesh(std::move(its)); + return its; } std::unique_ptr @@ -181,7 +182,12 @@ triangle_mesh_to_cgal(const std::vector &V, TriangleMesh cgal_to_triangle_mesh(const CGALMesh &cgalmesh) { - return cgal_to_triangle_mesh(cgalmesh.m); + return TriangleMesh{cgal_to_indexed_triangle_set(cgalmesh.m)}; +} + +indexed_triangle_set cgal_to_indexed_triangle_set(const CGALMesh &cgalmesh) +{ + return cgal_to_indexed_triangle_set(cgalmesh.m); } // ///////////////////////////////////////////////////////////////////////////// @@ -236,16 +242,28 @@ bool does_self_intersect(const CGALMesh &mesh) { return CGALProc::does_self_inte // Now the public functions for TriangleMesh input: // ///////////////////////////////////////////////////////////////////////////// +template void _mesh_boolean_do(Op &&op, indexed_triangle_set &A, const indexed_triangle_set &B) +{ + CGALMesh meshA; + CGALMesh meshB; + triangle_mesh_to_cgal(A.vertices, A.indices, meshA.m); + triangle_mesh_to_cgal(B.vertices, B.indices, meshB.m); + + _cgal_do(op, meshA, meshB); + + A = cgal_to_indexed_triangle_set(meshA.m); +} + template void _mesh_boolean_do(Op &&op, TriangleMesh &A, const TriangleMesh &B) { CGALMesh meshA; CGALMesh meshB; triangle_mesh_to_cgal(A.its.vertices, A.its.indices, meshA.m); triangle_mesh_to_cgal(B.its.vertices, B.its.indices, meshB.m); - + _cgal_do(op, meshA, meshB); - - A = cgal_to_triangle_mesh(meshA.m); + + A = cgal_to_triangle_mesh(meshA); } void minus(TriangleMesh &A, const TriangleMesh &B) @@ -263,6 +281,21 @@ void intersect(TriangleMesh &A, const TriangleMesh &B) _mesh_boolean_do(_cgal_intersection, A, B); } +void minus(indexed_triangle_set &A, const indexed_triangle_set &B) +{ + _mesh_boolean_do(_cgal_diff, A, B); +} + +void plus(indexed_triangle_set &A, const indexed_triangle_set &B) +{ + _mesh_boolean_do(_cgal_union, A, B); +} + +void intersect(indexed_triangle_set &A, const indexed_triangle_set &B) +{ + _mesh_boolean_do(_cgal_intersection, A, B); +} + bool does_self_intersect(const TriangleMesh &mesh) { CGALMesh cgalm; @@ -274,7 +307,7 @@ void CGALMeshDeleter::operator()(CGALMesh *ptr) { delete ptr; } bool does_bound_a_volume(const CGALMesh &mesh) { - return CGALProc::does_bound_a_volume(mesh.m); + return CGAL::is_closed(mesh.m) && CGALProc::does_bound_a_volume(mesh.m); } bool empty(const CGALMesh &mesh) @@ -282,6 +315,11 @@ bool empty(const CGALMesh &mesh) return mesh.m.is_empty(); } +CGALMeshPtr clone(const CGALMesh &m) +{ + return CGALMeshPtr{new CGALMesh{m}}; +} + } // namespace cgal } // namespace MeshBoolean diff --git a/src/libslic3r/MeshBoolean.hpp b/src/libslic3r/MeshBoolean.hpp index 140c9693103..e20425c1c7b 100644 --- a/src/libslic3r/MeshBoolean.hpp +++ b/src/libslic3r/MeshBoolean.hpp @@ -26,27 +26,35 @@ namespace cgal { struct CGALMesh; struct CGALMeshDeleter { void operator()(CGALMesh *ptr); }; +using CGALMeshPtr = std::unique_ptr; -std::unique_ptr -triangle_mesh_to_cgal(const std::vector &V, - const std::vector &F); +CGALMeshPtr clone(const CGALMesh &m); -inline std::unique_ptr triangle_mesh_to_cgal(const indexed_triangle_set &M) +CGALMeshPtr triangle_mesh_to_cgal( + const std::vector &V, + const std::vector &F); + +inline CGALMeshPtr triangle_mesh_to_cgal(const indexed_triangle_set &M) { return triangle_mesh_to_cgal(M.vertices, M.indices); } -inline std::unique_ptr triangle_mesh_to_cgal(const TriangleMesh &M) +inline CGALMeshPtr triangle_mesh_to_cgal(const TriangleMesh &M) { return triangle_mesh_to_cgal(M.its); } TriangleMesh cgal_to_triangle_mesh(const CGALMesh &cgalmesh); - +indexed_triangle_set cgal_to_indexed_triangle_set(const CGALMesh &cgalmesh); + // Do boolean mesh difference with CGAL bypassing igl. void minus(TriangleMesh &A, const TriangleMesh &B); void plus(TriangleMesh &A, const TriangleMesh &B); void intersect(TriangleMesh &A, const TriangleMesh &B); +void minus(indexed_triangle_set &A, const indexed_triangle_set &B); +void plus(indexed_triangle_set &A, const indexed_triangle_set &B); +void intersect(indexed_triangle_set &A, const indexed_triangle_set &B); + void minus(CGALMesh &A, CGALMesh &B); void plus(CGALMesh &A, CGALMesh &B); void intersect(CGALMesh &A, CGALMesh &B); diff --git a/src/libslic3r/MeshNormals.cpp b/src/libslic3r/MeshNormals.cpp new file mode 100644 index 00000000000..3f7117899a7 --- /dev/null +++ b/src/libslic3r/MeshNormals.cpp @@ -0,0 +1,163 @@ +#include "MeshNormals.hpp" + +#include +#include + +namespace Slic3r { + +static bool point_on_edge(const Vec3d& p, const Vec3d& e1, const Vec3d& e2, + double epsSq = 0.05) +{ + using Line3D = Eigen::ParametrizedLine; + + auto line = Line3D::Through(e1, e2); + return line.squaredDistance(p) < epsSq; +} + +Vec3d get_normal(const AABBMesh &mesh, + const Vec3d &picking_point, + double eps) +{ + Vec3d ret = Vec3d::Zero(); + + int faceid = 0; + Vec3d p; + + mesh.squared_distance(picking_point, faceid, p); + assert(int(faceid) < int(mesh.get_triangle_mesh()->indices.size())); + + auto trindex = mesh.indices(faceid); + + const Vec3d &p1 = mesh.vertices(trindex(0)).cast(); + const Vec3d &p2 = mesh.vertices(trindex(1)).cast(); + const Vec3d &p3 = mesh.vertices(trindex(2)).cast(); + + // We should check if the point lies on an edge of the hosting + // triangle. If it does then all the other triangles using the + // same two points have to be searched and the final normal should + // be some kind of aggregation of the participating triangle + // normals. We should also consider the cases where the support + // point lies right on a vertex of its triangle. The procedure is + // the same, get the neighbor triangles and calculate an average + // normal. + + // Mark the vertex indices of the edge. ia and ib marks an edge. + // ic will mark a single vertex. + int vertex_idx = -1; + int edge_idx = -1; + double epsSq = eps * eps; + if ((p - p1).squaredNorm() < epsSq) { + vertex_idx = trindex(0); + } else if ((p - p2).squaredNorm() < epsSq) { + vertex_idx = trindex(1); + } else if ((p - p3).squaredNorm() < epsSq) { + vertex_idx = trindex(2); + } else if (point_on_edge(p, p1, p2, epsSq)) { + edge_idx = 0; + } else if (point_on_edge(p, p2, p3, epsSq)) { + edge_idx = 1; + } else if (point_on_edge(p, p1, p3, epsSq)) { + edge_idx = 2; + } + + // vector for the neigboring triangles including the detected one. + constexpr size_t MAX_EXPECTED_NEIGHBORS = 10; + boost::container::small_vector neigh; + + auto &vfidx = mesh.vertex_face_index(); + auto cmpfn = [](const Vec3d &v1, const Vec3d &v2) { return v1.sum() < v2.sum(); }; + auto eqfn = [](const Vec3d &n1, const Vec3d &n2) { + // Compare normals for equivalence. + // This is controvers stuff. + auto deq = [](double a, double b) { + return std::abs(a - b) < 1e-3; + }; + return deq(n1(X), n2(X)) && + deq(n1(Y), n2(Y)) && + deq(n1(Z), n2(Z)); + }; + + if (vertex_idx >= 0) { // The point is right on a vertex of the triangle + neigh.reserve(vfidx.count(vertex_idx)); + + auto from = vfidx.begin(vertex_idx); + auto to = vfidx.end(vertex_idx); + for (auto it = from; it != to; ++it) { + Vec3d nrm = mesh.normal_by_face_id(*it); + auto oit = std::lower_bound(neigh.begin(), neigh.end(), nrm, cmpfn); + if (oit == neigh.end() || !eqfn(*oit, nrm)) + neigh.insert(oit, mesh.normal_by_face_id(*it)); + } + } else if (edge_idx >= 0) { // the point is on and edge + size_t neighbor_face = mesh.face_neighbor_index()[faceid](edge_idx); + if (neighbor_face < mesh.indices().size()) { + neigh.emplace_back(mesh.normal_by_face_id(faceid)); + neigh.emplace_back(mesh.normal_by_face_id(neighbor_face)); + } + } + + if (!neigh.empty()) { // there were neighbors to count with + // sum up the normals and then normalize the result again. + // This unification seems to be enough. + Vec3d sumnorm(0, 0, 0); + sumnorm = std::accumulate(neigh.begin(), neigh.end(), sumnorm); + sumnorm.normalize(); + ret = sumnorm; + } else { // point lies safely within its triangle + Eigen::Vector3d U = p2 - p1; + Eigen::Vector3d V = p3 - p1; + ret = U.cross(V).normalized(); + } + + return ret; +} + +template +Eigen::MatrixXd normals(Ex ex_policy, + const PointSet &points, + const AABBMesh &mesh, + double eps, + std::function thr, // throw on cancel + const std::vector &pt_indices) +{ + if (points.rows() == 0 || mesh.vertices().empty() || + mesh.indices().empty()) + return {}; + + std::vector range = pt_indices; + if (range.empty()) { + range.resize(size_t(points.rows()), 0); + std::iota(range.begin(), range.end(), 0); + } + + PointSet ret(range.size(), 3); + + + execution::for_each(ex_policy, size_t(0), range.size(), + [&ret, &mesh, &points, thr, eps, &range](size_t ridx) { + thr(); + unsigned el = range[ridx]; + auto eidx = Eigen::Index(el); + auto picking_point = points.row(eidx); + + ret.row(ridx) = get_normal(mesh, picking_point, eps); + }); + + return ret; +} + +template Eigen::MatrixXd normals(ExecutionSeq policy, + const PointSet &points, + const AABBMesh &convert_mesh, + double eps, + std::function throw_on_cancel, + const std::vector &selected_points); + +template Eigen::MatrixXd normals(ExecutionTBB policy, + const PointSet &points, + const AABBMesh &convert_mesh, + double eps, + std::function throw_on_cancel, + const std::vector &selected_points); + +} // namespace Slic3r diff --git a/src/libslic3r/MeshNormals.hpp b/src/libslic3r/MeshNormals.hpp new file mode 100644 index 00000000000..104f45c243c --- /dev/null +++ b/src/libslic3r/MeshNormals.hpp @@ -0,0 +1,52 @@ +#ifndef MESHNORMALS_HPP +#define MESHNORMALS_HPP + +#include "AABBMesh.hpp" + +#include "libslic3r/Execution/ExecutionSeq.hpp" +#include "libslic3r/Execution/ExecutionTBB.hpp" + +namespace Slic3r { + +// Get a good approximation of the normal for any picking point on the mesh. +// For points projecting to a face, this is the face normal, but when the +// picking point is on an edge or a vertex of the mesh, the normal is the +// normalized sum of each unique face normal (works nicely). The eps parameter +// gives a tolerance for how close a sample point has to be to an edge or +// vertex to start considering neighboring faces for the resulting normal. +Vec3d get_normal(const AABBMesh &mesh, + const Vec3d &picking_point, + double eps = 0.05); + +using PointSet = Eigen::MatrixXd; + +// Calculate the normals for the selected points (from 'points' set) on the +// mesh. This will call squared distance for each point. +template +Eigen::MatrixXd normals( + Ex ex_policy, + const PointSet &points, + const AABBMesh &convert_mesh, + double eps = 0.05, // min distance from edges + std::function throw_on_cancel = []() {}, + const std::vector &selected_points = {}); + +extern template Eigen::MatrixXd normals( + ExecutionSeq policy, + const PointSet &points, + const AABBMesh &convert_mesh, + double eps, + std::function throw_on_cancel, + const std::vector &selected_points); + +extern template Eigen::MatrixXd normals( + ExecutionTBB policy, + const PointSet &points, + const AABBMesh &convert_mesh, + double eps, + std::function throw_on_cancel, + const std::vector &selected_points); + +} // namespace Slic3r + +#endif // MESHNORMALS_HPP diff --git a/src/libslic3r/MeshSplitImpl.hpp b/src/libslic3r/MeshSplitImpl.hpp index c9df648fb9d..0f1fe44c355 100644 --- a/src/libslic3r/MeshSplitImpl.hpp +++ b/src/libslic3r/MeshSplitImpl.hpp @@ -108,6 +108,21 @@ template struct ItsNeighborsWrapper const auto& get_index() const noexcept { return index_ref; } }; +// Can be used as the second argument to its_split to apply a functor on each +// part, instead of collecting them into a container. +template +struct SplitOutputFn { + + Fn fn; + + SplitOutputFn(Fn f): fn{std::move(f)} {} + + SplitOutputFn &operator *() { return *this; } + void operator=(indexed_triangle_set &&its) { fn(std::move(its)); } + void operator=(indexed_triangle_set &its) { fn(its); } + SplitOutputFn& operator++() { return *this; }; +}; + // Splits a mesh into multiple meshes when possible. template void its_split(const Its &m, OutputIt out_it) @@ -155,7 +170,8 @@ void its_split(const Its &m, OutputIt out_it) mesh.indices.emplace_back(new_face); } - out_it = std::move(mesh); + *out_it = std::move(mesh); + ++out_it; } } diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 2c5200886ae..08e70964e4c 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -323,14 +323,30 @@ bool Model::add_default_instances() } // this returns the bounding box of the *transformed* instances -BoundingBoxf3 Model::bounding_box() const +BoundingBoxf3 Model::bounding_box_approx() const { BoundingBoxf3 bb; for (ModelObject *o : this->objects) - bb.merge(o->bounding_box()); + bb.merge(o->bounding_box_approx()); return bb; } +BoundingBoxf3 Model::bounding_box_exact() const +{ + BoundingBoxf3 bb; + for (ModelObject *o : this->objects) + bb.merge(o->bounding_box_exact()); + return bb; +} + +double Model::max_z() const +{ + double z = 0; + for (ModelObject *o : this->objects) + z = std::max(z, o->max_z()); + return z; +} + unsigned int Model::update_print_volume_state(const BuildVolume &build_volume) { unsigned int num_printable = 0; @@ -377,7 +393,7 @@ void Model::duplicate_objects_grid(size_t x, size_t y, coordf_t dist) ModelObject* object = this->objects.front(); object->clear_instances(); - Vec3d ext_size = object->bounding_box().size() + dist * Vec3d::Ones(); + Vec3d ext_size = object->bounding_box_exact().size() + dist * Vec3d::Ones(); for (size_t x_copy = 1; x_copy <= x; ++x_copy) { for (size_t y_copy = 1; y_copy <= y; ++y_copy) { @@ -464,12 +480,25 @@ static constexpr const double volume_threshold_inches = 9.0; // 9 = 3*3*3; bool Model::looks_like_imperial_units() const { - if (this->objects.size() == 0) + if (this->objects.empty()) return false; for (ModelObject* obj : this->objects) - if (obj->get_object_stl_stats().volume < volume_threshold_inches) - return true; + if (obj->get_object_stl_stats().volume < volume_threshold_inches) { + if (!obj->is_cut()) + return true; + bool all_cut_parts_look_like_imperial_units = true; + for (ModelObject* obj_other : this->objects) { + if (obj_other == obj) + continue; + if (obj_other->cut_id.is_equal(obj->cut_id) && obj_other->get_object_stl_stats().volume >= volume_threshold_inches) { + all_cut_parts_look_like_imperial_units = false; + break; + } + } + if (all_cut_parts_look_like_imperial_units) + return true; + } return false; } @@ -535,13 +564,13 @@ void Model::adjust_min_z() if (objects.empty()) return; - if (bounding_box().min(2) < 0.0) + if (this->bounding_box_exact().min.z() < 0.0) { for (ModelObject* obj : objects) { if (obj != nullptr) { - coordf_t obj_min_z = obj->bounding_box().min(2); + coordf_t obj_min_z = obj->min_z(); if (obj_min_z < 0.0) obj->translate_instances(Vec3d(0.0, 0.0, -obj_min_z)); } @@ -613,12 +642,8 @@ ModelObject& ModelObject::assign_copy(const ModelObject &rhs) this->layer_height_profile = rhs.layer_height_profile; this->printable = rhs.printable; this->origin_translation = rhs.origin_translation; - m_bounding_box = rhs.m_bounding_box; - m_bounding_box_valid = rhs.m_bounding_box_valid; - m_raw_bounding_box = rhs.m_raw_bounding_box; - m_raw_bounding_box_valid = rhs.m_raw_bounding_box_valid; - m_raw_mesh_bounding_box = rhs.m_raw_mesh_bounding_box; - m_raw_mesh_bounding_box_valid = rhs.m_raw_mesh_bounding_box_valid; + this->cut_id.copy(rhs.cut_id); + this->copy_transformation_caches(rhs); this->clear_volumes(); this->volumes.reserve(rhs.volumes.size()); @@ -654,12 +679,7 @@ ModelObject& ModelObject::assign_copy(ModelObject &&rhs) this->layer_height_profile = std::move(rhs.layer_height_profile); this->printable = std::move(rhs.printable); this->origin_translation = std::move(rhs.origin_translation); - m_bounding_box = std::move(rhs.m_bounding_box); - m_bounding_box_valid = std::move(rhs.m_bounding_box_valid); - m_raw_bounding_box = rhs.m_raw_bounding_box; - m_raw_bounding_box_valid = rhs.m_raw_bounding_box_valid; - m_raw_mesh_bounding_box = rhs.m_raw_mesh_bounding_box; - m_raw_mesh_bounding_box_valid = rhs.m_raw_mesh_bounding_box_valid; + this->copy_transformation_caches(rhs); this->clear_volumes(); this->volumes = std::move(rhs.volumes); @@ -715,6 +735,7 @@ ModelVolume* ModelObject::add_volume(const ModelVolume &other, ModelVolumeType t ModelVolume* v = new ModelVolume(this, other); if (type != ModelVolumeType::INVALID && v->type() != type) v->set_type(type); + v->cut_info = other.cut_info; this->volumes.push_back(v); // The volume should already be centered at this point of time when copying shared pointers of the triangle mesh and convex hull. // v->center_geometry_after_creation(); @@ -779,6 +800,11 @@ bool ModelObject::is_mm_painted() const return std::any_of(this->volumes.cbegin(), this->volumes.cend(), [](const ModelVolume *mv) { return mv->is_mm_painted(); }); } +bool ModelObject::is_text() const +{ + return this->volumes.size() == 1 && this->volumes[0]->is_text(); +} + void ModelObject::sort_volumes(bool full_sort) { // sort volumes inside the object to order "Model Part, Negative Volume, Modifier, Support Blocker and Support Enforcer. " @@ -844,16 +870,72 @@ void ModelObject::clear_instances() // Returns the bounding box of the transformed instances. // This bounding box is approximate and not snug. -const BoundingBoxf3& ModelObject::bounding_box() const +const BoundingBoxf3& ModelObject::bounding_box_approx() const { - if (! m_bounding_box_valid) { - m_bounding_box_valid = true; + if (! m_bounding_box_approx_valid) { + m_bounding_box_approx_valid = true; BoundingBoxf3 raw_bbox = this->raw_mesh_bounding_box(); - m_bounding_box.reset(); + m_bounding_box_approx.reset(); for (const ModelInstance *i : this->instances) - m_bounding_box.merge(i->transform_bounding_box(raw_bbox)); + m_bounding_box_approx.merge(i->transform_bounding_box(raw_bbox)); + } + return m_bounding_box_approx; +} + +// Returns the bounding box of the transformed instances. +// This bounding box is approximate and not snug. +const BoundingBoxf3& ModelObject::bounding_box_exact() const +{ + if (! m_bounding_box_exact_valid) { + m_bounding_box_exact_valid = true; + m_min_max_z_valid = true; + m_bounding_box_exact.reset(); + for (size_t i = 0; i < this->instances.size(); ++ i) + m_bounding_box_exact.merge(this->instance_bounding_box(i)); + } + return m_bounding_box_exact; +} + +double ModelObject::min_z() const +{ + const_cast(this)->update_min_max_z(); + return m_bounding_box_exact.min.z(); +} + +double ModelObject::max_z() const +{ + const_cast(this)->update_min_max_z(); + return m_bounding_box_exact.max.z(); +} + +void ModelObject::update_min_max_z() +{ + assert(! this->instances.empty()); + if (! m_min_max_z_valid && ! this->instances.empty()) { + m_min_max_z_valid = true; + const Transform3d mat_instance = this->instances.front()->get_transformation().get_matrix(); + double global_min_z = std::numeric_limits::max(); + double global_max_z = - std::numeric_limits::max(); + for (const ModelVolume *v : this->volumes) + if (v->is_model_part()) { + const Transform3d m = mat_instance * v->get_matrix(); + const Vec3d row_z = m.linear().row(2).cast(); + const double shift_z = m.translation().z(); + double this_min_z = std::numeric_limits::max(); + double this_max_z = - std::numeric_limits::max(); + for (const Vec3f &p : v->mesh().its.vertices) { + double z = row_z.dot(p.cast()); + this_min_z = std::min(this_min_z, z); + this_max_z = std::max(this_max_z, z); + } + this_min_z += shift_z; + this_max_z += shift_z; + global_min_z = std::min(global_min_z, this_min_z); + global_max_z = std::max(global_max_z, this_max_z); + } + m_bounding_box_exact.min.z() = global_min_z; + m_bounding_box_exact.max.z() = global_max_z; } - return m_bounding_box; } // A mesh containing all transformed instances of this object. @@ -906,7 +988,7 @@ indexed_triangle_set ModelObject::raw_indexed_triangle_set() const size_t j = out.indices.size(); append(out.vertices, v->mesh().its.vertices); append(out.indices, v->mesh().its.indices); - auto m = v->get_matrix(); + const Transform3d& m = v->get_matrix(); for (; i < out.vertices.size(); ++ i) out.vertices[i] = (m * out.vertices[i].cast()).cast().eval(); if (v->is_left_handed()) { @@ -948,7 +1030,7 @@ const BoundingBoxf3& ModelObject::raw_bounding_box() const if (this->instances.empty()) throw Slic3r::InvalidArgument("Can't call raw_bounding_box() with no instances"); - const Transform3d& inst_matrix = this->instances.front()->get_transformation().get_matrix(true); + const Transform3d inst_matrix = this->instances.front()->get_transformation().get_matrix_no_offset(); for (const ModelVolume *v : this->volumes) if (v->is_model_part()) m_raw_bounding_box.merge(v->mesh().transformed_bounding_box(inst_matrix * v->get_matrix())); @@ -960,9 +1042,11 @@ const BoundingBoxf3& ModelObject::raw_bounding_box() const BoundingBoxf3 ModelObject::instance_bounding_box(size_t instance_idx, bool dont_translate) const { BoundingBoxf3 bb; - const Transform3d& inst_matrix = this->instances[instance_idx]->get_transformation().get_matrix(dont_translate); - for (ModelVolume *v : this->volumes) - { + const Transform3d inst_matrix = dont_translate ? + this->instances[instance_idx]->get_transformation().get_matrix_no_offset() : + this->instances[instance_idx]->get_transformation().get_matrix(); + + for (ModelVolume *v : this->volumes) { if (v->is_model_part()) bb.merge(v->mesh().transformed_bounding_box(inst_matrix * v->get_matrix())); } @@ -1001,19 +1085,19 @@ void ModelObject::ensure_on_bed(bool allow_negative_z) if (allow_negative_z) { if (parts_count() == 1) { - const double min_z = get_min_z(); - const double max_z = get_max_z(); + const double min_z = this->min_z(); + const double max_z = this->max_z(); if (min_z >= SINKING_Z_THRESHOLD || max_z < 0.0) z_offset = -min_z; } else { - const double max_z = get_max_z(); + const double max_z = this->max_z(); if (max_z < SINKING_MIN_Z_THRESHOLD) z_offset = SINKING_MIN_Z_THRESHOLD - max_z; } } else - z_offset = -get_min_z(); + z_offset = -this->min_z(); if (z_offset != 0.0) translate_instances(z_offset * Vec3d::UnitZ()); @@ -1040,8 +1124,10 @@ void ModelObject::translate(double x, double y, double z) v->translate(x, y, z); } - if (m_bounding_box_valid) - m_bounding_box.translate(x, y, z); + if (m_bounding_box_approx_valid) + m_bounding_box_approx.translate(x, y, z); + if (m_bounding_box_exact_valid) + m_bounding_box_exact.translate(x, y, z); } void ModelObject::scale(const Vec3d &versor) @@ -1179,177 +1265,535 @@ size_t ModelObject::parts_count() const return num; } -ModelObjectPtrs ModelObject::cut(size_t instance, coordf_t z, ModelObjectCutAttributes attributes) +bool ModelObject::has_connectors() const { - if (! attributes.has(ModelObjectCutAttribute::KeepUpper) && ! attributes.has(ModelObjectCutAttribute::KeepLower)) - return {}; + assert(is_cut()); + for (const ModelVolume* v : this->volumes) + if (v->cut_info.is_connector) + return true; - BOOST_LOG_TRIVIAL(trace) << "ModelObject::cut - start"; + return false; +} - // Clone the object to duplicate instances, materials etc. - ModelObject* upper = attributes.has(ModelObjectCutAttribute::KeepUpper) ? ModelObject::new_clone(*this) : nullptr; - ModelObject* lower = attributes.has(ModelObjectCutAttribute::KeepLower) ? ModelObject::new_clone(*this) : nullptr; +indexed_triangle_set ModelObject::get_connector_mesh(CutConnectorAttributes connector_attributes) +{ + indexed_triangle_set connector_mesh; + + int sectorCount {1}; + switch (CutConnectorShape(connector_attributes.shape)) { + case CutConnectorShape::Triangle: + sectorCount = 3; + break; + case CutConnectorShape::Square: + sectorCount = 4; + break; + case CutConnectorShape::Circle: + sectorCount = 360; + break; + case CutConnectorShape::Hexagon: + sectorCount = 6; + break; + default: + break; + } - if (attributes.has(ModelObjectCutAttribute::KeepUpper)) { - upper->set_model(nullptr); - upper->sla_support_points.clear(); - upper->sla_drain_holes.clear(); - upper->sla_points_status = sla::PointsStatus::NoPoints; - upper->clear_volumes(); - upper->input_file.clear(); + if (connector_attributes.style == CutConnectorStyle::Prism) + connector_mesh = its_make_cylinder(1.0, 1.0, (2 * PI / sectorCount)); + else if (connector_attributes.type == CutConnectorType::Plug) + connector_mesh = its_make_frustum(1.0, 1.0, (2 * PI / sectorCount)); + else + connector_mesh = its_make_frustum_dowel(1.0, 1.0, sectorCount); + + return connector_mesh; +} + +void ModelObject::apply_cut_connectors(const std::string& new_name) +{ + if (cut_connectors.empty()) + return; + + using namespace Geometry; + + size_t connector_id = cut_id.connectors_cnt(); + for (const CutConnector& connector : cut_connectors) { + TriangleMesh mesh = TriangleMesh(get_connector_mesh(connector.attribs)); + // Mesh will be centered when loading. + ModelVolume* new_volume = add_volume(std::move(mesh), ModelVolumeType::NEGATIVE_VOLUME); + + // Transform the new modifier to be aligned inside the instance + new_volume->set_transformation(translation_transform(connector.pos) * connector.rotation_m * + scale_transform(Vec3f(connector.radius, connector.radius, connector.height).cast())); + + new_volume->cut_info = { connector.attribs.type, connector.radius_tolerance, connector.height_tolerance }; + new_volume->name = new_name + "-" + std::to_string(++connector_id); } + cut_id.increase_connectors_cnt(cut_connectors.size()); + + // delete all connectors + cut_connectors.clear(); +} + +void ModelObject::invalidate_cut() +{ + this->cut_id.invalidate(); + for (ModelVolume* volume : this->volumes) + volume->invalidate_cut_info(); +} - if (attributes.has(ModelObjectCutAttribute::KeepLower)) { - lower->set_model(nullptr); - lower->sla_support_points.clear(); - lower->sla_drain_holes.clear(); - lower->sla_points_status = sla::PointsStatus::NoPoints; - lower->clear_volumes(); - lower->input_file.clear(); +void ModelObject::delete_connectors() +{ + for (int id = int(this->volumes.size()) - 1; id >= 0; id--) { + if (volumes[id]->is_cut_connector()) + this->delete_volume(size_t(id)); } +} - // Because transformations are going to be applied to meshes directly, - // we reset transformation of all instances and volumes, - // except for translation and Z-rotation on instances, which are preserved - // in the transformation matrix and not applied to the mesh transform. +void ModelObject::synchronize_model_after_cut() +{ + for (ModelObject* obj : m_model->objects) { + if (obj == this || obj->cut_id.is_equal(this->cut_id)) + continue; + if (obj->is_cut() && obj->cut_id.has_same_id(this->cut_id)) + obj->cut_id.copy(this->cut_id); + } +} - // const auto instance_matrix = instances[instance]->get_matrix(true); - const auto instance_matrix = Geometry::assemble_transform( - Vec3d::Zero(), // don't apply offset - instances[instance]->get_rotation().cwiseProduct(Vec3d(1.0, 1.0, 0.0)), // don't apply Z-rotation - instances[instance]->get_scaling_factor(), - instances[instance]->get_mirror() - ); +void ModelObject::apply_cut_attributes(ModelObjectCutAttributes attributes) +{ + // we don't save cut information, if result will not contains all parts of initial object + if (!attributes.has(ModelObjectCutAttribute::KeepUpper) || + !attributes.has(ModelObjectCutAttribute::KeepLower) || + attributes.has(ModelObjectCutAttribute::InvalidateCutInfo)) + return; - z -= instances[instance]->get_offset().z(); + if (cut_id.id().invalid()) + cut_id.init(); + { + int cut_obj_cnt = -1; + if (attributes.has(ModelObjectCutAttribute::KeepUpper)) cut_obj_cnt++; + if (attributes.has(ModelObjectCutAttribute::KeepLower)) cut_obj_cnt++; + if (attributes.has(ModelObjectCutAttribute::CreateDowels)) cut_obj_cnt++; + if (cut_obj_cnt > 0) + cut_id.increase_check_sum(size_t(cut_obj_cnt)); + } +} - // Displacement (in instance coordinates) to be applied to place the upper parts - Vec3d local_displace = Vec3d::Zero(); +void ModelObject::clone_for_cut(ModelObject** obj) +{ + (*obj) = ModelObject::new_clone(*this); + (*obj)->set_model(nullptr); + (*obj)->sla_support_points.clear(); + (*obj)->sla_drain_holes.clear(); + (*obj)->sla_points_status = sla::PointsStatus::NoPoints; + (*obj)->clear_volumes(); + (*obj)->input_file.clear(); +} + +bool ModelVolume::is_the_only_one_part() const +{ + if (m_type != ModelVolumeType::MODEL_PART) + return false; + if (object == nullptr) + return false; + for (const ModelVolume *v : object->volumes) { + if (v == nullptr) + continue; + // is this volume? + if (v->id() == this->id()) + continue; + // exist another model part in object? + if (v->type() == ModelVolumeType::MODEL_PART) + return false; + } + return true; +} + +void ModelVolume::reset_extra_facets() +{ + this->supported_facets.reset(); + this->seam_facets.reset(); + this->mmu_segmentation_facets.reset(); +} - for (ModelVolume *volume : volumes) { - const auto volume_matrix = volume->get_matrix(); +void ModelVolume::apply_tolerance() +{ + assert(cut_info.is_connector); + if (!cut_info.is_processed) + return; + + Vec3d sf = get_scaling_factor(); + + // make a "hole" wider + sf[X] += double(cut_info.radius_tolerance); + sf[Y] += double(cut_info.radius_tolerance); + + // make a "hole" dipper + sf[Z] += double(cut_info.height_tolerance); - volume->supported_facets.reset(); - volume->seam_facets.reset(); - volume->mmu_segmentation_facets.reset(); + set_scaling_factor(sf); - if (! volume->is_model_part()) { - // Modifiers are not cut, but we still need to add the instance transformation - // to the modifier volume transformation to preserve their shape properly. + // correct offset in respect to the new depth + Vec3d rot_norm = Geometry::rotation_transform(get_rotation()) * Vec3d::UnitZ(); + if (rot_norm.norm() != 0.0) + rot_norm.normalize(); - volume->set_transformation(Geometry::Transformation(instance_matrix * volume_matrix)); + double z_offset = 0.5 * static_cast(cut_info.height_tolerance); + if (cut_info.connector_type == CutConnectorType::Plug) + z_offset -= 0.05; // add small Z offset to better preview - if (attributes.has(ModelObjectCutAttribute::KeepUpper)) - upper->add_volume(*volume); - if (attributes.has(ModelObjectCutAttribute::KeepLower)) - lower->add_volume(*volume); + set_offset(get_offset() + rot_norm * z_offset); +} + +static void add_cut_volume(TriangleMesh& mesh, ModelObject* object, const ModelVolume* src_volume, const Transform3d& cut_matrix, const std::string& suffix = {}, ModelVolumeType type = ModelVolumeType::MODEL_PART) +{ + if (mesh.empty()) + return; + + mesh.transform(cut_matrix); + ModelVolume* vol = object->add_volume(mesh); + vol->set_type(type); + + vol->name = src_volume->name + suffix; + // Don't copy the config's ID. + vol->config.assign_config(src_volume->config); + assert(vol->config.id().valid()); + assert(vol->config.id() != src_volume->config.id()); + vol->set_material(src_volume->material_id(), *src_volume->material()); + vol->cut_info = src_volume->cut_info; +} + +void ModelObject::process_connector_cut(ModelVolume* volume, const Transform3d& instance_matrix, const Transform3d& cut_matrix, + ModelObjectCutAttributes attributes, ModelObject* upper, ModelObject* lower, + std::vector& dowels, Vec3d& local_dowels_displace) +{ + assert(volume->cut_info.is_connector); + volume->cut_info.set_processed(); + + const auto volume_matrix = volume->get_matrix(); + + // ! Don't apply instance transformation for the conntectors. + // This transformation is already there + if (volume->cut_info.connector_type != CutConnectorType::Dowel) { + if (attributes.has(ModelObjectCutAttribute::KeepUpper)) { + ModelVolume* vol = upper->add_volume(*volume); + vol->set_transformation(volume_matrix); + vol->apply_tolerance(); } - else if (! volume->mesh().empty()) { - // Transform the mesh by the combined transformation matrix. - // Flip the triangles in case the composite transformation is left handed. - TriangleMesh mesh(volume->mesh()); - mesh.transform(instance_matrix * volume_matrix, true); - volume->reset_mesh(); - // Reset volume transformation except for offset - const Vec3d offset = volume->get_offset(); - volume->set_transformation(Geometry::Transformation()); - volume->set_offset(offset); - - // Perform cut - TriangleMesh upper_mesh, lower_mesh; - { - indexed_triangle_set upper_its, lower_its; - cut_mesh(mesh.its, float(z), &upper_its, &lower_its); - if (attributes.has(ModelObjectCutAttribute::KeepUpper)) - upper_mesh = TriangleMesh(upper_its); - if (attributes.has(ModelObjectCutAttribute::KeepLower)) - lower_mesh = TriangleMesh(lower_its); - } + if (attributes.has(ModelObjectCutAttribute::KeepLower)) { + ModelVolume* vol = lower->add_volume(*volume); + vol->set_transformation(volume_matrix); + // for lower part change type of connector from NEGATIVE_VOLUME to MODEL_PART if this connector is a plug + vol->set_type(ModelVolumeType::MODEL_PART); + } + } + else { + if (attributes.has(ModelObjectCutAttribute::CreateDowels)) { + ModelObject* dowel{ nullptr }; + // Clone the object to duplicate instances, materials etc. + clone_for_cut(&dowel); - if (attributes.has(ModelObjectCutAttribute::KeepUpper) && ! upper_mesh.empty()) { - ModelVolume* vol = upper->add_volume(upper_mesh); - vol->name = volume->name; - // Don't copy the config's ID. - vol->config.assign_config(volume->config); - assert(vol->config.id().valid()); - assert(vol->config.id() != volume->config.id()); - vol->set_material(volume->material_id(), *volume->material()); - } - if (attributes.has(ModelObjectCutAttribute::KeepLower) && ! lower_mesh.empty()) { - ModelVolume* vol = lower->add_volume(lower_mesh); - vol->name = volume->name; - // Don't copy the config's ID. - vol->config.assign_config(volume->config); - assert(vol->config.id().valid()); - assert(vol->config.id() != volume->config.id()); - vol->set_material(volume->material_id(), *volume->material()); - - // Compute the displacement (in instance coordinates) to be applied to place the upper parts - // The upper part displacement is set to half of the lower part bounding box - // this is done in hope at least a part of the upper part will always be visible and draggable - local_displace = lower->full_raw_mesh_bounding_box().size().cwiseProduct(Vec3d(-0.5, -0.5, 0.0)); - } + // add one more solid part same as connector if this connector is a dowel + ModelVolume* vol = dowel->add_volume(*volume); + vol->set_type(ModelVolumeType::MODEL_PART); + + // But discard rotation and Z-offset for this volume + vol->set_rotation(Vec3d::Zero()); + vol->set_offset(Z, 0.0); + + // Compute the displacement (in instance coordinates) to be applied to place the dowels + local_dowels_displace = lower->full_raw_mesh_bounding_box().size().cwiseProduct(Vec3d(1.0, 1.0, 0.0)); + + dowels.push_back(dowel); } + + // Cut the dowel + volume->apply_tolerance(); + + // Perform cut + TriangleMesh upper_mesh, lower_mesh; + process_volume_cut(volume, Transform3d::Identity(), cut_matrix, attributes, upper_mesh, lower_mesh); + + // add small Z offset to better preview + upper_mesh.translate((-0.05 * Vec3d::UnitZ()).cast()); + lower_mesh.translate((0.05 * Vec3d::UnitZ()).cast()); + + // Add cut parts to the related objects + add_cut_volume(upper_mesh, upper, volume, cut_matrix, "_A", volume->type()); + add_cut_volume(lower_mesh, lower, volume, cut_matrix, "_B", volume->type()); } +} - ModelObjectPtrs res; +void ModelObject::process_modifier_cut(ModelVolume* volume, const Transform3d& instance_matrix, const Transform3d& inverse_cut_matrix, + ModelObjectCutAttributes attributes, ModelObject* upper, ModelObject* lower) +{ + const auto volume_matrix = instance_matrix * volume->get_matrix(); + + // Modifiers are not cut, but we still need to add the instance transformation + // to the modifier volume transformation to preserve their shape properly. + volume->set_transformation(Geometry::Transformation(volume_matrix)); + + if (attributes.has(ModelObjectCutAttribute::KeepAsParts)) { + upper->add_volume(*volume); + return; + } + + // Some logic for the negative volumes/connectors. Add only needed modifiers + auto bb = volume->mesh().transformed_bounding_box(inverse_cut_matrix * volume_matrix); + bool is_crossed_by_cut = bb.min[Z] <= 0 && bb.max[Z] >= 0; + if (attributes.has(ModelObjectCutAttribute::KeepUpper) && (bb.min[Z] >= 0 || is_crossed_by_cut)) + upper->add_volume(*volume); + if (attributes.has(ModelObjectCutAttribute::KeepLower) && (bb.max[Z] <= 0 || is_crossed_by_cut)) + lower->add_volume(*volume); +} + +void ModelObject::process_volume_cut(ModelVolume* volume, const Transform3d& instance_matrix, const Transform3d& cut_matrix, + ModelObjectCutAttributes attributes, TriangleMesh& upper_mesh, TriangleMesh& lower_mesh) +{ + const auto volume_matrix = volume->get_matrix(); + + using namespace Geometry; + + const Transformation cut_transformation = Transformation(cut_matrix); + const Transform3d invert_cut_matrix = cut_transformation.get_rotation_matrix().inverse() * translation_transform(-1 * cut_transformation.get_offset()); + + // Transform the mesh by the combined transformation matrix. + // Flip the triangles in case the composite transformation is left handed. + TriangleMesh mesh(volume->mesh()); + mesh.transform(invert_cut_matrix * instance_matrix * volume_matrix, true); + + indexed_triangle_set upper_its, lower_its; + cut_mesh(mesh.its, 0.0f, &upper_its, &lower_its); + if (attributes.has(ModelObjectCutAttribute::KeepUpper)) + upper_mesh = TriangleMesh(upper_its); + if (attributes.has(ModelObjectCutAttribute::KeepLower)) + lower_mesh = TriangleMesh(lower_its); +} + +void ModelObject::process_solid_part_cut(ModelVolume* volume, const Transform3d& instance_matrix, const Transform3d& cut_matrix, + ModelObjectCutAttributes attributes, ModelObject* upper, ModelObject* lower, Vec3d& local_displace) +{ + // Perform cut + TriangleMesh upper_mesh, lower_mesh; + process_volume_cut(volume, instance_matrix, cut_matrix, attributes, upper_mesh, lower_mesh); + + // Add required cut parts to the objects + + if (attributes.has(ModelObjectCutAttribute::KeepAsParts)) { + add_cut_volume(upper_mesh, upper, volume, cut_matrix, "_A"); + add_cut_volume(lower_mesh, upper, volume, cut_matrix, "_B"); + return; + } + + if (attributes.has(ModelObjectCutAttribute::KeepUpper)) + add_cut_volume(upper_mesh, upper, volume, cut_matrix); + + if (attributes.has(ModelObjectCutAttribute::KeepLower) && !lower_mesh.empty()) { + add_cut_volume(lower_mesh, lower, volume, cut_matrix); + + // Compute the displacement (in instance coordinates) to be applied to place the upper parts + // The upper part displacement is set to half of the lower part bounding box + // this is done in hope at least a part of the upper part will always be visible and draggable + local_displace = lower->full_raw_mesh_bounding_box().size().cwiseProduct(Vec3d(-0.5, -0.5, 0.0)); + } +} + +static void invalidate_translations(ModelObject* object, const ModelInstance* src_instance) +{ + if (!object->origin_translation.isApprox(Vec3d::Zero()) && src_instance->get_offset().isApprox(Vec3d::Zero())) { + object->center_around_origin(); + object->translate_instances(-object->origin_translation); + object->origin_translation = Vec3d::Zero(); + } + else { + object->invalidate_bounding_box(); + object->center_around_origin(); + } +} + +static void reset_instance_transformation(ModelObject* object, size_t src_instance_idx, const Transform3d& cut_matrix, + bool place_on_cut = false, bool flip = false, Vec3d local_displace = Vec3d::Zero()) +{ + using namespace Geometry; + + // Reset instance transformation except offset and Z-rotation + + for (size_t i = 0; i < object->instances.size(); ++i) { + auto& obj_instance = object->instances[i]; + const Vec3d offset = obj_instance->get_offset(); + const double rot_z = obj_instance->get_rotation().z(); + + obj_instance->set_transformation(Transformation()); + + const Vec3d displace = local_displace.isApprox(Vec3d::Zero()) ? Vec3d::Zero() : + rotation_transform(obj_instance->get_rotation()) * local_displace; + obj_instance->set_offset(offset + displace); - if (attributes.has(ModelObjectCutAttribute::KeepUpper) && upper->volumes.size() > 0) { - if (!upper->origin_translation.isApprox(Vec3d::Zero()) && instances[instance]->get_offset().isApprox(Vec3d::Zero())) { - upper->center_around_origin(); - upper->translate_instances(-upper->origin_translation); - upper->origin_translation = Vec3d::Zero(); + Vec3d rotation = Vec3d::Zero(); + if (!flip && !place_on_cut) { + if ( i != src_instance_idx) + rotation[Z] = rot_z; } + else { + Transform3d rotation_matrix = Transform3d::Identity(); + if (flip) + rotation_matrix = rotation_transform(PI * Vec3d::UnitX()); + + if (place_on_cut) + rotation_matrix = rotation_matrix * Transformation(cut_matrix).get_rotation_matrix().inverse(); + + if (i != src_instance_idx) + rotation_matrix = rotation_transform(rot_z * Vec3d::UnitZ()) * rotation_matrix; + + rotation = Transformation(rotation_matrix).get_rotation(); + } + + obj_instance->set_rotation(rotation); + } +} + +ModelObjectPtrs ModelObject::cut(size_t instance, const Transform3d& cut_matrix, ModelObjectCutAttributes attributes) +{ + if (!attributes.has(ModelObjectCutAttribute::KeepUpper) && !attributes.has(ModelObjectCutAttribute::KeepLower)) + return {}; + + BOOST_LOG_TRIVIAL(trace) << "ModelObject::cut - start"; + + // apply cut attributes for object + apply_cut_attributes(attributes); + + // Clone the object to duplicate instances, materials etc. + ModelObject* upper{ nullptr }; + if (attributes.has(ModelObjectCutAttribute::KeepUpper)) + clone_for_cut(&upper); + + ModelObject* lower{ nullptr }; + if (attributes.has(ModelObjectCutAttribute::KeepLower) && !attributes.has(ModelObjectCutAttribute::KeepAsParts)) + clone_for_cut(&lower); + + std::vector dowels; + + using namespace Geometry; + + // Because transformations are going to be applied to meshes directly, + // we reset transformation of all instances and volumes, + // except for translation and Z-rotation on instances, which are preserved + // in the transformation matrix and not applied to the mesh transform. + + // const auto instance_matrix = instances[instance]->get_matrix(true); + const auto instance_matrix = instances[instance]->get_transformation().get_matrix_no_offset(); + const Transformation cut_transformation = Transformation(cut_matrix); + const Transform3d inverse_cut_matrix = cut_transformation.get_rotation_matrix().inverse() * translation_transform(-1. * cut_transformation.get_offset()); + + // Displacement (in instance coordinates) to be applied to place the upper parts + Vec3d local_displace = Vec3d::Zero(); + Vec3d local_dowels_displace = Vec3d::Zero(); - // Reset instance transformation except offset and Z-rotation - for (size_t i = 0; i < instances.size(); ++i) { - auto &instance = upper->instances[i]; - const Vec3d offset = instance->get_offset(); - const double rot_z = instance->get_rotation().z(); - const Vec3d displace = Geometry::assemble_transform(Vec3d::Zero(), instance->get_rotation()) * local_displace; + for (ModelVolume* volume : volumes) { + volume->reset_extra_facets(); - instance->set_transformation(Geometry::Transformation()); - instance->set_offset(offset + displace); - instance->set_rotation(Vec3d(0.0, 0.0, rot_z)); + if (!volume->is_model_part()) { + if (volume->cut_info.is_processed) + process_modifier_cut(volume, instance_matrix, inverse_cut_matrix, attributes, upper, lower); + else + process_connector_cut(volume, instance_matrix, cut_matrix, attributes, upper, lower, dowels, local_dowels_displace); } + else if (!volume->mesh().empty()) + process_solid_part_cut(volume, instance_matrix, cut_matrix, attributes, upper, lower, local_displace); + } + + // Post-process cut parts + ModelObjectPtrs res; + + if (attributes.has(ModelObjectCutAttribute::KeepAsParts) && !upper->volumes.empty()) { + reset_instance_transformation(upper, instance, cut_matrix); res.push_back(upper); } - if (attributes.has(ModelObjectCutAttribute::KeepLower) && lower->volumes.size() > 0) { - if (!lower->origin_translation.isApprox(Vec3d::Zero()) && instances[instance]->get_offset().isApprox(Vec3d::Zero())) { - lower->center_around_origin(); - lower->translate_instances(-lower->origin_translation); - lower->origin_translation = Vec3d::Zero(); + else { + if (attributes.has(ModelObjectCutAttribute::KeepUpper) && !upper->volumes.empty()) { + invalidate_translations(upper, instances[instance]); + + reset_instance_transformation(upper, instance, cut_matrix, + attributes.has(ModelObjectCutAttribute::PlaceOnCutUpper), + attributes.has(ModelObjectCutAttribute::FlipUpper), + local_displace); + res.push_back(upper); } - // Reset instance transformation except offset and Z-rotation - for (auto *instance : lower->instances) { - const Vec3d offset = instance->get_offset(); - const double rot_z = instance->get_rotation().z(); - instance->set_transformation(Geometry::Transformation()); - instance->set_offset(offset); - instance->set_rotation(Vec3d(attributes.has(ModelObjectCutAttribute::FlipLower) ? Geometry::deg2rad(180.0) : 0.0, 0.0, rot_z)); + if (attributes.has(ModelObjectCutAttribute::KeepLower) && !lower->volumes.empty()) { + invalidate_translations(lower, instances[instance]); + + reset_instance_transformation(lower, instance, cut_matrix, + attributes.has(ModelObjectCutAttribute::PlaceOnCutLower), + attributes.has(ModelObjectCutAttribute::PlaceOnCutLower) ? true : attributes.has(ModelObjectCutAttribute::FlipLower)); + res.push_back(lower); } - res.push_back(lower); + if (attributes.has(ModelObjectCutAttribute::CreateDowels) && !dowels.empty()) { + for (auto dowel : dowels) { + invalidate_translations(dowel, instances[instance]); + + reset_instance_transformation(dowel, instance, Transform3d::Identity(), false, false, local_dowels_displace); + + local_dowels_displace += dowel->full_raw_mesh_bounding_box().size().cwiseProduct(Vec3d(-1.5, -1.5, 0.0)); + dowel->name += "-Dowel-" + dowel->volumes[0]->name; + res.push_back(dowel); + } + } } BOOST_LOG_TRIVIAL(trace) << "ModelObject::cut - end"; + synchronize_model_after_cut(); + return res; } +///

    +/// Compare TriangleMeshes by Bounding boxes (mainly for sort) +/// From Front(Z) Upper(Y) TopLeft(X) corner. +/// 1. Seraparate group not overlaped i Z axis +/// 2. Seraparate group not overlaped i Y axis +/// 3. Start earlier in X (More on left side) +/// +/// Compare from +/// Compare to +/// True when triangle mesh 1 is closer, upper or lefter than triangle mesh 2 other wise false +static bool is_front_up_left(const TriangleMesh &trinagle_mesh1, const TriangleMesh &triangle_mesh2) +{ + // stats form t1 + const Vec3f &min1 = trinagle_mesh1.stats().min; + const Vec3f &max1 = trinagle_mesh1.stats().max; + // stats from t2 + const Vec3f &min2 = triangle_mesh2.stats().min; + const Vec3f &max2 = triangle_mesh2.stats().max; + // priority Z, Y, X + for (int axe = 2; axe > 0; --axe) { + if (max1[axe] < min2[axe]) + return true; + if (min1[axe] > max2[axe]) + return false; + } + return min1.x() < min2.x(); +} + void ModelObject::split(ModelObjectPtrs* new_objects) { for (ModelVolume* volume : this->volumes) { if (volume->type() != ModelVolumeType::MODEL_PART) continue; + // splited volume should not be text object + if (volume->text_configuration.has_value()) + volume->text_configuration.reset(); + std::vector meshes = volume->mesh().split(); + std::sort(meshes.begin(), meshes.end(), is_front_up_left); + size_t counter = 1; for (TriangleMesh &mesh : meshes) { // FIXME: crashes if not satisfied - if (mesh.facets_count() < 3) + if (mesh.facets_count() < 3 || mesh.has_zero_volume()) continue; // XXX: this seems to be the only real usage of m_model, maybe refactor this so that it's not needed? @@ -1371,9 +1815,14 @@ void ModelObject::split(ModelObjectPtrs* new_objects) new_object->add_instance(*model_instance); ModelVolume* new_vol = new_object->add_volume(*volume, std::move(mesh)); - for (ModelInstance* model_instance : new_object->instances) - { - Vec3d shift = model_instance->get_transformation().get_matrix(true) * new_vol->get_offset(); + // Invalidate extruder value in volume's config, + // otherwise there will no way to change extruder for object after splitting, + // because volume's extruder value overrides object's extruder value. + if (new_vol->config.has("extruder")) + new_vol->config.set_key_value("extruder", new ConfigOptionInt(0)); + + for (ModelInstance* model_instance : new_object->instances) { + const Vec3d shift = model_instance->get_transformation().get_matrix_no_offset() * new_vol->get_offset(); model_instance->set_offset(model_instance->get_offset() + shift); } @@ -1414,11 +1863,7 @@ void ModelObject::bake_xy_rotation_into_meshes(size_t instance_idx) { assert(instance_idx < this->instances.size()); - const Geometry::Transformation reference_trafo = this->instances[instance_idx]->get_transformation(); - if (Geometry::is_rotation_ninety_degrees(reference_trafo.get_rotation())) - // nothing to do, scaling in the world coordinate space is possible in the representation of Geometry::Transformation. - return; - + const Geometry::Transformation reference_trafo = this->instances[instance_idx]->get_transformation(); bool left_handed = reference_trafo.is_left_handed(); bool has_mirrorring = ! reference_trafo.get_mirror().isApprox(Vec3d(1., 1., 1.)); bool uniform_scaling = std::abs(reference_trafo.get_scaling_factor().x() - reference_trafo.get_scaling_factor().y()) < EPSILON && @@ -1428,15 +1873,21 @@ void ModelObject::bake_xy_rotation_into_meshes(size_t instance_idx) // Adjust the instances. for (size_t i = 0; i < this->instances.size(); ++ i) { ModelInstance &model_instance = *this->instances[i]; - model_instance.set_rotation(Vec3d(0., 0., Geometry::rotation_diff_z(reference_trafo.get_rotation(), model_instance.get_rotation()))); + model_instance.set_rotation(Vec3d(0., 0., Geometry::rotation_diff_z(reference_trafo.get_matrix(), model_instance.get_matrix()))); model_instance.set_scaling_factor(Vec3d(new_scaling_factor, new_scaling_factor, new_scaling_factor)); model_instance.set_mirror(Vec3d(1., 1., 1.)); } // Adjust the meshes. // Transformation to be applied to the meshes. - Eigen::Matrix3d mesh_trafo_3x3 = reference_trafo.get_matrix(true, false, uniform_scaling, ! has_mirrorring).matrix().block<3, 3>(0, 0); - Transform3d volume_offset_correction = this->instances[instance_idx]->get_transformation().get_matrix().inverse() * reference_trafo.get_matrix(); + Geometry::Transformation reference_trafo_mod = reference_trafo; + reference_trafo_mod.reset_offset(); + if (uniform_scaling) + reference_trafo_mod.reset_scaling_factor(); + if (!has_mirrorring) + reference_trafo_mod.reset_mirror(); + Eigen::Matrix3d mesh_trafo_3x3 = reference_trafo_mod.get_matrix().matrix().block<3, 3>(0, 0); + Transform3d volume_offset_correction = this->instances[instance_idx]->get_transformation().get_matrix().inverse() * reference_trafo.get_matrix(); for (ModelVolume *model_volume : this->volumes) { const Geometry::Transformation volume_trafo = model_volume->get_transformation(); bool volume_left_handed = volume_trafo.is_left_handed(); @@ -1445,9 +1896,15 @@ void ModelObject::bake_xy_rotation_into_meshes(size_t instance_idx) std::abs(volume_trafo.get_scaling_factor().x() - volume_trafo.get_scaling_factor().z()) < EPSILON; double volume_new_scaling_factor = volume_uniform_scaling ? volume_trafo.get_scaling_factor().x() : 1.; // Transform the mesh. - Matrix3d volume_trafo_3x3 = volume_trafo.get_matrix(true, false, volume_uniform_scaling, !volume_has_mirrorring).matrix().block<3, 3>(0, 0); + Geometry::Transformation volume_trafo_mod = volume_trafo; + volume_trafo_mod.reset_offset(); + if (volume_uniform_scaling) + volume_trafo_mod.reset_scaling_factor(); + if (!volume_has_mirrorring) + volume_trafo_mod.reset_mirror(); + Eigen::Matrix3d volume_trafo_3x3 = volume_trafo_mod.get_matrix().matrix().block<3, 3>(0, 0); // Following method creates a new shared_ptr - model_volume->transform_this_mesh(mesh_trafo_3x3 * volume_trafo_3x3, left_handed != volume_left_handed); + model_volume->transform_this_mesh(mesh_trafo_3x3 * volume_trafo_3x3, left_handed != volume_left_handed); // Reset the rotation, scaling and mirroring. model_volume->set_rotation(Vec3d(0., 0., 0.)); model_volume->set_scaling_factor(Vec3d(volume_new_scaling_factor, volume_new_scaling_factor, volume_new_scaling_factor)); @@ -1461,38 +1918,12 @@ void ModelObject::bake_xy_rotation_into_meshes(size_t instance_idx) this->invalidate_bounding_box(); } -double ModelObject::get_min_z() const -{ - if (instances.empty()) - return 0.0; - else { - double min_z = DBL_MAX; - for (size_t i = 0; i < instances.size(); ++i) { - min_z = std::min(min_z, get_instance_min_z(i)); - } - return min_z; - } -} - -double ModelObject::get_max_z() const -{ - if (instances.empty()) - return 0.0; - else { - double max_z = -DBL_MAX; - for (size_t i = 0; i < instances.size(); ++i) { - max_z = std::max(max_z, get_instance_max_z(i)); - } - return max_z; - } -} - double ModelObject::get_instance_min_z(size_t instance_idx) const { double min_z = DBL_MAX; const ModelInstance* inst = instances[instance_idx]; - const Transform3d& mi = inst->get_matrix(true); + const Transform3d mi = inst->get_matrix_no_offset(); for (const ModelVolume* v : volumes) { if (!v->is_model_part()) @@ -1513,7 +1944,7 @@ double ModelObject::get_instance_max_z(size_t instance_idx) const double max_z = -DBL_MAX; const ModelInstance* inst = instances[instance_idx]; - const Transform3d& mi = inst->get_matrix(true); + const Transform3d mi = inst->get_matrix_no_offset(); for (const ModelVolume* v : volumes) { if (!v->is_model_part()) @@ -1661,6 +2092,14 @@ int ModelObject::get_repaired_errors_count(const int vol_idx /*= -1*/) const stats.facets_reversed + stats.backwards_edges; } +bool ModelObject::has_solid_mesh() const +{ + for (const ModelVolume* volume : volumes) + if (volume->is_model_part()) + return true; + return false; +} + void ModelVolume::set_material_id(t_model_material_id material_id) { m_material_id = material_id; @@ -1782,15 +2221,21 @@ size_t ModelVolume::split(unsigned int max_extruders) if (meshes.size() <= 1) return 1; + std::sort(meshes.begin(), meshes.end(), is_front_up_left); + + // splited volume should not be text object + if (text_configuration.has_value()) + text_configuration.reset(); + size_t idx = 0; size_t ivolume = std::find(this->object->volumes.begin(), this->object->volumes.end(), this) - this->object->volumes.begin(); - const std::string name = this->name; + const std::string& name = this->name; unsigned int extruder_counter = 0; const Vec3d offset = this->get_offset(); for (TriangleMesh &mesh : meshes) { - if (mesh.empty()) + if (mesh.empty() || mesh.has_zero_volume()) // Repair may have removed unconnected triangles, thus emptying the mesh. continue; @@ -1841,7 +2286,7 @@ void ModelVolume::scale(const Vec3d& scaling_factors) void ModelObject::scale_to_fit(const Vec3d &size) { - Vec3d orig_size = this->bounding_box().size(); + Vec3d orig_size = this->bounding_box_exact().size(); double factor = std::min( size.x() / orig_size.x(), std::min( @@ -1874,7 +2319,7 @@ void ModelVolume::rotate(double angle, Axis axis) void ModelVolume::rotate(double angle, const Vec3d& axis) { - set_rotation(get_rotation() + Geometry::extract_euler_angles(Eigen::Quaterniond(Eigen::AngleAxisd(angle, axis)).toRotationMatrix())); + set_rotation(get_rotation() + Geometry::extract_rotation(Eigen::Quaterniond(Eigen::AngleAxisd(angle, axis)).toRotationMatrix())); } void ModelVolume::mirror(Axis axis) @@ -1939,44 +2384,17 @@ void ModelVolume::convert_from_meters() void ModelInstance::transform_mesh(TriangleMesh* mesh, bool dont_translate) const { - mesh->transform(get_matrix(dont_translate)); -} - -BoundingBoxf3 ModelInstance::transform_mesh_bounding_box(const TriangleMesh& mesh, bool dont_translate) const -{ - // Rotate around mesh origin. - TriangleMesh copy(mesh); - copy.transform(get_matrix(true, false, true, true)); - BoundingBoxf3 bbox = copy.bounding_box(); - - if (!empty(bbox)) { - // Scale the bounding box along the three axes. - for (unsigned int i = 0; i < 3; ++i) - { - if (std::abs(get_scaling_factor((Axis)i)-1.0) > EPSILON) - { - bbox.min(i) *= get_scaling_factor((Axis)i); - bbox.max(i) *= get_scaling_factor((Axis)i); - } - } - - // Translate the bounding box. - if (! dont_translate) { - bbox.min += get_offset(); - bbox.max += get_offset(); - } - } - return bbox; + mesh->transform(dont_translate ? get_matrix_no_offset() : get_matrix()); } BoundingBoxf3 ModelInstance::transform_bounding_box(const BoundingBoxf3 &bbox, bool dont_translate) const { - return bbox.transformed(get_matrix(dont_translate)); + return bbox.transformed(dont_translate ? get_matrix_no_offset() : get_matrix()); } Vec3d ModelInstance::transform_vector(const Vec3d& v, bool dont_translate) const { - return get_matrix(dont_translate) * v; + return dont_translate ? get_matrix_no_offset() * v : get_matrix() * v; } void ModelInstance::transform_polygon(Polygon* polygon) const @@ -1993,8 +2411,7 @@ arrangement::ArrangePolygon ModelInstance::get_arrange_polygon() const Vec3d rotation = get_rotation(); rotation.z() = 0.; - Transform3d trafo_instance = - Geometry::assemble_transform(get_offset().z() * Vec3d::UnitZ(), rotation, get_scaling_factor(), get_mirror()); + Transform3d trafo_instance = Geometry::assemble_transform(get_offset().z() * Vec3d::UnitZ(), rotation, get_scaling_factor(), get_mirror()); Polygon p = get_object()->convex_hull_2d(trafo_instance); @@ -2222,6 +2639,15 @@ bool model_mmu_segmentation_data_changed(const ModelObject& mo, const ModelObjec [](const ModelVolume &mv_old, const ModelVolume &mv_new){ return mv_old.mmu_segmentation_facets.timestamp_matches(mv_new.mmu_segmentation_facets); }); } +bool model_has_parameter_modifiers_in_objects(const Model &model) +{ + for (const auto& model_object : model.objects) + for (const auto& volume : model_object->volumes) + if (volume->is_modifier()) + return true; + return false; +} + bool model_has_multi_part_objects(const Model &model) { for (const ModelObject *model_object : model.objects) @@ -2230,6 +2656,14 @@ bool model_has_multi_part_objects(const Model &model) return false; } +bool model_has_connectors(const Model &model) +{ + for (const ModelObject *model_object : model.objects) + if (!model_object->cut_connectors.empty()) + return true; + return false; +} + bool model_has_advanced_features(const Model &model) { auto config_is_advanced = [](const ModelConfig &config) { @@ -2267,7 +2701,7 @@ void check_model_ids_validity(const Model &model) for (const ModelInstance *model_instance : model_object->instances) check(model_instance->id()); } - for (const auto mm : model.materials) { + for (const auto &mm : model.materials) { check(mm.second->id()); check(mm.second->config.id()); } diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 7a1cf206eab..60746f10b52 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -14,12 +14,14 @@ #include "Arrange.hpp" #include "CustomGCode.hpp" #include "enum_bitmask.hpp" +#include "TextConfiguration.hpp" #include #include #include #include #include +#include namespace cereal { class BinaryInputArchive; @@ -166,7 +168,7 @@ class ModelMaterial final : public ObjectBase friend class cereal::access; friend class UndoRedo::StackImpl; // Create an object for deserialization, don't allocate IDs for ModelMaterial and its config. - ModelMaterial() : ObjectBase(-1), config(-1), m_model(nullptr) { assert(this->id().invalid()); assert(this->config.id().invalid()); } + ModelMaterial() : ObjectBase(-1), config(-1) { assert(this->id().invalid()); assert(this->config.id().invalid()); } template void serialize(Archive &ar) { assert(this->id().invalid()); assert(this->config.id().invalid()); Internal::StaticSerializationWrapper config_wrapper(config); @@ -219,6 +221,91 @@ class LayerHeightProfile final : public ObjectWithTimestamp { friend class ModelObject; }; +enum class CutConnectorType : int { + Plug + , Dowel + , Undef +}; + +enum class CutConnectorStyle : int { + Prism + , Frustum + , Undef + //,Claw +}; + +enum class CutConnectorShape : int { + Triangle + , Square + , Hexagon + , Circle + , Undef + //,D-shape +}; + +struct CutConnectorAttributes +{ + CutConnectorType type{ CutConnectorType::Plug }; + CutConnectorStyle style{ CutConnectorStyle::Prism }; + CutConnectorShape shape{ CutConnectorShape::Circle }; + + CutConnectorAttributes() {} + + CutConnectorAttributes(CutConnectorType t, CutConnectorStyle st, CutConnectorShape sh) + : type(t), style(st), shape(sh) + {} + + CutConnectorAttributes(const CutConnectorAttributes& rhs) : + CutConnectorAttributes(rhs.type, rhs.style, rhs.shape) {} + + bool operator==(const CutConnectorAttributes& other) const; + + bool operator!=(const CutConnectorAttributes& other) const { return !(other == (*this)); } + + bool operator<(const CutConnectorAttributes& other) const { + return this->type < other.type || + (this->type == other.type && this->style < other.style) || + (this->type == other.type && this->style == other.style && this->shape < other.shape); + } + + template inline void serialize(Archive& ar) { + ar(type, style, shape); + } +}; + +struct CutConnector +{ + Vec3d pos; + Transform3d rotation_m; + float radius; + float height; + float radius_tolerance;// [0.f : 1.f] + float height_tolerance;// [0.f : 1.f] + CutConnectorAttributes attribs; + + CutConnector() + : pos(Vec3d::Zero()), rotation_m(Transform3d::Identity()), radius(5.f), height(10.f), radius_tolerance(0.f), height_tolerance(0.1f) + {} + + CutConnector(Vec3d p, Transform3d rot, float r, float h, float rt, float ht, CutConnectorAttributes attributes) + : pos(p), rotation_m(rot), radius(r), height(h), radius_tolerance(rt), height_tolerance(ht), attribs(attributes) + {} + + CutConnector(const CutConnector& rhs) : + CutConnector(rhs.pos, rhs.rotation_m, rhs.radius, rhs.height, rhs.radius_tolerance, rhs.height_tolerance, rhs.attribs) {} + + bool operator==(const CutConnector& other) const; + + bool operator!=(const CutConnector& other) const { return !(other == (*this)); } + + template inline void serialize(Archive& ar) { + ar(pos, rotation_m, radius, height, radius_tolerance, height_tolerance, attribs); + } +}; + +using CutConnectors = std::vector; + + // Declared outside of ModelVolume, so it could be forward declared. enum class ModelVolumeType : int { INVALID = -1, @@ -229,7 +316,7 @@ enum class ModelVolumeType : int { SUPPORT_ENFORCER, }; -enum class ModelObjectCutAttribute : int { KeepUpper, KeepLower, FlipLower }; +enum class ModelObjectCutAttribute : int { KeepUpper, KeepLower, KeepAsParts, FlipUpper, FlipLower, PlaceOnCutUpper, PlaceOnCutLower, CreateDowels, InvalidateCutInfo }; using ModelObjectCutAttributes = enum_bitmask; ENABLE_ENUM_BITMASK_OPERATORS(ModelObjectCutAttribute); @@ -256,7 +343,7 @@ class ModelObject final : public ObjectBase // The pairs of are packed into a 1D array. LayerHeightProfile layer_height_profile; // Whether or not this object is printable - bool printable; + bool printable { true }; // This vector holds position of selected support points for SLA. The data are // saved in mesh coordinates to allow using them for several instances. @@ -269,6 +356,10 @@ class ModelObject final : public ObjectBase // Holes to be drilled into the object so resin can flow out sla::DrainHoles sla_drain_holes; + // Connectors to be added into the object before cut and are used to create a solid/negative volumes during a cut perform + CutConnectors cut_connectors; + CutObjectBase cut_id; + /* This vector accumulates the total translation applied to the object by the center_around_origin() method. Callers might want to apply the same translation to new volumes before adding them to this object in order to preserve alignment @@ -292,6 +383,12 @@ class ModelObject final : public ObjectBase bool is_seam_painted() const; // Checks if any of object volume is painted using the multi-material painting gizmo. bool is_mm_painted() const; + // Checks if object contains just one volume and it's a text + bool is_text() const; + // This object may have a varying layer height by painting or by a table. + // Even if true is returned, the layer height profile may be "flat" with no difference to default layering. + bool has_custom_layering() const + { return ! this->layer_config_ranges.empty() || ! this->layer_height_profile.empty(); } ModelInstance* add_instance(); ModelInstance* add_instance(const ModelInstance &instance); @@ -300,11 +397,22 @@ class ModelObject final : public ObjectBase void delete_last_instance(); void clear_instances(); - // Returns the bounding box of the transformed instances. - // This bounding box is approximate and not snug. - // This bounding box is being cached. - const BoundingBoxf3& bounding_box() const; - void invalidate_bounding_box() { m_bounding_box_valid = false; m_raw_bounding_box_valid = false; m_raw_mesh_bounding_box_valid = false; } + // Returns the bounding box of the transformed instances. This bounding box is approximate and not snug, it is being cached. + const BoundingBoxf3& bounding_box_approx() const; + // Returns an exact bounding box of the transformed instances. The result it is being cached. + const BoundingBoxf3& bounding_box_exact() const; + // Return minimum / maximum of a printable object transformed into the world coordinate system. + // All instances share the same min / max Z. + double min_z() const; + double max_z() const; + + void invalidate_bounding_box() { + m_bounding_box_approx_valid = false; + m_bounding_box_exact_valid = false; + m_min_max_z_valid = false; + m_raw_bounding_box_valid = false; + m_raw_mesh_bounding_box_valid = false; + } // A mesh containing all transformed instances of this object. TriangleMesh mesh() const; @@ -353,8 +461,26 @@ class ModelObject final : public ObjectBase size_t materials_count() const; size_t facets_count() const; size_t parts_count() const; - ModelObjectPtrs cut(size_t instance, coordf_t z, ModelObjectCutAttributes attributes); - void split(ModelObjectPtrs* new_objects); + static indexed_triangle_set get_connector_mesh(CutConnectorAttributes connector_attributes); + void apply_cut_connectors(const std::string& name); + // invalidate cut state for this object and its connectors/volumes + void invalidate_cut(); + // delete volumes which are marked as connector for this object + void delete_connectors(); + void synchronize_model_after_cut(); + void apply_cut_attributes(ModelObjectCutAttributes attributes); + void clone_for_cut(ModelObject **obj); + void process_connector_cut(ModelVolume* volume, const Transform3d& instance_matrix, const Transform3d& cut_matrix, + ModelObjectCutAttributes attributes, ModelObject* upper, ModelObject* lower, + std::vector& dowels, Vec3d& local_dowels_displace); + void process_modifier_cut(ModelVolume* volume, const Transform3d& instance_matrix, const Transform3d& inverse_cut_matrix, + ModelObjectCutAttributes attributes, ModelObject* upper, ModelObject* lower); + void process_volume_cut(ModelVolume* volume, const Transform3d& instance_matrix, const Transform3d& cut_matrix, + ModelObjectCutAttributes attributes, TriangleMesh& upper_mesh, TriangleMesh& lower_mesh); + void process_solid_part_cut(ModelVolume* volume, const Transform3d& instance_matrix, const Transform3d& cut_matrix, + ModelObjectCutAttributes attributes, ModelObject* upper, ModelObject* lower, Vec3d& local_displace); + ModelObjectPtrs cut(size_t instance, const Transform3d&cut_matrix, ModelObjectCutAttributes attributes); + void split(ModelObjectPtrs*new_objects); void merge(); // Support for non-uniform scaling of instances. If an instance is rotated by angles, which are not multiples of ninety degrees, // then the scaling in world coordinate system is not representable by the Geometry::Transformation structure. @@ -362,8 +488,6 @@ class ModelObject final : public ObjectBase // Rotation and mirroring is being baked in. In case the instance scaling was non-uniform, it is baked in as well. void bake_xy_rotation_into_meshes(size_t instance_idx); - double get_min_z() const; - double get_max_z() const; double get_instance_min_z(size_t instance_idx) const; double get_instance_max_z(size_t instance_idx) const; @@ -377,17 +501,21 @@ class ModelObject final : public ObjectBase // Get count of errors in the mesh( or all object's meshes, if volume index isn't defined) int get_repaired_errors_count(const int vol_idx = -1) const; + // Detect if object has at least one solid mash + bool has_solid_mesh() const; + bool is_cut() const { return cut_id.id().valid(); } + bool has_connectors() const; + private: friend class Model; // This constructor assigns new ID to this ModelObject and its config. - explicit ModelObject(Model* model) : m_model(model), printable(true), origin_translation(Vec3d::Zero()), - m_bounding_box_valid(false), m_raw_bounding_box_valid(false), m_raw_mesh_bounding_box_valid(false) + explicit ModelObject(Model* model) : m_model(model), origin_translation(Vec3d::Zero()) { assert(this->id().valid()); assert(this->config.id().valid()); assert(this->layer_height_profile.id().valid()); } - explicit ModelObject(int) : ObjectBase(-1), config(-1), layer_height_profile(-1), m_model(nullptr), printable(true), origin_translation(Vec3d::Zero()), m_bounding_box_valid(false), m_raw_bounding_box_valid(false), m_raw_mesh_bounding_box_valid(false) + explicit ModelObject(int) : ObjectBase(-1), config(-1), layer_height_profile(-1), origin_translation(Vec3d::Zero()) { assert(this->id().invalid()); assert(this->config.id().invalid()); @@ -465,15 +593,31 @@ class ModelObject final : public ObjectBase OBJECTBASE_DERIVED_COPY_MOVE_CLONE(ModelObject) // Parent object, owning this ModelObject. Set to nullptr here, so the macros above will have it initialized. - Model *m_model = nullptr; + Model *m_model { nullptr }; // Bounding box, cached. - mutable BoundingBoxf3 m_bounding_box; - mutable bool m_bounding_box_valid; + mutable BoundingBoxf3 m_bounding_box_approx; + mutable bool m_bounding_box_approx_valid { false }; + mutable BoundingBoxf3 m_bounding_box_exact; + mutable bool m_bounding_box_exact_valid { false }; + mutable bool m_min_max_z_valid { false }; mutable BoundingBoxf3 m_raw_bounding_box; - mutable bool m_raw_bounding_box_valid; + mutable bool m_raw_bounding_box_valid { false }; mutable BoundingBoxf3 m_raw_mesh_bounding_box; - mutable bool m_raw_mesh_bounding_box_valid; + mutable bool m_raw_mesh_bounding_box_valid { false }; + + // Only use this method if now the source and dest ModelObjects are equal, for example they were synchronized by Print::apply(). + void copy_transformation_caches(const ModelObject &src) { + m_bounding_box_approx = src.m_bounding_box_approx; + m_bounding_box_approx_valid = src.m_bounding_box_approx_valid; + m_bounding_box_exact = src.m_bounding_box_exact; + m_bounding_box_exact_valid = src.m_bounding_box_exact_valid; + m_min_max_z_valid = src.m_min_max_z_valid; + m_raw_bounding_box = src.m_raw_bounding_box; + m_raw_bounding_box_valid = src.m_raw_bounding_box_valid; + m_raw_mesh_bounding_box = src.m_raw_mesh_bounding_box; + m_raw_mesh_bounding_box_valid = src.m_raw_mesh_bounding_box_valid; + } // Called by Print::apply() to set the model pointer after making a copy. friend class Print; @@ -485,8 +629,7 @@ class ModelObject final : public ObjectBase friend class UndoRedo::StackImpl; // Used for deserialization -> Don't allocate any IDs for the ModelObject or its config. ModelObject() : - ObjectBase(-1), config(-1), layer_height_profile(-1), - m_model(nullptr), m_bounding_box_valid(false), m_raw_bounding_box_valid(false), m_raw_mesh_bounding_box_valid(false) { + ObjectBase(-1), config(-1), layer_height_profile(-1) { assert(this->id().invalid()); assert(this->config.id().invalid()); assert(this->layer_height_profile.id().invalid()); @@ -497,11 +640,17 @@ class ModelObject final : public ObjectBase Internal::StaticSerializationWrapper layer_heigth_profile_wrapper(layer_height_profile); ar(name, input_file, instances, volumes, config_wrapper, layer_config_ranges, layer_heigth_profile_wrapper, sla_support_points, sla_points_status, sla_drain_holes, printable, origin_translation, - m_bounding_box, m_bounding_box_valid, m_raw_bounding_box, m_raw_bounding_box_valid, m_raw_mesh_bounding_box, m_raw_mesh_bounding_box_valid); + m_bounding_box_approx, m_bounding_box_approx_valid, + m_bounding_box_exact, m_bounding_box_exact_valid, m_min_max_z_valid, + m_raw_bounding_box, m_raw_bounding_box_valid, m_raw_mesh_bounding_box, m_raw_mesh_bounding_box_valid, + cut_connectors, cut_id); } // Called by Print::validate() from the UI thread. unsigned int update_instances_print_volume_state(const BuildVolume &build_volume); + + // Called by min_z(), max_z() + void update_min_max_z(); }; enum class EnforcerBlockerType : int8_t { @@ -616,8 +765,40 @@ class ModelVolume final : public ObjectBase }; Source source; + // struct used by cut command + // It contains information about connetors + struct CutInfo + { + bool is_connector{ false }; + bool is_processed{ true }; + CutConnectorType connector_type{ CutConnectorType::Plug }; + float radius_tolerance{ 0.f };// [0.f : 1.f] + float height_tolerance{ 0.f };// [0.f : 1.f] + + CutInfo() = default; + CutInfo(CutConnectorType type, float rad_tolerance, float h_tolerance, bool processed = false) : + is_connector(true), + is_processed(processed), + connector_type(type), + radius_tolerance(rad_tolerance), + height_tolerance(h_tolerance) + {} + + void set_processed() { is_processed = true; } + void invalidate() { is_connector = false; } + + template inline void serialize(Archive& ar) { + ar(is_connector, is_processed, connector_type, radius_tolerance, height_tolerance); + } + }; + CutInfo cut_info; + + bool is_cut_connector() const { return cut_info.is_processed && cut_info.is_connector; } + void invalidate_cut_info() { cut_info.invalidate(); } + // The triangular model. const TriangleMesh& mesh() const { return *m_mesh.get(); } + std::shared_ptr mesh_ptr() const { return m_mesh; } void set_mesh(const TriangleMesh &mesh) { m_mesh = std::make_shared(mesh); } void set_mesh(TriangleMesh &&mesh) { m_mesh = std::make_shared(std::move(mesh)); } void set_mesh(const indexed_triangle_set &mesh) { m_mesh = std::make_shared(mesh); } @@ -625,6 +806,7 @@ class ModelVolume final : public ObjectBase void set_mesh(std::shared_ptr &mesh) { m_mesh = mesh; } void set_mesh(std::unique_ptr &&mesh) { m_mesh = std::move(mesh); } void reset_mesh() { m_mesh = std::make_shared(); } + const std::shared_ptr& get_mesh_shared_ptr() const { return m_mesh; } // Configuration parameters specific to an object model geometry or a modifier volume, // overriding the global Slic3r settings and the ModelObject settings. ModelConfigObject config; @@ -638,6 +820,10 @@ class ModelVolume final : public ObjectBase // List of mesh facets painted for MMU segmentation. FacetsAnnotation mmu_segmentation_facets; + // Is set only when volume is Embossed Text type + // Contain information how to re-create volume + std::optional text_configuration; + // A parent object owning this modifier volume. ModelObject* get_object() const { return this->object; } ModelVolumeType type() const { return m_type; } @@ -648,7 +834,11 @@ class ModelVolume final : public ObjectBase bool is_support_enforcer() const { return m_type == ModelVolumeType::SUPPORT_ENFORCER; } bool is_support_blocker() const { return m_type == ModelVolumeType::SUPPORT_BLOCKER; } bool is_support_modifier() const { return m_type == ModelVolumeType::SUPPORT_BLOCKER || m_type == ModelVolumeType::SUPPORT_ENFORCER; } + bool is_text() const { return text_configuration.has_value(); } + bool is_the_only_one_part() const; // behave like an object t_model_material_id material_id() const { return m_material_id; } + void reset_extra_facets(); + void apply_tolerance(); void set_material_id(t_model_material_id material_id); ModelMaterial* material() const; void set_material(t_model_material_id material_id, const ModelMaterial &material); @@ -691,15 +881,16 @@ class ModelVolume final : public ObjectBase const Geometry::Transformation& get_transformation() const { return m_transformation; } void set_transformation(const Geometry::Transformation& transformation) { m_transformation = transformation; } - void set_transformation(const Transform3d &trafo) { m_transformation.set_from_transform(trafo); } + void set_transformation(const Transform3d& trafo) { m_transformation.set_matrix(trafo); } + + Vec3d get_offset() const { return m_transformation.get_offset(); } - const Vec3d& get_offset() const { return m_transformation.get_offset(); } double get_offset(Axis axis) const { return m_transformation.get_offset(axis); } void set_offset(const Vec3d& offset) { m_transformation.set_offset(offset); } void set_offset(Axis axis, double offset) { m_transformation.set_offset(axis, offset); } - const Vec3d& get_rotation() const { return m_transformation.get_rotation(); } + Vec3d get_rotation() const { return m_transformation.get_rotation(); } double get_rotation(Axis axis) const { return m_transformation.get_rotation(axis); } void set_rotation(const Vec3d& rotation) { m_transformation.set_rotation(rotation); } @@ -711,7 +902,7 @@ class ModelVolume final : public ObjectBase void set_scaling_factor(const Vec3d& scaling_factor) { m_transformation.set_scaling_factor(scaling_factor); } void set_scaling_factor(Axis axis, double scaling_factor) { m_transformation.set_scaling_factor(axis, scaling_factor); } - const Vec3d& get_mirror() const { return m_transformation.get_mirror(); } + Vec3d get_mirror() const { return m_transformation.get_mirror(); } double get_mirror(Axis axis) const { return m_transformation.get_mirror(axis); } bool is_left_handed() const { return m_transformation.is_left_handed(); } @@ -720,7 +911,8 @@ class ModelVolume final : public ObjectBase void convert_from_imperial_units(); void convert_from_meters(); - const Transform3d& get_matrix(bool dont_translate = false, bool dont_rotate = false, bool dont_scale = false, bool dont_mirror = false) const { return m_transformation.get_matrix(dont_translate, dont_rotate, dont_scale, dont_mirror); } + const Transform3d& get_matrix() const { return m_transformation.get_matrix(); } + Transform3d get_matrix_no_offset() const { return m_transformation.get_matrix_no_offset(); } void set_new_unique_id() { ObjectBase::set_new_unique_id(); @@ -766,31 +958,34 @@ class ModelVolume final : public ObjectBase // 1 -> is splittable mutable int m_is_splittable{ -1 }; - ModelVolume(ModelObject *object, const TriangleMesh &mesh, ModelVolumeType type = ModelVolumeType::MODEL_PART) : m_mesh(new TriangleMesh(mesh)), m_type(type), object(object) - { - assert(this->id().valid()); - assert(this->config.id().valid()); - assert(this->supported_facets.id().valid()); + inline bool check() { + assert(this->id().valid()); + assert(this->config.id().valid()); + assert(this->supported_facets.id().valid()); assert(this->seam_facets.id().valid()); assert(this->mmu_segmentation_facets.id().valid()); assert(this->id() != this->config.id()); assert(this->id() != this->supported_facets.id()); assert(this->id() != this->seam_facets.id()); assert(this->id() != this->mmu_segmentation_facets.id()); - if (mesh.facets_count() > 1) - calculate_convex_hull(); + return true; + } + + ModelVolume(ModelObject *object, const TriangleMesh &mesh, ModelVolumeType type = ModelVolumeType::MODEL_PART) : + m_mesh(new TriangleMesh(mesh)), m_type(type), object(object) + { + assert(check()); + if (m_mesh->facets_count() > 1) calculate_convex_hull(); + } + ModelVolume(ModelObject *object, TriangleMesh &&mesh, ModelVolumeType type = ModelVolumeType::MODEL_PART) + : m_mesh(new TriangleMesh(std::move(mesh))), m_type(type), object(object) + { + assert(check()); + if (m_mesh->facets_count() > 1) calculate_convex_hull(); } ModelVolume(ModelObject *object, TriangleMesh &&mesh, TriangleMesh &&convex_hull, ModelVolumeType type = ModelVolumeType::MODEL_PART) : m_mesh(new TriangleMesh(std::move(mesh))), m_convex_hull(new TriangleMesh(std::move(convex_hull))), m_type(type), object(object) { - assert(this->id().valid()); - assert(this->config.id().valid()); - assert(this->supported_facets.id().valid()); - assert(this->seam_facets.id().valid()); - assert(this->mmu_segmentation_facets.id().valid()); - assert(this->id() != this->config.id()); - assert(this->id() != this->supported_facets.id()); - assert(this->id() != this->seam_facets.id()); - assert(this->id() != this->mmu_segmentation_facets.id()); + assert(check()); } // Copying an existing volume, therefore this volume will get a copy of the ID assigned. @@ -798,7 +993,9 @@ class ModelVolume final : public ObjectBase ObjectBase(other), name(other.name), source(other.source), m_mesh(other.m_mesh), m_convex_hull(other.m_convex_hull), config(other.config), m_type(other.m_type), object(object), m_transformation(other.m_transformation), - supported_facets(other.supported_facets), seam_facets(other.seam_facets), mmu_segmentation_facets(other.mmu_segmentation_facets) + supported_facets(other.supported_facets), seam_facets(other.seam_facets), mmu_segmentation_facets(other.mmu_segmentation_facets), + cut_info(other.cut_info), + text_configuration(other.text_configuration) { assert(this->id().valid()); assert(this->config.id().valid()); @@ -817,8 +1014,10 @@ class ModelVolume final : public ObjectBase this->set_material_id(other.material_id()); } // Providing a new mesh, therefore this volume will get a new unique ID assigned. - ModelVolume(ModelObject *object, const ModelVolume &other, const TriangleMesh &&mesh) : - name(other.name), source(other.source), m_mesh(new TriangleMesh(std::move(mesh))), config(other.config), m_type(other.m_type), object(object), m_transformation(other.m_transformation) + ModelVolume(ModelObject *object, const ModelVolume &other, TriangleMesh &&mesh) : + name(other.name), source(other.source), config(other.config), object(object), m_mesh(new TriangleMesh(std::move(mesh))), m_type(other.m_type), m_transformation(other.m_transformation), + cut_info(other.cut_info), + text_configuration(other.text_configuration) { assert(this->id().valid()); assert(this->config.id().valid()); @@ -833,7 +1032,7 @@ class ModelVolume final : public ObjectBase assert(this->config.id() == other.config.id()); this->set_material_id(other.material_id()); this->config.set_new_unique_id(); - if (mesh.facets_count() > 1) + if (m_mesh->facets_count() > 1) calculate_convex_hull(); assert(this->config.id().valid()); assert(this->config.id() != other.config.id()); @@ -860,11 +1059,12 @@ class ModelVolume final : public ObjectBase } template void load(Archive &ar) { bool has_convex_hull; - ar(name, source, m_mesh, m_type, m_material_id, m_transformation, m_is_splittable, has_convex_hull); + ar(name, source, m_mesh, m_type, m_material_id, m_transformation, m_is_splittable, has_convex_hull, cut_info); cereal::load_by_value(ar, supported_facets); cereal::load_by_value(ar, seam_facets); cereal::load_by_value(ar, mmu_segmentation_facets); cereal::load_by_value(ar, config); + cereal::load(ar, text_configuration); assert(m_mesh); if (has_convex_hull) { cereal::load_optional(ar, m_convex_hull); @@ -876,11 +1076,12 @@ class ModelVolume final : public ObjectBase } template void save(Archive &ar) const { bool has_convex_hull = m_convex_hull.get() != nullptr; - ar(name, source, m_mesh, m_type, m_material_id, m_transformation, m_is_splittable, has_convex_hull); + ar(name, source, m_mesh, m_type, m_material_id, m_transformation, m_is_splittable, has_convex_hull, cut_info); cereal::save_by_value(ar, supported_facets); cereal::save_by_value(ar, seam_facets); cereal::save_by_value(ar, mmu_segmentation_facets); cereal::save_by_value(ar, config); + cereal::save(ar, text_configuration); if (has_convex_hull) cereal::save_optional(ar, m_convex_hull); } @@ -916,50 +1117,49 @@ class ModelInstance final : public ObjectBase // flag showing the position of this instance with respect to the print volume (set by Print::validate() using ModelObject::check_instances_print_volume_state()) ModelInstanceEPrintVolumeState print_volume_state; // Whether or not this instance is printable - bool printable; + bool printable { true }; ModelObject* get_object() const { return this->object; } const Geometry::Transformation& get_transformation() const { return m_transformation; } void set_transformation(const Geometry::Transformation& transformation) { m_transformation = transformation; } - const Vec3d& get_offset() const { return m_transformation.get_offset(); } + Vec3d get_offset() const { return m_transformation.get_offset(); } double get_offset(Axis axis) const { return m_transformation.get_offset(axis); } void set_offset(const Vec3d& offset) { m_transformation.set_offset(offset); } void set_offset(Axis axis, double offset) { m_transformation.set_offset(axis, offset); } - const Vec3d& get_rotation() const { return m_transformation.get_rotation(); } + Vec3d get_rotation() const { return m_transformation.get_rotation(); } double get_rotation(Axis axis) const { return m_transformation.get_rotation(axis); } void set_rotation(const Vec3d& rotation) { m_transformation.set_rotation(rotation); } void set_rotation(Axis axis, double rotation) { m_transformation.set_rotation(axis, rotation); } - const Vec3d& get_scaling_factor() const { return m_transformation.get_scaling_factor(); } + Vec3d get_scaling_factor() const { return m_transformation.get_scaling_factor(); } double get_scaling_factor(Axis axis) const { return m_transformation.get_scaling_factor(axis); } void set_scaling_factor(const Vec3d& scaling_factor) { m_transformation.set_scaling_factor(scaling_factor); } void set_scaling_factor(Axis axis, double scaling_factor) { m_transformation.set_scaling_factor(axis, scaling_factor); } - const Vec3d& get_mirror() const { return m_transformation.get_mirror(); } + Vec3d get_mirror() const { return m_transformation.get_mirror(); } double get_mirror(Axis axis) const { return m_transformation.get_mirror(axis); } - bool is_left_handed() const { return m_transformation.is_left_handed(); } + bool is_left_handed() const { return m_transformation.is_left_handed(); } void set_mirror(const Vec3d& mirror) { m_transformation.set_mirror(mirror); } void set_mirror(Axis axis, double mirror) { m_transformation.set_mirror(axis, mirror); } // To be called on an external mesh void transform_mesh(TriangleMesh* mesh, bool dont_translate = false) const; - // Calculate a bounding box of a transformed mesh. To be called on an external mesh. - BoundingBoxf3 transform_mesh_bounding_box(const TriangleMesh& mesh, bool dont_translate = false) const; - // Transform an external bounding box. + // Transform an external bounding box, thus the resulting bounding box is no more snug. BoundingBoxf3 transform_bounding_box(const BoundingBoxf3 &bbox, bool dont_translate = false) const; // Transform an external vector. Vec3d transform_vector(const Vec3d& v, bool dont_translate = false) const; // To be called on an external polygon. It does not translate the polygon, only rotates and scales. void transform_polygon(Polygon* polygon) const; - const Transform3d& get_matrix(bool dont_translate = false, bool dont_rotate = false, bool dont_scale = false, bool dont_mirror = false) const { return m_transformation.get_matrix(dont_translate, dont_rotate, dont_scale, dont_mirror); } + const Transform3d& get_matrix() const { return m_transformation.get_matrix(); } + Transform3d get_matrix_no_offset() const { return m_transformation.get_matrix_no_offset(); } bool is_printable() const { return object->printable && printable && (print_volume_state == ModelInstancePVS_Inside); } @@ -990,7 +1190,7 @@ class ModelInstance final : public ObjectBase ModelObject* object; // Constructor, which assigns a new unique ID. - explicit ModelInstance(ModelObject* object) : print_volume_state(ModelInstancePVS_Inside), printable(true), object(object) { assert(this->id().valid()); } + explicit ModelInstance(ModelObject* object) : print_volume_state(ModelInstancePVS_Inside), object(object) { assert(this->id().valid()); } // Constructor, which assigns a new unique ID. explicit ModelInstance(ModelObject *object, const ModelInstance &other) : m_transformation(other.m_transformation), print_volume_state(ModelInstancePVS_Inside), printable(other.printable), object(object) { assert(this->id().valid() && this->id() != other.id()); } @@ -1105,8 +1305,12 @@ class Model final : public ObjectBase void delete_material(t_model_material_id material_id); void clear_materials(); bool add_default_instances(); - // Returns approximate axis aligned bounding box of this model - BoundingBoxf3 bounding_box() const; + // Returns approximate axis aligned bounding box of this model. + BoundingBoxf3 bounding_box_approx() const; + // Returns exact axis aligned bounding box of this model. + BoundingBoxf3 bounding_box_exact() const; + // Return maximum height of all printable objects. + double max_z() const; // Set the print_volume_state of PrintObject::instances, // return total number of printable objects. unsigned int update_print_volume_state(const BuildVolume &build_volume); @@ -1186,9 +1390,14 @@ bool model_custom_seam_data_changed(const ModelObject& mo, const ModelObject& mo // The function assumes that volumes list is synchronized. extern bool model_mmu_segmentation_data_changed(const ModelObject& mo, const ModelObject& mo_new); +// If the model has object(s) which contains a modofoer, then it is currently not supported by the SLA mode. +// Either the model cannot be loaded, or a SLA printer has to be activated. +bool model_has_parameter_modifiers_in_objects(const Model& model); // If the model has multi-part objects, then it is currently not supported by the SLA mode. // Either the model cannot be loaded, or a SLA printer has to be activated. bool model_has_multi_part_objects(const Model &model); +// If the model has objects with cut connectrs, then it is currently not supported by the SLA mode. +bool model_has_connectors(const Model& model); // If the model has advanced features, then it cannot be processed in simple mode. bool model_has_advanced_features(const Model &model); diff --git a/src/libslic3r/MultiMaterialSegmentation.cpp b/src/libslic3r/MultiMaterialSegmentation.cpp index 9560096bed1..661c2d0fd15 100644 --- a/src/libslic3r/MultiMaterialSegmentation.cpp +++ b/src/libslic3r/MultiMaterialSegmentation.cpp @@ -713,7 +713,7 @@ struct MMU_Graph [[nodiscard]] const Vec2d &point_double() const { return m_point_double; } [[nodiscard]] const Point &point() const { return m_point; } - bool operator==(const CPoint &rhs) const { return this->m_point_double == rhs.m_point_double && this->m_contour_idx == rhs.m_contour_idx && this->m_point_idx == rhs.m_point_idx; } + bool operator==(const CPoint &rhs) const { return m_point_double == rhs.m_point_double && m_contour_idx == rhs.m_contour_idx && m_point_idx == rhs.m_point_idx; } }; struct CPointAccessor { const Point* operator()(const CPoint &pt) const { return &pt.point(); }}; typedef ClosestPointInRadiusLookup CPointLookupType; @@ -1305,7 +1305,7 @@ static inline std::vector> mmu_segmentation_top_and_bott { const size_t num_extruders = print_object.print()->config().nozzle_diameter.size() + 1; const size_t num_layers = input_expolygons.size(); - const ConstLayerPtrsAdaptor layers = print_object.layers(); + const SpanOfConstPtrs layers = print_object.layers(); // Maximum number of top / bottom layers accounts for maximum overlap of one thread group into a neighbor thread group. int max_top_layers = 0; @@ -1685,7 +1685,7 @@ std::vector> multi_material_segmentation_by_painting(con std::vector> painted_lines(num_layers); std::array painted_lines_mutex; std::vector edge_grids(num_layers); - const ConstLayerPtrsAdaptor layers = print_object.layers(); + const SpanOfConstPtrs layers = print_object.layers(); std::vector input_expolygons(num_layers); throw_on_cancel_callback(); @@ -1697,7 +1697,7 @@ std::vector> multi_material_segmentation_by_painting(con throw_on_cancel_callback(); ExPolygons ex_polygons; for (LayerRegion *region : layers[layer_idx]->regions()) - for (const Surface &surface : region->slices.surfaces) + for (const Surface &surface : region->slices()) Slic3r::append(ex_polygons, offset_ex(surface.expolygon, float(10 * SCALED_EPSILON))); // All expolygons are expanded by SCALED_EPSILON, merged, and then shrunk again by SCALED_EPSILON // to ensure that very close polygons will be merged. diff --git a/src/libslic3r/MultiPoint.cpp b/src/libslic3r/MultiPoint.cpp index 5ed9eb23cb2..f18720bd6fa 100644 --- a/src/libslic3r/MultiPoint.cpp +++ b/src/libslic3r/MultiPoint.cpp @@ -45,16 +45,6 @@ void MultiPoint::rotate(double angle, const Point ¢er) } } -double MultiPoint::length() const -{ - const Lines& lines = this->lines(); - double len = 0; - for (auto it = lines.cbegin(); it != lines.cend(); ++it) { - len += it->length(); - } - return len; -} - int MultiPoint::find_point(const Point &point) const { for (const Point &pt : this->points) @@ -81,12 +71,6 @@ int MultiPoint::find_point(const Point &point, double scaled_epsilon) const return dist2_min < eps2 ? idx_min : -1; } -bool MultiPoint::has_boundary_point(const Point &point) const -{ - double dist = (point.projection_onto(*this) - point).cast().norm(); - return dist < SCALED_EPSILON; -} - BoundingBox MultiPoint::bounding_box() const { return BoundingBox(this->points); @@ -119,49 +103,6 @@ bool MultiPoint::remove_duplicate_points() return false; } -bool MultiPoint::intersection(const Line& line, Point* intersection) const -{ - Lines lines = this->lines(); - for (Lines::const_iterator it = lines.begin(); it != lines.end(); ++it) { - if (it->intersection(line, intersection)) return true; - } - return false; -} - -bool MultiPoint::first_intersection(const Line& line, Point* intersection) const -{ - bool found = false; - double dmin = 0.; - for (const Line &l : this->lines()) { - Point ip; - if (l.intersection(line, &ip)) { - if (! found) { - found = true; - dmin = (line.a - ip).cast().norm(); - *intersection = ip; - } else { - double d = (line.a - ip).cast().norm(); - if (d < dmin) { - dmin = d; - *intersection = ip; - } - } - } - } - return found; -} - -bool MultiPoint::intersections(const Line &line, Points *intersections) const -{ - size_t intersections_size = intersections->size(); - for (const Line &polygon_line : this->lines()) { - Point intersection; - if (polygon_line.intersection(line, &intersection)) - intersections->emplace_back(std::move(intersection)); - } - return intersections->size() > intersections_size; -} - std::vector MultiPoint::_douglas_peucker(const std::vector& pts, const double tolerance) { std::vector result_pts; @@ -363,14 +304,6 @@ void MultiPoint3::translate(const Point& vector) this->translate(vector(0), vector(1)); } -double MultiPoint3::length() const -{ - double len = 0.0; - for (const Line3& line : this->lines()) - len += line.length(); - return len; -} - BoundingBox3 MultiPoint3::bounding_box() const { return BoundingBox3(points); diff --git a/src/libslic3r/MultiPoint.hpp b/src/libslic3r/MultiPoint.hpp index fca3b11688f..778b30c57dc 100644 --- a/src/libslic3r/MultiPoint.hpp +++ b/src/libslic3r/MultiPoint.hpp @@ -17,7 +17,7 @@ class MultiPoint public: Points points; - MultiPoint() {} + MultiPoint() = default; MultiPoint(const MultiPoint &other) : points(other.points) {} MultiPoint(MultiPoint &&other) : points(std::move(other.points)) {} MultiPoint(std::initializer_list list) : points(list) {} @@ -36,11 +36,8 @@ class MultiPoint const Point& front() const { return this->points.front(); } const Point& back() const { return this->points.back(); } const Point& first_point() const { return this->front(); } - virtual const Point& last_point() const = 0; - virtual Lines lines() const = 0; size_t size() const { return points.size(); } bool empty() const { return points.empty(); } - double length() const; bool is_valid() const { return this->points.size() >= 2; } // Return index of a polygon point exactly equal to point. @@ -49,7 +46,6 @@ class MultiPoint // Return index of the closest point to point closer than scaled_epsilon. // Return -1 if no such point exists. int find_point(const Point &point, const double scaled_epsilon) const; - bool has_boundary_point(const Point &point) const; int closest_point_index(const Point &point) const { int idx = -1; if (! this->points.empty()) { @@ -85,10 +81,6 @@ class MultiPoint } } - bool intersection(const Line& line, Point* intersection) const; - bool first_intersection(const Line& line, Point* intersection) const; - bool intersections(const Line &line, Points *intersections) const; - static Points _douglas_peucker(const Points &points, const double tolerance); static Points visivalingam(const Points& pts, const double& tolerance); @@ -109,8 +101,6 @@ class MultiPoint3 void translate(double x, double y); void translate(const Point& vector); - virtual Lines3 lines() const = 0; - double length() const; bool is_valid() const { return this->points.size() >= 2; } BoundingBox3 bounding_box() const; diff --git a/src/libslic3r/MutablePriorityQueue.hpp b/src/libslic3r/MutablePriorityQueue.hpp index cc1cae68c9d..fd3e7ac2db3 100644 --- a/src/libslic3r/MutablePriorityQueue.hpp +++ b/src/libslic3r/MutablePriorityQueue.hpp @@ -3,6 +3,13 @@ #include #include +#include +#include +#include // adds size_t (without std::) + +namespace Slic3r { + +constexpr auto InvalidQueueID = std::numeric_limits::max(); template class MutablePriorityQueue @@ -17,6 +24,14 @@ class MutablePriorityQueue {} ~MutablePriorityQueue() { clear(); } + MutablePriorityQueue(MutablePriorityQueue &&) = default; + MutablePriorityQueue& operator=(MutablePriorityQueue &&) = default; + + // This class modifies the outside data through the m_index_setter + // and thus it should not be copied. The semantics is similar to std::unique_ptr + MutablePriorityQueue(const MutablePriorityQueue &) = delete; + MutablePriorityQueue& operator=(const MutablePriorityQueue &) = delete; + void clear(); void reserve(size_t cnt) { m_heap.reserve(cnt); } void push(const T &item); @@ -30,6 +45,7 @@ class MutablePriorityQueue bool empty() const { return m_heap.empty(); } T& operator[](std::size_t idx) noexcept { return m_heap[idx]; } const T& operator[](std::size_t idx) const noexcept { return m_heap[idx]; } + static constexpr size_t invalid_id() { return InvalidQueueID; } using iterator = typename std::vector::iterator; using const_iterator = typename std::vector::const_iterator; @@ -58,14 +74,10 @@ MutablePriorityQueue make_ template inline void MutablePriorityQueue::clear() { -#ifdef NDEBUG - // Only mark as removed from the queue in release mode, if configured so. - if (ResetIndexWhenRemoved) -#endif /* NDEBUG */ - { + if constexpr (ResetIndexWhenRemoved) { for (size_t idx = 0; idx < m_heap.size(); ++ idx) // Mark as removed from the queue. - m_index_setter(m_heap[idx], std::numeric_limits::max()); + m_index_setter(m_heap[idx], this->invalid_id()); } m_heap.clear(); } @@ -92,13 +104,9 @@ template::pop() { assert(! m_heap.empty()); -#ifdef NDEBUG - // Only mark as removed from the queue in release mode, if configured so. - if (ResetIndexWhenRemoved) -#endif /* NDEBUG */ - { + if constexpr (ResetIndexWhenRemoved) { // Mark as removed from the queue. - m_index_setter(m_heap.front(), std::numeric_limits::max()); + m_index_setter(m_heap.front(), this->invalid_id()); } if (m_heap.size() > 1) { m_heap.front() = m_heap.back(); @@ -113,13 +121,10 @@ template::remove(size_t idx) { assert(idx < m_heap.size()); -#ifdef NDEBUG // Only mark as removed from the queue in release mode, if configured so. - if (ResetIndexWhenRemoved) -#endif /* NDEBUG */ - { + if constexpr (ResetIndexWhenRemoved) { // Mark as removed from the queue. - m_index_setter(m_heap[idx], std::numeric_limits::max()); + m_index_setter(m_heap[idx], this->invalid_id()); } if (idx + 1 == m_heap.size()) { m_heap.pop_back(); @@ -266,6 +271,14 @@ class MutableSkipHeapPriorityQueue {} ~MutableSkipHeapPriorityQueue() { clear(); } + MutableSkipHeapPriorityQueue(MutableSkipHeapPriorityQueue &&) = default; + MutableSkipHeapPriorityQueue &operator=(MutableSkipHeapPriorityQueue &&) = default; + + // This class modifies the outside data through the m_index_setter + // and thus it should not be copied. The semantics is similar to std::unique_ptr + MutableSkipHeapPriorityQueue(const MutableSkipHeapPriorityQueue &) = delete; + MutableSkipHeapPriorityQueue &operator=(const MutableSkipHeapPriorityQueue &) = delete; + void clear(); // Reserve one unused element per miniheap. void reserve(size_t cnt) { m_heap.reserve(cnt + ((cnt + (address::block_size - 1)) / (address::block_size - 1))); } @@ -277,9 +290,12 @@ class MutableSkipHeapPriorityQueue void update(size_t idx) { assert(! address::is_padding(idx)); T item = m_heap[idx]; remove(idx); push(item); } // There is one padding element storead at each miniheap, thus lower the number of elements by the number of miniheaps. size_t size() const noexcept { return m_heap.size() - (m_heap.size() + address::block_size - 1) / address::block_size; } + // Number of heap elements including padding. heap_size() >= size(). + size_t heap_size() const noexcept { return m_heap.size(); } bool empty() const { return m_heap.empty(); } T& operator[](std::size_t idx) noexcept { assert(! address::is_padding(idx)); return m_heap[idx]; } const T& operator[](std::size_t idx) const noexcept { assert(! address::is_padding(idx)); return m_heap[idx]; } + static constexpr size_t invalid_id() { return InvalidQueueID; } protected: void update_heap_up(size_t top, size_t bottom); @@ -309,15 +325,11 @@ MutableSkipHeapPriorityQueue inline void MutableSkipHeapPriorityQueue::clear() { -#ifdef NDEBUG - // Only mark as removed from the queue in release mode, if configured so. - if (ResetIndexWhenRemoved) -#endif /* NDEBUG */ - { + if constexpr (ResetIndexWhenRemoved) { for (size_t idx = 0; idx < m_heap.size(); ++ idx) // Mark as removed from the queue. if (! address::is_padding(idx)) - m_index_setter(m_heap[idx], std::numeric_limits::max()); + m_index_setter(m_heap[idx], this->invalid_id()); } m_heap.clear(); } @@ -348,13 +360,9 @@ template::pop() { assert(! m_heap.empty()); -#ifdef NDEBUG - // Only mark as removed from the queue in release mode, if configured so. - if (ResetIndexWhenRemoved) -#endif /* NDEBUG */ - { + if constexpr (ResetIndexWhenRemoved) { // Mark as removed from the queue. - m_index_setter(m_heap[1], std::numeric_limits::max()); + m_index_setter(m_heap[1], this->invalid_id()); } // Zero'th element is padding, thus non-empty queue must have at least two elements. if (m_heap.size() > 2) { @@ -371,13 +379,9 @@ inline void MutableSkipHeapPriorityQueue::max()); + m_index_setter(m_heap[idx], this->invalid_id()); } if (idx + 1 == m_heap.size()) { this->pop_back(); @@ -450,4 +454,6 @@ inline void MutableSkipHeapPriorityQueue nsvg__flattenShape -> nsvg__flattenCubicBez +// https://github.com/memononen/nanosvg/blob/f0a3e1034dd22e2e87e5db22401e44998383124e/src/nanosvgrast.h#L335 +void NSVGUtils::flatten_cubic_bez(Polygon &polygon, + float tessTol, + Vec2f p1, + Vec2f p2, + Vec2f p3, + Vec2f p4, + int level) +{ + Vec2f p12 = (p1 + p2) * 0.5f; + Vec2f p23 = (p2 + p3) * 0.5f; + Vec2f p34 = (p3 + p4) * 0.5f; + Vec2f p123 = (p12 + p23) * 0.5f; + + Vec2f pd = p4 - p1; + Vec2f pd2 = p2 - p4; + float d2 = std::abs(pd2.x() * pd.y() - pd2.y() * pd.x()); + Vec2f pd3 = p3 - p4; + float d3 = std::abs(pd3.x() * pd.y() - pd3.y() * pd.x()); + float d23 = d2 + d3; + + if ((d23 * d23) < tessTol * (pd.x() * pd.x() + pd.y() * pd.y())) { + polygon.points.emplace_back(p4.x(), p4.y()); + return; + } + + --level; + if (level == 0) return; + Vec2f p234 = (p23 + p34) * 0.5f; + Vec2f p1234 = (p123 + p234) * 0.5f; + flatten_cubic_bez(polygon, tessTol, p1, p12, p123, p1234, level); + flatten_cubic_bez(polygon, tessTol, p1234, p234, p34, p4, level); +} + +Polygons NSVGUtils::to_polygons(NSVGimage *image, float tessTol, int max_level) +{ + Polygons polygons; + for (NSVGshape *shape = image->shapes; shape != NULL; + shape = shape->next) { + if (!(shape->flags & NSVG_FLAGS_VISIBLE)) continue; + Slic3r::Polygon polygon; + if (shape->fill.type != NSVG_PAINT_NONE) { + for (NSVGpath *path = shape->paths; path != NULL; + path = path->next) { + // Flatten path + polygon.points.emplace_back(path->pts[0], path->pts[1]); + size_t path_size = (path->npts > 1) ? + static_cast(path->npts - 1) : 0; + for (size_t i = 0; i < path_size; i += 3) { + float *p = &path->pts[i * 2]; + Vec2f p1(p[0], p[1]), p2(p[2], p[3]), p3(p[4], p[5]), + p4(p[6], p[7]); + flatten_cubic_bez(polygon, tessTol, p1, p2, p3, p4, + max_level); + } + if (path->closed && !polygon.empty()) { + polygons.push_back(polygon); + polygon = Slic3r::Polygon(); + } + } + } + if (!polygon.empty()) + polygons.push_back(polygon); + } + return polygons; +} + +ExPolygons NSVGUtils::to_ExPolygons(NSVGimage *image, + float tessTol, + int max_level) +{ + Polygons polygons = to_polygons(image, tessTol, max_level); + + // Fix Y axis + for (Polygon &polygon : polygons) + for (Point &p : polygon.points) p.y() *= -1; + + return Slic3r::union_ex(polygons); +} \ No newline at end of file diff --git a/src/libslic3r/NSVGUtils.hpp b/src/libslic3r/NSVGUtils.hpp new file mode 100644 index 00000000000..d82901fcc89 --- /dev/null +++ b/src/libslic3r/NSVGUtils.hpp @@ -0,0 +1,34 @@ +#ifndef slic3r_NSVGUtils_hpp_ +#define slic3r_NSVGUtils_hpp_ + +#include "Polygon.hpp" +#include "ExPolygon.hpp" +#include "nanosvg/nanosvg.h" // load SVG file + +namespace Slic3r { + +// Helper function to work with nano svg +class NSVGUtils +{ +public: + NSVGUtils() = delete; + + // inspired by nanosvgrast.h function nsvgRasterize->nsvg__flattenShape + static void flatten_cubic_bez(Polygon &polygon, + float tessTol, + Vec2f p1, + Vec2f p2, + Vec2f p3, + Vec2f p4, + int level); + // convert svg image to ExPolygons + static ExPolygons to_ExPolygons(NSVGimage *image, + float tessTol = 10., + int max_level = 10); + // convert svg paths to Polygons + static Polygons to_polygons(NSVGimage *image, + float tessTol = 10., + int max_level = 10); +}; +} // namespace Slic3r +#endif // slic3r_NSVGUtils_hpp_ diff --git a/src/libslic3r/ObjectID.hpp b/src/libslic3r/ObjectID.hpp index 1030171e7fe..4f34572d2e9 100644 --- a/src/libslic3r/ObjectID.hpp +++ b/src/libslic3r/ObjectID.hpp @@ -2,6 +2,7 @@ #define slic3r_ObjectID_hpp_ #include +#include namespace Slic3r { @@ -89,7 +90,9 @@ class ObjectBase friend class cereal::access; friend class Slic3r::UndoRedo::StackImpl; template void serialize(Archive &ar) { ar(m_id); } +protected: // #vbCHECKME && #ysFIXME ObjectBase(const ObjectID id) : m_id(id) {} +private: template static void load_and_construct(Archive & ar, cereal::construct &construct) { ObjectID id; ar(id); construct(id); } }; @@ -128,6 +131,64 @@ class ObjectWithTimestamp : public ObjectBase template void serialize(Archive &ar) { ar(m_timestamp); } }; +class CutObjectBase : public ObjectBase +{ + // check sum of CutParts in initial Object + size_t m_check_sum{ 1 }; + // connectors count + size_t m_connectors_cnt{ 0 }; + +public: + // Default Constructor to assign an invalid ID + CutObjectBase() : ObjectBase(-1) {} + // Constructor with ignored int parameter to assign an invalid ID, to be replaced + // by an existing ID copied from elsewhere. + CutObjectBase(int) : ObjectBase(-1) {} + // Constructor to initialize full information from 3mf + CutObjectBase(ObjectID id, size_t check_sum, size_t connectors_cnt) : ObjectBase(id), m_check_sum(check_sum), m_connectors_cnt(connectors_cnt) {} + // The class tree will have virtual tables and type information. + virtual ~CutObjectBase() = default; + + bool operator<(const CutObjectBase& other) const { return other.id() > this->id(); } + bool operator==(const CutObjectBase& other) const { return other.id() == this->id(); } + + void copy(const CutObjectBase& rhs) { + this->copy_id(rhs); + this->m_check_sum = rhs.check_sum(); + this->m_connectors_cnt = rhs.connectors_cnt() ; + } + CutObjectBase& operator=(const CutObjectBase& other) { + this->copy(other); + return *this; + } + + void invalidate() { + set_invalid_id(); + m_check_sum = 1; + m_connectors_cnt = 0; + } + + void init() { this->set_new_unique_id(); } + bool has_same_id(const CutObjectBase& rhs) { return this->id() == rhs.id(); } + bool is_equal(const CutObjectBase& rhs) { return this->id() == rhs.id() && + this->check_sum() == rhs.check_sum() && + this->connectors_cnt() == rhs.connectors_cnt() ; } + + size_t check_sum() const { return m_check_sum; } + void set_check_sum(size_t cs) { m_check_sum = cs; } + void increase_check_sum(size_t cnt) { m_check_sum += cnt; } + + size_t connectors_cnt() const { return m_connectors_cnt; } + void increase_connectors_cnt(size_t connectors_cnt) { m_connectors_cnt += connectors_cnt; } + +private: + friend class cereal::access; + template void serialize(Archive& ar) { + ar(cereal::base_class(this)); + ar(m_check_sum, m_connectors_cnt); + } +}; + // Unique object / instance ID for the wipe tower. extern ObjectID wipe_tower_object_id(); extern ObjectID wipe_tower_instance_id(); diff --git a/src/libslic3r/OpenVDBUtils.cpp b/src/libslic3r/OpenVDBUtils.cpp index 2c207bb6a71..21409445fc1 100644 --- a/src/libslic3r/OpenVDBUtils.cpp +++ b/src/libslic3r/OpenVDBUtils.cpp @@ -6,6 +6,7 @@ #pragma warning(push) #pragma warning(disable : 4146) #endif // _MSC_VER +#include #include #ifdef _MSC_VER #pragma warning(pop) @@ -16,14 +17,44 @@ #include #include -//#include "MTUtils.hpp" - namespace Slic3r { +struct VoxelGrid +{ + openvdb::FloatGrid grid; + + mutable std::optional accessor; + + template + VoxelGrid(Args &&...args): grid{std::forward(args)...} {} +}; + +void VoxelGridDeleter::operator()(VoxelGrid *ptr) { delete ptr; } + +// Similarly to std::make_unique() +template +VoxelGridPtr make_voxelgrid(Args &&...args) +{ + VoxelGrid *ptr = nullptr; + try { + ptr = new VoxelGrid(std::forward(args)...); + } catch(...) { + delete ptr; + } + + return VoxelGridPtr{ptr}; +} + +template VoxelGridPtr make_voxelgrid<>(); + +inline Vec3f to_vec3f(const openvdb::Vec3s &v) { return Vec3f{v.x(), v.y(), v.z()}; } +inline Vec3d to_vec3d(const openvdb::Vec3s &v) { return to_vec3f(v).cast(); } +inline Vec3i to_vec3i(const openvdb::Vec3I &v) { return Vec3i{int(v[2]), int(v[1]), int(v[0])}; } + class TriangleMeshDataAdapter { public: const indexed_triangle_set &its; - float voxel_scale; + Transform3d trafo; size_t polygonCount() const { return its.indices.size(); } size_t pointCount() const { return its.vertices.size(); } @@ -35,19 +66,26 @@ class TriangleMeshDataAdapter { void getIndexSpacePoint(size_t n, size_t v, openvdb::Vec3d& pos) const { auto vidx = size_t(its.indices[n](Eigen::Index(v))); - Slic3r::Vec3d p = its.vertices[vidx].cast() * voxel_scale; + Slic3r::Vec3d p = trafo * its.vertices[vidx].cast(); pos = {p.x(), p.y(), p.z()}; } - TriangleMeshDataAdapter(const indexed_triangle_set &m, float voxel_sc = 1.f) - : its{m}, voxel_scale{voxel_sc} {}; + TriangleMeshDataAdapter(const indexed_triangle_set &m, const Transform3d tr = Transform3d::Identity()) + : its{m}, trafo{tr} {} }; -openvdb::FloatGrid::Ptr mesh_to_grid(const indexed_triangle_set & mesh, - const openvdb::math::Transform &tr, - float voxel_scale, - float exteriorBandWidth, - float interiorBandWidth) +struct Interrupter +{ + std::function statusfn; + + void start(const char* name = nullptr) { (void)name; } + void end() {} + + inline bool wasInterrupted(int percent = -1) { return statusfn && statusfn(percent); } +}; + +VoxelGridPtr mesh_to_grid(const indexed_triangle_set &mesh, + const MeshToGridParams ¶ms) { // Might not be needed but this is now proven to be working openvdb::initialize(); @@ -55,51 +93,63 @@ openvdb::FloatGrid::Ptr mesh_to_grid(const indexed_triangle_set & mesh, std::vector meshparts = its_split(mesh); auto it = std::remove_if(meshparts.begin(), meshparts.end(), - [](auto &m) { return its_volume(m) < EPSILON; }); + [](auto &m) { + return its_volume(m) < EPSILON; + }); meshparts.erase(it, meshparts.end()); + Transform3d trafo = params.trafo().cast(); + trafo.prescale(params.voxel_scale()); + + Interrupter interrupter{params.statusfn()}; + openvdb::FloatGrid::Ptr grid; for (auto &m : meshparts) { auto subgrid = openvdb::tools::meshToVolume( - TriangleMeshDataAdapter{m, voxel_scale}, tr, 1.f, 1.f); - - if (grid && subgrid) openvdb::tools::csgUnion(*grid, *subgrid); - else if (subgrid) grid = std::move(subgrid); + interrupter, + TriangleMeshDataAdapter{m, trafo}, + openvdb::math::Transform{}, + params.exterior_bandwidth(), + params.interior_bandwidth()); + + if (interrupter.wasInterrupted()) + break; + + if (grid && subgrid) + openvdb::tools::csgUnion(*grid, *subgrid); + else if (subgrid) + grid = std::move(subgrid); } - if (meshparts.size() > 1) { - // This is needed to avoid various artefacts on multipart meshes. - // TODO: replace with something faster - grid = openvdb::tools::levelSetRebuild(*grid, 0., 1.f, 1.f); - } - if(meshparts.empty()) { + if (interrupter.wasInterrupted()) + return {}; + + if (meshparts.empty()) { // Splitting failed, fall back to hollow the original mesh grid = openvdb::tools::meshToVolume( - TriangleMeshDataAdapter{mesh}, tr, 1.f, 1.f); + interrupter, + TriangleMeshDataAdapter{mesh, trafo}, + openvdb::math::Transform{}, + params.exterior_bandwidth(), + params.interior_bandwidth()); } - constexpr int DilateIterations = 1; - - grid = openvdb::tools::dilateSdf( - *grid, interiorBandWidth, openvdb::tools::NN_FACE_EDGE, - DilateIterations, - openvdb::tools::FastSweepingDomain::SWEEP_LESS_THAN_ISOVALUE); + if (interrupter.wasInterrupted()) + return {}; - grid = openvdb::tools::dilateSdf( - *grid, exteriorBandWidth, openvdb::tools::NN_FACE_EDGE, - DilateIterations, - openvdb::tools::FastSweepingDomain::SWEEP_GREATER_THAN_ISOVALUE); + grid->transform().preScale(1./params.voxel_scale()); + grid->insertMeta("voxel_scale", openvdb::FloatMetadata(params.voxel_scale())); - grid->insertMeta("voxel_scale", openvdb::FloatMetadata(voxel_scale)); + VoxelGridPtr ret = make_voxelgrid(std::move(*grid)); - return grid; + return ret; } -indexed_triangle_set grid_to_mesh(const openvdb::FloatGrid &grid, - double isovalue, - double adaptivity, - bool relaxDisorientedTriangles) +indexed_triangle_set grid_to_mesh(const VoxelGrid &vgrid, + double isovalue, + double adaptivity, + bool relaxDisorientedTriangles) { openvdb::initialize(); @@ -107,51 +157,152 @@ indexed_triangle_set grid_to_mesh(const openvdb::FloatGrid &grid, std::vector triangles; std::vector quads; + auto &grid = vgrid.grid; + openvdb::tools::volumeToMesh(grid, points, triangles, quads, isovalue, adaptivity, relaxDisorientedTriangles); - float scale = 1.; - try { - scale = grid.template metaValue("voxel_scale"); - } catch (...) { } - indexed_triangle_set ret; ret.vertices.reserve(points.size()); ret.indices.reserve(triangles.size() + quads.size() * 2); - for (auto &v : points) ret.vertices.emplace_back(to_vec3f(v) / scale); + for (auto &v : points) ret.vertices.emplace_back(to_vec3f(v) /*/ scale*/); for (auto &v : triangles) ret.indices.emplace_back(to_vec3i(v)); for (auto &quad : quads) { - ret.indices.emplace_back(quad(0), quad(1), quad(2)); - ret.indices.emplace_back(quad(2), quad(3), quad(0)); + ret.indices.emplace_back(quad(2), quad(1), quad(0)); + ret.indices.emplace_back(quad(3), quad(2), quad(0)); } return ret; } -openvdb::FloatGrid::Ptr redistance_grid(const openvdb::FloatGrid &grid, - double iso, - double er, - double ir) +VoxelGridPtr dilate_grid(const VoxelGrid &vgrid, + float exteriorBandWidth, + float interiorBandWidth) +{ + constexpr int DilateIterations = 1; + + openvdb::FloatGrid::Ptr new_grid; + + float scale = get_voxel_scale(vgrid); + + if (interiorBandWidth > 0.f) + new_grid = openvdb::tools::dilateSdf( + vgrid.grid, scale * interiorBandWidth, openvdb::tools::NN_FACE_EDGE, + DilateIterations, + openvdb::tools::FastSweepingDomain::SWEEP_LESS_THAN_ISOVALUE); + + auto &arg = new_grid? *new_grid : vgrid.grid; + + if (exteriorBandWidth > 0.f) + new_grid = openvdb::tools::dilateSdf( + arg, scale * exteriorBandWidth, openvdb::tools::NN_FACE_EDGE, + DilateIterations, + openvdb::tools::FastSweepingDomain::SWEEP_GREATER_THAN_ISOVALUE); + + VoxelGridPtr ret; + + if (new_grid) + ret = make_voxelgrid(std::move(*new_grid)); + else + ret = make_voxelgrid(vgrid.grid); + + // Copies voxel_scale metadata, if it exists. + ret->grid.insertMeta(*vgrid.grid.deepCopyMeta()); + + return ret; +} + +VoxelGridPtr redistance_grid(const VoxelGrid &vgrid, + float iso, + float er, + float ir) +{ + auto new_grid = openvdb::tools::levelSetRebuild(vgrid.grid, iso, er, ir); + + auto ret = make_voxelgrid(std::move(*new_grid)); + + // Copies voxel_scale metadata, if it exists. + ret->grid.insertMeta(*vgrid.grid.deepCopyMeta()); + + return ret; +} + +VoxelGridPtr redistance_grid(const VoxelGrid &vgrid, float iso) { - auto new_grid = openvdb::tools::levelSetRebuild(grid, float(iso), - float(er), float(ir)); + auto new_grid = openvdb::tools::levelSetRebuild(vgrid.grid, iso); + + auto ret = make_voxelgrid(std::move(*new_grid)); // Copies voxel_scale metadata, if it exists. - new_grid->insertMeta(*grid.deepCopyMeta()); + ret->grid.insertMeta(*vgrid.grid.deepCopyMeta()); + + return ret; +} + +void grid_union(VoxelGrid &grid, VoxelGrid &arg) +{ + openvdb::tools::csgUnion(grid.grid, arg.grid); +} + +void grid_difference(VoxelGrid &grid, VoxelGrid &arg) +{ + openvdb::tools::csgDifference(grid.grid, arg.grid); +} - return new_grid; +void grid_intersection(VoxelGrid &grid, VoxelGrid &arg) +{ + openvdb::tools::csgIntersection(grid.grid, arg.grid); +} + +void reset_accessor(const VoxelGrid &vgrid) +{ + vgrid.accessor = vgrid.grid.getConstAccessor(); +} + +double get_distance_raw(const Vec3f &p, const VoxelGrid &vgrid) +{ + if (!vgrid.accessor) + reset_accessor(vgrid); + + auto v = (p).cast(); + auto grididx = vgrid.grid.transform().worldToIndexCellCentered( + {v.x(), v.y(), v.z()}); + + return vgrid.accessor->getValue(grididx) ; +} + +float get_voxel_scale(const VoxelGrid &vgrid) +{ + float scale = 1.; + try { + scale = vgrid.grid.template metaValue("voxel_scale"); + } catch (...) { } + + return scale; } -openvdb::FloatGrid::Ptr redistance_grid(const openvdb::FloatGrid &grid, - double iso) +VoxelGridPtr clone(const VoxelGrid &grid) { - auto new_grid = openvdb::tools::levelSetRebuild(grid, float(iso)); + return make_voxelgrid(grid); +} - // Copies voxel_scale metadata, if it exists. - new_grid->insertMeta(*grid.deepCopyMeta()); +void rescale_grid(VoxelGrid &grid, float scale) +{/* + float old_scale = get_voxel_scale(grid); - return new_grid; + float nscale = scale / old_scale;*/ +// auto tr = openvdb::math::Transform::createLinearTransform(scale); + grid.grid.transform().preScale(scale); + +// grid.grid.insertMeta("voxel_scale", openvdb::FloatMetadata(nscale)); + +// grid.grid.setTransform(tr); +} + +bool is_grid_empty(const VoxelGrid &grid) +{ + return grid.grid.empty(); } } // namespace Slic3r diff --git a/src/libslic3r/OpenVDBUtils.hpp b/src/libslic3r/OpenVDBUtils.hpp index 254ae358335..d4996854c2d 100644 --- a/src/libslic3r/OpenVDBUtils.hpp +++ b/src/libslic3r/OpenVDBUtils.hpp @@ -3,21 +3,47 @@ #include -#ifdef _MSC_VER -// Suppress warning C4146 in include/gmp.h(2177,31): unary minus operator applied to unsigned type, result still unsigned -#pragma warning(push) -#pragma warning(disable : 4146) -#endif // _MSC_VER -#include -#ifdef _MSC_VER -#pragma warning(pop) -#endif // _MSC_VER - namespace Slic3r { -inline Vec3f to_vec3f(const openvdb::Vec3s &v) { return Vec3f{v.x(), v.y(), v.z()}; } -inline Vec3d to_vec3d(const openvdb::Vec3s &v) { return to_vec3f(v).cast(); } -inline Vec3i to_vec3i(const openvdb::Vec3I &v) { return Vec3i{int(v[0]), int(v[1]), int(v[2])}; } +struct VoxelGrid; +struct VoxelGridDeleter { void operator()(VoxelGrid *ptr); }; +using VoxelGridPtr = std::unique_ptr; + +// This is like std::make_unique for a voxelgrid +template VoxelGridPtr make_voxelgrid(Args &&...args); + +// Default constructed voxelgrid can be obtained this way. +extern template VoxelGridPtr make_voxelgrid<>(); + +void reset_accessor(const VoxelGrid &vgrid); + +double get_distance_raw(const Vec3f &p, const VoxelGrid &interior); + +float get_voxel_scale(const VoxelGrid &grid); + +VoxelGridPtr clone(const VoxelGrid &grid); + +class MeshToGridParams { + Transform3f m_tr = Transform3f::Identity(); + float m_voxel_scale = 1.f; + float m_exteriorBandWidth = 3.0f; + float m_interiorBandWidth = 3.0f; + + std::function m_statusfn; + +public: + MeshToGridParams & trafo(const Transform3f &v) { m_tr = v; return *this; } + MeshToGridParams & voxel_scale(float v) { m_voxel_scale = v; return *this; } + MeshToGridParams & exterior_bandwidth(float v) { m_exteriorBandWidth = v; return *this; } + MeshToGridParams & interior_bandwidth(float v) { m_interiorBandWidth = v; return *this; } + MeshToGridParams & statusfn(std::function fn) { m_statusfn = fn; return *this; } + + const Transform3f& trafo() const noexcept { return m_tr; } + float voxel_scale() const noexcept { return m_voxel_scale; } + float exterior_bandwidth() const noexcept { return m_exteriorBandWidth; } + float interior_bandwidth() const noexcept { return m_interiorBandWidth; } + const std::function& statusfn() const noexcept { return m_statusfn; } +}; // Here voxel_scale defines the scaling of voxels which affects the voxel count. // 1.0 value means a voxel for every unit cube. 2 means the model is scaled to @@ -26,24 +52,32 @@ inline Vec3i to_vec3i(const openvdb::Vec3I &v) { return Vec3i{int(v[0]), int(v[1 // achievable through the Transform parameter. (TODO: or is it?) // The resulting grid will contain the voxel_scale in its metadata under the // "voxel_scale" key to be used in grid_to_mesh function. -openvdb::FloatGrid::Ptr mesh_to_grid(const indexed_triangle_set & mesh, - const openvdb::math::Transform &tr = {}, - float voxel_scale = 1.f, - float exteriorBandWidth = 3.0f, - float interiorBandWidth = 3.0f); - -indexed_triangle_set grid_to_mesh(const openvdb::FloatGrid &grid, - double isovalue = 0.0, - double adaptivity = 0.0, +VoxelGridPtr mesh_to_grid(const indexed_triangle_set &mesh, + const MeshToGridParams ¶ms = {}); + +indexed_triangle_set grid_to_mesh(const VoxelGrid &grid, + double isovalue = 0.0, + double adaptivity = 0.0, bool relaxDisorientedTriangles = true); -openvdb::FloatGrid::Ptr redistance_grid(const openvdb::FloatGrid &grid, - double iso); +VoxelGridPtr dilate_grid(const VoxelGrid &grid, + float exteriorBandWidth = 3.0f, + float interiorBandWidth = 3.0f); + +VoxelGridPtr redistance_grid(const VoxelGrid &grid, float iso); + +VoxelGridPtr redistance_grid(const VoxelGrid &grid, + float iso, + float ext_range, + float int_range); + +void rescale_grid(VoxelGrid &grid, float scale); + +void grid_union(VoxelGrid &grid, VoxelGrid &arg); +void grid_difference(VoxelGrid &grid, VoxelGrid &arg); +void grid_intersection(VoxelGrid &grid, VoxelGrid &arg); -openvdb::FloatGrid::Ptr redistance_grid(const openvdb::FloatGrid &grid, - double iso, - double ext_range, - double int_range); +bool is_grid_empty(const VoxelGrid &grid); } // namespace Slic3r diff --git a/src/libslic3r/OpenVDBUtilsLegacy.hpp b/src/libslic3r/OpenVDBUtilsLegacy.hpp new file mode 100644 index 00000000000..f292af1c893 --- /dev/null +++ b/src/libslic3r/OpenVDBUtilsLegacy.hpp @@ -0,0 +1,100 @@ +#ifndef OPENVDBUTILSLEGACY_HPP +#define OPENVDBUTILSLEGACY_HPP + +#include "libslic3r/TriangleMesh.hpp" + +#ifdef _MSC_VER +// Suppress warning C4146 in OpenVDB: unary minus operator applied to unsigned type, result still unsigned +#pragma warning(push) +#pragma warning(disable : 4146) +#endif // _MSC_VER +#include +#include +#include +#include +#include +#ifdef _MSC_VER +#pragma warning(pop) +#endif // _MSC_VER + +namespace Slic3r { + +openvdb::FloatGrid::Ptr mesh_to_grid(const indexed_triangle_set & mesh, + const openvdb::math::Transform &tr, + float voxel_scale, + float exteriorBandWidth, + float interiorBandWidth) +{ + class TriangleMeshDataAdapter { + public: + const indexed_triangle_set &its; + float voxel_scale; + + size_t polygonCount() const { return its.indices.size(); } + size_t pointCount() const { return its.vertices.size(); } + size_t vertexCount(size_t) const { return 3; } + + // Return position pos in local grid index space for polygon n and vertex v + // The actual mesh will appear to openvdb as scaled uniformly by voxel_size + // And the voxel count per unit volume can be affected this way. + void getIndexSpacePoint(size_t n, size_t v, openvdb::Vec3d& pos) const + { + auto vidx = size_t(its.indices[n](Eigen::Index(v))); + Slic3r::Vec3d p = its.vertices[vidx].cast() * voxel_scale; + pos = {p.x(), p.y(), p.z()}; + } + + TriangleMeshDataAdapter(const indexed_triangle_set &m, float voxel_sc = 1.f) + : its{m}, voxel_scale{voxel_sc} {}; + }; + + // Might not be needed but this is now proven to be working + openvdb::initialize(); + + std::vector meshparts = its_split(mesh); + + auto it = std::remove_if(meshparts.begin(), meshparts.end(), + [](auto &m) { return its_volume(m) < EPSILON; }); + + meshparts.erase(it, meshparts.end()); + + openvdb::FloatGrid::Ptr grid; + for (auto &m : meshparts) { + auto subgrid = openvdb::tools::meshToVolume( + TriangleMeshDataAdapter{m, voxel_scale}, tr, 1.f, 1.f); + + if (grid && subgrid) openvdb::tools::csgUnion(*grid, *subgrid); + else if (subgrid) grid = std::move(subgrid); + } + + if (meshparts.size() > 1) { + // This is needed to avoid various artefacts on multipart meshes. + // TODO: replace with something faster + grid = openvdb::tools::levelSetRebuild(*grid, 0., 1.f, 1.f); + } + if(meshparts.empty()) { + // Splitting failed, fall back to hollow the original mesh + grid = openvdb::tools::meshToVolume( + TriangleMeshDataAdapter{mesh}, tr, 1.f, 1.f); + } + + constexpr int DilateIterations = 1; + + grid = openvdb::tools::dilateSdf( + *grid, interiorBandWidth, openvdb::tools::NN_FACE_EDGE, + DilateIterations, + openvdb::tools::FastSweepingDomain::SWEEP_LESS_THAN_ISOVALUE); + + grid = openvdb::tools::dilateSdf( + *grid, exteriorBandWidth, openvdb::tools::NN_FACE_EDGE, + DilateIterations, + openvdb::tools::FastSweepingDomain::SWEEP_GREATER_THAN_ISOVALUE); + + grid->insertMeta("voxel_scale", openvdb::FloatMetadata(voxel_scale)); + + return grid; +} + +} // namespace Slic3r + +#endif // OPENVDBUTILSLEGACY_HPP diff --git a/src/libslic3r/Optimize/BruteforceOptimizer.hpp b/src/libslic3r/Optimize/BruteforceOptimizer.hpp index 2daef538e72..2f6b422245d 100644 --- a/src/libslic3r/Optimize/BruteforceOptimizer.hpp +++ b/src/libslic3r/Optimize/BruteforceOptimizer.hpp @@ -13,7 +13,9 @@ template long num_iter(const std::array &idx, size_t gridsz) { long ret = 0; - for (size_t i = 0; i < N; ++i) ret += idx[i] * std::pow(gridsz, i); + for (size_t i = 0; i < N; ++i) + ret += idx[i] * std::pow(gridsz, i); + return ret; } diff --git a/src/libslic3r/Optimize/NLoptOptimizer.hpp b/src/libslic3r/Optimize/NLoptOptimizer.hpp index f5d3140463f..9e423ff9199 100644 --- a/src/libslic3r/Optimize/NLoptOptimizer.hpp +++ b/src/libslic3r/Optimize/NLoptOptimizer.hpp @@ -13,7 +13,7 @@ #include -#include +#include "Optimizer.hpp" namespace Slic3r { namespace opt { @@ -40,69 +40,163 @@ struct IsNLoptAlg> { static const constexpr bool value = true; }; +// NLopt can wrap any of its algorithms to use the augmented lagrangian method +// for deriving an object function from all equality and inequality constraints +// This way one can use algorithms that do not support these constraints natively +template struct NLoptAUGLAG {}; + +template +struct IsNLoptAlg>> { + static const constexpr bool value = true; +}; + +template struct IsNLoptAlg>> { + static const constexpr bool value = true; +}; + template using NLoptOnly = std::enable_if_t::value, T>; +template struct GetNLoptAlg_ { + static constexpr nlopt_algorithm Local = NLOPT_NUM_ALGORITHMS; + static constexpr nlopt_algorithm Global = NLOPT_NUM_ALGORITHMS; + static constexpr bool IsAUGLAG = false; +}; + +template struct GetNLoptAlg_> { + static constexpr nlopt_algorithm Local = NLOPT_NUM_ALGORITHMS; + static constexpr nlopt_algorithm Global = a; + static constexpr bool IsAUGLAG = false; +}; + +template +struct GetNLoptAlg_> { + static constexpr nlopt_algorithm Local = l; + static constexpr nlopt_algorithm Global = g; + static constexpr bool IsAUGLAG = false; +}; + +template constexpr nlopt_algorithm GetNLoptAlg_Global = GetNLoptAlg_>::Global; +template constexpr nlopt_algorithm GetNLoptAlg_Local = GetNLoptAlg_>::Local; +template constexpr bool IsAUGLAG = GetNLoptAlg_>::IsAUGLAG; + +template struct GetNLoptAlg_> { + static constexpr nlopt_algorithm Local = GetNLoptAlg_Local; + static constexpr nlopt_algorithm Global = GetNLoptAlg_Global; + static constexpr bool IsAUGLAG = true; +}; enum class OptDir { MIN, MAX }; // Where to optimize -struct NLopt { // Helper RAII class for nlopt_opt +struct NLoptRAII { // Helper RAII class for nlopt_opt nlopt_opt ptr = nullptr; - template explicit NLopt(A&&...a) + template explicit NLoptRAII(A&&...a) { ptr = nlopt_create(std::forward
    (a)...); } - NLopt(const NLopt&) = delete; - NLopt(NLopt&&) = delete; - NLopt& operator=(const NLopt&) = delete; - NLopt& operator=(NLopt&&) = delete; + NLoptRAII(const NLoptRAII&) = delete; + NLoptRAII(NLoptRAII&&) = delete; + NLoptRAII& operator=(const NLoptRAII&) = delete; + NLoptRAII& operator=(NLoptRAII&&) = delete; - ~NLopt() { nlopt_destroy(ptr); } + ~NLoptRAII() { nlopt_destroy(ptr); } }; -template class NLoptOpt {}; +// Map a generic function to each argument following the mapping function +template +Fn for_each_argument(Fn &&fn, Args&&...args) +{ + // see https://www.fluentcpp.com/2019/03/05/for_each_arg-applying-a-function-to-each-argument-of-a-function-in-cpp/ + (fn(std::forward(args)),...); -// Optimizers based on NLopt. -template class NLoptOpt> { -protected: + return fn; +} + +// Call fn on each element of the input tuple tup. +template +Fn for_each_in_tuple(Fn fn, Tup &&tup) +{ + auto mpfn = [&fn](auto&...pack) { + for_each_argument(fn, pack...); + }; + + std::apply(mpfn, tup); + + return fn; +} + +// Wrap each element of the tuple tup into a wrapper class W and return +// a new tuple with each element being of type W where T_i is the type of +// i-th element of tup. +template class W, class...Args> +auto wrap_tup(const std::tuple &tup) +{ + return std::tuple...>(tup); +} + +template> +class NLoptOpt { StopCriteria m_stopcr; - OptDir m_dir; + StopCriteria m_loc_stopcr; + OptDir m_dir = OptDir::MIN; - template using TOptData = - std::tuple*, NLoptOpt*, nlopt_opt>; + static constexpr double ConstraintEps = 1e-6; + + template struct OptData { + Fn fn; + NLoptOpt *self = nullptr; + nlopt_opt opt_raw = nullptr; + + OptData(const Fn &f): fn{f} {} + + OptData(const Fn &f, NLoptOpt *s, nlopt_opt nlopt_raw) + : fn{f}, self{s}, opt_raw{nlopt_raw} {} + }; template static double optfunc(unsigned n, const double *params, - double *gradient, - void *data) + double *gradient, void *data) { - assert(n >= N); + assert(n == N); - auto tdata = static_cast*>(data); + auto tdata = static_cast*>(data); - if (std::get<1>(*tdata)->m_stopcr.stop_condition()) - nlopt_force_stop(std::get<2>(*tdata)); + if (tdata->self->m_stopcr.stop_condition()) + nlopt_force_stop(tdata->opt_raw); - auto fnptr = std::get<0>(*tdata); auto funval = to_arr(params); double scoreval = 0.; - using RetT = decltype((*fnptr)(funval)); + using RetT = decltype(tdata->fn(funval)); if constexpr (std::is_convertible_v>) { - ScoreGradient score = (*fnptr)(funval); + ScoreGradient score = tdata->fn(funval); for (size_t i = 0; i < n; ++i) gradient[i] = (*score.gradient)[i]; scoreval = score.score; } else { - scoreval = (*fnptr)(funval); + scoreval = tdata->fn(funval); } return scoreval; } + template + static double constrain_func(unsigned n, const double *params, + double *gradient, void *data) + { + assert(n == N); + + auto tdata = static_cast*>(data); + auto funval = to_arr(params); + + return tdata->fn(funval); + } + template - void set_up(NLopt &nl, const Bounds& bounds) + static void set_up(NLoptRAII &nl, + const Bounds &bounds, + const StopCriteria &stopcr) { std::array lb, ub; @@ -114,23 +208,45 @@ template class NLoptOpt> { nlopt_set_lower_bounds(nl.ptr, lb.data()); nlopt_set_upper_bounds(nl.ptr, ub.data()); - double abs_diff = m_stopcr.abs_score_diff(); - double rel_diff = m_stopcr.rel_score_diff(); - double stopval = m_stopcr.stop_score(); + double abs_diff = stopcr.abs_score_diff(); + double rel_diff = stopcr.rel_score_diff(); + double stopval = stopcr.stop_score(); if(!std::isnan(abs_diff)) nlopt_set_ftol_abs(nl.ptr, abs_diff); if(!std::isnan(rel_diff)) nlopt_set_ftol_rel(nl.ptr, rel_diff); if(!std::isnan(stopval)) nlopt_set_stopval(nl.ptr, stopval); - if(m_stopcr.max_iterations() > 0) - nlopt_set_maxeval(nl.ptr, m_stopcr.max_iterations()); + if(stopcr.max_iterations() > 0) + nlopt_set_maxeval(nl.ptr, stopcr.max_iterations()); } - template - Result optimize(NLopt &nl, Fn &&fn, const Input &initvals) + template + Result optimize(NLoptRAII &nl, Fn &&fn, const Input &initvals, + const std::tuple &equalities, + const std::tuple &inequalities) { Result r; - TOptData data = std::make_tuple(&fn, this, nl.ptr); + OptData data {fn, this, nl.ptr}; + + auto do_for_each_eq = [this, &nl](auto &arg) { + arg.self = this; + arg.opt_raw = nl.ptr; + using F = decltype(arg.fn); + nlopt_add_equality_constraint (nl.ptr, constrain_func, &arg, ConstraintEps); + }; + + auto do_for_each_ineq = [this, &nl](auto &arg) { + arg.self = this; + arg.opt_raw = nl.ptr; + using F = decltype(arg.fn); + nlopt_add_inequality_constraint (nl.ptr, constrain_func, &arg, ConstraintEps); + }; + + auto eq_data = wrap_tup(equalities); + for_each_in_tuple(do_for_each_eq, eq_data); + + auto ineq_data = wrap_tup(inequalities); + for_each_in_tuple(do_for_each_ineq, ineq_data); switch(m_dir) { case OptDir::MIN: @@ -147,51 +263,81 @@ template class NLoptOpt> { public: - template - Result optimize(Func&& func, + template + Result optimize(Fn&& f, const Input &initvals, - const Bounds& bounds) + const Bounds& bounds, + const std::tuple &equalities, + const std::tuple &inequalities) { - NLopt nl{alg, N}; - set_up(nl, bounds); + if constexpr (IsAUGLAG) { + NLoptRAII nl_wrap{NLOPT_AUGLAG, N}; + set_up(nl_wrap, bounds, get_criteria()); + + NLoptRAII nl_glob{GetNLoptAlg_Global, N}; + set_up(nl_glob, bounds, get_criteria()); + nlopt_set_local_optimizer(nl_wrap.ptr, nl_glob.ptr); + + if constexpr (GetNLoptAlg_Local < NLOPT_NUM_ALGORITHMS) { + NLoptRAII nl_loc{GetNLoptAlg_Local, N}; + set_up(nl_loc, bounds, m_loc_stopcr); + nlopt_set_local_optimizer(nl_glob.ptr, nl_loc.ptr); + + return optimize(nl_wrap, std::forward(f), initvals, + equalities, inequalities); + } else { + return optimize(nl_wrap, std::forward(f), initvals, + equalities, inequalities); + } + } else { + NLoptRAII nl_glob{GetNLoptAlg_Global, N}; + set_up(nl_glob, bounds, get_criteria()); + + if constexpr (GetNLoptAlg_Local < NLOPT_NUM_ALGORITHMS) { + NLoptRAII nl_loc{GetNLoptAlg_Local, N}; + set_up(nl_loc, bounds, m_loc_stopcr); + nlopt_set_local_optimizer(nl_glob.ptr, nl_loc.ptr); + + return optimize(nl_glob, std::forward(f), initvals, + equalities, inequalities); + } else { + return optimize(nl_glob, std::forward(f), initvals, + equalities, inequalities); + } + } - return optimize(nl, std::forward(func), initvals); + assert(false); + + return {}; } - explicit NLoptOpt(StopCriteria stopcr = {}) : m_stopcr(stopcr) {} + explicit NLoptOpt(const StopCriteria &stopcr_glob = {}) + : m_stopcr(stopcr_glob) + {} void set_criteria(const StopCriteria &cr) { m_stopcr = cr; } const StopCriteria &get_criteria() const noexcept { return m_stopcr; } - void set_dir(OptDir dir) noexcept { m_dir = dir; } + void set_loc_criteria(const StopCriteria &cr) { m_loc_stopcr = cr; } + const StopCriteria &get_loc_criteria() const noexcept { return m_loc_stopcr; } + + void set_dir(OptDir dir) noexcept { m_dir = dir; } void seed(long s) { nlopt_srand(s); } }; -template -class NLoptOpt>: public NLoptOpt> -{ - using Base = NLoptOpt>; -public: - - template - Result optimize(Fn&& f, - const Input &initvals, - const Bounds& bounds) - { - NLopt nl_glob{glob, N}, nl_loc{loc, N}; - - Base::set_up(nl_glob, bounds); - Base::set_up(nl_loc, bounds); - nlopt_set_local_optimizer(nl_glob.ptr, nl_loc.ptr); - - return Base::optimize(nl_glob, std::forward(f), initvals); - } - - explicit NLoptOpt(StopCriteria stopcr = {}) : Base{stopcr} {} +template struct AlgFeatures_ { + static constexpr bool SupportsInequalities = false; + static constexpr bool SupportsEqualities = false; }; } // namespace detail; +template constexpr bool SupportsEqualities = + detail::AlgFeatures_>::SupportsEqualities; + +template constexpr bool SupportsInequalities = + detail::AlgFeatures_>::SupportsInequalities; + // Optimizers based on NLopt. template class Optimizer> { detail::NLoptOpt m_opt; @@ -201,12 +347,24 @@ template class Optimizer> { Optimizer& to_max() { m_opt.set_dir(detail::OptDir::MAX); return *this; } Optimizer& to_min() { m_opt.set_dir(detail::OptDir::MIN); return *this; } - template + template Result optimize(Func&& func, const Input &initvals, - const Bounds& bounds) + const Bounds& bounds, + const std::tuple &eq_constraints = {}, + const std::tuple &ineq_constraint = {}) { - return m_opt.optimize(std::forward(func), initvals, bounds); + static_assert(std::tuple_size_v> == 0 + || SupportsEqualities, + "Equality constraints are not supported."); + + static_assert(std::tuple_size_v> == 0 + || SupportsInequalities, + "Inequality constraints are not supported."); + + return m_opt.optimize(std::forward(func), initvals, bounds, + eq_constraints, + ineq_constraint); } explicit Optimizer(StopCriteria stopcr = {}) : m_opt(stopcr) {} @@ -219,14 +377,56 @@ template class Optimizer> { const StopCriteria &get_criteria() const { return m_opt.get_criteria(); } void seed(long s) { m_opt.seed(s); } + + void set_loc_criteria(const StopCriteria &cr) { m_opt.set_loc_criteria(cr); } + const StopCriteria &get_loc_criteria() const noexcept { return m_opt.get_loc_criteria(); } }; // Predefinded NLopt algorithms -using AlgNLoptGenetic = detail::NLoptAlgComb; -using AlgNLoptSubplex = detail::NLoptAlg; -using AlgNLoptSimplex = detail::NLoptAlg; -using AlgNLoptDIRECT = detail::NLoptAlg; -using AlgNLoptMLSL = detail::NLoptAlg; +using AlgNLoptGenetic = detail::NLoptAlgComb; +using AlgNLoptSubplex = detail::NLoptAlg; +using AlgNLoptSimplex = detail::NLoptAlg; +using AlgNLoptCobyla = detail::NLoptAlg; +using AlgNLoptDIRECT = detail::NLoptAlg; +using AlgNLoptORIG_DIRECT = detail::NLoptAlg; +using AlgNLoptISRES = detail::NLoptAlg; +using AlgNLoptAGS = detail::NLoptAlg; + +using AlgNLoptMLSL_Subplx = detail::NLoptAlgComb; +using AlgNLoptMLSL_Cobyla = detail::NLoptAlgComb; +using AlgNLoptGenetic_Subplx = detail::NLoptAlgComb; + +// To craft auglag algorithms (constraint support through object function transformation) +using detail::NLoptAUGLAG; + +namespace detail { + +template<> struct AlgFeatures_ { + static constexpr bool SupportsInequalities = true; + static constexpr bool SupportsEqualities = true; +}; + +template<> struct AlgFeatures_ { + static constexpr bool SupportsInequalities = true; + static constexpr bool SupportsEqualities = false; +}; + +template<> struct AlgFeatures_ { + static constexpr bool SupportsInequalities = true; + static constexpr bool SupportsEqualities = false; +}; + +template<> struct AlgFeatures_ { + static constexpr bool SupportsInequalities = true; + static constexpr bool SupportsEqualities = true; +}; + +template struct AlgFeatures_> { + static constexpr bool SupportsInequalities = true; + static constexpr bool SupportsEqualities = true; +}; + +} // namespace detail }} // namespace Slic3r::opt diff --git a/src/libslic3r/Optimize/Optimizer.hpp b/src/libslic3r/Optimize/Optimizer.hpp index 8ae55c61c58..6212a5f59d9 100644 --- a/src/libslic3r/Optimize/Optimizer.hpp +++ b/src/libslic3r/Optimize/Optimizer.hpp @@ -12,6 +12,15 @@ namespace Slic3r { namespace opt { +template +using FloatingOnly = std::enable_if_t::value, O>; + +template> +constexpr T NaN = std::numeric_limits::quiet_NaN(); + +constexpr float NaNf = NaN; +constexpr double NaNd = NaN; + // A type to hold the complete result of the optimization. template struct Result { int resultcode; // Method dependent @@ -41,13 +50,13 @@ template using Bounds = std::array; class StopCriteria { // If the absolute value difference between two scores. - double m_abs_score_diff = std::nan(""); + double m_abs_score_diff = NaNd; // If the relative value difference between two scores. - double m_rel_score_diff = std::nan(""); + double m_rel_score_diff = NaNd; // Stop if this value or better is found. - double m_stop_score = std::nan(""); + double m_stop_score = NaNd; // A predicate that if evaluates to true, the optimization should terminate // and the best result found prior to termination should be returned. @@ -79,7 +88,7 @@ class StopCriteria { double stop_score() const { return m_stop_score; } - StopCriteria & max_iterations(double val) + StopCriteria & max_iterations(unsigned val) { m_max_iterations = val; return *this; } @@ -137,16 +146,25 @@ template class Optimizer { // For each dimension an interval (Bound) has to be given marking the bounds // for that dimension. // + // Optionally, some constraints can be given in the form of double(Input) + // functors. The parameters eq_constraints and ineq_constraints can be used + // to add equality and inequality (<= 0) constraints to the optimization. + // Note that it is up the the particular method if it accepts these + // constraints. + // // initvals have to be within the specified bounds, otherwise its undefined // behavior. // // Func can return a score of type double or optionally a ScoreGradient // class to indicate the function gradient for a optimization methods that // make use of the gradient. - template + template Result optimize(Func&& /*func*/, const Input &/*initvals*/, - const Bounds& /*bounds*/) { return {}; } + const Bounds& /*bounds*/, + const std::tuple &eq_constraints = {}, + const std::tuple &ineq_constraint = {} + ) { return {}; } // optional for randomized methods: void seed(long /*s*/) {} diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index 6456457db17..89add597830 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -1,27 +1,61 @@ #include "PerimeterGenerator.hpp" +#include "AABBTreeIndirect.hpp" +#include "AABBTreeLines.hpp" +#include "BoundingBox.hpp" +#include "BridgeDetector.hpp" #include "ClipperUtils.hpp" +#include "ExPolygon.hpp" +#include "ExtrusionEntity.hpp" #include "ExtrusionEntityCollection.hpp" +#include "Geometry/MedialAxis.hpp" +#include "KDTreeIndirect.hpp" +#include "MultiPoint.hpp" +#include "Point.hpp" +#include "Polygon.hpp" +#include "Polyline.hpp" +#include "PrintConfig.hpp" #include "ShortestPath.hpp" +#include "Surface.hpp" + +#include "Geometry/ConvexHull.hpp" +#include "SurfaceCollection.hpp" #include "clipper/clipper_z.hpp" #include "Arachne/WallToolPaths.hpp" #include "Arachne/utils/ExtrusionLine.hpp" +#include "Arachne/utils/ExtrusionJunction.hpp" +#include "libslic3r.h" +#include #include #include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include #include +#include +#include +#include -//#define ARACHNE_DEBUG +// #define ARACHNE_DEBUG #ifdef ARACHNE_DEBUG #include "SVG.hpp" #include "Utils.hpp" #endif +#include "SVG.hpp" + namespace Slic3r { -ExtrusionMultiPath thick_polyline_to_multi_path(const ThickPolyline &thick_polyline, ExtrusionRole role, const Flow &flow, const float tolerance, const float merge_tolerance) +ExtrusionMultiPath PerimeterGenerator::thick_polyline_to_multi_path(const ThickPolyline &thick_polyline, ExtrusionRole role, const Flow &flow, const float tolerance, const float merge_tolerance) { ExtrusionMultiPath multi_path; ExtrusionPath path(role); @@ -82,7 +116,7 @@ ExtrusionMultiPath thick_polyline_to_multi_path(const ThickPolyline &thick_polyl } const double w = fmax(line.a_width, line.b_width); - const Flow new_flow = (role == erOverhangPerimeter && flow.bridge()) ? flow : flow.with_width(unscale(w) + flow.height() * float(1. - 0.25 * PI)); + const Flow new_flow = (role.is_bridge() && flow.bridge()) ? flow : flow.with_width(unscale(w) + flow.height() * float(1. - 0.25 * PI)); if (path.polyline.points.empty()) { path.polyline.append(line.a); path.polyline.append(line.b); @@ -114,14 +148,14 @@ ExtrusionMultiPath thick_polyline_to_multi_path(const ThickPolyline &thick_polyl return multi_path; } -static void variable_width(const ThickPolylines &polylines, ExtrusionRole role, const Flow &flow, std::vector &out) +static void variable_width_classic(const ThickPolylines &polylines, ExtrusionRole role, const Flow &flow, std::vector &out) { // This value determines granularity of adaptive width, as G-code does not allow // variable extrusion within a single move; this value shall only affect the amount // of segments, and any pruning shall be performed before we apply this tolerance. const auto tolerance = float(scale_(0.05)); for (const ThickPolyline &p : polylines) { - ExtrusionMultiPath multi_path = thick_polyline_to_multi_path(p, role, flow, tolerance, tolerance); + ExtrusionMultiPath multi_path = PerimeterGenerator::thick_polyline_to_multi_path(p, role, flow, tolerance, tolerance); // Append paths to collection. if (!multi_path.paths.empty()) { for (auto it = std::next(multi_path.paths.begin()); it != multi_path.paths.end(); ++it) { @@ -157,7 +191,15 @@ class PerimeterGeneratorLoop { // External perimeter. It may be CCW or CW oriented (outer contour or hole contour). bool is_external() const { return this->depth == 0; } // An island, which may have holes, but it does not have another internal island. - bool is_internal_contour() const; + bool is_internal_contour() const { + // An internal contour is a contour containing no other contours + if (! this->is_contour) + return false; + for (const PerimeterGeneratorLoop &loop : this->children) + if (loop.is_contour) + return false; + return true; + } }; // Thanks Cura developers for this function. @@ -243,7 +285,7 @@ static void fuzzy_extrusion_line(Arachne::ExtrusionLine &ext_lines, double fuzzy using PerimeterGeneratorLoops = std::vector; -static ExtrusionEntityCollection traverse_loops(const PerimeterGenerator &perimeter_generator, const PerimeterGeneratorLoops &loops, ThickPolylines &thin_walls) +static ExtrusionEntityCollection traverse_loops_classic(const PerimeterGenerator::Parameters ¶ms, const Polygons &lower_slices_polygons_cache, const PerimeterGeneratorLoops &loops, ThickPolylines &thin_walls) { // loops is an arrayref of ::Loop objects // turn each one into an ExtrusionLoop object @@ -252,9 +294,9 @@ static ExtrusionEntityCollection traverse_loops(const PerimeterGenerator &perime for (const PerimeterGeneratorLoop &loop : loops) { bool is_external = loop.is_external(); - ExtrusionRole role; ExtrusionLoopRole loop_role; - role = is_external ? erExternalPerimeter : erPerimeter; + ExtrusionRole role_normal = is_external ? ExtrusionRole::ExternalPerimeter : ExtrusionRole::Perimeter; + ExtrusionRole role_overhang = role_normal | ExtrusionRoleModifier::Bridge; if (loop.is_internal_contour()) { // Note that we set loop role to ContourInternalPerimeter // also when loop is both internal and external (i.e. @@ -269,40 +311,43 @@ static ExtrusionEntityCollection traverse_loops(const PerimeterGenerator &perime const Polygon &polygon = loop.fuzzify ? fuzzified : loop.polygon; if (loop.fuzzify) { fuzzified = loop.polygon; - fuzzy_polygon(fuzzified, scaled(perimeter_generator.config->fuzzy_skin_thickness.value), scaled(perimeter_generator.config->fuzzy_skin_point_dist.value)); + fuzzy_polygon(fuzzified, scaled(params.config.fuzzy_skin_thickness.value), scaled(params.config.fuzzy_skin_point_dist.value)); } - if (perimeter_generator.config->overhangs && perimeter_generator.layer_id > perimeter_generator.object_config->raft_layers - && ! ((perimeter_generator.object_config->support_material || perimeter_generator.object_config->support_material_enforce_layers > 0) && - perimeter_generator.object_config->support_material_contact_distance.value == 0)) { + if (params.config.overhangs && params.layer_id > params.object_config.raft_layers + && ! ((params.object_config.support_material || params.object_config.support_material_enforce_layers > 0) && + params.object_config.support_material_contact_distance.value == 0)) { + BoundingBox bbox(polygon.points); + bbox.offset(SCALED_EPSILON); + Polygons lower_slices_polygons_clipped = ClipperUtils::clip_clipper_polygons_with_subject_bbox(lower_slices_polygons_cache, bbox); // get non-overhang paths by intersecting this loop with the grown lower slices extrusion_paths_append( paths, - intersection_pl({ polygon }, perimeter_generator.lower_slices_polygons()), - role, - is_external ? perimeter_generator.ext_mm3_per_mm() : perimeter_generator.mm3_per_mm(), - is_external ? perimeter_generator.ext_perimeter_flow.width() : perimeter_generator.perimeter_flow.width(), - (float)perimeter_generator.layer_height); + intersection_pl({ polygon }, lower_slices_polygons_clipped), + role_normal, + is_external ? params.ext_mm3_per_mm : params.mm3_per_mm, + is_external ? params.ext_perimeter_flow.width() : params.perimeter_flow.width(), + float(params.layer_height)); // get overhang paths by checking what parts of this loop fall // outside the grown lower slices (thus where the distance between // the loop centerline and original lower slices is >= half nozzle diameter extrusion_paths_append( paths, - diff_pl({ polygon }, perimeter_generator.lower_slices_polygons()), - erOverhangPerimeter, - perimeter_generator.mm3_per_mm_overhang(), - perimeter_generator.overhang_flow.width(), - perimeter_generator.overhang_flow.height()); + diff_pl({ polygon }, lower_slices_polygons_clipped), + role_overhang, + params.mm3_per_mm_overhang, + params.overhang_flow.width(), + params.overhang_flow.height()); // Reapply the nearest point search for starting point. // We allow polyline reversal because Clipper may have randomly reversed polylines during clipping. chain_and_reorder_extrusion_paths(paths, &paths.front().first_point()); } else { - ExtrusionPath path(role); + ExtrusionPath path(role_normal); path.polyline = polygon.split_at_first_point(); - path.mm3_per_mm = is_external ? perimeter_generator.ext_mm3_per_mm() : perimeter_generator.mm3_per_mm(); - path.width = is_external ? perimeter_generator.ext_perimeter_flow.width() : perimeter_generator.perimeter_flow.width(); - path.height = (float)perimeter_generator.layer_height; + path.mm3_per_mm = is_external ? params.ext_mm3_per_mm : params.mm3_per_mm; + path.width = is_external ? params.ext_perimeter_flow.width() : params.perimeter_flow.width(); + path.height = float(params.layer_height); paths.push_back(path); } @@ -311,7 +356,7 @@ static ExtrusionEntityCollection traverse_loops(const PerimeterGenerator &perime // Append thin walls to the nearest-neighbor search (only for first iteration) if (! thin_walls.empty()) { - variable_width(thin_walls, erExternalPerimeter, perimeter_generator.ext_perimeter_flow, coll.entities); + variable_width_classic(thin_walls, ExtrusionRole::ExternalPerimeter, params.ext_perimeter_flow, coll.entities); thin_walls.clear(); } @@ -331,7 +376,7 @@ static ExtrusionEntityCollection traverse_loops(const PerimeterGenerator &perime } else { const PerimeterGeneratorLoop &loop = loops[idx.first]; assert(thin_walls.empty()); - ExtrusionEntityCollection children = traverse_loops(perimeter_generator, loop.children, thin_walls); + ExtrusionEntityCollection children = traverse_loops_classic(params, lower_slices_polygons_cache, loop.children, thin_walls); out.entities.reserve(out.entities.size() + children.entities.size() + 1); ExtrusionLoop *eloop = static_cast(coll.entities[idx.first]); coll.entities[idx.first] = nullptr; @@ -354,31 +399,48 @@ static ClipperLib_Z::Paths clip_extrusion(const ClipperLib_Z::Path &subject, con ClipperLib_Z::Clipper clipper; clipper.ZFillFunction([](const ClipperLib_Z::IntPoint &e1bot, const ClipperLib_Z::IntPoint &e1top, const ClipperLib_Z::IntPoint &e2bot, const ClipperLib_Z::IntPoint &e2top, ClipperLib_Z::IntPoint &pt) { + // The clipping contour may be simplified by clipping it with a bounding box of "subject" path. + // The clipping function used may produce self intersections outside of the "subject" bounding box. Such self intersections are + // harmless to the result of the clipping operation, + // Both ends of each edge belong to the same source: Either they are from subject or from clipping path. + assert(e1bot.z() >= 0 && e1top.z() >= 0); + assert(e2bot.z() >= 0 && e2top.z() >= 0); + assert((e1bot.z() == 0) == (e1top.z() == 0)); + assert((e2bot.z() == 0) == (e2top.z() == 0)); + + // Start & end points of the clipped polyline (extrusion path with a non-zero width). ClipperLib_Z::IntPoint start = e1bot; ClipperLib_Z::IntPoint end = e1top; - if (start.z() <= 0 && end.z() <= 0) { start = e2bot; end = e2top; } - assert(start.z() > 0 && end.z() > 0); + if (start.z() <= 0 && end.z() <= 0) { + // Self intersection on the source contour. + assert(start.z() == 0 && end.z() == 0); + pt.z() = 0; + } else { + // Interpolate extrusion line width. + assert(start.z() > 0 && end.z() > 0); - // Interpolate extrusion line width. - double length_sqr = (end - start).cast().squaredNorm(); - double dist_sqr = (pt - start).cast().squaredNorm(); - double t = std::sqrt(dist_sqr / length_sqr); + double length_sqr = (end - start).cast().squaredNorm(); + double dist_sqr = (pt - start).cast().squaredNorm(); + double t = std::sqrt(dist_sqr / length_sqr); - pt.z() = start.z() + coord_t((end.z() - start.z()) * t); + pt.z() = start.z() + coord_t((end.z() - start.z()) * t); + } }); clipper.AddPath(subject, ClipperLib_Z::ptSubject, false); clipper.AddPaths(clip, ClipperLib_Z::ptClip, true); - ClipperLib_Z::PolyTree clipped_polytree; ClipperLib_Z::Paths clipped_paths; - clipper.Execute(clipType, clipped_polytree, ClipperLib_Z::pftNonZero, ClipperLib_Z::pftNonZero); - ClipperLib_Z::PolyTreeToPaths(clipped_polytree, clipped_paths); + { + ClipperLib_Z::PolyTree clipped_polytree; + clipper.Execute(clipType, clipped_polytree, ClipperLib_Z::pftNonZero, ClipperLib_Z::pftNonZero); + ClipperLib_Z::PolyTreeToPaths(std::move(clipped_polytree), clipped_paths); + } // Clipped path could contain vertices from the clip with a Z coordinate equal to zero. // For those vertices, we must assign value based on the subject. @@ -397,8 +459,8 @@ static ClipperLib_Z::Paths clip_extrusion(const ClipperLib_Z::Path &subject, con Point prev(subject.front().x(), subject.front().y()); for (auto it = std::next(subject.begin()); it != subject.end(); ++it) { Point curr(it->x(), it->y()); - Point projected_pt = pt.projection_onto(Line(prev, curr)); - if (double dist_sqr = (projected_pt - pt).cast().squaredNorm(); dist_sqr < dist_sqr_min) { + Point projected_pt; + if (double dist_sqr = line_alg::distance_to_squared(Line(prev, curr), pt, &projected_pt); dist_sqr < dist_sqr_min) { dist_sqr_min = dist_sqr; projected_pt_min = projected_pt; it_min = std::prev(it); @@ -436,7 +498,7 @@ struct PerimeterGeneratorArachneExtrusion bool fuzzify = false; }; -static ExtrusionEntityCollection traverse_extrusions(const PerimeterGenerator &perimeter_generator, std::vector &pg_extrusions) +static ExtrusionEntityCollection traverse_extrusions(const PerimeterGenerator::Parameters ¶ms, const Polygons &lower_slices_polygons_cache, std::vector &pg_extrusions) { ExtrusionEntityCollection extrusion_coll; for (PerimeterGeneratorArachneExtrusion &pg_extrusion : pg_extrusions) { @@ -445,41 +507,53 @@ static ExtrusionEntityCollection traverse_extrusions(const PerimeterGenerator &p continue; const bool is_external = extrusion->inset_idx == 0; - ExtrusionRole role = is_external ? erExternalPerimeter : erPerimeter; + ExtrusionRole role_normal = is_external ? ExtrusionRole::ExternalPerimeter : ExtrusionRole::Perimeter; + ExtrusionRole role_overhang = role_normal | ExtrusionRoleModifier::Bridge; if (pg_extrusion.fuzzify) - fuzzy_extrusion_line(*extrusion, scaled(perimeter_generator.config->fuzzy_skin_thickness.value), scaled(perimeter_generator.config->fuzzy_skin_point_dist.value)); + fuzzy_extrusion_line(*extrusion, scaled(params.config.fuzzy_skin_thickness.value), scaled(params.config.fuzzy_skin_point_dist.value)); ExtrusionPaths paths; // detect overhanging/bridging perimeters - if (perimeter_generator.config->overhangs && perimeter_generator.layer_id > perimeter_generator.object_config->raft_layers - && ! ((perimeter_generator.object_config->support_material || perimeter_generator.object_config->support_material_enforce_layers > 0) && - perimeter_generator.object_config->support_material_contact_distance.value == 0)) { + if (params.config.overhangs && params.layer_id > params.object_config.raft_layers + && ! ((params.object_config.support_material || params.object_config.support_material_enforce_layers > 0) && + params.object_config.support_material_contact_distance.value == 0)) { ClipperLib_Z::Path extrusion_path; extrusion_path.reserve(extrusion->size()); - for (const Arachne::ExtrusionJunction &ej : extrusion->junctions) + BoundingBox extrusion_path_bbox; + for (const Arachne::ExtrusionJunction &ej : extrusion->junctions) { extrusion_path.emplace_back(ej.p.x(), ej.p.y(), ej.w); + extrusion_path_bbox.merge(Point{ej.p.x(), ej.p.y()}); + } ClipperLib_Z::Paths lower_slices_paths; - lower_slices_paths.reserve(perimeter_generator.lower_slices_polygons().size()); - for (const Polygon &poly : perimeter_generator.lower_slices_polygons()) { - lower_slices_paths.emplace_back(); - ClipperLib_Z::Path &out = lower_slices_paths.back(); - out.reserve(poly.points.size()); - for (const Point &pt : poly.points) - out.emplace_back(pt.x(), pt.y(), 0); + lower_slices_paths.reserve(lower_slices_polygons_cache.size()); + { + Points clipped; + extrusion_path_bbox.offset(SCALED_EPSILON); + for (const Polygon &poly : lower_slices_polygons_cache) { + clipped.clear(); + ClipperUtils::clip_clipper_polygon_with_subject_bbox(poly.points, extrusion_path_bbox, clipped); + if (! clipped.empty()) { + lower_slices_paths.emplace_back(); + ClipperLib_Z::Path &out = lower_slices_paths.back(); + out.reserve(clipped.size()); + for (const Point &pt : clipped) + out.emplace_back(pt.x(), pt.y(), 0); + } + } } // get non-overhang paths by intersecting this loop with the grown lower slices - extrusion_paths_append(paths, clip_extrusion(extrusion_path, lower_slices_paths, ClipperLib_Z::ctIntersection), role, - is_external ? perimeter_generator.ext_perimeter_flow : perimeter_generator.perimeter_flow); + extrusion_paths_append(paths, clip_extrusion(extrusion_path, lower_slices_paths, ClipperLib_Z::ctIntersection), role_normal, + is_external ? params.ext_perimeter_flow : params.perimeter_flow); // get overhang paths by checking what parts of this loop fall // outside the grown lower slices (thus where the distance between // the loop centerline and original lower slices is >= half nozzle diameter - extrusion_paths_append(paths, clip_extrusion(extrusion_path, lower_slices_paths, ClipperLib_Z::ctDifference), erOverhangPerimeter, - perimeter_generator.overhang_flow); + extrusion_paths_append(paths, clip_extrusion(extrusion_path, lower_slices_paths, ClipperLib_Z::ctDifference), role_overhang, + params.overhang_flow); // Reapply the nearest point search for starting point. // We allow polyline reversal because Clipper may have randomly reversed polylines during clipping. @@ -499,7 +573,7 @@ static ExtrusionEntityCollection traverse_extrusions(const PerimeterGenerator &p for (const ExtrusionPath &path : paths) { ++point_occurrence[path.polyline.first_point()].occurrence; ++point_occurrence[path.polyline.last_point()].occurrence; - if (path.role() == erOverhangPerimeter) { + if (path.role().is_bridge()) { point_occurrence[path.polyline.first_point()].is_overhang = true; point_occurrence[path.polyline.last_point()].is_overhang = true; } @@ -519,7 +593,7 @@ static ExtrusionEntityCollection traverse_extrusions(const PerimeterGenerator &p chain_and_reorder_extrusion_paths(paths, &start_point); } } else { - extrusion_paths_append(paths, *extrusion, role, is_external ? perimeter_generator.ext_perimeter_flow : perimeter_generator.perimeter_flow); + extrusion_paths_append(paths, *extrusion, role_normal, is_external ? params.ext_perimeter_flow : params.perimeter_flow); } // Append paths to collection. @@ -588,248 +662,684 @@ static void export_perimeters_to_svg(const std::string &path, const Polygons &co } #endif +// find out if paths touch - at least one point of one path is within limit distance of second path +bool paths_touch(const ExtrusionPath &path_one, const ExtrusionPath &path_two, double limit_distance) +{ + AABBTreeLines::LinesDistancer lines_two{path_two.as_polyline().lines()}; + for (size_t pt_idx = 0; pt_idx < path_one.polyline.size(); pt_idx++) { + if (lines_two.distance_from_lines(path_one.polyline.points[pt_idx]) < limit_distance) { return true; } + } + AABBTreeLines::LinesDistancer lines_one{path_one.as_polyline().lines()}; + for (size_t pt_idx = 0; pt_idx < path_two.polyline.size(); pt_idx++) { + if (lines_one.distance_from_lines(path_two.polyline.points[pt_idx]) < limit_distance) { return true; } + } + return false; +} + +Polylines reconnect_polylines(const Polylines &polylines, double limit_distance) +{ + if (polylines.empty()) + return polylines; + + std::unordered_map connected; + connected.reserve(polylines.size()); + for (size_t i = 0; i < polylines.size(); i++) { + if (!polylines[i].empty()) { + connected.emplace(i, polylines[i]); + } + } + + for (size_t a = 0; a < polylines.size(); a++) { + if (connected.find(a) == connected.end()) { + continue; + } + Polyline &base = connected.at(a); + for (size_t b = a + 1; b < polylines.size(); b++) { + if (connected.find(b) == connected.end()) { + continue; + } + Polyline &next = connected.at(b); + if ((base.last_point() - next.first_point()).cast().squaredNorm() < limit_distance * limit_distance) { + base.append(std::move(next)); + connected.erase(b); + } else if ((base.last_point() - next.last_point()).cast().squaredNorm() < limit_distance * limit_distance) { + base.points.insert(base.points.end(), next.points.rbegin(), next.points.rend()); + connected.erase(b); + } else if ((base.first_point() - next.last_point()).cast().squaredNorm() < limit_distance * limit_distance) { + next.append(std::move(base)); + base = std::move(next); + base.reverse(); + connected.erase(b); + } else if ((base.first_point() - next.first_point()).cast().squaredNorm() < limit_distance * limit_distance) { + base.reverse(); + base.append(std::move(next)); + base.reverse(); + connected.erase(b); + } + } + } + + Polylines result; + for (auto &ext : connected) { + result.push_back(std::move(ext.second)); + } + + return result; +} + +ExtrusionPaths sort_extra_perimeters(ExtrusionPaths extra_perims, int index_of_first_unanchored, double extrusion_spacing) +{ + if (extra_perims.empty()) return {}; + + std::vector> dependencies(extra_perims.size()); + for (size_t path_idx = 0; path_idx < extra_perims.size(); path_idx++) { + for (size_t prev_path_idx = 0; prev_path_idx < path_idx; prev_path_idx++) { + if (paths_touch(extra_perims[path_idx], extra_perims[prev_path_idx], extrusion_spacing * 1.5f)) { + dependencies[path_idx].insert(prev_path_idx); + } + } + } + + std::vector processed(extra_perims.size(), false); + for (size_t path_idx = 0; path_idx < index_of_first_unanchored; path_idx++) { + processed[path_idx] = true; + } + + for (size_t i = index_of_first_unanchored; i < extra_perims.size(); i++) { + bool change = false; + for (size_t path_idx = index_of_first_unanchored; path_idx < extra_perims.size(); path_idx++) { + if (processed[path_idx]) + continue; + auto processed_dep = std::find_if(dependencies[path_idx].begin(), dependencies[path_idx].end(), + [&](size_t dep) { return processed[dep]; }); + if (processed_dep != dependencies[path_idx].end()) { + for (auto it = dependencies[path_idx].begin(); it != dependencies[path_idx].end();) { + if (!processed[*it]) { + dependencies[*it].insert(path_idx); + dependencies[path_idx].erase(it++); + } else { + ++it; + } + } + processed[path_idx] = true; + change = true; + } + } + if (!change) { + break; + } + } + + Point current_point = extra_perims.begin()->first_point(); + + ExtrusionPaths sorted_paths{}; + size_t null_idx = size_t(-1); + size_t next_idx = null_idx; + bool reverse = false; + while (true) { + if (next_idx == null_idx) { // find next pidx to print + double dist = std::numeric_limits::max(); + for (size_t path_idx = 0; path_idx < extra_perims.size(); path_idx++) { + if (!dependencies[path_idx].empty()) + continue; + const auto &path = extra_perims[path_idx]; + double dist_a = (path.first_point() - current_point).cast().squaredNorm(); + if (dist_a < dist) { + dist = dist_a; + next_idx = path_idx; + reverse = false; + } + double dist_b = (path.last_point() - current_point).cast().squaredNorm(); + if (dist_b < dist) { + dist = dist_b; + next_idx = path_idx; + reverse = true; + } + } + if (next_idx == null_idx) { + break; + } + } else { + // we have valid next_idx, add it to the sorted paths, update dependencies, update current point and potentialy set new next_idx + ExtrusionPath path = extra_perims[next_idx]; + if (reverse) { + path.reverse(); + } + sorted_paths.push_back(path); + assert(dependencies[next_idx].empty()); + dependencies[next_idx].insert(null_idx); + current_point = sorted_paths.back().last_point(); + for (size_t path_idx = 0; path_idx < extra_perims.size(); path_idx++) { + dependencies[path_idx].erase(next_idx); + } + double dist = std::numeric_limits::max(); + next_idx = null_idx; + + for (size_t path_idx = next_idx + 1; path_idx < extra_perims.size(); path_idx++) { + if (!dependencies[path_idx].empty()) { + continue; + } + const ExtrusionPath &next_path = extra_perims[path_idx]; + double dist_a = (next_path.first_point() - current_point).cast().squaredNorm(); + if (dist_a < dist) { + dist = dist_a; + next_idx = path_idx; + reverse = false; + } + double dist_b = (next_path.last_point() - current_point).cast().squaredNorm(); + if (dist_b < dist) { + dist = dist_b; + next_idx = path_idx; + reverse = true; + } + } + if (dist > scaled(5.0)) { + next_idx = null_idx; + } + } + } + + ExtrusionPaths reconnected; + reconnected.reserve(sorted_paths.size()); + for (const ExtrusionPath &path : sorted_paths) { + if (!reconnected.empty() && (reconnected.back().last_point() - path.first_point()).cast().squaredNorm() < + extrusion_spacing * extrusion_spacing * 4.0) { + reconnected.back().polyline.points.insert(reconnected.back().polyline.points.end(), path.polyline.points.begin(), + path.polyline.points.end()); + } else { + reconnected.push_back(path); + } + } + + ExtrusionPaths filtered; + filtered.reserve(reconnected.size()); + for (ExtrusionPath &p : reconnected) { + if (p.length() > 3 * extrusion_spacing) { + filtered.push_back(p); + } + } + + return filtered; +} + +#define EXTRA_PERIMETER_OFFSET_PARAMETERS ClipperLib::jtSquare, 0. +// #define EXTRA_PERIM_DEBUG_FILES +// Function will generate extra perimeters clipped over nonbridgeable areas of the provided surface and returns both the new perimeters and +// Polygons filled by those clipped perimeters +std::tuple, Polygons> generate_extra_perimeters_over_overhangs(ExPolygons infill_area, + const Polygons &lower_slices_polygons, + int perimeter_count, + const Flow &overhang_flow, + double scaled_resolution, + const PrintObjectConfig &object_config, + const PrintConfig &print_config) +{ + coord_t anchors_size = std::min(coord_t(scale_(EXTERNAL_INFILL_MARGIN)), overhang_flow.scaled_spacing() * (perimeter_count + 1)); + + BoundingBox infill_area_bb = get_extents(infill_area).inflated(SCALED_EPSILON); + Polygons optimized_lower_slices = ClipperUtils::clip_clipper_polygons_with_subject_bbox(lower_slices_polygons, infill_area_bb); + Polygons overhangs = diff(infill_area, optimized_lower_slices); + + if (overhangs.empty()) { return {}; } + + AABBTreeLines::LinesDistancer lower_layer_aabb_tree{to_lines(optimized_lower_slices)}; + Polygons anchors = intersection(infill_area, optimized_lower_slices); + Polygons inset_anchors = diff(anchors, + expand(overhangs, anchors_size + 0.1 * overhang_flow.scaled_width(), EXTRA_PERIMETER_OFFSET_PARAMETERS)); + Polygons inset_overhang_area = diff(infill_area, inset_anchors); + +#ifdef EXTRA_PERIM_DEBUG_FILES + { + BoundingBox bbox = get_extents(inset_overhang_area); + bbox.offset(scale_(1.)); + ::Slic3r::SVG svg(debug_out_path("inset_overhang_area").c_str(), bbox); + for (const Line &line : to_lines(inset_anchors)) svg.draw(line, "purple", scale_(0.25)); + for (const Line &line : to_lines(inset_overhang_area)) svg.draw(line, "red", scale_(0.15)); + svg.Close(); + } +#endif + + Polygons inset_overhang_area_left_unfilled; + + std::vector extra_perims; // overhang region -> extrusion paths + for (const ExPolygon &overhang : union_ex(to_expolygons(inset_overhang_area))) { + Polygons overhang_to_cover = to_polygons(overhang); + Polygons expanded_overhang_to_cover = expand(overhang_to_cover, 1.1 * overhang_flow.scaled_spacing()); + Polygons shrinked_overhang_to_cover = shrink(overhang_to_cover, 0.1 * overhang_flow.scaled_spacing()); + + Polygons real_overhang = intersection(overhang_to_cover, overhangs); + if (real_overhang.empty()) { + inset_overhang_area_left_unfilled.insert(inset_overhang_area_left_unfilled.end(), overhang_to_cover.begin(), + overhang_to_cover.end()); + continue; + } + ExtrusionPaths &overhang_region = extra_perims.emplace_back(); + + Polygons anchoring = intersection(expanded_overhang_to_cover, inset_anchors); + Polygons perimeter_polygon = offset(union_(expand(overhang_to_cover, 0.1 * overhang_flow.scaled_spacing()), anchoring), + -overhang_flow.scaled_spacing() * 0.6); + + Polygon anchoring_convex_hull = Geometry::convex_hull(anchoring); + double unbridgeable_area = area(diff(real_overhang, {anchoring_convex_hull})); + + auto [dir, unsupp_dist] = detect_bridging_direction(real_overhang, anchors); + +#ifdef EXTRA_PERIM_DEBUG_FILES + { + BoundingBox bbox = get_extents(anchoring_convex_hull); + bbox.offset(scale_(1.)); + ::Slic3r::SVG svg(debug_out_path("bridge_check").c_str(), bbox); + for (const Line &line : to_lines(perimeter_polygon)) svg.draw(line, "purple", scale_(0.25)); + for (const Line &line : to_lines(real_overhang)) svg.draw(line, "red", scale_(0.20)); + for (const Line &line : to_lines(anchoring_convex_hull)) svg.draw(line, "green", scale_(0.15)); + for (const Line &line : to_lines(anchoring)) svg.draw(line, "yellow", scale_(0.10)); + for (const Line &line : to_lines(diff_ex(perimeter_polygon, {anchoring_convex_hull}))) svg.draw(line, "black", scale_(0.10)); + for (const Line &line : to_lines(diff_pl(to_polylines(diff(real_overhang, anchors)), expand(anchors, float(SCALED_EPSILON))))) + svg.draw(line, "blue", scale_(0.30)); + svg.Close(); + } +#endif + + if (unbridgeable_area < 0.2 * area(real_overhang) && unsupp_dist < total_length(real_overhang) * 0.2) { + inset_overhang_area_left_unfilled.insert(inset_overhang_area_left_unfilled.end(),overhang_to_cover.begin(),overhang_to_cover.end()); + perimeter_polygon.clear(); + } else { + // fill the overhang with perimeters + int continuation_loops = 2; + while (continuation_loops >= 0) { + auto prev = perimeter_polygon; + // prepare next perimeter lines + Polylines perimeter = intersection_pl(to_polylines(perimeter_polygon), shrinked_overhang_to_cover); + + // do not add the perimeter to result yet, first check if perimeter_polygon is not empty after shrinking - this would mean + // that the polygon was possibly too small for full perimeter loop and in that case try gap fill first + perimeter_polygon = union_(perimeter_polygon, anchoring); + perimeter_polygon = intersection(offset(perimeter_polygon, -overhang_flow.scaled_spacing()), expanded_overhang_to_cover); + + if (perimeter_polygon.empty()) { // fill possible gaps of single extrusion width + Polygons shrinked = intersection(offset(prev, -0.3 * overhang_flow.scaled_spacing()), expanded_overhang_to_cover); + if (!shrinked.empty()) { + extrusion_paths_append(overhang_region, reconnect_polylines(perimeter, overhang_flow.scaled_spacing()), + ExtrusionRole::OverhangPerimeter, overhang_flow.mm3_per_mm(), overhang_flow.width(), + overhang_flow.height()); + } + + Polylines fills; + ExPolygons gap = shrinked.empty() ? offset_ex(prev, overhang_flow.scaled_spacing() * 0.5) : to_expolygons(shrinked); + + for (const ExPolygon &ep : gap) { + ep.medial_axis(0.75 * overhang_flow.scaled_width(), 3.0 * overhang_flow.scaled_spacing(), &fills); + } + if (!fills.empty()) { + fills = intersection_pl(fills, shrinked_overhang_to_cover); + extrusion_paths_append(overhang_region, reconnect_polylines(fills, overhang_flow.scaled_spacing()), + ExtrusionRole::OverhangPerimeter, overhang_flow.mm3_per_mm(), overhang_flow.width(), + overhang_flow.height()); + } + break; + } else { + extrusion_paths_append(overhang_region, reconnect_polylines(perimeter, overhang_flow.scaled_spacing()), + ExtrusionRole::OverhangPerimeter, overhang_flow.mm3_per_mm(), overhang_flow.width(), + overhang_flow.height()); + } + + if (intersection(perimeter_polygon, real_overhang).empty()) { continuation_loops--; } + + if (prev == perimeter_polygon) { +#ifdef EXTRA_PERIM_DEBUG_FILES + BoundingBox bbox = get_extents(perimeter_polygon); + bbox.offset(scale_(5.)); + ::Slic3r::SVG svg(debug_out_path("perimeter_polygon").c_str(), bbox); + for (const Line &line : to_lines(perimeter_polygon)) svg.draw(line, "blue", scale_(0.25)); + for (const Line &line : to_lines(overhang_to_cover)) svg.draw(line, "red", scale_(0.20)); + for (const Line &line : to_lines(real_overhang)) svg.draw(line, "green", scale_(0.15)); + for (const Line &line : to_lines(anchoring)) svg.draw(line, "yellow", scale_(0.10)); + svg.Close(); +#endif + break; + } + } + + perimeter_polygon = expand(perimeter_polygon, 0.5 * overhang_flow.scaled_spacing()); + perimeter_polygon = union_(perimeter_polygon, anchoring); + inset_overhang_area_left_unfilled.insert(inset_overhang_area_left_unfilled.end(), perimeter_polygon.begin(),perimeter_polygon.end()); + +#ifdef EXTRA_PERIM_DEBUG_FILES + BoundingBox bbox = get_extents(inset_overhang_area); + bbox.offset(scale_(2.)); + ::Slic3r::SVG svg(debug_out_path("pre_final").c_str(), bbox); + for (const Line &line : to_lines(perimeter_polygon)) svg.draw(line, "blue", scale_(0.05)); + for (const Line &line : to_lines(anchoring)) svg.draw(line, "green", scale_(0.05)); + for (const Line &line : to_lines(overhang_to_cover)) svg.draw(line, "yellow", scale_(0.05)); + for (const Line &line : to_lines(inset_overhang_area_left_unfilled)) svg.draw(line, "red", scale_(0.05)); + svg.Close(); +#endif + overhang_region.erase(std::remove_if(overhang_region.begin(), overhang_region.end(), + [](const ExtrusionPath &p) { return p.empty(); }), + overhang_region.end()); + + if (!overhang_region.empty()) { + // there is a special case, where the first (or last) generated overhang perimeter eats all anchor space. + // When this happens, the first overhang perimeter is also a closed loop, and needs special check + // instead of the following simple is_anchored lambda, which checks only the first and last point (not very useful on closed + // polyline) + bool first_overhang_is_closed_and_anchored = + (overhang_region.front().first_point() == overhang_region.front().last_point() && + !intersection_pl(overhang_region.front().polyline, optimized_lower_slices).empty()); + + auto is_anchored = [&lower_layer_aabb_tree](const ExtrusionPath &path) { + return lower_layer_aabb_tree.distance_from_lines(path.first_point()) <= 0 || + lower_layer_aabb_tree.distance_from_lines(path.last_point()) <= 0; + }; + if (!first_overhang_is_closed_and_anchored) { + std::reverse(overhang_region.begin(), overhang_region.end()); + } else { + size_t min_dist_idx = 0; + double min_dist = std::numeric_limits::max(); + for (size_t i = 0; i < overhang_region.front().polyline.size(); i++) { + Point p = overhang_region.front().polyline[i]; + if (double d = lower_layer_aabb_tree.distance_from_lines(p) < min_dist) { + min_dist = d; + min_dist_idx = i; + } + } + std::rotate(overhang_region.front().polyline.begin(), overhang_region.front().polyline.begin() + min_dist_idx, + overhang_region.front().polyline.end()); + } + auto first_unanchored = std::stable_partition(overhang_region.begin(), overhang_region.end(), is_anchored); + int index_of_first_unanchored = first_unanchored - overhang_region.begin(); + overhang_region = sort_extra_perimeters(overhang_region, index_of_first_unanchored, overhang_flow.scaled_spacing()); + } + } + } + +#ifdef EXTRA_PERIM_DEBUG_FILES + BoundingBox bbox = get_extents(inset_overhang_area); + bbox.offset(scale_(2.)); + ::Slic3r::SVG svg(debug_out_path(("final" + std::to_string(rand())).c_str()).c_str(), bbox); + for (const Line &line : to_lines(inset_overhang_area_left_unfilled)) svg.draw(line, "blue", scale_(0.05)); + for (const Line &line : to_lines(inset_overhang_area)) svg.draw(line, "green", scale_(0.05)); + for (const Line &line : to_lines(diff(inset_overhang_area, inset_overhang_area_left_unfilled))) svg.draw(line, "yellow", scale_(0.05)); + svg.Close(); +#endif + + inset_overhang_area_left_unfilled = union_(inset_overhang_area_left_unfilled); + + return {extra_perims, diff(inset_overhang_area, inset_overhang_area_left_unfilled)}; +} + // Thanks, Cura developers, for implementing an algorithm for generating perimeters with variable width (Arachne) that is based on the paper // "A framework for adaptive width control of dense contour-parallel toolpaths in fused deposition modeling" -void PerimeterGenerator::process_arachne() +void PerimeterGenerator::process_arachne( + // Inputs: + const Parameters ¶ms, + const Surface &surface, + const ExPolygons *lower_slices, + // Cache: + Polygons &lower_slices_polygons_cache, + // Output: + // Loops with the external thin walls + ExtrusionEntityCollection &out_loops, + // Gaps without the thin walls + ExtrusionEntityCollection & /* out_gap_fill */, + // Infills without the gap fills + ExPolygons &out_fill_expolygons) { // other perimeters - m_mm3_per_mm = this->perimeter_flow.mm3_per_mm(); - coord_t perimeter_spacing = this->perimeter_flow.scaled_spacing(); - + coord_t perimeter_spacing = params.perimeter_flow.scaled_spacing(); // external perimeters - m_ext_mm3_per_mm = this->ext_perimeter_flow.mm3_per_mm(); - coord_t ext_perimeter_width = this->ext_perimeter_flow.scaled_width(); - coord_t ext_perimeter_spacing = this->ext_perimeter_flow.scaled_spacing(); - coord_t ext_perimeter_spacing2 = scaled(0.5f * (this->ext_perimeter_flow.spacing() + this->perimeter_flow.spacing())); - - // overhang perimeters - m_mm3_per_mm_overhang = this->overhang_flow.mm3_per_mm(); - + coord_t ext_perimeter_width = params.ext_perimeter_flow.scaled_width(); + coord_t ext_perimeter_spacing = params.ext_perimeter_flow.scaled_spacing(); + coord_t ext_perimeter_spacing2 = scaled(0.5f * (params.ext_perimeter_flow.spacing() + params.perimeter_flow.spacing())); // solid infill - coord_t solid_infill_spacing = this->solid_infill_flow.scaled_spacing(); + coord_t solid_infill_spacing = params.solid_infill_flow.scaled_spacing(); // prepare grown lower layer slices for overhang detection - if (this->lower_slices != nullptr && this->config->overhangs) { + if (params.config.overhangs && lower_slices != nullptr && lower_slices_polygons_cache.empty()) { // We consider overhang any part where the entire nozzle diameter is not supported by the // lower layer, so we take lower slices and offset them by half the nozzle diameter used // in the current layer - double nozzle_diameter = this->print_config->nozzle_diameter.get_at(this->config->perimeter_extruder-1); - m_lower_slices_polygons = offset(*this->lower_slices, float(scale_(+nozzle_diameter/2))); + double nozzle_diameter = params.print_config.nozzle_diameter.get_at(params.config.perimeter_extruder-1); + lower_slices_polygons_cache = offset(*lower_slices, float(scale_(+nozzle_diameter/2))); } // we need to process each island separately because we might have different // extra perimeters for each one - for (const Surface &surface : this->slices->surfaces) { - // detect how many perimeters must be generated for this island - int loop_number = this->config->perimeters + surface.extra_perimeters - 1; // 0-indexed loops - ExPolygons last = offset_ex(surface.expolygon.simplify_p(m_scaled_resolution), - float(ext_perimeter_width / 2. - ext_perimeter_spacing / 2.)); - Polygons last_p = to_polygons(last); + // detect how many perimeters must be generated for this island + int loop_number = params.config.perimeters + surface.extra_perimeters - 1; // 0-indexed loops + ExPolygons last = offset_ex(surface.expolygon.simplify_p(params.scaled_resolution), - float(ext_perimeter_width / 2. - ext_perimeter_spacing / 2.)); + Polygons last_p = to_polygons(last); - Arachne::WallToolPaths wallToolPaths(last_p, ext_perimeter_spacing, perimeter_spacing, coord_t(loop_number + 1), 0, layer_height, *this->object_config, *this->print_config); - std::vector perimeters = wallToolPaths.getToolPaths(); - loop_number = int(perimeters.size()) - 1; + Arachne::WallToolPaths wallToolPaths(last_p, ext_perimeter_spacing, perimeter_spacing, coord_t(loop_number + 1), 0, params.layer_height, params.object_config, params.print_config); + std::vector perimeters = wallToolPaths.getToolPaths(); + loop_number = int(perimeters.size()) - 1; #ifdef ARACHNE_DEBUG - { - static int iRun = 0; - export_perimeters_to_svg(debug_out_path("arachne-perimeters-%d-%d.svg", layer_id, iRun++), to_polygons(last), perimeters, union_ex(wallToolPaths.getInnerContour())); - } + { + static int iRun = 0; + export_perimeters_to_svg(debug_out_path("arachne-perimeters-%d-%d.svg", layer_id, iRun++), to_polygons(last), perimeters, union_ex(wallToolPaths.getInnerContour())); + } #endif - // All closed ExtrusionLine should have the same the first and the last point. - // But in rare cases, Arachne produce ExtrusionLine marked as closed but without - // equal the first and the last point. - assert([&perimeters = std::as_const(perimeters)]() -> bool { - for (const Arachne::VariableWidthLines &perimeter : perimeters) - for (const Arachne::ExtrusionLine &el : perimeter) - if (el.is_closed && el.junctions.front().p != el.junctions.back().p) - return false; - return true; - }()); - - int start_perimeter = int(perimeters.size()) - 1; - int end_perimeter = -1; - int direction = -1; - - if (this->config->external_perimeters_first) { - start_perimeter = 0; - end_perimeter = int(perimeters.size()); - direction = 1; - } + // All closed ExtrusionLine should have the same the first and the last point. + // But in rare cases, Arachne produce ExtrusionLine marked as closed but without + // equal the first and the last point. + assert([&perimeters = std::as_const(perimeters)]() -> bool { + for (const Arachne::VariableWidthLines &perimeter : perimeters) + for (const Arachne::ExtrusionLine &el : perimeter) + if (el.is_closed && el.junctions.front().p != el.junctions.back().p) + return false; + return true; + }()); - std::vector all_extrusions; - for (int perimeter_idx = start_perimeter; perimeter_idx != end_perimeter; perimeter_idx += direction) { - if (perimeters[perimeter_idx].empty()) - continue; - for (Arachne::ExtrusionLine &wall : perimeters[perimeter_idx]) - all_extrusions.emplace_back(&wall); - } + int start_perimeter = int(perimeters.size()) - 1; + int end_perimeter = -1; + int direction = -1; - // Find topological order with constraints from extrusions_constrains. - std::vector blocked(all_extrusions.size(), 0); // Value indicating how many extrusions it is blocking (preceding extrusions) an extrusion. - std::vector> blocking(all_extrusions.size()); // Each extrusion contains a vector of extrusions that are blocked by this extrusion. - std::unordered_map map_extrusion_to_idx; - for (size_t idx = 0; idx < all_extrusions.size(); idx++) - map_extrusion_to_idx.emplace(all_extrusions[idx], idx); - - auto extrusions_constrains = Arachne::WallToolPaths::getRegionOrder(all_extrusions, this->config->external_perimeters_first); - for (auto [before, after] : extrusions_constrains) { - auto after_it = map_extrusion_to_idx.find(after); - ++blocked[after_it->second]; - blocking[map_extrusion_to_idx.find(before)->second].emplace_back(after_it->second); - } + if (params.config.external_perimeters_first) { + start_perimeter = 0; + end_perimeter = int(perimeters.size()); + direction = 1; + } - std::vector processed(all_extrusions.size(), false); // Indicate that the extrusion was already processed. - Point current_position = all_extrusions.empty() ? Point::Zero() : all_extrusions.front()->junctions.front().p; // Some starting position. - std::vector ordered_extrusions; // To store our result in. At the end we'll std::swap. - ordered_extrusions.reserve(all_extrusions.size()); - - while (ordered_extrusions.size() < all_extrusions.size()) { - size_t best_candidate = 0; - double best_distance_sqr = std::numeric_limits::max(); - bool is_best_closed = false; - - std::vector available_candidates; - for (size_t candidate = 0; candidate < all_extrusions.size(); ++candidate) { - if (processed[candidate] || blocked[candidate]) - continue; // Not a valid candidate. - available_candidates.push_back(candidate); - } + std::vector all_extrusions; + for (int perimeter_idx = start_perimeter; perimeter_idx != end_perimeter; perimeter_idx += direction) { + if (perimeters[perimeter_idx].empty()) + continue; + for (Arachne::ExtrusionLine &wall : perimeters[perimeter_idx]) + all_extrusions.emplace_back(&wall); + } + + // Find topological order with constraints from extrusions_constrains. + std::vector blocked(all_extrusions.size(), 0); // Value indicating how many extrusions it is blocking (preceding extrusions) an extrusion. + std::vector> blocking(all_extrusions.size()); // Each extrusion contains a vector of extrusions that are blocked by this extrusion. + std::unordered_map map_extrusion_to_idx; + for (size_t idx = 0; idx < all_extrusions.size(); idx++) + map_extrusion_to_idx.emplace(all_extrusions[idx], idx); + + auto extrusions_constrains = Arachne::WallToolPaths::getRegionOrder(all_extrusions, params.config.external_perimeters_first); + for (auto [before, after] : extrusions_constrains) { + auto after_it = map_extrusion_to_idx.find(after); + ++blocked[after_it->second]; + blocking[map_extrusion_to_idx.find(before)->second].emplace_back(after_it->second); + } - std::sort(available_candidates.begin(), available_candidates.end(), [&all_extrusions](const size_t a_idx, const size_t b_idx) -> bool { - return all_extrusions[a_idx]->is_closed < all_extrusions[b_idx]->is_closed; - }); + std::vector processed(all_extrusions.size(), false); // Indicate that the extrusion was already processed. + Point current_position = all_extrusions.empty() ? Point::Zero() : all_extrusions.front()->junctions.front().p; // Some starting position. + std::vector ordered_extrusions; // To store our result in. At the end we'll std::swap. + ordered_extrusions.reserve(all_extrusions.size()); + + while (ordered_extrusions.size() < all_extrusions.size()) { + size_t best_candidate = 0; + double best_distance_sqr = std::numeric_limits::max(); + bool is_best_closed = false; + + std::vector available_candidates; + for (size_t candidate = 0; candidate < all_extrusions.size(); ++candidate) { + if (processed[candidate] || blocked[candidate]) + continue; // Not a valid candidate. + available_candidates.push_back(candidate); + } - for (const size_t candidate_path_idx : available_candidates) { - auto& path = all_extrusions[candidate_path_idx]; + std::sort(available_candidates.begin(), available_candidates.end(), [&all_extrusions](const size_t a_idx, const size_t b_idx) -> bool { + return all_extrusions[a_idx]->is_closed < all_extrusions[b_idx]->is_closed; + }); - if (path->junctions.empty()) { // No vertices in the path. Can't find the start position then or really plan it in. Put that at the end. - if (best_distance_sqr == std::numeric_limits::max()) { - best_candidate = candidate_path_idx; - is_best_closed = path->is_closed; - } - continue; + for (const size_t candidate_path_idx : available_candidates) { + auto& path = all_extrusions[candidate_path_idx]; + + if (path->junctions.empty()) { // No vertices in the path. Can't find the start position then or really plan it in. Put that at the end. + if (best_distance_sqr == std::numeric_limits::max()) { + best_candidate = candidate_path_idx; + is_best_closed = path->is_closed; } + continue; + } - const Point candidate_position = path->junctions.front().p; - double distance_sqr = (current_position - candidate_position).cast().norm(); - if (distance_sqr < best_distance_sqr) { // Closer than the best candidate so far. - if (path->is_closed || (!path->is_closed && best_distance_sqr != std::numeric_limits::max()) || (!path->is_closed && !is_best_closed)) { - best_candidate = candidate_path_idx; - best_distance_sqr = distance_sqr; - is_best_closed = path->is_closed; - } + const Point candidate_position = path->junctions.front().p; + double distance_sqr = (current_position - candidate_position).cast().norm(); + if (distance_sqr < best_distance_sqr) { // Closer than the best candidate so far. + if (path->is_closed || (!path->is_closed && best_distance_sqr != std::numeric_limits::max()) || (!path->is_closed && !is_best_closed)) { + best_candidate = candidate_path_idx; + best_distance_sqr = distance_sqr; + is_best_closed = path->is_closed; } } + } - auto &best_path = all_extrusions[best_candidate]; - ordered_extrusions.push_back({best_path, best_path->is_contour(), false}); - processed[best_candidate] = true; - for (size_t unlocked_idx : blocking[best_candidate]) - blocked[unlocked_idx]--; + auto &best_path = all_extrusions[best_candidate]; + ordered_extrusions.push_back({best_path, best_path->is_contour(), false}); + processed[best_candidate] = true; + for (size_t unlocked_idx : blocking[best_candidate]) + blocked[unlocked_idx]--; - if(!best_path->junctions.empty()) { //If all paths were empty, the best path is still empty. We don't upate the current position then. - if(best_path->is_closed) - current_position = best_path->junctions[0].p; //We end where we started. - else - current_position = best_path->junctions.back().p; //Pick the other end from where we started. - } + if (!best_path->junctions.empty()) { //If all paths were empty, the best path is still empty. We don't upate the current position then. + if(best_path->is_closed) + current_position = best_path->junctions[0].p; //We end where we started. + else + current_position = best_path->junctions.back().p; //Pick the other end from where we started. } + } - if (this->layer_id > 0 && this->config->fuzzy_skin != FuzzySkinType::None) { - std::vector closed_loop_extrusions; - for (PerimeterGeneratorArachneExtrusion &extrusion : ordered_extrusions) - if (extrusion.extrusion->inset_idx == 0) { - if (extrusion.extrusion->is_closed && this->config->fuzzy_skin == FuzzySkinType::External) { - closed_loop_extrusions.emplace_back(&extrusion); - } else { - extrusion.fuzzify = true; - } + if (params.layer_id > 0 && params.config.fuzzy_skin != FuzzySkinType::None) { + std::vector closed_loop_extrusions; + for (PerimeterGeneratorArachneExtrusion &extrusion : ordered_extrusions) + if (extrusion.extrusion->inset_idx == 0) { + if (extrusion.extrusion->is_closed && params.config.fuzzy_skin == FuzzySkinType::External) { + closed_loop_extrusions.emplace_back(&extrusion); + } else { + extrusion.fuzzify = true; } + } - if (this->config->fuzzy_skin == FuzzySkinType::External) { - ClipperLib_Z::Paths loops_paths; - loops_paths.reserve(closed_loop_extrusions.size()); - for (const auto &cl_extrusion : closed_loop_extrusions) { - assert(cl_extrusion->extrusion->junctions.front() == cl_extrusion->extrusion->junctions.back()); - size_t loop_idx = &cl_extrusion - &closed_loop_extrusions.front(); - ClipperLib_Z::Path loop_path; - loop_path.reserve(cl_extrusion->extrusion->junctions.size() - 1); - for (auto junction_it = cl_extrusion->extrusion->junctions.begin(); junction_it != std::prev(cl_extrusion->extrusion->junctions.end()); ++junction_it) - loop_path.emplace_back(junction_it->p.x(), junction_it->p.y(), loop_idx); - loops_paths.emplace_back(loop_path); - } + if (params.config.fuzzy_skin == FuzzySkinType::External) { + ClipperLib_Z::Paths loops_paths; + loops_paths.reserve(closed_loop_extrusions.size()); + for (const auto &cl_extrusion : closed_loop_extrusions) { + assert(cl_extrusion->extrusion->junctions.front() == cl_extrusion->extrusion->junctions.back()); + size_t loop_idx = &cl_extrusion - &closed_loop_extrusions.front(); + ClipperLib_Z::Path loop_path; + loop_path.reserve(cl_extrusion->extrusion->junctions.size() - 1); + for (auto junction_it = cl_extrusion->extrusion->junctions.begin(); junction_it != std::prev(cl_extrusion->extrusion->junctions.end()); ++junction_it) + loop_path.emplace_back(junction_it->p.x(), junction_it->p.y(), loop_idx); + loops_paths.emplace_back(loop_path); + } - ClipperLib_Z::Clipper clipper; - clipper.AddPaths(loops_paths, ClipperLib_Z::ptSubject, true); - ClipperLib_Z::PolyTree loops_polytree; - clipper.Execute(ClipperLib_Z::ctUnion, loops_polytree, ClipperLib_Z::pftEvenOdd, ClipperLib_Z::pftEvenOdd); - - for (const ClipperLib_Z::PolyNode *child_node : loops_polytree.Childs) { - // The whole contour must have the same index. - coord_t polygon_idx = child_node->Contour.front().z(); - bool has_same_idx = std::all_of(child_node->Contour.begin(), child_node->Contour.end(), - [&polygon_idx](const ClipperLib_Z::IntPoint &point) -> bool { return polygon_idx == point.z(); }); - if (has_same_idx) - closed_loop_extrusions[polygon_idx]->fuzzify = true; - } + ClipperLib_Z::Clipper clipper; + clipper.AddPaths(loops_paths, ClipperLib_Z::ptSubject, true); + ClipperLib_Z::PolyTree loops_polytree; + clipper.Execute(ClipperLib_Z::ctUnion, loops_polytree, ClipperLib_Z::pftEvenOdd, ClipperLib_Z::pftEvenOdd); + + for (const ClipperLib_Z::PolyNode *child_node : loops_polytree.Childs) { + // The whole contour must have the same index. + coord_t polygon_idx = child_node->Contour.front().z(); + bool has_same_idx = std::all_of(child_node->Contour.begin(), child_node->Contour.end(), + [&polygon_idx](const ClipperLib_Z::IntPoint &point) -> bool { return polygon_idx == point.z(); }); + if (has_same_idx) + closed_loop_extrusions[polygon_idx]->fuzzify = true; } } + } - if (ExtrusionEntityCollection extrusion_coll = traverse_extrusions(*this, ordered_extrusions); !extrusion_coll.empty()) - this->loops->append(extrusion_coll); - - ExPolygons infill_contour = union_ex(wallToolPaths.getInnerContour()); - const coord_t spacing = (perimeters.size() == 1) ? ext_perimeter_spacing2 : perimeter_spacing; - if (offset_ex(infill_contour, -float(spacing / 2.)).empty()) - infill_contour.clear(); // Infill region is too small, so let's filter it out. - - // create one more offset to be used as boundary for fill - // we offset by half the perimeter spacing (to get to the actual infill boundary) - // and then we offset back and forth by half the infill spacing to only consider the - // non-collapsing regions - coord_t inset = - (loop_number < 0) ? 0 : - (loop_number == 0) ? - // one loop - ext_perimeter_spacing: - // two or more loops? - perimeter_spacing; - - inset = coord_t(scale_(this->config->get_abs_value("infill_overlap", unscale(inset)))); - Polygons pp; - for (ExPolygon &ex : infill_contour) - ex.simplify_p(m_scaled_resolution, &pp); - // collapse too narrow infill areas - const auto min_perimeter_infill_spacing = coord_t(solid_infill_spacing * (1. - INSET_OVERLAP_TOLERANCE)); - // append infill areas to fill_surfaces - this->fill_surfaces->append( - offset2_ex( - union_ex(pp), - float(- min_perimeter_infill_spacing / 2.), - float(inset + min_perimeter_infill_spacing / 2.)), - stInternal); + if (ExtrusionEntityCollection extrusion_coll = traverse_extrusions(params, lower_slices_polygons_cache, ordered_extrusions); !extrusion_coll.empty()) + out_loops.append(extrusion_coll); + + ExPolygons infill_contour = union_ex(wallToolPaths.getInnerContour()); + const coord_t spacing = (perimeters.size() == 1) ? ext_perimeter_spacing2 : perimeter_spacing; + if (offset_ex(infill_contour, -float(spacing / 2.)).empty()) + infill_contour.clear(); // Infill region is too small, so let's filter it out. + + // create one more offset to be used as boundary for fill + // we offset by half the perimeter spacing (to get to the actual infill boundary) + // and then we offset back and forth by half the infill spacing to only consider the + // non-collapsing regions + coord_t inset = + (loop_number < 0) ? 0 : + (loop_number == 0) ? + // one loop + ext_perimeter_spacing: + // two or more loops? + perimeter_spacing; + + inset = coord_t(scale_(params.config.get_abs_value("infill_overlap", unscale(inset)))); + Polygons pp; + for (ExPolygon &ex : infill_contour) + ex.simplify_p(params.scaled_resolution, &pp); + // collapse too narrow infill areas + const auto min_perimeter_infill_spacing = coord_t(solid_infill_spacing * (1. - INSET_OVERLAP_TOLERANCE)); + // append infill areas to fill_surfaces + ExPolygons infill_areas = + offset2_ex( + union_ex(pp), + float(- min_perimeter_infill_spacing / 2.), + float(inset + min_perimeter_infill_spacing / 2.)); + + if (lower_slices != nullptr && params.config.overhangs && params.config.extra_perimeters_on_overhangs && + params.config.perimeters > 0 && params.layer_id > params.object_config.raft_layers) { + // Generate extra perimeters on overhang areas, and cut them to these parts only, to save print time and material + auto [extra_perimeters, filled_area] = generate_extra_perimeters_over_overhangs(infill_areas, + lower_slices_polygons_cache, + loop_number + 1, + params.overhang_flow, params.scaled_resolution, + params.object_config, params.print_config); + if (!extra_perimeters.empty()) { + ExtrusionEntityCollection &this_islands_perimeters = static_cast(*out_loops.entities.back()); + ExtrusionEntitiesPtr old_entities; + old_entities.swap(this_islands_perimeters.entities); + for (ExtrusionPaths &paths : extra_perimeters) + this_islands_perimeters.append(std::move(paths)); + append(this_islands_perimeters.entities, old_entities); + infill_areas = diff_ex(infill_areas, filled_area); + } } + + append(out_fill_expolygons, std::move(infill_areas)); } -void PerimeterGenerator::process_classic() +void PerimeterGenerator::process_classic( + // Inputs: + const Parameters ¶ms, + const Surface &surface, + const ExPolygons *lower_slices, + // Cache: + Polygons &lower_slices_polygons_cache, + // Output: + // Loops with the external thin walls + ExtrusionEntityCollection &out_loops, + // Gaps without the thin walls + ExtrusionEntityCollection &out_gap_fill, + // Infills without the gap fills + ExPolygons &out_fill_expolygons) { // other perimeters - m_mm3_per_mm = this->perimeter_flow.mm3_per_mm(); - coord_t perimeter_width = this->perimeter_flow.scaled_width(); - coord_t perimeter_spacing = this->perimeter_flow.scaled_spacing(); - + coord_t perimeter_width = params.perimeter_flow.scaled_width(); + coord_t perimeter_spacing = params.perimeter_flow.scaled_spacing(); // external perimeters - m_ext_mm3_per_mm = this->ext_perimeter_flow.mm3_per_mm(); - coord_t ext_perimeter_width = this->ext_perimeter_flow.scaled_width(); - coord_t ext_perimeter_spacing = this->ext_perimeter_flow.scaled_spacing(); - coord_t ext_perimeter_spacing2 = scaled(0.5f * (this->ext_perimeter_flow.spacing() + this->perimeter_flow.spacing())); - - // overhang perimeters - m_mm3_per_mm_overhang = this->overhang_flow.mm3_per_mm(); - + coord_t ext_perimeter_width = params.ext_perimeter_flow.scaled_width(); + coord_t ext_perimeter_spacing = params.ext_perimeter_flow.scaled_spacing(); + coord_t ext_perimeter_spacing2 = scaled(0.5f * (params.ext_perimeter_flow.spacing() + params.perimeter_flow.spacing())); // solid infill - coord_t solid_infill_spacing = this->solid_infill_flow.scaled_spacing(); + coord_t solid_infill_spacing = params.solid_infill_flow.scaled_spacing(); // Calculate the minimum required spacing between two adjacent traces. // This should be equal to the nominal flow spacing but we experiment @@ -843,255 +1353,262 @@ void PerimeterGenerator::process_classic() // internal flow which is unrelated. coord_t min_spacing = coord_t(perimeter_spacing * (1 - INSET_OVERLAP_TOLERANCE)); coord_t ext_min_spacing = coord_t(ext_perimeter_spacing * (1 - INSET_OVERLAP_TOLERANCE)); - bool has_gap_fill = this->config->gap_fill_enabled.value && this->config->gap_fill_speed.value > 0; + bool has_gap_fill = params.config.gap_fill_enabled.value && params.config.gap_fill_speed.value > 0; // prepare grown lower layer slices for overhang detection - if (this->lower_slices != NULL && this->config->overhangs) { + if (params.config.overhangs && lower_slices != nullptr && lower_slices_polygons_cache.empty()) { // We consider overhang any part where the entire nozzle diameter is not supported by the // lower layer, so we take lower slices and offset them by half the nozzle diameter used // in the current layer - double nozzle_diameter = this->print_config->nozzle_diameter.get_at(this->config->perimeter_extruder-1); - m_lower_slices_polygons = offset(*this->lower_slices, float(scale_(+nozzle_diameter/2))); + double nozzle_diameter = params.print_config.nozzle_diameter.get_at(params.config.perimeter_extruder-1); + lower_slices_polygons_cache = offset(*lower_slices, float(scale_(+nozzle_diameter/2))); } // we need to process each island separately because we might have different // extra perimeters for each one - for (const Surface &surface : this->slices->surfaces) { - // detect how many perimeters must be generated for this island - int loop_number = this->config->perimeters + surface.extra_perimeters - 1; // 0-indexed loops - ExPolygons last = union_ex(surface.expolygon.simplify_p(m_scaled_resolution)); - ExPolygons gaps; - if (loop_number >= 0) { - // In case no perimeters are to be generated, loop_number will equal to -1. - std::vector contours(loop_number+1); // depth => loops - std::vector holes(loop_number+1); // depth => loops - ThickPolylines thin_walls; - // we loop one time more than needed in order to find gaps after the last perimeter was applied - for (int i = 0;; ++ i) { // outer loop is 0 - // Calculate next onion shell of perimeters. - ExPolygons offsets; - if (i == 0) { - // the minimum thickness of a single loop is: - // ext_width/2 + ext_spacing/2 + spacing/2 + width/2 - offsets = this->config->thin_walls ? - offset2_ex( - last, - - float(ext_perimeter_width / 2. + ext_min_spacing / 2. - 1), - + float(ext_min_spacing / 2. - 1)) : - offset_ex(last, - float(ext_perimeter_width / 2.)); - // look for thin walls - if (this->config->thin_walls) { - // the following offset2 ensures almost nothing in @thin_walls is narrower than $min_width - // (actually, something larger than that still may exist due to mitering or other causes) - coord_t min_width = coord_t(scale_(this->ext_perimeter_flow.nozzle_diameter() / 3)); - ExPolygons expp = opening_ex( - // medial axis requires non-overlapping geometry - diff_ex(last, offset(offsets, float(ext_perimeter_width / 2.) + ClipperSafetyOffset)), - float(min_width / 2.)); - // the maximum thickness of our thin wall area is equal to the minimum thickness of a single loop - for (ExPolygon &ex : expp) - ex.medial_axis(ext_perimeter_width + ext_perimeter_spacing2, min_width, &thin_walls); - } - if (m_spiral_vase && offsets.size() > 1) { - // Remove all but the largest area polygon. - keep_largest_contour_only(offsets); - } - } else { - //FIXME Is this offset correct if the line width of the inner perimeters differs - // from the line width of the infill? - coord_t distance = (i == 1) ? ext_perimeter_spacing2 : perimeter_spacing; - offsets = this->config->thin_walls ? - // This path will ensure, that the perimeters do not overfill, as in - // prusa3d/Slic3r GH #32, but with the cost of rounding the perimeters - // excessively, creating gaps, which then need to be filled in by the not very - // reliable gap fill algorithm. - // Also the offset2(perimeter, -x, x) may sometimes lead to a perimeter, which is larger than - // the original. - offset2_ex(last, - - float(distance + min_spacing / 2. - 1.), - float(min_spacing / 2. - 1.)) : - // If "detect thin walls" is not enabled, this paths will be entered, which - // leads to overflows, as in prusa3d/Slic3r GH #32 - offset_ex(last, - float(distance)); - // look for gaps - if (has_gap_fill) - // not using safety offset here would "detect" very narrow gaps - // (but still long enough to escape the area threshold) that gap fill - // won't be able to fill but we'd still remove from infill area - append(gaps, diff_ex( - offset(last, - float(0.5 * distance)), - offset(offsets, float(0.5 * distance + 10)))); // safety offset + // detect how many perimeters must be generated for this island + int loop_number = params.config.perimeters + surface.extra_perimeters - 1; // 0-indexed loops + ExPolygons last = union_ex(surface.expolygon.simplify_p(params.scaled_resolution)); + ExPolygons gaps; + if (loop_number >= 0) { + // In case no perimeters are to be generated, loop_number will equal to -1. + std::vector contours(loop_number+1); // depth => loops + std::vector holes(loop_number+1); // depth => loops + ThickPolylines thin_walls; + // we loop one time more than needed in order to find gaps after the last perimeter was applied + for (int i = 0;; ++ i) { // outer loop is 0 + // Calculate next onion shell of perimeters. + ExPolygons offsets; + if (i == 0) { + // the minimum thickness of a single loop is: + // ext_width/2 + ext_spacing/2 + spacing/2 + width/2 + offsets = params.config.thin_walls ? + offset2_ex( + last, + - float(ext_perimeter_width / 2. + ext_min_spacing / 2. - 1), + + float(ext_min_spacing / 2. - 1)) : + offset_ex(last, - float(ext_perimeter_width / 2.)); + // look for thin walls + if (params.config.thin_walls) { + // the following offset2 ensures almost nothing in @thin_walls is narrower than $min_width + // (actually, something larger than that still may exist due to mitering or other causes) + coord_t min_width = coord_t(scale_(params.ext_perimeter_flow.nozzle_diameter() / 3)); + ExPolygons expp = opening_ex( + // medial axis requires non-overlapping geometry + diff_ex(last, offset(offsets, float(ext_perimeter_width / 2.) + ClipperSafetyOffset)), + float(min_width / 2.)); + // the maximum thickness of our thin wall area is equal to the minimum thickness of a single loop + for (ExPolygon &ex : expp) + ex.medial_axis(min_width, ext_perimeter_width + ext_perimeter_spacing2, &thin_walls); } - if (offsets.empty()) { - // Store the number of loops actually generated. - loop_number = i - 1; - // No region left to be filled in. - last.clear(); - break; - } else if (i > loop_number) { - // If i > loop_number, we were looking just for gaps. - break; + if (params.spiral_vase && offsets.size() > 1) { + // Remove all but the largest area polygon. + keep_largest_contour_only(offsets); } - { - const bool fuzzify_contours = this->config->fuzzy_skin != FuzzySkinType::None && i == 0 && this->layer_id > 0; - const bool fuzzify_holes = fuzzify_contours && this->config->fuzzy_skin == FuzzySkinType::All; - for (const ExPolygon &expolygon : offsets) { - // Outer contour may overlap with an inner contour, - // inner contour may overlap with another inner contour, - // outer contour may overlap with itself. - //FIXME evaluate the overlaps, annotate each point with an overlap depth, - // compensate for the depth of intersection. - contours[i].emplace_back(expolygon.contour, i, true, fuzzify_contours); - - if (! expolygon.holes.empty()) { - holes[i].reserve(holes[i].size() + expolygon.holes.size()); - for (const Polygon &hole : expolygon.holes) - holes[i].emplace_back(hole, i, false, fuzzify_holes); - } + } else { + //FIXME Is this offset correct if the line width of the inner perimeters differs + // from the line width of the infill? + coord_t distance = (i == 1) ? ext_perimeter_spacing2 : perimeter_spacing; + offsets = params.config.thin_walls ? + // This path will ensure, that the perimeters do not overfill, as in + // prusa3d/Slic3r GH #32, but with the cost of rounding the perimeters + // excessively, creating gaps, which then need to be filled in by the not very + // reliable gap fill algorithm. + // Also the offset2(perimeter, -x, x) may sometimes lead to a perimeter, which is larger than + // the original. + offset2_ex(last, + - float(distance + min_spacing / 2. - 1.), + float(min_spacing / 2. - 1.)) : + // If "detect thin walls" is not enabled, this paths will be entered, which + // leads to overflows, as in prusa3d/Slic3r GH #32 + offset_ex(last, - float(distance)); + // look for gaps + if (has_gap_fill) + // not using safety offset here would "detect" very narrow gaps + // (but still long enough to escape the area threshold) that gap fill + // won't be able to fill but we'd still remove from infill area + append(gaps, diff_ex( + offset(last, - float(0.5 * distance)), + offset(offsets, float(0.5 * distance + 10)))); // safety offset + } + if (offsets.empty()) { + // Store the number of loops actually generated. + loop_number = i - 1; + // No region left to be filled in. + last.clear(); + break; + } else if (i > loop_number) { + // If i > loop_number, we were looking just for gaps. + break; + } + { + const bool fuzzify_contours = params.config.fuzzy_skin != FuzzySkinType::None && i == 0 && params.layer_id > 0; + const bool fuzzify_holes = fuzzify_contours && params.config.fuzzy_skin == FuzzySkinType::All; + for (const ExPolygon &expolygon : offsets) { + // Outer contour may overlap with an inner contour, + // inner contour may overlap with another inner contour, + // outer contour may overlap with itself. + //FIXME evaluate the overlaps, annotate each point with an overlap depth, + // compensate for the depth of intersection. + contours[i].emplace_back(expolygon.contour, i, true, fuzzify_contours); + + if (! expolygon.holes.empty()) { + holes[i].reserve(holes[i].size() + expolygon.holes.size()); + for (const Polygon &hole : expolygon.holes) + holes[i].emplace_back(hole, i, false, fuzzify_holes); } } - last = std::move(offsets); - if (i == loop_number && (! has_gap_fill || this->config->fill_density.value == 0)) { - // The last run of this loop is executed to collect gaps for gap fill. - // As the gap fill is either disabled or not - break; - } } + last = std::move(offsets); + if (i == loop_number && (! has_gap_fill || params.config.fill_density.value == 0)) { + // The last run of this loop is executed to collect gaps for gap fill. + // As the gap fill is either disabled or not + break; + } + } - // nest loops: holes first - for (int d = 0; d <= loop_number; ++ d) { - PerimeterGeneratorLoops &holes_d = holes[d]; - // loop through all holes having depth == d - for (int i = 0; i < (int)holes_d.size(); ++ i) { - const PerimeterGeneratorLoop &loop = holes_d[i]; - // find the hole loop that contains this one, if any - for (int t = d + 1; t <= loop_number; ++ t) { - for (int j = 0; j < (int)holes[t].size(); ++ j) { - PerimeterGeneratorLoop &candidate_parent = holes[t][j]; - if (candidate_parent.polygon.contains(loop.polygon.first_point())) { - candidate_parent.children.push_back(loop); - holes_d.erase(holes_d.begin() + i); - -- i; - goto NEXT_LOOP; - } + // nest loops: holes first + for (int d = 0; d <= loop_number; ++ d) { + PerimeterGeneratorLoops &holes_d = holes[d]; + // loop through all holes having depth == d + for (int i = 0; i < (int)holes_d.size(); ++ i) { + const PerimeterGeneratorLoop &loop = holes_d[i]; + // find the hole loop that contains this one, if any + for (int t = d + 1; t <= loop_number; ++ t) { + for (int j = 0; j < (int)holes[t].size(); ++ j) { + PerimeterGeneratorLoop &candidate_parent = holes[t][j]; + if (candidate_parent.polygon.contains(loop.polygon.first_point())) { + candidate_parent.children.push_back(loop); + holes_d.erase(holes_d.begin() + i); + -- i; + goto NEXT_LOOP; } } - // if no hole contains this hole, find the contour loop that contains it - for (int t = loop_number; t >= 0; -- t) { - for (int j = 0; j < (int)contours[t].size(); ++ j) { - PerimeterGeneratorLoop &candidate_parent = contours[t][j]; - if (candidate_parent.polygon.contains(loop.polygon.first_point())) { - candidate_parent.children.push_back(loop); - holes_d.erase(holes_d.begin() + i); - -- i; - goto NEXT_LOOP; - } + } + // if no hole contains this hole, find the contour loop that contains it + for (int t = loop_number; t >= 0; -- t) { + for (int j = 0; j < (int)contours[t].size(); ++ j) { + PerimeterGeneratorLoop &candidate_parent = contours[t][j]; + if (candidate_parent.polygon.contains(loop.polygon.first_point())) { + candidate_parent.children.push_back(loop); + holes_d.erase(holes_d.begin() + i); + -- i; + goto NEXT_LOOP; } } - NEXT_LOOP: ; } + NEXT_LOOP: ; } - // nest contour loops - for (int d = loop_number; d >= 1; -- d) { - PerimeterGeneratorLoops &contours_d = contours[d]; - // loop through all contours having depth == d - for (int i = 0; i < (int)contours_d.size(); ++ i) { - const PerimeterGeneratorLoop &loop = contours_d[i]; - // find the contour loop that contains it - for (int t = d - 1; t >= 0; -- t) { - for (size_t j = 0; j < contours[t].size(); ++ j) { - PerimeterGeneratorLoop &candidate_parent = contours[t][j]; - if (candidate_parent.polygon.contains(loop.polygon.first_point())) { - candidate_parent.children.push_back(loop); - contours_d.erase(contours_d.begin() + i); - -- i; - goto NEXT_CONTOUR; - } + } + // nest contour loops + for (int d = loop_number; d >= 1; -- d) { + PerimeterGeneratorLoops &contours_d = contours[d]; + // loop through all contours having depth == d + for (int i = 0; i < (int)contours_d.size(); ++ i) { + const PerimeterGeneratorLoop &loop = contours_d[i]; + // find the contour loop that contains it + for (int t = d - 1; t >= 0; -- t) { + for (size_t j = 0; j < contours[t].size(); ++ j) { + PerimeterGeneratorLoop &candidate_parent = contours[t][j]; + if (candidate_parent.polygon.contains(loop.polygon.first_point())) { + candidate_parent.children.push_back(loop); + contours_d.erase(contours_d.begin() + i); + -- i; + goto NEXT_CONTOUR; } } - NEXT_CONTOUR: ; } + NEXT_CONTOUR: ; } - // at this point, all loops should be in contours[0] - ExtrusionEntityCollection entities = traverse_loops(*this, contours.front(), thin_walls); - // if brim will be printed, reverse the order of perimeters so that - // we continue inwards after having finished the brim - // TODO: add test for perimeter order - if (this->config->external_perimeters_first || - (this->layer_id == 0 && this->object_config->brim_width.value > 0)) - entities.reverse(); - // append perimeters for this slice as a collection - if (! entities.empty()) - this->loops->append(entities); - } // for each loop of an island - - // fill gaps - if (! gaps.empty()) { - // collapse - double min = 0.2 * perimeter_width * (1 - INSET_OVERLAP_TOLERANCE); - double max = 2. * perimeter_spacing; - ExPolygons gaps_ex = diff_ex( - //FIXME offset2 would be enough and cheaper. - opening_ex(gaps, float(min / 2.)), - offset2_ex(gaps, - float(max / 2.), float(max / 2. + ClipperSafetyOffset))); - ThickPolylines polylines; - for (const ExPolygon &ex : gaps_ex) - ex.medial_axis(max, min, &polylines); - if (! polylines.empty()) { - ExtrusionEntityCollection gap_fill; - variable_width(polylines, erGapFill, this->solid_infill_flow, gap_fill.entities); - /* Make sure we don't infill narrow parts that are already gap-filled - (we only consider this surface's gaps to reduce the diff() complexity). - Growing actual extrusions ensures that gaps not filled by medial axis - are not subtracted from fill surfaces (they might be too short gaps - that medial axis skips but infill might join with other infill regions - and use zigzag). */ - //FIXME Vojtech: This grows by a rounded extrusion width, not by line spacing, - // therefore it may cover the area, but no the volume. - last = diff_ex(last, gap_fill.polygons_covered_by_width(10.f)); - this->gap_fill->append(std::move(gap_fill.entities)); - } } + // at this point, all loops should be in contours[0] + ExtrusionEntityCollection entities = traverse_loops_classic(params, lower_slices_polygons_cache, contours.front(), thin_walls); + // if brim will be printed, reverse the order of perimeters so that + // we continue inwards after having finished the brim + // TODO: add test for perimeter order + if (params.config.external_perimeters_first || + (params.layer_id == 0 && params.object_config.brim_width.value > 0)) + entities.reverse(); + // append perimeters for this slice as a collection + if (! entities.empty()) + out_loops.append(entities); + } // for each loop of an island + + // fill gaps + if (! gaps.empty()) { + // collapse + double min = 0.2 * perimeter_width * (1 - INSET_OVERLAP_TOLERANCE); + double max = 2. * perimeter_spacing; + ExPolygons gaps_ex = diff_ex( + //FIXME offset2 would be enough and cheaper. + opening_ex(gaps, float(min / 2.)), + offset2_ex(gaps, - float(max / 2.), float(max / 2. + ClipperSafetyOffset))); + ThickPolylines polylines; + for (const ExPolygon &ex : gaps_ex) + ex.medial_axis(min, max, &polylines); + if (! polylines.empty()) { + ExtrusionEntityCollection gap_fill; + variable_width_classic(polylines, ExtrusionRole::GapFill, params.solid_infill_flow, gap_fill.entities); + /* Make sure we don't infill narrow parts that are already gap-filled + (we only consider this surface's gaps to reduce the diff() complexity). + Growing actual extrusions ensures that gaps not filled by medial axis + are not subtracted from fill surfaces (they might be too short gaps + that medial axis skips but infill might join with other infill regions + and use zigzag). */ + //FIXME Vojtech: This grows by a rounded extrusion width, not by line spacing, + // therefore it may cover the area, but no the volume. + last = diff_ex(last, gap_fill.polygons_covered_by_width(10.f)); + out_gap_fill.append(std::move(gap_fill.entities)); + } + } - // create one more offset to be used as boundary for fill - // we offset by half the perimeter spacing (to get to the actual infill boundary) - // and then we offset back and forth by half the infill spacing to only consider the - // non-collapsing regions - coord_t inset = - (loop_number < 0) ? 0 : - (loop_number == 0) ? - // one loop - ext_perimeter_spacing / 2 : - // two or more loops? - perimeter_spacing / 2; - // only apply infill overlap if we actually have one perimeter - if (inset > 0) - inset -= coord_t(scale_(this->config->get_abs_value("infill_overlap", unscale(inset + solid_infill_spacing / 2)))); - // simplify infill contours according to resolution - Polygons pp; - for (ExPolygon &ex : last) - ex.simplify_p(m_scaled_resolution, &pp); - // collapse too narrow infill areas - coord_t min_perimeter_infill_spacing = coord_t(solid_infill_spacing * (1. - INSET_OVERLAP_TOLERANCE)); - // append infill areas to fill_surfaces - this->fill_surfaces->append( - offset2_ex( - union_ex(pp), - float(- inset - min_perimeter_infill_spacing / 2.), - float(min_perimeter_infill_spacing / 2.)), - stInternal); - } // for each island -} - -bool PerimeterGeneratorLoop::is_internal_contour() const -{ - // An internal contour is a contour containing no other contours - if (! this->is_contour) - return false; - for (const PerimeterGeneratorLoop &loop : this->children) - if (loop.is_contour) - return false; - return true; + // create one more offset to be used as boundary for fill + // we offset by half the perimeter spacing (to get to the actual infill boundary) + // and then we offset back and forth by half the infill spacing to only consider the + // non-collapsing regions + coord_t inset = + (loop_number < 0) ? 0 : + (loop_number == 0) ? + // one loop + ext_perimeter_spacing / 2 : + // two or more loops? + perimeter_spacing / 2; + // only apply infill overlap if we actually have one perimeter + if (inset > 0) + inset -= coord_t(scale_(params.config.get_abs_value("infill_overlap", unscale(inset + solid_infill_spacing / 2)))); + // simplify infill contours according to resolution + Polygons pp; + for (ExPolygon &ex : last) + ex.simplify_p(params.scaled_resolution, &pp); + // collapse too narrow infill areas + coord_t min_perimeter_infill_spacing = coord_t(solid_infill_spacing * (1. - INSET_OVERLAP_TOLERANCE)); + // append infill areas to fill_surfaces + ExPolygons infill_areas = + offset2_ex( + union_ex(pp), + float(- inset - min_perimeter_infill_spacing / 2.), + float(min_perimeter_infill_spacing / 2.)); + + if (lower_slices != nullptr && params.config.overhangs && params.config.extra_perimeters_on_overhangs && + params.config.perimeters > 0 && params.layer_id > params.object_config.raft_layers) { + // Generate extra perimeters on overhang areas, and cut them to these parts only, to save print time and material + auto [extra_perimeters, filled_area] = generate_extra_perimeters_over_overhangs(infill_areas, + lower_slices_polygons_cache, + loop_number + 1, + params.overhang_flow, params.scaled_resolution, + params.object_config, params.print_config); + if (!extra_perimeters.empty()) { + ExtrusionEntityCollection &this_islands_perimeters = static_cast(*out_loops.entities.back()); + ExtrusionEntitiesPtr old_entities; + old_entities.swap(this_islands_perimeters.entities); + for (ExtrusionPaths &paths : extra_perimeters) + this_islands_perimeters.append(std::move(paths)); + append(this_islands_perimeters.entities, old_entities); + infill_areas = diff_ex(infill_areas, filled_area); + } + } + + append(out_fill_expolygons, std::move(infill_areas)); } } diff --git a/src/libslic3r/PerimeterGenerator.hpp b/src/libslic3r/PerimeterGenerator.hpp index ecf09c593d3..4908e4f77aa 100644 --- a/src/libslic3r/PerimeterGenerator.hpp +++ b/src/libslic3r/PerimeterGenerator.hpp @@ -3,6 +3,7 @@ #include "libslic3r.h" #include +#include "ExtrusionEntityCollection.hpp" #include "Flow.hpp" #include "Polygon.hpp" #include "PrintConfig.hpp" @@ -10,70 +11,93 @@ namespace Slic3r { -class PerimeterGenerator { -public: - // Inputs: - const SurfaceCollection *slices; - const ExPolygons *lower_slices; +namespace PerimeterGenerator +{ + +struct Parameters { + Parameters( + double layer_height, + int layer_id, + Flow perimeter_flow, + Flow ext_perimeter_flow, + Flow overhang_flow, + Flow solid_infill_flow, + const PrintRegionConfig &config, + const PrintObjectConfig &object_config, + const PrintConfig &print_config, + const bool spiral_vase) : + layer_height(layer_height), + layer_id(layer_id), + perimeter_flow(perimeter_flow), + ext_perimeter_flow(ext_perimeter_flow), + overhang_flow(overhang_flow), + solid_infill_flow(solid_infill_flow), + config(config), + object_config(object_config), + print_config(print_config), + spiral_vase(spiral_vase), + scaled_resolution(scaled(print_config.gcode_resolution.value)), + mm3_per_mm(perimeter_flow.mm3_per_mm()), + ext_mm3_per_mm(ext_perimeter_flow.mm3_per_mm()), + mm3_per_mm_overhang(overhang_flow.mm3_per_mm()) + { + } + + // Input parameters double layer_height; int layer_id; Flow perimeter_flow; Flow ext_perimeter_flow; Flow overhang_flow; Flow solid_infill_flow; - const PrintRegionConfig *config; - const PrintObjectConfig *object_config; - const PrintConfig *print_config; - // Outputs: - ExtrusionEntityCollection *loops; - ExtrusionEntityCollection *gap_fill; - SurfaceCollection *fill_surfaces; - - PerimeterGenerator( - // Input: - const SurfaceCollection* slices, - double layer_height, - Flow flow, - const PrintRegionConfig* config, - const PrintObjectConfig* object_config, - const PrintConfig* print_config, - const bool spiral_vase, - // Output: - // Loops with the external thin walls - ExtrusionEntityCollection* loops, - // Gaps without the thin walls - ExtrusionEntityCollection* gap_fill, - // Infills without the gap fills - SurfaceCollection* fill_surfaces) - : slices(slices), lower_slices(nullptr), layer_height(layer_height), - layer_id(-1), perimeter_flow(flow), ext_perimeter_flow(flow), - overhang_flow(flow), solid_infill_flow(flow), - config(config), object_config(object_config), print_config(print_config), - m_spiral_vase(spiral_vase), - m_scaled_resolution(scaled(print_config->gcode_resolution.value)), - loops(loops), gap_fill(gap_fill), fill_surfaces(fill_surfaces), - m_ext_mm3_per_mm(-1), m_mm3_per_mm(-1), m_mm3_per_mm_overhang(-1) - {} + const PrintRegionConfig &config; + const PrintObjectConfig &object_config; + const PrintConfig &print_config; - void process_classic(); - void process_arachne(); - - double ext_mm3_per_mm() const { return m_ext_mm3_per_mm; } - double mm3_per_mm() const { return m_mm3_per_mm; } - double mm3_per_mm_overhang() const { return m_mm3_per_mm_overhang; } - Polygons lower_slices_polygons() const { return m_lower_slices_polygons; } + // Derived parameters + bool spiral_vase; + double scaled_resolution; + double ext_mm3_per_mm; + double mm3_per_mm; + double mm3_per_mm_overhang; private: - bool m_spiral_vase; - double m_scaled_resolution; - double m_ext_mm3_per_mm; - double m_mm3_per_mm; - double m_mm3_per_mm_overhang; - Polygons m_lower_slices_polygons; + Parameters() = delete; }; +void process_classic( + // Inputs: + const Parameters ¶ms, + const Surface &surface, + const ExPolygons *lower_slices, + // Cache: + Polygons &lower_slices_polygons_cache, + // Output: + // Loops with the external thin walls + ExtrusionEntityCollection &out_loops, + // Gaps without the thin walls + ExtrusionEntityCollection &out_gap_fill, + // Infills without the gap fills + ExPolygons &out_fill_expolygons); + +void process_arachne( + // Inputs: + const Parameters ¶ms, + const Surface &surface, + const ExPolygons *lower_slices, + // Cache: + Polygons &lower_slices_polygons_cache, + // Output: + // Loops with the external thin walls + ExtrusionEntityCollection &out_loops, + // Gaps without the thin walls + ExtrusionEntityCollection &out_gap_fill, + // Infills without the gap fills + ExPolygons &out_fill_expolygons); + ExtrusionMultiPath thick_polyline_to_multi_path(const ThickPolyline &thick_polyline, ExtrusionRole role, const Flow &flow, float tolerance, float merge_tolerance); -} +} // namespace PerimeterGenerator +} // namespace Slic3r #endif diff --git a/src/libslic3r/PlaceholderParser.cpp b/src/libslic3r/PlaceholderParser.cpp index f763c8bb6c8..11ffd4a542b 100644 --- a/src/libslic3r/PlaceholderParser.cpp +++ b/src/libslic3r/PlaceholderParser.cpp @@ -40,11 +40,11 @@ #include #include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include #include #include @@ -167,93 +167,137 @@ namespace px = boost::phoenix; namespace client { - template + using Iterator = std::string::const_iterator; + using IteratorRange = boost::iterator_range; + struct OptWithPos { OptWithPos() {} - OptWithPos(ConfigOptionConstPtr opt, boost::iterator_range it_range) : opt(opt), it_range(it_range) {} - ConfigOptionConstPtr opt = nullptr; - boost::iterator_range it_range; + OptWithPos(ConfigOptionConstPtr opt, IteratorRange it_range, bool writable = false) : opt(opt), it_range(it_range), writable(writable) {} + ConfigOptionConstPtr opt { nullptr }; + bool writable { false }; + // -1 means it is a scalar variable, or it is a vector variable and index was not assigned yet or the whole vector is considered. + int index { -1 }; + IteratorRange it_range; + + bool empty() const { return opt == nullptr; } + bool has_index() const { return index != -1; } }; - template - std::ostream& operator<<(std::ostream& os, OptWithPos const& opt) + std::ostream& operator<<(std::ostream& os, OptWithPos const& opt) { os << std::string(opt.it_range.begin(), opt.it_range.end()); return os; } - template struct expr { - expr() : type(TYPE_EMPTY) {} - explicit expr(bool b) : type(TYPE_BOOL) { data.b = b; } - explicit expr(bool b, const Iterator &it_begin, const Iterator &it_end) : type(TYPE_BOOL), it_range(it_begin, it_end) { data.b = b; } - explicit expr(int i) : type(TYPE_INT) { data.i = i; } - explicit expr(int i, const Iterator &it_begin, const Iterator &it_end) : type(TYPE_INT), it_range(it_begin, it_end) { data.i = i; } - explicit expr(double d) : type(TYPE_DOUBLE) { data.d = d; } - explicit expr(double d, const Iterator &it_begin, const Iterator &it_end) : type(TYPE_DOUBLE), it_range(it_begin, it_end) { data.d = d; } - explicit expr(const char *s) : type(TYPE_STRING) { data.s = new std::string(s); } - explicit expr(const std::string &s) : type(TYPE_STRING) { data.s = new std::string(s); } + expr() {} + expr(const expr &rhs) : m_type(rhs.type()), it_range(rhs.it_range) + { if (rhs.type() == TYPE_STRING) m_data.s = new std::string(*rhs.m_data.s); else m_data.set(rhs.m_data); } + expr(expr &&rhs) : expr(std::move(rhs), rhs.it_range.begin(), rhs.it_range.end()) {} + + explicit expr(bool b) : m_type(TYPE_BOOL) { m_data.b = b; } + explicit expr(bool b, const Iterator &it_begin, const Iterator &it_end) : m_type(TYPE_BOOL), it_range(it_begin, it_end) { m_data.b = b; } + explicit expr(int i) : m_type(TYPE_INT) { m_data.i = i; } + explicit expr(int i, const Iterator &it_begin, const Iterator &it_end) : m_type(TYPE_INT), it_range(it_begin, it_end) { m_data.i = i; } + explicit expr(double d) : m_type(TYPE_DOUBLE) { m_data.d = d; } + explicit expr(double d, const Iterator &it_begin, const Iterator &it_end) : m_type(TYPE_DOUBLE), it_range(it_begin, it_end) { m_data.d = d; } + explicit expr(const char *s) : m_type(TYPE_STRING) { m_data.s = new std::string(s); } + explicit expr(const std::string &s) : m_type(TYPE_STRING) { m_data.s = new std::string(s); } explicit expr(const std::string &s, const Iterator &it_begin, const Iterator &it_end) : - type(TYPE_STRING), it_range(it_begin, it_end) { data.s = new std::string(s); } - expr(const expr &rhs) : type(rhs.type), it_range(rhs.it_range) - { if (rhs.type == TYPE_STRING) data.s = new std::string(*rhs.data.s); else data.set(rhs.data); } - explicit expr(expr &&rhs) : type(rhs.type), it_range(rhs.it_range) - { data.set(rhs.data); rhs.type = TYPE_EMPTY; } - explicit expr(expr &&rhs, const Iterator &it_begin, const Iterator &it_end) : type(rhs.type), it_range(it_begin, it_end) - { data.set(rhs.data); rhs.type = TYPE_EMPTY; } - ~expr() { this->reset(); } - - expr &operator=(const expr &rhs) + m_type(TYPE_STRING), it_range(it_begin, it_end) { m_data.s = new std::string(s); } + explicit expr(expr &&rhs, const Iterator &it_begin, const Iterator &it_end) : m_type(rhs.type()), it_range{ it_begin, it_end } + { + m_data.set(rhs.m_data); + rhs.m_type = TYPE_EMPTY; + } + expr &operator=(const expr &rhs) { - this->type = rhs.type; - this->it_range = rhs.it_range; - if (rhs.type == TYPE_STRING) - this->data.s = new std::string(*rhs.data.s); - else - this->data.set(rhs.data); - return *this; + if (rhs.type() == TYPE_STRING) { + this->set_s(rhs.s()); + } else { + m_type = rhs.type(); + m_data.set(rhs.m_data); + } + this->it_range = rhs.it_range; + return *this; } expr &operator=(expr &&rhs) { - type = rhs.type; - this->it_range = rhs.it_range; - data.set(rhs.data); - rhs.type = TYPE_EMPTY; + if (this != &rhs) { + this->reset(); + m_type = rhs.type(); + this->it_range = rhs.it_range; + m_data.set(rhs.m_data); + rhs.m_type = TYPE_EMPTY; + } return *this; } void reset() { - if (this->type == TYPE_STRING) - delete data.s; - this->type = TYPE_EMPTY; - } - - bool& b() { return data.b; } - bool b() const { return data.b; } - void set_b(bool v) { this->reset(); this->data.b = v; this->type = TYPE_BOOL; } - int& i() { return data.i; } - int i() const { return data.i; } - void set_i(int v) { this->reset(); this->data.i = v; this->type = TYPE_INT; } - int as_i() const { return (this->type == TYPE_INT) ? this->i() : int(this->d()); } - int as_i_rounded() const { return (this->type == TYPE_INT) ? this->i() : int(std::round(this->d())); } - double& d() { return data.d; } - double d() const { return data.d; } - void set_d(double v) { this->reset(); this->data.d = v; this->type = TYPE_DOUBLE; } - double as_d() const { return (this->type == TYPE_DOUBLE) ? this->d() : double(this->i()); } - std::string& s() { return *data.s; } - const std::string& s() const { return *data.s; } - void set_s(const std::string &s) { this->reset(); this->data.s = new std::string(s); this->type = TYPE_STRING; } - void set_s(std::string &&s) { this->reset(); this->data.s = new std::string(std::move(s)); this->type = TYPE_STRING; } + if (this->type() == TYPE_STRING) + delete m_data.s; + m_type = TYPE_EMPTY; + } + ~expr() { reset(); } + + enum Type { + TYPE_EMPTY = 0, + TYPE_BOOL, + TYPE_INT, + TYPE_DOUBLE, + TYPE_STRING, + }; + Type type() const { return m_type; } + bool numeric_type() const { return m_type == TYPE_INT || m_type == TYPE_DOUBLE; } + + bool& b() { return m_data.b; } + bool b() const { return m_data.b; } + void set_b(bool v) { this->reset(); this->set_b_lite(v); } + void set_b_lite(bool v) { assert(this->type() != TYPE_STRING); Data tmp; tmp.b = v; m_data.set(tmp); m_type = TYPE_BOOL; } + int& i() { return m_data.i; } + int i() const { return m_data.i; } + void set_i(int v) { this->reset(); set_i_lite(v); } + void set_i_lite(int v) { assert(this->type() != TYPE_STRING); Data tmp; tmp.i = v; m_data.set(tmp); m_type = TYPE_INT; } + int as_i() const { return this->type() == TYPE_INT ? this->i() : int(this->d()); } + int as_i_rounded() const { return this->type() == TYPE_INT ? this->i() : int(std::round(this->d())); } + double& d() { return m_data.d; } + double d() const { return m_data.d; } + void set_d(double v) { this->reset(); this->set_d_lite(v); } + void set_d_lite(double v) { assert(this->type() != TYPE_STRING); Data tmp; tmp.d = v; m_data.set(tmp); m_type = TYPE_DOUBLE; } + double as_d() const { return this->type() == TYPE_DOUBLE ? this->d() : double(this->i()); } + std::string& s() { return *m_data.s; } + const std::string& s() const { return *m_data.s; } + void set_s(const std::string &s) { + if (this->type() == TYPE_STRING) + *m_data.s = s; + else + this->set_s_take_ownership(new std::string(s)); + } + void set_s(std::string &&s) { + if (this->type() == TYPE_STRING) + *m_data.s = std::move(s); + else + this->set_s_take_ownership(new std::string(std::move(s))); + } + void set_s(const char *s) { + if (this->type() == TYPE_STRING) + *m_data.s = s; + else + this->set_s_take_ownership(new std::string(s)); + } std::string to_string() const { std::string out; - switch (type) { - case TYPE_BOOL: out = data.b ? "true" : "false"; break; - case TYPE_INT: out = std::to_string(data.i); break; + switch (this->type()) { + case TYPE_EMPTY: + // Inside an if / else block to be skipped. + break; + case TYPE_BOOL: out = this->b() ? "true" : "false"; break; + case TYPE_INT: out = std::to_string(this->i()); break; case TYPE_DOUBLE: #if 0 // The default converter produces trailing zeros after the decimal point. @@ -263,52 +307,31 @@ namespace client // It seems to be doing what the old boost::to_string() did. { std::ostringstream ss; - ss << data.d; + ss << this->d(); out = ss.str(); } #endif break; - case TYPE_STRING: out = *data.s; break; + case TYPE_STRING: out = this->s(); break; default: break; } return out; } - union Data { - // Raw image of the other data members. - // The C++ compiler will consider a possible aliasing of char* with any other union member, - // therefore copying the raw data is safe. - char raw[8]; - bool b; - int i; - double d; - std::string *s; - - // Copy the largest member variable through char*, which will alias with all other union members by default. - void set(const Data &rhs) { memcpy(this->raw, rhs.raw, sizeof(rhs.raw)); } - } data; - - enum Type { - TYPE_EMPTY = 0, - TYPE_BOOL, - TYPE_INT, - TYPE_DOUBLE, - TYPE_STRING, - }; - - Type type; - // Range of input iterators covering this expression. // Used for throwing parse exceptions. - boost::iterator_range it_range; + IteratorRange it_range; expr unary_minus(const Iterator start_pos) const { - switch (this->type) { + switch (this->type()) { + case TYPE_EMPTY: + // Inside an if / else block to be skipped. + return expr(); case TYPE_INT : - return expr(- this->i(), start_pos, this->it_range.end()); + return expr(- this->i(), start_pos, this->it_range.end()); case TYPE_DOUBLE: - return expr(- this->d(), start_pos, this->it_range.end()); + return expr(- this->d(), start_pos, this->it_range.end()); default: this->throw_exception("Cannot apply unary minus operator."); } @@ -319,11 +342,14 @@ namespace client expr unary_integer(const Iterator start_pos) const { - switch (this->type) { + switch (this->type()) { + case TYPE_EMPTY: + // Inside an if / else block to be skipped. + return expr(); case TYPE_INT: - return expr(this->i(), start_pos, this->it_range.end()); + return expr(this->i(), start_pos, this->it_range.end()); case TYPE_DOUBLE: - return expr(static_cast(this->d()), start_pos, this->it_range.end()); + return expr(static_cast(this->d()), start_pos, this->it_range.end()); default: this->throw_exception("Cannot convert to integer."); } @@ -334,11 +360,14 @@ namespace client expr round(const Iterator start_pos) const { - switch (this->type) { + switch (this->type()) { + case TYPE_EMPTY: + // Inside an if / else block to be skipped. + return expr(); case TYPE_INT: - return expr(this->i(), start_pos, this->it_range.end()); + return expr(this->i(), start_pos, this->it_range.end()); case TYPE_DOUBLE: - return expr(static_cast(std::round(this->d())), start_pos, this->it_range.end()); + return expr(static_cast(std::round(this->d())), start_pos, this->it_range.end()); default: this->throw_exception("Cannot round a non-numeric value."); } @@ -349,9 +378,12 @@ namespace client expr unary_not(const Iterator start_pos) const { - switch (this->type) { + switch (this->type()) { + case TYPE_EMPTY: + // Inside an if / else block to be skipped. + return expr(); case TYPE_BOOL: - return expr(! this->b(), start_pos, this->it_range.end()); + return expr(! this->b(), start_pos, this->it_range.end()); default: this->throw_exception("Cannot apply a not operator."); } @@ -362,105 +394,122 @@ namespace client expr &operator+=(const expr &rhs) { - if (this->type == TYPE_STRING) { + if (this->type() == TYPE_EMPTY) { + // Inside an if / else block to be skipped. + } else if (this->type() == TYPE_STRING) { // Convert the right hand side to string and append. - *this->data.s += rhs.to_string(); - } else if (rhs.type == TYPE_STRING) { + *m_data.s += rhs.to_string(); + } else if (rhs.type() == TYPE_STRING) { // Conver the left hand side to string, append rhs. - this->data.s = new std::string(this->to_string() + rhs.s()); - this->type = TYPE_STRING; + this->set_s(this->to_string() + rhs.s()); } else { const char *err_msg = "Cannot add non-numeric types."; this->throw_if_not_numeric(err_msg); rhs.throw_if_not_numeric(err_msg); - if (this->type == TYPE_DOUBLE || rhs.type == TYPE_DOUBLE) { - double d = this->as_d() + rhs.as_d(); - this->data.d = d; - this->type = TYPE_DOUBLE; - } else - this->data.i += rhs.i(); + if (this->type() == TYPE_DOUBLE || rhs.type() == TYPE_DOUBLE) + this->set_d_lite(this->as_d() + rhs.as_d()); + else + m_data.i += rhs.i(); } - this->it_range = boost::iterator_range(this->it_range.begin(), rhs.it_range.end()); + this->it_range = IteratorRange(this->it_range.begin(), rhs.it_range.end()); return *this; } expr &operator-=(const expr &rhs) { - const char *err_msg = "Cannot subtract non-numeric types."; - this->throw_if_not_numeric(err_msg); - rhs.throw_if_not_numeric(err_msg); - if (this->type == TYPE_DOUBLE || rhs.type == TYPE_DOUBLE) { - double d = this->as_d() - rhs.as_d(); - this->data.d = d; - this->type = TYPE_DOUBLE; - } else - this->data.i -= rhs.i(); - this->it_range = boost::iterator_range(this->it_range.begin(), rhs.it_range.end()); + if (this->type() == TYPE_EMPTY) { + // Inside an if / else block to be skipped. + this->reset(); + } else { + const char *err_msg = "Cannot subtract non-numeric types."; + this->throw_if_not_numeric(err_msg); + rhs.throw_if_not_numeric(err_msg); + if (this->type() == TYPE_DOUBLE || rhs.type() == TYPE_DOUBLE) + this->set_d_lite(this->as_d() - rhs.as_d()); + else + m_data.i -= rhs.i(); + this->it_range = IteratorRange(this->it_range.begin(), rhs.it_range.end()); + } return *this; } expr &operator*=(const expr &rhs) { - const char *err_msg = "Cannot multiply with non-numeric type."; - this->throw_if_not_numeric(err_msg); - rhs.throw_if_not_numeric(err_msg); - if (this->type == TYPE_DOUBLE || rhs.type == TYPE_DOUBLE) { - double d = this->as_d() * rhs.as_d(); - this->data.d = d; - this->type = TYPE_DOUBLE; - } else - this->data.i *= rhs.i(); - this->it_range = boost::iterator_range(this->it_range.begin(), rhs.it_range.end()); + if (this->type() == TYPE_EMPTY) { + // Inside an if / else block to be skipped. + this->reset(); + } else { + const char *err_msg = "Cannot multiply with non-numeric type."; + this->throw_if_not_numeric(err_msg); + rhs.throw_if_not_numeric(err_msg); + if (this->type() == TYPE_DOUBLE || rhs.type() == TYPE_DOUBLE) + this->set_d_lite(this->as_d() * rhs.as_d()); + else + m_data.i *= rhs.i(); + this->it_range = IteratorRange(this->it_range.begin(), rhs.it_range.end()); + } return *this; } expr &operator/=(const expr &rhs) { - this->throw_if_not_numeric("Cannot divide a non-numeric type."); - rhs.throw_if_not_numeric("Cannot divide with a non-numeric type."); - if ((rhs.type == TYPE_INT) ? (rhs.i() == 0) : (rhs.d() == 0.)) - rhs.throw_exception("Division by zero"); - if (this->type == TYPE_DOUBLE || rhs.type == TYPE_DOUBLE) { - double d = this->as_d() / rhs.as_d(); - this->data.d = d; - this->type = TYPE_DOUBLE; - } else - this->data.i /= rhs.i(); - this->it_range = boost::iterator_range(this->it_range.begin(), rhs.it_range.end()); + if (this->type() == TYPE_EMPTY) { + // Inside an if / else block to be skipped. + this->reset(); + } else { + this->throw_if_not_numeric("Cannot divide a non-numeric type."); + rhs.throw_if_not_numeric("Cannot divide with a non-numeric type."); + if (rhs.type() == TYPE_INT ? (rhs.i() == 0) : (rhs.d() == 0.)) + rhs.throw_exception("Division by zero"); + if (this->type() == TYPE_DOUBLE || rhs.type() == TYPE_DOUBLE) + this->set_d_lite(this->as_d() / rhs.as_d()); + else + m_data.i /= rhs.i(); + this->it_range = IteratorRange(this->it_range.begin(), rhs.it_range.end()); + } return *this; } expr &operator%=(const expr &rhs) { - this->throw_if_not_numeric("Cannot divide a non-numeric type."); - rhs.throw_if_not_numeric("Cannot divide with a non-numeric type."); - if ((rhs.type == TYPE_INT) ? (rhs.i() == 0) : (rhs.d() == 0.)) - rhs.throw_exception("Division by zero"); - if (this->type == TYPE_DOUBLE || rhs.type == TYPE_DOUBLE) { - double d = std::fmod(this->as_d(), rhs.as_d()); - this->data.d = d; - this->type = TYPE_DOUBLE; - } else - this->data.i %= rhs.i(); - this->it_range = boost::iterator_range(this->it_range.begin(), rhs.it_range.end()); + if (this->type() == TYPE_EMPTY) { + // Inside an if / else block to be skipped. + this->reset(); + } else { + this->throw_if_not_numeric("Cannot divide a non-numeric type."); + rhs.throw_if_not_numeric("Cannot divide with a non-numeric type."); + if (rhs.type() == TYPE_INT ? (rhs.i() == 0) : (rhs.d() == 0.)) + rhs.throw_exception("Division by zero"); + if (this->type() == TYPE_DOUBLE || rhs.type() == TYPE_DOUBLE) + this->set_d_lite(std::fmod(this->as_d(), rhs.as_d())); + else + m_data.i %= rhs.i(); + this->it_range = IteratorRange(this->it_range.begin(), rhs.it_range.end()); + } return *this; } static void to_string2(expr &self, std::string &out) { - out = self.to_string(); + if (self.type() != TYPE_EMPTY) + // Not inside an if / else block to be skipped + out = self.to_string(); } static void evaluate_boolean(expr &self, bool &out) { - if (self.type != TYPE_BOOL) - self.throw_exception("Not a boolean expression"); - out = self.b(); + if (self.type() != TYPE_EMPTY) { + // Not inside an if / else block to be skipped + if (self.type() != TYPE_BOOL) + self.throw_exception("Not a boolean expression"); + out = self.b(); + } } static void evaluate_boolean_to_string(expr &self, std::string &out) { - if (self.type != TYPE_BOOL) + assert(self.type() != TYPE_EMPTY); + if (self.type() != TYPE_BOOL) self.throw_exception("Not a boolean expression"); out = self.b() ? "true" : "false"; } @@ -468,32 +517,34 @@ namespace client // Is lhs==rhs? Store the result into lhs. static void compare_op(expr &lhs, expr &rhs, char op, bool invert) { + if (lhs.type() == TYPE_EMPTY) + // Inside an if / else block to be skipped + return; bool value = false; - if ((lhs.type == TYPE_INT || lhs.type == TYPE_DOUBLE) && - (rhs.type == TYPE_INT || rhs.type == TYPE_DOUBLE)) { + if (lhs.numeric_type() && rhs.numeric_type()) { // Both types are numeric. switch (op) { case '=': - value = (lhs.type == TYPE_DOUBLE || rhs.type == TYPE_DOUBLE) ? + value = (lhs.type() == TYPE_DOUBLE || rhs.type() == TYPE_DOUBLE) ? (std::abs(lhs.as_d() - rhs.as_d()) < 1e-8) : (lhs.i() == rhs.i()); break; case '<': - value = (lhs.type == TYPE_DOUBLE || rhs.type == TYPE_DOUBLE) ? + value = (lhs.type() == TYPE_DOUBLE || rhs.type() == TYPE_DOUBLE) ? (lhs.as_d() < rhs.as_d()) : (lhs.i() < rhs.i()); break; case '>': default: - value = (lhs.type == TYPE_DOUBLE || rhs.type == TYPE_DOUBLE) ? + value = (lhs.type() == TYPE_DOUBLE || rhs.type() == TYPE_DOUBLE) ? (lhs.as_d() > rhs.as_d()) : (lhs.i() > rhs.i()); break; } - } else if (lhs.type == TYPE_BOOL && rhs.type == TYPE_BOOL) { + } else if (lhs.type() == TYPE_BOOL && rhs.type() == TYPE_BOOL) { // Both type are bool. if (op != '=') boost::throw_exception(qi::expectation_failure( lhs.it_range.begin(), rhs.it_range.end(), spirit::info("*Cannot compare the types."))); value = lhs.b() == rhs.b(); - } else if (lhs.type == TYPE_STRING || rhs.type == TYPE_STRING) { + } else if (lhs.type() == TYPE_STRING || rhs.type() == TYPE_STRING) { // One type is string, the other could be converted to string. value = (op == '=') ? (lhs.to_string() == rhs.to_string()) : (op == '<') ? (lhs.to_string() < rhs.to_string()) : (lhs.to_string() > rhs.to_string()); @@ -501,8 +552,8 @@ namespace client boost::throw_exception(qi::expectation_failure( lhs.it_range.begin(), rhs.it_range.end(), spirit::info("*Cannot compare the types."))); } - lhs.type = TYPE_BOOL; - lhs.data.b = invert ? ! value : value; + lhs.reset(); + lhs.set_b_lite(invert ? ! value : value); } // Compare operators, store the result into lhs. static void equal (expr &lhs, expr &rhs) { compare_op(lhs, rhs, '=', false); } @@ -525,17 +576,19 @@ namespace client // Store the result into param1. static void function_2params(expr ¶m1, expr ¶m2, Function2ParamsType fun) { + if (param1.type() == TYPE_EMPTY) + // Inside an if / else block to be skipped + return; throw_if_not_numeric(param1); throw_if_not_numeric(param2); - if (param1.type == TYPE_DOUBLE || param2.type == TYPE_DOUBLE) { + if (param1.type() == TYPE_DOUBLE || param2.type() == TYPE_DOUBLE) { double d = 0.; switch (fun) { case FUNCTION_MIN: d = std::min(param1.as_d(), param2.as_d()); break; case FUNCTION_MAX: d = std::max(param1.as_d(), param2.as_d()); break; default: param1.throw_exception("Internal error: invalid function"); } - param1.data.d = d; - param1.type = TYPE_DOUBLE; + param1.set_d_lite(d); } else { int i = 0; switch (fun) { @@ -543,8 +596,7 @@ namespace client case FUNCTION_MAX: i = std::max(param1.as_i(), param2.as_i()); break; default: param1.throw_exception("Internal error: invalid function"); } - param1.data.i = i; - param1.type = TYPE_INT; + param1.set_i_lite(i); } } // Store the result into param1. @@ -554,15 +606,15 @@ namespace client // Store the result into param1. static void random(expr ¶m1, expr ¶m2, std::mt19937 &rng) { + if (param1.type() == TYPE_EMPTY) + // Inside an if / else block to be skipped + return; throw_if_not_numeric(param1); throw_if_not_numeric(param2); - if (param1.type == TYPE_DOUBLE || param2.type == TYPE_DOUBLE) { - param1.data.d = std::uniform_real_distribution<>(param1.as_d(), param2.as_d())(rng); - param1.type = TYPE_DOUBLE; - } else { - param1.data.i = std::uniform_int_distribution<>(param1.as_i(), param2.as_i())(rng); - param1.type = TYPE_INT; - } + if (param1.type() == TYPE_DOUBLE || param2.type() == TYPE_DOUBLE) + param1.set_d_lite(std::uniform_real_distribution<>(param1.as_d(), param2.as_d())(rng)); + else + param1.set_i_lite(std::uniform_int_distribution<>(param1.as_i(), param2.as_i())(rng)); } // Store the result into param1. @@ -570,11 +622,14 @@ namespace client template static void digits(expr ¶m1, expr ¶m2, expr ¶m3) { + if (param1.type() == TYPE_EMPTY) + // Inside an if / else block to be skipped + return; throw_if_not_numeric(param1); - if (param2.type != TYPE_INT) + if (param2.type() != TYPE_INT) param2.throw_exception("digits: second parameter must be integer"); - bool has_decimals = param3.type != TYPE_EMPTY; - if (has_decimals && param3.type != TYPE_INT) + bool has_decimals = param3.type() != TYPE_EMPTY; + if (has_decimals && param3.type() != TYPE_INT) param3.throw_exception("digits: third parameter must be integer"); char buf[256]; @@ -589,10 +644,13 @@ namespace client param1.set_s(buf); } - static void regex_op(expr &lhs, boost::iterator_range &rhs, char op) + static void regex_op(const expr &lhs, IteratorRange &rhs, char op, expr &out) { + if (lhs.type() == TYPE_EMPTY) + // Inside an if / else block to be skipped + return; const std::string *subject = nullptr; - if (lhs.type == TYPE_STRING) { + if (lhs.type() == TYPE_STRING) { // One type is string, the other could be converted to string. subject = &lhs.s(); } else { @@ -603,9 +661,7 @@ namespace client bool result = SLIC3R_REGEX_NAMESPACE::regex_match(*subject, SLIC3R_REGEX_NAMESPACE::regex(pattern)); if (op == '!') result = ! result; - lhs.reset(); - lhs.type = TYPE_BOOL; - lhs.data.b = result; + out.set_b(result); } catch (SLIC3R_REGEX_NAMESPACE::regex_error &ex) { // Syntax error in the regular expression boost::throw_exception(qi::expectation_failure( @@ -613,42 +669,65 @@ namespace client } } - static void regex_matches (expr &lhs, boost::iterator_range &rhs) { return regex_op(lhs, rhs, '='); } - static void regex_doesnt_match(expr &lhs, boost::iterator_range &rhs) { return regex_op(lhs, rhs, '!'); } + static void regex_matches (expr &lhs, IteratorRange &rhs) { return regex_op(lhs, rhs, '=', lhs); } + static void regex_doesnt_match(expr &lhs, IteratorRange &rhs) { return regex_op(lhs, rhs, '!', lhs); } + + static void one_of_test_init(expr &out) { + out.set_b(false); + } + template + static void one_of_test(const expr &match, const expr &pattern, expr &out) { + if (match.type() == TYPE_EMPTY) { + // Inside an if / else block to be skipped + out.reset(); + return; + } + if (! out.b()) { + if (match.type() != TYPE_STRING) + match.throw_exception("one_of(): First parameter (the string to match against) has to be a string value"); + if (pattern.type() != TYPE_STRING) + match.throw_exception("one_of(): Pattern has to be a string value"); + if (RegEx) { + try { + out.set_b(SLIC3R_REGEX_NAMESPACE::regex_match(match.s(), SLIC3R_REGEX_NAMESPACE::regex(pattern.s()))); + } catch (SLIC3R_REGEX_NAMESPACE::regex_error &) { + // Syntax error in the regular expression + pattern.throw_exception("Regular expression compilation failed"); + } + } else + out.set_b(match.s() == pattern.s()); + } + } + static void one_of_test_regex(const expr &match, IteratorRange &pattern, expr &out) { + if (match.type() == TYPE_EMPTY) { + // Inside an if / else block to be skipped + out.reset(); + return; + } + if (! out.b()) { + if (match.type() != TYPE_STRING) + match.throw_exception("one_of(): First parameter (the string to match against) has to be a string value"); + regex_op(match, pattern, '=', out); + } + } static void logical_op(expr &lhs, expr &rhs, char op) { + if (lhs.type() == TYPE_EMPTY) + // Inside an if / else block to be skipped + return; bool value = false; - if (lhs.type == TYPE_BOOL && rhs.type == TYPE_BOOL) { + if (lhs.type() == TYPE_BOOL && rhs.type() == TYPE_BOOL) { value = (op == '|') ? (lhs.b() || rhs.b()) : (lhs.b() && rhs.b()); } else { boost::throw_exception(qi::expectation_failure( lhs.it_range.begin(), rhs.it_range.end(), spirit::info("*Cannot apply logical operation to non-boolean operators."))); } - lhs.type = TYPE_BOOL; - lhs.data.b = value; + lhs.set_b_lite(value); } static void logical_or (expr &lhs, expr &rhs) { logical_op(lhs, rhs, '|'); } static void logical_and(expr &lhs, expr &rhs) { logical_op(lhs, rhs, '&'); } - static void ternary_op(expr &lhs, expr &rhs1, expr &rhs2) - { - if (lhs.type != TYPE_BOOL) - lhs.throw_exception("Not a boolean expression"); - if (lhs.b()) - lhs = std::move(rhs1); - else - lhs = std::move(rhs2); - } - - static void set_if(bool &cond, bool ¬_yet_consumed, std::string &str_in, std::string &str_out) - { - if (cond && not_yet_consumed) { - str_out = str_in; - not_yet_consumed = false; - } - } - void throw_exception(const char *message) const { boost::throw_exception(qi::expectation_failure( @@ -657,17 +736,32 @@ namespace client void throw_if_not_numeric(const char *message) const { - if (this->type != TYPE_INT && this->type != TYPE_DOUBLE) + if (! this->numeric_type()) this->throw_exception(message); } + + private: + // This object will take ownership of the parameter string object "s". + void set_s_take_ownership(std::string* s) { assert(this->type() != TYPE_STRING); Data tmp; tmp.s = s; m_data.set(tmp); m_type = TYPE_STRING; } + + Type m_type = TYPE_EMPTY; + + union Data { + bool b; + int i; + double d; + std::string *s; + + // Copy the largest member variable through char*, which will alias with all other union members by default. + void set(const Data &rhs) { memcpy(this, &rhs, sizeof(rhs)); } + } m_data; }; - template - std::ostream& operator<<(std::ostream &os, const expr &expression) + std::ostream& operator<<(std::ostream &os, const expr &expression) { - typedef expr Expr; + typedef expr Expr; os << std::string(expression.it_range.begin(), expression.it_range.end()) << " - "; - switch (expression.type) { + switch (expression.type()) { case Expr::TYPE_EMPTY: os << "empty"; break; case Expr::TYPE_BOOL: os << "bool (" << expression.b() << ")"; break; case Expr::TYPE_INT: os << "int (" << expression.i() << ")"; break; @@ -679,10 +773,19 @@ namespace client } struct MyContext : public ConfigOptionResolver { + // Config provided as a parameter to PlaceholderParser invocation, overriding PlaceholderParser stored config. const DynamicConfig *external_config = nullptr; + // Config stored inside PlaceholderParser. const DynamicConfig *config = nullptr; + // Config provided as a parameter to PlaceholderParser invocation, evaluated after the two configs above. const DynamicConfig *config_override = nullptr; + // Config provided as a parameter to PlaceholderParser invocation, containing variables that will be read out + // and processed by the PlaceholderParser callee. + mutable DynamicConfig *config_outputs = nullptr; + // Local variables, read / write + mutable DynamicConfig config_local; size_t current_extruder_id = 0; + // Random number generator and optionally global variables. PlaceholderParser::ContextData *context_data = nullptr; // If false, the macro_processor will evaluate a full macro. // If true, the macro processor will evaluate just a boolean condition using the full expressive power of the macro processor. @@ -692,7 +795,34 @@ namespace client // Table to translate symbol tag to a human readable error message. static std::map tag_to_error_message; - static void evaluate_full_macro(const MyContext *ctx, bool &result) { result = ! ctx->just_boolean_expression; } + // Should the parser consider the parsed string to be a macro or a boolean expression? + static bool evaluate_full_macro(const MyContext *ctx) { return ! ctx->just_boolean_expression; } + + // Entering a conditional block. + static void block_enter(const MyContext *ctx, const bool condition) + { + if (ctx->skipping() || ! condition) + ++ ctx->m_depth_suppressed; + } + // Exiting a conditional block. + static void block_exit(const MyContext *ctx, const bool condition, bool ¬_yet_consumed, std::string &data_in, std::string &data_out) + { + if (ctx->skipping()) + -- ctx->m_depth_suppressed; + else if (condition && not_yet_consumed) { + data_out = std::move(data_in); + not_yet_consumed = false; + } + } + static void block_exit_ternary(const MyContext* ctx, const bool condition, expr &data_in, expr &data_out) + { + if (ctx->skipping()) + -- ctx->m_depth_suppressed; + else if (condition) + data_out = std::move(data_in); + } + // Inside a block, which is conditionally suppressed? + bool skipping() const { return m_depth_suppressed > 0; } const ConfigOption* optptr(const t_config_option_key &opt_key) const override { @@ -707,13 +837,30 @@ namespace client } const ConfigOption* resolve_symbol(const std::string &opt_key) const { return this->optptr(opt_key); } + ConfigOption* resolve_output_symbol(const std::string &opt_key) const { + ConfigOption *out = nullptr; + if (this->config_outputs) + out = this->config_outputs->optptr(opt_key, false); + if (out == nullptr && this->context_data != nullptr && this->context_data->global_config) + out = this->context_data->global_config->optptr(opt_key); + if (out == nullptr) + out = this->config_local.optptr(opt_key); + return out; + } + void store_new_variable(const std::string &opt_key, std::unique_ptr &&opt, bool global_variable) { + assert(opt); + if (global_variable) { + assert(this->context_data != nullptr && this->context_data->global_config); + this->context_data->global_config->set_key_value(opt_key, opt.release()); + } else + this->config_local.set_key_value(opt_key, opt.release()); + } - template - static void legacy_variable_expansion( - const MyContext *ctx, - boost::iterator_range &opt_key, - std::string &output) + static void legacy_variable_expansion(const MyContext *ctx, IteratorRange &opt_key, std::string &output) { + if (ctx->skipping()) + return; + std::string opt_key_str(opt_key.begin(), opt_key.end()); const ConfigOption *opt = ctx->resolve_symbol(opt_key_str); size_t idx = ctx->current_extruder_id; @@ -728,12 +875,12 @@ namespace client char *endptr = nullptr; idx = strtol(opt_key_str.c_str() + idx + 1, &endptr, 10); if (endptr == nullptr || *endptr != 0) - ctx->throw_exception("Invalid vector index", boost::iterator_range(opt_key.begin() + idx + 1, opt_key.end())); + ctx->throw_exception("Invalid vector index", IteratorRange(opt_key.begin() + idx + 1, opt_key.end())); } } } if (opt == nullptr) - ctx->throw_exception("Variable does not exist", boost::iterator_range(opt_key.begin(), opt_key.end())); + ctx->throw_exception("Variable does not exist", IteratorRange(opt_key.begin(), opt_key.end())); if (opt->is_scalar()) output = opt->serialize(); else { @@ -744,13 +891,15 @@ namespace client } } - template static void legacy_variable_expansion2( - const MyContext *ctx, - boost::iterator_range &opt_key, - boost::iterator_range &opt_vector_index, - std::string &output) + const MyContext *ctx, + IteratorRange &opt_key, + IteratorRange &opt_vector_index, + std::string &output) { + if (ctx->skipping()) + return; + std::string opt_key_str(opt_key.begin(), opt_key.end()); const ConfigOption *opt = ctx->resolve_symbol(opt_key_str); if (opt == nullptr) { @@ -763,7 +912,7 @@ namespace client ctx->throw_exception("Trying to index a scalar variable", opt_key); const ConfigOptionVectorBase *vec = static_cast(opt); if (vec->empty()) - ctx->throw_exception("Indexing an empty vector variable", boost::iterator_range(opt_key.begin(), opt_key.end())); + ctx->throw_exception("Indexing an empty vector variable", IteratorRange(opt_key.begin(), opt_key.end())); const ConfigOption *opt_index = ctx->resolve_symbol(std::string(opt_vector_index.begin(), opt_vector_index.end())); if (opt_index == nullptr) ctx->throw_exception("Variable does not exist", opt_key); @@ -775,133 +924,617 @@ namespace client output = vec->vserialize()[(idx >= (int)vec->size()) ? 0 : idx]; } - template static void resolve_variable( - const MyContext *ctx, - boost::iterator_range &opt_key, - OptWithPos &output) + const MyContext *ctx, + IteratorRange &opt_key, + OptWithPos &output) { - const ConfigOption *opt = ctx->resolve_symbol(std::string(opt_key.begin(), opt_key.end())); - if (opt == nullptr) - ctx->throw_exception("Not a variable name", opt_key); - output.opt = opt; + if (! ctx->skipping()) { + const std::string key{ opt_key.begin(), opt_key.end() }; + const ConfigOption *opt = ctx->resolve_symbol(key); + if (opt == nullptr) { + opt = ctx->resolve_output_symbol(key); + if (opt == nullptr) + ctx->throw_exception("Not a variable name", opt_key); + output.writable = true; + } + output.opt = opt; + } output.it_range = opt_key; } - template - static void scalar_variable_reference( - const MyContext *ctx, - OptWithPos &opt, - expr &output) + static void store_variable_index( + const MyContext *ctx, + OptWithPos &opt, + int index, + Iterator it_end, + OptWithPos &output) { - if (opt.opt->is_vector()) - ctx->throw_exception("Referencing a vector variable when scalar is expected", opt.it_range); + if (! ctx->skipping()) { + if (! opt.opt->is_vector()) + ctx->throw_exception("Cannot index a scalar variable", opt.it_range); + if (index < 0) + ctx->throw_exception("Referencing a vector variable with a negative index", opt.it_range); + output = opt; + output.index = index; + } else + output = opt; + output.it_range.end() = it_end; + } + + // Evaluating a scalar variable into expr, + // all possible ConfigOption types are supported. + static void scalar_variable_to_expr(const MyContext *ctx, OptWithPos &opt, expr &output) + { + if (ctx->skipping()) + return; + + assert(opt.opt->is_scalar()); + switch (opt.opt->type()) { case coFloat: output.set_d(opt.opt->getFloat()); break; case coInt: output.set_i(opt.opt->getInt()); break; case coString: output.set_s(static_cast(opt.opt)->value); break; case coPercent: output.set_d(opt.opt->getFloat()); break; + case coEnum: case coPoint: output.set_s(opt.opt->serialize()); break; case coBool: output.set_b(opt.opt->getBool()); break; case coFloatOrPercent: { std::string opt_key(opt.it_range.begin(), opt.it_range.end()); if (boost::ends_with(opt_key, "extrusion_width")) { - // Extrusion width supports defaults and a complex graph of dependencies. + // Extrusion width supports defaults and a complex graph of dependencies. output.set_d(Flow::extrusion_width(opt_key, *ctx, static_cast(ctx->current_extruder_id))); } else if (! static_cast(opt.opt)->percent) { - // Not a percent, just return the value. + // Not a percent, just return the value. output.set_d(opt.opt->getFloat()); } else { - // Resolve dependencies using the "ratio_over" link to a parent value. - const ConfigOptionDef *opt_def = print_config_def.get(opt_key); - assert(opt_def != nullptr); - double v = opt.opt->getFloat() * 0.01; // percent to ratio - for (;;) { - const ConfigOption *opt_parent = opt_def->ratio_over.empty() ? nullptr : ctx->resolve_symbol(opt_def->ratio_over); - if (opt_parent == nullptr) - ctx->throw_exception("FloatOrPercent variable failed to resolve the \"ratio_over\" dependencies", opt.it_range); - if (boost::ends_with(opt_def->ratio_over, "extrusion_width")) { - // Extrusion width supports defaults and a complex graph of dependencies. + // Resolve dependencies using the "ratio_over" link to a parent value. + const ConfigOptionDef *opt_def = print_config_def.get(opt_key); + assert(opt_def != nullptr); + double v = opt.opt->getFloat() * 0.01; // percent to ratio + for (;;) { + const ConfigOption *opt_parent = opt_def->ratio_over.empty() ? nullptr : ctx->resolve_symbol(opt_def->ratio_over); + if (opt_parent == nullptr) + ctx->throw_exception("FloatOrPercent variable failed to resolve the \"ratio_over\" dependencies", opt.it_range); + if (boost::ends_with(opt_def->ratio_over, "extrusion_width")) { + // Extrusion width supports defaults and a complex graph of dependencies. assert(opt_parent->type() == coFloatOrPercent); - v *= Flow::extrusion_width(opt_def->ratio_over, static_cast(opt_parent), *ctx, static_cast(ctx->current_extruder_id)); - break; - } - if (opt_parent->type() == coFloat || opt_parent->type() == coFloatOrPercent) { - v *= opt_parent->getFloat(); - if (opt_parent->type() == coFloat || ! static_cast(opt_parent)->percent) - break; - v *= 0.01; // percent to ratio - } - // Continue one level up in the "ratio_over" hierarchy. - opt_def = print_config_def.get(opt_def->ratio_over); - assert(opt_def != nullptr); - } + v *= Flow::extrusion_width(opt_def->ratio_over, static_cast(opt_parent), *ctx, static_cast(ctx->current_extruder_id)); + break; + } + if (opt_parent->type() == coFloat || opt_parent->type() == coFloatOrPercent) { + v *= opt_parent->getFloat(); + if (opt_parent->type() == coFloat || ! static_cast(opt_parent)->percent) + break; + v *= 0.01; // percent to ratio + } + // Continue one level up in the "ratio_over" hierarchy. + opt_def = print_config_def.get(opt_def->ratio_over); + assert(opt_def != nullptr); + } output.set_d(v); - } - break; - } + } + break; + } default: - ctx->throw_exception("Unknown scalar variable type", opt.it_range); + ctx->throw_exception("Unsupported scalar variable type", opt.it_range); } - output.it_range = opt.it_range; } - template - static void vector_variable_reference( - const MyContext *ctx, - OptWithPos &opt, - int &index, - Iterator it_end, - expr &output) + // Evaluating one element of a vector variable. + // all possible ConfigOption types are supported. + static void vector_element_to_expr(const MyContext *ctx, OptWithPos &opt, expr &output) { - if (opt.opt->is_scalar()) - ctx->throw_exception("Referencing a scalar variable when vector is expected", opt.it_range); - const ConfigOptionVectorBase *vec = static_cast(opt.opt); + if (ctx->skipping()) + return; + + assert(opt.opt->is_vector()); + if (! opt.has_index()) + ctx->throw_exception("Referencing a vector variable when scalar is expected", opt.it_range); + const ConfigOptionVectorBase* vec = static_cast(opt.opt); if (vec->empty()) ctx->throw_exception("Indexing an empty vector variable", opt.it_range); - size_t idx = (index < 0) ? 0 : (index >= int(vec->size())) ? 0 : size_t(index); + size_t idx = (opt.index < 0) ? 0 : (opt.index >= int(vec->size())) ? 0 : size_t(opt.index); switch (opt.opt->type()) { - case coFloats: output.set_d(static_cast(opt.opt)->values[idx]); break; - case coInts: output.set_i(static_cast(opt.opt)->values[idx]); break; - case coStrings: output.set_s(static_cast(opt.opt)->values[idx]); break; + case coFloats: output.set_d(static_cast(opt.opt)->values[idx]); break; + case coInts: output.set_i(static_cast(opt.opt)->values[idx]); break; + case coStrings: output.set_s(static_cast(opt.opt)->values[idx]); break; case coPercents: output.set_d(static_cast(opt.opt)->values[idx]); break; - case coPoints: output.set_s(to_string(static_cast(opt.opt)->values[idx])); break; - case coBools: output.set_b(static_cast(opt.opt)->values[idx] != 0); break; + case coPoints: output.set_s(to_string(static_cast(opt.opt)->values[idx])); break; + case coBools: output.set_b(static_cast(opt.opt)->values[idx] != 0); break; + //case coEnums: output.set_s(opt.opt->vserialize()[idx]); break; + default: + ctx->throw_exception("Unsupported vector variable type", opt.it_range); + } + } + + static void check_writable(const MyContext *ctx, OptWithPos &opt) { + if (! opt.writable) + ctx->throw_exception("Cannot modify a read-only variable", opt.it_range); + } + + static void check_numeric(const expr ¶m) { + if (! param.numeric_type()) + param.throw_exception("Right side is not a numeric expression"); + }; + + static size_t evaluate_count(const expr &expr_count) { + if (expr_count.type() != expr::TYPE_INT) + expr_count.throw_exception("Expected number of elements to fill a vector with."); + int count = expr_count.i(); + if (count < 0) + expr_count.throw_exception("Negative number of elements specified."); + return size_t(count); + }; + + static void scalar_variable_assign_scalar(const MyContext *ctx, OptWithPos &lhs, const expr &rhs) + { + assert(lhs.opt->is_scalar()); + check_writable(ctx, lhs); + ConfigOption *wropt = const_cast(lhs.opt); + switch (wropt->type()) { + case coFloat: + check_numeric(rhs); + static_cast(wropt)->value = rhs.as_d(); + break; + case coInt: + check_numeric(rhs); + static_cast(wropt)->value = rhs.as_i(); + break; + case coString: + static_cast(wropt)->value = rhs.to_string(); + break; + case coPercent: + check_numeric(rhs); + static_cast(wropt)->value = rhs.as_d(); + break; + case coBool: + if (rhs.type() != expr::TYPE_BOOL) + ctx->throw_exception("Right side is not a boolean expression", rhs.it_range); + static_cast(wropt)->value = rhs.b(); + break; + default: + ctx->throw_exception("Unsupported output scalar variable type", lhs.it_range); + } + } + + static void vector_variable_element_assign_scalar(const MyContext *ctx, OptWithPos &lhs, const expr &rhs) + { + assert(lhs.opt->is_vector()); + check_writable(ctx, lhs); + if (! lhs.has_index()) + ctx->throw_exception("Referencing an output vector variable when scalar is expected", lhs.it_range); + ConfigOptionVectorBase *vec = const_cast(static_cast(lhs.opt)); + if (vec->empty()) + ctx->throw_exception("Indexing an empty vector variable", lhs.it_range); + if (lhs.index >= int(vec->size())) + ctx->throw_exception("Index out of range", lhs.it_range); + switch (lhs.opt->type()) { + case coFloats: + check_numeric(rhs); + static_cast(vec)->values[lhs.index] = rhs.as_d(); + break; + case coInts: + check_numeric(rhs); + static_cast(vec)->values[lhs.index] = rhs.as_i(); + break; + case coStrings: + static_cast(vec)->values[lhs.index] = rhs.to_string(); + break; + case coPercents: + check_numeric(rhs); + static_cast(vec)->values[lhs.index] = rhs.as_d(); + break; + case coBools: + if (rhs.type() != expr::TYPE_BOOL) + ctx->throw_exception("Right side is not a boolean expression", rhs.it_range); + static_cast(vec)->values[lhs.index] = rhs.b(); + break; default: - ctx->throw_exception("Unknown vector variable type", opt.it_range); + ctx->throw_exception("Unsupported output vector variable type", lhs.it_range); } - output.it_range = boost::iterator_range(opt.it_range.begin(), it_end); + } + + static void vector_variable_assign_expr_with_count(const MyContext *ctx, OptWithPos &lhs, const expr &rhs_count, const expr &rhs_value) + { + size_t count = evaluate_count(rhs_count); + auto *opt = const_cast(lhs.opt); + switch (lhs.opt->type()) { + case coFloats: + check_numeric(rhs_value); + static_cast(opt)->values.assign(count, rhs_value.as_d()); + break; + case coInts: + check_numeric(rhs_value); + static_cast(opt)->values.assign(count, rhs_value.as_i()); + break; + case coStrings: + static_cast(opt)->values.assign(count, rhs_value.to_string()); + break; + case coBools: + if (rhs_value.type() != expr::TYPE_BOOL) + rhs_value.throw_exception("Right side is not a boolean expression"); + static_cast(opt)->values.assign(count, rhs_value.b()); + break; + default: assert(false); + } + } + + static void variable_value(const MyContext *ctx, OptWithPos &opt, expr &output) + { + if (! ctx->skipping()) { + if (opt.opt->is_vector()) + vector_element_to_expr(ctx, opt, output); + else + scalar_variable_to_expr(ctx, opt, output); + } + output.it_range = opt.it_range; + } + + // Return a boolean value, true if the scalar variable referenced by "opt" is nullable and it has a nil value. + // Return a boolean value, true if an element of a vector variable referenced by "opt[index]" is nullable and it has a nil value. + static void is_nil_test(const MyContext *ctx, OptWithPos &opt, expr &output) + { + if (ctx->skipping()) { + } else if (opt.opt->is_vector()) { + if (! opt.has_index()) + ctx->throw_exception("Referencing a vector variable when scalar is expected", opt.it_range); + const ConfigOptionVectorBase *vec = static_cast(opt.opt); + if (vec->empty()) + ctx->throw_exception("Indexing an empty vector variable", opt.it_range); + output.set_b(static_cast(opt.opt)->is_nil(opt.index >= int(vec->size()) ? 0 : size_t(opt.index))); + } else { + assert(opt.opt->is_scalar()); + output.set_b(opt.opt->is_nil()); + } + output.it_range = opt.it_range; + } + + // Reference to an existing symbol, or a name of a new symbol. + struct NewOldVariable { + std::string name; + IteratorRange it_range; + ConfigOption *opt{ nullptr }; + }; + static void new_old_variable( + const MyContext *ctx, + bool global_variable, + const IteratorRange &it_range, + NewOldVariable &out) + { + if (! ctx->skipping()) { + t_config_option_key key(std::string(it_range.begin(), it_range.end())); + if (const ConfigOption* opt = ctx->resolve_symbol(key); opt) + ctx->throw_exception("Symbol is already defined in read-only system dictionary", it_range); + if (ctx->config_outputs && ctx->config_outputs->optptr(key)) + ctx->throw_exception("Symbol is already defined as system output variable", it_range); + bool has_global_dictionary = ctx->context_data != nullptr && ctx->context_data->global_config; + if (global_variable) { + if (! has_global_dictionary) + ctx->throw_exception("Global variables are not available in this context", it_range); + if (ctx->config_local.optptr(key)) + ctx->throw_exception("Variable name already defined in local scope", it_range); + out.opt = ctx->context_data->global_config->optptr(key); + } else { + if (has_global_dictionary && ctx->context_data->global_config->optptr(key)) + ctx->throw_exception("Variable name already defined in global scope", it_range); + out.opt = ctx->config_local.optptr(key); + } + out.name = std::move(key); + } + out.it_range = it_range; + } + + // Decoding a scalar variable symbol "opt", assigning it a value of "param". + static void scalar_variable_assign_scalar_expression(const MyContext *ctx, OptWithPos &opt, const expr ¶m) + { + if (! ctx->skipping()) { + check_writable(ctx, opt); + if (opt.opt->is_vector()) + vector_variable_element_assign_scalar(ctx, opt, param); + else + scalar_variable_assign_scalar(ctx, opt, param); + } + } + + static void scalar_variable_new_from_scalar_expression( + const MyContext *ctx, + bool global_variable, + NewOldVariable &lhs, + const expr &rhs) + { + if (ctx->skipping()) { + } else if (lhs.opt) { + if (lhs.opt->is_vector()) + rhs.throw_exception("Cannot assign a scalar value to a vector variable."); + OptWithPos lhs_opt{ lhs.opt, lhs.it_range, true }; + scalar_variable_assign_scalar(ctx, lhs_opt, rhs); + } else { + std::unique_ptr opt_new; + switch (rhs.type()) { + case expr::TYPE_BOOL: opt_new = std::make_unique(rhs.b()); break; + case expr::TYPE_INT: opt_new = std::make_unique(rhs.i()); break; + case expr::TYPE_DOUBLE: opt_new = std::make_unique(rhs.d()); break; + case expr::TYPE_STRING: opt_new = std::make_unique(rhs.s()); break; + default: assert(false); + } + const_cast(ctx)->store_new_variable(lhs.name, std::move(opt_new), global_variable); + } + } + + static void vector_variable_new_from_array( + const MyContext *ctx, + bool global_variable, + NewOldVariable &lhs, + const expr &rhs_count, + const expr &rhs_value) + { + if (ctx->skipping()) { + } else if (lhs.opt) { + if (lhs.opt->is_scalar()) + rhs_value.throw_exception("Cannot assign a vector value to a scalar variable."); + OptWithPos lhs_opt{ lhs.opt, lhs.it_range, true }; + vector_variable_assign_expr_with_count(ctx, lhs_opt, rhs_count, rhs_value); + } else { + size_t count = evaluate_count(rhs_count); + std::unique_ptr opt_new; + switch (rhs_value.type()) { + case expr::TYPE_BOOL: opt_new = std::make_unique(count, rhs_value.b()); break; + case expr::TYPE_INT: opt_new = std::make_unique(count, rhs_value.i()); break; + case expr::TYPE_DOUBLE: opt_new = std::make_unique(count, rhs_value.d()); break; + case expr::TYPE_STRING: opt_new = std::make_unique(count, rhs_value.s()); break; + default: assert(false); + } + const_cast(ctx)->store_new_variable(lhs.name, std::move(opt_new), global_variable); + } + } + + static void vector_variable_assign_array( + const MyContext *ctx, + OptWithPos &lhs, + const expr &rhs_count, + const expr &rhs_value) + { + if (! ctx->skipping()) { + check_writable(ctx, lhs); + if (lhs.opt->is_scalar()) + rhs_value.throw_exception("Cannot assign a vector value to a scalar variable."); + vector_variable_assign_expr_with_count(ctx, lhs, rhs_count, rhs_value); + } + } + + template + static void fill_vector_from_initializer_list(ConfigOption *opt, const std::vector &il, RightValueEvaluate rv_eval) { + auto& out = static_cast(opt)->values; + out.clear(); + out.reserve(il.size()); + for (const expr& i : il) + out.emplace_back(rv_eval(i)); + } + + static void vector_variable_assign_initializer_list(const MyContext *ctx, OptWithPos &lhs, const std::vector &il) + { + if (ctx->skipping()) + return; + + check_writable(ctx, lhs); + + if (lhs.opt->is_scalar()) { + if (il.size() == 1) + // scalar_var = ( scalar ) + scalar_variable_assign_scalar_expression(ctx, lhs, il.front()); + else + // scalar_var = () + // or + // scalar_var = ( scalar, scalar, ... ) + ctx->throw_exception("Cannot assign a vector value to a scalar variable.", lhs.it_range); + } + + auto check_numeric_vector = [](const std::vector &il) { + for (auto &i : il) + if (! i.numeric_type()) + i.throw_exception("Right side is not a numeric expression"); + }; + + ConfigOption *opt = const_cast(lhs.opt); + switch (lhs.opt->type()) { + case coFloats: + check_numeric_vector(il); + fill_vector_from_initializer_list(opt, il, [](auto &v){ return v.as_d(); }); + break; + case coInts: + check_numeric_vector(il); + fill_vector_from_initializer_list(opt, il, [](auto &v){ return v.as_i(); }); + break; + case coStrings: + fill_vector_from_initializer_list(opt, il, [](auto &v){ return v.to_string(); }); + break; + case coBools: + for (auto &i : il) + if (i.type() != expr::TYPE_BOOL) + i.throw_exception("Right side is not a boolean expression"); + fill_vector_from_initializer_list(opt, il, [](auto &v){ return v.b(); }); + break; + default: assert(false); + } + } + + static void vector_variable_new_from_initializer_list( + const MyContext *ctx, + bool global_variable, + NewOldVariable &lhs, + const std::vector &il) + { + if (ctx->skipping()) + return; + + if (lhs.opt) { + // Assign to an existing vector variable. + OptWithPos lhs_opt{ lhs.opt, lhs.it_range, true }; + vector_variable_assign_initializer_list(ctx, lhs_opt, il); + } else { + if (il.empty()) + ctx->throw_exception("Cannot create vector variable from an empty initializer list, because its type cannot be deduced.", lhs.it_range); + // Allocate a new vector variable. + // First guesstimate type of the output vector. + size_t num_bool = 0; + size_t num_int = 0; + size_t num_double = 0; + size_t num_string = 0; + for (auto &i : il) + switch (i.type()) { + case expr::TYPE_BOOL: ++ num_bool; break; + case expr::TYPE_INT: ++ num_int; break; + case expr::TYPE_DOUBLE: ++ num_double; break; + case expr::TYPE_STRING: ++ num_string; break; + default: assert(false); + } + std::unique_ptr opt_new; + if (num_string > 0) + // Convert everything to strings. + opt_new = std::make_unique(); + else if (num_bool > 0) { + if (num_double + num_int > 0) + ctx->throw_exception("Right side is not valid: Mixing numeric and boolean types.", IteratorRange{ il.front().it_range.begin(), il.back().it_range.end() }); + opt_new = std::make_unique(); + } else { + // Output is numeric. + if (num_double == 0) + opt_new = std::make_unique(); + else + opt_new = std::make_unique(); + } + OptWithPos lhs_opt{ opt_new.get(), lhs.it_range, true }; + vector_variable_assign_initializer_list(ctx, lhs_opt, il); + const_cast(ctx)->store_new_variable(lhs.name, std::move(opt_new), global_variable); + } + } + + static bool is_vector_variable_reference(const OptWithPos &var) { + return ! var.empty() && ! var.has_index() && var.opt->is_vector(); + } + + // Called when checking whether the NewOldVariable could be assigned a vectir right hand side. + static bool could_be_vector_variable_reference(const NewOldVariable &var) { + return var.opt == nullptr || var.opt->is_vector(); + } + + static void copy_vector_variable_to_vector_variable(const MyContext *ctx, OptWithPos &lhs, const OptWithPos &rhs) + { + if (ctx->skipping()) + return; + + check_writable(ctx, lhs); + assert(lhs.opt->is_vector()); + if (rhs.has_index() || ! rhs.opt->is_vector()) + ctx->throw_exception("Cannot assign scalar to a vector", lhs.it_range); + if (lhs.opt->type() != rhs.opt->type()) { + // Vector types are not compatible. + switch (lhs.opt->type()) { + case coFloats: + ctx->throw_exception("Left hand side is a float vector, while the right hand side is not.", lhs.it_range); + case coInts: + ctx->throw_exception("Left hand side is an int vector, while the right hand side is not.", lhs.it_range); + case coStrings: + ctx->throw_exception("Left hand side is a string vector, while the right hand side is not.", lhs.it_range); + case coBools: + ctx->throw_exception("Left hand side is a bool vector, while the right hand side is not.", lhs.it_range); + default: + ctx->throw_exception("Left hand side / right hand side vectors are not compatible.", lhs.it_range); + } + } + const_cast(lhs.opt)->set(rhs.opt); + } + + static bool vector_variable_new_from_copy( + const MyContext *ctx, + bool global_variable, + NewOldVariable &lhs, + const OptWithPos &rhs) + { + if (ctx->skipping()) + // Skipping, continue parsing. + return true; + + if (lhs.opt) { + assert(lhs.opt->is_vector()); + OptWithPos lhs_opt{ lhs.opt, lhs.it_range, true }; + copy_vector_variable_to_vector_variable(ctx, lhs_opt, rhs); + } else { + if (rhs.has_index() || ! rhs.opt->is_vector()) + // Stop parsing, let the other rules resolve this case. + return false; + // Clone the vector variable. + std::unique_ptr opt_new; + if (one_of(rhs.opt->type(), { coFloats, coInts, coStrings, coBools })) + opt_new = std::unique_ptr(rhs.opt->clone()); + else if (rhs.opt->type() == coPercents) + opt_new = std::make_unique(static_cast(rhs.opt)->values); + else + ctx->throw_exception("Duplicating this type of vector variable is not supported", rhs.it_range); + const_cast(ctx)->store_new_variable(lhs.name, std::move(opt_new), global_variable); + } + // Continue parsing. + return true; + } + + static void initializer_list_append(std::vector &list, expr ¶m) + { + if (param.type() != expr::TYPE_EMPTY) + // not skipping + list.emplace_back(std::move(param)); + } + + static void is_vector_empty(const MyContext *ctx, OptWithPos &opt, expr &out) + { + if (! ctx->skipping()) { + if (opt.has_index() || ! opt.opt->is_vector()) + ctx->throw_exception("parameter of empty() is not a vector variable", opt.it_range); + out.set_b(static_cast(opt.opt)->size() == 0); + } + out.it_range = opt.it_range; + } + + static void vector_size(const MyContext *ctx, OptWithPos &opt, expr &out) + { + if (! ctx->skipping()) { + if (opt.has_index() || ! opt.opt->is_vector()) + ctx->throw_exception("parameter of size() is not a vector variable", opt.it_range); + out.set_i(int(static_cast(opt.opt)->size())); + } + out.it_range = opt.it_range; } // Verify that the expression returns an integer, which may be used // to address a vector. - template - static void evaluate_index(expr &expr_index, int &output) + static void evaluate_index(expr &expr_index, int &output) { - if (expr_index.type != expr::TYPE_INT) - expr_index.throw_exception("Non-integer index is not allowed to address a vector variable."); - output = expr_index.i(); + if (expr_index.type() != expr::TYPE_EMPTY) { + if (expr_index.type() != expr::TYPE_INT) + expr_index.throw_exception("Non-integer index is not allowed to address a vector variable."); + output = expr_index.i(); + } } - template - static void random(const MyContext *ctx, expr ¶m1, expr ¶m2) + static void random(const MyContext *ctx, expr ¶m1, expr ¶m2) { + if (ctx->skipping()) + return; + if (ctx->context_data == nullptr) ctx->throw_exception("Random number generator not available in this context.", - boost::iterator_range(param1.it_range.begin(), param2.it_range.end())); - expr::random(param1, param2, ctx->context_data->rng); + IteratorRange(param1.it_range.begin(), param2.it_range.end())); + expr::random(param1, param2, ctx->context_data->rng); } - template - static void throw_exception(const std::string &msg, const boost::iterator_range &it_range) + static void throw_exception(const std::string &msg, const IteratorRange &it_range) { // An asterix is added to the start of the string to differentiate the boost::spirit::info::tag content // between the grammer terminal / non-terminal symbol name and a free-form error message. - boost::throw_exception(qi::expectation_failure(it_range.begin(), it_range.end(), spirit::info(std::string("*") + msg))); + boost::throw_exception(qi::expectation_failure(it_range.begin(), it_range.end(), spirit::info(std::string("*") + msg))); } - template static void process_error_message(const MyContext *context, const boost::spirit::info &info, const Iterator &it_begin, const Iterator &it_end, const Iterator &it_error) { std::string &msg = const_cast(context)->error_message; @@ -948,8 +1581,82 @@ namespace client msg += ' '; msg += "^\n"; } + + private: + // For skipping execution of inactive conditional branches. + mutable int m_depth_suppressed{ 0 }; }; + struct InterpolateTableContext { + struct Item { + double x; + IteratorRange it_range_x; + double y; + }; + std::vector table; + + static void init(const expr &x) { + if (x.type() != expr::TYPE_EMPTY) { + if (!x.numeric_type()) + x.throw_exception("Interpolation value must be a number."); + } + } + static void add_pair(const expr &x, const expr &y, InterpolateTableContext &table) { + if (x.type() != expr::TYPE_EMPTY) { + if (! x.numeric_type()) + x.throw_exception("X value of a table point must be a number."); + if (! y.numeric_type()) + y.throw_exception("Y value of a table point must be a number."); + table.table.push_back({ x.as_d(), x.it_range, y.as_d() }); + } + } + static void evaluate(const expr &expr_x, const InterpolateTableContext &table, expr &out) { + if (expr_x.type() == expr::TYPE_EMPTY) + return; + + // Check whether the table X values are sorted. + double x = expr_x.as_d(); + bool evaluated = false; + for (size_t i = 1; i < table.table.size(); ++i) { + double x0 = table.table[i - 1].x; + double x1 = table.table[i].x; + if (x0 > x1) + boost::throw_exception(qi::expectation_failure( + table.table[i - 1].it_range_x.begin(), table.table[i].it_range_x.end(), spirit::info("X coordinates of the table must be increasing"))); + if (! evaluated && x >= x0 && x <= x1) { + double y0 = table.table[i - 1].y; + double y1 = table.table[i].y; + if (x == x0) + out.set_d(y0); + else if (x == x1) + out.set_d(y1); + else if (is_approx(x0, x1)) + out.set_d(0.5 * (y0 + y1)); + else + out.set_d(Slic3r::lerp(y0, y1, (x - x0) / (x1 - x0))); + evaluated = true; + } + } + if (! evaluated) { + // Clamp x into the table range with EPSILON. + if (x > table.table.front().x - EPSILON) + out.set_d(table.table.front().y); + else if (x < table.table.back().x + EPSILON) + out.set_d(table.table.back().y); + else + // The value is really outside the table range. + expr_x.throw_exception("Interpolation value is outside the table range"); + } + } + }; + + std::ostream& operator<<(std::ostream &os, const InterpolateTableContext &table_context) + { + for (const auto &item : table_context.table) + os << "(" << item.x << "," << item.y << ")"; + return os; + } + // Table to translate symbol tag to a human readable error message. std::map MyContext::tag_to_error_message = { { "eoi", "Unknown syntax error" }, @@ -957,6 +1664,7 @@ namespace client { "text", "Invalid text." }, { "text_block", "Invalid text block." }, { "macro", "Invalid macro." }, + { "repeat", "Unknown syntax error" }, { "if_else_output", "Not an {if}{else}{endif} macro." }, { "switch_output", "Not a {switch} macro." }, { "legacy_variable_expansion", "Expecting a legacy variable expansion format" }, @@ -971,14 +1679,14 @@ namespace client { "multiplicative_expression", "Expecting an expression." }, { "unary_expression", "Expecting an expression." }, { "optional_parameter", "Expecting a closing brace or an optional parameter." }, - { "scalar_variable_reference", "Expecting a scalar variable reference."}, + { "one_of_list", "Expecting a list of string patterns (simple text or rexep)" }, { "variable_reference", "Expecting a variable reference."}, + { "variable", "Expecting a variable name."}, { "regular_expression", "Expecting a regular expression."} }; // For debugging the boost::spirit parsers. Print out the string enclosed in it_range. - template - std::ostream& operator<<(std::ostream& os, const boost::iterator_range &it_range) + std::ostream& operator<<(std::ostream& os, const IteratorRange &it_range) { os << std::string(it_range.begin(), it_range.end()); return os; @@ -1042,7 +1750,7 @@ namespace client first = it; return true; err: - MyContext::throw_exception("Invalid utf8 sequence", boost::iterator_range(first, last)); + MyContext::throw_exception("Invalid utf8 sequence", IteratorRange(first, last)); return false; } @@ -1054,11 +1762,55 @@ namespace client } }; + struct FactorActions { + static void set_start_pos(Iterator &start_pos, expr &out) + { out.it_range = IteratorRange(start_pos, start_pos); } + static void int_(const MyContext *ctx, int &value, Iterator &end_pos, expr &out) { + if (ctx->skipping()) { + out.reset(); + out.it_range.end() = end_pos; + } else + out = expr(value, out.it_range.begin(), end_pos); + } + static void double_(const MyContext *ctx, double &value, Iterator &end_pos, expr &out) { + if (ctx->skipping()) { + out.reset(); + out.it_range.end() = end_pos; + } else + out = expr(value, out.it_range.begin(), end_pos); + } + static void bool_(const MyContext *ctx, bool &value, Iterator &end_pos, expr &out) { + if (ctx->skipping()) { + out.reset(); + out.it_range.end() = end_pos; + } else + out = expr(value, out.it_range.begin(), end_pos); + } + static void string_(const MyContext *ctx, IteratorRange &it_range, expr &out) { + if (ctx->skipping()) { + out.reset(); + out.it_range = it_range; + } else + out = expr(std::string(it_range.begin() + 1, it_range.end() - 1), it_range.begin(), it_range.end()); + } + static void expr_(expr &value, Iterator &end_pos, expr &out) + { auto begin_pos = out.it_range.begin(); out = expr(std::move(value), begin_pos, end_pos); } + static void minus_(expr &value, expr &out) + { out = value.unary_minus(out.it_range.begin()); } + static void not_(expr &value, expr &out) + { out = value.unary_not(out.it_range.begin()); } + static void to_int(expr &value, expr &out) + { out = value.unary_integer(out.it_range.begin()); } + static void round(expr &value, expr &out) + { out = value.round(out.it_range.begin()); } + // For indicating "no optional parameter". + static void noexpr(expr &out) { out.reset(); } + }; + /////////////////////////////////////////////////////////////////////////// // Our macro_processor grammar /////////////////////////////////////////////////////////////////////////// // Inspired by the C grammar rules https://www.lysator.liu.se/c/ANSI-C-grammar-y.html - template struct macro_processor : qi::grammar, spirit_encoding::space_type> { macro_processor() : macro_processor::base_type(start) @@ -1090,6 +1842,7 @@ namespace client qi::_a_type _a; qi::_b_type _b; qi::_r1_type _r1; + qi::_r2_type _r2; // Starting symbol of the grammer. // The leading eps is required by the "expectation point" operator ">". @@ -1097,19 +1850,19 @@ namespace client // Also the start symbol switches between the "full macro syntax" and a "boolean expression only", // depending on the context->just_boolean_expression flag. This way a single static expression parser // could serve both purposes. - start = eps[px::bind(&MyContext::evaluate_full_macro, _r1, _a)] > - ( (eps(_a==true) > text_block(_r1) [_val=_1]) - | conditional_expression(_r1) [ px::bind(&expr::evaluate_boolean_to_string, _1, _val) ] + start = + ( (eps(px::bind(&MyContext::evaluate_full_macro, _r1)) > text_block(_r1) [_val=_1]) + | conditional_expression(_r1) [ px::bind(&expr::evaluate_boolean_to_string, _1, _val) ] ) > eoi; start.name("start"); - qi::on_error(start, px::bind(&MyContext::process_error_message, _r1, _4, _1, _2, _3)); + qi::on_error(start, px::bind(&MyContext::process_error_message, _r1, _4, _1, _2, _3)); text_block = *( text [_val+=_1] // Allow back tracking after '{' in case of a text_block embedded inside a condition. // In that case the inner-most {else} wins and the {if}/{elsif}/{else} shall be paired. // {elsif}/{else} without an {if} will be allowed to back track from the embedded text_block. - | (lit('{') >> macro(_r1) [_val+=_1] > '}') + | (lit('{') >> (macros(_r1)[_val += _1] > '}') | '}') | (lit('[') > legacy_variable_expansion(_r1) [_val+=_1] > ']') ); text_block.name("text_block"); @@ -1121,39 +1874,61 @@ namespace client // New style of macro expansion. // The macro expansion may contain numeric or string expressions, ifs and cases. - macro = - (kw["if"] > if_else_output(_r1) [_val = _1]) -// | (kw["switch"] > switch_output(_r1) [_val = _1]) - | additive_expression(_r1) [ px::bind(&expr::to_string2, _1, _val) ]; - macro.name("macro"); + macros = + +(block(_r1)[_val += _1] | (statement(_r1) > (+lit(';') | &lit('}')))[_val += _1] | +lit(';')); + macros.name("macro"); + // if_macros and else_macros only differ by the look-ahead ending condition, which is to not have to repeat the last semicolon + // at the end of the block. + if_macros = kw["then"] > *(block(_r1)[_val += _1] | (statement(_r1) > (+lit(';') | &(kw["elsif"] | kw["else"] | kw["endif"])))[_val += _1] | +lit(';')); + if_macros.name("if_macros"); + else_macros = *(block(_r1)[_val += _1] | (statement(_r1) > (+lit(';') | &kw["endif"]))[_val += _1] | +lit(';')); + else_macros.name("else_macros"); + + // Blocks do not require a separating semicolon. + block = + (kw["if"] > if_else_output(_r1)[_val = _1]) + // (kw["switch"] ... + ; + block.name("block"); + + // Statements require a separating semicolon. + statement = + (assignment_statement(_r1) [_val = _1]) + | (new_variable_statement(_r1)[_val = _1]) + | (conditional_expression(_r1)[px::bind(&expr::to_string2, _1, _val)]) + ; // An if expression enclosed in {} (the outmost {} are already parsed by the caller). + // Also }{ could be replaced with ; to simplify writing of pure code. if_else_output = - eps[_b=true] > - bool_expr_eval(_r1)[_a=_1] > '}' > - text_block(_r1)[px::bind(&expr::set_if, _a, _b, _1, _val)] > '{' > - *(kw["elsif"] > bool_expr_eval(_r1)[_a=_1] > '}' > - text_block(_r1)[px::bind(&expr::set_if, _a, _b, _1, _val)] > '{') > - -(kw["else"] > lit('}') > - text_block(_r1)[px::bind(&expr::set_if, _b, _b, _1, _val)] > '{') > + eps[_a=true] > + (bool_expr_eval(_r1)[px::bind(&MyContext::block_enter, _r1, _1)] > (if_text_block(_r1) | if_macros(_r1))) + [px::bind(&MyContext::block_exit, _r1, _1, _a, _2, _val)] > + *((kw["elsif"] > bool_expr_eval(_r1)[px::bind(&MyContext::block_enter, _r1, _1 && _a)] > (if_text_block(_r1) | if_macros(_r1))) + [px::bind(&MyContext::block_exit, _r1, _1, _a, _2, _val)]) > + -(kw["else"] > eps[px::bind(&MyContext::block_enter, _r1, _a)] > (if_text_block(_r1) | else_macros(_r1))) + [px::bind(&MyContext::block_exit, _r1, _a, _a, _1, _val)] > kw["endif"]; if_else_output.name("if_else_output"); + if_text_block = (lit('}') > text_block(_r1) > '{'); + if_text_block.name("if_text_block"); + // A switch expression enclosed in {} (the outmost {} are already parsed by the caller). /* switch_output = eps[_b=true] > - omit[expr(_r1)[_a=_1]] > '}' > text_block(_r1)[px::bind(&expr::set_if_equal, _a, _b, _1, _val)] > '{' > - *("elsif" > omit[bool_expr_eval(_r1)[_a=_1]] > '}' > text_block(_r1)[px::bind(&expr::set_if, _a, _b, _1, _val)]) >> - -("else" > '}' >> text_block(_r1)[px::bind(&expr::set_if, _b, _b, _1, _val)]) > + omit[expr(_r1)[_a=_1]] > '}' > text_block(_r1)[px::bind(&expr::set_if_equal, _a, _b, _1, _val)] > '{' > + *("elsif" > omit[bool_expr_eval(_r1)[_a=_1]] > '}' > text_block(_r1)[px::bind(&expr::set_if, _a, _b, _1, _val)]) >> + -("else" > '}' >> text_block(_r1)[px::bind(&expr::set_if, _b, _b, _1, _val)]) > "endif"; */ // Legacy variable expansion of the original Slic3r, in the form of [scalar_variable] or [vector_variable_index]. legacy_variable_expansion = (identifier >> &lit(']')) - [ px::bind(&MyContext::legacy_variable_expansion, _r1, _1, _val) ] + [ px::bind(&MyContext::legacy_variable_expansion, _r1, _1, _val) ] | (identifier > lit('[') > identifier > ']') - [ px::bind(&MyContext::legacy_variable_expansion2, _r1, _1, _2, _val) ] + [ px::bind(&MyContext::legacy_variable_expansion2, _r1, _1, _2, _val) ] ; legacy_variable_expansion.name("legacy_variable_expansion"); @@ -1163,41 +1938,44 @@ namespace client identifier.name("identifier"); conditional_expression = - logical_or_expression(_r1) [_val = _1] - >> -('?' > conditional_expression(_r1) > ':' > conditional_expression(_r1)) [px::bind(&expr::ternary_op, _val, _1, _2)]; + logical_or_expression(_r1) [_val = _1] + >> -('?' > eps[px::bind(&expr::evaluate_boolean, _val, _a)] > + eps[px::bind(&MyContext::block_enter, _r1, _a)] > conditional_expression(_r1)[px::bind(&MyContext::block_exit_ternary, _r1, _a, _1, _val)] + > ':' > + eps[px::bind(&MyContext::block_enter, _r1, ! _a)] > conditional_expression(_r1)[px::bind(&MyContext::block_exit_ternary, _r1, ! _a, _1, _val)]); conditional_expression.name("conditional_expression"); logical_or_expression = logical_and_expression(_r1) [_val = _1] - >> *( ((kw["or"] | "||") > logical_and_expression(_r1) ) [px::bind(&expr::logical_or, _val, _1)] ); + >> *( ((kw["or"] | "||") > logical_and_expression(_r1) ) [px::bind(&expr::logical_or, _val, _1)] ); logical_or_expression.name("logical_or_expression"); logical_and_expression = equality_expression(_r1) [_val = _1] - >> *( ((kw["and"] | "&&") > equality_expression(_r1) ) [px::bind(&expr::logical_and, _val, _1)] ); + >> *( ((kw["and"] | "&&") > equality_expression(_r1) ) [px::bind(&expr::logical_and, _val, _1)] ); logical_and_expression.name("logical_and_expression"); equality_expression = relational_expression(_r1) [_val = _1] - >> *( ("==" > relational_expression(_r1) ) [px::bind(&expr::equal, _val, _1)] - | ("!=" > relational_expression(_r1) ) [px::bind(&expr::not_equal, _val, _1)] - | ("<>" > relational_expression(_r1) ) [px::bind(&expr::not_equal, _val, _1)] - | ("=~" > regular_expression ) [px::bind(&expr::regex_matches, _val, _1)] - | ("!~" > regular_expression ) [px::bind(&expr::regex_doesnt_match, _val, _1)] + >> *( ("==" > relational_expression(_r1) ) [px::bind(&expr::equal, _val, _1)] + | ("!=" > relational_expression(_r1) ) [px::bind(&expr::not_equal, _val, _1)] + | ("<>" > relational_expression(_r1) ) [px::bind(&expr::not_equal, _val, _1)] + | ("=~" > regular_expression ) [px::bind(&expr::regex_matches, _val, _1)] + | ("!~" > regular_expression ) [px::bind(&expr::regex_doesnt_match, _val, _1)] ); equality_expression.name("bool expression"); // Evaluate a boolean expression stored as expr into a boolean value. // Throw if the equality_expression does not produce a expr of boolean type. - bool_expr_eval = conditional_expression(_r1) [ px::bind(&expr::evaluate_boolean, _1, _val) ]; + bool_expr_eval = conditional_expression(_r1) [ px::bind(&expr::evaluate_boolean, _1, _val) ]; bool_expr_eval.name("bool_expr_eval"); relational_expression = additive_expression(_r1) [_val = _1] - >> *( ("<=" > additive_expression(_r1) ) [px::bind(&expr::leq, _val, _1)] - | (">=" > additive_expression(_r1) ) [px::bind(&expr::geq, _val, _1)] - | (lit('<') > additive_expression(_r1) ) [px::bind(&expr::lower, _val, _1)] - | (lit('>') > additive_expression(_r1) ) [px::bind(&expr::greater, _val, _1)] + >> *( ("<=" > additive_expression(_r1) ) [px::bind(&expr::leq, _val, _1)] + | (">=" > additive_expression(_r1) ) [px::bind(&expr::geq, _val, _1)] + | (lit('<') > additive_expression(_r1) ) [px::bind(&expr::lower, _val, _1)] + | (lit('>') > additive_expression(_r1) ) [px::bind(&expr::greater, _val, _1)] ); relational_expression.name("relational_expression"); @@ -1216,75 +1994,116 @@ namespace client ); multiplicative_expression.name("multiplicative_expression"); - struct FactorActions { - static void set_start_pos(Iterator &start_pos, expr &out) - { out.it_range = boost::iterator_range(start_pos, start_pos); } - static void int_(int &value, Iterator &end_pos, expr &out) - { out = expr(value, out.it_range.begin(), end_pos); } - static void double_(double &value, Iterator &end_pos, expr &out) - { out = expr(value, out.it_range.begin(), end_pos); } - static void bool_(bool &value, Iterator &end_pos, expr &out) - { out = expr(value, out.it_range.begin(), end_pos); } - static void string_(boost::iterator_range &it_range, expr &out) - { out = expr(std::string(it_range.begin() + 1, it_range.end() - 1), it_range.begin(), it_range.end()); } - static void expr_(expr &value, Iterator &end_pos, expr &out) - { auto begin_pos = out.it_range.begin(); out = expr(std::move(value), begin_pos, end_pos); } - static void minus_(expr &value, expr &out) - { out = value.unary_minus(out.it_range.begin()); } - static void not_(expr &value, expr &out) - { out = value.unary_not(out.it_range.begin()); } - static void to_int(expr &value, expr &out) - { out = value.unary_integer(out.it_range.begin()); } - static void round(expr &value, expr &out) - { out = value.round(out.it_range.begin()); } - // For indicating "no optional parameter". - static void noexpr(expr &out) { out.reset(); } - }; + assignment_statement = + variable_reference(_r1)[_a = _1] >> '=' > + ( // Consumes also '(' conditional_expression ')', that means enclosing an expression into braces makes it a single value vector initializer. + initializer_list(_r1)[px::bind(&MyContext::vector_variable_assign_initializer_list, _r1, _a, _1)] + // Process it before conditional_expression, as conditional_expression requires a vector reference to be augmented with an index. + // Only process such variable references, which return a naked vector variable. + | eps(px::bind(&MyContext::is_vector_variable_reference, _a)) >> + variable_reference(_r1)[px::bind(&MyContext::copy_vector_variable_to_vector_variable, _r1, _a, _1)] + // Would NOT consume '(' conditional_expression ')' because such value was consumed with the expression above. + | conditional_expression(_r1) + [px::bind(&MyContext::scalar_variable_assign_scalar_expression, _r1, _a, _1)] + | (kw["repeat"] > "(" > additive_expression(_r1) > "," > conditional_expression(_r1) > ")") + [px::bind(&MyContext::vector_variable_assign_array, _r1, _a, _1, _2)] + ); + + new_variable_statement = + (kw["local"][_a = false] | kw["global"][_a = true]) > identifier[px::bind(&MyContext::new_old_variable, _r1, _a, _1, _b)] > lit('=') > + ( // Consumes also '(' conditional_expression ')', that means enclosing an expression into braces makes it a single value vector initializer. + initializer_list(_r1)[px::bind(&MyContext::vector_variable_new_from_initializer_list, _r1, _a, _b, _1)] + // Process it before conditional_expression, as conditional_expression requires a vector reference to be augmented with an index. + // Only process such variable references, which return a naked vector variable. + | eps(px::bind(&MyContext::could_be_vector_variable_reference, _b)) >> + variable_reference(_r1)[px::ref(qi::_pass) = px::bind(&MyContext::vector_variable_new_from_copy, _r1, _a, _b, _1)] + // Would NOT consume '(' conditional_expression ')' because such value was consumed with the expression above. + | conditional_expression(_r1) + [px::bind(&MyContext::scalar_variable_new_from_scalar_expression, _r1, _a, _b, _1)] + | (kw["repeat"] > "(" > additive_expression(_r1) > "," > conditional_expression(_r1) > ")") + [px::bind(&MyContext::vector_variable_new_from_array, _r1, _a, _b, _1, _2)] + ); + initializer_list = lit('(') > + ( lit(')') | + ( conditional_expression(_r1)[px::bind(&MyContext::initializer_list_append, _val, _1)] > + *(lit(',') > conditional_expression(_r1)[px::bind(&MyContext::initializer_list_append, _val, _1)]) > + lit(')') + ) + ); + unary_expression = iter_pos[px::bind(&FactorActions::set_start_pos, _1, _val)] >> ( - scalar_variable_reference(_r1) [ _val = _1 ] + variable_reference(_r1) [px::bind(&MyContext::variable_value, _r1, _1, _val)] | (lit('(') > conditional_expression(_r1) > ')' > iter_pos) [ px::bind(&FactorActions::expr_, _1, _2, _val) ] | (lit('-') > unary_expression(_r1) ) [ px::bind(&FactorActions::minus_, _1, _val) ] | (lit('+') > unary_expression(_r1) > iter_pos) [ px::bind(&FactorActions::expr_, _1, _2, _val) ] | ((kw["not"] | '!') > unary_expression(_r1) > iter_pos) [ px::bind(&FactorActions::not_, _1, _val) ] | (kw["min"] > '(' > conditional_expression(_r1) [_val = _1] > ',' > conditional_expression(_r1) > ')') - [ px::bind(&expr::min, _val, _2) ] + [ px::bind(&expr::min, _val, _2) ] | (kw["max"] > '(' > conditional_expression(_r1) [_val = _1] > ',' > conditional_expression(_r1) > ')') - [ px::bind(&expr::max, _val, _2) ] + [ px::bind(&expr::max, _val, _2) ] | (kw["random"] > '(' > conditional_expression(_r1) [_val = _1] > ',' > conditional_expression(_r1) > ')') - [ px::bind(&MyContext::random, _r1, _val, _2) ] + [ px::bind(&MyContext::random, _r1, _val, _2) ] | (kw["digits"] > '(' > conditional_expression(_r1) [_val = _1] > ',' > conditional_expression(_r1) > optional_parameter(_r1)) - [ px::bind(&expr::template digits, _val, _2, _3) ] + [ px::bind(&expr::digits, _val, _2, _3) ] | (kw["zdigits"] > '(' > conditional_expression(_r1) [_val = _1] > ',' > conditional_expression(_r1) > optional_parameter(_r1)) - [ px::bind(&expr::template digits, _val, _2, _3) ] + [ px::bind(&expr::digits, _val, _2, _3) ] | (kw["int"] > '(' > conditional_expression(_r1) > ')') [ px::bind(&FactorActions::to_int, _1, _val) ] | (kw["round"] > '(' > conditional_expression(_r1) > ')') [ px::bind(&FactorActions::round, _1, _val) ] - | (strict_double > iter_pos) [ px::bind(&FactorActions::double_, _1, _2, _val) ] - | (int_ > iter_pos) [ px::bind(&FactorActions::int_, _1, _2, _val) ] - | (kw[bool_] > iter_pos) [ px::bind(&FactorActions::bool_, _1, _2, _val) ] + | (kw["is_nil"] > '(' > variable_reference(_r1) > ')') [px::bind(&MyContext::is_nil_test, _r1, _1, _val)] + | (kw["one_of"] > '(' > one_of(_r1) > ')') [ _val = _1 ] + | (kw["empty"] > '(' > variable_reference(_r1) > ')') [px::bind(&MyContext::is_vector_empty, _r1, _1, _val)] + | (kw["size"] > '(' > variable_reference(_r1) > ')') [px::bind(&MyContext::vector_size, _r1, _1, _val)] + | (kw["interpolate_table"] > '(' > interpolate_table(_r1) > ')') [ _val = _1 ] + | (strict_double > iter_pos) [ px::bind(&FactorActions::double_, _r1, _1, _2, _val) ] + | (int_ > iter_pos) [ px::bind(&FactorActions::int_, _r1, _1, _2, _val) ] + | (kw[bool_] > iter_pos) [ px::bind(&FactorActions::bool_, _r1, _1, _2, _val) ] | raw[lexeme['"' > *((utf8char - char_('\\') - char_('"')) | ('\\' > char_)) > '"']] - [ px::bind(&FactorActions::string_, _1, _val) ] + [ px::bind(&FactorActions::string_, _r1, _1, _val) ] ); unary_expression.name("unary_expression"); + one_of = (unary_expression(_r1)[_a = _1] > one_of_list(_r1, _a))[_val = _2]; + one_of.name("one_of"); + one_of_list = + eps[px::bind(&expr::one_of_test_init, _val)] > + ( ( ',' > *( + ( + unary_expression(_r1)[px::bind(&expr::one_of_test, _r2, _1, _val)] + | (lit('~') > unary_expression(_r1))[px::bind(&expr::one_of_test, _r2, _1, _val)] + | regular_expression[px::bind(&expr::one_of_test_regex, _r2, _1, _val)] + ) >> -lit(',')) + ) + | eps + ); + one_of_list.name("one_of_list"); + + interpolate_table = (unary_expression(_r1)[_a = _1] > ',' > interpolate_table_list(_r1, _a)) + [px::bind(&InterpolateTableContext::evaluate, _a, _2, _val)]; + interpolate_table.name("interpolate_table"); + interpolate_table_list = + eps[px::bind(&InterpolateTableContext::init, _r2)] > + ( *(( lit('(') > unary_expression(_r1) > ',' > unary_expression(_r1) > ')' ) + [px::bind(&InterpolateTableContext::add_pair, _1, _2, _val)] >> -lit(',')) ); + interpolate_table.name("interpolate_table_list"); + optional_parameter = iter_pos[px::bind(&FactorActions::set_start_pos, _1, _val)] >> ( lit(')') [ px::bind(&FactorActions::noexpr, _val) ] | (lit(',') > conditional_expression(_r1) > ')') [ _val = _1 ] ); optional_parameter.name("optional_parameter"); - scalar_variable_reference = - variable_reference(_r1)[_a=_1] >> + variable_reference = + variable(_r1)[_a=_1] >> ( - ('[' > additive_expression(_r1)[px::bind(&MyContext::evaluate_index, _1, _b)] > ']' > - iter_pos[px::bind(&MyContext::vector_variable_reference, _r1, _a, _b, _1, _val)]) - | eps[px::bind(&MyContext::scalar_variable_reference, _r1, _a, _val)] + ('[' > additive_expression(_r1)[px::bind(&MyContext::evaluate_index, _1, _b)] > ']' > iter_pos) + [px::bind(&MyContext::store_variable_index, _r1, _a, _b, _2, _val)] + | eps[_val=_a] ); - scalar_variable_reference.name("scalar variable reference"); - - variable_reference = identifier - [ px::bind(&MyContext::resolve_variable, _r1, _1, _val) ]; variable_reference.name("variable reference"); + variable = identifier[ px::bind(&MyContext::resolve_variable, _r1, _1, _val) ]; + variable.name("variable name"); + regular_expression = raw[lexeme['/' > *((utf8char - char_('\\') - char_('/')) | ('\\' > char_)) > '/']]; regular_expression.name("regular_expression"); @@ -1292,30 +2111,41 @@ namespace client ("and") ("digits") ("zdigits") + ("empty") ("if") ("int") + ("is_nil") + ("local") //("inf") ("else") ("elsif") ("endif") ("false") + ("global") + ("interpolate_table") ("min") ("max") ("random") + ("repeat") ("round") ("not") + ("one_of") ("or") + ("size") ("true"); if (0) { debug(start); debug(text); debug(text_block); - debug(macro); + debug(macros); debug(if_else_output); + debug(interpolate_table); // debug(switch_output); debug(legacy_variable_expansion); debug(identifier); + debug(interpolate_table); + debug(interpolate_table_list); debug(conditional_expression); debug(logical_or_expression); debug(logical_and_expression); @@ -1325,15 +2155,17 @@ namespace client debug(additive_expression); debug(multiplicative_expression); debug(unary_expression); + debug(one_of); + debug(one_of_list); debug(optional_parameter); - debug(scalar_variable_reference); debug(variable_reference); + debug(variable); debug(regular_expression); } } - // Generic expression over expr. - typedef qi::rule(const MyContext*), spirit_encoding::space_type> RuleExpression; + // Generic expression over expr. + typedef qi::rule RuleExpression; // The start of the grammar. qi::rule, spirit_encoding::space_type> start; @@ -1342,13 +2174,13 @@ namespace client // A free-form text, possibly empty, possibly containing macro expansions. qi::rule text_block; // Statements enclosed in curely braces {} - qi::rule macro; + qi::rule block, statement, macros, if_text_block, if_macros, else_macros; // Legacy variable expansion of the original Slic3r, in the form of [scalar_variable] or [vector_variable_index]. qi::rule legacy_variable_expansion; // Parsed identifier name. - qi::rule(), spirit_encoding::space_type> identifier; + qi::rule identifier; // Ternary operator (?:) over logical_or_expression. - RuleExpression conditional_expression; + qi::rule, spirit_encoding::space_type> conditional_expression; // Logical or over logical_and_expressions. RuleExpression logical_or_expression; // Logical and over relational_expressions. @@ -1366,39 +2198,39 @@ namespace client // Accepting an optional parameter. RuleExpression optional_parameter; // Rule to capture a regular expression enclosed in //. - qi::rule(), spirit_encoding::space_type> regular_expression; + qi::rule regular_expression; // Evaluate boolean expression into bool. qi::rule bool_expr_eval; // Reference of a scalar variable, or reference to a field of a vector variable. - qi::rule(const MyContext*), qi::locals, int>, spirit_encoding::space_type> scalar_variable_reference; + qi::rule, spirit_encoding::space_type> variable_reference; // Rule to translate an identifier to a ConfigOption, or to fail. - qi::rule(const MyContext*), spirit_encoding::space_type> variable_reference; - - qi::rule, spirit_encoding::space_type> if_else_output; -// qi::rule, bool, std::string>, spirit_encoding::space_type> switch_output; + qi::rule variable; + // Evaluating whether a nullable variable is nil. + qi::rule is_nil_test; + // Evaluating "one of" list of patterns. + qi::rule, spirit_encoding::space_type> one_of; + qi::rule one_of_list; + // Evaluating the "interpolate_table" expression. + qi::rule, spirit_encoding::space_type> interpolate_table; + qi::rule interpolate_table_list; + + qi::rule, spirit_encoding::space_type> if_else_output; + qi::rule, spirit_encoding::space_type> assignment_statement; + // Allocating new local or global variables. + qi::rule, spirit_encoding::space_type> new_variable_statement; + qi::rule(const MyContext*), spirit_encoding::space_type> initializer_list; qi::symbols keywords; }; } +static const client::macro_processor g_macro_processor_instance; + static std::string process_macro(const std::string &templ, client::MyContext &context) { - typedef std::string::const_iterator iterator_type; - typedef client::macro_processor macro_processor; - - // Our whitespace skipper. - spirit_encoding::space_type space; - // Our grammar, statically allocated inside the method, meaning it will be allocated the first time - // PlaceholderParser::process() runs. - //FIXME this kind of initialization is not thread safe! - static macro_processor macro_processor_instance; - // Iterators over the source template. - std::string::const_iterator iter = templ.begin(); - std::string::const_iterator end = templ.end(); - // Accumulator for the processed template. - std::string output; - phrase_parse(iter, end, macro_processor_instance(&context), space, output); - if (!context.error_message.empty()) { + std::string output; + phrase_parse(templ.begin(), templ.end(), g_macro_processor_instance(&context), spirit_encoding::space_type{}, output); + if (! context.error_message.empty()) { if (context.error_message.back() != '\n' && context.error_message.back() != '\r') context.error_message += '\n'; throw Slic3r::PlaceholderParserError(context.error_message); @@ -1406,12 +2238,13 @@ static std::string process_macro(const std::string &templ, client::MyContext &co return output; } -std::string PlaceholderParser::process(const std::string &templ, unsigned int current_extruder_id, const DynamicConfig *config_override, ContextData *context_data) const +std::string PlaceholderParser::process(const std::string &templ, unsigned int current_extruder_id, const DynamicConfig *config_override, DynamicConfig *config_outputs, ContextData *context_data) const { client::MyContext context; context.external_config = this->external_config(); context.config = &this->config(); context.config_override = config_override; + context.config_outputs = config_outputs; context.current_extruder_id = current_extruder_id; context.context_data = context_data; return process_macro(templ, context); diff --git a/src/libslic3r/PlaceholderParser.hpp b/src/libslic3r/PlaceholderParser.hpp index 6157ffe3c86..39c33206c64 100644 --- a/src/libslic3r/PlaceholderParser.hpp +++ b/src/libslic3r/PlaceholderParser.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include "PrintConfig.hpp" @@ -19,7 +20,10 @@ class PlaceholderParser // In the future, the context may hold variables created and modified by the PlaceholderParser // and shared between the PlaceholderParser::process() invocations. struct ContextData { - std::mt19937 rng; + std::mt19937 rng; + // If defined, then this dictionary is used by the scripts to define user variables and persist them + // between PlaceholderParser evaluations. + std::unique_ptr global_config; }; PlaceholderParser(const DynamicConfig *external_config = nullptr); @@ -38,6 +42,8 @@ class PlaceholderParser // Add new ConfigOption values to m_config. void set(const std::string &key, const std::string &value) { this->set(key, new ConfigOptionString(value)); } + void set(const std::string &key, std::string_view value) { this->set(key, new ConfigOptionString(std::string(value))); } + void set(const std::string &key, const char *value) { this->set(key, new ConfigOptionString(value)); } void set(const std::string &key, int value) { this->set(key, new ConfigOptionInt(value)); } void set(const std::string &key, unsigned int value) { this->set(key, int(value)); } void set(const std::string &key, bool value) { this->set(key, new ConfigOptionBool(value)); } @@ -52,8 +58,10 @@ class PlaceholderParser // Fill in the template using a macro processing language. // Throws Slic3r::PlaceholderParserError on syntax or runtime error. - std::string process(const std::string &templ, unsigned int current_extruder_id = 0, const DynamicConfig *config_override = nullptr, ContextData *context = nullptr) const; - + std::string process(const std::string &templ, unsigned int current_extruder_id, const DynamicConfig *config_override, DynamicConfig *config_outputs, ContextData *context) const; + std::string process(const std::string &templ, unsigned int current_extruder_id = 0, const DynamicConfig *config_override = nullptr, ContextData *context = nullptr) const + { return this->process(templ, current_extruder_id, config_override, nullptr /* config_outputs */, context); } + // Evaluate a boolean expression using the full expressive power of the PlaceholderParser boolean expression syntax. // Throws Slic3r::PlaceholderParserError on syntax or runtime error. static bool evaluate_boolean_expression(const std::string &templ, const DynamicConfig &config, const DynamicConfig *config_override = nullptr); diff --git a/src/libslic3r/Point.cpp b/src/libslic3r/Point.cpp index b2427d46dbe..09afcc3993e 100644 --- a/src/libslic3r/Point.cpp +++ b/src/libslic3r/Point.cpp @@ -57,128 +57,6 @@ void Point::rotate(double angle, const Point ¢er) (*this)(1) = (coord_t)round( (double)center(1) + c * dy + s * dx ); } -int Point::nearest_point_index(const Points &points) const -{ - PointConstPtrs p; - p.reserve(points.size()); - for (Points::const_iterator it = points.begin(); it != points.end(); ++it) - p.push_back(&*it); - return this->nearest_point_index(p); -} - -int Point::nearest_point_index(const PointConstPtrs &points) const -{ - int idx = -1; - double distance = -1; // double because long is limited to 2147483647 on some platforms and it's not enough - - for (PointConstPtrs::const_iterator it = points.begin(); it != points.end(); ++it) { - /* If the X distance of the candidate is > than the total distance of the - best previous candidate, we know we don't want it */ - double d = sqr((*this)(0) - (*it)->x()); - if (distance != -1 && d > distance) continue; - - /* If the Y distance of the candidate is > than the total distance of the - best previous candidate, we know we don't want it */ - d += sqr((*this)(1) - (*it)->y()); - if (distance != -1 && d > distance) continue; - - idx = it - points.begin(); - distance = d; - - if (distance < EPSILON) break; - } - - return idx; -} - -int Point::nearest_point_index(const PointPtrs &points) const -{ - PointConstPtrs p; - p.reserve(points.size()); - for (PointPtrs::const_iterator it = points.begin(); it != points.end(); ++it) - p.push_back(*it); - return this->nearest_point_index(p); -} - -bool Point::nearest_point(const Points &points, Point* point) const -{ - int idx = this->nearest_point_index(points); - if (idx == -1) return false; - *point = points.at(idx); - return true; -} - -/* Three points are a counter-clockwise turn if ccw > 0, clockwise if - * ccw < 0, and collinear if ccw = 0 because ccw is a determinant that - * gives the signed area of the triangle formed by p1, p2 and this point. - * In other words it is the 2D cross product of p1-p2 and p1-this, i.e. - * z-component of their 3D cross product. - * We return double because it must be big enough to hold 2*max(|coordinate|)^2 - */ -double Point::ccw(const Point &p1, const Point &p2) const -{ - static_assert(sizeof(coord_t) == 4, "Point::ccw() requires a 32 bit coord_t"); - return cross2((p2 - p1).cast(), (*this - p1).cast()); -// return cross2((p2 - p1).cast(), (*this - p1).cast()); -} - -double Point::ccw(const Line &line) const -{ - return this->ccw(line.a, line.b); -} - -// returns the CCW angle between this-p1 and this-p2 -// i.e. this assumes a CCW rotation from p1 to p2 around this -double Point::ccw_angle(const Point &p1, const Point &p2) const -{ - //FIXME this calculates an atan2 twice! Project one vector into the other! - double angle = atan2(p1.x() - (*this).x(), p1.y() - (*this).y()) - - atan2(p2.x() - (*this).x(), p2.y() - (*this).y()); - // we only want to return only positive angles - return angle <= 0 ? angle + 2*PI : angle; -} - -Point Point::projection_onto(const MultiPoint &poly) const -{ - Point running_projection = poly.first_point(); - double running_min = (running_projection - *this).cast().norm(); - - Lines lines = poly.lines(); - for (Lines::const_iterator line = lines.begin(); line != lines.end(); ++line) { - Point point_temp = this->projection_onto(*line); - if ((point_temp - *this).cast().norm() < running_min) { - running_projection = point_temp; - running_min = (running_projection - *this).cast().norm(); - } - } - return running_projection; -} - -Point Point::projection_onto(const Line &line) const -{ - if (line.a == line.b) return line.a; - - /* - (Ported from VisiLibity by Karl J. Obermeyer) - The projection of point_temp onto the line determined by - line_segment_temp can be represented as an affine combination - expressed in the form projection of - Point = theta*line_segment_temp.first + (1.0-theta)*line_segment_temp.second. - If theta is outside the interval [0,1], then one of the Line_Segment's endpoints - must be closest to calling Point. - */ - double lx = (double)(line.b(0) - line.a(0)); - double ly = (double)(line.b(1) - line.a(1)); - double theta = ( (double)(line.b(0) - (*this)(0))*lx + (double)(line.b(1)- (*this)(1))*ly ) - / ( sqr(lx) + sqr(ly) ); - - if (0.0 <= theta && theta <= 1.0) - return (theta * line.a.cast() + (1.0-theta) * line.b.cast()).cast(); - - // Else pick closest endpoint. - return ((line.a - *this).cast().squaredNorm() < (line.b - *this).cast().squaredNorm()) ? line.a : line.b; -} - bool has_duplicate_points(std::vector &&pts) { std::sort(pts.begin(), pts.end()); @@ -188,18 +66,46 @@ bool has_duplicate_points(std::vector &&pts) return false; } +Points collect_duplicates(Points pts /* Copy */) +{ + std::sort(pts.begin(), pts.end()); + Points duplicits; + const Point *prev = &pts.front(); + for (size_t i = 1; i < pts.size(); ++i) { + const Point *act = &pts[i]; + if (*prev == *act) { + // duplicit point + if (!duplicits.empty() && duplicits.back() == *act) + continue; // only unique duplicits + duplicits.push_back(*act); + } + prev = act; + } + return duplicits; +} + +template BoundingBox get_extents(const Points &pts) { - return BoundingBox(pts); + BoundingBox out; + BoundingBox::construct(out, pts.begin(), pts.end()); + return out; } +template BoundingBox get_extents(const Points &pts); +template BoundingBox get_extents(const Points &pts); +// if IncludeBoundary, then a bounding box is defined even for a single point. +// otherwise a bounding box is only defined if it has a positive area. +template BoundingBox get_extents(const std::vector &pts) { BoundingBox bbox; for (const Points &p : pts) - bbox.merge(get_extents(p)); + bbox.merge(get_extents(p)); return bbox; } +template BoundingBox get_extents(const std::vector &pts); +template BoundingBox get_extents(const std::vector &pts); BoundingBoxf get_extents(const std::vector &pts) { @@ -209,6 +115,29 @@ BoundingBoxf get_extents(const std::vector &pts) return bbox; } +int nearest_point_index(const Points &points, const Point &pt) +{ + int64_t distance = std::numeric_limits::max(); + int idx = -1; + + for (const Point &pt2 : points) { + // If the X distance of the candidate is > than the total distance of the + // best previous candidate, we know we don't want it. + int64_t d = sqr(pt2.x() - pt.x()); + if (d < distance) { + // If the Y distance of the candidate is > than the total distance of the + // best previous candidate, we know we don't want it. + d += sqr(pt2.y() - pt.y()); + if (d < distance) { + idx = &pt2 - points.data(); + distance = d; + } + } + } + + return idx; +} + std::ostream& operator<<(std::ostream &stm, const Vec2d &pointf) { return stm << pointf(0) << "," << pointf(1); diff --git a/src/libslic3r/Point.hpp b/src/libslic3r/Point.hpp index 6f2d732a45a..d53352f28e3 100644 --- a/src/libslic3r/Point.hpp +++ b/src/libslic3r/Point.hpp @@ -1,564 +1,609 @@ -#ifndef slic3r_Point_hpp_ -#define slic3r_Point_hpp_ - -#include "libslic3r.h" -#include -#include -#include -#include -#include -#include - -#include - -#include "LocalesUtils.hpp" - -namespace Slic3r { - -class BoundingBox; -class BoundingBoxf; -class Line; -class MultiPoint; -class Point; -using Vector = Point; - -// Base template for eigen derived vectors -template -using Mat = Eigen::Matrix; - -template using Vec = Mat; - -// Eigen types, to replace the Slic3r's own types in the future. -// Vector types with a fixed point coordinate base type. -using Vec2crd = Eigen::Matrix; -using Vec3crd = Eigen::Matrix; -using Vec2i = Eigen::Matrix; -using Vec3i = Eigen::Matrix; -using Vec4i = Eigen::Matrix; -using Vec2i32 = Eigen::Matrix; -using Vec2i64 = Eigen::Matrix; -using Vec3i32 = Eigen::Matrix; -using Vec3i64 = Eigen::Matrix; - -// Vector types with a double coordinate base type. -using Vec2f = Eigen::Matrix; -using Vec3f = Eigen::Matrix; -using Vec2d = Eigen::Matrix; -using Vec3d = Eigen::Matrix; - -using Points = std::vector; -using PointPtrs = std::vector; -using PointConstPtrs = std::vector; -using Points3 = std::vector; -using Pointfs = std::vector; -using Vec2ds = std::vector; -using Pointf3s = std::vector; - -using Matrix2f = Eigen::Matrix; -using Matrix2d = Eigen::Matrix; -using Matrix3f = Eigen::Matrix; -using Matrix3d = Eigen::Matrix; -using Matrix4f = Eigen::Matrix; -using Matrix4d = Eigen::Matrix; - -template -using Transform = Eigen::Transform; - -using Transform2f = Eigen::Transform; -using Transform2d = Eigen::Transform; -using Transform3f = Eigen::Transform; -using Transform3d = Eigen::Transform; - -// I don't know why Eigen::Transform::Identity() return a const object... -template Transform identity() { return Transform::Identity(); } -inline const auto &identity3f = identity<3, float>; -inline const auto &identity3d = identity<3, double>; - -inline bool operator<(const Vec2d &lhs, const Vec2d &rhs) { return lhs.x() < rhs.x() || (lhs.x() == rhs.x() && lhs.y() < rhs.y()); } - -template -int32_t cross2(const Eigen::MatrixBase> &v1, const Eigen::MatrixBase> &v2) = delete; - -template -inline T cross2(const Eigen::MatrixBase> &v1, const Eigen::MatrixBase> &v2) -{ - return v1.x() * v2.y() - v1.y() * v2.x(); -} - -template -inline typename Derived::Scalar cross2(const Eigen::MatrixBase &v1, const Eigen::MatrixBase &v2) -{ - static_assert(std::is_same::value, "cross2(): Scalar types of 1st and 2nd operand must be equal."); - return v1.x() * v2.y() - v1.y() * v2.x(); -} - -template -inline Eigen::Matrix perp(const Eigen::MatrixBase> &v) { return Eigen::Matrix(- v.y(), v.x()); } - -template -Eigen::Matrix to_2d(const Eigen::MatrixBase> &ptN) { return { ptN.x(), ptN.y() }; } - -template -Eigen::Matrix to_3d(const Eigen::MatrixBase> & pt, const T z) { return { pt.x(), pt.y(), z }; } - -inline Vec2d unscale(coord_t x, coord_t y) { return Vec2d(unscale(x), unscale(y)); } -inline Vec2d unscale(const Vec2crd &pt) { return Vec2d(unscale(pt.x()), unscale(pt.y())); } -inline Vec2d unscale(const Vec2d &pt) { return Vec2d(unscale(pt.x()), unscale(pt.y())); } -inline Vec3d unscale(coord_t x, coord_t y, coord_t z) { return Vec3d(unscale(x), unscale(y), unscale(z)); } -inline Vec3d unscale(const Vec3crd &pt) { return Vec3d(unscale(pt.x()), unscale(pt.y()), unscale(pt.z())); } -inline Vec3d unscale(const Vec3d &pt) { return Vec3d(unscale(pt.x()), unscale(pt.y()), unscale(pt.z())); } - -inline std::string to_string(const Vec2crd &pt) { return std::string("[") + float_to_string_decimal_point(pt.x()) + ", " + float_to_string_decimal_point(pt.y()) + "]"; } -inline std::string to_string(const Vec2d &pt) { return std::string("[") + float_to_string_decimal_point(pt.x()) + ", " + float_to_string_decimal_point(pt.y()) + "]"; } -inline std::string to_string(const Vec3crd &pt) { return std::string("[") + float_to_string_decimal_point(pt.x()) + ", " + float_to_string_decimal_point(pt.y()) + ", " + float_to_string_decimal_point(pt.z()) + "]"; } -inline std::string to_string(const Vec3d &pt) { return std::string("[") + float_to_string_decimal_point(pt.x()) + ", " + float_to_string_decimal_point(pt.y()) + ", " + float_to_string_decimal_point(pt.z()) + "]"; } - -std::vector transform(const std::vector& points, const Transform3f& t); -Pointf3s transform(const Pointf3s& points, const Transform3d& t); - -template using Vec = Eigen::Matrix; - -class Point : public Vec2crd -{ -public: - using coord_type = coord_t; - - Point() : Vec2crd(0, 0) {} - Point(int32_t x, int32_t y) : Vec2crd(coord_t(x), coord_t(y)) {} - Point(int64_t x, int64_t y) : Vec2crd(coord_t(x), coord_t(y)) {} - Point(double x, double y) : Vec2crd(coord_t(lrint(x)), coord_t(lrint(y))) {} - Point(const Point &rhs) { *this = rhs; } - explicit Point(const Vec2d& rhs) : Vec2crd(coord_t(lrint(rhs.x())), coord_t(lrint(rhs.y()))) {} - // This constructor allows you to construct Point from Eigen expressions - template - Point(const Eigen::MatrixBase &other) : Vec2crd(other) {} - static Point new_scale(coordf_t x, coordf_t y) { return Point(coord_t(scale_(x)), coord_t(scale_(y))); } - static Point new_scale(const Vec2d &v) { return Point(coord_t(scale_(v.x())), coord_t(scale_(v.y()))); } - static Point new_scale(const Vec2f &v) { return Point(coord_t(scale_(v.x())), coord_t(scale_(v.y()))); } - - // This method allows you to assign Eigen expressions to MyVectorType - template - Point& operator=(const Eigen::MatrixBase &other) - { - this->Vec2crd::operator=(other); - return *this; - } - - Point& operator+=(const Point& rhs) { this->x() += rhs.x(); this->y() += rhs.y(); return *this; } - Point& operator-=(const Point& rhs) { this->x() -= rhs.x(); this->y() -= rhs.y(); return *this; } - Point& operator*=(const double &rhs) { this->x() = coord_t(this->x() * rhs); this->y() = coord_t(this->y() * rhs); return *this; } - Point operator*(const double &rhs) { return Point(this->x() * rhs, this->y() * rhs); } - - void rotate(double angle) { this->rotate(std::cos(angle), std::sin(angle)); } - void rotate(double cos_a, double sin_a) { - double cur_x = (double)this->x(); - double cur_y = (double)this->y(); - this->x() = (coord_t)round(cos_a * cur_x - sin_a * cur_y); - this->y() = (coord_t)round(cos_a * cur_y + sin_a * cur_x); - } - - void rotate(double angle, const Point ¢er); - Point rotated(double angle) const { Point res(*this); res.rotate(angle); return res; } - Point rotated(double cos_a, double sin_a) const { Point res(*this); res.rotate(cos_a, sin_a); return res; } - Point rotated(double angle, const Point ¢er) const { Point res(*this); res.rotate(angle, center); return res; } - Point rotate_90_degree_ccw() const { return Point(-this->y(), this->x()); } - int nearest_point_index(const Points &points) const; - int nearest_point_index(const PointConstPtrs &points) const; - int nearest_point_index(const PointPtrs &points) const; - bool nearest_point(const Points &points, Point* point) const; - double ccw(const Point &p1, const Point &p2) const; - double ccw(const Line &line) const; - double ccw_angle(const Point &p1, const Point &p2) const; - Point projection_onto(const MultiPoint &poly) const; - Point projection_onto(const Line &line) const; -}; - -inline bool operator<(const Point &l, const Point &r) -{ - return l.x() < r.x() || (l.x() == r.x() && l.y() < r.y()); -} - -inline Point operator* (const Point& l, const double &r) -{ - return {coord_t(l.x() * r), coord_t(l.y() * r)}; -} - -inline bool is_approx(const Point &p1, const Point &p2, coord_t epsilon = coord_t(SCALED_EPSILON)) -{ - Point d = (p2 - p1).cwiseAbs(); - return d.x() < epsilon && d.y() < epsilon; -} - -inline bool is_approx(const Vec2f &p1, const Vec2f &p2, float epsilon = float(EPSILON)) -{ - Vec2f d = (p2 - p1).cwiseAbs(); - return d.x() < epsilon && d.y() < epsilon; -} - -inline bool is_approx(const Vec2d &p1, const Vec2d &p2, double epsilon = EPSILON) -{ - Vec2d d = (p2 - p1).cwiseAbs(); - return d.x() < epsilon && d.y() < epsilon; -} - -inline bool is_approx(const Vec3f &p1, const Vec3f &p2, float epsilon = float(EPSILON)) -{ - Vec3f d = (p2 - p1).cwiseAbs(); - return d.x() < epsilon && d.y() < epsilon && d.z() < epsilon; -} - -inline bool is_approx(const Vec3d &p1, const Vec3d &p2, double epsilon = EPSILON) -{ - Vec3d d = (p2 - p1).cwiseAbs(); - return d.x() < epsilon && d.y() < epsilon && d.z() < epsilon; -} - -inline Point lerp(const Point &a, const Point &b, double t) -{ - assert((t >= -EPSILON) && (t <= 1. + EPSILON)); - return ((1. - t) * a.cast() + t * b.cast()).cast(); -} - -BoundingBox get_extents(const Points &pts); -BoundingBox get_extents(const std::vector &pts); -BoundingBoxf get_extents(const std::vector &pts); - -// Test for duplicate points in a vector of points. -// The points are copied, sorted and checked for duplicates globally. -bool has_duplicate_points(std::vector &&pts); -inline bool has_duplicate_points(const std::vector &pts) -{ - std::vector cpy = pts; - return has_duplicate_points(std::move(cpy)); -} - -// Test for duplicate points in a vector of points. -// Only successive points are checked for equality. -inline bool has_duplicate_successive_points(const std::vector &pts) -{ - for (size_t i = 1; i < pts.size(); ++ i) - if (pts[i - 1] == pts[i]) - return true; - return false; -} - -// Test for duplicate points in a vector of points. -// Only successive points are checked for equality. Additionally, first and last points are compared for equality. -inline bool has_duplicate_successive_points_closed(const std::vector &pts) -{ - return has_duplicate_successive_points(pts) || (pts.size() >= 2 && pts.front() == pts.back()); -} - -inline bool shorter_then(const Point& p0, const coord_t len) -{ - if (p0.x() > len || p0.x() < -len) - return false; - if (p0.y() > len || p0.y() < -len) - return false; - return p0.cast().squaredNorm() <= Slic3r::sqr(int64_t(len)); -} - -namespace int128 { - // Exact orientation predicate, - // returns +1: CCW, 0: collinear, -1: CW. - int orient(const Vec2crd &p1, const Vec2crd &p2, const Vec2crd &p3); - // Exact orientation predicate, - // returns +1: CCW, 0: collinear, -1: CW. - int cross(const Vec2crd &v1, const Vec2crd &v2); -} - -// To be used by std::unordered_map, std::unordered_multimap and friends. -struct PointHash { - size_t operator()(const Vec2crd &pt) const { - return coord_t((89 * 31 + int64_t(pt.x())) * 31 + pt.y()); - } -}; - -// A generic class to search for a closest Point in a given radius. -// It uses std::unordered_multimap to implement an efficient 2D spatial hashing. -// The PointAccessor has to return const Point*. -// If a nullptr is returned, it is ignored by the query. -template class ClosestPointInRadiusLookup -{ -public: - ClosestPointInRadiusLookup(coord_t search_radius, PointAccessor point_accessor = PointAccessor()) : - m_search_radius(search_radius), m_point_accessor(point_accessor), m_grid_log2(0) - { - // Resolution of a grid, twice the search radius + some epsilon. - coord_t gridres = 2 * m_search_radius + 4; - m_grid_resolution = gridres; - assert(m_grid_resolution > 0); - assert(m_grid_resolution < (coord_t(1) << 30)); - // Compute m_grid_log2 = log2(m_grid_resolution) - if (m_grid_resolution > 32767) { - m_grid_resolution >>= 16; - m_grid_log2 += 16; - } - if (m_grid_resolution > 127) { - m_grid_resolution >>= 8; - m_grid_log2 += 8; - } - if (m_grid_resolution > 7) { - m_grid_resolution >>= 4; - m_grid_log2 += 4; - } - if (m_grid_resolution > 1) { - m_grid_resolution >>= 2; - m_grid_log2 += 2; - } - if (m_grid_resolution > 0) - ++ m_grid_log2; - m_grid_resolution = 1 << m_grid_log2; - assert(m_grid_resolution >= gridres); - assert(gridres > m_grid_resolution / 2); - } - - void insert(const ValueType &value) { - const Vec2crd *pt = m_point_accessor(value); - if (pt != nullptr) - m_map.emplace(std::make_pair(Vec2crd(pt->x()>>m_grid_log2, pt->y()>>m_grid_log2), value)); - } - - void insert(ValueType &&value) { - const Vec2crd *pt = m_point_accessor(value); - if (pt != nullptr) - m_map.emplace(std::make_pair(Vec2crd(pt->x()>>m_grid_log2, pt->y()>>m_grid_log2), std::move(value))); - } - - // Erase a data point equal to value. (ValueType has to declare the operator==). - // Returns true if the data point equal to value was found and removed. - bool erase(const ValueType &value) { - const Point *pt = m_point_accessor(value); - if (pt != nullptr) { - // Range of fragment starts around grid_corner, close to pt. - auto range = m_map.equal_range(Point((*pt).x()>>m_grid_log2, (*pt).y()>>m_grid_log2)); - // Remove the first item. - for (auto it = range.first; it != range.second; ++ it) { - if (it->second == value) { - m_map.erase(it); - return true; - } - } - } - return false; - } - - // Return a pair of - std::pair find(const Vec2crd &pt) { - // Iterate over 4 closest grid cells around pt, - // find the closest start point inside these cells to pt. - const ValueType *value_min = nullptr; - double dist_min = std::numeric_limits::max(); - // Round pt to a closest grid_cell corner. - Vec2crd grid_corner((pt.x()+(m_grid_resolution>>1))>>m_grid_log2, (pt.y()+(m_grid_resolution>>1))>>m_grid_log2); - // For four neighbors of grid_corner: - for (coord_t neighbor_y = -1; neighbor_y < 1; ++ neighbor_y) { - for (coord_t neighbor_x = -1; neighbor_x < 1; ++ neighbor_x) { - // Range of fragment starts around grid_corner, close to pt. - auto range = m_map.equal_range(Vec2crd(grid_corner.x() + neighbor_x, grid_corner.y() + neighbor_y)); - // Find the map entry closest to pt. - for (auto it = range.first; it != range.second; ++it) { - const ValueType &value = it->second; - const Vec2crd *pt2 = m_point_accessor(value); - if (pt2 != nullptr) { - const double d2 = (pt - *pt2).cast().squaredNorm(); - if (d2 < dist_min) { - dist_min = d2; - value_min = &value; - } - } - } - } - } - return (value_min != nullptr && dist_min < coordf_t(m_search_radius) * coordf_t(m_search_radius)) ? - std::make_pair(value_min, dist_min) : - std::make_pair(nullptr, std::numeric_limits::max()); - } - - // Returns all pairs of values and squared distances. - std::vector> find_all(const Vec2crd &pt) { - // Iterate over 4 closest grid cells around pt, - // Round pt to a closest grid_cell corner. - Vec2crd grid_corner((pt.x()+(m_grid_resolution>>1))>>m_grid_log2, (pt.y()+(m_grid_resolution>>1))>>m_grid_log2); - // For four neighbors of grid_corner: - std::vector> out; - const double r2 = double(m_search_radius) * m_search_radius; - for (coord_t neighbor_y = -1; neighbor_y < 1; ++ neighbor_y) { - for (coord_t neighbor_x = -1; neighbor_x < 1; ++ neighbor_x) { - // Range of fragment starts around grid_corner, close to pt. - auto range = m_map.equal_range(Vec2crd(grid_corner.x() + neighbor_x, grid_corner.y() + neighbor_y)); - // Find the map entry closest to pt. - for (auto it = range.first; it != range.second; ++it) { - const ValueType &value = it->second; - const Vec2crd *pt2 = m_point_accessor(value); - if (pt2 != nullptr) { - const double d2 = (pt - *pt2).cast().squaredNorm(); - if (d2 <= r2) - out.emplace_back(&value, d2); - } - } - } - } - return out; - } - -private: - using map_type = typename std::unordered_multimap; - PointAccessor m_point_accessor; - map_type m_map; - coord_t m_search_radius; - coord_t m_grid_resolution; - coord_t m_grid_log2; -}; - -std::ostream& operator<<(std::ostream &stm, const Vec2d &pointf); - - -// ///////////////////////////////////////////////////////////////////////////// -// Type safe conversions to and from scaled and unscaled coordinates -// ///////////////////////////////////////////////////////////////////////////// - -// Semantics are the following: -// Upscaling (scaled()): only from floating point types (or Vec) to either -// floating point or integer 'scaled coord' coordinates. -// Downscaling (unscaled()): from arithmetic (or Vec) to floating point only - -// Conversion definition from unscaled to floating point scaled -template> -inline constexpr FloatingOnly scaled(const Tin &v) noexcept -{ - return Tout(v / Tin(SCALING_FACTOR)); -} - -// Conversion definition from unscaled to integer 'scaled coord'. -// TODO: is the rounding necessary? Here it is commented out to show that -// it can be different for integers but it does not have to be. Using -// std::round means loosing noexcept and constexpr modifiers -template> -inline constexpr ScaledCoordOnly scaled(const Tin &v) noexcept -{ - //return static_cast(std::round(v / SCALING_FACTOR)); - return Tout(v / Tin(SCALING_FACTOR)); -} - -// Conversion for Eigen vectors (N dimensional points) -template, - int...EigenArgs> -inline Eigen::Matrix, N, EigenArgs...> -scaled(const Eigen::Matrix &v) -{ - return (v / SCALING_FACTOR).template cast(); -} - -// Conversion from arithmetic scaled type to floating point unscaled -template, - class = FloatingOnly> -inline constexpr Tout unscaled(const Tin &v) noexcept -{ - return Tout(v) * Tout(SCALING_FACTOR); -} - -// Unscaling for Eigen vectors. Input base type can be arithmetic, output base -// type can only be floating point. -template, - class = FloatingOnly, - int...EigenArgs> -inline constexpr Eigen::Matrix -unscaled(const Eigen::Matrix &v) noexcept -{ - return v.template cast() * Tout(SCALING_FACTOR); -} - -// Align a coordinate to a grid. The coordinate may be negative, -// the aligned value will never be bigger than the original one. -inline coord_t align_to_grid(const coord_t coord, const coord_t spacing) { - // Current C++ standard defines the result of integer division to be rounded to zero, - // for both positive and negative numbers. Here we want to round down for negative - // numbers as well. - coord_t aligned = (coord < 0) ? - ((coord - spacing + 1) / spacing) * spacing : - (coord / spacing) * spacing; - assert(aligned <= coord); - return aligned; -} -inline Point align_to_grid(Point coord, Point spacing) - { return Point(align_to_grid(coord.x(), spacing.x()), align_to_grid(coord.y(), spacing.y())); } -inline coord_t align_to_grid(coord_t coord, coord_t spacing, coord_t base) - { return base + align_to_grid(coord - base, spacing); } -inline Point align_to_grid(Point coord, Point spacing, Point base) - { return Point(align_to_grid(coord.x(), spacing.x(), base.x()), align_to_grid(coord.y(), spacing.y(), base.y())); } - -} // namespace Slic3r - -// start Boost -#include -#include -namespace boost { namespace polygon { - template <> - struct geometry_concept { using type = point_concept; }; - - template <> - struct point_traits { - using coordinate_type = coord_t; - - static inline coordinate_type get(const Slic3r::Point& point, orientation_2d orient) { - return static_cast(point((orient == HORIZONTAL) ? 0 : 1)); - } - }; - - template <> - struct point_mutable_traits { - using coordinate_type = coord_t; - static inline void set(Slic3r::Point& point, orientation_2d orient, coord_t value) { - point((orient == HORIZONTAL) ? 0 : 1) = value; - } - static inline Slic3r::Point construct(coord_t x_value, coord_t y_value) { - return Slic3r::Point(x_value, y_value); - } - }; -} } -// end Boost - -// Serialization through the Cereal library -namespace cereal { -// template void serialize(Archive& archive, Slic3r::Vec2crd &v) { archive(v.x(), v.y()); } -// template void serialize(Archive& archive, Slic3r::Vec3crd &v) { archive(v.x(), v.y(), v.z()); } - template void serialize(Archive& archive, Slic3r::Vec2i &v) { archive(v.x(), v.y()); } - template void serialize(Archive& archive, Slic3r::Vec3i &v) { archive(v.x(), v.y(), v.z()); } -// template void serialize(Archive& archive, Slic3r::Vec2i64 &v) { archive(v.x(), v.y()); } -// template void serialize(Archive& archive, Slic3r::Vec3i64 &v) { archive(v.x(), v.y(), v.z()); } - template void serialize(Archive& archive, Slic3r::Vec2f &v) { archive(v.x(), v.y()); } - template void serialize(Archive& archive, Slic3r::Vec3f &v) { archive(v.x(), v.y(), v.z()); } - template void serialize(Archive& archive, Slic3r::Vec2d &v) { archive(v.x(), v.y()); } - template void serialize(Archive& archive, Slic3r::Vec3d &v) { archive(v.x(), v.y(), v.z()); } - - template void load(Archive& archive, Slic3r::Matrix2f &m) { archive.loadBinary((char*)m.data(), sizeof(float) * 4); } - template void save(Archive& archive, Slic3r::Matrix2f &m) { archive.saveBinary((char*)m.data(), sizeof(float) * 4); } -} - -// To be able to use Vec<> and Mat<> in range based for loops: -namespace Eigen { -template -T* begin(Slic3r::Mat &mat) { return mat.data(); } - -template -T* end(Slic3r::Mat &mat) { return mat.data() + N * M; } - -template -const T* begin(const Slic3r::Mat &mat) { return mat.data(); } - -template -const T* end(const Slic3r::Mat &mat) { return mat.data() + N * M; } -} // namespace Eigen - -#endif +#ifndef slic3r_Point_hpp_ +#define slic3r_Point_hpp_ + +#include "libslic3r.h" +#include +#include +#include +#include +#include +#include + +#include + +#include "LocalesUtils.hpp" + +namespace Slic3r { + +class BoundingBox; +class BoundingBoxf; +class Point; +using Vector = Point; + +// Base template for eigen derived vectors +template +using Mat = Eigen::Matrix; + +template using Vec = Mat; + +template +using DynVec = Eigen::Matrix; + +// Eigen types, to replace the Slic3r's own types in the future. +// Vector types with a fixed point coordinate base type. +using Vec2crd = Eigen::Matrix; +using Vec3crd = Eigen::Matrix; +using Vec2i = Eigen::Matrix; +using Vec3i = Eigen::Matrix; +using Vec4i = Eigen::Matrix; +using Vec2i32 = Eigen::Matrix; +using Vec2i64 = Eigen::Matrix; +using Vec3i32 = Eigen::Matrix; +using Vec3i64 = Eigen::Matrix; + +// Vector types with a double coordinate base type. +using Vec2f = Eigen::Matrix; +using Vec3f = Eigen::Matrix; +using Vec4f = Eigen::Matrix; +using Vec2d = Eigen::Matrix; +using Vec3d = Eigen::Matrix; +using Vec4d = Eigen::Matrix; + +using Points = std::vector; +using PointPtrs = std::vector; +using PointConstPtrs = std::vector; +using Points3 = std::vector; +using Pointfs = std::vector; +using Vec2ds = std::vector; +using Pointf3s = std::vector; + +using Matrix2f = Eigen::Matrix; +using Matrix2d = Eigen::Matrix; +using Matrix3f = Eigen::Matrix; +using Matrix3d = Eigen::Matrix; +using Matrix4f = Eigen::Matrix; +using Matrix4d = Eigen::Matrix; + +template +using Transform = Eigen::Transform; + +using Transform2f = Eigen::Transform; +using Transform2d = Eigen::Transform; +using Transform3f = Eigen::Transform; +using Transform3d = Eigen::Transform; + +// I don't know why Eigen::Transform::Identity() return a const object... +template Transform identity() { return Transform::Identity(); } +inline const auto &identity3f = identity<3, float>; +inline const auto &identity3d = identity<3, double>; + +inline bool operator<(const Vec2d &lhs, const Vec2d &rhs) { return lhs.x() < rhs.x() || (lhs.x() == rhs.x() && lhs.y() < rhs.y()); } + +// Cross product of two 2D vectors. +// None of the vectors may be of int32_t type as the result would overflow. +template +inline typename Derived::Scalar cross2(const Eigen::MatrixBase &v1, const Eigen::MatrixBase &v2) +{ + static_assert(Derived::IsVectorAtCompileTime && int(Derived::SizeAtCompileTime) == 2, "cross2(): first parameter is not a 2D vector"); + static_assert(Derived2::IsVectorAtCompileTime && int(Derived2::SizeAtCompileTime) == 2, "cross2(): first parameter is not a 2D vector"); + static_assert(! std::is_same::value, "cross2(): Scalar type must not be int32_t, otherwise the cross product would overflow."); + static_assert(std::is_same::value, "cross2(): Scalar types of 1st and 2nd operand must be equal."); + return v1.x() * v2.y() - v1.y() * v2.x(); +} + +// 2D vector perpendicular to the argument. +template +inline Eigen::Matrix perp(const Eigen::MatrixBase &v) +{ + static_assert(Derived::IsVectorAtCompileTime && int(Derived::SizeAtCompileTime) == 2, "perp(): parameter is not a 2D vector"); + return { - v.y(), v.x() }; +} + +// Angle from v1 to v2, returning double atan2(y, x) normalized to <-PI, PI>. +template +inline double angle(const Eigen::MatrixBase &v1, const Eigen::MatrixBase &v2) { + static_assert(Derived::IsVectorAtCompileTime && int(Derived::SizeAtCompileTime) == 2, "angle(): first parameter is not a 2D vector"); + static_assert(Derived2::IsVectorAtCompileTime && int(Derived2::SizeAtCompileTime) == 2, "angle(): second parameter is not a 2D vector"); + auto v1d = v1.template cast(); + auto v2d = v2.template cast(); + return atan2(cross2(v1d, v2d), v1d.dot(v2d)); +} + +template +Eigen::Matrix to_2d(const Eigen::MatrixBase &ptN) { + static_assert(Derived::IsVectorAtCompileTime && int(Derived::SizeAtCompileTime) >= 3, "to_2d(): first parameter is not a 3D or higher dimensional vector"); + return ptN.template head<2>(); +} + +template +inline Eigen::Matrix to_3d(const Eigen::MatrixBase &pt, const typename Derived::Scalar z) { + static_assert(Derived::IsVectorAtCompileTime && int(Derived::SizeAtCompileTime) == 2, "to_3d(): first parameter is not a 2D vector"); + return { pt.x(), pt.y(), z }; +} + +inline Vec2d unscale(coord_t x, coord_t y) { return Vec2d(unscale(x), unscale(y)); } +inline Vec2d unscale(const Vec2crd &pt) { return Vec2d(unscale(pt.x()), unscale(pt.y())); } +inline Vec2d unscale(const Vec2d &pt) { return Vec2d(unscale(pt.x()), unscale(pt.y())); } +inline Vec3d unscale(coord_t x, coord_t y, coord_t z) { return Vec3d(unscale(x), unscale(y), unscale(z)); } +inline Vec3d unscale(const Vec3crd &pt) { return Vec3d(unscale(pt.x()), unscale(pt.y()), unscale(pt.z())); } +inline Vec3d unscale(const Vec3d &pt) { return Vec3d(unscale(pt.x()), unscale(pt.y()), unscale(pt.z())); } + +inline std::string to_string(const Vec2crd &pt) { return std::string("[") + float_to_string_decimal_point(pt.x()) + ", " + float_to_string_decimal_point(pt.y()) + "]"; } +inline std::string to_string(const Vec2d &pt) { return std::string("[") + float_to_string_decimal_point(pt.x()) + ", " + float_to_string_decimal_point(pt.y()) + "]"; } +inline std::string to_string(const Vec3crd &pt) { return std::string("[") + float_to_string_decimal_point(pt.x()) + ", " + float_to_string_decimal_point(pt.y()) + ", " + float_to_string_decimal_point(pt.z()) + "]"; } +inline std::string to_string(const Vec3d &pt) { return std::string("[") + float_to_string_decimal_point(pt.x()) + ", " + float_to_string_decimal_point(pt.y()) + ", " + float_to_string_decimal_point(pt.z()) + "]"; } + +std::vector transform(const std::vector& points, const Transform3f& t); +Pointf3s transform(const Pointf3s& points, const Transform3d& t); + +/// +/// Check whether transformation matrix contains odd number of mirroring. +/// NOTE: In code is sometime function named is_left_handed +/// +/// Transformation to check +/// Is positive determinant +inline bool has_reflection(const Transform3d &transform) { return transform.matrix().determinant() < 0; } + +template using Vec = Eigen::Matrix; + +class Point : public Vec2crd +{ +public: + using coord_type = coord_t; + + Point() : Vec2crd(0, 0) {} + Point(int32_t x, int32_t y) : Vec2crd(coord_t(x), coord_t(y)) {} + Point(int64_t x, int64_t y) : Vec2crd(coord_t(x), coord_t(y)) {} + Point(double x, double y) : Vec2crd(coord_t(std::round(x)), coord_t(std::round(y))) {} + Point(const Point &rhs) { *this = rhs; } + explicit Point(const Vec2d& rhs) : Vec2crd(coord_t(std::round(rhs.x())), coord_t(std::round(rhs.y()))) {} + // This constructor allows you to construct Point from Eigen expressions + template + Point(const Eigen::MatrixBase &other) : Vec2crd(other) {} + static Point new_scale(coordf_t x, coordf_t y) { return Point(coord_t(scale_(x)), coord_t(scale_(y))); } + static Point new_scale(const Vec2d &v) { return Point(coord_t(scale_(v.x())), coord_t(scale_(v.y()))); } + static Point new_scale(const Vec2f &v) { return Point(coord_t(scale_(v.x())), coord_t(scale_(v.y()))); } + + // This method allows you to assign Eigen expressions to MyVectorType + template + Point& operator=(const Eigen::MatrixBase &other) + { + this->Vec2crd::operator=(other); + return *this; + } + + Point& operator+=(const Point& rhs) { this->x() += rhs.x(); this->y() += rhs.y(); return *this; } + Point& operator-=(const Point& rhs) { this->x() -= rhs.x(); this->y() -= rhs.y(); return *this; } + Point& operator*=(const double &rhs) { this->x() = coord_t(this->x() * rhs); this->y() = coord_t(this->y() * rhs); return *this; } + Point operator*(const double &rhs) { return Point(this->x() * rhs, this->y() * rhs); } + + void rotate(double angle) { this->rotate(std::cos(angle), std::sin(angle)); } + void rotate(double cos_a, double sin_a) { + double cur_x = (double)this->x(); + double cur_y = (double)this->y(); + this->x() = (coord_t)round(cos_a * cur_x - sin_a * cur_y); + this->y() = (coord_t)round(cos_a * cur_y + sin_a * cur_x); + } + + void rotate(double angle, const Point ¢er); + Point rotated(double angle) const { Point res(*this); res.rotate(angle); return res; } + Point rotated(double cos_a, double sin_a) const { Point res(*this); res.rotate(cos_a, sin_a); return res; } + Point rotated(double angle, const Point ¢er) const { Point res(*this); res.rotate(angle, center); return res; } +}; + +inline bool operator<(const Point &l, const Point &r) +{ + return l.x() < r.x() || (l.x() == r.x() && l.y() < r.y()); +} + +inline Point operator* (const Point& l, const double &r) +{ + return {coord_t(l.x() * r), coord_t(l.y() * r)}; +} + +inline bool is_approx(const Point &p1, const Point &p2, coord_t epsilon = coord_t(SCALED_EPSILON)) +{ + Point d = (p2 - p1).cwiseAbs(); + return d.x() < epsilon && d.y() < epsilon; +} + +inline bool is_approx(const Vec2f &p1, const Vec2f &p2, float epsilon = float(EPSILON)) +{ + Vec2f d = (p2 - p1).cwiseAbs(); + return d.x() < epsilon && d.y() < epsilon; +} + +inline bool is_approx(const Vec2d &p1, const Vec2d &p2, double epsilon = EPSILON) +{ + Vec2d d = (p2 - p1).cwiseAbs(); + return d.x() < epsilon && d.y() < epsilon; +} + +inline bool is_approx(const Vec3f &p1, const Vec3f &p2, float epsilon = float(EPSILON)) +{ + Vec3f d = (p2 - p1).cwiseAbs(); + return d.x() < epsilon && d.y() < epsilon && d.z() < epsilon; +} + +inline bool is_approx(const Vec3d &p1, const Vec3d &p2, double epsilon = EPSILON) +{ + Vec3d d = (p2 - p1).cwiseAbs(); + return d.x() < epsilon && d.y() < epsilon && d.z() < epsilon; +} + +inline Point lerp(const Point &a, const Point &b, double t) +{ + assert((t >= -EPSILON) && (t <= 1. + EPSILON)); + return ((1. - t) * a.cast() + t * b.cast()).cast(); +} + +// if IncludeBoundary, then a bounding box is defined even for a single point. +// otherwise a bounding box is only defined if it has a positive area. +template +BoundingBox get_extents(const Points &pts); +extern template BoundingBox get_extents(const Points &pts); +extern template BoundingBox get_extents(const Points &pts); + +// if IncludeBoundary, then a bounding box is defined even for a single point. +// otherwise a bounding box is only defined if it has a positive area. +template +BoundingBox get_extents(const std::vector &pts); +extern template BoundingBox get_extents(const std::vector &pts); +extern template BoundingBox get_extents(const std::vector &pts); + +BoundingBoxf get_extents(const std::vector &pts); + +int nearest_point_index(const Points &points, const Point &pt); + +inline std::pair nearest_point(const Points &points, const Point &pt) +{ + int idx = nearest_point_index(points, pt); + return idx == -1 ? std::make_pair(Point(), false) : std::make_pair(points[idx], true); +} + +// Test for duplicate points in a vector of points. +// The points are copied, sorted and checked for duplicates globally. +bool has_duplicate_points(std::vector &&pts); +inline bool has_duplicate_points(const std::vector &pts) +{ + std::vector cpy = pts; + return has_duplicate_points(std::move(cpy)); +} + +// Test for duplicate points in a vector of points. +// Only successive points are checked for equality. +inline bool has_duplicate_successive_points(const std::vector &pts) +{ + for (size_t i = 1; i < pts.size(); ++ i) + if (pts[i - 1] == pts[i]) + return true; + return false; +} + +// Test for duplicate points in a vector of points. +// Only successive points are checked for equality. Additionally, first and last points are compared for equality. +inline bool has_duplicate_successive_points_closed(const std::vector &pts) +{ + return has_duplicate_successive_points(pts) || (pts.size() >= 2 && pts.front() == pts.back()); +} + +// Collect adjecent(duplicit points) +Points collect_duplicates(Points pts /* Copy */); + +inline bool shorter_then(const Point& p0, const coord_t len) +{ + if (p0.x() > len || p0.x() < -len) + return false; + if (p0.y() > len || p0.y() < -len) + return false; + return p0.cast().squaredNorm() <= Slic3r::sqr(int64_t(len)); +} + +namespace int128 { + // Exact orientation predicate, + // returns +1: CCW, 0: collinear, -1: CW. + int orient(const Vec2crd &p1, const Vec2crd &p2, const Vec2crd &p3); + // Exact orientation predicate, + // returns +1: CCW, 0: collinear, -1: CW. + int cross(const Vec2crd &v1, const Vec2crd &v2); +} + +// To be used by std::unordered_map, std::unordered_multimap and friends. +struct PointHash { + size_t operator()(const Vec2crd &pt) const noexcept { + return coord_t((89 * 31 + int64_t(pt.x())) * 31 + pt.y()); + } +}; + +// A generic class to search for a closest Point in a given radius. +// It uses std::unordered_multimap to implement an efficient 2D spatial hashing. +// The PointAccessor has to return const Point*. +// If a nullptr is returned, it is ignored by the query. +template class ClosestPointInRadiusLookup +{ +public: + ClosestPointInRadiusLookup(coord_t search_radius, PointAccessor point_accessor = PointAccessor()) : + m_search_radius(search_radius), m_point_accessor(point_accessor), m_grid_log2(0) + { + // Resolution of a grid, twice the search radius + some epsilon. + coord_t gridres = 2 * m_search_radius + 4; + m_grid_resolution = gridres; + assert(m_grid_resolution > 0); + assert(m_grid_resolution < (coord_t(1) << 30)); + // Compute m_grid_log2 = log2(m_grid_resolution) + if (m_grid_resolution > 32767) { + m_grid_resolution >>= 16; + m_grid_log2 += 16; + } + if (m_grid_resolution > 127) { + m_grid_resolution >>= 8; + m_grid_log2 += 8; + } + if (m_grid_resolution > 7) { + m_grid_resolution >>= 4; + m_grid_log2 += 4; + } + if (m_grid_resolution > 1) { + m_grid_resolution >>= 2; + m_grid_log2 += 2; + } + if (m_grid_resolution > 0) + ++ m_grid_log2; + m_grid_resolution = 1 << m_grid_log2; + assert(m_grid_resolution >= gridres); + assert(gridres > m_grid_resolution / 2); + } + + void insert(const ValueType &value) { + const Vec2crd *pt = m_point_accessor(value); + if (pt != nullptr) + m_map.emplace(std::make_pair(Vec2crd(pt->x()>>m_grid_log2, pt->y()>>m_grid_log2), value)); + } + + void insert(ValueType &&value) { + const Vec2crd *pt = m_point_accessor(value); + if (pt != nullptr) + m_map.emplace(std::make_pair(Vec2crd(pt->x()>>m_grid_log2, pt->y()>>m_grid_log2), std::move(value))); + } + + // Erase a data point equal to value. (ValueType has to declare the operator==). + // Returns true if the data point equal to value was found and removed. + bool erase(const ValueType &value) { + const Point *pt = m_point_accessor(value); + if (pt != nullptr) { + // Range of fragment starts around grid_corner, close to pt. + auto range = m_map.equal_range(Point((*pt).x()>>m_grid_log2, (*pt).y()>>m_grid_log2)); + // Remove the first item. + for (auto it = range.first; it != range.second; ++ it) { + if (it->second == value) { + m_map.erase(it); + return true; + } + } + } + return false; + } + + // Return a pair of + std::pair find(const Vec2crd &pt) { + // Iterate over 4 closest grid cells around pt, + // find the closest start point inside these cells to pt. + const ValueType *value_min = nullptr; + double dist_min = std::numeric_limits::max(); + // Round pt to a closest grid_cell corner. + Vec2crd grid_corner((pt.x()+(m_grid_resolution>>1))>>m_grid_log2, (pt.y()+(m_grid_resolution>>1))>>m_grid_log2); + // For four neighbors of grid_corner: + for (coord_t neighbor_y = -1; neighbor_y < 1; ++ neighbor_y) { + for (coord_t neighbor_x = -1; neighbor_x < 1; ++ neighbor_x) { + // Range of fragment starts around grid_corner, close to pt. + auto range = m_map.equal_range(Vec2crd(grid_corner.x() + neighbor_x, grid_corner.y() + neighbor_y)); + // Find the map entry closest to pt. + for (auto it = range.first; it != range.second; ++it) { + const ValueType &value = it->second; + const Vec2crd *pt2 = m_point_accessor(value); + if (pt2 != nullptr) { + const double d2 = (pt - *pt2).cast().squaredNorm(); + if (d2 < dist_min) { + dist_min = d2; + value_min = &value; + } + } + } + } + } + return (value_min != nullptr && dist_min < coordf_t(m_search_radius) * coordf_t(m_search_radius)) ? + std::make_pair(value_min, dist_min) : + std::make_pair(nullptr, std::numeric_limits::max()); + } + + // Returns all pairs of values and squared distances. + std::vector> find_all(const Vec2crd &pt) { + // Iterate over 4 closest grid cells around pt, + // Round pt to a closest grid_cell corner. + Vec2crd grid_corner((pt.x()+(m_grid_resolution>>1))>>m_grid_log2, (pt.y()+(m_grid_resolution>>1))>>m_grid_log2); + // For four neighbors of grid_corner: + std::vector> out; + const double r2 = double(m_search_radius) * m_search_radius; + for (coord_t neighbor_y = -1; neighbor_y < 1; ++ neighbor_y) { + for (coord_t neighbor_x = -1; neighbor_x < 1; ++ neighbor_x) { + // Range of fragment starts around grid_corner, close to pt. + auto range = m_map.equal_range(Vec2crd(grid_corner.x() + neighbor_x, grid_corner.y() + neighbor_y)); + // Find the map entry closest to pt. + for (auto it = range.first; it != range.second; ++it) { + const ValueType &value = it->second; + const Vec2crd *pt2 = m_point_accessor(value); + if (pt2 != nullptr) { + const double d2 = (pt - *pt2).cast().squaredNorm(); + if (d2 <= r2) + out.emplace_back(&value, d2); + } + } + } + } + return out; + } + +private: + using map_type = typename std::unordered_multimap; + PointAccessor m_point_accessor; + map_type m_map; + coord_t m_search_radius; + coord_t m_grid_resolution; + coord_t m_grid_log2; +}; + +std::ostream& operator<<(std::ostream &stm, const Vec2d &pointf); + + +// ///////////////////////////////////////////////////////////////////////////// +// Type safe conversions to and from scaled and unscaled coordinates +// ///////////////////////////////////////////////////////////////////////////// + +// Semantics are the following: +// Upscaling (scaled()): only from floating point types (or Vec) to either +// floating point or integer 'scaled coord' coordinates. +// Downscaling (unscaled()): from arithmetic (or Vec) to floating point only + +// Conversion definition from unscaled to floating point scaled +template> +inline constexpr FloatingOnly scaled(const Tin &v) noexcept +{ + return Tout(v / Tin(SCALING_FACTOR)); +} + +// Conversion definition from unscaled to integer 'scaled coord'. +// TODO: is the rounding necessary? Here it is commented out to show that +// it can be different for integers but it does not have to be. Using +// std::round means loosing noexcept and constexpr modifiers +template> +inline constexpr ScaledCoordOnly scaled(const Tin &v) noexcept +{ + //return static_cast(std::round(v / SCALING_FACTOR)); + return Tout(v / Tin(SCALING_FACTOR)); +} + +// Conversion for Eigen vectors (N dimensional points) +template, + int...EigenArgs> +inline Eigen::Matrix, N, EigenArgs...> +scaled(const Eigen::Matrix &v) +{ + return (v / SCALING_FACTOR).template cast(); +} + +// Conversion from arithmetic scaled type to floating point unscaled +template, + class = FloatingOnly> +inline constexpr Tout unscaled(const Tin &v) noexcept +{ + return Tout(v) * Tout(SCALING_FACTOR); +} + +// Unscaling for Eigen vectors. Input base type can be arithmetic, output base +// type can only be floating point. +template, + class = FloatingOnly, + int...EigenArgs> +inline constexpr Eigen::Matrix +unscaled(const Eigen::Matrix &v) noexcept +{ + return v.template cast() * Tout(SCALING_FACTOR); +} + +// Align a coordinate to a grid. The coordinate may be negative, +// the aligned value will never be bigger than the original one. +inline coord_t align_to_grid(const coord_t coord, const coord_t spacing) { + // Current C++ standard defines the result of integer division to be rounded to zero, + // for both positive and negative numbers. Here we want to round down for negative + // numbers as well. + coord_t aligned = (coord < 0) ? + ((coord - spacing + 1) / spacing) * spacing : + (coord / spacing) * spacing; + assert(aligned <= coord); + return aligned; +} +inline Point align_to_grid(Point coord, Point spacing) + { return Point(align_to_grid(coord.x(), spacing.x()), align_to_grid(coord.y(), spacing.y())); } +inline coord_t align_to_grid(coord_t coord, coord_t spacing, coord_t base) + { return base + align_to_grid(coord - base, spacing); } +inline Point align_to_grid(Point coord, Point spacing, Point base) + { return Point(align_to_grid(coord.x(), spacing.x(), base.x()), align_to_grid(coord.y(), spacing.y(), base.y())); } + +} // namespace Slic3r + +// start Boost +#include +#include +namespace boost { namespace polygon { + template <> + struct geometry_concept { using type = point_concept; }; + + template <> + struct point_traits { + using coordinate_type = coord_t; + + static inline coordinate_type get(const Slic3r::Point& point, orientation_2d orient) { + return static_cast(point((orient == HORIZONTAL) ? 0 : 1)); + } + }; + + template <> + struct point_mutable_traits { + using coordinate_type = coord_t; + static inline void set(Slic3r::Point& point, orientation_2d orient, coord_t value) { + point((orient == HORIZONTAL) ? 0 : 1) = value; + } + static inline Slic3r::Point construct(coord_t x_value, coord_t y_value) { + return Slic3r::Point(x_value, y_value); + } + }; +} } +// end Boost + +#include +// Serialization through the Cereal library +namespace cereal { +// template void serialize(Archive& archive, Slic3r::Vec2crd &v) { archive(v.x(), v.y()); } +// template void serialize(Archive& archive, Slic3r::Vec3crd &v) { archive(v.x(), v.y(), v.z()); } + template void serialize(Archive& archive, Slic3r::Vec2i &v) { archive(v.x(), v.y()); } + template void serialize(Archive& archive, Slic3r::Vec3i &v) { archive(v.x(), v.y(), v.z()); } +// template void serialize(Archive& archive, Slic3r::Vec2i64 &v) { archive(v.x(), v.y()); } +// template void serialize(Archive& archive, Slic3r::Vec3i64 &v) { archive(v.x(), v.y(), v.z()); } + template void serialize(Archive& archive, Slic3r::Vec2f &v) { archive(v.x(), v.y()); } + template void serialize(Archive& archive, Slic3r::Vec3f &v) { archive(v.x(), v.y(), v.z()); } + template void serialize(Archive& archive, Slic3r::Vec2d &v) { archive(v.x(), v.y()); } + template void serialize(Archive& archive, Slic3r::Vec3d &v) { archive(v.x(), v.y(), v.z()); } + + template void serialize(Archive& archive, Slic3r::Matrix4d &m){ archive(binary_data(m.data(), 4*4*sizeof(double))); } + template void serialize(Archive& archive, Slic3r::Matrix2f &m){ archive(binary_data(m.data(), 2*2*sizeof(float))); } + + // Eigen Transformation serialization + template inline void serialize(Archive& archive, Eigen::Transform& t){ archive(t.matrix()); } +} + +// To be able to use Vec<> and Mat<> in range based for loops: +namespace Eigen { +template +T* begin(Slic3r::Mat &mat) { return mat.data(); } + +template +T* end(Slic3r::Mat &mat) { return mat.data() + N * M; } + +template +const T* begin(const Slic3r::Mat &mat) { return mat.data(); } + +template +const T* end(const Slic3r::Mat &mat) { return mat.data() + N * M; } +} // namespace Eigen + +#endif diff --git a/src/libslic3r/PointGrid.hpp b/src/libslic3r/PointGrid.hpp new file mode 100644 index 00000000000..259a2950eb3 --- /dev/null +++ b/src/libslic3r/PointGrid.hpp @@ -0,0 +1,74 @@ +#ifndef POINTGRID_HPP +#define POINTGRID_HPP + +#include +#include +#include + +namespace Slic3r { + +template +class PointGrid { + Vec3i m_size; + std::vector> m_data; + const int XY; + +public: + explicit PointGrid(std::vector> data, const Vec3i &size) + : m_data(std::move(data)), m_size{size}, XY{m_size.x() * m_size.y()} + {} + + const Vec<3, T> & get(size_t idx) const { return m_data[idx]; } + const Vec<3, T> & get(const Vec3i &coord) const + { + return m_data[get_idx(coord)]; + } + + size_t get_idx(const Vec3i &coord) const + { + size_t ret = coord.z() * XY + coord.y() * m_size.x() + coord.x(); + + return ret; + } + + Vec3i get_coord(size_t idx) const { + int iz = idx / XY; + int iy = (idx / m_size.x()) % m_size.y(); + int ix = idx % m_size.x(); + + return {ix, iy, iz}; + } + + const std::vector> & data() const { return m_data; } + size_t point_count() const { return m_data.size(); } + bool empty() const { return m_data.empty(); } +}; + +template +PointGrid point_grid(Ex policy, + const BoundingBox3Base> &bounds, + const Vec<3, CoordT> &stride) +{ + Vec3i numpts = Vec3i::Zero(); + + for (int n = 0; n < 3; ++n) + numpts(n) = (bounds.max(n) - bounds.min(n)) / stride(n); + + std::vector> out(numpts.x() * numpts.y() * numpts.z()); + + size_t XY = numpts[X] * numpts[Y]; + + execution::for_each(policy, size_t(0), out.size(), [&](size_t i) { + int iz = i / XY; + int iy = (i / numpts[X]) % numpts[Y]; + int ix = i % numpts[X]; + + out[i] = Vec<3, CoordT>(ix * stride.x(), iy * stride.y(), iz * stride.z()); + }); + + return PointGrid{std::move(out), numpts}; +} + +} // namespace Slic3r + +#endif // POINTGRID_HPP diff --git a/src/libslic3r/Polygon.cpp b/src/libslic3r/Polygon.cpp index c7bbe970661..d342f3d917a 100644 --- a/src/libslic3r/Polygon.cpp +++ b/src/libslic3r/Polygon.cpp @@ -6,6 +6,17 @@ namespace Slic3r { +double Polygon::length() const +{ + double l = 0; + if (this->points.size() > 1) { + l = (this->points.back() - this->points.front()).cast().norm(); + for (size_t i = 1; i < this->points.size(); ++ i) + l += (this->points[i] - this->points[i - 1]).cast().norm(); + } + return l; +} + Lines Polygon::lines() const { return to_lines(*this); @@ -88,36 +99,11 @@ void Polygon::douglas_peucker(double tolerance) this->points = std::move(p); } -// Does an unoriented polygon contain a point? -// Tested by counting intersections along a horizontal line. -bool Polygon::contains(const Point &point) const -{ - // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html - bool result = false; - Points::const_iterator i = this->points.begin(); - Points::const_iterator j = this->points.end() - 1; - for (; i != this->points.end(); j = i++) { - //FIXME this test is not numerically robust. Particularly, it does not handle horizontal segments at y == point(1) well. - // Does the ray with y == point(1) intersect this line segment? -#if 1 - if ( (((*i)(1) > point(1)) != ((*j)(1) > point(1))) - && ((double)point(0) < (double)((*j)(0) - (*i)(0)) * (double)(point(1) - (*i)(1)) / (double)((*j)(1) - (*i)(1)) + (double)(*i)(0)) ) - result = !result; -#else - if (((*i)(1) > point(1)) != ((*j)(1) > point(1))) { - // Orientation predicated relative to i-th point. - double orient = (double)(point(0) - (*i)(0)) * (double)((*j)(1) - (*i)(1)) - (double)(point(1) - (*i)(1)) * (double)((*j)(0) - (*i)(0)); - if (((*i)(1) > (*j)(1)) ? (orient > 0.) : (orient < 0.)) - result = !result; - } -#endif - } - return result; -} - -// this only works on CCW polygons as CW will be ripped out by Clipper's simplify_polygons() Polygons Polygon::simplify(double tolerance) const { + // Works on CCW polygons only, CW contour will be reoriented to CCW by Clipper's simplify_polygons()! + assert(this->is_counter_clockwise()); + // repeat first point at the end in order to apply Douglas-Peucker // on the whole polygon Points points = this->points; @@ -130,13 +116,6 @@ Polygons Polygon::simplify(double tolerance) const return simplify_polygons(pp); } -void Polygon::simplify(double tolerance, Polygons &polygons) const -{ - Polygons pp = this->simplify(tolerance); - polygons.reserve(polygons.size() + pp.size()); - polygons.insert(polygons.end(), pp.begin(), pp.end()); -} - // Only call this on convex polygons or it will return invalid results void Polygon::triangulate_convex(Polygons* polygons) const { @@ -171,50 +150,114 @@ Point Polygon::centroid() const return Point(Vec2d(c / (3. * area_sum))); } -// find all concave vertices (i.e. having an internal angle greater than the supplied angle) -// (external = right side, thus we consider ccw orientation) -Points Polygon::concave_points(double angle) const +bool Polygon::intersection(const Line &line, Point *intersection) const { - Points points; - angle = 2. * PI - angle + EPSILON; - - // check whether first point forms a concave angle - if (this->points.front().ccw_angle(this->points.back(), *(this->points.begin()+1)) <= angle) - points.push_back(this->points.front()); - - // check whether points 1..(n-1) form concave angles - for (Points::const_iterator p = this->points.begin()+1; p != this->points.end()-1; ++ p) - if (p->ccw_angle(*(p-1), *(p+1)) <= angle) - points.push_back(*p); - - // check whether last point forms a concave angle - if (this->points.back().ccw_angle(*(this->points.end()-2), this->points.front()) <= angle) - points.push_back(this->points.back()); - - return points; + if (this->points.size() < 2) + return false; + if (Line(this->points.front(), this->points.back()).intersection(line, intersection)) + return true; + for (size_t i = 1; i < this->points.size(); ++ i) + if (Line(this->points[i - 1], this->points[i]).intersection(line, intersection)) + return true; + return false; } -// find all convex vertices (i.e. having an internal angle smaller than the supplied angle) -// (external = right side, thus we consider ccw orientation) -Points Polygon::convex_points(double angle) const +bool Polygon::first_intersection(const Line& line, Point* intersection) const { - Points points; - angle = 2*PI - angle - EPSILON; - - // check whether first point forms a convex angle - if (this->points.front().ccw_angle(this->points.back(), *(this->points.begin()+1)) >= angle) - points.push_back(this->points.front()); - - // check whether points 1..(n-1) form convex angles - for (Points::const_iterator p = this->points.begin()+1; p != this->points.end()-1; ++p) { - if (p->ccw_angle(*(p-1), *(p+1)) >= angle) points.push_back(*p); + if (this->points.size() < 2) + return false; + + bool found = false; + double dmin = 0.; + Line l(this->points.back(), this->points.front()); + for (size_t i = 0; i < this->points.size(); ++ i) { + l.b = this->points[i]; + Point ip; + if (l.intersection(line, &ip)) { + if (! found) { + found = true; + dmin = (line.a - ip).cast().squaredNorm(); + *intersection = ip; + } else { + double d = (line.a - ip).cast().squaredNorm(); + if (d < dmin) { + dmin = d; + *intersection = ip; + } + } + } + l.a = l.b; + } + return found; +} + +bool Polygon::intersections(const Line &line, Points *intersections) const +{ + if (this->points.size() < 2) + return false; + + size_t intersections_size = intersections->size(); + Line l(this->points.back(), this->points.front()); + for (size_t i = 0; i < this->points.size(); ++ i) { + l.b = this->points[i]; + Point intersection; + if (l.intersection(line, &intersection)) + intersections->emplace_back(std::move(intersection)); + l.a = l.b; + } + return intersections->size() > intersections_size; +} + +// Filter points from poly to the output with the help of FilterFn. +// filter function receives two vectors: +// v1: this_point - previous_point +// v2: next_point - this_point +// and returns true if the point is to be copied to the output. +template +Points filter_points_by_vectors(const Points &poly, FilterFn filter) +{ + // Last point is the first point visited. + Point p1 = poly.back(); + // Previous vector to p1. + Vec2d v1 = (p1 - *(poly.end() - 2)).cast(); + + Points out; + for (Point p2 : poly) { + // p2 is next point to the currently visited point p1. + Vec2d v2 = (p2 - p1).cast(); + if (filter(v1, v2)) + out.emplace_back(p2); + v1 = v2; + p1 = p2; } - // check whether last point forms a convex angle - if (this->points.back().ccw_angle(*(this->points.end()-2), this->points.front()) >= angle) - points.push_back(this->points.back()); - - return points; + return out; +} + +template +Points filter_convex_concave_points_by_angle_threshold(const Points &poly, double angle_threshold, ConvexConcaveFilterFn convex_concave_filter) +{ + assert(angle_threshold >= 0.); + if (angle_threshold < EPSILON) { + double cos_angle = cos(angle_threshold); + return filter_points_by_vectors(poly, [convex_concave_filter, cos_angle](const Vec2d &v1, const Vec2d &v2){ + return convex_concave_filter(v1, v2) && v1.normalized().dot(v2.normalized()) < cos_angle; + }); + } else { + return filter_points_by_vectors(poly, [convex_concave_filter](const Vec2d &v1, const Vec2d &v2){ + return convex_concave_filter(v1, v2); + }); + } +} + +Points Polygon::convex_points(double angle_threshold) const +{ + return filter_convex_concave_points_by_angle_threshold(this->points, angle_threshold, [](const Vec2d &v1, const Vec2d &v2){ return cross2(v1, v2) > 0.; }); +} + +Points Polygon::concave_points(double angle_threshold) const +{ + return filter_convex_concave_points_by_angle_threshold(this->points, angle_threshold, [](const Vec2d &v1, const Vec2d &v2){ return cross2(v1, v2) < 0.; }); } // Projection of a point onto the polygon. @@ -514,4 +557,85 @@ void remove_collinear(Polygons &polys) remove_collinear(poly); } +Polygons polygons_simplify(const Polygons &source_polygons, double tolerance) +{ + Polygons out; + out.reserve(source_polygons.size()); + for (const Polygon &source_polygon : source_polygons) { + // Run Douglas / Peucker simplification algorithm on an open polyline (by repeating the first point at the end of the polyline), + Points simplified = MultiPoint::_douglas_peucker(to_polyline(source_polygon).points, tolerance); + // then remove the last (repeated) point. + simplified.pop_back(); + // Simplify the decimated contour by ClipperLib. + bool ccw = ClipperLib::Area(simplified) > 0.; + for (Points &path : ClipperLib::SimplifyPolygons(ClipperUtils::SinglePathProvider(simplified), ClipperLib::pftNonZero)) { + if (! ccw) + // ClipperLib likely reoriented negative area contours to become positive. Reverse holes back to CW. + std::reverse(path.begin(), path.end()); + out.emplace_back(std::move(path)); + } + } + return out; +} + +// Do polygons match? If they match, they must have the same topology, +// however their contours may be rotated. +bool polygons_match(const Polygon &l, const Polygon &r) +{ + if (l.size() != r.size()) + return false; + auto it_l = std::find(l.points.begin(), l.points.end(), r.points.front()); + if (it_l == l.points.end()) + return false; + auto it_r = r.points.begin(); + for (; it_l != l.points.end(); ++ it_l, ++ it_r) + if (*it_l != *it_r) + return false; + it_l = l.points.begin(); + for (; it_r != r.points.end(); ++ it_l, ++ it_r) + if (*it_l != *it_r) + return false; + return true; +} + +bool contains(const Polygon &polygon, const Point &p, bool border_result) +{ + if (const int poly_count_inside = ClipperLib::PointInPolygon(p, polygon.points); + poly_count_inside == -1) + return border_result; + else + return (poly_count_inside % 2) == 1; +} + +bool contains(const Polygons &polygons, const Point &p, bool border_result) +{ + int poly_count_inside = 0; + for (const Polygon &poly : polygons) { + const int is_inside_this_poly = ClipperLib::PointInPolygon(p, poly.points); + if (is_inside_this_poly == -1) + return border_result; + poly_count_inside += is_inside_this_poly; + } + return (poly_count_inside % 2) == 1; +} + +Polygon make_circle(double radius, double error) +{ + double angle = 2. * acos(1. - error / radius); + size_t num_segments = size_t(ceil(2. * M_PI / angle)); + return make_circle_num_segments(radius, num_segments); +} + +Polygon make_circle_num_segments(double radius, size_t num_segments) +{ + Polygon out; + out.points.reserve(num_segments); + double angle_inc = 2.0 * M_PI / num_segments; + for (size_t i = 0; i < num_segments; ++ i) { + const double angle = angle_inc * i; + out.points.emplace_back(coord_t(cos(angle) * radius), coord_t(sin(angle) * radius)); + } + return out; +} + } diff --git a/src/libslic3r/Polygon.hpp b/src/libslic3r/Polygon.hpp index 7d34e3aaec8..3c4bb0e2ade 100644 --- a/src/libslic3r/Polygon.hpp +++ b/src/libslic3r/Polygon.hpp @@ -15,11 +15,14 @@ using Polygons = std::vector; using PolygonPtrs = std::vector; using ConstPolygonPtrs = std::vector; +// Returns true if inside. Returns border_result if on boundary. +bool contains(const Polygon& polygon, const Point& p, bool border_result = true); +bool contains(const Polygons& polygons, const Point& p, bool border_result = true); + class Polygon : public MultiPoint { public: Polygon() = default; - virtual ~Polygon() = default; explicit Polygon(const Points &points) : MultiPoint(points) {} Polygon(std::initializer_list points) : MultiPoint(points) {} Polygon(const Polygon &other) : MultiPoint(other.points) {} @@ -38,9 +41,10 @@ class Polygon : public MultiPoint const Point& operator[](Points::size_type idx) const { return this->points[idx]; } // last point == first point for polygons - const Point& last_point() const override { return this->points.front(); } + const Point& last_point() const { return this->points.front(); } - Lines lines() const override; + double length() const; + Lines lines() const; Polyline split_at_vertex(const Point &point) const; // Split a closed polygon into an open polyline, with the split point duplicated at both ends. Polyline split_at_index(int index) const; @@ -58,15 +62,26 @@ class Polygon : public MultiPoint void douglas_peucker(double tolerance); // Does an unoriented polygon contain a point? - // Tested by counting intersections along a horizontal line. - bool contains(const Point &point) const; + bool contains(const Point &point) const { return Slic3r::contains(*this, point, true); } + // Approximate on boundary test. + bool on_boundary(const Point &point, double eps) const + { return (this->point_projection(point) - point).cast().squaredNorm() < eps * eps; } + + // Works on CCW polygons only, CW contour will be reoriented to CCW by Clipper's simplify_polygons()! Polygons simplify(double tolerance) const; - void simplify(double tolerance, Polygons &polygons) const; void densify(float min_length, std::vector* lengths = nullptr); void triangulate_convex(Polygons* polygons) const; Point centroid() const; - Points concave_points(double angle = PI) const; - Points convex_points(double angle = PI) const; + + bool intersection(const Line& line, Point* intersection) const; + bool first_intersection(const Line& line, Point* intersection) const; + bool intersections(const Line &line, Points *intersections) const; + + // Considering CCW orientation of this polygon, find all convex resp. concave points + // with the angle at the vertex larger than a threshold. + // Zero angle_threshold means to accept all convex resp. concave points. + Points convex_points(double angle_threshold = 0.) const; + Points concave_points(double angle_threshold = 0.) const; // Projection of a point onto the polygon. Point point_projection(const Point &point) const; std::vector parameter_by_length() const; @@ -133,14 +148,7 @@ inline void polygons_append(Polygons &dst, Polygons &&src) } } -inline Polygons polygons_simplify(const Polygons &polys, double tolerance) -{ - Polygons out; - out.reserve(polys.size()); - for (const Polygon &p : polys) - polygons_append(out, p.simplify(tolerance)); - return out; -} +Polygons polygons_simplify(const Polygons &polys, double tolerance); inline void polygons_rotate(Polygons &polys, double angle) { @@ -161,13 +169,16 @@ inline Points to_points(const Polygon &poly) return poly.points; } +inline size_t count_points(const Polygons &polys) { + size_t n_points = 0; + for (const auto &poly: polys) n_points += poly.points.size(); + return n_points; +} + inline Points to_points(const Polygons &polys) { - size_t n_points = 0; - for (size_t i = 0; i < polys.size(); ++ i) - n_points += polys[i].points.size(); Points points; - points.reserve(n_points); + points.reserve(count_points(polys)); for (const Polygon &poly : polys) append(points, poly.points); return points; @@ -187,11 +198,8 @@ inline Lines to_lines(const Polygon &poly) inline Lines to_lines(const Polygons &polys) { - size_t n_lines = 0; - for (size_t i = 0; i < polys.size(); ++ i) - n_lines += polys[i].points.size(); Lines lines; - lines.reserve(n_lines); + lines.reserve(count_points(polys)); for (size_t i = 0; i < polys.size(); ++ i) { const Polygon &poly = polys[i]; for (Points::const_iterator it = poly.points.begin(); it != poly.points.end()-1; ++it) @@ -201,18 +209,22 @@ inline Lines to_lines(const Polygons &polys) return lines; } -inline Polylines to_polylines(const Polygons &polys) +inline Polyline to_polyline(const Polygon &polygon) { - Polylines polylines; - polylines.assign(polys.size(), Polyline()); - size_t idx = 0; - for (Polygons::const_iterator it = polys.begin(); it != polys.end(); ++ it) { - Polyline &pl = polylines[idx ++]; - pl.points = it->points; - pl.points.push_back(it->points.front()); - } - assert(idx == polylines.size()); - return polylines; + Polyline out; + out.points.reserve(polygon.size() + 1); + out.points.assign(polygon.points.begin(), polygon.points.end()); + out.points.push_back(polygon.points.front()); + return out; +} + +inline Polylines to_polylines(const Polygons &polygons) +{ + Polylines out; + out.reserve(polygons.size()); + for (const Polygon &polygon : polygons) + out.emplace_back(to_polyline(polygon)); + return out; } inline Polylines to_polylines(Polygons &&polys) @@ -220,10 +232,10 @@ inline Polylines to_polylines(Polygons &&polys) Polylines polylines; polylines.assign(polys.size(), Polyline()); size_t idx = 0; - for (Polygons::const_iterator it = polys.begin(); it != polys.end(); ++ it) { + for (auto it = polys.begin(); it != polys.end(); ++ it) { Polyline &pl = polylines[idx ++]; pl.points = std::move(it->points); - pl.points.push_back(it->points.front()); + pl.points.push_back(pl.points.front()); } assert(idx == polylines.size()); return polylines; @@ -242,11 +254,18 @@ inline Polygons to_polygons(std::vector &&paths) { Polygons out; out.reserve(paths.size()); - for (const Points &path : paths) + for (Points &path : paths) out.emplace_back(std::move(path)); return out; } +// Do polygons match? If they match, they must have the same topology, +// however their contours may be rotated. +bool polygons_match(const Polygon &l, const Polygon &r); + +Polygon make_circle(double radius, double error); +Polygon make_circle_num_segments(double radius, size_t num_segments); + } // Slic3r // start Boost diff --git a/src/libslic3r/Polyline.cpp b/src/libslic3r/Polyline.cpp index debdc0a49e5..5743e38bd5b 100644 --- a/src/libslic3r/Polyline.cpp +++ b/src/libslic3r/Polyline.cpp @@ -2,7 +2,6 @@ #include "Polyline.hpp" #include "Exception.hpp" #include "ExPolygon.hpp" -#include "ExPolygonCollection.hpp" #include "Line.hpp" #include "Polygon.hpp" #include @@ -20,6 +19,14 @@ const Point& Polyline::leftmost_point() const return *p; } +double Polyline::length() const +{ + double l = 0; + for (size_t i = 1; i < this->points.size(); ++ i) + l += (this->points[i] - this->points[i - 1]).cast().norm(); + return l; +} + Lines Polyline::lines() const { Lines lines; @@ -147,9 +154,8 @@ void Polyline::split_at(const Point &point, Polyline* p1, Polyline* p2) const auto min_point_it = this->points.cbegin(); Point prev = this->points.front(); for (auto it = this->points.cbegin() + 1; it != this->points.cend(); ++ it) { - Point proj = point.projection_onto(Line(prev, *it)); - auto d2 = (proj - point).cast().squaredNorm(); - if (d2 < min_dist2) { + Point proj; + if (double d2 = line_alg::distance_to_squared(Line(prev, *it), point, &proj); d2 < min_dist2) { min_dist2 = d2; min_point_it = it; } @@ -197,7 +203,7 @@ BoundingBox get_extents(const Polylines &polylines) const Point& leftmost_point(const Polylines &polylines) { if (polylines.empty()) - throw Slic3r::InvalidArgument("leftmost_point() called on empty PolylineCollection"); + throw Slic3r::InvalidArgument("leftmost_point() called on empty Polylines"); Polylines::const_iterator it = polylines.begin(); const Point *p = &it->leftmost_point(); for (++ it; it != polylines.end(); ++it) { @@ -236,9 +242,8 @@ std::pair foot_pt(const Points &polyline, const Point &pt) auto it = polyline.begin(); auto it_proj = polyline.begin(); for (++ it; it != polyline.end(); ++ it) { - Point foot_pt = pt.projection_onto(Line(prev, *it)); - double d2 = (foot_pt - pt).cast().squaredNorm(); - if (d2 < d2_min) { + Point foot_pt; + if (double d2 = line_alg::distance_to_squared(Line(prev, *it), pt, &foot_pt); d2 < d2_min) { d2_min = d2; foot_pt_min = foot_pt; it_proj = it; @@ -262,29 +267,55 @@ ThickLines ThickPolyline::thicklines() const // Removes the given distance from the end of the ThickPolyline void ThickPolyline::clip_end(double distance) { - while (distance > 0) { - Vec2d last_point = this->last_point().cast(); - coordf_t last_width = this->width.back(); - this->points.pop_back(); - this->width.pop_back(); - if (this->points.empty()) - break; - - Vec2d vec = this->last_point().cast() - last_point; - coordf_t width_diff = this->width.back() - last_width; - double vec_length_sqr = vec.squaredNorm(); - if (vec_length_sqr > distance * distance) { - double t = (distance / std::sqrt(vec_length_sqr)); - this->points.emplace_back((last_point + vec * t).cast()); - this->width.emplace_back(last_width + width_diff * t); - assert(this->width.size() == (this->points.size() - 1) * 2); - return; - } else + if (! this->empty()) { + assert(this->width.size() == (this->points.size() - 1) * 2); + while (distance > 0) { + Vec2d last_point = this->last_point().cast(); + this->points.pop_back(); + if (this->points.empty()) { + assert(this->width.empty()); + break; + } + coordf_t last_width = this->width.back(); this->width.pop_back(); - distance -= std::sqrt(vec_length_sqr); + Vec2d vec = this->last_point().cast() - last_point; + coordf_t width_diff = this->width.back() - last_width; + double vec_length_sqr = vec.squaredNorm(); + if (vec_length_sqr > distance * distance) { + double t = (distance / std::sqrt(vec_length_sqr)); + this->points.emplace_back((last_point + vec * t).cast()); + this->width.emplace_back(last_width + width_diff * t); + assert(this->width.size() == (this->points.size() - 1) * 2); + return; + } else + this->width.pop_back(); + + distance -= std::sqrt(vec_length_sqr); + } + } + assert(this->points.empty() ? this->width.empty() : this->width.size() == (this->points.size() - 1) * 2); +} + +void ThickPolyline::start_at_index(int index) +{ + assert(index >= 0 && index < this->points.size()); + assert(this->points.front() == this->points.back() && this->width.front() == this->width.back()); + if (index != 0 && index != (this->points.size() - 1) && this->points.front() == this->points.back() && this->width.front() == this->width.back()) { + this->points.pop_back(); + assert(this->points.size() * 2 == this->width.size()); + std::rotate(this->points.begin(), this->points.begin() + index, this->points.end()); + std::rotate(this->width.begin(), this->width.begin() + 2 * index, this->width.end()); + this->points.emplace_back(this->points.front()); } - assert(this->width.size() == (this->points.size() - 1) * 2); +} + +double Polyline3::length() const +{ + double l = 0; + for (size_t i = 1; i < this->points.size(); ++ i) + l += (this->points[i] - this->points[i - 1]).cast().norm(); + return l; } Lines3 Polyline3::lines() const diff --git a/src/libslic3r/Polyline.hpp b/src/libslic3r/Polyline.hpp index daaf01d486d..1b23388e184 100644 --- a/src/libslic3r/Polyline.hpp +++ b/src/libslic3r/Polyline.hpp @@ -10,13 +10,13 @@ namespace Slic3r { class Polyline; -class ThickPolyline; +struct ThickPolyline; typedef std::vector Polylines; typedef std::vector ThickPolylines; class Polyline : public MultiPoint { public: - Polyline() {}; + Polyline() = default; Polyline(const Polyline &other) : MultiPoint(other.points) {} Polyline(Polyline &&other) : MultiPoint(std::move(other.points)) {} Polyline(std::initializer_list list) : MultiPoint(list) {} @@ -60,11 +60,15 @@ class Polyline : public MultiPoint { } } - const Point& last_point() const override { return this->points.back(); } + Point& operator[](Points::size_type idx) { return this->points[idx]; } + const Point& operator[](Points::size_type idx) const { return this->points[idx]; } + + double length() const; + const Point& last_point() const { return this->points.back(); } const Point& leftmost_point() const; - Lines lines() const override; + Lines lines() const; - virtual void clip_end(double distance); + void clip_end(double distance); void clip_start(double distance); void extend_end(double distance); void extend_start(double distance); @@ -79,15 +83,6 @@ class Polyline : public MultiPoint { inline bool operator==(const Polyline &lhs, const Polyline &rhs) { return lhs.points == rhs.points; } inline bool operator!=(const Polyline &lhs, const Polyline &rhs) { return lhs.points != rhs.points; } -// Don't use this class in production code, it is used exclusively by the Perl binding for unit tests! -#ifdef PERL_UCHAR_MIN -class PolylineCollection -{ -public: - Polylines polylines; -}; -#endif /* PERL_UCHAR_MIN */ - extern BoundingBox get_extents(const Polyline &polyline); extern BoundingBox get_extents(const Polylines &polylines); @@ -138,7 +133,7 @@ inline Polylines to_polylines(std::vector &&paths) { Polylines out; out.reserve(paths.size()); - for (const Points &path : paths) + for (Points &path : paths) out.emplace_back(std::move(path)); return out; } @@ -158,6 +153,25 @@ inline void polylines_append(Polylines &dst, Polylines &&src) } } +// Merge polylines at their respective end points. +// dst_first: the merge point is at dst.begin() or dst.end()? +// src_first: the merge point is at src.begin() or src.end()? +// The orientation of the resulting polyline is unknown, the output polyline may start +// either with src piece or dst piece. +template +inline void polylines_merge(std::vector &dst, bool dst_first, std::vector &&src, bool src_first) +{ + if (dst_first) { + if (src_first) + std::reverse(dst.begin(), dst.end()); + else + std::swap(dst, src); + } else if (! src_first) + std::reverse(src.begin(), src.end()); + // Merge src into dst. + append(dst, std::move(src)); +} + const Point& leftmost_point(const Polylines &polylines); bool remove_degenerate(Polylines &polylines); @@ -165,20 +179,35 @@ bool remove_degenerate(Polylines &polylines); // Returns index of a segment of a polyline and foot point of pt on polyline. std::pair foot_pt(const Points &polyline, const Point &pt); -class ThickPolyline : public Polyline { -public: - ThickPolyline() : endpoints(std::make_pair(false, false)) {} +struct ThickPolyline { + ThickPolyline() = default; ThickLines thicklines() const; + + const Point& first_point() const { return this->points.front(); } + const Point& last_point() const { return this->points.back(); } + size_t size() const { return this->points.size(); } + bool is_valid() const { return this->points.size() >= 2; } + bool empty() const { return this->points.empty(); } + double length() const { return Slic3r::length(this->points); } + + void clear() { this->points.clear(); this->width.clear(); } + void reverse() { - Polyline::reverse(); + std::reverse(this->points.begin(), this->points.end()); std::reverse(this->width.begin(), this->width.end()); std::swap(this->endpoints.first, this->endpoints.second); } - void clip_end(double distance) override; + void clip_end(double distance); + + // Make this closed ThickPolyline starting in the specified index. + // Be aware that this method can be applicable just for closed ThickPolyline. + // On open ThickPolyline make no effect. + void start_at_index(int index); - std::vector width; - std::pair endpoints; + Points points; + std::vector width; + std::pair endpoints { false, false }; }; inline ThickPolylines to_thick_polylines(Polylines &&polylines, const coordf_t width) @@ -196,7 +225,8 @@ inline ThickPolylines to_thick_polylines(Polylines &&polylines, const coordf_t w class Polyline3 : public MultiPoint3 { public: - virtual Lines3 lines() const; + double length() const; + Lines3 lines() const; }; typedef std::vector Polylines3; diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index e39406938be..23f1438c4c8 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -3,6 +3,7 @@ #include "Exception.hpp" #include "Preset.hpp" #include "AppConfig.hpp" +#include "I18N.hpp" #ifdef _MSC_VER #define WIN32_LEAN_AND_MEAN @@ -10,15 +11,6 @@ #include #endif /* _MSC_VER */ -// instead of #include "slic3r/GUI/I18N.hpp" : -#ifndef L -// !!! If you needed to translate some string, -// !!! please use _L(string) -// !!! _() - is a standard wxWidgets macro to translate -// !!! L() is used only for marking localizable string -// !!! It will be used in "xgettext" to create a Locating Message Catalog. -#define L(s) s -#endif /* L */ #include #include @@ -84,7 +76,7 @@ ConfigFileType guess_config_file_type(const ptree &tree) VendorProfile VendorProfile::from_ini(const boost::filesystem::path &path, bool load_all) { ptree tree; - boost::filesystem::ifstream ifs(path); + boost::nowide::ifstream ifs(path.string()); boost::property_tree::read_ini(ifs, tree); return VendorProfile::from_ini(tree, path, load_all); } @@ -146,6 +138,11 @@ VendorProfile VendorProfile::from_ini(const ptree &tree, const boost::filesystem res.changelog_url = changelog_url->second.data(); } + const auto templates_profile = vendor_section.find("templates_profile"); + if (templates_profile != vendor_section.not_found()) { + res.templates_profile = templates_profile->second.data() == "1"; + } + if (! load_all) { return res; } @@ -200,6 +197,10 @@ VendorProfile VendorProfile::from_ini(const ptree &tree, const boost::filesystem } model.bed_model = section.second.get("bed_model", ""); model.bed_texture = section.second.get("bed_texture", ""); + model.thumbnail = section.second.get("thumbnail", ""); + if (model.thumbnail.empty()) + model.thumbnail = model.id + "_thumbnail.png"; + if (! model.id.empty() && ! model.variants.empty()) res.models.push_back(std::move(model)); } @@ -336,7 +337,8 @@ std::string Preset::label() const bool is_compatible_with_print(const PresetWithVendorProfile &preset, const PresetWithVendorProfile &active_print, const PresetWithVendorProfile &active_printer) { - if (preset.vendor != nullptr && preset.vendor != active_printer.vendor) + // templates_profile vendor profiles should be decided as same vendor profiles + if (preset.vendor != nullptr && preset.vendor != active_printer.vendor && !preset.vendor->templates_profile) // The current profile has a vendor assigned and it is different from the active print's vendor. return false; auto &condition = preset.preset.compatible_prints_condition(); @@ -358,7 +360,8 @@ bool is_compatible_with_print(const PresetWithVendorProfile &preset, const Prese bool is_compatible_with_printer(const PresetWithVendorProfile &preset, const PresetWithVendorProfile &active_printer, const DynamicPrintConfig *extra_config) { - if (preset.vendor != nullptr && preset.vendor != active_printer.vendor) + // templates_profile vendor profiles should be decided as same vendor profiles + if (preset.vendor != nullptr && preset.vendor != active_printer.vendor && !preset.vendor->templates_profile) // The current profile has a vendor assigned and it is different from the active print's vendor. return false; auto &condition = preset.preset.compatible_printers_condition(); @@ -420,18 +423,19 @@ void Preset::set_visible_from_appconfig(const AppConfig &app_config) static std::vector s_Preset_print_options { "layer_height", "first_layer_height", "perimeters", "spiral_vase", "slice_closing_radius", "slicing_mode", "top_solid_layers", "top_solid_min_thickness", "bottom_solid_layers", "bottom_solid_min_thickness", - "extra_perimeters", "ensure_vertical_shell_thickness", "avoid_crossing_perimeters", "thin_walls", "overhangs", - "seam_position", "external_perimeters_first", "fill_density", "fill_pattern", "top_fill_pattern", "bottom_fill_pattern", - "infill_every_layers", "infill_only_where_needed", "solid_infill_every_layers", "fill_angle", "bridge_angle", + "extra_perimeters", "extra_perimeters_on_overhangs", "avoid_crossing_curled_overhangs", "avoid_crossing_perimeters", "thin_walls", "overhangs", + "seam_position","staggered_inner_seams", "external_perimeters_first", "fill_density", "fill_pattern", "top_fill_pattern", "bottom_fill_pattern", + "infill_every_layers", /*"infill_only_where_needed",*/ "solid_infill_every_layers", "fill_angle", "bridge_angle", "solid_infill_below_area", "only_retract_when_crossing_perimeters", "infill_first", "ironing", "ironing_type", "ironing_flowrate", "ironing_speed", "ironing_spacing", "max_print_speed", "max_volumetric_speed", "avoid_crossing_perimeters_max_detour", "fuzzy_skin", "fuzzy_skin_thickness", "fuzzy_skin_point_dist", "max_volumetric_extrusion_rate_slope_positive", "max_volumetric_extrusion_rate_slope_negative", "perimeter_speed", "small_perimeter_speed", "external_perimeter_speed", "infill_speed", "solid_infill_speed", + "enable_dynamic_overhang_speeds", "overhang_speed_0", "overhang_speed_1", "overhang_speed_2", "overhang_speed_3", "top_solid_infill_speed", "support_material_speed", "support_material_xy_spacing", "support_material_interface_speed", "bridge_speed", "gap_fill_speed", "gap_fill_enabled", "travel_speed", "travel_speed_z", "first_layer_speed", "first_layer_speed_over_raft", "perimeter_acceleration", "infill_acceleration", - "external_perimeter_acceleration", "top_solid_infill_acceleration", "solid_infill_acceleration", + "external_perimeter_acceleration", "top_solid_infill_acceleration", "solid_infill_acceleration", "travel_acceleration", "bridge_acceleration", "first_layer_acceleration", "first_layer_acceleration_over_raft", "default_acceleration", "skirts", "skirt_distance", "skirt_height", "draft_shield", "min_skirt_length", "brim_width", "brim_separation", "brim_type", "support_material", "support_material_auto", "support_material_threshold", "support_material_enforce_layers", "raft_layers", "raft_first_layer_density", "raft_first_layer_expansion", "raft_contact_distance", "raft_expansion", @@ -439,15 +443,17 @@ static std::vector s_Preset_print_options { "support_material_synchronize_layers", "support_material_angle", "support_material_interface_layers", "support_material_bottom_interface_layers", "support_material_interface_pattern", "support_material_interface_spacing", "support_material_interface_contact_loops", "support_material_contact_distance", "support_material_bottom_contact_distance", - "support_material_buildplate_only", "dont_support_bridges", "thick_bridges", "notes", "complete_objects", "extruder_clearance_radius", + "support_material_buildplate_only", + "support_tree_angle", "support_tree_angle_slow", "support_tree_branch_diameter", "support_tree_branch_diameter_angle", "support_tree_top_rate", "support_tree_branch_distance", "support_tree_tip_diameter", + "dont_support_bridges", "thick_bridges", "notes", "complete_objects", "extruder_clearance_radius", "extruder_clearance_height", "gcode_comments", "gcode_label_objects", "output_filename_format", "post_process", "gcode_substitutions", "perimeter_extruder", "infill_extruder", "solid_infill_extruder", "support_material_extruder", "support_material_interface_extruder", "ooze_prevention", "standby_temperature_delta", "interface_shells", "extrusion_width", "first_layer_extrusion_width", "perimeter_extrusion_width", "external_perimeter_extrusion_width", "infill_extrusion_width", "solid_infill_extrusion_width", - "top_infill_extrusion_width", "support_material_extrusion_width", "infill_overlap", "infill_anchor", "infill_anchor_max", "bridge_flow_ratio", "clip_multipart_objects", + "top_infill_extrusion_width", "support_material_extrusion_width", "infill_overlap", "infill_anchor", "infill_anchor_max", "bridge_flow_ratio", "elefant_foot_compensation", "xy_size_compensation", "threads", "resolution", "gcode_resolution", "wipe_tower", "wipe_tower_x", "wipe_tower_y", - "wipe_tower_width", "wipe_tower_rotation_angle", "wipe_tower_brim_width", "wipe_tower_bridging", "single_extruder_multi_material_priming", "mmu_segmented_region_max_width", - "wipe_tower_no_sparse_layers", "compatible_printers", "compatible_printers_condition", "inherits", + "wipe_tower_width", "wipe_tower_cone_angle", "wipe_tower_rotation_angle", "wipe_tower_brim_width", "wipe_tower_bridging", "single_extruder_multi_material_priming", "mmu_segmented_region_max_width", + "wipe_tower_no_sparse_layers", "wipe_tower_extra_spacing", "compatible_printers", "compatible_printers_condition", "inherits", "perimeter_generator", "wall_transition_length", "wall_transition_filter_deviation", "wall_transition_angle", "wall_distribution_count", "min_feature_size", "min_bead_width" }; @@ -457,9 +463,10 @@ static std::vector s_Preset_filament_options { "extrusion_multiplier", "filament_density", "filament_cost", "filament_spool_weight", "filament_loading_speed", "filament_loading_speed_start", "filament_load_time", "filament_unloading_speed", "filament_unloading_speed_start", "filament_unload_time", "filament_toolchange_delay", "filament_cooling_moves", "filament_cooling_initial_speed", "filament_cooling_final_speed", "filament_ramming_parameters", "filament_minimal_purge_on_wipe_tower", - "temperature", "first_layer_temperature", "bed_temperature", "first_layer_bed_temperature", "fan_always_on", "cooling", "min_fan_speed", + "temperature", "idle_temperature", "first_layer_temperature", "bed_temperature", "first_layer_bed_temperature", "fan_always_on", "cooling", "min_fan_speed", "max_fan_speed", "bridge_fan_speed", "disable_fan_first_layers", "full_fan_speed_layer", "fan_below_layer_time", "slowdown_below_layer_time", "min_print_speed", - "start_filament_gcode", "end_filament_gcode", + "start_filament_gcode", "end_filament_gcode", "enable_dynamic_fan_speeds", + "overhang_fan_speed_0", "overhang_fan_speed_1", "overhang_fan_speed_2", "overhang_fan_speed_3", // Retract overrides "filament_retract_length", "filament_retract_lift", "filament_retract_lift_above", "filament_retract_lift_below", "filament_retract_speed", "filament_deretract_speed", "filament_retract_restart_extra", "filament_retract_before_travel", "filament_retract_layer_change", "filament_wipe", "filament_retract_before_wipe", @@ -476,7 +483,7 @@ static std::vector s_Preset_machine_limits_options { }; static std::vector s_Preset_printer_options { - "printer_technology", + "printer_technology", "autoemit_temperature_commands", "bed_shape", "bed_custom_texture", "bed_custom_model", "z_offset", "gcode_flavor", "use_relative_e_distances", "use_firmware_retraction", "use_volumetric_e", "variable_layer_height", //FIXME the print host keys are left here just for conversion from the Printer preset to Physical Printer preset. @@ -494,14 +501,18 @@ static std::vector s_Preset_sla_print_options { "layer_height", "faded_layers", "supports_enable", + "support_tree_type", + "support_head_front_diameter", "support_head_penetration", "support_head_width", "support_pillar_diameter", "support_small_pillar_diameter_percent", "support_max_bridges_on_pillar", + "support_max_weight_on_model", "support_pillar_connection_mode", "support_buildplate_only", + "support_enforcers_only", "support_pillar_widening_factor", "support_base_diameter", "support_base_height", @@ -510,6 +521,25 @@ static std::vector s_Preset_sla_print_options { "support_max_bridge_length", "support_max_pillar_link_distance", "support_object_elevation", + + "branchingsupport_head_front_diameter", + "branchingsupport_head_penetration", + "branchingsupport_head_width", + "branchingsupport_pillar_diameter", + "branchingsupport_small_pillar_diameter_percent", + "branchingsupport_max_bridges_on_pillar", + "branchingsupport_max_weight_on_model", + "branchingsupport_pillar_connection_mode", + "branchingsupport_buildplate_only", + "branchingsupport_pillar_widening_factor", + "branchingsupport_base_diameter", + "branchingsupport_base_height", + "branchingsupport_base_safety_distance", + "branchingsupport_critical_angle", + "branchingsupport_max_bridge_length", + "branchingsupport_max_pillar_link_distance", + "branchingsupport_object_elevation", + "support_points_density_relative", "support_points_minimal_distance", "slice_closing_radius", @@ -576,7 +606,7 @@ static std::vector s_Preset_sla_printer_options { "elefant_foot_min_width", "gamma_correction", "min_exposure_time", "max_exposure_time", - "min_initial_exposure_time", "max_initial_exposure_time", + "min_initial_exposure_time", "max_initial_exposure_time", "sla_archive_format", "sla_output_precision", //FIXME the print host keys are left here just for conversion from the Printer preset to Physical Printer preset. "print_host", "printhost_apikey", "printhost_cafile", "printer_notes", @@ -748,7 +778,7 @@ std::pair PresetCollection::load_external_preset( { // Load the preset over a default preset, so that the missing fields are filled in from the default preset. DynamicPrintConfig cfg(this->default_preset_for(combined_config).config); - const auto &keys = cfg.keys(); + t_config_option_keys keys = cfg.keys(); cfg.apply_only(combined_config, keys, true); std::string &inherits = Preset::inherits(cfg); if (select == LoadAndSelect::Never) { @@ -792,6 +822,13 @@ std::pair PresetCollection::load_external_preset( // the differences will be shown in the preset editor against the referenced profile. this->select_preset(it - m_presets.begin()); // The source config may contain keys from many possible preset types. Just copy those that relate to this preset. + + // Following keys are not used neither by the UI nor by the slicing core, therefore they are not important + // Erase them from config appl to avoid redundant "dirty" parameter in loaded preset. + for (const char* key : { "print_settings_id", "filament_settings_id", "sla_print_settings_id", "sla_material_settings_id", "printer_settings_id", + "printer_model", "printer_variant", "default_print_profile", "default_filament_profile", "default_sla_print_profile", "default_sla_material_profile" }) + keys.erase(std::remove(keys.begin(), keys.end(), key), keys.end()); + this->get_edited_preset().config.apply_only(combined_config, keys, true); this->update_dirty(); // Don't save the newly loaded project as a "saved into project" state. @@ -835,7 +872,7 @@ std::pair PresetCollection::load_external_preset( // Insert a new profile. Preset &preset = this->load_preset(path, new_name, std::move(cfg), select == LoadAndSelect::Always); preset.is_external = true; - if (&this->get_selected_preset() == &preset) + if (this->m_idx_selected != size_t(-1) && &this->get_selected_preset() == &preset) this->get_edited_preset().is_external = true; return std::make_pair(&preset, false); @@ -917,6 +954,66 @@ void PresetCollection::save_current_preset(const std::string &new_name, bool det this->get_selected_preset().save(); } +Preset& PresetCollection::get_preset_with_name(const std::string& new_name, const Preset* initial_preset) +{ + // 1) Find the preset with a new_name or create a new one, + // initialize it with the preset_to config. + auto it = this->find_preset_internal(new_name); + if (it != m_presets.end() && it->name == new_name) { + // Preset with the same name found. + Preset& preset = *it; + if (!preset.is_default && !preset.is_external && !preset.is_system && initial_preset->name != new_name) { + // Overwriting an existing preset if it isn't default/external/system or isn't an initial_preset + preset.config = initial_preset->config; + // The newly saved preset can be activated -> make it visible. + preset.is_visible = true; + } + return preset; + } + + const std::string selected_preset_name = this->get_selected_preset_name(); + + // Creating a new preset. + Preset& preset = *m_presets.insert(it, *initial_preset); + std::string& inherits = preset.inherits(); + std::string old_name = preset.name; + preset.name = new_name; + preset.file = this->path_from_name(new_name); + preset.vendor = nullptr; + preset.alias.clear(); + preset.renamed_from.clear(); + if (preset.is_system) { + // Inheriting from a system preset. + inherits = old_name; + } + else if (inherits.empty()) { + // Inheriting from a user preset. Link the new preset to the old preset. + // inherits = old_name; + } + else { + // Inherited from a user preset. Just maintain the "inherited" flag, + // meaning it will inherit from either the system preset, or the inherited user preset. + } + preset.is_default = false; + preset.is_system = false; + preset.is_external = false; + // The newly saved preset can be activated -> make it visible. + preset.is_visible = true; + // Just system presets have aliases + preset.alias.clear(); + + // sort printers and get new it + std::sort(m_presets.begin(), m_presets.end()); + + // set initial preset selection + this->select_preset_by_name(selected_preset_name, true); + + it = this->find_preset_internal(new_name); + assert(it != m_presets.end()); + + return *it; +} + bool PresetCollection::delete_current_preset() { const Preset &selected = this->get_selected_preset(); @@ -940,6 +1037,11 @@ bool PresetCollection::delete_current_preset() bool PresetCollection::delete_preset(const std::string& name) { + if (name == this->get_selected_preset().name) + return delete_current_preset(); + + const std::string selected_preset_name = this->get_selected_preset_name(); + auto it = this->find_preset_internal(name); const Preset& preset = *it; @@ -950,6 +1052,10 @@ bool PresetCollection::delete_preset(const std::string& name) boost::nowide::remove(preset.file.c_str()); } m_presets.erase(it); + + // update selected preset + this->select_preset_by_name(selected_preset_name, true); + return true; } @@ -1048,12 +1154,12 @@ const std::string& PresetCollection::get_suffix_modified() { // Return a preset by its name. If the preset is active, a temporary copy is returned. // If a preset is not found by its name, null is returned. -Preset* PresetCollection::find_preset(const std::string &name, bool first_visible_if_not_found) +Preset* PresetCollection::find_preset(const std::string &name, bool first_visible_if_not_found, bool respect_active_preset /*= true*/) { Preset key(m_type, name, false); auto it = this->find_preset_internal(name); // Ensure that a temporary copy is returned if the preset found is currently selected. - return (it != m_presets.end() && it->name == key.name) ? &this->preset(it - m_presets.begin()) : + return (it != m_presets.end() && it->name == key.name) ? &this->preset(it - m_presets.begin(), respect_active_preset) : first_visible_if_not_found ? &this->first_visible() : nullptr; } @@ -1087,6 +1193,7 @@ size_t PresetCollection::update_compatible_internal(const PresetWithVendorProfil if (opt) config.set_key_value("num_extruders", new ConfigOptionInt((int)static_cast(opt)->values.size())); bool some_compatible = false; + std::vector indices_of_template_presets; for (size_t idx_preset = m_num_default_presets; idx_preset < m_presets.size(); ++ idx_preset) { bool selected = idx_preset == m_idx_selected; Preset &preset_selected = m_presets[idx_preset]; @@ -1103,7 +1210,29 @@ size_t PresetCollection::update_compatible_internal(const PresetWithVendorProfil m_idx_selected = size_t(-1); if (selected) preset_selected.is_compatible = preset_edited.is_compatible; + if (preset_edited.vendor && preset_edited.vendor->templates_profile) { + indices_of_template_presets.push_back(idx_preset); + } } + // filter out template profiles where profile with same alias and compability exists + if (!indices_of_template_presets.empty()) { + for (size_t idx_preset = m_num_default_presets; idx_preset < m_presets.size(); ++idx_preset) { + if (m_presets[idx_preset].vendor && !m_presets[idx_preset].vendor->templates_profile && m_presets[idx_preset].is_compatible) { + std::string preset_alias = m_presets[idx_preset].alias; + for (size_t idx_of_template_in_presets : indices_of_template_presets) { + if (m_presets[idx_of_template_in_presets].alias == preset_alias) { + // unselect selected template filament if there is non-template alias compatible + if (idx_of_template_in_presets == m_idx_selected && (unselect_if_incompatible == PresetSelectCompatibleType::Always || unselect_if_incompatible == PresetSelectCompatibleType::OnlyIfWasCompatible)) { + m_idx_selected = size_t(-1); + } + m_presets[idx_of_template_in_presets].is_compatible = false; + break; + } + } + } + } + } + // Update visibility of the default profiles here if the defaults are suppressed, the current profile is not compatible and we don't want to select another compatible profile. if (m_idx_selected >= m_num_default_presets && m_default_suppressed) for (size_t i = 0; i < m_num_default_presets; ++ i) @@ -1138,18 +1267,19 @@ void add_correct_opts_to_diff(const std::string &opt_key, t_config_option_keys& } // list of options with vector variable, which is independent from number of extruders -static const std::vector independent_from_extruder_number_options = { +static const std::set independent_from_extruder_number_options = { "bed_shape", - "thumbnails", + "compatible_printers", + "compatible_prints", "filament_ramming_parameters", "gcode_substitutions", - "compatible_prints", - "compatible_printers" + "post_process", + "thumbnails", }; bool PresetCollection::is_independent_from_extruder_number_option(const std::string& opt_key) { - return std::find(independent_from_extruder_number_options.begin(), independent_from_extruder_number_options.end(), opt_key) != independent_from_extruder_number_options.end(); + return independent_from_extruder_number_options.find(opt_key) != independent_from_extruder_number_options.end(); } // Use deep_diff to correct return of changed options, considering individual options for each extruder. @@ -1176,6 +1306,7 @@ inline t_config_option_keys deep_diff(const ConfigBase &config_this, const Confi case coStrings: add_correct_opts_to_diff(opt_key, diff, config_other, config_this); break; case coPercents:add_correct_opts_to_diff(opt_key, diff, config_other, config_this); break; case coPoints: add_correct_opts_to_diff(opt_key, diff, config_other, config_this); break; + case coFloatsOrPercents: add_correct_opts_to_diff(opt_key, diff, config_other, config_this); break; default: diff.emplace_back(opt_key); break; } } @@ -1499,7 +1630,7 @@ void PhysicalPrinter::update_preset_names_in_config() if (!preset_names.empty()) { std::vector& values = config.option("preset_names")->values; values.clear(); - for (auto preset : preset_names) + for (const std::string& preset : preset_names) values.push_back(preset); // temporary workaround for compatibility with older Slicer @@ -1572,7 +1703,7 @@ void PhysicalPrinter::set_name(const std::string& name) this->name = name; } -std::string PhysicalPrinter::get_full_name(std::string preset_name) const +std::string PhysicalPrinter::get_full_name(const std::string& preset_name) const { return name + separator() + preset_name; } @@ -1869,13 +2000,23 @@ bool PhysicalPrinterCollection::delete_preset_from_printers( const std::string& return true; } +void PhysicalPrinterCollection::rename_preset_in_printers(const std::string& old_preset_name, const std::string& new_preset_name) +{ + for (PhysicalPrinter& printer : m_printers) + if (printer.delete_preset(old_preset_name)) { + printer.add_preset(new_preset_name); + printer.update_preset_names_in_config(); + printer.save(); + } +} + // Get list of printers which have more than one preset and "preset_names" preset is one of them -std::vector PhysicalPrinterCollection::get_printers_with_preset(const std::string& preset_name) +std::vector PhysicalPrinterCollection::get_printers_with_preset(const std::string& preset_name, bool respect_only_preset /*= true*/) { std::vector printers; for (auto printer : m_printers) { - if (printer.preset_names.size() == 1) + if (!respect_only_preset && printer.preset_names.size() == 1) continue; if (printer.preset_names.find(preset_name) != printer.preset_names.end()) printers.emplace_back(printer.name); @@ -1889,7 +2030,7 @@ std::vector PhysicalPrinterCollection::get_printers_with_only_prese { std::vector printers; - for (auto printer : m_printers) + for (const PhysicalPrinter& printer : m_printers) if (printer.preset_names.size() == 1 && *printer.preset_names.begin() == preset_name) printers.emplace_back(printer.name); @@ -1989,6 +2130,25 @@ namespace PresetUtils { } return out; } + + bool vendor_profile_has_all_resources(const VendorProfile& vp) + { + namespace fs = boost::filesystem; + + std::string vendor_folder = Slic3r::data_dir() + "/vendor/" + vp.id + "/"; + std::string rsrc_folder = Slic3r::resources_dir() + "/profiles/" + vp.id + "/"; + std::string cache_folder = Slic3r::data_dir() + "/cache/" + vp.id + "/"; + for (const VendorProfile::PrinterModel& model : vp.models) { + for (const std::string& res : { model.bed_texture, model.bed_model, model.thumbnail } ) { + if (! res.empty() + && !fs::exists(fs::path(vendor_folder + res)) + && !fs::exists(fs::path(rsrc_folder + res)) + && !fs::exists(fs::path(cache_folder + res))) + return false; + } + } + return true; + } } // namespace PresetUtils } // namespace Slic3r diff --git a/src/libslic3r/Preset.hpp b/src/libslic3r/Preset.hpp index 2f55aa67601..9a16a16a993 100644 --- a/src/libslic3r/Preset.hpp +++ b/src/libslic3r/Preset.hpp @@ -34,6 +34,7 @@ class VendorProfile Semver config_version; std::string config_update_url; std::string changelog_url; + bool templates_profile { false }; struct PrinterVariant { PrinterVariant() {} @@ -52,6 +53,7 @@ class VendorProfile // Vendor & Printer Model specific print bed model & texture. std::string bed_model; std::string bed_texture; + std::string thumbnail; PrinterVariant* variant(const std::string &name) { for (auto &v : this->variants) @@ -116,6 +118,8 @@ class Preset // This type is here to support PresetConfigSubstitutions for physical printers, however it does not belong to the Preset class, // PhysicalPrinter class is used instead. TYPE_PHYSICAL_PRINTER, + // This type is here to support search through the Preferences + TYPE_PREFERENCES, }; Type type = TYPE_INVALID; @@ -339,6 +343,10 @@ class PresetCollection // All presets are marked as not modified and the new preset is activated. void save_current_preset(const std::string &new_name, bool detach = false); + // Find the preset with a new_name or create a new one, + // initialize it with the initial_preset config. + Preset& get_preset_with_name(const std::string& new_name, const Preset* initial_preset); + // Delete the current preset, activate the first visible preset. // returns true if the preset was deleted successfully. bool delete_current_preset(); @@ -390,8 +398,8 @@ class PresetCollection const Preset& default_preset(size_t idx = 0) const { assert(idx < m_num_default_presets); return m_presets[idx]; } virtual const Preset& default_preset_for(const DynamicPrintConfig & /* config */) const { return this->default_preset(); } // Return a preset by an index. If the preset is active, a temporary copy is returned. - Preset& preset(size_t idx) { return (idx == m_idx_selected) ? m_edited_preset : m_presets[idx]; } - const Preset& preset(size_t idx) const { return const_cast(this)->preset(idx); } + Preset& preset(size_t idx, bool respect_active_preset = true) { return (idx == m_idx_selected && respect_active_preset) ? m_edited_preset : m_presets[idx]; } + const Preset& preset(size_t idx, bool respect_active_preset = true) const { return const_cast(this)->preset(idx); } void discard_current_changes() { m_presets[m_idx_selected].reset_dirty(); m_edited_preset = m_presets[m_idx_selected]; @@ -401,9 +409,9 @@ class PresetCollection // Return a preset by its name. If the preset is active, a temporary copy is returned. // If a preset is not found by its name, null is returned. - Preset* find_preset(const std::string &name, bool first_visible_if_not_found = false); - const Preset* find_preset(const std::string &name, bool first_visible_if_not_found = false) const - { return const_cast(this)->find_preset(name, first_visible_if_not_found); } + Preset* find_preset(const std::string &name, bool first_visible_if_not_found = false, bool respect_active_preset = true); + const Preset* find_preset(const std::string &name, bool first_visible_if_not_found = false, bool respect_active_preset = true) const + { return const_cast(this)->find_preset(name, first_visible_if_not_found, respect_active_preset); } size_t first_visible_idx() const; // Return index of the first compatible preset. Certainly at least the '- default -' preset shall be compatible. @@ -412,7 +420,7 @@ class PresetCollection size_t first_compatible_idx(PreferedCondition prefered_condition) const { size_t i = m_default_suppressed ? m_num_default_presets : 0; - size_t n = this->m_presets.size(); + size_t n = m_presets.size(); size_t i_compatible = n; int match_quality = -1; for (; i < n; ++ i) @@ -613,6 +621,7 @@ namespace PresetUtils { const VendorProfile::PrinterModel* system_printer_model(const Preset &preset); std::string system_printer_bed_model(const Preset& preset); std::string system_printer_bed_texture(const Preset& preset); + bool vendor_profile_has_all_resources(const VendorProfile& vp); } // namespace PresetUtils @@ -673,7 +682,7 @@ class PhysicalPrinter bool operator<(const PhysicalPrinter& other) const { return this->name < other.name; } // get full printer name included a name of the preset - std::string get_full_name(std::string preset_name) const; + std::string get_full_name(const std::string &preset_name) const; // get printer name from the full name uncluded preset name static std::string get_short_name(std::string full_name); @@ -732,9 +741,9 @@ class PhysicalPrinterCollection // If there is last preset for the printer and first_check== false, then delete this printer // returns true if all presets were deleted successfully. bool delete_preset_from_printers(const std::string& preset_name); - + void rename_preset_in_printers(const std::string& old_name, const std::string& new_name); // Get list of printers which have more than one preset and "preset_names" preset is one of them - std::vector get_printers_with_preset( const std::string &preset_name); + std::vector get_printers_with_preset( const std::string &preset_name, bool respect_only_preset = true); // Get list of printers which has only "preset_names" preset std::vector get_printers_with_only_preset( const std::string &preset_name); diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index 874b775cd2a..899d24ecc2a 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -1,7 +1,7 @@ #include -#include "PresetBundle.hpp" #include "libslic3r.h" +#include "PresetBundle.hpp" #include "Utils.hpp" #include "Model.hpp" #include "format.hpp" @@ -159,6 +159,7 @@ void PresetBundle::setup_directories() data_dir, data_dir / "vendor", data_dir / "cache", + data_dir / "cache" / "vendor", data_dir / "shapes", #ifdef SLIC3R_PROFILE_USE_PRESETS_SUBDIR // Store the print/filament/printer presets into a "presets" directory. @@ -267,7 +268,7 @@ PresetsConfigSubstitutions PresetBundle::load_presets(AppConfig &config, Forward std::string errors_cummulative; std::tie(substitutions, errors_cummulative) = this->load_system_presets(substitution_rule); - const std::string dir_user_presets = data_dir() + const std::string& dir_user_presets = data_dir() #ifdef SLIC3R_PROFILE_USE_PRESETS_SUBDIR // Store the print/filament/printer presets into a "presets" directory. + "/presets" @@ -425,16 +426,24 @@ void PresetBundle::load_installed_printers(const AppConfig &config) preset.set_visible_from_appconfig(config); } -const std::string& PresetBundle::get_preset_name_by_alias( const Preset::Type& preset_type, const std::string& alias) const +PresetCollection& PresetBundle::get_presets(Preset::Type type) +{ + assert(type >= Preset::TYPE_PRINT && type <= Preset::TYPE_PRINTER); + + return type == Preset::TYPE_PRINT ? prints : + type == Preset::TYPE_SLA_PRINT ? sla_prints : + type == Preset::TYPE_FILAMENT ? filaments : + type == Preset::TYPE_SLA_MATERIAL ? sla_materials : printers; +} + + +const std::string& PresetBundle::get_preset_name_by_alias( const Preset::Type& preset_type, const std::string& alias) { // there are not aliases for Printers profiles if (preset_type == Preset::TYPE_PRINTER || preset_type == Preset::TYPE_INVALID) return alias; - const PresetCollection& presets = preset_type == Preset::TYPE_PRINT ? prints : - preset_type == Preset::TYPE_SLA_PRINT ? sla_prints : - preset_type == Preset::TYPE_FILAMENT ? filaments : - sla_materials; + const PresetCollection& presets = get_presets(preset_type); return presets.get_preset_name_by_alias(alias); } @@ -442,10 +451,7 @@ const std::string& PresetBundle::get_preset_name_by_alias( const Preset::Type& p void PresetBundle::save_changes_for_preset(const std::string& new_name, Preset::Type type, const std::vector& unselected_options) { - PresetCollection& presets = type == Preset::TYPE_PRINT ? prints : - type == Preset::TYPE_SLA_PRINT ? sla_prints : - type == Preset::TYPE_FILAMENT ? filaments : - type == Preset::TYPE_SLA_MATERIAL ? sla_materials : printers; + PresetCollection& presets = get_presets(type); // if we want to save just some from selected options if (!unselected_options.empty()) { @@ -453,6 +459,9 @@ void PresetBundle::save_changes_for_preset(const std::string& new_name, Preset:: presets.get_edited_preset().config.apply_only(presets.get_selected_preset().config, unselected_options); } + if (type == Preset::TYPE_PRINTER) + copy_bed_model_and_texture_if_needed(presets.get_edited_preset().config); + // Save the preset into Slic3r::data_dir / presets / section_name / preset_name.ini presets.save_current_preset(new_name); // Mark the print & filament enabled if they are compatible with the currently selected preset. @@ -465,6 +474,49 @@ void PresetBundle::save_changes_for_preset(const std::string& new_name, Preset:: } } +bool PresetBundle::transfer_and_save(Preset::Type type, const std::string& preset_from_name, const std::string& preset_to_name, + const std::string& preset_new_name, const std::vector& options) +{ + if (options.empty()) + return false; + + PresetCollection& presets = get_presets(type); + + const Preset* preset_to = presets.find_preset(preset_to_name, false, false); + if (!preset_to) + return false; + + // Find the preset with a new_name or create a new one, + // initialize it with the preset_to config. + Preset& preset = presets.get_preset_with_name(preset_new_name, preset_to); + if (preset.is_default || preset.is_external || preset.is_system) + // Cannot overwrite the default preset. + return false; + + // Apply options from the preset_from_name. + const Preset* preset_from = presets.find_preset(preset_from_name, false, false); + if (!preset_from) + return false; + preset.config.apply_only(preset_from->config, options); + + // Store new_name preset to disk. + preset.save(); + + // Mark the print & filament enabled if they are compatible with the currently selected preset. + // If saving the preset changes compatibility with other presets, keep the now incompatible dependent presets selected, however with a "red flag" icon showing that they are no more compatible. + update_compatible(PresetSelectCompatibleType::Never); + + if (type == Preset::TYPE_PRINTER) + copy_bed_model_and_texture_if_needed(preset.config); + + if (type == Preset::TYPE_FILAMENT) { + // synchronize the first filament presets. + set_filament_preset(0, filaments.get_selected_preset_name()); + } + + return true; +} + void PresetBundle::load_installed_filaments(AppConfig &config) { if (! config.has_section(AppConfig::SECTION_FILAMENTS)) { @@ -1262,11 +1314,11 @@ std::pair PresetBundle::load_configbundle( const VendorProfile *vendor_profile = nullptr; if (flags.has(LoadConfigBundleAttribute::LoadSystem) || flags.has(LoadConfigBundleAttribute::LoadVendorOnly)) { - auto vp = VendorProfile::from_ini(tree, path); - if (vp.models.size() == 0) { + VendorProfile vp = VendorProfile::from_ini(tree, path); + if (vp.models.size() == 0 && !vp.templates_profile) { BOOST_LOG_TRIVIAL(error) << boost::format("Vendor bundle: `%1%`: No printer model defined.") % path; return std::make_pair(PresetsConfigSubstitutions{}, 0); - } else if (vp.num_variants() == 0) { + } else if (vp.num_variants() == 0 && !vp.templates_profile) { BOOST_LOG_TRIVIAL(error) << boost::format("Vendor bundle: `%1%`: No printer variant defined") % path; return std::make_pair(PresetsConfigSubstitutions{}, 0); } @@ -1308,6 +1360,9 @@ std::pair PresetBundle::load_configbundle( } else if (boost::starts_with(section.first, "filament:")) { presets = &this->filaments; preset_name = section.first.substr(9); + if (vendor_profile && vendor_profile->templates_profile) { + preset_name += " @Template"; + } } else if (boost::starts_with(section.first, "sla_print:")) { presets = &this->sla_prints; preset_name = section.first.substr(10); @@ -1860,4 +1915,30 @@ void PresetBundle::set_default_suppressed(bool default_suppressed) printers.set_default_suppressed(default_suppressed); } +void copy_bed_model_and_texture_if_needed(DynamicPrintConfig& config) +{ + const boost::filesystem::path user_dir = boost::filesystem::absolute(boost::filesystem::path(data_dir()) / "printer").make_preferred(); + const boost::filesystem::path res_dir = boost::filesystem::absolute(boost::filesystem::path(resources_dir()) / "profiles").make_preferred(); + + auto do_copy = [&user_dir, &res_dir](ConfigOptionString* cfg, const std::string& type) { + if (cfg == nullptr || cfg->value.empty()) + return; + + const boost::filesystem::path src_dir = boost::filesystem::absolute(boost::filesystem::path(cfg->value)).make_preferred().parent_path(); + if (src_dir != user_dir && src_dir.parent_path() != res_dir) { + const std::string dst_value = (user_dir / boost::filesystem::path(cfg->value).filename()).string(); + std::string error; + if (copy_file_inner(cfg->value, dst_value, error) == SUCCESS) + cfg->value = dst_value; + else { + BOOST_LOG_TRIVIAL(error) << "Copying from " << cfg->value << " to " << dst_value << " failed. Unable to set custom bed " << type << ". [" << error << "]"; + cfg->value = ""; + } + } + }; + + do_copy(config.option("bed_custom_texture"), "texture"); + do_copy(config.option("bed_custom_model"), "model"); +} + } // namespace Slic3r diff --git a/src/libslic3r/PresetBundle.hpp b/src/libslic3r/PresetBundle.hpp index 2a5ce6839cb..7d5a3a4f695 100644 --- a/src/libslic3r/PresetBundle.hpp +++ b/src/libslic3r/PresetBundle.hpp @@ -7,6 +7,7 @@ #include #include +#include #include namespace Slic3r { @@ -54,6 +55,8 @@ class PresetBundle // extruders.size() should be the same as printers.get_edited_preset().config.nozzle_diameter.size() std::vector filament_presets; + PresetCollection& get_presets(Preset::Type preset_type); + // The project configuration values are kept separated from the print/filament/printer preset, // they are being serialized / deserialized from / to the .amf, .3mf, .config, .gcode, // and they are being used by slicing core. @@ -142,13 +145,24 @@ class PresetBundle // If the "vendor" section is missing, enable all models and variants of the particular vendor. void load_installed_printers(const AppConfig &config); - const std::string& get_preset_name_by_alias(const Preset::Type& preset_type, const std::string& alias) const; + const std::string& get_preset_name_by_alias(const Preset::Type& preset_type, const std::string& alias); // Save current preset of a provided type under a new name. If the name is different from the old one, // Unselected option would be reverted to the beginning values void save_changes_for_preset(const std::string& new_name, Preset::Type type, const std::vector& unselected_options); + // Transfer options form preset_from_name preset to preset_to_name preset and save preset_to_name preset as new new_name preset + // Return false, if new preset wasn't saved + bool transfer_and_save(Preset::Type type, const std::string& preset_from_name, const std::string& preset_to_name, + const std::string& new_name, const std::vector& options); static const char *PRUSA_BUNDLE; + + static std::array types_list(PrinterTechnology pt) { + if (pt == ptFFF) + return { Preset::TYPE_PRINTER, Preset::TYPE_PRINT, Preset::TYPE_FILAMENT }; + return { Preset::TYPE_PRINTER, Preset::TYPE_SLA_PRINT, Preset::TYPE_SLA_MATERIAL }; + } + private: std::pair load_system_presets(ForwardCompatibilitySubstitutionRule compatibility_rule); // Merge one vendor's presets with the other vendor's presets, report duplicates. @@ -178,6 +192,10 @@ class PresetBundle ENABLE_ENUM_BITMASK_OPERATORS(PresetBundle::LoadConfigBundleAttribute) +// Copies bed texture and model files to 'data_dir()\printer' folder, if needed +// and updates the config accordingly +extern void copy_bed_model_and_texture_if_needed(DynamicPrintConfig& config); + } // namespace Slic3r #endif /* slic3r_PresetBundle_hpp_ */ diff --git a/src/libslic3r/PrincipalComponents2D.cpp b/src/libslic3r/PrincipalComponents2D.cpp new file mode 100644 index 00000000000..7bdf793157d --- /dev/null +++ b/src/libslic3r/PrincipalComponents2D.cpp @@ -0,0 +1,140 @@ +#include "PrincipalComponents2D.hpp" +#include "Point.hpp" + +namespace Slic3r { + + + +// returns triangle area, first_moment_of_area_xy, second_moment_of_area_xy, second_moment_of_area_covariance +// none of the values is divided/normalized by area. +// The function computes intgeral over the area of the triangle, with function f(x,y) = x for first moments of area (y is analogous) +// f(x,y) = x^2 for second moment of area +// and f(x,y) = x*y for second moment of area covariance +std::tuple compute_moments_of_area_of_triangle(const Vec2f &a, const Vec2f &b, const Vec2f &c) +{ + // based on the following guide: + // Denote the vertices of S by a, b, c. Then the map + // g:(u,v)↦a+u(b−a)+v(c−a) , + // which in coordinates appears as + // g:(u,v)↦{x(u,v)y(u,v)=a1+u(b1−a1)+v(c1−a1)=a2+u(b2−a2)+v(c2−a2) ,(1) + // obviously maps S′ bijectively onto S. Therefore the transformation formula for multiple integrals steps into action, and we obtain + // ∫Sf(x,y)d(x,y)=∫S′f(x(u,v),y(u,v))∣∣Jg(u,v)∣∣ d(u,v) . + // In the case at hand the Jacobian determinant is a constant: From (1) we obtain + // Jg(u,v)=det[xuyuxvyv]=(b1−a1)(c2−a2)−(c1−a1)(b2−a2) . + // Therefore we can write + // ∫Sf(x,y)d(x,y)=∣∣Jg∣∣∫10∫1−u0f~(u,v) dv du , + // where f~ denotes the pullback of f to S′: + // f~(u,v):=f(x(u,v),y(u,v)) . + // Don't forget taking the absolute value of Jg! + + float jacobian_determinant_abs = std::abs((b.x() - a.x()) * (c.y() - a.y()) - (c.x() - a.x()) * (b.y() - a.y())); + + // coordinate transform: gx(u,v) = a.x + u * (b.x - a.x) + v * (c.x - a.x) + // coordinate transform: gy(u,v) = a.y + u * (b.y - a.y) + v * (c.y - a.y) + // second moment of area for x: f(x, y) = x^2; + // f(gx(u,v), gy(u,v)) = gx(u,v)^2 = ... (long expanded form) + + // result is Int_T func = jacobian_determinant_abs * Int_0^1 Int_0^1-u func(gx(u,v), gy(u,v)) dv du + // integral_0^1 integral_0^(1 - u) (a + u (b - a) + v (c - a))^2 dv du = 1/12 (a^2 + a (b + c) + b^2 + b c + c^2) + + Vec2f second_moment_of_area_xy = jacobian_determinant_abs * + (a.cwiseProduct(a) + b.cwiseProduct(b) + b.cwiseProduct(c) + c.cwiseProduct(c) + + a.cwiseProduct(b + c)) / + 12.0f; + // second moment of area covariance : f(x, y) = x*y; + // f(gx(u,v), gy(u,v)) = gx(u,v)*gy(u,v) = ... (long expanded form) + //(a_1 + u * (b_1 - a_1) + v * (c_1 - a_1)) * (a_2 + u * (b_2 - a_2) + v * (c_2 - a_2)) + // == (a_1 + u (b_1 - a_1) + v (c_1 - a_1)) (a_2 + u (b_2 - a_2) + v (c_2 - a_2)) + + // intermediate result: integral_0^(1 - u) (a_1 + u (b_1 - a_1) + v (c_1 - a_1)) (a_2 + u (b_2 - a_2) + v (c_2 - a_2)) dv = + // 1/6 (u - 1) (-c_1 (u - 1) (a_2 (u - 1) - 3 b_2 u) - c_2 (u - 1) (a_1 (u - 1) - 3 b_1 u + 2 c_1 (u - 1)) + 3 b_1 u (a_2 (u - 1) - 2 + // b_2 u) + a_1 (u - 1) (3 b_2 u - 2 a_2 (u - 1))) result = integral_0^1 1/6 (u - 1) (-c_1 (u - 1) (a_2 (u - 1) - 3 b_2 u) - c_2 (u - + // 1) (a_1 (u - 1) - 3 b_1 u + 2 c_1 (u - 1)) + 3 b_1 u (a_2 (u - 1) - 2 b_2 u) + a_1 (u - 1) (3 b_2 u - 2 a_2 (u - 1))) du = + // 1/24 (a_2 (b_1 + c_1) + a_1 (2 a_2 + b_2 + c_2) + b_2 c_1 + b_1 c_2 + 2 b_1 b_2 + 2 c_1 c_2) + // result is Int_T func = jacobian_determinant_abs * Int_0^1 Int_0^1-u func(gx(u,v), gy(u,v)) dv du + float second_moment_of_area_covariance = jacobian_determinant_abs * (1.0f / 24.0f) * + (a.y() * (b.x() + c.x()) + a.x() * (2.0f * a.y() + b.y() + c.y()) + b.y() * c.x() + + b.x() * c.y() + 2.0f * b.x() * b.y() + 2.0f * c.x() * c.y()); + + float area = jacobian_determinant_abs * 0.5f; + + Vec2f first_moment_of_area_xy = jacobian_determinant_abs * (a + b + c) / 6.0f; + + return {area, first_moment_of_area_xy, second_moment_of_area_xy, second_moment_of_area_covariance}; +}; + +// returns two eigenvectors of the area covered by given polygons. The vectors are sorted by their corresponding eigenvalue, largest first +std::tuple compute_principal_components(const Polygons &polys) +{ + Vec2f centroid_accumulator = Vec2f::Zero(); + Vec2f second_moment_of_area_accumulator = Vec2f::Zero(); + float second_moment_of_area_covariance_accumulator = 0.0f; + float area = 0.0f; + + for (const Polygon &poly : polys) { + Vec2f p0 = unscaled(poly.first_point()).cast(); + for (size_t i = 2; i < poly.points.size(); i++) { + Vec2f p1 = unscaled(poly.points[i - 1]).cast(); + Vec2f p2 = unscaled(poly.points[i]).cast(); + + float sign = cross2(p1 - p0, p2 - p1) > 0 ? 1.0f : -1.0f; + + auto [triangle_area, first_moment_of_area, second_moment_area, + second_moment_of_area_covariance] = compute_moments_of_area_of_triangle(p0, p1, p2); + area += sign * triangle_area; + centroid_accumulator += sign * first_moment_of_area; + second_moment_of_area_accumulator += sign * second_moment_area; + second_moment_of_area_covariance_accumulator += sign * second_moment_of_area_covariance; + } + } + + if (area <= 0.0) { + return {Vec2f::Zero(), Vec2f::Zero()}; + } + + Vec2f centroid = centroid_accumulator / area; + Vec2f variance = second_moment_of_area_accumulator / area - centroid.cwiseProduct(centroid); + double covariance = second_moment_of_area_covariance_accumulator / area - centroid.x() * centroid.y(); +#if 0 + std::cout << "area : " << area << std::endl; + std::cout << "variancex : " << variance.x() << std::endl; + std::cout << "variancey : " << variance.y() << std::endl; + std::cout << "covariance : " << covariance << std::endl; +#endif + if (abs(covariance) < EPSILON) { + std::tuple result{Vec2f{variance.x(), 0.0}, Vec2f{0.0, variance.y()}}; + if (variance.y() > variance.x()) { + return {std::get<1>(result), std::get<0>(result)}; + } else + return result; + } + + // now we find the first principal component of the covered area by computing max eigenvalue and the correspoding eigenvector of + // covariance matrix + // covaraince matrix C is : | VarX Cov | + // | Cov VarY | + // Eigenvalues are solutions to det(C - lI) = 0, where l is the eigenvalue and I unit matrix + // Eigenvector for eigenvalue l is any vector v such that Cv = lv + + float eigenvalue_a = 0.5f * (variance.x() + variance.y() + + sqrt((variance.x() - variance.y()) * (variance.x() - variance.y()) + 4.0f * covariance * covariance)); + float eigenvalue_b = 0.5f * (variance.x() + variance.y() - + sqrt((variance.x() - variance.y()) * (variance.x() - variance.y()) + 4.0f * covariance * covariance)); + Vec2f eigenvector_a{(eigenvalue_a - variance.y()) / covariance, 1.0f}; + Vec2f eigenvector_b{(eigenvalue_b - variance.y()) / covariance, 1.0f}; + +#if 0 + std::cout << "eigenvalue_a: " << eigenvalue_a << std::endl; + std::cout << "eigenvalue_b: " << eigenvalue_b << std::endl; + std::cout << "eigenvectorA: " << eigenvector_a.x() << " " << eigenvector_a.y() << std::endl; + std::cout << "eigenvectorB: " << eigenvector_b.x() << " " << eigenvector_b.y() << std::endl; +#endif + + if (eigenvalue_a > eigenvalue_b) { + return {eigenvector_a, eigenvector_b}; + } else { + return {eigenvector_b, eigenvector_a}; + } +} + +} \ No newline at end of file diff --git a/src/libslic3r/PrincipalComponents2D.hpp b/src/libslic3r/PrincipalComponents2D.hpp new file mode 100644 index 00000000000..dc8897a7a78 --- /dev/null +++ b/src/libslic3r/PrincipalComponents2D.hpp @@ -0,0 +1,24 @@ +#ifndef slic3r_PrincipalComponents2D_hpp_ +#define slic3r_PrincipalComponents2D_hpp_ + +#include "AABBTreeLines.hpp" +#include "BoundingBox.hpp" +#include "libslic3r.h" +#include +#include "Polygon.hpp" + +namespace Slic3r { + +// returns triangle area, first_moment_of_area_xy, second_moment_of_area_xy, second_moment_of_area_covariance +// none of the values is divided/normalized by area. +// The function computes intgeral over the area of the triangle, with function f(x,y) = x for first moments of area (y is analogous) +// f(x,y) = x^2 for second moment of area +// and f(x,y) = x*y for second moment of area covariance +std::tuple compute_moments_of_area_of_triangle(const Vec2f &a, const Vec2f &b, const Vec2f &c); + +// returns two eigenvectors of the area covered by given polygons. The vectors are sorted by their corresponding eigenvalue, largest first +std::tuple compute_principal_components(const Polygons &polys); + +} + +#endif \ No newline at end of file diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 0a728afda39..14e77e03fa5 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -14,19 +14,19 @@ #include "GCode/WipeTower.hpp" #include "Utils.hpp" #include "BuildVolume.hpp" +#include "format.hpp" #include #include #include +#include #include #include #include #include #include -// Mark string for localization and translate. -#define L(s) Slic3r::I18N::translate(s) namespace Slic3r { @@ -58,6 +58,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n // Cache the plenty of parameters, which influence the G-code generator only, // or they are only notes not influencing the generated G-code. static std::unordered_set steps_gcode = { + "autoemit_temperature_commands", "avoid_crossing_perimeters", "avoid_crossing_perimeters_max_detour", "bed_shape", @@ -66,6 +67,11 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n "between_objects_gcode", "bridge_acceleration", "bridge_fan_speed", + "enable_dynamic_fan_speeds", + "overhang_fan_speed_0", + "overhang_fan_speed_1", + "overhang_fan_speed_2", + "overhang_fan_speed_3", "colorprint_heights", "cooling", "default_acceleration", @@ -132,6 +138,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n "start_filament_gcode", "toolchange_gcode", "top_solid_infill_acceleration", + "travel_acceleration", "thumbnails", "thumbnails_format", "use_firmware_retraction", @@ -194,10 +201,13 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n || opt_key == "infill_first" || opt_key == "single_extruder_multi_material" || opt_key == "temperature" + || opt_key == "idle_temperature" || opt_key == "wipe_tower" || opt_key == "wipe_tower_width" || opt_key == "wipe_tower_brim_width" + || opt_key == "wipe_tower_cone_angle" || opt_key == "wipe_tower_bridging" + || opt_key == "wipe_tower_extra_spacing" || opt_key == "wipe_tower_no_sparse_layers" || opt_key == "wiping_volumes_matrix" || opt_key == "parking_pos_retraction" @@ -225,6 +235,8 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n osteps.emplace_back(posInfill); osteps.emplace_back(posSupportMaterial); steps.emplace_back(psSkirtBrim); + } else if (opt_key == "avoid_crossing_curled_overhangs") { + osteps.emplace_back(posEstimateCurledExtrusions); } else { // for legacy, if we can't handle this option let's invalidate all steps //FIXME invalidate all steps of all objects as well? @@ -348,7 +360,7 @@ std::vector Print::print_object_ids() const bool Print::has_infinite_skirt() const { - return (m_config.draft_shield == dsEnabled && m_config.skirts > 0) || (m_config.ooze_prevention && this->extruders().size() > 1); + return (m_config.draft_shield == dsEnabled && m_config.skirts > 0)/* || (m_config.ooze_prevention && this->extruders().size() > 1)*/; } bool Print::has_skirt() const @@ -384,17 +396,18 @@ bool Print::sequential_print_horizontal_clearance_valid(const Print& print, Poly // FIXME: Arrangement has different parameters for offsetting (jtMiter, limit 2) // which causes that the warning will be showed after arrangement with the // appropriate object distance. Even if I set this to jtMiter the warning still shows up. - it_convex_hull = map_model_object_to_convex_hull.emplace_hint(it_convex_hull, model_object_id, - offset(print_object->model_object()->convex_hull_2d( - Geometry::assemble_transform({ 0.0, 0.0, model_instance0->get_offset().z() }, model_instance0->get_rotation(), model_instance0->get_scaling_factor(), model_instance0->get_mirror())), - // Shrink the extruder_clearance_radius a tiny bit, so that if the object arrangement algorithm placed the objects - // exactly by satisfying the extruder_clearance_radius, this test will not trigger collision. - float(scale_(0.5 * print.config().extruder_clearance_radius.value - BuildVolume::BedEpsilon)), - jtRound, scale_(0.1)).front()); - } + Geometry::Transformation trafo = model_instance0->get_transformation(); + trafo.set_offset({ 0.0, 0.0, model_instance0->get_offset().z() }); + it_convex_hull = map_model_object_to_convex_hull.emplace_hint(it_convex_hull, model_object_id, + offset(print_object->model_object()->convex_hull_2d(trafo.get_matrix()), + // Shrink the extruder_clearance_radius a tiny bit, so that if the object arrangement algorithm placed the objects + // exactly by satisfying the extruder_clearance_radius, this test will not trigger collision. + float(scale_(0.5 * print.config().extruder_clearance_radius.value - BuildVolume::BedEpsilon)), + jtRound, scale_(0.1)).front()); + } // Make a copy, so it may be rotated for instances. Polygon convex_hull0 = it_convex_hull->second; - const double z_diff = Geometry::rotation_diff_z(model_instance0->get_rotation(), print_object->instances().front().model_instance->get_rotation()); + const double z_diff = Geometry::rotation_diff_z(model_instance0->get_matrix(), print_object->instances().front().model_instance->get_matrix()); if (std::abs(z_diff) > EPSILON) convex_hull0.rotate(z_diff); // Now we check that no instance of convex_hull intersects any of the previously checked object instances. @@ -451,31 +464,80 @@ std::string Print::validate(std::string* warning) const std::vector extruders = this->extruders(); if (m_objects.empty()) - return L("All objects are outside of the print volume."); + return _u8L("All objects are outside of the print volume."); if (extruders.empty()) - return L("The supplied settings will cause an empty print."); + return _u8L("The supplied settings will cause an empty print."); if (m_config.complete_objects) { if (! sequential_print_horizontal_clearance_valid(*this)) - return L("Some objects are too close; your extruder will collide with them."); + return _u8L("Some objects are too close; your extruder will collide with them."); if (! sequential_print_vertical_clearance_valid(*this)) - return L("Some objects are too tall and cannot be printed without extruder collisions."); + return _u8L("Some objects are too tall and cannot be printed without extruder collisions."); } + if (m_config.avoid_crossing_perimeters && m_config.avoid_crossing_curled_overhangs) { + return _u8L("Avoid crossing perimeters option and avoid crossing curled overhangs option cannot be both enabled together."); + } + if (m_config.spiral_vase) { size_t total_copies_count = 0; for (const PrintObject *object : m_objects) total_copies_count += object->instances().size(); // #4043 if (total_copies_count > 1 && ! m_config.complete_objects.value) - return L("Only a single object may be printed at a time in Spiral Vase mode. " + return _u8L("Only a single object may be printed at a time in Spiral Vase mode. " "Either remove all but the last object, or enable sequential mode by \"complete_objects\"."); assert(m_objects.size() == 1); if (m_objects.front()->all_regions().size() > 1) - return L("The Spiral Vase option can only be used when printing single material objects."); + return _u8L("The Spiral Vase option can only be used when printing single material objects."); } + if (m_config.machine_limits_usage == MachineLimitsUsage::EmitToGCode && m_config.gcode_flavor == gcfKlipper) + return L("Machine limits cannot be emitted to G-Code when Klipper firmware flavor is used. " + "Change the value of machine_limits_usage."); + + // Cache of layer height profiles for checking: + // 1) Whether all layers are synchronized if printing with wipe tower and / or unsynchronized supports. + // 2) Whether layer height is constant for Organic supports. + // 3) Whether build volume Z is not violated. + std::vector> layer_height_profiles; + auto layer_height_profile = [this, &layer_height_profiles](const size_t print_object_idx) -> const std::vector& { + const PrintObject &print_object = *m_objects[print_object_idx]; + if (layer_height_profiles.empty()) + layer_height_profiles.assign(m_objects.size(), std::vector()); + std::vector &profile = layer_height_profiles[print_object_idx]; + if (profile.empty()) + PrintObject::update_layer_height_profile(*print_object.model_object(), print_object.slicing_parameters(), profile); + return profile; + }; + + // Checks that the print does not exceed the max print height + for (size_t print_object_idx = 0; print_object_idx < m_objects.size(); ++ print_object_idx) { + const PrintObject &print_object = *m_objects[print_object_idx]; + //FIXME It is quite expensive to generate object layers just to get the print height! + if (auto layers = generate_object_layers(print_object.slicing_parameters(), layer_height_profile(print_object_idx)); + ! layers.empty() && layers.back() > this->config().max_print_height + EPSILON) { + return _u8L("The print is taller than the maximum allowed height. You might want to reduce the size of your model" + " or change current print settings and retry."); + } + } + + // Some of the objects has variable layer height applied by painting or by a table. + bool has_custom_layering = std::find_if(m_objects.begin(), m_objects.end(), + [](const PrintObject *object) { return object->model_object()->has_custom_layering(); }) + != m_objects.end(); + + // Custom layering is not allowed for tree supports as of now. + for (size_t print_object_idx = 0; print_object_idx < m_objects.size(); ++ print_object_idx) + if (const PrintObject &print_object = *m_objects[print_object_idx]; + print_object.has_support_material() && print_object.config().support_material_style.value == smsOrganic && + print_object.model_object()->has_custom_layering()) { + if (const std::vector &layers = layer_height_profile(print_object_idx); ! layers.empty()) + if (! check_object_layers_fixed(print_object.slicing_parameters(), layers)) + return _u8L("Variable layer height is not supported with Organic supports."); + } + if (this->has_wipe_tower() && ! m_objects.empty()) { // Make sure all extruders use same diameter filament and have the same nozzle diameter // EPSILON comparison is used for nozzles and 10 % tolerance is used for filaments @@ -486,55 +548,46 @@ std::string Print::validate(std::string* warning) const double filament_diam = m_config.filament_diameter.get_at(extruder_idx); if (nozzle_diam - EPSILON > first_nozzle_diam || nozzle_diam + EPSILON < first_nozzle_diam || std::abs((filament_diam-first_filament_diam)/first_filament_diam) > 0.1) - return L("The wipe tower is only supported if all extruders have the same nozzle diameter " + return _u8L("The wipe tower is only supported if all extruders have the same nozzle diameter " "and use filaments of the same diameter."); } if (m_config.gcode_flavor != gcfRepRapSprinter && m_config.gcode_flavor != gcfRepRapFirmware && - m_config.gcode_flavor != gcfRepetier && m_config.gcode_flavor != gcfMarlinLegacy && m_config.gcode_flavor != gcfMarlinFirmware) - return L("The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, RepRapFirmware and Repetier G-code flavors."); + m_config.gcode_flavor != gcfRepetier && m_config.gcode_flavor != gcfMarlinLegacy && + m_config.gcode_flavor != gcfMarlinFirmware && m_config.gcode_flavor != gcfKlipper) + return _u8L("The Wipe Tower is currently only supported for the Marlin, Klipper, RepRap/Sprinter, RepRapFirmware and Repetier G-code flavors."); if (! m_config.use_relative_e_distances) - return L("The Wipe Tower is currently only supported with the relative extruder addressing (use_relative_e_distances=1)."); - if (m_config.ooze_prevention) - return L("Ooze prevention is currently not supported with the wipe tower enabled."); + return _u8L("The Wipe Tower is currently only supported with the relative extruder addressing (use_relative_e_distances=1)."); + if (m_config.ooze_prevention && m_config.single_extruder_multi_material) + return _u8L("Ooze prevention is only supported with the wipe tower when 'single_extruder_multi_material' is off."); if (m_config.use_volumetric_e) - return L("The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)."); + return _u8L("The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)."); if (m_config.complete_objects && extruders.size() > 1) - return L("The Wipe Tower is currently not supported for multimaterial sequential prints."); + return _u8L("The Wipe Tower is currently not supported for multimaterial sequential prints."); if (m_objects.size() > 1) { - bool has_custom_layering = false; - std::vector> layer_height_profiles; - for (const PrintObject *object : m_objects) { - has_custom_layering = ! object->model_object()->layer_config_ranges.empty() || ! object->model_object()->layer_height_profile.empty(); - if (has_custom_layering) { - layer_height_profiles.assign(m_objects.size(), std::vector()); - break; - } - } - const SlicingParameters &slicing_params0 = m_objects.front()->slicing_parameters(); - size_t tallest_object_idx = 0; - if (has_custom_layering) - PrintObject::update_layer_height_profile(*m_objects.front()->model_object(), slicing_params0, layer_height_profiles.front()); + const SlicingParameters &slicing_params0 = m_objects.front()->slicing_parameters(); + size_t tallest_object_idx = 0; for (size_t i = 1; i < m_objects.size(); ++ i) { const PrintObject *object = m_objects[i]; const SlicingParameters &slicing_params = object->slicing_parameters(); if (std::abs(slicing_params.first_print_layer_height - slicing_params0.first_print_layer_height) > EPSILON || std::abs(slicing_params.layer_height - slicing_params0.layer_height ) > EPSILON) - return L("The Wipe Tower is only supported for multiple objects if they have equal layer heights"); + return _u8L("The Wipe Tower is only supported for multiple objects if they have equal layer heights"); if (slicing_params.raft_layers() != slicing_params0.raft_layers()) - return L("The Wipe Tower is only supported for multiple objects if they are printed over an equal number of raft layers"); + return _u8L("The Wipe Tower is only supported for multiple objects if they are printed over an equal number of raft layers"); if (slicing_params0.gap_object_support != slicing_params.gap_object_support || slicing_params0.gap_support_object != slicing_params.gap_support_object) - return L("The Wipe Tower is only supported for multiple objects if they are printed with the same support_material_contact_distance"); + return _u8L("The Wipe Tower is only supported for multiple objects if they are printed with the same support_material_contact_distance"); if (! equal_layering(slicing_params, slicing_params0)) - return L("The Wipe Tower is only supported for multiple objects if they are sliced equally."); + return _u8L("The Wipe Tower is only supported for multiple objects if they are sliced equally."); if (has_custom_layering) { - PrintObject::update_layer_height_profile(*object->model_object(), slicing_params, layer_height_profiles[i]); - if (*(layer_height_profiles[i].end()-2) > *(layer_height_profiles[tallest_object_idx].end()-2)) + auto &lh = layer_height_profile(i); + auto &lh_tallest = layer_height_profile(tallest_object_idx); + if (*(lh.end()-2) > *(lh_tallest.end()-2)) tallest_object_idx = i; } - } + } if (has_custom_layering) { for (size_t idx_object = 0; idx_object < m_objects.size(); ++ idx_object) { @@ -552,7 +605,7 @@ std::string Print::validate(std::string* warning) const if (i%2 == 0 && layer_height_profiles[tallest_object_idx][i] > layer_height_profiles[idx_object][layer_height_profiles[idx_object].size() - 2 ]) break; if (std::abs(layer_height_profiles[idx_object][i] - layer_height_profiles[tallest_object_idx][i]) > eps) - return L("The Wipe tower is only supported if all objects have the same variable layer height"); + return _u8L("The Wipe tower is only supported if all objects have the same variable layer height"); ++i; } } @@ -576,7 +629,7 @@ std::string Print::validate(std::string* warning) const unsigned int total_extruders_count = m_config.nozzle_diameter.size(); for (const auto& extruder_idx : extruders) if ( extruder_idx >= total_extruders_count ) - return L("One or more object were assigned an extruder that the printer does not have."); + return _u8L("One or more object were assigned an extruder that the printer does not have."); #endif auto validate_extrusion_width = [/*min_nozzle_diameter,*/ max_nozzle_diameter](const ConfigBase &config, const char *opt_key, double layer_height, std::string &err_msg) -> bool { @@ -589,10 +642,10 @@ std::string Print::validate(std::string* warning) const if (extrusion_width_min == 0) { // Default "auto-generated" extrusion width is always valid. } else if (extrusion_width_min <= layer_height) { - err_msg = (boost::format(L("%1%=%2% mm is too low to be printable at a layer height %3% mm")) % opt_key % extrusion_width_min % layer_height).str(); + err_msg = (boost::format(_u8L("%1%=%2% mm is too low to be printable at a layer height %3% mm")) % opt_key % extrusion_width_min % layer_height).str(); return false; } else if (extrusion_width_max >= max_nozzle_diameter * 3.) { - err_msg = (boost::format(L("Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm")) % opt_key % extrusion_width_max % max_nozzle_diameter).str(); + err_msg = (boost::format(_u8L("Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm")) % opt_key % extrusion_width_max % max_nozzle_diameter).str(); return false; } return true; @@ -603,19 +656,19 @@ std::string Print::validate(std::string* warning) const // The object has some form of support and either support_material_extruder or support_material_interface_extruder // will be printed with the current tool without a forced tool change. Play safe, assert that all object nozzles // are of the same diameter. - return L("Printing with multiple extruders of differing nozzle diameters. " + return _u8L("Printing with multiple extruders of differing nozzle diameters. " "If support is to be printed with the current extruder (support_material_extruder == 0 or support_material_interface_extruder == 0), " "all nozzles have to be of the same diameter."); } - if (this->has_wipe_tower()) { + if (this->has_wipe_tower() && object->config().support_material_style != smsOrganic) { if (object->config().support_material_contact_distance == 0) { // Soluble interface - if (object->config().support_material_contact_distance == 0 && ! object->config().support_material_synchronize_layers) - return L("For the Wipe Tower to work with the soluble supports, the support layers need to be synchronized with the object layers."); + if (! object->config().support_material_synchronize_layers) + return _u8L("For the Wipe Tower to work with the soluble supports, the support layers need to be synchronized with the object layers."); } else { // Non-soluble interface if (object->config().support_material_extruder != 0 || object->config().support_material_interface_extruder != 0) - return L("The Wipe Tower currently supports the non-soluble supports only if they are printed with the current extruder without triggering a tool change. " + return _u8L("The Wipe Tower currently supports the non-soluble supports only if they are printed with the current extruder without triggering a tool change. " "(both support_material_extruder and support_material_interface_extruder need to be set to 0)."); } } @@ -651,12 +704,12 @@ std::string Print::validate(std::string* warning) const first_layer_min_nozzle_diameter = min_nozzle_diameter; } if (first_layer_height > first_layer_min_nozzle_diameter) - return L("First layer height can't be greater than nozzle diameter"); + return _u8L("First layer height can't be greater than nozzle diameter"); // validate layer_height double layer_height = object->config().layer_height.value; if (layer_height > min_nozzle_diameter) - return L("Layer height can't be greater than nozzle diameter"); + return _u8L("Layer height can't be greater than nozzle diameter"); // Validate extrusion widths. std::string err_msg; @@ -677,11 +730,11 @@ std::string Print::validate(std::string* warning) const // See GH issues #6336 #5073 if ((m_config.gcode_flavor == gcfMarlinLegacy || m_config.gcode_flavor == gcfMarlinFirmware) && ! before_layer_gcode_resets_extruder && ! layer_gcode_resets_extruder) - return L("Relative extruder addressing requires resetting the extruder position at each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to layer_gcode."); + return _u8L("Relative extruder addressing requires resetting the extruder position at each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to layer_gcode."); } else if (before_layer_gcode_resets_extruder) - return L("\"G92 E0\" was found in before_layer_gcode, which is incompatible with absolute extruder addressing."); + return _u8L("\"G92 E0\" was found in before_layer_gcode, which is incompatible with absolute extruder addressing."); else if (layer_gcode_resets_extruder) - return L("\"G92 E0\" was found in layer_gcode, which is incompatible with absolute extruder addressing."); + return _u8L("\"G92 E0\" was found in layer_gcode, which is incompatible with absolute extruder addressing."); } return std::string(); @@ -823,18 +876,24 @@ void Print::process() BOOST_LOG_TRIVIAL(info) << "Starting the slicing process." << log_memory_info(); for (PrintObject *obj : m_objects) obj->make_perimeters(); - this->set_status(70, L("Infilling layers")); + this->set_status(70, _u8L("Infilling layers")); for (PrintObject *obj : m_objects) obj->infill(); for (PrintObject *obj : m_objects) obj->ironing(); + for (PrintObject *obj : m_objects) + obj->generate_support_spots(); + // check data from previous step, format the error message(s) and send alert to ui + alert_when_supports_needed(); for (PrintObject *obj : m_objects) obj->generate_support_material(); + for (PrintObject *obj : m_objects) + obj->estimate_curled_extrusions(); if (this->set_started(psWipeTower)) { m_wipe_tower_data.clear(); m_tool_ordering.clear(); if (this->has_wipe_tower()) { - //this->set_status(95, L("Generating wipe tower")); + //this->set_status(95, _u8L("Generating wipe tower")); this->_make_wipe_tower(); } else if (! this->config().complete_objects.value) { // Initialize the tool ordering, so it could be used by the G-code preview slider for planning tool changes and filament switches. @@ -845,7 +904,7 @@ void Print::process() this->set_done(psWipeTower); } if (this->set_started(psSkirtBrim)) { - this->set_status(88, L("Generating skirt and brim")); + this->set_status(88, _u8L("Generating skirt and brim")); m_skirt.clear(); m_skirt_convex_hull.clear(); @@ -893,16 +952,16 @@ std::string Print::export_gcode(const std::string& path_template, GCodeProcessor std::string message; if (!path.empty() && result == nullptr) { // Only show the path if preview_data is not set -> running from command line. - message = L("Exporting G-code"); + message = _u8L("Exporting G-code"); message += " to "; message += path; } else - message = L("Generating G-code"); + message = _u8L("Generating G-code"); this->set_status(90, message); - // The following line may die for multiple reasons. - GCode gcode; - gcode.do_export(this, path.c_str(), result, thumbnail_cb); + // Create GCode on heap, it has quite a lot of data. + std::unique_ptr gcode(new GCode); + gcode->do_export(this, path.c_str(), result, thumbnail_cb); return path.c_str(); } @@ -1015,7 +1074,7 @@ void Print::_make_skirt() ExtrusionLoop eloop(elrSkirt); eloop.paths.emplace_back(ExtrusionPath( ExtrusionPath( - erSkirt, + ExtrusionRole::Skirt, (float)mm3_per_mm, // this will be overridden at G-code export time flow.width(), (float)first_layer_height // this will be overridden at G-code export time @@ -1048,6 +1107,8 @@ void Print::_make_skirt() append(m_skirt_convex_hull, std::move(poly.points)); } + + Polygons Print::first_layer_islands() const { Polygons islands; @@ -1069,23 +1130,34 @@ Polygons Print::first_layer_islands() const std::vector Print::first_layer_wipe_tower_corners() const { - std::vector corners; + std::vector pts_scaled; + if (has_wipe_tower() && ! m_wipe_tower_data.tool_changes.empty()) { double width = m_config.wipe_tower_width + 2*m_wipe_tower_data.brim_width; double depth = m_wipe_tower_data.depth + 2*m_wipe_tower_data.brim_width; Vec2d pt0(-m_wipe_tower_data.brim_width, -m_wipe_tower_data.brim_width); - for (Vec2d pt : { - pt0, - Vec2d(pt0.x()+width, pt0.y() ), - Vec2d(pt0.x()+width, pt0.y()+depth), - Vec2d(pt0.x(), pt0.y()+depth) - }) { + + // First the corners. + std::vector pts = { pt0, + Vec2d(pt0.x()+width, pt0.y()), + Vec2d(pt0.x()+width, pt0.y()+depth), + Vec2d(pt0.x(),pt0.y()+depth) + }; + + // Now the stabilization cone. + Vec2d center = (pts[0] + pts[2])/2.; + const auto [cone_R, cone_x_scale] = WipeTower::get_wipe_tower_cone_base(m_config.wipe_tower_width, m_wipe_tower_data.height, m_wipe_tower_data.depth, m_config.wipe_tower_cone_angle); + double r = cone_R + m_wipe_tower_data.brim_width; + for (double alpha = 0.; alpha<2*M_PI; alpha += M_PI/20.) + pts.emplace_back(center + r*Vec2d(std::cos(alpha)/cone_x_scale, std::sin(alpha))); + + for (Vec2d& pt : pts) { pt = Eigen::Rotation2Dd(Geometry::deg2rad(m_config.wipe_tower_rotation_angle.value)) * pt; pt += Vec2d(m_config.wipe_tower_x.value, m_config.wipe_tower_y.value); - corners.emplace_back(Point(scale_(pt.x()), scale_(pt.y()))); + pts_scaled.emplace_back(Point(scale_(pt.x()), scale_(pt.y()))); } } - return corners; + return pts_scaled; } void Print::finalize_first_layer_convex_hull() @@ -1100,6 +1172,158 @@ void Print::finalize_first_layer_convex_hull() m_first_layer_convex_hull = Geometry::convex_hull(m_first_layer_convex_hull.points); } +void Print::alert_when_supports_needed() +{ + if (this->set_started(psAlertWhenSupportsNeeded)) { + BOOST_LOG_TRIVIAL(debug) << "psAlertWhenSupportsNeeded - start"; + set_status(69, _u8L("Alert if supports needed")); + + auto issue_to_alert_message = [](SupportSpotsGenerator::SupportPointCause cause, bool critical) { + std::string message; + switch (cause) { + //TRN Alert when support is needed. Describes that the model has long bridging extrusions which may print badly + case SupportSpotsGenerator::SupportPointCause::LongBridge: message = _u8L("Long bridging extrusions"); break; + //TRN Alert when support is needed. Describes bridge anchors/turns in the air, which will definitely print badly + case SupportSpotsGenerator::SupportPointCause::FloatingBridgeAnchor: message = _u8L("Floating bridge anchors"); break; + case SupportSpotsGenerator::SupportPointCause::FloatingExtrusion: + if (critical) { + //TRN Alert when support is needed. Describes that the print has large overhang area which will print badly or not print at all. + message = _u8L("Collapsing overhang"); + } else { + //TRN Alert when support is needed. Describes extrusions that are not supported enough and come out curled or loose. + message = _u8L("Loose extrusions"); + } + break; + //TRN Alert when support is needed. Describes that the print has low bed adhesion and may became loose. + case SupportSpotsGenerator::SupportPointCause::SeparationFromBed: message = _u8L("Low bed adhesion"); break; + //TRN Alert when support is needed. Describes that the object has part that is not connected to the bed and will not print at all without supports. + case SupportSpotsGenerator::SupportPointCause::UnstableFloatingPart: message = _u8L("Floating object part"); break; + //TRN Alert when support is needed. Describes that the object has thin part that may brake during printing + case SupportSpotsGenerator::SupportPointCause::WeakObjectPart: message = _u8L("Thin fragile part"); break; + } + + return message; + }; + + // TRN this translation rule is used to translate lists of uknown size on single line. The first argument is element of the list, + // the second argument may be element or rest of the list. For most languages, this does not need translation, but some use different + // separator than comma and some use blank space in front of the separator. + auto single_line_list_rule = L("%1%, %2%"); + auto multiline_list_rule = "%1%\n%2%"; + + auto elements_to_translated_list = [](const std::vector &translated_elements, std::string expansion_rule) { + if (expansion_rule.find("%1%") == expansion_rule.npos || expansion_rule.find("%2%") == expansion_rule.npos) { + BOOST_LOG_TRIVIAL(error) << "INCORRECT EXPANSION RULE FOR LIST TRANSLATION: " << expansion_rule + << " - IT SHOULD CONTAIN %1% and %2%!"; + expansion_rule = "%1% %2%"; + } + if (translated_elements.size() == 0) { + return std::string{}; + } + if (translated_elements.size() == 1) { + return translated_elements.front(); + } + + std::string translated_list = expansion_rule; + for (int i = 0; i < translated_elements.size() - 1; i++) { + auto first_elem = translated_list.find("%1%"); + assert(first_elem != translated_list.npos); + translated_list.replace(first_elem, 3, translated_elements[i]); + + // expand the translated list by another application of the same rule + auto second_elem = translated_list.find("%2%"); + assert(second_elem != translated_list.npos); + if (i < translated_elements.size() - 2) { + translated_list.replace(second_elem, 3, expansion_rule); + } else { + translated_list.replace(second_elem, 3, translated_elements[i + 1]); + } + } + + return translated_list; + }; + + // vector of pairs of object and its issues, where each issue is a pair of type and critical flag + std::vector>>> objects_isssues; + + for (const PrintObject *object : m_objects) { + std::unordered_set checked_model_objects; + if (!object->has_support() && checked_model_objects.find(object->model_object()) == checked_model_objects.end()) { + if (object->m_shared_regions->generated_support_points.has_value()) { + SupportSpotsGenerator::SupportPoints supp_points = object->m_shared_regions->generated_support_points->support_points; + SupportSpotsGenerator::PartialObjects partial_objects = object->m_shared_regions->generated_support_points + ->partial_objects; + auto issues = SupportSpotsGenerator::gather_issues(supp_points, partial_objects); + if (issues.size() > 0) { + objects_isssues.emplace_back(object, issues); + } + } + checked_model_objects.emplace(object->model_object()); + } + } + + bool recommend_brim = false; + std::map, std::vector> po_by_support_issues; + for (const auto &obj : objects_isssues) { + for (const auto &issue : obj.second) { + po_by_support_issues[issue].push_back(obj.first); + if (issue.first == SupportSpotsGenerator::SupportPointCause::SeparationFromBed && !obj.first->has_brim()) { + recommend_brim = true; + } + } + } + + std::vector>> message_elements; + if (objects_isssues.size() > po_by_support_issues.size()) { + // there are more objects than causes, group by issues + for (const auto &issue : po_by_support_issues) { + auto &pair = message_elements.emplace_back(issue_to_alert_message(issue.first.first, issue.first.second), + std::vector{}); + for (const auto &obj : issue.second) { + pair.second.push_back(obj->m_model_object->name); + } + } + } else { + // more causes than objects, group by objects + for (const auto &obj : objects_isssues) { + auto &pair = message_elements.emplace_back(obj.first->model_object()->name, std::vector{}); + for (const auto &issue : obj.second) { + pair.second.push_back(issue_to_alert_message(issue.first, issue.second)); + } + } + } + + // first, gather sublements into single line list, store in first subelement + for (auto &pair : message_elements) { + pair.second.front() = elements_to_translated_list(pair.second, single_line_list_rule); + } + + // then gather elements to create multiline list + std::vector lines = {}; + for (auto &pair : message_elements) { + lines.push_back(""); // empty line for readability + lines.push_back(pair.first); + lines.push_back(pair.second.front()); + } + + lines.push_back(""); + lines.push_back(_u8L("Consider enabling supports.")); + if (recommend_brim) { + lines.push_back(_u8L("Also consider enabling brim.")); + } + + // TRN Alert message for detected print issues. first argument is a list of detected issues. + auto message = Slic3r::format(_u8L("Detected print stability issues:\n%1%"), elements_to_translated_list(lines, multiline_list_rule)); + + if (objects_isssues.size() > 0) { + this->active_step_add_warning(PrintStateBase::WarningLevel::NON_CRITICAL, message); + } + + BOOST_LOG_TRIVIAL(debug) << "psAlertWhenSupportsNeeded - end"; + this->set_done(psAlertWhenSupportsNeeded); + } +} + // Wipe tower support. bool Print::has_wipe_tower() const { @@ -1113,11 +1337,23 @@ const WipeTowerData& Print::wipe_tower_data(size_t extruders_cnt) const { // If the wipe tower wasn't created yet, make sure the depth and brim_width members are set to default. if (! is_step_done(psWipeTower) && extruders_cnt !=0) { + const_cast(this)->m_wipe_tower_data.brim_width = m_config.wipe_tower_brim_width; + + // Calculating depth should take into account currently set wiping volumes. + // For a long time, the initial preview would just use 900/width per toolchange (15mm on a 60mm wide tower) + // and it worked well enough. Let's try to do slightly better by accounting for the purging volumes. + std::vector> wipe_volumes = WipeTower::extract_wipe_volumes(m_config); + std::vector max_wipe_volumes; + for (const std::vector& v : wipe_volumes) + max_wipe_volumes.emplace_back(*std::max_element(v.begin(), v.end())); + float maximum = std::accumulate(max_wipe_volumes.begin(), max_wipe_volumes.end(), 0.f); + maximum = maximum * extruders_cnt / max_wipe_volumes.size(); float width = float(m_config.wipe_tower_width); + float layer_height = 0.2f; // just assume fixed value, it will still be better than before. - const_cast(this)->m_wipe_tower_data.depth = (900.f/width) * float(extruders_cnt - 1); - const_cast(this)->m_wipe_tower_data.brim_width = m_config.wipe_tower_brim_width; + const_cast(this)->m_wipe_tower_data.depth = (maximum/layer_height)/width; + const_cast(this)->m_wipe_tower_data.height = -1.f; // unknown yet } return m_wipe_tower_data; @@ -1129,13 +1365,7 @@ void Print::_make_wipe_tower() if (! this->has_wipe_tower()) return; - // Get wiping matrix to get number of extruders and convert vector to vector: - std::vector wiping_matrix(cast(m_config.wiping_volumes_matrix.values)); - // Extract purging volumes for each extruder pair: - std::vector> wipe_volumes; - const unsigned int number_of_extruders = (unsigned int)(sqrt(wiping_matrix.size())+EPSILON); - for (unsigned int i = 0; i(wiping_matrix.begin()+i*number_of_extruders, wiping_matrix.begin()+(i+1)*number_of_extruders)); + std::vector> wipe_volumes = WipeTower::extract_wipe_volumes(m_config); // Let the ToolOrdering class know there will be initial priming extrusions at the start of the print. m_wipe_tower_data.tool_ordering = ToolOrdering(*this, (unsigned int)-1, true); @@ -1188,7 +1418,7 @@ void Print::_make_wipe_tower() //wipe_tower.set_zhop(); // Set the extruder & material properties at the wipe tower object. - for (size_t i = 0; i < number_of_extruders; ++ i) + for (size_t i = 0; i < m_config.nozzle_diameter.size(); ++ i) wipe_tower.set_extruder(i, m_config); m_wipe_tower_data.priming = Slic3r::make_unique>( @@ -1209,7 +1439,7 @@ void Print::_make_wipe_tower() volume_to_wipe -= (float)m_config.filament_minimal_purge_on_wipe_tower.get_at(extruder_id); // try to assign some infills/objects for the wiping: - volume_to_wipe = layer_tools.wiping_extrusions().mark_wiping_extrusions(*this, current_extruder_id, extruder_id, volume_to_wipe); + volume_to_wipe = layer_tools.wiping_extrusions_nonconst().mark_wiping_extrusions(*this, layer_tools, current_extruder_id, extruder_id, volume_to_wipe); // add back the minimal amount toforce on the wipe tower: volume_to_wipe += (float)m_config.filament_minimal_purge_on_wipe_tower.get_at(extruder_id); @@ -1220,7 +1450,7 @@ void Print::_make_wipe_tower() current_extruder_id = extruder_id; } } - layer_tools.wiping_extrusions().ensure_perimeters_infills_order(*this); + layer_tools.wiping_extrusions_nonconst().ensure_perimeters_infills_order(*this, layer_tools); if (&layer_tools == &m_wipe_tower_data.tool_ordering.back() || (&layer_tools + 1)->wipe_tower_partitions == 0) break; } @@ -1231,6 +1461,7 @@ void Print::_make_wipe_tower() wipe_tower.generate(m_wipe_tower_data.tool_changes); m_wipe_tower_data.depth = wipe_tower.get_depth(); m_wipe_tower_data.brim_width = wipe_tower.get_brim_width(); + m_wipe_tower_data.height = wipe_tower.get_wipe_tower_height(); // Unload the current filament over the purge tower. coordf_t layer_height = m_objects.front()->config().layer_height.value; diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index d4829adb5fb..4496de5bf65 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -1,6 +1,8 @@ #ifndef slic3r_Print_hpp_ #define slic3r_Print_hpp_ +#include "Fill/FillAdaptive.hpp" +#include "Fill/FillLightning.hpp" #include "PrintBase.hpp" #include "BoundingBox.hpp" @@ -8,6 +10,7 @@ #include "Flow.hpp" #include "Point.hpp" #include "Slicing.hpp" +#include "SupportSpotsGenerator.hpp" #include "TriangleMeshSlicer.hpp" #include "GCode/ToolOrdering.hpp" #include "GCode/WipeTower.hpp" @@ -20,7 +23,9 @@ #include #include +#include #include +#include namespace Slic3r { @@ -45,12 +50,13 @@ namespace FillLightning { // Print step IDs for keeping track of the print state. // The Print steps are applied in this order. -enum PrintStep { +enum PrintStep : unsigned int { psWipeTower, // Ordering of the tools on PrintObjects for a multi-material print. // psToolOrdering is a synonym to psWipeTower, as the Wipe Tower calculates and modifies the ToolOrdering, // while if printing without the Wipe Tower, the ToolOrdering is calculated as well. psToolOrdering = psWipeTower, + psAlertWhenSupportsNeeded, psSkirtBrim, // Last step before G-code export, after this step is finished, the initial extrusion path preview // should be refreshed. @@ -59,9 +65,9 @@ enum PrintStep { psCount, }; -enum PrintObjectStep { +enum PrintObjectStep : unsigned int { posSlice, posPerimeters, posPrepareInfill, - posInfill, posIroning, posSupportMaterial, posCount, + posInfill, posIroning, posSupportSpotsSearch, posSupportMaterial, posEstimateCurledExtrusions, posCount, }; // A PrintRegion object represents a group of volumes to print @@ -117,38 +123,12 @@ class PrintRegion inline bool operator==(const PrintRegion &lhs, const PrintRegion &rhs) { return lhs.config_hash() == rhs.config_hash() && lhs.config() == rhs.config(); } inline bool operator!=(const PrintRegion &lhs, const PrintRegion &rhs) { return ! (lhs == rhs); } -template -class ConstVectorOfPtrsAdaptor { -public: - // Returning a non-const pointer to const pointers to T. - T * const * begin() const { return m_data->data(); } - T * const * end() const { return m_data->data() + m_data->size(); } - const T* front() const { return m_data->front(); } - const T* back() const { return m_data->back(); } - size_t size() const { return m_data->size(); } - bool empty() const { return m_data->empty(); } - const T* operator[](size_t i) const { return (*m_data)[i]; } - const T* at(size_t i) const { return m_data->at(i); } - std::vector vector() const { return std::vector(this->begin(), this->end()); } -protected: - ConstVectorOfPtrsAdaptor(const std::vector *data) : m_data(data) {} -private: - const std::vector *m_data; -}; - -typedef std::vector LayerPtrs; -typedef std::vector ConstLayerPtrs; -class ConstLayerPtrsAdaptor : public ConstVectorOfPtrsAdaptor { - friend PrintObject; - ConstLayerPtrsAdaptor(const LayerPtrs *data) : ConstVectorOfPtrsAdaptor(data) {} -}; +// For const correctness: Wrapping a vector of non-const pointers as a span of const pointers. +template +using SpanOfConstPtrs = tcb::span; -typedef std::vector SupportLayerPtrs; -typedef std::vector ConstSupportLayerPtrs; -class ConstSupportLayerPtrsAdaptor : public ConstVectorOfPtrsAdaptor { - friend PrintObject; - ConstSupportLayerPtrsAdaptor(const SupportLayerPtrs *data) : ConstVectorOfPtrsAdaptor(data) {} -}; +using LayerPtrs = std::vector; +using SupportLayerPtrs = std::vector; class BoundingBoxf3; // TODO: for temporary constructor parameter @@ -225,6 +205,12 @@ class PrintObjectRegions } }; + struct GeneratedSupportPoints{ + Transform3d object_transform; // for frontend object mapping + SupportSpotsGenerator::SupportPoints support_points; + SupportSpotsGenerator::PartialObjects partial_objects; + }; + std::vector> all_regions; std::vector layer_ranges; // Transformation of this ModelObject into one of the associated PrintObjects (all PrintObjects derived from a single modelObject differ by a Z rotation only). @@ -232,6 +218,8 @@ class PrintObjectRegions Transform3d trafo_bboxes; std::vector cached_volume_ids; + std::optional generated_support_points; + void ref_cnt_inc() { ++ m_ref_cnt; } void ref_cnt_dec() { if (-- m_ref_cnt == 0) delete this; } void clear() { @@ -256,8 +244,8 @@ class PrintObject : public PrintObjectBaseWithState(const_cast(m_layers.data()), m_layers.size()); } + auto support_layers() const { return SpanOfConstPtrs(const_cast(m_support_layers.data()), m_support_layers.size()); } const Transform3d& trafo() const { return m_trafo; } // Trafo with the center_offset() applied after the transformation, to center the object in XY before slicing. Transform3d trafo_centered() const @@ -350,10 +338,16 @@ class PrintObject : public PrintObjectBaseWithState; PrintObject(Print* print, ModelObject* model_object, const Transform3d& trafo, PrintInstances&& instances); - ~PrintObject() { if (m_shared_regions && -- m_shared_regions->m_ref_cnt == 0) delete m_shared_regions; } - + ~PrintObject() override { + if (m_shared_regions && --m_shared_regions->m_ref_cnt == 0) + delete m_shared_regions; + clear_layers(); + clear_support_layers(); + } + void config_apply(const ConfigBase &other, bool ignore_nonexistent = false) { m_config.apply(other, ignore_nonexistent); } void config_apply_only(const ConfigBase &other, const t_config_option_keys &keys, bool ignore_nonexistent = false) { m_config.apply_only(other, keys, ignore_nonexistent); } PrintBase::ApplyStatus set_instances(PrintInstances &&instances); @@ -368,14 +362,20 @@ class PrintObject : public PrintObjectBaseWithState prepare_adaptive_infill_data(); + std::pair prepare_adaptive_infill_data( + const std::vector>& surfaces_w_bottom_z) const; FillLightning::GeneratorPtr prepare_lightning_infill_data(); // XYZ in scaled coordinates @@ -412,6 +413,9 @@ class PrintObject : public PrintObjectBaseWithStateslices is split in top/internal/bottom // so that next call to make_perimeters() performs a union() before computing loops bool m_typed_slices = false; + + std::pair m_adaptive_fill_octrees; + FillLightning::GeneratorPtr m_lightning_generator; }; struct WipeTowerData @@ -430,6 +434,7 @@ struct WipeTowerData // Depth of the wipe tower to pass to GLCanvas3D for exact bounding box: float depth; float brim_width; + float height; void clear() { priming.reset(nullptr); @@ -491,21 +496,10 @@ struct PrintStatistics } }; -typedef std::vector PrintObjectPtrs; -typedef std::vector ConstPrintObjectPtrs; -class ConstPrintObjectPtrsAdaptor : public ConstVectorOfPtrsAdaptor { - friend Print; - ConstPrintObjectPtrsAdaptor(const PrintObjectPtrs *data) : ConstVectorOfPtrsAdaptor(data) {} -}; +using PrintObjectPtrs = std::vector; +using ConstPrintObjectPtrs = std::vector; -typedef std::vector PrintRegionPtrs; -/* -typedef std::vector ConstPrintRegionPtrs; -class ConstPrintRegionPtrsAdaptor : public ConstVectorOfPtrsAdaptor { - friend Print; - ConstPrintRegionPtrsAdaptor(const PrintRegionPtrs *data) : ConstVectorOfPtrsAdaptor(data) {} -}; -*/ +using PrintRegionPtrs = std::vector; // The complete print tray with possibly multiple objects. class Print : public PrintBaseWithState @@ -532,8 +526,11 @@ class Print : public PrintBaseWithState std::vector print_object_ids() const override; ApplyStatus apply(const Model &model, DynamicPrintConfig config) override; - + void set_task(const TaskParams ¶ms) override { PrintBaseWithState::set_task_impl(params, m_objects); } void process() override; + void finalize() override { PrintBaseWithState::finalize_impl(m_objects); } + void cleanup() override; + // Exports G-code into a file name based on the path_template, returns the file path of the generated G-code file. // If preview_data is not null, the preview_data is filled in for the G-code visualization (not used by the command line Slic3r). std::string export_gcode(const std::string& path_template, GCodeProcessorResult* result, ThumbnailsGeneratorCallback thumbnail_cb = nullptr); @@ -566,9 +563,14 @@ class Print : public PrintBaseWithState const PrintConfig& config() const { return m_config; } const PrintObjectConfig& default_object_config() const { return m_default_object_config; } const PrintRegionConfig& default_region_config() const { return m_default_region_config; } - ConstPrintObjectPtrsAdaptor objects() const { return ConstPrintObjectPtrsAdaptor(&m_objects); } + SpanOfConstPtrs objects() const { return SpanOfConstPtrs(const_cast(m_objects.data()), m_objects.size()); } PrintObject* get_object(size_t idx) { return const_cast(m_objects[idx]); } const PrintObject* get_object(size_t idx) const { return m_objects[idx]; } + const PrintObject* get_print_object_by_model_object_id(ObjectID object_id) const { + auto it = std::find_if(m_objects.begin(), m_objects.end(), + [object_id](const PrintObject* obj) { return obj->model_object()->id() == object_id; }); + return (it == m_objects.end()) ? nullptr : *it; + } // PrintObject by its ObjectID, to be used to uniquely bind slicing warnings to their source PrintObjects // in the notification center. const PrintObject* get_object(ObjectID object_id) const { @@ -619,12 +621,19 @@ class Print : public PrintBaseWithState void _make_skirt(); void _make_wipe_tower(); void finalize_first_layer_convex_hull(); + void alert_when_supports_needed(); // Islands of objects and their supports extruded at the 1st layer. Polygons first_layer_islands() const; // Return 4 wipe tower corners in the world coordinates (shifted and rotated), including the wipe tower brim. std::vector first_layer_wipe_tower_corners() const; + // Returns true if any of the print_objects has print_object_step valid. + // That means data shared by all print objects of the print_objects span may still use the shared data. + // Otherwise the shared data shall be released. + // Unguarded variant, thus it shall only be called from main thread with background processing stopped. + static bool is_shared_print_object_step_valid_unguarded(SpanOfConstPtrs print_objects, PrintObjectStep print_object_step); + PrintConfig m_config; PrintObjectConfig m_default_object_config; PrintRegionConfig m_default_region_config; diff --git a/src/libslic3r/PrintApply.cpp b/src/libslic3r/PrintApply.cpp index 34e3129d98b..1cd91a33ad0 100644 --- a/src/libslic3r/PrintApply.cpp +++ b/src/libslic3r/PrintApply.cpp @@ -1,1444 +1,1478 @@ -#include "Model.hpp" -#include "Print.hpp" - -#include - -namespace Slic3r { - -// Add or remove support modifier ModelVolumes from model_object_dst to match the ModelVolumes of model_object_new -// in the exact order and with the same IDs. -// It is expected, that the model_object_dst already contains the non-support volumes of model_object_new in the correct order. -// Friend to ModelVolume to allow copying. -// static is not accepted by gcc if declared as a friend of ModelObject. -/* static */ void model_volume_list_update_supports(ModelObject &model_object_dst, const ModelObject &model_object_new) -{ - typedef std::pair ModelVolumeWithStatus; - std::vector old_volumes; - old_volumes.reserve(model_object_dst.volumes.size()); - for (const ModelVolume *model_volume : model_object_dst.volumes) - old_volumes.emplace_back(ModelVolumeWithStatus(model_volume, false)); - auto model_volume_lower = [](const ModelVolumeWithStatus &mv1, const ModelVolumeWithStatus &mv2){ return mv1.first->id() < mv2.first->id(); }; - auto model_volume_equal = [](const ModelVolumeWithStatus &mv1, const ModelVolumeWithStatus &mv2){ return mv1.first->id() == mv2.first->id(); }; - std::sort(old_volumes.begin(), old_volumes.end(), model_volume_lower); - model_object_dst.volumes.clear(); - model_object_dst.volumes.reserve(model_object_new.volumes.size()); - for (const ModelVolume *model_volume_src : model_object_new.volumes) { - ModelVolumeWithStatus key(model_volume_src, false); - auto it = std::lower_bound(old_volumes.begin(), old_volumes.end(), key, model_volume_lower); - if (it != old_volumes.end() && model_volume_equal(*it, key)) { - // The volume was found in the old list. Just copy it. - assert(! it->second); // not consumed yet - it->second = true; - ModelVolume *model_volume_dst = const_cast(it->first); - // For support modifiers, the type may have been switched from blocker to enforcer and vice versa. - assert((model_volume_dst->is_support_modifier() && model_volume_src->is_support_modifier()) || model_volume_dst->type() == model_volume_src->type()); - model_object_dst.volumes.emplace_back(model_volume_dst); - if (model_volume_dst->is_support_modifier()) { - // For support modifiers, the type may have been switched from blocker to enforcer and vice versa. - model_volume_dst->set_type(model_volume_src->type()); - model_volume_dst->set_transformation(model_volume_src->get_transformation()); - } - assert(model_volume_dst->get_matrix().isApprox(model_volume_src->get_matrix())); - } else { - // The volume was not found in the old list. Create a new copy. - assert(model_volume_src->is_support_modifier()); - model_object_dst.volumes.emplace_back(new ModelVolume(*model_volume_src)); - model_object_dst.volumes.back()->set_model_object(&model_object_dst); - } - } - // Release the non-consumed old volumes (those were deleted from the new list). - for (ModelVolumeWithStatus &mv_with_status : old_volumes) - if (! mv_with_status.second) - delete mv_with_status.first; -} - -static inline void model_volume_list_copy_configs(ModelObject &model_object_dst, const ModelObject &model_object_src, const ModelVolumeType type) -{ - size_t i_src, i_dst; - for (i_src = 0, i_dst = 0; i_src < model_object_src.volumes.size() && i_dst < model_object_dst.volumes.size();) { - const ModelVolume &mv_src = *model_object_src.volumes[i_src]; - ModelVolume &mv_dst = *model_object_dst.volumes[i_dst]; - if (mv_src.type() != type) { - ++ i_src; - continue; - } - if (mv_dst.type() != type) { - ++ i_dst; - continue; - } - assert(mv_src.id() == mv_dst.id()); - // Copy the ModelVolume data. - mv_dst.name = mv_src.name; - mv_dst.config.assign_config(mv_src.config); - assert(mv_dst.supported_facets.id() == mv_src.supported_facets.id()); - mv_dst.supported_facets.assign(mv_src.supported_facets); - assert(mv_dst.seam_facets.id() == mv_src.seam_facets.id()); - mv_dst.seam_facets.assign(mv_src.seam_facets); - assert(mv_dst.mmu_segmentation_facets.id() == mv_src.mmu_segmentation_facets.id()); - mv_dst.mmu_segmentation_facets.assign(mv_src.mmu_segmentation_facets); - //FIXME what to do with the materials? - // mv_dst.m_material_id = mv_src.m_material_id; - ++ i_src; - ++ i_dst; - } -} - -static inline void layer_height_ranges_copy_configs(t_layer_config_ranges &lr_dst, const t_layer_config_ranges &lr_src) -{ - assert(lr_dst.size() == lr_src.size()); - auto it_src = lr_src.cbegin(); - for (auto &kvp_dst : lr_dst) { - const auto &kvp_src = *it_src ++; - assert(std::abs(kvp_dst.first.first - kvp_src.first.first ) <= EPSILON); - assert(std::abs(kvp_dst.first.second - kvp_src.first.second) <= EPSILON); - // Layer heights are allowed do differ in case the layer height table is being overriden by the smooth profile. - // assert(std::abs(kvp_dst.second.option("layer_height")->getFloat() - kvp_src.second.option("layer_height")->getFloat()) <= EPSILON); - kvp_dst.second = kvp_src.second; - } -} - -static inline bool transform3d_lower(const Transform3d &lhs, const Transform3d &rhs) -{ - typedef Transform3d::Scalar T; - const T *lv = lhs.data(); - const T *rv = rhs.data(); - for (size_t i = 0; i < 16; ++ i, ++ lv, ++ rv) { - if (*lv < *rv) - return true; - else if (*lv > *rv) - return false; - } - return false; -} - -static inline bool transform3d_equal(const Transform3d &lhs, const Transform3d &rhs) -{ - typedef Transform3d::Scalar T; - const T *lv = lhs.data(); - const T *rv = rhs.data(); - for (size_t i = 0; i < 16; ++ i, ++ lv, ++ rv) - if (*lv != *rv) - return false; - return true; -} - -struct PrintObjectTrafoAndInstances -{ - Transform3d trafo; - PrintInstances instances; - bool operator<(const PrintObjectTrafoAndInstances &rhs) const { return transform3d_lower(this->trafo, rhs.trafo); } -}; - -// Generate a list of trafos and XY offsets for instances of a ModelObject -static std::vector print_objects_from_model_object(const ModelObject &model_object) -{ - std::set trafos; - PrintObjectTrafoAndInstances trafo; - for (ModelInstance *model_instance : model_object.instances) - if (model_instance->is_printable()) { - trafo.trafo = model_instance->get_matrix(); - auto shift = Point::new_scale(trafo.trafo.data()[12], trafo.trafo.data()[13]); - // Reset the XY axes of the transformation. - trafo.trafo.data()[12] = 0; - trafo.trafo.data()[13] = 0; - // Search or insert a trafo. - auto it = trafos.emplace(trafo).first; - const_cast(*it).instances.emplace_back(PrintInstance{ nullptr, model_instance, shift }); - } - return std::vector(trafos.begin(), trafos.end()); -} - -// Compare just the layer ranges and their layer heights, not the associated configs. -// Ignore the layer heights if check_layer_heights is false. -static bool layer_height_ranges_equal(const t_layer_config_ranges &lr1, const t_layer_config_ranges &lr2, bool check_layer_height) -{ - if (lr1.size() != lr2.size()) - return false; - auto it2 = lr2.begin(); - for (const auto &kvp1 : lr1) { - const auto &kvp2 = *it2 ++; - if (std::abs(kvp1.first.first - kvp2.first.first ) > EPSILON || - std::abs(kvp1.first.second - kvp2.first.second) > EPSILON || - (check_layer_height && std::abs(kvp1.second.option("layer_height")->getFloat() - kvp2.second.option("layer_height")->getFloat()) > EPSILON)) - return false; - } - return true; -} - -// Returns true if va == vb when all CustomGCode items that are not ToolChangeCode are ignored. -static bool custom_per_printz_gcodes_tool_changes_differ(const std::vector &va, const std::vector &vb) -{ - auto it_a = va.begin(); - auto it_b = vb.begin(); - while (it_a != va.end() || it_b != vb.end()) { - if (it_a != va.end() && it_a->type != CustomGCode::ToolChange) { - // Skip any CustomGCode items, which are not tool changes. - ++ it_a; - continue; - } - if (it_b != vb.end() && it_b->type != CustomGCode::ToolChange) { - // Skip any CustomGCode items, which are not tool changes. - ++ it_b; - continue; - } - if (it_a == va.end() || it_b == vb.end()) - // va or vb contains more Tool Changes than the other. - return true; - assert(it_a->type == CustomGCode::ToolChange); - assert(it_b->type == CustomGCode::ToolChange); - if (*it_a != *it_b) - // The two Tool Changes differ. - return true; - ++ it_a; - ++ it_b; - } - // There is no change in custom Tool Changes. - return false; -} - -// Collect changes to print config, account for overrides of extruder retract values by filament presets. -static t_config_option_keys print_config_diffs( - const PrintConfig ¤t_config, - const DynamicPrintConfig &new_full_config, - DynamicPrintConfig &filament_overrides) -{ - const std::vector &extruder_retract_keys = print_config_def.extruder_retract_keys(); - const std::string filament_prefix = "filament_"; - t_config_option_keys print_diff; - for (const t_config_option_key &opt_key : current_config.keys()) { - const ConfigOption *opt_old = current_config.option(opt_key); - assert(opt_old != nullptr); - const ConfigOption *opt_new = new_full_config.option(opt_key); - // assert(opt_new != nullptr); - if (opt_new == nullptr) - //FIXME This may happen when executing some test cases. - continue; - const ConfigOption *opt_new_filament = std::binary_search(extruder_retract_keys.begin(), extruder_retract_keys.end(), opt_key) ? new_full_config.option(filament_prefix + opt_key) : nullptr; - if (opt_new_filament != nullptr && ! opt_new_filament->is_nil()) { - // An extruder retract override is available at some of the filament presets. - bool overriden = opt_new->overriden_by(opt_new_filament); - if (overriden || *opt_old != *opt_new) { - auto opt_copy = opt_new->clone(); - opt_copy->apply_override(opt_new_filament); - bool changed = *opt_old != *opt_copy; - if (changed) - print_diff.emplace_back(opt_key); - if (changed || overriden) { - // filament_overrides will be applied to the placeholder parser, which layers these parameters over full_print_config. - filament_overrides.set_key_value(opt_key, opt_copy); - } else - delete opt_copy; - } - } else if (*opt_new != *opt_old) - print_diff.emplace_back(opt_key); - } - - return print_diff; -} - -// Prepare for storing of the full print config into new_full_config to be exported into the G-code and to be used by the PlaceholderParser. -static t_config_option_keys full_print_config_diffs(const DynamicPrintConfig ¤t_full_config, const DynamicPrintConfig &new_full_config) -{ - t_config_option_keys full_config_diff; - for (const t_config_option_key &opt_key : new_full_config.keys()) { - const ConfigOption *opt_old = current_full_config.option(opt_key); - const ConfigOption *opt_new = new_full_config.option(opt_key); - if (opt_old == nullptr || *opt_new != *opt_old) - full_config_diff.emplace_back(opt_key); - } - return full_config_diff; -} - -// Repository for solving partial overlaps of ModelObject::layer_config_ranges. -// Here the const DynamicPrintConfig* point to the config in ModelObject::layer_config_ranges. -class LayerRanges -{ -public: - struct LayerRange { - t_layer_height_range layer_height_range; - // Config is owned by the associated ModelObject. - const DynamicPrintConfig* config { nullptr }; - - bool operator<(const LayerRange &rhs) const throw() { return this->layer_height_range < rhs.layer_height_range; } - }; - - LayerRanges() = default; - LayerRanges(const t_layer_config_ranges &in) { this->assign(in); } - - // Convert input config ranges into continuous non-overlapping sorted vector of intervals and their configs. - void assign(const t_layer_config_ranges &in) { - m_ranges.clear(); - m_ranges.reserve(in.size()); - // Input ranges are sorted lexicographically. First range trims the other ranges. - coordf_t last_z = 0; - for (const std::pair &range : in) - if (range.first.second > last_z) { - coordf_t min_z = std::max(range.first.first, 0.); - if (min_z > last_z + EPSILON) { - m_ranges.push_back({ t_layer_height_range(last_z, min_z) }); - last_z = min_z; - } - if (range.first.second > last_z + EPSILON) { - const DynamicPrintConfig *cfg = &range.second.get(); - m_ranges.push_back({ t_layer_height_range(last_z, range.first.second), cfg }); - last_z = range.first.second; - } - } - if (m_ranges.empty()) - m_ranges.push_back({ t_layer_height_range(0, DBL_MAX) }); - else if (m_ranges.back().config == nullptr) - m_ranges.back().layer_height_range.second = DBL_MAX; - else - m_ranges.push_back({ t_layer_height_range(m_ranges.back().layer_height_range.second, DBL_MAX) }); - } - - const DynamicPrintConfig* config(const t_layer_height_range &range) const { - auto it = std::lower_bound(m_ranges.begin(), m_ranges.end(), LayerRange{ { range.first - EPSILON, range.second - EPSILON } }); - // #ys_FIXME_COLOR - // assert(it != m_ranges.end()); - // assert(it == m_ranges.end() || std::abs(it->first.first - range.first ) < EPSILON); - // assert(it == m_ranges.end() || std::abs(it->first.second - range.second) < EPSILON); - if (it == m_ranges.end() || - std::abs(it->layer_height_range.first - range.first) > EPSILON || - std::abs(it->layer_height_range.second - range.second) > EPSILON ) - return nullptr; // desired range doesn't found - return it == m_ranges.end() ? nullptr : it->config; - } - - std::vector::const_iterator begin() const { return m_ranges.cbegin(); } - std::vector::const_iterator end () const { return m_ranges.cend(); } - size_t size () const { return m_ranges.size(); } - -private: - // Layer ranges with their config overrides and list of volumes with their snug bounding boxes in a given layer range. - std::vector m_ranges; -}; - -// To track Model / ModelObject updates between the front end and back end, including layer height ranges, their configs, -// and snug bounding boxes of ModelVolumes. -struct ModelObjectStatus { - enum Status { - Unknown, - Old, - New, - Moved, - Deleted, - }; - - enum class PrintObjectRegionsStatus { - Invalid, - Valid, - PartiallyValid, - }; - - ModelObjectStatus(ObjectID id, Status status = Unknown) : id(id), status(status) {} - ~ModelObjectStatus() { if (print_object_regions) print_object_regions->ref_cnt_dec(); } - - // Key of the set. - ObjectID id; - // Status of this ModelObject with id on apply(). - Status status; - // PrintObjects to be generated for this ModelObject including their base transformation. - std::vector print_instances; - // Regions shared by the associated PrintObjects. - PrintObjectRegions *print_object_regions { nullptr }; - // Status of the above. - PrintObjectRegionsStatus print_object_regions_status { PrintObjectRegionsStatus::Invalid }; - - // Search by id. - bool operator<(const ModelObjectStatus &rhs) const { return id < rhs.id; } -}; - -struct ModelObjectStatusDB -{ - void add(const ModelObject &model_object, const ModelObjectStatus::Status status) { - assert(db.find(ModelObjectStatus(model_object.id())) == db.end()); - db.emplace(model_object.id(), status); - } - - bool add_if_new(const ModelObject &model_object, const ModelObjectStatus::Status status) { - auto it = db.find(ModelObjectStatus(model_object.id())); - if (it == db.end()) { - db.emplace_hint(it, model_object.id(), status); - return true; - } - return false; - } - - const ModelObjectStatus& get(const ModelObject &model_object) { - auto it = db.find(ModelObjectStatus(model_object.id())); - assert(it != db.end()); - return *it; - } - - const ModelObjectStatus& reuse(const ModelObject &model_object) { - const ModelObjectStatus &result = this->get(model_object); - assert(result.status != ModelObjectStatus::Deleted); - return result; - } - - std::set db; -}; - -struct PrintObjectStatus { - enum Status { - Unknown, - Deleted, - Reused, - New - }; - - PrintObjectStatus(PrintObject *print_object, Status status = Unknown) : - id(print_object->model_object()->id()), - print_object(print_object), - trafo(print_object->trafo()), - status(status) {} - PrintObjectStatus(ObjectID id) : id(id), print_object(nullptr), trafo(Transform3d::Identity()), status(Unknown) {} - - // ID of the ModelObject & PrintObject - ObjectID id; - // Pointer to the old PrintObject - PrintObject *print_object; - // Trafo generated with model_object->world_matrix(true) - Transform3d trafo; - Status status; - - // Search by id. - bool operator<(const PrintObjectStatus &rhs) const { return id < rhs.id; } -}; - -class PrintObjectStatusDB { -public: - using iterator = std::multiset::iterator; - using const_iterator = std::multiset::const_iterator; - - PrintObjectStatusDB(const PrintObjectPtrs &print_objects) { - for (PrintObject *print_object : print_objects) - m_db.emplace(PrintObjectStatus(print_object)); - } - - struct iterator_range : std::pair - { - using std::pair::pair; - iterator_range(const std::pair in) : std::pair(in) {} - - const_iterator begin() throw() { return this->first; } - const_iterator end() throw() { return this->second; } - }; - - iterator_range get_range(const ModelObject &model_object) const { - return m_db.equal_range(PrintObjectStatus(model_object.id())); - } - - iterator_range get_range(const ModelObjectStatus &model_object_status) const { - return m_db.equal_range(PrintObjectStatus(model_object_status.id)); - } - - size_t count(const ModelObject &model_object) { - return m_db.count(PrintObjectStatus(model_object.id())); - } - - std::multiset::iterator begin() { return m_db.begin(); } - std::multiset::iterator end() { return m_db.end(); } - - void clear() { - m_db.clear(); - } - -private: - std::multiset m_db; -}; - -static inline bool model_volume_solid_or_modifier(const ModelVolume &mv) -{ - ModelVolumeType type = mv.type(); - return type == ModelVolumeType::MODEL_PART || type == ModelVolumeType::NEGATIVE_VOLUME || type == ModelVolumeType::PARAMETER_MODIFIER; -} - -static inline Transform3f trafo_for_bbox(const Transform3d &object_trafo, const Transform3d &volume_trafo) -{ - Transform3d m = object_trafo * volume_trafo; - m.translation().x() = 0.; - m.translation().y() = 0.; - return m.cast(); -} - -static inline bool trafos_differ_in_rotation_by_z_and_mirroring_by_xy_only(const Transform3d &t1, const Transform3d &t2) -{ - if (std::abs(t1.translation().z() - t2.translation().z()) > EPSILON) - // One of the object is higher than the other above the build plate (or below the build plate). - return false; - Matrix3d m1 = t1.matrix().block<3, 3>(0, 0); - Matrix3d m2 = t2.matrix().block<3, 3>(0, 0); - Matrix3d m = m2.inverse() * m1; - Vec3d z = m.block<3, 1>(0, 2); - if (std::abs(z.x()) > EPSILON || std::abs(z.y()) > EPSILON || std::abs(z.z() - 1.) > EPSILON) - // Z direction or length changed. - return false; - // Z still points in the same direction and it has the same length. - Vec3d x = m.block<3, 1>(0, 0); - Vec3d y = m.block<3, 1>(0, 1); - if (std::abs(x.z()) > EPSILON || std::abs(y.z()) > EPSILON) - return false; - double lx2 = x.squaredNorm(); - double ly2 = y.squaredNorm(); - if (lx2 - 1. > EPSILON * EPSILON || ly2 - 1. > EPSILON * EPSILON) - return false; - // Verify whether the vectors x, y are still perpendicular. - double d = x.dot(y); - return std::abs(d * d) < EPSILON * lx2 * ly2; -} - -static PrintObjectRegions::BoundingBox transformed_its_bbox2d(const indexed_triangle_set &its, const Transform3f &m, float offset) -{ - assert(! its.indices.empty()); - - PrintObjectRegions::BoundingBox bbox(m * its.vertices[its.indices.front()(0)]); - for (const stl_triangle_vertex_indices &tri : its.indices) - for (int i = 0; i < 3; ++ i) - bbox.extend(m * its.vertices[tri(i)]); - bbox.min() -= Vec3f(offset, offset, float(EPSILON)); - bbox.max() += Vec3f(offset, offset, float(EPSILON)); - return bbox; -} - -static void transformed_its_bboxes_in_z_ranges( - const indexed_triangle_set &its, - const Transform3f &m, - const std::vector &z_ranges, - std::vector> &bboxes, - const float offset) -{ - bboxes.assign(z_ranges.size(), std::make_pair(PrintObjectRegions::BoundingBox(), false)); - for (const stl_triangle_vertex_indices &tri : its.indices) { - const Vec3f pts[3] = { m * its.vertices[tri(0)], m * its.vertices[tri(1)], m * its.vertices[tri(2)] }; - for (size_t irange = 0; irange < z_ranges.size(); ++ irange) { - const t_layer_height_range &z_range = z_ranges[irange]; - std::pair &bbox = bboxes[irange]; - auto bbox_extend = [&bbox](const Vec3f& p) { - if (bbox.second) { - bbox.first.extend(p); - } else { - bbox.first.min() = bbox.first.max() = p; - bbox.second = true; - } - }; - int iprev = 2; - for (int iedge = 0; iedge < 3; ++ iedge) { - const Vec3f *p1 = &pts[iprev]; - const Vec3f *p2 = &pts[iedge]; - // Sort the edge points by Z. - if (p1->z() > p2->z()) - std::swap(p1, p2); - if (p2->z() <= z_range.first || p1->z() >= z_range.second) { - // Out of this slab. - } else if (p1->z() < z_range.first) { - if (p1->z() > z_range.second) { - // Two intersections. - float zspan = p2->z() - p1->z(); - float t1 = (z_range.first - p1->z()) / zspan; - float t2 = (z_range.second - p1->z()) / zspan; - Vec2f p = to_2d(*p1); - Vec2f v(p2->x() - p1->x(), p2->y() - p1->y()); - bbox_extend(to_3d((p + v * t1).eval(), float(z_range.first))); - bbox_extend(to_3d((p + v * t2).eval(), float(z_range.second))); - } else { - // Single intersection with the lower limit. - float t = (z_range.first - p1->z()) / (p2->z() - p1->z()); - Vec2f v(p2->x() - p1->x(), p2->y() - p1->y()); - bbox_extend(to_3d((to_2d(*p1) + v * t).eval(), float(z_range.first))); - bbox_extend(*p2); - } - } else if (p2->z() > z_range.second) { - // Single intersection with the upper limit. - float t = (z_range.second - p1->z()) / (p2->z() - p1->z()); - Vec2f v(p2->x() - p1->x(), p2->y() - p1->y()); - bbox_extend(to_3d((to_2d(*p1) + v * t).eval(), float(z_range.second))); - bbox_extend(*p1); - } else { - // Both points are inside. - bbox_extend(*p1); - bbox_extend(*p2); - } - iprev = iedge; - } - } - } - - for (std::pair &bbox : bboxes) { - bbox.first.min() -= Vec3f(offset, offset, float(EPSILON)); - bbox.first.max() += Vec3f(offset, offset, float(EPSILON)); - } -} - -// Last PrintObject for this print_object_regions has been fully invalidated (deleted). -// Keep print_object_regions, but delete those volumes, which were either removed from new_volumes, or which rotated or scaled, so they need -// their bounding boxes to be recalculated. -void print_objects_regions_invalidate_keep_some_volumes(PrintObjectRegions &print_object_regions, ModelVolumePtrs old_volumes, ModelVolumePtrs new_volumes) -{ - print_object_regions.all_regions.clear(); - - model_volumes_sort_by_id(old_volumes); - model_volumes_sort_by_id(new_volumes); - - size_t i_cached_volume = 0; - size_t last_cached_volume = 0; - size_t i_old = 0; - for (size_t i_new = 0; i_new < new_volumes.size(); ++ i_new) - if (model_volume_solid_or_modifier(*new_volumes[i_new])) { - for (; i_old < old_volumes.size(); ++ i_old) - if (old_volumes[i_old]->id() >= new_volumes[i_new]->id()) - break; - if (i_old != old_volumes.size() && old_volumes[i_old]->id() == new_volumes[i_new]->id()) { - if (old_volumes[i_old]->get_matrix().isApprox(new_volumes[i_new]->get_matrix())) { - // Reuse the volume. - for (; print_object_regions.cached_volume_ids[i_cached_volume] < old_volumes[i_old]->id(); ++ i_cached_volume) - assert(i_cached_volume < print_object_regions.cached_volume_ids.size()); - assert(i_cached_volume < print_object_regions.cached_volume_ids.size() && print_object_regions.cached_volume_ids[i_cached_volume] == old_volumes[i_old]->id()); - print_object_regions.cached_volume_ids[last_cached_volume ++] = print_object_regions.cached_volume_ids[i_cached_volume ++]; - } else { - // Don't reuse the volume. - } - } - } - print_object_regions.cached_volume_ids.erase(print_object_regions.cached_volume_ids.begin() + last_cached_volume, print_object_regions.cached_volume_ids.end()); -} - -// Find a bounding box of a volume's part intersecting layer_range. Such a bounding box will likely be smaller in XY than the full bounding box, -// thus it will intersect with lower number of other volumes. -const PrintObjectRegions::BoundingBox* find_volume_extents(const PrintObjectRegions::LayerRangeRegions &layer_range, const ModelVolume &volume) -{ - auto it = lower_bound_by_predicate(layer_range.volumes.begin(), layer_range.volumes.end(), [&volume](const PrintObjectRegions::VolumeExtents &l){ return l.volume_id < volume.id(); }); - return it != layer_range.volumes.end() && it->volume_id == volume.id() ? &it->bbox : nullptr; -} - -// Find a bounding box of a topmost printable volume referenced by this modifier given this_region_id. -PrintObjectRegions::BoundingBox find_modifier_volume_extents(const PrintObjectRegions::LayerRangeRegions &layer_range, const int this_region_id) -{ - // Find the top-most printable volume of this modifier, or the printable volume itself. - const PrintObjectRegions::VolumeRegion &this_region = layer_range.volume_regions[this_region_id]; - const PrintObjectRegions::BoundingBox *this_extents = find_volume_extents(layer_range, *this_region.model_volume); - assert(this_extents); - PrintObjectRegions::BoundingBox out { *this_extents }; - if (! this_region.model_volume->is_model_part()) - for (int parent_region_id = this_region.parent;;) { - assert(parent_region_id >= 0); - const PrintObjectRegions::VolumeRegion &parent_region = layer_range.volume_regions[parent_region_id]; - const PrintObjectRegions::BoundingBox *parent_extents = find_volume_extents(layer_range, *parent_region.model_volume); - assert(parent_extents); - out.extend(*parent_extents); - if (parent_region.model_volume->is_model_part()) - break; - parent_region_id = parent_region.parent; - } - return out; -} - -PrintRegionConfig region_config_from_model_volume(const PrintRegionConfig &default_or_parent_region_config, const DynamicPrintConfig *layer_range_config, const ModelVolume &volume, size_t num_extruders); - -void print_region_ref_inc(PrintRegion &r) { ++ r.m_ref_cnt; } -void print_region_ref_reset(PrintRegion &r) { r.m_ref_cnt = 0; } -int print_region_ref_cnt(const PrintRegion &r) { return r.m_ref_cnt; } - -// Verify whether the PrintRegions of a PrintObject are still valid, possibly after updating the region configs. -// Before region configs are updated, callback_invalidate() is called to possibly stop background processing. -// Returns false if this object needs to be resliced because regions were merged or split. -bool verify_update_print_object_regions( - ModelVolumePtrs model_volumes, - const PrintRegionConfig &default_region_config, - size_t num_extruders, - const std::vector &painting_extruders, - PrintObjectRegions &print_object_regions, - const std::function &callback_invalidate) -{ - // Sort by ModelVolume ID. - model_volumes_sort_by_id(model_volumes); - - for (std::unique_ptr ®ion : print_object_regions.all_regions) - print_region_ref_reset(*region); - - // Verify and / or update PrintRegions produced by ModelVolumes, layer range modifiers, modifier volumes. - for (PrintObjectRegions::LayerRangeRegions &layer_range : print_object_regions.layer_ranges) { - // Each modifier ModelVolume intersecting this layer_range shall be referenced here at least once if it intersects some - // printable ModelVolume at this layer_range even if it does not modify its overlapping printable ModelVolume configuration yet. - // VolumeRegions reference ModelVolumes in layer_range.volume_regions the order they are stored in ModelObject volumes. - // Remember whether a given modifier ModelVolume was visited already. - auto it_model_volume_modifier_last = model_volumes.end(); - for (PrintObjectRegions::VolumeRegion ®ion : layer_range.volume_regions) - if (region.model_volume->is_model_part() || region.model_volume->is_modifier()) { - auto it_model_volume = lower_bound_by_predicate(model_volumes.begin(), model_volumes.end(), [®ion](const ModelVolume *l){ return l->id() < region.model_volume->id(); }); - assert(it_model_volume != model_volumes.end() && (*it_model_volume)->id() == region.model_volume->id()); - if (region.model_volume->is_modifier() && it_model_volume != it_model_volume_modifier_last) { - // A modifier ModelVolume is visited for the first time. - // A visited modifier may not have had parent volume_regions created overlapping with some model parts or modifiers, - // if the visited modifier did not modify their properties. Now the visited modifier's configuration may have changed, - // which may require new regions to be created. - it_model_volume_modifier_last = it_model_volume; - int next_region_id = int(®ion - layer_range.volume_regions.data()); - const PrintObjectRegions::BoundingBox *bbox = find_volume_extents(layer_range, *region.model_volume); - assert(bbox); - for (int parent_region_id = next_region_id - 1; parent_region_id >= 0; -- parent_region_id) { - const PrintObjectRegions::VolumeRegion &parent_region = layer_range.volume_regions[parent_region_id]; - assert(parent_region.model_volume != region.model_volume); - if (parent_region.model_volume->is_model_part() || parent_region.model_volume->is_modifier()) { - // volume_regions are produced in decreasing order of parent volume_regions ids. - // Some regions may not have been generated the last time by generate_print_object_regions(). - assert(next_region_id == int(layer_range.volume_regions.size()) || - layer_range.volume_regions[next_region_id].model_volume != region.model_volume || - layer_range.volume_regions[next_region_id].parent <= parent_region_id); - if (next_region_id < int(layer_range.volume_regions.size()) && - layer_range.volume_regions[next_region_id].model_volume == region.model_volume && - layer_range.volume_regions[next_region_id].parent == parent_region_id) { - // A parent region is already overridden. - ++ next_region_id; - } else if (PrintObjectRegions::BoundingBox parent_bbox = find_modifier_volume_extents(layer_range, parent_region_id); parent_bbox.intersects(*bbox)) - // Such parent region does not exist. If it is needed, then we need to reslice. - // Only create new region for a modifier, which actually modifies config of it's parent. - if (PrintRegionConfig config = region_config_from_model_volume(parent_region.region->config(), nullptr, **it_model_volume, num_extruders); - config != parent_region.region->config()) - // This modifier newly overrides a region, which it did not before. We need to reslice. - return false; - } - } - } - PrintRegionConfig cfg = region.parent == -1 ? - region_config_from_model_volume(default_region_config, layer_range.config, **it_model_volume, num_extruders) : - region_config_from_model_volume(layer_range.volume_regions[region.parent].region->config(), nullptr, **it_model_volume, num_extruders); - if (cfg != region.region->config()) { - // Region configuration changed. - if (print_region_ref_cnt(*region.region) == 0) { - // Region is referenced for the first time. Just change its parameters. - // Stop the background process before assigning new configuration to the regions. - t_config_option_keys diff = region.region->config().diff(cfg); - callback_invalidate(region.region->config(), cfg, diff); - region.region->config_apply_only(cfg, diff, false); - } else { - // Region is referenced multiple times, thus the region is being split. We need to reslice. - return false; - } - } - print_region_ref_inc(*region.region); - } - } - - // Verify and / or update PrintRegions produced by color painting. - for (const PrintObjectRegions::LayerRangeRegions &layer_range : print_object_regions.layer_ranges) - for (const PrintObjectRegions::PaintedRegion ®ion : layer_range.painted_regions) { - const PrintObjectRegions::VolumeRegion &parent_region = layer_range.volume_regions[region.parent]; - PrintRegionConfig cfg = parent_region.region->config(); - cfg.perimeter_extruder.value = region.extruder_id; - cfg.solid_infill_extruder.value = region.extruder_id; - cfg.infill_extruder.value = region.extruder_id; - if (cfg != region.region->config()) { - // Region configuration changed. - if (print_region_ref_cnt(*region.region) == 0) { - // Region is referenced for the first time. Just change its parameters. - // Stop the background process before assigning new configuration to the regions. - t_config_option_keys diff = region.region->config().diff(cfg); - callback_invalidate(region.region->config(), cfg, diff); - region.region->config_apply_only(cfg, diff, false); - } else { - // Region is referenced multiple times, thus the region is being split. We need to reslice. - return false; - } - } - print_region_ref_inc(*region.region); - } - - // Lastly verify, whether some regions were not merged. - { - std::vector regions; - regions.reserve(print_object_regions.all_regions.size()); - for (std::unique_ptr ®ion : print_object_regions.all_regions) { - assert(print_region_ref_cnt(*region) > 0); - regions.emplace_back(&(*region.get())); - } - std::sort(regions.begin(), regions.end(), [](const PrintRegion *l, const PrintRegion *r){ return l->config_hash() < r->config_hash(); }); - for (size_t i = 0; i < regions.size(); ++ i) { - size_t hash = regions[i]->config_hash(); - size_t j = i; - for (++ j; j < regions.size() && regions[j]->config_hash() == hash; ++ j) - if (regions[i]->config() == regions[j]->config()) { - // Regions were merged. We need to reslice. - return false; - } - } - } - - return true; -} - -// Update caches of volume bounding boxes. -void update_volume_bboxes( - std::vector &layer_ranges, - std::vector &cached_volume_ids, - ModelVolumePtrs model_volumes, - const Transform3d &object_trafo, - const float offset) -{ - // output will be sorted by the order of model_volumes sorted by their ObjectIDs. - model_volumes_sort_by_id(model_volumes); - - if (layer_ranges.size() == 1) { - PrintObjectRegions::LayerRangeRegions &layer_range = layer_ranges.front(); - std::vector volumes_old(std::move(layer_range.volumes)); - layer_range.volumes.reserve(model_volumes.size()); - for (const ModelVolume *model_volume : model_volumes) - if (model_volume_solid_or_modifier(*model_volume)) { - if (std::binary_search(cached_volume_ids.begin(), cached_volume_ids.end(), model_volume->id())) { - auto it = lower_bound_by_predicate(volumes_old.begin(), volumes_old.end(), [model_volume](PrintObjectRegions::VolumeExtents &l) { return l.volume_id < model_volume->id(); }); - if (it != volumes_old.end() && it->volume_id == model_volume->id()) - layer_range.volumes.emplace_back(*it); - } else - layer_range.volumes.push_back({ model_volume->id(), - transformed_its_bbox2d(model_volume->mesh().its, trafo_for_bbox(object_trafo, model_volume->get_matrix(false)), offset) }); - } - } else { - std::vector> volumes_old; - if (cached_volume_ids.empty()) - for (PrintObjectRegions::LayerRangeRegions &layer_range : layer_ranges) - layer_range.volumes.clear(); - else { - volumes_old.reserve(layer_ranges.size()); - for (PrintObjectRegions::LayerRangeRegions &layer_range : layer_ranges) - volumes_old.emplace_back(std::move(layer_range.volumes)); - } - - std::vector> bboxes; - std::vector ranges; - ranges.reserve(layer_ranges.size()); - for (const PrintObjectRegions::LayerRangeRegions &layer_range : layer_ranges) { - t_layer_height_range r = layer_range.layer_height_range; - r.first -= EPSILON; - r.second += EPSILON; - ranges.emplace_back(r); - } - for (const ModelVolume *model_volume : model_volumes) - if (model_volume_solid_or_modifier(*model_volume)) { - if (std::binary_search(cached_volume_ids.begin(), cached_volume_ids.end(), model_volume->id())) { - for (PrintObjectRegions::LayerRangeRegions &layer_range : layer_ranges) { - const auto &vold = volumes_old[&layer_range - layer_ranges.data()]; - auto it = lower_bound_by_predicate(vold.begin(), vold.end(), [model_volume](const PrintObjectRegions::VolumeExtents &l) { return l.volume_id < model_volume->id(); }); - if (it != vold.end() && it->volume_id == model_volume->id()) - layer_range.volumes.emplace_back(*it); - } - } else { - transformed_its_bboxes_in_z_ranges(model_volume->mesh().its, trafo_for_bbox(object_trafo, model_volume->get_matrix(false)), ranges, bboxes, offset); - for (PrintObjectRegions::LayerRangeRegions &layer_range : layer_ranges) - if (auto &bbox = bboxes[&layer_range - layer_ranges.data()]; bbox.second) - layer_range.volumes.push_back({ model_volume->id(), bbox.first }); - } - } - } - - cached_volume_ids.clear(); - cached_volume_ids.reserve(model_volumes.size()); - for (const ModelVolume *v : model_volumes) - if (model_volume_solid_or_modifier(*v)) - cached_volume_ids.emplace_back(v->id()); -} - -// Either a fresh PrintObject, or PrintObject regions were invalidated (merged, split). -// Generate PrintRegions from scratch. -static PrintObjectRegions* generate_print_object_regions( - PrintObjectRegions *print_object_regions_old, - const ModelVolumePtrs &model_volumes, - const LayerRanges &model_layer_ranges, - const PrintRegionConfig &default_region_config, - const Transform3d &trafo, - size_t num_extruders, - const float xy_size_compensation, - const std::vector &painting_extruders) -{ - // Reuse the old object or generate a new one. - auto out = print_object_regions_old ? std::unique_ptr(print_object_regions_old) : std::make_unique(); - auto &all_regions = out->all_regions; - auto &layer_ranges_regions = out->layer_ranges; - - all_regions.clear(); - - bool reuse_old = print_object_regions_old && !print_object_regions_old->layer_ranges.empty(); - - if (reuse_old) { - // Reuse old bounding boxes of some ModelVolumes and their ranges. - // Verify that the old ranges match the new ranges. - assert(model_layer_ranges.size() == layer_ranges_regions.size()); - for (const auto &range : model_layer_ranges) { - PrintObjectRegions::LayerRangeRegions &r = layer_ranges_regions[&range - &*model_layer_ranges.begin()]; - assert(range.layer_height_range == r.layer_height_range); - // If model::assign_copy() is called, layer_ranges_regions is copied thus the pointers to configs are lost. - r.config = range.config; - r.volume_regions.clear(); - r.painted_regions.clear(); - } - } else { - out->trafo_bboxes = trafo; - layer_ranges_regions.reserve(model_layer_ranges.size()); - for (const auto &range : model_layer_ranges) - layer_ranges_regions.push_back({ range.layer_height_range, range.config }); - } - - const bool is_mm_painted = num_extruders > 1 && std::any_of(model_volumes.cbegin(), model_volumes.cend(), [](const ModelVolume *mv) { return mv->is_mm_painted(); }); - update_volume_bboxes(layer_ranges_regions, out->cached_volume_ids, model_volumes, out->trafo_bboxes, is_mm_painted ? 0.f : std::max(0.f, xy_size_compensation)); - - std::vector region_set; - auto get_create_region = [®ion_set, &all_regions](PrintRegionConfig &&config) -> PrintRegion* { - size_t hash = config.hash(); - auto it = Slic3r::lower_bound_by_predicate(region_set.begin(), region_set.end(), [&config, hash](const PrintRegion* l) { - return l->config_hash() < hash || (l->config_hash() == hash && l->config() < config); }); - if (it != region_set.end() && (*it)->config_hash() == hash && (*it)->config() == config) - return *it; - // Insert into a sorted array, it has O(n) complexity, but the calling algorithm has an O(n^2*log(n)) complexity anyways. - all_regions.emplace_back(std::make_unique(std::move(config), hash, int(all_regions.size()))); - PrintRegion *region = all_regions.back().get(); - region_set.emplace(it, region); - return region; - }; - - // Chain the regions in the order they are stored in the volumes list. - for (int volume_id = 0; volume_id < int(model_volumes.size()); ++ volume_id) { - const ModelVolume &volume = *model_volumes[volume_id]; - if (model_volume_solid_or_modifier(volume)) { - for (PrintObjectRegions::LayerRangeRegions &layer_range : layer_ranges_regions) - if (const PrintObjectRegions::BoundingBox *bbox = find_volume_extents(layer_range, volume); bbox) { - if (volume.is_model_part()) { - // Add a model volume, assign an existing region or generate a new one. - layer_range.volume_regions.push_back({ - &volume, -1, - get_create_region(region_config_from_model_volume(default_region_config, layer_range.config, volume, num_extruders)), - bbox - }); - } else if (volume.is_negative_volume()) { - // Add a negative (subtractor) volume. Such volume has neither region nor parent volume assigned. - layer_range.volume_regions.push_back({ &volume, -1, nullptr, bbox }); - } else { - assert(volume.is_modifier()); - // Modifiers may be chained one over the other. Check for overlap, merge DynamicPrintConfigs. - bool added = false; - int parent_model_part_id = -1; - for (int parent_region_id = int(layer_range.volume_regions.size()) - 1; parent_region_id >= 0; -- parent_region_id) { - const PrintObjectRegions::VolumeRegion &parent_region = layer_range.volume_regions[parent_region_id]; - const ModelVolume &parent_volume = *parent_region.model_volume; - if (parent_volume.is_model_part() || parent_volume.is_modifier()) - if (PrintObjectRegions::BoundingBox parent_bbox = find_modifier_volume_extents(layer_range, parent_region_id); parent_bbox.intersects(*bbox)) { - // Only create new region for a modifier, which actually modifies config of it's parent. - if (PrintRegionConfig config = region_config_from_model_volume(parent_region.region->config(), nullptr, volume, num_extruders); - config != parent_region.region->config()) { - added = true; - layer_range.volume_regions.push_back({ &volume, parent_region_id, get_create_region(std::move(config)), bbox }); - } else if (parent_model_part_id == -1 && parent_volume.is_model_part()) - parent_model_part_id = parent_region_id; - } - } - if (! added && parent_model_part_id >= 0) - // This modifier does not override any printable volume's configuration, however it may in the future. - // Store it so that verify_update_print_object_regions() will handle this modifier correctly if its configuration changes. - layer_range.volume_regions.push_back({ &volume, parent_model_part_id, layer_range.volume_regions[parent_model_part_id].region, bbox }); - } - } - } - } - - // Finally add painting regions. - for (PrintObjectRegions::LayerRangeRegions &layer_range : layer_ranges_regions) { - for (unsigned int painted_extruder_id : painting_extruders) - for (int parent_region_id = 0; parent_region_id < int(layer_range.volume_regions.size()); ++ parent_region_id) - if (const PrintObjectRegions::VolumeRegion &parent_region = layer_range.volume_regions[parent_region_id]; - parent_region.model_volume->is_model_part() || parent_region.model_volume->is_modifier()) { - PrintRegionConfig cfg = parent_region.region->config(); - cfg.perimeter_extruder.value = painted_extruder_id; - cfg.solid_infill_extruder.value = painted_extruder_id; - cfg.infill_extruder.value = painted_extruder_id; - layer_range.painted_regions.push_back({ painted_extruder_id, parent_region_id, get_create_region(std::move(cfg))}); - } - // Sort the regions by parent region::print_object_region_id() and extruder_id to help the slicing algorithm when applying MMU segmentation. - std::sort(layer_range.painted_regions.begin(), layer_range.painted_regions.end(), [&layer_range](auto &l, auto &r) { - int lid = layer_range.volume_regions[l.parent].region->print_object_region_id(); - int rid = layer_range.volume_regions[r.parent].region->print_object_region_id(); - return lid < rid || (lid == rid && l.extruder_id < r.extruder_id); }); - } - - return out.release(); -} - -Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_config) -{ -#ifdef _DEBUG - check_model_ids_validity(model); -#endif /* _DEBUG */ - - // Normalize the config. - new_full_config.option("print_settings_id", true); - new_full_config.option("filament_settings_id", true); - new_full_config.option("printer_settings_id", true); - new_full_config.option("physical_printer_settings_id", true); - new_full_config.normalize_fdm(); - - // Find modified keys of the various configs. Resolve overrides extruder retract values by filament profiles. - DynamicPrintConfig filament_overrides; - t_config_option_keys print_diff = print_config_diffs(m_config, new_full_config, filament_overrides); - t_config_option_keys full_config_diff = full_print_config_diffs(m_full_print_config, new_full_config); - // Collect changes to object and region configs. - t_config_option_keys object_diff = m_default_object_config.diff(new_full_config); - t_config_option_keys region_diff = m_default_region_config.diff(new_full_config); - - // Do not use the ApplyStatus as we will use the max function when updating apply_status. - unsigned int apply_status = APPLY_STATUS_UNCHANGED; - auto update_apply_status = [&apply_status](bool invalidated) - { apply_status = std::max(apply_status, invalidated ? APPLY_STATUS_INVALIDATED : APPLY_STATUS_CHANGED); }; - if (! (print_diff.empty() && object_diff.empty() && region_diff.empty())) - update_apply_status(false); - - // Grab the lock for the Print / PrintObject milestones. - std::scoped_lock lock(this->state_mutex()); - - // The following call may stop the background processing. - if (! print_diff.empty()) - update_apply_status(this->invalidate_state_by_config_options(new_full_config, print_diff)); - - // Apply variables to placeholder parser. The placeholder parser is used by G-code export, - // which should be stopped if print_diff is not empty. - size_t num_extruders = m_config.nozzle_diameter.size(); - bool num_extruders_changed = false; - if (! full_config_diff.empty()) { - update_apply_status(this->invalidate_step(psGCodeExport)); - m_placeholder_parser.clear_config(); - // Set the profile aliases for the PrintBase::output_filename() - m_placeholder_parser.set("print_preset", new_full_config.option("print_settings_id")->clone()); - m_placeholder_parser.set("filament_preset", new_full_config.option("filament_settings_id")->clone()); - m_placeholder_parser.set("printer_preset", new_full_config.option("printer_settings_id")->clone()); - m_placeholder_parser.set("physical_printer_preset", new_full_config.option("physical_printer_settings_id")->clone()); - // We want the filament overrides to be applied over their respective extruder parameters by the PlaceholderParser. - // see "Placeholders do not respect filament overrides." GH issue #3649 - m_placeholder_parser.apply_config(filament_overrides); - // It is also safe to change m_config now after this->invalidate_state_by_config_options() call. - m_config.apply_only(new_full_config, print_diff, true); - //FIXME use move semantics once ConfigBase supports it. - // Some filament_overrides may contain values different from new_full_config, but equal to m_config. - // As long as these config options don't reallocate memory when copying, we are safe overriding a value, which is in use by a worker thread. - m_config.apply(filament_overrides); - // Handle changes to object config defaults - m_default_object_config.apply_only(new_full_config, object_diff, true); - // Handle changes to regions config defaults - m_default_region_config.apply_only(new_full_config, region_diff, true); - m_full_print_config = std::move(new_full_config); - if (num_extruders != m_config.nozzle_diameter.size()) { - num_extruders = m_config.nozzle_diameter.size(); - num_extruders_changed = true; - } - } - - ModelObjectStatusDB model_object_status_db; - - // 1) Synchronize model objects. - bool print_regions_reshuffled = false; - if (model.id() != m_model.id()) { - // Kill everything, initialize from scratch. - // Stop background processing. - this->call_cancel_callback(); - update_apply_status(this->invalidate_all_steps()); - for (PrintObject *object : m_objects) { - model_object_status_db.add(*object->model_object(), ModelObjectStatus::Deleted); - update_apply_status(object->invalidate_all_steps()); - delete object; - } - m_objects.clear(); - print_regions_reshuffled = true; - m_model.assign_copy(model); - for (const ModelObject *model_object : m_model.objects) - model_object_status_db.add(*model_object, ModelObjectStatus::New); - } else { - if (m_model.custom_gcode_per_print_z != model.custom_gcode_per_print_z) { - update_apply_status(num_extruders_changed || - // Tool change G-codes are applied as color changes for a single extruder printer, no need to invalidate tool ordering. - //FIXME The tool ordering may be invalidated unnecessarily if the custom_gcode_per_print_z.mode is not applicable - // to the active print / model state, and then it is reset, so it is being applicable, but empty, thus the effect is the same. - (num_extruders > 1 && custom_per_printz_gcodes_tool_changes_differ(m_model.custom_gcode_per_print_z.gcodes, model.custom_gcode_per_print_z.gcodes)) ? - // The Tool Ordering and the Wipe Tower are no more valid. - this->invalidate_steps({ psWipeTower, psGCodeExport }) : - // There is no change in Tool Changes stored in custom_gcode_per_print_z, therefore there is no need to update Tool Ordering. - this->invalidate_step(psGCodeExport)); - m_model.custom_gcode_per_print_z = model.custom_gcode_per_print_z; - } - if (model_object_list_equal(m_model, model)) { - // The object list did not change. - for (const ModelObject *model_object : m_model.objects) - model_object_status_db.add(*model_object, ModelObjectStatus::Old); - } else if (model_object_list_extended(m_model, model)) { - // Add new objects. Their volumes and configs will be synchronized later. - update_apply_status(this->invalidate_step(psGCodeExport)); - for (const ModelObject *model_object : m_model.objects) - model_object_status_db.add(*model_object, ModelObjectStatus::Old); - for (size_t i = m_model.objects.size(); i < model.objects.size(); ++ i) { - model_object_status_db.add(*model.objects[i], ModelObjectStatus::New); - m_model.objects.emplace_back(ModelObject::new_copy(*model.objects[i])); - m_model.objects.back()->set_model(&m_model); - } - } else { - // Reorder the objects, add new objects. - // First stop background processing before shuffling or deleting the PrintObjects in the object list. - this->call_cancel_callback(); - update_apply_status(this->invalidate_step(psGCodeExport)); - // Second create a new list of objects. - std::vector model_objects_old(std::move(m_model.objects)); - m_model.objects.clear(); - m_model.objects.reserve(model.objects.size()); - auto by_id_lower = [](const ModelObject *lhs, const ModelObject *rhs){ return lhs->id() < rhs->id(); }; - std::sort(model_objects_old.begin(), model_objects_old.end(), by_id_lower); - for (const ModelObject *mobj : model.objects) { - auto it = std::lower_bound(model_objects_old.begin(), model_objects_old.end(), mobj, by_id_lower); - if (it == model_objects_old.end() || (*it)->id() != mobj->id()) { - // New ModelObject added. - m_model.objects.emplace_back(ModelObject::new_copy(*mobj)); - m_model.objects.back()->set_model(&m_model); - model_object_status_db.add(*mobj, ModelObjectStatus::New); - } else { - // Existing ModelObject re-added (possibly moved in the list). - m_model.objects.emplace_back(*it); - model_object_status_db.add(*mobj, ModelObjectStatus::Moved); - } - } - bool deleted_any = false; - for (ModelObject *&model_object : model_objects_old) - if (model_object_status_db.add_if_new(*model_object, ModelObjectStatus::Deleted)) - deleted_any = true; - else - // Do not delete this ModelObject instance. - model_object = nullptr; - if (deleted_any) { - // Delete PrintObjects of the deleted ModelObjects. - PrintObjectPtrs print_objects_old = std::move(m_objects); - m_objects.clear(); - m_objects.reserve(print_objects_old.size()); - for (PrintObject *print_object : print_objects_old) { - const ModelObjectStatus &status = model_object_status_db.get(*print_object->model_object()); - if (status.status == ModelObjectStatus::Deleted) { - update_apply_status(print_object->invalidate_all_steps()); - delete print_object; - } else - m_objects.emplace_back(print_object); - } - for (ModelObject *model_object : model_objects_old) - delete model_object; - print_regions_reshuffled = true; - } - } - } - - // 2) Map print objects including their transformation matrices. - PrintObjectStatusDB print_object_status_db(m_objects); - - // 3) Synchronize ModelObjects & PrintObjects. - const std::initializer_list solid_or_modifier_types { ModelVolumeType::MODEL_PART, ModelVolumeType::NEGATIVE_VOLUME, ModelVolumeType::PARAMETER_MODIFIER }; - for (size_t idx_model_object = 0; idx_model_object < model.objects.size(); ++ idx_model_object) { - ModelObject &model_object = *m_model.objects[idx_model_object]; - ModelObjectStatus &model_object_status = const_cast(model_object_status_db.reuse(model_object)); - const ModelObject &model_object_new = *model.objects[idx_model_object]; - if (model_object_status.status == ModelObjectStatus::New) - // PrintObject instances will be added in the next loop. - continue; - // Update the ModelObject instance, possibly invalidate the linked PrintObjects. - assert(model_object_status.status == ModelObjectStatus::Old || model_object_status.status == ModelObjectStatus::Moved); - // Check whether a model part volume was added or removed, their transformations or order changed. - // Only volume IDs, volume types, transformation matrices and their order are checked, configuration and other parameters are NOT checked. - bool solid_or_modifier_differ = model_volume_list_changed(model_object, model_object_new, solid_or_modifier_types) || - model_mmu_segmentation_data_changed(model_object, model_object_new) || - (model_object_new.is_mm_painted() && num_extruders_changed); - bool supports_differ = model_volume_list_changed(model_object, model_object_new, ModelVolumeType::SUPPORT_BLOCKER) || - model_volume_list_changed(model_object, model_object_new, ModelVolumeType::SUPPORT_ENFORCER); - bool layer_height_ranges_differ = ! layer_height_ranges_equal(model_object.layer_config_ranges, model_object_new.layer_config_ranges, model_object_new.layer_height_profile.empty()); - bool model_origin_translation_differ = model_object.origin_translation != model_object_new.origin_translation; - auto print_objects_range = print_object_status_db.get_range(model_object); - // The list actually can be empty if all instances are out of the print bed. - //assert(print_objects_range.begin() != print_objects_range.end()); - // All PrintObjects in print_objects_range shall point to the same prints_objects_regions - if (print_objects_range.begin() != print_objects_range.end()) { - model_object_status.print_object_regions = print_objects_range.begin()->print_object->m_shared_regions; - model_object_status.print_object_regions->ref_cnt_inc(); - } - if (solid_or_modifier_differ || model_origin_translation_differ || layer_height_ranges_differ || - ! model_object.layer_height_profile.timestamp_matches(model_object_new.layer_height_profile)) { - // The very first step (the slicing step) is invalidated. One may freely remove all associated PrintObjects. - model_object_status.print_object_regions_status = - model_object_status.print_object_regions == nullptr || model_origin_translation_differ || layer_height_ranges_differ ? - // Drop print_objects_regions. - ModelObjectStatus::PrintObjectRegionsStatus::Invalid : - // Reuse bounding boxes of print_objects_regions for ModelVolumes with unmodified transformation. - ModelObjectStatus::PrintObjectRegionsStatus::PartiallyValid; - for (const PrintObjectStatus &print_object_status : print_objects_range) { - update_apply_status(print_object_status.print_object->invalidate_all_steps()); - const_cast(print_object_status).status = PrintObjectStatus::Deleted; - } - if (model_object_status.print_object_regions_status == ModelObjectStatus::PrintObjectRegionsStatus::PartiallyValid) - // Drop everything from PrintObjectRegions but those VolumeExtents (of their particular ModelVolumes) that are still valid. - print_objects_regions_invalidate_keep_some_volumes(*model_object_status.print_object_regions, model_object.volumes, model_object_new.volumes); - else if (model_object_status.print_object_regions != nullptr) - model_object_status.print_object_regions->clear(); - // Copy content of the ModelObject including its ID, do not change the parent. - model_object.assign_copy(model_object_new); - } else { - model_object_status.print_object_regions_status = ModelObjectStatus::PrintObjectRegionsStatus::Valid; - if (supports_differ || model_custom_supports_data_changed(model_object, model_object_new)) { - // First stop background processing before shuffling or deleting the ModelVolumes in the ModelObject's list. - if (supports_differ) { - this->call_cancel_callback(); - update_apply_status(false); - } - // Invalidate just the supports step. - for (const PrintObjectStatus &print_object_status : print_objects_range) - update_apply_status(print_object_status.print_object->invalidate_step(posSupportMaterial)); - if (supports_differ) { - // Copy just the support volumes. - model_volume_list_update_supports(model_object, model_object_new); - } - } else if (model_custom_seam_data_changed(model_object, model_object_new)) { - update_apply_status(this->invalidate_step(psGCodeExport)); - } - } - if (! solid_or_modifier_differ) { - // Synchronize Object's config. - bool object_config_changed = ! model_object.config.timestamp_matches(model_object_new.config); - if (object_config_changed) - model_object.config.assign_config(model_object_new.config); - if (! object_diff.empty() || object_config_changed || num_extruders_changed) { - PrintObjectConfig new_config = PrintObject::object_config_from_model_object(m_default_object_config, model_object, num_extruders); - for (const PrintObjectStatus &print_object_status : print_object_status_db.get_range(model_object)) { - t_config_option_keys diff = print_object_status.print_object->config().diff(new_config); - if (! diff.empty()) { - update_apply_status(print_object_status.print_object->invalidate_state_by_config_options(print_object_status.print_object->config(), new_config, diff)); - print_object_status.print_object->config_apply_only(new_config, diff, true); - } - } - } - // Synchronize (just copy) the remaining data of ModelVolumes (name, config, custom supports data). - //FIXME What to do with m_material_id? - model_volume_list_copy_configs(model_object /* dst */, model_object_new /* src */, ModelVolumeType::MODEL_PART); - model_volume_list_copy_configs(model_object /* dst */, model_object_new /* src */, ModelVolumeType::PARAMETER_MODIFIER); - layer_height_ranges_copy_configs(model_object.layer_config_ranges /* dst */, model_object_new.layer_config_ranges /* src */); - // Copy the ModelObject name, input_file and instances. The instances will be compared against PrintObject instances in the next step. - model_object.name = model_object_new.name; - model_object.input_file = model_object_new.input_file; - // Only refresh ModelInstances if there is any change. - if (model_object.instances.size() != model_object_new.instances.size() || - ! std::equal(model_object.instances.begin(), model_object.instances.end(), model_object_new.instances.begin(), [](auto l, auto r){ return l->id() == r->id(); })) { - // G-code generator accesses model_object.instances to generate sequential print ordering matching the Plater object list. - update_apply_status(this->invalidate_step(psGCodeExport)); - model_object.clear_instances(); - model_object.instances.reserve(model_object_new.instances.size()); - for (const ModelInstance *model_instance : model_object_new.instances) { - model_object.instances.emplace_back(new ModelInstance(*model_instance)); - model_object.instances.back()->set_model_object(&model_object); - } - } else if (! std::equal(model_object.instances.begin(), model_object.instances.end(), model_object_new.instances.begin(), - [](auto l, auto r){ return l->print_volume_state == r->print_volume_state && l->printable == r->printable && - l->get_transformation().get_matrix().isApprox(r->get_transformation().get_matrix()); })) { - // If some of the instances changed, the bounding box of the updated ModelObject is likely no more valid. - // This is safe as the ModelObject's bounding box is only accessed from this function, which is called from the main thread only. - model_object.invalidate_bounding_box(); - // Synchronize the content of instances. - auto new_instance = model_object_new.instances.begin(); - for (auto old_instance = model_object.instances.begin(); old_instance != model_object.instances.end(); ++ old_instance, ++ new_instance) { - (*old_instance)->set_transformation((*new_instance)->get_transformation()); - (*old_instance)->print_volume_state = (*new_instance)->print_volume_state; - (*old_instance)->printable = (*new_instance)->printable; - } - } - } - } - - // 4) Generate PrintObjects from ModelObjects and their instances. - { - PrintObjectPtrs print_objects_new; - print_objects_new.reserve(std::max(m_objects.size(), m_model.objects.size())); - bool new_objects = false; - // Walk over all new model objects and check, whether there are matching PrintObjects. - for (ModelObject *model_object : m_model.objects) { - ModelObjectStatus &model_object_status = const_cast(model_object_status_db.reuse(*model_object)); - model_object_status.print_instances = print_objects_from_model_object(*model_object); - std::vector old; - old.reserve(print_object_status_db.count(*model_object)); - for (const PrintObjectStatus &print_object_status : print_object_status_db.get_range(*model_object)) - if (print_object_status.status != PrintObjectStatus::Deleted) - old.emplace_back(&print_object_status); - // Generate a list of trafos and XY offsets for instances of a ModelObject - // Producing the config for PrintObject on demand, caching it at print_object_last. - const PrintObject *print_object_last = nullptr; - auto print_object_apply_config = [this, &print_object_last, model_object, num_extruders](PrintObject *print_object) { - print_object->config_apply(print_object_last ? - print_object_last->config() : - PrintObject::object_config_from_model_object(m_default_object_config, *model_object, num_extruders)); - print_object_last = print_object; - }; - if (old.empty()) { - // Simple case, just generate new instances. - for (PrintObjectTrafoAndInstances &print_instances : model_object_status.print_instances) { - PrintObject *print_object = new PrintObject(this, model_object, print_instances.trafo, std::move(print_instances.instances)); - print_object_apply_config(print_object); - print_objects_new.emplace_back(print_object); - // print_object_status.emplace(PrintObjectStatus(print_object, PrintObjectStatus::New)); - new_objects = true; - } - continue; - } - // Complex case, try to merge the two lists. - // Sort the old lexicographically by their trafos. - std::sort(old.begin(), old.end(), [](const PrintObjectStatus *lhs, const PrintObjectStatus *rhs){ return transform3d_lower(lhs->trafo, rhs->trafo); }); - // Merge the old / new lists. - auto it_old = old.begin(); - for (PrintObjectTrafoAndInstances &new_instances : model_object_status.print_instances) { - for (; it_old != old.end() && transform3d_lower((*it_old)->trafo, new_instances.trafo); ++ it_old); - if (it_old == old.end() || ! transform3d_equal((*it_old)->trafo, new_instances.trafo)) { - // This is a new instance (or a set of instances with the same trafo). Just add it. - PrintObject *print_object = new PrintObject(this, model_object, new_instances.trafo, std::move(new_instances.instances)); - print_object_apply_config(print_object); - print_objects_new.emplace_back(print_object); - // print_object_status.emplace(PrintObjectStatus(print_object, PrintObjectStatus::New)); - new_objects = true; - if (it_old != old.end()) - const_cast(*it_old)->status = PrintObjectStatus::Deleted; - } else { - // The PrintObject already exists and the copies differ. - PrintBase::ApplyStatus status = (*it_old)->print_object->set_instances(std::move(new_instances.instances)); - if (status != PrintBase::APPLY_STATUS_UNCHANGED) - update_apply_status(status == PrintBase::APPLY_STATUS_INVALIDATED); - print_objects_new.emplace_back((*it_old)->print_object); - const_cast(*it_old)->status = PrintObjectStatus::Reused; - } - } - } - if (m_objects != print_objects_new) { - this->call_cancel_callback(); - update_apply_status(this->invalidate_all_steps()); - m_objects = print_objects_new; - // Delete the PrintObjects marked as Unknown or Deleted. - bool deleted_objects = false; - for (const PrintObjectStatus &pos : print_object_status_db) - if (pos.status == PrintObjectStatus::Unknown || pos.status == PrintObjectStatus::Deleted) { - update_apply_status(pos.print_object->invalidate_all_steps()); - delete pos.print_object; - deleted_objects = true; - } - if (new_objects || deleted_objects) - update_apply_status(this->invalidate_steps({ psSkirtBrim, psWipeTower, psGCodeExport })); - if (new_objects) - update_apply_status(false); - print_regions_reshuffled = true; - } - print_object_status_db.clear(); - } - - // All regions now have distinct settings. - // Check whether applying the new region config defaults we would get different regions, - // update regions or create regions from scratch. - for (auto it_print_object = m_objects.begin(); it_print_object != m_objects.end();) { - // Find the range of PrintObjects sharing the same associated ModelObject. - auto it_print_object_end = it_print_object; - PrintObject &print_object = *(*it_print_object); - const ModelObject &model_object = *print_object.model_object(); - ModelObjectStatus &model_object_status = const_cast(model_object_status_db.reuse(model_object)); - PrintObjectRegions *print_object_regions = model_object_status.print_object_regions; - for (++ it_print_object_end; it_print_object_end != m_objects.end() && (*it_print_object)->model_object() == (*it_print_object_end)->model_object(); ++ it_print_object_end) - assert((*it_print_object_end)->m_shared_regions == nullptr || (*it_print_object_end)->m_shared_regions == print_object_regions); - if (print_object_regions == nullptr) { - print_object_regions = new PrintObjectRegions{}; - model_object_status.print_object_regions = print_object_regions; - print_object_regions->ref_cnt_inc(); - } - std::vector painting_extruders; - if (const auto &volumes = print_object.model_object()->volumes; - num_extruders > 1 && - std::find_if(volumes.begin(), volumes.end(), [](const ModelVolume *v) { return ! v->mmu_segmentation_facets.empty(); }) != volumes.end()) { - //FIXME be more specific! Don't enumerate extruders that are not used for painting! - painting_extruders.assign(num_extruders, 0); - std::iota(painting_extruders.begin(), painting_extruders.end(), 1); - } - if (model_object_status.print_object_regions_status == ModelObjectStatus::PrintObjectRegionsStatus::Valid) { - // Verify that the trafo for regions & volume bounding boxes thus for regions is still applicable. - auto invalidate = [it_print_object, it_print_object_end, update_apply_status]() { - for (auto it = it_print_object; it != it_print_object_end; ++ it) - if ((*it)->m_shared_regions != nullptr) - update_apply_status((*it)->invalidate_all_steps()); - }; - if (print_object_regions && ! trafos_differ_in_rotation_by_z_and_mirroring_by_xy_only(print_object_regions->trafo_bboxes, model_object_status.print_instances.front().trafo)) { - invalidate(); - print_object_regions->clear(); - model_object_status.print_object_regions_status = ModelObjectStatus::PrintObjectRegionsStatus::Invalid; - print_regions_reshuffled = true; - } else if (print_object_regions && - verify_update_print_object_regions( - print_object.model_object()->volumes, - m_default_region_config, - num_extruders, - painting_extruders, - *print_object_regions, - [it_print_object, it_print_object_end, &update_apply_status](const PrintRegionConfig &old_config, const PrintRegionConfig &new_config, const t_config_option_keys &diff_keys) { - for (auto it = it_print_object; it != it_print_object_end; ++it) - if ((*it)->m_shared_regions != nullptr) - update_apply_status((*it)->invalidate_state_by_config_options(old_config, new_config, diff_keys)); - })) { - // Regions are valid, just keep them. - } else { - // Regions were reshuffled. - invalidate(); - // At least reuse layer ranges and bounding boxes of ModelVolumes. - model_object_status.print_object_regions_status = ModelObjectStatus::PrintObjectRegionsStatus::PartiallyValid; - print_regions_reshuffled = true; - } - } - if (print_object_regions == nullptr || model_object_status.print_object_regions_status != ModelObjectStatus::PrintObjectRegionsStatus::Valid) { - // Layer ranges with their associated configurations. Remove overlaps between the ranges - // and create the regions from scratch. - print_object_regions = generate_print_object_regions( - print_object_regions, - print_object.model_object()->volumes, - LayerRanges(print_object.model_object()->layer_config_ranges), - m_default_region_config, - model_object_status.print_instances.front().trafo, - num_extruders, - print_object.is_mm_painted() ? 0.f : float(print_object.config().xy_size_compensation.value), - painting_extruders); - } - for (auto it = it_print_object; it != it_print_object_end; ++it) - if ((*it)->m_shared_regions) { - assert((*it)->m_shared_regions == print_object_regions); - } else { - (*it)->m_shared_regions = print_object_regions; - print_object_regions->ref_cnt_inc(); - } - it_print_object = it_print_object_end; - } - - if (print_regions_reshuffled) { - // Update Print::m_print_regions from objects. - struct cmp { bool operator() (const PrintRegion *l, const PrintRegion *r) const { return l->config_hash() == r->config_hash() && l->config() == r->config(); } }; - std::set region_set; - m_print_regions.clear(); - PrintObjectRegions *print_object_regions = nullptr; - for (PrintObject *print_object : m_objects) - if (print_object_regions != print_object->m_shared_regions) { - print_object_regions = print_object->m_shared_regions; - for (std::unique_ptr &print_region : print_object_regions->all_regions) - if (auto it = region_set.find(print_region.get()); it == region_set.end()) { - int print_region_id = int(m_print_regions.size()); - m_print_regions.emplace_back(print_region.get()); - print_region->m_print_region_id = print_region_id; - } else { - print_region->m_print_region_id = (*it)->print_region_id(); - } - } - } - - // Update SlicingParameters for each object where the SlicingParameters is not valid. - // If it is not valid, then it is ensured that PrintObject.m_slicing_params is not in use - // (posSlicing and posSupportMaterial was invalidated). - for (PrintObject *object : m_objects) - object->update_slicing_parameters(); - -#ifdef _DEBUG - check_model_ids_equal(m_model, model); -#endif /* _DEBUG */ - - return static_cast(apply_status); -} - -} // namespace Slic3r +#include "Model.hpp" +#include "Print.hpp" + +#include + +namespace Slic3r { + +// Add or remove support modifier ModelVolumes from model_object_dst to match the ModelVolumes of model_object_new +// in the exact order and with the same IDs. +// It is expected, that the model_object_dst already contains the non-support volumes of model_object_new in the correct order. +// Friend to ModelVolume to allow copying. +// static is not accepted by gcc if declared as a friend of ModelObject. +/* static */ void model_volume_list_update_supports(ModelObject &model_object_dst, const ModelObject &model_object_new) +{ + typedef std::pair ModelVolumeWithStatus; + std::vector old_volumes; + old_volumes.reserve(model_object_dst.volumes.size()); + for (const ModelVolume *model_volume : model_object_dst.volumes) + old_volumes.emplace_back(ModelVolumeWithStatus(model_volume, false)); + auto model_volume_lower = [](const ModelVolumeWithStatus &mv1, const ModelVolumeWithStatus &mv2){ return mv1.first->id() < mv2.first->id(); }; + auto model_volume_equal = [](const ModelVolumeWithStatus &mv1, const ModelVolumeWithStatus &mv2){ return mv1.first->id() == mv2.first->id(); }; + std::sort(old_volumes.begin(), old_volumes.end(), model_volume_lower); + model_object_dst.volumes.clear(); + model_object_dst.volumes.reserve(model_object_new.volumes.size()); + for (const ModelVolume *model_volume_src : model_object_new.volumes) { + ModelVolumeWithStatus key(model_volume_src, false); + auto it = std::lower_bound(old_volumes.begin(), old_volumes.end(), key, model_volume_lower); + if (it != old_volumes.end() && model_volume_equal(*it, key)) { + // The volume was found in the old list. Just copy it. + assert(! it->second); // not consumed yet + it->second = true; + ModelVolume *model_volume_dst = const_cast(it->first); + // For support modifiers, the type may have been switched from blocker to enforcer and vice versa. + assert((model_volume_dst->is_support_modifier() && model_volume_src->is_support_modifier()) || model_volume_dst->type() == model_volume_src->type()); + model_object_dst.volumes.emplace_back(model_volume_dst); + if (model_volume_dst->is_support_modifier()) { + // For support modifiers, the type may have been switched from blocker to enforcer and vice versa. + model_volume_dst->set_type(model_volume_src->type()); + model_volume_dst->set_transformation(model_volume_src->get_transformation()); + } + assert(model_volume_dst->get_matrix().isApprox(model_volume_src->get_matrix())); + } else { + // The volume was not found in the old list. Create a new copy. + assert(model_volume_src->is_support_modifier()); + model_object_dst.volumes.emplace_back(new ModelVolume(*model_volume_src)); + model_object_dst.volumes.back()->set_model_object(&model_object_dst); + } + } + // Release the non-consumed old volumes (those were deleted from the new list). + for (ModelVolumeWithStatus &mv_with_status : old_volumes) + if (! mv_with_status.second) + delete mv_with_status.first; +} + +static inline void model_volume_list_copy_configs(ModelObject &model_object_dst, const ModelObject &model_object_src, const ModelVolumeType type) +{ + size_t i_src, i_dst; + for (i_src = 0, i_dst = 0; i_src < model_object_src.volumes.size() && i_dst < model_object_dst.volumes.size();) { + const ModelVolume &mv_src = *model_object_src.volumes[i_src]; + ModelVolume &mv_dst = *model_object_dst.volumes[i_dst]; + if (mv_src.type() != type) { + ++ i_src; + continue; + } + if (mv_dst.type() != type) { + ++ i_dst; + continue; + } + assert(mv_src.id() == mv_dst.id()); + // Copy the ModelVolume data. + mv_dst.name = mv_src.name; + mv_dst.config.assign_config(mv_src.config); + assert(mv_dst.supported_facets.id() == mv_src.supported_facets.id()); + mv_dst.supported_facets.assign(mv_src.supported_facets); + assert(mv_dst.seam_facets.id() == mv_src.seam_facets.id()); + mv_dst.seam_facets.assign(mv_src.seam_facets); + assert(mv_dst.mmu_segmentation_facets.id() == mv_src.mmu_segmentation_facets.id()); + mv_dst.mmu_segmentation_facets.assign(mv_src.mmu_segmentation_facets); + //FIXME what to do with the materials? + // mv_dst.m_material_id = mv_src.m_material_id; + ++ i_src; + ++ i_dst; + } +} + +static inline void layer_height_ranges_copy_configs(t_layer_config_ranges &lr_dst, const t_layer_config_ranges &lr_src) +{ + assert(lr_dst.size() == lr_src.size()); + auto it_src = lr_src.cbegin(); + for (auto &kvp_dst : lr_dst) { + const auto &kvp_src = *it_src ++; + assert(std::abs(kvp_dst.first.first - kvp_src.first.first ) <= EPSILON); + assert(std::abs(kvp_dst.first.second - kvp_src.first.second) <= EPSILON); + // Layer heights are allowed do differ in case the layer height table is being overriden by the smooth profile. + // assert(std::abs(kvp_dst.second.option("layer_height")->getFloat() - kvp_src.second.option("layer_height")->getFloat()) <= EPSILON); + kvp_dst.second = kvp_src.second; + } +} + +static inline bool transform3d_lower(const Transform3d &lhs, const Transform3d &rhs) +{ + typedef Transform3d::Scalar T; + const T *lv = lhs.data(); + const T *rv = rhs.data(); + for (size_t i = 0; i < 16; ++ i, ++ lv, ++ rv) { + if (*lv < *rv) + return true; + else if (*lv > *rv) + return false; + } + return false; +} + +static inline bool transform3d_equal(const Transform3d &lhs, const Transform3d &rhs) +{ + typedef Transform3d::Scalar T; + const T *lv = lhs.data(); + const T *rv = rhs.data(); + for (size_t i = 0; i < 16; ++ i, ++ lv, ++ rv) + if (*lv != *rv) + return false; + return true; +} + +struct PrintObjectTrafoAndInstances +{ + Transform3d trafo; + PrintInstances instances; + bool operator<(const PrintObjectTrafoAndInstances &rhs) const { return transform3d_lower(this->trafo, rhs.trafo); } +}; + +// Generate a list of trafos and XY offsets for instances of a ModelObject +static std::vector print_objects_from_model_object(const ModelObject &model_object) +{ + std::set trafos; + PrintObjectTrafoAndInstances trafo; + for (ModelInstance *model_instance : model_object.instances) + if (model_instance->is_printable()) { + trafo.trafo = model_instance->get_matrix(); + auto shift = Point::new_scale(trafo.trafo.data()[12], trafo.trafo.data()[13]); + // Reset the XY axes of the transformation. + trafo.trafo.data()[12] = 0; + trafo.trafo.data()[13] = 0; + // Search or insert a trafo. + auto it = trafos.emplace(trafo).first; + const_cast(*it).instances.emplace_back(PrintInstance{ nullptr, model_instance, shift }); + } + return std::vector(trafos.begin(), trafos.end()); +} + +// Compare just the layer ranges and their layer heights, not the associated configs. +// Ignore the layer heights if check_layer_heights is false. +static bool layer_height_ranges_equal(const t_layer_config_ranges &lr1, const t_layer_config_ranges &lr2, bool check_layer_height) +{ + if (lr1.size() != lr2.size()) + return false; + auto it2 = lr2.begin(); + for (const auto &kvp1 : lr1) { + const auto &kvp2 = *it2 ++; + if (std::abs(kvp1.first.first - kvp2.first.first ) > EPSILON || + std::abs(kvp1.first.second - kvp2.first.second) > EPSILON || + (check_layer_height && std::abs(kvp1.second.option("layer_height")->getFloat() - kvp2.second.option("layer_height")->getFloat()) > EPSILON)) + return false; + } + return true; +} + +// Returns true if va == vb when all CustomGCode items that are not ToolChangeCode are ignored. +static bool custom_per_printz_gcodes_tool_changes_differ(const std::vector &va, const std::vector &vb) +{ + auto it_a = va.begin(); + auto it_b = vb.begin(); + while (it_a != va.end() || it_b != vb.end()) { + if (it_a != va.end() && it_a->type != CustomGCode::ToolChange) { + // Skip any CustomGCode items, which are not tool changes. + ++ it_a; + continue; + } + if (it_b != vb.end() && it_b->type != CustomGCode::ToolChange) { + // Skip any CustomGCode items, which are not tool changes. + ++ it_b; + continue; + } + if (it_a == va.end() || it_b == vb.end()) + // va or vb contains more Tool Changes than the other. + return true; + assert(it_a->type == CustomGCode::ToolChange); + assert(it_b->type == CustomGCode::ToolChange); + if (*it_a != *it_b) + // The two Tool Changes differ. + return true; + ++ it_a; + ++ it_b; + } + // There is no change in custom Tool Changes. + return false; +} + +// Collect changes to print config, account for overrides of extruder retract values by filament presets. +static t_config_option_keys print_config_diffs( + const PrintConfig ¤t_config, + const DynamicPrintConfig &new_full_config, + DynamicPrintConfig &filament_overrides) +{ + const std::vector &extruder_retract_keys = print_config_def.extruder_retract_keys(); + const std::string filament_prefix = "filament_"; + t_config_option_keys print_diff; + for (const t_config_option_key &opt_key : current_config.keys()) { + const ConfigOption *opt_old = current_config.option(opt_key); + assert(opt_old != nullptr); + const ConfigOption *opt_new = new_full_config.option(opt_key); + // assert(opt_new != nullptr); + if (opt_new == nullptr) + //FIXME This may happen when executing some test cases. + continue; + const ConfigOption *opt_new_filament = std::binary_search(extruder_retract_keys.begin(), extruder_retract_keys.end(), opt_key) ? new_full_config.option(filament_prefix + opt_key) : nullptr; + if (opt_new_filament != nullptr && ! opt_new_filament->is_nil()) { + // An extruder retract override is available at some of the filament presets. + bool overriden = opt_new->overriden_by(opt_new_filament); + if (overriden || *opt_old != *opt_new) { + auto opt_copy = opt_new->clone(); + opt_copy->apply_override(opt_new_filament); + bool changed = *opt_old != *opt_copy; + if (changed) + print_diff.emplace_back(opt_key); + if (changed || overriden) { + // filament_overrides will be applied to the placeholder parser, which layers these parameters over full_print_config. + filament_overrides.set_key_value(opt_key, opt_copy); + } else + delete opt_copy; + } + } else if (*opt_new != *opt_old) + print_diff.emplace_back(opt_key); + } + + return print_diff; +} + +// Prepare for storing of the full print config into new_full_config to be exported into the G-code and to be used by the PlaceholderParser. +static t_config_option_keys full_print_config_diffs(const DynamicPrintConfig ¤t_full_config, const DynamicPrintConfig &new_full_config) +{ + t_config_option_keys full_config_diff; + for (const t_config_option_key &opt_key : new_full_config.keys()) { + const ConfigOption *opt_old = current_full_config.option(opt_key); + const ConfigOption *opt_new = new_full_config.option(opt_key); + if (opt_old == nullptr || *opt_new != *opt_old) + full_config_diff.emplace_back(opt_key); + } + return full_config_diff; +} + +// Repository for solving partial overlaps of ModelObject::layer_config_ranges. +// Here the const DynamicPrintConfig* point to the config in ModelObject::layer_config_ranges. +class LayerRanges +{ +public: + struct LayerRange { + t_layer_height_range layer_height_range; + // Config is owned by the associated ModelObject. + const DynamicPrintConfig* config { nullptr }; + + bool operator<(const LayerRange &rhs) const throw() { return this->layer_height_range < rhs.layer_height_range; } + }; + + LayerRanges() = default; + LayerRanges(const t_layer_config_ranges &in) { this->assign(in); } + + // Convert input config ranges into continuous non-overlapping sorted vector of intervals and their configs. + void assign(const t_layer_config_ranges &in) { + m_ranges.clear(); + m_ranges.reserve(in.size()); + // Input ranges are sorted lexicographically. First range trims the other ranges. + coordf_t last_z = 0; + for (const std::pair &range : in) + if (range.first.second > last_z) { + coordf_t min_z = std::max(range.first.first, 0.); + if (min_z > last_z + EPSILON) { + m_ranges.push_back({ t_layer_height_range(last_z, min_z) }); + last_z = min_z; + } + if (range.first.second > last_z + EPSILON) { + const DynamicPrintConfig *cfg = &range.second.get(); + m_ranges.push_back({ t_layer_height_range(last_z, range.first.second), cfg }); + last_z = range.first.second; + } + } + if (m_ranges.empty()) + m_ranges.push_back({ t_layer_height_range(0, DBL_MAX) }); + else if (m_ranges.back().config == nullptr) + m_ranges.back().layer_height_range.second = DBL_MAX; + else + m_ranges.push_back({ t_layer_height_range(m_ranges.back().layer_height_range.second, DBL_MAX) }); + } + + const DynamicPrintConfig* config(const t_layer_height_range &range) const { + auto it = std::lower_bound(m_ranges.begin(), m_ranges.end(), LayerRange{ { range.first - EPSILON, range.second - EPSILON } }); + // #ys_FIXME_COLOR + // assert(it != m_ranges.end()); + // assert(it == m_ranges.end() || std::abs(it->first.first - range.first ) < EPSILON); + // assert(it == m_ranges.end() || std::abs(it->first.second - range.second) < EPSILON); + if (it == m_ranges.end() || + std::abs(it->layer_height_range.first - range.first) > EPSILON || + std::abs(it->layer_height_range.second - range.second) > EPSILON ) + return nullptr; // desired range doesn't found + return it == m_ranges.end() ? nullptr : it->config; + } + + std::vector::const_iterator begin() const { return m_ranges.cbegin(); } + std::vector::const_iterator end () const { return m_ranges.cend(); } + size_t size () const { return m_ranges.size(); } + +private: + // Layer ranges with their config overrides and list of volumes with their snug bounding boxes in a given layer range. + std::vector m_ranges; +}; + +// To track Model / ModelObject updates between the front end and back end, including layer height ranges, their configs, +// and snug bounding boxes of ModelVolumes. +struct ModelObjectStatus { + enum Status { + Unknown, + Old, + New, + Moved, + Deleted, + }; + + enum class PrintObjectRegionsStatus { + Invalid, + Valid, + PartiallyValid, + }; + + ModelObjectStatus(ObjectID id, Status status = Unknown) : id(id), status(status) {} + ~ModelObjectStatus() { if (print_object_regions) print_object_regions->ref_cnt_dec(); } + + // Key of the set. + ObjectID id; + // Status of this ModelObject with id on apply(). + Status status; + // PrintObjects to be generated for this ModelObject including their base transformation. + std::vector print_instances; + // Regions shared by the associated PrintObjects. + PrintObjectRegions *print_object_regions { nullptr }; + // Status of the above. + PrintObjectRegionsStatus print_object_regions_status { PrintObjectRegionsStatus::Invalid }; + + // Search by id. + bool operator<(const ModelObjectStatus &rhs) const { return id < rhs.id; } +}; + +struct ModelObjectStatusDB +{ + void add(const ModelObject &model_object, const ModelObjectStatus::Status status) { + assert(db.find(ModelObjectStatus(model_object.id())) == db.end()); + db.emplace(model_object.id(), status); + } + + bool add_if_new(const ModelObject &model_object, const ModelObjectStatus::Status status) { + auto it = db.find(ModelObjectStatus(model_object.id())); + if (it == db.end()) { + db.emplace_hint(it, model_object.id(), status); + return true; + } + return false; + } + + const ModelObjectStatus& get(const ModelObject &model_object) { + auto it = db.find(ModelObjectStatus(model_object.id())); + assert(it != db.end()); + return *it; + } + + const ModelObjectStatus& reuse(const ModelObject &model_object) { + const ModelObjectStatus &result = this->get(model_object); + assert(result.status != ModelObjectStatus::Deleted); + return result; + } + + std::set db; +}; + +struct PrintObjectStatus { + enum Status { + Unknown, + Deleted, + Reused, + New + }; + + PrintObjectStatus(PrintObject *print_object, Status status = Unknown) : + id(print_object->model_object()->id()), + print_object(print_object), + trafo(print_object->trafo()), + status(status) {} + PrintObjectStatus(ObjectID id) : id(id), print_object(nullptr), trafo(Transform3d::Identity()), status(Unknown) {} + + // ID of the ModelObject & PrintObject + ObjectID id; + // Pointer to the old PrintObject + PrintObject *print_object; + // Trafo generated with model_object->world_matrix(true) + Transform3d trafo; + Status status; + + // Search by id. + bool operator<(const PrintObjectStatus &rhs) const { return id < rhs.id; } +}; + +class PrintObjectStatusDB { +public: + using iterator = std::multiset::iterator; + using const_iterator = std::multiset::const_iterator; + + PrintObjectStatusDB(const PrintObjectPtrs &print_objects) { + for (PrintObject *print_object : print_objects) + m_db.emplace(PrintObjectStatus(print_object)); + } + + struct iterator_range : std::pair + { + using std::pair::pair; + iterator_range(const std::pair in) : std::pair(in) {} + + const_iterator begin() throw() { return this->first; } + const_iterator end() throw() { return this->second; } + }; + + iterator_range get_range(const ModelObject &model_object) const { + return m_db.equal_range(PrintObjectStatus(model_object.id())); + } + + iterator_range get_range(const ModelObjectStatus &model_object_status) const { + return m_db.equal_range(PrintObjectStatus(model_object_status.id)); + } + + size_t count(const ModelObject &model_object) { + return m_db.count(PrintObjectStatus(model_object.id())); + } + + std::multiset::iterator begin() { return m_db.begin(); } + std::multiset::iterator end() { return m_db.end(); } + + void clear() { + m_db.clear(); + } + +private: + std::multiset m_db; +}; + +static inline bool model_volume_solid_or_modifier(const ModelVolume &mv) +{ + ModelVolumeType type = mv.type(); + return type == ModelVolumeType::MODEL_PART || type == ModelVolumeType::NEGATIVE_VOLUME || type == ModelVolumeType::PARAMETER_MODIFIER; +} + +static inline Transform3f trafo_for_bbox(const Transform3d &object_trafo, const Transform3d &volume_trafo) +{ + Transform3d m = object_trafo * volume_trafo; + m.translation().x() = 0.; + m.translation().y() = 0.; + return m.cast(); +} + +static inline bool trafos_differ_in_rotation_by_z_and_mirroring_by_xy_only(const Transform3d &t1, const Transform3d &t2) +{ + if (std::abs(t1.translation().z() - t2.translation().z()) > EPSILON) + // One of the object is higher than the other above the build plate (or below the build plate). + return false; + Matrix3d m1 = t1.matrix().block<3, 3>(0, 0); + Matrix3d m2 = t2.matrix().block<3, 3>(0, 0); + Matrix3d m = m2.inverse() * m1; + Vec3d z = m.block<3, 1>(0, 2); + if (std::abs(z.x()) > EPSILON || std::abs(z.y()) > EPSILON || std::abs(z.z() - 1.) > EPSILON) + // Z direction or length changed. + return false; + // Z still points in the same direction and it has the same length. + Vec3d x = m.block<3, 1>(0, 0); + Vec3d y = m.block<3, 1>(0, 1); + if (std::abs(x.z()) > EPSILON || std::abs(y.z()) > EPSILON) + return false; + double lx2 = x.squaredNorm(); + double ly2 = y.squaredNorm(); + if (lx2 - 1. > EPSILON * EPSILON || ly2 - 1. > EPSILON * EPSILON) + return false; + // Verify whether the vectors x, y are still perpendicular. + double d = x.dot(y); + return std::abs(d * d) < EPSILON * lx2 * ly2; +} + +static PrintObjectRegions::BoundingBox transformed_its_bbox2d(const indexed_triangle_set &its, const Transform3f &m, float offset) +{ + assert(! its.indices.empty()); + + PrintObjectRegions::BoundingBox bbox(m * its.vertices[its.indices.front()(0)]); + for (const stl_triangle_vertex_indices &tri : its.indices) + for (int i = 0; i < 3; ++ i) + bbox.extend(m * its.vertices[tri(i)]); + bbox.min() -= Vec3f(offset, offset, float(EPSILON)); + bbox.max() += Vec3f(offset, offset, float(EPSILON)); + return bbox; +} + +static void transformed_its_bboxes_in_z_ranges( + const indexed_triangle_set &its, + const Transform3f &m, + const std::vector &z_ranges, + std::vector> &bboxes, + const float offset) +{ + bboxes.assign(z_ranges.size(), std::make_pair(PrintObjectRegions::BoundingBox(), false)); + for (const stl_triangle_vertex_indices &tri : its.indices) { + const Vec3f pts[3] = { m * its.vertices[tri(0)], m * its.vertices[tri(1)], m * its.vertices[tri(2)] }; + for (size_t irange = 0; irange < z_ranges.size(); ++ irange) { + const t_layer_height_range &z_range = z_ranges[irange]; + std::pair &bbox = bboxes[irange]; + auto bbox_extend = [&bbox](const Vec3f& p) { + if (bbox.second) { + bbox.first.extend(p); + } else { + bbox.first.min() = bbox.first.max() = p; + bbox.second = true; + } + }; + int iprev = 2; + for (int iedge = 0; iedge < 3; ++ iedge) { + const Vec3f *p1 = &pts[iprev]; + const Vec3f *p2 = &pts[iedge]; + // Sort the edge points by Z. + if (p1->z() > p2->z()) + std::swap(p1, p2); + if (p2->z() <= z_range.first || p1->z() >= z_range.second) { + // Out of this slab. + } else if (p1->z() < z_range.first) { + if (p1->z() > z_range.second) { + // Two intersections. + float zspan = p2->z() - p1->z(); + float t1 = (z_range.first - p1->z()) / zspan; + float t2 = (z_range.second - p1->z()) / zspan; + Vec2f p = to_2d(*p1); + Vec2f v(p2->x() - p1->x(), p2->y() - p1->y()); + bbox_extend(to_3d((p + v * t1).eval(), float(z_range.first))); + bbox_extend(to_3d((p + v * t2).eval(), float(z_range.second))); + } else { + // Single intersection with the lower limit. + float t = (z_range.first - p1->z()) / (p2->z() - p1->z()); + Vec2f v(p2->x() - p1->x(), p2->y() - p1->y()); + bbox_extend(to_3d((to_2d(*p1) + v * t).eval(), float(z_range.first))); + bbox_extend(*p2); + } + } else if (p2->z() > z_range.second) { + // Single intersection with the upper limit. + float t = (z_range.second - p1->z()) / (p2->z() - p1->z()); + Vec2f v(p2->x() - p1->x(), p2->y() - p1->y()); + bbox_extend(to_3d((to_2d(*p1) + v * t).eval(), float(z_range.second))); + bbox_extend(*p1); + } else { + // Both points are inside. + bbox_extend(*p1); + bbox_extend(*p2); + } + iprev = iedge; + } + } + } + + for (std::pair &bbox : bboxes) { + bbox.first.min() -= Vec3f(offset, offset, float(EPSILON)); + bbox.first.max() += Vec3f(offset, offset, float(EPSILON)); + } +} + +// Last PrintObject for this print_object_regions has been fully invalidated (deleted). +// Keep print_object_regions, but delete those volumes, which were either removed from new_volumes, or which rotated or scaled, so they need +// their bounding boxes to be recalculated. +void print_objects_regions_invalidate_keep_some_volumes(PrintObjectRegions &print_object_regions, ModelVolumePtrs old_volumes, ModelVolumePtrs new_volumes) +{ + print_object_regions.all_regions.clear(); + + model_volumes_sort_by_id(old_volumes); + model_volumes_sort_by_id(new_volumes); + + size_t i_cached_volume = 0; + size_t last_cached_volume = 0; + size_t i_old = 0; + for (size_t i_new = 0; i_new < new_volumes.size(); ++ i_new) + if (model_volume_solid_or_modifier(*new_volumes[i_new])) { + for (; i_old < old_volumes.size(); ++ i_old) + if (old_volumes[i_old]->id() >= new_volumes[i_new]->id()) + break; + if (i_old != old_volumes.size() && old_volumes[i_old]->id() == new_volumes[i_new]->id()) { + if (old_volumes[i_old]->get_matrix().isApprox(new_volumes[i_new]->get_matrix())) { + // Reuse the volume. + for (; print_object_regions.cached_volume_ids[i_cached_volume] < old_volumes[i_old]->id(); ++ i_cached_volume) + assert(i_cached_volume < print_object_regions.cached_volume_ids.size()); + assert(i_cached_volume < print_object_regions.cached_volume_ids.size() && print_object_regions.cached_volume_ids[i_cached_volume] == old_volumes[i_old]->id()); + print_object_regions.cached_volume_ids[last_cached_volume ++] = print_object_regions.cached_volume_ids[i_cached_volume ++]; + } else { + // Don't reuse the volume. + } + } + } + print_object_regions.cached_volume_ids.erase(print_object_regions.cached_volume_ids.begin() + last_cached_volume, print_object_regions.cached_volume_ids.end()); +} + +// Find a bounding box of a volume's part intersecting layer_range. Such a bounding box will likely be smaller in XY than the full bounding box, +// thus it will intersect with lower number of other volumes. +const PrintObjectRegions::BoundingBox* find_volume_extents(const PrintObjectRegions::LayerRangeRegions &layer_range, const ModelVolume &volume) +{ + auto it = lower_bound_by_predicate(layer_range.volumes.begin(), layer_range.volumes.end(), [&volume](const PrintObjectRegions::VolumeExtents &l){ return l.volume_id < volume.id(); }); + return it != layer_range.volumes.end() && it->volume_id == volume.id() ? &it->bbox : nullptr; +} + +// Find a bounding box of a topmost printable volume referenced by this modifier given this_region_id. +PrintObjectRegions::BoundingBox find_modifier_volume_extents(const PrintObjectRegions::LayerRangeRegions &layer_range, const int this_region_id) +{ + // Find the top-most printable volume of this modifier, or the printable volume itself. + const PrintObjectRegions::VolumeRegion &this_region = layer_range.volume_regions[this_region_id]; + const PrintObjectRegions::BoundingBox *this_extents = find_volume_extents(layer_range, *this_region.model_volume); + assert(this_extents); + PrintObjectRegions::BoundingBox out { *this_extents }; + if (! this_region.model_volume->is_model_part()) + for (int parent_region_id = this_region.parent;;) { + assert(parent_region_id >= 0); + const PrintObjectRegions::VolumeRegion &parent_region = layer_range.volume_regions[parent_region_id]; + const PrintObjectRegions::BoundingBox *parent_extents = find_volume_extents(layer_range, *parent_region.model_volume); + assert(parent_extents); + out.clamp(*parent_extents); + assert(! out.isEmpty()); + if (parent_region.model_volume->is_model_part()) + break; + parent_region_id = parent_region.parent; + } + return out; +} + +PrintRegionConfig region_config_from_model_volume(const PrintRegionConfig &default_or_parent_region_config, const DynamicPrintConfig *layer_range_config, const ModelVolume &volume, size_t num_extruders); + +void print_region_ref_inc(PrintRegion &r) { ++ r.m_ref_cnt; } +void print_region_ref_reset(PrintRegion &r) { r.m_ref_cnt = 0; } +int print_region_ref_cnt(const PrintRegion &r) { return r.m_ref_cnt; } + +// Verify whether the PrintRegions of a PrintObject are still valid, possibly after updating the region configs. +// Before region configs are updated, callback_invalidate() is called to possibly stop background processing. +// Returns false if this object needs to be resliced because regions were merged or split. +bool verify_update_print_object_regions( + ModelVolumePtrs model_volumes, + const PrintRegionConfig &default_region_config, + size_t num_extruders, + const std::vector &painting_extruders, + PrintObjectRegions &print_object_regions, + const std::function &callback_invalidate) +{ + // Sort by ModelVolume ID. + model_volumes_sort_by_id(model_volumes); + + for (std::unique_ptr ®ion : print_object_regions.all_regions) + print_region_ref_reset(*region); + + // Verify and / or update PrintRegions produced by ModelVolumes, layer range modifiers, modifier volumes. + for (PrintObjectRegions::LayerRangeRegions &layer_range : print_object_regions.layer_ranges) { + // Each modifier ModelVolume intersecting this layer_range shall be referenced here at least once if it intersects some + // printable ModelVolume at this layer_range even if it does not modify its overlapping printable ModelVolume configuration yet. + // VolumeRegions reference ModelVolumes in layer_range.volume_regions the order they are stored in ModelObject volumes. + // Remember whether a given modifier ModelVolume was visited already. + auto it_model_volume_modifier_last = model_volumes.end(); + for (PrintObjectRegions::VolumeRegion ®ion : layer_range.volume_regions) + if (region.model_volume->is_model_part() || region.model_volume->is_modifier()) { + auto it_model_volume = lower_bound_by_predicate(model_volumes.begin(), model_volumes.end(), [®ion](const ModelVolume *l){ return l->id() < region.model_volume->id(); }); + assert(it_model_volume != model_volumes.end() && (*it_model_volume)->id() == region.model_volume->id()); + if (region.model_volume->is_modifier() && it_model_volume != it_model_volume_modifier_last) { + // A modifier ModelVolume is visited for the first time. + // A visited modifier may not have had parent volume_regions created overlapping with some model parts or modifiers, + // if the visited modifier did not modify their properties. Now the visited modifier's configuration may have changed, + // which may require new regions to be created. + it_model_volume_modifier_last = it_model_volume; + int next_region_id = int(®ion - layer_range.volume_regions.data()); + const PrintObjectRegions::BoundingBox *bbox = find_volume_extents(layer_range, *region.model_volume); + assert(bbox); + for (int parent_region_id = next_region_id - 1; parent_region_id >= 0; -- parent_region_id) { + const PrintObjectRegions::VolumeRegion &parent_region = layer_range.volume_regions[parent_region_id]; + assert(parent_region.model_volume != region.model_volume); + if (parent_region.model_volume->is_model_part() || parent_region.model_volume->is_modifier()) { + // volume_regions are produced in decreasing order of parent volume_regions ids. + // Some regions may not have been generated the last time by generate_print_object_regions(). + assert(next_region_id == int(layer_range.volume_regions.size()) || + layer_range.volume_regions[next_region_id].model_volume != region.model_volume || + layer_range.volume_regions[next_region_id].parent <= parent_region_id); + if (next_region_id < int(layer_range.volume_regions.size()) && + layer_range.volume_regions[next_region_id].model_volume == region.model_volume && + layer_range.volume_regions[next_region_id].parent == parent_region_id) { + // A parent region is already overridden. + ++ next_region_id; + } else if (PrintObjectRegions::BoundingBox parent_bbox = find_modifier_volume_extents(layer_range, parent_region_id); parent_bbox.intersects(*bbox)) + // Such parent region does not exist. If it is needed, then we need to reslice. + // Only create new region for a modifier, which actually modifies config of it's parent. + if (PrintRegionConfig config = region_config_from_model_volume(parent_region.region->config(), nullptr, **it_model_volume, num_extruders); + config != parent_region.region->config()) + // This modifier newly overrides a region, which it did not before. We need to reslice. + return false; + } + } + } + PrintRegionConfig cfg = region.parent == -1 ? + region_config_from_model_volume(default_region_config, layer_range.config, **it_model_volume, num_extruders) : + region_config_from_model_volume(layer_range.volume_regions[region.parent].region->config(), nullptr, **it_model_volume, num_extruders); + if (cfg != region.region->config()) { + // Region configuration changed. + if (print_region_ref_cnt(*region.region) == 0) { + // Region is referenced for the first time. Just change its parameters. + // Stop the background process before assigning new configuration to the regions. + t_config_option_keys diff = region.region->config().diff(cfg); + callback_invalidate(region.region->config(), cfg, diff); + region.region->config_apply_only(cfg, diff, false); + } else { + // Region is referenced multiple times, thus the region is being split. We need to reslice. + return false; + } + } + print_region_ref_inc(*region.region); + } + } + + // Verify and / or update PrintRegions produced by color painting. + for (const PrintObjectRegions::LayerRangeRegions &layer_range : print_object_regions.layer_ranges) + for (const PrintObjectRegions::PaintedRegion ®ion : layer_range.painted_regions) { + const PrintObjectRegions::VolumeRegion &parent_region = layer_range.volume_regions[region.parent]; + PrintRegionConfig cfg = parent_region.region->config(); + cfg.perimeter_extruder.value = region.extruder_id; + cfg.solid_infill_extruder.value = region.extruder_id; + cfg.infill_extruder.value = region.extruder_id; + if (cfg != region.region->config()) { + // Region configuration changed. + if (print_region_ref_cnt(*region.region) == 0) { + // Region is referenced for the first time. Just change its parameters. + // Stop the background process before assigning new configuration to the regions. + t_config_option_keys diff = region.region->config().diff(cfg); + callback_invalidate(region.region->config(), cfg, diff); + region.region->config_apply_only(cfg, diff, false); + } else { + // Region is referenced multiple times, thus the region is being split. We need to reslice. + return false; + } + } + print_region_ref_inc(*region.region); + } + + // Lastly verify, whether some regions were not merged. + { + std::vector regions; + regions.reserve(print_object_regions.all_regions.size()); + for (std::unique_ptr ®ion : print_object_regions.all_regions) { + assert(print_region_ref_cnt(*region) > 0); + regions.emplace_back(&(*region.get())); + } + std::sort(regions.begin(), regions.end(), [](const PrintRegion *l, const PrintRegion *r){ return l->config_hash() < r->config_hash(); }); + for (size_t i = 0; i < regions.size(); ++ i) { + size_t hash = regions[i]->config_hash(); + size_t j = i; + for (++ j; j < regions.size() && regions[j]->config_hash() == hash; ++ j) + if (regions[i]->config() == regions[j]->config()) { + // Regions were merged. We need to reslice. + return false; + } + } + } + + return true; +} + +// Update caches of volume bounding boxes. +void update_volume_bboxes( + std::vector &layer_ranges, + std::vector &cached_volume_ids, + ModelVolumePtrs model_volumes, + const Transform3d &object_trafo, + const float offset) +{ + // output will be sorted by the order of model_volumes sorted by their ObjectIDs. + model_volumes_sort_by_id(model_volumes); + + if (layer_ranges.size() == 1) { + PrintObjectRegions::LayerRangeRegions &layer_range = layer_ranges.front(); + std::vector volumes_old(std::move(layer_range.volumes)); + layer_range.volumes.reserve(model_volumes.size()); + for (const ModelVolume *model_volume : model_volumes) + if (model_volume_solid_or_modifier(*model_volume)) { + if (std::binary_search(cached_volume_ids.begin(), cached_volume_ids.end(), model_volume->id())) { + auto it = lower_bound_by_predicate(volumes_old.begin(), volumes_old.end(), [model_volume](PrintObjectRegions::VolumeExtents &l) { return l.volume_id < model_volume->id(); }); + if (it != volumes_old.end() && it->volume_id == model_volume->id()) + layer_range.volumes.emplace_back(*it); + } else + layer_range.volumes.push_back({ model_volume->id(), + transformed_its_bbox2d(model_volume->mesh().its, trafo_for_bbox(object_trafo, model_volume->get_matrix()), offset) }); + } + } else { + std::vector> volumes_old; + if (cached_volume_ids.empty()) + for (PrintObjectRegions::LayerRangeRegions &layer_range : layer_ranges) + layer_range.volumes.clear(); + else { + volumes_old.reserve(layer_ranges.size()); + for (PrintObjectRegions::LayerRangeRegions &layer_range : layer_ranges) + volumes_old.emplace_back(std::move(layer_range.volumes)); + } + + std::vector> bboxes; + std::vector ranges; + ranges.reserve(layer_ranges.size()); + for (const PrintObjectRegions::LayerRangeRegions &layer_range : layer_ranges) { + t_layer_height_range r = layer_range.layer_height_range; + r.first -= EPSILON; + r.second += EPSILON; + ranges.emplace_back(r); + } + for (const ModelVolume *model_volume : model_volumes) + if (model_volume_solid_or_modifier(*model_volume)) { + if (std::binary_search(cached_volume_ids.begin(), cached_volume_ids.end(), model_volume->id())) { + for (PrintObjectRegions::LayerRangeRegions &layer_range : layer_ranges) { + const auto &vold = volumes_old[&layer_range - layer_ranges.data()]; + auto it = lower_bound_by_predicate(vold.begin(), vold.end(), [model_volume](const PrintObjectRegions::VolumeExtents &l) { return l.volume_id < model_volume->id(); }); + if (it != vold.end() && it->volume_id == model_volume->id()) + layer_range.volumes.emplace_back(*it); + } + } else { + transformed_its_bboxes_in_z_ranges(model_volume->mesh().its, trafo_for_bbox(object_trafo, model_volume->get_matrix()), ranges, bboxes, offset); + for (PrintObjectRegions::LayerRangeRegions &layer_range : layer_ranges) + if (auto &bbox = bboxes[&layer_range - layer_ranges.data()]; bbox.second) + layer_range.volumes.push_back({ model_volume->id(), bbox.first }); + } + } + } + + cached_volume_ids.clear(); + cached_volume_ids.reserve(model_volumes.size()); + for (const ModelVolume *v : model_volumes) + if (model_volume_solid_or_modifier(*v)) + cached_volume_ids.emplace_back(v->id()); +} + +// Either a fresh PrintObject, or PrintObject regions were invalidated (merged, split). +// Generate PrintRegions from scratch. +static PrintObjectRegions* generate_print_object_regions( + PrintObjectRegions *print_object_regions_old, + const ModelVolumePtrs &model_volumes, + const LayerRanges &model_layer_ranges, + const PrintRegionConfig &default_region_config, + const Transform3d &trafo, + size_t num_extruders, + const float xy_size_compensation, + const std::vector &painting_extruders) +{ + // Reuse the old object or generate a new one. + auto out = print_object_regions_old ? std::unique_ptr(print_object_regions_old) : std::make_unique(); + auto &all_regions = out->all_regions; + auto &layer_ranges_regions = out->layer_ranges; + + all_regions.clear(); + + bool reuse_old = print_object_regions_old && !print_object_regions_old->layer_ranges.empty(); + + if (reuse_old) { + // Reuse old bounding boxes of some ModelVolumes and their ranges. + // Verify that the old ranges match the new ranges. + assert(model_layer_ranges.size() == layer_ranges_regions.size()); + for (const auto &range : model_layer_ranges) { + PrintObjectRegions::LayerRangeRegions &r = layer_ranges_regions[&range - &*model_layer_ranges.begin()]; + assert(range.layer_height_range == r.layer_height_range); + // If model::assign_copy() is called, layer_ranges_regions is copied thus the pointers to configs are lost. + r.config = range.config; + r.volume_regions.clear(); + r.painted_regions.clear(); + } + } else { + out->trafo_bboxes = trafo; + layer_ranges_regions.reserve(model_layer_ranges.size()); + for (const auto &range : model_layer_ranges) + layer_ranges_regions.push_back({ range.layer_height_range, range.config }); + } + + const bool is_mm_painted = num_extruders > 1 && std::any_of(model_volumes.cbegin(), model_volumes.cend(), [](const ModelVolume *mv) { return mv->is_mm_painted(); }); + update_volume_bboxes(layer_ranges_regions, out->cached_volume_ids, model_volumes, out->trafo_bboxes, is_mm_painted ? 0.f : std::max(0.f, xy_size_compensation)); + + std::vector region_set; + auto get_create_region = [®ion_set, &all_regions](PrintRegionConfig &&config) -> PrintRegion* { + size_t hash = config.hash(); + auto it = Slic3r::lower_bound_by_predicate(region_set.begin(), region_set.end(), [&config, hash](const PrintRegion* l) { + return l->config_hash() < hash || (l->config_hash() == hash && l->config() < config); }); + if (it != region_set.end() && (*it)->config_hash() == hash && (*it)->config() == config) + return *it; + // Insert into a sorted array, it has O(n) complexity, but the calling algorithm has an O(n^2*log(n)) complexity anyways. + all_regions.emplace_back(std::make_unique(std::move(config), hash, int(all_regions.size()))); + PrintRegion *region = all_regions.back().get(); + region_set.emplace(it, region); + return region; + }; + + // Chain the regions in the order they are stored in the volumes list. + for (int volume_id = 0; volume_id < int(model_volumes.size()); ++ volume_id) { + const ModelVolume &volume = *model_volumes[volume_id]; + if (model_volume_solid_or_modifier(volume)) { + for (PrintObjectRegions::LayerRangeRegions &layer_range : layer_ranges_regions) + if (const PrintObjectRegions::BoundingBox *bbox = find_volume_extents(layer_range, volume); bbox) { + if (volume.is_model_part()) { + // Add a model volume, assign an existing region or generate a new one. + layer_range.volume_regions.push_back({ + &volume, -1, + get_create_region(region_config_from_model_volume(default_region_config, layer_range.config, volume, num_extruders)), + bbox + }); + } else if (volume.is_negative_volume()) { + // Add a negative (subtractor) volume. Such volume has neither region nor parent volume assigned. + layer_range.volume_regions.push_back({ &volume, -1, nullptr, bbox }); + } else { + assert(volume.is_modifier()); + // Modifiers may be chained one over the other. Check for overlap, merge DynamicPrintConfigs. + bool added = false; + int parent_model_part_id = -1; + for (int parent_region_id = int(layer_range.volume_regions.size()) - 1; parent_region_id >= 0; -- parent_region_id) { + const PrintObjectRegions::VolumeRegion &parent_region = layer_range.volume_regions[parent_region_id]; + const ModelVolume &parent_volume = *parent_region.model_volume; + if (parent_volume.is_model_part() || parent_volume.is_modifier()) + if (PrintObjectRegions::BoundingBox parent_bbox = find_modifier_volume_extents(layer_range, parent_region_id); parent_bbox.intersects(*bbox)) { + // Only create new region for a modifier, which actually modifies config of it's parent. + if (PrintRegionConfig config = region_config_from_model_volume(parent_region.region->config(), nullptr, volume, num_extruders); + config != parent_region.region->config()) { + added = true; + layer_range.volume_regions.push_back({ &volume, parent_region_id, get_create_region(std::move(config)), bbox }); + } else if (parent_model_part_id == -1 && parent_volume.is_model_part()) + parent_model_part_id = parent_region_id; + } + } + if (! added && parent_model_part_id >= 0) + // This modifier does not override any printable volume's configuration, however it may in the future. + // Store it so that verify_update_print_object_regions() will handle this modifier correctly if its configuration changes. + layer_range.volume_regions.push_back({ &volume, parent_model_part_id, layer_range.volume_regions[parent_model_part_id].region, bbox }); + } + } + } + } + + // Finally add painting regions. + for (PrintObjectRegions::LayerRangeRegions &layer_range : layer_ranges_regions) { + for (unsigned int painted_extruder_id : painting_extruders) + for (int parent_region_id = 0; parent_region_id < int(layer_range.volume_regions.size()); ++ parent_region_id) + if (const PrintObjectRegions::VolumeRegion &parent_region = layer_range.volume_regions[parent_region_id]; + parent_region.model_volume->is_model_part() || parent_region.model_volume->is_modifier()) { + PrintRegionConfig cfg = parent_region.region->config(); + cfg.perimeter_extruder.value = painted_extruder_id; + cfg.solid_infill_extruder.value = painted_extruder_id; + cfg.infill_extruder.value = painted_extruder_id; + layer_range.painted_regions.push_back({ painted_extruder_id, parent_region_id, get_create_region(std::move(cfg))}); + } + // Sort the regions by parent region::print_object_region_id() and extruder_id to help the slicing algorithm when applying MMU segmentation. + std::sort(layer_range.painted_regions.begin(), layer_range.painted_regions.end(), [&layer_range](auto &l, auto &r) { + int lid = layer_range.volume_regions[l.parent].region->print_object_region_id(); + int rid = layer_range.volume_regions[r.parent].region->print_object_region_id(); + return lid < rid || (lid == rid && l.extruder_id < r.extruder_id); }); + } + + return out.release(); +} + +Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_config) +{ +#ifdef _DEBUG + check_model_ids_validity(model); +#endif /* _DEBUG */ + + // Normalize the config. + new_full_config.option("print_settings_id", true); + new_full_config.option("filament_settings_id", true); + new_full_config.option("printer_settings_id", true); + new_full_config.option("physical_printer_settings_id", true); + new_full_config.normalize_fdm(); + + // Find modified keys of the various configs. Resolve overrides extruder retract values by filament profiles. + DynamicPrintConfig filament_overrides; + t_config_option_keys print_diff = print_config_diffs(m_config, new_full_config, filament_overrides); + t_config_option_keys full_config_diff = full_print_config_diffs(m_full_print_config, new_full_config); + // If just a physical printer was changed, but printer preset is the same, then there is no need to apply whole print + // see https://github.com/prusa3d/PrusaSlicer/issues/8800 + if (full_config_diff.size() == 1 && full_config_diff[0] == "physical_printer_settings_id") + full_config_diff.clear(); + + // Collect changes to object and region configs. + t_config_option_keys object_diff = m_default_object_config.diff(new_full_config); + t_config_option_keys region_diff = m_default_region_config.diff(new_full_config); + + // Do not use the ApplyStatus as we will use the max function when updating apply_status. + unsigned int apply_status = APPLY_STATUS_UNCHANGED; + auto update_apply_status = [&apply_status](bool invalidated) + { apply_status = std::max(apply_status, invalidated ? APPLY_STATUS_INVALIDATED : APPLY_STATUS_CHANGED); }; + if (! (print_diff.empty() && object_diff.empty() && region_diff.empty())) + update_apply_status(false); + + // Grab the lock for the Print / PrintObject milestones. + std::scoped_lock lock(this->state_mutex()); + + // The following call may stop the background processing. + if (! print_diff.empty()) + update_apply_status(this->invalidate_state_by_config_options(new_full_config, print_diff)); + + // Apply variables to placeholder parser. The placeholder parser is used by G-code export, + // which should be stopped if print_diff is not empty. + size_t num_extruders = m_config.nozzle_diameter.size(); + bool num_extruders_changed = false; + if (! full_config_diff.empty()) { + update_apply_status(this->invalidate_step(psGCodeExport)); + m_placeholder_parser.clear_config(); + // Set the profile aliases for the PrintBase::output_filename() + m_placeholder_parser.set("print_preset", new_full_config.option("print_settings_id")->clone()); + m_placeholder_parser.set("filament_preset", new_full_config.option("filament_settings_id")->clone()); + m_placeholder_parser.set("printer_preset", new_full_config.option("printer_settings_id")->clone()); + m_placeholder_parser.set("physical_printer_preset", new_full_config.option("physical_printer_settings_id")->clone()); + // We want the filament overrides to be applied over their respective extruder parameters by the PlaceholderParser. + // see "Placeholders do not respect filament overrides." GH issue #3649 + m_placeholder_parser.apply_config(filament_overrides); + // It is also safe to change m_config now after this->invalidate_state_by_config_options() call. + m_config.apply_only(new_full_config, print_diff, true); + //FIXME use move semantics once ConfigBase supports it. + // Some filament_overrides may contain values different from new_full_config, but equal to m_config. + // As long as these config options don't reallocate memory when copying, we are safe overriding a value, which is in use by a worker thread. + m_config.apply(filament_overrides); + // Handle changes to object config defaults + m_default_object_config.apply_only(new_full_config, object_diff, true); + // Handle changes to regions config defaults + m_default_region_config.apply_only(new_full_config, region_diff, true); + m_full_print_config = std::move(new_full_config); + if (num_extruders != m_config.nozzle_diameter.size()) { + num_extruders = m_config.nozzle_diameter.size(); + num_extruders_changed = true; + } + } + + ModelObjectStatusDB model_object_status_db; + + // 1) Synchronize model objects. + bool print_regions_reshuffled = false; + if (model.id() != m_model.id()) { + // Kill everything, initialize from scratch. + // Stop background processing. + this->call_cancel_callback(); + update_apply_status(this->invalidate_all_steps()); + for (PrintObject *object : m_objects) { + model_object_status_db.add(*object->model_object(), ModelObjectStatus::Deleted); + update_apply_status(object->invalidate_all_steps()); + delete object; + } + m_objects.clear(); + print_regions_reshuffled = true; + m_model.assign_copy(model); + for (const ModelObject *model_object : m_model.objects) + model_object_status_db.add(*model_object, ModelObjectStatus::New); + } else { + if (m_model.custom_gcode_per_print_z != model.custom_gcode_per_print_z) { + update_apply_status(num_extruders_changed || + // Tool change G-codes are applied as color changes for a single extruder printer, no need to invalidate tool ordering. + //FIXME The tool ordering may be invalidated unnecessarily if the custom_gcode_per_print_z.mode is not applicable + // to the active print / model state, and then it is reset, so it is being applicable, but empty, thus the effect is the same. + (num_extruders > 1 && custom_per_printz_gcodes_tool_changes_differ(m_model.custom_gcode_per_print_z.gcodes, model.custom_gcode_per_print_z.gcodes)) ? + // The Tool Ordering and the Wipe Tower are no more valid. + this->invalidate_steps({ psWipeTower, psGCodeExport }) : + // There is no change in Tool Changes stored in custom_gcode_per_print_z, therefore there is no need to update Tool Ordering. + this->invalidate_step(psGCodeExport)); + m_model.custom_gcode_per_print_z = model.custom_gcode_per_print_z; + } + if (model_object_list_equal(m_model, model)) { + // The object list did not change. + for (const ModelObject *model_object : m_model.objects) + model_object_status_db.add(*model_object, ModelObjectStatus::Old); + } else if (model_object_list_extended(m_model, model)) { + // Add new objects. Their volumes and configs will be synchronized later. + update_apply_status(this->invalidate_step(psGCodeExport)); + for (const ModelObject *model_object : m_model.objects) + model_object_status_db.add(*model_object, ModelObjectStatus::Old); + for (size_t i = m_model.objects.size(); i < model.objects.size(); ++ i) { + model_object_status_db.add(*model.objects[i], ModelObjectStatus::New); + m_model.objects.emplace_back(ModelObject::new_copy(*model.objects[i])); + m_model.objects.back()->set_model(&m_model); + } + } else { + // Reorder the objects, add new objects. + // First stop background processing before shuffling or deleting the PrintObjects in the object list. + this->call_cancel_callback(); + update_apply_status(this->invalidate_step(psGCodeExport)); + // Second create a new list of objects. + std::vector model_objects_old(std::move(m_model.objects)); + m_model.objects.clear(); + m_model.objects.reserve(model.objects.size()); + auto by_id_lower = [](const ModelObject *lhs, const ModelObject *rhs){ return lhs->id() < rhs->id(); }; + std::sort(model_objects_old.begin(), model_objects_old.end(), by_id_lower); + for (const ModelObject *mobj : model.objects) { + auto it = std::lower_bound(model_objects_old.begin(), model_objects_old.end(), mobj, by_id_lower); + if (it == model_objects_old.end() || (*it)->id() != mobj->id()) { + // New ModelObject added. + m_model.objects.emplace_back(ModelObject::new_copy(*mobj)); + m_model.objects.back()->set_model(&m_model); + model_object_status_db.add(*mobj, ModelObjectStatus::New); + } else { + // Existing ModelObject re-added (possibly moved in the list). + m_model.objects.emplace_back(*it); + model_object_status_db.add(*mobj, ModelObjectStatus::Moved); + } + } + bool deleted_any = false; + for (ModelObject *&model_object : model_objects_old) + if (model_object_status_db.add_if_new(*model_object, ModelObjectStatus::Deleted)) + deleted_any = true; + else + // Do not delete this ModelObject instance. + model_object = nullptr; + if (deleted_any) { + // Delete PrintObjects of the deleted ModelObjects. + PrintObjectPtrs print_objects_old = std::move(m_objects); + m_objects.clear(); + m_objects.reserve(print_objects_old.size()); + for (PrintObject *print_object : print_objects_old) { + const ModelObjectStatus &status = model_object_status_db.get(*print_object->model_object()); + if (status.status == ModelObjectStatus::Deleted) { + update_apply_status(print_object->invalidate_all_steps()); + delete print_object; + } else + m_objects.emplace_back(print_object); + } + for (ModelObject *model_object : model_objects_old) + delete model_object; + print_regions_reshuffled = true; + } + } + } + + // 2) Map print objects including their transformation matrices. + PrintObjectStatusDB print_object_status_db(m_objects); + + // 3) Synchronize ModelObjects & PrintObjects. + const std::initializer_list solid_or_modifier_types { ModelVolumeType::MODEL_PART, ModelVolumeType::NEGATIVE_VOLUME, ModelVolumeType::PARAMETER_MODIFIER }; + for (size_t idx_model_object = 0; idx_model_object < model.objects.size(); ++ idx_model_object) { + ModelObject &model_object = *m_model.objects[idx_model_object]; + ModelObjectStatus &model_object_status = const_cast(model_object_status_db.reuse(model_object)); + const ModelObject &model_object_new = *model.objects[idx_model_object]; + if (model_object_status.status == ModelObjectStatus::New) + // PrintObject instances will be added in the next loop. + continue; + // Update the ModelObject instance, possibly invalidate the linked PrintObjects. + assert(model_object_status.status == ModelObjectStatus::Old || model_object_status.status == ModelObjectStatus::Moved); + // Check whether a model part volume was added or removed, their transformations or order changed. + // Only volume IDs, volume types, transformation matrices and their order are checked, configuration and other parameters are NOT checked. + bool solid_or_modifier_differ = model_volume_list_changed(model_object, model_object_new, solid_or_modifier_types) || + model_mmu_segmentation_data_changed(model_object, model_object_new) || + (model_object_new.is_mm_painted() && num_extruders_changed); + bool supports_differ = model_volume_list_changed(model_object, model_object_new, ModelVolumeType::SUPPORT_BLOCKER) || + model_volume_list_changed(model_object, model_object_new, ModelVolumeType::SUPPORT_ENFORCER); + bool layer_height_ranges_differ = ! layer_height_ranges_equal(model_object.layer_config_ranges, model_object_new.layer_config_ranges, model_object_new.layer_height_profile.empty()); + bool model_origin_translation_differ = model_object.origin_translation != model_object_new.origin_translation; + auto print_objects_range = print_object_status_db.get_range(model_object); + // The list actually can be empty if all instances are out of the print bed. + //assert(print_objects_range.begin() != print_objects_range.end()); + // All PrintObjects in print_objects_range shall point to the same prints_objects_regions + if (print_objects_range.begin() != print_objects_range.end()) { + model_object_status.print_object_regions = print_objects_range.begin()->print_object->m_shared_regions; + model_object_status.print_object_regions->ref_cnt_inc(); + } + if (solid_or_modifier_differ || model_origin_translation_differ || layer_height_ranges_differ || + ! model_object.layer_height_profile.timestamp_matches(model_object_new.layer_height_profile)) { + // The very first step (the slicing step) is invalidated. One may freely remove all associated PrintObjects. + model_object_status.print_object_regions_status = + model_object_status.print_object_regions == nullptr || model_origin_translation_differ || layer_height_ranges_differ ? + // Drop print_objects_regions. + ModelObjectStatus::PrintObjectRegionsStatus::Invalid : + // Reuse bounding boxes of print_objects_regions for ModelVolumes with unmodified transformation. + ModelObjectStatus::PrintObjectRegionsStatus::PartiallyValid; + for (const PrintObjectStatus &print_object_status : print_objects_range) { + update_apply_status(print_object_status.print_object->invalidate_all_steps()); + const_cast(print_object_status).status = PrintObjectStatus::Deleted; + } + if (model_object_status.print_object_regions_status == ModelObjectStatus::PrintObjectRegionsStatus::PartiallyValid) + // Drop everything from PrintObjectRegions but those VolumeExtents (of their particular ModelVolumes) that are still valid. + print_objects_regions_invalidate_keep_some_volumes(*model_object_status.print_object_regions, model_object.volumes, model_object_new.volumes); + else if (model_object_status.print_object_regions != nullptr) + model_object_status.print_object_regions->clear(); + // Copy content of the ModelObject including its ID, do not change the parent. + model_object.assign_copy(model_object_new); + } else { + model_object_status.print_object_regions_status = ModelObjectStatus::PrintObjectRegionsStatus::Valid; + if (supports_differ || model_custom_supports_data_changed(model_object, model_object_new)) { + // First stop background processing before shuffling or deleting the ModelVolumes in the ModelObject's list. + if (supports_differ) { + this->call_cancel_callback(); + update_apply_status(false); + } + // Invalidate just the supports step. + for (const PrintObjectStatus &print_object_status : print_objects_range) { + update_apply_status(print_object_status.print_object->invalidate_step(posSupportMaterial)); + } + if (supports_differ) { + // Copy just the support volumes. + model_volume_list_update_supports(model_object, model_object_new); + } + } else if (model_custom_seam_data_changed(model_object, model_object_new)) { + update_apply_status(this->invalidate_step(psGCodeExport)); + } + } + if (! solid_or_modifier_differ) { + // Synchronize Object's config. + bool object_config_changed = ! model_object.config.timestamp_matches(model_object_new.config); + if (object_config_changed) + model_object.config.assign_config(model_object_new.config); + if (! object_diff.empty() || object_config_changed || num_extruders_changed) { + PrintObjectConfig new_config = PrintObject::object_config_from_model_object(m_default_object_config, model_object, num_extruders); + for (const PrintObjectStatus &print_object_status : print_object_status_db.get_range(model_object)) { + t_config_option_keys diff = print_object_status.print_object->config().diff(new_config); + if (! diff.empty()) { + update_apply_status(print_object_status.print_object->invalidate_state_by_config_options(print_object_status.print_object->config(), new_config, diff)); + print_object_status.print_object->config_apply_only(new_config, diff, true); + } + } + } + // Synchronize (just copy) the remaining data of ModelVolumes (name, config, custom supports data). + //FIXME What to do with m_material_id? + model_volume_list_copy_configs(model_object /* dst */, model_object_new /* src */, ModelVolumeType::MODEL_PART); + model_volume_list_copy_configs(model_object /* dst */, model_object_new /* src */, ModelVolumeType::PARAMETER_MODIFIER); + layer_height_ranges_copy_configs(model_object.layer_config_ranges /* dst */, model_object_new.layer_config_ranges /* src */); + // Copy the ModelObject name, input_file and instances. The instances will be compared against PrintObject instances in the next step. + model_object.name = model_object_new.name; + model_object.input_file = model_object_new.input_file; + // Only refresh ModelInstances if there is any change. + if (model_object.instances.size() != model_object_new.instances.size() || + ! std::equal(model_object.instances.begin(), model_object.instances.end(), model_object_new.instances.begin(), [](auto l, auto r){ return l->id() == r->id(); })) { + // G-code generator accesses model_object.instances to generate sequential print ordering matching the Plater object list. + update_apply_status(this->invalidate_step(psGCodeExport)); + model_object.clear_instances(); + model_object.instances.reserve(model_object_new.instances.size()); + for (const ModelInstance *model_instance : model_object_new.instances) { + model_object.instances.emplace_back(new ModelInstance(*model_instance)); + model_object.instances.back()->set_model_object(&model_object); + } + } else if (! std::equal(model_object.instances.begin(), model_object.instances.end(), model_object_new.instances.begin(), + [](auto l, auto r){ return l->print_volume_state == r->print_volume_state && l->printable == r->printable && + l->get_transformation().get_matrix().isApprox(r->get_transformation().get_matrix()); })) { + // If some of the instances changed, the bounding box of the updated ModelObject is likely no more valid. + // This is safe as the ModelObject's bounding box is only accessed from this function, which is called from the main thread only. + // Synchronize the content of instances. + auto new_instance = model_object_new.instances.begin(); + for (auto old_instance = model_object.instances.begin(); old_instance != model_object.instances.end(); ++ old_instance, ++ new_instance) { + (*old_instance)->set_transformation((*new_instance)->get_transformation()); + (*old_instance)->print_volume_state = (*new_instance)->print_volume_state; + (*old_instance)->printable = (*new_instance)->printable; + } + } + // Source / dest object share the same bounding boxes, just copy them. + model_object.copy_transformation_caches(model_object_new); + } + } + + // 4) Generate PrintObjects from ModelObjects and their instances. + { + PrintObjectPtrs print_objects_new; + print_objects_new.reserve(std::max(m_objects.size(), m_model.objects.size())); + bool new_objects = false; + // Walk over all new model objects and check, whether there are matching PrintObjects. + for (ModelObject *model_object : m_model.objects) { + ModelObjectStatus &model_object_status = const_cast(model_object_status_db.reuse(*model_object)); + model_object_status.print_instances = print_objects_from_model_object(*model_object); + std::vector old; + old.reserve(print_object_status_db.count(*model_object)); + for (const PrintObjectStatus &print_object_status : print_object_status_db.get_range(*model_object)) + if (print_object_status.status != PrintObjectStatus::Deleted) + old.emplace_back(&print_object_status); + // Generate a list of trafos and XY offsets for instances of a ModelObject + // Producing the config for PrintObject on demand, caching it at print_object_last. + const PrintObject *print_object_last = nullptr; + auto print_object_apply_config = [this, &print_object_last, model_object, num_extruders](PrintObject *print_object) { + print_object->config_apply(print_object_last ? + print_object_last->config() : + PrintObject::object_config_from_model_object(m_default_object_config, *model_object, num_extruders)); + print_object_last = print_object; + }; + if (old.empty()) { + // Simple case, just generate new instances. + for (PrintObjectTrafoAndInstances &print_instances : model_object_status.print_instances) { + PrintObject *print_object = new PrintObject(this, model_object, print_instances.trafo, std::move(print_instances.instances)); + print_object_apply_config(print_object); + print_objects_new.emplace_back(print_object); + // print_object_status.emplace(PrintObjectStatus(print_object, PrintObjectStatus::New)); + new_objects = true; + } + continue; + } + // Complex case, try to merge the two lists. + // Sort the old lexicographically by their trafos. + std::sort(old.begin(), old.end(), [](const PrintObjectStatus *lhs, const PrintObjectStatus *rhs){ return transform3d_lower(lhs->trafo, rhs->trafo); }); + // Merge the old / new lists. + auto it_old = old.begin(); + for (PrintObjectTrafoAndInstances &new_instances : model_object_status.print_instances) { + for (; it_old != old.end() && transform3d_lower((*it_old)->trafo, new_instances.trafo); ++ it_old); + if (it_old == old.end() || ! transform3d_equal((*it_old)->trafo, new_instances.trafo)) { + // This is a new instance (or a set of instances with the same trafo). Just add it. + PrintObject *print_object = new PrintObject(this, model_object, new_instances.trafo, std::move(new_instances.instances)); + print_object_apply_config(print_object); + print_objects_new.emplace_back(print_object); + // print_object_status.emplace(PrintObjectStatus(print_object, PrintObjectStatus::New)); + new_objects = true; + if (it_old != old.end()) + const_cast(*it_old)->status = PrintObjectStatus::Deleted; + } else { + // The PrintObject already exists and the copies differ. + PrintBase::ApplyStatus status = (*it_old)->print_object->set_instances(std::move(new_instances.instances)); + if (status != PrintBase::APPLY_STATUS_UNCHANGED) + update_apply_status(status == PrintBase::APPLY_STATUS_INVALIDATED); + print_objects_new.emplace_back((*it_old)->print_object); + const_cast(*it_old)->status = PrintObjectStatus::Reused; + } + } + } + if (m_objects != print_objects_new) { + this->call_cancel_callback(); + update_apply_status(this->invalidate_all_steps()); + m_objects = print_objects_new; + // Delete the PrintObjects marked as Unknown or Deleted. + bool deleted_objects = false; + for (const PrintObjectStatus &pos : print_object_status_db) + if (pos.status == PrintObjectStatus::Unknown || pos.status == PrintObjectStatus::Deleted) { + update_apply_status(pos.print_object->invalidate_all_steps()); + delete pos.print_object; + deleted_objects = true; + } + if (new_objects || deleted_objects) + update_apply_status(this->invalidate_steps({ psAlertWhenSupportsNeeded, psSkirtBrim, psWipeTower, psGCodeExport })); + if (new_objects) + update_apply_status(false); + print_regions_reshuffled = true; + } + print_object_status_db.clear(); + } + + // All regions now have distinct settings. + // Check whether applying the new region config defaults we would get different regions, + // update regions or create regions from scratch. + for (auto it_print_object = m_objects.begin(); it_print_object != m_objects.end();) { + // Find the range of PrintObjects sharing the same associated ModelObject. + auto it_print_object_end = it_print_object; + PrintObject &print_object = *(*it_print_object); + const ModelObject &model_object = *print_object.model_object(); + ModelObjectStatus &model_object_status = const_cast(model_object_status_db.reuse(model_object)); + PrintObjectRegions *print_object_regions = model_object_status.print_object_regions; + for (++ it_print_object_end; it_print_object_end != m_objects.end() && (*it_print_object)->model_object() == (*it_print_object_end)->model_object(); ++ it_print_object_end) + assert((*it_print_object_end)->m_shared_regions == nullptr || (*it_print_object_end)->m_shared_regions == print_object_regions); + if (print_object_regions == nullptr) { + print_object_regions = new PrintObjectRegions{}; + model_object_status.print_object_regions = print_object_regions; + print_object_regions->ref_cnt_inc(); + } + std::vector painting_extruders; + if (const auto &volumes = print_object.model_object()->volumes; + num_extruders > 1 && + std::find_if(volumes.begin(), volumes.end(), [](const ModelVolume *v) { return ! v->mmu_segmentation_facets.empty(); }) != volumes.end()) { + //FIXME be more specific! Don't enumerate extruders that are not used for painting! + painting_extruders.assign(num_extruders, 0); + std::iota(painting_extruders.begin(), painting_extruders.end(), 1); + } + if (model_object_status.print_object_regions_status == ModelObjectStatus::PrintObjectRegionsStatus::Valid) { + // Verify that the trafo for regions & volume bounding boxes thus for regions is still applicable. + auto invalidate = [it_print_object, it_print_object_end, update_apply_status]() { + for (auto it = it_print_object; it != it_print_object_end; ++ it) + if ((*it)->m_shared_regions != nullptr) + update_apply_status((*it)->invalidate_all_steps()); + }; + if (print_object_regions && ! trafos_differ_in_rotation_by_z_and_mirroring_by_xy_only(print_object_regions->trafo_bboxes, model_object_status.print_instances.front().trafo)) { + invalidate(); + print_object_regions->clear(); + model_object_status.print_object_regions_status = ModelObjectStatus::PrintObjectRegionsStatus::Invalid; + print_regions_reshuffled = true; + } else if (print_object_regions && + verify_update_print_object_regions( + print_object.model_object()->volumes, + m_default_region_config, + num_extruders, + painting_extruders, + *print_object_regions, + [it_print_object, it_print_object_end, &update_apply_status](const PrintRegionConfig &old_config, const PrintRegionConfig &new_config, const t_config_option_keys &diff_keys) { + for (auto it = it_print_object; it != it_print_object_end; ++it) + if ((*it)->m_shared_regions != nullptr) + update_apply_status((*it)->invalidate_state_by_config_options(old_config, new_config, diff_keys)); + })) { + // Regions are valid, just keep them. + } else { + // Regions were reshuffled. + invalidate(); + // At least reuse layer ranges and bounding boxes of ModelVolumes. + model_object_status.print_object_regions_status = ModelObjectStatus::PrintObjectRegionsStatus::PartiallyValid; + print_regions_reshuffled = true; + } + } + if (print_object_regions == nullptr || model_object_status.print_object_regions_status != ModelObjectStatus::PrintObjectRegionsStatus::Valid) { + // Layer ranges with their associated configurations. Remove overlaps between the ranges + // and create the regions from scratch. + print_object_regions = generate_print_object_regions( + print_object_regions, + print_object.model_object()->volumes, + LayerRanges(print_object.model_object()->layer_config_ranges), + m_default_region_config, + model_object_status.print_instances.front().trafo, + num_extruders, + print_object.is_mm_painted() ? 0.f : float(print_object.config().xy_size_compensation.value), + painting_extruders); + } + for (auto it = it_print_object; it != it_print_object_end; ++it) + if ((*it)->m_shared_regions) { + assert((*it)->m_shared_regions == print_object_regions); + } else { + (*it)->m_shared_regions = print_object_regions; + print_object_regions->ref_cnt_inc(); + } + it_print_object = it_print_object_end; + } + + if (print_regions_reshuffled) { + // Update Print::m_print_regions from objects. + struct cmp { bool operator() (const PrintRegion *l, const PrintRegion *r) const { return l->config_hash() == r->config_hash() && l->config() == r->config(); } }; + std::set region_set; + m_print_regions.clear(); + PrintObjectRegions *print_object_regions = nullptr; + for (PrintObject *print_object : m_objects) + if (print_object_regions != print_object->m_shared_regions) { + print_object_regions = print_object->m_shared_regions; + for (std::unique_ptr &print_region : print_object_regions->all_regions) + if (auto it = region_set.find(print_region.get()); it == region_set.end()) { + int print_region_id = int(m_print_regions.size()); + m_print_regions.emplace_back(print_region.get()); + print_region->m_print_region_id = print_region_id; + } else { + print_region->m_print_region_id = (*it)->print_region_id(); + } + } + } + + // Update SlicingParameters for each object where the SlicingParameters is not valid. + // If it is not valid, then it is ensured that PrintObject.m_slicing_params is not in use + // (posSlicing and posSupportMaterial was invalidated). + for (PrintObject *object : m_objects) + object->update_slicing_parameters(); + + if (apply_status == APPLY_STATUS_CHANGED || apply_status == APPLY_STATUS_INVALIDATED) + this->cleanup(); + +#ifdef _DEBUG + check_model_ids_equal(m_model, model); +#endif /* _DEBUG */ + + return static_cast(apply_status); +} + +void Print::cleanup() +{ + // Invalidate data of a single ModelObject shared by multiple PrintObjects. + // Find spans of PrintObjects sharing the same PrintObjectRegions. + std::vector all_objects(m_objects); + std::sort(all_objects.begin(), all_objects.end(), [](const PrintObject *l, const PrintObject *r){ return l->shared_regions() < r->shared_regions(); } ); + for (auto it = all_objects.begin(); it != all_objects.end();) { + PrintObjectRegions *shared_regions = (*it)->m_shared_regions; + auto it_begin = it; + for (; it != all_objects.end() && shared_regions == (*it)->shared_regions(); ++ it) + // Let the PrintObject clean up its data with invalidated milestones. + (*it)->cleanup(); + auto this_objects = SpanOfConstPtrs(const_cast(&(*it_begin)), it - it_begin); + if (! Print::is_shared_print_object_step_valid_unguarded(this_objects, posSupportSpotsSearch)) + shared_regions->generated_support_points.reset(); + } +} + +bool Print::is_shared_print_object_step_valid_unguarded(SpanOfConstPtrs print_objects, PrintObjectStep print_object_step) +{ + return std::any_of(print_objects.begin(), print_objects.end(), [print_object_step](auto po){ return po->is_step_done_unguarded(print_object_step); }); +} + +} // namespace Slic3r diff --git a/src/libslic3r/PrintBase.cpp b/src/libslic3r/PrintBase.cpp index b60401e96fb..01c0ecfaa3b 100644 --- a/src/libslic3r/PrintBase.cpp +++ b/src/libslic3r/PrintBase.cpp @@ -6,14 +6,10 @@ #include "I18N.hpp" -//! macro used to mark string used at localization, -//! return same string -#define L(s) Slic3r::I18N::translate(s) - namespace Slic3r { -void PrintTryCancel::operator()() +void PrintTryCancel::operator()() const { m_print->throw_if_canceled(); } @@ -81,7 +77,7 @@ std::string PrintBase::output_filename(const std::string &format, const std::str filename = boost::filesystem::change_extension(filename, default_ext); return filename.string(); } catch (std::runtime_error &err) { - throw Slic3r::PlaceholderParserError(L("Failed processing of the output_filename_format template.") + "\n" + err.what()); + throw Slic3r::PlaceholderParserError(_u8L("Failed processing of the output_filename_format template.") + "\n" + err.what()); } } @@ -103,7 +99,7 @@ std::string PrintBase::output_filepath(const std::string &path, const std::strin void PrintBase::status_update_warnings(int step, PrintStateBase::WarningLevel /* warning_level */, const std::string &message, const PrintObjectBase* print_object) { - if (this->m_status_callback) { + if (m_status_callback) { auto status = print_object ? SlicingStatus(*print_object, step) : SlicingStatus(*this, step); m_status_callback(status); } diff --git a/src/libslic3r/PrintBase.hpp b/src/libslic3r/PrintBase.hpp index 08711a7b2ff..4c009cac888 100644 --- a/src/libslic3r/PrintBase.hpp +++ b/src/libslic3r/PrintBase.hpp @@ -23,10 +23,29 @@ class CanceledException : public std::exception { class PrintStateBase { public: - enum State { - INVALID, - STARTED, - DONE, + enum class State { + // Fresh state, either the object is new or the data of that particular milestone was cleaned up. + // Fresh state may transit to Started. + Fresh, + // Milestone was started and now it is being executed. + // Started state may transit to Canceled with invalid data or Done with valid data. + Started, + // Milestone was being executed, but now it is canceled and not yet cleaned up. + // Canceled state may transit to Fresh state if its invalid data is cleaned up + // or to Started state. + // Canceled and Invalidated states are of similar nature: Canceled step was Started but canceled, + // while Invalidated state was Done but invalidated. + Canceled, + // Milestone was finished successfully, it's data is now valid. + // Done state may transit to Invalidated state if its data is no more valid + // or to a Started state. + Done, + // Milestone was finished successfully (done), but now it is invalidated and it's data is no more valid. + // Invalidated state may transit to Fresh if its invalid data is cleaned up, + // or to state Started. + // Canceled and Invalidated states are of similar nature: Canceled step was Started but canceled, + // while Invalidated state was Done but invalidated. + Invalidated, }; enum class WarningLevel { @@ -39,9 +58,25 @@ class PrintStateBase { // A new unique timestamp is being assigned to the step every time the step changes its state. struct StateWithTimeStamp { - StateWithTimeStamp() : state(INVALID), timestamp(0) {} - State state; - TimeStamp timestamp; + State state { State::Fresh }; + TimeStamp timestamp { 0 }; + bool enabled { true }; + + bool is_done() const { return state == State::Done; } + // The milestone may have some data available, but it is no more valid and it should be cleaned up to conserve memory. + bool is_dirty() const { return state == State::Canceled || state == State::Invalidated; } + + // If the milestone is Started or Done, invalidate it: + // Turn Started to Canceled, turn Done to Invalidated. + // Update timestamp of this milestone. + bool try_invalidate() { + bool invalidated = this->state == State::Started || this->state == State::Done; + if (invalidated) { + this->state = this->state == State::Started ? State::Canceled : State::Invalidated; + this->timestamp = ++ g_last_timestamp; + } + return invalidated; + } }; struct Warning @@ -93,11 +128,11 @@ class PrintState : public PrintStateBase } bool is_started(StepType step, std::mutex &mtx) const { - return this->state_with_timestamp(step, mtx).state == STARTED; + return this->state_with_timestamp(step, mtx).state == State::Started; } bool is_done(StepType step, std::mutex &mtx) const { - return this->state_with_timestamp(step, mtx).state == DONE; + return this->state_with_timestamp(step, mtx).state == State::Done; } StateWithTimeStamp state_with_timestamp_unguarded(StepType step) const { @@ -105,17 +140,31 @@ class PrintState : public PrintStateBase } bool is_started_unguarded(StepType step) const { - return this->state_with_timestamp_unguarded(step).state == STARTED; + return this->state_with_timestamp_unguarded(step).state == State::Started; } bool is_done_unguarded(StepType step) const { - return this->state_with_timestamp_unguarded(step).state == DONE; + return this->state_with_timestamp_unguarded(step).state == State::Done; + } + + void enable_unguarded(StepType step, bool enable) { + m_state[step].enabled = enable; + } + + void enable_all_unguarded(bool enable) { + for (size_t istep = 0; istep < COUNT; ++ istep) + m_state[istep].enabled = enable; + } + + bool is_enabled_unguarded(StepType step) const { + return this->state_with_timestamp_unguarded(step).enabled; } // Set the step as started. Block on mutex while the Print / PrintObject / PrintRegion objects are being // modified by the UI thread. // This is necessary to block until the Print::apply() updates its state, which may // influence the processing step being entered. + // Returns false if the step is not enabled or if the step has already been finished (it is done). template bool set_started(StepType step, std::mutex &mtx, ThrowIfCanceled throw_if_canceled) { std::scoped_lock lock(mtx); @@ -132,12 +181,12 @@ class PrintState : public PrintStateBase // // assert(m_step_active == -1); // for (int i = 0; i < int(COUNT); ++ i) -// assert(m_state[i].state != STARTED); +// assert(m_state[i].state != State::Started); #endif // NDEBUG - if (m_state[step].state == DONE) - return false; PrintStateBase::StateWithWarnings &state = m_state[step]; - state.state = STARTED; + if (! state.enabled || state.state == State::Done) + return false; + state.state = State::Started; state.timestamp = ++ g_last_timestamp; state.mark_warnings_non_current(); m_step_active = static_cast(step); @@ -147,17 +196,17 @@ class PrintState : public PrintStateBase // Set the step as done. Block on mutex while the Print / PrintObject / PrintRegion objects are being // modified by the UI thread. // Return value: - // Timestamp when this stepentered the DONE state. + // Timestamp when this step entered the Done state. // bool indicates whether the UI has to update the slicing warnings of this step or not. template std::pair set_done(StepType step, std::mutex &mtx, ThrowIfCanceled throw_if_canceled) { std::scoped_lock lock(mtx); // If canceled, throw before changing the step state. throw_if_canceled(); - assert(m_state[step].state == STARTED); + assert(m_state[step].state == State::Started); assert(m_step_active == static_cast(step)); PrintStateBase::StateWithWarnings &state = m_state[step]; - state.state = DONE; + state.state = State::Done; state.timestamp = ++ g_last_timestamp; m_step_active = -1; // Remove all non-current warnings. @@ -176,16 +225,12 @@ class PrintState : public PrintStateBase // processing by calling the cancel callback. template bool invalidate(StepType step, CancelationCallback cancel) { - bool invalidated = m_state[step].state != INVALID; - if (invalidated) { + if (PrintStateBase::StateWithWarnings &state = m_state[step]; state.try_invalidate()) { #if 0 if (mtx.state != mtx.HELD) { printf("Not held!\n"); } #endif - PrintStateBase::StateWithWarnings &state = m_state[step]; - state.state = INVALID; - state.timestamp = ++ g_last_timestamp; // Raise the mutex, so that the following cancel() callback could cancel // the background processing. // Internally the cancel() callback shall unlock the PrintBase::m_status_mutex to let @@ -195,21 +240,17 @@ class PrintState : public PrintStateBase // It is safe to modify it. state.mark_warnings_non_current(); m_step_active = -1; - } - return invalidated; + return true; + } else + return false; } template bool invalidate_multiple(StepTypeIterator step_begin, StepTypeIterator step_end, CancelationCallback cancel) { bool invalidated = false; - for (StepTypeIterator it = step_begin; it != step_end; ++ it) { - StateWithTimeStamp &state = m_state[*it]; - if (state.state != INVALID) { + for (StepTypeIterator it = step_begin; it != step_end; ++ it) + if (m_state[*it].try_invalidate()) invalidated = true; - state.state = INVALID; - state.timestamp = ++ g_last_timestamp; - } - } if (invalidated) { #if 0 if (mtx.state != mtx.HELD) { @@ -237,14 +278,9 @@ class PrintState : public PrintStateBase template bool invalidate_all(CancelationCallback cancel) { bool invalidated = false; - for (size_t i = 0; i < COUNT; ++ i) { - StateWithTimeStamp &state = m_state[i]; - if (state.state != INVALID) { + for (size_t i = 0; i < COUNT; ++ i) + if (m_state[i].try_invalidate()) invalidated = true; - state.state = INVALID; - state.timestamp = ++ g_last_timestamp; - } - } if (invalidated) { cancel(); // Now the worker thread should be stopped, therefore it cannot write into the warnings field. @@ -256,6 +292,26 @@ class PrintState : public PrintStateBase return invalidated; } + // If the milestone is Canceled or Invalidated, return true and turn the state of the milestone to Fresh. + // The caller is responsible for releasing the data of the milestone that is no more valid. + bool query_reset_dirty_unguarded(StepType step) { + if (PrintStateBase::StateWithWarnings &state = m_state[step]; state.is_dirty()) { + state.state = State::Fresh; + return true; + } else + return false; + } + + // To be called after the background thread was stopped by the user pressing the Cancel button, + // which in turn stops the background thread without adjusting state of the milestone being executed. + // This method fixes the state of the canceled milestone by setting it to a Canceled state. + void mark_canceled_unguarded() { + for (size_t i = 0; i < COUNT; ++ i) { + if (State &state = m_state[i].state; state == State::Started) + state = State::Canceled; + } + } + // Update list of warnings of the current milestone with a new warning. // The warning may already exist in the list, marked as current or not current. // If it already exists, mark it as current. @@ -267,7 +323,7 @@ class PrintState : public PrintStateBase std::scoped_lock lock(mtx); assert(m_step_active != -1); StateWithWarnings &state = m_state[m_step_active]; - assert(state.state == STARTED); + assert(state.state == State::Started); std::pair retval(static_cast(m_step_active), true); // Does a warning of the same level and message or message_id exist already? auto it = (message_id == 0) ? @@ -326,7 +382,7 @@ class PrintTryCancel { public: // calls print.throw_if_canceled(). - void operator()(); + void operator()() const; private: friend PrintBase; PrintTryCancel() = delete; @@ -388,12 +444,16 @@ class PrintBase : public ObjectBase int to_print_step; }; // After calling the apply() function, call set_task() to limit the task to be processed by process(). - virtual void set_task(const TaskParams ¶ms) {} + virtual void set_task(const TaskParams ¶ms) = 0; // Perform the calculation. This is the only method that is to be called at a worker thread. virtual void process() = 0; // Clean up after process() finished, either with success, error or if canceled. // The adjustments on the Print / PrintObject data due to set_task() are to be reverted here. - virtual void finalize() {} + virtual void finalize() = 0; + // Clean up print step / print object step data after + // 1) some print step / print object step was invalidated inside PrintBase::apply() while holding the milestone mutex locked. + // 2) background thread finished being canceled. + virtual void cleanup() = 0; struct SlicingStatus { SlicingStatus(int percent, const std::string &text, unsigned int flags = 0) : percent(percent), text(text), flags(flags) {} @@ -511,10 +571,15 @@ class PrintBase : public ObjectBase friend PrintTryCancel; }; -template +template class PrintBaseWithState : public PrintBase { public: + using PrintStepEnum = PrintStepEnumType; + static constexpr const size_t PrintStepEnumSize = COUNT; + + PrintBaseWithState() = default; + bool is_step_done(PrintStepEnum step) const { return m_state.is_done(step, this->state_mutex()); } PrintStateBase::StateWithTimeStamp step_state_with_timestamp(PrintStepEnum step) const { return m_state.state_with_timestamp(step, this->state_mutex()); } PrintStateBase::StateWithWarnings step_state_with_warnings(PrintStepEnum step) const { return m_state.state_with_warnings(step, this->state_mutex()); } @@ -549,14 +614,124 @@ class PrintBaseWithState : public PrintBase this->status_update_warnings(static_cast(active_step.first), warning_level, message); } + + // After calling the apply() function, set_task() may be called to limit the task to be processed by process(). + template + void set_task_impl(const TaskParams ¶ms, std::vector &print_objects) + { + static constexpr const auto PrintObjectStepEnumSize = int(PrintObject::PrintObjectStepEnumSize); + using PrintObjectStepEnum = typename PrintObject::PrintObjectStepEnum; + // Grab the lock for the Print / PrintObject milestones. + std::scoped_lock lock(this->state_mutex()); + + int n_object_steps = int(params.to_object_step) + 1; + if (n_object_steps == 0) + n_object_steps = PrintObjectStepEnumSize; + + if (params.single_model_object.valid()) { + // Find the print object to be processed with priority. + PrintObject *print_object = nullptr; + size_t idx_print_object = 0; + for (; idx_print_object < print_objects.size(); ++ idx_print_object) + if (print_objects[idx_print_object]->model_object()->id() == params.single_model_object) { + print_object = print_objects[idx_print_object]; + break; + } + assert(print_object != nullptr); + // Find out whether the priority print object is being currently processed. + bool running = false; + for (int istep = 0; istep < n_object_steps; ++ istep) { + if (! print_object->is_step_enabled_unguarded(PrintObjectStepEnum(istep))) + // Step was skipped, cancel. + break; + if (print_object->is_step_started_unguarded(PrintObjectStepEnum(istep))) { + // No step was skipped, and a wanted step is being processed. Don't cancel. + running = true; + break; + } + } + if (! running) + this->call_cancel_callback(); + + // Now the background process is either stopped, or it is inside one of the print object steps to be calculated anyway. + if (params.single_model_instance_only) { + // Suppress all the steps of other instances. + for (PrintObject *po : print_objects) + for (size_t istep = 0; istep < PrintObjectStepEnumSize; ++ istep) + po->enable_step_unguarded(PrintObjectStepEnum(istep), false); + } else if (! running) { + // Swap the print objects, so that the selected print_object is first in the row. + // At this point the background processing must be stopped, so it is safe to shuffle print objects. + if (idx_print_object != 0) + std::swap(print_objects.front(), print_objects[idx_print_object]); + } + // and set the steps for the current object. + for (int istep = 0; istep < n_object_steps; ++ istep) + print_object->enable_step_unguarded(PrintObjectStepEnum(istep), true); + for (int istep = n_object_steps; istep < PrintObjectStepEnumSize; ++ istep) + print_object->enable_step_unguarded(PrintObjectStepEnum(istep), false); + } else { + // Slicing all objects. + bool running = false; + for (PrintObject *print_object : print_objects) + for (int istep = 0; istep < n_object_steps; ++ istep) { + if (! print_object->is_step_enabled_unguarded(PrintObjectStepEnum(istep))) { + // Step may have been skipped. Restart. + goto loop_end; + } + if (print_object->is_step_started_unguarded(PrintObjectStepEnum(istep))) { + // This step is running, and the state cannot be changed due to the this->state_mutex() being locked. + // It is safe to manipulate m_stepmask of other PrintObjects and Print now. + running = true; + goto loop_end; + } + } + loop_end: + if (! running) + this->call_cancel_callback(); + for (PrintObject *po : print_objects) { + for (int istep = 0; istep < n_object_steps; ++ istep) + po->enable_step_unguarded(PrintObjectStepEnum(istep), true); + for (int istep = n_object_steps; istep < PrintObjectStepEnumSize; ++ istep) + po->enable_step_unguarded(PrintObjectStepEnum(istep), false); + } + } + + if (params.to_object_step != -1 || params.to_print_step != -1) { + // Limit the print steps. + size_t istep = (params.to_object_step != -1) ? 0 : size_t(params.to_print_step) + 1; + for (; istep < PrintStepEnumSize; ++ istep) + m_state.enable_unguarded(PrintStepEnum(istep), false); + } + } + + // Clean up after process() finished, either with success, error or if canceled. + // The adjustments on the Print / PrintObject m_stepmask data due to set_task() are to be reverted here: + // Execution of all milestones is enabled in case some of them were suppressed for the last background execution. + // Also if the background processing was canceled, the current milestone that was just abandoned + // in Started state is to be reset to Canceled state. + template + void finalize_impl(std::vector &print_objects) + { + // Grab the lock for the Print / PrintObject milestones. + std::scoped_lock lock(this->state_mutex()); + for (auto *po : print_objects) + po->finalize_impl(); + m_state.enable_all_unguarded(true); + m_state.mark_canceled_unguarded(); + } + private: - PrintState m_state; + PrintState m_state; }; -template +template class PrintObjectBaseWithState : public PrintObjectBase { public: + using PrintObjectStepEnum = PrintObjectStepEnumType; + static constexpr const size_t PrintObjectStepEnumSize = COUNT; + PrintType* print() { return m_print; } const PrintType* print() const { return m_print; } @@ -565,6 +740,21 @@ class PrintObjectBaseWithState : public PrintObjectBase PrintStateBase::StateWithTimeStamp step_state_with_timestamp(PrintObjectStepEnum step) const { return m_state.state_with_timestamp(step, PrintObjectBase::state_mutex(m_print)); } PrintStateBase::StateWithWarnings step_state_with_warnings(PrintObjectStepEnum step) const { return m_state.state_with_warnings(step, PrintObjectBase::state_mutex(m_print)); } + auto last_completed_step() const + { + static_assert(COUNT > 0, "Step count should be > 0"); + auto s = int(COUNT) - 1; + + std::lock_guard lk(state_mutex(m_print)); + while (s >= 0 && ! is_step_done_unguarded(PrintObjectStepEnum(s))) + --s; + + if (s < 0) + s = COUNT; + + return PrintObjectStepEnum(s); + } + protected: PrintObjectBaseWithState(PrintType *print, ModelObject *model_object) : PrintObjectBase(model_object), m_print(print) {} @@ -590,6 +780,15 @@ class PrintObjectBaseWithState : public PrintObjectBase bool is_step_started_unguarded(PrintObjectStepEnum step) const { return m_state.is_started_unguarded(step); } bool is_step_done_unguarded(PrintObjectStepEnum step) const { return m_state.is_done_unguarded(step); } + bool is_step_enabled_unguarded(PrintObjectStepEnum step) const { return m_state.is_enabled_unguarded(step); } + void enable_step_unguarded(PrintObjectStepEnum step, bool enable) { m_state.enable_unguarded(step, enable); } + void enable_all_steps_unguarded(bool enable) { m_state.enable_all_unguarded(enable); } + // See the comment at PrintBaseWithState::finalize_impl() + void finalize_impl() { m_state.enable_all_unguarded(true); m_state.mark_canceled_unguarded(); } + // If the milestone is Canceled or Invalidated, return true and turn the state of the milestone to Fresh. + // The caller is responsible for releasing the data of the milestone that is no more valid. + bool query_reset_dirty_step_unguarded(PrintObjectStepEnum step) { return m_state.query_reset_dirty_unguarded(step); } + // Add a slicing warning to the active PrintObject step and send a status notification. // This method could be called multiple times between this->set_started() and this->set_done(). void active_step_add_warning(PrintStateBase::WarningLevel warning_level, const std::string &message, int message_id = 0) { @@ -604,10 +803,10 @@ class PrintObjectBaseWithState : public PrintObjectBase void throw_if_canceled() { if (m_print->canceled()) throw CanceledException(); } friend PrintType; - PrintType *m_print; + PrintType *m_print; private: - PrintState m_state; + PrintState m_state; }; } // namespace Slic3r diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index b9d50a78d60..fdf97cbe2a6 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2,6 +2,8 @@ #include "Config.hpp" #include "I18N.hpp" +#include "SLA/SupportTree.hpp" + #include #include #include @@ -14,11 +16,6 @@ namespace Slic3r { -//! macro used to mark string used at localization, -//! return same string -#define L(s) (s) -#define _(s) Slic3r::I18N::translate(s) - static t_config_enum_names enum_names_from_keys_map(const t_config_enum_values &enum_keys_map) { t_config_enum_names names; @@ -51,6 +48,7 @@ static const t_config_enum_values s_keys_map_GCodeFlavor { { "makerware", gcfMakerWare }, { "marlin", gcfMarlinLegacy }, { "marlin2", gcfMarlinFirmware }, + { "klipper", gcfKlipper }, { "sailfish", gcfSailfish }, { "smoothie", gcfSmoothie }, { "mach3", gcfMach3 }, @@ -68,7 +66,9 @@ CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(MachineLimitsUsage) static const t_config_enum_values s_keys_map_PrintHostType { { "prusalink", htPrusaLink }, + { "prusaconnect", htPrusaConnect }, { "octoprint", htOctoPrint }, + { "mainsail", htMainSail }, { "duet", htDuet }, { "flashair", htFlashAir }, { "astrobox", htAstroBox }, @@ -136,7 +136,9 @@ CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(SupportMaterialPattern) static const t_config_enum_values s_keys_map_SupportMaterialStyle { { "grid", smsGrid }, - { "snug", smsSnug } + { "snug", smsSnug }, + { "tree", smsTree }, + { "organic", smsOrganic } }; CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(SupportMaterialStyle) @@ -162,9 +164,9 @@ static const t_config_enum_values s_keys_map_SLADisplayOrientation = { CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(SLADisplayOrientation) static const t_config_enum_values s_keys_map_SLAPillarConnectionMode = { - {"zigzag", slapcmZigZag}, - {"cross", slapcmCross}, - {"dynamic", slapcmDynamic} + {"zigzag", int(SLAPillarConnectionMode::zigzag)}, + {"cross", int(SLAPillarConnectionMode::cross)}, + {"dynamic", int(SLAPillarConnectionMode::dynamic)} }; CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(SLAPillarConnectionMode) @@ -175,6 +177,13 @@ static const t_config_enum_values s_keys_map_SLAMaterialSpeed = { }; CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(SLAMaterialSpeed); +static inline const t_config_enum_values s_keys_map_SLASupportTreeType = { + {"default", int(sla::SupportTreeType::Default)}, + {"branching", int(sla::SupportTreeType::Branching)}, + //TODO: {"organic", int(sla::SupportTreeType::Organic)} +}; +CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(SLASupportTreeType); + static const t_config_enum_values s_keys_map_BrimType = { {"no_brim", btNoBrim}, {"outer_only", btOuterOnly}, @@ -217,6 +226,11 @@ static void assign_printer_technology_to_unknown(t_optiondef_map &options, Print kvp.second.printer_technology = printer_technology; } +// Maximum extruder temperature, bumped to 1500 to support printing of glass. +namespace { + const int max_temp = 1500; +}; + PrintConfigDef::PrintConfigDef() { this->init_common_params(); @@ -226,6 +240,7 @@ PrintConfigDef::PrintConfigDef() assign_printer_technology_to_unknown(this->options, ptFFF); this->init_sla_params(); assign_printer_technology_to_unknown(this->options, ptSLA); + this->finalize(); } void PrintConfigDef::init_common_params() @@ -235,9 +250,7 @@ void PrintConfigDef::init_common_params() def = this->add("printer_technology", coEnum); def->label = L("Printer technology"); def->tooltip = L("Printer technology"); - def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); - def->enum_values.push_back("FFF"); - def->enum_values.push_back("SLA"); + def->set_enum({ "FFF", "SLA" }); def->set_default_value(new ConfigOptionEnum(ptFFF)); def = this->add("bed_shape", coPoints); @@ -276,10 +289,7 @@ void PrintConfigDef::init_common_params() def->label = L("Format of G-code thumbnails"); def->tooltip = L("Format of G-code thumbnails: PNG for best quality, JPG for smallest size, QOI for low memory firmware"); def->mode = comExpert; - def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); - def->enum_values.push_back("PNG"); - def->enum_values.push_back("JPG"); - def->enum_values.push_back("QOI"); + def->set_enum({ "PNG", "JPG", "QOI" }); def->set_default_value(new ConfigOptionEnum(GCodeThumbnailsFormat::PNG)); def = this->add("layer_height", coFloat); @@ -321,7 +331,7 @@ void PrintConfigDef::init_common_params() def = this->add("printhost_port", coString); def->label = L("Printer"); def->tooltip = L("Name of the printer"); - def->gui_type = ConfigOptionDef::GUIType::select_open; + def->gui_type = ConfigOptionDef::GUIType::select_close; def->mode = comAdvanced; def->cli = ConfigOptionDef::nocli; def->set_default_value(new ConfigOptionString("")); @@ -368,11 +378,10 @@ void PrintConfigDef::init_common_params() def = this->add("printhost_authorization_type", coEnum); def->label = L("Authorization Type"); // def->tooltip = L(""); - def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); - def->enum_values.push_back("key"); - def->enum_values.push_back("user"); - def->enum_labels.push_back(L("API key")); - def->enum_labels.push_back(L("HTTP digest")); + def->set_enum({ + { "key", L("API key") }, + { "user", L("HTTP digest") } + }); def->mode = comAdvanced; def->cli = ConfigOptionDef::nocli; def->set_default_value(new ConfigOptionEnum(atKeyPassword)); @@ -390,6 +399,14 @@ void PrintConfigDef::init_fff_params() // Maximum extruder temperature, bumped to 1500 to support printing of glass. const int max_temp = 1500; + def = this->add("avoid_crossing_curled_overhangs", coBool); + def->label = L("Avoid crossing curled overhangs (Experimental)"); + // TRN PrintSettings: "Avoid crossing curled overhangs (Experimental)" + def->tooltip = L("Plan travel moves such that the extruder avoids areas where the filament may be curled up. " + "This is mostly happening on steeper rounded overhangs and may cause a crash with the nozzle. " + "This feature slows down both the print and the G-code generation."); + def->mode = comExpert; + def->set_default_value(new ConfigOptionBool(false)); def = this->add("avoid_crossing_perimeters", coBool); def->label = L("Avoid crossing perimeters"); @@ -442,8 +459,8 @@ void PrintConfigDef::init_fff_params() def->set_default_value(new ConfigOptionString("")); def = this->add("bottom_solid_layers", coInt); - //TRN To be shown in Print Settings "Bottom solid layers" - def->label = L("Bottom"); + //TRN Print Settings: "Bottom solid layers" + def->label = L_CONTEXT("Bottom", "Layers"); def->category = L("Layers and Perimeters"); def->tooltip = L("Number of solid layers to generate on bottom surfaces."); def->full_label = L("Bottom solid layers"); @@ -451,8 +468,7 @@ void PrintConfigDef::init_fff_params() def->set_default_value(new ConfigOptionInt(3)); def = this->add("bottom_solid_min_thickness", coFloat); - //TRN To be shown in Print Settings "Top solid layers" - def->label = L("Bottom"); + def->label = L_CONTEXT("Bottom", "Layers"); def->category = L("Layers and Perimeters"); def->tooltip = L("The number of bottom solid layers is increased above bottom_solid_layers if necessary to satisfy " "minimum thickness of bottom shell."); @@ -512,6 +528,103 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloat(60)); + def = this->add("enable_dynamic_overhang_speeds", coBool); + def->label = L("Enable dynamic overhang speeds"); + def->category = L("Speed"); + def->tooltip = L("This setting enables dynamic speed control on overhangs."); + def->mode = comExpert; + def->set_default_value(new ConfigOptionBool(false)); + + // TRN PrintSettings : "Dynamic overhang speed" + auto overhang_speed_setting_description = L("Overhang size is expressed as a percentage of overlap of the extrusion with the previous layer: " + "100% would be full overlap (no overhang), while 0% represents full overhang (floating extrusion, bridge). " + "Speeds for overhang sizes in between are calculated via linear interpolation. " + "If set as percentage, the speed is calculated over the external perimeter speed."); + + def = this->add("overhang_speed_0", coFloatOrPercent); + def->label = L("speed for 0% overlap (bridge)"); + def->category = L("Speed"); + def->tooltip = overhang_speed_setting_description; + def->sidetext = L("mm/s or %"); + def->min = 0; + def->mode = comExpert; + def->set_default_value(new ConfigOptionFloatOrPercent(15, false)); + + def = this->add("overhang_speed_1", coFloatOrPercent); + def->label = L("speed for 25% overlap"); + def->category = L("Speed"); + def->tooltip = overhang_speed_setting_description; + def->sidetext = L("mm/s or %"); + def->min = 0; + def->mode = comExpert; + def->set_default_value(new ConfigOptionFloatOrPercent(15, false)); + + def = this->add("overhang_speed_2", coFloatOrPercent); + def->label = L("speed for 50% overlap"); + def->category = L("Speed"); + def->tooltip = overhang_speed_setting_description; + def->sidetext = L("mm/s or %"); + def->min = 0; + def->mode = comExpert; + def->set_default_value(new ConfigOptionFloatOrPercent(20, false)); + + def = this->add("overhang_speed_3", coFloatOrPercent); + def->label = L("speed for 75% overlap"); + def->category = L("Speed"); + def->tooltip = overhang_speed_setting_description; + def->sidetext = L("mm/s or %"); + def->min = 0; + def->mode = comExpert; + def->set_default_value(new ConfigOptionFloatOrPercent(25, false)); + + def = this->add("enable_dynamic_fan_speeds", coBools); + def->label = L("Enable dynamic fan speeds"); + def->tooltip = L("This setting enables dynamic fan speed control on overhangs."); + def->mode = comExpert; + def->set_default_value(new ConfigOptionBools{false}); + + // TRN FilamentSettings : "Dynamic fan speeds" + auto fan_speed_setting_description = L( + "Overhang size is expressed as a percentage of overlap of the extrusion with the previous layer: " + "100% would be full overlap (no overhang), while 0% represents full overhang (floating extrusion, bridge). " + "Fan speeds for overhang sizes in between are calculated via linear interpolation."); + + def = this->add("overhang_fan_speed_0", coInts); + def->label = L("speed for 0% overlap (bridge)"); + def->tooltip = fan_speed_setting_description; + def->sidetext = L("%"); + def->min = 0; + def->max = 100; + def->mode = comExpert; + def->set_default_value(new ConfigOptionInts{0}); + + def = this->add("overhang_fan_speed_1", coInts); + def->label = L("speed for 25% overlap"); + def->tooltip = fan_speed_setting_description; + def->sidetext = L("%"); + def->min = 0; + def->max = 100; + def->mode = comExpert; + def->set_default_value(new ConfigOptionInts{0}); + + def = this->add("overhang_fan_speed_2", coInts); + def->label = L("speed for 50% overlap"); + def->tooltip = fan_speed_setting_description; + def->sidetext = L("%"); + def->min = 0; + def->max = 100; + def->mode = comExpert; + def->set_default_value(new ConfigOptionInts{0}); + + def = this->add("overhang_fan_speed_3", coInts); + def->label = L("speed for 75% overlap"); + def->tooltip = fan_speed_setting_description; + def->sidetext = L("%"); + def->min = 0; + def->max = 100; + def->mode = comExpert; + def->set_default_value(new ConfigOptionInts{0}); + def = this->add("brim_width", coFloat); def->label = L("Brim width"); def->category = L("Skirt and brim"); @@ -527,15 +640,12 @@ void PrintConfigDef::init_fff_params() def->label = L("Brim type"); def->category = L("Skirt and brim"); def->tooltip = L("The places where the brim will be printed around each object on the first layer."); - def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); - def->enum_values.emplace_back("no_brim"); - def->enum_values.emplace_back("outer_only"); - def->enum_values.emplace_back("inner_only"); - def->enum_values.emplace_back("outer_and_inner"); - def->enum_labels.emplace_back(L("No brim")); - def->enum_labels.emplace_back(L("Outer brim only")); - def->enum_labels.emplace_back(L("Inner brim only")); - def->enum_labels.emplace_back(L("Outer and inner brim")); + def->set_enum({ + { "no_brim", L("No brim") }, + { "outer_only", L("Outer brim only") }, + { "inner_only", L("Inner brim only") }, + { "outer_and_inner", L("Outer and inner brim") } + }); def->mode = comSimple; def->set_default_value(new ConfigOptionEnum(btOuterOnly)); @@ -548,14 +658,6 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloat(0.f)); - def = this->add("clip_multipart_objects", coBool); - def->label = L("Clip multi-part objects"); - def->tooltip = L("When printing multi-material objects, this settings will make Slic3r " - "to clip the overlapping object parts one by the other " - "(2nd part will be clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc)."); - def->mode = comExpert; - def->set_default_value(new ConfigOptionBool(true)); - def = this->add("colorprint_heights", coFloats); def->label = L("Colorprint height"); def->tooltip = L("Heights at which a filament change is to occur."); @@ -703,36 +805,21 @@ void PrintConfigDef::init_fff_params() def->mode = comExpert; def->set_default_value(new ConfigOptionStrings { "; Filament-specific end gcode \n;END gcode for filament\n" }); - def = this->add("ensure_vertical_shell_thickness", coBool); - def->label = L("Ensure vertical shell thickness"); - def->category = L("Layers and Perimeters"); - def->tooltip = L("Add solid infill near sloping surfaces to guarantee the vertical shell thickness " - "(top+bottom solid layers)."); - def->mode = comAdvanced; - def->set_default_value(new ConfigOptionBool(false)); - auto def_top_fill_pattern = def = this->add("top_fill_pattern", coEnum); def->label = L("Top fill pattern"); def->category = L("Infill"); def->tooltip = L("Fill pattern for top infill. This only affects the top visible layer, and not its adjacent solid shells."); def->cli = "top-fill-pattern|external-fill-pattern|solid-fill-pattern"; - def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); - def->enum_values.push_back("rectilinear"); - def->enum_values.push_back("monotonic"); - def->enum_values.push_back("monotoniclines"); - def->enum_values.push_back("alignedrectilinear"); - def->enum_values.push_back("concentric"); - def->enum_values.push_back("hilbertcurve"); - def->enum_values.push_back("archimedeanchords"); - def->enum_values.push_back("octagramspiral"); - def->enum_labels.push_back(L("Rectilinear")); - def->enum_labels.push_back(L("Monotonic")); - def->enum_labels.push_back(L("Monotonic Lines")); - def->enum_labels.push_back(L("Aligned Rectilinear")); - def->enum_labels.push_back(L("Concentric")); - def->enum_labels.push_back(L("Hilbert Curve")); - def->enum_labels.push_back(L("Archimedean Chords")); - def->enum_labels.push_back(L("Octagram Spiral")); + def->set_enum({ + { "rectilinear", L("Rectilinear") }, + { "monotonic", L("Monotonic") }, + { "monotoniclines", L("Monotonic Lines") }, + { "alignedrectilinear", L("Aligned Rectilinear") }, + { "concentric", L("Concentric") }, + { "hilbertcurve", L("Hilbert Curve") }, + { "archimedeanchords", L("Archimedean Chords") }, + { "octagramspiral", L("Octagram Spiral") } + }); // solid_fill_pattern is an obsolete equivalent to top_fill_pattern/bottom_fill_pattern. def->aliases = { "solid_fill_pattern", "external_fill_pattern" }; @@ -743,9 +830,7 @@ void PrintConfigDef::init_fff_params() def->category = L("Infill"); def->tooltip = L("Fill pattern for bottom infill. This only affects the bottom external visible layer, and not its adjacent solid shells."); def->cli = "bottom-fill-pattern|external-fill-pattern|solid-fill-pattern"; - def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); - def->enum_values = def_top_fill_pattern->enum_values; - def->enum_labels = def_top_fill_pattern->enum_labels; + def->enum_def = Slic3r::clonable_ptr(def_top_fill_pattern->enum_def->clone()); def->aliases = def_top_fill_pattern->aliases; def->set_default_value(new ConfigOptionEnum(ipMonotonic)); @@ -790,19 +875,22 @@ void PrintConfigDef::init_fff_params() def->mode = comExpert; def->set_default_value(new ConfigOptionBool(true)); + def = this->add("extra_perimeters_on_overhangs", coBool); + def->label = L("Extra perimeters on overhangs (Experimental)"); + def->category = L("Layers and Perimeters"); + def->tooltip = L("Detect overhang areas where bridges cannot be anchored, and fill them with " + "extra perimeter paths. These paths are anchored to the nearby non-overhang area when possible."); + def->mode = comExpert; + def->set_default_value(new ConfigOptionBool(false)); + def = this->add("extruder", coInt); - def->gui_type = ConfigOptionDef::GUIType::i_enum_open; def->label = L("Extruder"); def->category = L("Extruders"); def->tooltip = L("The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support extruders."); def->min = 0; // 0 = inherit defaults - def->enum_labels.push_back(L("default")); // override label for item 0 - def->enum_labels.push_back("1"); - def->enum_labels.push_back("2"); - def->enum_labels.push_back("3"); - def->enum_labels.push_back("4"); - def->enum_labels.push_back("5"); + def->set_enum_labels(ConfigOptionDef::GUIType::i_enum_open, + { L("default"), "1", "2", "3", "4", "5" }); // override label for item 0 def = this->add("extruder_clearance_height", coFloat); def->label = L("Height"); @@ -1036,29 +1124,29 @@ void PrintConfigDef::init_fff_params() def = this->add("filament_type", coStrings); def->label = L("Filament type"); def->tooltip = L("The filament material type for use in custom G-codes."); - def->gui_type = ConfigOptionDef::GUIType::f_enum_open; def->gui_flags = "show_value"; - def->enum_values.push_back("PLA"); - def->enum_values.push_back("PET"); - def->enum_values.push_back("ABS"); - def->enum_values.push_back("ASA"); - def->enum_values.push_back("FLEX"); - def->enum_values.push_back("HIPS"); - def->enum_values.push_back("EDGE"); - def->enum_values.push_back("NGEN"); - def->enum_values.push_back("PA"); - def->enum_values.push_back("NYLON"); - def->enum_values.push_back("PVA"); - def->enum_values.push_back("PC"); - def->enum_values.push_back("PP"); - def->enum_values.push_back("PEI"); - def->enum_values.push_back("PEEK"); - def->enum_values.push_back("PEKK"); - def->enum_values.push_back("POM"); - def->enum_values.push_back("PSU"); - def->enum_values.push_back("PVDF"); - def->enum_values.push_back("SCAFF"); - + def->set_enum_values(ConfigOptionDef::GUIType::select_open, { + "PLA", + "PET", + "ABS", + "ASA", + "FLEX", + "HIPS", + "EDGE", + "NGEN", + "PA", + "NYLON", + "PVA", + "PC", + "PP", + "PEI", + "PEEK", + "PEKK", + "POM", + "PSU", + "PVDF", + "SCAFF" + }); def->mode = comAdvanced; def->set_default_value(new ConfigOptionStrings { "PLA" }); @@ -1106,7 +1194,6 @@ void PrintConfigDef::init_fff_params() def->set_default_value(new ConfigOptionFloat(45)); def = this->add("fill_density", coPercent); - def->gui_type = ConfigOptionDef::GUIType::f_enum_open; def->gui_flags = "show_value"; def->label = L("Fill density"); def->category = L("Infill"); @@ -1114,75 +1201,47 @@ void PrintConfigDef::init_fff_params() def->sidetext = L("%"); def->min = 0; def->max = 100; - def->enum_values.push_back("0"); - def->enum_values.push_back("5"); - def->enum_values.push_back("10"); - def->enum_values.push_back("15"); - def->enum_values.push_back("20"); - def->enum_values.push_back("25"); - def->enum_values.push_back("30"); - def->enum_values.push_back("40"); - def->enum_values.push_back("50"); - def->enum_values.push_back("60"); - def->enum_values.push_back("70"); - def->enum_values.push_back("80"); - def->enum_values.push_back("90"); - def->enum_values.push_back("100"); - def->enum_labels.push_back("0%"); - def->enum_labels.push_back("5%"); - def->enum_labels.push_back("10%"); - def->enum_labels.push_back("15%"); - def->enum_labels.push_back("20%"); - def->enum_labels.push_back("25%"); - def->enum_labels.push_back("30%"); - def->enum_labels.push_back("40%"); - def->enum_labels.push_back("50%"); - def->enum_labels.push_back("60%"); - def->enum_labels.push_back("70%"); - def->enum_labels.push_back("80%"); - def->enum_labels.push_back("90%"); - def->enum_labels.push_back("100%"); + def->set_enum_values(ConfigOptionDef::GUIType::f_enum_open, { + { "0", "0%" }, + { "5", "5%" }, + { "10", "10%" }, + { "15", "15%" }, + { "20", "20%" }, + { "25", "25%" }, + { "30", "30%" }, + { "40", "40%" }, + { "50", "50%" }, + { "60", "60%" }, + { "70", "70%" }, + { "80", "80%" }, + { "90", "90%" }, + { "100", "100%" } + }); def->set_default_value(new ConfigOptionPercent(20)); def = this->add("fill_pattern", coEnum); def->label = L("Fill pattern"); def->category = L("Infill"); def->tooltip = L("Fill pattern for general low-density infill."); - def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); - def->enum_values.push_back("rectilinear"); - def->enum_values.push_back("alignedrectilinear"); - def->enum_values.push_back("grid"); - def->enum_values.push_back("triangles"); - def->enum_values.push_back("stars"); - def->enum_values.push_back("cubic"); - def->enum_values.push_back("line"); - def->enum_values.push_back("concentric"); - def->enum_values.push_back("honeycomb"); - def->enum_values.push_back("3dhoneycomb"); - def->enum_values.push_back("gyroid"); - def->enum_values.push_back("hilbertcurve"); - def->enum_values.push_back("archimedeanchords"); - def->enum_values.push_back("octagramspiral"); - def->enum_values.push_back("adaptivecubic"); - def->enum_values.push_back("supportcubic"); - def->enum_values.push_back("lightning"); - def->enum_labels.push_back(L("Rectilinear")); - def->enum_labels.push_back(L("Aligned Rectilinear")); - def->enum_labels.push_back(L("Grid")); - def->enum_labels.push_back(L("Triangles")); - def->enum_labels.push_back(L("Stars")); - def->enum_labels.push_back(L("Cubic")); - def->enum_labels.push_back(L("Line")); - def->enum_labels.push_back(L("Concentric")); - def->enum_labels.push_back(L("Honeycomb")); - def->enum_labels.push_back(L("3D Honeycomb")); - def->enum_labels.push_back(L("Gyroid")); - def->enum_labels.push_back(L("Hilbert Curve")); - def->enum_labels.push_back(L("Archimedean Chords")); - def->enum_labels.push_back(L("Octagram Spiral")); - def->enum_labels.push_back(L("Adaptive Cubic")); - def->enum_labels.push_back(L("Support Cubic")); - def->enum_labels.push_back(L("Lightning")); + def->set_enum({ + { "rectilinear", L("Rectilinear") }, + { "alignedrectilinear", L("Aligned Rectilinear") }, + { "grid", L("Grid") }, + { "triangles", L("Triangles")}, + { "stars", L("Stars")}, + { "cubic", L("Cubic")}, + { "line", L("Line")}, + { "concentric", L("Concentric")}, + { "honeycomb", L("Honeycomb")}, + { "3dhoneycomb", L("3D Honeycomb")}, + { "gyroid", L("Gyroid")}, + { "hilbertcurve", L("Hilbert Curve")}, + { "archimedeanchords", L("Archimedean Chords")}, + { "octagramspiral", L("Octagram Spiral")}, + { "adaptivecubic", L("Adaptive Cubic")}, + { "supportcubic", L("Support Cubic")}, + { "lightning", L("Lightning")} + }); def->set_default_value(new ConfigOptionEnum(ipStars)); def = this->add("first_layer_acceleration", coFloat); @@ -1283,14 +1342,11 @@ void PrintConfigDef::init_fff_params() def->label = L("Fuzzy Skin"); def->category = L("Fuzzy Skin"); def->tooltip = L("Fuzzy skin type."); - - def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); - def->enum_values.push_back("none"); - def->enum_values.push_back("external"); - def->enum_values.push_back("all"); - def->enum_labels.push_back(L("None")); - def->enum_labels.push_back(L("Outside walls")); - def->enum_labels.push_back(L("All walls")); + def->set_enum({ + { "none", L("None") }, + { "external", L("Outside walls") }, + { "all", L("All walls") } + }); def->mode = comSimple; def->set_default_value(new ConfigOptionEnum(FuzzySkinType::None)); @@ -1344,31 +1400,21 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Some G/M-code commands, including temperature control and others, are not universal. " "Set this option to your printer's firmware to get a compatible output. " "The \"No extrusion\" flavor prevents PrusaSlicer from exporting any extrusion value at all."); - def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); - def->enum_values.push_back("reprap"); - def->enum_values.push_back("reprapfirmware"); - def->enum_values.push_back("repetier"); - def->enum_values.push_back("teacup"); - def->enum_values.push_back("makerware"); - def->enum_values.push_back("marlin"); - def->enum_values.push_back("marlin2"); - def->enum_values.push_back("sailfish"); - def->enum_values.push_back("mach3"); - def->enum_values.push_back("machinekit"); - def->enum_values.push_back("smoothie"); - def->enum_values.push_back("no-extrusion"); - def->enum_labels.push_back("RepRap/Sprinter"); - def->enum_labels.push_back("RepRapFirmware"); - def->enum_labels.push_back("Repetier"); - def->enum_labels.push_back("Teacup"); - def->enum_labels.push_back("MakerWare (MakerBot)"); - def->enum_labels.push_back("Marlin (legacy)"); - def->enum_labels.push_back("Marlin 2"); - def->enum_labels.push_back("Sailfish (MakerBot)"); - def->enum_labels.push_back("Mach3/LinuxCNC"); - def->enum_labels.push_back("Machinekit"); - def->enum_labels.push_back("Smoothie"); - def->enum_labels.push_back(L("No extrusion")); + def->set_enum({ + { "reprap", "RepRap/Sprinter" }, + { "reprapfirmware", "RepRapFirmware" }, + { "repetier", "Repetier" }, + { "teacup", "Teacup" }, + { "makerware", "MakerWare (MakerBot)" }, + { "marlin", "Marlin (legacy)" }, + { "marlin2", "Marlin 2" }, + { "klipper", "Klipper" }, + { "sailfish", "Sailfish (MakerBot)" }, + { "mach3", "Mach3/LinuxCNC" }, + { "machinekit", "Machinekit" }, + { "smoothie", "Smoothie" }, + { "no-extrusion", L("No extrusion") } + }); def->mode = comExpert; def->set_default_value(new ConfigOptionEnum(gcfRepRapSprinter)); @@ -1420,7 +1466,15 @@ void PrintConfigDef::init_fff_params() def->min = 0; def->mode = comExpert; def->set_default_value(new ConfigOptionFloat(0)); - + + def = this->add("travel_acceleration", coFloat); + def->label = L("Travel"); + def->tooltip = L("This is the acceleration your printer will use for travel moves. Set zero to disable " + "acceleration control for travel."); + def->sidetext = L("mm/s²"); + def->min = 0; + def->mode = comExpert; + def->set_default_value(new ConfigOptionFloat(0)); def = this->add("infill_every_layers", coInt); def->label = L("Combine infill every"); @@ -1445,19 +1499,14 @@ void PrintConfigDef::init_fff_params() def->sidetext = L("mm or %"); def->ratio_over = "infill_extrusion_width"; def->max_literal = 1000; - def->gui_type = ConfigOptionDef::GUIType::f_enum_open; - def->enum_values.push_back("0"); - def->enum_values.push_back("1"); - def->enum_values.push_back("2"); - def->enum_values.push_back("5"); - def->enum_values.push_back("10"); - def->enum_values.push_back("1000"); - def->enum_labels.push_back(L("0 (no open anchors)")); - def->enum_labels.push_back(L("1 mm")); - def->enum_labels.push_back(L("2 mm")); - def->enum_labels.push_back(L("5 mm")); - def->enum_labels.push_back(L("10 mm")); - def->enum_labels.push_back(L("1000 (unlimited)")); + def->set_enum_values(ConfigOptionDef::GUIType::f_enum_open, { + { "0", L("0 (no open anchors)") }, + { "1", L("1 mm") }, + { "2", L("2 mm") }, + { "5", L("5 mm") }, + { "10", L("10 mm") }, + { "1000", L("1000 (unlimited)") } + }); def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloatOrPercent(600, true)); @@ -1473,14 +1522,14 @@ void PrintConfigDef::init_fff_params() def->sidetext = def_infill_anchor_min->sidetext; def->ratio_over = def_infill_anchor_min->ratio_over; def->max_literal = def_infill_anchor_min->max_literal; - def->gui_type = def_infill_anchor_min->gui_type; - def->enum_values = def_infill_anchor_min->enum_values; - def->enum_labels.push_back(L("0 (not anchored)")); - def->enum_labels.push_back(L("1 mm")); - def->enum_labels.push_back(L("2 mm")); - def->enum_labels.push_back(L("5 mm")); - def->enum_labels.push_back(L("10 mm")); - def->enum_labels.push_back(L("1000 (unlimited)")); + def->set_enum_values(ConfigOptionDef::GUIType::f_enum_open, { + { "0", L("0 (not anchored)") }, + { "1", L("1 mm") }, + { "2", L("2 mm") }, + { "5", L("5 mm") }, + { "10", L("10 mm") }, + { "1000", L("1000 (unlimited)") } + }); def->mode = def_infill_anchor_min->mode; def->set_default_value(new ConfigOptionFloatOrPercent(50, false)); @@ -1511,14 +1560,14 @@ void PrintConfigDef::init_fff_params() def->mode = comExpert; def->set_default_value(new ConfigOptionBool(false)); - def = this->add("infill_only_where_needed", coBool); - def->label = L("Only infill where needed"); - def->category = L("Infill"); - def->tooltip = L("This option will limit infill to the areas actually needed for supporting ceilings " - "(it will act as internal support material). If enabled, slows down the G-code generation " - "due to the multiple checks involved."); - def->mode = comAdvanced; - def->set_default_value(new ConfigOptionBool(false)); + // def = this->add("infill_only_where_needed", coBool); + // def->label = L("Only infill where needed"); + // def->category = L("Infill"); + // def->tooltip = L("This option will limit infill to the areas actually needed for supporting ceilings " + // "(it will act as internal support material). If enabled, slows down the G-code generation " + // "due to the multiple checks involved."); + // def->mode = comAdvanced; + // def->set_default_value(new ConfigOptionBool(false)); def = this->add("infill_overlap", coFloatOrPercent); def->label = L("Infill/perimeters overlap"); @@ -1584,13 +1633,11 @@ void PrintConfigDef::init_fff_params() def->label = L("Ironing Type"); def->category = L("Ironing"); def->tooltip = L("Ironing Type"); - def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); - def->enum_values.push_back("top"); - def->enum_values.push_back("topmost"); - def->enum_values.push_back("solid"); - def->enum_labels.push_back(L("All top surfaces")); - def->enum_labels.push_back(L("Topmost surface only")); - def->enum_labels.push_back(L("All solid surfaces")); + def->set_enum({ + { "top", L("All top surfaces") }, + { "topmost", L("Topmost surface only") }, + { "solid", L("All solid surfaces") } + }); def->mode = comAdvanced; def->set_default_value(new ConfigOptionEnum(IroningType::TopSurfaces)); @@ -1654,13 +1701,11 @@ void PrintConfigDef::init_fff_params() def->full_label = L("Purpose of Machine Limits"); def->category = L("Machine limits"); def->tooltip = L("How to apply the Machine Limits"); - def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); - def->enum_values.push_back("emit_to_gcode"); - def->enum_values.push_back("time_estimate_only"); - def->enum_values.push_back("ignore"); - def->enum_labels.push_back(L("Emit to G-code")); - def->enum_labels.push_back(L("Use for time estimate")); - def->enum_labels.push_back(L("Ignore")); + def->set_enum({ + { "emit_to_gcode", L("Emit to G-code") }, + { "time_estimate_only", L("Use for time estimate") }, + { "ignore", L("Ignore") } + }); def->mode = comAdvanced; def->set_default_value(new ConfigOptionEnum(MachineLimitsUsage::TimeEstimateOnly)); @@ -1758,9 +1803,7 @@ void PrintConfigDef::init_fff_params() def = this->add("machine_max_acceleration_extruding", coFloats); def->full_label = L("Maximum acceleration when extruding"); def->category = L("Machine limits"); - def->tooltip = L("Maximum acceleration when extruding (M204 P)\n\n" - "Marlin (legacy) firmware flavor will use this also " - "as travel acceleration (M204 T)."); + def->tooltip = L("Maximum acceleration when extruding"); def->sidetext = L("mm/s²"); def->min = 0; def->mode = comAdvanced; @@ -1771,7 +1814,8 @@ void PrintConfigDef::init_fff_params() def = this->add("machine_max_acceleration_retracting", coFloats); def->full_label = L("Maximum acceleration when retracting"); def->category = L("Machine limits"); - def->tooltip = L("Maximum acceleration when retracting (M204 R)"); + def->tooltip = L("Maximum acceleration when retracting.\n\n" + "Not used for RepRapFirmware, which does not support it."); def->sidetext = L("mm/s²"); def->min = 0; def->mode = comAdvanced; @@ -1781,7 +1825,7 @@ void PrintConfigDef::init_fff_params() def = this->add("machine_max_acceleration_travel", coFloats); def->full_label = L("Maximum acceleration for travel moves"); def->category = L("Machine limits"); - def->tooltip = L("Maximum acceleration for travel moves (M204 T)"); + def->tooltip = L("Maximum acceleration for travel moves."); def->sidetext = L("mm/s²"); def->min = 0; def->mode = comAdvanced; @@ -1906,24 +1950,20 @@ void PrintConfigDef::init_fff_params() def->label = L("Host Type"); def->tooltip = L("Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host."); - def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); - def->enum_values.push_back("prusalink"); - def->enum_values.push_back("octoprint"); - def->enum_values.push_back("duet"); - def->enum_values.push_back("flashair"); - def->enum_values.push_back("astrobox"); - def->enum_values.push_back("repetier"); - def->enum_values.push_back("mks"); - def->enum_labels.push_back("PrusaLink"); - def->enum_labels.push_back("OctoPrint"); - def->enum_labels.push_back("Duet"); - def->enum_labels.push_back("FlashAir"); - def->enum_labels.push_back("AstroBox"); - def->enum_labels.push_back("Repetier"); - def->enum_labels.push_back("MKS"); + def->set_enum({ + { "prusalink", "PrusaLink" }, + { "prusaconnect", "PrusaConnect" }, + { "octoprint", "OctoPrint" }, + { "mainsail", "Mainsail/Fluidd" }, + { "duet", "Duet" }, + { "flashair", "FlashAir" }, + { "astrobox", "AstroBox" }, + { "repetier", "Repetier" }, + { "mks", "MKS" } + }); def->mode = comAdvanced; def->cli = ConfigOptionDef::nocli; - def->set_default_value(new ConfigOptionEnum(htOctoPrint)); + def->set_default_value(new ConfigOptionEnum(htPrusaLink)); def = this->add("only_retract_when_crossing_perimeters", coBool); def->label = L("Only retract when crossing perimeters"); @@ -1934,9 +1974,8 @@ void PrintConfigDef::init_fff_params() def = this->add("ooze_prevention", coBool); def->label = L("Enable"); - def->tooltip = L("This option will drop the temperature of the inactive extruders to prevent oozing. " - "It will enable a tall skirt automatically and move extruders outside such " - "skirt when changing temperatures."); + // TRN PrintSettings: Enable ooze prevention + def->tooltip = L("This option will drop the temperature of the inactive extruders to prevent oozing."); def->mode = comExpert; def->set_default_value(new ConfigOptionBool(false)); @@ -2263,18 +2302,22 @@ void PrintConfigDef::init_fff_params() def->label = L("Seam position"); def->category = L("Layers and Perimeters"); def->tooltip = L("Position of perimeters starting points."); - def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); - def->enum_values.push_back("random"); - def->enum_values.push_back("nearest"); - def->enum_values.push_back("aligned"); - def->enum_values.push_back("rear"); - def->enum_labels.push_back(L("Random")); - def->enum_labels.push_back(L("Nearest")); - def->enum_labels.push_back(L("Aligned")); - def->enum_labels.push_back(L("Rear")); + def->set_enum({ + { "random", L("Random") }, + { "nearest", L("Nearest") }, + { "aligned", L("Aligned") }, + { "rear", L("Rear") } + }); def->mode = comSimple; def->set_default_value(new ConfigOptionEnum(spAligned)); + def = this->add("staggered_inner_seams", coBool); + def->label = L("Staggered inner seams"); + // TRN PrintSettings: "Staggered inner seams" + def->tooltip = L("This option causes the inner seams to be shifted backwards based on their depth, forming a zigzag pattern."); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool(false)); + #if 0 def = this->add("seam_preferred_direction", coFloat); // def->gui_type = ConfigOptionDef::GUIType::slider; @@ -2317,13 +2360,11 @@ void PrintConfigDef::init_fff_params() "Enabled = skirt is as tall as the highest printed object.\n" "Limited = skirt is as tall as specified by skirt_height.\n" "This is useful to protect an ABS or ASA print from warping and detaching from print bed due to wind draft."); - def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); - def->enum_values.push_back("disabled"); - def->enum_values.push_back("limited"); - def->enum_values.push_back("enabled"); - def->enum_labels.push_back(L("Disabled")); - def->enum_labels.push_back(L("Limited")); - def->enum_labels.push_back(L("Enabled")); + def->set_enum({ + { "disabled", L("Disabled") }, + { "limited", L("Limited") }, + { "enabled", L("Enabled") } + }); def->mode = comAdvanced; def->set_default_value(new ConfigOptionEnum(dsDisabled)); @@ -2438,23 +2479,35 @@ void PrintConfigDef::init_fff_params() def = this->add("standby_temperature_delta", coInt); def->label = L("Temperature variation"); + // TRN PrintSettings : "Ooze prevention" > "Temperature variation" def->tooltip = L("Temperature difference to be applied when an extruder is not active. " - "Enables a full-height \"sacrificial\" skirt on which the nozzles are periodically wiped."); + "The value is not used when 'idle_temperature' in filament settings " + "is defined."); def->sidetext = "∆°C"; def->min = -max_temp; def->max = max_temp; def->mode = comExpert; def->set_default_value(new ConfigOptionInt(-5)); + def = this->add("autoemit_temperature_commands", coBool); + def->label = L("Emit temperature commands automatically"); + def->tooltip = L("When enabled, PrusaSlicer will check whether your Custom Start G-Code contains M104 or M190. " + "If so, the temperatures will not be emitted automatically so you're free to customize " + "the order of heating commands and other custom actions. Note that you can use " + "placeholder variables for all PrusaSlicer settings, so you can put " + "a \"M109 S[first_layer_temperature]\" command wherever you want.\n" + "If your Custom Start G-Code does NOT contain M104 or M190, " + "PrusaSlicer will execute the Start G-Code after bed reached its target temperature " + "and extruder just started heating.\n\n" + "When disabled, PrusaSlicer will NOT emit commands to heat up extruder and bed, " + "leaving both to Custom Start G-Code."); + def->mode = comExpert; + def->set_default_value(new ConfigOptionBool(true)); + def = this->add("start_gcode", coString); def->label = L("Start G-code"); - def->tooltip = L("This start procedure is inserted at the beginning, after bed has reached " - "the target temperature and extruder just started heating, and before extruder " - "has finished heating. If PrusaSlicer detects M104 or M190 in your custom codes, " - "such commands will not be prepended automatically so you're free to customize " - "the order of heating commands and other custom actions. Note that you can use " - "placeholder variables for all PrusaSlicer settings, so you can put " - "a \"M109 S[first_layer_temperature]\" command wherever you want."); + def->tooltip = L("This start procedure is inserted at the beginning, possibly prepended by " + "temperature-changing commands. See 'autoemit_temperature_commands'."); def->multiline = true; def->full_width = true; def->height = 12; @@ -2539,13 +2592,11 @@ void PrintConfigDef::init_fff_params() def->label = L("Slicing Mode"); def->category = L("Advanced"); def->tooltip = L("Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model."); - def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); - def->enum_values.push_back("regular"); - def->enum_values.push_back("even_odd"); - def->enum_values.push_back("close_holes"); - def->enum_labels.push_back(L("Regular")); - def->enum_labels.push_back(L("Even-odd")); - def->enum_labels.push_back(L("Close holes")); + def->set_enum({ + { "regular", L("Regular") }, + { "even_odd", L("Even-odd") }, + { "close_holes", L("Close holes") } + }); def->mode = comAdvanced; def->set_default_value(new ConfigOptionEnum(SlicingMode::Regular)); @@ -2594,7 +2645,6 @@ void PrintConfigDef::init_fff_params() def->set_default_value(new ConfigOptionBool(false)); def = this->add("support_material_contact_distance", coFloat); - def->gui_type = ConfigOptionDef::GUIType::f_enum_open; def->label = L("Top contact Z distance"); def->category = L("Support material"); def->tooltip = L("The vertical distance between object and support material interface. " @@ -2602,30 +2652,27 @@ void PrintConfigDef::init_fff_params() "for the first object layer."); def->sidetext = L("mm"); // def->min = 0; - def->enum_values.push_back("0"); - def->enum_values.push_back("0.1"); - def->enum_values.push_back("0.2"); - def->enum_labels.push_back(L("0 (soluble)")); - def->enum_labels.push_back(L("0.1 (detachable)")); - def->enum_labels.push_back(L("0.2 (detachable)")); + def->set_enum_values(ConfigOptionDef::GUIType::f_enum_open, { + { "0", L("0 (soluble)") }, + { "0.1", L("0.1 (detachable)") }, + { "0.2", L("0.2 (detachable)") } + }); def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloat(0.2)); def = this->add("support_material_bottom_contact_distance", coFloat); - def->gui_type = ConfigOptionDef::GUIType::f_enum_open; def->label = L("Bottom contact Z distance"); def->category = L("Support material"); def->tooltip = L("The vertical distance between the object top surface and the support material interface. " "If set to zero, support_material_contact_distance will be used for both top and bottom contact Z distances."); def->sidetext = L("mm"); // def->min = 0; - def->enum_values.push_back("0"); - def->enum_values.push_back("0.1"); - def->enum_values.push_back("0.2"); - //TRN To be shown in Print Settings "Bottom contact Z distance". Have to be as short as possible - def->enum_labels.push_back(L("Same as top")); - def->enum_labels.push_back("0.1"); - def->enum_labels.push_back("0.2"); + def->set_enum_values(ConfigOptionDef::GUIType::f_enum_open, { + //TRN Print Settings: "Bottom contact Z distance". Have to be as short as possible + { "0", L("Same as top") }, + { "0.1", "0.1" }, + { "0.2", "0.2" } + }); def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloat(0)); @@ -2679,37 +2726,36 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionInt(1)); - auto support_material_interface_layers = def = this->add("support_material_interface_layers", coInt); - def->gui_type = ConfigOptionDef::GUIType::i_enum_open; + def = this->add("support_material_interface_layers", coInt); def->label = L("Top interface layers"); def->category = L("Support material"); def->tooltip = L("Number of interface layers to insert between the object(s) and support material."); def->sidetext = L("layers"); def->min = 0; - def->enum_values.push_back("0"); - def->enum_values.push_back("1"); - def->enum_values.push_back("2"); - def->enum_values.push_back("3"); - def->enum_labels.push_back(L("0 (off)")); - def->enum_labels.push_back(L("1 (light)")); - def->enum_labels.push_back(L("2 (default)")); - def->enum_labels.push_back(L("3 (heavy)")); + def->set_enum_values(ConfigOptionDef::GUIType::i_enum_open, { + { "0", L("0 (off)") }, + { "1", L("1 (light)") }, + { "2", L("2 (default)") }, + { "3", L("3 (heavy)") } + }); def->mode = comAdvanced; def->set_default_value(new ConfigOptionInt(3)); def = this->add("support_material_bottom_interface_layers", coInt); - def->gui_type = ConfigOptionDef::GUIType::i_enum_open; def->label = L("Bottom interface layers"); def->category = L("Support material"); def->tooltip = L("Number of interface layers to insert between the object(s) and support material. " "Set to -1 to use support_material_interface_layers"); def->sidetext = L("layers"); def->min = -1; - def->enum_values.push_back("-1"); - append(def->enum_values, support_material_interface_layers->enum_values); - //TRN To be shown in Print Settings "Bottom interface layers". Have to be as short as possible - def->enum_labels.push_back(L("Same as top")); - append(def->enum_labels, support_material_interface_layers->enum_labels); + def->set_enum_values(ConfigOptionDef::GUIType::i_enum_open, { + //TRN Print Settings: "Bottom interface layers". Have to be as short as possible + { "-1", L("Same as top") }, + { "0", L("0 (off)") }, + { "1", L("1 (light)") }, + { "2", L("2 (default)") }, + { "3", L("3 (heavy)") } + }); def->mode = comAdvanced; def->set_default_value(new ConfigOptionInt(-1)); @@ -2747,13 +2793,11 @@ void PrintConfigDef::init_fff_params() def->label = L("Pattern"); def->category = L("Support material"); def->tooltip = L("Pattern used to generate support material."); - def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); - def->enum_values.push_back("rectilinear"); - def->enum_values.push_back("rectilinear-grid"); - def->enum_values.push_back("honeycomb"); - def->enum_labels.push_back(L("Rectilinear")); - def->enum_labels.push_back(L("Rectilinear grid")); - def->enum_labels.push_back(L("Honeycomb")); + def->set_enum({ + { "rectilinear", L("Rectilinear") }, + { "rectilinear-grid", L("Rectilinear grid") }, + { "honeycomb", L("Honeycomb") } + }); def->mode = comAdvanced; def->set_default_value(new ConfigOptionEnum(smpRectilinear)); @@ -2763,13 +2807,11 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Pattern used to generate support material interface. " "Default pattern for non-soluble support interface is Rectilinear, " "while default pattern for soluble support interface is Concentric."); - def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); - def->enum_values.push_back("auto"); - def->enum_values.push_back("rectilinear"); - def->enum_values.push_back("concentric"); - def->enum_labels.push_back(L("Default")); - def->enum_labels.push_back(L("Rectilinear")); - def->enum_labels.push_back(L("Concentric")); + def->set_enum({ + { "auto", L("Default") }, + { "rectilinear", L("Rectilinear") }, + { "concentric", L("Concentric") } + }); def->mode = comAdvanced; def->set_default_value(new ConfigOptionEnum(smipRectilinear)); @@ -2797,19 +2839,21 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Style and shape of the support towers. Projecting the supports into a regular grid " "will create more stable supports, while snug support towers will save material and reduce " "object scarring."); - def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); - def->enum_values.push_back("grid"); - def->enum_values.push_back("snug"); - def->enum_labels.push_back(L("Grid")); - def->enum_labels.push_back(L("Snug")); + def->set_enum({ + { "grid", L("Grid") }, + { "snug", L("Snug") }, + { "organic", L("Organic") } + }); def->mode = comAdvanced; def->set_default_value(new ConfigOptionEnum(smsGrid)); def = this->add("support_material_synchronize_layers", coBool); def->label = L("Synchronize with object layers"); def->category = L("Support material"); + // TRN PrintSettings : "Synchronize with object layers" def->tooltip = L("Synchronize support layers with the object print layers. This is useful " - "with multi-material printers, where the extruder switch is expensive."); + "with multi-material printers, where the extruder switch is expensive. " + "This option is only available when top contact Z distance is set to zero."); def->mode = comExpert; def->set_default_value(new ConfigOptionBool(false)); @@ -2835,6 +2879,93 @@ void PrintConfigDef::init_fff_params() def->mode = comExpert; def->set_default_value(new ConfigOptionBool(true)); + def = this->add("support_tree_angle", coFloat); + def->label = L("Maximum Branch Angle"); + def->category = L("Support material"); + // TRN PrintSettings: "Organic supports" > "Maximum Branch Angle" + def->tooltip = L("The maximum angle of the branches, when the branches have to avoid the model. " + "Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach."); + def->sidetext = L("°"); + def->min = 0; + def->max = 85; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(40)); + + def = this->add("support_tree_angle_slow", coFloat); + def->label = L("Preferred Branch Angle"); + def->category = L("Support material"); + // TRN PrintSettings: "Organic supports" > "Preferred Branch Angle" + def->tooltip = L("The preferred angle of the branches, when they do not have to avoid the model. " + "Use a lower angle to make them more vertical and more stable. Use a higher angle for branches to merge faster."); + def->sidetext = L("°"); + def->min = 10; + def->max = 85; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(25)); + + def = this->add("support_tree_tip_diameter", coFloat); + def->label = L("Tip Diameter"); + def->category = L("Support material"); + // TRN PrintSettings: "Organic supports" > "Tip Diameter" + def->tooltip = L("The diameter of the top of the tip of the branches of organic support."); + def->sidetext = L("mm"); + def->min = 0; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(0.8)); + + def = this->add("support_tree_branch_diameter", coFloat); + def->label = L("Branch Diameter"); + def->category = L("Support material"); + // TRN PrintSettings: "Organic supports" > "Branch Diameter" + def->tooltip = L("The diameter of the thinnest branches of organic support. Thicker branches are more sturdy. " + "Branches towards the base will be thicker than this."); + def->sidetext = L("mm"); + def->min = 0; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(2)); + + def = this->add("support_tree_branch_diameter_angle", coFloat); + // TRN PrintSettings: #lmFIXME + def->label = L("Branch Diameter Angle"); + def->category = L("Support material"); + // TRN PrintSettings: "Organic supports" > "Branch Diameter Angle" + def->tooltip = L("The angle of the branches' diameter as they gradually become thicker towards the bottom. " + "An angle of 0 will cause the branches to have uniform thickness over their length. " + "A bit of an angle can increase stability of the organic support."); + def->sidetext = L("°"); + def->min = 0; + def->max = 15; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(5)); + + // Tree Support Branch Distance + // How far apart the branches need to be when they touch the model. Making this distance small will cause + // the tree support to touch the model at more points, causing better overhang but making support harder to remove. + def = this->add("support_tree_branch_distance", coFloat); + // TRN PrintSettings: #lmFIXME + def->label = L("Branch Distance"); + def->category = L("Support material"); + // TRN PrintSettings: "Organic supports" > "Branch Distance" + def->tooltip = L("How far apart the branches need to be when they touch the model. " + "Making this distance small will cause the tree support to touch the model at more points, " + "causing better overhang but making support harder to remove."); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(1.)); + + def = this->add("support_tree_top_rate", coPercent); + def->label = L("Branch Density"); + def->category = L("Support material"); + // TRN PrintSettings: "Organic supports" > "Branch Density" + def->tooltip = L("Adjusts the density of the support structure used to generate the tips of the branches. " + "A higher value results in better overhangs but the supports are harder to remove, " + "thus it is recommended to enable top support interfaces instead of a high branch density value " + "if dense interfaces are needed."); + def->sidetext = L("%"); + def->min = 5; + def->max_literal = 35; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionPercent(15)); + def = this->add("temperature", coInts); def->label = L("Other layers"); def->tooltip = L("Nozzle temperature for layers after the first one. Set this to zero to disable " @@ -2913,8 +3044,8 @@ void PrintConfigDef::init_fff_params() def->set_default_value(new ConfigOptionFloatOrPercent(15, false)); def = this->add("top_solid_layers", coInt); - //TRN To be shown in Print Settings "Top solid layers" - def->label = L("Top"); + //TRN Print Settings: "Top solid layers" + def->label = L_CONTEXT("Top", "Layers"); def->category = L("Layers and Perimeters"); def->tooltip = L("Number of solid layers to generate on top surfaces."); def->full_label = L("Top solid layers"); @@ -2922,8 +3053,7 @@ void PrintConfigDef::init_fff_params() def->set_default_value(new ConfigOptionInt(3)); def = this->add("top_solid_min_thickness", coFloat); - //TRN To be shown in Print Settings "Top solid layers" - def->label = L("Top"); + def->label = L_CONTEXT("Top", "Layers"); def->category = L("Layers and Perimeters"); def->tooltip = L("The number of top solid layers is increased above top_solid_layers if necessary to satisfy " "minimum thickness of top shell." @@ -3050,6 +3180,25 @@ void PrintConfigDef::init_fff_params() def->min = 0.; def->set_default_value(new ConfigOptionFloat(2.)); + def = this->add("wipe_tower_cone_angle", coFloat); + def->label = L("Stabilization cone apex angle"); + def->tooltip = L("Angle at the apex of the cone that is used to stabilize the wipe tower. " + "Larger angle means wider base."); + def->sidetext = L("°"); + def->mode = comAdvanced; + def->min = 0.; + def->max = 90.; + def->set_default_value(new ConfigOptionFloat(0.)); + + def = this->add("wipe_tower_extra_spacing", coPercent); + def->label = L("Wipe tower purge lines spacing"); + def->tooltip = L("Spacing of purge lines on the wipe tower."); + def->sidetext = L("%"); + def->mode = comExpert; + def->min = 100.; + def->max = 300.; + def->set_default_value(new ConfigOptionPercent(100.)); + def = this->add("wipe_into_infill", coBool); def->category = L("Wipe options"); def->label = L("Wipe into this object's infill"); @@ -3100,11 +3249,10 @@ void PrintConfigDef::init_fff_params() "very thin areas is used gap-fill. " "Arachne engine produces perimeters with variable extrusion width. " "This setting also affects the Concentric infill."); - def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); - def->enum_values.push_back("classic"); - def->enum_values.push_back("arachne"); - def->enum_labels.push_back(L("Classic")); - def->enum_labels.push_back(L("Arachne")); + def->set_enum({ + { "classic", L("Classic") }, + { "arachne", L("Arachne") } + }); def->mode = comAdvanced; def->set_default_value(new ConfigOptionEnum(PerimeterGeneratorType::Arachne)); @@ -3232,6 +3380,192 @@ void PrintConfigDef::init_extruder_option_keys() assert(std::is_sorted(m_extruder_retract_keys.begin(), m_extruder_retract_keys.end())); } +void PrintConfigDef::init_sla_support_params(const std::string &prefix) +{ + ConfigOptionDef* def; + + def = this->add(prefix + "support_head_front_diameter", coFloat); + def->label = L("Pinhead front diameter"); + def->category = L("Supports"); + def->tooltip = L("Diameter of the pointing side of the head"); + def->sidetext = L("mm"); + def->min = 0; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(0.4)); + + def = this->add(prefix + "support_head_penetration", coFloat); + def->label = L("Head penetration"); + def->category = L("Supports"); + def->tooltip = L("How much the pinhead has to penetrate the model surface"); + def->sidetext = L("mm"); + def->mode = comAdvanced; + def->min = 0; + def->set_default_value(new ConfigOptionFloat(0.2)); + + def = this->add(prefix + "support_head_width", coFloat); + def->label = L("Pinhead width"); + def->category = L("Supports"); + def->tooltip = L("Width from the back sphere center to the front sphere center"); + def->sidetext = L("mm"); + def->min = 0; + def->max = 20; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(1.0)); + + def = this->add(prefix + "support_pillar_diameter", coFloat); + def->label = L("Pillar diameter"); + def->category = L("Supports"); + def->tooltip = L("Diameter in mm of the support pillars"); + def->sidetext = L("mm"); + def->min = 0; + def->max = 15; + def->mode = comSimple; + def->set_default_value(new ConfigOptionFloat(1.0)); + + def = this->add(prefix + "support_small_pillar_diameter_percent", coPercent); + def->label = L("Small pillar diameter percent"); + def->category = L("Supports"); + def->tooltip = L("The percentage of smaller pillars compared to the normal pillar diameter " + "which are used in problematic areas where a normal pilla cannot fit."); + def->sidetext = L("%"); + def->min = 1; + def->max = 100; + def->mode = comExpert; + def->set_default_value(new ConfigOptionPercent(50)); + + def = this->add(prefix + "support_max_bridges_on_pillar", coInt); + def->label = L("Max bridges on a pillar"); + def->tooltip = L( + "Maximum number of bridges that can be placed on a pillar. Bridges " + "hold support point pinheads and connect to pillars as small branches."); + def->min = 0; + def->max = 50; + def->mode = comExpert; + def->set_default_value(new ConfigOptionInt(prefix == "branching" ? 2 : 3)); + + def = this->add(prefix + "support_max_weight_on_model", coFloat); + def->label = L("Max weight on model"); + def->category = L("Supports"); + def->tooltip = L( + "Maximum weight of sub-trees that terminate on the model instead of the print bed. The weight is the sum of the lenghts of all " + "branches emanating from the endpoint."); + def->sidetext = L("mm"); + def->min = 0; + def->mode = comExpert; + def->set_default_value(new ConfigOptionFloat(10.)); + + def = this->add(prefix + "support_pillar_connection_mode", coEnum); + def->label = L("Pillar connection mode"); + def->tooltip = L("Controls the bridge type between two neighboring pillars." + " Can be zig-zag, cross (double zig-zag) or dynamic which" + " will automatically switch between the first two depending" + " on the distance of the two pillars."); + def->set_enum( + ConfigOptionEnum::get_enum_names(), + { L("Zig-Zag"), L("Cross"), L("Dynamic") }); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionEnum(SLAPillarConnectionMode::dynamic)); + + def = this->add(prefix + "support_buildplate_only", coBool); + def->label = L("Support on build plate only"); + def->category = L("Supports"); + def->tooltip = L("Only create support if it lies on a build plate. Don't create support on a print."); + def->mode = comSimple; + def->set_default_value(new ConfigOptionBool(false)); + + def = this->add(prefix + "support_pillar_widening_factor", coFloat); + def->label = L("Pillar widening factor"); + def->category = L("Supports"); + + def->tooltip = + L("Merging bridges or pillars into another pillars can " + "increase the radius. Zero means no increase, one means " + "full increase. The exact amount of increase is unspecified and can " + "change in the future."); + + def->min = 0; + def->max = 1; + def->mode = comExpert; + def->set_default_value(new ConfigOptionFloat(0.5)); + + def = this->add(prefix + "support_base_diameter", coFloat); + def->label = L("Support base diameter"); + def->category = L("Supports"); + def->tooltip = L("Diameter in mm of the pillar base"); + def->sidetext = L("mm"); + def->min = 0; + def->max = 30; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(4.0)); + + def = this->add(prefix + "support_base_height", coFloat); + def->label = L("Support base height"); + def->category = L("Supports"); + def->tooltip = L("The height of the pillar base cone"); + def->sidetext = L("mm"); + def->min = 0; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(1.0)); + + def = this->add(prefix + "support_base_safety_distance", coFloat); + def->label = L("Support base safety distance"); + def->category = L("Supports"); + def->tooltip = L( + "The minimum distance of the pillar base from the model in mm. " + "Makes sense in zero elevation mode where a gap according " + "to this parameter is inserted between the model and the pad."); + def->sidetext = L("mm"); + def->min = 0; + def->max = 10; + def->mode = comExpert; + def->set_default_value(new ConfigOptionFloat(1)); + + def = this->add(prefix + "support_critical_angle", coFloat); + def->label = L("Critical angle"); + def->category = L("Supports"); + def->tooltip = L("The default angle for connecting support sticks and junctions."); + def->sidetext = L("°"); + def->min = 0; + def->max = 90; + def->mode = comExpert; + def->set_default_value(new ConfigOptionFloat(45)); + + def = this->add(prefix + "support_max_bridge_length", coFloat); + def->label = L("Max bridge length"); + def->category = L("Supports"); + def->tooltip = L("The max length of a bridge"); + def->sidetext = L("mm"); + def->min = 0; + def->mode = comAdvanced; + + double default_val = 15.0; + if (prefix == "branching") + default_val = 5.0; + + def->set_default_value(new ConfigOptionFloat(default_val)); + + def = this->add(prefix + "support_max_pillar_link_distance", coFloat); + def->label = L("Max pillar linking distance"); + def->category = L("Supports"); + def->tooltip = L("The max distance of two pillars to get linked with each other." + " A zero value will prohibit pillar cascading."); + def->sidetext = L("mm"); + def->min = 0; // 0 means no linking + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(10.0)); + + def = this->add(prefix + "support_object_elevation", coFloat); + def->label = L("Object elevation"); + def->category = L("Supports"); + def->tooltip = L("How much the supports should lift up the supported object. " + "If \"Pad around object\" is enabled, this value is ignored."); + def->sidetext = L("mm"); + def->min = 0; + def->max = 150; // This is the max height of print on SL1 + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(5.0)); +} + void PrintConfigDef::init_sla_params() { ConfigOptionDef* def; @@ -3282,11 +3616,10 @@ void PrintConfigDef::init_sla_params() def->tooltip = L("Set the actual LCD display orientation inside the SLA printer." " Portrait mode will flip the meaning of display width and height parameters" " and the output images will be rotated by 90 degrees."); - def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); - def->enum_values.push_back("landscape"); - def->enum_values.push_back("portrait"); - def->enum_labels.push_back(L("Landscape")); - def->enum_labels.push_back(L("Portrait")); + def->set_enum({ + { "landscape", L("Landscape") }, + { "portrait", L("Portrait") } + }); def->mode = comExpert; def->set_default_value(new ConfigOptionEnum(sladoPortrait)); @@ -3398,13 +3731,9 @@ void PrintConfigDef::init_sla_params() def = this->add("material_type", coString); def->label = L("SLA material type"); def->tooltip = L("SLA material type"); - def->gui_type = ConfigOptionDef::GUIType::f_enum_open; // TODO: ??? def->gui_flags = "show_value"; - def->enum_values.push_back("Tough"); - def->enum_values.push_back("Flexible"); - def->enum_values.push_back("Casting"); - def->enum_values.push_back("Dental"); - def->enum_values.push_back("Heat-resistant"); + def->set_enum_values(ConfigOptionDef::GUIType::select_open, + { "Tough", "Flexible", "Casting", "Dental", "Heat-resistant" }); def->set_default_value(new ConfigOptionString("Tough")); def = this->add("initial_layer_height", coFloat); @@ -3414,6 +3743,15 @@ void PrintConfigDef::init_sla_params() def->min = 0; def->set_default_value(new ConfigOptionFloat(0.3)); + def = this->add_nullable("idle_temperature", coInts); + def->label = L("Idle temperature"); + def->tooltip = L("Nozzle temperature when the tool is currently not used in multi-tool setups." + "This is only used when 'Ooze prevention' is active in Print Settings."); + def->sidetext = L("°C"); + def->min = 0; + def->max = max_temp; + def->set_default_value(new ConfigOptionIntsNullable { ConfigOptionIntsNullable::nil_value() }); + def = this->add("bottle_volume", coFloat); def->label = L("Bottle volume"); def->tooltip = L("Bottle volume"); @@ -3566,171 +3904,28 @@ void PrintConfigDef::init_sla_params() def->mode = comSimple; def->set_default_value(new ConfigOptionBool(true)); - def = this->add("support_head_front_diameter", coFloat); - def->label = L("Pinhead front diameter"); - def->category = L("Supports"); - def->tooltip = L("Diameter of the pointing side of the head"); - def->sidetext = L("mm"); - def->min = 0; - def->mode = comAdvanced; - def->set_default_value(new ConfigOptionFloat(0.4)); - - def = this->add("support_head_penetration", coFloat); - def->label = L("Head penetration"); - def->category = L("Supports"); - def->tooltip = L("How much the pinhead has to penetrate the model surface"); - def->sidetext = L("mm"); - def->mode = comAdvanced; - def->min = 0; - def->set_default_value(new ConfigOptionFloat(0.2)); - - def = this->add("support_head_width", coFloat); - def->label = L("Pinhead width"); - def->category = L("Supports"); - def->tooltip = L("Width from the back sphere center to the front sphere center"); - def->sidetext = L("mm"); - def->min = 0; - def->max = 20; - def->mode = comAdvanced; - def->set_default_value(new ConfigOptionFloat(1.0)); - - def = this->add("support_pillar_diameter", coFloat); - def->label = L("Pillar diameter"); - def->category = L("Supports"); - def->tooltip = L("Diameter in mm of the support pillars"); - def->sidetext = L("mm"); - def->min = 0; - def->max = 15; + def = this->add("support_tree_type", coEnum); + def->label = L("Support tree type"); + def->tooltip = L("Support tree building strategy"); + def->set_enum( + ConfigOptionEnum::get_enum_names(), + { L("Default"), + // TRN One of the "Support tree type"s on SLAPrintSettings : Supports + L("Branching (experimental)") }); + // TODO: def->enum_def->labels[2] = L("Organic"); def->mode = comSimple; - def->set_default_value(new ConfigOptionFloat(1.0)); + def->set_default_value(new ConfigOptionEnum(sla::SupportTreeType::Default)); - def = this->add("support_small_pillar_diameter_percent", coPercent); - def->label = L("Small pillar diameter percent"); - def->category = L("Supports"); - def->tooltip = L("The percentage of smaller pillars compared to the normal pillar diameter " - "which are used in problematic areas where a normal pilla cannot fit."); - def->sidetext = L("%"); - def->min = 1; - def->max = 100; - def->mode = comExpert; - def->set_default_value(new ConfigOptionPercent(50)); - - def = this->add("support_max_bridges_on_pillar", coInt); - def->label = L("Max bridges on a pillar"); - def->tooltip = L( - "Maximum number of bridges that can be placed on a pillar. Bridges " - "hold support point pinheads and connect to pillars as small branches."); - def->min = 0; - def->max = 50; - def->mode = comExpert; - def->set_default_value(new ConfigOptionInt(3)); + init_sla_support_params(""); + init_sla_support_params("branching"); - def = this->add("support_pillar_connection_mode", coEnum); - def->label = L("Pillar connection mode"); - def->tooltip = L("Controls the bridge type between two neighboring pillars." - " Can be zig-zag, cross (double zig-zag) or dynamic which" - " will automatically switch between the first two depending" - " on the distance of the two pillars."); - def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); - def->enum_values.push_back("zigzag"); - def->enum_values.push_back("cross"); - def->enum_values.push_back("dynamic"); - def->enum_labels.push_back(L("Zig-Zag")); - def->enum_labels.push_back(L("Cross")); - def->enum_labels.push_back(L("Dynamic")); - def->mode = comAdvanced; - def->set_default_value(new ConfigOptionEnum(slapcmDynamic)); - - def = this->add("support_buildplate_only", coBool); - def->label = L("Support on build plate only"); + def = this->add("support_enforcers_only", coBool); + def->label = L("Support only in enforced regions"); def->category = L("Supports"); - def->tooltip = L("Only create support if it lies on a build plate. Don't create support on a print."); + def->tooltip = L("Only create support if it lies in a support enforcer."); def->mode = comSimple; def->set_default_value(new ConfigOptionBool(false)); - def = this->add("support_pillar_widening_factor", coFloat); - def->label = L("Pillar widening factor"); - def->category = L("Supports"); - def->tooltip = L("Merging bridges or pillars into another pillars can " - "increase the radius. Zero means no increase, one means " - "full increase."); - def->min = 0; - def->max = 1; - def->mode = comExpert; - def->set_default_value(new ConfigOptionFloat(0.0)); - - def = this->add("support_base_diameter", coFloat); - def->label = L("Support base diameter"); - def->category = L("Supports"); - def->tooltip = L("Diameter in mm of the pillar base"); - def->sidetext = L("mm"); - def->min = 0; - def->max = 30; - def->mode = comAdvanced; - def->set_default_value(new ConfigOptionFloat(4.0)); - - def = this->add("support_base_height", coFloat); - def->label = L("Support base height"); - def->category = L("Supports"); - def->tooltip = L("The height of the pillar base cone"); - def->sidetext = L("mm"); - def->min = 0; - def->mode = comAdvanced; - def->set_default_value(new ConfigOptionFloat(1.0)); - - def = this->add("support_base_safety_distance", coFloat); - def->label = L("Support base safety distance"); - def->category = L("Supports"); - def->tooltip = L( - "The minimum distance of the pillar base from the model in mm. " - "Makes sense in zero elevation mode where a gap according " - "to this parameter is inserted between the model and the pad."); - def->sidetext = L("mm"); - def->min = 0; - def->max = 10; - def->mode = comExpert; - def->set_default_value(new ConfigOptionFloat(1)); - - def = this->add("support_critical_angle", coFloat); - def->label = L("Critical angle"); - def->category = L("Supports"); - def->tooltip = L("The default angle for connecting support sticks and junctions."); - def->sidetext = L("°"); - def->min = 0; - def->max = 90; - def->mode = comExpert; - def->set_default_value(new ConfigOptionFloat(45)); - - def = this->add("support_max_bridge_length", coFloat); - def->label = L("Max bridge length"); - def->category = L("Supports"); - def->tooltip = L("The max length of a bridge"); - def->sidetext = L("mm"); - def->min = 0; - def->mode = comAdvanced; - def->set_default_value(new ConfigOptionFloat(15.0)); - - def = this->add("support_max_pillar_link_distance", coFloat); - def->label = L("Max pillar linking distance"); - def->category = L("Supports"); - def->tooltip = L("The max distance of two pillars to get linked with each other." - " A zero value will prohibit pillar cascading."); - def->sidetext = L("mm"); - def->min = 0; // 0 means no linking - def->mode = comAdvanced; - def->set_default_value(new ConfigOptionFloat(10.0)); - - def = this->add("support_object_elevation", coFloat); - def->label = L("Object elevation"); - def->category = L("Supports"); - def->tooltip = L("How much the supports should lift up the supported object. " - "If \"Pad around object\" is enabled, this value is ignored."); - def->sidetext = L("mm"); - def->min = 0; - def->max = 150; // This is the max height of print on SL1 - def->mode = comAdvanced; - def->set_default_value(new ConfigOptionFloat(5.0)); - def = this->add("support_points_density_relative", coInt); def->label = L("Support points density"); def->category = L("Supports"); @@ -3921,17 +4116,48 @@ void PrintConfigDef::init_sla_params() def->tooltip = L( "A slower printing profile might be necessary when using materials with higher viscosity " "or with some hollowed parts. It slows down the tilt movement and adds a delay before exposure."); - def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); - def->enum_values.push_back("slow"); - def->enum_values.push_back("fast"); - def->enum_values.push_back("high_viscosity"); - def->enum_labels.push_back(L("Slow")); - def->enum_labels.push_back(L("Fast")); - def->enum_labels.push_back(L("High viscosity")); + def->set_enum({ + { "slow", L("Slow") }, + { "fast", L("Fast") }, + { "high_viscosity", L("High viscosity") } + }); def->mode = comAdvanced; def->set_default_value(new ConfigOptionEnum(slamsFast)); + + def = this->add("sla_archive_format", coString); + def->label = L("Format of the output SLA archive"); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionString("SL1")); + + def = this->add("sla_output_precision", coFloat); + def->label = L("SLA output precision"); + def->tooltip = L("Minimum resolution in nanometers"); + def->sidetext = L("mm"); + def->min = float(SCALING_FACTOR); + def->mode = comExpert; + def->set_default_value(new ConfigOptionFloat(0.001)); } +// Ignore the following obsolete configuration keys: +static std::set PrintConfigDef_ignore = { + "clip_multipart_objects", + "duplicate_x", "duplicate_y", "gcode_arcs", "multiply_x", "multiply_y", + "support_material_tool", "acceleration", "adjust_overhang_flow", + "standby_temperature", "scale", "rotate", "duplicate", "duplicate_grid", + "start_perimeters_at_concave_points", "start_perimeters_at_non_overhang", "randomize_start", + "seal_position", "vibration_limit", "bed_size", + "print_center", "g0", "threads", "pressure_advance", "wipe_tower_per_color_wipe", + "serial_port", "serial_speed", + // Introduced in some PrusaSlicer 2.3.1 alpha, later renamed or removed. + "fuzzy_skin_perimeter_mode", "fuzzy_skin_shape", + // Introduced in PrusaSlicer 2.3.0-alpha2, later replaced by automatic calculation based on extrusion width. + "wall_add_middle_threshold", "wall_split_middle_threshold", + // Replaced by new concentric ensuring in 2.6.0-alpha5 + "ensure_vertical_shell_thickness", + // Disabled in 2.6.0-alpha6, this option is problematic + "infill_only_where_needed", +}; + void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &value) { // handle legacy options @@ -4005,32 +4231,17 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va } }*/ - // Ignore the following obsolete configuration keys: - static std::set ignore = { - "duplicate_x", "duplicate_y", "gcode_arcs", "multiply_x", "multiply_y", - "support_material_tool", "acceleration", "adjust_overhang_flow", - "standby_temperature", "scale", "rotate", "duplicate", "duplicate_grid", - "start_perimeters_at_concave_points", "start_perimeters_at_non_overhang", "randomize_start", - "seal_position", "vibration_limit", "bed_size", - "print_center", "g0", "threads", "pressure_advance", "wipe_tower_per_color_wipe", - "serial_port", "serial_speed", - // Introduced in some PrusaSlicer 2.3.1 alpha, later renamed or removed. - "fuzzy_skin_perimeter_mode", "fuzzy_skin_shape", - // Introduced in PrusaSlicer 2.3.0-alpha2, later replaced by automatic calculation based on extrusion width. - "wall_add_middle_threshold", "wall_split_middle_threshold", - }; - // In PrusaSlicer 2.3.0-alpha0 the "monotonous" infill was introduced, which was later renamed to "monotonic". if (value == "monotonous" && (opt_key == "top_fill_pattern" || opt_key == "bottom_fill_pattern" || opt_key == "fill_pattern")) value = "monotonic"; - if (ignore.find(opt_key) != ignore.end()) { - opt_key = ""; + if (PrintConfigDef_ignore.find(opt_key) != PrintConfigDef_ignore.end()) { + opt_key = {}; return; } if (! print_config_def.has(opt_key)) { - opt_key = ""; + opt_key = {}; return; } } @@ -4225,8 +4436,9 @@ std::string validate(const FullPrintConfig &cfg) cfg.gcode_flavor.value != gcfMarlinLegacy && cfg.gcode_flavor.value != gcfMarlinFirmware && cfg.gcode_flavor.value != gcfMachinekit && - cfg.gcode_flavor.value != gcfRepetier) - return "--use-firmware-retraction is only supported by Marlin, Smoothie, RepRapFirmware, Repetier and Machinekit firmware"; + cfg.gcode_flavor.value != gcfRepetier && + cfg.gcode_flavor.value != gcfKlipper) + return "--use-firmware-retraction is only supported by Marlin, Klipper, Smoothie, RepRapFirmware, Repetier and Machinekit firmware"; if (cfg.use_firmware_retraction.value) for (unsigned char wipe : cfg.wipe.values) @@ -4324,6 +4536,12 @@ std::string validate(const FullPrintConfig &cfg) assert(opt != nullptr); const ConfigOptionDef *optdef = print_config_def.get(opt_key); assert(optdef != nullptr); + + if (opt->nullable() && opt->is_nil()) { + // Do not check nil values + continue; + } + bool out_of_range = false; switch (opt->type()) { case coFloat: @@ -4336,12 +4554,19 @@ std::string validate(const FullPrintConfig &cfg) } case coFloats: case coPercents: - for (double v : static_cast*>(opt)->values) + { + const auto* vec = static_cast*>(opt); + for (size_t i = 0; i < vec->size(); ++i) { + if (vec->is_nil(i)) + continue; + double v = vec->values[i]; if (v < optdef->min || v > optdef->max) { out_of_range = true; break; } + } break; + } case coInt: { auto *iopt = static_cast(opt); @@ -4349,12 +4574,19 @@ std::string validate(const FullPrintConfig &cfg) break; } case coInts: - for (int v : static_cast*>(opt)->values) + { + const auto* vec = static_cast*>(opt); + for (size_t i = 0; i < vec->size(); ++i) { + if (vec->is_nil(i)) + continue; + int v = vec->values[i]; if (v < optdef->min || v > optdef->max) { out_of_range = true; break; } + } break; + } default:; } if (out_of_range) @@ -4431,6 +4663,20 @@ CLIActionsConfigDef::CLIActionsConfigDef() def->cli = "gcodeviewer"; def->set_default_value(new ConfigOptionBool(false)); +#if ENABLE_GL_CORE_PROFILE + def = this->add("opengl-version", coString); + def->label = L("OpenGL version"); + def->tooltip = L("Select the specified OpenGL version"); + def->cli = "opengl-version"; + def->set_default_value(new ConfigOptionString()); + + def = this->add("opengl-debug", coBool); + def->label = L("OpenGL debug output"); + def->tooltip = L("Activate OpenGL debug output on graphic cards which support it"); + def->cli = "opengl-debug"; + def->set_default_value(new ConfigOptionBool(false)); +#endif // ENABLE_GL_CORE_PROFILE + def = this->add("slice", coBool); def->label = L("Slice"); def->tooltip = L("Slice the model as FFF or SLA based on the printer_technology configuration value."); @@ -4556,6 +4802,10 @@ CLITransformConfigDef::CLITransformConfigDef() def->label = L("Scale to Fit"); def->tooltip = L("Scale to fit the given volume."); def->set_default_value(new ConfigOptionPoint3(Vec3d(0,0,0))); + + def = this->add("delete-after-load", coString); + def->label = L("Delete files after loading"); + def->tooltip = L("Delete files after loading."); } CLIMiscConfigDef::CLIMiscConfigDef() @@ -4571,13 +4821,11 @@ CLIMiscConfigDef::CLIMiscConfigDef() def->tooltip = L("This version of PrusaSlicer may not understand configurations produced by the newest PrusaSlicer versions. " "For example, newer PrusaSlicer may extend the list of supported firmware flavors. One may decide to " "bail out or to substitute an unknown value with a default silently or verbosely."); - def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); - def->enum_values.push_back("disable"); - def->enum_values.push_back("enable"); - def->enum_values.push_back("enable_silent"); - def->enum_labels.push_back(L("Bail out on unknown configuration values")); - def->enum_labels.push_back(L("Enable reading unknown configuration values by verbosely substituting them with defaults.")); - def->enum_labels.push_back(L("Enable reading unknown configuration values by silently substituting them with defaults.")); + def->set_enum({ + { "disable", L("Bail out on unknown configuration values") }, + { "enable", L("Enable reading unknown configuration values by verbosely substituting them with defaults.") }, + { "enable_silent", L("Enable reading unknown configuration values by silently substituting them with defaults.") } + }); def->set_default_value(new ConfigOptionEnum(ForwardCompatibilitySubstitutionRule::Enable)); def = this->add("load", coStrings); @@ -4595,12 +4843,6 @@ CLIMiscConfigDef::CLIMiscConfigDef() "or an existing PrusaSlicer window is activated. " "Overrides the \"single_instance\" configuration value from application preferences."); -/* - def = this->add("autosave", coString); - def->label = L("Autosave"); - def->tooltip = L("Automatically export current configuration to the specified file."); -*/ - def = this->add("datadir", coString); def->label = L("Data directory"); def->tooltip = L("Load and store settings at the given directory. This is useful for maintaining different profiles or including configurations from a network storage."); @@ -4663,9 +4905,7 @@ Points get_bed_shape(const DynamicPrintConfig &config) void get_bed_shape(const DynamicPrintConfig &cfg, arrangement::ArrangeBed &out) { if (is_XL_printer(cfg)) { - arrangement::SegmentedRectangleBed bed{get_extents(get_bed_shape(cfg)), 4, 4}; - bed.inset = scaled(10.); - out = bed; + out = arrangement::SegmentedRectangleBed{get_extents(get_bed_shape(cfg)), 4, 4}; } else { out = arrangement::to_arrange_bed(get_bed_shape(cfg)); } @@ -4678,19 +4918,40 @@ Points get_bed_shape(const PrintConfig &cfg) Points get_bed_shape(const SLAPrinterConfig &cfg) { return to_points(cfg.bed_shape.values); } -bool is_XL_printer(const DynamicPrintConfig &cfg) +std::string get_sla_suptree_prefix(const DynamicPrintConfig &config) { - static constexpr const char *ALIGN_ONLY_FOR = "XL"; + const auto *suptreetype = config.option>("support_tree_type"); + std::string slatree = ""; + if (suptreetype) { + auto ttype = static_cast(suptreetype->getInt()); + switch (ttype) { + case sla::SupportTreeType::Branching: slatree = "branching"; break; + case sla::SupportTreeType::Organic: slatree = "organic"; break; + default: + ; + } + } - bool ret = false; + return slatree; +} - auto *printer_model = cfg.opt("printer_model"); +static bool is_XL_printer(const std::string& printer_model) +{ + static constexpr const char *ALIGN_ONLY_FOR = "XL"; + return boost::algorithm::contains(printer_model, ALIGN_ONLY_FOR); +} - if (printer_model) - ret = boost::algorithm::starts_with(printer_model->value, ALIGN_ONLY_FOR); +bool is_XL_printer(const DynamicPrintConfig &cfg) +{ + auto *printer_model = cfg.opt("printer_model"); + return printer_model && is_XL_printer(printer_model->value); +} - return ret; +bool is_XL_printer(const PrintConfig &cfg) +{ + return is_XL_printer(cfg.printer_model.value); } + } // namespace Slic3r #include diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index ea4efaf3ca5..06f0472ae70 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -18,6 +18,7 @@ #include "libslic3r.h" #include "Config.hpp" +#include "SLA/SupportTreeStrategies.hpp" #include "libslic3r/Arrange.hpp" #include @@ -31,7 +32,7 @@ namespace Slic3r { enum GCodeFlavor : unsigned char { - gcfRepRapSprinter, gcfRepRapFirmware, gcfRepetier, gcfTeacup, gcfMakerWare, gcfMarlinLegacy, gcfMarlinFirmware, gcfSailfish, gcfMach3, gcfMachinekit, + gcfRepRapSprinter, gcfRepRapFirmware, gcfRepetier, gcfTeacup, gcfMakerWare, gcfMarlinLegacy, gcfMarlinFirmware, gcfKlipper, gcfSailfish, gcfMach3, gcfMachinekit, gcfSmoothie, gcfNoExtrusion, }; @@ -43,7 +44,7 @@ enum class MachineLimitsUsage { }; enum PrintHostType { - htPrusaLink, htOctoPrint, htDuet, htFlashAir, htAstroBox, htRepetier, htMKS + htPrusaLink, htPrusaConnect, htOctoPrint, htDuet, htFlashAir, htAstroBox, htRepetier, htMKS, htMainSail }; enum AuthorizationType { @@ -60,7 +61,8 @@ enum InfillPattern : int { ipRectilinear, ipMonotonic, ipMonotonicLines, ipAlignedRectilinear, ipGrid, ipTriangles, ipStars, ipCubic, ipLine, ipConcentric, ipHoneycomb, ip3DHoneycomb, ipGyroid, ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral, ipAdaptiveCubic, ipSupportCubic, ipSupportBase, ipLightning, -ipCount, + ipEnsuring, + ipCount, }; enum class IroningType { @@ -85,7 +87,7 @@ enum SupportMaterialPattern { }; enum SupportMaterialStyle { - smsGrid, smsSnug, + smsGrid, smsSnug, smsTree, smsOrganic, }; enum SupportMaterialInterfacePattern { @@ -109,11 +111,8 @@ enum SLADisplayOrientation { sladoPortrait }; -enum SLAPillarConnectionMode { - slapcmZigZag, - slapcmCross, - slapcmDynamic -}; +using SLASupportTreeType = sla::SupportTreeType; +using SLAPillarConnectionMode = sla::PillarConnectionMode; enum BrimType { btNoBrim, @@ -158,12 +157,14 @@ CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(SupportMaterialInterfacePattern) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(SeamPosition) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(SLADisplayOrientation) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(SLAPillarConnectionMode) +CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(SLASupportTreeType) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(BrimType) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(DraftShield) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(GCodeThumbnailsFormat) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(ForwardCompatibilitySubstitutionRule) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(PerimeterGeneratorType) + #undef CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS // Defines each and every confiuration option of Slic3r, including the properties of the GUI dialogs. @@ -187,6 +188,7 @@ class PrintConfigDef : public ConfigDef void init_fff_params(); void init_extruder_option_keys(); void init_sla_params(); + void init_sla_support_params(const std::string &method_prefix); std::vector m_extruder_option_keys; std::vector m_extruder_retract_keys; @@ -206,7 +208,6 @@ double min_object_distance(const ConfigBase &cfg); // The dynamic configuration is also used to store user modifications of the print global parameters, // so the modified configuration values may be diffed against the active configuration // to invalidate the proper slicing resp. g-code generation processing steps. -// This object is mapped to Perl as Slic3r::Config. class DynamicPrintConfig : public DynamicConfig { public: @@ -220,6 +221,26 @@ class DynamicPrintConfig : public DynamicConfig DynamicPrintConfig& operator=(DynamicPrintConfig &&rhs) noexcept { DynamicConfig::operator=(std::move(rhs)); return *this; } static DynamicPrintConfig full_print_config(); + static DynamicPrintConfig full_print_config_with(const t_config_option_key &opt_key, const std::string &str, bool append = false) { + auto config = DynamicPrintConfig::full_print_config(); + config.set_deserialize_strict(opt_key, str, append); + return config; + } + static DynamicPrintConfig full_print_config_with(std::initializer_list items) { + auto config = DynamicPrintConfig::full_print_config(); + config.set_deserialize_strict(items); + return config; + } + static DynamicPrintConfig new_with(const t_config_option_key &opt_key, const std::string &str, bool append = false) { + DynamicPrintConfig config; + config.set_deserialize_strict(opt_key, str, append); + return config; + } + static DynamicPrintConfig new_with(std::initializer_list items) { + DynamicPrintConfig config; + config.set_deserialize_strict(items); + return config; + } static DynamicPrintConfig* new_from_defaults_keys(const std::vector &keys); // Overrides ConfigBase::def(). Static configuration definition. Any value stored into this ConfigBase shall have its definition here. @@ -463,20 +484,18 @@ protected: \ BOOST_PP_SEQ_FOR_EACH(PRINT_CONFIG_CLASS_ELEMENT_HASH, _, PARAMETER_DEFINITION_SEQ), \ BOOST_PP_SEQ_FOR_EACH(PRINT_CONFIG_CLASS_ELEMENT_EQUAL, _, PARAMETER_DEFINITION_SEQ)) -// This object is mapped to Perl as Slic3r::Config::PrintObject. PRINT_CONFIG_CLASS_DEFINE( PrintObjectConfig, ((ConfigOptionFloat, brim_separation)) ((ConfigOptionEnum, brim_type)) ((ConfigOptionFloat, brim_width)) - ((ConfigOptionBool, clip_multipart_objects)) ((ConfigOptionBool, dont_support_bridges)) ((ConfigOptionFloat, elefant_foot_compensation)) ((ConfigOptionFloatOrPercent, extrusion_width)) ((ConfigOptionFloat, first_layer_acceleration_over_raft)) ((ConfigOptionFloatOrPercent, first_layer_speed_over_raft)) - ((ConfigOptionBool, infill_only_where_needed)) + // ((ConfigOptionBool, infill_only_where_needed)) // Force the generation of solid shells between adjacent materials/volumes. ((ConfigOptionBool, interface_shells)) ((ConfigOptionFloat, layer_height)) @@ -487,6 +506,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloat, raft_first_layer_expansion)) ((ConfigOptionInt, raft_layers)) ((ConfigOptionEnum, seam_position)) + ((ConfigOptionBool, staggered_inner_seams)) // ((ConfigOptionFloat, seam_preferred_direction)) // ((ConfigOptionFloat, seam_preferred_direction_jitter)) ((ConfigOptionFloat, slice_closing_radius)) @@ -499,7 +519,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloatOrPercent, min_feature_size)) ((ConfigOptionFloatOrPercent, min_bead_width)) ((ConfigOptionBool, support_material)) - // Automatic supports (generated based on support_material_threshold). + // Automatic supports (generated based fdm support point generator). ((ConfigOptionBool, support_material_auto)) // Direction of the support pattern (in XY plane).` ((ConfigOptionFloat, support_material_angle)) @@ -529,12 +549,20 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionInt, support_material_threshold)) ((ConfigOptionBool, support_material_with_sheath)) ((ConfigOptionFloatOrPercent, support_material_xy_spacing)) + // Tree supports + ((ConfigOptionFloat, support_tree_angle)) + ((ConfigOptionFloat, support_tree_angle_slow)) + ((ConfigOptionFloat, support_tree_branch_diameter)) + ((ConfigOptionFloat, support_tree_branch_diameter_angle)) + ((ConfigOptionPercent, support_tree_top_rate)) + ((ConfigOptionFloat, support_tree_branch_distance)) + ((ConfigOptionFloat, support_tree_tip_diameter)) + // The rest ((ConfigOptionBool, thick_bridges)) ((ConfigOptionFloat, xy_size_compensation)) ((ConfigOptionBool, wipe_into_objects)) ) -// This object is mapped to Perl as Slic3r::Config::PrintRegion. PRINT_CONFIG_CLASS_DEFINE( PrintRegionConfig, @@ -543,13 +571,18 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloat, bottom_solid_min_thickness)) ((ConfigOptionFloat, bridge_flow_ratio)) ((ConfigOptionFloat, bridge_speed)) - ((ConfigOptionBool, ensure_vertical_shell_thickness)) ((ConfigOptionEnum, top_fill_pattern)) ((ConfigOptionEnum, bottom_fill_pattern)) ((ConfigOptionFloatOrPercent, external_perimeter_extrusion_width)) ((ConfigOptionFloatOrPercent, external_perimeter_speed)) + ((ConfigOptionBool, enable_dynamic_overhang_speeds)) + ((ConfigOptionFloatOrPercent, overhang_speed_0)) + ((ConfigOptionFloatOrPercent, overhang_speed_1)) + ((ConfigOptionFloatOrPercent, overhang_speed_2)) + ((ConfigOptionFloatOrPercent, overhang_speed_3)) ((ConfigOptionBool, external_perimeters_first)) ((ConfigOptionBool, extra_perimeters)) + ((ConfigOptionBool, extra_perimeters_on_overhangs)) ((ConfigOptionFloat, fill_angle)) ((ConfigOptionPercent, fill_density)) ((ConfigOptionEnum, fill_pattern)) @@ -625,10 +658,10 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloats, machine_min_extruding_rate)) ) -// This object is mapped to Perl as Slic3r::Config::GCode. PRINT_CONFIG_CLASS_DEFINE( GCodeConfig, + ((ConfigOptionBool, autoemit_temperature_commands)) ((ConfigOptionString, before_layer_gcode)) ((ConfigOptionString, between_objects_gcode)) ((ConfigOptionFloats, deretract_speed)) @@ -709,17 +742,22 @@ static inline std::string get_extrusion_axis(const GCodeConfig &cfg) (cfg.gcode_flavor.value == gcfNoExtrusion) ? "" : cfg.extrusion_axis.value; } -// This object is mapped to Perl as Slic3r::Config::Print. PRINT_CONFIG_CLASS_DERIVED_DEFINE( PrintConfig, (MachineEnvelopeConfig, GCodeConfig), + ((ConfigOptionBool, avoid_crossing_curled_overhangs)) ((ConfigOptionBool, avoid_crossing_perimeters)) ((ConfigOptionFloatOrPercent, avoid_crossing_perimeters_max_detour)) ((ConfigOptionPoints, bed_shape)) ((ConfigOptionInts, bed_temperature)) ((ConfigOptionFloat, bridge_acceleration)) ((ConfigOptionInts, bridge_fan_speed)) + ((ConfigOptionBools, enable_dynamic_fan_speeds)) + ((ConfigOptionInts, overhang_fan_speed_0)) + ((ConfigOptionInts, overhang_fan_speed_1)) + ((ConfigOptionInts, overhang_fan_speed_2)) + ((ConfigOptionInts, overhang_fan_speed_3)) ((ConfigOptionBool, complete_objects)) ((ConfigOptionFloats, colorprint_heights)) ((ConfigOptionBools, cooling)) @@ -742,6 +780,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionFloatOrPercent, first_layer_height)) ((ConfigOptionFloatOrPercent, first_layer_speed)) ((ConfigOptionInts, first_layer_temperature)) + ((ConfigOptionIntsNullable, idle_temperature)) ((ConfigOptionInts, full_fan_speed_layer)) ((ConfigOptionFloat, infill_acceleration)) ((ConfigOptionBool, infill_first)) @@ -777,6 +816,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionPoints, thumbnails)) ((ConfigOptionEnum, thumbnails_format)) ((ConfigOptionFloat, top_solid_infill_acceleration)) + ((ConfigOptionFloat, travel_acceleration)) ((ConfigOptionBools, wipe)) ((ConfigOptionBool, wipe_tower)) ((ConfigOptionFloat, wipe_tower_x)) @@ -785,13 +825,14 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionFloat, wipe_tower_per_color_wipe)) ((ConfigOptionFloat, wipe_tower_rotation_angle)) ((ConfigOptionFloat, wipe_tower_brim_width)) + ((ConfigOptionFloat, wipe_tower_cone_angle)) + ((ConfigOptionPercent, wipe_tower_extra_spacing)) ((ConfigOptionFloat, wipe_tower_bridging)) ((ConfigOptionFloats, wiping_volumes_matrix)) ((ConfigOptionFloats, wiping_volumes_extruders)) ((ConfigOptionFloat, z_offset)) ) -// This object is mapped to Perl as Slic3r::Config::Full. PRINT_CONFIG_CLASS_DERIVED_DEFINE0( FullPrintConfig, (PrintObjectConfig, PrintRegionConfig, PrintConfig) @@ -819,6 +860,8 @@ PRINT_CONFIG_CLASS_DEFINE( // Enabling or disabling support creation ((ConfigOptionBool, supports_enable)) + ((ConfigOptionEnum, support_tree_type)) + // Diameter in mm of the pointing side of the head. ((ConfigOptionFloat, support_head_front_diameter))/*= 0.2*/ @@ -844,6 +887,11 @@ PRINT_CONFIG_CLASS_DEFINE( // Generate only ground facing supports ((ConfigOptionBool, support_buildplate_only)) + ((ConfigOptionFloat, support_max_weight_on_model)) + + // Generate only ground facing supports + ((ConfigOptionBool, support_enforcers_only)) + // TODO: unimplemented at the moment. This coefficient will have an impact // when bridges and pillars are merged. The resulting pillar should be a bit // thicker than the ones merging into it. How much thicker? I don't know @@ -872,6 +920,62 @@ PRINT_CONFIG_CLASS_DEFINE( // and the model object's bounding box bottom. Units in mm. ((ConfigOptionFloat, support_object_elevation))/*= 5.0*/ + + // Branching tree + + // Diameter in mm of the pointing side of the head. + ((ConfigOptionFloat, branchingsupport_head_front_diameter))/*= 0.2*/ + + // How much the pinhead has to penetrate the model surface + ((ConfigOptionFloat, branchingsupport_head_penetration))/*= 0.2*/ + + // Width in mm from the back sphere center to the front sphere center. + ((ConfigOptionFloat, branchingsupport_head_width))/*= 1.0*/ + + // Radius in mm of the support pillars. + ((ConfigOptionFloat, branchingsupport_pillar_diameter))/*= 0.8*/ + + // The percentage of smaller pillars compared to the normal pillar diameter + // which are used in problematic areas where a normal pilla cannot fit. + ((ConfigOptionPercent, branchingsupport_small_pillar_diameter_percent)) + + // How much bridge (supporting another pinhead) can be placed on a pillar. + ((ConfigOptionInt, branchingsupport_max_bridges_on_pillar)) + + // How the pillars are bridged together + ((ConfigOptionEnum, branchingsupport_pillar_connection_mode)) + + // Generate only ground facing supports + ((ConfigOptionBool, branchingsupport_buildplate_only)) + + ((ConfigOptionFloat, branchingsupport_max_weight_on_model)) + + ((ConfigOptionFloat, branchingsupport_pillar_widening_factor)) + + // Radius in mm of the pillar base. + ((ConfigOptionFloat, branchingsupport_base_diameter))/*= 2.0*/ + + // The height of the pillar base cone in mm. + ((ConfigOptionFloat, branchingsupport_base_height))/*= 1.0*/ + + // The minimum distance of the pillar base from the model in mm. + ((ConfigOptionFloat, branchingsupport_base_safety_distance)) /*= 1.0*/ + + // The default angle for connecting support sticks and junctions. + ((ConfigOptionFloat, branchingsupport_critical_angle))/*= 45*/ + + // The max length of a bridge in mm + ((ConfigOptionFloat, branchingsupport_max_bridge_length))/*= 15.0*/ + + // The max distance of two pillars to get cross linked. + ((ConfigOptionFloat, branchingsupport_max_pillar_link_distance)) + + // The elevation in Z direction upwards. This is the space between the pad + // and the model object's bounding box bottom. Units in mm. + ((ConfigOptionFloat, branchingsupport_object_elevation))/*= 5.0*/ + + + /////// Following options influence automatic support points placement: ((ConfigOptionInt, support_points_density_relative)) ((ConfigOptionFloat, support_points_minimal_distance)) @@ -996,6 +1100,8 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloat, max_exposure_time)) ((ConfigOptionFloat, min_initial_exposure_time)) ((ConfigOptionFloat, max_initial_exposure_time)) + ((ConfigOptionString, sla_archive_format)) + ((ConfigOptionFloat, sla_output_precision)) ) PRINT_CONFIG_CLASS_DERIVED_DEFINE0( @@ -1086,12 +1192,16 @@ class DynamicPrintAndCLIConfig : public DynamicPrintConfig }; bool is_XL_printer(const DynamicPrintConfig &cfg); +bool is_XL_printer(const PrintConfig &cfg); Points get_bed_shape(const DynamicPrintConfig &cfg); Points get_bed_shape(const PrintConfig &cfg); Points get_bed_shape(const SLAPrinterConfig &cfg); void get_bed_shape(const DynamicPrintConfig &cfg, arrangement::ArrangeBed &out); + +std::string get_sla_suptree_prefix(const DynamicPrintConfig &config); + // ModelConfig is a wrapper around DynamicPrintConfig with an addition of a timestamp. // Each change of ModelConfig is tracked by assigning a new timestamp from a global counter. // The counter is used for faster synchronization of the background slicing thread @@ -1146,6 +1256,8 @@ class ModelConfig void set(const std::string &opt_key, T value) { m_data.set(opt_key, value, true); this->touch(); } void set_deserialize(const t_config_option_key &opt_key, const std::string &str, ConfigSubstitutionContext &substitution_context, bool append = false) { m_data.set_deserialize(opt_key, str, substitution_context, append); this->touch(); } + void set_deserialize_strict(const t_config_option_key &opt_key, const std::string &str, bool append = false) + { m_data.set_deserialize_strict(opt_key, str, append); this->touch(); } bool erase(const t_config_option_key &opt_key) { bool out = m_data.erase(opt_key); if (out) this->touch(); return out; } // Getters are thread safe. diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 9566641bf70..3f21a80c952 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -1,4 +1,12 @@ +#include "AABBTreeLines.hpp" +#include "BridgeDetector.hpp" +#include "ExPolygon.hpp" #include "Exception.hpp" +#include "Flow.hpp" +#include "KDTreeIndirect.hpp" +#include "Point.hpp" +#include "Polygon.hpp" +#include "Polyline.hpp" #include "Print.hpp" #include "BoundingBox.hpp" #include "ClipperUtils.hpp" @@ -7,7 +15,10 @@ #include "I18N.hpp" #include "Layer.hpp" #include "MutablePolygon.hpp" +#include "PrintBase.hpp" +#include "PrintConfig.hpp" #include "SupportMaterial.hpp" +#include "TreeSupport.hpp" #include "Surface.hpp" #include "Slicing.hpp" #include "Tesselate.hpp" @@ -16,23 +27,35 @@ #include "Fill/FillAdaptive.hpp" #include "Fill/FillLightning.hpp" #include "Format/STL.hpp" - +#include "SupportMaterial.hpp" +#include "SupportSpotsGenerator.hpp" +#include "TriangleSelectorWrapper.hpp" +#include "format.hpp" +#include "libslic3r.h" + +#include +#include +#include #include +#include +#include +#include +#include +#include +#include #include +#include +#include +#include #include #include #include - -#include +#include using namespace std::literals; -//! macro used to mark string used at localization, -//! return same string -#define L(s) Slic3r::I18N::translate(s) - #ifdef SLIC3R_DEBUG_SLICE_PROCESSING #define SLIC3R_DEBUG #endif @@ -49,6 +72,8 @@ using namespace std::literals; #include #endif + #include "SVG.hpp" + namespace Slic3r { // Constructor is called from the main thread, therefore all Model / ModelObject / ModelIntance data are valid. @@ -66,8 +91,8 @@ PrintObject::PrintObject(Print* print, ModelObject* model_object, const Transfor BoundingBoxf3 bbox = model_object->raw_bounding_box(); Vec3d bbox_center = bbox.center(); // We may need to rotate the bbox / bbox_center from the original instance to the current instance. - double z_diff = Geometry::rotation_diff_z(model_object->instances.front()->get_rotation(), instances.front().model_instance->get_rotation()); - if (std::abs(z_diff) > EPSILON) { + double z_diff = Geometry::rotation_diff_z(model_object->instances.front()->get_matrix(), instances.front().model_instance->get_matrix()); + if (std::abs(z_diff) > EPSILON) { auto z_rot = Eigen::AngleAxisd(z_diff, Vec3d::UnitZ()); bbox = bbox.transformed(Transform3d(z_rot)); bbox_center = (z_rot * bbox_center).eval(); @@ -77,6 +102,7 @@ PrintObject::PrintObject(Print* print, ModelObject* model_object, const Transfor m_center_offset = Point::new_scale(bbox_center.x(), bbox_center.y()); // Size of the transformed mesh. This bounding may not be snug in XY plane, but it is snug in Z. m_size = (bbox.size() * (1. / SCALING_FACTOR)).cast(); + m_size.z() = model_object->max_z(); this->set_instances(std::move(instances)); } @@ -123,12 +149,13 @@ void PrintObject::make_perimeters() if (! this->set_started(posPerimeters)) return; - m_print->set_status(20, L("Generating perimeters")); + m_print->set_status(20, _u8L("Generating perimeters")); BOOST_LOG_TRIVIAL(info) << "Generating perimeters..." << log_memory_info(); // Revert the typed slices into untyped slices. if (m_typed_slices) { for (Layer *layer : m_layers) { + layer->clear_fills(); layer->restore_untyped_slices(); m_print->throw_if_canceled(); } @@ -155,7 +182,7 @@ void PrintObject::make_perimeters() m_print->throw_if_canceled(); LayerRegion &layerm = *m_layers[layer_idx]->get_region(region_id); const LayerRegion &upper_layerm = *m_layers[layer_idx+1]->get_region(region_id); - const Polygons upper_layerm_polygons = to_polygons(upper_layerm.slices.surfaces); + const Polygons upper_layerm_polygons = to_polygons(upper_layerm.slices().surfaces); // Filter upper layer polygons in intersection_ppl by their bounding boxes? // my $upper_layerm_poly_bboxes= [ map $_->bounding_box, @{$upper_layerm_polygons} ]; const double total_loop_length = total_length(upper_layerm_polygons); @@ -164,7 +191,8 @@ void PrintObject::make_perimeters() const coord_t ext_perimeter_width = ext_perimeter_flow.scaled_width(); const coord_t ext_perimeter_spacing = ext_perimeter_flow.scaled_spacing(); - for (Surface &slice : layerm.slices.surfaces) { + // slice is not const because slice.extra_perimeters is being incremented. + for (Surface &slice : layerm.m_slices.surfaces) { for (;;) { // compute the total thickness of perimeters const coord_t perimeters_thickness = ext_perimeter_width/2 + ext_perimeter_spacing/2 @@ -226,7 +254,7 @@ void PrintObject::prepare_infill() if (! this->set_started(posPrepareInfill)) return; - m_print->set_status(30, L("Preparing infill")); + m_print->set_status(30, _u8L("Preparing infill")); if (m_typed_slices) { // To improve robustness of detect_surfaces_type() when reslicing (working with typed slices), see GH issue #7442. @@ -256,6 +284,22 @@ void PrintObject::prepare_infill() m_print->throw_if_canceled(); } + + // Add solid fills to ensure the shell vertical thickness. + this->discover_vertical_shells(); + m_print->throw_if_canceled(); + + // Debugging output. +#ifdef SLIC3R_DEBUG_SLICE_PROCESSING + for (size_t region_id = 0; region_id < this->num_printing_regions(); ++ region_id) { + for (const Layer *layer : m_layers) { + LayerRegion *layerm = layer->m_regions[region_id]; + layerm->export_region_slices_to_svg_debug("3_discover_vertical_shells-final"); + layerm->export_region_fill_surfaces_to_svg_debug("3_discover_vertical_shells-final"); + } // for each layer + } // for each region +#endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ + // this will detect bridges and reverse bridges // and rearrange top/bottom/internal surfaces // It produces enlarged overlapping bridging areas. @@ -268,17 +312,13 @@ void PrintObject::prepare_infill() this->process_external_surfaces(); m_print->throw_if_canceled(); - // Add solid fills to ensure the shell vertical thickness. - this->discover_vertical_shells(); - m_print->throw_if_canceled(); - // Debugging output. #ifdef SLIC3R_DEBUG_SLICE_PROCESSING for (size_t region_id = 0; region_id < this->num_printing_regions(); ++ region_id) { for (const Layer *layer : m_layers) { LayerRegion *layerm = layer->m_regions[region_id]; - layerm->export_region_slices_to_svg_debug("6_discover_vertical_shells-final"); - layerm->export_region_fill_surfaces_to_svg_debug("6_discover_vertical_shells-final"); + layerm->export_region_slices_to_svg_debug("3_process_external_surfaces-final"); + layerm->export_region_fill_surfaces_to_svg_debug("3_process_external_surfaces-final"); } // for each layer } // for each region #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ @@ -308,8 +348,8 @@ void PrintObject::prepare_infill() //FIXME The surfaces are supported by a sparse infill, but the sparse infill is only as large as the area to support. // Likely the sparse infill will not be anchored correctly, so it will not work as intended. // Also one wishes the perimeters to be supported by a full infill. - this->clip_fill_surfaces(); - m_print->throw_if_canceled(); + // this->clip_fill_surfaces(); + // m_print->throw_if_canceled(); #ifdef SLIC3R_DEBUG_SLICE_PROCESSING for (size_t region_id = 0; region_id < this->num_printing_regions(); ++ region_id) { @@ -347,22 +387,30 @@ void PrintObject::prepare_infill() this->set_done(posPrepareInfill); } +void PrintObject::clear_fills() +{ + for (Layer *layer : m_layers) + layer->clear_fills(); +} + void PrintObject::infill() { // prerequisites this->prepare_infill(); if (this->set_started(posInfill)) { - auto [adaptive_fill_octree, support_fill_octree] = this->prepare_adaptive_infill_data(); - auto lightning_generator = this->prepare_lightning_infill_data(); + // TRN Status for the Print calculation + m_print->set_status(45, _u8L("Making infill")); + const auto& adaptive_fill_octree = this->m_adaptive_fill_octrees.first; + const auto& support_fill_octree = this->m_adaptive_fill_octrees.second; BOOST_LOG_TRIVIAL(debug) << "Filling layers in parallel - start"; tbb::parallel_for( tbb::blocked_range(0, m_layers.size()), - [this, &adaptive_fill_octree = adaptive_fill_octree, &support_fill_octree = support_fill_octree, &lightning_generator](const tbb::blocked_range& range) { + [this, &adaptive_fill_octree = adaptive_fill_octree, &support_fill_octree = support_fill_octree](const tbb::blocked_range& range) { for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) { m_print->throw_if_canceled(); - m_layers[layer_idx]->make_fills(adaptive_fill_octree.get(), support_fill_octree.get(), lightning_generator.get()); + m_layers[layer_idx]->make_fills(adaptive_fill_octree.get(), support_fill_octree.get(), this->m_lightning_generator.get()); } } ); @@ -395,12 +443,36 @@ void PrintObject::ironing() } } +void PrintObject::generate_support_spots() +{ + if (this->set_started(posSupportSpotsSearch)) { + BOOST_LOG_TRIVIAL(debug) << "Searching support spots - start"; + m_print->set_status(65, _u8L("Searching support spots")); + if (!this->shared_regions()->generated_support_points.has_value()) { + PrintTryCancel cancel_func = m_print->make_try_cancel(); + SupportSpotsGenerator::Params params{this->print()->m_config.filament_type.values, + float(this->print()->m_config.perimeter_acceleration.getFloat()), + this->config().raft_layers.getInt(), this->config().brim_type.value, + float(this->config().brim_width.getFloat())}; + auto [supp_points, partial_objects] = SupportSpotsGenerator::full_search(this, cancel_func, params); + Transform3d po_transform = this->trafo_centered(); + if (this->layer_count() > 0) { + po_transform = Geometry::translation_transform(Vec3d{0, 0, this->layers().front()->bottom_z()}) * po_transform; + } + this->m_shared_regions->generated_support_points = {po_transform, supp_points, partial_objects}; + m_print->throw_if_canceled(); + } + BOOST_LOG_TRIVIAL(debug) << "Searching support spots - end"; + this->set_done(posSupportSpotsSearch); + } +} + void PrintObject::generate_support_material() { if (this->set_started(posSupportMaterial)) { this->clear_support_layers(); if ((this->has_support() && m_layers.size() > 1) || (this->has_raft() && ! m_layers.empty())) { - m_print->set_status(85, L("Generating support material")); + m_print->set_status(70, _u8L("Generating support material")); this->_generate_support_material(); m_print->throw_if_canceled(); } else { @@ -416,7 +488,30 @@ void PrintObject::generate_support_material() } } -std::pair PrintObject::prepare_adaptive_infill_data() +void PrintObject::estimate_curled_extrusions() +{ + if (this->set_started(posEstimateCurledExtrusions)) { + if (this->print()->config().avoid_crossing_curled_overhangs) { + BOOST_LOG_TRIVIAL(debug) << "Estimating areas with curled extrusions - start"; + m_print->set_status(88, _u8L("Estimating curled extrusions")); + + // Estimate curling of support material and add it to the malformaition lines of each layer + float support_flow_width = support_material_flow(this, this->config().layer_height).width(); + SupportSpotsGenerator::Params params{this->print()->m_config.filament_type.values, + float(this->print()->m_config.perimeter_acceleration.getFloat()), + this->config().raft_layers.getInt(), this->config().brim_type.value, + float(this->config().brim_width.getFloat())}; + SupportSpotsGenerator::estimate_supports_malformations(this->support_layers(), support_flow_width, params); + SupportSpotsGenerator::estimate_malformations(this->layers(), params); + m_print->throw_if_canceled(); + BOOST_LOG_TRIVIAL(debug) << "Estimating areas with curled extrusions - end"; + } + this->set_done(posEstimateCurledExtrusions); + } +} + +std::pair PrintObject::prepare_adaptive_infill_data( + const std::vector> &surfaces_w_bottom_z) const { using namespace FillAdaptive; @@ -430,22 +525,19 @@ std::pair PrintObject::prepare its_transform(mesh, to_octree * this->trafo_centered(), true); // Triangulate internal bridging surfaces. - std::vector> overhangs(this->layers().size()); - tbb::parallel_for( - tbb::blocked_range(0, int(m_layers.size()) - 1), - [this, &to_octree, &overhangs](const tbb::blocked_range &range) { - std::vector &out = overhangs[range.begin()]; - for (int idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { - m_print->throw_if_canceled(); - const Layer *layer = this->layers()[idx_layer]; - for (const LayerRegion *layerm : layer->regions()) - for (const Surface &surface : layerm->fill_surfaces.surfaces) - if (surface.surface_type == stInternalBridge) - append(out, triangulate_expolygon_3d(surface.expolygon, layer->bottom_z())); - } - for (Vec3d &p : out) - p = (to_octree * p).eval(); - }); + std::vector> overhangs(std::max(surfaces_w_bottom_z.size(), size_t(1))); + // ^ make sure vector is not empty, even with no briding surfaces we still want to build the adaptive trees later, some continue normally + tbb::parallel_for(tbb::blocked_range(0, surfaces_w_bottom_z.size()), + [this, &to_octree, &overhangs, &surfaces_w_bottom_z](const tbb::blocked_range &range) { + for (int surface_idx = range.begin(); surface_idx < range.end(); ++surface_idx) { + std::vector &out = overhangs[surface_idx]; + m_print->throw_if_canceled(); + append(out, triangulate_expolygon_3d(surfaces_w_bottom_z[surface_idx].first->expolygon, + surfaces_w_bottom_z[surface_idx].second)); + for (Vec3d &p : out) + p = (to_octree * p).eval(); + } + }); // and gather them. for (size_t i = 1; i < overhangs.size(); ++ i) append(overhangs.front(), std::move(overhangs[i])); @@ -518,11 +610,13 @@ bool PrintObject::invalidate_state_by_config_options( if ( opt_key == "brim_width" || opt_key == "brim_separation" || opt_key == "brim_type") { + steps.emplace_back(posSupportSpotsSearch); // Brim is printed below supports, support invalidates brim and skirt. steps.emplace_back(posSupportMaterial); } else if ( opt_key == "perimeters" || opt_key == "extra_perimeters" + || opt_key == "extra_perimeters_on_overhangs" || opt_key == "first_layer_extrusion_width" || opt_key == "perimeter_extrusion_width" || opt_key == "infill_overlap" @@ -558,8 +652,7 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "slicing_mode") { steps.emplace_back(posSlice); } else if ( - opt_key == "clip_multipart_objects" - || opt_key == "elefant_foot_compensation" + opt_key == "elefant_foot_compensation" || opt_key == "support_material_contact_distance" || opt_key == "xy_size_compensation") { steps.emplace_back(posSlice); @@ -594,6 +687,13 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "support_material_synchronize_layers" || opt_key == "support_material_threshold" || opt_key == "support_material_with_sheath" + || opt_key == "support_tree_angle" + || opt_key == "support_tree_angle_slow" + || opt_key == "support_tree_branch_diameter" + || opt_key == "support_tree_branch_diameter_angle" + || opt_key == "support_tree_top_rate" + || opt_key == "support_tree_branch_distance" + || opt_key == "support_tree_tip_diameter" || opt_key == "raft_expansion" || opt_key == "raft_first_layer_density" || opt_key == "raft_first_layer_expansion" @@ -619,7 +719,6 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "infill_extruder" || opt_key == "solid_infill_extruder" || opt_key == "infill_extrusion_width" - || opt_key == "ensure_vertical_shell_thickness" || opt_key == "bridge_angle") { steps.emplace_back(posPrepareInfill); } else if ( @@ -633,15 +732,7 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "first_layer_extrusion_width") { steps.emplace_back(posInfill); } else if (opt_key == "fill_pattern") { - steps.emplace_back(posInfill); - - const auto *old_fill_pattern = old_config.option>(opt_key); - const auto *new_fill_pattern = new_config.option>(opt_key); - assert(old_fill_pattern && new_fill_pattern); - // We need to recalculate infill surfaces when infill_only_where_needed is enabled, and we are switching from - // the Lightning infill to another infill or vice versa. - if (m_config.infill_only_where_needed && (new_fill_pattern->value == ipLightning || old_fill_pattern->value == ipLightning)) - steps.emplace_back(posPrepareInfill); + steps.emplace_back(posPrepareInfill); } else if (opt_key == "fill_density") { // One likely wants to reslice only when switching between zero infill to simulate boolean difference (subtracting volumes), // normal infill and 100% (solid) infill. @@ -692,6 +783,11 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "support_material_speed" || opt_key == "support_material_interface_speed" || opt_key == "bridge_speed" + || opt_key == "enable_dynamic_overhang_speeds" + || opt_key == "overhang_speed_0" + || opt_key == "overhang_speed_1" + || opt_key == "overhang_speed_2" + || opt_key == "overhang_speed_3" || opt_key == "external_perimeter_speed" || opt_key == "infill_speed" || opt_key == "perimeter_speed" @@ -723,22 +819,26 @@ bool PrintObject::invalidate_step(PrintObjectStep step) // propagate to dependent steps if (step == posPerimeters) { - invalidated |= this->invalidate_steps({ posPrepareInfill, posInfill, posIroning }); + invalidated |= this->invalidate_steps({ posPrepareInfill, posInfill, posIroning, posSupportSpotsSearch, posEstimateCurledExtrusions }); invalidated |= m_print->invalidate_steps({ psSkirtBrim }); } else if (step == posPrepareInfill) { - invalidated |= this->invalidate_steps({ posInfill, posIroning }); + invalidated |= this->invalidate_steps({ posInfill, posIroning, posSupportSpotsSearch}); } else if (step == posInfill) { - invalidated |= this->invalidate_steps({ posIroning }); + invalidated |= this->invalidate_steps({ posIroning, posSupportSpotsSearch }); invalidated |= m_print->invalidate_steps({ psSkirtBrim }); } else if (step == posSlice) { - invalidated |= this->invalidate_steps({ posPerimeters, posPrepareInfill, posInfill, posIroning, posSupportMaterial }); + invalidated |= this->invalidate_steps({posPerimeters, posPrepareInfill, posInfill, posIroning, posSupportSpotsSearch, + posSupportMaterial, posEstimateCurledExtrusions}); invalidated |= m_print->invalidate_steps({ psSkirtBrim }); m_slicing_params.valid = false; } else if (step == posSupportMaterial) { - invalidated |= m_print->invalidate_steps({ psSkirtBrim }); + invalidated |= m_print->invalidate_steps({ psSkirtBrim, }); + invalidated |= this->invalidate_steps({ posEstimateCurledExtrusions }); m_slicing_params.valid = false; } + // invalidate alerts step always, since it depends on everything (except supports, but with supports enabled it is skipped anyway.) + invalidated |= m_print->invalidate_step(psAlertWhenSupportsNeeded); // Wipe tower depends on the ordering of extruders, which in turn depends on everything. // It also decides about what the wipe_into_infill / wipe_into_object features will do, // and that too depends on many of the settings. @@ -757,6 +857,15 @@ bool PrintObject::invalidate_all_steps() return result; } +// Called on main thread with stopped or paused background processing to let PrintObject release data for its milestones that were invalidated or canceled. +void PrintObject::cleanup() +{ + if (this->query_reset_dirty_step_unguarded(posInfill)) + this->clear_fills(); + if (this->query_reset_dirty_step_unguarded(posSupportMaterial)) + this->clear_support_layers(); +} + // This function analyzes slices of a region (SurfaceCollection slices). // Each region slice (instance of Surface) is analyzed, whether it is supported or whether it is the top surface. // Initially all slices are of type stInternal. @@ -822,13 +931,13 @@ void PrintObject::detect_surfaces_type() Surfaces top; if (upper_layer) { ExPolygons upper_slices = interface_shells ? - diff_ex(layerm->slices.surfaces, upper_layer->m_regions[region_id]->slices.surfaces, ApplySafetyOffset::Yes) : - diff_ex(layerm->slices.surfaces, upper_layer->lslices, ApplySafetyOffset::Yes); + diff_ex(layerm->slices().surfaces, upper_layer->m_regions[region_id]->slices().surfaces, ApplySafetyOffset::Yes) : + diff_ex(layerm->slices().surfaces, upper_layer->lslices, ApplySafetyOffset::Yes); surfaces_append(top, opening_ex(upper_slices, offset), stTop); } else { // if no upper layer, all surfaces of this one are solid // we clone surfaces because we're going to clear the slices collection - top = layerm->slices.surfaces; + top = layerm->slices().surfaces; for (Surface &surface : top) surface.surface_type = stTop; } @@ -849,7 +958,7 @@ void PrintObject::detect_surfaces_type() surfaces_append( bottom, opening_ex( - diff_ex(layerm->slices.surfaces, lower_layer->lslices, ApplySafetyOffset::Yes), + diff_ex(layerm->slices().surfaces, lower_layer->lslices, ApplySafetyOffset::Yes), offset), surface_type_bottom_other); // if user requested internal shells, we need to identify surfaces @@ -861,8 +970,8 @@ void PrintObject::detect_surfaces_type() bottom, opening_ex( diff_ex( - intersection(layerm->slices.surfaces, lower_layer->lslices), // supported - lower_layer->m_regions[region_id]->slices.surfaces, + intersection(layerm->slices().surfaces, lower_layer->lslices), // supported + lower_layer->m_regions[region_id]->slices().surfaces, ApplySafetyOffset::Yes), offset), stBottom); @@ -871,7 +980,7 @@ void PrintObject::detect_surfaces_type() } else { // if no lower layer, all surfaces of this one are solid // we clone surfaces because we're going to clear the slices collection - bottom = layerm->slices.surfaces; + bottom = layerm->slices().surfaces; for (Surface &surface : bottom) surface.surface_type = stBottom; } @@ -892,21 +1001,21 @@ void PrintObject::detect_surfaces_type() { static int iRun = 0; std::vector> expolygons_with_attributes; - expolygons_with_attributes.emplace_back(std::make_pair(union_ex(top), SVG::ExPolygonAttributes("green"))); - expolygons_with_attributes.emplace_back(std::make_pair(union_ex(bottom), SVG::ExPolygonAttributes("brown"))); - expolygons_with_attributes.emplace_back(std::make_pair(to_expolygons(layerm->slices.surfaces), SVG::ExPolygonAttributes("black"))); + expolygons_with_attributes.emplace_back(std::make_pair(union_ex(top), SVG::ExPolygonAttributes("green"))); + expolygons_with_attributes.emplace_back(std::make_pair(union_ex(bottom), SVG::ExPolygonAttributes("brown"))); + expolygons_with_attributes.emplace_back(std::make_pair(to_expolygons(layerm->slices().surfaces), SVG::ExPolygonAttributes("black"))); SVG::export_expolygons(debug_out_path("1_detect_surfaces_type_%d_region%d-layer_%f.svg", iRun ++, region_id, layer->print_z).c_str(), expolygons_with_attributes); } #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ // save surfaces to layer - Surfaces &surfaces_out = interface_shells ? surfaces_new[idx_layer] : layerm->slices.surfaces; + Surfaces &surfaces_out = interface_shells ? surfaces_new[idx_layer] : layerm->m_slices.surfaces; Surfaces surfaces_backup; if (! interface_shells) { surfaces_backup = std::move(surfaces_out); surfaces_out.clear(); } - const Surfaces &surfaces_prev = interface_shells ? layerm->slices.surfaces : surfaces_backup; + const Surfaces &surfaces_prev = interface_shells ? layerm->slices().surfaces : surfaces_backup; // find internal surfaces (difference between top/bottom surfaces and others) { @@ -932,15 +1041,15 @@ void PrintObject::detect_surfaces_type() if (interface_shells) { // Move surfaces_new to layerm->slices.surfaces for (size_t idx_layer = 0; idx_layer < num_layers; ++ idx_layer) - m_layers[idx_layer]->m_regions[region_id]->slices.surfaces = std::move(surfaces_new[idx_layer]); + m_layers[idx_layer]->m_regions[region_id]->m_slices.set(std::move(surfaces_new[idx_layer])); } if (spiral_vase) { if (num_layers > 1) // Turn the last bottom layer infill to a top infill, so it will be extruded with a proper pattern. - m_layers[num_layers - 1]->m_regions[region_id]->slices.set_type(stTop); + m_layers[num_layers - 1]->m_regions[region_id]->m_slices.set_type(stTop); for (size_t i = num_layers; i < m_layers.size(); ++ i) - m_layers[i]->m_regions[region_id]->slices.set_type(stInternal); + m_layers[i]->m_regions[region_id]->m_slices.set_type(stInternal); } BOOST_LOG_TRIVIAL(debug) << "Detecting solid surfaces for region " << region_id << " - clipping in parallel - start"; @@ -982,12 +1091,12 @@ void PrintObject::process_external_surfaces() if (has_voids && m_layers.size() > 1) { // All but stInternal fill surfaces will get expanded and possibly trimmed. std::vector layer_expansions_and_voids(m_layers.size(), false); - for (size_t layer_idx = 0; layer_idx < m_layers.size(); ++ layer_idx) { + for (size_t layer_idx = 1; layer_idx < m_layers.size(); ++ layer_idx) { const Layer *layer = m_layers[layer_idx]; bool expansions = false; bool voids = false; for (const LayerRegion *layerm : layer->regions()) { - for (const Surface &surface : layerm->fill_surfaces.surfaces) { + for (const Surface &surface : layerm->fill_surfaces()) { if (surface.surface_type == stInternal) voids = true; else @@ -1008,11 +1117,13 @@ void PrintObject::process_external_surfaces() [this, &surfaces_covered, &layer_expansions_and_voids, unsupported_width](const tbb::blocked_range& range) { for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) if (layer_expansions_and_voids[layer_idx + 1]) { + // Layer above is partially filled with solid infill (top, bottom, bridging...), + // while some sparse inill regions are empty (0% infill). m_print->throw_if_canceled(); Polygons voids; for (const LayerRegion *layerm : m_layers[layer_idx]->regions()) { if (layerm->region().config().fill_density.value == 0.) - for (const Surface &surface : layerm->fill_surfaces.surfaces) + for (const Surface &surface : layerm->fill_surfaces()) // Shrink the holes, let the layer above expand slightly inside the unsupported areas. polygons_append(voids, offset(surface.expolygon, unsupported_width)); } @@ -1033,7 +1144,9 @@ void PrintObject::process_external_surfaces() m_print->throw_if_canceled(); // BOOST_LOG_TRIVIAL(trace) << "Processing external surface, layer" << m_layers[layer_idx]->print_z; m_layers[layer_idx]->get_region(int(region_id))->process_external_surfaces( + // lower layer (layer_idx == 0) ? nullptr : m_layers[layer_idx - 1], + // lower layer polygons with density > 0% (layer_idx == 0 || surfaces_covered.empty() || surfaces_covered[layer_idx - 1].empty()) ? nullptr : &surfaces_covered[layer_idx - 1]); } } @@ -1041,12 +1154,19 @@ void PrintObject::process_external_surfaces() m_print->throw_if_canceled(); BOOST_LOG_TRIVIAL(debug) << "Processing external surfaces for region " << region_id << " in parallel - end"; } -} + + if (this->has_raft() && ! m_layers.empty()) { + // Adjust bridge direction of 1st object layer over raft to be perpendicular to the raft contact layer direction. + Layer &layer = *m_layers.front(); + assert(layer.id() > 0); + for (LayerRegion *layerm : layer.regions()) + for (Surface &fill : layerm->m_fill_surfaces) + fill.bridge_angle = -1; + } +} // void PrintObject::process_external_surfaces() void PrintObject::discover_vertical_shells() { - PROFILE_FUNC(); - BOOST_LOG_TRIVIAL(info) << "Discovering vertical shells..." << log_memory_info(); struct DiscoverVerticalShellsCacheEntry @@ -1073,6 +1193,9 @@ void PrintObject::discover_vertical_shells() }; std::vector cache_top_botom_regions(num_layers, DiscoverVerticalShellsCacheEntry()); bool top_bottom_surfaces_all_regions = this->num_printing_regions() > 1 && ! m_config.interface_shells.value; +// static constexpr const float top_bottom_expansion_coeff = 1.05f; + // Just a tiny fraction of an infill extrusion width to merge neighbor regions reliably. + static constexpr const float top_bottom_expansion_coeff = 0.05f; if (top_bottom_surfaces_all_regions) { // This is a multi-material print and interface_shells are disabled, meaning that the vertical shell thickness // is calculated over all materials. @@ -1080,7 +1203,7 @@ void PrintObject::discover_vertical_shells() bool has_extra_layers = false; for (size_t region_id = 0; region_id < this->num_printing_regions(); ++region_id) { const PrintRegionConfig &config = this->printing_region(region_id).config(); - if (config.ensure_vertical_shell_thickness.value && has_extra_layers_fn(config)) { + if (has_extra_layers_fn(config)) { has_extra_layers = true; break; } @@ -1094,7 +1217,7 @@ void PrintObject::discover_vertical_shells() tbb::parallel_for( tbb::blocked_range(0, num_layers, grain_size), [this, &cache_top_botom_regions](const tbb::blocked_range& range) { - const SurfaceType surfaces_bottom[2] = { stBottom, stBottomBridge }; + const std::initializer_list surfaces_bottom { stBottom, stBottomBridge }; const size_t num_regions = this->num_printing_regions(); for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { m_print->throw_if_canceled(); @@ -1108,18 +1231,18 @@ void PrintObject::discover_vertical_shells() ++ debug_idx; #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ for (size_t region_id = 0; region_id < num_regions; ++ region_id) { - LayerRegion &layerm = *layer.m_regions[region_id]; - float min_perimeter_infill_spacing = float(layerm.flow(frSolidInfill).scaled_spacing()) * 1.05f; + LayerRegion &layerm = *layer.m_regions[region_id]; + float top_bottom_expansion = float(layerm.flow(frSolidInfill).scaled_spacing()) * top_bottom_expansion_coeff; // Top surfaces. - append(cache.top_surfaces, offset(layerm.slices.filter_by_type(stTop), min_perimeter_infill_spacing)); - append(cache.top_surfaces, offset(layerm.fill_surfaces.filter_by_type(stTop), min_perimeter_infill_spacing)); + append(cache.top_surfaces, offset(layerm.slices().filter_by_type(stTop), top_bottom_expansion)); +// append(cache.top_surfaces, offset(layerm.fill_surfaces().filter_by_type(stTop), top_bottom_expansion)); // Bottom surfaces. - append(cache.bottom_surfaces, offset(layerm.slices.filter_by_types(surfaces_bottom, 2), min_perimeter_infill_spacing)); - append(cache.bottom_surfaces, offset(layerm.fill_surfaces.filter_by_types(surfaces_bottom, 2), min_perimeter_infill_spacing)); + append(cache.bottom_surfaces, offset(layerm.slices().filter_by_types(surfaces_bottom), top_bottom_expansion)); +// append(cache.bottom_surfaces, offset(layerm.fill_surfaces().filter_by_types(surfaces_bottom), top_bottom_expansion)); // Calculate the maximum perimeter offset as if the slice was extruded with a single extruder only. // First find the maxium number of perimeters per region slice. unsigned int perimeters = 0; - for (Surface &s : layerm.slices.surfaces) + for (const Surface &s : layerm.slices()) perimeters = std::max(perimeters, s.extra_perimeters); perimeters += layerm.region().config().perimeters.value; // Then calculate the infill offset. @@ -1130,7 +1253,7 @@ void PrintObject::discover_vertical_shells() 0.5f * float(extflow.scaled_width() + extflow.scaled_spacing()) + (float(perimeters) - 1.f) * flow.scaled_spacing()); perimeter_min_spacing = std::min(perimeter_min_spacing, float(std::min(extflow.scaled_spacing(), flow.scaled_spacing()))); } - polygons_append(cache.holes, to_polygons(layerm.fill_expolygons)); + polygons_append(cache.holes, to_polygons(layerm.fill_expolygons())); } // Save some computing time by reducing the number of polygons. cache.top_surfaces = union_(cache.top_surfaces); @@ -1157,12 +1280,7 @@ void PrintObject::discover_vertical_shells() } for (size_t region_id = 0; region_id < this->num_printing_regions(); ++ region_id) { - PROFILE_BLOCK(discover_vertical_shells_region); - const PrintRegion ®ion = this->printing_region(region_id); - if (! region.config().ensure_vertical_shell_thickness.value) - // This region will be handled by discover_horizontal_shells(). - continue; if (! has_extra_layers_fn(region.config())) // Zero or 1 layer, there is no additional vertical wall thickness enforced. continue; @@ -1177,23 +1295,23 @@ void PrintObject::discover_vertical_shells() tbb::parallel_for( tbb::blocked_range(0, num_layers, grain_size), [this, region_id, &cache_top_botom_regions](const tbb::blocked_range& range) { - const SurfaceType surfaces_bottom[2] = { stBottom, stBottomBridge }; + const std::initializer_list surfaces_bottom { stBottom, stBottomBridge }; for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { m_print->throw_if_canceled(); - Layer &layer = *m_layers[idx_layer]; - LayerRegion &layerm = *layer.m_regions[region_id]; - float min_perimeter_infill_spacing = float(layerm.flow(frSolidInfill).scaled_spacing()) * 1.05f; + Layer &layer = *m_layers[idx_layer]; + LayerRegion &layerm = *layer.m_regions[region_id]; + float top_bottom_expansion = float(layerm.flow(frSolidInfill).scaled_spacing()) * top_bottom_expansion_coeff; // Top surfaces. auto &cache = cache_top_botom_regions[idx_layer]; - cache.top_surfaces = offset(layerm.slices.filter_by_type(stTop), min_perimeter_infill_spacing); - append(cache.top_surfaces, offset(layerm.fill_surfaces.filter_by_type(stTop), min_perimeter_infill_spacing)); + cache.top_surfaces = offset(layerm.slices().filter_by_type(stTop), top_bottom_expansion); +// append(cache.top_surfaces, offset(layerm.fill_surfaces().filter_by_type(stTop), top_bottom_expansion)); // Bottom surfaces. - cache.bottom_surfaces = offset(layerm.slices.filter_by_types(surfaces_bottom, 2), min_perimeter_infill_spacing); - append(cache.bottom_surfaces, offset(layerm.fill_surfaces.filter_by_types(surfaces_bottom, 2), min_perimeter_infill_spacing)); + cache.bottom_surfaces = offset(layerm.slices().filter_by_types(surfaces_bottom), top_bottom_expansion); +// append(cache.bottom_surfaces, offset(layerm.fill_surfaces().filter_by_types(surfaces_bottom), top_bottom_expansion)); // Holes over all regions. Only collect them once, they are valid for all region_id iterations. if (cache.holes.empty()) { for (size_t region_id = 0; region_id < layer.regions().size(); ++ region_id) - polygons_append(cache.holes, to_polygons(layer.regions()[region_id]->fill_expolygons)); + polygons_append(cache.holes, to_polygons(layer.regions()[region_id]->fill_expolygons())); } } }); @@ -1208,7 +1326,6 @@ void PrintObject::discover_vertical_shells() (const tbb::blocked_range& range) { // printf("discover_vertical_shells from %d to %d\n", range.begin(), range.end()); for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { - PROFILE_BLOCK(discover_vertical_shells_region_layer); m_print->throw_if_canceled(); #ifdef SLIC3R_DEBUG_SLICE_PROCESSING static size_t debug_idx = 0; @@ -1220,8 +1337,8 @@ void PrintObject::discover_vertical_shells() const PrintRegionConfig ®ion_config = layerm->region().config(); #ifdef SLIC3R_DEBUG_SLICE_PROCESSING - layerm->export_region_slices_to_svg_debug("4_discover_vertical_shells-initial"); - layerm->export_region_fill_surfaces_to_svg_debug("4_discover_vertical_shells-initial"); + layerm->export_region_slices_to_svg_debug("3_discover_vertical_shells-initial"); + layerm->export_region_fill_surfaces_to_svg_debug("3_discover_vertical_shells-initial"); #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ Flow solid_infill_flow = layerm->flow(frSolidInfill); @@ -1233,88 +1350,95 @@ void PrintObject::discover_vertical_shells() ExPolygons shell_ex; #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ float min_perimeter_infill_spacing = float(infill_line_spacing) * 1.05f; - { - PROFILE_BLOCK(discover_vertical_shells_region_layer_collect); #if 0 // #ifdef SLIC3R_DEBUG_SLICE_PROCESSING - { - Slic3r::SVG svg_cummulative(debug_out_path("discover_vertical_shells-perimeters-before-union-run%d.svg", debug_idx), this->bounding_box()); - for (int n = (int)idx_layer - n_extra_bottom_layers; n <= (int)idx_layer + n_extra_top_layers; ++ n) { - if (n < 0 || n >= (int)m_layers.size()) - continue; - ExPolygons &expolys = m_layers[n]->perimeter_expolygons; - for (size_t i = 0; i < expolys.size(); ++ i) { - Slic3r::SVG svg(debug_out_path("discover_vertical_shells-perimeters-before-union-run%d-layer%d-expoly%d.svg", debug_idx, n, i), get_extents(expolys[i])); - svg.draw(expolys[i]); - svg.draw_outline(expolys[i].contour, "black", scale_(0.05)); - svg.draw_outline(expolys[i].holes, "blue", scale_(0.05)); - svg.Close(); - - svg_cummulative.draw(expolys[i]); - svg_cummulative.draw_outline(expolys[i].contour, "black", scale_(0.05)); - svg_cummulative.draw_outline(expolys[i].holes, "blue", scale_(0.05)); - } + { + Slic3r::SVG svg_cummulative(debug_out_path("discover_vertical_shells-perimeters-before-union-run%d.svg", debug_idx), this->bounding_box()); + for (int n = (int)idx_layer - n_extra_bottom_layers; n <= (int)idx_layer + n_extra_top_layers; ++ n) { + if (n < 0 || n >= (int)m_layers.size()) + continue; + ExPolygons &expolys = m_layers[n]->perimeter_expolygons; + for (size_t i = 0; i < expolys.size(); ++ i) { + Slic3r::SVG svg(debug_out_path("discover_vertical_shells-perimeters-before-union-run%d-layer%d-expoly%d.svg", debug_idx, n, i), get_extents(expolys[i])); + svg.draw(expolys[i]); + svg.draw_outline(expolys[i].contour, "black", scale_(0.05)); + svg.draw_outline(expolys[i].holes, "blue", scale_(0.05)); + svg.Close(); + + svg_cummulative.draw(expolys[i]); + svg_cummulative.draw_outline(expolys[i].contour, "black", scale_(0.05)); + svg_cummulative.draw_outline(expolys[i].holes, "blue", scale_(0.05)); } } + } #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ - polygons_append(holes, cache_top_botom_regions[idx_layer].holes); - if (int n_top_layers = region_config.top_solid_layers.value; n_top_layers > 0) { - // Gather top regions projected to this layer. - coordf_t print_z = layer->print_z; - for (int i = int(idx_layer) + 1; - i < int(cache_top_botom_regions.size()) && - (i < int(idx_layer) + n_top_layers || - m_layers[i]->print_z - print_z < region_config.top_solid_min_thickness - EPSILON); - ++ i) { - const DiscoverVerticalShellsCacheEntry &cache = cache_top_botom_regions[i]; - if (! holes.empty()) - holes = intersection(holes, cache.holes); - if (! cache.top_surfaces.empty()) { - polygons_append(shell, cache.top_surfaces); - // Running the union_ using the Clipper library piece by piece is cheaper - // than running the union_ all at once. - shell = union_(shell); - } - } + polygons_append(holes, cache_top_botom_regions[idx_layer].holes); + auto combine_holes = [&holes](const Polygons &holes2) { + if (holes.empty() || holes2.empty()) + holes.clear(); + else + holes = intersection(holes, holes2); + }; + auto combine_shells = [&shell](const Polygons &shells2) { + if (shell.empty()) + shell = std::move(shells2); + else if (! shells2.empty()) { + polygons_append(shell, shells2); + // Running the union_ using the Clipper library piece by piece is cheaper + // than running the union_ all at once. + shell = union_(shell); + } + }; + static constexpr const bool one_more_layer_below_top_bottom_surfaces = false; + if (int n_top_layers = region_config.top_solid_layers.value; n_top_layers > 0) { + // Gather top regions projected to this layer. + coordf_t print_z = layer->print_z; + int i = int(idx_layer) + 1; + int itop = int(idx_layer) + n_top_layers; + for (; i < int(cache_top_botom_regions.size()) && + (i < itop || m_layers[i]->print_z - print_z < region_config.top_solid_min_thickness - EPSILON); + ++ i) { + const DiscoverVerticalShellsCacheEntry &cache = cache_top_botom_regions[i]; + combine_holes(cache.holes); + combine_shells(cache.top_surfaces); } - if (int n_bottom_layers = region_config.bottom_solid_layers.value; n_bottom_layers > 0) { - // Gather bottom regions projected to this layer. - coordf_t bottom_z = layer->bottom_z(); - for (int i = int(idx_layer) - 1; - i >= 0 && - (i > int(idx_layer) - n_bottom_layers || - bottom_z - m_layers[i]->bottom_z() < region_config.bottom_solid_min_thickness - EPSILON); - -- i) { - const DiscoverVerticalShellsCacheEntry &cache = cache_top_botom_regions[i]; - if (! holes.empty()) - holes = intersection(holes, cache.holes); - if (! cache.bottom_surfaces.empty()) { - polygons_append(shell, cache.bottom_surfaces); - // Running the union_ using the Clipper library piece by piece is cheaper - // than running the union_ all at once. - shell = union_(shell); - } - } + if (one_more_layer_below_top_bottom_surfaces) + if (i < int(cache_top_botom_regions.size()) && + (i <= itop || m_layers[i]->bottom_z() - print_z < region_config.top_solid_min_thickness - EPSILON)) + combine_holes(cache_top_botom_regions[i].holes); + } + if (int n_bottom_layers = region_config.bottom_solid_layers.value; n_bottom_layers > 0) { + // Gather bottom regions projected to this layer. + coordf_t bottom_z = layer->bottom_z(); + int i = int(idx_layer) - 1; + int ibottom = int(idx_layer) - n_bottom_layers; + for (; i >= 0 && + (i > ibottom || bottom_z - m_layers[i]->bottom_z() < region_config.bottom_solid_min_thickness - EPSILON); + -- i) { + const DiscoverVerticalShellsCacheEntry &cache = cache_top_botom_regions[i]; + combine_holes(cache.holes); + combine_shells(cache.bottom_surfaces); } + if (one_more_layer_below_top_bottom_surfaces) + if (i >= 0 && + (i > ibottom || bottom_z - m_layers[i]->print_z < region_config.bottom_solid_min_thickness - EPSILON)) + combine_holes(cache_top_botom_regions[i].holes); + } #ifdef SLIC3R_DEBUG_SLICE_PROCESSING - { - Slic3r::SVG svg(debug_out_path("discover_vertical_shells-perimeters-before-union-%d.svg", debug_idx), get_extents(shell)); - svg.draw(shell); - svg.draw_outline(shell, "black", scale_(0.05)); - svg.Close(); - } + { + Slic3r::SVG svg(debug_out_path("discover_vertical_shells-perimeters-before-union-%d.svg", debug_idx), get_extents(shell)); + svg.draw(shell); + svg.draw_outline(shell, "black", scale_(0.05)); + svg.Close(); + } #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ #if 0 - { - PROFILE_BLOCK(discover_vertical_shells_region_layer_shell_); - // shell = union_(shell, true); - shell = union_(shell, false); - } +// shell = union_(shell, true); + shell = union_(shell, false); #endif #ifdef SLIC3R_DEBUG_SLICE_PROCESSING - shell_ex = union_safety_offset_ex(shell); + shell_ex = union_safety_offset_ex(shell); #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ - } //if (shell.empty()) // continue; @@ -1331,40 +1455,39 @@ void PrintObject::discover_vertical_shells() #ifdef SLIC3R_DEBUG_SLICE_PROCESSING { Slic3r::SVG svg(debug_out_path("discover_vertical_shells-internal-wshell-%d.svg", debug_idx), get_extents(shell)); - svg.draw(layerm->fill_surfaces.filter_by_type(stInternal), "yellow", 0.5); - svg.draw_outline(layerm->fill_surfaces.filter_by_type(stInternal), "black", "blue", scale_(0.05)); + svg.draw(layerm->fill_surfaces().filter_by_type(stInternal), "yellow", 0.5); + svg.draw_outline(layerm->fill_surfaces().filter_by_type(stInternal), "black", "blue", scale_(0.05)); svg.draw(shell_ex, "blue", 0.5); svg.draw_outline(shell_ex, "black", "blue", scale_(0.05)); svg.Close(); } { Slic3r::SVG svg(debug_out_path("discover_vertical_shells-internalvoid-wshell-%d.svg", debug_idx), get_extents(shell)); - svg.draw(layerm->fill_surfaces.filter_by_type(stInternalVoid), "yellow", 0.5); - svg.draw_outline(layerm->fill_surfaces.filter_by_type(stInternalVoid), "black", "blue", scale_(0.05)); + svg.draw(layerm->fill_surfaces().filter_by_type(stInternalVoid), "yellow", 0.5); + svg.draw_outline(layerm->fill_surfaces().filter_by_type(stInternalVoid), "black", "blue", scale_(0.05)); svg.draw(shell_ex, "blue", 0.5); svg.draw_outline(shell_ex, "black", "blue", scale_(0.05)); svg.Close(); } { - Slic3r::SVG svg(debug_out_path("discover_vertical_shells-internalvoid-wshell-%d.svg", debug_idx), get_extents(shell)); - svg.draw(layerm->fill_surfaces.filter_by_type(stInternalVoid), "yellow", 0.5); - svg.draw_outline(layerm->fill_surfaces.filter_by_type(stInternalVoid), "black", "blue", scale_(0.05)); + Slic3r::SVG svg(debug_out_path("discover_vertical_shells-internalsolid-wshell-%d.svg", debug_idx), get_extents(shell)); + svg.draw(layerm->fill_surfaces().filter_by_type(stInternalSolid), "yellow", 0.5); + svg.draw_outline(layerm->fill_surfaces().filter_by_type(stInternalSolid), "black", "blue", scale_(0.05)); svg.draw(shell_ex, "blue", 0.5); - svg.draw_outline(shell_ex, "black", "blue", scale_(0.05)); + svg.draw_outline(shell_ex, "black", "blue", scale_(0.05)); svg.Close(); } #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ // Trim the shells region by the internal & internal void surfaces. - const SurfaceType surfaceTypesInternal[] = { stInternal, stInternalVoid, stInternalSolid }; - const Polygons polygonsInternal = to_polygons(layerm->fill_surfaces.filter_by_types(surfaceTypesInternal, 3)); + const Polygons polygonsInternal = to_polygons(layerm->fill_surfaces().filter_by_types({ stInternal, stInternalVoid, stInternalSolid })); shell = intersection(shell, polygonsInternal, ApplySafetyOffset::Yes); polygons_append(shell, diff(polygonsInternal, holes)); if (shell.empty()) continue; // Append the internal solids, so they will be merged with the new ones. - polygons_append(shell, to_polygons(layerm->fill_surfaces.filter_by_type(stInternalSolid))); + polygons_append(shell, to_polygons(layerm->fill_surfaces().filter_by_type(stInternalSolid))); // These regions will be filled by a rectilinear full infill. Currently this type of infill // only fills regions, which fit at least a single line. To avoid gaps in the sparse infill, @@ -1372,31 +1495,36 @@ void PrintObject::discover_vertical_shells() #ifdef SLIC3R_DEBUG_SLICE_PROCESSING Polygons shell_before = shell; #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ -#if 1 - // Intentionally inflate a bit more than how much the region has been shrunk, - // so there will be some overlap between this solid infill and the other infill regions (mainly the sparse infill). - shell = opening(union_(shell), 0.5f * min_perimeter_infill_spacing, 0.8f * min_perimeter_infill_spacing, ClipperLib::jtSquare); - if (shell.empty()) - continue; -#else - // Ensure each region is at least 3x infill line width wide, so it could be filled in. - // float margin = float(infill_line_spacing) * 3.f; - float margin = float(infill_line_spacing) * 1.5f; - // we use a higher miterLimit here to handle areas with acute angles - // in those cases, the default miterLimit would cut the corner and we'd - // get a triangle in $too_narrow; if we grow it below then the shell - // would have a different shape from the external surface and we'd still - // have the same angle, so the next shell would be grown even more and so on. - Polygons too_narrow = diff(shell, opening(shell, margin, ClipperLib::jtMiter, 5.), true); - if (! too_narrow.empty()) { - // grow the collapsing parts and add the extra area to the neighbor layer - // as well as to our original surfaces so that we support this - // additional area in the next shell too - // make sure our grown surfaces don't exceed the fill area - polygons_append(shell, intersection(offset(too_narrow, margin), polygonsInternal)); + ExPolygons regularized_shell; + { + // Open to remove (filter out) regions narrower than a bit less than an infill extrusion line width. + // Such narrow regions are difficult to fill in with a gap fill algorithm (or Arachne), however they are most likely + // not needed for print stability / quality. + const float narrow_ensure_vertical_wall_thickness_region_radius = 0.5f * 0.65f * min_perimeter_infill_spacing; + // Then close gaps narrower than 1.2 * line width, such gaps are difficult to fill in with sparse infill, + // thus they will be merged into the solid infill. + const float narrow_sparse_infill_region_radius = 0.5f * 1.2f * min_perimeter_infill_spacing; + // Finally expand the infill a bit to remove tiny gaps between solid infill and the other regions. + const float tiny_overlap_radius = 0.2f * min_perimeter_infill_spacing; + regularized_shell = shrink_ex(offset2_ex(union_ex(shell), + // Open to remove (filter out) regions narrower than an infill extrusion line width. + -narrow_ensure_vertical_wall_thickness_region_radius, + // Then close gaps narrower than 1.2 * line width, such gaps are difficult to fill in with sparse infill. + narrow_ensure_vertical_wall_thickness_region_radius + narrow_sparse_infill_region_radius, ClipperLib::jtSquare), + // Finally expand the infill a bit to remove tiny gaps between solid infill and the other regions. + narrow_sparse_infill_region_radius - tiny_overlap_radius, ClipperLib::jtSquare); + + // The opening operation may cause scattered tiny drops on the smooth parts of the model, filter them out + regularized_shell.erase(std::remove_if(regularized_shell.begin(), regularized_shell.end(), + [&min_perimeter_infill_spacing](const ExPolygon &p) { + return p.area() < min_perimeter_infill_spacing * scaled(8.0); + }), + regularized_shell.end()); } -#endif - ExPolygons new_internal_solid = intersection_ex(polygonsInternal, shell); + if (regularized_shell.empty()) + continue; + + ExPolygons new_internal_solid = intersection_ex(polygonsInternal, regularized_shell); #ifdef SLIC3R_DEBUG_SLICE_PROCESSING { Slic3r::SVG svg(debug_out_path("discover_vertical_shells-regularized-%d.svg", debug_idx), get_extents(shell_before)); @@ -1411,8 +1539,8 @@ void PrintObject::discover_vertical_shells() #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ // Trim the internal & internalvoid by the shell. - Slic3r::ExPolygons new_internal = diff_ex(layerm->fill_surfaces.filter_by_type(stInternal), shell); - Slic3r::ExPolygons new_internal_void = diff_ex(layerm->fill_surfaces.filter_by_type(stInternalVoid), shell); + Slic3r::ExPolygons new_internal = diff_ex(layerm->fill_surfaces().filter_by_type(stInternal), regularized_shell); + Slic3r::ExPolygons new_internal_void = diff_ex(layerm->fill_surfaces().filter_by_type(stInternalVoid), regularized_shell); #ifdef SLIC3R_DEBUG_SLICE_PROCESSING { @@ -1423,11 +1551,10 @@ void PrintObject::discover_vertical_shells() #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ // Assign resulting internal surfaces to layer. - const SurfaceType surfaceTypesKeep[] = { stTop, stBottom, stBottomBridge }; - layerm->fill_surfaces.keep_types(surfaceTypesKeep, sizeof(surfaceTypesKeep)/sizeof(SurfaceType)); - layerm->fill_surfaces.append(new_internal, stInternal); - layerm->fill_surfaces.append(new_internal_void, stInternalVoid); - layerm->fill_surfaces.append(new_internal_solid, stInternalSolid); + layerm->m_fill_surfaces.keep_types({ stTop, stBottom, stBottomBridge }); + layerm->m_fill_surfaces.append(new_internal, stInternal); + layerm->m_fill_surfaces.append(new_internal_void, stInternalVoid); + layerm->m_fill_surfaces.append(new_internal_solid, stInternalSolid); } // for each layer }); m_print->throw_if_canceled(); @@ -1436,137 +1563,719 @@ void PrintObject::discover_vertical_shells() #ifdef SLIC3R_DEBUG_SLICE_PROCESSING for (size_t idx_layer = 0; idx_layer < m_layers.size(); ++idx_layer) { LayerRegion *layerm = m_layers[idx_layer]->get_region(region_id); - layerm->export_region_slices_to_svg_debug("4_discover_vertical_shells-final"); - layerm->export_region_fill_surfaces_to_svg_debug("4_discover_vertical_shells-final"); + layerm->export_region_slices_to_svg_debug("3_discover_vertical_shells-final"); + layerm->export_region_fill_surfaces_to_svg_debug("3_discover_vertical_shells-final"); } #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ } // for each region +} // void PrintObject::discover_vertical_shells() - // Write the profiler measurements to file -// PROFILE_UPDATE(); -// PROFILE_OUTPUT(debug_out_path("discover_vertical_shells-profile.txt").c_str()); +// #define DEBUG_BRIDGE_OVER_INFILL +#ifdef DEBUG_BRIDGE_OVER_INFILL +template void debug_draw(std::string name, const T& a, const T& b, const T& c, const T& d) +{ + std::vector colors = {"red", "blue", "orange", "green"}; + BoundingBox bbox = get_extents(a); + bbox.merge(get_extents(b)); + bbox.merge(get_extents(c)); + bbox.merge(get_extents(d)); + bbox.offset(scale_(1.)); + ::Slic3r::SVG svg(debug_out_path(name.c_str()).c_str(), bbox); + svg.draw(a, colors[0], scale_(0.3)); + svg.draw(b, colors[1], scale_(0.23)); + svg.draw(c, colors[2], scale_(0.16)); + svg.draw(d, colors[3], scale_(0.10)); + svg.Close(); } +#endif -/* This method applies bridge flow to the first internal solid layer above - sparse infill */ +// This method applies bridge flow to the first internal solid layer above sparse infill. void PrintObject::bridge_over_infill() { - BOOST_LOG_TRIVIAL(info) << "Bridge over infill..." << log_memory_info(); + BOOST_LOG_TRIVIAL(info) << "Bridge over infill - Start" << log_memory_info(); - for (size_t region_id = 0; region_id < this->num_printing_regions(); ++ region_id) { - const PrintRegion ®ion = this->printing_region(region_id); - - // skip bridging in case there are no voids - if (region.config().fill_density.value == 100) - continue; + struct CandidateSurface + { + CandidateSurface(const Surface *original_surface, + int layer_index, + Polygons new_polys, + const LayerRegion *region, + double bridge_angle, + bool supported_by_lightning) + : original_surface(original_surface) + , layer_index(layer_index) + , new_polys(new_polys) + , region(region) + , bridge_angle(bridge_angle) + , supported_by_lightning(supported_by_lightning) + {} + const Surface *original_surface; + int layer_index; + Polygons new_polys; + const LayerRegion *region; + double bridge_angle; + bool supported_by_lightning; + }; - for (LayerPtrs::iterator layer_it = m_layers.begin(); layer_it != m_layers.end(); ++ layer_it) { - // skip first layer - if (layer_it == m_layers.begin()) - continue; - - Layer *layer = *layer_it; - LayerRegion *layerm = layer->m_regions[region_id]; - Flow bridge_flow = layerm->bridging_flow(frSolidInfill); + std::map> surfaces_by_layer; - // extract the stInternalSolid surfaces that might be transformed into bridges - Polygons internal_solid; - layerm->fill_surfaces.filter_by_type(stInternalSolid, &internal_solid); - - // check whether the lower area is deep enough for absorbing the extra flow - // (for obvious physical reasons but also for preventing the bridge extrudates - // from overflowing in 3D preview) - ExPolygons to_bridge; + // SECTION to gather and filter surfaces for expanding, and then cluster them by layer + { + tbb::concurrent_vector candidate_surfaces; + tbb::parallel_for(tbb::blocked_range(0, this->layers().size()), [po = static_cast(this), + &candidate_surfaces](tbb::blocked_range r) { + for (size_t lidx = r.begin(); lidx < r.end(); lidx++) { + const Layer *layer = po->get_layer(lidx); + if (layer->lower_layer == nullptr) { + continue; + } + double spacing = layer->regions().front()->flow(frSolidInfill).scaled_spacing(); + // unsupported area will serve as a filter for polygons worth bridging. + Polygons unsupported_area; + Polygons lower_layer_solids; + bool contains_only_lightning = true; + for (const LayerRegion *region : layer->lower_layer->regions()) { + if (region->region().config().fill_pattern.value != ipLightning) { + contains_only_lightning = false; + } + Polygons fill_polys = to_polygons(region->fill_expolygons()); + // initially consider the whole layer unsupported, but also gather solid layers to later cut off supported parts + unsupported_area.insert(unsupported_area.end(), fill_polys.begin(), fill_polys.end()); + for (const Surface &surface : region->fill_surfaces()) { + if (surface.surface_type != stInternal || region->region().config().fill_density.value == 100) { + Polygons p = to_polygons(surface.expolygon); + lower_layer_solids.insert(lower_layer_solids.end(), p.begin(), p.end()); + } + } + } + unsupported_area = closing(unsupported_area, SCALED_EPSILON); + // By expanding the lower layer solids, we avoid making bridges from the tiny internal overhangs that are (very likely) supported by previous layer solids + // NOTE that we cannot filter out polygons worth bridging by their area, because sometimes there is a very small internal island that will grow into large hole + lower_layer_solids = shrink(lower_layer_solids, 1 * spacing); // first remove thin regions that will not support anything + lower_layer_solids = expand(lower_layer_solids, (1 + 3) * spacing); // then expand back (opening), and further for parts supported by internal solids + // By shrinking the unsupported area, we avoid making bridges from narrow ensuring region along perimeters. + unsupported_area = shrink(unsupported_area, 3 * spacing); + unsupported_area = diff(unsupported_area, lower_layer_solids); + + for (const LayerRegion *region : layer->regions()) { + SurfacesPtr region_internal_solids = region->fill_surfaces().filter_by_type(stInternalSolid); + for (const Surface *s : region_internal_solids) { + Polygons unsupported = intersection(to_polygons(s->expolygon), unsupported_area); + // The following flag marks those surfaces, which overlap with unuspported area, but at least part of them is supported. + // These regions can be filtered by area, because they for sure are touching solids on lower layers, and it does not make sense to bridge their tiny overhangs + bool partially_supported = area(unsupported) < area(to_polygons(s->expolygon)) - EPSILON; + if (!unsupported.empty() && (!partially_supported || area(unsupported) > 3 * 3 * spacing * spacing)) { + Polygons worth_bridging = intersection(to_polygons(s->expolygon), expand(unsupported, 4 * spacing)); + // after we extracted the part worth briding, we go over the leftovers and merge the tiny ones back, to not brake the surface too much + for (const Polygon& p : diff(to_polygons(s->expolygon), expand(worth_bridging, spacing))) { + double area = p.area(); + if (area < spacing * scale_(12.0) && area > spacing * spacing) { + worth_bridging.push_back(p); + } + } + worth_bridging = intersection(closing(worth_bridging, SCALED_EPSILON), s->expolygon); + candidate_surfaces.push_back(CandidateSurface(s, lidx, worth_bridging, region, 0, contains_only_lightning)); + +#ifdef DEBUG_BRIDGE_OVER_INFILL + debug_draw(std::to_string(lidx) + "_candidate_surface_" + std::to_string(area(s->expolygon)), + to_lines(region->layer()->lslices), to_lines(s->expolygon), to_lines(worth_bridging), + to_lines(unsupported_area)); +#endif +#ifdef DEBUG_BRIDGE_OVER_INFILL + debug_draw(std::to_string(lidx) + "_candidate_processing_" + std::to_string(area(unsupported)), + to_lines(unsupported), to_lines(intersection(to_polygons(s->expolygon), expand(unsupported, 5 * spacing))), + to_lines(diff(to_polygons(s->expolygon), expand(worth_bridging, spacing))), + to_lines(unsupported_area)); +#endif + } + } + } + } + }); + + for (const CandidateSurface &c : candidate_surfaces) { + surfaces_by_layer[c.layer_index].push_back(c); + } + } + + std::map infill_lines; + // SECTION to generate infill polylines + { + std::vector> surfaces_w_bottom_z; + for (const auto &pair : surfaces_by_layer) { + for (const CandidateSurface &c : pair.second) { + surfaces_w_bottom_z.emplace_back(c.original_surface, c.region->m_layer->bottom_z()); + } + } + + this->m_adaptive_fill_octrees = this->prepare_adaptive_infill_data(surfaces_w_bottom_z); + this->m_lightning_generator = this->prepare_lightning_infill_data(); + + std::vector layers_to_generate_infill; + for (const auto &pair : surfaces_by_layer) { + assert(pair.first > 0); + infill_lines[pair.first - 1] = {}; + layers_to_generate_infill.push_back(pair.first - 1); + } + + tbb::parallel_for(tbb::blocked_range(0, layers_to_generate_infill.size()), [po = static_cast(this), + &layers_to_generate_infill, + &infill_lines](tbb::blocked_range r) { + for (size_t job_idx = r.begin(); job_idx < r.end(); job_idx++) { + size_t lidx = layers_to_generate_infill[job_idx]; + infill_lines.at( + lidx) = po->get_layer(lidx)->generate_sparse_infill_polylines_for_anchoring(po->m_adaptive_fill_octrees.first.get(), + po->m_adaptive_fill_octrees.second.get(), + po->m_lightning_generator.get()); + } + }); +#ifdef DEBUG_BRIDGE_OVER_INFILL + for (const auto &il : infill_lines) { + debug_draw(std::to_string(il.first) + "_infill_lines", to_lines(get_layer(il.first)->lslices), to_lines(il.second), {}, {}); + } +#endif + } + + // cluster layers by depth needed for thick bridges. Each cluster is to be processed by single thread sequentially, so that bridges cannot appear one on another + std::vector> clustered_layers_for_threads; + float target_flow_height_factor = 0.75; + { + std::vector layers_with_candidates; + std::map layer_area_covered_by_candidates; + for (const auto& pair : surfaces_by_layer) { + layers_with_candidates.push_back(pair.first); + layer_area_covered_by_candidates[pair.first] = {}; + } + + // prepare inflated filter for each candidate on each layer. layers will be put into single thread cluster if they are close to each other (z-axis-wise) + // and if the inflated AABB polygons overlap somewhere + tbb::parallel_for(tbb::blocked_range(0, layers_with_candidates.size()), [&layers_with_candidates, &surfaces_by_layer, + &layer_area_covered_by_candidates]( + tbb::blocked_range r) { + for (size_t job_idx = r.begin(); job_idx < r.end(); job_idx++) { + size_t lidx = layers_with_candidates[job_idx]; + for (const auto &candidate : surfaces_by_layer.at(lidx)) { + Polygon candiate_inflated_aabb = get_extents(candidate.new_polys).inflated(scale_(7)).polygon(); + layer_area_covered_by_candidates.at(lidx) = union_(layer_area_covered_by_candidates.at(lidx), + Polygons{candiate_inflated_aabb}); + } + } + }); + + // note: surfaces_by_layer is ordered map + for (auto pair : surfaces_by_layer) { + if (clustered_layers_for_threads.empty() || + this->get_layer(clustered_layers_for_threads.back().back())->print_z < + this->get_layer(pair.first)->print_z - + this->get_layer(pair.first)->regions()[0]->flow(frSolidInfill, true).height() * target_flow_height_factor - + EPSILON || + intersection(layer_area_covered_by_candidates[clustered_layers_for_threads.back().back()], + layer_area_covered_by_candidates[pair.first]) + .empty()) { + clustered_layers_for_threads.push_back({pair.first}); + } else { + clustered_layers_for_threads.back().push_back(pair.first); + } + } + +#ifdef DEBUG_BRIDGE_OVER_INFILL + std::cout << "BRIDGE OVER INFILL CLUSTERED LAYERS FOR SINGLE THREAD" << std::endl; + for (auto cluster : clustered_layers_for_threads) { + std::cout << "CLUSTER: "; + for (auto l : cluster) { + std::cout << l << " "; + } + std::cout << std::endl; + } +#endif + } + + // LAMBDA to gather areas with sparse infill deep enough that we can fit thick bridges there. + auto gather_areas_w_depth = [target_flow_height_factor](const PrintObject *po, int lidx, float target_flow_height) { + // Gather layers sparse infill areas, to depth defined by used bridge flow + ExPolygons layers_sparse_infill{}; + ExPolygons not_sparse_infill{}; + double bottom_z = po->get_layer(lidx)->print_z - target_flow_height * target_flow_height_factor - EPSILON; + for (int i = int(lidx) - 1; i >= 0; --i) { + // Stop iterating if layer is lower than bottom_z. + const Layer *layer = po->get_layer(i); + if (layer->print_z < bottom_z) + break; + + for (const LayerRegion *region : layer->regions()) { + bool has_low_density = region->region().config().fill_density.value < 100; + for (const Surface &surface : region->fill_surfaces()) { + if ((surface.surface_type == stInternal && has_low_density) || surface.surface_type == stInternalVoid ) { + layers_sparse_infill.push_back(surface.expolygon); + } else { + not_sparse_infill.push_back(surface.expolygon); + } + } + } + } + layers_sparse_infill = union_ex(layers_sparse_infill); + layers_sparse_infill = closing_ex(layers_sparse_infill, SCALED_EPSILON); + not_sparse_infill = union_ex(not_sparse_infill); + not_sparse_infill = closing_ex(not_sparse_infill, SCALED_EPSILON); + return diff(layers_sparse_infill, not_sparse_infill); + }; + + // LAMBDA do determine optimal bridging angle + auto determine_bridging_angle = [](const Polygons &bridged_area, const Lines &anchors, InfillPattern dominant_pattern) { + AABBTreeLines::LinesDistancer lines_tree(anchors); + + std::map counted_directions; + for (const Polygon &p : bridged_area) { + double acc_distance = 0; + for (int point_idx = 0; point_idx < int(p.points.size()) - 1; ++point_idx) { + Vec2d start = p.points[point_idx].cast(); + Vec2d next = p.points[point_idx + 1].cast(); + Vec2d v = next - start; // vector from next to current + double dist_to_next = v.norm(); + acc_distance += dist_to_next; + if (acc_distance > scaled(2.0)) { + acc_distance = 0.0; + v.normalize(); + int lines_count = int(std::ceil(dist_to_next / scaled(2.0))); + float step_size = dist_to_next / lines_count; + for (int i = 0; i < lines_count; ++i) { + Point a = (start + v * (i * step_size)).cast(); + auto [distance, index, p] = lines_tree.distance_from_lines_extra(a); + double angle = lines_tree.get_line(index).orientation(); + if (angle > PI) { + angle -= PI; + } + angle += PI * 0.5; + counted_directions[angle]++; + } + } + } + } + + std::pair best_dir{0, 0}; + // sliding window accumulation + for (const auto &dir : counted_directions) { + int score_acc = 0; + double dir_acc = 0; + double window_start_angle = dir.first - PI * 0.1; + double window_end_angle = dir.first + PI * 0.1; + for (auto dirs_window = counted_directions.lower_bound(window_start_angle); + dirs_window != counted_directions.upper_bound(window_end_angle); dirs_window++) { + dir_acc += dirs_window->first * dirs_window->second; + score_acc += dirs_window->second; + } + // current span of directions is 0.5 PI to 1.5 PI (due to the aproach.). Edge values should also account for the + // opposite direction. + if (window_start_angle < 0.5 * PI) { + for (auto dirs_window = counted_directions.lower_bound(1.5 * PI - (0.5 * PI - window_start_angle)); + dirs_window != counted_directions.end(); dirs_window++) { + dir_acc += dirs_window->first * dirs_window->second; + score_acc += dirs_window->second; + } + } + if (window_start_angle > 1.5 * PI) { + for (auto dirs_window = counted_directions.begin(); + dirs_window != counted_directions.upper_bound(window_start_angle - 1.5 * PI); dirs_window++) { + dir_acc += dirs_window->first * dirs_window->second; + score_acc += dirs_window->second; + } + } + + if (score_acc > best_dir.second) { + best_dir = {dir_acc / score_acc, score_acc}; + } + } + double bridging_angle = best_dir.first; + if (bridging_angle == 0) { + bridging_angle = 0.001; + } + switch (dominant_pattern) { + case ipHilbertCurve: bridging_angle += 0.25 * PI; break; + case ipOctagramSpiral: bridging_angle += (1.0 / 16.0) * PI; break; + default: break; + } + + return bridging_angle; + }; + + // LAMBDA that will fill given polygons with lines, exapand the lines to the nearest anchor, and reconstruct polygons from the newly + // generated lines + auto construct_anchored_polygon = [](Polygons bridged_area, Lines anchors, const Flow &bridging_flow, double bridging_angle) { + auto lines_rotate = [](Lines &lines, double cos_angle, double sin_angle) { + for (Line &l : lines) { + double ax = double(l.a.x()); + double ay = double(l.a.y()); + l.a.x() = coord_t(round(cos_angle * ax - sin_angle * ay)); + l.a.y() = coord_t(round(cos_angle * ay + sin_angle * ax)); + double bx = double(l.b.x()); + double by = double(l.b.y()); + l.b.x() = coord_t(round(cos_angle * bx - sin_angle * by)); + l.b.y() = coord_t(round(cos_angle * by + sin_angle * bx)); + } + }; + + auto segments_overlap = [](coord_t alow, coord_t ahigh, coord_t blow, coord_t bhigh) { + return (alow >= blow && alow <= bhigh) || (ahigh >= blow && ahigh <= bhigh) || (blow >= alow && blow <= ahigh) || + (bhigh >= alow && bhigh <= ahigh); + }; + + Polygons expanded_bridged_area{}; + double aligning_angle = -bridging_angle + PI * 0.5; + { + polygons_rotate(bridged_area, aligning_angle); + lines_rotate(anchors, cos(aligning_angle), sin(aligning_angle)); + BoundingBox bb_x = get_extents(bridged_area); + BoundingBox bb_y = get_extents(anchors); + + const size_t n_vlines = (bb_x.max.x() - bb_x.min.x() + bridging_flow.scaled_spacing() - 1) / bridging_flow.scaled_spacing(); + std::vector vertical_lines(n_vlines); + for (size_t i = 0; i < n_vlines; i++) { + coord_t x = bb_x.min.x() + i * bridging_flow.scaled_spacing(); + coord_t y_min = bb_y.min.y() - bridging_flow.scaled_spacing(); + coord_t y_max = bb_y.max.y() + bridging_flow.scaled_spacing(); + vertical_lines[i].a = Point{x, y_min}; + vertical_lines[i].b = Point{x, y_max}; + } + + auto anchors_and_walls_tree = AABBTreeLines::LinesDistancer{std::move(anchors)}; + auto bridged_area_tree = AABBTreeLines::LinesDistancer{to_lines(bridged_area)}; + + std::vector> polygon_sections(n_vlines); + for (size_t i = 0; i < n_vlines; i++) { + auto area_intersections = bridged_area_tree.intersections_with_line(vertical_lines[i]); + for (int intersection_idx = 0; intersection_idx < int(area_intersections.size()) - 1; intersection_idx++) { + if (bridged_area_tree.outside( + (area_intersections[intersection_idx].first + area_intersections[intersection_idx + 1].first) / 2) < 0) { + polygon_sections[i].emplace_back(area_intersections[intersection_idx].first, + area_intersections[intersection_idx + 1].first); + } + } + auto anchors_intersections = anchors_and_walls_tree.intersections_with_line(vertical_lines[i]); + + for (Line §ion : polygon_sections[i]) { + auto maybe_below_anchor = std::upper_bound(anchors_intersections.rbegin(), anchors_intersections.rend(), section.a, + [](const Point &a, const std::pair &b) { + return a.y() > b.first.y(); + }); + if (maybe_below_anchor != anchors_intersections.rend()) { + section.a = maybe_below_anchor->first; + section.a.y() -= bridging_flow.scaled_width() * (0.5 + 0.5); + } + + auto maybe_upper_anchor = std::upper_bound(anchors_intersections.begin(), anchors_intersections.end(), section.b, + [](const Point &a, const std::pair &b) { + return a.y() < b.first.y(); + }); + if (maybe_upper_anchor != anchors_intersections.end()) { + section.b = maybe_upper_anchor->first; + section.b.y() += bridging_flow.scaled_width() * (0.5 + 0.5); + } + } + + for (int section_idx = 0; section_idx < int(polygon_sections[i].size()) - 1; section_idx++) { + Line §ion_a = polygon_sections[i][section_idx]; + Line §ion_b = polygon_sections[i][section_idx + 1]; + if (segments_overlap(section_a.a.y(), section_a.b.y(), section_b.a.y(), section_b.b.y())) { + section_b.a = section_a.a.y() < section_b.a.y() ? section_a.a : section_b.a; + section_b.b = section_a.b.y() < section_b.b.y() ? section_b.b : section_a.b; + section_a.a = section_a.b; + } + } + + polygon_sections[i].erase(std::remove_if(polygon_sections[i].begin(), polygon_sections[i].end(), + [](const Line &s) { return s.a == s.b; }), + polygon_sections[i].end()); + } + + // reconstruct polygon from polygon sections + struct TracedPoly { - Polygons to_bridge_pp = internal_solid; - - // iterate through lower layers spanned by bridge_flow - double bottom_z = layer->print_z - bridge_flow.height() - EPSILON; - for (int i = int(layer_it - m_layers.begin()) - 1; i >= 0; --i) { - const Layer* lower_layer = m_layers[i]; - - // stop iterating if layer is lower than bottom_z - if (lower_layer->print_z < bottom_z) break; - - // iterate through regions and collect internal surfaces - Polygons lower_internal; - for (LayerRegion *lower_layerm : lower_layer->m_regions) - lower_layerm->fill_surfaces.filter_by_type(stInternal, &lower_internal); - - // intersect such lower internal surfaces with the candidate solid surfaces - to_bridge_pp = intersection(to_bridge_pp, lower_internal); + std::vector lows; + std::vector highs; + }; + + std::vector current_traced_polys; + for (const auto &polygon_slice : polygon_sections) { + std::unordered_set used_segments; + for (TracedPoly &traced_poly : current_traced_polys) { + auto maybe_first_overlap = std::upper_bound(polygon_slice.begin(), polygon_slice.end(), traced_poly.lows.back(), + [](const Point &low, const Line &seg) { return seg.b.y() > low.y(); }); + + if (maybe_first_overlap != polygon_slice.end() && // segment exists + segments_overlap(traced_poly.lows.back().y(), traced_poly.highs.back().y(), maybe_first_overlap->a.y(), + maybe_first_overlap->b.y())) // segment is overlapping + { + // Overlapping segment. In that case, add it + // to the traced polygon and add segment to used segments + if ((traced_poly.lows.back() - maybe_first_overlap->a).cast().squaredNorm() < + 36.0 * double(bridging_flow.scaled_spacing()) * bridging_flow.scaled_spacing()) { + traced_poly.lows.push_back(maybe_first_overlap->a); + } else { + traced_poly.lows.push_back(traced_poly.lows.back() + Point{bridging_flow.scaled_spacing() / 2, 0}); + traced_poly.lows.push_back(maybe_first_overlap->a - Point{bridging_flow.scaled_spacing() / 2, 0}); + traced_poly.lows.push_back(maybe_first_overlap->a); + } + + if ((traced_poly.highs.back() - maybe_first_overlap->b).cast().squaredNorm() < + 36.0 * double(bridging_flow.scaled_spacing()) * bridging_flow.scaled_spacing()) { + traced_poly.highs.push_back(maybe_first_overlap->b); + } else { + traced_poly.highs.push_back(traced_poly.highs.back() + Point{bridging_flow.scaled_spacing() / 2, 0}); + traced_poly.highs.push_back(maybe_first_overlap->b - Point{bridging_flow.scaled_spacing() / 2, 0}); + traced_poly.highs.push_back(maybe_first_overlap->b); + } + used_segments.insert(&(*maybe_first_overlap)); + } else { + // Zero or multiple overlapping segments. Resolving this is nontrivial, + // so we just close this polygon and maybe open several new. This will hopefully happen much less often + traced_poly.lows.push_back(traced_poly.lows.back() + Point{bridging_flow.scaled_spacing() / 2, 0}); + traced_poly.highs.push_back(traced_poly.highs.back() + Point{bridging_flow.scaled_spacing() / 2, 0}); + Polygon &new_poly = expanded_bridged_area.emplace_back(std::move(traced_poly.lows)); + new_poly.points.insert(new_poly.points.end(), traced_poly.highs.rbegin(), traced_poly.highs.rend()); + traced_poly.lows.clear(); + traced_poly.highs.clear(); + } } - - // there's no point in bridging too thin/short regions - //FIXME Vojtech: The offset2 function is not a geometric offset, - // therefore it may create 1) gaps, and 2) sharp corners, which are outside the original contour. - // The gaps will be filled by a separate region, which makes the infill less stable and it takes longer. - { - float min_width = float(bridge_flow.scaled_width()) * 3.f; - to_bridge_pp = opening(to_bridge_pp, min_width); + + current_traced_polys.erase(std::remove_if(current_traced_polys.begin(), current_traced_polys.end(), + [](const TracedPoly &tp) { return tp.lows.empty(); }), + current_traced_polys.end()); + + for (const auto &segment : polygon_slice) { + if (used_segments.find(&segment) == used_segments.end()) { + TracedPoly &new_tp = current_traced_polys.emplace_back(); + new_tp.lows.push_back(segment.a - Point{bridging_flow.scaled_spacing() / 2, 0}); + new_tp.lows.push_back(segment.a); + new_tp.highs.push_back(segment.b - Point{bridging_flow.scaled_spacing() / 2, 0}); + new_tp.highs.push_back(segment.b); + } } - - if (to_bridge_pp.empty()) continue; - - // convert into ExPolygons - to_bridge = union_ex(to_bridge_pp); } - - #ifdef SLIC3R_DEBUG - printf("Bridging %zu internal areas at layer %zu\n", to_bridge.size(), layer->id()); - #endif - - // compute the remaning internal solid surfaces as difference - ExPolygons not_to_bridge = diff_ex(internal_solid, to_bridge, ApplySafetyOffset::Yes); - to_bridge = intersection_ex(to_bridge, internal_solid, ApplySafetyOffset::Yes); - // build the new collection of fill_surfaces - layerm->fill_surfaces.remove_type(stInternalSolid); - for (ExPolygon &ex : to_bridge) - layerm->fill_surfaces.surfaces.push_back(Surface(stInternalBridge, ex)); - for (ExPolygon &ex : not_to_bridge) - layerm->fill_surfaces.surfaces.push_back(Surface(stInternalSolid, ex)); - /* - # exclude infill from the layers below if needed - # see discussion at https://github.com/alexrj/Slic3r/issues/240 - # Update: do not exclude any infill. Sparse infill is able to absorb the excess material. - if (0) { - my $excess = $layerm->extruders->{infill}->bridge_flow->width - $layerm->height; - for (my $i = $layer_id-1; $excess >= $self->get_layer($i)->height; $i--) { - Slic3r::debugf " skipping infill below those areas at layer %d\n", $i; - foreach my $lower_layerm (@{$self->get_layer($i)->regions}) { - my @new_surfaces = (); - # subtract the area from all types of surfaces - foreach my $group (@{$lower_layerm->fill_surfaces->group}) { - push @new_surfaces, map $group->[0]->clone(expolygon => $_), - @{diff_ex( - [ map $_->p, @$group ], - [ map @$_, @$to_bridge ], - )}; - push @new_surfaces, map Slic3r::Surface->new( - expolygon => $_, - surface_type => stInternalVoid, - ), @{intersection_ex( - [ map $_->p, @$group ], - [ map @$_, @$to_bridge ], - )}; + + // add not closed polys + for (TracedPoly &traced_poly : current_traced_polys) { + Polygon &new_poly = expanded_bridged_area.emplace_back(std::move(traced_poly.lows)); + new_poly.points.insert(new_poly.points.end(), traced_poly.highs.rbegin(), traced_poly.highs.rend()); + } + } + + polygons_rotate(expanded_bridged_area, -aligning_angle); + return expanded_bridged_area; + }; + + tbb::parallel_for(tbb::blocked_range(0, clustered_layers_for_threads.size()), [po = static_cast(this), + target_flow_height_factor, &surfaces_by_layer, + &clustered_layers_for_threads, + gather_areas_w_depth, &infill_lines, + determine_bridging_angle, + construct_anchored_polygon]( + tbb::blocked_range r) { + for (size_t cluster_idx = r.begin(); cluster_idx < r.end(); cluster_idx++) { + for (size_t job_idx = 0; job_idx < clustered_layers_for_threads[cluster_idx].size(); job_idx++) { + size_t lidx = clustered_layers_for_threads[cluster_idx][job_idx]; + const Layer *layer = po->get_layer(lidx); + // this thread has exclusive access to all surfaces in layers enumerated in + // clustered_layers_for_threads[cluster_idx] + + // Presort the candidate polygons. This will help choose the same angle for neighbournig surfaces, that + // would otherwise compete over anchoring sparse infill lines, leaving one area unachored + std::sort(surfaces_by_layer[lidx].begin(), surfaces_by_layer[lidx].end(), + [](const CandidateSurface &left, const CandidateSurface &right) { + auto a = get_extents(left.new_polys); + auto b = get_extents(right.new_polys); + + if (a.min.x() == b.min.x()) { + return a.min.y() < b.min.y(); + }; + return a.min.x() < b.min.x(); + }); + if (surfaces_by_layer[lidx].size() > 2) { + Vec2d origin = get_extents(surfaces_by_layer[lidx].front().new_polys).max.cast(); + std::stable_sort(surfaces_by_layer[lidx].begin() + 1, surfaces_by_layer[lidx].end(), + [origin](const CandidateSurface &left, const CandidateSurface &right) { + auto a = get_extents(left.new_polys); + auto b = get_extents(right.new_polys); + + return (origin - a.min.cast()).squaredNorm() < + (origin - b.min.cast()).squaredNorm(); + }); + } + + // Gather deep infill areas, where thick bridges fit + coordf_t spacing = surfaces_by_layer[lidx].front().region->flow(frSolidInfill, true).scaled_spacing(); + coordf_t target_flow_height = surfaces_by_layer[lidx].front().region->flow(frSolidInfill, true).height() * target_flow_height_factor; + Polygons deep_infill_area = gather_areas_w_depth(po, lidx, target_flow_height); + + { + // Now also remove area that has been already filled on lower layers by bridging expansion - For this + // reason we did the clustering of layers per thread. + Polygons filled_polyons_on_lower_layers; + double bottom_z = layer->print_z - target_flow_height - EPSILON; + if (job_idx > 0) { + for (int lower_job_idx = job_idx - 1; lower_job_idx >= 0; lower_job_idx--) { + size_t lower_layer_idx = clustered_layers_for_threads[cluster_idx][lower_job_idx]; + const Layer *lower_layer = po->get_layer(lower_layer_idx); + if (lower_layer->print_z >= bottom_z) { + for (const auto &c : surfaces_by_layer[lower_layer_idx]) { + filled_polyons_on_lower_layers.insert(filled_polyons_on_lower_layers.end(), c.new_polys.begin(), + c.new_polys.end()); + } + } else { + break; + } } - $lower_layerm->fill_surfaces->clear; - $lower_layerm->fill_surfaces->append($_) for @new_surfaces; } - - $excess -= $self->get_layer($i)->height; + deep_infill_area = diff(deep_infill_area, filled_polyons_on_lower_layers); + } + + deep_infill_area = expand(deep_infill_area, spacing * 1.5); + + // Now gather expansion polygons - internal infill on current layer, from which we can cut off anchors + Polygons expansion_area; + Polygons total_fill_area; + for (const LayerRegion *region : layer->regions()) { + Polygons internal_polys = to_polygons(region->fill_surfaces().filter_by_types({stInternal, stInternalSolid})); + expansion_area.insert(expansion_area.end(), internal_polys.begin(), internal_polys.end()); + Polygons fill_polys = to_polygons(region->fill_expolygons()); + total_fill_area.insert(total_fill_area.end(), fill_polys.begin(), fill_polys.end()); } + total_fill_area = closing(total_fill_area, SCALED_EPSILON); + expansion_area = closing(expansion_area, SCALED_EPSILON); + expansion_area = intersection(expansion_area, deep_infill_area); + Polylines anchors = intersection_pl(infill_lines[lidx - 1], shrink(expansion_area, spacing)); + +#ifdef DEBUG_BRIDGE_OVER_INFILL + debug_draw(std::to_string(lidx) + "_" + std::to_string(cluster_idx) + "_" + std::to_string(job_idx) + "_" + "_total_area", + to_lines(total_fill_area), to_lines(expansion_area), to_lines(deep_infill_area), to_lines(anchors)); +#endif + + + std::vector expanded_surfaces; + expanded_surfaces.reserve(surfaces_by_layer[lidx].size()); + for (const CandidateSurface &candidate : surfaces_by_layer[lidx]) { + const Flow &flow = candidate.region->bridging_flow(frSolidInfill, true); + Polygons area_to_be_bridge = expand(candidate.new_polys, flow.scaled_spacing()); + area_to_be_bridge = intersection(area_to_be_bridge, deep_infill_area); + Polygons limiting_area = union_(area_to_be_bridge, expansion_area); + + if (area_to_be_bridge.empty()) + continue; + + Polylines boundary_plines = to_polylines(expand(total_fill_area, 1.3 * flow.scaled_spacing())); + { + Polylines limiting_plines = to_polylines(expand(limiting_area, 0.3*flow.spacing())); + boundary_plines.insert(boundary_plines.end(), limiting_plines.begin(), limiting_plines.end()); + } + +#ifdef DEBUG_BRIDGE_OVER_INFILL + int r = rand(); + debug_draw(std::to_string(lidx) + "_" + std::to_string(cluster_idx) + "_" + std::to_string(job_idx) + "_" + + "_anchors_" + std::to_string(r), + to_lines(area_to_be_bridge), to_lines(boundary_plines), to_lines(anchors), to_lines(expansion_area)); +#endif + + double bridging_angle = 0; + if (!anchors.empty()) { + bridging_angle = determine_bridging_angle(area_to_be_bridge, to_lines(anchors), + candidate.region->region().config().fill_pattern.value); + } else { + // use expansion boundaries as anchors. + // Also, use Infill pattern that is neutral for angle determination, since there are no infill lines. + bridging_angle = determine_bridging_angle(area_to_be_bridge, to_lines(boundary_plines), InfillPattern::ipLine); + } + + boundary_plines.insert(boundary_plines.end(), anchors.begin(), anchors.end()); + if (candidate.supported_by_lightning) { + boundary_plines = intersection_pl(boundary_plines, expand(area_to_be_bridge, scale_(10))); + } + Polygons bridging_area = construct_anchored_polygon(area_to_be_bridge, to_lines(boundary_plines), flow, bridging_angle); + + // Check collision with other expanded surfaces + { + bool reconstruct = false; + Polygons tmp_expanded_area = expand(bridging_area, 3.0 * flow.scaled_spacing()); + for (const CandidateSurface &s : expanded_surfaces) { + if (!intersection(s.new_polys, tmp_expanded_area).empty()) { + bridging_angle = s.bridge_angle; + reconstruct = true; + break; + } + } + if (reconstruct) { + bridging_area = construct_anchored_polygon(area_to_be_bridge, to_lines(boundary_plines), flow, bridging_angle); + } + } + + bridging_area = opening(bridging_area, flow.scaled_spacing()); + bridging_area = closing(bridging_area, flow.scaled_spacing()); + bridging_area = intersection(bridging_area, limiting_area); + bridging_area = intersection(bridging_area, total_fill_area); + expansion_area = diff(expansion_area, bridging_area); + +#ifdef DEBUG_BRIDGE_OVER_INFILL + debug_draw(std::to_string(lidx) + "_" + std::to_string(cluster_idx) + "_" + std::to_string(job_idx) + "_" + "_expanded_bridging" + std::to_string(r), + to_lines(layer->lslices), to_lines(boundary_plines), to_lines(candidate.new_polys), to_lines(bridging_area)); +#endif + + expanded_surfaces.push_back(CandidateSurface(candidate.original_surface, candidate.layer_index, bridging_area, + candidate.region, bridging_angle, candidate.supported_by_lightning)); + } + surfaces_by_layer[lidx].swap(expanded_surfaces); + expanded_surfaces.clear(); } - */ + } + }); -#ifdef SLIC3R_DEBUG_SLICE_PROCESSING - layerm->export_region_slices_to_svg_debug("7_bridge_over_infill"); - layerm->export_region_fill_surfaces_to_svg_debug("7_bridge_over_infill"); -#endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ - m_print->throw_if_canceled(); + BOOST_LOG_TRIVIAL(info) << "Bridge over infill - Directions and expanded surfaces computed" << log_memory_info(); + + tbb::parallel_for(tbb::blocked_range(0, this->layers().size()), [po = this, &surfaces_by_layer](tbb::blocked_range r) { + for (size_t lidx = r.begin(); lidx < r.end(); lidx++) { + if (surfaces_by_layer.find(lidx) == surfaces_by_layer.end()) + continue; + Layer *layer = po->get_layer(lidx); + + Polygons cut_from_infill{}; + for (const auto &surface : surfaces_by_layer.at(lidx)) { + cut_from_infill.insert(cut_from_infill.end(), surface.new_polys.begin(), surface.new_polys.end()); + } + + for (LayerRegion *region : layer->regions()) { + Surfaces new_surfaces; + + SurfacesPtr internal_infills = region->m_fill_surfaces.filter_by_type(stInternal); + ExPolygons new_internal_infills = diff_ex(internal_infills, cut_from_infill); + for (const ExPolygon &ep : new_internal_infills) { + new_surfaces.emplace_back(*internal_infills.front(), ep); + } + + SurfacesPtr internal_solids = region->m_fill_surfaces.filter_by_type(stInternalSolid); + for (const CandidateSurface &cs : surfaces_by_layer.at(lidx)) { + for (const Surface *surface : internal_solids) { + if (cs.original_surface == surface) { + Surface tmp{*surface, {}}; + tmp.surface_type = stInternalBridge; + tmp.bridge_angle = cs.bridge_angle; + for (const ExPolygon &ep : union_ex(cs.new_polys)) { + new_surfaces.emplace_back(tmp, ep); + } + break; + } + } + } + ExPolygons new_internal_solids = diff_ex(internal_solids, cut_from_infill); + for (const ExPolygon &ep : new_internal_solids) { + new_surfaces.emplace_back(*internal_solids.front(), ep); + } + + region->m_fill_surfaces.remove_types({stInternalSolid, stInternal}); + region->m_fill_surfaces.append(new_surfaces); + } } - } -} + }); + + BOOST_LOG_TRIVIAL(info) << "Bridge over infill - End" << log_memory_info(); + +} // void PrintObject::bridge_over_infill() static void clamp_exturder_to_default(ConfigOptionInt &opt, size_t num_extruders) { @@ -1654,7 +2363,7 @@ void PrintObject::update_slicing_parameters() { if (!m_slicing_params.valid) m_slicing_params = SlicingParameters::create_from_config( - this->print()->config(), m_config, this->model_object()->bounding_box().max.z(), this->object_extruders()); + this->print()->config(), m_config, this->model_object()->max_z(), this->object_extruders()); } SlicingParameters PrintObject::slicing_parameters(const DynamicPrintConfig& full_config, const ModelObject& model_object, float object_max_z) @@ -1713,6 +2422,8 @@ bool PrintObject::update_layer_height_profile(const ModelObject &model_object, c // use the constructor because the assignement is crashing on ASAN OsX layer_height_profile = std::vector(model_object.layer_height_profile.get()); // layer_height_profile = model_object.layer_height_profile; + // The layer height returned is sampled with high density for the UI layer height painting + // and smoothing tool to work. updated = true; } @@ -1727,6 +2438,7 @@ bool PrintObject::update_layer_height_profile(const ModelObject &model_object, c if (layer_height_profile.empty()) { //layer_height_profile = layer_height_profile_adaptive(slicing_parameters, model_object.layer_config_ranges, model_object.volumes); layer_height_profile = layer_height_profile_from_ranges(slicing_parameters, model_object.layer_config_ranges); + // The layer height profile is already compressed. updated = true; } return updated; @@ -1740,294 +2452,132 @@ bool PrintObject::update_layer_height_profile(const ModelObject &model_object, c // Also one wishes the perimeters to be supported by a full infill. // Idempotence of this method is guaranteed by the fact that we don't remove things from // fill_surfaces but we only turn them into VOID surfaces, thus preserving the boundaries. -void PrintObject::clip_fill_surfaces() -{ - bool has_lightning_infill = false; - for (size_t region_id = 0; region_id < this->num_printing_regions(); ++region_id) - if (const PrintRegionConfig &config = this->printing_region(region_id).config(); config.fill_density > 0 && config.fill_pattern == ipLightning) - has_lightning_infill = true; - - // For Lightning infill, infill_only_where_needed is ignored because both - // do a similar thing, and their combination doesn't make much sense. - if (! m_config.infill_only_where_needed.value || has_lightning_infill) - return; - bool has_infill = false; - for (size_t i = 0; i < this->num_printing_regions(); ++ i) - if (this->printing_region(i).config().fill_density > 0) { - has_infill = true; - break; - } - if (! has_infill) - return; - - // We only want infill under ceilings; this is almost like an - // internal support material. - // Proceed top-down, skipping the bottom layer. - Polygons upper_internal; - for (int layer_id = int(m_layers.size()) - 1; layer_id > 0; -- layer_id) { - Layer *layer = m_layers[layer_id]; - Layer *lower_layer = m_layers[layer_id - 1]; - // Detect things that we need to support. - // Cummulative fill surfaces. - Polygons fill_surfaces; - // Solid surfaces to be supported. - Polygons overhangs; - for (const LayerRegion *layerm : layer->m_regions) - for (const Surface &surface : layerm->fill_surfaces.surfaces) { - Polygons polygons = to_polygons(surface.expolygon); - if (surface.is_solid()) - polygons_append(overhangs, polygons); - polygons_append(fill_surfaces, std::move(polygons)); - } - Polygons lower_layer_fill_surfaces; - Polygons lower_layer_internal_surfaces; - for (const LayerRegion *layerm : lower_layer->m_regions) - for (const Surface &surface : layerm->fill_surfaces.surfaces) { - Polygons polygons = to_polygons(surface.expolygon); - if (surface.surface_type == stInternal || surface.surface_type == stInternalVoid) - polygons_append(lower_layer_internal_surfaces, polygons); - polygons_append(lower_layer_fill_surfaces, std::move(polygons)); - } - // We also need to support perimeters when there's at least one full unsupported loop - { - // Get perimeters area as the difference between slices and fill_surfaces - // Only consider the area that is not supported by lower perimeters - Polygons perimeters = intersection(diff(layer->lslices, fill_surfaces), lower_layer_fill_surfaces); - // Only consider perimeter areas that are at least one extrusion width thick. - //FIXME Offset2 eats out from both sides, while the perimeters are create outside in. - //Should the pw not be half of the current value? - float pw = FLT_MAX; - for (const LayerRegion *layerm : layer->m_regions) - pw = std::min(pw, (float)layerm->flow(frPerimeter).scaled_width()); - // Append such thick perimeters to the areas that need support - polygons_append(overhangs, opening(perimeters, pw)); - } - // Merge the new overhangs, find new internal infill. - polygons_append(upper_internal, std::move(overhangs)); - static constexpr const auto closing_radius = scaled(2.f); - upper_internal = intersection( - // Regularize the overhang regions, so that the infill areas will not become excessively jagged. - smooth_outward( - closing(upper_internal, closing_radius, ClipperLib::jtSquare, 0.), - scaled(0.1)), - lower_layer_internal_surfaces); - // Apply new internal infill to regions. - for (LayerRegion *layerm : lower_layer->m_regions) { - if (layerm->region().config().fill_density.value == 0) - continue; - SurfaceType internal_surface_types[] = { stInternal, stInternalVoid }; - Polygons internal; - for (Surface &surface : layerm->fill_surfaces.surfaces) - if (surface.surface_type == stInternal || surface.surface_type == stInternalVoid) - polygons_append(internal, std::move(surface.expolygon)); - layerm->fill_surfaces.remove_types(internal_surface_types, 2); - layerm->fill_surfaces.append(intersection_ex(internal, upper_internal, ApplySafetyOffset::Yes), stInternal); - layerm->fill_surfaces.append(diff_ex (internal, upper_internal, ApplySafetyOffset::Yes), stInternalVoid); - // If there are voids it means that our internal infill is not adjacent to - // perimeters. In this case it would be nice to add a loop around infill to - // make it more robust and nicer. TODO. -#ifdef SLIC3R_DEBUG_SLICE_PROCESSING - layerm->export_region_fill_surfaces_to_svg_debug("6_clip_fill_surfaces"); -#endif - } - m_print->throw_if_canceled(); - } -} +// void PrintObject::clip_fill_surfaces() +// { +// bool has_lightning_infill = false; +// for (size_t region_id = 0; region_id < this->num_printing_regions(); ++region_id) +// if (const PrintRegionConfig &config = this->printing_region(region_id).config(); config.fill_density > 0 && config.fill_pattern == ipLightning) +// has_lightning_infill = true; + +// // For Lightning infill, infill_only_where_needed is ignored because both +// // do a similar thing, and their combination doesn't make much sense. +// if (! m_config.infill_only_where_needed.value || has_lightning_infill) +// return; +// bool has_infill = false; +// for (size_t i = 0; i < this->num_printing_regions(); ++ i) +// if (this->printing_region(i).config().fill_density > 0) { +// has_infill = true; +// break; +// } +// if (! has_infill) +// return; + +// // We only want infill under ceilings; this is almost like an +// // internal support material. +// // Proceed top-down, skipping the bottom layer. +// Polygons upper_internal; +// for (int layer_id = int(m_layers.size()) - 1; layer_id > 0; -- layer_id) { +// Layer *layer = m_layers[layer_id]; +// Layer *lower_layer = m_layers[layer_id - 1]; +// // Detect things that we need to support. +// // Cummulative fill surfaces. +// Polygons fill_surfaces; +// // Solid surfaces to be supported. +// Polygons overhangs; +// for (const LayerRegion *layerm : layer->m_regions) +// for (const Surface &surface : layerm->fill_surfaces()) { +// Polygons polygons = to_polygons(surface.expolygon); +// if (surface.is_solid()) +// polygons_append(overhangs, polygons); +// polygons_append(fill_surfaces, std::move(polygons)); +// } +// Polygons lower_layer_fill_surfaces; +// Polygons lower_layer_internal_surfaces; +// for (const LayerRegion *layerm : lower_layer->m_regions) +// for (const Surface &surface : layerm->fill_surfaces()) { +// Polygons polygons = to_polygons(surface.expolygon); +// if (surface.surface_type == stInternal || surface.surface_type == stInternalVoid) +// polygons_append(lower_layer_internal_surfaces, polygons); +// polygons_append(lower_layer_fill_surfaces, std::move(polygons)); +// } +// // We also need to support perimeters when there's at least one full unsupported loop +// { +// // Get perimeters area as the difference between slices and fill_surfaces +// // Only consider the area that is not supported by lower perimeters +// Polygons perimeters = intersection(diff(layer->lslices, fill_surfaces), lower_layer_fill_surfaces); +// // Only consider perimeter areas that are at least one extrusion width thick. +// //FIXME Offset2 eats out from both sides, while the perimeters are create outside in. +// //Should the pw not be half of the current value? +// float pw = FLT_MAX; +// for (const LayerRegion *layerm : layer->m_regions) +// pw = std::min(pw, (float)layerm->flow(frPerimeter).scaled_width()); +// // Append such thick perimeters to the areas that need support +// polygons_append(overhangs, opening(perimeters, pw)); +// } +// // Merge the new overhangs, find new internal infill. +// polygons_append(upper_internal, std::move(overhangs)); +// static constexpr const auto closing_radius = scaled(2.f); +// upper_internal = intersection( +// // Regularize the overhang regions, so that the infill areas will not become excessively jagged. +// smooth_outward( +// closing(upper_internal, closing_radius, ClipperLib::jtSquare, 0.), +// scaled(0.1)), +// lower_layer_internal_surfaces); +// // Apply new internal infill to regions. +// for (LayerRegion *layerm : lower_layer->m_regions) { +// if (layerm->region().config().fill_density.value == 0) +// continue; +// Polygons internal; +// for (Surface &surface : layerm->m_fill_surfaces.surfaces) +// if (surface.surface_type == stInternal || surface.surface_type == stInternalVoid) +// polygons_append(internal, std::move(surface.expolygon)); +// layerm->m_fill_surfaces.remove_types({ stInternal, stInternalVoid }); +// layerm->m_fill_surfaces.append(intersection_ex(internal, upper_internal, ApplySafetyOffset::Yes), stInternal); +// layerm->m_fill_surfaces.append(diff_ex (internal, upper_internal, ApplySafetyOffset::Yes), stInternalVoid); +// // If there are voids it means that our internal infill is not adjacent to +// // perimeters. In this case it would be nice to add a loop around infill to +// // make it more robust and nicer. TODO. +// #ifdef SLIC3R_DEBUG_SLICE_PROCESSING +// layerm->export_region_fill_surfaces_to_svg_debug("6_clip_fill_surfaces"); +// #endif +// } +// m_print->throw_if_canceled(); +// } +// } // void PrintObject::clip_fill_surfaces() void PrintObject::discover_horizontal_shells() { BOOST_LOG_TRIVIAL(trace) << "discover_horizontal_shells()"; - - for (size_t region_id = 0; region_id < this->num_printing_regions(); ++ region_id) { - for (size_t i = 0; i < m_layers.size(); ++ i) { + + for (size_t region_id = 0; region_id < this->num_printing_regions(); ++region_id) { + for (size_t i = 0; i < m_layers.size(); ++i) { m_print->throw_if_canceled(); - Layer *layer = m_layers[i]; - LayerRegion *layerm = layer->regions()[region_id]; + Layer *layer = m_layers[i]; + LayerRegion *layerm = layer->regions()[region_id]; const PrintRegionConfig ®ion_config = layerm->region().config(); if (region_config.solid_infill_every_layers.value > 0 && region_config.fill_density.value > 0 && (i % region_config.solid_infill_every_layers) == 0) { // Insert a solid internal layer. Mark stInternal surfaces as stInternalSolid or stInternalBridge. - SurfaceType type = (region_config.fill_density == 100 || region_config.solid_infill_every_layers == 1) ? stInternalSolid : stInternalBridge; - for (Surface &surface : layerm->fill_surfaces.surfaces) + SurfaceType type = (region_config.fill_density == 100 || region_config.solid_infill_every_layers == 1) ? stInternalSolid : + stInternalBridge; + for (Surface &surface : layerm->m_fill_surfaces.surfaces) if (surface.surface_type == stInternal) surface.surface_type = type; } - - // If ensure_vertical_shell_thickness, then the rest has already been performed by discover_vertical_shells(). - if (region_config.ensure_vertical_shell_thickness.value) - continue; - - coordf_t print_z = layer->print_z; - coordf_t bottom_z = layer->bottom_z(); - for (size_t idx_surface_type = 0; idx_surface_type < 3; ++ idx_surface_type) { - m_print->throw_if_canceled(); - SurfaceType type = (idx_surface_type == 0) ? stTop : (idx_surface_type == 1) ? stBottom : stBottomBridge; - int num_solid_layers = (type == stTop) ? region_config.top_solid_layers.value : region_config.bottom_solid_layers.value; - if (num_solid_layers == 0) - continue; - // Find slices of current type for current layer. - // Use slices instead of fill_surfaces, because they also include the perimeter area, - // which needs to be propagated in shells; we need to grow slices like we did for - // fill_surfaces though. Using both ungrown slices and grown fill_surfaces will - // not work in some situations, as there won't be any grown region in the perimeter - // area (this was seen in a model where the top layer had one extra perimeter, thus - // its fill_surfaces were thinner than the lower layer's infill), however it's the best - // solution so far. Growing the external slices by EXTERNAL_INFILL_MARGIN will put - // too much solid infill inside nearly-vertical slopes. - - // Surfaces including the area of perimeters. Everything, that is visible from the top / bottom - // (not covered by a layer above / below). - // This does not contain the areas covered by perimeters! - Polygons solid; - for (const Surface &surface : layerm->slices.surfaces) - if (surface.surface_type == type) - polygons_append(solid, to_polygons(surface.expolygon)); - // Infill areas (slices without the perimeters). - for (const Surface &surface : layerm->fill_surfaces.surfaces) - if (surface.surface_type == type) - polygons_append(solid, to_polygons(surface.expolygon)); - if (solid.empty()) - continue; -// Slic3r::debugf "Layer %d has %s surfaces\n", $i, ($type == stTop) ? 'top' : 'bottom'; - - // Scatter top / bottom regions to other layers. Scattering process is inherently serial, it is difficult to parallelize without locking. - for (int n = (type == stTop) ? int(i) - 1 : int(i) + 1; - (type == stTop) ? - (n >= 0 && (int(i) - n < num_solid_layers || - print_z - m_layers[n]->print_z < region_config.top_solid_min_thickness.value - EPSILON)) : - (n < int(m_layers.size()) && (n - int(i) < num_solid_layers || - m_layers[n]->bottom_z() - bottom_z < region_config.bottom_solid_min_thickness.value - EPSILON)); - (type == stTop) ? -- n : ++ n) - { -// Slic3r::debugf " looking for neighbors on layer %d...\n", $n; - // Reference to the lower layer of a TOP surface, or an upper layer of a BOTTOM surface. - LayerRegion *neighbor_layerm = m_layers[n]->regions()[region_id]; - - // find intersection between neighbor and current layer's surfaces - // intersections have contours and holes - // we update $solid so that we limit the next neighbor layer to the areas that were - // found on this one - in other words, solid shells on one layer (for a given external surface) - // are always a subset of the shells found on the previous shell layer - // this approach allows for DWIM in hollow sloping vases, where we want bottom - // shells to be generated in the base but not in the walls (where there are many - // narrow bottom surfaces): reassigning $solid will consider the 'shadow' of the - // upper perimeter as an obstacle and shell will not be propagated to more upper layers - //FIXME How does it work for stInternalBRIDGE? This is set for sparse infill. Likely this does not work. - Polygons new_internal_solid; - { - Polygons internal; - for (const Surface &surface : neighbor_layerm->fill_surfaces.surfaces) - if (surface.surface_type == stInternal || surface.surface_type == stInternalSolid) - polygons_append(internal, to_polygons(surface.expolygon)); - new_internal_solid = intersection(solid, internal, ApplySafetyOffset::Yes); - } - if (new_internal_solid.empty()) { - // No internal solid needed on this layer. In order to decide whether to continue - // searching on the next neighbor (thus enforcing the configured number of solid - // layers, use different strategies according to configured infill density: - if (region_config.fill_density.value == 0) { - // If user expects the object to be void (for example a hollow sloping vase), - // don't continue the search. In this case, we only generate the external solid - // shell if the object would otherwise show a hole (gap between perimeters of - // the two layers), and internal solid shells are a subset of the shells found - // on each previous layer. - goto EXTERNAL; - } else { - // If we have internal infill, we can generate internal solid shells freely. - continue; - } - } - - if (region_config.fill_density.value == 0) { - // if we're printing a hollow object we discard any solid shell thinner - // than a perimeter width, since it's probably just crossing a sloping wall - // and it's not wanted in a hollow print even if it would make sense when - // obeying the solid shell count option strictly (DWIM!) - float margin = float(neighbor_layerm->flow(frExternalPerimeter).scaled_width()); - Polygons too_narrow = diff( - new_internal_solid, - opening(new_internal_solid, margin, margin + ClipperSafetyOffset, jtMiter, 5)); - // Trim the regularized region by the original region. - if (! too_narrow.empty()) - new_internal_solid = solid = diff(new_internal_solid, too_narrow); - } - - // make sure the new internal solid is wide enough, as it might get collapsed - // when spacing is added in Fill.pm - { - //FIXME Vojtech: Disable this and you will be sorry. - // https://github.com/prusa3d/PrusaSlicer/issues/26 bottom - float margin = 3.f * layerm->flow(frSolidInfill).scaled_width(); // require at least this size - // we use a higher miterLimit here to handle areas with acute angles - // in those cases, the default miterLimit would cut the corner and we'd - // get a triangle in $too_narrow; if we grow it below then the shell - // would have a different shape from the external surface and we'd still - // have the same angle, so the next shell would be grown even more and so on. - Polygons too_narrow = diff( - new_internal_solid, - opening(new_internal_solid, margin, margin + ClipperSafetyOffset, ClipperLib::jtMiter, 5)); - if (! too_narrow.empty()) { - // grow the collapsing parts and add the extra area to the neighbor layer - // as well as to our original surfaces so that we support this - // additional area in the next shell too - // make sure our grown surfaces don't exceed the fill area - Polygons internal; - for (const Surface &surface : neighbor_layerm->fill_surfaces.surfaces) - if (surface.is_internal() && !surface.is_bridge()) - polygons_append(internal, to_polygons(surface.expolygon)); - polygons_append(new_internal_solid, - intersection( - expand(too_narrow, +margin), - // Discard bridges as they are grown for anchoring and we can't - // remove such anchors. (This may happen when a bridge is being - // anchored onto a wall where little space remains after the bridge - // is grown, and that little space is an internal solid shell so - // it triggers this too_narrow logic.) - internal)); - // see https://github.com/prusa3d/PrusaSlicer/pull/3426 - // solid = new_internal_solid; - } - } - - // internal-solid are the union of the existing internal-solid surfaces - // and new ones - SurfaceCollection backup = std::move(neighbor_layerm->fill_surfaces); - polygons_append(new_internal_solid, to_polygons(backup.filter_by_type(stInternalSolid))); - ExPolygons internal_solid = union_ex(new_internal_solid); - // assign new internal-solid surfaces to layer - neighbor_layerm->fill_surfaces.set(internal_solid, stInternalSolid); - // subtract intersections from layer surfaces to get resulting internal surfaces - Polygons polygons_internal = to_polygons(std::move(internal_solid)); - ExPolygons internal = diff_ex(backup.filter_by_type(stInternal), polygons_internal, ApplySafetyOffset::Yes); - // assign resulting internal surfaces to layer - neighbor_layerm->fill_surfaces.append(internal, stInternal); - polygons_append(polygons_internal, to_polygons(std::move(internal))); - // assign top and bottom surfaces to layer - SurfaceType surface_types_solid[] = { stTop, stBottom, stBottomBridge }; - backup.keep_types(surface_types_solid, 3); - std::vector top_bottom_groups; - backup.group(&top_bottom_groups); - for (SurfacesPtr &group : top_bottom_groups) - neighbor_layerm->fill_surfaces.append( - diff_ex(group, polygons_internal), - // Use an existing surface as a template, it carries the bridge angle etc. - *group.front()); - } - EXTERNAL:; - } // foreach type (stTop, stBottom, stBottomBridge) + // The rest has already been performed by discover_vertical_shells(). } // for each layer - } // for each region + } // for each region #ifdef SLIC3R_DEBUG_SLICE_PROCESSING - for (size_t region_id = 0; region_id < this->num_printing_regions(); ++ region_id) { + for (size_t region_id = 0; region_id < this->num_printing_regions(); ++region_id) { for (const Layer *layer : m_layers) { const LayerRegion *layerm = layer->m_regions[region_id]; layerm->export_region_slices_to_svg_debug("5_discover_horizontal_shells"); layerm->export_region_fill_surfaces_to_svg_debug("5_discover_horizontal_shells"); } // for each layer - } // for each region -#endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ -} + } // for each region +#endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ +} // void PrintObject::discover_horizontal_shells() // combine fill surfaces across layers to honor the "infill every N layers" option // Idempotence of this method is guaranteed by the fact that we don't remove things from @@ -2085,10 +2635,10 @@ void PrintObject::combine_infill() layerms.emplace_back(m_layers[i]->regions()[region_id]); // We need to perform a multi-layer intersection, so let's split it in pairs. // Initialize the intersection with the candidates of the lowest layer. - ExPolygons intersection = to_expolygons(layerms.front()->fill_surfaces.filter_by_type(stInternal)); + ExPolygons intersection = to_expolygons(layerms.front()->fill_surfaces().filter_by_type(stInternal)); // Start looping from the second layer and intersect the current intersection with it. for (size_t i = 1; i < layerms.size(); ++ i) - intersection = intersection_ex(layerms[i]->fill_surfaces.filter_by_type(stInternal), intersection); + intersection = intersection_ex(layerms[i]->fill_surfaces().filter_by_type(stInternal), intersection); double area_threshold = layerms.front()->infill_area_threshold(); if (! intersection.empty() && area_threshold > 0.) intersection.erase(std::remove_if(intersection.begin(), intersection.end(), @@ -2117,9 +2667,9 @@ void PrintObject::combine_infill() for (ExPolygon &expoly : intersection) polygons_append(intersection_with_clearance, offset(expoly, clearance_offset)); for (LayerRegion *layerm : layerms) { - Polygons internal = to_polygons(std::move(layerm->fill_surfaces.filter_by_type(stInternal))); - layerm->fill_surfaces.remove_type(stInternal); - layerm->fill_surfaces.append(diff_ex(internal, intersection_with_clearance), stInternal); + Polygons internal = to_polygons(std::move(layerm->fill_surfaces().filter_by_type(stInternal))); + layerm->m_fill_surfaces.remove_type(stInternal); + layerm->m_fill_surfaces.append(diff_ex(internal, intersection_with_clearance), stInternal); if (layerm == layerms.back()) { // Apply surfaces back with adjusted depth to the uppermost layer. Surface templ(stInternal, ExPolygon()); @@ -2127,25 +2677,31 @@ void PrintObject::combine_infill() for (LayerRegion *layerm2 : layerms) templ.thickness += layerm2->layer()->height; templ.thickness_layers = (unsigned short)layerms.size(); - layerm->fill_surfaces.append(intersection, templ); + layerm->m_fill_surfaces.append(intersection, templ); } else { // Save void surfaces. - layerm->fill_surfaces.append( + layerm->m_fill_surfaces.append( intersection_ex(internal, intersection_with_clearance), stInternalVoid); } } } } -} +} // void PrintObject::combine_infill() void PrintObject::_generate_support_material() { - PrintObjectSupportMaterial support_material(this, m_slicing_params); - support_material.generate(*this); + if (this->has_support() && (m_config.support_material_style == smsTree || m_config.support_material_style == smsOrganic)) { + fff_tree_support_generate(*this, std::function([this](){ this->throw_if_canceled(); })); + } else { + // If support style is set to Organic however only raft will be built but no support, + // build snug raft instead. + PrintObjectSupportMaterial support_material(this, m_slicing_params); + support_material.generate(*this); + } } -static void project_triangles_to_slabs(ConstLayerPtrsAdaptor layers, const indexed_triangle_set &custom_facets, const Transform3f &tr, bool seam, std::vector &out) +static void project_triangles_to_slabs(SpanOfConstPtrs layers, const indexed_triangle_set &custom_facets, const Transform3f &tr, bool seam, std::vector &out) { if (custom_facets.indices.empty()) return; diff --git a/src/libslic3r/PrintObjectSlice.cpp b/src/libslic3r/PrintObjectSlice.cpp index 4b91714e586..6f6080cb8e5 100644 --- a/src/libslic3r/PrintObjectSlice.cpp +++ b/src/libslic3r/PrintObjectSlice.cpp @@ -1,16 +1,15 @@ +#include "ClipperUtils.hpp" #include "ElephantFootCompensation.hpp" #include "I18N.hpp" #include "Layer.hpp" #include "MultiMaterialSegmentation.hpp" #include "Print.hpp" -#include "ClipperUtils.hpp" +#include "ShortestPath.hpp" #include #include -//! macro used to mark string used at localization, return same string -#define L(s) Slic3r::I18N::translate(s) namespace Slic3r { @@ -237,9 +236,6 @@ static std::vector> slices_to_regions( const PrintObjectRegions &print_object_regions, const std::vector &zs, std::vector &&volume_slices, - // If clipping is disabled, then ExPolygons produced by different volumes will never be merged, thus they will be allowed to overlap. - // It is up to the model designer to handle these overlaps. - const bool clip_multipart_objects, const std::function &throw_on_cancel_callback) { model_volumes_sort_by_id(model_volumes); @@ -308,7 +304,7 @@ static std::vector> slices_to_regions( } tbb::parallel_for( tbb::blocked_range(0, zs_complex.size()), - [&slices_by_region, &print_object_regions, &zs_complex, &layer_ranges_regions_to_slices, clip_multipart_objects, &throw_on_cancel_callback] + [&slices_by_region, &print_object_regions, &zs_complex, &layer_ranges_regions_to_slices, &throw_on_cancel_callback] (const tbb::blocked_range &range) { float z = zs_complex[range.begin()].second; auto it_layer_range = layer_range_first(print_object_regions.layer_ranges, z); @@ -359,7 +355,7 @@ static std::vector> slices_to_regions( if (next_region_same_modifier) // To be used in the following iteration. temp_slices[idx_region + 1].expolygons = std::move(source); - } else if ((region.model_volume->is_model_part() && clip_multipart_objects) || region.model_volume->is_negative_volume()) { + } else if (region.model_volume->is_model_part() || region.model_volume->is_negative_volume()) { // Clip every non-zero region preceding it. for (int idx_region2 = 0; idx_region2 < idx_region; ++ idx_region2) if (! temp_slices[idx_region2].expolygons.empty()) { @@ -388,10 +384,7 @@ static std::vector> slices_to_regions( merged = true; } } - // Don't unite the regions if ! clip_multipart_objects. In that case it is user's responsibility - // to handle region overlaps. Indeed, one may intentionally let the regions overlap to produce crossing perimeters - // for example. - if (merged && clip_multipart_objects) + if (merged) expolygons = closing_ex(expolygons, float(scale_(EPSILON))); slices_by_region[temp_slices[i].region_id][z_idx] = std::move(expolygons); i = j; @@ -404,6 +397,10 @@ static std::vector> slices_to_regions( return slices_by_region; } +// Layer::slicing_errors is no more set since 1.41.1 or possibly earlier, thus this code +// was not really functional for a long day and nobody missed it. +// Could we reuse this fixing code one day? +/* std::string fix_slicing_errors(LayerPtrs &layers, const std::function &throw_if_canceled) { // Collect layers with slicing errors. @@ -432,12 +429,12 @@ std::string fix_slicing_errors(LayerPtrs &layers, const std::function &t const Surfaces *lower_surfaces = nullptr; for (size_t j = idx_layer + 1; j < layers.size(); ++ j) if (! layers[j]->slicing_errors) { - upper_surfaces = &layers[j]->regions()[region_id]->slices.surfaces; + upper_surfaces = &layers[j]->regions()[region_id]->slices().surfaces; break; } for (int j = int(idx_layer) - 1; j >= 0; -- j) if (! layers[j]->slicing_errors) { - lower_surfaces = &layers[j]->regions()[region_id]->slices.surfaces; + lower_surfaces = &layers[j]->regions()[region_id]->slices().surfaces; break; } // Collect outer contours and holes from the valid layers above & below. @@ -464,7 +461,7 @@ std::string fix_slicing_errors(LayerPtrs &layers, const std::function &t if (lower_surfaces) for (const auto &surface : *lower_surfaces) polygons_append(holes, surface.expolygon.holes); - layerm->slices.set(diff_ex(union_(outer), holes), stInternal); + layerm->m_slices.set(diff_ex(union_(outer), holes), stInternal); } // Update layer slices after repairing the single regions. layer->make_slices(); @@ -486,6 +483,7 @@ std::string fix_slicing_errors(LayerPtrs &layers, const std::function &t "The model has overlapping or self-intersecting facets. I tried to repair it, " "however you might want to check the results or repair the input file and retry.\n"; } +*/ // Called by make_perimeters() // 1) Decides Z positions of the layers, @@ -499,7 +497,7 @@ void PrintObject::slice() { if (! this->set_started(posSlice)) return; - m_print->set_status(10, L("Processing triangulated mesh")); + m_print->set_status(10, _u8L("Processing triangulated mesh")); std::vector layer_height_profile; this->update_layer_height_profile(*this->model_object(), m_slicing_params, layer_height_profile); m_print->throw_if_canceled(); @@ -508,33 +506,48 @@ void PrintObject::slice() m_layers = new_layers(this, generate_object_layers(m_slicing_params, layer_height_profile)); this->slice_volumes(); m_print->throw_if_canceled(); +#if 0 + // Layer::slicing_errors is no more set since 1.41.1 or possibly earlier, thus this code + // was not really functional for a long day and nobody missed it. + // Could we reuse this fixing code one day? + // Fix the model. //FIXME is this the right place to do? It is done repeateadly at the UI and now here at the backend. std::string warning = fix_slicing_errors(m_layers, [this](){ m_print->throw_if_canceled(); }); m_print->throw_if_canceled(); if (! warning.empty()) BOOST_LOG_TRIVIAL(info) << warning; +#endif // Update bounding boxes, back up raw slices of complex models. tbb::parallel_for( tbb::blocked_range(0, m_layers.size()), - [this](const tbb::blocked_range& range) { + [this](const tbb::blocked_range &range) { for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) { m_print->throw_if_canceled(); Layer &layer = *m_layers[layer_idx]; - layer.lslices_bboxes.clear(); - layer.lslices_bboxes.reserve(layer.lslices.size()); + layer.lslices_ex.clear(); + layer.lslices_ex.reserve(layer.lslices.size()); for (const ExPolygon &expoly : layer.lslices) - layer.lslices_bboxes.emplace_back(get_extents(expoly)); + layer.lslices_ex.push_back({ get_extents(expoly) }); layer.backup_untyped_slices(); } }); + // Interlink the lslices into a Z graph. + tbb::parallel_for( + tbb::blocked_range(1, m_layers.size()), + [this](const tbb::blocked_range &range) { + for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) { + m_print->throw_if_canceled(); + Layer::build_up_down_graph(*m_layers[layer_idx - 1], *m_layers[layer_idx]); + } + }); if (m_layers.empty()) throw Slic3r::SlicingError("No layers were detected. You might want to repair your STL file(s) or check their size or thickness and retry.\n"); this->set_done(posSlice); } template -static inline void apply_mm_segmentation(PrintObject &print_object, ThrowOnCancel throw_on_cancel) +void apply_mm_segmentation(PrintObject &print_object, ThrowOnCancel throw_on_cancel) { // Returns MMU segmentation based on painting in MMU segmentation gizmo std::vector> segmentation = multi_material_segmentation_by_painting(print_object, throw_on_cancel); @@ -579,9 +592,9 @@ static inline void apply_mm_segmentation(PrintObject &print_object, ThrowOnCance // layer_range.painted_regions are sorted by extruder ID and parent PrintObject region ID. auto it_painted_region = layer_range.painted_regions.begin(); for (int region_id = 0; region_id < int(layer->region_count()); ++ region_id) - if (LayerRegion &layerm = *layer->get_region(region_id); ! layerm.slices.surfaces.empty()) { + if (LayerRegion &layerm = *layer->get_region(region_id); ! layerm.slices().empty()) { assert(layerm.region().print_object_region_id() == region_id); - const BoundingBox bbox = get_extents(layerm.slices.surfaces); + const BoundingBox bbox = get_extents(layerm.slices().surfaces); assert(it_painted_region < layer_range.painted_regions.end()); // Find the first it_painted_region which overrides this region. for (; layer_range.volume_regions[it_painted_region->parent].region->print_object_region_id() < region_id; ++ it_painted_region) @@ -604,7 +617,7 @@ static inline void apply_mm_segmentation(PrintObject &print_object, ThrowOnCance } // Steal from this region. int target_region_id = it_painted_region->region->print_object_region_id(); - ExPolygons stolen = intersection_ex(layerm.slices.surfaces, segmented.expolygons); + ExPolygons stolen = intersection_ex(layerm.slices().surfaces, segmented.expolygons); if (! stolen.empty()) { ByRegion &dst = by_region[target_region_id]; if (dst.expolygons.empty()) { @@ -622,7 +635,7 @@ static inline void apply_mm_segmentation(PrintObject &print_object, ThrowOnCance } if (! self_trimmed) { // Trim slices of this LayerRegion with all the MMU regions. - Polygons mine = to_polygons(std::move(layerm.slices.surfaces)); + Polygons mine = to_polygons(std::move(layerm.slices().surfaces)); for (auto &segmented : by_extruder) if (&segmented - by_extruder.data() + 1 != self_extruder_id && segmented.bbox.defined && bbox.overlap(segmented.bbox)) { mine = diff(mine, segmented.expolygons); @@ -653,7 +666,7 @@ static inline void apply_mm_segmentation(PrintObject &print_object, ThrowOnCance if (src.needs_merge) // Multiple regions were merged into one. src.expolygons = closing_ex(src.expolygons, float(scale_(10 * EPSILON))); - layer->get_region(region_id)->slices.set(std::move(src.expolygons), stInternal); + layer->get_region(region_id)->m_slices.set(std::move(src.expolygons), stInternal); } } }); @@ -687,13 +700,12 @@ void PrintObject::slice_volumes() slice_volumes_inner( print->config(), this->config(), this->trafo_centered(), this->model_object()->volumes, m_shared_regions->layer_ranges, slice_zs, throw_on_cancel_callback), - m_config.clip_multipart_objects, throw_on_cancel_callback); for (size_t region_id = 0; region_id < region_slices.size(); ++ region_id) { std::vector &by_layer = region_slices[region_id]; for (size_t layer_id = 0; layer_id < by_layer.size(); ++ layer_id) - m_layers[layer_id]->regions()[region_id]->slices.append(std::move(by_layer[layer_id]), stInternal); + m_layers[layer_id]->regions()[region_id]->m_slices.append(std::move(by_layer[layer_id]), stInternal); } region_slices.clear(); @@ -719,9 +731,9 @@ void PrintObject::slice_volumes() if (m_config.xy_size_compensation.value != 0.f) { this->active_step_add_warning( PrintStateBase::WarningLevel::CRITICAL, - L("An object has enabled XY Size compensation which will not be used because it is also multi-material painted.\nXY Size " + _u8L("An object has enabled XY Size compensation which will not be used because it is also multi-material painted.\nXY Size " "compensation cannot be combined with multi-material painting.") + - "\n" + (L("Object name")) + ": " + this->model_object()->name); + "\n" + (_u8L("Object name")) + ": " + this->model_object()->name); } BOOST_LOG_TRIVIAL(debug) << "Slicing volumes - MMU segmentation"; @@ -754,14 +766,14 @@ void PrintObject::slice_volumes() LayerRegion *layerm = layer->m_regions.front(); if (elfoot > 0) { // Apply the elephant foot compensation and store the 1st layer slices without the Elephant foot compensation applied. - lslices_1st_layer = to_expolygons(std::move(layerm->slices.surfaces)); + lslices_1st_layer = to_expolygons(std::move(layerm->m_slices.surfaces)); float delta = xy_compensation_scaled; if (delta > elfoot) { delta -= elfoot; elfoot = 0.f; } else if (delta > 0) elfoot -= delta; - layerm->slices.set( + layerm->m_slices.set( union_ex( Slic3r::elephant_foot_compensation( (delta == 0.f) ? lslices_1st_layer : offset_ex(lslices_1st_layer, delta), @@ -771,8 +783,8 @@ void PrintObject::slice_volumes() lslices_1st_layer = offset_ex(std::move(lslices_1st_layer), xy_compensation_scaled); } else if (xy_compensation_scaled < 0.f) { // Apply the XY compensation. - layerm->slices.set( - offset_ex(to_expolygons(std::move(layerm->slices.surfaces)), xy_compensation_scaled), + layerm->m_slices.set( + offset_ex(to_expolygons(std::move(layerm->m_slices.surfaces)), xy_compensation_scaled), stInternal); } } else { @@ -790,15 +802,19 @@ void PrintObject::slice_volumes() layer->m_regions[region_id]->trim_surfaces(trimming); } } - // Merge all regions' slices to get islands, chain them by a shortest path. + // Merge all regions' slices to get islands sorted topologically, chain them by a shortest path in separate index list layer->make_slices(); } }); if (elephant_foot_compensation_scaled > 0.f && ! m_layers.empty()) { // The Elephant foot has been compensated, therefore the 1st layer's lslices are shrank with the Elephant foot compensation value. // Store the uncompensated value there. - assert(m_layers.front()->id() == 0); - m_layers.front()->lslices = std::move(lslices_1st_layer); + //FIXME is this operation needed? MMU painting and brim now have to do work arounds to work with compensated layer, not with the uncompensated layer. + // There may be subtle issues removing this block such as support raft sticking too well with the first object layer. + Layer &layer = *m_layers.front(); + assert(layer.id() == 0); + layer.lslices = std::move(lslices_1st_layer); + layer.lslice_indices_sorted_by_print_order = chain_expolygons(layer.lslices); } } diff --git a/src/libslic3r/QuadricEdgeCollapse.cpp b/src/libslic3r/QuadricEdgeCollapse.cpp index be0a90ec1aa..b105b607562 100644 --- a/src/libslic3r/QuadricEdgeCollapse.cpp +++ b/src/libslic3r/QuadricEdgeCollapse.cpp @@ -184,7 +184,7 @@ void Slic3r::its_quadric_edge_collapse( throw_on_cancel(); status_fn(status_init_size); - //its_store_triangle(its, "triangle.obj", 1182); + //its_store_triangle_to_obj(its, "triangle.obj", 1182); //store_surround("triangle_surround1.obj", 1182, 1, its, v_infos, e_infos); // convert from triangle index to mutable priority queue index @@ -904,7 +904,7 @@ void QuadricEdgeCollapse::store_surround(const char *obj_filename, std::vector trs; trs.reserve(triangles.size()); for (size_t ti : triangles) trs.push_back(ti); - its_store_triangles(its, obj_filename, trs); + its_store_triangles_to_obj(its, obj_filename, trs); // its_write_obj(its,"original.obj"); } diff --git a/src/libslic3r/QuadricEdgeCollapse.hpp b/src/libslic3r/QuadricEdgeCollapse.hpp index c7330bfc5f9..0043fc24a31 100644 --- a/src/libslic3r/QuadricEdgeCollapse.hpp +++ b/src/libslic3r/QuadricEdgeCollapse.hpp @@ -1,6 +1,11 @@ +#ifndef slic3r_quadric_edge_collapse_hpp_ +#define slic3r_quadric_edge_collapse_hpp_ + // paper: https://people.eecs.berkeley.edu/~jrs/meshpapers/GarlandHeckbert2.pdf // sum up: https://users.csc.calpoly.edu/~zwood/teaching/csc570/final06/jseeba/ // inspiration: https://github.com/sp4cerat/Fast-Quadric-Mesh-Simplification +#ifndef PRUSASLICER_QUADRIC_EDGE_COLLAPSE_HPP +#define PRUSASLICER_QUADRIC_EDGE_COLLAPSE_HPP #include #include @@ -26,3 +31,6 @@ void its_quadric_edge_collapse( std::function statusfn = nullptr); } // namespace Slic3r +#endif // slic3r_quadric_edge_collapse_hpp_ + +#endif // PRUSASLICER_QUADRIC_EDGE_COLLAPSE_HPP diff --git a/src/libslic3r/SLA/AGGRaster.hpp b/src/libslic3r/SLA/AGGRaster.hpp index 2243a3c1b54..7c8e71c2aea 100644 --- a/src/libslic3r/SLA/AGGRaster.hpp +++ b/src/libslic3r/SLA/AGGRaster.hpp @@ -3,7 +3,6 @@ #include #include "libslic3r/ExPolygon.hpp" -#include "libslic3r/MTUtils.hpp" // For rasterizing #include @@ -42,7 +41,7 @@ class AGGRaster: public RasterBase { using TValue = typename TColor::value_type; using TPixel = typename PixelRenderer::pixel_type; using TRawBuffer = agg::rendering_buffer; - + protected: Resolution m_resolution; @@ -154,8 +153,8 @@ class AGGRaster: public RasterBase { } Trafo trafo() const override { return m_trafo; } - Resolution resolution() const override { return m_resolution; } - PixelDim pixel_dimensions() const override + Resolution resolution() const { return m_resolution; } + PixelDim pixel_dimensions() const { return {SCALING_FACTOR / m_pxdim_scaled.w_mm, SCALING_FACTOR / m_pxdim_scaled.h_mm}; @@ -187,11 +186,15 @@ class RasterGrayscaleAA : public _RasterGrayscaleAA { using typename Base::TValue; public: template - RasterGrayscaleAA(const RasterBase::Resolution &res, - const RasterBase::PixelDim & pd, - const RasterBase::Trafo & trafo, - GammaFn && fn) - : Base(res, pd, trafo, Colors::White, Colors::Black, + RasterGrayscaleAA(const Resolution &res, + const PixelDim &pd, + const RasterBase::Trafo &trafo, + GammaFn &&fn) + : Base(res, + pd, + trafo, + Colors::White, + Colors::Black, std::forward(fn)) {} @@ -209,10 +212,10 @@ class RasterGrayscaleAA : public _RasterGrayscaleAA { class RasterGrayscaleAAGammaPower: public RasterGrayscaleAA { public: - RasterGrayscaleAAGammaPower(const RasterBase::Resolution &res, - const RasterBase::PixelDim & pd, - const RasterBase::Trafo & trafo, - double gamma = 1.) + RasterGrayscaleAAGammaPower(const Resolution &res, + const PixelDim &pd, + const RasterBase::Trafo &trafo, + double gamma = 1.) : RasterGrayscaleAA(res, pd, trafo, agg::gamma_power(gamma)) {} }; diff --git a/src/libslic3r/SLA/BranchingTreeSLA.cpp b/src/libslic3r/SLA/BranchingTreeSLA.cpp new file mode 100644 index 00000000000..bb97126161a --- /dev/null +++ b/src/libslic3r/SLA/BranchingTreeSLA.cpp @@ -0,0 +1,427 @@ +#include "BranchingTreeSLA.hpp" + +#include "libslic3r/Execution/ExecutionTBB.hpp" + +#include "libslic3r/KDTreeIndirect.hpp" + +#include "SupportTreeUtils.hpp" +#include "BranchingTree/PointCloud.hpp" + +#include "Pad.hpp" + +#include + +namespace Slic3r { namespace sla { + +inline constexpr const auto &beam_ex_policy = ex_tbb; + +class BranchingTreeBuilder: public branchingtree::Builder { + SupportTreeBuilder &m_builder; + const SupportableMesh &m_sm; + const branchingtree::PointCloud &m_cloud; + + std::vector m_pillars; // to put an index over them + + // cache succesfull ground connections + mutable std::map m_gnd_connections; + mutable execution::SpinningMutex m_gnd_connections_mtx; + + // Scaling of the input value 'widening_factor:<0, 1>' to produce resonable + // widening behaviour + static constexpr double WIDENING_SCALE = 0.05; + + double get_radius(const branchingtree::Node &j) const + { + double w = WIDENING_SCALE * m_sm.cfg.pillar_widening_factor * j.weight; + + return double(j.Rmin) + w; + } + + std::vector m_unroutable_pinheads; + + void build_subtree(size_t root) + { + traverse(m_cloud, root, [this](const branchingtree::Node &node) { + if (node.left >= 0 && node.right >= 0) { + auto nparent = m_cloud.get(node.id); + auto nleft = m_cloud.get(node.left); + auto nright = m_cloud.get(node.right); + Vec3d from1d = nleft.pos.cast(); + Vec3d from2d = nright.pos.cast(); + Vec3d tod = nparent.pos.cast(); + double mergeR = get_radius(nparent); + double leftR = get_radius(nleft); + double rightR = get_radius(nright); + + m_builder.add_diffbridge(from1d, tod, leftR, mergeR); + m_builder.add_diffbridge(from2d, tod, rightR, mergeR); + m_builder.add_junction(tod, mergeR); + } else if (int child = node.left + node.right + 1; child >= 0) { + auto from = m_cloud.get(child); + auto to = m_cloud.get(node.id); + auto tod = to.pos.cast(); + double toR = get_radius(to); + m_builder.add_diffbridge(from.pos.cast(), + tod, + get_radius(from), + toR); + m_builder.add_junction(tod, toR); + } + }); + } + + void discard_subtree(size_t root) + { + // Discard all the support points connecting to this branch. + traverse(m_cloud, root, [this](const branchingtree::Node &node) { + int suppid_parent = m_cloud.get_leaf_id(node.id); + int suppid_left = m_cloud.get_leaf_id(node.left); + int suppid_right = m_cloud.get_leaf_id(node.right); + if (suppid_parent >= 0) + m_unroutable_pinheads.emplace_back(suppid_parent); + if (suppid_left >= 0) + m_unroutable_pinheads.emplace_back(suppid_left); + if (suppid_right >= 0) + m_unroutable_pinheads.emplace_back(suppid_right); + }); + } + + void discard_subtree_rescure(size_t root) + { + // Discard all the support points connecting to this branch. + // As a last resort, try to route child nodes to ground and stop + // traversing if any child branch succeeds. + traverse(m_cloud, root, [this](const branchingtree::Node &node) { + branchingtree::TraverseReturnT ret{true, true}; + + int suppid_parent = m_cloud.get_leaf_id(node.id); + int suppid_left = branchingtree::Node::ID_NONE; + int suppid_right = branchingtree::Node::ID_NONE; + + double glvl = ground_level(m_sm); + branchingtree::Node dst = node; + dst.pos.z() = glvl; + dst.weight += node.pos.z() - glvl; + + if (node.left >= 0 && add_ground_bridge(m_cloud.get(node.left), dst)) + ret.to_left = false; + else + suppid_left = m_cloud.get_leaf_id(node.left); + + if (node.right >= 0 && add_ground_bridge(m_cloud.get(node.right), dst)) + ret.to_right = false; + else + suppid_right = m_cloud.get_leaf_id(node.right); + + if (suppid_parent >= 0) + m_unroutable_pinheads.emplace_back(suppid_parent); + if (suppid_left >= 0) + m_unroutable_pinheads.emplace_back(suppid_left); + if (suppid_right >= 0) + m_unroutable_pinheads.emplace_back(suppid_right); + + return ret; + }); + } + +public: + BranchingTreeBuilder(SupportTreeBuilder &builder, + const SupportableMesh &sm, + const branchingtree::PointCloud &cloud) + : m_builder{builder}, m_sm{sm}, m_cloud{cloud} + {} + + bool add_bridge(const branchingtree::Node &from, + const branchingtree::Node &to) override; + + bool add_merger(const branchingtree::Node &node, + const branchingtree::Node &closest, + const branchingtree::Node &merge_node) override; + + bool add_ground_bridge(const branchingtree::Node &from, + const branchingtree::Node &/*to*/) override; + + bool add_mesh_bridge(const branchingtree::Node &from, + const branchingtree::Node &to) override; + + std::optional suggest_avoidance(const branchingtree::Node &from, + float max_bridge_len) const override; + + void report_unroutable(const branchingtree::Node &j) override + { + double glvl = ground_level(m_sm); + branchingtree::Node dst = j; + dst.pos.z() = glvl; + dst.weight += j.pos.z() - glvl; + if (add_ground_bridge(j, dst)) + return; + + BOOST_LOG_TRIVIAL(warning) << "Cannot route junction at " << j.pos.x() + << " " << j.pos.y() << " " << j.pos.z(); + + // Discard all the support points connecting to this branch. + discard_subtree_rescure(j.id); +// discard_subtree(j.id); + } + + const std::vector& unroutable_pinheads() const + { + return m_unroutable_pinheads; + } + + bool is_valid() const override { return !m_builder.ctl().stopcondition(); } + + const std::vector & pillars() const { return m_pillars; } + + const GroundConnection *ground_conn(size_t pillar) const + { + const GroundConnection *ret = nullptr; + + auto it = m_gnd_connections.find(m_pillars[pillar].id); + if (it != m_gnd_connections.end()) + ret = &it->second; + + return ret; + } +}; + +bool BranchingTreeBuilder::add_bridge(const branchingtree::Node &from, + const branchingtree::Node &to) +{ + Vec3d fromd = from.pos.cast(), tod = to.pos.cast(); + double fromR = get_radius(from), toR = get_radius(to); + Beam beam{Ball{fromd, fromR}, Ball{tod, toR}}; + auto hit = beam_mesh_hit(beam_ex_policy , m_sm.emesh, beam, + m_sm.cfg.safety_distance_mm); + + bool ret = hit.distance() > (tod - fromd).norm(); + + return ret; +} + +bool BranchingTreeBuilder::add_merger(const branchingtree::Node &node, + const branchingtree::Node &closest, + const branchingtree::Node &merge_node) +{ + Vec3d from1d = node.pos.cast(), + from2d = closest.pos.cast(), + tod = merge_node.pos.cast(); + + double mergeR = get_radius(merge_node); + double nodeR = get_radius(node); + double closestR = get_radius(closest); + Beam beam1{Ball{from1d, nodeR}, Ball{tod, mergeR}}; + Beam beam2{Ball{from2d, closestR}, Ball{tod, mergeR}}; + + auto sd = m_sm.cfg.safety_distance_mm ; + auto hit1 = beam_mesh_hit(beam_ex_policy , m_sm.emesh, beam1, sd); + auto hit2 = beam_mesh_hit(beam_ex_policy , m_sm.emesh, beam2, sd); + + bool ret = hit1.distance() > (tod - from1d).norm() && + hit2.distance() > (tod - from2d).norm(); + + return ret; +} + +bool BranchingTreeBuilder::add_ground_bridge(const branchingtree::Node &from, + const branchingtree::Node &to) +{ + bool ret = false; + + namespace bgi = boost::geometry::index; + + auto it = m_gnd_connections.find(from.id); + const GroundConnection *connptr = nullptr; + + if (it == m_gnd_connections.end()) { + sla::Junction j{from.pos.cast(), get_radius(from)}; + Vec3d init_dir = (to.pos - from.pos).cast().normalized(); + + auto conn = deepsearch_ground_connection(beam_ex_policy , m_sm, j, + get_radius(to), init_dir); + + // Remember that this node was tested if can go to ground, don't + // test it with any other destination ground point because + // it is unlikely that search_ground_route would find a better solution + connptr = &(m_gnd_connections[from.id] = conn); + } else { + connptr = &(it->second); + } + + if (connptr && *connptr) { + m_pillars.emplace_back(from); + ret = true; + build_subtree(from.id); + } + + return ret; +} + +bool BranchingTreeBuilder::add_mesh_bridge(const branchingtree::Node &from, + const branchingtree::Node &to) +{ + if (from.weight > m_sm.cfg.max_weight_on_model_support) + return false; + + sla::Junction fromj = {from.pos.cast(), get_radius(from)}; + + auto anchor = m_sm.cfg.ground_facing_only ? + std::optional{} : // If no mesh connections are allowed + calculate_anchor_placement(beam_ex_policy , m_sm, fromj, + to.pos.cast()); + + if (anchor) { + sla::Junction toj = {anchor->junction_point(), anchor->r_back_mm}; + + auto hit = beam_mesh_hit(beam_ex_policy , m_sm.emesh, + Beam{{fromj.pos, fromj.r}, {toj.pos, toj.r}}, 0.); + + if (hit.distance() > distance(fromj.pos, toj.pos)) { + m_builder.add_diffbridge(fromj.pos, toj.pos, fromj.r, toj.r); + m_builder.add_anchor(*anchor); + + build_subtree(from.id); + } else { + anchor.reset(); + } + } + + return bool(anchor); +} + +static std::optional get_avoidance(const GroundConnection &conn, + float maxdist) +{ + std::optional ret; + + if (conn) { + if (conn.path.size() > 1) { + ret = conn.path[1].pos.cast(); + } else { + Vec3f pbeg = conn.path[0].pos.cast(); + Vec3f pend = conn.pillar_base->pos.cast(); + pbeg.z() = std::max(pbeg.z() - maxdist, pend.z()); + ret = pbeg; + } + } + + return ret; +} + +std::optional BranchingTreeBuilder::suggest_avoidance( + const branchingtree::Node &from, float max_bridge_len) const +{ + std::optional ret; + + double glvl = ground_level(m_sm); + branchingtree::Node dst = from; + dst.pos.z() = glvl; + dst.weight += from.pos.z() - glvl; + sla::Junction j{from.pos.cast(), get_radius(from)}; + + auto found_it = m_gnd_connections.end(); + { + std::lock_guard lk{m_gnd_connections_mtx}; + found_it = m_gnd_connections.find(from.id); + } + + if (found_it != m_gnd_connections.end()) { + ret = get_avoidance(found_it->second, max_bridge_len); + } else { + auto conn = deepsearch_ground_connection( + beam_ex_policy , m_sm, j, get_radius(dst), sla::DOWN); + + { + std::lock_guard lk{m_gnd_connections_mtx}; + m_gnd_connections[from.id] = conn; + } + + ret = get_avoidance(conn, max_bridge_len); + } + + return ret; +} + +inline void build_pillars(SupportTreeBuilder &builder, + BranchingTreeBuilder &vbuilder, + const SupportableMesh &sm) +{ + for (size_t pill_id = 0; pill_id < vbuilder.pillars().size(); ++pill_id) { + auto * conn = vbuilder.ground_conn(pill_id); + if (conn) + build_ground_connection(builder, sm, *conn); + } +} + +void create_branching_tree(SupportTreeBuilder &builder, const SupportableMesh &sm) +{ + auto coordfn = [&sm](size_t id, size_t dim) { return sm.pts[id].pos(dim); }; + KDTreeIndirect<3, float, decltype (coordfn)> tree{coordfn, sm.pts.size()}; + + auto nondup_idx = non_duplicate_suppt_indices(tree, sm.pts, 0.1); + std::vector> heads(nondup_idx.size()); + auto leafs = reserve_vector(nondup_idx.size()); + + execution::for_each( + ex_tbb, size_t(0), nondup_idx.size(), + [&sm, &heads, &nondup_idx, &builder](size_t i) { + if (!builder.ctl().stopcondition()) + heads[i] = calculate_pinhead_placement(ex_seq, sm, nondup_idx[i]); + }, + execution::max_concurrency(ex_tbb) + ); + + if (builder.ctl().stopcondition()) + return; + + for (auto &h : heads) + if (h && h->is_valid()) { + leafs.emplace_back(h->junction_point().cast(), h->r_back_mm); + h->id = long(leafs.size() - 1); + builder.add_head(h->id, *h); + } + + auto &its = *sm.emesh.get_triangle_mesh(); + ExPolygons bedpolys = {branchingtree::make_bed_poly(its)}; + + auto props = branchingtree::Properties{} + .bed_shape(bedpolys) + .ground_level(sla::ground_level(sm)) + .max_slope(sm.cfg.bridge_slope) + .max_branch_length(sm.cfg.max_bridge_length_mm); + + auto meshpts = sm.cfg.ground_facing_only ? + std::vector{} : + branchingtree::sample_mesh(its, + props.sampling_radius()); + + auto bedpts = branchingtree::sample_bed(props.bed_shape(), + float(props.ground_level()), + props.sampling_radius()); + + for (auto &bp : bedpts) + bp.Rmin = sm.cfg.head_back_radius_mm; + + branchingtree::PointCloud nodes{std::move(meshpts), std::move(bedpts), + std::move(leafs), props}; + + BranchingTreeBuilder vbuilder{builder, sm, nodes}; + + execution::for_each(ex_tbb, + size_t(0), + nodes.get_leafs().size(), + [&nodes, &vbuilder](size_t leaf_idx) { + vbuilder.suggest_avoidance(nodes.get_leafs()[leaf_idx], + nodes.properties().max_branch_length()); + }); + + branchingtree::build_tree(nodes, vbuilder); + + build_pillars(builder, vbuilder, sm); + + for (size_t id : vbuilder.unroutable_pinheads()) + builder.head(id).invalidate(); + +} + +}} // namespace Slic3r::sla diff --git a/src/libslic3r/SLA/BranchingTreeSLA.hpp b/src/libslic3r/SLA/BranchingTreeSLA.hpp new file mode 100644 index 00000000000..c101029bd3c --- /dev/null +++ b/src/libslic3r/SLA/BranchingTreeSLA.hpp @@ -0,0 +1,15 @@ +#ifndef BRANCHINGTREESLA_HPP +#define BRANCHINGTREESLA_HPP + +#include "libslic3r/BranchingTree/BranchingTree.hpp" +#include "SupportTreeBuilder.hpp" + +#include + +namespace Slic3r { namespace sla { + +void create_branching_tree(SupportTreeBuilder& builder, const SupportableMesh &sm); + +}} // namespace Slic3r::sla + +#endif // BRANCHINGTREESLA_HPP diff --git a/src/libslic3r/SLA/Clustering.cpp b/src/libslic3r/SLA/Clustering.cpp index 41ff1d4f093..23aefbdfd1a 100644 --- a/src/libslic3r/SLA/Clustering.cpp +++ b/src/libslic3r/SLA/Clustering.cpp @@ -2,7 +2,7 @@ #include "boost/geometry/index/rtree.hpp" #include -#include +#include namespace Slic3r { namespace sla { diff --git a/src/libslic3r/SLA/Concurrency.hpp b/src/libslic3r/SLA/Concurrency.hpp deleted file mode 100644 index 7299101b313..00000000000 --- a/src/libslic3r/SLA/Concurrency.hpp +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef SLA_CONCURRENCY_H -#define SLA_CONCURRENCY_H - -// FIXME: Deprecated - -#include -#include - -namespace Slic3r { -namespace sla { - -// Set this to true to enable full parallelism in this module. -// Only the well tested parts will be concurrent if this is set to false. -const constexpr bool USE_FULL_CONCURRENCY = true; - -template struct _ccr {}; - -template<> struct _ccr -{ - using SpinningMutex = execution::SpinningMutex; - using BlockingMutex = execution::BlockingMutex; - - template - static void for_each(It from, It to, Fn &&fn, size_t granularity = 1) - { - execution::for_each(ex_tbb, from, to, std::forward(fn), granularity); - } - - template - static auto reduce(Args&&...args) - { - return execution::reduce(ex_tbb, std::forward(args)...); - } - - static size_t max_concurreny() - { - return execution::max_concurrency(ex_tbb); - } -}; - -template<> struct _ccr -{ - using SpinningMutex = execution::SpinningMutex; - using BlockingMutex = execution::BlockingMutex; - - template - static void for_each(It from, It to, Fn &&fn, size_t granularity = 1) - { - execution::for_each(ex_seq, from, to, std::forward(fn), granularity); - } - - template - static auto reduce(Args&&...args) - { - return execution::reduce(ex_seq, std::forward(args)...); - } - - static size_t max_concurreny() - { - return execution::max_concurrency(ex_seq); - } -}; - -using ccr = _ccr; -using ccr_seq = _ccr; -using ccr_par = _ccr; - -}} // namespace Slic3r::sla - -#endif // SLACONCURRENCY_H diff --git a/src/libslic3r/SLA/DefaultSupportTree.cpp b/src/libslic3r/SLA/DefaultSupportTree.cpp new file mode 100644 index 00000000000..429cd45c6e2 --- /dev/null +++ b/src/libslic3r/SLA/DefaultSupportTree.cpp @@ -0,0 +1,983 @@ +#include "DefaultSupportTree.hpp" + +#include +#include +#include +#include + +namespace Slic3r { namespace sla { + +using Slic3r::opt::initvals; +using Slic3r::opt::bounds; +using Slic3r::opt::StopCriteria; +using Slic3r::opt::Optimizer; +using Slic3r::opt::AlgNLoptSubplex; +using Slic3r::opt::AlgNLoptGenetic; + +DefaultSupportTree::DefaultSupportTree(SupportTreeBuilder & builder, + const SupportableMesh &sm) + : m_sm(sm) + , m_support_nmls(sm.pts.size(), 3) + , m_builder(builder) + , m_points(sm.pts.size(), 3) + , m_thr(builder.ctl().cancelfn) +{ + // Prepare the support points in Eigen/IGL format as well, we will use + // it mostly in this form. + + long i = 0; + for (const SupportPoint &sp : m_sm.pts) { + m_points.row(i).x() = double(sp.pos.x()); + m_points.row(i).y() = double(sp.pos.y()); + m_points.row(i).z() = double(sp.pos.z()); + ++i; + } +} + +bool DefaultSupportTree::execute(SupportTreeBuilder &builder, + const SupportableMesh &sm) +{ + if(sm.pts.empty()) return false; + + DefaultSupportTree alg(builder, sm); + + // Let's define the individual steps of the processing. We can experiment + // later with the ordering and the dependencies between them. + enum Steps { + BEGIN, + PINHEADS, + CLASSIFY, + ROUTING_GROUND, + ROUTING_NONGROUND, + CASCADE_PILLARS, + MERGE_RESULT, + DONE, + ABORT, + NUM_STEPS + //... + }; + + // Collect the algorithm steps into a nice sequence + std::array, NUM_STEPS> program = { + [] () { + // Begin... + // Potentially clear up the shared data (not needed for now) + }, + + std::bind(&DefaultSupportTree::add_pinheads, &alg), + + std::bind(&DefaultSupportTree::classify, &alg), + + std::bind(&DefaultSupportTree::routing_to_ground, &alg), + + std::bind(&DefaultSupportTree::routing_to_model, &alg), + + std::bind(&DefaultSupportTree::interconnect_pillars, &alg), + + std::bind(&DefaultSupportTree::merge_result, &alg), + + [] () { + // Done + }, + + [] () { + // Abort + } + }; + + Steps pc = BEGIN; + + if(sm.cfg.ground_facing_only) { + program[ROUTING_NONGROUND] = []() { + BOOST_LOG_TRIVIAL(info) + << "Skipping model-facing supports as requested."; + }; + } + + // Let's define a simple automaton that will run our program. + auto progress = [&builder, &pc] () { + static const std::array stepstr { + "Starting", + "Generate pinheads", + "Classification", + "Routing to ground", + "Routing supports to model surface", + "Interconnecting pillars", + "Merging support mesh", + "Done", + "Abort" + }; + + static const std::array stepstate { + 0, + 30, + 50, + 60, + 70, + 80, + 99, + 100, + 0 + }; + + if(builder.ctl().stopcondition()) pc = ABORT; + + switch(pc) { + case BEGIN: pc = PINHEADS; break; + case PINHEADS: pc = CLASSIFY; break; + case CLASSIFY: pc = ROUTING_GROUND; break; + case ROUTING_GROUND: pc = ROUTING_NONGROUND; break; + case ROUTING_NONGROUND: pc = CASCADE_PILLARS; break; + case CASCADE_PILLARS: pc = MERGE_RESULT; break; + case MERGE_RESULT: pc = DONE; break; + case DONE: + case ABORT: break; + default: ; + } + + builder.ctl().statuscb(stepstate[pc], stepstr[pc]); + }; + + // Just here we run the computation... + while(pc < DONE) { + progress(); + program[pc](); + } + + return pc == ABORT; +} + +AABBMesh::hit_result DefaultSupportTree::pinhead_mesh_intersect( + const Vec3d &s, + const Vec3d &dir, + double r_pin, + double r_back, + double width, + double sd) +{ + return sla::pinhead_mesh_hit(suptree_ex_policy, m_sm.emesh, s, dir, r_pin, r_back, width, sd); +} + +AABBMesh::hit_result DefaultSupportTree::bridge_mesh_intersect( + const Vec3d &src, const Vec3d &dir, double r, double sd) +{ + return sla::beam_mesh_hit(suptree_ex_policy, m_sm.emesh, {src, dir, r}, sd); +} + +bool DefaultSupportTree::interconnect(const Pillar &pillar, + const Pillar &nextpillar) +{ + // We need to get the starting point of the zig-zag pattern. We have to + // be aware that the two head junctions are at different heights. We + // may start from the lowest junction and call it a day but this + // strategy would leave unconnected a lot of pillar duos where the + // shorter pillar is too short to start a new bridge but the taller + // pillar could still be bridged with the shorter one. + bool was_connected = false; + + Vec3d supper = pillar.startpoint(); + Vec3d slower = nextpillar.startpoint(); + Vec3d eupper = pillar.endpoint(); + Vec3d elower = nextpillar.endpoint(); + + double zmin = ground_level(m_sm) + m_sm.cfg.base_height_mm; + eupper.z() = std::max(eupper.z(), zmin); + elower.z() = std::max(elower.z(), zmin); + + // The usable length of both pillars should be positive + if(slower.z() - elower.z() < 0) return false; + if(supper.z() - eupper.z() < 0) return false; + + double pillar_dist = distance(Vec2d{slower.x(), slower.y()}, + Vec2d{supper.x(), supper.y()}); + double bridge_distance = pillar_dist / std::cos(-m_sm.cfg.bridge_slope); + double zstep = pillar_dist * std::tan(-m_sm.cfg.bridge_slope); + + if(pillar_dist < 2 * m_sm.cfg.head_back_radius_mm || + pillar_dist > m_sm.cfg.max_pillar_link_distance_mm) return false; + + if(supper.z() < slower.z()) supper.swap(slower); + if(eupper.z() < elower.z()) eupper.swap(elower); + + double startz = 0, endz = 0; + + startz = slower.z() - zstep < supper.z() ? slower.z() - zstep : slower.z(); + endz = eupper.z() + zstep > elower.z() ? eupper.z() + zstep : eupper.z(); + + if(slower.z() - eupper.z() < std::abs(zstep)) { + // no space for even one cross + + // Get max available space + startz = std::min(supper.z(), slower.z() - zstep); + endz = std::max(eupper.z() + zstep, elower.z()); + + // Align to center + double available_dist = (startz - endz); + double rounds = std::floor(available_dist / std::abs(zstep)); + startz -= 0.5 * (available_dist - rounds * std::abs(zstep)); + } + + auto pcm = m_sm.cfg.pillar_connection_mode; + bool docrosses = + pcm == PillarConnectionMode::cross || + (pcm == PillarConnectionMode::dynamic && + pillar_dist > 2*m_sm.cfg.base_radius_mm); + + // 'sj' means starting junction, 'ej' is the end junction of a bridge. + // They will be swapped in every iteration thus the zig-zag pattern. + // According to a config parameter, a second bridge may be added which + // results in a cross connection between the pillars. + Vec3d sj = supper, ej = slower; sj.z() = startz; ej.z() = sj.z() + zstep; + + // TODO: This is a workaround to not have a faulty last bridge + while(ej.z() >= eupper.z() /*endz*/) { + if(bridge_mesh_distance(sj, dirv(sj, ej), pillar.r_start) >= bridge_distance) + { + m_builder.add_crossbridge(sj, ej, pillar.r_start); + was_connected = true; + } + + // double bridging: (crosses) + if(docrosses) { + Vec3d sjback(ej.x(), ej.y(), sj.z()); + Vec3d ejback(sj.x(), sj.y(), ej.z()); + if (sjback.z() <= slower.z() && ejback.z() >= eupper.z() && + bridge_mesh_distance(sjback, dirv(sjback, ejback), + pillar.r_start) >= bridge_distance) { + // need to check collision for the cross stick + m_builder.add_crossbridge(sjback, ejback, pillar.r_start); + was_connected = true; + } + } + + sj.swap(ej); + ej.z() = sj.z() + zstep; + } + + return was_connected; +} + +bool DefaultSupportTree::connect_to_nearpillar(const Head &head, + long nearpillar_id) +{ + auto nearpillar = [this, nearpillar_id]() -> const Pillar& { + return m_builder.pillar(nearpillar_id); + }; + + if (m_builder.bridgecount(nearpillar()) > m_sm.cfg.max_bridges_on_pillar) + return false; + + Vec3d headjp = head.junction_point(); + Vec3d nearjp_u = nearpillar().startpoint(); + Vec3d nearjp_l = nearpillar().endpoint(); + + double r = head.r_back_mm; + double d2d = distance(to_2d(headjp), to_2d(nearjp_u)); + double d3d = distance(headjp, nearjp_u); + + double hdiff = nearjp_u.z() - headjp.z(); + double slope = std::atan2(hdiff, d2d); + + Vec3d bridgestart = headjp; + Vec3d bridgeend = nearjp_u; + double max_len = r * m_sm.cfg.max_bridge_length_mm / m_sm.cfg.head_back_radius_mm; + double max_slope = m_sm.cfg.bridge_slope; + double zdiff = 0.0; + + // check the default situation if feasible for a bridge + if(d3d > max_len || slope > -max_slope) { + // not feasible to connect the two head junctions. We have to search + // for a suitable touch point. + + double Zdown = headjp.z() + d2d * std::tan(-max_slope); + Vec3d touchjp = bridgeend; touchjp.z() = Zdown; + double D = distance(headjp, touchjp); + zdiff = Zdown - nearjp_u.z(); + + if(zdiff > 0) { + Zdown -= zdiff; + bridgestart.z() -= zdiff; + touchjp.z() = Zdown; + + double t = bridge_mesh_distance(headjp, DOWN, r); + + // We can't insert a pillar under the source head to connect + // with the nearby pillar's starting junction + if(t < zdiff) return false; + } + + if(Zdown <= nearjp_u.z() && Zdown >= nearjp_l.z() && D < max_len) + bridgeend.z() = Zdown; + else + return false; + } + + // There will be a minimum distance from the ground where the + // bridge is allowed to connect. This is an empiric value. + double minz = ground_level(m_sm) + 4 * head.r_back_mm; + if(bridgeend.z() < minz) return false; + + double t = bridge_mesh_distance(bridgestart, dirv(bridgestart, bridgeend), r); + + // Cannot insert the bridge. (further search might not worth the hassle) + if(t < distance(bridgestart, bridgeend)) return false; + + std::lock_guard lk(m_bridge_mutex); + + if (m_builder.bridgecount(nearpillar()) < m_sm.cfg.max_bridges_on_pillar) { + // A partial pillar is needed under the starting head. + if(zdiff > 0) { + m_builder.add_pillar(head.id, headjp.z() - bridgestart.z()); + m_builder.add_junction(bridgestart, r); + m_builder.add_bridge(bridgestart, bridgeend, r); + } else { + m_builder.add_bridge(head.id, bridgeend); + } + + m_builder.increment_bridges(nearpillar()); + } else return false; + + return true; +} + +bool DefaultSupportTree::create_ground_pillar(const Junction &hjp, + const Vec3d &sourcedir, + long head_id) +{ + auto [ret, pillar_id] = sla::create_ground_pillar(suptree_ex_policy, + m_builder, + m_sm, + hjp.pos, + sourcedir, + hjp.r, + hjp.r, + head_id); + + if (pillar_id >= 0) // Save the pillar endpoint in the spatial index + m_pillar_index.guarded_insert(m_builder.pillar(pillar_id).endpt, + unsigned(pillar_id)); + + return ret; +} + +void DefaultSupportTree::add_pinheads() +{ + // The minimum distance for two support points to remain valid. + const double /*constexpr*/ D_SP = 0.1; + + // Get the points that are too close to each other and keep only the + // first one + auto aliases = cluster(m_points, D_SP, 2); + + PtIndices filtered_indices; + filtered_indices.reserve(aliases.size()); + m_iheads.reserve(aliases.size()); + for(auto& a : aliases) { + // Here we keep only the front point of the cluster. + filtered_indices.emplace_back(a.front()); + } + + // calculate the normals to the triangles for filtered points + auto nmls = normals(suptree_ex_policy, m_points, m_sm.emesh, + m_sm.cfg.head_front_radius_mm, m_thr, + filtered_indices); + + // Not all of the support points have to be a valid position for + // support creation. The angle may be inappropriate or there may + // not be enough space for the pinhead. Filtering is applied for + // these reasons. + + auto heads = reserve_vector(m_sm.pts.size()); + for (const SupportPoint &sp : m_sm.pts) { + m_thr(); + heads.emplace_back( + NaNd, + sp.head_front_radius, + 0., + m_sm.cfg.head_penetration_mm, + Vec3d::Zero(), // dir + sp.pos.cast() // displacement + ); + } + + std::function filterfn; + filterfn = [this, &nmls, &heads, &filterfn](unsigned fidx, size_t i, double back_r) { + m_thr(); + + Vec3d n = nmls.row(Eigen::Index(i)); + + // for all normals we generate the spherical coordinates and + // saturate the polar angle to 45 degrees from the bottom then + // convert back to standard coordinates to get the new normal. + // Then we just create a quaternion from the two normals + // (Quaternion::FromTwoVectors) and apply the rotation to the + // arrow head. + + auto [polar, azimuth] = dir_to_spheric(n); + + // skip if the tilt is not sane + if (polar < PI - m_sm.cfg.normal_cutoff_angle) return; + + // We saturate the polar angle to 3pi/4 + polar = std::max(polar, PI - m_sm.cfg.bridge_slope); + + // save the head (pinpoint) position + Vec3d hp = m_points.row(fidx); + + double lmin = m_sm.cfg.head_width_mm, lmax = lmin; + + if (back_r < m_sm.cfg.head_back_radius_mm) { + lmin = 0., lmax = m_sm.cfg.head_penetration_mm; + } + + // The distance needed for a pinhead to not collide with model. + double w = lmin + 2 * back_r + 2 * m_sm.cfg.head_front_radius_mm - + m_sm.cfg.head_penetration_mm; + + double pin_r = double(m_sm.pts[fidx].head_front_radius); + + // Reassemble the now corrected normal + auto nn = spheric_to_dir(polar, azimuth).normalized(); + + // check available distance + AABBMesh::hit_result t = pinhead_mesh_intersect(hp, nn, pin_r, back_r, w); + + if (t.distance() < w) { + // Let's try to optimize this angle, there might be a + // viable normal that doesn't collide with the model + // geometry and its very close to the default. + + Optimizer solver(get_criteria(m_sm.cfg)); + solver.seed(0); // we want deterministic behavior + + auto oresult = solver.to_max().optimize( + [this, pin_r, back_r, hp](const opt::Input<3> &input) + { + auto &[plr, azm, l] = input; + + auto dir = spheric_to_dir(plr, azm).normalized(); + + return pinhead_mesh_intersect( + hp, dir, pin_r, back_r, l).distance(); + }, + initvals({polar, azimuth, (lmin + lmax) / 2.}), // start with what we have + bounds({ + {PI - m_sm.cfg.bridge_slope, PI}, // Must not exceed the slope limit + {-PI, PI}, // azimuth can be a full search + {lmin, lmax} + })); + + if(oresult.score > w) { + polar = std::get<0>(oresult.optimum); + azimuth = std::get<1>(oresult.optimum); + nn = spheric_to_dir(polar, azimuth).normalized(); + lmin = std::get<2>(oresult.optimum); + t = AABBMesh::hit_result(oresult.score); + } + } + + if (t.distance() > w && hp.z() + w * nn.z() >= ground_level(m_sm)) { + Head &h = heads[fidx]; + h.id = fidx; + h.dir = nn; + h.width_mm = lmin; + h.r_back_mm = back_r; + } else if (back_r > m_sm.cfg.head_fallback_radius_mm) { + filterfn(fidx, i, m_sm.cfg.head_fallback_radius_mm); + } + }; + + execution::for_each( + suptree_ex_policy, size_t(0), filtered_indices.size(), + [this, &filterfn, &filtered_indices](size_t i) { + filterfn(filtered_indices[i], i, m_sm.cfg.head_back_radius_mm); + }, + execution::max_concurrency(suptree_ex_policy)); + + for (size_t i = 0; i < heads.size(); ++i) + if (heads[i].is_valid()) { + m_builder.add_head(i, heads[i]); + m_iheads.emplace_back(i); + } + + m_thr(); +} + +void DefaultSupportTree::classify() +{ + // We should first get the heads that reach the ground directly + PtIndices ground_head_indices; + ground_head_indices.reserve(m_iheads.size()); + m_iheads_onmodel.reserve(m_iheads.size()); + + // First we decide which heads reach the ground and can be full + // pillars and which shall be connected to the model surface (or + // search a suitable path around the surface that leads to the + // ground -- TODO) + for(unsigned i : m_iheads) { + m_thr(); + + Head &head = m_builder.head(i); + double r = head.r_back_mm; + Vec3d headjp = head.junction_point(); + + // collision check + auto hit = bridge_mesh_intersect(headjp, DOWN, r); + + if(std::isinf(hit.distance())) ground_head_indices.emplace_back(i); + else if(m_sm.cfg.ground_facing_only) head.invalidate(); + else m_iheads_onmodel.emplace_back(i); + + m_head_to_ground_scans[i] = hit; + } + + // We want to search for clusters of points that are far enough + // from each other in the XY plane to not cross their pillar bases + // These clusters of support points will join in one pillar, + // possibly in their centroid support point. + + auto pointfn = [this](unsigned i) { + return m_builder.head(i).junction_point(); + }; + + auto predicate = [this](const PointIndexEl &e1, + const PointIndexEl &e2) { + double d2d = distance(to_2d(e1.first), to_2d(e2.first)); + double d3d = distance(e1.first, e2.first); + return d2d < 2 * m_sm.cfg.base_radius_mm + && d3d < m_sm.cfg.max_bridge_length_mm; + }; + + m_pillar_clusters = cluster(ground_head_indices, pointfn, predicate, + m_sm.cfg.max_bridges_on_pillar); +} + +void DefaultSupportTree::routing_to_ground() +{ + ClusterEl cl_centroids; + cl_centroids.reserve(m_pillar_clusters.size()); + + for (auto &cl : m_pillar_clusters) { + m_thr(); + + // place all the centroid head positions into the index. We + // will query for alternative pillar positions. If a sidehead + // cannot connect to the cluster centroid, we have to search + // for another head with a full pillar. Also when there are two + // elements in the cluster, the centroid is arbitrary and the + // sidehead is allowed to connect to a nearby pillar to + // increase structural stability. + + if (cl.empty()) continue; + + // get the current cluster centroid + auto & thr = m_thr; + const auto &points = m_points; + + long lcid = cluster_centroid( + cl, [&points](size_t idx) { return points.row(long(idx)); }, + [thr](const Vec3d &p1, const Vec3d &p2) { + thr(); + return distance(Vec2d(p1.x(), p1.y()), Vec2d(p2.x(), p2.y())); + }); + + assert(lcid >= 0); + unsigned hid = cl[size_t(lcid)]; // Head ID + + cl_centroids.emplace_back(hid); + + Head &h = m_builder.head(hid); + + if (!create_ground_pillar(h.junction(), h.dir, h.id)) { + BOOST_LOG_TRIVIAL(warning) + << "Pillar cannot be created for support point id: " << hid; + m_iheads_onmodel.emplace_back(h.id); + continue; + } + } + + // now we will go through the clusters ones again and connect the + // sidepoints with the cluster centroid (which is a ground pillar) + // or a nearby pillar if the centroid is unreachable. + size_t ci = 0; + for (const std::vector &cl : m_pillar_clusters) { + m_thr(); + + auto cidx = cl_centroids[ci++]; + + auto q = m_pillar_index.query(m_builder.head(cidx).junction_point(), 1); + if (!q.empty()) { + long centerpillarID = q.front().second; + for (auto c : cl) { + m_thr(); + if (c == cidx) continue; + + auto &sidehead = m_builder.head(c); + + if (!connect_to_nearpillar(sidehead, centerpillarID) && + !search_pillar_and_connect(sidehead)) { + // Vec3d pend = Vec3d{pstart.x(), pstart.y(), gndlvl}; + // Could not find a pillar, create one + create_ground_pillar(sidehead.junction(), sidehead.dir, sidehead.id); + } + } + } + } +} + +bool DefaultSupportTree::connect_to_ground(Head &head) +{ + auto [ret, pillar_id] = sla::search_ground_route(suptree_ex_policy, + m_builder, m_sm, + {head.junction_point(), + head.r_back_mm}, + head.r_back_mm, + head.dir); + + if (pillar_id >= 0) { + // Save the pillar endpoint in the spatial index + m_pillar_index.guarded_insert(m_builder.pillar(pillar_id).endpt, + unsigned(pillar_id)); + + head.pillar_id = pillar_id; + } + + return ret; +} + +bool DefaultSupportTree::connect_to_model_body(Head &head) +{ + if (head.id <= SupportTreeNode::ID_UNSET) return false; + + auto it = m_head_to_ground_scans.find(unsigned(head.id)); + if (it == m_head_to_ground_scans.end()) return false; + + auto &hit = it->second; + + if (!hit.is_hit()) { + // TODO scan for potential anchor points on model surface + return false; + } + + Vec3d hjp = head.junction_point(); + double zangle = std::asin(hit.direction().z()); + zangle = std::max(zangle, PI/4); + double h = std::sin(zangle) * head.fullwidth(); + + // The width of the tail head that we would like to have... + h = std::min(hit.distance() - head.r_back_mm, h); + + // If this is a mini pillar dont bother with the tail width, can be 0. + if (head.r_back_mm < m_sm.cfg.head_back_radius_mm) h = std::max(h, 0.); + else if (h <= 0.) return false; + + Vec3d endp{hjp.x(), hjp.y(), hjp.z() - hit.distance() + h}; + auto center_hit = m_sm.emesh.query_ray_hit(hjp, DOWN); + + double hitdiff = center_hit.distance() - hit.distance(); + Vec3d hitp = std::abs(hitdiff) < 2*head.r_back_mm? + center_hit.position() : hit.position(); + + long pillar_id = m_builder.add_pillar(head.id, hjp.z() - endp.z()); + Pillar &pill = m_builder.pillar(pillar_id); + + Vec3d taildir = endp - hitp; + double dist = (hitp - endp).norm() + m_sm.cfg.head_penetration_mm; + double w = dist - 2 * head.r_pin_mm - head.r_back_mm; + + if (w < 0.) { + BOOST_LOG_TRIVIAL(warning) << "Pinhead width is negative!"; + w = 0.; + } + + m_builder.add_anchor(head.r_back_mm, head.r_pin_mm, w, + m_sm.cfg.head_penetration_mm, taildir, hitp); + + m_pillar_index.guarded_insert(pill.endpoint(), pill.id); + + return true; +} + +bool DefaultSupportTree::search_pillar_and_connect(const Head &source) +{ + // Hope that a local copy takes less time than the whole search loop. + // We also need to remove elements progressively from the copied index. + PointIndex spindex = m_pillar_index.guarded_clone(); + + long nearest_id = SupportTreeNode::ID_UNSET; + + Vec3d querypt = source.junction_point(); + + while(nearest_id < 0 && !spindex.empty()) { m_thr(); + // loop until a suitable head is not found + // if there is a pillar closer than the cluster center + // (this may happen as the clustering is not perfect) + // than we will bridge to this closer pillar + + Vec3d qp(querypt.x(), querypt.y(), ground_level(m_sm)); + auto qres = spindex.nearest(qp, 1); + if(qres.empty()) break; + + auto ne = qres.front(); + nearest_id = ne.second; + + if(nearest_id >= 0) { + if (size_t(nearest_id) < m_builder.pillarcount()) { + if(!connect_to_nearpillar(source, nearest_id) || + m_builder.pillar(nearest_id).r_start < source.r_back_mm) { + nearest_id = SupportTreeNode::ID_UNSET; // continue searching + spindex.remove(ne); // without the current pillar + } + } + } + } + + return nearest_id >= 0; +} + +void DefaultSupportTree::routing_to_model() +{ + // We need to check if there is an easy way out to the bed surface. + // If it can be routed there with a bridge shorter than + // min_bridge_distance. + + execution::for_each( + suptree_ex_policy, m_iheads_onmodel.begin(), m_iheads_onmodel.end(), + [this](const unsigned idx) { + m_thr(); + + auto &head = m_builder.head(idx); + + // Search nearby pillar + if (search_pillar_and_connect(head)) { return; } + + // Cannot connect to nearby pillar. We will try to search for + // a route to the ground. + if (connect_to_ground(head)) { return; } + + // No route to the ground, so connect to the model body as a last resort + if (connect_to_model_body(head)) { return; } + + // We have failed to route this head. + BOOST_LOG_TRIVIAL(warning) + << "Failed to route model facing support point. ID: " << idx; + + head.invalidate(); + }, + execution::max_concurrency(suptree_ex_policy)); +} + +void DefaultSupportTree::interconnect_pillars() +{ + // Now comes the algorithm that connects pillars with each other. + // Ideally every pillar should be connected with at least one of its + // neighbors if that neighbor is within max_pillar_link_distance + + // Pillars with height exceeding H1 will require at least one neighbor + // to connect with. Height exceeding H2 require two neighbors. + double H1 = m_sm.cfg.max_solo_pillar_height_mm; + double H2 = m_sm.cfg.max_dual_pillar_height_mm; + double d = m_sm.cfg.max_pillar_link_distance_mm; + + // A connection between two pillars only counts if the height ratio is + // bigger than 50% + double min_height_ratio = 0.5; + + std::set pairs; + + // A function to connect one pillar with its neighbors. THe number of + // neighbors is given in the configuration. This function if called + // for every pillar in the pillar index. A pair of pillar will not + // be connected multiple times this is ensured by the 'pairs' set which + // remembers the processed pillar pairs + auto cascadefn = + [this, d, &pairs, min_height_ratio, H1] (const PointIndexEl& el) + { + Vec3d qp = el.first; // endpoint of the pillar + + const Pillar& pillar = m_builder.pillar(el.second); // actual pillar + + // Get the max number of neighbors a pillar should connect to + unsigned neighbors = m_sm.cfg.pillar_cascade_neighbors; + + // connections are already enough for the pillar + if(pillar.links >= neighbors) return; + + double max_d = d * pillar.r_start / m_sm.cfg.head_back_radius_mm; + // Query all remaining points within reach + auto qres = m_pillar_index.query([qp, max_d](const PointIndexEl& e){ + return distance(e.first, qp) < max_d; + }); + + // sort the result by distance (have to check if this is needed) + std::sort(qres.begin(), qres.end(), + [qp](const PointIndexEl& e1, const PointIndexEl& e2){ + return distance(e1.first, qp) < distance(e2.first, qp); + }); + + for(auto& re : qres) { // process the queried neighbors + + if(re.second == el.second) continue; // Skip self + + auto a = el.second, b = re.second; + + // Get unique hash for the given pair (order doesn't matter) + auto hashval = pairhash(a, b); + + // Search for the pair amongst the remembered pairs + if(pairs.find(hashval) != pairs.end()) continue; + + const Pillar& neighborpillar = m_builder.pillar(re.second); + + // this neighbor is occupied, skip + if (neighborpillar.links >= neighbors) continue; + if (neighborpillar.r_start < pillar.r_start) continue; + + if(interconnect(pillar, neighborpillar)) { + pairs.insert(hashval); + + // If the interconnection length between the two pillars is + // less than 50% of the longer pillar's height, don't count + if(pillar.height < H1 || + neighborpillar.height / pillar.height > min_height_ratio) + m_builder.increment_links(pillar); + + if(neighborpillar.height < H1 || + pillar.height / neighborpillar.height > min_height_ratio) + m_builder.increment_links(neighborpillar); + + } + + // connections are enough for one pillar + if(pillar.links >= neighbors) break; + } + }; + + // Run the cascade for the pillars in the index + m_pillar_index.foreach(cascadefn); + + // We would be done here if we could allow some pillars to not be + // connected with any neighbors. But this might leave the support tree + // unprintable. + // + // The current solution is to insert additional pillars next to these + // lonely pillars. One or even two additional pillar might get inserted + // depending on the length of the lonely pillar. + + size_t pillarcount = m_builder.pillarcount(); + + // Again, go through all pillars, this time in the whole support tree + // not just the index. + for(size_t pid = 0; pid < pillarcount; pid++) { + auto pillar = [this, pid]() { return m_builder.pillar(pid); }; + + // Decide how many additional pillars will be needed: + + unsigned needpillars = 0; + if (pillar().bridges > m_sm.cfg.max_bridges_on_pillar) + needpillars = 3; + else if (pillar().links < 2 && pillar().height > H2) { + // Not enough neighbors to support this pillar + needpillars = 2; + } else if (pillar().links < 1 && pillar().height > H1) { + // No neighbors could be found and the pillar is too long. + needpillars = 1; + } + + needpillars = std::max(pillar().links, needpillars) - pillar().links; + if (needpillars == 0) continue; + + // Search for new pillar locations: + + bool found = false; + double alpha = 0; // goes to 2Pi + double r = 2 * m_sm.cfg.base_radius_mm; + Vec3d pillarsp = pillar().startpoint(); + + // temp value for starting point detection + Vec3d sp(pillarsp.x(), pillarsp.y(), pillarsp.z() - r); + + // A vector of bool for placement feasbility + std::vector canplace(needpillars, false); + std::vector spts(needpillars); // vector of starting points + + double gnd = ground_level(m_sm); + double min_dist = m_sm.cfg.pillar_base_safety_distance_mm + + m_sm.cfg.base_radius_mm + EPSILON; + + while(!found && alpha < 2*PI) { + for (unsigned n = 0; + n < needpillars && (!n || canplace[n - 1]); + n++) + { + double a = alpha + n * PI / 3; + Vec3d s = sp; + s.x() += std::cos(a) * r; + s.y() += std::sin(a) * r; + spts[n] = s; + + // Check the path vertically down + Vec3d check_from = s + Vec3d{0., 0., pillar().r_start}; + auto hr = bridge_mesh_intersect(check_from, DOWN, pillar().r_start); + Vec3d gndsp{s.x(), s.y(), gnd}; + + // If the path is clear, check for pillar base collisions + canplace[n] = std::isinf(hr.distance()) && + std::sqrt(m_sm.emesh.squared_distance(gndsp)) > + min_dist; + } + + found = std::all_of(canplace.begin(), canplace.end(), + [](bool v) { return v; }); + + // 20 angles will be tried... + alpha += 0.1 * PI; + } + + std::vector newpills; + newpills.reserve(needpillars); + + if (found) + for (unsigned n = 0; n < needpillars; n++) { + Vec3d s = spts[n]; + Pillar p(Vec3d{s.x(), s.y(), gnd}, s.z() - gnd, pillar().r_start); + + if (interconnect(pillar(), p)) { + Pillar &pp = m_builder.pillar(m_builder.add_pillar(p)); + + add_pillar_base(pp.id); + + m_pillar_index.insert(pp.endpoint(), unsigned(pp.id)); + + m_builder.add_junction(s, pillar().r_start); + double t = bridge_mesh_distance(pillarsp, dirv(pillarsp, s), + pillar().r_start); + if (distance(pillarsp, s) < t) + m_builder.add_bridge(pillarsp, s, pillar().r_start); + + if (pillar().endpoint().z() > ground_level(m_sm) + pillar().r_start) + m_builder.add_junction(pillar().endpoint(), pillar().r_start); + + newpills.emplace_back(pp.id); + m_builder.increment_links(pillar()); + m_builder.increment_links(pp); + } + } + + if(!newpills.empty()) { + for(auto it = newpills.begin(), nx = std::next(it); + nx != newpills.end(); ++it, ++nx) { + const Pillar& itpll = m_builder.pillar(*it); + const Pillar& nxpll = m_builder.pillar(*nx); + if(interconnect(itpll, nxpll)) { + m_builder.increment_links(itpll); + m_builder.increment_links(nxpll); + } + } + + m_pillar_index.foreach(cascadefn); + } + } +} + +}} // namespace Slic3r::sla diff --git a/src/libslic3r/SLA/SupportTreeBuildsteps.hpp b/src/libslic3r/SLA/DefaultSupportTree.hpp similarity index 53% rename from src/libslic3r/SLA/SupportTreeBuildsteps.hpp rename to src/libslic3r/SLA/DefaultSupportTree.hpp index 478e2df1fea..08990a8df97 100644 --- a/src/libslic3r/SLA/SupportTreeBuildsteps.hpp +++ b/src/libslic3r/SLA/DefaultSupportTree.hpp @@ -1,124 +1,18 @@ -#ifndef SLASUPPORTTREEALGORITHM_H -#define SLASUPPORTTREEALGORITHM_H +#ifndef LEGACYSUPPORTTREE_HPP +#define LEGACYSUPPORTTREE_HPP -#include -#include +#include "SupportTreeUtilsLegacy.hpp" -#include -#include #include +#include -namespace Slic3r { -namespace sla { +namespace Slic3r { namespace sla { -// The minimum distance for two support points to remain valid. -const double /*constexpr*/ D_SP = 0.1; - -enum { // For indexing Eigen vectors as v(X), v(Y), v(Z) instead of numbers - X, Y, Z -}; - -inline Vec2d to_vec2(const Vec3d &v3) { return {v3(X), v3(Y)}; } - -inline std::pair dir_to_spheric(const Vec3d &n, double norm = 1.) -{ - double z = n.z(); - double r = norm; - double polar = std::acos(z / r); - double azimuth = std::atan2(n(1), n(0)); - return {polar, azimuth}; -} - -inline Vec3d spheric_to_dir(double polar, double azimuth) -{ - return {std::cos(azimuth) * std::sin(polar), - std::sin(azimuth) * std::sin(polar), std::cos(polar)}; -} - -inline Vec3d spheric_to_dir(const std::tuple &v) -{ - auto [plr, azm] = v; - return spheric_to_dir(plr, azm); -} - -inline Vec3d spheric_to_dir(const std::pair &v) -{ - return spheric_to_dir(v.first, v.second); -} - -inline Vec3d spheric_to_dir(const std::array &v) -{ - return spheric_to_dir(v[0], v[1]); -} - -// Give points on a 3D ring with given center, radius and orientation -// method based on: -// https://math.stackexchange.com/questions/73237/parametric-equation-of-a-circle-in-3d-space -template -class PointRing { - std::array m_phis; - - // Two vectors that will be perpendicular to each other and to the - // axis. Values for a(X) and a(Y) are now arbitrary, a(Z) is just a - // placeholder. - // a and b vectors are perpendicular to the ring direction and to each other. - // Together they define the plane where we have to iterate with the - // given angles in the 'm_phis' vector - Vec3d a = {0, 1, 0}, b; - double m_radius = 0.; - - static inline bool constexpr is_one(double val) - { - return std::abs(std::abs(val) - 1) < 1e-20; - } - -public: - - PointRing(const Vec3d &n) - { - m_phis = linspace_array(0., 2 * PI); - - // We have to address the case when the direction vector v (same as - // dir) is coincident with one of the world axes. In this case two of - // its components will be completely zero and one is 1.0. Our method - // becomes dangerous here due to division with zero. Instead, vector - // 'a' can be an element-wise rotated version of 'v' - if(is_one(n(X)) || is_one(n(Y)) || is_one(n(Z))) { - a = {n(Z), n(X), n(Y)}; - b = {n(Y), n(Z), n(X)}; - } - else { - a(Z) = -(n(Y)*a(Y)) / n(Z); a.normalize(); - b = a.cross(n); - } - } - - Vec3d get(size_t idx, const Vec3d src, double r) const - { - double phi = m_phis[idx]; - double sinphi = std::sin(phi); - double cosphi = std::cos(phi); - - double rpscos = r * cosphi; - double rpssin = r * sinphi; - - // Point on the sphere - return {src(X) + rpscos * a(X) + rpssin * b(X), - src(Y) + rpscos * a(Y) + rpssin * b(Y), - src(Z) + rpscos * a(Z) + rpssin * b(Z)}; - } -}; - -//IndexedMesh::hit_result query_hit(const SupportableMesh &msh, const Bridge &br, double safety_d = std::nan("")); -//IndexedMesh::hit_result query_hit(const SupportableMesh &msh, const Head &br, double safety_d = std::nan("")); - -inline Vec3d dirv(const Vec3d& startp, const Vec3d& endp) { - return (endp - startp).normalized(); -} +inline constexpr const auto &suptree_ex_policy = ex_tbb; class PillarIndex { PointIndex m_index; - using Mutex = ccr::BlockingMutex; + using Mutex = execution::BlockingMutex; mutable Mutex m_mutex; public: @@ -161,45 +55,18 @@ class PillarIndex { } }; -// Helper function for pillar interconnection where pairs of already connected -// pillars should be checked for not to be processed again. This can be done -// in constant time with a set of hash values uniquely representing a pair of -// integers. The order of numbers within the pair should not matter, it has -// the same unique hash. The hash value has to have twice as many bits as the -// arguments need. If the same integral type is used for args and return val, -// make sure the arguments use only the half of the type's bit depth. -template> -IntegerOnly pairhash(I a, I b) -{ - using std::ceil; using std::log2; using std::max; using std::min; - static const auto constexpr Ibits = int(sizeof(I) * CHAR_BIT); - static const auto constexpr DoubleIbits = int(sizeof(DoubleI) * CHAR_BIT); - static const auto constexpr shift = DoubleIbits / 2 < Ibits ? Ibits / 2 : Ibits; - - I g = min(a, b), l = max(a, b); - - // Assume the hash will fit into the output variable - assert((g ? (ceil(log2(g))) : 0) <= shift); - assert((l ? (ceil(log2(l))) : 0) <= shift); - - return (DoubleI(g) << shift) + l; -} - -class SupportTreeBuildsteps { - const SupportTreeConfig& m_cfg; - const IndexedMesh& m_mesh; - const std::vector& m_support_pts; +class DefaultSupportTree { + const SupportableMesh &m_sm; using PtIndices = std::vector; PtIndices m_iheads; // support points with pinhead PtIndices m_iheads_onmodel; - PtIndices m_iheadless; // headless support points - - std::map m_head_to_ground_scans; + + std::map m_head_to_ground_scans; // normals for support points from model faces. - PointSet m_support_nmls; + Eigen::MatrixXd m_support_nmls; // Clusters of points which can reach the ground directly and can be // bridged to one central pillar @@ -210,7 +77,7 @@ class SupportTreeBuildsteps { SupportTreeBuilder& m_builder; // support points in Eigen/IGL format - PointSet m_points; + Eigen::MatrixXd m_points; // throw if canceled: It will be called many times so a shorthand will // come in handy. @@ -220,12 +87,12 @@ class SupportTreeBuildsteps { PillarIndex m_pillar_index; // When bridging heads to pillars... TODO: find a cleaner solution - ccr::BlockingMutex m_bridge_mutex; + execution::BlockingMutex m_bridge_mutex; - inline IndexedMesh::hit_result ray_mesh_intersect(const Vec3d& s, + inline AABBMesh::hit_result ray_mesh_intersect(const Vec3d& s, const Vec3d& dir) { - return m_mesh.query_ray_hit(s, dir); + return m_sm.emesh.query_ray_hit(s, dir); } // This function will test if a future pinhead would not collide with the @@ -239,7 +106,7 @@ class SupportTreeBuildsteps { // point was inside the model, an "invalid" hit_result will be returned // with a zero distance value instead of a NAN. This way the result can // be used safely for comparison with other distances. - IndexedMesh::hit_result pinhead_mesh_intersect( + AABBMesh::hit_result pinhead_mesh_intersect( const Vec3d& s, const Vec3d& dir, double r_pin, @@ -247,16 +114,15 @@ class SupportTreeBuildsteps { double width, double safety_d); - IndexedMesh::hit_result pinhead_mesh_intersect( - const Vec3d& s, - const Vec3d& dir, - double r_pin, - double r_back, - double width) + AABBMesh::hit_result pinhead_mesh_intersect(const Vec3d &s, + const Vec3d &dir, + double r_pin, + double r_back, + double width) { return pinhead_mesh_intersect(s, dir, r_pin, r_back, width, - r_back * m_cfg.safety_distance_mm / - m_cfg.head_back_radius_mm); + r_back * m_sm.cfg.safety_distance_mm / + m_sm.cfg.head_back_radius_mm); } // Checking bridge (pillar and stick as well) intersection with the model. @@ -267,22 +133,22 @@ class SupportTreeBuildsteps { // point was inside the model, an "invalid" hit_result will be returned // with a zero distance value instead of a NAN. This way the result can // be used safely for comparison with other distances. - IndexedMesh::hit_result bridge_mesh_intersect( + AABBMesh::hit_result bridge_mesh_intersect( const Vec3d& s, const Vec3d& dir, double r, double safety_d); - IndexedMesh::hit_result bridge_mesh_intersect( + AABBMesh::hit_result bridge_mesh_intersect( const Vec3d& s, const Vec3d& dir, double r) { return bridge_mesh_intersect(s, dir, r, - r * m_cfg.safety_distance_mm / - m_cfg.head_back_radius_mm); + r * m_sm.cfg.safety_distance_mm / + m_sm.cfg.head_back_radius_mm); } - + template inline double bridge_mesh_distance(Args&&...args) { return bridge_mesh_intersect(std::forward(args)...).distance(); @@ -293,40 +159,41 @@ class SupportTreeBuildsteps { // For connecting a head to a nearby pillar. bool connect_to_nearpillar(const Head& head, long nearpillar_id); - + // Find route for a head to the ground. Inserts additional bridge from the // head to the pillar if cannot create pillar directly. // The optional dir parameter is the direction of the bridge which is the // direction of the pinhead if omitted. - bool connect_to_ground(Head& head, const Vec3d &dir); inline bool connect_to_ground(Head& head); - + bool connect_to_model_body(Head &head); bool search_pillar_and_connect(const Head& source); - + // This is a proxy function for pillar creation which will mind the gap // between the pad and the model bottom in zero elevation mode. // jp is the starting junction point which needs to be routed down. // sourcedir is the allowed direction of an optional bridge between the // jp junction and the final pillar. - bool create_ground_pillar(const Vec3d &jp, + bool create_ground_pillar(const Junction &jp, const Vec3d &sourcedir, - double radius, long head_id = SupportTreeNode::ID_UNSET); void add_pillar_base(long pid) { - m_builder.add_pillar_base(pid, m_cfg.base_height_mm, m_cfg.base_radius_mm); + m_builder.add_pillar_base(pid, m_sm.cfg.base_height_mm, m_sm.cfg.base_radius_mm); } std::optional search_widening_path(const Vec3d &jp, const Vec3d &dir, double radius, - double new_radius); + double new_radius) + { + return sla::search_widening_path(suptree_ex_policy, m_sm, jp, dir, radius, new_radius); + } public: - SupportTreeBuildsteps(SupportTreeBuilder & builder, const SupportableMesh &sm); + DefaultSupportTree(SupportTreeBuilder & builder, const SupportableMesh &sm); // Now let's define the individual steps of the support generation algorithm @@ -335,10 +202,6 @@ class SupportTreeBuildsteps { // pinhead is applicable and adjust its angle at each support point. We // will also merge the support points that are just too close and can // be considered as one. - void filter(); - - // Pinhead creation: based on the filtering results, the Head objects - // will be constructed (together with their triangle meshes). void add_pinheads(); // Further classification of the support points with pinheads. If the @@ -372,7 +235,11 @@ class SupportTreeBuildsteps { static bool execute(SupportTreeBuilder & builder, const SupportableMesh &sm); }; +inline void create_default_tree(SupportTreeBuilder &builder, const SupportableMesh &sm) +{ + DefaultSupportTree::execute(builder, sm); } -} -#endif // SLASUPPORTTREEALGORITHM_H +}} // namespace Slic3r::sla + +#endif // LEGACYSUPPORTTREE_HPP diff --git a/src/libslic3r/SLA/Hollowing.cpp b/src/libslic3r/SLA/Hollowing.cpp index 8cda341b56d..56cecdccd52 100644 --- a/src/libslic3r/SLA/Hollowing.cpp +++ b/src/libslic3r/SLA/Hollowing.cpp @@ -1,44 +1,44 @@ #include #include +#include +#include +#include #include #include #include #include -#include +#include +#include #include #include #include +#include +#include -#include +#include -#include +#include #include #include -//! macro used to mark string used at localization, -//! return same string -#define L(s) Slic3r::I18N::translate(s) - namespace Slic3r { namespace sla { struct Interior { indexed_triangle_set mesh; - openvdb::FloatGrid::Ptr gridptr; - mutable std::optional accessor; + VoxelGridPtr gridptr; double iso_surface = 0.; double thickness = 0.; - double voxel_scale = 1.; double full_narrowb = 2.; void reset_accessor() const // This resets the accessor and its cache // Not a thread safe call! { if (gridptr) - accessor = gridptr->getConstAccessor(); + Slic3r::reset_accessor(*gridptr); } }; @@ -57,119 +57,62 @@ const indexed_triangle_set &get_mesh(const Interior &interior) return interior.mesh; } -static InteriorPtr generate_interior_verbose(const TriangleMesh & mesh, - const JobController &ctl, - double min_thickness, - double voxel_scale, - double closing_dist) +const VoxelGrid &get_grid(const Interior &interior) { - double offset = voxel_scale * min_thickness; - double D = voxel_scale * closing_dist; - float in_range = 1.1f * float(offset + D); - auto narrowb = 1.; - float out_range = narrowb; + return *interior.gridptr; +} - if (ctl.stopcondition()) return {}; - else ctl.statuscb(0, L("Hollowing")); +VoxelGrid &get_grid(Interior &interior) +{ + return *interior.gridptr; +} - auto gridptr = mesh_to_grid(mesh.its, {}, voxel_scale, out_range, in_range); +InteriorPtr generate_interior(const VoxelGrid &vgrid, + const HollowingConfig &hc, + const JobController &ctl) +{ + double voxsc = get_voxel_scale(vgrid); + double offset = hc.min_thickness; // world units + double D = hc.closing_distance; // world units + float in_range = 1.1f * float(offset + D); // world units + float out_range = 1.f / voxsc; // world units + auto narrowb = 1.f; // voxel units (voxel count) - assert(gridptr); + if (ctl.stopcondition()) return {}; + else ctl.statuscb(0, _u8L("Hollowing")); - if (!gridptr) { - BOOST_LOG_TRIVIAL(error) << "Returned OpenVDB grid is NULL"; - return {}; - } + auto gridptr = dilate_grid(vgrid, out_range, in_range); if (ctl.stopcondition()) return {}; - else ctl.statuscb(30, L("Hollowing")); + else ctl.statuscb(30, _u8L("Hollowing")); double iso_surface = D; if (D > EPSILON) { - in_range = narrowb; - gridptr = redistance_grid(*gridptr, -(offset + D), narrowb, in_range); - - constexpr int DilateIterations = 1; + gridptr = redistance_grid(*gridptr, -(offset + D), narrowb, narrowb); - gridptr = openvdb::tools::dilateSdf( - *gridptr, std::ceil(iso_surface), - openvdb::tools::NN_FACE_EDGE_VERTEX, DilateIterations, - openvdb::tools::FastSweepingDomain::SWEEP_GREATER_THAN_ISOVALUE); + gridptr = dilate_grid(*gridptr, 1.1 * std::ceil(iso_surface), 0.f); out_range = iso_surface; + in_range = narrowb / voxsc; } else { iso_surface = -offset; } if (ctl.stopcondition()) return {}; - else ctl.statuscb(70, L("Hollowing")); + else ctl.statuscb(70, _u8L("Hollowing")); double adaptivity = 0.; InteriorPtr interior = InteriorPtr{new Interior{}}; interior->mesh = grid_to_mesh(*gridptr, iso_surface, adaptivity); - interior->gridptr = gridptr; + interior->gridptr = std::move(gridptr); if (ctl.stopcondition()) return {}; - else ctl.statuscb(100, L("Hollowing")); + else ctl.statuscb(100, _u8L("Hollowing")); interior->iso_surface = iso_surface; interior->thickness = offset; - interior->voxel_scale = voxel_scale; - interior->full_narrowb = out_range + in_range; - - return interior; -} - -InteriorPtr generate_interior(const TriangleMesh & mesh, - const HollowingConfig &hc, - const JobController & ctl) -{ - static constexpr double MIN_SAMPLES_IN_WALL = 3.5; - static constexpr double MAX_OVERSAMPL = 8.; - static constexpr double UNIT_VOLUME = 500000; // empiric - - // I can't figure out how to increase the grid resolution through openvdb - // API so the model will be scaled up before conversion and the result - // scaled down. Voxels have a unit size. If I set voxelSize smaller, it - // scales the whole geometry down, and doesn't increase the number of - // voxels. - // - // First an allowed range for voxel scale is determined from an initial - // range of . The final voxel scale is - // then chosen from this range using the 'quality:<0, 1>' parameter. - // The minimum can be lowered if the wall thickness is great enough and - // the maximum is lowered if the model volume very big. - double mesh_vol = its_volume(mesh.its); - double sc_divider = std::max(1.0, (mesh_vol / UNIT_VOLUME)); - double min_oversampl = std::max(MIN_SAMPLES_IN_WALL / hc.min_thickness, 1.); - double max_oversampl_scaled = std::max(min_oversampl, MAX_OVERSAMPL / sc_divider); - auto voxel_scale = min_oversampl + (max_oversampl_scaled - min_oversampl) * hc.quality; - - BOOST_LOG_TRIVIAL(debug) << "Hollowing: max oversampl will be: " << max_oversampl_scaled; - BOOST_LOG_TRIVIAL(debug) << "Hollowing: voxel scale will be: " << voxel_scale; - BOOST_LOG_TRIVIAL(debug) << "Hollowing: mesh volume is: " << mesh_vol; - - InteriorPtr interior = generate_interior_verbose(mesh, ctl, - hc.min_thickness, - voxel_scale, - hc.closing_distance); - - if (interior && !interior->mesh.empty()) { - - // flip normals back... - swap_normals(interior->mesh); - - // simplify mesh lossless - float loss_less_max_error = 2*std::numeric_limits::epsilon(); - its_quadric_edge_collapse(interior->mesh, 0U, &loss_less_max_error); - - its_compactify_vertices(interior->mesh); - its_merge_vertices(interior->mesh); - - // flip normals back... - swap_normals(interior->mesh); - } + interior->full_narrowb = (out_range + in_range) / 2.; return interior; } @@ -178,9 +121,9 @@ indexed_triangle_set DrainHole::to_mesh() const { auto r = double(radius); auto h = double(height); - indexed_triangle_set hole = sla::cylinder(r, h, steps); + indexed_triangle_set hole = its_make_cylinder(r, h); //sla::cylinder(r, h, steps); Eigen::Quaternionf q; - q.setFromTwoVectors(Vec3f{0.f, 0.f, 1.f}, normal); + q.setFromTwoVectors(Vec3f::UnitZ(), normal); for(auto& p : hole.vertices) p = q * p + pos; return hole; @@ -207,7 +150,6 @@ bool DrainHole::is_inside(const Vec3f& pt) const return false; } - // Given a line s+dir*t, find parameter t of intersections with the hole // and the normal (points inside the hole). Outputs through out reference, // returns true if two intersections were found. @@ -219,7 +161,7 @@ bool DrainHole::get_intersections(const Vec3f& s, const Vec3f& dir, const Eigen::ParametrizedLine ray(s, dir.normalized()); for (size_t i=0; i<2; ++i) - out[i] = std::make_pair(sla::IndexedMesh::hit_result::infty(), Vec3d::Zero()); + out[i] = std::make_pair(AABBMesh::hit_result::infty(), Vec3d::Zero()); const float sqr_radius = pow(radius, 2.f); @@ -330,7 +272,7 @@ void cut_drainholes(std::vector & obj_slices, void hollow_mesh(TriangleMesh &mesh, const HollowingConfig &cfg, int flags) { - InteriorPtr interior = generate_interior(mesh, cfg, JobController{}); + InteriorPtr interior = generate_interior(mesh.its, cfg, JobController{}); if (!interior) return; hollow_mesh(mesh, *interior, flags); @@ -343,7 +285,24 @@ void hollow_mesh(TriangleMesh &mesh, const Interior &interior, int flags) if (flags & hfRemoveInsideTriangles && interior.gridptr) remove_inside_triangles(mesh, interior); - mesh.merge(TriangleMesh{interior.mesh}); + indexed_triangle_set interi = interior.mesh; + sla::swap_normals(interi); + TriangleMesh inter{std::move(interi)}; + + mesh.merge(inter); +} + +void hollow_mesh(indexed_triangle_set &mesh, const Interior &interior, int flags) +{ + if (mesh.empty() || interior.mesh.empty()) return; + + if (flags & hfRemoveInsideTriangles && interior.gridptr) + remove_inside_triangles(mesh, interior); + + indexed_triangle_set interi = interior.mesh; + sla::swap_normals(interi); + + its_merge(mesh, interi); } // Get the distance of p to the interior's zero iso_surface. Interior should @@ -353,13 +312,7 @@ static double get_distance_raw(const Vec3f &p, const Interior &interior) { assert(interior.gridptr); - if (!interior.accessor) interior.reset_accessor(); - - auto v = (p * interior.voxel_scale).cast(); - auto grididx = interior.gridptr->transform().worldToIndexCellCentered( - {v.x(), v.y(), v.z()}); - - return interior.accessor->getValue(grididx) ; + return Slic3r::get_distance_raw(p, *interior.gridptr); } struct TriangleBubble { Vec3f center; double R; }; @@ -368,7 +321,7 @@ struct TriangleBubble { Vec3f center; double R; }; // triangle is too big to be measured. static double get_distance(const TriangleBubble &b, const Interior &interior) { - double R = b.R * interior.voxel_scale; + double R = b.R; double D = 2. * R; double Dst = get_distance_raw(b.center, interior); @@ -378,10 +331,16 @@ static double get_distance(const TriangleBubble &b, const Interior &interior) Dst - interior.iso_surface; } -double get_distance(const Vec3f &p, const Interior &interior) +inline double get_distance(const Vec3f &p, const Interior &interior) { double d = get_distance_raw(p, interior) - interior.iso_surface; - return d / interior.voxel_scale; + return d; +} + +template +FloatingOnly get_distance(const Vec<3, T> &p, const Interior &interior) +{ + return get_distance(Vec3f(p.template cast()), interior); } // A face that can be divided. Stores the indices into the original mesh if its @@ -433,14 +392,14 @@ void divide_triangle(const DivFace &face, Fn &&visitor) divide_triangle(child2, std::forward(visitor)); } -void remove_inside_triangles(TriangleMesh &mesh, const Interior &interior, +void remove_inside_triangles(indexed_triangle_set &mesh, const Interior &interior, const std::vector &exclude_mask) { enum TrPos { posInside, posTouch, posOutside }; - auto &faces = mesh.its.indices; - auto &vertices = mesh.its.vertices; - auto bb = mesh.bounding_box(); + auto &faces = mesh.indices; + auto &vertices = mesh.vertices; + auto bb = bounding_box(mesh); //mesh.bounding_box(); bool use_exclude_mask = faces.size() == exclude_mask.size(); auto is_excluded = [&exclude_mask, use_exclude_mask](size_t face_id) { @@ -448,7 +407,7 @@ void remove_inside_triangles(TriangleMesh &mesh, const Interior &interior, }; // TODO: Parallel mode not working yet - using exec_policy = ccr_seq; + constexpr auto &exec_policy = ex_seq; // Info about the needed modifications on the input mesh. struct MeshMods { @@ -456,7 +415,7 @@ void remove_inside_triangles(TriangleMesh &mesh, const Interior &interior, // Just a thread safe wrapper for a vector of triangles. struct { std::vector> data; - exec_policy::SpinningMutex mutex; + execution::SpinningMutex mutex; void emplace_back(const std::array &pts) { @@ -476,8 +435,8 @@ void remove_inside_triangles(TriangleMesh &mesh, const Interior &interior, // or not. std::vector to_remove; - MeshMods(const TriangleMesh &mesh): - to_remove(mesh.its.indices.size(), false) {} + MeshMods(const indexed_triangle_set &mesh): + to_remove(mesh.indices.size(), false) {} // Number of triangles that need to be removed. size_t to_remove_cnt() const @@ -499,7 +458,7 @@ void remove_inside_triangles(TriangleMesh &mesh, const Interior &interior, TriangleBubble bubble{facebb.center().cast(), facebb.radius()}; double D = get_distance(bubble, interior); - double R = bubble.R * interior.voxel_scale; + double R = bubble.R; if (std::isnan(D)) // The distance cannot be measured, triangle too big return true; @@ -533,27 +492,30 @@ void remove_inside_triangles(TriangleMesh &mesh, const Interior &interior, interior.reset_accessor(); - exec_policy::for_each(size_t(0), faces.size(), [&] (size_t face_idx) { - const Vec3i &face = faces[face_idx]; + execution::for_each( + exec_policy, size_t(0), faces.size(), + [&](size_t face_idx) { + const Vec3i &face = faces[face_idx]; - // If the triangle is excluded, we need to keep it. - if (is_excluded(face_idx)) - return; + // If the triangle is excluded, we need to keep it. + if (is_excluded(face_idx)) + return; - std::array pts = - { vertices[face(0)], vertices[face(1)], vertices[face(2)] }; + std::array pts = {vertices[face(0)], vertices[face(1)], + vertices[face(2)]}; - BoundingBoxf3 facebb { pts.begin(), pts.end() }; + BoundingBoxf3 facebb{pts.begin(), pts.end()}; - // Face is certainly outside the cavity - if (! facebb.intersects(bb)) return; + // Face is certainly outside the cavity + if (!facebb.intersects(bb)) + return; - DivFace df{face, pts, long(face_idx)}; + DivFace df{face, pts, long(face_idx)}; - if (divfn(df)) - divide_triangle(df, divfn); - - }, exec_policy::max_concurreny()); + if (divfn(df)) divide_triangle(df, divfn); + }, + execution::max_concurrency(exec_policy) + ); auto new_faces = reserve_vector(faces.size() + mesh_mods.new_triangles.size()); @@ -579,8 +541,356 @@ void remove_inside_triangles(TriangleMesh &mesh, const Interior &interior, faces.swap(new_faces); new_faces = {}; - mesh = TriangleMesh{mesh.its}; +// mesh = TriangleMesh{mesh.its}; //FIXME do we want to repair the mesh? Are there duplicate vertices or flipped triangles? } +void remove_inside_triangles(TriangleMesh &mesh, const Interior &interior, + const std::vector &exclude_mask) +{ + remove_inside_triangles(mesh.its, interior, exclude_mask); +} + +struct FaceHash { + + // A 64 bit number's max hex digits + static constexpr size_t MAX_NUM_CHARS = 16; + + // A hash is created for each triangle to be identifiable. The hash uses + // only the triangle's geometric traits, not the index in a particular mesh. + std::unordered_set facehash; + + // Returns the string in reverse, but that is ok for hashing + static std::array to_chars(int64_t val) + { + std::array ret; + + static const constexpr char * Conv = "0123456789abcdef"; + + auto ptr = ret.begin(); + auto uval = static_cast(std::abs(val)); + while (uval) { + *ptr = Conv[uval & 0xf]; + ++ptr; + uval = uval >> 4; + } + if (val < 0) { *ptr = '-'; ++ptr; } + *ptr = '\0'; // C style string ending + + return ret; + } + + static std::string hash(const Vec<3, int64_t> &v) + { + std::string ret; + ret.reserve(3 * MAX_NUM_CHARS); + + for (auto val : v) + ret += to_chars(val).data(); + + return ret; + } + + static std::string facekey(const Vec3i &face, const std::vector &vertices) + { + // Scale to integer to avoid floating points + std::array, 3> pts = { + scaled(vertices[face(0)]), + scaled(vertices[face(1)]), + scaled(vertices[face(2)]) + }; + + // Get the first two sides of the triangle, do a cross product and move + // that vector to the center of the triangle. This encodes all + // information to identify an identical triangle at the same position. + Vec<3, int64_t> a = pts[0] - pts[2], b = pts[1] - pts[2]; + Vec<3, int64_t> c = a.cross(b) + (pts[0] + pts[1] + pts[2]) / 3; + + // Return a concatenated string representation of the coordinates + return hash(c); + } + + FaceHash (const indexed_triangle_set &its): facehash(its.indices.size()) + { + for (Vec3i face : its.indices) { + std::swap(face(0), face(2)); + facehash.insert(facekey(face, its.vertices)); + } + } + + bool find(const std::string &key) + { + auto it = facehash.find(key); + return it != facehash.end(); + } +}; + + +static void exclude_neighbors(const Vec3i &face, + std::vector &mask, + const indexed_triangle_set &its, + const VertexFaceIndex &index, + size_t recursions) +{ + for (int i = 0; i < 3; ++i) { + const auto &neighbors_range = index[face(i)]; + for (size_t fi_n : neighbors_range) { + mask[fi_n] = true; + if (recursions > 0) + exclude_neighbors(its.indices[fi_n], mask, its, index, recursions - 1); + } + } +} + +std::vector create_exclude_mask(const indexed_triangle_set &its, + const Interior &interior, + const std::vector &holes) +{ + FaceHash interior_hash{sla::get_mesh(interior)}; + + std::vector exclude_mask(its.indices.size(), false); + + VertexFaceIndex neighbor_index{its}; + + for (size_t fi = 0; fi < its.indices.size(); ++fi) { + auto &face = its.indices[fi]; + + if (interior_hash.find(FaceHash::facekey(face, its.vertices))) { + exclude_mask[fi] = true; + continue; + } + + if (exclude_mask[fi]) { + exclude_neighbors(face, exclude_mask, its, neighbor_index, 1); + continue; + } + + // Lets deal with the holes. All the triangles of a hole and all the + // neighbors of these triangles need to be kept. The neigbors were + // created by CGAL mesh boolean operation that modified the original + // interior inside the input mesh to contain the holes. + Vec3d tr_center = ( + its.vertices[face(0)] + + its.vertices[face(1)] + + its.vertices[face(2)] + ).cast() / 3.; + + // If the center is more than half a mm inside the interior, + // it cannot possibly be part of a hole wall. + if (sla::get_distance(tr_center, interior) < -0.5) + continue; + + Vec3f U = its.vertices[face(1)] - its.vertices[face(0)]; + Vec3f V = its.vertices[face(2)] - its.vertices[face(0)]; + Vec3f C = U.cross(V); + Vec3f face_normal = C.normalized(); + + for (const sla::DrainHole &dh : holes) { + if (dh.failed) continue; + + Vec3d dhpos = dh.pos.cast(); + Vec3d dhend = dhpos + dh.normal.cast() * dh.height; + + Linef3 holeaxis{dhpos, dhend}; + + double D_hole_center = line_alg::distance_to(holeaxis, tr_center); + double D_hole = std::abs(D_hole_center - dh.radius); + float dot = dh.normal.dot(face_normal); + + // Empiric tolerances for center distance and normals angle. + // For triangles that are part of a hole wall the angle of + // triangle normal and the hole axis is around 90 degrees, + // so the dot product is around zero. + double D_tol = dh.radius / sla::DrainHole::steps; + float normal_angle_tol = 1.f / sla::DrainHole::steps; + + if (D_hole < D_tol && std::abs(dot) < normal_angle_tol) { + exclude_mask[fi] = true; + exclude_neighbors(face, exclude_mask, its, neighbor_index, 1); + } + } + } + + return exclude_mask; +} + +DrainHoles transformed_drainhole_points(const ModelObject &mo, + const Transform3d &trafo) +{ + auto pts = mo.sla_drain_holes; +// const Transform3d& vol_trafo = mo.volumes.front()->get_transformation().get_matrix(); + const Geometry::Transformation trans(trafo /** vol_trafo*/); + const Transform3d& tr = trans.get_matrix(); + for (sla::DrainHole &hl : pts) { + Vec3d pos = hl.pos.cast(); + Vec3d nrm = hl.normal.cast(); + + pos = tr * pos; + nrm = tr * nrm - tr.translation(); + + // Now shift the hole a bit above the object and make it deeper to + // compensate for it. This is to avoid problems when the hole is placed + // on (nearly) flat surface. + pos -= nrm.normalized() * sla::HoleStickOutLength; + + hl.pos = pos.cast(); + hl.normal = nrm.cast(); + hl.height += sla::HoleStickOutLength; + } + + return pts; +} + +double get_voxel_scale(double mesh_volume, const HollowingConfig &hc) +{ + static constexpr double MIN_SAMPLES_IN_WALL = 3.5; + static constexpr double MAX_OVERSAMPL = 8.; + static constexpr double UNIT_VOLUME = 500000; // empiric + + // I can't figure out how to increase the grid resolution through openvdb + // API so the model will be scaled up before conversion and the result + // scaled down. Voxels have a unit size. If I set voxelSize smaller, it + // scales the whole geometry down, and doesn't increase the number of + // voxels. + // + // First an allowed range for voxel scale is determined from an initial + // range of . The final voxel scale is + // then chosen from this range using the 'quality:<0, 1>' parameter. + // The minimum can be lowered if the wall thickness is great enough and + // the maximum is lowered if the model volume very big. + + double sc_divider = std::max(1.0, (mesh_volume / UNIT_VOLUME)); + double min_oversampl = std::max(MIN_SAMPLES_IN_WALL / hc.min_thickness, 1.); + double max_oversampl_scaled = std::max(min_oversampl, MAX_OVERSAMPL / sc_divider); + auto voxel_scale = min_oversampl + (max_oversampl_scaled - min_oversampl) * hc.quality; + + BOOST_LOG_TRIVIAL(debug) << "Hollowing: max oversampl will be: " << max_oversampl_scaled; + BOOST_LOG_TRIVIAL(debug) << "Hollowing: voxel scale will be: " << voxel_scale; + BOOST_LOG_TRIVIAL(debug) << "Hollowing: mesh volume is: " << mesh_volume; + + return voxel_scale; +} + +// The same as its_compactify_vertices, but returns a new mesh, doesn't touch +// the original +static indexed_triangle_set +remove_unconnected_vertices(const indexed_triangle_set &its) +{ + if (its.indices.empty()) {}; + + indexed_triangle_set M; + + std::vector vtransl(its.vertices.size(), -1); + int vcnt = 0; + for (auto &f : its.indices) { + + for (int i = 0; i < 3; ++i) + if (vtransl[size_t(f(i))] < 0) { + + M.vertices.emplace_back(its.vertices[size_t(f(i))]); + vtransl[size_t(f(i))] = vcnt++; + } + + std::array new_f = { + vtransl[size_t(f(0))], + vtransl[size_t(f(1))], + vtransl[size_t(f(2))] + }; + + M.indices.emplace_back(new_f[0], new_f[1], new_f[2]); + } + + return M; +} + +int hollow_mesh_and_drill(indexed_triangle_set &hollowed_mesh, + const Interior &interior, + const DrainHoles &drainholes, + std::function on_hole_fail) +{ + auto tree = AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set( + hollowed_mesh.vertices, + hollowed_mesh.indices + ); + + std::uniform_real_distribution dist(0., float(EPSILON)); + auto holes_mesh_cgal = MeshBoolean::cgal::triangle_mesh_to_cgal({}, {}); + indexed_triangle_set part_to_drill = hollowed_mesh; + + std::mt19937 m_rng{std::random_device{}()}; + + for (size_t i = 0; i < drainholes.size(); ++i) { + sla::DrainHole holept = drainholes[i]; + + holept.normal += Vec3f{dist(m_rng), dist(m_rng), dist(m_rng)}; + holept.normal.normalize(); + holept.pos += Vec3f{dist(m_rng), dist(m_rng), dist(m_rng)}; + indexed_triangle_set m = holept.to_mesh(); + + part_to_drill.indices.clear(); + auto bb = bounding_box(m); + Eigen::AlignedBox ebb{bb.min.cast(), + bb.max.cast()}; + + AABBTreeIndirect::traverse( + tree, + AABBTreeIndirect::intersecting(ebb), + [&part_to_drill, &hollowed_mesh](const auto& node) + { + part_to_drill.indices.emplace_back(hollowed_mesh.indices[node.idx]); + // continue traversal + return true; + }); + + auto cgal_meshpart = MeshBoolean::cgal::triangle_mesh_to_cgal( + remove_unconnected_vertices(part_to_drill)); + + if (MeshBoolean::cgal::does_self_intersect(*cgal_meshpart)) { + on_hole_fail(i); + continue; + } + + auto cgal_hole = MeshBoolean::cgal::triangle_mesh_to_cgal(m); + MeshBoolean::cgal::plus(*holes_mesh_cgal, *cgal_hole); + } + + auto ret = static_cast(HollowMeshResult::Ok); + + if (MeshBoolean::cgal::does_self_intersect(*holes_mesh_cgal)) { + ret |= static_cast(HollowMeshResult::DrillingFailed); + } + + auto hollowed_mesh_cgal = MeshBoolean::cgal::triangle_mesh_to_cgal(hollowed_mesh); + + if (!MeshBoolean::cgal::does_bound_a_volume(*hollowed_mesh_cgal)) { + ret |= static_cast(HollowMeshResult::FaultyMesh); + } + + if (!MeshBoolean::cgal::empty(*holes_mesh_cgal) + && !MeshBoolean::cgal::does_bound_a_volume(*holes_mesh_cgal)) { + ret |= static_cast(HollowMeshResult::FaultyHoles); + } + + // Don't even bother + if (ret & static_cast(HollowMeshResult::DrillingFailed)) + return ret; + + try { + if (!MeshBoolean::cgal::empty(*holes_mesh_cgal)) + MeshBoolean::cgal::minus(*hollowed_mesh_cgal, *holes_mesh_cgal); + + hollowed_mesh = + MeshBoolean::cgal::cgal_to_indexed_triangle_set(*hollowed_mesh_cgal); + + std::vector exclude_mask = + create_exclude_mask(hollowed_mesh, interior, drainholes); + + sla::remove_inside_triangles(hollowed_mesh, interior, exclude_mask); + } catch (const Slic3r::RuntimeError &) { + ret |= static_cast(HollowMeshResult::DrillingFailed); + } + + return ret; +} + }} // namespace Slic3r::sla diff --git a/src/libslic3r/SLA/Hollowing.hpp b/src/libslic3r/SLA/Hollowing.hpp index b57513fe721..b6c07aff5a9 100644 --- a/src/libslic3r/SLA/Hollowing.hpp +++ b/src/libslic3r/SLA/Hollowing.hpp @@ -3,10 +3,14 @@ #include #include +#include #include +#include namespace Slic3r { +class ModelObject; + namespace sla { struct HollowingConfig @@ -28,6 +32,9 @@ using InteriorPtr = std::unique_ptr; indexed_triangle_set & get_mesh(Interior &interior); const indexed_triangle_set &get_mesh(const Interior &interior); +const VoxelGrid & get_grid(const Interior &interior); +VoxelGrid &get_grid(Interior &interior); + struct DrainHole { Vec3f pos; @@ -46,18 +53,18 @@ struct DrainHole DrainHole(const DrainHole& rhs) : DrainHole(rhs.pos, rhs.normal, rhs.radius, rhs.height, rhs.failed) {} - + bool operator==(const DrainHole &sp) const; - + bool operator!=(const DrainHole &sp) const { return !(sp == (*this)); } bool is_inside(const Vec3f& pt) const; bool get_intersections(const Vec3f& s, const Vec3f& dir, std::array, 2>& out) const; - + indexed_triangle_set to_mesh() const; - + template inline void serialize(Archive &ar) { ar(pos, normal, radius, height, failed); @@ -70,26 +77,116 @@ using DrainHoles = std::vector; constexpr float HoleStickOutLength = 1.f; -InteriorPtr generate_interior(const TriangleMesh &mesh, +double get_voxel_scale(double mesh_volume, const HollowingConfig &hc); + +InteriorPtr generate_interior(const VoxelGrid &mesh, const HollowingConfig & = {}, const JobController &ctl = {}); +inline InteriorPtr generate_interior(const indexed_triangle_set &mesh, + const HollowingConfig &hc = {}, + const JobController &ctl = {}) +{ + auto voxel_scale = get_voxel_scale(its_volume(mesh), hc); + auto statusfn = [&ctl](int){ return ctl.stopcondition && ctl.stopcondition(); }; + auto grid = mesh_to_grid(mesh, MeshToGridParams{} + .voxel_scale(voxel_scale) + .exterior_bandwidth(3.f) + .interior_bandwidth(3.f) + .statusfn(statusfn)); + + if (!grid || (ctl.stopcondition && ctl.stopcondition())) + return {}; + +// if (its_is_splittable(mesh)) + grid = redistance_grid(*grid, 0.0f, 3.f, 3.f); + + return grid ? generate_interior(*grid, hc, ctl) : InteriorPtr{}; +} + +template double csgmesh_positive_maxvolume(const Cont &csg) +{ + double mesh_vol = 0; + + bool skip = false; + for (const auto &m : csg) { + auto op = csg::get_operation(m); + auto stackop = csg::get_stack_operation(m); + if (stackop == csg::CSGStackOp::Push && op != csg::CSGType::Union) + skip = true; + + if (!skip && csg::get_mesh(m) && op == csg::CSGType::Union) + mesh_vol = std::max(mesh_vol, + double(its_volume(*(csg::get_mesh(m))))); + + if (stackop == csg::CSGStackOp::Pop) + skip = false; + } + + return mesh_vol; +} + +template +InteriorPtr generate_interior(const Range &csgparts, + const HollowingConfig &hc = {}, + const JobController &ctl = {}) +{ + double mesh_vol = csgmesh_positive_maxvolume(csgparts); + double voxsc = get_voxel_scale(mesh_vol, hc); + + auto params = csg::VoxelizeParams{} + .voxel_scale(voxsc) + .exterior_bandwidth(3.f) + .interior_bandwidth(3.f) + .statusfn([&ctl](int){ return ctl.stopcondition && ctl.stopcondition(); }); + + auto ptr = csg::voxelize_csgmesh(csgparts, params); + + if (!ptr || (ctl.stopcondition && ctl.stopcondition())) + return {}; + + // TODO: figure out issues without the redistance +// if (csgparts.size() > 1 || its_is_splittable(*csg::get_mesh(*csgparts.begin()))) + + ptr = redistance_grid(*ptr, 0.0f, 3.f, 3.f); + + return ptr ? generate_interior(*ptr, hc, ctl) : InteriorPtr{}; +} + // Will do the hollowing void hollow_mesh(TriangleMesh &mesh, const HollowingConfig &cfg, int flags = 0); // Hollowing prepared in "interior", merge with original mesh void hollow_mesh(TriangleMesh &mesh, const Interior &interior, int flags = 0); +// Will do the hollowing +void hollow_mesh(indexed_triangle_set &mesh, const HollowingConfig &cfg, int flags = 0); + +// Hollowing prepared in "interior", merge with original mesh +void hollow_mesh(indexed_triangle_set &mesh, const Interior &interior, int flags = 0); + +enum class HollowMeshResult { + Ok = 0, + FaultyMesh = 1, + FaultyHoles = 2, + DrillingFailed = 4 +}; + +// Return HollowMeshResult codes OR-ed. +int hollow_mesh_and_drill( + indexed_triangle_set &mesh, + const Interior& interior, + const DrainHoles &holes, + std::function on_hole_fail = [](size_t){}); + void remove_inside_triangles(TriangleMesh &mesh, const Interior &interior, const std::vector &exclude_mask = {}); -double get_distance(const Vec3f &p, const Interior &interior); +void remove_inside_triangles(indexed_triangle_set &mesh, const Interior &interior, + const std::vector &exclude_mask = {}); -template -FloatingOnly get_distance(const Vec<3, T> &p, const Interior &interior) -{ - return get_distance(Vec3f(p.template cast()), interior); -} +sla::DrainHoles transformed_drainhole_points(const ModelObject &mo, + const Transform3d &trafo); void cut_drainholes(std::vector & obj_slices, const std::vector &slicegrid, @@ -103,6 +200,16 @@ inline void swap_normals(indexed_triangle_set &its) std::swap(face(0), face(2)); } +// Create exclude mask for triangle removal inside hollowed interiors. +// This is necessary when the interior is already part of the mesh which was +// drilled using CGAL mesh boolean operation. Excluded will be the triangles +// originally part of the interior mesh and triangles that make up the drilled +// hole walls. +std::vector create_exclude_mask( + const indexed_triangle_set &its, + const sla::Interior &interior, + const std::vector &holes); + } // namespace sla } // namespace Slic3r diff --git a/src/libslic3r/SLA/Pad.cpp b/src/libslic3r/SLA/Pad.cpp index b92862439ab..34a1b5dd34c 100644 --- a/src/libslic3r/SLA/Pad.cpp +++ b/src/libslic3r/SLA/Pad.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include //#include #include @@ -21,9 +21,6 @@ #include "I18N.hpp" #include -//! macro used to mark string used at localization, -//! return same string -#define L(s) Slic3r::I18N::translate(s) namespace Slic3r { namespace sla { @@ -204,7 +201,7 @@ class Intersector { void add(const ExPolygon &ep) { m_polys.emplace_back(ep); - m_index.insert(BoundingBox{ep}, unsigned(m_index.size())); + m_index.insert(get_extents(ep), unsigned(m_index.size())); } // Check an arbitrary polygon for intersection with the indexed polygons @@ -530,7 +527,7 @@ std::string PadConfig::validate() const if (brim_size_mm < MIN_BRIM_SIZE_MM || bottom_offset() > brim_size_mm + wing_distance() || get_waffle_offset(*this) <= MIN_BRIM_SIZE_MM) - return L("Pad brim size is too small for the current configuration."); + return _u8L("Pad brim size is too small for the current configuration."); return ""; } diff --git a/src/libslic3r/SLA/RasterBase.cpp b/src/libslic3r/SLA/RasterBase.cpp index 581e84880b0..7240b198da1 100644 --- a/src/libslic3r/SLA/RasterBase.cpp +++ b/src/libslic3r/SLA/RasterBase.cpp @@ -11,11 +11,6 @@ namespace Slic3r { namespace sla { -const RasterBase::TMirroring RasterBase::NoMirror = {false, false}; -const RasterBase::TMirroring RasterBase::MirrorX = {true, false}; -const RasterBase::TMirroring RasterBase::MirrorY = {false, true}; -const RasterBase::TMirroring RasterBase::MirrorXY = {true, true}; - EncodedRaster PNGRasterEncoder::operator()(const void *ptr, size_t w, size_t h, size_t num_components) { @@ -68,15 +63,17 @@ EncodedRaster PPMRasterEncoder::operator()(const void *ptr, size_t w, size_t h, } std::unique_ptr create_raster_grayscale_aa( - const RasterBase::Resolution &res, - const RasterBase::PixelDim & pxdim, - double gamma, - const RasterBase::Trafo & tr) + const Resolution &res, + const PixelDim &pxdim, + double gamma, + const RasterBase::Trafo &tr) { std::unique_ptr rst; if (gamma > 0) rst = std::make_unique(res, pxdim, tr, gamma); + else if (std::abs(gamma - 1.) < 1e-6) + rst = std::make_unique(res, pxdim, tr, agg::gamma_none()); else rst = std::make_unique(res, pxdim, tr, agg::gamma_threshold(.5)); diff --git a/src/libslic3r/SLA/RasterBase.hpp b/src/libslic3r/SLA/RasterBase.hpp index 1eba360e312..33d39eafbdf 100644 --- a/src/libslic3r/SLA/RasterBase.hpp +++ b/src/libslic3r/SLA/RasterBase.hpp @@ -9,7 +9,6 @@ #include #include -#include namespace Slic3r { @@ -31,6 +30,27 @@ class EncodedRaster { const char * extension() const { return m_ext.c_str(); } }; +/// Type that represents a resolution in pixels. +struct Resolution { + size_t width_px = 0; + size_t height_px = 0; + + Resolution() = default; + Resolution(size_t w, size_t h) : width_px(w), height_px(h) {} + size_t pixels() const { return width_px * height_px; } +}; + +/// Types that represents the dimension of a pixel in millimeters. +struct PixelDim { + double w_mm = 1.; + double h_mm = 1.; + + PixelDim() = default; + PixelDim(double px_width_mm, double px_height_mm) + : w_mm(px_width_mm), h_mm(px_height_mm) + {} +}; + using RasterEncoder = std::function; @@ -40,10 +60,10 @@ class RasterBase { enum Orientation { roLandscape, roPortrait }; using TMirroring = std::array; - static const TMirroring NoMirror; - static const TMirroring MirrorX; - static const TMirroring MirrorY; - static const TMirroring MirrorXY; + static const constexpr TMirroring NoMirror = {false, false}; + static const constexpr TMirroring MirrorX = {true, false}; + static const constexpr TMirroring MirrorY = {false, true}; + static const constexpr TMirroring MirrorXY = {true, true}; struct Trafo { bool mirror_x = false, mirror_y = false, flipXY = false; @@ -63,35 +83,14 @@ class RasterBase { Point get_center() const { return {center_x, center_y}; } }; - /// Type that represents a resolution in pixels. - struct Resolution { - size_t width_px = 0; - size_t height_px = 0; - - Resolution() = default; - Resolution(size_t w, size_t h) : width_px(w), height_px(h) {} - size_t pixels() const { return width_px * height_px; } - }; - - /// Types that represents the dimension of a pixel in millimeters. - struct PixelDim { - double w_mm = 1.; - double h_mm = 1.; - - PixelDim() = default; - PixelDim(double px_width_mm, double px_height_mm) - : w_mm(px_width_mm), h_mm(px_height_mm) - {} - }; - virtual ~RasterBase() = default; /// Draw a polygon with holes. virtual void draw(const ExPolygon& poly) = 0; /// Get the resolution of the raster. - virtual Resolution resolution() const = 0; - virtual PixelDim pixel_dimensions() const = 0; +// virtual Resolution resolution() const = 0; +// virtual PixelDim pixel_dimensions() const = 0; virtual Trafo trafo() const = 0; virtual EncodedRaster encode(RasterEncoder encoder) const = 0; @@ -109,10 +108,10 @@ std::ostream& operator<<(std::ostream &stream, const EncodedRaster &bytes); // If gamma is zero, thresholding will be performed which disables AA. std::unique_ptr create_raster_grayscale_aa( - const RasterBase::Resolution &res, - const RasterBase::PixelDim & pxdim, - double gamma = 1.0, - const RasterBase::Trafo & tr = {}); + const Resolution &res, + const PixelDim &pxdim, + double gamma = 1.0, + const RasterBase::Trafo &tr = {}); }} // namespace Slic3r::sla diff --git a/src/libslic3r/SLA/ReprojectPointsOnMesh.hpp b/src/libslic3r/SLA/ReprojectPointsOnMesh.hpp index 3ad7d62b1e6..fc033b83256 100644 --- a/src/libslic3r/SLA/ReprojectPointsOnMesh.hpp +++ b/src/libslic3r/SLA/ReprojectPointsOnMesh.hpp @@ -2,9 +2,9 @@ #define REPROJECTPOINTSONMESH_HPP #include "libslic3r/Point.hpp" +#include "libslic3r/AABBMesh.hpp" #include "SupportPoint.hpp" #include "Hollowing.hpp" -#include "IndexedMesh.hpp" #include "libslic3r/Model.hpp" #include @@ -15,7 +15,7 @@ template Vec3d pos(const Pt &p) { return p.pos.template cast() template void pos(Pt &p, const Vec3d &pp) { p.pos = pp.cast(); } template -void reproject_support_points(const IndexedMesh &mesh, std::vector &pts) +void reproject_support_points(const AABBMesh &mesh, std::vector &pts) { tbb::parallel_for(size_t(0), pts.size(), [&mesh, &pts](size_t idx) { int junk; @@ -33,7 +33,7 @@ inline void reproject_points_and_holes(ModelObject *object) if (!object || (!has_holes && !has_sppoints)) return; TriangleMesh rmsh = object->raw_mesh(); - IndexedMesh emesh{rmsh}; + AABBMesh emesh{rmsh}; if (has_sppoints) reproject_support_points(emesh, object->sla_support_points); diff --git a/src/libslic3r/SLA/Rotfinder.cpp b/src/libslic3r/SLA/Rotfinder.cpp index 196646dc9ee..5f25d5b60bb 100644 --- a/src/libslic3r/SLA/Rotfinder.cpp +++ b/src/libslic3r/SLA/Rotfinder.cpp @@ -76,7 +76,7 @@ struct Facestats { // Try to guess the number of support points needed to support a mesh double get_misalginment_score(const TriangleMesh &mesh, const Transform3f &tr) { - if (mesh.its.vertices.empty()) return std::nan(""); + if (mesh.its.vertices.empty()) return NaNd; auto accessfn = [&mesh, &tr](size_t fi) { Facestats fc{get_transformed_triangle(mesh, tr, fi)}; @@ -117,7 +117,7 @@ inline double get_supportedness_score(const Facestats &fc) // Try to guess the number of support points needed to support a mesh double get_supportedness_score(const TriangleMesh &mesh, const Transform3f &tr) { - if (mesh.its.vertices.empty()) return std::nan(""); + if (mesh.its.vertices.empty()) return NaNd; auto accessfn = [&mesh, &tr](size_t fi) { Facestats fc{get_transformed_triangle(mesh, tr, fi)}; @@ -149,10 +149,10 @@ float find_ground_level(const TriangleMesh &mesh, return execution::reduce(ex_tbb, size_t(0), vsize, zmin, minfn, accessfn, granularity); } -float get_supportedness_onfloor_score(const TriangleMesh &mesh, - const Transform3f & tr) +double get_supportedness_onfloor_score(const TriangleMesh &mesh, + const Transform3f &tr) { - if (mesh.its.vertices.empty()) return std::nan(""); + if (mesh.its.vertices.empty()) return NaNd; size_t Nthreads = std::thread::hardware_concurrency(); @@ -288,7 +288,7 @@ template struct RotfinderBoilerplate { static constexpr unsigned MAX_TRIES = MAX_ITER; - int status = 0; + int status = 0, prev_status = 0; TriangleMesh mesh; unsigned max_tries; const RotOptimizeParams ¶ms; @@ -300,13 +300,8 @@ struct RotfinderBoilerplate { TriangleMesh mesh = mo.raw_mesh(); ModelInstance *mi = mo.instances[0]; - auto rotation = Vec3d::Zero(); - auto offset = Vec3d::Zero(); - Transform3d trafo_instance = - Geometry::assemble_transform(offset, rotation, - mi->get_scaling_factor(), - mi->get_mirror()); - + const Geometry::Transformation trafo = mi->get_transformation(); + Transform3d trafo_instance = trafo.get_scaling_factor_matrix() * trafo.get_mirror_matrix(); mesh.transform(trafo_instance); return mesh; @@ -314,13 +309,20 @@ struct RotfinderBoilerplate { RotfinderBoilerplate(const ModelObject &mo, const RotOptimizeParams &p) : mesh{get_mesh_to_rotate(mo)} - , params{p} , max_tries(p.accuracy() * MAX_TRIES) - { + , params{p} + {} + + void statusfn() { + int s = status * 100 / max_tries; + if (s != prev_status) { + params.statuscb()(s); + prev_status = s; + } + ++status; } - void statusfn() { params.statuscb()(++status * 100.0 / max_tries); } bool stopcond() { return ! params.statuscb()(-1); } }; diff --git a/src/libslic3r/SLA/SpatIndex.cpp b/src/libslic3r/SLA/SpatIndex.cpp index d95ba55bee0..1af9d29bb13 100644 --- a/src/libslic3r/SLA/SpatIndex.cpp +++ b/src/libslic3r/SLA/SpatIndex.cpp @@ -1,7 +1,7 @@ #include "SpatIndex.hpp" // for concave hull merging decisions -#include +#include #ifdef _MSC_VER #pragma warning(push) diff --git a/src/libslic3r/SLA/SupportPoint.hpp b/src/libslic3r/SLA/SupportPoint.hpp index 71849a3643c..cf6dbabbaf2 100644 --- a/src/libslic3r/SLA/SupportPoint.hpp +++ b/src/libslic3r/SLA/SupportPoint.hpp @@ -3,7 +3,11 @@ #include -namespace Slic3r { namespace sla { +namespace Slic3r { + +class ModelObject; + +namespace sla { // An enum to keep track of where the current points on the ModelObject came from. enum class PointsStatus { @@ -62,6 +66,9 @@ struct SupportPoint using SupportPoints = std::vector; +SupportPoints transformed_support_points(const ModelObject &mo, + const Transform3d &trafo); + }} // namespace Slic3r::sla #endif // SUPPORTPOINT_HPP diff --git a/src/libslic3r/SLA/SupportPointGenerator.cpp b/src/libslic3r/SLA/SupportPointGenerator.cpp index c32da04319b..193333bc6ac 100644 --- a/src/libslic3r/SLA/SupportPointGenerator.cpp +++ b/src/libslic3r/SLA/SupportPointGenerator.cpp @@ -1,17 +1,14 @@ -//#include "igl/random_points_on_mesh.h" -//#include "igl/AABB.h" - #include #include "SupportPointGenerator.hpp" -#include "Concurrency.hpp" +#include "Execution/ExecutionTBB.hpp" +#include "Geometry/ConvexHull.hpp" #include "Model.hpp" #include "ExPolygon.hpp" #include "SVG.hpp" #include "Point.hpp" #include "ClipperUtils.hpp" #include "Tesselate.hpp" -#include "ExPolygonCollection.hpp" #include "MinAreaBoundingBox.hpp" #include "libslic3r.h" @@ -53,7 +50,7 @@ float SupportPointGenerator::distance_limit(float angle) const }*/ SupportPointGenerator::SupportPointGenerator( - const sla::IndexedMesh &emesh, + const AABBMesh &emesh, const std::vector &slices, const std::vector & heights, const Config & config, @@ -67,7 +64,7 @@ SupportPointGenerator::SupportPointGenerator( } SupportPointGenerator::SupportPointGenerator( - const IndexedMesh &emesh, + const AABBMesh &emesh, const SupportPointGenerator::Config &config, std::function throw_on_cancel, std::function statusfn) @@ -92,7 +89,7 @@ void SupportPointGenerator::project_onto_mesh(std::vector& po // Use a reasonable granularity to account for the worker thread synchronization cost. static constexpr size_t gransize = 64; - ccr_par::for_each(size_t(0), points.size(), [this, &points](size_t idx) + execution::for_each(ex_tbb, size_t(0), points.size(), [this, &points](size_t idx) { if ((idx % 16) == 0) // Don't call the following function too often as it flushes CPU write caches due to synchronization primitves. @@ -100,8 +97,8 @@ void SupportPointGenerator::project_onto_mesh(std::vector& po Vec3f& p = points[idx].pos; // Project the point upward and downward and choose the closer intersection with the mesh. - sla::IndexedMesh::hit_result hit_up = m_emesh.query_ray_hit(p.cast(), Vec3d(0., 0., 1.)); - sla::IndexedMesh::hit_result hit_down = m_emesh.query_ray_hit(p.cast(), Vec3d(0., 0., -1.)); + AABBMesh::hit_result hit_up = m_emesh.query_ray_hit(p.cast(), Vec3d(0., 0., 1.)); + AABBMesh::hit_result hit_down = m_emesh.query_ray_hit(p.cast(), Vec3d(0., 0., -1.)); bool up = hit_up.is_hit(); bool down = hit_down.is_hit(); @@ -109,7 +106,7 @@ void SupportPointGenerator::project_onto_mesh(std::vector& po if (!up && !down) return; - sla::IndexedMesh::hit_result& hit = (!down || (hit_up.distance() < hit_down.distance())) ? hit_up : hit_down; + AABBMesh::hit_result& hit = (!down || (hit_up.distance() < hit_down.distance())) ? hit_up : hit_down; p = p + (hit.distance() * hit.direction()).cast(); }, gransize); } @@ -130,7 +127,7 @@ static std::vector make_layers( //const float pixel_area = pow(wxGetApp().preset_bundle->project_config.option("display_width") / wxGetApp().preset_bundle->project_config.option("display_pixels_x"), 2.f); // const float pixel_area = pow(0.047f, 2.f); - ccr_par::for_each(size_t(0), layers.size(), + execution::for_each(ex_tbb, size_t(0), layers.size(), [&layers, &slices, &heights, pixel_area, throw_on_cancel](size_t layer_id) { if ((layer_id % 8) == 0) @@ -155,7 +152,7 @@ static std::vector make_layers( }, 32 /*gransize*/); // Calculate overlap of successive layers. Link overlapping islands. - ccr_par::for_each(size_t(1), layers.size(), + execution::for_each(ex_tbb, size_t(1), layers.size(), [&layers, &heights, throw_on_cancel] (size_t layer_id) { if ((layer_id % 2) == 0) @@ -550,7 +547,7 @@ void SupportPointGenerator::uniformly_cover(const ExPolygons& islands, Structure // auto bb = get_extents(islands); if (flags & icfIsNew) { - auto chull = ExPolygonCollection{islands}.convex_hull(); + auto chull = Geometry::convex_hull(islands); auto rotbox = MinAreaBoundigBox{chull, MinAreaBoundigBox::pcConvex}; Vec2d bbdim = {unscaled(rotbox.width()), unscaled(rotbox.height())}; @@ -664,5 +661,17 @@ void SupportPointGenerator::output_expolygons(const ExPolygons& expolys, const s } #endif +SupportPoints transformed_support_points(const ModelObject &mo, + const Transform3d &trafo) +{ + auto spts = mo.sla_support_points; + Transform3f tr = trafo.cast(); + for (sla::SupportPoint& suppt : spts) { + suppt.pos = tr * suppt.pos; + } + + return spts; +} + } // namespace sla } // namespace Slic3r diff --git a/src/libslic3r/SLA/SupportPointGenerator.hpp b/src/libslic3r/SLA/SupportPointGenerator.hpp index 441b82de1f2..a9e094386fa 100644 --- a/src/libslic3r/SLA/SupportPointGenerator.hpp +++ b/src/libslic3r/SLA/SupportPointGenerator.hpp @@ -3,9 +3,9 @@ #include -#include -#include +#include +#include #include #include #include @@ -28,10 +28,10 @@ class SupportPointGenerator { inline float tear_pressure() const { return 1.f; } // pressure that the display exerts (the force unit per mm2) }; - SupportPointGenerator(const IndexedMesh& emesh, const std::vector& slices, + SupportPointGenerator(const AABBMesh& emesh, const std::vector& slices, const std::vector& heights, const Config& config, std::function throw_on_cancel, std::function statusfn); - SupportPointGenerator(const IndexedMesh& emesh, const Config& config, std::function throw_on_cancel, std::function statusfn); + SupportPointGenerator(const AABBMesh& emesh, const Config& config, std::function throw_on_cancel, std::function statusfn); const std::vector& output() const { return m_output; } std::vector& output() { return m_output; } @@ -84,8 +84,7 @@ class SupportPointGenerator { float overhangs_area = 0.f; bool overlaps(const Structure &rhs) const { - //FIXME ExPolygon::overlaps() shall be commutative, it is not! - return this->bbox.overlap(rhs.bbox) && (this->polygon->overlaps(*rhs.polygon) || rhs.polygon->overlaps(*this->polygon)); + return this->bbox.overlap(rhs.bbox) && this->polygon->overlaps(*rhs.polygon); } float overlap_area(const Structure &rhs) const { double out = 0.; @@ -217,7 +216,7 @@ class SupportPointGenerator { static void output_structures(const std::vector &structures); #endif // SLA_SUPPORTPOINTGEN_DEBUG - const IndexedMesh& m_emesh; + const AABBMesh& m_emesh; std::function m_throw_on_cancel; std::function m_statusfn; diff --git a/src/libslic3r/SLA/SupportTree.cpp b/src/libslic3r/SLA/SupportTree.cpp index a0f88ed6087..d066e02bfda 100644 --- a/src/libslic3r/SLA/SupportTree.cpp +++ b/src/libslic3r/SLA/SupportTree.cpp @@ -7,59 +7,126 @@ #include #include #include -#include +#include +#include #include #include #include #include -#include -#include #include -#include -//! macro used to mark string used at localization, -//! return same string -#define L(s) Slic3r::I18N::translate(s) +#include -namespace Slic3r { -namespace sla { -void SupportTree::retrieve_full_mesh(indexed_triangle_set &outmesh) const { - its_merge(outmesh, retrieve_mesh(MeshType::Support)); - its_merge(outmesh, retrieve_mesh(MeshType::Pad)); +namespace Slic3r { namespace sla { + +indexed_triangle_set create_support_tree(const SupportableMesh &sm, + const JobController &ctl) +{ + auto builder = make_unique(ctl); + + if (sm.cfg.enabled) { + Benchmark bench; + bench.start(); + + switch (sm.cfg.tree_type) { + case SupportTreeType::Default: { + create_default_tree(*builder, sm); + break; + } + case SupportTreeType::Branching: { + create_branching_tree(*builder, sm); + break; + } + case SupportTreeType::Organic: { + // TODO + } + default:; + } + + bench.stop(); + + BOOST_LOG_TRIVIAL(info) << "Support tree creation took: " + << bench.getElapsedSec() + << " seconds"; + + builder->merge_and_cleanup(); // clean metadata, leave only the meshes. + } + + indexed_triangle_set out = builder->retrieve_mesh(MeshType::Support); + + return out; } -std::vector SupportTree::slice(const std::vector &grid, - float cr) const +indexed_triangle_set create_pad(const SupportableMesh &sm, + const indexed_triangle_set &support_mesh, + const JobController &ctl) { - const indexed_triangle_set &sup_mesh = retrieve_mesh(MeshType::Support); - const indexed_triangle_set &pad_mesh = retrieve_mesh(MeshType::Pad); + constexpr float PadSamplingLH = 0.1f; + + ExPolygons model_contours; // This will store the base plate of the pad. + double pad_h = sm.pad_cfg.full_height(); + auto gndlvl = float(ground_level(sm)); + float zstart = gndlvl - bool(sm.pad_cfg.embed_object) * sm.pad_cfg.wall_thickness_mm; + float zend = zstart + float(pad_h + PadSamplingLH + EPSILON); + auto heights = grid(zstart, zend, PadSamplingLH); + + if (!sm.cfg.enabled || sm.pad_cfg.embed_object) { + // No support (thus no elevation) or zero elevation mode + // we sometimes call it "builtin pad" is enabled so we will + // get a sample from the bottom of the mesh and use it for pad + // creation. + sla::pad_blueprint(*sm.emesh.get_triangle_mesh(), model_contours, + heights, ctl.cancelfn); + } + + ExPolygons sup_contours; + pad_blueprint(support_mesh, sup_contours, heights, ctl.cancelfn); + + indexed_triangle_set out; + create_pad(sup_contours, model_contours, out, sm.pad_cfg); + + Vec3f offs{.0f, .0f, gndlvl}; + for (auto &p : out.vertices) p += offs; + its_merge_vertices(out); + + return out; +} + +std::vector slice(const indexed_triangle_set &sup_mesh, + const indexed_triangle_set &pad_mesh, + const std::vector &grid, + float cr, + const JobController &ctl) +{ using Slices = std::vector; + auto slices = reserve_vector(2); if (!sup_mesh.empty()) { slices.emplace_back(); - slices.back() = slice_mesh_ex(sup_mesh, grid, cr, ctl().cancelfn); + slices.back() = slice_mesh_ex(sup_mesh, grid, cr, ctl.cancelfn); } if (!pad_mesh.empty()) { slices.emplace_back(); - auto bb = bounding_box(pad_mesh); + auto bb = bounding_box(pad_mesh); auto maxzit = std::upper_bound(grid.begin(), grid.end(), bb.max.z()); - - auto cap = grid.end() - maxzit; + + auto cap = grid.end() - maxzit; auto padgrid = reserve_vector(size_t(cap > 0 ? cap : 0)); std::copy(grid.begin(), maxzit, std::back_inserter(padgrid)); - slices.back() = slice_mesh_ex(pad_mesh, padgrid, cr, ctl().cancelfn); + slices.back() = slice_mesh_ex(pad_mesh, padgrid, cr, ctl.cancelfn); } size_t len = grid.size(); - for (const Slices &slv : slices) { len = std::min(len, slv.size()); } + for (const Slices &slv : slices) + len = std::min(len, slv.size()); // Either the support or the pad or both has to be non empty if (slices.empty()) return {}; @@ -77,22 +144,4 @@ std::vector SupportTree::slice(const std::vector &grid, return mrg; } -SupportTree::UPtr SupportTree::create(const SupportableMesh &sm, - const JobController & ctl) -{ - auto builder = make_unique(); - builder->m_ctl = ctl; - - if (sm.cfg.enabled) { - // Execute takes care about the ground_level - SupportTreeBuildsteps::execute(*builder, sm); - builder->merge_and_cleanup(); // clean metadata, leave only the meshes. - } else { - // If a pad gets added later, it will be in the right Z level - builder->ground_level = sm.emesh.ground_level(); - } - - return std::move(builder); -} - }} // namespace Slic3r::sla diff --git a/src/libslic3r/SLA/SupportTree.hpp b/src/libslic3r/SLA/SupportTree.hpp index 200b7cbde1e..53fb16f6e71 100644 --- a/src/libslic3r/SLA/SupportTree.hpp +++ b/src/libslic3r/SLA/SupportTree.hpp @@ -3,38 +3,29 @@ #include #include -#include + +#include +#include #include -#include #include #include +#include namespace Slic3r { -class TriangleMesh; -class Model; -class ModelInstance; -class ModelObject; -class Polygon; -class ExPolygon; - using Polygons = std::vector; using ExPolygons = std::vector; namespace sla { -enum class PillarConnectionMode -{ - zigzag, - cross, - dynamic -}; - struct SupportTreeConfig { bool enabled = true; - + + // Type of the support tree, for + SupportTreeType tree_type = SupportTreeType::Default; + // Radius in mm of the pointing side of the head. double head_front_radius_mm = 0.2; @@ -59,7 +50,7 @@ struct SupportTreeConfig // when bridges and pillars are merged. The resulting pillar should be a bit // thicker than the ones merging into it. How much thicker? I don't know // but it will be derived from this value. - double pillar_widening_factor = 0.5; + double pillar_widening_factor = .5; // Radius in mm of the pillar base. double base_radius_mm = 2.0; @@ -85,12 +76,20 @@ struct SupportTreeConfig double pillar_base_safety_distance_mm = 0.5; unsigned max_bridges_on_pillar = 3; - + + double max_weight_on_model_support = 10.f; + double head_fullwidth() const { return 2 * head_front_radius_mm + head_width_mm + 2 * head_back_radius_mm - head_penetration_mm; } + double safety_distance() const { return safety_distance_mm; } + double safety_distance(double r) const + { + return std::min(safety_distance_mm, r * safety_distance_mm / head_back_radius_mm); + } + // ///////////////////////////////////////////////////////////////////////// // Compile time configuration values (candidates for runtime) // ///////////////////////////////////////////////////////////////////////// @@ -98,79 +97,65 @@ struct SupportTreeConfig // The max Z angle for a normal at which it will get completely ignored. static const double constexpr normal_cutoff_angle = 150.0 * M_PI / 180.0; - // The shortest distance of any support structure from the model surface + // The safety gap between a support structure and model body. For support + // struts smaller than head_back_radius, the safety distance is scaled + // down accordingly. see method safety_distance() static const double constexpr safety_distance_mm = 0.5; static const double constexpr max_solo_pillar_height_mm = 15.0; static const double constexpr max_dual_pillar_height_mm = 35.0; - static const double constexpr optimizer_rel_score_diff = 1e-6; - static const unsigned constexpr optimizer_max_iterations = 1000; + static const double constexpr optimizer_rel_score_diff = 1e-10; + static const unsigned constexpr optimizer_max_iterations = 2000; static const unsigned constexpr pillar_cascade_neighbors = 3; }; -// TODO: Part of future refactor -//class SupportConfig { -// std::optional tree_cfg {std::in_place_t{}}; // fill up -// std::optional pad_cfg; -//}; - enum class MeshType { Support, Pad }; struct SupportableMesh { - IndexedMesh emesh; - SupportPoints pts; + AABBMesh emesh; + SupportPoints pts; SupportTreeConfig cfg; -// PadConfig pad_cfg; + PadConfig pad_cfg; + double zoffset = 0.; - explicit SupportableMesh(const indexed_triangle_set & trmsh, - const SupportPoints &sp, - const SupportTreeConfig &c) + explicit SupportableMesh(const indexed_triangle_set &trmsh, + const SupportPoints &sp, + const SupportTreeConfig &c) : emesh{trmsh}, pts{sp}, cfg{c} {} - - explicit SupportableMesh(const IndexedMesh &em, - const SupportPoints &sp, - const SupportTreeConfig &c) - : emesh{em}, pts{sp}, cfg{c} - {} + +// explicit SupportableMesh(const AABBMesh &em, +// const SupportPoints &sp, +// const SupportTreeConfig &c) +// : emesh{em}, pts{sp}, cfg{c} +// {} }; -/// The class containing mesh data for the generated supports. -class SupportTree +inline double ground_level(const SupportableMesh &sm) { - JobController m_ctl; -public: - using UPtr = std::unique_ptr; - - static UPtr create(const SupportableMesh &input, - const JobController &ctl = {}); + double lvl = sm.zoffset - + !bool(sm.pad_cfg.embed_object) * sm.cfg.enabled * sm.cfg.object_elevation_mm + + bool(sm.pad_cfg.embed_object) * sm.pad_cfg.wall_thickness_mm; - virtual ~SupportTree() = default; + return lvl; +} - virtual const indexed_triangle_set &retrieve_mesh(MeshType meshtype) const = 0; +indexed_triangle_set create_support_tree(const SupportableMesh &mesh, + const JobController &ctl); - /// Adding the "pad" under the supports. - /// modelbase will be used according to the embed_object flag in PoolConfig. - /// If set, the plate will be interpreted as the model's intrinsic pad. - /// Otherwise, the modelbase will be unified with the base plate calculated - /// from the supports. - virtual const indexed_triangle_set &add_pad(const ExPolygons &modelbase, - const PadConfig & pcfg) = 0; +indexed_triangle_set create_pad(const SupportableMesh &model_mesh, + const indexed_triangle_set &support_mesh, + const JobController &ctl); - virtual void remove_pad() = 0; - - std::vector slice(const std::vector &, - float closing_radius) const; - - void retrieve_full_mesh(indexed_triangle_set &outmesh) const; - - const JobController &ctl() const { return m_ctl; } -}; +std::vector slice(const indexed_triangle_set &support_mesh, + const indexed_triangle_set &pad_mesh, + const std::vector &grid, + float closing_radius, + const JobController &ctl); -} - -} +} // namespace sla +} // namespace Slic3r #endif // SLASUPPORTTREE_HPP diff --git a/src/libslic3r/SLA/SupportTreeBuilder.cpp b/src/libslic3r/SLA/SupportTreeBuilder.cpp index 86339d2acf9..1786adb837a 100644 --- a/src/libslic3r/SLA/SupportTreeBuilder.cpp +++ b/src/libslic3r/SLA/SupportTreeBuilder.cpp @@ -1,7 +1,7 @@ #define NOMINMAX #include -#include +#include #include //#include @@ -23,48 +23,15 @@ Head::Head(double r_big_mm, { } -Pad::Pad(const indexed_triangle_set &support_mesh, - const ExPolygons & model_contours, - double ground_level, - const PadConfig & pcfg, - ThrowOnCancel thr) - : cfg(pcfg) - , zlevel(ground_level + pcfg.full_height() - pcfg.required_elevation()) -{ - thr(); - - ExPolygons sup_contours; - - float zstart = float(zlevel); - float zend = zstart + float(pcfg.full_height() + EPSILON); - - pad_blueprint(support_mesh, sup_contours, grid(zstart, zend, 0.1f), thr); - create_pad(sup_contours, model_contours, tmesh, pcfg); - - Vec3f offs{.0f, .0f, float(zlevel)}; - for (auto &p : tmesh.vertices) p += offs; - - its_merge_vertices(tmesh); -} - -const indexed_triangle_set &SupportTreeBuilder::add_pad( - const ExPolygons &modelbase, const PadConfig &cfg) -{ - m_pad = Pad{merged_mesh(), modelbase, ground_level, cfg, ctl().cancelfn}; - return m_pad.tmesh; -} - SupportTreeBuilder::SupportTreeBuilder(SupportTreeBuilder &&o) : m_heads(std::move(o.m_heads)) , m_head_indices{std::move(o.m_head_indices)} , m_pillars{std::move(o.m_pillars)} , m_bridges{std::move(o.m_bridges)} , m_crossbridges{std::move(o.m_crossbridges)} - , m_pad{std::move(o.m_pad)} , m_meshcache{std::move(o.m_meshcache)} , m_meshcache_valid{o.m_meshcache_valid} , m_model_height{o.m_model_height} - , ground_level{o.ground_level} {} SupportTreeBuilder::SupportTreeBuilder(const SupportTreeBuilder &o) @@ -73,11 +40,9 @@ SupportTreeBuilder::SupportTreeBuilder(const SupportTreeBuilder &o) , m_pillars{o.m_pillars} , m_bridges{o.m_bridges} , m_crossbridges{o.m_crossbridges} - , m_pad{o.m_pad} , m_meshcache{o.m_meshcache} , m_meshcache_valid{o.m_meshcache_valid} , m_model_height{o.m_model_height} - , ground_level{o.ground_level} {} SupportTreeBuilder &SupportTreeBuilder::operator=(SupportTreeBuilder &&o) @@ -87,11 +52,9 @@ SupportTreeBuilder &SupportTreeBuilder::operator=(SupportTreeBuilder &&o) m_pillars = std::move(o.m_pillars); m_bridges = std::move(o.m_bridges); m_crossbridges = std::move(o.m_crossbridges); - m_pad = std::move(o.m_pad); m_meshcache = std::move(o.m_meshcache); m_meshcache_valid = o.m_meshcache_valid; m_model_height = o.m_model_height; - ground_level = o.ground_level; return *this; } @@ -102,11 +65,9 @@ SupportTreeBuilder &SupportTreeBuilder::operator=(const SupportTreeBuilder &o) m_pillars = o.m_pillars; m_bridges = o.m_bridges; m_crossbridges = o.m_crossbridges; - m_pad = o.m_pad; m_meshcache = o.m_meshcache; m_meshcache_valid = o.m_meshcache_valid; m_model_height = o.m_model_height; - ground_level = o.ground_level; return *this; } @@ -116,7 +77,7 @@ void SupportTreeBuilder::add_pillar_base(long pid, double baseheight, double rad assert(pid >= 0 && size_t(pid) < m_pillars.size()); Pillar& pll = m_pillars[size_t(pid)]; m_pedestals.emplace_back(pll.endpt, std::min(baseheight, pll.height), - std::max(radius, pll.r), pll.r); + std::max(radius, pll.r_start), pll.r_start); m_pedestals.back().id = m_pedestals.size() - 1; m_meshcache_valid = false; @@ -174,7 +135,7 @@ const indexed_triangle_set &SupportTreeBuilder::merged_mesh(size_t steps) const return m_meshcache; } - m_meshcache = merged; + m_meshcache = std::move(merged); // The mesh will be passed by const-pointer to TriangleMeshSlicer, // which will need this. @@ -187,36 +148,28 @@ const indexed_triangle_set &SupportTreeBuilder::merged_mesh(size_t steps) const return m_meshcache; } -double SupportTreeBuilder::full_height() const -{ - if (merged_mesh().indices.empty() && !pad().empty()) - return pad().cfg.full_height(); - - double h = mesh_height(); - if (!pad().empty()) h += pad().cfg.required_elevation(); - return h; -} - const indexed_triangle_set &SupportTreeBuilder::merge_and_cleanup() { // in case the mesh is not generated, it should be... auto &ret = merged_mesh(); // Doing clear() does not garantee to release the memory. - m_heads = {}; - m_head_indices = {}; - m_pillars = {}; - m_junctions = {}; - m_bridges = {}; - + clear_and_shrink(m_heads); + clear_and_shrink(m_head_indices); + clear_and_shrink(m_pillars); + clear_and_shrink(m_junctions); + clear_and_shrink(m_bridges); + return ret; } const indexed_triangle_set &SupportTreeBuilder::retrieve_mesh(MeshType meshtype) const { + static const indexed_triangle_set EMPTY_MESH; + switch(meshtype) { case MeshType::Support: return merged_mesh(); - case MeshType::Pad: return pad().tmesh; + case MeshType::Pad: return EMPTY_MESH; //pad().tmesh; } return m_meshcache; diff --git a/src/libslic3r/SLA/SupportTreeBuilder.hpp b/src/libslic3r/SLA/SupportTreeBuilder.hpp index df5484e3ddf..93fbead997a 100644 --- a/src/libslic3r/SLA/SupportTreeBuilder.hpp +++ b/src/libslic3r/SLA/SupportTreeBuilder.hpp @@ -1,9 +1,8 @@ #ifndef SLA_SUPPORTTREEBUILDER_HPP #define SLA_SUPPORTTREEBUILDER_HPP -#include +#include #include -//#include #include #include #include @@ -50,13 +49,13 @@ namespace sla { * nearby pillar. */ -template double distance(const Vec& p) { - return std::sqrt(p.transpose() * p); +template T distance(const Vec& p) { + return p.norm(); } -template double distance(const Vec& pp1, const Vec& pp2) { - auto p = pp2 - pp1; - return distance(p); +template +T distance(const Vec& pp1, const Vec& pp2) { + return (pp1 - pp2).norm(); } const Vec3d DOWN = {0.0, 0.0, -1.0}; @@ -68,25 +67,32 @@ struct SupportTreeNode long id = ID_UNSET; // For identification withing a tree. }; +// A junction connecting bridges and pillars +struct Junction: public SupportTreeNode { + double r = 1; + Vec3d pos; + + Junction(const Vec3d &tr, double r_mm) : r(r_mm), pos(tr) {} +}; + // A pinhead originating from a support point struct Head: public SupportTreeNode { Vec3d dir = DOWN; Vec3d pos = {0, 0, 0}; - + double r_back_mm = 1; double r_pin_mm = 0.5; double width_mm = 2; double penetration_mm = 0.5; - // If there is a pillar connecting to this head, then the id will be set. long pillar_id = ID_UNSET; - + long bridge_id = ID_UNSET; - + inline void invalidate() { id = ID_UNSET; } inline bool is_valid() const { return id >= 0; } - + Head(double r_big_mm, double r_small_mm, double length_mm, @@ -104,29 +110,26 @@ struct Head: public SupportTreeNode { { return real_width() - penetration_mm; } - - inline Vec3d junction_point() const + + inline Junction junction() const { - return pos + (fullwidth() - r_back_mm) * dir; + Junction j{pos + (fullwidth() - r_back_mm) * dir, r_back_mm}; + j.id = -this->id; // Remember that this junction is from a head + + return j; } - - inline double request_pillar_radius(double radius) const + + inline Vec3d junction_point() const { - const double rmax = r_back_mm; - return radius > 0 && radius < rmax ? radius : rmax; + return junction().pos; } }; -// A junction connecting bridges and pillars -struct Junction: public SupportTreeNode { - double r = 1; - Vec3d pos; - - Junction(const Vec3d &tr, double r_mm) : r(r_mm), pos(tr) {} -}; - +// A straight pillar. Only has an endpoint and a height. No explicit starting +// point is given, as it would allow the pillar to be angled. +// Some connection info with other primitives can also be tracked. struct Pillar: public SupportTreeNode { - double height, r; + double height, r_start, r_end; Vec3d endpt; // If the pillar connects to a head, this is the id of that head @@ -139,8 +142,17 @@ struct Pillar: public SupportTreeNode { // How many pillars are cascaded with this one unsigned links = 0; - Pillar(const Vec3d &endp, double h, double radius = 1.): - height{h}, r(radius), endpt(endp), starts_from_head(false) {} + Pillar(const Vec3d &endp, double h, double start_radius, double end_radius) + : height{h} + , r_start(start_radius) + , r_end(end_radius) + , endpt(endp) + , starts_from_head(false) + {} + + Pillar(const Vec3d &endp, double h, double start_radius) + : Pillar(endp, h, start_radius, start_radius) + {} Vec3d startpoint() const { @@ -184,40 +196,25 @@ struct DiffBridge: public Bridge { DiffBridge(const Vec3d &p_s, const Vec3d &p_e, double r_s, double r_e) : Bridge{p_s, p_e, r_s}, end_r{r_e} {} -}; - -// A wrapper struct around the pad -struct Pad { - indexed_triangle_set tmesh; - PadConfig cfg; - double zlevel = 0; - - Pad() = default; - - Pad(const indexed_triangle_set &support_mesh, - const ExPolygons & model_contours, - double ground_level, - const PadConfig & pcfg, - ThrowOnCancel thr); - bool empty() const { return tmesh.indices.size() == 0; } + DiffBridge(const Junction &j_s, const Junction &j_e) + : Bridge{j_s.pos, j_e.pos, j_s.r}, end_r{j_e.r} + {} }; -// This class will hold the support tree meshes with some additional -// bookkeeping as well. Various parts of the support geometry are stored -// separately and are merged when the caller queries the merged mesh. The -// merged result is cached for fast subsequent delivery of the merged mesh -// which can be quite complex. The support tree creation algorithm can use an -// instance of this class as a somewhat higher level tool for crafting the 3D -// support mesh. Parts can be added with the appropriate methods such as -// add_head or add_pillar which forwards the constructor arguments and fills -// the IDs of these substructures. The IDs are basically indices into the -// arrays of the appropriate type (heads, pillars, etc...). One can later query -// e.g. a pillar for a specific head... -// -// The support pad is considered an auxiliary geometry and is not part of the -// merged mesh. It can be retrieved using a dedicated method (pad()) -class SupportTreeBuilder: public SupportTree { +// This class will hold the support tree parts (not meshes, but logical parts) +// with some additional bookkeeping as well. Various parts of the support +// geometry are stored separately and are merged when the caller queries the +// merged mesh (for every part, there is a meshing routine, see +// SupportTreeMesher.hpp). The merged result is cached for fast subsequent +// delivery of the merged mesh which can be quite complex. The support tree +// creation algorithm can use an instance of this class as a somewhat higher +// level tool for crafting the 3D support mesh. Parts can be added with the +// appropriate methods such as add_head or add_pillar which forwards the +// constructor arguments and fills the IDs of these substructures. The IDs are +// basically indices into the arrays of the appropriate type (heads, pillars, +// etc...). One can later query e.g. a pillar for a specific head... +class SupportTreeBuilder { // For heads it is beneficial to use the same IDs as for the support points. std::vector m_heads; std::vector m_head_indices; @@ -229,9 +226,9 @@ class SupportTreeBuilder: public SupportTree { std::vector m_pedestals; std::vector m_anchors; - Pad m_pad; + JobController m_ctl; - using Mutex = ccr::SpinningMutex; + using Mutex = tbb::spin_mutex; mutable indexed_triangle_set m_meshcache; mutable Mutex m_mutex; @@ -249,14 +246,15 @@ class SupportTreeBuilder: public SupportTree { } public: - double ground_level = 0; - SupportTreeBuilder() = default; + explicit SupportTreeBuilder(const JobController &ctl = {}) : m_ctl{ctl} {} SupportTreeBuilder(SupportTreeBuilder &&o); SupportTreeBuilder(const SupportTreeBuilder &o); SupportTreeBuilder& operator=(SupportTreeBuilder &&o); SupportTreeBuilder& operator=(const SupportTreeBuilder &o); + const JobController &ctl() const { return m_ctl; } + template Head& add_head(unsigned id, Args&&... args) { std::lock_guard lk(m_mutex); @@ -270,7 +268,7 @@ class SupportTreeBuilder: public SupportTree { return m_heads.back(); } - template long add_pillar(long headid, double length) + long add_pillar(long headid, double length) { std::lock_guard lk(m_mutex); if (m_pillars.capacity() < m_heads.size()) @@ -415,34 +413,21 @@ class SupportTreeBuilder: public SupportTree { return m_pillars[size_t(id)]; } - - const Pad& pad() const { return m_pad; } - + // WITHOUT THE PAD!!! const indexed_triangle_set &merged_mesh(size_t steps = 45) const; - // WITH THE PAD - double full_height() const; - - // WITHOUT THE PAD!!! - inline double mesh_height() const - { - if (!m_meshcache_valid) merged_mesh(); - return m_model_height; - } - // Intended to be called after the generation is fully complete const indexed_triangle_set & merge_and_cleanup(); - - // Implement SupportTree interface: - const indexed_triangle_set &add_pad(const ExPolygons &modelbase, - const PadConfig & pcfg) override; + const indexed_triangle_set &retrieve_mesh( + MeshType meshtype = MeshType::Support) const; - void remove_pad() override { m_pad = Pad(); } - - virtual const indexed_triangle_set &retrieve_mesh( - MeshType meshtype = MeshType::Support) const override; + void retrieve_full_mesh(indexed_triangle_set &outmesh) const + { + its_merge(outmesh, retrieve_mesh(MeshType::Support)); + its_merge(outmesh, retrieve_mesh(MeshType::Pad)); + } }; }} // namespace Slic3r::sla diff --git a/src/libslic3r/SLA/SupportTreeBuildsteps.cpp b/src/libslic3r/SLA/SupportTreeBuildsteps.cpp deleted file mode 100644 index 6134e1f5ab8..00000000000 --- a/src/libslic3r/SLA/SupportTreeBuildsteps.cpp +++ /dev/null @@ -1,1277 +0,0 @@ -#include - -#include -#include -#include - -namespace Slic3r { -namespace sla { - -using Slic3r::opt::initvals; -using Slic3r::opt::bounds; -using Slic3r::opt::StopCriteria; -using Slic3r::opt::Optimizer; -using Slic3r::opt::AlgNLoptSubplex; -using Slic3r::opt::AlgNLoptGenetic; - -StopCriteria get_criteria(const SupportTreeConfig &cfg) -{ - return StopCriteria{} - .rel_score_diff(cfg.optimizer_rel_score_diff) - .max_iterations(cfg.optimizer_max_iterations); -} - -template -static Hit min_hit(const C &hits) -{ - auto mit = std::min_element(hits.begin(), hits.end(), - [](const Hit &h1, const Hit &h2) { - return h1.distance() < h2.distance(); - }); - - return *mit; -} - -SupportTreeBuildsteps::SupportTreeBuildsteps(SupportTreeBuilder & builder, - const SupportableMesh &sm) - : m_cfg(sm.cfg) - , m_mesh(sm.emesh) - , m_support_pts(sm.pts) - , m_support_nmls(sm.pts.size(), 3) - , m_builder(builder) - , m_points(sm.pts.size(), 3) - , m_thr(builder.ctl().cancelfn) -{ - // Prepare the support points in Eigen/IGL format as well, we will use - // it mostly in this form. - - long i = 0; - for (const SupportPoint &sp : m_support_pts) { - m_points.row(i)(X) = double(sp.pos(X)); - m_points.row(i)(Y) = double(sp.pos(Y)); - m_points.row(i)(Z) = double(sp.pos(Z)); - ++i; - } -} - -bool SupportTreeBuildsteps::execute(SupportTreeBuilder & builder, - const SupportableMesh &sm) -{ - if(sm.pts.empty()) return false; - - builder.ground_level = sm.emesh.ground_level() - sm.cfg.object_elevation_mm; - - SupportTreeBuildsteps alg(builder, sm); - - // Let's define the individual steps of the processing. We can experiment - // later with the ordering and the dependencies between them. - enum Steps { - BEGIN, - FILTER, - PINHEADS, - CLASSIFY, - ROUTING_GROUND, - ROUTING_NONGROUND, - CASCADE_PILLARS, - MERGE_RESULT, - DONE, - ABORT, - NUM_STEPS - //... - }; - - // Collect the algorithm steps into a nice sequence - std::array, NUM_STEPS> program = { - [] () { - // Begin... - // Potentially clear up the shared data (not needed for now) - }, - - std::bind(&SupportTreeBuildsteps::filter, &alg), - - std::bind(&SupportTreeBuildsteps::add_pinheads, &alg), - - std::bind(&SupportTreeBuildsteps::classify, &alg), - - std::bind(&SupportTreeBuildsteps::routing_to_ground, &alg), - - std::bind(&SupportTreeBuildsteps::routing_to_model, &alg), - - std::bind(&SupportTreeBuildsteps::interconnect_pillars, &alg), - - std::bind(&SupportTreeBuildsteps::merge_result, &alg), - - [] () { - // Done - }, - - [] () { - // Abort - } - }; - - Steps pc = BEGIN; - - if(sm.cfg.ground_facing_only) { - program[ROUTING_NONGROUND] = []() { - BOOST_LOG_TRIVIAL(info) - << "Skipping model-facing supports as requested."; - }; - } - - // Let's define a simple automaton that will run our program. - auto progress = [&builder, &pc] () { - static const std::array stepstr { - "Starting", - "Filtering", - "Generate pinheads", - "Classification", - "Routing to ground", - "Routing supports to model surface", - "Interconnecting pillars", - "Merging support mesh", - "Done", - "Abort" - }; - - static const std::array stepstate { - 0, - 10, - 30, - 50, - 60, - 70, - 80, - 99, - 100, - 0 - }; - - if(builder.ctl().stopcondition()) pc = ABORT; - - switch(pc) { - case BEGIN: pc = FILTER; break; - case FILTER: pc = PINHEADS; break; - case PINHEADS: pc = CLASSIFY; break; - case CLASSIFY: pc = ROUTING_GROUND; break; - case ROUTING_GROUND: pc = ROUTING_NONGROUND; break; - case ROUTING_NONGROUND: pc = CASCADE_PILLARS; break; - case CASCADE_PILLARS: pc = MERGE_RESULT; break; - case MERGE_RESULT: pc = DONE; break; - case DONE: - case ABORT: break; - default: ; - } - - builder.ctl().statuscb(stepstate[pc], stepstr[pc]); - }; - - // Just here we run the computation... - while(pc < DONE) { - progress(); - program[pc](); - } - - return pc == ABORT; -} - -IndexedMesh::hit_result SupportTreeBuildsteps::pinhead_mesh_intersect( - const Vec3d &s, - const Vec3d &dir, - double r_pin, - double r_back, - double width, - double sd) -{ - static const size_t SAMPLES = 8; - - // Move away slightly from the touching point to avoid raycasting on the - // inner surface of the mesh. - - auto& m = m_mesh; - using HitResult = IndexedMesh::hit_result; - - // Hit results - std::array hits; - - struct Rings { - double rpin; - double rback; - Vec3d spin; - Vec3d sback; - PointRing ring; - - Vec3d backring(size_t idx) { return ring.get(idx, sback, rback); } - Vec3d pinring(size_t idx) { return ring.get(idx, spin, rpin); } - } rings {r_pin + sd, r_back + sd, s, s + width * dir, dir}; - - // We will shoot multiple rays from the head pinpoint in the direction - // of the pinhead robe (side) surface. The result will be the smallest - // hit distance. - - ccr::for_each(size_t(0), hits.size(), - [&m, &rings, sd, &hits](size_t i) { - - // Point on the circle on the pin sphere - Vec3d ps = rings.pinring(i); - // This is the point on the circle on the back sphere - Vec3d p = rings.backring(i); - - auto &hit = hits[i]; - - // Point ps is not on mesh but can be inside or - // outside as well. This would cause many problems - // with ray-casting. To detect the position we will - // use the ray-casting result (which has an is_inside - // predicate). - - Vec3d n = (p - ps).normalized(); - auto q = m.query_ray_hit(ps + sd * n, n); - - if (q.is_inside()) { // the hit is inside the model - if (q.distance() > rings.rpin) { - // If we are inside the model and the hit - // distance is bigger than our pin circle - // diameter, it probably indicates that the - // support point was already inside the - // model, or there is really no space - // around the point. We will assign a zero - // hit distance to these cases which will - // enforce the function return value to be - // an invalid ray with zero hit distance. - // (see min_element at the end) - hit = HitResult(0.0); - } else { - // re-cast the ray from the outside of the - // object. The starting point has an offset - // of 2*safety_distance because the - // original ray has also had an offset - auto q2 = m.query_ray_hit(ps + (q.distance() + 2 * sd) * n, n); - hit = q2; - } - } else - hit = q; - }); - - return min_hit(hits); -} - -IndexedMesh::hit_result SupportTreeBuildsteps::bridge_mesh_intersect( - const Vec3d &src, const Vec3d &dir, double r, double sd) -{ - static const size_t SAMPLES = 8; - PointRing ring{dir}; - - using Hit = IndexedMesh::hit_result; - - // Hit results - std::array hits; - - ccr::for_each(size_t(0), hits.size(), - [this, r, src, /*ins_check,*/ &ring, dir, sd, &hits] (size_t i) - { - Hit &hit = hits[i]; - - // Point on the circle on the pin sphere - Vec3d p = ring.get(i, src, r + sd); - - auto hr = m_mesh.query_ray_hit(p + r * dir, dir); - - if(/*ins_check && */hr.is_inside()) { - if(hr.distance() > 2 * r + sd) hit = Hit(0.0); - else { - // re-cast the ray from the outside of the object - hit = m_mesh.query_ray_hit(p + (hr.distance() + EPSILON) * dir, dir); - } - } else hit = hr; - }); - - return min_hit(hits); -} - -bool SupportTreeBuildsteps::interconnect(const Pillar &pillar, - const Pillar &nextpillar) -{ - // We need to get the starting point of the zig-zag pattern. We have to - // be aware that the two head junctions are at different heights. We - // may start from the lowest junction and call it a day but this - // strategy would leave unconnected a lot of pillar duos where the - // shorter pillar is too short to start a new bridge but the taller - // pillar could still be bridged with the shorter one. - bool was_connected = false; - - Vec3d supper = pillar.startpoint(); - Vec3d slower = nextpillar.startpoint(); - Vec3d eupper = pillar.endpoint(); - Vec3d elower = nextpillar.endpoint(); - - double zmin = m_builder.ground_level + m_cfg.base_height_mm; - eupper(Z) = std::max(eupper(Z), zmin); - elower(Z) = std::max(elower(Z), zmin); - - // The usable length of both pillars should be positive - if(slower(Z) - elower(Z) < 0) return false; - if(supper(Z) - eupper(Z) < 0) return false; - - double pillar_dist = distance(Vec2d{slower(X), slower(Y)}, - Vec2d{supper(X), supper(Y)}); - double bridge_distance = pillar_dist / std::cos(-m_cfg.bridge_slope); - double zstep = pillar_dist * std::tan(-m_cfg.bridge_slope); - - if(pillar_dist < 2 * m_cfg.head_back_radius_mm || - pillar_dist > m_cfg.max_pillar_link_distance_mm) return false; - - if(supper(Z) < slower(Z)) supper.swap(slower); - if(eupper(Z) < elower(Z)) eupper.swap(elower); - - double startz = 0, endz = 0; - - startz = slower(Z) - zstep < supper(Z) ? slower(Z) - zstep : slower(Z); - endz = eupper(Z) + zstep > elower(Z) ? eupper(Z) + zstep : eupper(Z); - - if(slower(Z) - eupper(Z) < std::abs(zstep)) { - // no space for even one cross - - // Get max available space - startz = std::min(supper(Z), slower(Z) - zstep); - endz = std::max(eupper(Z) + zstep, elower(Z)); - - // Align to center - double available_dist = (startz - endz); - double rounds = std::floor(available_dist / std::abs(zstep)); - startz -= 0.5 * (available_dist - rounds * std::abs(zstep)); - } - - auto pcm = m_cfg.pillar_connection_mode; - bool docrosses = - pcm == PillarConnectionMode::cross || - (pcm == PillarConnectionMode::dynamic && - pillar_dist > 2*m_cfg.base_radius_mm); - - // 'sj' means starting junction, 'ej' is the end junction of a bridge. - // They will be swapped in every iteration thus the zig-zag pattern. - // According to a config parameter, a second bridge may be added which - // results in a cross connection between the pillars. - Vec3d sj = supper, ej = slower; sj(Z) = startz; ej(Z) = sj(Z) + zstep; - - // TODO: This is a workaround to not have a faulty last bridge - while(ej(Z) >= eupper(Z) /*endz*/) { - if(bridge_mesh_distance(sj, dirv(sj, ej), pillar.r) >= bridge_distance) - { - m_builder.add_crossbridge(sj, ej, pillar.r); - was_connected = true; - } - - // double bridging: (crosses) - if(docrosses) { - Vec3d sjback(ej(X), ej(Y), sj(Z)); - Vec3d ejback(sj(X), sj(Y), ej(Z)); - if (sjback(Z) <= slower(Z) && ejback(Z) >= eupper(Z) && - bridge_mesh_distance(sjback, dirv(sjback, ejback), - pillar.r) >= bridge_distance) { - // need to check collision for the cross stick - m_builder.add_crossbridge(sjback, ejback, pillar.r); - was_connected = true; - } - } - - sj.swap(ej); - ej(Z) = sj(Z) + zstep; - } - - return was_connected; -} - -bool SupportTreeBuildsteps::connect_to_nearpillar(const Head &head, - long nearpillar_id) -{ - auto nearpillar = [this, nearpillar_id]() -> const Pillar& { - return m_builder.pillar(nearpillar_id); - }; - - if (m_builder.bridgecount(nearpillar()) > m_cfg.max_bridges_on_pillar) - return false; - - Vec3d headjp = head.junction_point(); - Vec3d nearjp_u = nearpillar().startpoint(); - Vec3d nearjp_l = nearpillar().endpoint(); - - double r = head.r_back_mm; - double d2d = distance(to_2d(headjp), to_2d(nearjp_u)); - double d3d = distance(headjp, nearjp_u); - - double hdiff = nearjp_u(Z) - headjp(Z); - double slope = std::atan2(hdiff, d2d); - - Vec3d bridgestart = headjp; - Vec3d bridgeend = nearjp_u; - double max_len = r * m_cfg.max_bridge_length_mm / m_cfg.head_back_radius_mm; - double max_slope = m_cfg.bridge_slope; - double zdiff = 0.0; - - // check the default situation if feasible for a bridge - if(d3d > max_len || slope > -max_slope) { - // not feasible to connect the two head junctions. We have to search - // for a suitable touch point. - - double Zdown = headjp(Z) + d2d * std::tan(-max_slope); - Vec3d touchjp = bridgeend; touchjp(Z) = Zdown; - double D = distance(headjp, touchjp); - zdiff = Zdown - nearjp_u(Z); - - if(zdiff > 0) { - Zdown -= zdiff; - bridgestart(Z) -= zdiff; - touchjp(Z) = Zdown; - - double t = bridge_mesh_distance(headjp, DOWN, r); - - // We can't insert a pillar under the source head to connect - // with the nearby pillar's starting junction - if(t < zdiff) return false; - } - - if(Zdown <= nearjp_u(Z) && Zdown >= nearjp_l(Z) && D < max_len) - bridgeend(Z) = Zdown; - else - return false; - } - - // There will be a minimum distance from the ground where the - // bridge is allowed to connect. This is an empiric value. - double minz = m_builder.ground_level + 4 * head.r_back_mm; - if(bridgeend(Z) < minz) return false; - - double t = bridge_mesh_distance(bridgestart, dirv(bridgestart, bridgeend), r); - - // Cannot insert the bridge. (further search might not worth the hassle) - if(t < distance(bridgestart, bridgeend)) return false; - - std::lock_guard lk(m_bridge_mutex); - - if (m_builder.bridgecount(nearpillar()) < m_cfg.max_bridges_on_pillar) { - // A partial pillar is needed under the starting head. - if(zdiff > 0) { - m_builder.add_pillar(head.id, headjp.z() - bridgestart.z()); - m_builder.add_junction(bridgestart, r); - m_builder.add_bridge(bridgestart, bridgeend, r); - } else { - m_builder.add_bridge(head.id, bridgeend); - } - - m_builder.increment_bridges(nearpillar()); - } else return false; - - return true; -} - -bool SupportTreeBuildsteps::create_ground_pillar(const Vec3d &hjp, - const Vec3d &sourcedir, - double radius, - long head_id) -{ - Vec3d jp = hjp, endp = jp, dir = sourcedir; - long pillar_id = SupportTreeNode::ID_UNSET; - bool can_add_base = false, non_head = false; - - double gndlvl = 0.; // The Z level where pedestals should be - double jp_gnd = 0.; // The lowest Z where a junction center can be - double gap_dist = 0.; // The gap distance between the model and the pad - - auto to_floor = [&gndlvl](const Vec3d &p) { return Vec3d{p.x(), p.y(), gndlvl}; }; - - auto eval_limits = [this, &radius, &can_add_base, &gndlvl, &gap_dist, &jp_gnd] - (bool base_en = true) - { - can_add_base = base_en && radius >= m_cfg.head_back_radius_mm; - double base_r = can_add_base ? m_cfg.base_radius_mm : 0.; - gndlvl = m_builder.ground_level; - if (!can_add_base) gndlvl -= m_mesh.ground_level_offset(); - jp_gnd = gndlvl + (can_add_base ? 0. : m_cfg.head_back_radius_mm); - gap_dist = m_cfg.pillar_base_safety_distance_mm + base_r + EPSILON; - }; - - eval_limits(); - - // We are dealing with a mini pillar that's potentially too long - if (radius < m_cfg.head_back_radius_mm && jp.z() - gndlvl > 20 * radius) - { - std::optional diffbr = - search_widening_path(jp, dir, radius, m_cfg.head_back_radius_mm); - - if (diffbr && diffbr->endp.z() > jp_gnd) { - auto &br = m_builder.add_diffbridge(*diffbr); - if (head_id >= 0) m_builder.head(head_id).bridge_id = br.id; - endp = diffbr->endp; - radius = diffbr->end_r; - m_builder.add_junction(endp, radius); - non_head = true; - dir = diffbr->get_dir(); - eval_limits(); - } else return false; - } - - if (m_cfg.object_elevation_mm < EPSILON) - { - // get a suitable direction for the corrector bridge. It is the - // original sourcedir's azimuth but the polar angle is saturated to the - // configured bridge slope. - auto [polar, azimuth] = dir_to_spheric(dir); - polar = PI - m_cfg.bridge_slope; - Vec3d d = spheric_to_dir(polar, azimuth).normalized(); - double t = bridge_mesh_distance(endp, d, radius); - double tmax = std::min(m_cfg.max_bridge_length_mm, t); - t = 0.; - - double zd = endp.z() - jp_gnd; - double tmax2 = zd / std::sqrt(1 - m_cfg.bridge_slope * m_cfg.bridge_slope); - tmax = std::min(tmax, tmax2); - - Vec3d nexp = endp; - double dlast = 0.; - while (((dlast = std::sqrt(m_mesh.squared_distance(to_floor(nexp)))) < gap_dist || - !std::isinf(bridge_mesh_distance(nexp, DOWN, radius))) && t < tmax) { - t += radius; - nexp = endp + t * d; - } - - if (dlast < gap_dist && can_add_base) { - nexp = endp; - t = 0.; - can_add_base = false; - eval_limits(can_add_base); - - zd = endp.z() - jp_gnd; - tmax2 = zd / std::sqrt(1 - m_cfg.bridge_slope * m_cfg.bridge_slope); - tmax = std::min(tmax, tmax2); - - while (((dlast = std::sqrt(m_mesh.squared_distance(to_floor(nexp)))) < gap_dist || - !std::isinf(bridge_mesh_distance(nexp, DOWN, radius))) && t < tmax) { - t += radius; - nexp = endp + t * d; - } - } - - // Could not find a path to avoid the pad gap - if (dlast < gap_dist) return false; - - if (t > 0.) { // Need to make additional bridge - const Bridge& br = m_builder.add_bridge(endp, nexp, radius); - if (head_id >= 0) m_builder.head(head_id).bridge_id = br.id; - - m_builder.add_junction(nexp, radius); - endp = nexp; - non_head = true; - } - } - - Vec3d gp = to_floor(endp); - double h = endp.z() - gp.z(); - - pillar_id = head_id >= 0 && !non_head ? m_builder.add_pillar(head_id, h) : - m_builder.add_pillar(gp, h, radius); - - if (can_add_base) - add_pillar_base(pillar_id); - - if(pillar_id >= 0) // Save the pillar endpoint in the spatial index - m_pillar_index.guarded_insert(m_builder.pillar(pillar_id).endpt, - unsigned(pillar_id)); - - return true; -} - -std::optional SupportTreeBuildsteps::search_widening_path( - const Vec3d &jp, const Vec3d &dir, double radius, double new_radius) -{ - double w = radius + 2 * m_cfg.head_back_radius_mm; - double stopval = w + jp.z() - m_builder.ground_level; - Optimizer solver(get_criteria(m_cfg).stop_score(stopval)); - - auto [polar, azimuth] = dir_to_spheric(dir); - - double fallback_ratio = radius / m_cfg.head_back_radius_mm; - - auto oresult = solver.to_max().optimize( - [this, jp, radius, new_radius](const opt::Input<3> &input) { - auto &[plr, azm, t] = input; - - auto d = spheric_to_dir(plr, azm).normalized(); - double ret = pinhead_mesh_intersect(jp, d, radius, new_radius, t) - .distance(); - double down = bridge_mesh_distance(jp + t * d, d, new_radius); - - if (ret > t && std::isinf(down)) - ret += jp.z() - m_builder.ground_level; - - return ret; - }, - initvals({polar, azimuth, w}), // start with what we have - bounds({ - {PI - m_cfg.bridge_slope, PI}, // Must not exceed the slope limit - {-PI, PI}, // azimuth can be a full search - {radius + m_cfg.head_back_radius_mm, - fallback_ratio * m_cfg.max_bridge_length_mm} - })); - - if (oresult.score >= stopval) { - polar = std::get<0>(oresult.optimum); - azimuth = std::get<1>(oresult.optimum); - double t = std::get<2>(oresult.optimum); - Vec3d endp = jp + t * spheric_to_dir(polar, azimuth); - - return DiffBridge(jp, endp, radius, m_cfg.head_back_radius_mm); - } - - return {}; -} - -void SupportTreeBuildsteps::filter() -{ - // Get the points that are too close to each other and keep only the - // first one - auto aliases = cluster(m_points, D_SP, 2); - - PtIndices filtered_indices; - filtered_indices.reserve(aliases.size()); - m_iheads.reserve(aliases.size()); - m_iheadless.reserve(aliases.size()); - for(auto& a : aliases) { - // Here we keep only the front point of the cluster. - filtered_indices.emplace_back(a.front()); - } - - // calculate the normals to the triangles for filtered points - auto nmls = sla::normals(m_points, m_mesh, m_cfg.head_front_radius_mm, - m_thr, filtered_indices); - - // Not all of the support points have to be a valid position for - // support creation. The angle may be inappropriate or there may - // not be enough space for the pinhead. Filtering is applied for - // these reasons. - - std::vector heads; heads.reserve(m_support_pts.size()); - for (const SupportPoint &sp : m_support_pts) { - m_thr(); - heads.emplace_back( - std::nan(""), - sp.head_front_radius, - 0., - m_cfg.head_penetration_mm, - Vec3d::Zero(), // dir - sp.pos.cast() // displacement - ); - } - - std::function filterfn; - filterfn = [this, &nmls, &heads, &filterfn](unsigned fidx, size_t i, double back_r) { - m_thr(); - - auto n = nmls.row(Eigen::Index(i)); - - // for all normals we generate the spherical coordinates and - // saturate the polar angle to 45 degrees from the bottom then - // convert back to standard coordinates to get the new normal. - // Then we just create a quaternion from the two normals - // (Quaternion::FromTwoVectors) and apply the rotation to the - // arrow head. - - auto [polar, azimuth] = dir_to_spheric(n); - - // skip if the tilt is not sane - if (polar < PI - m_cfg.normal_cutoff_angle) return; - - // We saturate the polar angle to 3pi/4 - polar = std::max(polar, PI - m_cfg.bridge_slope); - - // save the head (pinpoint) position - Vec3d hp = m_points.row(fidx); - - double lmin = m_cfg.head_width_mm, lmax = lmin; - - if (back_r < m_cfg.head_back_radius_mm) { - lmin = 0., lmax = m_cfg.head_penetration_mm; - } - - // The distance needed for a pinhead to not collide with model. - double w = lmin + 2 * back_r + 2 * m_cfg.head_front_radius_mm - - m_cfg.head_penetration_mm; - - double pin_r = double(m_support_pts[fidx].head_front_radius); - - // Reassemble the now corrected normal - auto nn = spheric_to_dir(polar, azimuth).normalized(); - - // check available distance - IndexedMesh::hit_result t = pinhead_mesh_intersect(hp, nn, pin_r, - back_r, w); - - if (t.distance() < w) { - // Let's try to optimize this angle, there might be a - // viable normal that doesn't collide with the model - // geometry and its very close to the default. - - Optimizer solver(get_criteria(m_cfg)); - solver.seed(0); // we want deterministic behavior - - auto oresult = solver.to_max().optimize( - [this, pin_r, back_r, hp](const opt::Input<3> &input) - { - auto &[plr, azm, l] = input; - - auto dir = spheric_to_dir(plr, azm).normalized(); - - return pinhead_mesh_intersect( - hp, dir, pin_r, back_r, l).distance(); - }, - initvals({polar, azimuth, (lmin + lmax) / 2.}), // start with what we have - bounds({ - {PI - m_cfg.bridge_slope, PI}, // Must not exceed the slope limit - {-PI, PI}, // azimuth can be a full search - {lmin, lmax} - })); - - if(oresult.score > w) { - polar = std::get<0>(oresult.optimum); - azimuth = std::get<1>(oresult.optimum); - nn = spheric_to_dir(polar, azimuth).normalized(); - lmin = std::get<2>(oresult.optimum); - t = IndexedMesh::hit_result(oresult.score); - } - } - - if (t.distance() > w && hp(Z) + w * nn(Z) >= m_builder.ground_level) { - Head &h = heads[fidx]; - h.id = fidx; h.dir = nn; h.width_mm = lmin; h.r_back_mm = back_r; - } else if (back_r > m_cfg.head_fallback_radius_mm) { - filterfn(fidx, i, m_cfg.head_fallback_radius_mm); - } - }; - - ccr::for_each(size_t(0), filtered_indices.size(), - [this, &filterfn, &filtered_indices] (size_t i) { - filterfn(filtered_indices[i], i, m_cfg.head_back_radius_mm); - }); - - for (size_t i = 0; i < heads.size(); ++i) - if (heads[i].is_valid()) { - m_builder.add_head(i, heads[i]); - m_iheads.emplace_back(i); - } - - m_thr(); -} - -void SupportTreeBuildsteps::add_pinheads() -{ -} - -void SupportTreeBuildsteps::classify() -{ - // We should first get the heads that reach the ground directly - PtIndices ground_head_indices; - ground_head_indices.reserve(m_iheads.size()); - m_iheads_onmodel.reserve(m_iheads.size()); - - // First we decide which heads reach the ground and can be full - // pillars and which shall be connected to the model surface (or - // search a suitable path around the surface that leads to the - // ground -- TODO) - for(unsigned i : m_iheads) { - m_thr(); - - Head &head = m_builder.head(i); - double r = head.r_back_mm; - Vec3d headjp = head.junction_point(); - - // collision check - auto hit = bridge_mesh_intersect(headjp, DOWN, r); - - if(std::isinf(hit.distance())) ground_head_indices.emplace_back(i); - else if(m_cfg.ground_facing_only) head.invalidate(); - else m_iheads_onmodel.emplace_back(i); - - m_head_to_ground_scans[i] = hit; - } - - // We want to search for clusters of points that are far enough - // from each other in the XY plane to not cross their pillar bases - // These clusters of support points will join in one pillar, - // possibly in their centroid support point. - - auto pointfn = [this](unsigned i) { - return m_builder.head(i).junction_point(); - }; - - auto predicate = [this](const PointIndexEl &e1, - const PointIndexEl &e2) { - double d2d = distance(to_2d(e1.first), to_2d(e2.first)); - double d3d = distance(e1.first, e2.first); - return d2d < 2 * m_cfg.base_radius_mm - && d3d < m_cfg.max_bridge_length_mm; - }; - - m_pillar_clusters = cluster(ground_head_indices, pointfn, predicate, - m_cfg.max_bridges_on_pillar); -} - -void SupportTreeBuildsteps::routing_to_ground() -{ - ClusterEl cl_centroids; - cl_centroids.reserve(m_pillar_clusters.size()); - - for (auto &cl : m_pillar_clusters) { - m_thr(); - - // place all the centroid head positions into the index. We - // will query for alternative pillar positions. If a sidehead - // cannot connect to the cluster centroid, we have to search - // for another head with a full pillar. Also when there are two - // elements in the cluster, the centroid is arbitrary and the - // sidehead is allowed to connect to a nearby pillar to - // increase structural stability. - - if (cl.empty()) continue; - - // get the current cluster centroid - auto & thr = m_thr; - const auto &points = m_points; - - long lcid = cluster_centroid( - cl, [&points](size_t idx) { return points.row(long(idx)); }, - [thr](const Vec3d &p1, const Vec3d &p2) { - thr(); - return distance(Vec2d(p1(X), p1(Y)), Vec2d(p2(X), p2(Y))); - }); - - assert(lcid >= 0); - unsigned hid = cl[size_t(lcid)]; // Head ID - - cl_centroids.emplace_back(hid); - - Head &h = m_builder.head(hid); - - if (!create_ground_pillar(h.junction_point(), h.dir, h.r_back_mm, h.id)) { - BOOST_LOG_TRIVIAL(warning) - << "Pillar cannot be created for support point id: " << hid; - m_iheads_onmodel.emplace_back(h.id); - continue; - } - } - - // now we will go through the clusters ones again and connect the - // sidepoints with the cluster centroid (which is a ground pillar) - // or a nearby pillar if the centroid is unreachable. - size_t ci = 0; - for (auto cl : m_pillar_clusters) { - m_thr(); - - auto cidx = cl_centroids[ci++]; - - auto q = m_pillar_index.query(m_builder.head(cidx).junction_point(), 1); - if (!q.empty()) { - long centerpillarID = q.front().second; - for (auto c : cl) { - m_thr(); - if (c == cidx) continue; - - auto &sidehead = m_builder.head(c); - - if (!connect_to_nearpillar(sidehead, centerpillarID) && - !search_pillar_and_connect(sidehead)) { - Vec3d pstart = sidehead.junction_point(); - // Vec3d pend = Vec3d{pstart(X), pstart(Y), gndlvl}; - // Could not find a pillar, create one - create_ground_pillar(pstart, sidehead.dir, sidehead.r_back_mm, sidehead.id); - } - } - } - } -} - -bool SupportTreeBuildsteps::connect_to_ground(Head &head, const Vec3d &dir) -{ - auto hjp = head.junction_point(); - double r = head.r_back_mm; - double t = bridge_mesh_distance(hjp, dir, head.r_back_mm); - double d = 0, tdown = 0; - t = std::min(t, m_cfg.max_bridge_length_mm * r / m_cfg.head_back_radius_mm); - - while (d < t && !std::isinf(tdown = bridge_mesh_distance(hjp + d * dir, DOWN, r))) - d += r; - - if(!std::isinf(tdown)) return false; - - Vec3d endp = hjp + d * dir; - bool ret = false; - - if ((ret = create_ground_pillar(endp, dir, head.r_back_mm))) { - m_builder.add_bridge(head.id, endp); - m_builder.add_junction(endp, head.r_back_mm); - } - - return ret; -} - -bool SupportTreeBuildsteps::connect_to_ground(Head &head) -{ - if (connect_to_ground(head, head.dir)) return true; - - // Optimize bridge direction: - // Straight path failed so we will try to search for a suitable - // direction out of the cavity. - auto [polar, azimuth] = dir_to_spheric(head.dir); - - Optimizer solver(get_criteria(m_cfg).stop_score(1e6)); - solver.seed(0); // we want deterministic behavior - - double r_back = head.r_back_mm; - Vec3d hjp = head.junction_point(); - auto oresult = solver.to_max().optimize( - [this, hjp, r_back](const opt::Input<2> &input) { - auto &[plr, azm] = input; - Vec3d n = spheric_to_dir(plr, azm).normalized(); - return bridge_mesh_distance(hjp, n, r_back); - }, - initvals({polar, azimuth}), // let's start with what we have - bounds({ {PI - m_cfg.bridge_slope, PI}, {-PI, PI} }) - ); - - Vec3d bridgedir = spheric_to_dir(oresult.optimum).normalized(); - return connect_to_ground(head, bridgedir); -} - -bool SupportTreeBuildsteps::connect_to_model_body(Head &head) -{ - if (head.id <= SupportTreeNode::ID_UNSET) return false; - - auto it = m_head_to_ground_scans.find(unsigned(head.id)); - if (it == m_head_to_ground_scans.end()) return false; - - auto &hit = it->second; - - if (!hit.is_hit()) { - // TODO scan for potential anchor points on model surface - return false; - } - - Vec3d hjp = head.junction_point(); - double zangle = std::asin(hit.direction()(Z)); - zangle = std::max(zangle, PI/4); - double h = std::sin(zangle) * head.fullwidth(); - - // The width of the tail head that we would like to have... - h = std::min(hit.distance() - head.r_back_mm, h); - - // If this is a mini pillar dont bother with the tail width, can be 0. - if (head.r_back_mm < m_cfg.head_back_radius_mm) h = std::max(h, 0.); - else if (h <= 0.) return false; - - Vec3d endp{hjp(X), hjp(Y), hjp(Z) - hit.distance() + h}; - auto center_hit = m_mesh.query_ray_hit(hjp, DOWN); - - double hitdiff = center_hit.distance() - hit.distance(); - Vec3d hitp = std::abs(hitdiff) < 2*head.r_back_mm? - center_hit.position() : hit.position(); - - long pillar_id = m_builder.add_pillar(head.id, hjp.z() - endp.z()); - Pillar &pill = m_builder.pillar(pillar_id); - - Vec3d taildir = endp - hitp; - double dist = (hitp - endp).norm() + m_cfg.head_penetration_mm; - double w = dist - 2 * head.r_pin_mm - head.r_back_mm; - - if (w < 0.) { - BOOST_LOG_TRIVIAL(error) << "Pinhead width is negative!"; - w = 0.; - } - - m_builder.add_anchor(head.r_back_mm, head.r_pin_mm, w, - m_cfg.head_penetration_mm, taildir, hitp); - - m_pillar_index.guarded_insert(pill.endpoint(), pill.id); - - return true; -} - -bool SupportTreeBuildsteps::search_pillar_and_connect(const Head &source) -{ - // Hope that a local copy takes less time than the whole search loop. - // We also need to remove elements progressively from the copied index. - PointIndex spindex = m_pillar_index.guarded_clone(); - - long nearest_id = SupportTreeNode::ID_UNSET; - - Vec3d querypt = source.junction_point(); - - while(nearest_id < 0 && !spindex.empty()) { m_thr(); - // loop until a suitable head is not found - // if there is a pillar closer than the cluster center - // (this may happen as the clustering is not perfect) - // than we will bridge to this closer pillar - - Vec3d qp(querypt(X), querypt(Y), m_builder.ground_level); - auto qres = spindex.nearest(qp, 1); - if(qres.empty()) break; - - auto ne = qres.front(); - nearest_id = ne.second; - - if(nearest_id >= 0) { - if (size_t(nearest_id) < m_builder.pillarcount()) { - if(!connect_to_nearpillar(source, nearest_id) || - m_builder.pillar(nearest_id).r < source.r_back_mm) { - nearest_id = SupportTreeNode::ID_UNSET; // continue searching - spindex.remove(ne); // without the current pillar - } - } - } - } - - return nearest_id >= 0; -} - -void SupportTreeBuildsteps::routing_to_model() -{ - // We need to check if there is an easy way out to the bed surface. - // If it can be routed there with a bridge shorter than - // min_bridge_distance. - - ccr::for_each(m_iheads_onmodel.begin(), m_iheads_onmodel.end(), - [this] (const unsigned idx) { - m_thr(); - - auto& head = m_builder.head(idx); - - // Search nearby pillar - if (search_pillar_and_connect(head)) { return; } - - // Cannot connect to nearby pillar. We will try to search for - // a route to the ground. - if (connect_to_ground(head)) { return; } - - // No route to the ground, so connect to the model body as a last resort - if (connect_to_model_body(head)) { return; } - - // We have failed to route this head. - BOOST_LOG_TRIVIAL(warning) - << "Failed to route model facing support point. ID: " << idx; - - head.invalidate(); - }); -} - -void SupportTreeBuildsteps::interconnect_pillars() -{ - // Now comes the algorithm that connects pillars with each other. - // Ideally every pillar should be connected with at least one of its - // neighbors if that neighbor is within max_pillar_link_distance - - // Pillars with height exceeding H1 will require at least one neighbor - // to connect with. Height exceeding H2 require two neighbors. - double H1 = m_cfg.max_solo_pillar_height_mm; - double H2 = m_cfg.max_dual_pillar_height_mm; - double d = m_cfg.max_pillar_link_distance_mm; - - //A connection between two pillars only counts if the height ratio is - // bigger than 50% - double min_height_ratio = 0.5; - - std::set pairs; - - // A function to connect one pillar with its neighbors. THe number of - // neighbors is given in the configuration. This function if called - // for every pillar in the pillar index. A pair of pillar will not - // be connected multiple times this is ensured by the 'pairs' set which - // remembers the processed pillar pairs - auto cascadefn = - [this, d, &pairs, min_height_ratio, H1] (const PointIndexEl& el) - { - Vec3d qp = el.first; // endpoint of the pillar - - const Pillar& pillar = m_builder.pillar(el.second); // actual pillar - - // Get the max number of neighbors a pillar should connect to - unsigned neighbors = m_cfg.pillar_cascade_neighbors; - - // connections are already enough for the pillar - if(pillar.links >= neighbors) return; - - double max_d = d * pillar.r / m_cfg.head_back_radius_mm; - // Query all remaining points within reach - auto qres = m_pillar_index.query([qp, max_d](const PointIndexEl& e){ - return distance(e.first, qp) < max_d; - }); - - // sort the result by distance (have to check if this is needed) - std::sort(qres.begin(), qres.end(), - [qp](const PointIndexEl& e1, const PointIndexEl& e2){ - return distance(e1.first, qp) < distance(e2.first, qp); - }); - - for(auto& re : qres) { // process the queried neighbors - - if(re.second == el.second) continue; // Skip self - - auto a = el.second, b = re.second; - - // Get unique hash for the given pair (order doesn't matter) - auto hashval = pairhash(a, b); - - // Search for the pair amongst the remembered pairs - if(pairs.find(hashval) != pairs.end()) continue; - - const Pillar& neighborpillar = m_builder.pillar(re.second); - - // this neighbor is occupied, skip - if (neighborpillar.links >= neighbors) continue; - if (neighborpillar.r < pillar.r) continue; - - if(interconnect(pillar, neighborpillar)) { - pairs.insert(hashval); - - // If the interconnection length between the two pillars is - // less than 50% of the longer pillar's height, don't count - if(pillar.height < H1 || - neighborpillar.height / pillar.height > min_height_ratio) - m_builder.increment_links(pillar); - - if(neighborpillar.height < H1 || - pillar.height / neighborpillar.height > min_height_ratio) - m_builder.increment_links(neighborpillar); - - } - - // connections are enough for one pillar - if(pillar.links >= neighbors) break; - } - }; - - // Run the cascade for the pillars in the index - m_pillar_index.foreach(cascadefn); - - // We would be done here if we could allow some pillars to not be - // connected with any neighbors. But this might leave the support tree - // unprintable. - // - // The current solution is to insert additional pillars next to these - // lonely pillars. One or even two additional pillar might get inserted - // depending on the length of the lonely pillar. - - size_t pillarcount = m_builder.pillarcount(); - - // Again, go through all pillars, this time in the whole support tree - // not just the index. - for(size_t pid = 0; pid < pillarcount; pid++) { - auto pillar = [this, pid]() { return m_builder.pillar(pid); }; - - // Decide how many additional pillars will be needed: - - unsigned needpillars = 0; - if (pillar().bridges > m_cfg.max_bridges_on_pillar) - needpillars = 3; - else if (pillar().links < 2 && pillar().height > H2) { - // Not enough neighbors to support this pillar - needpillars = 2; - } else if (pillar().links < 1 && pillar().height > H1) { - // No neighbors could be found and the pillar is too long. - needpillars = 1; - } - - needpillars = std::max(pillar().links, needpillars) - pillar().links; - if (needpillars == 0) continue; - - // Search for new pillar locations: - - bool found = false; - double alpha = 0; // goes to 2Pi - double r = 2 * m_cfg.base_radius_mm; - Vec3d pillarsp = pillar().startpoint(); - - // temp value for starting point detection - Vec3d sp(pillarsp(X), pillarsp(Y), pillarsp(Z) - r); - - // A vector of bool for placement feasbility - std::vector canplace(needpillars, false); - std::vector spts(needpillars); // vector of starting points - - double gnd = m_builder.ground_level; - double min_dist = m_cfg.pillar_base_safety_distance_mm + - m_cfg.base_radius_mm + EPSILON; - - while(!found && alpha < 2*PI) { - for (unsigned n = 0; - n < needpillars && (!n || canplace[n - 1]); - n++) - { - double a = alpha + n * PI / 3; - Vec3d s = sp; - s(X) += std::cos(a) * r; - s(Y) += std::sin(a) * r; - spts[n] = s; - - // Check the path vertically down - Vec3d check_from = s + Vec3d{0., 0., pillar().r}; - auto hr = bridge_mesh_intersect(check_from, DOWN, pillar().r); - Vec3d gndsp{s(X), s(Y), gnd}; - - // If the path is clear, check for pillar base collisions - canplace[n] = std::isinf(hr.distance()) && - std::sqrt(m_mesh.squared_distance(gndsp)) > - min_dist; - } - - found = std::all_of(canplace.begin(), canplace.end(), - [](bool v) { return v; }); - - // 20 angles will be tried... - alpha += 0.1 * PI; - } - - std::vector newpills; - newpills.reserve(needpillars); - - if (found) - for (unsigned n = 0; n < needpillars; n++) { - Vec3d s = spts[n]; - Pillar p(Vec3d{s.x(), s.y(), gnd}, s.z() - gnd, pillar().r); - - if (interconnect(pillar(), p)) { - Pillar &pp = m_builder.pillar(m_builder.add_pillar(p)); - - add_pillar_base(pp.id); - - m_pillar_index.insert(pp.endpoint(), unsigned(pp.id)); - - m_builder.add_junction(s, pillar().r); - double t = bridge_mesh_distance(pillarsp, dirv(pillarsp, s), - pillar().r); - if (distance(pillarsp, s) < t) - m_builder.add_bridge(pillarsp, s, pillar().r); - - if (pillar().endpoint()(Z) > m_builder.ground_level + pillar().r) - m_builder.add_junction(pillar().endpoint(), pillar().r); - - newpills.emplace_back(pp.id); - m_builder.increment_links(pillar()); - m_builder.increment_links(pp); - } - } - - if(!newpills.empty()) { - for(auto it = newpills.begin(), nx = std::next(it); - nx != newpills.end(); ++it, ++nx) { - const Pillar& itpll = m_builder.pillar(*it); - const Pillar& nxpll = m_builder.pillar(*nx); - if(interconnect(itpll, nxpll)) { - m_builder.increment_links(itpll); - m_builder.increment_links(nxpll); - } - } - - m_pillar_index.foreach(cascadefn); - } - } -} - -}} // namespace Slic3r::sla diff --git a/src/libslic3r/SLA/SupportTreeMesher.cpp b/src/libslic3r/SLA/SupportTreeMesher.cpp index 17f57f45782..6d91de7e621 100644 --- a/src/libslic3r/SLA/SupportTreeMesher.cpp +++ b/src/libslic3r/SLA/SupportTreeMesher.cpp @@ -93,68 +93,6 @@ indexed_triangle_set sphere(double rho, Portion portion, double fa) { return ret; } -indexed_triangle_set cylinder(double r, double h, size_t ssteps, const Vec3d &sp) -{ - assert(ssteps > 0); - - indexed_triangle_set ret; - - auto steps = int(ssteps); - auto& points = ret.vertices; - auto& indices = ret.indices; - points.reserve(2*ssteps); - double a = 2*PI/steps; - - Vec3d jp = sp; - Vec3d endp = {sp(X), sp(Y), sp(Z) + h}; - - // Upper circle points - for(int i = 0; i < steps; ++i) { - double phi = i*a; - auto ex = float(endp(X) + r*std::cos(phi)); - auto ey = float(endp(Y) + r*std::sin(phi)); - points.emplace_back(ex, ey, float(endp(Z))); - } - - // Lower circle points - for(int i = 0; i < steps; ++i) { - double phi = i*a; - auto x = float(jp(X) + r*std::cos(phi)); - auto y = float(jp(Y) + r*std::sin(phi)); - points.emplace_back(x, y, float(jp(Z))); - } - - // Now create long triangles connecting upper and lower circles - indices.reserve(2*ssteps); - auto offs = steps; - for(int i = 0; i < steps - 1; ++i) { - indices.emplace_back(i, i + offs, offs + i + 1); - indices.emplace_back(i, offs + i + 1, i + 1); - } - - // Last triangle connecting the first and last vertices - auto last = steps - 1; - indices.emplace_back(0, last, offs); - indices.emplace_back(last, offs + last, offs); - - // According to the slicing algorithms, we need to aid them with generating - // a watertight body. So we create a triangle fan for the upper and lower - // ending of the cylinder to close the geometry. - points.emplace_back(jp.cast()); int ci = int(points.size() - 1); - for(int i = 0; i < steps - 1; ++i) - indices.emplace_back(i + offs + 1, i + offs, ci); - - indices.emplace_back(offs, steps + offs - 1, ci); - - points.emplace_back(endp.cast()); ci = int(points.size() - 1); - for(int i = 0; i < steps - 1; ++i) - indices.emplace_back(ci, i, i + 1); - - indices.emplace_back(steps - 1, 0, ci); - - return ret; -} - indexed_triangle_set pinhead(double r_pin, double r_back, double length, @@ -183,13 +121,16 @@ indexed_triangle_set pinhead(double r_pin, const double h = r_back + r_pin + length; double phi = PI / 2. - std::acos((r_back - r_pin) / h); + if (std::isnan(phi)) + return mesh; + // To generate a whole circle we would pass a portion of (0, Pi) // To generate only a half horizontal circle we can pass (0, Pi/2) // The calculated phi is an offset to the half circles needed to smooth // the transition from the circle to the robe geometry - auto &&s1 = sphere(r_back, make_portion(0, PI / 2 + phi), detail); - auto &&s2 = sphere(r_pin, make_portion(PI / 2 + phi, PI), detail); + auto s1 = sphere(r_back, make_portion(0, PI / 2 + phi), detail); + auto s2 = sphere(r_pin, make_portion(PI / 2 + phi, PI), detail); for (auto &p : s2.vertices) p.z() += h; @@ -224,7 +165,8 @@ indexed_triangle_set halfcone(double baseheight, { assert(steps > 0); - if (baseheight <= 0 || steps <= 0) return {}; + if (baseheight <= 0 || steps <= 0 || (r_bottom <= 0. && r_top <= 0.)) + return {}; indexed_triangle_set base; @@ -267,4 +209,63 @@ indexed_triangle_set halfcone(double baseheight, return base; } +indexed_triangle_set get_mesh(const Head &h, size_t steps) +{ + indexed_triangle_set mesh = pinhead(h.r_pin_mm, h.r_back_mm, h.width_mm, steps); + + for (auto& p : mesh.vertices) p.z() -= (h.fullwidth() - h.r_back_mm); + + using Quaternion = Eigen::Quaternion; + + // We rotate the head to the specified direction. The head's pointing + // side is facing upwards so this means that it would hold a support + // point with a normal pointing straight down. This is the reason of + // the -1 z coordinate + auto quatern = Quaternion::FromTwoVectors(Vec3f{0.f, 0.f, -1.f}, + h.dir.cast()); + + Vec3f pos = h.pos.cast(); + for (auto& p : mesh.vertices) p = quatern * p + pos; + + return mesh; +} + +indexed_triangle_set get_mesh(const Bridge &br, size_t steps) +{ + using Quaternion = Eigen::Quaternion; + Vec3d v = (br.endp - br.startp); + Vec3d dir = v.normalized(); + double d = v.norm(); + + indexed_triangle_set mesh = cylinder(br.r, d, steps); + + auto quater = Quaternion::FromTwoVectors(Vec3f{0.f, 0.f, 1.f}, + dir.cast()); + + Vec3f startp = br.startp.cast(); + for(auto& p : mesh.vertices) p = quater * p + startp; + + return mesh; +} + +indexed_triangle_set get_mesh(const DiffBridge &br, size_t steps) +{ + double h = br.get_length(); + indexed_triangle_set mesh = halfcone(h, br.r, br.end_r, Vec3d::Zero(), steps); + + using Quaternion = Eigen::Quaternion; + + // We rotate the head to the specified direction. The head's pointing + // side is facing upwards so this means that it would hold a support + // point with a normal pointing straight down. This is the reason of + // the -1 z coordinate + auto quatern = Quaternion::FromTwoVectors(Vec3f{0.f, 0.f, 1.f}, + br.get_dir().cast()); + + Vec3f startp = br.startp.cast(); + for(auto& p : mesh.vertices) p = quatern * p + startp; + + return mesh; +} + }} // namespace Slic3r::sla diff --git a/src/libslic3r/SLA/SupportTreeMesher.hpp b/src/libslic3r/SLA/SupportTreeMesher.hpp index 63ccc5fce36..c2597292305 100644 --- a/src/libslic3r/SLA/SupportTreeMesher.hpp +++ b/src/libslic3r/SLA/SupportTreeMesher.hpp @@ -17,18 +17,20 @@ inline Portion make_portion(double a, double b) } indexed_triangle_set sphere(double rho, - Portion portion = make_portion(0., 2. * PI), + Portion portion = make_portion(0., PI), double fa = (2. * PI / 360.)); // Down facing cylinder in Z direction with arguments: // r: radius -// h: Height +// h: height // ssteps: how many edges will create the base circle // sp: starting point -indexed_triangle_set cylinder(double r, +inline indexed_triangle_set cylinder(double r, double h, - size_t steps = 45, - const Vec3d &sp = Vec3d::Zero()); + size_t steps = 45) +{ + return its_make_cylinder(r, h, 2 * PI / steps); +} indexed_triangle_set pinhead(double r_pin, double r_back, @@ -41,33 +43,15 @@ indexed_triangle_set halfcone(double baseheight, const Vec3d &pt = Vec3d::Zero(), size_t steps = 45); -inline indexed_triangle_set get_mesh(const Head &h, size_t steps) -{ - indexed_triangle_set mesh = pinhead(h.r_pin_mm, h.r_back_mm, h.width_mm, steps); - - for (auto& p : mesh.vertices) p.z() -= (h.fullwidth() - h.r_back_mm); - - using Quaternion = Eigen::Quaternion; - - // We rotate the head to the specified direction. The head's pointing - // side is facing upwards so this means that it would hold a support - // point with a normal pointing straight down. This is the reason of - // the -1 z coordinate - auto quatern = Quaternion::FromTwoVectors(Vec3f{0.f, 0.f, -1.f}, - h.dir.cast()); - - Vec3f pos = h.pos.cast(); - for (auto& p : mesh.vertices) p = quatern * p + pos; - - return mesh; -} +indexed_triangle_set get_mesh(const Head &h, size_t steps); inline indexed_triangle_set get_mesh(const Pillar &p, size_t steps) { if(p.height > EPSILON) { // Endpoint is below the starting point // We just create a bridge geometry with the pillar parameters and // move the data. - return cylinder(p.r, p.height, steps, p.endpoint()); + //return cylinder(p.r_start, p.height, steps, p.endpoint()); + return halfcone(p.height, p.r_end, p.r_start, p.endpt, steps); } return {}; @@ -80,49 +64,15 @@ inline indexed_triangle_set get_mesh(const Pedestal &p, size_t steps) inline indexed_triangle_set get_mesh(const Junction &j, size_t steps) { - indexed_triangle_set mesh = sphere(j.r, make_portion(0, PI), 2 *PI / steps); + indexed_triangle_set mesh = sphere(j.r, make_portion(0, PI), 2 * PI / steps); Vec3f pos = j.pos.cast(); for(auto& p : mesh.vertices) p += pos; return mesh; } -inline indexed_triangle_set get_mesh(const Bridge &br, size_t steps) -{ - using Quaternion = Eigen::Quaternion; - Vec3d v = (br.endp - br.startp); - Vec3d dir = v.normalized(); - double d = v.norm(); - - indexed_triangle_set mesh = cylinder(br.r, d, steps); - - auto quater = Quaternion::FromTwoVectors(Vec3f{0.f, 0.f, 1.f}, - dir.cast()); - - Vec3f startp = br.startp.cast(); - for(auto& p : mesh.vertices) p = quater * p + startp; - - return mesh; -} - -inline indexed_triangle_set get_mesh(const DiffBridge &br, size_t steps) -{ - double h = br.get_length(); - indexed_triangle_set mesh = halfcone(h, br.r, br.end_r, Vec3d::Zero(), steps); - - using Quaternion = Eigen::Quaternion; - - // We rotate the head to the specified direction. The head's pointing - // side is facing upwards so this means that it would hold a support - // point with a normal pointing straight down. This is the reason of - // the -1 z coordinate - auto quatern = Quaternion::FromTwoVectors(Vec3f{0.f, 0.f, 1.f}, - br.get_dir().cast()); +indexed_triangle_set get_mesh(const Bridge &br, size_t steps); - Vec3f startp = br.startp.cast(); - for(auto& p : mesh.vertices) p = quatern * p + startp; - - return mesh; -} +indexed_triangle_set get_mesh(const DiffBridge &br, size_t steps); }} // namespace Slic3r::sla diff --git a/src/libslic3r/SLA/SupportTreeStrategies.hpp b/src/libslic3r/SLA/SupportTreeStrategies.hpp new file mode 100644 index 00000000000..2cef1a8a946 --- /dev/null +++ b/src/libslic3r/SLA/SupportTreeStrategies.hpp @@ -0,0 +1,13 @@ +#ifndef SUPPORTTREESTRATEGIES_HPP +#define SUPPORTTREESTRATEGIES_HPP + +#include + +namespace Slic3r { namespace sla { + +enum class SupportTreeType { Default, Branching, Organic }; +enum class PillarConnectionMode { zigzag, cross, dynamic }; + +}} // namespace Slic3r::sla + +#endif // SUPPORTTREESTRATEGIES_HPP diff --git a/src/libslic3r/SLA/SupportTreeUtils.hpp b/src/libslic3r/SLA/SupportTreeUtils.hpp new file mode 100644 index 00000000000..aebd50950b7 --- /dev/null +++ b/src/libslic3r/SLA/SupportTreeUtils.hpp @@ -0,0 +1,945 @@ +#ifndef SLASUPPORTTREEUTILS_H +#define SLASUPPORTTREEUTILS_H + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace Slic3r { namespace sla { + +using Slic3r::opt::initvals; +using Slic3r::opt::bounds; +using Slic3r::opt::StopCriteria; +using Slic3r::opt::Optimizer; +using Slic3r::opt::AlgNLoptSubplex; +using Slic3r::opt::AlgNLoptGenetic; +using Slic3r::Geometry::dir_to_spheric; +using Slic3r::Geometry::spheric_to_dir; + +// Give points on a 3D ring with given center, radius and orientation +// method based on: +// https://math.stackexchange.com/questions/73237/parametric-equation-of-a-circle-in-3d-space +template +class PointRing { + std::array m_phis; + + // Two vectors that will be perpendicular to each other and to the + // axis. Values for a(X) and a(Y) are now arbitrary, a(Z) is just a + // placeholder. + // a and b vectors are perpendicular to the ring direction and to each other. + // Together they define the plane where we have to iterate with the + // given angles in the 'm_phis' vector + Vec3d a = {0, 1, 0}, b; + double m_radius = 0.; + + static inline bool constexpr is_one(double val) + { + constexpr double eps = 1e-20; + + return std::abs(std::abs(val) - 1) < eps; + } + +public: + + PointRing(const Vec3d &n) : m_phis{linspace_array(0., 2 * PI)} + { + // We have to address the case when the direction vector v (same as + // dir) is coincident with one of the world axes. In this case two of + // its components will be completely zero and one is 1.0. Our method + // becomes dangerous here due to division with zero. Instead, vector + // 'a' can be an element-wise rotated version of 'v' + if(is_one(n(X)) || is_one(n(Y)) || is_one(n(Z))) { + a = {n(Z), n(X), n(Y)}; + b = {n(Y), n(Z), n(X)}; + } + else { + a(Z) = -(n(Y)*a(Y)) / n(Z); a.normalize(); + b = a.cross(n); + } + } + + Vec3d get(size_t idx, const Vec3d &src, double r) const + { + if (idx == 0) + return src; + + double phi = m_phis[idx - 1]; + double sinphi = std::sin(phi); + double cosphi = std::cos(phi); + + double rpscos = r * cosphi; + double rpssin = r * sinphi; + + // Point on the sphere + return {src(X) + rpscos * a(X) + rpssin * b(X), + src(Y) + rpscos * a(Y) + rpssin * b(Y), + src(Z) + rpscos * a(Z) + rpssin * b(Z)}; + } +}; + +template +Vec dirv(const Vec& startp, const Vec& endp) { + return (endp - startp).normalized(); +} + +using Hit = AABBMesh::hit_result; + +template Hit min_hit(It from, It to) +{ + auto mit = std::min_element(from, to, [](const Hit &h1, const Hit &h2) { + return h1.distance() < h2.distance(); + }); + + return *mit; +} + +inline StopCriteria get_criteria(const SupportTreeConfig &cfg) +{ + return StopCriteria{} + .rel_score_diff(cfg.optimizer_rel_score_diff) + .max_iterations(cfg.optimizer_max_iterations); +} + +// A simple sphere with a center and a radius +struct Ball { Vec3d p; double R; }; + +template +struct Beam_ { // Defines a set of rays displaced along a cone's surface + static constexpr size_t SAMPLES = Samples; + + Vec3d src; + Vec3d dir; + double r1; + double r2; // radius of the beam 1 unit further from src in dir direction + + Beam_(const Vec3d &s, const Vec3d &d, double R1, double R2) + : src{s}, dir{d}, r1{R1}, r2{R2} {}; + + Beam_(const Ball &src_ball, const Ball &dst_ball) + : src{src_ball.p}, dir{dirv(src_ball.p, dst_ball.p)}, r1{src_ball.R} + { + r2 = src_ball.R; + auto d = distance(src_ball.p, dst_ball.p); + + if (d > EPSILON) + r2 += (dst_ball.R - src_ball.R) / d; + } + + Beam_(const Vec3d &s, const Vec3d &d, double R) + : src{s}, dir{d}, r1{R}, r2{R} + {} +}; + +using Beam = Beam_<>; + +template +Hit beam_mesh_hit(Ex policy, + const AABBMesh &mesh, + const Beam_ &beam, + double sd) +{ + Vec3d src = beam.src; + Vec3d dst = src + beam.dir; + double r_src = beam.r1; + double r_dst = beam.r2; + + Vec3d D = (dst - src); + Vec3d dir = D.normalized(); + PointRing ring{dir}; + + using Hit = AABBMesh::hit_result; + + // Hit results + std::array hits; + + execution::for_each( + policy, size_t(0), hits.size(), + [&mesh, r_src, r_dst, src, dst, &ring, dir, sd, &hits](size_t i) { + Hit &hit = hits[i]; + + // Point on the circle on the pin sphere + Vec3d p_src = ring.get(i, src, r_src + sd); + Vec3d p_dst = ring.get(i, dst, r_dst + sd); + Vec3d raydir = (p_dst - p_src).normalized(); + + auto hr = mesh.query_ray_hit(p_src + r_src * raydir, raydir); + + if (hr.is_inside()) { + if (hr.distance() > 2 * r_src + sd) + hit = Hit(0.0); + else { + // re-cast the ray from the outside of the object + auto q = p_src + (hr.distance() + EPSILON) * raydir; + hit = mesh.query_ray_hit(q, raydir); + } + } else + hit = hr; + }, std::min(execution::max_concurrency(policy), RayCount)); + + return min_hit(hits.begin(), hits.end()); +} + +template +Hit pinhead_mesh_hit(Ex ex, + const AABBMesh &mesh, + const Vec3d &s, + const Vec3d &dir, + double r_pin, + double r_back, + double width, + double sd) +{ + // Support tree generation speed depends heavily on this value. 8 is almost + // ok, but to prevent rare cases of collision, 16 is necessary, which makes + // the algorithm run about 60% longer. + static const size_t SAMPLES = 16; + + // Move away slightly from the touching point to avoid raycasting on the + // inner surface of the mesh. + + auto &m = mesh; + using HitResult = AABBMesh::hit_result; + + // Hit results + std::array hits; + + struct Rings + { + double rpin; + double rback; + Vec3d spin; + Vec3d sback; + PointRing ring; + + Vec3d backring(size_t idx) { return ring.get(idx, sback, rback); } + Vec3d pinring(size_t idx) { return ring.get(idx, spin, rpin); } + } rings{r_pin + sd, r_back + sd, s, s + (r_pin + width + r_back) * dir, dir}; + + // We will shoot multiple rays from the head pinpoint in the direction + // of the pinhead robe (side) surface. The result will be the smallest + // hit distance. + + execution::for_each( + ex, size_t(0), hits.size(), [&m, &rings, sd, &hits](size_t i) { + // Point on the circle on the pin sphere + Vec3d ps = rings.pinring(i); + // This is the point on the circle on the back sphere + Vec3d p = rings.backring(i); + + auto &hit = hits[i]; + + // Point ps is not on mesh but can be inside or + // outside as well. This would cause many problems + // with ray-casting. To detect the position we will + // use the ray-casting result (which has an is_inside + // predicate). + + Vec3d n = (p - ps).normalized(); + auto q = m.query_ray_hit(ps + sd * n, n); + + if (q.is_inside()) { // the hit is inside the model + if (q.distance() > rings.rpin) { + // If we are inside the model and the hit + // distance is bigger than our pin circle + // diameter, it probably indicates that the + // support point was already inside the + // model, or there is really no space + // around the point. We will assign a zero + // hit distance to these cases which will + // enforce the function return value to be + // an invalid ray with zero hit distance. + // (see min_element at the end) + hit = HitResult(0.0); + } else { + // re-cast the ray from the outside of the + // object. The starting point has an offset + // of 2*safety_distance because the + // original ray has also had an offset + auto q2 = m.query_ray_hit(ps + (q.distance() + 2 * sd) * n, n); + hit = q2; + } + } else + hit = q; + }, std::min(execution::max_concurrency(ex), SAMPLES)); + + return min_hit(hits.begin(), hits.end()); +} + +template +Hit pinhead_mesh_hit(Ex ex, + const AABBMesh &mesh, + const Head &head, + double safety_d) +{ + return pinhead_mesh_hit(ex, mesh, head.pos, head.dir, head.r_pin_mm, + head.r_back_mm, head.width_mm, safety_d); +} + +inline double distance(const SupportPoint &a, const SupportPoint &b) +{ + return (a.pos - b.pos).norm(); +} + +template +std::vector non_duplicate_suppt_indices(const PtIndex &index, + const SupportPoints &suppts, + double eps) +{ + std::vector to_remove(suppts.size(), false); + + for (size_t i = 0; i < suppts.size(); ++i) { + size_t closest_idx = + find_closest_point(index, suppts[i].pos, + [&i, &to_remove](size_t i_closest) { + return i_closest != i && + !to_remove[i_closest]; + }); + + if (closest_idx < suppts.size() && + (suppts[i].pos - suppts[closest_idx].pos).norm() < eps) + to_remove[i] = true; + } + + auto ret = reserve_vector(suppts.size()); + for (size_t i = 0; i < to_remove.size(); i++) + if (!to_remove[i]) + ret.emplace_back(i); + + return ret; +} + +template +bool optimize_pinhead_placement(Ex policy, + const SupportableMesh &m, + Head &head) +{ + Vec3d n = get_normal(m.emesh, head.pos); + assert(std::abs(n.norm() - 1.0) < EPSILON); + + // for all normals the spherical coordinates are generated and + // the polar angle is saturated to 45 degrees from the bottom then + // converted back to standard coordinates to get the new normal. + // Then a simple quaternion is created from the two normals + // (Quaternion::FromTwoVectors) and the rotation is applied to the + // pinhead. + + auto [polar, azimuth] = dir_to_spheric(n); + + double back_r = head.r_back_mm; + + // skip if the tilt is not sane + if (polar < PI - m.cfg.normal_cutoff_angle) return false; + + // We saturate the polar angle to 3pi/4 + polar = std::max(polar, PI - m.cfg.bridge_slope); + + // save the head (pinpoint) position + Vec3d hp = head.pos; + + double lmin = m.cfg.head_width_mm, lmax = lmin; + + if (back_r < m.cfg.head_back_radius_mm) { + lmin = 0., lmax = m.cfg.head_penetration_mm; + } + + // The distance needed for a pinhead to not collide with model. + double w = lmin + 2 * back_r + 2 * m.cfg.head_front_radius_mm - + m.cfg.head_penetration_mm; + + double pin_r = head.r_pin_mm; + + // Reassemble the now corrected normal + auto nn = spheric_to_dir(polar, azimuth).normalized(); + + double sd = m.cfg.safety_distance(back_r); + + // check available distance + Hit t = pinhead_mesh_hit(policy, m.emesh, hp, nn, pin_r, back_r, w, sd); + + if (t.distance() < w) { + // Let's try to optimize this angle, there might be a + // viable normal that doesn't collide with the model + // geometry and its very close to the default. + + Optimizer solver(get_criteria(m.cfg).stop_score(w).max_iterations(100)); + solver.seed(0); // we want deterministic behavior + + auto oresult = solver.to_max().optimize( + [&m, pin_r, back_r, hp, sd, policy](const opt::Input<3> &input) { + auto &[plr, azm, l] = input; + + auto dir = spheric_to_dir(plr, azm).normalized(); + + return pinhead_mesh_hit(policy, m.emesh, hp, dir, pin_r, + back_r, l, sd).distance(); + }, + initvals({polar, azimuth, + (lmin + lmax) / 2.}), // start with what we have + bounds({{PI - m.cfg.bridge_slope, PI}, // Must not exceed the slope limit + {-PI, PI}, // azimuth can be a full search + {lmin, lmax}})); + + if(oresult.score > w) { + polar = std::get<0>(oresult.optimum); + azimuth = std::get<1>(oresult.optimum); + nn = spheric_to_dir(polar, azimuth).normalized(); + lmin = std::get<2>(oresult.optimum); + t = AABBMesh::hit_result(oresult.score); + } + } + + bool ret = false; + if (t.distance() > w && hp.z() + w * nn.z() >= ground_level(m)) { + head.dir = nn; + head.width_mm = lmin; + head.r_back_mm = back_r; + + ret = true; + } else if (back_r > m.cfg.head_fallback_radius_mm) { + head.r_back_mm = m.cfg.head_fallback_radius_mm; + ret = optimize_pinhead_placement(policy, m, head); + } + + return ret; +} + +template +std::optional calculate_pinhead_placement(Ex policy, + const SupportableMesh &sm, + size_t suppt_idx) +{ + if (suppt_idx >= sm.pts.size()) + return {}; + + const SupportPoint &sp = sm.pts[suppt_idx]; + Head head{ + sm.cfg.head_back_radius_mm, + sp.head_front_radius, + 0., + sm.cfg.head_penetration_mm, + Vec3d::Zero(), // dir + sp.pos.cast() // displacement + }; + + if (optimize_pinhead_placement(policy, sm, head)) { + head.id = long(suppt_idx); + + return head; + } + + return {}; +} + +struct GroundConnection { + // Currently, a ground connection will contain at most 2 additional junctions + // which will not require any allocations. If I come up with an algo that + // can produce a route to ground with more junctions, this design will be + // able to handle that. + static constexpr size_t MaxExpectedJunctions = 3; + + boost::container::small_vector path; + std::optional pillar_base; + + operator bool() const { return pillar_base.has_value() && !path.empty(); } +}; + +inline long build_ground_connection(SupportTreeBuilder &builder, + const SupportableMesh &sm, + const GroundConnection &conn) +{ + long ret = SupportTreeNode::ID_UNSET; + + if (!conn) + return ret; + + auto it = conn.path.begin(); + auto itnx = std::next(it); + + while (itnx != conn.path.end()) { + builder.add_diffbridge(*it, *itnx); + builder.add_junction(*itnx); + ++it; ++itnx; + } + + auto gp = conn.path.back().pos; + gp.z() = ground_level(sm); + double h = conn.path.back().pos.z() - gp.z(); + + if (conn.pillar_base->r_top < sm.cfg.head_back_radius_mm) { + h += sm.pad_cfg.wall_thickness_mm; + gp.z() -= sm.pad_cfg.wall_thickness_mm; + } + +// TODO: does not work yet +// if (conn.path.back().id < 0) { +// // this is a head +// long head_id = std::abs(conn.path.back().id); +// ret = builder.add_pillar(head_id, h); +// } else + + ret = builder.add_pillar(gp, h, conn.path.back().r, conn.pillar_base->r_top); + + if (conn.pillar_base->r_top >= sm.cfg.head_back_radius_mm) + builder.add_pillar_base(ret, conn.pillar_base->height, conn.pillar_base->r_bottom); + + return ret; +} + +template +constexpr bool IsWideningFn = std::is_invocable_r_v; + +// A widening function can determine how many ray samples should a beam contain +// (see in beam_mesh_hit) +template struct BeamSamples { static constexpr size_t Value = 8; }; +template constexpr size_t BeamSamplesV = BeamSamples>::Value; + +// To use with check_ground_route, full will check the bridge and the pillar, +// PillarOnly checks only the pillar for collisions. +enum class GroundRouteCheck { Full, PillarOnly }; + +// Returns the collision point with mesh if there is a collision or a ground point, +// given a source point with a direction of a potential avoidance bridge and +// a bridge length. +template> > +Vec3d check_ground_route( + Ex policy, + const SupportableMesh &sm, + const Junction &source, // source location + const Vec3d &dir, // direction of the bridge from the source + double bridge_len, // lenght of the avoidance bridge + WideningFn &&wideningfn, // Widening strategy + GroundRouteCheck type = GroundRouteCheck::Full + ) +{ + static const constexpr auto Samples = BeamSamplesV; + + Vec3d ret; + + const auto sd = sm.cfg.safety_distance(source.r); + const auto gndlvl = ground_level(sm); + + // Intersection of the suggested bridge with ground plane. If the bridge + // spans below ground, stop it at ground level. + double t = (gndlvl - source.pos.z()) / dir.z(); + bridge_len = std::min(t, bridge_len); + + Vec3d bridge_end = source.pos + bridge_len * dir; + + double down_l = bridge_end.z() - gndlvl; + double bridge_r = wideningfn(Ball{source.pos, source.r}, dir, bridge_len); + double brhit_dist = 0.; + + if (bridge_len > EPSILON && type == GroundRouteCheck::Full) { + // beam_mesh_hit with a zero lenght bridge is invalid + + Beam_ bridgebeam{Ball{source.pos, source.r}, + Ball{bridge_end, bridge_r}}; + + auto brhit = beam_mesh_hit(policy, sm.emesh, bridgebeam, sd); + brhit_dist = brhit.distance(); + } else { + brhit_dist = bridge_len; + } + + if (brhit_dist < bridge_len) { + ret = (source.pos + brhit_dist * dir); + } else if (down_l > 0.) { + // check if pillar can be placed below + auto gp = Vec3d{bridge_end.x(), bridge_end.y(), gndlvl}; + double end_radius = wideningfn( + Ball{bridge_end, bridge_r}, DOWN, bridge_end.z() - gndlvl); + + Beam_ gndbeam {{bridge_end, bridge_r}, {gp, end_radius}}; + auto gndhit = beam_mesh_hit(policy, sm.emesh, gndbeam, sd); + double gnd_hit_d = std::min(gndhit.distance(), down_l + EPSILON); + + if (source.r >= sm.cfg.head_back_radius_mm && gndhit.distance() > down_l && sm.cfg.object_elevation_mm < EPSILON) { + // Dealing with zero elevation mode, to not route pillars + // into the gap between the optional pad and the model + double gap = std::sqrt(sm.emesh.squared_distance(gp)); + double base_r = std::max(sm.cfg.base_radius_mm, end_radius); + double min_gap = sm.cfg.pillar_base_safety_distance_mm + base_r; + + if (gap < min_gap) { + gnd_hit_d = down_l - min_gap + gap; + } + } + + ret = Vec3d{bridge_end.x(), bridge_end.y(), bridge_end.z() - gnd_hit_d}; + } else { + ret = bridge_end; + } + + return ret; +} + +// Searching a ground connection from an arbitrary source point. +// Currently, the result will contain one avoidance bridge (at most) and a +// pillar to the ground, if it's feasible +template> > +GroundConnection deepsearch_ground_connection( + Ex policy, + const SupportableMesh &sm, + const Junction &source, + WideningFn &&wideningfn, + const Vec3d &init_dir = DOWN) +{ + constexpr unsigned MaxIterationsGlobal = 5000; + constexpr unsigned MaxIterationsLocal = 100; + constexpr double RelScoreDiff = 0.05; + + const auto gndlvl = ground_level(sm); + + // The used solver (AlgNLoptMLSL_Subplx search method) is composed of a global (MLSL) + // and a local (Subplex) search method. Criteria can be set in a way that + // local searches are quick and less accurate. The global method will only + // consider the max iteration number and the stop score (Z level <= ground) + + auto criteria = get_criteria(sm.cfg); // get defaults from cfg + criteria.max_iterations(MaxIterationsGlobal); + criteria.abs_score_diff(NaNd); + criteria.rel_score_diff(NaNd); + criteria.stop_score(gndlvl); + + auto criteria_loc = criteria; + criteria_loc.max_iterations(MaxIterationsLocal); + criteria_loc.abs_score_diff(EPSILON); + criteria_loc.rel_score_diff(RelScoreDiff); + + Optimizer solver(criteria); + solver.set_loc_criteria(criteria_loc); + solver.seed(0); // require repeatability + + // functor returns the z height of collision point, given a polar and + // azimuth angles as bridge direction and bridge length. The route is + // traced from source, through this bridge and an attached pillar. If there + // is a collision with the mesh, the Z height is returned. Otherwise the + // z level of ground is returned. + auto z_fn = [&](const opt::Input<3> &input) { + // solver suggests polar, azimuth and bridge length values: + auto &[plr, azm, bridge_len] = input; + + Vec3d n = spheric_to_dir(plr, azm); + + Vec3d hitpt = check_ground_route(policy, sm, source, n, bridge_len, wideningfn); + + return hitpt.z(); + }; + + // Calculate the initial direction of the search by + // saturating the polar angle to max tilt defined in config + auto [plr_init, azm_init] = dir_to_spheric(init_dir); + plr_init = std::max(plr_init, PI - sm.cfg.bridge_slope); + + auto bound_constraints = + bounds({ + {PI - sm.cfg.bridge_slope, PI}, // bounds for polar angle + {-PI, PI}, // bounds for azimuth + {0., sm.cfg.max_bridge_length_mm} // bounds bridge length + }); + + // The optimizer can navigate fairly well on the mesh surface, finding + // lower and lower Z coordinates as collision points. MLSL is not a local + // search method, so it should not be trapped in a local minima. Eventually, + // this search should arrive at a ground location. + auto oresult = solver.to_min().optimize( + z_fn, + initvals({plr_init, azm_init, 0.}), + bound_constraints + ); + + GroundConnection conn; + + // Extract and apply the result + auto [plr, azm, bridge_l] = oresult.optimum; + Vec3d n = spheric_to_dir(plr, azm); + assert(std::abs(n.norm() - 1.) < EPSILON); + + double t = (gndlvl - source.pos.z()) / n.z(); + bridge_l = std::min(t, bridge_l); + + // Now the optimizer gave a possible route to ground with a bridge direction + // and length. This length can be shortened further by brute-force queries + // of free route straigt down for a possible pillar. + // NOTE: This requirement could be incorporated into the optimization as a + // constraint, but it would not find quickly enough an accurate solution, + // and it would be very hard to define a stop score which is very useful in + // terminating the search as soon as the ground is found. + double l = 0., l_max = bridge_l; + double zlvl = std::numeric_limits::infinity(); + while(zlvl > gndlvl && l <= l_max) { + + zlvl = check_ground_route(policy, sm, source, n, l, wideningfn, + GroundRouteCheck::PillarOnly).z(); + + if (zlvl <= gndlvl) + bridge_l = l; + + l += source.r; + } + + Vec3d bridge_end = source.pos + bridge_l * n; + Vec3d gp{bridge_end.x(), bridge_end.y(), gndlvl}; + + double bridge_r = wideningfn(Ball{source.pos, source.r}, n, bridge_l); + double down_l = bridge_end.z() - gndlvl; + double end_radius = wideningfn(Ball{bridge_end, bridge_r}, DOWN, down_l); + double base_r = std::max(sm.cfg.base_radius_mm, end_radius); + + // Even if the search was not succesful, the result is populated by the + // source and the last best result of the optimization. + conn.path.emplace_back(source); + if (bridge_l > EPSILON) + conn.path.emplace_back(Junction{bridge_end, bridge_r}); + + // The resulting ground connection is only valid if the pillar base is set. + // At this point it will only be set if the search was succesful. + if (z_fn(opt::Input<3>({plr, azm, bridge_l})) <= gndlvl) + conn.pillar_base = + Pedestal{gp, sm.cfg.base_height_mm, base_r, end_radius}; + + return conn; +} + +// Ground route search with a predefined end radius +template +GroundConnection deepsearch_ground_connection(Ex policy, + const SupportableMesh &sm, + const Junction &source, + double end_radius, + const Vec3d &init_dir = DOWN) +{ + double gndlvl = ground_level(sm); + auto wfn = [end_radius, gndlvl](const Ball &src, const Vec3d &dir, double len) { + if (len < EPSILON) + return src.R; + + Vec3d dst = src.p + len * dir; + double widening = end_radius - src.R; + double zlen = dst.z() - gndlvl; + double full_len = len + zlen; + double r = src.R + widening * len / full_len; + + return r; + }; + + static_assert(IsWideningFn, "Not a widening function"); + + return deepsearch_ground_connection(policy, sm, source, wfn, init_dir); +} + +struct DefaultWideningModel { + static constexpr double WIDENING_SCALE = 0.02; + const SupportableMesh &sm; + + double operator()(const Ball &src, const Vec3d & /*dir*/, double len) { + static_assert(IsWideningFn, + "DefaultWideningModel is not a widening function"); + + double w = WIDENING_SCALE * sm.cfg.pillar_widening_factor * len; + return std::max(src.R, sm.cfg.head_back_radius_mm) + w; + }; +}; + +template<> struct BeamSamples { + static constexpr size_t Value = 16; +}; + +template +GroundConnection deepsearch_ground_connection(Ex policy, + const SupportableMesh &sm, + const Junction &source, + const Vec3d &init_dir = DOWN) +{ + return deepsearch_ground_connection(policy, sm, source, + DefaultWideningModel{sm}, init_dir); +} + +template +bool optimize_anchor_placement(Ex policy, + const SupportableMesh &sm, + const Junction &from, + Anchor &anchor) +{ + Vec3d n = get_normal(sm.emesh, anchor.pos); + + auto [polar, azimuth] = dir_to_spheric(n); + + // Saturate the polar angle to 3pi/4 + polar = std::min(polar, sm.cfg.bridge_slope); + + double lmin = 0; + double lmax = std::min(sm.cfg.head_width_mm, + distance(from.pos, anchor.pos) - 2 * from.r); + + double sd = sm.cfg.safety_distance(anchor.r_back_mm); + + Optimizer solver(get_criteria(sm.cfg) + .stop_score(anchor.fullwidth()) + .max_iterations(100)); + + solver.seed(0); // deterministic behavior + + auto oresult = solver.to_max().optimize( + [&sm, &anchor, sd, policy](const opt::Input<3> &input) { + auto &[plr, azm, l] = input; + + auto dir = spheric_to_dir(plr, azm).normalized(); + + anchor.width_mm = l; + anchor.dir = dir; + + return pinhead_mesh_hit(policy, sm.emesh, anchor, sd) + .distance(); + }, + initvals({polar, azimuth, (lmin + lmax) / 2.}), + bounds({{0., sm.cfg.bridge_slope}, // Must not exceed the slope limit + {-PI, PI}, // azimuth can be a full search + {lmin, lmax}})); + + polar = std::get<0>(oresult.optimum); + azimuth = std::get<1>(oresult.optimum); + anchor.dir = spheric_to_dir(polar, azimuth).normalized(); + anchor.width_mm = std::get<2>(oresult.optimum); + + if (oresult.score < anchor.fullwidth()) { + // Unsuccesful search, the anchor does not fit into its intended space. + return false; + } + + return true; +} + +template +std::optional calculate_anchor_placement(Ex policy, + const SupportableMesh &sm, + const Junction &from, + const Vec3d &to_hint) +{ + double back_r = from.r; + double pin_r = sm.cfg.head_front_radius_mm; + double penetr = sm.cfg.head_penetration_mm; + double hwidth = sm.cfg.head_width_mm; + Vec3d bridgedir = dirv(from.pos, to_hint); + Vec3d anchordir = -bridgedir; + + std::optional ret; + + Anchor anchor(back_r, pin_r, hwidth, penetr, anchordir, to_hint); + + if (optimize_anchor_placement(policy, sm, from, anchor)) { + ret = anchor; + } else if (anchor.r_back_mm = sm.cfg.head_fallback_radius_mm; + optimize_anchor_placement(policy, sm, from, anchor)) { + // Retrying with the fallback strut radius as a last resort. + ret = anchor; + } + + return anchor; +} + +inline bool is_outside_support_cone(const Vec3f &supp, + const Vec3f &pt, + float angle) +{ + using namespace Slic3r; + + Vec3d D = (pt - supp).cast(); + double dot_sq = -D.z() * std::abs(-D.z()); + + return dot_sq < + D.squaredNorm() * std::cos(angle) * std::abs(std::cos(angle)); +} + +inline // TODO: should be in a cpp +std::optional find_merge_pt(const Vec3f &A, + const Vec3f &B, + float critical_angle) +{ + // The idea is that A and B both have their support cones. But searching + // for the intersection of these support cones is difficult and its enough + // to reduce this problem to 2D and search for the intersection of two + // rays that merge somewhere between A and B. The 2D plane is a vertical + // slice of the 3D scene where the 2D Y axis is equal to the 3D Z axis and + // the 2D X axis is determined by the XY direction of the AB vector. + // + // Z^ + // | A * + // | . . B * + // | . . . . + // | . . . . + // | . x . + // -------------------> XY + + // Determine the transformation matrix for the 2D projection: + Vec3f diff = {B.x() - A.x(), B.y() - A.y(), 0.f}; + Vec3f dir = diff.normalized(); // TODO: avoid normalization + + Eigen::Matrix tr2D; + tr2D.row(0) = Vec3f{dir.x(), dir.y(), dir.z()}; + tr2D.row(1) = Vec3f{0.f, 0.f, 1.f}; + + // Transform the 2 vectors A and B into 2D vector 'a' and 'b'. Here we can + // omit 'a', pretend that its the origin and use BA as the vector b. + Vec2f b = tr2D * (B - A); + + // Get the square sine of the ray emanating from 'a' towards 'b'. This ray might + // exceed the allowed angle but that is corrected subsequently. + // The sign of the original sine is also needed, hence b.y is multiplied by + // abs(b.y) + float b_sqn = b.squaredNorm(); + float sin2sig_a = b_sqn > EPSILON ? (b.y() * std::abs(b.y())) / b_sqn : 0.f; + + // sine2 from 'b' to 'a' is the opposite of sine2 from a to b + float sin2sig_b = -sin2sig_a; + + // Derive the allowed angles from the given critical angle. + // critical_angle is measured from the horizontal X axis. + // The rays need to go downwards which corresponds to negative angles + + float sincrit = std::sin(critical_angle); // sine of the critical angle + float sin2crit = -sincrit * sincrit; // signed sine squared + sin2sig_a = std::min(sin2sig_a, sin2crit); // Do the angle saturation of both rays + sin2sig_b = std::min(sin2sig_b, sin2crit); // + float sin2_a = std::abs(sin2sig_a); // Get cosine squared values + float sin2_b = std::abs(sin2sig_b); + float cos2_a = 1.f - sin2_a; + float cos2_b = 1.f - sin2_b; + + // Derive the new direction vectors. This is by square rooting the sin2 + // and cos2 values and restoring the original signs + Vec2f Da = {std::copysign(std::sqrt(cos2_a), b.x()), std::copysign(std::sqrt(sin2_a), sin2sig_a)}; + Vec2f Db = {-std::copysign(std::sqrt(cos2_b), b.x()), std::copysign(std::sqrt(sin2_b), sin2sig_b)}; + + // Determine where two rays ([0, 0], Da), (b, Db) intersect. + // Based on + // https://stackoverflow.com/questions/27459080/given-two-points-and-two-direction-vectors-find-the-point-where-they-intersect + // One ray is emanating from (0, 0) so the formula is simplified + double t1 = (Db.y() * b.x() - b.y() * Db.x()) / + (Da.x() * Db.y() - Da.y() * Db.x()); + + Vec2f mp = t1 * Da; + Vec3f Mp = A + tr2D.transpose() * mp; + + return t1 >= 0.f ? Mp : Vec3f{}; +} + +}} // namespace Slic3r::sla + +#endif // SLASUPPORTTREEUTILS_H diff --git a/src/libslic3r/SLA/SupportTreeUtilsLegacy.hpp b/src/libslic3r/SLA/SupportTreeUtilsLegacy.hpp new file mode 100644 index 00000000000..f8e2f3024f5 --- /dev/null +++ b/src/libslic3r/SLA/SupportTreeUtilsLegacy.hpp @@ -0,0 +1,301 @@ +#ifndef SUPPORTTREEUTILSLEGACY_HPP +#define SUPPORTTREEUTILSLEGACY_HPP + +#include "SupportTreeUtils.hpp" + +// Old functions are gathered here that are used in DefaultSupportTree +// to maintain functionality that was well tested. + +namespace Slic3r { namespace sla { + +// Helper function for pillar interconnection where pairs of already connected +// pillars should be checked for not to be processed again. This can be done +// in constant time with a set of hash values uniquely representing a pair of +// integers. The order of numbers within the pair should not matter, it has +// the same unique hash. The hash value has to have twice as many bits as the +// arguments need. If the same integral type is used for args and return val, +// make sure the arguments use only the half of the type's bit depth. +template> +IntegerOnly pairhash(I a, I b) +{ + using std::ceil; using std::log2; using std::max; using std::min; + static const auto constexpr Ibits = int(sizeof(I) * CHAR_BIT); + static const auto constexpr DoubleIbits = int(sizeof(DoubleI) * CHAR_BIT); + static const auto constexpr shift = DoubleIbits / 2 < Ibits ? Ibits / 2 : Ibits; + + I g = min(a, b), l = max(a, b); + + // Assume the hash will fit into the output variable + assert((g ? (ceil(log2(g))) : 0) <= shift); + assert((l ? (ceil(log2(l))) : 0) <= shift); + + return (DoubleI(g) << shift) + l; +} + +template +std::optional search_widening_path(Ex policy, + const SupportableMesh &sm, + const Vec3d &jp, + const Vec3d &dir, + double radius, + double new_radius) +{ + double w = radius + 2 * sm.cfg.head_back_radius_mm; + double stopval = w + jp.z() - ground_level(sm); + Optimizer solver(get_criteria(sm.cfg).stop_score(stopval)); + + auto [polar, azimuth] = dir_to_spheric(dir); + + double fallback_ratio = radius / sm.cfg.head_back_radius_mm; + + auto oresult = solver.to_max().optimize( + [&policy, &sm, jp, radius, new_radius](const opt::Input<3> &input) { + auto &[plr, azm, t] = input; + + auto d = spheric_to_dir(plr, azm).normalized(); + + auto sd = sm.cfg.safety_distance(new_radius); + + double ret = pinhead_mesh_hit(policy, sm.emesh, jp, d, radius, + new_radius, t, sd) + .distance(); + + Beam beam{jp + t * d, d, new_radius}; + double down = beam_mesh_hit(policy, sm.emesh, beam, sd).distance(); + + if (ret > t && std::isinf(down)) + ret += jp.z() - ground_level(sm); + + return ret; + }, + initvals({polar, azimuth, w}), // start with what we have + bounds({ + {PI - sm.cfg.bridge_slope, PI}, // Must not exceed the slope limit + {-PI, PI}, // azimuth can be a full search + {radius + sm.cfg.head_back_radius_mm, + fallback_ratio * sm.cfg.max_bridge_length_mm} + })); + + if (oresult.score >= stopval) { + polar = std::get<0>(oresult.optimum); + azimuth = std::get<1>(oresult.optimum); + double t = std::get<2>(oresult.optimum); + Vec3d endp = jp + t * spheric_to_dir(polar, azimuth); + + return DiffBridge(jp, endp, radius, sm.cfg.head_back_radius_mm); + } + + return {}; +} + +// This is a proxy function for pillar creation which will mind the gap +// between the pad and the model bottom in zero elevation mode. +// 'pinhead_junctionpt' is the starting junction point which needs to be +// routed down. sourcedir is the allowed direction of an optional bridge +// between the jp junction and the final pillar. +template +std::pair create_ground_pillar( + Ex policy, + SupportTreeBuilder &builder, + const SupportableMesh &sm, + const Vec3d &pinhead_junctionpt, + const Vec3d &sourcedir, + double radius, + double end_radius, + long head_id = SupportTreeNode::ID_UNSET) +{ + Vec3d jp = pinhead_junctionpt, endp = jp, dir = sourcedir; + long pillar_id = SupportTreeNode::ID_UNSET; + bool can_add_base = false, non_head = false; + + double gndlvl = 0.; // The Z level where pedestals should be + double jp_gnd = 0.; // The lowest Z where a junction center can be + double gap_dist = 0.; // The gap distance between the model and the pad + + double r2 = radius + (end_radius - radius) / (jp.z() - ground_level(sm)); + + auto to_floor = [&gndlvl](const Vec3d &p) { return Vec3d{p.x(), p.y(), gndlvl}; }; + + auto eval_limits = [&sm, &radius, &can_add_base, &gndlvl, &gap_dist, &jp_gnd] + (bool base_en = true) + { + can_add_base = base_en && radius >= sm.cfg.head_back_radius_mm; + double base_r = can_add_base ? sm.cfg.base_radius_mm : 0.; + gndlvl = ground_level(sm); + if (!can_add_base) gndlvl -= sm.pad_cfg.wall_thickness_mm; + jp_gnd = gndlvl + (can_add_base ? 0. : sm.cfg.head_back_radius_mm); + gap_dist = sm.cfg.pillar_base_safety_distance_mm + base_r + EPSILON; + }; + + eval_limits(); + + // We are dealing with a mini pillar that's potentially too long + if (radius < sm.cfg.head_back_radius_mm && jp.z() - gndlvl > 20 * radius) + { + std::optional diffbr = + search_widening_path(policy, sm, jp, dir, radius, + sm.cfg.head_back_radius_mm); + + if (diffbr && diffbr->endp.z() > jp_gnd) { + auto &br = builder.add_diffbridge(*diffbr); + if (head_id >= 0) builder.head(head_id).bridge_id = br.id; + endp = diffbr->endp; + radius = diffbr->end_r; + end_radius = diffbr->end_r; + builder.add_junction(endp, radius); + non_head = true; + dir = diffbr->get_dir(); + eval_limits(); + } else return {false, pillar_id}; + } + + if (sm.cfg.object_elevation_mm < EPSILON) + { + // get a suitable direction for the corrector bridge. It is the + // original sourcedir's azimuth but the polar angle is saturated to the + // configured bridge slope. + auto [polar, azimuth] = dir_to_spheric(dir); + polar = PI - sm.cfg.bridge_slope; + Vec3d d = spheric_to_dir(polar, azimuth).normalized(); + auto sd = radius * sm.cfg.safety_distance_mm / sm.cfg.head_back_radius_mm; + double t = beam_mesh_hit(policy, sm.emesh, Beam{endp, d, radius, r2}, sd).distance(); + double tmax = std::min(sm.cfg.max_bridge_length_mm, t); + t = 0.; + + double zd = endp.z() - jp_gnd; + double tmax2 = zd / std::sqrt(1 - sm.cfg.bridge_slope * sm.cfg.bridge_slope); + tmax = std::min(tmax, tmax2); + + Vec3d nexp = endp; + double dlast = 0.; + while (((dlast = std::sqrt(sm.emesh.squared_distance(to_floor(nexp)))) < gap_dist || + !std::isinf(beam_mesh_hit(policy, sm.emesh, Beam{nexp, DOWN, radius, r2}, sd).distance())) && + t < tmax) + { + t += radius; + nexp = endp + t * d; + } + + if (dlast < gap_dist && can_add_base) { + nexp = endp; + t = 0.; + can_add_base = false; + eval_limits(can_add_base); + + zd = endp.z() - jp_gnd; + tmax2 = zd / std::sqrt(1 - sm.cfg.bridge_slope * sm.cfg.bridge_slope); + tmax = std::min(tmax, tmax2); + + while (((dlast = std::sqrt(sm.emesh.squared_distance(to_floor(nexp)))) < gap_dist || + !std::isinf(beam_mesh_hit(policy, sm.emesh, Beam{nexp, DOWN, radius}, sd).distance())) && t < tmax) { + t += radius; + nexp = endp + t * d; + } + } + + // Could not find a path to avoid the pad gap + if (dlast < gap_dist) return {false, pillar_id}; + + if (t > 0.) { // Need to make additional bridge + const Bridge& br = builder.add_bridge(endp, nexp, radius); + if (head_id >= 0) builder.head(head_id).bridge_id = br.id; + + builder.add_junction(nexp, radius); + endp = nexp; + non_head = true; + } + } + + Vec3d gp = to_floor(endp); + double h = endp.z() - gp.z(); + + pillar_id = head_id >= 0 && !non_head ? builder.add_pillar(head_id, h) : + builder.add_pillar(gp, h, radius, end_radius); + + if (can_add_base) + builder.add_pillar_base(pillar_id, sm.cfg.base_height_mm, + sm.cfg.base_radius_mm); + + return {true, pillar_id}; +} + +template +std::pair connect_to_ground(Ex policy, + SupportTreeBuilder &builder, + const SupportableMesh &sm, + const Junction &j, + const Vec3d &dir, + double end_r) +{ + auto hjp = j.pos; + double r = j.r; + auto sd = r * sm.cfg.safety_distance_mm / sm.cfg.head_back_radius_mm; + double r2 = j.r + (end_r - j.r) / (j.pos.z() - ground_level(sm)); + + double t = beam_mesh_hit(policy, sm.emesh, Beam{hjp, dir, r, r2}, sd).distance(); + double d = 0, tdown = 0; + t = std::min(t, sm.cfg.max_bridge_length_mm * r / sm.cfg.head_back_radius_mm); + + while (d < t && + !std::isinf(tdown = beam_mesh_hit(policy, sm.emesh, + Beam{hjp + d * dir, DOWN, r, r2}, sd) + .distance())) { + d += r; + } + + if(!std::isinf(tdown)) + return {false, SupportTreeNode::ID_UNSET}; + + Vec3d endp = hjp + d * dir; + auto ret = create_ground_pillar(policy, builder, sm, endp, dir, r, end_r); + + if (ret.second >= 0) { + builder.add_bridge(hjp, endp, r); + builder.add_junction(endp, r); + } + + return ret; +} + +template +std::pair search_ground_route(Ex policy, + SupportTreeBuilder &builder, + const SupportableMesh &sm, + const Junction &j, + double end_radius, + const Vec3d &init_dir = DOWN) +{ + double downdst = j.pos.z() - ground_level(sm); + + auto res = connect_to_ground(policy, builder, sm, j, init_dir, end_radius); + if (res.first) + return res; + + // Optimize bridge direction: + // Straight path failed so we will try to search for a suitable + // direction out of the cavity. + auto [polar, azimuth] = dir_to_spheric(init_dir); + + Optimizer solver(get_criteria(sm.cfg).stop_score(1e6)); + solver.seed(0); // we want deterministic behavior + + auto sd = j.r * sm.cfg.safety_distance_mm / sm.cfg.head_back_radius_mm; + auto oresult = solver.to_max().optimize( + [&j, sd, &policy, &sm, &downdst, &end_radius](const opt::Input<2> &input) { + auto &[plr, azm] = input; + Vec3d n = spheric_to_dir(plr, azm).normalized(); + Beam beam{Ball{j.pos, j.r}, Ball{j.pos + downdst * n, end_radius}}; + return beam_mesh_hit(policy, sm.emesh, beam, sd).distance(); + }, + initvals({polar, azimuth}), // let's start with what we have + bounds({ {PI - sm.cfg.bridge_slope, PI}, {-PI, PI} }) + ); + + Vec3d bridgedir = spheric_to_dir(oresult.optimum).normalized(); + + return connect_to_ground(policy, builder, sm, j, bridgedir, end_radius); +} + +}} // namespace Slic3r::sla + +#endif // SUPPORTTREEUTILSLEGACY_HPP diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 2f152af6eb7..c4947851b07 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -1,9 +1,10 @@ #include "SLAPrint.hpp" #include "SLAPrintSteps.hpp" +#include "CSGMesh/CSGMeshCopy.hpp" +#include "CSGMesh/PerformCSGMeshBooleans.hpp" +#include "format.hpp" -#include "ClipperUtils.hpp" #include "Geometry.hpp" -#include "MTUtils.hpp" #include "Thread.hpp" #include @@ -23,7 +24,7 @@ //! macro used to mark string used at localization, //! return same string -#define L(s) Slic3r::I18N::translate(s) +#define _u8L(s) Slic3r::I18N::translate(s) namespace Slic3r { @@ -37,37 +38,66 @@ bool is_zero_elevation(const SLAPrintObjectConfig &c) sla::SupportTreeConfig make_support_cfg(const SLAPrintObjectConfig& c) { sla::SupportTreeConfig scfg; - + scfg.enabled = c.supports_enable.getBool(); - scfg.head_front_radius_mm = 0.5*c.support_head_front_diameter.getFloat(); - double pillar_r = 0.5 * c.support_pillar_diameter.getFloat(); - scfg.head_back_radius_mm = pillar_r; - scfg.head_fallback_radius_mm = - 0.01 * c.support_small_pillar_diameter_percent.getFloat() * pillar_r; - scfg.head_penetration_mm = c.support_head_penetration.getFloat(); - scfg.head_width_mm = c.support_head_width.getFloat(); - scfg.object_elevation_mm = is_zero_elevation(c) ? - 0. : c.support_object_elevation.getFloat(); - scfg.bridge_slope = c.support_critical_angle.getFloat() * PI / 180.0 ; - scfg.max_bridge_length_mm = c.support_max_bridge_length.getFloat(); - scfg.max_pillar_link_distance_mm = c.support_max_pillar_link_distance.getFloat(); - switch(c.support_pillar_connection_mode.getInt()) { - case slapcmZigZag: - scfg.pillar_connection_mode = sla::PillarConnectionMode::zigzag; break; - case slapcmCross: - scfg.pillar_connection_mode = sla::PillarConnectionMode::cross; break; - case slapcmDynamic: - scfg.pillar_connection_mode = sla::PillarConnectionMode::dynamic; break; + scfg.tree_type = c.support_tree_type.value; + + switch(scfg.tree_type) { + case sla::SupportTreeType::Default: { + scfg.head_front_radius_mm = 0.5*c.support_head_front_diameter.getFloat(); + double pillar_r = 0.5 * c.support_pillar_diameter.getFloat(); + scfg.head_back_radius_mm = pillar_r; + scfg.head_fallback_radius_mm = + 0.01 * c.support_small_pillar_diameter_percent.getFloat() * pillar_r; + scfg.head_penetration_mm = c.support_head_penetration.getFloat(); + scfg.head_width_mm = c.support_head_width.getFloat(); + scfg.object_elevation_mm = is_zero_elevation(c) ? + 0. : c.support_object_elevation.getFloat(); + scfg.bridge_slope = c.support_critical_angle.getFloat() * PI / 180.0 ; + scfg.max_bridge_length_mm = c.support_max_bridge_length.getFloat(); + scfg.max_pillar_link_distance_mm = c.support_max_pillar_link_distance.getFloat(); + scfg.pillar_connection_mode = c.support_pillar_connection_mode.value; + scfg.ground_facing_only = c.support_buildplate_only.getBool(); + scfg.pillar_widening_factor = c.support_pillar_widening_factor.getFloat(); + scfg.base_radius_mm = 0.5*c.support_base_diameter.getFloat(); + scfg.base_height_mm = c.support_base_height.getFloat(); + scfg.pillar_base_safety_distance_mm = + c.support_base_safety_distance.getFloat() < EPSILON ? + scfg.safety_distance_mm : c.support_base_safety_distance.getFloat(); + + scfg.max_bridges_on_pillar = unsigned(c.support_max_bridges_on_pillar.getInt()); + scfg.max_weight_on_model_support = c.support_max_weight_on_model.getFloat(); + break; + } + case sla::SupportTreeType::Branching: + [[fallthrough]]; + case sla::SupportTreeType::Organic:{ + scfg.head_front_radius_mm = 0.5*c.branchingsupport_head_front_diameter.getFloat(); + double pillar_r = 0.5 * c.branchingsupport_pillar_diameter.getFloat(); + scfg.head_back_radius_mm = pillar_r; + scfg.head_fallback_radius_mm = + 0.01 * c.branchingsupport_small_pillar_diameter_percent.getFloat() * pillar_r; + scfg.head_penetration_mm = c.branchingsupport_head_penetration.getFloat(); + scfg.head_width_mm = c.branchingsupport_head_width.getFloat(); + scfg.object_elevation_mm = is_zero_elevation(c) ? + 0. : c.branchingsupport_object_elevation.getFloat(); + scfg.bridge_slope = c.branchingsupport_critical_angle.getFloat() * PI / 180.0 ; + scfg.max_bridge_length_mm = c.branchingsupport_max_bridge_length.getFloat(); + scfg.max_pillar_link_distance_mm = c.branchingsupport_max_pillar_link_distance.getFloat(); + scfg.pillar_connection_mode = c.branchingsupport_pillar_connection_mode.value; + scfg.ground_facing_only = c.branchingsupport_buildplate_only.getBool(); + scfg.pillar_widening_factor = c.branchingsupport_pillar_widening_factor.getFloat(); + scfg.base_radius_mm = 0.5*c.branchingsupport_base_diameter.getFloat(); + scfg.base_height_mm = c.branchingsupport_base_height.getFloat(); + scfg.pillar_base_safety_distance_mm = + c.branchingsupport_base_safety_distance.getFloat() < EPSILON ? + scfg.safety_distance_mm : c.branchingsupport_base_safety_distance.getFloat(); + + scfg.max_bridges_on_pillar = unsigned(c.branchingsupport_max_bridges_on_pillar.getInt()); + scfg.max_weight_on_model_support = c.branchingsupport_max_weight_on_model.getFloat(); + break; + } } - scfg.ground_facing_only = c.support_buildplate_only.getBool(); - scfg.pillar_widening_factor = c.support_pillar_widening_factor.getFloat(); - scfg.base_radius_mm = 0.5*c.support_base_diameter.getFloat(); - scfg.base_height_mm = c.support_base_height.getFloat(); - scfg.pillar_base_safety_distance_mm = - c.support_base_safety_distance.getFloat() < EPSILON ? - scfg.safety_distance_mm : c.support_base_safety_distance.getFloat(); - - scfg.max_bridges_on_pillar = unsigned(c.support_max_bridges_on_pillar.getInt()); return scfg; } @@ -128,30 +158,12 @@ void SLAPrint::clear() // Transformation without rotation around Z and without a shift by X and Y. Transform3d SLAPrint::sla_trafo(const ModelObject &model_object) const { - - Vec3d corr = this->relative_correction(); - ModelInstance &model_instance = *model_object.instances.front(); - Vec3d offset = model_instance.get_offset(); - Vec3d rotation = model_instance.get_rotation(); - offset(0) = 0.; - offset(1) = 0.; - rotation(2) = 0.; - - offset.z() *= corr.z(); - auto trafo = Transform3d::Identity(); - trafo.translate(offset); - trafo.scale(corr); - trafo.rotate(Eigen::AngleAxisd(rotation.z(), Vec3d::UnitZ())); - trafo.rotate(Eigen::AngleAxisd(rotation.y(), Vec3d::UnitY())); - trafo.rotate(Eigen::AngleAxisd(rotation.x(), Vec3d::UnitX())); - trafo.scale(model_instance.get_scaling_factor()); - trafo.scale(model_instance.get_mirror()); - + trafo.translate(Vec3d{ 0., 0., model_instance.get_offset().z() * this->relative_correction().z() }); + trafo.linear() = Eigen::DiagonalMatrix(this->relative_correction()) * model_instance.get_matrix().linear(); if (model_instance.is_left_handed()) trafo = Eigen::Scaling(Vec3d(-1., 1., 1.)) * trafo; - return trafo; } @@ -161,14 +173,13 @@ static std::vector sla_instances(const ModelObject &mo std::vector instances; assert(! model_object.instances.empty()); if (! model_object.instances.empty()) { - Vec3d rotation0 = model_object.instances.front()->get_rotation(); - rotation0(2) = 0.; + const Transform3d& trafo0 = model_object.instances.front()->get_matrix(); for (ModelInstance *model_instance : model_object.instances) if (model_instance->is_printable()) { instances.emplace_back( model_instance->id(), Point::new_scale(model_instance->get_offset(X), model_instance->get_offset(Y)), - float(Geometry::rotation_diff_z(rotation0, model_instance->get_rotation()))); + float(Geometry::rotation_diff_z(trafo0, model_instance->get_matrix()))); } } return instances; @@ -240,8 +251,9 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig con m_material_config.apply_only(config, material_diff, true); // Handle changes to object config defaults m_default_object_config.apply_only(config, object_diff, true); - - if (m_printer) m_printer->apply(m_printer_config); + + if (!m_archiver || !printer_diff.empty()) + m_archiver = SLAArchiveWriter::create(m_printer_config.sla_archive_format.value.c_str(), m_printer_config); struct ModelObjectStatus { enum Status { @@ -389,7 +401,12 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig con if (it_print_object_status != print_object_status.end() && it_print_object_status->id != model_object.id()) it_print_object_status = print_object_status.end(); // Check whether a model part volume was added or removed, their transformations or order changed. - bool model_parts_differ = model_volume_list_changed(model_object, model_object_new, ModelVolumeType::MODEL_PART); + bool model_parts_differ = + model_volume_list_changed(model_object, model_object_new, + {ModelVolumeType::MODEL_PART, + ModelVolumeType::NEGATIVE_VOLUME, + ModelVolumeType::SUPPORT_ENFORCER, + ModelVolumeType::SUPPORT_BLOCKER}); bool sla_trafo_differs = model_object.instances.empty() != model_object_new.instances.empty() || (! model_object.instances.empty() && @@ -508,104 +525,6 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig con return static_cast(apply_status); } -// After calling the apply() function, set_task() may be called to limit the task to be processed by process(). -void SLAPrint::set_task(const TaskParams ¶ms) -{ - // Grab the lock for the Print / PrintObject milestones. - std::scoped_lock lock(this->state_mutex()); - - int n_object_steps = int(params.to_object_step) + 1; - if (n_object_steps == 0) - n_object_steps = int(slaposCount); - - if (params.single_model_object.valid()) { - // Find the print object to be processed with priority. - SLAPrintObject *print_object = nullptr; - size_t idx_print_object = 0; - for (; idx_print_object < m_objects.size(); ++ idx_print_object) - if (m_objects[idx_print_object]->model_object()->id() == params.single_model_object) { - print_object = m_objects[idx_print_object]; - break; - } - assert(print_object != nullptr); - // Find out whether the priority print object is being currently processed. - bool running = false; - for (int istep = 0; istep < n_object_steps; ++ istep) { - if (! print_object->m_stepmask[size_t(istep)]) - // Step was skipped, cancel. - break; - if (print_object->is_step_started_unguarded(SLAPrintObjectStep(istep))) { - // No step was skipped, and a wanted step is being processed. Don't cancel. - running = true; - break; - } - } - if (! running) - this->call_cancel_callback(); - - // Now the background process is either stopped, or it is inside one of the print object steps to be calculated anyway. - if (params.single_model_instance_only) { - // Suppress all the steps of other instances. - for (SLAPrintObject *po : m_objects) - for (size_t istep = 0; istep < slaposCount; ++ istep) - po->m_stepmask[istep] = false; - } else if (! running) { - // Swap the print objects, so that the selected print_object is first in the row. - // At this point the background processing must be stopped, so it is safe to shuffle print objects. - if (idx_print_object != 0) - std::swap(m_objects.front(), m_objects[idx_print_object]); - } - // and set the steps for the current object. - for (int istep = 0; istep < n_object_steps; ++ istep) - print_object->m_stepmask[size_t(istep)] = true; - for (int istep = n_object_steps; istep < int(slaposCount); ++ istep) - print_object->m_stepmask[size_t(istep)] = false; - } else { - // Slicing all objects. - bool running = false; - for (SLAPrintObject *print_object : m_objects) - for (int istep = 0; istep < n_object_steps; ++ istep) { - if (! print_object->m_stepmask[size_t(istep)]) { - // Step may have been skipped. Restart. - goto loop_end; - } - if (print_object->is_step_started_unguarded(SLAPrintObjectStep(istep))) { - // This step is running, and the state cannot be changed due to the this->state_mutex() being locked. - // It is safe to manipulate m_stepmask of other SLAPrintObjects and SLAPrint now. - running = true; - goto loop_end; - } - } - loop_end: - if (! running) - this->call_cancel_callback(); - for (SLAPrintObject *po : m_objects) { - for (int istep = 0; istep < n_object_steps; ++ istep) - po->m_stepmask[size_t(istep)] = true; - for (auto istep = size_t(n_object_steps); istep < slaposCount; ++ istep) - po->m_stepmask[istep] = false; - } - } - - if (params.to_object_step != -1 || params.to_print_step != -1) { - // Limit the print steps. - size_t istep = (params.to_object_step != -1) ? 0 : size_t(params.to_print_step) + 1; - for (; istep < m_stepmask.size(); ++ istep) - m_stepmask[istep] = false; - } -} - -// Clean up after process() finished, either with success, error or if canceled. -// The adjustments on the SLAPrint / SLAPrintObject data due to set_task() are to be reverted here. -void SLAPrint::finalize() -{ - for (SLAPrintObject *po : m_objects) - for (size_t istep = 0; istep < slaposCount; ++ istep) - po->m_stepmask[istep] = true; - for (size_t istep = 0; istep < slapsCount; ++ istep) - m_stepmask[istep] = true; -} - // Generate a recommended output file name based on the format template, default extension, and template parameters // (timestamps, object placeholders derived from the model, current placeholder prameters and print statistics. // Use the final print statistics if available, or just keep the print statistics placeholders if not available yet (before the output is finalized). @@ -625,7 +544,7 @@ std::string SLAPrint::validate(std::string*) const if(supports_en && mo->sla_points_status == sla::PointsStatus::UserModified && mo->sla_support_points.empty()) - return L("Cannot proceed without support points! " + return _u8L("Cannot proceed without support points! " "Add support points or disable support generation."); sla::SupportTreeConfig cfg = make_support_cfg(po->config()); @@ -636,13 +555,13 @@ std::string SLAPrint::validate(std::string*) const sla::PadConfig::EmbedObject &builtinpad = padcfg.embed_object; if(supports_en && !builtinpad.enabled && elv < cfg.head_fullwidth()) - return L( + return _u8L( "Elevation is too low for object. Use the \"Pad around " "object\" feature to print the object without elevation."); if(supports_en && builtinpad.enabled && cfg.pillar_base_safety_distance_mm < builtinpad.object_gap_mm) { - return L( + return _u8L( "The endings of the support pillars will be deployed on the " "gap between the object and the pad. 'Support base safety " "distance' has to be greater than the 'Pad object gap' " @@ -658,22 +577,25 @@ std::string SLAPrint::validate(std::string*) const double expt_cur = m_material_config.exposure_time.getFloat(); if (expt_cur < expt_min || expt_cur > expt_max) - return L("Exposition time is out of printer profile bounds."); + return _u8L("Exposition time is out of printer profile bounds."); double iexpt_max = m_printer_config.max_initial_exposure_time.getFloat(); double iexpt_min = m_printer_config.min_initial_exposure_time.getFloat(); double iexpt_cur = m_material_config.initial_exposure_time.getFloat(); if (iexpt_cur < iexpt_min || iexpt_cur > iexpt_max) - return L("Initial exposition time is out of printer profile bounds."); + return _u8L("Initial exposition time is out of printer profile bounds."); return ""; } -void SLAPrint::set_printer(SLAArchive *arch) +void SLAPrint::export_print(const std::string &fname, const ThumbnailsList &thumbnails, const std::string &projectname) { - invalidate_step(slapsRasterize); - m_printer = arch; + if (m_archiver) + m_archiver->export_print(fname, *this, thumbnails, projectname); + else { + throw ExportError(format(_u8L("Unknown archive format: %s"), m_printer_config.sla_archive_format.value)); + } } bool SLAPrint::invalidate_step(SLAPrintStep step) @@ -702,7 +624,7 @@ void SLAPrint::process() // We want to first process all objects... std::vector level1_obj_steps = { - slaposHollowing, slaposDrillHoles, slaposObjectSlice, slaposSupportPoints, slaposSupportTree, slaposPad + slaposAssembly, slaposHollowing, slaposDrillHoles, slaposObjectSlice, slaposSupportPoints, slaposSupportTree, slaposPad }; // and then slice all supports to allow preview to be displayed ASAP @@ -742,7 +664,7 @@ void SLAPrint::process() st += incr; - if (po->m_stepmask[step] && po->set_started(step)) { + if (po->set_started(step)) { m_report_status(*this, st, printsteps.label(step)); bench.start(); printsteps.execute(step, *po); @@ -760,14 +682,11 @@ void SLAPrint::process() apply_steps_on_objects(level1_obj_steps); apply_steps_on_objects(level2_obj_steps); - // this would disable the rasterization step - // std::fill(m_stepmask.begin(), m_stepmask.end(), false); - st = Steps::max_objstatus; for(SLAPrintStep currentstep : print_steps) { throw_if_canceled(); - if (m_stepmask[currentstep] && set_started(currentstep)) { + if (set_started(currentstep)) { m_report_status(*this, st, printsteps.label(currentstep)); bench.start(); printsteps.execute(currentstep); @@ -781,7 +700,7 @@ void SLAPrint::process() } // If everything vent well - m_report_status(*this, 100, L("Slicing done")); + m_report_status(*this, 100, _u8L("Slicing done")); #ifdef SLAPRINT_DO_BENCHMARK std::string csvbenchstr; @@ -836,7 +755,9 @@ bool SLAPrint::invalidate_state_by_config_options(const std::vector steps_ignore = { @@ -899,13 +820,6 @@ bool SLAPrint::is_step_done(SLAPrintObjectStep step) const SLAPrintObject::SLAPrintObject(SLAPrint *print, ModelObject *model_object) : Inherited(print, model_object) - , m_stepmask(slaposCount, true) - , m_transformed_rmesh([this](TriangleMesh &obj) { - obj = m_model_object->raw_mesh(); - if (!obj.empty()) { - obj.transform(m_trafo); - } - }) {} SLAPrintObject::~SLAPrintObject() {} @@ -932,7 +846,9 @@ bool SLAPrintObject::invalidate_state_by_config_options(const std::vectorinvalidate_all_steps(); + } else if (step == slaposHollowing) { + invalidated |= invalidated |= this->invalidate_steps({ slaposDrillHoles, slaposObjectSlice, slaposSupportPoints, slaposSupportTree, slaposPad, slaposSliceSupports }); } else if (step == slaposDrillHoles) { invalidated |= this->invalidate_steps({ slaposObjectSlice, slaposSupportPoints, slaposSupportTree, slaposPad, slaposSliceSupports }); invalidated |= m_print->invalidate_step(slapsMergeSlicesAndEval); @@ -1012,7 +951,7 @@ bool SLAPrintObject::invalidate_step(SLAPrintObjectStep step) bool SLAPrintObject::invalidate_all_steps() { - return Inherited::invalidate_all_steps() | m_print->invalidate_all_steps(); + return Inherited::invalidate_all_steps() || m_print->invalidate_all_steps(); } double SLAPrintObject::get_elevation() const { @@ -1081,7 +1020,7 @@ const SliceRecord SliceRecord::EMPTY(0, std::nanf(""), 0.f); const std::vector& SLAPrintObject::get_support_points() const { - return m_supportdata? m_supportdata->pts : EMPTY_SUPPORT_POINTS; + return m_supportdata? m_supportdata->input.pts : EMPTY_SUPPORT_POINTS; } const std::vector &SLAPrintObject::get_support_slices() const @@ -1103,113 +1042,71 @@ const ExPolygons &SliceRecord::get_slice(SliceOrigin o) const return idx >= v.size() ? EMPTY_SLICE : v[idx]; } -bool SLAPrintObject::has_mesh(SLAPrintObjectStep step) const -{ - switch (step) { - case slaposDrillHoles: - return m_hollowing_data && !m_hollowing_data->hollow_mesh_with_holes.empty(); - case slaposSupportTree: - return ! this->support_mesh().empty(); - case slaposPad: - return ! this->pad_mesh().empty(); - default: - return false; - } -} - -TriangleMesh SLAPrintObject::get_mesh(SLAPrintObjectStep step) const -{ - switch (step) { - case slaposSupportTree: - return this->support_mesh(); - case slaposPad: - return this->pad_mesh(); - case slaposDrillHoles: - if (m_hollowing_data) - return get_mesh_to_print(); - [[fallthrough]]; - default: - return TriangleMesh(); - } -} - const TriangleMesh& SLAPrintObject::support_mesh() const { - if(m_config.supports_enable.getBool() && m_supportdata) + if (m_config.supports_enable.getBool() && + is_step_done(slaposSupportTree) && + m_supportdata) return m_supportdata->tree_mesh; - + return EMPTY_MESH; } const TriangleMesh& SLAPrintObject::pad_mesh() const { - if(m_config.pad_enable.getBool() && m_supportdata) + if(m_config.pad_enable.getBool() && is_step_done(slaposPad) && m_supportdata) return m_supportdata->pad_mesh; return EMPTY_MESH; } -const indexed_triangle_set &SLAPrintObject::hollowed_interior_mesh() const +const std::shared_ptr & +SLAPrintObject::get_mesh_to_print() const { - if (m_hollowing_data && m_hollowing_data->interior && - m_config.hollowing_enable.getBool()) - return sla::get_mesh(*m_hollowing_data->interior); - - return EMPTY_TRIANGLE_SET; + int s = last_completed_step(); + + while (s > 0 && ! m_preview_meshes[s]) + --s; + + return m_preview_meshes[s]; } -const TriangleMesh &SLAPrintObject::transformed_mesh() const { - // we need to transform the raw mesh... - // currently all the instances share the same x and y rotation and scaling - // so we have to extract those from e.g. the first instance and apply to the - // raw mesh. This is also true for the support points. - // BUT: when the support structure is spawned for each instance than it has - // to omit the X, Y rotation and scaling as those have been already applied - // or apply an inverse transformation on the support structure after it - // has been created. - - return m_transformed_rmesh.get(); +std::vector SLAPrintObject::get_parts_to_slice() const +{ + return get_parts_to_slice(slaposCount); } -sla::SupportPoints SLAPrintObject::transformed_support_points() const +std::vector +SLAPrintObject::get_parts_to_slice(SLAPrintObjectStep untilstep) const { - assert(m_model_object != nullptr); - auto spts = m_model_object->sla_support_points; - const Transform3d& vol_trafo = m_model_object->volumes.front()->get_transformation().get_matrix(); - const Transform3f& tr = (trafo() * vol_trafo).cast(); - for (sla::SupportPoint& suppt : spts) { - suppt.pos = tr * suppt.pos; + auto laststep = last_completed_step(); + SLAPrintObjectStep s = std::min(untilstep, laststep); + + if (s == slaposCount) + return {}; + + std::vector ret; + + for (unsigned int step = 0; step < s; ++step) { + auto r = m_mesh_to_slice.equal_range(SLAPrintObjectStep(step)); + csg::copy_csgrange_shallow(Range{r.first, r.second}, std::back_inserter(ret)); } - - return spts; + + return ret; +} + +sla::SupportPoints SLAPrintObject::transformed_support_points() const +{ + assert(model_object()); + + return sla::transformed_support_points(*model_object(), trafo()); } sla::DrainHoles SLAPrintObject::transformed_drainhole_points() const { - assert(m_model_object != nullptr); - auto pts = m_model_object->sla_drain_holes; - const Transform3d& vol_trafo = m_model_object->volumes.front()->get_transformation().get_matrix(); - const Geometry::Transformation trans(trafo() * vol_trafo); - const Transform3f& tr = trans.get_matrix().cast(); - const Vec3f sc = trans.get_scaling_factor().cast(); - for (sla::DrainHole &hl : pts) { - hl.pos = tr * hl.pos; - hl.normal = tr * hl.normal - tr.translation(); - - // The normal scales as a covector (and we must also - // undo the damage already done). - hl.normal = Vec3f(hl.normal(0)/(sc(0)*sc(0)), - hl.normal(1)/(sc(1)*sc(1)), - hl.normal(2)/(sc(2)*sc(2))); - - // Now shift the hole a bit above the object and make it deeper to - // compensate for it. This is to avoid problems when the hole is placed - // on (nearly) flat surface. - hl.pos -= hl.normal.normalized() * sla::HoleStickOutLength; - hl.height += sla::HoleStickOutLength; - } + assert(model_object()); - return pts; + return sla::transformed_drainhole_points(*model_object(), trafo()); } DynamicConfig SLAPrintStatistics::config() const @@ -1266,4 +1163,17 @@ void SLAPrint::StatusReporter::operator()(SLAPrint & p, p.set_status(int(std::round(st)), msg, flags); } +namespace csg { + +MeshBoolean::cgal::CGALMeshPtr get_cgalmesh(const CSGPartForStep &part) +{ + if (!part.cgalcache && csg::get_mesh(part)) { + part.cgalcache = csg::get_cgalmesh(static_cast(part)); + } + + return part.cgalcache? clone(*part.cgalcache) : nullptr; +} + +} // namespace csg + } // namespace Slic3r diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index 833146985a8..126941d820d 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -3,12 +3,18 @@ #include #include +#include + #include "PrintBase.hpp" -#include "SLA/RasterBase.hpp" #include "SLA/SupportTree.hpp" #include "Point.hpp" -#include "MTUtils.hpp" -#include "Zipper.hpp" +#include "Format/SLAArchiveWriter.hpp" +#include "GCode/ThumbnailData.hpp" +#include "libslic3r/CSGMesh/CSGMesh.hpp" +#include "libslic3r/MeshBoolean.hpp" +#include "libslic3r/OpenVDBUtils.hpp" + +#include namespace Slic3r { @@ -19,6 +25,7 @@ enum SLAPrintStep : unsigned int { }; enum SLAPrintObjectStep : unsigned int { + slaposAssembly, slaposHollowing, slaposDrillHoles, slaposObjectSlice, @@ -41,10 +48,47 @@ using _SLAPrintObjectBase = enum SliceOrigin { soSupport, soModel }; +} // namespace Slic3r + +namespace Slic3r { + +// Each sla object step can hold a collection of csg operations on the +// sla model to be sliced. Currently, Assembly step adds negative and positive +// volumes, hollowing adds the negative interior, drilling adds the hole cylinders. +// They need to be processed in this specific order. If CSGPartForStep instances +// are put into a multiset container the key being the sla step, +// iterating over the container will maintain the correct order of csg operations. +struct CSGPartForStep : public csg::CSGPart +{ + SLAPrintObjectStep key; + mutable MeshBoolean::cgal::CGALMeshPtr cgalcache; + + CSGPartForStep(SLAPrintObjectStep k, CSGPart &&p = {}) + : key{k}, CSGPart{std::move(p)} + {} + + CSGPartForStep &operator=(CSGPart &&part) + { + this->its_ptr = std::move(part.its_ptr); + this->operation = part.operation; + + return *this; + } + + bool operator<(const CSGPartForStep &other) const { return key < other.key; } +}; + +namespace csg { + +MeshBoolean::cgal::CGALMeshPtr get_cgalmesh(const CSGPartForStep &part); + +} // namespace csg + class SLAPrintObject : public _SLAPrintObjectBase { private: // Prevents erroneous use by other classes. using Inherited = _SLAPrintObjectBase; + using CSGContainer = std::multiset; public: @@ -68,31 +112,20 @@ class SLAPrintObject : public _SLAPrintObjectBase }; const std::vector& instances() const { return m_instances; } - bool has_mesh(SLAPrintObjectStep step) const; - TriangleMesh get_mesh(SLAPrintObjectStep step) const; - // Get a support mesh centered around origin in XY, and with zero rotation around Z applied. // Support mesh is only valid if this->is_step_done(slaposSupportTree) is true. const TriangleMesh& support_mesh() const; // Get a pad mesh centered around origin in XY, and with zero rotation around Z applied. // Support mesh is only valid if this->is_step_done(slaposPad) is true. const TriangleMesh& pad_mesh() const; - - // Ready after this->is_step_done(slaposDrillHoles) is true - const indexed_triangle_set &hollowed_interior_mesh() const; // Get the mesh that is going to be printed with all the modifications // like hollowing and drilled holes. - const TriangleMesh & get_mesh_to_print() const { - return (m_hollowing_data && is_step_done(slaposDrillHoles)) ? m_hollowing_data->hollow_mesh_with_holes_trimmed : transformed_mesh(); - } + const std::shared_ptr& get_mesh_to_print() const; - const TriangleMesh & get_mesh_to_slice() const { - return (m_hollowing_data && is_step_done(slaposDrillHoles)) ? m_hollowing_data->hollow_mesh_with_holes : transformed_mesh(); - } + std::vector get_parts_to_slice() const; - // This will return the transformed mesh which is cached - const TriangleMesh& transformed_mesh() const; + std::vector get_parts_to_slice(SLAPrintObjectStep step) const; sla::SupportPoints transformed_support_points() const; sla::DrainHoles transformed_drainhole_points() const; @@ -261,6 +294,7 @@ class SLAPrintObject : public _SLAPrintObjectBase protected: // to be called from SLAPrint only. friend class SLAPrint; + friend class PrintBaseWithState; SLAPrintObject(SLAPrint* print, ModelObject* model_object); ~SLAPrintObject(); @@ -270,7 +304,8 @@ class SLAPrintObject : public _SLAPrintObjectBase { m_config.apply_only(other, keys, ignore_nonexistent); } void set_trafo(const Transform3d& trafo, bool left_handed) { - m_transformed_rmesh.invalidate([this, &trafo, left_handed](){ m_trafo = trafo; m_left_handed = left_handed; }); + m_trafo = trafo; + m_left_handed = left_handed; } template inline void set_instances(InstVec&& instances) { m_instances = std::forward(instances); } @@ -281,10 +316,6 @@ class SLAPrintObject : public _SLAPrintObjectBase // Invalidate steps based on a set of parameters changed. bool invalidate_state_by_config_options(const std::vector &opt_keys); - // Which steps have to be performed. Implicitly: all - // to be accessible from SLAPrint - std::vector m_stepmask; - private: // Object specific configuration, pulled from the configuration layer. SLAPrintObjectConfig m_config; @@ -305,46 +336,56 @@ class SLAPrintObject : public _SLAPrintObjectBase std::vector m_model_height_levels; - // Caching the transformed (m_trafo) raw mesh of the object - mutable CachedObject m_transformed_rmesh; - - class SupportData : public sla::SupportableMesh + struct SupportData { - public: - sla::SupportTree::UPtr support_tree_ptr; // the supports + sla::SupportableMesh input; // the input std::vector support_slices; // sliced supports - TriangleMesh tree_mesh, pad_mesh, full_mesh; + TriangleMesh tree_mesh, pad_mesh, full_mesh; // cached artifacts inline SupportData(const TriangleMesh &t) - : sla::SupportableMesh{t.its, {}, {}} + : input{t.its, {}, {}} + {} + + inline SupportData(const indexed_triangle_set &t) + : input{t, {}, {}} {} - sla::SupportTree::UPtr &create_support_tree(const sla::JobController &ctl) + void create_support_tree(const sla::JobController &ctl) { - support_tree_ptr = sla::SupportTree::create(*this, ctl); - tree_mesh = TriangleMesh{support_tree_ptr->retrieve_mesh(sla::MeshType::Support)}; - return support_tree_ptr; + tree_mesh = TriangleMesh{sla::create_support_tree(input, ctl)}; } - void create_pad(const ExPolygons &blueprint, const sla::PadConfig &pcfg) + void create_pad(const sla::JobController &ctl) { - if (!support_tree_ptr) - return; - - support_tree_ptr->add_pad(blueprint, pcfg); - pad_mesh = TriangleMesh{support_tree_ptr->retrieve_mesh(sla::MeshType::Pad)}; + pad_mesh = TriangleMesh{sla::create_pad(input, tree_mesh.its, ctl)}; } }; - - std::unique_ptr m_supportdata; - + + std::unique_ptr m_supportdata; + + // Holds CSG operations for the printed object, prioritized by print steps. + CSGContainer m_mesh_to_slice; + + auto mesh_to_slice(SLAPrintObjectStep s) const + { + auto r = m_mesh_to_slice.equal_range(s); + + return Range{r.first, r.second}; + } + + auto mesh_to_slice() const { return range(m_mesh_to_slice); } + + // Holds the preview of the object to be printed (as it will look like with + // all its holes and cavities, negatives and positive volumes unified. + // Essentially this should be a m_mesh_to_slice after the CSG operations + // or an approximation of that. + std::array, SLAPrintObjectStep::slaposCount + 1> m_preview_meshes; + class HollowingData { public: sla::InteriorPtr interior; - mutable TriangleMesh hollow_mesh_with_holes; // caching the complete hollowed mesh - mutable TriangleMesh hollow_mesh_with_holes_trimmed; }; std::unique_ptr m_hollowing_data; @@ -387,41 +428,6 @@ struct SLAPrintStatistics } }; -class SLAArchive { -protected: - std::vector m_layers; - - virtual std::unique_ptr create_raster() const = 0; - virtual sla::RasterEncoder get_encoder() const = 0; - -public: - virtual ~SLAArchive() = default; - - virtual void apply(const SLAPrinterConfig &cfg) = 0; - - // Fn have to be thread safe: void(sla::RasterBase& raster, size_t lyrid); - template - void draw_layers( - size_t layer_num, - Fn && drawfn, - CancelFn cancelfn = []() { return false; }, - const EP & ep = {}) - { - m_layers.resize(layer_num); - execution::for_each( - ep, size_t(0), m_layers.size(), - [this, &drawfn, &cancelfn](size_t idx) { - if (cancelfn()) return; - - sla::EncodedRaster &enc = m_layers[idx]; - auto rst = create_raster(); - drawfn(*rst, idx); - enc = rst->encode(get_encoder()); - }, - execution::max_concurrency(ep)); - } -}; - /** * @brief This class is the high level FSM for the SLA printing process. * @@ -439,7 +445,7 @@ class SLAPrint : public PrintBaseWithState public: - SLAPrint(): m_stepmask(slapsCount, true) {} + SLAPrint() = default; virtual ~SLAPrint() override { this->clear(); } @@ -450,9 +456,10 @@ class SLAPrint : public PrintBaseWithState // List of existing PrintObject IDs, to remove notifications for non-existent IDs. std::vector print_object_ids() const override; ApplyStatus apply(const Model &model, DynamicPrintConfig config) override; - void set_task(const TaskParams ¶ms) override; + void set_task(const TaskParams ¶ms) override { PrintBaseWithState::set_task_impl(params, m_objects); } void process() override; - void finalize() override; + void finalize() override { PrintBaseWithState::finalize_impl(m_objects); } + void cleanup() override {} // Returns true if an object step is done on all objects and there's at least one object. bool is_step_done(SLAPrintObjectStep step) const; // Returns true if the last step was finished with success. @@ -461,6 +468,11 @@ class SLAPrint : public PrintBaseWithState const PrintObjects& objects() const { return m_objects; } // PrintObject by its ObjectID, to be used to uniquely bind slicing warnings to their source PrintObjects // in the notification center. + const SLAPrintObject* get_print_object_by_model_object_id(ObjectID object_id) const { + auto it = std::find_if(m_objects.begin(), m_objects.end(), + [object_id](const SLAPrintObject* obj) { return obj->model_object()->id() == object_id; }); + return (it == m_objects.end()) ? nullptr : *it; + } const SLAPrintObject* get_object(ObjectID object_id) const { auto it = std::find_if(m_objects.begin(), m_objects.end(), [object_id](const SLAPrintObject *obj) { return obj->id() == object_id; }); @@ -525,8 +537,16 @@ class SLAPrint : public PrintBaseWithState // The aggregated and leveled print records from various objects. // TODO: use this structure for the preview in the future. const std::vector& print_layers() const { return m_printer_input; } - - void set_printer(SLAArchive *archiver); + + void export_print(const std::string &fname, const std::string &projectname = "") + { + ThumbnailsList thumbnails; //empty thumbnail list + export_print(fname, thumbnails, projectname); + } + + void export_print(const std::string &fname, + const ThumbnailsList &thumbnails, + const std::string &projectname = ""); private: @@ -542,13 +562,12 @@ class SLAPrint : public PrintBaseWithState SLAPrintObjectConfig m_default_object_config; PrintObjects m_objects; - std::vector m_stepmask; // Ready-made data for rasterization. std::vector m_printer_input; // The archive object which collects the raster images after slicing - SLAArchive *m_printer = nullptr; + std::unique_ptr m_archiver; // Estimated print time, material consumed. SLAPrintStatistics m_print_statistics; diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index fff506c0a2c..0e505dfc205 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -8,49 +8,58 @@ // Need the cylinder method for the the drainholes in hollowing step #include -#include +#include #include #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include #include +//#include #include #include "I18N.hpp" #include - -//! macro used to mark string used at localization, -//! return same string -#define L(s) Slic3r::I18N::translate(s) +#include "format.hpp" namespace Slic3r { namespace { const std::array OBJ_STEP_LEVELS = { - 10, // slaposHollowing, - 10, // slaposDrillHoles - 10, // slaposObjectSlice, - 20, // slaposSupportPoints, - 10, // slaposSupportTree, - 10, // slaposPad, - 30, // slaposSliceSupports, + 13, // slaposAssembly + 13, // slaposHollowing, + 13, // slaposDrillHoles + 13, // slaposObjectSlice, + 13, // slaposSupportPoints, + 13, // slaposSupportTree, + 11, // slaposPad, + 11, // slaposSliceSupports, }; std::string OBJ_STEP_LABELS(size_t idx) { switch (idx) { - case slaposHollowing: return L("Hollowing model"); - case slaposDrillHoles: return L("Drilling holes into model."); - case slaposObjectSlice: return L("Slicing model"); - case slaposSupportPoints: return L("Generating support points"); - case slaposSupportTree: return L("Generating support tree"); - case slaposPad: return L("Generating pad"); - case slaposSliceSupports: return L("Slicing supports"); + // TRN Status of the SLA print calculation + case slaposAssembly: return _u8L("Assembling model from parts"); + case slaposHollowing: return _u8L("Hollowing model"); + case slaposDrillHoles: return _u8L("Drilling holes into model."); + case slaposObjectSlice: return _u8L("Slicing model"); + case slaposSupportPoints: return _u8L("Generating support points"); + case slaposSupportTree: return _u8L("Generating support tree"); + case slaposPad: return _u8L("Generating pad"); + case slaposSliceSupports: return _u8L("Slicing supports"); default:; } assert(false); @@ -65,8 +74,8 @@ const std::array PRINT_STEP_LEVELS = { std::string PRINT_STEP_LABELS(size_t idx) { switch (idx) { - case slapsMergeSlicesAndEval: return L("Merging slices and calculating statistics"); - case slapsRasterize: return L("Rasterizing layers"); + case slapsMergeSlicesAndEval: return _u8L("Merging slices and calculating statistics"); + case slapsRasterize: return _u8L("Rasterizing layers"); default:; } assert(false); return "Out of bounds!"; @@ -76,7 +85,6 @@ std::string PRINT_STEP_LABELS(size_t idx) SLAPrint::Steps::Steps(SLAPrint *print) : m_print{print} - , m_rng{std::random_device{}()} , objcount{m_print->m_objects.size()} , ilhd{m_print->m_material_config.initial_layer_height.getFloat()} , ilh{float(ilhd)} @@ -119,361 +127,344 @@ void SLAPrint::Steps::apply_printer_corrections(SLAPrintObject &po, SliceOrigin } } -void SLAPrint::Steps::hollow_model(SLAPrintObject &po) +template bool is_all_positive(const Cont &csgmesh) { - po.m_hollowing_data.reset(); - - if (! po.m_config.hollowing_enable.getBool()) { - BOOST_LOG_TRIVIAL(info) << "Skipping hollowing step!"; - return; - } - - BOOST_LOG_TRIVIAL(info) << "Performing hollowing step!"; - - double thickness = po.m_config.hollowing_min_thickness.getFloat(); - double quality = po.m_config.hollowing_quality.getFloat(); - double closing_d = po.m_config.hollowing_closing_distance.getFloat(); - sla::HollowingConfig hlwcfg{thickness, quality, closing_d}; - - sla::InteriorPtr interior = generate_interior(po.transformed_mesh(), hlwcfg); - - if (!interior || sla::get_mesh(*interior).empty()) - BOOST_LOG_TRIVIAL(warning) << "Hollowed interior is empty!"; - else { - po.m_hollowing_data.reset(new SLAPrintObject::HollowingData()); - po.m_hollowing_data->interior = std::move(interior); - } + bool is_all_pos = + std::all_of(csgmesh.begin(), + csgmesh.end(), + [](auto &part) { + return csg::get_operation(part) == csg::CSGType::Union; + }); + + return is_all_pos; } -struct FaceHash { - - // A 64 bit number's max hex digits - static constexpr size_t MAX_NUM_CHARS = 16; - - // A hash is created for each triangle to be identifiable. The hash uses - // only the triangle's geometric traits, not the index in a particular mesh. - std::unordered_set facehash; - - // Returns the string in reverse, but that is ok for hashing - static std::array to_chars(int64_t val) - { - std::array ret; - - static const constexpr char * Conv = "0123456789abcdef"; - - auto ptr = ret.begin(); - auto uval = static_cast(std::abs(val)); - while (uval) { - *ptr = Conv[uval & 0xf]; - ++ptr; - uval = uval >> 4; +template +static indexed_triangle_set csgmesh_merge_positive_parts(const Cont &csgmesh) +{ + indexed_triangle_set m; + for (auto &csgpart : csgmesh) { + auto op = csg::get_operation(csgpart); + const indexed_triangle_set * pmesh = csg::get_mesh(csgpart); + if (pmesh && op == csg::CSGType::Union) { + indexed_triangle_set mcpy = *pmesh; + its_transform(mcpy, csg::get_transform(csgpart), true); + its_merge(m, mcpy); } - if (val < 0) { *ptr = '-'; ++ptr; } - *ptr = '\0'; // C style string ending - - return ret; } - static std::string hash(const Vec<3, int64_t> &v) - { - std::string ret; - ret.reserve(3 * MAX_NUM_CHARS); - - for (auto val : v) - ret += to_chars(val).data(); - - return ret; - } + return m; +} - static std::string facekey(const Vec3i &face, const std::vector &vertices) - { - // Scale to integer to avoid floating points - std::array, 3> pts = { - scaled(vertices[face(0)]), - scaled(vertices[face(1)]), - scaled(vertices[face(2)]) - }; +indexed_triangle_set SLAPrint::Steps::generate_preview_vdb( + SLAPrintObject &po, SLAPrintObjectStep step) +{ + // Empirical upper limit to not get excessive performance hit + constexpr double MaxPreviewVoxelScale = 12.; - // Get the first two sides of the triangle, do a cross product and move - // that vector to the center of the triangle. This encodes all - // information to identify an identical triangle at the same position. - Vec<3, int64_t> a = pts[0] - pts[2], b = pts[1] - pts[2]; - Vec<3, int64_t> c = a.cross(b) + (pts[0] + pts[1] + pts[2]) / 3; + // update preview mesh + double vscale = std::min(MaxPreviewVoxelScale, + 1. / po.m_config.layer_height.getFloat()); - // Return a concatenated string representation of the coordinates - return hash(c); - } + auto voxparams = csg::VoxelizeParams{} + .voxel_scale(vscale) + .exterior_bandwidth(1.f) + .interior_bandwidth(1.f); - FaceHash (const indexed_triangle_set &its): facehash(its.indices.size()) - { - for (const Vec3i &face : its.indices) - facehash.insert(facekey(face, its.vertices)); - } + voxparams.statusfn([&po](int){ + return po.m_print->cancel_status() != CancelStatus::NOT_CANCELED; + }); - bool find(const std::string &key) - { - auto it = facehash.find(key); - return it != facehash.end(); - } -}; + auto r = range(po.m_mesh_to_slice); + auto grid = csg::voxelize_csgmesh(r, voxparams); + auto m = grid ? grid_to_mesh(*grid, 0., 0.01) : indexed_triangle_set{}; + float loss_less_max_error = float(1e-6); + its_quadric_edge_collapse(m, 0U, &loss_less_max_error); -static void exclude_neighbors(const Vec3i &face, - std::vector &mask, - const indexed_triangle_set &its, - const VertexFaceIndex &index, - size_t recursions) -{ - for (int i = 0; i < 3; ++i) { - const auto &neighbors_range = index[face(i)]; - for (size_t fi_n : neighbors_range) { - mask[fi_n] = true; - if (recursions > 0) - exclude_neighbors(its.indices[fi_n], mask, its, index, recursions - 1); - } - } + return m; } -// Create exclude mask for triangle removal inside hollowed interiors. -// This is necessary when the interior is already part of the mesh which was -// drilled using CGAL mesh boolean operation. Excluded will be the triangles -// originally part of the interior mesh and triangles that make up the drilled -// hole walls. -static std::vector create_exclude_mask( - const indexed_triangle_set &its, - const sla::Interior &interior, - const std::vector &holes) +void SLAPrint::Steps::generate_preview(SLAPrintObject &po, SLAPrintObjectStep step) { - FaceHash interior_hash{sla::get_mesh(interior)}; + Benchmark bench; - std::vector exclude_mask(its.indices.size(), false); + bench.start(); - VertexFaceIndex neighbor_index{its}; + auto r = range(po.m_mesh_to_slice); + auto m = indexed_triangle_set{}; - for (size_t fi = 0; fi < its.indices.size(); ++fi) { - auto &face = its.indices[fi]; + bool handled = false; - if (interior_hash.find(FaceHash::facekey(face, its.vertices))) { - exclude_mask[fi] = true; - continue; + if (is_all_positive(r)) { + m = csgmesh_merge_positive_parts(r); + handled = true; + } else if (csg::check_csgmesh_booleans(r) == r.end()) { + MeshBoolean::cgal::CGALMeshPtr cgalmeshptr; + try { + cgalmeshptr = csg::perform_csgmesh_booleans(r); + } catch (...) { + // leaves cgalmeshptr as nullptr } - if (exclude_mask[fi]) { - exclude_neighbors(face, exclude_mask, its, neighbor_index, 1); - continue; + if (cgalmeshptr) { + m = MeshBoolean::cgal::cgal_to_indexed_triangle_set(*cgalmeshptr); + handled = true; + } else { + BOOST_LOG_TRIVIAL(warning) << "CSG mesh is not egligible for proper CGAL booleans!"; } + } else { + // Normal cgal processing failed. If there are no negative volumes, + // the hollowing can be tried with the old algorithm which didn't handled volumes. + // If that fails for any of the drillholes, the voxelization fallback is + // used. + + bool is_pure_model = is_all_positive(po.mesh_to_slice(slaposAssembly)); + bool can_hollow = po.m_hollowing_data && po.m_hollowing_data->interior && + !sla::get_mesh(*po.m_hollowing_data->interior).empty(); + + + bool hole_fail = false; + if (step == slaposHollowing && is_pure_model) { + if (can_hollow) { + m = csgmesh_merge_positive_parts(r); + sla::hollow_mesh(m, *po.m_hollowing_data->interior, + sla::hfRemoveInsideTriangles); + } - // Lets deal with the holes. All the triangles of a hole and all the - // neighbors of these triangles need to be kept. The neigbors were - // created by CGAL mesh boolean operation that modified the original - // interior inside the input mesh to contain the holes. - Vec3d tr_center = ( - its.vertices[face(0)] + - its.vertices[face(1)] + - its.vertices[face(2)] - ).cast() / 3.; - - // If the center is more than half a mm inside the interior, - // it cannot possibly be part of a hole wall. - if (sla::get_distance(tr_center, interior) < -0.5) - continue; - - Vec3f U = its.vertices[face(1)] - its.vertices[face(0)]; - Vec3f V = its.vertices[face(2)] - its.vertices[face(0)]; - Vec3f C = U.cross(V); - Vec3f face_normal = C.normalized(); - - for (const sla::DrainHole &dh : holes) { - if (dh.failed) continue; - - Vec3d dhpos = dh.pos.cast(); - Vec3d dhend = dhpos + dh.normal.cast() * dh.height; - - Linef3 holeaxis{dhpos, dhend}; - - double D_hole_center = line_alg::distance_to(holeaxis, tr_center); - double D_hole = std::abs(D_hole_center - dh.radius); - float dot = dh.normal.dot(face_normal); - - // Empiric tolerances for center distance and normals angle. - // For triangles that are part of a hole wall the angle of - // triangle normal and the hole axis is around 90 degrees, - // so the dot product is around zero. - double D_tol = dh.radius / sla::DrainHole::steps; - float normal_angle_tol = 1.f / sla::DrainHole::steps; - - if (D_hole < D_tol && std::abs(dot) < normal_angle_tol) { - exclude_mask[fi] = true; - exclude_neighbors(face, exclude_mask, its, neighbor_index, 1); + handled = true; + } else if (step == slaposDrillHoles && is_pure_model) { + if (po.m_model_object->sla_drain_holes.empty()) { + // Get the last printable preview + auto &meshp = po.get_mesh_to_print(); + if (meshp) + m = *(meshp); + + handled = true; + } else if (can_hollow) { + m = csgmesh_merge_positive_parts(r); + sla::hollow_mesh(m, *po.m_hollowing_data->interior); + sla::DrainHoles drainholes = po.transformed_drainhole_points(); + + auto ret = sla::hollow_mesh_and_drill( + m, *po.m_hollowing_data->interior, drainholes, + [/*&po, &drainholes, */&hole_fail](size_t i) + { + hole_fail = /*drainholes[i].failed = + po.model_object()->sla_drain_holes[i].failed =*/ true; + }); + + if (ret & static_cast(sla::HollowMeshResult::FaultyMesh)) { + po.active_step_add_warning( + PrintStateBase::WarningLevel::NON_CRITICAL, + _u8L("Mesh to be hollowed is not suitable for hollowing (does not " + "bound a volume).")); + } + + if (ret & static_cast(sla::HollowMeshResult::FaultyHoles)) { + po.active_step_add_warning( + PrintStateBase::WarningLevel::NON_CRITICAL, + _u8L("Unable to drill the current configuration of holes into the " + "model.")); + } + + handled = true; + + if (ret & static_cast(sla::HollowMeshResult::DrillingFailed)) { + po.active_step_add_warning( + PrintStateBase::WarningLevel::NON_CRITICAL, _u8L( + "Drilling holes into the mesh failed. " + "This is usually caused by broken model. Try to fix it first.")); + + handled = false; + } + + if (hole_fail) { + po.active_step_add_warning(PrintStateBase::WarningLevel::NON_CRITICAL, + _u8L("Failed to drill some holes into the model")); + + handled = false; + } } } } - return exclude_mask; -} - -static indexed_triangle_set -remove_unconnected_vertices(const indexed_triangle_set &its) -{ - if (its.indices.empty()) {}; - - indexed_triangle_set M; + if (!handled) { // Last resort to voxelization. + po.active_step_add_warning(PrintStateBase::WarningLevel::NON_CRITICAL, + _u8L("Can't perform full mesh booleans! " + "Some parts of the print will be previewed with approximated meshes. " + "This does not affect the quality of slices or the physical print in any way.")); + m = generate_preview_vdb(po, step); + } - std::vector vtransl(its.vertices.size(), -1); - int vcnt = 0; - for (auto &f : its.indices) { + po.m_preview_meshes[step] = + std::make_shared(std::move(m)); - for (int i = 0; i < 3; ++i) - if (vtransl[size_t(f(i))] < 0) { + for (size_t i = size_t(step) + 1; i < slaposCount; ++i) + { + po.m_preview_meshes[i] = {}; + } - M.vertices.emplace_back(its.vertices[size_t(f(i))]); - vtransl[size_t(f(i))] = vcnt++; - } + bench.stop(); - std::array new_f = { - vtransl[size_t(f(0))], - vtransl[size_t(f(1))], - vtransl[size_t(f(2))] - }; + if (!m.empty()) + BOOST_LOG_TRIVIAL(trace) << "Preview gen took: " << bench.getElapsedSec(); + else + BOOST_LOG_TRIVIAL(error) << "Preview failed!"; - M.indices.emplace_back(new_f[0], new_f[1], new_f[2]); - } + using namespace std::string_literals; - return M; + report_status(-2, "Reload preview from step "s + std::to_string(int(step)), SlicingStatus::RELOAD_SLA_PREVIEW); } -// Drill holes into the hollowed/original mesh. -void SLAPrint::Steps::drill_holes(SLAPrintObject &po) +static inline +void clear_csg(std::multiset &s, SLAPrintObjectStep step) { - bool needs_drilling = ! po.m_model_object->sla_drain_holes.empty(); - bool is_hollowed = - (po.m_hollowing_data && po.m_hollowing_data->interior && - !sla::get_mesh(*po.m_hollowing_data->interior).empty()); - - if (! is_hollowed && ! needs_drilling) { - // In this case we can dump any data that might have been - // generated on previous runs. - po.m_hollowing_data.reset(); - return; - } + auto r = s.equal_range(step); + s.erase(r.first, r.second); +} - if (! po.m_hollowing_data) - po.m_hollowing_data.reset(new SLAPrintObject::HollowingData()); +struct csg_inserter { + std::multiset &m; + SLAPrintObjectStep key; - // Hollowing and/or drilling is active, m_hollowing_data is valid. + csg_inserter &operator*() { return *this; } + void operator=(csg::CSGPart &&part) + { + part.its_ptr.convert_unique_to_shared(); + m.emplace(key, std::move(part)); + } + csg_inserter& operator++() { return *this; } +}; - // Regenerate hollowed mesh, even if it was there already. It may contain - // holes that are no longer on the frontend. - TriangleMesh &hollowed_mesh = po.m_hollowing_data->hollow_mesh_with_holes; - hollowed_mesh = po.transformed_mesh(); - if (is_hollowed) - sla::hollow_mesh(hollowed_mesh, *po.m_hollowing_data->interior); +void SLAPrint::Steps::mesh_assembly(SLAPrintObject &po) +{ + po.m_mesh_to_slice.clear(); + po.m_supportdata.reset(); + po.m_hollowing_data.reset(); - TriangleMesh &mesh_view = po.m_hollowing_data->hollow_mesh_with_holes_trimmed; + csg::model_to_csgmesh(*po.model_object(), po.trafo(), + csg_inserter{po.m_mesh_to_slice, slaposAssembly}, + csg::mpartsPositive | csg::mpartsNegative | csg::mpartsDoSplits); - if (! needs_drilling) { - mesh_view = po.transformed_mesh(); + generate_preview(po, slaposAssembly); +} - if (is_hollowed) - sla::hollow_mesh(mesh_view, *po.m_hollowing_data->interior, - sla::hfRemoveInsideTriangles); +void SLAPrint::Steps::hollow_model(SLAPrintObject &po) +{ + po.m_hollowing_data.reset(); + po.m_supportdata.reset(); + clear_csg(po.m_mesh_to_slice, slaposDrillHoles); + clear_csg(po.m_mesh_to_slice, slaposHollowing); - BOOST_LOG_TRIVIAL(info) << "Drilling skipped (no holes)."; + if (! po.m_config.hollowing_enable.getBool()) { + BOOST_LOG_TRIVIAL(info) << "Skipping hollowing step!"; return; } - BOOST_LOG_TRIVIAL(info) << "Drilling drainage holes."; - sla::DrainHoles drainholes = po.transformed_drainhole_points(); - - auto tree = AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set( - hollowed_mesh.its.vertices, - hollowed_mesh.its.indices - ); - - std::uniform_real_distribution dist(0., float(EPSILON)); - auto holes_mesh_cgal = MeshBoolean::cgal::triangle_mesh_to_cgal({}, {}); - indexed_triangle_set part_to_drill = hollowed_mesh.its; - - bool hole_fail = false; - for (size_t i = 0; i < drainholes.size(); ++i) { - sla::DrainHole holept = drainholes[i]; - - holept.normal += Vec3f{dist(m_rng), dist(m_rng), dist(m_rng)}; - holept.normal.normalize(); - holept.pos += Vec3f{dist(m_rng), dist(m_rng), dist(m_rng)}; - indexed_triangle_set m = holept.to_mesh(); + BOOST_LOG_TRIVIAL(info) << "Performing hollowing step!"; - part_to_drill.indices.clear(); - auto bb = bounding_box(m); - Eigen::AlignedBox ebb{bb.min.cast(), - bb.max.cast()}; + double thickness = po.m_config.hollowing_min_thickness.getFloat(); + double quality = po.m_config.hollowing_quality.getFloat(); + double closing_d = po.m_config.hollowing_closing_distance.getFloat(); + sla::HollowingConfig hlwcfg{thickness, quality, closing_d}; + sla::JobController ctl; + ctl.stopcondition = [this]() { return canceled(); }; + ctl.cancelfn = [this]() { throw_if_canceled(); }; - AABBTreeIndirect::traverse( - tree, - AABBTreeIndirect::intersecting(ebb), - [&part_to_drill, &hollowed_mesh](size_t faceid) - { - part_to_drill.indices.emplace_back(hollowed_mesh.its.indices[faceid]); - }); + sla::InteriorPtr interior = + generate_interior(po.mesh_to_slice(), hlwcfg, ctl); - auto cgal_meshpart = MeshBoolean::cgal::triangle_mesh_to_cgal( - remove_unconnected_vertices(part_to_drill)); + if (!interior || sla::get_mesh(*interior).empty()) + BOOST_LOG_TRIVIAL(warning) << "Hollowed interior is empty!"; + else { + po.m_hollowing_data.reset(new SLAPrintObject::HollowingData()); + po.m_hollowing_data->interior = std::move(interior); - if (MeshBoolean::cgal::does_self_intersect(*cgal_meshpart)) { - BOOST_LOG_TRIVIAL(error) << "Failed to drill hole"; + indexed_triangle_set &m = sla::get_mesh(*po.m_hollowing_data->interior); - hole_fail = drainholes[i].failed = - po.model_object()->sla_drain_holes[i].failed = true; + if (!m.empty()) { + // simplify mesh lossless + float loss_less_max_error = 2*std::numeric_limits::epsilon(); + its_quadric_edge_collapse(m, 0U, &loss_less_max_error); - continue; + its_compactify_vertices(m); + its_merge_vertices(m); } - auto cgal_hole = MeshBoolean::cgal::triangle_mesh_to_cgal(m); - MeshBoolean::cgal::plus(*holes_mesh_cgal, *cgal_hole); + // Put the interior into the target mesh as a negative + po.m_mesh_to_slice + .emplace(slaposHollowing, + csg::CSGPart{std::make_shared(m), + csg::CSGType::Difference}); + + generate_preview(po, slaposHollowing); } +} - if (MeshBoolean::cgal::does_self_intersect(*holes_mesh_cgal)) - throw Slic3r::SlicingError(L("Too many overlapping holes.")); +// Drill holes into the hollowed/original mesh. +void SLAPrint::Steps::drill_holes(SLAPrintObject &po) +{ + po.m_supportdata.reset(); + clear_csg(po.m_mesh_to_slice, slaposDrillHoles); - auto hollowed_mesh_cgal = MeshBoolean::cgal::triangle_mesh_to_cgal(hollowed_mesh); + csg::model_to_csgmesh(*po.model_object(), po.trafo(), + csg_inserter{po.m_mesh_to_slice, slaposDrillHoles}, + csg::mpartsDrillHoles); - if (!MeshBoolean::cgal::does_bound_a_volume(*hollowed_mesh_cgal)) { - po.active_step_add_warning( - PrintStateBase::WarningLevel::NON_CRITICAL, - L("Mesh to be hollowed is not suitable for hollowing (does not " - "bound a volume).")); - } + generate_preview(po, slaposDrillHoles); - if (!MeshBoolean::cgal::empty(*holes_mesh_cgal) - && !MeshBoolean::cgal::does_bound_a_volume(*holes_mesh_cgal)) { - po.active_step_add_warning( - PrintStateBase::WarningLevel::NON_CRITICAL, - L("Unable to drill the current configuration of holes into the " - "model.")); + // Release the data, won't be needed anymore, takes huge amount of ram + if (po.m_hollowing_data && po.m_hollowing_data->interior) + po.m_hollowing_data->interior.reset(); +} + +template +static std::vector slice_volumes( + const ModelVolumePtrs &volumes, + const std::vector &slice_grid, + const Transform3d &trafo, + const MeshSlicingParamsEx &slice_params, + Pred &&predicate) +{ + indexed_triangle_set mesh; + for (const ModelVolume *vol : volumes) { + if (predicate(vol)) { + indexed_triangle_set vol_mesh = vol->mesh().its; + its_transform(vol_mesh, trafo * vol->get_matrix()); + its_merge(mesh, vol_mesh); + } } - try { - if (!MeshBoolean::cgal::empty(*holes_mesh_cgal)) - MeshBoolean::cgal::minus(*hollowed_mesh_cgal, *holes_mesh_cgal); + std::vector out; - hollowed_mesh = MeshBoolean::cgal::cgal_to_triangle_mesh(*hollowed_mesh_cgal); - mesh_view = hollowed_mesh; + if (!mesh.empty()) { + out = slice_mesh_ex(mesh, slice_grid, slice_params); + } - if (is_hollowed) { - auto &interior = *po.m_hollowing_data->interior; - std::vector exclude_mask = - create_exclude_mask(mesh_view.its, interior, drainholes); + return out; +} - sla::remove_inside_triangles(mesh_view, interior, exclude_mask); - } - } catch (const Slic3r::RuntimeError &) { - throw Slic3r::SlicingError(L( - "Drilling holes into the mesh failed. " - "This is usually caused by broken model. Try to fix it first.")); +template BoundingBoxf3 csgmesh_positive_bb(const Cont &csg) +{ + // Calculate the biggest possible bounding box of the mesh to be sliced + // from all the positive parts that it contains. + BoundingBoxf3 bb3d; + + bool skip = false; + for (const auto &m : csg) { + auto op = csg::get_operation(m); + auto stackop = csg::get_stack_operation(m); + if (stackop == csg::CSGStackOp::Push && op != csg::CSGType::Union) + skip = true; + + if (!skip && csg::get_mesh(m) && op == csg::CSGType::Union) + bb3d.merge(bounding_box(*csg::get_mesh(m), csg::get_transform(m))); + + if (stackop == csg::CSGStackOp::Pop) + skip = false; } - if (hole_fail) - po.active_step_add_warning(PrintStateBase::WarningLevel::NON_CRITICAL, - L("Failed to drill some holes into the model")); + return bb3d; } // The slicing will be performed on an imaginary 1D grid which starts from @@ -486,14 +477,17 @@ void SLAPrint::Steps::drill_holes(SLAPrintObject &po) // same imaginary grid (the height vector argument to TriangleMeshSlicer). void SLAPrint::Steps::slice_model(SLAPrintObject &po) { - const TriangleMesh &mesh = po.get_mesh_to_slice(); + // The first mesh in the csg sequence is assumed to be a positive part + assert(po.m_mesh_to_slice.empty() || + csg::get_operation(*po.m_mesh_to_slice.begin()) == csg::CSGType::Union); + + auto bb3d = csgmesh_positive_bb(po.m_mesh_to_slice); // We need to prepare the slice index... double lhd = m_print->m_objects.front()->m_config.layer_height.getFloat(); float lh = float(lhd); coord_t lhs = scaled(lhd); - auto && bb3d = mesh.bounding_box(); double minZ = bb3d.min(Z) - po.get_elevation(); double maxZ = bb3d.max(Z); auto minZf = float(minZ); @@ -517,8 +511,7 @@ void SLAPrint::Steps::slice_model(SLAPrintObject &po) if(slindex_it == po.m_slice_index.end()) //TRN To be shown at the status bar on SLA slicing error. throw Slic3r::RuntimeError( - L("Slicing had to be stopped due to an internal error: " - "Inconsistent slice index.")); + format(_u8L("Model named: %s can not be sliced. Please check if the model is sane."), po.model_object()->name)); po.m_model_height_levels.clear(); po.m_model_height_levels.reserve(po.m_slice_index.size()); @@ -535,26 +528,8 @@ void SLAPrint::Steps::slice_model(SLAPrintObject &po) } auto thr = [this]() { m_print->throw_if_canceled(); }; auto &slice_grid = po.m_model_height_levels; - po.m_model_slices = slice_mesh_ex(mesh.its, slice_grid, params, thr); - sla::Interior *interior = po.m_hollowing_data ? - po.m_hollowing_data->interior.get() : - nullptr; - - if (interior && ! sla::get_mesh(*interior).empty()) { - indexed_triangle_set interiormesh = sla::get_mesh(*interior); - sla::swap_normals(interiormesh); - params.mode = MeshSlicingParams::SlicingMode::Regular; - - std::vector interior_slices = slice_mesh_ex(interiormesh, slice_grid, params, thr); - - sla::ccr::for_each(size_t(0), interior_slices.size(), - [&po, &interior_slices] (size_t i) { - const ExPolygons &slice = interior_slices[i]; - po.m_model_slices[i] = - diff_ex(po.m_model_slices[i], slice); - }); - } + po.m_model_slices = slice_csgmesh_ex(po.mesh_to_slice(), slice_grid, params, thr); auto mit = slindex_it; for (size_t id = 0; @@ -566,10 +541,67 @@ void SLAPrint::Steps::slice_model(SLAPrintObject &po) // We apply the printer correction offset here. apply_printer_corrections(po, soModel); - if(po.m_config.supports_enable.getBool() || po.m_config.pad_enable.getBool()) - { - po.m_supportdata.reset(new SLAPrintObject::SupportData(po.get_mesh_to_print())); +// po.m_preview_meshes[slaposObjectSlice] = po.get_mesh_to_print(); +// report_status(-2, "", SlicingStatus::RELOAD_SLA_PREVIEW); +} + + +struct SuppPtMask { + const std::vector &blockers; + const std::vector &enforcers; + bool enforcers_only = false; +}; + +static void filter_support_points_by_modifiers(sla::SupportPoints &pts, + const SuppPtMask &mask, + const std::vector &slice_grid) +{ + assert((mask.blockers.empty() || mask.blockers.size() == slice_grid.size()) && + (mask.enforcers.empty() || mask.enforcers.size() == slice_grid.size())); + + auto new_pts = reserve_vector(pts.size()); + + for (size_t i = 0; i < pts.size(); ++i) { + const sla::SupportPoint &sp = pts[i]; + Point sp2d = scaled(to_2d(sp.pos)); + + auto it = std::lower_bound(slice_grid.begin(), slice_grid.end(), sp.pos.z()); + if (it != slice_grid.end()) { + size_t idx = std::distance(slice_grid.begin(), it); + bool is_enforced = false; + if (idx < mask.enforcers.size()) { + for (size_t enf_idx = 0; + !is_enforced && enf_idx < mask.enforcers[idx].size(); + ++enf_idx) + { + if (mask.enforcers[idx][enf_idx].contains(sp2d)) + is_enforced = true; + } + } + + bool is_blocked = false; + if (!is_enforced) { + if (!mask.enforcers_only) { + if (idx < mask.blockers.size()) { + for (size_t blk_idx = 0; + !is_blocked && blk_idx < mask.blockers[idx].size(); + ++blk_idx) + { + if (mask.blockers[idx][blk_idx].contains(sp2d)) + is_blocked = true; + } + } + } else { + is_blocked = true; + } + } + + if (!is_blocked) + new_pts.emplace_back(sp); + } } + + pts.swap(new_pts); } // In this step we check the slices, identify island and cover them with @@ -579,8 +611,15 @@ void SLAPrint::Steps::support_points(SLAPrintObject &po) // If supports are disabled, we can skip the model scan. if(!po.m_config.supports_enable.getBool()) return; - if (!po.m_supportdata) - po.m_supportdata.reset(new SLAPrintObject::SupportData(po.get_mesh_to_print())); + if (!po.m_supportdata) { + auto &meshp = po.get_mesh_to_print(); + assert(meshp); + po.m_supportdata = + std::make_unique(*meshp); + } + + po.m_supportdata->input.zoffset = csgmesh_positive_bb(po.m_mesh_to_slice) + .min.z(); const ModelObject& mo = *po.m_model_object; @@ -595,11 +634,6 @@ void SLAPrint::Steps::support_points(SLAPrintObject &po) // calculate heights of slices (slices are calculated already) const std::vector& heights = po.m_model_height_levels; - // Tell the mesh where drain holes are. Although the points are - // calculated on slices, the algorithm then raycasts the points - // so they actually lie on the mesh. -// po.m_supportdata->emesh.load_holes(po.transformed_drainhole_points()); - throw_if_canceled(); sla::SupportPointGenerator::Config config; const SLAPrintObjectConfig& cfg = po.config(); @@ -623,25 +657,46 @@ void SLAPrint::Steps::support_points(SLAPrintObject &po) // Construction of this object does the calculation. throw_if_canceled(); sla::SupportPointGenerator auto_supports( - po.m_supportdata->emesh, po.get_model_slices(), heights, config, - [this]() { throw_if_canceled(); }, statuscb); + po.m_supportdata->input.emesh, po.get_model_slices(), + heights, config, [this]() { throw_if_canceled(); }, statuscb); // Now let's extract the result. - const std::vector& points = auto_supports.output(); + std::vector& points = auto_supports.output(); throw_if_canceled(); - po.m_supportdata->pts = points; - BOOST_LOG_TRIVIAL(debug) << "Automatic support points: " - << po.m_supportdata->pts.size(); + MeshSlicingParamsEx params; + params.closing_radius = float(po.config().slice_closing_radius.value); + std::vector blockers = + slice_volumes(po.model_object()->volumes, + po.m_model_height_levels, po.trafo(), params, + [](const ModelVolume *vol) { + return vol->is_support_blocker(); + }); + + std::vector enforcers = + slice_volumes(po.model_object()->volumes, + po.m_model_height_levels, po.trafo(), params, + [](const ModelVolume *vol) { + return vol->is_support_enforcer(); + }); + + SuppPtMask mask{blockers, enforcers, po.config().support_enforcers_only.getBool()}; + filter_support_points_by_modifiers(points, mask, po.m_model_height_levels); + + po.m_supportdata->input.pts = points; + + BOOST_LOG_TRIVIAL(debug) + << "Automatic support points: " + << po.m_supportdata->input.pts.size(); // Using RELOAD_SLA_SUPPORT_POINTS to tell the Plater to pass // the update status to GLGizmoSlaSupports - report_status(-1, L("Generating support points"), + report_status(-1, _u8L("Generating support points"), SlicingStatus::RELOAD_SLA_SUPPORT_POINTS); } else { // There are either some points on the front-end, or the user // removed them on purpose. No calculation will be done. - po.m_supportdata->pts = po.transformed_support_points(); + po.m_supportdata->input.pts = po.transformed_support_points(); } } @@ -649,20 +704,17 @@ void SLAPrint::Steps::support_tree(SLAPrintObject &po) { if(!po.m_supportdata) return; - sla::PadConfig pcfg = make_pad_cfg(po.m_config); - - if (pcfg.embed_object) - po.m_supportdata->emesh.ground_level_offset(pcfg.wall_thickness_mm); - // If the zero elevation mode is engaged, we have to filter out all the // points that are on the bottom of the object if (is_zero_elevation(po.config())) { - remove_bottom_points(po.m_supportdata->pts, - float(po.m_supportdata->emesh.ground_level() + EPSILON)); + remove_bottom_points(po.m_supportdata->input.pts, + float( + po.m_supportdata->input.zoffset + + EPSILON)); } - po.m_supportdata->cfg = make_support_cfg(po.m_config); -// po.m_supportdata->emesh.load_holes(po.transformed_drainhole_points()); + po.m_supportdata->input.cfg = make_support_cfg(po.m_config); + po.m_supportdata->input.pad_cfg = make_pad_cfg(po.m_config); // scaling for the sub operations double d = objectstep_scale * OBJ_STEP_LEVELS[slaposSupportTree] / 100.0; @@ -688,16 +740,16 @@ void SLAPrint::Steps::support_tree(SLAPrintObject &po) auto rc = SlicingStatus::RELOAD_SCENE; // This is to prevent "Done." being displayed during merged_mesh() - report_status(-1, L("Visualizing supports")); + report_status(-1, _u8L("Visualizing supports")); BOOST_LOG_TRIVIAL(debug) << "Processed support point count " - << po.m_supportdata->pts.size(); + << po.m_supportdata->input.pts.size(); // Check the mesh for later troubleshooting. if(po.support_mesh().empty()) BOOST_LOG_TRIVIAL(warning) << "Support mesh is empty"; - report_status(-1, L("Visualizing supports"), rc); + report_status(-1, _u8L("Visualizing supports"), rc); } void SLAPrint::Steps::generate_pad(SLAPrintObject &po) { @@ -706,36 +758,36 @@ void SLAPrint::Steps::generate_pad(SLAPrintObject &po) { // repeated) if(po.m_config.pad_enable.getBool()) { + if (!po.m_supportdata) { + auto &meshp = po.get_mesh_to_print(); + assert(meshp); + po.m_supportdata = + std::make_unique(*meshp); + } + // Get the distilled pad configuration from the config + // (Again, despite it was retrieved in the previous step. Note that + // on a param change event, the previous step might not be executed + // depending on the specific parameter that has changed). sla::PadConfig pcfg = make_pad_cfg(po.m_config); + po.m_supportdata->input.pad_cfg = pcfg; - ExPolygons bp; // This will store the base plate of the pad. - double pad_h = pcfg.full_height(); - const TriangleMesh &trmesh = po.transformed_mesh(); - - if (!po.m_config.supports_enable.getBool() || pcfg.embed_object) { - // No support (thus no elevation) or zero elevation mode - // we sometimes call it "builtin pad" is enabled so we will - // get a sample from the bottom of the mesh and use it for pad - // creation. - sla::pad_blueprint(trmesh.its, bp, float(pad_h), - float(po.m_config.layer_height.getFloat()), - [this](){ throw_if_canceled(); }); - } - - po.m_supportdata->create_pad(bp, pcfg); + sla::JobController ctl; + ctl.stopcondition = [this]() { return canceled(); }; + ctl.cancelfn = [this]() { throw_if_canceled(); }; + po.m_supportdata->create_pad(ctl); - if (!validate_pad(po.m_supportdata->support_tree_ptr->retrieve_mesh(sla::MeshType::Pad), pcfg)) + if (!validate_pad(po.m_supportdata->pad_mesh.its, pcfg)) throw Slic3r::SlicingError( - L("No pad can be generated for this model with the " + _u8L("No pad can be generated for this model with the " "current configuration")); - } else if(po.m_supportdata && po.m_supportdata->support_tree_ptr) { - po.m_supportdata->support_tree_ptr->remove_pad(); + } else if(po.m_supportdata) { + po.m_supportdata->pad_mesh = {}; } throw_if_canceled(); - report_status(-1, L("Visualizing supports"), SlicingStatus::RELOAD_SCENE); + report_status(-1, _u8L("Visualizing supports"), SlicingStatus::RELOAD_SCENE); } // Slicing the support geometries similarly to the model slicing procedure. @@ -750,13 +802,18 @@ void SLAPrint::Steps::slice_supports(SLAPrintObject &po) { if (!po.m_config.supports_enable.getBool() && !po.m_config.pad_enable.getBool()) return; - if(sd && sd->support_tree_ptr) { + if(sd) { auto heights = reserve_vector(po.m_slice_index.size()); for(auto& rec : po.m_slice_index) heights.emplace_back(rec.slice_level()); - sd->support_slices = sd->support_tree_ptr->slice( - heights, float(po.config().slice_closing_radius.value)); + sla::JobController ctl; + ctl.stopcondition = [this]() { return canceled(); }; + ctl.cancelfn = [this]() { throw_if_canceled(); }; + + sd->support_slices = + sla::slice(sd->tree_mesh.its, sd->pad_mesh.its, heights, + float(po.config().slice_closing_radius.value), ctl); } for (size_t i = 0; i < sd->support_slices.size() && i < po.m_slice_index.size(); ++i) @@ -851,7 +908,7 @@ void SLAPrint::Steps::initialize_printer_input() for(const SliceRecord& slicerecord : o->get_slice_index()) { if (!slicerecord.is_valid()) throw Slic3r::SlicingError( - L("There are unprintable objects. Try to " + _u8L("There are unprintable objects. Try to " "adjust support settings to make the " "objects printable.")); @@ -913,8 +970,8 @@ void SLAPrint::Steps::merge_slices_and_eval_stats() { const double delta_fade_time = (init_exp_time - exp_time) / (fade_layers_cnt + 1); double fade_layer_time = init_exp_time; - sla::ccr::SpinningMutex mutex; - using Lock = std::lock_guard; + execution::SpinningMutex mutex; + using Lock = std::lock_guard; // Going to parallel: auto printlayerfn = [this, @@ -1051,7 +1108,8 @@ void SLAPrint::Steps::merge_slices_and_eval_stats() { // sequential version for debugging: // for(size_t i = 0; i < m_printer_input.size(); ++i) printlayerfn(i); - sla::ccr::for_each(size_t(0), printer_input.size(), printlayerfn); + execution::for_each(ex_tbb, size_t(0), printer_input.size(), printlayerfn, + execution::max_concurrency(ex_tbb)); auto SCALING2 = SCALING_FACTOR * SCALING_FACTOR; print_statistics.support_used_material = supports_volume * SCALING2; @@ -1060,7 +1118,7 @@ void SLAPrint::Steps::merge_slices_and_eval_stats() { // Estimated printing time // A layers count o the highest object if (printer_input.size() == 0) - print_statistics.estimated_print_time = std::nan(""); + print_statistics.estimated_print_time = NaNd; else { print_statistics.estimated_print_time = estim_time; print_statistics.layers_times = layers_times; @@ -1075,7 +1133,7 @@ void SLAPrint::Steps::merge_slices_and_eval_stats() { // Rasterizing the model objects, and their supports void SLAPrint::Steps::rasterize() { - if(canceled() || !m_print->m_printer) return; + if(canceled() || !m_print->m_archiver) return; // coefficient to map the rasterization state (0-99) to the allocated // portion (slot) of the process state @@ -1090,8 +1148,7 @@ void SLAPrint::Steps::rasterize() double increment = (slot * sd) / m_print->m_printer_input.size(); double dstatus = current_status(); - sla::ccr::SpinningMutex slck; - using Lock = std::lock_guard; + execution::SpinningMutex slck; // procedure to process one height level. This will run in parallel auto lvlfn = @@ -1106,7 +1163,7 @@ void SLAPrint::Steps::rasterize() // Status indication guarded with the spinlock { - Lock lck(slck); + std::lock_guard lck(slck); dstatus += increment; double st = std::round(dstatus); if(st > pst) { @@ -1120,7 +1177,7 @@ void SLAPrint::Steps::rasterize() if(canceled()) return; // Print all the layers in parallel - m_print->m_printer->draw_layers(m_print->m_printer_input.size(), lvlfn, + m_print->m_archiver->draw_layers(m_print->m_printer_input.size(), lvlfn, [this]() { return canceled(); }, ex_tbb); } @@ -1147,6 +1204,7 @@ double SLAPrint::Steps::progressrange(SLAPrintStep step) const void SLAPrint::Steps::execute(SLAPrintObjectStep step, SLAPrintObject &obj) { switch(step) { + case slaposAssembly: mesh_assembly(obj); break; case slaposHollowing: hollow_model(obj); break; case slaposDrillHoles: drill_holes(obj); break; case slaposObjectSlice: slice_model(obj); break; diff --git a/src/libslic3r/SLAPrintSteps.hpp b/src/libslic3r/SLAPrintSteps.hpp index 19b64d4a981..32d10a424ca 100644 --- a/src/libslic3r/SLAPrintSteps.hpp +++ b/src/libslic3r/SLAPrintSteps.hpp @@ -14,40 +14,43 @@ class SLAPrint::Steps { private: SLAPrint *m_print = nullptr; - std::mt19937 m_rng; - -public: + +public: // where the per object operations start and end - static const constexpr unsigned min_objstatus = 0; - static const constexpr unsigned max_objstatus = 50; - + static const constexpr unsigned min_objstatus = 0; + static const constexpr unsigned max_objstatus = 70; + private: const size_t objcount; - + // shortcut to initial layer height const double ilhd; const float ilh; const coord_t ilhs; - + // the coefficient that multiplies the per object status values which // are set up for <0, 100>. They need to be scaled into the whole process const double objectstep_scale; - + template void report_status(Args&&...args) { m_print->m_report_status(*m_print, std::forward(args)...); } - + double current_status() const { return m_print->m_report_status.status(); } void throw_if_canceled() const { m_print->throw_if_canceled(); } bool canceled() const { return m_print->canceled(); } void initialize_printer_input(); - + void apply_printer_corrections(SLAPrintObject &po, SliceOrigin o); - + + void generate_preview(SLAPrintObject &po, SLAPrintObjectStep step); + indexed_triangle_set generate_preview_vdb(SLAPrintObject &po, SLAPrintObjectStep step); + public: explicit Steps(SLAPrint *print); - + + void mesh_assembly(SLAPrintObject &po); void hollow_model(SLAPrintObject &po); void drill_holes (SLAPrintObject &po); void slice_model(SLAPrintObject& po); @@ -55,20 +58,20 @@ class SLAPrint::Steps void support_tree(SLAPrintObject& po); void generate_pad(SLAPrintObject& po); void slice_supports(SLAPrintObject& po); - + void merge_slices_and_eval_stats(); void rasterize(); - + void execute(SLAPrintObjectStep step, SLAPrintObject &obj); void execute(SLAPrintStep step); - + static std::string label(SLAPrintObjectStep step); static std::string label(SLAPrintStep step); - + double progressrange(SLAPrintObjectStep step) const; double progressrange(SLAPrintStep step) const; }; -} +} // namespace Slic3r #endif // SLAPRINTSTEPS_HPP diff --git a/src/libslic3r/SVG.cpp b/src/libslic3r/SVG.cpp index d68301e74e1..4770334de19 100644 --- a/src/libslic3r/SVG.cpp +++ b/src/libslic3r/SVG.cpp @@ -88,10 +88,8 @@ void SVG::draw(const ExPolygon &expolygon, std::string fill, const float fill_op this->fill = fill; std::string d; - Polygons pp = expolygon; - for (Polygons::const_iterator p = pp.begin(); p != pp.end(); ++p) { - d += this->get_path_d(*p, true) + " "; - } + for (const Polygon &p : to_polygons(expolygon)) + d += this->get_path_d(p, true) + " "; this->path(d, true, 0, fill_opacity); } @@ -181,8 +179,8 @@ void SVG::draw(const ThickLines &thicklines, const std::string &fill, const std: void SVG::draw(const ThickPolylines &polylines, const std::string &stroke, coordf_t stroke_width) { - for (ThickPolylines::const_iterator it = polylines.begin(); it != polylines.end(); ++it) - this->draw((Polyline)*it, stroke, stroke_width); + for (const ThickPolyline &pl : polylines) + this->draw(Polyline(pl.points), stroke, stroke_width); } void SVG::draw(const ThickPolylines &thickpolylines, const std::string &fill, const std::string &stroke, coordf_t stroke_width) @@ -359,7 +357,7 @@ void SVG::export_expolygons(const char *path, const std::vector 0) for (const ExPolygon &expoly : exp_with_attr.first) - svg.draw((Points)expoly, exp_with_attr.second.color_points, exp_with_attr.second.radius_points); + svg.draw(to_points(expoly), exp_with_attr.second.color_points, exp_with_attr.second.radius_points); // Export legend. // 1st row @@ -380,4 +378,10 @@ void SVG::export_expolygons(const char *path, const std::vector(x) * 10.f; } + +} // namespace Slic3r diff --git a/src/libslic3r/SVG.hpp b/src/libslic3r/SVG.hpp index 3ff2213d81d..25727139e26 100644 --- a/src/libslic3r/SVG.hpp +++ b/src/libslic3r/SVG.hpp @@ -167,9 +167,9 @@ class SVG { export_expolygons(path.c_str(), expolygons_with_attributes); } private: - static float to_svg_coord(float x) throw() { return unscale(x) * 10.f; } - static float to_svg_x(float x) throw() { return to_svg_coord(x); } - float to_svg_y(float x) const throw() { return flipY ? this->height - to_svg_coord(x) : to_svg_coord(x); } + static float to_svg_coord(float x) throw(); + static float to_svg_x(float x) throw() { return to_svg_coord(x); } + float to_svg_y(float x) const throw() { return flipY ? this->height - to_svg_coord(x) : to_svg_coord(x); } }; } diff --git a/src/libslic3r/Semver.hpp b/src/libslic3r/Semver.hpp index 45d2bac1c44..a7489deb611 100644 --- a/src/libslic3r/Semver.hpp +++ b/src/libslic3r/Semver.hpp @@ -110,10 +110,30 @@ class Semver void set_maj(int maj) { ver.major = maj; } void set_min(int min) { ver.minor = min; } void set_patch(int patch) { ver.patch = patch; } - void set_metadata(boost::optional meta) { ver.metadata = meta ? strdup(*meta) : nullptr; } - void set_metadata(const char *meta) { ver.metadata = meta ? strdup(meta) : nullptr; } - void set_prerelease(boost::optional pre) { ver.prerelease = pre ? strdup(*pre) : nullptr; } - void set_prerelease(const char *pre) { ver.prerelease = pre ? strdup(pre) : nullptr; } + void set_metadata(boost::optional meta) + { + if (ver.metadata) + free(ver.metadata); + ver.metadata = meta ? strdup(*meta) : nullptr; + } + void set_metadata(const char *meta) + { + if (ver.metadata) + free(ver.metadata); + ver.metadata = meta ? strdup(meta) : nullptr; + } + void set_prerelease(boost::optional pre) + { + if (ver.prerelease) + free(ver.prerelease); + ver.prerelease = pre ? strdup(*pre) : nullptr; + } + void set_prerelease(const char *pre) + { + if (ver.prerelease) + free(ver.prerelease); + ver.prerelease = pre ? strdup(pre) : nullptr; + } // Comparison bool operator<(const Semver &b) const { return ::semver_compare(ver, b.ver) == -1; } diff --git a/src/libslic3r/ShortestPath.cpp b/src/libslic3r/ShortestPath.cpp index 449ff45b532..da1a44ec75d 100644 --- a/src/libslic3r/ShortestPath.cpp +++ b/src/libslic3r/ShortestPath.cpp @@ -195,7 +195,15 @@ std::vector> chain_segments_greedy_constrained_reversals } // Initialize a heap of end points sorted by the lowest distance to the next valid point of a path. - auto queue = make_mutable_priority_queue( + auto queue = make_mutable_priority_queue( [](EndPoint *ep, size_t idx){ ep->heap_idx = idx; }, [](EndPoint *l, EndPoint *r){ return l->distance_out < r->distance_out; }); queue.reserve(end_points.size() * 2 - 1); @@ -213,7 +221,7 @@ std::vector> chain_segments_greedy_constrained_reversals assert(ep.chain_id == 0); } else { // End point is NOT on the heap, therefore it is part of the output path. - assert(ep.heap_idx == std::numeric_limits::max()); + assert(ep.heap_idx == queue.invalid_id()); assert(ep.chain_id != 0); if (&ep == first_point) { assert(ep.edge_out == nullptr); @@ -222,7 +230,7 @@ std::vector> chain_segments_greedy_constrained_reversals // Detect loops. for (EndPoint *pt = &ep; pt != nullptr;) { // Out of queue. It is a final point. - assert(pt->heap_idx == std::numeric_limits::max()); + assert(pt->heap_idx == queue.invalid_id()); EndPoint *pt_other = &end_points[(pt - &end_points.front()) ^ 1]; if (pt_other->heap_idx < queue.size()) // The other side of this segment is undecided yet. @@ -1068,6 +1076,15 @@ std::vector chain_points(const Points &points, Point *start_near) return out; } +std::vector chain_expolygons(const ExPolygons &expolygons, Point *start_near) +{ + Points ordering_points; + ordering_points.reserve(expolygons.size()); + for (const ExPolygon &ex : expolygons) + ordering_points.push_back(ex.contour.first_point()); + return chain_points(ordering_points); +} + #ifndef NDEBUG // #define DEBUG_SVG_OUTPUT #endif /* NDEBUG */ diff --git a/src/libslic3r/ShortestPath.hpp b/src/libslic3r/ShortestPath.hpp index 14912ee8579..c84349217e4 100644 --- a/src/libslic3r/ShortestPath.hpp +++ b/src/libslic3r/ShortestPath.hpp @@ -12,7 +12,11 @@ namespace ClipperLib { class PolyNode; } namespace Slic3r { +class ExPolygon; +using ExPolygons = std::vector; + std::vector chain_points(const Points &points, Point *start_near = nullptr); +std::vector chain_expolygons(const ExPolygons &expolygons, Point *start_near = nullptr); std::vector> chain_extrusion_entities(std::vector &entities, const Point *start_near = nullptr); void reorder_extrusion_entities(std::vector &entities, const std::vector> &chain); diff --git a/src/libslic3r/SlicesToTriangleMesh.cpp b/src/libslic3r/SlicesToTriangleMesh.cpp index 969fa8dacf6..9e290d472b9 100644 --- a/src/libslic3r/SlicesToTriangleMesh.cpp +++ b/src/libslic3r/SlicesToTriangleMesh.cpp @@ -9,6 +9,8 @@ #include #include +#include + namespace Slic3r { // Same as walls() but with identical higher and lower polygons. @@ -52,7 +54,8 @@ indexed_triangle_set slices_to_mesh( Layers layers(slices.size()); size_t len = slices.size() - 1; - tbb::parallel_for(size_t(0), len, [&slices, &layers, &grid](size_t i) { + auto threads_cnt = execution::max_concurrency(ex_tbb); + execution::for_each(ex_tbb, size_t(0), len, [&slices, &layers, &grid](size_t i) { const ExPolygons &upper = slices[i + 1]; const ExPolygons &lower = slices[i]; @@ -64,14 +67,15 @@ indexed_triangle_set slices_to_mesh( its_merge(layers[i], triangulate_expolygons_3d(free_top, grid[i], NORMALS_UP)); its_merge(layers[i], triangulate_expolygons_3d(overhang, grid[i], NORMALS_DOWN)); its_merge(layers[i], straight_walls(upper, grid[i], grid[i + 1])); - }); + }, threads_cnt); auto merge_fn = []( const indexed_triangle_set &a, const indexed_triangle_set &b ) { indexed_triangle_set res{a}; its_merge(res, b); return res; }; auto ret = execution::reduce(ex_tbb, layers.begin(), layers.end(), - indexed_triangle_set{}, merge_fn); + indexed_triangle_set{}, merge_fn, + threads_cnt); its_merge(ret, triangulate_expolygons_3d(slices.front(), zmin, NORMALS_DOWN)); its_merge(ret, straight_walls(slices.front(), zmin, grid.front())); @@ -80,9 +84,14 @@ indexed_triangle_set slices_to_mesh( // FIXME: these repairs do not fix the mesh entirely. There will be cracks // in the output. It is very hard to do the meshing in a way that does not // leave errors. - its_merge_vertices(ret); - its_remove_degenerate_faces(ret); - its_compactify_vertices(ret); + int num_mergedv = its_merge_vertices(ret); + BOOST_LOG_TRIVIAL(debug) << "Merged vertices count: " << num_mergedv; + + int remcnt = its_remove_degenerate_faces(ret); + BOOST_LOG_TRIVIAL(debug) << "Removed degenerate faces count: " << remcnt; + + int num_erasedv = its_compactify_vertices(ret); + BOOST_LOG_TRIVIAL(debug) << "Erased vertices count: " << num_erasedv; return ret; } diff --git a/src/libslic3r/Slicing.cpp b/src/libslic3r/Slicing.cpp index 7d4fac7a295..a0fe3e66233 100644 --- a/src/libslic3r/Slicing.cpp +++ b/src/libslic3r/Slicing.cpp @@ -31,7 +31,7 @@ inline coordf_t min_layer_height_from_nozzle(const PrintConfig &print_config, in return (min_layer_height == 0.) ? MIN_LAYER_HEIGHT_DEFAULT : std::max(MIN_LAYER_HEIGHT, min_layer_height); } -// Maximum layer height for the variable layer height algorithm, 3/4 of a nozzle dimaeter by default, +// Maximum layer height for the variable layer height algorithm, 3/4 of a nozzle diameter by default, // it should not be smaller than the minimum layer height. inline coordf_t max_layer_height_from_nozzle(const PrintConfig &print_config, int idx_nozzle) { @@ -48,7 +48,7 @@ coordf_t Slicing::min_layer_height_from_nozzle(const DynamicPrintConfig &print_c return (min_layer_height == 0.) ? MIN_LAYER_HEIGHT_DEFAULT : std::max(MIN_LAYER_HEIGHT, min_layer_height); } -// Maximum layer height for the variable layer height algorithm, 3/4 of a nozzle dimaeter by default, +// Maximum layer height for the variable layer height algorithm, 3/4 of a nozzle diameter by default, // it should not be smaller than the minimum layer height. coordf_t Slicing::max_layer_height_from_nozzle(const DynamicPrintConfig &print_config, int idx_nozzle) { @@ -183,32 +183,47 @@ std::vector layer_height_profile_from_ranges( // 2) Convert the trimmed ranges to a height profile, fill in the undefined intervals between z=0 and z=slicing_params.object_print_z_max() // with slicing_params.layer_height std::vector layer_height_profile; - for (std::vector>::const_iterator it_range = ranges_non_overlapping.begin(); it_range != ranges_non_overlapping.end(); ++ it_range) { - coordf_t lo = it_range->first.first; - coordf_t hi = it_range->first.second; - coordf_t height = it_range->second; - coordf_t last_z = layer_height_profile.empty() ? 0. : layer_height_profile[layer_height_profile.size() - 2]; - if (lo > last_z + EPSILON) { + auto last_z = [&layer_height_profile]() { + return layer_height_profile.empty() ? 0. : *(layer_height_profile.end() - 2); + }; + auto lh_append = [&layer_height_profile, last_z](coordf_t z, coordf_t layer_height) { + if (! layer_height_profile.empty()) { + bool last_z_matches = is_approx(*(layer_height_profile.end() - 2), z); + bool last_h_matches = is_approx(layer_height_profile.back(), layer_height); + if (last_h_matches) { + if (last_z_matches) { + // Drop a duplicate. + return; + } + if (layer_height_profile.size() >= 4 && is_approx(*(layer_height_profile.end() - 3), layer_height)) { + // Third repetition of the same layer_height. Update z of the last entry. + *(layer_height_profile.end() - 2) = z; + return; + } + } + } + layer_height_profile.push_back(z); + layer_height_profile.push_back(layer_height); + }; + + for (const std::pair &non_overlapping_range : ranges_non_overlapping) { + coordf_t lo = non_overlapping_range.first.first; + coordf_t hi = non_overlapping_range.first.second; + coordf_t height = non_overlapping_range.second; + if (coordf_t z = last_z(); lo > z + EPSILON) { // Insert a step of normal layer height. - layer_height_profile.push_back(last_z); - layer_height_profile.push_back(slicing_params.layer_height); - layer_height_profile.push_back(lo); - layer_height_profile.push_back(slicing_params.layer_height); + lh_append(z, slicing_params.layer_height); + lh_append(lo, slicing_params.layer_height); } // Insert a step of the overriden layer height. - layer_height_profile.push_back(lo); - layer_height_profile.push_back(height); - layer_height_profile.push_back(hi); - layer_height_profile.push_back(height); + lh_append(lo, height); + lh_append(hi, height); } - coordf_t last_z = layer_height_profile.empty() ? 0. : layer_height_profile[layer_height_profile.size() - 2]; - if (last_z < slicing_params.object_print_z_height()) { + if (coordf_t z = last_z(); z < slicing_params.object_print_z_height()) { // Insert a step of normal layer height up to the object top. - layer_height_profile.push_back(last_z); - layer_height_profile.push_back(slicing_params.layer_height); - layer_height_profile.push_back(slicing_params.object_print_z_height()); - layer_height_profile.push_back(slicing_params.layer_height); + lh_append(z, slicing_params.layer_height); + lh_append(slicing_params.object_print_z_height(), slicing_params.layer_height); } return layer_height_profile; @@ -294,7 +309,7 @@ std::vector layer_height_profile_adaptive(const SlicingParameters& slici print_z += height; } - double z_gap = slicing_params.object_print_z_height() - layer_height_profile[layer_height_profile.size() - 2]; + double z_gap = slicing_params.object_print_z_height() - *(layer_height_profile.end() - 2); if (z_gap > 0.0) { layer_height_profile.push_back(slicing_params.object_print_z_height()); @@ -632,6 +647,40 @@ std::vector generate_object_layers( return out; } +// Check whether the layer height profile describes a fixed layer height profile. +bool check_object_layers_fixed( + const SlicingParameters &slicing_params, + const std::vector &layer_height_profile) +{ + assert(layer_height_profile.size() >= 4); + assert(layer_height_profile.size() % 2 == 0); + assert(layer_height_profile[0] == 0); + + if (layer_height_profile.size() != 4 && layer_height_profile.size() != 8) + return false; + + bool fixed_step1 = is_approx(layer_height_profile[1], layer_height_profile[3]); + bool fixed_step2 = layer_height_profile.size() == 4 || + (layer_height_profile[2] == layer_height_profile[4] && is_approx(layer_height_profile[5], layer_height_profile[7])); + + if (! fixed_step1 || ! fixed_step2) + return false; + + if (layer_height_profile[2] < 0.5 * slicing_params.first_object_layer_height + EPSILON || + ! is_approx(layer_height_profile[3], slicing_params.first_object_layer_height)) + return false; + + double z_max = layer_height_profile[layer_height_profile.size() - 2]; + double z_2nd = slicing_params.first_object_layer_height + 0.5 * slicing_params.layer_height; + if (z_2nd > z_max) + return true; + if (z_2nd < *(layer_height_profile.end() - 4) + EPSILON || + ! is_approx(layer_height_profile.back(), slicing_params.layer_height)) + return false; + + return true; +} + int generate_layer_height_texture( const SlicingParameters &slicing_params, const std::vector &layers, diff --git a/src/libslic3r/Slicing.hpp b/src/libslic3r/Slicing.hpp index 489b2768fb4..101976f2b70 100644 --- a/src/libslic3r/Slicing.hpp +++ b/src/libslic3r/Slicing.hpp @@ -129,11 +129,11 @@ inline bool equal_layering(const SlicingParameters &sp1, const SlicingParameters typedef std::pair t_layer_height_range; typedef std::map t_layer_config_ranges; -extern std::vector layer_height_profile_from_ranges( +std::vector layer_height_profile_from_ranges( const SlicingParameters &slicing_params, const t_layer_config_ranges &layer_config_ranges); -extern std::vector layer_height_profile_adaptive( +std::vector layer_height_profile_adaptive( const SlicingParameters& slicing_params, const ModelObject& object, float quality_factor); @@ -146,7 +146,7 @@ struct HeightProfileSmoothingParams HeightProfileSmoothingParams(unsigned int radius, bool keep_min) : radius(radius), keep_min(keep_min) {} }; -extern std::vector smooth_height_profile( +std::vector smooth_height_profile( const std::vector& profile, const SlicingParameters& slicing_params, const HeightProfileSmoothingParams& smoothing_params); @@ -157,7 +157,7 @@ enum LayerHeightEditActionType : unsigned int { LAYER_HEIGHT_EDIT_ACTION_SMOOTH = 3 }; -extern void adjust_layer_height_profile( +void adjust_layer_height_profile( const SlicingParameters &slicing_params, std::vector &layer_height_profile, coordf_t z, @@ -167,14 +167,19 @@ extern void adjust_layer_height_profile( // Produce object layers as pairs of low / high layer boundaries, stored into a linear vector. // The object layers are based at z=0, ignoring the raft layers. -extern std::vector generate_object_layers( +std::vector generate_object_layers( + const SlicingParameters &slicing_params, + const std::vector &layer_height_profile); + +// Check whether the layer height profile describes a fixed layer height profile. +bool check_object_layers_fixed( const SlicingParameters &slicing_params, const std::vector &layer_height_profile); // Produce a 1D texture packed into a 2D texture describing in the RGBA format // the planned object layers. // Returns number of cells used by the texture of the 0th LOD level. -extern int generate_layer_height_texture( +int generate_layer_height_texture( const SlicingParameters &slicing_params, const std::vector &layers, void *data, int rows, int cols, bool level_of_detail_2nd_level); diff --git a/src/libslic3r/SupportMaterial.cpp b/src/libslic3r/SupportMaterial.cpp index 92b627a9500..224216466d0 100644 --- a/src/libslic3r/SupportMaterial.cpp +++ b/src/libslic3r/SupportMaterial.cpp @@ -8,6 +8,8 @@ #include "Point.hpp" #include "MutablePolygon.hpp" +#include + #include #include #include @@ -41,6 +43,9 @@ #include "SVG.hpp" #endif +#pragma message ("TODO: Wrap svg usages in DEBUG ifdef and remove the following include") +#include "SVG.hpp" + // #undef NDEBUG #include @@ -61,19 +66,19 @@ namespace Slic3r { //#define SUPPORT_SURFACES_OFFSET_PARAMETERS ClipperLib::jtMiter, 1.5 #define SUPPORT_SURFACES_OFFSET_PARAMETERS ClipperLib::jtSquare, 0. -#ifdef SLIC3R_DEBUG -const char* support_surface_type_to_color_name(const PrintObjectSupportMaterial::SupporLayerType surface_type) +#if 1 //#ifdef SLIC3R_DEBUG +const char* support_surface_type_to_color_name(const SupporLayerType surface_type) { switch (surface_type) { - case PrintObjectSupportMaterial::sltTopContact: return "rgb(255,0,0)"; // "red"; - case PrintObjectSupportMaterial::sltTopInterface: return "rgb(0,255,0)"; // "green"; - case PrintObjectSupportMaterial::sltBase: return "rgb(0,0,255)"; // "blue"; - case PrintObjectSupportMaterial::sltBottomInterface:return "rgb(255,255,128)"; // yellow - case PrintObjectSupportMaterial::sltBottomContact: return "rgb(255,0,255)"; // magenta - case PrintObjectSupportMaterial::sltRaftInterface: return "rgb(0,255,255)"; - case PrintObjectSupportMaterial::sltRaftBase: return "rgb(128,128,128)"; - case PrintObjectSupportMaterial::sltUnknown: return "rgb(128,0,0)"; // maroon - default: return "rgb(64,64,64)"; + case SupporLayerType::TopContact: return "rgb(255,0,0)"; // "red"; + case SupporLayerType::TopInterface: return "rgb(0,255,0)"; // "green"; + case SupporLayerType::Base: return "rgb(0,0,255)"; // "blue"; + case SupporLayerType::BottomInterface:return "rgb(255,255,128)"; // yellow + case SupporLayerType::BottomContact: return "rgb(255,0,255)"; // magenta + case SupporLayerType::RaftInterface: return "rgb(0,255,255)"; + case SupporLayerType::RaftBase: return "rgb(128,128,128)"; + case SupporLayerType::Unknown: return "rgb(128,0,0)"; // maroon + default: return "rgb(64,64,64)"; }; } @@ -89,28 +94,28 @@ void export_support_surface_type_legend_to_svg(SVG &svg, const Point &pos) coord_t pos_x = pos_x0; coord_t pos_y = pos(1) + scale_(1.5); coord_t step_x = scale_(10.); - svg.draw_legend(Point(pos_x, pos_y), "top contact" , support_surface_type_to_color_name(PrintObjectSupportMaterial::sltTopContact)); + svg.draw_legend(Point(pos_x, pos_y), "top contact" , support_surface_type_to_color_name(SupporLayerType::TopContact)); pos_x += step_x; - svg.draw_legend(Point(pos_x, pos_y), "top iface" , support_surface_type_to_color_name(PrintObjectSupportMaterial::sltTopInterface)); + svg.draw_legend(Point(pos_x, pos_y), "top iface" , support_surface_type_to_color_name(SupporLayerType::TopInterface)); pos_x += step_x; - svg.draw_legend(Point(pos_x, pos_y), "base" , support_surface_type_to_color_name(PrintObjectSupportMaterial::sltBase)); + svg.draw_legend(Point(pos_x, pos_y), "base" , support_surface_type_to_color_name(SupporLayerType::Base)); pos_x += step_x; - svg.draw_legend(Point(pos_x, pos_y), "bottom iface" , support_surface_type_to_color_name(PrintObjectSupportMaterial::sltBottomInterface)); + svg.draw_legend(Point(pos_x, pos_y), "bottom iface" , support_surface_type_to_color_name(SupporLayerType::BottomInterface)); pos_x += step_x; - svg.draw_legend(Point(pos_x, pos_y), "bottom contact" , support_surface_type_to_color_name(PrintObjectSupportMaterial::sltBottomContact)); + svg.draw_legend(Point(pos_x, pos_y), "bottom contact" , support_surface_type_to_color_name(SupporLayerType::BottomContact)); // 2nd row pos_x = pos_x0; pos_y = pos(1)+scale_(2.8); - svg.draw_legend(Point(pos_x, pos_y), "raft interface" , support_surface_type_to_color_name(PrintObjectSupportMaterial::sltRaftInterface)); + svg.draw_legend(Point(pos_x, pos_y), "raft interface" , support_surface_type_to_color_name(SupporLayerType::RaftInterface)); pos_x += step_x; - svg.draw_legend(Point(pos_x, pos_y), "raft base" , support_surface_type_to_color_name(PrintObjectSupportMaterial::sltRaftBase)); + svg.draw_legend(Point(pos_x, pos_y), "raft base" , support_surface_type_to_color_name(SupporLayerType::RaftBase)); pos_x += step_x; - svg.draw_legend(Point(pos_x, pos_y), "unknown" , support_surface_type_to_color_name(PrintObjectSupportMaterial::sltUnknown)); + svg.draw_legend(Point(pos_x, pos_y), "unknown" , support_surface_type_to_color_name(SupporLayerType::Unknown)); pos_x += step_x; - svg.draw_legend(Point(pos_x, pos_y), "intermediate" , support_surface_type_to_color_name(PrintObjectSupportMaterial::sltIntermediate)); + svg.draw_legend(Point(pos_x, pos_y), "intermediate" , support_surface_type_to_color_name(SupporLayerType::Intermediate)); } -void export_print_z_polygons_to_svg(const char *path, PrintObjectSupportMaterial::MyLayer ** const layers, size_t n_layers) +void export_print_z_polygons_to_svg(const char *path, SupportGeneratorLayer ** const layers, int n_layers) { BoundingBox bbox; for (int i = 0; i < n_layers; ++ i) @@ -129,10 +134,10 @@ void export_print_z_polygons_to_svg(const char *path, PrintObjectSupportMaterial } void export_print_z_polygons_and_extrusions_to_svg( - const char *path, - PrintObjectSupportMaterial::MyLayer ** const layers, - size_t n_layers, - SupportLayer &support_layer) + const char *path, + SupportGeneratorLayer ** const layers, + int n_layers, + SupportLayer &support_layer) { BoundingBox bbox; for (int i = 0; i < n_layers; ++ i) @@ -321,112 +326,153 @@ static Polygons contours_simplified(const Vec2i &grid_size, const double pixel_s } #endif // SUPPORT_USE_AGG_RASTERIZER -PrintObjectSupportMaterial::PrintObjectSupportMaterial(const PrintObject *object, const SlicingParameters &slicing_params) : - m_object (object), - m_print_config (&object->print()->config()), - m_object_config (&object->config()), - m_slicing_params (slicing_params) +SupportParameters::SupportParameters(const PrintObject &object) { - m_support_params.first_layer_flow = support_material_1st_layer_flow(object, float(slicing_params.first_print_layer_height)); - m_support_params.support_material_flow = support_material_flow(object, float(slicing_params.layer_height)); - m_support_params.support_material_interface_flow = support_material_interface_flow(object, float(slicing_params.layer_height)); - m_support_params.support_layer_height_min = 0.01; + const PrintConfig &print_config = object.print()->config(); + const PrintObjectConfig &object_config = object.config(); + const SlicingParameters &slicing_params = object.slicing_parameters(); + + this->first_layer_flow = Slic3r::support_material_1st_layer_flow(&object, float(slicing_params.first_print_layer_height)); + this->support_material_flow = Slic3r::support_material_flow(&object, float(slicing_params.layer_height)); + this->support_material_interface_flow = Slic3r::support_material_interface_flow(&object, float(slicing_params.layer_height)); + this->raft_interface_flow = support_material_interface_flow; // Calculate a minimum support layer height as a minimum over all extruders, but not smaller than 10um. - m_support_params.support_layer_height_min = 1000000.; - for (auto lh : m_print_config->min_layer_height.values) - m_support_params.support_layer_height_min = std::min(m_support_params.support_layer_height_min, std::max(0.01, lh)); - for (auto layer : m_object->layers()) - m_support_params.support_layer_height_min = std::min(m_support_params.support_layer_height_min, std::max(0.01, layer->height)); + this->support_layer_height_min = scaled(0.01); + for (auto lh : print_config.min_layer_height.values) + this->support_layer_height_min = std::min(this->support_layer_height_min, std::max(0.01, lh)); + for (auto layer : object.layers()) + this->support_layer_height_min = std::min(this->support_layer_height_min, std::max(0.01, layer->height)); - if (m_object_config->support_material_interface_layers.value == 0) { + if (object_config.support_material_interface_layers.value == 0) { // No interface layers allowed, print everything with the base support pattern. - m_support_params.support_material_interface_flow = m_support_params.support_material_flow; + this->support_material_interface_flow = this->support_material_flow; } // Evaluate the XY gap between the object outer perimeters and the support structures. // Evaluate the XY gap between the object outer perimeters and the support structures. coordf_t external_perimeter_width = 0.; coordf_t bridge_flow_ratio = 0; - for (size_t region_id = 0; region_id < object->num_printing_regions(); ++ region_id) { - const PrintRegion ®ion = object->printing_region(region_id); - external_perimeter_width = std::max(external_perimeter_width, coordf_t(region.flow(*object, frExternalPerimeter, slicing_params.layer_height).width())); + for (size_t region_id = 0; region_id < object.num_printing_regions(); ++ region_id) { + const PrintRegion ®ion = object.printing_region(region_id); + external_perimeter_width = std::max(external_perimeter_width, coordf_t(region.flow(object, frExternalPerimeter, slicing_params.layer_height).width())); bridge_flow_ratio += region.config().bridge_flow_ratio; } - m_support_params.gap_xy = m_object_config->support_material_xy_spacing.get_abs_value(external_perimeter_width); - bridge_flow_ratio /= object->num_printing_regions(); + this->gap_xy = object_config.support_material_xy_spacing.get_abs_value(external_perimeter_width); + bridge_flow_ratio /= object.num_printing_regions(); - m_support_params.support_material_bottom_interface_flow = m_slicing_params.soluble_interface || ! m_object_config->thick_bridges ? - m_support_params.support_material_interface_flow.with_flow_ratio(bridge_flow_ratio) : - Flow::bridging_flow(bridge_flow_ratio * m_support_params.support_material_interface_flow.nozzle_diameter(), m_support_params.support_material_interface_flow.nozzle_diameter()); + this->support_material_bottom_interface_flow = slicing_params.soluble_interface || ! object_config.thick_bridges ? + this->support_material_interface_flow.with_flow_ratio(bridge_flow_ratio) : + Flow::bridging_flow(bridge_flow_ratio * this->support_material_interface_flow.nozzle_diameter(), this->support_material_interface_flow.nozzle_diameter()); - m_support_params.can_merge_support_regions = m_object_config->support_material_extruder.value == m_object_config->support_material_interface_extruder.value; - if (!m_support_params.can_merge_support_regions && (m_object_config->support_material_extruder.value == 0 || m_object_config->support_material_interface_extruder.value == 0)) { + this->can_merge_support_regions = object_config.support_material_extruder.value == object_config.support_material_interface_extruder.value; + if (!this->can_merge_support_regions && (object_config.support_material_extruder.value == 0 || object_config.support_material_interface_extruder.value == 0)) { // One of the support extruders is of "don't care" type. - auto object_extruders = m_object->object_extruders(); + auto object_extruders = object.object_extruders(); if (object_extruders.size() == 1 && - *object_extruders.begin() == std::max(m_object_config->support_material_extruder.value, m_object_config->support_material_interface_extruder.value)) + *object_extruders.begin() == std::max(object_config.support_material_extruder.value, object_config.support_material_interface_extruder.value)) // Object is printed with the same extruder as the support. - m_support_params.can_merge_support_regions = true; + this->can_merge_support_regions = true; } - m_support_params.base_angle = Geometry::deg2rad(float(m_object_config->support_material_angle.value)); - m_support_params.interface_angle = Geometry::deg2rad(float(m_object_config->support_material_angle.value + 90.)); - m_support_params.interface_spacing = m_object_config->support_material_interface_spacing.value + m_support_params.support_material_interface_flow.spacing(); - m_support_params.interface_density = std::min(1., m_support_params.support_material_interface_flow.spacing() / m_support_params.interface_spacing); - m_support_params.support_spacing = m_object_config->support_material_spacing.value + m_support_params.support_material_flow.spacing(); - m_support_params.support_density = std::min(1., m_support_params.support_material_flow.spacing() / m_support_params.support_spacing); - if (m_object_config->support_material_interface_layers.value == 0) { + double interface_spacing = object_config.support_material_interface_spacing.value + this->support_material_interface_flow.spacing(); + this->interface_density = std::min(1., this->support_material_interface_flow.spacing() / interface_spacing); + double raft_interface_spacing = object_config.support_material_interface_spacing.value + this->raft_interface_flow.spacing(); + this->raft_interface_density = std::min(1., this->raft_interface_flow.spacing() / raft_interface_spacing); + double support_spacing = object_config.support_material_spacing.value + this->support_material_flow.spacing(); + this->support_density = std::min(1., this->support_material_flow.spacing() / support_spacing); + if (object_config.support_material_interface_layers.value == 0) { // No interface layers allowed, print everything with the base support pattern. - m_support_params.interface_spacing = m_support_params.support_spacing; - m_support_params.interface_density = m_support_params.support_density; + this->interface_density = this->support_density; } - SupportMaterialPattern support_pattern = m_object_config->support_material_pattern; - m_support_params.with_sheath = m_object_config->support_material_with_sheath; - m_support_params.base_fill_pattern = + SupportMaterialPattern support_pattern = object_config.support_material_pattern; + this->with_sheath = object_config.support_material_with_sheath; + this->base_fill_pattern = support_pattern == smpHoneycomb ? ipHoneycomb : - m_support_params.support_density > 0.95 || m_support_params.with_sheath ? ipRectilinear : ipSupportBase; - m_support_params.interface_fill_pattern = (m_support_params.interface_density > 0.95 ? ipRectilinear : ipSupportBase); - m_support_params.contact_fill_pattern = - (m_object_config->support_material_interface_pattern == smipAuto && m_slicing_params.soluble_interface) || - m_object_config->support_material_interface_pattern == smipConcentric ? + this->support_density > 0.95 || this->with_sheath ? ipRectilinear : ipSupportBase; + this->interface_fill_pattern = (this->interface_density > 0.95 ? ipRectilinear : ipSupportBase); + this->raft_interface_fill_pattern = this->raft_interface_density > 0.95 ? ipRectilinear : ipSupportBase; + this->contact_fill_pattern = + (object_config.support_material_interface_pattern == smipAuto && slicing_params.soluble_interface) || + object_config.support_material_interface_pattern == smipConcentric ? ipConcentric : - (m_support_params.interface_density > 0.95 ? ipRectilinear : ipSupportBase); + (this->interface_density > 0.95 ? ipRectilinear : ipSupportBase); + + this->base_angle = Geometry::deg2rad(float(object_config.support_material_angle.value)); + this->interface_angle = Geometry::deg2rad(float(object_config.support_material_angle.value + 90.)); + this->raft_angle_1st_layer = 0.f; + this->raft_angle_base = 0.f; + this->raft_angle_interface = 0.f; + if (slicing_params.base_raft_layers > 1) { + assert(slicing_params.raft_layers() >= 4); + // There are all raft layer types (1st layer, base, interface & contact layers) available. + this->raft_angle_1st_layer = this->interface_angle; + this->raft_angle_base = this->base_angle; + this->raft_angle_interface = this->interface_angle; + if ((slicing_params.interface_raft_layers & 1) == 0) + // Allign the 1st raft interface layer so that the object 1st layer is hatched perpendicularly to the raft contact interface. + this->raft_angle_interface += float(0.5 * M_PI); + } else if (slicing_params.base_raft_layers == 1 || slicing_params.interface_raft_layers > 1) { + assert(slicing_params.raft_layers() == 2 || slicing_params.raft_layers() == 3); + // 1st layer, interface & contact layers available. + this->raft_angle_1st_layer = this->base_angle; + this->raft_angle_interface = this->interface_angle + 0.5 * M_PI; + } else if (slicing_params.interface_raft_layers == 1) { + // Only the contact raft layer is non-empty, which will be printed as the 1st layer. + assert(slicing_params.base_raft_layers == 0); + assert(slicing_params.interface_raft_layers == 1); + assert(slicing_params.raft_layers() == 1); + this->raft_angle_1st_layer = float(0.5 * M_PI); + this->raft_angle_interface = this->raft_angle_1st_layer; + } else { + // No raft. + assert(slicing_params.base_raft_layers == 0); + assert(slicing_params.interface_raft_layers == 0); + assert(slicing_params.raft_layers() == 0); + } +} + +PrintObjectSupportMaterial::PrintObjectSupportMaterial(const PrintObject *object, const SlicingParameters &slicing_params) : + m_print_config (&object->print()->config()), + m_object_config (&object->config()), + m_slicing_params (slicing_params), + m_support_params (*object) +{ } // Using the std::deque as an allocator. -inline PrintObjectSupportMaterial::MyLayer& layer_allocate( - std::deque &layer_storage, - PrintObjectSupportMaterial::SupporLayerType layer_type) +inline SupportGeneratorLayer& layer_allocate( + std::deque &layer_storage, + SupporLayerType layer_type) { - layer_storage.push_back(PrintObjectSupportMaterial::MyLayer()); + layer_storage.push_back(SupportGeneratorLayer()); layer_storage.back().layer_type = layer_type; return layer_storage.back(); } -inline PrintObjectSupportMaterial::MyLayer& layer_allocate( - std::deque &layer_storage, +inline SupportGeneratorLayer& layer_allocate( + std::deque &layer_storage, tbb::spin_mutex &layer_storage_mutex, - PrintObjectSupportMaterial::SupporLayerType layer_type) + SupporLayerType layer_type) { layer_storage_mutex.lock(); - layer_storage.push_back(PrintObjectSupportMaterial::MyLayer()); - PrintObjectSupportMaterial::MyLayer *layer_new = &layer_storage.back(); + layer_storage.push_back(SupportGeneratorLayer()); + SupportGeneratorLayer *layer_new = &layer_storage.back(); layer_storage_mutex.unlock(); layer_new->layer_type = layer_type; return *layer_new; } -inline void layers_append(PrintObjectSupportMaterial::MyLayersPtr &dst, const PrintObjectSupportMaterial::MyLayersPtr &src) +inline void layers_append(SupportGeneratorLayersPtr &dst, const SupportGeneratorLayersPtr &src) { dst.insert(dst.end(), src.begin(), src.end()); } // Support layer that is covered by some form of dense interface. -static constexpr const std::initializer_list support_types_interface { - PrintObjectSupportMaterial::sltRaftInterface, PrintObjectSupportMaterial::sltBottomContact, PrintObjectSupportMaterial::sltBottomInterface, PrintObjectSupportMaterial::sltTopContact, PrintObjectSupportMaterial::sltTopInterface +static constexpr const std::initializer_list support_types_interface { + SupporLayerType::RaftInterface, SupporLayerType::BottomContact, SupporLayerType::BottomInterface, SupporLayerType::TopContact, SupporLayerType::TopInterface }; void PrintObjectSupportMaterial::generate(PrintObject &object) @@ -439,7 +485,7 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) // Layer instances will be allocated by std::deque and they will be kept until the end of this function call. // The layers will be referenced by various LayersPtr (of type std::vector) - MyLayerStorage layer_storage; + SupportGeneratorLayerStorage layer_storage; BOOST_LOG_TRIVIAL(info) << "Support generator - Creating top contacts"; @@ -452,7 +498,7 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) // should the support material expose to the object in order to guarantee // that it will be effective, regardless of how it's built below. // If raft is to be generated, the 1st top_contact layer will contain the 1st object layer silhouette without holes. - MyLayersPtr top_contacts = this->top_contact_layers(object, buildplate_covered, layer_storage); + SupportGeneratorLayersPtr top_contacts = this->top_contact_layers(object, buildplate_covered, layer_storage); if (top_contacts.empty()) // Nothing is supported, no supports are generated. return; @@ -460,7 +506,7 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) #ifdef SLIC3R_DEBUG static int iRun = 0; iRun ++; - for (const MyLayer *layer : top_contacts) + for (const SupportGeneratorLayer *layer : top_contacts) Slic3r::SVG::export_expolygons( debug_out_path("support-top-contacts-%d-%lf.svg", iRun, layer->print_z), union_ex(layer->polygons)); @@ -473,7 +519,7 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) // layer_support_areas contains the per object layer support areas. These per object layer support areas // may get merged and trimmed by this->generate_base_layers() if the support layers are not synchronized with object layers. std::vector layer_support_areas; - MyLayersPtr bottom_contacts = this->bottom_contact_layers_and_layer_support_areas( + SupportGeneratorLayersPtr bottom_contacts = this->bottom_contact_layers_and_layer_support_areas( object, top_contacts, buildplate_covered, layer_storage, layer_support_areas); @@ -491,13 +537,13 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) // The layers may or may not be synchronized with the object layers, depending on the configuration. // For example, a single nozzle multi material printing will need to generate a waste tower, which in turn // wastes less material, if there are as little tool changes as possible. - MyLayersPtr intermediate_layers = this->raft_and_intermediate_support_layers( + SupportGeneratorLayersPtr intermediate_layers = this->raft_and_intermediate_support_layers( object, bottom_contacts, top_contacts, layer_storage); this->trim_support_layers_by_object(object, top_contacts, m_slicing_params.gap_support_object, m_slicing_params.gap_object_support, m_support_params.gap_xy); #ifdef SLIC3R_DEBUG - for (const MyLayer *layer : top_contacts) + for (const SupportGeneratorLayer *layer : top_contacts) Slic3r::SVG::export_expolygons( debug_out_path("support-top-contacts-trimmed-by-object-%d-%lf.svg", iRun, layer->print_z), union_ex(layer->polygons)); @@ -509,7 +555,7 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) this->generate_base_layers(object, bottom_contacts, top_contacts, intermediate_layers, layer_support_areas); #ifdef SLIC3R_DEBUG - for (MyLayersPtr::const_iterator it = intermediate_layers.begin(); it != intermediate_layers.end(); ++ it) + for (SupportGeneratorLayersPtr::const_iterator it = intermediate_layers.begin(); it != intermediate_layers.end(); ++ it) Slic3r::SVG::export_expolygons( debug_out_path("support-base-layers-%d-%lf.svg", iRun, (*it)->print_z), union_ex((*it)->polygons)); @@ -535,14 +581,14 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) // If raft is to be generated, the 1st top_contact layer will contain the 1st object layer silhouette with holes filled. // There is also a 1st intermediate layer containing bases of support columns. // Inflate the bases of the support columns and create the raft base under the object. - MyLayersPtr raft_layers = this->generate_raft_base(object, top_contacts, interface_layers, base_interface_layers, intermediate_layers, layer_storage); + SupportGeneratorLayersPtr raft_layers = generate_raft_base(object, m_support_params, m_slicing_params, top_contacts, interface_layers, base_interface_layers, intermediate_layers, layer_storage); #ifdef SLIC3R_DEBUG - for (const MyLayer *l : interface_layers) + for (const SupportGeneratorLayer *l : interface_layers) Slic3r::SVG::export_expolygons( debug_out_path("support-interface-layers-%d-%lf.svg", iRun, l->print_z), union_ex(l->polygons)); - for (const MyLayer *l : base_interface_layers) + for (const SupportGeneratorLayer *l : base_interface_layers) Slic3r::SVG::export_expolygons( debug_out_path("support-base-interface-layers-%d-%lf.svg", iRun, l->print_z), union_ex(l->polygons)); @@ -565,71 +611,10 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) // intermediate_layers.clear(); // interface_layers.clear(); - // Install support layers into the object. - // A support layer installed on a PrintObject has a unique print_z. - MyLayersPtr layers_sorted; - layers_sorted.reserve(raft_layers.size() + bottom_contacts.size() + top_contacts.size() + intermediate_layers.size() + interface_layers.size() + base_interface_layers.size()); - layers_append(layers_sorted, raft_layers); - layers_append(layers_sorted, bottom_contacts); - layers_append(layers_sorted, top_contacts); - layers_append(layers_sorted, intermediate_layers); - layers_append(layers_sorted, interface_layers); - layers_append(layers_sorted, base_interface_layers); - // Sort the layers lexicographically by a raising print_z and a decreasing height. - std::sort(layers_sorted.begin(), layers_sorted.end(), [](auto *l1, auto *l2) { return *l1 < *l2; }); - int layer_id = 0; - int layer_id_interface = 0; - assert(object.support_layers().empty()); - for (size_t i = 0; i < layers_sorted.size();) { - // Find the last layer with roughly the same print_z, find the minimum layer height of all. - // Due to the floating point inaccuracies, the print_z may not be the same even if in theory they should. - size_t j = i + 1; - coordf_t zmax = layers_sorted[i]->print_z + EPSILON; - for (; j < layers_sorted.size() && layers_sorted[j]->print_z <= zmax; ++j) ; - // Assign an average print_z to the set of layers with nearly equal print_z. - coordf_t zavg = 0.5 * (layers_sorted[i]->print_z + layers_sorted[j - 1]->print_z); - coordf_t height_min = layers_sorted[i]->height; - bool empty = true; - // For snug supports, layers where the direction of the support interface shall change are accounted for. - size_t num_interfaces = 0; - size_t num_top_contacts = 0; - double top_contact_bottom_z = 0; - for (size_t u = i; u < j; ++u) { - MyLayer &layer = *layers_sorted[u]; - if (! layer.polygons.empty()) { - empty = false; - num_interfaces += one_of(layer.layer_type, support_types_interface); - if (layer.layer_type == sltTopContact) { - ++ num_top_contacts; - assert(num_top_contacts <= 1); - // All top contact layers sharing this print_z shall also share bottom_z. - //assert(num_top_contacts == 1 || (top_contact_bottom_z - layer.bottom_z) < EPSILON); - top_contact_bottom_z = layer.bottom_z; - } - } - layer.print_z = zavg; - height_min = std::min(height_min, layer.height); - } - if (! empty) { - // Here the upper_layer and lower_layer pointers are left to null at the support layers, - // as they are never used. These pointers are candidates for removal. - bool this_layer_contacts_only = num_top_contacts > 0 && num_top_contacts == num_interfaces; - size_t this_layer_id_interface = layer_id_interface; - if (this_layer_contacts_only) { - // Find a supporting layer for its interface ID. - for (auto it = object.support_layers().rbegin(); it != object.support_layers().rend(); ++ it) - if (const SupportLayer &other_layer = **it; std::abs(other_layer.print_z - top_contact_bottom_z) < EPSILON) { - // other_layer supports this top contact layer. Assign a different support interface direction to this layer - // from the layer that supports it. - this_layer_id_interface = other_layer.interface_id() + 1; - } - } - object.add_support_layer(layer_id ++, this_layer_id_interface, height_min, zavg); - if (num_interfaces && ! this_layer_contacts_only) - ++ layer_id_interface; - } - i = j; - } +#ifdef SLIC3R_DEBUG + SupportGeneratorLayersPtr layers_sorted = +#endif // SLIC3R_DEBUG + generate_support_layers(object, raft_layers, bottom_contacts, top_contacts, intermediate_layers, interface_layers, base_interface_layers); BOOST_LOG_TRIVIAL(info) << "Support generator - Generating tool paths"; @@ -641,7 +626,7 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) // Due to the floating point inaccuracies, the print_z may not be the same even if in theory they should. int j = i + 1; coordf_t zmax = layers_sorted[i]->print_z + EPSILON; - bool empty = true; + bool empty = layers_sorted[i]->polygons.empty(); for (; j < layers_sorted.size() && layers_sorted[j]->print_z <= zmax; ++j) if (!layers_sorted[j]->polygons.empty()) empty = false; @@ -661,7 +646,7 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) #endif /* SLIC3R_DEBUG */ // Generate the actual toolpaths and save them into each layer. - this->generate_toolpaths(object.support_layers(), raft_layers, bottom_contacts, top_contacts, intermediate_layers, interface_layers, base_interface_layers); + generate_support_toolpaths(object.support_layers(), *m_object_config, m_support_params, m_slicing_params, raft_layers, bottom_contacts, top_contacts, intermediate_layers, interface_layers, base_interface_layers); #ifdef SLIC3R_DEBUG { @@ -671,7 +656,7 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) // Due to the floating point inaccuracies, the print_z may not be the same even if in theory they should. int j = i + 1; coordf_t zmax = layers_sorted[i]->print_z + EPSILON; - bool empty = true; + bool empty = layers_sorted[i]->polygons.empty(); for (; j < layers_sorted.size() && layers_sorted[j]->print_z <= zmax; ++j) if (! layers_sorted[j]->polygons.empty()) empty = false; @@ -699,14 +684,14 @@ Polygons collect_region_slices_by_type(const Layer &layer, SurfaceType surface_t // 1) Count the new polygons first. size_t n_polygons_new = 0; for (const LayerRegion *region : layer.regions()) - for (const Surface &surface : region->slices.surfaces) + for (const Surface &surface : region->slices()) if (surface.surface_type == surface_type) n_polygons_new += surface.expolygon.holes.size() + 1; // 2) Collect the new polygons. Polygons out; out.reserve(n_polygons_new); for (const LayerRegion *region : layer.regions()) - for (const Surface &surface : region->slices.surfaces) + for (const Surface &surface : region->slices()) if (surface.surface_type == surface_type) polygons_append(out, surface.expolygon); return out; @@ -938,6 +923,10 @@ class SupportGridPattern polygons_rotate(out, m_support_angle); return out; } + case smsTree: + case smsOrganic: +// assert(false); + [[fallthrough]]; case smsSnug: // Merge the support polygons by applying morphological closing and inwards smoothing. auto closing_distance = scaled(m_support_material_closing_radius); @@ -1223,7 +1212,7 @@ namespace SupportMaterialInternal { static inline bool has_bridging_perimeters(const ExtrusionLoop &loop) { for (const ExtrusionPath &ep : loop.paths) - if (ep.role() == erOverhangPerimeter && ! ep.polyline.empty()) + if (ep.role() == ExtrusionRole::OverhangPerimeter && ! ep.polyline.empty()) return int(ep.size()) >= (ep.is_closed() ? 3 : 2); return false; } @@ -1249,7 +1238,7 @@ namespace SupportMaterialInternal { for (const ExtrusionEntity *ee2 : static_cast(ee)->entities) { assert(! ee2->is_collection()); assert(! ee2->is_loop()); - if (ee2->role() == erBridgeInfill) + if (ee2->role() == ExtrusionRole::BridgeInfill) return true; } } @@ -1258,9 +1247,9 @@ namespace SupportMaterialInternal { static bool has_bridging_extrusions(const Layer &layer) { for (const LayerRegion *region : layer.regions()) { - if (SupportMaterialInternal::has_bridging_perimeters(region->perimeters)) + if (SupportMaterialInternal::has_bridging_perimeters(region->perimeters())) return true; - if (region->fill_surfaces.has(stBottomBridge) && has_bridging_fills(region->fills)) + if (region->fill_surfaces().has(stBottomBridge) && has_bridging_fills(region->fills())) return true; } return false; @@ -1270,7 +1259,7 @@ namespace SupportMaterialInternal { { assert(expansion_scaled >= 0.f); for (const ExtrusionPath &ep : loop.paths) - if (ep.role() == erOverhangPerimeter && ! ep.polyline.empty()) { + if (ep.role() == ExtrusionRole::OverhangPerimeter && ! ep.polyline.empty()) { float exp = 0.5f * (float)scale_(ep.width) + expansion_scaled; if (ep.is_closed()) { if (ep.size() >= 3) { @@ -1305,87 +1294,86 @@ namespace SupportMaterialInternal { collect_bridging_perimeter_areas(*static_cast(ee), expansion_scaled, out); } } +} - static void remove_bridges_from_contacts( - const PrintConfig &print_config, - const Layer &lower_layer, - const Polygons &lower_layer_polygons, - const LayerRegion &layerm, - float fw, - Polygons &contact_polygons) +void remove_bridges_from_contacts( + const PrintConfig &print_config, + const Layer &lower_layer, + const LayerRegion &layerm, + float fw, + Polygons &contact_polygons) +{ + // compute the area of bridging perimeters + Polygons bridges; { - // compute the area of bridging perimeters - Polygons bridges; - { - // Surface supporting this layer, expanded by 0.5 * nozzle_diameter, as we consider this kind of overhang to be sufficiently supported. - Polygons lower_grown_slices = expand(lower_layer_polygons, - //FIXME to mimic the decision in the perimeter generator, we should use half the external perimeter width. - 0.5f * float(scale_(print_config.nozzle_diameter.get_at(layerm.region().config().perimeter_extruder-1))), - SUPPORT_SURFACES_OFFSET_PARAMETERS); - // Collect perimeters of this layer. - //FIXME split_at_first_point() could split a bridge mid-way - #if 0 - Polylines overhang_perimeters = layerm.perimeters.as_polylines(); - // workaround for Clipper bug, see Slic3r::Polygon::clip_as_polyline() - for (Polyline &polyline : overhang_perimeters) - polyline.points[0].x += 1; - // Trim the perimeters of this layer by the lower layer to get the unsupported pieces of perimeters. - overhang_perimeters = diff_pl(overhang_perimeters, lower_grown_slices); - #else - Polylines overhang_perimeters = diff_pl(layerm.perimeters.as_polylines(), lower_grown_slices); - #endif - - // only consider straight overhangs - // only consider overhangs having endpoints inside layer's slices - // convert bridging polylines into polygons by inflating them with their thickness - // since we're dealing with bridges, we can't assume width is larger than spacing, - // so we take the largest value and also apply safety offset to be ensure no gaps - // are left in between - Flow perimeter_bridge_flow = layerm.bridging_flow(frPerimeter); - //FIXME one may want to use a maximum of bridging flow width and normal flow width, as the perimeters are calculated using the normal flow - // and then turned to bridging flow, thus their centerlines are derived from non-bridging flow and expanding them by a bridging flow - // may not expand them to the edge of their respective islands. - const float w = float(0.5 * std::max(perimeter_bridge_flow.scaled_width(), perimeter_bridge_flow.scaled_spacing())) + scaled(0.001); - for (Polyline &polyline : overhang_perimeters) - if (polyline.is_straight()) { - // This is a bridge - polyline.extend_start(fw); - polyline.extend_end(fw); - // Is the straight perimeter segment supported at both sides? - Point pts[2] = { polyline.first_point(), polyline.last_point() }; - bool supported[2] = { false, false }; - for (size_t i = 0; i < lower_layer.lslices.size() && ! (supported[0] && supported[1]); ++ i) - for (int j = 0; j < 2; ++ j) - if (! supported[j] && lower_layer.lslices_bboxes[i].contains(pts[j]) && lower_layer.lslices[i].contains(pts[j])) - supported[j] = true; - if (supported[0] && supported[1]) - // Offset a polyline into a thick line. - polygons_append(bridges, offset(polyline, w)); - } - bridges = union_(bridges); - } - // remove the entire bridges and only support the unsupported edges - //FIXME the brided regions are already collected as layerm.bridged. Use it? - for (const Surface &surface : layerm.fill_surfaces.surfaces) - if (surface.surface_type == stBottomBridge && surface.bridge_angle != -1) - polygons_append(bridges, surface.expolygon); - //FIXME add the gap filled areas. Extrude the gaps with a bridge flow? - // Remove the unsupported ends of the bridges from the bridged areas. - //FIXME add supports at regular intervals to support long bridges! - bridges = diff(bridges, - // Offset unsupported edges into polygons. - offset(layerm.unsupported_bridge_edges, scale_(SUPPORT_MATERIAL_MARGIN), SUPPORT_SURFACES_OFFSET_PARAMETERS)); - // Remove bridged areas from the supported areas. - contact_polygons = diff(contact_polygons, bridges, ApplySafetyOffset::Yes); - - #ifdef SLIC3R_DEBUG - static int iRun = 0; - SVG::export_expolygons(debug_out_path("support-top-contacts-remove-bridges-run%d.svg", iRun ++), - { { { union_ex(offset(layerm.unsupported_bridge_edges, scale_(SUPPORT_MATERIAL_MARGIN), SUPPORT_SURFACES_OFFSET_PARAMETERS)) }, { "unsupported_bridge_edges", "orange", 0.5f } }, - { { union_ex(contact_polygons) }, { "contact_polygons", "blue", 0.5f } }, - { { union_ex(bridges) }, { "bridges", "red", "black", "", scaled(0.1f), 0.5f } } }); - #endif /* SLIC3R_DEBUG */ + // Surface supporting this layer, expanded by 0.5 * nozzle_diameter, as we consider this kind of overhang to be sufficiently supported. + Polygons lower_grown_slices = expand(lower_layer.lslices, + //FIXME to mimic the decision in the perimeter generator, we should use half the external perimeter width. + 0.5f * float(scale_(print_config.nozzle_diameter.get_at(layerm.region().config().perimeter_extruder-1))), + SUPPORT_SURFACES_OFFSET_PARAMETERS); + // Collect perimeters of this layer. + //FIXME split_at_first_point() could split a bridge mid-way + #if 0 + Polylines overhang_perimeters = layerm.perimeters.as_polylines(); + // workaround for Clipper bug, see Slic3r::Polygon::clip_as_polyline() + for (Polyline &polyline : overhang_perimeters) + polyline.points[0].x += 1; + // Trim the perimeters of this layer by the lower layer to get the unsupported pieces of perimeters. + overhang_perimeters = diff_pl(overhang_perimeters, lower_grown_slices); + #else + Polylines overhang_perimeters = diff_pl(layerm.perimeters().as_polylines(), lower_grown_slices); + #endif + + // only consider straight overhangs + // only consider overhangs having endpoints inside layer's slices + // convert bridging polylines into polygons by inflating them with their thickness + // since we're dealing with bridges, we can't assume width is larger than spacing, + // so we take the largest value and also apply safety offset to be ensure no gaps + // are left in between + Flow perimeter_bridge_flow = layerm.bridging_flow(frPerimeter); + //FIXME one may want to use a maximum of bridging flow width and normal flow width, as the perimeters are calculated using the normal flow + // and then turned to bridging flow, thus their centerlines are derived from non-bridging flow and expanding them by a bridging flow + // may not expand them to the edge of their respective islands. + const float w = float(0.5 * std::max(perimeter_bridge_flow.scaled_width(), perimeter_bridge_flow.scaled_spacing())) + scaled(0.001); + for (Polyline &polyline : overhang_perimeters) + if (polyline.is_straight()) { + // This is a bridge + polyline.extend_start(fw); + polyline.extend_end(fw); + // Is the straight perimeter segment supported at both sides? + Point pts[2] = { polyline.first_point(), polyline.last_point() }; + bool supported[2] = { false, false }; + for (size_t i = 0; i < lower_layer.lslices.size() && ! (supported[0] && supported[1]); ++ i) + for (int j = 0; j < 2; ++ j) + if (! supported[j] && lower_layer.lslices_ex[i].bbox.contains(pts[j]) && lower_layer.lslices[i].contains(pts[j])) + supported[j] = true; + if (supported[0] && supported[1]) + // Offset a polyline into a thick line. + polygons_append(bridges, offset(polyline, w)); + } + bridges = union_(bridges); } + // remove the entire bridges and only support the unsupported edges + //FIXME the brided regions are already collected as layerm.bridged. Use it? + for (const Surface &surface : layerm.fill_surfaces()) + if (surface.surface_type == stBottomBridge && surface.bridge_angle >= 0.0) + polygons_append(bridges, surface.expolygon); + //FIXME add the gap filled areas. Extrude the gaps with a bridge flow? + // Remove the unsupported ends of the bridges from the bridged areas. + //FIXME add supports at regular intervals to support long bridges! + bridges = diff(bridges, + // Offset unsupported edges into polygons. + offset(layerm.unsupported_bridge_edges(), scale_(SUPPORT_MATERIAL_MARGIN), SUPPORT_SURFACES_OFFSET_PARAMETERS)); + // Remove bridged areas from the supported areas. + contact_polygons = diff(contact_polygons, bridges, ApplySafetyOffset::Yes); + + #ifdef SLIC3R_DEBUG + static int iRun = 0; + SVG::export_expolygons(debug_out_path("support-top-contacts-remove-bridges-run%d.svg", iRun ++), + { { { union_ex(offset(layerm.unsupported_bridge_edges(), scale_(SUPPORT_MATERIAL_MARGIN), SUPPORT_SURFACES_OFFSET_PARAMETERS)) }, { "unsupported_bridge_edges", "orange", 0.5f } }, + { { union_ex(contact_polygons) }, { "contact_polygons", "blue", 0.5f } }, + { { union_ex(bridges) }, { "bridges", "red", "black", "", scaled(0.1f), 0.5f } } }); + #endif /* SLIC3R_DEBUG */ } std::vector PrintObjectSupportMaterial::buildplate_covered(const PrintObject &object) const @@ -1532,7 +1520,7 @@ static inline std::tuple detect_overhangs( 0.5f * fw); // Overhang polygons for this layer and region. Polygons diff_polygons; - Polygons layerm_polygons = to_polygons(layerm->slices.surfaces); + Polygons layerm_polygons = to_polygons(layerm->slices().surfaces); if (lower_layer_offset == 0.f) { // Support everything. diff_polygons = diff(layerm_polygons, lower_layer_polygons); @@ -1603,8 +1591,7 @@ static inline std::tuple detect_overhangs( if (object_config.dont_support_bridges) //FIXME Expensive, potentially not precise enough. Misses gap fill extrusions, which bridge. - SupportMaterialInternal::remove_bridges_from_contacts( - print_config, lower_layer, lower_layer_polygons, *layerm, fw, diff_polygons); + remove_bridges_from_contacts(print_config, lower_layer, *layerm, fw, diff_polygons); if (diff_polygons.empty()) continue; @@ -1681,17 +1668,17 @@ static inline std::tuple detect_overhangs( // Allocate one, possibly two support contact layers. // For "thick" overhangs, one support layer will be generated to support normal extrusions, the other to support the "thick" extrusions. -static inline std::pair new_contact_layer( +static inline std::pair new_contact_layer( const PrintConfig &print_config, const PrintObjectConfig &object_config, const SlicingParameters &slicing_params, const coordf_t support_layer_height_min, const Layer &layer, - std::deque &layer_storage, + std::deque &layer_storage, tbb::spin_mutex &layer_storage_mutex) { double print_z, bottom_z, height; - PrintObjectSupportMaterial::MyLayer* bridging_layer = nullptr; + SupportGeneratorLayer* bridging_layer = nullptr; assert(layer.id() >= slicing_params.raft_layers()); size_t layer_id = layer.id() - slicing_params.raft_layers(); @@ -1717,7 +1704,7 @@ static inline std::pair(nullptr, nullptr); + return std::pair(nullptr, nullptr); } const bool has_raft = slicing_params.raft_layers() > 1; const coordf_t min_print_z = has_raft ? slicing_params.raft_contact_top_z : slicing_params.first_print_layer_height; @@ -1748,7 +1735,7 @@ static inline std::pairidx_object_layer_above = layer_id; bridging_layer->print_z = bridging_print_z; if (bridging_print_z == slicing_params.first_print_layer_height) { @@ -1764,7 +1751,7 @@ static inline std::pair 0 && !slicing_params.soluble_interface; + bool reduce_interfaces = object_config.support_material_style.value == smsGrid && layer_id > 0 && !slicing_params.soluble_interface; if (reduce_interfaces) { // Reduce the amount of dense interfaces: Do not generate dense interfaces below overhangs with 60% overhang of the extrusions. Polygons dense_interface_polygons = diff(overhang_polygons, lower_layer_polygons_for_dense_interface()); @@ -1925,10 +1912,10 @@ static inline void fill_contact_layer( // Merge close contact layers conservatively: If two layers are closer than the minimum allowed print layer height (the min_layer_height parameter), // the top contact layer is merged into the bottom contact layer. -static void merge_contact_layers(const SlicingParameters &slicing_params, double support_layer_height_min, PrintObjectSupportMaterial::MyLayersPtr &layers) +static void merge_contact_layers(const SlicingParameters &slicing_params, double support_layer_height_min, SupportGeneratorLayersPtr &layers) { // Sort the layers, as one layer may produce bridging and non-bridging contact layers with different print_z. - std::sort(layers.begin(), layers.end(), [](const PrintObjectSupportMaterial::MyLayer *l1, const PrintObjectSupportMaterial::MyLayer *l2) { return l1->print_z < l2->print_z; }); + std::sort(layers.begin(), layers.end(), [](const SupportGeneratorLayer *l1, const SupportGeneratorLayer *l2) { return l1->print_z < l2->print_z; }); int i = 0; int k = 0; @@ -1938,7 +1925,7 @@ static void merge_contact_layers(const SlicingParameters &slicing_params, double for (; j < (int)layers.size() && layers[j]->print_z < slicing_params.first_print_layer_height + support_layer_height_min - EPSILON; ++ j); if (j > 0) { // Merge the layers layers (0) to (j - 1) into the layers[0]. - PrintObjectSupportMaterial::MyLayer &dst = *layers.front(); + SupportGeneratorLayer &dst = *layers.front(); for (int u = 1; u < j; ++ u) dst.merge(std::move(*layers[u])); // Snap the first layer to the 1st layer height. @@ -1956,7 +1943,7 @@ static void merge_contact_layers(const SlicingParameters &slicing_params, double for (; j < (int)layers.size() && layers[j]->print_z < zmax; ++ j) ; if (i + 1 < j) { // Merge the layers layers (i + 1) to (j - 1) into the layers[i]. - PrintObjectSupportMaterial::MyLayer &dst = *layers[i]; + SupportGeneratorLayer &dst = *layers[i]; for (int u = i + 1; u < j; ++ u) dst.merge(std::move(*layers[u])); } @@ -1971,8 +1958,8 @@ static void merge_contact_layers(const SlicingParameters &slicing_params, double // Generate top contact layers supporting overhangs. // For a soluble interface material synchronize the layer heights with the object, otherwise leave the layer height undefined. // If supports over bed surface only are requested, don't generate contact layers over an object. -PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_layers( - const PrintObject &object, const std::vector &buildplate_covered, MyLayerStorage &layer_storage) const +SupportGeneratorLayersPtr PrintObjectSupportMaterial::top_contact_layers( + const PrintObject &object, const std::vector &buildplate_covered, SupportGeneratorLayerStorage &layer_storage) const { #ifdef SLIC3R_DEBUG static int iRun = 0; @@ -1984,7 +1971,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_ SupportAnnotations annotations(object, buildplate_covered); // Output layers, sorted by top Z. - MyLayersPtr contact_out; + SupportGeneratorLayersPtr contact_out; BOOST_LOG_TRIVIAL(debug) << "PrintObjectSupportMaterial::top_contact_layers() in parallel - start"; // Determine top contact areas. @@ -2056,17 +2043,17 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_ } // Find the bottom contact layers above the top surfaces of this layer. -static inline PrintObjectSupportMaterial::MyLayer* detect_bottom_contacts( +static inline SupportGeneratorLayer* detect_bottom_contacts( const SlicingParameters &slicing_params, - const PrintObjectSupportMaterial::SupportParams &support_params, + const SupportParameters &support_params, const PrintObject &object, const Layer &layer, // Existing top contact layers, to which this newly created bottom contact layer will be snapped to guarantee a minimum layer height. - const PrintObjectSupportMaterial::MyLayersPtr &top_contacts, + const SupportGeneratorLayersPtr &top_contacts, // First top contact layer index overlapping with this new bottom interface layer. size_t contact_idx, // To allocate a new layer from. - std::deque &layer_storage, + std::deque &layer_storage, // To trim the support areas above this bottom interface layer with this newly created bottom interface layer. std::vector &layer_support_areas, // Support areas projected from top to bottom, starting with top support interfaces. @@ -2101,7 +2088,7 @@ static inline PrintObjectSupportMaterial::MyLayer* detect_bottom_contacts( size_t layer_id = layer.id() - slicing_params.raft_layers(); // Allocate a new bottom contact layer. - PrintObjectSupportMaterial::MyLayer &layer_new = layer_allocate(layer_storage, PrintObjectSupportMaterial::sltBottomContact); + SupportGeneratorLayer &layer_new = layer_allocate(layer_storage, SupporLayerType::BottomContact); // Grow top surfaces so that interface and support generation are generated // with some spacing from object - it looks we don't need the actual // top shapes so this can be done here @@ -2263,12 +2250,12 @@ static inline std::pair project_support_to_grid(const Layer // Generate bottom contact layers supporting the top contact layers. // For a soluble interface material synchronize the layer heights with the object, // otherwise set the layer height to a bridging flow of a support interface nozzle. -PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::bottom_contact_layers_and_layer_support_areas( - const PrintObject &object, const MyLayersPtr &top_contacts, std::vector &buildplate_covered, - MyLayerStorage &layer_storage, std::vector &layer_support_areas) const +SupportGeneratorLayersPtr PrintObjectSupportMaterial::bottom_contact_layers_and_layer_support_areas( + const PrintObject &object, const SupportGeneratorLayersPtr &top_contacts, std::vector &buildplate_covered, + SupportGeneratorLayerStorage &layer_storage, std::vector &layer_support_areas) const { if (top_contacts.empty()) - return MyLayersPtr(); + return SupportGeneratorLayersPtr(); #ifdef SLIC3R_DEBUG static size_t s_iRun = 0; @@ -2285,7 +2272,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::bottom_conta // find object top surfaces // we'll use them to clip our support and detect where does it stick - MyLayersPtr bottom_contacts; + SupportGeneratorLayersPtr bottom_contacts; // There is some support to be built, if there are non-empty top surfaces detected. // Sum of unsupported contact areas above the current layer.print_z. @@ -2304,7 +2291,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::bottom_conta Polygons enforcers_new; #endif // SLIC3R_DEBUG for (; contact_idx >= 0 && top_contacts[contact_idx]->print_z > layer.print_z - EPSILON; -- contact_idx) { - MyLayer &top_contact = *top_contacts[contact_idx]; + SupportGeneratorLayer &top_contact = *top_contacts[contact_idx]; #ifndef SLIC3R_DEBUG Polygons polygons_new; Polygons enforcers_new; @@ -2346,7 +2333,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::bottom_conta #endif // SLIC3R_DEBUG ] { // Find the bottom contact layers above the top surfaces of this layer. - MyLayer *layer_new = detect_bottom_contacts( + SupportGeneratorLayer *layer_new = detect_bottom_contacts( m_slicing_params, m_support_params, object, layer, top_contacts, contact_idx, layer_storage, layer_support_areas, overhangs_for_bottom_contacts #ifdef SLIC3R_DEBUG , iRun, polygons_new @@ -2481,19 +2468,19 @@ int idx_lower_or_equal(const std::vector &vec, int idx, FN_LOWER_EQUAL fn_lo // Trim the top_contacts layers with the bottom_contacts layers if they overlap, so there would not be enough vertical space for both of them. void PrintObjectSupportMaterial::trim_top_contacts_by_bottom_contacts( - const PrintObject &object, const MyLayersPtr &bottom_contacts, MyLayersPtr &top_contacts) const + const PrintObject &object, const SupportGeneratorLayersPtr &bottom_contacts, SupportGeneratorLayersPtr &top_contacts) const { tbb::parallel_for(tbb::blocked_range(0, int(top_contacts.size())), [&bottom_contacts, &top_contacts](const tbb::blocked_range& range) { int idx_bottom_overlapping_first = -2; // For all top contact layers, counting downwards due to the way idx_higher_or_equal caches the last index to avoid repeated binary search. for (int idx_top = range.end() - 1; idx_top >= range.begin(); -- idx_top) { - MyLayer &layer_top = *top_contacts[idx_top]; + SupportGeneratorLayer &layer_top = *top_contacts[idx_top]; // Find the first bottom layer overlapping with layer_top. - idx_bottom_overlapping_first = idx_lower_or_equal(bottom_contacts, idx_bottom_overlapping_first, [&layer_top](const MyLayer *layer_bottom){ return layer_bottom->bottom_print_z() - EPSILON <= layer_top.bottom_z; }); + idx_bottom_overlapping_first = idx_lower_or_equal(bottom_contacts, idx_bottom_overlapping_first, [&layer_top](const SupportGeneratorLayer *layer_bottom){ return layer_bottom->bottom_print_z() - EPSILON <= layer_top.bottom_z; }); // For all top contact layers overlapping with the thick bottom contact layer: for (int idx_bottom_overlapping = idx_bottom_overlapping_first; idx_bottom_overlapping >= 0; -- idx_bottom_overlapping) { - const MyLayer &layer_bottom = *bottom_contacts[idx_bottom_overlapping]; + const SupportGeneratorLayer &layer_bottom = *bottom_contacts[idx_bottom_overlapping]; assert(layer_bottom.bottom_print_z() - EPSILON <= layer_top.bottom_z); if (layer_top.print_z < layer_bottom.print_z + EPSILON) { // Layers overlap. Trim layer_top with layer_bottom. @@ -2505,16 +2492,16 @@ void PrintObjectSupportMaterial::trim_top_contacts_by_bottom_contacts( }); } -PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_intermediate_support_layers( +SupportGeneratorLayersPtr PrintObjectSupportMaterial::raft_and_intermediate_support_layers( const PrintObject &object, - const MyLayersPtr &bottom_contacts, - const MyLayersPtr &top_contacts, - MyLayerStorage &layer_storage) const + const SupportGeneratorLayersPtr &bottom_contacts, + const SupportGeneratorLayersPtr &top_contacts, + SupportGeneratorLayerStorage &layer_storage) const { - MyLayersPtr intermediate_layers; + SupportGeneratorLayersPtr intermediate_layers; // Collect and sort the extremes (bottoms of the top contacts and tops of the bottom contacts). - MyLayersPtr extremes; + SupportGeneratorLayersPtr extremes; extremes.reserve(top_contacts.size() + bottom_contacts.size()); for (size_t i = 0; i < top_contacts.size(); ++ i) // Bottoms of the top contact layers. In case of non-soluble supports, @@ -2526,18 +2513,18 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int if (extremes.empty()) return intermediate_layers; - auto layer_extreme_lower = [](const MyLayer *l1, const MyLayer *l2) { + auto layer_extreme_lower = [](const SupportGeneratorLayer *l1, const SupportGeneratorLayer *l2) { coordf_t z1 = l1->extreme_z(); coordf_t z2 = l2->extreme_z(); // If the layers are aligned, return the top contact surface first. - return z1 < z2 || (z1 == z2 && l1->layer_type == PrintObjectSupportMaterial::sltTopContact && l2->layer_type == PrintObjectSupportMaterial::sltBottomContact); + return z1 < z2 || (z1 == z2 && l1->layer_type == SupporLayerType::TopContact && l2->layer_type == SupporLayerType::BottomContact); }; std::sort(extremes.begin(), extremes.end(), layer_extreme_lower); assert(extremes.empty() || (extremes.front()->extreme_z() > m_slicing_params.raft_interface_top_z - EPSILON && (m_slicing_params.raft_layers() == 1 || // only raft contact layer - extremes.front()->layer_type == sltTopContact || // first extreme is a top contact layer + extremes.front()->layer_type == SupporLayerType::TopContact || // first extreme is a top contact layer extremes.front()->extreme_z() > m_slicing_params.first_print_layer_height - EPSILON))); bool synchronize = this->synchronize_layers(); @@ -2549,7 +2536,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int extremes[i]->extreme_z() - extremes[i-1]->extreme_z() > m_support_params.support_layer_height_min - EPSILON); assert(extremes[i]->extreme_z() - extremes[i-1]->extreme_z() > 0. || extremes[i]->layer_type == extremes[i-1]->layer_type || - (extremes[i]->layer_type == sltBottomContact && extremes[i - 1]->layer_type == sltTopContact)); + (extremes[i]->layer_type == SupporLayerType::BottomContact && extremes[i - 1]->layer_type == SupporLayerType::TopContact)); } #endif @@ -2562,19 +2549,19 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int if (! extremes.empty() && std::abs(extremes.front()->extreme_z() - m_slicing_params.raft_interface_top_z) < EPSILON) { // This is a raft contact layer, its height has been decided in this->top_contact_layers(). // Ignore this layer when calculating the intermediate support layers. - assert(extremes.front()->layer_type == sltTopContact); + assert(extremes.front()->layer_type == SupporLayerType::TopContact); ++ idx_extreme_first; } for (size_t idx_extreme = idx_extreme_first; idx_extreme < extremes.size(); ++ idx_extreme) { - MyLayer *extr2 = extremes[idx_extreme]; + SupportGeneratorLayer *extr2 = extremes[idx_extreme]; coordf_t extr2z = extr2->extreme_z(); if (std::abs(extr2z - m_slicing_params.first_print_layer_height) < EPSILON) { // This is a bottom of a synchronized (or soluble) top contact layer, its height has been decided in this->top_contact_layers(). - assert(extr2->layer_type == sltTopContact); + assert(extr2->layer_type == SupporLayerType::TopContact); assert(extr2->bottom_z == m_slicing_params.first_print_layer_height); assert(extr2->print_z >= m_slicing_params.first_print_layer_height + m_support_params.support_layer_height_min - EPSILON); if (intermediate_layers.empty() || intermediate_layers.back()->print_z < m_slicing_params.first_print_layer_height) { - MyLayer &layer_new = layer_allocate(layer_storage, sltIntermediate); + SupportGeneratorLayer &layer_new = layer_allocate(layer_storage, SupporLayerType::Intermediate); layer_new.bottom_z = 0.; layer_new.print_z = m_slicing_params.first_print_layer_height; layer_new.height = m_slicing_params.first_print_layer_height; @@ -2584,11 +2571,11 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int } assert(extr2z >= m_slicing_params.raft_interface_top_z + EPSILON); assert(extr2z >= m_slicing_params.first_print_layer_height + EPSILON); - MyLayer *extr1 = (idx_extreme == idx_extreme_first) ? nullptr : extremes[idx_extreme - 1]; + SupportGeneratorLayer *extr1 = (idx_extreme == idx_extreme_first) ? nullptr : extremes[idx_extreme - 1]; // Fuse a support layer firmly to the raft top interface (not to the raft contacts). coordf_t extr1z = (extr1 == nullptr) ? m_slicing_params.raft_interface_top_z : extr1->extreme_z(); assert(extr2z >= extr1z); - assert(extr2z > extr1z || (extr1 != nullptr && extr2->layer_type == sltBottomContact)); + assert(extr2z > extr1z || (extr1 != nullptr && extr2->layer_type == SupporLayerType::BottomContact)); if (std::abs(extr1z) < EPSILON) { // This layer interval starts with the 1st layer. Print the 1st layer using the prescribed 1st layer thickness. // assert(! m_slicing_params.has_raft()); RaftingEdition: unclear where the issue is: assert fails with 1-layer raft & base supports @@ -2596,7 +2583,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int // At this point only layers above first_print_layer_heigth + EPSILON are expected as the other cases were captured earlier. assert(extr2z >= m_slicing_params.first_print_layer_height + EPSILON); // Generate a new intermediate layer. - MyLayer &layer_new = layer_allocate(layer_storage, sltIntermediate); + SupportGeneratorLayer &layer_new = layer_allocate(layer_storage, SupporLayerType::Intermediate); layer_new.bottom_z = 0.; layer_new.print_z = extr1z = m_slicing_params.first_print_layer_height; layer_new.height = extr1z; @@ -2616,7 +2603,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int ++ idx_layer_object; if (idx_layer_object == 0 && extr1z == m_slicing_params.raft_interface_top_z) { // Insert one base support layer below the object. - MyLayer &layer_new = layer_allocate(layer_storage, sltIntermediate); + SupportGeneratorLayer &layer_new = layer_allocate(layer_storage, SupporLayerType::Intermediate); layer_new.print_z = m_slicing_params.object_print_z_min; layer_new.bottom_z = m_slicing_params.raft_interface_top_z; layer_new.height = layer_new.print_z - layer_new.bottom_z; @@ -2624,7 +2611,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int } // Emit all intermediate support layers synchronized with object layers up to extr2z. for (; idx_layer_object < object.layers().size() && object.layers()[idx_layer_object]->print_z < extr2z + EPSILON; ++ idx_layer_object) { - MyLayer &layer_new = layer_allocate(layer_storage, sltIntermediate); + SupportGeneratorLayer &layer_new = layer_allocate(layer_storage, SupporLayerType::Intermediate); layer_new.print_z = object.layers()[idx_layer_object]->print_z; layer_new.height = object.layers()[idx_layer_object]->height; layer_new.bottom_z = (idx_layer_object > 0) ? object.layers()[idx_layer_object - 1]->print_z : (layer_new.print_z - layer_new.height); @@ -2636,13 +2623,13 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int size_t n_layers_extra = size_t(ceil(dist / m_slicing_params.max_suport_layer_height)); assert(n_layers_extra > 0); coordf_t step = dist / coordf_t(n_layers_extra); - if (extr1 != nullptr && extr1->layer_type == sltTopContact && + if (extr1 != nullptr && extr1->layer_type == SupporLayerType::TopContact && extr1->print_z + m_support_params.support_layer_height_min > extr1->bottom_z + step) { // The bottom extreme is a bottom of a top surface. Ensure that the gap // between the 1st intermediate layer print_z and extr1->print_z is not too small. assert(extr1->bottom_z + m_support_params.support_layer_height_min < extr1->print_z + EPSILON); // Generate the first intermediate layer. - MyLayer &layer_new = layer_allocate(layer_storage, sltIntermediate); + SupportGeneratorLayer &layer_new = layer_allocate(layer_storage, SupporLayerType::Intermediate); layer_new.bottom_z = extr1->bottom_z; layer_new.print_z = extr1z = extr1->print_z; layer_new.height = extr1->height; @@ -2654,7 +2641,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int // Continue printing the other layers up to extr2z. step = dist / coordf_t(n_layers_extra); } - if (! m_slicing_params.soluble_interface && extr2->layer_type == sltTopContact) { + if (! m_slicing_params.soluble_interface && extr2->layer_type == SupporLayerType::TopContact) { // This is a top interface layer, which does not have a height assigned yet. Do it now. assert(extr2->height == 0.); assert(extr1z > m_slicing_params.first_print_layer_height - EPSILON); @@ -2666,7 +2653,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int coordf_t extr2z_large_steps = extr2z; // Take the largest allowed step in the Z axis until extr2z_large_steps is reached. for (size_t i = 0; i < n_layers_extra; ++ i) { - MyLayer &layer_new = layer_allocate(layer_storage, sltIntermediate); + SupportGeneratorLayer &layer_new = layer_allocate(layer_storage, SupporLayerType::Intermediate); if (i + 1 == n_layers_extra) { // Last intermediate layer added. Align the last entered layer with extr2z_large_steps exactly. layer_new.bottom_z = (i == 0) ? extr1z : intermediate_layers.back()->print_z; @@ -2697,9 +2684,9 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int // Also the bottom/top_contacts shall have a layer thickness assigned already. void PrintObjectSupportMaterial::generate_base_layers( const PrintObject &object, - const MyLayersPtr &bottom_contacts, - const MyLayersPtr &top_contacts, - MyLayersPtr &intermediate_layers, + const SupportGeneratorLayersPtr &bottom_contacts, + const SupportGeneratorLayersPtr &top_contacts, + SupportGeneratorLayersPtr &intermediate_layers, const std::vector &layer_support_areas) const { #ifdef SLIC3R_DEBUG @@ -2723,7 +2710,7 @@ void PrintObjectSupportMaterial::generate_base_layers( { BOOST_LOG_TRIVIAL(trace) << "Support generator - generate_base_layers - creating layer " << idx_intermediate << " of " << intermediate_layers.size(); - MyLayer &layer_intermediate = *intermediate_layers[idx_intermediate]; + SupportGeneratorLayer &layer_intermediate = *intermediate_layers[idx_intermediate]; // Layers must be sorted by print_z. assert(idx_intermediate == 0 || layer_intermediate.print_z >= intermediate_layers[idx_intermediate - 1]->print_z); @@ -2746,10 +2733,10 @@ void PrintObjectSupportMaterial::generate_base_layers( // 4) base.print_z > top.bottom_z && base.bottom_z < top.bottom_z -> Base overlaps with top.bottom_z. This must not happen. // 5) base.print_z <= top.print_z && base.bottom_z >= top.bottom_z -> Base is fully inside top. Trim base by top. idx_top_contact_above = idx_lower_or_equal(top_contacts, idx_top_contact_above, - [&layer_intermediate](const MyLayer *layer){ return layer->bottom_z <= layer_intermediate.print_z - EPSILON; }); + [&layer_intermediate](const SupportGeneratorLayer *layer){ return layer->bottom_z <= layer_intermediate.print_z - EPSILON; }); // Collect all the top_contact layer intersecting with this layer. for (int idx_top_contact_overlapping = idx_top_contact_above; idx_top_contact_overlapping >= 0; -- idx_top_contact_overlapping) { - MyLayer &layer_top_overlapping = *top_contacts[idx_top_contact_overlapping]; + SupportGeneratorLayer &layer_top_overlapping = *top_contacts[idx_top_contact_overlapping]; if (layer_top_overlapping.print_z < layer_intermediate.bottom_z + EPSILON) break; // Base must not overlap with top.bottom_z. @@ -2766,7 +2753,7 @@ void PrintObjectSupportMaterial::generate_base_layers( polygons_new = layer_support_areas.front(); double first_layer_z = object.layers().front()->print_z; for (int i = idx_top_contact_above + 1; i < int(top_contacts.size()); ++ i) { - MyLayer &contacts = *top_contacts[i]; + SupportGeneratorLayer &contacts = *top_contacts[i]; if (contacts.print_z > first_layer_z + EPSILON) break; assert(contacts.bottom_z > layer_intermediate.print_z - EPSILON); @@ -2783,10 +2770,10 @@ void PrintObjectSupportMaterial::generate_base_layers( // 4) base.print_z > bottom.print_z && base.bottom_z >= bottom.print_z -> Base overlaps with bottom.print_z. This must not happen. // 5) base.print_z <= bottom.print_z && base.bottom_z >= bottom.bottom_z -> Base is fully inside top. Trim base by top. idx_bottom_contact_overlapping = idx_lower_or_equal(bottom_contacts, idx_bottom_contact_overlapping, - [&layer_intermediate](const MyLayer *layer){ return layer->bottom_print_z() <= layer_intermediate.print_z - EPSILON; }); + [&layer_intermediate](const SupportGeneratorLayer *layer){ return layer->bottom_print_z() <= layer_intermediate.print_z - EPSILON; }); // Collect all the bottom_contacts layer intersecting with this layer. for (int i = idx_bottom_contact_overlapping; i >= 0; -- i) { - MyLayer &layer_bottom_overlapping = *bottom_contacts[i]; + SupportGeneratorLayer &layer_bottom_overlapping = *bottom_contacts[i]; if (layer_bottom_overlapping.print_z < layer_intermediate.bottom_print_z() + EPSILON) break; // Base must not overlap with bottom.top_z. @@ -2816,7 +2803,7 @@ void PrintObjectSupportMaterial::generate_base_layers( polygons_new, polygons_trimming, ApplySafetyOffset::Yes); // safety offset to merge the touching source polygons - layer_intermediate.layer_type = sltBase; + layer_intermediate.layer_type = SupporLayerType::Base; #if 0 // coordf_t fillet_radius_scaled = scale_(m_object_config->support_material_spacing); @@ -2838,7 +2825,7 @@ void PrintObjectSupportMaterial::generate_base_layers( BOOST_LOG_TRIVIAL(debug) << "PrintObjectSupportMaterial::generate_base_layers() in parallel - end"; #ifdef SLIC3R_DEBUG - for (MyLayersPtr::const_iterator it = intermediate_layers.begin(); it != intermediate_layers.end(); ++it) + for (SupportGeneratorLayersPtr::const_iterator it = intermediate_layers.begin(); it != intermediate_layers.end(); ++it) ::Slic3r::SVG::export_expolygons( debug_out_path("support-intermediate-layers-untrimmed-%d-%lf.svg", iRun, (*it)->print_z), union_ex((*it)->polygons)); @@ -2850,7 +2837,7 @@ void PrintObjectSupportMaterial::generate_base_layers( void PrintObjectSupportMaterial::trim_support_layers_by_object( const PrintObject &object, - MyLayersPtr &support_layers, + SupportGeneratorLayersPtr &support_layers, const coordf_t gap_extra_above, const coordf_t gap_extra_below, const coordf_t gap_xy) const @@ -2859,10 +2846,10 @@ void PrintObjectSupportMaterial::trim_support_layers_by_object( // Collect non-empty layers to be processed in parallel. // This is a good idea as pulling a thread from a thread pool for an empty task is expensive. - MyLayersPtr nonempty_layers; + SupportGeneratorLayersPtr nonempty_layers; nonempty_layers.reserve(support_layers.size()); for (size_t idx_layer = 0; idx_layer < support_layers.size(); ++ idx_layer) { - MyLayer *support_layer = support_layers[idx_layer]; + SupportGeneratorLayer *support_layer = support_layers[idx_layer]; if (! support_layer->polygons.empty() && support_layer->print_z >= m_slicing_params.raft_contact_top_z + EPSILON) // Non-empty support layer and not a raft layer. nonempty_layers.push_back(support_layer); @@ -2875,7 +2862,7 @@ void PrintObjectSupportMaterial::trim_support_layers_by_object( [this, &object, &nonempty_layers, gap_extra_above, gap_extra_below, gap_xy_scaled](const tbb::blocked_range& range) { size_t idx_object_layer_overlapping = size_t(-1); for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { - MyLayer &support_layer = *nonempty_layers[idx_layer]; + SupportGeneratorLayer &support_layer = *nonempty_layers[idx_layer]; // BOOST_LOG_TRIVIAL(trace) << "Support generator - trim_support_layers_by_object - trimmming non-empty layer " << idx_layer << " of " << nonempty_layers.size(); assert(! support_layer.polygons.empty() && support_layer.print_z >= m_slicing_params.raft_contact_top_z + EPSILON); // Find the overlapping object layers including the extra above / below gap. @@ -2903,10 +2890,10 @@ void PrintObjectSupportMaterial::trim_support_layers_by_object( break; some_region_overlaps = true; polygons_append(polygons_trimming, - offset(region->fill_surfaces.filter_by_type(stBottomBridge), gap_xy_scaled, SUPPORT_SURFACES_OFFSET_PARAMETERS)); + offset(region->fill_surfaces().filter_by_type(stBottomBridge), gap_xy_scaled, SUPPORT_SURFACES_OFFSET_PARAMETERS)); if (region->region().config().overhangs.value) // Add bridging perimeters. - SupportMaterialInternal::collect_bridging_perimeter_areas(region->perimeters, gap_xy_scaled, polygons_trimming); + SupportMaterialInternal::collect_bridging_perimeter_areas(region->perimeters(), gap_xy_scaled, polygons_trimming); } if (! some_region_overlaps) break; @@ -2922,17 +2909,20 @@ void PrintObjectSupportMaterial::trim_support_layers_by_object( BOOST_LOG_TRIVIAL(debug) << "PrintObjectSupportMaterial::trim_support_layers_by_object() in parallel - end"; } -PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::generate_raft_base( - const PrintObject &object, - const MyLayersPtr &top_contacts, - const MyLayersPtr &interface_layers, - const MyLayersPtr &base_interface_layers, - const MyLayersPtr &base_layers, - MyLayerStorage &layer_storage) const +SupportGeneratorLayersPtr generate_raft_base( + const PrintObject &object, + const SupportParameters &support_params, + const SlicingParameters &slicing_params, + const SupportGeneratorLayersPtr &top_contacts, + const SupportGeneratorLayersPtr &interface_layers, + const SupportGeneratorLayersPtr &base_interface_layers, + const SupportGeneratorLayersPtr &base_layers, + SupportGeneratorLayerStorage &layer_storage) { // If there is brim to be generated, calculate the trimming regions. Polygons brim; if (object.has_brim()) { + // The object does not have a raft. // Calculate the area covered by the brim. const BrimType brim_type = object.config().brim_type; const bool brim_outer = brim_type == btOuterOnly || brim_type == btOuterAndInner; @@ -2960,22 +2950,22 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::generate_raf } // How much to inflate the support columns to be stable. This also applies to the 1st layer, if no raft layers are to be printed. - const float inflate_factor_fine = float(scale_((m_slicing_params.raft_layers() > 1) ? 0.5 : EPSILON)); + const float inflate_factor_fine = float(scale_((slicing_params.raft_layers() > 1) ? 0.5 : EPSILON)); const float inflate_factor_1st_layer = std::max(0.f, float(scale_(object.config().raft_first_layer_expansion)) - inflate_factor_fine); - MyLayer *contacts = top_contacts .empty() ? nullptr : top_contacts .front(); - MyLayer *interfaces = interface_layers .empty() ? nullptr : interface_layers .front(); - MyLayer *base_interfaces = base_interface_layers.empty() ? nullptr : base_interface_layers.front(); - MyLayer *columns_base = base_layers .empty() ? nullptr : base_layers .front(); - if (contacts != nullptr && contacts->print_z > std::max(m_slicing_params.first_print_layer_height, m_slicing_params.raft_contact_top_z) + EPSILON) + SupportGeneratorLayer *contacts = top_contacts .empty() ? nullptr : top_contacts .front(); + SupportGeneratorLayer *interfaces = interface_layers .empty() ? nullptr : interface_layers .front(); + SupportGeneratorLayer *base_interfaces = base_interface_layers.empty() ? nullptr : base_interface_layers.front(); + SupportGeneratorLayer *columns_base = base_layers .empty() ? nullptr : base_layers .front(); + if (contacts != nullptr && contacts->print_z > std::max(slicing_params.first_print_layer_height, slicing_params.raft_contact_top_z) + EPSILON) // This is not the raft contact layer. contacts = nullptr; - if (interfaces != nullptr && interfaces->bottom_print_z() > m_slicing_params.raft_interface_top_z + EPSILON) + if (interfaces != nullptr && interfaces->bottom_print_z() > slicing_params.raft_interface_top_z + EPSILON) // This is not the raft column base layer. interfaces = nullptr; - if (base_interfaces != nullptr && base_interfaces->bottom_print_z() > m_slicing_params.raft_interface_top_z + EPSILON) + if (base_interfaces != nullptr && base_interfaces->bottom_print_z() > slicing_params.raft_interface_top_z + EPSILON) // This is not the raft column base layer. base_interfaces = nullptr; - if (columns_base != nullptr && columns_base->bottom_print_z() > m_slicing_params.raft_interface_top_z + EPSILON) + if (columns_base != nullptr && columns_base->bottom_print_z() > slicing_params.raft_interface_top_z + EPSILON) // This is not the raft interface layer. columns_base = nullptr; @@ -2988,17 +2978,25 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::generate_raf polygons_append(interface_polygons, expand(base_interfaces->polygons, inflate_factor_fine, SUPPORT_SURFACES_OFFSET_PARAMETERS)); // Output vector. - MyLayersPtr raft_layers; + SupportGeneratorLayersPtr raft_layers; - if (m_slicing_params.raft_layers() > 1) { + if (slicing_params.raft_layers() > 1) { Polygons base; Polygons columns; + Polygons first_layer; if (columns_base != nullptr) { - base = columns_base->polygons; - columns = base; - if (! interface_polygons.empty()) - // Trim the 1st layer columns with the inflated interface polygons. - columns = diff(columns, interface_polygons); + if (columns_base->bottom_print_z() > slicing_params.raft_interface_top_z - EPSILON) { + // Classic supports with colums above the raft interface. + base = columns_base->polygons; + columns = base; + if (! interface_polygons.empty()) + // Trim the 1st layer columns with the inflated interface polygons. + columns = diff(columns, interface_polygons); + } else { + // Organic supports with raft on print bed. + assert(is_approx(columns_base->print_z, slicing_params.first_print_layer_height)); + first_layer = columns_base->polygons; + } } if (! interface_polygons.empty()) { // Merge the untrimmed columns base with the expanded raft interface, to be used for the support base and interface. @@ -3007,30 +3005,31 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::generate_raf // Do not add the raft contact layer, only add the raft layers below the contact layer. // Insert the 1st layer. { - MyLayer &new_layer = layer_allocate(layer_storage, (m_slicing_params.base_raft_layers > 0) ? sltRaftBase : sltRaftInterface); + SupportGeneratorLayer &new_layer = layer_allocate(layer_storage, (slicing_params.base_raft_layers > 0) ? SupporLayerType::RaftBase : SupporLayerType::RaftInterface); raft_layers.push_back(&new_layer); - new_layer.print_z = m_slicing_params.first_print_layer_height; - new_layer.height = m_slicing_params.first_print_layer_height; + new_layer.print_z = slicing_params.first_print_layer_height; + new_layer.height = slicing_params.first_print_layer_height; new_layer.bottom_z = 0.; - new_layer.polygons = inflate_factor_1st_layer > 0 ? expand(base, inflate_factor_1st_layer) : base; + first_layer = union_(std::move(first_layer), base); + new_layer.polygons = inflate_factor_1st_layer > 0 ? expand(first_layer, inflate_factor_1st_layer) : first_layer; } // Insert the base layers. - for (size_t i = 1; i < m_slicing_params.base_raft_layers; ++ i) { + for (size_t i = 1; i < slicing_params.base_raft_layers; ++ i) { coordf_t print_z = raft_layers.back()->print_z; - MyLayer &new_layer = layer_allocate(layer_storage, sltRaftBase); + SupportGeneratorLayer &new_layer = layer_allocate(layer_storage, SupporLayerType::RaftBase); raft_layers.push_back(&new_layer); - new_layer.print_z = print_z + m_slicing_params.base_raft_layer_height; - new_layer.height = m_slicing_params.base_raft_layer_height; + new_layer.print_z = print_z + slicing_params.base_raft_layer_height; + new_layer.height = slicing_params.base_raft_layer_height; new_layer.bottom_z = print_z; new_layer.polygons = base; } // Insert the interface layers. - for (size_t i = 1; i < m_slicing_params.interface_raft_layers; ++ i) { + for (size_t i = 1; i < slicing_params.interface_raft_layers; ++ i) { coordf_t print_z = raft_layers.back()->print_z; - MyLayer &new_layer = layer_allocate(layer_storage, sltRaftInterface); + SupportGeneratorLayer &new_layer = layer_allocate(layer_storage, SupporLayerType::RaftInterface); raft_layers.push_back(&new_layer); - new_layer.print_z = print_z + m_slicing_params.interface_raft_layer_height; - new_layer.height = m_slicing_params.interface_raft_layer_height; + new_layer.print_z = print_z + slicing_params.interface_raft_layer_height; + new_layer.height = slicing_params.interface_raft_layer_height; new_layer.bottom_z = print_z; new_layer.polygons = interface_polygons; //FIXME misusing contact_polygons for support columns. @@ -3038,12 +3037,12 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::generate_raf } } else { if (columns_base != nullptr) { - // Expand the bases of the support columns in the 1st layer. + // Expand the bases of the support columns in the 1st layer. Polygons &raft = columns_base->polygons; - Polygons trimming = offset(m_object->layers().front()->lslices, (float)scale_(m_support_params.gap_xy), SUPPORT_SURFACES_OFFSET_PARAMETERS); + Polygons trimming = offset(object.layers().front()->lslices, (float)scale_(support_params.gap_xy), SUPPORT_SURFACES_OFFSET_PARAMETERS); if (inflate_factor_1st_layer > SCALED_EPSILON) { // Inflate in multiple steps to avoid leaking of the support 1st layer through object walls. - auto nsteps = std::max(5, int(ceil(inflate_factor_1st_layer / m_support_params.first_layer_flow.scaled_width()))); + auto nsteps = std::max(5, int(ceil(inflate_factor_1st_layer / support_params.first_layer_flow.scaled_width()))); float step = inflate_factor_1st_layer / nsteps; for (int i = 0; i < nsteps; ++ i) raft = diff(expand(raft, step), trimming); @@ -3068,17 +3067,17 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::generate_raf } // Convert some of the intermediate layers into top/bottom interface layers as well as base interface layers. -std::pair PrintObjectSupportMaterial::generate_interface_layers( - const MyLayersPtr &bottom_contacts, - const MyLayersPtr &top_contacts, - MyLayersPtr &intermediate_layers, - MyLayerStorage &layer_storage) const +std::pair PrintObjectSupportMaterial::generate_interface_layers( + const SupportGeneratorLayersPtr &bottom_contacts, + const SupportGeneratorLayersPtr &top_contacts, + SupportGeneratorLayersPtr &intermediate_layers, + SupportGeneratorLayerStorage &layer_storage) const { // my $area_threshold = $self->interface_flow->scaled_spacing ** 2; - std::pair base_and_interface_layers; - MyLayersPtr &interface_layers = base_and_interface_layers.first; - MyLayersPtr &base_interface_layers = base_and_interface_layers.second; + std::pair base_and_interface_layers; + SupportGeneratorLayersPtr &interface_layers = base_and_interface_layers.first; + SupportGeneratorLayersPtr &base_interface_layers = base_and_interface_layers.second; // distinguish between interface and base interface layers // Contact layer is considered an interface layer, therefore run the following block only if support_material_interface_layers > 1. @@ -3090,7 +3089,7 @@ std::pairsupport_material_interface_extruder.value > 0 && m_print_config->filament_soluble.get_at(m_object_config->support_material_interface_extruder.value - 1) && // Base extruder: Either "print with active extruder" not soluble. (m_object_config->support_material_extruder.value == 0 || ! m_print_config->filament_soluble.get_at(m_object_config->support_material_extruder.value - 1)); - bool snug_supports = m_object_config->support_material_style.value == smsSnug; + bool snug_supports = m_object_config->support_material_style.value != smsGrid; int num_interface_layers_top = m_object_config->support_material_interface_layers; int num_interface_layers_bottom = m_object_config->support_material_bottom_interface_layers; if (num_interface_layers_bottom < 0) @@ -3115,7 +3114,7 @@ std::pair MyLayer* { + SupportGeneratorLayer &intermediate_layer, Polygons &bottom, Polygons &&top, const Polygons *subtract, SupporLayerType type) -> SupportGeneratorLayer* { assert(! bottom.empty() || ! top.empty()); // Merge top into bottom, unite them with a safety offset. append(bottom, std::move(top)); @@ -3129,7 +3128,7 @@ std::pair::max() : intermediate_layers[std::min(num_intermediate - 1, idx_intermediate_layer + num_interface_layers_only_top - 1)]->print_z; // Move idx_top_contact_first up until above the current print_z. - idx_top_contact_first = idx_higher_or_equal(top_contacts, idx_top_contact_first, [&intermediate_layer](const MyLayer *layer){ return layer->print_z >= intermediate_layer.print_z; }); // - EPSILON + idx_top_contact_first = idx_higher_or_equal(top_contacts, idx_top_contact_first, [&intermediate_layer](const SupportGeneratorLayer *layer){ return layer->print_z >= intermediate_layer.print_z; }); // - EPSILON // Collect the top contact areas above this intermediate layer, below top_z. for (int idx_top_contact = idx_top_contact_first; idx_top_contact < int(top_contacts.size()); ++ idx_top_contact) { - const MyLayer &top_contact_layer = *top_contacts[idx_top_contact]; + const SupportGeneratorLayer &top_contact_layer = *top_contacts[idx_top_contact]; //FIXME maybe this adds one interface layer in excess? if (top_contact_layer.bottom_z - EPSILON > top_z) break; @@ -3199,26 +3198,26 @@ std::pair::max() : intermediate_layers[std::max(0, idx_intermediate_layer - num_interface_layers_only_bottom)]->bottom_z; // Move idx_bottom_contact_first up until touching bottom_z. - idx_bottom_contact_first = idx_higher_or_equal(bottom_contacts, idx_bottom_contact_first, [bottom_z](const MyLayer *layer){ return layer->print_z >= bottom_z - EPSILON; }); + idx_bottom_contact_first = idx_higher_or_equal(bottom_contacts, idx_bottom_contact_first, [bottom_z](const SupportGeneratorLayer *layer){ return layer->print_z >= bottom_z - EPSILON; }); // Collect the top contact areas above this intermediate layer, below top_z. for (int idx_bottom_contact = idx_bottom_contact_first; idx_bottom_contact < int(bottom_contacts.size()); ++ idx_bottom_contact) { - const MyLayer &bottom_contact_layer = *bottom_contacts[idx_bottom_contact]; + const SupportGeneratorLayer &bottom_contact_layer = *bottom_contacts[idx_bottom_contact]; if (bottom_contact_layer.print_z - EPSILON > intermediate_layer.bottom_z) break; polygons_append(bottom_contact_layer.print_z - EPSILON > bottom_interface_z ? polygons_bottom_contact_projected_interface : polygons_bottom_contact_projected_base, bottom_contact_layer.polygons); } } - MyLayer *interface_layer = nullptr; + SupportGeneratorLayer *interface_layer = nullptr; if (! polygons_bottom_contact_projected_interface.empty() || ! polygons_top_contact_projected_interface.empty()) { interface_layer = insert_layer( intermediate_layer, polygons_bottom_contact_projected_interface, std::move(polygons_top_contact_projected_interface), nullptr, - polygons_top_contact_projected_interface.empty() ? sltBottomInterface : sltTopInterface); + polygons_top_contact_projected_interface.empty() ? SupporLayerType::BottomInterface : SupporLayerType::TopInterface); interface_layers[idx_intermediate_layer] = interface_layer; } if (! polygons_bottom_contact_projected_base.empty() || ! polygons_top_contact_projected_base.empty()) base_interface_layers[idx_intermediate_layer] = insert_layer( intermediate_layer, polygons_bottom_contact_projected_base, std::move(polygons_top_contact_projected_base), - interface_layer ? &interface_layer->polygons : nullptr, sltBase); + interface_layer ? &interface_layer->polygons : nullptr, SupporLayerType::Base); } }); @@ -3281,6 +3280,249 @@ static inline void fill_expolygons_generate_paths( fill_expolygons_generate_paths(dst, std::move(expolygons), filler, fill_params, density, role, flow); } +static Polylines draw_perimeters(const ExPolygon &expoly, double clip_length) +{ + // Draw the perimeters. + Polylines polylines; + polylines.reserve(expoly.holes.size() + 1); + for (size_t i = 0; i <= expoly.holes.size(); ++ i) { + Polyline pl(i == 0 ? expoly.contour.points : expoly.holes[i - 1].points); + pl.points.emplace_back(pl.points.front()); + if (i > 0) + // It is a hole, reverse it. + pl.reverse(); + // so that all contours are CCW oriented. + pl.clip_end(clip_length); + polylines.emplace_back(std::move(pl)); + } + return polylines; +} + +static inline void tree_supports_generate_paths( + ExtrusionEntitiesPtr &dst, + const Polygons &polygons, + const Flow &flow) +{ + // Offset expolygon inside, returns number of expolygons collected (0 or 1). + // Vertices of output paths are marked with Z = source contour index of the expoly. + // Vertices at the intersection of source contours are marked with Z = -1. + auto shrink_expolygon_with_contour_idx = [](const Slic3r::ExPolygon &expoly, const float delta, ClipperLib::JoinType joinType, double miterLimit, ClipperLib_Z::Paths &out) -> int + { + assert(delta > 0); + auto append_paths_with_z = [](ClipperLib::Paths &src, coord_t contour_idx, ClipperLib_Z::Paths &dst) { + dst.reserve(next_highest_power_of_2(dst.size() + src.size())); + for (const ClipperLib::Path &contour : src) { + ClipperLib_Z::Path tmp; + tmp.reserve(contour.size()); + for (const Point &p : contour) + tmp.emplace_back(p.x(), p.y(), contour_idx); + dst.emplace_back(std::move(tmp)); + } + }; + + // 1) Offset the outer contour. + ClipperLib_Z::Paths contours; + { + ClipperLib::ClipperOffset co; + if (joinType == jtRound) + co.ArcTolerance = miterLimit; + else + co.MiterLimit = miterLimit; + co.ShortestEdgeLength = double(delta * 0.005); + co.AddPath(expoly.contour.points, joinType, ClipperLib::etClosedPolygon); + ClipperLib::Paths contours_raw; + co.Execute(contours_raw, - delta); + if (contours_raw.empty()) + // No need to try to offset the holes. + return 0; + append_paths_with_z(contours_raw, 0, contours); + } + + if (expoly.holes.empty()) { + // No need to subtract holes from the offsetted expolygon, we are done. + append(out, std::move(contours)); + } else { + // 2) Offset the holes one by one, collect the offsetted holes. + ClipperLib_Z::Paths holes; + { + for (const Polygon &hole : expoly.holes) { + ClipperLib::ClipperOffset co; + if (joinType == jtRound) + co.ArcTolerance = miterLimit; + else + co.MiterLimit = miterLimit; + co.ShortestEdgeLength = double(delta * 0.005); + co.AddPath(hole.points, joinType, ClipperLib::etClosedPolygon); + ClipperLib::Paths out2; + // Execute reorients the contours so that the outer most contour has a positive area. Thus the output + // contours will be CCW oriented even though the input paths are CW oriented. + // Offset is applied after contour reorientation, thus the signum of the offset value is reversed. + co.Execute(out2, delta); + append_paths_with_z(out2, 1 + (&hole - expoly.holes.data()), holes); + } + } + + // 3) Subtract holes from the contours. + if (holes.empty()) { + // No hole remaining after an offset. Just copy the outer contour. + append(out, std::move(contours)); + } else { + // Negative offset. There is a chance, that the offsetted hole intersects the outer contour. + // Subtract the offsetted holes from the offsetted contours. + ClipperLib_Z::Clipper clipper; + clipper.ZFillFunction([](const ClipperLib_Z::IntPoint &e1bot, const ClipperLib_Z::IntPoint &e1top, const ClipperLib_Z::IntPoint &e2bot, const ClipperLib_Z::IntPoint &e2top, ClipperLib_Z::IntPoint &pt) { + //pt.z() = std::max(std::max(e1bot.z(), e1top.z()), std::max(e2bot.z(), e2top.z())); + // Just mark the intersection. + pt.z() = -1; + }); + clipper.AddPaths(contours, ClipperLib_Z::ptSubject, true); + clipper.AddPaths(holes, ClipperLib_Z::ptClip, true); + ClipperLib_Z::Paths output; + clipper.Execute(ClipperLib_Z::ctDifference, output, ClipperLib_Z::pftNonZero, ClipperLib_Z::pftNonZero); + if (! output.empty()) { + append(out, std::move(output)); + } else { + // The offsetted holes have eaten up the offsetted outer contour. + return 0; + } + } + } + + return 1; + }; + + const double spacing = flow.scaled_spacing(); + // Clip the sheath path to avoid the extruder to get exactly on the first point of the loop. + const double clip_length = spacing * 0.15; + const double anchor_length = spacing * 6.; + ClipperLib_Z::Paths anchor_candidates; + for (ExPolygon& expoly : closing_ex(polygons, float(SCALED_EPSILON), float(SCALED_EPSILON + 0.5 * flow.scaled_width()))) { + std::unique_ptr eec; + double area = expoly.area(); + if (area > sqr(scaled(5.))) { + eec = std::make_unique(); + // Don't reoder internal / external loops of the same island, always start with the internal loop. + eec->no_sort = true; + // Make the tree branch stable by adding another perimeter. + ExPolygons level2 = offset2_ex({ expoly }, -1.5 * flow.scaled_width(), 0.5 * flow.scaled_width()); + if (level2.size() == 1) { + Polylines polylines; + extrusion_entities_append_paths(eec->entities, draw_perimeters(expoly, clip_length), ExtrusionRole::SupportMaterial, flow.mm3_per_mm(), flow.width(), flow.height(), + // Disable reversal of the path, always start with the anchor, always print CCW. + false); + expoly = level2.front(); + } + } + + // Try to produce one more perimeter to place the seam anchor. + // First genrate a 2nd perimeter loop as a source for anchor candidates. + // The anchor candidate points are annotated with an index of the source contour or with -1 if on intersection. + anchor_candidates.clear(); + shrink_expolygon_with_contour_idx(expoly, flow.scaled_width(), DefaultJoinType, 1.2, anchor_candidates); + // Orient all contours CW. + for (auto &path : anchor_candidates) + if (ClipperLib_Z::Area(path) > 0) + std::reverse(path.begin(), path.end()); + + // Draw the perimeters. + Polylines polylines; + polylines.reserve(expoly.holes.size() + 1); + for (size_t idx_loop = 0; idx_loop < expoly.num_contours(); ++ idx_loop) { + // Open the loop with a seam. + const Polygon &loop = expoly.contour_or_hole(idx_loop); + Polyline pl(loop.points); + // Orient all contours CW, because the anchor will be added to the end of polyline while we want to start a loop with the anchor. + if (idx_loop == 0) + // It is an outer contour. + pl.reverse(); + pl.points.emplace_back(pl.points.front()); + pl.clip_end(clip_length); + if (pl.size() < 2) + continue; + // Find the foot of the seam point on anchor_candidates. Only pick an anchor point that was created by offsetting the source contour. + ClipperLib_Z::Path *closest_contour = nullptr; + Vec2d closest_point; + int closest_point_idx = -1; + double closest_point_t; + double d2min = std::numeric_limits::max(); + Vec2d seam_pt = pl.back().cast(); + for (ClipperLib_Z::Path &path : anchor_candidates) + for (int i = 0; i < path.size(); ++ i) { + int j = next_idx_modulo(i, path); + if (path[i].z() == idx_loop || path[j].z() == idx_loop) { + Vec2d pi(path[i].x(), path[i].y()); + Vec2d pj(path[j].x(), path[j].y()); + Vec2d v = pj - pi; + Vec2d w = seam_pt - pi; + auto l2 = v.squaredNorm(); + auto t = std::clamp((l2 == 0) ? 0 : v.dot(w) / l2, 0., 1.); + if ((path[i].z() == idx_loop || t > EPSILON) && (path[j].z() == idx_loop || t < 1. - EPSILON)) { + // Closest point. + Vec2d fp = pi + v * t; + double d2 = (fp - seam_pt).squaredNorm(); + if (d2 < d2min) { + d2min = d2; + closest_contour = &path; + closest_point = fp; + closest_point_idx = i; + closest_point_t = t; + } + } + } + } + if (d2min < sqr(flow.scaled_width() * 3.)) { + // Try to cut an anchor from the closest_contour. + // Both closest_contour and pl are CW oriented. + pl.points.emplace_back(closest_point.cast()); + const ClipperLib_Z::Path &path = *closest_contour; + double remaining_length = anchor_length - (seam_pt - closest_point).norm(); + int i = closest_point_idx; + int j = next_idx_modulo(i, *closest_contour); + Vec2d pi(path[i].x(), path[i].y()); + Vec2d pj(path[j].x(), path[j].y()); + Vec2d v = pj - pi; + double l = v.norm(); + if (remaining_length < (1. - closest_point_t) * l) { + // Just trim the current line. + pl.points.emplace_back((closest_point + v * (remaining_length / l)).cast()); + } else { + // Take the rest of the current line, continue with the other lines. + pl.points.emplace_back(path[j].x(), path[j].y()); + pi = pj; + for (i = j; path[i].z() == idx_loop && remaining_length > 0; i = j, pi = pj) { + j = next_idx_modulo(i, path); + pj = Vec2d(path[j].x(), path[j].y()); + v = pj - pi; + l = v.norm(); + if (i == closest_point_idx) { + // Back at the first segment. Most likely this should not happen and we may end the anchor. + break; + } + if (remaining_length <= l) { + pl.points.emplace_back((pi + v * (remaining_length / l)).cast()); + break; + } + pl.points.emplace_back(path[j].x(), path[j].y()); + remaining_length -= l; + } + } + } + // Start with the anchor. + pl.reverse(); + polylines.emplace_back(std::move(pl)); + } + + ExtrusionEntitiesPtr &out = eec ? eec->entities : dst; + extrusion_entities_append_paths(out, std::move(polylines), ExtrusionRole::SupportMaterial, flow.mm3_per_mm(), flow.width(), flow.height(), + // Disable reversal of the path, always start with the anchor, always print CCW. + false); + if (eec) { + std::reverse(eec->entities.begin(), eec->entities.end()); + dst.emplace_back(eec.release()); + } + } +} + static inline void fill_expolygons_with_sheath_generate_paths( ExtrusionEntitiesPtr &dst, const Polygons &polygons, @@ -3303,9 +3545,9 @@ static inline void fill_expolygons_with_sheath_generate_paths( fill_params.density = density; fill_params.dont_adjust = true; - double spacing = flow.scaled_spacing(); + const double spacing = flow.scaled_spacing(); // Clip the sheath path to avoid the extruder to get exactly on the first point of the loop. - double clip_length = spacing * 0.15; + const double clip_length = spacing * 0.15; for (ExPolygon &expoly : closing_ex(polygons, float(SCALED_EPSILON), float(SCALED_EPSILON + 0.5*flow.scaled_width()))) { // Don't reorder the skirt and its infills. @@ -3315,16 +3557,7 @@ static inline void fill_expolygons_with_sheath_generate_paths( eec->no_sort = true; } ExtrusionEntitiesPtr &out = no_sort ? eec->entities : dst; - // Draw the perimeters. - Polylines polylines; - polylines.reserve(expoly.holes.size() + 1); - for (size_t i = 0; i <= expoly.holes.size(); ++ i) { - Polyline pl(i == 0 ? expoly.contour.points : expoly.holes[i - 1].points); - pl.points.emplace_back(pl.points.front()); - pl.clip_end(clip_length); - polylines.emplace_back(std::move(pl)); - } - extrusion_entities_append_paths(out, polylines, erSupportMaterial, flow.mm3_per_mm(), flow.width(), flow.height()); + extrusion_entities_append_paths(out, draw_perimeters(expoly, clip_length), ExtrusionRole::SupportMaterial, flow.mm3_per_mm(), flow.width(), flow.height()); // Fill in the rest. fill_expolygons_generate_paths(out, offset_ex(expoly, float(-0.4 * spacing)), filler, fill_params, density, role, flow); if (no_sort && ! eec->empty()) @@ -3333,9 +3566,9 @@ static inline void fill_expolygons_with_sheath_generate_paths( } // Support layers, partially processed. -struct MyLayerExtruded +struct SupportGeneratorLayerExtruded { - MyLayerExtruded& operator=(MyLayerExtruded &&rhs) { + SupportGeneratorLayerExtruded& operator=(SupportGeneratorLayerExtruded &&rhs) { this->layer = rhs.layer; this->extrusions = std::move(rhs.extrusions); m_polygons_to_extrude = std::move(rhs.m_polygons_to_extrude); @@ -3356,14 +3589,14 @@ struct MyLayerExtruded Polygons& polygons_to_extrude() { return (m_polygons_to_extrude == nullptr) ? layer->polygons : *m_polygons_to_extrude; } const Polygons& polygons_to_extrude() const { return (m_polygons_to_extrude == nullptr) ? layer->polygons : *m_polygons_to_extrude; } - bool could_merge(const MyLayerExtruded &other) const { + bool could_merge(const SupportGeneratorLayerExtruded &other) const { return ! this->empty() && ! other.empty() && std::abs(this->layer->height - other.layer->height) < EPSILON && this->layer->bridging == other.layer->bridging; } // Merge regions, perform boolean union over the merged polygons. - void merge(MyLayerExtruded &&other) { + void merge(SupportGeneratorLayerExtruded &&other) { assert(this->could_merge(other)); // 1) Merge the rest polygons to extrude, if there are any. if (other.m_polygons_to_extrude != nullptr) { @@ -3397,7 +3630,7 @@ struct MyLayerExtruded } // The source layer. It carries the height and extrusion type (bridging / non bridging, extrusion height). - PrintObjectSupportMaterial::MyLayer *layer { nullptr }; + SupportGeneratorLayer *layer { nullptr }; // Collect extrusions. They will be exported sorted by the bottom height. ExtrusionEntitiesPtr extrusions; @@ -3407,7 +3640,7 @@ struct MyLayerExtruded std::unique_ptr m_polygons_to_extrude; }; -typedef std::vector MyLayerExtrudedPtrs; +typedef std::vector SupportGeneratorLayerExtrudedPtrs; struct LoopInterfaceProcessor { @@ -3426,7 +3659,7 @@ struct LoopInterfaceProcessor // Generate loop contacts at the top_contact_layer, // trim the top_contact_layer->polygons with the areas covered by the loops. - void generate(MyLayerExtruded &top_contact_layer, const Flow &interface_flow_src) const; + void generate(SupportGeneratorLayerExtruded &top_contact_layer, const Flow &interface_flow_src) const; int n_contact_loops; coordf_t circle_radius; @@ -3434,7 +3667,7 @@ struct LoopInterfaceProcessor Polygon circle; }; -void LoopInterfaceProcessor::generate(MyLayerExtruded &top_contact_layer, const Flow &interface_flow_src) const +void LoopInterfaceProcessor::generate(SupportGeneratorLayerExtruded &top_contact_layer, const Flow &interface_flow_src) const { if (n_contact_loops == 0 || top_contact_layer.empty()) return; @@ -3636,7 +3869,7 @@ void LoopInterfaceProcessor::generate(MyLayerExtruded &top_contact_layer, const extrusion_entities_append_paths( top_contact_layer.extrusions, std::move(loop_lines), - erSupportMaterialInterface, flow.mm3_per_mm(), flow.width(), flow.height()); + ExtrusionRole::SupportMaterialInterface, flow.mm3_per_mm(), flow.width(), flow.height()); } #ifdef SLIC3R_DEBUG @@ -3665,9 +3898,9 @@ static std::string dbg_index_to_color(int idx) void modulate_extrusion_by_overlapping_layers( // Extrusions generated for this_layer. ExtrusionEntitiesPtr &extrusions_in_out, - const PrintObjectSupportMaterial::MyLayer &this_layer, + const SupportGeneratorLayer &this_layer, // Multiple layers overlapping with this_layer, sorted bottom up. - const PrintObjectSupportMaterial::MyLayersPtr &overlapping_layers) + const SupportGeneratorLayersPtr &overlapping_layers) { size_t n_overlapping_layers = overlapping_layers.size(); if (n_overlapping_layers == 0 || extrusions_in_out.empty()) @@ -3704,7 +3937,7 @@ void modulate_extrusion_by_overlapping_layers( ++ iRun; BoundingBox bbox; for (size_t i_overlapping_layer = 0; i_overlapping_layer < n_overlapping_layers; ++ i_overlapping_layer) { - const PrintObjectSupportMaterial::MyLayer &overlapping_layer = *overlapping_layers[i_overlapping_layer]; + const SupportGeneratorLayer &overlapping_layer = *overlapping_layers[i_overlapping_layer]; bbox.merge(get_extents(overlapping_layer.polygons)); } for (ExtrusionEntitiesPtr::const_iterator it = extrusions_in_out.begin(); it != extrusions_in_out.end(); ++ it) { @@ -3717,13 +3950,13 @@ void modulate_extrusion_by_overlapping_layers( // Filled polygons for the overlapping regions. svg.draw(union_ex(this_layer.polygons), dbg_index_to_color(-1), transparency); for (size_t i_overlapping_layer = 0; i_overlapping_layer < n_overlapping_layers; ++ i_overlapping_layer) { - const PrintObjectSupportMaterial::MyLayer &overlapping_layer = *overlapping_layers[i_overlapping_layer]; + const SupportGeneratorLayer &overlapping_layer = *overlapping_layers[i_overlapping_layer]; svg.draw(union_ex(overlapping_layer.polygons), dbg_index_to_color(int(i_overlapping_layer)), transparency); } // Contours of the overlapping regions. svg.draw(to_polylines(this_layer.polygons), dbg_index_to_color(-1), scale_(0.2)); for (size_t i_overlapping_layer = 0; i_overlapping_layer < n_overlapping_layers; ++ i_overlapping_layer) { - const PrintObjectSupportMaterial::MyLayer &overlapping_layer = *overlapping_layers[i_overlapping_layer]; + const SupportGeneratorLayer &overlapping_layer = *overlapping_layers[i_overlapping_layer]; svg.draw(to_polylines(overlapping_layer.polygons), dbg_index_to_color(int(i_overlapping_layer)), scale_(0.1)); } // Fill extrusion, the source. @@ -3755,6 +3988,7 @@ void modulate_extrusion_by_overlapping_layers( assert(path != nullptr); polylines.emplace_back(Polyline(std::move(path->polyline))); path_ends.emplace_back(std::pair(polylines.back().points.front(), polylines.back().points.back())); + delete path; } } // Destroy the original extrusion paths, their polylines were moved to path_fragments already. @@ -3764,7 +3998,7 @@ void modulate_extrusion_by_overlapping_layers( // Fragment the path segments by overlapping layers. The overlapping layers are sorted by an increasing print_z. // Trim by the highest overlapping layer first. for (int i_overlapping_layer = int(n_overlapping_layers) - 1; i_overlapping_layer >= 0; -- i_overlapping_layer) { - const PrintObjectSupportMaterial::MyLayer &overlapping_layer = *overlapping_layers[i_overlapping_layer]; + const SupportGeneratorLayer &overlapping_layer = *overlapping_layers[i_overlapping_layer]; ExtrusionPathFragment &frag = path_fragments[i_overlapping_layer]; Polygons polygons_trimming = offset(union_ex(overlapping_layer.polygons), float(scale_(0.5*extrusion_width))); frag.polylines = intersection_pl(path_fragments.back().polylines, polygons_trimming); @@ -3855,7 +4089,7 @@ void modulate_extrusion_by_overlapping_layers( ExtrusionPath *path = multipath.paths.empty() ? nullptr : &multipath.paths.back(); if (path != nullptr) { // Verify whether the path is compatible with the current fragment. - assert(this_layer.layer_type == PrintObjectSupportMaterial::sltBottomContact || path->height != frag.height || path->mm3_per_mm != frag.mm3_per_mm); + assert(this_layer.layer_type == SupporLayerType::BottomContact || path->height != frag.height || path->mm3_per_mm != frag.mm3_per_mm); if (path->height != frag.height || path->mm3_per_mm != frag.mm3_per_mm) { path = nullptr; } @@ -3902,115 +4136,179 @@ void modulate_extrusion_by_overlapping_layers( extrusion_entities_append_paths(extrusions_in_out, std::move(it_fragment->polylines), extrusion_role, it_fragment->mm3_per_mm, it_fragment->width, it_fragment->height); } -void PrintObjectSupportMaterial::generate_toolpaths( - SupportLayerPtrs &support_layers, - const MyLayersPtr &raft_layers, - const MyLayersPtr &bottom_contacts, - const MyLayersPtr &top_contacts, - const MyLayersPtr &intermediate_layers, - const MyLayersPtr &interface_layers, - const MyLayersPtr &base_interface_layers) const +SupportGeneratorLayersPtr generate_support_layers( + PrintObject &object, + const SupportGeneratorLayersPtr &raft_layers, + const SupportGeneratorLayersPtr &bottom_contacts, + const SupportGeneratorLayersPtr &top_contacts, + const SupportGeneratorLayersPtr &intermediate_layers, + const SupportGeneratorLayersPtr &interface_layers, + const SupportGeneratorLayersPtr &base_interface_layers) +{ + // Install support layers into the object. + // A support layer installed on a PrintObject has a unique print_z. + SupportGeneratorLayersPtr layers_sorted; + layers_sorted.reserve(raft_layers.size() + bottom_contacts.size() + top_contacts.size() + intermediate_layers.size() + interface_layers.size() + base_interface_layers.size()); + layers_append(layers_sorted, raft_layers); + layers_append(layers_sorted, bottom_contacts); + layers_append(layers_sorted, top_contacts); + layers_append(layers_sorted, intermediate_layers); + layers_append(layers_sorted, interface_layers); + layers_append(layers_sorted, base_interface_layers); + // Sort the layers lexicographically by a raising print_z and a decreasing height. + std::sort(layers_sorted.begin(), layers_sorted.end(), [](auto *l1, auto *l2) { return *l1 < *l2; }); + int layer_id = 0; + int layer_id_interface = 0; + assert(object.support_layers().empty()); + for (size_t i = 0; i < layers_sorted.size();) { + // Find the last layer with roughly the same print_z, find the minimum layer height of all. + // Due to the floating point inaccuracies, the print_z may not be the same even if in theory they should. + size_t j = i + 1; + coordf_t zmax = layers_sorted[i]->print_z + EPSILON; + for (; j < layers_sorted.size() && layers_sorted[j]->print_z <= zmax; ++j) ; + // Assign an average print_z to the set of layers with nearly equal print_z. + coordf_t zavg = 0.5 * (layers_sorted[i]->print_z + layers_sorted[j - 1]->print_z); + coordf_t height_min = layers_sorted[i]->height; + bool empty = true; + // For snug supports, layers where the direction of the support interface shall change are accounted for. + size_t num_interfaces = 0; + size_t num_top_contacts = 0; + double top_contact_bottom_z = 0; + for (size_t u = i; u < j; ++u) { + SupportGeneratorLayer &layer = *layers_sorted[u]; + if (! layer.polygons.empty()) { + empty = false; + num_interfaces += one_of(layer.layer_type, support_types_interface); + if (layer.layer_type == SupporLayerType::TopContact) { + ++ num_top_contacts; + assert(num_top_contacts <= 1); + // All top contact layers sharing this print_z shall also share bottom_z. + //assert(num_top_contacts == 1 || (top_contact_bottom_z - layer.bottom_z) < EPSILON); + top_contact_bottom_z = layer.bottom_z; + } + } + layer.print_z = zavg; + height_min = std::min(height_min, layer.height); + } + if (! empty) { + // Here the upper_layer and lower_layer pointers are left to null at the support layers, + // as they are never used. These pointers are candidates for removal. + bool this_layer_contacts_only = num_top_contacts > 0 && num_top_contacts == num_interfaces; + size_t this_layer_id_interface = layer_id_interface; + if (this_layer_contacts_only) { + // Find a supporting layer for its interface ID. + for (auto it = object.support_layers().rbegin(); it != object.support_layers().rend(); ++ it) + if (const SupportLayer &other_layer = **it; std::abs(other_layer.print_z - top_contact_bottom_z) < EPSILON) { + // other_layer supports this top contact layer. Assign a different support interface direction to this layer + // from the layer that supports it. + this_layer_id_interface = other_layer.interface_id() + 1; + } + } + object.add_support_layer(layer_id ++, this_layer_id_interface, height_min, zavg); + if (num_interfaces && ! this_layer_contacts_only) + ++ layer_id_interface; + } + i = j; + } + return layers_sorted; +} + +void generate_support_toolpaths( + SupportLayerPtrs &support_layers, + const PrintObjectConfig &config, + const SupportParameters &support_params, + const SlicingParameters &slicing_params, + const SupportGeneratorLayersPtr &raft_layers, + const SupportGeneratorLayersPtr &bottom_contacts, + const SupportGeneratorLayersPtr &top_contacts, + const SupportGeneratorLayersPtr &intermediate_layers, + const SupportGeneratorLayersPtr &interface_layers, + const SupportGeneratorLayersPtr &base_interface_layers) { // loop_interface_processor with a given circle radius. - LoopInterfaceProcessor loop_interface_processor(1.5 * m_support_params.support_material_interface_flow.scaled_width()); - loop_interface_processor.n_contact_loops = this->has_contact_loops() ? 1 : 0; + LoopInterfaceProcessor loop_interface_processor(1.5 * support_params.support_material_interface_flow.scaled_width()); + loop_interface_processor.n_contact_loops = config.support_material_interface_contact_loops ? 1 : 0; - std::vector angles { m_support_params.base_angle }; - if (m_object_config->support_material_pattern == smpRectilinearGrid) - angles.push_back(m_support_params.interface_angle); + std::vector angles { support_params.base_angle }; + if (config.support_material_pattern == smpRectilinearGrid) + angles.push_back(support_params.interface_angle); BoundingBox bbox_object(Point(-scale_(1.), -scale_(1.0)), Point(scale_(1.), scale_(1.))); // const coordf_t link_max_length_factor = 3.; const coordf_t link_max_length_factor = 0.; - float raft_angle_1st_layer = 0.f; - float raft_angle_base = 0.f; - float raft_angle_interface = 0.f; - if (m_slicing_params.base_raft_layers > 1) { - // There are all raft layer types (1st layer, base, interface & contact layers) available. - raft_angle_1st_layer = m_support_params.interface_angle; - raft_angle_base = m_support_params.base_angle; - raft_angle_interface = m_support_params.interface_angle; - } else if (m_slicing_params.base_raft_layers == 1 || m_slicing_params.interface_raft_layers > 1) { - // 1st layer, interface & contact layers available. - raft_angle_1st_layer = m_support_params.base_angle; - if (this->has_support()) - // Print 1st layer at 45 degrees from both the interface and base angles as both can land on the 1st layer. - raft_angle_1st_layer += 0.7854f; - raft_angle_interface = m_support_params.interface_angle; - } else if (m_slicing_params.interface_raft_layers == 1) { - // Only the contact raft layer is non-empty, which will be printed as the 1st layer. - assert(m_slicing_params.base_raft_layers == 0); - assert(m_slicing_params.interface_raft_layers == 1); - assert(m_slicing_params.raft_layers() == 1 && raft_layers.size() == 0); - } else { - // No raft. - assert(m_slicing_params.base_raft_layers == 0); - assert(m_slicing_params.interface_raft_layers == 0); - assert(m_slicing_params.raft_layers() == 0 && raft_layers.size() == 0); - } - // Insert the raft base layers. - size_t n_raft_layers = size_t(std::max(0, int(m_slicing_params.raft_layers()) - 1)); + auto n_raft_layers = std::min(support_layers.size(), std::max(0, int(slicing_params.raft_layers()) - 1)); + tbb::parallel_for(tbb::blocked_range(0, n_raft_layers), - [this, &support_layers, &raft_layers, - &bbox_object, raft_angle_1st_layer, raft_angle_base, raft_angle_interface, link_max_length_factor] + [&support_layers, &raft_layers, &intermediate_layers, &config, &support_params, &slicing_params, + &bbox_object, link_max_length_factor] (const tbb::blocked_range& range) { for (size_t support_layer_id = range.begin(); support_layer_id < range.end(); ++ support_layer_id) { assert(support_layer_id < raft_layers.size()); - SupportLayer &support_layer = *support_layers[support_layer_id]; + SupportLayer &support_layer = *support_layers[support_layer_id]; assert(support_layer.support_fills.entities.empty()); - MyLayer &raft_layer = *raft_layers[support_layer_id]; + SupportGeneratorLayer &raft_layer = *raft_layers[support_layer_id]; - std::unique_ptr filler_interface = std::unique_ptr(Fill::new_from_type(m_support_params.interface_fill_pattern)); - std::unique_ptr filler_support = std::unique_ptr(Fill::new_from_type(m_support_params.base_fill_pattern)); + std::unique_ptr filler_interface = std::unique_ptr(Fill::new_from_type(support_params.raft_interface_fill_pattern)); + std::unique_ptr filler_support = std::unique_ptr(Fill::new_from_type(support_params.base_fill_pattern)); filler_interface->set_bounding_box(bbox_object); filler_support->set_bounding_box(bbox_object); + // Print the tree supports cutting through the raft with the exception of the 1st layer, where a full support layer will be printed below + // both the raft and the trees. + // Trim the raft layers with the tree polygons. + const Polygons &tree_polygons = + support_layer_id > 0 && support_layer_id < intermediate_layers.size() && is_approx(intermediate_layers[support_layer_id]->print_z, support_layer.print_z) ? + intermediate_layers[support_layer_id]->polygons : Polygons(); + // Print the support base below the support columns, or the support base for the support columns plus the contacts. if (support_layer_id > 0) { - const Polygons &to_infill_polygons = (support_layer_id < m_slicing_params.base_raft_layers) ? + const Polygons &to_infill_polygons = (support_layer_id < slicing_params.base_raft_layers) ? raft_layer.polygons : //FIXME misusing contact_polygons for support columns. ((raft_layer.contact_polygons == nullptr) ? Polygons() : *raft_layer.contact_polygons); + // Trees may cut through the raft layers down to a print bed. + Flow flow(float(support_params.support_material_flow.width()), float(raft_layer.height), support_params.support_material_flow.nozzle_diameter()); + assert(!raft_layer.bridging); if (! to_infill_polygons.empty()) { - assert(! raft_layer.bridging); - Flow flow(float(m_support_params.support_material_flow.width()), float(raft_layer.height), m_support_params.support_material_flow.nozzle_diameter()); - Fill * filler = filler_support.get(); - filler->angle = raft_angle_base; - filler->spacing = m_support_params.support_material_flow.spacing(); - filler->link_max_length = coord_t(scale_(filler->spacing * link_max_length_factor / m_support_params.support_density)); + Fill *filler = filler_support.get(); + filler->angle = support_params.raft_angle_base; + filler->spacing = support_params.support_material_flow.spacing(); + filler->link_max_length = coord_t(scale_(filler->spacing * link_max_length_factor / support_params.support_density)); fill_expolygons_with_sheath_generate_paths( // Destination support_layer.support_fills.entities, // Regions to fill - to_infill_polygons, + tree_polygons.empty() ? to_infill_polygons : diff(to_infill_polygons, tree_polygons), // Filler and its parameters - filler, float(m_support_params.support_density), + filler, float(support_params.support_density), // Extrusion parameters - erSupportMaterial, flow, - m_support_params.with_sheath, false); + ExtrusionRole::SupportMaterial, flow, + support_params.with_sheath, false); } + if (! tree_polygons.empty()) + tree_supports_generate_paths(support_layer.support_fills.entities, tree_polygons, flow); } Fill *filler = filler_interface.get(); - Flow flow = m_support_params.first_layer_flow; + Flow flow = support_params.first_layer_flow; float density = 0.f; if (support_layer_id == 0) { // Base flange. - filler->angle = raft_angle_1st_layer; - filler->spacing = m_support_params.first_layer_flow.spacing(); - density = float(m_object_config->raft_first_layer_density.value * 0.01); - } else if (support_layer_id >= m_slicing_params.base_raft_layers) { - filler->angle = raft_angle_interface; + filler->angle = support_params.raft_angle_1st_layer; + filler->spacing = support_params.first_layer_flow.spacing(); + density = float(config.raft_first_layer_density.value * 0.01); + } else if (support_layer_id >= slicing_params.base_raft_layers) { + filler->angle = support_params.raft_interface_angle(support_layer.interface_id()); // We don't use $base_flow->spacing because we need a constant spacing // value that guarantees that all layers are correctly aligned. - filler->spacing = m_support_params.support_material_flow.spacing(); + filler->spacing = support_params.support_material_flow.spacing(); assert(! raft_layer.bridging); - flow = Flow(float(m_support_params.support_material_interface_flow.width()), float(raft_layer.height), m_support_params.support_material_flow.nozzle_diameter()); - density = float(m_support_params.interface_density); + flow = Flow(float(support_params.raft_interface_flow.width()), float(raft_layer.height), support_params.raft_interface_flow.nozzle_diameter()); + density = float(support_params.raft_interface_density); } else continue; filler->link_max_length = coord_t(scale_(filler->spacing * link_max_length_factor / density)); @@ -4018,31 +4316,31 @@ void PrintObjectSupportMaterial::generate_toolpaths( // Destination support_layer.support_fills.entities, // Regions to fill - raft_layer.polygons, + tree_polygons.empty() ? raft_layer.polygons : diff(raft_layer.polygons, tree_polygons), // Filler and its parameters filler, density, // Extrusion parameters - (support_layer_id < m_slicing_params.base_raft_layers) ? erSupportMaterial : erSupportMaterialInterface, flow, + (support_layer_id < slicing_params.base_raft_layers) ? ExtrusionRole::SupportMaterial : ExtrusionRole::SupportMaterialInterface, flow, // sheath at first layer support_layer_id == 0, support_layer_id == 0); } }); struct LayerCacheItem { - LayerCacheItem(MyLayerExtruded *layer_extruded = nullptr) : layer_extruded(layer_extruded) {} - MyLayerExtruded *layer_extruded; - std::vector overlapping; + LayerCacheItem(SupportGeneratorLayerExtruded *layer_extruded = nullptr) : layer_extruded(layer_extruded) {} + SupportGeneratorLayerExtruded *layer_extruded; + std::vector overlapping; }; struct LayerCache { - MyLayerExtruded bottom_contact_layer; - MyLayerExtruded top_contact_layer; - MyLayerExtruded base_layer; - MyLayerExtruded interface_layer; - MyLayerExtruded base_interface_layer; + SupportGeneratorLayerExtruded bottom_contact_layer; + SupportGeneratorLayerExtruded top_contact_layer; + SupportGeneratorLayerExtruded base_layer; + SupportGeneratorLayerExtruded interface_layer; + SupportGeneratorLayerExtruded base_interface_layer; boost::container::static_vector nonempty; void add_nonempty_and_sort() { - for (MyLayerExtruded *item : { &bottom_contact_layer, &top_contact_layer, &interface_layer, &base_interface_layer, &base_layer }) + for (SupportGeneratorLayerExtruded *item : { &bottom_contact_layer, &top_contact_layer, &interface_layer, &base_interface_layer, &base_layer }) if (! item->empty()) this->nonempty.emplace_back(item); // Sort the layers with the same print_z coordinate by their heights, thickest first. @@ -4052,8 +4350,8 @@ void PrintObjectSupportMaterial::generate_toolpaths( std::vector layer_caches(support_layers.size()); tbb::parallel_for(tbb::blocked_range(n_raft_layers, support_layers.size()), - [this, &support_layers, &bottom_contacts, &top_contacts, &intermediate_layers, &interface_layers, &base_interface_layers, &layer_caches, &loop_interface_processor, - &bbox_object, &angles, link_max_length_factor] + [&config, &slicing_params, &support_params, &support_layers, &bottom_contacts, &top_contacts, &intermediate_layers, &interface_layers, &base_interface_layers, &layer_caches, &loop_interface_processor, + &bbox_object, &angles, n_raft_layers, link_max_length_factor] (const tbb::blocked_range& range) { // Indices of the 1st layer in their respective container at the support layer height. size_t idx_layer_bottom_contact = size_t(-1); @@ -4062,18 +4360,25 @@ void PrintObjectSupportMaterial::generate_toolpaths( size_t idx_layer_interface = size_t(-1); size_t idx_layer_base_interface = size_t(-1); const auto fill_type_first_layer = ipRectilinear; - auto filler_interface = std::unique_ptr(Fill::new_from_type(m_support_params.contact_fill_pattern)); + auto filler_interface = std::unique_ptr(Fill::new_from_type(support_params.contact_fill_pattern)); // Filler for the 1st layer interface, if different from filler_interface. - auto filler_first_layer_ptr = std::unique_ptr(range.begin() == 0 && m_support_params.contact_fill_pattern != fill_type_first_layer ? Fill::new_from_type(fill_type_first_layer) : nullptr); + auto filler_first_layer_ptr = std::unique_ptr(range.begin() == 0 && support_params.contact_fill_pattern != fill_type_first_layer ? Fill::new_from_type(fill_type_first_layer) : nullptr); // Pointer to the 1st layer interface filler. auto filler_first_layer = filler_first_layer_ptr ? filler_first_layer_ptr.get() : filler_interface.get(); + // Filler for the 1st layer interface, if different from filler_interface. + auto filler_raft_contact_ptr = std::unique_ptr(range.begin() == n_raft_layers && config.support_material_interface_layers.value == 0 ? + Fill::new_from_type(support_params.raft_interface_fill_pattern) : nullptr); + // Pointer to the 1st layer interface filler. + auto filler_raft_contact = filler_raft_contact_ptr ? filler_raft_contact_ptr.get() : filler_interface.get(); // Filler for the base interface (to be used for soluble interface / non soluble base, to produce non soluble interface layer below soluble interface layer). auto filler_base_interface = std::unique_ptr(base_interface_layers.empty() ? nullptr : - Fill::new_from_type(m_support_params.interface_density > 0.95 || m_support_params.with_sheath ? ipRectilinear : ipSupportBase)); - auto filler_support = std::unique_ptr(Fill::new_from_type(m_support_params.base_fill_pattern)); + Fill::new_from_type(support_params.interface_density > 0.95 || support_params.with_sheath ? ipRectilinear : ipSupportBase)); + auto filler_support = std::unique_ptr(Fill::new_from_type(support_params.base_fill_pattern)); filler_interface->set_bounding_box(bbox_object); if (filler_first_layer_ptr) filler_first_layer_ptr->set_bounding_box(bbox_object); + if (filler_raft_contact_ptr) + filler_raft_contact_ptr->set_bounding_box(bbox_object); if (filler_base_interface) filler_base_interface->set_bounding_box(bbox_object); filler_support->set_bounding_box(bbox_object); @@ -4081,19 +4386,18 @@ void PrintObjectSupportMaterial::generate_toolpaths( { SupportLayer &support_layer = *support_layers[support_layer_id]; LayerCache &layer_cache = layer_caches[support_layer_id]; - float interface_angle_delta = m_object_config->support_material_style.value == smsSnug ? - (support_layer.interface_id() & 1) ? float(- M_PI / 4.) : float(+ M_PI / 4.) : - 0; + const float support_interface_angle = config.support_material_style.value == smsGrid ? + support_params.interface_angle : support_params.raft_interface_angle(support_layer.interface_id()); // Find polygons with the same print_z. - MyLayerExtruded &bottom_contact_layer = layer_cache.bottom_contact_layer; - MyLayerExtruded &top_contact_layer = layer_cache.top_contact_layer; - MyLayerExtruded &base_layer = layer_cache.base_layer; - MyLayerExtruded &interface_layer = layer_cache.interface_layer; - MyLayerExtruded &base_interface_layer = layer_cache.base_interface_layer; + SupportGeneratorLayerExtruded &bottom_contact_layer = layer_cache.bottom_contact_layer; + SupportGeneratorLayerExtruded &top_contact_layer = layer_cache.top_contact_layer; + SupportGeneratorLayerExtruded &base_layer = layer_cache.base_layer; + SupportGeneratorLayerExtruded &interface_layer = layer_cache.interface_layer; + SupportGeneratorLayerExtruded &base_interface_layer = layer_cache.base_interface_layer; // Increment the layer indices to find a layer at support_layer.print_z. { - auto fun = [&support_layer](const MyLayer *l){ return l->print_z >= support_layer.print_z - EPSILON; }; + auto fun = [&support_layer](const SupportGeneratorLayer *l){ return l->print_z >= support_layer.print_z - EPSILON; }; idx_layer_bottom_contact = idx_higher_or_equal(bottom_contacts, idx_layer_bottom_contact, fun); idx_layer_top_contact = idx_higher_or_equal(top_contacts, idx_layer_top_contact, fun); idx_layer_intermediate = idx_higher_or_equal(intermediate_layers, idx_layer_intermediate, fun); @@ -4112,28 +4416,31 @@ void PrintObjectSupportMaterial::generate_toolpaths( if (idx_layer_intermediate < intermediate_layers.size() && intermediate_layers[idx_layer_intermediate]->print_z < support_layer.print_z + EPSILON) base_layer.layer = intermediate_layers[idx_layer_intermediate]; - if (m_object_config->support_material_interface_layers == 0) { + // This layer is a raft contact layer. Any contact polygons at this layer are raft contacts. + bool raft_layer = slicing_params.interface_raft_layers && top_contact_layer.layer && is_approx(top_contact_layer.layer->print_z, slicing_params.raft_contact_top_z); + if (config.support_material_interface_layers == 0) { // If no top interface layers were requested, we treat the contact layer exactly as a generic base layer. - if (m_support_params.can_merge_support_regions) { - if (base_layer.could_merge(top_contact_layer)) + // Don't merge the raft contact layer though. + if (support_params.can_merge_support_regions && ! raft_layer) { + if (base_layer.could_merge(top_contact_layer)) base_layer.merge(std::move(top_contact_layer)); else if (base_layer.empty()) base_layer = std::move(top_contact_layer); } } else { - loop_interface_processor.generate(top_contact_layer, m_support_params.support_material_interface_flow); + loop_interface_processor.generate(top_contact_layer, support_params.support_material_interface_flow); // If no loops are allowed, we treat the contact layer exactly as a generic interface layer. // Merge interface_layer into top_contact_layer, as the top_contact_layer is not synchronized and therefore it will be used // to trim other layers. - if (top_contact_layer.could_merge(interface_layer)) + if (top_contact_layer.could_merge(interface_layer) && ! raft_layer) top_contact_layer.merge(std::move(interface_layer)); } - if ((m_object_config->support_material_interface_layers == 0 || m_object_config->support_material_bottom_interface_layers == 0) && m_support_params.can_merge_support_regions) { + if ((config.support_material_interface_layers == 0 || config.support_material_bottom_interface_layers == 0) && support_params.can_merge_support_regions) { if (base_layer.could_merge(bottom_contact_layer)) base_layer.merge(std::move(bottom_contact_layer)); else if (base_layer.empty() && ! bottom_contact_layer.empty() && ! bottom_contact_layer.layer->bridging) base_layer = std::move(bottom_contact_layer); - } else if (bottom_contact_layer.could_merge(top_contact_layer)) + } else if (bottom_contact_layer.could_merge(top_contact_layer) && ! raft_layer) top_contact_layer.merge(std::move(bottom_contact_layer)); else if (bottom_contact_layer.could_merge(interface_layer)) bottom_contact_layer.merge(std::move(interface_layer)); @@ -4151,35 +4458,46 @@ void PrintObjectSupportMaterial::generate_toolpaths( #endif // Top and bottom contacts, interface layers. - for (size_t i = 0; i < 3; ++ i) { - MyLayerExtruded &layer_ex = (i == 0) ? top_contact_layer : (i == 1 ? bottom_contact_layer : interface_layer); - if (layer_ex.empty() || layer_ex.polygons_to_extrude().empty()) - continue; - bool interface_as_base = m_object_config->support_material_interface_layers.value == 0 || - (m_object_config->support_material_bottom_interface_layers == 0 && &layer_ex == &bottom_contact_layer); - //FIXME Bottom interfaces are extruded with the briding flow. Some bridging layers have its height slightly reduced, therefore - // the bridging flow does not quite apply. Reduce the flow to area of an ellipse? (A = pi * a * b) - auto interface_flow = layer_ex.layer->bridging ? - Flow::bridging_flow(layer_ex.layer->height, m_support_params.support_material_bottom_interface_flow.nozzle_diameter()) : - (interface_as_base ? &m_support_params.support_material_flow : &m_support_params.support_material_interface_flow)->with_height(float(layer_ex.layer->height)); - filler_interface->angle = interface_as_base ? - // If zero interface layers are configured, use the same angle as for the base layers. - angles[support_layer_id % angles.size()] : - // Use interface angle for the interface layers. - m_support_params.interface_angle + interface_angle_delta; - double density = interface_as_base ? m_support_params.support_density : m_support_params.interface_density; - filler_interface->spacing = interface_as_base ? m_support_params.support_material_flow.spacing() : m_support_params.support_material_interface_flow.spacing(); - filler_interface->link_max_length = coord_t(scale_(filler_interface->spacing * link_max_length_factor / density)); - fill_expolygons_generate_paths( - // Destination - layer_ex.extrusions, - // Regions to fill - union_safety_offset_ex(layer_ex.polygons_to_extrude()), - // Filler and its parameters - filler_interface.get(), float(density), - // Extrusion parameters - erSupportMaterialInterface, interface_flow); - } + enum class InterfaceLayerType { TopContact, BottomContact, RaftContact, Interface, InterfaceAsBase }; + auto extrude_interface = [&](SupportGeneratorLayerExtruded &layer_ex, InterfaceLayerType interface_layer_type) { + if (! layer_ex.empty() && ! layer_ex.polygons_to_extrude().empty()) { + bool interface_as_base = interface_layer_type == InterfaceLayerType::InterfaceAsBase; + bool raft_contact = interface_layer_type == InterfaceLayerType::RaftContact; + //FIXME Bottom interfaces are extruded with the briding flow. Some bridging layers have its height slightly reduced, therefore + // the bridging flow does not quite apply. Reduce the flow to area of an ellipse? (A = pi * a * b) + auto *filler = raft_contact ? filler_raft_contact : filler_interface.get(); + auto interface_flow = layer_ex.layer->bridging ? + Flow::bridging_flow(layer_ex.layer->height, support_params.support_material_bottom_interface_flow.nozzle_diameter()) : + (raft_contact ? &support_params.raft_interface_flow : + interface_as_base ? &support_params.support_material_flow : &support_params.support_material_interface_flow) + ->with_height(float(layer_ex.layer->height)); + filler->angle = interface_as_base ? + // If zero interface layers are configured, use the same angle as for the base layers. + angles[support_layer_id % angles.size()] : + // Use interface angle for the interface layers. + raft_contact ? + support_params.raft_interface_angle(support_layer.interface_id()) : + support_interface_angle; + double density = raft_contact ? support_params.raft_interface_density : interface_as_base ? support_params.support_density : support_params.interface_density; + filler->spacing = raft_contact ? support_params.raft_interface_flow.spacing() : + interface_as_base ? support_params.support_material_flow.spacing() : support_params.support_material_interface_flow.spacing(); + filler->link_max_length = coord_t(scale_(filler->spacing * link_max_length_factor / density)); + fill_expolygons_generate_paths( + // Destination + layer_ex.extrusions, + // Regions to fill + union_safety_offset_ex(layer_ex.polygons_to_extrude()), + // Filler and its parameters + filler, float(density), + // Extrusion parameters + ExtrusionRole::SupportMaterialInterface, interface_flow); + } + }; + const bool top_interfaces = config.support_material_interface_layers.value != 0; + const bool bottom_interfaces = top_interfaces && config.support_material_bottom_interface_layers != 0; + extrude_interface(top_contact_layer, raft_layer ? InterfaceLayerType::RaftContact : top_interfaces ? InterfaceLayerType::TopContact : InterfaceLayerType::InterfaceAsBase); + extrude_interface(bottom_contact_layer, bottom_interfaces ? InterfaceLayerType::BottomContact : InterfaceLayerType::InterfaceAsBase); + extrude_interface(interface_layer, top_interfaces ? InterfaceLayerType::Interface : InterfaceLayerType::InterfaceAsBase); // Base interface layers under soluble interfaces if ( ! base_interface_layer.empty() && ! base_interface_layer.polygons_to_extrude().empty()) { @@ -4187,10 +4505,10 @@ void PrintObjectSupportMaterial::generate_toolpaths( //FIXME Bottom interfaces are extruded with the briding flow. Some bridging layers have its height slightly reduced, therefore // the bridging flow does not quite apply. Reduce the flow to area of an ellipse? (A = pi * a * b) assert(! base_interface_layer.layer->bridging); - Flow interface_flow = m_support_params.support_material_flow.with_height(float(base_interface_layer.layer->height)); - filler->angle = m_support_params.interface_angle + interface_angle_delta; - filler->spacing = m_support_params.support_material_interface_flow.spacing(); - filler->link_max_length = coord_t(scale_(filler->spacing * link_max_length_factor / m_support_params.interface_density)); + Flow interface_flow = support_params.support_material_flow.with_height(float(base_interface_layer.layer->height)); + filler->angle = support_interface_angle; + filler->spacing = support_params.support_material_interface_flow.spacing(); + filler->link_max_length = coord_t(scale_(filler->spacing * link_max_length_factor / support_params.interface_density)); fill_expolygons_generate_paths( // Destination base_interface_layer.extrusions, @@ -4198,9 +4516,9 @@ void PrintObjectSupportMaterial::generate_toolpaths( // Regions to fill union_safety_offset_ex(base_interface_layer.polygons_to_extrude()), // Filler and its parameters - filler, float(m_support_params.interface_density), + filler, float(support_params.interface_density), // Extrusion parameters - erSupportMaterial, interface_flow); + ExtrusionRole::SupportMaterial, interface_flow); } // Base support or flange. @@ -4210,18 +4528,19 @@ void PrintObjectSupportMaterial::generate_toolpaths( // We don't use $base_flow->spacing because we need a constant spacing // value that guarantees that all layers are correctly aligned. assert(! base_layer.layer->bridging); - auto flow = m_support_params.support_material_flow.with_height(float(base_layer.layer->height)); - filler->spacing = m_support_params.support_material_flow.spacing(); - filler->link_max_length = coord_t(scale_(filler->spacing * link_max_length_factor / m_support_params.support_density)); - float density = float(m_support_params.support_density); - bool sheath = m_support_params.with_sheath; + auto flow = support_params.support_material_flow.with_height(float(base_layer.layer->height)); + filler->spacing = support_params.support_material_flow.spacing(); + filler->link_max_length = coord_t(scale_(filler->spacing * link_max_length_factor / support_params.support_density)); + float density = float(support_params.support_density); + bool sheath = support_params.with_sheath; bool no_sort = false; + bool done = false; if (base_layer.layer->bottom_z < EPSILON) { // Base flange (the 1st layer). filler = filler_first_layer; - filler->angle = Geometry::deg2rad(float(m_object_config->support_material_angle.value + 90.)); - density = float(m_object_config->raft_first_layer_density.value * 0.01); - flow = m_support_params.first_layer_flow; + filler->angle = Geometry::deg2rad(float(config.support_material_angle.value + 90.)); + density = float(config.raft_first_layer_density.value * 0.01); + flow = support_params.first_layer_flow; // use the proper spacing for first layer as we don't need to align // its pattern to the other layers //FIXME When paralellizing, each thread shall have its own copy of the fillers. @@ -4229,18 +4548,21 @@ void PrintObjectSupportMaterial::generate_toolpaths( filler->link_max_length = coord_t(scale_(filler->spacing * link_max_length_factor / density)); sheath = true; no_sort = true; + } else if (config.support_material_style == SupportMaterialStyle::smsOrganic) { + tree_supports_generate_paths(base_layer.extrusions, base_layer.polygons_to_extrude(), flow); + done = true; } - fill_expolygons_with_sheath_generate_paths( - // Destination - base_layer.extrusions, - // Regions to fill - base_layer.polygons_to_extrude(), - // Filler and its parameters - filler, density, - // Extrusion parameters - erSupportMaterial, flow, - sheath, no_sort); - + if (! done) + fill_expolygons_with_sheath_generate_paths( + // Destination + base_layer.extrusions, + // Regions to fill + base_layer.polygons_to_extrude(), + // Filler and its parameters + filler, density, + // Extrusion parameters + ExtrusionRole::SupportMaterial, flow, + sheath, no_sort); } // Merge base_interface_layers to base_layers to avoid unneccessary retractions @@ -4268,12 +4590,12 @@ void PrintObjectSupportMaterial::generate_toolpaths( // Collect overlapping top/bottom surfaces. layer_cache_item.overlapping.reserve(20); coordf_t bottom_z = layer_cache_item.layer_extruded->layer->bottom_print_z() + EPSILON; - auto add_overlapping = [&layer_cache_item, bottom_z](const MyLayersPtr &layers, size_t idx_top) { + auto add_overlapping = [&layer_cache_item, bottom_z](const SupportGeneratorLayersPtr &layers, size_t idx_top) { for (int i = int(idx_top) - 1; i >= 0 && layers[i]->print_z > bottom_z; -- i) layer_cache_item.overlapping.push_back(layers[i]); }; add_overlapping(top_contacts, idx_layer_top_contact); - if (layer_cache_item.layer_extruded->layer->layer_type == sltBottomContact) { + if (layer_cache_item.layer_extruded->layer->layer_type == SupporLayerType::BottomContact) { // Bottom contact layer may overlap with a base layer, which may be changed to interface layer. add_overlapping(intermediate_layers, idx_layer_intermediate); add_overlapping(interface_layers, idx_layer_interface); @@ -4282,8 +4604,13 @@ void PrintObjectSupportMaterial::generate_toolpaths( // Order the layers by lexicographically by an increasing print_z and a decreasing layer height. std::stable_sort(layer_cache_item.overlapping.begin(), layer_cache_item.overlapping.end(), [](auto *l1, auto *l2) { return *l1 < *l2; }); } - if (! polys.empty()) - expolygons_append(support_layer.support_islands.expolygons, union_ex(polys)); + assert(support_layer.support_islands.empty()); + if (! polys.empty()) { + support_layer.support_islands = union_ex(polys); + support_layer.support_islands_bboxes.reserve(support_layer.support_islands.size()); + for (const ExPolygon &expoly : support_layer.support_islands) + support_layer.support_islands_bboxes.emplace_back(get_extents(expoly).inflated(SCALED_EPSILON)); + } } // for each support_layer_id }); @@ -4321,7 +4648,7 @@ void PrintObjectSupportMaterial::generate_toolpaths( } }; for (const SupportLayer *support_layer : support_layers) - assert(Test::verify_nonempty(&support_layer->support_fills)); + assert(Test::verify_nonempty(&support_layer->support_fills)); #endif // NDEBUG } diff --git a/src/libslic3r/SupportMaterial.hpp b/src/libslic3r/SupportMaterial.hpp index 65604ef721a..2bd3211445f 100644 --- a/src/libslic3r/SupportMaterial.hpp +++ b/src/libslic3r/SupportMaterial.hpp @@ -11,147 +11,220 @@ class PrintObject; class PrintConfig; class PrintObjectConfig; +// Support layer type to be used by SupportGeneratorLayer. This type carries a much more detailed information +// about the support layer type than the final support layers stored in a PrintObject. +enum class SupporLayerType { + Unknown = 0, + // Ratft base layer, to be printed with the support material. + RaftBase, + // Raft interface layer, to be printed with the support interface material. + RaftInterface, + // Bottom contact layer placed over a top surface of an object. To be printed with a support interface material. + BottomContact, + // Dense interface layer, to be printed with the support interface material. + // This layer is separated from an object by an BottomContact layer. + BottomInterface, + // Sparse base support layer, to be printed with a support material. + Base, + // Dense interface layer, to be printed with the support interface material. + // This layer is separated from an object with TopContact layer. + TopInterface, + // Top contact layer directly supporting an overhang. To be printed with a support interface material. + TopContact, + // Some undecided type yet. It will turn into Base first, then it may turn into BottomInterface or TopInterface. + Intermediate, +}; + +// A support layer type used internally by the SupportMaterial class. This class carries a much more detailed +// information about the support layer than the layers stored in the PrintObject, mainly +// the SupportGeneratorLayer is aware of the bridging flow and the interface gaps between the object and the support. +class SupportGeneratorLayer +{ +public: + void reset() { + *this = SupportGeneratorLayer(); + } + + bool operator==(const SupportGeneratorLayer &layer2) const { + return print_z == layer2.print_z && height == layer2.height && bridging == layer2.bridging; + } + + // Order the layers by lexicographically by an increasing print_z and a decreasing layer height. + bool operator<(const SupportGeneratorLayer &layer2) const { + if (print_z < layer2.print_z) { + return true; + } else if (print_z == layer2.print_z) { + if (height > layer2.height) + return true; + else if (height == layer2.height) { + // Bridging layers first. + return bridging && ! layer2.bridging; + } else + return false; + } else + return false; + } + + void merge(SupportGeneratorLayer &&rhs) { + // The union_() does not support move semantic yet, but maybe one day it will. + this->polygons = union_(this->polygons, std::move(rhs.polygons)); + auto merge = [](std::unique_ptr &dst, std::unique_ptr &src) { + if (! dst || dst->empty()) + dst = std::move(src); + else if (src && ! src->empty()) + *dst = union_(*dst, std::move(*src)); + }; + merge(this->contact_polygons, rhs.contact_polygons); + merge(this->overhang_polygons, rhs.overhang_polygons); + merge(this->enforcer_polygons, rhs.enforcer_polygons); + rhs.reset(); + } + + // For the bridging flow, bottom_print_z will be above bottom_z to account for the vertical separation. + // For the non-bridging flow, bottom_print_z will be equal to bottom_z. + coordf_t bottom_print_z() const { return print_z - height; } + + // To sort the extremes of top / bottom interface layers. + coordf_t extreme_z() const { return (this->layer_type == SupporLayerType::TopContact) ? this->bottom_z : this->print_z; } + + SupporLayerType layer_type { SupporLayerType::Unknown }; + // Z used for printing, in unscaled coordinates. + coordf_t print_z { 0 }; + // Bottom Z of this layer. For soluble layers, bottom_z + height = print_z, + // otherwise bottom_z + gap + height = print_z. + coordf_t bottom_z { 0 }; + // Layer height in unscaled coordinates. + coordf_t height { 0 }; + // Index of a PrintObject layer_id supported by this layer. This will be set for top contact layers. + // If this is not a contact layer, it will be set to size_t(-1). + size_t idx_object_layer_above { size_t(-1) }; + // Index of a PrintObject layer_id, which supports this layer. This will be set for bottom contact layers. + // If this is not a contact layer, it will be set to size_t(-1). + size_t idx_object_layer_below { size_t(-1) }; + // Use a bridging flow when printing this support layer. + bool bridging { false }; + + // Polygons to be filled by the support pattern. + Polygons polygons; + // Currently for the contact layers only. + std::unique_ptr contact_polygons; + std::unique_ptr overhang_polygons; + // Enforcers need to be propagated independently in case the "support on build plate only" option is enabled. + std::unique_ptr enforcer_polygons; +}; + +// Layers are allocated and owned by a deque. Once a layer is allocated, it is maintained +// up to the end of a generate() method. The layer storage may be replaced by an allocator class in the future, +// which would allocate layers by multiple chunks. +using SupportGeneratorLayerStorage = std::deque; +using SupportGeneratorLayersPtr = std::vector; + +struct SupportParameters { + SupportParameters(const PrintObject &object); + + // Flow at the 1st print layer. + Flow first_layer_flow; + // Flow at the support base (neither top, nor bottom interface). + // Also flow at the raft base with the exception of raft interface and contact layers. + Flow support_material_flow; + // Flow at the top interface and contact layers. + Flow support_material_interface_flow; + // Flow at the bottom interfaces and contacts. + Flow support_material_bottom_interface_flow; + // Flow at raft inteface & contact layers. + Flow raft_interface_flow; + // Is merging of regions allowed? Could the interface & base support regions be printed with the same extruder? + bool can_merge_support_regions; + + coordf_t support_layer_height_min; +// coordf_t support_layer_height_max; + + coordf_t gap_xy; + + float base_angle; + float interface_angle; + + // Density of the top / bottom interface and contact layers. + coordf_t interface_density; + // Density of the raft interface and contact layers. + coordf_t raft_interface_density; + // Density of the base support layers. + coordf_t support_density; + + // Pattern of the sparse infill including sparse raft layers. + InfillPattern base_fill_pattern; + // Pattern of the top / bottom interface and contact layers. + InfillPattern interface_fill_pattern; + // Pattern of the raft interface and contact layers. + InfillPattern raft_interface_fill_pattern; + // Pattern of the contact layers. + InfillPattern contact_fill_pattern; + // Shall the sparse (base) layers be printed with a single perimeter line (sheath) for robustness? + bool with_sheath; + + float raft_angle_1st_layer; + float raft_angle_base; + float raft_angle_interface; + + // Produce a raft interface angle for a given SupportLayer::interface_id() + float raft_interface_angle(size_t interface_id) const + { return this->raft_angle_interface + ((interface_id & 1) ? float(- M_PI / 4.) : float(+ M_PI / 4.)); } +}; + +// Remove bridges from support contact areas. +// To be called if PrintObjectConfig::dont_support_bridges. +void remove_bridges_from_contacts( + const PrintConfig &print_config, + const Layer &lower_layer, + const LayerRegion &layerm, + float fw, + Polygons &contact_polygons); + +// Generate raft layers, also expand the 1st support layer +// in case there is no raft layer to improve support adhesion. +SupportGeneratorLayersPtr generate_raft_base( + const PrintObject &object, + const SupportParameters &support_params, + const SlicingParameters &slicing_params, + const SupportGeneratorLayersPtr &top_contacts, + const SupportGeneratorLayersPtr &interface_layers, + const SupportGeneratorLayersPtr &base_interface_layers, + const SupportGeneratorLayersPtr &base_layers, + SupportGeneratorLayerStorage &layer_storage); + +// returns sorted layers +SupportGeneratorLayersPtr generate_support_layers( + PrintObject &object, + const SupportGeneratorLayersPtr &raft_layers, + const SupportGeneratorLayersPtr &bottom_contacts, + const SupportGeneratorLayersPtr &top_contacts, + const SupportGeneratorLayersPtr &intermediate_layers, + const SupportGeneratorLayersPtr &interface_layers, + const SupportGeneratorLayersPtr &base_interface_layers); + +// Produce the support G-code. +// Used by both classic and tree supports. +void generate_support_toolpaths( + SupportLayerPtrs &support_layers, + const PrintObjectConfig &config, + const SupportParameters &support_params, + const SlicingParameters &slicing_params, + const SupportGeneratorLayersPtr &raft_layers, + const SupportGeneratorLayersPtr &bottom_contacts, + const SupportGeneratorLayersPtr &top_contacts, + const SupportGeneratorLayersPtr &intermediate_layers, + const SupportGeneratorLayersPtr &interface_layers, + const SupportGeneratorLayersPtr &base_interface_layers); + +void export_print_z_polygons_to_svg(const char *path, SupportGeneratorLayer ** const layers, size_t n_layers); +void export_print_z_polygons_and_extrusions_to_svg(const char *path, SupportGeneratorLayer ** const layers, size_t n_layers, SupportLayer& support_layer); + // This class manages raft and supports for a single PrintObject. // Instantiated by Slic3r::Print::Object->_support_material() // This class is instantiated before the slicing starts as Object.pm will query // the parameters of the raft to determine the 1st layer height and thickness. class PrintObjectSupportMaterial { -public: - // Support layer type to be used by MyLayer. This type carries a much more detailed information - // about the support layer type than the final support layers stored in a PrintObject. - enum SupporLayerType { - sltUnknown = 0, - // Ratft base layer, to be printed with the support material. - sltRaftBase, - // Raft interface layer, to be printed with the support interface material. - sltRaftInterface, - // Bottom contact layer placed over a top surface of an object. To be printed with a support interface material. - sltBottomContact, - // Dense interface layer, to be printed with the support interface material. - // This layer is separated from an object by an sltBottomContact layer. - sltBottomInterface, - // Sparse base support layer, to be printed with a support material. - sltBase, - // Dense interface layer, to be printed with the support interface material. - // This layer is separated from an object with sltTopContact layer. - sltTopInterface, - // Top contact layer directly supporting an overhang. To be printed with a support interface material. - sltTopContact, - // Some undecided type yet. It will turn into sltBase first, then it may turn into sltBottomInterface or sltTopInterface. - sltIntermediate, - }; - - // A support layer type used internally by the SupportMaterial class. This class carries a much more detailed - // information about the support layer than the layers stored in the PrintObject, mainly - // the MyLayer is aware of the bridging flow and the interface gaps between the object and the support. - class MyLayer - { - public: - void reset() { - *this = MyLayer(); - } - - bool operator==(const MyLayer &layer2) const { - return print_z == layer2.print_z && height == layer2.height && bridging == layer2.bridging; - } - - // Order the layers by lexicographically by an increasing print_z and a decreasing layer height. - bool operator<(const MyLayer &layer2) const { - if (print_z < layer2.print_z) { - return true; - } else if (print_z == layer2.print_z) { - if (height > layer2.height) - return true; - else if (height == layer2.height) { - // Bridging layers first. - return bridging && ! layer2.bridging; - } else - return false; - } else - return false; - } - - void merge(MyLayer &&rhs) { - // The union_() does not support move semantic yet, but maybe one day it will. - this->polygons = union_(this->polygons, std::move(rhs.polygons)); - auto merge = [](std::unique_ptr &dst, std::unique_ptr &src) { - if (! dst || dst->empty()) - dst = std::move(src); - else if (src && ! src->empty()) - *dst = union_(*dst, std::move(*src)); - }; - merge(this->contact_polygons, rhs.contact_polygons); - merge(this->overhang_polygons, rhs.overhang_polygons); - merge(this->enforcer_polygons, rhs.enforcer_polygons); - rhs.reset(); - } - - // For the bridging flow, bottom_print_z will be above bottom_z to account for the vertical separation. - // For the non-bridging flow, bottom_print_z will be equal to bottom_z. - coordf_t bottom_print_z() const { return print_z - height; } - - // To sort the extremes of top / bottom interface layers. - coordf_t extreme_z() const { return (this->layer_type == sltTopContact) ? this->bottom_z : this->print_z; } - - SupporLayerType layer_type { sltUnknown }; - // Z used for printing, in unscaled coordinates. - coordf_t print_z { 0 }; - // Bottom Z of this layer. For soluble layers, bottom_z + height = print_z, - // otherwise bottom_z + gap + height = print_z. - coordf_t bottom_z { 0 }; - // Layer height in unscaled coordinates. - coordf_t height { 0 }; - // Index of a PrintObject layer_id supported by this layer. This will be set for top contact layers. - // If this is not a contact layer, it will be set to size_t(-1). - size_t idx_object_layer_above { size_t(-1) }; - // Index of a PrintObject layer_id, which supports this layer. This will be set for bottom contact layers. - // If this is not a contact layer, it will be set to size_t(-1). - size_t idx_object_layer_below { size_t(-1) }; - // Use a bridging flow when printing this support layer. - bool bridging { false }; - - // Polygons to be filled by the support pattern. - Polygons polygons; - // Currently for the contact layers only. - std::unique_ptr contact_polygons; - std::unique_ptr overhang_polygons; - // Enforcers need to be propagated independently in case the "support on build plate only" option is enabled. - std::unique_ptr enforcer_polygons; - }; - - struct SupportParams { - Flow first_layer_flow; - Flow support_material_flow; - Flow support_material_interface_flow; - Flow support_material_bottom_interface_flow; - // Is merging of regions allowed? Could the interface & base support regions be printed with the same extruder? - bool can_merge_support_regions; - - coordf_t support_layer_height_min; - // coordf_t support_layer_height_max; - - coordf_t gap_xy; - - float base_angle; - float interface_angle; - coordf_t interface_spacing; - coordf_t interface_density; - coordf_t support_spacing; - coordf_t support_density; - - InfillPattern base_fill_pattern; - InfillPattern interface_fill_pattern; - InfillPattern contact_fill_pattern; - bool with_sheath; - }; - - // Layers are allocated and owned by a deque. Once a layer is allocated, it is maintained - // up to the end of a generate() method. The layer storage may be replaced by an allocator class in the future, - // which would allocate layers by multiple chunks. - typedef std::deque MyLayerStorage; - typedef std::vector MyLayersPtr; - public: PrintObjectSupportMaterial(const PrintObject *object, const SlicingParameters &slicing_params); @@ -175,58 +248,48 @@ class PrintObjectSupportMaterial // Generate top contact layers supporting overhangs. // For a soluble interface material synchronize the layer heights with the object, otherwise leave the layer height undefined. // If supports over bed surface only are requested, don't generate contact layers over an object. - MyLayersPtr top_contact_layers(const PrintObject &object, const std::vector &buildplate_covered, MyLayerStorage &layer_storage) const; + SupportGeneratorLayersPtr top_contact_layers(const PrintObject &object, const std::vector &buildplate_covered, SupportGeneratorLayerStorage &layer_storage) const; // Generate bottom contact layers supporting the top contact layers. // For a soluble interface material synchronize the layer heights with the object, // otherwise set the layer height to a bridging flow of a support interface nozzle. - MyLayersPtr bottom_contact_layers_and_layer_support_areas( - const PrintObject &object, const MyLayersPtr &top_contacts, std::vector &buildplate_covered, - MyLayerStorage &layer_storage, std::vector &layer_support_areas) const; + SupportGeneratorLayersPtr bottom_contact_layers_and_layer_support_areas( + const PrintObject &object, const SupportGeneratorLayersPtr &top_contacts, std::vector &buildplate_covered, + SupportGeneratorLayerStorage &layer_storage, std::vector &layer_support_areas) const; // Trim the top_contacts layers with the bottom_contacts layers if they overlap, so there would not be enough vertical space for both of them. - void trim_top_contacts_by_bottom_contacts(const PrintObject &object, const MyLayersPtr &bottom_contacts, MyLayersPtr &top_contacts) const; + void trim_top_contacts_by_bottom_contacts(const PrintObject &object, const SupportGeneratorLayersPtr &bottom_contacts, SupportGeneratorLayersPtr &top_contacts) const; // Generate raft layers and the intermediate support layers between the bottom contact and top contact surfaces. - MyLayersPtr raft_and_intermediate_support_layers( + SupportGeneratorLayersPtr raft_and_intermediate_support_layers( const PrintObject &object, - const MyLayersPtr &bottom_contacts, - const MyLayersPtr &top_contacts, - MyLayerStorage &layer_storage) const; + const SupportGeneratorLayersPtr &bottom_contacts, + const SupportGeneratorLayersPtr &top_contacts, + SupportGeneratorLayerStorage &layer_storage) const; // Fill in the base layers with polygons. void generate_base_layers( const PrintObject &object, - const MyLayersPtr &bottom_contacts, - const MyLayersPtr &top_contacts, - MyLayersPtr &intermediate_layers, + const SupportGeneratorLayersPtr &bottom_contacts, + const SupportGeneratorLayersPtr &top_contacts, + SupportGeneratorLayersPtr &intermediate_layers, const std::vector &layer_support_areas) const; - // Generate raft layers, also expand the 1st support layer - // in case there is no raft layer to improve support adhesion. - MyLayersPtr generate_raft_base( - const PrintObject &object, - const MyLayersPtr &top_contacts, - const MyLayersPtr &interface_layers, - const MyLayersPtr &base_interface_layers, - const MyLayersPtr &base_layers, - MyLayerStorage &layer_storage) const; - // Turn some of the base layers into base interface layers. // For soluble interfaces with non-soluble bases, print maximum two first interface layers with the base // extruder to improve adhesion of the soluble filament to the base. - std::pair generate_interface_layers( - const MyLayersPtr &bottom_contacts, - const MyLayersPtr &top_contacts, - MyLayersPtr &intermediate_layers, - MyLayerStorage &layer_storage) const; + std::pair generate_interface_layers( + const SupportGeneratorLayersPtr &bottom_contacts, + const SupportGeneratorLayersPtr &top_contacts, + SupportGeneratorLayersPtr &intermediate_layers, + SupportGeneratorLayerStorage &layer_storage) const; // Trim support layers by an object to leave a defined gap between // the support volume and the object. void trim_support_layers_by_object( const PrintObject &object, - MyLayersPtr &support_layers, + SupportGeneratorLayersPtr &support_layers, const coordf_t gap_extra_above, const coordf_t gap_extra_below, const coordf_t gap_xy) const; @@ -236,25 +299,14 @@ class PrintObjectSupportMaterial void clip_with_shape(); */ - // Produce the actual G-code. - void generate_toolpaths( - SupportLayerPtrs &support_layers, - const MyLayersPtr &raft_layers, - const MyLayersPtr &bottom_contacts, - const MyLayersPtr &top_contacts, - const MyLayersPtr &intermediate_layers, - const MyLayersPtr &interface_layers, - const MyLayersPtr &base_interface_layers) const; - // Following objects are not owned by SupportMaterial class. - const PrintObject *m_object; const PrintConfig *m_print_config; const PrintObjectConfig *m_object_config; // Pre-calculated parameters shared between the object slicer and the support generator, // carrying information on a raft, 1st layer height, 1st object layer height, gap between the raft and object etc. SlicingParameters m_slicing_params; // Various precomputed support parameters to be shared with external functions. - SupportParams m_support_params; + SupportParameters m_support_params; }; } // namespace Slic3r diff --git a/src/libslic3r/SupportSpotsGenerator.cpp b/src/libslic3r/SupportSpotsGenerator.cpp new file mode 100644 index 00000000000..5062fe18abf --- /dev/null +++ b/src/libslic3r/SupportSpotsGenerator.cpp @@ -0,0 +1,1268 @@ +#include "SupportSpotsGenerator.hpp" + +#include "BoundingBox.hpp" +#include "ExPolygon.hpp" +#include "ExtrusionEntity.hpp" +#include "ExtrusionEntityCollection.hpp" +#include "GCode/ExtrusionProcessor.hpp" +#include "Line.hpp" +#include "Point.hpp" +#include "Polygon.hpp" +#include "PrincipalComponents2D.hpp" +#include "Print.hpp" +#include "PrintBase.hpp" +#include "PrintConfig.hpp" +#include "Tesselate.hpp" +#include "libslic3r.h" +#include "tbb/parallel_for.h" +#include "tbb/blocked_range.h" +#include "tbb/blocked_range2d.h" +#include "tbb/parallel_reduce.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "AABBTreeLines.hpp" +#include "KDTreeIndirect.hpp" +#include "libslic3r/Layer.hpp" +#include "libslic3r/ClipperUtils.hpp" +#include "Geometry/ConvexHull.hpp" + +// #define DETAILED_DEBUG_LOGS +// #define DEBUG_FILES + +#ifdef DEBUG_FILES +#include +#include "libslic3r/Color.hpp" +#endif + +namespace Slic3r { + +class ExtrusionLine +{ +public: + ExtrusionLine() : a(Vec2f::Zero()), b(Vec2f::Zero()), len(0.0), origin_entity(nullptr) {} + ExtrusionLine(const Vec2f &a, const Vec2f &b, float len, const ExtrusionEntity *origin_entity) + : a(a), b(b), len(len), origin_entity(origin_entity) + {} + + ExtrusionLine(const Vec2f &a, const Vec2f &b) + : a(a), b(b), len((a-b).norm()), origin_entity(nullptr) + {} + + bool is_external_perimeter() const + { + assert(origin_entity != nullptr); + return origin_entity->role().is_external_perimeter(); + } + + Vec2f a; + Vec2f b; + float len; + const ExtrusionEntity *origin_entity; + + std::optional support_point_generated = {}; + float form_quality = 1.0f; + float curled_up_height = 0.0f; + + static const constexpr int Dim = 2; + using Scalar = Vec2f::Scalar; +}; + +auto get_a(ExtrusionLine &&l) { return l.a; } +auto get_b(ExtrusionLine &&l) { return l.b; } + +namespace SupportSpotsGenerator { + +using LD = AABBTreeLines::LinesDistancer; + +struct SupportGridFilter +{ +private: + Vec3f cell_size; + Vec3f origin; + Vec3f size; + Vec3i cell_count; + + std::unordered_set taken_cells{}; + +public: + SupportGridFilter(const PrintObject *po, float voxel_size) + { + cell_size = Vec3f(voxel_size, voxel_size, voxel_size); + + Vec2crd size_half = po->size().head<2>().cwiseQuotient(Vec2crd(2, 2)) + Vec2crd::Ones(); + Vec3f min = unscale(Vec3crd(-size_half.x(), -size_half.y(), 0)).cast() - cell_size; + Vec3f max = unscale(Vec3crd(size_half.x(), size_half.y(), po->height())).cast() + cell_size; + + origin = min; + size = max - min; + cell_count = size.cwiseQuotient(cell_size).cast() + Vec3i::Ones(); + } + + Vec3i to_cell_coords(const Vec3f &position) const + { + Vec3i cell_coords = (position - this->origin).cwiseQuotient(this->cell_size).cast(); + return cell_coords; + } + + size_t to_cell_index(const Vec3i &cell_coords) const + { +#ifdef DETAILED_DEBUG_LOGS + assert(cell_coords.x() >= 0); + assert(cell_coords.x() < cell_count.x()); + assert(cell_coords.y() >= 0); + assert(cell_coords.y() < cell_count.y()); + assert(cell_coords.z() >= 0); + assert(cell_coords.z() < cell_count.z()); +#endif + return cell_coords.z() * cell_count.x() * cell_count.y() + cell_coords.y() * cell_count.x() + cell_coords.x(); + } + + Vec3f get_cell_center(const Vec3i &cell_coords) const + { + return origin + cell_coords.cast().cwiseProduct(this->cell_size) + this->cell_size.cwiseQuotient(Vec3f(2.0f, 2.0f, 2.0f)); + } + + void take_position(const Vec3f &position) { taken_cells.insert(to_cell_index(to_cell_coords(position))); } + + bool position_taken(const Vec3f &position) const + { + return taken_cells.find(to_cell_index(to_cell_coords(position))) != taken_cells.end(); + } +}; + +struct SliceConnection +{ + float area{}; + Vec3f centroid_accumulator = Vec3f::Zero(); + Vec2f second_moment_of_area_accumulator = Vec2f::Zero(); + float second_moment_of_area_covariance_accumulator{}; + + void add(const SliceConnection &other) + { + this->area += other.area; + this->centroid_accumulator += other.centroid_accumulator; + this->second_moment_of_area_accumulator += other.second_moment_of_area_accumulator; + this->second_moment_of_area_covariance_accumulator += other.second_moment_of_area_covariance_accumulator; + } + + void print_info(const std::string &tag) + { + Vec3f centroid = centroid_accumulator / area; + Vec2f variance = (second_moment_of_area_accumulator / area - centroid.head<2>().cwiseProduct(centroid.head<2>())); + float covariance = second_moment_of_area_covariance_accumulator / area - centroid.x() * centroid.y(); + std::cout << tag << std::endl; + std::cout << "area: " << area << std::endl; + std::cout << "centroid: " << centroid.x() << " " << centroid.y() << " " << centroid.z() << std::endl; + std::cout << "variance: " << variance.x() << " " << variance.y() << std::endl; + std::cout << "covariance: " << covariance << std::endl; + } +}; + +float get_flow_width(const LayerRegion *region, ExtrusionRole role) +{ + if (role == ExtrusionRole::BridgeInfill) return region->flow(FlowRole::frExternalPerimeter).width(); + if (role == ExtrusionRole::ExternalPerimeter) return region->flow(FlowRole::frExternalPerimeter).width(); + if (role == ExtrusionRole::GapFill) return region->flow(FlowRole::frInfill).width(); + if (role == ExtrusionRole::Perimeter) return region->flow(FlowRole::frPerimeter).width(); + if (role == ExtrusionRole::SolidInfill) return region->flow(FlowRole::frSolidInfill).width(); + if (role == ExtrusionRole::InternalInfill) return region->flow(FlowRole::frInfill).width(); + if (role == ExtrusionRole::TopSolidInfill) return region->flow(FlowRole::frTopSolidInfill).width(); + // default + return region->flow(FlowRole::frPerimeter).width(); +} + +std::vector to_short_lines(const ExtrusionEntity *e, float length_limit) +{ + assert(!e->is_collection()); + Polyline pl = e->as_polyline(); + std::vector lines; + lines.reserve(pl.points.size() * 1.5f); + for (int point_idx = 0; point_idx < int(pl.points.size()) - 1; ++point_idx) { + Vec2f start = unscaled(pl.points[point_idx]).cast(); + Vec2f next = unscaled(pl.points[point_idx + 1]).cast(); + Vec2f v = next - start; // vector from next to current + float dist_to_next = v.norm(); + v.normalize(); + int lines_count = int(std::ceil(dist_to_next / length_limit)); + float step_size = dist_to_next / lines_count; + for (int i = 0; i < lines_count; ++i) { + Vec2f a(start + v * (i * step_size)); + Vec2f b(start + v * ((i + 1) * step_size)); + lines.emplace_back(a, b, (a-b).norm(), e); + } + } + return lines; +} + +float estimate_curled_up_height( + const ExtendedPoint &point, float layer_height, float flow_width, float prev_line_curled_height, Params params) +{ + float curled_up_height = 0.0f; + if (fabs(point.distance) < 1.5 * flow_width) { + curled_up_height = 0.85 * prev_line_curled_height; + } + if (point.distance > params.malformation_distance_factors.first * flow_width && + point.distance < params.malformation_distance_factors.second * flow_width && point.curvature > -0.1f) { + float dist_factor = std::max(point.distance - params.malformation_distance_factors.first * flow_width, 0.01f) / + ((params.malformation_distance_factors.second - params.malformation_distance_factors.first) * flow_width); + + curled_up_height = layer_height * sqrt(sqrt(dist_factor)) * std::clamp(3.0f * point.curvature, 1.0f, 3.0f); + curled_up_height = std::min(curled_up_height, params.max_curled_height_factor * layer_height); + } + + return curled_up_height; +} + +std::vector check_extrusion_entity_stability(const ExtrusionEntity *entity, + const LayerRegion *layer_region, + const LD &prev_layer_lines, + const AABBTreeLines::LinesDistancer &prev_layer_boundary, + const Params ¶ms) +{ + if (entity->is_collection()) { + std::vector checked_lines_out; + checked_lines_out.reserve(prev_layer_lines.get_lines().size() / 3); + for (const auto *e : static_cast(entity)->entities) { + auto tmp = check_extrusion_entity_stability(e, layer_region, prev_layer_lines, prev_layer_boundary, params); + checked_lines_out.insert(checked_lines_out.end(), tmp.begin(), tmp.end()); + } + return checked_lines_out; + } else if (entity->role().is_bridge() && !entity->role().is_perimeter()) { + // pure bridges are handled separately, beacuse we need to align the forward and backward direction support points + if (entity->length() < scale_(params.min_distance_to_allow_local_supports)) { + return {}; + } + const float flow_width = get_flow_width(layer_region, entity->role()); + std::vector annotated_points = estimate_points_properties(entity->as_polyline().points, + prev_layer_boundary, flow_width, + params.bridge_distance); + + std::vector lines_out; + lines_out.reserve(annotated_points.size()); + float bridged_distance = 0.0f; + + std::optional bridging_dir{}; + + for (size_t i = 0; i < annotated_points.size(); ++i) { + ExtendedPoint &curr_point = annotated_points[i]; + const ExtendedPoint &prev_point = i > 0 ? annotated_points[i - 1] : annotated_points[i]; + + SupportPointCause potential_cause = std::abs(curr_point.curvature) > 0.1 ? SupportPointCause::FloatingBridgeAnchor : + SupportPointCause::LongBridge; + float line_len = (prev_point.position - curr_point.position).norm(); + Vec2d line_dir = line_len > EPSILON ? Vec2d((curr_point.position - prev_point.position) / double(line_len)) : Vec2d::Zero(); + + ExtrusionLine line_out{prev_point.position.cast(), curr_point.position.cast(), line_len, entity}; + + float max_bridge_len = std::max(params.support_points_interface_radius * 2.0f, + params.bridge_distance / + ((1.0f + std::abs(curr_point.curvature)) * (1.0f + std::abs(curr_point.curvature)) * + (1.0f + std::abs(curr_point.curvature)))); + + if (!bridging_dir.has_value() && curr_point.distance > flow_width && line_len > params.bridge_distance * 0.6) { + bridging_dir = line_dir; + } + + if (curr_point.distance > flow_width && potential_cause == SupportPointCause::LongBridge && bridging_dir.has_value() && + bridging_dir->dot(line_dir) < 0.8) { // skip backward direction of bridge - supported by forward points enough + bridged_distance += line_len; + } else if (curr_point.distance > flow_width) { + bridged_distance += line_len; + if (bridged_distance > max_bridge_len) { + bridged_distance = 0.0f; + line_out.support_point_generated = potential_cause; + } + } else { + bridged_distance = 0.0f; + } + + lines_out.push_back(line_out); + } + return lines_out; + + } else { // single extrusion path, with possible varying parameters + if (entity->length() < scale_(params.min_distance_to_allow_local_supports)) { + return {}; + } + + const float flow_width = get_flow_width(layer_region, entity->role()); + // Compute only unsigned distance - prev_layer_lines can contain unconnected paths, thus the sign of the distance is unreliable + std::vector annotated_points = estimate_points_properties(entity->as_polyline().points, + prev_layer_lines, flow_width, + params.bridge_distance); + + std::vector lines_out; + lines_out.reserve(annotated_points.size()); + float bridged_distance = annotated_points.front().position != annotated_points.back().position ? (params.bridge_distance + 1.0f) : + 0.0f; + for (size_t i = 0; i < annotated_points.size(); ++i) { + ExtendedPoint &curr_point = annotated_points[i]; + const ExtendedPoint &prev_point = i > 0 ? annotated_points[i - 1] : annotated_points[i]; + float line_len = (prev_point.position - curr_point.position).norm(); + ExtrusionLine line_out{prev_point.position.cast(), curr_point.position.cast(), line_len, entity}; + + const ExtrusionLine nearest_prev_layer_line = prev_layer_lines.get_lines().size() > 0 ? + prev_layer_lines.get_line(curr_point.nearest_prev_layer_line) : + ExtrusionLine{}; + + // correctify the distance sign using slice polygons + float sign = (prev_layer_boundary.distance_from_lines(curr_point.position) + 0.5f * flow_width) < 0.0f ? -1.0f : 1.0f; + curr_point.distance *= sign; + + SupportPointCause potential_cause = SupportPointCause::FloatingExtrusion; + if (bridged_distance + line_len > params.bridge_distance * 0.8 && std::abs(curr_point.curvature) < 0.1) { + potential_cause = SupportPointCause::FloatingExtrusion; + } + + float max_bridge_len = std::max(params.support_points_interface_radius * 2.0f, + params.bridge_distance / + ((1.0f + std::abs(curr_point.curvature)) * (1.0f + std::abs(curr_point.curvature)) * + (1.0f + std::abs(curr_point.curvature)))); + + if (curr_point.distance > 1.2f * flow_width) { + line_out.form_quality = 0.8f; + bridged_distance += line_len; + if (bridged_distance > max_bridge_len) { + line_out.support_point_generated = potential_cause; + bridged_distance = 0.0f; + } + } else if (curr_point.distance > flow_width * 0.8f) { + bridged_distance += line_len; + line_out.form_quality = nearest_prev_layer_line.form_quality - 0.3f; + if (line_out.form_quality < 0 && bridged_distance > max_bridge_len) { + line_out.support_point_generated = potential_cause; + line_out.form_quality = 0.5f; + bridged_distance = 0.0f; + } + } else { + bridged_distance = 0.0f; + } + + line_out.curled_up_height = estimate_curled_up_height(curr_point, layer_region->layer()->height, flow_width, + nearest_prev_layer_line.curled_up_height, params); + + lines_out.push_back(line_out); + } + + return lines_out; + } +} + +SliceConnection estimate_slice_connection(size_t slice_idx, const Layer *layer) +{ + SliceConnection connection; + + const LayerSlice &slice = layer->lslices_ex[slice_idx]; + Polygons slice_polys = to_polygons(layer->lslices[slice_idx]); + BoundingBox slice_bb = get_extents(slice_polys); + const Layer *lower_layer = layer->lower_layer; + + ExPolygons below{}; + for (const auto &link : slice.overlaps_below) { below.push_back(lower_layer->lslices[link.slice_idx]); } + Polygons below_polys = to_polygons(below); + + BoundingBox below_bb = get_extents(below_polys); + + Polygons overlap = intersection(ClipperUtils::clip_clipper_polygons_with_subject_bbox(slice_polys, below_bb), + ClipperUtils::clip_clipper_polygons_with_subject_bbox(below_polys, slice_bb)); + + for (const Polygon &poly : overlap) { + Vec2f p0 = unscaled(poly.first_point()).cast(); + for (size_t i = 2; i < poly.points.size(); i++) { + Vec2f p1 = unscaled(poly.points[i - 1]).cast(); + Vec2f p2 = unscaled(poly.points[i]).cast(); + + float sign = cross2(p1 - p0, p2 - p1) > 0 ? 1.0f : -1.0f; + + auto [area, first_moment_of_area, second_moment_area, + second_moment_of_area_covariance] = compute_moments_of_area_of_triangle(p0, p1, p2); + connection.area += sign * area; + connection.centroid_accumulator += sign * Vec3f(first_moment_of_area.x(), first_moment_of_area.y(), layer->print_z * area); + connection.second_moment_of_area_accumulator += sign * second_moment_area; + connection.second_moment_of_area_covariance_accumulator += sign * second_moment_of_area_covariance; + } + } + + return connection; +}; + +class ObjectPart +{ +public: + float volume{}; + Vec3f volume_centroid_accumulator = Vec3f::Zero(); + float sticking_area{}; + Vec3f sticking_centroid_accumulator = Vec3f::Zero(); + Vec2f sticking_second_moment_of_area_accumulator = Vec2f::Zero(); + float sticking_second_moment_of_area_covariance_accumulator{}; + bool connected_to_bed = false; + + ObjectPart() = default; + + void add(const ObjectPart &other) + { + this->connected_to_bed = this->connected_to_bed || other.connected_to_bed; + this->volume_centroid_accumulator += other.volume_centroid_accumulator; + this->volume += other.volume; + this->sticking_area += other.sticking_area; + this->sticking_centroid_accumulator += other.sticking_centroid_accumulator; + this->sticking_second_moment_of_area_accumulator += other.sticking_second_moment_of_area_accumulator; + this->sticking_second_moment_of_area_covariance_accumulator += other.sticking_second_moment_of_area_covariance_accumulator; + } + + void add_support_point(const Vec3f &position, float sticking_area) + { + this->sticking_area += sticking_area; + this->sticking_centroid_accumulator += sticking_area * position; + this->sticking_second_moment_of_area_accumulator += sticking_area * position.head<2>().cwiseProduct(position.head<2>()); + this->sticking_second_moment_of_area_covariance_accumulator += sticking_area * position.x() * position.y(); + } + + float compute_directional_xy_variance(const Vec2f &line_dir, + const Vec3f ¢roid_accumulator, + const Vec2f &second_moment_of_area_accumulator, + const float &second_moment_of_area_covariance_accumulator, + const float &area) const + { + assert(area > 0); + Vec3f centroid = centroid_accumulator / area; + Vec2f variance = (second_moment_of_area_accumulator / area - centroid.head<2>().cwiseProduct(centroid.head<2>())); + float covariance = second_moment_of_area_covariance_accumulator / area - centroid.x() * centroid.y(); + // Var(aX+bY)=a^2*Var(X)+b^2*Var(Y)+2*a*b*Cov(X,Y) + float directional_xy_variance = line_dir.x() * line_dir.x() * variance.x() + line_dir.y() * line_dir.y() * variance.y() + + 2.0f * line_dir.x() * line_dir.y() * covariance; +#ifdef DETAILED_DEBUG_LOGS + BOOST_LOG_TRIVIAL(debug) << "centroid: " << centroid.x() << " " << centroid.y() << " " << centroid.z(); + BOOST_LOG_TRIVIAL(debug) << "variance: " << variance.x() << " " << variance.y(); + BOOST_LOG_TRIVIAL(debug) << "covariance: " << covariance; + BOOST_LOG_TRIVIAL(debug) << "directional_xy_variance: " << directional_xy_variance; +#endif + return directional_xy_variance; + } + + float compute_elastic_section_modulus(const Vec2f &line_dir, + const Vec3f &extreme_point, + const Vec3f ¢roid_accumulator, + const Vec2f &second_moment_of_area_accumulator, + const float &second_moment_of_area_covariance_accumulator, + const float &area) const + { + float directional_xy_variance = compute_directional_xy_variance(line_dir, centroid_accumulator, second_moment_of_area_accumulator, + second_moment_of_area_covariance_accumulator, area); + if (directional_xy_variance < EPSILON) { return 0.0f; } + Vec3f centroid = centroid_accumulator / area; + float extreme_fiber_dist = line_alg::distance_to(Linef(centroid.head<2>().cast(), + (centroid.head<2>() + Vec2f(line_dir.y(), -line_dir.x())).cast()), + extreme_point.head<2>().cast()); + float elastic_section_modulus = area * directional_xy_variance / extreme_fiber_dist; + +#ifdef DETAILED_DEBUG_LOGS + BOOST_LOG_TRIVIAL(debug) << "extreme_fiber_dist: " << extreme_fiber_dist; + BOOST_LOG_TRIVIAL(debug) << "elastic_section_modulus: " << elastic_section_modulus; +#endif + + return elastic_section_modulus; + } + + std::tuple is_stable_while_extruding(const SliceConnection &connection, + const ExtrusionLine &extruded_line, + const Vec3f &extreme_point, + float layer_z, + const Params ¶ms) const + { + Vec2f line_dir = (extruded_line.b - extruded_line.a).normalized(); + const Vec3f &mass_centroid = this->volume_centroid_accumulator / this->volume; + float mass = this->volume * params.filament_density; + float weight = mass * params.gravity_constant; + + float movement_force = params.max_acceleration * mass; + + float extruder_conflict_force = params.standard_extruder_conflict_force + + std::min(extruded_line.curled_up_height, 1.0f) * params.malformations_additive_conflict_extruder_force; + + // section for bed calculations + { + if (this->sticking_area < EPSILON) return {1.0f, SupportPointCause::UnstableFloatingPart}; + + Vec3f bed_centroid = this->sticking_centroid_accumulator / this->sticking_area; + float bed_yield_torque = -compute_elastic_section_modulus(line_dir, extreme_point, this->sticking_centroid_accumulator, + this->sticking_second_moment_of_area_accumulator, + this->sticking_second_moment_of_area_covariance_accumulator, + this->sticking_area) * + params.get_bed_adhesion_yield_strength(); + + Vec2f bed_weight_arm = (mass_centroid.head<2>() - bed_centroid.head<2>()); + float bed_weight_arm_len = bed_weight_arm.norm(); + float bed_weight_dir_xy_variance = compute_directional_xy_variance(bed_weight_arm, this->sticking_centroid_accumulator, + this->sticking_second_moment_of_area_accumulator, + this->sticking_second_moment_of_area_covariance_accumulator, + this->sticking_area); + float bed_weight_sign = bed_weight_arm_len < 2.0f * sqrt(bed_weight_dir_xy_variance) ? -1.0f : 1.0f; + float bed_weight_torque = bed_weight_sign * bed_weight_arm_len * weight; + + float bed_movement_arm = std::max(0.0f, mass_centroid.z() - bed_centroid.z()); + float bed_movement_torque = movement_force * bed_movement_arm; + + float bed_conflict_torque_arm = layer_z - bed_centroid.z(); + float bed_extruder_conflict_torque = extruder_conflict_force * bed_conflict_torque_arm; + + float bed_total_torque = bed_movement_torque + bed_extruder_conflict_torque + bed_weight_torque + bed_yield_torque; + +#ifdef DETAILED_DEBUG_LOGS + BOOST_LOG_TRIVIAL(debug) << "bed_centroid: " << bed_centroid.x() << " " << bed_centroid.y() << " " << bed_centroid.z(); + BOOST_LOG_TRIVIAL(debug) << "SSG: bed_yield_torque: " << bed_yield_torque; + BOOST_LOG_TRIVIAL(debug) << "SSG: bed_weight_arm: " << bed_weight_arm_len; + BOOST_LOG_TRIVIAL(debug) << "SSG: bed_weight_torque: " << bed_weight_torque; + BOOST_LOG_TRIVIAL(debug) << "SSG: bed_movement_arm: " << bed_movement_arm; + BOOST_LOG_TRIVIAL(debug) << "SSG: bed_movement_torque: " << bed_movement_torque; + BOOST_LOG_TRIVIAL(debug) << "SSG: bed_conflict_torque_arm: " << bed_conflict_torque_arm; + BOOST_LOG_TRIVIAL(debug) << "SSG: extruded_line.curled_up_height: " << extruded_line.curled_up_height; + BOOST_LOG_TRIVIAL(debug) << "SSG: extruded_line.form_quality: " << extruded_line.form_quality; + BOOST_LOG_TRIVIAL(debug) << "SSG: extruder_conflict_force: " << extruder_conflict_force; + BOOST_LOG_TRIVIAL(debug) << "SSG: bed_extruder_conflict_torque: " << bed_extruder_conflict_torque; + BOOST_LOG_TRIVIAL(debug) << "SSG: total_torque: " << bed_total_torque << " layer_z: " << layer_z; +#endif + + if (bed_total_torque > 0) { + return {bed_total_torque / bed_conflict_torque_arm, + (this->connected_to_bed ? SupportPointCause::SeparationFromBed : SupportPointCause::UnstableFloatingPart)}; + } + } + + // section for weak connection calculations + { + if (connection.area < EPSILON) return {1.0f, SupportPointCause::UnstableFloatingPart}; + + Vec3f conn_centroid = connection.centroid_accumulator / connection.area; + + if (layer_z - conn_centroid.z() < 3.0f) { return {-1.0f, SupportPointCause::WeakObjectPart}; } + float conn_yield_torque = compute_elastic_section_modulus(line_dir, extreme_point, connection.centroid_accumulator, + connection.second_moment_of_area_accumulator, + connection.second_moment_of_area_covariance_accumulator, + connection.area) * + params.material_yield_strength; + + float conn_weight_arm = (conn_centroid.head<2>() - mass_centroid.head<2>()).norm(); + if (layer_z - conn_centroid.z() < 30.0) { + conn_weight_arm = 0.0f; // Given that we do not have very good info about the weight distribution between the connection and current layer, + // do not consider the weight until quite far away from the weak connection segment + } + float conn_weight_torque = conn_weight_arm * weight * (1.0f - conn_centroid.z() / layer_z) * (1.0f - conn_centroid.z() / layer_z); + + float conn_movement_arm = std::max(0.0f, mass_centroid.z() - conn_centroid.z()); + float conn_movement_torque = movement_force * conn_movement_arm; + + float conn_conflict_torque_arm = layer_z - conn_centroid.z(); + float conn_extruder_conflict_torque = extruder_conflict_force * conn_conflict_torque_arm; + + float conn_total_torque = conn_movement_torque + conn_extruder_conflict_torque + conn_weight_torque - conn_yield_torque; + +#ifdef DETAILED_DEBUG_LOGS + BOOST_LOG_TRIVIAL(debug) << "conn_centroid: " << conn_centroid.x() << " " << conn_centroid.y() << " " << conn_centroid.z(); + BOOST_LOG_TRIVIAL(debug) << "SSG: conn_yield_torque: " << conn_yield_torque; + BOOST_LOG_TRIVIAL(debug) << "SSG: conn_weight_arm: " << conn_weight_arm; + BOOST_LOG_TRIVIAL(debug) << "SSG: conn_weight_torque: " << conn_weight_torque; + BOOST_LOG_TRIVIAL(debug) << "SSG: conn_movement_arm: " << conn_movement_arm; + BOOST_LOG_TRIVIAL(debug) << "SSG: conn_movement_torque: " << conn_movement_torque; + BOOST_LOG_TRIVIAL(debug) << "SSG: conn_conflict_torque_arm: " << conn_conflict_torque_arm; + BOOST_LOG_TRIVIAL(debug) << "SSG: conn_extruder_conflict_torque: " << conn_extruder_conflict_torque; + BOOST_LOG_TRIVIAL(debug) << "SSG: total_torque: " << conn_total_torque << " layer_z: " << layer_z; +#endif + + return {conn_total_torque / conn_conflict_torque_arm, SupportPointCause::WeakObjectPart}; + } + } +}; + +// return new object part and actual area covered by extrusions +std::tuple build_object_part_from_slice(const size_t &slice_idx, const Layer *layer, const Params& params) +{ + ObjectPart new_object_part; + float area_covered_by_extrusions = 0; + const LayerSlice& slice = layer->lslices_ex.at(slice_idx); + + auto add_extrusions_to_object = [&new_object_part, &area_covered_by_extrusions, ¶ms](const ExtrusionEntity *e, + const LayerRegion *region) { + float flow_width = get_flow_width(region, e->role()); + const Layer *l = region->layer(); + float slice_z = l->slice_z; + float height = l->height; + std::vector lines = to_short_lines(e, 5.0); + for (const ExtrusionLine &line : lines) { + float volume = line.len * height * flow_width * PI / 4.0f; + area_covered_by_extrusions += line.len * flow_width; + new_object_part.volume += volume; + new_object_part.volume_centroid_accumulator += to_3d(Vec2f((line.a + line.b) / 2.0f), slice_z) * volume; + + if (l->id() == params.raft_layers_count) { // layer attached on bed/raft + new_object_part.connected_to_bed = true; + float sticking_area = line.len * flow_width; + new_object_part.sticking_area += sticking_area; + Vec2f middle = Vec2f((line.a + line.b) / 2.0f); + new_object_part.sticking_centroid_accumulator += sticking_area * to_3d(middle, slice_z); + // Bottom infill lines can be quite long, and algined, so the middle approximaton used above does not work + Vec2f dir = (line.b - line.a).normalized(); + float segment_length = flow_width; // segments of size flow_width + for (float segment_middle_dist = std::min(line.len, segment_length * 0.5f); segment_middle_dist < line.len; + segment_middle_dist += segment_length) { + Vec2f segment_middle = line.a + segment_middle_dist * dir; + new_object_part.sticking_second_moment_of_area_accumulator += segment_length * flow_width * + segment_middle.cwiseProduct(segment_middle); + new_object_part.sticking_second_moment_of_area_covariance_accumulator += segment_length * flow_width * + segment_middle.x() * segment_middle.y(); + } + } + } + }; + + for (const auto &island : slice.islands) { + const LayerRegion *perimeter_region = layer->get_region(island.perimeters.region()); + for (const auto &perimeter_idx : island.perimeters) { + for (const ExtrusionEntity *perimeter : + static_cast(perimeter_region->perimeters().entities[perimeter_idx])->entities) { + add_extrusions_to_object(perimeter, perimeter_region); + } + } + for (const LayerExtrusionRange &fill_range : island.fills) { + const LayerRegion *fill_region = layer->get_region(fill_range.region()); + for (const auto &fill_idx : fill_range) { + for (const ExtrusionEntity *fill : + static_cast(fill_region->fills().entities[fill_idx])->entities) { + add_extrusions_to_object(fill, fill_region); + } + } + } + for (const auto &thin_fill_idx : island.thin_fills) { + add_extrusions_to_object(perimeter_region->thin_fills().entities[thin_fill_idx], perimeter_region); + } + } + + // BRIM HANDLING + if (layer->id() == params.raft_layers_count && params.raft_layers_count == 0 && params.brim_type != BrimType::btNoBrim && + params.brim_width > 0.0) { + // TODO: The algorithm here should take into account that multiple slices may have coliding Brim areas and the final brim area is + // smaller, + // thus has lower adhesion. For now this effect will be neglected. + ExPolygon slice_poly = layer->lslices[slice_idx]; + ExPolygons brim; + if (params.brim_type == BrimType::btOuterAndInner || params.brim_type == BrimType::btOuterOnly) { + Polygon brim_hole = slice_poly.contour; + brim_hole.reverse(); + Polygons c = expand(slice_poly.contour, scale_(params.brim_width)); // For very small polygons, the expand may result in empty vector, even thought the input is correct. + if (!c.empty()) { + brim.push_back(ExPolygon{c.front(), brim_hole}); + } + } + if (params.brim_type == BrimType::btOuterAndInner || params.brim_type == BrimType::btInnerOnly) { + Polygons brim_contours = slice_poly.holes; + polygons_reverse(brim_contours); + for (const Polygon &brim_contour : brim_contours) { + Polygons brim_holes = shrink({brim_contour}, scale_(params.brim_width)); + polygons_reverse(brim_holes); + ExPolygon inner_brim{brim_contour}; + inner_brim.holes = brim_holes; + brim.push_back(inner_brim); + } + } + + for (const Polygon &poly : to_polygons(brim)) { + Vec2f p0 = unscaled(poly.first_point()).cast(); + for (size_t i = 2; i < poly.points.size(); i++) { + Vec2f p1 = unscaled(poly.points[i - 1]).cast(); + Vec2f p2 = unscaled(poly.points[i]).cast(); + + float sign = cross2(p1 - p0, p2 - p1) > 0 ? 1.0f : -1.0f; + + auto [area, first_moment_of_area, second_moment_area, + second_moment_of_area_covariance] = compute_moments_of_area_of_triangle(p0, p1, p2); + new_object_part.sticking_area += sign * area; + new_object_part.sticking_centroid_accumulator += sign * Vec3f(first_moment_of_area.x(), first_moment_of_area.y(), + layer->print_z * area); + new_object_part.sticking_second_moment_of_area_accumulator += sign * second_moment_area; + new_object_part.sticking_second_moment_of_area_covariance_accumulator += sign * second_moment_of_area_covariance; + } + } + } + + return {new_object_part, area_covered_by_extrusions}; +} + +class ActiveObjectParts +{ + size_t next_part_idx = 0; + std::unordered_map active_object_parts; + std::unordered_map active_object_parts_id_mapping; + +public: + size_t get_flat_id(size_t id) + { + size_t index = active_object_parts_id_mapping.at(id); + while (index != active_object_parts_id_mapping.at(index)) { index = active_object_parts_id_mapping.at(index); } + size_t i = id; + while (index != active_object_parts_id_mapping.at(i)) { + size_t next = active_object_parts_id_mapping[i]; + active_object_parts_id_mapping[i] = index; + i = next; + } + return index; + } + + ObjectPart &access(size_t id) { return this->active_object_parts.at(this->get_flat_id(id)); } + + size_t insert(const ObjectPart &new_part) + { + this->active_object_parts.emplace(next_part_idx, new_part); + this->active_object_parts_id_mapping.emplace(next_part_idx, next_part_idx); + return next_part_idx++; + } + + void merge(size_t from, size_t to) + { + size_t to_flat = this->get_flat_id(to); + size_t from_flat = this->get_flat_id(from); + active_object_parts.at(to_flat).add(active_object_parts.at(from_flat)); + active_object_parts.erase(from_flat); + active_object_parts_id_mapping[from] = to_flat; + } +}; + +std::tuple check_stability(const PrintObject *po, const PrintTryCancel &cancel_func, const Params ¶ms) +{ + SupportPoints supp_points{}; + SupportGridFilter supports_presence_grid(po, params.min_distance_between_support_points); + ActiveObjectParts active_object_parts{}; + PartialObjects partial_objects{}; + LD prev_layer_ext_perim_lines; + + std::unordered_map prev_slice_idx_to_object_part_mapping; + std::unordered_map next_slice_idx_to_object_part_mapping; + std::unordered_map prev_slice_idx_to_weakest_connection; + std::unordered_map next_slice_idx_to_weakest_connection; + + auto remember_partial_object = [&active_object_parts, &partial_objects](size_t object_part_id) { + auto object_part = active_object_parts.access(object_part_id); + if (object_part.volume > EPSILON) { + partial_objects.emplace_back(object_part.volume_centroid_accumulator / object_part.volume, object_part.volume, + object_part.connected_to_bed); + } + }; + + for (size_t layer_idx = 0; layer_idx < po->layer_count(); ++layer_idx) { + cancel_func(); + const Layer *layer = po->get_layer(layer_idx); + float bottom_z = layer->bottom_z(); + auto create_support_point_position = [bottom_z](const Vec2f &layer_pos) { return Vec3f{layer_pos.x(), layer_pos.y(), bottom_z}; }; + + for (size_t slice_idx = 0; slice_idx < layer->lslices_ex.size(); ++slice_idx) { + const LayerSlice &slice = layer->lslices_ex.at(slice_idx); + auto [new_part, covered_area] = build_object_part_from_slice(slice_idx, layer, params); + SliceConnection connection_to_below = estimate_slice_connection(slice_idx, layer); + +#ifdef DETAILED_DEBUG_LOGS + std::cout << "SLICE IDX: " << slice_idx << std::endl; + for (const auto &link : slice.overlaps_below) { + std::cout << "connected to slice below: " << link.slice_idx << " by area : " << link.area << std::endl; + } + connection_to_below.print_info("CONNECTION TO BELOW"); +#endif + + if (connection_to_below.area < EPSILON) { // new object part emerging + size_t part_id = active_object_parts.insert(new_part); + next_slice_idx_to_object_part_mapping.emplace(slice_idx, part_id); + next_slice_idx_to_weakest_connection.emplace(slice_idx, connection_to_below); + } else { + size_t final_part_id{}; + SliceConnection transfered_weakest_connection{}; + // MERGE parts + { + std::unordered_set parts_ids; + for (const auto &link : slice.overlaps_below) { + size_t part_id = active_object_parts.get_flat_id(prev_slice_idx_to_object_part_mapping.at(link.slice_idx)); + parts_ids.insert(part_id); + transfered_weakest_connection.add(prev_slice_idx_to_weakest_connection.at(link.slice_idx)); + } + + final_part_id = *parts_ids.begin(); + for (size_t part_id : parts_ids) { + if (final_part_id != part_id) { + remember_partial_object(part_id); + active_object_parts.merge(part_id, final_part_id); + } + } + } + auto estimate_conn_strength = [bottom_z](const SliceConnection &conn) { + if (conn.area < EPSILON) { // connection is empty, does not exists. Return max strength so that it is not picked as the + // weakest connection. + return INFINITY; + } + Vec3f centroid = conn.centroid_accumulator / conn.area; + Vec2f variance = (conn.second_moment_of_area_accumulator / conn.area - + centroid.head<2>().cwiseProduct(centroid.head<2>())); + float xy_variance = variance.x() + variance.y(); + float arm_len_estimate = std::max(1.0f, bottom_z - (conn.centroid_accumulator.z() / conn.area)); + return conn.area * sqrt(xy_variance) / arm_len_estimate; + }; + +#ifdef DETAILED_DEBUG_LOGS + connection_to_below.print_info("new_weakest_connection"); + transfered_weakest_connection.print_info("transfered_weakest_connection"); +#endif + + if (estimate_conn_strength(transfered_weakest_connection) > estimate_conn_strength(connection_to_below)) { + transfered_weakest_connection = connection_to_below; + } + next_slice_idx_to_weakest_connection.emplace(slice_idx, transfered_weakest_connection); + next_slice_idx_to_object_part_mapping.emplace(slice_idx, final_part_id); + ObjectPart &part = active_object_parts.access(final_part_id); + part.add(new_part); + } + } + + prev_slice_idx_to_object_part_mapping = next_slice_idx_to_object_part_mapping; + next_slice_idx_to_object_part_mapping.clear(); + prev_slice_idx_to_weakest_connection = next_slice_idx_to_weakest_connection; + next_slice_idx_to_weakest_connection.clear(); + + std::vector current_layer_ext_perims_lines{}; + current_layer_ext_perims_lines.reserve(prev_layer_ext_perim_lines.get_lines().size()); + // All object parts updated, and for each slice we have coresponding weakest connection. + // We can now check each slice and its corresponding weakest connection and object part for stability. + for (size_t slice_idx = 0; slice_idx < layer->lslices_ex.size(); ++slice_idx) { + const LayerSlice &slice = layer->lslices_ex.at(slice_idx); + ObjectPart &part = active_object_parts.access(prev_slice_idx_to_object_part_mapping[slice_idx]); + SliceConnection &weakest_conn = prev_slice_idx_to_weakest_connection[slice_idx]; + + std::vector boundary_lines; + for (const auto &link : slice.overlaps_below) { + auto ls = to_unscaled_linesf({layer->lower_layer->lslices[link.slice_idx]}); + boundary_lines.insert(boundary_lines.end(), ls.begin(), ls.end()); + } + AABBTreeLines::LinesDistancer prev_layer_boundary{std::move(boundary_lines)}; + + + std::vector current_slice_ext_perims_lines{}; + current_slice_ext_perims_lines.reserve(prev_layer_ext_perim_lines.get_lines().size() / layer->lslices_ex.size()); +#ifdef DETAILED_DEBUG_LOGS + weakest_conn.print_info("weakest connection info: "); +#endif + // Function that is used when new support point is generated. It will update the ObjectPart stability, weakest conneciton info, + // and the support presence grid and add the point to the issues. + auto reckon_new_support_point = [&part, &weakest_conn, &supp_points, &supports_presence_grid, ¶ms, + &layer_idx](SupportPointCause cause, const Vec3f &support_point, float force, + const Vec2f &dir) { + // if position is taken and point is for global stability (force > 0) or we are too close to the bed, do not add + // This allows local support points (e.g. bridging) to be generated densely + if ((supports_presence_grid.position_taken(support_point) && force > 0) || layer_idx <= 1) { + return; + } + + float area = params.support_points_interface_radius * params.support_points_interface_radius * float(PI); + // add the stability effect of the point only if the spot is not taken, so that the densely created local support points do + // not add unrealistic amount of stability to the object (due to overlaping of local support points) + if (!(supports_presence_grid.position_taken(support_point))) { + part.add_support_point(support_point, area); + } + + float radius = params.support_points_interface_radius; + supp_points.emplace_back(cause, support_point, force, radius, dir); + supports_presence_grid.take_position(support_point); + + // The support point also increases the stability of the weakest connection of the object, which should be reflected + if (weakest_conn.area > EPSILON) { // Do not add it to the weakest connection if it is not valid - does not exist + weakest_conn.area += area; + weakest_conn.centroid_accumulator += support_point * area; + weakest_conn.second_moment_of_area_accumulator += area * support_point.head<2>().cwiseProduct(support_point.head<2>()); + weakest_conn.second_moment_of_area_covariance_accumulator += area * support_point.x() * support_point.y(); + } + }; + + // first we will check local extrusion stability of bridges, then of perimeters. Perimeters are more important, they + // account for most of the curling and possible crashes, so on them we will run also global stability check + for (const auto &island : slice.islands) { + // Support bridges where needed. + for (const LayerExtrusionRange &fill_range : island.fills) { + const LayerRegion *fill_region = layer->get_region(fill_range.region()); + for (const auto &fill_idx : fill_range) { + const ExtrusionEntity *entity = fill_region->fills().entities[fill_idx]; + if (entity->role() == ExtrusionRole::BridgeInfill) { + for (const ExtrusionLine &bridge : + check_extrusion_entity_stability(entity, fill_region, prev_layer_ext_perim_lines, prev_layer_boundary, + params)) { + if (bridge.support_point_generated.has_value()) { + reckon_new_support_point(*bridge.support_point_generated, create_support_point_position(bridge.b), + float(-EPSILON), Vec2f::Zero()); + } + } + } + } + } + + const LayerRegion *perimeter_region = layer->get_region(island.perimeters.region()); + for (const auto &perimeter_idx : island.perimeters) { + const ExtrusionEntity *entity = perimeter_region->perimeters().entities[perimeter_idx]; + std::vector perims = check_extrusion_entity_stability(entity, perimeter_region, + prev_layer_ext_perim_lines, prev_layer_boundary, + params); + for (const ExtrusionLine &perim : perims) { + if (perim.support_point_generated.has_value()) { + reckon_new_support_point(*perim.support_point_generated, create_support_point_position(perim.b), float(-EPSILON), + Vec2f::Zero()); + } + if (perim.is_external_perimeter()) { + current_slice_ext_perims_lines.push_back(perim); + } + } + } + // DEBUG EXPORT, NOT USED NOW + // if (BR_bridge) { + // Lines scaledl; + // for (const auto &l : prev_layer_boundary.get_lines()) { + // scaledl.emplace_back(Point::new_scale(l.a), Point::new_scale(l.b)); + // } + + // Lines perimsl; + // for (const auto &l : current_slice_ext_perims_lines) { + // perimsl.emplace_back(Point::new_scale(l.a), Point::new_scale(l.b)); + // } + + // BoundingBox bb = get_extents(scaledl); + // bb.merge(get_extents(perimsl)); + + // ::Slic3r::SVG svg(debug_out_path( + // ("slice" + std::to_string(slice_idx) + "_" + std::to_string(layer_idx).c_str()).c_str()), + // get_extents(scaledl)); + // svg.draw(scaledl, "red", scale_(0.4)); + // svg.draw(perimsl, "blue", scale_(0.25)); + + + // svg.Close(); + // } + } + + LD current_slice_lines_distancer(current_slice_ext_perims_lines); + float unchecked_dist = params.min_distance_between_support_points + 1.0f; + + for (const ExtrusionLine &line : current_slice_ext_perims_lines) { + if ((unchecked_dist + line.len < params.min_distance_between_support_points && line.curled_up_height < params.curling_tolerance_limit) || + line.len < EPSILON) { + unchecked_dist += line.len; + } else { + unchecked_dist = line.len; + Vec2f pivot_site_search_point = Vec2f(line.b + (line.b - line.a).normalized() * 300.0f); + auto [dist, nidx, + nearest_point] = current_slice_lines_distancer.distance_from_lines_extra(pivot_site_search_point); + Vec3f support_point = create_support_point_position(nearest_point); + auto [force, cause] = part.is_stable_while_extruding(weakest_conn, line, support_point, bottom_z, params); + if (force > 0) { + reckon_new_support_point(cause, support_point, force, (line.b - line.a).normalized()); + } + } + } + current_layer_ext_perims_lines.insert(current_layer_ext_perims_lines.end(), current_slice_ext_perims_lines.begin(), + current_slice_ext_perims_lines.end()); + } // slice iterations + prev_layer_ext_perim_lines = LD(current_layer_ext_perims_lines); + } // layer iterations + + for (const auto& active_obj_pair : prev_slice_idx_to_object_part_mapping) { + remember_partial_object(active_obj_pair.second); + } + + return {supp_points, partial_objects}; +} + +#ifdef DEBUG_FILES +void debug_export(const SupportPoints& support_points,const PartialObjects& objects, std::string file_name) +{ + Slic3r::CNumericLocalesSetter locales_setter; + { + FILE *fp = boost::nowide::fopen(debug_out_path((file_name + "_supports.obj").c_str()).c_str(), "w"); + if (fp == nullptr) { + BOOST_LOG_TRIVIAL(error) << "Debug files: Couldn't open " << file_name << " for writing"; + return; + } + + for (size_t i = 0; i < support_points.size(); ++i) { + Vec3f color{1.0f, 1.0f, 1.0f}; + switch (support_points[i].cause) { + case SupportPointCause::FloatingBridgeAnchor: color = {0.863281f, 0.109375f, 0.113281f}; break; //RED + case SupportPointCause::LongBridge: color = {0.960938f, 0.90625f, 0.0625f}; break; // YELLOW + case SupportPointCause::FloatingExtrusion: color = {0.921875f, 0.515625f, 0.101563f}; break; // ORANGE + case SupportPointCause::SeparationFromBed: color = {0.0f, 1.0f, 0.0}; break; // GREEN + case SupportPointCause::UnstableFloatingPart: color = {0.105469f, 0.699219f, 0.84375f}; break; // BLUE + case SupportPointCause::WeakObjectPart: color = {0.609375f, 0.210938f, 0.621094f}; break; // PURPLE + } + + fprintf(fp, "v %f %f %f %f %f %f\n", support_points[i].position(0), support_points[i].position(1), + support_points[i].position(2), color[0], color[1], color[2]); + } + + for (size_t i = 0; i < objects.size(); ++i) { + Vec3f color{1.0f, 0.0f, 1.0f}; + if (objects[i].connected_to_bed) { + color = {1.0f, 0.0f, 0.0f}; + } + fprintf(fp, "v %f %f %f %f %f %f\n", objects[i].centroid(0), objects[i].centroid(1), objects[i].centroid(2), color[0], + color[1], color[2]); + } + + fclose(fp); + } +} +#endif + +std::tuple full_search(const PrintObject *po, const PrintTryCancel& cancel_func, const Params ¶ms) +{ + auto results = check_stability(po, cancel_func, params); +#ifdef DEBUG_FILES + auto [supp_points, objects] = results; + debug_export(supp_points, objects, "issues"); +#endif + + return results; +} + +void estimate_supports_malformations(SupportLayerPtrs &layers, float flow_width, const Params ¶ms) +{ +#ifdef DEBUG_FILES + FILE *debug_file = boost::nowide::fopen(debug_out_path("supports_malformations.obj").c_str(), "w"); + FILE *full_file = boost::nowide::fopen(debug_out_path("supports_full.obj").c_str(), "w"); +#endif + + AABBTreeLines::LinesDistancer prev_layer_lines{}; + + for (SupportLayer *l : layers) { + l->malformed_lines.clear(); + std::vector current_layer_lines; + + for (const ExtrusionEntity *extrusion : l->support_fills.flatten().entities) { + Polyline pl = extrusion->as_polyline(); + Polygon pol(pl.points); + pol.make_counter_clockwise(); + + auto annotated_points = estimate_points_properties(pol.points, prev_layer_lines, flow_width); + + for (size_t i = 0; i < annotated_points.size(); ++i) { + ExtendedPoint &curr_point = annotated_points[i]; + float line_len = i > 0 ? ((annotated_points[i - 1].position - curr_point.position).norm()) : 0.0f; + ExtrusionLine line_out{i > 0 ? annotated_points[i - 1].position.cast() : curr_point.position.cast(), + curr_point.position.cast(), line_len, extrusion}; + + const ExtrusionLine nearest_prev_layer_line = prev_layer_lines.get_lines().size() > 0 ? + prev_layer_lines.get_line(curr_point.nearest_prev_layer_line) : + ExtrusionLine{}; + + Vec2f v1 = (nearest_prev_layer_line.b - nearest_prev_layer_line.a); + Vec2f v2 = (curr_point.position.cast() - nearest_prev_layer_line.a); + auto d = (v1.x() * v2.y()) - (v1.y() * v2.x()); + if (d > 0) { + curr_point.distance *= -1.0f; + } + + line_out.curled_up_height = estimate_curled_up_height(curr_point, l->height, flow_width, + nearest_prev_layer_line.curled_up_height, params); + + current_layer_lines.push_back(line_out); + } + } + + for (const ExtrusionLine &line : current_layer_lines) { + if (line.curled_up_height > params.curling_tolerance_limit) { + l->malformed_lines.push_back(Line{Point::new_scale(line.a), Point::new_scale(line.b)}); + } + } + +#ifdef DEBUG_FILES + for (const ExtrusionLine &line : current_layer_lines) { + if (line.curled_up_height > params.curling_tolerance_limit) { + Vec3f color = value_to_rgbf(-EPSILON, l->height * params.max_curled_height_factor, line.curled_up_height); + fprintf(debug_file, "v %f %f %f %f %f %f\n", line.b[0], line.b[1], l->print_z, color[0], color[1], color[2]); + } + } + for (const ExtrusionLine &line : current_layer_lines) { + Vec3f color = value_to_rgbf(-EPSILON, l->height * params.max_curled_height_factor, line.curled_up_height); + fprintf(full_file, "v %f %f %f %f %f %f\n", line.b[0], line.b[1], l->print_z, color[0], color[1], color[2]); + } +#endif + + prev_layer_lines = LD{current_layer_lines}; + } + +#ifdef DEBUG_FILES + fclose(debug_file); + fclose(full_file); +#endif +} + +void estimate_malformations(LayerPtrs &layers, const Params ¶ms) +{ +#ifdef DEBUG_FILES + FILE *debug_file = boost::nowide::fopen(debug_out_path("object_malformations.obj").c_str(), "w"); + FILE *full_file = boost::nowide::fopen(debug_out_path("object_full.obj").c_str(), "w"); +#endif + + LD prev_layer_lines{}; + + for (Layer *l : layers) { + l->malformed_lines.clear(); + std::vector boundary_lines = l->lower_layer != nullptr ? to_unscaled_linesf(l->lower_layer->lslices) : std::vector(); + AABBTreeLines::LinesDistancer prev_layer_boundary{std::move(boundary_lines)}; + std::vector current_layer_lines; + for (const LayerRegion *layer_region : l->regions()) { + for (const ExtrusionEntity *extrusion : layer_region->perimeters().flatten().entities) { + + if (!extrusion->role().is_external_perimeter()) continue; + + Points extrusion_pts; + extrusion->collect_points(extrusion_pts); + float flow_width = get_flow_width(layer_region, extrusion->role()); + auto annotated_points = estimate_points_properties(extrusion_pts, prev_layer_lines, flow_width, + params.bridge_distance); + for (size_t i = 0; i < annotated_points.size(); ++i) { + ExtendedPoint &curr_point = annotated_points[i]; + float line_len = i > 0 ? ((annotated_points[i - 1].position - curr_point.position).norm()) : 0.0f; + ExtrusionLine line_out{i > 0 ? annotated_points[i - 1].position.cast() : curr_point.position.cast(), + curr_point.position.cast(), line_len, extrusion}; + + const ExtrusionLine nearest_prev_layer_line = prev_layer_lines.get_lines().size() > 0 ? + prev_layer_lines.get_line(curr_point.nearest_prev_layer_line) : + ExtrusionLine{}; + + float sign = (prev_layer_boundary.distance_from_lines(curr_point.position) + 0.5f * flow_width) < 0.0f ? -1.0f : + 1.0f; + curr_point.distance *= sign; + + line_out.curled_up_height = estimate_curled_up_height(curr_point, layer_region->layer()->height, flow_width, + nearest_prev_layer_line.curled_up_height, params); + + current_layer_lines.push_back(line_out); + } + } + } + + for (const ExtrusionLine &line : current_layer_lines) { + if (line.curled_up_height > params.curling_tolerance_limit) { + l->malformed_lines.push_back(Line{Point::new_scale(line.a), Point::new_scale(line.b)}); + } + } + +#ifdef DEBUG_FILES + for (const ExtrusionLine &line : current_layer_lines) { + if (line.curled_up_height > params.curling_tolerance_limit) { + Vec3f color = value_to_rgbf(-EPSILON, l->height * params.max_curled_height_factor, line.curled_up_height); + fprintf(debug_file, "v %f %f %f %f %f %f\n", line.b[0], line.b[1], l->print_z, color[0], color[1], color[2]); + } + } + for (const ExtrusionLine &line : current_layer_lines) { + Vec3f color = value_to_rgbf(-EPSILON, l->height * params.max_curled_height_factor, line.curled_up_height); + fprintf(full_file, "v %f %f %f %f %f %f\n", line.b[0], line.b[1], l->print_z, color[0], color[1], color[2]); + } +#endif + + prev_layer_lines = LD{current_layer_lines}; + } + +#ifdef DEBUG_FILES + fclose(debug_file); + fclose(full_file); +#endif +} + +std::vector> gather_issues(const SupportPoints &support_points, PartialObjects &partial_objects) +{ + std::vector> result; + // The partial object are most likely sorted from smaller to larger as the print continues, so this should save some sorting time + std::reverse(partial_objects.begin(), partial_objects.end()); + std::sort(partial_objects.begin(), partial_objects.end(), + [](const PartialObject &left, const PartialObject &right) { return left.volume > right.volume; }); + + // Object may have zero extrusions and thus no partial objects. (e.g. very tiny object) + float max_volume_part = partial_objects.empty() ? 0.0f : partial_objects.front().volume; + for (const PartialObject &p : partial_objects) { + if (p.volume > max_volume_part / 200.0f && !p.connected_to_bed) { + result.emplace_back(SupportPointCause::UnstableFloatingPart, true); + break; + } + } + + // should be detected in previous step + // if (!unstable_floating_part_added) { + // for (const SupportPoint &sp : support_points) { + // if (sp.cause == SupportPointCause::UnstableFloatingPart) { + // result.emplace_back(SupportPointCause::UnstableFloatingPart, true); + // break; + // } + // } + // } + + std::vector ext_supp_points{}; + ext_supp_points.reserve(support_points.size()); + for (const SupportPoint &sp : support_points) { + switch (sp.cause) { + case SupportPointCause::FloatingBridgeAnchor: + case SupportPointCause::FloatingExtrusion: ext_supp_points.push_back(sp); break; + default: break; + } + } + + auto coord_fn = [&ext_supp_points](size_t idx, size_t dim) { return ext_supp_points[idx].position[dim]; }; + KDTreeIndirect<3, float, decltype(coord_fn)> ext_points_tree{coord_fn, ext_supp_points.size()}; + for (const SupportPoint &sp : ext_supp_points) { + auto cluster = find_nearby_points(ext_points_tree, sp.position, 3.0); + int score = 0; + bool floating_bridge = false; + for (size_t idx : cluster) { + score += ext_supp_points[idx].cause == SupportPointCause::FloatingBridgeAnchor ? 3 : 1; + floating_bridge = floating_bridge || ext_supp_points[idx].cause == SupportPointCause::FloatingBridgeAnchor; + } + if (score > 5) { + if (floating_bridge) { + result.emplace_back(SupportPointCause::FloatingBridgeAnchor, true); + } else { + result.emplace_back(SupportPointCause::FloatingExtrusion, true); + } + break; + } + } + + for (const SupportPoint &sp : support_points) { + if (sp.cause == SupportPointCause::SeparationFromBed) { + result.emplace_back(SupportPointCause::SeparationFromBed, true); + break; + } + } + + for (const SupportPoint &sp : support_points) { + if (sp.cause == SupportPointCause::WeakObjectPart) { + result.emplace_back(SupportPointCause::WeakObjectPart, true); + break; + } + } + + if (ext_supp_points.size() > max_volume_part / 200.0f) { + result.emplace_back(SupportPointCause::FloatingExtrusion, false); + } + + for (const SupportPoint &sp : support_points) { + if (sp.cause == SupportPointCause::LongBridge) { + result.emplace_back(SupportPointCause::LongBridge, false); + break; + } + } + + return result; +} + +} // namespace SupportSpotsGenerator +} // namespace Slic3r diff --git a/src/libslic3r/SupportSpotsGenerator.hpp b/src/libslic3r/SupportSpotsGenerator.hpp new file mode 100644 index 00000000000..543b9c92bb2 --- /dev/null +++ b/src/libslic3r/SupportSpotsGenerator.hpp @@ -0,0 +1,161 @@ +#ifndef SRC_LIBSLIC3R_SUPPORTABLEISSUESSEARCH_HPP_ +#define SRC_LIBSLIC3R_SUPPORTABLEISSUESSEARCH_HPP_ + +#include "Layer.hpp" +#include "Line.hpp" +#include "PrintBase.hpp" +#include "PrintConfig.hpp" +#include +#include +#include + +namespace Slic3r { + +namespace SupportSpotsGenerator { + +struct Params +{ + Params( + const std::vector &filament_types, float max_acceleration, int raft_layers_count, BrimType brim_type, float brim_width) + : max_acceleration(max_acceleration), raft_layers_count(raft_layers_count), brim_type(brim_type), brim_width(brim_width) + { + if (filament_types.size() > 1) { + BOOST_LOG_TRIVIAL(warning) + << "SupportSpotsGenerator does not currently handle different materials properly, only first will be used"; + } + if (filament_types.empty() || filament_types[0].empty()) { + BOOST_LOG_TRIVIAL(error) << "SupportSpotsGenerator error: empty filament_type"; + filament_type = std::string("PLA"); + } else { + filament_type = filament_types[0]; + BOOST_LOG_TRIVIAL(debug) << "SupportSpotsGenerator: applying filament type: " << filament_type; + } + } + + // the algorithm should use the following units for all computations: distance [mm], mass [g], time [s], force [g*mm/s^2] + const float bridge_distance = 16.0f; // mm + const float max_acceleration; // mm/s^2 ; max acceleration of object in XY -- should be applicable only to printers with bed slinger, + // however we do not have such info yet. The force is usually small anyway, so not such a big deal to include it everytime + const int raft_layers_count; + std::string filament_type; + + BrimType brim_type; + const float brim_width; + + const std::pair malformation_distance_factors = std::pair { 0.5, 1.1 }; + const float max_curled_height_factor = 10.0f; + const float curling_tolerance_limit = 0.1f; + + const float min_distance_between_support_points = 3.0f; //mm + const float support_points_interface_radius = 1.5f; // mm + const float min_distance_to_allow_local_supports = 1.0f; //mm + + const float gravity_constant = 9806.65f; // mm/s^2; gravity acceleration on Earth's surface, algorithm assumes that printer is in upwards position. + const double filament_density = 1.25e-3f; // g/mm^3 ; Common filaments are very lightweight, so precise number is not that important + const double material_yield_strength = 33.0f * 1e6f; // (g*mm/s^2)/mm^2; 33 MPa is yield strength of ABS, which has the lowest yield strength from common materials. + const float standard_extruder_conflict_force = 10.0f * gravity_constant; // force that can occasionally push the model due to various factors (filament leaks, small curling, ... ); + const float malformations_additive_conflict_extruder_force = 65.0f * gravity_constant; // for areas with possible high layered curled filaments + + // MPa * 1e^6 = (g*mm/s^2)/mm^2 = g/(mm*s^2); yield strength of the bed surface + double get_bed_adhesion_yield_strength() const { + if (raft_layers_count > 0) { + return get_support_spots_adhesion_strength() * 2.0; + } + + if (filament_type == "PLA") { + return 0.02 * 1e6; + } else if (filament_type == "PET" || filament_type == "PETG") { + return 0.3 * 1e6; + } else if (filament_type == "ABS" || filament_type == "ASA") { + return 0.1 * 1e6; //TODO do measurements + } else { //PLA default value - defensive approach, PLA has quite low adhesion + return 0.02 * 1e6; + } + } + + double get_support_spots_adhesion_strength() const { + return 0.016f * 1e6; + } +}; + +enum class SupportPointCause { + LongBridge, // point generated on bridge and straight perimeter extrusion longer than the allowed length + FloatingBridgeAnchor, // point generated on unsupported bridge endpoint + FloatingExtrusion, // point generated on extrusion that does not hold on its own + SeparationFromBed, // point generated for object parts that are connected to the bed, but the area is too small and there is a risk of separation (brim may help) + UnstableFloatingPart, // point generated for object parts not connected to the bed, holded only by the other support points (brim will not help here) + WeakObjectPart // point generated when some part of the object is too weak to hold the upper part and may break (imagine hourglass) + }; + +// The support points can be sorted into two groups +// 1. Local extrusion support for extrusions that are printed in the air and would not +// withstand on their own (too long bridges, sharp turns in large overhang, concave bridge holes, etc.) +// These points have negative force (-EPSILON) and Vec2f::Zero() direction +// The algorithm still expects that these points will be supported and accounts for them in the global stability check. +// 2. Global stability support points are generated at each spot, where the algorithm detects that extruding the current line +// may cause separation of the object part from the bed and/or its support spots or crack in the weak connection of the object parts. +// The generated point's direction is the estimated falling direction of the object part, and the force is equal to te difference +// between forces that destabilize the object (extruder conflicts with curled filament, weight if instable center of mass, bed movements etc) +// and forces that stabilize the object (bed adhesion, other support spots adhesion, weight if stable center of mass). +// Note that the force is only the difference - the amount needed to stabilize the object again. +struct SupportPoint +{ + SupportPoint(SupportPointCause cause, const Vec3f &position, float force, float spot_radius, const Vec2f &direction) + : cause(cause), position(position), force(force), spot_radius(spot_radius), direction(direction) + {} + + bool is_local_extrusion_support() const + { + return cause == SupportPointCause::LongBridge || cause == SupportPointCause::FloatingExtrusion; + } + bool is_global_object_support() const { return !is_local_extrusion_support(); } + + SupportPointCause cause; // reason why this support point was generated. Used for the user alerts + // position is in unscaled coords. The z coordinate is aligned with the layers bottom_z coordiantes + Vec3f position; + // force that destabilizes the object to the point of falling/breaking. g*mm/s^2 units + // It is valid only for global_object_support. For local extrusion support points, the force is -EPSILON + // values gathered from large XL model: Min : 0 | Max : 18713800 | Average : 1361186 | Median : 329103 + // For reference 18713800 is weight of 1.8 Kg object, 329103 is weight of 0.03 Kg + // The final sliced object weight was approx 0.5 Kg + float force; + // Expected spot size. The support point strength is calculated from the area defined by this value. + // Currently equal to the support_points_interface_radius parameter above + float spot_radius; + // direction of the fall of the object (z part is neglected) + Vec2f direction; +}; + +using SupportPoints = std::vector; + +struct Malformations { + std::vector layers; //for each layer +}; + +struct PartialObject +{ + PartialObject(Vec3f centroid, float volume, bool connected_to_bed) + : centroid(centroid), volume(volume), connected_to_bed(connected_to_bed) + {} + + Vec3f centroid; + float volume; + bool connected_to_bed; +}; + +using PartialObjects = std::vector; + +// Both support points and partial objects are sorted from the lowest z to the highest +std::tuple full_search(const PrintObject *po, const PrintTryCancel& cancel_func, const Params ¶ms); + +void estimate_supports_malformations(std::vector &layers, float supports_flow_width, const Params ¶ms); +void estimate_malformations(std::vector &layers, const Params ¶ms); + + +// NOTE: the boolean marks if the issue is critical or not for now. +std::vector> gather_issues(const SupportPoints &support_points, + PartialObjects &partial_objects); + +}} // namespace Slic3r::SupportSpotsGenerator + +#endif /* SRC_LIBSLIC3R_SUPPORTABLEISSUESSEARCH_HPP_ */ diff --git a/src/libslic3r/Surface.hpp b/src/libslic3r/Surface.hpp index 4920efbbfdb..1f352e97770 100644 --- a/src/libslic3r/Surface.hpp +++ b/src/libslic3r/Surface.hpp @@ -33,40 +33,31 @@ class Surface public: SurfaceType surface_type; ExPolygon expolygon; - double thickness; // in mm - unsigned short thickness_layers; // in layers - double bridge_angle; // in radians, ccw, 0 = East, only 0+ (negative means undefined) - unsigned short extra_perimeters; + double thickness { -1 }; // in mm + unsigned short thickness_layers { 1 }; // in layers + double bridge_angle { -1. }; // in radians, ccw, 0 = East, only 0+ (negative means undefined) + unsigned short extra_perimeters { 0 }; - Surface(const Slic3r::Surface &rhs) - : surface_type(rhs.surface_type), expolygon(rhs.expolygon), - thickness(rhs.thickness), thickness_layers(rhs.thickness_layers), - bridge_angle(rhs.bridge_angle), extra_perimeters(rhs.extra_perimeters) - {}; - - Surface(SurfaceType _surface_type, const ExPolygon &_expolygon) - : surface_type(_surface_type), expolygon(_expolygon), - thickness(-1), thickness_layers(1), bridge_angle(-1), extra_perimeters(0) - {}; - Surface(const Surface &other, const ExPolygon &_expolygon) - : surface_type(other.surface_type), expolygon(_expolygon), - thickness(other.thickness), thickness_layers(other.thickness_layers), - bridge_angle(other.bridge_angle), extra_perimeters(other.extra_perimeters) - {}; - Surface(Surface &&rhs) - : surface_type(rhs.surface_type), expolygon(std::move(rhs.expolygon)), - thickness(rhs.thickness), thickness_layers(rhs.thickness_layers), - bridge_angle(rhs.bridge_angle), extra_perimeters(rhs.extra_perimeters) - {}; - Surface(SurfaceType _surface_type, const ExPolygon &&_expolygon) - : surface_type(_surface_type), expolygon(std::move(_expolygon)), - thickness(-1), thickness_layers(1), bridge_angle(-1), extra_perimeters(0) - {}; - Surface(const Surface &other, const ExPolygon &&_expolygon) - : surface_type(other.surface_type), expolygon(std::move(_expolygon)), - thickness(other.thickness), thickness_layers(other.thickness_layers), - bridge_angle(other.bridge_angle), extra_perimeters(other.extra_perimeters) - {}; + Surface(const Slic3r::Surface &rhs) : + surface_type(rhs.surface_type), expolygon(rhs.expolygon), + thickness(rhs.thickness), thickness_layers(rhs.thickness_layers), + bridge_angle(rhs.bridge_angle), extra_perimeters(rhs.extra_perimeters) {} + Surface(SurfaceType surface_type, const ExPolygon &expolygon) : + surface_type(surface_type), expolygon(expolygon) {} + Surface(const Surface &templ, const ExPolygon &expolygon) : + surface_type(templ.surface_type), expolygon(expolygon), + thickness(templ.thickness), thickness_layers(templ.thickness_layers), + bridge_angle(templ.bridge_angle), extra_perimeters(templ.extra_perimeters) {} + Surface(Surface &&rhs) : + surface_type(rhs.surface_type), expolygon(std::move(rhs.expolygon)), + thickness(rhs.thickness), thickness_layers(rhs.thickness_layers), + bridge_angle(rhs.bridge_angle), extra_perimeters(rhs.extra_perimeters) {} + Surface(SurfaceType surface_type, ExPolygon &&expolygon) : + surface_type(surface_type), expolygon(std::move(expolygon)) {} + Surface(const Surface &templ, ExPolygon &&expolygon) : + surface_type(templ.surface_type), expolygon(std::move(expolygon)), + thickness(templ.thickness), thickness_layers(templ.thickness_layers), + bridge_angle(templ.bridge_angle), extra_perimeters(templ.extra_perimeters) {} Surface& operator=(const Surface &rhs) { @@ -104,7 +95,7 @@ class Surface }; typedef std::vector Surfaces; -typedef std::vector SurfacesPtr; +typedef std::vector SurfacesPtr; inline Polygons to_polygons(const Surface &surface) { @@ -159,7 +150,7 @@ inline ExPolygons to_expolygons(Surfaces &&src) { ExPolygons expolygons; expolygons.reserve(src.size()); - for (Surfaces::const_iterator it = src.begin(); it != src.end(); ++it) + for (auto it = src.begin(); it != src.end(); ++it) expolygons.emplace_back(ExPolygon(std::move(it->expolygon))); src.clear(); return expolygons; @@ -221,6 +212,7 @@ inline void polygons_append(Polygons &dst, const SurfacesPtr &src) } } +/* inline void polygons_append(Polygons &dst, SurfacesPtr &&src) { dst.reserve(dst.size() + number_polygons(src)); @@ -230,6 +222,7 @@ inline void polygons_append(Polygons &dst, SurfacesPtr &&src) (*it)->expolygon.holes.clear(); } } +*/ // Append a vector of Surfaces at the end of another vector of polygons. inline void surfaces_append(Surfaces &dst, const ExPolygons &src, SurfaceType surfaceType) @@ -260,8 +253,8 @@ inline void surfaces_append(Surfaces &dst, ExPolygons &&src, SurfaceType surface inline void surfaces_append(Surfaces &dst, ExPolygons &&src, const Surface &surfaceTempl) { dst.reserve(dst.size() + number_polygons(src)); - for (ExPolygons::const_iterator it = src.begin(); it != src.end(); ++ it) - dst.emplace_back(Surface(surfaceTempl, std::move(*it))); + for (ExPolygon& explg : src) + dst.emplace_back(Surface(surfaceTempl, std::move(explg))); src.clear(); } diff --git a/src/libslic3r/SurfaceCollection.cpp b/src/libslic3r/SurfaceCollection.cpp index ec847d2a3fd..fbc30ca63ef 100644 --- a/src/libslic3r/SurfaceCollection.cpp +++ b/src/libslic3r/SurfaceCollection.cpp @@ -22,57 +22,49 @@ void SurfaceCollection::simplify(double tolerance) } /* group surfaces by common properties */ -void SurfaceCollection::group(std::vector *retval) +void SurfaceCollection::group(std::vector *retval) const { - for (Surfaces::iterator it = this->surfaces.begin(); it != this->surfaces.end(); ++it) { + for (const Surface &surface : this->surfaces) { // find a group with the same properties - SurfacesPtr* group = NULL; + SurfacesPtr *group = nullptr; for (std::vector::iterator git = retval->begin(); git != retval->end(); ++git) - if (! git->empty() && surfaces_could_merge(*git->front(), *it)) { + if (! git->empty() && surfaces_could_merge(*git->front(), surface)) { group = &*git; break; } // if no group with these properties exists, add one - if (group == NULL) { + if (group == nullptr) { retval->resize(retval->size() + 1); group = &retval->back(); } // append surface to group - group->push_back(&*it); + group->push_back(&surface); } } -SurfacesPtr SurfaceCollection::filter_by_type(const SurfaceType type) +SurfacesPtr SurfaceCollection::filter_by_type(const SurfaceType type) const { SurfacesPtr ss; - for (Surfaces::iterator surface = this->surfaces.begin(); surface != this->surfaces.end(); ++surface) { - if (surface->surface_type == type) ss.push_back(&*surface); - } + for (const Surface &surface : this->surfaces) + if (surface.surface_type == type) + ss.push_back(&surface); return ss; } -SurfacesPtr SurfaceCollection::filter_by_types(const SurfaceType *types, int ntypes) +SurfacesPtr SurfaceCollection::filter_by_types(std::initializer_list types) const { SurfacesPtr ss; - for (Surfaces::iterator surface = this->surfaces.begin(); surface != this->surfaces.end(); ++surface) { - for (int i = 0; i < ntypes; ++ i) { - if (surface->surface_type == types[i]) { - ss.push_back(&*surface); - break; - } - } - } + for (const Surface &surface : this->surfaces) + if (std::find(types.begin(), types.end(), surface.surface_type) != types.end()) + ss.push_back(&surface); return ss; } -void SurfaceCollection::filter_by_type(SurfaceType type, Polygons* polygons) +void SurfaceCollection::filter_by_type(SurfaceType type, Polygons *polygons) const { - for (Surfaces::iterator surface = this->surfaces.begin(); surface != this->surfaces.end(); ++surface) { - if (surface->surface_type == type) { - Polygons pp = surface->expolygon; - polygons->insert(polygons->end(), pp.begin(), pp.end()); - } - } + for (const Surface &surface : this->surfaces) + if (surface.surface_type == type) + polygons_append(*polygons, to_polygons(surface.expolygon)); } void SurfaceCollection::keep_type(const SurfaceType type) @@ -89,23 +81,15 @@ void SurfaceCollection::keep_type(const SurfaceType type) surfaces.erase(surfaces.begin() + j, surfaces.end()); } -void SurfaceCollection::keep_types(const SurfaceType *types, int ntypes) +void SurfaceCollection::keep_types(std::initializer_list types) { size_t j = 0; - for (size_t i = 0; i < surfaces.size(); ++ i) { - bool keep = false; - for (int k = 0; k < ntypes; ++ k) { - if (surfaces[i].surface_type == types[k]) { - keep = true; - break; - } - } - if (keep) { + for (size_t i = 0; i < surfaces.size(); ++ i) + if (std::find(types.begin(), types.end(), surfaces[i].surface_type) != types.end()) { if (j < i) std::swap(surfaces[i], surfaces[j]); ++ j; } - } if (j < surfaces.size()) surfaces.erase(surfaces.begin() + j, surfaces.end()); } @@ -124,18 +108,13 @@ void SurfaceCollection::remove_type(const SurfaceType type) surfaces.erase(surfaces.begin() + j, surfaces.end()); } -void SurfaceCollection::remove_types(const SurfaceType *types, int ntypes) +void SurfaceCollection::remove_type(const SurfaceType type, ExPolygons *polygons) { size_t j = 0; for (size_t i = 0; i < surfaces.size(); ++ i) { - bool remove = false; - for (int k = 0; k < ntypes; ++ k) { - if (surfaces[i].surface_type == types[k]) { - remove = true; - break; - } - } - if (! remove) { + if (Surface &surface = surfaces[i]; surface.surface_type == type) { + polygons->emplace_back(std::move(surface.expolygon)); + } else { if (j < i) std::swap(surfaces[i], surfaces[j]); ++ j; @@ -145,6 +124,19 @@ void SurfaceCollection::remove_types(const SurfaceType *types, int ntypes) surfaces.erase(surfaces.begin() + j, surfaces.end()); } +void SurfaceCollection::remove_types(std::initializer_list types) +{ + size_t j = 0; + for (size_t i = 0; i < surfaces.size(); ++ i) + if (std::find(types.begin(), types.end(), surfaces[i].surface_type) == types.end()) { + if (j < i) + std::swap(surfaces[i], surfaces[j]); + ++ j; + } + if (j < surfaces.size()) + surfaces.erase(surfaces.begin() + j, surfaces.end()); +} + void SurfaceCollection::export_to_svg(const char *path, bool show_labels) { BoundingBox bbox; diff --git a/src/libslic3r/SurfaceCollection.hpp b/src/libslic3r/SurfaceCollection.hpp index 7e01a68dfbb..0f62875b263 100644 --- a/src/libslic3r/SurfaceCollection.hpp +++ b/src/libslic3r/SurfaceCollection.hpp @@ -3,6 +3,7 @@ #include "libslic3r.h" #include "Surface.hpp" +#include #include namespace Slic3r { @@ -17,7 +18,7 @@ class SurfaceCollection SurfaceCollection(Surfaces &&surfaces) : surfaces(std::move(surfaces)) {}; void simplify(double tolerance); - void group(std::vector *retval); + void group(std::vector *retval) const; template bool any_internal_contains(const T &item) const { for (const Surface &surface : this->surfaces) if (surface.is_internal() && surface.expolygon.contains(item)) return true; return false; @@ -26,13 +27,14 @@ class SurfaceCollection for (const Surface &surface : this->surfaces) if (surface.is_bottom() && surface.expolygon.contains(item)) return true; return false; } - SurfacesPtr filter_by_type(const SurfaceType type); - SurfacesPtr filter_by_types(const SurfaceType *types, int ntypes); + SurfacesPtr filter_by_type(const SurfaceType type) const; + SurfacesPtr filter_by_types(std::initializer_list types) const; void keep_type(const SurfaceType type); - void keep_types(const SurfaceType *types, int ntypes); + void keep_types(std::initializer_list types); void remove_type(const SurfaceType type); - void remove_types(const SurfaceType *types, int ntypes); - void filter_by_type(SurfaceType type, Polygons* polygons); + void remove_types(std::initializer_list types); + void filter_by_type(SurfaceType type, Polygons *polygons) const; + void remove_type(const SurfaceType type, ExPolygons *polygons); void set_type(SurfaceType type) { for (Surface &surface : this->surfaces) surface.surface_type = type; @@ -47,6 +49,13 @@ class SurfaceCollection return false; } + Surfaces::const_iterator cbegin() const { return this->surfaces.cbegin(); } + Surfaces::const_iterator cend() const { return this->surfaces.cend(); } + Surfaces::const_iterator begin() const { return this->surfaces.cbegin(); } + Surfaces::const_iterator end() const { return this->surfaces.cend(); } + Surfaces::iterator begin() { return this->surfaces.begin(); } + Surfaces::iterator end() { return this->surfaces.end(); } + void set(const SurfaceCollection &coll) { surfaces = coll.surfaces; } void set(SurfaceCollection &&coll) { surfaces = std::move(coll.surfaces); } void set(const ExPolygons &src, SurfaceType surfaceType) { clear(); this->append(src, surfaceType); } diff --git a/src/libslic3r/SurfaceMesh.hpp b/src/libslic3r/SurfaceMesh.hpp new file mode 100644 index 00000000000..93eb9fdaa6e --- /dev/null +++ b/src/libslic3r/SurfaceMesh.hpp @@ -0,0 +1,163 @@ +#ifndef slic3r_SurfaceMesh_hpp_ +#define slic3r_SurfaceMesh_hpp_ + +#include +#include + +#include "boost/container/small_vector.hpp" + +namespace Slic3r { + +class TriangleMesh; + + + +enum Face_index : int; + +class Halfedge_index { + friend class SurfaceMesh; + +public: + Halfedge_index() : m_face(Face_index(-1)), m_side(0) {} + Face_index face() const { return m_face; } + unsigned char side() const { return m_side; } + bool is_invalid() const { return int(m_face) < 0; } + bool operator!=(const Halfedge_index& rhs) const { return ! ((*this) == rhs); } + bool operator==(const Halfedge_index& rhs) const { return m_face == rhs.m_face && m_side == rhs.m_side; } + +private: + Halfedge_index(int face_idx, unsigned char side_idx) : m_face(Face_index(face_idx)), m_side(side_idx) {} + + Face_index m_face; + unsigned char m_side; +}; + + + +class Vertex_index { + friend class SurfaceMesh; + +public: + Vertex_index() : m_face(Face_index(-1)), m_vertex_idx(0) {} + bool is_invalid() const { return int(m_face) < 0; } + bool operator==(const Vertex_index& rhs) const = delete; // Use SurfaceMesh::is_same_vertex. + +private: + Vertex_index(int face_idx, unsigned char vertex_idx) : m_face(Face_index(face_idx)), m_vertex_idx(vertex_idx) {} + + Face_index m_face; + unsigned char m_vertex_idx; +}; + + + +class SurfaceMesh { +public: + explicit SurfaceMesh(const indexed_triangle_set& its) + : m_its(its), + m_face_neighbors(its_face_neighbors_par(its)) + {} + SurfaceMesh(const SurfaceMesh&) = delete; + SurfaceMesh& operator=(const SurfaceMesh&) = delete; + + Vertex_index source(Halfedge_index h) const { assert(! h.is_invalid()); return Vertex_index(h.m_face, h.m_side); } + Vertex_index target(Halfedge_index h) const { assert(! h.is_invalid()); return Vertex_index(h.m_face, h.m_side == 2 ? 0 : h.m_side + 1); } + Face_index face(Halfedge_index h) const { assert(! h.is_invalid()); return h.m_face; } + + Halfedge_index next(Halfedge_index h) const { assert(! h.is_invalid()); h.m_side = (h.m_side + 1) % 3; return h; } + Halfedge_index prev(Halfedge_index h) const { assert(! h.is_invalid()); h.m_side = (h.m_side == 0 ? 2 : h.m_side - 1); return h; } + Halfedge_index halfedge(Vertex_index v) const { return Halfedge_index(v.m_face, (v.m_vertex_idx == 0 ? 2 : v.m_vertex_idx - 1)); } + Halfedge_index halfedge(Face_index f) const { return Halfedge_index(f, 0); } + Halfedge_index opposite(Halfedge_index h) const { + if (h.is_invalid()) + return h; + + int face_idx = m_face_neighbors[h.m_face][h.m_side]; + Halfedge_index h_candidate = halfedge(Face_index(face_idx)); + + if (h_candidate.is_invalid()) + return Halfedge_index(); // invalid + + for (int i=0; i<3; ++i) { + if (is_same_vertex(source(h_candidate), target(h))) { + // Meshes in PrusaSlicer should be fixed enough for the following not to happen. + assert(is_same_vertex(target(h_candidate), source(h))); + return h_candidate; + } + h_candidate = next(h_candidate); + } + return Halfedge_index(); // invalid + } + + Halfedge_index next_around_target(Halfedge_index h) const { return opposite(next(h)); } + Halfedge_index prev_around_target(Halfedge_index h) const { Halfedge_index op = opposite(h); return (op.is_invalid() ? Halfedge_index() : prev(op)); } + Halfedge_index next_around_source(Halfedge_index h) const { Halfedge_index op = opposite(h); return (op.is_invalid() ? Halfedge_index() : next(op)); } + Halfedge_index prev_around_source(Halfedge_index h) const { return opposite(prev(h)); } + Halfedge_index halfedge(Vertex_index source, Vertex_index target) const + { + Halfedge_index hi(source.m_face, source.m_vertex_idx); + assert(! hi.is_invalid()); + + const Vertex_index orig_target = this->target(hi); + Vertex_index current_target = orig_target; + + while (! is_same_vertex(current_target, target)) { + hi = next_around_source(hi); + if (hi.is_invalid()) + break; + current_target = this->target(hi); + if (is_same_vertex(current_target, orig_target)) + return Halfedge_index(); // invalid + } + + return hi; + } + + const stl_vertex& point(Vertex_index v) const { return m_its.vertices[m_its.indices[v.m_face][v.m_vertex_idx]]; } + + size_t degree(Vertex_index v) const + { + // In case the mesh is broken badly, the loop might end up to be infinite, + // never getting back to the first halfedge. Remember list of all half-edges + // and trip if any is encountered for the second time. + Halfedge_index h_first = halfedge(v); + boost::container::small_vector he_visited; + Halfedge_index h = next_around_target(h_first); + size_t degree = 2; + while (! h.is_invalid() && h != h_first) { + he_visited.emplace_back(h); + h = next_around_target(h); + if (std::find(he_visited.begin(), he_visited.end(), h) == he_visited.end()) + return 0; + ++degree; + } + return h.is_invalid() ? 0 : degree - 1; + } + + size_t degree(Face_index f) const { + size_t total = 0; + for (unsigned char i=0; i<3; ++i) { + size_t d = degree(Vertex_index(f, i)); + if (d == 0) + return 0; + total += d; + } + assert(total - 6 >= 0); + return total - 6; // we counted 3 halfedges from f, and one more for each neighbor + } + + bool is_border(Halfedge_index h) const { return m_face_neighbors[h.m_face][h.m_side] == -1; } + + bool is_same_vertex(const Vertex_index& a, const Vertex_index& b) const { return m_its.indices[a.m_face][a.m_vertex_idx] == m_its.indices[b.m_face][b.m_vertex_idx]; } + Vec3i get_face_neighbors(Face_index face_id) const { assert(int(face_id) < int(m_face_neighbors.size())); return m_face_neighbors[face_id]; } + + + +private: + const std::vector m_face_neighbors; + const indexed_triangle_set& m_its; +}; + +} //namespace Slic3r + +#endif // slic3r_SurfaceMesh_hpp_ diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 3f9dac82afb..c33f24311a4 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -12,8 +12,6 @@ #define ENABLE_RENDER_SELECTION_CENTER 0 // Shows an imgui dialog with camera related data #define ENABLE_CAMERA_STATISTICS 0 -// Render the picking pass instead of the main scene (use [T] key to toggle between regular rendering and picking pass only rendering) -#define ENABLE_RENDER_PICKING_PASS 0 // Enable extracting thumbnails from selected gcode and save them as png files #define ENABLE_THUMBNAIL_GENERATOR_DEBUG 0 // Disable synchronization of unselected instances @@ -26,25 +24,42 @@ #define ENABLE_GCODE_VIEWER_DATA_CHECKING 0 // Enable project dirty state manager debug window #define ENABLE_PROJECT_DIRTY_STATE_DEBUG_WINDOW 0 +// Disable using instanced models to render options in gcode preview +#define DISABLE_GCODEVIEWER_INSTANCED_MODELS 1 +// Enable Measure Gizmo debug window +#define ENABLE_MEASURE_GIZMO_DEBUG 0 +// Enable scene raycast picking debug window +#define ENABLE_RAYCAST_PICKING_DEBUG 0 +// Shows an imgui dialog with GLModel statistics data +#define ENABLE_GLMODEL_STATISTICS 0 +// Shows an imgui dialog containing the matrices of the selected volumes +#define ENABLE_MATRICES_DEBUG 0 +// Shows an imgui dialog containing data from class ObjectManipulation +#define ENABLE_OBJECT_MANIPULATION_DEBUG 0 // Enable rendering of objects using environment map #define ENABLE_ENVIRONMENT_MAP 0 // Enable smoothing of objects normals #define ENABLE_SMOOTH_NORMALS 0 -// Enable rendering markers for options in preview as fixed screen size points -#define ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS 1 +// Enable OpenGL ES +#define ENABLE_OPENGL_ES 0 +// Enable OpenGL core profile context (tested against Mesa 20.1.8 on Windows) +#define ENABLE_GL_CORE_PROFILE (1 && !ENABLE_OPENGL_ES) +// Enable OpenGL debug messages using debug context +#define ENABLE_OPENGL_DEBUG_OPTION (1 && ENABLE_GL_CORE_PROFILE) -//================ -// 2.4.1.rc techs -//================ -#define ENABLE_2_4_1_RC 1 -// Enable detection of layers for spiral vase prints -#define ENABLE_SPIRAL_VASE_LAYERS (1 && ENABLE_2_4_1_RC) -// Enable correction of toolpaths when z offset is set -#define ENABLE_Z_OFFSET_CORRECTION (1 && ENABLE_2_4_1_RC) +//==================== +// 2.6.0.alpha1 techs +//==================== +#define ENABLE_2_6_0_ALPHA1 1 + +// Enable alternative version of file_wildcards() +#define ENABLE_ALTERNATIVE_FILE_WILDCARDS_GENERATOR (1 && ENABLE_2_6_0_ALPHA1) +// Enable gcode postprocess modified to allow for backward insertion of new lines +#define ENABLE_GCODE_POSTPROCESS_BACKTRACE (1 && ENABLE_2_6_0_ALPHA1) #endif // _prusaslicer_technologies_h_ diff --git a/src/libslic3r/TextConfiguration.hpp b/src/libslic3r/TextConfiguration.hpp new file mode 100644 index 00000000000..1c1ce775676 --- /dev/null +++ b/src/libslic3r/TextConfiguration.hpp @@ -0,0 +1,241 @@ +#ifndef slic3r_TextConfiguration_hpp_ +#define slic3r_TextConfiguration_hpp_ + +#include +#include +#include +#include +#include +#include +#include +#include "Point.hpp" // Transform3d + +namespace Slic3r { + +/// +/// User modifiable property of text style +/// NOTE: OnEdit fix serializations: EmbossStylesSerializable, TextConfigurationSerialization +/// +struct FontProp +{ + // define extra space between letters, negative mean closer letter + // When not set value is zero and is not stored + std::optional char_gap; // [in font point] + + // define extra space between lines, negative mean closer lines + // When not set value is zero and is not stored + std::optional line_gap; // [in font point] + + // Z depth of text + float emboss; // [in mm] + + // Flag that text should use surface cutted from object + // FontProp::distance should without value + // FontProp::emboss should be positive number + // Note: default value is false + bool use_surface; + + // positive value mean wider character shape + // negative value mean tiner character shape + // When not set value is zero and is not stored + std::optional boldness; // [in mm] + + // positive value mean italic of character (CW) + // negative value mean CCW skew (unItalic) + // When not set value is zero and is not stored + std::optional skew; // [ration x:y] + + // distance from surface point + // used for move over model surface + // When not set value is zero and is not stored + std::optional distance; // [in mm] + + // Angle of rotation around emboss direction (Z axis) + // It is calculate on the fly from volume world transformation + // only StyleManager keep actual value for comparision with style + // When not set value is zero and is not stored + std::optional angle; // [in radians] form -Pi to Pi + + // Parameter for True Type Font collections + // Select index of font in collection + std::optional collection_number; + + //enum class Align { + // left, + // right, + // center, + // top_left, + // top_right, + // top_center, + // bottom_left, + // bottom_right, + // bottom_center + //}; + //// change pivot of text + //// When not set, center is used and is not stored + //std::optional align; + + ////// + // Duplicit data to wxFontDescriptor + // used for store/load .3mf file + ////// + + // Height of text line (letters) + // duplicit to wxFont::PointSize + float size_in_mm; // [in mm] + + // Additional data about font to be able to find substitution, + // when same font is not installed + std::optional family; + std::optional face_name; + std::optional style; + std::optional weight; + + /// + /// Only constructor with restricted values + /// + /// Y size of text [in mm] + /// Z size of text [in mm] + FontProp(float line_height = 10.f, float depth = 2.f) + : emboss(depth), size_in_mm(line_height), use_surface(false) + {} + + bool operator==(const FontProp& other) const { + return + char_gap == other.char_gap && + line_gap == other.line_gap && + use_surface == other.use_surface && + is_approx(emboss, other.emboss) && + is_approx(size_in_mm, other.size_in_mm) && + is_approx(boldness, other.boldness) && + is_approx(skew, other.skew) && + is_approx(distance, other.distance) && + is_approx(angle, other.angle); + } + + // undo / redo stack recovery + template void save(Archive &ar) const + { + ar(emboss, use_surface, size_in_mm); + cereal::save(ar, char_gap); + cereal::save(ar, line_gap); + cereal::save(ar, boldness); + cereal::save(ar, skew); + cereal::save(ar, distance); + cereal::save(ar, angle); + cereal::save(ar, collection_number); + cereal::save(ar, family); + cereal::save(ar, face_name); + cereal::save(ar, style); + cereal::save(ar, weight); + } + template void load(Archive &ar) + { + ar(emboss, use_surface, size_in_mm); + cereal::load(ar, char_gap); + cereal::load(ar, line_gap); + cereal::load(ar, boldness); + cereal::load(ar, skew); + cereal::load(ar, distance); + cereal::load(ar, angle); + cereal::load(ar, collection_number); + cereal::load(ar, family); + cereal::load(ar, face_name); + cereal::load(ar, style); + cereal::load(ar, weight); + } +}; + +/// +/// Style of embossed text +/// (Path + Type) must define how to open font for using on different OS +/// NOTE: OnEdit fix serializations: EmbossStylesSerializable, TextConfigurationSerialization +/// +struct EmbossStyle +{ + // Human readable name of style it is shown in GUI + std::string name; + + // Define how to open font + // Meaning depend on type + std::string path; + + enum class Type; + // Define what is stored in path + Type type { Type::undefined }; + + // User modification of font style + FontProp prop; + + // when name is empty than Font item was loaded from .3mf file + // and potentionaly it is not reproducable + // define data stored in path + // when wx change way of storing add new descriptor Type + enum class Type { + undefined = 0, + + // wx font descriptors are platform dependent + // path is font descriptor generated by wxWidgets + wx_win_font_descr, // on Windows + wx_lin_font_descr, // on Linux + wx_mac_font_descr, // on Max OS + + // TrueTypeFont file loacation on computer + // for privacy: only filename is stored into .3mf + file_path + }; + + bool operator==(const EmbossStyle &other) const + { + return + type == other.type && + prop == other.prop && + name == other.name && + path == other.path + ; + } + + // undo / redo stack recovery + template void serialize(Archive &ar){ + ar(name, path, type, prop); + } +}; + +// Emboss style name inside vector is unique +// It is not map beacuse items has own order (view inside of slect) +// It is stored into AppConfig by EmbossStylesSerializable +using EmbossStyles = std::vector; + +/// +/// Define how to create 'Text volume' +/// It is stored into .3mf by TextConfigurationSerialization +/// It is part of ModelVolume optional data +/// +struct TextConfiguration +{ + // Style of embossed text + EmbossStyle style; + + // Embossed text value + std::string text = "None"; + + // !!! Volume stored in .3mf has transformed vertices. + // (baked transformation into vertices position) + // Only place for fill this is when load from .3mf + // This is correct volume transformation + std::optional fix_3mf_tr; + + // undo / redo stack recovery + template void save(Archive &ar) const{ + ar(text, style); + cereal::save(ar, fix_3mf_tr); + } + template void load(Archive &ar){ + ar(text, style); + cereal::load(ar, fix_3mf_tr); + } +}; + +} // namespace Slic3r + +#endif // slic3r_TextConfiguration_hpp_ diff --git a/src/libslic3r/Thread.cpp b/src/libslic3r/Thread.cpp index c099f8de6c8..924fbe92236 100644 --- a/src/libslic3r/Thread.cpp +++ b/src/libslic3r/Thread.cpp @@ -4,6 +4,9 @@ #else // any posix system #include + #ifdef __APPLE__ + #include + #endif // __APPLE__ #endif #include @@ -188,6 +191,26 @@ std::optional get_current_thread_name() #endif // _WIN32 +// To be called at the start of the application to save the current thread ID as the main (UI) thread ID. +static boost::thread::id g_main_thread_id; + +void save_main_thread_id() +{ + g_main_thread_id = boost::this_thread::get_id(); +} + +// Retrieve the cached main (UI) thread ID. +boost::thread::id get_main_thread_id() +{ + return g_main_thread_id; +} + +// Checks whether the main (UI) thread is active. +bool is_main_thread_active() +{ + return get_main_thread_id() == boost::this_thread::get_id(); +} + // Spawn (n - 1) worker threads on Intel TBB thread pool and name them by an index and a system thread ID. // Also it sets locale of the worker threads to "C" for the G-code generator to produce "." as a decimal separator. void name_tbb_thread_pool_threads_set_locale() @@ -203,7 +226,7 @@ void name_tbb_thread_pool_threads_set_locale() const size_t nthreads_hw = tbb::this_task_arena::max_concurrency(); size_t nthreads = nthreads_hw; -#ifdef SLIC3R_PROFILE +#if 0 // Shiny profiler is not thread safe, thus disable parallelization. disable_multi_threading(); nthreads = 1; @@ -241,4 +264,27 @@ void name_tbb_thread_pool_threads_set_locale() }); } +void set_current_thread_qos() +{ +#ifdef __APPLE__ + // OSX specific: Set Quality of Service to "user initiated", so that the threads will be scheduled to high performance + // cores if available. + // With QOS_CLASS_USER_INITIATED the worker threads drop priority once slicer loses user focus. + pthread_set_qos_class_self_np(QOS_CLASS_USER_INTERACTIVE, 0); +#endif // __APPLE__ +} + +void TBBLocalesSetter::on_scheduler_entry(bool is_worker) +{ +// static std::atomic cnt = 0; +// std::cout << "TBBLocalesSetter Entering " << cnt ++ << " ID " << std::this_thread::get_id() << "\n"; + if (bool& is_locales_sets = m_is_locales_sets.local(); !is_locales_sets) { + // Set locales of the worker thread to "C". + set_c_locales(); + // OSX specific: Elevate QOS on Apple Silicon. + set_current_thread_qos(); + is_locales_sets = true; + } +} + } diff --git a/src/libslic3r/Thread.hpp b/src/libslic3r/Thread.hpp index 9afe13b42d4..19ad29801c5 100644 --- a/src/libslic3r/Thread.hpp +++ b/src/libslic3r/Thread.hpp @@ -6,6 +6,9 @@ #include #include +#include +#include + namespace Slic3r { // Set / get thread name. @@ -26,6 +29,17 @@ inline bool set_thread_name(boost::thread &thread, const std::string &thread_nam bool set_current_thread_name(const char *thread_name); inline bool set_current_thread_name(const std::string &thread_name) { return set_current_thread_name(thread_name.c_str()); } +// To be called at the start of the application to save the current thread ID as the main (UI) thread ID. +void save_main_thread_id(); +// Retrieve the cached main (UI) thread ID. +boost::thread::id get_main_thread_id(); +// Checks whether the main (UI) thread is active. +bool is_main_thread_active(); + +// OSX specific: Set Quality of Service to "user initiated", so that the threads will be scheduled to high performance +// cores if available. +void set_current_thread_qos(); + // Returns nullopt if not supported. // Not supported by OSX. // Naming threads is only supported on newer Windows 10. @@ -53,6 +67,25 @@ template inline boost::thread create_thread(Fn &&fn) return create_thread(attrs, std::forward(fn)); } +// For unknown reasons and in sporadic cases when GCode export is processing, some participating thread +// in tbb::parallel_pipeline has not set locales to "C", probably because this thread is newly spawned. +// So in this class method on_scheduler_entry is called for every thread before it starts participating +// in tbb::parallel_pipeline to ensure that locales are set correctly +// +// For tbb::parallel_pipeline, it seems that on_scheduler_entry is called for every layer and every filter. +// We ensure using thread-local storage that locales will be set to "C" just once for any participating thread. +class TBBLocalesSetter : public tbb::task_scheduler_observer +{ +public: + TBBLocalesSetter() { this->observe(true); } + ~TBBLocalesSetter() override { this->observe(false); }; + + void on_scheduler_entry(bool is_worker) override; + +private: + tbb::enumerable_thread_specific, tbb::ets_key_usage_type::ets_key_per_instance> m_is_locales_sets{ false }; +}; + } #endif // GUI_THREAD_HPP diff --git a/src/libslic3r/Timer.cpp b/src/libslic3r/Timer.cpp new file mode 100644 index 00000000000..b361427a655 --- /dev/null +++ b/src/libslic3r/Timer.cpp @@ -0,0 +1,12 @@ +#include "Timer.hpp" +#include + +using namespace std::chrono; + +Slic3r::Timer::Timer(const std::string &name) : m_name(name), m_start(steady_clock::now()) {} + +Slic3r::Timer::~Timer() +{ + BOOST_LOG_TRIVIAL(debug) << "Timer '" << m_name << "' spend " << + duration_cast(steady_clock::now() - m_start).count() << "ms"; +} diff --git a/src/libslic3r/Timer.hpp b/src/libslic3r/Timer.hpp new file mode 100644 index 00000000000..b8f9736a171 --- /dev/null +++ b/src/libslic3r/Timer.hpp @@ -0,0 +1,31 @@ +#ifndef libslic3r_Timer_hpp_ +#define libslic3r_Timer_hpp_ + +#include +#include + +namespace Slic3r { + +/// +/// Instance of this class is used for measure time consumtion +/// of block code until instance is alive and write result to debug output +/// +class Timer +{ + std::string m_name; + std::chrono::steady_clock::time_point m_start; +public: + /// + /// name describe timer + /// + /// Describe timer in consol log + Timer(const std::string& name); + + /// + /// name describe timer + /// + ~Timer(); +}; + +} // namespace Slic3r +#endif // libslic3r_Timer_hpp_ \ No newline at end of file diff --git a/src/libslic3r/TreeModelVolumes.cpp b/src/libslic3r/TreeModelVolumes.cpp new file mode 100644 index 00000000000..399685e9cf5 --- /dev/null +++ b/src/libslic3r/TreeModelVolumes.cpp @@ -0,0 +1,933 @@ +// Tree supports by Thomas Rahm, losely based on Tree Supports by CuraEngine. +// Original source of Thomas Rahm's tree supports: +// https://github.com/ThomasRahm/CuraEngine +// +// Original CuraEngine copyright: +// Copyright (c) 2021 Ultimaker B.V. +// CuraEngine is released under the terms of the AGPLv3 or higher. + +#include "TreeModelVolumes.hpp" +#include "TreeSupport.hpp" + +#include "BuildVolume.hpp" +#include "ClipperUtils.hpp" +#include "Flow.hpp" +#include "Layer.hpp" +#include "Point.hpp" +#include "Print.hpp" +#include "PrintConfig.hpp" +#include "Utils.hpp" + +#include + +#include + +#include +#include + +namespace Slic3r::FFFTreeSupport +{ + +using namespace std::literals; + +// or warning +// had to use a define beacuse the macro processing inside macro BOOST_LOG_TRIVIAL() +#define error_level_not_in_cache error + +TreeSupportMeshGroupSettings::TreeSupportMeshGroupSettings(const PrintObject &print_object) +{ + const PrintConfig &print_config = print_object.print()->config(); + const PrintObjectConfig &config = print_object.config(); + const SlicingParameters &slicing_params = print_object.slicing_parameters(); +// const std::vector printing_extruders = print_object.object_extruders(); + + // Support must be enabled and set to Tree style. + assert(config.support_material || config.support_material_enforce_layers > 0); + assert(config.support_material_style == smsTree || config.support_material_style == smsOrganic); + + // Calculate maximum external perimeter width over all printing regions, taking into account the default layer height. + coordf_t external_perimeter_width = 0.; + for (size_t region_id = 0; region_id < print_object.num_printing_regions(); ++ region_id) { + const PrintRegion ®ion = print_object.printing_region(region_id); + external_perimeter_width = std::max(external_perimeter_width, region.flow(print_object, frExternalPerimeter, config.layer_height).width()); + } + + this->layer_height = scaled(config.layer_height.value); + this->resolution = scaled(print_config.gcode_resolution.value); + // Arache feature + this->min_feature_size = scaled(config.min_feature_size.value); + // +1 makes the threshold inclusive + this->support_angle = 0.5 * M_PI - std::clamp((config.support_material_threshold + 1) * M_PI / 180., 0., 0.5 * M_PI); + this->support_line_width = support_material_flow(&print_object, config.layer_height).scaled_width(); + this->support_roof_line_width = support_material_interface_flow(&print_object, config.layer_height).scaled_width(); + //FIXME add it to SlicingParameters and reuse in both tree and normal supports? + this->support_bottom_enable = config.support_material_interface_layers.value > 0 && config.support_material_bottom_interface_layers.value != 0; + this->support_bottom_height = this->support_bottom_enable ? + (config.support_material_bottom_interface_layers.value > 0 ? + config.support_material_bottom_interface_layers.value : + config.support_material_interface_layers.value) * this->layer_height : + 0; + this->support_material_buildplate_only = config.support_material_buildplate_only; + this->support_xy_distance = scaled(config.support_material_xy_spacing.get_abs_value(external_perimeter_width)); + // Separation of interfaces, it is likely smaller than support_xy_distance. + this->support_xy_distance_overhang = std::min(this->support_xy_distance, scaled(0.5 * external_perimeter_width)); + this->support_top_distance = scaled(slicing_params.gap_support_object); + this->support_bottom_distance = scaled(slicing_params.gap_object_support); +// this->support_interface_skip_height = +// this->support_infill_angles = + this->support_roof_enable = config.support_material_interface_layers.value > 0; + this->support_roof_height = config.support_material_interface_layers.value * this->layer_height; +// this->minimum_roof_area = +// this->support_roof_angles = + this->support_roof_pattern = config.support_material_interface_pattern; + this->support_pattern = config.support_material_pattern; + this->support_line_spacing = scaled(config.support_material_spacing.value); +// this->support_bottom_offset = +// this->support_wall_count = config.support_material_with_sheath ? 1 : 0; + this->support_wall_count = 1; + this->support_roof_line_distance = scaled(config.support_material_interface_spacing.value) + this->support_roof_line_width; +// this->minimum_support_area = +// this->minimum_bottom_area = +// this->support_offset = + this->support_tree_branch_distance = scaled(config.support_tree_branch_distance.value); + this->support_tree_angle = std::clamp(config.support_tree_angle * M_PI / 180., 0., 0.5 * M_PI - EPSILON); + this->support_tree_angle_slow = std::clamp(config.support_tree_angle_slow * M_PI / 180., 0., this->support_tree_angle - EPSILON); + this->support_tree_branch_diameter = scaled(config.support_tree_branch_diameter.value); + this->support_tree_branch_diameter_angle = std::clamp(config.support_tree_branch_diameter_angle * M_PI / 180., 0., 0.5 * M_PI - EPSILON); + this->support_tree_top_rate = config.support_tree_top_rate.value; // percent +// this->support_tree_tip_diameter = this->support_line_width; + this->support_tree_tip_diameter = std::clamp(scaled(config.support_tree_tip_diameter.value), 0, this->support_tree_branch_diameter); +} + +//FIXME Machine border is currently ignored. +static Polygons calculateMachineBorderCollision(Polygon machine_border) +{ + // Put a border of 1m around the print volume so that we don't collide. +#if 1 + //FIXME just returning no border will let tree support legs collide with print bed boundary + return {}; +#else + //FIXME offsetting by 1000mm easily overflows int32_tr coordinate. + Polygons out = offset(machine_border, scaled(1000.), jtMiter, 1.2); + machine_border.reverse(); // Makes the polygon negative so that we subtract the actual volume from the collision area. + out.emplace_back(std::move(machine_border)); + return out; +#endif +} + +TreeModelVolumes::TreeModelVolumes( + const PrintObject &print_object, + const BuildVolume &build_volume, + const coord_t max_move, const coord_t max_move_slow, size_t current_mesh_idx, +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + double progress_multiplier, double progress_offset, +#endif // SLIC3R_TREESUPPORTS_PROGRESS + const std::vector& additional_excluded_areas) : + // -2 to avoid rounding errors + m_max_move{ std::max(max_move - 2, 0) }, m_max_move_slow{ std::max(max_move_slow - 2, 0) }, +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + m_progress_multiplier{ progress_multiplier }, m_progress_offset{ progress_offset }, +#endif // SLIC3R_TREESUPPORTS_PROGRESS + m_machine_border{ calculateMachineBorderCollision(build_volume.polygon()) } +{ +#if 0 + std::unordered_map mesh_to_layeroutline_idx; + for (size_t mesh_idx = 0; mesh_idx < storage.meshes.size(); ++ mesh_idx) { + SliceMeshStorage mesh = storage.meshes[mesh_idx]; + bool added = false; + for (size_t idx = 0; idx < m_layer_outlines.size(); ++ idx) + if (TreeSupport::TreeSupportSettings(m_layer_outlines[idx].first) == TreeSupport::TreeSupportSettings(mesh.settings)) { + added = true; + mesh_to_layeroutline_idx[mesh_idx] = idx; + } + if (! added) { + mesh_to_layeroutline_idx[mesh_idx] = m_layer_outlines.size(); + m_layer_outlines.emplace_back(mesh.settings, std::vector(storage.support.supportLayers.size(), Polygons())); + } + } + for (size_t idx = 0; idx < m_layer_outlines.size(); ++ idx) { + tbb::parallel_for(tbb::blocked_range(0, m_layer_outlines[idx].second.size()), + [&](const tbb::blocked_range &range) { + for (const size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) + m_layer_outlines[idx].second[layer_idx] = union_(m_layer_outlines[idx].second[layer_idx]); + }); + } + m_current_outline_idx = mesh_to_layeroutline_idx[current_mesh_idx]; + +#else + { + m_anti_overhang = print_object.slice_support_blockers(); + TreeSupportMeshGroupSettings mesh_settings(print_object); + const TreeSupportSettings config{ mesh_settings, print_object.slicing_parameters() }; + m_current_min_xy_dist = config.xy_min_distance; + m_current_min_xy_dist_delta = config.xy_distance - m_current_min_xy_dist; + assert(m_current_min_xy_dist_delta >= 0); + m_increase_until_radius = config.increase_radius_until_radius; + m_radius_0 = config.getRadius(0); + m_raft_layers = config.raft_layers; + m_current_outline_idx = 0; + + m_layer_outlines.emplace_back(mesh_settings, std::vector{}); + std::vector &outlines = m_layer_outlines.front().second; + size_t num_raft_layers = m_raft_layers.size(); + size_t num_layers = print_object.layer_count() + num_raft_layers; + outlines.assign(num_layers, Polygons{}); + tbb::parallel_for(tbb::blocked_range(num_raft_layers, num_layers, std::min(1, std::max(16, num_layers / (8 * tbb::this_task_arena::max_concurrency())))), + [&](const tbb::blocked_range &range) { + for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) + outlines[layer_idx] = to_polygons(expolygons_simplify(print_object.get_layer(layer_idx - num_raft_layers)->lslices, mesh_settings.resolution)); + }); + } +#endif + + m_support_rests_on_model = false; + m_min_resolution = std::numeric_limits::max(); + for (auto data_pair : m_layer_outlines) { + m_support_rests_on_model |= ! data_pair.first.support_material_buildplate_only; + m_min_resolution = std::min(m_min_resolution, data_pair.first.resolution); + } + +#if 0 + for (size_t mesh_idx = 0; mesh_idx < storage.meshes.size(); mesh_idx++) { + SliceMeshStorage mesh = storage.meshes[mesh_idx]; + tbb::parallel_for(tbb::blocked_range(0, m_layer_outlines[mesh_to_layeroutline_idx[mesh_idx]].second.size()), + [&](const tbb::blocked_range &range) { + for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) + if (layer_idx < mesh.layer_nr_max_filled_layer) { + Polygons outline = extractOutlineFromMesh(mesh, layer_idx); + append(m_layer_outlines[mesh_to_layeroutline_idx[mesh_idx]].second[layer_idx], outline); + } + }); + } + if (! additional_excluded_areas.empty()) { + tbb::parallel_for(tbb::blocked_range(0, m_anti_overhang.size()), + [&](const tbb::blocked_range &range) { + for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) { + if (layer_idx < coord_t(additional_excluded_areas.size())) + append(m_anti_overhang[layer_idx], additional_excluded_areas[layer_idx]); + // if (SUPPORT_TREE_AVOID_SUPPORT_BLOCKER) + // append(m_anti_overhang[layer_idx], storage.support.supportLayers[layer_idx].anti_overhang); + //FIXME block wipe tower + // if (storage.primeTower.enabled) + // append(m_anti_overhang[layer_idx], layer_idx == 0 ? storage.primeTower.outer_poly_first_layer : storage.primeTower.outer_poly); + m_anti_overhang[layer_idx] = union_(m_anti_overhang[layer_idx]); + } + }); + } +#endif +} + +void TreeModelVolumes::precalculate(const PrintObject& print_object, const coord_t max_layer, std::function throw_on_cancel) +{ + auto t_start = std::chrono::high_resolution_clock::now(); + m_precalculated = true; + + // Get the config corresponding to one mesh that is in the current group. Which one has to be irrelevant. + // Not the prettiest way to do this, but it ensures some calculations that may be a bit more complex + // like inital layer diameter are only done in once. + TreeSupportSettings config(m_layer_outlines[m_current_outline_idx].first, print_object.slicing_parameters()); + + { + // calculate which radius each layer in the tip may have. + std::vector possible_tip_radiis; + for (size_t distance_to_top = 0; distance_to_top <= config.tip_layers; ++ distance_to_top) { + possible_tip_radiis.emplace_back(ceilRadius(config.getRadius(distance_to_top))); + possible_tip_radiis.emplace_back(ceilRadius(config.getRadius(distance_to_top) + m_current_min_xy_dist_delta)); + } + sort_remove_duplicates(possible_tip_radiis); + // It theoretically may happen in the tip, that the radius can change so much in-between 2 layers, + // that a ceil step is skipped (as in there is a radius r so that ceilRadius(radius(dtt)) radius_until_layer; + // while it is possible to calculate, up to which layer the avoidance should be calculated, this simulation is easier to understand, and does not need to be adjusted if something of the radius calculation is changed. + // Overhead with an assumed worst case of 6600 layers was about 2ms + for (LayerIndex distance_to_top = 0; distance_to_top <= max_layer; ++ distance_to_top) { + const LayerIndex current_layer = max_layer - distance_to_top; + auto update_radius_until_layer = [&radius_until_layer, current_layer](coord_t r) { + auto it = radius_until_layer.find(r); + if (it == radius_until_layer.end()) + radius_until_layer.emplace_hint(it, r, current_layer); + }; + // regular radius + update_radius_until_layer(ceilRadius(config.getRadius(distance_to_top, 0) + m_current_min_xy_dist_delta)); + // the maximum radius that the radius with the min_xy_dist can achieve + update_radius_until_layer(ceilRadius(config.getRadius(distance_to_top, 0))); + update_radius_until_layer(ceilRadius(config.recommendedMinRadius(current_layer) + m_current_min_xy_dist_delta)); + } + + throw_on_cancel(); + + // Copy to deque to use in parallel for later. + std::vector relevant_avoidance_radiis{ radius_until_layer.begin(), radius_until_layer.end() }; + + // Append additional radiis needed for collision. + // To calculate collision holefree for every radius, the collision of radius m_increase_until_radius will be required. + radius_until_layer[ceilRadius(m_increase_until_radius + m_current_min_xy_dist_delta)] = max_layer; + // Collision for radius 0 needs to be calculated everywhere, as it will be used to ensure valid xy_distance in drawAreas. + radius_until_layer[0] = max_layer; + if (m_current_min_xy_dist_delta != 0) + radius_until_layer[m_current_min_xy_dist_delta] = max_layer; + + // Now that required_avoidance_limit contains the maximum of ild and regular required radius just copy. + std::vector relevant_collision_radiis{ radius_until_layer.begin(), radius_until_layer.end() }; + + // Calculate the relevant collisions + calculateCollision(relevant_collision_radiis, throw_on_cancel); + + // calculate a separate Collisions with all holes removed. These are relevant for some avoidances that try to avoid holes (called safe) + std::vector relevant_hole_collision_radiis; + for (RadiusLayerPair key : relevant_avoidance_radiis) + if (key.first < m_increase_until_radius + m_current_min_xy_dist_delta) + relevant_hole_collision_radiis.emplace_back(key); + + // Calculate collisions without holes, built from regular collision + calculateCollisionHolefree(relevant_hole_collision_radiis, throw_on_cancel); + // Let placables be calculated from calculateAvoidance() for better parallelization. + if (m_support_rests_on_model) + calculatePlaceables(relevant_avoidance_radiis, throw_on_cancel); + + auto t_coll = std::chrono::high_resolution_clock::now(); + + // Calculate the relevant avoidances in parallel as far as possible + { + tbb::task_group task_group; + task_group.run([this, relevant_avoidance_radiis, throw_on_cancel]{ calculateAvoidance(relevant_avoidance_radiis, true, m_support_rests_on_model, throw_on_cancel); }); + task_group.run([this, relevant_avoidance_radiis, throw_on_cancel]{ calculateWallRestrictions(relevant_avoidance_radiis, throw_on_cancel); }); + task_group.wait(); + } + auto t_end = std::chrono::high_resolution_clock::now(); + auto dur_col = 0.001 * std::chrono::duration_cast(t_coll - t_start).count(); + auto dur_avo = 0.001 * std::chrono::duration_cast(t_end - t_coll).count(); + +// m_precalculated = true; + BOOST_LOG_TRIVIAL(info) << "Precalculating collision took" << dur_col << " ms. Precalculating avoidance took " << dur_avo << " ms."; + +#if 0 + // Paint caches into SVGs: + auto paint_cache_into_SVGs = [this](const RadiusLayerPolygonCache &cache, std::string_view name) { + const std::vector>> sorted = cache.sorted(); + static constexpr const std::string_view colors[] = { + "red", "green", "blue", "magenta", "orange" + }; + static constexpr const size_t num_colors = sizeof(colors) / sizeof(colors[0]); + for (size_t i = 0; i < sorted.size();) { + // Find range of cache items with the same layer index. + size_t j = i; + for (++ j; j < sorted.size() && sorted[i].first.second == sorted[j].first.second; ++ j) ; + // Collect expolygons in reverse order (largest to smallest). + std::vector> expolygons_with_attributes; + for (int k = int(j - 1); k >= int(i); -- k) { + std::string legend = format("radius-%1%", unscaled(sorted[k].first.first)); + expolygons_with_attributes.push_back({ union_ex(sorted[k].second), SVG::ExPolygonAttributes(legend, std::string(colors[(k - int(i)) % num_colors]), 1.) }); + SVG::export_expolygons(debug_out_path("treesupport_cache-%s-%d-%s.svg", name.data(), sorted[i].first.second, legend.c_str()), { expolygons_with_attributes.back() }); + } + // Render the range of per radius collision polygons into a common SVG. + SVG::export_expolygons(debug_out_path("treesupport_cache-%s-%d.svg", name.data(), sorted[i].first.second), expolygons_with_attributes); + i = j; + } + }; + paint_cache_into_SVGs(m_collision_cache, "collision_cache"); + paint_cache_into_SVGs(m_collision_cache_holefree, "collision_cache_holefree"); + paint_cache_into_SVGs(m_avoidance_cache, "avoidance_cache"); + paint_cache_into_SVGs(m_avoidance_cache_slow, "avoidance_cache_slow"); + paint_cache_into_SVGs(m_avoidance_cache_to_model, "avoidance_cache_to_model"); + paint_cache_into_SVGs(m_avoidance_cache_to_model_slow, "avoidance_cache_to_model_slow"); + paint_cache_into_SVGs(m_placeable_areas_cache, "placable_areas_cache"); + paint_cache_into_SVGs(m_avoidance_cache_holefree, "avoidance_cache_holefree"); + paint_cache_into_SVGs(m_avoidance_cache_holefree_to_model, "avoidance_cache_holefree_to_model"); + paint_cache_into_SVGs(m_wall_restrictions_cache, "wall_restrictions_cache"); + paint_cache_into_SVGs(m_wall_restrictions_cache_min, "wall_restrictions_cache_min"); +#endif +} + +const Polygons& TreeModelVolumes::getCollision(const coord_t orig_radius, LayerIndex layer_idx, bool min_xy_dist) const +{ + const coord_t radius = this->ceilRadius(orig_radius, min_xy_dist); + if (std::optional> result = m_collision_cache.getArea({ radius, layer_idx }); result) + return (*result).get(); + if (m_precalculated) { + BOOST_LOG_TRIVIAL(error_level_not_in_cache) << "Had to calculate collision at radius " << radius << " and layer " << layer_idx << ", but precalculate was called. Performance may suffer!"; + tree_supports_show_error("Not precalculated Collision requested."sv, false); + } + const_cast(this)->calculateCollision(radius, layer_idx, {}); + return getCollision(orig_radius, layer_idx, min_xy_dist); +} + +// Get a collision area at a given layer for a radius that is a lower or equial to the key radius. +// It is expected that the collision area is precalculated for a given layer at least for the radius zero. +// Used for pushing tree supports away from object during the final Organic optimization step. +std::optional>> TreeModelVolumes::get_collision_lower_bound_area(LayerIndex layer_id, coord_t max_radius) const +{ + return m_collision_cache.get_lower_bound_area({ max_radius, layer_id }); +} + +// Private. Only called internally by calculateAvoidance() and calculateAvoidanceToModel(), radius is already snapped to grid. +const Polygons& TreeModelVolumes::getCollisionHolefree(coord_t radius, LayerIndex layer_idx) const +{ + assert(radius == this->ceilRadius(radius)); + assert(radius < m_increase_until_radius + m_current_min_xy_dist_delta); + if (std::optional> result = m_collision_cache_holefree.getArea({ radius, layer_idx }); result) + return (*result).get(); + if (m_precalculated) { + BOOST_LOG_TRIVIAL(error_level_not_in_cache) << "Had to calculate collision holefree at radius " << radius << " and layer " << layer_idx << ", but precalculate was called. Performance may suffer!"; + tree_supports_show_error("Not precalculated Holefree Collision requested."sv, false); + } + const_cast(this)->calculateCollisionHolefree({ radius, layer_idx }); + return getCollisionHolefree(radius, layer_idx); +} + +const Polygons& TreeModelVolumes::getAvoidance(const coord_t orig_radius, LayerIndex layer_idx, AvoidanceType type, bool to_model, bool min_xy_dist) const +{ + if (layer_idx == 0) // What on the layer directly above buildplate do i have to avoid to reach the buildplate ... + return getCollision(orig_radius, layer_idx, min_xy_dist); + + const coord_t radius = this->ceilRadius(orig_radius, min_xy_dist); + if (type == AvoidanceType::FastSafe && radius >= m_increase_until_radius + m_current_min_xy_dist_delta) + // no holes anymore by definition at this request + type = AvoidanceType::Fast; + + if (std::optional> result = + this->avoidance_cache(type, to_model).getArea({ radius, layer_idx }); + result) + return (*result).get(); + + if (m_precalculated) { + if (to_model) { + BOOST_LOG_TRIVIAL(error_level_not_in_cache) << "Had to calculate Avoidance to model at radius " << radius << " and layer " << layer_idx << ", but precalculate was called. Performance may suffer!"; + tree_supports_show_error("Not precalculated Avoidance(to model) requested."sv, false); + } else { + BOOST_LOG_TRIVIAL(error_level_not_in_cache) << "Had to calculate Avoidance at radius " << radius << " and layer " << layer_idx << ", but precalculate was called. Performance may suffer!"; + tree_supports_show_error("Not precalculated Avoidance(to buildplate) requested."sv, false); + } + } + const_cast(this)->calculateAvoidance({ radius, layer_idx }, ! to_model, to_model); + // Retrive failed and correct result was calculated. Now it has to be retrived. + return getAvoidance(orig_radius, layer_idx, type, to_model, min_xy_dist); +} + +const Polygons& TreeModelVolumes::getPlaceableAreas(const coord_t orig_radius, LayerIndex layer_idx, std::function throw_on_cancel) const +{ + const coord_t radius = ceilRadius(orig_radius); + if (std::optional> result = m_placeable_areas_cache.getArea({ radius, layer_idx }); result) + return (*result).get(); + if (m_precalculated) { + BOOST_LOG_TRIVIAL(error_level_not_in_cache) << "Had to calculate Placeable Areas at radius " << radius << " and layer " << layer_idx << ", but precalculate was called. Performance may suffer!"; + tree_supports_show_error("Not precalculated Placeable areas requested."sv, false); + } + if (orig_radius == 0) + // Placable areas for radius 0 are calculated in the general collision code. + return this->getCollision(0, layer_idx, true); + else + const_cast(this)->calculatePlaceables(radius, layer_idx, throw_on_cancel); + return getPlaceableAreas(orig_radius, layer_idx, throw_on_cancel); +} + +const Polygons& TreeModelVolumes::getWallRestriction(const coord_t orig_radius, LayerIndex layer_idx, bool min_xy_dist) const +{ + assert(layer_idx > 0); + if (layer_idx == 0) + // Should never be requested as there will be no going below layer 0 ..., + // but just to be sure some semi-sane catch. Alternative would be empty Polygon. + return getCollision(orig_radius, layer_idx, min_xy_dist); + + min_xy_dist &= m_current_min_xy_dist_delta > 0; + + const coord_t radius = ceilRadius(orig_radius); + if (std::optional> result = + (min_xy_dist ? m_wall_restrictions_cache_min : m_wall_restrictions_cache).getArea({ radius, layer_idx }); + result) + return (*result).get(); + if (m_precalculated) { + BOOST_LOG_TRIVIAL(error_level_not_in_cache) << "Had to calculate Wall restricions at radius " << radius << " and layer " << layer_idx << ", but precalculate was called. Performance may suffer!"; + tree_supports_show_error( + min_xy_dist ? + "Not precalculated Wall restriction of minimum xy distance requested )." : + "Not precalculated Wall restriction requested )."sv + , false); + } + const_cast(this)->calculateWallRestrictions({ radius, layer_idx }); + return getWallRestriction(orig_radius, layer_idx, min_xy_dist); // Retrieve failed and correct result was calculated. Now it has to be retrieved. +} + +void TreeModelVolumes::calculateCollision(const std::vector &keys, std::function throw_on_cancel) +{ + tbb::parallel_for(tbb::blocked_range(0, keys.size()), + [&](const tbb::blocked_range &range) { + for (size_t ikey = range.begin(); ikey != range.end(); ++ ikey) { + const LayerIndex radius = keys[ikey].first; + const size_t max_layer_idx = keys[ikey].second; + // recursive call to parallel_for. + calculateCollision(radius, max_layer_idx, throw_on_cancel); + } + }); +} + +// Calculate collisions and placable areas for radius and for layer 0 to max_layer_idx inclusive. +void TreeModelVolumes::calculateCollision(const coord_t radius, const LayerIndex max_layer_idx, std::function throw_on_cancel) +{ +// assert(radius == this->ceilRadius(radius)); + + // Process the outlines from least layers to most layers so that the final union will run over the longest vector. + std::vector layer_outline_indices(m_layer_outlines.size(), 0); + std::iota(layer_outline_indices.begin(), layer_outline_indices.end(), 0); + std::sort(layer_outline_indices.begin(), layer_outline_indices.end(), + [this](size_t i, size_t j) { return m_layer_outlines[i].second.size() < m_layer_outlines[j].second.size(); }); + + // Layer range for which the collisions will be calculated. + LayerPolygonCache data; + data.allocate(m_collision_cache.getMaxCalculatedLayer(radius) + 1, max_layer_idx + 1); + + const bool calculate_placable = m_support_rests_on_model && radius == 0; + LayerPolygonCache data_placeable; + if (calculate_placable) + data_placeable.allocate(data.idx_begin, data.idx_end); + + for (size_t outline_idx : layer_outline_indices) + if (const std::vector &outlines = m_layer_outlines[outline_idx].second; ! outlines.empty()) { + const TreeSupportMeshGroupSettings &settings = m_layer_outlines[outline_idx].first; + const coord_t layer_height = settings.layer_height; + const int z_distance_bottom_layers = int(round(double(settings.support_bottom_distance) / double(layer_height))); + const int z_distance_top_layers = int(round(double(settings.support_top_distance) / double(layer_height))); + const coord_t xy_distance = outline_idx == m_current_outline_idx ? m_current_min_xy_dist : + // technically this causes collision for the normal xy_distance to be larger by m_current_min_xy_dist_delta for all + // not currently processing meshes as this delta will be added at request time. + // avoiding this would require saving each collision for each outline_idx separately. + // and later for each avoidance... But avoidance calculation has to be for the whole scene and can NOT be done for each outline_idx separately and combined later. + // so avoiding this inaccuracy seems infeasible as it would require 2x the avoidance calculations => 0.5x the performance. + //FIXME support_xy_distance is not corrected for "soluble" flag, see TreeSupportSettings constructor. + settings.support_xy_distance; + + // 1) Calculate offsets of collision areas in parallel. + LayerPolygonCache collision_areas_offsetted; + collision_areas_offsetted.allocate( + std::max(0, data.idx_begin - z_distance_bottom_layers), + std::min(outlines.size(), data.idx_end + z_distance_top_layers)); + tbb::parallel_for(tbb::blocked_range(collision_areas_offsetted.idx_begin, collision_areas_offsetted.idx_end), + [&outlines, &machine_border = std::as_const(m_machine_border), offset_value = radius + xy_distance, &collision_areas_offsetted, &throw_on_cancel] + (const tbb::blocked_range &range) { + for (LayerIndex layer_idx = range.begin(); layer_idx != range.end(); ++ layer_idx) { + Polygons collision_areas = machine_border; + append(collision_areas, outlines[layer_idx]); + // jtRound is not needed here, as the overshoot can not cause errors in the algorithm, because no assumptions are made about the model. + // if a key does not exist when it is accessed it is added! + collision_areas_offsetted[layer_idx] = offset_value == 0 ? + union_(collision_areas) : + offset(union_ex(collision_areas), offset_value, ClipperLib::jtMiter, 1.2); + throw_on_cancel(); + } + }); + + // 2) Sum over top / bottom ranges. + const bool processing_last_mesh = outline_idx == layer_outline_indices.size(); + tbb::parallel_for(tbb::blocked_range(data.idx_begin, data.idx_end), + [&collision_areas_offsetted, &outlines, &machine_border = m_machine_border, &anti_overhang = m_anti_overhang, radius, + xy_distance, z_distance_bottom_layers, z_distance_top_layers, min_resolution = m_min_resolution, &data, processing_last_mesh, &throw_on_cancel] + (const tbb::blocked_range& range) { + for (LayerIndex layer_idx = range.begin(); layer_idx != range.end(); ++ layer_idx) { + Polygons collisions; + for (int i = - z_distance_bottom_layers; i <= 0; ++ i) + if (int j = layer_idx + i; collision_areas_offsetted.has(j)) + append(collisions, collision_areas_offsetted[j]); + for (int i = 1; i <= z_distance_top_layers; ++ i) + if (int j = layer_idx + i; j < int(outlines.size())) { + Polygons collision_areas_original = machine_border; + append(collision_areas_original, outlines[j]); + + // If just the collision (including the xy distance) of the layers above is accumulated, it leads to the + // following issue: + // Example: assuming the z distance is 2 layer + // + = xy_distance + // - = model + // o = overhang of the area two layers above that should result in tips on this layer + // + // +-----+ + // +-----+ + // +-----+ + // o +-----+ + // If just the collision above is accumulated the overhang will get overwritten by the xy_distance of the + // layer below the overhang... + // + // This only causes issues if the overhang area is thinner than xy_distance + // Just accumulating areas of the model above without the xy distance is also problematic, as then support + // may get closer to the model (on the diagonal downwards) than the user intended. Example (s = support): + // +-----+ + // +-----+ + // +-----+ + // s+-----+ + + // technically the calculation below is off by one layer, as the actual distance between plastic one layer + // down is 0 not layer height, as this layer is filled with said plastic. But otherwise a part of the + // overhang that is expected to be supported is overwritten by the remaining part of the xy distance of the + // layer below the to be supported area. + coord_t required_range_x = + (xy_distance - ((i - (z_distance_top_layers == 1 ? 0.5 : 0)) * xy_distance / z_distance_top_layers)); + // the conditional -0.5 ensures that plastic can never touch on the diagonal + // downward when the z_distance_top_layers = 1. It is assumed to be better to + // not support an overhang<90 degree than to risk fusing to it. + append(collisions, offset(union_ex(collision_areas_original), radius + required_range_x, ClipperLib::jtMiter, 1.2)); + } + collisions = processing_last_mesh && layer_idx < int(anti_overhang.size()) ? + union_(collisions, offset(union_ex(anti_overhang[layer_idx]), radius, ClipperLib::jtMiter, 1.2)) : + union_(collisions); + auto &dst = data[layer_idx]; + if (processing_last_mesh) { + if (! dst.empty()) + collisions = union_(collisions, dst); + dst = polygons_simplify(collisions, min_resolution); + } else + append(dst, std::move(collisions)); + throw_on_cancel(); + } + }); + + // 3) Optionally calculate placables. + if (calculate_placable) { + // Now calculate the placable areas. + tbb::parallel_for(tbb::blocked_range(std::max(data.idx_begin, 1), data.idx_end), + [&collision_areas_offsetted, &anti_overhang = m_anti_overhang, processing_last_mesh, + min_resolution = m_min_resolution, &data_placeable, &throw_on_cancel] + (const tbb::blocked_range& range) { + for (LayerIndex layer_idx = range.begin(); layer_idx != range.end(); ++ layer_idx) { + LayerIndex layer_idx_below = layer_idx - 1; + assert(layer_idx_below >= 0); + const Polygons ¤t = collision_areas_offsetted[layer_idx]; + const Polygons &below = collision_areas_offsetted[layer_idx_below]; + Polygons placable = diff(below, layer_idx_below < int(anti_overhang.size()) ? union_(current, anti_overhang[layer_idx_below]) : current); + auto &dst = data_placeable[layer_idx]; + if (processing_last_mesh) { + if (! dst.empty()) + placable = union_(placable, dst); + dst = polygons_simplify(placable, min_resolution); + } else + append(dst, placable); + throw_on_cancel(); + } + }); + } else { + // Calculating just the collision areas. + } + } +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + { + std::lock_guard critical_section(*m_critical_progress); + if (m_precalculated && m_precalculation_progress < TREE_PROGRESS_PRECALC_COLL) { + m_precalculation_progress += TREE_PROGRESS_PRECALC_COLL / keys.size(); + Progress::messageProgress(Progress::Stage::SUPPORT, m_precalculation_progress * m_progress_multiplier + m_progress_offset, TREE_PROGRESS_TOTAL); + } + } +#endif + throw_on_cancel(); + m_collision_cache.insert(std::move(data), radius); + if (calculate_placable) + m_placeable_areas_cache.insert(std::move(data_placeable), radius); +} + +void TreeModelVolumes::calculateCollisionHolefree(const std::vector &keys, std::function throw_on_cancel) +{ + LayerIndex max_layer = 0; + for (long long unsigned int i = 0; i < keys.size(); i++) + max_layer = std::max(max_layer, keys[i].second); + + tbb::parallel_for(tbb::blocked_range(0, max_layer + 1, keys.size()), + [&](const tbb::blocked_range &range) { + std::vector> data; + data.reserve(range.size() * keys.size()); + for (LayerIndex layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) { + for (RadiusLayerPair key : keys) + if (layer_idx <= key.second) { + // Logically increase the collision by m_increase_until_radius + coord_t radius = key.first; + assert(radius == this->ceilRadius(radius)); + assert(radius < m_increase_until_radius + m_current_min_xy_dist_delta); + coord_t increase_radius_ceil = ceilRadius(m_increase_until_radius, false) - radius; + assert(increase_radius_ceil > 0); + // this union is important as otherwise holes(in form of lines that will increase to holes in a later step) can get unioned onto the area. + data.emplace_back(RadiusLayerPair(radius, layer_idx), polygons_simplify( + offset(union_ex(this->getCollision(m_increase_until_radius, layer_idx, false)), + 5 - increase_radius_ceil, ClipperLib::jtRound, m_min_resolution), + m_min_resolution)); + throw_on_cancel(); + } + } + m_collision_cache_holefree.insert(std::move(data)); + }); +} + +void TreeModelVolumes::calculateAvoidance(const std::vector &keys, bool to_build_plate, bool to_model, std::function throw_on_cancel) +{ + // For every RadiusLayer pair there are 3 avoidances that have to be calculated. + // Prepare tasks for parallelization. + struct AvoidanceTask { + AvoidanceType type; + coord_t radius; + LayerIndex max_required_layer; + bool to_model; + LayerIndex start_layer; + + bool slow() const { return this->type == AvoidanceType::Slow; } + bool holefree() const { return this->type == AvoidanceType::FastSafe; } + }; + + std::vector avoidance_tasks; + avoidance_tasks.reserve((int(to_build_plate) + int(to_model)) * keys.size() * size_t(AvoidanceType::Count)); + + for (int iter_idx = 0; iter_idx < 2 * int(keys.size()) * int(AvoidanceType::Count); ++ iter_idx) { + AvoidanceTask task{ + AvoidanceType(iter_idx % int(AvoidanceType::Count)), + keys[iter_idx / 6].first, // radius + keys[iter_idx / 6].second, // max_layer + ((iter_idx / 3) & 1) != 0 // to_model + }; + // Ensure start_layer is at least 1 as if no avoidance was calculated yet getMaxCalculatedLayer() returns -1. + task.start_layer = std::max(1, 1 + avoidance_cache(task.type, task.to_model).getMaxCalculatedLayer(task.radius)); + if (task.start_layer > task.max_required_layer) { + BOOST_LOG_TRIVIAL(debug) << "Calculation requested for value already calculated?"; + continue; + } + if ((task.to_model ? to_model : to_build_plate) && + (! task.holefree() || task.radius < m_increase_until_radius + m_current_min_xy_dist_delta)) + avoidance_tasks.emplace_back(task); + } + + throw_on_cancel(); + + tbb::parallel_for(tbb::blocked_range(0, avoidance_tasks.size(), 1), + [this, &avoidance_tasks, &throw_on_cancel](const tbb::blocked_range &range) { + for (size_t task_idx = range.begin(); task_idx < range.end(); ++ task_idx) { + const AvoidanceTask &task = avoidance_tasks[task_idx]; + assert(! task.holefree() || task.radius < m_increase_until_radius + m_current_min_xy_dist_delta); + if (task.to_model) + // ensuring Placeableareas are calculated + //FIXME pass throw_on_cancel + getPlaceableAreas(task.radius, task.max_required_layer, throw_on_cancel); + // The following loop propagating avoidance regions bottom up is inherently serial. + const bool collision_holefree = (task.slow() || task.holefree()) && task.radius < m_increase_until_radius + m_current_min_xy_dist_delta; + const float max_move = task.slow() ? m_max_move_slow : m_max_move; + // Limiting the offset step so that unioning the shrunk latest_avoidance with the current layer collisions + // will not create gaps in the resulting avoidance region letting a tree support branch tunneling through an object wall. + float move_step = 1.9 * std::max(task.radius, m_current_min_xy_dist); + int move_steps = round_up_divide(max_move, move_step); + assert(move_steps > 0); + float last_move_step = max_move - (move_steps - 1) * move_step; + if (last_move_step < scaled(0.05)) { + assert(move_steps > 1); + if (move_steps > 1) { + // Avoid taking a very short last step, stretch the other steps a bit instead. + move_step = max_move / (-- move_steps); + last_move_step = move_step; + } + } + // minDist as the delta was already added, also avoidance for layer 0 will return the collision. + Polygons latest_avoidance = getAvoidance(task.radius, task.start_layer - 1, task.type, task.to_model, true); + std::vector> data; + data.reserve(task.max_required_layer + 1 - task.start_layer); + for (LayerIndex layer_idx = task.start_layer; layer_idx <= task.max_required_layer; ++ layer_idx) { + // Merge current layer collisions with shrunk last_avoidance. + const Polygons ¤t_layer_collisions = collision_holefree ? getCollisionHolefree(task.radius, layer_idx) : getCollision(task.radius, layer_idx, true); + // For mildly steep branch angles only one step will be taken. + for (int istep = 0; istep < move_steps; ++ istep) + latest_avoidance = union_(current_layer_collisions, + offset(latest_avoidance, + istep + 1 == move_steps ? - last_move_step : - move_step, + ClipperLib::jtRound, m_min_resolution)); + if (task.to_model) + latest_avoidance = diff(latest_avoidance, getPlaceableAreas(task.radius, layer_idx, throw_on_cancel)); + latest_avoidance = polygons_simplify(latest_avoidance, m_min_resolution); + data.emplace_back(RadiusLayerPair{task.radius, layer_idx}, latest_avoidance); + throw_on_cancel(); + } +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + { + std::lock_guard critical_section(*m_critical_progress); + if (m_precalculated && m_precalculation_progress < TREE_PROGRESS_PRECALC_COLL + TREE_PROGRESS_PRECALC_AVO) { + m_precalculation_progress += to_model ? + 0.4 * TREE_PROGRESS_PRECALC_AVO / (keys.size() * 3) : + m_support_rests_on_model ? 0.4 : 1 * TREE_PROGRESS_PRECALC_AVO / (keys.size() * 3); + Progress::messageProgress(Progress::Stage::SUPPORT, m_precalculation_progress * m_progress_multiplier + m_progress_offset, TREE_PROGRESS_TOTAL); + } + } +#endif + avoidance_cache(task.type, task.to_model).insert(std::move(data)); + } + }); +} + + +void TreeModelVolumes::calculatePlaceables(const std::vector &keys, std::function throw_on_cancel) +{ + tbb::parallel_for(tbb::blocked_range(0, keys.size()), + [&, keys](const tbb::blocked_range& range) { + for (size_t key_idx = range.begin(); key_idx < range.end(); ++ key_idx) + this->calculatePlaceables(keys[key_idx].first, keys[key_idx].second, throw_on_cancel); + }); +} + +void TreeModelVolumes::calculatePlaceables(const coord_t radius, const LayerIndex max_required_layer, std::function throw_on_cancel) +{ + LayerIndex start_layer = 1 + m_placeable_areas_cache.getMaxCalculatedLayer(radius); + if (start_layer > max_required_layer) { + BOOST_LOG_TRIVIAL(debug) << "Requested calculation for value already calculated ?"; + return; + } + + std::vector data(max_required_layer + 1 - start_layer, Polygons{}); + + if (start_layer == 0) + data[0] = diff(m_machine_border, getCollision(radius, 0, true)); + + tbb::parallel_for(tbb::blocked_range(std::max(1, start_layer), max_required_layer + 1), + [this, &data, radius, start_layer, &throw_on_cancel](const tbb::blocked_range& range) { + for (LayerIndex layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) { + data[layer_idx - start_layer] = offset( + union_ex(getPlaceableAreas(0, layer_idx, throw_on_cancel)), + // As a placeable area is calculated by (collision of the layer below) - (collision of the current layer) and the collision is offset by xy_distance, + // it can happen that a small line is considered a flat area to place something onto, even though it is mostly + // xy_distance that cant support it. Making the area smaller by xy_distance fixes this. + - (radius + m_current_min_xy_dist + m_current_min_xy_dist_delta), + jtMiter, 1.2); + throw_on_cancel(); + } + }); +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + { + std::lock_guard critical_section(*m_critical_progress); + if (m_precalculated && m_precalculation_progress < TREE_PROGRESS_PRECALC_COLL + TREE_PROGRESS_PRECALC_AVO) { + m_precalculation_progress += 0.2 * TREE_PROGRESS_PRECALC_AVO / (keys.size()); + Progress::messageProgress(Progress::Stage::SUPPORT, m_precalculation_progress * m_progress_multiplier + m_progress_offset, TREE_PROGRESS_TOTAL); + } + } +#endif + m_placeable_areas_cache.insert(std::move(data), start_layer, radius); +} + +void TreeModelVolumes::calculateWallRestrictions(const std::vector &keys, std::function throw_on_cancel) +{ + // Wall restrictions are mainly important when they represent actual walls that are printed, and not "just" the configured z_distance, because technically valid placement is no excuse for moving through a wall. + // As they exist to prevent accidentially moving though a wall at high speed between layers like thie (x = wall,i = influence area,o= empty space,d = blocked area because of z distance) Assume maximum movement distance is two characters and maximum safe movement distance of one character + + /* Potential issue addressed by the wall restrictions: Influence area may lag through a wall + * layer z+1:iiiiiiiiiiioooo + * layer z+0:xxxxxiiiiiiiooo + * layer z-1:ooooixxxxxxxxxx + */ + + // The radius for the upper collission has to be 0 as otherwise one may not enter areas that may be forbidden on layer_idx but not one below (c = not an influence area even though it should ): + /* + * layer z+1:xxxxxiiiiiioo + * layer z+0:dddddiiiiiiio + * layer z-1:dddocdddddddd + */ + // Also there can not just the collision of the lower layer be used because if it were: + /* + * layer z+1:dddddiiiiiiiiiio + * layer z+0:xxxxxddddddddddc + * layer z-1:dddddxxxxxxxxxxc + */ + // Or of the upper layer be used because if it were: + /* + * layer z+1:dddddiiiiiiiiiio + * layer z+0:xxxxcddddddddddc + * layer z-1:ddddcxxxxxxxxxxc + */ + + // And just offseting with maximum movement distance (and not in multiple steps) could cause: + /* + * layer z: oxiiiiiiiiioo + * layer z-1: ixiiiiiiiiiii + */ + + tbb::parallel_for(tbb::blocked_range(0, keys.size()), + [&, keys](const tbb::blocked_range &range) { + for (size_t key_idx = range.begin(); key_idx < range.end(); ++ key_idx) { + const coord_t radius = keys[key_idx].first; + const LayerIndex max_required_layer = keys[key_idx].second; + const coord_t min_layer_bottom = std::max(1, m_wall_restrictions_cache.getMaxCalculatedLayer(radius)); + const size_t buffer_size = max_required_layer + 1 - min_layer_bottom; + std::vector data(buffer_size, Polygons{}); + std::vector data_min; + if (m_current_min_xy_dist_delta > 0) + data_min.assign(buffer_size, Polygons{}); + tbb::parallel_for(tbb::blocked_range(min_layer_bottom, max_required_layer + 1), + [this, &data, &data_min, radius, min_layer_bottom, &throw_on_cancel](const tbb::blocked_range &range) { + for (LayerIndex layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) { + data[layer_idx - min_layer_bottom] = polygons_simplify( + // radius contains m_current_min_xy_dist_delta already if required + intersection(getCollision(0, layer_idx, false), getCollision(radius, layer_idx - 1, true)), + m_min_resolution); + if (! data_min.empty()) + data_min[layer_idx - min_layer_bottom] = + polygons_simplify( + intersection(getCollision(0, layer_idx, true), getCollision(radius, layer_idx - 1, true)), + m_min_resolution); + throw_on_cancel(); + } + }); + m_wall_restrictions_cache.insert(std::move(data), min_layer_bottom, radius); + if (! data_min.empty()) + m_wall_restrictions_cache_min.insert(std::move(data_min), min_layer_bottom, radius); + } + }); +} + +coord_t TreeModelVolumes::ceilRadius(const coord_t radius) const +{ + if (radius == 0) + return 0; + + coord_t out = m_radius_0; + if (radius > m_radius_0) { + // generate SUPPORT_TREE_PRE_EXPONENTIAL_STEPS of radiis before starting to exponentially increase them. + coord_t initial_radius_delta = SUPPORT_TREE_EXPONENTIAL_THRESHOLD - m_radius_0; + auto ignore = [this](coord_t r) { return std::binary_search(m_ignorable_radii.begin(), m_ignorable_radii.end(), r); }; + if (initial_radius_delta > SUPPORT_TREE_COLLISION_RESOLUTION) { + const int num_steps = round_up_divide(initial_radius_delta, SUPPORT_TREE_EXPONENTIAL_THRESHOLD); + const int stepsize = initial_radius_delta / num_steps; + out += stepsize; + for (auto step = 0; step < num_steps; ++ step) { + if (out >= radius && ! ignore(out)) + return out; + out += stepsize; + } + } else + out += SUPPORT_TREE_COLLISION_RESOLUTION; + while (out < radius || ignore(out)) { + assert(out * SUPPORT_TREE_EXPONENTIAL_FACTOR > out + SUPPORT_TREE_COLLISION_RESOLUTION); + out = out * SUPPORT_TREE_EXPONENTIAL_FACTOR; + } + } + return out; +} + +void TreeModelVolumes::RadiusLayerPolygonCache::allocate_layers(size_t num_layers) +{ + if (num_layers > m_data.size()) { + if (num_layers > m_data.capacity()) + reserve_power_of_2(m_data, num_layers); + m_data.resize(num_layers, {}); + } +} + +// For debugging purposes, sorted by layer index, then by radius. +std::vector>> TreeModelVolumes::RadiusLayerPolygonCache::sorted() const +{ + std::vector>> out; + for (auto &layer : m_data) { + auto layer_idx = LayerIndex(&layer - m_data.data()); + for (auto &radius_polygons : layer) + out.emplace_back(std::make_pair(radius_polygons.first, layer_idx), radius_polygons.second); + } + assert(std::is_sorted(out.begin(), out.end(), [](auto &l, auto &r){ return l.first.second < r.first.second || (l.first.second == r.first.second) && l.first.first < r.first.first; })); + return out; +} + +} // namespace Slic3r::FFFTreeSupport diff --git a/src/libslic3r/TreeModelVolumes.hpp b/src/libslic3r/TreeModelVolumes.hpp new file mode 100644 index 00000000000..f5b5669bbe4 --- /dev/null +++ b/src/libslic3r/TreeModelVolumes.hpp @@ -0,0 +1,711 @@ +// Tree supports by Thomas Rahm, losely based on Tree Supports by CuraEngine. +// Original source of Thomas Rahm's tree supports: +// https://github.com/ThomasRahm/CuraEngine +// +// Original CuraEngine copyright: +// Copyright (c) 2021 Ultimaker B.V. +// CuraEngine is released under the terms of the AGPLv3 or higher. + +#ifndef slic3r_TreeModelVolumes_hpp +#define slic3r_TreeModelVolumes_hpp + +#include +#include + +#include + +#include "Point.hpp" +#include "Polygon.hpp" +#include "PrintConfig.hpp" + +namespace Slic3r +{ + +class BuildVolume; +class PrintObject; + +namespace FFFTreeSupport +{ + +using LayerIndex = int; + +struct TreeSupportMeshGroupSettings { + TreeSupportMeshGroupSettings() = default; + explicit TreeSupportMeshGroupSettings(const PrintObject &print_object); + +/*********************************************************************/ +/* Print parameters, not support specific: */ +/*********************************************************************/ + coord_t layer_height { scaled(0.15) }; + // Maximum Deviation (meshfix_maximum_deviation) + // The maximum deviation allowed when reducing the resolution for the Maximum Resolution setting. If you increase this, + // the print will be less accurate, but the g-code will be smaller. Maximum Deviation is a limit for Maximum Resolution, + // so if the two conflict the Maximum Deviation will always be held true. + coord_t resolution { scaled(0.025) }; + // Minimum Feature Size (aka minimum line width) - Arachne specific + // Minimum thickness of thin features. Model features that are thinner than this value will not be printed, while features thicker + // than the Minimum Feature Size will be widened to the Minimum Wall Line Width. + coord_t min_feature_size { scaled(0.1) }; + +/*********************************************************************/ +/* General support parameters: */ +/*********************************************************************/ + + // Support Overhang Angle + // The minimum angle of overhangs for which support is added. At a value of 0° all overhangs are supported, 90° will not provide any support. + double support_angle { 50. * M_PI / 180. }; + // Support Line Width + // Width of a single support structure line. + coord_t support_line_width { scaled(0.4) }; + // Support Roof Line Width: Width of a single support roof line. + coord_t support_roof_line_width { scaled(0.4) }; + // Enable Support Floor (aka bottom interfaces) + // Generate a dense slab of material between the bottom of the support and the model. This will create a skin between the model and support. + bool support_bottom_enable { false }; + // Support Floor Thickness + // The thickness of the support floors. This controls the number of dense layers that are printed on top of places of a model on which support rests. + coord_t support_bottom_height { scaled(1.) }; + bool support_material_buildplate_only { false }; + // Support X/Y Distance + // Distance of the support structure from the print in the X/Y directions. + // minimum: 0, maximum warning: 1.5 * machine_nozzle_tip_outer_diameter + coord_t support_xy_distance { scaled(0.7) }; + // Minimum Support X/Y Distance + // Distance of the support structure from the overhang in the X/Y directions. + // minimum_value: 0, minimum warning": support_xy_distance - support_line_width * 2, maximum warning: support_xy_distance + coord_t support_xy_distance_overhang { scaled(0.2) }; + // Support Top Distance + // Distance from the top of the support to the print. + coord_t support_top_distance { scaled(0.1) }; + // Support Bottom Distance + // Distance from the print to the bottom of the support. + coord_t support_bottom_distance { scaled(0.1) }; + //FIXME likely not needed, optimization for clipping of interface layers + // When checking where there's model above and below the support, take steps of the given height. Lower values will slice slower, while higher values + // may cause normal support to be printed in some places where there should have been support interface. + coord_t support_interface_skip_height { scaled(0.3) }; + // Support Infill Line Directions + // A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end + // of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained + // in square brackets. Default is an empty list which means use the default angle 0 degrees. +// std::vector support_infill_angles {}; + // Enable Support Roof + // Generate a dense slab of material between the top of support and the model. This will create a skin between the model and support. + bool support_roof_enable { false }; + // Support Roof Thickness + // The thickness of the support roofs. This controls the amount of dense layers at the top of the support on which the model rests. + coord_t support_roof_height { scaled(1.) }; + // Minimum Support Roof Area + // Minimum area size for the roofs of the support. Polygons which have an area smaller than this value will be printed as normal support. + double minimum_roof_area { scaled(scaled(1.)) }; + // A list of integer line directions to use. Elements from the list are used sequentially as the layers progress + // and when the end of the list is reached, it starts at the beginning again. The list items are separated + // by commas and the whole list is contained in square brackets. Default is an empty list which means + // use the default angles (alternates between 45 and 135 degrees if interfaces are quite thick or 90 degrees). + std::vector support_roof_angles {}; + // Support Roof Pattern (aka top interface) + // The pattern with which the roofs of the support are printed. + SupportMaterialInterfacePattern support_roof_pattern { smipAuto }; + // Support Pattern + // The pattern of the support structures of the print. The different options available result in sturdy or easy to remove support. + SupportMaterialPattern support_pattern { smpRectilinear }; + // Support Line Distance + // Distance between the printed support structure lines. This setting is calculated by the support density. + coord_t support_line_spacing { scaled(2.66 - 0.4) }; + // Support Floor Horizontal Expansion + // Amount of offset applied to the floors of the support. + coord_t support_bottom_offset { scaled(0.) }; + // Support Wall Line Count + // The number of walls with which to surround support infill. Adding a wall can make support print more reliably + // and can support overhangs better, but increases print time and material used. + // tree: 1, zig-zag: 0, concentric: 1 + int support_wall_count { 1 }; + // Support Roof Line Distance + // Distance between the printed support roof lines. This setting is calculated by the Support Roof Density, but can be adjusted separately. + coord_t support_roof_line_distance { scaled(0.4) }; + // Minimum Support Area + // Minimum area size for support polygons. Polygons which have an area smaller than this value will not be generated. + coord_t minimum_support_area { scaled(0.) }; + // Minimum Support Floor Area + // Minimum area size for the floors of the support. Polygons which have an area smaller than this value will be printed as normal support. + coord_t minimum_bottom_area { scaled(1.0) }; + // Support Horizontal Expansion + // Amount of offset applied to all support polygons in each layer. Positive values can smooth out the support areas and result in more sturdy support. + coord_t support_offset { scaled(0.) }; + +/*********************************************************************/ +/* Parameters for the Cura tree supports implementation: */ +/*********************************************************************/ + + // Tree Support Maximum Branch Angle + // The maximum angle of the branches, when the branches have to avoid the model. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach. + // minimum: 0, minimum warning: 20, maximum: 89, maximum warning": 85 + double support_tree_angle { 60. * M_PI / 180. }; + // Tree Support Branch Diameter Angle + // The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. + // A bit of an angle can increase stability of the tree support. + // minimum: 0, maximum: 89.9999, maximum warning: 15 + double support_tree_branch_diameter_angle { 5. * M_PI / 180. }; + // Tree Support Branch Distance + // How far apart the branches need to be when they touch the model. Making this distance small will cause + // the tree support to touch the model at more points, causing better overhang but making support harder to remove. + coord_t support_tree_branch_distance { scaled(1.) }; + // Tree Support Branch Diameter + // The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this. + // minimum: 0.001, minimum warning: support_line_width * 2 + coord_t support_tree_branch_diameter { scaled(2.) }; + +/*********************************************************************/ +/* Parameters new to the Thomas Rahm's tree supports implementation: */ +/*********************************************************************/ + + // Tree Support Preferred Branch Angle + // The preferred angle of the branches, when they do not have to avoid the model. Use a lower angle to make them more vertical and more stable. Use a higher angle for branches to merge faster. + // minimum: 0, minimum warning: 10, maximum: support_tree_angle, maximum warning: support_tree_angle-1 + double support_tree_angle_slow { 50. * M_PI / 180. }; + // Tree Support Diameter Increase To Model + // The most the diameter of a branch that has to connect to the model may increase by merging with branches that could reach the buildplate. + // Increasing this reduces print time, but increases the area of support that rests on model + // minimum: 0 + coord_t support_tree_max_diameter_increase_by_merges_when_support_to_model { scaled(1.0) }; + // Tree Support Minimum Height To Model + // How tall a branch has to be if it is placed on the model. Prevents small blobs of support. This setting is ignored when a branch is supporting a support roof. + // minimum: 0, maximum warning: 5 + coord_t support_tree_min_height_to_model { scaled(1.0) }; + // Tree Support Inital Layer Diameter + // Diameter every branch tries to achieve when reaching the buildplate. Improves bed adhesion. + // minimum: 0, maximum warning: 20 + coord_t support_tree_bp_diameter { scaled(7.5) }; + // Tree Support Branch Density + // Adjusts the density of the support structure used to generate the tips of the branches. A higher value results in better overhangs, + // but the supports are harder to remove. Use Support Roof for very high values or ensure support density is similarly high at the top. + // -> + // Adjusts the density of the support structure used to generate the tips of the branches. + // A higher value results in better overhangs but the supports are harder to remove, thus it is recommended to enable top support interfaces + // instead of a high branch density value if dense interfaces are needed. + // 5%-35% + double support_tree_top_rate { 15. }; + // Tree Support Tip Diameter + // The diameter of the top of the tip of the branches of tree support. + // minimum: min_wall_line_width, minimum warning: min_wall_line_width+0.05, maximum_value: support_tree_branch_diameter, value: support_line_width + coord_t support_tree_tip_diameter { scaled(0.4) }; + + // Support Interface Priority + // How support interface and support will interact when they overlap. Currently only implemented for support roof. + //enum support_interface_priority { support_lines_overwrite_interface_area }; +}; + +class TreeModelVolumes +{ +public: + TreeModelVolumes() = default; + explicit TreeModelVolumes(const PrintObject &print_object, const BuildVolume &build_volume, + coord_t max_move, coord_t max_move_slow, size_t current_mesh_idx, +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + double progress_multiplier, + double progress_offset, +#endif // SLIC3R_TREESUPPORTS_PROGRESS + const std::vector &additional_excluded_areas = {}); + TreeModelVolumes(TreeModelVolumes&&) = default; + TreeModelVolumes& operator=(TreeModelVolumes&&) = default; + + TreeModelVolumes(const TreeModelVolumes&) = delete; + TreeModelVolumes& operator=(const TreeModelVolumes&) = delete; + + void clear() { + this->clear_all_but_object_collision(); + m_collision_cache.clear(); + } + void clear_all_but_object_collision() { + //m_collision_cache.clear_all_but_radius0(); + m_collision_cache_holefree.clear(); + m_avoidance_cache.clear(); + m_avoidance_cache_slow.clear(); + m_avoidance_cache_to_model.clear(); + m_avoidance_cache_to_model_slow.clear(); + m_placeable_areas_cache.clear(); + m_avoidance_cache_holefree.clear(); + m_avoidance_cache_holefree_to_model.clear(); + m_wall_restrictions_cache.clear(); + m_wall_restrictions_cache_min.clear(); + } + + enum class AvoidanceType : int8_t + { + Slow, + FastSafe, + Fast, + Count + }; + + /*! + * \brief Precalculate avoidances and collisions up to max_layer. + * + * Knowledge about branch angle is used to only calculate avoidances and collisions that may actually be needed. + * Not calling precalculate() will cause the class to lazily calculate avoidances and collisions as needed, which will be a lot slower on systems with more then one or two cores! + */ + void precalculate(const PrintObject& print_object, const coord_t max_layer, std::function throw_on_cancel); + + /*! + * \brief Provides the areas that have to be avoided by the tree's branches to prevent collision with the model on this layer. + * + * The result is a 2D area that would cause nodes of radius \p radius to + * collide with the model. + * + * \param radius The radius of the node of interest + * \param layer_idx The layer of interest + * \param min_xy_dist Is the minimum xy distance used. + * \return Polygons object + */ + const Polygons& getCollision(const coord_t radius, LayerIndex layer_idx, bool min_xy_dist) const; + + // Get a collision area at a given layer for a radius that is a lower or equial to the key radius. + // It is expected that the collision area is precalculated for a given layer at least for the radius zero. + // Used for pushing tree supports away from object during the final Organic optimization step. + std::optional>> get_collision_lower_bound_area(LayerIndex layer_id, coord_t max_radius) const; + + /*! + * \brief Provides the areas that have to be avoided by the tree's branches + * in order to reach the build plate. + * + * The result is a 2D area that would cause nodes of radius \p radius to + * collide with the model or be unable to reach the build platform. + * + * The input collision areas are inset by the maximum move distance and + * propagated upwards. + * + * \param radius The radius of the node of interest + * \param layer_idx The layer of interest + * \param type Is the propagation with the maximum move distance slow required. + * \param to_model Does the avoidance allow good connections with the model. + * \param min_xy_dist is the minimum xy distance used. + * \return Polygons object + */ + const Polygons& getAvoidance(coord_t radius, LayerIndex layer_idx, AvoidanceType type, bool to_model, bool min_xy_dist) const; + /*! + * \brief Provides the area represents all areas on the model where the branch does completely fit on the given layer. + * \param radius The radius of the node of interest + * \param layer_idx The layer of interest + * \return Polygons object + */ + const Polygons& getPlaceableAreas(coord_t radius, LayerIndex layer_idx, std::function throw_on_cancel) const; + /*! + * \brief Provides the area that represents the walls, as in the printed area, of the model. This is an abstract representation not equal with the outline. See calculateWallRestrictions for better description. + * \param radius The radius of the node of interest. + * \param layer_idx The layer of interest. + * \param min_xy_dist is the minimum xy distance used. + * \return Polygons object + */ + const Polygons& getWallRestriction(coord_t radius, LayerIndex layer_idx, bool min_xy_dist) const; + /*! + * \brief Round \p radius upwards to either a multiple of m_radius_sample_resolution or a exponentially increasing value + * + * It also adds the difference between the minimum xy distance and the regular one. + * + * \param radius The radius of the node of interest + * \param min_xy_dist is the minimum xy distance used. + * \return The rounded radius + */ + coord_t ceilRadius(const coord_t radius, const bool min_xy_dist) const { + assert(radius >= 0); + return min_xy_dist ? + this->ceilRadius(radius) : + // special case as if a radius 0 is requested it could be to ensure correct xy distance. As such it is beneficial if the collision is as close to the configured values as possible. + radius > 0 ? this->ceilRadius(radius + m_current_min_xy_dist_delta) : m_current_min_xy_dist_delta; + } + /*! + * \brief Round \p radius upwards to the maximum that would still round up to the same value as the provided one. + * + * \param radius The radius of the node of interest + * \param min_xy_dist is the minimum xy distance used. + * \return The maximum radius, resulting in the same rounding. + */ + coord_t getRadiusNextCeil(coord_t radius, bool min_xy_dist) const { + assert(radius > 0); + return min_xy_dist ? + this->ceilRadius(radius) : + this->ceilRadius(radius + m_current_min_xy_dist_delta) - m_current_min_xy_dist_delta; + } + +private: + // Caching polygons for a range of layers. + struct LayerPolygonCache { + std::vector polygons; + LayerIndex idx_begin; + LayerIndex idx_end; + + void allocate(LayerIndex aidx_begin, LayerIndex aidx_end) { + this->idx_begin = aidx_begin; + this->idx_end = aidx_end; + this->polygons.assign(aidx_end - aidx_begin, {}); + } + + LayerIndex begin() const { return idx_begin; } + LayerIndex end() const { return idx_end; } + size_t size() const { return polygons.size(); } + + bool has(LayerIndex idx) const { return idx >= idx_begin && idx < idx_end; } + Polygons& operator[](LayerIndex idx) { return polygons[idx + idx_begin]; } + }; + + /*! + * \brief Convenience typedef for the keys to the caches + */ + using RadiusLayerPair = std::pair; + class RadiusLayerPolygonCache { + // Map from radius to Polygons. Cache of one layer collision regions. + using LayerData = std::map; + // Vector of layers, at each layer map of radius to Polygons. + // Reference to Polygons returned shall be stable to insertion. + using Layers = std::vector; + public: + RadiusLayerPolygonCache() = default; + RadiusLayerPolygonCache(RadiusLayerPolygonCache &&rhs) : m_data(std::move(rhs.m_data)) {} + RadiusLayerPolygonCache& operator=(RadiusLayerPolygonCache &&rhs) { m_data = std::move(rhs.m_data); return *this; } + + RadiusLayerPolygonCache(const RadiusLayerPolygonCache&) = delete; + RadiusLayerPolygonCache& operator=(const RadiusLayerPolygonCache&) = delete; + + void insert(std::vector> &&in) { + std::lock_guard guard(m_mutex); + for (auto &d : in) + this->get_allocate_layer_data(d.first.second).emplace(d.first.first, std::move(d.second)); + } + // by layer + void insert(std::vector> &&in, coord_t radius) { + std::lock_guard guard(m_mutex); + for (auto &d : in) + this->get_allocate_layer_data(d.first).emplace(radius, std::move(d.second)); + } + void insert(std::vector &&in, coord_t first_layer_idx, coord_t radius) { + std::lock_guard guard(m_mutex); + allocate_layers(first_layer_idx + in.size()); + for (auto &d : in) + m_data[first_layer_idx ++].emplace(radius, std::move(d)); + } + void insert(LayerPolygonCache &&in, coord_t radius) { + std::lock_guard guard(m_mutex); + LayerIndex i = in.idx_begin; + allocate_layers(i + LayerIndex(in.size())); + for (auto &d : in.polygons) + m_data[i ++].emplace(radius, std::move(d)); + } + /*! + * \brief Checks a cache for a given RadiusLayerPair and returns it if it is found + * \param key RadiusLayerPair of the requested areas. The radius will be calculated up to the provided layer. + * \return A wrapped optional reference of the requested area (if it was found, an empty optional if nothing was found) + */ + std::optional> getArea(const TreeModelVolumes::RadiusLayerPair &key) const { + std::lock_guard guard(m_mutex); + if (key.second >= m_data.size()) + return std::optional>{}; + const auto &layer = m_data[key.second]; + auto it = layer.find(key.first); + return it == layer.end() ? + std::optional>{} : std::optional>{ it->second }; + } + // Get a collision area at a given layer for a radius that is a lower or equial to the key radius. + std::optional>> get_lower_bound_area(const TreeModelVolumes::RadiusLayerPair &key) const { + std::lock_guard guard(m_mutex); + if (key.second >= m_data.size()) + return {}; + const auto &layer = m_data[key.second]; + if (layer.empty()) + return {}; + auto it = layer.lower_bound(key.first); + if (it == layer.end() || it->first != key.first) { + if (it == layer.begin()) + return {}; + -- it; + } + return std::make_pair(it->first, std::reference_wrapper(it->second)); + } + /*! + * \brief Get the highest already calculated layer in the cache. + * \param radius The radius for which the highest already calculated layer has to be found. + * \param map The cache in which the lookup is performed. + * + * \return A wrapped optional reference of the requested area (if it was found, an empty optional if nothing was found) + */ + LayerIndex getMaxCalculatedLayer(coord_t radius) const { + std::lock_guard guard(m_mutex); + auto layer_idx = LayerIndex(m_data.size()) - 1; + for (; layer_idx > 0; -- layer_idx) + if (const auto &layer = m_data[layer_idx]; layer.find(radius) != layer.end()) + break; + // The placeable on model areas do not exist on layer 0, as there can not be model below it. As such it may be possible that layer 1 is available, but layer 0 does not exist. + return layer_idx == 0 ? -1 : layer_idx; + } + + // For debugging purposes, sorted by layer index, then by radius. + [[nodiscard]] std::vector>> sorted() const; + + void clear() { m_data.clear(); } + void clear_all_but_radius0() { + for (LayerData &l : m_data) { + auto begin = l.begin(); + auto end = l.end(); + if (begin != end && ++ begin != end) + l.erase(begin, end); + } + } + + private: + LayerData& get_allocate_layer_data(LayerIndex layer_idx) { + allocate_layers(layer_idx + 1); + return m_data[layer_idx]; + } + void allocate_layers(size_t num_layers); + + Layers m_data; + mutable std::mutex m_mutex; + }; + + + /*! + * \brief Provides the areas that have to be avoided by the tree's branches to prevent collision with the model on this layer. Holes are removed. + * + * The result is a 2D area that would cause nodes of given radius to + * collide with the model or be inside a hole. + * A Hole is defined as an area, in which a branch with m_increase_until_radius radius would collide with the wall. + * minimum xy distance is always used. + * \param radius The radius of the node of interest + * \param layer_idx The layer of interest + * \param min_xy_dist Is the minimum xy distance used. + * \return Polygons object + */ + const Polygons& getCollisionHolefree(coord_t radius, LayerIndex layer_idx) const; + + /*! + * \brief Round \p radius upwards to either a multiple of m_radius_sample_resolution or a exponentially increasing value + * + * \param radius The radius of the node of interest + */ + coord_t ceilRadius(const coord_t radius) const; + + /*! + * \brief Creates the areas that have to be avoided by the tree's branches to prevent collision with the model on this layer. + * + * The result is a 2D area that would cause nodes of given radius to + * collide with the model. Result is saved in the cache. + * \param keys RadiusLayerPairs of all requested areas. Every radius will be calculated up to the provided layer. + */ + void calculateCollision(const std::vector &keys, std::function throw_on_cancel); + void calculateCollision(const coord_t radius, const LayerIndex max_layer_idx, std::function throw_on_cancel); + /*! + * \brief Creates the areas that have to be avoided by the tree's branches to prevent collision with the model on this layer. Holes are removed. + * + * The result is a 2D area that would cause nodes of given radius to + * collide with the model or be inside a hole. Result is saved in the cache. + * A Hole is defined as an area, in which a branch with m_increase_until_radius radius would collide with the wall. + * \param keys RadiusLayerPairs of all requested areas. Every radius will be calculated up to the provided layer. + */ + void calculateCollisionHolefree(const std::vector &keys, std::function throw_on_cancel); + + /*! + * \brief Creates the areas that have to be avoided by the tree's branches to prevent collision with the model on this layer. Holes are removed. + * + * The result is a 2D area that would cause nodes of given radius to + * collide with the model or be inside a hole. Result is saved in the cache. + * A Hole is defined as an area, in which a branch with m_increase_until_radius radius would collide with the wall. + * \param key RadiusLayerPairs the requested areas. The radius will be calculated up to the provided layer. + */ + void calculateCollisionHolefree(RadiusLayerPair key) + { + calculateCollisionHolefree(std::vector{ RadiusLayerPair(key) }, {}); + } + + /*! + * \brief Creates the areas that have to be avoided by the tree's branches to prevent collision with the model. + * + * The result is a 2D area that would cause nodes of radius \p radius to + * collide with the model. Result is saved in the cache. + * \param keys RadiusLayerPairs of all requested areas. Every radius will be calculated up to the provided layer. + */ + void calculateAvoidance(const std::vector &keys, bool to_build_plate, bool to_model, std::function throw_on_cancel); + + /*! + * \brief Creates the areas that have to be avoided by the tree's branches to prevent collision with the model. + * + * The result is a 2D area that would cause nodes of radius \p radius to + * collide with the model. Result is saved in the cache. + * \param key RadiusLayerPair of the requested areas. It will be calculated up to the provided layer. + */ + void calculateAvoidance(RadiusLayerPair key, bool to_build_plate, bool to_model) + { + calculateAvoidance(std::vector{ RadiusLayerPair(key) }, to_build_plate, to_model, {}); + } + + /*! + * \brief Creates the areas where a branch of a given radius can be place on the model. + * Result is saved in the cache. + * \param key RadiusLayerPair of the requested areas. It will be calculated up to the provided layer. + */ + void calculatePlaceables(const coord_t radius, const LayerIndex max_required_layer, std::function throw_on_cancel); + + + /*! + * \brief Creates the areas where a branch of a given radius can be placed on the model. + * Result is saved in the cache. + * \param keys RadiusLayerPair of the requested areas. The radius will be calculated up to the provided layer. + */ + void calculatePlaceables(const std::vector &keys, std::function throw_on_cancel); + + /*! + * \brief Creates the areas that can not be passed when expanding an area downwards. As such these areas are an somewhat abstract representation of a wall (as in a printed object). + * + * These areas are at least xy_min_dist wide. When calculating it is always assumed that every wall is printed on top of another (as in has an overlap with the wall a layer below). Result is saved in the corresponding cache. + * + * \param keys RadiusLayerPairs of all requested areas. Every radius will be calculated up to the provided layer. + */ + void calculateWallRestrictions(const std::vector &keys, std::function throw_on_cancel); + + /*! + * \brief Creates the areas that can not be passed when expanding an area downwards. As such these areas are an somewhat abstract representation of a wall (as in a printed object). + * These areas are at least xy_min_dist wide. When calculating it is always assumed that every wall is printed on top of another (as in has an overlap with the wall a layer below). Result is saved in the corresponding cache. + * \param key RadiusLayerPair of the requested area. It well be will be calculated up to the provided layer. + */ + void calculateWallRestrictions(RadiusLayerPair key) + { + calculateWallRestrictions(std::vector{ RadiusLayerPair(key) }, {}); + } + + /*! + * \brief The maximum distance that the center point of a tree branch may move in consecutive layers if it has to avoid the model. + */ + coord_t m_max_move; + /*! + * \brief The maximum distance that the centre-point of a tree branch may + * move in consecutive layers if it does not have to avoid the model + */ + coord_t m_max_move_slow; + /*! + * \brief The smallest maximum resolution for simplify + */ + coord_t m_min_resolution; + + bool m_precalculated = false; + /*! + * \brief The index to access the outline corresponding with the currently processing mesh + */ + size_t m_current_outline_idx; + /*! + * \brief The minimum required clearance between the model and the tree branches + */ + coord_t m_current_min_xy_dist; + /*! + * \brief The difference between the minimum required clearance between the model and the tree branches and the regular one. + */ + coord_t m_current_min_xy_dist_delta; + /*! + * \brief Does at least one mesh allow support to rest on a model. + */ + bool m_support_rests_on_model; +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + /*! + * \brief The progress of the precalculate function for communicating it to the progress bar. + */ + coord_t m_precalculation_progress = 0; + /*! + * \brief The progress multiplier of all values added progress bar. + * Required for the progress bar the behave as expected when areas have to be calculated multiple times + */ + double m_progress_multiplier; + /*! + * \brief The progress offset added to all values communicated to the progress bar. + * Required for the progress bar the behave as expected when areas have to be calculated multiple times + */ + double m_progress_offset; +#endif // SLIC3R_TREESUPPORTS_PROGRESS + /*! + * \brief Increase radius in the resulting drawn branches, even if the avoidance does not allow it. Will be cut later to still fit. + */ + coord_t m_increase_until_radius; + + /*! + * \brief Polygons representing the limits of the printable area of the + * machine + */ + Polygons m_machine_border; + /*! + * \brief Storage for layer outlines and the corresponding settings of the meshes grouped by meshes with identical setting. + */ + std::vector>> m_layer_outlines; + /*! + * \brief Storage for areas that should be avoided, like support blocker or previous generated trees. + */ + std::vector m_anti_overhang; + /*! + * \brief Radii that can be ignored by ceilRadius as they will never be requested, sorted. + */ + std::vector m_ignorable_radii; + + /*! + * \brief Smallest radius a branch can have. This is the radius of a SupportElement with DTT=0. + */ + coord_t m_radius_0; + + // Z heights of the raft layers (additional layers below the object, last raft layer aligned with the bottom of the first object layer). + std::vector m_raft_layers; + + /*! + * \brief Caches for the collision, avoidance and areas on the model where support can be placed safely + * at given radius and layer indices. + */ + RadiusLayerPolygonCache m_collision_cache; + RadiusLayerPolygonCache m_collision_cache_holefree; + RadiusLayerPolygonCache m_avoidance_cache; + RadiusLayerPolygonCache m_avoidance_cache_slow; + RadiusLayerPolygonCache m_avoidance_cache_to_model; + RadiusLayerPolygonCache m_avoidance_cache_to_model_slow; + RadiusLayerPolygonCache m_placeable_areas_cache; + + /*! + * \brief Caches to avoid holes smaller than the radius until which the radius is always increased, as they are free of holes. + * Also called safe avoidances, as they are safe regarding not running into holes. + */ + RadiusLayerPolygonCache m_avoidance_cache_holefree; + RadiusLayerPolygonCache m_avoidance_cache_holefree_to_model; + + RadiusLayerPolygonCache& avoidance_cache(const AvoidanceType type, const bool to_model) { + if (to_model) { + switch (type) { + case AvoidanceType::Fast: return m_avoidance_cache_to_model; + case AvoidanceType::Slow: return m_avoidance_cache_to_model_slow; + case AvoidanceType::Count: assert(false); + case AvoidanceType::FastSafe: return m_avoidance_cache_holefree_to_model; + } + } else { + switch (type) { + case AvoidanceType::Fast: return m_avoidance_cache; + case AvoidanceType::Slow: return m_avoidance_cache_slow; + case AvoidanceType::Count: assert(false); + case AvoidanceType::FastSafe: return m_avoidance_cache_holefree; + } + } + assert(false); + return m_avoidance_cache; + } + const RadiusLayerPolygonCache& avoidance_cache(const AvoidanceType type, const bool to_model) const { + return const_cast(this)->avoidance_cache(type, to_model); + } + + /*! + * \brief Caches to represent walls not allowed to be passed over. + */ + RadiusLayerPolygonCache m_wall_restrictions_cache; + + // A different cache for min_xy_dist as the maximal safe distance an influence area can be increased(guaranteed overlap of two walls in consecutive layer) + // is much smaller when min_xy_dist is used. This causes the area of the wall restriction to be thinner and as such just using the min_xy_dist wall + // restriction would be slower. + RadiusLayerPolygonCache m_wall_restrictions_cache_min; + +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + std::unique_ptr m_critical_progress { std::make_unique() }; +#endif // SLIC3R_TREESUPPORTS_PROGRESS +}; + +} // namespace FFFTreeSupport +} // namespace Slic3r + +#endif //slic3r_TreeModelVolumes_hpp diff --git a/src/libslic3r/TreeSupport.cpp b/src/libslic3r/TreeSupport.cpp new file mode 100644 index 00000000000..240bcf7d10c --- /dev/null +++ b/src/libslic3r/TreeSupport.cpp @@ -0,0 +1,4518 @@ +// Tree supports by Thomas Rahm, losely based on Tree Supports by CuraEngine. +// Original source of Thomas Rahm's tree supports: +// https://github.com/ThomasRahm/CuraEngine +// +// Original CuraEngine copyright: +// Copyright (c) 2021 Ultimaker B.V. +// CuraEngine is released under the terms of the AGPLv3 or higher. + +#include "TreeSupport.hpp" +#include "AABBTreeIndirect.hpp" +#include "AABBTreeLines.hpp" +#include "BuildVolume.hpp" +#include "ClipperUtils.hpp" +#include "EdgeGrid.hpp" +#include "Fill/Fill.hpp" +#include "Layer.hpp" +#include "Print.hpp" +#include "MultiPoint.hpp" +#include "Polygon.hpp" +#include "Polyline.hpp" +#include "MutablePolygon.hpp" +#include "SupportMaterial.hpp" +#include "TriangleMeshSlicer.hpp" + +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 + #include //todo Remove! ONLY FOR PUBLIC BETA!! +#endif // _WIN32 + +#include + +#include +#include +#include + +#if defined(TREE_SUPPORT_SHOW_ERRORS) && defined(_WIN32) + #define TREE_SUPPORT_SHOW_ERRORS_WIN32 +#endif + +#define TREE_SUPPORT_ORGANIC_NUDGE_NEW 1 + +#ifndef TREE_SUPPORT_ORGANIC_NUDGE_NEW + // Old version using OpenVDB, works but it is extremely slow for complex meshes. + #include "OpenVDBUtilsLegacy.hpp" + #include +#endif // TREE_SUPPORT_ORGANIC_NUDGE_NEW + +// #define TREESUPPORT_DEBUG_SVG + +namespace Slic3r +{ + +namespace FFFTreeSupport +{ + +TreeSupportSettings::TreeSupportSettings(const TreeSupportMeshGroupSettings& mesh_group_settings, const SlicingParameters &slicing_params) + : angle(mesh_group_settings.support_tree_angle), + angle_slow(mesh_group_settings.support_tree_angle_slow), + support_line_width(mesh_group_settings.support_line_width), + layer_height(mesh_group_settings.layer_height), + branch_radius(mesh_group_settings.support_tree_branch_diameter / 2), + min_radius(mesh_group_settings.support_tree_tip_diameter / 2), // The actual radius is 50 microns larger as the resulting branches will be increased by 50 microns to avoid rounding errors effectively increasing the xydistance + maximum_move_distance((angle < M_PI / 2.) ? (coord_t)(tan(angle) * layer_height) : std::numeric_limits::max()), + maximum_move_distance_slow((angle_slow < M_PI / 2.) ? (coord_t)(tan(angle_slow) * layer_height) : std::numeric_limits::max()), + support_bottom_layers(mesh_group_settings.support_bottom_enable ? (mesh_group_settings.support_bottom_height + layer_height / 2) / layer_height : 0), + tip_layers(std::max((branch_radius - min_radius) / (support_line_width / 3), branch_radius / layer_height)), // Ensure lines always stack nicely even if layer height is large + diameter_angle_scale_factor(sin(mesh_group_settings.support_tree_branch_diameter_angle) * layer_height / branch_radius), + max_to_model_radius_increase(mesh_group_settings.support_tree_max_diameter_increase_by_merges_when_support_to_model / 2), + min_dtt_to_model(round_up_divide(mesh_group_settings.support_tree_min_height_to_model, layer_height)), + increase_radius_until_radius(mesh_group_settings.support_tree_branch_diameter / 2), + increase_radius_until_layer(increase_radius_until_radius <= branch_radius ? tip_layers * (increase_radius_until_radius / branch_radius) : (increase_radius_until_radius - branch_radius) / (branch_radius * diameter_angle_scale_factor)), + support_rests_on_model(! mesh_group_settings.support_material_buildplate_only), + xy_distance(mesh_group_settings.support_xy_distance), + xy_min_distance(std::min(mesh_group_settings.support_xy_distance, mesh_group_settings.support_xy_distance_overhang)), + bp_radius(mesh_group_settings.support_tree_bp_diameter / 2), + diameter_scale_bp_radius(std::min(sin(0.7) * layer_height / branch_radius, 1.0 / (branch_radius / (support_line_width / 2.0)))), // Either 40? or as much as possible so that 2 lines will overlap by at least 50%, whichever is smaller. + z_distance_bottom_layers(size_t(round(double(mesh_group_settings.support_bottom_distance) / double(layer_height)))), + z_distance_top_layers(size_t(round(double(mesh_group_settings.support_top_distance) / double(layer_height)))), + performance_interface_skip_layers(round_up_divide(mesh_group_settings.support_interface_skip_height, layer_height)), +// support_infill_angles(mesh_group_settings.support_infill_angles), + support_roof_angles(mesh_group_settings.support_roof_angles), + roof_pattern(mesh_group_settings.support_roof_pattern), + support_pattern(mesh_group_settings.support_pattern), + support_roof_line_width(mesh_group_settings.support_roof_line_width), + support_line_spacing(mesh_group_settings.support_line_spacing), + support_bottom_offset(mesh_group_settings.support_bottom_offset), + support_wall_count(mesh_group_settings.support_wall_count), + resolution(mesh_group_settings.resolution), + support_roof_line_distance(mesh_group_settings.support_roof_line_distance), // in the end the actual infill has to be calculated to subtract interface from support areas according to interface_preference. + settings(mesh_group_settings), + min_feature_size(mesh_group_settings.min_feature_size) +{ + layer_start_bp_radius = (bp_radius - branch_radius) / (branch_radius * diameter_scale_bp_radius); + + if (TreeSupportSettings::soluble) { + // safeOffsetInc can only work in steps of the size xy_min_distance in the worst case => xy_min_distance has to be a bit larger than 0 in this worst case and should be large enough for performance to not suffer extremely + // When for all meshes the z bottom and top distance is more than one layer though the worst case is xy_min_distance + min_feature_size + // This is not the best solution, but the only one to ensure areas can not lag though walls at high maximum_move_distance. + xy_min_distance = std::max(xy_min_distance, scaled(0.1)); + xy_distance = std::max(xy_distance, xy_min_distance); + } + + +// const std::unordered_map interface_map = { { "support_area_overwrite_interface_area", InterfacePreference::SupportAreaOverwritesInterface }, { "interface_area_overwrite_support_area", InterfacePreference::InterfaceAreaOverwritesSupport }, { "support_lines_overwrite_interface_area", InterfacePreference::SupportLinesOverwriteInterface }, { "interface_lines_overwrite_support_area", InterfacePreference::InterfaceLinesOverwriteSupport }, { "nothing", InterfacePreference::Nothing } }; +// interface_preference = interface_map.at(mesh_group_settings.get("support_interface_priority")); +//FIXME this was the default +// interface_preference = InterfacePreference::SupportLinesOverwriteInterface; + //interface_preference = InterfacePreference::SupportAreaOverwritesInterface; + interface_preference = InterfacePreference::InterfaceAreaOverwritesSupport; + + if (slicing_params.raft_layers() > 0) { + // Fill in raft_layers with the heights of the layers below the first object layer. + // First layer + double z = slicing_params.first_print_layer_height; + this->raft_layers.emplace_back(z); + // Raft base layers + for (size_t i = 1; i < slicing_params.base_raft_layers; ++ i) { + z += slicing_params.base_raft_layer_height; + this->raft_layers.emplace_back(z); + } + // Raft interface layers + for (size_t i = 0; i + 1 < slicing_params.interface_raft_layers; ++ i) { + z += slicing_params.interface_raft_layer_height; + this->raft_layers.emplace_back(z); + } + // Raft contact layer + if (slicing_params.raft_layers() > 1) { + z = slicing_params.raft_contact_top_z; + this->raft_layers.emplace_back(z); + } + if (double dist_to_go = slicing_params.object_print_z_min - z; dist_to_go > EPSILON) { + // Layers between the raft contacts and bottom of the object. + auto nsteps = int(ceil(dist_to_go / slicing_params.max_suport_layer_height)); + double step = dist_to_go / nsteps; + for (size_t i = 0; i < nsteps; ++ i) { + z += step; + this->raft_layers.emplace_back(z); + } + } + } +} + +enum class LineStatus +{ + INVALID, + TO_MODEL, + TO_MODEL_GRACIOUS, + TO_MODEL_GRACIOUS_SAFE, + TO_BP, + TO_BP_SAFE +}; + +using LineInformation = std::vector>; +using LineInformations = std::vector; +using namespace std::literals; + +static inline void validate_range(const Point &pt) +{ + static constexpr const int32_t hi = 65536 * 16384; + if (pt.x() > hi || pt.y() > hi || -pt.x() > hi || -pt.y() > hi) + throw ClipperLib::clipperException("Coordinate outside allowed range"); +} + +static inline void validate_range(const Points &points) +{ + for (const Point &p : points) + validate_range(p); +} + +static inline void validate_range(const MultiPoint &mp) +{ + validate_range(mp.points); +} + +static inline void validate_range(const Polygons &polygons) +{ + for (const Polygon &p : polygons) + validate_range(p); +} + +static inline void validate_range(const Polylines &polylines) +{ + for (const Polyline &p : polylines) + validate_range(p); +} + +static inline void validate_range(const LineInformation &lines) +{ + for (const auto& p : lines) + validate_range(p.first); +} + +static inline void validate_range(const LineInformations &lines) +{ + for (const LineInformation &l : lines) + validate_range(l); +} + +static inline void check_self_intersections(const Polygons &polygons, const std::string_view message) +{ +#ifdef TREE_SUPPORT_SHOW_ERRORS_WIN32 + if (!intersecting_edges(polygons).empty()) + ::MessageBoxA(nullptr, (std::string("TreeSupport infill self intersections: ") + std::string(message)).c_str(), "Bug detected!", MB_OK | MB_SYSTEMMODAL | MB_SETFOREGROUND | MB_ICONWARNING); +#endif // TREE_SUPPORT_SHOW_ERRORS_WIN32 +} +static inline void check_self_intersections(const ExPolygon &expoly, const std::string_view message) +{ +#ifdef TREE_SUPPORT_SHOW_ERRORS_WIN32 + check_self_intersections(to_polygons(expoly), message); +#endif // TREE_SUPPORT_SHOW_ERRORS_WIN32 +} + +static constexpr const auto tiny_area_threshold = sqr(scaled(0.001)); + +static std::vector>> group_meshes(const Print &print, const std::vector &print_object_ids) +{ + std::vector>> grouped_meshes; + + //FIXME this is ugly, it does not belong here. + for (size_t object_id : print_object_ids) { + const PrintObject &print_object = *print.get_object(object_id); + const PrintObjectConfig &object_config = print_object.config(); + if (object_config.support_material_contact_distance < EPSILON) + // || min_feature_size < scaled(0.1) that is the minimum line width + TreeSupportSettings::soluble = true; + } + + size_t largest_printed_mesh_idx = 0; + + // Group all meshes that can be processed together. NOTE this is different from mesh-groups! Only one setting object is needed per group, + // as different settings in the same group may only occur in the tip, which uses the original settings objects from the meshes. + for (size_t object_id : print_object_ids) { + const PrintObject &print_object = *print.get_object(object_id); +#ifndef NDEBUG + const PrintObjectConfig &object_config = print_object.config(); +#endif // NDEBUG + // Support must be enabled and set to Tree style. + assert(object_config.support_material || object_config.support_material_enforce_layers > 0); + assert(object_config.support_material_style == smsTree || object_config.support_material_style == smsOrganic); + + bool found_existing_group = false; + TreeSupportSettings next_settings{ TreeSupportMeshGroupSettings{ print_object }, print_object.slicing_parameters() }; + //FIXME for now only a single object per group is enabled. +#if 0 + for (size_t idx = 0; idx < grouped_meshes.size(); ++ idx) + if (next_settings == grouped_meshes[idx].first) { + found_existing_group = true; + grouped_meshes[idx].second.emplace_back(object_id); + // handle some settings that are only used for performance reasons. This ensures that a horrible set setting intended to improve performance can not reduce it drastically. + grouped_meshes[idx].first.performance_interface_skip_layers = std::min(grouped_meshes[idx].first.performance_interface_skip_layers, next_settings.performance_interface_skip_layers); + } +#endif + if (! found_existing_group) + grouped_meshes.emplace_back(next_settings, std::vector{ object_id }); + + // no need to do this per mesh group as adaptive layers and raft setting are not setable per mesh. + if (print.get_object(largest_printed_mesh_idx)->layers().back()->print_z < print_object.layers().back()->print_z) + largest_printed_mesh_idx = object_id; + } + +#if 0 + { + std::vector known_z(storage.meshes[largest_printed_mesh_idx].layers.size()); + for (size_t z = 0; z < storage.meshes[largest_printed_mesh_idx].layers.size(); z++) + known_z[z] = storage.meshes[largest_printed_mesh_idx].layers[z].printZ; + for (size_t idx = 0; idx < grouped_meshes.size(); ++ idx) + grouped_meshes[idx].first.setActualZ(known_z); + } +#endif + + return grouped_meshes; +} + +#if 0 +// todo remove as only for debugging relevant +[[nodiscard]] static std::string getPolygonAsString(const Polygons& poly) +{ + std::string ret; + for (auto path : poly) + for (Point p : path) { + if (ret != "") + ret += ","; + ret += "(" + std::to_string(p.x()) + "," + std::to_string(p.y()) + ")"; + } + return ret; +} +#endif + +static bool inline g_showed_critical_error = false; +static bool inline g_showed_performance_warning = false; +void tree_supports_show_error(std::string_view message, bool critical) +{ // todo Remove! ONLY FOR PUBLIC BETA!! + +#ifdef TREE_SUPPORT_SHOW_ERRORS_WIN32 + static bool showed_critical = false; + static bool showed_performance = false; + auto bugtype = std::string(critical ? " This is a critical bug. It may cause missing or malformed branches.\n" : "This bug should only decrease performance.\n"); + bool show = (critical && !g_showed_critical_error) || (!critical && !g_showed_performance_warning); + (critical ? g_showed_critical_error : g_showed_performance_warning) = true; + if (show) + MessageBoxA(nullptr, std::string("TreeSupport_2 MOD detected an error while generating the tree support.\nPlease report this back to me with profile and model.\nRevision 5.0\n" + std::string(message) + "\n" + bugtype).c_str(), + "Bug detected!", MB_OK | MB_SYSTEMMODAL | MB_SETFOREGROUND | MB_ICONWARNING); +#endif // TREE_SUPPORT_SHOW_ERRORS_WIN32 +} + +[[nodiscard]] static const std::vector generate_overhangs(const TreeSupportSettings &settings, const PrintObject &print_object, std::function throw_on_cancel) +{ + const size_t num_raft_layers = settings.raft_layers.size(); + const size_t num_object_layers = print_object.layer_count(); + const size_t num_layers = num_object_layers + num_raft_layers; + std::vector out(num_layers, Polygons{}); + + const PrintConfig &print_config = print_object.print()->config(); + const PrintObjectConfig &config = print_object.config(); + const bool support_auto = config.support_material.value && config.support_material_auto.value; + const int support_enforce_layers = config.support_material_enforce_layers.value; + std::vector enforcers_layers{ print_object.slice_support_enforcers() }; + std::vector blockers_layers{ print_object.slice_support_blockers() }; + print_object.project_and_append_custom_facets(false, EnforcerBlockerType::ENFORCER, enforcers_layers); + print_object.project_and_append_custom_facets(false, EnforcerBlockerType::BLOCKER, blockers_layers); + const int support_threshold = config.support_material_threshold.value; + const bool support_threshold_auto = support_threshold == 0; + // +1 makes the threshold inclusive + double tan_threshold = support_threshold_auto ? 0. : tan(M_PI * double(support_threshold + 1) / 180.); + //FIXME this is a fudge constant! + auto enforcer_overhang_offset = scaled(config.support_tree_tip_diameter.value); + + size_t num_overhang_layers = support_auto ? num_object_layers : std::max(size_t(support_enforce_layers), enforcers_layers.size()); + tbb::parallel_for(tbb::blocked_range(1, num_overhang_layers), + [&print_object, &config, &print_config, &enforcers_layers, &blockers_layers, + support_auto, support_enforce_layers, support_threshold_auto, tan_threshold, enforcer_overhang_offset, num_raft_layers, &throw_on_cancel, &out] + (const tbb::blocked_range &range) { + for (LayerIndex layer_id = range.begin(); layer_id < range.end(); ++ layer_id) { + const Layer ¤t_layer = *print_object.get_layer(layer_id); + const Layer &lower_layer = *print_object.get_layer(layer_id - 1); + // Full overhangs with zero lower_layer_offset and no blockers applied. + Polygons raw_overhangs; + bool raw_overhangs_calculated = false; + // Final overhangs. + Polygons overhangs; + // For how many layers full overhangs shall be supported. + const bool enforced_layer = layer_id < support_enforce_layers; + if (support_auto || enforced_layer) { + float lower_layer_offset; + if (enforced_layer) + lower_layer_offset = 0; + else if (support_threshold_auto) { + float external_perimeter_width = 0; + for (const LayerRegion *layerm : lower_layer.regions()) + external_perimeter_width += layerm->flow(frExternalPerimeter).scaled_width(); + external_perimeter_width /= lower_layer.region_count(); + lower_layer_offset = float(0.5 * external_perimeter_width); + } else + lower_layer_offset = scaled(lower_layer.height / tan_threshold); + overhangs = lower_layer_offset == 0 ? + diff(current_layer.lslices, lower_layer.lslices) : + diff(current_layer.lslices, offset(lower_layer.lslices, lower_layer_offset)); + if (lower_layer_offset == 0) { + raw_overhangs = overhangs; + raw_overhangs_calculated = true; + } + if (! (enforced_layer || blockers_layers.empty() || blockers_layers[layer_id].empty())) + overhangs = diff(overhangs, blockers_layers[layer_id], ApplySafetyOffset::Yes); + if (config.dont_support_bridges) { + for (const LayerRegion *layerm : current_layer.regions()) + remove_bridges_from_contacts(print_config, lower_layer, *layerm, + float(layerm->flow(frExternalPerimeter).scaled_width()), overhangs); + } + } + //check_self_intersections(overhangs, "generate_overhangs1"); + if (! enforcers_layers.empty() && ! enforcers_layers[layer_id].empty()) { + // Has some support enforcers at this layer, apply them to the overhangs, don't apply the support threshold angle. + //enforcers_layers[layer_id] = union_(enforcers_layers[layer_id]); + //check_self_intersections(enforcers_layers[layer_id], "generate_overhangs - enforcers"); + //check_self_intersections(to_polygons(lower_layer.lslices), "generate_overhangs - lowerlayers"); + if (Polygons enforced_overhangs = intersection(raw_overhangs_calculated ? raw_overhangs : diff(current_layer.lslices, lower_layer.lslices), enforcers_layers[layer_id] /*, ApplySafetyOffset::Yes */); + ! enforced_overhangs.empty()) { + //FIXME this is a hack to make enforcers work on steep overhangs. + //check_self_intersections(enforced_overhangs, "generate_overhangs - enforced overhangs1"); + //Polygons enforced_overhangs_prev = enforced_overhangs; + //check_self_intersections(to_polygons(union_ex(enforced_overhangs)), "generate_overhangs - enforced overhangs11"); + //check_self_intersections(offset(union_ex(enforced_overhangs), + //FIXME enforcer_overhang_offset is a fudge constant! + enforced_overhangs = diff(offset(union_ex(enforced_overhangs), enforcer_overhang_offset), + lower_layer.lslices); +#ifdef TREESUPPORT_DEBUG_SVG +// if (! intersecting_edges(enforced_overhangs).empty()) + { + static int irun = 0; + SVG::export_expolygons(debug_out_path("treesupport-self-intersections-%d.svg", ++irun), + { { { current_layer.lslices }, { "current_layer.lslices", "yellow", 0.5f } }, + { { lower_layer.lslices }, { "lower_layer.lslices", "gray", 0.5f } }, + { { union_ex(enforced_overhangs) }, { "enforced_overhangs", "red", "black", "", scaled(0.1f), 0.5f } } }); + } +#endif // TREESUPPORT_DEBUG_SVG + //check_self_intersections(enforced_overhangs, "generate_overhangs - enforced overhangs2"); + overhangs = overhangs.empty() ? std::move(enforced_overhangs) : union_(overhangs, enforced_overhangs); + //check_self_intersections(overhangs, "generate_overhangs - enforcers"); + } + } + out[layer_id + num_raft_layers] = std::move(overhangs); + throw_on_cancel(); + } + }); + +#if 0 + if (num_raft_layers > 0) { + const Layer &first_layer = *print_object.get_layer(0); + // Final overhangs. + Polygons overhangs = + // Don't apply blockes on raft layer. + //(! blockers_layers.empty() && ! blockers_layers[layer_id].empty() ? + // diff(first_layer.lslices, blockers_layers[layer_id], ApplySafetyOffset::Yes) : + to_polygons(first_layer.lslices); +#if 0 + if (! enforcers_layers.empty() && ! enforcers_layers[layer_id].empty()) { + if (Polygons enforced_overhangs = intersection(first_layer.lslices, enforcers_layers[layer_id] /*, ApplySafetyOffset::Yes */); + ! enforced_overhangs.empty()) { + //FIXME this is a hack to make enforcers work on steep overhangs. + //FIXME enforcer_overhang_offset is a fudge constant! + enforced_overhangs = offset(union_ex(enforced_overhangs), enforcer_overhang_offset); + overhangs = overhangs.empty() ? std::move(enforced_overhangs) : union_(overhangs, enforced_overhangs); + } + } +#endif + out[num_raft_layers] = std::move(overhangs); + throw_on_cancel(); + } +#endif + + return out; +} + +/*! + * \brief Precalculates all avoidances, that could be required. + * + * \param storage[in] Background storage to access meshes. + * \param currently_processing_meshes[in] Indexes of all meshes that are processed in this iteration + */ +[[nodiscard]] static LayerIndex precalculate(const Print &print, const std::vector &overhangs, const TreeSupportSettings &config, const std::vector &object_ids, TreeModelVolumes &volumes, std::function throw_on_cancel) +{ + // calculate top most layer that is relevant for support + LayerIndex max_layer = 0; + for (size_t object_id : object_ids) { + const PrintObject &print_object = *print.get_object(object_id); + const int num_raft_layers = int(config.raft_layers.size()); + const int num_layers = int(print_object.layer_count()) + num_raft_layers; + int max_support_layer_id = 0; + for (int layer_id = std::max(num_raft_layers, 1); layer_id < num_layers; ++ layer_id) + if (! overhangs[layer_id].empty()) + max_support_layer_id = layer_id; + max_layer = std::max(max_support_layer_id - int(config.z_distance_top_layers), 0); + } + if (max_layer > 0) + // The actual precalculation happens in TreeModelVolumes. + volumes.precalculate(*print.get_object(object_ids.front()), max_layer, throw_on_cancel); + return max_layer; +} + +/*! + * \brief Converts a Polygons object representing a line into the internal format. + * + * \param polylines[in] The Polyline that will be converted. + * \param layer_idx[in] The current layer. + * \return All lines of the \p polylines object, with information for each point regarding in which avoidance it is currently valid in. + */ +// Called by generate_initial_areas() +[[nodiscard]] static LineInformations convert_lines_to_internal( + const TreeModelVolumes &volumes, const TreeSupportSettings &config, + const Polylines &polylines, LayerIndex layer_idx) +{ + const bool min_xy_dist = config.xy_distance > config.xy_min_distance; + + LineInformations result; + // Also checks if the position is valid, if it is NOT, it deletes that point + for (const Polyline &line : polylines) { + LineInformation res_line; + for (Point p : line) { + if (! contains(volumes.getAvoidance(config.getRadius(0), layer_idx, TreeModelVolumes::AvoidanceType::FastSafe, false, min_xy_dist), p)) + res_line.emplace_back(p, LineStatus::TO_BP_SAFE); + else if (! contains(volumes.getAvoidance(config.getRadius(0), layer_idx, TreeModelVolumes::AvoidanceType::Fast, false, min_xy_dist), p)) + res_line.emplace_back(p, LineStatus::TO_BP); + else if (config.support_rests_on_model && ! contains(volumes.getAvoidance(config.getRadius(0), layer_idx, TreeModelVolumes::AvoidanceType::FastSafe, true, min_xy_dist), p)) + res_line.emplace_back(p, LineStatus::TO_MODEL_GRACIOUS_SAFE); + else if (config.support_rests_on_model && ! contains(volumes.getAvoidance(config.getRadius(0), layer_idx, TreeModelVolumes::AvoidanceType::Fast, true, min_xy_dist), p)) + res_line.emplace_back(p, LineStatus::TO_MODEL_GRACIOUS); + else if (config.support_rests_on_model && ! contains(volumes.getCollision(config.getRadius(0), layer_idx, min_xy_dist), p)) + res_line.emplace_back(p, LineStatus::TO_MODEL); + else if (!res_line.empty()) { + result.emplace_back(res_line); + res_line.clear(); + } + } + if (!res_line.empty()) { + result.emplace_back(res_line); + res_line.clear(); + } + } + + validate_range(result); + return result; +} + +/*! + * \brief Converts lines in internal format into a Polygons object representing these lines. + * + * \param lines[in] The lines that will be converted. + * \return All lines of the \p lines object as a Polygons object. + */ +[[nodiscard]] static Polylines convert_internal_to_lines(LineInformations lines) +{ + Polylines result; + for (LineInformation line : lines) { + Polyline path; + for (auto point_data : line) + path.points.emplace_back(point_data.first); + result.emplace_back(std::move(path)); + } + validate_range(result); + return result; +} + +/*! + * \brief Evaluates if a point has to be added now. Required for a split_lines call in generate_initial_areas(). + * + * \param current_layer[in] The layer on which the point lies, point and its status. + * \return whether the point is valid. + */ +[[nodiscard]] static bool evaluate_point_for_next_layer_function( + const TreeModelVolumes &volumes, const TreeSupportSettings &config, + size_t current_layer, const std::pair &p) +{ + using AvoidanceType = TreeModelVolumes::AvoidanceType; + const bool min_xy_dist = config.xy_distance > config.xy_min_distance; + if (! contains(volumes.getAvoidance(config.getRadius(0), current_layer - 1, p.second == LineStatus::TO_BP_SAFE ? AvoidanceType::FastSafe : AvoidanceType::Fast, false, min_xy_dist), p.first)) + return true; + if (config.support_rests_on_model && (p.second != LineStatus::TO_BP && p.second != LineStatus::TO_BP_SAFE)) + return ! contains( + p.second == LineStatus::TO_MODEL_GRACIOUS || p.second == LineStatus::TO_MODEL_GRACIOUS_SAFE ? + volumes.getAvoidance(config.getRadius(0), current_layer - 1, p.second == LineStatus::TO_MODEL_GRACIOUS_SAFE ? AvoidanceType::FastSafe : AvoidanceType::Fast, true, min_xy_dist) : + volumes.getCollision(config.getRadius(0), current_layer - 1, min_xy_dist), + p.first); + return false; +} + +/*! + * \brief Evaluates which points of some lines are not valid one layer below and which are. Assumes all points are valid on the current layer. Validity is evaluated using supplied lambda. + * + * \param lines[in] The lines that have to be evaluated. + * \param evaluatePoint[in] The function used to evaluate the points. + * \return A pair with which points are still valid in the first slot and which are not in the second slot. + */ +template +[[nodiscard]] static std::pair split_lines(const LineInformations &lines, EvaluatePointFn evaluatePoint) +{ + // assumes all Points on the current line are valid + + LineInformations keep; + LineInformations set_free; + for (const std::vector> &line : lines) { + bool current_keep = true; + LineInformation resulting_line; + for (const std::pair &me : line) { + if (evaluatePoint(me) != current_keep) { + if (! resulting_line.empty()) + (current_keep ? &keep : &set_free)->emplace_back(std::move(resulting_line)); + current_keep = !current_keep; + } + resulting_line.emplace_back(me); + } + if (! resulting_line.empty()) + (current_keep ? &keep : &set_free)->emplace_back(std::move(resulting_line)); + } + validate_range(keep); + validate_range(set_free); + return std::pair>>, std::vector>>>(keep, set_free); +} + +// Ported from CURA's PolygonUtils::getNextPointWithDistance() +// Sample a next point at distance "dist" from start_pt on polyline segment (start_idx, start_idx + 1). +// Returns sample point and start index of its segment on polyline if such sample exists. +static std::optional> polyline_sample_next_point_at_distance(const Points &polyline, const Point &start_pt, size_t start_idx, double dist) +{ + const double dist2 = sqr(dist); + const auto dist2i = int64_t(dist2); + static constexpr const auto eps = scaled(0.01); + + for (size_t i = start_idx + 1; i < polyline.size(); ++ i) { + const Point p1 = polyline[i]; + if ((p1 - start_pt).cast().squaredNorm() >= dist2i) { + // The end point is outside the circle with center "start_pt" and radius "dist". + const Point p0 = polyline[i - 1]; + Vec2d v = (p1 - p0).cast(); + double l2v = v.squaredNorm(); + if (l2v < sqr(eps)) { + // Very short segment. + Point c = (p0 + p1) / 2; + if (std::abs((start_pt - c).cast().norm() - dist) < eps) + return std::pair{ c, i - 1 }; + else + continue; + } + Vec2d p0f = (start_pt - p0).cast(); + // Foot point of start_pt into v. + Vec2d foot_pt = v * (p0f.dot(v) / l2v); + // Vector from foot point of "start_pt" to "start_pt". + Vec2d xf = p0f - foot_pt; + // Squared distance of "start_pt" from the ray (p0, p1). + double l2_from_line = xf.squaredNorm(); + // Squared distance of an intersection point of a circle with center at the foot point. + if (double l2_intersection = dist2 - l2_from_line; + l2_intersection > - SCALED_EPSILON) { + // The ray (p0, p1) touches or intersects a circle centered at "start_pt" with radius "dist". + // Distance of the circle intersection point from the foot point. + l2_intersection = std::max(l2_intersection, 0.); + if ((v - foot_pt).cast().squaredNorm() >= l2_intersection) { + // Intersection of the circle with the segment (p0, p1) is on the right side (close to p1) from the foot point. + Point p = p0 + (foot_pt + v * sqrt(l2_intersection / l2v)).cast(); + validate_range(p); + return std::pair{ p, i - 1 }; + } + } + } + } + return {}; +} + +/*! + * \brief Eensures that every line segment is about distance in length. The resulting lines may differ from the original but all points are on the original + * + * \param input[in] The lines on which evenly spaced points should be placed. + * \param distance[in] The distance the points should be from each other. + * \param min_points[in] The amount of points that have to be placed. If not enough can be placed the distance will be reduced to place this many points. + * \return A Polygons object containing the evenly spaced points. Does not represent an area, more a collection of points on lines. + */ +[[nodiscard]] static Polylines ensure_maximum_distance_polyline(const Polylines &input, double distance, size_t min_points) +{ + Polylines result; + for (Polyline part : input) { + if (part.empty()) + continue; + + double len = length(part.points); + Polyline line; + double current_distance = std::max(distance, scaled(0.1)); + if (len < 2 * distance && min_points <= 1) + { + // Insert the opposite point of the first one. + //FIXME pretty expensive + Polyline pl(part); + pl.clip_end(len / 2); + line.points.emplace_back(pl.points.back()); + } + else + { + size_t optimal_end_index = part.size() - 1; + + if (part.front() == part.back()) { + size_t optimal_start_index = 0; + // If the polyline was a polygon, there is a high chance it was an overhang. Overhangs that are <60� tend to be very thin areas, so lets get the beginning and end of them and ensure that they are supported. + // The first point of the line will always be supported, so rotate the order of points in this polyline that one of the two corresponding points that are furthest from each other is in the beginning. + // The other will be manually added (optimal_end_index) + coord_t max_dist2_between_vertecies = 0; + for (size_t idx = 0; idx < part.size() - 1; ++ idx) { + for (size_t inner_idx = 0; inner_idx < part.size() - 1; inner_idx++) { + if ((part[idx] - part[inner_idx]).cast().squaredNorm() > max_dist2_between_vertecies) { + optimal_start_index = idx; + optimal_end_index = inner_idx; + max_dist2_between_vertecies = (part[idx] - part[inner_idx]).cast().squaredNorm(); + } + } + } + std::rotate(part.begin(), part.begin() + optimal_start_index, part.end() - 1); + part[part.size() - 1] = part[0]; // restore that property that this polyline ends where it started. + optimal_end_index = (part.size() + optimal_end_index - optimal_start_index - 1) % (part.size() - 1); + } + + while (line.size() < min_points && current_distance >= scaled(0.1)) + { + line.clear(); + Point current_point = part[0]; + line.points.emplace_back(part[0]); + if (min_points > 1 || (part[0] - part[optimal_end_index]).cast().norm() > current_distance) + line.points.emplace_back(part[optimal_end_index]); + size_t current_index = 0; + std::optional> next_point; + double next_distance = current_distance; + // Get points so that at least min_points are added and they each are current_distance away from each other. If that is impossible, decrease current_distance a bit. + // The input are lines, that means that the line from the last to the first vertex does not have to exist, so exclude all points that are on this line! + while ((next_point = polyline_sample_next_point_at_distance(part.points, current_point, current_index, next_distance))) { + // Not every point that is distance away, is valid, as it may be much closer to another point. This is especially the case when the overhang is very thin. + // So this ensures that the points are actually a certain distance from each other. + // This assurance is only made on a per polygon basis, as different but close polygon may not be able to use support below the other polygon. + double min_distance_to_existing_point = std::numeric_limits::max(); + for (Point p : line) + min_distance_to_existing_point = std::min(min_distance_to_existing_point, (p - next_point->first).cast().norm()); + if (min_distance_to_existing_point >= current_distance) { + // viable point was found. Add to possible result. + line.points.emplace_back(next_point->first); + current_point = next_point->first; + current_index = next_point->second; + next_distance = current_distance; + } else { + if (current_point == next_point->first) { + // In case a fixpoint is encountered, better aggressively overcompensate so the code does not become stuck here... + BOOST_LOG_TRIVIAL(warning) << "Tree Support: Encountered a fixpoint in polyline_sample_next_point_at_distance. This is expected to happen if the distance (currently " << next_distance << + ") is smaller than 100"; + tree_supports_show_error("Encountered issue while placing tips. Some tips may be missing."sv, true); + if (next_distance > 2 * current_distance) + // This case should never happen, but better safe than sorry. + break; + next_distance += current_distance; + continue; + } + // if the point was too close, the next possible viable point is at least distance-min_distance_to_existing_point away from the one that was just checked. + next_distance = std::max(current_distance - min_distance_to_existing_point, scaled(0.1)); + current_point = next_point->first; + current_index = next_point->second; + } + } + current_distance *= 0.9; + } + } + result.emplace_back(std::move(line)); + } + validate_range(result); + return result; +} + +/*! + * \brief Returns Polylines representing the (infill) lines that will result in slicing the given area + * + * \param area[in] The area that has to be filled with infill. + * \param roof[in] Whether the roofing or regular support settings should be used. + * \param layer_idx[in] The current layer index. + * \param support_infill_distance[in] The distance that should be between the infill lines. + * + * \return A Polygons object that represents the resulting infill lines. + */ +[[nodiscard]] static Polylines generate_support_infill_lines( + // Polygon to fill in with a zig-zag pattern supporting an overhang. + const Polygons &polygon, + const SupportParameters &support_params, + bool roof, LayerIndex layer_idx, coord_t support_infill_distance) +{ +#if 0 + Polygons gaps; + // as we effectivly use lines to place our supportPoints we may use the Infill class for it, while not made for it it works perfect + + const EFillMethod pattern = roof ? config.roof_pattern : config.support_pattern; + +// const bool zig_zaggify_infill = roof ? pattern == EFillMethod::ZIG_ZAG : config.zig_zaggify_support; + const bool connect_polygons = false; + constexpr coord_t support_roof_overlap = 0; + constexpr size_t infill_multiplier = 1; + constexpr coord_t outline_offset = 0; + const int support_shift = roof ? 0 : support_infill_distance / 2; + const size_t wall_line_count = include_walls && !roof ? config.support_wall_count : 0; + const Point infill_origin; + constexpr Polygons* perimeter_gaps = nullptr; + constexpr bool use_endpieces = true; + const bool connected_zigzags = roof ? false : config.connect_zigzags; + const size_t zag_skip_count = roof ? 0 : config.zag_skip_count; + constexpr coord_t pocket_size = 0; + std::vector angles = roof ? config.support_roof_angles : config.support_infill_angles; + std::vector toolpaths; + + const coord_t z = config.getActualZ(layer_idx); + int divisor = static_cast(angles.size()); + int index = ((layer_idx % divisor) + divisor) % divisor; + const AngleRadians fill_angle = angles[index]; + Infill roof_computation(pattern, true /* zig_zaggify_infill */, connect_polygons, polygon, + roof ? config.support_roof_line_width : config.support_line_width, support_infill_distance, support_roof_overlap, infill_multiplier, + fill_angle, z, support_shift, config.resolution, wall_line_count, infill_origin, + perimeter_gaps, connected_zigzags, use_endpieces, false /* skip_some_zags */, zag_skip_count, pocket_size); + Polygons polygons; + Polygons lines; + roof_computation.generate(toolpaths, polygons, lines, config.settings); + append(lines, to_polylines(polygons)); + return lines; +#else +// const bool connected_zigzags = roof ? false : config.connect_zigzags; +// const int support_shift = roof ? 0 : support_infill_distance / 2; + + const Flow &flow = roof ? support_params.support_material_interface_flow : support_params.support_material_flow; + std::unique_ptr filler = std::unique_ptr(Fill::new_from_type(roof ? support_params.interface_fill_pattern : support_params.base_fill_pattern)); + FillParams fill_params; + + filler->layer_id = layer_idx; + filler->spacing = flow.spacing(); + filler->angle = roof ? + //fixme support_layer.interface_id() instead of layer_idx + (support_params.interface_angle + (layer_idx & 1) ? float(- M_PI / 4.) : float(+ M_PI / 4.)) : + support_params.base_angle; + + fill_params.density = float(roof ? support_params.interface_density : scaled(filler->spacing) / (scaled(filler->spacing) + float(support_infill_distance))); + fill_params.dont_adjust = true; + + Polylines out; + for (ExPolygon &expoly : union_ex(polygon)) { + // The surface type does not matter. + assert(area(expoly) > 0.); +#ifdef TREE_SUPPORT_SHOW_ERRORS_WIN32 + if (area(expoly) <= 0.) + ::MessageBoxA(nullptr, "TreeSupport infill negative area", "Bug detected!", MB_OK | MB_SYSTEMMODAL | MB_SETFOREGROUND | MB_ICONWARNING); +#endif // TREE_SUPPORT_SHOW_ERRORS_WIN32 + assert(intersecting_edges(to_polygons(expoly)).empty()); + check_self_intersections(expoly, "generate_support_infill_lines"); + Surface surface(stInternal, std::move(expoly)); + try { + Polylines pl = filler->fill_surface(&surface, fill_params); + assert(pl.empty() || get_extents(surface.expolygon).inflated(SCALED_EPSILON).contains(get_extents(pl))); +#ifdef TREE_SUPPORT_SHOW_ERRORS_WIN32 + if (! pl.empty() && ! get_extents(surface.expolygon).inflated(SCALED_EPSILON).contains(get_extents(pl))) + ::MessageBoxA(nullptr, "TreeSupport infill failure", "Bug detected!", MB_OK | MB_SYSTEMMODAL | MB_SETFOREGROUND | MB_ICONWARNING); +#endif // TREE_SUPPORT_SHOW_ERRORS_WIN32 + append(out, std::move(pl)); + } catch (InfillFailedException &) { + } + } + validate_range(out); + return out; +#endif +} + +/*! + * \brief Unions two Polygons. Ensures that if the input is non empty that the output also will be non empty. + * \param first[in] The first Polygon. + * \param second[in] The second Polygon. + * \return The union of both Polygons + */ +[[nodiscard]] static Polygons safe_union(const Polygons first, const Polygons second = {}) +{ + // unionPolygons can slowly remove Polygons under certain circumstances, because of rounding issues (Polygons that have a thin area). + // This does not cause a problem when actually using it on large areas, but as influence areas (representing centerpoints) can be very thin, this does occur so this ugly workaround is needed + // Here is an example of a Polygons object that will loose vertices when unioning, and will be gone after a few times unionPolygons was called: + /* + Polygons example; + Polygon exampleInner; + exampleInner.add(Point(120410,83599));//A + exampleInner.add(Point(120384,83643));//B + exampleInner.add(Point(120399,83618));//C + exampleInner.add(Point(120414,83591));//D + exampleInner.add(Point(120423,83570));//E + exampleInner.add(Point(120419,83580));//F + example.add(exampleInner); + for(int i=0;i<10;i++){ + log("Iteration %d Example area: %f\n",i,area(example)); + example=example.unionPolygons(); + } +*/ + + Polygons result; + if (! first.empty() || ! second.empty()) { + result = union_(first, second); + if (result.empty()) { + BOOST_LOG_TRIVIAL(debug) << "Caught an area destroying union, enlarging areas a bit."; + // just take the few lines we have, and offset them a tiny bit. Needs to be offsetPolylines, as offset may aleady have problems with the area. + result = union_(offset(to_polylines(first), scaled(0.002), jtMiter, 1.2), offset(to_polylines(second), scaled(0.002), jtMiter, 1.2)); + } + } + + return result; +} + +/*! + * \brief Offsets (increases the area of) a polygons object in multiple steps to ensure that it does not lag through over a given obstacle. + * \param me[in] Polygons object that has to be offset. + * \param distance[in] The distance by which me should be offset. Expects values >=0. + * \param collision[in] The area representing obstacles. + * \param last_step_offset_without_check[in] The most it is allowed to offset in one step. + * \param min_amount_offset[in] How many steps have to be done at least. As this uses round offset this increases the amount of vertices, which may be required if Polygons get very small. Required as arcTolerance is not exposed in offset, which should result with a similar result. + * \return The resulting Polygons object. + */ +[[nodiscard]] static Polygons safe_offset_inc(const Polygons& me, coord_t distance, const Polygons& collision, coord_t safe_step_size, coord_t last_step_offset_without_check, size_t min_amount_offset) +{ + bool do_final_difference = last_step_offset_without_check == 0; + Polygons ret = safe_union(me); // ensure sane input + + // Trim the collision polygons with the region of interest for diff() efficiency. + Polygons collision_trimmed_buffer; + auto collision_trimmed = [&collision_trimmed_buffer, &collision, &ret, distance]() -> const Polygons& { + if (collision_trimmed_buffer.empty() && ! collision.empty()) + collision_trimmed_buffer = ClipperUtils::clip_clipper_polygons_with_subject_bbox(collision, get_extents(ret).inflated(std::max(0, distance) + SCALED_EPSILON)); + return collision_trimmed_buffer; + }; + + if (distance == 0) + return do_final_difference ? diff(ret, collision_trimmed()) : union_(ret); + if (safe_step_size < 0 || last_step_offset_without_check < 0) { + BOOST_LOG_TRIVIAL(error) << "Offset increase got invalid parameter!"; + tree_supports_show_error("Negative offset distance... How did you manage this ?"sv, true); + return do_final_difference ? diff(ret, collision_trimmed()) : union_(ret); + } + + coord_t step_size = safe_step_size; + int steps = distance > last_step_offset_without_check ? (distance - last_step_offset_without_check) / step_size : 0; + if (distance - steps * step_size > last_step_offset_without_check) { + if ((steps + 1) * step_size <= distance) + // This will be the case when last_step_offset_without_check >= safe_step_size + ++ steps; + else + do_final_difference = true; + } + if (steps + (distance < last_step_offset_without_check || distance % step_size != 0) < min_amount_offset && min_amount_offset > 1) { + // yes one can add a bool as the standard specifies that a result from compare operators has to be 0 or 1 + // reduce the stepsize to ensure it is offset the required amount of times + step_size = distance / min_amount_offset; + if (step_size >= safe_step_size) { + // effectivly reduce last_step_offset_without_check + step_size = safe_step_size; + steps = min_amount_offset; + } else + steps = distance / step_size; + } + // offset in steps + for (int i = 0; i < steps; ++ i) { + ret = diff(offset(ret, step_size, ClipperLib::jtRound, scaled(0.01)), collision_trimmed()); + // ensure that if many offsets are done the performance does not suffer extremely by the new vertices of jtRound. + if (i % 10 == 7) + ret = polygons_simplify(ret, scaled(0.015)); + } + // offset the remainder + float last_offset = distance - steps * step_size; + if (last_offset > SCALED_EPSILON) + ret = offset(ret, distance - steps * step_size, ClipperLib::jtRound, scaled(0.01)); + ret = polygons_simplify(ret, scaled(0.015)); + + if (do_final_difference) + ret = diff(ret, collision_trimmed()); + return union_(ret); +} + +static double layer_z(const SlicingParameters &slicing_params, const TreeSupportSettings &config, const size_t layer_idx) +{ + return layer_idx >= config.raft_layers.size() ? + slicing_params.object_print_z_min + slicing_params.first_object_layer_height + (layer_idx - config.raft_layers.size()) * slicing_params.layer_height : + config.raft_layers[layer_idx]; +} +// Lowest collision layer +static LayerIndex layer_idx_ceil(const SlicingParameters &slicing_params, const TreeSupportSettings &config, const double z) +{ + return + LayerIndex(config.raft_layers.size()) + + std::max(0, ceil((z - slicing_params.object_print_z_min - slicing_params.first_object_layer_height) / slicing_params.layer_height)); +} +// Highest collision layer +static LayerIndex layer_idx_floor(const SlicingParameters &slicing_params, const TreeSupportSettings &config, const double z) +{ + return + LayerIndex(config.raft_layers.size()) + + std::max(0, floor((z - slicing_params.object_print_z_min - slicing_params.first_object_layer_height) / slicing_params.layer_height)); +} + +static inline SupportGeneratorLayer& layer_initialize( + SupportGeneratorLayer &layer_new, + const SupporLayerType layer_type, + const SlicingParameters &slicing_params, + const TreeSupportSettings &config, + const size_t layer_idx) +{ + layer_new.layer_type = layer_type; + layer_new.print_z = layer_z(slicing_params, config, layer_idx); + layer_new.bottom_z = layer_idx > 0 ? layer_z(slicing_params, config, layer_idx - 1) : 0; + layer_new.height = layer_new.print_z - layer_new.bottom_z; + return layer_new; +} + +// Using the std::deque as an allocator. +inline SupportGeneratorLayer& layer_allocate( + std::deque &layer_storage, + SupporLayerType layer_type, + const SlicingParameters &slicing_params, + const TreeSupportSettings &config, + size_t layer_idx) +{ + //FIXME take raft into account. + layer_storage.push_back(SupportGeneratorLayer()); + return layer_initialize(layer_storage.back(), layer_type, slicing_params, config, layer_idx); +} + +inline SupportGeneratorLayer& layer_allocate( + std::deque &layer_storage, + tbb::spin_mutex& layer_storage_mutex, + SupporLayerType layer_type, + const SlicingParameters &slicing_params, + const TreeSupportSettings &config, + size_t layer_idx) +{ + tbb::spin_mutex::scoped_lock lock(layer_storage_mutex); + layer_storage.push_back(SupportGeneratorLayer()); + return layer_initialize(layer_storage.back(), layer_type, slicing_params, config, layer_idx); +} + +int generate_raft_contact( + const PrintObject &print_object, + const TreeSupportSettings &config, + SupportGeneratorLayersPtr &top_contacts, + SupportGeneratorLayerStorage &layer_storage) +{ + int raft_contact_layer_idx = -1; + if (print_object.has_raft() && print_object.layer_count() > 0) { + // Produce raft contact layer outside of the tree support loop, so that no trees will be generated for the raft contact layer. + // Raft layers supporting raft contact interface will be produced by the classic raft generator. + // Find the raft contact layer. + raft_contact_layer_idx = int(config.raft_layers.size()) - 1; + while (raft_contact_layer_idx > 0 && config.raft_layers[raft_contact_layer_idx] > print_object.slicing_parameters().raft_contact_top_z + EPSILON) + -- raft_contact_layer_idx; + // Create the raft contact layer. + SupportGeneratorLayer &raft_contact_layer = layer_allocate(layer_storage, SupporLayerType::TopContact, print_object.slicing_parameters(), config, raft_contact_layer_idx); + top_contacts[raft_contact_layer_idx] = &raft_contact_layer; + const ExPolygons &lslices = print_object.get_layer(0)->lslices; + double expansion = print_object.config().raft_expansion.value; + raft_contact_layer.polygons = expansion > 0 ? expand(lslices, scaled(expansion)) : to_polygons(lslices); + } + return raft_contact_layer_idx; +} + +using SupportElements = std::deque; + +void finalize_raft_contact( + const PrintObject &print_object, + const int raft_contact_layer_idx, + SupportGeneratorLayersPtr &top_contacts, + std::vector &move_bounds) +{ + if (raft_contact_layer_idx >= 0) { + const size_t first_tree_layer = print_object.slicing_parameters().raft_layers() - 1; + // Remove tree tips that start below the raft contact, + // remove interface layers below the raft contact. + for (size_t i = 0; i < first_tree_layer; ++i) { + top_contacts[i] = nullptr; + move_bounds[i].clear(); + } + if (raft_contact_layer_idx >= 0 && print_object.config().raft_expansion.value > 0) { + // If any tips at first_tree_layer now are completely inside the expanded raft layer, remove them as well before they are propagated to the ground. + Polygons &raft_polygons = top_contacts[raft_contact_layer_idx]->polygons; + EdgeGrid::Grid grid(get_extents(raft_polygons).inflated(SCALED_EPSILON)); + grid.create(raft_polygons, Polylines{}, coord_t(scale_(10.))); + SupportElements &first_layer_move_bounds = move_bounds[first_tree_layer]; + double threshold = scaled(print_object.config().raft_expansion.value) * 2.; + first_layer_move_bounds.erase(std::remove_if(first_layer_move_bounds.begin(), first_layer_move_bounds.end(), + [&grid, threshold](const SupportElement &el) { + coordf_t dist; + if (grid.signed_distance_edges(el.state.result_on_layer, threshold, dist)) { + assert(std::abs(dist) < threshold + SCALED_EPSILON); + // Support point is inside the expanded raft, remove it. + return dist < - 0.; + } + return false; + }), first_layer_move_bounds.end()); + #if 0 + // Remove the remaining tips from the raft: Closing operation on tip circles. + if (! first_layer_move_bounds.empty()) { + const double eps = 0.1; + // All tips supporting this layer are expected to have the same radius. + double radius = config.getRadius(first_layer_move_bounds.front().state); + // Connect the tips with the following closing radius. + double closing_distance = radius; + Polygon circle = make_circle(radius + closing_distance, eps); + Polygons circles; + circles.reserve(first_layer_move_bounds.size()); + for (const SupportElement &el : first_layer_move_bounds) { + circles.emplace_back(circle); + circles.back().translate(el.state.result_on_layer); + } + raft_polygons = diff(raft_polygons, offset(union_(circles), - closing_distance)); + } + #endif + } + } +} + +class InterfacePlacer { +public: + InterfacePlacer(const SlicingParameters &slicing_parameters, const TreeModelVolumes &volumes, const TreeSupportSettings &config, bool force_tip_to_roof, size_t num_support_layers, + std::vector &move_bounds, SupportGeneratorLayerStorage &layer_storage, SupportGeneratorLayersPtr &top_contacts) : + slicing_parameters(slicing_parameters), volumes(volumes), config(config), force_tip_to_roof(force_tip_to_roof), + move_bounds(move_bounds), layer_storage(layer_storage), top_contacts(top_contacts) { + m_already_inserted.assign(num_support_layers, {}); + this->min_xy_dist = config.xy_distance > config.xy_min_distance; + } + const SlicingParameters &slicing_parameters; + const TreeModelVolumes &volumes; + const TreeSupportSettings &config; + bool force_tip_to_roof; + bool min_xy_dist; + + // Outputs + std::vector &move_bounds; + SupportGeneratorLayerStorage &layer_storage; + SupportGeneratorLayersPtr &top_contacts; + +private: + // Temps + static constexpr const auto m_base_radius = scaled(0.01); + const Polygon m_base_circle { make_circle(m_base_radius, SUPPORT_TREE_CIRCLE_RESOLUTION) }; + + // Mutexes, guards + std::mutex m_mutex_movebounds; + std::mutex m_mutex_layer_storage; + std::vector> m_already_inserted; + +public: + void add_roof_unguarded(Polygons &&new_roofs, const size_t insert_layer_idx) + { + SupportGeneratorLayer*& l = top_contacts[insert_layer_idx]; + if (l == nullptr) + l = &layer_allocate(layer_storage, SupporLayerType::TopContact, slicing_parameters, config, insert_layer_idx); + // will be unioned in finalize_interface_and_support_areas() + append(l->polygons, std::move(new_roofs)); + } + + void add_roof(Polygons &&new_roofs, const size_t insert_layer_idx) + { + std::lock_guard lock(m_mutex_layer_storage); + add_roof_unguarded(std::move(new_roofs), insert_layer_idx); + } + + void add_roofs(std::vector &&new_roofs, const size_t insert_layer_idx, const size_t dtt_roof) + { + if (! new_roofs.empty()) { + std::lock_guard lock(m_mutex_layer_storage); + for (size_t idx = 0; idx < dtt_roof; ++ idx) + if (! new_roofs[idx].empty()) + add_roof_unguarded(std::move(new_roofs[idx]), insert_layer_idx - idx); + } + } + + void add_roof_build_plate(Polygons &&overhang_areas) + { + std::lock_guard lock(m_mutex_layer_storage); + SupportGeneratorLayer*& l = top_contacts[0]; + if (l == nullptr) + l = &layer_allocate(layer_storage, SupporLayerType::TopContact, slicing_parameters, config, 0); + append(l->polygons, std::move(overhang_areas)); + } + + void add_points_along_lines( + // Insert points (tree tips or top contact interfaces) along these lines. + LineInformations lines, + // Start at this layer. + LayerIndex insert_layer_idx, + // Insert this number of interface layers. + size_t roof_tip_layers, + // True if an interface is already generated above these lines. + bool supports_roof, + // The element tries to not move until this dtt is reached. + size_t dont_move_until) + { + validate_range(lines); + // Add tip area as roof (happens when minimum roof area > minimum tip area) if possible + size_t dtt_roof_tip; + for (dtt_roof_tip = 0; dtt_roof_tip < roof_tip_layers && insert_layer_idx - dtt_roof_tip >= 1; ++ dtt_roof_tip) { + size_t this_layer_idx = insert_layer_idx - dtt_roof_tip; + auto evaluateRoofWillGenerate = [&](const std::pair &p) { + //FIXME Vojtech: The circle is just shifted, it has a known size, the infill should fit all the time! + #if 0 + Polygon roof_circle; + for (Point corner : base_circle) + roof_circle.points.emplace_back(p.first + corner * config.min_radius); + return !generate_support_infill_lines({ roof_circle }, config, true, insert_layer_idx - dtt_roof_tip, config.support_roof_line_distance).empty(); + #else + return true; + #endif + }; + + { + std::pair split = + // keep all lines that are still valid on the next layer + split_lines(lines, [this, this_layer_idx](const std::pair &p) + { return evaluate_point_for_next_layer_function(volumes, config, this_layer_idx, p); }); + LineInformations points = std::move(split.second); + // Not all roofs are guaranteed to actually generate lines, so filter these out and add them as points. + split = split_lines(split.first, evaluateRoofWillGenerate); + lines = std::move(split.first); + append(points, split.second); + // add all points that would not be valid + for (const LineInformation &line : points) + for (const std::pair &point_data : line) + add_point_as_influence_area(point_data, this_layer_idx, + // don't move until + roof_tip_layers - dtt_roof_tip, + // supports roof + dtt_roof_tip > 0, + // disable ovalization + false); + } + + // add all tips as roof to the roof storage + Polygons new_roofs; + for (const LineInformation &line : lines) + //FIXME sweep the tip radius along the line? + for (const std::pair &p : line) { + Polygon roof_circle{ m_base_circle }; + roof_circle.scale(config.min_radius / m_base_radius); + roof_circle.translate(p.first); + new_roofs.emplace_back(std::move(roof_circle)); + } + this->add_roof(std::move(new_roofs), this_layer_idx); + } + + for (const LineInformation &line : lines) { + // If a line consists of enough tips, the assumption is that it is not a single tip, but part of a simulated support pattern. + // Ovalisation should be disabled for these to improve the quality of the lines when tip_diameter=line_width + bool disable_ovalistation = config.min_radius < 3 * config.support_line_width && roof_tip_layers == 0 && dtt_roof_tip == 0 && line.size() > 5; + for (const std::pair &point_data : line) + add_point_as_influence_area(point_data, insert_layer_idx - dtt_roof_tip, + // don't move until + dont_move_until > dtt_roof_tip ? dont_move_until - dtt_roof_tip : 0, + // supports roof + dtt_roof_tip > 0 || supports_roof, + disable_ovalistation); + } + } + + void add_point_as_influence_area(std::pair p, LayerIndex insert_layer, size_t dont_move_until, bool roof, bool skip_ovalisation) + { + bool to_bp = p.second == LineStatus::TO_BP || p.second == LineStatus::TO_BP_SAFE; + bool gracious = to_bp || p.second == LineStatus::TO_MODEL_GRACIOUS || p.second == LineStatus::TO_MODEL_GRACIOUS_SAFE; + bool safe_radius = p.second == LineStatus::TO_BP_SAFE || p.second == LineStatus::TO_MODEL_GRACIOUS_SAFE; + if (! config.support_rests_on_model && ! to_bp) { + BOOST_LOG_TRIVIAL(warning) << "Tried to add an invalid support point"; + tree_supports_show_error("Unable to add tip. Some overhang may not be supported correctly."sv, true); + return; + } + Polygons circle{ m_base_circle }; + circle.front().translate(p.first); + { + std::lock_guard critical_section_movebounds(m_mutex_movebounds); + Point hash_pos = p.first / ((config.min_radius + 1) / 10); + if (!m_already_inserted[insert_layer].count(hash_pos)) { + // normalize the point a bit to also catch points which are so close that inserting it would achieve nothing + m_already_inserted[insert_layer].emplace(hash_pos); + static constexpr const size_t dtt = 0; + SupportElementState state; + state.target_height = insert_layer; + state.target_position = p.first; + state.next_position = p.first; + state.layer_idx = insert_layer; + state.effective_radius_height = dtt; + state.to_buildplate = to_bp; + state.distance_to_top = dtt; + state.result_on_layer = p.first; + assert(state.result_on_layer_is_set()); + state.increased_to_model_radius = 0; + state.to_model_gracious = gracious; + state.elephant_foot_increases = 0; + state.use_min_xy_dist = min_xy_dist; + state.supports_roof = roof; + state.dont_move_until = dont_move_until; + state.can_use_safe_radius = safe_radius; + state.missing_roof_layers = force_tip_to_roof ? dont_move_until : 0; + state.skip_ovalisation = skip_ovalisation; + move_bounds[insert_layer].emplace_back(state, std::move(circle)); + } + } + }; +}; + +// Produce +// 1) Maximum num_support_roof_layers roof (top interface & contact) layers. +// 2) Tree tips supporting either the roof layers or the object itself. +// num_support_roof_layers should always be respected: +// If num_support_roof_layers contact layers could not be produced, then the tree tip +// is augmented with SupportElementState::missing_roof_layers +// and the top "missing_roof_layers" of such particular tree tips are supposed to be coverted to +// roofs aka interface layers by the tool path generator. +void sample_overhang_area( + // Area to support + Polygons &&overhang_area, + // If true, then the overhang_area is likely large and wide, thus it is worth to try + // to cover it with continuous interfaces supported by zig-zag patterned tree tips. + const bool large_horizontal_roof, + // Index of the top suport layer generated by this function. + const size_t layer_idx, + // Number of roof (contact, interface) layers between the overhang and tree tips. + const size_t num_support_roof_layers, + // + const coord_t connect_length, + // Configuration classes + const TreeSupportMeshGroupSettings &mesh_group_settings, + const SupportParameters &support_params, + // Configuration & Output + InterfacePlacer &interface_placer) +{ + // Assumption is that roof will support roof further up to avoid a lot of unnecessary branches. Each layer down it is checked whether the roof area + // is still large enough to be a roof and aborted as soon as it is not. This part was already reworked a few times, and there could be an argument + // made to change it again if there are actual issues encountered regarding supporting roofs. + // Main problem is that some patterns change each layer, so just calculating points and checking if they are still valid an layer below is not useful, + // as the pattern may be different one layer below. Same with calculating which points are now no longer being generated as result from + // a decreasing roof, as there is no guarantee that a line will be above these points. Implementing a separate roof support behavior + // for each pattern harms maintainability as it very well could be >100 LOC + auto generate_roof_lines = [&support_params, &mesh_group_settings](const Polygons &area, LayerIndex layer_idx) -> Polylines { + return generate_support_infill_lines(area, support_params, true, layer_idx, mesh_group_settings.support_roof_line_distance); + }; + + LineInformations overhang_lines; + size_t dtt_roof = 0; + size_t layer_generation_dtt = 0; + + if (large_horizontal_roof) { + assert(num_support_roof_layers > 0); + // Sometimes roofs could be empty as the pattern does not generate lines if the area is narrow enough (i am looking at you, concentric infill). + // To catch these cases the added roofs are saved to be evaluated later. + std::vector added_roofs(num_support_roof_layers); + Polygons last_overhang = overhang_area; + for (dtt_roof = 0; dtt_roof < num_support_roof_layers && layer_idx - dtt_roof >= 1; ++ dtt_roof) { + // here the roof is handled. If roof can not be added the branches will try to not move instead + Polygons forbidden_next; + { + const bool min_xy_dist = interface_placer.config.xy_distance > interface_placer.config.xy_min_distance; + const Polygons &forbidden_next_raw = interface_placer.config.support_rests_on_model ? + interface_placer.volumes.getCollision(interface_placer.config.getRadius(0), layer_idx - (dtt_roof + 1), min_xy_dist) : + interface_placer.volumes.getAvoidance(interface_placer.config.getRadius(0), layer_idx - (dtt_roof + 1), TreeModelVolumes::AvoidanceType::Fast, false, min_xy_dist); + // prevent rounding errors down the line + //FIXME maybe use SafetyOffset::Yes at the following diff() instead? + forbidden_next = offset(union_ex(forbidden_next_raw), scaled(0.005), jtMiter, 1.2); + } + Polygons overhang_area_next = diff(overhang_area, forbidden_next); + if (area(overhang_area_next) < mesh_group_settings.minimum_roof_area) { + // next layer down the roof area would be to small so we have to insert our roof support here. Also convert squaremicrons to squaremilimeter + if (dtt_roof != 0) { + size_t dtt_before = dtt_roof > 0 ? dtt_roof - 1 : 0; + // Produce support head points supporting an interface layer: First produce the interface lines, then sample them. + overhang_lines = split_lines( + convert_lines_to_internal(interface_placer.volumes, interface_placer.config, + ensure_maximum_distance_polyline(generate_roof_lines(last_overhang, layer_idx - dtt_before), connect_length, 1), layer_idx - dtt_before), + [&interface_placer, layer_idx, dtt_before](const std::pair &p) + { return evaluate_point_for_next_layer_function(interface_placer.volumes, interface_placer.config, layer_idx - dtt_before, p); }) + .first; + } + break; + } + added_roofs[dtt_roof] = overhang_area; + last_overhang = std::move(overhang_area); + overhang_area = std::move(overhang_area_next); + } + + layer_generation_dtt = std::max(dtt_roof, size_t(1)) - 1; // 1 inside max and -1 outside to avoid underflow. layer_generation_dtt=dtt_roof-1 if dtt_roof!=0; + // if the roof should be valid, check that the area does generate lines. This is NOT guaranteed. + if (overhang_lines.empty() && dtt_roof != 0 && generate_roof_lines(overhang_area, layer_idx - layer_generation_dtt).empty()) + for (size_t idx = 0; idx < dtt_roof; idx++) { + // check for every roof area that it has resulting lines. Remember idx 1 means the 2. layer of roof => higher idx == lower layer + if (generate_roof_lines(added_roofs[idx], layer_idx - idx).empty()) { + dtt_roof = idx; + layer_generation_dtt = std::max(dtt_roof, size_t(1)) - 1; + break; + } + } + interface_placer.add_roofs(std::move(added_roofs), layer_idx, dtt_roof); + } + + if (overhang_lines.empty()) { + // support_line_width to form a line here as otherwise most will be unsupported. Technically this violates branch distance, but not only is this the only reasonable choice, + // but it ensures consistant behaviour as some infill patterns generate each line segment as its own polyline part causing a similar line forming behaviour. + // This is not doen when a roof is above as the roof will support the model and the trees only need to support the roof + bool supports_roof = dtt_roof > 0; + bool continuous_tips = ! supports_roof && large_horizontal_roof; + Polylines polylines = ensure_maximum_distance_polyline( + generate_support_infill_lines(overhang_area, support_params, supports_roof, layer_idx - layer_generation_dtt, + supports_roof ? mesh_group_settings.support_roof_line_distance : mesh_group_settings.support_tree_branch_distance), + continuous_tips ? interface_placer.config.min_radius / 2 : connect_length, 1); + size_t point_count = 0; + for (const Polyline &poly : polylines) + point_count += poly.size(); + const size_t min_support_points = std::max(coord_t(1), std::min(coord_t(3), coord_t(total_length(overhang_area) / connect_length))); + if (point_count <= min_support_points) { + // add the outer wall (of the overhang) to ensure it is correct supported instead. Try placing the support points in a way that they fully support the outer wall, instead of just the with half of the the support line width. + // I assume that even small overhangs are over one line width wide, so lets try to place the support points in a way that the full support area generated from them + // will support the overhang (if this is not done it may only be half). This WILL NOT be the case when supporting an angle of about < 60� so there is a fallback, + // as some support is better than none. + Polygons reduced_overhang_area = offset(union_ex(overhang_area), - interface_placer.config.support_line_width / 2.2, jtMiter, 1.2); + polylines = ensure_maximum_distance_polyline( + to_polylines( + ! reduced_overhang_area.empty() && + area(offset(diff_ex(overhang_area, reduced_overhang_area), std::max(interface_placer.config.support_line_width, connect_length), jtMiter, 1.2)) < sqr(scaled(0.001)) ? + reduced_overhang_area : + overhang_area), + connect_length, min_support_points); + } + overhang_lines = convert_lines_to_internal(interface_placer.volumes, interface_placer.config, polylines, layer_idx - dtt_roof); + } + + if (int(dtt_roof) >= layer_idx && large_horizontal_roof) + // reached buildplate + interface_placer.add_roof_build_plate(std::move(overhang_area)); + else { + // normal trees have to be generated + const bool roof_enabled = num_support_roof_layers > 0; + interface_placer.add_points_along_lines( + // Sample along these lines + overhang_lines, + // First layer index to insert the tree tips or interfaces. + layer_idx - dtt_roof, + // Remaining roof tip layers. + interface_placer.force_tip_to_roof ? num_support_roof_layers - dtt_roof : 0, + // Supports roof already? + dtt_roof > 0, + // Don't move until the following distance to top is reached. + roof_enabled ? num_support_roof_layers - dtt_roof : 0); + } +} + +/*! + * \brief Creates the initial influence areas (that can later be propagated down) by placing them below the overhang. + * + * Generates Points where the Model should be supported and creates the areas where these points have to be placed. + * + * \param mesh[in] The mesh that is currently processed. + * \param move_bounds[out] Storage for the influence areas. + * \param storage[in] Background storage, required for adding roofs. + */ +static void generate_initial_areas( + const PrintObject &print_object, + const TreeModelVolumes &volumes, + const TreeSupportSettings &config, + const std::vector &overhangs, + std::vector &move_bounds, + SupportGeneratorLayersPtr &top_contacts, + SupportGeneratorLayersPtr &top_interface_layers, + SupportGeneratorLayerStorage &layer_storage, + std::function throw_on_cancel) +{ + using AvoidanceType = TreeModelVolumes::AvoidanceType; + TreeSupportMeshGroupSettings mesh_group_settings(print_object); + SupportParameters support_params(print_object); + support_params.with_sheath = true; + support_params.support_density = 0; + + // To ensure z_distance_top_layers are left empty between the overhang (zeroth empty layer), the support has to be added z_distance_top_layers+1 layers below + const size_t z_distance_delta = config.z_distance_top_layers + 1; + + const bool min_xy_dist = config.xy_distance > config.xy_min_distance; + +#if 0 + if (mesh.overhang_areas.size() <= z_distance_delta) + return; +#endif + + const coord_t connect_length = (config.support_line_width * 100. / mesh_group_settings.support_tree_top_rate) + std::max(2. * config.min_radius - 1.0 * config.support_line_width, 0.0); + // As r*r=x*x+y*y (circle equation): If a circle with center at (0,0) the top most point is at (0,r) as in y=r. + // This calculates how far one has to move on the x-axis so that y=r-support_line_width/2. + // In other words how far does one need to move on the x-axis to be support_line_width/2 away from the circle line. + // As a circle is round this length is identical for every axis as long as the 90 degrees angle between both remains. + const coord_t circle_length_to_half_linewidth_change = config.min_radius < config.support_line_width ? + config.min_radius / 2 : + scale_(sqrt(sqr(unscale(config.min_radius)) - sqr(unscale(config.min_radius - config.support_line_width / 2)))); + // Extra support offset to compensate for larger tip radiis. Also outset a bit more when z overwrites xy, because supporting something with a part of a support line is better than not supporting it at all. + //FIXME Vojtech: This is not sufficient for support enforcers to work. + //FIXME There is no account for the support overhang angle. + //FIXME There is no account for the width of the collision regions. + const coord_t extra_outset = std::max(coord_t(0), config.min_radius - config.support_line_width / 2) + (min_xy_dist ? config.support_line_width / 2 : 0) + //FIXME this is a heuristic value for support enforcers to work. +// + 10 * config.support_line_width; + ; + const size_t num_support_roof_layers = mesh_group_settings.support_roof_enable ? (mesh_group_settings.support_roof_height + config.layer_height / 2) / config.layer_height : 0; + const bool roof_enabled = num_support_roof_layers > 0; + const bool force_tip_to_roof = sqr(config.min_radius) * M_PI > mesh_group_settings.minimum_roof_area && roof_enabled; + //FIXME mesh_group_settings.support_angle does not apply to enforcers and also it does not apply to automatic support angle (by half the external perimeter width). + //used by max_overhang_insert_lag, only if not min_xy_dist. + const coord_t max_overhang_speed = mesh_group_settings.support_angle < 0.5 * M_PI ? coord_t(tan(mesh_group_settings.support_angle) * config.layer_height) : std::numeric_limits::max(); + // cap for how much layer below the overhang a new support point may be added, as other than with regular support every new inserted point + // may cause extra material and time cost. Could also be an user setting or differently calculated. Idea is that if an overhang + // does not turn valid in double the amount of layers a slope of support angle would take to travel xy_distance, nothing reasonable will come from it. + // The 2*z_distance_delta is only a catch for when the support angle is very high. + // Used only if not min_xy_dist. + const coord_t max_overhang_insert_lag = config.z_distance_top_layers > 0 ? + std::max(round_up_divide(config.xy_distance, max_overhang_speed / 2), 2 * config.z_distance_top_layers) : + 0; + + size_t num_support_layers; + int raft_contact_layer_idx; + // Layers with their overhang regions. + std::vector> raw_overhangs; + + { + const size_t num_raft_layers = config.raft_layers.size(); + const size_t first_support_layer = std::max(int(num_raft_layers) - int(z_distance_delta), 1); + num_support_layers = size_t(std::max(0, int(print_object.layer_count()) + int(num_raft_layers) - int(z_distance_delta))); + raft_contact_layer_idx = generate_raft_contact(print_object, config, top_contacts, layer_storage); + // Enumerate layers for which the support tips may be generated from overhangs above. + raw_overhangs.reserve(num_support_layers - first_support_layer); + for (size_t layer_idx = first_support_layer; layer_idx < num_support_layers; ++ layer_idx) + if (const size_t overhang_idx = layer_idx + z_distance_delta; ! overhangs[overhang_idx].empty()) + raw_overhangs.push_back({ layer_idx, &overhangs[overhang_idx] }); + } + + InterfacePlacer interface_placer{ print_object.slicing_parameters(), volumes, config, force_tip_to_roof, num_support_layers, + // Outputs + move_bounds, layer_storage, top_contacts }; + + tbb::parallel_for(tbb::blocked_range(0, raw_overhangs.size()), + [&volumes, &config, &raw_overhangs, &mesh_group_settings, &support_params, + min_xy_dist, force_tip_to_roof, roof_enabled, num_support_roof_layers, extra_outset, circle_length_to_half_linewidth_change, connect_length, max_overhang_insert_lag, + &interface_placer, &throw_on_cancel](const tbb::blocked_range &range) { + for (size_t raw_overhang_idx = range.begin(); raw_overhang_idx < range.end(); ++ raw_overhang_idx) { + size_t layer_idx = raw_overhangs[raw_overhang_idx].first; + const Polygons &overhang_raw = *raw_overhangs[raw_overhang_idx].second; + + // take the least restrictive avoidance possible + Polygons relevant_forbidden; + { + const Polygons &relevant_forbidden_raw = config.support_rests_on_model ? + volumes.getCollision(config.getRadius(0), layer_idx, min_xy_dist) : + volumes.getAvoidance(config.getRadius(0), layer_idx, AvoidanceType::Fast, false, min_xy_dist); + // prevent rounding errors down the line, points placed directly on the line of the forbidden area may not be added otherwise. + relevant_forbidden = offset(union_ex(relevant_forbidden_raw), scaled(0.005), jtMiter, 1.2); + } + + // every overhang has saved if a roof should be generated for it. This can NOT be done in the for loop as an area may NOT have a roof + // even if it is larger than the minimum_roof_area when it is only larger because of the support horizontal expansion and + // it would not have a roof if the overhang is offset by support roof horizontal expansion instead. (At least this is the current behavior of the regular support) + Polygons overhang_regular; + { + // When support_offset = 0 safe_offset_inc will only be the difference between overhang_raw and relevant_forbidden, that has to be calculated anyway. + overhang_regular = safe_offset_inc(overhang_raw, mesh_group_settings.support_offset, relevant_forbidden, config.min_radius * 1.75 + config.xy_min_distance, 0, 1); + //check_self_intersections(overhang_regular, "overhang_regular1"); + + // offset ensures that areas that could be supported by a part of a support line, are not considered unsupported overhang + Polygons remaining_overhang = intersection( + diff(mesh_group_settings.support_offset == 0 ? + overhang_raw : + offset(union_ex(overhang_raw), mesh_group_settings.support_offset, jtMiter, 1.2), + offset(union_ex(overhang_regular), config.support_line_width * 0.5, jtMiter, 1.2)), + relevant_forbidden); + + // Offset the area to compensate for large tip radiis. Offset happens in multiple steps to ensure the tip is as close to the original overhang as possible. + //+config.support_line_width / 80 to avoid calculating very small (useless) offsets because of rounding errors. + //FIXME likely a better approach would be to find correspondences between the full overhang and the trimmed overhang + // and if there is no correspondence, project the missing points to the clipping curve. + for (coord_t extra_total_offset_acc = 0; ! remaining_overhang.empty() && extra_total_offset_acc + config.support_line_width / 8 < extra_outset; ) { + const coord_t offset_current_step = std::min( + extra_total_offset_acc + 2 * config.support_line_width > config.min_radius ? + config.support_line_width / 8 : + circle_length_to_half_linewidth_change, + extra_outset - extra_total_offset_acc); + extra_total_offset_acc += offset_current_step; + const Polygons &raw_collision = volumes.getCollision(0, layer_idx, true); + const coord_t offset_step = config.xy_min_distance + config.support_line_width; + // Reducing the remaining overhang by the areas already supported. + //FIXME 1.5 * extra_total_offset_acc seems to be too much, it may remove some remaining overhang without being supported at all. + remaining_overhang = diff(remaining_overhang, safe_offset_inc(overhang_regular, 1.5 * extra_total_offset_acc, raw_collision, offset_step, 0, 1)); + // Extending the overhangs by the inflated remaining overhangs. + overhang_regular = union_(overhang_regular, diff(safe_offset_inc(remaining_overhang, extra_total_offset_acc, raw_collision, offset_step, 0, 1), relevant_forbidden)); + //check_self_intersections(overhang_regular, "overhang_regular2"); + } +#if 0 + // If the xy distance overrides the z distance, some support needs to be inserted further down. + //=> Analyze which support points do not fit on this layer and check if they will fit a few layers down (while adding them an infinite amount of layers down would technically be closer the the setting description, it would not produce reasonable results. ) + if (! min_xy_dist) { + LineInformations overhang_lines; + { + //Vojtech: Generate support heads at support_tree_branch_distance spacing by producing a zig-zag infill at support_tree_branch_distance spacing, + // which is then resmapled + // support_line_width to form a line here as otherwise most will be unsupported. Technically this violates branch distance, + // mbut not only is this the only reasonable choice, but it ensures consistent behavior as some infill patterns generate + // each line segment as its own polyline part causing a similar line forming behavior. Also it is assumed that + // the area that is valid a layer below is to small for support roof. + Polylines polylines = ensure_maximum_distance_polyline( + generate_support_infill_lines(remaining_overhang, support_params, false, layer_idx, mesh_group_settings.support_tree_branch_distance), + config.min_radius, 1); + if (polylines.size() <= 3) + // add the outer wall to ensure it is correct supported instead + polylines = ensure_maximum_distance_polyline(to_polylines(remaining_overhang), connect_length, 3); + for (const auto &line : polylines) { + LineInformation res_line; + for (Point p : line) + res_line.emplace_back(p, LineStatus::INVALID); + overhang_lines.emplace_back(res_line); + } + validate_range(overhang_lines); + } + for (size_t lag_ctr = 1; lag_ctr <= max_overhang_insert_lag && !overhang_lines.empty() && layer_idx - coord_t(lag_ctr) >= 1; lag_ctr++) { + // get least restricted avoidance for layer_idx-lag_ctr + const Polygons &relevant_forbidden_below = config.support_rests_on_model ? + volumes.getCollision(config.getRadius(0), layer_idx - lag_ctr, min_xy_dist) : + volumes.getAvoidance(config.getRadius(0), layer_idx - lag_ctr, AvoidanceType::Fast, false, min_xy_dist); + // it is not required to offset the forbidden area here as the points wont change: If points here are not inside the forbidden area neither will they be later when placing these points, as these are the same points. + auto evaluatePoint = [&](std::pair p) { return contains(relevant_forbidden_below, p.first); }; + + std::pair split = split_lines(overhang_lines, evaluatePoint); // keep all lines that are invalid + overhang_lines = split.first; + // Set all now valid lines to their correct LineStatus. Easiest way is to just discard Avoidance information for each point and evaluate them again. + LineInformations fresh_valid_points = convert_lines_to_internal(volumes, config, convert_internal_to_lines(split.second), layer_idx - lag_ctr); + validate_range(fresh_valid_points); + + interface_placer.add_points_along_lines(fresh_valid_points, (force_tip_to_roof && lag_ctr <= num_support_roof_layers) ? num_support_roof_layers : 0, layer_idx - lag_ctr, false, roof_enabled ? num_support_roof_layers : 0); + } + } +#endif + } + + throw_on_cancel(); + + if (roof_enabled) { + // Try to support the overhangs by dense interfaces for num_support_roof_layers, cover the bottom most interface with tree tips. + static constexpr const coord_t support_roof_offset = 0; + Polygons overhang_roofs = safe_offset_inc(overhang_raw, support_roof_offset, relevant_forbidden, config.min_radius * 2 + config.xy_min_distance, 0, 1); + if (mesh_group_settings.minimum_support_area > 0) + remove_small(overhang_roofs, mesh_group_settings.minimum_roof_area); + overhang_regular = diff(overhang_regular, overhang_roofs, ApplySafetyOffset::Yes); + //check_self_intersections(overhang_regular, "overhang_regular3"); + for (ExPolygon &roof_part : union_ex(overhang_roofs)) { + sample_overhang_area(to_polygons(std::move(roof_part)), true, layer_idx, num_support_roof_layers, connect_length, + mesh_group_settings, support_params, interface_placer); + throw_on_cancel(); + } + } + // Either the roof is not enabled, then these are all the overhangs to be supported, + // or roof is enabled and these are the thin overhangs at object slopes (not horizontal overhangs). + if (mesh_group_settings.minimum_support_area > 0) + remove_small(overhang_regular, mesh_group_settings.minimum_support_area); + for (ExPolygon &support_part : union_ex(overhang_regular)) { + sample_overhang_area(to_polygons(std::move(support_part)), + // Don't + false, layer_idx, num_support_roof_layers, connect_length, + mesh_group_settings, support_params, interface_placer); + throw_on_cancel(); + } + } + }); + + finalize_raft_contact(print_object, raft_contact_layer_idx, top_contacts, move_bounds); +} + +static unsigned int move_inside(const Polygons &polygons, Point &from, int distance = 0, int64_t maxDist2 = std::numeric_limits::max()) +{ + Point ret = from; + double bestDist2 = std::numeric_limits::max(); + auto bestPoly = static_cast(-1); + bool is_already_on_correct_side_of_boundary = false; // whether [from] is already on the right side of the boundary + for (unsigned int poly_idx = 0; poly_idx < polygons.size(); ++ poly_idx) { + const Polygon &poly = polygons[poly_idx]; + if (poly.size() < 2) + continue; + Point p0 = poly[poly.size() - 2]; + Point p1 = poly.back(); + // because we compare with vSize2 here (no division by zero), we also need to compare by vSize2 inside the loop + // to avoid integer rounding edge cases + bool projected_p_beyond_prev_segment = (p1 - p0).cast().dot((from - p0).cast()) >= (p1 - p0).cast().squaredNorm(); + for (const Point& p2 : poly) { + // X = A + Normal(B-A) * (((B-A) dot (P-A)) / VSize(B-A)); + // = A + (B-A) * ((B-A) dot (P-A)) / VSize2(B-A); + // X = P projected on AB + const Point& a = p1; + const Point& b = p2; + const Point& p = from; + auto ab = (b - a).cast(); + auto ap = (p - a).cast(); + int64_t ab_length2 = ab.squaredNorm(); + if (ab_length2 <= 0) { //A = B, i.e. the input polygon had two adjacent points on top of each other. + p1 = p2; //Skip only one of the points. + continue; + } + int64_t dot_prod = ab.dot(ap); + if (dot_prod <= 0) { // x is projected to before ab + if (projected_p_beyond_prev_segment) { + // case which looks like: > . + projected_p_beyond_prev_segment = false; + Point& x = p1; + + auto dist2 = (x - p).cast().squaredNorm(); + if (dist2 < bestDist2) { + bestDist2 = dist2; + bestPoly = poly_idx; + if (distance == 0) + ret = x; + else { + Vec2d abd = ab.cast(); + Vec2d p1p2 = (p1 - p0).cast(); + double lab = abd.norm(); + double lp1p2 = p1p2.norm(); + // inward direction irrespective of sign of [distance] + auto inward_dir = perp(abd * (scaled(10.0) / lab) + p1p2 * (scaled(10.0) / lp1p2)); + // MM2INT(10.0) to retain precision for the eventual normalization + ret = x + (inward_dir * (distance / inward_dir.norm())).cast(); + is_already_on_correct_side_of_boundary = inward_dir.dot((p - x).cast()) * distance >= 0; + } + } + } else { + projected_p_beyond_prev_segment = false; + p0 = p1; + p1 = p2; + continue; + } + } else if (dot_prod >= ab_length2) { + // x is projected to beyond ab + projected_p_beyond_prev_segment = true; + p0 = p1; + p1 = p2; + continue; + } else { + // x is projected to a point properly on the line segment (not onto a vertex). The case which looks like | . + projected_p_beyond_prev_segment = false; + Point x = a + (ab.cast() * (double(dot_prod) / double(ab_length2))).cast(); + auto dist2 = (p - x).cast().squaredNorm(); + if (dist2 < bestDist2) { + bestDist2 = dist2; + bestPoly = poly_idx; + if (distance == 0) + ret = x; + else { + Vec2d abd = ab.cast(); + Vec2d inward_dir = perp(abd * (distance / abd.norm())); // inward or outward depending on the sign of [distance] + ret = x + inward_dir.cast(); + is_already_on_correct_side_of_boundary = inward_dir.dot((p - x).cast()) >= 0; + } + } + } + p0 = p1; + p1 = p2; + } + } + // when the best point is already inside and we're moving inside, or when the best point is already outside and we're moving outside + if (is_already_on_correct_side_of_boundary) { + if (bestDist2 < distance * distance) + from = ret; + else { + // from = from; // original point stays unaltered. It is already inside by enough distance + } + return bestPoly; + } else if (bestDist2 < maxDist2) { + from = ret; + return bestPoly; + } + return -1; +} + +static Point move_inside_if_outside(const Polygons &polygons, Point from, int distance = 0, int64_t maxDist2 = std::numeric_limits::max()) +{ + if (! contains(polygons, from)) + move_inside(polygons, from); + return from; +} + +/*! + * \brief Checks if an influence area contains a valid subsection and returns the corresponding metadata and the new Influence area. + * + * Calculates an influence areas of the layer below, based on the influence area of one element on the current layer. + * Increases every influence area by maximum_move_distance_slow. If this is not enough, as in we would change our gracious or to_buildplate status the influence areas are instead increased by maximum_move_distance_slow. + * Also ensures that increasing the radius of a branch, does not cause it to change its status (like to_buildplate ). If this were the case, the radius is not increased instead. + * + * Warning: The used format inside this is different as the SupportElement does not have a valid area member. Instead this area is saved as value of the dictionary. This was done to avoid not needed heap allocations. + * + * \param settings[in] Which settings have to be used to check validity. + * \param layer_idx[in] Number of the current layer. + * \param parent[in] The metadata of the parents influence area. + * \param relevant_offset[in] The maximal possible influence area. No guarantee regarding validity with current layer collision required, as it is ensured in-function! + * \param to_bp_data[out] The part of the Influence area that can reach the buildplate. + * \param to_model_data[out] The part of the Influence area that do not have to reach the buildplate. This has overlap with new_layer_data. + * \param increased[out] Area than can reach all further up support points. No assurance is made that the buildplate or the model can be reached in accordance to the user-supplied settings. + * \param overspeed[in] How much should the already offset area be offset again. Usually this is 0. + * \param mergelayer[in] Will the merge method be called on this layer. This information is required as some calculation can be avoided if they are not required for merging. + * \return A valid support element for the next layer regarding the calculated influence areas. Empty if no influence are can be created using the supplied influence area and settings. + */ +[[nodiscard]] static std::optional increase_single_area( + const TreeModelVolumes &volumes, + const TreeSupportSettings &config, + const AreaIncreaseSettings &settings, + const LayerIndex layer_idx, + const SupportElement &parent, + const Polygons &relevant_offset, + Polygons &to_bp_data, + Polygons &to_model_data, + Polygons &increased, + const coord_t overspeed, + const bool mergelayer) +{ + SupportElementState current_elem{ SupportElementState::propagate_down(parent.state) }; + Polygons check_layer_data; + if (settings.increase_radius) + current_elem.effective_radius_height += 1; + coord_t radius = config.getCollisionRadius(current_elem); + + if (settings.move) { + increased = relevant_offset; + if (overspeed > 0) { + const coord_t safe_movement_distance = + (current_elem.use_min_xy_dist ? config.xy_min_distance : config.xy_distance) + + (std::min(config.z_distance_top_layers, config.z_distance_bottom_layers) > 0 ? config.min_feature_size : 0); + // The difference to ensure that the result not only conforms to wall_restriction, but collision/avoidance is done later. + // The higher last_safe_step_movement_distance comes exactly from the fact that the collision will be subtracted later. + increased = safe_offset_inc(increased, overspeed, volumes.getWallRestriction(config.getCollisionRadius(parent.state), layer_idx, parent.state.use_min_xy_dist), + safe_movement_distance, safe_movement_distance + radius, 1); + } + if (settings.no_error && settings.move) + // as ClipperLib::jtRound has to be used for offsets this simplify is VERY important for performance. + polygons_simplify(increased, scaled(0.025)); + } else + // if no movement is done the areas keep parent area as no move == offset(0) + increased = parent.influence_area; + + if (mergelayer || current_elem.to_buildplate) { + to_bp_data = safe_union(diff_clipped(increased, volumes.getAvoidance(radius, layer_idx - 1, settings.type, false, settings.use_min_distance))); + if (! current_elem.to_buildplate && area(to_bp_data) > tiny_area_threshold) { + // mostly happening in the tip, but with merges one should check every time, just to be sure. + current_elem.to_buildplate = true; // sometimes nodes that can reach the buildplate are marked as cant reach, tainting subtrees. This corrects it. + BOOST_LOG_TRIVIAL(debug) << "Corrected taint leading to a wrong to model value on layer " << layer_idx - 1 << " targeting " << + current_elem.target_height << " with radius " << radius; + } + } + if (config.support_rests_on_model) { + if (mergelayer || current_elem.to_model_gracious) + to_model_data = safe_union(diff_clipped(increased, volumes.getAvoidance(radius, layer_idx - 1, settings.type, true, settings.use_min_distance))); + + if (!current_elem.to_model_gracious) { + if (mergelayer && area(to_model_data) >= tiny_area_threshold) { + current_elem.to_model_gracious = true; + BOOST_LOG_TRIVIAL(debug) << "Corrected taint leading to a wrong non gracious value on layer " << layer_idx - 1 << " targeting " << + current_elem.target_height << " with radius " << radius; + } else + to_model_data = safe_union(diff_clipped(increased, volumes.getCollision(radius, layer_idx - 1, settings.use_min_distance))); + } + } + + check_layer_data = current_elem.to_buildplate ? to_bp_data : to_model_data; + + if (settings.increase_radius && area(check_layer_data) > tiny_area_threshold) { + auto validWithRadius = [&](coord_t next_radius) { + if (volumes.ceilRadius(next_radius, settings.use_min_distance) <= volumes.ceilRadius(radius, settings.use_min_distance)) + return true; + + Polygons to_bp_data_2; + if (current_elem.to_buildplate) + // regular union as output will not be used later => this area should always be a subset of the safe_union one (i think) + to_bp_data_2 = diff_clipped(increased, volumes.getAvoidance(next_radius, layer_idx - 1, settings.type, false, settings.use_min_distance)); + Polygons to_model_data_2; + if (config.support_rests_on_model && !current_elem.to_buildplate) + to_model_data_2 = diff_clipped(increased, + current_elem.to_model_gracious ? + volumes.getAvoidance(next_radius, layer_idx - 1, settings.type, true, settings.use_min_distance) : + volumes.getCollision(next_radius, layer_idx - 1, settings.use_min_distance)); + Polygons check_layer_data_2 = current_elem.to_buildplate ? to_bp_data_2 : to_model_data_2; + return area(check_layer_data_2) > tiny_area_threshold; + }; + coord_t ceil_radius_before = volumes.ceilRadius(radius, settings.use_min_distance); + + if (config.getCollisionRadius(current_elem) < config.increase_radius_until_radius && config.getCollisionRadius(current_elem) < config.getRadius(current_elem)) { + coord_t target_radius = std::min(config.getRadius(current_elem), config.increase_radius_until_radius); + coord_t current_ceil_radius = volumes.getRadiusNextCeil(radius, settings.use_min_distance); + + while (current_ceil_radius < target_radius && validWithRadius(volumes.getRadiusNextCeil(current_ceil_radius + 1, settings.use_min_distance))) + current_ceil_radius = volumes.getRadiusNextCeil(current_ceil_radius + 1, settings.use_min_distance); + size_t resulting_eff_dtt = current_elem.effective_radius_height; + while (resulting_eff_dtt + 1 < current_elem.distance_to_top && + config.getRadius(resulting_eff_dtt + 1, current_elem.elephant_foot_increases) <= current_ceil_radius && + config.getRadius(resulting_eff_dtt + 1, current_elem.elephant_foot_increases) <= config.getRadius(current_elem)) + ++ resulting_eff_dtt; + current_elem.effective_radius_height = resulting_eff_dtt; + } + radius = config.getCollisionRadius(current_elem); + + const coord_t foot_radius_increase = config.branch_radius * (std::max(config.diameter_scale_bp_radius - config.diameter_angle_scale_factor, 0.0)); + // Is nearly all of the time 1, but sometimes an increase of 1 could cause the radius to become bigger than recommendedMinRadius, + // which could cause the radius to become bigger than precalculated. + double planned_foot_increase = std::min(1.0, double(config.recommendedMinRadius(layer_idx - 1) - config.getRadius(current_elem)) / foot_radius_increase); +//FIXME + bool increase_bp_foot = planned_foot_increase > 0 && current_elem.to_buildplate; +// bool increase_bp_foot = false; + + if (increase_bp_foot && config.getRadius(current_elem) >= config.branch_radius && config.getRadius(current_elem) >= config.increase_radius_until_radius) + if (validWithRadius(config.getRadius(current_elem.effective_radius_height, current_elem.elephant_foot_increases + planned_foot_increase))) { + current_elem.elephant_foot_increases += planned_foot_increase; + radius = config.getCollisionRadius(current_elem); + } + + if (ceil_radius_before != volumes.ceilRadius(radius, settings.use_min_distance)) { + if (current_elem.to_buildplate) + to_bp_data = safe_union(diff_clipped(increased, volumes.getAvoidance(radius, layer_idx - 1, settings.type, false, settings.use_min_distance))); + if (config.support_rests_on_model && (!current_elem.to_buildplate || mergelayer)) + to_model_data = safe_union(diff_clipped(increased, + current_elem.to_model_gracious ? + volumes.getAvoidance(radius, layer_idx - 1, settings.type, true, settings.use_min_distance) : + volumes.getCollision(radius, layer_idx - 1, settings.use_min_distance) + )); + check_layer_data = current_elem.to_buildplate ? to_bp_data : to_model_data; + if (area(check_layer_data) < tiny_area_threshold) { + BOOST_LOG_TRIVIAL(error) << "Lost area by doing catch up from " << ceil_radius_before << " to radius " << + volumes.ceilRadius(config.getCollisionRadius(current_elem), settings.use_min_distance); + tree_supports_show_error("Area lost catching up radius. May not cause visible malformation."sv, true); + } + } + } + + return area(check_layer_data) > tiny_area_threshold ? std::optional(current_elem) : std::optional(); +} + +struct SupportElementInfluenceAreas { + // All influence areas: both to build plate and model. + Polygons influence_areas; + // Influence areas just to build plate. + Polygons to_bp_areas; + // Influence areas just to model. + Polygons to_model_areas; + + void clear() { + this->influence_areas.clear(); + this->to_bp_areas.clear(); + this->to_model_areas.clear(); + } +}; + +struct SupportElementMerging { + SupportElementState state; + /*! + * \brief All elements in the layer above the current one that are supported by this element + */ + SupportElement::ParentIndices parents; + + SupportElementInfluenceAreas areas; + // Bounding box of all influence areas. + Eigen::AlignedBox bbox_data; + + const Eigen::AlignedBox& bbox() const { return bbox_data;} + const Point centroid() const { return (bbox_data.min() + bbox_data.max()) / 2; } + void set_bbox(const BoundingBox& abbox) + { Point eps { coord_t(SCALED_EPSILON), coord_t(SCALED_EPSILON) }; bbox_data = { abbox.min - eps, abbox.max + eps }; } + + // Called by the AABBTree builder to get an index into the vector of source elements. + // Not needed, thus zero is returned. + static size_t idx() { return 0; } +}; + +/*! + * \brief Increases influence areas as far as required. + * + * Calculates influence areas of the layer below, based on the influence areas of the current layer. + * Increases every influence area by maximum_move_distance_slow. If this is not enough, as in it would change the gracious or to_buildplate status, the influence areas are instead increased by maximum_move_distance. + * Also ensures that increasing the radius of a branch, does not cause it to change its status (like to_buildplate ). If this were the case, the radius is not increased instead. + * + * Warning: The used format inside this is different as the SupportElement does not have a valid area member. Instead this area is saved as value of the dictionary. This was done to avoid not needed heap allocations. + * + * \param to_bp_areas[out] Influence areas that can reach the buildplate + * \param to_model_areas[out] Influence areas that do not have to reach the buildplate. This has overlap with new_layer_data, as areas that can reach the buildplate are also considered valid areas to the model. + * This redundancy is required if a to_buildplate influence area is allowed to merge with a to model influence area. + * \param influence_areas[out] Area than can reach all further up support points. No assurance is made that the buildplate or the model can be reached in accordance to the user-supplied settings. + * \param bypass_merge_areas[out] Influence areas ready to be added to the layer below that do not need merging. + * \param last_layer[in] Influence areas of the current layer. + * \param layer_idx[in] Number of the current layer. + * \param mergelayer[in] Will the merge method be called on this layer. This information is required as some calculation can be avoided if they are not required for merging. + */ +static void increase_areas_one_layer( + const TreeModelVolumes &volumes, + const TreeSupportSettings &config, + // New areas at the layer below layer_idx + std::vector &merging_areas, + // Layer above merging_areas. + const LayerIndex layer_idx, + // Layer elements above merging_areas. + SupportElements &layer_elements, + // If false, the merging_areas will not be merged for performance reasons. + const bool mergelayer, + std::function throw_on_cancel) +{ + using AvoidanceType = TreeModelVolumes::AvoidanceType; + + tbb::parallel_for(tbb::blocked_range(0, merging_areas.size()), + [&](const tbb::blocked_range &range) { + for (size_t merging_area_idx = range.begin(); merging_area_idx < range.end(); ++ merging_area_idx) { + SupportElementMerging &merging_area = merging_areas[merging_area_idx]; + assert(merging_area.parents.size() == 1); + SupportElement &parent = layer_elements[merging_area.parents.front()]; + SupportElementState elem = SupportElementState::propagate_down(parent.state); + const Polygons &wall_restriction = + // Abstract representation of the model outline. If an influence area would move through it, it could teleport through a wall. + volumes.getWallRestriction(config.getCollisionRadius(parent.state), layer_idx, parent.state.use_min_xy_dist); + +#ifdef TREESUPPORT_DEBUG_SVG + SVG::export_expolygons(debug_out_path("treesupport-increase_areas_one_layer-%d-%ld.svg", layer_idx, int(merging_area_idx)), + { { { union_ex(wall_restriction) }, { "wall_restricrictions", "gray", 0.5f } }, + { { union_ex(parent.influence_area) }, { "parent", "red", "black", "", scaled(0.1f), 0.5f } } }); +#endif // TREESUPPORT_DEBUG_SVG + + Polygons to_bp_data, to_model_data; + coord_t radius = config.getCollisionRadius(elem); + + // When the radius increases, the outer "support wall" of the branch will have been moved farther away from the center (as this is the definition of radius). + // As it is not specified that the support_tree_angle has to be one of the center of the branch, it is here seen as the smaller angle of the outer wall of the branch, to the outer wall of the same branch one layer above. + // As the branch may have become larger the distance between these 2 walls is smaller than the distance of the center points. + // These extra distance is added to the movement distance possible for this layer. + + coord_t extra_speed = 5; // The extra speed is added to both movement distances. Also move 5 microns faster than allowed to avoid rounding errors, this may cause issues at VERY VERY small layer heights. + coord_t extra_slow_speed = 0; // Only added to the slow movement distance. + const coord_t ceiled_parent_radius = volumes.ceilRadius(config.getCollisionRadius(parent.state), parent.state.use_min_xy_dist); + coord_t projected_radius_increased = config.getRadius(parent.state.effective_radius_height + 1, parent.state.elephant_foot_increases); + coord_t projected_radius_delta = projected_radius_increased - config.getCollisionRadius(parent.state); + + // When z distance is more than one layer up and down the Collision used to calculate the wall restriction will always include the wall (and not just the xy_min_distance) of the layer above and below like this (d = blocked area because of z distance): + /* + * layer z+1:dddddiiiiiioooo + * layer z+0:xxxxxdddddddddd + * layer z-1:dddddxxxxxxxxxx + * For more detailed visualisation see calculateWallRestrictions + */ + const coord_t safe_movement_distance = + (elem.use_min_xy_dist ? config.xy_min_distance : config.xy_distance) + + (std::min(config.z_distance_top_layers, config.z_distance_bottom_layers) > 0 ? config.min_feature_size : 0); + if (ceiled_parent_radius == volumes.ceilRadius(projected_radius_increased, parent.state.use_min_xy_dist) || + projected_radius_increased < config.increase_radius_until_radius) + // If it is guaranteed possible to increase the radius, the maximum movement speed can be increased, as it is assumed that the maximum movement speed is the one of the slower moving wall + extra_speed += projected_radius_delta; + else + // if a guaranteed radius increase is not possible, only increase the slow speed + // Ensure that the slow movement distance can not become larger than the fast one. + extra_slow_speed += std::min(projected_radius_delta, (config.maximum_move_distance + extra_speed) - (config.maximum_move_distance_slow + extra_slow_speed)); + + if (config.layer_start_bp_radius > layer_idx && + config.recommendedMinRadius(layer_idx - 1) < config.getRadius(elem.effective_radius_height + 1, elem.elephant_foot_increases)) { + // can guarantee elephant foot radius increase + if (ceiled_parent_radius == volumes.ceilRadius(config.getRadius(parent.state.effective_radius_height + 1, parent.state.elephant_foot_increases + 1), parent.state.use_min_xy_dist)) + extra_speed += config.branch_radius * config.diameter_scale_bp_radius; + else + extra_slow_speed += std::min(coord_t(config.branch_radius * config.diameter_scale_bp_radius), + config.maximum_move_distance - (config.maximum_move_distance_slow + extra_slow_speed)); + } + + const coord_t fast_speed = config.maximum_move_distance + extra_speed; + const coord_t slow_speed = config.maximum_move_distance_slow + extra_speed + extra_slow_speed; + + Polygons offset_slow, offset_fast; + + bool add = false; + bool bypass_merge = false; + constexpr bool increase_radius = true, no_error = true, use_min_radius = true, move = true; // aliases for better readability + + // Determine in which order configurations are checked if they result in a valid influence area. Check will stop if a valid area is found + std::vector order; + auto insertSetting = [&](AreaIncreaseSettings settings, bool back) { + if (std::find(order.begin(), order.end(), settings) == order.end()) { + if (back) + order.emplace_back(settings); + else + order.insert(order.begin(), settings); + } + }; + + const bool parent_moved_slow = elem.last_area_increase.increase_speed < config.maximum_move_distance; + const bool avoidance_speed_mismatch = parent_moved_slow && elem.last_area_increase.type != AvoidanceType::Slow; + if (elem.last_area_increase.move && elem.last_area_increase.no_error && elem.can_use_safe_radius && !mergelayer && + !avoidance_speed_mismatch && (elem.distance_to_top >= config.tip_layers || parent_moved_slow)) { + // assume that the avoidance type that was best for the parent is best for me. Makes this function about 7% faster. + insertSetting({ elem.last_area_increase.type, elem.last_area_increase.increase_speed < config.maximum_move_distance ? slow_speed : fast_speed, + increase_radius, elem.last_area_increase.no_error, !use_min_radius, elem.last_area_increase.move }, true); + insertSetting({ elem.last_area_increase.type, elem.last_area_increase.increase_speed < config.maximum_move_distance ? slow_speed : fast_speed, + !increase_radius, elem.last_area_increase.no_error, !use_min_radius, elem.last_area_increase.move }, true); + } + // branch may still go though a hole, so a check has to be done whether the hole was already passed, and the regular avoidance can be used. + if (!elem.can_use_safe_radius) { + // if the radius until which it is always increased can not be guaranteed, move fast. This is to avoid holes smaller than the real branch radius. + // This does not guarantee the avoidance of such holes, but ensures they are avoided if possible. + // order.emplace_back(AvoidanceType::Slow,!increase_radius,no_error,!use_min_radius,move); + insertSetting({ AvoidanceType::Slow, slow_speed, increase_radius, no_error, !use_min_radius, !move }, true); // did we go through the hole + // in many cases the definition of hole is overly restrictive, so to avoid unnecessary fast movement in the tip, it is ignored there for a bit. + // This CAN cause a branch to go though a hole it otherwise may have avoided. + if (elem.distance_to_top < round_up_divide(config.tip_layers, size_t(2))) + insertSetting({ AvoidanceType::Fast, slow_speed, increase_radius, no_error, !use_min_radius, !move }, true); + insertSetting({ AvoidanceType::FastSafe, fast_speed, increase_radius, no_error, !use_min_radius, !move }, true); // did we manage to avoid the hole + insertSetting({ AvoidanceType::FastSafe, fast_speed, !increase_radius, no_error, !use_min_radius, move }, true); + insertSetting({ AvoidanceType::Fast, fast_speed, !increase_radius, no_error, !use_min_radius, move }, true); + } else { + insertSetting({ AvoidanceType::Slow, slow_speed, increase_radius, no_error, !use_min_radius, move }, true); + // while moving fast to be able to increase the radius (b) may seems preferable (over a) this can cause the a sudden skip in movement, + // which looks similar to a layer shift and can reduce stability. + // as such idx have chosen to only use the user setting for radius increases as a friendly recommendation. + insertSetting({ AvoidanceType::Slow, slow_speed, !increase_radius, no_error, !use_min_radius, move }, true); // a + if (elem.distance_to_top < config.tip_layers) + insertSetting({ AvoidanceType::FastSafe, slow_speed, increase_radius, no_error, !use_min_radius, move }, true); + insertSetting({ AvoidanceType::FastSafe, fast_speed, increase_radius, no_error, !use_min_radius, move }, true); // b + insertSetting({ AvoidanceType::FastSafe, fast_speed, !increase_radius, no_error, !use_min_radius, move }, true); + } + + if (elem.use_min_xy_dist) { + std::vector new_order; + // if the branch currently has to use min_xy_dist check if the configuration would also be valid + // with the regular xy_distance before checking with use_min_radius (Only happens when Support Distance priority is z overrides xy ) + for (AreaIncreaseSettings settings : order) { + new_order.emplace_back(settings); + new_order.push_back({ settings.type, settings.increase_speed, settings.increase_radius, settings.no_error, use_min_radius, settings.move }); + } + order = new_order; + } + if (elem.to_buildplate || (elem.to_model_gracious && intersection(parent.influence_area, volumes.getPlaceableAreas(radius, layer_idx, throw_on_cancel)).empty())) { + // error case + // it is normal that we wont be able to find a new area at some point in time if we wont be able to reach layer 0 aka have to connect with the model + insertSetting({ AvoidanceType::Fast, fast_speed, !increase_radius, !no_error, elem.use_min_xy_dist, move }, true); + } + if (elem.distance_to_top < elem.dont_move_until && elem.can_use_safe_radius) // only do not move when holes would be avoided in every case. + // Only do not move when already in a no hole avoidance with the regular xy distance. + insertSetting({ AvoidanceType::Slow, 0, increase_radius, no_error, !use_min_radius, !move }, false); + + Polygons inc_wo_collision; + // Check whether it is faster to calculate the area increased with the fast speed independently from the slow area, or time could be saved by reusing the slow area to calculate the fast one. + // Calculated by comparing the steps saved when calcualting idependently with the saved steps when not. + bool offset_independant_faster = radius / safe_movement_distance - int(config.maximum_move_distance + extra_speed < radius + safe_movement_distance) > + round_up_divide((extra_speed + extra_slow_speed + config.maximum_move_distance_slow), safe_movement_distance); + for (const AreaIncreaseSettings &settings : order) { + if (settings.move) { + if (offset_slow.empty() && (settings.increase_speed == slow_speed || ! offset_independant_faster)) { + // offsetting in 2 steps makes our offsetted area rounder preventing (rounding) errors created by to pointy areas. At this point one can see that the Polygons class + // was never made for precision in the single digit micron range. + offset_slow = safe_offset_inc(parent.influence_area, extra_speed + extra_slow_speed + config.maximum_move_distance_slow, + wall_restriction, safe_movement_distance, offset_independant_faster ? safe_movement_distance + radius : 0, 2); +#ifdef TREESUPPORT_DEBUG_SVG + SVG::export_expolygons(debug_out_path("treesupport-increase_areas_one_layer-slow-%d-%ld.svg", layer_idx, int(merging_area_idx)), + { { { union_ex(wall_restriction) }, { "wall_restricrictions", "gray", 0.5f } }, + { { union_ex(offset_slow) }, { "offset_slow", "red", "black", "", scaled(0.1f), 0.5f } } }); +#endif // TREESUPPORT_DEBUG_SVG + } + if (offset_fast.empty() && settings.increase_speed != slow_speed) { + if (offset_independant_faster) + offset_fast = safe_offset_inc(parent.influence_area, extra_speed + config.maximum_move_distance, + wall_restriction, safe_movement_distance, offset_independant_faster ? safe_movement_distance + radius : 0, 1); + else { + const coord_t delta_slow_fast = config.maximum_move_distance - (config.maximum_move_distance_slow + extra_slow_speed); + offset_fast = safe_offset_inc(offset_slow, delta_slow_fast, wall_restriction, safe_movement_distance, safe_movement_distance + radius, offset_independant_faster ? 2 : 1); + } +#ifdef TREESUPPORT_DEBUG_SVG + SVG::export_expolygons(debug_out_path("treesupport-increase_areas_one_layer-fast-%d-%ld.svg", layer_idx, int(merging_area_idx)), + { { { union_ex(wall_restriction) }, { "wall_restricrictions", "gray", 0.5f } }, + { { union_ex(offset_fast) }, { "offset_fast", "red", "black", "", scaled(0.1f), 0.5f } } }); +#endif // TREESUPPORT_DEBUG_SVG + } + } + std::optional result; + inc_wo_collision.clear(); + if (!settings.no_error) { + // ERROR CASE + // if the area becomes for whatever reason something that clipper sees as a line, offset would stop working, so ensure that even if if wrongly would be a line, it still actually has an area that can be increased + Polygons lines_offset = offset(to_polylines(parent.influence_area), scaled(0.005), jtMiter, 1.2); + Polygons base_error_area = union_(parent.influence_area, lines_offset); + result = increase_single_area(volumes, config, settings, layer_idx, parent, + base_error_area, to_bp_data, to_model_data, inc_wo_collision, (config.maximum_move_distance + extra_speed) * 1.5, mergelayer); +#ifdef TREE_SUPPORT_SHOW_ERRORS + BOOST_LOG_TRIVIAL(error) +#else // TREE_SUPPORT_SHOW_ERRORS + BOOST_LOG_TRIVIAL(warning) +#endif // TREE_SUPPORT_SHOW_ERRORS + << "Influence area could not be increased! Data about the Influence area: " + "Radius: " << radius << " at layer: " << layer_idx - 1 << " NextTarget: " << elem.layer_idx << " Distance to top: " << elem.distance_to_top << + " Elephant foot increases " << elem.elephant_foot_increases << " use_min_xy_dist " << elem.use_min_xy_dist << " to buildplate " << elem.to_buildplate << + " gracious " << elem.to_model_gracious << " safe " << elem.can_use_safe_radius << " until move " << elem.dont_move_until << " \n " + "Parent " << &parent << ": Radius: " << config.getCollisionRadius(parent.state) << " at layer: " << layer_idx << " NextTarget: " << parent.state.layer_idx << + " Distance to top: " << parent.state.distance_to_top << " Elephant foot increases " << parent.state.elephant_foot_increases << " use_min_xy_dist " << parent.state.use_min_xy_dist << + " to buildplate " << parent.state.to_buildplate << " gracious " << parent.state.to_model_gracious << " safe " << parent.state.can_use_safe_radius << " until move " << parent.state.dont_move_until; + tree_supports_show_error("Potentially lost branch!"sv, true); + } else + result = increase_single_area(volumes, config, settings, layer_idx, parent, + settings.increase_speed == slow_speed ? offset_slow : offset_fast, to_bp_data, to_model_data, inc_wo_collision, 0, mergelayer); + + if (result) { + elem = *result; + radius = config.getCollisionRadius(elem); + elem.last_area_increase = settings; + add = true; + // do not merge if the branch should not move or the priority has to be to get farther away from the model. + bypass_merge = !settings.move || (settings.use_min_distance && elem.distance_to_top < config.tip_layers); + if (settings.move) + elem.dont_move_until = 0; + else + elem.result_on_layer = parent.state.result_on_layer; + + elem.can_use_safe_radius = settings.type != AvoidanceType::Fast; + + if (!settings.use_min_distance) + elem.use_min_xy_dist = false; + if (!settings.no_error) +#ifdef TREE_SUPPORT_SHOW_ERRORS + BOOST_LOG_TRIVIAL(error) +#else // TREE_SUPPORT_SHOW_ERRORS + BOOST_LOG_TRIVIAL(info) +#endif // TREE_SUPPORT_SHOW_ERRORS + << "Trying to keep area by moving faster than intended: Success"; + break; + } else if (!settings.no_error) + BOOST_LOG_TRIVIAL(error) << "Trying to keep area by moving faster than intended: FAILURE! WRONG BRANCHES LIKLY!"; + } + + if (add) { + // Union seems useless, but some rounding errors somewhere can cause to_bp_data to be slightly bigger than it should be. + assert(! inc_wo_collision.empty() || ! to_bp_data.empty() || ! to_model_data.empty()); + Polygons max_influence_area = safe_union( + diff_clipped(inc_wo_collision, volumes.getCollision(radius, layer_idx - 1, elem.use_min_xy_dist)), + safe_union(to_bp_data, to_model_data)); + merging_area.state = elem; + assert(!max_influence_area.empty()); + merging_area.set_bbox(get_extents(max_influence_area)); + merging_area.areas.influence_areas = std::move(max_influence_area); + if (! bypass_merge) { + if (elem.to_buildplate) + merging_area.areas.to_bp_areas = std::move(to_bp_data); + if (config.support_rests_on_model) + merging_area.areas.to_model_areas = std::move(to_model_data); + } + } else { + // If the bottom most point of a branch is set, later functions will assume that the position is valid, and ignore it. + // But as branches connecting with the model that are to small have to be culled, the bottom most point has to be not set. + // A point can be set on the top most tip layer (maybe more if it should not move for a few layers). + parent.state.result_on_layer_reset(); + } + throw_on_cancel(); + } + }); +} + +[[nodiscard]] static SupportElementState merge_support_element_states( + const SupportElementState &first, const SupportElementState &second, const Point &next_position, const coord_t layer_idx, + const TreeSupportSettings &config) +{ + SupportElementState out; + out.next_position = next_position; + out.layer_idx = layer_idx; + out.use_min_xy_dist = first.use_min_xy_dist || second.use_min_xy_dist; + out.supports_roof = first.supports_roof || second.supports_roof; + out.dont_move_until = std::max(first.dont_move_until, second.dont_move_until); + out.can_use_safe_radius = first.can_use_safe_radius || second.can_use_safe_radius; + out.missing_roof_layers = std::min(first.missing_roof_layers, second.missing_roof_layers); + out.skip_ovalisation = false; + if (first.target_height > second.target_height) { + out.target_height = first.target_height; + out.target_position = first.target_position; + } else { + out.target_height = second.target_height; + out.target_position = second.target_position; + } + out.effective_radius_height = std::max(first.effective_radius_height, second.effective_radius_height); + out.distance_to_top = std::max(first.distance_to_top, second.distance_to_top); + + out.to_buildplate = first.to_buildplate && second.to_buildplate; + out.to_model_gracious = first.to_model_gracious && second.to_model_gracious; // valid as we do not merge non-gracious with gracious + + out.elephant_foot_increases = 0; + if (config.diameter_scale_bp_radius > 0) { + coord_t foot_increase_radius = std::abs(std::max(config.getCollisionRadius(second), config.getCollisionRadius(first)) - config.getCollisionRadius(out)); + // elephant_foot_increases has to be recalculated, as when a smaller tree with a larger elephant_foot_increases merge with a larger branch + // the elephant_foot_increases may have to be lower as otherwise the radius suddenly increases. This results often in a non integer value. + out.elephant_foot_increases = foot_increase_radius / (config.branch_radius * (config.diameter_scale_bp_radius - config.diameter_angle_scale_factor)); + } + + // set last settings to the best out of both parents. If this is wrong, it will only cause a small performance penalty instead of weird behavior. + out.last_area_increase = { + std::min(first.last_area_increase.type, second.last_area_increase.type), + std::min(first.last_area_increase.increase_speed, second.last_area_increase.increase_speed), + first.last_area_increase.increase_radius || second.last_area_increase.increase_radius, + first.last_area_increase.no_error || second.last_area_increase.no_error, + first.last_area_increase.use_min_distance && second.last_area_increase.use_min_distance, + first.last_area_increase.move || second.last_area_increase.move }; + + return out; +} + +static bool merge_influence_areas_two_elements( + const TreeModelVolumes &volumes, const TreeSupportSettings &config, const LayerIndex layer_idx, + SupportElementMerging &dst, SupportElementMerging &src) +{ + // Don't merge gracious with a non gracious area as bad placement could negatively impact reliability of the whole subtree. + const bool merging_gracious_and_non_gracious = dst.state.to_model_gracious != src.state.to_model_gracious; + // Could cause some issues with the increase of one area, as it is assumed that if the smaller is increased + // by the delta to the larger it is engulfed by it already. But because a different collision + // may be removed from the in draw_area() generated circles, this assumption could be wrong. + const bool merging_min_and_regular_xy = dst.state.use_min_xy_dist != src.state.use_min_xy_dist; + + if (merging_gracious_and_non_gracious || merging_min_and_regular_xy) + return false; + + const bool dst_radius_bigger = config.getCollisionRadius(dst.state) > config.getCollisionRadius(src.state); + const SupportElementMerging &smaller_rad = dst_radius_bigger ? src : dst; + const SupportElementMerging &bigger_rad = dst_radius_bigger ? dst : src; + const coord_t real_radius_delta = std::abs(config.getRadius(bigger_rad.state) - config.getRadius(smaller_rad.state)); + { + // Testing intersection of bounding boxes. + // Expand the smaller radius branch bounding box to match the lambda intersect_small_with_bigger() below. + // Because the lambda intersect_small_with_bigger() applies a rounded offset, a snug offset of the bounding box + // is sufficient. On the other side, if a mitered offset was used by the lambda, + // the bounding box expansion would have to account for the mitered extension of the sharp corners. + Eigen::AlignedBox smaller_bbox = smaller_rad.bbox(); + smaller_bbox.min() -= Point{ real_radius_delta, real_radius_delta }; + smaller_bbox.max() += Point{ real_radius_delta, real_radius_delta }; + if (! smaller_bbox.intersects(bigger_rad.bbox())) + return false; + } + + // Accumulator of a radius increase of a "to model" branch by merging in a "to build plate" branch. + coord_t increased_to_model_radius = 0; + const bool merging_to_bp = dst.state.to_buildplate && src.state.to_buildplate; + if (! merging_to_bp) { + // Get the real radius increase as the user does not care for the collision model. + if (dst.state.to_buildplate != src.state.to_buildplate) { + // Merging a "to build plate" branch with a "to model" branch. + // Don't allow merging a thick "to build plate" branch into a thinner "to model" branch. + const coord_t rdst = config.getRadius(dst.state); + const coord_t rsrc = config.getRadius(src.state); + if (dst.state.to_buildplate) { + if (rsrc < rdst) + increased_to_model_radius = src.state.increased_to_model_radius + rdst - rsrc; + } else { + if (rsrc > rdst) + increased_to_model_radius = dst.state.increased_to_model_radius + rsrc - rdst; + } + if (increased_to_model_radius > config.max_to_model_radius_increase) + return false; + } + // if a merge could place a stable branch on unstable ground, would be increasing the radius further + // than allowed to when merging to model and to_bp trees or would merge to model before it is known + // they will even been drawn the merge is skipped + if (! dst.state.supports_roof && ! src.state.supports_roof && + std::max(src.state.distance_to_top, dst.state.distance_to_top) < config.min_dtt_to_model) + return false; + } + + // Area of the bigger radius is used to ensure correct placement regarding the relevant avoidance, + // so if that would change an invalid area may be created. + if (! bigger_rad.state.can_use_safe_radius && smaller_rad.state.can_use_safe_radius) + return false; + + // the bigger radius is used to verify that the area is still valid after the increase with the delta. + // If there were a point where the big influence area could be valid with can_use_safe_radius + // the element would already be can_use_safe_radius. + // the smaller radius, which gets increased by delta may reach into the area where use_min_xy_dist is no longer required. + const bool use_min_radius = bigger_rad.state.use_min_xy_dist && smaller_rad.state.use_min_xy_dist; + + // The idea is that the influence area with the smaller collision radius is increased by the radius difference. + // If this area has any intersections with the influence area of the larger collision radius, a branch (of the larger collision radius) placed in this intersection, has already engulfed the branch of the smaller collision radius. + // Because of this a merge may happen even if the influence areas (that represent possible center points of branches) do not intersect yet. + // Remember that collision radius <= real radius as otherwise this assumption would be false. + const coord_t smaller_collision_radius = config.getCollisionRadius(smaller_rad.state); + const Polygons &collision = volumes.getCollision(smaller_collision_radius, layer_idx - 1, use_min_radius); + auto intersect_small_with_bigger = [real_radius_delta, smaller_collision_radius, &collision, &config](const Polygons &small, const Polygons &bigger) { + return intersection( + safe_offset_inc( + small, real_radius_delta, collision, + // -3 avoids possible rounding errors + 2 * (config.xy_distance + smaller_collision_radius - 3), 0, 0), + bigger); + }; + Polygons intersect = intersect_small_with_bigger( + merging_to_bp ? smaller_rad.areas.to_bp_areas : smaller_rad.areas.to_model_areas, + merging_to_bp ? bigger_rad.areas.to_bp_areas : bigger_rad.areas.to_model_areas); + + // dont use empty as a line is not empty, but for this use-case it very well may be (and would be one layer down as union does not keep lines) + // check if the overlap is large enough (Small ares tend to attract rounding errors in clipper). + if (area(intersect) <= tiny_area_threshold) + return false; + + // While 0.025 was guessed as enough, i did not have reason to change it. + if (area(offset(intersect, scaled(-0.025), jtMiter, 1.2)) <= tiny_area_threshold) + return false; + + // Do the actual merge now that the branches are confirmed to be able to intersect. + // calculate which point is closest to the point of the last merge (or tip center if no merge above it has happened) + // used at the end to estimate where to best place the branch on the bottom most layer + // could be replaced with a random point inside the new area + Point new_pos = move_inside_if_outside(intersect, dst.state.next_position); + + SupportElementState new_state = merge_support_element_states(dst.state, src.state, new_pos, layer_idx - 1, config); + new_state.increased_to_model_radius = increased_to_model_radius == 0 ? + // increased_to_model_radius was not set yet. Propagate maximum. + std::max(dst.state.increased_to_model_radius, src.state.increased_to_model_radius) : + increased_to_model_radius; + + // Rather unioning with "intersect" due to some rounding errors. + Polygons influence_areas = safe_union( + intersect_small_with_bigger(smaller_rad.areas.influence_areas, bigger_rad.areas.influence_areas), + intersect); + + Polygons to_model_areas; + if (merging_to_bp && config.support_rests_on_model) + to_model_areas = new_state.to_model_gracious ? + // Rather unioning with "intersect" due to some rounding errors. + safe_union( + intersect_small_with_bigger(smaller_rad.areas.to_model_areas, bigger_rad.areas.to_model_areas), + intersect) : + influence_areas; + + dst.parents.insert(dst.parents.end(), src.parents.begin(), src.parents.end()); + dst.state = new_state; + dst.areas.influence_areas = std::move(influence_areas); + dst.areas.to_bp_areas.clear(); + dst.areas.to_model_areas.clear(); + if (merging_to_bp) { + dst.areas.to_bp_areas = std::move(intersect); + if (config.support_rests_on_model) + dst.areas.to_model_areas = std::move(to_model_areas); + } else + dst.areas.to_model_areas = std::move(intersect); + // Update the bounding box. + BoundingBox bbox(get_extents(dst.areas.influence_areas)); + bbox.merge(get_extents(dst.areas.to_bp_areas)); + bbox.merge(get_extents(dst.areas.to_model_areas)); + dst.set_bbox(bbox); + // Clear the source data. + src.areas.clear(); + src.parents.clear(); + return true; +} + +/*! + * \brief Merges Influence Areas if possible. + * + * Branches which do overlap have to be merged. This helper merges all elements in input with the elements into reduced_new_layer. + * Elements in input_aabb are merged together if possible, while elements reduced_new_layer_aabb are not checked against each other. + * + * \param reduced_aabb[in,out] The already processed elements. + * \param input_aabb[in] Not yet processed elements + * \param to_bp_areas[in] The Elements of the current Layer that will reach the buildplate. Value is the influence area where the center of a circle of support may be placed. + * \param to_model_areas[in] The Elements of the current Layer that do not have to reach the buildplate. Also contains main as every element that can reach the buildplate is not forced to. + * Value is the influence area where the center of a circle of support may be placed. + * \param influence_areas[in] The influence areas without avoidance removed. + * \param insert_bp_areas[out] Elements to be inserted into the main dictionary after the Helper terminates. + * \param insert_model_areas[out] Elements to be inserted into the secondary dictionary after the Helper terminates. + * \param insert_influence[out] Elements to be inserted into the dictionary containing the largest possibly valid influence area (ignoring if the area may not be there because of avoidance) + * \param erase[out] Elements that should be deleted from the above dictionaries. + * \param layer_idx[in] The Index of the current Layer. + */ + +static SupportElementMerging* merge_influence_areas_leaves( + const TreeModelVolumes &volumes, const TreeSupportSettings &config, const LayerIndex layer_idx, + SupportElementMerging * const dst_begin, SupportElementMerging *dst_end) +{ + // Merging at the lowest level of the AABB tree. Checking one against each other, O(n^2). + assert(dst_begin < dst_end); + for (SupportElementMerging *i = dst_begin; i + 1 < dst_end;) { + for (SupportElementMerging *j = i + 1; j != dst_end;) + if (merge_influence_areas_two_elements(volumes, config, layer_idx, *i, *j)) { + // i was merged with j, j is empty. + if (j != -- dst_end) + *j = std::move(*dst_end); + goto merged; + } else + ++ j; + // not merged + ++ i; + merged: + ; + } + return dst_end; +} + +static SupportElementMerging* merge_influence_areas_two_sets( + const TreeModelVolumes &volumes, const TreeSupportSettings &config, const LayerIndex layer_idx, + SupportElementMerging * const dst_begin, SupportElementMerging * dst_end, + SupportElementMerging * src_begin, SupportElementMerging * const src_end) +{ + // Merging src into dst. + // Areas of src should not overlap with areas of another elements of src. + // Areas of dst should not overlap with areas of another elements of dst. + // The memory from dst_begin to src_end is reserved for the merging operation, + // src follows dst. + assert(src_begin < src_end); + assert(dst_begin < dst_end); + assert(dst_end <= src_begin); + for (SupportElementMerging *src = src_begin; src != src_end; ++ src) { + SupportElementMerging *dst = dst_begin; + SupportElementMerging *merged = nullptr; + for (; dst != dst_end; ++ dst) + if (merge_influence_areas_two_elements(volumes, config, layer_idx, *dst, *src)) { + merged = dst ++; + if (src != src_begin) + // Compactify src. + *src = std::move(*src_begin); + ++ src_begin; + break; + } + for (; dst != dst_end;) + if (merge_influence_areas_two_elements(volumes, config, layer_idx, *merged, *dst)) { + // Compactify dst. + if (dst != -- dst_end) + *dst = std::move(*dst_end); + } else + ++ dst; + } + // Compactify src elements that were not merged with dst to the end of dst. + assert(dst_end <= src_begin); + if (dst_end == src_begin) + dst_end = src_end; + else + while (src_begin != src_end) + *dst_end ++ = std::move(*src_begin ++); + + return dst_end; +} + +/*! + * \brief Merges Influence Areas at one layer if possible. + * + * Branches which do overlap have to be merged. This manages the helper and uses a divide and conquer approach to parallelize this problem. This parallelization can at most accelerate the merging by a factor of 2. + * + * \param to_bp_areas[in] The Elements of the current Layer that will reach the buildplate. + * Value is the influence area where the center of a circle of support may be placed. + * \param to_model_areas[in] The Elements of the current Layer that do not have to reach the buildplate. Also contains main as every element that can reach the buildplate is not forced to. + * Value is the influence area where the center of a circle of support may be placed. + * \param influence_areas[in] The Elements of the current Layer without avoidances removed. This is the largest possible influence area for this layer. + * Value is the influence area where the center of a circle of support may be placed. + * \param layer_idx[in] The current layer. + */ +static void merge_influence_areas( + const TreeModelVolumes &volumes, + const TreeSupportSettings &config, + const LayerIndex layer_idx, + std::vector &influence_areas, + std::function throw_on_cancel) +{ + const size_t input_size = influence_areas.size(); + if (input_size == 0) + return; + + // Merging by divide & conquer. + // The majority of time is consumed by Clipper polygon operations, intersection is accelerated by bounding boxes. + // Sorting input into an AABB tree helps to perform most of the intersections at first iterations, + // thus reducing computation when merging larger subtrees. + // The actual merge logic is found in merge_influence_areas_two_sets. + + // Build an AABB tree over the influence areas. + //FIXME A full tree does not need to be built, the lowest level branches will be always bucketed. + // However the additional time consumed is negligible. + AABBTreeIndirect::Tree<2, coord_t> tree; + // Sort influence_areas in place. + tree.build_modify_input(influence_areas); + + throw_on_cancel(); + + // Prepare the initial buckets as ranges of influence areas. The initial buckets contain power of 2 influence areas to follow + // the branching of the AABB tree. + // Vectors of ranges of influence areas, following the branching of the AABB tree: + std::vector> buckets; + // Initial number of buckets for 1st round of merging. + size_t num_buckets_initial; + { + // How many buckets per first merge iteration? + const size_t num_threads = tbb::this_task_arena::max_concurrency(); + // 4 buckets per thread if possible, + const size_t num_buckets_min = (input_size + 2) / 4; + // 2 buckets per thread otherwise. + const size_t num_buckets_max = input_size / 2; + num_buckets_initial = num_buckets_min >= num_threads ? num_buckets_min : num_buckets_max; + const size_t bucket_size = num_buckets_min >= num_threads ? 4 : 2; + // Fill in the buckets. + SupportElementMerging *it = influence_areas.data(); + // Reserve one more bucket to keep a single influence area which will not be merged in the first iteration. + buckets.reserve(num_buckets_initial + 1); + for (size_t i = 0; i < num_buckets_initial; ++ i, it += bucket_size) + buckets.emplace_back(std::make_pair(it, it + bucket_size)); + SupportElementMerging *it_end = influence_areas.data() + influence_areas.size(); + if (buckets.back().second >= it_end) { + // Last bucket is less than size 4, but bigger than size 1. + buckets.back().second = std::min(buckets.back().second, it_end); + } else { + // Last bucket is size 1, it will not be merged in the first iteration. + assert(it + 1 == it_end); + buckets.emplace_back(std::make_pair(it, it_end)); + } + } + + // 1st merge iteration, merge one with each other. + tbb::parallel_for(tbb::blocked_range(0, num_buckets_initial), + [&](const tbb::blocked_range &range) { + for (size_t idx = range.begin(); idx < range.end(); ++ idx) { + // Merge bucket_count adjacent to each other, merging uneven bucket numbers into even buckets + buckets[idx].second = merge_influence_areas_leaves(volumes, config, layer_idx, buckets[idx].first, buckets[idx].second); + throw_on_cancel(); + } + }); + + // Further merge iterations, merging one AABB subtree with another one, hopefully minimizing intersections between the elements + // of each of the subtree. + while (buckets.size() > 1) { + tbb::parallel_for(tbb::blocked_range(0, buckets.size() / 2), + [&](const tbb::blocked_range &range) { + for (size_t idx = range.begin(); idx < range.end(); ++ idx) { + const size_t bucket_pair_idx = idx * 2; + // Merge bucket_count adjacent to each other, merging uneven bucket numbers into even buckets + buckets[bucket_pair_idx].second = merge_influence_areas_two_sets(volumes, config, layer_idx, + buckets[bucket_pair_idx].first, buckets[bucket_pair_idx].second, + buckets[bucket_pair_idx + 1].first, buckets[bucket_pair_idx + 1].second); + throw_on_cancel(); + } + }); + // Remove odd buckets, which were merged into even buckets. + size_t new_size = (buckets.size() + 1) / 2; + for (size_t i = 1; i < new_size; ++ i) + buckets[i] = std::move(buckets[i * 2]); + buckets.erase(buckets.begin() + new_size, buckets.end()); + } +} + +/*! + * \brief Propagates influence downwards, and merges overlapping ones. + * + * \param move_bounds[in,out] All currently existing influence areas + */ +static void create_layer_pathing(const TreeModelVolumes &volumes, const TreeSupportSettings &config, std::vector &move_bounds, std::function throw_on_cancel) +{ +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + const double data_size_inverse = 1 / double(move_bounds.size()); + double progress_total = TREE_PROGRESS_PRECALC_AVO + TREE_PROGRESS_PRECALC_COLL + TREE_PROGRESS_GENERATE_NODES; +#endif // SLIC3R_TREESUPPORTS_PROGRESS + + auto dur_inc = std::chrono::duration_values::zero(); + auto dur_total = std::chrono::duration_values::zero(); + + LayerIndex last_merge_layer_idx = move_bounds.size(); + bool new_element = false; + + // Ensures at least one merge operation per 3mm height, 50 layers, 1 mm movement of slow speed or 5mm movement of fast speed (whatever is lowest). Values were guessed. + size_t max_merge_every_x_layers = std::min(std::min(5000 / (std::max(config.maximum_move_distance, coord_t(100))), 1000 / std::max(config.maximum_move_distance_slow, coord_t(20))), 3000 / config.layer_height); + size_t merge_every_x_layers = 1; + // Calculate the influence areas for each layer below (Top down) + // This is done by first increasing the influence area by the allowed movement distance, and merging them with other influence areas if possible + for (int layer_idx = int(move_bounds.size()) - 1; layer_idx > 0; -- layer_idx) + if (SupportElements &prev_layer = move_bounds[layer_idx]; ! prev_layer.empty()) { + // merging is expensive and only parallelized to a max speedup of 2. As such it may be useful in some cases to only merge every few layers to improve performance. + bool had_new_element = new_element; + const bool merge_this_layer = had_new_element || size_t(last_merge_layer_idx - layer_idx) >= merge_every_x_layers; + if (had_new_element) + merge_every_x_layers = 1; + const auto ta = std::chrono::high_resolution_clock::now(); + + // ### Increase the influence areas by the allowed movement distance + std::vector influence_areas; + influence_areas.reserve(prev_layer.size()); + for (int32_t element_idx = 0; element_idx < int32_t(prev_layer.size()); ++ element_idx) { + SupportElement &el = prev_layer[element_idx]; + assert(!el.influence_area.empty()); + SupportElement::ParentIndices parents; + parents.emplace_back(element_idx); + influence_areas.push_back({ el.state, parents }); + } + increase_areas_one_layer(volumes, config, influence_areas, layer_idx, prev_layer, merge_this_layer, throw_on_cancel); + + // Place already fully constructed elements to the output, remove them from influence_areas. + SupportElements &this_layer = move_bounds[layer_idx - 1]; + influence_areas.erase(std::remove_if(influence_areas.begin(), influence_areas.end(), + [&this_layer, layer_idx](SupportElementMerging &elem) { + if (elem.areas.influence_areas.empty()) + // This area was removed completely due to collisions. + return true; + if (elem.areas.to_bp_areas.empty() && elem.areas.to_model_areas.empty()) { + if (area(elem.areas.influence_areas) < tiny_area_threshold) { + BOOST_LOG_TRIVIAL(error) << "Insert Error of Influence area bypass on layer " << layer_idx - 1; + tree_supports_show_error("Insert error of area after bypassing merge.\n"sv, true); + } + // Move the area to output. + this_layer.emplace_back(elem.state, std::move(elem.parents), std::move(elem.areas.influence_areas)); + return true; + } + // Keep the area. + return false; + }), + influence_areas.end()); + + dur_inc += std::chrono::high_resolution_clock::now() - ta; + new_element = ! move_bounds[layer_idx - 1].empty(); + if (merge_this_layer) { + bool reduced_by_merging = false; + if (size_t count_before_merge = influence_areas.size(); count_before_merge > 1) { + // ### Calculate which influence areas overlap, and merge them into a new influence area (simplified: an intersection of influence areas that have such an intersection) + merge_influence_areas(volumes, config, layer_idx, influence_areas, throw_on_cancel); + reduced_by_merging = count_before_merge > influence_areas.size(); + } + last_merge_layer_idx = layer_idx; + if (! reduced_by_merging && ! had_new_element) + merge_every_x_layers = std::min(max_merge_every_x_layers, merge_every_x_layers + 1); + } + + dur_total += std::chrono::high_resolution_clock::now() - ta; + + // Save calculated elements to output, and allocate Polygons on heap, as they will not be changed again. + for (SupportElementMerging &elem : influence_areas) + if (! elem.areas.influence_areas.empty()) { + Polygons new_area = safe_union(elem.areas.influence_areas); + if (area(new_area) < tiny_area_threshold) { + BOOST_LOG_TRIVIAL(error) << "Insert Error of Influence area on layer " << layer_idx - 1 << ". Origin of " << elem.parents.size() << " areas. Was to bp " << elem.state.to_buildplate; + tree_supports_show_error("Insert error of area after merge.\n"sv, true); + } + this_layer.emplace_back(elem.state, std::move(elem.parents), std::move(new_area)); + } + + #ifdef SLIC3R_TREESUPPORTS_PROGRESS + progress_total += data_size_inverse * TREE_PROGRESS_AREA_CALC; + Progress::messageProgress(Progress::Stage::SUPPORT, progress_total * m_progress_multiplier + m_progress_offset, TREE_PROGRESS_TOTAL); + #endif + throw_on_cancel(); + } + + BOOST_LOG_TRIVIAL(info) << "Time spent with creating influence areas' subtasks: Increasing areas " << dur_inc.count() / 1000000 << + " ms merging areas: " << (dur_total - dur_inc).count() / 1000000 << " ms"; +} + +/*! + * \brief Sets the result_on_layer for all parents based on the SupportElement supplied. + * + * \param elem[in] The SupportElements, which parent's position should be determined. + */ +static void set_points_on_areas(const SupportElement &elem, SupportElements *layer_above) +{ + assert(!elem.state.deleted); + assert(layer_above != nullptr || elem.parents.empty()); + + // Based on the branch center point of the current layer, the point on the next (further up) layer is calculated. + if (! elem.state.result_on_layer_is_set()) { + BOOST_LOG_TRIVIAL(error) << "Uninitialized support element"; + tree_supports_show_error("Uninitialized support element. A branch may be missing.\n"sv, true); + return; + } + + if (layer_above) + for (int32_t next_elem_idx : elem.parents) { + assert(next_elem_idx >= 0); + SupportElement &next_elem = (*layer_above)[next_elem_idx]; + assert(! next_elem.state.deleted); + // if the value was set somewhere else it it kept. This happens when a branch tries not to move after being unable to create a roof. + if (! next_elem.state.result_on_layer_is_set()) { + // Move inside has edgecases (see tests) so DONT use Polygons.inside to confirm correct move, Error with distance 0 is <= 1 + // it is not required to check if how far this move moved a point as is can be larger than maximum_movement_distance. + // While this seems like a problem it may for example occur after merges. + next_elem.state.result_on_layer = move_inside_if_outside(next_elem.influence_area, elem.state.result_on_layer); + // do not call recursive because then amount of layers would be restricted by the stack size + } + // Mark the parent element as accessed from a valid child element. + next_elem.state.marked = true; + } +} + +static void set_to_model_contact_simple(SupportElement &elem) +{ + const Point best = move_inside_if_outside(elem.influence_area, elem.state.next_position); + elem.state.result_on_layer = best; + BOOST_LOG_TRIVIAL(debug) << "Added NON gracious Support On Model Point (" << best.x() << "," << best.y() << "). The current layer is " << elem.state.layer_idx; +} + +/*! + * \brief Get the best point to connect to the model and set the result_on_layer of the relevant SupportElement accordingly. + * + * \param move_bounds[in,out] All currently existing influence areas + * \param first_elem[in,out] SupportElement that did not have its result_on_layer set meaning that it does not have a child element. + * \param layer_idx[in] The current layer. + */ +static void set_to_model_contact_to_model_gracious( + const TreeModelVolumes &volumes, + const TreeSupportSettings &config, + std::vector &move_bounds, + SupportElement &first_elem, + std::function throw_on_cancel) +{ + SupportElement *last_successfull_layer = nullptr; + + // check for every layer upwards, up to the point where this influence area was created (either by initial insert or merge) if the branch could be placed on it, and highest up layer index. + { + SupportElement *elem = &first_elem; + for (LayerIndex layer_check = elem->state.layer_idx; + ! intersection(elem->influence_area, volumes.getPlaceableAreas(config.getCollisionRadius(elem->state), layer_check, throw_on_cancel)).empty(); + elem = &move_bounds[++ layer_check][elem->parents.front()]) { + assert(elem->state.layer_idx == layer_check); + assert(! elem->state.deleted); + assert(elem->state.to_model_gracious); + last_successfull_layer = elem; + if (elem->parents.size() != 1) + // Reached merge point. + break; + } + } + + // Could not find valid placement, even though it should exist => error handling + if (last_successfull_layer == nullptr) { + BOOST_LOG_TRIVIAL(warning) << "No valid placement found for to model gracious element on layer " << first_elem.state.layer_idx; + tree_supports_show_error("Could not fine valid placement on model! Just placing it down anyway. Could cause floating branches."sv, true); + first_elem.state.to_model_gracious = false; + set_to_model_contact_simple(first_elem); + } else { + // Found a gracious area above first_elem. Remove all below last_successfull_layer. + { + LayerIndex parent_layer_idx = first_elem.state.layer_idx; + for (SupportElement *elem = &first_elem; elem != last_successfull_layer; elem = &move_bounds[++ parent_layer_idx][elem->parents.front()]) { + assert(! elem->state.deleted); + elem->state.deleted = true; + } + } + // Guess a point inside the influence area, in which the branch will be placed in. + const Point best = move_inside_if_outside(last_successfull_layer->influence_area, last_successfull_layer->state.next_position); + last_successfull_layer->state.result_on_layer = best; + BOOST_LOG_TRIVIAL(debug) << "Added gracious Support On Model Point (" << best.x() << "," << best.y() << "). The current layer is " << last_successfull_layer; + } +} + +// Remove elements marked as "deleted", update indices to parents. +static void remove_deleted_elements(std::vector &move_bounds) +{ + std::vector map_parents; + std::vector map_current; + for (LayerIndex layer_idx = LayerIndex(move_bounds.size()) - 1; layer_idx >= 0; -- layer_idx) { + SupportElements &layer = move_bounds[layer_idx]; + map_current.clear(); + for (int32_t i = 0; i < int32_t(layer.size());) { + SupportElement &element = layer[i]; + if (element.state.deleted) { + if (map_current.empty()) { + // Initialize with identity map. + map_current.assign(layer.size(), 0); + std::iota(map_current.begin(), map_current.end(), 0); + } + // Delete all "deleted" elements from the end of the layer vector. + while (i < layer.size() && layer.back().state.deleted) { + layer.pop_back(); + // Mark as deleted in the map. + map_current[layer.size()] = -1; + } + assert(i == layer.size() || i + 1 < layer.size()); + if (i + 1 < layer.size()) { + element = std::move(layer.back()); + layer.pop_back(); + // Mark the current element as deleted. + map_current[i] = -1; + // Mark the moved element as moved to index i. + map_current[layer.size()] = i; + } + } else { + // Current element is not deleted. Update its parent indices. + if (! map_parents.empty()) + for (int32_t &parent_idx : element.parents) + parent_idx = map_parents[parent_idx]; + ++ i; + } + } + std::swap(map_current, map_parents); + } +} + +/*! + * \brief Set the result_on_layer point for all influence areas + * + * \param move_bounds[in,out] All currently existing influence areas + */ +static void create_nodes_from_area( + const TreeModelVolumes &volumes, + const TreeSupportSettings &config, + std::vector &move_bounds, + std::function throw_on_cancel) +{ + // Initialize points on layer 0, with a "random" point in the influence area. + // Point is chosen based on an inaccurate estimate where the branches will split into two, but every point inside the influence area would produce a valid result. + { + SupportElements *layer_above = move_bounds.size() > 1 ? &move_bounds[1] : nullptr; + if (layer_above) { + for (SupportElement &elem : *layer_above) + elem.state.marked = false; + } + for (SupportElement &init : move_bounds.front()) { + init.state.result_on_layer = move_inside_if_outside(init.influence_area, init.state.next_position); + // Also set the parent nodes, as these will be required for the first iteration of the loop below and mark the parent nodes. + set_points_on_areas(init, layer_above); + } + } + + throw_on_cancel(); + + for (LayerIndex layer_idx = 1; layer_idx < LayerIndex(move_bounds.size()); ++ layer_idx) { + auto &layer = move_bounds[layer_idx]; + auto *layer_above = layer_idx + 1 < move_bounds.size() ? &move_bounds[layer_idx + 1] : nullptr; + if (layer_above) + for (SupportElement &elem : *layer_above) + elem.state.marked = false; + for (SupportElement &elem : layer) { + assert(! elem.state.deleted); + assert(elem.state.layer_idx == layer_idx); + // check if the resulting center point is not yet set + if (! elem.state.result_on_layer_is_set()) { + if (elem.state.to_buildplate || (elem.state.distance_to_top < config.min_dtt_to_model && ! elem.state.supports_roof)) { + if (elem.state.to_buildplate) { + BOOST_LOG_TRIVIAL(error) << "Uninitialized Influence area targeting " << elem.state.target_position.x() << "," << elem.state.target_position.y() << ") " + "at target_height: " << elem.state.target_height << " layer: " << layer_idx; + tree_supports_show_error("Uninitialized support element! A branch could be missing or exist partially."sv, true); + } + // we dont need to remove yet the parents as they will have a lower dtt and also no result_on_layer set + elem.state.deleted = true; + } else { + // set the point where the branch will be placed on the model + if (elem.state.to_model_gracious) + set_to_model_contact_to_model_gracious(volumes, config, move_bounds, elem, throw_on_cancel); + else + set_to_model_contact_simple(elem); + } + } + if (! elem.state.deleted && ! elem.state.marked && elem.state.target_height == layer_idx) + // Just a tip surface with no supporting element. + elem.state.deleted = true; + if (elem.state.deleted) { + for (int32_t parent_idx : elem.parents) + // When the roof was not able to generate downwards enough, the top elements may have not moved, and have result_on_layer already set. + // As this branch needs to be removed => all parents result_on_layer have to be invalidated. + (*layer_above)[parent_idx].state.result_on_layer_reset(); + } + if (! elem.state.deleted) { + // Element is valid now setting points in the layer above and mark the parent nodes. + set_points_on_areas(elem, layer_above); + } + } + throw_on_cancel(); + } + +#ifndef NDEBUG + // Verify the tree connectivity including the branch slopes. + for (LayerIndex layer_idx = 0; layer_idx + 1 < LayerIndex(move_bounds.size()); ++ layer_idx) { + auto &layer = move_bounds[layer_idx]; + auto &above = move_bounds[layer_idx + 1]; + for (SupportElement &elem : layer) + if (! elem.state.deleted) { + for (int32_t iparent : elem.parents) { + SupportElement &parent = above[iparent]; + assert(! parent.state.deleted); + assert(elem.state.result_on_layer_is_set() == parent.state.result_on_layer_is_set()); + if (elem.state.result_on_layer_is_set()) { + double radius_increase = config.getRadius(elem.state) - config.getRadius(parent.state); + assert(radius_increase >= 0); + double shift = (elem.state.result_on_layer - parent.state.result_on_layer).cast().norm(); + //FIXME this assert fails a lot. Is it correct? + assert(shift < radius_increase + 2. * config.maximum_move_distance_slow); + } + } + } + } +#endif // NDEBUG + + remove_deleted_elements(move_bounds); + +#ifndef NDEBUG + // Verify the tree connectivity including the branch slopes. + for (LayerIndex layer_idx = 0; layer_idx + 1 < LayerIndex(move_bounds.size()); ++ layer_idx) { + auto &layer = move_bounds[layer_idx]; + auto &above = move_bounds[layer_idx + 1]; + for (SupportElement &elem : layer) { + assert(! elem.state.deleted); + for (int32_t iparent : elem.parents) { + SupportElement &parent = above[iparent]; + assert(! parent.state.deleted); + assert(elem.state.result_on_layer_is_set() == parent.state.result_on_layer_is_set()); + if (elem.state.result_on_layer_is_set()) { + double radius_increase = config.getRadius(elem.state) - config.getRadius(parent.state); + assert(radius_increase >= 0); + double shift = (elem.state.result_on_layer - parent.state.result_on_layer).cast().norm(); + //FIXME this assert fails a lot. Is it correct? + assert(shift < radius_increase + 2. * config.maximum_move_distance_slow); + } + } + } + } +#endif // NDEBUG +} + +// For producing circular / elliptical areas from SupportElements (one DrawArea per one SupportElement) +// and for smoothing those areas along the tree branches. +struct DrawArea +{ + // Element to be processed. + SupportElement *element; + // Element below, if there is such an element. nullptr if element is a root of a tree. + SupportElement *child_element; + // Polygons to be extruded for this element. + Polygons polygons; +}; + +/*! + * \brief Draws circles around result_on_layer points of the influence areas + * + * \param linear_data[in] All currently existing influence areas with the layer they are on + * \param layer_tree_polygons[out] Resulting branch areas with the layerindex they appear on. layer_tree_polygons.size() has to be at least linear_data.size() as each Influence area in linear_data will save have at least one (that's why it's a vector) corresponding branch area in layer_tree_polygons. + * \param inverse_tree_order[in] A mapping that returns the child of every influence area. + */ +static void generate_branch_areas( + const TreeModelVolumes &volumes, + const TreeSupportSettings &config, + const std::vector &move_bounds, + std::vector &linear_data, + std::function throw_on_cancel) +{ +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + double progress_total = TREE_PROGRESS_PRECALC_AVO + TREE_PROGRESS_PRECALC_COLL + TREE_PROGRESS_GENERATE_NODES + TREE_PROGRESS_AREA_CALC; + constexpr int progress_report_steps = 10; + const size_t progress_inserts_check_interval = linear_data.size() / progress_report_steps; + std::mutex critical_sections; +#endif // SLIC3R_TREESUPPORTS_PROGRESS + + // Pre-generate a circle with correct diameter so that we don't have to recompute those (co)sines every time. + const Polygon branch_circle = make_circle(config.branch_radius, SUPPORT_TREE_CIRCLE_RESOLUTION); + + tbb::parallel_for(tbb::blocked_range(0, linear_data.size()), + [&volumes, &config, &move_bounds, &linear_data, &branch_circle, &throw_on_cancel](const tbb::blocked_range &range) { + for (size_t idx = range.begin(); idx < range.end(); ++ idx) { + DrawArea &draw_area = linear_data[idx]; + const LayerIndex layer_idx = draw_area.element->state.layer_idx; + const coord_t radius = config.getRadius(*draw_area.element); + bool parent_uses_min = false; + + // Calculate multiple ovalized circles, to connect with every parent and child. Also generate regular circle for the current layer. Merge all these into one area. + std::vector> movement_directions{ std::pair(Point(0, 0), radius) }; + if (! draw_area.element->state.skip_ovalisation) { + if (draw_area.child_element != nullptr) { + const Point movement = draw_area.child_element->state.result_on_layer - draw_area.element->state.result_on_layer; + movement_directions.emplace_back(movement, radius); + } + const SupportElements *layer_above = layer_idx + 1 < move_bounds.size() ? &move_bounds[layer_idx + 1] : nullptr; + for (int32_t parent_idx : draw_area.element->parents) { + const SupportElement &parent = (*layer_above)[parent_idx]; + const Point movement = parent.state.result_on_layer - draw_area.element->state.result_on_layer; + //FIXME why max(..., config.support_line_width)? + movement_directions.emplace_back(movement, std::max(config.getRadius(parent), config.support_line_width)); + parent_uses_min |= parent.state.use_min_xy_dist; + } + } + + const Polygons &collision = volumes.getCollision(0, layer_idx, parent_uses_min || draw_area.element->state.use_min_xy_dist); + auto generateArea = [&collision, &draw_area, &branch_circle, branch_radius = config.branch_radius, support_line_width = config.support_line_width, &movement_directions] + (coord_t aoffset, double &max_speed) { + Polygons poly; + max_speed = 0; + for (std::pair movement : movement_directions) { + max_speed = std::max(max_speed, movement.first.cast().norm()); + + // Visualization: https://jsfiddle.net/0zvcq39L/2/ + // Ovalizes the circle to an ellipse, that contains both old center and new target position. + double used_scale = (movement.second + aoffset) / (1.0 * branch_radius); + Point center_position = draw_area.element->state.result_on_layer + movement.first / 2; + const double moveX = movement.first.x() / (used_scale * branch_radius); + const double moveY = movement.first.y() / (used_scale * branch_radius); + const double vsize_inv = 0.5 / (0.01 + std::sqrt(moveX * moveX + moveY * moveY)); + + double matrix[] = { + used_scale * (1 + moveX * moveX * vsize_inv), + used_scale * (0 + moveX * moveY * vsize_inv), + used_scale * (0 + moveX * moveY * vsize_inv), + used_scale * (1 + moveY * moveY * vsize_inv), + }; + Polygon circle; + for (Point vertex : branch_circle) + circle.points.emplace_back(center_position + Point(matrix[0] * vertex.x() + matrix[1] * vertex.y(), matrix[2] * vertex.x() + matrix[3] * vertex.y())); + poly.emplace_back(std::move(circle)); + } + + // There seem to be some rounding errors, causing a branch to be a tiny bit further away from the model that it has to be. + // This can cause the tip to be slightly further away front the overhang (x/y wise) than optimal. This fixes it, and for every other part, 0.05mm will not be noticed. + poly = diff_clipped(offset(union_(poly), std::min(coord_t(50), support_line_width / 4), jtMiter, 1.2), collision); + return poly; + }; + + // Ensure branch area will not overlap with model/collision. This can happen because of e.g. ovalization or increase_until_radius. + double max_speed; + Polygons polygons = generateArea(0, max_speed); + const bool fast_relative_movement = max_speed > radius * 0.75; + + if (fast_relative_movement || config.getRadius(*draw_area.element) - config.getCollisionRadius(draw_area.element->state) > config.support_line_width) { + // Simulate the path the nozzle will take on the outermost wall. + // If multiple parts exist, the outer line will not go all around the support part potentially causing support material to be printed mid air. + ExPolygons nozzle_path = offset_ex(polygons, - config.support_line_width / 2); + if (nozzle_path.size() > 1) { + // Just try to make the area a tiny bit larger. + polygons = generateArea(config.support_line_width / 2, max_speed); + nozzle_path = offset_ex(polygons, -config.support_line_width / 2); + // If larger area did not fix the problem, all parts off the nozzle path that do not contain the center point are removed, hoping for the best. + if (nozzle_path.size() > 1) { + ExPolygons polygons_with_correct_center; + for (ExPolygon &part : nozzle_path) { + bool drop = false; + if (! part.contains(draw_area.element->state.result_on_layer)) { + // try a fuzzy inside as sometimes the point should be on the border, but is not because of rounding errors... + Point pt = draw_area.element->state.result_on_layer; + move_inside(to_polygons(part), pt, 0); + drop = (draw_area.element->state.result_on_layer - pt).cast().norm() >= scaled(0.025); + } + if (! drop) + polygons_with_correct_center.emplace_back(std::move(part)); + } + // Increase the area again, to ensure the nozzle path when calculated later is very similar to the one assumed above. + assert(contains(polygons, draw_area.element->state.result_on_layer)); + polygons = diff_clipped(offset(polygons_with_correct_center, config.support_line_width / 2, jtMiter, 1.2), + //FIXME Vojtech: Clipping may split the region into multiple pieces again, reversing the fixing effort. + collision); + } + } + } + + draw_area.polygons = std::move(polygons); + +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + if (idx % progress_inserts_check_interval == 0) { + std::lock_guard critical_section_progress(critical_sections); + progress_total += TREE_PROGRESS_GENERATE_BRANCH_AREAS / progress_report_steps; + Progress::messageProgress(Progress::Stage::SUPPORT, progress_total * m_progress_multiplier + m_progress_offset, TREE_PROGRESS_TOTAL); + } +#endif + throw_on_cancel(); + } + }); +} + +/*! + * \brief Applies some smoothing to the outer wall, intended to smooth out sudden jumps as they can happen when a branch moves though a hole. + * + * \param layer_tree_polygons[in,out] Resulting branch areas with the layerindex they appear on. + */ +static void smooth_branch_areas( + const TreeSupportSettings &config, + std::vector &move_bounds, + std::vector &linear_data, + const std::vector &linear_data_layers, + std::function throw_on_cancel) +{ +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + double progress_total = TREE_PROGRESS_PRECALC_AVO + TREE_PROGRESS_PRECALC_COLL + TREE_PROGRESS_GENERATE_NODES + TREE_PROGRESS_AREA_CALC + TREE_PROGRESS_GENERATE_BRANCH_AREAS; +#endif // SLIC3R_TREESUPPORTS_PROGRESS + + const coord_t max_radius_change_per_layer = 1 + config.support_line_width / 2; // this is the upper limit a radius may change per layer. +1 to avoid rounding errors + + // smooth upwards + for (LayerIndex layer_idx = 0; layer_idx < LayerIndex(move_bounds.size()) - 1; ++ layer_idx) { + const size_t processing_base = linear_data_layers[layer_idx]; + const size_t processing_base_above = linear_data_layers[layer_idx + 1]; + const SupportElements &layer_above = move_bounds[layer_idx + 1]; + tbb::parallel_for(tbb::blocked_range(0, processing_base_above - processing_base), + [&](const tbb::blocked_range &range) { + for (size_t processing_idx = range.begin(); processing_idx < range.end(); ++ processing_idx) { + DrawArea &draw_area = linear_data[processing_base + processing_idx]; + assert(draw_area.element->state.layer_idx == layer_idx); + double max_outer_wall_distance = 0; + bool do_something = false; + for (int32_t parent_idx : draw_area.element->parents) { + const SupportElement &parent = layer_above[parent_idx]; + assert(parent.state.layer_idx == layer_idx + 1); + if (config.getRadius(parent.state) != config.getCollisionRadius(parent.state)) { + do_something = true; + max_outer_wall_distance = std::max(max_outer_wall_distance, (draw_area.element->state.result_on_layer - parent.state.result_on_layer).cast().norm() - (config.getRadius(*draw_area.element) - config.getRadius(parent))); + } + } + max_outer_wall_distance += max_radius_change_per_layer; // As this change is a bit larger than what usually appears, lost radius can be slowly reclaimed over the layers. + if (do_something) { + assert(contains(draw_area.polygons, draw_area.element->state.result_on_layer)); + Polygons max_allowed_area = offset(draw_area.polygons, float(max_outer_wall_distance), jtMiter, 1.2); + for (int32_t parent_idx : draw_area.element->parents) { + const SupportElement &parent = layer_above[parent_idx]; +#ifndef NDEBUG + assert(parent.state.layer_idx == layer_idx + 1); + assert(contains(linear_data[processing_base_above + parent_idx].polygons, parent.state.result_on_layer)); + double radius_increase = config.getRadius(draw_area.element->state) - config.getRadius(parent.state); + assert(radius_increase >= 0); + double shift = (draw_area.element->state.result_on_layer - parent.state.result_on_layer).cast().norm(); + assert(shift < radius_increase + 2. * config.maximum_move_distance_slow); +#endif // NDEBUG + if (config.getRadius(parent.state) != config.getCollisionRadius(parent.state)) { + // No other element on this layer than the current one may be connected to &parent, + // thus it is safe to update parent's DrawArea directly. + Polygons &dst = linear_data[processing_base_above + parent_idx].polygons; +// Polygons orig = dst; + if (! dst.empty()) { + dst = intersection(dst, max_allowed_area); +#if 0 + if (dst.empty()) { + static int irun = 0; + SVG::export_expolygons(debug_out_path("treesupport-extrude_areas-smooth-error-%d.svg", irun ++), + { { { union_ex(max_allowed_area) }, { "max_allowed_area", "yellow", 0.5f } }, + { { union_ex(orig) }, { "orig", "red", "black", "", scaled(0.1f), 0.5f } } }); + ::MessageBoxA(nullptr, "TreeSupport smoothing bug", "Bug detected!", MB_OK | MB_SYSTEMMODAL | MB_SETFOREGROUND | MB_ICONWARNING); + } +#endif + } + } + } + } + throw_on_cancel(); + } + }); + } + +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + progress_total += TREE_PROGRESS_SMOOTH_BRANCH_AREAS / 2; + Progress::messageProgress(Progress::Stage::SUPPORT, progress_total * m_progress_multiplier + m_progress_offset, TREE_PROGRESS_TOTAL); // It is just assumed that both smoothing loops together are one third of the time spent in this function. This was guessed. As the whole function is only 10%, and the smoothing is hard to predict a progress report in the loop may be not useful. +#endif + + // smooth downwards + for (auto& element : move_bounds.back()) + element.state.marked = false; + for (int layer_idx = int(move_bounds.size()) - 2; layer_idx >= 0; -- layer_idx) { + const size_t processing_base = linear_data_layers[layer_idx]; + const size_t processing_base_above = linear_data_layers[layer_idx + 1]; + const SupportElements &layer_above = move_bounds[layer_idx + 1]; + tbb::parallel_for(tbb::blocked_range(0, processing_base_above - processing_base), + [&](const tbb::blocked_range &range) { + for (size_t processing_idx = range.begin(); processing_idx < range.end(); ++ processing_idx) { + DrawArea &draw_area = linear_data[processing_base + processing_idx]; + bool do_something = false; + Polygons max_allowed_area; + for (int32_t parent_idx : draw_area.element->parents) { + const SupportElement &parent = layer_above[parent_idx]; + coord_t max_outer_line_increase = max_radius_change_per_layer; + Polygons result = offset(linear_data[processing_base_above + parent_idx].polygons, max_outer_line_increase, jtMiter, 1.2); + Point direction = draw_area.element->state.result_on_layer - parent.state.result_on_layer; + // move the polygons object + for (auto &outer : result) + for (Point& p : outer) + p += direction; + append(max_allowed_area, std::move(result)); + do_something = do_something || parent.state.marked || config.getCollisionRadius(parent.state) != config.getRadius(parent.state); + } + if (do_something) { + // Trim the current drawing areas with max_allowed_area. + Polygons result = intersection(max_allowed_area, draw_area.polygons); + if (area(result) < area(draw_area.polygons)) { + // Mark parent as modified to propagate down. + draw_area.element->state.marked = true; + draw_area.polygons = std::move(result); + } + } + throw_on_cancel(); + } + }); + } + +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + progress_total += TREE_PROGRESS_SMOOTH_BRANCH_AREAS / 2; + Progress::messageProgress(Progress::Stage::SUPPORT, progress_total * m_progress_multiplier + m_progress_offset, TREE_PROGRESS_TOTAL); +#endif +} + +/*! + * \brief Drop down areas that do rest non-gracefully on the model to ensure the branch actually rests on something. + * + * \param layer_tree_polygons[in] Resulting branch areas with the layerindex they appear on. + * \param linear_data[in] All currently existing influence areas with the layer they are on + * \param dropped_down_areas[out] Areas that have to be added to support all non-graceful areas. + * \param inverse_tree_order[in] A mapping that returns the child of every influence area. + */ +static void drop_non_gracious_areas( + const TreeModelVolumes &volumes, + const std::vector &linear_data, + std::vector &support_layer_storage, + std::function throw_on_cancel) +{ + std::vector>> dropped_down_areas(linear_data.size()); + tbb::parallel_for(tbb::blocked_range(0, linear_data.size()), + [&](const tbb::blocked_range &range) { + for (size_t idx = range.begin(); idx < range.end(); ++ idx) { + // If a element has no child, it connects to whatever is below as no support further down for it will exist. + if (const DrawArea &draw_element = linear_data[idx]; ! draw_element.element->state.to_model_gracious && draw_element.child_element == nullptr) { + Polygons rest_support; + const LayerIndex layer_idx_first = draw_element.element->state.layer_idx - 1; + for (LayerIndex layer_idx = layer_idx_first; area(rest_support) > tiny_area_threshold && layer_idx >= 0; -- layer_idx) { + rest_support = diff_clipped(layer_idx == layer_idx_first ? draw_element.polygons : rest_support, volumes.getCollision(0, layer_idx, false)); + dropped_down_areas[idx].emplace_back(layer_idx, rest_support); + } + } + throw_on_cancel(); + } + }); + + for (coord_t i = 0; i < static_cast(dropped_down_areas.size()); i++) + for (std::pair &pair : dropped_down_areas[i]) + append(support_layer_storage[pair.first], std::move(pair.second)); +} + +/*! + * \brief Generates Support Floor, ensures Support Roof can not cut of branches, and saves the branches as support to storage + * + * \param support_layer_storage[in] Areas where support should be generated. + * \param support_roof_storage[in] Areas where support was replaced with roof. + * \param storage[in,out] The storage where the support should be stored. + */ +static void finalize_interface_and_support_areas( + const PrintObject &print_object, + const TreeModelVolumes &volumes, + const TreeSupportSettings &config, + const std::vector &overhangs, + std::vector &support_layer_storage, + std::vector &support_roof_storage, + + SupportGeneratorLayersPtr &bottom_contacts, + SupportGeneratorLayersPtr &top_contacts, + SupportGeneratorLayersPtr &intermediate_layers, + SupportGeneratorLayerStorage &layer_storage, + + std::function throw_on_cancel) +{ + assert(std::all_of(bottom_contacts.begin(), bottom_contacts.end(), [](auto *p) { return p == nullptr; })); +// assert(std::all_of(top_contacts.begin(), top_contacts.end(), [](auto* p) { return p == nullptr; })); + assert(std::all_of(intermediate_layers.begin(), intermediate_layers.end(), [](auto* p) { return p == nullptr; })); + + InterfacePreference interface_pref = config.interface_preference; // InterfacePreference::InterfaceAreaOverwritesSupport; + +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + double progress_total = TREE_PROGRESS_PRECALC_AVO + TREE_PROGRESS_PRECALC_COLL + TREE_PROGRESS_GENERATE_NODES + TREE_PROGRESS_AREA_CALC + TREE_PROGRESS_GENERATE_BRANCH_AREAS + TREE_PROGRESS_SMOOTH_BRANCH_AREAS; +#endif // SLIC3R_TREESUPPORTS_PROGRESS + + // Iterate over the generated circles in parallel and clean them up. Also add support floor. + tbb::spin_mutex layer_storage_mutex; + tbb::parallel_for(tbb::blocked_range(0, support_layer_storage.size()), + [&](const tbb::blocked_range &range) { + for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) { + // Subtract support lines of the branches from the roof + SupportGeneratorLayer *support_roof = top_contacts[layer_idx]; + Polygons support_roof_polygons; + + if (Polygons &src = support_roof_storage[layer_idx]; ! src.empty()) { + if (support_roof != nullptr && ! support_roof->polygons.empty()) { + support_roof_polygons = union_(src, support_roof->polygons); + support_roof->polygons.clear(); + } else + support_roof_polygons = std::move(src); + } else if (support_roof != nullptr) { + support_roof_polygons = std::move(support_roof->polygons); + support_roof->polygons.clear(); + } + + assert(intermediate_layers[layer_idx] == nullptr); + Polygons base_layer_polygons = std::move(support_layer_storage[layer_idx]); + + if (! base_layer_polygons.empty()) { + // Most of the time in this function is this union call. Can take 300+ ms when a lot of areas are to be unioned. + base_layer_polygons = smooth_outward(union_(base_layer_polygons), config.support_line_width); //FIXME was .smooth(50); + //smooth_outward(closing(std::move(bottom), closing_distance + minimum_island_radius, closing_distance, SUPPORT_SURFACES_OFFSET_PARAMETERS), smoothing_distance) : + // simplify a bit, to ensure the output does not contain outrageous amounts of vertices. Should not be necessary, just a precaution. + base_layer_polygons = polygons_simplify(base_layer_polygons, std::min(scaled(0.03), double(config.resolution))); + } + + if (! support_roof_polygons.empty() && ! base_layer_polygons.empty()) { +// if (area(intersection(base_layer_polygons, support_roof_polygons)) > tiny_area_threshold) + { + switch (interface_pref) { + case InterfacePreference::InterfaceAreaOverwritesSupport: + base_layer_polygons = diff(base_layer_polygons, support_roof_polygons); + break; + case InterfacePreference::SupportAreaOverwritesInterface: + support_roof_polygons = diff(support_roof_polygons, base_layer_polygons); + break; + //FIXME + #if 1 + case InterfacePreference::InterfaceLinesOverwriteSupport: + case InterfacePreference::SupportLinesOverwriteInterface: + assert(false); + [[fallthrough]]; + #else + case InterfacePreference::InterfaceLinesOverwriteSupport: + { + // Hatch the support roof interfaces, offset them by their line width and subtract them from support base. + Polygons interface_lines = offset(to_polylines( + generate_support_infill_lines(support_roof->polygons, true, layer_idx, config.support_roof_line_distance)), + config.support_roof_line_width / 2); + base_layer_polygons = diff(base_layer_polygons, interface_lines); + break; + } + case InterfacePreference::SupportLinesOverwriteInterface: + { + // Hatch the support roof interfaces, offset them by their line width and subtract them from support base. + Polygons tree_lines = union_(offset(to_polylines( + generate_support_infill_lines(base_layer_polygons, false, layer_idx, config.support_line_distance, true)), + config.support_line_width / 2)); + // do not draw roof where the tree is. I prefer it this way as otherwise the roof may cut of a branch from its support below. + support_roof->polygons = diff(support_roof->polygons, tree_lines); + break; + } + #endif + case InterfacePreference::Nothing: + break; + } + } + } + + // Subtract support floors from the support area and add them to the support floor instead. + if (config.support_bottom_layers > 0 && ! base_layer_polygons.empty()) { + SupportGeneratorLayer*& support_bottom = bottom_contacts[layer_idx]; + Polygons layer_outset = diff_clipped( + config.support_bottom_offset > 0 ? offset(base_layer_polygons, config.support_bottom_offset, jtMiter, 1.2) : base_layer_polygons, + volumes.getCollision(0, layer_idx, false)); + Polygons floor_layer; + size_t layers_below = 0; + while (layers_below <= config.support_bottom_layers) { + // one sample at 0 layers below, another at config.support_bottom_layers. In-between samples at config.performance_interface_skip_layers distance from each other. + const size_t sample_layer = static_cast(std::max(0, (static_cast(layer_idx) - static_cast(layers_below)) - static_cast(config.z_distance_bottom_layers))); + //FIXME subtract the wipe tower + append(floor_layer, intersection(layer_outset, overhangs[sample_layer])); + if (layers_below < config.support_bottom_layers) + layers_below = std::min(layers_below + config.performance_interface_skip_layers, config.support_bottom_layers); + else + break; + } + if (! floor_layer.empty()) { + if (support_bottom == nullptr) + support_bottom = &layer_allocate(layer_storage, layer_storage_mutex, SupporLayerType::BottomContact, print_object.slicing_parameters(), config, layer_idx); + support_bottom->polygons = union_(floor_layer, support_bottom->polygons); + base_layer_polygons = diff_clipped(base_layer_polygons, offset(support_bottom->polygons, scaled(0.01), jtMiter, 1.2)); // Subtract the support floor from the normal support. + } + } + + if (! support_roof_polygons.empty()) { + if (support_roof == nullptr) + support_roof = top_contacts[layer_idx] = &layer_allocate(layer_storage, layer_storage_mutex, SupporLayerType::TopContact, print_object.slicing_parameters(), config, layer_idx); + support_roof->polygons = union_(support_roof_polygons); + } + if (! base_layer_polygons.empty()) { + SupportGeneratorLayer *base_layer = intermediate_layers[layer_idx] = &layer_allocate(layer_storage, layer_storage_mutex, SupporLayerType::Base, print_object.slicing_parameters(), config, layer_idx); + base_layer->polygons = union_(base_layer_polygons); + } + +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + { + std::lock_guard critical_section_progress(critical_sections); + progress_total += TREE_PROGRESS_FINALIZE_BRANCH_AREAS / support_layer_storage.size(); + Progress::messageProgress(Progress::Stage::SUPPORT, progress_total * m_progress_multiplier + m_progress_offset, TREE_PROGRESS_TOTAL); + } +#endif +#if 0 + { + std::lock_guard lock(critical_sections); + if (!storage.support.supportLayers[layer_idx].support_infill_parts.empty() || !storage.support.supportLayers[layer_idx].support_roof.empty()) + storage.support.layer_nr_max_filled_layer = std::max(storage.support.layer_nr_max_filled_layer, static_cast(layer_idx)); + } +#endif + throw_on_cancel(); + } + }); +} + +/*! + * \brief Draws circles around result_on_layer points of the influence areas and applies some post processing. + * + * \param move_bounds[in] All currently existing influence areas + * \param storage[in,out] The storage where the support should be stored. + */ +static void draw_areas( + PrintObject &print_object, + const TreeModelVolumes &volumes, + const TreeSupportSettings &config, + const std::vector &overhangs, + std::vector &move_bounds, + + SupportGeneratorLayersPtr &bottom_contacts, + SupportGeneratorLayersPtr &top_contacts, + SupportGeneratorLayersPtr &intermediate_layers, + SupportGeneratorLayerStorage &layer_storage, + std::function throw_on_cancel) +{ + std::vector support_layer_storage(move_bounds.size()); + std::vector support_roof_storage(move_bounds.size()); + // All SupportElements are put into a layer independent storage to improve parallelization. + std::vector linear_data; + std::vector linear_data_layers; + { + std::vector> map_downwards_old; + std::vector> map_downwards_new; + for (LayerIndex layer_idx = 0; layer_idx < LayerIndex(move_bounds.size()); ++ layer_idx) { + SupportElements *layer_above = layer_idx + 1 < move_bounds.size() ? &move_bounds[layer_idx + 1] : nullptr; + map_downwards_new.clear(); + linear_data_layers.emplace_back(linear_data.size()); + std::sort(map_downwards_old.begin(), map_downwards_old.end(), [](auto &l, auto &r) { return l.first < r.first; }); + for (SupportElement &elem : move_bounds[layer_idx]) { + SupportElement *child = nullptr; + if (layer_idx > 0) { + auto it = std::lower_bound(map_downwards_old.begin(), map_downwards_old.end(), &elem, [](auto &l, const SupportElement *r) { return l.first < r; }); + if (it != map_downwards_old.end() && it->first == &elem) { + child = it->second; + // Only one link points to a node above from below. + assert(! (++ it != map_downwards_old.end() && it->first == &elem)); + } + assert(child ? child->state.result_on_layer_is_set() : elem.state.target_height > layer_idx); + } + for (int32_t parent_idx : elem.parents) { + SupportElement &parent = (*layer_above)[parent_idx]; + if (parent.state.result_on_layer_is_set()) + map_downwards_new.emplace_back(&parent, &elem); + } + linear_data.push_back({ &elem, child }); + } + std::swap(map_downwards_old, map_downwards_new); + } + linear_data_layers.emplace_back(linear_data.size()); + } + + throw_on_cancel(); + +#ifndef NDEBUG + for (size_t i = 0; i < move_bounds.size(); ++ i) { + size_t begin = linear_data_layers[i]; + size_t end = linear_data_layers[i + 1]; + for (size_t j = begin; j < end; ++ j) + assert(linear_data[j].element == &move_bounds[i][j - begin]); + } +#endif // NDEBUG + + auto t_start = std::chrono::high_resolution_clock::now(); + // Generate the circles that will be the branches. + generate_branch_areas(volumes, config, move_bounds, linear_data, throw_on_cancel); + +#if 0 + assert(linear_data_layers.size() == move_bounds.size() + 1); + for (const auto &draw_area : linear_data) + assert(contains(draw_area.polygons, draw_area.element->state.result_on_layer)); + for (size_t i = 0; i < move_bounds.size(); ++ i) { + size_t begin = linear_data_layers[i]; + size_t end = linear_data_layers[i + 1]; + for (size_t j = begin; j < end; ++ j) { + const auto &draw_area = linear_data[j]; + assert(draw_area.element == &move_bounds[i][j - begin]); + assert(contains(draw_area.polygons, draw_area.element->state.result_on_layer)); + } + } +#endif + +#if 0 + for (size_t area_layer_idx = 0; area_layer_idx + 1 < linear_data_layers.size(); ++ area_layer_idx) { + size_t begin = linear_data_layers[area_layer_idx]; + size_t end = linear_data_layers[area_layer_idx + 1]; + Polygons polygons; + for (size_t area_idx = begin; area_idx < end; ++ area_idx) { + DrawArea &area = linear_data[area_idx]; + append(polygons, area.polygons); + } + SVG::export_expolygons(debug_out_path("treesupport-extrude_areas-raw-%d.svg", area_layer_idx), + { { { union_ex(polygons) }, { "parent", "red", "black", "", scaled(0.1f), 0.5f } } }); + } +#endif + + auto t_generate = std::chrono::high_resolution_clock::now(); + // In some edgecases a branch may go though a hole, where the regular radius does not fit. This can result in an apparent jump in branch radius. As such this cases need to be caught and smoothed out. + smooth_branch_areas(config, move_bounds, linear_data, linear_data_layers, throw_on_cancel); + +#if 0 + for (size_t area_layer_idx = 0; area_layer_idx + 1 < linear_data_layers.size(); ++area_layer_idx) { + size_t begin = linear_data_layers[area_layer_idx]; + size_t end = linear_data_layers[area_layer_idx + 1]; + Polygons polygons; + for (size_t area_idx = begin; area_idx < end; ++area_idx) { + DrawArea& area = linear_data[area_idx]; + append(polygons, area.polygons); + } + SVG::export_expolygons(debug_out_path("treesupport-extrude_areas-smooth-%d.svg", area_layer_idx), + { { { union_ex(polygons) }, { "parent", "red", "black", "", scaled(0.1f), 0.5f } } }); + } +#endif + + auto t_smooth = std::chrono::high_resolution_clock::now(); + // drop down all trees that connect non gracefully with the model + drop_non_gracious_areas(volumes, linear_data, support_layer_storage, throw_on_cancel); + auto t_drop = std::chrono::high_resolution_clock::now(); + + // Single threaded combining all support areas to the right layers. + { + auto begin = linear_data.begin(); + for (LayerIndex layer_idx = 0; layer_idx < LayerIndex(move_bounds.size()); ++ layer_idx) { + size_t cnt_roofs = 0; + size_t cnt_layers = 0; + auto end = begin; + for (; end != linear_data.end() && end->element->state.layer_idx == layer_idx; ++ end) + ++ (end->element->state.missing_roof_layers > end->element->state.distance_to_top ? cnt_roofs : cnt_layers); + auto &this_roofs = support_roof_storage[layer_idx]; + auto &this_layers = support_layer_storage[layer_idx]; + this_roofs.reserve(this_roofs.size() + cnt_roofs); + this_layers.reserve(this_layers.size() + cnt_layers); + for (auto it = begin; it != end; ++ it) + std::move(std::begin(it->polygons), std::end(it->polygons), std::back_inserter(it->element->state.missing_roof_layers > it->element->state.distance_to_top ? this_roofs : this_layers)); + begin = end; + } + } + + finalize_interface_and_support_areas(print_object, volumes, config, overhangs, support_layer_storage, support_roof_storage, + bottom_contacts, top_contacts, intermediate_layers, layer_storage, throw_on_cancel); + auto t_end = std::chrono::high_resolution_clock::now(); + + auto dur_gen_tips = 0.001 * std::chrono::duration_cast(t_generate - t_start).count(); + auto dur_smooth = 0.001 * std::chrono::duration_cast(t_smooth - t_generate).count(); + auto dur_drop = 0.001 * std::chrono::duration_cast(t_drop - t_smooth).count(); + auto dur_finalize = 0.001 * std::chrono::duration_cast(t_end - t_drop).count(); + + BOOST_LOG_TRIVIAL(info) << + "Time used for drawing subfuctions: generate_branch_areas: " << dur_gen_tips << " ms " + "smooth_branch_areas: " << dur_smooth << " ms " + "drop_non_gracious_areas: " << dur_drop << " ms " + "finalize_interface_and_support_areas " << dur_finalize << " ms"; +} + +#if 1 +// Test whether two circles, each on its own plane in 3D intersect. +// Circles are considered intersecting, if the lowest point on one circle is below the other circle's plane. +// Assumption: The two planes are oriented the same way. +static bool circles_intersect( + const Vec3d &p1, const Vec3d &n1, const double r1, + const Vec3d &p2, const Vec3d &n2, const double r2) +{ + assert(n1.dot(n2) >= 0); + + const Vec3d z = n1.cross(n2); + const Vec3d dir1 = z.cross(n1); + const Vec3d lowest_point1 = p1 + dir1 * (r1 / dir1.norm()); + assert(n2.dot(p1) >= n2.dot(lowest_point1)); + if (n2.dot(lowest_point1) <= 0) + return true; + const Vec3d dir2 = z.cross(n2); + const Vec3d lowest_point2 = p2 + dir2 * (r2 / dir2.norm()); + assert(n1.dot(p2) >= n1.dot(lowest_point2)); + return n1.dot(lowest_point2) <= 0; +} + +template +void triangulate_fan(indexed_triangle_set &its, int ifan, int ibegin, int iend) +{ + // at least 3 vertices, increasing order. + assert(ibegin + 3 <= iend); + assert(ibegin >= 0 && iend <= its.vertices.size()); + assert(ifan >= 0 && ifan < its.vertices.size()); + int num_faces = iend - ibegin; + its.indices.reserve(its.indices.size() + num_faces * 3); + for (int v = ibegin, u = iend - 1; v < iend; u = v ++) { + if (flip_normals) + its.indices.push_back({ ifan, u, v }); + else + its.indices.push_back({ ifan, v, u }); + } +} + +static void triangulate_strip(indexed_triangle_set &its, int ibegin1, int iend1, int ibegin2, int iend2) +{ + // at least 3 vertices, increasing order. + assert(ibegin1 + 3 <= iend1); + assert(ibegin1 >= 0 && iend1 <= its.vertices.size()); + assert(ibegin2 + 3 <= iend2); + assert(ibegin2 >= 0 && iend2 <= its.vertices.size()); + int n1 = iend1 - ibegin1; + int n2 = iend2 - ibegin2; + its.indices.reserve(its.indices.size() + (n1 + n2) * 3); + + // For the first vertex of 1st strip, find the closest vertex on the 2nd strip. + int istart2 = ibegin2; + { + const Vec3f &p1 = its.vertices[ibegin1]; + auto d2min = std::numeric_limits::max(); + for (int i = ibegin2; i < iend2; ++ i) { + const Vec3f &p2 = its.vertices[i]; + const float d2 = (p2 - p1).squaredNorm(); + if (d2 < d2min) { + d2min = d2; + istart2 = i; + } + } + } + + // Now triangulate the strip zig-zag fashion taking always the shortest connection if possible. + for (int u = ibegin1, v = istart2; n1 > 0 || n2 > 0;) { + bool take_first; + int u2, v2; + auto update_u2 = [&u2, u, ibegin1, iend1]() { + u2 = u; + if (++ u2 == iend1) + u2 = ibegin1; + }; + auto update_v2 = [&v2, v, ibegin2, iend2]() { + v2 = v; + if (++ v2 == iend2) + v2 = ibegin2; + }; + if (n1 == 0) { + take_first = false; + update_v2(); + } else if (n2 == 0) { + take_first = true; + update_u2(); + } else { + update_u2(); + update_v2(); + float l1 = (its.vertices[u2] - its.vertices[v]).squaredNorm(); + float l2 = (its.vertices[v2] - its.vertices[u]).squaredNorm(); + take_first = l1 < l2; + } + if (take_first) { + its.indices.push_back({ u, u2, v }); + -- n1; + u = u2; + } else { + its.indices.push_back({ u, v2, v }); + -- n2; + v = v2; + } + } +} + +// Discretize 3D circle, append to output vector, return ranges of indices of the points added. +static std::pair discretize_circle(const Vec3f ¢er, const Vec3f &normal, const float radius, const float eps, std::vector &pts) +{ + // Calculate discretization step and number of steps. + float angle_step = 2. * acos(1. - eps / radius); + auto nsteps = int(ceil(2 * M_PI / angle_step)); + angle_step = 2 * M_PI / nsteps; + + // Prepare coordinate system for the circle plane. + Vec3f x = normal.cross(Vec3f(0.f, -1.f, 0.f)).normalized(); + Vec3f y = normal.cross(x).normalized(); + assert(std::abs(x.cross(y).dot(normal) - 1.f) < EPSILON); + + // Discretize the circle. + int begin = int(pts.size()); + pts.reserve(pts.size() + nsteps); + float angle = 0; + x *= radius; + y *= radius; + for (int i = 0; i < nsteps; ++ i) { + pts.emplace_back(center + x * cos(angle) + y * sin(angle)); + angle += angle_step; + } + return { begin, int(pts.size()) }; +} + +static void extrude_branch( + const std::vector &path, + const TreeSupportSettings &config, + const SlicingParameters &slicing_params, + const std::vector &move_bounds, + indexed_triangle_set &result) +{ + Vec3d p1, p2, p3; + Vec3d v1, v2; + Vec3d nprev; + Vec3d ncurrent; + assert(path.size() >= 2); + static constexpr const float eps = 0.015f; + std::pair prev_strip; + +// char fname[2048]; +// static int irun = 0; + + for (size_t ipath = 1; ipath < path.size(); ++ ipath) { + const SupportElement &prev = *path[ipath - 1]; + const SupportElement ¤t = *path[ipath]; + assert(prev.state.layer_idx + 1 == current.state.layer_idx); + p1 = to_3d(unscaled(prev .state.result_on_layer), layer_z(slicing_params, config, prev .state.layer_idx)); + p2 = to_3d(unscaled(current.state.result_on_layer), layer_z(slicing_params, config, current.state.layer_idx)); + v1 = (p2 - p1).normalized(); + if (ipath == 1) { + nprev = v1; + // Extrude the bottom half sphere. + float radius = unscaled(config.getRadius(prev.state)); + float angle_step = 2. * acos(1. - eps / radius); + auto nsteps = int(ceil(M_PI / (2. * angle_step))); + angle_step = M_PI / (2. * nsteps); + int ifan = int(result.vertices.size()); + result.vertices.emplace_back((p1 - nprev * radius).cast()); + float angle = angle_step; + for (int i = 1; i < nsteps; ++ i, angle += angle_step) { + std::pair strip = discretize_circle((p1 - nprev * radius * cos(angle)).cast(), nprev.cast(), radius * sin(angle), eps, result.vertices); + if (i == 1) + triangulate_fan(result, ifan, strip.first, strip.second); + else + triangulate_strip(result, prev_strip.first, prev_strip.second, strip.first, strip.second); +// sprintf(fname, "d:\\temp\\meshes\\tree-partial-%d.obj", ++ irun); +// its_write_obj(result, fname); + prev_strip = strip; + } + } + if (ipath + 1 == path.size()) { + // End of the tube. + ncurrent = v1; + // Extrude the top half sphere. + float radius = unscaled(config.getRadius(current.state)); + float angle_step = 2. * acos(1. - eps / radius); + auto nsteps = int(ceil(M_PI / (2. * angle_step))); + angle_step = M_PI / (2. * nsteps); + auto angle = float(M_PI / 2.); + for (int i = 0; i < nsteps; ++ i, angle -= angle_step) { + std::pair strip = discretize_circle((p2 + ncurrent * radius * cos(angle)).cast(), ncurrent.cast(), radius * sin(angle), eps, result.vertices); + triangulate_strip(result, prev_strip.first, prev_strip.second, strip.first, strip.second); +// sprintf(fname, "d:\\temp\\meshes\\tree-partial-%d.obj", ++ irun); +// its_write_obj(result, fname); + prev_strip = strip; + } + int ifan = int(result.vertices.size()); + result.vertices.emplace_back((p2 + ncurrent * radius).cast()); + triangulate_fan(result, ifan, prev_strip.first, prev_strip.second); +// sprintf(fname, "d:\\temp\\meshes\\tree-partial-%d.obj", ++ irun); +// its_write_obj(result, fname); + } else { + const SupportElement &next = *path[ipath + 1]; + assert(current.state.layer_idx + 1 == next.state.layer_idx); + p3 = to_3d(unscaled(next.state.result_on_layer), layer_z(slicing_params, config, next.state.layer_idx)); + v2 = (p3 - p2).normalized(); + ncurrent = (v1 + v2).normalized(); + float radius = unscaled(config.getRadius(current.state)); + std::pair strip = discretize_circle(p2.cast(), ncurrent.cast(), radius, eps, result.vertices); + triangulate_strip(result, prev_strip.first, prev_strip.second, strip.first, strip.second); + prev_strip = strip; +// sprintf(fname, "d:\\temp\\meshes\\tree-partial-%d.obj", ++irun); +// its_write_obj(result, fname); + } +#if 0 + if (circles_intersect(p1, nprev, settings.getRadius(prev), p2, ncurrent, settings.getRadius(current))) { + // Cannot connect previous and current slice using a simple zig-zag triangulation, + // because the two circles intersect. + + } else { + // Continue with chaining. + + } +#endif + } +} +#endif + +#ifdef TREE_SUPPORT_ORGANIC_NUDGE_NEW +// New version using per layer AABB trees of lines for nudging spheres away from an object. +static void organic_smooth_branches_avoid_collisions( + const PrintObject &print_object, + const TreeModelVolumes &volumes, + const TreeSupportSettings &config, + std::vector &move_bounds, + const std::vector> &elements_with_link_down, + const std::vector &linear_data_layers, + std::function throw_on_cancel) +{ + struct LayerCollisionCache { + coord_t min_element_radius{ std::numeric_limits::max() }; + bool min_element_radius_known() const { return this->min_element_radius != std::numeric_limits::max(); } + coord_t collision_radius{ 0 }; + std::vector lines; + AABBTreeIndirect::Tree<2, double> aabbtree_lines; + bool empty() const { return this->lines.empty(); } + }; + std::vector layer_collision_cache; + layer_collision_cache.reserve(1024); + const SlicingParameters &slicing_params = print_object.slicing_parameters(); + for (const std::pair& element : elements_with_link_down) { + LayerIndex layer_idx = element.first->state.layer_idx; + if (size_t num_layers = layer_idx + 1; num_layers > layer_collision_cache.size()) { + if (num_layers > layer_collision_cache.capacity()) + reserve_power_of_2(layer_collision_cache, num_layers); + layer_collision_cache.resize(num_layers, {}); + } + auto& l = layer_collision_cache[layer_idx]; + l.min_element_radius = std::min(l.min_element_radius, config.getRadius(element.first->state)); + } + + throw_on_cancel(); + + for (LayerIndex layer_idx = 0; layer_idx < LayerIndex(layer_collision_cache.size()); ++layer_idx) + if (LayerCollisionCache& l = layer_collision_cache[layer_idx]; !l.min_element_radius_known()) + l.min_element_radius = 0; + else { + //FIXME + l.min_element_radius = 0; + std::optional>> res = volumes.get_collision_lower_bound_area(layer_idx, l.min_element_radius); + assert(res.has_value()); + l.collision_radius = res->first; + Lines alines = to_lines(res->second.get()); + l.lines.reserve(alines.size()); + for (const Line &line : alines) + l.lines.push_back({ unscaled(line.a), unscaled(line.b) }); + l.aabbtree_lines = AABBTreeLines::build_aabb_tree_over_indexed_lines(l.lines); + throw_on_cancel(); + } + + struct CollisionSphere { + const SupportElement& element; + int element_below_id; + const bool locked; + float radius; + // Current position, when nudged away from the collision. + Vec3f position; + // Previous position, for Laplacian smoothing. + Vec3f prev_position; + // + Vec3f last_collision; + double last_collision_depth; + // Minimum Z for which the sphere collision will be evaluated. + // Limited by the minimum sloping angle and by the bottom of the tree. + float min_z{ -std::numeric_limits::max() }; + // Maximum Z for which the sphere collision will be evaluated. + // Limited by the minimum sloping angle and by the tip of the current branch. + float max_z{ std::numeric_limits::max() }; + uint32_t layer_begin; + uint32_t layer_end; + }; + + std::vector collision_spheres; + collision_spheres.reserve(elements_with_link_down.size()); + for (const std::pair &element_with_link : elements_with_link_down) { + const SupportElement &element = *element_with_link.first; + const int link_down = element_with_link.second; + collision_spheres.push_back({ + element, + link_down, + // locked + element.parents.empty() || (link_down == -1 && element.state.layer_idx > 0), + unscaled(config.getRadius(element.state)), + // 3D position + to_3d(unscaled(element.state.result_on_layer), float(layer_z(slicing_params, config, element.state.layer_idx))) + }); + // Update min_z coordinate to min_z of the tree below. + CollisionSphere &collision_sphere = collision_spheres.back(); + if (link_down != -1) { + const size_t offset_below = linear_data_layers[element.state.layer_idx - 1]; + collision_sphere.min_z = collision_spheres[offset_below + link_down].min_z; + } else + collision_sphere.min_z = collision_sphere.position.z(); + } + // Update max_z by propagating max_z from the tips of the branches. + for (int collision_sphere_id = int(collision_spheres.size()) - 1; collision_sphere_id >= 0; -- collision_sphere_id) { + CollisionSphere &collision_sphere = collision_spheres[collision_sphere_id]; + if (collision_sphere.element.parents.empty()) + // Tip + collision_sphere.max_z = collision_sphere.position.z(); + else { + // Below tip + const size_t offset_above = linear_data_layers[collision_sphere.element.state.layer_idx + 1]; + for (auto iparent : collision_sphere.element.parents) { + float parent_z = collision_spheres[offset_above + iparent].max_z; +// collision_sphere.max_z = collision_sphere.max_z == std::numeric_limits::max() ? parent_z : std::max(collision_sphere.max_z, parent_z); + collision_sphere.max_z = std::min(collision_sphere.max_z, parent_z); + } + } + } + // Update min_z / max_z to limit the search Z span of a given sphere for collision detection. + for (CollisionSphere &collision_sphere : collision_spheres) { + //FIXME limit the collision span by the tree slope. + collision_sphere.min_z = std::max(collision_sphere.min_z, collision_sphere.position.z() - collision_sphere.radius); + collision_sphere.max_z = std::min(collision_sphere.max_z, collision_sphere.position.z() + collision_sphere.radius); + collision_sphere.layer_begin = std::min(collision_sphere.element.state.layer_idx, layer_idx_ceil(slicing_params, config, collision_sphere.min_z)); + assert(collision_sphere.layer_begin < layer_collision_cache.size()); + collision_sphere.layer_end = std::min(LayerIndex(layer_collision_cache.size()), std::max(collision_sphere.element.state.layer_idx, layer_idx_floor(slicing_params, config, collision_sphere.max_z)) + 1); + } + + throw_on_cancel(); + + static constexpr const double collision_extra_gap = 0.1; + static constexpr const double max_nudge_collision_avoidance = 0.5; + static constexpr const double max_nudge_smoothing = 0.2; + static constexpr const size_t num_iter = 100; // 1000; + for (size_t iter = 0; iter < num_iter; ++ iter) { + // Back up prev position before Laplacian smoothing. + for (CollisionSphere &collision_sphere : collision_spheres) + collision_sphere.prev_position = collision_sphere.position; + std::atomic num_moved{ 0 }; + tbb::parallel_for(tbb::blocked_range(0, collision_spheres.size()), + [&collision_spheres, &layer_collision_cache, &slicing_params, &config, &move_bounds, &linear_data_layers, &num_moved, &throw_on_cancel](const tbb::blocked_range range) { + for (size_t collision_sphere_id = range.begin(); collision_sphere_id < range.end(); ++ collision_sphere_id) + if (CollisionSphere &collision_sphere = collision_spheres[collision_sphere_id]; ! collision_sphere.locked) { + // Calculate collision of multiple 2D layers against a collision sphere. + collision_sphere.last_collision_depth = - std::numeric_limits::max(); + for (uint32_t layer_id = collision_sphere.layer_begin; layer_id != collision_sphere.layer_end; ++ layer_id) { + double dz = (layer_id - collision_sphere.element.state.layer_idx) * slicing_params.layer_height; + if (double r2 = sqr(collision_sphere.radius) - sqr(dz); r2 > 0) { + if (const LayerCollisionCache &layer_collision_cache_item = layer_collision_cache[layer_id]; ! layer_collision_cache_item.empty()) { + size_t hit_idx_out; + Vec2d hit_point_out; + if (double dist = sqrt(AABBTreeLines::squared_distance_to_indexed_lines( + layer_collision_cache_item.lines, layer_collision_cache_item.aabbtree_lines, Vec2d(to_2d(collision_sphere.position).cast()), + hit_idx_out, hit_point_out, r2)); dist >= 0.) { + double collision_depth = sqrt(r2) - dist; + if (collision_depth > collision_sphere.last_collision_depth) { + collision_sphere.last_collision_depth = collision_depth; + collision_sphere.last_collision = to_3d(hit_point_out.cast(), float(layer_z(slicing_params, config, layer_id))); + } + } + } + } + } + if (collision_sphere.last_collision_depth > 0) { + // Collision detected to be removed. + // Nudge the circle center away from the collision. + if (collision_sphere.last_collision_depth > EPSILON) + // a little bit of hysteresis to detect end of + ++ num_moved; + // Shift by maximum 2mm. + double nudge_dist = std::min(std::max(0., collision_sphere.last_collision_depth + collision_extra_gap), max_nudge_collision_avoidance); + Vec2d nudge_vector = (to_2d(collision_sphere.position) - to_2d(collision_sphere.last_collision)).cast().normalized() * nudge_dist; + collision_sphere.position.head<2>() += (nudge_vector * nudge_dist).cast(); + } + // Laplacian smoothing + Vec2d avg{ 0, 0 }; + const SupportElements &above = move_bounds[collision_sphere.element.state.layer_idx + 1]; + const size_t offset_above = linear_data_layers[collision_sphere.element.state.layer_idx + 1]; + double weight = 0.; + for (auto iparent : collision_sphere.element.parents) { + double w = collision_sphere.radius; + avg += w * to_2d(collision_spheres[offset_above + iparent].prev_position.cast()); + weight += w; + } + if (collision_sphere.element_below_id != -1) { + const size_t offset_below = linear_data_layers[collision_sphere.element.state.layer_idx - 1]; + const double w = weight; // config.getRadius(move_bounds[element.state.layer_idx - 1][below].state); + avg += w * to_2d(collision_spheres[offset_below + collision_sphere.element_below_id].prev_position.cast()); + weight += w; + } + avg /= weight; + static constexpr const double smoothing_factor = 0.5; + Vec2d old_pos = to_2d(collision_sphere.position).cast(); + Vec2d new_pos = (1. - smoothing_factor) * old_pos + smoothing_factor * avg; + Vec2d shift = new_pos - old_pos; + double nudge_dist_max = shift.norm(); + // Shift by maximum 1mm, less than the collision avoidance factor. + double nudge_dist = std::min(std::max(0., nudge_dist_max), max_nudge_smoothing); + collision_sphere.position.head<2>() += (shift.normalized() * nudge_dist).cast(); + + throw_on_cancel(); + } + }); +#if 0 + std::vector stat; + for (CollisionSphere& collision_sphere : collision_spheres) + if (!collision_sphere.locked) + stat.emplace_back(collision_sphere.last_collision_depth); + std::sort(stat.begin(), stat.end()); + printf("iteration: %d, moved: %d, collision depth: min %lf, max %lf, median %lf\n", int(iter), int(num_moved), stat.front(), stat.back(), stat[stat.size() / 2]); +#endif + if (num_moved == 0) + break; + } + + for (size_t i = 0; i < collision_spheres.size(); ++ i) + elements_with_link_down[i].first->state.result_on_layer = scaled(to_2d(collision_spheres[i].position)); +} +#else // TREE_SUPPORT_ORGANIC_NUDGE_NEW +// Old version using OpenVDB, works but it is extremely slow for complex meshes. +static void organic_smooth_branches_avoid_collisions( + const PrintObject &print_object, + const TreeModelVolumes &volumes, + const TreeSupportSettings &config, + std::vector &move_bounds, + const std::vector> &elements_with_link_down, + const std::vector &linear_data_layers, + std::function throw_on_cancel) +{ + TriangleMesh mesh = print_object.model_object()->raw_mesh(); + mesh.transform(print_object.trafo_centered()); + double scale = 10.; + openvdb::FloatGrid::Ptr grid = mesh_to_grid(mesh.its, openvdb::math::Transform{}, scale, 0., 0.); + std::unique_ptr> closest_surface_point = openvdb::tools::ClosestSurfacePoint::create(*grid); + std::vector pts, prev, projections; + std::vector distances; + for (const std::pair& element : elements_with_link_down) { + Vec3d pt = to_3d(unscaled(element.first->state.result_on_layer), layer_z(print_object.slicing_parameters(), config, element.first->state.layer_idx)) * scale; + pts.push_back({ pt.x(), pt.y(), pt.z() }); + } + + const double collision_extra_gap = 1. * scale; + const double max_nudge_collision_avoidance = 2. * scale; + const double max_nudge_smoothing = 1. * scale; + + static constexpr const size_t num_iter = 100; // 1000; + for (size_t iter = 0; iter < num_iter; ++ iter) { + prev = pts; + projections = pts; + distances.assign(pts.size(), std::numeric_limits::max()); + closest_surface_point->searchAndReplace(projections, distances); + size_t num_moved = 0; + for (size_t i = 0; i < projections.size(); ++ i) { + const SupportElement &element = *elements_with_link_down[i].first; + const int below = elements_with_link_down[i].second; + const bool locked = (below == -1 && element.state.layer_idx > 0) || element.state.locked(); + if (! locked && pts[i] != projections[i]) { + // Nudge the circle center away from the collision. + Vec3d v{ projections[i].x() - pts[i].x(), projections[i].y() - pts[i].y(), projections[i].z() - pts[i].z() }; + double depth = v.norm(); + assert(std::abs(distances[i] - depth) < EPSILON); + double radius = unscaled(config.getRadius(element.state)) * scale; + if (depth < radius) { + // Collision detected to be removed. + ++ num_moved; + double dxy = sqrt(sqr(radius) - sqr(v.z())); + double nudge_dist_max = dxy - std::hypot(v.x(), v.y()) + //FIXME 1mm gap + + collision_extra_gap; + // Shift by maximum 2mm. + double nudge_dist = std::min(std::max(0., nudge_dist_max), max_nudge_collision_avoidance); + Vec2d nudge_v = to_2d(v).normalized() * (- nudge_dist); + pts[i].x() += nudge_v.x(); + pts[i].y() += nudge_v.y(); + } + } + // Laplacian smoothing + if (! locked && ! element.parents.empty()) { + Vec2d avg{ 0, 0 }; + const SupportElements &above = move_bounds[element.state.layer_idx + 1]; + const size_t offset_above = linear_data_layers[element.state.layer_idx + 1]; + double weight = 0.; + for (auto iparent : element.parents) { + double w = config.getRadius(above[iparent].state); + avg.x() += w * prev[offset_above + iparent].x(); + avg.y() += w * prev[offset_above + iparent].y(); + weight += w; + } + size_t cnt = element.parents.size(); + if (below != -1) { + const size_t offset_below = linear_data_layers[element.state.layer_idx - 1]; + const double w = weight; // config.getRadius(move_bounds[element.state.layer_idx - 1][below].state); + avg.x() += w * prev[offset_below + below].x(); + avg.y() += w * prev[offset_below + below].y(); + ++ cnt; + weight += w; + } + //avg /= double(cnt); + avg /= weight; + static constexpr const double smoothing_factor = 0.5; + Vec2d old_pos{ pts[i].x(), pts[i].y() }; + Vec2d new_pos = (1. - smoothing_factor) * old_pos + smoothing_factor * avg; + Vec2d shift = new_pos - old_pos; + double nudge_dist_max = shift.norm(); + // Shift by maximum 1mm, less than the collision avoidance factor. + double nudge_dist = std::min(std::max(0., nudge_dist_max), max_nudge_smoothing); + Vec2d nudge_v = shift.normalized() * nudge_dist; + pts[i].x() += nudge_v.x(); + pts[i].y() += nudge_v.y(); + } + } +// printf("iteration: %d, moved: %d\n", int(iter), int(num_moved)); + if (num_moved == 0) + break; + } + + for (size_t i = 0; i < projections.size(); ++ i) { + elements_with_link_down[i].first->state.result_on_layer.x() = scaled(pts[i].x()) / scale; + elements_with_link_down[i].first->state.result_on_layer.y() = scaled(pts[i].y()) / scale; + } +} +#endif // TREE_SUPPORT_ORGANIC_NUDGE_NEW + +// Organic specific: Smooth branches and produce one cummulative mesh to be sliced. +static indexed_triangle_set draw_branches( + PrintObject &print_object, + const TreeModelVolumes &volumes, + const TreeSupportSettings &config, + std::vector &move_bounds, + std::function throw_on_cancel) +{ + static int irun = 0; + + // All SupportElements are put into a layer independent storage to improve parallelization. + std::vector> elements_with_link_down; + std::vector linear_data_layers; + { + std::vector> map_downwards_old; + std::vector> map_downwards_new; + linear_data_layers.emplace_back(0); + for (LayerIndex layer_idx = 0; layer_idx < LayerIndex(move_bounds.size()); ++ layer_idx) { + SupportElements *layer_above = layer_idx + 1 < move_bounds.size() ? &move_bounds[layer_idx + 1] : nullptr; + map_downwards_new.clear(); + std::sort(map_downwards_old.begin(), map_downwards_old.end(), [](auto& l, auto& r) { return l.first < r.first; }); + SupportElements &layer = move_bounds[layer_idx]; + for (size_t elem_idx = 0; elem_idx < layer.size(); ++ elem_idx) { + SupportElement &elem = layer[elem_idx]; + int child = -1; + if (layer_idx > 0) { + auto it = std::lower_bound(map_downwards_old.begin(), map_downwards_old.end(), &elem, [](auto& l, const SupportElement* r) { return l.first < r; }); + if (it != map_downwards_old.end() && it->first == &elem) { + child = it->second; + // Only one link points to a node above from below. + assert(!(++it != map_downwards_old.end() && it->first == &elem)); + } +#ifndef NDEBUG + { + const SupportElement *pchild = child == -1 ? nullptr : &move_bounds[layer_idx - 1][child]; + assert(pchild ? pchild->state.result_on_layer_is_set() : elem.state.target_height > layer_idx); + } +#endif // NDEBUG + } + for (int32_t parent_idx : elem.parents) { + SupportElement &parent = (*layer_above)[parent_idx]; + if (parent.state.result_on_layer_is_set()) + map_downwards_new.emplace_back(&parent, elem_idx); + } + + elements_with_link_down.push_back({ &elem, int(child) }); + } + std::swap(map_downwards_old, map_downwards_new); + linear_data_layers.emplace_back(elements_with_link_down.size()); + } + } + + throw_on_cancel(); + + organic_smooth_branches_avoid_collisions(print_object, volumes, config, move_bounds, elements_with_link_down, linear_data_layers, throw_on_cancel); + + // Unmark all nodes. + for (SupportElements &elements : move_bounds) + for (SupportElement &element : elements) + element.state.marked = false; + + // Traverse all nodes, generate tubes. + // Traversal stack with nodes and thier current parent + const SlicingParameters &slicing_params = print_object.slicing_parameters(); + std::vector path; + indexed_triangle_set cummulative_mesh; + indexed_triangle_set partial_mesh; + indexed_triangle_set temp_mesh; + for (LayerIndex layer_idx = 0; layer_idx + 1 < LayerIndex(move_bounds.size()); ++ layer_idx) { + SupportElements &layer = move_bounds[layer_idx]; + SupportElements &layer_above = move_bounds[layer_idx + 1]; + + for (SupportElement &start_element : layer) + if (! start_element.state.marked && ! start_element.parents.empty()) { + // Collect elements up to a bifurcation above. + start_element.state.marked = true; + for (size_t parent_idx = 0; parent_idx < start_element.parents.size(); ++ parent_idx) { + path.clear(); + path.emplace_back(&start_element); + // Traverse each branch until it branches again. + SupportElement &first_parent = layer_above[start_element.parents[parent_idx]]; + assert(path.back()->state.layer_idx + 1 == first_parent.state.layer_idx); + path.emplace_back(&first_parent); + if (first_parent.parents.size() < 2) + first_parent.state.marked = true; + if (first_parent.parents.size() == 1) { + for (SupportElement *parent = &first_parent;;) { + SupportElement &next_parent = move_bounds[parent->state.layer_idx + 1][parent->parents.front()]; + assert(path.back()->state.layer_idx + 1 == next_parent.state.layer_idx); + path.emplace_back(&next_parent); + if (next_parent.parents.size() > 1) + break; + next_parent.state.marked = true; + if (next_parent.parents.size() == 0) + break; + parent = &next_parent; + } + } + // Triangulate the tube. + partial_mesh.clear(); + extrude_branch(path, config, slicing_params, move_bounds, partial_mesh); +#if 0 + { + char fname[2048]; + static int irun = 0; + sprintf(fname, "d:\\temp\\meshes\\tree-raw-%d.obj", ++ irun); + its_write_obj(partial_mesh, fname); + #if 0 + temp_mesh.clear(); + cut_mesh(partial_mesh, layer_z(slicing_params, path.back()->state.layer_idx) + EPSILON, nullptr, &temp_mesh, false); + sprintf(fname, "d:\\temp\\meshes\\tree-trimmed1-%d.obj", irun); + its_write_obj(temp_mesh, fname); + partial_mesh.clear(); + cut_mesh(temp_mesh, layer_z(slicing_params, path.front()->state.layer_idx) - EPSILON, &partial_mesh, nullptr, false); + sprintf(fname, "d:\\temp\\meshes\\tree-trimmed2-%d.obj", irun); + #endif + its_write_obj(partial_mesh, fname); + } +#endif + its_merge(cummulative_mesh, partial_mesh); + } + throw_on_cancel(); + } + } + return cummulative_mesh; +} + +// Organic specific: Slice the cummulative mesh produced by draw_branches(). +static void slice_branches( + PrintObject &print_object, + const TreeModelVolumes &volumes, + const TreeSupportSettings &config, + const std::vector &overhangs, + std::vector &move_bounds, + const indexed_triangle_set &cummulative_mesh, + + SupportGeneratorLayersPtr &bottom_contacts, + SupportGeneratorLayersPtr &top_contacts, + SupportGeneratorLayersPtr &intermediate_layers, + SupportGeneratorLayerStorage &layer_storage, + + std::function throw_on_cancel) +{ + const SlicingParameters &slicing_params = print_object.slicing_parameters(); + std::vector slice_z; + for (size_t layer_idx = 0; layer_idx < move_bounds.size(); ++ layer_idx) { + const double print_z = layer_z(print_object.slicing_parameters(), config, layer_idx); + const double bottom_z = layer_idx > 0 ? layer_z(print_object.slicing_parameters(), config, layer_idx - 1) : 0.; + slice_z.emplace_back(float(0.5 * (bottom_z + print_z))); + } + // Remove the trailing slices. + while (! slice_z.empty()) + if (move_bounds[slice_z.size() - 1].empty()) + slice_z.pop_back(); + else + break; + +#if 0 + its_write_obj(cummulative_mesh, "d:\\temp\\meshes\\tree.obj"); +#endif + + MeshSlicingParamsEx params; + params.closing_radius = float(print_object.config().slice_closing_radius.value); + params.mode = MeshSlicingParams::SlicingMode::Positive; + std::vector slices = slice_mesh_ex(cummulative_mesh, slice_z, params, throw_on_cancel); + // Trim the slices. + std::vector support_layer_storage(move_bounds.size()); + tbb::parallel_for(tbb::blocked_range(0, slices.size()), + [&](const tbb::blocked_range &range) { + for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++layer_idx) + if (ExPolygons &src = slices[layer_idx]; ! src.empty()) + support_layer_storage[layer_idx] = diff_clipped(to_polygons(std::move(src)), volumes.getCollision(0, layer_idx, true)); + }); + + std::vector support_roof_storage(move_bounds.size()); + finalize_interface_and_support_areas(print_object, volumes, config, overhangs, support_layer_storage, support_roof_storage, + bottom_contacts, top_contacts, intermediate_layers, layer_storage, throw_on_cancel); +} + +/*! + * \brief Create the areas that need support. + * + * These areas are stored inside the given SliceDataStorage object. + * \param storage The data storage where the mesh data is gotten from and + * where the resulting support areas are stored. + */ +static void generate_support_areas(Print &print, const BuildVolume &build_volume, const std::vector &print_object_ids, std::function throw_on_cancel) +{ + g_showed_critical_error = false; + g_showed_performance_warning = false; + + // Settings with the indexes of meshes that use these settings. + std::vector>> grouped_meshes = group_meshes(print, print_object_ids); + if (grouped_meshes.empty()) + return; + + size_t counter = 0; + + // Process every mesh group. These groups can not be processed parallel, as the processing in each group is parallelized, and nested parallelization is disables and slow. + for (std::pair> &processing : grouped_meshes) + { + // process each combination of meshes + // this struct is used to easy retrieve setting. No other function except those in TreeModelVolumes and generate_initial_areas() have knowledge of the existence of multiple meshes being processed. + //FIXME this is a copy + // Contains config settings to avoid loading them in every function. This was done to improve readability of the code. + const TreeSupportSettings &config = processing.first; + BOOST_LOG_TRIVIAL(info) << "Processing support tree mesh group " << counter + 1 << " of " << grouped_meshes.size() << " containing " << grouped_meshes[counter].second.size() << " meshes."; + auto t_start = std::chrono::high_resolution_clock::now(); +#if 0 + std::vector exclude(num_support_layers); + // get all already existing support areas and exclude them + tbb::parallel_for(tbb::blocked_range(0, num_support_layers), + [&](const tbb::blocked_range &range) { + for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) { + Polygons exlude_at_layer; + append(exlude_at_layer, storage.support.supportLayers[layer_idx].support_bottom); + append(exlude_at_layer, storage.support.supportLayers[layer_idx].support_roof); + for (auto part : storage.support.supportLayers[layer_idx].support_infill_parts) + append(exlude_at_layer, part.outline); + exclude[layer_idx] = union_(exlude_at_layer); + } + }); +#endif +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + m_progress_multiplier = 1.0 / double(grouped_meshes.size()); + m_progress_offset = counter == 0 ? 0 : TREE_PROGRESS_TOTAL * (double(counter) * m_progress_multiplier); +#endif // SLIC3R_TREESUPPORT_PROGRESS + PrintObject &print_object = *print.get_object(processing.second.front()); + // Generator for model collision, avoidance and internal guide volumes. + TreeModelVolumes volumes{ print_object, build_volume, config.maximum_move_distance, config.maximum_move_distance_slow, processing.second.front(), +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + m_progress_multiplier, m_progress_offset, +#endif // SLIC3R_TREESUPPORTS_PROGRESS + /* additional_excluded_areas */{} }; + + //FIXME generating overhangs just for the furst mesh of the group. + assert(processing.second.size() == 1); + std::vector overhangs = generate_overhangs(config, *print.get_object(processing.second.front()), throw_on_cancel); + + // ### Precalculate avoidances, collision etc. + + SupportGeneratorLayerStorage layer_storage; + SupportGeneratorLayersPtr top_contacts; + SupportGeneratorLayersPtr bottom_contacts; + SupportGeneratorLayersPtr top_interface_layers; + SupportGeneratorLayersPtr intermediate_layers; + + if (size_t num_support_layers = precalculate(print, overhangs, processing.first, processing.second, volumes, throw_on_cancel); + num_support_layers > 0) { + + auto t_precalc = std::chrono::high_resolution_clock::now(); + + // value is the area where support may be placed. As this is calculated in CreateLayerPathing it is saved and reused in draw_areas + std::vector move_bounds(num_support_layers); + + // ### Place tips of the support tree + top_contacts .assign(num_support_layers, nullptr); + bottom_contacts .assign(num_support_layers, nullptr); + top_interface_layers.assign(num_support_layers, nullptr); + intermediate_layers .assign(num_support_layers, nullptr); + + for (size_t mesh_idx : processing.second) + generate_initial_areas(*print.get_object(mesh_idx), volumes, config, overhangs, move_bounds, top_contacts, top_interface_layers, layer_storage, throw_on_cancel); + auto t_gen = std::chrono::high_resolution_clock::now(); + + #ifdef TREESUPPORT_DEBUG_SVG + for (size_t layer_idx = 0; layer_idx < move_bounds.size(); ++layer_idx) { + Polygons polys; + for (auto& area : move_bounds[layer_idx]) + append(polys, area.influence_area); + if (auto begin = move_bounds[layer_idx].begin(); begin != move_bounds[layer_idx].end()) + SVG::export_expolygons(debug_out_path("treesupport-initial_areas-%d.svg", layer_idx), + { { { union_ex(volumes.getWallRestriction(config.getCollisionRadius(begin->state), layer_idx, begin->state.use_min_xy_dist)) }, + { "wall_restricrictions", "gray", 0.5f } }, + { { union_ex(polys) }, { "parent", "red", "black", "", scaled(0.1f), 0.5f } } }); + } + #endif // TREESUPPORT_DEBUG_SVG + + // ### Propagate the influence areas downwards. This is an inherently serial operation. + create_layer_pathing(volumes, config, move_bounds, throw_on_cancel); + auto t_path = std::chrono::high_resolution_clock::now(); + + // ### Set a point in each influence area + create_nodes_from_area(volumes, config, move_bounds, throw_on_cancel); + auto t_place = std::chrono::high_resolution_clock::now(); + + // ### draw these points as circles + + if (print_object.config().support_material_style == smsTree) + draw_areas(*print.get_object(processing.second.front()), volumes, config, overhangs, move_bounds, + bottom_contacts, top_contacts, intermediate_layers, layer_storage, throw_on_cancel); + else { + assert(print_object.config().support_material_style == smsOrganic); + indexed_triangle_set branches = draw_branches(*print.get_object(processing.second.front()), volumes, config, move_bounds, throw_on_cancel); + // Reduce memory footprint. After this point only slice_branches() will use volumes and from that only collisions with zero radius will be used. + volumes.clear_all_but_object_collision(); + slice_branches(*print.get_object(processing.second.front()), volumes, config, overhangs, move_bounds, branches, + bottom_contacts, top_contacts, intermediate_layers, layer_storage, throw_on_cancel); + } + + auto t_draw = std::chrono::high_resolution_clock::now(); + auto dur_pre_gen = 0.001 * std::chrono::duration_cast(t_precalc - t_start).count(); + auto dur_gen = 0.001 * std::chrono::duration_cast(t_gen - t_precalc).count(); + auto dur_path = 0.001 * std::chrono::duration_cast(t_path - t_gen).count(); + auto dur_place = 0.001 * std::chrono::duration_cast(t_place - t_path).count(); + auto dur_draw = 0.001 * std::chrono::duration_cast(t_draw - t_place).count(); + auto dur_total = 0.001 * std::chrono::duration_cast(t_draw - t_start).count(); + BOOST_LOG_TRIVIAL(info) << + "Total time used creating Tree support for the currently grouped meshes: " << dur_total << " ms. " + "Different subtasks:\nCalculating Avoidance: " << dur_pre_gen << " ms " + "Creating inital influence areas: " << dur_gen << " ms " + "Influence area creation: " << dur_path << "ms " + "Placement of Points in InfluenceAreas: " << dur_place << "ms " + "Drawing result as support " << dur_draw << " ms"; + // if (config.branch_radius==2121) + // BOOST_LOG_TRIVIAL(error) << "Why ask questions when you already know the answer twice.\n (This is not a real bug, please dont report it.)"; + + move_bounds.clear(); + } else { + top_contacts.assign(config.raft_layers.size(), nullptr); + if (generate_raft_contact(print_object, config, top_contacts, layer_storage) < 0) + // No raft. + continue; + } + + auto remove_undefined_layers = [](SupportGeneratorLayersPtr &layers) { + layers.erase(std::remove_if(layers.begin(), layers.end(), [](const SupportGeneratorLayer* ptr) { return ptr == nullptr; }), layers.end()); + }; + remove_undefined_layers(bottom_contacts); + remove_undefined_layers(top_contacts); + remove_undefined_layers(intermediate_layers); + + // Produce the support G-code. + // Used by both classic and tree supports. + SupportParameters support_params(print_object); + SupportGeneratorLayersPtr interface_layers, base_interface_layers; + SupportGeneratorLayersPtr raft_layers = generate_raft_base(print_object, support_params, print_object.slicing_parameters(), top_contacts, interface_layers, base_interface_layers, intermediate_layers, layer_storage); +#if 1 //#ifdef SLIC3R_DEBUG + SupportGeneratorLayersPtr layers_sorted = +#endif // SLIC3R_DEBUG + generate_support_layers(print_object, raft_layers, bottom_contacts, top_contacts, intermediate_layers, interface_layers, base_interface_layers); + // Don't fill in the tree supports, make them hollow with just a single sheath line. + generate_support_toolpaths(print_object.support_layers(), print_object.config(), support_params, print_object.slicing_parameters(), + raft_layers, bottom_contacts, top_contacts, intermediate_layers, interface_layers, base_interface_layers); + + #if 0 +//#ifdef SLIC3R_DEBUG + { + static int iRun = 0; + ++ iRun; + size_t layer_id = 0; + for (int i = 0; i < int(layers_sorted.size());) { + // Find the last layer with roughly the same print_z, find the minimum layer height of all. + // Due to the floating point inaccuracies, the print_z may not be the same even if in theory they should. + int j = i + 1; + coordf_t zmax = layers_sorted[i]->print_z + EPSILON; + bool empty = layers_sorted[i]->polygons.empty(); + for (; j < layers_sorted.size() && layers_sorted[j]->print_z <= zmax; ++j) + if (!layers_sorted[j]->polygons.empty()) + empty = false; + if (!empty) { + export_print_z_polygons_to_svg( + debug_out_path("support-%d-%lf.svg", iRun, layers_sorted[i]->print_z).c_str(), + layers_sorted.data() + i, j - i); + export_print_z_polygons_and_extrusions_to_svg( + debug_out_path("support-w-fills-%d-%lf.svg", iRun, layers_sorted[i]->print_z).c_str(), + layers_sorted.data() + i, j - i, + *print_object.support_layers()[layer_id]); + ++layer_id; + } + i = j; + } + } +#endif /* SLIC3R_DEBUG */ + + ++ counter; + } + +// storage.support.generated = true; +} + +} // namespace FFFTreeSupport + +void fff_tree_support_generate(PrintObject &print_object, std::function throw_on_cancel) +{ + size_t idx = 0; + for (const PrintObject *po : print_object.print()->objects()) { + if (po == &print_object) + break; + ++idx; + } + FFFTreeSupport::generate_support_areas(*print_object.print(), + BuildVolume(Pointfs{ Vec2d{ -300., -300. }, Vec2d{ -300., +300. }, Vec2d{ +300., +300. }, Vec2d{ +300., -300. } }, 0.), { idx }, + throw_on_cancel); +} + +} // namespace Slic3r diff --git a/src/libslic3r/TreeSupport.hpp b/src/libslic3r/TreeSupport.hpp new file mode 100644 index 00000000000..f4ec76cda76 --- /dev/null +++ b/src/libslic3r/TreeSupport.hpp @@ -0,0 +1,538 @@ +// Tree supports by Thomas Rahm, losely based on Tree Supports by CuraEngine. +// Original source of Thomas Rahm's tree supports: +// https://github.com/ThomasRahm/CuraEngine +// +// Original CuraEngine copyright: +// Copyright (c) 2021 Ultimaker B.V. +// CuraEngine is released under the terms of the AGPLv3 or higher. + +#ifndef slic3r_TreeSupport_hpp +#define slic3r_TreeSupport_hpp + +#include "TreeModelVolumes.hpp" +#include "Point.hpp" + +#include + +#include "BoundingBox.hpp" +#include "Utils.hpp" + +// #define TREE_SUPPORT_SHOW_ERRORS + +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + // The various stages of the process can be weighted differently in the progress bar. + // These weights are obtained experimentally using a small sample size. Sensible weights can differ drastically based on the assumed default settings and model. + #define TREE_PROGRESS_TOTAL 10000 + #define TREE_PROGRESS_PRECALC_COLL TREE_PROGRESS_TOTAL * 0.1 + #define TREE_PROGRESS_PRECALC_AVO TREE_PROGRESS_TOTAL * 0.4 + #define TREE_PROGRESS_GENERATE_NODES TREE_PROGRESS_TOTAL * 0.1 + #define TREE_PROGRESS_AREA_CALC TREE_PROGRESS_TOTAL * 0.3 + #define TREE_PROGRESS_DRAW_AREAS TREE_PROGRESS_TOTAL * 0.1 + #define TREE_PROGRESS_GENERATE_BRANCH_AREAS TREE_PROGRESS_DRAW_AREAS / 3 + #define TREE_PROGRESS_SMOOTH_BRANCH_AREAS TREE_PROGRESS_DRAW_AREAS / 3 + #define TREE_PROGRESS_FINALIZE_BRANCH_AREAS TREE_PROGRESS_DRAW_AREAS / 3 +#endif // SLIC3R_TREESUPPORTS_PROGRESS + +namespace Slic3r +{ + +// Forward declarations +class Print; +class PrintObject; +class SupportGeneratorLayer; +struct SlicingParameters; +using SupportGeneratorLayerStorage = std::deque; +using SupportGeneratorLayersPtr = std::vector; + +namespace FFFTreeSupport +{ + +using LayerIndex = int; + +static constexpr const double SUPPORT_TREE_EXPONENTIAL_FACTOR = 1.5; +static constexpr const coord_t SUPPORT_TREE_EXPONENTIAL_THRESHOLD = scaled(1. * SUPPORT_TREE_EXPONENTIAL_FACTOR); +static constexpr const coord_t SUPPORT_TREE_COLLISION_RESOLUTION = scaled(0.5); + +// The number of vertices in each circle. +static constexpr const size_t SUPPORT_TREE_CIRCLE_RESOLUTION = 25; +static constexpr const bool SUPPORT_TREE_AVOID_SUPPORT_BLOCKER = true; + +enum class InterfacePreference +{ + InterfaceAreaOverwritesSupport, + SupportAreaOverwritesInterface, + InterfaceLinesOverwriteSupport, + SupportLinesOverwriteInterface, + Nothing +}; + +struct AreaIncreaseSettings +{ + AreaIncreaseSettings( + TreeModelVolumes::AvoidanceType type = TreeModelVolumes::AvoidanceType::Fast, coord_t increase_speed = 0, + bool increase_radius = false, bool no_error = false, bool use_min_distance = false, bool move = false) : + increase_speed{ increase_speed }, type{ type }, increase_radius{ increase_radius }, no_error{ no_error }, use_min_distance{ use_min_distance }, move{ move } {} + + coord_t increase_speed; + // Packing for smaller memory footprint of SupportElementState && SupportElementMerging + TreeModelVolumes::AvoidanceType type; + bool increase_radius : 1; + bool no_error : 1; + bool use_min_distance : 1; + bool move : 1; + bool operator==(const AreaIncreaseSettings& other) const + { + return type == other.type && + increase_speed == other.increase_speed && + increase_radius == other.increase_radius && + no_error == other.no_error && + use_min_distance == other.use_min_distance && + move == other.move; + } +}; + +struct TreeSupportSettings; + +// C++17 does not support in place initializers of bit values, thus a constructor zeroing the bits is provided. +struct SupportElementStateBits { + SupportElementStateBits() : + to_buildplate(false), + to_model_gracious(false), + use_min_xy_dist(false), + supports_roof(false), + can_use_safe_radius(false), + skip_ovalisation(false), + deleted(false), + marked(false) + {} + + /*! + * \brief The element trys to reach the buildplate + */ + bool to_buildplate : 1; + + /*! + * \brief Will the branch be able to rest completely on a flat surface, be it buildplate or model ? + */ + bool to_model_gracious : 1; + + /*! + * \brief Whether the min_xy_distance can be used to get avoidance or similar. Will only be true if support_xy_overrides_z=Z overrides X/Y. + */ + bool use_min_xy_dist : 1; + + /*! + * \brief True if this Element or any parent (element above) provides support to a support roof. + */ + bool supports_roof : 1; + + /*! + * \brief An influence area is considered safe when it can use the holefree avoidance <=> It will not have to encounter holes on its way downward. + */ + bool can_use_safe_radius : 1; + + /*! + * \brief Skip the ovalisation to parent and children when generating the final circles. + */ + bool skip_ovalisation : 1; + + // Not valid anymore, to be deleted. + bool deleted : 1; + + // General purpose flag marking a visited element. + bool marked : 1; +}; + +struct SupportElementState : public SupportElementStateBits +{ + /*! + * \brief The layer this support elements wants reach + */ + LayerIndex target_height; + + /*! + * \brief The position this support elements wants to support on layer=target_height + */ + Point target_position; + + /*! + * \brief The next position this support elements wants to reach. NOTE: This is mainly a suggestion regarding direction inside the influence area. + */ + Point next_position; + + /*! + * \brief The next height this support elements wants to reach + */ + LayerIndex layer_idx; + + /*! + * \brief The Effective distance to top of this element regarding radius increases and collision calculations. + */ + uint32_t effective_radius_height; + + /*! + * \brief The amount of layers this element is below the topmost layer of this branch. + */ + uint32_t distance_to_top; + + /*! + * \brief The resulting center point around which a circle will be drawn later. + * Will be set by setPointsOnAreas + */ + Point result_on_layer { std::numeric_limits::max(), std::numeric_limits::max() }; + bool result_on_layer_is_set() const { return this->result_on_layer != Point{ std::numeric_limits::max(), std::numeric_limits::max() }; } + void result_on_layer_reset() { this->result_on_layer = Point{ std::numeric_limits::max(), std::numeric_limits::max() }; } + /*! + * \brief The amount of extra radius we got from merging branches that could have reached the buildplate, but merged with ones that can not. + */ + coord_t increased_to_model_radius; // how much to model we increased only relevant for merging + + /*! + * \brief Counter about the times the elephant foot was increased. Can be fractions for merge reasons. + */ + double elephant_foot_increases; + + /*! + * \brief The element tries to not move until this dtt is reached, is set to 0 if the element had to move. + */ + uint32_t dont_move_until; + + /*! + * \brief Settings used to increase the influence area to its current state. + */ + AreaIncreaseSettings last_area_increase; + + /*! + * \brief Amount of roof layers that were not yet added, because the branch needed to move. + */ + uint32_t missing_roof_layers; + + // called by increase_single_area() and increaseAreas() + [[nodiscard]] static SupportElementState propagate_down(const SupportElementState &src) + { + SupportElementState dst{ src }; + ++ dst.distance_to_top; + -- dst.layer_idx; + // set to invalid as we are a new node on a new layer + dst.result_on_layer_reset(); + dst.skip_ovalisation = false; + return dst; + } + + [[nodiscard]] bool locked() const { return this->distance_to_top < this->dont_move_until; } +}; + +struct SupportElement +{ + using ParentIndices = +#ifdef NDEBUG + // To reduce memory allocation in release mode. + boost::container::small_vector; +#else // NDEBUG + // To ease debugging. + std::vector; +#endif // NDEBUG + +// SupportElement(const SupportElementState &state) : SupportElementState(state) {} + SupportElement(const SupportElementState &state, Polygons &&influence_area) : state(state), influence_area(std::move(influence_area)) {} + SupportElement(const SupportElementState &state, ParentIndices &&parents, Polygons &&influence_area) : + state(state), parents(std::move(parents)), influence_area(std::move(influence_area)) {} + + SupportElementState state; + + /*! + * \brief All elements in the layer above the current one that are supported by this element + */ + ParentIndices parents; + + /*! + * \brief The resulting influence area. + * Will only be set in the results of createLayerPathing, and will be nullptr inside! + */ + Polygons influence_area; +}; + +/*! + * \brief This struct contains settings used in the tree support. Thanks to this most functions do not need to know of meshes etc. Also makes the code shorter. + */ +struct TreeSupportSettings +{ + TreeSupportSettings() = default; // required for the definition of the config variable in the TreeSupportGenerator class. + explicit TreeSupportSettings(const TreeSupportMeshGroupSettings &mesh_group_settings, const SlicingParameters &slicing_params); + +private: + double angle; + double angle_slow; + std::vector known_z; + +public: + // some static variables dependent on other meshes that are not currently processed. + // Has to be static because TreeSupportConfig will be used in TreeModelVolumes as this reduces redundancy. + inline static bool soluble = false; + /*! + * \brief Width of a single line of support. + */ + coord_t support_line_width; + /*! + * \brief Height of a single layer + */ + coord_t layer_height; + /*! + * \brief Radius of a branch when it has left the tip. + */ + coord_t branch_radius; + /*! + * \brief smallest allowed radius, required to ensure that even at DTT 0 every circle will still be printed + */ + coord_t min_radius; + /*! + * \brief How far an influence area may move outward every layer at most. + */ + coord_t maximum_move_distance; + /*! + * \brief How far every influence area will move outward every layer if possible. + */ + coord_t maximum_move_distance_slow; + /*! + * \brief Amount of bottom layers. 0 if disabled. + */ + size_t support_bottom_layers; + /*! + * \brief Amount of effectiveDTT increases are required to reach branch radius. + */ + size_t tip_layers; + /*! + * \brief Factor by which to increase the branch radius. + */ + double diameter_angle_scale_factor; + /*! + * \brief How much a branch resting on the model may grow in radius by merging with branches that can reach the buildplate. + */ + coord_t max_to_model_radius_increase; + /*! + * \brief If smaller (in layers) than that, all branches to model will be deleted + */ + size_t min_dtt_to_model; + /*! + * \brief Increase radius in the resulting drawn branches, even if the avoidance does not allow it. Will be cut later to still fit. + */ + coord_t increase_radius_until_radius; + /*! + * \brief Same as increase_radius_until_radius, but contains the DTT at which the radius will be reached. + */ + size_t increase_radius_until_layer; + /*! + * \brief True if the branches may connect to the model. + */ + bool support_rests_on_model; + /*! + * \brief How far should support be from the model. + */ + coord_t xy_distance; + /*! + * \brief Radius a branch should have when reaching the buildplate. + */ + coord_t bp_radius; + /*! + * \brief The layer index at which an increase in radius may be required to reach the bp_radius. + */ + coord_t layer_start_bp_radius; + /*! + * \brief Factor by which to increase the branch radius to reach the required bp_radius at layer 0. Note that this radius increase will not happen in the tip, to ensure the tip is structurally sound. + */ + double diameter_scale_bp_radius; + /*! + * \brief minimum xy_distance. Only relevant when Z overrides XY, otherwise equal to xy_distance- + */ + coord_t xy_min_distance; + /*! + * \brief Amount of layers distance required the top of the support to the model + */ + size_t z_distance_top_layers; + /*! + * \brief Amount of layers distance required from the top of the model to the bottom of a support structure. + */ + size_t z_distance_bottom_layers; + /*! + * \brief used for performance optimization at the support floor. Should have no impact on the resulting tree. + */ + size_t performance_interface_skip_layers; + /*! + * \brief User specified angles for the support infill. + */ +// std::vector support_infill_angles; + /*! + * \brief User specified angles for the support roof infill. + */ + std::vector support_roof_angles; + /*! + * \brief Pattern used in the support roof. May contain non relevant data if support roof is disabled. + */ + SupportMaterialInterfacePattern roof_pattern; + /*! + * \brief Pattern used in the support infill. + */ + SupportMaterialPattern support_pattern; + /*! + * \brief Line width of the support roof. + */ + coord_t support_roof_line_width; + /*! + * \brief Distance between support infill lines. + */ + coord_t support_line_spacing; + /*! + * \brief Offset applied to the support floor area. + */ + coord_t support_bottom_offset; + /* + * \brief Amount of walls the support area will have. + */ + int support_wall_count; + /* + * \brief Maximum allowed deviation when simplifying. + */ + coord_t resolution; + /* + * \brief Distance between the lines of the roof. + */ + coord_t support_roof_line_distance; + /* + * \brief How overlaps of an interface area with a support area should be handled. + */ + InterfacePreference interface_preference; + + /* + * \brief The infill class wants a settings object. This one will be the correct one for all settings it uses. + */ + TreeSupportMeshGroupSettings settings; + + /* + * \brief Minimum thickness of any model features. + */ + coord_t min_feature_size; + + // Extra raft layers below the object. + std::vector raft_layers; + + public: + bool operator==(const TreeSupportSettings& other) const + { + return branch_radius == other.branch_radius && tip_layers == other.tip_layers && diameter_angle_scale_factor == other.diameter_angle_scale_factor && layer_start_bp_radius == other.layer_start_bp_radius && bp_radius == other.bp_radius && diameter_scale_bp_radius == other.diameter_scale_bp_radius && min_radius == other.min_radius && xy_min_distance == other.xy_min_distance && // as a recalculation of the collision areas is required to set a new min_radius. + xy_distance - xy_min_distance == other.xy_distance - other.xy_min_distance && // if the delta of xy_min_distance and xy_distance is different the collision areas have to be recalculated. + support_rests_on_model == other.support_rests_on_model && increase_radius_until_layer == other.increase_radius_until_layer && min_dtt_to_model == other.min_dtt_to_model && max_to_model_radius_increase == other.max_to_model_radius_increase && maximum_move_distance == other.maximum_move_distance && maximum_move_distance_slow == other.maximum_move_distance_slow && z_distance_bottom_layers == other.z_distance_bottom_layers && support_line_width == other.support_line_width && + support_line_spacing == other.support_line_spacing && support_roof_line_width == other.support_roof_line_width && // can not be set on a per-mesh basis currently, so code to enable processing different roof line width in the same iteration seems useless. + support_bottom_offset == other.support_bottom_offset && support_wall_count == other.support_wall_count && support_pattern == other.support_pattern && roof_pattern == other.roof_pattern && // can not be set on a per-mesh basis currently, so code to enable processing different roof patterns in the same iteration seems useless. + support_roof_angles == other.support_roof_angles && + //support_infill_angles == other.support_infill_angles && + increase_radius_until_radius == other.increase_radius_until_radius && support_bottom_layers == other.support_bottom_layers && layer_height == other.layer_height && z_distance_top_layers == other.z_distance_top_layers && resolution == other.resolution && // Infill generation depends on deviation and resolution. + support_roof_line_distance == other.support_roof_line_distance && interface_preference == other.interface_preference + && min_feature_size == other.min_feature_size // interface_preference should be identical to ensure the tree will correctly interact with the roof. + // The infill class now wants the settings object and reads a lot of settings, and as the infill class is used to calculate support roof lines for interface-preference. Not all of these may be required to be identical, but as I am not sure, better safe than sorry +#if 0 + && (interface_preference == InterfacePreference::InterfaceAreaOverwritesSupport || interface_preference == InterfacePreference::SupportAreaOverwritesInterface + // Perimeter generator parameters + || + (settings.get("fill_outline_gaps") == other.settings.get("fill_outline_gaps") && + settings.get("min_bead_width") == other.settings.get("min_bead_width") && + settings.get("wall_transition_angle") == other.settings.get("wall_transition_angle") && + settings.get("wall_transition_length") == other.settings.get("wall_transition_length") && + settings.get("wall_split_middle_threshold") == other.settings.get("wall_split_middle_threshold") && + settings.get("wall_add_middle_threshold") == other.settings.get("wall_add_middle_threshold") && + settings.get("wall_distribution_count") == other.settings.get("wall_distribution_count") && + settings.get("wall_transition_filter_distance") == other.settings.get("wall_transition_filter_distance") && + settings.get("wall_transition_filter_deviation") == other.settings.get("wall_transition_filter_deviation") && + settings.get("wall_line_width_x") == other.settings.get("wall_line_width_x") && + settings.get("meshfix_maximum_extrusion_area_deviation") == other.settings.get("meshfix_maximum_extrusion_area_deviation")) + ) +#endif + && raft_layers == other.raft_layers + ; + } + + /*! + * \brief Get the Distance to top regarding the real radius this part will have. This is different from distance_to_top, which is can be used to calculate the top most layer of the branch. + * \param elem[in] The SupportElement one wants to know the effectiveDTT + * \return The Effective DTT. + */ + [[nodiscard]] inline size_t getEffectiveDTT(const SupportElementState &elem) const + { + return elem.effective_radius_height < increase_radius_until_layer ? (elem.distance_to_top < increase_radius_until_layer ? elem.distance_to_top : increase_radius_until_layer) : elem.effective_radius_height; + } + + /*! + * \brief Get the Radius part will have based on numeric values. + * \param distance_to_top[in] The effective distance_to_top of the element + * \param elephant_foot_increases[in] The elephant_foot_increases of the element. + * \return The radius an element with these attributes would have. + */ + [[nodiscard]] inline coord_t getRadius(size_t distance_to_top, const double elephant_foot_increases = 0) const + { + return (distance_to_top <= tip_layers ? min_radius + (branch_radius - min_radius) * distance_to_top / tip_layers : // tip + branch_radius + // base + branch_radius * (distance_to_top - tip_layers) * diameter_angle_scale_factor) + + // gradual increase + branch_radius * elephant_foot_increases * (std::max(diameter_scale_bp_radius - diameter_angle_scale_factor, 0.0)); + } + + /*! + * \brief Get the Radius, that this element will have. + * \param elem[in] The Element. + * \return The radius the element has. + */ + [[nodiscard]] inline coord_t getRadius(const SupportElementState &elem) const + { return getRadius(getEffectiveDTT(elem), elem.elephant_foot_increases); } + [[nodiscard]] inline coord_t getRadius(const SupportElement &elem) const + { return this->getRadius(elem.state); } + + /*! + * \brief Get the collision Radius of this Element. This can be smaller then the actual radius, as the drawAreas will cut off areas that may collide with the model. + * \param elem[in] The Element. + * \return The collision radius the element has. + */ + [[nodiscard]] inline coord_t getCollisionRadius(const SupportElementState &elem) const + { + return getRadius(elem.effective_radius_height, elem.elephant_foot_increases); + } + + /*! + * \brief Get the Radius an element should at least have at a given layer. + * \param layer_idx[in] The layer. + * \return The radius every element should aim to achieve. + */ + [[nodiscard]] inline coord_t recommendedMinRadius(LayerIndex layer_idx) const + { + double scale = (layer_start_bp_radius - int(layer_idx)) * diameter_scale_bp_radius; + return scale > 0 ? branch_radius + branch_radius * scale : 0; + } + + /*! + * \brief Return on which z in microns the layer will be printed. Used only for support infill line generation. + * \param layer_idx[in] The layer. + * \return The radius every element should aim to achieve. + */ + [[nodiscard]] inline coord_t getActualZ(LayerIndex layer_idx) + { + return layer_idx < coord_t(known_z.size()) ? known_z[layer_idx] : (layer_idx - known_z.size()) * layer_height + known_z.size() ? known_z.back() : 0; + } + + /*! + * \brief Set the z every Layer is printed at. Required for getActualZ to work + * \param z[in] The z every LayerIndex is printed. Vector is used as a map with the index of each element being the corresponding LayerIndex + * \return The radius every element should aim to achieve. + */ + void setActualZ(std::vector& z) + { + known_z = z; + } +}; + +void tree_supports_show_error(std::string_view message, bool critical); + +} // namespace FFFTreeSupport + +void fff_tree_support_generate(PrintObject &print_object, std::function throw_on_cancel = []{}); + +} // namespace Slic3r + +#endif /* slic3r_TreeSupport_hpp */ diff --git a/src/libslic3r/TriangleMesh.cpp b/src/libslic3r/TriangleMesh.cpp index 807ebcc9acf..d35251d205d 100644 --- a/src/libslic3r/TriangleMesh.cpp +++ b/src/libslic3r/TriangleMesh.cpp @@ -284,7 +284,7 @@ void TriangleMesh::rotate(float angle, const Axis &axis) case Z: its_rotate_z(this->its, angle); break; default: assert(false); return; } - update_bounding_box(this->its, this->m_stats); + update_bounding_box(this->its, m_stats); } } @@ -295,7 +295,7 @@ void TriangleMesh::rotate(float angle, const Vec3d& axis) Transform3d m = Transform3d::Identity(); m.rotate(Eigen::AngleAxisd(angle, axis_norm)); its_transform(its, m); - update_bounding_box(this->its, this->m_stats); + update_bounding_box(this->its, m_stats); } } @@ -334,7 +334,7 @@ void TriangleMesh::transform(const Transform3d& t, bool fix_left_handed) det = -det; } m_stats.volume *= det; - update_bounding_box(this->its, this->m_stats); + update_bounding_box(this->its, m_stats); } void TriangleMesh::transform(const Matrix3d& m, bool fix_left_handed) @@ -346,7 +346,7 @@ void TriangleMesh::transform(const Matrix3d& m, bool fix_left_handed) det = -det; } m_stats.volume *= det; - update_bounding_box(this->its, this->m_stats); + update_bounding_box(this->its, m_stats); } void TriangleMesh::flip_triangles() @@ -378,6 +378,14 @@ bool TriangleMesh::is_splittable() const return its_is_splittable(this->its); } +bool TriangleMesh::has_zero_volume() const +{ + const Vec3d sz = size(); + const double volume_val = sz.x() * sz.y() * sz.z(); + + return is_approx(volume_val, 0.0); +} + std::vector TriangleMesh::split() const { std::vector itss = its_split(this->its); @@ -504,7 +512,7 @@ std::vector TriangleMesh::slice(const std::vector &z) const size_t TriangleMesh::memsize() const { - size_t memsize = 8 + this->its.memsize() + sizeof(this->m_stats); + size_t memsize = 8 + this->its.memsize() + sizeof(m_stats); return memsize; } @@ -614,7 +622,7 @@ std::vector its_face_edge_ids(const indexed_triangle_set &its, std::funct return its_face_edge_ids_impl(its, [](const uint32_t){ return true; }, throw_on_cancel_callback); } -std::vector its_face_edge_ids(const indexed_triangle_set &its, const std::vector &face_mask) +std::vector its_face_edge_ids(const indexed_triangle_set &its, const std::vector &face_mask) { return its_face_edge_ids_impl(its, [&face_mask](const uint32_t idx){ return face_mask[idx]; }, [](){}); } @@ -730,6 +738,13 @@ void its_flip_triangles(indexed_triangle_set &its) std::swap(face(1), face(2)); } +int its_num_degenerate_faces(const indexed_triangle_set &its) +{ + return std::count_if(its.indices.begin(), its.indices.end(), [](auto &face) { + return face(0) == face(1) || face(0) == face(2) || face(1) == face(2); + }); +} + int its_remove_degenerate_faces(indexed_triangle_set &its, bool shrink_to_fit) { auto it = std::remove_if(its.indices.begin(), its.indices.end(), [](auto &face) { @@ -775,9 +790,9 @@ int its_compactify_vertices(indexed_triangle_set &its, bool shrink_to_fit) return removed; } -bool its_store_triangle(const indexed_triangle_set &its, - const char * obj_filename, - size_t triangle_index) +bool its_store_triangle_to_obj(const indexed_triangle_set &its, + const char *obj_filename, + size_t triangle_index) { if (its.indices.size() <= triangle_index) return false; Vec3i t = its.indices[triangle_index]; @@ -788,9 +803,9 @@ bool its_store_triangle(const indexed_triangle_set &its, return its_write_obj(its2, obj_filename); } -bool its_store_triangles(const indexed_triangle_set &its, - const char * obj_filename, - const std::vector & triangles) +bool its_store_triangles_to_obj(const indexed_triangle_set &its, + const char *obj_filename, + const std::vector &triangles) { indexed_triangle_set its2; its2.vertices.reserve(triangles.size() * 3); @@ -950,6 +965,51 @@ indexed_triangle_set its_make_cylinder(double r, double h, double fa) return mesh; } +indexed_triangle_set its_make_frustum(double r, double h, double fa) +{ + indexed_triangle_set mesh; + size_t n_steps = (size_t)ceil(2. * PI / fa); + double angle_step = 2. * PI / n_steps; + + auto &vertices = mesh.vertices; + auto &facets = mesh.indices; + vertices.reserve(2 * n_steps + 2); + facets.reserve(4 * n_steps); + + // 2 special vertices, top and bottom center, rest are relative to this + vertices.emplace_back(Vec3f(0.f, 0.f, 0.f)); + vertices.emplace_back(Vec3f(0.f, 0.f, float(h))); + + // for each line along the polygon approximating the top/bottom of the + // circle, generate four points and four facets (2 for the wall, 2 for the + // top and bottom. + // Special case: Last line shares 2 vertices with the first line. + Vec2f vec_top = Eigen::Rotation2Df(0.f) * Eigen::Vector2f(0, 0.5f*r); + Vec2f vec_botton = Eigen::Rotation2Df(0.f) * Eigen::Vector2f(0, r); + + vertices.emplace_back(Vec3f(vec_botton(0), vec_botton(1), 0.f)); + vertices.emplace_back(Vec3f(vec_top(0), vec_top(1), float(h))); + for (size_t i = 1; i < n_steps; ++i) { + vec_top = Eigen::Rotation2Df(angle_step * i) * Eigen::Vector2f(0, 0.5f*float(r)); + vec_botton = Eigen::Rotation2Df(angle_step * i) * Eigen::Vector2f(0, float(r)); + vertices.emplace_back(Vec3f(vec_botton(0), vec_botton(1), 0.f)); + vertices.emplace_back(Vec3f(vec_top(0), vec_top(1), float(h))); + int id = (int)vertices.size() - 1; + facets.emplace_back( 0, id - 1, id - 3); // top + facets.emplace_back(id, 1, id - 2); // bottom + facets.emplace_back(id, id - 2, id - 3); // upper-right of side + facets.emplace_back(id, id - 3, id - 1); // bottom-left of side + } + // Connect the last set of vertices with the first. + int id = (int)vertices.size() - 1; + facets.emplace_back( 0, 2, id - 1); + facets.emplace_back( 3, 1, id); + facets.emplace_back(id, 2, 3); + facets.emplace_back(id, id - 1, 2); + + return mesh; +} + indexed_triangle_set its_make_cone(double r, double h, double fa) { indexed_triangle_set mesh; @@ -962,8 +1022,10 @@ indexed_triangle_set its_make_cone(double r, double h, double fa) vertices.emplace_back(Vec3f(0., 0., h)); size_t i = 0; + const auto vec = Eigen::Vector2f(0, float(r)); for (double angle=0; angle<2*PI; angle+=fa) { - vertices.emplace_back(r*std::cos(angle), r*std::sin(angle), 0.); + Vec2f p = Eigen::Rotation2Df(angle) * vec; + vertices.emplace_back(Vec3f(p(0), p(1), 0.f)); if (angle > 0.) { facets.emplace_back(0, i+2, i+1); facets.emplace_back(1, i+1, i+2); @@ -998,42 +1060,160 @@ indexed_triangle_set its_make_pyramid(float base, float height) // Generates mesh for a sphere centered about the origin, using the generated angle // to determine the granularity. // Default angle is 1 degree. -//FIXME better to discretize an Icosahedron recursively http://www.songho.ca/opengl/gl_sphere.html indexed_triangle_set its_make_sphere(double radius, double fa) { - int sectorCount = int(ceil(2. * M_PI / fa)); - int stackCount = int(ceil(M_PI / fa)); - float sectorStep = float(2. * M_PI / sectorCount); - float stackStep = float(M_PI / stackCount); + // First build an icosahedron (taken from http://www.songho.ca/opengl/gl_sphere.html) + indexed_triangle_set mesh; + + const float PI = 3.1415926f; + const float H_ANGLE = PI / 180 * 72; // 72 degree = 360 / 5 + const float V_ANGLE = atanf(1.0f / 2); // elevation = 26.565 degree + + auto& vertices = mesh.vertices; + auto& indices = mesh.indices; + vertices.resize(12); + indices.reserve(20); + + float z, xy; + float hAngle1 = -PI / 2 - H_ANGLE / 2; + + vertices[0] = stl_vertex(0, 0, radius); // the first top vertex at (0, 0, r) + + for (int i = 1; i <= 5; ++i) { + z = radius * sinf(V_ANGLE); + xy = radius * cosf(V_ANGLE); + vertices[i] = stl_vertex(xy * cosf(hAngle1), xy * sinf(hAngle1), z); + vertices[i+5] = stl_vertex(xy * cosf(hAngle1 + H_ANGLE / 2), xy * sinf(hAngle1 + H_ANGLE / 2), -z); + hAngle1 += H_ANGLE; + + indices.emplace_back(stl_triangle_vertex_indices(i, i < 5 ? i+1 : 1, 0)); + indices.emplace_back(stl_triangle_vertex_indices(i, i+5, i < 5 ? i+1 : 1)); + indices.emplace_back(stl_triangle_vertex_indices(i+5, i+6 < 11 ? i+6 : 6, i+6 < 11 ? i+1 : 1)); + indices.emplace_back(stl_triangle_vertex_indices(i+5, 11, i+6 < 11 ? i+6 : 6)); + } + vertices[11] = stl_vertex(0, 0, -radius); // the last bottom vertex at (0, 0, -r) + + + // We have a beautiful icosahedron. Now subdivide the triangles. + std::vector neighbors = its_face_neighbors(mesh); // This is cheap, the mesh is small. + + const double side_len_limit = radius * fa; + const double side_len = (vertices[1] - vertices[0]).norm(); + const int iterations = std::ceil(std::log2(side_len / side_len_limit)); + + indices.reserve(indices.size() * std::pow(4, iterations)); + vertices.reserve(vertices.size() * std::pow(2, iterations)); + + struct DividedEdge { + int neighbor = -1; + int middle_vertex_idx; + std::pair children_idxs; + }; + + for (int iter=0; iter> divided_triangles(indices.size()); + std::vector new_neighbors(4*indices.size()); + + int orig_indices_size = int(indices.size()); + for (int i=0; i, 3> edge_children = { std::make_pair(i,last_triangle_idx + 2), + std::make_pair(last_triangle_idx + 2,last_triangle_idx + 3), + std::make_pair(last_triangle_idx + 3,i) }; + + std::array middle_vertices_idxs; + std::array, 3> new_neighbors_per_edge; + + for (int n=0; n<3; ++n) { // for all three edges + const int edge_neighbor = neighbors[i][n]; + + if (divided_triangles[edge_neighbor][0].neighbor == -1) { + // This n-th edge is not yet divided. Divide it now. + vertices.emplace_back(0.5 * (vertices[indices[i][n]] + vertices[indices[i][n == 2 ? 0 : n+1]])); + vertices.back() *= radius / vertices.back().norm(); + middle_vertices_idxs[n] = vertices.size()-1; + + // Save information about what we did. + int j = -1; + while (divided_triangles[i][++j].neighbor != -1); + + divided_triangles[i][j] = { edge_neighbor, int(vertices.size()-1), edge_children[n] }; + new_neighbors_per_edge[n] = std::make_pair(-1,-1); + } else { + // This edge is already divided. Get the index of the middle point. + int j = -1; + while (divided_triangles[edge_neighbor][++j].neighbor != i); + middle_vertices_idxs[n] = divided_triangles[edge_neighbor][j].middle_vertex_idx; + new_neighbors_per_edge[n] = divided_triangles[edge_neighbor][j].children_idxs; + std::swap(new_neighbors_per_edge[n].first, new_neighbors_per_edge[n].second); + + // We have saved the middle-point. We are looking for edges leading to/from it. + int idx = -1; while (indices[new_neighbors_per_edge[n].first][++idx] != middle_vertices_idxs[n]); + new_neighbors[new_neighbors_per_edge[n].first][idx] = edge_children[n].first; + new_neighbors[new_neighbors_per_edge[n].second][idx] = edge_children[n].second; + } + } + + // Add three new triangles, reindex the old one. + const int last_index = indices.size() - 1; + indices.emplace_back(stl_triangle_vertex_indices(middle_vertices_idxs[0], middle_vertices_idxs[1], middle_vertices_idxs[2])); + new_neighbors[indices.size()-1] = Vec3i(last_index+2, last_index+3, i); + + indices.emplace_back(stl_triangle_vertex_indices(middle_vertices_idxs[0], indices[i][1], middle_vertices_idxs[1])); + new_neighbors[indices.size()-1] = Vec3i(new_neighbors_per_edge[0].second, new_neighbors_per_edge[1].first, last_index+1); + + indices.emplace_back(stl_triangle_vertex_indices(middle_vertices_idxs[2], middle_vertices_idxs[1], indices[i][2])); + new_neighbors[indices.size()-1] = Vec3i(last_index+1, new_neighbors_per_edge[1].second, new_neighbors_per_edge[2].first); + + indices[i][1] = middle_vertices_idxs[0]; + indices[i][2] = middle_vertices_idxs[2]; + new_neighbors[i] = Vec3i(new_neighbors_per_edge[0].first, last_index+1, new_neighbors_per_edge[2].second); + + } + neighbors = std::move(new_neighbors); + } + return mesh; +} + +// Generates mesh for a frustum dowel centered about the origin, using the count of sectors +// Note: This function uses code for sphere generation, but for stackCount = 2; +indexed_triangle_set its_make_frustum_dowel(double radius, double h, int sectorCount) +{ + int stackCount = 2; + float sectorStep = float(2. * M_PI / sectorCount); + float stackStep = float(M_PI / stackCount); indexed_triangle_set mesh; auto& vertices = mesh.vertices; vertices.reserve((stackCount - 1) * sectorCount + 2); - for (int i = 0; i <= stackCount; ++ i) { + for (int i = 0; i <= stackCount; ++i) { // from pi/2 to -pi/2 double stackAngle = 0.5 * M_PI - stackStep * i; double xy = radius * cos(stackAngle); - double z = radius * sin(stackAngle); + double z = radius * sin(stackAngle); if (i == 0 || i == stackCount) - vertices.emplace_back(Vec3f(float(xy), 0.f, float(z))); + vertices.emplace_back(Vec3f(float(xy), 0.f, float(h * sin(stackAngle)))); else - for (int j = 0; j < sectorCount; ++ j) { + for (int j = 0; j < sectorCount; ++j) { // from 0 to 2pi - double sectorAngle = sectorStep * j; + double sectorAngle = sectorStep * j + 0.25 * M_PI; vertices.emplace_back(Vec3d(xy * std::cos(sectorAngle), xy * std::sin(sectorAngle), z).cast()); } } auto& facets = mesh.indices; facets.reserve(2 * (stackCount - 1) * sectorCount); - for (int i = 0; i < stackCount; ++ i) { + for (int i = 0; i < stackCount; ++i) { // Beginning of current stack. int k1 = (i == 0) ? 0 : (1 + (i - 1) * sectorCount); int k1_first = k1; // Beginning of next stack. int k2 = (i == 0) ? 1 : (k1 + sectorCount); int k2_first = k2; - for (int j = 0; j < sectorCount; ++ j) { + for (int j = 0; j < sectorCount; ++j) { // 2 triangles per sector excluding first and last stacks int k1_next = k1; int k2_next = k2; @@ -1143,6 +1323,23 @@ void its_reverse_all_facets(indexed_triangle_set &its) std::swap(face[0], face[1]); } +void its_merge(indexed_triangle_set &its, indexed_triangle_set &&its_add) +{ + if (its.empty()) { + its = std::move(its_add); + return; + } + auto &verts = its.vertices; + size_t verts_size = verts.size(); + Slic3r::append(verts, std::move(its_add.vertices)); + + // increase face indices + int offset = static_cast(verts_size); + for (auto &face : its_add.indices) + for (int i = 0; i < 3; ++i) face[i] += offset; + Slic3r::append(its.indices, std::move(its_add.indices)); +} + void its_merge(indexed_triangle_set &A, const indexed_triangle_set &B) { auto N = int(A.vertices.size()); @@ -1239,13 +1436,28 @@ bool its_is_splittable(const indexed_triangle_set &its, const std::vector size_t its_num_open_edges(const std::vector &face_neighbors) { size_t num_open_edges = 0; - for (Vec3i neighbors : face_neighbors) + for (const Vec3i& neighbors : face_neighbors) for (int n : neighbors) if (n < 0) ++ num_open_edges; return num_open_edges; } +std::vector> its_get_open_edges(const indexed_triangle_set& its) +{ + std::vector> ret; + std::vector face_neighbors = its_face_neighbors(its); + for (size_t i = 0; i < face_neighbors.size(); ++i) { + for (size_t j = 0; j < 3; ++j) { + if (face_neighbors[i][j] < 0) { + const Vec2i edge_indices = its_triangle_edge(its.indices[i], j); + ret.emplace_back(edge_indices[0], edge_indices[1]); + } + } + } + return ret; +} + size_t its_num_open_edges(const indexed_triangle_set &its) { return its_num_open_edges(its_face_neighbors(its)); diff --git a/src/libslic3r/TriangleMesh.hpp b/src/libslic3r/TriangleMesh.hpp index 3a0b2c2cec5..0f43f9d58db 100644 --- a/src/libslic3r/TriangleMesh.hpp +++ b/src/libslic3r/TriangleMesh.hpp @@ -92,7 +92,7 @@ class TriangleMesh TriangleMesh(std::vector &&vertices, const std::vector &&faces); explicit TriangleMesh(const indexed_triangle_set &M); explicit TriangleMesh(indexed_triangle_set &&M, const RepairedMeshErrors& repaired_errors = RepairedMeshErrors()); - void clear() { this->its.clear(); this->m_stats.clear(); } + void clear() { this->its.clear(); m_stats.clear(); } bool ReadSTLFile(const char* input_file, bool repair = true); bool write_ascii(const char* output_file); bool write_binary(const char* output_file); @@ -139,6 +139,7 @@ class TriangleMesh bool empty() const { return this->facets_count() == 0; } bool repaired() const; bool is_splittable() const; + bool has_zero_volume() const; // Estimate of the memory occupied by this structure, important for keeping an eye on the Undo / Redo stack allocation. size_t memsize() const; @@ -187,7 +188,7 @@ struct VertexFaceIndex // Used for chaining slice lines into polygons. std::vector its_face_edge_ids(const indexed_triangle_set &its); std::vector its_face_edge_ids(const indexed_triangle_set &its, std::function throw_on_cancel_callback); -std::vector its_face_edge_ids(const indexed_triangle_set &its, const std::vector &face_mask); +std::vector its_face_edge_ids(const indexed_triangle_set &its, const std::vector &face_mask); // Having the face neighbors available, assign unique edge IDs to face edges for chaining of polygons over slices. std::vector its_face_edge_ids(const indexed_triangle_set &its, std::vector &face_neighbors, bool assign_unbound_edges = false, int *num_edges = nullptr); @@ -203,6 +204,8 @@ void its_flip_triangles(indexed_triangle_set &its); // or more than two faces share the same edge position! int its_merge_vertices(indexed_triangle_set &its, bool shrink_to_fit = true); +// Calculate number of degenerate faces. There should be no degenerate faces in a nice mesh. +int its_num_degenerate_faces(const indexed_triangle_set &its); // Remove degenerate faces, return number of faces removed. int its_remove_degenerate_faces(indexed_triangle_set &its, bool shrink_to_fit = true); @@ -210,8 +213,8 @@ int its_remove_degenerate_faces(indexed_triangle_set &its, bool shrink_to_fit = int its_compactify_vertices(indexed_triangle_set &its, bool shrink_to_fit = true); // store part of index triangle set -bool its_store_triangle(const indexed_triangle_set &its, const char *obj_filename, size_t triangle_index); -bool its_store_triangles(const indexed_triangle_set &its, const char *obj_filename, const std::vector& triangles); +bool its_store_triangle_to_obj(const indexed_triangle_set &its, const char *obj_filename, size_t triangle_index); +bool its_store_triangles_to_obj(const indexed_triangle_set &its, const char *obj_filename, const std::vector& triangles); std::vector its_split(const indexed_triangle_set &its); std::vector its_split(const indexed_triangle_set &its, std::vector &face_neighbors); @@ -227,6 +230,10 @@ bool its_is_splittable(const indexed_triangle_set &its, const std::vector size_t its_num_open_edges(const indexed_triangle_set &its); size_t its_num_open_edges(const std::vector &face_neighbors); +// Calculate and returns the list of unconnected face edges. +// Each edge is represented by the indices of the two endpoint vertices +std::vector> its_get_open_edges(const indexed_triangle_set& its); + // Shrink the vectors of its.vertices and its.faces to a minimum size by reallocating the two vectors. void its_shrink_to_fit(indexed_triangle_set &its); @@ -262,12 +269,18 @@ inline int its_triangle_edge_index(const stl_triangle_vertex_indices &triangle_i using its_triangle = std::array; +inline its_triangle its_triangle_vertices(const indexed_triangle_set &its, + const Vec3i &face) +{ + return {its.vertices[face(0)], + its.vertices[face(1)], + its.vertices[face(2)]}; +} + inline its_triangle its_triangle_vertices(const indexed_triangle_set &its, size_t face_id) { - return {its.vertices[its.indices[face_id](0)], - its.vertices[its.indices[face_id](1)], - its.vertices[its.indices[face_id](2)]}; + return its_triangle_vertices(its, its.indices[face_id]); } inline stl_normal its_unnormalized_normal(const indexed_triangle_set &its, @@ -280,6 +293,14 @@ inline stl_normal its_unnormalized_normal(const indexed_triangle_set &its, float its_volume(const indexed_triangle_set &its); float its_average_edge_length(const indexed_triangle_set &its); +/// +/// Merge one triangle mesh to another +/// Added triangle set will be consumed +/// +/// IN/OUT triangle mesh +/// Triangle mesh (will be consumed) +void its_merge(indexed_triangle_set &its, indexed_triangle_set &&its_add); + void its_merge(indexed_triangle_set &A, const indexed_triangle_set &B); void its_merge(indexed_triangle_set &A, const std::vector &triangles); void its_merge(indexed_triangle_set &A, const Pointf3s &triangles); @@ -296,6 +317,8 @@ indexed_triangle_set its_make_cube(double x, double y, double z); indexed_triangle_set its_make_prism(float width, float length, float height); indexed_triangle_set its_make_cylinder(double r, double h, double fa=(2*PI/360)); indexed_triangle_set its_make_cone(double r, double h, double fa=(2*PI/360)); +indexed_triangle_set its_make_frustum(double r, double h, double fa=(2*PI/360)); +indexed_triangle_set its_make_frustum_dowel(double r, double h, int sectorCount); indexed_triangle_set its_make_pyramid(float base, float height); indexed_triangle_set its_make_sphere(double radius, double fa); @@ -330,6 +353,22 @@ inline BoundingBoxf3 bounding_box(const indexed_triangle_set& its) return {bmin.cast(), bmax.cast()}; } +inline BoundingBoxf3 bounding_box(const indexed_triangle_set& its, const Transform3f &tr) +{ + if (its.vertices.empty()) + return {}; + + Vec3f bmin = tr * its.vertices.front(), bmax = tr * its.vertices.front(); + + for (const Vec3f &p : its.vertices) { + Vec3f pp = tr * p; + bmin = pp.cwiseMin(bmin); + bmax = pp.cwiseMax(bmax); + } + + return {bmin.cast(), bmax.cast()}; +} + } // Serialization through the Cereal library diff --git a/src/libslic3r/TriangleMeshSlicer.cpp b/src/libslic3r/TriangleMeshSlicer.cpp index ae917756b00..7faa7943547 100644 --- a/src/libslic3r/TriangleMeshSlicer.cpp +++ b/src/libslic3r/TriangleMeshSlicer.cpp @@ -34,6 +34,10 @@ // #define SLIC3R_DEBUG_SLICE_PROCESSING +#ifdef SLIC3R_DEBUG_SLICE_PROCESSING + #define DEBUG_INTERSECTIONLINE +#endif + #if defined(SLIC3R_DEBUG) || defined(SLIC3R_DEBUG_SLICE_PROCESSING) #include "SVG.hpp" #endif @@ -62,6 +66,12 @@ class IntersectionPoint : public Point, public IntersectionReference // Inherits coord_t x, y }; +#if (! defined(NDEBUG) || defined(SLIC3R_DEBUG_SLICE_PROCESSING)) + #define DEBUG_INTERSECTION_LINE 1 +#else + #define DEBUG_INTERSECTION_LINE 0 +#endif + class IntersectionLine : public Line { public: @@ -119,14 +129,14 @@ class IntersectionLine : public Line }; uint32_t flags { 0 }; -#ifndef NDEBUG +#ifdef DEBUG_INTERSECTIONLINE enum class Source { BottomPlane, TopPlane, Slab, }; Source source { Source::BottomPlane }; -#endif // NDEBUG +#endif }; using IntersectionLines = std::vector; @@ -137,18 +147,41 @@ enum class FacetSliceType { Cutting = 2 }; +// Convert an int32_t scaled coordinate into an unscaled 3D floating point coordinate (mesh vertex). +template +inline Vec3f contour_point_to_v3f(const Point &pt, const T z) +{ + return to_3d( + // unscale using doubles for higher accuracy + unscaled(pt). + // then convert to floats + cast(), + float(z)); +} + +// Convert 2D projection of an int32_t scaled coordinate into an unscaled 3D floating point coordinate (mesh vertex). +template +inline Point v3f_scaled_to_contour_point(const Eigen::MatrixBase &v) +{ + static_assert(Derived::IsVectorAtCompileTime && int(Derived::SizeAtCompileTime) >= 2, "v3f_scaled_to_contour_point(): Not a 2D or 3D vector."); + using T = typename Derived::Scalar; + return { coord_t(std::floor(v.x() + T(0.5))), coord_t(std::floor(v.y() + T(0.5))) }; +} + // Return true, if the facet has been sliced and line_out has been filled. -static FacetSliceType slice_facet( +template +inline FacetSliceType slice_facet( // Z height of the slice in XY plane. Scaled or unscaled (same as vertices[].z()). - float slice_z, + T slice_z, // 3 vertices of the triangle, XY scaled. Z scaled or unscaled (same as slice_z). - const stl_vertex *vertices, - const stl_triangle_vertex_indices &indices, - const Vec3i &edge_ids, - const int idx_vertex_lowest, - const bool horizontal, - IntersectionLine &line_out) + const Eigen::Matrix *vertices, + const stl_triangle_vertex_indices &indices, + const Vec3i &edge_ids, + const int idx_vertex_lowest, + const bool horizontal, + IntersectionLine &line_out) { + using Vector = Eigen::Matrix; IntersectionPoint points[3]; size_t num_points = 0; auto point_on_layer = size_t(-1); @@ -158,7 +191,7 @@ static FacetSliceType slice_facet( // (external on the right of the line) for (int j = 0; j < 3; ++ j) { // loop through facet edges int edge_id; - const stl_vertex *a, *b; + const Vector *a, *b; int a_id, b_id; { int k = (idx_vertex_lowest + j) % 3; @@ -174,16 +207,16 @@ static FacetSliceType slice_facet( if (a->z() == slice_z && b->z() == slice_z) { // Edge is horizontal and belongs to the current layer. // The following rotation of the three vertices may not be efficient, but this branch happens rarely. - const stl_vertex &v0 = vertices[0]; - const stl_vertex &v1 = vertices[1]; - const stl_vertex &v2 = vertices[2]; + const Vector &v0 = vertices[0]; + const Vector &v1 = vertices[1]; + const Vector &v2 = vertices[2]; // We may ignore this edge for slicing purposes, but we may still use it for object cutting. FacetSliceType result = FacetSliceType::Slicing; if (horizontal) { // All three vertices are aligned with slice_z. line_out.edge_type = IntersectionLine::FacetEdgeType::Horizontal; result = FacetSliceType::Cutting; - double normal = (v1.x() - v0.x()) * (v2.y() - v1.y()) - (v1.y() - v0.y()) * (v2.x() - v1.x()); + double normal = cross2((to_2d(v1) - to_2d(v0)).template cast(), (to_2d(v2) - to_2d(v1)).template cast()); if (normal < 0) { // If normal points downwards this is a bottom horizontal facet so we reverse its point order. std::swap(a, b); @@ -205,10 +238,8 @@ static FacetSliceType slice_facet( } else line_out.edge_type = IntersectionLine::FacetEdgeType::Bottom; } - line_out.a.x() = a->x(); - line_out.a.y() = a->y(); - line_out.b.x() = b->x(); - line_out.b.y() = b->y(); + line_out.a = v3f_scaled_to_contour_point(*a); + line_out.b = v3f_scaled_to_contour_point(*b); line_out.a_id = a_id; line_out.b_id = b_id; assert(line_out.a != line_out.b); @@ -220,8 +251,7 @@ static FacetSliceType slice_facet( if (point_on_layer == size_t(-1) || points[point_on_layer].point_id != a_id) { point_on_layer = num_points; IntersectionPoint &point = points[num_points ++]; - point.x() = a->x(); - point.y() = a->y(); + static_cast(point) = v3f_scaled_to_contour_point(*a); point.point_id = a_id; } } else if (b->z() == slice_z) { @@ -229,8 +259,7 @@ static FacetSliceType slice_facet( if (point_on_layer == size_t(-1) || points[point_on_layer].point_id != b_id) { point_on_layer = num_points; IntersectionPoint &point = points[num_points ++]; - point.x() = b->x(); - point.y() = b->y(); + static_cast(point) = v3f_scaled_to_contour_point(*b); point.point_id = b_id; } } else if ((a->z() < slice_z && b->z() > slice_z) || (b->z() < slice_z && a->z() > slice_z)) { @@ -242,7 +271,12 @@ static FacetSliceType slice_facet( std::swap(a, b); } IntersectionPoint &point = points[num_points]; - double t = (double(slice_z) - double(b->z())) / (double(a->z()) - double(b->z())); + double t = (double(slice_z) - double(a->z())) / (double(b->z()) - double(a->z())); +#if 0 + // If the intersection point falls into one of the end points, mark it with the end point identifier. + // While this sounds like a good idea, it likely breaks the chaining by logical addresses of the intersection points + // and the branch for 0 < t < 1 does not guarantee uniqness of the interection point anyways. + // Thus this branch is only kept for reference and it is not used in production code. if (t <= 0.) { if (point_on_layer == size_t(-1) || points[point_on_layer].point_id != a_id) { point.x() = a->x(); @@ -258,11 +292,20 @@ static FacetSliceType slice_facet( point.point_id = b_id; } } else { - point.x() = coord_t(floor(double(b->x()) + (double(a->x()) - double(b->x())) * t + 0.5)); - point.y() = coord_t(floor(double(b->y()) + (double(a->y()) - double(b->y())) * t + 0.5)); + point.x() = coord_t(floor(double(a->x()) + (double(b->x()) - double(a->x())) * t + 0.5)); + point.y() = coord_t(floor(double(a->y()) + (double(b->y()) - double(a->y())) * t + 0.5)); point.edge_id = edge_id; ++ num_points; } +#else + // Just clamp the intersection point to source triangle edge. + static_cast(point) = + t <= 0. ? v3f_scaled_to_contour_point(*a) : + t >= 1. ? v3f_scaled_to_contour_point(*b) : + v3f_scaled_to_contour_point(a->template head<2>().template cast() * (1. - t) + b->template head<2>().template cast() * t + Vec2d(0.5, 0.5)); + point.edge_id = edge_id; + ++ num_points; +#endif } } @@ -284,6 +327,11 @@ static FacetSliceType slice_facet( assert(line_out.edge_a_id != -1 || line_out.edge_b_id != -1); // General slicing position, use the segment for both slicing and object cutting. #if 0 + // See the discussion on calculating the intersection point on a triangle edge. + // Even if the intersection point is clamped to one of the end points of the triangle edge, + // the intersection point is still marked as "on edge", not "on vertex". Such implementation + // may produce degenerate triangles, but is topologically correct. + // Therefore this block for solving snapping of an intersection edge to triangle vertices is not used. if (line_out.a_id != -1 && line_out.b_id != -1) { // Solving a degenerate case, where both the intersections snapped to an edge. // Correctly classify the face as below or above based on the position of the 3rd point. @@ -1402,24 +1450,24 @@ static std::vector make_slab_loops( for (const IntersectionLine &l : lines.at_slice[slice_below]) if (l.edge_type != IntersectionLine::FacetEdgeType::Top) { in.emplace_back(l); -#ifndef NDEBUG +#ifdef DEBUG_INTERSECTIONLINE in.back().source = IntersectionLine::Source::BottomPlane; -#endif // NDEBUG +#endif // DEBUG_INTERSECTIONLINE } } { // Edges in between slice_below and slice_above. -#ifndef NDEBUG +#ifdef DEBUG_INTERSECTIONLINE size_t old_size = in.size(); -#endif // NDEBUG +#endif // DEBUG_INTERSECTIONLINE // Edge IDs of end points on in-between lines that touch the layer above are already increased with num_edges. append(in, lines.between_slices[line_idx]); -#ifndef NDEBUG +#ifdef DEBUG_INTERSECTIONLINE for (auto it = in.begin() + old_size; it != in.end(); ++ it) { assert(it->edge_type == IntersectionLine::FacetEdgeType::Slab); it->source = IntersectionLine::Source::Slab; } -#endif // NDEBUG +#endif // DEBUG_INTERSECTIONLINE } if (has_slice_above) { for (const IntersectionLine &lsrc : lines.at_slice[slice_above]) @@ -1432,9 +1480,9 @@ static std::vector make_slab_loops( l.edge_a_id += num_edges; if (l.edge_b_id >= 0) l.edge_b_id += num_edges; -#ifndef NDEBUG +#ifdef DEBUG_INTERSECTIONLINE l.source = IntersectionLine::Source::TopPlane; -#endif // NDEBUG +#endif // DEBUG_INTERSECTIONLINE } } if (! in.empty()) { @@ -1780,7 +1828,7 @@ Polygons slice_mesh( { bool trafo_identity = is_identity(params.trafo); Transform3f tf; - std::vector face_mask(mesh.indices.size(), false); + std::vector face_mask(mesh.indices.size(), 0); { // 1) Mark vertices as below or above the slicing plane. @@ -2009,6 +2057,7 @@ static void triangulate_slice( (l.first.y() == r.first.y() && l.second < r.second))); }); // 2) Discover duplicate points on the slice. Remap duplicate vertices to a vertex with a lowest index. + // Remove denegerate triangles, if they happen to be created by merging duplicate vertices. { std::vector map_duplicate_vertex(int(its.vertices.size()) - num_original_vertices, -1); int i = 0; @@ -2031,10 +2080,20 @@ static void triangulate_slice( i = j; } map_vertex_to_index.erase(map_vertex_to_index.begin() + k, map_vertex_to_index.end()); - for (stl_triangle_vertex_indices &f : its.indices) - for (i = 0; i < 3; ++ i) - if (f(i) >= num_original_vertices) - f(i) = map_duplicate_vertex[f(i) - num_original_vertices]; + for (i = 0; i < int(its.indices.size());) { + stl_triangle_vertex_indices &f = its.indices[i]; + // Remap the newly added face vertices. + for (k = 0; k < 3; ++ k) + if (f(k) >= num_original_vertices) + f(k) = map_duplicate_vertex[f(k) - num_original_vertices]; + if (f(0) == f(1) || f(0) == f(2) || f(1) == f(2)) { + // Remove degenerate face. + f = its.indices.back(); + its.indices.pop_back(); + } else + // Keep the face. + ++ i; + } } if (triangulate) { @@ -2108,6 +2167,10 @@ void cut_mesh(const indexed_triangle_set &mesh, float z, indexed_triangle_set *u if (upper == nullptr && lower == nullptr) return; +#ifndef NDEBUG + const size_t had_degenerate_faces = its_num_degenerate_faces(mesh); +#endif // NDEBUG + BOOST_LOG_TRIVIAL(trace) << "cut_mesh - slicing object"; if (upper) { @@ -2142,28 +2205,44 @@ void cut_mesh(const indexed_triangle_set &mesh, float z, indexed_triangle_set *u int idx_vertex_lowest = (vertices[1].z() == min_z) ? 1 : ((vertices[2].z() == min_z) ? 2 : 0); FacetSliceType slice_type = FacetSliceType::NoSlice; if (z > min_z - EPSILON && z < max_z + EPSILON) { - Vec3f vertices_scaled[3]; + Vec3d vertices_scaled[3]; for (int i = 0; i < 3; ++ i) { const Vec3f &src = vertices[i]; - Vec3f &dst = vertices_scaled[i]; - dst.x() = scale_(src.x()); - dst.y() = scale_(src.y()); + Vec3d &dst = vertices_scaled[i]; + dst.x() = scaled(src.x()); + dst.y() = scaled(src.y()); dst.z() = src.z(); } - slice_type = slice_facet(z, vertices_scaled, mesh.indices[facet_idx], facets_edge_ids[facet_idx], idx_vertex_lowest, min_z == max_z, line); + slice_type = slice_facet(double(z), vertices_scaled, mesh.indices[facet_idx], facets_edge_ids[facet_idx], idx_vertex_lowest, min_z == max_z, line); } if (slice_type != FacetSliceType::NoSlice) { // Save intersection lines for generating correct triangulations. if (line.edge_type == IntersectionLine::FacetEdgeType::Top) { - lower_lines.emplace_back(line); lower_slice_vertices.emplace_back(line.a_id); lower_slice_vertices.emplace_back(line.b_id); + if (lower) { + lower_lines.emplace_back(line); + if (triangulate_caps) { + // Snap these vertices to coord_t grid, so that they will be matched with the vertices produced + // by triangulating opening on the cut. + lower->vertices[line.a_id] = contour_point_to_v3f(line.a, z); + lower->vertices[line.b_id] = contour_point_to_v3f(line.b, z); + } + } } else if (line.edge_type == IntersectionLine::FacetEdgeType::Bottom) { - upper_lines.emplace_back(line); upper_slice_vertices.emplace_back(line.a_id); upper_slice_vertices.emplace_back(line.b_id); - } else if (line.edge_type == IntersectionLine::FacetEdgeType::General) { + if (upper) { + upper_lines.emplace_back(line); + if (triangulate_caps) { + // Snap these vertices to coord_t grid, so that they will be matched with the vertices produced + // by triangulating opening on the cut. + upper->vertices[line.a_id] = contour_point_to_v3f(line.a, z); + upper->vertices[line.b_id] = contour_point_to_v3f(line.b, z); + } + } + } else if (line.edge_type == IntersectionLine::FacetEdgeType::General && triangulate_caps) { lower_lines.emplace_back(line); upper_lines.emplace_back(line); } @@ -2195,11 +2274,11 @@ void cut_mesh(const indexed_triangle_set &mesh, float z, indexed_triangle_set *u assert(facets_edge_ids[facet_idx](iv) == line.edge_a_id || facets_edge_ids[facet_idx](iv) == line.edge_b_id); if (facets_edge_ids[facet_idx](iv) == line.edge_a_id) { // Unscale to doubles first, then to floats to reach the same accuracy as triangulate_expolygons_2d(). - v0v1 = to_3d(unscaled(line.a).cast().eval(), z); - v2v0 = to_3d(unscaled(line.b).cast().eval(), z); + v0v1 = contour_point_to_v3f(line.a, z); + v2v0 = contour_point_to_v3f(line.b, z); } else { - v0v1 = to_3d(unscaled(line.b).cast().eval(), z); - v2v0 = to_3d(unscaled(line.a).cast().eval(), z); + v0v1 = contour_point_to_v3f(line.b, z); + v2v0 = contour_point_to_v3f(line.a, z); } const stl_vertex &v0 = vertices[iv]; const int iv0 = facet[iv]; @@ -2251,8 +2330,27 @@ void cut_mesh(const indexed_triangle_set &mesh, float z, indexed_triangle_set *u new_face(lower, iv0, iv0v1_lower, iv2v0_lower); } } + +/* + char buf[2048]; + static int irun = 0; + ++irun; + temp.indices.emplace_back(int(temp.vertices.size()), int(temp.vertices.size() + 1), int(temp.vertices.size() + 2)); + temp.vertices.emplace_back(vertices[0]); + temp.vertices.emplace_back(vertices[1]); + temp.vertices.emplace_back(vertices[2]); + sprintf(buf, "D:\\temp\\test\\temp-%d.obj", irun); + its_write_obj(temp, buf); + sprintf(buf, "D:\\temp\\test\\upper-%d.obj", irun); + its_write_obj(*upper, buf); + sprintf(buf, "D:\\temp\\test\\lower-%d.obj", irun); + its_write_obj(*lower, buf); +*/ } - + + assert(had_degenerate_faces || ! upper || its_num_degenerate_faces(*upper) == 0); + assert(had_degenerate_faces || ! lower || its_num_degenerate_faces(*lower) == 0); + if (upper != nullptr) { triangulate_slice(*upper, upper_lines, upper_slice_vertices, int(mesh.vertices.size()), z, triangulate_caps, NORMALS_DOWN); #ifndef NDEBUG @@ -2272,6 +2370,9 @@ void cut_mesh(const indexed_triangle_set &mesh, float z, indexed_triangle_set *u } #endif // NDEBUG } + + assert(had_degenerate_faces || ! upper || its_num_degenerate_faces(*upper) == 0); + assert(had_degenerate_faces || ! lower || its_num_degenerate_faces(*lower) == 0); } } // namespace Slic3r diff --git a/src/libslic3r/TriangleMeshSlicer.hpp b/src/libslic3r/TriangleMeshSlicer.hpp index fbe72443321..ea6a7262cc7 100644 --- a/src/libslic3r/TriangleMeshSlicer.hpp +++ b/src/libslic3r/TriangleMeshSlicer.hpp @@ -130,6 +130,6 @@ void cut_mesh( indexed_triangle_set *lower, bool triangulate_caps = true); -} +} // namespace Slic3r #endif // slic3r_TriangleMeshSlicer_hpp_ diff --git a/src/libslic3r/TriangleSelector.cpp b/src/libslic3r/TriangleSelector.cpp index 820c26acc6f..90f77d738f5 100644 --- a/src/libslic3r/TriangleSelector.cpp +++ b/src/libslic3r/TriangleSelector.cpp @@ -371,7 +371,7 @@ std::pair, std::vector> TriangleSelector::precompute_a { std::vector neighbors(m_triangles.size(), Vec3i(-1, -1, -1)); std::vector neighbors_propagated(m_triangles.size(), Vec3i(-1, -1, -1)); - for (int facet_idx = 0; facet_idx < this->m_orig_size_indices; ++facet_idx) { + for (int facet_idx = 0; facet_idx < m_orig_size_indices; ++facet_idx) { neighbors[facet_idx] = m_neighbors[facet_idx]; neighbors_propagated[facet_idx] = neighbors[facet_idx]; assert(this->verify_triangle_neighbors(m_triangles[facet_idx], neighbors[facet_idx])); @@ -1480,7 +1480,7 @@ void TriangleSelector::get_facets_split_by_tjoints(const Vec3i &vertices, const std::vector TriangleSelector::get_seed_fill_contour() const { std::vector edges_out; - for (int facet_idx = 0; facet_idx < this->m_orig_size_indices; ++facet_idx) { + for (int facet_idx = 0; facet_idx < m_orig_size_indices; ++facet_idx) { const Vec3i neighbors = m_neighbors[facet_idx]; assert(this->verify_triangle_neighbors(m_triangles[facet_idx], neighbors)); this->get_seed_fill_contour_recursive(facet_idx, neighbors, neighbors, edges_out); diff --git a/src/libslic3r/TriangleSelectorWrapper.cpp b/src/libslic3r/TriangleSelectorWrapper.cpp new file mode 100644 index 00000000000..daf42300c55 --- /dev/null +++ b/src/libslic3r/TriangleSelectorWrapper.cpp @@ -0,0 +1,45 @@ +#include "TriangleSelectorWrapper.hpp" +#include + +namespace Slic3r { + +TriangleSelectorWrapper::TriangleSelectorWrapper(const TriangleMesh &mesh, const Transform3d& mesh_transform) : + mesh(mesh), mesh_transform(mesh_transform), selector(mesh), triangles_tree( + AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set(mesh.its.vertices, mesh.its.indices)) { +} + +void TriangleSelectorWrapper::enforce_spot(const Vec3f &point, const Vec3f &origin, float radius) { + std::vector hits; + Vec3f dir = (point - origin).normalized(); + if (AABBTreeIndirect::intersect_ray_all_hits(mesh.its.vertices, mesh.its.indices, triangles_tree, + Vec3d(origin.cast()), + Vec3d(dir.cast()), + hits)) { + for (int hit_idx = hits.size() - 1; hit_idx >= 0; --hit_idx) { + const igl::Hit &hit = hits[hit_idx]; + Vec3f pos = origin + dir * hit.t; + Vec3f face_normal = its_face_normal(mesh.its, hit.id); + if ((point - pos).norm() < radius && face_normal.dot(dir) < 0) { + std::unique_ptr cursor = std::make_unique( + pos, origin, radius, this->mesh_transform, TriangleSelector::ClippingPlane { }); + selector.select_patch(hit.id, std::move(cursor), EnforcerBlockerType::ENFORCER, Transform3d::Identity(), + true, 0.0f); + break; + } + } + } else { + size_t hit_idx_out; + Vec3f hit_point_out; + float dist = AABBTreeIndirect::squared_distance_to_indexed_triangle_set(mesh.its.vertices, mesh.its.indices, + triangles_tree, point, hit_idx_out, hit_point_out); + if (dist < radius) { + std::unique_ptr cursor = std::make_unique( + point, origin, radius, this->mesh_transform, TriangleSelector::ClippingPlane { }); + selector.select_patch(hit_idx_out, std::move(cursor), EnforcerBlockerType::ENFORCER, + Transform3d::Identity(), + true, 0.0f); + } + } +} + +} diff --git a/src/libslic3r/TriangleSelectorWrapper.hpp b/src/libslic3r/TriangleSelectorWrapper.hpp new file mode 100644 index 00000000000..22c61d6279a --- /dev/null +++ b/src/libslic3r/TriangleSelectorWrapper.hpp @@ -0,0 +1,31 @@ +#ifndef SRC_LIBSLIC3R_TRIANGLESELECTORWRAPPER_HPP_ +#define SRC_LIBSLIC3R_TRIANGLESELECTORWRAPPER_HPP_ + +#include "TriangleSelector.hpp" +#include "Model.hpp" +#include "AABBTreeIndirect.hpp" + +namespace Slic3r { + +//NOTE: We need to replace the FacetsAnnotation struct for support storage (or extend/add another) +// Problems: Does not support negative volumes, strange usage for supports computed from extrusion - +// expensively converted back to triangles and then sliced again. +// Another problem is weird and very limited interface when painting supports via algorithms + + +class TriangleSelectorWrapper { +public: + const TriangleMesh &mesh; + const Transform3d& mesh_transform; + TriangleSelector selector; + AABBTreeIndirect::Tree<3, float> triangles_tree; + + TriangleSelectorWrapper(const TriangleMesh &mesh, const Transform3d& mesh_transform); + + void enforce_spot(const Vec3f &point, const Vec3f& origin, float radius); + +}; + +} + +#endif /* SRC_LIBSLIC3R_TRIANGLESELECTORWRAPPER_HPP_ */ diff --git a/src/libslic3r/TriangulateWall.cpp b/src/libslic3r/TriangulateWall.cpp deleted file mode 100644 index eb710d9a572..00000000000 --- a/src/libslic3r/TriangulateWall.cpp +++ /dev/null @@ -1,159 +0,0 @@ -#include "TriangulateWall.hpp" -#include "MTUtils.hpp" - -namespace Slic3r { - -//class Ring { -// size_t idx = 0, nextidx = 1, startidx = 0, begin = 0, end = 0; - -//public: -// explicit Ring(size_t from, size_t to) : begin(from), end(to) { init(begin); } - -// size_t size() const { return end - begin; } -// std::pair pos() const { return {idx, nextidx}; } -// bool is_lower() const { return idx < size(); } - -// void inc() -// { -// if (nextidx != startidx) nextidx++; -// if (nextidx == end) nextidx = begin; -// idx ++; -// if (idx == end) idx = begin; -// } - -// void init(size_t pos) -// { -// startidx = begin + (pos - begin) % size(); -// idx = startidx; -// nextidx = begin + (idx + 1 - begin) % size(); -// } - -// bool is_finished() const { return nextidx == idx; } -//}; - -//template -//static Sc sq_dst(const Vec<3, Sc> &v1, const Vec<3, Sc>& v2) -//{ -// Vec<3, Sc> v = v1 - v2; -// return v.x() * v.x() + v.y() * v.y() /*+ v.z() * v.z()*/; -//} - -//template -//static Sc trscore(const Ring & onring, -// const Ring & offring, -// const std::vector> &pts) -//{ -// Sc a = sq_dst(pts[onring.pos().first], pts[offring.pos().first]); -// Sc b = sq_dst(pts[onring.pos().second], pts[offring.pos().first]); -// return (std::abs(a) + std::abs(b)) / 2.; -//} - -//template -//class Triangulator { -// const std::vector> *pts; -// Ring *onring, *offring; - -// double calc_score() const -// { -// return trscore(*onring, *offring, *pts); -// } - -// void synchronize_rings() -// { -// Ring lring = *offring; -// auto minsc = trscore(*onring, lring, *pts); -// size_t imin = lring.pos().first; - -// lring.inc(); - -// while(!lring.is_finished()) { -// double score = trscore(*onring, lring, *pts); -// if (score < minsc) { minsc = score; imin = lring.pos().first; } -// lring.inc(); -// } - -// offring->init(imin); -// } - -// void emplace_indices(std::vector &indices) -// { -// Vec3i tr{int(onring->pos().first), int(onring->pos().second), -// int(offring->pos().first)}; -// if (onring->is_lower()) std::swap(tr(0), tr(1)); -// indices.emplace_back(tr); -// } - -//public: -// void run(std::vector &indices) -// { -// synchronize_rings(); - -// double score = 0, prev_score = 0; -// while (!onring->is_finished() || !offring->is_finished()) { -// prev_score = score; -// if (onring->is_finished() || (score = calc_score()) > prev_score) { -// std::swap(onring, offring); -// } else { -// emplace_indices(indices); -// onring->inc(); -// } -// } -// } - -// explicit Triangulator(const std::vector> *points, -// Ring & lower, -// Ring & upper) -// : pts{points}, onring{&upper}, offring{&lower} -// {} -//}; - -//template -//void triangulate_wall(std::vector> &pts, -// std::vector> & ind, -// const Polygon & lower, -// const Polygon & upper, -// double lower_z_mm, -// double upper_z_mm) -//{ -// if (upper.points.size() < 3 || lower.points.size() < 3) return; - -// pts.reserve(lower.points.size() + upper.points.size()); -// for (auto &p : lower.points) -// pts.emplace_back(unscaled(p.x()), unscaled(p.y()), lower_z_mm); -// for (auto &p : upper.points) -// pts.emplace_back(unscaled(p.x()), unscaled(p.y()), upper_z_mm); - -// ind.reserve(2 * (lower.size() + upper.size())); - -// Ring lring{0, lower.points.size()}, uring{lower.points.size(), pts.size()}; -// Triangulator t{&pts, lring, uring}; -// t.run(ind); -//} - -//Wall triangulate_wall(const Polygon &lower, -// const Polygon &upper, -// double lower_z_mm, -// double upper_z_mm) -//{ -// if (upper.points.size() < 3 || lower.points.size() < 3) return {}; - -// Wall wall; -// auto &pts = wall.first; -// auto &ind = wall.second; - -// pts.reserve(lower.points.size() + upper.points.size()); -// for (auto &p : lower.points) -// wall.first.emplace_back(unscaled(p.x()), unscaled(p.y()), lower_z_mm); -// for (auto &p : upper.points) -// wall.first.emplace_back(unscaled(p.x()), unscaled(p.y()), upper_z_mm); - -// ind.reserve(2 * (lower.size() + upper.size())); - -// Ring lring{0, lower.points.size()}, uring{lower.points.size(), pts.size()}; -// Triangulator t{&pts, lring, uring}; -// t.run(ind); - -// return wall; -//} - -} // namespace Slic3r diff --git a/src/libslic3r/Triangulation.cpp b/src/libslic3r/Triangulation.cpp new file mode 100644 index 00000000000..f5978d3e95f --- /dev/null +++ b/src/libslic3r/Triangulation.cpp @@ -0,0 +1,328 @@ +#include "Triangulation.hpp" +#include "IntersectionPoints.hpp" +#include +#include +#include +#include + +using namespace Slic3r; +namespace priv{ +inline void insert_edges(Triangulation::HalfEdges &edges, uint32_t &offset, const Polygon &polygon, const Triangulation::Changes& changes) { + const Points &pts = polygon.points; + uint32_t size = static_cast(pts.size()); + uint32_t last_index = offset + size - 1; + uint32_t prev_index = changes[last_index]; + for (uint32_t i = 0; i < size; ++i) { + uint32_t index = changes[offset + i]; + // when duplicit points are neighbor + if (prev_index == index) continue; + edges.push_back({prev_index, index}); + prev_index = index; + } + offset += size; +} + +inline void insert_edges(Triangulation::HalfEdges &edges, uint32_t &offset, const Polygon &polygon) { + const Points &pts = polygon.points; + uint32_t size = static_cast(pts.size()); + uint32_t prev_index = offset + size - 1; + for (uint32_t i = 0; i < size; ++i) { + uint32_t index = offset + i; + edges.push_back({prev_index, index}); + prev_index = index; + } + offset += size; +} + +inline bool has_bidirectional_constrained( + const Triangulation::HalfEdges &constrained) +{ + for (const auto &c : constrained) { + auto key = std::make_pair(c.second, c.first); + auto it = std::lower_bound(constrained.begin(), constrained.end(), + key); + if (it != constrained.end() && *it == key) return true; + } + return false; +} + +inline bool is_unique(const Points &points) { + Points pts = points; // copy + std::sort(pts.begin(), pts.end()); + auto it = std::adjacent_find(pts.begin(), pts.end()); + return it == pts.end(); +} + +inline bool has_self_intersection( + const Points &points, + const Triangulation::HalfEdges &constrained_half_edges) +{ + Lines lines; + lines.reserve(constrained_half_edges.size()); + for (const auto &he : constrained_half_edges) + lines.emplace_back(points[he.first], points[he.second]); + return !intersection_points(lines).empty(); +} + +} // namespace priv + +//#define VISUALIZE_TRIANGULATION +#ifdef VISUALIZE_TRIANGULATION +#include "admesh/stl.h" // indexed triangle set +static void visualize(const Points &points, + const Triangulation::Indices &indices, + const char *filename) +{ + // visualize + indexed_triangle_set its; + its.vertices.reserve(points.size()); + for (const Point &p : points) its.vertices.emplace_back(p.x(), p.y(), 0.); + its.indices = indices; + its_write_obj(its, filename); +} +#endif // VISUALIZE_TRIANGULATION + +Triangulation::Indices Triangulation::triangulate(const Points &points, + const HalfEdges &constrained_half_edges) +{ + assert(!points.empty()); + assert(!constrained_half_edges.empty()); + // constrained must be sorted + assert(std::is_sorted(constrained_half_edges.begin(), + constrained_half_edges.end())); + // check that there is no duplicit constrained edge + assert(std::adjacent_find(constrained_half_edges.begin(), constrained_half_edges.end()) == constrained_half_edges.end()); + // edges can NOT contain bidirectional constrained + assert(!priv::has_bidirectional_constrained(constrained_half_edges)); + // check that there is only unique poistion of points + assert(priv::is_unique(points)); + assert(!priv::has_self_intersection(points, constrained_half_edges)); + // use cgal triangulation + using K = CGAL::Exact_predicates_inexact_constructions_kernel; + using Vb = CGAL::Triangulation_vertex_base_with_info_2; + using Fb = CGAL::Constrained_triangulation_face_base_2; + using Tds = CGAL::Triangulation_data_structure_2; + using CDT = CGAL::Constrained_Delaunay_triangulation_2; + + // construct a constrained triangulation + CDT cdt; + { + std::vector vertices_handle(points.size()); // for constriants + using Point_with_ord = std::pair; + using SearchTrait = CGAL::Spatial_sort_traits_adapter_2 + >; + + std::vector cdt_points; + cdt_points.reserve(points.size()); + size_t ord = 0; + for (const auto &p : points) + cdt_points.emplace_back(std::make_pair(CDT::Point{p.x(), p.y()}, ord++)); + + SearchTrait st; + CGAL::spatial_sort(cdt_points.begin(), cdt_points.end(), st); + CDT::Face_handle f; + for (const auto& p : cdt_points) { + auto handle = cdt.insert(p.first, f); + handle->info() = p.second; + vertices_handle[p.second] = handle; + f = handle->face(); + } + + // Constrain the triangulation. + for (const HalfEdge &edge : constrained_half_edges) + cdt.insert_constraint(vertices_handle[edge.first], vertices_handle[edge.second]); + } + + auto faces = cdt.finite_face_handles(); + + // Unmark constrained edges of outside faces. + size_t num_faces = 0; + for (CDT::Face_handle fh : faces) { + for (int i = 0; i < 3; ++i) { + if (!fh->is_constrained(i)) continue; + auto key = std::make_pair(fh->vertex((i + 2) % 3)->info(), fh->vertex((i + 1) % 3)->info()); + auto it = std::lower_bound(constrained_half_edges.begin(), constrained_half_edges.end(), key); + if (it == constrained_half_edges.end() || *it != key) continue; + // This face contains a constrained edge and it is outside. + for (int j = 0; j < 3; ++ j) + fh->set_constraint(j, false); + --num_faces; + break; + } + ++num_faces; + } + + auto inside = [](CDT::Face_handle &fh) { + return fh->neighbor(0) != fh && + (fh->is_constrained(0) || + fh->is_constrained(1) || + fh->is_constrained(2)); + }; + +#ifdef VISUALIZE_TRIANGULATION + std::vector indices2; + indices2.reserve(num_faces); + for (CDT::Face_handle fh : faces) + if (inside(fh)) indices2.emplace_back(fh->vertex(0)->info(), fh->vertex(1)->info(), fh->vertex(2)->info()); + visualize(points, indices2, "C:/data/temp/triangulation_without_floodfill.obj"); +#endif // VISUALIZE_TRIANGULATION + + // Propagate inside the constrained regions. + std::vector queue; + queue.reserve(num_faces); + for (CDT::Face_handle seed : faces){ + if (!inside(seed)) continue; + // Seed fill to neighbor faces. + queue.emplace_back(seed); + while (! queue.empty()) { + CDT::Face_handle fh = queue.back(); + queue.pop_back(); + for (int i = 0; i < 3; ++i) { + if (fh->is_constrained(i)) continue; + // Propagate along this edge. + fh->set_constraint(i, true); + CDT::Face_handle nh = fh->neighbor(i); + bool was_inside = inside(nh); + // Mark the other side of this edge. + nh->set_constraint(nh->index(fh), true); + if (! was_inside) + queue.push_back(nh); + } + } + } + + std::vector indices; + indices.reserve(num_faces); + for (CDT::Face_handle fh : faces) + if (inside(fh)) + indices.emplace_back(fh->vertex(0)->info(), fh->vertex(1)->info(), fh->vertex(2)->info()); + +#ifdef VISUALIZE_TRIANGULATION + visualize(points, indices, "C:/data/temp/triangulation.obj"); +#endif // VISUALIZE_TRIANGULATION + + return indices; +} + +Triangulation::Indices Triangulation::triangulate(const Polygon &polygon) +{ + const Points &pts = polygon.points; + HalfEdges edges; + edges.reserve(pts.size()); + uint32_t offset = 0; + priv::insert_edges(edges, offset, polygon); + std::sort(edges.begin(), edges.end()); + return triangulate(pts, edges); +} + +Triangulation::Indices Triangulation::triangulate(const Polygons &polygons) +{ + size_t count = count_points(polygons); + Points points; + points.reserve(count); + + HalfEdges edges; + edges.reserve(count); + uint32_t offset = 0; + + for (const Polygon &polygon : polygons) { + Slic3r::append(points, polygon.points); + priv::insert_edges(edges, offset, polygon); + } + + std::sort(edges.begin(), edges.end()); + return triangulate(points, edges); +} + +Triangulation::Indices Triangulation::triangulate(const ExPolygon &expolygon){ + ExPolygons expolys({expolygon}); + return triangulate(expolys); +} + +Triangulation::Indices Triangulation::triangulate(const ExPolygons &expolygons){ + Points pts = to_points(expolygons); + Points d_pts = collect_duplicates(pts); + if (d_pts.empty()) return triangulate(expolygons, pts); + + Changes changes = create_changes(pts, d_pts); + Indices indices = triangulate(expolygons, pts, changes); + // reverse map for changes + Changes changes2(changes.size(), std::numeric_limits::max()); + for (size_t i = 0; i < changes.size(); ++i) + changes2[changes[i]] = i; + + // convert indices into expolygons indicies + for (Vec3i &t : indices) + for (size_t ti = 0; ti < 3; ti++) t[ti] = changes2[t[ti]]; + + return indices; +} + +Triangulation::Indices Triangulation::triangulate(const ExPolygons &expolygons, const Points &points) +{ + assert(count_points(expolygons) == points.size()); + // when contain duplicit coordinate in points will not work properly + assert(collect_duplicates(points).empty()); + + HalfEdges edges; + edges.reserve(points.size()); + uint32_t offset = 0; + for (const ExPolygon &expolygon : expolygons) { + priv::insert_edges(edges, offset, expolygon.contour); + for (const Polygon &hole : expolygon.holes) + priv::insert_edges(edges, offset, hole); + } + std::sort(edges.begin(), edges.end()); + return triangulate(points, edges); +} + +Triangulation::Indices Triangulation::triangulate(const ExPolygons &expolygons, const Points& points, const Changes& changes) +{ + assert(!points.empty()); + assert(count_points(expolygons) == points.size()); + assert(changes.size() == points.size()); + // IMPROVE: search from end and somehow distiquish that value is not a change + uint32_t count_points = *std::max_element(changes.begin(), changes.end())+1; + Points pts(count_points); + for (size_t i = 0; i < changes.size(); i++) + pts[changes[i]] = points[i]; + + HalfEdges edges; + edges.reserve(points.size()); + uint32_t offset = 0; + for (const ExPolygon &expolygon : expolygons) { + priv::insert_edges(edges, offset, expolygon.contour, changes); + for (const Polygon &hole : expolygon.holes) + priv::insert_edges(edges, offset, hole, changes); + } + + std::sort(edges.begin(), edges.end()); + return triangulate(pts, edges); +} + +Triangulation::Changes Triangulation::create_changes(const Points &points, const Points &duplicits) +{ + assert(!duplicits.empty()); + assert(duplicits.size() < points.size()/2); + std::vector duplicit_indices(duplicits.size(), std::numeric_limits::max()); + Changes changes; + changes.reserve(points.size()); + uint32_t index = 0; + for (const Point &p: points) { + auto it = std::lower_bound(duplicits.begin(), duplicits.end(), p); + if (it == duplicits.end() || *it != p) { + changes.push_back(index); + ++index; + continue; + } + uint32_t &d_index = duplicit_indices[it - duplicits.begin()]; + if (d_index == std::numeric_limits::max()) { + d_index = index; + changes.push_back(index); + ++index; + } else { + changes.push_back(d_index); + } + } + return changes; +} diff --git a/src/libslic3r/Triangulation.hpp b/src/libslic3r/Triangulation.hpp new file mode 100644 index 00000000000..2a6ff811d2f --- /dev/null +++ b/src/libslic3r/Triangulation.hpp @@ -0,0 +1,72 @@ +#ifndef libslic3r_Triangulation_hpp_ +#define libslic3r_Triangulation_hpp_ + +#include +#include +#include +#include +#include + +namespace Slic3r { + +class Triangulation +{ +public: + Triangulation() = delete; + + // define oriented connection of 2 vertices(defined by its index) + using HalfEdge = std::pair; + using HalfEdges = std::vector; + using Indices = std::vector; + + /// + /// Connect points by triangulation to create filled surface by triangles + /// Input points have to be unique + /// Inspiration for make unique points is Emboss::dilate_to_unique_points + /// + /// Points to connect + /// Constraint for edges, pair is from point(first) to + /// point(second), sorted lexicographically + /// Triangles + static Indices triangulate(const Points &points, + const HalfEdges &half_edges); + static Indices triangulate(const Polygon &polygon); + static Indices triangulate(const Polygons &polygons); + static Indices triangulate(const ExPolygon &expolygon); + static Indices triangulate(const ExPolygons &expolygons); + + // Map for convert original index to set without duplication + // from_index + using Changes = std::vector; + + /// + /// Create conversion map from original index into new + /// with respect of duplicit point + /// + /// input set of points + /// duplicit points collected from points + /// Conversion map for point index + static Changes create_changes(const Points &points, const Points &duplicits); + + /// + /// Triangulation for expolygons, speed up when points are already collected + /// NOTE: Not working properly for ExPolygons with multiple point on same coordinate + /// You should check it by "collect_changes" + /// + /// Input shape to triangulation - define edges + /// Points from expolygons + /// Triangle indices + static Indices triangulate(const ExPolygons &expolygons, const Points& points); + + /// + /// Triangulation for expolygons containing multiple points with same coordinate + /// + /// Input shape to triangulation - define edge + /// Points from expolygons + /// Changes swap for indicies into points + /// Triangle indices + static Indices triangulate(const ExPolygons &expolygons, const Points& points, const Changes& changes); +}; + +} // namespace Slic3r +#endif // libslic3r_Triangulation_hpp_ \ No newline at end of file diff --git a/src/libslic3r/Utils.hpp b/src/libslic3r/Utils.hpp index 1de3a5ef86f..815d6ff5560 100644 --- a/src/libslic3r/Utils.hpp +++ b/src/libslic3r/Utils.hpp @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -17,7 +18,6 @@ namespace Slic3r { extern void set_logging_level(unsigned int level); extern unsigned get_logging_level(); -extern void trace(unsigned int level, const char *message); // Format memory allocated, separate thousands by comma. extern std::string format_memsize_MB(size_t n); // Return string to be added to the boost::log output to inform about the current process memory allocation. @@ -67,13 +67,6 @@ std::string debug_out_path(const char *name, ...); // This type is only needed for Perl bindings to relay to Perl that the string is raw, not UTF-8 encoded. typedef std::string local_encoded_string; -// Convert an UTF-8 encoded string into local coding. -// On Windows, the UTF-8 string is converted to a local 8-bit code page. -// On OSX and Linux, this function does no conversion and returns a copy of the source string. -extern local_encoded_string encode_path(const char *src); -extern std::string decode_path(const char *src); -extern std::string normalize_utf8_nfc(const char *src); - // Returns next utf8 sequence length. =number of bytes in string, that creates together one utf-8 character. // Starting at pos. ASCII characters returns 1. Works also if pos is in the middle of the sequence. extern size_t get_utf8_sequence_length(const std::string& text, size_t pos = 0); @@ -114,19 +107,6 @@ extern bool is_gallery_file(const boost::filesystem::directory_entry& path, char extern bool is_gallery_file(const std::string& path, char const* type); extern bool is_shapes_dir(const std::string& dir); -// File path / name / extension splitting utilities, working with UTF-8, -// to be published to Perl. -namespace PerlUtils { - // Get a file name including the extension. - extern std::string path_to_filename(const char *src); - // Get a file name without the extension. - extern std::string path_to_stem(const char *src); - // Get just the extension. - extern std::string path_to_extension(const char *src); - // Get a directory without the trailing slash. - extern std::string path_to_parent_path(const char *src); -}; - std::string string_printf(const char *format, ...); // Standard "generated by Slic3r version xxx timestamp xxx" header string, @@ -196,6 +176,21 @@ template size_t next_highest_power_of_2(T v, return next_highest_power_of_2(uint32_t(v)); } +template void reserve_power_of_2(VectorType &vector, size_t n) +{ + vector.reserve(next_highest_power_of_2(n)); +} + +template void reserve_more(VectorType &vector, size_t n) +{ + vector.reserve(vector.size() + n); +} + +template void reserve_more_power_of_2(VectorType &vector, size_t n) +{ + vector.reserve(next_highest_power_of_2(vector.size() + n)); +} + template inline INDEX_TYPE prev_idx_modulo(INDEX_TYPE idx, const INDEX_TYPE count) { @@ -212,6 +207,14 @@ inline INDEX_TYPE next_idx_modulo(INDEX_TYPE idx, const INDEX_TYPE count) return idx; } + +// Return dividend divided by divisor rounded to the nearest integer +template +inline INDEX_TYPE round_up_divide(const INDEX_TYPE dividend, const INDEX_TYPE divisor) +{ + return (dividend + divisor - 1) / divisor; +} + template inline typename CONTAINER_TYPE::size_type prev_idx_modulo(typename CONTAINER_TYPE::size_type idx, const CONTAINER_TYPE &container) { @@ -249,6 +252,7 @@ inline typename CONTAINER_TYPE::value_type& next_value_modulo(typename CONTAINER } extern std::string xml_escape(std::string text, bool is_marked = false); +extern std::string xml_escape_double_quotes_attribute_value(std::string text); #if defined __GNUC__ && __GNUC__ < 5 && !defined __clang__ @@ -278,8 +282,6 @@ class ScopeGuard { public: typedef std::function Closure; -private: -// bool committed; Closure closure; public: @@ -361,7 +363,7 @@ inline std::string get_time_dhms(float time_in_secs) else if (minutes > 0) ::sprintf(buffer, "%dm %ds", minutes, (int)time_in_secs); else - ::sprintf(buffer, "%ds", (int)time_in_secs); + ::sprintf(buffer, "%ds", (int)std::round(time_in_secs)); return buffer; } diff --git a/src/libslic3r/Zipper.cpp b/src/libslic3r/Zipper.cpp index cebafa63335..53c39c3a75f 100644 --- a/src/libslic3r/Zipper.cpp +++ b/src/libslic3r/Zipper.cpp @@ -6,10 +6,6 @@ #include #include "I18N.hpp" -//! macro used to mark string used at localization, -//! return same string -#define L(s) Slic3r::I18N::translate(s) - #if defined(_MSC_VER) && _MSC_VER <= 1800 || __cplusplus < 201103L #define SLIC3R_NORETURN #elif __cplusplus >= 201103L @@ -24,7 +20,7 @@ class Zipper::Impl: public MZ_Archive { std::string formatted_errorstr() const { - return L("Error with zip archive") + " " + m_zipname + ": " + + return _u8L("Error with zip archive") + " " + m_zipname + ": " + get_errorstr(); } diff --git a/src/libslic3r/enum_bitmask.hpp b/src/libslic3r/enum_bitmask.hpp index 4c207631351..d5d2473713d 100644 --- a/src/libslic3r/enum_bitmask.hpp +++ b/src/libslic3r/enum_bitmask.hpp @@ -31,22 +31,33 @@ class enum_bitmask { constexpr enum_bitmask(option_type o) : m_bits(mask_value(o)) {} // Set the bit corresponding to the given option. - constexpr enum_bitmask operator|(option_type t) { return enum_bitmask(m_bits | mask_value(t)); } + constexpr enum_bitmask operator|(option_type t) const { return enum_bitmask(m_bits | mask_value(t)); } // Combine with another enum_bitmask of the same type. - constexpr enum_bitmask operator|(enum_bitmask t) { return enum_bitmask(m_bits | t.m_bits); } + constexpr enum_bitmask operator|(enum_bitmask t) const { return enum_bitmask(m_bits | t.m_bits); } + + // Set the bit corresponding to the given option. + constexpr void operator|=(option_type t) { m_bits = enum_bitmask(m_bits | mask_value(t)); } + + // Combine with another enum_bitmask of the same type. + constexpr void operator|=(enum_bitmask t) { m_bits = enum_bitmask(m_bits | t.m_bits); } // Get the value of the bit corresponding to the given option. - constexpr bool operator&(option_type t) { return m_bits & mask_value(t); } - constexpr bool has(option_type t) { return m_bits & mask_value(t); } + constexpr bool operator&(option_type t) const { return m_bits & mask_value(t); } + constexpr bool has(option_type t) const { return m_bits & mask_value(t); } + + constexpr bool operator==(const enum_bitmask r) const { return m_bits == r.m_bits; } + constexpr bool operator!=(const enum_bitmask r) const { return m_bits != r.m_bits; } + // For sorting by the enum values. + constexpr bool lower(const enum_bitmask r) const { return m_bits < r.m_bits; } private: underlying_type m_bits = 0; }; // For enabling free functions producing enum_bitmask<> type from bit operations on enums. -template struct is_enum_bitmask_type { static const bool enable = false; }; -#define ENABLE_ENUM_BITMASK_OPERATORS(x) template<> struct is_enum_bitmask_type { static const bool enable = true; }; +template struct is_enum_bitmask_type { static constexpr const bool enable = false; }; +#define ENABLE_ENUM_BITMASK_OPERATORS(x) template<> struct is_enum_bitmask_type { static constexpr const bool enable = true; }; template inline constexpr bool is_enum_bitmask_type_v = is_enum_bitmask_type::enable; // Creates an enum_bitmask from two options, convenient for passing of options to a function: diff --git a/src/libslic3r/libslic3r.h b/src/libslic3r/libslic3r.h index 06cad840e53..856208c9d45 100644 --- a/src/libslic3r/libslic3r.h +++ b/src/libslic3r/libslic3r.h @@ -4,7 +4,6 @@ #include "libslic3r_version.h" #define GCODEVIEWER_APP_NAME "PrusaSlicer G-code Viewer" #define GCODEVIEWER_APP_KEY "PrusaSlicerGcodeViewer" -#define GCODEVIEWER_BUILD_ID std::string("PrusaSlicer G-code Viewer-") + std::string(SLIC3R_VERSION) + std::string("-UNKNOWN") // this needs to be included early for MSVC (listing it in Build.PL is not enough) #include @@ -22,6 +21,7 @@ #include #include #include +#include #ifdef _WIN32 // On MSVC, std::deque degenerates to a list of pointers, which defeats its purpose of reducing allocator load and memory fragmentation. @@ -33,12 +33,13 @@ #include "Technologies.hpp" #include "Semver.hpp" +using coord_t = #if 1 // Saves around 32% RAM after slicing step, 6.7% after G-code export (tested on PrusaSlicer 2.2.0 final). -using coord_t = int32_t; + int32_t; #else -//FIXME At least FillRectilinear2 and std::boost Voronoi require coord_t to be 32bit. -typedef int64_t coord_t; + //FIXME At least FillRectilinear2 and std::boost Voronoi require coord_t to be 32bit. + int64_t; #endif using coordf_t = double; @@ -109,7 +110,7 @@ template inline void append(std::vector& dest, const std::vector& src) { if (dest.empty()) - dest = src; + dest = src; // copy else dest.insert(dest.end(), src.begin(), src.end()); } @@ -120,19 +121,30 @@ inline void append(std::vector& dest, std::vector&& src) if (dest.empty()) dest = std::move(src); else { - dest.reserve(dest.size() + src.size()); - std::move(std::begin(src), std::end(src), std::back_inserter(dest)); + dest.insert(dest.end(), + std::make_move_iterator(src.begin()), + std::make_move_iterator(src.end())); + // Release memory of the source contour now. + src.clear(); + src.shrink_to_fit(); } - src.clear(); - src.shrink_to_fit(); +} + +template // Arbitrary allocator can be used +void clear_and_shrink(std::vector& vec) +{ + // shrink_to_fit does not garantee the release of memory nor does it clear() + std::vector tmp; + vec.swap(tmp); + assert(vec.capacity() == 0); } // Append the source in reverse. template inline void append_reversed(std::vector& dest, const std::vector& src) { - if (dest.empty()) - dest = src; + if (dest.empty()) + dest = {src.rbegin(), src.rend()}; else dest.insert(dest.end(), src.rbegin(), src.rend()); } @@ -142,11 +154,13 @@ template inline void append_reversed(std::vector& dest, std::vector&& src) { if (dest.empty()) - dest = std::move(src); - else { - dest.reserve(dest.size() + src.size()); - std::move(std::rbegin(src), std::rend(src), std::back_inserter(dest)); - } + dest = {std::make_move_iterator(src.rbegin), + std::make_move_iterator(src.rend)}; + else + dest.insert(dest.end(), + std::make_move_iterator(src.rbegin()), + std::make_move_iterator(src.rend())); + // Release memory of the source contour now. src.clear(); src.shrink_to_fit(); } @@ -254,9 +268,17 @@ constexpr inline T lerp(const T& a, const T& b, Number t) } template -constexpr inline bool is_approx(Number value, Number test_value) +constexpr inline bool is_approx(Number value, Number test_value, Number precision = EPSILON) { - return std::fabs(double(value) - double(test_value)) < double(EPSILON); + return std::fabs(double(value) - double(test_value)) < double(precision); +} + +template +constexpr inline bool is_approx(const std::optional &value, + const std::optional &test_value) +{ + return (!value.has_value() && !test_value.has_value()) || + (value.has_value() && test_value.has_value() && is_approx(*value, *test_value)); } // A meta-predicate which is true for integers wider than or equal to coord_t @@ -327,16 +349,42 @@ template class Range Range(It b, It e) : from(std::move(b)), to(std::move(e)) {} // Some useful container-like methods... - inline size_t size() const { return end() - begin(); } - inline bool empty() const { return size() == 0; } + inline size_t size() const { return std::distance(from, to); } + inline bool empty() const { return from == to; } }; +template auto range(Cont &&cont) +{ + return Range{std::begin(cont), std::end(cont)}; +} + template> constexpr T NaN = std::numeric_limits::quiet_NaN(); constexpr float NaNf = NaN; constexpr double NaNd = NaN; +// Rounding up. +// 1.5 is rounded to 2 +// 1.49 is rounded to 1 +// 0.5 is rounded to 1, +// 0.49 is rounded to 0 +// -0.5 is rounded to 0, +// -0.51 is rounded to -1, +// -1.5 is rounded to -1. +// -1.51 is rounded to -2. +// If input is not a valid float (it is infinity NaN or if it does not fit) +// the float to int conversion produces a max int on Intel and +-max int on ARM. +template +inline IntegerOnly fast_round_up(double a) +{ + // Why does Java Math.round(0.49999999999999994) return 1? + // https://stackoverflow.com/questions/9902968/why-does-math-round0-49999999999999994-return-1 + return a == 0.49999999999999994 ? I(0) : I(floor(a + 0.5)); +} + +template using SamePair = std::pair; + } // namespace Slic3r -#endif +#endif // _libslic3r_h_ diff --git a/src/libslic3r/miniz_extension.cpp b/src/libslic3r/miniz_extension.cpp index 76b4cb4e55f..b0eccbeb38e 100644 --- a/src/libslic3r/miniz_extension.cpp +++ b/src/libslic3r/miniz_extension.cpp @@ -6,11 +6,7 @@ #include "boost/nowide/cstdio.hpp" #endif -#include "I18N.hpp" - -//! macro used to mark string used at localization, -//! return same string -#define L(s) Slic3r::I18N::translate(s) +#include "libslic3r/I18N.hpp" namespace Slic3r { @@ -88,67 +84,67 @@ std::string MZ_Archive::get_errorstr(mz_zip_error mz_err) case MZ_ZIP_NO_ERROR: return "no error"; case MZ_ZIP_UNDEFINED_ERROR: - return L("undefined error"); + return _u8L("undefined error"); case MZ_ZIP_TOO_MANY_FILES: - return L("too many files"); + return _u8L("too many files"); case MZ_ZIP_FILE_TOO_LARGE: - return L("file too large"); + return _u8L("file too large"); case MZ_ZIP_UNSUPPORTED_METHOD: - return L("unsupported method"); + return _u8L("unsupported method"); case MZ_ZIP_UNSUPPORTED_ENCRYPTION: - return L("unsupported encryption"); + return _u8L("unsupported encryption"); case MZ_ZIP_UNSUPPORTED_FEATURE: - return L("unsupported feature"); + return _u8L("unsupported feature"); case MZ_ZIP_FAILED_FINDING_CENTRAL_DIR: - return L("failed finding central directory"); + return _u8L("failed finding central directory"); case MZ_ZIP_NOT_AN_ARCHIVE: - return L("not a ZIP archive"); + return _u8L("not a ZIP archive"); case MZ_ZIP_INVALID_HEADER_OR_CORRUPTED: - return L("invalid header or archive is corrupted"); + return _u8L("invalid header or archive is corrupted"); case MZ_ZIP_UNSUPPORTED_MULTIDISK: - return L("unsupported multidisk archive"); + return _u8L("unsupported multidisk archive"); case MZ_ZIP_DECOMPRESSION_FAILED: - return L("decompression failed or archive is corrupted"); + return _u8L("decompression failed or archive is corrupted"); case MZ_ZIP_COMPRESSION_FAILED: - return L("compression failed"); + return _u8L("compression failed"); case MZ_ZIP_UNEXPECTED_DECOMPRESSED_SIZE: - return L("unexpected decompressed size"); + return _u8L("unexpected decompressed size"); case MZ_ZIP_CRC_CHECK_FAILED: - return L("CRC-32 check failed"); + return _u8L("CRC-32 check failed"); case MZ_ZIP_UNSUPPORTED_CDIR_SIZE: - return L("unsupported central directory size"); + return _u8L("unsupported central directory size"); case MZ_ZIP_ALLOC_FAILED: - return L("allocation failed"); + return _u8L("allocation failed"); case MZ_ZIP_FILE_OPEN_FAILED: - return L("file open failed"); + return _u8L("file open failed"); case MZ_ZIP_FILE_CREATE_FAILED: - return L("file create failed"); + return _u8L("file create failed"); case MZ_ZIP_FILE_WRITE_FAILED: - return L("file write failed"); + return _u8L("file write failed"); case MZ_ZIP_FILE_READ_FAILED: - return L("file read failed"); + return _u8L("file read failed"); case MZ_ZIP_FILE_CLOSE_FAILED: - return L("file close failed"); + return _u8L("file close failed"); case MZ_ZIP_FILE_SEEK_FAILED: - return L("file seek failed"); + return _u8L("file seek failed"); case MZ_ZIP_FILE_STAT_FAILED: - return L("file stat failed"); + return _u8L("file stat failed"); case MZ_ZIP_INVALID_PARAMETER: - return L("invalid parameter"); + return _u8L("invalid parameter"); case MZ_ZIP_INVALID_FILENAME: - return L("invalid filename"); + return _u8L("invalid filename"); case MZ_ZIP_BUF_TOO_SMALL: - return L("buffer too small"); + return _u8L("buffer too small"); case MZ_ZIP_INTERNAL_ERROR: - return L("internal error"); + return _u8L("internal error"); case MZ_ZIP_FILE_NOT_FOUND: - return L("file not found"); + return _u8L("file not found"); case MZ_ZIP_ARCHIVE_TOO_LARGE: - return L("archive is too large"); + return _u8L("archive is too large"); case MZ_ZIP_VALIDATION_FAILED: - return L("validation failed"); + return _u8L("validation failed"); case MZ_ZIP_WRITE_CALLBACK_FAILED: - return L("write calledback failed"); + return _u8L("write calledback failed"); default: break; } diff --git a/src/libslic3r/pchheader.hpp b/src/libslic3r/pchheader.hpp index e6591f5740e..9017a5deac3 100644 --- a/src/libslic3r/pchheader.hpp +++ b/src/libslic3r/pchheader.hpp @@ -64,6 +64,12 @@ #include #include #include +#ifdef _WIN32 +// On MSVC, std::deque degenerates to a list of pointers, which defeats its purpose of reducing allocator load and memory fragmentation. +// https://github.com/microsoft/STL/issues/147#issuecomment-1090148740 +// Thus it is recommended to use boost::container::deque instead. +#include +#endif // _WIN32 #include #include #include @@ -127,6 +133,4 @@ #include "libslic3r.h" #include "libslic3r_version.h" -#include - #include diff --git a/src/libslic3r/utils.cpp b/src/libslic3r/utils.cpp index e00b6e71c56..2615937eb35 100644 --- a/src/libslic3r/utils.cpp +++ b/src/libslic3r/utils.cpp @@ -125,19 +125,13 @@ static struct RunOnInit { } } g_RunOnInit; -void trace(unsigned int level, const char *message) -{ - boost::log::trivial::severity_level severity = level_to_boost(level); - - BOOST_LOG_STREAM_WITH_PARAMS(::boost::log::trivial::logger::get(),\ - (::boost::log::keywords::severity = severity)) << message; -} - void disable_multi_threading() { - // Disable parallelization so the Shiny profiler works + // Disable parallelization to simplify debugging. #ifdef TBB_HAS_GLOBAL_CONTROL - tbb::global_control(tbb::global_control::max_allowed_parallelism, 1); + { + static tbb::global_control gc(tbb::global_control::max_allowed_parallelism, 1); + } #else // TBB_HAS_GLOBAL_CONTROL static tbb::task_scheduler_init *tbb_init = new tbb::task_scheduler_init(1); UNUSED(tbb_init); @@ -820,49 +814,6 @@ bool is_shapes_dir(const std::string& dir) namespace Slic3r { -// Encode an UTF-8 string to the local code page. -std::string encode_path(const char *src) -{ -#ifdef WIN32 - // Convert the source utf8 encoded string to a wide string. - std::wstring wstr_src = boost::nowide::widen(src); - if (wstr_src.length() == 0) - return std::string(); - // Convert a wide string to a local code page. - int size_needed = ::WideCharToMultiByte(0, 0, wstr_src.data(), (int)wstr_src.size(), nullptr, 0, nullptr, nullptr); - std::string str_dst(size_needed, 0); - ::WideCharToMultiByte(0, 0, wstr_src.data(), (int)wstr_src.size(), str_dst.data(), size_needed, nullptr, nullptr); - return str_dst; -#else /* WIN32 */ - return src; -#endif /* WIN32 */ -} - -// Encode an 8-bit string from a local code page to UTF-8. -// Multibyte to utf8 -std::string decode_path(const char *src) -{ -#ifdef WIN32 - int len = int(strlen(src)); - if (len == 0) - return std::string(); - // Convert the string encoded using the local code page to a wide string. - int size_needed = ::MultiByteToWideChar(0, 0, src, len, nullptr, 0); - std::wstring wstr_dst(size_needed, 0); - ::MultiByteToWideChar(0, 0, src, len, wstr_dst.data(), size_needed); - // Convert a wide string to utf8. - return boost::nowide::narrow(wstr_dst.c_str()); -#else /* WIN32 */ - return src; -#endif /* WIN32 */ -} - -std::string normalize_utf8_nfc(const char *src) -{ - static std::locale locale_utf8(boost::locale::generator().generate("")); - return boost::locale::normalize(src, boost::locale::norm_nfc, locale_utf8); -} - size_t get_utf8_sequence_length(const std::string& text, size_t pos) { assert(pos < text.size()); @@ -933,18 +884,6 @@ size_t get_utf8_sequence_length(const char *seq, size_t size) return length; } -namespace PerlUtils { - // Get a file name including the extension. - std::string path_to_filename(const char *src) { return boost::filesystem::path(src).filename().string(); } - // Get a file name without the extension. - std::string path_to_stem(const char *src) { return boost::filesystem::path(src).stem().string(); } - // Get just the extension. - std::string path_to_extension(const char *src) { return boost::filesystem::path(src).extension().string(); } - // Get a directory without the trailing slash. - std::string path_to_parent_path(const char *src) { return boost::filesystem::path(src).parent_path().string(); } -}; - - std::string string_printf(const char *format, ...) { va_list args1; @@ -961,9 +900,11 @@ std::string string_printf(const char *format, ...) buffer.resize(size_t(bufflen) + 1); ::vsnprintf(buffer.data(), buffer.size(), format, args2); } + + va_end(args1); + va_end(args2); buffer.resize(bufflen); - return buffer; } @@ -1003,7 +944,35 @@ std::string xml_escape(std::string text, bool is_marked/* = false*/) case '\'': replacement = "'"; break; case '&': replacement = "&"; break; case '<': replacement = is_marked ? "<" :"<"; break; - case '>': replacement = is_marked ? ">" :">"; break; + case '>': replacement = is_marked ? ">" : ">"; break; + default: break; + } + + text.replace(pos, 1, replacement); + pos += replacement.size(); + } + + return text; +} + +// Definition of escape symbols https://www.w3.org/TR/REC-xml/#AVNormalize +// During the read of xml attribute normalization of white spaces is applied +// Soo for not lose white space character it is escaped before store +std::string xml_escape_double_quotes_attribute_value(std::string text) +{ + std::string::size_type pos = 0; + for (;;) { + pos = text.find_first_of("\"&<\r\n\t", pos); + if (pos == std::string::npos) break; + + std::string replacement; + switch (text[pos]) { + case '\"': replacement = """; break; + case '&': replacement = "&"; break; + case '<': replacement = "<"; break; + case '\r': replacement = " "; break; + case '\n': replacement = " "; break; + case '\t': replacement = " "; break; default: break; } diff --git a/src/miniz/miniz.c b/src/miniz/miniz.c index 0d6fc7d9bc8..09794bea025 100644 --- a/src/miniz/miniz.c +++ b/src/miniz/miniz.c @@ -7922,6 +7922,40 @@ mz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, cha return n + 1; } +mz_uint mz_zip_reader_get_filename_from_extra(mz_zip_archive* pZip, mz_uint file_index, char* buffer, mz_uint extra_buf_size) +{ + if (extra_buf_size == 0) + return 0; + mz_uint nf; + mz_uint ne; + const mz_uint8* p = mz_zip_get_cdh(pZip, file_index); + if (!p) + { + if (extra_buf_size) + buffer[0] = '\0'; + mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); + return 0; + } + nf = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); + ne = MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS); + + int copy = 0; + char const* p_nf = p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + nf; + char const* e = p_nf + ne + 1; + while (p_nf + 4 < e) { + mz_uint16 len = ((mz_uint16)p_nf[2]) | ((mz_uint16)p_nf[3] << 8); + if (p_nf[0] == '\x75' && p_nf[1] == '\x70' && len >= 5 && p_nf + 4 + len < e && p_nf[4] == '\x01') { + mz_uint length = MZ_MIN(len - 5, extra_buf_size - 1); + memcpy(buffer, p_nf + 9, length); + return length; + } + else { + p_nf += 4 + len; + } + } + return 0; +} + mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, mz_zip_archive_file_stat *pStat) { return mz_zip_file_stat_internal(pZip, file_index, mz_zip_get_cdh(pZip, file_index), pStat, NULL); diff --git a/src/miniz/miniz.h b/src/miniz/miniz.h index 8fe0461adba..62d579f9ebe 100644 --- a/src/miniz/miniz.h +++ b/src/miniz/miniz.h @@ -1166,6 +1166,9 @@ mz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, cha int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags); int mz_zip_reader_locate_file_v2(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags, mz_uint32 *file_index); +/* Retrieves the filename of an archive file entry from EXTRA ID. */ +mz_uint mz_zip_reader_get_filename_from_extra(mz_zip_archive * pZip, mz_uint file_index, char* buffer, mz_uint extra_buf_size); + /* Returns detailed information about an archive file entry. */ mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, mz_zip_archive_file_stat *pStat); diff --git a/src/nanosvg/README-prusa.txt b/src/nanosvg/README-prusa.txt deleted file mode 100644 index 8388aa8ef35..00000000000 --- a/src/nanosvg/README-prusa.txt +++ /dev/null @@ -1 +0,0 @@ -Upstream source: https://github.com/memononen/nanosvg/tree/c1f6e209c16b18b46aa9f45d7e619acf42c29726 \ No newline at end of file diff --git a/src/nanosvg/nanosvg.h b/src/nanosvg/nanosvg.h deleted file mode 100644 index 57bcb7c2c1d..00000000000 --- a/src/nanosvg/nanosvg.h +++ /dev/null @@ -1,2979 +0,0 @@ -/* - * Copyright (c) 2013-14 Mikko Mononen memon@inside.org - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * The SVG parser is based on Anti-Grain Geometry 2.4 SVG example - * Copyright (C) 2002-2004 Maxim Shemanarev (McSeem) (http://www.antigrain.com/) - * - * Arc calculation code based on canvg (https://code.google.com/p/canvg/) - * - * Bounding box calculation based on http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html - * - */ - -#ifndef NANOSVG_H -#define NANOSVG_H - -#ifndef NANOSVG_CPLUSPLUS -#ifdef __cplusplus -extern "C" { -#endif -#endif - -// NanoSVG is a simple stupid single-header-file SVG parse. The output of the parser is a list of cubic bezier shapes. -// -// The library suits well for anything from rendering scalable icons in your editor application to prototyping a game. -// -// NanoSVG supports a wide range of SVG features, but something may be missing, feel free to create a pull request! -// -// The shapes in the SVG images are transformed by the viewBox and converted to specified units. -// That is, you should get the same looking data as your designed in your favorite app. -// -// NanoSVG can return the paths in few different units. For example if you want to render an image, you may choose -// to get the paths in pixels, or if you are feeding the data into a CNC-cutter, you may want to use millimeters. -// -// The units passed to NanoSVG should be one of: 'px', 'pt', 'pc' 'mm', 'cm', or 'in'. -// DPI (dots-per-inch) controls how the unit conversion is done. -// -// If you don't know or care about the units stuff, "px" and 96 should get you going. - - -/* Example Usage: - // Load SVG - NSVGimage* image; - image = nsvgParseFromFile("test.svg", "px", 96); - printf("size: %f x %f\n", image->width, image->height); - // Use... - for (NSVGshape *shape = image->shapes; shape != NULL; shape = shape->next) { - for (NSVGpath *path = shape->paths; path != NULL; path = path->next) { - for (int i = 0; i < path->npts-1; i += 3) { - float* p = &path->pts[i*2]; - drawCubicBez(p[0],p[1], p[2],p[3], p[4],p[5], p[6],p[7]); - } - } - } - // Delete - nsvgDelete(image); -*/ - -enum NSVGpaintType { - NSVG_PAINT_NONE = 0, - NSVG_PAINT_COLOR = 1, - NSVG_PAINT_LINEAR_GRADIENT = 2, - NSVG_PAINT_RADIAL_GRADIENT = 3 -}; - -enum NSVGspreadType { - NSVG_SPREAD_PAD = 0, - NSVG_SPREAD_REFLECT = 1, - NSVG_SPREAD_REPEAT = 2 -}; - -enum NSVGlineJoin { - NSVG_JOIN_MITER = 0, - NSVG_JOIN_ROUND = 1, - NSVG_JOIN_BEVEL = 2 -}; - -enum NSVGlineCap { - NSVG_CAP_BUTT = 0, - NSVG_CAP_ROUND = 1, - NSVG_CAP_SQUARE = 2 -}; - -enum NSVGfillRule { - NSVG_FILLRULE_NONZERO = 0, - NSVG_FILLRULE_EVENODD = 1 -}; - -enum NSVGflags { - NSVG_FLAGS_VISIBLE = 0x01 -}; - -typedef struct NSVGgradientStop { - unsigned int color; - float offset; -} NSVGgradientStop; - -typedef struct NSVGgradient { - float xform[6]; - char spread; - float fx, fy; - int nstops; - NSVGgradientStop stops[1]; -} NSVGgradient; - -typedef struct NSVGpaint { - char type; - union { - unsigned int color; - NSVGgradient* gradient; - }; -} NSVGpaint; - -typedef struct NSVGpath -{ - float* pts; // Cubic bezier points: x0,y0, [cpx1,cpx1,cpx2,cpy2,x1,y1], ... - int npts; // Total number of bezier points. - char closed; // Flag indicating if shapes should be treated as closed. - float bounds[4]; // Tight bounding box of the shape [minx,miny,maxx,maxy]. - struct NSVGpath* next; // Pointer to next path, or NULL if last element. -} NSVGpath; - -typedef struct NSVGshape -{ - char id[64]; // Optional 'id' attr of the shape or its group - NSVGpaint fill; // Fill paint - NSVGpaint stroke; // Stroke paint - float opacity; // Opacity of the shape. - float strokeWidth; // Stroke width (scaled). - float strokeDashOffset; // Stroke dash offset (scaled). - float strokeDashArray[8]; // Stroke dash array (scaled). - char strokeDashCount; // Number of dash values in dash array. - char strokeLineJoin; // Stroke join type. - char strokeLineCap; // Stroke cap type. - float miterLimit; // Miter limit - char fillRule; // Fill rule, see NSVGfillRule. - unsigned char flags; // Logical or of NSVG_FLAGS_* flags - float bounds[4]; // Tight bounding box of the shape [minx,miny,maxx,maxy]. - NSVGpath* paths; // Linked list of paths in the image. - struct NSVGshape* next; // Pointer to next shape, or NULL if last element. -} NSVGshape; - -typedef struct NSVGimage -{ - float width; // Width of the image. - float height; // Height of the image. - NSVGshape* shapes; // Linked list of shapes in the image. -} NSVGimage; - -// Parses SVG file from a file, returns SVG image as paths. -NSVGimage* nsvgParseFromFile(const char* filename, const char* units, float dpi); - -// Parses SVG file from a null terminated string, returns SVG image as paths. -// Important note: changes the string. -NSVGimage* nsvgParse(char* input, const char* units, float dpi); - -// Duplicates a path. -NSVGpath* nsvgDuplicatePath(NSVGpath* p); - -// Deletes an image. -void nsvgDelete(NSVGimage* image); - -#ifndef NANOSVG_CPLUSPLUS -#ifdef __cplusplus -} -#endif -#endif - -#endif // NANOSVG_H - -#ifdef NANOSVG_IMPLEMENTATION - -#include -#include -#include - -#include - -#define NSVG_PI (3.14159265358979323846264338327f) -#define NSVG_KAPPA90 (0.5522847493f) // Length proportional to radius of a cubic bezier handle for 90deg arcs. - -#define NSVG_ALIGN_MIN 0 -#define NSVG_ALIGN_MID 1 -#define NSVG_ALIGN_MAX 2 -#define NSVG_ALIGN_NONE 0 -#define NSVG_ALIGN_MEET 1 -#define NSVG_ALIGN_SLICE 2 - -#define NSVG_NOTUSED(v) do { (void)(1 ? (void)0 : ( (void)(v) ) ); } while(0) -#define NSVG_RGB(r, g, b) (((unsigned int)r) | ((unsigned int)g << 8) | ((unsigned int)b << 16)) - -#ifdef _MSC_VER - #pragma warning (disable: 4996) // Switch off security warnings - #pragma warning (disable: 4100) // Switch off unreferenced formal parameter warnings - #ifdef __cplusplus - #define NSVG_INLINE inline - #else - #define NSVG_INLINE - #endif -#else - #define NSVG_INLINE inline -#endif - - -static int nsvg__isspace(char c) -{ - return strchr(" \t\n\v\f\r", c) != 0; -} - -static int nsvg__isdigit(char c) -{ - return c >= '0' && c <= '9'; -} - -static int nsvg__isnum(char c) -{ - return strchr("0123456789+-.eE", c) != 0; -} - -static NSVG_INLINE float nsvg__minf(float a, float b) { return a < b ? a : b; } -static NSVG_INLINE float nsvg__maxf(float a, float b) { return a > b ? a : b; } - - -// Simple XML parser - -#define NSVG_XML_TAG 1 -#define NSVG_XML_CONTENT 2 -#define NSVG_XML_MAX_ATTRIBS 256 - -static void nsvg__parseContent(char* s, - void (*contentCb)(void* ud, const char* s), - void* ud) -{ - // Trim start white spaces - while (*s && nsvg__isspace(*s)) s++; - if (!*s) return; - - if (contentCb) - (*contentCb)(ud, s); -} - -static void nsvg__parseElement(char* s, - void (*startelCb)(void* ud, const char* el, const char** attr), - void (*endelCb)(void* ud, const char* el), - void* ud) -{ - const char* attr[NSVG_XML_MAX_ATTRIBS]; - int nattr = 0; - char* name; - int start = 0; - int end = 0; - char quote; - - // Skip white space after the '<' - while (*s && nsvg__isspace(*s)) s++; - - // Check if the tag is end tag - if (*s == '/') { - s++; - end = 1; - } else { - start = 1; - } - - // Skip comments, data and preprocessor stuff. - if (!*s || *s == '?' || *s == '!') - return; - - // Get tag name - name = s; - while (*s && !nsvg__isspace(*s)) s++; - if (*s) { *s++ = '\0'; } - - // Get attribs - while (!end && *s && nattr < NSVG_XML_MAX_ATTRIBS-3) { - char* name = NULL; - char* value = NULL; - - // Skip white space before the attrib name - while (*s && nsvg__isspace(*s)) s++; - if (!*s) break; - if (*s == '/') { - end = 1; - break; - } - name = s; - // Find end of the attrib name. - while (*s && !nsvg__isspace(*s) && *s != '=') s++; - if (*s) { *s++ = '\0'; } - // Skip until the beginning of the value. - while (*s && *s != '\"' && *s != '\'') s++; - if (!*s) break; - quote = *s; - s++; - // Store value and find the end of it. - value = s; - while (*s && *s != quote) s++; - if (*s) { *s++ = '\0'; } - - // Store only well formed attributes - if (name && value) { - attr[nattr++] = name; - attr[nattr++] = value; - } - } - - // List terminator - attr[nattr++] = 0; - attr[nattr++] = 0; - - // Call callbacks. - if (start && startelCb) - (*startelCb)(ud, name, attr); - if (end && endelCb) - (*endelCb)(ud, name); -} - -int nsvg__parseXML(char* input, - void (*startelCb)(void* ud, const char* el, const char** attr), - void (*endelCb)(void* ud, const char* el), - void (*contentCb)(void* ud, const char* s), - void* ud) -{ - char* s = input; - char* mark = s; - int state = NSVG_XML_CONTENT; - while (*s) { - if (*s == '<' && state == NSVG_XML_CONTENT) { - // Start of a tag - *s++ = '\0'; - nsvg__parseContent(mark, contentCb, ud); - mark = s; - state = NSVG_XML_TAG; - } else if (*s == '>' && state == NSVG_XML_TAG) { - // Start of a content or new tag. - *s++ = '\0'; - nsvg__parseElement(mark, startelCb, endelCb, ud); - mark = s; - state = NSVG_XML_CONTENT; - } else { - s++; - } - } - - return 1; -} - - -/* Simple SVG parser. */ - -#define NSVG_MAX_ATTR 128 - -enum NSVGgradientUnits { - NSVG_USER_SPACE = 0, - NSVG_OBJECT_SPACE = 1 -}; - -#define NSVG_MAX_DASHES 8 - -enum NSVGunits { - NSVG_UNITS_USER, - NSVG_UNITS_PX, - NSVG_UNITS_PT, - NSVG_UNITS_PC, - NSVG_UNITS_MM, - NSVG_UNITS_CM, - NSVG_UNITS_IN, - NSVG_UNITS_PERCENT, - NSVG_UNITS_EM, - NSVG_UNITS_EX -}; - -typedef struct NSVGcoordinate { - float value; - int units; -} NSVGcoordinate; - -typedef struct NSVGlinearData { - NSVGcoordinate x1, y1, x2, y2; -} NSVGlinearData; - -typedef struct NSVGradialData { - NSVGcoordinate cx, cy, r, fx, fy; -} NSVGradialData; - -typedef struct NSVGgradientData -{ - char id[64]; - char ref[64]; - char type; - union { - NSVGlinearData linear; - NSVGradialData radial; - }; - char spread; - char units; - float xform[6]; - int nstops; - NSVGgradientStop* stops; - struct NSVGgradientData* next; -} NSVGgradientData; - -typedef struct NSVGattrib -{ - char id[64]; - float xform[6]; - unsigned int fillColor; - unsigned int strokeColor; - float opacity; - float fillOpacity; - float strokeOpacity; - char fillGradient[64]; - char strokeGradient[64]; - float strokeWidth; - float strokeDashOffset; - float strokeDashArray[NSVG_MAX_DASHES]; - int strokeDashCount; - char strokeLineJoin; - char strokeLineCap; - float miterLimit; - char fillRule; - float fontSize; - unsigned int stopColor; - float stopOpacity; - float stopOffset; - char hasFill; - char hasStroke; - char visible; -} NSVGattrib; - -typedef struct NSVGparser -{ - NSVGattrib attr[NSVG_MAX_ATTR]; - int attrHead; - float* pts; - int npts; - int cpts; - NSVGpath* plist; - NSVGimage* image; - NSVGgradientData* gradients; - NSVGshape* shapesTail; - float viewMinx, viewMiny, viewWidth, viewHeight; - int alignX, alignY, alignType; - float dpi; - char pathFlag; - char defsFlag; -} NSVGparser; - -static void nsvg__xformIdentity(float* t) -{ - t[0] = 1.0f; t[1] = 0.0f; - t[2] = 0.0f; t[3] = 1.0f; - t[4] = 0.0f; t[5] = 0.0f; -} - -static void nsvg__xformSetTranslation(float* t, float tx, float ty) -{ - t[0] = 1.0f; t[1] = 0.0f; - t[2] = 0.0f; t[3] = 1.0f; - t[4] = tx; t[5] = ty; -} - -static void nsvg__xformSetScale(float* t, float sx, float sy) -{ - t[0] = sx; t[1] = 0.0f; - t[2] = 0.0f; t[3] = sy; - t[4] = 0.0f; t[5] = 0.0f; -} - -static void nsvg__xformSetSkewX(float* t, float a) -{ - t[0] = 1.0f; t[1] = 0.0f; - t[2] = tanf(a); t[3] = 1.0f; - t[4] = 0.0f; t[5] = 0.0f; -} - -static void nsvg__xformSetSkewY(float* t, float a) -{ - t[0] = 1.0f; t[1] = tanf(a); - t[2] = 0.0f; t[3] = 1.0f; - t[4] = 0.0f; t[5] = 0.0f; -} - -static void nsvg__xformSetRotation(float* t, float a) -{ - float cs = cosf(a), sn = sinf(a); - t[0] = cs; t[1] = sn; - t[2] = -sn; t[3] = cs; - t[4] = 0.0f; t[5] = 0.0f; -} - -static void nsvg__xformMultiply(float* t, float* s) -{ - float t0 = t[0] * s[0] + t[1] * s[2]; - float t2 = t[2] * s[0] + t[3] * s[2]; - float t4 = t[4] * s[0] + t[5] * s[2] + s[4]; - t[1] = t[0] * s[1] + t[1] * s[3]; - t[3] = t[2] * s[1] + t[3] * s[3]; - t[5] = t[4] * s[1] + t[5] * s[3] + s[5]; - t[0] = t0; - t[2] = t2; - t[4] = t4; -} - -static void nsvg__xformInverse(float* inv, float* t) -{ - double invdet, det = (double)t[0] * t[3] - (double)t[2] * t[1]; - if (det > -1e-6 && det < 1e-6) { - nsvg__xformIdentity(t); - return; - } - invdet = 1.0 / det; - inv[0] = (float)(t[3] * invdet); - inv[2] = (float)(-t[2] * invdet); - inv[4] = (float)(((double)t[2] * t[5] - (double)t[3] * t[4]) * invdet); - inv[1] = (float)(-t[1] * invdet); - inv[3] = (float)(t[0] * invdet); - inv[5] = (float)(((double)t[1] * t[4] - (double)t[0] * t[5]) * invdet); -} - -static void nsvg__xformPremultiply(float* t, float* s) -{ - float s2[6]; - memcpy(s2, s, sizeof(float)*6); - nsvg__xformMultiply(s2, t); - memcpy(t, s2, sizeof(float)*6); -} - -static void nsvg__xformPoint(float* dx, float* dy, float x, float y, float* t) -{ - *dx = x*t[0] + y*t[2] + t[4]; - *dy = x*t[1] + y*t[3] + t[5]; -} - -static void nsvg__xformVec(float* dx, float* dy, float x, float y, float* t) -{ - *dx = x*t[0] + y*t[2]; - *dy = x*t[1] + y*t[3]; -} - -#define NSVG_EPSILON (1e-12) - -static int nsvg__ptInBounds(float* pt, float* bounds) -{ - return pt[0] >= bounds[0] && pt[0] <= bounds[2] && pt[1] >= bounds[1] && pt[1] <= bounds[3]; -} - - -static double nsvg__evalBezier(double t, double p0, double p1, double p2, double p3) -{ - double it = 1.0-t; - return it*it*it*p0 + 3.0*it*it*t*p1 + 3.0*it*t*t*p2 + t*t*t*p3; -} - -static void nsvg__curveBounds(float* bounds, float* curve) -{ - int i, j, count; - double roots[2], a, b, c, b2ac, t, v; - float* v0 = &curve[0]; - float* v1 = &curve[2]; - float* v2 = &curve[4]; - float* v3 = &curve[6]; - - // Start the bounding box by end points - bounds[0] = nsvg__minf(v0[0], v3[0]); - bounds[1] = nsvg__minf(v0[1], v3[1]); - bounds[2] = nsvg__maxf(v0[0], v3[0]); - bounds[3] = nsvg__maxf(v0[1], v3[1]); - - // Bezier curve fits inside the convex hull of it's control points. - // If control points are inside the bounds, we're done. - if (nsvg__ptInBounds(v1, bounds) && nsvg__ptInBounds(v2, bounds)) - return; - - // Add bezier curve inflection points in X and Y. - for (i = 0; i < 2; i++) { - a = -3.0 * v0[i] + 9.0 * v1[i] - 9.0 * v2[i] + 3.0 * v3[i]; - b = 6.0 * v0[i] - 12.0 * v1[i] + 6.0 * v2[i]; - c = 3.0 * v1[i] - 3.0 * v0[i]; - count = 0; - if (fabs(a) < NSVG_EPSILON) { - if (fabs(b) > NSVG_EPSILON) { - t = -c / b; - if (t > NSVG_EPSILON && t < 1.0-NSVG_EPSILON) - roots[count++] = t; - } - } else { - b2ac = b*b - 4.0*c*a; - if (b2ac > NSVG_EPSILON) { - t = (-b + sqrt(b2ac)) / (2.0 * a); - if (t > NSVG_EPSILON && t < 1.0-NSVG_EPSILON) - roots[count++] = t; - t = (-b - sqrt(b2ac)) / (2.0 * a); - if (t > NSVG_EPSILON && t < 1.0-NSVG_EPSILON) - roots[count++] = t; - } - } - for (j = 0; j < count; j++) { - v = nsvg__evalBezier(roots[j], v0[i], v1[i], v2[i], v3[i]); - bounds[0+i] = nsvg__minf(bounds[0+i], (float)v); - bounds[2+i] = nsvg__maxf(bounds[2+i], (float)v); - } - } -} - -static NSVGparser* nsvg__createParser() -{ - NSVGparser* p; - p = (NSVGparser*)malloc(sizeof(NSVGparser)); - if (p == NULL) goto error; - memset(p, 0, sizeof(NSVGparser)); - - p->image = (NSVGimage*)malloc(sizeof(NSVGimage)); - if (p->image == NULL) goto error; - memset(p->image, 0, sizeof(NSVGimage)); - - // Init style - nsvg__xformIdentity(p->attr[0].xform); - memset(p->attr[0].id, 0, sizeof p->attr[0].id); - p->attr[0].fillColor = NSVG_RGB(0,0,0); - p->attr[0].strokeColor = NSVG_RGB(0,0,0); - p->attr[0].opacity = 1; - p->attr[0].fillOpacity = 1; - p->attr[0].strokeOpacity = 1; - p->attr[0].stopOpacity = 1; - p->attr[0].strokeWidth = 1; - p->attr[0].strokeLineJoin = NSVG_JOIN_MITER; - p->attr[0].strokeLineCap = NSVG_CAP_BUTT; - p->attr[0].miterLimit = 4; - p->attr[0].fillRule = NSVG_FILLRULE_NONZERO; - p->attr[0].hasFill = 1; - p->attr[0].visible = 1; - - return p; - -error: - if (p) { - if (p->image) free(p->image); - free(p); - } - return NULL; -} - -static void nsvg__deletePaths(NSVGpath* path) -{ - while (path) { - NSVGpath *next = path->next; - if (path->pts != NULL) - free(path->pts); - free(path); - path = next; - } -} - -static void nsvg__deletePaint(NSVGpaint* paint) -{ - if (paint->type == NSVG_PAINT_LINEAR_GRADIENT || paint->type == NSVG_PAINT_RADIAL_GRADIENT) - free(paint->gradient); -} - -static void nsvg__deleteGradientData(NSVGgradientData* grad) -{ - NSVGgradientData* next; - while (grad != NULL) { - next = grad->next; - free(grad->stops); - free(grad); - grad = next; - } -} - -static void nsvg__deleteParser(NSVGparser* p) -{ - if (p != NULL) { - nsvg__deletePaths(p->plist); - nsvg__deleteGradientData(p->gradients); - nsvgDelete(p->image); - free(p->pts); - free(p); - } -} - -static void nsvg__resetPath(NSVGparser* p) -{ - p->npts = 0; -} - -static void nsvg__addPoint(NSVGparser* p, float x, float y) -{ - if (p->npts+1 > p->cpts) { - p->cpts = p->cpts ? p->cpts*2 : 8; - p->pts = (float*)realloc(p->pts, p->cpts*2*sizeof(float)); - if (!p->pts) return; - } - p->pts[p->npts*2+0] = x; - p->pts[p->npts*2+1] = y; - p->npts++; -} - -static void nsvg__moveTo(NSVGparser* p, float x, float y) -{ - if (p->npts > 0) { - p->pts[(p->npts-1)*2+0] = x; - p->pts[(p->npts-1)*2+1] = y; - } else { - nsvg__addPoint(p, x, y); - } -} - -static void nsvg__lineTo(NSVGparser* p, float x, float y) -{ - float px,py, dx,dy; - if (p->npts > 0) { - px = p->pts[(p->npts-1)*2+0]; - py = p->pts[(p->npts-1)*2+1]; - dx = x - px; - dy = y - py; - nsvg__addPoint(p, px + dx/3.0f, py + dy/3.0f); - nsvg__addPoint(p, x - dx/3.0f, y - dy/3.0f); - nsvg__addPoint(p, x, y); - } -} - -static void nsvg__cubicBezTo(NSVGparser* p, float cpx1, float cpy1, float cpx2, float cpy2, float x, float y) -{ - nsvg__addPoint(p, cpx1, cpy1); - nsvg__addPoint(p, cpx2, cpy2); - nsvg__addPoint(p, x, y); -} - -static NSVGattrib* nsvg__getAttr(NSVGparser* p) -{ - return &p->attr[p->attrHead]; -} - -static void nsvg__pushAttr(NSVGparser* p) -{ - if (p->attrHead < NSVG_MAX_ATTR-1) { - p->attrHead++; - memcpy(&p->attr[p->attrHead], &p->attr[p->attrHead-1], sizeof(NSVGattrib)); - } -} - -static void nsvg__popAttr(NSVGparser* p) -{ - if (p->attrHead > 0) - p->attrHead--; -} - -static float nsvg__actualOrigX(NSVGparser* p) -{ - return p->viewMinx; -} - -static float nsvg__actualOrigY(NSVGparser* p) -{ - return p->viewMiny; -} - -static float nsvg__actualWidth(NSVGparser* p) -{ - return p->viewWidth; -} - -static float nsvg__actualHeight(NSVGparser* p) -{ - return p->viewHeight; -} - -static float nsvg__actualLength(NSVGparser* p) -{ - float w = nsvg__actualWidth(p), h = nsvg__actualHeight(p); - return sqrtf(w*w + h*h) / sqrtf(2.0f); -} - -static float nsvg__convertToPixels(NSVGparser* p, NSVGcoordinate c, float orig, float length) -{ - NSVGattrib* attr = nsvg__getAttr(p); - switch (c.units) { - case NSVG_UNITS_USER: return c.value; - case NSVG_UNITS_PX: return c.value; - case NSVG_UNITS_PT: return c.value / 72.0f * p->dpi; - case NSVG_UNITS_PC: return c.value / 6.0f * p->dpi; - case NSVG_UNITS_MM: return c.value / 25.4f * p->dpi; - case NSVG_UNITS_CM: return c.value / 2.54f * p->dpi; - case NSVG_UNITS_IN: return c.value * p->dpi; - case NSVG_UNITS_EM: return c.value * attr->fontSize; - case NSVG_UNITS_EX: return c.value * attr->fontSize * 0.52f; // x-height of Helvetica. - case NSVG_UNITS_PERCENT: return orig + c.value / 100.0f * length; - default: return c.value; - } - return c.value; -} - -static NSVGgradientData* nsvg__findGradientData(NSVGparser* p, const char* id) -{ - NSVGgradientData* grad = p->gradients; - while (grad) { - if (strcmp(grad->id, id) == 0) - return grad; - grad = grad->next; - } - return NULL; -} - -static NSVGgradient* nsvg__createGradient(NSVGparser* p, const char* id, const float* localBounds, char* paintType) -{ - NSVGattrib* attr = nsvg__getAttr(p); - NSVGgradientData* data = NULL; - NSVGgradientData* ref = NULL; - NSVGgradientStop* stops = NULL; - NSVGgradient* grad; - float ox, oy, sw, sh, sl; - int nstops = 0; - - data = nsvg__findGradientData(p, id); - if (data == NULL) return NULL; - - // TODO: use ref to fill in all unset values too. - ref = data; - while (ref != NULL) { - if (stops == NULL && ref->stops != NULL) { - stops = ref->stops; - nstops = ref->nstops; - break; - } - ref = nsvg__findGradientData(p, ref->ref); - } - if (stops == NULL) return NULL; - - grad = (NSVGgradient*)malloc(sizeof(NSVGgradient) + sizeof(NSVGgradientStop)*(nstops-1)); - if (grad == NULL) return NULL; - - // The shape width and height. - if (data->units == NSVG_OBJECT_SPACE) { - ox = localBounds[0]; - oy = localBounds[1]; - sw = localBounds[2] - localBounds[0]; - sh = localBounds[3] - localBounds[1]; - } else { - ox = nsvg__actualOrigX(p); - oy = nsvg__actualOrigY(p); - sw = nsvg__actualWidth(p); - sh = nsvg__actualHeight(p); - } - sl = sqrtf(sw*sw + sh*sh) / sqrtf(2.0f); - - if (data->type == NSVG_PAINT_LINEAR_GRADIENT) { - float x1, y1, x2, y2, dx, dy; - x1 = nsvg__convertToPixels(p, data->linear.x1, ox, sw); - y1 = nsvg__convertToPixels(p, data->linear.y1, oy, sh); - x2 = nsvg__convertToPixels(p, data->linear.x2, ox, sw); - y2 = nsvg__convertToPixels(p, data->linear.y2, oy, sh); - // Calculate transform aligned to the line - dx = x2 - x1; - dy = y2 - y1; - grad->xform[0] = dy; grad->xform[1] = -dx; - grad->xform[2] = dx; grad->xform[3] = dy; - grad->xform[4] = x1; grad->xform[5] = y1; - } else { - float cx, cy, fx, fy, r; - cx = nsvg__convertToPixels(p, data->radial.cx, ox, sw); - cy = nsvg__convertToPixels(p, data->radial.cy, oy, sh); - fx = nsvg__convertToPixels(p, data->radial.fx, ox, sw); - fy = nsvg__convertToPixels(p, data->radial.fy, oy, sh); - r = nsvg__convertToPixels(p, data->radial.r, 0, sl); - // Calculate transform aligned to the circle - grad->xform[0] = r; grad->xform[1] = 0; - grad->xform[2] = 0; grad->xform[3] = r; - grad->xform[4] = cx; grad->xform[5] = cy; - grad->fx = fx / r; - grad->fy = fy / r; - } - - nsvg__xformMultiply(grad->xform, data->xform); - nsvg__xformMultiply(grad->xform, attr->xform); - - grad->spread = data->spread; - memcpy(grad->stops, stops, nstops*sizeof(NSVGgradientStop)); - grad->nstops = nstops; - - *paintType = data->type; - - return grad; -} - -static float nsvg__getAverageScale(float* t) -{ - float sx = sqrtf(t[0]*t[0] + t[2]*t[2]); - float sy = sqrtf(t[1]*t[1] + t[3]*t[3]); - return (sx + sy) * 0.5f; -} - -static void nsvg__getLocalBounds(float* bounds, NSVGshape *shape, float* xform) -{ - NSVGpath* path; - float curve[4*2], curveBounds[4]; - int i, first = 1; - for (path = shape->paths; path != NULL; path = path->next) { - nsvg__xformPoint(&curve[0], &curve[1], path->pts[0], path->pts[1], xform); - for (i = 0; i < path->npts-1; i += 3) { - nsvg__xformPoint(&curve[2], &curve[3], path->pts[(i+1)*2], path->pts[(i+1)*2+1], xform); - nsvg__xformPoint(&curve[4], &curve[5], path->pts[(i+2)*2], path->pts[(i+2)*2+1], xform); - nsvg__xformPoint(&curve[6], &curve[7], path->pts[(i+3)*2], path->pts[(i+3)*2+1], xform); - nsvg__curveBounds(curveBounds, curve); - if (first) { - bounds[0] = curveBounds[0]; - bounds[1] = curveBounds[1]; - bounds[2] = curveBounds[2]; - bounds[3] = curveBounds[3]; - first = 0; - } else { - bounds[0] = nsvg__minf(bounds[0], curveBounds[0]); - bounds[1] = nsvg__minf(bounds[1], curveBounds[1]); - bounds[2] = nsvg__maxf(bounds[2], curveBounds[2]); - bounds[3] = nsvg__maxf(bounds[3], curveBounds[3]); - } - curve[0] = curve[6]; - curve[1] = curve[7]; - } - } -} - -static void nsvg__addShape(NSVGparser* p) -{ - NSVGattrib* attr = nsvg__getAttr(p); - float scale = 1.0f; - NSVGshape* shape; - NSVGpath* path; - int i; - - if (p->plist == NULL) - return; - - shape = (NSVGshape*)malloc(sizeof(NSVGshape)); - if (shape == NULL) goto error; - memset(shape, 0, sizeof(NSVGshape)); - - memcpy(shape->id, attr->id, sizeof shape->id); - scale = nsvg__getAverageScale(attr->xform); - shape->strokeWidth = attr->strokeWidth * scale; - shape->strokeDashOffset = attr->strokeDashOffset * scale; - shape->strokeDashCount = (char)attr->strokeDashCount; - for (i = 0; i < attr->strokeDashCount; i++) - shape->strokeDashArray[i] = attr->strokeDashArray[i] * scale; - shape->strokeLineJoin = attr->strokeLineJoin; - shape->strokeLineCap = attr->strokeLineCap; - shape->miterLimit = attr->miterLimit; - shape->fillRule = attr->fillRule; - shape->opacity = attr->opacity; - - shape->paths = p->plist; - p->plist = NULL; - - // Calculate shape bounds - shape->bounds[0] = shape->paths->bounds[0]; - shape->bounds[1] = shape->paths->bounds[1]; - shape->bounds[2] = shape->paths->bounds[2]; - shape->bounds[3] = shape->paths->bounds[3]; - for (path = shape->paths->next; path != NULL; path = path->next) { - shape->bounds[0] = nsvg__minf(shape->bounds[0], path->bounds[0]); - shape->bounds[1] = nsvg__minf(shape->bounds[1], path->bounds[1]); - shape->bounds[2] = nsvg__maxf(shape->bounds[2], path->bounds[2]); - shape->bounds[3] = nsvg__maxf(shape->bounds[3], path->bounds[3]); - } - - // Set fill - if (attr->hasFill == 0) { - shape->fill.type = NSVG_PAINT_NONE; - } else if (attr->hasFill == 1) { - shape->fill.type = NSVG_PAINT_COLOR; - shape->fill.color = attr->fillColor; - shape->fill.color |= (unsigned int)(attr->fillOpacity*255) << 24; - } else if (attr->hasFill == 2) { - float inv[6], localBounds[4]; - nsvg__xformInverse(inv, attr->xform); - nsvg__getLocalBounds(localBounds, shape, inv); - shape->fill.gradient = nsvg__createGradient(p, attr->fillGradient, localBounds, &shape->fill.type); - if (shape->fill.gradient == NULL) { - shape->fill.type = NSVG_PAINT_NONE; - } - } - - // Set stroke - if (attr->hasStroke == 0) { - shape->stroke.type = NSVG_PAINT_NONE; - } else if (attr->hasStroke == 1) { - shape->stroke.type = NSVG_PAINT_COLOR; - shape->stroke.color = attr->strokeColor; - shape->stroke.color |= (unsigned int)(attr->strokeOpacity*255) << 24; - } else if (attr->hasStroke == 2) { - float inv[6], localBounds[4]; - nsvg__xformInverse(inv, attr->xform); - nsvg__getLocalBounds(localBounds, shape, inv); - shape->stroke.gradient = nsvg__createGradient(p, attr->strokeGradient, localBounds, &shape->stroke.type); - if (shape->stroke.gradient == NULL) - shape->stroke.type = NSVG_PAINT_NONE; - } - - // Set flags - shape->flags = (attr->visible ? NSVG_FLAGS_VISIBLE : 0x00); - - // Add to tail - if (p->image->shapes == NULL) - p->image->shapes = shape; - else - p->shapesTail->next = shape; - p->shapesTail = shape; - - return; - -error: - if (shape) free(shape); -} - -static void nsvg__addPath(NSVGparser* p, char closed) -{ - NSVGattrib* attr = nsvg__getAttr(p); - NSVGpath* path = NULL; - float bounds[4]; - float* curve; - int i; - - if (p->npts < 4) - return; - - if (closed) - nsvg__lineTo(p, p->pts[0], p->pts[1]); - - path = (NSVGpath*)malloc(sizeof(NSVGpath)); - if (path == NULL) goto error; - memset(path, 0, sizeof(NSVGpath)); - - path->pts = (float*)malloc(p->npts*2*sizeof(float)); - if (path->pts == NULL) goto error; - path->closed = closed; - path->npts = p->npts; - - // Transform path. - for (i = 0; i < p->npts; ++i) - nsvg__xformPoint(&path->pts[i*2], &path->pts[i*2+1], p->pts[i*2], p->pts[i*2+1], attr->xform); - - // Find bounds - for (i = 0; i < path->npts-1; i += 3) { - curve = &path->pts[i*2]; - nsvg__curveBounds(bounds, curve); - if (i == 0) { - path->bounds[0] = bounds[0]; - path->bounds[1] = bounds[1]; - path->bounds[2] = bounds[2]; - path->bounds[3] = bounds[3]; - } else { - path->bounds[0] = nsvg__minf(path->bounds[0], bounds[0]); - path->bounds[1] = nsvg__minf(path->bounds[1], bounds[1]); - path->bounds[2] = nsvg__maxf(path->bounds[2], bounds[2]); - path->bounds[3] = nsvg__maxf(path->bounds[3], bounds[3]); - } - } - - path->next = p->plist; - p->plist = path; - - return; - -error: - if (path != NULL) { - if (path->pts != NULL) free(path->pts); - free(path); - } -} - -// We roll our own string to float because the std library one uses locale and messes things up. -static double nsvg__atof(const char* s) -{ - char* cur = (char*)s; - char* end = NULL; - double res = 0.0, sign = 1.0; - long long intPart = 0, fracPart = 0; - char hasIntPart = 0, hasFracPart = 0; - - // Parse optional sign - if (*cur == '+') { - cur++; - } else if (*cur == '-') { - sign = -1; - cur++; - } - - // Parse integer part - if (nsvg__isdigit(*cur)) { - // Parse digit sequence - intPart = (double)strtoll(cur, &end, 10); - if (cur != end) { - res = (double)intPart; - hasIntPart = 1; - cur = end; - } - } - - // Parse fractional part. - if (*cur == '.') { - cur++; // Skip '.' - if (nsvg__isdigit(*cur)) { - // Parse digit sequence - fracPart = strtoll(cur, &end, 10); - if (cur != end) { - res += (double)fracPart / pow(10.0, (double)(end - cur)); - hasFracPart = 1; - cur = end; - } - } - } - - // A valid number should have integer or fractional part. - if (!hasIntPart && !hasFracPart) - return 0.0; - - // Parse optional exponent - if (*cur == 'e' || *cur == 'E') { - int expPart = 0; - cur++; // skip 'E' - expPart = strtol(cur, &end, 10); // Parse digit sequence with sign - if (cur != end) { - res *= pow(10.0, (double)expPart); - } - } - - return res * sign; -} - - -static const char* nsvg__parseNumber(const char* s, char* it, const int size) -{ - const int last = size-1; - int i = 0; - - // sign - if (*s == '-' || *s == '+') { - if (i < last) it[i++] = *s; - s++; - } - // integer part - while (*s && nsvg__isdigit(*s)) { - if (i < last) it[i++] = *s; - s++; - } - if (*s == '.') { - // decimal point - if (i < last) it[i++] = *s; - s++; - // fraction part - while (*s && nsvg__isdigit(*s)) { - if (i < last) it[i++] = *s; - s++; - } - } - // exponent - if (*s == 'e' || *s == 'E') { - if (i < last) it[i++] = *s; - s++; - if (*s == '-' || *s == '+') { - if (i < last) it[i++] = *s; - s++; - } - while (*s && nsvg__isdigit(*s)) { - if (i < last) it[i++] = *s; - s++; - } - } - it[i] = '\0'; - - return s; -} - -static const char* nsvg__getNextPathItem(const char* s, char* it) -{ - it[0] = '\0'; - // Skip white spaces and commas - while (*s && (nsvg__isspace(*s) || *s == ',')) s++; - if (!*s) return s; - if (*s == '-' || *s == '+' || *s == '.' || nsvg__isdigit(*s)) { - s = nsvg__parseNumber(s, it, 64); - } else { - // Parse command - it[0] = *s++; - it[1] = '\0'; - return s; - } - - return s; -} - -static unsigned int nsvg__parseColorHex(const char* str) -{ - unsigned int c = 0, r = 0, g = 0, b = 0; - int n = 0; - str++; // skip # - // Calculate number of characters. - while(str[n] && !nsvg__isspace(str[n])) - n++; - if (n == 6) { - sscanf(str, "%x", &c); - } else if (n == 3) { - sscanf(str, "%x", &c); - c = (c&0xf) | ((c&0xf0) << 4) | ((c&0xf00) << 8); - c |= c<<4; - } - r = (c >> 16) & 0xff; - g = (c >> 8) & 0xff; - b = c & 0xff; - return NSVG_RGB(r,g,b); -} - -static unsigned int nsvg__parseColorRGB(const char* str) -{ - int r = -1, g = -1, b = -1; - char s1[32]="", s2[32]=""; - sscanf(str + 4, "%d%[%%, \t]%d%[%%, \t]%d", &r, s1, &g, s2, &b); - if (strchr(s1, '%')) { - return NSVG_RGB((r*255)/100,(g*255)/100,(b*255)/100); - } else { - return NSVG_RGB(r,g,b); - } -} - -typedef struct NSVGNamedColor { - const char* name; - unsigned int color; -} NSVGNamedColor; - -NSVGNamedColor nsvg__colors[] = { - - { "red", NSVG_RGB(255, 0, 0) }, - { "green", NSVG_RGB( 0, 128, 0) }, - { "blue", NSVG_RGB( 0, 0, 255) }, - { "yellow", NSVG_RGB(255, 255, 0) }, - { "cyan", NSVG_RGB( 0, 255, 255) }, - { "magenta", NSVG_RGB(255, 0, 255) }, - { "black", NSVG_RGB( 0, 0, 0) }, - { "grey", NSVG_RGB(128, 128, 128) }, - { "gray", NSVG_RGB(128, 128, 128) }, - { "white", NSVG_RGB(255, 255, 255) }, - -#ifdef NANOSVG_ALL_COLOR_KEYWORDS - { "aliceblue", NSVG_RGB(240, 248, 255) }, - { "antiquewhite", NSVG_RGB(250, 235, 215) }, - { "aqua", NSVG_RGB( 0, 255, 255) }, - { "aquamarine", NSVG_RGB(127, 255, 212) }, - { "azure", NSVG_RGB(240, 255, 255) }, - { "beige", NSVG_RGB(245, 245, 220) }, - { "bisque", NSVG_RGB(255, 228, 196) }, - { "blanchedalmond", NSVG_RGB(255, 235, 205) }, - { "blueviolet", NSVG_RGB(138, 43, 226) }, - { "brown", NSVG_RGB(165, 42, 42) }, - { "burlywood", NSVG_RGB(222, 184, 135) }, - { "cadetblue", NSVG_RGB( 95, 158, 160) }, - { "chartreuse", NSVG_RGB(127, 255, 0) }, - { "chocolate", NSVG_RGB(210, 105, 30) }, - { "coral", NSVG_RGB(255, 127, 80) }, - { "cornflowerblue", NSVG_RGB(100, 149, 237) }, - { "cornsilk", NSVG_RGB(255, 248, 220) }, - { "crimson", NSVG_RGB(220, 20, 60) }, - { "darkblue", NSVG_RGB( 0, 0, 139) }, - { "darkcyan", NSVG_RGB( 0, 139, 139) }, - { "darkgoldenrod", NSVG_RGB(184, 134, 11) }, - { "darkgray", NSVG_RGB(169, 169, 169) }, - { "darkgreen", NSVG_RGB( 0, 100, 0) }, - { "darkgrey", NSVG_RGB(169, 169, 169) }, - { "darkkhaki", NSVG_RGB(189, 183, 107) }, - { "darkmagenta", NSVG_RGB(139, 0, 139) }, - { "darkolivegreen", NSVG_RGB( 85, 107, 47) }, - { "darkorange", NSVG_RGB(255, 140, 0) }, - { "darkorchid", NSVG_RGB(153, 50, 204) }, - { "darkred", NSVG_RGB(139, 0, 0) }, - { "darksalmon", NSVG_RGB(233, 150, 122) }, - { "darkseagreen", NSVG_RGB(143, 188, 143) }, - { "darkslateblue", NSVG_RGB( 72, 61, 139) }, - { "darkslategray", NSVG_RGB( 47, 79, 79) }, - { "darkslategrey", NSVG_RGB( 47, 79, 79) }, - { "darkturquoise", NSVG_RGB( 0, 206, 209) }, - { "darkviolet", NSVG_RGB(148, 0, 211) }, - { "deeppink", NSVG_RGB(255, 20, 147) }, - { "deepskyblue", NSVG_RGB( 0, 191, 255) }, - { "dimgray", NSVG_RGB(105, 105, 105) }, - { "dimgrey", NSVG_RGB(105, 105, 105) }, - { "dodgerblue", NSVG_RGB( 30, 144, 255) }, - { "firebrick", NSVG_RGB(178, 34, 34) }, - { "floralwhite", NSVG_RGB(255, 250, 240) }, - { "forestgreen", NSVG_RGB( 34, 139, 34) }, - { "fuchsia", NSVG_RGB(255, 0, 255) }, - { "gainsboro", NSVG_RGB(220, 220, 220) }, - { "ghostwhite", NSVG_RGB(248, 248, 255) }, - { "gold", NSVG_RGB(255, 215, 0) }, - { "goldenrod", NSVG_RGB(218, 165, 32) }, - { "greenyellow", NSVG_RGB(173, 255, 47) }, - { "honeydew", NSVG_RGB(240, 255, 240) }, - { "hotpink", NSVG_RGB(255, 105, 180) }, - { "indianred", NSVG_RGB(205, 92, 92) }, - { "indigo", NSVG_RGB( 75, 0, 130) }, - { "ivory", NSVG_RGB(255, 255, 240) }, - { "khaki", NSVG_RGB(240, 230, 140) }, - { "lavender", NSVG_RGB(230, 230, 250) }, - { "lavenderblush", NSVG_RGB(255, 240, 245) }, - { "lawngreen", NSVG_RGB(124, 252, 0) }, - { "lemonchiffon", NSVG_RGB(255, 250, 205) }, - { "lightblue", NSVG_RGB(173, 216, 230) }, - { "lightcoral", NSVG_RGB(240, 128, 128) }, - { "lightcyan", NSVG_RGB(224, 255, 255) }, - { "lightgoldenrodyellow", NSVG_RGB(250, 250, 210) }, - { "lightgray", NSVG_RGB(211, 211, 211) }, - { "lightgreen", NSVG_RGB(144, 238, 144) }, - { "lightgrey", NSVG_RGB(211, 211, 211) }, - { "lightpink", NSVG_RGB(255, 182, 193) }, - { "lightsalmon", NSVG_RGB(255, 160, 122) }, - { "lightseagreen", NSVG_RGB( 32, 178, 170) }, - { "lightskyblue", NSVG_RGB(135, 206, 250) }, - { "lightslategray", NSVG_RGB(119, 136, 153) }, - { "lightslategrey", NSVG_RGB(119, 136, 153) }, - { "lightsteelblue", NSVG_RGB(176, 196, 222) }, - { "lightyellow", NSVG_RGB(255, 255, 224) }, - { "lime", NSVG_RGB( 0, 255, 0) }, - { "limegreen", NSVG_RGB( 50, 205, 50) }, - { "linen", NSVG_RGB(250, 240, 230) }, - { "maroon", NSVG_RGB(128, 0, 0) }, - { "mediumaquamarine", NSVG_RGB(102, 205, 170) }, - { "mediumblue", NSVG_RGB( 0, 0, 205) }, - { "mediumorchid", NSVG_RGB(186, 85, 211) }, - { "mediumpurple", NSVG_RGB(147, 112, 219) }, - { "mediumseagreen", NSVG_RGB( 60, 179, 113) }, - { "mediumslateblue", NSVG_RGB(123, 104, 238) }, - { "mediumspringgreen", NSVG_RGB( 0, 250, 154) }, - { "mediumturquoise", NSVG_RGB( 72, 209, 204) }, - { "mediumvioletred", NSVG_RGB(199, 21, 133) }, - { "midnightblue", NSVG_RGB( 25, 25, 112) }, - { "mintcream", NSVG_RGB(245, 255, 250) }, - { "mistyrose", NSVG_RGB(255, 228, 225) }, - { "moccasin", NSVG_RGB(255, 228, 181) }, - { "navajowhite", NSVG_RGB(255, 222, 173) }, - { "navy", NSVG_RGB( 0, 0, 128) }, - { "oldlace", NSVG_RGB(253, 245, 230) }, - { "olive", NSVG_RGB(128, 128, 0) }, - { "olivedrab", NSVG_RGB(107, 142, 35) }, - { "orange", NSVG_RGB(255, 165, 0) }, - { "orangered", NSVG_RGB(255, 69, 0) }, - { "orchid", NSVG_RGB(218, 112, 214) }, - { "palegoldenrod", NSVG_RGB(238, 232, 170) }, - { "palegreen", NSVG_RGB(152, 251, 152) }, - { "paleturquoise", NSVG_RGB(175, 238, 238) }, - { "palevioletred", NSVG_RGB(219, 112, 147) }, - { "papayawhip", NSVG_RGB(255, 239, 213) }, - { "peachpuff", NSVG_RGB(255, 218, 185) }, - { "peru", NSVG_RGB(205, 133, 63) }, - { "pink", NSVG_RGB(255, 192, 203) }, - { "plum", NSVG_RGB(221, 160, 221) }, - { "powderblue", NSVG_RGB(176, 224, 230) }, - { "purple", NSVG_RGB(128, 0, 128) }, - { "rosybrown", NSVG_RGB(188, 143, 143) }, - { "royalblue", NSVG_RGB( 65, 105, 225) }, - { "saddlebrown", NSVG_RGB(139, 69, 19) }, - { "salmon", NSVG_RGB(250, 128, 114) }, - { "sandybrown", NSVG_RGB(244, 164, 96) }, - { "seagreen", NSVG_RGB( 46, 139, 87) }, - { "seashell", NSVG_RGB(255, 245, 238) }, - { "sienna", NSVG_RGB(160, 82, 45) }, - { "silver", NSVG_RGB(192, 192, 192) }, - { "skyblue", NSVG_RGB(135, 206, 235) }, - { "slateblue", NSVG_RGB(106, 90, 205) }, - { "slategray", NSVG_RGB(112, 128, 144) }, - { "slategrey", NSVG_RGB(112, 128, 144) }, - { "snow", NSVG_RGB(255, 250, 250) }, - { "springgreen", NSVG_RGB( 0, 255, 127) }, - { "steelblue", NSVG_RGB( 70, 130, 180) }, - { "tan", NSVG_RGB(210, 180, 140) }, - { "teal", NSVG_RGB( 0, 128, 128) }, - { "thistle", NSVG_RGB(216, 191, 216) }, - { "tomato", NSVG_RGB(255, 99, 71) }, - { "turquoise", NSVG_RGB( 64, 224, 208) }, - { "violet", NSVG_RGB(238, 130, 238) }, - { "wheat", NSVG_RGB(245, 222, 179) }, - { "whitesmoke", NSVG_RGB(245, 245, 245) }, - { "yellowgreen", NSVG_RGB(154, 205, 50) }, -#endif -}; - -static unsigned int nsvg__parseColorName(const char* str) -{ - int i, ncolors = sizeof(nsvg__colors) / sizeof(NSVGNamedColor); - - for (i = 0; i < ncolors; i++) { - if (strcmp(nsvg__colors[i].name, str) == 0) { - return nsvg__colors[i].color; - } - } - - return NSVG_RGB(128, 128, 128); -} - -static unsigned int nsvg__parseColor(const char* str) -{ - size_t len = 0; - while(*str == ' ') ++str; - len = strlen(str); - if (len >= 1 && *str == '#') - return nsvg__parseColorHex(str); - else if (len >= 4 && str[0] == 'r' && str[1] == 'g' && str[2] == 'b' && str[3] == '(') - return nsvg__parseColorRGB(str); - return nsvg__parseColorName(str); -} - -static float nsvg__parseOpacity(const char* str) -{ - float val = nsvg__atof(str); - if (val < 0.0f) val = 0.0f; - if (val > 1.0f) val = 1.0f; - return val; -} - -static float nsvg__parseMiterLimit(const char* str) -{ - float val = nsvg__atof(str); - if (val < 0.0f) val = 0.0f; - return val; -} - -static int nsvg__parseUnits(const char* units) -{ - if (units[0] == 'p' && units[1] == 'x') - return NSVG_UNITS_PX; - else if (units[0] == 'p' && units[1] == 't') - return NSVG_UNITS_PT; - else if (units[0] == 'p' && units[1] == 'c') - return NSVG_UNITS_PC; - else if (units[0] == 'm' && units[1] == 'm') - return NSVG_UNITS_MM; - else if (units[0] == 'c' && units[1] == 'm') - return NSVG_UNITS_CM; - else if (units[0] == 'i' && units[1] == 'n') - return NSVG_UNITS_IN; - else if (units[0] == '%') - return NSVG_UNITS_PERCENT; - else if (units[0] == 'e' && units[1] == 'm') - return NSVG_UNITS_EM; - else if (units[0] == 'e' && units[1] == 'x') - return NSVG_UNITS_EX; - return NSVG_UNITS_USER; -} - -static NSVGcoordinate nsvg__parseCoordinateRaw(const char* str) -{ - NSVGcoordinate coord = {0, NSVG_UNITS_USER}; - char buf[64]; - coord.units = nsvg__parseUnits(nsvg__parseNumber(str, buf, 64)); - coord.value = nsvg__atof(buf); - return coord; -} - -static NSVGcoordinate nsvg__coord(float v, int units) -{ - NSVGcoordinate coord = {v, units}; - return coord; -} - -static float nsvg__parseCoordinate(NSVGparser* p, const char* str, float orig, float length) -{ - NSVGcoordinate coord = nsvg__parseCoordinateRaw(str); - return nsvg__convertToPixels(p, coord, orig, length); -} - -static int nsvg__parseTransformArgs(const char* str, float* args, int maxNa, int* na) -{ - const char* end; - const char* ptr; - char it[64]; - - *na = 0; - ptr = str; - while (*ptr && *ptr != '(') ++ptr; - if (*ptr == 0) - return 1; - end = ptr; - while (*end && *end != ')') ++end; - if (*end == 0) - return 1; - - while (ptr < end) { - if (*ptr == '-' || *ptr == '+' || *ptr == '.' || nsvg__isdigit(*ptr)) { - if (*na >= maxNa) return 0; - ptr = nsvg__parseNumber(ptr, it, 64); - args[(*na)++] = (float)nsvg__atof(it); - } else { - ++ptr; - } - } - return (int)(end - str); -} - - -static int nsvg__parseMatrix(float* xform, const char* str) -{ - float t[6]; - int na = 0; - int len = nsvg__parseTransformArgs(str, t, 6, &na); - if (na != 6) return len; - memcpy(xform, t, sizeof(float)*6); - return len; -} - -static int nsvg__parseTranslate(float* xform, const char* str) -{ - float args[2]; - float t[6]; - int na = 0; - int len = nsvg__parseTransformArgs(str, args, 2, &na); - if (na == 1) args[1] = 0.0; - - nsvg__xformSetTranslation(t, args[0], args[1]); - memcpy(xform, t, sizeof(float)*6); - return len; -} - -static int nsvg__parseScale(float* xform, const char* str) -{ - float args[2]; - int na = 0; - float t[6]; - int len = nsvg__parseTransformArgs(str, args, 2, &na); - if (na == 1) args[1] = args[0]; - nsvg__xformSetScale(t, args[0], args[1]); - memcpy(xform, t, sizeof(float)*6); - return len; -} - -static int nsvg__parseSkewX(float* xform, const char* str) -{ - float args[1]; - int na = 0; - float t[6]; - int len = nsvg__parseTransformArgs(str, args, 1, &na); - nsvg__xformSetSkewX(t, args[0]/180.0f*NSVG_PI); - memcpy(xform, t, sizeof(float)*6); - return len; -} - -static int nsvg__parseSkewY(float* xform, const char* str) -{ - float args[1]; - int na = 0; - float t[6]; - int len = nsvg__parseTransformArgs(str, args, 1, &na); - nsvg__xformSetSkewY(t, args[0]/180.0f*NSVG_PI); - memcpy(xform, t, sizeof(float)*6); - return len; -} - -static int nsvg__parseRotate(float* xform, const char* str) -{ - float args[3]; - int na = 0; - float m[6]; - float t[6]; - int len = nsvg__parseTransformArgs(str, args, 3, &na); - if (na == 1) - args[1] = args[2] = 0.0f; - nsvg__xformIdentity(m); - - if (na > 1) { - nsvg__xformSetTranslation(t, -args[1], -args[2]); - nsvg__xformMultiply(m, t); - } - - nsvg__xformSetRotation(t, args[0]/180.0f*NSVG_PI); - nsvg__xformMultiply(m, t); - - if (na > 1) { - nsvg__xformSetTranslation(t, args[1], args[2]); - nsvg__xformMultiply(m, t); - } - - memcpy(xform, m, sizeof(float)*6); - - return len; -} - -static void nsvg__parseTransform(float* xform, const char* str) -{ - float t[6]; - nsvg__xformIdentity(xform); - while (*str) - { - if (strncmp(str, "matrix", 6) == 0) - str += nsvg__parseMatrix(t, str); - else if (strncmp(str, "translate", 9) == 0) - str += nsvg__parseTranslate(t, str); - else if (strncmp(str, "scale", 5) == 0) - str += nsvg__parseScale(t, str); - else if (strncmp(str, "rotate", 6) == 0) - str += nsvg__parseRotate(t, str); - else if (strncmp(str, "skewX", 5) == 0) - str += nsvg__parseSkewX(t, str); - else if (strncmp(str, "skewY", 5) == 0) - str += nsvg__parseSkewY(t, str); - else{ - ++str; - continue; - } - - nsvg__xformPremultiply(xform, t); - } -} - -static void nsvg__parseUrl(char* id, const char* str) -{ - int i = 0; - str += 4; // "url("; - if (*str == '#') - str++; - while (i < 63 && *str != ')') { - id[i] = *str++; - i++; - } - id[i] = '\0'; -} - -static char nsvg__parseLineCap(const char* str) -{ - if (strcmp(str, "butt") == 0) - return NSVG_CAP_BUTT; - else if (strcmp(str, "round") == 0) - return NSVG_CAP_ROUND; - else if (strcmp(str, "square") == 0) - return NSVG_CAP_SQUARE; - // TODO: handle inherit. - return NSVG_CAP_BUTT; -} - -static char nsvg__parseLineJoin(const char* str) -{ - if (strcmp(str, "miter") == 0) - return NSVG_JOIN_MITER; - else if (strcmp(str, "round") == 0) - return NSVG_JOIN_ROUND; - else if (strcmp(str, "bevel") == 0) - return NSVG_JOIN_BEVEL; - // TODO: handle inherit. - return NSVG_JOIN_MITER; -} - -static char nsvg__parseFillRule(const char* str) -{ - if (strcmp(str, "nonzero") == 0) - return NSVG_FILLRULE_NONZERO; - else if (strcmp(str, "evenodd") == 0) - return NSVG_FILLRULE_EVENODD; - // TODO: handle inherit. - return NSVG_FILLRULE_NONZERO; -} - -static const char* nsvg__getNextDashItem(const char* s, char* it) -{ - int n = 0; - it[0] = '\0'; - // Skip white spaces and commas - while (*s && (nsvg__isspace(*s) || *s == ',')) s++; - // Advance until whitespace, comma or end. - while (*s && (!nsvg__isspace(*s) && *s != ',')) { - if (n < 63) - it[n++] = *s; - s++; - } - it[n++] = '\0'; - return s; -} - -static int nsvg__parseStrokeDashArray(NSVGparser* p, const char* str, float* strokeDashArray) -{ - char item[64]; - int count = 0, i; - float sum = 0.0f; - - // Handle "none" - if (str[0] == 'n') - return 0; - - // Parse dashes - while (*str) { - str = nsvg__getNextDashItem(str, item); - if (!*item) break; - if (count < NSVG_MAX_DASHES) - strokeDashArray[count++] = fabsf(nsvg__parseCoordinate(p, item, 0.0f, nsvg__actualLength(p))); - } - - for (i = 0; i < count; i++) - sum += strokeDashArray[i]; - if (sum <= 1e-6f) - count = 0; - - return count; -} - -static void nsvg__parseStyle(NSVGparser* p, const char* str); - -static int nsvg__parseAttr(NSVGparser* p, const char* name, const char* value) -{ - float xform[6]; - NSVGattrib* attr = nsvg__getAttr(p); - if (!attr) return 0; - - if (strcmp(name, "style") == 0) { - nsvg__parseStyle(p, value); - } else if (strcmp(name, "display") == 0) { - if (strcmp(value, "none") == 0) - attr->visible = 0; - // Don't reset ->visible on display:inline, one display:none hides the whole subtree - - } else if (strcmp(name, "fill") == 0) { - if (strcmp(value, "none") == 0) { - attr->hasFill = 0; - } else if (strncmp(value, "url(", 4) == 0) { - attr->hasFill = 2; - nsvg__parseUrl(attr->fillGradient, value); - } else { - attr->hasFill = 1; - attr->fillColor = nsvg__parseColor(value); - } - } else if (strcmp(name, "opacity") == 0) { - attr->opacity = nsvg__parseOpacity(value); - } else if (strcmp(name, "fill-opacity") == 0) { - attr->fillOpacity = nsvg__parseOpacity(value); - } else if (strcmp(name, "stroke") == 0) { - if (strcmp(value, "none") == 0) { - attr->hasStroke = 0; - } else if (strncmp(value, "url(", 4) == 0) { - attr->hasStroke = 2; - nsvg__parseUrl(attr->strokeGradient, value); - } else { - attr->hasStroke = 1; - attr->strokeColor = nsvg__parseColor(value); - } - } else if (strcmp(name, "stroke-width") == 0) { - attr->strokeWidth = nsvg__parseCoordinate(p, value, 0.0f, nsvg__actualLength(p)); - } else if (strcmp(name, "stroke-dasharray") == 0) { - attr->strokeDashCount = nsvg__parseStrokeDashArray(p, value, attr->strokeDashArray); - } else if (strcmp(name, "stroke-dashoffset") == 0) { - attr->strokeDashOffset = nsvg__parseCoordinate(p, value, 0.0f, nsvg__actualLength(p)); - } else if (strcmp(name, "stroke-opacity") == 0) { - attr->strokeOpacity = nsvg__parseOpacity(value); - } else if (strcmp(name, "stroke-linecap") == 0) { - attr->strokeLineCap = nsvg__parseLineCap(value); - } else if (strcmp(name, "stroke-linejoin") == 0) { - attr->strokeLineJoin = nsvg__parseLineJoin(value); - } else if (strcmp(name, "stroke-miterlimit") == 0) { - attr->miterLimit = nsvg__parseMiterLimit(value); - } else if (strcmp(name, "fill-rule") == 0) { - attr->fillRule = nsvg__parseFillRule(value); - } else if (strcmp(name, "font-size") == 0) { - attr->fontSize = nsvg__parseCoordinate(p, value, 0.0f, nsvg__actualLength(p)); - } else if (strcmp(name, "transform") == 0) { - nsvg__parseTransform(xform, value); - nsvg__xformPremultiply(attr->xform, xform); - } else if (strcmp(name, "stop-color") == 0) { - attr->stopColor = nsvg__parseColor(value); - } else if (strcmp(name, "stop-opacity") == 0) { - attr->stopOpacity = nsvg__parseOpacity(value); - } else if (strcmp(name, "offset") == 0) { - attr->stopOffset = nsvg__parseCoordinate(p, value, 0.0f, 1.0f); - } else if (strcmp(name, "id") == 0) { - strncpy(attr->id, value, 63); - attr->id[63] = '\0'; - } else { - return 0; - } - return 1; -} - -static int nsvg__parseNameValue(NSVGparser* p, const char* start, const char* end) -{ - const char* str; - const char* val; - char name[512]; - char value[512]; - int n; - - str = start; - while (str < end && *str != ':') ++str; - - val = str; - - // Right Trim - while (str > start && (*str == ':' || nsvg__isspace(*str))) --str; - ++str; - - n = (int)(str - start); - if (n > 511) n = 511; - if (n) memcpy(name, start, n); - name[n] = 0; - - while (val < end && (*val == ':' || nsvg__isspace(*val))) ++val; - - n = (int)(end - val); - if (n > 511) n = 511; - if (n) memcpy(value, val, n); - value[n] = 0; - - return nsvg__parseAttr(p, name, value); -} - -static void nsvg__parseStyle(NSVGparser* p, const char* str) -{ - const char* start; - const char* end; - - while (*str) { - // Left Trim - while(*str && nsvg__isspace(*str)) ++str; - start = str; - while(*str && *str != ';') ++str; - end = str; - - // Right Trim - while (end > start && (*end == ';' || nsvg__isspace(*end))) --end; - ++end; - - nsvg__parseNameValue(p, start, end); - if (*str) ++str; - } -} - -static void nsvg__parseAttribs(NSVGparser* p, const char** attr) -{ - int i; - for (i = 0; attr[i]; i += 2) - { - if (strcmp(attr[i], "style") == 0) - nsvg__parseStyle(p, attr[i + 1]); - else - nsvg__parseAttr(p, attr[i], attr[i + 1]); - } -} - -static int nsvg__getArgsPerElement(char cmd) -{ - switch (cmd) { - case 'v': - case 'V': - case 'h': - case 'H': - return 1; - case 'm': - case 'M': - case 'l': - case 'L': - case 't': - case 'T': - return 2; - case 'q': - case 'Q': - case 's': - case 'S': - return 4; - case 'c': - case 'C': - return 6; - case 'a': - case 'A': - return 7; - } - return 0; -} - -static void nsvg__pathMoveTo(NSVGparser* p, float* cpx, float* cpy, float* args, int rel) -{ - if (rel) { - *cpx += args[0]; - *cpy += args[1]; - } else { - *cpx = args[0]; - *cpy = args[1]; - } - nsvg__moveTo(p, *cpx, *cpy); -} - -static void nsvg__pathLineTo(NSVGparser* p, float* cpx, float* cpy, float* args, int rel) -{ - if (rel) { - *cpx += args[0]; - *cpy += args[1]; - } else { - *cpx = args[0]; - *cpy = args[1]; - } - nsvg__lineTo(p, *cpx, *cpy); -} - -static void nsvg__pathHLineTo(NSVGparser* p, float* cpx, float* cpy, float* args, int rel) -{ - if (rel) - *cpx += args[0]; - else - *cpx = args[0]; - nsvg__lineTo(p, *cpx, *cpy); -} - -static void nsvg__pathVLineTo(NSVGparser* p, float* cpx, float* cpy, float* args, int rel) -{ - if (rel) - *cpy += args[0]; - else - *cpy = args[0]; - nsvg__lineTo(p, *cpx, *cpy); -} - -static void nsvg__pathCubicBezTo(NSVGparser* p, float* cpx, float* cpy, - float* cpx2, float* cpy2, float* args, int rel) -{ - float x2, y2, cx1, cy1, cx2, cy2; - - if (rel) { - cx1 = *cpx + args[0]; - cy1 = *cpy + args[1]; - cx2 = *cpx + args[2]; - cy2 = *cpy + args[3]; - x2 = *cpx + args[4]; - y2 = *cpy + args[5]; - } else { - cx1 = args[0]; - cy1 = args[1]; - cx2 = args[2]; - cy2 = args[3]; - x2 = args[4]; - y2 = args[5]; - } - - nsvg__cubicBezTo(p, cx1,cy1, cx2,cy2, x2,y2); - - *cpx2 = cx2; - *cpy2 = cy2; - *cpx = x2; - *cpy = y2; -} - -static void nsvg__pathCubicBezShortTo(NSVGparser* p, float* cpx, float* cpy, - float* cpx2, float* cpy2, float* args, int rel) -{ - float x1, y1, x2, y2, cx1, cy1, cx2, cy2; - - x1 = *cpx; - y1 = *cpy; - if (rel) { - cx2 = *cpx + args[0]; - cy2 = *cpy + args[1]; - x2 = *cpx + args[2]; - y2 = *cpy + args[3]; - } else { - cx2 = args[0]; - cy2 = args[1]; - x2 = args[2]; - y2 = args[3]; - } - - cx1 = 2*x1 - *cpx2; - cy1 = 2*y1 - *cpy2; - - nsvg__cubicBezTo(p, cx1,cy1, cx2,cy2, x2,y2); - - *cpx2 = cx2; - *cpy2 = cy2; - *cpx = x2; - *cpy = y2; -} - -static void nsvg__pathQuadBezTo(NSVGparser* p, float* cpx, float* cpy, - float* cpx2, float* cpy2, float* args, int rel) -{ - float x1, y1, x2, y2, cx, cy; - float cx1, cy1, cx2, cy2; - - x1 = *cpx; - y1 = *cpy; - if (rel) { - cx = *cpx + args[0]; - cy = *cpy + args[1]; - x2 = *cpx + args[2]; - y2 = *cpy + args[3]; - } else { - cx = args[0]; - cy = args[1]; - x2 = args[2]; - y2 = args[3]; - } - - // Convert to cubic bezier - cx1 = x1 + 2.0f/3.0f*(cx - x1); - cy1 = y1 + 2.0f/3.0f*(cy - y1); - cx2 = x2 + 2.0f/3.0f*(cx - x2); - cy2 = y2 + 2.0f/3.0f*(cy - y2); - - nsvg__cubicBezTo(p, cx1,cy1, cx2,cy2, x2,y2); - - *cpx2 = cx; - *cpy2 = cy; - *cpx = x2; - *cpy = y2; -} - -static void nsvg__pathQuadBezShortTo(NSVGparser* p, float* cpx, float* cpy, - float* cpx2, float* cpy2, float* args, int rel) -{ - float x1, y1, x2, y2, cx, cy; - float cx1, cy1, cx2, cy2; - - x1 = *cpx; - y1 = *cpy; - if (rel) { - x2 = *cpx + args[0]; - y2 = *cpy + args[1]; - } else { - x2 = args[0]; - y2 = args[1]; - } - - cx = 2*x1 - *cpx2; - cy = 2*y1 - *cpy2; - - // Convert to cubix bezier - cx1 = x1 + 2.0f/3.0f*(cx - x1); - cy1 = y1 + 2.0f/3.0f*(cy - y1); - cx2 = x2 + 2.0f/3.0f*(cx - x2); - cy2 = y2 + 2.0f/3.0f*(cy - y2); - - nsvg__cubicBezTo(p, cx1,cy1, cx2,cy2, x2,y2); - - *cpx2 = cx; - *cpy2 = cy; - *cpx = x2; - *cpy = y2; -} - -static float nsvg__sqr(float x) { return x*x; } -static float nsvg__vmag(float x, float y) { return sqrtf(x*x + y*y); } - -static float nsvg__vecrat(float ux, float uy, float vx, float vy) -{ - return (ux*vx + uy*vy) / (nsvg__vmag(ux,uy) * nsvg__vmag(vx,vy)); -} - -static float nsvg__vecang(float ux, float uy, float vx, float vy) -{ - float r = nsvg__vecrat(ux,uy, vx,vy); - if (r < -1.0f) r = -1.0f; - if (r > 1.0f) r = 1.0f; - return ((ux*vy < uy*vx) ? -1.0f : 1.0f) * acosf(r); -} - -static void nsvg__pathArcTo(NSVGparser* p, float* cpx, float* cpy, float* args, int rel) -{ - // Ported from canvg (https://code.google.com/p/canvg/) - float rx, ry, rotx; - float x1, y1, x2, y2, cx, cy, dx, dy, d; - float x1p, y1p, cxp, cyp, s, sa, sb; - float ux, uy, vx, vy, a1, da; - float x, y, tanx, tany, a, px = 0, py = 0, ptanx = 0, ptany = 0, t[6]; - float sinrx, cosrx; - int fa, fs; - int i, ndivs; - float hda, kappa; - - rx = fabsf(args[0]); // y radius - ry = fabsf(args[1]); // x radius - rotx = args[2] / 180.0f * NSVG_PI; // x rotation angle - fa = fabsf(args[3]) > 1e-6 ? 1 : 0; // Large arc - fs = fabsf(args[4]) > 1e-6 ? 1 : 0; // Sweep direction - x1 = *cpx; // start point - y1 = *cpy; - if (rel) { // end point - x2 = *cpx + args[5]; - y2 = *cpy + args[6]; - } else { - x2 = args[5]; - y2 = args[6]; - } - - dx = x1 - x2; - dy = y1 - y2; - d = sqrtf(dx*dx + dy*dy); - if (d < 1e-6f || rx < 1e-6f || ry < 1e-6f) { - // The arc degenerates to a line - nsvg__lineTo(p, x2, y2); - *cpx = x2; - *cpy = y2; - return; - } - - sinrx = sinf(rotx); - cosrx = cosf(rotx); - - // Convert to center point parameterization. - // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes - // 1) Compute x1', y1' - x1p = cosrx * dx / 2.0f + sinrx * dy / 2.0f; - y1p = -sinrx * dx / 2.0f + cosrx * dy / 2.0f; - d = nsvg__sqr(x1p)/nsvg__sqr(rx) + nsvg__sqr(y1p)/nsvg__sqr(ry); - if (d > 1) { - d = sqrtf(d); - rx *= d; - ry *= d; - } - // 2) Compute cx', cy' - s = 0.0f; - sa = nsvg__sqr(rx)*nsvg__sqr(ry) - nsvg__sqr(rx)*nsvg__sqr(y1p) - nsvg__sqr(ry)*nsvg__sqr(x1p); - sb = nsvg__sqr(rx)*nsvg__sqr(y1p) + nsvg__sqr(ry)*nsvg__sqr(x1p); - if (sa < 0.0f) sa = 0.0f; - if (sb > 0.0f) - s = sqrtf(sa / sb); - if (fa == fs) - s = -s; - cxp = s * rx * y1p / ry; - cyp = s * -ry * x1p / rx; - - // 3) Compute cx,cy from cx',cy' - cx = (x1 + x2)/2.0f + cosrx*cxp - sinrx*cyp; - cy = (y1 + y2)/2.0f + sinrx*cxp + cosrx*cyp; - - // 4) Calculate theta1, and delta theta. - ux = (x1p - cxp) / rx; - uy = (y1p - cyp) / ry; - vx = (-x1p - cxp) / rx; - vy = (-y1p - cyp) / ry; - a1 = nsvg__vecang(1.0f,0.0f, ux,uy); // Initial angle - da = nsvg__vecang(ux,uy, vx,vy); // Delta angle - -// if (vecrat(ux,uy,vx,vy) <= -1.0f) da = NSVG_PI; -// if (vecrat(ux,uy,vx,vy) >= 1.0f) da = 0; - - if (fs == 0 && da > 0) - da -= 2 * NSVG_PI; - else if (fs == 1 && da < 0) - da += 2 * NSVG_PI; - - // Approximate the arc using cubic spline segments. - t[0] = cosrx; t[1] = sinrx; - t[2] = -sinrx; t[3] = cosrx; - t[4] = cx; t[5] = cy; - - // Split arc into max 90 degree segments. - // The loop assumes an iteration per end point (including start and end), this +1. - ndivs = (int)(fabsf(da) / (NSVG_PI*0.5f) + 1.0f); - hda = (da / (float)ndivs) / 2.0f; - kappa = fabsf(4.0f / 3.0f * (1.0f - cosf(hda)) / sinf(hda)); - if (da < 0.0f) - kappa = -kappa; - - for (i = 0; i <= ndivs; i++) { - a = a1 + da * ((float)i/(float)ndivs); - dx = cosf(a); - dy = sinf(a); - nsvg__xformPoint(&x, &y, dx*rx, dy*ry, t); // position - nsvg__xformVec(&tanx, &tany, -dy*rx * kappa, dx*ry * kappa, t); // tangent - if (i > 0) - nsvg__cubicBezTo(p, px+ptanx,py+ptany, x-tanx, y-tany, x, y); - px = x; - py = y; - ptanx = tanx; - ptany = tany; - } - - *cpx = x2; - *cpy = y2; -} - -static void nsvg__parsePath(NSVGparser* p, const char** attr) -{ - const char* s = NULL; - char cmd = '\0'; - float args[10]; - int nargs; - int rargs = 0; - float cpx, cpy, cpx2, cpy2; - const char* tmp[4]; - char closedFlag; - int i; - char item[64]; - - for (i = 0; attr[i]; i += 2) { - if (strcmp(attr[i], "d") == 0) { - s = attr[i + 1]; - } else { - tmp[0] = attr[i]; - tmp[1] = attr[i + 1]; - tmp[2] = 0; - tmp[3] = 0; - nsvg__parseAttribs(p, tmp); - } - } - - if (s) { - nsvg__resetPath(p); - cpx = 0; cpy = 0; - cpx2 = 0; cpy2 = 0; - closedFlag = 0; - nargs = 0; - - while (*s) { - s = nsvg__getNextPathItem(s, item); - if (!*item) break; - if (nsvg__isnum(item[0])) { - if (nargs < 10) - args[nargs++] = (float)nsvg__atof(item); - if (nargs >= rargs) { - switch (cmd) { - case 'm': - case 'M': - nsvg__pathMoveTo(p, &cpx, &cpy, args, cmd == 'm' ? 1 : 0); - // Moveto can be followed by multiple coordinate pairs, - // which should be treated as linetos. - cmd = (cmd == 'm') ? 'l' : 'L'; - rargs = nsvg__getArgsPerElement(cmd); - cpx2 = cpx; cpy2 = cpy; - break; - case 'l': - case 'L': - nsvg__pathLineTo(p, &cpx, &cpy, args, cmd == 'l' ? 1 : 0); - cpx2 = cpx; cpy2 = cpy; - break; - case 'H': - case 'h': - nsvg__pathHLineTo(p, &cpx, &cpy, args, cmd == 'h' ? 1 : 0); - cpx2 = cpx; cpy2 = cpy; - break; - case 'V': - case 'v': - nsvg__pathVLineTo(p, &cpx, &cpy, args, cmd == 'v' ? 1 : 0); - cpx2 = cpx; cpy2 = cpy; - break; - case 'C': - case 'c': - nsvg__pathCubicBezTo(p, &cpx, &cpy, &cpx2, &cpy2, args, cmd == 'c' ? 1 : 0); - break; - case 'S': - case 's': - nsvg__pathCubicBezShortTo(p, &cpx, &cpy, &cpx2, &cpy2, args, cmd == 's' ? 1 : 0); - break; - case 'Q': - case 'q': - nsvg__pathQuadBezTo(p, &cpx, &cpy, &cpx2, &cpy2, args, cmd == 'q' ? 1 : 0); - break; - case 'T': - case 't': - nsvg__pathQuadBezShortTo(p, &cpx, &cpy, &cpx2, &cpy2, args, cmd == 't' ? 1 : 0); - break; - case 'A': - case 'a': - nsvg__pathArcTo(p, &cpx, &cpy, args, cmd == 'a' ? 1 : 0); - cpx2 = cpx; cpy2 = cpy; - break; - default: - if (nargs >= 2) { - cpx = args[nargs-2]; - cpy = args[nargs-1]; - cpx2 = cpx; cpy2 = cpy; - } - break; - } - nargs = 0; - } - } else { - cmd = item[0]; - rargs = nsvg__getArgsPerElement(cmd); - if (cmd == 'M' || cmd == 'm') { - // Commit path. - if (p->npts > 0) - nsvg__addPath(p, closedFlag); - // Start new subpath. - nsvg__resetPath(p); - closedFlag = 0; - nargs = 0; - } else if (cmd == 'Z' || cmd == 'z') { - closedFlag = 1; - // Commit path. - if (p->npts > 0) { - // Move current point to first point - cpx = p->pts[0]; - cpy = p->pts[1]; - cpx2 = cpx; cpy2 = cpy; - nsvg__addPath(p, closedFlag); - } - // Start new subpath. - nsvg__resetPath(p); - nsvg__moveTo(p, cpx, cpy); - closedFlag = 0; - nargs = 0; - } - } - } - // Commit path. - if (p->npts) - nsvg__addPath(p, closedFlag); - } - - nsvg__addShape(p); -} - -static void nsvg__parseRect(NSVGparser* p, const char** attr) -{ - float x = 0.0f; - float y = 0.0f; - float w = 0.0f; - float h = 0.0f; - float rx = -1.0f; // marks not set - float ry = -1.0f; - int i; - - for (i = 0; attr[i]; i += 2) { - if (!nsvg__parseAttr(p, attr[i], attr[i + 1])) { - if (strcmp(attr[i], "x") == 0) x = nsvg__parseCoordinate(p, attr[i+1], nsvg__actualOrigX(p), nsvg__actualWidth(p)); - if (strcmp(attr[i], "y") == 0) y = nsvg__parseCoordinate(p, attr[i+1], nsvg__actualOrigY(p), nsvg__actualHeight(p)); - if (strcmp(attr[i], "width") == 0) w = nsvg__parseCoordinate(p, attr[i+1], 0.0f, nsvg__actualWidth(p)); - if (strcmp(attr[i], "height") == 0) h = nsvg__parseCoordinate(p, attr[i+1], 0.0f, nsvg__actualHeight(p)); - if (strcmp(attr[i], "rx") == 0) rx = fabsf(nsvg__parseCoordinate(p, attr[i+1], 0.0f, nsvg__actualWidth(p))); - if (strcmp(attr[i], "ry") == 0) ry = fabsf(nsvg__parseCoordinate(p, attr[i+1], 0.0f, nsvg__actualHeight(p))); - } - } - - if (rx < 0.0f && ry > 0.0f) rx = ry; - if (ry < 0.0f && rx > 0.0f) ry = rx; - if (rx < 0.0f) rx = 0.0f; - if (ry < 0.0f) ry = 0.0f; - if (rx > w/2.0f) rx = w/2.0f; - if (ry > h/2.0f) ry = h/2.0f; - - if (w != 0.0f && h != 0.0f) { - nsvg__resetPath(p); - - if (rx < 0.00001f || ry < 0.0001f) { - nsvg__moveTo(p, x, y); - nsvg__lineTo(p, x+w, y); - nsvg__lineTo(p, x+w, y+h); - nsvg__lineTo(p, x, y+h); - } else { - // Rounded rectangle - nsvg__moveTo(p, x+rx, y); - nsvg__lineTo(p, x+w-rx, y); - nsvg__cubicBezTo(p, x+w-rx*(1-NSVG_KAPPA90), y, x+w, y+ry*(1-NSVG_KAPPA90), x+w, y+ry); - nsvg__lineTo(p, x+w, y+h-ry); - nsvg__cubicBezTo(p, x+w, y+h-ry*(1-NSVG_KAPPA90), x+w-rx*(1-NSVG_KAPPA90), y+h, x+w-rx, y+h); - nsvg__lineTo(p, x+rx, y+h); - nsvg__cubicBezTo(p, x+rx*(1-NSVG_KAPPA90), y+h, x, y+h-ry*(1-NSVG_KAPPA90), x, y+h-ry); - nsvg__lineTo(p, x, y+ry); - nsvg__cubicBezTo(p, x, y+ry*(1-NSVG_KAPPA90), x+rx*(1-NSVG_KAPPA90), y, x+rx, y); - } - - nsvg__addPath(p, 1); - - nsvg__addShape(p); - } -} - -static void nsvg__parseCircle(NSVGparser* p, const char** attr) -{ - float cx = 0.0f; - float cy = 0.0f; - float r = 0.0f; - int i; - - for (i = 0; attr[i]; i += 2) { - if (!nsvg__parseAttr(p, attr[i], attr[i + 1])) { - if (strcmp(attr[i], "cx") == 0) cx = nsvg__parseCoordinate(p, attr[i+1], nsvg__actualOrigX(p), nsvg__actualWidth(p)); - if (strcmp(attr[i], "cy") == 0) cy = nsvg__parseCoordinate(p, attr[i+1], nsvg__actualOrigY(p), nsvg__actualHeight(p)); - if (strcmp(attr[i], "r") == 0) r = fabsf(nsvg__parseCoordinate(p, attr[i+1], 0.0f, nsvg__actualLength(p))); - } - } - - if (r > 0.0f) { - nsvg__resetPath(p); - - nsvg__moveTo(p, cx+r, cy); - nsvg__cubicBezTo(p, cx+r, cy+r*NSVG_KAPPA90, cx+r*NSVG_KAPPA90, cy+r, cx, cy+r); - nsvg__cubicBezTo(p, cx-r*NSVG_KAPPA90, cy+r, cx-r, cy+r*NSVG_KAPPA90, cx-r, cy); - nsvg__cubicBezTo(p, cx-r, cy-r*NSVG_KAPPA90, cx-r*NSVG_KAPPA90, cy-r, cx, cy-r); - nsvg__cubicBezTo(p, cx+r*NSVG_KAPPA90, cy-r, cx+r, cy-r*NSVG_KAPPA90, cx+r, cy); - - nsvg__addPath(p, 1); - - nsvg__addShape(p); - } -} - -static void nsvg__parseEllipse(NSVGparser* p, const char** attr) -{ - float cx = 0.0f; - float cy = 0.0f; - float rx = 0.0f; - float ry = 0.0f; - int i; - - for (i = 0; attr[i]; i += 2) { - if (!nsvg__parseAttr(p, attr[i], attr[i + 1])) { - if (strcmp(attr[i], "cx") == 0) cx = nsvg__parseCoordinate(p, attr[i+1], nsvg__actualOrigX(p), nsvg__actualWidth(p)); - if (strcmp(attr[i], "cy") == 0) cy = nsvg__parseCoordinate(p, attr[i+1], nsvg__actualOrigY(p), nsvg__actualHeight(p)); - if (strcmp(attr[i], "rx") == 0) rx = fabsf(nsvg__parseCoordinate(p, attr[i+1], 0.0f, nsvg__actualWidth(p))); - if (strcmp(attr[i], "ry") == 0) ry = fabsf(nsvg__parseCoordinate(p, attr[i+1], 0.0f, nsvg__actualHeight(p))); - } - } - - if (rx > 0.0f && ry > 0.0f) { - - nsvg__resetPath(p); - - nsvg__moveTo(p, cx+rx, cy); - nsvg__cubicBezTo(p, cx+rx, cy+ry*NSVG_KAPPA90, cx+rx*NSVG_KAPPA90, cy+ry, cx, cy+ry); - nsvg__cubicBezTo(p, cx-rx*NSVG_KAPPA90, cy+ry, cx-rx, cy+ry*NSVG_KAPPA90, cx-rx, cy); - nsvg__cubicBezTo(p, cx-rx, cy-ry*NSVG_KAPPA90, cx-rx*NSVG_KAPPA90, cy-ry, cx, cy-ry); - nsvg__cubicBezTo(p, cx+rx*NSVG_KAPPA90, cy-ry, cx+rx, cy-ry*NSVG_KAPPA90, cx+rx, cy); - - nsvg__addPath(p, 1); - - nsvg__addShape(p); - } -} - -static void nsvg__parseLine(NSVGparser* p, const char** attr) -{ - float x1 = 0.0; - float y1 = 0.0; - float x2 = 0.0; - float y2 = 0.0; - int i; - - for (i = 0; attr[i]; i += 2) { - if (!nsvg__parseAttr(p, attr[i], attr[i + 1])) { - if (strcmp(attr[i], "x1") == 0) x1 = nsvg__parseCoordinate(p, attr[i + 1], nsvg__actualOrigX(p), nsvg__actualWidth(p)); - if (strcmp(attr[i], "y1") == 0) y1 = nsvg__parseCoordinate(p, attr[i + 1], nsvg__actualOrigY(p), nsvg__actualHeight(p)); - if (strcmp(attr[i], "x2") == 0) x2 = nsvg__parseCoordinate(p, attr[i + 1], nsvg__actualOrigX(p), nsvg__actualWidth(p)); - if (strcmp(attr[i], "y2") == 0) y2 = nsvg__parseCoordinate(p, attr[i + 1], nsvg__actualOrigY(p), nsvg__actualHeight(p)); - } - } - - nsvg__resetPath(p); - - nsvg__moveTo(p, x1, y1); - nsvg__lineTo(p, x2, y2); - - nsvg__addPath(p, 0); - - nsvg__addShape(p); -} - -static void nsvg__parsePoly(NSVGparser* p, const char** attr, int closeFlag) -{ - int i; - const char* s; - float args[2]; - int nargs, npts = 0; - char item[64]; - - nsvg__resetPath(p); - - for (i = 0; attr[i]; i += 2) { - if (!nsvg__parseAttr(p, attr[i], attr[i + 1])) { - if (strcmp(attr[i], "points") == 0) { - s = attr[i + 1]; - nargs = 0; - while (*s) { - s = nsvg__getNextPathItem(s, item); - args[nargs++] = (float)nsvg__atof(item); - if (nargs >= 2) { - if (npts == 0) - nsvg__moveTo(p, args[0], args[1]); - else - nsvg__lineTo(p, args[0], args[1]); - nargs = 0; - npts++; - } - } - } - } - } - - nsvg__addPath(p, (char)closeFlag); - - nsvg__addShape(p); -} - -static void nsvg__parseSVG(NSVGparser* p, const char** attr) -{ - int i; - for (i = 0; attr[i]; i += 2) { - if (!nsvg__parseAttr(p, attr[i], attr[i + 1])) { - if (strcmp(attr[i], "width") == 0) { - p->image->width = nsvg__parseCoordinate(p, attr[i + 1], 0.0f, 0.0f); - } else if (strcmp(attr[i], "height") == 0) { - p->image->height = nsvg__parseCoordinate(p, attr[i + 1], 0.0f, 0.0f); - } else if (strcmp(attr[i], "viewBox") == 0) { - const char *s = attr[i + 1]; - char buf[64]; - s = nsvg__parseNumber(s, buf, 64); - p->viewMinx = nsvg__atof(buf); - while (*s && (nsvg__isspace(*s) || *s == '%' || *s == ',')) s++; - if (!*s) return; - s = nsvg__parseNumber(s, buf, 64); - p->viewMiny = nsvg__atof(buf); - while (*s && (nsvg__isspace(*s) || *s == '%' || *s == ',')) s++; - if (!*s) return; - s = nsvg__parseNumber(s, buf, 64); - p->viewWidth = nsvg__atof(buf); - while (*s && (nsvg__isspace(*s) || *s == '%' || *s == ',')) s++; - if (!*s) return; - s = nsvg__parseNumber(s, buf, 64); - p->viewHeight = nsvg__atof(buf); - } else if (strcmp(attr[i], "preserveAspectRatio") == 0) { - if (strstr(attr[i + 1], "none") != 0) { - // No uniform scaling - p->alignType = NSVG_ALIGN_NONE; - } else { - // Parse X align - if (strstr(attr[i + 1], "xMin") != 0) - p->alignX = NSVG_ALIGN_MIN; - else if (strstr(attr[i + 1], "xMid") != 0) - p->alignX = NSVG_ALIGN_MID; - else if (strstr(attr[i + 1], "xMax") != 0) - p->alignX = NSVG_ALIGN_MAX; - // Parse X align - if (strstr(attr[i + 1], "yMin") != 0) - p->alignY = NSVG_ALIGN_MIN; - else if (strstr(attr[i + 1], "yMid") != 0) - p->alignY = NSVG_ALIGN_MID; - else if (strstr(attr[i + 1], "yMax") != 0) - p->alignY = NSVG_ALIGN_MAX; - // Parse meet/slice - p->alignType = NSVG_ALIGN_MEET; - if (strstr(attr[i + 1], "slice") != 0) - p->alignType = NSVG_ALIGN_SLICE; - } - } - } - } -} - -static void nsvg__parseGradient(NSVGparser* p, const char** attr, char type) -{ - int i; - NSVGgradientData* grad = (NSVGgradientData*)malloc(sizeof(NSVGgradientData)); - if (grad == NULL) return; - memset(grad, 0, sizeof(NSVGgradientData)); - grad->units = NSVG_OBJECT_SPACE; - grad->type = type; - if (grad->type == NSVG_PAINT_LINEAR_GRADIENT) { - grad->linear.x1 = nsvg__coord(0.0f, NSVG_UNITS_PERCENT); - grad->linear.y1 = nsvg__coord(0.0f, NSVG_UNITS_PERCENT); - grad->linear.x2 = nsvg__coord(100.0f, NSVG_UNITS_PERCENT); - grad->linear.y2 = nsvg__coord(0.0f, NSVG_UNITS_PERCENT); - } else if (grad->type == NSVG_PAINT_RADIAL_GRADIENT) { - grad->radial.cx = nsvg__coord(50.0f, NSVG_UNITS_PERCENT); - grad->radial.cy = nsvg__coord(50.0f, NSVG_UNITS_PERCENT); - grad->radial.r = nsvg__coord(50.0f, NSVG_UNITS_PERCENT); - } - - nsvg__xformIdentity(grad->xform); - - for (i = 0; attr[i]; i += 2) { - if (strcmp(attr[i], "id") == 0) { - strncpy(grad->id, attr[i+1], 63); - grad->id[63] = '\0'; - } else if (!nsvg__parseAttr(p, attr[i], attr[i + 1])) { - if (strcmp(attr[i], "gradientUnits") == 0) { - if (strcmp(attr[i+1], "objectBoundingBox") == 0) - grad->units = NSVG_OBJECT_SPACE; - else - grad->units = NSVG_USER_SPACE; - } else if (strcmp(attr[i], "gradientTransform") == 0) { - nsvg__parseTransform(grad->xform, attr[i + 1]); - } else if (strcmp(attr[i], "cx") == 0) { - grad->radial.cx = nsvg__parseCoordinateRaw(attr[i + 1]); - } else if (strcmp(attr[i], "cy") == 0) { - grad->radial.cy = nsvg__parseCoordinateRaw(attr[i + 1]); - } else if (strcmp(attr[i], "r") == 0) { - grad->radial.r = nsvg__parseCoordinateRaw(attr[i + 1]); - } else if (strcmp(attr[i], "fx") == 0) { - grad->radial.fx = nsvg__parseCoordinateRaw(attr[i + 1]); - } else if (strcmp(attr[i], "fy") == 0) { - grad->radial.fy = nsvg__parseCoordinateRaw(attr[i + 1]); - } else if (strcmp(attr[i], "x1") == 0) { - grad->linear.x1 = nsvg__parseCoordinateRaw(attr[i + 1]); - } else if (strcmp(attr[i], "y1") == 0) { - grad->linear.y1 = nsvg__parseCoordinateRaw(attr[i + 1]); - } else if (strcmp(attr[i], "x2") == 0) { - grad->linear.x2 = nsvg__parseCoordinateRaw(attr[i + 1]); - } else if (strcmp(attr[i], "y2") == 0) { - grad->linear.y2 = nsvg__parseCoordinateRaw(attr[i + 1]); - } else if (strcmp(attr[i], "spreadMethod") == 0) { - if (strcmp(attr[i+1], "pad") == 0) - grad->spread = NSVG_SPREAD_PAD; - else if (strcmp(attr[i+1], "reflect") == 0) - grad->spread = NSVG_SPREAD_REFLECT; - else if (strcmp(attr[i+1], "repeat") == 0) - grad->spread = NSVG_SPREAD_REPEAT; - } else if (strcmp(attr[i], "xlink:href") == 0) { - const char *href = attr[i+1]; - strncpy(grad->ref, href+1, 62); - grad->ref[62] = '\0'; - } - } - } - - grad->next = p->gradients; - p->gradients = grad; -} - -static void nsvg__parseGradientStop(NSVGparser* p, const char** attr) -{ - NSVGattrib* curAttr = nsvg__getAttr(p); - NSVGgradientData* grad; - NSVGgradientStop* stop; - int i, idx; - - curAttr->stopOffset = 0; - curAttr->stopColor = 0; - curAttr->stopOpacity = 1.0f; - - for (i = 0; attr[i]; i += 2) { - nsvg__parseAttr(p, attr[i], attr[i + 1]); - } - - // Add stop to the last gradient. - grad = p->gradients; - if (grad == NULL) return; - - grad->nstops++; - grad->stops = (NSVGgradientStop*)realloc(grad->stops, sizeof(NSVGgradientStop)*grad->nstops); - if (grad->stops == NULL) return; - - // Insert - idx = grad->nstops-1; - for (i = 0; i < grad->nstops-1; i++) { - if (curAttr->stopOffset < grad->stops[i].offset) { - idx = i; - break; - } - } - if (idx != grad->nstops-1) { - for (i = grad->nstops-1; i > idx; i--) - grad->stops[i] = grad->stops[i-1]; - } - - stop = &grad->stops[idx]; - stop->color = curAttr->stopColor; - stop->color |= (unsigned int)(curAttr->stopOpacity*255) << 24; - stop->offset = curAttr->stopOffset; -} - -static void nsvg__startElement(void* ud, const char* el, const char** attr) -{ - NSVGparser* p = (NSVGparser*)ud; - - if (p->defsFlag) { - // Skip everything but gradients in defs - if (strcmp(el, "linearGradient") == 0) { - nsvg__parseGradient(p, attr, NSVG_PAINT_LINEAR_GRADIENT); - } else if (strcmp(el, "radialGradient") == 0) { - nsvg__parseGradient(p, attr, NSVG_PAINT_RADIAL_GRADIENT); - } else if (strcmp(el, "stop") == 0) { - nsvg__parseGradientStop(p, attr); - } - return; - } - - if (strcmp(el, "g") == 0) { - nsvg__pushAttr(p); - nsvg__parseAttribs(p, attr); - } else if (strcmp(el, "path") == 0) { - if (p->pathFlag) // Do not allow nested paths. - return; - nsvg__pushAttr(p); - nsvg__parsePath(p, attr); - nsvg__popAttr(p); - } else if (strcmp(el, "rect") == 0) { - nsvg__pushAttr(p); - nsvg__parseRect(p, attr); - nsvg__popAttr(p); - } else if (strcmp(el, "circle") == 0) { - nsvg__pushAttr(p); - nsvg__parseCircle(p, attr); - nsvg__popAttr(p); - } else if (strcmp(el, "ellipse") == 0) { - nsvg__pushAttr(p); - nsvg__parseEllipse(p, attr); - nsvg__popAttr(p); - } else if (strcmp(el, "line") == 0) { - nsvg__pushAttr(p); - nsvg__parseLine(p, attr); - nsvg__popAttr(p); - } else if (strcmp(el, "polyline") == 0) { - nsvg__pushAttr(p); - nsvg__parsePoly(p, attr, 0); - nsvg__popAttr(p); - } else if (strcmp(el, "polygon") == 0) { - nsvg__pushAttr(p); - nsvg__parsePoly(p, attr, 1); - nsvg__popAttr(p); - } else if (strcmp(el, "linearGradient") == 0) { - nsvg__parseGradient(p, attr, NSVG_PAINT_LINEAR_GRADIENT); - } else if (strcmp(el, "radialGradient") == 0) { - nsvg__parseGradient(p, attr, NSVG_PAINT_RADIAL_GRADIENT); - } else if (strcmp(el, "stop") == 0) { - nsvg__parseGradientStop(p, attr); - } else if (strcmp(el, "defs") == 0) { - p->defsFlag = 1; - } else if (strcmp(el, "svg") == 0) { - nsvg__parseSVG(p, attr); - } -} - -static void nsvg__endElement(void* ud, const char* el) -{ - NSVGparser* p = (NSVGparser*)ud; - - if (strcmp(el, "g") == 0) { - nsvg__popAttr(p); - } else if (strcmp(el, "path") == 0) { - p->pathFlag = 0; - } else if (strcmp(el, "defs") == 0) { - p->defsFlag = 0; - } -} - -static void nsvg__content(void* ud, const char* s) -{ - NSVG_NOTUSED(ud); - NSVG_NOTUSED(s); - // empty -} - -static void nsvg__imageBounds(NSVGparser* p, float* bounds) -{ - NSVGshape* shape; - shape = p->image->shapes; - if (shape == NULL) { - bounds[0] = bounds[1] = bounds[2] = bounds[3] = 0.0; - return; - } - bounds[0] = shape->bounds[0]; - bounds[1] = shape->bounds[1]; - bounds[2] = shape->bounds[2]; - bounds[3] = shape->bounds[3]; - for (shape = shape->next; shape != NULL; shape = shape->next) { - bounds[0] = nsvg__minf(bounds[0], shape->bounds[0]); - bounds[1] = nsvg__minf(bounds[1], shape->bounds[1]); - bounds[2] = nsvg__maxf(bounds[2], shape->bounds[2]); - bounds[3] = nsvg__maxf(bounds[3], shape->bounds[3]); - } -} - -static float nsvg__viewAlign(float content, float container, int type) -{ - if (type == NSVG_ALIGN_MIN) - return 0; - else if (type == NSVG_ALIGN_MAX) - return container - content; - // mid - return (container - content) * 0.5f; -} - -static void nsvg__scaleGradient(NSVGgradient* grad, float tx, float ty, float sx, float sy) -{ - float t[6]; - nsvg__xformSetTranslation(t, tx, ty); - nsvg__xformMultiply (grad->xform, t); - - nsvg__xformSetScale(t, sx, sy); - nsvg__xformMultiply (grad->xform, t); -} - -static void nsvg__scaleToViewbox(NSVGparser* p, const char* units) -{ - NSVGshape* shape; - NSVGpath* path; - float tx, ty, sx, sy, us, bounds[4], t[6], avgs; - int i; - float* pt; - - // Guess image size if not set completely. - nsvg__imageBounds(p, bounds); - - if (p->viewWidth == 0) { - if (p->image->width > 0) { - p->viewWidth = p->image->width; - } else { - p->viewMinx = bounds[0]; - p->viewWidth = bounds[2] - bounds[0]; - } - } - if (p->viewHeight == 0) { - if (p->image->height > 0) { - p->viewHeight = p->image->height; - } else { - p->viewMiny = bounds[1]; - p->viewHeight = bounds[3] - bounds[1]; - } - } - if (p->image->width == 0) - p->image->width = p->viewWidth; - if (p->image->height == 0) - p->image->height = p->viewHeight; - - tx = -p->viewMinx; - ty = -p->viewMiny; - sx = p->viewWidth > 0 ? p->image->width / p->viewWidth : 0; - sy = p->viewHeight > 0 ? p->image->height / p->viewHeight : 0; - // Unit scaling - us = 1.0f / nsvg__convertToPixels(p, nsvg__coord(1.0f, nsvg__parseUnits(units)), 0.0f, 1.0f); - - // Fix aspect ratio - if (p->alignType == NSVG_ALIGN_MEET) { - // fit whole image into viewbox - sx = sy = nsvg__minf(sx, sy); - tx += nsvg__viewAlign(p->viewWidth*sx, p->image->width, p->alignX) / sx; - ty += nsvg__viewAlign(p->viewHeight*sy, p->image->height, p->alignY) / sy; - } else if (p->alignType == NSVG_ALIGN_SLICE) { - // fill whole viewbox with image - sx = sy = nsvg__maxf(sx, sy); - tx += nsvg__viewAlign(p->viewWidth*sx, p->image->width, p->alignX) / sx; - ty += nsvg__viewAlign(p->viewHeight*sy, p->image->height, p->alignY) / sy; - } - - // Transform - sx *= us; - sy *= us; - avgs = (sx+sy) / 2.0f; - for (shape = p->image->shapes; shape != NULL; shape = shape->next) { - shape->bounds[0] = (shape->bounds[0] + tx) * sx; - shape->bounds[1] = (shape->bounds[1] + ty) * sy; - shape->bounds[2] = (shape->bounds[2] + tx) * sx; - shape->bounds[3] = (shape->bounds[3] + ty) * sy; - for (path = shape->paths; path != NULL; path = path->next) { - path->bounds[0] = (path->bounds[0] + tx) * sx; - path->bounds[1] = (path->bounds[1] + ty) * sy; - path->bounds[2] = (path->bounds[2] + tx) * sx; - path->bounds[3] = (path->bounds[3] + ty) * sy; - for (i =0; i < path->npts; i++) { - pt = &path->pts[i*2]; - pt[0] = (pt[0] + tx) * sx; - pt[1] = (pt[1] + ty) * sy; - } - } - - if (shape->fill.type == NSVG_PAINT_LINEAR_GRADIENT || shape->fill.type == NSVG_PAINT_RADIAL_GRADIENT) { - nsvg__scaleGradient(shape->fill.gradient, tx,ty, sx,sy); - memcpy(t, shape->fill.gradient->xform, sizeof(float)*6); - nsvg__xformInverse(shape->fill.gradient->xform, t); - } - if (shape->stroke.type == NSVG_PAINT_LINEAR_GRADIENT || shape->stroke.type == NSVG_PAINT_RADIAL_GRADIENT) { - nsvg__scaleGradient(shape->stroke.gradient, tx,ty, sx,sy); - memcpy(t, shape->stroke.gradient->xform, sizeof(float)*6); - nsvg__xformInverse(shape->stroke.gradient->xform, t); - } - - shape->strokeWidth *= avgs; - shape->strokeDashOffset *= avgs; - for (i = 0; i < shape->strokeDashCount; i++) - shape->strokeDashArray[i] *= avgs; - } -} - -NSVGimage* nsvgParse(char* input, const char* units, float dpi) -{ - NSVGparser* p; - NSVGimage* ret = 0; - - p = nsvg__createParser(); - if (p == NULL) { - return NULL; - } - p->dpi = dpi; - - nsvg__parseXML(input, nsvg__startElement, nsvg__endElement, nsvg__content, p); - - // Scale to viewBox - nsvg__scaleToViewbox(p, units); - - ret = p->image; - p->image = NULL; - - nsvg__deleteParser(p); - - return ret; -} - -#include - -NSVGimage* nsvgParseFromFile(const char* filename, const char* units, float dpi) -{ - FILE* fp = NULL; - size_t size; - char* data = NULL; - NSVGimage* image = NULL; - - fp = boost::nowide::fopen(filename, "rb"); - if (!fp) goto error; - fseek(fp, 0, SEEK_END); - size = ftell(fp); - fseek(fp, 0, SEEK_SET); - data = (char*)malloc(size+1); - if (data == NULL) goto error; - if (fread(data, 1, size, fp) != size) goto error; - data[size] = '\0'; // Must be null terminated. - fclose(fp); - - image = nsvgParse(data, units, dpi); - free(data); - return image; - -error: - if (fp) fclose(fp); - if (data) free(data); - if (image) nsvgDelete(image); - return NULL; -} - -NSVGpath* nsvgDuplicatePath(NSVGpath* p) -{ - NSVGpath* res = NULL; - - if (p == NULL) - return NULL; - - res = (NSVGpath*)malloc(sizeof(NSVGpath)); - if (res == NULL) goto error; - memset(res, 0, sizeof(NSVGpath)); - - res->pts = (float*)malloc(p->npts*2*sizeof(float)); - if (res->pts == NULL) goto error; - memcpy(res->pts, p->pts, p->npts * sizeof(float) * 2); - res->npts = p->npts; - - memcpy(res->bounds, p->bounds, sizeof(p->bounds)); - - res->closed = p->closed; - - return res; - -error: - if (res != NULL) { - free(res->pts); - free(res); - } - return NULL; -} - -void nsvgDelete(NSVGimage* image) -{ - NSVGshape *snext, *shape; - if (image == NULL) return; - shape = image->shapes; - while (shape != NULL) { - snext = shape->next; - nsvg__deletePaths(shape->paths); - nsvg__deletePaint(&shape->fill); - nsvg__deletePaint(&shape->stroke); - free(shape); - shape = snext; - } - free(image); -} - -#endif diff --git a/src/nanosvg/nanosvgrast.h b/src/nanosvg/nanosvgrast.h deleted file mode 100644 index b740c316ca2..00000000000 --- a/src/nanosvg/nanosvgrast.h +++ /dev/null @@ -1,1452 +0,0 @@ -/* - * Copyright (c) 2013-14 Mikko Mononen memon@inside.org - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * The polygon rasterization is heavily based on stb_truetype rasterizer - * by Sean Barrett - http://nothings.org/ - * - */ - -#ifndef NANOSVGRAST_H -#define NANOSVGRAST_H - -#ifndef NANOSVGRAST_CPLUSPLUS -#ifdef __cplusplus -extern "C" { -#endif -#endif - -typedef struct NSVGrasterizer NSVGrasterizer; - -/* Example Usage: - // Load SVG - NSVGimage* image; - image = nsvgParseFromFile("test.svg", "px", 96); - - // Create rasterizer (can be used to render multiple images). - struct NSVGrasterizer* rast = nsvgCreateRasterizer(); - // Allocate memory for image - unsigned char* img = malloc(w*h*4); - // Rasterize - nsvgRasterize(rast, image, 0,0,1, img, w, h, w*4); -*/ - -// Allocated rasterizer context. -NSVGrasterizer* nsvgCreateRasterizer(); - -// Rasterizes SVG image, returns RGBA image (non-premultiplied alpha) -// r - pointer to rasterizer context -// image - pointer to image to rasterize -// tx,ty - image offset (applied after scaling) -// scale - image scale -// dst - pointer to destination image data, 4 bytes per pixel (RGBA) -// w - width of the image to render -// h - height of the image to render -// stride - number of bytes per scaleline in the destination buffer -void nsvgRasterize(NSVGrasterizer* r, - NSVGimage* image, float tx, float ty, float scale, - unsigned char* dst, int w, int h, int stride); - -// Deletes rasterizer context. -void nsvgDeleteRasterizer(NSVGrasterizer*); - - -#ifndef NANOSVGRAST_CPLUSPLUS -#ifdef __cplusplus -} -#endif -#endif - -#endif // NANOSVGRAST_H - -#ifdef NANOSVGRAST_IMPLEMENTATION - -#include - -#define NSVG__SUBSAMPLES 5 -#define NSVG__FIXSHIFT 10 -#define NSVG__FIX (1 << NSVG__FIXSHIFT) -#define NSVG__FIXMASK (NSVG__FIX-1) -#define NSVG__MEMPAGE_SIZE 1024 - -typedef struct NSVGedge { - float x0,y0, x1,y1; - int dir; - struct NSVGedge* next; -} NSVGedge; - -typedef struct NSVGpoint { - float x, y; - float dx, dy; - float len; - float dmx, dmy; - unsigned char flags; -} NSVGpoint; - -typedef struct NSVGactiveEdge { - int x,dx; - float ey; - int dir; - struct NSVGactiveEdge *next; -} NSVGactiveEdge; - -typedef struct NSVGmemPage { - unsigned char mem[NSVG__MEMPAGE_SIZE]; - int size; - struct NSVGmemPage* next; -} NSVGmemPage; - -typedef struct NSVGcachedPaint { - char type; - char spread; - float xform[6]; - unsigned int colors[256]; -} NSVGcachedPaint; - -struct NSVGrasterizer -{ - float px, py; - - float tessTol; - float distTol; - - NSVGedge* edges; - int nedges; - int cedges; - - NSVGpoint* points; - int npoints; - int cpoints; - - NSVGpoint* points2; - int npoints2; - int cpoints2; - - NSVGactiveEdge* freelist; - NSVGmemPage* pages; - NSVGmemPage* curpage; - - unsigned char* scanline; - int cscanline; - - unsigned char* bitmap; - int width, height, stride; -}; - -NSVGrasterizer* nsvgCreateRasterizer() -{ - NSVGrasterizer* r = (NSVGrasterizer*)malloc(sizeof(NSVGrasterizer)); - if (r == NULL) goto error; - memset(r, 0, sizeof(NSVGrasterizer)); - - r->tessTol = 0.25f; - r->distTol = 0.01f; - - return r; - -error: - nsvgDeleteRasterizer(r); - return NULL; -} - -void nsvgDeleteRasterizer(NSVGrasterizer* r) -{ - NSVGmemPage* p; - - if (r == NULL) return; - - p = r->pages; - while (p != NULL) { - NSVGmemPage* next = p->next; - free(p); - p = next; - } - - if (r->edges) free(r->edges); - if (r->points) free(r->points); - if (r->points2) free(r->points2); - if (r->scanline) free(r->scanline); - - free(r); -} - -static NSVGmemPage* nsvg__nextPage(NSVGrasterizer* r, NSVGmemPage* cur) -{ - NSVGmemPage *newp; - - // If using existing chain, return the next page in chain - if (cur != NULL && cur->next != NULL) { - return cur->next; - } - - // Alloc new page - newp = (NSVGmemPage*)malloc(sizeof(NSVGmemPage)); - if (newp == NULL) return NULL; - memset(newp, 0, sizeof(NSVGmemPage)); - - // Add to linked list - if (cur != NULL) - cur->next = newp; - else - r->pages = newp; - - return newp; -} - -static void nsvg__resetPool(NSVGrasterizer* r) -{ - NSVGmemPage* p = r->pages; - while (p != NULL) { - p->size = 0; - p = p->next; - } - r->curpage = r->pages; -} - -static unsigned char* nsvg__alloc(NSVGrasterizer* r, int size) -{ - unsigned char* buf; - if (size > NSVG__MEMPAGE_SIZE) return NULL; - if (r->curpage == NULL || r->curpage->size+size > NSVG__MEMPAGE_SIZE) { - r->curpage = nsvg__nextPage(r, r->curpage); - } - buf = &r->curpage->mem[r->curpage->size]; - r->curpage->size += size; - return buf; -} - -static int nsvg__ptEquals(float x1, float y1, float x2, float y2, float tol) -{ - float dx = x2 - x1; - float dy = y2 - y1; - return dx*dx + dy*dy < tol*tol; -} - -static void nsvg__addPathPoint(NSVGrasterizer* r, float x, float y, int flags) -{ - NSVGpoint* pt; - - if (r->npoints > 0) { - pt = &r->points[r->npoints-1]; - if (nsvg__ptEquals(pt->x,pt->y, x,y, r->distTol)) { - pt->flags = (unsigned char)(pt->flags | flags); - return; - } - } - - if (r->npoints+1 > r->cpoints) { - r->cpoints = r->cpoints > 0 ? r->cpoints * 2 : 64; - r->points = (NSVGpoint*)realloc(r->points, sizeof(NSVGpoint) * r->cpoints); - if (r->points == NULL) return; - } - - pt = &r->points[r->npoints]; - pt->x = x; - pt->y = y; - pt->flags = (unsigned char)flags; - r->npoints++; -} - -static void nsvg__appendPathPoint(NSVGrasterizer* r, NSVGpoint pt) -{ - if (r->npoints+1 > r->cpoints) { - r->cpoints = r->cpoints > 0 ? r->cpoints * 2 : 64; - r->points = (NSVGpoint*)realloc(r->points, sizeof(NSVGpoint) * r->cpoints); - if (r->points == NULL) return; - } - r->points[r->npoints] = pt; - r->npoints++; -} - -static void nsvg__duplicatePoints(NSVGrasterizer* r) -{ - if (r->npoints > r->cpoints2) { - r->cpoints2 = r->npoints; - r->points2 = (NSVGpoint*)realloc(r->points2, sizeof(NSVGpoint) * r->cpoints2); - if (r->points2 == NULL) return; - } - - memcpy(r->points2, r->points, sizeof(NSVGpoint) * r->npoints); - r->npoints2 = r->npoints; -} - -static void nsvg__addEdge(NSVGrasterizer* r, float x0, float y0, float x1, float y1) -{ - NSVGedge* e; - - // Skip horizontal edges - if (y0 == y1) - return; - - if (r->nedges+1 > r->cedges) { - r->cedges = r->cedges > 0 ? r->cedges * 2 : 64; - r->edges = (NSVGedge*)realloc(r->edges, sizeof(NSVGedge) * r->cedges); - if (r->edges == NULL) return; - } - - e = &r->edges[r->nedges]; - r->nedges++; - - if (y0 < y1) { - e->x0 = x0; - e->y0 = y0; - e->x1 = x1; - e->y1 = y1; - e->dir = 1; - } else { - e->x0 = x1; - e->y0 = y1; - e->x1 = x0; - e->y1 = y0; - e->dir = -1; - } -} - -static float nsvg__normalize(float *x, float* y) -{ - float d = sqrtf((*x)*(*x) + (*y)*(*y)); - if (d > 1e-6f) { - float id = 1.0f / d; - *x *= id; - *y *= id; - } - return d; -} - -static float nsvg__absf(float x) { return x < 0 ? -x : x; } - -static void nsvg__flattenCubicBez(NSVGrasterizer* r, - float x1, float y1, float x2, float y2, - float x3, float y3, float x4, float y4, - int level, int type) -{ - float x12,y12,x23,y23,x34,y34,x123,y123,x234,y234,x1234,y1234; - float dx,dy,d2,d3; - - if (level > 10) return; - - x12 = (x1+x2)*0.5f; - y12 = (y1+y2)*0.5f; - x23 = (x2+x3)*0.5f; - y23 = (y2+y3)*0.5f; - x34 = (x3+x4)*0.5f; - y34 = (y3+y4)*0.5f; - x123 = (x12+x23)*0.5f; - y123 = (y12+y23)*0.5f; - - dx = x4 - x1; - dy = y4 - y1; - d2 = nsvg__absf(((x2 - x4) * dy - (y2 - y4) * dx)); - d3 = nsvg__absf(((x3 - x4) * dy - (y3 - y4) * dx)); - - if ((d2 + d3)*(d2 + d3) < r->tessTol * (dx*dx + dy*dy)) { - nsvg__addPathPoint(r, x4, y4, type); - return; - } - - x234 = (x23+x34)*0.5f; - y234 = (y23+y34)*0.5f; - x1234 = (x123+x234)*0.5f; - y1234 = (y123+y234)*0.5f; - - nsvg__flattenCubicBez(r, x1,y1, x12,y12, x123,y123, x1234,y1234, level+1, 0); - nsvg__flattenCubicBez(r, x1234,y1234, x234,y234, x34,y34, x4,y4, level+1, type); -} - -static void nsvg__flattenShape(NSVGrasterizer* r, NSVGshape* shape, float scale) -{ - int i, j; - NSVGpath* path; - - for (path = shape->paths; path != NULL; path = path->next) { - r->npoints = 0; - // Flatten path - nsvg__addPathPoint(r, path->pts[0]*scale, path->pts[1]*scale, 0); - for (i = 0; i < path->npts-1; i += 3) { - float* p = &path->pts[i*2]; - nsvg__flattenCubicBez(r, p[0]*scale,p[1]*scale, p[2]*scale,p[3]*scale, p[4]*scale,p[5]*scale, p[6]*scale,p[7]*scale, 0, 0); - } - // Close path - nsvg__addPathPoint(r, path->pts[0]*scale, path->pts[1]*scale, 0); - // Build edges - for (i = 0, j = r->npoints-1; i < r->npoints; j = i++) - nsvg__addEdge(r, r->points[j].x, r->points[j].y, r->points[i].x, r->points[i].y); - } -} - -enum NSVGpointFlags -{ - NSVG_PT_CORNER = 0x01, - NSVG_PT_BEVEL = 0x02, - NSVG_PT_LEFT = 0x04 -}; - -static void nsvg__initClosed(NSVGpoint* left, NSVGpoint* right, NSVGpoint* p0, NSVGpoint* p1, float lineWidth) -{ - float w = lineWidth * 0.5f; - float dx = p1->x - p0->x; - float dy = p1->y - p0->y; - float len = nsvg__normalize(&dx, &dy); - float px = p0->x + dx*len*0.5f, py = p0->y + dy*len*0.5f; - float dlx = dy, dly = -dx; - float lx = px - dlx*w, ly = py - dly*w; - float rx = px + dlx*w, ry = py + dly*w; - left->x = lx; left->y = ly; - right->x = rx; right->y = ry; -} - -static void nsvg__buttCap(NSVGrasterizer* r, NSVGpoint* left, NSVGpoint* right, NSVGpoint* p, float dx, float dy, float lineWidth, int connect) -{ - float w = lineWidth * 0.5f; - float px = p->x, py = p->y; - float dlx = dy, dly = -dx; - float lx = px - dlx*w, ly = py - dly*w; - float rx = px + dlx*w, ry = py + dly*w; - - nsvg__addEdge(r, lx, ly, rx, ry); - - if (connect) { - nsvg__addEdge(r, left->x, left->y, lx, ly); - nsvg__addEdge(r, rx, ry, right->x, right->y); - } - left->x = lx; left->y = ly; - right->x = rx; right->y = ry; -} - -static void nsvg__squareCap(NSVGrasterizer* r, NSVGpoint* left, NSVGpoint* right, NSVGpoint* p, float dx, float dy, float lineWidth, int connect) -{ - float w = lineWidth * 0.5f; - float px = p->x - dx*w, py = p->y - dy*w; - float dlx = dy, dly = -dx; - float lx = px - dlx*w, ly = py - dly*w; - float rx = px + dlx*w, ry = py + dly*w; - - nsvg__addEdge(r, lx, ly, rx, ry); - - if (connect) { - nsvg__addEdge(r, left->x, left->y, lx, ly); - nsvg__addEdge(r, rx, ry, right->x, right->y); - } - left->x = lx; left->y = ly; - right->x = rx; right->y = ry; -} - -#ifndef NSVG_PI -#define NSVG_PI (3.14159265358979323846264338327f) -#endif - -static void nsvg__roundCap(NSVGrasterizer* r, NSVGpoint* left, NSVGpoint* right, NSVGpoint* p, float dx, float dy, float lineWidth, int ncap, int connect) -{ - int i; - float w = lineWidth * 0.5f; - float px = p->x, py = p->y; - float dlx = dy, dly = -dx; - float lx = 0, ly = 0, rx = 0, ry = 0, prevx = 0, prevy = 0; - - for (i = 0; i < ncap; i++) { - float a = (float)i/(float)(ncap-1)*NSVG_PI; - float ax = cosf(a) * w, ay = sinf(a) * w; - float x = px - dlx*ax - dx*ay; - float y = py - dly*ax - dy*ay; - - if (i > 0) - nsvg__addEdge(r, prevx, prevy, x, y); - - prevx = x; - prevy = y; - - if (i == 0) { - lx = x; ly = y; - } else if (i == ncap-1) { - rx = x; ry = y; - } - } - - if (connect) { - nsvg__addEdge(r, left->x, left->y, lx, ly); - nsvg__addEdge(r, rx, ry, right->x, right->y); - } - - left->x = lx; left->y = ly; - right->x = rx; right->y = ry; -} - -static void nsvg__bevelJoin(NSVGrasterizer* r, NSVGpoint* left, NSVGpoint* right, NSVGpoint* p0, NSVGpoint* p1, float lineWidth) -{ - float w = lineWidth * 0.5f; - float dlx0 = p0->dy, dly0 = -p0->dx; - float dlx1 = p1->dy, dly1 = -p1->dx; - float lx0 = p1->x - (dlx0 * w), ly0 = p1->y - (dly0 * w); - float rx0 = p1->x + (dlx0 * w), ry0 = p1->y + (dly0 * w); - float lx1 = p1->x - (dlx1 * w), ly1 = p1->y - (dly1 * w); - float rx1 = p1->x + (dlx1 * w), ry1 = p1->y + (dly1 * w); - - nsvg__addEdge(r, lx0, ly0, left->x, left->y); - nsvg__addEdge(r, lx1, ly1, lx0, ly0); - - nsvg__addEdge(r, right->x, right->y, rx0, ry0); - nsvg__addEdge(r, rx0, ry0, rx1, ry1); - - left->x = lx1; left->y = ly1; - right->x = rx1; right->y = ry1; -} - -static void nsvg__miterJoin(NSVGrasterizer* r, NSVGpoint* left, NSVGpoint* right, NSVGpoint* p0, NSVGpoint* p1, float lineWidth) -{ - float w = lineWidth * 0.5f; - float dlx0 = p0->dy, dly0 = -p0->dx; - float dlx1 = p1->dy, dly1 = -p1->dx; - float lx0, rx0, lx1, rx1; - float ly0, ry0, ly1, ry1; - - if (p1->flags & NSVG_PT_LEFT) { - lx0 = lx1 = p1->x - p1->dmx * w; - ly0 = ly1 = p1->y - p1->dmy * w; - nsvg__addEdge(r, lx1, ly1, left->x, left->y); - - rx0 = p1->x + (dlx0 * w); - ry0 = p1->y + (dly0 * w); - rx1 = p1->x + (dlx1 * w); - ry1 = p1->y + (dly1 * w); - nsvg__addEdge(r, right->x, right->y, rx0, ry0); - nsvg__addEdge(r, rx0, ry0, rx1, ry1); - } else { - lx0 = p1->x - (dlx0 * w); - ly0 = p1->y - (dly0 * w); - lx1 = p1->x - (dlx1 * w); - ly1 = p1->y - (dly1 * w); - nsvg__addEdge(r, lx0, ly0, left->x, left->y); - nsvg__addEdge(r, lx1, ly1, lx0, ly0); - - rx0 = rx1 = p1->x + p1->dmx * w; - ry0 = ry1 = p1->y + p1->dmy * w; - nsvg__addEdge(r, right->x, right->y, rx1, ry1); - } - - left->x = lx1; left->y = ly1; - right->x = rx1; right->y = ry1; -} - -static void nsvg__roundJoin(NSVGrasterizer* r, NSVGpoint* left, NSVGpoint* right, NSVGpoint* p0, NSVGpoint* p1, float lineWidth, int ncap) -{ - int i, n; - float w = lineWidth * 0.5f; - float dlx0 = p0->dy, dly0 = -p0->dx; - float dlx1 = p1->dy, dly1 = -p1->dx; - float a0 = atan2f(dly0, dlx0); - float a1 = atan2f(dly1, dlx1); - float da = a1 - a0; - float lx, ly, rx, ry; - - if (da < NSVG_PI) da += NSVG_PI*2; - if (da > NSVG_PI) da -= NSVG_PI*2; - - n = (int)ceilf((nsvg__absf(da) / NSVG_PI) * (float)ncap); - if (n < 2) n = 2; - if (n > ncap) n = ncap; - - lx = left->x; - ly = left->y; - rx = right->x; - ry = right->y; - - for (i = 0; i < n; i++) { - float u = (float)i/(float)(n-1); - float a = a0 + u*da; - float ax = cosf(a) * w, ay = sinf(a) * w; - float lx1 = p1->x - ax, ly1 = p1->y - ay; - float rx1 = p1->x + ax, ry1 = p1->y + ay; - - nsvg__addEdge(r, lx1, ly1, lx, ly); - nsvg__addEdge(r, rx, ry, rx1, ry1); - - lx = lx1; ly = ly1; - rx = rx1; ry = ry1; - } - - left->x = lx; left->y = ly; - right->x = rx; right->y = ry; -} - -static void nsvg__straightJoin(NSVGrasterizer* r, NSVGpoint* left, NSVGpoint* right, NSVGpoint* p1, float lineWidth) -{ - float w = lineWidth * 0.5f; - float lx = p1->x - (p1->dmx * w), ly = p1->y - (p1->dmy * w); - float rx = p1->x + (p1->dmx * w), ry = p1->y + (p1->dmy * w); - - nsvg__addEdge(r, lx, ly, left->x, left->y); - nsvg__addEdge(r, right->x, right->y, rx, ry); - - left->x = lx; left->y = ly; - right->x = rx; right->y = ry; -} - -static int nsvg__curveDivs(float r, float arc, float tol) -{ - float da = acosf(r / (r + tol)) * 2.0f; - int divs = (int)ceilf(arc / da); - if (divs < 2) divs = 2; - return divs; -} - -static void nsvg__expandStroke(NSVGrasterizer* r, NSVGpoint* points, int npoints, int closed, int lineJoin, int lineCap, float lineWidth) -{ - int ncap = nsvg__curveDivs(lineWidth*0.5f, NSVG_PI, r->tessTol); // Calculate divisions per half circle. - NSVGpoint left = {0,0,0,0,0,0,0,0}, right = {0,0,0,0,0,0,0,0}, firstLeft = {0,0,0,0,0,0,0,0}, firstRight = {0,0,0,0,0,0,0,0}; - NSVGpoint* p0, *p1; - int j, s, e; - - // Build stroke edges - if (closed) { - // Looping - p0 = &points[npoints-1]; - p1 = &points[0]; - s = 0; - e = npoints; - } else { - // Add cap - p0 = &points[0]; - p1 = &points[1]; - s = 1; - e = npoints-1; - } - - if (closed) { - nsvg__initClosed(&left, &right, p0, p1, lineWidth); - firstLeft = left; - firstRight = right; - } else { - // Add cap - float dx = p1->x - p0->x; - float dy = p1->y - p0->y; - nsvg__normalize(&dx, &dy); - if (lineCap == NSVG_CAP_BUTT) - nsvg__buttCap(r, &left, &right, p0, dx, dy, lineWidth, 0); - else if (lineCap == NSVG_CAP_SQUARE) - nsvg__squareCap(r, &left, &right, p0, dx, dy, lineWidth, 0); - else if (lineCap == NSVG_CAP_ROUND) - nsvg__roundCap(r, &left, &right, p0, dx, dy, lineWidth, ncap, 0); - } - - for (j = s; j < e; ++j) { - if (p1->flags & NSVG_PT_CORNER) { - if (lineJoin == NSVG_JOIN_ROUND) - nsvg__roundJoin(r, &left, &right, p0, p1, lineWidth, ncap); - else if (lineJoin == NSVG_JOIN_BEVEL || (p1->flags & NSVG_PT_BEVEL)) - nsvg__bevelJoin(r, &left, &right, p0, p1, lineWidth); - else - nsvg__miterJoin(r, &left, &right, p0, p1, lineWidth); - } else { - nsvg__straightJoin(r, &left, &right, p1, lineWidth); - } - p0 = p1++; - } - - if (closed) { - // Loop it - nsvg__addEdge(r, firstLeft.x, firstLeft.y, left.x, left.y); - nsvg__addEdge(r, right.x, right.y, firstRight.x, firstRight.y); - } else { - // Add cap - float dx = p1->x - p0->x; - float dy = p1->y - p0->y; - nsvg__normalize(&dx, &dy); - if (lineCap == NSVG_CAP_BUTT) - nsvg__buttCap(r, &right, &left, p1, -dx, -dy, lineWidth, 1); - else if (lineCap == NSVG_CAP_SQUARE) - nsvg__squareCap(r, &right, &left, p1, -dx, -dy, lineWidth, 1); - else if (lineCap == NSVG_CAP_ROUND) - nsvg__roundCap(r, &right, &left, p1, -dx, -dy, lineWidth, ncap, 1); - } -} - -static void nsvg__prepareStroke(NSVGrasterizer* r, float miterLimit, int lineJoin) -{ - int i, j; - NSVGpoint* p0, *p1; - - p0 = &r->points[r->npoints-1]; - p1 = &r->points[0]; - for (i = 0; i < r->npoints; i++) { - // Calculate segment direction and length - p0->dx = p1->x - p0->x; - p0->dy = p1->y - p0->y; - p0->len = nsvg__normalize(&p0->dx, &p0->dy); - // Advance - p0 = p1++; - } - - // calculate joins - p0 = &r->points[r->npoints-1]; - p1 = &r->points[0]; - for (j = 0; j < r->npoints; j++) { - float dlx0, dly0, dlx1, dly1, dmr2, cross; - dlx0 = p0->dy; - dly0 = -p0->dx; - dlx1 = p1->dy; - dly1 = -p1->dx; - // Calculate extrusions - p1->dmx = (dlx0 + dlx1) * 0.5f; - p1->dmy = (dly0 + dly1) * 0.5f; - dmr2 = p1->dmx*p1->dmx + p1->dmy*p1->dmy; - if (dmr2 > 0.000001f) { - float s2 = 1.0f / dmr2; - if (s2 > 600.0f) { - s2 = 600.0f; - } - p1->dmx *= s2; - p1->dmy *= s2; - } - - // Clear flags, but keep the corner. - p1->flags = (p1->flags & NSVG_PT_CORNER) ? NSVG_PT_CORNER : 0; - - // Keep track of left turns. - cross = p1->dx * p0->dy - p0->dx * p1->dy; - if (cross > 0.0f) - p1->flags |= NSVG_PT_LEFT; - - // Check to see if the corner needs to be beveled. - if (p1->flags & NSVG_PT_CORNER) { - if ((dmr2 * miterLimit*miterLimit) < 1.0f || lineJoin == NSVG_JOIN_BEVEL || lineJoin == NSVG_JOIN_ROUND) { - p1->flags |= NSVG_PT_BEVEL; - } - } - - p0 = p1++; - } -} - -static void nsvg__flattenShapeStroke(NSVGrasterizer* r, NSVGshape* shape, float scale) -{ - int i, j, closed; - NSVGpath* path; - NSVGpoint* p0, *p1; - float miterLimit = shape->miterLimit; - int lineJoin = shape->strokeLineJoin; - int lineCap = shape->strokeLineCap; - float lineWidth = shape->strokeWidth * scale; - - for (path = shape->paths; path != NULL; path = path->next) { - // Flatten path - r->npoints = 0; - nsvg__addPathPoint(r, path->pts[0]*scale, path->pts[1]*scale, NSVG_PT_CORNER); - for (i = 0; i < path->npts-1; i += 3) { - float* p = &path->pts[i*2]; - nsvg__flattenCubicBez(r, p[0]*scale,p[1]*scale, p[2]*scale,p[3]*scale, p[4]*scale,p[5]*scale, p[6]*scale,p[7]*scale, 0, NSVG_PT_CORNER); - } - if (r->npoints < 2) - continue; - - closed = path->closed; - - // If the first and last points are the same, remove the last, mark as closed path. - p0 = &r->points[r->npoints-1]; - p1 = &r->points[0]; - if (nsvg__ptEquals(p0->x,p0->y, p1->x,p1->y, r->distTol)) { - r->npoints--; - p0 = &r->points[r->npoints-1]; - closed = 1; - } - - if (shape->strokeDashCount > 0) { - int idash = 0, dashState = 1; - float totalDist = 0, dashLen, allDashLen, dashOffset; - NSVGpoint cur; - - if (closed) - nsvg__appendPathPoint(r, r->points[0]); - - // Duplicate points -> points2. - nsvg__duplicatePoints(r); - - r->npoints = 0; - cur = r->points2[0]; - nsvg__appendPathPoint(r, cur); - - // Figure out dash offset. - allDashLen = 0; - for (j = 0; j < shape->strokeDashCount; j++) - allDashLen += shape->strokeDashArray[j]; - if (shape->strokeDashCount & 1) - allDashLen *= 2.0f; - // Find location inside pattern - dashOffset = fmodf(shape->strokeDashOffset, allDashLen); - if (dashOffset < 0.0f) - dashOffset += allDashLen; - - while (dashOffset > shape->strokeDashArray[idash]) { - dashOffset -= shape->strokeDashArray[idash]; - idash = (idash + 1) % shape->strokeDashCount; - } - dashLen = (shape->strokeDashArray[idash] - dashOffset) * scale; - - for (j = 1; j < r->npoints2; ) { - float dx = r->points2[j].x - cur.x; - float dy = r->points2[j].y - cur.y; - float dist = sqrtf(dx*dx + dy*dy); - - if ((totalDist + dist) > dashLen) { - // Calculate intermediate point - float d = (dashLen - totalDist) / dist; - float x = cur.x + dx * d; - float y = cur.y + dy * d; - nsvg__addPathPoint(r, x, y, NSVG_PT_CORNER); - - // Stroke - if (r->npoints > 1 && dashState) { - nsvg__prepareStroke(r, miterLimit, lineJoin); - nsvg__expandStroke(r, r->points, r->npoints, 0, lineJoin, lineCap, lineWidth); - } - // Advance dash pattern - dashState = !dashState; - idash = (idash+1) % shape->strokeDashCount; - dashLen = shape->strokeDashArray[idash] * scale; - // Restart - cur.x = x; - cur.y = y; - cur.flags = NSVG_PT_CORNER; - totalDist = 0.0f; - r->npoints = 0; - nsvg__appendPathPoint(r, cur); - } else { - totalDist += dist; - cur = r->points2[j]; - nsvg__appendPathPoint(r, cur); - j++; - } - } - // Stroke any leftover path - if (r->npoints > 1 && dashState) - nsvg__expandStroke(r, r->points, r->npoints, 0, lineJoin, lineCap, lineWidth); - } else { - nsvg__prepareStroke(r, miterLimit, lineJoin); - nsvg__expandStroke(r, r->points, r->npoints, closed, lineJoin, lineCap, lineWidth); - } - } -} - -static int nsvg__cmpEdge(const void *p, const void *q) -{ - const NSVGedge* a = (const NSVGedge*)p; - const NSVGedge* b = (const NSVGedge*)q; - - if (a->y0 < b->y0) return -1; - if (a->y0 > b->y0) return 1; - return 0; -} - - -static NSVGactiveEdge* nsvg__addActive(NSVGrasterizer* r, NSVGedge* e, float startPoint) -{ - NSVGactiveEdge* z; - - if (r->freelist != NULL) { - // Restore from freelist. - z = r->freelist; - r->freelist = z->next; - } else { - // Alloc new edge. - z = (NSVGactiveEdge*)nsvg__alloc(r, sizeof(NSVGactiveEdge)); - if (z == NULL) return NULL; - } - - float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); -// STBTT_assert(e->y0 <= start_point); - // round dx down to avoid going too far - if (dxdy < 0) - z->dx = (int)(-floorf(NSVG__FIX * -dxdy)); - else - z->dx = (int)floorf(NSVG__FIX * dxdy); - z->x = (int)floorf(NSVG__FIX * (e->x0 + dxdy * (startPoint - e->y0))); -// z->x -= off_x * FIX; - z->ey = e->y1; - z->next = 0; - z->dir = e->dir; - - return z; -} - -static void nsvg__freeActive(NSVGrasterizer* r, NSVGactiveEdge* z) -{ - z->next = r->freelist; - r->freelist = z; -} - -static void nsvg__fillScanline(unsigned char* scanline, int len, int x0, int x1, int maxWeight, int* xmin, int* xmax) -{ - int i = x0 >> NSVG__FIXSHIFT; - int j = x1 >> NSVG__FIXSHIFT; - if (i < *xmin) *xmin = i; - if (j > *xmax) *xmax = j; - if (i < len && j >= 0) { - if (i == j) { - // x0,x1 are the same pixel, so compute combined coverage - scanline[i] = (unsigned char)(scanline[i] + ((x1 - x0) * maxWeight >> NSVG__FIXSHIFT)); - } else { - if (i >= 0) // add antialiasing for x0 - scanline[i] = (unsigned char)(scanline[i] + (((NSVG__FIX - (x0 & NSVG__FIXMASK)) * maxWeight) >> NSVG__FIXSHIFT)); - else - i = -1; // clip - - if (j < len) // add antialiasing for x1 - scanline[j] = (unsigned char)(scanline[j] + (((x1 & NSVG__FIXMASK) * maxWeight) >> NSVG__FIXSHIFT)); - else - j = len; // clip - - for (++i; i < j; ++i) // fill pixels between x0 and x1 - scanline[i] = (unsigned char)(scanline[i] + maxWeight); - } - } -} - -// note: this routine clips fills that extend off the edges... ideally this -// wouldn't happen, but it could happen if the truetype glyph bounding boxes -// are wrong, or if the user supplies a too-small bitmap -static void nsvg__fillActiveEdges(unsigned char* scanline, int len, NSVGactiveEdge* e, int maxWeight, int* xmin, int* xmax, char fillRule) -{ - // non-zero winding fill - int x0 = 0, w = 0; - - if (fillRule == NSVG_FILLRULE_NONZERO) { - // Non-zero - while (e != NULL) { - if (w == 0) { - // if we're currently at zero, we need to record the edge start point - x0 = e->x; w += e->dir; - } else { - int x1 = e->x; w += e->dir; - // if we went to zero, we need to draw - if (w == 0) - nsvg__fillScanline(scanline, len, x0, x1, maxWeight, xmin, xmax); - } - e = e->next; - } - } else if (fillRule == NSVG_FILLRULE_EVENODD) { - // Even-odd - while (e != NULL) { - if (w == 0) { - // if we're currently at zero, we need to record the edge start point - x0 = e->x; w = 1; - } else { - int x1 = e->x; w = 0; - nsvg__fillScanline(scanline, len, x0, x1, maxWeight, xmin, xmax); - } - e = e->next; - } - } -} - -static float nsvg__clampf(float a, float mn, float mx) { return a < mn ? mn : (a > mx ? mx : a); } - -static unsigned int nsvg__RGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a) -{ - return (r) | (g << 8) | (b << 16) | (a << 24); -} - -static unsigned int nsvg__lerpRGBA(unsigned int c0, unsigned int c1, float u) -{ - int iu = (int)(nsvg__clampf(u, 0.0f, 1.0f) * 256.0f); - int r = (((c0) & 0xff)*(256-iu) + (((c1) & 0xff)*iu)) >> 8; - int g = (((c0>>8) & 0xff)*(256-iu) + (((c1>>8) & 0xff)*iu)) >> 8; - int b = (((c0>>16) & 0xff)*(256-iu) + (((c1>>16) & 0xff)*iu)) >> 8; - int a = (((c0>>24) & 0xff)*(256-iu) + (((c1>>24) & 0xff)*iu)) >> 8; - return nsvg__RGBA((unsigned char)r, (unsigned char)g, (unsigned char)b, (unsigned char)a); -} - -static unsigned int nsvg__applyOpacity(unsigned int c, float u) -{ - int iu = (int)(nsvg__clampf(u, 0.0f, 1.0f) * 256.0f); - int r = (c) & 0xff; - int g = (c>>8) & 0xff; - int b = (c>>16) & 0xff; - int a = (((c>>24) & 0xff)*iu) >> 8; - return nsvg__RGBA((unsigned char)r, (unsigned char)g, (unsigned char)b, (unsigned char)a); -} - -static inline int nsvg__div255(int x) -{ - return ((x+1) * 257) >> 16; -} - -static void nsvg__scanlineSolid(unsigned char* dst, int count, unsigned char* cover, int x, int y, - float tx, float ty, float scale, NSVGcachedPaint* cache) -{ - - if (cache->type == NSVG_PAINT_COLOR) { - int i, cr, cg, cb, ca; - cr = cache->colors[0] & 0xff; - cg = (cache->colors[0] >> 8) & 0xff; - cb = (cache->colors[0] >> 16) & 0xff; - ca = (cache->colors[0] >> 24) & 0xff; - - for (i = 0; i < count; i++) { - int r,g,b; - int a = nsvg__div255((int)cover[0] * ca); - int ia = 255 - a; - // Premultiply - r = nsvg__div255(cr * a); - g = nsvg__div255(cg * a); - b = nsvg__div255(cb * a); - - // Blend over - r += nsvg__div255(ia * (int)dst[0]); - g += nsvg__div255(ia * (int)dst[1]); - b += nsvg__div255(ia * (int)dst[2]); - a += nsvg__div255(ia * (int)dst[3]); - - dst[0] = (unsigned char)r; - dst[1] = (unsigned char)g; - dst[2] = (unsigned char)b; - dst[3] = (unsigned char)a; - - cover++; - dst += 4; - } - } else if (cache->type == NSVG_PAINT_LINEAR_GRADIENT) { - // TODO: spread modes. - // TODO: plenty of opportunities to optimize. - float fx, fy, dx, gy; - float* t = cache->xform; - int i, cr, cg, cb, ca; - unsigned int c; - - fx = ((float)x - tx) / scale; - fy = ((float)y - ty) / scale; - dx = 1.0f / scale; - - for (i = 0; i < count; i++) { - int r,g,b,a,ia; - gy = fx*t[1] + fy*t[3] + t[5]; - c = cache->colors[(int)nsvg__clampf(gy*255.0f, 0, 255.0f)]; - cr = (c) & 0xff; - cg = (c >> 8) & 0xff; - cb = (c >> 16) & 0xff; - ca = (c >> 24) & 0xff; - - a = nsvg__div255((int)cover[0] * ca); - ia = 255 - a; - - // Premultiply - r = nsvg__div255(cr * a); - g = nsvg__div255(cg * a); - b = nsvg__div255(cb * a); - - // Blend over - r += nsvg__div255(ia * (int)dst[0]); - g += nsvg__div255(ia * (int)dst[1]); - b += nsvg__div255(ia * (int)dst[2]); - a += nsvg__div255(ia * (int)dst[3]); - - dst[0] = (unsigned char)r; - dst[1] = (unsigned char)g; - dst[2] = (unsigned char)b; - dst[3] = (unsigned char)a; - - cover++; - dst += 4; - fx += dx; - } - } else if (cache->type == NSVG_PAINT_RADIAL_GRADIENT) { - // TODO: spread modes. - // TODO: plenty of opportunities to optimize. - // TODO: focus (fx,fy) - float fx, fy, dx, gx, gy, gd; - float* t = cache->xform; - int i, cr, cg, cb, ca; - unsigned int c; - - fx = ((float)x - tx) / scale; - fy = ((float)y - ty) / scale; - dx = 1.0f / scale; - - for (i = 0; i < count; i++) { - int r,g,b,a,ia; - gx = fx*t[0] + fy*t[2] + t[4]; - gy = fx*t[1] + fy*t[3] + t[5]; - gd = sqrtf(gx*gx + gy*gy); - c = cache->colors[(int)nsvg__clampf(gd*255.0f, 0, 255.0f)]; - cr = (c) & 0xff; - cg = (c >> 8) & 0xff; - cb = (c >> 16) & 0xff; - ca = (c >> 24) & 0xff; - - a = nsvg__div255((int)cover[0] * ca); - ia = 255 - a; - - // Premultiply - r = nsvg__div255(cr * a); - g = nsvg__div255(cg * a); - b = nsvg__div255(cb * a); - - // Blend over - r += nsvg__div255(ia * (int)dst[0]); - g += nsvg__div255(ia * (int)dst[1]); - b += nsvg__div255(ia * (int)dst[2]); - a += nsvg__div255(ia * (int)dst[3]); - - dst[0] = (unsigned char)r; - dst[1] = (unsigned char)g; - dst[2] = (unsigned char)b; - dst[3] = (unsigned char)a; - - cover++; - dst += 4; - fx += dx; - } - } -} - -static void nsvg__rasterizeSortedEdges(NSVGrasterizer *r, float tx, float ty, float scale, NSVGcachedPaint* cache, char fillRule) -{ - NSVGactiveEdge *active = NULL; - int y, s; - int e = 0; - int maxWeight = (255 / NSVG__SUBSAMPLES); // weight per vertical scanline - int xmin, xmax; - - for (y = 0; y < r->height; y++) { - memset(r->scanline, 0, r->width); - xmin = r->width; - xmax = 0; - for (s = 0; s < NSVG__SUBSAMPLES; ++s) { - // find center of pixel for this scanline - float scany = (float)(y*NSVG__SUBSAMPLES + s) + 0.5f; - NSVGactiveEdge **step = &active; - - // update all active edges; - // remove all active edges that terminate before the center of this scanline - while (*step) { - NSVGactiveEdge *z = *step; - if (z->ey <= scany) { - *step = z->next; // delete from list -// NSVG__assert(z->valid); - nsvg__freeActive(r, z); - } else { - z->x += z->dx; // advance to position for current scanline - step = &((*step)->next); // advance through list - } - } - - // resort the list if needed - for (;;) { - int changed = 0; - step = &active; - while (*step && (*step)->next) { - if ((*step)->x > (*step)->next->x) { - NSVGactiveEdge* t = *step; - NSVGactiveEdge* q = t->next; - t->next = q->next; - q->next = t; - *step = q; - changed = 1; - } - step = &(*step)->next; - } - if (!changed) break; - } - - // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline - while (e < r->nedges && r->edges[e].y0 <= scany) { - if (r->edges[e].y1 > scany) { - NSVGactiveEdge* z = nsvg__addActive(r, &r->edges[e], scany); - if (z == NULL) break; - // find insertion point - if (active == NULL) { - active = z; - } else if (z->x < active->x) { - // insert at front - z->next = active; - active = z; - } else { - // find thing to insert AFTER - NSVGactiveEdge* p = active; - while (p->next && p->next->x < z->x) - p = p->next; - // at this point, p->next->x is NOT < z->x - z->next = p->next; - p->next = z; - } - } - e++; - } - - // now process all active edges in non-zero fashion - if (active != NULL) - nsvg__fillActiveEdges(r->scanline, r->width, active, maxWeight, &xmin, &xmax, fillRule); - } - // Blit - if (xmin < 0) xmin = 0; - if (xmax > r->width-1) xmax = r->width-1; - if (xmin <= xmax) { - nsvg__scanlineSolid(&r->bitmap[y * r->stride] + xmin*4, xmax-xmin+1, &r->scanline[xmin], xmin, y, tx,ty, scale, cache); - } - } - -} - -static void nsvg__unpremultiplyAlpha(unsigned char* image, int w, int h, int stride) -{ - int x,y; - - // Unpremultiply - for (y = 0; y < h; y++) { - unsigned char *row = &image[y*stride]; - for (x = 0; x < w; x++) { - int r = row[0], g = row[1], b = row[2], a = row[3]; - if (a != 0) { - row[0] = (unsigned char)(r*255/a); - row[1] = (unsigned char)(g*255/a); - row[2] = (unsigned char)(b*255/a); - } - row += 4; - } - } - - // Defringe - for (y = 0; y < h; y++) { - unsigned char *row = &image[y*stride]; - for (x = 0; x < w; x++) { - int r = 0, g = 0, b = 0, a = row[3], n = 0; - if (a == 0) { - if (x-1 > 0 && row[-1] != 0) { - r += row[-4]; - g += row[-3]; - b += row[-2]; - n++; - } - if (x+1 < w && row[7] != 0) { - r += row[4]; - g += row[5]; - b += row[6]; - n++; - } - if (y-1 > 0 && row[-stride+3] != 0) { - r += row[-stride]; - g += row[-stride+1]; - b += row[-stride+2]; - n++; - } - if (y+1 < h && row[stride+3] != 0) { - r += row[stride]; - g += row[stride+1]; - b += row[stride+2]; - n++; - } - if (n > 0) { - row[0] = (unsigned char)(r/n); - row[1] = (unsigned char)(g/n); - row[2] = (unsigned char)(b/n); - } - } - row += 4; - } - } -} - - -static void nsvg__initPaint(NSVGcachedPaint* cache, NSVGpaint* paint, float opacity) -{ - int i, j; - NSVGgradient* grad; - - cache->type = paint->type; - - if (paint->type == NSVG_PAINT_COLOR) { - cache->colors[0] = nsvg__applyOpacity(paint->color, opacity); - return; - } - - grad = paint->gradient; - - cache->spread = grad->spread; - memcpy(cache->xform, grad->xform, sizeof(float)*6); - - if (grad->nstops == 0) { - for (i = 0; i < 256; i++) - cache->colors[i] = 0; - } if (grad->nstops == 1) { - for (i = 0; i < 256; i++) - cache->colors[i] = nsvg__applyOpacity(grad->stops[i].color, opacity); - } else { - unsigned int ca, cb = 0; - float ua, ub, du, u; - int ia, ib, count; - - ca = nsvg__applyOpacity(grad->stops[0].color, opacity); - ua = nsvg__clampf(grad->stops[0].offset, 0, 1); - ub = nsvg__clampf(grad->stops[grad->nstops-1].offset, ua, 1); - ia = (int)(ua * 255.0f); - ib = (int)(ub * 255.0f); - for (i = 0; i < ia; i++) { - cache->colors[i] = ca; - } - - for (i = 0; i < grad->nstops-1; i++) { - ca = nsvg__applyOpacity(grad->stops[i].color, opacity); - cb = nsvg__applyOpacity(grad->stops[i+1].color, opacity); - ua = nsvg__clampf(grad->stops[i].offset, 0, 1); - ub = nsvg__clampf(grad->stops[i+1].offset, 0, 1); - ia = (int)(ua * 255.0f); - ib = (int)(ub * 255.0f); - count = ib - ia; - if (count <= 0) continue; - u = 0; - du = 1.0f / (float)count; - for (j = 0; j < count; j++) { - cache->colors[ia+j] = nsvg__lerpRGBA(ca,cb,u); - u += du; - } - } - - for (i = ib; i < 256; i++) - cache->colors[i] = cb; - } - -} - -/* -static void dumpEdges(NSVGrasterizer* r, const char* name) -{ - float xmin = 0, xmax = 0, ymin = 0, ymax = 0; - NSVGedge *e = NULL; - int i; - if (r->nedges == 0) return; - FILE* fp = fopen(name, "w"); - if (fp == NULL) return; - - xmin = xmax = r->edges[0].x0; - ymin = ymax = r->edges[0].y0; - for (i = 0; i < r->nedges; i++) { - e = &r->edges[i]; - xmin = nsvg__minf(xmin, e->x0); - xmin = nsvg__minf(xmin, e->x1); - xmax = nsvg__maxf(xmax, e->x0); - xmax = nsvg__maxf(xmax, e->x1); - ymin = nsvg__minf(ymin, e->y0); - ymin = nsvg__minf(ymin, e->y1); - ymax = nsvg__maxf(ymax, e->y0); - ymax = nsvg__maxf(ymax, e->y1); - } - - fprintf(fp, "", xmin, ymin, (xmax - xmin), (ymax - ymin)); - - for (i = 0; i < r->nedges; i++) { - e = &r->edges[i]; - fprintf(fp ,"", e->x0,e->y0, e->x1,e->y1); - } - - for (i = 0; i < r->npoints; i++) { - if (i+1 < r->npoints) - fprintf(fp ,"", r->points[i].x, r->points[i].y, r->points[i+1].x, r->points[i+1].y); - fprintf(fp ,"", r->points[i].x, r->points[i].y, r->points[i].flags == 0 ? "#f00" : "#0f0"); - } - - fprintf(fp, ""); - fclose(fp); -} -*/ - -void nsvgRasterize(NSVGrasterizer* r, - NSVGimage* image, float tx, float ty, float scale, - unsigned char* dst, int w, int h, int stride) -{ - NSVGshape *shape = NULL; - NSVGedge *e = NULL; - NSVGcachedPaint cache; - int i; - - r->bitmap = dst; - r->width = w; - r->height = h; - r->stride = stride; - - if (w > r->cscanline) { - r->cscanline = w; - r->scanline = (unsigned char*)realloc(r->scanline, w); - if (r->scanline == NULL) return; - } - - for (i = 0; i < h; i++) - memset(&dst[i*stride], 0, w*4); - - for (shape = image->shapes; shape != NULL; shape = shape->next) { - if (!(shape->flags & NSVG_FLAGS_VISIBLE)) - continue; - - if (shape->fill.type != NSVG_PAINT_NONE) { - nsvg__resetPool(r); - r->freelist = NULL; - r->nedges = 0; - - nsvg__flattenShape(r, shape, scale); - - // Scale and translate edges - for (i = 0; i < r->nedges; i++) { - e = &r->edges[i]; - e->x0 = tx + e->x0; - e->y0 = (ty + e->y0) * NSVG__SUBSAMPLES; - e->x1 = tx + e->x1; - e->y1 = (ty + e->y1) * NSVG__SUBSAMPLES; - } - - // Rasterize edges - qsort(r->edges, r->nedges, sizeof(NSVGedge), nsvg__cmpEdge); - - // now, traverse the scanlines and find the intersections on each scanline, use non-zero rule - nsvg__initPaint(&cache, &shape->fill, shape->opacity); - - nsvg__rasterizeSortedEdges(r, tx,ty,scale, &cache, shape->fillRule); - } - if (shape->stroke.type != NSVG_PAINT_NONE && (shape->strokeWidth * scale) > 0.01f) { - nsvg__resetPool(r); - r->freelist = NULL; - r->nedges = 0; - - nsvg__flattenShapeStroke(r, shape, scale); - -// dumpEdges(r, "edge.svg"); - - // Scale and translate edges - for (i = 0; i < r->nedges; i++) { - e = &r->edges[i]; - e->x0 = tx + e->x0; - e->y0 = (ty + e->y0) * NSVG__SUBSAMPLES; - e->x1 = tx + e->x1; - e->y1 = (ty + e->y1) * NSVG__SUBSAMPLES; - } - - // Rasterize edges - qsort(r->edges, r->nedges, sizeof(NSVGedge), nsvg__cmpEdge); - - // now, traverse the scanlines and find the intersections on each scanline, use non-zero rule - nsvg__initPaint(&cache, &shape->stroke, shape->opacity); - - nsvg__rasterizeSortedEdges(r, tx,ty,scale, &cache, NSVG_FILLRULE_NONZERO); - } - } - - nsvg__unpremultiplyAlpha(dst, w, h, stride); - - r->bitmap = NULL; - r->width = 0; - r->height = 0; - r->stride = 0; -} - -#endif diff --git a/src/occt_wrapper/CMakeLists.txt b/src/occt_wrapper/CMakeLists.txt index ed75531a963..8ab9fb4be8e 100644 --- a/src/occt_wrapper/CMakeLists.txt +++ b/src/occt_wrapper/CMakeLists.txt @@ -50,6 +50,8 @@ set(OCCT_LIBS TKernel ) +slic3r_remap_configs("${OCCT_LIBS}" RelWithDebInfo Release) + target_include_directories(OCCTWrapper PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) target_include_directories(OCCTWrapper PUBLIC ${OpenCASCADE_INCLUDE_DIR}) target_link_libraries(OCCTWrapper ${OCCT_LIBS}) diff --git a/src/platform/msw/PrusaSlicer-gcodeviewer.rc.in b/src/platform/msw/PrusaSlicer-gcodeviewer.rc.in index 77b7c55b9e3..875399e6def 100644 --- a/src/platform/msw/PrusaSlicer-gcodeviewer.rc.in +++ b/src/platform/msw/PrusaSlicer-gcodeviewer.rc.in @@ -12,7 +12,7 @@ PRODUCTVERSION @SLIC3R_RC_VERSION@ VALUE "ProductName", "@SLIC3R_APP_NAME@ G-code Viewer" VALUE "ProductVersion", "@SLIC3R_BUILD_ID@" VALUE "InternalName", "@SLIC3R_APP_NAME@ G-code Viewer" - VALUE "LegalCopyright", "Copyright \251 2016-2022 Prusa Research, \251 2011-2018 Alessandro Ranellucci" + VALUE "LegalCopyright", "Copyright \251 2016-2023 Prusa Research, \251 2011-2018 Alessandro Ranellucci" VALUE "OriginalFilename", "prusa-gcodeviewer.exe" } } diff --git a/src/platform/msw/PrusaSlicer.rc.in b/src/platform/msw/PrusaSlicer.rc.in index 8abc933548a..d2fe4ca1b9e 100644 --- a/src/platform/msw/PrusaSlicer.rc.in +++ b/src/platform/msw/PrusaSlicer.rc.in @@ -12,7 +12,7 @@ PRODUCTVERSION @SLIC3R_RC_VERSION@ VALUE "ProductName", "@SLIC3R_APP_NAME@" VALUE "ProductVersion", "@SLIC3R_BUILD_ID@" VALUE "InternalName", "@SLIC3R_APP_NAME@" - VALUE "LegalCopyright", "Copyright \251 2016-2022 Prusa Research, \251 2011-2018 Alessandro Ranellucci" + VALUE "LegalCopyright", "Copyright \251 2016-2023 Prusa Research, \251 2011-2018 Alessandro Ranellucci" VALUE "OriginalFilename", "prusa-slicer.exe" } } diff --git a/src/platform/osx/Info.plist.in b/src/platform/osx/Info.plist.in index b53111d1db6..bed2db6ba58 100644 --- a/src/platform/osx/Info.plist.in +++ b/src/platform/osx/Info.plist.in @@ -5,7 +5,7 @@ CFBundleExecutable @SLIC3R_APP_KEY@ CFBundleGetInfoString - @SLIC3R_APP_NAME@ Copyright (C) 2011-2019 Alessandro Ranellucci, (C) 2016-2022 Prusa Reseach + @SLIC3R_APP_NAME@ Copyright (C) 2011-2019 Alessandro Ranellucci, (C) 2016-2023 Prusa Reseach CFBundleIconFile PrusaSlicer.icns CFBundleName @@ -110,8 +110,19 @@ Alternate + CFBundleURLTypes + + + CFBundleURLName + PrusaSlicer Downloads + CFBundleURLSchemes + + prusaslicer + + + LSMinimumSystemVersion - 10.10 + 10.12 NSPrincipalClass NSApplication NSHighResolutionCapable diff --git a/src/qhull/Announce.txt b/src/qhull/Announce.txt deleted file mode 100644 index 635cff1afbe..00000000000 --- a/src/qhull/Announce.txt +++ /dev/null @@ -1,47 +0,0 @@ - - Qhull 2015.2 2016/01/18 - - http://www.qhull.org - git@github.com:qhull/qhull.git - http://www.geomview.org - -Qhull computes convex hulls, Delaunay triangulations, Voronoi diagrams, -furthest-site Voronoi diagrams, and halfspace intersections about a point. -It runs in 2-d, 3-d, 4-d, or higher. It implements the Quickhull algorithm -for computing convex hulls. Qhull handles round-off errors from floating -point arithmetic. It can approximate a convex hull. - -The program includes options for hull volume, facet area, partial hulls, -input transformations, randomization, tracing, multiple output formats, and -execution statistics. The program can be called from within your application. -You can view the results in 2-d, 3-d and 4-d with Geomview. - -To download Qhull: - http://www.qhull.org/download - git@github.com:qhull/qhull.git - -Download qhull-96.ps for: - - Barber, C. B., D.P. Dobkin, and H.T. Huhdanpaa, "The - Quickhull Algorithm for Convex Hulls," ACM Trans. on - Mathematical Software, 22(4):469-483, Dec. 1996. - http://www.acm.org/pubs/citations/journals/toms/1996-22-4/p469-barber/ - http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.117.405 - -Abstract: - -The convex hull of a set of points is the smallest convex set that contains -the points. This article presents a practical convex hull algorithm that -combines the two-dimensional Quickhull Algorithm with the general dimension -Beneath-Beyond Algorithm. It is similar to the randomized, incremental -algorithms for convex hull and Delaunay triangulation. We provide empirical -evidence that the algorithm runs faster when the input contains non-extreme -points, and that it uses less memory. - -Computational geometry algorithms have traditionally assumed that input sets -are well behaved. When an algorithm is implemented with floating point -arithmetic, this assumption can lead to serious errors. We briefly describe -a solution to this problem when computing the convex hull in two, three, or -four dimensions. The output is a set of "thick" facets that contain all -possible exact convex hulls of the input. A variation is effective in five -or more dimensions. diff --git a/src/qhull/CMakeLists.txt b/src/qhull/CMakeLists.txt deleted file mode 100644 index ab9aba9afa0..00000000000 --- a/src/qhull/CMakeLists.txt +++ /dev/null @@ -1,147 +0,0 @@ - -# This CMake file is written specifically to integrate qhull library with Slic3rPE -# (see https://github.com/prusa3d/PrusaSlicer for more information about the project) -# -# Only original libraries qhullstatic_r and qhullcpp are included. -# They are built as a single statically linked library. -# -# Created by modification of the original qhull CMakeLists. -# Lukas Matena (25.7.2018), lukasmatena@seznam.cz - -# see bug report: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=925540 - -find_package(Qhull 7.2 QUIET) - -add_library(qhull INTERFACE) - -if(Qhull_FOUND) - -message(STATUS "Using qhull from system.") -if(SLIC3R_STATIC) - slic3r_remap_configs("Qhull::qhullcpp;Qhull::qhullstatic_r" RelWithDebInfo Release) - target_link_libraries(qhull INTERFACE Qhull::qhullcpp Qhull::qhullstatic_r) -else() - slic3r_remap_configs("Qhull::qhullcpp;Qhull::qhull_r" RelWithDebInfo Release) - target_link_libraries(qhull INTERFACE Qhull::qhullcpp Qhull::qhull_r) -endif() - -else(Qhull_FOUND) - -project(qhull) -cmake_minimum_required(VERSION 2.6) - -# Define qhull_VERSION in CMakeLists.txt, Makefile, qhull-exports.def, qhull_p-exports.def, qhull_r-exports.def, qhull-warn.pri -set(qhull_VERSION2 "2015.2 2016/01/18") # not used, See global.c, global_r.c, rbox.c, rbox_r.c -set(qhull_VERSION "7.2.0") # Advance every release - -#include(CMakeModules/CheckLFS.cmake) -#option(WITH_LFS "Enable Large File Support" ON) -#check_lfs(WITH_LFS) - - -message(STATUS "qhull Version: ${qhull_VERSION} (static linking)") - - -set(libqhull_HEADERS - # reentrant qhull HEADERS: - src/libqhull_r/libqhull_r.h - src/libqhull_r/geom_r.h - src/libqhull_r/io_r.h - src/libqhull_r/mem_r.h - src/libqhull_r/merge_r.h - src/libqhull_r/poly_r.h - src/libqhull_r/qhull_ra.h - src/libqhull_r/qset_r.h - src/libqhull_r/random_r.h - src/libqhull_r/stat_r.h - src/libqhull_r/user_r.h - - # C++ interface to reentrant Qhull HEADERS: - src/libqhullcpp/Coordinates.h - src/libqhullcpp/functionObjects.h - src/libqhullcpp/PointCoordinates.h - src/libqhullcpp/Qhull.h - src/libqhullcpp/QhullError.h - src/libqhullcpp/QhullFacet.h - src/libqhullcpp/QhullFacetList.h - src/libqhullcpp/QhullFacetSet.h - src/libqhullcpp/QhullHyperplane.h - src/libqhullcpp/QhullIterator.h - src/libqhullcpp/QhullLinkedList.h - src/libqhullcpp/QhullPoint.h - src/libqhullcpp/QhullPoints.h - src/libqhullcpp/QhullPointSet.h - src/libqhullcpp/QhullQh.h - src/libqhullcpp/QhullRidge.h - src/libqhullcpp/QhullSet.h - src/libqhullcpp/QhullSets.h - src/libqhullcpp/QhullStat.h - src/libqhullcpp/QhullVertex.h - src/libqhullcpp/QhullVertexSet.h - src/libqhullcpp/RboxPoints.h - src/libqhullcpp/RoadError.h - src/libqhullcpp/RoadLogEvent.h - src/qhulltest/RoadTest.h -) - -set(libqhull_SOURCES - # reentrant qhull SOURCES: - src/libqhull_r/global_r.c - src/libqhull_r/stat_r.c - src/libqhull_r/geom2_r.c - src/libqhull_r/poly2_r.c - src/libqhull_r/merge_r.c - src/libqhull_r/libqhull_r.c - src/libqhull_r/geom_r.c - src/libqhull_r/poly_r.c - src/libqhull_r/qset_r.c - src/libqhull_r/mem_r.c - src/libqhull_r/random_r.c - src/libqhull_r/usermem_r.c - src/libqhull_r/io_r.c - src/libqhull_r/user_r.c - src/libqhull_r/rboxlib_r.c - - # C++ interface to reentrant Qhull SOURCES: - src/libqhullcpp/Coordinates.cpp - src/libqhullcpp/PointCoordinates.cpp - src/libqhullcpp/Qhull.cpp - src/libqhullcpp/QhullFacet.cpp - src/libqhullcpp/QhullFacetList.cpp - src/libqhullcpp/QhullFacetSet.cpp - src/libqhullcpp/QhullHyperplane.cpp - src/libqhullcpp/QhullPoint.cpp - src/libqhullcpp/QhullPointSet.cpp - src/libqhullcpp/QhullPoints.cpp - src/libqhullcpp/QhullQh.cpp - src/libqhullcpp/QhullRidge.cpp - src/libqhullcpp/QhullSet.cpp - src/libqhullcpp/QhullStat.cpp - src/libqhullcpp/QhullVertex.cpp - src/libqhullcpp/QhullVertexSet.cpp - src/libqhullcpp/RboxPoints.cpp - src/libqhullcpp/RoadError.cpp - src/libqhullcpp/RoadLogEvent.cpp - - # headers for both (libqhullr and libqhullcpp: - ${libqhull_HEADERS} -) - - -################################################## -# combined library (reentrant qhull and qhullcpp) for Slic3r: -set(qhull_STATIC qhullstatic) -add_library(${qhull_STATIC} STATIC ${libqhull_SOURCES}) -set_target_properties(${qhull_STATIC} PROPERTIES - VERSION ${qhull_VERSION}) - -if(UNIX) - target_link_libraries(${qhull_STATIC} m) -endif(UNIX) -################################################## - -# LIBDIR is defined in the main xs CMake file: -target_include_directories(${qhull_STATIC} BEFORE PUBLIC ${LIBDIR}/qhull/src) -target_link_libraries(qhull INTERFACE ${qhull_STATIC}) - -endif() diff --git a/src/qhull/COPYING.txt b/src/qhull/COPYING.txt deleted file mode 100644 index 2895ec6a32f..00000000000 --- a/src/qhull/COPYING.txt +++ /dev/null @@ -1,38 +0,0 @@ - Qhull, Copyright (c) 1993-2015 - - C.B. Barber - Arlington, MA - - and - - The National Science and Technology Research Center for - Computation and Visualization of Geometric Structures - (The Geometry Center) - University of Minnesota - - email: qhull@qhull.org - -This software includes Qhull from C.B. Barber and The Geometry Center. -Qhull is copyrighted as noted above. Qhull is free software and may -be obtained via http from www.qhull.org. It may be freely copied, modified, -and redistributed under the following conditions: - -1. All copyright notices must remain intact in all files. - -2. A copy of this text file must be distributed along with any copies - of Qhull that you redistribute; this includes copies that you have - modified, or copies of programs or other software products that - include Qhull. - -3. If you modify Qhull, you must include a notice giving the - name of the person performing the modification, the date of - modification, and the reason for such modification. - -4. When distributing modified versions of Qhull, or other software - products that include Qhull, you must provide notice that the original - source code may be obtained as noted above. - -5. There is no warranty or other guarantee of fitness for Qhull, it is - provided solely "as is". Bug reports or fixes may be sent to - qhull_bug@qhull.org; the authors may or may not act on them as - they desire. diff --git a/src/qhull/README.txt b/src/qhull/README.txt deleted file mode 100644 index c811b9f80ff..00000000000 --- a/src/qhull/README.txt +++ /dev/null @@ -1,623 +0,0 @@ -This distribution of qhull library is only meant for interfacing qhull with Slic3rPE -(https://github.com/prusa3d/PrusaSlicer). - -The qhull source file was acquired from https://github.com/qhull/qhull at revision -f0bd8ceeb84b554d7cdde9bbfae7d3351270478c. - -No changes to the qhull library were made, except for -- setting REALfloat=1 in user_r.h to enforce calculations in floats -- modifying CMakeLists.txt (the original was renamed to origCMakeLists.txt) - -Many thanks to C. Bradford Barber and all contributors. - -Lukas Matena (lukasmatena@seznam.cz) -25.7.2018 - - -See original contents of the README file below. - -====================================================================================== -====================================================================================== -====================================================================================== - - -Name - - qhull, rbox 2015.2 2016/01/18 - -Convex hull, Delaunay triangulation, Voronoi diagrams, Halfspace intersection - - Documentation: - html/index.htm - - - Available from: - - - (git@github.com:qhull/qhull.git) - - News and a paper: - - - - Version 1 (simplicial only): - - -Purpose - - Qhull is a general dimension convex hull program that reads a set - of points from stdin, and outputs the smallest convex set that contains - the points to stdout. It also generates Delaunay triangulations, Voronoi - diagrams, furthest-site Voronoi diagrams, and halfspace intersections - about a point. - - Rbox is a useful tool in generating input for Qhull; it generates - hypercubes, diamonds, cones, circles, simplices, spirals, - lattices, and random points. - - Qhull produces graphical output for Geomview. This helps with - understanding the output. - -Environment requirements - - Qhull and rbox should run on all 32-bit and 64-bit computers. Use - an ANSI C or C++ compiler to compile the program. The software is - self-contained. It comes with examples and test scripts. - - Qhull's C++ interface uses the STL. The C++ test program uses QTestLib - from the Qt Framework. Qhull's C++ interface may change without - notice. Eventually, it will move into the qhull shared library. - - Qhull is copyrighted software. Please read COPYING.txt and REGISTER.txt - before using or distributing Qhull. - -To cite Qhull, please use - - Barber, C.B., Dobkin, D.P., and Huhdanpaa, H.T., "The Quickhull - algorithm for convex hulls," ACM Trans. on Mathematical Software, - 22(4):469-483, Dec 1996, http://www.qhull.org. - -To modify Qhull, particularly the C++ interface - - Qhull is on GitHub - (http://github.com/qhull/qhull, git@github.com:qhull/qhull.git) - - For internal documentation, see html/qh-code.htm - -To install Qhull - - Qhull is precompiled for Windows 32-bit, otherwise it needs compilation. - - Qhull includes Makefiles for gcc and other targets, CMakeLists.txt for CMake, - .sln/.vcproj/.vcxproj files for Microsoft Visual Studio, and .pro files - for Qt Creator. It compiles under Windows with mingw. - - Install and build instructions follow. - - See the end of this document for a list of distributed files. - ------------------ -Installing Qhull on Windows 10, 8, 7 (32- or 64-bit), Windows XP, and Windows NT - - The zip file contains rbox.exe, qhull.exe, qconvex.exe, qdelaunay.exe, - qhalf.exe, qvoronoi.exe, testqset.exe, user_eg*.exe, documentation files, - and source files. Qhull.exe and user-eg3.exe are compiled with the reentrant - library while the other executables use the non-reentrant library. - - To install Qhull: - - Unzip the files into a directory (e.g., named 'qhull') - - Click on QHULL-GO or open a command window into Qhull's bin directory. - - Test with 'rbox D4 | qhull' - - To uninstall Qhull - - Delete the qhull directory - - To learn about Qhull: - - Execute 'qconvex' for a synopsis and examples. - - Execute 'rbox 10 | qconvex' to compute the convex hull of 10 random points. - - Execute 'rbox 10 | qconvex i TO file' to write results to 'file'. - - Browse the documentation: qhull\html\index.htm - - If an error occurs, Windows sends the error to stdout instead of stderr. - Use 'TO xxx' to send normal output to xxx - - To improve the command window - - Double-click the window bar to increase the size of the window - - Right-click the window bar - - Select Properties - - Check QuickEdit Mode - Select text with right-click or Enter - Paste text with right-click - - Change Font to Lucinda Console - - Change Layout to Screen Buffer Height 999, Window Size Height 55 - - Change Colors to Screen Background White, Screen Text Black - - Click OK - - Select 'Modify shortcut that started this window', then OK - - If you use qhull a lot, install a bash shell such as - MSYS (www.mingw.org/wiki/msys), Road Bash (www.qhull.org/bash), - or Cygwin (www.cygwin.com). - ------------------ -Installing Qhull on Unix with gcc - - To build Qhull, static libraries, shared library, and C++ interface - - Download and extract Qhull (either GitHub, .tgz file, or .zip file) - - make - - export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH - - The Makefiles may be edited for other compilers. - If 'testqset' exits with an error, qhull is broken - - A simple Makefile for Qhull is in src/libqhull and src/libqhull_r. - To build the Qhull executables and libqhullstatic - - Extract Qhull from qhull...tgz or qhull...zip - - cd src/libqhull_r # cd src/libqhull - - make - - ------------------ -Installing Qhull with CMake 2.6 or later - - See CMakeLists.txt for examples and further build instructions - - To build Qhull, static libraries, shared library, and C++ interface - - Download and extract Qhull (either GitHub, .tgz file, or .zip file) - - cd build - - cmake --help # List build generators - - make -G "" .. && cmake .. - - cmake .. - - make - - make install - - The ".." is important. It refers to the parent directory (i.e., qhull/) - - On Windows, CMake installs to C:/Program Files/qhull. 64-bit generators - have a "Win64" tag. - - If creating a qhull package, please include a pkg-config file based on build/qhull*.pc.in - - If cmake fails with "No CMAKE_C_COMPILER could be found" - - cmake was not able to find the build environment specified by -G "..." - ------------------ -Installing Qhull with Qt - - To build Qhull, including its C++ test (qhulltest) - - Download and extract Qhull (either GitHub, .tgz file, or .zip file) - - Load src/qhull-all.pro into QtCreator - - Build - -------------------- -Working with Qhull's C++ interface - - See html/qh-code.htm#cpp for calling Qhull from C++ programs - - See html/qh-code.htm#reentrant for converting from Qhull-2012 - - Examples of using the C++ interface - user_eg3_r.cpp - qhulltest/*_test.cpp - - Qhull's C++ interface is likely to change. Stay current with GitHub. - - To clone Qhull's next branch from http://github.com/qhull/qhull - git init - git clone git@github.com:qhull/qhull.git - cd qhull - git checkout next - ... - git pull origin next - - Compile qhullcpp and libqhullstatic_r with the same compiler. Both libraries - use the C routines setjmp() and longjmp() for error handling. They must - be compiled with the same compiler. - -------------------- -Calling Qhull from C programs - - See html/qh-code.htm#library for calling Qhull from C programs - - See html/qh-code.htm#reentrant for converting from Qhull-2012 - - Warning: You will need to understand Qhull's data structures and read the - code. Most users will find it easier to call Qhull as an external command. - - The new, reentrant 'C' code (src/libqhull_r), passes a pointer to qhT - to most Qhull routines. This allows multiple instances of Qhull to run - at the same time. It simplifies the C++ interface. - - The non-reentrant 'C' code (src/libqhull) looks unusual. It refers to - Qhull's global data structure, qhT, through a 'qh' macro (e.g., 'qh ferr'). - This allows the same code to use static memory or heap memory. - If qh_QHpointer is defined, qh_qh is a pointer to an allocated qhT; - otherwise qh_qh is a global static data structure of type qhT. - ------------------- -Compiling Qhull with Microsoft Visual C++ - - To compile 32-bit Qhull with Microsoft Visual C++ 2010 and later - - Download and extract Qhull (either GitHub, .tgz file, or .zip file) - - Load solution build/qhull-32.sln - - Build target 'Win32' - - Project qhulltest requires Qt for DevStudio (http://www.qt.io) - Set the QTDIR environment variable to your Qt directory (e.g., c:/qt/5.2.0/5.2.0/msvc2012) - If QTDIR is incorrect, precompile will fail with 'Can not locate the file specified' - - To compile 64-bit Qhull with Microsoft Visual C++ 2010 and later - - 64-bit Qhull has larger data structures due to 64-bit pointers - - Download and extract Qhull (either GitHub, .tgz file, or .zip file) - - Load solution build/qhull-64.sln - - Build target 'Win32' - - Project qhulltest requires Qt for DevStudio (http://www.qt.io) - Set the QTDIR environment variable to your Qt directory (e.g., c:/qt/5.2.0/5.2.0/msvc2012_64) - If QTDIR is incorrect, precompile will fail with 'Can not locate the file specified' - - To compile Qhull with Microsoft Visual C++ 2005 (vcproj files) - - Download and extract Qhull (either GitHub, .tgz file, or .zip file) - - Load solution build/qhull.sln - - Build target 'win32' (not 'x64') - - Project qhulltest requires Qt for DevStudio (http://www.qt.io) - Set the QTDIR environment variable to your Qt directory (e.g., c:/qt/4.7.4) - If QTDIR is incorrect, precompile will fail with 'Can not locate the file specified' - ------------------ -Compiling Qhull with Qt Creator - - Qt (http://www.qt.io) is a C++ framework for Windows, Linux, and Macintosh - - Qhull uses QTestLib to test qhull's C++ interface (see src/qhulltest/) - - To compile Qhull with Qt Creator - - Download and extract Qhull (either GitHub, .tgz file, or .zip file) - - Download the Qt SDK - - Start Qt Creator - - Load src/qhull-all.pro - - Build - ------------------ -Compiling Qhull with mingw on Windows - - To compile Qhull with MINGW - - Download and extract Qhull (either GitHub, .tgz file, or .zip file) - - Install Road Bash (http://www.qhull.org/bash) - or install MSYS (http://www.mingw.org/wiki/msys) - - Install MINGW-w64 (http://sourceforge.net/projects/mingw-w64). - Mingw is included with Qt SDK. - - make - ------------------ -Compiling Qhull with cygwin on Windows - - To compile Qhull with cygwin - - Download and extract Qhull (either GitHub, .tgz file, or .zip file) - - Install cygwin (http://www.cygwin.com) - - Include packages for gcc, make, ar, and ln - - make - ------------------ -Compiling from Makfile without gcc - - The file, qhull-src.tgz, contains documentation and source files for - qhull and rbox. - - To unpack the tgz file - - tar zxf qhull-src.tgz - - cd qhull - - Use qhull/Makefile - Simpler Makefiles are qhull/src/libqhull/Makefile and qhull/src/libqhull_r/Makefile - - Compiling qhull and rbox with Makefile - - in Makefile, check the CC, CCOPTS1, PRINTMAN, and PRINTC defines - - the defaults are gcc and enscript - - CCOPTS1 should include the ANSI flag. It defines __STDC__ - - in user.h, check the definitions of qh_SECticks and qh_CPUclock. - - use '#define qh_CLOCKtype 2' for timing runs longer than 1 hour - - type: make - - this builds: qhull qconvex qdelaunay qhalf qvoronoi rbox libqhull.a libqhull_r.a - - type: make doc - - this prints the man page - - See also qhull/html/index.htm - - if your compiler reports many errors, it is probably not a ANSI C compiler - - you will need to set the -ansi switch or find another compiler - - if your compiler warns about missing prototypes for fprintf() etc. - - this is ok, your compiler should have these in stdio.h - - if your compiler warns about missing prototypes for memset() etc. - - include memory.h in qhull_a.h - - if your compiler reports "global.c: storage size of 'qh_qh' isn't known" - - delete the initializer "={0}" in global.c, stat.c and mem.c - - if your compiler warns about "stat.c: improper initializer" - - this is ok, the initializer is not used - - if you have trouble building libqhull.a with 'ar' - - try 'make -f Makefile.txt qhullx' - - if the code compiles, the qhull test case will automatically execute - - if an error occurs, there's an incompatibility between machines - - If you can, try a different compiler - - You can turn off the Qhull memory manager with qh_NOmem in mem.h - - You can turn off compiler optimization (-O2 in Makefile) - - If you find the source of the problem, please let us know - - to install the programs and their man pages: - - define MANDIR and BINDIR - - type 'make install' - - - if you have Geomview (www.geomview.org) - - try 'rbox 100 | qconvex G >a' and load 'a' into Geomview - - run 'q_eg' for Geomview examples of Qhull output (see qh-eg.htm) - ------------------- -Compiling on other machines and compilers - - Qhull may compile with Borland C++ 5.0 bcc32. A Makefile is included. - Execute 'cd src/libqhull; make -f Mborland'. If you use the Borland IDE, set - the ANSI option in Options:Project:Compiler:Source:Language-compliance. - - Qhull may compile with Borland C++ 4.02 for Win32 and DOS Power Pack. - Use 'cd src/libqhull; make -f Mborland -D_DPMI'. Qhull 1.0 compiles with - Borland C++ 4.02. For rbox 1.0, use "bcc32 -WX -w- -O2-e -erbox -lc rbox.c". - Use the same options for Qhull 1.0. [D. Zwick] - - If you have troubles with the memory manager, you can turn it off by - defining qh_NOmem in mem.h. - ------------------ -Distributed files - - README.txt // Instructions for installing Qhull - REGISTER.txt // Qhull registration - COPYING.txt // Copyright notice - QHULL-GO.lnk // Windows icon for eg/qhull-go.bat - Announce.txt // Announcement - CMakeLists.txt // CMake build file (2.6 or later) - CMakeModules/CheckLFS.cmake // enables Large File Support in cmake - File_id.diz // Package descriptor - index.htm // Home page - Makefile // Makefile for gcc and other compilers - qhull*.md5sum // md5sum for all files - - bin/* // Qhull executables and dll (.zip only) - build/qhull*.pc.in // pkg-config templates for qhull_r, qhull, and qhull_p - build/qhull-32.sln // 32-bit DevStudio solution and project files (2010 and later) - build/*-32.vcxproj - build/qhull-64.sln // 64-bit DevStudio solution and project files (2010 and later) - build/*-64.vcxproj - build/qhull.sln // DevStudio solution and project files (2005 and 2009) - build/*.vcproj - eg/* // Test scripts and geomview files from q_eg - html/index.htm // Manual - html/qh-faq.htm // Frequently asked questions - html/qh-get.htm // Download page - html/qhull-cpp.xml // C++ style notes as a Road FAQ (www.qhull.org/road) - src/Changes.txt // Change history for Qhull and rbox - src/qhull-all.pro // Qt project - -eg/ - q_eg // shell script for Geomview examples (eg.01.cube) - q_egtest // shell script for Geomview test examples - q_test // shell script to test qhull - q_test-ok.txt // output from q_test - qhulltest-ok.txt // output from qhulltest (Qt only) - make-vcproj.sh // bash shell script to create vcproj and vcxprog files - qhull-zip.sh // bash shell script for distribution files - -rbox consists of (bin, html): - rbox.exe // Win32 executable (.zip only) - rbox.htm // html manual - rbox.man // Unix man page - rbox.txt - -qhull consists of (bin, html): - qconvex.exe // Win32 executables and dlls (.zip download only) - qhull.exe // Built with the reentrant library (about 2% slower) - qdelaunay.exe - qhalf.exe - qvoronoi.exe - qhull_r.dll - qhull-go.bat // command window - qconvex.htm // html manual - qdelaun.htm - qdelau_f.htm - qhalf.htm - qvoronoi.htm - qvoron_f.htm - qh-eg.htm - qh-code.htm - qh-impre.htm - index.htm - qh-opt*.htm - qh-quick.htm - qh--*.gif // images for manual - normal_voronoi_knauss_oesterle.jpg - qhull.man // Unix man page - qhull.txt - -bin/ - msvcr80.dll // Visual C++ redistributable file (.zip download only) - -src/ - qhull/unix.c // Qhull and rbox applications using non-reentrant libqhullstatic.a - rbox/rbox.c - qconvex/qconvex.c - qhalf/qhalf.c - qdelaunay/qdelaunay.c - qvoronoi/qvoronoi.c - - qhull/unix_r.c // Qhull and rbox applications using reentrant libqhullstatic_r.a - rbox/rbox_r.c - qconvex/qconvex_r.c // Qhull applications built with reentrant libqhull_r/Makefile - qhalf/qhalf_r.c - qdelaunay/qdelaun_r.c - qvoronoi/qvoronoi_r.c - - user_eg/user_eg_r.c // example of using qhull_r.dll from a user program - user_eg2/user_eg2_r.c // example of using libqhullstatic_r.a from a user program - user_eg3/user_eg3_r.cpp // example of Qhull's C++ interface libqhullcpp with libqhullstatic_r.a - qhulltest/qhulltest.cpp // Test of Qhull's C++ interface using Qt's QTestLib - qhull-*.pri // Include files for Qt projects - testqset_r/testqset_r.c // Test of reentrant qset_r.c and mem_r.c - testqset/testqset.c // Test of non-rentrant qset.c and mem.c - - -src/libqhull - libqhull.pro // Qt project for non-rentrant, shared library (qhull.dll) - index.htm // design documentation for libqhull - qh-*.htm - qhull-exports.def // Export Definition file for Visual C++ - Makefile // Simple gcc Makefile for qhull and libqhullstatic.a - Mborland // Makefile for Borland C++ 5.0 - - libqhull.h // header file for qhull - user.h // header file of user definable constants - libqhull.c // Quickhull algorithm with partitioning - user.c // user re-definable functions - usermem.c - userprintf.c - userprintf_rbox.c - - qhull_a.h // include files for libqhull/*.c - geom.c // geometric routines - geom2.c - geom.h - global.c // global variables - io.c // input-output routines - io.h - mem.c // memory routines, this is stand-alone code - mem.h - merge.c // merging of non-convex facets - merge.h - poly.c // polyhedron routines - poly2.c - poly.h - qset.c // set routines, this only depends on mem.c - qset.h - random.c // utilities w/ Park & Miller's random number generator - random.h - rboxlib.c // point set generator for rbox - stat.c // statistics - stat.h - -src/libqhull_r - libqhull_r.pro // Qt project for rentrant, shared library (qhull_r.dll) - index.htm // design documentation for libqhull_r - qh-*_r.htm - qhull-exports_r.def // Export Definition file for Visual C++ - Makefile // Simple gcc Makefile for qhull and libqhullstatic.a - - libqhull_r.h // header file for qhull - user_r.h // header file of user definable constants - libqhull_r.c // Quickhull algorithm wi_r.hpartitioning - user_r.c // user re-definable functions - usermem.c - userprintf.c - userprintf_rbox.c - qhull_ra.h // include files for libqhull/*_r.c - geom_r.c // geometric routines - geom2.c - geom_r.h - global_r.c // global variables - io_r.c // input-output routines - io_r.h - mem_r.c // memory routines, this is stand-alone code - mem.h - merge_r.c // merging of non-convex facets - merge.h - poly_r.c // polyhedron routines - poly2.c - poly_r.h - qset_r.c // set routines, this only depends on mem_r.c - qset.h - random_r.c // utilities w/ Park & Miller's random number generator - random.h - rboxlib_r.c // point set generator for rbox - stat_r.c // statistics - stat.h - -src/libqhullcpp/ - libqhullcpp.pro // Qt project for renentrant, static C++ library - Qhull.cpp // Calls libqhull_r.c from C++ - Qhull.h - qt-qhull.cpp // Supporting methods for Qt - - Coordinates.cpp // input classes - Coordinates.h - - PointCoordinates.cpp - PointCoordinates.h - RboxPoints.cpp // call rboxlib.c from C++ - RboxPoints.h - - QhullFacet.cpp // data structure classes - QhullFacet.h - QhullHyperplane.cpp - QhullHyperplane.h - QhullPoint.cpp - QhullPoint.h - QhullQh.cpp - QhullRidge.cpp - QhullRidge.h - QhullVertex.cpp - QhullVertex.h - - QhullFacetList.cpp // collection classes - QhullFacetList.h - QhullFacetSet.cpp - QhullFacetSet.h - QhullIterator.h - QhullLinkedList.h - QhullPoints.cpp - QhullPoints.h - QhullPointSet.cpp - QhullPointSet.h - QhullSet.cpp - QhullSet.h - QhullSets.h - QhullVertexSet.cpp - QhullVertexSet.h - - functionObjects.h // supporting classes - QhullError.cpp - QhullError.h - QhullQh.cpp - QhullQh.h - QhullStat.cpp - QhullStat.h - RoadError.cpp // Supporting base classes - RoadError.h - RoadLogEvent.cpp - RoadLogEvent.h - usermem_r-cpp.cpp // Optional override for qh_exit() to throw an error - -src/libqhullstatic/ - libqhullstatic.pro // Qt project for non-reentrant, static library - -src/libqhullstatic_r/ - libqhullstatic_r.pro // Qt project for reentrant, static library - -src/qhulltest/ - qhulltest.pro // Qt project for test of C++ interface - Coordinates_test.cpp // Test of each class - PointCoordinates_test.cpp - Qhull_test.cpp - QhullFacet_test.cpp - QhullFacetList_test.cpp - QhullFacetSet_test.cpp - QhullHyperplane_test.cpp - QhullLinkedList_test.cpp - QhullPoint_test.cpp - QhullPoints_test.cpp - QhullPointSet_test.cpp - QhullRidge_test.cpp - QhullSet_test.cpp - QhullVertex_test.cpp - QhullVertexSet_test.cpp - RboxPoints_test.cpp - RoadTest.cpp // Run multiple test files with QTestLib - RoadTest.h - ------------------ -Authors: - - C. Bradford Barber Hannu Huhdanpaa (Version 1.0) - bradb@shore.net hannu@qhull.org - - Qhull 1.0 and 2.0 were developed under NSF grants NSF/DMS-8920161 - and NSF-CCR-91-15793 750-7504 at the Geometry Center and Harvard - University. If you find Qhull useful, please let us know. diff --git a/src/qhull/REGISTER.txt b/src/qhull/REGISTER.txt deleted file mode 100644 index 16ccb1a58d6..00000000000 --- a/src/qhull/REGISTER.txt +++ /dev/null @@ -1,32 +0,0 @@ -Dear Qhull User - -We would like to find out how you are using our software. Think of -Qhull as a new kind of shareware: you share your science and successes -with us, and we share our software and support with you. - -If you use Qhull, please send us a note telling -us what you are doing with it. - -We need to know: - - (1) What you are working on - an abstract of your work would be - fine. - - (2) How Qhull has helped you, for example, by increasing your - productivity or allowing you to do things you could not do - before. If Qhull had a direct bearing on your work, please - tell us about this. - -We encourage you to cite Qhull in your publications. - -To cite Qhull, please use - - Barber, C.B., Dobkin, D.P., and Huhdanpaa, H.T., "The Quickhull - algorithm for convex hulls," ACM Trans. on Mathematical Software, - 22(4):469-483, Dec 1996, http://www.qhull.org. - -Please send e-mail to - - bradb@shore.net - -Thank you! diff --git a/src/qhull/html/index.htm b/src/qhull/html/index.htm deleted file mode 100644 index ca4789b47f6..00000000000 --- a/src/qhull/html/index.htm +++ /dev/null @@ -1,935 +0,0 @@ - - - - - - -Qhull manual - - - - - -

    Up: Home page for Qhull
    -Up:News about Qhull
    -Up: FAQ about Qhull
    -To: Qhull manual: Table of Contents -(please wait while loading)
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    - -


    - -

    [random-fixed] Qhull manual

    - -

    Qhull is a general dimension code for computing convex hulls, -Delaunay triangulations, halfspace intersections about a point, Voronoi -diagrams, furthest-site Delaunay triangulations, and -furthest-site Voronoi diagrams. These structures have -applications in science, engineering, statistics, and -mathematics. See Fukuda's -introduction to convex hulls, Delaunay triangulations, -Voronoi diagrams, and linear programming. For a detailed -introduction, see O'Rourke ['94], Computational -Geometry in C. -

    - -

    There are six programs. Except for rbox, they use -the same code. Each program includes instructions and examples. -

    -
      -
    • qconvex -- convex hulls -
    • qdelaunay -- Delaunay triangulations and - furthest-site Delaunay triangulations -
    • qhalf -- halfspace intersections about a point -
    • qhull -- all structures with additional options -
    • qvoronoi -- Voronoi diagrams and - furthest-site Voronoi diagrams -
    • rbox -- generate point distributions for qhull -
    -
    - -

    Qhull implements the Quickhull algorithm for computing the -convex hull. Qhull includes options -for hull volume, facet area, multiple output formats, and -graphical output. It can approximate a convex hull.

    - -

    Qhull handles roundoff errors from floating point -arithmetic. It generates a convex hull with "thick" facets. -A facet's outer plane is clearly above all of the points; -its inner plane is clearly below the facet's vertices. Any -exact convex hull must lie between the inner and outer plane. - -

    Qhull uses merged facets, triangulated output, or joggled -input. Triangulated output triangulates non-simplicial, merged -facets. Joggled input also -guarantees simplicial output, but it -is less accurate than merged facets. For merged facets, Qhull -reports the maximum outer and inner plane. - -

    Brad Barber, Arlington, MA

    - -

    Copyright © 1995-2015 C.B. Barber

    - -
    - -

    »Qhull manual: Table of -Contents

    - - -

    »When to use Qhull

    -
    - -

    Qhull constructs convex hulls, Delaunay triangulations, -halfspace intersections about a point, Voronoi diagrams, furthest-site Delaunay -triangulations, and furthest-site Voronoi diagrams.

    - -

    For convex hulls and halfspace intersections, Qhull may be used -for 2-d upto 8-d. For Voronoi diagrams and Delaunay triangulations, Qhull may be -used for 2-d upto 7-d. In higher dimensions, the size of the output -grows rapidly and Qhull does not work well with virtual memory. -If n is the size of -the input and d is the dimension (d>=3), the size of the output -and execution time -grows by n^(floor(d/2) -[see Performance]. For example, do -not try to build a 16-d convex hull of 1000 points. It will -have on the order of 1,000,000,000,000,000,000,000,000 facets. - -

    On a 600 MHz Pentium 3, Qhull computes the 2-d convex hull of -300,000 cocircular points in 11 seconds. It computes the -2-d Delaunay triangulation and 3-d convex hull of 120,000 points -in 12 seconds. It computes the -3-d Delaunay triangulation and 4-d convex hull of 40,000 points -in 18 seconds. It computes the -4-d Delaunay triangulation and 5-d convex hull of 6,000 points -in 12 seconds. It computes the -5-d Delaunay triangulation and 6-d convex hull of 1,000 points -in 12 seconds. It computes the -6-d Delaunay triangulation and 7-d convex hull of 300 points -in 15 seconds. It computes the -7-d Delaunay triangulation and 8-d convex hull of 120 points -in 15 seconds. It computes the -8-d Delaunay triangulation and 9-d convex hull of 70 points -in 15 seconds. It computes the -9-d Delaunay triangulation and 10-d convex hull of 50 points -in 17 seconds. The 10-d convex hull of 50 points has about 90,000 facets. - - -

    Qhull does not support constrained Delaunay -triangulations, triangulation of non-convex surfaces, mesh -generation of non-convex objects, or medium-sized inputs in 9-D -and higher.

    - -

    This is a big package with many options. It is one of the -fastest available. It is the only 3-d code that handles precision -problems due to floating point arithmetic. For example, it -implements the identity function for extreme points (see Imprecision in Qhull).

    - -

    [2016] A newly discovered, bad case for Qhull is multiple, nearly incident points within a 10^-13 ball of 3-d and higher -Delaunay triangulations (input sites in the unit cube). Nearly incident points within substantially -smaller or larger balls are OK. Error QH6271 is reported if a problem occurs. A future release of Qhull -will handle this case. For more information, see "Nearly coincident points on an edge" in Limitations of merged facets - -

    If you need a short code for convex hull, Delaunay -triangulation, or Voronoi volumes consider Clarkson's hull -program. If you need 2-d Delaunay triangulations consider -Shewchuk's triangle -program. It is much faster than Qhull and it allows -constraints. Both programs use exact arithmetic. They are in http://www.netlib.org/voronoi/. - -

    If your input is in general position (i.e., no coplanar or colinear points), -

  1. Tomilov's quickhull.hpp () -or Qhull version -1.0 may meet your needs. Both programs detect precision problems, -but do not handle them.

    - -

    CGAL is a library of efficient and reliable -geometric algorithms. It uses C++ templates and the Boost library to produce dimension-specific -code. This allows more efficient use of memory than Qhull's general-dimension -code. CGAL simulates arbitrary precision while Qhull handles round-off error -with thick facets. Compare the two approaches with Robustness Issues in CGAL, -and Imprecision in Qhull. - - -

    Leda is a -library for writing computational -geometry programs and other combinatorial algorithms. It -includes routines for computing 3-d convex -hulls, 2-d Delaunay triangulations, and 3-d Delaunay triangulations. -It provides rational arithmetic and graphical output. It runs on most -platforms. - -

    If your problem is in high dimensions with a few, -non-simplicial facets, try Fukuda's cdd. -It is much faster than Qhull for these distributions.

    - -

    Custom software for 2-d and 3-d convex hulls may be faster -than Qhull. Custom software should use less memory. Qhull uses -general-dimension data structures and code. The data structures -support non-simplicial facets.

    - -

    Qhull is not suitable for mesh generation or triangulation of -arbitrary surfaces. You may use Qhull if the surface is convex or -completely visible from an interior point (e.g., a star-shaped -polyhedron). First, project each site to a sphere that is -centered at the interior point. Then, compute the convex hull of -the projected sites. The facets of the convex hull correspond to -a triangulation of the surface. For mesh generation of arbitrary -surfaces, see Schneiders' -Finite Element Mesh Generation.

    - -

    Qhull is not suitable for constrained Delaunay triangulations. -With a lot of work, you can write a program that uses Qhull to -add constraints by adding additional points to the triangulation.

    - -

    Qhull is not suitable for the subdivision of arbitrary -objects. Use qdelaunay to subdivide a convex object.

    - -
  2. -

    »Description of -Qhull

    -
    - -

    »definition

    -
    - -

    The convex hull of a point set P is the smallest -convex set that contains P. If P is finite, the -convex hull defines a matrix A and a vector b such -that for all x in P, Ax+b <= [0,...].

    - -

    Qhull computes the convex hull in 2-d, 3-d, 4-d, and higher -dimensions. Qhull represents a convex hull as a list of facets. -Each facet has a set of vertices, a set of neighboring facets, -and a halfspace. A halfspace is defined by a unit normal and an -offset (i.e., a row of A and an element of b).

    - -

    Qhull accounts for round-off error. It returns -"thick" facets defined by two parallel hyperplanes. The -outer planes contain all input points. The inner planes exclude -all output vertices. See Imprecise -convex hulls.

    - -

    Qhull may be used for the Delaunay triangulation or the -Voronoi diagram of a set of points. It may be used for the -intersection of halfspaces.

    - -
    -

    »input format

    -
    - -

    The input data on stdin consists of:

    - -
      -
    • first line contains the dimension
    • -
    • second line contains the number of input points
    • -
    • remaining lines contain point coordinates
    • -
    - -

    For example:

    - -
    -    3  #sample 3-d input
    -    5
    -    0.4 -0.5 1.0
    -    1000 -1e-5 -100
    -    0.3 0.2 0.1
    -    1.0 1.0 1.0
    -    0 0 0
    -
    - -

    Input may be entered by hand. End the input with a control-D -(^D) character.

    - -

    To input data from a file, use I/O redirection or 'TI file'. The filename may not -include spaces or quotes.

    - -

    A comment starts with a non-numeric character and continues to -the end of line. The first comment is reported in summaries and -statistics. With multiple qhull commands, use option 'FQ' to place a comment in the output.

    - -

    The dimension and number of points can be reversed. Comments -and line breaks are ignored. Error reporting is better if there -is one point per line.

    - -
    -

    »option format

    -
    - -

    Use options to specify the output formats and control -Qhull. The qhull program takes all options. The -other programs use a subset of the options. They disallow -experimental and inappropriate options. - -

    -
      -
    • -qconvex == qhull -
    • -qdelaunay == qhull d Qbb -
    • -qhalf == qhull H -
    • -qvoronoi == qhull v Qbb -
    -
    - -

    Single letters are used for output formats and precision -constants. The other options are grouped into menus for formats -('F'), Geomview ('G '), printing ('P'), Qhull control ('Q '), and tracing ('T'). The menu options may be listed -together (e.g., 'GrD3' for 'Gr' and 'GD3'). Options may be in any -order. Capitalized options take a numeric argument (except for 'PG' and 'F' -options). Use option 'FO' to print -the selected options.

    - -

    Qhull uses zero-relative indexing. If there are n -points, the index of the first point is 0 and the index of -the last point is n-1.

    - -

    The default options are:

    - -
      -
    • summary output ('s')
    • -
    • merged facets ('C-0' in 2-d, - 3-d, 4-d; 'Qx' in 5-d and - up)
    • -
    - -

    Except for bounding box -('Qbk:n', etc.), drop facets -('Pdk:n', etc.), and -Qhull command ('FQ'), only the last -occurence of an option counts. -Bounding box and drop facets may be repeated for each dimension. -Option 'FQ' may be repeated any number of times. - -

    The Unix tcsh and ksh shells make it easy to -try out different options. In Windows 95, use a command window with doskey -and a window scroller (e.g., peruse).

    - -
    -

    »output format

    -
    - -

    To write the results to a file, use I/O redirection or 'TO file'. Windows 95 users should use -'TO file' or the console. If a filename is surrounded by single quotes, -it may include spaces. -

    - -

    The default output option is a short summary ('s') to stdout. There are many -others (see output and formats). You can list vertex incidences, -vertices and facets, vertex coordinates, or facet normals. You -can view Qhull objects with Geomview, Mathematica, or Maple. You can -print the internal data structures. You can call Qhull from your -application (see Qhull library).

    - -

    For example, 'qhull o' lists the -vertices and facets of the convex hull.

    - -

    Error messages and additional summaries ('s') go to stderr. Unless -redirected, stderr is the console.

    - -
    -

    »algorithm

    -
    - -

    Qhull implements the Quickhull algorithm for convex hull -[Barber et al. '96]. This algorithm -combines the 2-d Quickhull algorithm with the n-d -beneath-beyond algorithm [c.f., Preparata & Shamos '85]. It is similar to the randomized -algorithms of Clarkson and others [Clarkson & Shor '89; Clarkson et al. '93; -Mulmuley '94]. For a demonstration, see How Qhull adds a point. The main -advantages of Quickhull are output sensitive performance (in -terms of the number of extreme points), reduced space -requirements, and floating-point error handling.

    - -
    -

    »data structures

    -
    - -

    Qhull produces the following data structures for dimension d: -

    - -
      -
    • A coordinate is a real number in floating point - format.
    • -
    • A point is an array of d coordinates. - With option 'QJ', the - coordinates are joggled by a small amount.
    • -
    • A vertex is an input point.
    • -
    • A hyperplane is d normal coefficients and - an offset. The length of the normal is one. The - hyperplane defines a halfspace. If V is a normal, b - is an offset, and x is a point inside the convex - hull, then Vx+b <0.
    • -
    • An outer plane is a positive - offset from a hyperplane. When Qhull is done, all points - will be below all outer planes.
    • -
    • An inner plane is a negative - offset from a hyperplane. When Qhull is done, all - vertices will be above the corresponding inner planes.
    • -
    • An orientation is either 'top' or 'bottom'. It is the - topological equivalent of a hyperplane's geometric - orientation.
    • -
    • A simplicial facet is a set of - d neighboring facets, a set of d vertices, a - hyperplane equation, an inner plane, an outer plane, and - an orientation. For example in 3-d, a simplicial facet is - a triangle.
    • -
    • A centrum is a point on a facet's hyperplane. A - centrum is the average of a facet's vertices. Neighboring - facets are convex if each centrum is below the - neighbor facet's hyperplane.
    • -
    • A ridge is a set of d-1 vertices, two - neighboring facets, and an orientation. For example in - 3-d, a ridge is a line segment.
    • -
    • A non-simplicial facet is a set of ridges, a - hyperplane equation, a centrum, an outer plane, and an - inner plane. The ridges determine a set of neighboring - facets, a set of vertices, and an orientation. Qhull - produces a non-simplicial facet when it merges two facets - together. For example, a cube has six non-simplicial - facets.
    • -
    - -

    For examples, use option 'f'. See polyhedron operations for further -design documentation.

    - -
    -

    »Imprecision in Qhull

    -
    - -

    See Imprecision in Qhull and Merged facets or joggled input

    - -
    -

    »Examples of Qhull

    -
    - -

    See Examples of Qhull. Most of these examples require Geomview. -Some of the examples have pictures -.

    - -
    -
    -

    »Options for using Qhull

    -
    - -

    See Options.

    - -
    -

    »Qhull internals

    -
    - -

    See Internals.

    - -
    -

    »Geomview, Qhull's -graphical viewer

    -
    - -

    Geomview -is an interactive geometry viewing program. -Geomview provides a good visualization of Qhull's 2-d and 3-d results. - -

    Qhull includes Examples of Qhull that may be viewed with Geomview. - -

    Geomview can help visulalize a 3-d Delaunay triangulation or the surface of a 4-d convex hull, -Use option 'QVn' to select the 3-D facets adjacent to a vertex. - -

    You may use Geomview to create movies that animate your objects (c.f., How can I create a video animation?). -Geomview helped create the mathematical videos "Not Knot", "Outside In", and "The Shape of Space" from the Geometry Center. - - -

    »Installing Geomview

    -
    - -

    Geomview is an open source project -under SourceForge. - -

    -For build instructions see -Downloading Geomview. -Geomview builds under Linux, Unix, Macintosh OS X, and Windows. - -

    Geomview has installable packages for Debian and Ubuntu. -The OS X build needs Xcode, an X11 SDK, and Lesstif or Motif. -The Windows build uses Cygwin (see Building Geomview below for instructions). - -

    If using Xforms (e.g., for Geomview's External Modules), install the 'libXpm-devel' package from cygwin and move the xforms directory into your geomview directory, e.g.,
    mv xforms-1.2.4 geomview-1.9.5/xforms - -

    Geomview's ndview provides multiple views into 4-d and higher objects. -This module is out-of-date (geomview-users: 4dview). -Download NDview-sgi.tar.Z at newpieces and 4dview at Geomview/modules. - -

    -

    »Using Geomview

    -
    - -

    Use Geomview to view Examples of Qhull. You can spin the convex hull, fly a camera through its facets, -and see how Qhull produces thick facets in response to round-off error. - -

    Follow these instructions to view 'eg,01.cube' from Examples of Qhull -

      -
    1. Launch an XTerm command shell -
        -
      • If needed, start the X terminal server, Use 'xinit' or 'startx' in /usr/X11R6/bin
        xinit -- -multiwindow -clipboard
        startx -
      • Start an XTerm command shell. In Windows, click the Cygwin/bash icon on your desktop. -
      • Set the DISPLAY variable, e.g.,
        export DISPLAY=:0
        export DISPLAY=:0 >>~/.bashenv -
      -
    2. Use Qhull's Geomview options to create a geomview object -
        -
      • rbox c D3 | qconvex G >eg.01.cube -
      • On windows, convert the output to Unix text format with 'd2u'
        rbox c D3 | qconvex G | d2u >eg.01.cube
        d2u eg.* -
      -
    3. Run Geomview -
        -
      • Start Geomview with your example
        ./geomview eg.01.cube -
      • Follow the instructions in Gemoview Tutorial -
      • Geomview creates the Geomview control panel with Targets and External Module, the Geomview toolbar with buttons for controlling Geomview, and the Geomview camera window showing a cube. -
      • Clear the camera window by selecting your object in the Targets list and 'Edit > Delete' or 'dd' -
      • Load the Geomview files panel. Select 'Open' in the 'File' menu. -
      • Set 'Filter' in the files panel to your example directory followed by '/*' (e.g., '/usr/local/qhull-2015.2/eg/*') -
      • Click 'Filter' in the files panel to view your examples in the 'Files' list. -
      • Load another example into the camera window by selecting it and clicking 'OK'. -
      • Review the instructions for Interacting with Geomview -
      • When viewing multiple objects at once, you may want to turn off normalization. In the 'Inspect > Apperance' control panel, set 'Normalize' to 'None'. -
      -
    - -

    Geomview defines GCL (a textual API for controlling Geomview) and OOGL (a textual file format for defining objects). -

      -
    • To control Geomview, you may use any program that reads and writes from stdin and stdout. For example, it could report Qhull's information about a vertex identified by a double-click 'pick' event. -
    • GCL command language for controlling Geomview -
    • OOGL file format for defining objects (tutorial). -
    • External Modules for interacting with Geomview via GCL -
    • Interact with your objects via pick commands in response to right-mouse double clicks. Enable pick events with the interest command. -
    - -
    -

    »Building Geomview for Windows

    -
    - -

    Compile Geomview under Cygwin. For detailed instructions, see -Building Savi and Geomview under Windows. These instructions are somewhat out-of-date. Updated -instructions follow. - -

    How to compile Geomview under 32-bit Cygwin (October 2015)

    -
      -
    1. Note: L. Wood has run into multiple issues with Geomview on Cygwin. He recommends Virtualbox/Ubuntu -and a one-click install of geomview via the Ubuntu package. See his Savi/Geomview link above. -
    2. Install 32-bit Cygwin as follows. -For additional guidance, see Cygwin's Installing and Updating Cygwin Packages -and Setup cygwin. -
        -
      • Launch the cygwin installer. -
      • Select a mirror from Cygwin mirrors (e.g., http://mirrors.kernel.org/sourceware/cygwin/ in California). -
      • Select the packages to install. Besides the cygwin packages listed in the Savi/Windows instructions consider adding -
          -
        • Default -- libXm-devel (required for /usr/include/Xm/Xm.h) -
        • Devel -- bashdb, gcc-core (in place of gcc), gdb -
        • Lib -- libGL-devel, libGLU1 (required, obsolete), libGLU-devel (required, obsolete), libjpeg-devel(XForms), libXext-devel (required), libXpm-devel (Xforms) -libGL and lib -
        • Math -- bc -
        • Net -- autossh, inetutils, openssh -
        • System -- chere -
        • Utils -- dos2unix (required for qhull), keychain -
        • If installing perl, ActiveState Perl may be a better choice than cygwin's perl. Perl is not used by Geomview or Qhull. -
        • Cygwin Package Search -- Search for cygwin programs and packages -
        -
      • Click 'Next' to download and install the packages. -
      • If the download is incomplete, try again. -
      • If you try again after a successful install, cygwin will uninstall and reinstall all modules.. -
      • Click on the 'Cywin Terminal' icon on the Desktop. It sets up a user directory in /home from /etc/skel/... -
      • Mount your disk drives
        mount c: /c # Ignore the warning /c does not exist -
      -
    3. Consider installing the Road Bash scripts (/etc/road-*) from Road. -They define aliases and functions for Unix command shells (Unix, Linux, Mac OS X, Windows), -
        -
      • Download Road Bash and unzip the downloaded file -
      • Copy .../bash/etc/road-* to the Cywin /etc directory (by default, C:\cygwin\etc). -
      • Using the cygwin terminal, convert the road scripts to Unix format
        d2u /etc/road-* -
      • Try it
        source /etc/road-home.bashrc -
      • Install it
        cp /etc/road-home.bashrc ~/.bashrc -
      -
    4. Launch the X terminal server from 'Start > All programs > Cygwin-X > Xwin Server'. Alternatively, run 'startx' -
    5. Launch an XTerm shell -
        -
      • Right click the Cywin icon on the system tray in the Windows taskbar. -
      • Select 'System Tools > XTerm' -
      -
    6. Download and extract Geomview -- Downloading Geomview -
    7. Compile Geomview -
        -
      • ./configure -
      • make -
      -
    8. If './configure' fails, check 'config.log' at the failing step. Look carefully for missing libraries, etc. The Geomview FAQ contains suggestions (e.g., "configure claims it can't find OpenGl"). -
    9. If 'make' fails, read the output carefully for error messages. Usually it is a missing include file or package. Locate and install the missing cygwin packages -(Cygwin Package Search). -
    - -
    -
    -

    »What to do if something -goes wrong

    -
    - -

    Please report bugs to qhull_bug@qhull.org -. Please report if Qhull crashes. Please report if Qhull -generates an "internal error". Please report if Qhull -produces a poor approximate hull in 2-d, 3-d or 4-d. Please -report documentation errors. Please report missing or incorrect -links.

    - -

    If you do not understand something, try a small example. The rbox program is an easy way to generate -test cases. The Geomview program helps to -visualize the output from Qhull.

    - -

    If Qhull does not compile, it is due to an incompatibility -between your system and ours. The first thing to check is that -your compiler is ANSI standard. Qhull produces a compiler error -if __STDC__ is not defined. You may need to set a flag (e.g., -'-A' or '-ansi').

    - -

    If Qhull compiles but crashes on the test case (rbox D4), -there's still incompatibility between your system and ours. -Sometimes it is due to memory management. This can be turned off -with qh_NOmem in mem.h. Please let us know if you figure out how -to fix these problems.

    - -

    If you doubt the output from Qhull, add option 'Tv'. It checks that every point is -inside the outer planes of the convex hull. It checks that every -facet is convex with its neighbors. It checks the topology of the -convex hull.

    - -

    Qhull should work on all inputs. It may report precision -errors if you turn off merged facets with option 'Q0'. This can get as bad as facets with -flipped orientation or two facets with the same vertices. You'll -get a long help message if you run into such a case. They are -easy to generate with rbox.

    - -

    If you do find a problem, try to simplify it before reporting -the error. Try different size inputs to locate the smallest one -that causes an error. You're welcome to hunt through the code -using the execution trace ('T4') as -a guide. This is especially true if you're incorporating Qhull -into your own program.

    - -

    When you report an error, please attach a data set to the end -of your message. Include the options that you used with Qhull, -the results of option 'FO', and any -messages generated by Qhull. This allows me to see the error for -myself. Qhull is maintained part-time.

    - -
    -

    »Email

    -
    - -

    Please send correspondence to Brad Barber at qhull@qhull.org -and report bugs to qhull_bug@qhull.org -. Let me know how you use Qhull. If you mention it in a -paper, please send a reference and abstract.

    - -

    If you would like to get Qhull announcements (e.g., a new -version) and news (any bugs that get fixed, etc.), let us know -and we will add you to our mailing list. For Internet news about geometric algorithms -and convex hulls, look at comp.graphics.algorithms and -sci.math.num-analysis. For Qhull news look at qhull-news.html.

    - -
    -

    »Authors

    -
    - -
    -   C. Bradford Barber                    Hannu Huhdanpaa
    -   bradb@shore.net                       hannu@qhull.org
    -
    - -
    -

    »Acknowledgments

    -
    - -

    A special thanks to David Dobkin for his guidance. A special -thanks to Albert Marden, Victor Milenkovic, the Geometry Center, -and Harvard University for supporting this work.

    - -

    A special thanks to Mark Phillips, Robert Miner, and Stuart Levy for running the Geometry - Center web site long after the Geometry Center closed. - Stuart moved the web site to the University of Illinois at Champaign-Urbana. -Mark and Robert are founders of Geometry Technologies. -Mark, Stuart, and Tamara Munzner are the original authors of Geomview. - -

    A special thanks to Endocardial -Solutions, Inc. of St. Paul, Minnesota for their support of the -internal documentation (src/libqhull/index.htm). They use Qhull to build 3-d models of -heart chambers.

    - -

    Qhull 1.0 and 2.0 were developed under National Science Foundation -grants NSF/DMS-8920161 and NSF-CCR-91-15793 750-7504. If you find -it useful, please let us know.

    - -

    The Geometry Center was supported by grant DMS-8920161 from the -National Science Foundation, by grant DOE/DE-FG02-92ER25137 from -the Department of Energy, by the University of Minnesota, and by -Minnesota Technology, Inc.

    - -
    -

    »References

    -
    - -

    Aurenhammer, F., "Voronoi diagrams --- A survey of a fundamental geometric data structure," ACM -Computing Surveys, 1991, 23:345-405.

    - -

    Barber, C. B., D.P. Dobkin, and H.T. -Huhdanpaa, "The Quickhull Algorithm for Convex Hulls," ACM -Transactions on Mathematical Software, 22(4):469-483, Dec 1996, www.qhull.org -[http://portal.acm.org; -http://citeseerx.ist.psu.edu]. -

    - -

    Clarkson, K.L. and P.W. Shor, -"Applications of random sampling in computational geometry, -II", Discrete Computational Geometry, 4:387-421, 1989

    - -

    Clarkson, K.L., K. Mehlhorn, and R. -Seidel, "Four results on randomized incremental -construction," Computational Geometry: Theory and -Applications, vol. 3, p. 185-211, 1993.

    - -

    Devillers, et. al., -"Walking in a triangulation," ACM Symposium on -Computational Geometry, June 3-5,2001, Medford MA. - -

    Dobkin, D.P. and D.G. Kirkpatrick, -"Determining the separation of preprocessed polyhedra--a -unified approach," in Proc. 17th Inter. Colloq. Automata -Lang. Program., in Lecture Notes in Computer Science, -Springer-Verlag, 443:400-413, 1990.

    - -

    Edelsbrunner, H, Geometry and Topology for Mesh Generation, -Cambridge University Press, 2001. - -

    Gartner, B., "Fast and robust smallest enclosing balls", Algorithms - ESA '99, LNCS 1643. - -

    Golub, G.H. and van Loan, C.F., Matric Computations, Baltimore, Maryland, USA: John Hopkins Press, 1983 - -

    Fortune, S., "Computational -geometry," in R. Martin, editor, Directions in Geometric -Computation, Information Geometers, 47 Stockers Avenue, -Winchester, SO22 5LB, UK, ISBN 1-874728-02-X, 1993.

    - -

    Milenkovic, V., "Robust polygon -modeling," Computer-Aided Design, vol. 25, p. 546-566, -September 1993.

    - -

    Mucke, E.P., I. Saias, B. Zhu, Fast -randomized point location without preprocessing in Two- and -Three-dimensional Delaunay Triangulations, ACM Symposium on -Computational Geometry, p. 274-283, 1996 [GeomDir]. -

    - -

    Mulmuley, K., Computational Geometry, -An Introduction Through Randomized Algorithms, Prentice-Hall, -NJ, 1994.

    - -

    O'Rourke, J., Computational Geometry -in C, Cambridge University Press, 1994.

    - -

    Preparata, F. and M. Shamos, Computational -Geometry, Springer-Verlag, New York, 1985.

    - -
    - -
    - -

    Up: Home page for Qhull
    -Up:News about Qhull
    -Up: FAQ about Qhull
    -To: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Dn: Imprecision in Qhull
    -Dn: Description of Qhull examples
    -Dn: Qhull internals
    -Dn: Qhull functions, macros, and data -structures - -


    - -

    The Geometry Center -Home Page

    - -

    Comments to: qhull@qhull.org -
    -Created: Sept. 25, 1995 --- Last modified: see top

    - - diff --git a/src/qhull/html/normal_voronoi_knauss_oesterle.jpg b/src/qhull/html/normal_voronoi_knauss_oesterle.jpg deleted file mode 100644 index f46d421274edd97de13d25e306985c43e872165b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23924 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 RpbH2+s%0FGD58Kr|Jfm)sf+*s diff --git a/src/qhull/html/qconvex.htm b/src/qhull/html/qconvex.htm deleted file mode 100644 index 38a363b0827..00000000000 --- a/src/qhull/html/qconvex.htm +++ /dev/null @@ -1,630 +0,0 @@ - - - - -qconvex -- convex hull - - - - -Up: -Home page for Qhull
    -Up: Qhull manual -- Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: synopsis -• input • outputs -• controls • graphics -• notes • conventions -• options -
    - -

    [cone]qconvex -- convex hull

    - -

    The convex hull of a set of points is the smallest convex set -containing the points. See the detailed introduction by O'Rourke -['94]. See Description of Qhull and How Qhull adds a point.

    - -
    -
    -
    Example: rbox 10 D3 | qconvex s o TO result
    -
    Compute the 3-d convex hull of 10 random points. Write a - summary to the console and the points and facets to - 'result'.
    - -
     
    -
    Example: rbox c | qconvex n
    -
    Print the normals for each facet of a cube.
    -
     
    -
    Example: rbox c | qconvex i Qt
    -
    Print the triangulated facets of a cube.
    -
     
    -
    Example: rbox y 500 W0 | qconvex
    -
    Compute the convex hull of a simplex with 500 - points on its surface.
    -
     
    -
    Example: rbox x W1e-12 1000 | qconvex - QR0
    -
    Compute the convex hull of 1000 points near the - surface of a randomly rotated simplex. Report - the maximum thickness of a facet.
    -
     
    -
    Example: rbox 1000 s | qconvex s FA
    -
    Compute the convex hull of 1000 cospherical - points. Verify the results and print a summary - with the total area and volume.
    -
     
    -
    Example: rbox d D12 | qconvex QR0 FA
    -
    Compute the convex hull of a 12-d diamond. - Randomly rotate the input. Note the large number - of facets and the small volume.
    -
     
    -
    Example: rbox c D7 | qconvex FA TF1000
    -
    Compute the convex hull of the 7-d hypercube. - Report on progress every 1000 facets. Computing - the convex hull of the 9-d hypercube takes too - much time and space.
    -
     
    -
    Example: rbox c d D2 | qconvex Qc s f Fx | more
    -
    Dump all fields of all facets for a square and a - diamond. Also print a summary and a list of - vertices. Note the coplanar points.
    -
     
    -
    -
    - -

    Except for rbox, all of the qhull programs compute a convex hull. - -

    By default, Qhull merges coplanar facets. For example, the convex -hull of a cube's vertices has six facets. - -

    If you use 'Qt' (triangulated output), -all facets will be simplicial (e.g., triangles in 2-d). For the cube -example, it will have 12 facets. Some facets may be -degenerate and have zero area. - -

    If you use 'QJ' (joggled input), -all facets will be simplicial. The corresponding vertices will be -slightly perturbed and identical points will be joggled apart. -Joggled input is less accurate that triangulated -output.See Merged facets or joggled input.

    - -

    The output for 4-d convex hulls may be confusing if the convex -hull contains non-simplicial facets (e.g., a hypercube). See -Why -are there extra points in a 4-d or higher convex hull?
    -

    -

    - -

    The 'qconvex' program is equivalent to -'qhull' in 2-d to 4-d, and -'qhull Qx' -in 5-d and higher. It disables the following Qhull -options: d v H Qbb Qf Qg Qm -Qr Qu Qv Qx Qz TR E V Fp Gt Q0,etc. - -

    Copyright © 1995-2015 C.B. Barber

    - -
    - -

    »qconvex synopsis

    -
    -qconvex- compute the convex hull.
    -    input (stdin): dimension, number of points, point coordinates
    -    comments start with a non-numeric character
    -
    -options (qconvex.htm):
    -    Qt   - triangulated output
    -    QJ   - joggle input instead of merging facets
    -    Tv   - verify result: structure, convexity, and point inclusion
    -    .    - concise list of all options
    -    -    - one-line description of all options
    -
    -output options (subset):
    -    s    - summary of results (default)
    -    i    - vertices incident to each facet
    -    n    - normals with offsets
    -    p    - vertex coordinates (includes coplanar points if 'Qc')
    -    Fx   - extreme points (convex hull vertices)
    -    FA   - compute total area and volume
    -    o    - OFF format (dim, n, points, facets)
    -    G    - Geomview output (2-d, 3-d, and 4-d)
    -    m    - Mathematica output (2-d and 3-d)
    -    QVn  - print facets that include point n, -n if not
    -    TO file- output results to file, may be enclosed in single quotes
    -
    -examples:
    -    rbox c D2 | qconvex s n                    rbox c D2 | qconvex i
    -    rbox c D2 | qconvex o                      rbox 1000 s | qconvex s Tv FA
    -    rbox c d D2 | qconvex s Qc Fx              rbox y 1000 W0 | qconvex s n
    -    rbox y 1000 W0 | qconvex s QJ              rbox d G1 D12 | qconvex QR0 FA Pp
    -    rbox c D7 | qconvex FA TF1000
    -
    - -

    »qconvex -input

    -
    - -

    The input data on stdin consists of:

    -
      -
    • dimension -
    • number of points
    • -
    • point coordinates
    • -
    - -

    Use I/O redirection (e.g., qconvex < data.txt), a pipe (e.g., rbox 10 | qconvex), -or the 'TI' option (e.g., qconvex TI data.txt). - -

    Comments start with a non-numeric character. Error reporting is -simpler if there is one point per line. Dimension -and number of points may be reversed. - -

    Here is the input for computing the convex -hull of the unit cube. The output is the normals, one -per facet.

    - -
    -

    rbox c > data

    -
    -3 RBOX c
    -8
    -  -0.5   -0.5   -0.5
    -  -0.5   -0.5    0.5
    -  -0.5    0.5   -0.5
    -  -0.5    0.5    0.5
    -   0.5   -0.5   -0.5
    -   0.5   -0.5    0.5
    -   0.5    0.5   -0.5
    -   0.5    0.5    0.5
    -
    -

    qconvex s n < data

    -
    -
    -Convex hull of 8 points in 3-d:
    -
    -  Number of vertices: 8
    -  Number of facets: 6
    -  Number of non-simplicial facets: 6
    -
    -Statistics for: RBOX c | QCONVEX s n
    -
    -  Number of points processed: 8
    -  Number of hyperplanes created: 11
    -  Number of distance tests for qhull: 35
    -  Number of merged facets: 6
    -  Number of distance tests for merging: 84
    -  CPU seconds to compute hull (after input): 0.081
    -
    -4
    -6
    -     0      0     -1   -0.5
    -     0     -1      0   -0.5
    -     1      0      0   -0.5
    -    -1      0      0   -0.5
    -     0      1      0   -0.5
    -     0      0      1   -0.5
    -
    -
    - -
    -

    »qconvex outputs

    -
    - -

    These options control the output of qconvex. They may be used -individually or together.

    -
    -
    -
     
    -
    Vertices
    -
    Fx
    -
    list extreme points (i.e., vertices). The first line is the number of - extreme points. Each point is listed, one per line. The cube example - has eight vertices.
    -
    Fv
    -
    list vertices for each facet. The first line is the number of facets. - Each remaining line starts with the number of vertices. For the cube example, - each facet has four vertices.
    -
    i
    -
    list vertices for each facet. The first line is the number of facets. The - remaining lines list the vertices for each facet. In 4-d and - higher, triangulate non-simplicial facets by adding an extra point.
    -
     
    -
     
    -
    Coordinates
    -
    o
    -
    print vertices and facets of the convex hull in OFF format. The - first line is the dimension. The second line is the number of - vertices, facets, and ridges. The vertex - coordinates are next, followed by the facets. Each facet starts with - the number of vertices. The cube example has four vertices per facet.
    -
    Ft
    -
    print a triangulation of the convex hull in OFF format. The first line - is the dimension. The second line is the number of vertices and added points, - followed by the number of facets and the number of ridges. - The vertex coordinates are next, followed by the centrum coordinates. There is - one centrum for each non-simplicial facet. - The cube example has six centrums, one per square. - Each facet starts with the number of vertices or centrums. - In the cube example, each facet uses two vertices and one centrum.
    -
    p
    -
    print vertex coordinates. The first line is the dimension and the second - line is the number of vertices. The following lines are the coordinates of each - vertex. The cube example has eight vertices.
    -
    Qc p
    -
    print coordinates of vertices and coplanar points. The first line is the dimension. - The second line is the number of vertices and coplanar points. The coordinates - are next, one line per point. Use 'Qc Qi p' - to print the coordinates of all points.
    -
     
    -
     
    -
    Facets
    -
    Fn
    -
    list neighboring facets for each facet. The first line is the - number of facets. Each remaining line starts with the number of - neighboring facets. The cube example has four neighbors per facet.
    -
    FN
    -
    list neighboring facets for each point. The first line is the - total number of points. Each remaining line starts with the number of - neighboring facets. Each vertex of the cube example has three neighboring - facets. Use 'Qc Qi FN' - to include coplanar and interior points.
    -
    Fa
    -
    print area for each facet. The first line is the number of facets. - Facet area follows, one line per facet. For the cube example, each facet has area one.
    -
    FI
    -
    list facet IDs. The first line is the number of - facets. The IDs follow, one per line.
    - -
     
    -
     
    -
    Coplanar and interior points
    -
    Fc
    -
    list coplanar points for each facet. The first line is the number - of facets. The remaining lines start with the number of coplanar points. - A coplanar point is assigned to one facet.
    -
    Qi Fc
    -
    list interior points for each facet. The first line is the number - of facets. The remaining lines start with the number of interior points. - A coplanar point is assigned to one facet.
    -
    FP
    -
    print distance to nearest vertex for coplanar points. The first line is the - number of coplanar points. Each remaining line starts with the point ID of - a vertex, followed by the point ID of a coplanar point, its facet, and distance. - Use 'Qc Qi - FP' for coplanar and interior points.
    - -
     
    -
     
    -
    Hyperplanes
    -
    n
    -
    print hyperplane for each facet. The first line is the dimension. The - second line is the number of facets. Each remaining line is the hyperplane's - coefficients followed by its offset.
    -
    Fo
    -
    print outer plane for each facet. The output plane is above all points. - The first line is the dimension. The - second line is the number of facets. Each remaining line is the outer plane's - coefficients followed by its offset.
    -
    Fi
    -
    print inner plane for each facet. The inner plane of a facet is - below its vertices. - The first line is the dimension. The - second line is the number of facets. Each remaining line is the inner plane's - coefficients followed by its offset.
    - -
     
    -
     
    -
    General
    -
    s
    -
    print summary for the convex hull. Use 'Fs' and 'FS' if you need numeric data.
    -
    FA
    -
    compute total area and volume for 's' and 'FS'
    -
    m
    -
    Mathematica output for the convex hull in 2-d or 3-d.
    -
    FM
    -
    Maple output for the convex hull in 2-d or 3-d.
    -
    G
    -
    Geomview output for the convex hull in 2-d, 3-d, or 4-d.
    - -
     
    -
     
    -
    Scaling and rotation
    -
    Qbk:n
    -
    scale k'th coordinate to lower bound.
    -
    QBk:n
    -
    scale k'th coordinate to upper bound.
    -
    QbB
    -
    scale input to unit cube centered at the origin.
    -
    QRn
    -
    randomly rotate the input with a random seed of n. If n=0, the - seed is the time. If n=-1, use time for the random seed, but do - not rotate the input.
    -
    Qbk:0Bk:0
    -
    remove k'th coordinate from input. This computes the - convex hull in one lower dimension.
    -
    -
    - -
    -

    »qconvex controls

    -
    - -

    These options provide additional control:

    - -
    -
    -
    Qt
    -
    triangulated output. Qhull triangulates non-simplicial facets. It may produce - degenerate facets of zero area.
    -
    QJ
    -
    joggle the input instead of merging facets. This guarantees simplicial facets - (e.g., triangles in 3-d). It is less accurate than triangulated output ('Qt').
    -
    Qc
    -
    keep coplanar points
    -
    Qi
    -
    keep interior points
    -
    f
    -
    facet dump. Print the data structure for each facet.
    -
    QVn
    -
    select facets containing point n as a vertex,
    -
    QGn
    -
    select facets that are visible from point n - (marked 'good'). Use -n for the remainder.
    -
    PDk:0
    -
    select facets with a negative coordinate for dimension k
    -
    TFn
    -
    report progress after constructing n facets
    -
    Tv
    -
    verify result
    -
    TI file
    -
    input data from file. The filename may not use spaces or quotes.
    -
    TO file
    -
    output results to file. Use single quotes if the filename - contains spaces (e.g., TO 'file with spaces.txt'
    -
    Qs
    -
    search all points for the initial simplex. If Qhull can - not construct an initial simplex, it reports a -descriptive message. Usually, the point set is degenerate and one -or more dimensions should be removed ('Qbk:0Bk:0'). -If not, use option 'Qs'. It performs an exhaustive search for the -best initial simplex. This is expensive is high dimensions.
    -
    -
    - -
    -

    »qconvex graphics

    -
    - -

    Display 2-d, 3-d, and 4-d convex hulls with Geomview ('G').

    - -

    Display 2-d and 3-d convex hulls with Mathematica ('m').

    - -

    To view 4-d convex hulls in 3-d, use 'Pd0d1d2d3' to select the positive -octant and 'GrD2' to drop dimension -2.

    - -
    -

    »qconvex notes

    -
    - -

    Qhull always computes a convex hull. The -convex hull may be used for other geometric structures. The -general technique is to transform the structure into an -equivalent convex hull problem. For example, the Delaunay -triangulation is equivalent to the convex hull of the input sites -after lifting the points to a paraboloid.

    - -
    -

    »qconvex -conventions

    -
    - -

    The following terminology is used for convex hulls in Qhull. -See Qhull's data structures.

    - -
      -
    • point - d coordinates
    • -
    • vertex - extreme point of the input set
    • -
    • ridge - d-1 vertices between two - neighboring facets
    • -
    • hyperplane - halfspace defined by a unit normal - and offset
    • -
    • coplanar point - a nearly incident point to a - hyperplane
    • -
    • centrum - a point on the hyperplane for testing - convexity
    • -
    • facet - a facet with vertices, ridges, coplanar - points, neighboring facets, and hyperplane
    • -
    • simplicial facet - a facet with d - vertices, d ridges, and d neighbors
    • -
    • non-simplicial facet - a facet with more than d - vertices
    • -
    • good facet - a facet selected by 'QVn', etc.
    • -
    -
    -

    »qconvex options

    - -
    -qconvex- compute the convex hull
    -    http://www.qhull.org
    -
    -input (stdin):
    -    first lines: dimension and number of points (or vice-versa).
    -    other lines: point coordinates, best if one point per line
    -    comments:    start with a non-numeric character
    -
    -options:
    -    Qt   - triangulated output
    -    QJ   - joggle input instead of merging facets
    -    Qc   - keep coplanar points with nearest facet
    -    Qi   - keep interior points with nearest facet
    -
    -Qhull control options:
    -    Qbk:n   - scale coord k so that low bound is n
    -      QBk:n - scale coord k so that upper bound is n (QBk is 0.5)
    -    QbB  - scale input to unit cube centered at the origin
    -    Qbk:0Bk:0 - remove k-th coordinate from input
    -    QJn  - randomly joggle input in range [-n,n]
    -    QRn  - random rotation (n=seed, n=0 time, n=-1 time/no rotate)
    -    Qs   - search all points for the initial simplex
    -    QGn  - good facet if visible from point n, -n for not visible
    -    QVn  - good facet if it includes point n, -n if not
    -
    -Trace options:
    -    T4   - trace at level n, 4=all, 5=mem/gauss, -1= events
    -    Tc   - check frequently during execution
    -    Ts   - print statistics
    -    Tv   - verify result: structure, convexity, and point inclusion
    -    Tz   - send all output to stdout
    -    TFn  - report summary when n or more facets created
    -    TI file - input data from file, no spaces or single quotes
    -    TO file - output results to file, may be enclosed in single quotes
    -    TPn  - turn on tracing when point n added to hull
    -     TMn - turn on tracing at merge n
    -     TWn - trace merge facets when width > n
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)
    -     TCn - stop qhull after building cone for point n (see TVn)
    -
    -Precision options:
    -    Cn   - radius of centrum (roundoff added).  Merge facets if non-convex
    -     An  - cosine of maximum angle.  Merge facets if cosine > n or non-convex
    -           C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge
    -    Rn   - randomly perturb computations by a factor of [1-n,1+n]
    -    Un   - max distance below plane for a new, coplanar point
    -    Wn   - min facet width for outside point (before roundoff)
    -
    -Output formats (may be combined; if none, produces a summary to stdout):
    -    f    - facet dump
    -    G    - Geomview output (see below)
    -    i    - vertices incident to each facet
    -    m    - Mathematica output (2-d and 3-d)
    -    n    - normals with offsets
    -    o    - OFF file format (dim, points and facets; Voronoi regions)
    -    p    - point coordinates
    -    s    - summary (stderr)
    -
    -More formats:
    -    Fa   - area for each facet
    -    FA   - compute total area and volume for option 's'
    -    Fc   - count plus coplanar points for each facet
    -           use 'Qc' (default) for coplanar and 'Qi' for interior
    -    FC   - centrum for each facet
    -    Fd   - use cdd format for input (homogeneous with offset first)
    -    FD   - use cdd format for numeric output (offset first)
    -    FF   - facet dump without ridges
    -    Fi   - inner plane for each facet
    -    FI   - ID for each facet
    -    Fm   - merge count for each facet (511 max)
    -    FM   - Maple output (2-d and 3-d)
    -    Fn   - count plus neighboring facets for each facet
    -    FN   - count plus neighboring facets for each point
    -    Fo   - outer plane (or max_outside) for each facet
    -    FO   - options and precision constants
    -    FP   - nearest vertex for each coplanar point
    -    FQ   - command used for qconvex
    -    Fs   - summary: #int (8), dimension, #points, tot vertices, tot facets,
    -                      for output: #vertices, #facets,
    -                                  #coplanar points, #non-simplicial facets
    -                    #real (2), max outer plane, min vertex
    -    FS   - sizes:   #int (0)
    -                    #real(2) tot area, tot volume
    -    Ft   - triangulation with centrums for non-simplicial facets (OFF format)
    -    Fv   - count plus vertices for each facet
    -    FV   - average of vertices (a feasible point for 'H')
    -    Fx   - extreme points (in order for 2-d)
    -
    -Geomview output (2-d, 3-d, and 4-d)
    -    Ga   - all points as dots
    -     Gp  -  coplanar points and vertices as radii
    -     Gv  -  vertices as spheres
    -    Gi   - inner planes only
    -     Gn  -  no planes
    -     Go  -  outer planes only
    -    Gc   - centrums
    -    Gh   - hyperplane intersections
    -    Gr   - ridges
    -    GDn  - drop dimension n in 3-d and 4-d output
    -
    -Print options:
    -    PAn  - keep n largest facets by area
    -    Pdk:n - drop facet if normal[k] <= n (default 0.0)
    -    PDk:n - drop facet if normal[k] >= n
    -    Pg   - print good facets (needs 'QGn' or 'QVn')
    -    PFn  - keep facets whose area is at least n
    -    PG   - print neighbors of good facets
    -    PMn  - keep n facets with most merges
    -    Po   - force output.  If error, output neighborhood of facet
    -    Pp   - do not report precision problems
    -
    -    .    - list of all options
    -    -    - one line descriptions of all options
    -
    -
    - - -
    - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -•Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: synopsis -• input • outputs -• controls • graphics -• notes • conventions -• options - -


    - -

    The Geometry Center -Home Page

    - -

    Comments to: qhull@qhull.org -
    -Created: Sept. 25, 1995 --- Last modified: see top

    - - diff --git a/src/qhull/html/qdelau_f.htm b/src/qhull/html/qdelau_f.htm deleted file mode 100644 index d8981e16bc1..00000000000 --- a/src/qhull/html/qdelau_f.htm +++ /dev/null @@ -1,416 +0,0 @@ - - - - -qdelaunay Qu -- furthest-site Delaunay triangulation - - - - -Up: -Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: synopsis -• input • outputs -• controls • graphics -• notes • conventions -• options - -
    - -

    [delaunay]qdelaunay Qu -- furthest-site Delaunay triangulation

    - -

    The furthest-site Delaunay triangulation corresponds to the upper facets of the Delaunay construction. -Its vertices are the -extreme points of the input sites. -It is the dual of the furthest-site Voronoi diagram. - -

    -
    -
    Example: rbox 10 D2 | qdelaunay Qu Qt s - i TO - result
    -
    Compute the 2-d, furthest-site Delaunay triangulation of 10 random - points. Triangulate the output. - Write a summary to the console and the regions to - 'result'.
    -
     
    -
    Example: rbox 10 D2 | qdelaunay Qu QJ s - i TO - result
    -
    Compute the 2-d, furthest-site Delaunay triangulation of 10 random - points. Joggle the input to guarantee triangular output. - Write a summary to the console and the regions to - 'result'.
    -
     
    -
    Example: rbox r y c G1 D2 | qdelaunay Qu s - Fv TO - result
    -
    Compute the 2-d, furthest-site Delaunay triangulation of a triangle inside - a square. - Write a summary to the console and unoriented regions to 'result'. - Merge regions for cocircular input sites (e.g., the square). - The square is the only furthest-site - Delaunay region.
    -
    -
    - -

    As with the Delaunay triangulation, Qhull computes the -furthest-site Delaunay triangulation by lifting the input sites to a -paraboloid. The lower facets correspond to the Delaunay -triangulation while the upper facets correspond to the -furthest-site triangulation. Neither triangulation includes -"vertical" facets (i.e., facets whose last hyperplane -coefficient is nearly zero). Vertical facets correspond to input -sites that are coplanar to the convex hull of the input. An -example is points on the boundary of a lattice.

    - -

    By default, qdelaunay merges cocircular and cospherical regions. -For example, the furthest-site Delaunay triangulation of a square inside a diamond -('rbox D2 c d G4 | qdelaunay Qu') consists of one region (the diamond). - -

    If you use 'Qt' (triangulated output), -all furthest-site Delaunay regions will be simplicial (e.g., triangles in 2-d). -Some regions may be -degenerate and have zero area. - -

    If you use 'QJ' (joggled input), all furthest-site -Delaunay regions -will be simplicial (e.g., triangles in 2-d). Joggled input -is less accurate than triangulated output ('Qt'). See Merged facets or joggled input.

    - -

    The output for 3-d, furthest-site Delaunay triangulations may be confusing if the -input contains cospherical data. See the FAQ item -Why -are there extra points in a 4-d or higher convex hull? -Avoid these problems with triangulated output ('Qt') or -joggled input ('QJ'). -

    - -

    The 'qdelaunay' program is equivalent to -'qhull d Qbb' in 2-d to 3-d, and -'qhull d Qbb Qx' -in 4-d and higher. It disables the following Qhull -options: d n v H U Qb QB Qc Qf Qg Qi -Qm Qr QR Qv Qx TR E V FC Fi Fo Fp FV Q0,etc. - - -

    Copyright © 1995-2015 C.B. Barber

    - -
    - -

    »furthest-site qdelaunay synopsis

    -
    - -See qdelaunay synopsis. The same -program is used for both constructions. Use option 'Qu' -for furthest-site Delaunay triangulations. - -
    -

    »furthest-site qdelaunay -input

    - -
    -

    The input data on stdin consists of:

    -
      -
    • dimension -
    • number of points
    • -
    • point coordinates
    • -
    - -

    Use I/O redirection (e.g., qdelaunay Qu < data.txt), a pipe (e.g., rbox 10 | qdelaunay Qu), -or the 'TI' option (e.g., qdelaunay Qu TI data.txt). - -

    For example, this is a square containing four random points. -Its furthest-site Delaunay -triangulation contains one square. -

    -

    -rbox c 4 D2 > data -
    -2 RBOX c 4 D2
    -8
    --0.4999921736307369 -0.3684622117955817
    -0.2556053225468894 -0.0413498678629751
    -0.0327672376602583 -0.2810408135699488
    --0.452955383763607 0.17886471718444
    -  -0.5   -0.5
    -  -0.5    0.5
    -   0.5   -0.5
    -   0.5    0.5
    -
    - -

    qdelaunay Qu i < data -

    -
    -Furthest-site Delaunay triangulation by the convex hull of 8 points in 3-d:
    -
    -  Number of input sites: 8
    -  Number of Delaunay regions: 1
    -  Number of non-simplicial Delaunay regions: 1
    -
    -Statistics for: RBOX c 4 D2 | QDELAUNAY s Qu i
    -
    -  Number of points processed: 8
    -  Number of hyperplanes created: 20
    -  Number of facets in hull: 11
    -  Number of distance tests for qhull: 34
    -  Number of merged facets: 1
    -  Number of distance tests for merging: 107
    -  CPU seconds to compute hull (after input): 0.02
    -
    -1
    -7 6 4 5
    -
    -
    - -
    -

    »furthest-site qdelaunay -outputs

    -
    - -

    These options control the output of furthest-site Delaunay triangulations:

    -
    - -
    -
    furthest-site Delaunay regions
    -
    i
    -
    list input sites for each furthest-site Delaunay region. The first line is the number of regions. The - remaining lines list the input sites for each region. The regions are - oriented. In 3-d and - higher, report cospherical sites by adding extra points. For the points-in-square example, - the square is the only furthest-site Delaunay region.
    -
    Fv
    -
    list input sites for each furthest-site Delaunay region. The first line is the number of regions. - Each remaining line starts with the number of input sites. The regions - are unoriented. For the points-in-square example, - the square is the only furthest-site Delaunay region.
    -
    Ft
    -
    print a triangulation of the furthest-site Delaunay regions in OFF format. The first line - is the dimension. The second line is the number of input sites and added points, - followed by the number of simplices and the number of ridges. - The input coordinates are next, followed by the centrum coordinates. There is - one centrum for each non-simplicial furthest-site Delaunay region. Each remaining line starts - with dimension+1. The - simplices are oriented. - For the points-in-square example, the square has a centrum at the - origin. It splits the square into four triangular regions.
    -
    Fn
    -
    list neighboring regions for each furthest-site Delaunay region. The first line is the - number of regions. Each remaining line starts with the number of - neighboring regions. Negative indices (e.g., -1) indicate regions - outside of the furthest-site Delaunay triangulation. - For the points-in-square example, the four neighboring regions - are outside of the triangulation. They belong to the regular - Delaunay triangulation.
    -
    FN
    -
    list the furthest-site Delaunay regions for each input site. The first line is the - total number of input sites. Each remaining line starts with the number of - furthest-site Delaunay regions. Negative indices (e.g., -1) indicate regions - outside of the furthest-site Delaunay triangulation. - For the points-in-square example, the four random points belong to no region - while the square's vertices belong to region 0 and three - regions outside of the furthest-site Delaunay triangulation.
    -
    Fa
    -
    print area for each furthest-site Delaunay region. The first line is the number of regions. - The areas follow, one line per region. For the points-in-square example, the - square has unit area.
    - -
     
    -
     
    -
    Input sites
    -
    Fx
    -
    list extreme points of the input sites. These points are vertices of the furthest-point - Delaunay triangulation. They are on the - boundary of the convex hull. The first line is the number of - extreme points. Each point is listed, one per line. The points-in-square example - has four extreme points.
    -
     
    -
     
    -
    General
    -
    FA
    -
    compute total area for 's' - and 'FS'. This is the - same as the area of the convex hull.
    -
    o
    -
    print upper facets of the corresponding convex hull (a - paraboloid)
    -
    m
    -
    Mathematica output for the upper facets of the paraboloid (2-d triangulations).
    -
    FM
    -
    Maple output for the upper facets of the paraboloid (2-d triangulations).
    -
    G
    -
    Geomview output for the paraboloid (2-d or 3-d triangulations).
    -
    s
    -
    print summary for the furthest-site Delaunay triangulation. Use 'Fs' and 'FS' for numeric data.
    -
    -
    - -
    -

    »furthest-site qdelaunay -controls

    -
    - -

    These options provide additional control:

    -
    - -
    -
    Qu
    -
    must be used for furthest-site Delaunay triangulation.
    -
    Qt
    -
    triangulated output. Qhull triangulates non-simplicial facets. It may produce - degenerate facets of zero area.
    -
    QJ
    -
    joggle the input to avoid cospherical and coincident - sites. It is less accurate than triangulated output ('Qt').
    -
    QVn
    -
    select facets adjacent to input site n (marked - 'good').
    -
    Tv
    -
    verify result.
    -
    TI file
    -
    input data from file. The filename may not use spaces or quotes.
    -
    TO file
    -
    output results to file. Use single quotes if the filename - contains spaces (e.g., TO 'file with spaces.txt'
    -
    TFn
    -
    report progress after constructing n facets
    -
    PDk:1
    -
    include upper and lower facets in the output. Set k - to the last dimension (e.g., 'PD2:1' for 2-d inputs).
    -
    f
    -
    facet dump. Print the data structure for each facet (i.e., furthest-site Delaunay region).
    -
    -
    - -
    -

    »furthest-site qdelaunay -graphics

    -
    - -See Delaunay graphics. -They are the same except for Mathematica and Maple output. - -
    -

    »furthest-site -qdelaunay notes

    -
    - -

    The furthest-site Delaunay triangulation does not -record coincident input sites. Use qdelaunay instead. - -

    qdelaunay Qu does not work for purely cocircular -or cospherical points (e.g., rbox c | qdelaunay Qu). Instead, -use qdelaunay Qz -- when all points are vertices of the convex -hull of the input sites, the Delaunay triangulation is the same -as the furthest-site Delaunay triangulation. - -

    A non-simplicial, furthest-site Delaunay region indicates nearly cocircular or -cospherical input sites. To avoid non-simplicial regions triangulate -the output ('Qt') or joggle -the input ('QJ'). Joggled input -is less accurate than triangulated output. -You may also triangulate -non-simplicial regions with option 'Ft'. It adds -the centrum to non-simplicial regions. Alternatively, use an exact arithmetic code.

    - -

    Furthest-site Delaunay triangulations do not include facets that are -coplanar with the convex hull of the input sites. A facet is -coplanar if the last coefficient of its normal is -nearly zero (see qh_ZEROdelaunay). - -

    -

    »furthest-site qdelaunay conventions

    -
    - -

    The following terminology is used for furthest-site Delaunay -triangulations in Qhull. The underlying structure is the upper -facets of a convex hull in one higher dimension. See convex hull conventions, Delaunay conventions, -and Qhull's data structures

    -
    -
      -
    • input site - a point in the input (one dimension - lower than a point on the convex hull)
    • -
    • point - d+1 coordinates. The last - coordinate is the sum of the squares of the input site's - coordinates
    • -
    • vertex - a point on the paraboloid. It - corresponds to a unique input site.
    • -
    • furthest-site Delaunay facet - an upper facet of the - paraboloid. The last coefficient of its normal is - clearly positive.
    • -
    • furthest-site Delaunay region - a furthest-site Delaunay - facet projected to the input sites
    • -
    • non-simplicial facet - more than d - points are cocircular or cospherical
    • -
    • good facet - a furthest-site Delaunay facet with optional - restrictions by 'QVn', etc.
    • -
    -
    -
    -

    »furthest-site qdelaunay options

    -
    - -See qdelaunay options. The same -program is used for both constructions. Use option 'Qu' -for furthest-site Delaunay triangulations. - -
    - -
    - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: synopsis -• input • outputs -• controls • graphics -• notes • conventions -• options - -


    - -

    The Geometry Center -Home Page

    - -

    Comments to: qhull@qhull.org -
    -Created: Sept. 25, 1995 --- Last modified: see top

    - - diff --git a/src/qhull/html/qdelaun.htm b/src/qhull/html/qdelaun.htm deleted file mode 100644 index a42223c6633..00000000000 --- a/src/qhull/html/qdelaun.htm +++ /dev/null @@ -1,628 +0,0 @@ - - - - -qdelaunay -- Delaunay triangulation - - - - -Up: -Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: synopsis -• input • outputs -• controls • graphics -• notes • conventions -• options - -
    - -

    [delaunay]qdelaunay -- Delaunay triangulation

    - -

    The Delaunay triangulation is the triangulation with empty -circumspheres. It has many useful properties and applications. -See the survey article by Aurenhammer ['91] and the detailed introduction -by O'Rourke ['94].

    - -
    -
    -
    Example: rbox r y c G0.1 D2 | qdelaunay s - Fv TO - result
    -
    Compute the 2-d Delaunay triangulation of a triangle and - a small square. - Write a summary to the console and unoriented regions to 'result'. - Merge regions for cocircular input sites (i.e., the - square).
    -
     
    -
    Example: rbox r y c G0.1 D2 | qdelaunay s - Fv Qt
    -
    Compute the 2-d Delaunay triangulation of a triangle and - a small square. Write a summary and unoriented - regions to the console. Produce triangulated output.
    -
     
    -
    Example: rbox 10 D2 | qdelaunay QJ s - i TO - result
    -
    Compute the 2-d Delaunay triangulation of 10 random - points. Joggle the input to guarantee triangular output. - Write a summary to the console and the regions to - 'result'.
    -
    -
    - -

    Qhull computes the Delaunay triangulation by computing a -convex hull. It lifts the input sites to a paraboloid by adding -the sum of the squares of the coordinates. It scales the height -of the paraboloid to improve numeric precision ('Qbb'). -It computes the convex -hull of the lifted sites, and projects the lower convex hull to -the input. - -

    Each region of the Delaunay triangulation -corresponds to a facet of the lower half of the convex hull. -Facets of the upper half of the convex hull correspond to the furthest-site Delaunay triangulation. -See the examples, Delaunay and -Voronoi diagrams.

    - -

    See Qhull FAQ - Delaunay and -Voronoi diagram questions.

    - -

    By default, qdelaunay merges cocircular and cospherical regions. -For example, the Delaunay triangulation of a square inside a diamond -('rbox D2 c d G4 | qdelaunay') contains one region for the square. - -

    Use option 'Qz' if the input is circular, cospherical, or -nearly so. It improves precision by adding a point "at infinity," above the corresponding paraboloid. - -

    If you use 'Qt' (triangulated output), -all Delaunay regions will be simplicial (e.g., triangles in 2-d). -Some regions may be -degenerate and have zero area. Triangulated output identifies coincident -points. - -

    If you use 'QJ' (joggled input), all Delaunay regions -will be simplicial (e.g., triangles in 2-d). Coincident points will -create small regions since the points are joggled apart. Joggled input -is less accurate than triangulated output ('Qt'). See Merged facets or joggled input.

    - -

    The output for 3-d Delaunay triangulations may be confusing if the -input contains cospherical data. See the FAQ item -Why -are there extra points in a 4-d or higher convex hull? -Avoid these problems with triangulated output ('Qt') or -joggled input ('QJ'). -

    - -

    The 'qdelaunay' program is equivalent to -'qhull d Qbb' in 2-d to 3-d, and -'qhull d Qbb Qx' -in 4-d and higher. It disables the following Qhull -options: d n v H U Qb QB Qc Qf Qg Qi -Qm Qr QR Qv Qx TR E V FC Fi Fo Fp Ft FV Q0,etc. - - -

    Copyright © 1995-2015 C.B. Barber

    - -
    - -

    »qdelaunay synopsis

    - -
    -qdelaunay- compute the Delaunay triangulation.
    -    input (stdin): dimension, number of points, point coordinates
    -    comments start with a non-numeric character
    -
    -options (qdelaun.htm):
    -    Qt   - triangulated output
    -    QJ   - joggle input instead of merging facets
    -    Qu   - furthest-site Delaunay triangulation
    -    Tv   - verify result: structure, convexity, and in-circle test
    -    .    - concise list of all options
    -    -    - one-line description of all options
    -
    -output options (subset):
    -    s    - summary of results (default)
    -    i    - vertices incident to each Delaunay region
    -    Fx   - extreme points (vertices of the convex hull)
    -    o    - OFF format (shows the points lifted to a paraboloid)
    -    G    - Geomview output (2-d and 3-d points lifted to a paraboloid)
    -    m    - Mathematica output (2-d inputs lifted to a paraboloid)
    -    QVn  - print Delaunay regions that include point n, -n if not
    -    TO file- output results to file, may be enclosed in single quotes
    -
    -examples:
    -    rbox c P0 D2 | qdelaunay s o          rbox c P0 D2 | qdelaunay i
    -    rbox c P0 D3 | qdelaunay Fv Qt        rbox c P0 D2 | qdelaunay s Qu Fv
    -    rbox c G1 d D2 | qdelaunay s i        rbox c G1 d D2 | qdelaunay s i Qt
    -    rbox M3,4 z 100 D2 | qdelaunay s      rbox M3,4 z 100 D2 | qdelaunay s Qt
    -
    - - -

    »qdelaunay -input

    - -
    -

    The input data on stdin consists of:

    -
      -
    • dimension -
    • number of points
    • -
    • point coordinates
    • -
    - -

    Use I/O redirection (e.g., qdelaunay < data.txt), a pipe (e.g., rbox 10 | qdelaunay), -or the 'TI' option (e.g., qdelaunay TI data.txt). - -

    For example, this is four cocircular points inside a square. Its Delaunay -triangulation contains 8 triangles and one four-sided -figure. -

    -

    -rbox s 4 W0 c G1 D2 > data -
    -2 RBOX s 4 W0 c D2
    -8
    --0.4941988586954018 -0.07594397977563715
    --0.06448037284989526 0.4958248496365813
    -0.4911154367094632 0.09383830681375946
    --0.348353580869097 -0.3586778257652367
    -    -1     -1
    -    -1      1
    -     1     -1
    -     1      1
    -
    - -

    qdelaunay s i < data -

    -
    -Delaunay triangulation by the convex hull of 8 points in 3-d
    -
    -  Number of input sites: 8
    -  Number of Delaunay regions: 9
    -  Number of non-simplicial Delaunay regions: 1
    -
    -Statistics for: RBOX s 4 W0 c D2 | QDELAUNAY s i
    -
    -  Number of points processed: 8
    -  Number of hyperplanes created: 18
    -  Number of facets in hull: 10
    -  Number of distance tests for qhull: 33
    -  Number of merged facets: 2
    -  Number of distance tests for merging: 102
    -  CPU seconds to compute hull (after input): 0.028
    -
    -9
    -1 7 5
    -6 3 4
    -2 3 6
    -7 2 6
    -2 7 1
    -0 5 4
    -3 0 4
    -0 1 5
    -1 0 3 2
    -
    -
    - -
    -

    »qdelaunay -outputs

    -
    - -

    These options control the output of Delaunay triangulations:

    -
    - -
    -
    Delaunay regions
    -
    i
    -
    list input sites for each Delaunay region. The first line is the number of regions. The - remaining lines list the input sites for each region. The regions are - oriented. In 3-d and - higher, report cospherical sites by adding extra points. Use triangulated - output ('Qt') to avoid non-simpicial regions. For the circle-in-square example, - eight Delaunay regions are triangular and the ninth has four input sites.
    -
    Fv
    -
    list input sites for each Delaunay region. The first line is the number of regions. - Each remaining line starts with the number of input sites. The regions - are unoriented. For the circle-in-square example, - eight Delaunay regions are triangular and the ninth has four input sites.
    -
    Fn
    -
    list neighboring regions for each Delaunay region. The first line is the - number of regions. Each remaining line starts with the number of - neighboring regions. Negative indices (e.g., -1) indicate regions - outside of the Delaunay triangulation. - For the circle-in-square example, the four regions on the square are neighbors to - the region-at-infinity.
    -
    FN
    -
    list the Delaunay regions for each input site. The first line is the - total number of input sites. Each remaining line starts with the number of - Delaunay regions. Negative indices (e.g., -1) indicate regions - outside of the Delaunay triangulation. - For the circle-in-square example, each point on the circle belongs to four - Delaunay regions. Use 'Qc FN' - to include coincident input sites and deleted vertices.
    -
    Fa
    -
    print area for each Delaunay region. The first line is the number of regions. - The areas follow, one line per region. For the circle-in-square example, the - cocircular region has area 0.4.
    -
     
    -
     
    -
    Input sites
    -
    Fc
    -
    list coincident input sites for each Delaunay region. - The first line is the number of regions. The remaining lines start with - the number of coincident sites and deleted vertices. Deleted vertices - indicate highly degenerate input (see'Fs'). - A coincident site is assigned to one Delaunay - region. Do not use 'QJ' with 'Fc'; the joggle will separate - coincident sites.
    -
    FP
    -
    print coincident input sites with distance to - nearest site (i.e., vertex). The first line is the - number of coincident sites. Each remaining line starts with the point ID of - an input site, followed by the point ID of a coincident point, its region, and distance. - Includes deleted vertices which - indicate highly degenerate input (see'Fs'). - Do not use 'QJ' with 'FP'; the joggle will separate - coincident sites.
    -
    Fx
    -
    list extreme points of the input sites. These points are on the - boundary of the convex hull. The first line is the number of - extreme points. Each point is listed, one per line. The circle-in-square example - has four extreme points.
    -
     
    -
     
    -
    General
    -
    FA
    -
    compute total area for 's' - and 'FS'
    -
    o
    -
    print lower facets of the corresponding convex hull (a - paraboloid)
    -
    m
    -
    Mathematica output for the lower facets of the paraboloid (2-d triangulations).
    -
    FM
    -
    Maple output for the lower facets of the paraboloid (2-d triangulations).
    -
    G
    -
    Geomview output for the paraboloid (2-d or 3-d triangulations).
    -
    s
    -
    print summary for the Delaunay triangulation. Use 'Fs' and 'FS' for numeric data.
    -
    -
    - -
    -

    »qdelaunay -controls

    -
    - -

    These options provide additional control:

    -
    - -
    -
    Qt
    -
    triangulated output. Qhull triangulates non-simplicial facets. It may produce -degenerate facets of zero area.
    -
    QJ
    -
    joggle the input to avoid cospherical and coincident - sites. It is less accurate than triangulated output ('Qt').
    -
    Qu
    -
    compute the furthest-site Delaunay triangulation.
    -
    Qz
    -
    add a point above the paraboloid to reduce precision - errors. Use it for nearly cocircular/cospherical input - (e.g., 'rbox c | qdelaunay Qz'). The point is printed for - options 'Ft' and 'o'.
    -
    QVn
    -
    select facets adjacent to input site n (marked - 'good').
    -
    Tv
    -
    verify result.
    -
    TI file
    -
    input data from file. The filename may not use spaces or quotes.
    -
    TO file
    -
    output results to file. Use single quotes if the filename - contains spaces (e.g., TO 'file with spaces.txt'
    -
    TFn
    -
    report progress after constructing n facets
    -
    PDk:1
    -
    include upper and lower facets in the output. Set k - to the last dimension (e.g., 'PD2:1' for 2-d inputs).
    -
    f
    -
    facet dump. Print the data structure for each facet (i.e., Delaunay region).
    -
    -
    - -
    -

    »qdelaunay -graphics

    -
    - -

    For 2-d and 3-d Delaunay triangulations, Geomview ('qdelaunay G') displays the corresponding convex -hull (a paraboloid).

    - -

    To view a 2-d Delaunay triangulation, use 'qdelaunay GrD2' to drop the last dimension. This -is the same as viewing the hull without perspective (see -Geomview's 'cameras' menu).

    - -

    To view a 3-d Delaunay triangulation, use 'qdelaunay GrD3' to drop the last dimension. You -may see extra edges. These are interior edges that Geomview moves -towards the viewer (see 'lines closer' in Geomview's camera -options). Use option 'Gt' to make -the outer ridges transparent in 3-d. See Delaunay and Voronoi examples.

    - -

    For 2-d Delaunay triangulations, Mathematica ('m') and Maple ('FM') output displays the lower facets of the corresponding convex -hull (a paraboloid).

    - -

    For 2-d, furthest-site Delaunay triangulations, Maple and Mathematica output ('Qu m') displays the upper facets of the corresponding convex -hull (a paraboloid).

    - -
    -

    »qdelaunay -notes

    -
    - -

    You can simplify the Delaunay triangulation by enclosing the input -sites in a large square or cube. This is particularly recommended -for cocircular or cospherical input data. - -

    A non-simplicial Delaunay region indicates nearly cocircular or -cospherical input sites. To avoid non-simplicial regions either triangulate -the output ('Qt') or joggle -the input ('QJ'). Triangulated output -is more accurate than joggled input. Alternatively, use an exact arithmetic code.

    - -

    Delaunay triangulations do not include facets that are -coplanar with the convex hull of the input sites. A facet is -coplanar if the last coefficient of its normal is -nearly zero (see qh_ZEROdelaunay). - -

    See Imprecision issues :: Delaunay triangulations -for a discussion of precision issues. Deleted vertices indicate -highly degenerate input. They are listed in the summary output and -option 'Fs'.

    - -

    To compute the Delaunay triangulation of points on a sphere, -compute their convex hull. If the sphere is the unit sphere at -the origin, the facet normals are the Voronoi vertices of the -input. The points may be restricted to a hemisphere. [S. Fortune] -

    - -

    The 3-d Delaunay triangulation of regular points on a half -spiral (e.g., 'rbox 100 l | qdelaunay') has quadratic size, while the Delaunay triangulation -of random 3-d points is -approximately linear for reasonably sized point sets. - -

    With the Qhull library, you -can use qh_findbestfacet in poly2.c to locate the facet -that contains a point. You should first lift the point to the -paraboloid (i.e., the last coordinate is the sum of the squares -of the point's coordinates -- qh_setdelaunay). Do not use options -'Qbb', 'QbB', -'Qbk:n', or 'QBk:n' since these scale the last -coordinate.

    - -

    If a point is interior to the convex hull of the input set, it -is interior to the adjacent vertices of the Delaunay -triangulation. This is demonstrated by the following pipe for -point 0: - -

    -    qdelaunay <data s FQ QV0 p | qconvex s Qb3:0B3:0 p
    -
    - -

    The first call to qdelaunay returns the neighboring points of -point 0 in the Delaunay triangulation. The second call to qconvex -returns the vertices of the convex hull of these points (after -dropping the lifted coordinate). If point 0 is interior to the -original point set, it is interior to the reduced point set.

    - -
    -

    »qdelaunay conventions

    -
    - -

    The following terminology is used for Delaunay triangulations -in Qhull for dimension d. The underlying structure is the -lower facets of a convex hull in dimension d+1. For -further information, see data -structures and convex hull -conventions.

    -
    -
      -
    • input site - a point in the input (one dimension - lower than a point on the convex hull)
    • -
    • point - a point has d+1 coordinates. The - last coordinate is the sum of the squares of the input - site's coordinates
    • -
    • coplanar point - a coincident - input site or a deleted vertex. Deleted vertices - indicate highly degenerate input.
    • -
    • vertex - a point on the paraboloid. It - corresponds to a unique input site.
    • -
    • point-at-infinity - a point added above the - paraboloid by option 'Qz'
    • -
    • lower facet - a facet corresponding to a - Delaunay region. The last coefficient of its normal is - clearly negative.
    • -
    • upper facet - a facet corresponding to a - furthest-site Delaunay region. The last coefficient of - its normal is clearly positive.
    • -
    • Delaunay region - a - lower facet projected to the input sites
    • -
    • upper Delaunay region - an upper facet projected - to the input sites
    • -
    • non-simplicial facet - more than d - input sites are cocircular or cospherical
    • -
    • good facet - a Delaunay region with optional - restrictions by 'QVn', etc.
    • -
    -
    -
    -

    »qdelaunay options

    - -
    -qdelaunay- compute the Delaunay triangulation
    -    http://www.qhull.org
    -
    -input (stdin):
    -    first lines: dimension and number of points (or vice-versa).
    -    other lines: point coordinates, best if one point per line
    -    comments:    start with a non-numeric character
    -
    -options:
    -    Qt   - triangulated output
    -    QJ   - joggle input instead of merging facets
    -    Qu   - compute furthest-site Delaunay triangulation
    -
    -Qhull control options:
    -    QJn  - randomly joggle input in range [-n,n]
    -    Qs   - search all points for the initial simplex
    -    Qz   - add point-at-infinity to Delaunay triangulation
    -    QGn  - print Delaunay region if visible from point n, -n if not
    -    QVn  - print Delaunay regions that include point n, -n if not
    -
    -Trace options:
    -    T4   - trace at level n, 4=all, 5=mem/gauss, -1= events
    -    Tc   - check frequently during execution
    -    Ts   - print statistics
    -    Tv   - verify result: structure, convexity, and in-circle test
    -    Tz   - send all output to stdout
    -    TFn  - report summary when n or more facets created
    -    TI file - input data from file, no spaces or single quotes
    -    TO file - output results to file, may be enclosed in single quotes
    -    TPn  - turn on tracing when point n added to hull
    -     TMn - turn on tracing at merge n
    -     TWn - trace merge facets when width > n
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)
    -     TCn - stop qhull after building cone for point n (see TVn)
    -
    -Precision options:
    -    Cn   - radius of centrum (roundoff added).  Merge facets if non-convex
    -     An  - cosine of maximum angle.  Merge facets if cosine > n or non-convex
    -           C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge
    -    Rn   - randomly perturb computations by a factor of [1-n,1+n]
    -    Wn   - min facet width for outside point (before roundoff)
    -
    -Output formats (may be combined; if none, produces a summary to stdout):
    -    f    - facet dump
    -    G    - Geomview output (see below)
    -    i    - vertices incident to each Delaunay region
    -    m    - Mathematica output (2-d only, lifted to a paraboloid)
    -    o    - OFF format (dim, points, and facets as a paraboloid)
    -    p    - point coordinates (lifted to a paraboloid)
    -    s    - summary (stderr)
    -
    -More formats:
    -    Fa   - area for each Delaunay region
    -    FA   - compute total area for option 's'
    -    Fc   - count plus coincident points for each Delaunay region
    -    Fd   - use cdd format for input (homogeneous with offset first)
    -    FD   - use cdd format for numeric output (offset first)
    -    FF   - facet dump without ridges
    -    FI   - ID of each Delaunay region
    -    Fm   - merge count for each Delaunay region (511 max)
    -    FM   - Maple output (2-d only, lifted to a paraboloid)
    -    Fn   - count plus neighboring region for each Delaunay region
    -    FN   - count plus neighboring region for each point
    -    FO   - options and precision constants
    -    FP   - nearest point and distance for each coincident point
    -    FQ   - command used for qdelaunay
    -    Fs   - summary: #int (8), dimension, #points, tot vertices, tot facets,
    -                    for output: #vertices, #Delaunay regions,
    -                                #coincident points, #non-simplicial regions
    -                    #real (2), max outer plane, min vertex
    -    FS   - sizes:   #int (0)
    -                    #real (2), tot area, 0
    -    Fv   - count plus vertices for each Delaunay region
    -    Fx   - extreme points of Delaunay triangulation (on convex hull)
    -
    -Geomview options (2-d and 3-d)
    -    Ga   - all points as dots
    -     Gp  -  coplanar points and vertices as radii
    -     Gv  -  vertices as spheres
    -    Gi   - inner planes only
    -     Gn  -  no planes
    -     Go  -  outer planes only
    -    Gc     - centrums
    -    Gh   - hyperplane intersections
    -    Gr   - ridges
    -    GDn  - drop dimension n in 3-d and 4-d output
    -    Gt   - transparent outer ridges to view 3-d Delaunay
    -
    -Print options:
    -    PAn  - keep n largest Delaunay regions by area
    -    Pdk:n - drop facet if normal[k] <= n (default 0.0)
    -    PDk:n - drop facet if normal[k] >= n
    -    Pg   - print good Delaunay regions (needs 'QGn' or 'QVn')
    -    PFn  - keep Delaunay regions whose area is at least n
    -    PG   - print neighbors of good regions (needs 'QGn' or 'QVn')
    -    PMn  - keep n Delaunay regions with most merges
    -    Po   - force output.  If error, output neighborhood of facet
    -    Pp   - do not report precision problems
    -
    -    .    - list of all options
    -    -    - one line descriptions of all options
    -
    - - -
    - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: synopsis -• input • outputs -• controls • graphics -• notes • conventions -• options - -


    - -

    The Geometry Center -Home Page

    - -

    Comments to: qhull@qhull.org -
    -Created: Sept. 25, 1995 --- Last modified: see top

    - - diff --git a/src/qhull/html/qh--4d.gif b/src/qhull/html/qh--4d.gif deleted file mode 100644 index 08be18c8a5a1c89f07da6abb451283cbf176d5b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4372 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 aB{fPSgP!@PkGDE|e!fd8+eHNc9R366^3h-b diff --git a/src/qhull/html/qh--dt.gif b/src/qhull/html/qh--dt.gif deleted file mode 100644 index b6d4e26727ce648be6ed6d4c8e5a49a367064f20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3772 zcma)*Ygm#8!^dwx~2`C@Y_>Haw=wijFhu-GjD6?b({Gt=gW==iT$|{rLXA{jcl)>33bfER_be6n`lCsG?l^n>{xg{!DVx?bDx2JHgyPOmtBl)Y+-C{Dl6hZ7H zvB-ZHMUh8VUXo;vOdL!*;T${=l9Eak?2DE(N;7zLU5Zy)WqQV2&e;@hR&KUh z4VA?)^VQDPN}70AY(_be+(^llP(8M}h;|Yg3W`?Zk&{DAk6@SZJ!1_}M0Z52DOR{g z7-x)2&?ksn#Bqi=QHw~tOPtu8C~c53nY83>$?{rxN_C1tqsVpVDT|e=&8p18%q(?Q zc3yT)PL7nxQ5DEa;^|Q(ZtjL{|Ctb^SK8ALI0iqZ2ND=k`&;svj?m4_rG$m+bXOIe%*LFgyE`$EK-kUw(+q^-H~T&2Q-_yz|GQEV0z5 z`dy>Fr3!iLAV%KBLU0`vM=&k)&yUCGmr$_Qt*Mxze}JariK5*5rr8NB{ct(SdWUfbPQn3uu>9bpa0PZGLwK zY66o(b`?E7e-*oe3^``=EMw&inIwh(sCaxSVdFpN+>dh`6)>>zU!@i}>L>N`+o+HJ z{OnC|53*!X@qKDY`K&Z7qx?rrKithD2zA0R5q#-h)z)+K-kvqmbrkKmZBXH{a`@4S<|cAL-*Wrmm=;pSfj%L&u|>j5nH?P-CF$* zu9l)0MhJV_Z4t-A2{KkIymV{pu!_B4uT}QWjr&he>_iSB`pWO-yqJr8Bw8~9g+HMl zdu;|5=e$@A1E$*2JFnHPD3-bvky|mvI$AQUI+;zp`TJhFMkhYt^*_+Fg66Ww%d04F zD{r>{QN@&#paB2vOsDleW1ilk6H5>q&!H!ZaLtXTK`n`S0U7dW67~^o#&zZ(r|^XU zMlr}|(EcM2UZh8X?33ypKJiCzOw0LbDb1U57dWOUif*MZ%P-8+M@IUShoAq-rC*#p zeI)(T!A8U3B)$BJpv5znF!bgWlzbuS8 zlyj$LS*Oo}yf3cYIHRno`T6RXPn)5@_G4m2itzL4Yjp1~_~GQHSDHj;@N6xtXF2gF z{!-@lmvdKt9JZuqk1s%&jd{v@_46S0a7EI!Vf=dPvdxqp88O)~knF!p?K66}?u(+| zBMBFt$Y?uqreCwq*?d%imS5}V{aNjjH-WH@xJwI#6xe=(Ob;mBbf5h-as4RG)XAII zblrsQBTiu0VOA9wFxXph{fBedbCU~87D+qvDP6pXDVgwi`Q1wUKljiiOBt74P(2(Q z&N7^Jovk%zN$`HhF>y6?<$qF1UKZbW#}zGtlw}Q0HyvtGwDtY|)bXGQCv~)FlY$$p zhT>s3>PBEE`KDMMB=2> z?vRDZ?9Fr>6AZjuri}TlG3tDuBu0J*!ejZZ4zA$0gg!goIb4ir^{5znei81^)WCMA z^f#(`h^*e*q%dd!O0NIJ$8qt1%jBuG2U+;Ir>mV7TqQe&zJDv-f@Z3uZdTYq2c{Lu zT%Yw;K;YS{bkczBv`AOgjd!bqY5A19dkmxyNX{u^C=TOBOvynf!{;wa1%T#YQ~Dr3B6B~#8BWO%F&GsHu&rl}ZL;Wk7EA*Ihq>YY65@JVr!Zw*4X%ph8?T7B1IieKz~4Xc!k zUGH=~E@~m*&r{?zh=04T6h>XDw<997V|Vu@GH6(RP4o3M&5L*+Ou!paecbwiGzSSRoE@N*mbFQe2%U)9|!{0PCguR+=8$Dns|sj*#*uJH`cL5Y6);wU=%ge+YC!< zNdISky3hBNK6oR?MVe+D0nG!PbamFBHQGHBxZkNoMD`k@QYoAigO&dIx5i+d{@xS2 z4R+b>uTj52n*;M`^Wu|?)(wA<*B;$?K~jo?ovU1--e>b8qxq;9Q0HP!m~&pYc=a_t0{V(6LFK z?Y^Fys%#9}F7?!jRr3Mg9e*rY-$H?Xsy$rxj7RVglJiH>)}A*ar}5wDCr*!}XtrI5 zIvQF)jvpc_rC09$g~KpWYd9m%jje_yh?~V1Iv9QiD(wz z@SBZYoK(PA8~Xk|e(WcIx8<8SAKWebtN!5<8zJ~WXK?vunw(9MOe5dLDfM*t5+q`% z%@CSKduSE=zjcezAr!oeBB~QZ>gx>1mU5V9@AOUOpSQqo)>gNw!0VDVBu`q2!YsG0 zrpSrZd+z8PXxRi|11SlF?uF2olk7&;b#0yL~=(<3-Vs z6veOW?E9((hPVD(|Nb#U0QbpvM)?eXx7DD89?@TZw#fX04#2qf-^@P)49*l#>0$jP z?P()gRBQ;Su+w&eyF(_%a5X(^hQKd6^U(%asKt&N^=}JpsXH+LRk6E&?~Lo08|$rC znl@f~gI63r7~k(?_67&l4dbQ!AB`G1@ZFfqk5h{0U-|k~+AVV3gFA!DhcsN_1 z8HEyy)F0Kq;PaF`DNG8y#L;EDFOBT!SC8C_*Vxt}r!c-toQj)D)M z^IXgV7p{dIl5D6d5x7O)`sx}`F^1bMa!A%fBldW1E22UUO{l<#K?s@+)vlxat*UXo z<4y=*+mIEy*4<{A>w^xC7$fv8THt1*2-skYWMeoN5dvU_EQqsu$E$QiydC*21aOri9(owFbe|cBTIb?8wyn&DlecVnDrM`Ain*8zZiRVEULv9@!CWf(RK3d+8YvVc!7I_3e$qXgo-Lj z3~av{fvY-vV@KufI!G{PYAMHn5C2w<8QcjD+k}F*-yhRq(h4vUkO^Cgi5N2uj^*Y@ z6V3zTmb>s_?jdK_@_sI2F!Dok|6y_)uit){Aj2%^yY-8N33E@{BHUNhurGiZqeq;! b)E_=_r0*X`jy*hb;`bvK_r5-N2#Eb(@t%X< diff --git a/src/qhull/html/qh--geom.gif b/src/qhull/html/qh--geom.gif deleted file mode 100644 index 9c70b54991a4574015671ec0e0b29102c5346737..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 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 tio%^!)G! zn&62?Ji-!#4mCI6p^dgm_q}kY@|4fOha03I1zQ+GNh(q4UGDkT*d%~OJss#Xiy9tq zU~79Jtm+!4`o^2s#6H%f#BW#{(;&vjrd#ojNqG9aO>S~Hw6Inb*g_F;FgBxCoen-^ z!5U*Y2`YG?U(o&*5Cka3JMLi$ULP32%v}YyV+`)#GkT=93PKZYY8sF$W zf+b)}-H+Q`;OX!|x>HgK9zgWuHFZT39=`H>yra{qRqg{GU=MrDVGeFEhkN0BbB_z0 z571Hx5vUM~P=2?jD`>*Ji+&GZJi;7=@Pyhs?dcsH!VrdtaKNojcL}4R11z~hD3}3s zp$mZQD~G}(2w(;?zysKDpoA}S5Q9XRp$&8Ixa5Hmj1lZy>s)8XezSVdu>=0-!Wf0< zM=yG9@WTqLu!RMxK6yR>p#&|VbttHiXKV%+1ox;w?jf#w-48+uqv(U^h2IBZXrmDP zCc+if9O`@QANS z34>q@W)KDBfCG!*4SRqF(x?V7fEgQr45HYJ=s*B7aEdDz4%k2mUl0RuKnTpJ0@2_N z-jI%qKo0CEjUF(4ZGj4QfCbYa2?ubE^>6@o5C+0nbnn0b3@`wLpbg}(2nI=z=|~RI zD2+!zJcJ<)m4F21dS%DU_So37znc@G%hA00S?H4#)tLl5h?iumzJq z03j)oZuyo6Sp-`d3zQ&oUnvmVAeLAVlgNM!=ztDlAPJ5T4R8sU(SQbi;0T=%3vNIM zcZm>r`I3E!40>P+{m>7R5CnUm288LBhpCuB&m - - - -Qhull code - - - - - -

    Up: Home page for Qhull -
    -Up: Qhull manual: Table of -Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: Qhull code: Table of Contents -(please wait while loading)
    -Dn: Qhull functions, macros, and data -structures -

    - -
    - -

    [4-d cube] Qhull code

    - -

    This section discusses the code for Qhull.

    - -

    Copyright © 1995-2015 C.B. Barber

    - -
    - -

    »Qhull code: Table of -Contents

    - - - -
    - -

    »Reentrant Qhull

    - -

    Qhull-2015 introduces reentrant Qhull (libqhull_r). Reentrant Qhull uses a qhT* argument instead of global data structures. -The qhT* pointer is the first argument to most Qhull routines. It allows multiple instances of Qhull to run at the same time. -It simplifies the C++ interface to Qhull. - -

    New code should be written with libqhull_r. Existing users of libqhull should consider converting to libqhull_r. -Although libqhull will be supported indefinitely, improvements may not be implemented. -Reentrant qhull is 1-2% slower than non-reentrant qhull. - -

    Note: Reentrant Qhull is not thread safe. Do not invoke Qhull routines with the same qhT* pointer from multiple threads. - -

    »How to convert code to reentrant Qhull

    - -

    C++ users need to convert to libqhull_r. -The new C++ interface does a better, but not perfect, job of hiding Qhull's C data structures. -The previous C++ interface was unusual due to Qhull's global data structures. - -

    All other users should consider converting to libqhull_r. The conversion is straight forward. -The original conversion of libqhull to libqhull_r required thousands of changes, mostly global -search and replace. The first run of Qhull (unix_r.c) produced the same -output, and nearly the same log files, as the original (unix.c). - -

    Suggestions to help with conversion. -

      -
    • Compare qconvex_r.c with qconvex.c. Define a qhT object and a pointer it. The qhT* pointer is the first argument to most Qhull functions. -Clear qh_qh-<NOerrext before calling qh_initflags(). Invoke QHULL_LIB_CHECK to check for a compatible Qhull library. -
    • Compare user_eg2_r.c with user_eg2.c -
    • Compare user_eg_r.c with user_eg.c. If you use qhT before invoking qh_init_A, call qh_zero() to clear the qhT object. -user_eg_r.c includes multiple Qhull runs. -
    • Review user_eg3_r.cpp. As with the other programs, invoke QHULL_LIB_CHECK. -Simple C++ programs should compile as is. -
    • Compare QhullFacet.cpp with the same file in Qhull-2012.1. UsingLibQhull was replaced with the macro QH_TRY_() and 'qh_qh-<NOerrext= true'. -
    • For detailed notes on libqhull_r, see "libqhull_r (reentrant Qhull)" and "Source code changes for libqhull_r" in Changes.txt. -
    • For detailed notes on libqhullcpp, see "C++ interface" and following sections in Changes.txt. -
    • For regexps and conversion notes, see README_r.txt (unedited). -
    - -

    »Qhull on 64-bit computers

    - -

    Qhull compiles for 64-bit hosts. Since the size of a pointer on a 64-bit host is double the size on a 32-bit host, -memory consumption increases about 50% for simplicial facets and up-to 100% for non-simplicial facets. - -

    You can check memory consumption with option Ts. It includes the size of -each data structure: -

      -
    • 32-bit -- merge 24 ridge 20 vertex 28 facet 88 normal 24 ridge vertices 16 facet vertices or neighbors 20 -
    • 64-bit -- merge 32 ridge 32 vertex 48 facet 120 normal 32 ridge vertices 40 facet vertices or neighbors 48 -
    - -

    For Qhull 2015, the maximum identifier for ridges, vertices, and facets was increased -from 24-bits to 32-bits. This allows for larger convex hulls, but may increase the size of -the corresponding data structures. The sizes for Qhull 2012.1 were -

      -
    • 32-bit -- merge 24 ridge 16 vertex 24 facet 88 -
    • 64-bit -- merge 32 ridge 32 vertex 40 facet 120 -
    - -

    »Calling Qhull from -C++ programs

    - -

    Qhull 2015 uses reentrant Qhull for its C++ interface. If you used -the C++ interface from qhull 2012.1, you may need to adjust how you initialize and use -the Qhull classes. See How to convert code to reentrant Qhull. - -

    -Qhull's C++ interface allows you to explore the results of running Qhull. -It provides access to Qhull's data structures. -Most of the classes derive from the corresponding qhull data structure. -For example, QhullFacet is an instance of Qhull's facetT. -

    - -

    You can retain most of the data in Qhull and use the C++ interface to explore its results. -Each object contains a reference the Qhull's data structure (via QhullQh), making the C++ representation less memory efficient. -

    - -

    Besides using the C++ interface, you can also use libqhull_r directly. For example, -the FOREACHfacet_(...) macro will visit each facet in turn. -

    - -

    The C++ interface to Qhull is incomplete. You may need to extend the interface. -If so, you will need to understand Qhull's data structures and read the code. - -Example (c.f., user_eg3 eg-100). It prints the facets generated by Qhull. - -

    -    RboxPoints rbox;
    -    rbox.appendRandomPoints("100");
    -    Qhull qhull;
    -    qhull.runQhull("", rbox);
    -    QhullFacetList facets(qhull);
    -    cout<< facets;
    -
    - -

    -The C++ iterface for RboxPoints redefines the fprintf() calls -in rboxlib.c. Instead of writing its output to stdout, RboxPoints appends -the output to a std::vector. -The same technique may be used for calling Qhull from C++. -

    -
    • -Run Qhull with option 'Ta' to annotate the -output with qh_fprintf() identifiers. -
    • -Redefine qh_fprintf() for these identifiers. -
    • -See RboxPoints.cpp for an example. -
    -

    -Since the C++ interface uses reentrant Qhull, multiple threads may run Qhull at the same time. Each thread is -one run of Qhull. -

    - -

    -Do not have two threads accessing the same Qhull instance. Qhull is not thread-safe. -

    - -

    »CoordinateIterator

    -

    -A CoordinateIterator or ConstCoordinateIterator [RboxPoints.cpp] is a std::vector<realT>::iterator for Rbox and Qhull coordinates. -It is the result type of RboxPoints.coordinates(). -

    - -

    Qhull does not use CoordinateIterator for its data structures. A point in Qhull is an array of reals instead of a std::vector. -See QhullPoint. -

    - -

    »Qhull

    -

    -Qhull is the top-level class for running Qhull. -It initializes Qhull, runs the computation, and records errors. -It provides access to the global data structure QhullQh, -Qhull's facets, and vertices. -

    - -

    »QhullError

    -

    -QhullError is derived from std::exception. It reports errors from Qhull and captures the output to stderr. -

    - -

    -If error handling is not set up, Qhull exits with a code from 1 to 5. The codes are defined by -qh_ERR* in libqhull_r.h. The exit is via qh_exit() in usermem_r.c. -The C++ interface does not report the -captured output in QhullError. Call Qhull::setErrorStream to send output to cerr instead. -

    - -

    »QhullFacet

    -

    -A QhullFacet is a facet of the convex hull, a region of the Delaunay triangulation, a vertex of a Voronoi diagram, -or an intersection of the halfspace intersection about a point. -A QhullFacet has a set of QhullVertex, a set of QhullRidge, and -a set of neighboring QhullFacets. -

    - -

    »QhullFacetList

    -

    -A QhullFacetList is a linked list of QhullFacet. The result of Qhull.runQhull is a QhullFacetList stored -in QhullQh. -

    - -

    »QhullFacetSet

    -

    -A QhullFacetSet is a QhullSet of QhullFacet. QhullFacetSet may be ordered or unordered. The neighboring facets of a QhullFacet is a QhullFacetSet. -The neighbors of a QhullFacet is a QhullFacetSet. -The neighbors are ordered for simplicial facets, matching the opposite vertex of the facet. -

    - -

    »QhullIterator

    -

    -QhullIterator contains macros for defining Java-style iterator templates from a STL-style iterator template. -

    - -

    »QhullLinkedList

    -

    -A QhullLinkedLIst is a template for linked lists with next and previous pointers. -QhullFacetList and QhullVertexList are QhullLinkedLists. -

    - -

    »QhullPoint

    -

    -A QhullPoint is an array of point coordinates, typically doubles. The length of the array is QhullQh.hull_dim. -The identifier of a QhullPoint is its 0-based index from QhullQh.first_point followed by QhullQh.other_points. -

    - -

    »QhullPointSet

    -

    -A QhullPointSet is a QhullSet of QhullPoint. The QhullPointSet of a QhullFacet is its coplanar points. -

    - -

    »QhullQh

    -

    -QhullQh is the root of Qhull's data structure. -It contains initialized constants, sets, buffers, and variables. -It contains an array and a set of QhullPoint, -a list of QhullFacet, and a list of QhullVertex. -The points are the input to Qhull. The facets and vertices are the result of running Qhull. -

    - -

    -Qhull's functions access QhullQh through the global variable, qh_qh. -The global data structures, qh_stat and qh_mem, record statistics and manage memory respectively. -

    - -

    »QhullRidge

    - -

    -A QhullRidge represents the edge between two QhullFacet's. -It is always simplicial with qh.hull_dim-1 QhullVertex)'s. -

    - -

    »QhullRidgeSet

    - -

    -A QhullRidgeSet is a QhullSet of QhullRidge. Each QhullFacet contains a QhullRidgeSet. -

    - -

    »QhullSet

    - -

    -A QhullSet is a set of pointers to objects. QhullSets may be ordered or unordered. They are the core data structure for Qhull. -

    - -

    »QhullVertex

    - -

    -A QhullVertex is a vertex of the convex hull. A simplicial QhullFacet has qh.hull_dim-1 vertices. A QhullVertex contains a QhullPoint. -It may list its neighboring QhullFacet's. -

    - -

    »QhullVertexList

    - -

    -A QhullVertexList is a QhullLinkedList of QhullVertex. -The global data structure, QhullQh contains a QhullVertexList of all -the vertices. -

    - -

    »QhullVertexSet

    - -

    -A QhullVertexSet is a QhullSet of QhullVertex. -The QhullVertexSet of a QhullFacet is the vertices of the facet. It is -ordered for simplicial facets and unordered for non-simplicial facets. -

    - -

    »RboxPoints

    - -

    -RboxPoints is a std::vector of point coordinates (QhullPoint). -It's iterator is CoordinateIterator. -

    -

    -RboxPoints.appendRandomPoints() appends points from a variety of distributions such as uniformly distributed within a cube and random points on a sphere. -It can also append a cube's vertices or specific points. -

    - -

    »Cpp questions for Qhull

    - -Developing C++ code requires many conventions, idioms, and technical details. -The following questions have either -mystified the author or do not have a clear answer. See also -C++ and Perl Guidelines. -and FIXUP notes in the code. -Please add notes to Qhull Wiki. - -
      -
    • FIXUP QH11028 Should return reference, but get reference to temporary -
      iterator Coordinates::operator++() { return iterator(++i); }
      -
    • size() as size_t, size_type, or int -
    • Should all containers have a reserve()? -
    • Qhull.feasiblePoint interface -
    • How to avoid copy constructor while logging, maybeThrowQhullMessage() -
    • How to configure Qhull output. Trace and results should go to stdout/stderr -
    • Qhull and RboxPoints messaging. e.g., ~Qhull, hasQhullMessage(). Rename them as QhullErrorMessage? -
    • How to add additional output to an error message, e.g., qh_setprint -
    • Is idx the best name for an index? It's rather cryptic, but BSD strings.h defines index(). -
    • Qhull::feasiblePoint Qhull::useOutputStream as field or getter? -
    • Define virtual functions for user customization of Qhull (e.g., qh_fprintf, qh_memfree,etc.) -
    • Figure out RoadError::global_log. clearQhullMessage currently clearGlobalLog -
    • Should the false QhullFacet be NULL or empty? e.g., QhullFacet::tricoplanarOwner() and QhullFacetSet::end() -
    • Should output format for floats be predefined (qh_REAL_1, 2.2g, 10.7g) or as currently set for stream -
    • Should cout << !point.defined() be blank or 'undefined' -
    • Infinite point as !defined() -
    • qlist and qlinkedlist define pointer, reference, size_type, difference_type, const_pointer, const_reference for the class but not for iterator and const_iterator - vector.h --
      reference operator[](difference_type _Off) const
      -
    • When forwarding an implementation is base() an approriate name (e.g., Coordinates::iterator::base() as std::vector::iterator). -
    • When forwarding an implementation, does not work "returning address of temporary" -
    • Also --, +=, and -= -
      iterator       &operator++() { return iterator(i++); }
      -
    • if vector inheritance is bad, is QhullVertexSet OK? -
    • Should QhullPointSet define pointer and reference data types? -
    - -

    »Calling Qhull from -C programs

    - -

    Warning: Qhull was not designed for calling from C -programs. You may find the C++ interface easier to use. -You will need to understand the data structures and read the code. -Most users will find it easier to call Qhull as an external -command. - -

    For examples of calling Qhull, see GNU Octave's -computational geometry code, -and Qhull's -user_eg_r.c, -user_eg2_r.c, and -user_r.c. To see how Qhull calls its library, read -unix_r.c, -qconvex.c, -qdelaun.c, -qhalf.c, and -qvoronoi.c. The '*_r.c' files are reentrant, otherwise they are non-reentrant. -Either version may be used. New code should use reentrant Qhull. - -

    See Reentrant Qhull functions, macros, and data -structures for internal documentation of Qhull. The -documentation provides an overview and index. To use the library -you will need to read and understand the code. For most users, it -is better to write data to a file, call the qhull program, and -read the results from the output file.

    - -

    If you use non-reentrant Qhull, be aware of the macros "qh" -and "qhstat", e.g., "qh hull_dim". They are -defined in libqhull.h. They allow the global data -structures to be pre-allocated (faster access) or dynamically -allocated (allows multiple copies).

    - -

    Qhull's Makefile produces a library, libqhull_r.a, -for inclusion in your programs. First review libqhull_r.h. -This defines the data structures used by Qhull and provides -prototypes for the top-level functions. -Most users will only need libqhull_r.h in their programs. For -example, the Qhull program is defined with libqhull_r.h and unix_r.c. -To access all functions, use qhull_ra.h. Include the file -with "#include <libqhull_r/qhull_ra.h>". This -avoids potential name conflicts.

    - -

    If you use the Qhull library, you are on your own as far as -bugs go. Start with small examples for which you know the output. -If you get a bug, try to duplicate it with the Qhull program. The -'Tc' option will catch many problems -as they occur. When an error occurs, use 'T4 TPn' -to trace from the last point added to the hull. Compare your -trace with the trace output from the Qhull program.

    - -

    Errors in the Qhull library are more likely than errors in the -Qhull program. These are usually due to feature interactions that -do not occur in the Qhull program. Please report all errors that -you find in the Qhull library. Please include suggestions for -improvement.

    - -

    »How to avoid exit(), fprintf(), stderr, and stdout

    - -

    Qhull sends output to qh.fout and errors, log messages, and summaries to qh.ferr. qh.fout is normally -stdout and qh.ferr is stderr. qh.fout may be redefined by option 'TO' or the caller. qh.ferr may be redirected to qh.fout by option 'Tz'.

    - -

    Qhull does not use stderr, stdout, fprintf(), or exit() directly.

    - -

    Qhull reports errors via qh_errexit() by writting a message to qh.ferr and invoking longjmp(). -This returns the caller to the corresponding setjmp() (c.f., QH_TRY_ in QhullQh.h). If -qh_errexit() is not available, Qhull functions call qh_exit(). qh_exit() normally calls exit(), -but may be redefined by the user. An example is -libqhullcpp/usermem_r-cpp.cpp. It redefines qh_exit() as a 'throw'.

    - -

    If qh_meminit() or qh_new_qhull() is called with ferr==NULL, then they set ferr to stderr. -Otherwise the Qhull libraries use qh->ferr and qh->qhmem.ferr for error output.

    - -

    If an error occurs before qh->ferr is initialized, Qhull invokes qh_fprintf_stderr(). The user -may redefine this function along with qh_exit(), qh_malloc(), and qh_free(). - -

    The Qhull libraries write output via qh_fprintf() [userprintf_r.c]. Otherwise, the Qhull -libraries do not use stdout, fprintf(), or printf(). Like qh_exit(), the user may redefine -qh_fprintf().

    - -

    »sets and quick memory -allocation

    - -

    You can use mem_r.c and qset_r.c individually. Mem_r.c -implements quick-fit memory allocation. It is faster than -malloc/free in applications that allocate and deallocate lots of -memory.

    - -

    Qset_r.c implements sets and related collections. It's -the inner loop of Qhull, so speed is more important than -abstraction. Set iteration is particularly fast. qset_r.c -just includes the functions needed for Qhull.

    - -

    »Delaunay triangulations -and point indices

    - -

    Here some unchecked code to print the point indices of each -Delaunay triangle. Use option 'QJ' if you want to avoid -non-simplicial facets. Note that upper Delaunay regions are -skipped. These facets correspond to the furthest-site Delaunay -triangulation.

    - -
    -
    -  facetT *facet;
    -  vertexT *vertex, **vertexp;
    -
    -  FORALLfacets {
    -    if (!facet->upperdelaunay) {
    -      printf ("%d", qh_setsize (facet->vertices);
    -      FOREACHvertex_(facet->vertices)
    -        printf (" %d", qh_pointid (vertex->point));
    -      printf ("\n");
    -    }
    -  }
    -
    -
    -
    - -

    »locate a facet with -qh_findbestfacet()

    - -

    The routine qh_findbestfacet in poly2_r.c is -particularly useful. It uses a directed search to locate the -facet that is furthest below a point. For Delaunay -triangulations, this facet is the Delaunay triangle that contains -the lifted point. For convex hulls, the distance of a point to -the convex hull is either the distance to this facet or the -distance to a subface of the facet.

    - -
    -

    Warning: If triangulated output ('Qt') and -the best facet is triangulated, qh_findbestfacet() returns one of -the corresponding 'tricoplanar' facets. The actual best facet may be a different -tricoplanar facet. -

    -See qh_nearvertex() in poly2.c for sample code to visit each -tricoplanar facet. To identify the correct tricoplanar facet, -see Devillers, et. al., ['01] -and Mucke, et al ['96]. If you -implement this test in general dimension, please notify -qhull@qhull.org. -

    - -

    qh_findbestfacet performs an exhaustive search if its directed -search returns a facet that is above the point. This occurs when -the point is inside the hull or if the curvature of the convex -hull is less than the curvature of a sphere centered at the point -(e.g., a point near a lens-shaped convex hull). When the later -occurs, the distance function is bimodal and a directed search -may return a facet on the far side of the convex hull.

    - -

    Algorithms that retain the previously constructed hulls -usually avoid an exhaustive search for the best facet. You may -use a hierarchical decomposition of the convex hull [Dobkin and -Kirkpatrick '90].

    - -

    To use qh_findbestfacet with Delaunay triangulations, lift the -point to a paraboloid by summing the squares of its coordinates -(see qh_setdelaunay in geom2_r.c). Do not scale the input with -options 'Qbk', 'QBk', 'QbB' or 'Qbb'. See Mucke, et al ['96] for a good point location -algorithm.

    - -

    The intersection of a ray with the convex hull may be found by -locating the facet closest to a distant point on the ray. -Intersecting the ray with the facet's hyperplane gives a new -point to test.

    - -

    »on-line construction with -qh_addpoint()

    - -

    The Qhull library may be used for the on-line construction of -convex hulls, Delaunay triangulations, and halfspace -intersections about a point. It may be slower than implementations that retain -intermediate convex hulls (e.g., Clarkson's hull -program). These implementations always use a directed search. -For the on-line construction of convex hulls and halfspace -intersections, Qhull may use an exhaustive search -(qh_findbestfacet).

    - -

    You may use qh_findbestfacet and qh_addpoint (libqhull.c) to add a point to -a convex hull. Do not modify the point's coordinates since -qh_addpoint does not make a copy of the coordinates. For Delaunay -triangulations, you need to lift the point to a paraboloid by -summing the squares of the coordinates (see qh_setdelaunay in -geom2.c). Do not scale the input with options 'Qbk', 'QBk', 'QbB' -or 'Qbb'. Do not deallocate the point's coordinates. You need to -provide a facet that is below the point (qh_findbestfacet). -

    - -

    You can not delete points. Another limitation is that Qhull -uses the initial set of points to determine the maximum roundoff -error (via the upper and lower bounds for each coordinate).

    - -

    For many applications, it is better to rebuild the hull from -scratch for each new point. This is especially true if the point -set is small or if many points are added at a time.

    - -

    Calling qh_addpoint from your program may be slower than -recomputing the convex hull with qh_qhull. This is especially -true if the added points are not appended to the qh first_point -array. In this case, Qhull must search a set to determine a -point's ID. [R. Weber]

    - -

    See user_eg.c for examples of the on-line construction of -convex hulls, Delaunay triangulations, and halfspace -intersections. The outline is:

    - -
    -
    -initialize qhull with an initial set of points
    -qh_qhull();
    -
    -for each additional point p
    -   append p to the end of the point array or allocate p separately
    -   lift p to the paraboloid by calling qh_setdelaunay
    -   facet= qh_findbestfacet (p, !qh_ALL, &bestdist, &isoutside);
    -   if (isoutside)
    -      if (!qh_addpoint (point, facet, False))
    -         break;  /* user requested an early exit with 'TVn' or 'TCn' */
    -
    -call qh_check_maxout() to compute outer planes
    -terminate qhull
    -
    - -

    »Constrained -Delaunay triangulation

    - -

    With a fair amount of work, Qhull is suitable for constrained -Delaunay triangulation. See Shewchuk, ACM Symposium on -Computational Geometry, Minneapolis 1998.

    - -

    Here's a quick way to add a constraint to a Delaunay -triangulation: subdivide the constraint into pieces shorter than -the minimum feature separation. You will need an independent -check of the constraint in the output since the minimum feature -separation may be incorrect. [H. Geron]

    - -

    »Tricoplanar facets and option 'Qt'

    - -

    Option 'Qt' triangulates non-simplicial -facets (e.g., a square facet in 3-d or a cubical facet in 4-d). -All facets share the same apex (i.e., the first vertex in facet->vertices). -For each triangulated facet, Qhull -sets facet->tricoplanar true and copies facet->center, facet->normal, facet->offset, and facet->maxoutside. One of -the facets owns facet->normal; its facet->keepcentrum is true. -If facet->isarea is false, facet->triowner points to the owning -facet. - -

    Qhull sets facet->degenerate if the facet's vertices belong -to the same ridge of the non-simplicial facet. - -

    To visit each tricoplanar facet of a non-simplicial facet, -either visit all neighbors of the apex or recursively visit -all neighbors of a tricoplanar facet. The tricoplanar facets -will have the same facet->center.

    - -

    See qh_detvridge for an example of ignoring tricoplanar facets.

    - -

    »Voronoi vertices of a -region

    - -

    The following code iterates over all Voronoi vertices for each -Voronoi region. Qhull computes Voronoi vertices from the convex -hull that corresponds to a Delaunay triangulation. An input site -corresponds to a vertex of the convex hull and a Voronoi vertex -corresponds to an adjacent facet. A facet is -"upperdelaunay" if it corresponds to a Voronoi vertex -"at-infinity". Qhull uses qh_printvoronoi in io.c -for 'qvoronoi o'

    - -
    -
    -/* please review this code for correctness */
    -qh_setvoronoi_all();
    -FORALLvertices {
    -   site_id = qh_pointid (vertex->point);
    -   if (qh hull_dim == 3)
    -      qh_order_vertexneighbors(vertex);
    -   infinity_seen = 0;
    -   FOREACHneighbor_(vertex) {
    -      if (neighbor->upperdelaunay) {
    -        if (!infinity_seen) {
    -          infinity_seen = 1;
    -          ... process a Voronoi vertex "at infinity" ...
    -        }
    -      }else {
    -        voronoi_vertex = neighbor->center;
    -        ... your code goes here ...
    -      }
    -   }
    -}
    -
    -
    - -

    »Voronoi vertices of a -ridge

    - -

    Qhull uses qh_printvdiagram() in io.c to print the ridges of a -Voronoi diagram for option 'Fv'. -The helper function qh_eachvoronoi() does the real work. It calls -the callback 'printvridge' for each ridge of the Voronoi diagram. -

    - -

    You may call qh_printvdiagram2(), qh_eachvoronoi(), or -qh_eachvoronoi_all() with your own function. If you do not need -the total number of ridges, you can skip the first call to -qh_printvdiagram2(). See qh_printvridge() and qh_printvnorm() in -io.c for examples.

    - -

    »vertex neighbors of -a vertex

    - -

    To visit all of the vertices that share an edge with a vertex: -

    - -
      -
    • Generate neighbors for each vertex with - qh_vertexneighbors in poly2.c.
    • -
    • For simplicial facets, visit the vertices of each - neighbor
    • -
    • For non-simplicial facets,
        -
      • Generate ridges for neighbors with qh_makeridges - in merge.c.
      • -
      • Generate ridges for a vertex with qh_vertexridges - in merge.c.
      • -
      • Visit the vertices of these ridges.
      • -
      -
    • -
    - -

    For non-simplicial facets, the ridges form a simplicial -decomposition of the (d-2)-faces between each pair of facets -- -if you need 1-faces, you probably need to generate the full face -graph of the convex hull.

    - -

    »Performance of -Qhull

    - -

    Empirically, Qhull's performance is balanced in the sense that -the average case happens on average. This may always be true if -the precision of the input is limited to at most O(log n) -bits. Empirically, the maximum number of vertices occurs at the -end of constructing the hull.

    - -

    Let n be the number of input points, v be the -number of output vertices, and f_v be the maximum number -of facets for a convex hull of v vertices. If both -conditions hold, Qhull runs in O(n log v) in 2-d and 3-d -and O(n f_v/v) otherwise. The function f_v -increases rapidly with dimension. It is O(v^floor(d/2) / -floor(d/2)!).

    - -

    The time complexity for merging is unknown. Options 'C-0' and 'Qx' -(defaults) handle precision problems due to floating-point -arithmetic. They are optimized for simplicial outputs.

    - -

    When running large data sets, you should monitor Qhull's -performance with the 'TFn' option. -The time per facet is approximately constant. In high-d with many -merged facets, the size of the ridge sets grows rapidly. For -example the product of 8-d simplices contains 18 facets and -500,000 ridges. This will increase the time needed per facet.

    - -

    As dimension increases, the number of facets and ridges in a -convex hull grows rapidly for the same number of vertices. For -example, the convex hull of 300 cospherical points in 6-d has -30,000 facets.

    - -

    If Qhull appears to stop processing facets, check the memory -usage of Qhull. If more than 5-10% of Qhull is in virtual memory, -its performance will degrade rapidly.

    - -

    When building hulls in 20-d and higher, you can follow the -progress of Qhull with option 'T1'. -It reports each major event in processing a point.

    - -

    To reduce memory requirements, recompile Qhull for -single-precision reals (REALfloat in user.h). -Single-precision does not work with joggle ('QJ'). Check qh_MEMalign in user.h -and the match between free list sizes and data structure sizes -(see the end of the statistics report from 'Ts'). If free list sizes do not match, -you may be able to use a smaller qh_MEMalign. Setting -qh_COMPUTEfurthest saves a small amount of memory, as does -clearing qh_MAXoutside (both in user.h).

    - -

    Shewchuk is working on a 3-d version of his triangle -program. It is optimized for 3-d simplicial Delaunay triangulation -and uses less memory than Qhull.

    - -

    To reduce the size of the Qhull executable, consider -qh_NOtrace and qh_KEEPstatistics 0 in user.h. By -changing user.c you can also remove the input/output -code in io.c. If you don't need facet merging, then -version 1.01 of Qhull is much smaller. It contains some bugs that -prevent Qhull from initializing in simple test cases. It is -slower in high dimensions.

    - -

    The precision options, 'Vn', 'Wn', 'Un'. -'A-n', 'C-n', -'An', 'Cn', -and 'Qx', may have large effects on -Qhull performance. You will need to experiment to find the best -combination for your application.

    - -

    The verify option ('Tv') checks -every point after the hull is complete. If facet merging is used, -it checks that every point is inside every facet. This can take a -very long time if there are many points and many facets. You can -interrupt the verify without losing your output. If facet merging -is not used and there are many points and facets, Qhull uses a -directed search instead of an exhaustive search. This should be -fast enough for most point sets. Directed search is not used for -facet merging because directed search was already used for -updating the facets' outer planes.

    - -

    The check-frequently option ('Tc') -becomes expensive as the dimension increases. The verify option -('Tv') performs many of the same -checks before outputting the results.

    - -

    Options 'Q0' (no pre-merging), 'Q3' (no checks for redundant vertices), -'Q5' (no updates for outer planes), -and 'Q8' (no near-interior points) -increase Qhull's speed. The corresponding operations may not be -needed in your application.

    - -

    In 2-d and 3-d, a partial hull may be faster to produce. -Option 'QgGn' only builds facets -visible to point n. Option 'QgVn' -only builds facets that contain point n. In higher-dimensions, -this does not reduce the number of facets.

    - -

    User.h includes a number of performance-related -constants. Changes may improve Qhull performance on your data -sets. To understand their effect on performance, you will need to -read the corresponding code.

    - -

    GNU gprof reports that the dominate cost for 3-d -convex hull of cosperical points is qh_distplane(), mainly called -from qh_findbestnew(). The dominate cost for 3-d Delaunay triangulation -is creating new facets in qh_addpoint(), while qh_distplane() remains -the most expensive function. - -

    -

    »Enhancements to Qhull

    - -

    There are many ways in which Qhull can be improved.

    - -
    -[Jan 2016] Suggestions
    -------------
    -To do for a future verson of Qhull
    - - Add a post-merge pass for Delaunay slivers.  Merge into a neighbor with a circumsphere that includes the opposite point. [M. Treacy]
    - - Add a merge pass before cone creation to remove duplicate subridges between horizon facets
    - - Option to add a bounding box for Delaunay triangulations, e,g., nearly coincident points
    - - Report error when rbox Cn,r,m does not produce points (e.g., 'r' distributions)
    - - Rescale output to match 'QbB' on input [J. Metz, 1/30/2014 12:21p]
    - - Run through valgrind
    - - Notes to compgeom on conformant triangulation and Voronoi volume
    - - Git: Create signed tags for Qhull versions
    - - Implement weighted Delaunay triangulation and weighted Voronoi diagram [A. Liebscher]
    -   e.g., Sugihara, "Three-dimensional convex hull as a fruitful source of diagrams," Theoretical Computer Science, 2000, 235:325-337
    - - testqset: test qh_setdelnth and move-to-front
    - - Makefile: Re-review gcc/g++ warnings.  OK in 2011.
    - - Break up -Wextra into its components or figure out how to override -Wunused-but-set-variable
    -   unused-but-set-variable is reporting incorrectly.  All instances are annotated.
    - - CMakelists.txt:  Why are files duplicated for cmake build
    - - CMakeLists.txt: configure the 'ctest' target
    - - The size of maxpoints in qh_maxsimplex should be d+3 unique points to help avoid QH6154
    -
    - - Can countT be defined as 'int', 'unsigned int', or 64-bit int?
    -   countT is currently defined as 'int' in qset_r.h
    -   Vertex ID and ridge ID perhaps should be countT, They are currently 'unsigned'
    -   Check use of 'int' vs. countT in all cpp code
    -   Check use of 'int' vs. countT in all c code
    -   qset_r.h defines countT -- duplicates code in user_r.h -- need to add to qset.h/user.h
    -   countT -1 used as a flag in Coordinates.mid(), QhullFacet->id()
    -   Also QhullPoints indexOf and lastIndexOf
    -   Also QhullPointSet indexOf and lastIndexOf
    -   Coordinates.indexOf assumes countT is signed (from end)
    -   Coordinates.lastIndexOf assumes countT is signed (from end)
    -   All error messages with countT are wrong, convert to int?
    -   RboxPoints.qh_fprintf_rbox, etc. message 9393 assumes countT but may be int, va_arg(args, countT);  Need to split
    -
    -------------
    -To do for a furture version of the C++ interface
    - - Fix C++ memory leak in user_eg3 [M. Sandim]
    - - Document C++ using Doxygen conventions (//! and //!<)
    - - Should Qhull manage the output formats for doubles?  QH11010 user_r.h defines qh_REAL_1 as %6.8g
    - - Allocate memory for QhullSet using Qhull.qhmem.  Create default constructors for QhullVertexSet etc.  Also mid() etc.
    - - Add interior point for automatic translation?
    - - Add hasNext() to all next() iterators (e.g., QhullVertex)
    - - Add defineAs() to each object
    - - Write a program with concurrent Qhull
    - - Write QhullStat and QhullStat_test
    - - Add QList and vector instance of facetT*, etc.
    - - Generalize QhullPointSetIterator
    - - qh-code.htm: Document changes to C++ interface.
    -      Organize C++ documentation into collection classes, etc.
    - - Review all C++ classes and C++ tests
    - - QhullVertexSet uses QhullSetBase::referenceSetT() to free it's memory.   Probably needed elsewhere
    - - The Boost Graph Library provides C++ classes for graph data structures. It may help
    -   enhance Qhull's C++ interface [Dr. Dobb's 9/00 p. 29-38; OOPSLA '99 p. 399-414].
    -
    -[Jan 2010] Suggestions
    - - Generate vcproj from qtpro files
    -   cd qtpro && qmake -spec win32-msvc2005 -tp vc -recursive
    -   sed -i 's/C\:\/bash\/local\/qhull\/qtpro\///' qhull-all.sln
    -   Change qhullcpp to libqhull.dll
    -   Allow both builds on same host (keep /tmp separate)
    - - Make distribution -- remove tmp, news, .git, leftovers from project, change CRLF
    -     search for 2010.1, Dates
    -     qhulltest --all added to output
    -     Add md5sum
    -     Add test of user_eg3, etc.
    - - C++ class for access to statistics, accumulate vs. add
    - - Add dialog box to RoadError-- a virtual function?
    - - Option 'Gt' does not make visible all facets of the mesh example, rbox 32 M1,0,1 | qhull d Gt
    - - Option to select bounded Voronoi regions [A. Uzunovic]
    - - Merge small volume boundary cells into unbounded regions [Dominik Szczerba]
    - - Postmerge with merge options
    - - Add const to C code
    - - Add modify operators and MutablePointCoordinateIterator to PointCoordinates
    - - Add Qtest::toString() functions for QhullPoint and others.  QByteArray and qstrdup()
    - - Fix option Qt for conformant triangulations of merged facets
    - - Investigate flipped facet -- rbox 100 s D3 t1263080158 | qhull R1e-3 Tcv Qc
    - - Add doc comments to c++ code
    - - Measure performance of Qhull, seconds per point by dimension
    - - Report potential wraparound of 64-bit ints -- e.g., a large set or points
    -
    -Documentation
    -- Qhull::addPoint().  Problems with qh_findbestfacet and otherpoints see
    -   qh-code.htm#inc on-line construction with qh_addpoint()
    -- How to handle 64-bit possible loss of data.  WARN64, ptr_intT, size_t/int
    -- Show custom of qh_fprintf
    -- grep 'qh_mem ' x | sort | awk '{ print $2; }' | uniq -c | grep -vE ' (2|4|6|8|10|12|14|16|20|64|162)[^0-9]'
    -- qtpro/qhulltest contains .pro and Makefile.  Remove Makefiles by setting shadow directory to ../../tmp/projectname
    -- Rules for use of qh_qh and multi processes
    -    UsingQhull
    -    errorIfAnotherUser
    -    ~QhullPoints() needs ownership of qh_qh
    -    Does !qh_pointer work?
    -    When is qh_qh required?  Minimize the time.
    -   qhmem, qhstat.ferr
    -   qhull_inuse==1 when qhull globals active [not useful?]
    -   rbox_inuse==1 when rbox globals active
    -   - Multithreaded -- call largest dimension for infinityPoint() and origin()
    - - Better documentation for qhmem totshort, freesize, etc.
    - - how to change .h, .c, and .cpp to text/html.  OK in Opera
    - - QhullVertex.dimension() is not quite correct, epensive
    - - Check globalAngleEpsilon
    - - Deprecate save_qhull()
    -
    -[Dec 2003] Here is a partial list:
    - - fix finddelaunay() in user_eg.c for tricoplanar facets
    - - write a BGL, C++ interface to Qhull
    -     http://www.boost.org/libs/graph/doc/table_of_contents.html
    - - change qh_save_qhull to swap the qhT structure instead of using pointers
    - - change error handling and tracing to be independent of 'qh ferr'
    - - determine the maximum width for a given set of parameters
    - - prove that directed search locates all coplanar facets
    - - in high-d merging, can a loop of facets become disconnected?
    - - find a way to improve inner hulls in 5-d and higher
    - - determine the best policy for facet visibility ('Vn')
    - - determine the limitations of 'Qg'
    -
    -Precision improvements:
    - - For 'Qt', resolve cross-linked, butterfly ridges.
    -     May allow retriangulation in qh_addpoint().
    - - for Delaunay triangulations ('d' or 'v') under joggled input ('QJ'),
    -     remove vertical facets whose lowest vertex may be coplanar with convex hull
    - - review use of 'Qbb' with 'd QJ'.  Is MAXabs_coord better than MAXwidth?
    - - check Sugihara and Iri's better in-sphere test [Canadian
    -     Conf. on Comp. Geo., 1989; Univ. of Tokyo RMI 89-05]
    - - replace centrum with center of mass and facet area
    - - handle numeric overflow in qh_normalize and elsewhere
    - - merge flipped facets into non-flipped neighbors.
    -     currently they merge into best neighbor (appears ok)
    - - determine min norm for Cramer's rule (qh_sethyperplane_det).  It looks high.
    - - improve facet width for very narrow distributions
    -
    -New features:
    - - implement Matlab's tsearch() using Qhull
    - - compute volume of Voronoi regions.  You need to determine the dual face
    -   graph in all dimensions [see Clarkson's hull program]
    - - compute alpha shapes [see Clarkson's hull program]
    - - implement deletion of Delaunay vertices
    -      see Devillers, ACM Symposium on Computational Geometry, Minneapolis 1999.
    - - compute largest empty circle [see O'Rourke, chapter 5.5.3] [Hase]
    - - list redundant (i.e., coincident) vertices [Spitz]
    - - implement Mucke, et al, ['96] for point location in Delaunay triangulations
    - - implement convex hull of moving points
    - - implement constrained Delaunay diagrams
    -      see Shewchuk, ACM Symposium on Computational Geometry, Minneapolis 1998.
    - - estimate outer volume of hull
    - - automatically determine lower dimensional hulls
    - - allow "color" data for input points
    -      need to insert a coordinate for Delaunay triangulations
    -
    -Input/output improvements:
    - - Support the VTK Visualization Toolkit, http://www.kitware.com/vtk.html
    - - generate output data array for Qhull library [Gautier]
    - - need improved DOS window with screen fonts, scrollbar, cut/paste
    - - generate Geomview output for Voronoi ridges and unbounded rays
    - - generate Geomview output for halfspace intersection
    - - generate Geomview display of furthest-site Voronoi diagram
    - - use 'GDn' to view 5-d facets in 4-d
    - - convert Geomview output for other 3-d viewers
    - - add interactive output option to avoid recomputing a hull
    - - orient vertex neighbors for 'Fv' in 3-d and 2-d
    - - track total number of ridges for summary and logging
    -
    -Performance improvements:
    - - optimize Qhull for 2-d Delaunay triangulations
    - -   use O'Rourke's '94 vertex->duplicate_edge
    - -   add bucketing
    - -   better to specialize all of the code (ca. 2-3x faster w/o merging)
    - - use updated LU decomposition to speed up hyperplane construction
    - -        [Gill et al. 1974, Math. Comp. 28:505-35]
    - - construct hyperplanes from the corresponding horizon/visible facets
    - - for merging in high d, do not use vertex->neighbors
    -
    -
    - -

    Please let us know about your applications and improvements.

    - -
    - -

    Up: Home -page for Qhull
    -Up: Qhull manual: Table of -Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: Qhull code: Table of Contents
    -Dn: Qhull functions, macros, and data -structures - -


    - -

    The Geometry Center -Home Page

    - -

    Comments to: qhull@qhull.org -
    -Created: Sept. 25, 1995 --- Last modified: see changes.txt

    - - diff --git a/src/qhull/html/qh-eg.htm b/src/qhull/html/qh-eg.htm deleted file mode 100644 index a08f0d13f48..00000000000 --- a/src/qhull/html/qh-eg.htm +++ /dev/null @@ -1,693 +0,0 @@ - - - - -Examples of Qhull - - - - -

    Up: Home -page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: Qhull examples: Table of Contents (please wait -while loading)
    - -


    - -

    [halfspace] Examples of Qhull

    - -

    This section of the Qhull manual will introduce you to Qhull -and its options. Each example is a file for viewing with Geomview. You will need to -use a Unix computer with a copy of Geomview. -

    -If you are not running Unix, you can view pictures -for some of the examples. To understand Qhull without Geomview, try the -examples in Programs and -Programs/input. You can also try small -examples that you compute by hand. Use rbox -to generate examples. -

    -To generate the Geomview examples, execute the shell script eg/q_eg. -It uses rbox. The shell script eg/q_egtest generates -test examples, and eg/q_test exercises the code. If you -find yourself viewing the inside of a 3-d example, use Geomview's -normalization option on the 'obscure' menu.

    - -

    Copyright © 1995-2015 C.B. Barber

    - -
    - -

    »Qhull examples: Table of -Contents

    - - - -
    - - -
    - -

    »2-d and 3-d examples

    - -

    »rbox c D3 | qconvex G ->eg.01.cube

    - -

    The first example is a cube in 3-d. The color of each facet -indicates its normal. For example, normal [0,0,1] along the Z -axis is (r=0.5, g=0.5, b=1.0). With the 'Dn' option in rbox, -you can generate hypercubes in any dimension. Above 7-d the -number of intermediate facets grows rapidly. Use 'TFn' to track qconvex's progress. Note -that each facet is a square that qconvex merged from coplanar -triangles.

    - -

    »rbox c d G3.0 | qconvex G ->eg.02.diamond.cube

    - -

    The second example is a cube plus a diamond ('d') scaled by rbox's -'G' option. In higher dimensions, diamonds are much simpler than -hypercubes.

    - -

    »rbox s 100 D3 | qconvex G ->eg.03.sphere

    - -

    The rbox s option generates random points and -projects them to the d-sphere. All points should be on the convex -hull. Notice that random points look more clustered than you -might expect. You can get a smoother distribution by merging -facets and printing the vertices, e.g., rbox 1000 s | qconvex -A-0.95 p | qconvex G >eg.99.

    - -

    »rbox s 100 D2 | qconvex G ->eg.04.circle

    - -

    In 2-d, there are many ways to generate a convex hull. One of -the earliest algorithms, and one of the fastest, is the 2-d -Quickhull algorithm [c.f., Preparata & Shamos '85]. It was the model for -Qhull.

    - -

    »rbox 10 l | qconvex G ->eg.05.spiral

    - -

    One rotation of a spiral.

    - -

    »rbox 1000 D2 | qconvex C-0.03 -Qc Gapcv >eg.06.merge.square

    - -

    This demonstrates how Qhull handles precision errors. Option 'C-0.03' requires a clearly convex angle -between adjacent facets. Otherwise, Qhull merges the facets.

    - -

    This is the convex hull of random points in a square. The -facets have thickness because they must be outside all points and -must include their vertices. The colored lines represent the -original points and the spheres represent the vertices. Floating -in the middle of each facet is the centrum. Each centrum is at -least 0.03 below the planes of its neighbors. This guarantees -that the facets are convex.

    - -

    »rbox 1000 D3 | qconvex G ->eg.07.box

    - -

    Here's the same distribution but in 3-d with Qhull handling -machine roundoff errors. Note the large number of facets.

    - -

    »rbox c G0.4 s 500 | qconvex G ->eg.08a.cube.sphere

    - -

    The sphere is just barely poking out of the cube. Try the same -distribution with randomization turned on ('Qr'). This turns Qhull into a -randomized incremental algorithm. To compare Qhull and -randomization, look at the number of hyperplanes created and the -number of points partitioned. Don't compare CPU times since Qhull's -implementation of randomization is inefficient. The number of -hyperplanes and partitionings indicate the dominant costs for -Qhull. With randomization, you'll notice that the number of -facets created is larger than before. This is especially true as -you increase the number of points. It is because the randomized -algorithm builds most of the sphere before it adds the cube's -vertices.

    - -

    »rbox d G0.6 s 500 | qconvex G ->eg.08b.diamond.sphere

    - -

    This is a combination of the diamond distribution and the -sphere.

    - -

    »rbox 100 L3 G0.5 s | qconvex -G >eg.09.lens

    - -

    Each half of the lens distribution lies on a sphere of radius -three. A directed search for the furthest facet below a point -(e.g., qh_findbest in geom.c) may fail if started from -an arbitrary facet. For example, if the first facet is on the -opposite side of the lens, a directed search will report that the -point is inside the convex hull even though it is outside. This -problem occurs whenever the curvature of the convex hull is less -than a sphere centered at the test point.

    - -

    To prevent this problem, Qhull does not use directed search -all the time. When Qhull processes a point on the edge of the -lens, it partitions the remaining points with an exhaustive -search instead of a directed search (see qh_findbestnew in geom2.c). -

    - -

    »How Qhull adds a point

    - -

    »rbox 100 s P0.5,0.5,0.5 | -qconvex Ga QG0 >eg.10a.sphere.visible

    - -

    The next 4 examples show how Qhull adds a point. The point -[0.5,0.5,0.5] is at one corner of the bounding box. Qhull adds a -point using the beneath-beyond algorithm. First Qhull finds all -of the facets that are visible from the point. Qhull will replace -these facets with new facets.

    - -

    »rbox 100 s -P0.5,0.5,0.5|qconvex Ga QG-0 >eg.10b.sphere.beyond

    - -

    These are the facets that are not visible from the point. -Qhull will keep these facets.

    - -

    »rbox 100 s P0.5,0.5,0.5 | -qconvex PG Ga QG0 >eg.10c.sphere.horizon

    - -

    These facets are the horizon facets; they border the visible -facets. The inside edges are the horizon ridges. Each horizon -ridge will form the base for a new facet.

    - -

    »rbox 100 s P0.5,0.5,0.5 | -qconvex Ga QV0 PgG >eg.10d.sphere.cone

    - -

    This is the cone of points from the new point to the horizon -facets. Try combining this image with eg.10c.sphere.horizon -and eg.10a.sphere.visible. -

    - -

    »rbox 100 s P0.5,0.5,0.5 | -qconvex Ga >eg.10e.sphere.new

    - -

    This is the convex hull after [0.5,0.5,0.5] has been added. -Note that in actual practice, the above sequence would never -happen. Unlike the randomized algorithms, Qhull always processes -a point that is furthest in an outside set. A point like -[0.5,0.5,0.5] would be one of the first points processed.

    - -

    »rbox 100 s P0.5,0.5,0.5 | -qhull Ga QV0g Q0 >eg.14.sphere.corner

    - -

    The 'QVn', 'QGn ' and 'Pdk' -options define good facets for Qhull. In this case 'QV0' defines the 0'th point -[0.5,0.5,0.5] as the good vertex, and 'Qg' -tells Qhull to only build facets that might be part of a good -facet. This technique reduces output size in low dimensions. It -does not work with facet merging.

    - -

    »Triangulated output or joggled input

    - -

    »rbox 500 W0 | qconvex QR0 Qc Gvp >eg.15a.surface

    - -

    This is the convex hull of 500 points on the surface of -a cube. Note the large, non-simplicial facet for each face. -Qhull merges non-convex facets. - -

    If the facets were not merged, Qhull -would report precision problems. For example, turn off facet merging -with option 'Q0'. Qhull may report concave -facets, flipped facets, or other precision errors: -

    -rbox 500 W0 | qhull QR0 Q0 -
    - -

    -

    »rbox 500 W0 | qconvex QR0 Qt Qc Gvp >eg.15b.triangle

    - -

    Like the previous examples, this is the convex hull of 500 points on the -surface of a cube. Option 'Qt' triangulates the -non-simplicial facets. Triangulated output is -particularly helpful for Delaunay triangulations. - -

    -

    »rbox 500 W0 | qconvex QR0 QJ5e-2 Qc Gvp >eg.15c.joggle

    - -

    This is the convex hull of 500 joggled points on the surface of -a cube. The option 'QJ5e-2' -sets a very large joggle to make the effect visible. Notice -that all of the facets are triangles. If you rotate the cube, -you'll see red-yellow lines for coplanar points. -

    -With option 'QJ', Qhull joggles the -input to avoid precision problems. It adds a small random number -to each input coordinate. If a precision -error occurs, it increases the joggle and tries again. It repeats -this process until no precision problems occur. -

    -Joggled input is a simple solution to precision problems in -computational geometry. Qhull can also merge facets to handle -precision problems. See Merged facets or joggled input. - -

    »Delaunay and Voronoi diagrams

    - -

    »qdelaunay Qt -<eg.data.17 GnraD2 >eg.17a.delaunay.2

    - -

    -The input file, eg.data.17, consists of a square, 15 random -points within the outside half of the square, and 6 co-circular -points centered on the square. - -

    The Delaunay triangulation is the triangulation with empty -circumcircles. The input for this example is unusual because it -includes six co-circular points. Every triangular subset of these -points has the same circumcircle. Option 'Qt' -triangulates the co-circular facet.

    - -

    »qdelaunay <eg.data.17 -GnraD2 >eg.17b.delaunay.2i

    - -

    This is the same example without triangulated output ('Qt'). qdelaunay -merges the non-unique Delaunay triangles into a hexagon.

    - -

    »qdelaunay <eg.data.17 -Ga >eg.17c.delaunay.2-3

    - -

    This is how Qhull generated both diagrams. Use Geomview's -'obscure' menu to turn off normalization, and Geomview's -'cameras' menu to turn off perspective. Then load this object -with one of the previous diagrams.

    - -

    The points are lifted to a paraboloid by summing the squares -of each coordinate. These are the light blue points. Then the -convex hull is taken. That's what you see here. If you look up -the Z-axis, you'll see that points and edges coincide.

    - -

    »qvoronoi QJ -<eg.data.17 Gna >eg.17d.voronoi.2

    - -

    The Voronoi diagram is the dual of the Delaunay triangulation. -Here you see the original sites and the Voronoi vertices. -Notice the each -vertex is equidistant from three sites. The edges indicate the -Voronoi region for a site. Qhull does not draw the unbounded -edges. Instead, it draws extra edges to close the unbounded -Voronoi regions. You may find it helpful to enclose the input -points in a square. You can compute the unbounded -rays from option 'Fo'. -

    - -

    Instead -of triangulated output ('Qt'), this -example uses joggled input ('QJ'). -Normally, you should use neither 'QJ' nor 'Qt' for Voronoi diagrams. - -

    »qvoronoi <eg.data.17 -Gna >eg.17e.voronoi.2i

    - -

    This looks the same as the previous diagrams, but take a look -at the data. Run 'qvoronoi p <eg/eg.data.17'. This prints -the Voronoi vertices. - -

    With 'QJ', there are four nearly identical Voronoi vertices -within 10^-11 of the origin. Option 'QJ' joggled the input. After the joggle, -the cocircular -input sites are no longer cocircular. The corresponding Voronoi vertices are -similar but not identical. - -

    This example does not use options 'Qt' or 'QJ'. The cocircular -input sites define one Voronoi vertex near the origin.

    - -

    Option 'Qt' would triangulate the corresponding Delaunay region into -four triangles. Each triangle is assigned the same Voronoi vertex.

    - -

    » rbox c G0.1 d | -qdelaunay Gt Qz <eg.17f.delaunay.3

    - -

    This is the 3-d Delaunay triangulation of a small cube inside -a prism. Since the outside ridges are transparent, it shows the -interior of the outermost facets. If you slice open the -triangulation with Geomview's ginsu, you will see that the innermost -facet is a cube. Note the use of 'Qz' -to add a point "at infinity". This avoids a degenerate -input due to cospherical points.

    - -

    »rbox 10 D2 d | qdelaunay -Qu G >eg.18a.furthest.2-3

    - -

    The furthest-site Voronoi diagram contains Voronoi regions for -points that are furthest from an input site. It is the -dual of the furthest-site Delaunay triangulation. You can -determine the furthest-site Delaunay triangulation from the -convex hull of the lifted points (eg.17c.delaunay.2-3). -The upper convex hull (blue) generates the furthest-site Delaunay -triangulation.

    - -

    »rbox 10 D2 d | qdelaunay -Qu Pd2 G >eg.18b.furthest-up.2-3

    - -

    This is the upper convex hull of the preceding example. The -furthest-site Delaunay triangulation is the projection of the -upper convex hull back to the input points. The furthest-site -Voronoi vertices are the circumcenters of the furthest-site -Delaunay triangles.

    - -

    »rbox 10 D2 d | qvoronoi -Qu Gv >eg.18c.furthest.2

    - -

    This shows an incomplete furthest-site Voronoi diagram. It -only shows regions with more than two vertices. The regions are -artificially truncated. The actual regions are unbounded. You can -print the regions' vertices with 'qvoronoi Qu o'.

    - -

    Use Geomview's 'obscure' menu to turn off normalization, and -Geomview's 'cameras' menu to turn off perspective. Then load this -with the upper convex hull.

    - -

    »rbox 10 D3 | qvoronoi QV5 -p | qconvex G >eg.19.voronoi.region.3

    - -

    This shows the Voronoi region for input site 5 of a 3-d -Voronoi diagram.

    - -

    »Facet merging for imprecision

    - -

    »rbox r s 20 Z1 G0.2 | -qconvex G >eg.20.cone

    - -

    There are two things unusual about this cone. -One is the large flat disk at one end and the other is the -rectangles about the middle. That's how the points were -generated, and if those points were exact, this is the correct -hull. But rbox used floating point arithmetic to -generate the data. So the precise convex hull should have been -triangles instead of rectangles. By requiring convexity, Qhull -has recovered the original design.

    - -

    »rbox 200 s | qhull Q0 -R0.01 Gav Po >eg.21a.roundoff.errors

    - -

    This is the convex hull of 200 cospherical points with -precision errors ignored ('Q0'). To -demonstrate the effect of roundoff error, we've added a random -perturbation ('R0.01') to every -distance and hyperplane calculation. Qhull, like all other convex -hull algorithms with floating point arithmetic, makes -inconsistent decisions and generates wildly wrong results. In -this case, one or more facets are flipped over. These facets have -the wrong color. You can also turn on 'normals' in Geomview's -appearances menu and turn off 'facing normals'. There should be -some white lines pointing in the wrong direction. These -correspond to flipped facets.

    - -

    Different machines may not produce this picture. If your -machine generated a long error message, decrease the number of -points or the random perturbation ('R0.01'). -If it did not report flipped facets, increase the number of -points or perturbation.

    - -

    »rbox 200 s | qconvex Qc -R0.01 Gpav >eg.21b.roundoff.fixed

    - -

    Qhull handles the random perturbations and returns an -imprecise sphere. -In this case, the output is a weak approximation to the points. -This is because a random perturbation of 'R0.01 ' is equivalent to losing all but -1.8 digits of precision. The outer planes float above the points -because Qhull needs to allow for the maximum roundoff error.

    -

    -If you start with a smaller random perturbation, you -can use joggle ('QJn') to avoid -precision problems. You need to set n significantly -larger than the random perturbation. For example, try -'rbox 200 s | qconvex Qc R1e-4 QJ1e-1'. - -

    »rbox 1000 s| qconvex C0.01 -Qc Gcrp >eg.22a.merge.sphere.01

    - -

    »rbox 1000 s| qconvex -C-0.01 Qc Gcrp >eg.22b.merge.sphere.-01

    - -

    »rbox 1000 s| qconvex C0.05 -Qc Gcrpv >eg.22c.merge.sphere.05

    - -

    »rbox 1000 s| qconvex -C-0.05 Qc Gcrpv >eg.22d.merge.sphere.-05

    - -

    The next four examples compare post-merging and pre-merging ('Cn' vs. 'C-n'). -Qhull uses '-' as a flag to indicate pre-merging.

    - -

    Post-merging happens after the convex hull is built. During -post-merging, Qhull repeatedly merges an independent set of -non-convex facets. For a given set of parameters, the result is -about as good as one can hope for.

    - -

    Pre-merging does the same thing as post-merging, except that -it happens after adding each point to the convex hull. With -pre-merging, Qhull guarantees a convex hull, but the facets are -wider than those from post-merging. If a pre-merge option is not -specified, Qhull handles machine round-off errors.

    - -

    You may see coplanar points appearing slightly outside -the facets of the last example. This is becomes Geomview moves -line segments forward toward the viewer. You can avoid the -effect by setting 'lines closer' to '0' in Geomview's camera menu. - -

    »rbox 1000 | qconvex s -Gcprvah C0.1 Qc >eg.23.merge.cube

    - -

    Here's the 3-d imprecise cube with all of the Geomview -options. There's spheres for the vertices, radii for the coplanar -points, dots for the interior points, hyperplane intersections, -centrums, and inner and outer planes. The radii are shorter than -the spheres because this uses post-merging ('C0.1') -instead of pre-merging. - -

    »4-d objects

    - -

    With Qhull and Geomview you can develop an intuitive sense of -4-d surfaces. When you get into trouble, think of viewing the -surface of a 3-d sphere in a 2-d plane.

    - -

    »rbox 5000 D4 | qconvex s GD0v -Pd0:0.5 C-0.02 C0.1 >eg.24.merge.cube.4d-in-3d

    - -

    Here's one facet of the imprecise cube in 4-d. It's projected -into 3-d (the 'GDn' option drops -dimension n). Each ridge consists of two triangles between this -facet and the neighboring facet. In this case, Geomview displays -the topological ridges, i.e., as triangles between three -vertices. That is why the cube looks lopsided.

    - -

    »rbox 5000 D4 | qconvex s -C-0.02 C0.1 Gh >eg.30.4d.merge.cube

    - -

    Here -is the equivalent in 4-d of the imprecise square -and imprecise cube. It's the imprecise convex -hull of 5000 random points in a hypercube. It's a full 4-d object -so Geomview's ginsu does not work. If you view it in -Geomview, you'll be inside the hypercube. To view 4-d objects -directly, either load the 4dview module or the ndview -module. For 4dview, you must have started Geomview -in the same directory as the object. For ndview, -initialize a set of windows with the prefab menu, and load the -object through Geomview. The 4dview module includes an -option for slicing along any hyperplane. If you do this in the x, -y, or z plane, you'll see the inside of a hypercube.

    - -

    The 'Gh' option prints the -geometric intersections between adjacent facets. Note the strong -convexity constraint for post-merging ('C0.1'). -It deletes the small facets.

    - -

    »rbox 20 D3 | qdelaunay G ->eg.31.4d.delaunay

    - -

    The Delaunay triangulation of 3-d sites corresponds to a 4-d -convex hull. You can't see 4-d directly but each facet is a 3-d -object that you can project to 3-d. This is exactly the same as -projecting a 2-d facet of a soccer ball onto a plane.

    - -

    Here we see all of the facets together. You can use Geomview's -ndview to look at the object from several directions. -Try turning on edges in the appearance menu. You'll notice that -some edges seem to disappear. That's because the object is -actually two sets of overlapping facets.

    - -

    You can slice the object apart using Geomview's 4dview. -With 4dview, try slicing along the w axis to get a -single set of facets and then slice along the x axis to look -inside. Another interesting picture is to slice away the equator -in the w dimension.

    - -

    »rbox 30 s D4 | qconvex s G -Pd0d1d2D3

    - -

    This is the positive octant of the convex hull of 30 4-d -points. When looking at 4-d, it's easier to look at just a few -facets at once. If you picked a facet that was directly above -you, then that facet looks exactly the same in 3-d as it looks in -4-d. If you pick several facets, then you need to imagine that -the space of a facet is rotated relative to its neighbors. Try -Geomview's ndview on this example.

    - -

    »Halfspace intersections

    - -

    »rbox 10 r s Z1 G0.3 | -qconvex G >eg.33a.cone

    - -

    »rbox 10 r s Z1 G0.3 | -qconvex FV n | qhalf G >eg.33b.cone.dual

    - -

    »rbox 10 r s Z1 G0.3 | -qconvex FV n | qhalf Fp | qconvex G >eg.33c.cone.halfspace

    - -

    These examples illustrate halfspace intersection. The first -picture is the convex hull of two 20-gons plus an apex. The -second picture is the dual of the first. Try loading both -at once. Each vertex of the second picture corresponds to a facet -or halfspace of the first. The vertices with four edges -correspond to a facet with four neighbors. Similarly the facets -correspond to vertices. A facet's normal coefficients divided by -its negative offset is the vertice's coordinates. The coordinates -are the intersection of the original halfspaces.

    - -

    The third picture shows how Qhull can go back and forth -between equivalent representations. It starts with a cone, -generates the halfspaces that define each facet of the cone, and -then intersects these halfspaces. Except for roundoff error, the -third picture is a duplicate of the first.

    - -
    - -

    Up: Home -page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: Qhull examples: Table of Contents (please wait -while loading)
    - -


    - -

    The Geometry Center -Home Page

    - -

    Comments to: qhull@qhull.org -
    -Created: Sept. 25, 1995 --- Last modified: see top

    - - diff --git a/src/qhull/html/qh-faq.htm b/src/qhull/html/qh-faq.htm deleted file mode 100644 index feda544a759..00000000000 --- a/src/qhull/html/qh-faq.htm +++ /dev/null @@ -1,1547 +0,0 @@ - - - - - - -Qhull FAQ - - - - - -

    Up: Home page for Qhull -(http://www.qhull.org)
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: FAQ: Table of Contents (please -wait while loading)
    - -


    - -

    [4-d cube] Frequently Asked Questions about Qhull

    -

    If your question does not appear here, see:

    - - - -

    Qhull is a general dimension code for computing convex hulls, -Delaunay triangulations, halfspace intersections about a point, -Voronoi diagrams, furthest-site Delaunay triangulations, and -furthest-site Voronoi diagrams. These structures have -applications in science, engineering, statistics, and -mathematics. For a detailed introduction, see O'Rourke ['94], Computational Geometry in C. -

    - -

    There are separate programs for each application of -Qhull. These programs disable experimental and inappropriate -options. If you prefer, you may use Qhull directly. All programs -run the same code. - -

    Version 3.1 added triangulated output ('Qt'). -It should be used for Delaunay triangulations instead of -using joggled input ('QJ'). - -

    Brad Barber, Arlington MA, -2010/01/09

    - -

    Copyright © 1998-2015 C.B. Barber

    - -
    - -

    »FAQ: Table of Contents

    - -

    Within each category, the most recently asked questions are -first. -

      -
    • Startup questions
        -
      • How do I run Qhull from Windows? -
      • How do I enter points for Qhull? -
      • How do I learn to use Qhull?
      • -
      -
    • Convex hull questions
        -
      • How do I report just the area and volume of a - convex hull? -
      • Why are there extra points in a 4-d or higher - convex hull? -
      • How do I report duplicate - vertices?
      • -
      -
    • Delaunay triangulation questions
        -
      • How do I get rid of nearly flat Delaunay - triangles? -
      • How do I find the Delaunay triangle or Voronoi - region that is closest to a point? - -
      • How do I compute the Delaunay triangulation of a - non-convex object? - -
      • How do I mesh a volume from a set of triangulated - surface points? - -
      • Can Qhull produce a triangular mesh for an - object? - -
      • For 3-d Delaunay triangulations, how do I - report the triangles of each tetrahedron? - -
      • How do I construct a 3-d Delaunay triangulation? -
      • How do I get the triangles for a 2-d Delaunay - triangulation and the vertices of its Voronoi diagram? -
      • Can Qhull triangulate a - hundred 16-d points?
      • -
      - -
    • Voronoi diagram questions
        -
      • See also "Delaunay diagram questions". Qhull computes the Voronoi diagram from the Delaunay triagulation. -
      • How do I compute the volume of a Voronoi region? -
      • How do I get the radii of the empty - spheres for each Voronoi vertex? - -
      • What is the Voronoi diagram of a square? - -
      • How do I construct the Voronoi diagram of - cospherical points? -
      • Can Qhull compute the unbounded rays of the - Voronoi diagram? -
      -
    • Approximation questions
        -
      • How do I approximate data - with a simplex?
      • -
      -
    • Halfspace questions
        -
      • How do I compute the - intersection of halfspaces with Qhull?
      • -
      -
    • Qhull library questions
        -
      • Is Qhull available for Mathematica, Matlab, or - Maple? - -
      • Why are there too few ridges? -
      • Can Qhull use coordinates without placing them in - a data file? -
      • How large are Qhull's data structures? -
      • Can Qhull construct convex hulls and Delaunay - triangulations one point at a time? -
      • How do I visit the ridges of a Delaunay - triangulation? -
      • How do I visit the Delaunay facets? -
      • When is a point outside or inside a facet? -
      • How do I find the facet that is closest to a - point? -
      • How do I find the Delaunay triangle or Voronoi - region that is closest to a point? -
      • How do I list the vertices? -
      • How do I test code that uses the Qhull library? -
      • When I compute a plane - equation from a facet, I sometimes get an - outward-pointing normal and sometimes an - inward-pointing normal
      • -
      -
    • -
    - -
    - -

    »Startup questions

    - -

    »How do I run Qhull -from Windows?

    - -

    Qhull is a console program. You will first need a command window -(i.e., a "command prompt"). You can double click on -'eg\Qhull-go.bat'.

    - -
      -
    • Type 'qconvex', 'qdelaunay', 'qhalf', 'qvoronoi, - 'qhull', and 'rbox' for a synopsis of each program. - -
    • Type 'rbox c D2 | qconvex s i' to compute the - convex hull of a square. - -
    • Type 'rbox c D2 | qconvex s i TO results.txt' to - write the results to the file 'results.txt'. A summary is still printed on - the the console. - -
    • Type 'rbox c D2' to see the input format for - qconvex. - -
    • Type 'qconvex < data.txt s i TO results.txt' to - read input data from 'data.txt'. - -
    • If you want to enter data by hand, type 'qconvex s i TO - results.txt' to read input data from the console. Type in - the numbers and end with a ctrl-D.
    • -
    - -

    »How do I enter -points for Qhull?

    - -

    Qhull takes its data from standard input. For example, create -a file named 'data.txt' with the following contents:

    - -
    -
    -2  #sample 2-d input
    -5  #number of points
    -1 2  #coordinates of points
    --1.1 3
    -3 2.2
    -4 5
    --10 -10
    -
    -
    - -

    Then call qconvex with 'qconvex < data.txt'. It will print a -summary of the convex hull. Use 'qconvex < data.txt o' to print -the vertices and edges. See also input -format.

    - -

    You can generate sample data with rbox, e.g., 'rbox 10' -generates 10 random points in 3-d. Use a pipe ('|') to run rbox -and qhull together, e.g.,

    - -
    -

    rbox c | qconvex o

    -
    - -

    computes the convex hull of a cube.

    - -

    »How do I learn to -use Qhull?

    - -

    First read:

    - - - -

    Look at Qhull's on-line documentation:

    - -
      -
    • 'qconvex' gives a synopsis of qconvex and its options - -
    • 'rbox' lists all of the options for generating point - sets -
    • 'qconvex - | more' lists the options for qconvex -
    • 'qconvex .' gives a concise list of options -
    • 'qdelaunay', 'qhalf', 'qvoronoi', and 'qhull' also have a synopsis and option list
    • -
    - -

    Then try out the Qhull programs on small examples.

    - -
      -
    • 'rbox c' lists the vertices of a cube -
    • 'rbox c | qconvex' is the convex hull of a cube -
    • 'rbox c | qconvex o' lists the vertices and facets of - a cube -
    • 'rbox c | qconvex Qt o' triangulates the cube -
    • 'rbox c | qconvex QJ o' joggles the input and - triangulates the cube -
    • 'rbox c D2 | qconvex' generates the convex hull of a - square -
    • 'rbox c D4 | qconvex' generates the convex hull of a - hypercube -
    • 'rbox 6 s D2 | qconvex p Fx' lists 6 random points in - a circle and lists the vertices of their convex hull in order -
    • 'rbox c D2 c G2 | qdelaunay' computes the Delaunay - triangulation of two embedded squares. It merges the cospherical facets. -
    • 'rbox c D2 c G2 | qdelaunay Qt' computes the Delaunay - triangulation of two embedded squares. It triangulates the cospherical facets. -
    • 'rbox c D2 c G2 | qvoronoi o' computes the - corresponding Voronoi vertices and regions. -
    • 'rbox c D2 c G2 | qvoronio Fv' shows the Voronoi diagram - for the previous example. Each line is one edge of the - diagram. The first number is 4, the next two numbers list - a pair of input sites, and the last two numbers list the - corresponding pair of Voronoi vertices.
    • -
    - -

    Install Geomview -if you are running SGI Irix, Solaris, SunOS, Linux, HP, IBM -RS/6000, DEC Alpha, or Next. You can then visualize the output of -Qhull. Qhull comes with Geomview examples. -

    - -

    Then try Qhull with a small example of your application. Work -out the results by hand. Then experiment with Qhull's options to -find the ones that you need.

    - -

    You will need to decide how Qhull should handle precision -problems. It can triangulate the output ('Qt'), joggle the input ('QJ'), or merge facets (the default).

    - -
      -
    • With joggle, Qhull produces simplicial (i.e., - triangular) output by joggling the input. After joggle, - no points are cocircular or cospherical. -
    • With facet merging, Qhull produces a better - approximation and does not modify the input. -
    • With triangulated output, Qhull merges facets and triangulates - the result.
    • -
    • See Merged facets or joggled input.
    • -
    - -
    -

    »Convex hull questions

    - -

    »How do I report just the area - and volume of a convex hull?

    - -Use option 'FS'. For example, - -
    -C:\qhull>rbox 10 | qconvex FS
    -0
    -2 2.192915621644613 0.2027867899638665
    -
    -C:\qhull>rbox 10 | qconvex FA
    -
    -Convex hull of 10 points in 3-d:
    -
    -  Number of vertices: 10
    -  Number of facets: 16
    -
    -Statistics for: RBOX 10 | QCONVEX FA
    -
    -  Number of points processed: 10
    -  Number of hyperplanes created: 28
    -  Number of distance tests for qhull: 44
    -  CPU seconds to compute hull (after input):  0
    -  Total facet area:   2.1929156
    -  Total volume:       0.20278679
    -
    - -

    »Why are there extra -points in a 4-d or higher convex hull?

    - -

    You may see extra points if you use options 'i' or 'Ft' - without using triangulated output ('Qt'). -The extra points occur when a facet is non-simplicial (i.e., a -facet with more than d vertices). For example, Qhull -reports the following for one facet of the convex hull of a hypercube. -Option 'Pd0:0.5' returns the facet along the positive-x axis:

    - -
    -
    -rbox c D4 | qconvex i Pd0:0.5
    -12
    -17 13 14 15
    -17 13 12 14
    -17 11 13 15
    -17 14 11 15
    -17 10 11 14
    -17 14 12 8
    -17 12 13 8
    -17 10 14 8
    -17 11 10 8
    -17 13 9 8
    -17 9 11 8
    -17 11 9 13
    -
    -
    - -

    The 4-d hypercube has 16 vertices; so point "17" was -added by qconvex. Qhull adds the point in order to report a -simplicial decomposition of the facet. The point corresponds to -the "centrum" which Qhull computes to test for -convexity.

    - -

    Triangulate the output ('Qt') to avoid the extra points. -Since the hypercube is 4-d, each simplicial facet is a tetrahedron. -

    -
    -C:\qhull3.1>rbox c D4 | qconvex i Pd0:0.5 Qt
    -9
    -9 13 14 15
    -12 9 13 14
    -9 11 13 15
    -11 9 14 15
    -9 10 11 14
    -12 9 14 8
    -9 12 13 8
    -9 10 14 8
    -10 9 11 8
    -
    -
    - -

    Use the 'Fv' option to print the -vertices of simplicial and non-simplicial facets. For example, -here is the same hypercube facet with option 'Fv' instead of 'i': -

    - -
    -
    -C:\qhull>rbox c D4 | qconvex Pd0:0.5 Fv
    -1
    -8 9 10 12 11 13 14 15 8
    -
    -
    - -

    The coordinates of the extra point are printed with the 'Ft' option.

    - -
    -
    -rbox c D4 | qconvex Pd0:0.5 Ft
    -4
    -17 12 3
    -  -0.5   -0.5   -0.5   -0.5
    -  -0.5   -0.5   -0.5    0.5
    -  -0.5   -0.5    0.5   -0.5
    -  -0.5   -0.5    0.5    0.5
    -  -0.5    0.5   -0.5   -0.5
    -  -0.5    0.5   -0.5    0.5
    -  -0.5    0.5    0.5   -0.5
    -  -0.5    0.5    0.5    0.5
    -   0.5   -0.5   -0.5   -0.5
    -   0.5   -0.5   -0.5    0.5
    -   0.5   -0.5    0.5   -0.5
    -   0.5   -0.5    0.5    0.5
    -   0.5    0.5   -0.5   -0.5
    -   0.5    0.5   -0.5    0.5
    -   0.5    0.5    0.5   -0.5
    -   0.5    0.5    0.5    0.5
    -   0.5      0      0      0
    -4 16 13 14 15
    -4 16 13 12 14
    -4 16 11 13 15
    -4 16 14 11 15
    -4 16 10 11 14
    -4 16 14 12 8
    -4 16 12 13 8
    -4 16 10 14 8
    -4 16 11 10 8
    -4 16 13 9 8
    -4 16 9 11 8
    -4 16 11 9 13
    -
    -
    - -

    »How do I report -duplicate vertices?

    - -

    There's no direct way. You can use option -'FP' to -report the distance to the nearest vertex for coplanar input -points. Select the minimum distance for a duplicated vertex, and -locate all input sites less than this distance.

    - -

    For Delaunay triangulations, all coplanar points are nearly -incident to a vertex. If you want a report of coincident input -sites, do not use option 'QJ'. By -adding a small random quantity to each input coordinate, it -prevents coincident input sites.

    - -
    -

    »Delaunay triangulation questions

    - -

    »How do I get rid of -nearly flat Delaunay triangles?

    - -

    Nearly flat triangles occur when boundary points are nearly -collinear or coplanar. They also occur for nearly coincident -points. Both events can easily occur when using joggle. For example -(rbox 10 W0 D2 | qdelaunay QJ Fa) lists the areas of the Delaunay -triangles of 10 points on the boundary of a square. Some of -these triangles are nearly flat. This occurs when one point -is joggled inside of two other points. In this case, nearly flat -triangles do not occur with triangulated output (rbox 10 W0 D2 | qdelaunay Qt Fa). - - -

    Another example, (rbox c P0 P0 D2 | qdelaunay QJ Fa), computes the -areas of the Delaunay triangles for the unit square and two -instances of the origin. Four of the triangles have an area -of 0.25 while two have an area of 2.0e-11. The later are due to -the duplicated origin. With triangulated output (rbox c P0 P0 D2 | qdelaunay Qt Fa) -there are four triangles of equal area. - -

    Nearly flat triangles also occur without using joggle. For -example, (rbox c P0 P0,0.4999999999 | qdelaunay Fa), computes -the areas of the Delaunay triangles for the unit square, -a nearly collinear point, and the origin. One triangle has an -area of 3.3e-11. - -

    Unfortunately, none of Qhull's merging options remove nearly -flat Delaunay triangles due to nearly collinear or coplanar boundary -points. -The merging options concern the empty circumsphere -property of Delaunay triangles. This is independent of the area of -the Delaunay triangles. Qhull does handle nearly coincident points. - -

    If you are calling Qhull from a program, you can merge slivers into an adjacent facet. -In d dimensions with simplicial facets (e.g., from 'Qt'), each facet has -d+1 neighbors. Each neighbor shares d vertices of the facet's d+1 vertices. Let the -other vertex be the opposite vertex. For each neighboring facet, if its circumsphere -includes the opposite.vertex, the two facets can be merged. [M. Treacy] - -

    You can handle collinear or coplanar boundary points by -enclosing the points in a box. For example, -(rbox c P0 P0,0.4999999999 c G1 | qdelaunay Fa), surrounds the -previous points with [(1,1), (1,-1), (-1,-1), (-1, 1)]. -Its Delaunay triangulation does not include a -nearly flat triangle. The box also simplifies the graphical -output from Qhull. - -

    Without joggle, Qhull lists coincident points as "coplanar" -points. For example, (rbox c P0 P0 D2 | qdelaunay Fa), ignores -the duplicated origin and lists four triangles of size 0.25. -Use 'Fc' to list the coincident points (e.g., -rbox c P0 P0 D2 | qdelaunay Fc). - -

    There is no easy way to determine coincident points with joggle. -Joggle removes all coincident, cocircular, and cospherical points -before running Qhull. Instead use facet merging (the default) -or triangulated output ('Qt'). - -

    »How do I compute -the Delaunay triangulation of a non-convex object?

    - -

    A similar question is -"How do I mesh a volume from a set of triangulated surface points?" - -

    This is an instance of the constrained Delaunay Triangulation -problem. Qhull does not handle constraints. The boundary of the -Delaunay triangulation is always convex. But if the input set -contains enough points, the triangulation will include the -boundary. The number of points needed depends on the input. - -

    Shewchuk has developed a theory of constrained Delaunay triangulations. -See his -paper at the -1998 Computational Geometry Conference. Using these ideas, constraints -could be added to Qhull. They would have many applications. - -

    There is a large literature on mesh generation and many commercial -offerings. For pointers see -Owen's International Meshing Roundtable -and Schneiders' -Finite Element Mesh Generation page.

    - -

    »Can Qhull -produce a triangular mesh for an object?

    - -

    Yes for convex objects, no for non-convex objects. For -non-convex objects, it triangulates the concavities. Unless the -object has many points on its surface, triangles may cross the -surface.

    - -

    »For 3-d Delaunay -triangulations, how do I report the triangles of each -tetrahedron?

    - -

    For points in general position, a 3-d Delaunay triangulation -generates tetrahedron. Each face of a tetrahedron is a triangle. -For example, the 3-d Delaunay triangulation of random points on -the surface of a cube, is a cellular structure of tetrahedron.

    - -

    Use triangulated output ('qdelaunay Qt i') or joggled input ('qdelaunay QJ i') -to generate the Delaunay triangulation. -Option 'i' reports each tetrahedron. The triangles are -every combination of 3 vertices. Each triangle is a -"ridge" of the Delaunay triangulation.

    - -

    For example,

    - -
    -        rbox 10 | qdelaunay Qt i
    -        14
    -        9 5 8 7
    -        0 9 8 7
    -        5 3 8 7
    -        3 0 8 7
    -        5 4 8 1
    -        4 6 8 1
    -        2 9 5 8
    -        4 2 5 8
    -        4 2 9 5
    -        6 2 4 8
    -        9 2 0 8
    -        2 6 0 8
    -        2 4 9 1
    -        2 6 4 1
    -
    - -

    is the Delaunay triangulation of 10 random points. Ridge 9-5-8 -occurs twice. Once for tetrahedron 9 5 8 7 and the other for -tetrahedron 2 9 5 8.

    - -

    You can also use the Qhull library to generate the triangles. -See "How do I visit the ridges of a -Delaunay triangulation?"

    - -

    »How do I construct a -3-d Delaunay triangulation?

    - -

    For 3-d Delaunay triangulations with cospherical input sites, -use triangulated output ('Qt') or -joggled input ('QJ'). Otherwise -option 'i' will -triangulate non-simplicial facets by adding a point to the facet. - -

    If you want non-simplicial output for cospherical sites, use -option -'Fv' or 'o'. -For option 'o', ignore the last coordinate. It is the lifted -coordinate for the corresponding convex hull in 4-d. - -

    The following example is a cube -inside a tetrahedron. The 8-vertex facet is the cube. Ignore the -last coordinates.

    - -
    -
    -C:\qhull>rbox r y c G0.1 | qdelaunay Fv
    -4
    -12 20 44
    -   0.5      0      0 0.3055555555555555
    -   0    0.5      0 0.3055555555555555
    -   0      0    0.5 0.3055555555555555
    -  -0.5   -0.5   -0.5 0.9999999999999999
    -  -0.1   -0.1   -0.1 -6.938893903907228e-018
    -  -0.1   -0.1    0.1 -6.938893903907228e-018
    -  -0.1    0.1   -0.1 -6.938893903907228e-018
    -  -0.1    0.1    0.1 -6.938893903907228e-018
    -   0.1   -0.1   -0.1 -6.938893903907228e-018
    -   0.1   -0.1    0.1 -6.938893903907228e-018
    -   0.1    0.1   -0.1 -6.938893903907228e-018
    -   0.1    0.1    0.1 -6.938893903907228e-018
    -4 2 11 1 0
    -4 10 1 0 3
    -4 11 10 1 0
    -4 2 9 0 3
    -4 9 11 2 0
    -4 7 2 1 3
    -4 11 7 2 1
    -4 8 10 0 3
    -4 9 8 0 3
    -5 8 9 10 11 0
    -4 10 6 1 3
    -4 6 7 1 3
    -5 6 8 10 4 3
    -5 6 7 10 11 1
    -4 5 9 2 3
    -4 7 5 2 3
    -5 5 8 9 4 3
    -5 5 6 7 4 3
    -8 5 6 8 7 9 10 11 4
    -5 5 7 9 11 2
    -
    -
    - -

    If you want simplicial output use options -'Qt i' or -'QJ i', e.g., -

    - -
    -
    -rbox r y c G0.1 | qdelaunay Qt i
    -31
    -2 11 1 0
    -11 10 1 0
    -9 11 2 0
    -11 7 2 1
    -8 10 0 3
    -9 8 0 3
    -10 6 1 3
    -6 7 1 3
    -5 9 2 3
    -7 5 2 3
    -9 8 10 11
    -8 10 11 0
    -9 8 11 0
    -6 8 10 4
    -8 6 10 3
    -6 8 4 3
    -6 7 10 11
    -10 6 11 1
    -6 7 11 1
    -8 5 4 3
    -5 8 9 3
    -5 6 4 3
    -6 5 7 3
    -5 9 10 11
    -8 5 9 10
    -7 5 10 11
    -5 6 7 10
    -8 5 10 4
    -5 6 10 4
    -5 9 11 2
    -7 5 11 2
    -
    -
    - -

    »How do I get the -triangles for a 2-d Delaunay triangulation and the vertices of -its Voronoi diagram?

    - -

    To compute the Delaunay triangles indexed by the indices of -the input sites, use

    - -
    -

    rbox 10 D2 | qdelaunay Qt i

    -
    - -

    To compute the Voronoi vertices and the Voronoi region for -each input site, use

    - -
    -

    rbox 10 D2 | qvoronoi o

    -
    - -

    To compute each edge ("ridge") of the Voronoi -diagram for each pair of adjacent input sites, use

    - -
    -

    rbox 10 D2 | qvoronoi Fv

    -
    - -

    To compute the area and volume of the Voronoi region for input site 5 (site 0 is the first one), -use

    - -
    -

    rbox 10 D2 | qvoronoi QV5 p | qconvex s FS

    -
    - -

    To compute the lines ("hyperplanes") that define the -Voronoi region for input site 5, use

    - -
    -

    rbox 10 D2 | qvoronoi QV5 p | qconvex n

    -
    -or -
    -

    rbox 10 D2 | qvoronoi QV5 Fi Fo

    -
    - -

    To list the extreme points of the input sites use

    - -
    -

    rbox 10 D2 | qdelaunay Fx

    -
    - -

    You will get the same point ids with

    - -
    -

    rbox 10 D2 | qconvex Fx

    -
    - -

    »Can Qhull triangulate -a hundred 16-d points?

    - -

    No. This is an immense structure. A triangulation of 19, 16-d -points has 43 simplices. If you add one point at a time, the -triangulation increased as follows: 43, 189, 523, 1289, 2830, -6071, 11410, 20487. The last triangulation for 26 points used 13 -megabytes of memory. When Qhull uses virtual memory, it becomes -too slow to use.

    - -
    -

    »Voronoi -diagram questions

    - -

    »How do I compute the volume of a Voronoi region?

    - -

    For each Voronoi region, compute the convex hull of the region's Voronoi vertices. The volume of each convex hull is the volume -of the corresponding Vornoi region.

    - -

    For example, to compute the volume of the bounded Voronoi region about [0,0,0]: output the origin's Voronoi vertices and -compute the volume of their convex hull. The last number from option 'FS' is the volume.

    -
    -rbox P0 10 | qvoronoi QV0 p | qhull FS
    -0
    -2 1.448134756744281 0.1067973560800857
    -
    - -

    For another example, see How do I get the triangles for a 2-d Delaunay - triangulation and the vertices of its Voronoi diagram?

    - -

    This approach is slow if you are using the command line. A faster approcach is to call Qhull from -a program. The fastest method is Clarkson's hull program. -It computes the volume for all Voronoi regions.

    - -

    An unbounded Voronoi region does not have a volume.

    - -

    »How do I get the radii of the empty - spheres for each Voronoi vertex?

    - -Use option 'Fi' to list each bisector (i.e. Delaunay ridge). Then compute the -minimum distance for each Voronoi vertex. - -

    There's other ways to get the same information. Let me know if you -find a better method. - -

    »What is the Voronoi diagram - of a square?

    - -

    -Consider a square, -

    -C:\qhull>rbox c D2
    -2 RBOX c D2
    -4
    -  -0.5   -0.5
    -  -0.5    0.5
    -   0.5   -0.5
    -   0.5    0.5
    -
    - -

    There's two ways to compute the Voronoi diagram: with facet merging -or with joggle. With facet merging, the -result is: - -

    -C:\qhull>rbox c D2 | qvoronoi Qz
    -
    -Voronoi diagram by the convex hull of 5 points in 3-d:
    -
    -  Number of Voronoi regions and at-infinity: 5
    -  Number of Voronoi vertices: 1
    -  Number of facets in hull: 5
    -
    -Statistics for: RBOX c D2 | QVORONOI Qz
    -
    -  Number of points processed: 5
    -  Number of hyperplanes created: 7
    -  Number of distance tests for qhull: 8
    -  Number of merged facets: 1
    -  Number of distance tests for merging: 29
    -  CPU seconds to compute hull (after input):  0
    -
    -C:\qhull>rbox c D2 | qvoronoi Qz o
    -2
    -2 5 1
    --10.101 -10.101
    -     0      0
    -2 0 1
    -2 0 1
    -2 0 1
    -2 0 1
    -0
    -
    -C:\qhull>rbox c D2 | qvoronoi Qz Fv
    -4
    -4 0 1 0 1
    -4 0 2 0 1
    -4 1 3 0 1
    -4 2 3 0 1
    -
    - -

    There is one Voronoi vertex at the origin and rays from the origin -along each of the coordinate axes. -The last line '4 2 3 0 1' means that there is -a ray that bisects input points #2 and #3 from infinity (vertex 0) to -the origin (vertex 1). -Option 'Qz' adds an artificial point since the input is cocircular. -Coordinates -10.101 indicate the -vertex at infinity. - -

    With triangulated output, the Voronoi vertex is -duplicated: - -

    -C:\qhull3.1>rbox c D2 | qvoronoi Qt Qz
    -
    -Voronoi diagram by the convex hull of 5 points in 3-d:
    -
    -  Number of Voronoi regions and at-infinity: 5
    -  Number of Voronoi vertices: 2
    -  Number of triangulated facets: 1
    -
    -Statistics for: RBOX c D2 | QVORONOI Qt Qz
    -
    -  Number of points processed: 5
    -  Number of hyperplanes created: 7
    -  Number of facets in hull: 6
    -  Number of distance tests for qhull: 8
    -  Number of distance tests for merging: 33
    -  Number of distance tests for checking: 30
    -  Number of merged facets: 1
    -  CPU seconds to compute hull (after input): 0.05
    -
    -C:\qhull3.1>rbox c D2 | qvoronoi Qt Qz o
    -2
    -3 5 1
    --10.101 -10.101
    -     0      0
    -     0      0
    -3 2 0 1
    -2 1 0
    -2 2 0
    -3 2 0 1
    -0
    -
    -C:\qhull3.1>rbox c D2 | qvoronoi Qt Qz Fv
    -4
    -4 0 2 0 2
    -4 0 1 0 1
    -4 1 3 0 1
    -4 2 3 0 2
    -
    - - -

    With joggle, the input is no longer cocircular and the Voronoi vertex is -split into two: - -

    -C:\qhull>rbox c D2 | qvoronoi Qt Qz
    -
    -C:\qhull>rbox c D2 | qvoronoi QJ o
    -2
    -3 4 1
    --10.101 -10.101
    --4.71511718558304e-012 -1.775812830118184e-011
    -9.020340030474472e-012 -4.02267108512433e-012
    -2 0 1
    -3 2 1 0
    -3 2 0 1
    -2 2 0
    -
    -C:\qhull>rbox c D2 | qvoronoi QJ Fv
    -5
    -4 0 2 0 1
    -4 0 1 0 1
    -4 1 2 1 2
    -4 1 3 0 2
    -4 2 3 0 2
    -
    - -

    Note that the Voronoi diagram includes the same rays as - before plus a short edge between the two vertices.

    - - -

    »How do I construct -the Voronoi diagram of cospherical points?

    - -

    Three-d terrain data can be approximated with cospherical -points. The Delaunay triangulation of cospherical points is the -same as their convex hull. If the points lie on the unit sphere, -the facet normals are the Voronoi vertices [via S. Fortune].

    - -

    For example, consider the points {[1,0,0], [-1,0,0], [0,1,0], -...}. Their convex hull is:

    - -
    -rbox d G1 | qconvex o
    -3
    -6 8 12
    -     0      0     -1
    -     0      0      1
    -     0     -1      0
    -     0      1      0
    -    -1      0      0
    -     1      0      0
    -3 3 1 4
    -3 1 3 5
    -3 0 3 4
    -3 3 0 5
    -3 2 1 5
    -3 1 2 4
    -3 2 0 4
    -3 0 2 5
    -
    - -

    The facet normals are:

    - -
    -rbox d G1 | qconvex n
    -4
    -8
    --0.5773502691896258  0.5773502691896258  0.5773502691896258 -0.5773502691896258
    - 0.5773502691896258  0.5773502691896258  0.5773502691896258 -0.5773502691896258
    --0.5773502691896258  0.5773502691896258 -0.5773502691896258 -0.5773502691896258
    - 0.5773502691896258  0.5773502691896258 -0.5773502691896258 -0.5773502691896258
    - 0.5773502691896258 -0.5773502691896258  0.5773502691896258 -0.5773502691896258
    --0.5773502691896258 -0.5773502691896258  0.5773502691896258 -0.5773502691896258
    --0.5773502691896258 -0.5773502691896258 -0.5773502691896258 -0.5773502691896258
    - 0.5773502691896258 -0.5773502691896258 -0.5773502691896258 -0.5773502691896258
    -
    - -

    If you drop the offset from each line (the last number), each -line is the Voronoi vertex for the corresponding facet. The -neighboring facets for each point define the Voronoi region for -each point. For example:

    - -
    -rbox d G1 | qconvex FN
    -6
    -4 7 3 2 6
    -4 5 0 1 4
    -4 7 4 5 6
    -4 3 1 0 2
    -4 6 2 0 5
    -4 7 3 1 4
    -
    - -

    The Voronoi vertices {7, 3, 2, 6} define the Voronoi region -for point 0. Point 0 is [0,0,-1]. Its Voronoi vertices are

    - -
    --0.5773502691896258  0.5773502691896258 -0.5773502691896258
    - 0.5773502691896258  0.5773502691896258 -0.5773502691896258
    --0.5773502691896258 -0.5773502691896258 -0.5773502691896258
    - 0.5773502691896258 -0.5773502691896258 -0.5773502691896258
    -
    - -

    In this case, the Voronoi vertices are oriented, but in -general they are unordered.

    - -

    By taking the dual of the Delaunay triangulation, you can -construct the Voronoi diagram. For cospherical points, the convex -hull vertices for each facet, define the input sites for each -Voronoi vertex. In 3-d, the input sites are oriented. For -example:

    - -
    -rbox d G1 | qconvex i
    -8
    -3 1 4
    -1 3 5
    -0 3 4
    -3 0 5
    -2 1 5
    -1 2 4
    -2 0 4
    -0 2 5
    -
    - -

    The convex hull vertices for facet 0 are {3, 1, 4}. So Voronoi -vertex 0 (i.e., [-0.577, 0.577, 0.577]) is the Voronoi vertex for -input sites {3, 1, 4} (i.e., {[0,1,0], [0,0,1], [-1,0,0]}).

    - -

    »Can Qhull compute the -unbounded rays of the Voronoi diagram?

    - -

    Use 'Fo' to compute the separating -hyperplanes for unbounded Voronoi regions. The corresponding ray -goes to infinity from the Voronoi vertices. If you enclose the -input sites in a large enough box, the outermost bounded regions -will represent the unbounded regions of the original points.

    - -

    If you do not box the input sites, you can identify the -unbounded regions. They list '0' as a vertex. Vertex 0 represents -"infinity". Each unbounded ray includes vertex 0 in -option 'Fv. See Voronoi graphics and Voronoi notes.

    - -
    -

    »Approximation questions

    - -

    »How do I -approximate data with a simplex

    - -

    Qhull may be used to help select a simplex that approximates a -data set. It will take experimentation. Geomview will help to -visualize the results. This task may be difficult to do in 5-d -and higher. Use rbox options 'x' and 'y' to produce random -distributions within a simplex. Your methods work if you can -recover the simplex.

    - -

    Use Qhull's precision options to get a first approximation to -the hull, say with 10 to 50 facets. For example, try 'C0.05' to -remove small facets after constructing the hull. Use 'W0.05' to -ignore points within 0.05 of a facet. Use 'PA5' to print the five -largest facets by area.

    - -

    Then use other methods to fit a simplex to this data. Remove -outlying vertices with few nearby points. Look for large facets -in different quadrants. You can use option 'Pd0d1d2' to print all -the facets in a quadrant.

    - -

    In 4-d and higher, use the outer planes (option 'Fo' or -'facet->maxoutside') since the hyperplane of an approximate -facet may be below many of the input points.

    - -

    For example, consider fitting a cube to 1000 uniformly random -points in the unit cube. In this case, the first try was good:

    - -
    -
    -rbox 1000 | qconvex W0.05 C0.05 PA6 Fo
    -4
    -6
    -0.35715408374381 0.08706467018177928 -0.9299788727015564 -0.5985514741284483
    -0.995841591359023 -0.02512604712761577 0.08756829720435189 -0.5258834069202866
    -0.02448099521570909 -0.02685210459017302 0.9993396046151313 -0.5158104982631999
    --0.9990223929415094 -0.01261133513150079 0.04236994958247349 -0.509218270408407
    --0.0128069014364698 -0.9998380680115362 0.01264203427283151 -0.5002512653670584
    -0.01120895057872914 0.01803671994177704 -0.9997744926535512 -0.5056824072956361
    -
    -
    - -
    -

    »Halfspace questions

    - -

    »How do I compute the - intersection of halfspaces with Qhull?

    - -

    Qhull computes the halfspace intersection about a point. The -point must be inside all of the halfspaces. Given a point, a -duality turns a halfspace intersection problem into a convex -hull problem. - -

    Use linear programming if you -do not know a point in the interior of the halfspaces. -See the notes for qhalf. You will need - a linear programming code. This may require a fair amount of work to - implement.

    - - - -
    -

    »Qhull library -questions

    - -

    »Is Qhull available for Mathematica, Matlab, or Maple?

    - -

    MATLAB - -

    Z. You of MathWorks added qhull to MATLAB 6. -See functions convhulln, - delaunayn, - griddata3, - griddatan, - tsearch, - tsearchn, and - voronoin. V. Brumberg update MATLAB R14 for Qhull 2003.1 and triangulated output. - -

    Engwirda wrote mesh2d for unstructured mesh generation in MATLAB. -It is based on the iterative method of Persson and generally results in better quality meshes than delaunay refinement. - - -

    Mathematica and Maple - -

    See qh-math -for a Delaunay interface to Mathematica. It includes projects for CodeWarrior -on the Macintosh and Visual C++ on Win32 PCs. - -

    See Mathematica ('m') and Maple ('FM') output options. - -

    -

    »Why are there too few ridges?

    - -The following sample code may produce fewer ridges than expected: - -
    -  facetT *facetp;
    -  ridgeT *ridge, **ridgep;
    -
    -  FORALLfacets {
    -    printf("facet f%d\n", facet->id);
    -    FOREACHridge_(facet->ridges) {
    -      printf("   ridge r%d between f%d and f%d\n", ridge->id, ridge->top->id, ridge->bottom->id);
    -    }
    -  }
    -
    - -

    Qhull does not create ridges for simplicial facets. -Instead it computes ridges from facet->neighbors. To make ridges for a -simplicial facet, use qh_makeridges() in merge.c. Usefacet->visit_id to visit -each ridge once (instead of twice). For example, - -

    -  facetT *facet, *neighbor;
    -  ridgeT *ridge, **ridgep;
    -
    -  qh visit_id++;
    -  FORALLfacets {
    -    printf("facet f%d\n", facet->id);
    -    qh_makeridges(facet);
    -    facet->visitId= qh visit_id;
    -    FOREACHridge_(facet->ridges) {
    -        neighbor= otherfacet_(ridge, visible);
    -        if (neighbor->visitid != qh visit_id)
    -            printf("   ridge r%d between f%d and f%d\n", ridge->id, ridge->top->id, ridge->bottom->id);
    -    }
    -  }
    -
    - -

    »Can Qhull use coordinates without placing - them in a data file?

    - -

    You may call Qhull from a program. Please use the reentrant Qhull library (libqhullstatic_r.a, libqhull_r.so, or qhull_r.dll). - -See user_eg.c and "Qhull-template" in user_r.c for examples.. - -See Qhull internals for an introduction to Qhull's reentrant library and its C++ interface. - -

    Hint: Start with a small example for which you know the - answer.

    - -

    »How large are Qhull's data structures?

    - -

    Qhull uses a general-dimension data structure. -The size depends on the dimension. Use option 'Ts' to print -out the memory statistics [e.g., 'rbox D2 10 | qconvex Ts']. - - -

    »Can Qhull construct -convex hulls and Delaunay triangulations one point at a time?

    - -

    The Qhull library may be used to construct convex hulls and -Delaunay triangulations one point at a time. It may not be used -for deleting points or moving points.

    - -

    Qhull is designed for batch processing. Neither Clarkson's -randomized incremental algorithm nor Qhull are designed for -on-line operation. For many applications, it is better to -reconstruct the convex hull or Delaunay triangulation from -scratch for each new point.

    - -

    With random point sets and on-line processing, Clarkson's -algorithm should run faster than Qhull. Clarkson uses the -intermediate facets to reject new, interior points, while Qhull, -when used on-line, visits every facet to reject such points. If -used on-line for n points, Clarkson may take O(n) times as much -memory as the average off-line case, while Qhull's space -requirement does not change.

    - -

    If you triangulate the output before adding all the points -(option 'Qt' and procedure qh_triangulate), you must set -option 'Q11'. It duplicates the -normals of triangulated facets and recomputes the centrums. -This should be avoided for regular use since triangulated facets -are not clearly convex with their neighbors. It appears to -work most of the time, but fails for cases that Qhull normally -handles well [see the test call to qh_triangulate in qh_addpoint]. - -

    »How do I visit the -ridges of a Delaunay triangulation?

    - -

    To visit the ridges of a Delaunay triangulation, visit each -facet. Each ridge will appear twice since it belongs to two -facets. In pseudo-code:

    - -
    -    for each facet of the triangulation
    -        if the facet is Delaunay (i.e., part of the lower convex hull)
    -            for each ridge of the facet
    -                if the ridge's neighboring facet has not been visited
    -                    ... process a ridge of the Delaunay triangulation ...
    -
    - -

    In undebugged, C code:

    - -
    -    qh visit_id++;
    -    FORALLfacets_(facetlist)
    -        if (!facet->upperdelaunay) {
    -            facet->visitid= qh visit_id;
    -            qh_makeridges(facet);
    -            FOREACHridge_(facet->ridges) {
    -                neighbor= otherfacet_(ridge, facet);
    -                if (neighbor->visitid != qh visit_id) {
    -                    /* Print ridge here with facet-id and neighbor-id */
    -                    /*fprintf(fp, "f%d\tf%d\t",facet->id,neighbor->ID);*/
    -                    FOREACHvertex_(ridge->vertices)
    -                        fprintf(fp,"%d ",qh_pointid (vertex->point) );
    -                    qh_printfacetNvertex_simplicial (fp, facet, format);
    -                    fprintf(fp," ");
    -                    if(neighbor->upperdelaunay)
    -                        fprintf(fp," -1 -1 -1 -1 ");
    -                    else
    -                        qh_printfacetNvertex_simplicial (fp, neighbor, format);
    -                    fprintf(fp,"\n");
    -                }
    -            }
    -        }
    -    }
    -
    - -

    Qhull should be redesigned as a class library, or at least as -an API. It currently provides everything needed, but the -programmer has to do a lot of work. Hopefully someone will write -C++ wrapper classes or a Python module for Qhull.

    - -

    »How do I visit the -Delaunay regions?

    - -

    Qhull constructs a Delaunay triangulation by lifting the -input sites to a paraboloid. The Delaunay triangulation -corresponds to the lower convex hull of the lifted points. To -visit each facet of the lower convex hull, use:

    - -
    -    facetT *facet;
    -
    -    ...
    -    FORALLfacets {
    -        if (!facet->upperdelaunay) {
    -            ... only facets for Delaunay regions ...
    -        }
    -    }
    -
    - -

    »When is a point -outside or inside a facet?

    - -

    A point is outside of a facet if it is clearly outside the -facet's outer plane. The outer plane is defined by an offset -(facet->maxoutside) from the facet's hyperplane.

    - -
    -    facetT *facet;
    -    pointT *point;
    -    realT dist;
    -
    -    ...
    -    qh_distplane(point, facet, &dist);
    -    if (dist > facet->maxoutside + 2 * qh DISTround) {
    -        /* point is clearly outside of facet */
    -    }
    -
    - -

    A point is inside of a facet if it is clearly inside the -facet's inner plane. The inner plane is computed as the maximum -distance of a vertex to the facet. It may be computed for an -individual facet, or you may use the maximum over all facets. For -example:

    - -
    -    facetT *facet;
    -    pointT *point;
    -    realT dist;
    -
    -    ...
    -    qh_distplane(point, facet, &dist);
    -    if (dist < qh min_vertex - 2 * qh DISTround) {
    -        /* point is clearly inside of facet */
    -    }
    -
    - -

    Both tests include two qh.DISTrounds because the computation -of the furthest point from a facet may be off by qh.DISTround and -the computation of the current distance to the facet may be off -by qh.DISTround.

    - -

    »How do I find the -facet that is closest to a point?

    - -

    Use qh_findbestfacet(). For example,

    - -
    -    coordT point[ DIM ];
    -    boolT isoutside;
    -    realT bestdist;
    -    facetT *facet;
    -
    -    ... set coordinates for point ...
    -
    -    facet= qh_findbestfacet (point, qh_ALL, &bestdist, &isoutside);
    -
    -    /* 'facet' is the closest facet to 'point' */
    -
    - -

    qh_findbestfacet() performs a directed search for the facet -furthest below the point. If the point lies inside this facet, -qh_findbestfacet() performs an exhaustive search of all facets. -An exhaustive search may be needed because a facet on the far -side of a lens-shaped distribution may be closer to a point than -all of the facet's neighbors. The exhaustive search may be -skipped for spherical distributions.

    - -

    Also see, "How do I find the -Delaunay triangle that is closest to a -point?"

    - -

    »How do I find the -Delaunay triangle or Voronoi region that is closest to a point?

    - -

    A Delaunay triangulation subdivides the plane, or in general -dimension, subdivides space. Given a point, how do you determine -the subdivision containing the point? Or, given a set of points, -how do you determine the subdivision containing each point of the set? -Efficiency is important -- an exhaustive search of the subdivision -is too slow. - -

    First compute the Delaunay triangle with qh_new_qhull() in user_r.c or Qhull::runQhull(). -Lift the point to the paraboloid by summing the squares of the -coordinates. Use qh_findbestfacet() [poly2.c] to find the closest Delaunay -triangle. Determine the closest vertex to find the corresponding -Voronoi region. Do not use options -'Qbb', 'QbB', -'Qbk:n', or 'QBk:n' since these scale the last -coordinate. Optimizations of qh_findbestfacet() should -be possible for Delaunay triangulations.

    - -

    You first need to lift the point to the paraboloid (i.e., the -last coordinate is the sum of the squares of the point's coordinates). -The -routine, qh_setdelaunay() [geom2.c], lifts an array of points to the -paraboloid. The following excerpt is from findclosest() in -user_eg.c.

    - -
    -    coordT point[ DIM + 1];  /* one extra coordinate for lifting the point */
    -    boolT isoutside;
    -    realT bestdist;
    -    facetT *facet;
    -
    -    ... set coordinates for point[] ...
    -
    -    qh_setdelaunay (DIM+1, 1, point);
    -    facet= qh_findbestfacet (point, qh_ALL, &bestdist, &isoutside);
    -    /* 'facet' is the closest Delaunay triangle to 'point' */
    -
    - -

    The returned facet either contains the point or it is the -closest Delaunay triangle along the convex hull of the input set. - -

    Point location is an active research area in Computational -Geometry. For a practical approach, see Mucke, et al, "Fast randomized -point location without preprocessing in two- and -three-dimensional Delaunay triangulations," Computational -Geometry '96, p. 274-283, May 1996. -For an introduction to planar point location see [O'Rourke '93]. -Also see, "How do I find the facet that is closest to a -point?"

    - -

    To locate the closest Voronoi region, determine the closest -vertex of the closest Delaunay triangle.

    - -
    -    realT dist, bestdist= REALmax;
    -        vertexT *bestvertex= NULL, *vertex, **vertexp;
    -
    -    /* 'facet' is the closest Delaunay triangle to 'point' */
    -
    -    FOREACHvertex_( facet->vertices ) {
    -        dist= qh_pointdist( point, vertex->point, DIM );
    -        if (dist < bestdist) {
    -            bestdist= dist;
    -            bestvertex= vertex;
    -        }
    -    }
    -    /* 'bestvertex' represents the Voronoi region closest to 'point'.  The corresponding
    -       input site is 'bestvertex->point' */
    -
    - -

    »How do I list the -vertices?

    - -

    To list the vertices (i.e., extreme points) of the convex hull -use

    - -
    -
    -    vertexT *vertex;
    -
    -    FORALLvertices {
    -      ...
    -      // vertex->point is the coordinates of the vertex
    -      // qh_pointid(vertex->point) is the point ID of the vertex
    -      ...
    -    }
    -    
    -
    - -

    »How do I test code -that uses the Qhull library?

    - -

    Compare the output from your program with the output from the -Qhull program. Use option 'T1' or 'T4' to trace what Qhull is -doing. Prepare a small example for which you know the -output. Run the example through the Qhull program and your code. -Compare the trace outputs. If you do everything right, the two -trace outputs should be almost the same. The trace output will -also guide you to the functions that you need to review.

    - -

    »When I compute a -plane equation from a facet, I sometimes get an outward-pointing -normal and sometimes an inward-pointing normal

    - -

    Qhull orients simplicial facets, and prints oriented output -for 'i', 'Ft', and other options. The orientation depends on both -the vertex order and the flag facet->toporient.

    - -

    Qhull does not orient - non-simplicial facets. Instead it orients the facet's ridges. These are - printed with the 'Qt' and 'Ft' option. The facet's hyperplane is oriented.

    - -
    -
    - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: FAQ: Table of Contents
    - -


    - -

    The Geometry Center -Home Page

    - -

    Comments to: qhull@qhull.org -
    -Created: -Sept. 25, 1995 --- Last modified: see top -

    - - diff --git a/src/qhull/html/qh-get.htm b/src/qhull/html/qh-get.htm deleted file mode 100644 index c39ed225643..00000000000 --- a/src/qhull/html/qh-get.htm +++ /dev/null @@ -1,106 +0,0 @@ - - - - -Qhull Downloads - - - - -

    Up: Qhull Home Page
    -

    - -
    - -

    [CONE] Qhull Downloads

    - - - -
    - -

    Up: Qhull Home Page
    -

    - -
    - -

    [HOME] The Geometry Center Home Page

    - -

    Comments to: qhull@qhull.org
    - - diff --git a/src/qhull/html/qh-impre.htm b/src/qhull/html/qh-impre.htm deleted file mode 100644 index cfbe0acb826..00000000000 --- a/src/qhull/html/qh-impre.htm +++ /dev/null @@ -1,826 +0,0 @@ - - - - -Imprecision in Qhull - - - - -

    Up: Home -page for Qhull
    -Up: Qhull manual: Table of -Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: Qhull imprecision: Table of Contents -(please wait while loading) - -


    - -

    [4-d cube] Imprecision in Qhull

    - -

    This section of the Qhull manual discusses the problems caused -by coplanar points and why Qhull uses options 'C-0' or 'Qx' -by default. If you ignore precision issues with option 'Q0', the output from Qhull can be -arbitrarily bad. Qhull avoids precision problems if you merge facets (the default) or joggle -the input ('QJ').

    - -

    Use option 'Tv' to verify the -output from Qhull. It verifies that adjacent facets are clearly -convex. It verifies that all points are on or below all facets.

    - -

    Qhull automatically tests for convexity if it detects -precision errors while constructing the hull.

    - -

    Copyright © 1995-2015 C.B. Barber

    - -
    - -

    »Qhull -imprecision: Table of Contents

    - - - -
    - -

    »Precision problems

    - -

    Since Qhull uses floating point arithmetic, roundoff error -occurs with each calculation. This causes problems for -geometric algorithms. Other floating point codes for convex -hulls, Delaunay triangulations, and Voronoi diagrams also suffer -from these problems. Qhull handles most of them.

    - -

    There are several kinds of precision errors:

    - -
      -
    • Representation error occurs when there are not enough - digits to represent a number, e.g., 1/3.
    • -
    • Measurement error occurs when the input coordinates are - from measurements.
    • -
    • Roundoff error occurs when a calculation is rounded to a - fixed number of digits, e.g., a floating point - calculation.
    • -
    • Approximation error occurs when the user wants an - approximate result because the exact result contains too - much detail.
    • -
    - -

    Under imprecision, calculations may return erroneous results. -For example, roundoff error can turn a small, positive number -into a small, negative number. See Milenkovic ['93] for a discussion of strict -robust geometry. Qhull does not meet Milenkovic's criterion -for accuracy. Qhull's error bound is empirical instead of -theoretical.

    - -

    Qhull 1.0 checked for precision errors but did not handle -them. The output could contain concave facets, facets with -inverted orientation ("flipped" facets), more than two -facets adjacent to a ridge, and two facets with exactly the same -set of vertices.

    - -

    Qhull 2.4 and later automatically handles errors due to -machine round-off. Option 'C-0' or 'Qx' is set by default. In 5-d and -higher, the output is clearly convex but an input point could be -outside of the hull. This may be corrected by using option 'C-0', but then the output may contain -wide facets.

    - -

    Qhull 2.5 and later provides option 'QJ' -to joggled input. Each input coordinate is modified by a -small, random quantity. If a precision error occurs, a larger -modification is tried. When no precision errors occur, Qhull is -done.

    - -

    Qhull 3.1 and later provides option 'Qt' -for triangulated output. This removes the need for -joggled input ('QJ'). -Non-simplicial facets are triangulated. -The facets may have zero area. -Triangulated output is particularly useful for Delaunay triangulations.

    - -

    By handling round-off errors, Qhull can provide a variety of -output formats. For example, it can return the halfspace that -defines each facet ('n'). The -halfspaces include roundoff error. If the halfspaces were exact, -their intersection would return the original extreme points. With -imprecise halfspaces and exact arithmetic, nearly incident points -may be returned for an original extreme point. By handling -roundoff error, Qhull returns one intersection point for each of -the original extreme points. Qhull may split or merge an extreme -point, but this appears to be unlikely.

    - -

    The following pipe implements the identity function for -extreme points (with roundoff): -

    - qconvex FV n | qhalf Fp -
    - -

    Bernd Gartner published his -Miniball -algorithm ["Fast and robust smallest enclosing balls", Algorithms - ESA '99, LNCS 1643]. -It uses floating point arithmetic and a carefully designed primitive operation. -It is practical to 20-D or higher, and identifies at least two points on the -convex hull of the input set. Like Qhull, it is an incremental algorithm that -processes points furthest from the intermediate result and ignores -points that are close to the intermediate result. - -

    »Merged facets or joggled input

    - -

    This section discusses the choice between merged facets and joggled input. -By default, Qhull uses merged facets to handle -precision problems. With option 'QJ', -the input is joggled. See examples -of joggled input and triangulated output. -

      -
    • Use merged facets (the default) -when you want non-simplicial output (e.g., the faces of a cube). -
    • Use merged facets and triangulated output ('Qt') when -you want simplicial output and coplanar facets (e.g., triangles for a Delaunay triangulation). -
    • Use joggled input ('QJ') when you need clearly-convex, -simplicial output. -
    - -

    The choice between merged facets and joggled input depends on -the application. Both run about the same speed. Joggled input may -be faster if the initial joggle is sufficiently large to avoid -precision errors. - -

    Most applications should used merged facets -with triangulated output.

    - -

    Use merged facets (the -default, 'C-0') -or triangulated output ('Qt') if

    - -
      -
    • Your application supports non-simplicial facets, or - it allows degenerate, simplicial facets (option 'Qt').
    • -
    • You do not want the input modified.
    • -
    • You want to set additional options for approximating the - hull.
    • -
    • You use single precision arithmetic (realT). -
    • -
    - -

    Use joggled input ('QJ') if

    - -
      -
    • Your application needs clearly convex, simplicial output
    • -
    • Your application supports perturbed input points and narrow triangles.
    • -
    • Seven significant digits is sufficient accuracy.
    • -
    - -

    You may use both techniques or combine joggle with -post-merging ('Cn').

    - -

    Other researchers have used techniques similar to joggled -input. Sullivan and Beichel [ref?] randomly perturb the input -before computing the Delaunay triangulation. Corkum and Wyllie -[news://comp.graphics, 1990] randomly rotate a polytope before -testing point inclusion. Edelsbrunner and Mucke [Symp. Comp. -Geo., 1988] and Yap [J. Comp. Sys. Sci., 1990] symbolically -perturb the input to remove singularities.

    - -

    Merged facets ('C-0') handles -precision problems directly. If a precision problem occurs, Qhull -merges one of the offending facets into one of its neighbors. -Since all precision problems in Qhull are associated with one or -more facets, Qhull will either fix the problem or attempt to merge the -last remaining facets.

    - -

    »Delaunay -triangulations

    - -

    Programs that use Delaunay triangulations traditionally assume -a triangulated input. By default, qdelaunay -merges regions with cocircular or cospherical input sites. -If you want a simplicial triangulation -use triangulated output ('Qt') or joggled -input ('QJ'). - -

    For Delaunay triangulations, triangulated -output should produce good results. All points are within roundoff error of -a paraboloid. If two points are nearly incident, one will be a -coplanar point. So all points are clearly separated and convex. -If qhull reports deleted vertices, the triangulation -may contain serious precision faults. Deleted vertices are reported -in the summary ('s', 'Fs'

    - -

    You should use option 'Qbb' with Delaunay -triangulations. It scales the last coordinate and may reduce -roundoff error. It is automatically set for qdelaunay, -qvoronoi, and option 'QJ'.

    - -

    Edelsbrunner, H, Geometry and Topology for Mesh Generation, Cambridge University Press, 2001. -Good mathematical treatise on Delaunay triangulation and mesh generation for 2-d -and 3-d surfaces. The chapter on surface simplification is -particularly interesting. It is similar to facet merging in Qhull. - -

    Veron and Leon published an algorithm for shape preserving polyhedral -simplification with bounded error [Computers and Graphics, 22.5:565-585, 1998]. -It remove nodes using front propagation and multiple remeshing. - -

    »Halfspace intersection

    - -

    -The identity pipe for Qhull reveals some precision questions for -halfspace intersections. The identity pipe creates the convex hull of -a set of points and intersects the facets' hyperplanes. It should return the input -points, but narrow distributions may drop points while offset distributions may add -points. It may be better to normalize the input set about the origin. -For example, compare the first results with the later two results: [T. Abraham] -

    - rbox 100 s t | tee r | qconvex FV n | qhalf Fp | cat - r | /bin/sort -n | tail -
    - rbox 100 L1e5 t | tee r | qconvex FV n | qhalf Fp | cat - r | /bin/sort -n | tail -
    - rbox 100 s O10 t | tee r | qconvex FV n | qhalf Fp | cat - r | /bin/sort -n | tail -
    - - -

    »Merged facets

    - -

    Qhull detects precision -problems when computing distances. A precision problem occurs if -the distance computation is less than the maximum roundoff error. -Qhull treats the result of a hyperplane computation as if it -were exact.

    - -

    Qhull handles precision problems by merging non-convex facets. -The result of merging two facets is a thick facet defined by an inner -plane and an outer plane. The inner and outer planes -are offsets from the facet's hyperplane. The inner plane is -clearly below the facet's vertices. At the end of Qhull, the -outer planes are clearly above all input points. Any exact convex -hull must lie between the inner and outer planes.

    - -

    Qhull tests for convexity by computing a point for each facet. -This point is called the facet's centrum. It is the -arithmetic center of the facet's vertices projected to the -facet's hyperplane. For simplicial facets with d -vertices, the centrum is equivalent to the centroid or center of -gravity.

    - -

    Two neighboring facets are convex if each centrum is clearly -below the other hyperplane. The 'Cn' -or 'C-n' options sets the centrum's -radius to n . A centrum is clearly below a hyperplane if -the computed distance from the centrum to the hyperplane is -greater than the centrum's radius plus two maximum roundoff -errors. Two are required because the centrum can be the maximum -roundoff error above its hyperplane and the distance computation -can be high by the maximum roundoff error.

    - -

    With the 'C-n' or 'A-n ' options, Qhull merges non-convex -facets while constructing the hull. The remaining facets are -clearly convex. With the 'Qx ' -option, Qhull merges coplanar facets after constructing the hull. -While constructing the hull, it merges coplanar horizon facets, -flipped facets, concave facets and duplicated ridges. With 'Qx', coplanar points may be missed, but -it appears to be unlikely.

    - -

    If the user sets the 'An' or 'A-n' option, then all neighboring -facets are clearly convex and the maximum (exact) cosine of an -angle is n.

    - -

    If 'C-0' or 'Qx' is used without other precision -options (default), Qhull tests vertices instead of centrums for -adjacent simplices. In 3-d, if simplex abc is adjacent to -simplex bcd, Qhull tests that vertex a is clearly -below simplex bcd , and vertex d is clearly below -simplex abc. When building the hull, Qhull tests vertices -if the horizon is simplicial and no merges occur.

    - -

    »How Qhull merges facets

    - -

    If two facets are not clearly convex, then Qhull removes one -or the other facet by merging the facet into a neighbor. It -selects the merge which minimizes the distance from the -neighboring hyperplane to the facet's vertices. Qhull also -performs merges when a facet has fewer than d neighbors (called a -degenerate facet), when a facet's vertices are included in a -neighboring facet's vertices (called a redundant facet), when a -facet's orientation is flipped, or when a ridge occurs between -more than two facets.

    - -

    Qhull performs merges in a series of passes sorted by merge -angle. Each pass merges those facets which haven't already been -merged in that pass. After a pass, Qhull checks for redundant -vertices. For example, if a vertex has only two neighbors in 3-d, -the vertex is redundant and Qhull merges it into an adjacent -vertex.

    - -

    Merging two simplicial facets creates a non-simplicial facet -of d+1 vertices. Additional merges create larger facets. -When merging facet A into facet B, Qhull retains facet B's -hyperplane. It merges the vertices, neighbors, and ridges of both -facets. It recomputes the centrum if a wide merge has not -occurred (qh_WIDEcoplanar) and the number of extra vertices is -smaller than a constant (qh_MAXnewcentrum).

    - - -

    »Limitations of merged -facets

    - -
      -
    • Uneven dimensions -- -If one coordinate has a larger absolute value than other -coordinates, it may dominate the effect of roundoff errors on -distance computations. You may use option 'QbB' to scale points to the unit cube. -For Delaunay triangulations and Voronoi diagrams, qdelaunay -and qvoronoi always set -option 'Qbb'. It scales the last -coordinate to [0,m] where m is the maximum width of the -other coordinates. Option 'Qbb' is -needed for Delaunay triangulations of integer coordinates -and nearly cocircular points. - -

      For example, compare -

      -        rbox 1000 W0 t | qconvex Qb2:-1e-14B2:1e-14
      -
      -with -
      -        rbox 1000 W0 t | qconvex
      -
      -The distributions are the same but the first is compressed to a 2e-14 slab. -

      -

    • Post-merging of coplanar facets -- In 5-d and higher, option 'Qx' -(default) delays merging of coplanar facets until post-merging. -This may allow "dents" to occur in the intermediate -convex hulls. A point may be poorly partitioned and force a poor -approximation. See option 'Qx' for -further discussion.

      - -

      This is difficult to produce in 5-d and higher. Option 'Q6' turns off merging of concave -facets. This is similar to 'Qx'. It may lead to serious precision errors, -for example, -

      -        rbox 10000 W1e-13  | qhull Q6  Tv
      -
      - -

      -

    • Maximum facet width -- -Qhull reports the maximum outer plane and inner planes (if -more than roundoff error apart). There is no upper bound -for either figure. This is an area for further research. Qhull -does a good job of post-merging in all dimensions. Qhull does a -good job of pre-merging in 2-d, 3-d, and 4-d. With the 'Qx' option, it does a good job in -higher dimensions. In 5-d and higher, Qhull does poorly at -detecting redundant vertices.

      - -

      In the summary ('s'), look at the -ratio between the maximum facet width and the maximum width of a -single merge, e.g., "(3.4x)". Qhull usually reports a -ratio of four or lower in 3-d and six or lower in 4-d. If it -reports a ratio greater than 10, this may indicate an -implementation error. Narrow distributions (see following) may -produce wide facets. - -

      For example, if special processing for narrow distributions is -turned off ('Q10'), qhull may produce -a wide facet:

      -
      -         rbox 1000 L100000 s G1e-16 t1002074964 | qhull Tv Q10
      -
      - -

      -

    • Narrow distribution -- In 3-d, a narrow distribution may result in a poor -approximation. For example, if you do not use qdelaunay nor option -'Qbb', the furthest-site -Delaunay triangulation of nearly cocircular points may produce a poor -approximation: -
      -         rbox s 5000 W1e-13 D2 t1002151341 | qhull d Qt
      -         rbox 1000 s W1e-13 t1002231672 | qhull d Tv
      -
      - -

      During -construction of the hull, a point may be above two -facets with opposite orientations that span the input -set. Even though the point may be nearly coplanar with both -facets, and can be distant from the precise convex -hull of the input sites. Additional facets leave the point distant from -a facet. To fix this problem, add option 'Qbb' -(it scales the last coordinate). Option 'Qbb' -is automatically set for qdelaunay and qvoronoi. - -

      Qhull generates a warning if the initial simplex is narrow. -For narrow distributions, Qhull changes how it processes coplanar -points -- it does not make a point coplanar until the hull is -finished. -Use option 'Q10' to try Qhull without -special processing for narrow distributions. -For example, special processing is needed for: -

      -         rbox 1000 L100000 s G1e-16 t1002074964 | qhull Tv Q10
      -
      - -

      You may turn off the warning message by reducing -qh_WARNnarrow in user.h or by setting option -'Pp'.

      - -

      Similar problems occur for distributions with a large flat facet surrounded -with many small facet at a sharp angle to the large facet. -Qhull 3.1 fixes most of these problems, but a poor approximation can occur. -A point may be left outside of the convex hull ('Tv'). -Examples include -the furthest-site Delaunay triangulation of nearly cocircular points plus the origin, and the convex hull of a cone of nearly cocircular points. The width of the band is 10^-13. -

      -        rbox s 1000 W1e-13 P0 D2 t996799242 | qhull d Tv
      -        rbox 1000 s Z1 G1e-13 t1002152123 | qhull Tv
      -        rbox 1000 s Z1 G1e-13 t1002231668 | qhull Tv
      -
      - -

      -

    • Quadratic running time -- If the output contains large, non-simplicial -facets, the running time for Qhull may be quadratic in the size of the triangulated -output. For example, rbox 1000 s W1e-13 c G2 | qhull d is 4 times -faster for 500 points. The convex hull contains two large nearly spherical facets and -many nearly coplanar facets. Each new point retriangulates the spherical facet and repartitions the remaining points into all of the nearly coplanar facets. -In this case, quadratic running time is avoided if you use qdelaunay, -add option 'Qbb', -or add the origin ('P0') to the input. -

      -

    • Nearly coincident points within 1e-13 -- -Multiple, nearly coincident points within a 1e-13 ball of points in the unit cube -may lead to wide facets or quadratic running time. -For example, the convex hull a 1000 coincident, cospherical points in 4-D, -or the 3-D Delaunay triangulation of nearly coincident points, may lead to very -wide facets (e.g., 2267021951.3x). - -

      For Delaunay triangulations, the problem typically occurs for extreme points of the input -set (i.e., on the edge between the upper and lower convex hull). After multiple facet merges, four -facets may share the same, duplicate ridge and must be merged. -Some of these facets may be long and narrow, leading to a very wide merged facet. -If so, error QH6271 is reported. It may be overriden with option 'Q12'. - -

      Duplicate ridges occur when the horizon facets for a new point is "pinched". -In a duplicate ridge, a subridge (e.g., a line segment in 3-d) is shared by two horizon facets. -At least two of its vertices are nearly coincident. It is easy to generate coincident points with -option 'Cn,r,m' of rbox. It generates n points within an r ball for each of m input sites. For example, -every point of the following distributions has a nearly coincident point within a 1e-13 ball. -Substantially smaller or larger balls do not lead to pinched horizons. -

      -        rbox 1000 C1,1e-13 D4 s t | qhull
      -        rbox 75 C1,1e-13 t | qhull d
      -
      -For Delaunay triangulations, a bounding box may alleviate this error (e.g., rbox 500 C1,1E-13 t c G1 | qhull d). -A later release of qhull will avoid pinched horizons by merging duplicate subridges. A subridge is -merged by merging adjacent vertices. -

      -

    • Facet with zero-area -- -It is possible for a zero-area facet to be convex with its -neighbors. This can occur if the hyperplanes of neighboring -facets are above the facet's centrum, and the facet's hyperplane -is above the neighboring centrums. Qhull computes the facet's -hyperplane so that it passes through the facet's vertices. The -vertices can be collinear.

      - -

      -

    • No more facets -- Qhull reports an error if there are d+1 facets left -and two of the facets are not clearly convex. This typically -occurs when the convexity constraints are too strong or the input -points are degenerate. The former is more likely in 5-d and -higher -- especially with option 'C-n'.

      - -

      -

    • Deleted cone -- Lots of merging can end up deleting all -of the new facets for a point. This is a rare event that has -only been seen while debugging the code. - -

      -

    • Triangulated output leads to precision problems -- With sufficient -merging, the ridges of a non-simplicial facet may have serious topological -and geometric problems. A ridge may be between more than two -neighboring facets. If so, their triangulation ('Qt') -will fail since two facets have the same vertex set. Furthermore, -a triangulated facet may have flipped orientation compared to its -neighbors.
    • - -

      The triangulation process detects degenerate facets with -only two neighbors. These are marked degenerate. They have -zero area. - -

      -

    • Coplanar points -- -Option 'Qc' is determined by -qh_check_maxout() after constructing the hull. Qhull needs to -retain all possible coplanar points in the facets' coplanar sets. -This depends on qh_RATIOnearInside in user.h. -Furthermore, the cutoff for a coplanar point is arbitrarily set -at the minimum vertex. If coplanar points are important to your -application, remove the interior points by hand (set 'Qc Qi') or -make qh_RATIOnearInside sufficiently large.

      - -

      -

    • Maximum roundoff error -- Qhull computes the maximum roundoff error from the maximum -coordinates of the point set. Usually the maximum roundoff error -is a reasonable choice for all distance computations. The maximum -roundoff error could be computed separately for each point or for -each distance computation. This is expensive and it conflicts -with option 'C-n'. - -

      -

    • All flipped or upper Delaunay -- When a lot of merging occurs for -Delaunay triangulations, a new point may lead to no good facets. For example, -try a strong convexity constraint: -
      -        rbox 1000 s t993602376 | qdelaunay C-1e-3
      -
      - -
    - -

    »Joggled input

    - -

    Joggled input is a simple work-around for precision problems -in computational geometry ["joggle: to shake or jar -slightly," Amer. Heritage Dictionary]. Other names are -jostled input or random perturbation. -Qhull joggles the -input by modifying each coordinate by a small random quantity. If -a precision problem occurs, Qhull joggles the input with a larger -quantity and the algorithm is restarted. This process continues -until no precision problems occur. Unless all inputs incur -precision problems, Qhull will terminate. Qhull adjusts the inner -and outer planes to account for the joggled input.

    - -

    Neither joggle nor merged facets has an upper bound for the width of the output -facets, but both methods work well in practice. Joggled input is -easier to justify. Precision errors occur when the points are -nearly singular. For example, four points may be coplanar or -three points may be collinear. Consider a line and an incident -point. A precision error occurs if the point is within some -epsilon of the line. Now joggle the point away from the line by a -small, uniformly distributed, random quantity. If the point is -changed by more than epsilon, the precision error is avoided. The -probability of this event depends on the maximum joggle. Once the -maximum joggle is larger than epsilon, doubling the maximum -joggle will halve the probability of a precision error.

    - -

    With actual data, an analysis would need to account for each -point changing independently and other computations. It is easier -to determine the probabilities empirically ('TRn') . For example, consider -computing the convex hull of the unit cube centered on the -origin. The arithmetic has 16 significant decimal digits.

    - -
    -

    Convex hull of unit cube

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    joggleerror prob.
    1.0e-150.983
    2.0e-150.830
    4.0e-150.561
    8.0e-150.325
    1.6e-140.185
    3.2e-140.099
    6.4e-140.051
    1.3e-130.025
    2.6e-130.010
    5.1e-130.004
    1.0e-120.002
    2.0e-120.001
    -
    - -

    A larger joggle is needed for multiple points. Since the -number of potential singularities increases, the probability of -one or more precision errors increases. Here is an example.

    - -
    -

    Convex hull of 1000 points on unit cube

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    joggleerror prob.
    1.0e-120.870
    2.0e-120.700
    4.0e-120.450
    8.0e-120.250
    1.6e-110.110
    3.2e-110.065
    6.4e-110.030
    1.3e-100.010
    2.6e-100.008
    5.1e-090.003
    -
    - -

    Other distributions behave similarly. No distribution should -behave significantly worse. In Euclidean space, the probability -measure of all singularities is zero. With floating point -numbers, the probability of a singularity is non-zero. With -sufficient digits, the probability of a singularity is extremely -small for random data. For a sufficiently large joggle, all data -is nearly random data.

    - -

    Qhull uses an initial joggle of 30,000 times the maximum -roundoff error for a distance computation. This avoids most -potential singularities. If a failure occurs, Qhull retries at -the initial joggle (in case bad luck occurred). If it occurs -again, Qhull increases the joggle by ten-fold and tries again. -This process repeats until the joggle is a hundredth of the width -of the input points. Qhull reports an error after 100 attempts. -This should never happen with double-precision arithmetic. Once -the probability of success is non-zero, the probability of -success increases about ten-fold at each iteration. The -probability of repeated failures becomes extremely small.

    - -

    Merged facets produces a significantly better approximation. -Empirically, the maximum separation between inner and outer -facets is about 30 times the maximum roundoff error for a -distance computation. This is about 2,000 times better than -joggled input. Most applications though will not notice the -difference.

    - -

    »Exact arithmetic

    - -

    Exact arithmetic may be used instead of floating point. -Singularities such as coplanar points can either be handled -directly or the input can be symbolically perturbed. Using exact -arithmetic is slower than using floating point arithmetic and the -output may take more space. Chaining a sequence of operations -increases the time and space required. Some operations are -difficult to do.

    - -

    Clarkson's hull -program and Shewchuk's triangle -program are practical implementations of exact arithmetic.

    - -

    Clarkson limits the input precision to about fifteen digits. -This reduces the number of nearly singular computations. When a -determinant is nearly singular, he uses exact arithmetic to -compute a precise result.

    - -

    »Approximating a -convex hull

    - -

    Qhull may be used for approximating a convex hull. This is -particularly valuable in 5-d and higher where hulls can be -immense. You can use 'Qx C-n' to merge facets as the hull is -being constructed. Then use 'Cn' -and/or 'An' to merge small facets -during post-processing. You can print the n largest facets -with option 'PAn'. You can print -facets whose area is at least n with option 'PFn'. You can output the outer planes -and an interior point with 'FV Fo' and then compute their intersection -with 'qhalf'.

    - -

    To approximate a convex hull in 6-d and higher, use -post-merging with 'Wn' (e.g., qhull -W1e-1 C1e-2 TF2000). Pre-merging with a convexity constraint -(e.g., qhull Qx C-1e-2) often produces a poor approximation or -terminates with a simplex. Option 'QbB' -may help to spread out the data.

    - -

    You will need to experiment to determine a satisfactory set of -options. Use rbox to generate test sets -quickly and Geomview to view -the results. You will probably want to write your own driver for -Qhull using the Qhull library. For example, you could select the -largest facet in each quadrant.

    - - -
    - -

    Up: Home -page for Qhull
    -Up: Qhull manual: Table of -Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: Qhull imprecision: Table of Contents - - -


    - -

    The Geometry Center -Home Page

    - -

    Comments to: qhull@qhull.org -
    -Created: Sept. 25, 1995 --- Last modified: see top

    - - diff --git a/src/qhull/html/qh-optc.htm b/src/qhull/html/qh-optc.htm deleted file mode 100644 index 87308180d74..00000000000 --- a/src/qhull/html/qh-optc.htm +++ /dev/null @@ -1,292 +0,0 @@ - - - - -Qhull precision options - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions

    - -
    - -

    [delaunay] Qhull precision options

    - -This section lists the precision options for Qhull. These options are -indicated by an upper-case letter followed by a number. - -

    Copyright © 1995-2015 C.B. Barber

    - -
    - -

    » Programs - Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions

    - -

    Precision options

    - -

    Most users will not need to set these options. They are best -used for approximating a -convex hull. They may also be used for testing Qhull's handling -of precision errors.

    - -

    By default, Qhull uses options 'C-0' for -2-d, 3-d and 4-d, and 'Qx' for 5-d -and higher. These options use facet merging to handle precision -errors. You may also use joggled input 'QJ' -to avoid precision problems. -For more information see Imprecision in Qhull.

    - -
    -
     
    -
    General
    -
    Cn
    -
    centrum radius for post-merging
    -
    C-n
    -
    centrum radius for pre-merging
    -
    An
    -
    cosine of maximum angle for post-merging
    -
    A-n
    -
    cosine of maximum angle for pre-merging
    -
    Qx
    -
    exact pre-merges (allows coplanar facets)
    -
    C-0
    -
    handle all precision errors
    -
    Wn
    -
    min distance above plane for outside points
    -
    - -
    -
     
    -
    Experimental
    -
    Un
    -
    max distance below plane for a new, coplanar point
    -
    En
    -
    max roundoff error for distance computation
    -
    Vn
    -
    min distance above plane for a visible facet
    -
    Rn
    -
    randomly perturb computations by a factor of [1-n,1+n]
    -
    - -
    -
    - -
    - -

    »A-n - cosine of maximum -angle for pre-merging.

    - -

    Pre-merging occurs while Qhull constructs the hull. It is -indicated by 'C-n', 'A-n', or 'Qx'.

    - -

    If the angle between a pair of facet normals is greater than n, -Qhull merges one of the facets into a neighbor. It selects the -facet that is closest to a neighboring facet.

    - -

    For example, option 'A-0.99' merges facets during the -construction of the hull. If the cosine of the angle between -facets is greater than 0.99, one or the other facet is merged. -Qhull accounts for the maximum roundoff error.

    - -

    If 'A-n' is set without 'C-n', then 'C-0' is automatically set.

    - -

    In 5-d and higher, you should set 'Qx' -along with 'A-n'. It skips merges of coplanar facets until after -the hull is constructed and before 'An' and 'Cn' are checked.

    - -

    »An - cosine of maximum angle for -post-merging.

    - -

    Post merging occurs after the hull is constructed. For -example, option 'A0.99' merges a facet if the cosine of the angle -between facets is greater than 0.99. Qhull accounts for the -maximum roundoff error.

    - -

    If 'An' is set without 'Cn', then 'C0' is automatically set.

    - -

    »C-0 - handle all precision -errors

    - -

    Qhull handles precision errors by merging facets. The 'C-0' -option handles all precision errors in 2-d, 3-d, and 4-d. It is -set by default. It may be used in higher dimensions, but -sometimes the facet width grows rapidly. It is usually better to -use 'Qx' in 5-d and higher. -Use 'QJ' to joggle the input -instead of merging facets. -Use 'Q0' to turn both options off.

    - -

    Qhull optimizes 'C-0' ("_zero-centrum") by testing -vertices instead of centrums for adjacent simplices. This may be -slower in higher dimensions if merges decrease the number of -processed points. The optimization may be turned off by setting a -small value such as 'C-1e-30'. See How -Qhull handles imprecision.

    - -

    »C-n - centrum radius for -pre-merging

    - -

    Pre-merging occurs while Qhull constructs the hull. It is -indicated by 'C-n', 'A-n', or 'Qx'.

    - -

    The centrum of a facet is a point on the facet for -testing facet convexity. It is the average of the vertices -projected to the facet's hyperplane. Two adjacent facets are -convex if each centrum is clearly below the other facet.

    - -

    If adjacent facets are non-convex, one of the facets is merged -into a neighboring facet. Qhull merges the facet that is closest -to a neighboring facet.

    - -

    For option 'C-n', n is the centrum radius. For example, -'C-0.001' merges facets whenever the centrum is less than 0.001 -from a neighboring hyperplane. Qhull accounts for roundoff error -when testing the centrum.

    - -

    In 5-d and higher, you should set 'Qx' -along with 'C-n'. It skips merges of coplanar facets until after -the hull is constructed and before 'An' and 'Cn' are checked.

    - -

    »Cn - centrum radius for -post-merging

    - -

    Post-merging occurs after Qhull constructs the hull. It is -indicated by 'Cn' or 'An'.

    - -

    For option 'Cn', n is the centrum -radius. For example, 'C0.001' merges facets when the centrum is -less than 0.001 from a neighboring hyperplane. Qhull accounts for -roundoff error when testing the centrum.

    - -

    Both pre-merging and post-merging may be defined. If only -post-merging is used ('Q0' with -'Cn'), Qhull may fail to produce a hull due to precision errors -during the hull's construction.

    - -

    »En - max roundoff error -for distance computations

    - -

    This allows the user to change the maximum roundoff error -computed by Qhull. The value computed by Qhull may be overly -pessimistic. If 'En' is set too small, then the output may not be -convex. The statistic "max. distance of a new vertex to a -facet" (from option 'Ts') is a -reasonable upper bound for the actual roundoff error.

    - -

    »Rn - randomly perturb -computations

    - -

    This option perturbs every distance, hyperplane, and angle -computation by up to (+/- n * max_coord). It simulates the -effect of roundoff errors. Unless 'En' is -explicitly set, it is adjusted for 'Rn'. The command 'qhull Rn' -will generate a convex hull despite the perturbations. See the Examples section for an example.

    - -

    Options 'Rn C-n' have the effect of 'W2n' -and 'C-2n'. To use time as the random number -seed, use option 'QR-1'.

    - -

    »Un - max distance for a -new, coplanar point

    - -

    This allows the user to set coplanarity. When pre-merging ('C-n ', 'A-n' or 'Qx'), Qhull merges a new point into any -coplanar facets. The default value for 'Un' is 'Vn'.

    - -

    »Vn - min distance for a -visible facet

    - -

    This allows the user to set facet visibility. When adding a -point to the convex hull, Qhull determines all facets that are -visible from the point. A facet is visible if the distance from -the point to the facet is greater than 'Vn'.

    - -

    Without merging, the default value for 'Vn' is the roundoff -error ('En'). With merging, the default value -is the pre-merge centrum ('C-n') in 2-d or 3-d, -or three times that in other dimensions. If the outside width is -specified with option 'Wn ', the maximum, -default value for 'Vn' is 'Wn'.

    - -

    Qhull warns if 'Vn' is greater than 'Wn' and -furthest outside ('Qf') is not -selected; this combination usually results in flipped facets -(i.e., reversed normals).

    - -

    »Wn - min distance above -plane for outside points

    - -

    Points are added to the convex hull only if they are clearly -outside of a facet. A point is outside of a facet if its distance -to the facet is greater than 'Wn'. Without pre-merging, the -default value for 'Wn' is 'En '. If the user -specifies pre-merging and does not set 'Wn', than 'Wn' is set to -the maximum of 'C-n' and maxcoord*(1 - A-n).

    - -

    This option is good for approximating -a convex hull.

    - -

    Options 'Qc' and 'Qi' use the minimum vertex to -distinguish coplanar points from interior points.

    - -
    - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions

    - -
    - -

    The Geometry Center -Home Page

    - -

    Comments to: qhull@qhull.org -
    -Created: Sept. 25, 1995 --- Last modified: see top

    - - diff --git a/src/qhull/html/qh-optf.htm b/src/qhull/html/qh-optf.htm deleted file mode 100644 index 3c7a2b1db2e..00000000000 --- a/src/qhull/html/qh-optf.htm +++ /dev/null @@ -1,736 +0,0 @@ - - - - -Qhull format options (F) - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions

    -
    - -

    [delaunay] Qhull format options (F)

    - -

    This section lists the format options for Qhull. These options -are indicated by 'F' followed by a letter. See Output, Print, -and Geomview for other output -options.

    - -

    Copyright © 1995-2015 C.B. Barber

    - -
    - -

    » Programs - Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions

    - -

    Additional input & output formats

    - -

    These options allow for automatic processing of Qhull output. -Options 'i', 'o', -'n', and 'p' -may also be used.

    - -
    -
    -
    Summary and control -
    FA -
    compute total area and volume for option 's' - -
    FV -
    print average vertex (interior point for 'qhalf') -
    FQ -
    print command for qhull and input -
    FO -
    print options to stderr or stdout -
    FS -
    print sizes: total area and volume -
    Fs -
    print summary: dim, #points, total vertices and - facets, #vertices, #facets, max outer and inner plane -
    Fd -
    use format for input (offset first) -
    FD -
    use cdd format for normals (offset first) -
    FM -
    print Maple output (2-d and 3-d) -
    -
    -
    Facets, points, and vertices -
    Fa -
    print area for each facet -
    FC -
    print centrum for each facet -
    Fc -
    print coplanar points for each facet -
    Fx -
    print extreme points (i.e., vertices) of convex hull. - -
    FF -
    print facets w/o ridges -
    FI -
    print ID for each facet -
    Fi -
    print inner planes for each facet -
    Fm -
    print merge count for each facet (511 max) -
    FP -
    print nearest vertex for coplanar points -
    Fn -
    print neighboring facets for each facet -
    FN -
    print neighboring facets for each point -
    Fo -
    print outer planes for each facet -
    Ft -
    print triangulation with added points -
    Fv -
    print vertices for each facet -
    -
    -
    Delaunay, Voronoi, and halfspace -
    Fx -
    print extreme input sites of Delaunay triangulation - or Voronoi diagram. -
    Fp -
    print points at halfspace intersections -
    Fi -
    print separating hyperplanes for inner, bounded - Voronoi regions -
    Fo -
    print separating hyperplanes for outer, unbounded - Voronoi regions -
    Fv -
    print Voronoi diagram as ridges for each input pair -
    FC -
    print Voronoi vertex ("center") for each facet
    -
    - -
    - -

    »Fa - print area for each -facet

    - -

    The first line is the number of facets. The remaining lines -are the area for each facet, one facet per line. See 'FA' and 'FS' for computing the total area and volume.

    - -

    Use 'PAn' for printing the n -largest facets. Use option 'PFn' -for printing facets larger than n.

    - -

    For Delaunay triangulations, the area is the area of each -Delaunay triangle. For Voronoi vertices, the area is the area of -the dual facet to each vertex.

    - -

    Qhull uses the centrum and ridges to triangulate -non-simplicial facets. The area for non-simplicial facets is the -sum of the areas for each triangle. It is an approximation of the -actual area. The ridge's vertices are projected to the facet's -hyperplane. If a vertex is far below a facet (qh_WIDEcoplanar in user.h), -the corresponding triangles are ignored.

    - -

    For non-simplicial facets, vertices are often below the -facet's hyperplane. If so, the approximation is less than the -actual value and it may be significantly less.

    - -

    »FA - compute total area -and volume for option 's'

    - -

    With option 'FA', Qhull includes the total area and volume in -the summary ('s'). Option 'FS' also includes the total area and volume. -If facets are -merged, the area and volume are approximations. Option 'FA' is -automatically set for options 'Fa', 'PAn', and 'PFn'. -

    - -

    With 'qdelaunay s FA', Qhull computes the total area of -the Delaunay triangulation. This equals the volume of the convex -hull of the data points. With options 'qdelaunay Qu -s FA', Qhull computes the -total area of the furthest-site Delaunay triangulation. This -equals of the total area of the Delaunay triangulation.

    - -

    See 'Fa' for further details. Option 'FS' also computes the total area and volume.

    - -

    »Fc - print coplanar -points for each facet

    - -

    The output starts with the number of facets. Then each facet -is printed one per line. Each line is the number of coplanar -points followed by the point ids.

    - -

    By default, option 'Fc' reports coplanar points -('Qc'). You may also use -option 'Qi'. Options 'Qi Fc' prints -interior points while 'Qci Fc' prints both coplanar and interior -points. - -

    Each coplanar point or interior point is assigned to the -facet it is furthest above (resp., least below).

    - -

    Use 'Qc p' to print vertex and -coplanar point coordinates. Use 'Fv' -to print vertices.

    - -

    »FC - print centrum or -Voronoi vertex for each facet

    - -

    The output starts with the dimension followed by the number of -facets. Then each facet centrum is printed, one per line. For -qvoronoi, Voronoi vertices are -printed instead.

    - -

    »Fd - use cdd format for -input

    - -

    The input starts with comments. The first comment is reported -in the summary. Data starts after a "begin" line. The -next line is the number of points followed by the dimension plus -one and "real" or "integer". Then the points -are listed with a leading "1" or "1.0". The -data ends with an "end" line.

    - -

    For halfspaces ('qhalf Fd'), -the input format is the same. Each halfspace starts with its -offset. The signs of the offset and coefficients are the -opposite of Qhull's -convention. The first two lines of the input may be an interior -point in 'FV' format.

    - -

    »FD - use cdd format for -normals

    - -

    Option 'FD' prints normals ('n', 'Fo', 'Fi') or points ('p') in cdd format. The first line is the -command line that invoked Qhull. Data starts with a -"begin" line. The next line is the number of normals or -points followed by the dimension plus one and "real". -Then the normals or points are listed with the offset before the -coefficients. The offset for points is 1.0. For normals, -the offset and coefficients use the opposite sign from Qhull. -The data ends with an "end" line.

    - -

    »FF - print facets w/o -ridges

    - -

    Option 'FF' prints all fields of all facets (as in 'f') without printing the ridges. This is -useful in higher dimensions where a facet may have many ridges. -For simplicial facets, options 'FF' and 'f -' are equivalent.

    - -

    »Fi - print inner planes -for each facet

    - -

    The first line is the dimension plus one. The second line is -the number of facets. The remainder is one inner plane per line. -The format is the same as option 'n'.

    - -

    The inner plane is a plane that is below the facet's vertices. -It is an offset from the facet's hyperplane. It includes a -roundoff error for computing the vertex distance.

    - -

    Note that the inner planes for Geomview output ('Gi') include an additional offset for -vertex visualization and roundoff error.

    - -

    »Fi - print separating -hyperplanes for inner, bounded Voronoi regions

    - -

    With qvoronoi, 'Fi' prints the -separating hyperplanes for inner, bounded regions of the Voronoi -diagram. The first line is the number of ridges. Then each -hyperplane is printed, one per line. A line starts with the -number of indices and floats. The first pair of indices indicates -an adjacent pair of input sites. The next d floats are the -normalized coefficients for the hyperplane, and the last float is -the offset. The hyperplane is oriented toward 'QVn' (if defined), or the first input -site of the pair.

    - -

    Use 'Fo' for unbounded regions, -and 'Fv' for the corresponding -Voronoi vertices.

    - -

    Use 'Tv' to verify that the -hyperplanes are perpendicular bisectors. It will list relevant -statistics to stderr. The hyperplane is a perpendicular bisector -if the midpoint of the input sites lies on the plane, all Voronoi -vertices in the ridge lie on the plane, and the angle between the -input sites and the plane is ninety degrees. This is true if all -statistics are zero. Roundoff and computation errors make these -non-zero. The deviations appear to be largest when the -corresponding Delaunay triangles are large and thin; for example, -the Voronoi diagram of nearly cospherical points.

    - -

    »FI - print ID for each -facet

    - -

    Print facet identifiers. These are used internally and listed -with options 'f' and 'FF'. -Options 'Fn ' and 'FN' use -facet identifiers for negative indices.

    - -

    »Fm - print merge count -for each facet

    - -

    The first line is the number of facets. The remainder is the -number of merges for each facet, one per line. At most 511 merges -are reported for a facet. See 'PMn' -for printing the facets with the most merges.

    - -

    »FM - print Maple -output

    - -

    Qhull writes a Maple file for 2-d and 3-d convex hulls, -2-d and 3-d halfspace intersections, -and 2-d Delaunay triangulations. Qhull produces a 2-d -or 3-d plot. - -

    Warning: This option has not been tested in Maple. - -

    [From T. K. Abraham with help from M. R. Feinberg and N. Platinova.] -The following steps apply while working within the -Maple worksheet environment : -

      -
    1. Generate the data and store it as an array . For example, in 3-d, data generated -in Maple is of the form : x[i],y[i],z[i] -

      -

    2. Create a single variable and assign the entire array of data points to this variable. -Use the "seq" command within square brackets as shown in the following example. -(The square brackets are essential for the rest of the steps to work.) -

      ->data:=[seq([x[i],y[i],z[i]],i=1..n)]:# here n is the number of data points - -

    3. Next we need to write the data to a file to be read by qhull. Before -writing the data to a file, make sure that the qhull executable files and -the data file lie in the same subdirectory. If the executable files are -stored in the "C:\qhull3.1\" subdirectory, then save the file in the same -subdirectory, say "C:\qhull3.1\datafile.txt". For the sake of integrity of -the data file , it is best to first ensure that the data file does not -exist before writing into the data file. This can be done by running a -delete command first . To write the data to the file, use the "writedata" -and the "writedata[APPEND]" commands as illustrated in the following example : -

      ->system("del c:\\qhull3.1\\datafile.txt");#To erase any previous versions of the file -
      >writedata("c:\\qhull3.1\\datafile.txt ",[3, nops(data)]);#writing in qhull format -
      >writedata[APPEND]("c:\\ qhull3.1\\datafile.txt ", data);#writing the data points -

    4. -Use the 'FM' option to produce Maple output. Store the output as a ".mpl" file. -For example, using the file we created above, we type the following (in DOS environment) -

      -qconvex s FM <datafile.txt >dataplot.mpl - -

    5. -To read 3-d output in Maple, we use the 'read' command followed by -a 'display3d' command. For example (in Maple environment): -

      ->with (plots): -
      >read `c:\\qhull3.1\\dataplot.mpl`:#IMPORTANT - Note that the punctuation mark used is ' and NOT '. The correct punctuation mark is the one next to the key for "1" (not the punctuation mark near the enter key) -
      > qhullplot:=%: -
      > display3d(qhullplot); -

    - -

    For Delaunay triangulation orthogonal projection is better. - -

    For halfspace intersections, Qhull produces the dual -convex hull. - -

    See Is Qhull available for Maple? -for other URLs. - -

    »Fn - print neighboring -facets for each facet

    - -

    The output starts with the number of facets. Then each facet -is printed one per line. Each line is the number of neighbors -followed by an index for each neighbor. The indices match the -other facet output formats.

    - -

    For simplicial facets, each neighbor is opposite -the corresponding vertex (option 'Fv'). -Do not compare to option 'i'. Option 'i' -orients facets by reversing the order of two vertices. For non-simplicial facets, -the neighbors are unordered. - -

    A negative index indicates an unprinted facet due to printing -only good facets ('Pg', qdelaunay, -qvoronoi). It -is the negation of the facet's ID (option 'FI'). -For example, negative indices are used for facets "at -infinity" in the Delaunay triangulation.

    - -

    »FN - print neighboring -facets for each point

    - -

    The first line is the number of points. Then each point is -printed, one per line. For unassigned points (either interior or -coplanar), the line is "0". For assigned coplanar -points ('Qc'), the line is -"1" followed by the index of the facet that is furthest -below the point. For assigned interior points ('Qi'), the line is "1" -followed by the index of the facet that is least above the point. -For vertices that do not belong to good facet, the line is -"0"

    - -

    For vertices of good facets, the line is the number of -neighboring facets followed by the facet indices. The indices -correspond to the other 'F' formats. In 4-d -and higher, the facets are sorted by index. In 3-d, the facets -are in adjacency order (not oriented).

    - -

    A negative index indicates an unprinted facet due to printing -only good facets (qdelaunay, -qvoronoi, 'Pdk', -'Pg'). It is the negation of the -facet's ID (' FI'). For example, negative -indices are used for facets "at infinity" in the -Delaunay triangulation.

    - -

    For Voronoi vertices, option 'FN' lists the vertices of the -Voronoi region for each input site. Option 'FN' lists the regions -in site ID order. Option 'FN' corresponds to the second half of -option 'o'. To convert from 'FN' to 'o', replace negative indices with zero -and increment non-negative indices by one.

    - -

    If you are using the Qhull -library or C++ interface, option 'FN' has the side effect of reordering the -neighbors for a vertex

    - -

    »Fo - print outer planes -for each facet

    - -

    The first line is the dimension plus one. The second line is -the number of facets. The remainder is one outer plane per line. -The format is the same as option 'n'.

    - -

    The outer plane is a plane that is above all points. It is an -offset from the facet's hyperplane. It includes a roundoff error -for computing the point distance. When testing the outer plane -(e.g., 'Tv'), another roundoff error -should be added for the tested point.

    - -

    If outer planes are not checked ('Q5') -or not computed (!qh_MAXoutside), the maximum, computed outside -distance is used instead. This can be much larger than the actual -outer planes.

    - -

    Note that the outer planes for Geomview output ('G') include an additional offset for -vertex/point visualization, 'lines closer,' and roundoff error.

    - -

    »Fo - print separating -hyperplanes for outer, unbounded Voronoi regions

    - -

    With qvoronoi, 'Fo' prints the -separating hyperplanes for outer, unbounded regions of the -Voronoi diagram. The first line is the number of ridges. Then -each hyperplane is printed, one per line. A line starts with the -number of indices and floats. The first pair of indices indicates -an adjacent pair of input sites. The next d floats are the -normalized coefficients for the hyperplane, and the last float is -the offset. The hyperplane is oriented toward 'QVn' (if defined), or the first input -site of the pair.

    - -

    Option 'Fo' gives the hyperplanes for the unbounded rays of -the unbounded regions of the Voronoi diagram. Each hyperplane -goes through the midpoint of the corresponding input sites. The -rays are directed away from the input sites.

    - -

    Use 'Fi' for bounded regions, -and 'Fv' for the corresponding -Voronoi vertices. Use 'Tv' to verify -that the corresponding Voronoi vertices lie on the hyperplane.

    - -

    »FO - print list of -selected options

    - -

    Lists selected options and default values to stderr. -Additional 'FO's are printed to stdout.

    - -

    »Fp - print points at -halfspace intersections

    - -

    The first line is the number of intersection points. The -remainder is one intersection point per line. A intersection -point is the intersection of d or more halfspaces from -'qhalf'. It corresponds to a -facet of the dual polytope. The "infinity" point -[-10.101,-10.101,...] indicates an unbounded intersection.

    - -

    If [x,y,z] are the dual facet's normal coefficients and b<0 -is its offset, the halfspace intersection occurs at -[x/-b,y/-b,z/-b] plus the interior point. If b>=0, the -halfspace intersection is unbounded.

    - -

    »FP - print nearest -vertex for coplanar points

    - -

    The output starts with the number of coplanar points. Then -each coplanar point is printed one per line. Each line is the -point ID of the closest vertex, the point ID of the coplanar -point, the corresponding facet ID, and the distance. Sort the -lines to list the coplanar points nearest to each vertex.

    - -

    Use options 'Qc' and/or 'Qi' with 'FP'. Options 'Qc FP' prints -coplanar points while 'Qci FP' prints coplanar and interior -points. Option 'Qc' is automatically selected if 'Qi' is not -selected. - -

    For Delaunay triangulations (qdelaunay -or qvoronoi), a coplanar point is nearly -incident to a vertex. The distance is the distance in the -original point set.

    - -

    If imprecision problems are severe, Qhull will delete input -sites when constructing the Delaunay triangulation. Option 'FP' will -list these points along with coincident points.

    - -

    If there are many coplanar or coincident points and non-simplicial -facets are triangulated ('Qt'), option -'FP' may be inefficient. It redetermines the original vertex set -for each coplanar point.

    - -

    »FQ - print command for -qhull and input

    - -

    Prints qhull and input command, e.g., "rbox 10 s | qhull -FQ". Option 'FQ' may be repeated multiple times.

    - -

    »Fs - print summary

    - -

    The first line consists of number of integers ("10") -followed by the: -

      -
    • dimension -
    • number of points -
    • number of vertices -
    • number of facets -
    • number of vertices selected for output -
    • number of facets selected for output -
    • number of coplanar points for selected facets -
    • number of nonsimplicial or merged facets selected for - output -
    • number of deleted vertices
    • -
    • number of triangulated facets ('Qt')
    • -
    - -

    The second line consists of the number of reals -("2") followed by the: -

      -
    • maximum offset to an outer plane -
    • minimum offset to an inner plane.
    • -
    -Roundoff and joggle are included. -

    - -

    For Delaunay triangulations and Voronoi diagrams, the -number of deleted vertices should be zero. If greater than zero, then the -input is highly degenerate and coplanar points are not necessarily coincident -points. For example, 'RBOX 1000 s W1e-13 t995138628 | QHULL d Qbb' reports -deleted vertices; the input is nearly cospherical.

    - -

    Later versions of Qhull may produce additional integers or reals.

    - -

    »FS - print sizes

    - -

    The first line consists of the number of integers -("0"). The second line consists of the number of reals -("2"), followed by the total facet area, and the total -volume. Later versions of Qhull may produce additional integers -or reals.

    - -

    The total volume measures the volume of the intersection of -the halfspaces defined by each facet. It is computed from the -facet area. Both area and volume are approximations for -non-simplicial facets. See option 'Fa ' for -further notes. Option 'FA ' also computes the total area and volume.

    - -

    »Ft - print triangulation

    - -

    Prints a triangulation with added points for non-simplicial -facets. The output is

    - -
      -
    • The first line is the dimension -
    • The second line is the number of points, the number - of facets, and the number of ridges. -
    • All of the input points follow, one per line. -
    • The centrums follow, one per non-simplicial facet -
    • Then the facets follow as a list of point indices - preceded by the number of points. The simplices are - oriented.
    • -
    - -

    For convex hulls with simplicial facets, the output is the -same as option 'o'.

    - -

    The added points are the centrums of the non-simplicial -facets. Except for large facets, the centrum is the average -vertex coordinate projected to the facet's hyperplane. Large -facets may use an old centrum to avoid recomputing the centrum -after each merge. In either case, the centrum is clearly below -neighboring facets. See Precision issues. -

    - -

    The new simplices will not be clearly convex with their -neighbors and they will not satisfy the Delaunay property. They -may even have a flipped orientation. Use triangulated input ('Qt') for Delaunay triangulations. - -

    For Delaunay triangulations with simplicial facets, the output is the -same as option 'o' without the lifted -coordinate. Since 'Ft' is invalid for merged Delaunay facets, option -'Ft' is not available for qdelaunay or qvoronoi. It may be used with -joggled input ('QJ') or triangulated output ('Qt'), for example, rbox 10 c G 0.01 | qhull d QJ Ft

    - -

    If you add a point-at-infinity with 'Qz', -it is printed after the input sites and before any centrums. It -will not be used in a Delaunay facet.

    - -

    »Fv - print vertices for -each facet

    - -

    The first line is the number of facets. Then each facet is -printed, one per line. Each line is the number of vertices -followed by the corresponding point ids. Vertices are listed in -the order they were added to the hull (the last one added is the -first listed). -

    -

    Option 'i' also lists the vertices, -but it orients facets by reversing the order of two -vertices. Option 'i' triangulates non-simplicial, 4-d and higher facets by -adding vertices for the centrums. -

    - -

    »Fv - print Voronoi -diagram

    - -

    With qvoronoi, 'Fv' prints the -Voronoi diagram or furthest-site Voronoi diagram. The first line -is the number of ridges. Then each ridge is printed, one per -line. The first number is the count of indices. The second pair -of indices indicates a pair of input sites. The remaining indices -list the corresponding ridge of Voronoi vertices. Vertex 0 is the -vertex-at-infinity. It indicates an unbounded ray.

    - -

    All vertices of a ridge are coplanar. If the ridge is -unbounded, add the midpoint of the pair of input sites. The -unbounded ray is directed from the Voronoi vertices to infinity.

    - -

    Use 'Fo' for separating -hyperplanes of outer, unbounded regions. Use 'Fi' for separating hyperplanes of -inner, bounded regions.

    - -

    Option 'Fv' does not list ridges that require more than one -midpoint. For example, the Voronoi diagram of cospherical points -lists zero ridges (e.g., 'rbox 10 s | qvoronoi Fv Qz'). -Other examples are the Voronoi diagrams of a rectangular mesh -(e.g., 'rbox 27 M1,0 | qvoronoi Fv') or a point set with -a rectangular corner (e.g., -'rbox P4,4,4 P4,2,4 P2,4,4 P4,4,2 10 | qvoronoi Fv'). -Both cases miss unbounded rays at the corners. -To determine these ridges, surround the points with a -large cube (e.g., 'rbox 10 s c G2.0 | qvoronoi Fv Qz'). -The cube needs to be large enough to bound all Voronoi regions of the original point set. -Please report any other cases that are missed. If you -can formally describe these cases or -write code to handle them, please send email to qhull@qhull.org.

    - -

    »FV - print average -vertex

    - -

    The average vertex is the average of all vertex coordinates. -It is an interior point for halfspace intersection. The first -line is the dimension and "1"; the second line is the -coordinates. For example,

    - -
    -

    qconvex FV n | qhalf Fp

    -
    - -

    prints the extreme points of the original point set (roundoff -included).

    - -

    »Fx - print extreme -points (vertices) of convex hulls and Delaunay triangulations

    - -

    The first line is the number of points. The following lines -give the index of the corresponding points. The first point is -'0'.

    - -

    In 2-d, the extreme points (vertices) are listed in -counterclockwise order (by qh_ORIENTclock in user.h).

    - -

    In 3-d and higher convex hulls, the extreme points (vertices) -are sorted by index. This is the same order as option 'p' when it doesn't include coplanar or -interior points.

    - -

    For Delaunay triangulations, 'Fx' lists the extreme -points of the input sites (i.e., the vertices of their convex hull). The points -are unordered.

    - -
    - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions

    -
    - -

    The Geometry Center -Home Page

    - -

    Comments to: qhull@qhull.org -
    -Created: -Sept. 25, 1995 --- Last modified: see top -

    - - diff --git a/src/qhull/html/qh-optg.htm b/src/qhull/html/qh-optg.htm deleted file mode 100644 index a56e29df102..00000000000 --- a/src/qhull/html/qh-optg.htm +++ /dev/null @@ -1,274 +0,0 @@ - - - -Qhull Geomview options (G) - - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions

    - -
    - - -

    [delaunay] Qhull Geomview options (G)

    - -This section lists the Geomview options for Qhull. These options are -indicated by 'G' followed by a letter. See -Output, Print, -and Format for other output options. - - -

    Copyright © 1995-2015 C.B. Barber

    - -
    - -

    » Programs - Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions

    - -

    Geomview output options

    - -

    Geomview is the graphical -viewer for visualizing Qhull output in 2-d, 3-d and 4-d.

    - -

    Geomview displays each facet of the convex hull. The color of -a facet is determined by the coefficients of the facet's normal -equation. For imprecise hulls, Geomview displays the inner and -outer hull. Geomview can also display points, ridges, vertices, -coplanar points, and facet intersections.

    - -

    For 2-d Delaunay triangulations, Geomview displays the -corresponding paraboloid. Geomview displays the 2-d Voronoi -diagram. For halfspace intersections, it displays the -dual convex hull.

    - -
    -
     
    -
    General
    -
    G
    -
    display Geomview output
    -
    Gt
    -
    display transparent 3-d Delaunay triangulation
    -
    GDn
    -
    drop dimension n in 3-d and 4-d output
    - -
     
    -
     
    -
    Specific
    -
    Ga
    -
    display all points as dots
    -
    Gc
    -
    display centrums (2-d, 3-d)
    -
    Gp
    -
    display coplanar points and vertices as radii
    -
    Gh
    -
    display hyperplane intersections
    -
    Gi
    -
    display inner planes only (2-d, 3-d)
    -
    Go
    -
    display outer planes only (2-d, 3-d)
    -
    Gr
    -
    display ridges (3-d)
    -
    Gv
    -
    display vertices as spheres
    -
    Gn
    -
    do not display planes
    - -
    - -
    - -

    »G - produce output for -viewing with Geomview

    - -

    By default, option 'G' displays edges in 2-d, outer planes in -3-d, and ridges in 4-d.

    - -

    A ridge can be explicit or implicit. An explicit ridge is a (d-1)-dimensional -simplex between two facets. In 4-d, the explicit ridges are -triangles. An implicit ridge is the topological intersection of -two neighboring facets. It is the union of explicit ridges.

    - -

    For non-simplicial 4-d facets, the explicit ridges can be -quite complex. When displaying a ridge in 4-d, Qhull projects the -ridge's vertices to one of its facets' hyperplanes. Use 'Gh' to project ridges to the intersection of both -hyperplanes. This usually results in a cleaner display.

    - -

    For 2-d Delaunay triangulations, Geomview displays the -corresponding paraboloid. Geomview displays the 2-d Voronoi -diagram. For halfspace intersections, it displays the -dual convex hull. - -

    »Ga - display all -points as dots

    - -

    Each input point is displayed as a green dot.

    - -

    »Gc - display centrums -(3-d)

    - -

    The centrum is defined by a green radius sitting on a blue -plane. The plane corresponds to the facet's hyperplane. If you -sight along a facet's hyperplane, you will see that all -neighboring centrums are below the facet. The radius is defined -by 'C-n' or 'Cn'.

    - -

    »GDn - drop dimension -n in 3-d and 4-d output

    - -

    The result is a 2-d or 3-d object. In 4-d, this corresponds to -viewing the 4-d object from the nth axis without perspective. -It's best to view 4-d objects in pieces. Use the 'Pdk' 'Pg' -'PG' 'QGn' -and 'QVn' options to select a few -facets. If one of the facets is perpendicular to an axis, then -projecting along that axis will show the facet exactly as it is -in 4-d. If you generate many facets, use Geomview's ginsu -module to view the interior

    - -

    To view multiple 4-d dimensions at once, output the object -without 'GDn' and read it with Geomview's ndview. As you -rotate the object in one set of dimensions, you can see how it -changes in other sets of dimensions.

    - -

    For additional control over 4-d objects, output the object -without 'GDn' and read it with Geomview's 4dview. You -can slice the object along any 4-d plane. You can also flip the -halfspace that's deleted when slicing. By combining these -features, you can get some interesting cross sections.

    - -

    »Gh - display -hyperplane intersections (3-d, 4-d)

    - -

    In 3-d, the intersection is a black line. It lies on two -neighboring hyperplanes, c.f., the blue squares associated with -centrums ('Gc '). In 4-d, the ridges are -projected to the intersection of both hyperplanes. If you turn on -edges (Geomview's 'appearances' menu), each triangle corresponds -to one ridge. The ridges may overlap each other.

    - -

    »Gi - display inner -planes only (2-d, 3-d)

    - -

    The inner plane of a facet is below all of its vertices. It is -parallel to the facet's hyperplane. The inner plane's color is -the opposite of the outer plane's color, i.e., [1-r,1-g,1-b] . -Its edges are determined by the vertices.

    - -

    »Gn - do not display -planes

    - -

    By default, Geomview displays the precise plane (no merging) -or both inner and output planes (if merging). If merging, -Geomview does not display the inner plane if the the difference -between inner and outer is too small.

    - -

    »Go - display outer -planes only (2-d, 3-d)

    - -

    The outer plane of a facet is above all input points. It is -parallel to the facet's hyperplane. Its color is determined by -the facet's normal, and its edges are determined by the vertices.

    - -

    »Gp - display coplanar -points and vertices as radii

    - -

    Coplanar points ('Qc'), interior -points ('Qi'), outside points ('TCn' or 'TVn'), -and vertices are displayed as red and yellow radii. The radii are -perpendicular to the corresponding facet. Vertices are aligned -with an interior point. The radii define a ball which corresponds -to the imprecision of the point. The imprecision is the maximum -of the roundoff error, the centrum radius, and maxcoord * (1 - -A-n). It is at -least 1/20'th of the maximum coordinate, and ignores post merging -if pre-merging is done.

    - -

    If 'Gv' (print vertices as -spheres) is also selected, option 'Gp' displays coplanar -points as radii. Select options Qc' -and/or 'Qi'. Options 'Qc Gpv' displays -coplanar points while 'Qci Gpv' displays coplanar and interior -points. Option 'Qc' is automatically selected if 'Qi' is not -selected with options 'Gpv'. - -

    »Gr - display ridges -(3-d)

    - -

    A ridge connects the two vertices that are shared by -neighboring facets. It is displayed in green. A ridge is the -topological edge between two facets while the hyperplane -intersection is the geometric edge between two facets. Ridges are -always displayed in 4-d.

    - -

    »Gt - transparent 3-d -Delaunay

    - -

    A 3-d Delaunay triangulation looks like a convex hull with -interior facets. Option 'Gt' removes the outside ridges to reveal -the outermost facets. It automatically sets options 'Gr' and 'GDn'. See example eg.17f.delaunay.3.

    - -

    »Gv - display vertices -as spheres (2-d, 3-d)

    - -

    The radius of the sphere corresponds to the imprecision of the -data. See 'Gp' for determining the radius.

    - - - -
    - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions

    - - -
    - -

    The Geometry Center -Home Page

    - -

    Comments to: qhull@qhull.org -
    -Created: Sept. 25, 1995 --- Last modified: see top

    - - diff --git a/src/qhull/html/qh-opto.htm b/src/qhull/html/qh-opto.htm deleted file mode 100644 index e7b21745c1b..00000000000 --- a/src/qhull/html/qh-opto.htm +++ /dev/null @@ -1,353 +0,0 @@ - - - - -Qhull output options - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions

    - -
    - -

    [delaunay] Qhull output options

    - -

    This section lists the output options for Qhull. These options -are indicated by lower case characters. See Formats, Print, and Geomview for other output -options.

    - -

    Copyright © 1995-2015 C.B. Barber

    - -
    - -

    » Programs - Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions

    - -

    Output options

    - -

    Qhull prints its output to standard out. All output is printed -text. The default output is a summary (option 's'). -Other outputs may be specified as follows.

    - -
    -
    f
    -
    print all fields of all facets
    -
    n
    -
    print hyperplane normals with offsets
    -
    m
    -
    print Mathematica output (2-d and 3-d)
    -
    o
    -
    print OFF file format (dim, points and facets)
    -
    s
    -
    print summary to stderr
    -
    p
    -
    print vertex and point coordinates
    -
    i
    -
    print vertices incident to each facet
    -
     
    -
     
    -
    Related options
    -
    F
    -
    additional input/output formats
    -
    G
    -
    Geomview output
    -
    P
    -
    Print options
    -
    Ft
    -
    print triangulation with added points
    -
     
    -
    - -
    - -

    »f - print all fields of -all facets

    - -

    Print all fields of all facets. -The facet is the primary data structure for -Qhull. - -

    Option 'f' is for -debugging. Most of the fields are available via the 'F' options. If you need specialized -information from Qhull, you can use the Qhull library or C++ interface.

    - -

    Use the 'FF' option to print the -facets but not the ridges.

    - -

    »i - print vertices -incident to each facet

    - -

    The first line is the number of facets. The remaining lines -list the vertices for each facet, one facet per line. The indices -are 0-relative indices of the corresponding input points. The -facets are oriented. Option 'Fv' -displays an unoriented list of vertices with a vertex count per -line. Options 'o' and 'Ft' displays coordinates for each -vertex prior to the vertices for each facet.

    - -

    Simplicial facets (e.g., triangles in 3-d) consist of d -vertices. Non-simplicial facets in 3-d consist of 4 or more -vertices. For example, a facet of a cube consists of 4 vertices. -Use option 'Qt' to triangulate non-simplicial facets.

    - -

    For 4-d and higher convex hulls and 3-d and higher Delaunay -triangulations, d vertices are listed for all facets. A -non-simplicial facet is triangulated with its centrum and each -ridge. The index of the centrum is higher than any input point. -Use option 'Fv' to list the vertices -of non-simplicial facets as is. Use option 'Ft' to print the coordinates of the -centrums as well as those of the input points.

    - -

    »m - print Mathematica -output

    - -

    Qhull writes a Mathematica file for 2-d and 3-d convex hulls, -2-d and 3-d halfspace intersections, -and 2-d Delaunay triangulations. Qhull produces a list of -objects that you can assign to a variable in Mathematica, for -example: "list= << <outputfilename> ". -If the object is 2-d, it can be visualized by "Show[Graphics[list]] -". For 3-d objects the command is "Show[Graphics3D[list]] -". Now the object can be manipulated by commands of the -form "Show[%, <parametername> -> -<newvalue>]".

    - -

    For Delaunay triangulation orthogonal projection is better. -This can be specified, for example, by "BoxRatios: -Show[%, BoxRatios -> {1, 1, 1e-8}]". To see the -meaningful side of the 3-d object used to visualize 2-d Delaunay, -you need to change the viewpoint: "Show[%, ViewPoint --> {0, 0, -1}]". By specifying different viewpoints -you can slowly rotate objects.

    - -

    For halfspace intersections, Qhull produces the dual -convex hull. - -

    See Is Qhull available for Mathematica? -for URLs. - -

    »n - print hyperplane -normals with offsets

    - -

    The first line is the dimension plus one. The second line is -the number of facets. The remaining lines are the normals for -each facet, one normal per line. The facet's offset follows its -normal coefficients.

    - -

    The normals point outward, i.e., the convex hull satisfies Ax -<= -b where A is the matrix of coefficients and b -is the vector of offsets.

    - -

    A point is inside or below a hyperplane if its distance -to the hyperplane is negative. A point is outside or above a hyperplane -if its distance to the hyperplane is positive. Otherwise a point is on or -coplanar to the hyperplane. - -

    If cdd output is specified ('FD'), -Qhull prints the command line, the keyword "begin", the -number of facets, the dimension (plus one), the keyword -"real", and the normals for each facet. The facet's -negative offset precedes its normal coefficients (i.e., if the -origin is an interior point, the offset is positive). Qhull ends -the output with the keyword "end".

    - -

    »o - print OFF file format -

    - -

    The output is:

    - -
      -
    • The first line is the dimension
    • -
    • The second line is the number of points, the number of - facets, and the number of ridges.
    • -
    • All of the input points follow, one per line.
    • -
    • Then Qhull prints the vertices for each facet. Each facet - is on a separate line. The first number is the number of - vertices. The remainder is the indices of the - corresponding points. The vertices are oriented in 2-d, - 3-d, and in simplicial facets.
    • -
    - -

    Option 'Ft' prints the same -information with added points for non-simplicial facets.

    - -

    Option 'i' displays vertices -without the point coordinates. Option 'p' -displays the point coordinates without vertex and facet information.

    - -

    In 3-d, Geomview can load the file directly if you delete the -first line (e.g., by piping through 'tail +2').

    - -

    For Voronoi diagrams (qvoronoi), option -'o' prints Voronoi vertices and Voronoi regions instead of input -points and facets. The first vertex is the infinity vertex -[-10.101, -10.101, ...]. Then, option 'o' lists the vertices in -the Voronoi region for each input site. The regions appear in -site ID order. In 2-d, the vertices of a Voronoi region are -sorted by adjacency (non-oriented). In 3-d and higher, the -Voronoi vertices are sorted by index. See the 'FN' option for listing Voronoi regions -without listing Voronoi vertices.

    - -

    If you are using the Qhull library, options 'v o' have the -side effect of reordering the neighbors for a vertex.

    - -

    »p - print vertex and -point coordinates

    - -

    The first line is the dimension. The second line is the number -of vertices. The remaining lines are the vertices, one vertex per -line. A vertex consists of its point coordinates

    - -

    With the 'Gc' and 'Gi' options, option 'p' also prints -coplanar and interior points respectively.

    - -

    For qvoronoi, it prints the -coordinates of each Voronoi vertex.

    - -

    For qdelaunay, it prints the -input sites as lifted to a paraboloid. For qhalf -it prints the dual points. For both, option 'p' is the same as the first -section of option 'o'.

    - -

    Use 'Fx' to list the point ids of -the extreme points (i.e., vertices).

    - -

    If a subset of the facets is selected ('Pdk', 'PDk', -'Pg' options), option 'p' only -prints vertices and points associated with those facets.

    - -

    If cdd-output format is selected ('FD'), -the first line is "begin". The second line is the -number of vertices, the dimension plus one, and "real". -The vertices follow with a leading "1". Output ends -with "end".

    - -

    »s - print summary to -stderr

    - -

    The default output of Qhull is a summary to stderr. Options 'FS' and 'Fs' -produce the same information for programs. Note: Windows 95 and 98 -treats stderr the same as stdout. Use option 'TO file' to separate -stderr and stdout.

    - -

    The summary lists the number of input points, the dimension, -the number of vertices in the convex hull, and the number of -facets in the convex hull. It lists the number of selected -("good") facets for options 'Pg', -'Pdk', qdelaunay, -or qvoronoi (Delaunay triangulations only -use the lower half of a convex hull). It lists the number of -coplanar points. For Delaunay triangulations without 'Qc', it lists the total number of -coplanar points. It lists the number of simplicial facets in -the output.

    - -

    The terminology depends on the output structure.

    - -

    The summary lists these statistics:

    - -
      -
    • number of points processed by Qhull
    • -
    • number of hyperplanes created
    • -
    • number of distance tests (not counting statistics, - summary, and checking)
    • -
    • number of merged facets (if any)
    • -
    • number of distance tests for merging (if any)
    • -
    • CPU seconds to compute the hull
    • -
    • the maximum joggle for 'QJ'
      - or, the probability of precision errors for 'QJ TRn' -
    • -
    • total area and volume (if computed, see 'FS' 'FA' - 'Fa' 'PAn')
    • -
    • max. distance of a point above a facet (if non-zero)
    • -
    • max. distance of a vertex below a facet (if non-zero)
    • -
    - -

    The statistics include intermediate hulls. For example 'rbox d -D4 | qhull' reports merged facets even though the final hull is -simplicial.

    - -

    Qhull starts counting CPU seconds after it has read and -projected the input points. It stops counting before producing -output. In the code, CPU seconds measures the execution time of -function qhull() in libqhull.c. If the number of CPU -seconds is clearly wrong, check qh_SECticks in user.h.

    - -

    The last two figures measure the maximum distance from a point -or vertex to a facet. They are not printed if less than roundoff -or if not merging. They account for roundoff error in computing -the distance (c.f., option 'Rn'). -Use 'Fs' to report the maximum outer -and inner plane.

    - -

    A number may appear in parentheses after the maximum distance -(e.g., 2.1x). It is the ratio between the maximum distance and -the worst-case distance due to merging two simplicial facets. It -should be small for 2-d, 3-d, and 4-d, and for higher dimensions -with 'Qx'. It is not printed if less -than 0.05.

    - -
    - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions

    - -
    - -

    The Geometry Center -Home Page

    - -

    Comments to: qhull@qhull.org -
    -Created: Sept. 25, 1995 --- Last modified: see top

    - - diff --git a/src/qhull/html/qh-optp.htm b/src/qhull/html/qh-optp.htm deleted file mode 100644 index 9c6df90f5a8..00000000000 --- a/src/qhull/html/qh-optp.htm +++ /dev/null @@ -1,253 +0,0 @@ - - - - -Qhull print options (P) - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions

    - -
    - -

    [delaunay] Qhull print options (P)

    - -This section lists the print options for Qhull. These options are -indicated by 'P' followed by a letter. See -Output, Geomview, -and Format for other output options. - - -

    Copyright © 1995-2015 C.B. Barber

    - -
    - -

    » Programs - Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions

    - -

    Print options

    -
    -
    -
     
    -
    General
    -
    Pp
    -
    do not report precision problems
    -
    Po
    -
    force output despite precision problems
    -
    Po
    -
    if error, output neighborhood of facet
    -
     
    -
     
    -
    Select
    -
    Pdk:n
    -
    print facets with normal[k] >= n (default 0.0)
    -
    PDk:n
    -
    print facets with normal[k] <= n
    -
    PFn
    -
    print facets whose area is at least n
    -
    Pg
    -
    print good facets only (needs 'QGn' - or 'QVn ')
    -
    PMn
    -
    print n facets with most merges
    -
    PAn
    -
    print n largest facets by area
    -
    PG
    -
    print neighbors of good facets
    -
    -
    -
    - -

    »PAn - keep n largest -facets by area

    - -

    The n largest facets are marked good for printing. This -may be useful for approximating -a hull. Unless 'PG' is set, 'Pg' -is automatically set.

    - -

    »Pdk:n - print facet if -normal[k] >= n

    - -

    For a given output, print only those facets with normal[k] >= n -and drop the others. For example, 'Pd0:0.5' prints facets with normal[0] ->= 0.5 . The default value of n is zero. For -example in 3-d, 'Pd0d1d2' prints facets in the positive octant. -

    -If no facets match, the closest facet is returned.

    -

    -On Windows 95, do not combine multiple options. A 'd' is considered -part of a number. For example, use 'Pd0:0.5 Pd1:0.5' instead of -'Pd0:0.5d1:0.5'. - -

    »PDk:n - print facet if -normal[k] <= n

    - -

    For a given output, print only those facets with normal[k] <= n -and drop the others. -For example, 'PD0:0.5' prints facets with normal[0] -<= 0.5 . The default value of n is zero. For -example in 3-d, 'PD0D1D2' displays facets in the negative octant. -

    -If no facets match, the closest facet is returned.

    - -

    In 2-d, 'd G PD2' displays the Delaunay triangulation instead -of the corresponding paraboloid.

    - -

    Be careful of placing 'Dk' or 'dk' immediately after a real -number. Some compilers treat the 'D' as a double precision -exponent.

    - -

    »PFn - keep facets whose -area is at least n

    - -

    The facets with area at least n are marked good for -printing. This may be useful for approximating a hull. Unless -'PG' is set, 'Pg' is -automatically set.

    - -

    »Pg - print good facets

    - -

    Qhull can mark facets as "good". This is used to

    - -
      -
    • mark the lower convex hull for Delaunay triangulations - and Voronoi diagrams
    • -
    • mark the facets that are visible from a point (the 'QGn ' option)
    • -
    • mark the facets that contain a point (the 'QVn' option).
    • -
    • indicate facets with a large enough area (options 'PAn' and 'PFn')
    • -
    - -

    Option 'Pg' only prints good facets that -also meet 'Pdk' and 'PDk' -options. It is automatically set for options 'PAn', -'PFn ', 'QGn', -and 'QVn'.

    - -

    »PG - print neighbors of -good facets

    - -

    Option 'PG' can be used with or without option 'Pg' -to print the neighbors of good facets. For example, options 'QGn' and 'QVn' -print the horizon facets for point n.

    - -

    »PMn - keep n facets with -most merges

    - -

    The n facets with the most merges are marked good for -printing. This may be useful for approximating a hull. Unless -'PG' is set, 'Pg' is -automatically set.

    - -

    Use option 'Fm' to print merges -per facet. - -

    »Po - force output despite -precision problems

    - -

    Use options 'Po' and 'Q0' if you -can not merge facets, triangulate the output ('Qt'), -or joggle the input (QJ). - -

    Option 'Po' can not force output when -duplicate ridges or duplicate facets occur. It may produce -erroneous results. For these reasons, merged facets, joggled input, or exact arithmetic are better.

    - -

    If you need a simplicial Delaunay triangulation, use -joggled input 'QJ' or triangulated -output 'Ft'. - -

    Option 'Po' may be used without 'Q0' -to remove some steps from Qhull or to output the neighborhood of -an error.

    - -

    Option 'Po' may be used with option 'Q5') -to skip qh_check_maxout (i.e., do not determine the maximum outside distance). -This can save a significant amount of time. - -

    If option 'Po' is used,

    - -
      -
    • most precision errors allow Qhull to continue.
    • -
    • verify ('Tv') does not check - coplanar points.
    • -
    • points are not partitioned into flipped facets and a - flipped facet is always visible to a point. This may - delete flipped facets from the output.
    • -
    - -

    »Po - if error, output -neighborhood of facet

    - -

    If an error occurs before the completion of Qhull and tracing -is not active, 'Po' outputs a neighborhood of the erroneous -facets (if any). It uses the current output options.

    - -

    See 'Po' - force output despite -precision problems. - -

    »Pp - do not report -precision problems

    - -

    With option 'Pp', Qhull does not print statistics about -precision problems, and it removes some of the warnings. It -removes the narrow hull warning.

    - - -
    - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions

    - -
    - -

    The Geometry Center -Home Page

    - -

    Comments to: qhull@qhull.org -
    -Created: Sept. 25, 1995 --- Last modified: see top

    - - diff --git a/src/qhull/html/qh-optq.htm b/src/qhull/html/qh-optq.htm deleted file mode 100644 index 2edbb1fd430..00000000000 --- a/src/qhull/html/qh-optq.htm +++ /dev/null @@ -1,731 +0,0 @@ - - - - -Qhull control options (Q) - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions

    - -
    - -

    [delaunay] Qhull control options (Q)

    - -

    This section lists the control options for Qhull. These -options are indicated by 'Q' followed by a letter.

    - -

    Copyright © 1995-2015 C.B. Barber

    - -
    - -

    » Programs - Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions

    - -

    Qhull control options

    - -
    -
     
    -
    General
    -
    Qu
    -
    compute upper hull for furthest-site Delaunay - triangulation
    -
    Qc
    -
    keep coplanar points with nearest facet
    -
    Qi
    -
    keep interior points with nearest facet
    -
    QJ
    -
    joggled input to avoid precision problems
    -
    Qt
    -
    triangulated output
    -
     
    -
     
    -
    Precision handling
    -
    Qz
    -
    add a point-at-infinity for Delaunay triangulations
    -
    Qx
    -
    exact pre-merges (allows coplanar facets)
    -
    Qs
    -
    search all points for the initial simplex
    -
    Qbb
    -
    scale last coordinate to [0,m] for Delaunay
    -
    Qv
    -
    test vertex neighbors for convexity
    -
     
    -
     
    -
    Transform input
    -
    Qbk:0Bk:0
    -
    drop dimension k from input
    -
    QRn
    -
    random rotation (n=seed, n=0 time, n=-1 time/no rotate)
    -
    Qbk:n
    -
    scale coord[k] to low bound of n (default -0.5)
    -
    QBk:n
    -
    scale coord[k] to upper bound of n (default 0.5)
    -
    QbB
    -
    scale input to fit the unit cube
    -
     
    -
     
    -
    Select facets
    -
    QVn
    -
    good facet if it includes point n, -n if not
    -
    QGn
    -
    good facet if visible from point n, -n for not visible
    -
    Qg
    -
    only build good facets (needs 'QGn', 'QVn ', or 'Pdk')
    -
     
    -
     
    -
    Experimental
    -
    Q4
    -
    avoid merging old facets into new facets
    -
    Q5
    -
    do not correct outer planes at end of qhull
    -
    Q3
    -
    do not merge redundant vertices
    -
    Q6
    -
    do not pre-merge concave or coplanar facets
    -
    Q0
    -
    do not pre-merge facets with 'C-0' or 'Qx'
    -
    Q8
    -
    ignore near-interior points
    -
    Q2
    -
    merge all non-convex at once instead of independent sets
    -
    Qf
    -
    partition point to furthest outside facet
    -
    Q7
    -
    process facets depth-first instead of breadth-first
    -
    Q9
    -
    process furthest of furthest points
    -
    Q10
    -
    no special processing for narrow distributions
    -
    Q11
    -
    copy normals and recompute centrums for tricoplanar facets
    -
    Q12
    -
    do not error on wide merge due to duplicate ridge and nearly coincident points
    -
    Qm
    -
    process points only if they would increase the max. outer - plane
    -
    Qr
    -
    process random outside points instead of furthest one
    -
    Q1
    -
    sort merges by type instead of angle
    -
    - -
    - -

    »Qbb - scale the last -coordinate to [0,m] for Delaunay

    - -

    After scaling with option 'Qbb', the lower bound of the last -coordinate will be 0 and the upper bound will be the maximum -width of the other coordinates. Scaling happens after projecting -the points to a paraboloid and scaling other coordinates.

    - -

    Option 'Qbb' is automatically set for qdelaunay -and qvoronoi. Option 'Qbb' is automatically set for joggled input 'QJ'.

    - -

    Option 'Qbb' should be used for Delaunay triangulations with -integer coordinates. Since the last coordinate is the sum of -squares, it may be much larger than the other coordinates. For -example, rbox 10000 D2 B1e8 | qhull d has precision -problems while rbox 10000 D2 B1e8 | qhull d Qbb is OK.

    - -

    »QbB - scale the input to -fit the unit cube

    - -

    After scaling with option 'QbB', the lower bound will be -0.5 -and the upper bound +0.5 in all dimensions. For different bounds -change qh_DEFAULTbox in user.h (0.5 is best for Geomview).

    - -

    For Delaunay and Voronoi diagrams, scaling happens after -projection to the paraboloid. Under precise arithmetic, scaling -does not change the topology of the convex hull. Scaling may -reduce precision errors if coordinate values vary widely.

    - -

    »Qbk:n - scale coord[k] -to low bound

    - -

    After scaling, the lower bound for dimension k of the input -points will be n. 'Qbk' scales coord[k] to -0.5.

    - -

    »QBk:n - scale coord[k] -to upper bound

    - -

    After scaling, the upper bound for dimension k of the input -points will be n. 'QBk' scales coord[k] to 0.5.

    - -

    »Qbk:0Bk:0 - drop -dimension k from the input points

    - -

    Drop dimension k from the input points. For example, -'Qb1:0B1:0' deletes the y-coordinate from all input points. This -allows the user to take convex hulls of sub-dimensional objects. -It happens before the Delaunay and Voronoi transformation. -It happens after the halfspace transformation for both the data -and the feasible point.

    - -

    »Qc - keep coplanar points -with nearest facet

    - -

    During construction of the hull, a point is coplanar if it is -between 'Wn' above and 'Un' below a facet's hyperplane. A -different definition is used for output from Qhull.

    - -

    For output, a coplanar point is above the minimum vertex -(i.e., above the inner plane). With joggle ('QJ'), a coplanar point includes points -within one joggle of the inner plane.

    - -

    With option 'Qc', output formats 'p ', -'f', 'Gp', -'Fc', 'FN', -and 'FP' will print the coplanar -points. With options 'Qc Qi' these outputs -include the interior points.

    - -

    For Delaunay triangulations (qdelaunay -or qvoronoi), a coplanar point is a point -that is nearly incident to a vertex. All input points are either -vertices of the triangulation or coplanar.

    - -

    Qhull stores coplanar points with a facet. While constructing -the hull, it retains all points within qh_RATIOnearInside -(user.h) of a facet. In qh_check_maxout(), it uses these points -to determine the outer plane for each facet. With option 'Qc', -qh_check_maxout() retains points above the minimum vertex for the -hull. Other points are removed. If qh_RATIOnearInside is wrong or -if options 'Q5 Q8' are set, a -coplanar point may be missed in the output (see Qhull limitations).

    - -

    »Qf - partition point to -furthest outside facet

    - -

    After adding a new point to the convex hull, Qhull partitions -the outside points and coplanar points of the old, visible -facets. Without the 'f ' option and -merging, it assigns a point to the first facet that it is outside -('Wn'). When merging, it assigns a -point to the first facet that is more than several times outside -(see qh_DISToutside in user.h).

    - -

    If option 'Qf' is selected, Qhull performs a directed search -(no merging) or an exhaustive search (merging) of new facets. -Option 'Qf' may reduce precision errors if pre-merging does not -occur.

    - -

    Option 'Q9' processes the furthest of all -furthest points.

    - -

    »Qg - only build good -facets (needs 'QGn' 'QVn' or 'Pdk')

    - -

    Qhull has several options for defining and printing good -facets. With the 'Qg' option, Qhull will only -build those facets that it needs to determine the good facets in -the output. This may speed up Qhull in 2-d and 3-d. It is -useful for furthest-site Delaunay -triangulations (qdelaunay Qu, -invoke with 'qhull d Qbb Qu Qg'). -It is not effective in higher -dimensions because many facets see a given point and contain a -given vertex. It is not guaranteed to work for all combinations.

    - -

    See 'QGn', 'QVn', and 'Pdk' for defining good facets, and 'Pg' and 'PG' -for printing good facets and their neighbors. If pre-merging ('C-n') is not used and there are -coplanar facets, then 'Qg Pg' may produce a different result than -'Pg'.

    - -

    »QGn - good facet if -visible from point n, -n for not visible

    - -

    With option 'QGn', a facet is good (see 'Qg' -and 'Pg') if it is visible from -point n. If n < 0, a facet is good if it is not visible -from point n. Point n is not added to the hull (unless 'TCn' or 'TPn').

    - -

    With rbox, use the 'Pn,m,r' option -to define your point; it will be point 0 ('QG0').

    - -

    »Qi - keep interior points -with nearest facet

    - -

    Normally Qhull ignores points that are clearly interior to the -convex hull. With option 'Qi', Qhull treats interior points the -same as coplanar points. Option 'Qi' does not retain coplanar -points. You will probably want 'Qc ' as well.

    - -

    Option 'Qi' is automatically set for 'qdelaunay -Qc' and 'qvoronoi -Qc'. If you use -'qdelaunay Qi' or 'qvoronoi -Qi', option 's' reports all nearly -incident points while option 'Fs' -reports the number of interior points (should always be zero).

    - -

    With option 'Qi', output formats 'p', -'f','Gp', -'Fc', 'FN', -and 'FP' include interior points.

    - -

    »QJ or QJn - joggled -input to avoid precision errors

    - -

    Option 'QJ' or 'QJn' joggles each input coordinate by adding a -random number in the range [-n,n]. If a precision error occurs, -It tries again. If precision errors still occur, Qhull increases n -ten-fold and tries again. The maximum value for increasing n -is 0.01 times the maximum width of the input. Option 'QJ' selects -a default value for n. User.h -defines these parameters and a maximum number of retries. See Merged facets or joggled input.

    - -

    Users of joggled input should consider converting to -triangulated output ('Qt'). Triangulated output is -approximately 1000 times more accurate than joggled input. - -

    Option 'QJ' also sets 'Qbb' for -Delaunay triangulations and Voronoi diagrams. It does not set -'Qbb' if 'Qbk:n' or 'QBk:n' are set.

    - -

    If 'QJn' is set, Qhull does not merge facets unless requested -to. All facets are simplicial (triangular in 2-d). This may be -important for your application. You may also use triangulated output -('Qt') or Option 'Ft'. - -

    Qhull adjusts the outer and inner planes for 'QJn' ('Fs'). They are increased by sqrt(d)*n -to account for the maximum distance between a joggled point and -the corresponding input point. Coplanar points ('Qc') require an additional sqrt(d)*n -since vertices and coplanar points may be joggled in opposite -directions.

    - -

    For Delaunay triangulations (qdelaunay), joggle -happens before lifting the input sites to a paraboloid. Instead of -'QJ', you may use triangulated output ('Qt')

    - -

    This option is deprecated for Voronoi diagrams (qvoronoi). -It triangulates cospherical points, leading to duplicated Voronoi vertices.

    - -

    By default, 'QJn' uses a fixed random number seed. To use time -as the random number seed, select 'QR-1'. -The summary ('s') will show the -selected seed as 'QR-n'. - -

    With 'QJn', Qhull does not error on degenerate hyperplane -computations. Except for Delaunay and Voronoi computations, Qhull -does not error on coplanar points.

    - -

    Use option 'FO' to display the -selected options. Option 'FO' displays the joggle and the joggle -seed. If Qhull restarts, it will redisplay the options.

    - -

    Use option 'TRn' to estimate the -probability that Qhull will fail for a given 'QJn'. - -

    »Qm - only process points -that increase the maximum outer plane

    - -

    Qhull reports the maximum outer plane in its summary ('s'). With option 'Qm', Qhull does not -process points that are below the current, maximum outer plane. -This is equivalent to always adjusting 'Wn -' to the maximum distance of a coplanar point to a facet. It -is ignored for points above the upper convex hull of a Delaunay -triangulation. Option 'Qm' is no longer important for merging.

    - -

    »Qr - process random -outside points instead of furthest ones

    - -

    Normally, Qhull processes the furthest point of a facet's -outside points. Option 'Qr' instead selects a random outside -point for processing. This makes Qhull equivalent to the -randomized incremental algorithms.

    - -

    The original randomization algorithm by Clarkson and Shor ['89] used a conflict list which -is equivalent to Qhull's outside set. Later randomized algorithms -retained the previously constructed facets.

    - -

    To compare Qhull to the randomized algorithms with option -'Qr', compare "hyperplanes constructed" and -"distance tests". Qhull does not report CPU time -because the randomization is inefficient.

    - -

    »QRn - random rotation

    - -

    Option 'QRn' randomly rotates the input. For Delaunay -triangulations (qdelaunay or qvoronoi), -it rotates the lifted points about -the last axis.

    - -

    If n=0, use time as the random number seed. If n>0, -use n as the random number seed. If n=-1, don't rotate -but use time as the random number seed. If n<-1, -don't rotate but use n as the random number seed.

    - -

    »Qs - search all points -for the initial simplex

    - -

    Qhull constructs an initial simplex from d+1 points. It -selects points with the maximum and minimum coordinates and -non-zero determinants. If this fails, it searches all other -points. In 8-d and higher, Qhull selects points with the minimum -x or maximum coordinate (see qh_initialvertices in poly2.c ). -It rejects points with nearly zero determinants. This should work -for almost all input sets.

    - -

    If Qhull can not construct an initial simplex, it reports a -descriptive message. Usually, the point set is degenerate and one -or more dimensions should be removed ('Qbk:0Bk:0'). -If not, use option 'Qs'. It performs an exhaustive search for the -best initial simplex. This is expensive is high dimensions.

    - -

    »Qt - triangulated output

    - -

    By default, qhull merges facets to handle precision errors. This -produces non-simplicial facets (e.g., the convex hull of a cube has 6 square -facets). Each facet is non-simplicial because it has four vertices. - -

    Use option 'Qt' to triangulate all non-simplicial facets before generating -results. Alternatively, use joggled input ('QJ') to -prevent non-simplical facets. Unless 'Pp' is set, -qhull produces a warning if 'QJ' and 'Qt' are used together. - -

    For Delaunay triangulations (qdelaunay), triangulation -occurs after lifting the input sites to a paraboloid and computing the convex hull. -

    - -

    Option 'Qt' is deprecated for Voronoi diagrams (qvoronoi). -It triangulates cospherical points, leading to duplicated Voronoi vertices.

    - -

    Option 'Qt' may produce degenerate facets with zero area.

    - -

    Facet area and hull volumes may differ with and without -'Qt'. The triangulations are different and different triangles -may be ignored due to precision errors. - -

    With sufficient merging, the ridges of a non-simplicial facet may share more than two neighboring facets. If so, their triangulation ('Qt') will fail since two facets have the same vertex set.

    - -

    »Qu - compute upper hull -for furthest-site Delaunay triangulation

    - -

    When computing a Delaunay triangulation (qdelaunay -or qvoronoi), -Qhull computes both the the convex hull of points on a -paraboloid. It normally prints facets of the lower hull. These -correspond to the Delaunay triangulation. With option 'Qu', Qhull -prints facets of the upper hull. These correspond to the furthest-site Delaunay triangulation -and the furthest-site Voronoi diagram.

    - -

    Option 'qhull d Qbb Qu Qg' may improve the speed of option -'Qu'. If you use the Qhull library, a faster method is 1) use -Qhull to compute the convex hull of the input sites; 2) take the -extreme points (vertices) of the convex hull; 3) add one interior -point (e.g., -'FV', the average of d extreme points); 4) run -'qhull d Qbb Qu' or 'qhull v Qbb Qu' on these points.

    - -

    »Qv - test vertex -neighbors for convexity

    - -

    Normally, Qhull tests all facet neighbors for convexity. -Non-neighboring facets which share a vertex may not satisfy the -convexity constraint. This occurs when a facet undercuts the -centrum of another facet. They should still be convex. Option -'Qv' extends Qhull's convexity testing to all neighboring facets -of each vertex. The extra testing occurs after the hull is -constructed..

    - -

    »QVn - good facet if it -includes point n, -n if not

    - -

    With option 'QVn', a facet is good ('Qg', -'Pg') if one of its vertices is -point n. If n<0, a good facet does not include point n. - -

    If options 'PG' -and 'Qg' are not set, option 'Pg' -(print only good) -is automatically set. -

    - -

    Option 'QVn' behaves oddly with options 'Fx' -and 'qvoronoi Fv'. - -

    If used with option 'Qg' (only process good facets), point n is -either in the initial simplex or it is the first -point added to the hull. Options 'QVn Qg' require either 'QJ' or -'Q0' (no merging).

    - -

    »Qx - exact pre-merges -(allows coplanar facets)

    - -

    Option 'Qx' performs exact merges while building the hull. -Option 'Qx' is set by default in 5-d and higher. Use option 'Q0' to not use 'Qx' by default. Unless otherwise -specified, option 'Qx' sets option 'C-0'. -

    - -

    The "exact" merges are merging a point into a -coplanar facet (defined by 'Vn ', 'Un', and 'C-n'), -merging concave facets, merging duplicate ridges, and merging -flipped facets. Coplanar merges and angle coplanar merges ('A-n') are not performed. Concavity -testing is delayed until a merge occurs.

    - -

    After the hull is built, all coplanar merges are performed -(defined by 'C-n' and 'A-n'), then post-merges are performed -(defined by 'Cn' and 'An'). If facet progress is logged ('TFn'), Qhull reports each phase and -prints intermediate summaries and statistics ('Ts').

    - -

    Without 'Qx' in 5-d and higher, options 'C-n' and 'A-n' -may merge too many facets. Since redundant vertices are not -removed effectively, facets become increasingly wide.

    - -

    Option 'Qx' may report a wide facet. With 'Qx', coplanar -facets are not merged. This can produce a "dent" in an -intermediate hull. If a point is partitioned into a dent and it -is below the surrounding facets but above other facets, one or -more wide facets will occur. In practice, this is unlikely. To -observe this effect, run Qhull with option 'Q6' -which doesn't pre-merge concave facets. A concave facet makes a -large dent in the intermediate hull.

    - -

    Option 'Qx' may set an outer plane below one of the input -points. A coplanar point may be assigned to the wrong facet -because of a "dent" in an intermediate hull. After -constructing the hull, Qhull double checks all outer planes with -qh_check_maxout in poly2.c . If a coplanar point is -assigned to the wrong facet, qh_check_maxout may reach a local -maximum instead of locating all coplanar facets. This appears to -be unlikely.

    - -

    »Qz - add a -point-at-infinity for Delaunay triangulations

    - -

    Option 'Qz' adds a point above the paraboloid of lifted sites -for a Delaunay triangulation. It allows the Delaunay -triangulation of cospherical sites. It reduces precision errors -for nearly cospherical sites.

    - -

    »Q0 - no merging with C-0 -and Qx

    - -

    Turn off default merge options 'C-0' -and 'Qx'.

    - -

    With 'Q0' and without other pre-merge options, Qhull ignores -precision issues while constructing the convex hull. This may -lead to precision errors. If so, a descriptive warning is -generated. See Precision issues.

    - -

    »Q1 - sort merges by type -instead of angle

    - -

    Qhull sorts the coplanar facets before picking a subset of the -facets to merge. It merges concave and flipped facets first. Then -it merges facets that meet at a steep angle. With 'Q1', Qhull -sorts merges by type (coplanar, angle coplanar, concave) instead -of by angle. This may make the facets wider.

    - -

    »Q2 - merge all non-convex -at once instead of independent sets

    - -

    With 'Q2', Qhull merges all facets at once instead of -performing merges in independent sets. This may make the facets -wider.

    - -

    »Q3 - do not merge -redundant vertices

    - -

    With 'Q3', Qhull does not remove redundant vertices. In 6-d -and higher, Qhull never removes redundant vertices (since -vertices are highly interconnected). Option 'Q3' may be faster, -but it may result in wider facets. Its effect is easiest to see -in 3-d and 4-d.

    - -

    »Q4 - avoid merging old -facets into new facets

    - -

    With 'Q4', Qhull avoids merges of an old facet into a new -facet. This sometimes improves facet width and sometimes makes it -worse.

    - -

    »Q5 - do not correct outer -planes at end of qhull

    - -

    When merging facets or approximating a hull, Qhull tests -coplanar points and outer planes after constructing the hull. It -does this by performing a directed search (qh_findbest in geom.c). -It includes points that are just inside the hull.

    - -

    With options 'Q5' or 'Po', Qhull -does not test outer planes. The maximum outer plane is used -instead. Coplanar points ('Qc') are defined by -'Un'. An input point may be outside -of the maximum outer plane (this appears to be unlikely). An -interior point may be above 'Un' -from a hyperplane.

    - -

    Option 'Q5' may be used if outer planes are not needed. Outer -planes are needed for options 's', 'G', 'Go ', -'Fs', 'Fo', -'FF', and 'f'.

    - -

    »Q6 - do not pre-merge -concave or coplanar facets

    - -

    With 'Q6', Qhull does not pre-merge concave or coplanar -facets. This demonstrates the effect of "dents" when -using 'Qx'.

    - -

    »Q7 - depth-first -processing instead of breadth-first

    - -

    With 'Q7', Qhull processes facets in depth-first order instead -of breadth-first order. This may increase the locality of -reference in low dimensions. If so, Qhull may be able to use -virtual memory effectively.

    - -

    In 5-d and higher, many facets are visible from each -unprocessed point. So each iteration may access a large -proportion of allocated memory. This makes virtual memory -ineffectual. Once real memory is used up, Qhull will spend most -of its time waiting for I/O.

    - -

    Under 'Q7', Qhull runs slower and the facets may be wider.

    - -

    »Q8 - ignore near-interior -points

    - -

    With 'Q8' and merging, Qhull does not process interior points -that are near to a facet (as defined by qh_RATIOnearInside in -user.h). This avoids partitioning steps. It may miss a coplanar -point when adjusting outer hulls in qh_check_maxout(). The best -value for qh_RATIOnearInside is not known. Options 'Q8 Qc' may be sufficient.

    - -

    »Q9 - process furthest of -furthest points

    - -

    With 'Q9', Qhull processes the furthest point of all outside -sets. This may reduce precision problems. The furthest point of -all outside sets is not necessarily the furthest point from the -convex hull.

    - -

    »Q10 - no special processing -for narrow distributions

    - -

    With 'Q10', Qhull does not special-case narrow distributions. -See Limitations of merged facets for -more information. - -

    »Q11 - copy normals and recompute -centrums for -tricoplanar facets

    - -Option 'Qt' triangulates non-simplicial facets -into "tricoplanar" facets. -Normally tricoplanar facets share the same normal, centrum, and -Voronoi vertex. They can not be merged or replaced. With -option 'Q11', Qhull duplicates the normal and Voronoi vertex. -It recomputes the centrum. - -

    Use 'Q11' if you use the Qhull library to add points -incrementally and call qh_triangulate() after each point. -Otherwise, Qhull will report an error when it tries to -merge and replace a tricoplanar facet. - -

    With sufficient merging and new points, option 'Q11' may -lead to precision problems such -as duplicate ridges and concave facets. For example, if qh_triangulate() -is added to qh_addpoint(), RBOX 1000 s W1e-12 t1001813667 P0 | QHULL d Q11 Tv, -reports an error due to a duplicate ridge. - -

    »Q12 - do not error -on wide merge due to duplicate ridge and nearly coincident points

    - -

    In 3-d and higher Delaunay Triangulations or 4-d and higher convex hulls, multiple, -nearly coincident points may lead to very wide facets. An error is reported if a -merge across a duplicate ridge would increase the facet width by 100x or more. - -

    Use option 'Q12' to log a warning instead of throwing an error. - -

    For Delaunay triangulations, a bounding box may alleviate this error (e.g., rbox 500 C1,1E-13 t c G1 | qhull d). -This avoids the ill-defined edge between upper and lower convex hulls. -The problem will be fixed in a future release of Qhull. - -

    To demonstrate the problem, use rbox option 'Cn,r,m' to generate nearly coincident points. -For more information, see "Nearly coincident points on an edge" -in Nearly coincident points on an edge. - - -


    - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions

    - -
    - -

    The Geometry Center -Home Page

    - -

    Comments to: qhull@qhull.org -
    -Created: Sept. 25, 1995 --- Last modified: see top

    - - diff --git a/src/qhull/html/qh-optt.htm b/src/qhull/html/qh-optt.htm deleted file mode 100644 index 0709f58c665..00000000000 --- a/src/qhull/html/qh-optt.htm +++ /dev/null @@ -1,278 +0,0 @@ - - - - -Qhull trace options (T) - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions

    - -
    - -

    [delaunay] Qhull trace options (T)

    - -This section lists the trace options for Qhull. These options are -indicated by 'T' followed by a letter. - -

    Copyright © 1995-2015 C.B. Barber

    - -
    - -

    » Programs - Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions

    - -

    Trace options

    - -
    -
     
    -
    General
    -
    Tz
    -
    output error information to stdout instead of stderr
    -
    TI file
    -
    input data from a file
    -
    TO file
    -
    output results to a file
    -
    Ts
    -
    print statistics
    -
    TFn
    -
    report progress whenever n or more facets created
    -
    TRn
    -
    rerun qhull n times
    -
    Tv
    -
    verify result: structure, convexity, and point inclusion
    - -
     
    -
     
    -
    Debugging
    -
    Tc
    -
    check frequently during execution
    -
    TVn
    -
    stop qhull after adding point n
    -
    TCn
    -
    stop qhull after building cone for point n
    -
    TV-n
    -
    stop qhull before adding point n
    -
    T4
    -
    trace at level n, 4=all, 5=mem/gauss, -1= events
    -
    TWn
    -
    trace merge facets when width > n
    -
    TMn
    -
    turn on tracing at merge n
    -
    TPn
    -
    turn on tracing when point n added to hull
    -
    - -
    - -

    »Tc - check frequently -during execution

    - -

    Qhull includes frequent checks of its data structures. Option -'Tc' will catch most inconsistency errors. It is slow and should -not be used for production runs. Option 'Tv' -performs the same checks after the hull is constructed.

    - -

    »TCn - stop qhull after -building cone for point n

    - -

    Qhull builds a cone from the point to its horizon facets. -Option 'TCn' stops Qhull just after building the cone. The output -for 'f' includes the cone and the old -hull.'.

    - -

    »TFn - report summary -whenever n or more facets created

    - -

    Option 'TFn' reports progress whenever more than n facets are -created. The test occurs just before adding a new point to the -hull. During post-merging, 'TFn' reports progress after more than -n/2 merges.

    - -

    »TI file - input data from file

    - -

    Input data from 'file' instead of stdin. The filename may not -contain spaces or use single quotes. -You may use I/O redirection -instead (e.g., 'rbox 10 | qdelaunay >results').

    - -

    »TMn - turn on tracing at -merge n

    - -

    Turn on tracing at n'th merge.

    - -

    »Tn - trace at level n

    - -

    Qhull includes full execution tracing. 'T-1' traces events. -'T1' traces the overall execution of the program. 'T2' and 'T3' -trace overall execution and geometric and topological events. -'T4' traces the algorithm. 'T5' includes information about memory -allocation and Gaussian elimination. 'T1' is useful for logging -progress of Qhull in high dimensions.

    - -

    Option 'Tn' can produce large amounts of output. Use options 'TPn', 'TWn', and 'TMn' to selectively -turn on tracing. Since all errors report the last processed -point, option 'TPn' is particularly useful.

    - -

    Different executions of the same program may produce different -traces and different results. The reason is that Qhull uses hashing -to match ridges of non-simplicial facets. For performance reasons, -the hash computation uses -memory addresses which may change across executions. - -

    »TO file - output results to file

    - -

    Redirect stdout to 'file'. The filename may be enclosed in -single quotes. Unix and Windows NT users may use I/O redirection -instead (e.g., 'rbox 10 | qdelaunay >results').

    -

    -Windows95 users should always use 'TO file'. If they use I/O redirection, -error output is not sent to the console. Qhull uses single quotes instead -of double quotes because a missing double quote can -freeze Windows95 (e.g., do not run, rbox 10 | qhull TO "x)

    -

    - -

    »TPn - turn on tracing -when point n added to hull

    - -

    Option 'TPn' turns on tracing when point n is added to -the hull. It also traces partitions of point n. This option -reduces the output size when tracing. It is the normal -method to determine the cause of a Qhull error. All Qhull errors -report the last point added. - -

    Use options 'TPn TVn' to -trace the addition of point n to the convex hull and stop when done.

    - -

    If used with option 'TWn', -'TPn' turns off tracing after adding point n to the hull. -Use options 'TPn TWn' to -trace the addition of point n to the convex hull, partitions -of point n, and wide merges.

    - -

    »TRn - rerun qhull n times

    - -

    Option 'TRn' reruns Qhull n times. It is usually used -with 'QJn' to determine the probability -that a given joggle will fail. The summary -('s') lists the failure -rate and the precision errors that occurred. -Option 'Ts' will report statistics for -all of the runs. Trace and output options only apply to the last -run. An event trace, 'T-1' reports events for all runs. - -

    Tracing applies to the last run of Qhull. If an error -is reported, the options list the run number as "_run". -To trace this run, set 'TRn' to the same value.

    - -

    »Ts - print statistics

    - -

    Option 'Ts' collects statistics and prints them to stderr. For -Delaunay triangulations, the angle statistics are restricted to -the lower or upper envelope.

    - -

    »Tv - verify result: -structure, convexity, and point inclusion

    - -

    Option 'Tv' checks the topological structure, convexity, and -point inclusion. If precision problems occurred, facet convexity -is tested whether or not 'Tv' is selected. Option 'Tv' does not -check point inclusion if forcing output with 'Po', or if 'Q5' -is set.

    - -

    The convex hull of a set of points is the smallest polytope -that includes the points. Option 'Tv' tests point inclusion. -Qhull verifies that all points are below all outer planes -(facet->maxoutside). Point inclusion is exhaustive if merging -or if the facet-point product is small enough; otherwise Qhull -verifies each point with a directed search (qh_findbest). To -force an exhaustive test when using option 'C-0' (default), use 'C-1e-30' instead.

    - -

    Point inclusion testing occurs after producing output. It -prints a message to stderr unless option 'Pp' is used. This allows the user to -interrupt Qhull without changing the output.

    - -

    With 'qvoronoi Fi' -and 'qvoronoi Fo', -option 'Tv' collects statistics that verify all Voronoi vertices lie -on the separating hyperplane, and for bounded regions, all -separating hyperplanes are perpendicular bisectors. - -

    »TV-n - stop qhull before -adding point n

    - -

    Qhull adds one point at a time to the convex hull. See how Qhull adds a point. Option 'TV-n' -stops Qhull just before adding a new point. Output shows the hull -at this time.

    - -

    »TVn - stop qhull after -adding point n

    - -

    Option 'TVn' stops Qhull after it has added point n. Output -shows the hull at this time.

    - -

    »TWn - trace merge facets -when width > n

    - -

    Along with TMn, this option allows the user to determine the -cause of a wide merge.

    -

    »Tz - send all output to -stdout

    - -

    Redirect stderr to stdout.

    - - -
    - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions

    - -
    - -

    The Geometry Center -Home Page

    - -

    Comments to: qhull@qhull.org -
    -Created: Sept. 25, 1995 --- Last modified: see top

    - - diff --git a/src/qhull/html/qh-quick.htm b/src/qhull/html/qh-quick.htm deleted file mode 100644 index 9d52e7d7508..00000000000 --- a/src/qhull/html/qh-quick.htm +++ /dev/null @@ -1,495 +0,0 @@ - - - - -Qhull quick reference - - - - -

    Up: Home -page for Qhull
    -Up: Qhull manual
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: Qhull internals
    -To: Qhull functions, macros, and data structures
    -To: Qhull files
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser -

    - -
    - -

    [cone] Qhull quick reference

    - -This section lists all programs and options in Qhull. - -

    Copyright © 1995-2015 C.B. Barber

    - -

    -  -


    -Qhull programs -

    » Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions

    - -
    -
    qconvex -- convex hull
    -
    synopsis • input • outputs • controls • graphics • notes • conventions • options
    -
     
    -
    qdelaunay -- Delaunay triangulation
    -
    synopsis • input • outputs • controls • graphics • notes • conventions • options
    -
     
    -
    qdelaunay Qu -- furthest-site Delaunay triangulation
    -
    synopsis • input • outputs • controls • graphics • notes • conventions • options
    -
     
    -
    qhalf -- halfspace intersection about a point
    -
    synopsis • input • outputs • controls • graphics • notes • conventions • options
    -
     
    -
    qvoronoi -- Voronoi diagram
    -
    synopsis • input • outputs • - controls • graphics • notes • conventions • options
    -
     
    -
    qvoronoi Qu -- furthest-site Voronoi diagram
    -
    synopsis • input • outputs • controls • graphics • notes • conventions • options
    -
     
    -
    rbox -- generate point distributions for qhull
    -
    synopsis • outputs • examples • notes • options
    -
     
    -
    qhull -- convex hull and related structures
    -
    synopsis • input • outputs • controls • options
    -
    -  -
    -Qhull options - -

    » Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions

    - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    'Fa' -Farea -'FA' -FArea-total -'Fc' -Fcoplanars -'FC' -FCentrums - -
    'Fd' -Fd-cdd-in -'FD' -FD-cdd-out -'FF' -FF-dump-xridge -'Fi' -Finner - -
    'Fi' -Finner_bounded -'FI' -FIDs -'Fm' -Fmerges -'FM' -FMaple - -
    'Fn' -Fneighbors -'FN' -FNeigh-vertex -'Fo' -Fouter -'Fo' -Fouter_unbounded - -
    'FO' -FOptions -'Fp' -Fpoint-intersect -'FP' -FPoint_near -'FQ' -FQhull - -
    'Fs' -Fsummary -'FS' -FSize -'Ft' -Ftriangles -'Fv' -Fvertices - -
    'Fv' -Fvoronoi -'FV' -FVertex-ave -'Fx' -Fxtremes - -Merged facets or joggled input - -
     
    'PAn' -PArea-keep -'Pdk:n' -Pdrop_low -'PDk:n' -Pdrop_high -'Pg' -Pgood - -
    'PFn' -PFacet_area_keep -'PG' -PGood_neighbors -'PMn' -PMerge-keep -'Po' -Poutput_forced - -
    'Po' -Poutput_error -'Pp' -Pprecision_not - -
     
    'd' -delaunay -'v' -voronoi -'G' -Geomview -'H' -Halfspace - -
    'f' -facet_dump -'i' -incidences -'m' -mathematica -'n' -normals - -
    'o' -OFF_format -'p' -points -'s' -summary - -
     
    'Gv' -Gvertices -'Gp' -Gpoints -'Ga' -Gall_points -'Gn' -Gno_planes - -
    'Gi' -Ginner -'Gc' -Gcentrums -'Gh' -Ghyperplanes -'Gr' -Gridges - -
    'Go' -Gouter -'GDn' -GDrop_dim -'Gt' -Gtransparent - -
     
    'T4' -T4_trace -'Tc' -Tcheck_often -'Ts' -Tstatistics -'Tv' -Tverify - -
    'Tz' -Tz_stdout -'TFn' -TFacet_log -'TI file' -TInput_file -'TPn' -TPoint_trace - -
    'TMn' -TMerge_trace -'TO file' -TOutput_file -'TRn' -TRerun -'TWn' -TWide_trace - -
    'TV-n' -TVertex_stop_before -
    'TVn' -TVertex_stop_after -'TCn' -TCone_stop_after - -
     
    'A-n' -Angle_max_pre -'An' -Angle_max_post -'C-0' -Centrum_roundoff -'C-n' -Centrum_size_pre - -
    'Cn' -Centrum_size_post -'En' -Error_round -'Rn' -Random_dist -'Vn' -Visible_min - -
    'Un' -Ucoplanar_max -'Wn' -Wide_outside - -
     
    'Qbk:n' -Qbound_low -'QBk:n' -QBound_high -'Qbk:0Bk:0' -Qbound_drop -'QbB' -QbB-scale-box - -
    'Qbb' -Qbb-scale-last -'Qc' -Qcoplanar -'Qf' -Qfurthest -'Qg' -Qgood_only - -
    'QGn' -QGood_point -'Qi' -Qinterior -'Qm' -Qmax_out -'QJn' -QJoggle - -
    'Qr' -Qrandom -'QRn' -QRotate -'Qs' -Qsearch_1st -'Qt' -Qtriangulate - -
    'Qu' -QupperDelaunay -'QVn' -QVertex_good -'Qv' -Qvneighbors -'Qx' -Qxact_merge - -
    'Qz' -Qzinfinite - -
     
    'Q0' -Q0_no_premerge -'Q1' -Q1_no_angle -'Q2' -Q2_no_independ -'Q3' -Q3_no_redundant - -
    'Q4' -Q4_no_old -'Q5' -Q5_no_check_out -'Q6' -Q6_no_concave -'Q7' -Q7_depth_first - -
    'Q8' -Q8_no_near_in -'Q9' -Q9_pick_furthest -'Q10' -Q10_no_narrow -'Q11' -Q11_trinormals -
    - - -


    - -

    Up: Home -page for Qhull
    -Up: Qhull manual
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: Qhull internals
    -To: Qhull functions, macros, and data structures
    -To: Qhull files
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser
    - -


    - -

    The Geometry Center -Home Page

    - -

    Comments to: qhull@qhull.org -
    -Created: Sept. 25, 1995 --- Last modified: see top

    - - diff --git a/src/qhull/html/qhalf.htm b/src/qhull/html/qhalf.htm deleted file mode 100644 index c87fe719ed2..00000000000 --- a/src/qhull/html/qhalf.htm +++ /dev/null @@ -1,626 +0,0 @@ - - - - -qhalf -- halfspace intersection about a point - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: synopsis -• input • outputs -• controls • graphics -• notes • conventions -• options - -


    - -

    [halfspace]qhalf -- halfspace intersection about a point

    - -

    The intersection of a set of halfspaces is a polytope. The -polytope may be unbounded. See Preparata & Shamos ['85] for a discussion. In low -dimensions, halfspace intersection may be used for linear -programming. - -

    -
    -

    Example: rbox c | qconvex FQ FV - n | qhalf Fp

    -
    Print the intersection of the facets of a cube. rbox c - generates the vertices of a cube. qconvex FV n returns of average - of the cube's vertices (in this case, the origin) and the halfspaces - that define the cube. qhalf Fp computes the intersection of - the halfspaces about the origin. The intersection is the vertices - of the original cube.
    - -

    Example: rbox c d G0.55 | qconvex FQ FV - n | qhalf Fp

    -
    Print the intersection of the facets of a cube and a diamond. There - are 24 facets and 14 intersection points. Four facets define each diamond - vertex. Six facets define each cube vertex. -
    - -

    Example: rbox c d G0.55 | qconvex FQ FV - n | qhalf Fp - Qt

    -
    Same as above except triangulate before computing - the intersection points. Three facets define each intersection - point. There are two duplicates of the diamond and four duplicates of the cube. -
    - -

    Example: rbox 10 s t10 | qconvex FQ FV - n | qhalf Fp Fn

    -
    Print the intersection of the facets of the convex hull of 10 cospherical points. - Include the intersection points and the neighboring intersections. - As in the previous examples, the intersection points are nearly the same as the - original input points. -
    -
    -
    - -

    In Qhull, a halfspace is defined by the points on or below a hyperplane. -The distance of each point to the hyperplane is less than or equal to zero. - -

    Qhull computes a halfspace intersection by the geometric -duality between points and halfspaces. -See halfspace examples, -qhalf notes, and -option 'p' of qhalf outputs.

    - -

    Qhalf's outputs are the intersection -points (Fp) and -the neighboring intersection points (Fn). -For random inputs, halfspace -intersections are usually defined by more than d halfspaces. See the sphere example. - -

    You can try triangulated output ('Qt') and joggled input ('QJ'). -It demonstrates that triangulated output is more accurate than joggled input. - -

    If you use 'Qt' (triangulated output), all -halfspace intersections are simplicial (e.g., three halfspaces per -intersection in 3-d). In 3-d, if more than three halfspaces intersect -at the same point, triangulated output will produce -duplicate intersections, one for each additional halfspace. See the third example, or -add 'Qt' to the sphere example.

    - -

    If you use 'QJ' (joggled input), all halfspace -intersections are simplicial. This may lead to nearly identical -intersections. For example, either replace 'Qt' with 'QJ' above, or add -'QJ' to the sphere example. -See Merged facets or joggled input.

    - -

    The 'qhalf' program is equivalent to -'qhull H' in 2-d to 4-d, and -'qhull H Qx' -in 5-d and higher. It disables the following Qhull -options: d n v Qbb QbB Qf Qg Qm -Qr QR Qv Qx Qz TR E V Fa FA FC FD FS Ft FV Gt Q0,etc. - - -

    Copyright © 1995-2015 C.B. Barber

    -
    - -

    »qhalf synopsis

    -
    -qhalf- halfspace intersection about a point.
    -    input (stdin): [dim, 1, interior point]
    -                   dim+1, n
    -                   halfspace coefficients + offset
    -    comments start with a non-numeric character
    -
    -options (qhalf.htm):
    -    Hn,n - specify coordinates of interior point
    -    Qt   - triangulated output
    -    QJ   - joggle input instead of merging facets
    -    Tv   - verify result: structure, convexity, and redundancy
    -    .    - concise list of all options
    -    -    - one-line description of all options
    -
    -output options (subset):
    -    s    - summary of results (default)
    -    Fp   - intersection coordinates
    -    Fv   - non-redundant halfspaces incident to each intersection
    -    Fx   - non-redundant halfspaces
    -    o    - OFF file format (dual convex hull)
    -    G    - Geomview output (dual convex hull)
    -    m    - Mathematica output (dual convex hull)
    -    QVn  - print intersections for halfspace n, -n if not
    -    TO file - output results to file, may be enclosed in single quotes
    -
    -examples:
    -    rbox d | qconvex n | qhalf s H0,0,0 Fp
    -    rbox c | qconvex FV n | qhalf s i
    -    rbox c | qconvex FV n | qhalf s o
    -
    - -

    »qhalf input

    - -
    -

    The input data on stdin consists of:

    -
      -
    • [optional] interior point -
        -
      • dimension -
      • 1 -
      • coordinates of interior point -
      -
    • dimension + 1 -
    • number of halfspaces
    • -
    • halfspace coefficients followed by offset
    • -
    - -

    Use I/O redirection (e.g., qhalf < data.txt), a pipe (e.g., rbox c | qconvex FV n | qhalf), -or the 'TI' option (e.g., qhalf TI data.txt). - -

    Qhull needs an interior point to compute the halfspace -intersection. An interior point is clearly inside all of the halfspaces. -A point is inside a halfspace if its distance to the corresponding hyperplane is negative. - -

    The interior point may be listed at the beginning of the input (as shown above). -If not, option -'Hn,n' defines the interior point as -[n,n,0,...] where 0 is the default coordinate (e.g., -'H0' is the origin). Use linear programming if you do not know -the interior point (see halfspace notes),

    - -

    The input to qhalf is a set of halfspaces that are defined by their hyperplanes. -Each halfspace is defined by -d coefficients followed by a signed offset. This defines -a linear inequality. The coefficients define a vector that is -normal to the halfspace. -The vector may have any length. If it -has length one, the offset is the distance from the origin to the -halfspace's boundary. Points in the halfspace have a negative distance to the hyperplane. -The distance from the interior point to each -halfspace is likewise negative.

    - -

    The halfspace format is the same as Qhull's output options 'n', 'Fo', -and 'Fi'. Use option 'Fd' to use cdd format for the -halfspaces.

    - -

    For example, here is the input for computing the intersection -of halfplanes that form a cube.

    - -
    -

    rbox c | qconvex FQ FV n TO data

    -
    -RBOX c | QCONVEX FQ FV n
    -3 1
    -     0      0      0
    -4
    -6
    -     0      0     -1   -0.5
    -     0     -1      0   -0.5
    -     1      0      0   -0.5
    -    -1      0      0   -0.5
    -     0      1      0   -0.5
    -     0      0      1   -0.5
    -
    -

    qhalf s Fp < data

    -
    -
    -Halfspace intersection by the convex hull of 6 points in 3-d:
    -
    -  Number of halfspaces: 6
    -  Number of non-redundant halfspaces: 6
    -  Number of intersection points: 8
    -
    -Statistics for: RBOX c | QCONVEX FQ FV n | QHALF s Fp
    -
    -  Number of points processed: 6
    -  Number of hyperplanes created: 11
    -  Number of distance tests for qhull: 11
    -  Number of merged facets: 1
    -  Number of distance tests for merging: 45
    -  CPU seconds to compute hull (after input):  0
    -
    -3
    -3
    -8
    -  -0.5    0.5    0.5
    -   0.5    0.5    0.5
    -  -0.5    0.5   -0.5
    -   0.5    0.5   -0.5
    -   0.5   -0.5    0.5
    -  -0.5   -0.5    0.5
    -  -0.5   -0.5   -0.5
    -   0.5   -0.5   -0.5
    -
    -
    - -
    -

    »qhalf outputs

    -
    - -

    The following options control the output for halfspace -intersection.

    -
    -
    -
     
    -
    Intersections
    -
    FN
    -
    list intersection points for each non-redundant - halfspace. The first line - is the number of non-redundant halfspaces. Each remaining - lines starts with the number of intersection points. For the cube - example, each halfspace has four intersection points.
    -
    Fn
    -
    list neighboring intersections for each intersection point. The first line - is the number of intersection points. Each remaining line - starts with the number of neighboring intersections. For the cube - example, each intersection point has three neighboring intersections. -

    - In 3-d, a non-simplicial intersection has more than three neighboring - intersections. For random data (e.g., the sphere example), non-simplicial intersections are the norm. - Option 'Qt' produces three - neighboring intersections per intersection by duplicating the intersection - points. Option QJ' produces three - neighboring intersections per intersection by joggling the hyperplanes and - hence their intersections. -

    -
    Fp
    -
    print intersection coordinates. The first line is the dimension and the - second line is the number of intersection points. The following lines are the - coordinates of each intersection.
    -
    FI
    -
    list intersection IDs. The first line is the number of - intersections. The IDs follow, one per line.
    -
     
    -
     
    -
    Halfspaces
    -
    Fx
    -
    list non-redundant halfspaces. The first line is the number of - non-redundant halfspaces. The other lines list one halfspace per line. - A halfspace is non-redundant if it - defines a facet of the intersection. Redundant halfspaces are ignored. For - the cube example, all of the halfspaces are non-redundant. -
    -
    Fv
    -
    list non-redundant halfspaces incident to each intersection point. - The first line is the number of - non-redundant halfspaces. Each remaining line starts with the number - of non-redundant halfspaces. For the - cube example, each intersection is incident to three halfspaces.
    -
    i
    -
    list non-redundant halfspaces incident to each intersection point. The first - line is the number of intersection points. Each remaining line - lists the incident, non-redundant halfspaces. For the - cube example, each intersection is incident to three halfspaces. -
    -
    Fc
    -
    list coplanar halfspaces for each intersection point. The first line is - the number of intersection points. Each remaining line starts with - the number of coplanar halfspaces. A coplanar halfspace is listed for - one intersection point even though it is coplanar to multiple intersection - points.
    -
    Qi Fc
    -
    list redundant halfspaces for each intersection point. The first line is - the number of intersection points. Each remaining line starts with - the number of redundant halfspaces. Use options 'Qc Qi Fc' to list - coplanar and redundant halfspaces.
    - -
     
    -
     
    -
    General
    -
    s
    -
    print summary for the halfspace intersection. Use 'Fs' if you need numeric data.
    -
    o
    -
    print vertices and facets of the dual convex hull. The - first line is the dimension. The second line is the number of - vertices, facets, and ridges. The vertex - coordinates are next, followed by the facets, one per line.
    -
    p
    -
    print vertex coordinates of the dual convex hull. Each vertex corresponds - to a non-redundant halfspace. Its coordinates are the negative of the hyperplane's coefficients - divided by the offset plus the inner product of the coefficients and - the interior point (-c/(b+a.p). - Options 'p Qc' includes coplanar halfspaces. - Options 'p Qi' includes redundant halfspaces.
    -
    m
    -
    Mathematica output for the dual convex hull in 2-d or 3-d.
    -
    FM
    -
    Maple output for the dual convex hull in 2-d or 3-d.
    -
    G
    -
    Geomview output for the dual convex hull in 2-d, 3-d, or 4-d.
    -
    -
    - -
    -

    »qhalf controls

    -
    - -

    These options provide additional control:

    - -
    -
    -
    Qt
    -
    triangulated output. If a 3-d intersection is defined by more than - three hyperplanes, Qhull produces duplicate intersections -- one for - each extra hyperplane.
    -
    QJ
    -
    joggle the input instead of merging facets. In 3-d, this guarantees that - each intersection is defined by three hyperplanes.
    -
    f
    -
    facet dump. Print the data structure for each intersection (i.e., - facet)
    -
    TFn
    -
    report summary after constructing n - intersections
    -
    QVn
    -
    select intersection points for halfspace n - (marked 'good')
    -
    QGn
    -
    select intersection points that are visible to halfspace n - (marked 'good'). Use -n for the remainder.
    -
    Qbk:0Bk:0
    -
    remove the k-th coordinate from the input. This computes the - halfspace intersection in one lower dimension.
    -
    Tv
    -
    verify result
    -
    TI file
    -
    input data from file. The filename may not use spaces or quotes.
    -
    TO file
    -
    output results to file. Use single quotes if the filename - contains spaces (e.g., TO 'file with spaces.txt'
    -
    Qs
    -
    search all points for the initial simplex. If Qhull can - not construct an initial simplex, it reports a -descriptive message. Usually, the point set is degenerate and one -or more dimensions should be removed ('Qbk:0Bk:0'). -If not, use option 'Qs'. It performs an exhaustive search for the -best initial simplex. This is expensive is high dimensions.
    -
    -
    - - -
    -

    »qhalf graphics

    -
    - -

    To view the results with Geomview, compute the convex hull of -the intersection points ('qhull FQ H0 Fp | qhull G'). See Halfspace examples.

    - -
    -

    »qhalf notes

    -
    - -

    See halfspace intersection for precision issues related to qhalf.

    - -

    If you do not know an interior point for the halfspaces, use -linear programming to find one. Assume, n halfspaces -defined by: aj*x1+bj*x2+cj*x3+dj<=0, j=1..n. Perform -the following linear program:

    - -
    -

    max(x5) aj*x1+bj*x2+cj*x3+dj*x4+x5<=0, j=1..n

    -
    - -

    Then, if [x1,x2,x3,x4,x5] is an optimal solution with -x4>0 and x5>0 we get:

    - -
    -

    aj*(x1/x4)+bj*(x2/x4)+cj*(x3/x4)+dj<=(-x5/x4) j=1..n and (-x5/x4)<0, -

    -
    - -

    and conclude that the point [x1/x4,x2/x4,x3/x4] is in -the interior of all the halfspaces. Since x5 is -optimal, this point is "way in" the interior (good -for precision errors).

    - -

    After finding an interior point, the rest of the intersection -algorithm is from Preparata & Shamos ['85, p. 316, "A simple case -..."]. Translate the halfspaces so that the interior point -is the origin. Calculate the dual polytope. The dual polytope is -the convex hull of the vertices dual to the original faces in -regard to the unit sphere (i.e., halfspaces at distance d -from the origin are dual to vertices at distance 1/d). -Then calculate the resulting polytope, which is the dual of the -dual polytope, and translate the origin back to the interior -point [S. Spitz, S. Teller, D. Strawn].

    - - -
    -

    »qhalf -conventions

    -
    - -

    The following terminology is used for halfspace intersection -in Qhull. This is the hardest structure to understand. The -underlying structure is a convex hull with one vertex per -non-redundant halfspace. See convex hull -conventions and Qhull's data structures.

    - -
      -
    • interior point - a point in the intersection of - the halfspaces. Qhull needs an interior point to compute - the intersection. See halfspace input.
    • -
    • halfspace - d coordinates for the - normal and a signed offset. The distance to an interior - point is negative.
    • -
    • non-redundant halfspace - a halfspace that - defines an output facet
    • -
    • vertex - a dual vertex in the convex hull - corresponding to a non-redundant halfspace
    • -
    • coplanar point - the dual point corresponding to - a similar halfspace
    • -
    • interior point - the dual point corresponding to - a redundant halfspace
    • -
    • intersection point- the intersection of d - or more non-redundant halfspaces
    • -
    • facet - a dual facet in the convex hull - corresponding to an intersection point
    • -
    • non-simplicial facet - more than d - halfspaces intersect at a point
    • -
    • good facet - an intersection point that - satisfies restriction 'QVn', - etc.
    • -
    - -
    -

    »qhalf options

    - -
    -qhalf- compute the intersection of halfspaces about a point
    -    http://www.qhull.org
    -
    -input (stdin):
    -    optional interior point: dimension, 1, coordinates
    -    first lines: dimension+1 and number of halfspaces
    -    other lines: halfspace coefficients followed by offset
    -    comments:    start with a non-numeric character
    -
    -options:
    -    Hn,n - specify coordinates of interior point
    -    Qt   - triangulated ouput
    -    QJ   - joggle input instead of merging facets
    -    Qc   - keep coplanar halfspaces
    -    Qi   - keep other redundant halfspaces
    -
    -Qhull control options:
    -    QJn  - randomly joggle input in range [-n,n]
    -    Qbk:0Bk:0 - remove k-th coordinate from input
    -    Qs   - search all halfspaces for the initial simplex
    -    QGn  - print intersection if redundant to halfspace n, -n for not
    -    QVn  - print intersections for halfspace n, -n if not
    -
    -Trace options:
    -    T4   - trace at level n, 4=all, 5=mem/gauss, -1= events
    -    Tc   - check frequently during execution
    -    Ts   - print statistics
    -    Tv   - verify result: structure, convexity, and redundancy
    -    Tz   - send all output to stdout
    -    TFn  - report summary when n or more facets created
    -    TI file - input data from file, no spaces or single quotes
    -    TO file - output results to file, may be enclosed in single quotes
    -    TPn  - turn on tracing when halfspace n added to intersection
    -    TMn  - turn on tracing at merge n
    -    TWn  - trace merge facets when width > n
    -    TVn  - stop qhull after adding halfspace n, -n for before (see TCn)
    -    TCn  - stop qhull after building cone for halfspace n (see TVn)
    -
    -Precision options:
    -    Cn   - radius of centrum (roundoff added).  Merge facets if non-convex
    -     An  - cosine of maximum angle.  Merge facets if cosine > n or non-convex
    -           C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge
    -    Rn   - randomly perturb computations by a factor of [1-n,1+n]
    -    Un   - max distance below plane for a new, coplanar halfspace
    -    Wn   - min facet width for outside halfspace (before roundoff)
    -
    -Output formats (may be combined; if none, produces a summary to stdout):
    -    f    - facet dump
    -    G    - Geomview output (dual convex hull)
    -    i    - non-redundant halfspaces incident to each intersection
    -    m    - Mathematica output (dual convex hull)
    -    o    - OFF format (dual convex hull: dimension, points, and facets)
    -    p    - vertex coordinates of dual convex hull (coplanars if 'Qc' or 'Qi')
    -    s    - summary (stderr)
    -
    -More formats:
    -    Fc   - count plus redundant halfspaces for each intersection
    -         -   Qc (default) for coplanar and Qi for other redundant
    -    Fd   - use cdd format for input (homogeneous with offset first)
    -    FF   - facet dump without ridges
    -    FI   - ID of each intersection
    -    Fm   - merge count for each intersection (511 max)
    -    FM   - Maple output (dual convex hull)
    -    Fn   - count plus neighboring intersections for each intersection
    -    FN   - count plus intersections for each non-redundant halfspace
    -    FO   - options and precision constants
    -    Fp   - dim, count, and intersection coordinates
    -    FP   - nearest halfspace and distance for each redundant halfspace
    -    FQ   - command used for qhalf
    -    Fs   - summary: #int (8), dim, #halfspaces, #non-redundant, #intersections
    -                      for output: #non-redundant, #intersections, #coplanar
    -                                  halfspaces, #non-simplicial intersections
    -                    #real (2), max outer plane, min vertex
    -    Fv   - count plus non-redundant halfspaces for each intersection
    -    Fx   - non-redundant halfspaces
    -
    -Geomview output (2-d, 3-d and 4-d; dual convex hull)
    -    Ga   - all points (i.e., transformed halfspaces) as dots
    -     Gp  -  coplanar points and vertices as radii
    -     Gv  -  vertices (i.e., non-redundant halfspaces) as spheres
    -    Gi   - inner planes (i.e., halfspace intersections) only
    -     Gn  -  no planes
    -     Go  -  outer planes only
    -    Gc   - centrums
    -    Gh   - hyperplane intersections
    -    Gr   - ridges
    -    GDn  - drop dimension n in 3-d and 4-d output
    -
    -Print options:
    -    PAn  - keep n largest facets (i.e., intersections) by area
    -    Pdk:n- drop facet if normal[k] <= n (default 0.0)
    -    PDk:n- drop facet if normal[k] >= n
    -    Pg   - print good facets (needs 'QGn' or 'QVn')
    -    PFn  - keep facets whose area is at least n
    -    PG   - print neighbors of good facets
    -    PMn  - keep n facets with most merges
    -    Po   - force output.  If error, output neighborhood of facet
    -    Pp   - do not report precision problems
    -
    -    .    - list of all options
    -    -    - one line descriptions of all options
    -
    - - -
    - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: synopsis -• input • outputs -• controls • graphics -• notes • conventions -• options - -


    - -

    The Geometry Center -Home Page

    - -

    Comments to: qhull@qhull.org -
    -Created: Sept. 25, 1995 --- Last modified: see top

    - - - diff --git a/src/qhull/html/qhull-cpp.xml b/src/qhull/html/qhull-cpp.xml deleted file mode 100644 index ae755e82669..00000000000 --- a/src/qhull/html/qhull-cpp.xml +++ /dev/null @@ -1,214 +0,0 @@ - - - - -

    Qhull C++ -- C++ interface to Qhull

    - - Copyright (c) 2009-2015, C.B. Barber - - -
    -

    This draft - document records some of the design decisions for Qhull C++. Convert it to HTML by road-faq.xsl from road-faq. - - Please send comments and suggestions to bradb@shore.net -

    -
    -
    -
    - Help -
    • -
    • -
    • -
    -
    -
    -
    • -
    • -
    -
    -
    -
    - . -
    - -
    - - - - Qhull's collection APIs are modeled on Qt's collection API (QList, QVector, QHash) w/o QT_STRICT_ITERATORS. They support STL and Qt programming. - -

    Some of Qhull's collection classes derive from STL classes. If so, - please avoid additional STL functions and operators added by inheritance. - These collection classes may be rewritten to derive from Qt classes instead. - See Road's . -

    - - - Qhull's collection API (where applicable). For documentation, see Qt's QList, QMap, QListIterator, QMapIterator, QMutableListIterator, and QMutableMapIterator -
    • - STL types [list, qlinkedlist, qlist, qvector, vector] -- const_iterator, iterator -
    • - STL types describing iterators [list, qlinkedlist, qlist, qvector, vector] -- const_pointer, const_reference, difference_type, - pointer, reference, size_type, value_type. - Pointer and reference types not defined if unavailable (not needed for <algorithm>) -
    • - const_iterator, iterator types -- difference_type, iterator_category, pointer, reference, value_type -
    • - Qt types [qlinkedlist, qlist, qvector] -- ConstIterator, Iterator, QhullclassIterator, MutableQhullclassIterator. - Qt's foreach requires const_iterator. -
    • - Types for sets/maps [hash_map, QHash] -- key_compare, key_type, mapped_type -
    • - Constructor -- default constructor, copy constructor, assignment operator, destructor -
    • - Conversion -- to/from/as corresponding C, STL, and Qt constructs. Include toQList and toStdVector (may be filtered, e.g., QhullFacetSet). - Do not define fromStdList and fromQList if container is not reference counted (i.e., acts like a value) -
    • - Get/set -- configuration options for class -
    • - STL-style iterator - begin, constBegin, constEnd, end, key, value, =, *, [], ->, ++, --, +, -, ==, !=, <, - <=, >, >=, const_iterator(iterator), iterator COMPARE const_iterator. - An iterator is an abstraction of a pointer. It is not aware of its container. -
    • - Java-style iterator [qiterator.h] - countRemaining, findNext, findPrevious, hasNext, hasPrevious, next, peekNext, peekPrevious, previous, toBack, toFront, = Coordinates -
    • - Mutable Java-style iterator adds - insert, remove, setValue, value -
    • - Element access -- back, first, front, last -
    • - Element access w/ index -- [], at (const& only), constData, data, mid, value -
    • - Read-only - (int)count, empty, isEmpty, (size_t)size. Count() and size() may be filtered. If so, they may be zero when !empty(). -
    • - Read-only for sets/maps - capacity, key, keys, reserve, resize, values -
    • - Operator - ==, !=, +, +=, << -
    • - Read-write -- append, clear, erase, insert, move, prepend, pop_back, pop_front, push_back, push_front, removeAll, removeAt, removeFirst, removeLast, replace, - swap, takeAt, takeFirst, takeLast -
    • - Read-write for sets/maps -- insertMulti, squeeze, take, unite -
    • - Search -- contains(const T &), count(const T &), indexOf, lastIndexOf -
    • - Search for sets/maps -- constFind, lowerBound, upperBound -
    • - Stream I/O -- stream << -
    - - STL list and vector -- For unfiltered access to each element. -
    • - Apache: Creating your own containers -- requirements for STL containers. Iterators should define the types from 'iterator_traits'. -
    • - STL types -- allocator_type, const_iterator, const_pointer, const_reference, const_reverse_iterator, difference_type, iterator, iterator_category, pointer, reference, reverse_iterator, size_type, value_type -
    • - STL constructors -- MyType(), MyType(count), MyType(count, value), MyType(first, last), - MyType(MyType&), -
    • - STL getter/setters -- at (random_access only), back, begin, capacity, end, front, rbegin, rend, size, max_size -
    • - STL predicates -- empty -
    • - STL iterator types -- const_pointer, const_reference, difference_type, iterator_category, pointer, reference, value_type -
    • - STL iterator operators -- *, -<, ++, --, +=, -=, +, -, [], ==, !=, <, >, >=, <= -
    • - STL operators -- =, [] (random_access only), ==, !=, <, >, <=, >= -
    • - STL modifiers -- assign, clear, erase, insert, pop_back, push_back, reserve, resize, swap -
    • -
    - - Qt Qlist -- For unfiltered access to each element -
    • -
    • - Additional Qt types -- ConstIterator, Iterator, QListIterator, QMutableListIterator -
    • - Additional Qt get/set -- constBegin, constEnd, count, first, last, value (random_access only) -
    • - Additional Qt predicates -- isEmpty -
    • - Additional Qt -- mid (random_access only) -
    • - Additional Qt search -- contains, count(T&), indexOf (random_access only), lastIndeOf (random_access only) -
    • - Additional Qt modifiers -- append, insert(index,value) (random_access only), move (random_access only), pop_front, prepend, push_front, removeAll, removeAt (random_access only), removeFirst, removeLast, replace, swap by index, takeAt, takeFirst, takeLast -
    • - Additional Qt operators -- +, <<, +=, - stream << and >> -
    • - Unsupported types by Qt -- allocator_type, const_reverse_iterator, reverse_iterator -
    • - Unsupported accessors by Qt -- max_size, rbegin, rend -
    • - Unsupported constructors by Qt -- multi-value constructors -
    • - unsupported modifiers by Qt -- assign, muli-value inserts, STL's swaps -
    • -
    - - STL map and Qt QMap. These use nearly the same API as list and vector classes. They add the following. -
    • - STL types -- key_compare, key_type, mapped_type -
    • - STL search -- equal_range, find, lower_bound, upper_bound -
    • - Qt removes -- equal_range, key_compare -
    • - Qt renames -- lowerBound, upperBound -
    • - Qt adds -- constFind, insertMulti, key, keys, take, uniqueKeys, unite, values -
    • - Not applicable to map and QMap -- at, back, pop_back, pop_front, push_back, push_front, swap -
    • - Not applicable to QMap -- append, first, last, lastIndexOf, mid, move, prepend, removeAll, removeAt, removeFirst, removeLast, replace, squeeze, takeAt, takeFirst, takeLast -
    • - Not applicable to map -- assign -
    - - Qt QHash. STL extensions provide similar classes, e.g., Microsoft's stdext::hash_set. THey are nearly the same as QMap -
    • -
    • -
    • - Not applicable to Qhash -- lowerBound, unite, upperBound, -
    • - Qt adds -- squeeze -
    -
    - -
    • - check... -- Throw error on failure -
    • - try... -- Return false on failure. Do not throw errors. -
    • - ...Temporarily -- lifetime depends on source. e.g., toByteArrayTemporarily -
    • - ...p -- indicates pointer-to. -
    • - end... -- points to one beyond the last available -
    • - private functions -- No syntactic indication. They may become public later on. -
    • - Error messages -- Preceed error messages with the name of the class throwing the error (e.g. "ClassName: ..."). If this is an internal error, use "ClassName inconsistent: ..." -
    • - parameter order -- qhRunId, dimension, coordinates, count. -
    • - toClass -- Convert into a Class object (makes a deep copy) -
    • - qRunId -- Requires Qh installed. Some routines allow 0 for limited info (e.g., operator<<) -
    • - Disable methods in derived classes -- If the default constructor, copy constructor, or copy assignment is disabled, it should be also disabled in derived classes (better error messages). -
    • - Constructor order -- default constructor, other constructors, copy constructor, copy assignment, destructor -
    -
    -
    -
    diff --git a/src/qhull/html/qhull.htm b/src/qhull/html/qhull.htm deleted file mode 100644 index 0a2aa75e068..00000000000 --- a/src/qhull/html/qhull.htm +++ /dev/null @@ -1,473 +0,0 @@ - - - - -qhull -- convex hull and related structures - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: synopsis • input -• outputs • controls -• options -


    - -

    [cone]qhull -- convex hull and related structures

    - -

    The convex hull of a set of points is the smallest convex set -containing the points. The Delaunay triangulation and furthest-site -Delaunay triangulation are equivalent to a convex hull in one -higher dimension. Halfspace intersection about a point is -equivalent to a convex hull by polar duality. - -

    The qhull program provides options to build these -structures and to experiment with the process. Use the -qconvex, -qdelaunay, qhalf, -and qvoronoi programs -to build specific structures. You may use qhull instead. -It takes the same options and uses the same code. -

    -
    -
    Example: rbox 1000 D3 | qhull - C-1e-4 - FO - Ts -
    -
    Compute the 3-d convex hull of 1000 random - points. - Centrums must be 10^-4 below neighboring - hyperplanes. Print the options and precision constants. - When done, print statistics. These options may be - used with any of the Qhull programs.
    -
     
    -
    Example: rbox 1000 D3 | qhull d - Qbb - R1e-4 - Q0
    -
    Compute the 3-d Delaunay triangulation of 1000 random - points. Randomly perturb all calculations by - [0.9999,1.0001]. Do not correct precision problems. - This leads to serious precision errors.
    -
    -
    -

    Use the following equivalences when calling qhull in 2-d to 4-d (a 3-d -Delaunay triangulation is a 4-d convex hull): -

    - -
    - -

    Use the following equivalences when calling qhull in 5-d and higher (a 4-d -Delaunay triangulation is a 5-d convex hull): -

    - -
    - - -

    By default, Qhull merges coplanar facets. For example, the convex -hull of a cube's vertices has six facets. - -

    If you use 'Qt' (triangulated output), -all facets will be simplicial (e.g., triangles in 2-d). For the cube -example, it will have 12 facets. Some facets may be -degenerate and have zero area. - -

    If you use 'QJ' (joggled input), -all facets will be simplicial. The corresponding vertices will be -slightly perturbed. Joggled input is less accurate that triangulated -output.See Merged facets or joggled input.

    - -

    The output for 4-d convex hulls may be confusing if the convex -hull contains non-simplicial facets (e.g., a hypercube). See -Why -are there extra points in a 4-d or higher convex hull?
    -

    - -

    Copyright © 1995-2015 C.B. Barber

    - -
    - -

    »qhull synopsis

    -
    -qhull- compute convex hulls and related structures.
    -    input (stdin): dimension, n, point coordinates
    -    comments start with a non-numeric character
    -    halfspace: use dim+1 and put offsets after coefficients
    -
    -options (qh-quick.htm):
    -    d    - Delaunay triangulation by lifting points to a paraboloid
    -    d Qu - furthest-site Delaunay triangulation (upper convex hull)
    -    v    - Voronoi diagram as the dual of the Delaunay triangulation
    -    v Qu - furthest-site Voronoi diagram
    -    H1,1 - Halfspace intersection about [1,1,0,...] via polar duality
    -    Qt   - triangulated output
    -    QJ   - joggle input instead of merging facets
    -    Tv   - verify result: structure, convexity, and point inclusion
    -    .    - concise list of all options
    -    -    - one-line description of all options
    -
    -Output options (subset):
    -    s    - summary of results (default)
    -    i    - vertices incident to each facet
    -    n    - normals with offsets
    -    p    - vertex coordinates (if 'Qc', includes coplanar points)
    -           if 'v', Voronoi vertices
    -    Fp   - halfspace intersections
    -    Fx   - extreme points (convex hull vertices)
    -    FA   - compute total area and volume
    -    o    - OFF format (if 'v', outputs Voronoi regions)
    -    G    - Geomview output (2-d, 3-d and 4-d)
    -    m    - Mathematica output (2-d and 3-d)
    -    QVn  - print facets that include point n, -n if not
    -    TO file- output results to file, may be enclosed in single quotes
    -
    -examples:
    -    rbox c d D2 | qhull Qc s f Fx | more      rbox 1000 s | qhull Tv s FA
    -    rbox 10 D2 | qhull d QJ s i TO result     rbox 10 D2 | qhull v Qbb Qt p
    -    rbox 10 D2 | qhull d Qu QJ m              rbox 10 D2 | qhull v Qu QJ o
    -    rbox c | qhull n                          rbox c | qhull FV n | qhull H Fp
    -    rbox d D12 | qhull QR0 FA                 rbox c D7 | qhull FA TF1000
    -    rbox y 1000 W0 | qhull                    rbox 10 | qhull v QJ o Fv
    -
    - -

    »qhull input

    -
    - -

    The input data on stdin consists of:

    -
      -
    • dimension -
    • number of points
    • -
    • point coordinates
    • -
    - -

    Use I/O redirection (e.g., qhull < data.txt), a pipe (e.g., rbox 10 | qhull), -or the 'TI' option (e.g., qhull TI data.txt). - -

    Comments start with a non-numeric character. Error reporting is -simpler if there is one point per line. Dimension -and number of points may be reversed. For halfspace intersection, -an interior point may be prepended (see qhalf input). - -

    Here is the input for computing the convex -hull of the unit cube. The output is the normals, one -per facet.

    - -
    -

    rbox c > data

    -
    -3 RBOX c
    -8
    -  -0.5   -0.5   -0.5
    -  -0.5   -0.5    0.5
    -  -0.5    0.5   -0.5
    -  -0.5    0.5    0.5
    -   0.5   -0.5   -0.5
    -   0.5   -0.5    0.5
    -   0.5    0.5   -0.5
    -   0.5    0.5    0.5
    -
    -

    qhull s n < data

    -
    -
    -Convex hull of 8 points in 3-d:
    -
    -  Number of vertices: 8
    -  Number of facets: 6
    -  Number of non-simplicial facets: 6
    -
    -Statistics for: RBOX c | QHULL s n
    -
    -  Number of points processed: 8
    -  Number of hyperplanes created: 11
    -  Number of distance tests for qhull: 35
    -  Number of merged facets: 6
    -  Number of distance tests for merging: 84
    -  CPU seconds to compute hull (after input): 0.081
    -
    -4
    -6
    -     0      0     -1   -0.5
    -     0     -1      0   -0.5
    -     1      0      0   -0.5
    -    -1      0      0   -0.5
    -     0      1      0   -0.5
    -     0      0      1   -0.5
    -
    -
    - -
    -

    »qhull outputs

    -
    - -

    These options control the output of qhull. They may be used -individually or together.

    -
    -
    -
     
    -
    General
    -
    qhull
    -
    compute the convex hull of the input points. - See qconvex.
    -
    qhull d Qbb
    -
    compute the Delaunay triangulation by lifting the points - to a paraboloid. Use option 'Qbb' - to scale the paraboloid and improve numeric precision. - See qdelaunay.
    -
    qhull v Qbb
    -
    compute the Voronoi diagram by computing the Delaunay - triangulation. Use option 'Qbb' - to scale the paraboloid and improve numeric precision. - See qvoronoi.
    -
    qhull H
    -
    compute the halfspace intersection about a point via polar - duality. The point is below the hyperplane that defines the halfspace. - See qhalf.
    -
    -
    - -

    For a full list of output options see -

    - -
    - -
    -

    »qhull controls

    -
    - -

    For a full list of control options see -

    - -
    - -
    -

    »qhull options

    - -
    -qhull- compute convex hulls and related structures.
    -    http://www.qhull.org
    -
    -input (stdin):
    -    first lines: dimension and number of points (or vice-versa).
    -    other lines: point coordinates, best if one point per line
    -    comments:    start with a non-numeric character
    -    halfspaces:  use dim plus one and put offset after coefficients.
    -                 May be preceded by a single interior point ('H').
    -
    -options:
    -    d    - Delaunay triangulation by lifting points to a paraboloid
    -    d Qu - furthest-site Delaunay triangulation (upper convex hull)
    -    v    - Voronoi diagram (dual of the Delaunay triangulation)
    -    v Qu - furthest-site Voronoi diagram
    -    Hn,n,... - halfspace intersection about point [n,n,0,...]
    -    Qt   - triangulated output
    -    QJ   - joggle input instead of merging facets
    -    Qc   - keep coplanar points with nearest facet
    -    Qi   - keep interior points with nearest facet
    -
    -Qhull control options:
    -    Qbk:n   - scale coord k so that low bound is n
    -      QBk:n - scale coord k so that upper bound is n (QBk is 0.5)
    -    QbB  - scale input to unit cube centered at the origin
    -    Qbb  - scale last coordinate to [0,m] for Delaunay triangulations
    -    Qbk:0Bk:0 - remove k-th coordinate from input
    -    QJn  - randomly joggle input in range [-n,n]
    -    QRn  - random rotation (n=seed, n=0 time, n=-1 time/no rotate)
    -    Qf   - partition point to furthest outside facet
    -    Qg   - only build good facets (needs 'QGn', 'QVn', or 'PdD')
    -    Qm   - only process points that would increase max_outside
    -    Qr   - process random outside points instead of furthest ones
    -    Qs   - search all points for the initial simplex
    -    Qu   - for 'd' or 'v', compute upper hull without point at-infinity
    -              returns furthest-site Delaunay triangulation
    -    Qv   - test vertex neighbors for convexity
    -    Qx   - exact pre-merges (skips coplanar and anglomaniacs facets)
    -    Qz   - add point-at-infinity to Delaunay triangulation
    -    QGn  - good facet if visible from point n, -n for not visible
    -    QVn  - good facet if it includes point n, -n if not
    -    Q0   - turn off default p remerge with 'C-0'/'Qx'
    -    Q1     - sort merges by type instead of angle
    -    Q2   - merge all non-convex at once instead of independent sets
    -    Q3   - do not merge redundant vertices
    -    Q4   - avoid old>new merges
    -    Q5   - do not correct outer planes at end of qhull
    -    Q6   - do not pre-merge concave or coplanar facets
    -    Q7   - depth-first processing instead of breadth-first
    -    Q8   - do not process near-inside points
    -    Q9   - process furthest of furthest points
    -    Q10  - no special processing for narrow distributions
    -    Q11  - copy normals and recompute centrums for tricoplanar facets
    -    Q12  - do not error on wide merge due to duplicate ridge and nearly coincident points
    -
    -Towpaths Trace options:
    -    T4   - trace at level n, 4=all, 5=mem/gauss, -1= events
    -    Tc   - check frequently during execution
    -    Ts   - print statistics
    -    Tv   - verify result: structure, convexity, and point inclusion
    -    Tz   - send all output to stdout
    -    TFn  - report summary when n or more facets created
    -    TI file - input data from file, no spaces or single quotes
    -    TO file - output results to file, may be enclosed in single quotes
    -    TPn  - turn on tracing when point n added to hull
    -     TMn - turn on tracing at merge n
    -     TWn - trace merge facets when width > n
    -    TRn  - rerun qhull n times.  Use with 'QJn'
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)
    -     TCn - stop qhull after building cone for point n (see TVn)
    -
    -Precision options:
    -    Cn   - radius of centrum (roundoff added).  Merge facets if non-convex
    -     An  - cosine of maximum angle.  Merge facets if cosine > n or non-convex
    -           C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge
    -    En   - max roundoff error for distance computation
    -    Rn   - randomly perturb computations by a factor of [1-n,1+n]
    -    Vn   - min distance above plane for a visible facet (default 3C-n or En)
    -    Un   - max distance below plane for a new, coplanar point (default Vn)
    -    Wn   - min facet width for outside point (before roundoff, default 2Vn)
    -
    -Output formats (may be combined; if none, produces a summary to stdout):
    -    f    - facet dump
    -    G    - Geomview output (see below)
    -    i    - vertices incident to each facet
    -    m    - Mathematica output (2-d and 3-d)
    -    o    - OFF format (dim, points and facets; Voronoi regions)
    -    n    - normals with offsets
    -    p    - vertex coordinates or Voronoi vertices (coplanar points if 'Qc')
    -    s    - summary (stderr)
    -
    -More formats:
    -    Fa   - area for each facet
    -    FA   - compute total area and volume for option 's'
    -    Fc   - count plus coplanar points for each facet
    -           use 'Qc' (default) for coplanar and 'Qi' for interior
    -    FC   - centrum or Voronoi center for each facet
    -    Fd   - use cdd format for input (homogeneous with offset first)
    -    FD   - use cdd format for numeric output (offset first)
    -    FF   - facet dump without ridges
    -    Fi   - inner plane for each facet
    -           for 'v', separating hyperplanes for bounded Voronoi regions
    -    FI   - ID of each facet
    -    Fm   - merge count for each facet (511 max)
    -    FM   - Maple output (2-d and 3-d)
    -    Fn   - count plus neighboring facets for each facet
    -    FN   - count plus neighboring facets for each point
    -    Fo   - outer plane (or max_outside) for each facet
    -           for 'v', separating hyperplanes for unbounded Voronoi regions
    -    FO   - options and precision constants
    -    Fp   - dim, count, and intersection coordinates (halfspace only)
    -    FP   - nearest vertex and distance for each coplanar point
    -    FQ   - command used for qhull
    -    Fs   - summary: #int (8), dimension, #points, tot vertices, tot facets,
    -                      output: #vertices, #facets, #coplanars, #nonsimplicial
    -                    #real (2), max outer plane, min vertex
    -    FS   - sizes:   #int (0)
    -                    #real(2) tot area, tot volume
    -    Ft   - triangulation with centrums for non-simplicial facets (OFF format)
    -    Fv   - count plus vertices for each facet
    -           for 'v', Voronoi diagram as Voronoi vertices for pairs of sites
    -    FV   - average of vertices (a feasible point for 'H')
    -    Fx   - extreme points (in order for 2-d)
    -
    -Geomview options (2-d, 3-d, and 4-d; 2-d Voronoi)
    -    Ga   - all points as dots
    -     Gp  -  coplanar points and vertices as radii
    -     Gv  -  vertices as spheres
    -    Gi   - inner planes only
    -     Gn  -  no planes
    -     Go  -  outer planes only
    -    Gc   - centrums
    -    Gh   - hyperplane intersections
    -    Gr   - ridges
    -    GDn  - drop dimension n in 3-d and 4-d output
    -    Gt   - for 3-d 'd', transparent outer ridges
    -
    -Print options:
    -    PAn  - keep n largest facets by area
    -    Pdk:n - drop facet if normal[k] <= n (default 0.0)
    -    PDk:n - drop facet if normal[k] >= n
    -    Pg   - print good facets (needs 'QGn' or 'QVn')
    -    PFn  - keep facets whose area is at least n
    -    PG   - print neighbors of good facets
    -    PMn  - keep n facets with most merges
    -    Po   - force output.  If error, output neighborhood of facet
    -    Pp   - do not report precision problems
    -
    -    .    - list of all options
    -    -    - one line descriptions of all options
    -
    - - -
    - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: synopsis • input -• outputs • controls -• options - -


    - -

    The Geometry Center -Home Page

    - -

    Comments to: qhull@qhull.org -
    -Created: Sept. 25, 1995 --- Last modified: see top

    - - diff --git a/src/qhull/html/qhull.man b/src/qhull/html/qhull.man deleted file mode 100644 index 8d1dc08ace1..00000000000 --- a/src/qhull/html/qhull.man +++ /dev/null @@ -1,1008 +0,0 @@ -.\" This is the Unix manual page for qhull, written in nroff, the standard -.\" manual formatter for Unix systems. To format it, type -.\" -.\" nroff -man qhull.man -.\" -.\" This will print a formatted copy to standard output. If you want -.\" to ensure that the output is plain ASCII, free of any control -.\" characters that nroff uses for underlining etc, pipe the output -.\" through "col -b": -.\" -.\" nroff -man qhull.man | col -b -.\" -.\" Warning: a leading quote "'" or dot "." will not format correctly -.\" -.TH qhull 1 "2003/12/30" "Geometry Center" -.SH NAME -qhull \- convex hull, Delaunay triangulation, Voronoi diagram, -halfspace intersection about a point, hull volume, facet area -.SH SYNOPSIS -.nf -qhull- compute convex hulls and related structures - input (stdin): dimension, #points, point coordinates - first comment (non-numeric) is listed in the summary - halfspace: use dim plus one with offsets after coefficients - -options (qh-quick.htm): - d - Delaunay triangulation by lifting points to a paraboloid - v - Voronoi diagram via the Delaunay triangulation - H1,1 - Halfspace intersection about [1,1,0,...] - d Qu - Furthest-site Delaunay triangulation (upper convex hull) - v Qu - Furthest-site Voronoi diagram - Qt - triangulated output - QJ - Joggle the input to avoid precision problems - . - concise list of all options - - - one-line description of all options - -Output options (subset): - FA - compute total area and volume - Fx - extreme points (convex hull vertices) - G - Geomview output (2-d, 3-d and 4-d) - Fp - halfspace intersection coordinates - m - Mathematica output (2-d and 3-d) - n - normals with offsets - o - OFF file format (if Voronoi, outputs regions) - TO file- output results to file, may be enclosed in single quotes - f - print all fields of all facets - s - summary of results (default) - Tv - verify result: structure, convexity, and point inclusion - p - vertex coordinates (centers for Voronoi) - i - vertices incident to each facet - -example: - rbox 1000 s | qhull Tv s FA -.fi - - - html manual: index.htm - - installation: README.txt - - see also: COPYING.txt, REGISTER.txt, Changes.txt - - WWW: - - GIT: - - mirror: - - news: - - Geomview: - - news group: - - FAQ: - - email: qhull@qhull.org - - bug reports: qhull_bug@qhull.org - -The sections are: - - INTRODUCTION - - DESCRIPTION, a description of Qhull - - IMPRECISION, how Qhull handles imprecision - - OPTIONS - - Input and output options - - Additional input/output formats - - Precision options - - Geomview options - - Print options - - Qhull options - - Trace options - - BUGS - - E-MAIL - - SEE ALSO - - AUTHORS - - ACKNOWLEGEMENTS - -This man page briefly describes all Qhull options. Please report -any mismatches with Qhull's html manual (index.htm). - -.PP -.SH INTRODUCTION -Qhull is a general dimension code for computing convex hulls, Delaunay -triangulations, Voronoi diagram, furthest\[hy]site Voronoi diagram, -furthest\[hy]site Delaunay triangulations, and -halfspace intersections about a point. It implements the Quickhull algorithm for -computing the convex hull. Qhull handles round\[hy]off errors from floating -point arithmetic. It can approximate a convex hull. - -The program includes options for hull volume, facet area, partial hulls, -input transformations, randomization, tracing, multiple output formats, and -execution statistics. The program can be called from within your application. -You can view the results in 2\[hy]d, 3\[hy]d and 4\[hy]d with Geomview. -.PP -.SH DESCRIPTION -.PP -The format of input is the following: first line contains the dimension, -second line contains the number of input points, and point coordinates follow. -The dimension and number of points can be reversed. -Comments and line breaks are ignored. A comment starts with a -non\[hy]numeric character and continues to the end of line. The first comment -is reported in summaries and statistics. -Error reporting is -better if there is one point per line. -.PP -The default printout option is a short summary. There are many -other output formats. -.PP -Qhull implements the Quickhull algorithm for convex hull. This algorithm combines -the 2\[hy]d Quickhull algorithm with the n\[hy]d beneath\[hy]beyond algorithm -[c.f., Preparata & Shamos '85]. -It is similar to the randomized algorithms of Clarkson and -others [Clarkson et al. '93]. The main -advantages of Quickhull are output sensitive performance, reduced -space requirements, and automatic handling of precision problems. -.PP -The data structure produced by Qhull consists of vertices, ridges, and facets. -A vertex is a point of the input set. A ridge is a set of d vertices -and two neighboring facets. For example in 3\[hy]d, a ridge is an edge of the -polyhedron. A facet is a set of ridges, a set of neighboring facets, a set -of incident vertices, and a hyperplane equation. For simplicial facets, the -ridges are defined by the vertices and neighboring facets. When Qhull -merges two facets, it produces a non\[hy]simplicial -facet. A non\[hy]simplicial facet has more than d neighbors and may share more than -one ridge with a neighbor. -.PP -.SH IMPRECISION -.PP -Since Qhull uses floating point arithmetic, roundoff error may occur for each -calculation. This causes problems -for most geometric algorithms. -.PP -Qhull automatically sets option 'C\-0' in 2\[hy]d, 3\[hy]d, and 4\[hy]d, or -option 'Qx' in 5\[hy]d and higher. These options handle precision problems -by merging facets. Alternatively, use option 'QJ' to joggle the -input. -.PP -With 'C\-0', Qhull merges non\[hy]convex -facets while constructing the hull. The remaining facets are -clearly convex. With 'Qx', Qhull merges -coplanar horizon facets, flipped facets, concave facets and -duplicated ridges. It merges coplanar facets after constructing -the hull. -With 'Qx', coplanar points may be missed, but it -appears to be unlikely. -.PP -To guarantee triangular output, joggle the input with option 'QJ'. Facet -merging will not occur. -.SH OPTIONS -.PP -To get a list of the most important options, execute 'qhull' by itself. -To get a complete list of options, -execute 'qhull \-'. -To get a complete, concise list of options, execute 'qhull .'. - -Options can be in any order. -Capitalized options take an argument (except 'PG' and 'F' options). -Single letters are used for output formats and precision constants. The -other options are grouped into menus for other output formats ('F'), -Geomview output ('G'), -printing ('P'), Qhull control ('Q'), and tracing ('T'). -.TP -Main options: -.TP -default -Compute the convex hull of the input points. Report a summary of -the result. -.TP -d -Compute the Delaunay triangulation by lifting the input points to a -paraboloid. The 'o' option prints the input points and facets. -The 'QJ' option guarantees triangular output. The 'Ft' -option prints a triangulation. It adds points (the centrums) to non\[hy]simplicial -facets. -.TP -v -Compute the Voronoi diagram from the Delaunay triangulation. -The 'p' option prints the Voronoi vertices. -The 'o' option prints the Voronoi vertices and the -vertices in each Voronoi region. It lists regions in -site ID order. -The 'Fv' option prints each ridge of the Voronoi diagram. -The first or zero'th vertex -indicates the infinity vertex. Its coordinates are -qh_INFINITE (\-10.101). It indicates unbounded Voronoi -regions or degenerate Delaunay triangles. -.TP -Hn,n,... -Compute halfspace intersection about [n,n,0,...]. -The input is a set of halfspaces -defined in the same format as 'n', 'Fo', and 'Fi'. -Use 'Fp' to print the intersection points. Use 'Fv' -to list the intersection points for each halfspace. The -other output formats display the dual convex hull. - -The point [n,n,n,...] is a feasible point for the halfspaces, i.e., -a point that is inside all -of the halfspaces (Hx+b <= 0). The default coordinate value is 0. - -The input may start with a feasible point. If so, use 'H' by itself. -The input starts with a feasible point when the first number is the dimension, -the second number is "1", and the coordinates complete a line. The 'FV' -option produces a feasible point for a convex hull. -.TP -d Qu -Compute the furthest\[hy]site Delaunay triangulation from the upper -convex hull. The 'o' option prints the input points and facets. -The 'QJ' option guarantees triangular otuput. You can also use 'Ft' -to triangulate via the centrums of non\[hy]simplicial -facets. -.TP -v Qu -Compute the furthest\[hy]site Voronoi diagram. -The 'p' option prints the Voronoi vertices. -The 'o' option prints the Voronoi vertices and the -vertices in each Voronoi region. -The 'Fv' option prints each ridge of the Voronoi diagram. -The first or zero'th vertex -indicates the infinity vertex at infinity. Its coordinates are -qh_INFINITE (\-10.101). It indicates unbounded Voronoi regions -and degenerate Delaunay triangles. -.PP -.TP -Input/Output options: -.TP -f -Print out all facets and all fields of each facet. -.TP -G -Output the hull in Geomview format. For imprecise hulls, -Geomview displays the inner and outer hull. Geomview can also -display points, ridges, vertices, coplanar points, and -facet intersections. See below for a list of options. - -For Delaunay triangulations, 'G' displays the -corresponding paraboloid. For halfspace intersection, 'G' displays the -dual polytope. -.TP -i -Output the incident vertices for each facet. -Qhull prints the number of facets followed by the -vertices of each facet. One facet is printed per line. The numbers -are the 0\[hy]relative indices of the corresponding input points. -The facets -are oriented. - -In 4d and higher, -Qhull triangulates non\[hy]simplicial facets. Each apex (the first vertex) is -a created point that corresponds to the facet's centrum. Its index is greater -than the indices of the input points. Each base -corresponds to a simplicial ridge between two facets. -To print the vertices without triangulation, use option 'Fv'. -.TP -m -Output the hull in Mathematica format. Qhull writes a Mathematica file for 2\[hy]d and 3\[hy]d -convex hulls and for 2\[hy]d Delaunay triangulations. Qhull produces a list of objects -that you can assign to a variable in Mathematica, for example: -"list= << ". If the object is 2\[hy]d, it can be -visualized by "Show[Graphics[list]] ". For 3\[hy]d objects the command is -"Show[Graphics3D[list]]". -.TP -n -Output the normal equation for each facet. -Qhull prints the dimension (plus one), the number of facets, -and the normals for each facet. The facet's offset follows its -normal coefficients. -.TP -o -Output the facets in OFF file format. -Qhull prints the dimension, number of points, number -of facets, and number of ridges. Then it prints the coordinates of -the input points and the vertices for each facet. Each facet is on -a separate line. The first number is the number of vertices. The -remainder are the indices of the corresponding points. The vertices are -oriented in 2\[hy]d, 3\[hy]d, and in simplicial facets. - -For 2\[hy]d Voronoi diagrams, -the vertices are sorted by adjacency, but not oriented. In 3\[hy]d and higher, -the Voronoi vertices are sorted by index. -See the 'v' option for more information. -.TP -p -Output the coordinates of each vertex point. -Qhull prints the dimension, the number of points, -and the coordinates for each vertex. -With the 'Gc' and 'Gi' options, it also prints coplanar -and interior points. For Voronoi diagrams, it prints the coordinates -of each Voronoi vertex. -.TP -s -Print a summary to stderr. If no output options -are specified at all, a summary goes to stdout. The summary lists -the number of input points, the dimension, the number of vertices -in the convex hull, the number of facets in the convex hull, the -number of good facets (if 'Pg'), and statistics. - -The last two statistics (if needed) measure the maximum distance -from a point or vertex to a -facet. The number in parenthesis (e.g., 2.1x) is the ratio between the -maximum distance and the worst\[hy]case distance due to merging -two simplicial facets. -.PP -.TP -Precision options -.TP -An -Maximum angle given as a cosine. If the angle between a pair of facet -normals -is greater than n, Qhull merges one of the facets into a neighbor. -If 'n' is negative, Qhull tests angles after adding -each point to the hull (pre\[hy]merging). -If 'n' is positive, Qhull tests angles after -constructing the hull (post\[hy]merging). -Both pre\[hy] and post\[hy]merging can be defined. - -Option 'C0' or 'C\-0' is set if the corresponding 'Cn' or 'C\-n' -is not set. If 'Qx' -is set, then 'A\-n' and 'C\-n' are checked after the hull is constructed -and before 'An' and 'Cn' are checked. -.TP -Cn -Centrum radius. -If a centrum is less than n below a neighboring facet, Qhull merges one -of the facets. -If 'n' is negative or '\-0', Qhull tests and merges facets after adding -each point to the hull. This is called "pre\[hy]merging". If 'n' is positive, -Qhull tests for convexity after constructing the hull ("post\[hy]merging"). -Both pre\[hy] and post\[hy]merging can be defined. - -For 5\[hy]d and higher, 'Qx' should be used -instead of 'C\-n'. Otherwise, most or all facets may be merged -together. -.TP -En -Maximum roundoff error for distance computations. -.TP -Rn -Randomly perturb distance computations up to +/\- n * max_coord. -This option perturbs every distance, hyperplane, and angle computation. -To use time as the random number seed, use option 'QR\-1'. -.TP -Vn -Minimum distance for a facet to be visible. -A facet is visible if the distance from the point to the -facet is greater than 'Vn'. - -Without merging, the default value for 'Vn' is the round\[hy]off error ('En'). -With merging, the default value is the pre\[hy]merge centrum ('C\-n') in 2\[hy]d or -3\[hy]d, or three times that in other dimensions. If the outside width -is specified ('Wn'), the maximum, default value for 'Vn' is 'Wn'. -.TP -Un -Maximum distance below a facet for a point to be coplanar to the facet. The -default value is 'Vn'. -.TP -Wn -Minimum outside width of the hull. Points are added to the convex hull -only if they are clearly outside of a facet. A point is outside of a -facet if its distance to the facet is greater than 'Wn'. The normal -value for 'Wn' is 'En'. If the user specifies pre\[hy]merging and -does not set 'Wn', than 'Wn' is set -to the premerge 'Cn' and maxcoord*(1\-An). -.PP -.TP -Additional input/output formats -.TP -Fa -Print area for each facet. -For Delaunay triangulations, the area is the area of the triangle. -For Voronoi diagrams, the area is the area of the dual facet. -Use 'PAn' for printing the n largest facets, and option 'PFn' for -printing facets larger than 'n'. - -The area for non\[hy]simplicial facets is the sum of the -areas for each ridge to the centrum. Vertices far below -the facet's hyperplane are ignored. -The reported area may be significantly less than the actual area. -.TP -FA -Compute the total area and volume for option 's'. It is an approximation -for non\[hy]simplicial facets (see 'Fa'). -.TP -Fc -Print coplanar points for each facet. The output starts with the -number of facets. Then each facet is printed one per line. Each line -is the number of coplanar points followed by the point ids. -Option 'Qi' includes the interior points. Each coplanar point (interior point) is -assigned to the facet it is furthest above (resp., least below). -.TP -FC -Print centrums for each facet. The output starts with the -dimension followed by the number of facets. -Then each facet centrum is printed, one per line. -.TP -Fd -Read input in cdd format with homogeneous points. -The input starts with comments. The first comment is reported in -the summary. -Data starts after a "begin" line. The next line is the number of points -followed by the dimension+1 and "real" or "integer". Then the points -are listed with a leading "1" or "1.0". The data ends with an "end" line. - -For halfspaces ('Fd Hn,n,...'), the input format is the same. Each halfspace -starts with its offset. The sign of the offset is the opposite of Qhull's -convention. -.TP -FD -Print normals ('n', 'Fo', 'Fi') or points ('p') in cdd format. -The first line is the command line that invoked Qhull. -Data starts with a "begin" line. The next line is the number of normals or points -followed by the dimension+1 and "real". Then the normals or points -are listed with the offset before the coefficients. The offset for points is -1.0. The offset for normals has the opposite sign. -The data ends with an "end" line. -.TP -FF -Print facets (as in 'f') without printing the ridges. -.TP -Fi -Print inner planes for each facet. The inner plane is below all vertices. -.TP -Fi -Print separating hyperplanes for bounded, inner regions of the Voronoi -diagram. The first line is the number -of ridges. Then each hyperplane is printed, one per line. A line starts -with the number of indices and floats. The first pair lists -adjacent input -sites, the next d floats are the normalized coefficients for the hyperplane, -and the last float is the offset. The hyperplane is oriented toward 'QVn' -(if defined), or the first input site of the pair. Use 'Tv' to -verify that the hyperplanes are perpendicular bisectors. Use 'Fo' for -unbounded regions, and 'Fv' for the corresponding Voronoi vertices. -.TP -FI -Print facet identifiers. -.TP -Fm -Print number of merges for each facet. At most 511 merges are reported for -a facet. See 'PMn' for printing the facets with the most merges. -.TP -FM -Output the hull in Maple format. Qhull writes a Maple -file for 2\[hy]d and 3\[hy]d -convex hulls and for 2\[hy]d Delaunay triangulations. Qhull produces a '.mpl' -file for displaying with display3d(). -.TP -Fn -Print neighbors for each facet. The output starts with the number of facets. -Then each facet is printed one per line. Each line -is the number of neighbors followed by an index for each neighbor. The indices -match the other facet output formats. - -A negative index indicates an unprinted -facet due to printing only good facets ('Pg'). It is the negation of the facet's -ID (option 'FI'). -For example, negative indices are used for facets -"at infinity" in the Delaunay triangulation. -.TP -FN -Print vertex neighbors or coplanar facet for each point. -The first line is the number -of points. Then each point is printed, one per line. If the -point is coplanar, the line is "1" followed by the facet's ID. -If the point is -not a selected vertex, the line is "0". -Otherwise, each line is the number of -neighbors followed by the corresponding facet indices (see 'Fn'). -.TP -Fo -Print outer planes for each facet in the same format as 'n'. -The outer plane is above all points. -.TP -Fo -Print separating hyperplanes for unbounded, outer regions of the Voronoi -diagram. The first line is the number -of ridges. Then each hyperplane is printed, one per line. A line starts -with the number of indices and floats. The first pair lists -adjacent input -sites, the next d floats are the normalized coefficients for the hyperplane, -and the last float is the offset. The hyperplane is oriented toward 'QVn' -(if defined), or the first input site of the pair. Use 'Tv' to -verify that the hyperplanes are perpendicular bisectors. Use 'Fi' for -bounded regions, and 'Fv' for the corresponding Voronoi vertices. -.TP -FO -List all options to stderr, including the default values. Additional 'FO's -are printed to stdout. -.TP -Fp -Print points for halfspace intersections (option 'Hn,n,...'). Each -intersection corresponds to a facet of the dual polytope. -The "infinity" point [\-10.101,\-10.101,...] -indicates an unbounded intersection. -.TP -FP -For each coplanar point ('Qc') print the point ID of the nearest vertex, -the point ID, the facet ID, and the distance. -.TP -FQ -Print command used for qhull and input. -.TP -Fs -Print a summary. The first line consists of the number of integers ("8"), -followed by the dimension, the number of points, the number of vertices, -the number of facets, the number of vertices selected for output, the -number of facets selected for output, the number of coplanar points selected -for output, number of simplicial, unmerged facets in output - -The second line consists of the number of reals ("2"), -followed by the maxmimum offset to an outer plane and and minimum offset to -an inner plane. Roundoff is included. Later -versions of Qhull may produce additional integers or reals. -.TP -FS -Print the size of the hull. The first line consists of the number of integers ("0"). -The second line consists of the number of reals ("2"), -followed by the total facet area, and the total volume. -Later -versions of Qhull may produce additional integers or reals. - -The total volume measures the volume -of the intersection of the halfspaces defined by each facet. -Both area and volume are -approximations for non\[hy]simplicial facets. See option 'Fa'. -.TP -Ft -Print a triangulation with added points for non\[hy]simplicial -facets. The first line is the dimension and the second line is the -number of points and the number of facets. The points follow, one -per line, then the facets follow as a list of point indices. With option 'Qz', the -points include the point\[hy]at\[hy]infinity. -.TP -Fv -Print vertices for each facet. The first line is the number -of facets. Then each facet is printed, one per line. Each line is -the number of vertices followed by the corresponding point ids. Vertices -are listed in the order they were added to the hull (the last one is first). -.TP -Fv -Print all ridges of a Voronoi diagram. The first line is the number -of ridges. Then each ridge is printed, one per line. A line starts -with the number of indices. The first pair lists adjacent input -sites, the remaining indices list Voronoi vertices. Vertex '0' indicates -the vertex\[hy]at\[hy]infinity (i.e., an unbounded ray). In 3\[hy]d, the vertices -are listed in order. See 'Fi' and 'Fo' for separating hyperplanes. -.TP -FV -Print average vertex. The average vertex is a feasible point -for halfspace intersection. -.TP -Fx -List extreme points (vertices) of the convex hull. The first line -is the number of points. The other lines give the indices of the -corresponding points. The first point is '0'. In 2\[hy]d, the points -occur in counter\[hy]clockwise order; otherwise they occur in input order. -For Delaunay triangulations, 'Fx' lists the extreme points of the -input sites. The points are unordered. -.PP -.TP -Geomview options -.TP -G -Produce a file for viewing with Geomview. Without other options, -Qhull displays edges in 2\[hy]d, outer planes in 3\[hy]d, and ridges in 4\[hy]d. -A ridge can be -explicit or implicit. An explicit ridge is a dim\-1 dimensional simplex -between two facets. -In 4\[hy]d, the explicit ridges are triangles. -When displaying a ridge in 4\[hy]d, Qhull projects the ridge's vertices to -one of its facets' hyperplanes. -Use 'Gh' to -project ridges to the intersection of both hyperplanes. -.TP -Ga -Display all input points as dots. -.TP -Gc -Display the centrum for each facet in 3\[hy]d. The centrum is defined by a -green radius sitting on a blue plane. The plane corresponds to the -facet's hyperplane. -The radius is defined by 'C\-n' or 'Cn'. -.TP -GDn -Drop dimension n in 3\[hy]d or 4\[hy]d. The result is a 2\[hy]d or 3\[hy]d object. -.TP -Gh -Display hyperplane intersections in 3\[hy]d and 4\[hy]d. In 3\[hy]d, the -intersection is a black line. It lies on two neighboring hyperplanes -(c.f., the blue squares associated with centrums ('Gc')). In 4\[hy]d, -the ridges are projected to the intersection of both hyperplanes. -.TP -Gi -Display inner planes in 2\[hy]d and 3\[hy]d. The inner plane of a facet -is below all of its vertices. It is parallel to the facet's hyperplane. -The inner plane's color is the opposite (1\-r,1\-g,1\-b) of the outer -plane. Its edges are determined by the vertices. -.TP -Gn -Do not display inner or outer planes. By default, -Geomview displays the precise plane (no merging) or both -inner and output planes (merging). Under merging, Geomview does -not display the inner plane if the -the difference between inner and outer is too small. -.TP -Go -Display outer planes in 2\[hy]d and 3\[hy]d. The outer plane of a facet -is above all input points. It is parallel to the facet's hyperplane. -Its color is determined by the facet's normal, and its -edges are determined by the vertices. -.TP -Gp -Display coplanar points and vertices as radii. A radius defines a ball -which corresponds to the imprecision of the point. The imprecision is -the maximum of the roundoff error, the centrum radius, and maxcoord * -(1\-An). It is at least 1/20'th of the maximum coordinate, -and ignores post\[hy]merging if pre\[hy]merging is done. -.TP -Gr -Display ridges in 3\[hy]d. A ridge connects the two vertices that are shared -by neighboring facets. Ridges are always displayed in 4\[hy]d. -.TP -Gt -A 3\[hy]d Delaunay triangulation looks like a convex hull with interior -facets. Option 'Gt' removes the outside ridges to reveal the outermost -facets. It automatically sets options 'Gr' and 'GDn'. -.TP -Gv -Display vertices as spheres. The radius of the sphere corresponds to -the imprecision of the data. See 'Gp' for determining the radius. -.PP -.TP -Print options -.TP -PAn -Only the n largest facets are marked good for printing. -Unless 'PG' is set, 'Pg' is automatically set. -.TP -Pdk:n -Drop facet from output if normal[k] <= n. The option 'Pdk' uses the -default value of 0 for n. -.TP -PDk:n -Drop facet from output if normal[k] >= n. The option 'PDk' uses the -default value of 0 for n. -.TP -PFn -Only facets with area at least 'n' are marked good for printing. -Unless 'PG' is set, 'Pg' is automatically set. -.TP -Pg -Print only good facets. A good facet is either visible from a point -(the 'QGn' option) or includes a point (the 'QVn' option). It also meets the -requirements of 'Pdk' and 'PDk' options. Option 'Pg' is automatically -set for options 'PAn' and 'PFn'. -.TP -PG -Print neighbors of good facets. -.TP -PMn -Only the n facets with the most merges are marked good for printing. -Unless 'PG' is set, 'Pg' is automatically set. -.TP -Po -Force output despite precision problems. Verify ('Tv') does not check -coplanar points. -Flipped facets are reported and concave facets are counted. -If 'Po' is used, points are not -partitioned into flipped facets and a flipped facet is always visible -to a point. -Also, if an error occurs before the completion of Qhull and tracing is -not active, 'Po' outputs a neighborhood of the erroneous facets -(if any). -.TP -Pp -Do not report precision problems. -.PP -.TP -Qhull control options -.TP -Qbk:0Bk:0 -Drop dimension k from the input points. This allows the user to -take convex hulls of sub\[hy]dimensional objects. It happens before -the Delaunay and Voronoi transformation. -.TP -QbB -Scale the input points to fit the unit cube. After scaling, the lower -bound will be \-0.5 and the upper bound +0.5 in all dimensions. -For Delaunay and -Voronoi diagrams, scaling happens after projection to the paraboloid. -Under precise -arithmetic, scaling does not change the topology of the convex hull. -.TP -Qbb -Scale the last coordinate to [0, m] where m is the maximum absolute -value of the other coordinates. For Delaunay and -Voronoi diagrams, scaling happens after projection to the paraboloid. -It reduces roundoff error for inputs with integer coordinates. -Under precise -arithmetic, scaling does not change the topology of the convex hull. -.TP -Qbk:n -Scale the k'th coordinate of the input points. After scaling, the lower -bound of the input points will be n. 'Qbk' scales to \-0.5. -.TP -QBk:n -Scale the k'th coordinate of the input points. After scaling, the upper -bound will be n. 'QBk' scales to +0.5. -.TP -Qc -Keep coplanar points with the nearest facet. Output -formats 'p', 'f', 'Gp', 'Fc', 'FN', and 'FP' will print the points. -.TP -Qf -Partition points to the furthest outside facet. -.TP -Qg -Only build good facets. With the 'Qg' option, Qhull will only build -those facets that it needs to determine the good facets in the output. -See 'QGn', 'QVn', and 'PdD' for defining good facets, and 'Pg' and 'PG' -for printing good facets and their neighbors. -.TP -QGn -A facet is good (see 'Qg' and 'Pg') if it is visible from point n. If n < 0, a facet is -good if it is not visible from point n. Point n is not added to the -hull (unless 'TCn' or 'TPn'). -With rbox, use the 'Pn,m,r' option to define your point; it -will be point 0 (QG0). -.TP -Qi -Keep interior points with the nearest facet. -Output formats 'p', 'f', 'Gp', 'FN', 'FP', and 'Fc' will print the points. -.TP -QJn -Joggle each input coordinate by adding a random number in [\-n,n]. If a -precision error occurs, then qhull increases n and tries again. It does -not increase n beyond a certain value, and it stops after a certain number -of attempts [see user.h]. Option 'QJ' -selects a default value for n. The output will be simplicial. For -Delaunay triangulations, 'QJn' sets 'Qbb' to scale the last coordinate -(not if 'Qbk:n' or 'QBk:n' is set). -\'QJn' is deprecated for Voronoi diagrams. See also 'Qt'. -.TP -Qm -Only process points that would otherwise increase max_outside. Other -points are treated as coplanar or interior points. -.TP -Qr -Process random outside points instead of furthest ones. This makes -Qhull equivalent to the randomized incremental algorithms. CPU time -is not reported since the randomization is inefficient. -.TP -QRn -Randomly rotate the input points. If n=0, use time as the random number seed. -If n>0, use n as the random number seed. If n=\-1, don't rotate but use -time as the random number seed. For Delaunay triangulations ('d' and 'v'), -rotate about the last axis. -.TP -Qs -Search all points for the initial simplex. -.TP -Qt -Triangulated output. Triangulate all non\[hy]simplicial facets. -\'Qt' is deprecated for Voronoi diagrams. See also 'Qt'. -.TP -Qv -Test vertex neighbors for convexity after post\[hy]merging. -To use the 'Qv' option, you also need to set a merge option -(e.g., 'Qx' or 'C\-0'). -.TP -QVn -A good facet (see 'Qg' and 'Pg') includes point n. If n<0, then a good facet does not -include point n. The point is either in the initial simplex or it -is the first point added to the hull. Option 'QVn' may not be used with merging. -.TP -Qx -Perform exact merges while building the hull. The "exact" merges -are merging a point into a coplanar facet (defined by 'Vn', 'Un', -and 'C\-n'), merging concave facets, merging duplicate ridges, and -merging flipped facets. Coplanar merges and angle coplanar merges ('A\-n') -are not performed. Concavity testing is delayed until a merge occurs. - -After -the hull is built, all coplanar merges are performed (defined by 'C\-n' -and 'A\-n'), then post\[hy]merges are performed -(defined by 'Cn' and 'An'). -.TP -Qz -Add a point "at infinity" that is above the paraboloid for Delaunay triangulations -and Voronoi diagrams. This reduces precision problems and allows the triangulation -of cospherical points. -.PP -.TP -Qhull experiments and speedups -.TP -Q0 -Turn off pre\[hy]merging as a default option. -With 'Q0'/'Qx' and without explicit pre\[hy]merge options, Qhull -ignores precision issues while constructing the convex hull. This -may lead to precision errors. If so, a descriptive warning is -generated. -.TP -Q1 -With 'Q1', Qhull sorts merges by type (coplanar, angle coplanar, concave) -instead of by angle. -.TP -Q2 -With 'Q2', Qhull merges all facets at once instead of using -independent sets of merges and then retesting. -.TP -Q3 -With 'Q3', Qhull does not remove redundant vertices. -.TP -Q4 -With 'Q4', Qhull avoids merges of an old facet into a new facet. -.TP -Q5 -With 'Q5', Qhull does not correct outer planes at the end. The -maximum outer plane is used instead. -.TP -Q6 -With 'Q6', Qhull does not pre\[hy]merge concave or coplanar facets. -.TP -Q7 -With 'Q7', Qhull processes facets in depth\[hy]first order instead of -breadth\[hy]first order. -.TP -Q8 -With 'Q8' and merging, Qhull does not retain near\[hy]interior points for adjusting -outer planes. 'Qc' will probably retain -all points that adjust outer planes. -.TP -Q9 -With 'Q9', Qhull processes the furthest of all outside sets at each iteration. -.TP -Q10 -With 'Q10', Qhull does not use special processing for narrow distributions. -.TP -Q11 -With 'Q11', Qhull copies normals and recompute centrums for tricoplanar facets. -.TP -Q12 -With 'Q12', Qhull does not report a very wide merge due to a duplicated ridge with nearly coincident vertices -.PP -.TP -Trace options -.TP -Tn -Trace at level n. Qhull includes full execution tracing. 'T\-1' -traces events. 'T1' traces -the overall execution of the program. 'T2' and 'T3' trace overall -execution and geometric and topological events. 'T4' traces the -algorithm. 'T5' includes information about memory allocation and -Gaussian elimination. -.TP -Ta -Annotate output with codes that identify the -corresponding qh_fprintf() statement. -.TP -Tc -Check frequently during execution. This will catch most inconsistency -errors. -.TP -TCn -Stop Qhull after building the cone of new facets for point n. The -output for 'f' includes the cone and the old hull. -See also 'TVn'. -.TP -TFn -Report progress whenever more than n facets are created -During post\[hy]merging, 'TFn' -reports progress after more than n/2 merges. -.TP -TI file -Input data from 'file'. The filename may not include spaces or -quotes. -.TP -TO file -Output results to 'file'. The name may be enclosed in single -quotes. -.TP -TPn -Turn on tracing when point n is added to the hull. Trace -partitions of point n. If used with TWn, turn off -tracing after adding point n to the hull. -.TP -TRn -Rerun qhull n times. Usually used with 'QJn' to determine the -probability that a given joggle will fail. -.TP -Ts -Collect statistics and print to stderr at the end of execution. -.TP -Tv -Verify the convex hull. This checks the topological structure, facet -convexity, and point inclusion. -If precision problems occurred, facet convexity is tested whether or -not 'Tv' is selected. -Option 'Tv' does not check point inclusion if forcing output with 'Po', -or if 'Q5' is set. - -For point inclusion testing, Qhull verifies that all points are below -all outer planes (facet\->maxoutside). Point inclusion is exhaustive -if merging or if the facet\[hy]point product is small enough; -otherwise Qhull verifies each point with a directed -search (qh_findbest). - -Point inclusion testing occurs after producing output. It prints -a message to stderr unless option 'Pp' is used. This -allows the user to interrupt Qhull without changing the output. -.TP -TVn -Stop Qhull after adding point n. If n < 0, stop Qhull before adding -point n. Output shows the hull at this time. See also 'TCn' -.TP -TMn -Turn on tracing at n'th merge. -.TP -TWn -Trace merge facets when the width is greater than n. -.TP -Tz -Redirect stderr to stdout. -.PP -.SH BUGS -Please report bugs to Brad Barber at qhull_bug@qhull.org. - -If Qhull does not compile, it is due to an incompatibility between your -system and ours. The first thing to check is that your compiler is -ANSI standard. If it is, check the man page for the best options, or -find someone to help you. If you locate the cause of your problem, -please send email since it might help others. - -If Qhull compiles but crashes on the test case (rbox D4), there's -still incompatibility between your system and ours. Typically it's -been due to mem.c and memory alignment. You can use qh_NOmem in mem.h -to turn off memory management. Please let us know if you figure out -how to fix these problems. - -If you do find a problem, try to simplify it before reporting the -error. Try different size inputs to locate the smallest one that -causes an error. You're welcome to hunt through the code using the -execution trace as a guide. This is especially true if you're -incorporating Qhull into your own program. - -When you do report an error, please attach a data set to the -end of your message. This allows us to see the error for ourselves. -Qhull is maintained part\[hy]time. -.PP -.SH E\[hy]MAIL -Please send correspondence to qhull@qhull.org and report bugs to -qhull_bug@qhull.org. Let us know how you use Qhull. If you -mention it in a paper, please send the reference and an abstract. - -If you would like to get Qhull announcements (e.g., a new version) -and news (any bugs that get fixed, etc.), let us know and we will add you to -our mailing list. If you would like to communicate with other -Qhull users, we will add you to the qhull_users alias. -For Internet news about geometric algorithms and convex hulls, look at -comp.graphics.algorithms and sci.math.num\-analysis - -.SH SEE ALSO -rbox(1) - -Barber, C. B., D.P. Dobkin, and H.T. Huhdanpaa, -"The Quickhull Algorithm for Convex Hulls," ACM -Trans. on Mathematical Software, 22(4):469\[en]483, Dec. 1996. -http://portal.acm.org/citation.cfm?doid=235815.235821 -http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.117.405 - -Clarkson, K.L., K. Mehlhorn, and R. Seidel, "Four results on randomized -incremental construction," Computational Geometry: Theory and Applications, -vol. 3, p. 185\[en]211, 1993. - -Preparata, F. and M. Shamos, Computational -Geometry, Springer\[hy]Verlag, New York, 1985. - -.PP -.SH AUTHORS -.nf - C. Bradford Barber Hannu Huhdanpaa - bradb@shore.net hannu@qhull.org - - .fi - -.SH ACKNOWLEDGEMENTS - -A special thanks to Albert Marden, Victor Milenkovic, the Geometry Center, -Harvard University, and Endocardial Solutions, Inc. for supporting this work. - -Qhull 1.0 and 2.0 were developed under National Science Foundation -grants NSF/DMS\[hy]8920161 and NSF\[hy]CCR\[hy]91\[hy]15793 750\[hy]7504. David Dobkin -guided the original work at Princeton University. -If you find it useful, please let us know. - -The Geometry Center is supported by grant DMS\[hy]8920161 from the National -Science Foundation, by grant DOE/DE\[hy]FG02\[hy]92ER25137 from the Department -of Energy, by the University of Minnesota, and by Minnesota Technology, Inc. - -Qhull is available from http://www.qhull.org diff --git a/src/qhull/html/qhull.txt b/src/qhull/html/qhull.txt deleted file mode 100644 index 03753547e9c..00000000000 --- a/src/qhull/html/qhull.txt +++ /dev/null @@ -1,1263 +0,0 @@ - - - -qhull(1) qhull(1) - - -NAME - qhull - convex hull, Delaunay triangulation, Voronoi dia- - gram, halfspace intersection about a point, hull volume, facet area - -SYNOPSIS - qhull- compute convex hulls and related structures - input (stdin): dimension, #points, point coordinates - first comment (non-numeric) is listed in the summary - halfspace: use dim plus one with offsets after coefficients - - options (qh-quick.htm): - d - Delaunay triangulation by lifting points to a paraboloid - v - Voronoi diagram via the Delaunay triangulation - H1,1 - Halfspace intersection about [1,1,0,...] - d Qu - Furthest-site Delaunay triangulation (upper convex hull) - v Qu - Furthest-site Voronoi diagram - QJ - Joggle the input to avoid precision problems - . - concise list of all options - - - one-line description of all options - - Output options (subset): - FA - compute total area and volume - Fx - extreme points (convex hull vertices) - G - Geomview output (2-d, 3-d and 4-d) - Fp - halfspace intersection coordinates - m - Mathematica output (2-d and 3-d) - n - normals with offsets - o - OFF file format (if Voronoi, outputs regions) - TO file- output results to file, may be enclosed in single quotes - f - print all fields of all facets - s - summary of results (default) - Tv - verify result: structure, convexity, and point inclusion - p - vertex coordinates - i - vertices incident to each facet - - example: - rbox 1000 s | qhull Tv s FA - - - html manual: index.htm - - installation: README.txt - - see also: COPYING.txt, REGISTER.txt, Changes.txt - - WWW: - - GIT: - - mirror: - - news: - - Geomview: - - news group: - - FAQ: - - email: qhull@qhull.org - - bug reports: qhull_bug@qhull.org - - - - -Geometry Center 2003/12/30 1 - - - - - -qhull(1) qhull(1) - - - The sections are: - - INTRODUCTION - - DESCRIPTION, a description of Qhull - - IMPRECISION, how Qhull handles imprecision - - OPTIONS - - Input and output options - - Additional input/output formats - - Precision options - - Geomview options - - Print options - - Qhull options - - Trace options - - BUGS - - E-MAIL - - SEE ALSO - - AUTHORS - - ACKNOWLEGEMENTS - - This man page briefly describes all Qhull options. Please - report any mismatches with Qhull's html manual (qh- - man.htm). - - - -INTRODUCTION - Qhull is a general dimension code for computing convex - hulls, Delaunay triangulations, Voronoi diagram, furthest- - site Voronoi diagram, furthest-site Delaunay triangula- - tions, and halfspace intersections about a point. It - implements the Quickhull algorithm for computing the con- - vex hull. Qhull handles round-off errors from floating - point arithmetic. It can approximate a convex hull. - - The program includes options for hull volume, facet area, - partial hulls, input transformations, randomization, trac- - ing, multiple output formats, and execution statistics. - The program can be called from within your application. - You can view the results in 2-d, 3-d and 4-d with - Geomview. - - -DESCRIPTION - The format of input is the following: first line contains - the dimension, second line contains the number of input - points, and point coordinates follow. The dimension and - number of points can be reversed. Comments and line - breaks are ignored. A comment starts with a non-numeric - character and continues to the end of line. The first - comment is reported in summaries and statistics. Error - reporting is better if there is one point per line. - - The default printout option is a short summary. There are - many other output formats. - - - - -Geometry Center 2003/12/30 2 - - - - - -qhull(1) qhull(1) - - - Qhull implements the Quickhull algorithm for convex hull. - This algorithm combines the 2-d Quickhull algorithm with - the n-d beneath-beyond algorithm [c.f., Preparata & Shamos - '85]. It is similar to the randomized algorithms of - Clarkson and others [Clarkson et al. '93]. The main - advantages of Quickhull are output sensitive performance, - reduced space requirements, and automatic handling of pre- - cision problems. - - The data structure produced by Qhull consists of vertices, - ridges, and facets. A vertex is a point of the input set. - A ridge is a set of d vertices and two neighboring facets. - For example in 3-d, a ridge is an edge of the polyhedron. - A facet is a set of ridges, a set of neighboring facets, a - set of incident vertices, and a hyperplane equation. For - simplicial facets, the ridges are defined by the vertices - and neighboring facets. When Qhull merges two facets, it - produces a non-simplicial facet. A non-simplicial facet - has more than d neighbors and may share more than one - ridge with a neighbor. - - -IMPRECISION - Since Qhull uses floating point arithmetic, roundoff error - may occur for each calculation. This causes problems for - most geometric algorithms. - - Qhull automatically sets option 'C-0' in 2-d, 3-d, and - 4-d, or option 'Qx' in 5-d and higher. These options han- - dle precision problems by merging facets. Alternatively, - use option 'QJ' to joggle the input. - - With 'C-0', Qhull merges non-convex facets while con- - structing the hull. The remaining facets are clearly con- - vex. With 'Qx', Qhull merges coplanar horizon facets, - flipped facets, concave facets and duplicated ridges. It - merges coplanar facets after constructing the hull. With - 'Qx', coplanar points may be missed, but it appears to be - unlikely. - - To guarantee triangular output, joggle the input with - option 'QJ'. Facet merging will not occur. - -OPTIONS - To get a list of the most important options, execute - 'qhull' by itself. To get a complete list of options, - execute 'qhull -'. To get a complete, concise list of - options, execute 'qhull .'. - - Options can be in any order. Capitalized options take an - argument (except 'PG' and 'F' options). Single letters - are used for output formats and precision constants. The - other options are grouped into menus for other output for- - mats ('F'), Geomview output ('G'), printing ('P'), Qhull - - - -Geometry Center 2003/12/30 3 - - - - - -qhull(1) qhull(1) - - - control ('Q'), and tracing ('T'). - - Main options: - - default - Compute the convex hull of the input points. - Report a summary of the result. - - d Compute the Delaunay triangulation by lifting the - input points to a paraboloid. The 'o' option - prints the input points and facets. The 'QJ' - option guarantees triangular output. The 'Ft' - option prints a triangulation. It adds points (the - centrums) to non-simplicial facets. - - v Compute the Voronoi diagram from the Delaunay tri- - angulation. The 'p' option prints the Voronoi ver- - tices. The 'o' option prints the Voronoi vertices - and the vertices in each Voronoi region. It lists - regions in site id order. The 'Fv' option prints - each ridge of the Voronoi diagram. The first or - zero'th vertex indicates the infinity vertex. Its - coordinates are qh_INFINITE (-10.101). It indi- - cates unbounded Voronoi regions or degenerate - Delaunay triangles. - - Hn,n,... - Compute halfspace intersection about [n,n,0,...]. - The input is a set of halfspaces defined in the - same format as 'n', 'Fo', and 'Fi'. Use 'Fp' to - print the intersection points. Use 'Fv' to list - the intersection points for each halfspace. The - other output formats display the dual convex hull. - - The point [n,n,n,...] is a feasible point for the - halfspaces, i.e., a point that is inside all of the - halfspaces (Hx+b <= 0). The default coordinate - value is 0. - - The input may start with a feasible point. If so, - use 'H' by itself. The input starts with a feasi- - ble point when the first number is the dimension, - the second number is "1", and the coordinates com- - plete a line. The 'FV' option produces a feasible - point for a convex hull. - - d Qu Compute the furthest-site Delaunay triangulation - from the upper convex hull. The 'o' option prints - the input points and facets. The 'QJ' option guar- - antees triangular otuput. You can also use facets. - - v Qu Compute the furthest-site Voronoi diagram. The 'p' - option prints the Voronoi vertices. The 'o' option - prints the Voronoi vertices and the vertices in - - - -Geometry Center 2003/12/30 4 - - - - - -qhull(1) qhull(1) - - - each Voronoi region. The 'Fv' option prints each - ridge of the Voronoi diagram. The first or zero'th - vertex indicates the infinity vertex at infinity. - Its coordinates are qh_INFINITE (-10.101). It - indicates unbounded Voronoi regions and degenerate - Delaunay triangles. - - Qt Triangulated output. - - - Input/Output options: - - f Print out all facets and all fields of each facet. - - G Output the hull in Geomview format. For imprecise - hulls, Geomview displays the inner and outer hull. - Geomview can also display points, ridges, vertices, - coplanar points, and facet intersections. See - below for a list of options. - - For Delaunay triangulations, 'G' displays the cor- - responding paraboloid. For halfspace intersection, - 'G' displays the dual polytope. - - i Output the incident vertices for each facet. Qhull - prints the number of facets followed by the ver- - tices of each facet. One facet is printed per - line. The numbers are the 0-relative indices of - the corresponding input points. The facets are - oriented. - - In 4-d and higher, Qhull triangulates non-simpli- - cial facets. Each apex (the first vertex) is a - created point that corresponds to the facet's cen- - trum. Its index is greater than the indices of the - input points. Each base corresponds to a simpli- - cial ridge between two facets. To print the ver- - tices without triangulation, use option 'Fv'. - - m Output the hull in Mathematica format. Qhull - writes a Mathematica file for 2-d and 3-d convex - hulls and for 2-d Delaunay triangulations. Qhull - produces a list of objects that you can assign to a - variable in Mathematica, for example: "list= << - ". If the object is 2-d, it can be - visualized by "Show[Graphics[list]] ". For 3-d - objects the command is "Show[Graphics3D[list]]". - - n Output the normal equation for each facet. Qhull - prints the dimension (plus one), the number of - facets, and the normals for each facet. The - facet's offset follows its normal coefficients. - - o Output the facets in OFF file format. Qhull prints - the dimension, number of points, number of facets, - and number of ridges. Then it prints the - - - -Geometry Center 2003/12/30 5 - - - - - -qhull(1) qhull(1) - - - coordinates of the input points and the vertices - for each facet. Each facet is on a separate line. - The first number is the number of vertices. The - remainder are the indices of the corresponding - points. The vertices are oriented in 2-d, 3-d, and - in simplicial facets. - - For 2-d Voronoi diagrams, the vertices are sorted - by adjacency, but not oriented. In 3-d and higher, - the Voronoi vertices are sorted by index. See the - 'v' option for more information. - - p Output the coordinates of each vertex point. Qhull - prints the dimension, the number of points, and the - coordinates for each vertex. With the 'Gc' and - 'Gi' options, it also prints coplanar and interior - points. For Voronoi diagrams, it prints the coor- - dinates of each Voronoi vertex. - - s Print a summary to stderr. If no output options - are specified at all, a summary goes to stdout. - The summary lists the number of input points, the - dimension, the number of vertices in the convex - hull, the number of facets in the convex hull, the - number of good facets (if 'Pg'), and statistics. - - The last two statistics (if needed) measure the - maximum distance from a point or vertex to a facet. - The number in parenthesis (e.g., 2.1x) is the ratio - between the maximum distance and the worst-case - distance due to merging two simplicial facets. - - - Precision options - - An Maximum angle given as a cosine. If the angle - between a pair of facet normals is greater than n, Qhull - merges one of the facets into a neighbor. If 'n' - is negative, Qhull tests angles after adding each - point to the hull (pre-merging). If 'n' is posi- - tive, Qhull tests angles after constructing the - hull (post-merging). Both pre- and post-merging - can be defined. - - Option 'C0' or 'C-0' is set if the corresponding - 'Cn' or 'C-n' is not set. If 'Qx' is set, then 'A- - n' and 'C-n' are checked after the hull is con- - structed and before 'An' and 'Cn' are checked. - - Cn Centrum radius. If a centrum is less than n below - a neighboring facet, Qhull merges one of the - facets. If 'n' is negative or '-0', Qhull tests - and merges facets after adding each point to the - hull. This is called "pre-merging". If 'n' is - - - -Geometry Center 2003/12/30 6 - - - - - -qhull(1) qhull(1) - - - positive, Qhull tests for convexity after con- - structing the hull ("post-merging"). Both pre- and - post-merging can be defined. - - For 5-d and higher, 'Qx' should be used instead of - 'C-n'. Otherwise, most or all facets may be merged - together. - - En Maximum roundoff error for distance computations. - - Rn Randomly perturb distance computations up to +/- n - * max_coord. This option perturbs every distance, - hyperplane, and angle computation. To use time as - the random number seed, use option 'QR-1'. - - Vn Minimum distance for a facet to be visible. A - facet is visible if the distance from the point to - the facet is greater than 'Vn'. - - Without merging, the default value for 'Vn' is the - round-off error ('En'). With merging, the default - value is the pre-merge centrum ('C-n') in 2-d or - 3--d, or three times that in other dimensions. If - the outside width is specified ('Wn'), the maximum, - default value for 'Vn' is 'Wn'. - - Un Maximum distance below a facet for a point to be - coplanar to the facet. The default value is 'Vn'. - - Wn Minimum outside width of the hull. Points are - added to the convex hull only if they are clearly - outside of a facet. A point is outside of a facet - if its distance to the facet is greater than 'Wn'. - The normal value for 'Wn' is 'En'. If the user - specifies pre-merging and does not set 'Wn', than - 'Wn' is set to the premerge 'Cn' and maxco- - ord*(1-An). - - - Additional input/output formats - - Fa Print area for each facet. For Delaunay triangula- - tions, the area is the area of the triangle. For - Voronoi diagrams, the area is the area of the dual - facet. Use 'PAn' for printing the n largest - facets, and option 'PFn' for printing facets larger - than 'n'. - - The area for non-simplicial facets is the sum of - the areas for each ridge to the centrum. Vertices - far below the facet's hyperplane are ignored. The - reported area may be significantly less than the - actual area. - - - - -Geometry Center 2003/12/30 7 - - - - - -qhull(1) qhull(1) - - - FA Compute the total area and volume for option 's'. - It is an approximation for non-simplicial facets - (see 'Fa'). - - Fc Print coplanar points for each facet. The output - starts with the number of facets. Then each facet - is printed one per line. Each line is the number - of coplanar points followed by the point ids. - Option 'Qi' includes the interior points. Each - coplanar point (interior point) is assigned to the - facet it is furthest above (resp., least below). - - FC Print centrums for each facet. The output starts - with the dimension followed by the number of - facets. Then each facet centrum is printed, one - per line. - - Fd Read input in cdd format with homogeneous points. - The input starts with comments. The first comment - is reported in the summary. Data starts after a - "begin" line. The next line is the number of - points followed by the dimension+1 and "real" or - "integer". Then the points are listed with a - leading "1" or "1.0". The data ends with an "end" - line. - - For halfspaces ('Fd Hn,n,...'), the input format is - the same. Each halfspace starts with its offset. - The sign of the offset is the opposite of Qhull's - convention. - - FD Print normals ('n', 'Fo', 'Fi') or points ('p') in - cdd format. The first line is the command line - that invoked Qhull. Data starts with a "begin" - line. The next line is the number of normals or - points followed by the dimension+1 and "real". - Then the normals or points are listed with the - offset before the coefficients. The offset for - points is 1.0. The offset for normals has the - opposite sign. The data ends with an "end" line. - - FF Print facets (as in 'f') without printing the - ridges. - - Fi Print inner planes for each facet. The inner plane - is below all vertices. - - Fi Print separating hyperplanes for bounded, inner - regions of the Voronoi diagram. The first line is - the number of ridges. Then each hyperplane is - printed, one per line. A line starts with the num- - ber of indices and floats. The first pair lists - adjacent input sites, the next d floats are the - normalized coefficients for the hyperplane, and the - - - -Geometry Center 2003/12/30 8 - - - - - -qhull(1) qhull(1) - - - last float is the offset. The hyperplane is ori- - ented toward verify that the hyperplanes are per- - pendicular bisectors. Use 'Fo' for unbounded - regions, and 'Fv' for the corresponding Voronoi - vertices. - - FI Print facet identifiers. - - Fm Print number of merges for each facet. At most 511 - merges are reported for a facet. See 'PMn' for - printing the facets with the most merges. - - FM Output the hull in Maple format. See 'm' - - Fn Print neighbors for each facet. The output starts - with the number of facets. Then each facet is - printed one per line. Each line is the number of - neighbors followed by an index for each neighbor. - The indices match the other facet output formats. - - A negative index indicates an unprinted facet due - to printing only good facets ('Pg'). It is the - negation of the facet's id (option 'FI'). For - example, negative indices are used for facets "at - infinity" in the Delaunay triangulation. - - FN Print vertex neighbors or coplanar facet for each - point. The first line is the number of points. - Then each point is printed, one per line. If the - point is coplanar, the line is "1" followed by the - facet's id. If the point is not a selected vertex, - the line is "0". Otherwise, each line is the num- - ber of neighbors followed by the corresponding - facet indices (see 'Fn'). - - Fo Print outer planes for each facet in the same for- - mat as 'n'. The outer plane is above all points. - - Fo Print separating hyperplanes for unbounded, outer - regions of the Voronoi diagram. The first line is - the number of ridges. Then each hyperplane is - printed, one per line. A line starts with the num- - ber of indices and floats. The first pair lists - adjacent input sites, the next d floats are the - normalized coefficients for the hyperplane, and the - last float is the offset. The hyperplane is ori- - ented toward verify that the hyperplanes are per- - pendicular bisectors. Use 'Fi' for bounded - regions, and 'Fv' for the corresponding Voronoi - vertices. - - FO List all options to stderr, including the default - values. Additional 'FO's are printed to stdout. - - Fp Print points for halfspace intersections (option - 'Hn,n,...'). Each intersection corresponds to a - - - -Geometry Center 2003/12/30 9 - - - -qhull(1) qhull(1) - - - facet of the dual polytope. The "infinity" point - [-10.101,-10.101,...] indicates an unbounded - intersection. - - FP For each coplanar point ('Qc') print the point id - of the nearest vertex, the point id, the facet id, - and the distance. - - FQ Print command used for qhull and input. - - Fs Print a summary. The first line consists of the - number of integers ("7"), followed by the dimen- - sion, the number of points, the number of vertices, - the number of facets, the number of vertices - selected for output, the number of facets selected - for output, the number of coplanar points selected - for output. - - The second line consists of the number of reals - ("2"), followed by the maxmimum offset to an outer - plane and and minimum offset to an inner plane. - Roundoff is included. Later versions of Qhull may - produce additional integers or reals. - - FS Print the size of the hull. The first line con- - sists of the number of integers ("0"). The second - line consists of the number of reals ("2"), fol- - lowed by the total facet area, and the total vol- - ume. Later versions of Qhull may produce addi- - tional integers or reals. - - The total volume measures the volume of the inter- - section of the halfspaces defined by each facet. - Both area and volume are approximations for non- - simplicial facets. See option 'Fa'. - - Ft Print a triangulation with added points for non- - simplicial facets. The first line is the dimension - and the second line is the number of points and the - number of facets. The points follow, one per line, - then the facets follow as a list of point indices. - With option points include the point-at-infinity. - - Fv Print vertices for each facet. The first line is - the number of facets. Then each facet is printed, - one per line. Each line is the number of vertices - followed by the corresponding point ids. Vertices - are listed in the order they were added to the hull - (the last one is first). - - Fv Print all ridges of a Voronoi diagram. The first - line is the number of ridges. Then each ridge is - printed, one per line. A line starts with the num- - ber of indices. The first pair lists adjacent - - - -Geometry Center 2003/12/30 10 - - - - - -qhull(1) qhull(1) - - - input sites, the remaining indices list Voronoi - vertices. Vertex '0' indicates the vertex-at- - infinity (i.e., an unbounded ray). In 3-d, the - vertices are listed in order. See 'Fi' and 'Fo' - for separating hyperplanes. - - FV Print average vertex. The average vertex is a fea- - sible point for halfspace intersection. - - Fx List extreme points (vertices) of the convex hull. - The first line is the number of points. The other - lines give the indices of the corresponding points. - The first point is '0'. In 2-d, the points occur - in counter-clockwise order; otherwise they occur in - input order. For Delaunay triangulations, 'Fx' - lists the extreme points of the input sites. The - points are unordered. - - - Geomview options - - G Produce a file for viewing with Geomview. Without - other options, Qhull displays edges in 2-d, outer - planes in 3-d, and ridges in 4-d. A ridge can be - explicit or implicit. An explicit ridge is a dim-1 - dimensional simplex between two facets. In 4-d, - the explicit ridges are triangles. When displaying - a ridge in 4-d, Qhull projects the ridge's vertices - to one of its facets' hyperplanes. Use 'Gh' to - project ridges to the intersection of both hyper- - planes. - - Ga Display all input points as dots. - - Gc Display the centrum for each facet in 3-d. The - centrum is defined by a green radius sitting on a - blue plane. The plane corresponds to the facet's - hyperplane. The radius is defined by 'C-n' or - 'Cn'. - - GDn Drop dimension n in 3-d or 4-d. The result is a - 2-d or 3-d object. - - Gh Display hyperplane intersections in 3-d and 4-d. - In 3-d, the intersection is a black line. It lies - on two neighboring hyperplanes (c.f., the blue - squares associated with centrums ('Gc')). In 4-d, - the ridges are projected to the intersection of - both hyperplanes. - - Gi Display inner planes in 2-d and 3-d. The inner - plane of a facet is below all of its vertices. It - is parallel to the facet's hyperplane. The inner - plane's color is the opposite (1-r,1-g,1-b) of the - - - -Geometry Center 2003/12/30 11 - - - - - -qhull(1) qhull(1) - - - outer plane. Its edges are determined by the ver- - tices. - - Gn Do not display inner or outer planes. By default, - Geomview displays the precise plane (no merging) or - both inner and output planes (merging). Under - merging, Geomview does not display the inner plane - if the the difference between inner and outer is - too small. - - Go Display outer planes in 2-d and 3-d. The outer - plane of a facet is above all input points. It is - parallel to the facet's hyperplane. Its color is - determined by the facet's normal, and its edges are - determined by the vertices. - - Gp Display coplanar points and vertices as radii. A - radius defines a ball which corresponds to the - imprecision of the point. The imprecision is the - maximum of the roundoff error, the centrum radius, - and maxcoord * (1-An). It is at least 1/20'th of - the maximum coordinate, and ignores post-merging if - pre-merging is done. - - Gr Display ridges in 3-d. A ridge connects the two - vertices that are shared by neighboring facets. - Ridges are always displayed in 4-d. - - Gt A 3-d Delaunay triangulation looks like a convex - hull with interior facets. Option 'Gt' removes the - outside ridges to reveal the outermost facets. It - automatically sets options 'Gr' and 'GDn'. - - Gv Display vertices as spheres. The radius of the - sphere corresponds to the imprecision of the data. - See 'Gp' for determining the radius. - - - Print options - - PAn Only the n largest facets are marked good for - printing. Unless 'PG' is set, 'Pg' is automati- - cally set. - - Pdk:n Drop facet from output if normal[k] <= n. The - option 'Pdk' uses the default value of 0 for n. - - PDk:n Drop facet from output if normal[k] >= n. The - option 'PDk' uses the default value of 0 for n. - - PFn Only facets with area at least 'n' are marked good - for printing. Unless 'PG' is set, 'Pg' is automat- - ically set. - - - - -Geometry Center 2003/12/30 12 - - - - - -qhull(1) qhull(1) - - - Pg Print only good facets. A good facet is either - visible from a point (the 'QGn' option) or includes - a point (the 'QVn' option). It also meets the - requirements of 'Pdk' and 'PDk' options. Option - 'Pg' is automatically set for options 'PAn' and - 'PFn'. - - PG Print neighbors of good facets. - - PMn Only the n facets with the most merges are marked - good for printing. Unless 'PG' is set, 'Pg' is - automatically set. - - Po Force output despite precision problems. Verify ('Tv') does not check - coplanar points. Flipped facets are reported and - concave facets are counted. If 'Po' is used, - points are not partitioned into flipped facets and - a flipped facet is always visible to a point. - Also, if an error occurs before the completion of - Qhull and tracing is not active, 'Po' outputs a - neighborhood of the erroneous facets (if any). - - Pp Do not report precision problems. - - - Qhull control options - - Qbk:0Bk:0 - Drop dimension k from the input points. This - allows the user to take convex hulls of sub-dimen- - sional objects. It happens before the Delaunay and - Voronoi transformation. - - QbB Scale the input points to fit the unit cube. After - scaling, the lower bound will be -0.5 and the upper - bound +0.5 in all dimensions. For Delaunay and - Voronoi diagrams, scaling happens after projection - to the paraboloid. Under precise arithmetic, scal- - ing does not change the topology of the convex - hull. - - Qbb Scale the last coordinate to [0, m] where m is the - maximum absolute value of the other coordinates. - For Delaunay and Voronoi diagrams, scaling happens - after projection to the paraboloid. It reduces - roundoff error for inputs with integer coordinates. - Under precise arithmetic, scaling does not change - the topology of the convex hull. - - Qbk:n Scale the k'th coordinate of the input points. - After scaling, the lower bound of the input points - will be n. 'Qbk' scales to -0.5. - - - -Geometry Center 2003/12/30 13 - - - - - -qhull(1) qhull(1) - - - QBk:n Scale the k'th coordinate of the input points. - After scaling, the upper bound will be n. 'QBk' - scales to +0.5. - - Qc Keep coplanar points with the nearest facet. Out- - put formats 'p', 'f', 'Gp', 'Fc', 'FN', and 'FP' - will print the points. - - Qf Partition points to the furthest outside facet. - - Qg Only build good facets. With the 'Qg' option, - Qhull will only build those facets that it needs to - determine the good facets in the output. See - 'QGn', 'QVn', and 'PdD' for defining good facets, - and 'Pg' and 'PG' for printing good facets and - their neighbors. - - QGn A facet is good (see 'Qg' and 'Pg') if it is visi- - ble from point n. If n < 0, a facet is good if it - is not visible from point n. Point n is not added - to the hull (unless 'TCn' or 'TPn'). With rbox, - use the 'Pn,m,r' option to define your point; it - will be point 0 (QG0). - - Qi Keep interior points with the nearest facet. Out- - put formats 'p', 'f', 'Gp', 'FN', 'FP', and 'Fc' - will print the points. - - QJn Joggle each input coordinate by adding a random - number in [-n,n]. If a precision error occurs, - then qhull increases n and tries again. It does - not increase n beyond a certain value, and it stops - after a certain number of attempts [see user.h]. - Option 'QJ' selects a default value for n. The - output will be simplicial. For Delaunay triangula- - tions, 'QJn' sets 'Qbb' to scale the last coordi- - nate (not if 'Qbk:n' or 'QBk:n' is set). 'QJn' is - deprecated for Voronoi diagrams. See also 'Qt'. - - Qm Only process points that would otherwise increase - max_outside. Other points are treated as coplanar - or interior points. - - Qr Process random outside points instead of furthest - ones. This makes Qhull equivalent to the random- - ized incremental algorithms. CPU time is not - reported since the randomization is inefficient. - - QRn Randomly rotate the input points. If n=0, use time - as the random number seed. If n>0, use n as the - random number seed. If n=-1, don't rotate but use - time as the random number seed. For Delaunay tri- - angulations ('d' and 'v'), rotate about the last - axis. - - - - -Geometry Center 2003/12/30 14 - - - - - -qhull(1) qhull(1) - - - Qs Search all points for the initial simplex. - - Qt Triangulated output. Triangulate non-simplicial - facets. 'Qt' is deprecated for Voronoi diagrams. - See also 'QJn' - - Qv Test vertex neighbors for convexity after post- - merging. To use the 'Qv' option, you also need to - set a merge option (e.g., 'Qx' or 'C-0'). - - QVn A good facet (see 'Qg' and 'Pg') includes point n. - If n<0, then a good facet does not include point n. - The point is either in the initial simplex or it is - the first point added to the hull. Option 'QVn' - may not be used with merging. - - Qx Perform exact merges while building the hull. The - "exact" merges are merging a point into a coplanar - facet (defined by 'Vn', 'Un', and 'C-n'), merging - concave facets, merging duplicate ridges, and merg- - ing flipped facets. Coplanar merges and angle - coplanar merges ('A-n') are not performed. Concav- - ity testing is delayed until a merge occurs. - - After the hull is built, all coplanar merges are - performed (defined by 'C-n' and 'A-n'), then post- - merges are performed (defined by 'Cn' and 'An'). - - Qz Add a point "at infinity" that is above the - paraboloid for Delaunay triangulations and Voronoi - diagrams. This reduces precision problems and - allows the triangulation of cospherical points. - - - Qhull experiments and speedups - - Q0 Turn off pre-merging as a default option. With - 'Q0'/'Qx' and without explicit pre-merge options, - Qhull ignores precision issues while constructing - the convex hull. This may lead to precision - errors. If so, a descriptive warning is generated. - - Q1 With 'Q1', Qhull sorts merges by type (coplanar, - angle coplanar, concave) instead of by angle. - - Q2 With 'Q2', Qhull merges all facets at once instead - of using independent sets of merges and then - retesting. - - Q3 With 'Q3', Qhull does not remove redundant ver- - tices. - - Q4 With 'Q4', Qhull avoids merges of an old facet into - a new facet. - - Q5 With 'Q5', Qhull does not correct outer planes at - the end. The maximum outer plane is used instead. - - - - -Geometry Center 2003/12/30 15 - - - - - -qhull(1) qhull(1) - - - Q6 With 'Q6', Qhull does not pre-merge concave or - coplanar facets. - - Q7 With 'Q7', Qhull processes facets in depth-first - order instead of breadth-first order. - - Q8 With 'Q8' and merging, Qhull does not retain near- - interior points for adjusting outer planes. 'Qc' - will probably retain all points that adjust outer - planes. - - Q9 With 'Q9', Qhull processes the furthest of all out- - side sets at each iteration. - - Q10 With 'Q10', Qhull does not use special processing - for narrow distributions. - - Q11 With 'Q11', Qhull copies normals and recomputes - centrums for tricoplanar facets. - - Q12 With 'Q12', Qhull does not report a very wide merge due - to a duplicated ridge with nearly coincident vertices - - Trace options - - Tn Trace at level n. Qhull includes full execution - tracing. 'T-1' traces events. 'T1' traces the - overall execution of the program. 'T2' and 'T3' - trace overall execution and geometric and topologi- - cal events. 'T4' traces the algorithm. 'T5' - includes information about memory allocation and - Gaussian elimination. - - Ta Annotate output with codes that identify the - corresponding qh_fprintf() statement. - - Tc Check frequently during execution. This will catch - most inconsistency errors. - - TCn Stop Qhull after building the cone of new facets - for point n. The output for 'f' includes the cone - and the old hull. See also 'TVn'. - - TFn Report progress whenever more than n facets are - created During post-merging, 'TFn' reports progress - after more than n/2 merges. - - TI file - Input data from 'file'. The filename may not include - spaces or quotes. - - TO file - Output results to 'file'. The name may be enclosed - in single quotes. - - TPn Turn on tracing when point n is added to the hull. - Trace partitions of point n. If used with TWn, turn off - tracing after adding point n to the hull. - - TRn Rerun qhull n times. Usually used with 'QJn' to - determine the probability that a given joggle will - fail. - - Ts Collect statistics and print to stderr at the end - of execution. - - Tv Verify the convex hull. This checks the topologi- - cal structure, facet convexity, and point inclu- - sion. If precision problems occurred, facet con- - vexity is tested whether or not 'Tv' is selected. - Option 'Tv' does not check point inclusion if - - - -Geometry Center 2003/12/30 16 - - - - - -qhull(1) qhull(1) - - - forcing output with 'Po', or if 'Q5' is set. - - For point inclusion testing, Qhull verifies that - all points are below all outer planes (facet->max- - outside). Point inclusion is exhaustive if merging - or if the facet-point product is small enough; oth- - erwise Qhull verifies each point with a directed - search (qh_findbest). - - Point inclusion testing occurs after producing out- - put. It prints a message to stderr unless option - 'Pp' is used. This allows the user to interrupt - Qhull without changing the output. - - TVn Stop Qhull after adding point n. If n < 0, stop - Qhull before adding point n. Output shows the hull - at this time. See also 'TCn' - - TMn Turn on tracing at n'th merge. - - TWn Trace merge facets when the width is greater than - n. - - Tz Redirect stderr to stdout. - - -BUGS - Please report bugs to Brad Barber at - qhull_bug@qhull.org. - - If Qhull does not compile, it is due to an incompatibility - between your system and ours. The first thing to check is - that your compiler is ANSI standard. If it is, check the - man page for the best options, or find someone to help - you. If you locate the cause of your problem, please send - email since it might help others. - - If Qhull compiles but crashes on the test case (rbox D4), - there's still incompatibility between your system and - ours. Typically it's been due to mem.c and memory align- - ment. You can use qh_NOmem in mem.h to turn off memory - management. Please let us know if you figure out how to - fix these problems. - - If you do find a problem, try to simplify it before - reporting the error. Try different size inputs to locate - the smallest one that causes an error. You're welcome to - hunt through the code using the execution trace as a - guide. This is especially true if you're incorporating - Qhull into your own program. - - When you do report an error, please attach a data set to - the end of your message. This allows us to see the error - for ourselves. Qhull is maintained part-time. - - - -Geometry Center 2003/12/30 17 - - - - - -qhull(1) qhull(1) - - -E-MAIL - Please send correspondence to qhull@qhull.org and - report bugs to qhull_bug@qhull.org. Let us know how - you use Qhull. If you mention it in a paper, please send - the reference and an abstract. - - If you would like to get Qhull announcements (e.g., a new - version) and news (any bugs that get fixed, etc.), let us - know and we will add you to our mailing list. If you - would like to communicate with other Qhull users, we will - add you to the qhull_users alias. For Internet news about - geometric algorithms and convex hulls, look at comp.graph- - ics.algorithms and sci.math.num-analysis - - -SEE ALSO - rbox(1) - - Barber, C. B., D.P. Dobkin, and H.T. Huhdanpaa, "The - Quickhull Algorithm for Convex Hulls," ACM Trans. on Math- - ematical Software, 22(4):469-483, Dec. 1996. - http://portal.acm.org/citation.cfm?doid=235815.235821 - http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.117.405 - - - Clarkson, K.L., K. Mehlhorn, and R. Seidel, "Four results - on randomized incremental construction," Computational - Geometry: Theory and Applications, vol. 3, p. 185-211, - 1993. - - Preparata, F. and M. Shamos, Computational Geometry, - Springer-Verlag, New York, 1985. - - - -AUTHORS - C. Bradford Barber Hannu Huhdanpaa - bradb@shore.net hannu@qhull.org - - - -ACKNOWLEDGEMENTS - A special thanks to Albert Marden, Victor Milenkovic, the - Geometry Center, Harvard University, and Endocardial Solu- - tions, Inc. for supporting this work. - - Qhull 1.0 and 2.0 were developed under National Science Foundation - grants NSF/DMS-8920161 and NSF-CCR-91-15793 750-7504. David Dobkin - - - -Geometry Center 2003/12/30 18 - - - - - -qhull(1) qhull(1) - - - guided the original work at Princeton University. If you find it - useful, please let us know. - - The Geometry Center was supported by grant DMS-8920161 from the National - Science Foundation, by grant DOE/DE-FG02-92ER25137 from the Department - of Energy, by the University of Minnesota, and by Minnesota Technology, Inc. - - Qhull is available from http://www.qhull.org - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Geometry Center 2003/12/30 19 - - diff --git a/src/qhull/html/qvoron_f.htm b/src/qhull/html/qvoron_f.htm deleted file mode 100644 index db538b5ab54..00000000000 --- a/src/qhull/html/qvoron_f.htm +++ /dev/null @@ -1,396 +0,0 @@ - - - - -qvoronoi Qu -- furthest-site Voronoi diagram - - - - -Up: -Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: synopsis -• input • outputs -• controls • graphics -• notes • conventions -• options - -
    - -

    [delaunay]qvoronoi Qu -- furthest-site Voronoi diagram

    - -

    The furthest-site Voronoi diagram is the furthest-neighbor map for a set of -points. Each region contains those points that are further -from one input site than any other input site. See the -survey article by Aurenhammer ['91] -and the brief introduction by O'Rourke ['94]. The furthest-site Voronoi diagram is the dual of the furthest-site Delaunay triangulation. -

    - -
    -
    -
    Example: rbox 10 D2 | qvoronoi Qu s - o TO - result
    -
    Compute the 2-d, furthest-site Voronoi diagram of 10 - random points. Write a summary to the console and the Voronoi - regions and vertices to 'result'. The first vertex of the - result indicates unbounded regions. Almost all regions - are unbounded.
    -
    - -
    -
    Example: rbox r y c G1 D2 | qvoronoi Qu - s - Fn TO - result
    -
    Compute the 2-d furthest-site Voronoi diagram of a square - and a small triangle. Write a summary to the console and the Voronoi - vertices for each input site to 'result'. - The origin is the only furthest-site Voronoi vertex. The - negative indices indicate vertices-at-infinity.
    -
    -
    - -

    -Qhull computes the furthest-site Voronoi diagram via the -furthest-site Delaunay triangulation. -Each furthest-site Voronoi vertex is the circumcenter of an upper -facet of the Delaunay triangulation. Each furthest-site Voronoi -region corresponds to a vertex of the Delaunay triangulation -(i.e., an input site).

    - -

    See Qhull FAQ - Delaunay and -Voronoi diagram questions.

    - -

    The 'qvonoroi' program is equivalent to -'qhull v Qbb' in 2-d to 3-d, and -'qhull v Qbb Qx' -in 4-d and higher. It disables the following Qhull -options: d n m v H U Qb -QB Qc Qf Qg Qi Qm Qr QR Qv Qx TR E V Fa FA FC Fp FS Ft FV Gt Q0,etc. - - -

    Copyright © 1995-2015 C.B. Barber

    - -
    -

    »furthest-site qvoronoi synopsis

    -
    - -See qvoronoi synopsis. The same -program is used for both constructions. Use option 'Qu' -for furthest-site Voronoi diagrams. - - -
    -

    »furthest-site qvoronoi -input

    -
    -

    The input data on stdin consists of:

    -
      -
    • dimension -
    • number of points
    • -
    • point coordinates
    • -
    - -

    Use I/O redirection (e.g., qvoronoi Qu < data.txt), a pipe (e.g., rbox 10 | qvoronoi Qu), -or the 'TI' option (e.g., qvoronoi TI data.txt Qu). - -

    For example, this is a square containing four random points. -Its furthest-site Voronoi diagram has on vertex and four unbounded, -separating hyperplanes (i.e., the coordinate axes) -

    -

    -rbox c 4 D2 > data -
    -2 RBOX c 4 D2
    -8
    --0.4999921736307369 -0.3684622117955817
    -0.2556053225468894 -0.0413498678629751
    -0.0327672376602583 -0.2810408135699488
    --0.452955383763607 0.17886471718444
    -  -0.5   -0.5
    -  -0.5    0.5
    -   0.5   -0.5
    -   0.5    0.5
    -
    - -

    qvoronoi Qu s Fo < data -

    -
    -Furthest-site Voronoi vertices by the convex hull of 8 points in 3-d:
    -
    -  Number of Voronoi regions: 8
    -  Number of Voronoi vertices: 1
    -  Number of non-simplicial Voronoi vertices: 1
    -
    -Statistics for: RBOX c 4 D2 | QVORONOI Qu s Fo
    -
    -  Number of points processed: 8
    -  Number of hyperplanes created: 20
    -  Number of facets in hull: 11
    -  Number of distance tests for qhull: 34
    -  Number of merged facets: 1
    -  Number of distance tests for merging: 107
    -  CPU seconds to compute hull (after input):  0
    -
    -4
    -5 4 5      0      1      0
    -5 4 6      1      0      0
    -5 5 7      1      0      0
    -5 6 7      0      1      0
    -
    -
    - -
    -

    » furthest-site qvoronoi -outputs

    -
    - -

    These options control the output of furthest-site Voronoi diagrams.

    -
    - -
    -
     
    -
    furthest-site Voronoi vertices
    -
    p
    -
    print the coordinates of the furthest-site Voronoi vertices. The first line - is the dimension. The second line is the number of vertices. Each - remaining line is a furthest-site Voronoi vertex. The points-in-square example - has one furthest-site Voronoi vertex at the origin.
    -
    Fn
    -
    list the neighboring furthest-site Voronoi vertices for each furthest-site Voronoi - vertex. The first line is the number of Voronoi vertices. Each - remaining line starts with the number of neighboring vertices. Negative indices (e.g., -1) indicate vertices - outside of the Voronoi diagram. In the points-in-square example, the - Voronoi vertex at the origin has four neighbors-at-infinity.
    -
    FN
    -
    list the furthest-site Voronoi vertices for each furthest-site Voronoi region. The first line is - the number of Voronoi regions. Each remaining line starts with the - number of Voronoi vertices. Negative indices (e.g., -1) indicate vertices - outside of the Voronoi diagram. - In the points-in-square example, all regions share the Voronoi vertex - at the origin.
    - -
     
    -
     
    -
    furthest-site Voronoi regions
    -
    o
    -
    print the furthest-site Voronoi regions in OFF format. The first line is the - dimension. The second line is the number of vertices, the number - of input sites, and "1". The third line represents the vertex-at-infinity. - Its coordinates are "-10.101". The next lines are the coordinates - of the furthest-site Voronoi vertices. Each remaining line starts with the number - of Voronoi vertices in a Voronoi region. In 2-d, the vertices are -listed in adjacency order (unoriented). In 3-d and higher, the -vertices are listed in numeric order. In the points-in-square - example, each unbounded region includes the Voronoi vertex at - the origin. Lines consisting of 0 indicate - interior input sites.
    -
    Fi
    -
    print separating hyperplanes for inner, bounded furthest-site Voronoi - regions. The first number is the number of separating - hyperplanes. Each remaining line starts with 3+dim. The - next two numbers are adjacent input sites. The next dim - numbers are the coefficients of the separating hyperplane. The - last number is its offset. The are no bounded, separating hyperplanes - for the points-in-square example.
    -
    Fo
    -
    print separating hyperplanes for outer, unbounded furthest-site Voronoi - regions. The first number is the number of separating - hyperplanes. Each remaining line starts with 3+dim. The - next two numbers are adjacent input sites on the convex hull. The - next dim - numbers are the coefficients of the separating hyperplane. The - last number is its offset. The points-in-square example has four - unbounded, separating hyperplanes.
    -
     
    -
     
    -
    Input sites
    -
    Fv
    -
    list ridges of furthest-site Voronoi vertices for pairs of input sites. The - first line is the number of ridges. Each remaining line starts with - two plus the number of Voronoi vertices in the ridge. The next - two numbers are two adjacent input sites. The remaining numbers list - the Voronoi vertices. As with option 'o', a 0 indicates - the vertex-at-infinity - and an unbounded, separating hyperplane. - The perpendicular bisector (separating hyperplane) - of the input sites is a flat through these vertices. - In the points-in-square example, the ridge for each edge of the square - is unbounded.
    -
     
    -
     
    -
    General
    -
    s
    -
    print summary of the furthest-site Voronoi diagram. Use 'Fs' for numeric data.
    -
    i
    -
    list input sites for each furthest-site Delaunay region. Use option 'Pp' - to avoid the warning. The first line is the number of regions. The - remaining lines list the input sites for each region. The regions are - oriented. In the points-in-square example, the square region has four - input sites. In 3-d and higher, report cospherical sites by adding extra points. -
    -
    G
    -
    Geomview output for 2-d furthest-site Voronoi diagrams.
    -
    -
    - -
    -

    » furthest-site qvoronoi -controls

    -
    - -

    These options provide additional control:

    -
    - -
    -
    Qu
    -
    must be used.
    -
    QVn
    -
    select furthest-site Voronoi vertices for input site n
    -
    Tv
    -
    verify result
    -
    TI file
    -
    input data from file. The filename may not use spaces or quotes.
    -
    TO file
    -
    output results to file. Use single quotes if the filename - contains spaces (e.g., TO 'file with spaces.txt'
    -
    TFn
    -
    report progress after constructing n facets
    -
    PDk:1
    -
    include upper and lower facets in the output. Set k - to the last dimension (e.g., 'PD2:1' for 2-d inputs).
    -
    f
    -
    facet dump. Print the data structure for each facet (i.e., - furthest-site Voronoi vertex).
    -
    - -
    -
    -

    » furthest-site qvoronoi -graphics

    -
    -

    In 2-d, Geomview output ('G') -displays a furthest-site Voronoi diagram with extra edges to -close the unbounded furthest-site Voronoi regions. All regions -will be unbounded. Since the points-in-box example has only -one furthest-site Voronoi vertex, the Geomview output is one -point.

    - -

    See the Delaunay and Voronoi -examples for a 2-d example. Turn off normalization (on -Geomview's 'obscure' menu) when comparing the furthest-site -Voronoi diagram with the corresponding Voronoi diagram.

    - -
    -

    »furthest-site qvoronoi -notes

    -
    - -

    See Voronoi notes.

    - -
    -

    »furthest-site qvoronoi conventions

    -
    - -

    The following terminology is used for furthest-site Voronoi -diagrams in Qhull. The underlying structure is a furthest-site -Delaunay triangulation from a convex hull in one higher -dimension. Upper facets of the Delaunay triangulation correspond -to vertices of the furthest-site Voronoi diagram. Vertices of the -furthest-site Delaunay triangulation correspond to input sites. -They also define regions of the furthest-site Voronoi diagram. -All vertices are extreme points of the input sites. See qconvex conventions, furthest-site delaunay -conventions, and Qhull's data structures.

    - -
      -
    • input site - a point in the input (one dimension - lower than a point on the convex hull)
    • -
    • point - a point has d+1 coordinates. The - last coordinate is the sum of the squares of the input - site's coordinates
    • -
    • vertex - a point on the upper facets of the - paraboloid. It corresponds to a unique input site.
    • -
    • furthest-site Delaunay facet - an upper facet of the - paraboloid. The last coefficient of its normal is - clearly positive.
    • -
    • furthest-site Voronoi vertex - the circumcenter - of a furthest-site Delaunay facet
    • -
    • furthest-site Voronoi region - the region of - Euclidean space further from an input site than any other - input site. Qhull lists the furthest-site Voronoi - vertices that define each furthest-site Voronoi region.
    • -
    • furthest-site Voronoi diagram - the graph of the - furthest-site Voronoi regions with the ridges (edges) - between the regions.
    • -
    • infinity vertex - the Voronoi vertex for - unbounded furthest-site Voronoi regions in 'o' output format. Its - coordinates are -10.101.
    • -
    • good facet - an furthest-site Voronoi vertex with - optional restrictions by 'QVn', - etc.
    • -
    - -
    -

    »furthest-site qvoronoi options

    -
    - -See qvoronoi options. The same -program is used for both constructions. Use option 'Qu' -for furthest-site Voronoi diagrams. -
    - - -
    - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: synopsis -• input • outputs -• controls • graphics -• notes • conventions -• options - -


    - -

    The Geometry Center -Home Page

    - -

    Comments to: qhull@qhull.org -
    -Created: Sept. 25, 1995 --- Last modified: see top

    - - diff --git a/src/qhull/html/qvoronoi.htm b/src/qhull/html/qvoronoi.htm deleted file mode 100644 index 6d81d48c15b..00000000000 --- a/src/qhull/html/qvoronoi.htm +++ /dev/null @@ -1,667 +0,0 @@ - - - - -qvoronoi -- Voronoi diagram - - - - -Up: -Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: synopsis -• input • outputs -• controls • graphics -• notes • conventions -• options - -
    - -

    [voronoi]qvoronoi -- Voronoi diagram

    - -

    The Voronoi diagram is the nearest-neighbor map for a set of -points. Each region contains those points that are nearer -one input site than any other input site. It has many useful properties and applications. See the -survey article by Aurenhammer ['91] -and the detailed introduction by O'Rourke ['94]. The Voronoi diagram is the -dual of the Delaunay triangulation.

    - -
    -
    -
    Example: rbox 10 D3 | qvoronoi s - o TO - result
    -
    Compute the 3-d Voronoi diagram of 10 random points. Write a - summary to the console and the Voronoi vertices and - regions to 'result'. The first vertex of the result - indicates unbounded regions.
    - -
     
    -
    Example: rbox r y c G0.1 D2 | qvoronoi - s - o TO - result
    -
    Compute the 2-d Voronoi diagram of a triangle and a small - square. Write a - summary to the console and Voronoi vertices and regions - to 'result'. Report a single Voronoi vertex for - cocircular input sites. The first vertex of the result - indicates unbounded regions. The origin is the Voronoi - vertex for the square.
    - -
     
    -
    Example: rbox r y c G0.1 D2 | qvoronoi Fv - TO result
    -
    Compute the 2-d Voronoi diagram of a triangle and a small - square. Write a - summary to the console and the Voronoi ridges to - 'result'. Each ridge is the perpendicular bisector of a - pair of input sites. Vertex "0" indicates - unbounded ridges. Vertex "8" is the Voronoi - vertex for the square.
    - -
     
    -
    Example: rbox r y c G0.1 D2 | qvoronoi Fi
    -
    Print the bounded, separating hyperplanes for the 2-d Voronoi diagram of a - triangle and a small - square. Note the four hyperplanes (i.e., lines) for Voronoi vertex - "8". It is at the origin. -
    -
    -
    - -

    Qhull computes the Voronoi diagram via the Delaunay -triangulation. Each Voronoi -vertex is the circumcenter of a facet of the Delaunay -triangulation. Each Voronoi region corresponds to a vertex (i.e., input site) of the -Delaunay triangulation.

    - -

    Qhull outputs the Voronoi vertices for each Voronoi region. With -option 'Fv', -it lists all ridges of the Voronoi diagram with the corresponding -pairs of input sites. With -options 'Fi' and 'Fo', -it lists the bounded and unbounded separating hyperplanes. -You can also output a single Voronoi region -for further processing [see graphics].

    - -

    Use option 'Qz' if the input is circular, cospherical, or -nearly so. It improves precision by adding a point "at infinity," above the corresponding paraboloid. - -

    See Qhull FAQ - Delaunay and -Voronoi diagram questions.

    - -

    The 'qvonoroi' program is equivalent to -'qhull v Qbb' in 2-d to 3-d, and -'qhull v Qbb Qx' -in 4-d and higher. It disables the following Qhull -options: d n v Qbb QbB Qf Qg Qm -Qr QR Qv Qx Qz TR E V Fa FA FC FD FS Ft FV Gt Q0,etc. - -

    Copyright © 1995-2015 C.B. Barber

    - -

    Voronoi image by KOOK Architecture, Silvan Oesterle and Michael Knauss. - -


    -

    »qvoronoi synopsis

    - -
    -qvoronoi- compute the Voronoi diagram.
    -    input (stdin): dimension, number of points, point coordinates
    -    comments start with a non-numeric character
    -
    -options (qh-voron.htm):
    -    Qu   - compute furthest-site Voronoi diagram
    -    Tv   - verify result: structure, convexity, and in-circle test
    -    .    - concise list of all options
    -    -    - one-line description of all options
    -
    -output options (subset):
    -    s    - summary of results (default)
    -    p    - Voronoi vertices
    -    o    - OFF file format (dim, Voronoi vertices, and Voronoi regions)
    -    FN   - count and Voronoi vertices for each Voronoi region
    -    Fv   - Voronoi diagram as Voronoi vertices between adjacent input sites
    -    Fi   - separating hyperplanes for bounded regions, 'Fo' for unbounded
    -    G    - Geomview output (2-d only)
    -    QVn  - Voronoi vertices for input point n, -n if not
    -    TO file- output results to file, may be enclosed in single quotes
    -
    -examples:
    -rbox c P0 D2 | qvoronoi s o         rbox c P0 D2 | qvoronoi Fi
    -rbox c P0 D2 | qvoronoi Fo          rbox c P0 D2 | qvoronoi Fv
    -rbox c P0 D2 | qvoronoi s Qu Fv     rbox c P0 D2 | qvoronoi Qu Fo
    -rbox c G1 d D2 | qvoronoi s p       rbox c P0 D2 | qvoronoi s Fv QV0
    -
    - -

    »qvoronoi input

    -
    -The input data on stdin consists of: -
      -
    • dimension -
    • number of points
    • -
    • point coordinates
    • -
    - -

    Use I/O redirection (e.g., qvoronoi < data.txt), a pipe (e.g., rbox 10 | qvoronoi), -or the 'TI' option (e.g., qvoronoi TI data.txt). - -

    For example, this is four cocircular points inside a square. Their Voronoi -diagram has nine vertices and eight regions. Notice the Voronoi vertex -at the origin, and the Voronoi vertices (on each axis) for the four -sides of the square. -

    -

    -rbox s 4 W0 c G1 D2 > data -
    -2 RBOX s 4 W0 c D2
    -8
    --0.4941988586954018 -0.07594397977563715
    --0.06448037284989526 0.4958248496365813
    -0.4911154367094632 0.09383830681375946
    --0.348353580869097 -0.3586778257652367
    -    -1     -1
    -    -1      1
    -     1     -1
    -     1      1
    -
    - -

    qvoronoi s p < data -

    -
    -Voronoi diagram by the convex hull of 8 points in 3-d:
    -
    -  Number of Voronoi regions: 8
    -  Number of Voronoi vertices: 9
    -  Number of non-simplicial Voronoi vertices: 1
    -
    -Statistics for: RBOX s 4 W0 c D2 | QVORONOI s p
    -
    -  Number of points processed: 8
    -  Number of hyperplanes created: 18
    -  Number of facets in hull: 10
    -  Number of distance tests for qhull: 33
    -  Number of merged facets: 2
    -  Number of distance tests for merging: 102
    -  CPU seconds to compute hull (after input): 0.094
    -
    -2
    -9
    -4.217546450968612e-17 1.735507986399734
    --8.402566836762659e-17 -1.364368854147395
    -0.3447488772716865 -0.6395484723719818
    -1.719446929853986 2.136555906154247e-17
    -0.4967882915039657 0.68662371396699
    --1.729928876283549 1.343733067524222e-17
    --0.8906163241424728 -0.4594150543829102
    --0.6656840313875723 0.5003013793414868
    --7.318364664277155e-19 -1.188217818408333e-16
    -
    -
    - -
    -

    » qvoronoi -outputs

    -
    - -

    These options control the output of Voronoi diagrams.

    -
    - -
    -
     
    -
    Voronoi vertices
    -
    p
    -
    print the coordinates of the Voronoi vertices. The first line - is the dimension. The second line is the number of vertices. Each - remaining line is a Voronoi vertex.
    -
    Fn
    -
    list the neighboring Voronoi vertices for each Voronoi - vertex. The first line is the number of Voronoi vertices. Each - remaining line starts with the number of neighboring vertices. - Negative vertices (e.g., -1) indicate vertices - outside of the Voronoi diagram. - In the circle-in-box example, the - Voronoi vertex at the origin has four neighbors.
    -
    FN
    -
    list the Voronoi vertices for each Voronoi region. The first line is - the number of Voronoi regions. Each remaining line starts with the - number of Voronoi vertices. Negative indices (e.g., -1) indicate vertices - outside of the Voronoi diagram. - In the circle-in-box example, the four bounded regions are defined by four - Voronoi vertices.
    - -
     
    -
     
    -
    Voronoi regions
    -
    o
    -
    print the Voronoi regions in OFF format. The first line is the - dimension. The second line is the number of vertices, the number - of input sites, and "1". The third line represents the vertex-at-infinity. - Its coordinates are "-10.101". The next lines are the coordinates - of the Voronoi vertices. Each remaining line starts with the number - of Voronoi vertices in a Voronoi region. In 2-d, the vertices are -listed in adjacency order (unoriented). In 3-d and higher, the -vertices are listed in numeric order. In the circle-in-square - example, each bounded region includes the Voronoi vertex at - the origin. Lines consisting of 0 indicate - coplanar input sites or 'Qz'.
    -
    Fi
    -
    print separating hyperplanes for inner, bounded Voronoi - regions. The first number is the number of separating - hyperplanes. Each remaining line starts with 3+dim. The - next two numbers are adjacent input sites. The next dim - numbers are the coefficients of the separating hyperplane. The - last number is its offset. Use 'Tv' to verify that the -hyperplanes are perpendicular bisectors. It will list relevant -statistics to stderr.
    -
    Fo
    -
    print separating hyperplanes for outer, unbounded Voronoi - regions. The first number is the number of separating - hyperplanes. Each remaining line starts with 3+dim. The - next two numbers are adjacent input sites on the convex hull. The - next dim - numbers are the coefficients of the separating hyperplane. The - last number is its offset. Use 'Tv' to verify that the -hyperplanes are perpendicular bisectors. It will list relevant -statistics to stderr,
    -
     
    -
     
    -
    Input sites
    -
    Fv
    -
    list ridges of Voronoi vertices for pairs of input sites. The - first line is the number of ridges. Each remaining line starts with - two plus the number of Voronoi vertices in the ridge. The next - two numbers are two adjacent input sites. The remaining numbers list - the Voronoi vertices. As with option 'o', a 0 indicates - the vertex-at-infinity - and an unbounded, separating hyperplane. - The perpendicular bisector (separating hyperplane) - of the input sites is a flat through these vertices. - In the circle-in-square example, the ridge for each edge of the square - is unbounded.
    -
    Fc
    -
    list coincident input sites for each Voronoi vertex. - The first line is the number of vertices. The remaining lines start with - the number of coincident sites and deleted vertices. Deleted vertices - indicate highly degenerate input (see'Fs'). - A coincident site is assigned to one Voronoi - vertex. Do not use 'QJ' with 'Fc'; the joggle will separate - coincident sites.
    -
    FP
    -
    print coincident input sites with distance to - nearest site (i.e., vertex). The first line is the - number of coincident sites. Each remaining line starts with the point ID of - an input site, followed by the point ID of a coincident point, its vertex, and distance. - Includes deleted vertices which - indicate highly degenerate input (see'Fs'). - Do not use 'QJ' with 'FP'; the joggle will separate - coincident sites.
    -
     
    -
     
    -
    General
    -
    s
    -
    print summary of the Voronoi diagram. Use 'Fs' for numeric data.
    -
    i
    -
    list input sites for each Delaunay region. Use option 'Pp' - to avoid the warning. The first line is the number of regions. The - remaining lines list the input sites for each region. The regions are - oriented. In the circle-in-square example, the cocircular region has four - edges. In 3-d and higher, report cospherical sites by adding extra points. -
    -
    G
    -
    Geomview output for 2-d Voronoi diagrams.
    -
    -
    -
    -

    » qvoronoi -controls

    -
    - -

    These options provide additional control:

    -
    - -
    -
    Qu
    -
    compute the furthest-site Voronoi diagram.
    -
    QVn
    -
    select Voronoi vertices for input site n
    -
    Qz
    -
    add a point above the paraboloid to reduce precision - errors. Use it for nearly cocircular/cospherical input - (e.g., 'rbox c | qvoronoi Qz').
    -
    Tv
    -
    verify result
    -
    TI file
    -
    input data from file. The filename may not use spaces or quotes.
    -
    TO file
    -
    output results to file. Use single quotes if the filename - contains spaces (e.g., TO 'file with spaces.txt'
    -
    TFn
    -
    report progress after constructing n facets
    -
    PDk:1
    -
    include upper and lower facets in the output. Set k - to the last dimension (e.g., 'PD2:1' for 2-d inputs).
    -
    f
    -
    facet dump. Print the data structure for each facet (i.e., - Voronoi vertex).
    -
    - -
    -
    -

    » qvoronoi -graphics

    -
    - -

    In 2-d, Geomview output ('G') -displays a Voronoi diagram with extra edges to close the -unbounded Voronoi regions. To view the unbounded rays, enclose -the input points in a square.

    - -

    You can also view individual Voronoi regions in 3-d. To -view the Voronoi region for site 3 in Geomview, execute

    - -
    -

    qvoronoi <data QV3 p | qconvex s G >output

    -
    - -

    The qvoronoi command returns the Voronoi vertices -for input site 3. The qconvex command computes their convex hull. -This is the Voronoi region for input site 3. Its -hyperplane normals (qconvex 'n') are the same as the separating hyperplanes -from options 'Fi' -and 'Fo' (up to roundoff error). - -

    See the Delaunay and Voronoi -examples for 2-d and 3-d examples. Turn off normalization (on -Geomview's 'obscure' menu) when comparing the Voronoi diagram -with the corresponding Delaunay triangulation.

    - -
    -

    »qvoronoi -notes

    -
    - -

    You can simplify the Voronoi diagram by enclosing the input -sites in a large square or cube. This is particularly recommended -for cocircular or cospherical input data.

    - -

    See Voronoi graphics for computing -the convex hull of a Voronoi region.

    - -

    Voronoi diagrams do not include facets that are -coplanar with the convex hull of the input sites. A facet is -coplanar if the last coefficient of its normal is -nearly zero (see qh_ZEROdelaunay). - -

    Unbounded regions can be confusing. For example, 'rbox c | -qvoronoi Qz o' produces the Voronoi regions for the vertices -of a cube centered at the origin. All regions are unbounded. The -output is

    - -
    -
    3
    -2 9 1
    --10.101 -10.101 -10.101
    -     0      0      0
    -2 0 1
    -2 0 1
    -2 0 1
    -2 0 1
    -2 0 1
    -2 0 1
    -2 0 1
    -2 0 1
    -0
    -
    -
    - -

    The first line is the dimension. The second line is the number -of vertices and the number of regions. There is one region per -input point plus a region for the point-at-infinity added by -option 'Qz'. The next two lines -lists the Voronoi vertices. The first vertex is the infinity -vertex. It is indicate by the coordinates -10.101. The -second vertex is the origin. The next nine lines list the -regions. Each region lists two vertices -- the infinity vertex -and the origin. The last line is "0" because no region -is associated with the point-at-infinity. A "0" would -also be listed for nearly incident input sites.

    - -

    To use option 'Fv', add an -interior point. For example,

    - -
    -
    -rbox c P0 | qvoronoi Fv
    -20
    -5 0 7 1 3 5
    -5 0 3 1 4 5
    -5 0 5 1 2 3
    -5 0 1 1 2 4
    -5 0 6 2 3 6
    -5 0 2 2 4 6
    -5 0 4 4 5 6
    -5 0 8 5 3 6
    -5 1 2 0 2 4
    -5 1 3 0 1 4
    -5 1 5 0 1 2
    -5 2 4 0 4 6
    -5 2 6 0 2 6
    -5 3 4 0 4 5
    -5 3 7 0 1 5
    -5 4 8 0 6 5
    -5 5 6 0 2 3
    -5 5 7 0 1 3
    -5 6 8 0 6 3
    -5 7 8 0 3 5
    -
    -
    - -

    The output consists of 20 ridges and each ridge lists a pair -of input sites and a triplet of Voronoi vertices. The first eight -ridges connect the origin ('P0'). The remainder list the edges of -the cube. Each edge generates an unbounded ray through the -midpoint. The corresponding separating planes ('Fo') follow each -pair of coordinate axes.

    - -

    Options 'Qt' (triangulated output) -and 'QJ' (joggled input) are deprecated. They may produce -unexpected results. If you use these options, cocircular and cospherical input sites will -produce duplicate or nearly duplicate Voronoi vertices. See also Merged facets or joggled input.

    - -
    -

    »qvoronoi conventions

    -
    - -

    The following terminology is used for Voronoi diagrams in -Qhull. The underlying structure is a Delaunay triangulation from -a convex hull in one higher dimension. Facets of the Delaunay -triangulation correspond to vertices of the Voronoi diagram. -Vertices of the Delaunay triangulation correspond to input sites. -They also correspond to regions of the Voronoi diagram. See convex hull conventions, Delaunay conventions, and -Qhull's data structures.

    -
    - -
      -
    • input site - a point in the input (one dimension - lower than a point on the convex hull)
    • -
    • point - a point has d+1 coordinates. The - last coordinate is the sum of the squares of the input - site's coordinates
    • -
    • coplanar point - a nearly incident - input site
    • -
    • vertex - a point on the paraboloid. It - corresponds to a unique input site.
    • -
    • point-at-infinity - a point added above the - paraboloid by option 'Qz'
    • -
    • Delaunay facet - a lower facet of the - paraboloid. The last coefficient of its normal is - clearly negative.
    • -
    • Voronoi vertex - the circumcenter of a Delaunay - facet
    • -
    • Voronoi region - the Voronoi vertices for an - input site. The region of Euclidean space nearest to an - input site.
    • -
    • Voronoi diagram - the graph of the Voronoi - regions. It includes the ridges (i.e., edges) between the - regions.
    • -
    • vertex-at-infinity - the Voronoi vertex that - indicates unbounded Voronoi regions in 'o' output format. Its - coordinates are -10.101.
    • -
    • good facet - a Voronoi vertex with optional - restrictions by 'QVn', etc.
    • -
    - -
    -
    -

    »qvoronoi options

    - -
    -qvoronoi- compute the Voronoi diagram
    -    http://www.qhull.org
    -
    -input (stdin):
    -    first lines: dimension and number of points (or vice-versa).
    -    other lines: point coordinates, best if one point per line
    -    comments:    start with a non-numeric character
    -
    -options:
    -    Qu   - compute furthest-site Voronoi diagram
    -
    -Qhull control options:
    -    QJn  - randomly joggle input in range [-n,n]
    -    Qs   - search all points for the initial simplex
    -    Qz   - add point-at-infinity to Voronoi diagram
    -    QGn  - Voronoi vertices if visible from point n, -n if not
    -    QVn  - Voronoi vertices for input point n, -n if not
    -
    -Trace options:
    -    T4   - trace at level n, 4=all, 5=mem/gauss, -1= events
    -    Tc   - check frequently during execution
    -    Ts   - statistics
    -    Tv   - verify result: structure, convexity, and in-circle test
    -    Tz   - send all output to stdout
    -    TFn  - report summary when n or more facets created
    -    TI file - input data from file, no spaces or single quotes
    -    TO file - output results to file, may be enclosed in single quotes
    -    TPn  - turn on tracing when point n added to hull
    -     TMn - turn on tracing at merge n
    -     TWn - trace merge facets when width > n
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)
    -     TCn - stop qhull after building cone for point n (see TVn)
    -
    -Precision options:
    -    Cn   - radius of centrum (roundoff added).  Merge facets if non-convex
    -     An  - cosine of maximum angle.  Merge facets if cosine > n or non-convex
    -           C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge
    -    Rn   - randomly perturb computations by a factor of [1-n,1+n]
    -    Wn   - min facet width for non-coincident point (before roundoff)
    -
    -Output formats (may be combined; if none, produces a summary to stdout):
    -    s    - summary to stderr
    -    p    - Voronoi vertices
    -    o    - OFF format (dim, Voronoi vertices, and Voronoi regions)
    -    i    - Delaunay regions (use 'Pp' to avoid warning)
    -    f    - facet dump
    -
    -More formats:
    -    Fc   - count plus coincident points (by Voronoi vertex)
    -    Fd   - use cdd format for input (homogeneous with offset first)
    -    FD   - use cdd format for output (offset first)
    -    FF   - facet dump without ridges
    -    Fi   - separating hyperplanes for bounded Voronoi regions
    -    FI   - ID for each Voronoi vertex
    -    Fm   - merge count for each Voronoi vertex (511 max)
    -    Fn   - count plus neighboring Voronoi vertices for each Voronoi vertex
    -    FN   - count and Voronoi vertices for each Voronoi region
    -    Fo   - separating hyperplanes for unbounded Voronoi regions
    -    FO   - options and precision constants
    -    FP   - nearest point and distance for each coincident point
    -    FQ   - command used for qvoronoi
    -    Fs   - summary: #int (8), dimension, #points, tot vertices, tot facets,
    -                    for output: #Voronoi regions, #Voronoi vertices,
    -                                #coincident points, #non-simplicial regions
    -                    #real (2), max outer plane and min vertex
    -    Fv   - Voronoi diagram as Voronoi vertices between adjacent input sites
    -    Fx   - extreme points of Delaunay triangulation (on convex hull)
    -
    -Geomview options (2-d only)
    -    Ga   - all points as dots
    -     Gp  -  coplanar points and vertices as radii
    -     Gv  -  vertices as spheres
    -    Gi   - inner planes only
    -     Gn  -  no planes
    -     Go  -  outer planes only
    -    Gc   - centrums
    -    Gh   - hyperplane intersections
    -    Gr   - ridges
    -    GDn  - drop dimension n in 3-d and 4-d output
    -
    -Print options:
    -    PAn  - keep n largest Voronoi vertices by 'area'
    -    Pdk:n - drop facet if normal[k] <= n (default 0.0)
    -    PDk:n - drop facet if normal[k] >= n
    -    Pg   - print good Voronoi vertices (needs 'QGn' or 'QVn')
    -    PFn  - keep Voronoi vertices whose 'area' is at least n
    -    PG   - print neighbors of good Voronoi vertices
    -    PMn  - keep n Voronoi vertices with most merges
    -    Po   - force output.  If error, output neighborhood of facet
    -    Pp   - do not report precision problems
    -
    -    .    - list of all options
    -    -    - one line descriptions of all options
    -
    - - -
    - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: synopsis -• input • outputs -• controls • graphics -• notes • conventions -• options - -


    - -

    The Geometry Center -Home Page

    - -

    Comments to: qhull@qhull.org -
    -Created: Sept. 25, 1995 --- Last modified: see top

    - - diff --git a/src/qhull/html/rbox.htm b/src/qhull/html/rbox.htm deleted file mode 100644 index 9c28face564..00000000000 --- a/src/qhull/html/rbox.htm +++ /dev/null @@ -1,277 +0,0 @@ - - - - -rbox -- generate point distributions - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: synopsis • outputs -• examples • notes -• options -


    - -

    [CONE]rbox -- generate point distributions

    - -
    - rbox generates random or regular points according to the - options given, and outputs the points to stdout. The - points are generated in a cube, unless 's', 'x', or 'y' - are given. - -
    -

    »rbox synopsis

    -
    -rbox- generate various point distributions.  Default is random in cube.
    -
    -args (any order, space separated):
    -  3000    number of random points in cube, lens, spiral, sphere or grid
    -  D3      dimension 3-d
    -  c       add a unit cube to the output ('c G2.0' sets size)
    -  d       add a unit diamond to the output ('d G2.0' sets size)
    -  l       generate a regular 3-d spiral
    -  r       generate a regular polygon, ('r s Z1 G0.1' makes a cone)
    -  s       generate cospherical points
    -  x       generate random points in simplex, may use 'r' or 'Wn'
    -  y       same as 'x', plus simplex
    -  Cn,r,m  add n nearly coincident points within radius r of m points
    -  Pn,m,r  add point [n,m,r] first, pads with 0
    -
    -  Ln      lens distribution of radius n.  Also 's', 'r', 'G', 'W'.
    -  Mn,m,r  lattice (Mesh) rotated by [n,-m,0], [m,n,0], [0,0,r], ...
    -          '27 M1,0,1' is {0,1,2} x {0,1,2} x {0,1,2}.  Try 'M3,4 z'.
    -  W0.1    random distribution within 0.1 of the cube's or sphere's surface
    -  Z0.5 s  random points in a 0.5 disk projected to a sphere
    -  Z0.5 s G0.6 same as Z0.5 within a 0.6 gap
    -
    -  Bn      bounding box coordinates, default 0.5
    -  h       output as homogeneous coordinates for cdd
    -  n       remove command line from the first line of output
    -  On      offset coordinates by n
    -  t       use time as the random number seed (default is command line)
    -  tn      use n as the random number seed
    -  z       print integer coordinates, default 'Bn' is 1e+06
    -
    - -

    »rbox outputs

    -
    - -The format of the output is the following: first line contains - the dimension and a comment, second line contains the - number of points, and the following lines contain the points, - one point per line. Points are represented by their coordinate values. - -

    For example, rbox c 10 D2 generates -

    -
    -2 RBOX c 10 D2
    -14
    --0.4999921736307369 -0.3684622117955817
    -0.2556053225468894 -0.0413498678629751
    -0.0327672376602583 -0.2810408135699488
    --0.452955383763607 0.17886471718444
    -0.1792964061529342 0.4346928963760779
    --0.1164979223315585 0.01941637230982666
    -0.3309653464993139 -0.4654278894564396
    --0.4465383649305798 0.02970019358182344
    -0.1711493843897706 -0.4923018137852678
    --0.1165843490665633 -0.433157762450313
    -  -0.5   -0.5
    -  -0.5    0.5
    -   0.5   -0.5
    -   0.5    0.5
    -
    - -
    - -
    -

    »rbox examples

    - -
    -       rbox 10
    -              10 random points in the unit cube centered  at  the
    -              origin.
    -
    -       rbox 10 s D2
    -              10 random points on a 2-d circle.
    -
    -       rbox 100 W0
    -              100 random points on the surface of a cube.
    -
    -       rbox 1000 s D4
    -              1000 random points on a 4-d sphere.
    -
    -       rbox c D5 O0.5
    -              a 5-d hypercube with one corner at the origin.
    -
    -       rbox d D10
    -              a 10-d diamond.
    -
    -       rbox x 1000 r W0
    -              100 random points on the surface of a fixed simplex
    -
    -       rbox y D12
    -              a 12-d simplex.
    -
    -       rbox l 10
    -              10 random points along a spiral
    -
    -       rbox l 10 r
    -              10 regular points  along  a  spiral  plus  two  end
    -              points
    -
    -       rbox 1000 L10000 D4 s
    -              1000 random points on the surface of a narrow lens.
    -
    -           rbox 1000 L100000 s G1e-6
    -                  1000 random points near the edge of a narrow lens
    -
    -       rbox c G2 d G3
    -              a cube with coordinates +2/-2 and  a  diamond  with
    -              coordinates +3/-3.
    -
    -       rbox 64 M3,4 z
    -              a  rotated,  {0,1,2,3} x {0,1,2,3} x {0,1,2,3} lat-
    -              tice (Mesh) of integer points.
    -
    -       rbox P0 P0 P0 P0 P0
    -              5 copies of the origin in 3-d.  Try 'rbox P0 P0  P0
    -              P0 P0 | qhull QJ'.
    -
    -       r 100 s Z1 G0.1
    -              two  cospherical  100-gons plus another cospherical
    -              point.
    -
    -       100 s Z1
    -              a cone of points.
    -
    -       100 s Z1e-7
    -              a narrow cone of points with many precision errors.
    -
    - -

    »rbox notes

    -
    -Some combinations of arguments generate odd results. - -
    -

    »rbox options

    - -
    -       n      number of points
    -
    -       Dn     dimension n-d (default 3-d)
    -
    -       Bn     bounding box coordinates (default 0.5)
    -
    -       l      spiral distribution, available only in 3-d
    -
    -       Ln     lens  distribution  of  radius n.  May be used with
    -              's', 'r', 'G', and 'W'.
    -
    -       Mn,m,r lattice  (Mesh)  rotated  by  {[n,-m,0],   [m,n,0],
    -              [0,0,r],  ...}.   Use  'Mm,n'  for a rigid rotation
    -              with r = sqrt(n^2+m^2).  'M1,0'  is  an  orthogonal
    -              lattice.   For  example,  '27  M1,0'  is  {0,1,2} x
    -              {0,1,2} x {0,1,2}.
    -
    -       s      cospherical points randomly generated in a cube and
    -              projected to the unit sphere
    -
    -       x      simplicial  distribution.   It  is fixed for option
    -              'r'.  May be used with 'W'.
    -
    -       y      simplicial distribution plus a simplex.   Both  'x'
    -              and 'y' generate the same points.
    -
    -       Wn     restrict  points  to distance n of the surface of a
    -              sphere or a cube
    -
    -       c      add a unit cube to the output
    -
    -       c Gm   add a cube with all combinations of +m  and  -m  to
    -              the output
    -
    -       d      add a unit diamond to the output.
    -
    -       d Gm   add a diamond made of 0, +m and -m to the output
    -
    -       Cn,r,m add n nearly coincident points within radius r of m points
    -
    -       Pn,m,r add point [n,m,r] to the output first.  Pad coordi-
    -              nates with 0.0.
    -
    -       n      Remove the command line from the first line of out-
    -              put.
    -
    -       On     offset the data by adding n to each coordinate.
    -
    -       t      use  time  in  seconds  as  the  random number seed
    -              (default is command line).
    -
    -       tn     set the random number seed to n.
    -
    -       z      generate integer coordinates.  Use 'Bn'  to  change
    -              the  range.   The  default  is 'B1e6' for six-digit
    -              coordinates.  In R^4, seven-digit coordinates  will
    -              overflow hyperplane normalization.
    -
    -       Zn s   restrict points to a disk about the z+ axis and the
    -              sphere (default Z1.0).  Includes the opposite pole.
    -              'Z1e-6'  generates  degenerate  points under single
    -              precision.
    -
    -       Zn Gm s
    -              same as Zn with an empty center (default G0.5).
    -
    -       r s D2 generate a regular polygon
    -
    -       r s Z1 G0.1
    -              generate a regular cone
    -
    - - -
    - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -To: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -To: synopsis • outputs -• examples • notes -• options - -


    - -

    The Geometry Center -Home Page

    - -

    Comments to: qhull@qhull.org -
    -Created: Sept. 25, 1995 --- Last modified: August 12, 1998

    - - diff --git a/src/qhull/html/rbox.man b/src/qhull/html/rbox.man deleted file mode 100644 index 3ea6395e697..00000000000 --- a/src/qhull/html/rbox.man +++ /dev/null @@ -1,176 +0,0 @@ -.\" This is the Unix manual page for rbox, written in nroff, the standard -.\" manual formatter for Unix systems. To format it, type -.\" -.\" nroff -man rbox.man -.\" -.\" This will print a formatted copy to standard output. If you want -.\" to ensure that the output is plain ascii, free of any control -.\" characters that nroff uses for underlining etc, pipe the output -.\" through "col -b": -.\" -.\" nroff -man rbox.man | col -b -.\" -.TH rbox 1 "August 10, 1998" "Geometry Center" -.SH NAME -rbox \- generate point distributions for qhull -.SH SYNOPSIS -Command "rbox" (w/o arguments) lists the options. -.SH DESCRIPTION -.PP -rbox generates random or regular points according to the options given, and -outputs -the points to stdout. The points are generated in a cube, unless 's' or 'k' -option is -given. The format of the output is the following: first line -contains the dimension and a comment, -second line contains the number of points, and the -following lines contain the points, one point per line. Points are represented -by their coordinate values. -.SH EXAMPLES -.TP -rbox 10 -10 random points in the unit cube centered at the origin. -.TP -rbox 10 s D2 -10 random points on a 2\[hy]d circle. -.TP -rbox 100 W0 -100 random points on the surface of a cube. -.TP -rbox 1000 s D4 -1000 random points on a 4\[hy]d sphere. -.TP -rbox c D5 O0.5 -a 5\[hy]d hypercube with one corner at the origin. -.TP -rbox d D10 -a 10\[hy]d diamond. -.TP -rbox x 1000 r W0 -100 random points on the surface of a fixed simplex -.TP -rbox y D12 -a 12\[hy]d simplex. -.TP -rbox l 10 -10 random points along a spiral -.TP -rbox l 10 r -10 regular points along a spiral plus two end points -.TP -rbox 1000 L10000 D4 s -1000 random points on the surface of a narrow lens. -.TP -rbox c G2 d G3 -a cube with coordinates +2/\-2 and a diamond with coordinates +3/\-3. -.TP -rbox 64 M3,4 z -a rotated, {0,1,2,3} x {0,1,2,3} x {0,1,2,3} lattice (Mesh) of integer -points. 'rbox 64 M1,0' is orthogonal. -.TP -rbox P0 P0 P0 P0 P0 -5 copies of the origin in 3\-d. Try 'rbox P0 P0 P0 P0 P0 | qhull QJ'. -.TP -r 100 s Z1 G0.1 -two cospherical 100\-gons plus another cospherical point. -.TP -100 s Z1 -a cone of points. -.TP -100 s Z1e\-7 -a narrow cone of points with many precision errors. -.SH OPTIONS -.TP -n -number of points -.TP -Dn -dimension n\[hy]d (default 3\[hy]d) -.TP -Bn -bounding box coordinates (default 0.5) -.TP -l -spiral distribution, available only in 3\[hy]d -.TP -Ln -lens distribution of radius n. May be used with 's', 'r', 'G', and 'W'. -.TP -Mn,m,r -lattice (Mesh) rotated by {[n,\-m,0], [m,n,0], [0,0,r], ...}. -Use 'Mm,n' for a rigid rotation with r = sqrt(n^2+m^2). 'M1,0' is an -orthogonal lattice. For example, '27 M1,0' is {0,1,2} x {0,1,2} x -{0,1,2}. '27 M3,4 z' is a rotated integer lattice. -.TP -s -cospherical points randomly generated in a cube and projected to the unit sphere -.TP -x -simplicial distribution. It is fixed for option 'r'. May be used with 'W'. -.TP -y -simplicial distribution plus a simplex. Both 'x' and 'y' generate the same points. -.TP -Wn -restrict points to distance n of the surface of a sphere or a cube -.TP -c -add a unit cube to the output -.TP -c Gm -add a cube with all combinations of +m and \-m to the output -.TP -d -add a unit diamond to the output. -.TP -d Gm -add a diamond made of 0, +m and \-m to the output -.TP -Cn,r,m -add n nearly coincident points within radius r of m points -.TP -Pn,m,r -add point [n,m,r] to the output first. Pad coordinates with 0.0. -.TP -n -Remove the command line from the first line of output. -.TP -On -offset the data by adding n to each coordinate. -.TP -t -use time in seconds as the random number seed (default is command line). -.TP -tn -set the random number seed to n. -.TP -z -generate integer coordinates. Use 'Bn' to change the range. -The default is 'B1e6' for six\[hy]digit coordinates. In R^4, seven\[hy]digit -coordinates will overflow hyperplane normalization. -.TP -Zn s -restrict points to a disk about the z+ axis and the sphere (default Z1.0). -Includes the opposite pole. 'Z1e\-6' generates degenerate points under -single precision. -.TP -Zn Gm s -same as Zn with an empty center (default G0.5). -.TP -r s D2 -generate a regular polygon -.TP -r s Z1 G0.1 -generate a regular cone -.SH BUGS -Some combinations of arguments generate odd results. - -Report bugs to qhull_bug@qhull.org, other correspondence to qhull@qhull.org -.SH SEE ALSO -qhull(1) -.SH AUTHOR -.nf -C. Bradford Barber -bradb@shore.net -.fi - diff --git a/src/qhull/html/rbox.txt b/src/qhull/html/rbox.txt deleted file mode 100644 index e3cf721892e..00000000000 --- a/src/qhull/html/rbox.txt +++ /dev/null @@ -1,195 +0,0 @@ - - - -rbox(1) rbox(1) - - -NAME - rbox - generate point distributions for qhull - -SYNOPSIS - Command "rbox" (w/o arguments) lists the options. - -DESCRIPTION - rbox generates random or regular points according to the - options given, and outputs the points to stdout. The - points are generated in a cube, unless 's' or given. The - format of the output is the following: first line contains - the dimension and a comment, second line contains the num- - ber of points, and the following lines contain the points, - one point per line. Points are represented by their coor- - dinate values. - -EXAMPLES - rbox 10 - 10 random points in the unit cube centered at the - origin. - - rbox 10 s D2 - 10 random points on a 2-d circle. - - rbox 100 W0 - 100 random points on the surface of a cube. - - rbox 1000 s D4 - 1000 random points on a 4-d sphere. - - rbox c D5 O0.5 - a 5-d hypercube with one corner at the origin. - - rbox d D10 - a 10-d diamond. - - rbox x 1000 r W0 - 100 random points on the surface of a fixed simplex - - rbox y D12 - a 12-d simplex. - - rbox l 10 - 10 random points along a spiral - - rbox l 10 r - 10 regular points along a spiral plus two end - points - - rbox 1000 L10000 D4 s - 1000 random points on the surface of a narrow lens. - - rbox c G2 d G3 - a cube with coordinates +2/-2 and a diamond with - - - -Geometry Center August 10, 1998 1 - - - - - -rbox(1) rbox(1) - - - coordinates +3/-3. - - rbox 64 M3,4 z - a rotated, {0,1,2,3} x {0,1,2,3} x {0,1,2,3} lat- - tice (Mesh) of integer points. - - rbox P0 P0 P0 P0 P0 - 5 copies of the origin in 3-d. Try 'rbox P0 P0 P0 - P0 P0 | qhull QJ'. - - r 100 s Z1 G0.1 - two cospherical 100-gons plus another cospherical - point. - - 100 s Z1 - a cone of points. - - 100 s Z1e-7 - a narrow cone of points with many precision errors. - -OPTIONS - n number of points - - Dn dimension n-d (default 3-d) - - Bn bounding box coordinates (default 0.5) - - l spiral distribution, available only in 3-d - - Ln lens distribution of radius n. May be used with - 's', 'r', 'G', and 'W'. - - Mn,m,r lattice (Mesh) rotated by {[n,-m,0], [m,n,0], - [0,0,r], ...}. Use 'Mm,n' for a rigid rotation - with r = sqrt(n^2+m^2). 'M1,0' is an orthogonal - lattice. For example, '27 M1,0' is {0,1,2} x - {0,1,2} x {0,1,2}. - - s cospherical points randomly generated in a cube and - projected to the unit sphere - - x simplicial distribution. It is fixed for option - 'r'. May be used with 'W'. - - y simplicial distribution plus a simplex. Both 'x' - and 'y' generate the same points. - - Wn restrict points to distance n of the surface of a - sphere or a cube - - c add a unit cube to the output - - c Gm add a cube with all combinations of +m and -m to - the output - - - -Geometry Center August 10, 1998 2 - - - - - -rbox(1) rbox(1) - - - d add a unit diamond to the output. - - d Gm add a diamond made of 0, +m and -m to the output - - Cn,r,m add n nearly coincident points within radius r of m points - - Pn,m,r add point [n,m,r] to the output first. Pad coordi- - nates with 0.0. - - n Remove the command line from the first line of out- - put. - - On offset the data by adding n to each coordinate. - - t use time in seconds as the random number seed - (default is command line). - - tn set the random number seed to n. - - z generate integer coordinates. Use 'Bn' to change - the range. The default is 'B1e6' for six-digit - coordinates. In R^4, seven-digit coordinates will - overflow hyperplane normalization. - - Zn s restrict points to a disk about the z+ axis and the - sphere (default Z1.0). Includes the opposite pole. - 'Z1e-6' generates degenerate points under single - precision. - - Zn Gm s - same as Zn with an empty center (default G0.5). - - r s D2 generate a regular polygon - - r s Z1 G0.1 - generate a regular cone - -BUGS - Some combinations of arguments generate odd results. - - Report bugs to qhull_bug@qhull.org, other correspon- - dence to qhull@qhull.org - -SEE ALSO - qhull(1) - -AUTHOR - C. Bradford Barber - bradb@shore.net - - - - - -Geometry Center August 10, 1998 3 - - diff --git a/src/qhull/index.htm b/src/qhull/index.htm deleted file mode 100644 index 4ea7806c937..00000000000 --- a/src/qhull/index.htm +++ /dev/null @@ -1,284 +0,0 @@ - - - - -Qhull code for Convex Hull, Delaunay Triangulation, Voronoi Diagram, and Halfspace Intersection about a Point - - - - -URL: http://www.qhull.org -
    To: -News -• Download -• CiteSeer -• Images -• Manual -• FAQ -• Programs -• Options -

    - -
    - - -
    -

    Qhull

    - [CONE] -
    -Qhull computes the convex hull, Delaunay triangulation, Voronoi diagram, -halfspace intersection about a point, furthest-site Delaunay -triangulation, and furthest-site Voronoi diagram. The source code runs in -2-d, 3-d, 4-d, and higher dimensions. Qhull implements the Quickhull -algorithm for computing the convex hull. It handles roundoff -errors from floating point arithmetic. It computes volumes, -surface areas, and approximations to the convex hull.

    - - -

    Qhull does not support triangulation of non-convex surfaces, mesh -generation of non-convex objects, medium-sized inputs in 9-D -and higher, alpha shapes, weighted Voronoi diagrams, Voronoi volumes, or -constrained Delaunay triangulations,

    - -

    Qhull 2015.2 introduces reentrant Qhull. It allows concurrent Qhull runs and simplifies the C++ interface to Qhull. -If you call Qhull from your program, you should use reentrant Qhull (libqhull_r) instead of qh_QHpointer (libqhull). -If you use Qhull 2003.1. please upgrade or apply poly.c-qh_gethash.patch. -

    -
    - -
    -
    - - - -
    - -

    Introduction -

      -
    • Fukuda's introduction to convex hulls, Delaunay - triangulations, Voronoi diagrams, and linear programming
    • -
    • Lambert's Java visualization of convex hull algorithms
    • -
    • LEDA Guide to geometry algorithms -
    • MathWorld's Computational Geometry from Wolfram Research -
    • Skiena's Computational Geometry from his Algorithm Design Manual. -
    • Stony Brook Algorithm Repository, computational geometry
    • -
    - -

    Qhull Documentation and Support -

    - -

    Related URLs -

    - -

    FAQs and Newsgroups -

    - -
    - -

    The program includes options for input transformations, -randomization, tracing, multiple output formats, and execution -statistics. The program can be called from within your -application.

    - -

    You can view the results in 2-d, 3-d and 4-d with Geomview. An alternative -is VTK.

    - -

    For an article about Qhull, download from - ACM or CiteSeer: -

    - -
    -

    Barber, C.B., Dobkin, D.P., and Huhdanpaa, H.T., "The - Quickhull algorithm for convex hulls," ACM Trans. on - Mathematical Software, 22(4):469-483, Dec 1996, http://www.qhull.org

    -
    - -

    Abstract:

    - -
    -

    The convex hull of a set of points is the smallest convex - set that contains the points. This article presents a - practical convex hull algorithm that combines the - two-dimensional Quickhull Algorithm with the general - dimension Beneath-Beyond Algorithm. It is similar to the - randomized, incremental algorithms for convex hull and - Delaunay triangulation. We provide empirical evidence that - the algorithm runs faster when the input contains non-extreme - points, and that it uses less memory.

    -

    Computational geometry algorithms have traditionally - assumed that input sets are well behaved. When an algorithm - is implemented with floating point arithmetic, this - assumption can lead to serious errors. We briefly describe a - solution to this problem when computing the convex hull in - two, three, or four dimensions. The output is a set of - "thick" facets that contain all possible exact convex hulls - of the input. A variation is effective in five or more - dimensions.

    -
    - -
    - -

    Up: Past Software -Projects of the Geometry Center
    -URL: http://www.qhull.org -
    To: -News -• Download -• CiteSeer -• Images -• Manual -• FAQ -• Programs -• Options -

    - -
    - -

    [HOME] The Geometry Center Home Page

    - -

    Comments to: qhull@qhull.org -
    -Created: May 17 1995 --- - - diff --git a/src/qhull/origCMakeLists.txt b/src/qhull/origCMakeLists.txt deleted file mode 100644 index 1034d1dea97..00000000000 --- a/src/qhull/origCMakeLists.txt +++ /dev/null @@ -1,426 +0,0 @@ -# CMakeLists.txt -- CMake configuration file for qhull, qhull6, and related programs -# -# To install CMake -# Download from http://www.cmake.org/download/ -# -# To find the available targets for CMake -G "..." -# cmake --help -# -# To build with MSYS/mingw -# cd build && cmake -G "MSYS Makefiles" .. && cmake .. -# make -# make install -# -# To uninstall on unix or MSYS/mingw -# xargs rm [B. Boeckel] - - Moved include file for each C++ source file to the top of the includes - - Prepend cpp includes with "libqhullcpp/" - - RoadLogEvent includes RoadLogEvent.h - - QhullIterator.h: Only QHULL_DECLARE_SEQUENTIAL_ITERATOR is used. - - - Compared src/libqhull/* to src/libqhull_r/* and resolved differences - - qh_printpoint in io.c skips qh_IDnone like io_r.c - - qhull_p-exports.def: Added three missing exports - - set_r.h: Removed countT. Too many issues - - - libqhull_r/Makefile: Add help prompts to 'make qtest' - - libqhull.pro: Add '../libqhull/' to sources and headers - - libqhull/Makefile: Fixed -I,./,,/src - - - qhull-zip.sh: Add CMakeModules to tarball [C. Rosenvik] - - CMakeLists.txt: Add targets qhullp and user_egp for qh_QHpointer and libqhull_p - - Reorganized 'make help' - - Makefile cleanall: Delete testqset and qhulltest from bin/ - - Fix filetype of Unix-only files - - Fix Unix line endings for Makefile and check in qhull-zip.sh - - Fix Windows line-endings and check in qhull-zip.sh - - qhull-zip.sh: Check for Unix text files - - ------------ -Qhull 2015.1 2016/01/03 (7.1.0) - - Add Rbox option 'Cn,r,m' to add nearly coincident points. Trigger for duplicate ridges - - Add Qhull option 'Q12' to ignore error on wide merge due to duplicate ridge - - - qh_findbestlower: Call qh_findfacet_all to fix rare "flipped or upper Delaunay" error QH6228. - QH6228 input provided by J. Metz. Reported (date order): L. Fiaschi, N. Bowler, A. Liebscher, V. Vieira, N. Rhinehart, N. Vance, P. Shafer - - qh_check_dupridge: Check if wide merge due to duplicate ridge from nearly coincident points - - qh_initialhull: Fix error messages for initial simplex is flat - - qh_determinant: increased 2-d and 3-d nearzero by 10x due to a counter-example - - rbox: Add qh_outcoord() to output coordinates w/ or w/o iscdd - - qh_meminit (mem.c): Add call to qh_memcheck - - Compare libqhull/... to libqhull_r/... and resolve differences - - Update builds for DevStudio (qhull.sln for msdev 2005..2009, qhull-32.sln and qhull-64.sln for recent releases) - - - qh-impre.htm: Add a section about precision errors for 'Nearly coincident points on an edge' - - html/index.htm#geomview: Document how to install, build, and use Geomview. - - html/index.htm: Emphasize program links and move related urls to end - - qhull/index.htm: Emphasize manual, geomview, and imprecision - - Fix documentation links in libqhull_r/index.htm - - Add 'Functions' link to documentation headers - - Change '...' to '...' - - libqhull_r/index.htm -- Add instructions for configuring web browsers for source links. - - libqhull_r/ -- Fix source links for ..._r.htm files - ------------- -Qhull 2015.0.7 2015/11/09 (7.0.7) - - Fix return type of operator-> in QhullLinkedList and other collection classes [F. Jares] - - Fix return types for QhullLinkedList - - Fix return types for QhullPoints - - Simplify return type for Coordinates::operator[] (same as QList) - - Add const to operators for QhullSet::iterator and add documentation - - Coordinates.h: Fix return types for operations of iterator and const_iterator - - Drop use of Perforce changelist number in qhull_VERSION of CMakeLists.txt - - Rename the md5sum files as *.tgz.md5sum instead of *-tgz.md5sum - - Fix build dependency for testqset_r [asekez] - - rbox.c depends on Qhull due to qh_lib_check which uses qh_version2 for error messages - - QhullFacet_test.cpp: Annotate Qhull invocations. Allows their repetition. - - QhullFacet_test.cpp: Adjust epsilon on distance tests - - Do not create libqhullcpp as a shared library. Qhull C++ classes may change layout and size. - - qhull-cpp.xml: Make a relative path to road-faq.xsl - ------------- -Qhull 2015.0.6 2015/10/20 (7.0.6.2013) - - In the libraries, exit() is only called from qh_exit(). qh_exit may be redefined. - - Add qh_fprintf_stderr to usermem.c. May be overridden to avoid use of stderr [D. Sterratt] - Add usermem to testqset builds - Used by qh_fprintf_rbox - - Remove most instances of stderr/stdout from libqhull, libqhull_r, and libqhullcpp [D. Sterratt] - qh_fprintf_stderr may be redefined. qh_meminit and qh_new_qhull use stderr as the default ferr - - qh_initflags: Use qh.fout instead of stdout for 'TO file'. A library caller may define a different qh.fout. - - qh_settemppush: Call qh_fprintf() instead of fprintf() on error. - - Rename qh_call_qhull as "Qhull-template" from user.c. Updated its references. - - - qh-code.htm: "How to avoid exit(), fprintf(), stderr, and stdout" - - html/index.htm: Fix table of contents for qh-code - - libqhull_r/index.htm: Rewrite introduction to Reentrant Qhull - - qh-faq.htm: Rewrite "Can Qhull use coordinates without placing them in a data file?" - - qh-get.html: Link to github - - Remove qhull_interface.cpp from the documentation - ------------- -Qhull 2015.0.5 2015/10/12 (7.0.5.1995) -- qh_new_qhull: default 'errfile' is 'stderr'. outfile and errfile are optional [B. Pearlmutter] -- qh_new_qhull: returns qh_ERRinput instead of exit() if qhull_cmd is not "qhull ..." [B. Pearlmutter] -- qhalf_r.c,etc: Add clear of qh.NOerrexit -- global.c: gcc 4.4.0 mingw32 segfault cleared by adding comment -- usermem_r-cpp.cpp: Optional file to redefine qh_exit() as throw "QH10003.." [B. Pearlmutter] - qh_exit() is called by qhull_r when qh_errexit() is not available. - -- html/index.htm: Add bibliographic reference to Golub & van Loan and other references [R. Gaul] -- qhalf.htm: A halfspace is the points on or below a hyperplane [D. Strawn] -- qh-opto.htm#n: Defined inside, outside, on, above, and below a hyperplane [D. Strawn] -- qhalf.htm#notes: Recast the linear program using negative halfspaces (as used by Qhull) [D. Strawn] -- qhull_a.h: Fix comment '#include "libqhull/qhull_a.h" [fe rew] - -- build/qhull*.pc.in: Templates for pkg-config (derived from Fedorra) [P. McMunn] - https://bitbucket.org/mgorny/pkg-config-spec/src/c1bf12afe0df6d95f2fe3f5e1ffb4c50f018825d/pkg-config-spec.txt?at=master&fileviewer=file-view-default -- Makefile: Remove user_eg3.o from LIBQHULLCPP_OBJS -- Makefile: Add .h dependencies for unix_r.o, etc. -- libqhull/Makefile: Fix build of rbox -- libqhull_r/Makefile: Fix build -I -- qhull.sln/user_eg3: Add dependency on libcpp -- Removed bin/libqhull_r.dll (should be qhull_r.dll) -- Removed build/qhulltest.vcproj (see build/qhulltest/qhulltest.vcproj) - ------------- -Qhull 2015.0.4 2015/9/30 (7.0.4.1984) - - qh-get.htm: Unix tarball includes version number (e.g., qhull-2015-src-7.1.0.1940.tgz) [Hauptman] - - qglobal.c: Add qh_version2 with Unix version for "-V" option [Hauptman] - - build/qhull-32.sln, *-32.vcxproj: Add Visual Studio 32-bit build for 2010+ - - build/qhull-64.sln, *-64.vcxproj: Add Visual Studio 64-bit build for 2010+ [G. Lodron] - - make-vcproj.sh: Restore to eg/... It is required for Visual Studio builds - - README.txt: updated builds and reentrant Qhull - - Add documentation for QHULL_LIB_CHECK - - qh_lib_check: Check for unknown QHULL_LIB_TYPE - - qh-code.htm: Add memory requirements for 32- and 64-bit - ------------- -Qhull 2015.0.3 2015/9/22 - - qh_mem, qh_merge: Log before 'delete' instead of afterwards [Coverity, K. Schwehr] - - qh_merge: Test for NULL horizon in qh_checkzero [Coverity, K. Schwehr] - - qh_matchneighbor: Check for matchfacet not a neighbor of facet [Coverity, K. Schwehr] - - qh_triangulate: Explicit check for visible==NULL [Coverity, K. Schwehr] - - qh_findbestfacet (unused by qhull): Fix test of isoutside [Coverity, K. Schwehr] - - qh_check_maxout: Check bestfacet!=0 for logging its id [Coverity, K. Schwehr] - - qh_nearvertex: Check for bestvertex not found [Coverity, K. Schwehr] - - qh_checkfacet: Check for missing neighbors of simplicial facets [Coverity, K. Schwehr] - - qh_setdelnth: Check 'nth' before using it [Coverity, K. Schwehr] - - Annotate code for Coverity warnings (most of these protected by qh_errexit) [K. Schwehr] - - - qh_printfacet3math: explicit format string (duplicates change to io.c) [B. Pearlmutter] - - libqhull_r.h: fix spelling error (duplicates change to libqhull.h) [B. Pearlmutter] - - unix_r.c: fix spelling error (duplicates change to unix.c) [B. Pearlmutter] - - qhull_a.h: define qhullUnused() only if defined(__cplusplus) [R. Stogner] - - qh_version: Use const char str[]= "string" instead of const char * str= "string" [U. Drepper, p. 27] - - qh_newvertex: Use UINT_MAX instead of 0xFFFFFFFF - - qh_newridge: Use UINT_MAX instead of 0xFFFFFFFF - - Reviewed FIXUP notes - - - QhullRidge_test: t_foreach use 'foreach(const QhullVertex &v, vertices) - - Made '#include "RoadTest.h" consistent across all C++ tests - - - qh-code.htm: May also use libqhull_r (e.g., FOREACHfacet_(...)) - - qh-get.htm: Add list of download build repositories - - - Add CMakeModules/CheckLFS.cmake: Enables Large File Support [B. Pearlmutter] - - Makefile: Use -fpic at all times instead of -fPIC, [U. Drepper p. 15] - ------------- -Qhull 2015.0.2 2015/9/1 - - global_r.c: Fixed spelling of /* duplicated in...qh_clear_outputflags */ [K. Schwehr] - - Replaced Gitorious with GitHub - - Moved 'to do' comments into Changes.txt - ------------- -Qhull 2015.0.1 2015/8/31 - - Source code changes - - Increased size of vertexT.id and ridgeT.id to 2^32 [H. Strandenes, C. Carson, K. Nguyen] - Reworded the warning message for ridgeT.id overflow. It does not affect Qhull output - - Add qh_lib_check to check for a compatible Qhull library. - Programs should call QHULL_LIB_CHECK before calling Qhull. - - Include headers prefixed with libqhull/, libqhull_r/, or libqhullcpp/ - - Renamed debugging routines dfacet/dvertex to qh_dfacet/qh_dvertex - - Rewrote user_eg, user_eg2, and user_eg3 as reentrant code - - Renamed 'qh_rand_seed' to 'qh_last_random'. Declare it as DATA - - qh_initqhull_start2 sets qh->NOerrexit on initialization - User must clear NOerrexit after setjmp() - - Other source code changes - - Define ptr_intT as 'long long' for __MINGW64__ [A. Voskov] - - poly_r.c: initialize horizon_skip [K. Schwehr] - - Removed vertexT.dim and MAX_vdim. It is not used by reentrant Qhull. - - Removed qhull_inuse. Not used by C++ - - Removed old __MWERKS__/__POWERPC__ code that speed up SIOUX I/O - - Moved #include libqhull/... before system includes (e.g., - - Comment-out _isatty declaration. Avoids "C4273 ... inconsistent dll linkage" - - Add random.h/random_r.h as an include file to random.c/random_r.c - - Rename rbox routines to qh_roundi/qh_out1/qh_out2n/qh_out3n - - Rename dfacet and dvertex to qh_dfacet and qh_dvertex - - Replace 'qhmem .zzz' with 'qhmem.zzz' - - Removed spaces between function name and parentheses - - Rename 'enum statistics' to 'enum qh_statistics' - - Declare rbox as DATA in qhull-exports.def and qhull_p-exports.def - - In comments, use 'qh.zzz' to reference qhT fields - - In qh_fprintf, use qhmem.ferr to report errors - - qh_fprintf may be called for errors in qh_initstatistics and qh_meminit - - qh_pointid returns qh_IDnone, qh_IDinterior, qh_IDunknown in place of -3, -2, -1 resp. - - getid_() returns qh_IDunknown in place of -1 - - After qh_meminit, qhmem.ferr is non-zero (stderr is the default) - - Update qh_MEMalign in testqset.c to user.h (with realT and void*) - - Split rboxT into a header file - - Add rboxlib.h to libqhull_a.h - - Rename PI to qh_PI and extend to 30 digits - - Rename MAXdim to qh_MAXdim - - Change spacing for type annotations '*' and '&' in C++ header files - - Test for !rbox_output/cpp_object in qh_fprintf_rbox - - Remove 'inline' annotation from explicit inline declarations - - Column 25 formatting for iterators, etc. - - Use '#//!\name' for section headers - - QhullFacet.cpp: zinc_(Zdistio); - - Clear qhT.ALLOWrestart in qh_errexit - - Replace longjmp with qh_errexit_rbox in qh_rboxpoints - - Add jmpExtra after rbox_errexit to protect against compiler errors - - Add qh.ISqhullQh to indicate initialization by QhullQh() - - Add library warnings to 'rbox D4', user_eg, user_eg2, user_eg3 - - Add headers to q_eg, q_egtest, and q_test - - Check that qh.NOerrexit is cleared before call to qh_initflags - -Qhull documentation - - README.txt: Added references to qh-code.htm - - README.txt: Added section 'Calling Qhull from C programs' - - qh-code.htm: Moved Performance after C++ and C interface - - qh-code.htm: Moved Cpp Questions to end of the C++ section - - qh-code.htm: Fixed documentation for 'include' path. It should be include/libqhull - - qconvex.htm: Fixed documentation for 'i'. It triangulates in 4-d and higher [ref] - - Clarified qhalf space documentation for the interior point [J. Santos] - - rbox.c: Version is same date as qh_version in global.c - - gobal_r.c: Version includes a '.r' suffix to indicate 'reentrant' - -Qhull builds - - Development moved to http://github.com/qhull/qhull - git clone git@github.com:qhull/qhull.git - - Exchanged make targets for testing. - 'make test' is a quick test of qhull programs. - 'make testall' is a thorough test - - Added 'make help' and 'make test' to libqhull and libqhull_r Makefiles - - CMakeLists.txt: Remove libqhull, libqhull_r, and libqhullcpp from include_directories - - CMakeLists.txt: Add qhull_SHAREDR for qhull_r - - CMakeLists.txt: Retain qhull_SHARED and qhull_SHAREDP (qh_QHpointer) - - CMakeLists.txt: Move qhull_SHARED and qhull_SHAREDP (qh_QHpointer) to qhull_TARGETS_OLD - Drop qhull_STATICP (use qhull_SHAREDP or qhull_STATIC) - Set SOVERSION and VERSION for shared libraries - - Move qhull_p-exports.def back to libqhull - - Switched to mingw-w64-install for gcc - - Improved prompts for 'make' - - qhull-all.pro: Remove user_eg3.cpp from OTHER_FILES - - libqhull.pro: Ordered object files by frequency of execution, as done before - - Add the folder name to C++ includes and remove libqhullcpp from INCLUDEPATH - - Changed CONFIG+=qtestlib to QT+=testlib - - Changed Makefile to gcc -O3 (was -O2) - - Changed libqhull/libqhull_r Makefiles to both produce rbox, qhull, ..., user_eg, and user_eg2 - - Removed Debian 'config/...'. It was needed for Qhull 2012. - -libqhull_r (reentrant Qhull) - - Replaced qh_qh with a parameter to each procedure [P. Klosterman] - No more globally defined data structures in Qhull - Simplified multithreading and C++ user interface - All functions are reentrant (Qt: "A reentrant function can ... be called simultaneously from multiple threads, but only if each invocation uses its own data.") - No more qh_QHpointer. - See user_eg3 and qhulltest - New libraries - libqhull_r -- Shared library with reentrant sources (e.g., poly_r.h and poly_r.c which replace libqhull's poly.h and poly.c) - libqhullstatic_r -- Static library with the same sources as libqhull_r - libqhullcpp -- The C++ interface using libqhullstatic_r (further notes below) - New executables - testqset_r -- Test qset_r.c (the reentrant version of qset.c - - Source code changes for libqhull_r - - Add qh_zero() to initialize and zero memory for qh_new_qhull - - Remove qh_save_qhull(), qh_restore_qhull(), and qh.old_qhstat from global_r.c - - Remove qh_freeqhull2() (global_r.c) - - Remove qh_freestatistics() (stat_r.c) - - Remove qh_compare_vertexpoint (qhT is not available, unused code) - - Remove conditional code for __POWERPC__ from unix_r.c and rbox_r.c - - Move qh_last_random into qh->last_random (random_r.c) - - Rename sources files with a '_r' suffix. qhull_a.h becomes qhull_ra.h - - Replace 'qh' macro with 'qh->' - - Replace global qhT with parameter-0 - - Add qhmemT to beginning of qhT. It may not be used standalone. - - Add qhstatT to end of qhT - - Remove qhull_inuse - - Change qhmem.zzz to qh->qhmem.zzz - - Replace qh_qhstat with qh->qhstat - - Remove qh_freestatistics - - Replace qh_last_random with qh->last_random - - Replace rboxT with qh->rbox_errexit, rbox_isinteger, rbox_out_offset - - Replace rbox.ferr/fout with qh->ferr/fout - - No qh for qh_exit, qh_free, qh_malloc, qh_strtod, qh_strtol, qh_stddev - - New qmake include files qhull-app-c_r.pri, qhull-app-shared_r.pri, qhull-libqhull-src_r.pri - - Replace 'int' with 'countT' and 'COUNTmax' for large counts and identifiers - - qhset converted to countT - - Removed vertexT.dim -- No longer needed by cpp - Removed MAX_vdim - - Guarantee that qh->run_id!=0. Old code assumed that qh_RANDOMint was 31 bits - -Changes to libqhullcpp - - Added QhullVertexSet.h to libqhullcpp.pro and libqhullpcpp.pro - - QhullVertexSet: error if qhsettemp_defined at copy constructor/assignment (otherwise double free) - - Enable QhullSet.operator=. Copy constructor and assignment only copies pointers - - Changed QhullPoint.operator==() to sqrt(distanceEpsilon) - - Added assignment of base class QhullPoints to PointCoordinates.operator= - - Enable QhullPoints.operator= - - Rename PointCoordinates.point_comment to describe_points - - Add 'typename T' to definition of QhullSet::value() - -C++ interface - - Reimplemented C++ interface on reentrant libqhull_r instead of libqhull - - Prepend include files with libqhullcpp/ - - Replaced UsingLibQhull with QhullQh and macro QH_TRY - Removed UsingLibQhull.currentAngleEpsilon and related routines - Removed UsingLibQhull_test.cpp - Replaced globalDistanceEpsilon with QhullQh.distanceEpsilon - Replaced globalAngleEpsilon with QhullQh.angleEpsilon - Moved UsingQhullLib.checkQhullMemoryEmpty to QhullQh.checkAndFreeQhullMemory - Replaced FACTORepsilon=10 with QhullQh.factor_epsilon=1.0 - - To avoid -Wshadow for QhullQh*, use 'qqh' for parameters and 'qh()' for methods - - Moved messaging from Qhull to QhullQh - - Add check of RboxPoints* in qh_fprintf_rbox - - Renamed Qhull.initializeQhull to Qhull.allocateQhullQh - Added qh_freeqhull(!qh_ALL) as done by unix.c and other programs - - Moved QhullPoints.extraCoordinatesCount into QhullPoints.cpp - - Replaced section tags with '#//!\name ...' - - Removed qhRunId from print() to ostream. - - Removed print() to ostream. Use '<< qhullPoint' or '<< qhullPoint.print("message")' - -C++ interface for most classes - - Remove qhRunId - - Add QhullQh *qh_qh to all types - Pointer comparisons of facetT,etc. do not test corresponding qh_qh - Added to end of type for debugging information, unless wasteful alignment - - Add QhullQh * to all constructors - - All constructors may use Qhull & instead of QhullQh * - - For inherited QhullQh types, change to 'protected' - - Renamed 'o' to 'other' except where used extensively in iterators - - Except for conditional code, merged the Conversion section into GetSet - - Removed empty(). Use isEmpty() instead - - Add operator= instead of keeping it private - - print_message=0 not allowed. Use "" instead. - - Rename isDefined() to isValid() to match Qt conventions - -C++ interface by class - - Coordinates - Removed empty(). Use isEmpty() instead - Added append(dim, coordT*) - Reformated the iterators - Convert to countT - - PointCoordinates - Added constructors for Qhull or QhullQh* (provides access to QhullPoint.operator==) - Removed PointCoordinates(int pointDimension) since PointCoordinates should have a comment. Also, it is ambiguous with PointCoordinates(QhullQh*) - Renamed point_comment to describe_points - Convert to countT - - Qhull - Remove qhull_run_i - Remove qh_active - Replace property feasiblePoint with field feasible_point and methods setFeasiblePoint/feasiblePoint - Returns qh.feasible_point if defined - Moved useOutputStream to QhullQh use_output_stream - Renamed useOutputStream() to hasOutputStream() - Replaced qhull_dimension with qh->input_dim //! Dimension of result (qh.hull_dim or one less for Delaunay/Voronoi) - Removed global s_qhull_output= 0; - Move qhull_status, qhull_message, error_stream, output_stream to QhullQh - Renamed qhullQh() to qh() - Added check of base address to allocateQhullQh(), Was not needed for qhullpcpp - - QhullFacet - Constructor requires Qhull or QhullQh* pointer - Convert to countT - Dropped implicit conversion from facetT - Dropped runId - Add print("message") to replace print() - - QhullFacetList - Constructor requires Qhull or QhullQh* pointer - Convert to countT - Dropped runId - - QhullFacetSet - Removed empty(). Use isEmpty() instead - Constructor requires Qhull or QhullQh* pointer - Convert to countT - Dropped runId - Add operator= - Implement print("message") - - QhullHyperplane - Add hyperplaneAngle() method - Rewrite operator== to use hyperplaneAngle() - Reorganize fields to keep pointers aligned - Except for default constructor requires Qhull or QhullQh* pointer - Enable copy assignment - Reorganized header - - QhullLinkedList - Add operator= - Removed empty(). Use isEmpty() instead - Convert to countT - iterator(T) made iterator(const T &) - const_iterator(T) made const_iterator(const T &) - const_iterator(iterator) made const_iterator(const iterator &) - - QhullPoint - Add constructors for Qhull or QhullQh* pointer (for id() and operator==) - Add defineAs(coordT*) - Add getBaseT() and base_type for QhullSet - Added checks for point_coordinates==0 - Removed static QhullPoint::id(), use QhullPoint.id() instead - distance() throws an error if dimension doesn't agree or if a point is undefined - Convert to countT - If !qh_qh, operator==() requires equal coordinates - Use cout<

    [R. Richter, S. Pasko] - - Remove deprecated libqhull/qhull.h - Use libqhull/libqhull.h instead. Avoids confusion with libqhullcpp/Qhull.h - - Makefile: Add LIBDIR, INCDIR, and DESTDIR to install [L.H. de Mello] - Separate MAN install from DOC install - Create install directories - Installs headers to include/libqhull, include/libqhullcpp, include/road - - CMakeLists.txt: Add MAN_INSTALL_DIR for qhull.1 and rbox.1 man pages - Add RoadTest.h to include/road for Qt users (road_HEADERS) - - Renamed md5sum files to avoid two extensions - - qh-get.htm: Add Readme links and 2009.1 note. - - qh-optf.htm: Fix link - - index.htm: Updated Google Scholar link - - qhull-zip.sh: Improved error message. - ------------- -Qhull 2011.1 2011/04/17 6.2.0.1373 - -Changes to deliverables - - qvoronoi: Deprecated 'Qt' and 'QJn'. Removed from documentation and prompts. - These options produced duplicate Voronoi vertices for cospherical data. - - Removed doskey from Qhull-go.bat. It is incompatible with Windows 7 - - Added 'facets' argument to user_eg3.cpp - - user_eg links with shared library - - qhulltest.cpp: Add closing prompt. - -Changes to build system - - Reorganized source directories - - Moved executables to bin directory - - Add CMake build for all targets (CMakeFiles.txt) [M. Moll assisted] - - Add gcc build for all targets (Makefile) - - Fixed location of qhull.man and rbox.man [M. Moll] - - Add DevStudio builds for all targets (build/*.vcproj) - - Added shared library (lib/qhull6.dll) - Added qh_QHpointer_dllimport to work around problems with MSVC - - Added static libraries with and without qh_QHpointer (lib/qhullstatic.lib) - - Added eg/make-vcproj.sh to create vcproj/sln files from cmake and qmake - - Document location of qh_QHpointer - - Use shadow build directory - - Made -fno-strict-aliasing conditional on gcc version - - Added src/qhull-app-cpp.pri, src/qhull-app-c.pri, etc. for common settings - - Add .gitignore with ignored files and directories. - - Use .git/info/exclude for locally excluded files. - - Fixed MBorland for new directory structure - - cleanall (Makefile): Delete 'linked' programs due to libqhull_r and libqhull/Makefile - -Changes to documentation - - qvoronoi.htm: Remove quotes from qvoronoi example - - qhull-cpp.xml: Add naming conventions - - index.htm: Add Google Scholar references - - qh-optf.htm: Add note about order of 'Fn' matching 'Fv' order [Q. Pan] - - Add patch for old builds in qh-get.htm - - Added C++ compiling instructions to README.txt - - Add instructions for fixing the DOS window - - Changed DOS window to command window - - Fixed html links - - qh-get.htm: Dropped the Spanish mirror site. It was disabled. - -Changes to C code - - mem.h: Define ptr_intT as 'long long' for Microsoft Windows _win64 builds. - On Linux and Mac, 'long' is 64-bits on a 64-bit host - - Added qh_QHpointer_dllimport to work around MSVC problem - - qconvex.c,etc.: Define prototype for _isatty - - Define MSG_QHULL_ERROR in user.h - - Move MSG_FIXUP to 11000 and updated FIXUP QH11... - -Changes to test code - - Add note to q_test than R1e-3 may error (qh-code.htm, Enhancements) - - Add test for executables to q_eg, etc. - - Fixed Qhull-go.bat. QHULL-GO invokes it with command.com, - -Changes to C++ interface - - QhullFacet: Added isSimplicial, isTopOrient, isTriCoplanar, isUpperDelaunay - - Added Qhull::defineVertexFacetNeighbors() for facetNeighbors of vertices. - Automatically called for facet merging and Voronoi diagrams - Do not print QhullVertex::facetNeighbors is !facetNeighborsDefined() - - Assigned FIXUP identifiers - - QhullError: Add copy constructor, assignment operator, and destructor - - Add throw() specifiers to RoadError and QhullError - - Renamed RoadError::defined() to RoadError::isDefined() - - Add #error to Qhull.h if qh_QHpointer is not defined - -Changes to C++ code - - Fixed bug reported by renangms. Vertex output throws error QH10034 - and defineVertexNeighbors() does not exist. - - Define QHULL_USES_QT for qt-qhull.cpp [renangms] - - Reviewed all copy constructors and copy assignments. Updated comments. - Defined Qhull copy constructor and copy assignment [G. Rivet-Sabourin] - Disabled UsingQhullLib default constructor, copy construct, and copy assign - - Merged changes from J. Obermayr in gitorious/jobermayrs-qhull:next - - Fix strncat limit in rboxlib.c and global.c - - Changes to CMakeLists.txt for openSUSE - - Fixed additional uses of strncat - - Fixed QhullFacet::PrintRidges to check hasNextRidge3d() - - Removed gcc warnings for shadowing from code (src/qhull-warn.pri) - - Removed semicolon after extern "C" {...} - - Removed experimental QhullEvent/QhullLog - - Use fabs() instead of abs() to avoid accidental conversions to int - - Fixed type of vertex->neighbors in qh_printvoronoi [no effect on results] - - Removed unnecessary if statement in qh_printvoronoi - ------------- -qhull 2010.1 2010/01/14 -- Fixed quote for #include in qhull.h [U.Hergenhahn, K.Roland] -- Add qt-qhull.cpp with Qt conditional code -- Add libqhullp.proj -- Add libqhull5 to Readme, Announce, download -- Reviewed #pragma -- Reviewed FIXUP and assigned QH tags -- All projects compile with warnings enabled -- Replaced 'up' glyphs with » -- Moved cpp questions to qh-code.htm#questions-cpp -- Moved suggestions to qh-code.htm#enhance -- Moved documentation requests to qh-code.htm#enhance -- Add md5sum file to distributions -- Switched to DevStudio builds to avoid dependent libraries, 10% slower - Removed user_eg3.exe and qhullcpp.dll from Windows build - Fix qhull.sln and project files for qh_QHpointer -- Add eg/qhull-zip.sh to build qhull distribution files - ------------- -qhull 2010.1 2010/01/10 -- Test for NULL fp in qh_eachvoronoi [D. Szczerba] - -qhull 2010.1 2010/01/09 - -Changes to build and distribution -- Use qh_QHpointer=0 for libqhull.a, qhull, rbox, etc. - Use -Dqh_QHpointer for libqhullp.a, qhullcpp.dll, etc. - qh_QHpointer [2010, gcc] 4% time 4% space, [2003, msvc] 8% time 2% space -- Add config/ and project/debian/ for Autoconf build [R. Laboissiere] - from debian branch in git and http://savannah.nongnu.org/cvs/?group=qhull -- Add CMakeLists.txt [kwilliams] -- Fix tabs in Makefile.txt [mschamschula] -- Add -fno-strict-aliasing to Makefile for gcc 4.1, 4.2, and 4.3 qset segfault -- Remove user_eg.exe and user_eg2.exe from Windows distribution -- Order object files by frequency of execution for better locality. - -Changes to source -- Remove ptr_intT from qh_matchvertices. It was int since the beginning. -- user.h requires for CLOCKS_PER_SEC -- Move ostream<

      ---------------------------------
    -
    -   geom.c
    -   geometric routines of qhull
    -
    -   see qh-geom.htm and geom.h
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull/geom.c#2 $$Change: 1995 $
    -   $DateTime: 2015/10/13 21:59:42 $$Author: bbarber $
    -
    -   infrequent code goes into geom2.c
    -*/
    -
    -#include "qhull_a.h"
    -
    -/*---------------------------------
    -
    -  qh_distplane( point, facet, dist )
    -    return distance from point to facet
    -
    -  returns:
    -    dist
    -    if qh.RANDOMdist, joggles result
    -
    -  notes:
    -    dist > 0 if point is above facet (i.e., outside)
    -    does not error (for qh_sortfacets, qh_outerinner)
    -
    -  see:
    -    qh_distnorm in geom2.c
    -    qh_distplane [geom.c], QhullFacet::distance, and QhullHyperplane::distance are copies
    -*/
    -void qh_distplane(pointT *point, facetT *facet, realT *dist) {
    -  coordT *normal= facet->normal, *coordp, randr;
    -  int k;
    -
    -  switch (qh hull_dim){
    -  case 2:
    -    *dist= facet->offset + point[0] * normal[0] + point[1] * normal[1];
    -    break;
    -  case 3:
    -    *dist= facet->offset + point[0] * normal[0] + point[1] * normal[1] + point[2] * normal[2];
    -    break;
    -  case 4:
    -    *dist= facet->offset+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3];
    -    break;
    -  case 5:
    -    *dist= facet->offset+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3]+point[4]*normal[4];
    -    break;
    -  case 6:
    -    *dist= facet->offset+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3]+point[4]*normal[4]+point[5]*normal[5];
    -    break;
    -  case 7:
    -    *dist= facet->offset+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3]+point[4]*normal[4]+point[5]*normal[5]+point[6]*normal[6];
    -    break;
    -  case 8:
    -    *dist= facet->offset+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3]+point[4]*normal[4]+point[5]*normal[5]+point[6]*normal[6]+point[7]*normal[7];
    -    break;
    -  default:
    -    *dist= facet->offset;
    -    coordp= point;
    -    for (k=qh hull_dim; k--; )
    -      *dist += *coordp++ * *normal++;
    -    break;
    -  }
    -  zinc_(Zdistplane);
    -  if (!qh RANDOMdist && qh IStracing < 4)
    -    return;
    -  if (qh RANDOMdist) {
    -    randr= qh_RANDOMint;
    -    *dist += (2.0 * randr / qh_RANDOMmax - 1.0) *
    -      qh RANDOMfactor * qh MAXabs_coord;
    -  }
    -  if (qh IStracing >= 4) {
    -    qh_fprintf(qh ferr, 8001, "qh_distplane: ");
    -    qh_fprintf(qh ferr, 8002, qh_REAL_1, *dist);
    -    qh_fprintf(qh ferr, 8003, "from p%d to f%d\n", qh_pointid(point), facet->id);
    -  }
    -  return;
    -} /* distplane */
    -
    -
    -/*---------------------------------
    -
    -  qh_findbest( point, startfacet, bestoutside, qh_ISnewfacets, qh_NOupper, dist, isoutside, numpart )
    -    find facet that is furthest below a point
    -    for upperDelaunay facets
    -      returns facet only if !qh_NOupper and clearly above
    -
    -  input:
    -    starts search at 'startfacet' (can not be flipped)
    -    if !bestoutside(qh_ALL), stops at qh.MINoutside
    -
    -  returns:
    -    best facet (reports error if NULL)
    -    early out if isoutside defined and bestdist > qh.MINoutside
    -    dist is distance to facet
    -    isoutside is true if point is outside of facet
    -    numpart counts the number of distance tests
    -
    -  see also:
    -    qh_findbestnew()
    -
    -  notes:
    -    If merging (testhorizon), searches horizon facets of coplanar best facets because
    -    after qh_distplane, this and qh_partitionpoint are the most expensive in 3-d
    -      avoid calls to distplane, function calls, and real number operations.
    -    caller traces result
    -    Optimized for outside points.   Tried recording a search set for qh_findhorizon.
    -    Made code more complicated.
    -
    -  when called by qh_partitionvisible():
    -    indicated by qh_ISnewfacets
    -    qh.newfacet_list is list of simplicial, new facets
    -    qh_findbestnew set if qh_sharpnewfacets returns True (to use qh_findbestnew)
    -    qh.bestfacet_notsharp set if qh_sharpnewfacets returns False
    -
    -  when called by qh_findfacet(), qh_partitionpoint(), qh_partitioncoplanar(),
    -                 qh_check_bestdist(), qh_addpoint()
    -    indicated by !qh_ISnewfacets
    -    returns best facet in neighborhood of given facet
    -      this is best facet overall if dist > -   qh.MAXcoplanar
    -        or hull has at least a "spherical" curvature
    -
    -  design:
    -    initialize and test for early exit
    -    repeat while there are better facets
    -      for each neighbor of facet
    -        exit if outside facet found
    -        test for better facet
    -    if point is inside and partitioning
    -      test for new facets with a "sharp" intersection
    -      if so, future calls go to qh_findbestnew()
    -    test horizon facets
    -*/
    -facetT *qh_findbest(pointT *point, facetT *startfacet,
    -                     boolT bestoutside, boolT isnewfacets, boolT noupper,
    -                     realT *dist, boolT *isoutside, int *numpart) {
    -  realT bestdist= -REALmax/2 /* avoid underflow */;
    -  facetT *facet, *neighbor, **neighborp;
    -  facetT *bestfacet= NULL, *lastfacet= NULL;
    -  int oldtrace= qh IStracing;
    -  unsigned int visitid= ++qh visit_id;
    -  int numpartnew=0;
    -  boolT testhorizon = True; /* needed if precise, e.g., rbox c D6 | qhull Q0 Tv */
    -
    -  zinc_(Zfindbest);
    -  if (qh IStracing >= 3 || (qh TRACElevel && qh TRACEpoint >= 0 && qh TRACEpoint == qh_pointid(point))) {
    -    if (qh TRACElevel > qh IStracing)
    -      qh IStracing= qh TRACElevel;
    -    qh_fprintf(qh ferr, 8004, "qh_findbest: point p%d starting at f%d isnewfacets? %d, unless %d exit if > %2.2g\n",
    -             qh_pointid(point), startfacet->id, isnewfacets, bestoutside, qh MINoutside);
    -    qh_fprintf(qh ferr, 8005, "  testhorizon? %d noupper? %d", testhorizon, noupper);
    -    qh_fprintf(qh ferr, 8006, "  Last point added was p%d.", qh furthest_id);
    -    qh_fprintf(qh ferr, 8007, "  Last merge was #%d.  max_outside %2.2g\n", zzval_(Ztotmerge), qh max_outside);
    -  }
    -  if (isoutside)
    -    *isoutside= True;
    -  if (!startfacet->flipped) {  /* test startfacet */
    -    *numpart= 1;
    -    qh_distplane(point, startfacet, dist);  /* this code is duplicated below */
    -    if (!bestoutside && *dist >= qh MINoutside
    -    && (!startfacet->upperdelaunay || !noupper)) {
    -      bestfacet= startfacet;
    -      goto LABELreturn_best;
    -    }
    -    bestdist= *dist;
    -    if (!startfacet->upperdelaunay) {
    -      bestfacet= startfacet;
    -    }
    -  }else
    -    *numpart= 0;
    -  startfacet->visitid= visitid;
    -  facet= startfacet;
    -  while (facet) {
    -    trace4((qh ferr, 4001, "qh_findbest: neighbors of f%d, bestdist %2.2g f%d\n",
    -                facet->id, bestdist, getid_(bestfacet)));
    -    lastfacet= facet;
    -    FOREACHneighbor_(facet) {
    -      if (!neighbor->newfacet && isnewfacets)
    -        continue;
    -      if (neighbor->visitid == visitid)
    -        continue;
    -      neighbor->visitid= visitid;
    -      if (!neighbor->flipped) {  /* code duplicated above */
    -        (*numpart)++;
    -        qh_distplane(point, neighbor, dist);
    -        if (*dist > bestdist) {
    -          if (!bestoutside && *dist >= qh MINoutside
    -          && (!neighbor->upperdelaunay || !noupper)) {
    -            bestfacet= neighbor;
    -            goto LABELreturn_best;
    -          }
    -          if (!neighbor->upperdelaunay) {
    -            bestfacet= neighbor;
    -            bestdist= *dist;
    -            break; /* switch to neighbor */
    -          }else if (!bestfacet) {
    -            bestdist= *dist;
    -            break; /* switch to neighbor */
    -          }
    -        } /* end of *dist>bestdist */
    -      } /* end of !flipped */
    -    } /* end of FOREACHneighbor */
    -    facet= neighbor;  /* non-NULL only if *dist>bestdist */
    -  } /* end of while facet (directed search) */
    -  if (isnewfacets) {
    -    if (!bestfacet) {
    -      bestdist= -REALmax/2;
    -      bestfacet= qh_findbestnew(point, startfacet->next, &bestdist, bestoutside, isoutside, &numpartnew);
    -      testhorizon= False; /* qh_findbestnew calls qh_findbesthorizon */
    -    }else if (!qh findbest_notsharp && bestdist < - qh DISTround) {
    -      if (qh_sharpnewfacets()) {
    -        /* seldom used, qh_findbestnew will retest all facets */
    -        zinc_(Zfindnewsharp);
    -        bestfacet= qh_findbestnew(point, bestfacet, &bestdist, bestoutside, isoutside, &numpartnew);
    -        testhorizon= False; /* qh_findbestnew calls qh_findbesthorizon */
    -        qh findbestnew= True;
    -      }else
    -        qh findbest_notsharp= True;
    -    }
    -  }
    -  if (!bestfacet)
    -    bestfacet= qh_findbestlower(lastfacet, point, &bestdist, numpart);
    -  if (testhorizon)
    -    bestfacet= qh_findbesthorizon(!qh_IScheckmax, point, bestfacet, noupper, &bestdist, &numpartnew);
    -  *dist= bestdist;
    -  if (isoutside && bestdist < qh MINoutside)
    -    *isoutside= False;
    -LABELreturn_best:
    -  zadd_(Zfindbesttot, *numpart);
    -  zmax_(Zfindbestmax, *numpart);
    -  (*numpart) += numpartnew;
    -  qh IStracing= oldtrace;
    -  return bestfacet;
    -}  /* findbest */
    -
    -
    -/*---------------------------------
    -
    -  qh_findbesthorizon( qh_IScheckmax, point, startfacet, qh_NOupper, &bestdist, &numpart )
    -    search coplanar and better horizon facets from startfacet/bestdist
    -    ischeckmax turns off statistics and minsearch update
    -    all arguments must be initialized
    -  returns(ischeckmax):
    -    best facet
    -  returns(!ischeckmax):
    -    best facet that is not upperdelaunay
    -    allows upperdelaunay that is clearly outside
    -  returns:
    -    bestdist is distance to bestfacet
    -    numpart -- updates number of distance tests
    -
    -  notes:
    -    no early out -- use qh_findbest() or qh_findbestnew()
    -    Searches coplanar or better horizon facets
    -
    -  when called by qh_check_maxout() (qh_IScheckmax)
    -    startfacet must be closest to the point
    -      Otherwise, if point is beyond and below startfacet, startfacet may be a local minimum
    -      even though other facets are below the point.
    -    updates facet->maxoutside for good, visited facets
    -    may return NULL
    -
    -    searchdist is qh.max_outside + 2 * DISTround
    -      + max( MINvisible('Vn'), MAXcoplanar('Un'));
    -    This setting is a guess.  It must be at least max_outside + 2*DISTround
    -    because a facet may have a geometric neighbor across a vertex
    -
    -  design:
    -    for each horizon facet of coplanar best facets
    -      continue if clearly inside
    -      unless upperdelaunay or clearly outside
    -         update best facet
    -*/
    -facetT *qh_findbesthorizon(boolT ischeckmax, pointT* point, facetT *startfacet, boolT noupper, realT *bestdist, int *numpart) {
    -  facetT *bestfacet= startfacet;
    -  realT dist;
    -  facetT *neighbor, **neighborp, *facet;
    -  facetT *nextfacet= NULL; /* optimize last facet of coplanarfacetset */
    -  int numpartinit= *numpart, coplanarfacetset_size;
    -  unsigned int visitid= ++qh visit_id;
    -  boolT newbest= False; /* for tracing */
    -  realT minsearch, searchdist;  /* skip facets that are too far from point */
    -
    -  if (!ischeckmax) {
    -    zinc_(Zfindhorizon);
    -  }else {
    -#if qh_MAXoutside
    -    if ((!qh ONLYgood || startfacet->good) && *bestdist > startfacet->maxoutside)
    -      startfacet->maxoutside= *bestdist;
    -#endif
    -  }
    -  searchdist= qh_SEARCHdist; /* multiple of qh.max_outside and precision constants */
    -  minsearch= *bestdist - searchdist;
    -  if (ischeckmax) {
    -    /* Always check coplanar facets.  Needed for RBOX 1000 s Z1 G1e-13 t996564279 | QHULL Tv */
    -    minimize_(minsearch, -searchdist);
    -  }
    -  coplanarfacetset_size= 0;
    -  facet= startfacet;
    -  while (True) {
    -    trace4((qh ferr, 4002, "qh_findbesthorizon: neighbors of f%d bestdist %2.2g f%d ischeckmax? %d noupper? %d minsearch %2.2g searchdist %2.2g\n",
    -                facet->id, *bestdist, getid_(bestfacet), ischeckmax, noupper,
    -                minsearch, searchdist));
    -    FOREACHneighbor_(facet) {
    -      if (neighbor->visitid == visitid)
    -        continue;
    -      neighbor->visitid= visitid;
    -      if (!neighbor->flipped) {
    -        qh_distplane(point, neighbor, &dist);
    -        (*numpart)++;
    -        if (dist > *bestdist) {
    -          if (!neighbor->upperdelaunay || ischeckmax || (!noupper && dist >= qh MINoutside)) {
    -            bestfacet= neighbor;
    -            *bestdist= dist;
    -            newbest= True;
    -            if (!ischeckmax) {
    -              minsearch= dist - searchdist;
    -              if (dist > *bestdist + searchdist) {
    -                zinc_(Zfindjump);  /* everything in qh.coplanarfacetset at least searchdist below */
    -                coplanarfacetset_size= 0;
    -              }
    -            }
    -          }
    -        }else if (dist < minsearch)
    -          continue;  /* if ischeckmax, dist can't be positive */
    -#if qh_MAXoutside
    -        if (ischeckmax && dist > neighbor->maxoutside)
    -          neighbor->maxoutside= dist;
    -#endif
    -      } /* end of !flipped */
    -      if (nextfacet) {
    -        if (!coplanarfacetset_size++) {
    -          SETfirst_(qh coplanarfacetset)= nextfacet;
    -          SETtruncate_(qh coplanarfacetset, 1);
    -        }else
    -          qh_setappend(&qh coplanarfacetset, nextfacet); /* Was needed for RBOX 1000 s W1e-13 P0 t996547055 | QHULL d Qbb Qc Tv
    -                                                 and RBOX 1000 s Z1 G1e-13 t996564279 | qhull Tv  */
    -      }
    -      nextfacet= neighbor;
    -    } /* end of EACHneighbor */
    -    facet= nextfacet;
    -    if (facet)
    -      nextfacet= NULL;
    -    else if (!coplanarfacetset_size)
    -      break;
    -    else if (!--coplanarfacetset_size) {
    -      facet= SETfirstt_(qh coplanarfacetset, facetT);
    -      SETtruncate_(qh coplanarfacetset, 0);
    -    }else
    -      facet= (facetT*)qh_setdellast(qh coplanarfacetset);
    -  } /* while True, for each facet in qh.coplanarfacetset */
    -  if (!ischeckmax) {
    -    zadd_(Zfindhorizontot, *numpart - numpartinit);
    -    zmax_(Zfindhorizonmax, *numpart - numpartinit);
    -    if (newbest)
    -      zinc_(Zparthorizon);
    -  }
    -  trace4((qh ferr, 4003, "qh_findbesthorizon: newbest? %d bestfacet f%d bestdist %2.2g\n", newbest, getid_(bestfacet), *bestdist));
    -  return bestfacet;
    -}  /* findbesthorizon */
    -
    -/*---------------------------------
    -
    -  qh_findbestnew( point, startfacet, dist, isoutside, numpart )
    -    find best newfacet for point
    -    searches all of qh.newfacet_list starting at startfacet
    -    searches horizon facets of coplanar best newfacets
    -    searches all facets if startfacet == qh.facet_list
    -  returns:
    -    best new or horizon facet that is not upperdelaunay
    -    early out if isoutside and not 'Qf'
    -    dist is distance to facet
    -    isoutside is true if point is outside of facet
    -    numpart is number of distance tests
    -
    -  notes:
    -    Always used for merged new facets (see qh_USEfindbestnew)
    -    Avoids upperdelaunay facet unless (isoutside and outside)
    -
    -    Uses qh.visit_id, qh.coplanarfacetset.
    -    If share visit_id with qh_findbest, coplanarfacetset is incorrect.
    -
    -    If merging (testhorizon), searches horizon facets of coplanar best facets because
    -    a point maybe coplanar to the bestfacet, below its horizon facet,
    -    and above a horizon facet of a coplanar newfacet.  For example,
    -      rbox 1000 s Z1 G1e-13 | qhull
    -      rbox 1000 s W1e-13 P0 t992110337 | QHULL d Qbb Qc
    -
    -    qh_findbestnew() used if
    -       qh_sharpnewfacets -- newfacets contains a sharp angle
    -       if many merges, qh_premerge found a merge, or 'Qf' (qh.findbestnew)
    -
    -  see also:
    -    qh_partitionall() and qh_findbest()
    -
    -  design:
    -    for each new facet starting from startfacet
    -      test distance from point to facet
    -      return facet if clearly outside
    -      unless upperdelaunay and a lowerdelaunay exists
    -         update best facet
    -    test horizon facets
    -*/
    -facetT *qh_findbestnew(pointT *point, facetT *startfacet,
    -           realT *dist, boolT bestoutside, boolT *isoutside, int *numpart) {
    -  realT bestdist= -REALmax/2;
    -  facetT *bestfacet= NULL, *facet;
    -  int oldtrace= qh IStracing, i;
    -  unsigned int visitid= ++qh visit_id;
    -  realT distoutside= 0.0;
    -  boolT isdistoutside; /* True if distoutside is defined */
    -  boolT testhorizon = True; /* needed if precise, e.g., rbox c D6 | qhull Q0 Tv */
    -
    -  if (!startfacet) {
    -    if (qh MERGING)
    -      qh_fprintf(qh ferr, 6001, "qhull precision error (qh_findbestnew): merging has formed and deleted a cone of new facets.  Can not continue.\n");
    -    else
    -      qh_fprintf(qh ferr, 6002, "qhull internal error (qh_findbestnew): no new facets for point p%d\n",
    -              qh furthest_id);
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -  zinc_(Zfindnew);
    -  if (qh BESToutside || bestoutside)
    -    isdistoutside= False;
    -  else {
    -    isdistoutside= True;
    -    distoutside= qh_DISToutside; /* multiple of qh.MINoutside & qh.max_outside, see user.h */
    -  }
    -  if (isoutside)
    -    *isoutside= True;
    -  *numpart= 0;
    -  if (qh IStracing >= 3 || (qh TRACElevel && qh TRACEpoint >= 0 && qh TRACEpoint == qh_pointid(point))) {
    -    if (qh TRACElevel > qh IStracing)
    -      qh IStracing= qh TRACElevel;
    -    qh_fprintf(qh ferr, 8008, "qh_findbestnew: point p%d facet f%d. Stop? %d if dist > %2.2g\n",
    -             qh_pointid(point), startfacet->id, isdistoutside, distoutside);
    -    qh_fprintf(qh ferr, 8009, "  Last point added p%d visitid %d.",  qh furthest_id, visitid);
    -    qh_fprintf(qh ferr, 8010, "  Last merge was #%d.\n", zzval_(Ztotmerge));
    -  }
    -  /* visit all new facets starting with startfacet, maybe qh facet_list */
    -  for (i=0, facet=startfacet; i < 2; i++, facet= qh newfacet_list) {
    -    FORALLfacet_(facet) {
    -      if (facet == startfacet && i)
    -        break;
    -      facet->visitid= visitid;
    -      if (!facet->flipped) {
    -        qh_distplane(point, facet, dist);
    -        (*numpart)++;
    -        if (*dist > bestdist) {
    -          if (!facet->upperdelaunay || *dist >= qh MINoutside) {
    -            bestfacet= facet;
    -            if (isdistoutside && *dist >= distoutside)
    -              goto LABELreturn_bestnew;
    -            bestdist= *dist;
    -          }
    -        }
    -      } /* end of !flipped */
    -    } /* FORALLfacet from startfacet or qh newfacet_list */
    -  }
    -  if (testhorizon || !bestfacet) /* testhorizon is always True.  Keep the same code as qh_findbest */
    -    bestfacet= qh_findbesthorizon(!qh_IScheckmax, point, bestfacet ? bestfacet : startfacet,
    -                                        !qh_NOupper, &bestdist, numpart);
    -  *dist= bestdist;
    -  if (isoutside && *dist < qh MINoutside)
    -    *isoutside= False;
    -LABELreturn_bestnew:
    -  zadd_(Zfindnewtot, *numpart);
    -  zmax_(Zfindnewmax, *numpart);
    -  trace4((qh ferr, 4004, "qh_findbestnew: bestfacet f%d bestdist %2.2g\n", getid_(bestfacet), *dist));
    -  qh IStracing= oldtrace;
    -  return bestfacet;
    -}  /* findbestnew */
    -
    -/* ============ hyperplane functions -- keep code together [?] ============ */
    -
    -/*---------------------------------
    -
    -  qh_backnormal( rows, numrow, numcol, sign, normal, nearzero )
    -    given an upper-triangular rows array and a sign,
    -    solve for normal equation x using back substitution over rows U
    -
    -  returns:
    -     normal= x
    -
    -     if will not be able to divzero() when normalized(qh.MINdenom_2 and qh.MINdenom_1_2),
    -       if fails on last row
    -         this means that the hyperplane intersects [0,..,1]
    -         sets last coordinate of normal to sign
    -       otherwise
    -         sets tail of normal to [...,sign,0,...], i.e., solves for b= [0...0]
    -         sets nearzero
    -
    -  notes:
    -     assumes numrow == numcol-1
    -
    -     see Golub & van Loan, 1983, Eq. 4.4-9 for "Gaussian elimination with complete pivoting"
    -
    -     solves Ux=b where Ax=b and PA=LU
    -     b= [0,...,0,sign or 0]  (sign is either -1 or +1)
    -     last row of A= [0,...,0,1]
    -
    -     1) Ly=Pb == y=b since P only permutes the 0's of   b
    -
    -  design:
    -    for each row from end
    -      perform back substitution
    -      if near zero
    -        use qh_divzero for division
    -        if zero divide and not last row
    -          set tail of normal to 0
    -*/
    -void qh_backnormal(realT **rows, int numrow, int numcol, boolT sign,
    -        coordT *normal, boolT *nearzero) {
    -  int i, j;
    -  coordT *normalp, *normal_tail, *ai, *ak;
    -  realT diagonal;
    -  boolT waszero;
    -  int zerocol= -1;
    -
    -  normalp= normal + numcol - 1;
    -  *normalp--= (sign ? -1.0 : 1.0);
    -  for (i=numrow; i--; ) {
    -    *normalp= 0.0;
    -    ai= rows[i] + i + 1;
    -    ak= normalp+1;
    -    for (j=i+1; j < numcol; j++)
    -      *normalp -= *ai++ * *ak++;
    -    diagonal= (rows[i])[i];
    -    if (fabs_(diagonal) > qh MINdenom_2)
    -      *(normalp--) /= diagonal;
    -    else {
    -      waszero= False;
    -      *normalp= qh_divzero(*normalp, diagonal, qh MINdenom_1_2, &waszero);
    -      if (waszero) {
    -        zerocol= i;
    -        *(normalp--)= (sign ? -1.0 : 1.0);
    -        for (normal_tail= normalp+2; normal_tail < normal + numcol; normal_tail++)
    -          *normal_tail= 0.0;
    -      }else
    -        normalp--;
    -    }
    -  }
    -  if (zerocol != -1) {
    -    zzinc_(Zback0);
    -    *nearzero= True;
    -    trace4((qh ferr, 4005, "qh_backnormal: zero diagonal at column %d.\n", i));
    -    qh_precision("zero diagonal on back substitution");
    -  }
    -} /* backnormal */
    -
    -/*---------------------------------
    -
    -  qh_gausselim( rows, numrow, numcol, sign )
    -    Gaussian elimination with partial pivoting
    -
    -  returns:
    -    rows is upper triangular (includes row exchanges)
    -    flips sign for each row exchange
    -    sets nearzero if pivot[k] < qh.NEARzero[k], else clears it
    -
    -  notes:
    -    if nearzero, the determinant's sign may be incorrect.
    -    assumes numrow <= numcol
    -
    -  design:
    -    for each row
    -      determine pivot and exchange rows if necessary
    -      test for near zero
    -      perform gaussian elimination step
    -*/
    -void qh_gausselim(realT **rows, int numrow, int numcol, boolT *sign, boolT *nearzero) {
    -  realT *ai, *ak, *rowp, *pivotrow;
    -  realT n, pivot, pivot_abs= 0.0, temp;
    -  int i, j, k, pivoti, flip=0;
    -
    -  *nearzero= False;
    -  for (k=0; k < numrow; k++) {
    -    pivot_abs= fabs_((rows[k])[k]);
    -    pivoti= k;
    -    for (i=k+1; i < numrow; i++) {
    -      if ((temp= fabs_((rows[i])[k])) > pivot_abs) {
    -        pivot_abs= temp;
    -        pivoti= i;
    -      }
    -    }
    -    if (pivoti != k) {
    -      rowp= rows[pivoti];
    -      rows[pivoti]= rows[k];
    -      rows[k]= rowp;
    -      *sign ^= 1;
    -      flip ^= 1;
    -    }
    -    if (pivot_abs <= qh NEARzero[k]) {
    -      *nearzero= True;
    -      if (pivot_abs == 0.0) {   /* remainder of column == 0 */
    -        if (qh IStracing >= 4) {
    -          qh_fprintf(qh ferr, 8011, "qh_gausselim: 0 pivot at column %d. (%2.2g < %2.2g)\n", k, pivot_abs, qh DISTround);
    -          qh_printmatrix(qh ferr, "Matrix:", rows, numrow, numcol);
    -        }
    -        zzinc_(Zgauss0);
    -        qh_precision("zero pivot for Gaussian elimination");
    -        goto LABELnextcol;
    -      }
    -    }
    -    pivotrow= rows[k] + k;
    -    pivot= *pivotrow++;  /* signed value of pivot, and remainder of row */
    -    for (i=k+1; i < numrow; i++) {
    -      ai= rows[i] + k;
    -      ak= pivotrow;
    -      n= (*ai++)/pivot;   /* divzero() not needed since |pivot| >= |*ai| */
    -      for (j= numcol - (k+1); j--; )
    -        *ai++ -= n * *ak++;
    -    }
    -  LABELnextcol:
    -    ;
    -  }
    -  wmin_(Wmindenom, pivot_abs);  /* last pivot element */
    -  if (qh IStracing >= 5)
    -    qh_printmatrix(qh ferr, "qh_gausselem: result", rows, numrow, numcol);
    -} /* gausselim */
    -
    -
    -/*---------------------------------
    -
    -  qh_getangle( vect1, vect2 )
    -    returns the dot product of two vectors
    -    if qh.RANDOMdist, joggles result
    -
    -  notes:
    -    the angle may be > 1.0 or < -1.0 because of roundoff errors
    -
    -*/
    -realT qh_getangle(pointT *vect1, pointT *vect2) {
    -  realT angle= 0, randr;
    -  int k;
    -
    -  for (k=qh hull_dim; k--; )
    -    angle += *vect1++ * *vect2++;
    -  if (qh RANDOMdist) {
    -    randr= qh_RANDOMint;
    -    angle += (2.0 * randr / qh_RANDOMmax - 1.0) *
    -      qh RANDOMfactor;
    -  }
    -  trace4((qh ferr, 4006, "qh_getangle: %2.2g\n", angle));
    -  return(angle);
    -} /* getangle */
    -
    -
    -/*---------------------------------
    -
    -  qh_getcenter( vertices )
    -    returns arithmetic center of a set of vertices as a new point
    -
    -  notes:
    -    allocates point array for center
    -*/
    -pointT *qh_getcenter(setT *vertices) {
    -  int k;
    -  pointT *center, *coord;
    -  vertexT *vertex, **vertexp;
    -  int count= qh_setsize(vertices);
    -
    -  if (count < 2) {
    -    qh_fprintf(qh ferr, 6003, "qhull internal error (qh_getcenter): not defined for %d points\n", count);
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -  center= (pointT *)qh_memalloc(qh normal_size);
    -  for (k=0; k < qh hull_dim; k++) {
    -    coord= center+k;
    -    *coord= 0.0;
    -    FOREACHvertex_(vertices)
    -      *coord += vertex->point[k];
    -    *coord /= count;  /* count>=2 by QH6003 */
    -  }
    -  return(center);
    -} /* getcenter */
    -
    -
    -/*---------------------------------
    -
    -  qh_getcentrum( facet )
    -    returns the centrum for a facet as a new point
    -
    -  notes:
    -    allocates the centrum
    -*/
    -pointT *qh_getcentrum(facetT *facet) {
    -  realT dist;
    -  pointT *centrum, *point;
    -
    -  point= qh_getcenter(facet->vertices);
    -  zzinc_(Zcentrumtests);
    -  qh_distplane(point, facet, &dist);
    -  centrum= qh_projectpoint(point, facet, dist);
    -  qh_memfree(point, qh normal_size);
    -  trace4((qh ferr, 4007, "qh_getcentrum: for f%d, %d vertices dist= %2.2g\n",
    -          facet->id, qh_setsize(facet->vertices), dist));
    -  return centrum;
    -} /* getcentrum */
    -
    -
    -/*---------------------------------
    -
    -  qh_getdistance( facet, neighbor, mindist, maxdist )
    -    returns the maxdist and mindist distance of any vertex from neighbor
    -
    -  returns:
    -    the max absolute value
    -
    -  design:
    -    for each vertex of facet that is not in neighbor
    -      test the distance from vertex to neighbor
    -*/
    -realT qh_getdistance(facetT *facet, facetT *neighbor, realT *mindist, realT *maxdist) {
    -  vertexT *vertex, **vertexp;
    -  realT dist, maxd, mind;
    -
    -  FOREACHvertex_(facet->vertices)
    -    vertex->seen= False;
    -  FOREACHvertex_(neighbor->vertices)
    -    vertex->seen= True;
    -  mind= 0.0;
    -  maxd= 0.0;
    -  FOREACHvertex_(facet->vertices) {
    -    if (!vertex->seen) {
    -      zzinc_(Zbestdist);
    -      qh_distplane(vertex->point, neighbor, &dist);
    -      if (dist < mind)
    -        mind= dist;
    -      else if (dist > maxd)
    -        maxd= dist;
    -    }
    -  }
    -  *mindist= mind;
    -  *maxdist= maxd;
    -  mind= -mind;
    -  if (maxd > mind)
    -    return maxd;
    -  else
    -    return mind;
    -} /* getdistance */
    -
    -
    -/*---------------------------------
    -
    -  qh_normalize( normal, dim, toporient )
    -    normalize a vector and report if too small
    -    does not use min norm
    -
    -  see:
    -    qh_normalize2
    -*/
    -void qh_normalize(coordT *normal, int dim, boolT toporient) {
    -  qh_normalize2( normal, dim, toporient, NULL, NULL);
    -} /* normalize */
    -
    -/*---------------------------------
    -
    -  qh_normalize2( normal, dim, toporient, minnorm, ismin )
    -    normalize a vector and report if too small
    -    qh.MINdenom/MINdenom1 are the upper limits for divide overflow
    -
    -  returns:
    -    normalized vector
    -    flips sign if !toporient
    -    if minnorm non-NULL,
    -      sets ismin if normal < minnorm
    -
    -  notes:
    -    if zero norm
    -       sets all elements to sqrt(1.0/dim)
    -    if divide by zero (divzero())
    -       sets largest element to   +/-1
    -       bumps Znearlysingular
    -
    -  design:
    -    computes norm
    -    test for minnorm
    -    if not near zero
    -      normalizes normal
    -    else if zero norm
    -      sets normal to standard value
    -    else
    -      uses qh_divzero to normalize
    -      if nearzero
    -        sets norm to direction of maximum value
    -*/
    -void qh_normalize2(coordT *normal, int dim, boolT toporient,
    -            realT *minnorm, boolT *ismin) {
    -  int k;
    -  realT *colp, *maxp, norm= 0, temp, *norm1, *norm2, *norm3;
    -  boolT zerodiv;
    -
    -  norm1= normal+1;
    -  norm2= normal+2;
    -  norm3= normal+3;
    -  if (dim == 2)
    -    norm= sqrt((*normal)*(*normal) + (*norm1)*(*norm1));
    -  else if (dim == 3)
    -    norm= sqrt((*normal)*(*normal) + (*norm1)*(*norm1) + (*norm2)*(*norm2));
    -  else if (dim == 4) {
    -    norm= sqrt((*normal)*(*normal) + (*norm1)*(*norm1) + (*norm2)*(*norm2)
    -               + (*norm3)*(*norm3));
    -  }else if (dim > 4) {
    -    norm= (*normal)*(*normal) + (*norm1)*(*norm1) + (*norm2)*(*norm2)
    -               + (*norm3)*(*norm3);
    -    for (k=dim-4, colp=normal+4; k--; colp++)
    -      norm += (*colp) * (*colp);
    -    norm= sqrt(norm);
    -  }
    -  if (minnorm) {
    -    if (norm < *minnorm)
    -      *ismin= True;
    -    else
    -      *ismin= False;
    -  }
    -  wmin_(Wmindenom, norm);
    -  if (norm > qh MINdenom) {
    -    if (!toporient)
    -      norm= -norm;
    -    *normal /= norm;
    -    *norm1 /= norm;
    -    if (dim == 2)
    -      ; /* all done */
    -    else if (dim == 3)
    -      *norm2 /= norm;
    -    else if (dim == 4) {
    -      *norm2 /= norm;
    -      *norm3 /= norm;
    -    }else if (dim >4) {
    -      *norm2 /= norm;
    -      *norm3 /= norm;
    -      for (k=dim-4, colp=normal+4; k--; )
    -        *colp++ /= norm;
    -    }
    -  }else if (norm == 0.0) {
    -    temp= sqrt(1.0/dim);
    -    for (k=dim, colp=normal; k--; )
    -      *colp++ = temp;
    -  }else {
    -    if (!toporient)
    -      norm= -norm;
    -    for (k=dim, colp=normal; k--; colp++) { /* k used below */
    -      temp= qh_divzero(*colp, norm, qh MINdenom_1, &zerodiv);
    -      if (!zerodiv)
    -        *colp= temp;
    -      else {
    -        maxp= qh_maxabsval(normal, dim);
    -        temp= ((*maxp * norm >= 0.0) ? 1.0 : -1.0);
    -        for (k=dim, colp=normal; k--; colp++)
    -          *colp= 0.0;
    -        *maxp= temp;
    -        zzinc_(Znearlysingular);
    -        trace0((qh ferr, 1, "qh_normalize: norm=%2.2g too small during p%d\n",
    -               norm, qh furthest_id));
    -        return;
    -      }
    -    }
    -  }
    -} /* normalize */
    -
    -
    -/*---------------------------------
    -
    -  qh_projectpoint( point, facet, dist )
    -    project point onto a facet by dist
    -
    -  returns:
    -    returns a new point
    -
    -  notes:
    -    if dist= distplane(point,facet)
    -      this projects point to hyperplane
    -    assumes qh_memfree_() is valid for normal_size
    -*/
    -pointT *qh_projectpoint(pointT *point, facetT *facet, realT dist) {
    -  pointT *newpoint, *np, *normal;
    -  int normsize= qh normal_size;
    -  int k;
    -  void **freelistp; /* used if !qh_NOmem by qh_memalloc_() */
    -
    -  qh_memalloc_(normsize, freelistp, newpoint, pointT);
    -  np= newpoint;
    -  normal= facet->normal;
    -  for (k=qh hull_dim; k--; )
    -    *(np++)= *point++ - dist * *normal++;
    -  return(newpoint);
    -} /* projectpoint */
    -
    -
    -/*---------------------------------
    -
    -  qh_setfacetplane( facet )
    -    sets the hyperplane for a facet
    -    if qh.RANDOMdist, joggles hyperplane
    -
    -  notes:
    -    uses global buffers qh.gm_matrix and qh.gm_row
    -    overwrites facet->normal if already defined
    -    updates Wnewvertex if PRINTstatistics
    -    sets facet->upperdelaunay if upper envelope of Delaunay triangulation
    -
    -  design:
    -    copy vertex coordinates to qh.gm_matrix/gm_row
    -    compute determinate
    -    if nearzero
    -      recompute determinate with gaussian elimination
    -      if nearzero
    -        force outside orientation by testing interior point
    -*/
    -void qh_setfacetplane(facetT *facet) {
    -  pointT *point;
    -  vertexT *vertex, **vertexp;
    -  int normsize= qh normal_size;
    -  int k,i, oldtrace= 0;
    -  realT dist;
    -  void **freelistp; /* used if !qh_NOmem by qh_memalloc_() */
    -  coordT *coord, *gmcoord;
    -  pointT *point0= SETfirstt_(facet->vertices, vertexT)->point;
    -  boolT nearzero= False;
    -
    -  zzinc_(Zsetplane);
    -  if (!facet->normal)
    -    qh_memalloc_(normsize, freelistp, facet->normal, coordT);
    -  if (facet == qh tracefacet) {
    -    oldtrace= qh IStracing;
    -    qh IStracing= 5;
    -    qh_fprintf(qh ferr, 8012, "qh_setfacetplane: facet f%d created.\n", facet->id);
    -    qh_fprintf(qh ferr, 8013, "  Last point added to hull was p%d.", qh furthest_id);
    -    if (zzval_(Ztotmerge))
    -      qh_fprintf(qh ferr, 8014, "  Last merge was #%d.", zzval_(Ztotmerge));
    -    qh_fprintf(qh ferr, 8015, "\n\nCurrent summary is:\n");
    -      qh_printsummary(qh ferr);
    -  }
    -  if (qh hull_dim <= 4) {
    -    i= 0;
    -    if (qh RANDOMdist) {
    -      gmcoord= qh gm_matrix;
    -      FOREACHvertex_(facet->vertices) {
    -        qh gm_row[i++]= gmcoord;
    -        coord= vertex->point;
    -        for (k=qh hull_dim; k--; )
    -          *(gmcoord++)= *coord++ * qh_randomfactor(qh RANDOMa, qh RANDOMb);
    -      }
    -    }else {
    -      FOREACHvertex_(facet->vertices)
    -       qh gm_row[i++]= vertex->point;
    -    }
    -    qh_sethyperplane_det(qh hull_dim, qh gm_row, point0, facet->toporient,
    -                facet->normal, &facet->offset, &nearzero);
    -  }
    -  if (qh hull_dim > 4 || nearzero) {
    -    i= 0;
    -    gmcoord= qh gm_matrix;
    -    FOREACHvertex_(facet->vertices) {
    -      if (vertex->point != point0) {
    -        qh gm_row[i++]= gmcoord;
    -        coord= vertex->point;
    -        point= point0;
    -        for (k=qh hull_dim; k--; )
    -          *(gmcoord++)= *coord++ - *point++;
    -      }
    -    }
    -    qh gm_row[i]= gmcoord;  /* for areasimplex */
    -    if (qh RANDOMdist) {
    -      gmcoord= qh gm_matrix;
    -      for (i=qh hull_dim-1; i--; ) {
    -        for (k=qh hull_dim; k--; )
    -          *(gmcoord++) *= qh_randomfactor(qh RANDOMa, qh RANDOMb);
    -      }
    -    }
    -    qh_sethyperplane_gauss(qh hull_dim, qh gm_row, point0, facet->toporient,
    -                facet->normal, &facet->offset, &nearzero);
    -    if (nearzero) {
    -      if (qh_orientoutside(facet)) {
    -        trace0((qh ferr, 2, "qh_setfacetplane: flipped orientation after testing interior_point during p%d\n", qh furthest_id));
    -      /* this is part of using Gaussian Elimination.  For example in 5-d
    -           1 1 1 1 0
    -           1 1 1 1 1
    -           0 0 0 1 0
    -           0 1 0 0 0
    -           1 0 0 0 0
    -           norm= 0.38 0.38 -0.76 0.38 0
    -         has a determinate of 1, but g.e. after subtracting pt. 0 has
    -         0's in the diagonal, even with full pivoting.  It does work
    -         if you subtract pt. 4 instead. */
    -      }
    -    }
    -  }
    -  facet->upperdelaunay= False;
    -  if (qh DELAUNAY) {
    -    if (qh UPPERdelaunay) {     /* matches qh_triangulate_facet and qh.lower_threshold in qh_initbuild */
    -      if (facet->normal[qh hull_dim -1] >= qh ANGLEround * qh_ZEROdelaunay)
    -        facet->upperdelaunay= True;
    -    }else {
    -      if (facet->normal[qh hull_dim -1] > -qh ANGLEround * qh_ZEROdelaunay)
    -        facet->upperdelaunay= True;
    -    }
    -  }
    -  if (qh PRINTstatistics || qh IStracing || qh TRACElevel || qh JOGGLEmax < REALmax) {
    -    qh old_randomdist= qh RANDOMdist;
    -    qh RANDOMdist= False;
    -    FOREACHvertex_(facet->vertices) {
    -      if (vertex->point != point0) {
    -        boolT istrace= False;
    -        zinc_(Zdiststat);
    -        qh_distplane(vertex->point, facet, &dist);
    -        dist= fabs_(dist);
    -        zinc_(Znewvertex);
    -        wadd_(Wnewvertex, dist);
    -        if (dist > wwval_(Wnewvertexmax)) {
    -          wwval_(Wnewvertexmax)= dist;
    -          if (dist > qh max_outside) {
    -            qh max_outside= dist;  /* used by qh_maxouter() */
    -            if (dist > qh TRACEdist)
    -              istrace= True;
    -          }
    -        }else if (-dist > qh TRACEdist)
    -          istrace= True;
    -        if (istrace) {
    -          qh_fprintf(qh ferr, 8016, "qh_setfacetplane: ====== vertex p%d(v%d) increases max_outside to %2.2g for new facet f%d last p%d\n",
    -                qh_pointid(vertex->point), vertex->id, dist, facet->id, qh furthest_id);
    -          qh_errprint("DISTANT", facet, NULL, NULL, NULL);
    -        }
    -      }
    -    }
    -    qh RANDOMdist= qh old_randomdist;
    -  }
    -  if (qh IStracing >= 3) {
    -    qh_fprintf(qh ferr, 8017, "qh_setfacetplane: f%d offset %2.2g normal: ",
    -             facet->id, facet->offset);
    -    for (k=0; k < qh hull_dim; k++)
    -      qh_fprintf(qh ferr, 8018, "%2.2g ", facet->normal[k]);
    -    qh_fprintf(qh ferr, 8019, "\n");
    -  }
    -  if (facet == qh tracefacet)
    -    qh IStracing= oldtrace;
    -} /* setfacetplane */
    -
    -
    -/*---------------------------------
    -
    -  qh_sethyperplane_det( dim, rows, point0, toporient, normal, offset, nearzero )
    -    given dim X dim array indexed by rows[], one row per point,
    -        toporient(flips all signs),
    -        and point0 (any row)
    -    set normalized hyperplane equation from oriented simplex
    -
    -  returns:
    -    normal (normalized)
    -    offset (places point0 on the hyperplane)
    -    sets nearzero if hyperplane not through points
    -
    -  notes:
    -    only defined for dim == 2..4
    -    rows[] is not modified
    -    solves det(P-V_0, V_n-V_0, ..., V_1-V_0)=0, i.e. every point is on hyperplane
    -    see Bower & Woodworth, A programmer's geometry, Butterworths 1983.
    -
    -  derivation of 3-d minnorm
    -    Goal: all vertices V_i within qh.one_merge of hyperplane
    -    Plan: exactly translate the facet so that V_0 is the origin
    -          exactly rotate the facet so that V_1 is on the x-axis and y_2=0.
    -          exactly rotate the effective perturbation to only effect n_0
    -             this introduces a factor of sqrt(3)
    -    n_0 = ((y_2-y_0)*(z_1-z_0) - (z_2-z_0)*(y_1-y_0)) / norm
    -    Let M_d be the max coordinate difference
    -    Let M_a be the greater of M_d and the max abs. coordinate
    -    Let u be machine roundoff and distround be max error for distance computation
    -    The max error for n_0 is sqrt(3) u M_a M_d / norm.  n_1 is approx. 1 and n_2 is approx. 0
    -    The max error for distance of V_1 is sqrt(3) u M_a M_d M_d / norm.  Offset=0 at origin
    -    Then minnorm = 1.8 u M_a M_d M_d / qh.ONEmerge
    -    Note that qh.one_merge is approx. 45.5 u M_a and norm is usually about M_d M_d
    -
    -  derivation of 4-d minnorm
    -    same as above except rotate the facet so that V_1 on x-axis and w_2, y_3, w_3=0
    -     [if two vertices fixed on x-axis, can rotate the other two in yzw.]
    -    n_0 = det3_(...) = y_2 det2_(z_1, w_1, z_3, w_3) = - y_2 w_1 z_3
    -     [all other terms contain at least two factors nearly zero.]
    -    The max error for n_0 is sqrt(4) u M_a M_d M_d / norm
    -    Then minnorm = 2 u M_a M_d M_d M_d / qh.ONEmerge
    -    Note that qh.one_merge is approx. 82 u M_a and norm is usually about M_d M_d M_d
    -*/
    -void qh_sethyperplane_det(int dim, coordT **rows, coordT *point0,
    -          boolT toporient, coordT *normal, realT *offset, boolT *nearzero) {
    -  realT maxround, dist;
    -  int i;
    -  pointT *point;
    -
    -
    -  if (dim == 2) {
    -    normal[0]= dY(1,0);
    -    normal[1]= dX(0,1);
    -    qh_normalize2(normal, dim, toporient, NULL, NULL);
    -    *offset= -(point0[0]*normal[0]+point0[1]*normal[1]);
    -    *nearzero= False;  /* since nearzero norm => incident points */
    -  }else if (dim == 3) {
    -    normal[0]= det2_(dY(2,0), dZ(2,0),
    -                     dY(1,0), dZ(1,0));
    -    normal[1]= det2_(dX(1,0), dZ(1,0),
    -                     dX(2,0), dZ(2,0));
    -    normal[2]= det2_(dX(2,0), dY(2,0),
    -                     dX(1,0), dY(1,0));
    -    qh_normalize2(normal, dim, toporient, NULL, NULL);
    -    *offset= -(point0[0]*normal[0] + point0[1]*normal[1]
    -               + point0[2]*normal[2]);
    -    maxround= qh DISTround;
    -    for (i=dim; i--; ) {
    -      point= rows[i];
    -      if (point != point0) {
    -        dist= *offset + (point[0]*normal[0] + point[1]*normal[1]
    -               + point[2]*normal[2]);
    -        if (dist > maxround || dist < -maxround) {
    -          *nearzero= True;
    -          break;
    -        }
    -      }
    -    }
    -  }else if (dim == 4) {
    -    normal[0]= - det3_(dY(2,0), dZ(2,0), dW(2,0),
    -                        dY(1,0), dZ(1,0), dW(1,0),
    -                        dY(3,0), dZ(3,0), dW(3,0));
    -    normal[1]=   det3_(dX(2,0), dZ(2,0), dW(2,0),
    -                        dX(1,0), dZ(1,0), dW(1,0),
    -                        dX(3,0), dZ(3,0), dW(3,0));
    -    normal[2]= - det3_(dX(2,0), dY(2,0), dW(2,0),
    -                        dX(1,0), dY(1,0), dW(1,0),
    -                        dX(3,0), dY(3,0), dW(3,0));
    -    normal[3]=   det3_(dX(2,0), dY(2,0), dZ(2,0),
    -                        dX(1,0), dY(1,0), dZ(1,0),
    -                        dX(3,0), dY(3,0), dZ(3,0));
    -    qh_normalize2(normal, dim, toporient, NULL, NULL);
    -    *offset= -(point0[0]*normal[0] + point0[1]*normal[1]
    -               + point0[2]*normal[2] + point0[3]*normal[3]);
    -    maxround= qh DISTround;
    -    for (i=dim; i--; ) {
    -      point= rows[i];
    -      if (point != point0) {
    -        dist= *offset + (point[0]*normal[0] + point[1]*normal[1]
    -               + point[2]*normal[2] + point[3]*normal[3]);
    -        if (dist > maxround || dist < -maxround) {
    -          *nearzero= True;
    -          break;
    -        }
    -      }
    -    }
    -  }
    -  if (*nearzero) {
    -    zzinc_(Zminnorm);
    -    trace0((qh ferr, 3, "qh_sethyperplane_det: degenerate norm during p%d.\n", qh furthest_id));
    -    zzinc_(Znearlysingular);
    -  }
    -} /* sethyperplane_det */
    -
    -
    -/*---------------------------------
    -
    -  qh_sethyperplane_gauss( dim, rows, point0, toporient, normal, offset, nearzero )
    -    given(dim-1) X dim array of rows[i]= V_{i+1} - V_0 (point0)
    -    set normalized hyperplane equation from oriented simplex
    -
    -  returns:
    -    normal (normalized)
    -    offset (places point0 on the hyperplane)
    -
    -  notes:
    -    if nearzero
    -      orientation may be incorrect because of incorrect sign flips in gausselim
    -    solves [V_n-V_0,...,V_1-V_0, 0 .. 0 1] * N == [0 .. 0 1]
    -        or [V_n-V_0,...,V_1-V_0, 0 .. 0 1] * N == [0]
    -    i.e., N is normal to the hyperplane, and the unnormalized
    -        distance to [0 .. 1] is either 1 or   0
    -
    -  design:
    -    perform gaussian elimination
    -    flip sign for negative values
    -    perform back substitution
    -    normalize result
    -    compute offset
    -*/
    -void qh_sethyperplane_gauss(int dim, coordT **rows, pointT *point0,
    -                boolT toporient, coordT *normal, coordT *offset, boolT *nearzero) {
    -  coordT *pointcoord, *normalcoef;
    -  int k;
    -  boolT sign= toporient, nearzero2= False;
    -
    -  qh_gausselim(rows, dim-1, dim, &sign, nearzero);
    -  for (k=dim-1; k--; ) {
    -    if ((rows[k])[k] < 0)
    -      sign ^= 1;
    -  }
    -  if (*nearzero) {
    -    zzinc_(Znearlysingular);
    -    trace0((qh ferr, 4, "qh_sethyperplane_gauss: nearly singular or axis parallel hyperplane during p%d.\n", qh furthest_id));
    -    qh_backnormal(rows, dim-1, dim, sign, normal, &nearzero2);
    -  }else {
    -    qh_backnormal(rows, dim-1, dim, sign, normal, &nearzero2);
    -    if (nearzero2) {
    -      zzinc_(Znearlysingular);
    -      trace0((qh ferr, 5, "qh_sethyperplane_gauss: singular or axis parallel hyperplane at normalization during p%d.\n", qh furthest_id));
    -    }
    -  }
    -  if (nearzero2)
    -    *nearzero= True;
    -  qh_normalize2(normal, dim, True, NULL, NULL);
    -  pointcoord= point0;
    -  normalcoef= normal;
    -  *offset= -(*pointcoord++ * *normalcoef++);
    -  for (k=dim-1; k--; )
    -    *offset -= *pointcoord++ * *normalcoef++;
    -} /* sethyperplane_gauss */
    -
    -
    -
    diff --git a/src/qhull/src/libqhull/geom.h b/src/qhull/src/libqhull/geom.h
    deleted file mode 100644
    index 16ef48d2d7a..00000000000
    --- a/src/qhull/src/libqhull/geom.h
    +++ /dev/null
    @@ -1,176 +0,0 @@
    -/*
      ---------------------------------
    -
    -  geom.h
    -    header file for geometric routines
    -
    -   see qh-geom.htm and geom.c
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull/geom.h#1 $$Change: 1981 $
    -   $DateTime: 2015/09/28 20:26:32 $$Author: bbarber $
    -*/
    -
    -#ifndef qhDEFgeom
    -#define qhDEFgeom 1
    -
    -#include "libqhull.h"
    -
    -/* ============ -macros- ======================== */
    -
    -/*----------------------------------
    -
    -  fabs_(a)
    -    returns the absolute value of a
    -*/
    -#define fabs_( a ) ((( a ) < 0 ) ? -( a ):( a ))
    -
    -/*----------------------------------
    -
    -  fmax_(a,b)
    -    returns the maximum value of a and b
    -*/
    -#define fmax_( a,b )  ( ( a ) < ( b ) ? ( b ) : ( a ) )
    -
    -/*----------------------------------
    -
    -  fmin_(a,b)
    -    returns the minimum value of a and b
    -*/
    -#define fmin_( a,b )  ( ( a ) > ( b ) ? ( b ) : ( a ) )
    -
    -/*----------------------------------
    -
    -  maximize_(maxval, val)
    -    set maxval to val if val is greater than maxval
    -*/
    -#define maximize_( maxval, val ) { if (( maxval ) < ( val )) ( maxval )= ( val ); }
    -
    -/*----------------------------------
    -
    -  minimize_(minval, val)
    -    set minval to val if val is less than minval
    -*/
    -#define minimize_( minval, val ) { if (( minval ) > ( val )) ( minval )= ( val ); }
    -
    -/*----------------------------------
    -
    -  det2_(a1, a2,
    -        b1, b2)
    -
    -    compute a 2-d determinate
    -*/
    -#define det2_( a1,a2,b1,b2 ) (( a1 )*( b2 ) - ( a2 )*( b1 ))
    -
    -/*----------------------------------
    -
    -  det3_(a1, a2, a3,
    -       b1, b2, b3,
    -       c1, c2, c3)
    -
    -    compute a 3-d determinate
    -*/
    -#define det3_( a1,a2,a3,b1,b2,b3,c1,c2,c3 ) ( ( a1 )*det2_( b2,b3,c2,c3 ) \
    -                - ( b1 )*det2_( a2,a3,c2,c3 ) + ( c1 )*det2_( a2,a3,b2,b3 ) )
    -
    -/*----------------------------------
    -
    -  dX( p1, p2 )
    -  dY( p1, p2 )
    -  dZ( p1, p2 )
    -
    -    given two indices into rows[],
    -
    -    compute the difference between X, Y, or Z coordinates
    -*/
    -#define dX( p1,p2 )  ( *( rows[p1] ) - *( rows[p2] ))
    -#define dY( p1,p2 )  ( *( rows[p1]+1 ) - *( rows[p2]+1 ))
    -#define dZ( p1,p2 )  ( *( rows[p1]+2 ) - *( rows[p2]+2 ))
    -#define dW( p1,p2 )  ( *( rows[p1]+3 ) - *( rows[p2]+3 ))
    -
    -/*============= prototypes in alphabetical order, infrequent at end ======= */
    -
    -void    qh_backnormal(realT **rows, int numrow, int numcol, boolT sign, coordT *normal, boolT *nearzero);
    -void    qh_distplane(pointT *point, facetT *facet, realT *dist);
    -facetT *qh_findbest(pointT *point, facetT *startfacet,
    -                     boolT bestoutside, boolT isnewfacets, boolT noupper,
    -                     realT *dist, boolT *isoutside, int *numpart);
    -facetT *qh_findbesthorizon(boolT ischeckmax, pointT *point,
    -                     facetT *startfacet, boolT noupper, realT *bestdist, int *numpart);
    -facetT *qh_findbestnew(pointT *point, facetT *startfacet, realT *dist,
    -                     boolT bestoutside, boolT *isoutside, int *numpart);
    -void    qh_gausselim(realT **rows, int numrow, int numcol, boolT *sign, boolT *nearzero);
    -realT   qh_getangle(pointT *vect1, pointT *vect2);
    -pointT *qh_getcenter(setT *vertices);
    -pointT *qh_getcentrum(facetT *facet);
    -realT   qh_getdistance(facetT *facet, facetT *neighbor, realT *mindist, realT *maxdist);
    -void    qh_normalize(coordT *normal, int dim, boolT toporient);
    -void    qh_normalize2(coordT *normal, int dim, boolT toporient,
    -            realT *minnorm, boolT *ismin);
    -pointT *qh_projectpoint(pointT *point, facetT *facet, realT dist);
    -
    -void    qh_setfacetplane(facetT *newfacets);
    -void    qh_sethyperplane_det(int dim, coordT **rows, coordT *point0,
    -              boolT toporient, coordT *normal, realT *offset, boolT *nearzero);
    -void    qh_sethyperplane_gauss(int dim, coordT **rows, pointT *point0,
    -             boolT toporient, coordT *normal, coordT *offset, boolT *nearzero);
    -boolT   qh_sharpnewfacets(void);
    -
    -/*========= infrequently used code in geom2.c =============*/
    -
    -coordT *qh_copypoints(coordT *points, int numpoints, int dimension);
    -void    qh_crossproduct(int dim, realT vecA[3], realT vecB[3], realT vecC[3]);
    -realT   qh_determinant(realT **rows, int dim, boolT *nearzero);
    -realT   qh_detjoggle(pointT *points, int numpoints, int dimension);
    -void    qh_detroundoff(void);
    -realT   qh_detsimplex(pointT *apex, setT *points, int dim, boolT *nearzero);
    -realT   qh_distnorm(int dim, pointT *point, pointT *normal, realT *offsetp);
    -realT   qh_distround(int dimension, realT maxabs, realT maxsumabs);
    -realT   qh_divzero(realT numer, realT denom, realT mindenom1, boolT *zerodiv);
    -realT   qh_facetarea(facetT *facet);
    -realT   qh_facetarea_simplex(int dim, coordT *apex, setT *vertices,
    -          vertexT *notvertex,  boolT toporient, coordT *normal, realT *offset);
    -pointT *qh_facetcenter(setT *vertices);
    -facetT *qh_findgooddist(pointT *point, facetT *facetA, realT *distp, facetT **facetlist);
    -void    qh_getarea(facetT *facetlist);
    -boolT   qh_gram_schmidt(int dim, realT **rows);
    -boolT   qh_inthresholds(coordT *normal, realT *angle);
    -void    qh_joggleinput(void);
    -realT  *qh_maxabsval(realT *normal, int dim);
    -setT   *qh_maxmin(pointT *points, int numpoints, int dimension);
    -realT   qh_maxouter(void);
    -void    qh_maxsimplex(int dim, setT *maxpoints, pointT *points, int numpoints, setT **simplex);
    -realT   qh_minabsval(realT *normal, int dim);
    -int     qh_mindiff(realT *vecA, realT *vecB, int dim);
    -boolT   qh_orientoutside(facetT *facet);
    -void    qh_outerinner(facetT *facet, realT *outerplane, realT *innerplane);
    -coordT  qh_pointdist(pointT *point1, pointT *point2, int dim);
    -void    qh_printmatrix(FILE *fp, const char *string, realT **rows, int numrow, int numcol);
    -void    qh_printpoints(FILE *fp, const char *string, setT *points);
    -void    qh_projectinput(void);
    -void    qh_projectpoints(signed char *project, int n, realT *points,
    -             int numpoints, int dim, realT *newpoints, int newdim);
    -void    qh_rotateinput(realT **rows);
    -void    qh_rotatepoints(realT *points, int numpoints, int dim, realT **rows);
    -void    qh_scaleinput(void);
    -void    qh_scalelast(coordT *points, int numpoints, int dim, coordT low,
    -                   coordT high, coordT newhigh);
    -void    qh_scalepoints(pointT *points, int numpoints, int dim,
    -                realT *newlows, realT *newhighs);
    -boolT   qh_sethalfspace(int dim, coordT *coords, coordT **nextp,
    -              coordT *normal, coordT *offset, coordT *feasible);
    -coordT *qh_sethalfspace_all(int dim, int count, coordT *halfspaces, pointT *feasible);
    -pointT *qh_voronoi_center(int dim, setT *points);
    -
    -#endif /* qhDEFgeom */
    -
    -
    -
    diff --git a/src/qhull/src/libqhull/geom2.c b/src/qhull/src/libqhull/geom2.c
    deleted file mode 100644
    index 82ec4936efe..00000000000
    --- a/src/qhull/src/libqhull/geom2.c
    +++ /dev/null
    @@ -1,2094 +0,0 @@
    -/*
      ---------------------------------
    -
    -
    -   geom2.c
    -   infrequently used geometric routines of qhull
    -
    -   see qh-geom.htm and geom.h
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull/geom2.c#6 $$Change: 2065 $
    -   $DateTime: 2016/01/18 13:51:04 $$Author: bbarber $
    -
    -   frequently used code goes into geom.c
    -*/
    -
    -#include "qhull_a.h"
    -
    -/*================== functions in alphabetic order ============*/
    -
    -/*---------------------------------
    -
    -  qh_copypoints( points, numpoints, dimension)
    -    return qh_malloc'd copy of points
    -  notes:
    -    qh_free the returned points to avoid a memory leak
    -*/
    -coordT *qh_copypoints(coordT *points, int numpoints, int dimension) {
    -  int size;
    -  coordT *newpoints;
    -
    -  size= numpoints * dimension * (int)sizeof(coordT);
    -  if (!(newpoints=(coordT*)qh_malloc((size_t)size))) {
    -    qh_fprintf(qh ferr, 6004, "qhull error: insufficient memory to copy %d points\n",
    -        numpoints);
    -    qh_errexit(qh_ERRmem, NULL, NULL);
    -  }
    -  memcpy((char *)newpoints, (char *)points, (size_t)size); /* newpoints!=0 by QH6004 */
    -  return newpoints;
    -} /* copypoints */
    -
    -/*---------------------------------
    -
    -  qh_crossproduct( dim, vecA, vecB, vecC )
    -    crossproduct of 2 dim vectors
    -    C= A x B
    -
    -  notes:
    -    from Glasner, Graphics Gems I, p. 639
    -    only defined for dim==3
    -*/
    -void qh_crossproduct(int dim, realT vecA[3], realT vecB[3], realT vecC[3]){
    -
    -  if (dim == 3) {
    -    vecC[0]=   det2_(vecA[1], vecA[2],
    -                     vecB[1], vecB[2]);
    -    vecC[1]= - det2_(vecA[0], vecA[2],
    -                     vecB[0], vecB[2]);
    -    vecC[2]=   det2_(vecA[0], vecA[1],
    -                     vecB[0], vecB[1]);
    -  }
    -} /* vcross */
    -
    -/*---------------------------------
    -
    -  qh_determinant( rows, dim, nearzero )
    -    compute signed determinant of a square matrix
    -    uses qh.NEARzero to test for degenerate matrices
    -
    -  returns:
    -    determinant
    -    overwrites rows and the matrix
    -    if dim == 2 or 3
    -      nearzero iff determinant < qh NEARzero[dim-1]
    -      (!quite correct, not critical)
    -    if dim >= 4
    -      nearzero iff diagonal[k] < qh NEARzero[k]
    -*/
    -realT qh_determinant(realT **rows, int dim, boolT *nearzero) {
    -  realT det=0;
    -  int i;
    -  boolT sign= False;
    -
    -  *nearzero= False;
    -  if (dim < 2) {
    -    qh_fprintf(qh ferr, 6005, "qhull internal error (qh_determinate): only implemented for dimension >= 2\n");
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }else if (dim == 2) {
    -    det= det2_(rows[0][0], rows[0][1],
    -                 rows[1][0], rows[1][1]);
    -    if (fabs_(det) < 10*qh NEARzero[1])  /* not really correct, what should this be? */
    -      *nearzero= True;
    -  }else if (dim == 3) {
    -    det= det3_(rows[0][0], rows[0][1], rows[0][2],
    -                 rows[1][0], rows[1][1], rows[1][2],
    -                 rows[2][0], rows[2][1], rows[2][2]);
    -    if (fabs_(det) < 10*qh NEARzero[2])  /* what should this be?  det 5.5e-12 was flat for qh_maxsimplex of qdelaunay 0,0 27,27 -36,36 -9,63  */
    -      *nearzero= True;
    -  }else {
    -    qh_gausselim(rows, dim, dim, &sign, nearzero);  /* if nearzero, diagonal still ok*/
    -    det= 1.0;
    -    for (i=dim; i--; )
    -      det *= (rows[i])[i];
    -    if (sign)
    -      det= -det;
    -  }
    -  return det;
    -} /* determinant */
    -
    -/*---------------------------------
    -
    -  qh_detjoggle( points, numpoints, dimension )
    -    determine default max joggle for point array
    -      as qh_distround * qh_JOGGLEdefault
    -
    -  returns:
    -    initial value for JOGGLEmax from points and REALepsilon
    -
    -  notes:
    -    computes DISTround since qh_maxmin not called yet
    -    if qh SCALElast, last dimension will be scaled later to MAXwidth
    -
    -    loop duplicated from qh_maxmin
    -*/
    -realT qh_detjoggle(pointT *points, int numpoints, int dimension) {
    -  realT abscoord, distround, joggle, maxcoord, mincoord;
    -  pointT *point, *pointtemp;
    -  realT maxabs= -REALmax;
    -  realT sumabs= 0;
    -  realT maxwidth= 0;
    -  int k;
    -
    -  for (k=0; k < dimension; k++) {
    -    if (qh SCALElast && k == dimension-1)
    -      abscoord= maxwidth;
    -    else if (qh DELAUNAY && k == dimension-1) /* will qh_setdelaunay() */
    -      abscoord= 2 * maxabs * maxabs;  /* may be low by qh hull_dim/2 */
    -    else {
    -      maxcoord= -REALmax;
    -      mincoord= REALmax;
    -      FORALLpoint_(points, numpoints) {
    -        maximize_(maxcoord, point[k]);
    -        minimize_(mincoord, point[k]);
    -      }
    -      maximize_(maxwidth, maxcoord-mincoord);
    -      abscoord= fmax_(maxcoord, -mincoord);
    -    }
    -    sumabs += abscoord;
    -    maximize_(maxabs, abscoord);
    -  } /* for k */
    -  distround= qh_distround(qh hull_dim, maxabs, sumabs);
    -  joggle= distround * qh_JOGGLEdefault;
    -  maximize_(joggle, REALepsilon * qh_JOGGLEdefault);
    -  trace2((qh ferr, 2001, "qh_detjoggle: joggle=%2.2g maxwidth=%2.2g\n", joggle, maxwidth));
    -  return joggle;
    -} /* detjoggle */
    -
    -/*---------------------------------
    -
    -  qh_detroundoff()
    -    determine maximum roundoff errors from
    -      REALepsilon, REALmax, REALmin, qh.hull_dim, qh.MAXabs_coord,
    -      qh.MAXsumcoord, qh.MAXwidth, qh.MINdenom_1
    -
    -    accounts for qh.SETroundoff, qh.RANDOMdist, qh MERGEexact
    -      qh.premerge_cos, qh.postmerge_cos, qh.premerge_centrum,
    -      qh.postmerge_centrum, qh.MINoutside,
    -      qh_RATIOnearinside, qh_COPLANARratio, qh_WIDEcoplanar
    -
    -  returns:
    -    sets qh.DISTround, etc. (see below)
    -    appends precision constants to qh.qhull_options
    -
    -  see:
    -    qh_maxmin() for qh.NEARzero
    -
    -  design:
    -    determine qh.DISTround for distance computations
    -    determine minimum denominators for qh_divzero
    -    determine qh.ANGLEround for angle computations
    -    adjust qh.premerge_cos,... for roundoff error
    -    determine qh.ONEmerge for maximum error due to a single merge
    -    determine qh.NEARinside, qh.MAXcoplanar, qh.MINvisible,
    -      qh.MINoutside, qh.WIDEfacet
    -    initialize qh.max_vertex and qh.minvertex
    -*/
    -void qh_detroundoff(void) {
    -
    -  qh_option("_max-width", NULL, &qh MAXwidth);
    -  if (!qh SETroundoff) {
    -    qh DISTround= qh_distround(qh hull_dim, qh MAXabs_coord, qh MAXsumcoord);
    -    if (qh RANDOMdist)
    -      qh DISTround += qh RANDOMfactor * qh MAXabs_coord;
    -    qh_option("Error-roundoff", NULL, &qh DISTround);
    -  }
    -  qh MINdenom= qh MINdenom_1 * qh MAXabs_coord;
    -  qh MINdenom_1_2= sqrt(qh MINdenom_1 * qh hull_dim) ;  /* if will be normalized */
    -  qh MINdenom_2= qh MINdenom_1_2 * qh MAXabs_coord;
    -                                              /* for inner product */
    -  qh ANGLEround= 1.01 * qh hull_dim * REALepsilon;
    -  if (qh RANDOMdist)
    -    qh ANGLEround += qh RANDOMfactor;
    -  if (qh premerge_cos < REALmax/2) {
    -    qh premerge_cos -= qh ANGLEround;
    -    if (qh RANDOMdist)
    -      qh_option("Angle-premerge-with-random", NULL, &qh premerge_cos);
    -  }
    -  if (qh postmerge_cos < REALmax/2) {
    -    qh postmerge_cos -= qh ANGLEround;
    -    if (qh RANDOMdist)
    -      qh_option("Angle-postmerge-with-random", NULL, &qh postmerge_cos);
    -  }
    -  qh premerge_centrum += 2 * qh DISTround;    /*2 for centrum and distplane()*/
    -  qh postmerge_centrum += 2 * qh DISTround;
    -  if (qh RANDOMdist && (qh MERGEexact || qh PREmerge))
    -    qh_option("Centrum-premerge-with-random", NULL, &qh premerge_centrum);
    -  if (qh RANDOMdist && qh POSTmerge)
    -    qh_option("Centrum-postmerge-with-random", NULL, &qh postmerge_centrum);
    -  { /* compute ONEmerge, max vertex offset for merging simplicial facets */
    -    realT maxangle= 1.0, maxrho;
    -
    -    minimize_(maxangle, qh premerge_cos);
    -    minimize_(maxangle, qh postmerge_cos);
    -    /* max diameter * sin theta + DISTround for vertex to its hyperplane */
    -    qh ONEmerge= sqrt((realT)qh hull_dim) * qh MAXwidth *
    -      sqrt(1.0 - maxangle * maxangle) + qh DISTround;
    -    maxrho= qh hull_dim * qh premerge_centrum + qh DISTround;
    -    maximize_(qh ONEmerge, maxrho);
    -    maxrho= qh hull_dim * qh postmerge_centrum + qh DISTround;
    -    maximize_(qh ONEmerge, maxrho);
    -    if (qh MERGING)
    -      qh_option("_one-merge", NULL, &qh ONEmerge);
    -  }
    -  qh NEARinside= qh ONEmerge * qh_RATIOnearinside; /* only used if qh KEEPnearinside */
    -  if (qh JOGGLEmax < REALmax/2 && (qh KEEPcoplanar || qh KEEPinside)) {
    -    realT maxdist;             /* adjust qh.NEARinside for joggle */
    -    qh KEEPnearinside= True;
    -    maxdist= sqrt((realT)qh hull_dim) * qh JOGGLEmax + qh DISTround;
    -    maxdist= 2*maxdist;        /* vertex and coplanar point can joggle in opposite directions */
    -    maximize_(qh NEARinside, maxdist);  /* must agree with qh_nearcoplanar() */
    -  }
    -  if (qh KEEPnearinside)
    -    qh_option("_near-inside", NULL, &qh NEARinside);
    -  if (qh JOGGLEmax < qh DISTround) {
    -    qh_fprintf(qh ferr, 6006, "qhull error: the joggle for 'QJn', %.2g, is below roundoff for distance computations, %.2g\n",
    -         qh JOGGLEmax, qh DISTround);
    -    qh_errexit(qh_ERRinput, NULL, NULL);
    -  }
    -  if (qh MINvisible > REALmax/2) {
    -    if (!qh MERGING)
    -      qh MINvisible= qh DISTround;
    -    else if (qh hull_dim <= 3)
    -      qh MINvisible= qh premerge_centrum;
    -    else
    -      qh MINvisible= qh_COPLANARratio * qh premerge_centrum;
    -    if (qh APPROXhull && qh MINvisible > qh MINoutside)
    -      qh MINvisible= qh MINoutside;
    -    qh_option("Visible-distance", NULL, &qh MINvisible);
    -  }
    -  if (qh MAXcoplanar > REALmax/2) {
    -    qh MAXcoplanar= qh MINvisible;
    -    qh_option("U-coplanar-distance", NULL, &qh MAXcoplanar);
    -  }
    -  if (!qh APPROXhull) {             /* user may specify qh MINoutside */
    -    qh MINoutside= 2 * qh MINvisible;
    -    if (qh premerge_cos < REALmax/2)
    -      maximize_(qh MINoutside, (1- qh premerge_cos) * qh MAXabs_coord);
    -    qh_option("Width-outside", NULL, &qh MINoutside);
    -  }
    -  qh WIDEfacet= qh MINoutside;
    -  maximize_(qh WIDEfacet, qh_WIDEcoplanar * qh MAXcoplanar);
    -  maximize_(qh WIDEfacet, qh_WIDEcoplanar * qh MINvisible);
    -  qh_option("_wide-facet", NULL, &qh WIDEfacet);
    -  if (qh MINvisible > qh MINoutside + 3 * REALepsilon
    -  && !qh BESToutside && !qh FORCEoutput)
    -    qh_fprintf(qh ferr, 7001, "qhull input warning: minimum visibility V%.2g is greater than \nminimum outside W%.2g.  Flipped facets are likely.\n",
    -             qh MINvisible, qh MINoutside);
    -  qh max_vertex= qh DISTround;
    -  qh min_vertex= -qh DISTround;
    -  /* numeric constants reported in printsummary */
    -} /* detroundoff */
    -
    -/*---------------------------------
    -
    -  qh_detsimplex( apex, points, dim, nearzero )
    -    compute determinant of a simplex with point apex and base points
    -
    -  returns:
    -     signed determinant and nearzero from qh_determinant
    -
    -  notes:
    -     uses qh.gm_matrix/qh.gm_row (assumes they're big enough)
    -
    -  design:
    -    construct qm_matrix by subtracting apex from points
    -    compute determinate
    -*/
    -realT qh_detsimplex(pointT *apex, setT *points, int dim, boolT *nearzero) {
    -  pointT *coorda, *coordp, *gmcoord, *point, **pointp;
    -  coordT **rows;
    -  int k,  i=0;
    -  realT det;
    -
    -  zinc_(Zdetsimplex);
    -  gmcoord= qh gm_matrix;
    -  rows= qh gm_row;
    -  FOREACHpoint_(points) {
    -    if (i == dim)
    -      break;
    -    rows[i++]= gmcoord;
    -    coordp= point;
    -    coorda= apex;
    -    for (k=dim; k--; )
    -      *(gmcoord++)= *coordp++ - *coorda++;
    -  }
    -  if (i < dim) {
    -    qh_fprintf(qh ferr, 6007, "qhull internal error (qh_detsimplex): #points %d < dimension %d\n",
    -               i, dim);
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -  det= qh_determinant(rows, dim, nearzero);
    -  trace2((qh ferr, 2002, "qh_detsimplex: det=%2.2g for point p%d, dim %d, nearzero? %d\n",
    -          det, qh_pointid(apex), dim, *nearzero));
    -  return det;
    -} /* detsimplex */
    -
    -/*---------------------------------
    -
    -  qh_distnorm( dim, point, normal, offset )
    -    return distance from point to hyperplane at normal/offset
    -
    -  returns:
    -    dist
    -
    -  notes:
    -    dist > 0 if point is outside of hyperplane
    -
    -  see:
    -    qh_distplane in geom.c
    -*/
    -realT qh_distnorm(int dim, pointT *point, pointT *normal, realT *offsetp) {
    -  coordT *normalp= normal, *coordp= point;
    -  realT dist;
    -  int k;
    -
    -  dist= *offsetp;
    -  for (k=dim; k--; )
    -    dist += *(coordp++) * *(normalp++);
    -  return dist;
    -} /* distnorm */
    -
    -/*---------------------------------
    -
    -  qh_distround(dimension, maxabs, maxsumabs )
    -    compute maximum round-off error for a distance computation
    -      to a normalized hyperplane
    -    maxabs is the maximum absolute value of a coordinate
    -    maxsumabs is the maximum possible sum of absolute coordinate values
    -
    -  returns:
    -    max dist round for REALepsilon
    -
    -  notes:
    -    calculate roundoff error according to Golub & van Loan, 1983, Lemma 3.2-1, "Rounding Errors"
    -    use sqrt(dim) since one vector is normalized
    -      or use maxsumabs since one vector is < 1
    -*/
    -realT qh_distround(int dimension, realT maxabs, realT maxsumabs) {
    -  realT maxdistsum, maxround;
    -
    -  maxdistsum= sqrt((realT)dimension) * maxabs;
    -  minimize_( maxdistsum, maxsumabs);
    -  maxround= REALepsilon * (dimension * maxdistsum * 1.01 + maxabs);
    -              /* adds maxabs for offset */
    -  trace4((qh ferr, 4008, "qh_distround: %2.2g maxabs %2.2g maxsumabs %2.2g maxdistsum %2.2g\n",
    -                 maxround, maxabs, maxsumabs, maxdistsum));
    -  return maxround;
    -} /* distround */
    -
    -/*---------------------------------
    -
    -  qh_divzero( numer, denom, mindenom1, zerodiv )
    -    divide by a number that's nearly zero
    -    mindenom1= minimum denominator for dividing into 1.0
    -
    -  returns:
    -    quotient
    -    sets zerodiv and returns 0.0 if it would overflow
    -
    -  design:
    -    if numer is nearly zero and abs(numer) < abs(denom)
    -      return numer/denom
    -    else if numer is nearly zero
    -      return 0 and zerodiv
    -    else if denom/numer non-zero
    -      return numer/denom
    -    else
    -      return 0 and zerodiv
    -*/
    -realT qh_divzero(realT numer, realT denom, realT mindenom1, boolT *zerodiv) {
    -  realT temp, numerx, denomx;
    -
    -
    -  if (numer < mindenom1 && numer > -mindenom1) {
    -    numerx= fabs_(numer);
    -    denomx= fabs_(denom);
    -    if (numerx < denomx) {
    -      *zerodiv= False;
    -      return numer/denom;
    -    }else {
    -      *zerodiv= True;
    -      return 0.0;
    -    }
    -  }
    -  temp= denom/numer;
    -  if (temp > mindenom1 || temp < -mindenom1) {
    -    *zerodiv= False;
    -    return numer/denom;
    -  }else {
    -    *zerodiv= True;
    -    return 0.0;
    -  }
    -} /* divzero */
    -
    -
    -/*---------------------------------
    -
    -  qh_facetarea( facet )
    -    return area for a facet
    -
    -  notes:
    -    if non-simplicial,
    -      uses centrum to triangulate facet and sums the projected areas.
    -    if (qh DELAUNAY),
    -      computes projected area instead for last coordinate
    -    assumes facet->normal exists
    -    projecting tricoplanar facets to the hyperplane does not appear to make a difference
    -
    -  design:
    -    if simplicial
    -      compute area
    -    else
    -      for each ridge
    -        compute area from centrum to ridge
    -    negate area if upper Delaunay facet
    -*/
    -realT qh_facetarea(facetT *facet) {
    -  vertexT *apex;
    -  pointT *centrum;
    -  realT area= 0.0;
    -  ridgeT *ridge, **ridgep;
    -
    -  if (facet->simplicial) {
    -    apex= SETfirstt_(facet->vertices, vertexT);
    -    area= qh_facetarea_simplex(qh hull_dim, apex->point, facet->vertices,
    -                    apex, facet->toporient, facet->normal, &facet->offset);
    -  }else {
    -    if (qh CENTERtype == qh_AScentrum)
    -      centrum= facet->center;
    -    else
    -      centrum= qh_getcentrum(facet);
    -    FOREACHridge_(facet->ridges)
    -      area += qh_facetarea_simplex(qh hull_dim, centrum, ridge->vertices,
    -                 NULL, (boolT)(ridge->top == facet),  facet->normal, &facet->offset);
    -    if (qh CENTERtype != qh_AScentrum)
    -      qh_memfree(centrum, qh normal_size);
    -  }
    -  if (facet->upperdelaunay && qh DELAUNAY)
    -    area= -area;  /* the normal should be [0,...,1] */
    -  trace4((qh ferr, 4009, "qh_facetarea: f%d area %2.2g\n", facet->id, area));
    -  return area;
    -} /* facetarea */
    -
    -/*---------------------------------
    -
    -  qh_facetarea_simplex( dim, apex, vertices, notvertex, toporient, normal, offset )
    -    return area for a simplex defined by
    -      an apex, a base of vertices, an orientation, and a unit normal
    -    if simplicial or tricoplanar facet,
    -      notvertex is defined and it is skipped in vertices
    -
    -  returns:
    -    computes area of simplex projected to plane [normal,offset]
    -    returns 0 if vertex too far below plane (qh WIDEfacet)
    -      vertex can't be apex of tricoplanar facet
    -
    -  notes:
    -    if (qh DELAUNAY),
    -      computes projected area instead for last coordinate
    -    uses qh gm_matrix/gm_row and qh hull_dim
    -    helper function for qh_facetarea
    -
    -  design:
    -    if Notvertex
    -      translate simplex to apex
    -    else
    -      project simplex to normal/offset
    -      translate simplex to apex
    -    if Delaunay
    -      set last row/column to 0 with -1 on diagonal
    -    else
    -      set last row to Normal
    -    compute determinate
    -    scale and flip sign for area
    -*/
    -realT qh_facetarea_simplex(int dim, coordT *apex, setT *vertices,
    -        vertexT *notvertex,  boolT toporient, coordT *normal, realT *offset) {
    -  pointT *coorda, *coordp, *gmcoord;
    -  coordT **rows, *normalp;
    -  int k,  i=0;
    -  realT area, dist;
    -  vertexT *vertex, **vertexp;
    -  boolT nearzero;
    -
    -  gmcoord= qh gm_matrix;
    -  rows= qh gm_row;
    -  FOREACHvertex_(vertices) {
    -    if (vertex == notvertex)
    -      continue;
    -    rows[i++]= gmcoord;
    -    coorda= apex;
    -    coordp= vertex->point;
    -    normalp= normal;
    -    if (notvertex) {
    -      for (k=dim; k--; )
    -        *(gmcoord++)= *coordp++ - *coorda++;
    -    }else {
    -      dist= *offset;
    -      for (k=dim; k--; )
    -        dist += *coordp++ * *normalp++;
    -      if (dist < -qh WIDEfacet) {
    -        zinc_(Znoarea);
    -        return 0.0;
    -      }
    -      coordp= vertex->point;
    -      normalp= normal;
    -      for (k=dim; k--; )
    -        *(gmcoord++)= (*coordp++ - dist * *normalp++) - *coorda++;
    -    }
    -  }
    -  if (i != dim-1) {
    -    qh_fprintf(qh ferr, 6008, "qhull internal error (qh_facetarea_simplex): #points %d != dim %d -1\n",
    -               i, dim);
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -  rows[i]= gmcoord;
    -  if (qh DELAUNAY) {
    -    for (i=0; i < dim-1; i++)
    -      rows[i][dim-1]= 0.0;
    -    for (k=dim; k--; )
    -      *(gmcoord++)= 0.0;
    -    rows[dim-1][dim-1]= -1.0;
    -  }else {
    -    normalp= normal;
    -    for (k=dim; k--; )
    -      *(gmcoord++)= *normalp++;
    -  }
    -  zinc_(Zdetsimplex);
    -  area= qh_determinant(rows, dim, &nearzero);
    -  if (toporient)
    -    area= -area;
    -  area *= qh AREAfactor;
    -  trace4((qh ferr, 4010, "qh_facetarea_simplex: area=%2.2g for point p%d, toporient %d, nearzero? %d\n",
    -          area, qh_pointid(apex), toporient, nearzero));
    -  return area;
    -} /* facetarea_simplex */
    -
    -/*---------------------------------
    -
    -  qh_facetcenter( vertices )
    -    return Voronoi center (Voronoi vertex) for a facet's vertices
    -
    -  returns:
    -    return temporary point equal to the center
    -
    -  see:
    -    qh_voronoi_center()
    -*/
    -pointT *qh_facetcenter(setT *vertices) {
    -  setT *points= qh_settemp(qh_setsize(vertices));
    -  vertexT *vertex, **vertexp;
    -  pointT *center;
    -
    -  FOREACHvertex_(vertices)
    -    qh_setappend(&points, vertex->point);
    -  center= qh_voronoi_center(qh hull_dim-1, points);
    -  qh_settempfree(&points);
    -  return center;
    -} /* facetcenter */
    -
    -/*---------------------------------
    -
    -  qh_findgooddist( point, facetA, dist, facetlist )
    -    find best good facet visible for point from facetA
    -    assumes facetA is visible from point
    -
    -  returns:
    -    best facet, i.e., good facet that is furthest from point
    -      distance to best facet
    -      NULL if none
    -
    -    moves good, visible facets (and some other visible facets)
    -      to end of qh facet_list
    -
    -  notes:
    -    uses qh visit_id
    -
    -  design:
    -    initialize bestfacet if facetA is good
    -    move facetA to end of facetlist
    -    for each facet on facetlist
    -      for each unvisited neighbor of facet
    -        move visible neighbors to end of facetlist
    -        update best good neighbor
    -        if no good neighbors, update best facet
    -*/
    -facetT *qh_findgooddist(pointT *point, facetT *facetA, realT *distp,
    -               facetT **facetlist) {
    -  realT bestdist= -REALmax, dist;
    -  facetT *neighbor, **neighborp, *bestfacet=NULL, *facet;
    -  boolT goodseen= False;
    -
    -  if (facetA->good) {
    -    zzinc_(Zcheckpart);  /* calls from check_bestdist occur after print stats */
    -    qh_distplane(point, facetA, &bestdist);
    -    bestfacet= facetA;
    -    goodseen= True;
    -  }
    -  qh_removefacet(facetA);
    -  qh_appendfacet(facetA);
    -  *facetlist= facetA;
    -  facetA->visitid= ++qh visit_id;
    -  FORALLfacet_(*facetlist) {
    -    FOREACHneighbor_(facet) {
    -      if (neighbor->visitid == qh visit_id)
    -        continue;
    -      neighbor->visitid= qh visit_id;
    -      if (goodseen && !neighbor->good)
    -        continue;
    -      zzinc_(Zcheckpart);
    -      qh_distplane(point, neighbor, &dist);
    -      if (dist > 0) {
    -        qh_removefacet(neighbor);
    -        qh_appendfacet(neighbor);
    -        if (neighbor->good) {
    -          goodseen= True;
    -          if (dist > bestdist) {
    -            bestdist= dist;
    -            bestfacet= neighbor;
    -          }
    -        }
    -      }
    -    }
    -  }
    -  if (bestfacet) {
    -    *distp= bestdist;
    -    trace2((qh ferr, 2003, "qh_findgooddist: p%d is %2.2g above good facet f%d\n",
    -      qh_pointid(point), bestdist, bestfacet->id));
    -    return bestfacet;
    -  }
    -  trace4((qh ferr, 4011, "qh_findgooddist: no good facet for p%d above f%d\n",
    -      qh_pointid(point), facetA->id));
    -  return NULL;
    -}  /* findgooddist */
    -
    -/*---------------------------------
    -
    -  qh_getarea( facetlist )
    -    set area of all facets in facetlist
    -    collect statistics
    -    nop if hasAreaVolume
    -
    -  returns:
    -    sets qh totarea/totvol to total area and volume of convex hull
    -    for Delaunay triangulation, computes projected area of the lower or upper hull
    -      ignores upper hull if qh ATinfinity
    -
    -  notes:
    -    could compute outer volume by expanding facet area by rays from interior
    -    the following attempt at perpendicular projection underestimated badly:
    -      qh.totoutvol += (-dist + facet->maxoutside + qh DISTround)
    -                            * area/ qh hull_dim;
    -  design:
    -    for each facet on facetlist
    -      compute facet->area
    -      update qh.totarea and qh.totvol
    -*/
    -void qh_getarea(facetT *facetlist) {
    -  realT area;
    -  realT dist;
    -  facetT *facet;
    -
    -  if (qh hasAreaVolume)
    -    return;
    -  if (qh REPORTfreq)
    -    qh_fprintf(qh ferr, 8020, "computing area of each facet and volume of the convex hull\n");
    -  else
    -    trace1((qh ferr, 1001, "qh_getarea: computing volume and area for each facet\n"));
    -  qh totarea= qh totvol= 0.0;
    -  FORALLfacet_(facetlist) {
    -    if (!facet->normal)
    -      continue;
    -    if (facet->upperdelaunay && qh ATinfinity)
    -      continue;
    -    if (!facet->isarea) {
    -      facet->f.area= qh_facetarea(facet);
    -      facet->isarea= True;
    -    }
    -    area= facet->f.area;
    -    if (qh DELAUNAY) {
    -      if (facet->upperdelaunay == qh UPPERdelaunay)
    -        qh totarea += area;
    -    }else {
    -      qh totarea += area;
    -      qh_distplane(qh interior_point, facet, &dist);
    -      qh totvol += -dist * area/ qh hull_dim;
    -    }
    -    if (qh PRINTstatistics) {
    -      wadd_(Wareatot, area);
    -      wmax_(Wareamax, area);
    -      wmin_(Wareamin, area);
    -    }
    -  }
    -  qh hasAreaVolume= True;
    -} /* getarea */
    -
    -/*---------------------------------
    -
    -  qh_gram_schmidt( dim, row )
    -    implements Gram-Schmidt orthogonalization by rows
    -
    -  returns:
    -    false if zero norm
    -    overwrites rows[dim][dim]
    -
    -  notes:
    -    see Golub & van Loan, 1983, Algorithm 6.2-2, "Modified Gram-Schmidt"
    -    overflow due to small divisors not handled
    -
    -  design:
    -    for each row
    -      compute norm for row
    -      if non-zero, normalize row
    -      for each remaining rowA
    -        compute inner product of row and rowA
    -        reduce rowA by row * inner product
    -*/
    -boolT qh_gram_schmidt(int dim, realT **row) {
    -  realT *rowi, *rowj, norm;
    -  int i, j, k;
    -
    -  for (i=0; i < dim; i++) {
    -    rowi= row[i];
    -    for (norm= 0.0, k= dim; k--; rowi++)
    -      norm += *rowi * *rowi;
    -    norm= sqrt(norm);
    -    wmin_(Wmindenom, norm);
    -    if (norm == 0.0)  /* either 0 or overflow due to sqrt */
    -      return False;
    -    for (k=dim; k--; )
    -      *(--rowi) /= norm;
    -    for (j=i+1; j < dim; j++) {
    -      rowj= row[j];
    -      for (norm= 0.0, k=dim; k--; )
    -        norm += *rowi++ * *rowj++;
    -      for (k=dim; k--; )
    -        *(--rowj) -= *(--rowi) * norm;
    -    }
    -  }
    -  return True;
    -} /* gram_schmidt */
    -
    -
    -/*---------------------------------
    -
    -  qh_inthresholds( normal, angle )
    -    return True if normal within qh.lower_/upper_threshold
    -
    -  returns:
    -    estimate of angle by summing of threshold diffs
    -      angle may be NULL
    -      smaller "angle" is better
    -
    -  notes:
    -    invalid if qh.SPLITthresholds
    -
    -  see:
    -    qh.lower_threshold in qh_initbuild()
    -    qh_initthresholds()
    -
    -  design:
    -    for each dimension
    -      test threshold
    -*/
    -boolT qh_inthresholds(coordT *normal, realT *angle) {
    -  boolT within= True;
    -  int k;
    -  realT threshold;
    -
    -  if (angle)
    -    *angle= 0.0;
    -  for (k=0; k < qh hull_dim; k++) {
    -    threshold= qh lower_threshold[k];
    -    if (threshold > -REALmax/2) {
    -      if (normal[k] < threshold)
    -        within= False;
    -      if (angle) {
    -        threshold -= normal[k];
    -        *angle += fabs_(threshold);
    -      }
    -    }
    -    if (qh upper_threshold[k] < REALmax/2) {
    -      threshold= qh upper_threshold[k];
    -      if (normal[k] > threshold)
    -        within= False;
    -      if (angle) {
    -        threshold -= normal[k];
    -        *angle += fabs_(threshold);
    -      }
    -    }
    -  }
    -  return within;
    -} /* inthresholds */
    -
    -
    -/*---------------------------------
    -
    -  qh_joggleinput()
    -    randomly joggle input to Qhull by qh.JOGGLEmax
    -    initial input is qh.first_point/qh.num_points of qh.hull_dim
    -      repeated calls use qh.input_points/qh.num_points
    -
    -  returns:
    -    joggles points at qh.first_point/qh.num_points
    -    copies data to qh.input_points/qh.input_malloc if first time
    -    determines qh.JOGGLEmax if it was zero
    -    if qh.DELAUNAY
    -      computes the Delaunay projection of the joggled points
    -
    -  notes:
    -    if qh.DELAUNAY, unnecessarily joggles the last coordinate
    -    the initial 'QJn' may be set larger than qh_JOGGLEmaxincrease
    -
    -  design:
    -    if qh.DELAUNAY
    -      set qh.SCALElast for reduced precision errors
    -    if first call
    -      initialize qh.input_points to the original input points
    -      if qh.JOGGLEmax == 0
    -        determine default qh.JOGGLEmax
    -    else
    -      increase qh.JOGGLEmax according to qh.build_cnt
    -    joggle the input by adding a random number in [-qh.JOGGLEmax,qh.JOGGLEmax]
    -    if qh.DELAUNAY
    -      sets the Delaunay projection
    -*/
    -void qh_joggleinput(void) {
    -  int i, seed, size;
    -  coordT *coordp, *inputp;
    -  realT randr, randa, randb;
    -
    -  if (!qh input_points) { /* first call */
    -    qh input_points= qh first_point;
    -    qh input_malloc= qh POINTSmalloc;
    -    size= qh num_points * qh hull_dim * sizeof(coordT);
    -    if (!(qh first_point=(coordT*)qh_malloc((size_t)size))) {
    -      qh_fprintf(qh ferr, 6009, "qhull error: insufficient memory to joggle %d points\n",
    -          qh num_points);
    -      qh_errexit(qh_ERRmem, NULL, NULL);
    -    }
    -    qh POINTSmalloc= True;
    -    if (qh JOGGLEmax == 0.0) {
    -      qh JOGGLEmax= qh_detjoggle(qh input_points, qh num_points, qh hull_dim);
    -      qh_option("QJoggle", NULL, &qh JOGGLEmax);
    -    }
    -  }else {                 /* repeated call */
    -    if (!qh RERUN && qh build_cnt > qh_JOGGLEretry) {
    -      if (((qh build_cnt-qh_JOGGLEretry-1) % qh_JOGGLEagain) == 0) {
    -        realT maxjoggle= qh MAXwidth * qh_JOGGLEmaxincrease;
    -        if (qh JOGGLEmax < maxjoggle) {
    -          qh JOGGLEmax *= qh_JOGGLEincrease;
    -          minimize_(qh JOGGLEmax, maxjoggle);
    -        }
    -      }
    -    }
    -    qh_option("QJoggle", NULL, &qh JOGGLEmax);
    -  }
    -  if (qh build_cnt > 1 && qh JOGGLEmax > fmax_(qh MAXwidth/4, 0.1)) {
    -      qh_fprintf(qh ferr, 6010, "qhull error: the current joggle for 'QJn', %.2g, is too large for the width\nof the input.  If possible, recompile Qhull with higher-precision reals.\n",
    -                qh JOGGLEmax);
    -      qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -  /* for some reason, using qh ROTATErandom and qh_RANDOMseed does not repeat the run. Use 'TRn' instead */
    -  seed= qh_RANDOMint;
    -  qh_option("_joggle-seed", &seed, NULL);
    -  trace0((qh ferr, 6, "qh_joggleinput: joggle input by %2.2g with seed %d\n",
    -    qh JOGGLEmax, seed));
    -  inputp= qh input_points;
    -  coordp= qh first_point;
    -  randa= 2.0 * qh JOGGLEmax/qh_RANDOMmax;
    -  randb= -qh JOGGLEmax;
    -  size= qh num_points * qh hull_dim;
    -  for (i=size; i--; ) {
    -    randr= qh_RANDOMint;
    -    *(coordp++)= *(inputp++) + (randr * randa + randb);
    -  }
    -  if (qh DELAUNAY) {
    -    qh last_low= qh last_high= qh last_newhigh= REALmax;
    -    qh_setdelaunay(qh hull_dim, qh num_points, qh first_point);
    -  }
    -} /* joggleinput */
    -
    -/*---------------------------------
    -
    -  qh_maxabsval( normal, dim )
    -    return pointer to maximum absolute value of a dim vector
    -    returns NULL if dim=0
    -*/
    -realT *qh_maxabsval(realT *normal, int dim) {
    -  realT maxval= -REALmax;
    -  realT *maxp= NULL, *colp, absval;
    -  int k;
    -
    -  for (k=dim, colp= normal; k--; colp++) {
    -    absval= fabs_(*colp);
    -    if (absval > maxval) {
    -      maxval= absval;
    -      maxp= colp;
    -    }
    -  }
    -  return maxp;
    -} /* maxabsval */
    -
    -
    -/*---------------------------------
    -
    -  qh_maxmin( points, numpoints, dimension )
    -    return max/min points for each dimension
    -    determine max and min coordinates
    -
    -  returns:
    -    returns a temporary set of max and min points
    -      may include duplicate points. Does not include qh.GOODpoint
    -    sets qh.NEARzero, qh.MAXabs_coord, qh.MAXsumcoord, qh.MAXwidth
    -         qh.MAXlastcoord, qh.MINlastcoord
    -    initializes qh.max_outside, qh.min_vertex, qh.WAScoplanar, qh.ZEROall_ok
    -
    -  notes:
    -    loop duplicated in qh_detjoggle()
    -
    -  design:
    -    initialize global precision variables
    -    checks definition of REAL...
    -    for each dimension
    -      for each point
    -        collect maximum and minimum point
    -      collect maximum of maximums and minimum of minimums
    -      determine qh.NEARzero for Gaussian Elimination
    -*/
    -setT *qh_maxmin(pointT *points, int numpoints, int dimension) {
    -  int k;
    -  realT maxcoord, temp;
    -  pointT *minimum, *maximum, *point, *pointtemp;
    -  setT *set;
    -
    -  qh max_outside= 0.0;
    -  qh MAXabs_coord= 0.0;
    -  qh MAXwidth= -REALmax;
    -  qh MAXsumcoord= 0.0;
    -  qh min_vertex= 0.0;
    -  qh WAScoplanar= False;
    -  if (qh ZEROcentrum)
    -    qh ZEROall_ok= True;
    -  if (REALmin < REALepsilon && REALmin < REALmax && REALmin > -REALmax
    -  && REALmax > 0.0 && -REALmax < 0.0)
    -    ; /* all ok */
    -  else {
    -    qh_fprintf(qh ferr, 6011, "qhull error: floating point constants in user.h are wrong\n\
    -REALepsilon %g REALmin %g REALmax %g -REALmax %g\n",
    -             REALepsilon, REALmin, REALmax, -REALmax);
    -    qh_errexit(qh_ERRinput, NULL, NULL);
    -  }
    -  set= qh_settemp(2*dimension);
    -  for (k=0; k < dimension; k++) {
    -    if (points == qh GOODpointp)
    -      minimum= maximum= points + dimension;
    -    else
    -      minimum= maximum= points;
    -    FORALLpoint_(points, numpoints) {
    -      if (point == qh GOODpointp)
    -        continue;
    -      if (maximum[k] < point[k])
    -        maximum= point;
    -      else if (minimum[k] > point[k])
    -        minimum= point;
    -    }
    -    if (k == dimension-1) {
    -      qh MINlastcoord= minimum[k];
    -      qh MAXlastcoord= maximum[k];
    -    }
    -    if (qh SCALElast && k == dimension-1)
    -      maxcoord= qh MAXwidth;
    -    else {
    -      maxcoord= fmax_(maximum[k], -minimum[k]);
    -      if (qh GOODpointp) {
    -        temp= fmax_(qh GOODpointp[k], -qh GOODpointp[k]);
    -        maximize_(maxcoord, temp);
    -      }
    -      temp= maximum[k] - minimum[k];
    -      maximize_(qh MAXwidth, temp);
    -    }
    -    maximize_(qh MAXabs_coord, maxcoord);
    -    qh MAXsumcoord += maxcoord;
    -    qh_setappend(&set, maximum);
    -    qh_setappend(&set, minimum);
    -    /* calculation of qh NEARzero is based on Golub & van Loan, 1983,
    -       Eq. 4.4-13 for "Gaussian elimination with complete pivoting".
    -       Golub & van Loan say that n^3 can be ignored and 10 be used in
    -       place of rho */
    -    qh NEARzero[k]= 80 * qh MAXsumcoord * REALepsilon;
    -  }
    -  if (qh IStracing >=1)
    -    qh_printpoints(qh ferr, "qh_maxmin: found the max and min points(by dim):", set);
    -  return(set);
    -} /* maxmin */
    -
    -/*---------------------------------
    -
    -  qh_maxouter()
    -    return maximum distance from facet to outer plane
    -    normally this is qh.max_outside+qh.DISTround
    -    does not include qh.JOGGLEmax
    -
    -  see:
    -    qh_outerinner()
    -
    -  notes:
    -    need to add another qh.DISTround if testing actual point with computation
    -
    -  for joggle:
    -    qh_setfacetplane() updated qh.max_outer for Wnewvertexmax (max distance to vertex)
    -    need to use Wnewvertexmax since could have a coplanar point for a high
    -      facet that is replaced by a low facet
    -    need to add qh.JOGGLEmax if testing input points
    -*/
    -realT qh_maxouter(void) {
    -  realT dist;
    -
    -  dist= fmax_(qh max_outside, qh DISTround);
    -  dist += qh DISTround;
    -  trace4((qh ferr, 4012, "qh_maxouter: max distance from facet to outer plane is %2.2g max_outside is %2.2g\n", dist, qh max_outside));
    -  return dist;
    -} /* maxouter */
    -
    -/*---------------------------------
    -
    -  qh_maxsimplex( dim, maxpoints, points, numpoints, simplex )
    -    determines maximum simplex for a set of points
    -    starts from points already in simplex
    -    skips qh.GOODpointp (assumes that it isn't in maxpoints)
    -
    -  returns:
    -    simplex with dim+1 points
    -
    -  notes:
    -    assumes at least pointsneeded points in points
    -    maximizes determinate for x,y,z,w, etc.
    -    uses maxpoints as long as determinate is clearly non-zero
    -
    -  design:
    -    initialize simplex with at least two points
    -      (find points with max or min x coordinate)
    -    for each remaining dimension
    -      add point that maximizes the determinate
    -        (use points from maxpoints first)
    -*/
    -void qh_maxsimplex(int dim, setT *maxpoints, pointT *points, int numpoints, setT **simplex) {
    -  pointT *point, **pointp, *pointtemp, *maxpoint, *minx=NULL, *maxx=NULL;
    -  boolT nearzero, maxnearzero= False;
    -  int k, sizinit;
    -  realT maxdet= -REALmax, det, mincoord= REALmax, maxcoord= -REALmax;
    -
    -  sizinit= qh_setsize(*simplex);
    -  if (sizinit < 2) {
    -    if (qh_setsize(maxpoints) >= 2) {
    -      FOREACHpoint_(maxpoints) {
    -        if (maxcoord < point[0]) {
    -          maxcoord= point[0];
    -          maxx= point;
    -        }
    -        if (mincoord > point[0]) {
    -          mincoord= point[0];
    -          minx= point;
    -        }
    -      }
    -    }else {
    -      FORALLpoint_(points, numpoints) {
    -        if (point == qh GOODpointp)
    -          continue;
    -        if (maxcoord < point[0]) {
    -          maxcoord= point[0];
    -          maxx= point;
    -        }
    -        if (mincoord > point[0]) {
    -          mincoord= point[0];
    -          minx= point;
    -        }
    -      }
    -    }
    -    qh_setunique(simplex, minx);
    -    if (qh_setsize(*simplex) < 2)
    -      qh_setunique(simplex, maxx);
    -    sizinit= qh_setsize(*simplex);
    -    if (sizinit < 2) {
    -      qh_precision("input has same x coordinate");
    -      if (zzval_(Zsetplane) > qh hull_dim+1) {
    -        qh_fprintf(qh ferr, 6012, "qhull precision error (qh_maxsimplex for voronoi_center):\n%d points with the same x coordinate.\n",
    -                 qh_setsize(maxpoints)+numpoints);
    -        qh_errexit(qh_ERRprec, NULL, NULL);
    -      }else {
    -        qh_fprintf(qh ferr, 6013, "qhull input error: input is less than %d-dimensional since it has the same x coordinate\n", qh hull_dim);
    -        qh_errexit(qh_ERRinput, NULL, NULL);
    -      }
    -    }
    -  }
    -  for (k=sizinit; k < dim+1; k++) {
    -    maxpoint= NULL;
    -    maxdet= -REALmax;
    -    FOREACHpoint_(maxpoints) {
    -      if (!qh_setin(*simplex, point)) {
    -        det= qh_detsimplex(point, *simplex, k, &nearzero);
    -        if ((det= fabs_(det)) > maxdet) {
    -          maxdet= det;
    -          maxpoint= point;
    -          maxnearzero= nearzero;
    -        }
    -      }
    -    }
    -    if (!maxpoint || maxnearzero) {
    -      zinc_(Zsearchpoints);
    -      if (!maxpoint) {
    -        trace0((qh ferr, 7, "qh_maxsimplex: searching all points for %d-th initial vertex.\n", k+1));
    -      }else {
    -        trace0((qh ferr, 8, "qh_maxsimplex: searching all points for %d-th initial vertex, better than p%d det %2.2g\n",
    -                k+1, qh_pointid(maxpoint), maxdet));
    -      }
    -      FORALLpoint_(points, numpoints) {
    -        if (point == qh GOODpointp)
    -          continue;
    -        if (!qh_setin(*simplex, point)) {
    -          det= qh_detsimplex(point, *simplex, k, &nearzero);
    -          if ((det= fabs_(det)) > maxdet) {
    -            maxdet= det;
    -            maxpoint= point;
    -            maxnearzero= nearzero;
    -          }
    -        }
    -      }
    -    } /* !maxpoint */
    -    if (!maxpoint) {
    -      qh_fprintf(qh ferr, 6014, "qhull internal error (qh_maxsimplex): not enough points available\n");
    -      qh_errexit(qh_ERRqhull, NULL, NULL);
    -    }
    -    qh_setappend(simplex, maxpoint);
    -    trace1((qh ferr, 1002, "qh_maxsimplex: selected point p%d for %d`th initial vertex, det=%2.2g\n",
    -            qh_pointid(maxpoint), k+1, maxdet));
    -  } /* k */
    -} /* maxsimplex */
    -
    -/*---------------------------------
    -
    -  qh_minabsval( normal, dim )
    -    return minimum absolute value of a dim vector
    -*/
    -realT qh_minabsval(realT *normal, int dim) {
    -  realT minval= 0;
    -  realT maxval= 0;
    -  realT *colp;
    -  int k;
    -
    -  for (k=dim, colp=normal; k--; colp++) {
    -    maximize_(maxval, *colp);
    -    minimize_(minval, *colp);
    -  }
    -  return fmax_(maxval, -minval);
    -} /* minabsval */
    -
    -
    -/*---------------------------------
    -
    -  qh_mindif( vecA, vecB, dim )
    -    return index of min abs. difference of two vectors
    -*/
    -int qh_mindiff(realT *vecA, realT *vecB, int dim) {
    -  realT mindiff= REALmax, diff;
    -  realT *vecAp= vecA, *vecBp= vecB;
    -  int k, mink= 0;
    -
    -  for (k=0; k < dim; k++) {
    -    diff= *vecAp++ - *vecBp++;
    -    diff= fabs_(diff);
    -    if (diff < mindiff) {
    -      mindiff= diff;
    -      mink= k;
    -    }
    -  }
    -  return mink;
    -} /* mindiff */
    -
    -
    -
    -/*---------------------------------
    -
    -  qh_orientoutside( facet  )
    -    make facet outside oriented via qh.interior_point
    -
    -  returns:
    -    True if facet reversed orientation.
    -*/
    -boolT qh_orientoutside(facetT *facet) {
    -  int k;
    -  realT dist;
    -
    -  qh_distplane(qh interior_point, facet, &dist);
    -  if (dist > 0) {
    -    for (k=qh hull_dim; k--; )
    -      facet->normal[k]= -facet->normal[k];
    -    facet->offset= -facet->offset;
    -    return True;
    -  }
    -  return False;
    -} /* orientoutside */
    -
    -/*---------------------------------
    -
    -  qh_outerinner( facet, outerplane, innerplane  )
    -    if facet and qh.maxoutdone (i.e., qh_check_maxout)
    -      returns outer and inner plane for facet
    -    else
    -      returns maximum outer and inner plane
    -    accounts for qh.JOGGLEmax
    -
    -  see:
    -    qh_maxouter(), qh_check_bestdist(), qh_check_points()
    -
    -  notes:
    -    outerplaner or innerplane may be NULL
    -    facet is const
    -    Does not error (QhullFacet)
    -
    -    includes qh.DISTround for actual points
    -    adds another qh.DISTround if testing with floating point arithmetic
    -*/
    -void qh_outerinner(facetT *facet, realT *outerplane, realT *innerplane) {
    -  realT dist, mindist;
    -  vertexT *vertex, **vertexp;
    -
    -  if (outerplane) {
    -    if (!qh_MAXoutside || !facet || !qh maxoutdone) {
    -      *outerplane= qh_maxouter();       /* includes qh.DISTround */
    -    }else { /* qh_MAXoutside ... */
    -#if qh_MAXoutside
    -      *outerplane= facet->maxoutside + qh DISTround;
    -#endif
    -
    -    }
    -    if (qh JOGGLEmax < REALmax/2)
    -      *outerplane += qh JOGGLEmax * sqrt((realT)qh hull_dim);
    -  }
    -  if (innerplane) {
    -    if (facet) {
    -      mindist= REALmax;
    -      FOREACHvertex_(facet->vertices) {
    -        zinc_(Zdistio);
    -        qh_distplane(vertex->point, facet, &dist);
    -        minimize_(mindist, dist);
    -      }
    -      *innerplane= mindist - qh DISTround;
    -    }else
    -      *innerplane= qh min_vertex - qh DISTround;
    -    if (qh JOGGLEmax < REALmax/2)
    -      *innerplane -= qh JOGGLEmax * sqrt((realT)qh hull_dim);
    -  }
    -} /* outerinner */
    -
    -/*---------------------------------
    -
    -  qh_pointdist( point1, point2, dim )
    -    return distance between two points
    -
    -  notes:
    -    returns distance squared if 'dim' is negative
    -*/
    -coordT qh_pointdist(pointT *point1, pointT *point2, int dim) {
    -  coordT dist, diff;
    -  int k;
    -
    -  dist= 0.0;
    -  for (k= (dim > 0 ? dim : -dim); k--; ) {
    -    diff= *point1++ - *point2++;
    -    dist += diff * diff;
    -  }
    -  if (dim > 0)
    -    return(sqrt(dist));
    -  return dist;
    -} /* pointdist */
    -
    -
    -/*---------------------------------
    -
    -  qh_printmatrix( fp, string, rows, numrow, numcol )
    -    print matrix to fp given by row vectors
    -    print string as header
    -
    -  notes:
    -    print a vector by qh_printmatrix(fp, "", &vect, 1, len)
    -*/
    -void qh_printmatrix(FILE *fp, const char *string, realT **rows, int numrow, int numcol) {
    -  realT *rowp;
    -  realT r; /*bug fix*/
    -  int i,k;
    -
    -  qh_fprintf(fp, 9001, "%s\n", string);
    -  for (i=0; i < numrow; i++) {
    -    rowp= rows[i];
    -    for (k=0; k < numcol; k++) {
    -      r= *rowp++;
    -      qh_fprintf(fp, 9002, "%6.3g ", r);
    -    }
    -    qh_fprintf(fp, 9003, "\n");
    -  }
    -} /* printmatrix */
    -
    -
    -/*---------------------------------
    -
    -  qh_printpoints( fp, string, points )
    -    print pointids to fp for a set of points
    -    if string, prints string and 'p' point ids
    -*/
    -void qh_printpoints(FILE *fp, const char *string, setT *points) {
    -  pointT *point, **pointp;
    -
    -  if (string) {
    -    qh_fprintf(fp, 9004, "%s", string);
    -    FOREACHpoint_(points)
    -      qh_fprintf(fp, 9005, " p%d", qh_pointid(point));
    -    qh_fprintf(fp, 9006, "\n");
    -  }else {
    -    FOREACHpoint_(points)
    -      qh_fprintf(fp, 9007, " %d", qh_pointid(point));
    -    qh_fprintf(fp, 9008, "\n");
    -  }
    -} /* printpoints */
    -
    -
    -/*---------------------------------
    -
    -  qh_projectinput()
    -    project input points using qh.lower_bound/upper_bound and qh DELAUNAY
    -    if qh.lower_bound[k]=qh.upper_bound[k]= 0,
    -      removes dimension k
    -    if halfspace intersection
    -      removes dimension k from qh.feasible_point
    -    input points in qh first_point, num_points, input_dim
    -
    -  returns:
    -    new point array in qh first_point of qh hull_dim coordinates
    -    sets qh POINTSmalloc
    -    if qh DELAUNAY
    -      projects points to paraboloid
    -      lowbound/highbound is also projected
    -    if qh ATinfinity
    -      adds point "at-infinity"
    -    if qh POINTSmalloc
    -      frees old point array
    -
    -  notes:
    -    checks that qh.hull_dim agrees with qh.input_dim, PROJECTinput, and DELAUNAY
    -
    -
    -  design:
    -    sets project[k] to -1 (delete), 0 (keep), 1 (add for Delaunay)
    -    determines newdim and newnum for qh hull_dim and qh num_points
    -    projects points to newpoints
    -    projects qh.lower_bound to itself
    -    projects qh.upper_bound to itself
    -    if qh DELAUNAY
    -      if qh ATINFINITY
    -        projects points to paraboloid
    -        computes "infinity" point as vertex average and 10% above all points
    -      else
    -        uses qh_setdelaunay to project points to paraboloid
    -*/
    -void qh_projectinput(void) {
    -  int k,i;
    -  int newdim= qh input_dim, newnum= qh num_points;
    -  signed char *project;
    -  int projectsize= (qh input_dim+1)*sizeof(*project);
    -  pointT *newpoints, *coord, *infinity;
    -  realT paraboloid, maxboloid= 0;
    -
    -  project= (signed char*)qh_memalloc(projectsize);
    -  memset((char*)project, 0, (size_t)projectsize);
    -  for (k=0; k < qh input_dim; k++) {   /* skip Delaunay bound */
    -    if (qh lower_bound[k] == 0 && qh upper_bound[k] == 0) {
    -      project[k]= -1;
    -      newdim--;
    -    }
    -  }
    -  if (qh DELAUNAY) {
    -    project[k]= 1;
    -    newdim++;
    -    if (qh ATinfinity)
    -      newnum++;
    -  }
    -  if (newdim != qh hull_dim) {
    -    qh_memfree(project, projectsize);
    -    qh_fprintf(qh ferr, 6015, "qhull internal error (qh_projectinput): dimension after projection %d != hull_dim %d\n", newdim, qh hull_dim);
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -  if (!(newpoints= qh temp_malloc= (coordT*)qh_malloc(newnum*newdim*sizeof(coordT)))){
    -    qh_memfree(project, projectsize);
    -    qh_fprintf(qh ferr, 6016, "qhull error: insufficient memory to project %d points\n",
    -           qh num_points);
    -    qh_errexit(qh_ERRmem, NULL, NULL);
    -  }
    -  /* qh_projectpoints throws error if mismatched dimensions */
    -  qh_projectpoints(project, qh input_dim+1, qh first_point,
    -                    qh num_points, qh input_dim, newpoints, newdim);
    -  trace1((qh ferr, 1003, "qh_projectinput: updating lower and upper_bound\n"));
    -  qh_projectpoints(project, qh input_dim+1, qh lower_bound,
    -                    1, qh input_dim+1, qh lower_bound, newdim+1);
    -  qh_projectpoints(project, qh input_dim+1, qh upper_bound,
    -                    1, qh input_dim+1, qh upper_bound, newdim+1);
    -  if (qh HALFspace) {
    -    if (!qh feasible_point) {
    -      qh_memfree(project, projectsize);
    -      qh_fprintf(qh ferr, 6017, "qhull internal error (qh_projectinput): HALFspace defined without qh.feasible_point\n");
    -      qh_errexit(qh_ERRqhull, NULL, NULL);
    -    }
    -    qh_projectpoints(project, qh input_dim, qh feasible_point,
    -                      1, qh input_dim, qh feasible_point, newdim);
    -  }
    -  qh_memfree(project, projectsize);
    -  if (qh POINTSmalloc)
    -    qh_free(qh first_point);
    -  qh first_point= newpoints;
    -  qh POINTSmalloc= True;
    -  qh temp_malloc= NULL;
    -  if (qh DELAUNAY && qh ATinfinity) {
    -    coord= qh first_point;
    -    infinity= qh first_point + qh hull_dim * qh num_points;
    -    for (k=qh hull_dim-1; k--; )
    -      infinity[k]= 0.0;
    -    for (i=qh num_points; i--; ) {
    -      paraboloid= 0.0;
    -      for (k=0; k < qh hull_dim-1; k++) {
    -        paraboloid += *coord * *coord;
    -        infinity[k] += *coord;
    -        coord++;
    -      }
    -      *(coord++)= paraboloid;
    -      maximize_(maxboloid, paraboloid);
    -    }
    -    /* coord == infinity */
    -    for (k=qh hull_dim-1; k--; )
    -      *(coord++) /= qh num_points;
    -    *(coord++)= maxboloid * 1.1;
    -    qh num_points++;
    -    trace0((qh ferr, 9, "qh_projectinput: projected points to paraboloid for Delaunay\n"));
    -  }else if (qh DELAUNAY)  /* !qh ATinfinity */
    -    qh_setdelaunay( qh hull_dim, qh num_points, qh first_point);
    -} /* projectinput */
    -
    -
    -/*---------------------------------
    -
    -  qh_projectpoints( project, n, points, numpoints, dim, newpoints, newdim )
    -    project points/numpoints/dim to newpoints/newdim
    -    if project[k] == -1
    -      delete dimension k
    -    if project[k] == 1
    -      add dimension k by duplicating previous column
    -    n is size of project
    -
    -  notes:
    -    newpoints may be points if only adding dimension at end
    -
    -  design:
    -    check that 'project' and 'newdim' agree
    -    for each dimension
    -      if project == -1
    -        skip dimension
    -      else
    -        determine start of column in newpoints
    -        determine start of column in points
    -          if project == +1, duplicate previous column
    -        copy dimension (column) from points to newpoints
    -*/
    -void qh_projectpoints(signed char *project, int n, realT *points,
    -        int numpoints, int dim, realT *newpoints, int newdim) {
    -  int testdim= dim, oldk=0, newk=0, i,j=0,k;
    -  realT *newp, *oldp;
    -
    -  for (k=0; k < n; k++)
    -    testdim += project[k];
    -  if (testdim != newdim) {
    -    qh_fprintf(qh ferr, 6018, "qhull internal error (qh_projectpoints): newdim %d should be %d after projection\n",
    -      newdim, testdim);
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -  for (j=0; j= dim)
    -          continue;
    -        oldp= points+oldk;
    -      }else
    -        oldp= points+oldk++;
    -      for (i=numpoints; i--; ) {
    -        *newp= *oldp;
    -        newp += newdim;
    -        oldp += dim;
    -      }
    -    }
    -    if (oldk >= dim)
    -      break;
    -  }
    -  trace1((qh ferr, 1004, "qh_projectpoints: projected %d points from dim %d to dim %d\n",
    -    numpoints, dim, newdim));
    -} /* projectpoints */
    -
    -
    -/*---------------------------------
    -
    -  qh_rotateinput( rows )
    -    rotate input using row matrix
    -    input points given by qh first_point, num_points, hull_dim
    -    assumes rows[dim] is a scratch buffer
    -    if qh POINTSmalloc, overwrites input points, else mallocs a new array
    -
    -  returns:
    -    rotated input
    -    sets qh POINTSmalloc
    -
    -  design:
    -    see qh_rotatepoints
    -*/
    -void qh_rotateinput(realT **rows) {
    -
    -  if (!qh POINTSmalloc) {
    -    qh first_point= qh_copypoints(qh first_point, qh num_points, qh hull_dim);
    -    qh POINTSmalloc= True;
    -  }
    -  qh_rotatepoints(qh first_point, qh num_points, qh hull_dim, rows);
    -}  /* rotateinput */
    -
    -/*---------------------------------
    -
    -  qh_rotatepoints( points, numpoints, dim, row )
    -    rotate numpoints points by a d-dim row matrix
    -    assumes rows[dim] is a scratch buffer
    -
    -  returns:
    -    rotated points in place
    -
    -  design:
    -    for each point
    -      for each coordinate
    -        use row[dim] to compute partial inner product
    -      for each coordinate
    -        rotate by partial inner product
    -*/
    -void qh_rotatepoints(realT *points, int numpoints, int dim, realT **row) {
    -  realT *point, *rowi, *coord= NULL, sum, *newval;
    -  int i,j,k;
    -
    -  if (qh IStracing >= 1)
    -    qh_printmatrix(qh ferr, "qh_rotatepoints: rotate points by", row, dim, dim);
    -  for (point= points, j= numpoints; j--; point += dim) {
    -    newval= row[dim];
    -    for (i=0; i < dim; i++) {
    -      rowi= row[i];
    -      coord= point;
    -      for (sum= 0.0, k= dim; k--; )
    -        sum += *rowi++ * *coord++;
    -      *(newval++)= sum;
    -    }
    -    for (k=dim; k--; )
    -      *(--coord)= *(--newval);
    -  }
    -} /* rotatepoints */
    -
    -
    -/*---------------------------------
    -
    -  qh_scaleinput()
    -    scale input points using qh low_bound/high_bound
    -    input points given by qh first_point, num_points, hull_dim
    -    if qh POINTSmalloc, overwrites input points, else mallocs a new array
    -
    -  returns:
    -    scales coordinates of points to low_bound[k], high_bound[k]
    -    sets qh POINTSmalloc
    -
    -  design:
    -    see qh_scalepoints
    -*/
    -void qh_scaleinput(void) {
    -
    -  if (!qh POINTSmalloc) {
    -    qh first_point= qh_copypoints(qh first_point, qh num_points, qh hull_dim);
    -    qh POINTSmalloc= True;
    -  }
    -  qh_scalepoints(qh first_point, qh num_points, qh hull_dim,
    -       qh lower_bound, qh upper_bound);
    -}  /* scaleinput */
    -
    -/*---------------------------------
    -
    -  qh_scalelast( points, numpoints, dim, low, high, newhigh )
    -    scale last coordinate to [0,m] for Delaunay triangulations
    -    input points given by points, numpoints, dim
    -
    -  returns:
    -    changes scale of last coordinate from [low, high] to [0, newhigh]
    -    overwrites last coordinate of each point
    -    saves low/high/newhigh in qh.last_low, etc. for qh_setdelaunay()
    -
    -  notes:
    -    when called by qh_setdelaunay, low/high may not match actual data
    -
    -  design:
    -    compute scale and shift factors
    -    apply to last coordinate of each point
    -*/
    -void qh_scalelast(coordT *points, int numpoints, int dim, coordT low,
    -                   coordT high, coordT newhigh) {
    -  realT scale, shift;
    -  coordT *coord;
    -  int i;
    -  boolT nearzero= False;
    -
    -  trace4((qh ferr, 4013, "qh_scalelast: scale last coordinate from [%2.2g, %2.2g] to [0,%2.2g]\n",
    -    low, high, newhigh));
    -  qh last_low= low;
    -  qh last_high= high;
    -  qh last_newhigh= newhigh;
    -  scale= qh_divzero(newhigh, high - low,
    -                  qh MINdenom_1, &nearzero);
    -  if (nearzero) {
    -    if (qh DELAUNAY)
    -      qh_fprintf(qh ferr, 6019, "qhull input error: can not scale last coordinate.  Input is cocircular\n   or cospherical.   Use option 'Qz' to add a point at infinity.\n");
    -    else
    -      qh_fprintf(qh ferr, 6020, "qhull input error: can not scale last coordinate.  New bounds [0, %2.2g] are too wide for\nexisting bounds [%2.2g, %2.2g] (width %2.2g)\n",
    -                newhigh, low, high, high-low);
    -    qh_errexit(qh_ERRinput, NULL, NULL);
    -  }
    -  shift= - low * newhigh / (high-low);
    -  coord= points + dim - 1;
    -  for (i=numpoints; i--; coord += dim)
    -    *coord= *coord * scale + shift;
    -} /* scalelast */
    -
    -/*---------------------------------
    -
    -  qh_scalepoints( points, numpoints, dim, newlows, newhighs )
    -    scale points to new lowbound and highbound
    -    retains old bound when newlow= -REALmax or newhigh= +REALmax
    -
    -  returns:
    -    scaled points
    -    overwrites old points
    -
    -  design:
    -    for each coordinate
    -      compute current low and high bound
    -      compute scale and shift factors
    -      scale all points
    -      enforce new low and high bound for all points
    -*/
    -void qh_scalepoints(pointT *points, int numpoints, int dim,
    -        realT *newlows, realT *newhighs) {
    -  int i,k;
    -  realT shift, scale, *coord, low, high, newlow, newhigh, mincoord, maxcoord;
    -  boolT nearzero= False;
    -
    -  for (k=0; k < dim; k++) {
    -    newhigh= newhighs[k];
    -    newlow= newlows[k];
    -    if (newhigh > REALmax/2 && newlow < -REALmax/2)
    -      continue;
    -    low= REALmax;
    -    high= -REALmax;
    -    for (i=numpoints, coord=points+k; i--; coord += dim) {
    -      minimize_(low, *coord);
    -      maximize_(high, *coord);
    -    }
    -    if (newhigh > REALmax/2)
    -      newhigh= high;
    -    if (newlow < -REALmax/2)
    -      newlow= low;
    -    if (qh DELAUNAY && k == dim-1 && newhigh < newlow) {
    -      qh_fprintf(qh ferr, 6021, "qhull input error: 'Qb%d' or 'QB%d' inverts paraboloid since high bound %.2g < low bound %.2g\n",
    -               k, k, newhigh, newlow);
    -      qh_errexit(qh_ERRinput, NULL, NULL);
    -    }
    -    scale= qh_divzero(newhigh - newlow, high - low,
    -                  qh MINdenom_1, &nearzero);
    -    if (nearzero) {
    -      qh_fprintf(qh ferr, 6022, "qhull input error: %d'th dimension's new bounds [%2.2g, %2.2g] too wide for\nexisting bounds [%2.2g, %2.2g]\n",
    -              k, newlow, newhigh, low, high);
    -      qh_errexit(qh_ERRinput, NULL, NULL);
    -    }
    -    shift= (newlow * high - low * newhigh)/(high-low);
    -    coord= points+k;
    -    for (i=numpoints; i--; coord += dim)
    -      *coord= *coord * scale + shift;
    -    coord= points+k;
    -    if (newlow < newhigh) {
    -      mincoord= newlow;
    -      maxcoord= newhigh;
    -    }else {
    -      mincoord= newhigh;
    -      maxcoord= newlow;
    -    }
    -    for (i=numpoints; i--; coord += dim) {
    -      minimize_(*coord, maxcoord);  /* because of roundoff error */
    -      maximize_(*coord, mincoord);
    -    }
    -    trace0((qh ferr, 10, "qh_scalepoints: scaled %d'th coordinate [%2.2g, %2.2g] to [%.2g, %.2g] for %d points by %2.2g and shifted %2.2g\n",
    -      k, low, high, newlow, newhigh, numpoints, scale, shift));
    -  }
    -} /* scalepoints */
    -
    -
    -/*---------------------------------
    -
    -  qh_setdelaunay( dim, count, points )
    -    project count points to dim-d paraboloid for Delaunay triangulation
    -
    -    dim is one more than the dimension of the input set
    -    assumes dim is at least 3 (i.e., at least a 2-d Delaunay triangulation)
    -
    -    points is a dim*count realT array.  The first dim-1 coordinates
    -    are the coordinates of the first input point.  array[dim] is
    -    the first coordinate of the second input point.  array[2*dim] is
    -    the first coordinate of the third input point.
    -
    -    if qh.last_low defined (i.e., 'Qbb' called qh_scalelast)
    -      calls qh_scalelast to scale the last coordinate the same as the other points
    -
    -  returns:
    -    for each point
    -      sets point[dim-1] to sum of squares of coordinates
    -    scale points to 'Qbb' if needed
    -
    -  notes:
    -    to project one point, use
    -      qh_setdelaunay(qh hull_dim, 1, point)
    -
    -    Do not use options 'Qbk', 'QBk', or 'QbB' since they scale
    -    the coordinates after the original projection.
    -
    -*/
    -void qh_setdelaunay(int dim, int count, pointT *points) {
    -  int i, k;
    -  coordT *coordp, coord;
    -  realT paraboloid;
    -
    -  trace0((qh ferr, 11, "qh_setdelaunay: project %d points to paraboloid for Delaunay triangulation\n", count));
    -  coordp= points;
    -  for (i=0; i < count; i++) {
    -    coord= *coordp++;
    -    paraboloid= coord*coord;
    -    for (k=dim-2; k--; ) {
    -      coord= *coordp++;
    -      paraboloid += coord*coord;
    -    }
    -    *coordp++ = paraboloid;
    -  }
    -  if (qh last_low < REALmax/2)
    -    qh_scalelast(points, count, dim, qh last_low, qh last_high, qh last_newhigh);
    -} /* setdelaunay */
    -
    -
    -/*---------------------------------
    -
    -  qh_sethalfspace( dim, coords, nextp, normal, offset, feasible )
    -    set point to dual of halfspace relative to feasible point
    -    halfspace is normal coefficients and offset.
    -
    -  returns:
    -    false and prints error if feasible point is outside of hull
    -    overwrites coordinates for point at dim coords
    -    nextp= next point (coords)
    -    does not call qh_errexit
    -
    -  design:
    -    compute distance from feasible point to halfspace
    -    divide each normal coefficient by -dist
    -*/
    -boolT qh_sethalfspace(int dim, coordT *coords, coordT **nextp,
    -         coordT *normal, coordT *offset, coordT *feasible) {
    -  coordT *normp= normal, *feasiblep= feasible, *coordp= coords;
    -  realT dist;
    -  realT r; /*bug fix*/
    -  int k;
    -  boolT zerodiv;
    -
    -  dist= *offset;
    -  for (k=dim; k--; )
    -    dist += *(normp++) * *(feasiblep++);
    -  if (dist > 0)
    -    goto LABELerroroutside;
    -  normp= normal;
    -  if (dist < -qh MINdenom) {
    -    for (k=dim; k--; )
    -      *(coordp++)= *(normp++) / -dist;
    -  }else {
    -    for (k=dim; k--; ) {
    -      *(coordp++)= qh_divzero(*(normp++), -dist, qh MINdenom_1, &zerodiv);
    -      if (zerodiv)
    -        goto LABELerroroutside;
    -    }
    -  }
    -  *nextp= coordp;
    -  if (qh IStracing >= 4) {
    -    qh_fprintf(qh ferr, 8021, "qh_sethalfspace: halfspace at offset %6.2g to point: ", *offset);
    -    for (k=dim, coordp=coords; k--; ) {
    -      r= *coordp++;
    -      qh_fprintf(qh ferr, 8022, " %6.2g", r);
    -    }
    -    qh_fprintf(qh ferr, 8023, "\n");
    -  }
    -  return True;
    -LABELerroroutside:
    -  feasiblep= feasible;
    -  normp= normal;
    -  qh_fprintf(qh ferr, 6023, "qhull input error: feasible point is not clearly inside halfspace\nfeasible point: ");
    -  for (k=dim; k--; )
    -    qh_fprintf(qh ferr, 8024, qh_REAL_1, r=*(feasiblep++));
    -  qh_fprintf(qh ferr, 8025, "\n     halfspace: ");
    -  for (k=dim; k--; )
    -    qh_fprintf(qh ferr, 8026, qh_REAL_1, r=*(normp++));
    -  qh_fprintf(qh ferr, 8027, "\n     at offset: ");
    -  qh_fprintf(qh ferr, 8028, qh_REAL_1, *offset);
    -  qh_fprintf(qh ferr, 8029, " and distance: ");
    -  qh_fprintf(qh ferr, 8030, qh_REAL_1, dist);
    -  qh_fprintf(qh ferr, 8031, "\n");
    -  return False;
    -} /* sethalfspace */
    -
    -/*---------------------------------
    -
    -  qh_sethalfspace_all( dim, count, halfspaces, feasible )
    -    generate dual for halfspace intersection with feasible point
    -    array of count halfspaces
    -      each halfspace is normal coefficients followed by offset
    -      the origin is inside the halfspace if the offset is negative
    -    feasible is a point inside all halfspaces (http://www.qhull.org/html/qhalf.htm#notes)
    -
    -  returns:
    -    malloc'd array of count X dim-1 points
    -
    -  notes:
    -    call before qh_init_B or qh_initqhull_globals
    -    free memory when done
    -    unused/untested code: please email bradb@shore.net if this works ok for you
    -    if using option 'Fp', qh->feasible_point must be set (e.g., to 'feasible')
    -    qh->feasible_point is a malloc'd array that is freed by qh_freebuffers.
    -
    -  design:
    -    see qh_sethalfspace
    -*/
    -coordT *qh_sethalfspace_all(int dim, int count, coordT *halfspaces, pointT *feasible) {
    -  int i, newdim;
    -  pointT *newpoints;
    -  coordT *coordp, *normalp, *offsetp;
    -
    -  trace0((qh ferr, 12, "qh_sethalfspace_all: compute dual for halfspace intersection\n"));
    -  newdim= dim - 1;
    -  if (!(newpoints=(coordT*)qh_malloc(count*newdim*sizeof(coordT)))){
    -    qh_fprintf(qh ferr, 6024, "qhull error: insufficient memory to compute dual of %d halfspaces\n",
    -          count);
    -    qh_errexit(qh_ERRmem, NULL, NULL);
    -  }
    -  coordp= newpoints;
    -  normalp= halfspaces;
    -  for (i=0; i < count; i++) {
    -    offsetp= normalp + newdim;
    -    if (!qh_sethalfspace(newdim, coordp, &coordp, normalp, offsetp, feasible)) {
    -      qh_free(newpoints);  /* feasible is not inside halfspace as reported by qh_sethalfspace */
    -      qh_fprintf(qh ferr, 8032, "The halfspace was at index %d\n", i);
    -      qh_errexit(qh_ERRinput, NULL, NULL);
    -    }
    -    normalp= offsetp + 1;
    -  }
    -  return newpoints;
    -} /* sethalfspace_all */
    -
    -
    -/*---------------------------------
    -
    -  qh_sharpnewfacets()
    -
    -  returns:
    -    true if could be an acute angle (facets in different quadrants)
    -
    -  notes:
    -    for qh_findbest
    -
    -  design:
    -    for all facets on qh.newfacet_list
    -      if two facets are in different quadrants
    -        set issharp
    -*/
    -boolT qh_sharpnewfacets(void) {
    -  facetT *facet;
    -  boolT issharp = False;
    -  int *quadrant, k;
    -
    -  quadrant= (int*)qh_memalloc(qh hull_dim * sizeof(int));
    -  FORALLfacet_(qh newfacet_list) {
    -    if (facet == qh newfacet_list) {
    -      for (k=qh hull_dim; k--; )
    -        quadrant[ k]= (facet->normal[ k] > 0);
    -    }else {
    -      for (k=qh hull_dim; k--; ) {
    -        if (quadrant[ k] != (facet->normal[ k] > 0)) {
    -          issharp= True;
    -          break;
    -        }
    -      }
    -    }
    -    if (issharp)
    -      break;
    -  }
    -  qh_memfree( quadrant, qh hull_dim * sizeof(int));
    -  trace3((qh ferr, 3001, "qh_sharpnewfacets: %d\n", issharp));
    -  return issharp;
    -} /* sharpnewfacets */
    -
    -/*---------------------------------
    -
    -  qh_voronoi_center( dim, points )
    -    return Voronoi center for a set of points
    -    dim is the orginal dimension of the points
    -    gh.gm_matrix/qh.gm_row are scratch buffers
    -
    -  returns:
    -    center as a temporary point (qh_memalloc)
    -    if non-simplicial,
    -      returns center for max simplex of points
    -
    -  notes:
    -    only called by qh_facetcenter
    -    from Bowyer & Woodwark, A Programmer's Geometry, 1983, p. 65
    -
    -  design:
    -    if non-simplicial
    -      determine max simplex for points
    -    translate point0 of simplex to origin
    -    compute sum of squares of diagonal
    -    compute determinate
    -    compute Voronoi center (see Bowyer & Woodwark)
    -*/
    -pointT *qh_voronoi_center(int dim, setT *points) {
    -  pointT *point, **pointp, *point0;
    -  pointT *center= (pointT*)qh_memalloc(qh center_size);
    -  setT *simplex;
    -  int i, j, k, size= qh_setsize(points);
    -  coordT *gmcoord;
    -  realT *diffp, sum2, *sum2row, *sum2p, det, factor;
    -  boolT nearzero, infinite;
    -
    -  if (size == dim+1)
    -    simplex= points;
    -  else if (size < dim+1) {
    -    qh_memfree(center, qh center_size);
    -    qh_fprintf(qh ferr, 6025, "qhull internal error (qh_voronoi_center):\n  need at least %d points to construct a Voronoi center\n",
    -             dim+1);
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -    simplex= points;  /* never executed -- avoids warning */
    -  }else {
    -    simplex= qh_settemp(dim+1);
    -    qh_maxsimplex(dim, points, NULL, 0, &simplex);
    -  }
    -  point0= SETfirstt_(simplex, pointT);
    -  gmcoord= qh gm_matrix;
    -  for (k=0; k < dim; k++) {
    -    qh gm_row[k]= gmcoord;
    -    FOREACHpoint_(simplex) {
    -      if (point != point0)
    -        *(gmcoord++)= point[k] - point0[k];
    -    }
    -  }
    -  sum2row= gmcoord;
    -  for (i=0; i < dim; i++) {
    -    sum2= 0.0;
    -    for (k=0; k < dim; k++) {
    -      diffp= qh gm_row[k] + i;
    -      sum2 += *diffp * *diffp;
    -    }
    -    *(gmcoord++)= sum2;
    -  }
    -  det= qh_determinant(qh gm_row, dim, &nearzero);
    -  factor= qh_divzero(0.5, det, qh MINdenom, &infinite);
    -  if (infinite) {
    -    for (k=dim; k--; )
    -      center[k]= qh_INFINITE;
    -    if (qh IStracing)
    -      qh_printpoints(qh ferr, "qh_voronoi_center: at infinity for ", simplex);
    -  }else {
    -    for (i=0; i < dim; i++) {
    -      gmcoord= qh gm_matrix;
    -      sum2p= sum2row;
    -      for (k=0; k < dim; k++) {
    -        qh gm_row[k]= gmcoord;
    -        if (k == i) {
    -          for (j=dim; j--; )
    -            *(gmcoord++)= *sum2p++;
    -        }else {
    -          FOREACHpoint_(simplex) {
    -            if (point != point0)
    -              *(gmcoord++)= point[k] - point0[k];
    -          }
    -        }
    -      }
    -      center[i]= qh_determinant(qh gm_row, dim, &nearzero)*factor + point0[i];
    -    }
    -#ifndef qh_NOtrace
    -    if (qh IStracing >= 3) {
    -      qh_fprintf(qh ferr, 8033, "qh_voronoi_center: det %2.2g factor %2.2g ", det, factor);
    -      qh_printmatrix(qh ferr, "center:", ¢er, 1, dim);
    -      if (qh IStracing >= 5) {
    -        qh_printpoints(qh ferr, "points", simplex);
    -        FOREACHpoint_(simplex)
    -          qh_fprintf(qh ferr, 8034, "p%d dist %.2g, ", qh_pointid(point),
    -                   qh_pointdist(point, center, dim));
    -        qh_fprintf(qh ferr, 8035, "\n");
    -      }
    -    }
    -#endif
    -  }
    -  if (simplex != points)
    -    qh_settempfree(&simplex);
    -  return center;
    -} /* voronoi_center */
    -
    diff --git a/src/qhull/src/libqhull/global.c b/src/qhull/src/libqhull/global.c
    deleted file mode 100644
    index 0328fea7b91..00000000000
    --- a/src/qhull/src/libqhull/global.c
    +++ /dev/null
    @@ -1,2217 +0,0 @@
    -
    -/*
      ---------------------------------
    -
    -   global.c
    -   initializes all the globals of the qhull application
    -
    -   see README
    -
    -   see libqhull.h for qh.globals and function prototypes
    -
    -   see qhull_a.h for internal functions
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull/global.c#17 $$Change: 2066 $
    -   $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    - */
    -
    -#include "qhull_a.h"
    -
    -/*========= qh definition -- globals defined in libqhull.h =======================*/
    -
    -#if qh_QHpointer
    -qhT *qh_qh= NULL;       /* pointer to all global variables */
    -#else
    -qhT qh_qh;              /* all global variables.
    -                           Add "= {0}" if this causes a compiler error.
    -                           Also qh_qhstat in stat.c and qhmem in mem.c.  */
    -#endif
    -
    -/*----------------------------------
    -
    -  qh_version
    -    version string by year and date
    -    qh_version2 for Unix users and -V
    -
    -    the revision increases on code changes only
    -
    -  notes:
    -    change date:    Changes.txt, Announce.txt, index.htm, README.txt,
    -                    qhull-news.html, Eudora signatures, CMakeLists.txt
    -    change version: README.txt, qh-get.htm, File_id.diz, Makefile.txt, CMakeLists.txt
    -    check that CmakeLists @version is the same as qh_version2
    -    change year:    Copying.txt
    -    check download size
    -    recompile user_eg.c, rbox.c, libqhull.c, qconvex.c, qdelaun.c qvoronoi.c, qhalf.c, testqset.c
    -*/
    -
    -const char qh_version[]= "2015.2 2016/01/18";
    -const char qh_version2[]= "qhull 7.2.0 (2015.2 2016/01/18)";
    -
    -/*---------------------------------
    -
    -  qh_appendprint( printFormat )
    -    append printFormat to qh.PRINTout unless already defined
    -*/
    -void qh_appendprint(qh_PRINT format) {
    -  int i;
    -
    -  for (i=0; i < qh_PRINTEND; i++) {
    -    if (qh PRINTout[i] == format && format != qh_PRINTqhull)
    -      break;
    -    if (!qh PRINTout[i]) {
    -      qh PRINTout[i]= format;
    -      break;
    -    }
    -  }
    -} /* appendprint */
    -
    -/*---------------------------------
    -
    -  qh_checkflags( commandStr, hiddenFlags )
    -    errors if commandStr contains hiddenFlags
    -    hiddenFlags starts and ends with a space and is space delimited (checked)
    -
    -  notes:
    -    ignores first word (e.g., "qconvex i")
    -    use qh_strtol/strtod since strtol/strtod may or may not skip trailing spaces
    -
    -  see:
    -    qh_initflags() initializes Qhull according to commandStr
    -*/
    -void qh_checkflags(char *command, char *hiddenflags) {
    -  char *s= command, *t, *chkerr; /* qh_skipfilename is non-const */
    -  char key, opt, prevopt;
    -  char chkkey[]= "   ";
    -  char chkopt[]=  "    ";
    -  char chkopt2[]= "     ";
    -  boolT waserr= False;
    -
    -  if (*hiddenflags != ' ' || hiddenflags[strlen(hiddenflags)-1] != ' ') {
    -    qh_fprintf(qh ferr, 6026, "qhull error (qh_checkflags): hiddenflags must start and end with a space: \"%s\"", hiddenflags);
    -    qh_errexit(qh_ERRinput, NULL, NULL);
    -  }
    -  if (strpbrk(hiddenflags, ",\n\r\t")) {
    -    qh_fprintf(qh ferr, 6027, "qhull error (qh_checkflags): hiddenflags contains commas, newlines, or tabs: \"%s\"", hiddenflags);
    -    qh_errexit(qh_ERRinput, NULL, NULL);
    -  }
    -  while (*s && !isspace(*s))  /* skip program name */
    -    s++;
    -  while (*s) {
    -    while (*s && isspace(*s))
    -      s++;
    -    if (*s == '-')
    -      s++;
    -    if (!*s)
    -      break;
    -    key = *s++;
    -    chkerr = NULL;
    -    if (key == 'T' && (*s == 'I' || *s == 'O')) {  /* TI or TO 'file name' */
    -      s= qh_skipfilename(++s);
    -      continue;
    -    }
    -    chkkey[1]= key;
    -    if (strstr(hiddenflags, chkkey)) {
    -      chkerr= chkkey;
    -    }else if (isupper(key)) {
    -      opt= ' ';
    -      prevopt= ' ';
    -      chkopt[1]= key;
    -      chkopt2[1]= key;
    -      while (!chkerr && *s && !isspace(*s)) {
    -        opt= *s++;
    -        if (isalpha(opt)) {
    -          chkopt[2]= opt;
    -          if (strstr(hiddenflags, chkopt))
    -            chkerr= chkopt;
    -          if (prevopt != ' ') {
    -            chkopt2[2]= prevopt;
    -            chkopt2[3]= opt;
    -            if (strstr(hiddenflags, chkopt2))
    -              chkerr= chkopt2;
    -          }
    -        }else if (key == 'Q' && isdigit(opt) && prevopt != 'b'
    -              && (prevopt == ' ' || islower(prevopt))) {
    -            chkopt[2]= opt;
    -            if (strstr(hiddenflags, chkopt))
    -              chkerr= chkopt;
    -        }else {
    -          qh_strtod(s-1, &t);
    -          if (s < t)
    -            s= t;
    -        }
    -        prevopt= opt;
    -      }
    -    }
    -    if (chkerr) {
    -      *chkerr= '\'';
    -      chkerr[strlen(chkerr)-1]=  '\'';
    -      qh_fprintf(qh ferr, 6029, "qhull error: option %s is not used with this program.\n             It may be used with qhull.\n", chkerr);
    -      waserr= True;
    -    }
    -  }
    -  if (waserr)
    -    qh_errexit(qh_ERRinput, NULL, NULL);
    -} /* checkflags */
    -
    -/*---------------------------------
    -
    -  qh_clear_outputflags()
    -    Clear output flags for QhullPoints
    -*/
    -void qh_clear_outputflags(void) {
    -  int i,k;
    -
    -  qh ANNOTATEoutput= False;
    -  qh DOintersections= False;
    -  qh DROPdim= -1;
    -  qh FORCEoutput= False;
    -  qh GETarea= False;
    -  qh GOODpoint= 0;
    -  qh GOODpointp= NULL;
    -  qh GOODthreshold= False;
    -  qh GOODvertex= 0;
    -  qh GOODvertexp= NULL;
    -  qh IStracing= 0;
    -  qh KEEParea= False;
    -  qh KEEPmerge= False;
    -  qh KEEPminArea= REALmax;
    -  qh PRINTcentrums= False;
    -  qh PRINTcoplanar= False;
    -  qh PRINTdots= False;
    -  qh PRINTgood= False;
    -  qh PRINTinner= False;
    -  qh PRINTneighbors= False;
    -  qh PRINTnoplanes= False;
    -  qh PRINToptions1st= False;
    -  qh PRINTouter= False;
    -  qh PRINTprecision= True;
    -  qh PRINTridges= False;
    -  qh PRINTspheres= False;
    -  qh PRINTstatistics= False;
    -  qh PRINTsummary= False;
    -  qh PRINTtransparent= False;
    -  qh SPLITthresholds= False;
    -  qh TRACElevel= 0;
    -  qh TRInormals= False;
    -  qh USEstdout= False;
    -  qh VERIFYoutput= False;
    -  for (k=qh input_dim+1; k--; ) {  /* duplicated in qh_initqhull_buffers and qh_clear_outputflags */
    -    qh lower_threshold[k]= -REALmax;
    -    qh upper_threshold[k]= REALmax;
    -    qh lower_bound[k]= -REALmax;
    -    qh upper_bound[k]= REALmax;
    -  }
    -
    -  for (i=0; i < qh_PRINTEND; i++) {
    -    qh PRINTout[i]= qh_PRINTnone;
    -  }
    -
    -  if (!qh qhull_commandsiz2)
    -      qh qhull_commandsiz2= (int)strlen(qh qhull_command); /* WARN64 */
    -  else {
    -      qh qhull_command[qh qhull_commandsiz2]= '\0';
    -  }
    -  if (!qh qhull_optionsiz2)
    -    qh qhull_optionsiz2= (int)strlen(qh qhull_options);  /* WARN64 */
    -  else {
    -    qh qhull_options[qh qhull_optionsiz2]= '\0';
    -    qh qhull_optionlen= qh_OPTIONline;  /* start a new line */
    -  }
    -} /* clear_outputflags */
    -
    -/*---------------------------------
    -
    -  qh_clock()
    -    return user CPU time in 100ths (qh_SECtick)
    -    only defined for qh_CLOCKtype == 2
    -
    -  notes:
    -    use first value to determine time 0
    -    from Stevens '92 8.15
    -*/
    -unsigned long qh_clock(void) {
    -
    -#if (qh_CLOCKtype == 2)
    -  struct tms time;
    -  static long clktck;  /* initialized first call and never updated */
    -  double ratio, cpu;
    -  unsigned long ticks;
    -
    -  if (!clktck) {
    -    if ((clktck= sysconf(_SC_CLK_TCK)) < 0) {
    -      qh_fprintf(qh ferr, 6030, "qhull internal error (qh_clock): sysconf() failed.  Use qh_CLOCKtype 1 in user.h\n");
    -      qh_errexit(qh_ERRqhull, NULL, NULL);
    -    }
    -  }
    -  if (times(&time) == -1) {
    -    qh_fprintf(qh ferr, 6031, "qhull internal error (qh_clock): times() failed.  Use qh_CLOCKtype 1 in user.h\n");
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -  ratio= qh_SECticks / (double)clktck;
    -  ticks= time.tms_utime * ratio;
    -  return ticks;
    -#else
    -  qh_fprintf(qh ferr, 6032, "qhull internal error (qh_clock): use qh_CLOCKtype 2 in user.h\n");
    -  qh_errexit(qh_ERRqhull, NULL, NULL); /* never returns */
    -  return 0;
    -#endif
    -} /* clock */
    -
    -/*---------------------------------
    -
    -  qh_freebuffers()
    -    free up global memory buffers
    -
    -  notes:
    -    must match qh_initbuffers()
    -*/
    -void qh_freebuffers(void) {
    -
    -  trace5((qh ferr, 5001, "qh_freebuffers: freeing up global memory buffers\n"));
    -  /* allocated by qh_initqhull_buffers */
    -  qh_memfree(qh NEARzero, qh hull_dim * sizeof(realT));
    -  qh_memfree(qh lower_threshold, (qh input_dim+1) * sizeof(realT));
    -  qh_memfree(qh upper_threshold, (qh input_dim+1) * sizeof(realT));
    -  qh_memfree(qh lower_bound, (qh input_dim+1) * sizeof(realT));
    -  qh_memfree(qh upper_bound, (qh input_dim+1) * sizeof(realT));
    -  qh_memfree(qh gm_matrix, (qh hull_dim+1) * qh hull_dim * sizeof(coordT));
    -  qh_memfree(qh gm_row, (qh hull_dim+1) * sizeof(coordT *));
    -  qh NEARzero= qh lower_threshold= qh upper_threshold= NULL;
    -  qh lower_bound= qh upper_bound= NULL;
    -  qh gm_matrix= NULL;
    -  qh gm_row= NULL;
    -  qh_setfree(&qh other_points);
    -  qh_setfree(&qh del_vertices);
    -  qh_setfree(&qh coplanarfacetset);
    -  if (qh line)                /* allocated by qh_readinput, freed if no error */
    -    qh_free(qh line);
    -  if (qh half_space)
    -    qh_free(qh half_space);
    -  if (qh temp_malloc)
    -    qh_free(qh temp_malloc);
    -  if (qh feasible_point)      /* allocated by qh_readfeasible */
    -    qh_free(qh feasible_point);
    -  if (qh feasible_string)     /* allocated by qh_initflags */
    -    qh_free(qh feasible_string);
    -  qh line= qh feasible_string= NULL;
    -  qh half_space= qh feasible_point= qh temp_malloc= NULL;
    -  /* usually allocated by qh_readinput */
    -  if (qh first_point && qh POINTSmalloc) {
    -    qh_free(qh first_point);
    -    qh first_point= NULL;
    -  }
    -  if (qh input_points && qh input_malloc) { /* set by qh_joggleinput */
    -    qh_free(qh input_points);
    -    qh input_points= NULL;
    -  }
    -  trace5((qh ferr, 5002, "qh_freebuffers: finished\n"));
    -} /* freebuffers */
    -
    -
    -/*---------------------------------
    -
    -  qh_freebuild( allmem )
    -    free global memory used by qh_initbuild and qh_buildhull
    -    if !allmem,
    -      does not free short memory (e.g., facetT, freed by qh_memfreeshort)
    -
    -  design:
    -    free centrums
    -    free each vertex
    -    mark unattached ridges
    -    for each facet
    -      free ridges
    -      free outside set, coplanar set, neighbor set, ridge set, vertex set
    -      free facet
    -    free hash table
    -    free interior point
    -    free merge set
    -    free temporary sets
    -*/
    -void qh_freebuild(boolT allmem) {
    -  facetT *facet;
    -  vertexT *vertex;
    -  ridgeT *ridge, **ridgep;
    -  mergeT *merge, **mergep;
    -
    -  trace1((qh ferr, 1005, "qh_freebuild: free memory from qh_inithull and qh_buildhull\n"));
    -  if (qh del_vertices)
    -    qh_settruncate(qh del_vertices, 0);
    -  if (allmem) {
    -    while ((vertex= qh vertex_list)) {
    -      if (vertex->next)
    -        qh_delvertex(vertex);
    -      else {
    -        qh_memfree(vertex, (int)sizeof(vertexT));
    -        qh newvertex_list= qh vertex_list= NULL;
    -      }
    -    }
    -  }else if (qh VERTEXneighbors) {
    -    FORALLvertices
    -      qh_setfreelong(&(vertex->neighbors));
    -  }
    -  qh VERTEXneighbors= False;
    -  qh GOODclosest= NULL;
    -  if (allmem) {
    -    FORALLfacets {
    -      FOREACHridge_(facet->ridges)
    -        ridge->seen= False;
    -    }
    -    FORALLfacets {
    -      if (facet->visible) {
    -        FOREACHridge_(facet->ridges) {
    -          if (!otherfacet_(ridge, facet)->visible)
    -            ridge->seen= True;  /* an unattached ridge */
    -        }
    -      }
    -    }
    -    while ((facet= qh facet_list)) {
    -      FOREACHridge_(facet->ridges) {
    -        if (ridge->seen) {
    -          qh_setfree(&(ridge->vertices));
    -          qh_memfree(ridge, (int)sizeof(ridgeT));
    -        }else
    -          ridge->seen= True;
    -      }
    -      qh_setfree(&(facet->outsideset));
    -      qh_setfree(&(facet->coplanarset));
    -      qh_setfree(&(facet->neighbors));
    -      qh_setfree(&(facet->ridges));
    -      qh_setfree(&(facet->vertices));
    -      if (facet->next)
    -        qh_delfacet(facet);
    -      else {
    -        qh_memfree(facet, (int)sizeof(facetT));
    -        qh visible_list= qh newfacet_list= qh facet_list= NULL;
    -      }
    -    }
    -  }else {
    -    FORALLfacets {
    -      qh_setfreelong(&(facet->outsideset));
    -      qh_setfreelong(&(facet->coplanarset));
    -      if (!facet->simplicial) {
    -        qh_setfreelong(&(facet->neighbors));
    -        qh_setfreelong(&(facet->ridges));
    -        qh_setfreelong(&(facet->vertices));
    -      }
    -    }
    -  }
    -  qh_setfree(&(qh hash_table));
    -  qh_memfree(qh interior_point, qh normal_size);
    -  qh interior_point= NULL;
    -  FOREACHmerge_(qh facet_mergeset)  /* usually empty */
    -    qh_memfree(merge, (int)sizeof(mergeT));
    -  qh facet_mergeset= NULL;  /* temp set */
    -  qh degen_mergeset= NULL;  /* temp set */
    -  qh_settempfree_all();
    -} /* freebuild */
    -
    -/*---------------------------------
    -
    -  qh_freeqhull( allmem )
    -    see qh_freeqhull2
    -    if qh_QHpointer, frees qh_qh
    -*/
    -void qh_freeqhull(boolT allmem) {
    -    qh_freeqhull2(allmem);
    -#if qh_QHpointer
    -    qh_free(qh_qh);
    -    qh_qh= NULL;
    -#endif
    -}
    -
    -/*---------------------------------
    -
    -qh_freeqhull2( allmem )
    -  free global memory and set qhT to 0
    -  if !allmem,
    -    does not free short memory (freed by qh_memfreeshort unless qh_NOmem)
    -
    -notes:
    -  sets qh.NOerrexit in case caller forgets to
    -  Does not throw errors
    -
    -see:
    -  see qh_initqhull_start2()
    -
    -design:
    -  free global and temporary memory from qh_initbuild and qh_buildhull
    -  free buffers
    -  free statistics
    -*/
    -void qh_freeqhull2(boolT allmem) {
    -
    -  qh NOerrexit= True;  /* no more setjmp since called at exit and ~QhullQh */
    -  trace1((qh ferr, 1006, "qh_freeqhull: free global memory\n"));
    -  qh_freebuild(allmem);
    -  qh_freebuffers();
    -  qh_freestatistics();
    -#if qh_QHpointer
    -  memset((char *)qh_qh, 0, sizeof(qhT));
    -  /* qh_qh freed by caller, qh_freeqhull() */
    -#else
    -  memset((char *)&qh_qh, 0, sizeof(qhT));
    -#endif
    -  qh NOerrexit= True;
    -} /* freeqhull2 */
    -
    -/*---------------------------------
    -
    -  qh_init_A( infile, outfile, errfile, argc, argv )
    -    initialize memory and stdio files
    -    convert input options to option string (qh.qhull_command)
    -
    -  notes:
    -    infile may be NULL if qh_readpoints() is not called
    -
    -    errfile should always be defined.  It is used for reporting
    -    errors.  outfile is used for output and format options.
    -
    -    argc/argv may be 0/NULL
    -
    -    called before error handling initialized
    -    qh_errexit() may not be used
    -*/
    -void qh_init_A(FILE *infile, FILE *outfile, FILE *errfile, int argc, char *argv[]) {
    -  qh_meminit(errfile);
    -  qh_initqhull_start(infile, outfile, errfile);
    -  qh_init_qhull_command(argc, argv);
    -} /* init_A */
    -
    -/*---------------------------------
    -
    -  qh_init_B( points, numpoints, dim, ismalloc )
    -    initialize globals for points array
    -
    -    points has numpoints dim-dimensional points
    -      points[0] is the first coordinate of the first point
    -      points[1] is the second coordinate of the first point
    -      points[dim] is the first coordinate of the second point
    -
    -    ismalloc=True
    -      Qhull will call qh_free(points) on exit or input transformation
    -    ismalloc=False
    -      Qhull will allocate a new point array if needed for input transformation
    -
    -    qh.qhull_command
    -      is the option string.
    -      It is defined by qh_init_B(), qh_qhull_command(), or qh_initflags
    -
    -  returns:
    -    if qh.PROJECTinput or (qh.DELAUNAY and qh.PROJECTdelaunay)
    -      projects the input to a new point array
    -
    -        if qh.DELAUNAY,
    -          qh.hull_dim is increased by one
    -        if qh.ATinfinity,
    -          qh_projectinput adds point-at-infinity for Delaunay tri.
    -
    -    if qh.SCALEinput
    -      changes the upper and lower bounds of the input, see qh_scaleinput()
    -
    -    if qh.ROTATEinput
    -      rotates the input by a random rotation, see qh_rotateinput()
    -      if qh.DELAUNAY
    -        rotates about the last coordinate
    -
    -  notes:
    -    called after points are defined
    -    qh_errexit() may be used
    -*/
    -void qh_init_B(coordT *points, int numpoints, int dim, boolT ismalloc) {
    -  qh_initqhull_globals(points, numpoints, dim, ismalloc);
    -  if (qhmem.LASTsize == 0)
    -    qh_initqhull_mem();
    -  /* mem.c and qset.c are initialized */
    -  qh_initqhull_buffers();
    -  qh_initthresholds(qh qhull_command);
    -  if (qh PROJECTinput || (qh DELAUNAY && qh PROJECTdelaunay))
    -    qh_projectinput();
    -  if (qh SCALEinput)
    -    qh_scaleinput();
    -  if (qh ROTATErandom >= 0) {
    -    qh_randommatrix(qh gm_matrix, qh hull_dim, qh gm_row);
    -    if (qh DELAUNAY) {
    -      int k, lastk= qh hull_dim-1;
    -      for (k=0; k < lastk; k++) {
    -        qh gm_row[k][lastk]= 0.0;
    -        qh gm_row[lastk][k]= 0.0;
    -      }
    -      qh gm_row[lastk][lastk]= 1.0;
    -    }
    -    qh_gram_schmidt(qh hull_dim, qh gm_row);
    -    qh_rotateinput(qh gm_row);
    -  }
    -} /* init_B */
    -
    -/*---------------------------------
    -
    -  qh_init_qhull_command( argc, argv )
    -    build qh.qhull_command from argc/argv
    -    Calls qh_exit if qhull_command is too short
    -
    -  returns:
    -    a space-delimited string of options (just as typed)
    -
    -  notes:
    -    makes option string easy to input and output
    -
    -    argc/argv may be 0/NULL
    -*/
    -void qh_init_qhull_command(int argc, char *argv[]) {
    -
    -  if (!qh_argv_to_command(argc, argv, qh qhull_command, (int)sizeof(qh qhull_command))){
    -    /* Assumes qh.ferr is defined. */
    -    qh_fprintf(qh ferr, 6033, "qhull input error: more than %d characters in command line\n",
    -          (int)sizeof(qh qhull_command));
    -    qh_exit(qh_ERRinput);  /* error reported, can not use qh_errexit */
    -  }
    -} /* init_qhull_command */
    -
    -/*---------------------------------
    -
    -  qh_initflags( commandStr )
    -    set flags and initialized constants from commandStr
    -    calls qh_exit() if qh->NOerrexit
    -
    -  returns:
    -    sets qh.qhull_command to command if needed
    -
    -  notes:
    -    ignores first word (e.g., "qhull d")
    -    use qh_strtol/strtod since strtol/strtod may or may not skip trailing spaces
    -
    -  see:
    -    qh_initthresholds() continues processing of 'Pdn' and 'PDn'
    -    'prompt' in unix.c for documentation
    -
    -  design:
    -    for each space-delimited option group
    -      if top-level option
    -        check syntax
    -        append appropriate option to option string
    -        set appropriate global variable or append printFormat to print options
    -      else
    -        for each sub-option
    -          check syntax
    -          append appropriate option to option string
    -          set appropriate global variable or append printFormat to print options
    -*/
    -void qh_initflags(char *command) {
    -  int k, i, lastproject;
    -  char *s= command, *t, *prev_s, *start, key;
    -  boolT isgeom= False, wasproject;
    -  realT r;
    -
    -  if(qh NOerrexit){/* without this comment, segfault in gcc 4.4.0 mingw32 */
    -    qh_fprintf(qh ferr, 6245, "qhull initflags error: qh.NOerrexit was not cleared before calling qh_initflags().  It should be cleared after setjmp().  Exit qhull.");
    -    qh_exit(6245);
    -  }
    -  if (command <= &qh qhull_command[0] || command > &qh qhull_command[0] + sizeof(qh qhull_command)) {
    -    if (command != &qh qhull_command[0]) {
    -      *qh qhull_command= '\0';
    -      strncat(qh qhull_command, command, sizeof(qh qhull_command)-strlen(qh qhull_command)-1);
    -    }
    -    while (*s && !isspace(*s))  /* skip program name */
    -      s++;
    -  }
    -  while (*s) {
    -    while (*s && isspace(*s))
    -      s++;
    -    if (*s == '-')
    -      s++;
    -    if (!*s)
    -      break;
    -    prev_s= s;
    -    switch (*s++) {
    -    case 'd':
    -      qh_option("delaunay", NULL, NULL);
    -      qh DELAUNAY= True;
    -      break;
    -    case 'f':
    -      qh_option("facets", NULL, NULL);
    -      qh_appendprint(qh_PRINTfacets);
    -      break;
    -    case 'i':
    -      qh_option("incidence", NULL, NULL);
    -      qh_appendprint(qh_PRINTincidences);
    -      break;
    -    case 'm':
    -      qh_option("mathematica", NULL, NULL);
    -      qh_appendprint(qh_PRINTmathematica);
    -      break;
    -    case 'n':
    -      qh_option("normals", NULL, NULL);
    -      qh_appendprint(qh_PRINTnormals);
    -      break;
    -    case 'o':
    -      qh_option("offFile", NULL, NULL);
    -      qh_appendprint(qh_PRINToff);
    -      break;
    -    case 'p':
    -      qh_option("points", NULL, NULL);
    -      qh_appendprint(qh_PRINTpoints);
    -      break;
    -    case 's':
    -      qh_option("summary", NULL, NULL);
    -      qh PRINTsummary= True;
    -      break;
    -    case 'v':
    -      qh_option("voronoi", NULL, NULL);
    -      qh VORONOI= True;
    -      qh DELAUNAY= True;
    -      break;
    -    case 'A':
    -      if (!isdigit(*s) && *s != '.' && *s != '-')
    -        qh_fprintf(qh ferr, 7002, "qhull warning: no maximum cosine angle given for option 'An'.  Ignored.\n");
    -      else {
    -        if (*s == '-') {
    -          qh premerge_cos= -qh_strtod(s, &s);
    -          qh_option("Angle-premerge-", NULL, &qh premerge_cos);
    -          qh PREmerge= True;
    -        }else {
    -          qh postmerge_cos= qh_strtod(s, &s);
    -          qh_option("Angle-postmerge", NULL, &qh postmerge_cos);
    -          qh POSTmerge= True;
    -        }
    -        qh MERGING= True;
    -      }
    -      break;
    -    case 'C':
    -      if (!isdigit(*s) && *s != '.' && *s != '-')
    -        qh_fprintf(qh ferr, 7003, "qhull warning: no centrum radius given for option 'Cn'.  Ignored.\n");
    -      else {
    -        if (*s == '-') {
    -          qh premerge_centrum= -qh_strtod(s, &s);
    -          qh_option("Centrum-premerge-", NULL, &qh premerge_centrum);
    -          qh PREmerge= True;
    -        }else {
    -          qh postmerge_centrum= qh_strtod(s, &s);
    -          qh_option("Centrum-postmerge", NULL, &qh postmerge_centrum);
    -          qh POSTmerge= True;
    -        }
    -        qh MERGING= True;
    -      }
    -      break;
    -    case 'E':
    -      if (*s == '-')
    -        qh_fprintf(qh ferr, 7004, "qhull warning: negative maximum roundoff given for option 'An'.  Ignored.\n");
    -      else if (!isdigit(*s))
    -        qh_fprintf(qh ferr, 7005, "qhull warning: no maximum roundoff given for option 'En'.  Ignored.\n");
    -      else {
    -        qh DISTround= qh_strtod(s, &s);
    -        qh_option("Distance-roundoff", NULL, &qh DISTround);
    -        qh SETroundoff= True;
    -      }
    -      break;
    -    case 'H':
    -      start= s;
    -      qh HALFspace= True;
    -      qh_strtod(s, &t);
    -      while (t > s)  {
    -        if (*t && !isspace(*t)) {
    -          if (*t == ',')
    -            t++;
    -          else
    -            qh_fprintf(qh ferr, 7006, "qhull warning: origin for Halfspace intersection should be 'Hn,n,n,...'\n");
    -        }
    -        s= t;
    -        qh_strtod(s, &t);
    -      }
    -      if (start < t) {
    -        if (!(qh feasible_string= (char*)calloc((size_t)(t-start+1), (size_t)1))) {
    -          qh_fprintf(qh ferr, 6034, "qhull error: insufficient memory for 'Hn,n,n'\n");
    -          qh_errexit(qh_ERRmem, NULL, NULL);
    -        }
    -        strncpy(qh feasible_string, start, (size_t)(t-start));
    -        qh_option("Halfspace-about", NULL, NULL);
    -        qh_option(qh feasible_string, NULL, NULL);
    -      }else
    -        qh_option("Halfspace", NULL, NULL);
    -      break;
    -    case 'R':
    -      if (!isdigit(*s))
    -        qh_fprintf(qh ferr, 7007, "qhull warning: missing random perturbation for option 'Rn'.  Ignored\n");
    -      else {
    -        qh RANDOMfactor= qh_strtod(s, &s);
    -        qh_option("Random_perturb", NULL, &qh RANDOMfactor);
    -        qh RANDOMdist= True;
    -      }
    -      break;
    -    case 'V':
    -      if (!isdigit(*s) && *s != '-')
    -        qh_fprintf(qh ferr, 7008, "qhull warning: missing visible distance for option 'Vn'.  Ignored\n");
    -      else {
    -        qh MINvisible= qh_strtod(s, &s);
    -        qh_option("Visible", NULL, &qh MINvisible);
    -      }
    -      break;
    -    case 'U':
    -      if (!isdigit(*s) && *s != '-')
    -        qh_fprintf(qh ferr, 7009, "qhull warning: missing coplanar distance for option 'Un'.  Ignored\n");
    -      else {
    -        qh MAXcoplanar= qh_strtod(s, &s);
    -        qh_option("U-coplanar", NULL, &qh MAXcoplanar);
    -      }
    -      break;
    -    case 'W':
    -      if (*s == '-')
    -        qh_fprintf(qh ferr, 7010, "qhull warning: negative outside width for option 'Wn'.  Ignored.\n");
    -      else if (!isdigit(*s))
    -        qh_fprintf(qh ferr, 7011, "qhull warning: missing outside width for option 'Wn'.  Ignored\n");
    -      else {
    -        qh MINoutside= qh_strtod(s, &s);
    -        qh_option("W-outside", NULL, &qh MINoutside);
    -        qh APPROXhull= True;
    -      }
    -      break;
    -    /************  sub menus ***************/
    -    case 'F':
    -      while (*s && !isspace(*s)) {
    -        switch (*s++) {
    -        case 'a':
    -          qh_option("Farea", NULL, NULL);
    -          qh_appendprint(qh_PRINTarea);
    -          qh GETarea= True;
    -          break;
    -        case 'A':
    -          qh_option("FArea-total", NULL, NULL);
    -          qh GETarea= True;
    -          break;
    -        case 'c':
    -          qh_option("Fcoplanars", NULL, NULL);
    -          qh_appendprint(qh_PRINTcoplanars);
    -          break;
    -        case 'C':
    -          qh_option("FCentrums", NULL, NULL);
    -          qh_appendprint(qh_PRINTcentrums);
    -          break;
    -        case 'd':
    -          qh_option("Fd-cdd-in", NULL, NULL);
    -          qh CDDinput= True;
    -          break;
    -        case 'D':
    -          qh_option("FD-cdd-out", NULL, NULL);
    -          qh CDDoutput= True;
    -          break;
    -        case 'F':
    -          qh_option("FFacets-xridge", NULL, NULL);
    -          qh_appendprint(qh_PRINTfacets_xridge);
    -          break;
    -        case 'i':
    -          qh_option("Finner", NULL, NULL);
    -          qh_appendprint(qh_PRINTinner);
    -          break;
    -        case 'I':
    -          qh_option("FIDs", NULL, NULL);
    -          qh_appendprint(qh_PRINTids);
    -          break;
    -        case 'm':
    -          qh_option("Fmerges", NULL, NULL);
    -          qh_appendprint(qh_PRINTmerges);
    -          break;
    -        case 'M':
    -          qh_option("FMaple", NULL, NULL);
    -          qh_appendprint(qh_PRINTmaple);
    -          break;
    -        case 'n':
    -          qh_option("Fneighbors", NULL, NULL);
    -          qh_appendprint(qh_PRINTneighbors);
    -          break;
    -        case 'N':
    -          qh_option("FNeighbors-vertex", NULL, NULL);
    -          qh_appendprint(qh_PRINTvneighbors);
    -          break;
    -        case 'o':
    -          qh_option("Fouter", NULL, NULL);
    -          qh_appendprint(qh_PRINTouter);
    -          break;
    -        case 'O':
    -          if (qh PRINToptions1st) {
    -            qh_option("FOptions", NULL, NULL);
    -            qh_appendprint(qh_PRINToptions);
    -          }else
    -            qh PRINToptions1st= True;
    -          break;
    -        case 'p':
    -          qh_option("Fpoint-intersect", NULL, NULL);
    -          qh_appendprint(qh_PRINTpointintersect);
    -          break;
    -        case 'P':
    -          qh_option("FPoint-nearest", NULL, NULL);
    -          qh_appendprint(qh_PRINTpointnearest);
    -          break;
    -        case 'Q':
    -          qh_option("FQhull", NULL, NULL);
    -          qh_appendprint(qh_PRINTqhull);
    -          break;
    -        case 's':
    -          qh_option("Fsummary", NULL, NULL);
    -          qh_appendprint(qh_PRINTsummary);
    -          break;
    -        case 'S':
    -          qh_option("FSize", NULL, NULL);
    -          qh_appendprint(qh_PRINTsize);
    -          qh GETarea= True;
    -          break;
    -        case 't':
    -          qh_option("Ftriangles", NULL, NULL);
    -          qh_appendprint(qh_PRINTtriangles);
    -          break;
    -        case 'v':
    -          /* option set in qh_initqhull_globals */
    -          qh_appendprint(qh_PRINTvertices);
    -          break;
    -        case 'V':
    -          qh_option("FVertex-average", NULL, NULL);
    -          qh_appendprint(qh_PRINTaverage);
    -          break;
    -        case 'x':
    -          qh_option("Fxtremes", NULL, NULL);
    -          qh_appendprint(qh_PRINTextremes);
    -          break;
    -        default:
    -          s--;
    -          qh_fprintf(qh ferr, 7012, "qhull warning: unknown 'F' output option %c, rest ignored\n", (int)s[0]);
    -          while (*++s && !isspace(*s));
    -          break;
    -        }
    -      }
    -      break;
    -    case 'G':
    -      isgeom= True;
    -      qh_appendprint(qh_PRINTgeom);
    -      while (*s && !isspace(*s)) {
    -        switch (*s++) {
    -        case 'a':
    -          qh_option("Gall-points", NULL, NULL);
    -          qh PRINTdots= True;
    -          break;
    -        case 'c':
    -          qh_option("Gcentrums", NULL, NULL);
    -          qh PRINTcentrums= True;
    -          break;
    -        case 'h':
    -          qh_option("Gintersections", NULL, NULL);
    -          qh DOintersections= True;
    -          break;
    -        case 'i':
    -          qh_option("Ginner", NULL, NULL);
    -          qh PRINTinner= True;
    -          break;
    -        case 'n':
    -          qh_option("Gno-planes", NULL, NULL);
    -          qh PRINTnoplanes= True;
    -          break;
    -        case 'o':
    -          qh_option("Gouter", NULL, NULL);
    -          qh PRINTouter= True;
    -          break;
    -        case 'p':
    -          qh_option("Gpoints", NULL, NULL);
    -          qh PRINTcoplanar= True;
    -          break;
    -        case 'r':
    -          qh_option("Gridges", NULL, NULL);
    -          qh PRINTridges= True;
    -          break;
    -        case 't':
    -          qh_option("Gtransparent", NULL, NULL);
    -          qh PRINTtransparent= True;
    -          break;
    -        case 'v':
    -          qh_option("Gvertices", NULL, NULL);
    -          qh PRINTspheres= True;
    -          break;
    -        case 'D':
    -          if (!isdigit(*s))
    -            qh_fprintf(qh ferr, 6035, "qhull input error: missing dimension for option 'GDn'\n");
    -          else {
    -            if (qh DROPdim >= 0)
    -              qh_fprintf(qh ferr, 7013, "qhull warning: can only drop one dimension.  Previous 'GD%d' ignored\n",
    -                   qh DROPdim);
    -            qh DROPdim= qh_strtol(s, &s);
    -            qh_option("GDrop-dim", &qh DROPdim, NULL);
    -          }
    -          break;
    -        default:
    -          s--;
    -          qh_fprintf(qh ferr, 7014, "qhull warning: unknown 'G' print option %c, rest ignored\n", (int)s[0]);
    -          while (*++s && !isspace(*s));
    -          break;
    -        }
    -      }
    -      break;
    -    case 'P':
    -      while (*s && !isspace(*s)) {
    -        switch (*s++) {
    -        case 'd': case 'D':  /* see qh_initthresholds() */
    -          key= s[-1];
    -          i= qh_strtol(s, &s);
    -          r= 0;
    -          if (*s == ':') {
    -            s++;
    -            r= qh_strtod(s, &s);
    -          }
    -          if (key == 'd')
    -            qh_option("Pdrop-facets-dim-less", &i, &r);
    -          else
    -            qh_option("PDrop-facets-dim-more", &i, &r);
    -          break;
    -        case 'g':
    -          qh_option("Pgood-facets", NULL, NULL);
    -          qh PRINTgood= True;
    -          break;
    -        case 'G':
    -          qh_option("PGood-facet-neighbors", NULL, NULL);
    -          qh PRINTneighbors= True;
    -          break;
    -        case 'o':
    -          qh_option("Poutput-forced", NULL, NULL);
    -          qh FORCEoutput= True;
    -          break;
    -        case 'p':
    -          qh_option("Pprecision-ignore", NULL, NULL);
    -          qh PRINTprecision= False;
    -          break;
    -        case 'A':
    -          if (!isdigit(*s))
    -            qh_fprintf(qh ferr, 6036, "qhull input error: missing facet count for keep area option 'PAn'\n");
    -          else {
    -            qh KEEParea= qh_strtol(s, &s);
    -            qh_option("PArea-keep", &qh KEEParea, NULL);
    -            qh GETarea= True;
    -          }
    -          break;
    -        case 'F':
    -          if (!isdigit(*s))
    -            qh_fprintf(qh ferr, 6037, "qhull input error: missing facet area for option 'PFn'\n");
    -          else {
    -            qh KEEPminArea= qh_strtod(s, &s);
    -            qh_option("PFacet-area-keep", NULL, &qh KEEPminArea);
    -            qh GETarea= True;
    -          }
    -          break;
    -        case 'M':
    -          if (!isdigit(*s))
    -            qh_fprintf(qh ferr, 6038, "qhull input error: missing merge count for option 'PMn'\n");
    -          else {
    -            qh KEEPmerge= qh_strtol(s, &s);
    -            qh_option("PMerge-keep", &qh KEEPmerge, NULL);
    -          }
    -          break;
    -        default:
    -          s--;
    -          qh_fprintf(qh ferr, 7015, "qhull warning: unknown 'P' print option %c, rest ignored\n", (int)s[0]);
    -          while (*++s && !isspace(*s));
    -          break;
    -        }
    -      }
    -      break;
    -    case 'Q':
    -      lastproject= -1;
    -      while (*s && !isspace(*s)) {
    -        switch (*s++) {
    -        case 'b': case 'B':  /* handled by qh_initthresholds */
    -          key= s[-1];
    -          if (key == 'b' && *s == 'B') {
    -            s++;
    -            r= qh_DEFAULTbox;
    -            qh SCALEinput= True;
    -            qh_option("QbBound-unit-box", NULL, &r);
    -            break;
    -          }
    -          if (key == 'b' && *s == 'b') {
    -            s++;
    -            qh SCALElast= True;
    -            qh_option("Qbbound-last", NULL, NULL);
    -            break;
    -          }
    -          k= qh_strtol(s, &s);
    -          r= 0.0;
    -          wasproject= False;
    -          if (*s == ':') {
    -            s++;
    -            if ((r= qh_strtod(s, &s)) == 0.0) {
    -              t= s;            /* need true dimension for memory allocation */
    -              while (*t && !isspace(*t)) {
    -                if (toupper(*t++) == 'B'
    -                 && k == qh_strtol(t, &t)
    -                 && *t++ == ':'
    -                 && qh_strtod(t, &t) == 0.0) {
    -                  qh PROJECTinput++;
    -                  trace2((qh ferr, 2004, "qh_initflags: project dimension %d\n", k));
    -                  qh_option("Qb-project-dim", &k, NULL);
    -                  wasproject= True;
    -                  lastproject= k;
    -                  break;
    -                }
    -              }
    -            }
    -          }
    -          if (!wasproject) {
    -            if (lastproject == k && r == 0.0)
    -              lastproject= -1;  /* doesn't catch all possible sequences */
    -            else if (key == 'b') {
    -              qh SCALEinput= True;
    -              if (r == 0.0)
    -                r= -qh_DEFAULTbox;
    -              qh_option("Qbound-dim-low", &k, &r);
    -            }else {
    -              qh SCALEinput= True;
    -              if (r == 0.0)
    -                r= qh_DEFAULTbox;
    -              qh_option("QBound-dim-high", &k, &r);
    -            }
    -          }
    -          break;
    -        case 'c':
    -          qh_option("Qcoplanar-keep", NULL, NULL);
    -          qh KEEPcoplanar= True;
    -          break;
    -        case 'f':
    -          qh_option("Qfurthest-outside", NULL, NULL);
    -          qh BESToutside= True;
    -          break;
    -        case 'g':
    -          qh_option("Qgood-facets-only", NULL, NULL);
    -          qh ONLYgood= True;
    -          break;
    -        case 'i':
    -          qh_option("Qinterior-keep", NULL, NULL);
    -          qh KEEPinside= True;
    -          break;
    -        case 'm':
    -          qh_option("Qmax-outside-only", NULL, NULL);
    -          qh ONLYmax= True;
    -          break;
    -        case 'r':
    -          qh_option("Qrandom-outside", NULL, NULL);
    -          qh RANDOMoutside= True;
    -          break;
    -        case 's':
    -          qh_option("Qsearch-initial-simplex", NULL, NULL);
    -          qh ALLpoints= True;
    -          break;
    -        case 't':
    -          qh_option("Qtriangulate", NULL, NULL);
    -          qh TRIangulate= True;
    -          break;
    -        case 'T':
    -          qh_option("QTestPoints", NULL, NULL);
    -          if (!isdigit(*s))
    -            qh_fprintf(qh ferr, 6039, "qhull input error: missing number of test points for option 'QTn'\n");
    -          else {
    -            qh TESTpoints= qh_strtol(s, &s);
    -            qh_option("QTestPoints", &qh TESTpoints, NULL);
    -          }
    -          break;
    -        case 'u':
    -          qh_option("QupperDelaunay", NULL, NULL);
    -          qh UPPERdelaunay= True;
    -          break;
    -        case 'v':
    -          qh_option("Qvertex-neighbors-convex", NULL, NULL);
    -          qh TESTvneighbors= True;
    -          break;
    -        case 'x':
    -          qh_option("Qxact-merge", NULL, NULL);
    -          qh MERGEexact= True;
    -          break;
    -        case 'z':
    -          qh_option("Qz-infinity-point", NULL, NULL);
    -          qh ATinfinity= True;
    -          break;
    -        case '0':
    -          qh_option("Q0-no-premerge", NULL, NULL);
    -          qh NOpremerge= True;
    -          break;
    -        case '1':
    -          if (!isdigit(*s)) {
    -            qh_option("Q1-no-angle-sort", NULL, NULL);
    -            qh ANGLEmerge= False;
    -            break;
    -          }
    -          switch (*s++) {
    -          case '0':
    -            qh_option("Q10-no-narrow", NULL, NULL);
    -            qh NOnarrow= True;
    -            break;
    -          case '1':
    -            qh_option("Q11-trinormals Qtriangulate", NULL, NULL);
    -            qh TRInormals= True;
    -            qh TRIangulate= True;
    -            break;
    -          case '2':
    -            qh_option("Q12-no-wide-dup", NULL, NULL);
    -            qh NOwide= True;
    -            break;
    -          default:
    -            s--;
    -            qh_fprintf(qh ferr, 7016, "qhull warning: unknown 'Q' qhull option 1%c, rest ignored\n", (int)s[0]);
    -            while (*++s && !isspace(*s));
    -            break;
    -          }
    -          break;
    -        case '2':
    -          qh_option("Q2-no-merge-independent", NULL, NULL);
    -          qh MERGEindependent= False;
    -          goto LABELcheckdigit;
    -          break; /* no warnings */
    -        case '3':
    -          qh_option("Q3-no-merge-vertices", NULL, NULL);
    -          qh MERGEvertices= False;
    -        LABELcheckdigit:
    -          if (isdigit(*s))
    -            qh_fprintf(qh ferr, 7017, "qhull warning: can not follow '1', '2', or '3' with a digit.  '%c' skipped.\n",
    -                     *s++);
    -          break;
    -        case '4':
    -          qh_option("Q4-avoid-old-into-new", NULL, NULL);
    -          qh AVOIDold= True;
    -          break;
    -        case '5':
    -          qh_option("Q5-no-check-outer", NULL, NULL);
    -          qh SKIPcheckmax= True;
    -          break;
    -        case '6':
    -          qh_option("Q6-no-concave-merge", NULL, NULL);
    -          qh SKIPconvex= True;
    -          break;
    -        case '7':
    -          qh_option("Q7-no-breadth-first", NULL, NULL);
    -          qh VIRTUALmemory= True;
    -          break;
    -        case '8':
    -          qh_option("Q8-no-near-inside", NULL, NULL);
    -          qh NOnearinside= True;
    -          break;
    -        case '9':
    -          qh_option("Q9-pick-furthest", NULL, NULL);
    -          qh PICKfurthest= True;
    -          break;
    -        case 'G':
    -          i= qh_strtol(s, &t);
    -          if (qh GOODpoint)
    -            qh_fprintf(qh ferr, 7018, "qhull warning: good point already defined for option 'QGn'.  Ignored\n");
    -          else if (s == t)
    -            qh_fprintf(qh ferr, 7019, "qhull warning: missing good point id for option 'QGn'.  Ignored\n");
    -          else if (i < 0 || *s == '-') {
    -            qh GOODpoint= i-1;
    -            qh_option("QGood-if-dont-see-point", &i, NULL);
    -          }else {
    -            qh GOODpoint= i+1;
    -            qh_option("QGood-if-see-point", &i, NULL);
    -          }
    -          s= t;
    -          break;
    -        case 'J':
    -          if (!isdigit(*s) && *s != '-')
    -            qh JOGGLEmax= 0.0;
    -          else {
    -            qh JOGGLEmax= (realT) qh_strtod(s, &s);
    -            qh_option("QJoggle", NULL, &qh JOGGLEmax);
    -          }
    -          break;
    -        case 'R':
    -          if (!isdigit(*s) && *s != '-')
    -            qh_fprintf(qh ferr, 7020, "qhull warning: missing random seed for option 'QRn'.  Ignored\n");
    -          else {
    -            qh ROTATErandom= i= qh_strtol(s, &s);
    -            if (i > 0)
    -              qh_option("QRotate-id", &i, NULL );
    -            else if (i < -1)
    -              qh_option("QRandom-seed", &i, NULL );
    -          }
    -          break;
    -        case 'V':
    -          i= qh_strtol(s, &t);
    -          if (qh GOODvertex)
    -            qh_fprintf(qh ferr, 7021, "qhull warning: good vertex already defined for option 'QVn'.  Ignored\n");
    -          else if (s == t)
    -            qh_fprintf(qh ferr, 7022, "qhull warning: no good point id given for option 'QVn'.  Ignored\n");
    -          else if (i < 0) {
    -            qh GOODvertex= i - 1;
    -            qh_option("QV-good-facets-not-point", &i, NULL);
    -          }else {
    -            qh_option("QV-good-facets-point", &i, NULL);
    -            qh GOODvertex= i + 1;
    -          }
    -          s= t;
    -          break;
    -        default:
    -          s--;
    -          qh_fprintf(qh ferr, 7023, "qhull warning: unknown 'Q' qhull option %c, rest ignored\n", (int)s[0]);
    -          while (*++s && !isspace(*s));
    -          break;
    -        }
    -      }
    -      break;
    -    case 'T':
    -      while (*s && !isspace(*s)) {
    -        if (isdigit(*s) || *s == '-')
    -          qh IStracing= qh_strtol(s, &s);
    -        else switch (*s++) {
    -        case 'a':
    -          qh_option("Tannotate-output", NULL, NULL);
    -          qh ANNOTATEoutput= True;
    -          break;
    -        case 'c':
    -          qh_option("Tcheck-frequently", NULL, NULL);
    -          qh CHECKfrequently= True;
    -          break;
    -        case 's':
    -          qh_option("Tstatistics", NULL, NULL);
    -          qh PRINTstatistics= True;
    -          break;
    -        case 'v':
    -          qh_option("Tverify", NULL, NULL);
    -          qh VERIFYoutput= True;
    -          break;
    -        case 'z':
    -          if (qh ferr == qh_FILEstderr) {
    -            /* The C++ interface captures the output in qh_fprint_qhull() */
    -            qh_option("Tz-stdout", NULL, NULL);
    -            qh USEstdout= True;
    -          }else if (!qh fout)
    -            qh_fprintf(qh ferr, 7024, "qhull warning: output file undefined(stdout).  Option 'Tz' ignored.\n");
    -          else {
    -            qh_option("Tz-stdout", NULL, NULL);
    -            qh USEstdout= True;
    -            qh ferr= qh fout;
    -            qhmem.ferr= qh fout;
    -          }
    -          break;
    -        case 'C':
    -          if (!isdigit(*s))
    -            qh_fprintf(qh ferr, 7025, "qhull warning: missing point id for cone for trace option 'TCn'.  Ignored\n");
    -          else {
    -            i= qh_strtol(s, &s);
    -            qh_option("TCone-stop", &i, NULL);
    -            qh STOPcone= i + 1;
    -          }
    -          break;
    -        case 'F':
    -          if (!isdigit(*s))
    -            qh_fprintf(qh ferr, 7026, "qhull warning: missing frequency count for trace option 'TFn'.  Ignored\n");
    -          else {
    -            qh REPORTfreq= qh_strtol(s, &s);
    -            qh_option("TFacet-log", &qh REPORTfreq, NULL);
    -            qh REPORTfreq2= qh REPORTfreq/2;  /* for tracemerging() */
    -          }
    -          break;
    -        case 'I':
    -          if (!isspace(*s))
    -            qh_fprintf(qh ferr, 7027, "qhull warning: missing space between 'TI' and filename, %s\n", s);
    -          while (isspace(*s))
    -            s++;
    -          t= qh_skipfilename(s);
    -          {
    -            char filename[qh_FILENAMElen];
    -
    -            qh_copyfilename(filename, (int)sizeof(filename), s, (int)(t-s));   /* WARN64 */
    -            s= t;
    -            if (!freopen(filename, "r", stdin)) {
    -              qh_fprintf(qh ferr, 6041, "qhull error: could not open file \"%s\".", filename);
    -              qh_errexit(qh_ERRinput, NULL, NULL);
    -            }else {
    -              qh_option("TInput-file", NULL, NULL);
    -              qh_option(filename, NULL, NULL);
    -            }
    -          }
    -          break;
    -        case 'O':
    -            if (!isspace(*s))
    -                qh_fprintf(qh ferr, 7028, "qhull warning: missing space between 'TO' and filename, %s\n", s);
    -            while (isspace(*s))
    -                s++;
    -            t= qh_skipfilename(s);
    -            {
    -              char filename[qh_FILENAMElen];
    -
    -              qh_copyfilename(filename, (int)sizeof(filename), s, (int)(t-s));  /* WARN64 */
    -              s= t;
    -              if (!qh fout) {
    -                qh_fprintf(qh ferr, 6266, "qhull input warning: qh.fout was not set by caller.  Cannot use option 'TO' to redirect output.  Ignoring option 'TO'\n");
    -              }else if (!freopen(filename, "w", qh fout)) {
    -                qh_fprintf(qh ferr, 6044, "qhull error: could not open file \"%s\".", filename);
    -                qh_errexit(qh_ERRinput, NULL, NULL);
    -              }else {
    -                qh_option("TOutput-file", NULL, NULL);
    -              qh_option(filename, NULL, NULL);
    -            }
    -          }
    -          break;
    -        case 'P':
    -          if (!isdigit(*s))
    -            qh_fprintf(qh ferr, 7029, "qhull warning: missing point id for trace option 'TPn'.  Ignored\n");
    -          else {
    -            qh TRACEpoint= qh_strtol(s, &s);
    -            qh_option("Trace-point", &qh TRACEpoint, NULL);
    -          }
    -          break;
    -        case 'M':
    -          if (!isdigit(*s))
    -            qh_fprintf(qh ferr, 7030, "qhull warning: missing merge id for trace option 'TMn'.  Ignored\n");
    -          else {
    -            qh TRACEmerge= qh_strtol(s, &s);
    -            qh_option("Trace-merge", &qh TRACEmerge, NULL);
    -          }
    -          break;
    -        case 'R':
    -          if (!isdigit(*s))
    -            qh_fprintf(qh ferr, 7031, "qhull warning: missing rerun count for trace option 'TRn'.  Ignored\n");
    -          else {
    -            qh RERUN= qh_strtol(s, &s);
    -            qh_option("TRerun", &qh RERUN, NULL);
    -          }
    -          break;
    -        case 'V':
    -          i= qh_strtol(s, &t);
    -          if (s == t)
    -            qh_fprintf(qh ferr, 7032, "qhull warning: missing furthest point id for trace option 'TVn'.  Ignored\n");
    -          else if (i < 0) {
    -            qh STOPpoint= i - 1;
    -            qh_option("TV-stop-before-point", &i, NULL);
    -          }else {
    -            qh STOPpoint= i + 1;
    -            qh_option("TV-stop-after-point", &i, NULL);
    -          }
    -          s= t;
    -          break;
    -        case 'W':
    -          if (!isdigit(*s))
    -            qh_fprintf(qh ferr, 7033, "qhull warning: missing max width for trace option 'TWn'.  Ignored\n");
    -          else {
    -            qh TRACEdist= (realT) qh_strtod(s, &s);
    -            qh_option("TWide-trace", NULL, &qh TRACEdist);
    -          }
    -          break;
    -        default:
    -          s--;
    -          qh_fprintf(qh ferr, 7034, "qhull warning: unknown 'T' trace option %c, rest ignored\n", (int)s[0]);
    -          while (*++s && !isspace(*s));
    -          break;
    -        }
    -      }
    -      break;
    -    default:
    -      qh_fprintf(qh ferr, 7035, "qhull warning: unknown flag %c(%x)\n", (int)s[-1],
    -               (int)s[-1]);
    -      break;
    -    }
    -    if (s-1 == prev_s && *s && !isspace(*s)) {
    -      qh_fprintf(qh ferr, 7036, "qhull warning: missing space after flag %c(%x); reserved for menu. Skipped.\n",
    -               (int)*prev_s, (int)*prev_s);
    -      while (*s && !isspace(*s))
    -        s++;
    -    }
    -  }
    -  if (qh STOPcone && qh JOGGLEmax < REALmax/2)
    -    qh_fprintf(qh ferr, 7078, "qhull warning: 'TCn' (stopCone) ignored when used with 'QJn' (joggle)\n");
    -  if (isgeom && !qh FORCEoutput && qh PRINTout[1])
    -    qh_fprintf(qh ferr, 7037, "qhull warning: additional output formats are not compatible with Geomview\n");
    -  /* set derived values in qh_initqhull_globals */
    -} /* initflags */
    -
    -
    -/*---------------------------------
    -
    -  qh_initqhull_buffers()
    -    initialize global memory buffers
    -
    -  notes:
    -    must match qh_freebuffers()
    -*/
    -void qh_initqhull_buffers(void) {
    -  int k;
    -
    -  qh TEMPsize= (qhmem.LASTsize - sizeof(setT))/SETelemsize;
    -  if (qh TEMPsize <= 0 || qh TEMPsize > qhmem.LASTsize)
    -    qh TEMPsize= 8;  /* e.g., if qh_NOmem */
    -  qh other_points= qh_setnew(qh TEMPsize);
    -  qh del_vertices= qh_setnew(qh TEMPsize);
    -  qh coplanarfacetset= qh_setnew(qh TEMPsize);
    -  qh NEARzero= (realT *)qh_memalloc(qh hull_dim * sizeof(realT));
    -  qh lower_threshold= (realT *)qh_memalloc((qh input_dim+1) * sizeof(realT));
    -  qh upper_threshold= (realT *)qh_memalloc((qh input_dim+1) * sizeof(realT));
    -  qh lower_bound= (realT *)qh_memalloc((qh input_dim+1) * sizeof(realT));
    -  qh upper_bound= (realT *)qh_memalloc((qh input_dim+1) * sizeof(realT));
    -  for (k=qh input_dim+1; k--; ) {  /* duplicated in qh_initqhull_buffers and qh_clear_outputflags */
    -    qh lower_threshold[k]= -REALmax;
    -    qh upper_threshold[k]= REALmax;
    -    qh lower_bound[k]= -REALmax;
    -    qh upper_bound[k]= REALmax;
    -  }
    -  qh gm_matrix= (coordT *)qh_memalloc((qh hull_dim+1) * qh hull_dim * sizeof(coordT));
    -  qh gm_row= (coordT **)qh_memalloc((qh hull_dim+1) * sizeof(coordT *));
    -} /* initqhull_buffers */
    -
    -/*---------------------------------
    -
    -  qh_initqhull_globals( points, numpoints, dim, ismalloc )
    -    initialize globals
    -    if ismalloc
    -      points were malloc'd and qhull should free at end
    -
    -  returns:
    -    sets qh.first_point, num_points, input_dim, hull_dim and others
    -    seeds random number generator (seed=1 if tracing)
    -    modifies qh.hull_dim if ((qh.DELAUNAY and qh.PROJECTdelaunay) or qh.PROJECTinput)
    -    adjust user flags as needed
    -    also checks DIM3 dependencies and constants
    -
    -  notes:
    -    do not use qh_point() since an input transformation may move them elsewhere
    -
    -  see:
    -    qh_initqhull_start() sets default values for non-zero globals
    -
    -  design:
    -    initialize points array from input arguments
    -    test for qh.ZEROcentrum
    -      (i.e., use opposite vertex instead of cetrum for convexity testing)
    -    initialize qh.CENTERtype, qh.normal_size,
    -      qh.center_size, qh.TRACEpoint/level,
    -    initialize and test random numbers
    -    qh_initqhull_outputflags() -- adjust and test output flags
    -*/
    -void qh_initqhull_globals(coordT *points, int numpoints, int dim, boolT ismalloc) {
    -  int seed, pointsneeded, extra= 0, i, randi, k;
    -  realT randr;
    -  realT factorial;
    -
    -  time_t timedata;
    -
    -  trace0((qh ferr, 13, "qh_initqhull_globals: for %s | %s\n", qh rbox_command,
    -      qh qhull_command));
    -  qh POINTSmalloc= ismalloc;
    -  qh first_point= points;
    -  qh num_points= numpoints;
    -  qh hull_dim= qh input_dim= dim;
    -  if (!qh NOpremerge && !qh MERGEexact && !qh PREmerge && qh JOGGLEmax > REALmax/2) {
    -    qh MERGING= True;
    -    if (qh hull_dim <= 4) {
    -      qh PREmerge= True;
    -      qh_option("_pre-merge", NULL, NULL);
    -    }else {
    -      qh MERGEexact= True;
    -      qh_option("Qxact_merge", NULL, NULL);
    -    }
    -  }else if (qh MERGEexact)
    -    qh MERGING= True;
    -  if (!qh NOpremerge && qh JOGGLEmax > REALmax/2) {
    -#ifdef qh_NOmerge
    -    qh JOGGLEmax= 0.0;
    -#endif
    -  }
    -  if (qh TRIangulate && qh JOGGLEmax < REALmax/2 && qh PRINTprecision)
    -    qh_fprintf(qh ferr, 7038, "qhull warning: joggle('QJ') always produces simplicial output.  Triangulated output('Qt') does nothing.\n");
    -  if (qh JOGGLEmax < REALmax/2 && qh DELAUNAY && !qh SCALEinput && !qh SCALElast) {
    -    qh SCALElast= True;
    -    qh_option("Qbbound-last-qj", NULL, NULL);
    -  }
    -  if (qh MERGING && !qh POSTmerge && qh premerge_cos > REALmax/2
    -  && qh premerge_centrum == 0) {
    -    qh ZEROcentrum= True;
    -    qh ZEROall_ok= True;
    -    qh_option("_zero-centrum", NULL, NULL);
    -  }
    -  if (qh JOGGLEmax < REALmax/2 && REALepsilon > 2e-8 && qh PRINTprecision)
    -    qh_fprintf(qh ferr, 7039, "qhull warning: real epsilon, %2.2g, is probably too large for joggle('QJn')\nRecompile with double precision reals(see user.h).\n",
    -          REALepsilon);
    -#ifdef qh_NOmerge
    -  if (qh MERGING) {
    -    qh_fprintf(qh ferr, 6045, "qhull input error: merging not installed(qh_NOmerge + 'Qx', 'Cn' or 'An')\n");
    -    qh_errexit(qh_ERRinput, NULL, NULL);
    -  }
    -#endif
    -  if (qh DELAUNAY && qh KEEPcoplanar && !qh KEEPinside) {
    -    qh KEEPinside= True;
    -    qh_option("Qinterior-keep", NULL, NULL);
    -  }
    -  if (qh DELAUNAY && qh HALFspace) {
    -    qh_fprintf(qh ferr, 6046, "qhull input error: can not use Delaunay('d') or Voronoi('v') with halfspace intersection('H')\n");
    -    qh_errexit(qh_ERRinput, NULL, NULL);
    -  }
    -  if (!qh DELAUNAY && (qh UPPERdelaunay || qh ATinfinity)) {
    -    qh_fprintf(qh ferr, 6047, "qhull input error: use upper-Delaunay('Qu') or infinity-point('Qz') with Delaunay('d') or Voronoi('v')\n");
    -    qh_errexit(qh_ERRinput, NULL, NULL);
    -  }
    -  if (qh UPPERdelaunay && qh ATinfinity) {
    -    qh_fprintf(qh ferr, 6048, "qhull input error: can not use infinity-point('Qz') with upper-Delaunay('Qu')\n");
    -    qh_errexit(qh_ERRinput, NULL, NULL);
    -  }
    -  if (qh SCALElast && !qh DELAUNAY && qh PRINTprecision)
    -    qh_fprintf(qh ferr, 7040, "qhull input warning: option 'Qbb' (scale-last-coordinate) is normally used with 'd' or 'v'\n");
    -  qh DOcheckmax= (!qh SKIPcheckmax && qh MERGING );
    -  qh KEEPnearinside= (qh DOcheckmax && !(qh KEEPinside && qh KEEPcoplanar)
    -                          && !qh NOnearinside);
    -  if (qh MERGING)
    -    qh CENTERtype= qh_AScentrum;
    -  else if (qh VORONOI)
    -    qh CENTERtype= qh_ASvoronoi;
    -  if (qh TESTvneighbors && !qh MERGING) {
    -    qh_fprintf(qh ferr, 6049, "qhull input error: test vertex neighbors('Qv') needs a merge option\n");
    -    qh_errexit(qh_ERRinput, NULL ,NULL);
    -  }
    -  if (qh PROJECTinput || (qh DELAUNAY && qh PROJECTdelaunay)) {
    -    qh hull_dim -= qh PROJECTinput;
    -    if (qh DELAUNAY) {
    -      qh hull_dim++;
    -      if (qh ATinfinity)
    -        extra= 1;
    -    }
    -  }
    -  if (qh hull_dim <= 1) {
    -    qh_fprintf(qh ferr, 6050, "qhull error: dimension %d must be > 1\n", qh hull_dim);
    -    qh_errexit(qh_ERRinput, NULL, NULL);
    -  }
    -  for (k=2, factorial=1.0; k < qh hull_dim; k++)
    -    factorial *= k;
    -  qh AREAfactor= 1.0 / factorial;
    -  trace2((qh ferr, 2005, "qh_initqhull_globals: initialize globals.  dim %d numpoints %d malloc? %d projected %d to hull_dim %d\n",
    -        dim, numpoints, ismalloc, qh PROJECTinput, qh hull_dim));
    -  qh normal_size= qh hull_dim * sizeof(coordT);
    -  qh center_size= qh normal_size - sizeof(coordT);
    -  pointsneeded= qh hull_dim+1;
    -  if (qh hull_dim > qh_DIMmergeVertex) {
    -    qh MERGEvertices= False;
    -    qh_option("Q3-no-merge-vertices-dim-high", NULL, NULL);
    -  }
    -  if (qh GOODpoint)
    -    pointsneeded++;
    -#ifdef qh_NOtrace
    -  if (qh IStracing) {
    -    qh_fprintf(qh ferr, 6051, "qhull input error: tracing is not installed(qh_NOtrace in user.h)");
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -#endif
    -  if (qh RERUN > 1) {
    -    qh TRACElastrun= qh IStracing; /* qh_build_withrestart duplicates next conditional */
    -    if (qh IStracing != -1)
    -      qh IStracing= 0;
    -  }else if (qh TRACEpoint != qh_IDunknown || qh TRACEdist < REALmax/2 || qh TRACEmerge) {
    -    qh TRACElevel= (qh IStracing? qh IStracing : 3);
    -    qh IStracing= 0;
    -  }
    -  if (qh ROTATErandom == 0 || qh ROTATErandom == -1) {
    -    seed= (int)time(&timedata);
    -    if (qh ROTATErandom  == -1) {
    -      seed= -seed;
    -      qh_option("QRandom-seed", &seed, NULL );
    -    }else
    -      qh_option("QRotate-random", &seed, NULL);
    -    qh ROTATErandom= seed;
    -  }
    -  seed= qh ROTATErandom;
    -  if (seed == INT_MIN)    /* default value */
    -    seed= 1;
    -  else if (seed < 0)
    -    seed= -seed;
    -  qh_RANDOMseed_(seed);
    -  randr= 0.0;
    -  for (i=1000; i--; ) {
    -    randi= qh_RANDOMint;
    -    randr += randi;
    -    if (randi > qh_RANDOMmax) {
    -      qh_fprintf(qh ferr, 8036, "\
    -qhull configuration error (qh_RANDOMmax in user.h):\n\
    -   random integer %d > qh_RANDOMmax(%.8g)\n",
    -               randi, qh_RANDOMmax);
    -      qh_errexit(qh_ERRinput, NULL, NULL);
    -    }
    -  }
    -  qh_RANDOMseed_(seed);
    -  randr = randr/1000;
    -  if (randr < qh_RANDOMmax * 0.1
    -  || randr > qh_RANDOMmax * 0.9)
    -    qh_fprintf(qh ferr, 8037, "\
    -qhull configuration warning (qh_RANDOMmax in user.h):\n\
    -   average of 1000 random integers (%.2g) is much different than expected (%.2g).\n\
    -   Is qh_RANDOMmax (%.2g) wrong?\n",
    -             randr, qh_RANDOMmax * 0.5, qh_RANDOMmax);
    -  qh RANDOMa= 2.0 * qh RANDOMfactor/qh_RANDOMmax;
    -  qh RANDOMb= 1.0 - qh RANDOMfactor;
    -  if (qh_HASHfactor < 1.1) {
    -    qh_fprintf(qh ferr, 6052, "qhull internal error (qh_initqhull_globals): qh_HASHfactor %d must be at least 1.1.  Qhull uses linear hash probing\n",
    -      qh_HASHfactor);
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -  if (numpoints+extra < pointsneeded) {
    -    qh_fprintf(qh ferr, 6214, "qhull input error: not enough points(%d) to construct initial simplex (need %d)\n",
    -            numpoints, pointsneeded);
    -    qh_errexit(qh_ERRinput, NULL, NULL);
    -  }
    -  qh_initqhull_outputflags();
    -} /* initqhull_globals */
    -
    -/*---------------------------------
    -
    -  qh_initqhull_mem(  )
    -    initialize mem.c for qhull
    -    qh.hull_dim and qh.normal_size determine some of the allocation sizes
    -    if qh.MERGING,
    -      includes ridgeT
    -    calls qh_user_memsizes() to add up to 10 additional sizes for quick allocation
    -      (see numsizes below)
    -
    -  returns:
    -    mem.c already for qh_memalloc/qh_memfree (errors if called beforehand)
    -
    -  notes:
    -    qh_produceoutput() prints memsizes
    -
    -*/
    -void qh_initqhull_mem(void) {
    -  int numsizes;
    -  int i;
    -
    -  numsizes= 8+10;
    -  qh_meminitbuffers(qh IStracing, qh_MEMalign, numsizes,
    -                     qh_MEMbufsize,qh_MEMinitbuf);
    -  qh_memsize((int)sizeof(vertexT));
    -  if (qh MERGING) {
    -    qh_memsize((int)sizeof(ridgeT));
    -    qh_memsize((int)sizeof(mergeT));
    -  }
    -  qh_memsize((int)sizeof(facetT));
    -  i= sizeof(setT) + (qh hull_dim - 1) * SETelemsize;  /* ridge.vertices */
    -  qh_memsize(i);
    -  qh_memsize(qh normal_size);        /* normal */
    -  i += SETelemsize;                 /* facet.vertices, .ridges, .neighbors */
    -  qh_memsize(i);
    -  qh_user_memsizes();
    -  qh_memsetup();
    -} /* initqhull_mem */
    -
    -/*---------------------------------
    -
    -  qh_initqhull_outputflags
    -    initialize flags concerned with output
    -
    -  returns:
    -    adjust user flags as needed
    -
    -  see:
    -    qh_clear_outputflags() resets the flags
    -
    -  design:
    -    test for qh.PRINTgood (i.e., only print 'good' facets)
    -    check for conflicting print output options
    -*/
    -void qh_initqhull_outputflags(void) {
    -  boolT printgeom= False, printmath= False, printcoplanar= False;
    -  int i;
    -
    -  trace3((qh ferr, 3024, "qh_initqhull_outputflags: %s\n", qh qhull_command));
    -  if (!(qh PRINTgood || qh PRINTneighbors)) {
    -    if (qh KEEParea || qh KEEPminArea < REALmax/2 || qh KEEPmerge || qh DELAUNAY
    -        || (!qh ONLYgood && (qh GOODvertex || qh GOODpoint))) {
    -      qh PRINTgood= True;
    -      qh_option("Pgood", NULL, NULL);
    -    }
    -  }
    -  if (qh PRINTtransparent) {
    -    if (qh hull_dim != 4 || !qh DELAUNAY || qh VORONOI || qh DROPdim >= 0) {
    -      qh_fprintf(qh ferr, 6215, "qhull input error: transparent Delaunay('Gt') needs 3-d Delaunay('d') w/o 'GDn'\n");
    -      qh_errexit(qh_ERRinput, NULL, NULL);
    -    }
    -    qh DROPdim = 3;
    -    qh PRINTridges = True;
    -  }
    -  for (i=qh_PRINTEND; i--; ) {
    -    if (qh PRINTout[i] == qh_PRINTgeom)
    -      printgeom= True;
    -    else if (qh PRINTout[i] == qh_PRINTmathematica || qh PRINTout[i] == qh_PRINTmaple)
    -      printmath= True;
    -    else if (qh PRINTout[i] == qh_PRINTcoplanars)
    -      printcoplanar= True;
    -    else if (qh PRINTout[i] == qh_PRINTpointnearest)
    -      printcoplanar= True;
    -    else if (qh PRINTout[i] == qh_PRINTpointintersect && !qh HALFspace) {
    -      qh_fprintf(qh ferr, 6053, "qhull input error: option 'Fp' is only used for \nhalfspace intersection('Hn,n,n').\n");
    -      qh_errexit(qh_ERRinput, NULL, NULL);
    -    }else if (qh PRINTout[i] == qh_PRINTtriangles && (qh HALFspace || qh VORONOI)) {
    -      qh_fprintf(qh ferr, 6054, "qhull input error: option 'Ft' is not available for Voronoi vertices or halfspace intersection\n");
    -      qh_errexit(qh_ERRinput, NULL, NULL);
    -    }else if (qh PRINTout[i] == qh_PRINTcentrums && qh VORONOI) {
    -      qh_fprintf(qh ferr, 6055, "qhull input error: option 'FC' is not available for Voronoi vertices('v')\n");
    -      qh_errexit(qh_ERRinput, NULL, NULL);
    -    }else if (qh PRINTout[i] == qh_PRINTvertices) {
    -      if (qh VORONOI)
    -        qh_option("Fvoronoi", NULL, NULL);
    -      else
    -        qh_option("Fvertices", NULL, NULL);
    -    }
    -  }
    -  if (printcoplanar && qh DELAUNAY && qh JOGGLEmax < REALmax/2) {
    -    if (qh PRINTprecision)
    -      qh_fprintf(qh ferr, 7041, "qhull input warning: 'QJ' (joggle) will usually prevent coincident input sites for options 'Fc' and 'FP'\n");
    -  }
    -  if (printmath && (qh hull_dim > 3 || qh VORONOI)) {
    -    qh_fprintf(qh ferr, 6056, "qhull input error: Mathematica and Maple output is only available for 2-d and 3-d convex hulls and 2-d Delaunay triangulations\n");
    -    qh_errexit(qh_ERRinput, NULL, NULL);
    -  }
    -  if (printgeom) {
    -    if (qh hull_dim > 4) {
    -      qh_fprintf(qh ferr, 6057, "qhull input error: Geomview output is only available for 2-d, 3-d and 4-d\n");
    -      qh_errexit(qh_ERRinput, NULL, NULL);
    -    }
    -    if (qh PRINTnoplanes && !(qh PRINTcoplanar + qh PRINTcentrums
    -     + qh PRINTdots + qh PRINTspheres + qh DOintersections + qh PRINTridges)) {
    -      qh_fprintf(qh ferr, 6058, "qhull input error: no output specified for Geomview\n");
    -      qh_errexit(qh_ERRinput, NULL, NULL);
    -    }
    -    if (qh VORONOI && (qh hull_dim > 3 || qh DROPdim >= 0)) {
    -      qh_fprintf(qh ferr, 6059, "qhull input error: Geomview output for Voronoi diagrams only for 2-d\n");
    -      qh_errexit(qh_ERRinput, NULL, NULL);
    -    }
    -    /* can not warn about furthest-site Geomview output: no lower_threshold */
    -    if (qh hull_dim == 4 && qh DROPdim == -1 &&
    -        (qh PRINTcoplanar || qh PRINTspheres || qh PRINTcentrums)) {
    -      qh_fprintf(qh ferr, 7042, "qhull input warning: coplanars, vertices, and centrums output not\n\
    -available for 4-d output(ignored).  Could use 'GDn' instead.\n");
    -      qh PRINTcoplanar= qh PRINTspheres= qh PRINTcentrums= False;
    -    }
    -  }
    -  if (!qh KEEPcoplanar && !qh KEEPinside && !qh ONLYgood) {
    -    if ((qh PRINTcoplanar && qh PRINTspheres) || printcoplanar) {
    -      if (qh QHULLfinished) {
    -        qh_fprintf(qh ferr, 7072, "qhull output warning: ignoring coplanar points, option 'Qc' was not set for the first run of qhull.\n");
    -      }else {
    -        qh KEEPcoplanar = True;
    -        qh_option("Qcoplanar", NULL, NULL);
    -      }
    -    }
    -  }
    -  qh PRINTdim= qh hull_dim;
    -  if (qh DROPdim >=0) {    /* after Geomview checks */
    -    if (qh DROPdim < qh hull_dim) {
    -      qh PRINTdim--;
    -      if (!printgeom || qh hull_dim < 3)
    -        qh_fprintf(qh ferr, 7043, "qhull input warning: drop dimension 'GD%d' is only available for 3-d/4-d Geomview\n", qh DROPdim);
    -    }else
    -      qh DROPdim= -1;
    -  }else if (qh VORONOI) {
    -    qh DROPdim= qh hull_dim-1;
    -    qh PRINTdim= qh hull_dim-1;
    -  }
    -} /* qh_initqhull_outputflags */
    -
    -/*---------------------------------
    -
    -  qh_initqhull_start( infile, outfile, errfile )
    -    allocate memory if needed and call qh_initqhull_start2()
    -*/
    -void qh_initqhull_start(FILE *infile, FILE *outfile, FILE *errfile) {
    -
    -#if qh_QHpointer
    -  if (qh_qh) {
    -    qh_fprintf(errfile, 6205, "qhull error (qh_initqhull_start): qh_qh already defined.  Call qh_save_qhull() first\n");
    -    qh_exit(qh_ERRqhull);  /* no error handler */
    -  }
    -  if (!(qh_qh= (qhT *)qh_malloc(sizeof(qhT)))) {
    -    qh_fprintf(errfile, 6060, "qhull error (qh_initqhull_start): insufficient memory\n");
    -    qh_exit(qh_ERRmem);  /* no error handler */
    -  }
    -#endif
    -  qh_initstatistics();
    -  qh_initqhull_start2(infile, outfile, errfile);
    -} /* initqhull_start */
    -
    -/*---------------------------------
    -
    -  qh_initqhull_start2( infile, outfile, errfile )
    -    start initialization of qhull
    -    initialize statistics, stdio, default values for global variables
    -    assumes qh_qh is defined
    -  notes:
    -    report errors elsewhere, error handling and g_qhull_output [Qhull.cpp, QhullQh()] not in initialized
    -  see:
    -    qh_maxmin() determines the precision constants
    -    qh_freeqhull2()
    -*/
    -void qh_initqhull_start2(FILE *infile, FILE *outfile, FILE *errfile) {
    -  time_t timedata;
    -  int seed;
    -
    -  qh_CPUclock; /* start the clock(for qh_clock).  One-shot. */
    -#if qh_QHpointer
    -  memset((char *)qh_qh, 0, sizeof(qhT));   /* every field is 0, FALSE, NULL */
    -#else
    -  memset((char *)&qh_qh, 0, sizeof(qhT));
    -#endif
    -  qh ANGLEmerge= True;
    -  qh DROPdim= -1;
    -  qh ferr= errfile;
    -  qh fin= infile;
    -  qh fout= outfile;
    -  qh furthest_id= qh_IDunknown;
    -  qh JOGGLEmax= REALmax;
    -  qh KEEPminArea = REALmax;
    -  qh last_low= REALmax;
    -  qh last_high= REALmax;
    -  qh last_newhigh= REALmax;
    -  qh max_outside= 0.0;
    -  qh max_vertex= 0.0;
    -  qh MAXabs_coord= 0.0;
    -  qh MAXsumcoord= 0.0;
    -  qh MAXwidth= -REALmax;
    -  qh MERGEindependent= True;
    -  qh MINdenom_1= fmax_(1.0/REALmax, REALmin); /* used by qh_scalepoints */
    -  qh MINoutside= 0.0;
    -  qh MINvisible= REALmax;
    -  qh MAXcoplanar= REALmax;
    -  qh outside_err= REALmax;
    -  qh premerge_centrum= 0.0;
    -  qh premerge_cos= REALmax;
    -  qh PRINTprecision= True;
    -  qh PRINTradius= 0.0;
    -  qh postmerge_cos= REALmax;
    -  qh postmerge_centrum= 0.0;
    -  qh ROTATErandom= INT_MIN;
    -  qh MERGEvertices= True;
    -  qh totarea= 0.0;
    -  qh totvol= 0.0;
    -  qh TRACEdist= REALmax;
    -  qh TRACEpoint= qh_IDunknown; /* recompile or use 'TPn' */
    -  qh tracefacet_id= UINT_MAX;  /* recompile to trace a facet */
    -  qh tracevertex_id= UINT_MAX; /* recompile to trace a vertex */
    -  seed= (int)time(&timedata);
    -  qh_RANDOMseed_(seed);
    -  qh run_id= qh_RANDOMint;
    -  if(!qh run_id)
    -      qh run_id++;  /* guarantee non-zero */
    -  qh_option("run-id", &qh run_id, NULL);
    -  strcat(qh qhull, "qhull");
    -} /* initqhull_start2 */
    -
    -/*---------------------------------
    -
    -  qh_initthresholds( commandString )
    -    set thresholds for printing and scaling from commandString
    -
    -  returns:
    -    sets qh.GOODthreshold or qh.SPLITthreshold if 'Pd0D1' used
    -
    -  see:
    -    qh_initflags(), 'Qbk' 'QBk' 'Pdk' and 'PDk'
    -    qh_inthresholds()
    -
    -  design:
    -    for each 'Pdn' or 'PDn' option
    -      check syntax
    -      set qh.lower_threshold or qh.upper_threshold
    -    set qh.GOODthreshold if an unbounded threshold is used
    -    set qh.SPLITthreshold if a bounded threshold is used
    -*/
    -void qh_initthresholds(char *command) {
    -  realT value;
    -  int idx, maxdim, k;
    -  char *s= command; /* non-const due to strtol */
    -  char key;
    -
    -  maxdim= qh input_dim;
    -  if (qh DELAUNAY && (qh PROJECTdelaunay || qh PROJECTinput))
    -    maxdim++;
    -  while (*s) {
    -    if (*s == '-')
    -      s++;
    -    if (*s == 'P') {
    -      s++;
    -      while (*s && !isspace(key= *s++)) {
    -        if (key == 'd' || key == 'D') {
    -          if (!isdigit(*s)) {
    -            qh_fprintf(qh ferr, 7044, "qhull warning: no dimension given for Print option '%c' at: %s.  Ignored\n",
    -                    key, s-1);
    -            continue;
    -          }
    -          idx= qh_strtol(s, &s);
    -          if (idx >= qh hull_dim) {
    -            qh_fprintf(qh ferr, 7045, "qhull warning: dimension %d for Print option '%c' is >= %d.  Ignored\n",
    -                idx, key, qh hull_dim);
    -            continue;
    -          }
    -          if (*s == ':') {
    -            s++;
    -            value= qh_strtod(s, &s);
    -            if (fabs((double)value) > 1.0) {
    -              qh_fprintf(qh ferr, 7046, "qhull warning: value %2.4g for Print option %c is > +1 or < -1.  Ignored\n",
    -                      value, key);
    -              continue;
    -            }
    -          }else
    -            value= 0.0;
    -          if (key == 'd')
    -            qh lower_threshold[idx]= value;
    -          else
    -            qh upper_threshold[idx]= value;
    -        }
    -      }
    -    }else if (*s == 'Q') {
    -      s++;
    -      while (*s && !isspace(key= *s++)) {
    -        if (key == 'b' && *s == 'B') {
    -          s++;
    -          for (k=maxdim; k--; ) {
    -            qh lower_bound[k]= -qh_DEFAULTbox;
    -            qh upper_bound[k]= qh_DEFAULTbox;
    -          }
    -        }else if (key == 'b' && *s == 'b')
    -          s++;
    -        else if (key == 'b' || key == 'B') {
    -          if (!isdigit(*s)) {
    -            qh_fprintf(qh ferr, 7047, "qhull warning: no dimension given for Qhull option %c.  Ignored\n",
    -                    key);
    -            continue;
    -          }
    -          idx= qh_strtol(s, &s);
    -          if (idx >= maxdim) {
    -            qh_fprintf(qh ferr, 7048, "qhull warning: dimension %d for Qhull option %c is >= %d.  Ignored\n",
    -                idx, key, maxdim);
    -            continue;
    -          }
    -          if (*s == ':') {
    -            s++;
    -            value= qh_strtod(s, &s);
    -          }else if (key == 'b')
    -            value= -qh_DEFAULTbox;
    -          else
    -            value= qh_DEFAULTbox;
    -          if (key == 'b')
    -            qh lower_bound[idx]= value;
    -          else
    -            qh upper_bound[idx]= value;
    -        }
    -      }
    -    }else {
    -      while (*s && !isspace(*s))
    -        s++;
    -    }
    -    while (isspace(*s))
    -      s++;
    -  }
    -  for (k=qh hull_dim; k--; ) {
    -    if (qh lower_threshold[k] > -REALmax/2) {
    -      qh GOODthreshold= True;
    -      if (qh upper_threshold[k] < REALmax/2) {
    -        qh SPLITthresholds= True;
    -        qh GOODthreshold= False;
    -        break;
    -      }
    -    }else if (qh upper_threshold[k] < REALmax/2)
    -      qh GOODthreshold= True;
    -  }
    -} /* initthresholds */
    -
    -/*---------------------------------
    -
    -  qh_lib_check( qhullLibraryType, qhTsize, vertexTsize, ridgeTsize, facetTsize, setTsize, qhmemTsize )
    -    Report error if library does not agree with caller
    -
    -  notes:
    -    NOerrors -- qh_lib_check can not call qh_errexit()
    -*/
    -void qh_lib_check(int qhullLibraryType, int qhTsize, int vertexTsize, int ridgeTsize, int facetTsize, int setTsize, int qhmemTsize) {
    -    boolT iserror= False;
    -
    -#if defined(_MSC_VER) && defined(_DEBUG) && defined(QHULL_CRTDBG)  /* user_r.h */
    -    // _CrtSetBreakAlloc(744);  /* Break at memalloc {744}, or 'watch' _crtBreakAlloc */
    -    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_DELAY_FREE_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) );
    -    _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG );
    -    _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDERR );
    -    _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG );
    -    _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDERR );
    -    _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG );
    -    _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDERR );
    -#endif
    -
    -    if (qhullLibraryType==QHULL_NON_REENTRANT) { /* 0 */
    -        if (qh_QHpointer) {
    -            qh_fprintf_stderr(6246, "qh_lib_check: Incorrect qhull library called.  Caller uses a static qhT while library uses a dynamic qhT via qh_QHpointer.  Both caller and library are non-reentrant.\n");
    -            iserror= True;
    -        }
    -    }else if (qhullLibraryType==QHULL_QH_POINTER) { /* 1 */
    -        if (!qh_QHpointer) {
    -            qh_fprintf_stderr(6247, "qh_lib_check: Incorrect qhull library called.  Caller uses a dynamic qhT via qh_QHpointer while library uses a static qhT.  Both caller and library are non-reentrant.\n");
    -            iserror= True;
    -        }
    -    }else if (qhullLibraryType==QHULL_REENTRANT) { /* 2 */
    -        qh_fprintf_stderr(6248, "qh_lib_check: Incorrect qhull library called.  Caller uses reentrant Qhull while library is non-reentrant\n");
    -        iserror= True;
    -    }else{
    -        qh_fprintf_stderr(6262, "qh_lib_check: Expecting qhullLibraryType QHULL_NON_REENTRANT(0), QHULL_QH_POINTER(1), or QHULL_REENTRANT(2).  Got %d\n", qhullLibraryType);
    -        iserror= True;
    -    }
    -    if (qhTsize != sizeof(qhT)) {
    -        qh_fprintf_stderr(6249, "qh_lib_check: Incorrect qhull library called.  Size of qhT for caller is %d, but for library is %d.\n", qhTsize, sizeof(qhT));
    -        iserror= True;
    -    }
    -    if (vertexTsize != sizeof(vertexT)) {
    -        qh_fprintf_stderr(6250, "qh_lib_check: Incorrect qhull library called.  Size of vertexT for caller is %d, but for library is %d.\n", vertexTsize, sizeof(vertexT));
    -        iserror= True;
    -    }
    -    if (ridgeTsize != sizeof(ridgeT)) {
    -        qh_fprintf_stderr(6251, "qh_lib_check: Incorrect qhull library called.  Size of ridgeT for caller is %d, but for library is %d.\n", ridgeTsize, sizeof(ridgeT));
    -        iserror= True;
    -    }
    -    if (facetTsize != sizeof(facetT)) {
    -        qh_fprintf_stderr(6252, "qh_lib_check: Incorrect qhull library called.  Size of facetT for caller is %d, but for library is %d.\n", facetTsize, sizeof(facetT));
    -        iserror= True;
    -    }
    -    if (setTsize && setTsize != sizeof(setT)) {
    -        qh_fprintf_stderr(6253, "qh_lib_check: Incorrect qhull library called.  Size of setT for caller is %d, but for library is %d.\n", setTsize, sizeof(setT));
    -        iserror= True;
    -    }
    -    if (qhmemTsize && qhmemTsize != sizeof(qhmemT)) {
    -        qh_fprintf_stderr(6254, "qh_lib_check: Incorrect qhull library called.  Size of qhmemT for caller is %d, but for library is %d.\n", qhmemTsize, sizeof(qhmemT));
    -        iserror= True;
    -    }
    -    if (iserror) {
    -        if(qh_QHpointer){
    -            qh_fprintf_stderr(6255, "qh_lib_check: Cannot continue.  Library '%s' uses a dynamic qhT via qh_QHpointer (e.g., qhull_p.so)\n", qh_version2);
    -        }else{
    -            qh_fprintf_stderr(6256, "qh_lib_check: Cannot continue.  Library '%s' uses a static qhT (e.g., libqhull.so)\n", qh_version2);
    -        }
    -        qh_exit(qh_ERRqhull);  /* can not use qh_errexit() */
    -    }
    -} /* lib_check */
    -
    -/*---------------------------------
    -
    -  qh_option( option, intVal, realVal )
    -    add an option description to qh.qhull_options
    -
    -  notes:
    -    NOerrors -- qh_option can not call qh_errexit() [qh_initqhull_start2]
    -    will be printed with statistics ('Ts') and errors
    -    strlen(option) < 40
    -*/
    -void qh_option(const char *option, int *i, realT *r) {
    -  char buf[200];
    -  int len, maxlen;
    -
    -  sprintf(buf, "  %s", option);
    -  if (i)
    -    sprintf(buf+strlen(buf), " %d", *i);
    -  if (r)
    -    sprintf(buf+strlen(buf), " %2.2g", *r);
    -  len= (int)strlen(buf);  /* WARN64 */
    -  qh qhull_optionlen += len;
    -  maxlen= sizeof(qh qhull_options) - len -1;
    -  maximize_(maxlen, 0);
    -  if (qh qhull_optionlen >= qh_OPTIONline && maxlen > 0) {
    -    qh qhull_optionlen= len;
    -    strncat(qh qhull_options, "\n", (size_t)(maxlen--));
    -  }
    -  strncat(qh qhull_options, buf, (size_t)maxlen);
    -} /* option */
    -
    -#if qh_QHpointer
    -/*---------------------------------
    -
    -  qh_restore_qhull( oldqh )
    -    restores a previously saved qhull
    -    also restores qh_qhstat and qhmem.tempstack
    -    Sets *oldqh to NULL
    -  notes:
    -    errors if current qhull hasn't been saved or freed
    -    uses qhmem for error reporting
    -
    -  NOTE 1998/5/11:
    -    Freeing memory after qh_save_qhull and qh_restore_qhull
    -    is complicated.  The procedures will be redesigned.
    -
    -  see:
    -    qh_save_qhull(), UsingLibQhull
    -*/
    -void qh_restore_qhull(qhT **oldqh) {
    -
    -  if (*oldqh && strcmp((*oldqh)->qhull, "qhull")) {
    -    qh_fprintf(qhmem.ferr, 6061, "qhull internal error (qh_restore_qhull): %p is not a qhull data structure\n",
    -                  *oldqh);
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -  if (qh_qh) {
    -    qh_fprintf(qhmem.ferr, 6062, "qhull internal error (qh_restore_qhull): did not save or free existing qhull\n");
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -  if (!*oldqh || !(*oldqh)->old_qhstat) {
    -    qh_fprintf(qhmem.ferr, 6063, "qhull internal error (qh_restore_qhull): did not previously save qhull %p\n",
    -                  *oldqh);
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -  qh_qh= *oldqh;
    -  *oldqh= NULL;
    -  qh_qhstat= qh old_qhstat;
    -  qhmem.tempstack= qh old_tempstack;
    -  qh old_qhstat= 0;
    -  qh old_tempstack= 0;
    -  trace1((qh ferr, 1007, "qh_restore_qhull: restored qhull from %p\n", *oldqh));
    -} /* restore_qhull */
    -
    -/*---------------------------------
    -
    -  qh_save_qhull(  )
    -    saves qhull for a later qh_restore_qhull
    -    also saves qh_qhstat and qhmem.tempstack
    -
    -  returns:
    -    qh_qh=NULL
    -
    -  notes:
    -    need to initialize qhull or call qh_restore_qhull before continuing
    -
    -  NOTE 1998/5/11:
    -    Freeing memory after qh_save_qhull and qh_restore_qhull
    -    is complicated.  The procedures will be redesigned.
    -
    -  see:
    -    qh_restore_qhull()
    -*/
    -qhT *qh_save_qhull(void) {
    -  qhT *oldqh;
    -
    -  trace1((qhmem.ferr, 1045, "qh_save_qhull: save qhull %p\n", qh_qh));
    -  if (!qh_qh) {
    -    qh_fprintf(qhmem.ferr, 6064, "qhull internal error (qh_save_qhull): qhull not initialized\n");
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -  qh old_qhstat= qh_qhstat;
    -  qh_qhstat= NULL;
    -  qh old_tempstack= qhmem.tempstack;
    -  qhmem.tempstack= NULL;
    -  oldqh= qh_qh;
    -  qh_qh= NULL;
    -  return oldqh;
    -} /* save_qhull */
    -
    -#endif
    -
    diff --git a/src/qhull/src/libqhull/index.htm b/src/qhull/src/libqhull/index.htm
    deleted file mode 100644
    index 62b9d99701d..00000000000
    --- a/src/qhull/src/libqhull/index.htm
    +++ /dev/null
    @@ -1,264 +0,0 @@
    -
    -
    -
    -
    -Qhull functions, macros, and data structures
    -
    -
    -
    -
    -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code
    -To: Qhull files
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser - -


    - - -

    Qhull functions, macros, and data structures

    -
    -

    The following sections provide an overview and index to -Qhull's functions, macros, and data structures. -Each section starts with an introduction. -See also Calling -Qhull from C programs and Calling Qhull from C++ programs.

    - -

    Qhull uses the following conventions:

    -
    - -
      -
    • in code, global variables start with "qh " -
    • in documentation, global variables start with 'qh.' -
    • constants start with an upper case word -
    • important globals include an '_' -
    • functions, macros, and constants start with "qh_"
    • -
    • data types end in "T"
    • -
    • macros with arguments end in "_"
    • -
    • iterators are macros that use local variables
    • -
    • iterators for sets start with "FOREACH"
    • -
    • iterators for lists start with "FORALL"
    • -
    • qhull options are in single quotes (e.g., 'Pdn')
    • -
    • lists are sorted alphabetically
    • -
    • preprocessor directives on left margin for older compilers
    • -
    -
    -

    -When reading the code, please note that the -global data structure, 'qh', is a macro. It -either expands to "qh_qh." or to -"qh_qh->". The later is used for -applications which run concurrent calls to qh_qhull(). -

    -When reading code with an editor, a search for -'"function' -will locate the header of qh_function. A search for '* function' -will locate the tail of qh_function. - -

    A useful starting point is libqhull.h. It defines most -of Qhull data structures and top-level functions. Search for 'PFn' to -determine the corresponding constant in Qhull. Search for 'Fp' to -determine the corresponding qh_PRINT... constant. -Search io.c to learn how the print function is implemented.

    - -

    If your web browser is configured for .c and .h files, the function, macro, and data type links -go to the corresponding source location. To configure your web browser for .c and .h files. -

      -
    • In the Download Preferences or Options panel, add file extensions 'c' and 'h' to mime type 'text/html'. -
    • Opera 12.10 -
        -
      1. In Tools > Preferences > Advanced > Downloads -
      2. Uncheck 'Hide file types opened with Opera' -
      3. Quick find 'html' -
      4. Select 'text/html' > Edit -
      5. Add File extensions 'c,h,' -
      6. Click 'OK' -
      -
    • Internet Explorer -- Mime types are not available from 'Internet Options'. Is there a registry key for these settings? -
    • Firefox -- Mime types are not available from 'Preferences'. Is there an add-on to change the file extensions for a mime type? -
    • Chrome -- Can Chrome be configured? -
    - -

    -Please report documentation and link errors -to qhull-bug@qhull.org. -

    - -

    Copyright © 1997-2015 C.B. Barber

    - -
    - -

    »Qhull files

    -
    - -

    This sections lists the .c and .h files for Qhull. Please -refer to these files for detailed information.

    -
    - -
    -
    Makefile, CMakeLists.txt
    -
    Makefile is preconfigured for gcc. CMakeLists.txt supports multiple -platforms with CMake. -Qhull includes project files for Visual Studio and Qt. -
    - -
     
    -
    libqhull.h
    -
    Include file for the Qhull library (libqhull.so, qhull.dll, libqhullstatic.a). -Data structures are documented under Poly. -Global variables are documented under Global. -Other data structures and variables are documented under -Qhull or Geom.
    - -
     
    -
    Geom, -geom.h, -geom.c, -geom2.c, -random.c, -random.h
    -
    Geometric routines. These routines implement mathematical -functions such as Gaussian elimination and geometric -routines needed for Qhull. Frequently used routines are -in geom.c while infrequent ones are in geom2.c. -
    - -
     
    -
    Global, -global.c, -libqhull.h
    -
    Global routines. Qhull uses a global data structure, qh, -to store globally defined constants, lists, sets, and -variables. -global.c initializes and frees these -structures.
    - -
     
    -
    Io, io.h, -io.c
    -
    Input and output routines. Qhull provides a wide range of -input and output options.
    - -
     
    -
    Mem, -mem.h, -mem.c
    -
    Memory routines. Qhull provides memory allocation and -deallocation. It uses quick-fit allocation.
    - -
     
    -
    Merge, -merge.h, -merge.c
    -
    Merge routines. Qhull handles precision problems by -merged facets or joggled input. These routines merge simplicial facets, -merge non-simplicial facets, merge cycles of facets, and -rename redundant vertices.
    - -
     
    -
    Poly, -poly.h, -poly.c, -poly2.c, -libqhull.h
    -
    Polyhedral routines. Qhull produces a polyhedron as a -list of facets with vertices, neighbors, ridges, and -geometric information. libqhull.h defines the main -data structures. Frequently used routines are in poly.c -while infrequent ones are in poly2.c.
    - -
     
    -
    Qhull, -libqhull.c, -libqhull.h, -qhull_a.h, -unix.c , -qconvex.c , -qdelaun.c , -qhalf.c , -qvoronoi.c
    -
    Top-level routines. The Quickhull algorithm is -implemented by libqhull.c. qhull_a.h -includes all header files.
    - -
     
    -
    Set, -qset.h, -qset.c
    -
    Set routines. Qhull implements its data structures as -sets. A set is an array of pointers that is expanded as -needed. This is a separate package that may be used in -other applications.
    - -
     
    -
    Stat, -stat.h, -stat.c
    -
    Statistical routines. Qhull maintains statistics about -its implementation.
    - -
     
    -
    User, -user.h, -user.c, -user_eg.c, -user_eg2.c, -
    -
    User-defined routines. Qhull allows the user to configure -the code with defined constants and specialized routines. -
    -
    -
    - -
    -

    -
    -

    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull files
    -To: Geom • -GlobalIo -• MemMerge -• PolyQhull -• SetStat -• User
    - -

    -
    -

    The -Geometry Center Home Page

    -

    Comments to: qhull@qhull.org -
    -Created: May 2, 1997 --- Last modified: see top

    - - diff --git a/src/qhull/src/libqhull/io.c b/src/qhull/src/libqhull/io.c deleted file mode 100644 index 401987ec082..00000000000 --- a/src/qhull/src/libqhull/io.c +++ /dev/null @@ -1,4062 +0,0 @@ -/*
      ---------------------------------
    -
    -   io.c
    -   Input/Output routines of qhull application
    -
    -   see qh-io.htm and io.h
    -
    -   see user.c for qh_errprint and qh_printfacetlist
    -
    -   unix.c calls qh_readpoints and qh_produce_output
    -
    -   unix.c and user.c are the only callers of io.c functions
    -   This allows the user to avoid loading io.o from qhull.a
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull/io.c#5 $$Change: 2064 $
    -   $DateTime: 2016/01/18 12:36:08 $$Author: bbarber $
    -*/
    -
    -#include "qhull_a.h"
    -
    -/*========= -functions in alphabetical order after qh_produce_output()  =====*/
    -
    -/*---------------------------------
    -
    -  qh_produce_output()
    -  qh_produce_output2()
    -    prints out the result of qhull in desired format
    -    qh_produce_output2() does not call qh_prepare_output()
    -    if qh.GETarea
    -      computes and prints area and volume
    -    qh.PRINTout[] is an array of output formats
    -
    -  notes:
    -    prints output in qh.PRINTout order
    -*/
    -void qh_produce_output(void) {
    -    int tempsize= qh_setsize(qhmem.tempstack);
    -
    -    qh_prepare_output();
    -    qh_produce_output2();
    -    if (qh_setsize(qhmem.tempstack) != tempsize) {
    -        qh_fprintf(qh ferr, 6206, "qhull internal error (qh_produce_output): temporary sets not empty(%d)\n",
    -            qh_setsize(qhmem.tempstack));
    -        qh_errexit(qh_ERRqhull, NULL, NULL);
    -    }
    -} /* produce_output */
    -
    -
    -void qh_produce_output2(void) {
    -  int i, tempsize= qh_setsize(qhmem.tempstack), d_1;
    -
    -  if (qh PRINTsummary)
    -    qh_printsummary(qh ferr);
    -  else if (qh PRINTout[0] == qh_PRINTnone)
    -    qh_printsummary(qh fout);
    -  for (i=0; i < qh_PRINTEND; i++)
    -    qh_printfacets(qh fout, qh PRINTout[i], qh facet_list, NULL, !qh_ALL);
    -  qh_allstatistics();
    -  if (qh PRINTprecision && !qh MERGING && (qh JOGGLEmax > REALmax/2 || qh RERUN))
    -    qh_printstats(qh ferr, qhstat precision, NULL);
    -  if (qh VERIFYoutput && (zzval_(Zridge) > 0 || zzval_(Zridgemid) > 0))
    -    qh_printstats(qh ferr, qhstat vridges, NULL);
    -  if (qh PRINTstatistics) {
    -    qh_printstatistics(qh ferr, "");
    -    qh_memstatistics(qh ferr);
    -    d_1= sizeof(setT) + (qh hull_dim - 1) * SETelemsize;
    -    qh_fprintf(qh ferr, 8040, "\
    -    size in bytes: merge %d ridge %d vertex %d facet %d\n\
    -         normal %d ridge vertices %d facet vertices or neighbors %d\n",
    -            (int)sizeof(mergeT), (int)sizeof(ridgeT),
    -            (int)sizeof(vertexT), (int)sizeof(facetT),
    -            qh normal_size, d_1, d_1 + SETelemsize);
    -  }
    -  if (qh_setsize(qhmem.tempstack) != tempsize) {
    -    qh_fprintf(qh ferr, 6065, "qhull internal error (qh_produce_output2): temporary sets not empty(%d)\n",
    -             qh_setsize(qhmem.tempstack));
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -} /* produce_output2 */
    -
    -/*---------------------------------
    -
    -  qh_dfacet( id )
    -    print facet by id, for debugging
    -
    -*/
    -void qh_dfacet(unsigned id) {
    -  facetT *facet;
    -
    -  FORALLfacets {
    -    if (facet->id == id) {
    -      qh_printfacet(qh fout, facet);
    -      break;
    -    }
    -  }
    -} /* dfacet */
    -
    -
    -/*---------------------------------
    -
    -  qh_dvertex( id )
    -    print vertex by id, for debugging
    -*/
    -void qh_dvertex(unsigned id) {
    -  vertexT *vertex;
    -
    -  FORALLvertices {
    -    if (vertex->id == id) {
    -      qh_printvertex(qh fout, vertex);
    -      break;
    -    }
    -  }
    -} /* dvertex */
    -
    -
    -/*---------------------------------
    -
    -  qh_compare_facetarea( p1, p2 )
    -    used by qsort() to order facets by area
    -*/
    -int qh_compare_facetarea(const void *p1, const void *p2) {
    -  const facetT *a= *((facetT *const*)p1), *b= *((facetT *const*)p2);
    -
    -  if (!a->isarea)
    -    return -1;
    -  if (!b->isarea)
    -    return 1;
    -  if (a->f.area > b->f.area)
    -    return 1;
    -  else if (a->f.area == b->f.area)
    -    return 0;
    -  return -1;
    -} /* compare_facetarea */
    -
    -/*---------------------------------
    -
    -  qh_compare_facetmerge( p1, p2 )
    -    used by qsort() to order facets by number of merges
    -*/
    -int qh_compare_facetmerge(const void *p1, const void *p2) {
    -  const facetT *a= *((facetT *const*)p1), *b= *((facetT *const*)p2);
    -
    -  return(a->nummerge - b->nummerge);
    -} /* compare_facetvisit */
    -
    -/*---------------------------------
    -
    -  qh_compare_facetvisit( p1, p2 )
    -    used by qsort() to order facets by visit id or id
    -*/
    -int qh_compare_facetvisit(const void *p1, const void *p2) {
    -  const facetT *a= *((facetT *const*)p1), *b= *((facetT *const*)p2);
    -  int i,j;
    -
    -  if (!(i= a->visitid))
    -    i= 0 - a->id; /* do not convert to int, sign distinguishes id from visitid */
    -  if (!(j= b->visitid))
    -    j= 0 - b->id;
    -  return(i - j);
    -} /* compare_facetvisit */
    -
    -/*---------------------------------
    -
    -  qh_compare_vertexpoint( p1, p2 )
    -    used by qsort() to order vertices by point id
    -
    -  Not used.  Not available in libqhull_r.h since qh_pointid depends on qh
    -*/
    -int qh_compare_vertexpoint(const void *p1, const void *p2) {
    -  const vertexT *a= *((vertexT *const*)p1), *b= *((vertexT *const*)p2);
    -
    -  return((qh_pointid(a->point) > qh_pointid(b->point)?1:-1));
    -} /* compare_vertexpoint */
    -
    -/*---------------------------------
    -
    -  qh_copyfilename( dest, size, source, length )
    -    copy filename identified by qh_skipfilename()
    -
    -  notes:
    -    see qh_skipfilename() for syntax
    -*/
    -void qh_copyfilename(char *filename, int size, const char* source, int length) {
    -  char c= *source;
    -
    -  if (length > size + 1) {
    -      qh_fprintf(qh ferr, 6040, "qhull error: filename is more than %d characters, %s\n",  size-1, source);
    -      qh_errexit(qh_ERRinput, NULL, NULL);
    -  }
    -  strncpy(filename, source, length);
    -  filename[length]= '\0';
    -  if (c == '\'' || c == '"') {
    -    char *s= filename + 1;
    -    char *t= filename;
    -    while (*s) {
    -      if (*s == c) {
    -          if (s[-1] == '\\')
    -              t[-1]= c;
    -      }else
    -          *t++= *s;
    -      s++;
    -    }
    -    *t= '\0';
    -  }
    -} /* copyfilename */
    -
    -/*---------------------------------
    -
    -  qh_countfacets( facetlist, facets, printall,
    -          numfacets, numsimplicial, totneighbors, numridges, numcoplanar, numtricoplanars  )
    -    count good facets for printing and set visitid
    -    if allfacets, ignores qh_skipfacet()
    -
    -  notes:
    -    qh_printsummary and qh_countfacets must match counts
    -
    -  returns:
    -    numfacets, numsimplicial, total neighbors, numridges, coplanars
    -    each facet with ->visitid indicating 1-relative position
    -      ->visitid==0 indicates not good
    -
    -  notes
    -    numfacets >= numsimplicial
    -    if qh.NEWfacets,
    -      does not count visible facets (matches qh_printafacet)
    -
    -  design:
    -    for all facets on facetlist and in facets set
    -      unless facet is skipped or visible (i.e., will be deleted)
    -        mark facet->visitid
    -        update counts
    -*/
    -void qh_countfacets(facetT *facetlist, setT *facets, boolT printall,
    -    int *numfacetsp, int *numsimplicialp, int *totneighborsp, int *numridgesp, int *numcoplanarsp, int *numtricoplanarsp) {
    -  facetT *facet, **facetp;
    -  int numfacets= 0, numsimplicial= 0, numridges= 0, totneighbors= 0, numcoplanars= 0, numtricoplanars= 0;
    -
    -  FORALLfacet_(facetlist) {
    -    if ((facet->visible && qh NEWfacets)
    -    || (!printall && qh_skipfacet(facet)))
    -      facet->visitid= 0;
    -    else {
    -      facet->visitid= ++numfacets;
    -      totneighbors += qh_setsize(facet->neighbors);
    -      if (facet->simplicial) {
    -        numsimplicial++;
    -        if (facet->keepcentrum && facet->tricoplanar)
    -          numtricoplanars++;
    -      }else
    -        numridges += qh_setsize(facet->ridges);
    -      if (facet->coplanarset)
    -        numcoplanars += qh_setsize(facet->coplanarset);
    -    }
    -  }
    -
    -  FOREACHfacet_(facets) {
    -    if ((facet->visible && qh NEWfacets)
    -    || (!printall && qh_skipfacet(facet)))
    -      facet->visitid= 0;
    -    else {
    -      facet->visitid= ++numfacets;
    -      totneighbors += qh_setsize(facet->neighbors);
    -      if (facet->simplicial){
    -        numsimplicial++;
    -        if (facet->keepcentrum && facet->tricoplanar)
    -          numtricoplanars++;
    -      }else
    -        numridges += qh_setsize(facet->ridges);
    -      if (facet->coplanarset)
    -        numcoplanars += qh_setsize(facet->coplanarset);
    -    }
    -  }
    -  qh visit_id += numfacets+1;
    -  *numfacetsp= numfacets;
    -  *numsimplicialp= numsimplicial;
    -  *totneighborsp= totneighbors;
    -  *numridgesp= numridges;
    -  *numcoplanarsp= numcoplanars;
    -  *numtricoplanarsp= numtricoplanars;
    -} /* countfacets */
    -
    -/*---------------------------------
    -
    -  qh_detvnorm( vertex, vertexA, centers, offset )
    -    compute separating plane of the Voronoi diagram for a pair of input sites
    -    centers= set of facets (i.e., Voronoi vertices)
    -      facet->visitid= 0 iff vertex-at-infinity (i.e., unbounded)
    -
    -  assumes:
    -    qh_ASvoronoi and qh_vertexneighbors() already set
    -
    -  returns:
    -    norm
    -      a pointer into qh.gm_matrix to qh.hull_dim-1 reals
    -      copy the data before reusing qh.gm_matrix
    -    offset
    -      if 'QVn'
    -        sign adjusted so that qh.GOODvertexp is inside
    -      else
    -        sign adjusted so that vertex is inside
    -
    -    qh.gm_matrix= simplex of points from centers relative to first center
    -
    -  notes:
    -    in io.c so that code for 'v Tv' can be removed by removing io.c
    -    returns pointer into qh.gm_matrix to avoid tracking of temporary memory
    -
    -  design:
    -    determine midpoint of input sites
    -    build points as the set of Voronoi vertices
    -    select a simplex from points (if necessary)
    -      include midpoint if the Voronoi region is unbounded
    -    relocate the first vertex of the simplex to the origin
    -    compute the normalized hyperplane through the simplex
    -    orient the hyperplane toward 'QVn' or 'vertex'
    -    if 'Tv' or 'Ts'
    -      if bounded
    -        test that hyperplane is the perpendicular bisector of the input sites
    -      test that Voronoi vertices not in the simplex are still on the hyperplane
    -    free up temporary memory
    -*/
    -pointT *qh_detvnorm(vertexT *vertex, vertexT *vertexA, setT *centers, realT *offsetp) {
    -  facetT *facet, **facetp;
    -  int  i, k, pointid, pointidA, point_i, point_n;
    -  setT *simplex= NULL;
    -  pointT *point, **pointp, *point0, *midpoint, *normal, *inpoint;
    -  coordT *coord, *gmcoord, *normalp;
    -  setT *points= qh_settemp(qh TEMPsize);
    -  boolT nearzero= False;
    -  boolT unbounded= False;
    -  int numcenters= 0;
    -  int dim= qh hull_dim - 1;
    -  realT dist, offset, angle, zero= 0.0;
    -
    -  midpoint= qh gm_matrix + qh hull_dim * qh hull_dim;  /* last row */
    -  for (k=0; k < dim; k++)
    -    midpoint[k]= (vertex->point[k] + vertexA->point[k])/2;
    -  FOREACHfacet_(centers) {
    -    numcenters++;
    -    if (!facet->visitid)
    -      unbounded= True;
    -    else {
    -      if (!facet->center)
    -        facet->center= qh_facetcenter(facet->vertices);
    -      qh_setappend(&points, facet->center);
    -    }
    -  }
    -  if (numcenters > dim) {
    -    simplex= qh_settemp(qh TEMPsize);
    -    qh_setappend(&simplex, vertex->point);
    -    if (unbounded)
    -      qh_setappend(&simplex, midpoint);
    -    qh_maxsimplex(dim, points, NULL, 0, &simplex);
    -    qh_setdelnth(simplex, 0);
    -  }else if (numcenters == dim) {
    -    if (unbounded)
    -      qh_setappend(&points, midpoint);
    -    simplex= points;
    -  }else {
    -    qh_fprintf(qh ferr, 6216, "qhull internal error (qh_detvnorm): too few points(%d) to compute separating plane\n", numcenters);
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -  i= 0;
    -  gmcoord= qh gm_matrix;
    -  point0= SETfirstt_(simplex, pointT);
    -  FOREACHpoint_(simplex) {
    -    if (qh IStracing >= 4)
    -      qh_printmatrix(qh ferr, "qh_detvnorm: Voronoi vertex or midpoint",
    -                              &point, 1, dim);
    -    if (point != point0) {
    -      qh gm_row[i++]= gmcoord;
    -      coord= point0;
    -      for (k=dim; k--; )
    -        *(gmcoord++)= *point++ - *coord++;
    -    }
    -  }
    -  qh gm_row[i]= gmcoord;  /* does not overlap midpoint, may be used later for qh_areasimplex */
    -  normal= gmcoord;
    -  qh_sethyperplane_gauss(dim, qh gm_row, point0, True,
    -                normal, &offset, &nearzero);
    -  if (qh GOODvertexp == vertexA->point)
    -    inpoint= vertexA->point;
    -  else
    -    inpoint= vertex->point;
    -  zinc_(Zdistio);
    -  dist= qh_distnorm(dim, inpoint, normal, &offset);
    -  if (dist > 0) {
    -    offset= -offset;
    -    normalp= normal;
    -    for (k=dim; k--; ) {
    -      *normalp= -(*normalp);
    -      normalp++;
    -    }
    -  }
    -  if (qh VERIFYoutput || qh PRINTstatistics) {
    -    pointid= qh_pointid(vertex->point);
    -    pointidA= qh_pointid(vertexA->point);
    -    if (!unbounded) {
    -      zinc_(Zdiststat);
    -      dist= qh_distnorm(dim, midpoint, normal, &offset);
    -      if (dist < 0)
    -        dist= -dist;
    -      zzinc_(Zridgemid);
    -      wwmax_(Wridgemidmax, dist);
    -      wwadd_(Wridgemid, dist);
    -      trace4((qh ferr, 4014, "qh_detvnorm: points %d %d midpoint dist %2.2g\n",
    -                 pointid, pointidA, dist));
    -      for (k=0; k < dim; k++)
    -        midpoint[k]= vertexA->point[k] - vertex->point[k];  /* overwrites midpoint! */
    -      qh_normalize(midpoint, dim, False);
    -      angle= qh_distnorm(dim, midpoint, normal, &zero); /* qh_detangle uses dim+1 */
    -      if (angle < 0.0)
    -        angle= angle + 1.0;
    -      else
    -        angle= angle - 1.0;
    -      if (angle < 0.0)
    -        angle -= angle;
    -      trace4((qh ferr, 4015, "qh_detvnorm: points %d %d angle %2.2g nearzero %d\n",
    -                 pointid, pointidA, angle, nearzero));
    -      if (nearzero) {
    -        zzinc_(Zridge0);
    -        wwmax_(Wridge0max, angle);
    -        wwadd_(Wridge0, angle);
    -      }else {
    -        zzinc_(Zridgeok)
    -        wwmax_(Wridgeokmax, angle);
    -        wwadd_(Wridgeok, angle);
    -      }
    -    }
    -    if (simplex != points) {
    -      FOREACHpoint_i_(points) {
    -        if (!qh_setin(simplex, point)) {
    -          facet= SETelemt_(centers, point_i, facetT);
    -          zinc_(Zdiststat);
    -          dist= qh_distnorm(dim, point, normal, &offset);
    -          if (dist < 0)
    -            dist= -dist;
    -          zzinc_(Zridge);
    -          wwmax_(Wridgemax, dist);
    -          wwadd_(Wridge, dist);
    -          trace4((qh ferr, 4016, "qh_detvnorm: points %d %d Voronoi vertex %d dist %2.2g\n",
    -                             pointid, pointidA, facet->visitid, dist));
    -        }
    -      }
    -    }
    -  }
    -  *offsetp= offset;
    -  if (simplex != points)
    -    qh_settempfree(&simplex);
    -  qh_settempfree(&points);
    -  return normal;
    -} /* detvnorm */
    -
    -/*---------------------------------
    -
    -  qh_detvridge( vertexA )
    -    determine Voronoi ridge from 'seen' neighbors of vertexA
    -    include one vertex-at-infinite if an !neighbor->visitid
    -
    -  returns:
    -    temporary set of centers (facets, i.e., Voronoi vertices)
    -    sorted by center id
    -*/
    -setT *qh_detvridge(vertexT *vertex) {
    -  setT *centers= qh_settemp(qh TEMPsize);
    -  setT *tricenters= qh_settemp(qh TEMPsize);
    -  facetT *neighbor, **neighborp;
    -  boolT firstinf= True;
    -
    -  FOREACHneighbor_(vertex) {
    -    if (neighbor->seen) {
    -      if (neighbor->visitid) {
    -        if (!neighbor->tricoplanar || qh_setunique(&tricenters, neighbor->center))
    -          qh_setappend(¢ers, neighbor);
    -      }else if (firstinf) {
    -        firstinf= False;
    -        qh_setappend(¢ers, neighbor);
    -      }
    -    }
    -  }
    -  qsort(SETaddr_(centers, facetT), (size_t)qh_setsize(centers),
    -             sizeof(facetT *), qh_compare_facetvisit);
    -  qh_settempfree(&tricenters);
    -  return centers;
    -} /* detvridge */
    -
    -/*---------------------------------
    -
    -  qh_detvridge3( atvertex, vertex )
    -    determine 3-d Voronoi ridge from 'seen' neighbors of atvertex and vertex
    -    include one vertex-at-infinite for !neighbor->visitid
    -    assumes all facet->seen2= True
    -
    -  returns:
    -    temporary set of centers (facets, i.e., Voronoi vertices)
    -    listed in adjacency order (!oriented)
    -    all facet->seen2= True
    -
    -  design:
    -    mark all neighbors of atvertex
    -    for each adjacent neighbor of both atvertex and vertex
    -      if neighbor selected
    -        add neighbor to set of Voronoi vertices
    -*/
    -setT *qh_detvridge3(vertexT *atvertex, vertexT *vertex) {
    -  setT *centers= qh_settemp(qh TEMPsize);
    -  setT *tricenters= qh_settemp(qh TEMPsize);
    -  facetT *neighbor, **neighborp, *facet= NULL;
    -  boolT firstinf= True;
    -
    -  FOREACHneighbor_(atvertex)
    -    neighbor->seen2= False;
    -  FOREACHneighbor_(vertex) {
    -    if (!neighbor->seen2) {
    -      facet= neighbor;
    -      break;
    -    }
    -  }
    -  while (facet) {
    -    facet->seen2= True;
    -    if (neighbor->seen) {
    -      if (facet->visitid) {
    -        if (!facet->tricoplanar || qh_setunique(&tricenters, facet->center))
    -          qh_setappend(¢ers, facet);
    -      }else if (firstinf) {
    -        firstinf= False;
    -        qh_setappend(¢ers, facet);
    -      }
    -    }
    -    FOREACHneighbor_(facet) {
    -      if (!neighbor->seen2) {
    -        if (qh_setin(vertex->neighbors, neighbor))
    -          break;
    -        else
    -          neighbor->seen2= True;
    -      }
    -    }
    -    facet= neighbor;
    -  }
    -  if (qh CHECKfrequently) {
    -    FOREACHneighbor_(vertex) {
    -      if (!neighbor->seen2) {
    -          qh_fprintf(qh ferr, 6217, "qhull internal error (qh_detvridge3): neighbors of vertex p%d are not connected at facet %d\n",
    -                 qh_pointid(vertex->point), neighbor->id);
    -        qh_errexit(qh_ERRqhull, neighbor, NULL);
    -      }
    -    }
    -  }
    -  FOREACHneighbor_(atvertex)
    -    neighbor->seen2= True;
    -  qh_settempfree(&tricenters);
    -  return centers;
    -} /* detvridge3 */
    -
    -/*---------------------------------
    -
    -  qh_eachvoronoi( fp, printvridge, vertex, visitall, innerouter, inorder )
    -    if visitall,
    -      visit all Voronoi ridges for vertex (i.e., an input site)
    -    else
    -      visit all unvisited Voronoi ridges for vertex
    -      all vertex->seen= False if unvisited
    -    assumes
    -      all facet->seen= False
    -      all facet->seen2= True (for qh_detvridge3)
    -      all facet->visitid == 0 if vertex_at_infinity
    -                         == index of Voronoi vertex
    -                         >= qh.num_facets if ignored
    -    innerouter:
    -      qh_RIDGEall--  both inner (bounded) and outer(unbounded) ridges
    -      qh_RIDGEinner- only inner
    -      qh_RIDGEouter- only outer
    -
    -    if inorder
    -      orders vertices for 3-d Voronoi diagrams
    -
    -  returns:
    -    number of visited ridges (does not include previously visited ridges)
    -
    -    if printvridge,
    -      calls printvridge( fp, vertex, vertexA, centers)
    -        fp== any pointer (assumes FILE*)
    -        vertex,vertexA= pair of input sites that define a Voronoi ridge
    -        centers= set of facets (i.e., Voronoi vertices)
    -                 ->visitid == index or 0 if vertex_at_infinity
    -                 ordered for 3-d Voronoi diagram
    -  notes:
    -    uses qh.vertex_visit
    -
    -  see:
    -    qh_eachvoronoi_all()
    -
    -  design:
    -    mark selected neighbors of atvertex
    -    for each selected neighbor (either Voronoi vertex or vertex-at-infinity)
    -      for each unvisited vertex
    -        if atvertex and vertex share more than d-1 neighbors
    -          bump totalcount
    -          if printvridge defined
    -            build the set of shared neighbors (i.e., Voronoi vertices)
    -            call printvridge
    -*/
    -int qh_eachvoronoi(FILE *fp, printvridgeT printvridge, vertexT *atvertex, boolT visitall, qh_RIDGE innerouter, boolT inorder) {
    -  boolT unbounded;
    -  int count;
    -  facetT *neighbor, **neighborp, *neighborA, **neighborAp;
    -  setT *centers;
    -  setT *tricenters= qh_settemp(qh TEMPsize);
    -
    -  vertexT *vertex, **vertexp;
    -  boolT firstinf;
    -  unsigned int numfacets= (unsigned int)qh num_facets;
    -  int totridges= 0;
    -
    -  qh vertex_visit++;
    -  atvertex->seen= True;
    -  if (visitall) {
    -    FORALLvertices
    -      vertex->seen= False;
    -  }
    -  FOREACHneighbor_(atvertex) {
    -    if (neighbor->visitid < numfacets)
    -      neighbor->seen= True;
    -  }
    -  FOREACHneighbor_(atvertex) {
    -    if (neighbor->seen) {
    -      FOREACHvertex_(neighbor->vertices) {
    -        if (vertex->visitid != qh vertex_visit && !vertex->seen) {
    -          vertex->visitid= qh vertex_visit;
    -          count= 0;
    -          firstinf= True;
    -          qh_settruncate(tricenters, 0);
    -          FOREACHneighborA_(vertex) {
    -            if (neighborA->seen) {
    -              if (neighborA->visitid) {
    -                if (!neighborA->tricoplanar || qh_setunique(&tricenters, neighborA->center))
    -                  count++;
    -              }else if (firstinf) {
    -                count++;
    -                firstinf= False;
    -              }
    -            }
    -          }
    -          if (count >= qh hull_dim - 1) {  /* e.g., 3 for 3-d Voronoi */
    -            if (firstinf) {
    -              if (innerouter == qh_RIDGEouter)
    -                continue;
    -              unbounded= False;
    -            }else {
    -              if (innerouter == qh_RIDGEinner)
    -                continue;
    -              unbounded= True;
    -            }
    -            totridges++;
    -            trace4((qh ferr, 4017, "qh_eachvoronoi: Voronoi ridge of %d vertices between sites %d and %d\n",
    -                  count, qh_pointid(atvertex->point), qh_pointid(vertex->point)));
    -            if (printvridge && fp) {
    -              if (inorder && qh hull_dim == 3+1) /* 3-d Voronoi diagram */
    -                centers= qh_detvridge3(atvertex, vertex);
    -              else
    -                centers= qh_detvridge(vertex);
    -              (*printvridge)(fp, atvertex, vertex, centers, unbounded);
    -              qh_settempfree(¢ers);
    -            }
    -          }
    -        }
    -      }
    -    }
    -  }
    -  FOREACHneighbor_(atvertex)
    -    neighbor->seen= False;
    -  qh_settempfree(&tricenters);
    -  return totridges;
    -} /* eachvoronoi */
    -
    -
    -/*---------------------------------
    -
    -  qh_eachvoronoi_all( fp, printvridge, isUpper, innerouter, inorder )
    -    visit all Voronoi ridges
    -
    -    innerouter:
    -      see qh_eachvoronoi()
    -
    -    if inorder
    -      orders vertices for 3-d Voronoi diagrams
    -
    -  returns
    -    total number of ridges
    -
    -    if isUpper == facet->upperdelaunay  (i.e., a Vornoi vertex)
    -      facet->visitid= Voronoi vertex index(same as 'o' format)
    -    else
    -      facet->visitid= 0
    -
    -    if printvridge,
    -      calls printvridge( fp, vertex, vertexA, centers)
    -      [see qh_eachvoronoi]
    -
    -  notes:
    -    Not used for qhull.exe
    -    same effect as qh_printvdiagram but ridges not sorted by point id
    -*/
    -int qh_eachvoronoi_all(FILE *fp, printvridgeT printvridge, boolT isUpper, qh_RIDGE innerouter, boolT inorder) {
    -  facetT *facet;
    -  vertexT *vertex;
    -  int numcenters= 1;  /* vertex 0 is vertex-at-infinity */
    -  int totridges= 0;
    -
    -  qh_clearcenters(qh_ASvoronoi);
    -  qh_vertexneighbors();
    -  maximize_(qh visit_id, (unsigned) qh num_facets);
    -  FORALLfacets {
    -    facet->visitid= 0;
    -    facet->seen= False;
    -    facet->seen2= True;
    -  }
    -  FORALLfacets {
    -    if (facet->upperdelaunay == isUpper)
    -      facet->visitid= numcenters++;
    -  }
    -  FORALLvertices
    -    vertex->seen= False;
    -  FORALLvertices {
    -    if (qh GOODvertex > 0 && qh_pointid(vertex->point)+1 != qh GOODvertex)
    -      continue;
    -    totridges += qh_eachvoronoi(fp, printvridge, vertex,
    -                   !qh_ALL, innerouter, inorder);
    -  }
    -  return totridges;
    -} /* eachvoronoi_all */
    -
    -/*---------------------------------
    -
    -  qh_facet2point( facet, point0, point1, mindist )
    -    return two projected temporary vertices for a 2-d facet
    -    may be non-simplicial
    -
    -  returns:
    -    point0 and point1 oriented and projected to the facet
    -    returns mindist (maximum distance below plane)
    -*/
    -void qh_facet2point(facetT *facet, pointT **point0, pointT **point1, realT *mindist) {
    -  vertexT *vertex0, *vertex1;
    -  realT dist;
    -
    -  if (facet->toporient ^ qh_ORIENTclock) {
    -    vertex0= SETfirstt_(facet->vertices, vertexT);
    -    vertex1= SETsecondt_(facet->vertices, vertexT);
    -  }else {
    -    vertex1= SETfirstt_(facet->vertices, vertexT);
    -    vertex0= SETsecondt_(facet->vertices, vertexT);
    -  }
    -  zadd_(Zdistio, 2);
    -  qh_distplane(vertex0->point, facet, &dist);
    -  *mindist= dist;
    -  *point0= qh_projectpoint(vertex0->point, facet, dist);
    -  qh_distplane(vertex1->point, facet, &dist);
    -  minimize_(*mindist, dist);
    -  *point1= qh_projectpoint(vertex1->point, facet, dist);
    -} /* facet2point */
    -
    -
    -/*---------------------------------
    -
    -  qh_facetvertices( facetlist, facets, allfacets )
    -    returns temporary set of vertices in a set and/or list of facets
    -    if allfacets, ignores qh_skipfacet()
    -
    -  returns:
    -    vertices with qh.vertex_visit
    -
    -  notes:
    -    optimized for allfacets of facet_list
    -
    -  design:
    -    if allfacets of facet_list
    -      create vertex set from vertex_list
    -    else
    -      for each selected facet in facets or facetlist
    -        append unvisited vertices to vertex set
    -*/
    -setT *qh_facetvertices(facetT *facetlist, setT *facets, boolT allfacets) {
    -  setT *vertices;
    -  facetT *facet, **facetp;
    -  vertexT *vertex, **vertexp;
    -
    -  qh vertex_visit++;
    -  if (facetlist == qh facet_list && allfacets && !facets) {
    -    vertices= qh_settemp(qh num_vertices);
    -    FORALLvertices {
    -      vertex->visitid= qh vertex_visit;
    -      qh_setappend(&vertices, vertex);
    -    }
    -  }else {
    -    vertices= qh_settemp(qh TEMPsize);
    -    FORALLfacet_(facetlist) {
    -      if (!allfacets && qh_skipfacet(facet))
    -        continue;
    -      FOREACHvertex_(facet->vertices) {
    -        if (vertex->visitid != qh vertex_visit) {
    -          vertex->visitid= qh vertex_visit;
    -          qh_setappend(&vertices, vertex);
    -        }
    -      }
    -    }
    -  }
    -  FOREACHfacet_(facets) {
    -    if (!allfacets && qh_skipfacet(facet))
    -      continue;
    -    FOREACHvertex_(facet->vertices) {
    -      if (vertex->visitid != qh vertex_visit) {
    -        vertex->visitid= qh vertex_visit;
    -        qh_setappend(&vertices, vertex);
    -      }
    -    }
    -  }
    -  return vertices;
    -} /* facetvertices */
    -
    -/*---------------------------------
    -
    -  qh_geomplanes( facet, outerplane, innerplane )
    -    return outer and inner planes for Geomview
    -    qh.PRINTradius is size of vertices and points (includes qh.JOGGLEmax)
    -
    -  notes:
    -    assume precise calculations in io.c with roundoff covered by qh_GEOMepsilon
    -*/
    -void qh_geomplanes(facetT *facet, realT *outerplane, realT *innerplane) {
    -  realT radius;
    -
    -  if (qh MERGING || qh JOGGLEmax < REALmax/2) {
    -    qh_outerinner(facet, outerplane, innerplane);
    -    radius= qh PRINTradius;
    -    if (qh JOGGLEmax < REALmax/2)
    -      radius -= qh JOGGLEmax * sqrt((realT)qh hull_dim);  /* already accounted for in qh_outerinner() */
    -    *outerplane += radius;
    -    *innerplane -= radius;
    -    if (qh PRINTcoplanar || qh PRINTspheres) {
    -      *outerplane += qh MAXabs_coord * qh_GEOMepsilon;
    -      *innerplane -= qh MAXabs_coord * qh_GEOMepsilon;
    -    }
    -  }else
    -    *innerplane= *outerplane= 0;
    -} /* geomplanes */
    -
    -
    -/*---------------------------------
    -
    -  qh_markkeep( facetlist )
    -    mark good facets that meet qh.KEEParea, qh.KEEPmerge, and qh.KEEPminArea
    -    ignores visible facets (!part of convex hull)
    -
    -  returns:
    -    may clear facet->good
    -    recomputes qh.num_good
    -
    -  design:
    -    get set of good facets
    -    if qh.KEEParea
    -      sort facets by area
    -      clear facet->good for all but n largest facets
    -    if qh.KEEPmerge
    -      sort facets by merge count
    -      clear facet->good for all but n most merged facets
    -    if qh.KEEPminarea
    -      clear facet->good if area too small
    -    update qh.num_good
    -*/
    -void qh_markkeep(facetT *facetlist) {
    -  facetT *facet, **facetp;
    -  setT *facets= qh_settemp(qh num_facets);
    -  int size, count;
    -
    -  trace2((qh ferr, 2006, "qh_markkeep: only keep %d largest and/or %d most merged facets and/or min area %.2g\n",
    -          qh KEEParea, qh KEEPmerge, qh KEEPminArea));
    -  FORALLfacet_(facetlist) {
    -    if (!facet->visible && facet->good)
    -      qh_setappend(&facets, facet);
    -  }
    -  size= qh_setsize(facets);
    -  if (qh KEEParea) {
    -    qsort(SETaddr_(facets, facetT), (size_t)size,
    -             sizeof(facetT *), qh_compare_facetarea);
    -    if ((count= size - qh KEEParea) > 0) {
    -      FOREACHfacet_(facets) {
    -        facet->good= False;
    -        if (--count == 0)
    -          break;
    -      }
    -    }
    -  }
    -  if (qh KEEPmerge) {
    -    qsort(SETaddr_(facets, facetT), (size_t)size,
    -             sizeof(facetT *), qh_compare_facetmerge);
    -    if ((count= size - qh KEEPmerge) > 0) {
    -      FOREACHfacet_(facets) {
    -        facet->good= False;
    -        if (--count == 0)
    -          break;
    -      }
    -    }
    -  }
    -  if (qh KEEPminArea < REALmax/2) {
    -    FOREACHfacet_(facets) {
    -      if (!facet->isarea || facet->f.area < qh KEEPminArea)
    -        facet->good= False;
    -    }
    -  }
    -  qh_settempfree(&facets);
    -  count= 0;
    -  FORALLfacet_(facetlist) {
    -    if (facet->good)
    -      count++;
    -  }
    -  qh num_good= count;
    -} /* markkeep */
    -
    -
    -/*---------------------------------
    -
    -  qh_markvoronoi( facetlist, facets, printall, isLower, numcenters )
    -    mark voronoi vertices for printing by site pairs
    -
    -  returns:
    -    temporary set of vertices indexed by pointid
    -    isLower set if printing lower hull (i.e., at least one facet is lower hull)
    -    numcenters= total number of Voronoi vertices
    -    bumps qh.printoutnum for vertex-at-infinity
    -    clears all facet->seen and sets facet->seen2
    -
    -    if selected
    -      facet->visitid= Voronoi vertex id
    -    else if upper hull (or 'Qu' and lower hull)
    -      facet->visitid= 0
    -    else
    -      facet->visitid >= qh num_facets
    -
    -  notes:
    -    ignores qh.ATinfinity, if defined
    -*/
    -setT *qh_markvoronoi(facetT *facetlist, setT *facets, boolT printall, boolT *isLowerp, int *numcentersp) {
    -  int numcenters=0;
    -  facetT *facet, **facetp;
    -  setT *vertices;
    -  boolT isLower= False;
    -
    -  qh printoutnum++;
    -  qh_clearcenters(qh_ASvoronoi);  /* in case, qh_printvdiagram2 called by user */
    -  qh_vertexneighbors();
    -  vertices= qh_pointvertex();
    -  if (qh ATinfinity)
    -    SETelem_(vertices, qh num_points-1)= NULL;
    -  qh visit_id++;
    -  maximize_(qh visit_id, (unsigned) qh num_facets);
    -  FORALLfacet_(facetlist) {
    -    if (printall || !qh_skipfacet(facet)) {
    -      if (!facet->upperdelaunay) {
    -        isLower= True;
    -        break;
    -      }
    -    }
    -  }
    -  FOREACHfacet_(facets) {
    -    if (printall || !qh_skipfacet(facet)) {
    -      if (!facet->upperdelaunay) {
    -        isLower= True;
    -        break;
    -      }
    -    }
    -  }
    -  FORALLfacets {
    -    if (facet->normal && (facet->upperdelaunay == isLower))
    -      facet->visitid= 0;  /* facetlist or facets may overwrite */
    -    else
    -      facet->visitid= qh visit_id;
    -    facet->seen= False;
    -    facet->seen2= True;
    -  }
    -  numcenters++;  /* qh_INFINITE */
    -  FORALLfacet_(facetlist) {
    -    if (printall || !qh_skipfacet(facet))
    -      facet->visitid= numcenters++;
    -  }
    -  FOREACHfacet_(facets) {
    -    if (printall || !qh_skipfacet(facet))
    -      facet->visitid= numcenters++;
    -  }
    -  *isLowerp= isLower;
    -  *numcentersp= numcenters;
    -  trace2((qh ferr, 2007, "qh_markvoronoi: isLower %d numcenters %d\n", isLower, numcenters));
    -  return vertices;
    -} /* markvoronoi */
    -
    -/*---------------------------------
    -
    -  qh_order_vertexneighbors( vertex )
    -    order facet neighbors of a 2-d or 3-d vertex by adjacency
    -
    -  notes:
    -    does not orient the neighbors
    -
    -  design:
    -    initialize a new neighbor set with the first facet in vertex->neighbors
    -    while vertex->neighbors non-empty
    -      select next neighbor in the previous facet's neighbor set
    -    set vertex->neighbors to the new neighbor set
    -*/
    -void qh_order_vertexneighbors(vertexT *vertex) {
    -  setT *newset;
    -  facetT *facet, *neighbor, **neighborp;
    -
    -  trace4((qh ferr, 4018, "qh_order_vertexneighbors: order neighbors of v%d for 3-d\n", vertex->id));
    -  newset= qh_settemp(qh_setsize(vertex->neighbors));
    -  facet= (facetT*)qh_setdellast(vertex->neighbors);
    -  qh_setappend(&newset, facet);
    -  while (qh_setsize(vertex->neighbors)) {
    -    FOREACHneighbor_(vertex) {
    -      if (qh_setin(facet->neighbors, neighbor)) {
    -        qh_setdel(vertex->neighbors, neighbor);
    -        qh_setappend(&newset, neighbor);
    -        facet= neighbor;
    -        break;
    -      }
    -    }
    -    if (!neighbor) {
    -      qh_fprintf(qh ferr, 6066, "qhull internal error (qh_order_vertexneighbors): no neighbor of v%d for f%d\n",
    -        vertex->id, facet->id);
    -      qh_errexit(qh_ERRqhull, facet, NULL);
    -    }
    -  }
    -  qh_setfree(&vertex->neighbors);
    -  qh_settemppop();
    -  vertex->neighbors= newset;
    -} /* order_vertexneighbors */
    -
    -/*---------------------------------
    -
    -  qh_prepare_output( )
    -    prepare for qh_produce_output2() according to
    -      qh.KEEPminArea, KEEParea, KEEPmerge, GOODvertex, GOODthreshold, GOODpoint, ONLYgood, SPLITthresholds
    -    does not reset facet->good
    -
    -  notes
    -    except for PRINTstatistics, no-op if previously called with same options
    -*/
    -void qh_prepare_output(void) {
    -  if (qh VORONOI) {
    -    qh_clearcenters(qh_ASvoronoi);  /* must be before qh_triangulate */
    -    qh_vertexneighbors();
    -  }
    -  if (qh TRIangulate && !qh hasTriangulation) {
    -    qh_triangulate();
    -    if (qh VERIFYoutput && !qh CHECKfrequently)
    -      qh_checkpolygon(qh facet_list);
    -  }
    -  qh_findgood_all(qh facet_list);
    -  if (qh GETarea)
    -    qh_getarea(qh facet_list);
    -  if (qh KEEParea || qh KEEPmerge || qh KEEPminArea < REALmax/2)
    -    qh_markkeep(qh facet_list);
    -  if (qh PRINTstatistics)
    -    qh_collectstatistics();
    -}
    -
    -/*---------------------------------
    -
    -  qh_printafacet( fp, format, facet, printall )
    -    print facet to fp in given output format (see qh.PRINTout)
    -
    -  returns:
    -    nop if !printall and qh_skipfacet()
    -    nop if visible facet and NEWfacets and format != PRINTfacets
    -    must match qh_countfacets
    -
    -  notes
    -    preserves qh.visit_id
    -    facet->normal may be null if PREmerge/MERGEexact and STOPcone before merge
    -
    -  see
    -    qh_printbegin() and qh_printend()
    -
    -  design:
    -    test for printing facet
    -    call appropriate routine for format
    -    or output results directly
    -*/
    -void qh_printafacet(FILE *fp, qh_PRINT format, facetT *facet, boolT printall) {
    -  realT color[4], offset, dist, outerplane, innerplane;
    -  boolT zerodiv;
    -  coordT *point, *normp, *coordp, **pointp, *feasiblep;
    -  int k;
    -  vertexT *vertex, **vertexp;
    -  facetT *neighbor, **neighborp;
    -
    -  if (!printall && qh_skipfacet(facet))
    -    return;
    -  if (facet->visible && qh NEWfacets && format != qh_PRINTfacets)
    -    return;
    -  qh printoutnum++;
    -  switch (format) {
    -  case qh_PRINTarea:
    -    if (facet->isarea) {
    -      qh_fprintf(fp, 9009, qh_REAL_1, facet->f.area);
    -      qh_fprintf(fp, 9010, "\n");
    -    }else
    -      qh_fprintf(fp, 9011, "0\n");
    -    break;
    -  case qh_PRINTcoplanars:
    -    qh_fprintf(fp, 9012, "%d", qh_setsize(facet->coplanarset));
    -    FOREACHpoint_(facet->coplanarset)
    -      qh_fprintf(fp, 9013, " %d", qh_pointid(point));
    -    qh_fprintf(fp, 9014, "\n");
    -    break;
    -  case qh_PRINTcentrums:
    -    qh_printcenter(fp, format, NULL, facet);
    -    break;
    -  case qh_PRINTfacets:
    -    qh_printfacet(fp, facet);
    -    break;
    -  case qh_PRINTfacets_xridge:
    -    qh_printfacetheader(fp, facet);
    -    break;
    -  case qh_PRINTgeom:  /* either 2 , 3, or 4-d by qh_printbegin */
    -    if (!facet->normal)
    -      break;
    -    for (k=qh hull_dim; k--; ) {
    -      color[k]= (facet->normal[k]+1.0)/2.0;
    -      maximize_(color[k], -1.0);
    -      minimize_(color[k], +1.0);
    -    }
    -    qh_projectdim3(color, color);
    -    if (qh PRINTdim != qh hull_dim)
    -      qh_normalize2(color, 3, True, NULL, NULL);
    -    if (qh hull_dim <= 2)
    -      qh_printfacet2geom(fp, facet, color);
    -    else if (qh hull_dim == 3) {
    -      if (facet->simplicial)
    -        qh_printfacet3geom_simplicial(fp, facet, color);
    -      else
    -        qh_printfacet3geom_nonsimplicial(fp, facet, color);
    -    }else {
    -      if (facet->simplicial)
    -        qh_printfacet4geom_simplicial(fp, facet, color);
    -      else
    -        qh_printfacet4geom_nonsimplicial(fp, facet, color);
    -    }
    -    break;
    -  case qh_PRINTids:
    -    qh_fprintf(fp, 9015, "%d\n", facet->id);
    -    break;
    -  case qh_PRINTincidences:
    -  case qh_PRINToff:
    -  case qh_PRINTtriangles:
    -    if (qh hull_dim == 3 && format != qh_PRINTtriangles)
    -      qh_printfacet3vertex(fp, facet, format);
    -    else if (facet->simplicial || qh hull_dim == 2 || format == qh_PRINToff)
    -      qh_printfacetNvertex_simplicial(fp, facet, format);
    -    else
    -      qh_printfacetNvertex_nonsimplicial(fp, facet, qh printoutvar++, format);
    -    break;
    -  case qh_PRINTinner:
    -    qh_outerinner(facet, NULL, &innerplane);
    -    offset= facet->offset - innerplane;
    -    goto LABELprintnorm;
    -    break; /* prevent warning */
    -  case qh_PRINTmerges:
    -    qh_fprintf(fp, 9016, "%d\n", facet->nummerge);
    -    break;
    -  case qh_PRINTnormals:
    -    offset= facet->offset;
    -    goto LABELprintnorm;
    -    break; /* prevent warning */
    -  case qh_PRINTouter:
    -    qh_outerinner(facet, &outerplane, NULL);
    -    offset= facet->offset - outerplane;
    -  LABELprintnorm:
    -    if (!facet->normal) {
    -      qh_fprintf(fp, 9017, "no normal for facet f%d\n", facet->id);
    -      break;
    -    }
    -    if (qh CDDoutput) {
    -      qh_fprintf(fp, 9018, qh_REAL_1, -offset);
    -      for (k=0; k < qh hull_dim; k++)
    -        qh_fprintf(fp, 9019, qh_REAL_1, -facet->normal[k]);
    -    }else {
    -      for (k=0; k < qh hull_dim; k++)
    -        qh_fprintf(fp, 9020, qh_REAL_1, facet->normal[k]);
    -      qh_fprintf(fp, 9021, qh_REAL_1, offset);
    -    }
    -    qh_fprintf(fp, 9022, "\n");
    -    break;
    -  case qh_PRINTmathematica:  /* either 2 or 3-d by qh_printbegin */
    -  case qh_PRINTmaple:
    -    if (qh hull_dim == 2)
    -      qh_printfacet2math(fp, facet, format, qh printoutvar++);
    -    else
    -      qh_printfacet3math(fp, facet, format, qh printoutvar++);
    -    break;
    -  case qh_PRINTneighbors:
    -    qh_fprintf(fp, 9023, "%d", qh_setsize(facet->neighbors));
    -    FOREACHneighbor_(facet)
    -      qh_fprintf(fp, 9024, " %d",
    -               neighbor->visitid ? neighbor->visitid - 1: 0 - neighbor->id);
    -    qh_fprintf(fp, 9025, "\n");
    -    break;
    -  case qh_PRINTpointintersect:
    -    if (!qh feasible_point) {
    -      qh_fprintf(qh ferr, 6067, "qhull input error (qh_printafacet): option 'Fp' needs qh feasible_point\n");
    -      qh_errexit( qh_ERRinput, NULL, NULL);
    -    }
    -    if (facet->offset > 0)
    -      goto LABELprintinfinite;
    -    point= coordp= (coordT*)qh_memalloc(qh normal_size);
    -    normp= facet->normal;
    -    feasiblep= qh feasible_point;
    -    if (facet->offset < -qh MINdenom) {
    -      for (k=qh hull_dim; k--; )
    -        *(coordp++)= (*(normp++) / - facet->offset) + *(feasiblep++);
    -    }else {
    -      for (k=qh hull_dim; k--; ) {
    -        *(coordp++)= qh_divzero(*(normp++), facet->offset, qh MINdenom_1,
    -                                 &zerodiv) + *(feasiblep++);
    -        if (zerodiv) {
    -          qh_memfree(point, qh normal_size);
    -          goto LABELprintinfinite;
    -        }
    -      }
    -    }
    -    qh_printpoint(fp, NULL, point);
    -    qh_memfree(point, qh normal_size);
    -    break;
    -  LABELprintinfinite:
    -    for (k=qh hull_dim; k--; )
    -      qh_fprintf(fp, 9026, qh_REAL_1, qh_INFINITE);
    -    qh_fprintf(fp, 9027, "\n");
    -    break;
    -  case qh_PRINTpointnearest:
    -    FOREACHpoint_(facet->coplanarset) {
    -      int id, id2;
    -      vertex= qh_nearvertex(facet, point, &dist);
    -      id= qh_pointid(vertex->point);
    -      id2= qh_pointid(point);
    -      qh_fprintf(fp, 9028, "%d %d %d " qh_REAL_1 "\n", id, id2, facet->id, dist);
    -    }
    -    break;
    -  case qh_PRINTpoints:  /* VORONOI only by qh_printbegin */
    -    if (qh CDDoutput)
    -      qh_fprintf(fp, 9029, "1 ");
    -    qh_printcenter(fp, format, NULL, facet);
    -    break;
    -  case qh_PRINTvertices:
    -    qh_fprintf(fp, 9030, "%d", qh_setsize(facet->vertices));
    -    FOREACHvertex_(facet->vertices)
    -      qh_fprintf(fp, 9031, " %d", qh_pointid(vertex->point));
    -    qh_fprintf(fp, 9032, "\n");
    -    break;
    -  default:
    -    break;
    -  }
    -} /* printafacet */
    -
    -/*---------------------------------
    -
    -  qh_printbegin(  )
    -    prints header for all output formats
    -
    -  returns:
    -    checks for valid format
    -
    -  notes:
    -    uses qh.visit_id for 3/4off
    -    changes qh.interior_point if printing centrums
    -    qh_countfacets clears facet->visitid for non-good facets
    -
    -  see
    -    qh_printend() and qh_printafacet()
    -
    -  design:
    -    count facets and related statistics
    -    print header for format
    -*/
    -void qh_printbegin(FILE *fp, qh_PRINT format, facetT *facetlist, setT *facets, boolT printall) {
    -  int numfacets, numsimplicial, numridges, totneighbors, numcoplanars, numtricoplanars;
    -  int i, num;
    -  facetT *facet, **facetp;
    -  vertexT *vertex, **vertexp;
    -  setT *vertices;
    -  pointT *point, **pointp, *pointtemp;
    -
    -  qh printoutnum= 0;
    -  qh_countfacets(facetlist, facets, printall, &numfacets, &numsimplicial,
    -      &totneighbors, &numridges, &numcoplanars, &numtricoplanars);
    -  switch (format) {
    -  case qh_PRINTnone:
    -    break;
    -  case qh_PRINTarea:
    -    qh_fprintf(fp, 9033, "%d\n", numfacets);
    -    break;
    -  case qh_PRINTcoplanars:
    -    qh_fprintf(fp, 9034, "%d\n", numfacets);
    -    break;
    -  case qh_PRINTcentrums:
    -    if (qh CENTERtype == qh_ASnone)
    -      qh_clearcenters(qh_AScentrum);
    -    qh_fprintf(fp, 9035, "%d\n%d\n", qh hull_dim, numfacets);
    -    break;
    -  case qh_PRINTfacets:
    -  case qh_PRINTfacets_xridge:
    -    if (facetlist)
    -      qh_printvertexlist(fp, "Vertices and facets:\n", facetlist, facets, printall);
    -    break;
    -  case qh_PRINTgeom:
    -    if (qh hull_dim > 4)  /* qh_initqhull_globals also checks */
    -      goto LABELnoformat;
    -    if (qh VORONOI && qh hull_dim > 3)  /* PRINTdim == DROPdim == hull_dim-1 */
    -      goto LABELnoformat;
    -    if (qh hull_dim == 2 && (qh PRINTridges || qh DOintersections))
    -      qh_fprintf(qh ferr, 7049, "qhull warning: output for ridges and intersections not implemented in 2-d\n");
    -    if (qh hull_dim == 4 && (qh PRINTinner || qh PRINTouter ||
    -                             (qh PRINTdim == 4 && qh PRINTcentrums)))
    -      qh_fprintf(qh ferr, 7050, "qhull warning: output for outer/inner planes and centrums not implemented in 4-d\n");
    -    if (qh PRINTdim == 4 && (qh PRINTspheres))
    -      qh_fprintf(qh ferr, 7051, "qhull warning: output for vertices not implemented in 4-d\n");
    -    if (qh PRINTdim == 4 && qh DOintersections && qh PRINTnoplanes)
    -      qh_fprintf(qh ferr, 7052, "qhull warning: 'Gnh' generates no output in 4-d\n");
    -    if (qh PRINTdim == 2) {
    -      qh_fprintf(fp, 9036, "{appearance {linewidth 3} LIST # %s | %s\n",
    -              qh rbox_command, qh qhull_command);
    -    }else if (qh PRINTdim == 3) {
    -      qh_fprintf(fp, 9037, "{appearance {+edge -evert linewidth 2} LIST # %s | %s\n",
    -              qh rbox_command, qh qhull_command);
    -    }else if (qh PRINTdim == 4) {
    -      qh visit_id++;
    -      num= 0;
    -      FORALLfacet_(facetlist)    /* get number of ridges to be printed */
    -        qh_printend4geom(NULL, facet, &num, printall);
    -      FOREACHfacet_(facets)
    -        qh_printend4geom(NULL, facet, &num, printall);
    -      qh ridgeoutnum= num;
    -      qh printoutvar= 0;  /* counts number of ridges in output */
    -      qh_fprintf(fp, 9038, "LIST # %s | %s\n", qh rbox_command, qh qhull_command);
    -    }
    -
    -    if (qh PRINTdots) {
    -      qh printoutnum++;
    -      num= qh num_points + qh_setsize(qh other_points);
    -      if (qh DELAUNAY && qh ATinfinity)
    -        num--;
    -      if (qh PRINTdim == 4)
    -        qh_fprintf(fp, 9039, "4VECT %d %d 1\n", num, num);
    -      else
    -        qh_fprintf(fp, 9040, "VECT %d %d 1\n", num, num);
    -
    -      for (i=num; i--; ) {
    -        if (i % 20 == 0)
    -          qh_fprintf(fp, 9041, "\n");
    -        qh_fprintf(fp, 9042, "1 ");
    -      }
    -      qh_fprintf(fp, 9043, "# 1 point per line\n1 ");
    -      for (i=num-1; i--; ) { /* num at least 3 for D2 */
    -        if (i % 20 == 0)
    -          qh_fprintf(fp, 9044, "\n");
    -        qh_fprintf(fp, 9045, "0 ");
    -      }
    -      qh_fprintf(fp, 9046, "# 1 color for all\n");
    -      FORALLpoints {
    -        if (!qh DELAUNAY || !qh ATinfinity || qh_pointid(point) != qh num_points-1) {
    -          if (qh PRINTdim == 4)
    -            qh_printpoint(fp, NULL, point);
    -            else
    -              qh_printpoint3(fp, point);
    -        }
    -      }
    -      FOREACHpoint_(qh other_points) {
    -        if (qh PRINTdim == 4)
    -          qh_printpoint(fp, NULL, point);
    -        else
    -          qh_printpoint3(fp, point);
    -      }
    -      qh_fprintf(fp, 9047, "0 1 1 1  # color of points\n");
    -    }
    -
    -    if (qh PRINTdim == 4  && !qh PRINTnoplanes)
    -      /* 4dview loads up multiple 4OFF objects slowly */
    -      qh_fprintf(fp, 9048, "4OFF %d %d 1\n", 3*qh ridgeoutnum, qh ridgeoutnum);
    -    qh PRINTcradius= 2 * qh DISTround;  /* include test DISTround */
    -    if (qh PREmerge) {
    -      maximize_(qh PRINTcradius, qh premerge_centrum + qh DISTround);
    -    }else if (qh POSTmerge)
    -      maximize_(qh PRINTcradius, qh postmerge_centrum + qh DISTround);
    -    qh PRINTradius= qh PRINTcradius;
    -    if (qh PRINTspheres + qh PRINTcoplanar)
    -      maximize_(qh PRINTradius, qh MAXabs_coord * qh_MINradius);
    -    if (qh premerge_cos < REALmax/2) {
    -      maximize_(qh PRINTradius, (1- qh premerge_cos) * qh MAXabs_coord);
    -    }else if (!qh PREmerge && qh POSTmerge && qh postmerge_cos < REALmax/2) {
    -      maximize_(qh PRINTradius, (1- qh postmerge_cos) * qh MAXabs_coord);
    -    }
    -    maximize_(qh PRINTradius, qh MINvisible);
    -    if (qh JOGGLEmax < REALmax/2)
    -      qh PRINTradius += qh JOGGLEmax * sqrt((realT)qh hull_dim);
    -    if (qh PRINTdim != 4 &&
    -        (qh PRINTcoplanar || qh PRINTspheres || qh PRINTcentrums)) {
    -      vertices= qh_facetvertices(facetlist, facets, printall);
    -      if (qh PRINTspheres && qh PRINTdim <= 3)
    -        qh_printspheres(fp, vertices, qh PRINTradius);
    -      if (qh PRINTcoplanar || qh PRINTcentrums) {
    -        qh firstcentrum= True;
    -        if (qh PRINTcoplanar&& !qh PRINTspheres) {
    -          FOREACHvertex_(vertices)
    -            qh_printpointvect2(fp, vertex->point, NULL, qh interior_point, qh PRINTradius);
    -        }
    -        FORALLfacet_(facetlist) {
    -          if (!printall && qh_skipfacet(facet))
    -            continue;
    -          if (!facet->normal)
    -            continue;
    -          if (qh PRINTcentrums && qh PRINTdim <= 3)
    -            qh_printcentrum(fp, facet, qh PRINTcradius);
    -          if (!qh PRINTcoplanar)
    -            continue;
    -          FOREACHpoint_(facet->coplanarset)
    -            qh_printpointvect2(fp, point, facet->normal, NULL, qh PRINTradius);
    -          FOREACHpoint_(facet->outsideset)
    -            qh_printpointvect2(fp, point, facet->normal, NULL, qh PRINTradius);
    -        }
    -        FOREACHfacet_(facets) {
    -          if (!printall && qh_skipfacet(facet))
    -            continue;
    -          if (!facet->normal)
    -            continue;
    -          if (qh PRINTcentrums && qh PRINTdim <= 3)
    -            qh_printcentrum(fp, facet, qh PRINTcradius);
    -          if (!qh PRINTcoplanar)
    -            continue;
    -          FOREACHpoint_(facet->coplanarset)
    -            qh_printpointvect2(fp, point, facet->normal, NULL, qh PRINTradius);
    -          FOREACHpoint_(facet->outsideset)
    -            qh_printpointvect2(fp, point, facet->normal, NULL, qh PRINTradius);
    -        }
    -      }
    -      qh_settempfree(&vertices);
    -    }
    -    qh visit_id++; /* for printing hyperplane intersections */
    -    break;
    -  case qh_PRINTids:
    -    qh_fprintf(fp, 9049, "%d\n", numfacets);
    -    break;
    -  case qh_PRINTincidences:
    -    if (qh VORONOI && qh PRINTprecision)
    -      qh_fprintf(qh ferr, 7053, "qhull warning: writing Delaunay.  Use 'p' or 'o' for Voronoi centers\n");
    -    qh printoutvar= qh vertex_id;  /* centrum id for non-simplicial facets */
    -    if (qh hull_dim <= 3)
    -      qh_fprintf(fp, 9050, "%d\n", numfacets);
    -    else
    -      qh_fprintf(fp, 9051, "%d\n", numsimplicial+numridges);
    -    break;
    -  case qh_PRINTinner:
    -  case qh_PRINTnormals:
    -  case qh_PRINTouter:
    -    if (qh CDDoutput)
    -      qh_fprintf(fp, 9052, "%s | %s\nbegin\n    %d %d real\n", qh rbox_command,
    -            qh qhull_command, numfacets, qh hull_dim+1);
    -    else
    -      qh_fprintf(fp, 9053, "%d\n%d\n", qh hull_dim+1, numfacets);
    -    break;
    -  case qh_PRINTmathematica:
    -  case qh_PRINTmaple:
    -    if (qh hull_dim > 3)  /* qh_initbuffers also checks */
    -      goto LABELnoformat;
    -    if (qh VORONOI)
    -      qh_fprintf(qh ferr, 7054, "qhull warning: output is the Delaunay triangulation\n");
    -    if (format == qh_PRINTmaple) {
    -      if (qh hull_dim == 2)
    -        qh_fprintf(fp, 9054, "PLOT(CURVES(\n");
    -      else
    -        qh_fprintf(fp, 9055, "PLOT3D(POLYGONS(\n");
    -    }else
    -      qh_fprintf(fp, 9056, "{\n");
    -    qh printoutvar= 0;   /* counts number of facets for notfirst */
    -    break;
    -  case qh_PRINTmerges:
    -    qh_fprintf(fp, 9057, "%d\n", numfacets);
    -    break;
    -  case qh_PRINTpointintersect:
    -    qh_fprintf(fp, 9058, "%d\n%d\n", qh hull_dim, numfacets);
    -    break;
    -  case qh_PRINTneighbors:
    -    qh_fprintf(fp, 9059, "%d\n", numfacets);
    -    break;
    -  case qh_PRINToff:
    -  case qh_PRINTtriangles:
    -    if (qh VORONOI)
    -      goto LABELnoformat;
    -    num = qh hull_dim;
    -    if (format == qh_PRINToff || qh hull_dim == 2)
    -      qh_fprintf(fp, 9060, "%d\n%d %d %d\n", num,
    -        qh num_points+qh_setsize(qh other_points), numfacets, totneighbors/2);
    -    else { /* qh_PRINTtriangles */
    -      qh printoutvar= qh num_points+qh_setsize(qh other_points); /* first centrum */
    -      if (qh DELAUNAY)
    -        num--;  /* drop last dimension */
    -      qh_fprintf(fp, 9061, "%d\n%d %d %d\n", num, qh printoutvar
    -        + numfacets - numsimplicial, numsimplicial + numridges, totneighbors/2);
    -    }
    -    FORALLpoints
    -      qh_printpointid(qh fout, NULL, num, point, qh_IDunknown);
    -    FOREACHpoint_(qh other_points)
    -      qh_printpointid(qh fout, NULL, num, point, qh_IDunknown);
    -    if (format == qh_PRINTtriangles && qh hull_dim > 2) {
    -      FORALLfacets {
    -        if (!facet->simplicial && facet->visitid)
    -          qh_printcenter(qh fout, format, NULL, facet);
    -      }
    -    }
    -    break;
    -  case qh_PRINTpointnearest:
    -    qh_fprintf(fp, 9062, "%d\n", numcoplanars);
    -    break;
    -  case qh_PRINTpoints:
    -    if (!qh VORONOI)
    -      goto LABELnoformat;
    -    if (qh CDDoutput)
    -      qh_fprintf(fp, 9063, "%s | %s\nbegin\n%d %d real\n", qh rbox_command,
    -           qh qhull_command, numfacets, qh hull_dim);
    -    else
    -      qh_fprintf(fp, 9064, "%d\n%d\n", qh hull_dim-1, numfacets);
    -    break;
    -  case qh_PRINTvertices:
    -    qh_fprintf(fp, 9065, "%d\n", numfacets);
    -    break;
    -  case qh_PRINTsummary:
    -  default:
    -  LABELnoformat:
    -    qh_fprintf(qh ferr, 6068, "qhull internal error (qh_printbegin): can not use this format for dimension %d\n",
    -         qh hull_dim);
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -} /* printbegin */
    -
    -/*---------------------------------
    -
    -  qh_printcenter( fp, string, facet )
    -    print facet->center as centrum or Voronoi center
    -    string may be NULL.  Don't include '%' codes.
    -    nop if qh CENTERtype neither CENTERvoronoi nor CENTERcentrum
    -    if upper envelope of Delaunay triangulation and point at-infinity
    -      prints qh_INFINITE instead;
    -
    -  notes:
    -    defines facet->center if needed
    -    if format=PRINTgeom, adds a 0 if would otherwise be 2-d
    -    Same as QhullFacet::printCenter
    -*/
    -void qh_printcenter(FILE *fp, qh_PRINT format, const char *string, facetT *facet) {
    -  int k, num;
    -
    -  if (qh CENTERtype != qh_ASvoronoi && qh CENTERtype != qh_AScentrum)
    -    return;
    -  if (string)
    -    qh_fprintf(fp, 9066, string);
    -  if (qh CENTERtype == qh_ASvoronoi) {
    -    num= qh hull_dim-1;
    -    if (!facet->normal || !facet->upperdelaunay || !qh ATinfinity) {
    -      if (!facet->center)
    -        facet->center= qh_facetcenter(facet->vertices);
    -      for (k=0; k < num; k++)
    -        qh_fprintf(fp, 9067, qh_REAL_1, facet->center[k]);
    -    }else {
    -      for (k=0; k < num; k++)
    -        qh_fprintf(fp, 9068, qh_REAL_1, qh_INFINITE);
    -    }
    -  }else /* qh.CENTERtype == qh_AScentrum */ {
    -    num= qh hull_dim;
    -    if (format == qh_PRINTtriangles && qh DELAUNAY)
    -      num--;
    -    if (!facet->center)
    -      facet->center= qh_getcentrum(facet);
    -    for (k=0; k < num; k++)
    -      qh_fprintf(fp, 9069, qh_REAL_1, facet->center[k]);
    -  }
    -  if (format == qh_PRINTgeom && num == 2)
    -    qh_fprintf(fp, 9070, " 0\n");
    -  else
    -    qh_fprintf(fp, 9071, "\n");
    -} /* printcenter */
    -
    -/*---------------------------------
    -
    -  qh_printcentrum( fp, facet, radius )
    -    print centrum for a facet in OOGL format
    -    radius defines size of centrum
    -    2-d or 3-d only
    -
    -  returns:
    -    defines facet->center if needed
    -*/
    -void qh_printcentrum(FILE *fp, facetT *facet, realT radius) {
    -  pointT *centrum, *projpt;
    -  boolT tempcentrum= False;
    -  realT xaxis[4], yaxis[4], normal[4], dist;
    -  realT green[3]={0, 1, 0};
    -  vertexT *apex;
    -  int k;
    -
    -  if (qh CENTERtype == qh_AScentrum) {
    -    if (!facet->center)
    -      facet->center= qh_getcentrum(facet);
    -    centrum= facet->center;
    -  }else {
    -    centrum= qh_getcentrum(facet);
    -    tempcentrum= True;
    -  }
    -  qh_fprintf(fp, 9072, "{appearance {-normal -edge normscale 0} ");
    -  if (qh firstcentrum) {
    -    qh firstcentrum= False;
    -    qh_fprintf(fp, 9073, "{INST geom { define centrum CQUAD  # f%d\n\
    --0.3 -0.3 0.0001     0 0 1 1\n\
    - 0.3 -0.3 0.0001     0 0 1 1\n\
    - 0.3  0.3 0.0001     0 0 1 1\n\
    --0.3  0.3 0.0001     0 0 1 1 } transform { \n", facet->id);
    -  }else
    -    qh_fprintf(fp, 9074, "{INST geom { : centrum } transform { # f%d\n", facet->id);
    -  apex= SETfirstt_(facet->vertices, vertexT);
    -  qh_distplane(apex->point, facet, &dist);
    -  projpt= qh_projectpoint(apex->point, facet, dist);
    -  for (k=qh hull_dim; k--; ) {
    -    xaxis[k]= projpt[k] - centrum[k];
    -    normal[k]= facet->normal[k];
    -  }
    -  if (qh hull_dim == 2) {
    -    xaxis[2]= 0;
    -    normal[2]= 0;
    -  }else if (qh hull_dim == 4) {
    -    qh_projectdim3(xaxis, xaxis);
    -    qh_projectdim3(normal, normal);
    -    qh_normalize2(normal, qh PRINTdim, True, NULL, NULL);
    -  }
    -  qh_crossproduct(3, xaxis, normal, yaxis);
    -  qh_fprintf(fp, 9075, "%8.4g %8.4g %8.4g 0\n", xaxis[0], xaxis[1], xaxis[2]);
    -  qh_fprintf(fp, 9076, "%8.4g %8.4g %8.4g 0\n", yaxis[0], yaxis[1], yaxis[2]);
    -  qh_fprintf(fp, 9077, "%8.4g %8.4g %8.4g 0\n", normal[0], normal[1], normal[2]);
    -  qh_printpoint3(fp, centrum);
    -  qh_fprintf(fp, 9078, "1 }}}\n");
    -  qh_memfree(projpt, qh normal_size);
    -  qh_printpointvect(fp, centrum, facet->normal, NULL, radius, green);
    -  if (tempcentrum)
    -    qh_memfree(centrum, qh normal_size);
    -} /* printcentrum */
    -
    -/*---------------------------------
    -
    -  qh_printend( fp, format )
    -    prints trailer for all output formats
    -
    -  see:
    -    qh_printbegin() and qh_printafacet()
    -
    -*/
    -void qh_printend(FILE *fp, qh_PRINT format, facetT *facetlist, setT *facets, boolT printall) {
    -  int num;
    -  facetT *facet, **facetp;
    -
    -  if (!qh printoutnum)
    -    qh_fprintf(qh ferr, 7055, "qhull warning: no facets printed\n");
    -  switch (format) {
    -  case qh_PRINTgeom:
    -    if (qh hull_dim == 4 && qh DROPdim < 0  && !qh PRINTnoplanes) {
    -      qh visit_id++;
    -      num= 0;
    -      FORALLfacet_(facetlist)
    -        qh_printend4geom(fp, facet,&num, printall);
    -      FOREACHfacet_(facets)
    -        qh_printend4geom(fp, facet, &num, printall);
    -      if (num != qh ridgeoutnum || qh printoutvar != qh ridgeoutnum) {
    -        qh_fprintf(qh ferr, 6069, "qhull internal error (qh_printend): number of ridges %d != number printed %d and at end %d\n", qh ridgeoutnum, qh printoutvar, num);
    -        qh_errexit(qh_ERRqhull, NULL, NULL);
    -      }
    -    }else
    -      qh_fprintf(fp, 9079, "}\n");
    -    break;
    -  case qh_PRINTinner:
    -  case qh_PRINTnormals:
    -  case qh_PRINTouter:
    -    if (qh CDDoutput)
    -      qh_fprintf(fp, 9080, "end\n");
    -    break;
    -  case qh_PRINTmaple:
    -    qh_fprintf(fp, 9081, "));\n");
    -    break;
    -  case qh_PRINTmathematica:
    -    qh_fprintf(fp, 9082, "}\n");
    -    break;
    -  case qh_PRINTpoints:
    -    if (qh CDDoutput)
    -      qh_fprintf(fp, 9083, "end\n");
    -    break;
    -  default:
    -    break;
    -  }
    -} /* printend */
    -
    -/*---------------------------------
    -
    -  qh_printend4geom( fp, facet, numridges, printall )
    -    helper function for qh_printbegin/printend
    -
    -  returns:
    -    number of printed ridges
    -
    -  notes:
    -    just counts printed ridges if fp=NULL
    -    uses facet->visitid
    -    must agree with qh_printfacet4geom...
    -
    -  design:
    -    computes color for facet from its normal
    -    prints each ridge of facet
    -*/
    -void qh_printend4geom(FILE *fp, facetT *facet, int *nump, boolT printall) {
    -  realT color[3];
    -  int i, num= *nump;
    -  facetT *neighbor, **neighborp;
    -  ridgeT *ridge, **ridgep;
    -
    -  if (!printall && qh_skipfacet(facet))
    -    return;
    -  if (qh PRINTnoplanes || (facet->visible && qh NEWfacets))
    -    return;
    -  if (!facet->normal)
    -    return;
    -  if (fp) {
    -    for (i=0; i < 3; i++) {
    -      color[i]= (facet->normal[i]+1.0)/2.0;
    -      maximize_(color[i], -1.0);
    -      minimize_(color[i], +1.0);
    -    }
    -  }
    -  facet->visitid= qh visit_id;
    -  if (facet->simplicial) {
    -    FOREACHneighbor_(facet) {
    -      if (neighbor->visitid != qh visit_id) {
    -        if (fp)
    -          qh_fprintf(fp, 9084, "3 %d %d %d %8.4g %8.4g %8.4g 1 # f%d f%d\n",
    -                 3*num, 3*num+1, 3*num+2, color[0], color[1], color[2],
    -                 facet->id, neighbor->id);
    -        num++;
    -      }
    -    }
    -  }else {
    -    FOREACHridge_(facet->ridges) {
    -      neighbor= otherfacet_(ridge, facet);
    -      if (neighbor->visitid != qh visit_id) {
    -        if (fp)
    -          qh_fprintf(fp, 9085, "3 %d %d %d %8.4g %8.4g %8.4g 1 #r%d f%d f%d\n",
    -                 3*num, 3*num+1, 3*num+2, color[0], color[1], color[2],
    -                 ridge->id, facet->id, neighbor->id);
    -        num++;
    -      }
    -    }
    -  }
    -  *nump= num;
    -} /* printend4geom */
    -
    -/*---------------------------------
    -
    -  qh_printextremes( fp, facetlist, facets, printall )
    -    print extreme points for convex hulls or halfspace intersections
    -
    -  notes:
    -    #points, followed by ids, one per line
    -
    -    sorted by id
    -    same order as qh_printpoints_out if no coplanar/interior points
    -*/
    -void qh_printextremes(FILE *fp, facetT *facetlist, setT *facets, boolT printall) {
    -  setT *vertices, *points;
    -  pointT *point;
    -  vertexT *vertex, **vertexp;
    -  int id;
    -  int numpoints=0, point_i, point_n;
    -  int allpoints= qh num_points + qh_setsize(qh other_points);
    -
    -  points= qh_settemp(allpoints);
    -  qh_setzero(points, 0, allpoints);
    -  vertices= qh_facetvertices(facetlist, facets, printall);
    -  FOREACHvertex_(vertices) {
    -    id= qh_pointid(vertex->point);
    -    if (id >= 0) {
    -      SETelem_(points, id)= vertex->point;
    -      numpoints++;
    -    }
    -  }
    -  qh_settempfree(&vertices);
    -  qh_fprintf(fp, 9086, "%d\n", numpoints);
    -  FOREACHpoint_i_(points) {
    -    if (point)
    -      qh_fprintf(fp, 9087, "%d\n", point_i);
    -  }
    -  qh_settempfree(&points);
    -} /* printextremes */
    -
    -/*---------------------------------
    -
    -  qh_printextremes_2d( fp, facetlist, facets, printall )
    -    prints point ids for facets in qh_ORIENTclock order
    -
    -  notes:
    -    #points, followed by ids, one per line
    -    if facetlist/facets are disjoint than the output includes skips
    -    errors if facets form a loop
    -    does not print coplanar points
    -*/
    -void qh_printextremes_2d(FILE *fp, facetT *facetlist, setT *facets, boolT printall) {
    -  int numfacets, numridges, totneighbors, numcoplanars, numsimplicial, numtricoplanars;
    -  setT *vertices;
    -  facetT *facet, *startfacet, *nextfacet;
    -  vertexT *vertexA, *vertexB;
    -
    -  qh_countfacets(facetlist, facets, printall, &numfacets, &numsimplicial,
    -      &totneighbors, &numridges, &numcoplanars, &numtricoplanars); /* marks qh visit_id */
    -  vertices= qh_facetvertices(facetlist, facets, printall);
    -  qh_fprintf(fp, 9088, "%d\n", qh_setsize(vertices));
    -  qh_settempfree(&vertices);
    -  if (!numfacets)
    -    return;
    -  facet= startfacet= facetlist ? facetlist : SETfirstt_(facets, facetT);
    -  qh vertex_visit++;
    -  qh visit_id++;
    -  do {
    -    if (facet->toporient ^ qh_ORIENTclock) {
    -      vertexA= SETfirstt_(facet->vertices, vertexT);
    -      vertexB= SETsecondt_(facet->vertices, vertexT);
    -      nextfacet= SETfirstt_(facet->neighbors, facetT);
    -    }else {
    -      vertexA= SETsecondt_(facet->vertices, vertexT);
    -      vertexB= SETfirstt_(facet->vertices, vertexT);
    -      nextfacet= SETsecondt_(facet->neighbors, facetT);
    -    }
    -    if (facet->visitid == qh visit_id) {
    -      qh_fprintf(qh ferr, 6218, "Qhull internal error (qh_printextremes_2d): loop in facet list.  facet %d nextfacet %d\n",
    -                 facet->id, nextfacet->id);
    -      qh_errexit2(qh_ERRqhull, facet, nextfacet);
    -    }
    -    if (facet->visitid) {
    -      if (vertexA->visitid != qh vertex_visit) {
    -        vertexA->visitid= qh vertex_visit;
    -        qh_fprintf(fp, 9089, "%d\n", qh_pointid(vertexA->point));
    -      }
    -      if (vertexB->visitid != qh vertex_visit) {
    -        vertexB->visitid= qh vertex_visit;
    -        qh_fprintf(fp, 9090, "%d\n", qh_pointid(vertexB->point));
    -      }
    -    }
    -    facet->visitid= qh visit_id;
    -    facet= nextfacet;
    -  }while (facet && facet != startfacet);
    -} /* printextremes_2d */
    -
    -/*---------------------------------
    -
    -  qh_printextremes_d( fp, facetlist, facets, printall )
    -    print extreme points of input sites for Delaunay triangulations
    -
    -  notes:
    -    #points, followed by ids, one per line
    -
    -    unordered
    -*/
    -void qh_printextremes_d(FILE *fp, facetT *facetlist, setT *facets, boolT printall) {
    -  setT *vertices;
    -  vertexT *vertex, **vertexp;
    -  boolT upperseen, lowerseen;
    -  facetT *neighbor, **neighborp;
    -  int numpoints=0;
    -
    -  vertices= qh_facetvertices(facetlist, facets, printall);
    -  qh_vertexneighbors();
    -  FOREACHvertex_(vertices) {
    -    upperseen= lowerseen= False;
    -    FOREACHneighbor_(vertex) {
    -      if (neighbor->upperdelaunay)
    -        upperseen= True;
    -      else
    -        lowerseen= True;
    -    }
    -    if (upperseen && lowerseen) {
    -      vertex->seen= True;
    -      numpoints++;
    -    }else
    -      vertex->seen= False;
    -  }
    -  qh_fprintf(fp, 9091, "%d\n", numpoints);
    -  FOREACHvertex_(vertices) {
    -    if (vertex->seen)
    -      qh_fprintf(fp, 9092, "%d\n", qh_pointid(vertex->point));
    -  }
    -  qh_settempfree(&vertices);
    -} /* printextremes_d */
    -
    -/*---------------------------------
    -
    -  qh_printfacet( fp, facet )
    -    prints all fields of a facet to fp
    -
    -  notes:
    -    ridges printed in neighbor order
    -*/
    -void qh_printfacet(FILE *fp, facetT *facet) {
    -
    -  qh_printfacetheader(fp, facet);
    -  if (facet->ridges)
    -    qh_printfacetridges(fp, facet);
    -} /* printfacet */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacet2geom( fp, facet, color )
    -    print facet as part of a 2-d VECT for Geomview
    -
    -    notes:
    -      assume precise calculations in io.c with roundoff covered by qh_GEOMepsilon
    -      mindist is calculated within io.c.  maxoutside is calculated elsewhere
    -      so a DISTround error may have occurred.
    -*/
    -void qh_printfacet2geom(FILE *fp, facetT *facet, realT color[3]) {
    -  pointT *point0, *point1;
    -  realT mindist, innerplane, outerplane;
    -  int k;
    -
    -  qh_facet2point(facet, &point0, &point1, &mindist);
    -  qh_geomplanes(facet, &outerplane, &innerplane);
    -  if (qh PRINTouter || (!qh PRINTnoplanes && !qh PRINTinner))
    -    qh_printfacet2geom_points(fp, point0, point1, facet, outerplane, color);
    -  if (qh PRINTinner || (!qh PRINTnoplanes && !qh PRINTouter &&
    -                outerplane - innerplane > 2 * qh MAXabs_coord * qh_GEOMepsilon)) {
    -    for (k=3; k--; )
    -      color[k]= 1.0 - color[k];
    -    qh_printfacet2geom_points(fp, point0, point1, facet, innerplane, color);
    -  }
    -  qh_memfree(point1, qh normal_size);
    -  qh_memfree(point0, qh normal_size);
    -} /* printfacet2geom */
    -
    -/*---------------------------------
    -
    -  qh_printfacet2geom_points( fp, point1, point2, facet, offset, color )
    -    prints a 2-d facet as a VECT with 2 points at some offset.
    -    The points are on the facet's plane.
    -*/
    -void qh_printfacet2geom_points(FILE *fp, pointT *point1, pointT *point2,
    -                               facetT *facet, realT offset, realT color[3]) {
    -  pointT *p1= point1, *p2= point2;
    -
    -  qh_fprintf(fp, 9093, "VECT 1 2 1 2 1 # f%d\n", facet->id);
    -  if (offset != 0.0) {
    -    p1= qh_projectpoint(p1, facet, -offset);
    -    p2= qh_projectpoint(p2, facet, -offset);
    -  }
    -  qh_fprintf(fp, 9094, "%8.4g %8.4g %8.4g\n%8.4g %8.4g %8.4g\n",
    -           p1[0], p1[1], 0.0, p2[0], p2[1], 0.0);
    -  if (offset != 0.0) {
    -    qh_memfree(p1, qh normal_size);
    -    qh_memfree(p2, qh normal_size);
    -  }
    -  qh_fprintf(fp, 9095, "%8.4g %8.4g %8.4g 1.0\n", color[0], color[1], color[2]);
    -} /* printfacet2geom_points */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacet2math( fp, facet, format, notfirst )
    -    print 2-d Maple or Mathematica output for a facet
    -    may be non-simplicial
    -
    -  notes:
    -    use %16.8f since Mathematica 2.2 does not handle exponential format
    -    see qh_printfacet3math
    -*/
    -void qh_printfacet2math(FILE *fp, facetT *facet, qh_PRINT format, int notfirst) {
    -  pointT *point0, *point1;
    -  realT mindist;
    -  const char *pointfmt;
    -
    -  qh_facet2point(facet, &point0, &point1, &mindist);
    -  if (notfirst)
    -    qh_fprintf(fp, 9096, ",");
    -  if (format == qh_PRINTmaple)
    -    pointfmt= "[[%16.8f, %16.8f], [%16.8f, %16.8f]]\n";
    -  else
    -    pointfmt= "Line[{{%16.8f, %16.8f}, {%16.8f, %16.8f}}]\n";
    -  qh_fprintf(fp, 9097, pointfmt, point0[0], point0[1], point1[0], point1[1]);
    -  qh_memfree(point1, qh normal_size);
    -  qh_memfree(point0, qh normal_size);
    -} /* printfacet2math */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacet3geom_nonsimplicial( fp, facet, color )
    -    print Geomview OFF for a 3-d nonsimplicial facet.
    -    if DOintersections, prints ridges to unvisited neighbors(qh visit_id)
    -
    -  notes
    -    uses facet->visitid for intersections and ridges
    -*/
    -void qh_printfacet3geom_nonsimplicial(FILE *fp, facetT *facet, realT color[3]) {
    -  ridgeT *ridge, **ridgep;
    -  setT *projectedpoints, *vertices;
    -  vertexT *vertex, **vertexp, *vertexA, *vertexB;
    -  pointT *projpt, *point, **pointp;
    -  facetT *neighbor;
    -  realT dist, outerplane, innerplane;
    -  int cntvertices, k;
    -  realT black[3]={0, 0, 0}, green[3]={0, 1, 0};
    -
    -  qh_geomplanes(facet, &outerplane, &innerplane);
    -  vertices= qh_facet3vertex(facet); /* oriented */
    -  cntvertices= qh_setsize(vertices);
    -  projectedpoints= qh_settemp(cntvertices);
    -  FOREACHvertex_(vertices) {
    -    zinc_(Zdistio);
    -    qh_distplane(vertex->point, facet, &dist);
    -    projpt= qh_projectpoint(vertex->point, facet, dist);
    -    qh_setappend(&projectedpoints, projpt);
    -  }
    -  if (qh PRINTouter || (!qh PRINTnoplanes && !qh PRINTinner))
    -    qh_printfacet3geom_points(fp, projectedpoints, facet, outerplane, color);
    -  if (qh PRINTinner || (!qh PRINTnoplanes && !qh PRINTouter &&
    -                outerplane - innerplane > 2 * qh MAXabs_coord * qh_GEOMepsilon)) {
    -    for (k=3; k--; )
    -      color[k]= 1.0 - color[k];
    -    qh_printfacet3geom_points(fp, projectedpoints, facet, innerplane, color);
    -  }
    -  FOREACHpoint_(projectedpoints)
    -    qh_memfree(point, qh normal_size);
    -  qh_settempfree(&projectedpoints);
    -  qh_settempfree(&vertices);
    -  if ((qh DOintersections || qh PRINTridges)
    -  && (!facet->visible || !qh NEWfacets)) {
    -    facet->visitid= qh visit_id;
    -    FOREACHridge_(facet->ridges) {
    -      neighbor= otherfacet_(ridge, facet);
    -      if (neighbor->visitid != qh visit_id) {
    -        if (qh DOintersections)
    -          qh_printhyperplaneintersection(fp, facet, neighbor, ridge->vertices, black);
    -        if (qh PRINTridges) {
    -          vertexA= SETfirstt_(ridge->vertices, vertexT);
    -          vertexB= SETsecondt_(ridge->vertices, vertexT);
    -          qh_printline3geom(fp, vertexA->point, vertexB->point, green);
    -        }
    -      }
    -    }
    -  }
    -} /* printfacet3geom_nonsimplicial */
    -
    -/*---------------------------------
    -
    -  qh_printfacet3geom_points( fp, points, facet, offset )
    -    prints a 3-d facet as OFF Geomview object.
    -    offset is relative to the facet's hyperplane
    -    Facet is determined as a list of points
    -*/
    -void qh_printfacet3geom_points(FILE *fp, setT *points, facetT *facet, realT offset, realT color[3]) {
    -  int k, n= qh_setsize(points), i;
    -  pointT *point, **pointp;
    -  setT *printpoints;
    -
    -  qh_fprintf(fp, 9098, "{ OFF %d 1 1 # f%d\n", n, facet->id);
    -  if (offset != 0.0) {
    -    printpoints= qh_settemp(n);
    -    FOREACHpoint_(points)
    -      qh_setappend(&printpoints, qh_projectpoint(point, facet, -offset));
    -  }else
    -    printpoints= points;
    -  FOREACHpoint_(printpoints) {
    -    for (k=0; k < qh hull_dim; k++) {
    -      if (k == qh DROPdim)
    -        qh_fprintf(fp, 9099, "0 ");
    -      else
    -        qh_fprintf(fp, 9100, "%8.4g ", point[k]);
    -    }
    -    if (printpoints != points)
    -      qh_memfree(point, qh normal_size);
    -    qh_fprintf(fp, 9101, "\n");
    -  }
    -  if (printpoints != points)
    -    qh_settempfree(&printpoints);
    -  qh_fprintf(fp, 9102, "%d ", n);
    -  for (i=0; i < n; i++)
    -    qh_fprintf(fp, 9103, "%d ", i);
    -  qh_fprintf(fp, 9104, "%8.4g %8.4g %8.4g 1.0 }\n", color[0], color[1], color[2]);
    -} /* printfacet3geom_points */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacet3geom_simplicial(  )
    -    print Geomview OFF for a 3-d simplicial facet.
    -
    -  notes:
    -    may flip color
    -    uses facet->visitid for intersections and ridges
    -
    -    assume precise calculations in io.c with roundoff covered by qh_GEOMepsilon
    -    innerplane may be off by qh DISTround.  Maxoutside is calculated elsewhere
    -    so a DISTround error may have occurred.
    -*/
    -void qh_printfacet3geom_simplicial(FILE *fp, facetT *facet, realT color[3]) {
    -  setT *points, *vertices;
    -  vertexT *vertex, **vertexp, *vertexA, *vertexB;
    -  facetT *neighbor, **neighborp;
    -  realT outerplane, innerplane;
    -  realT black[3]={0, 0, 0}, green[3]={0, 1, 0};
    -  int k;
    -
    -  qh_geomplanes(facet, &outerplane, &innerplane);
    -  vertices= qh_facet3vertex(facet);
    -  points= qh_settemp(qh TEMPsize);
    -  FOREACHvertex_(vertices)
    -    qh_setappend(&points, vertex->point);
    -  if (qh PRINTouter || (!qh PRINTnoplanes && !qh PRINTinner))
    -    qh_printfacet3geom_points(fp, points, facet, outerplane, color);
    -  if (qh PRINTinner || (!qh PRINTnoplanes && !qh PRINTouter &&
    -              outerplane - innerplane > 2 * qh MAXabs_coord * qh_GEOMepsilon)) {
    -    for (k=3; k--; )
    -      color[k]= 1.0 - color[k];
    -    qh_printfacet3geom_points(fp, points, facet, innerplane, color);
    -  }
    -  qh_settempfree(&points);
    -  qh_settempfree(&vertices);
    -  if ((qh DOintersections || qh PRINTridges)
    -  && (!facet->visible || !qh NEWfacets)) {
    -    facet->visitid= qh visit_id;
    -    FOREACHneighbor_(facet) {
    -      if (neighbor->visitid != qh visit_id) {
    -        vertices= qh_setnew_delnthsorted(facet->vertices, qh hull_dim,
    -                          SETindex_(facet->neighbors, neighbor), 0);
    -        if (qh DOintersections)
    -           qh_printhyperplaneintersection(fp, facet, neighbor, vertices, black);
    -        if (qh PRINTridges) {
    -          vertexA= SETfirstt_(vertices, vertexT);
    -          vertexB= SETsecondt_(vertices, vertexT);
    -          qh_printline3geom(fp, vertexA->point, vertexB->point, green);
    -        }
    -        qh_setfree(&vertices);
    -      }
    -    }
    -  }
    -} /* printfacet3geom_simplicial */
    -
    -/*---------------------------------
    -
    -  qh_printfacet3math( fp, facet, notfirst )
    -    print 3-d Maple or Mathematica output for a facet
    -
    -  notes:
    -    may be non-simplicial
    -    use %16.8f since Mathematica 2.2 does not handle exponential format
    -    see qh_printfacet2math
    -*/
    -void qh_printfacet3math(FILE *fp, facetT *facet, qh_PRINT format, int notfirst) {
    -  vertexT *vertex, **vertexp;
    -  setT *points, *vertices;
    -  pointT *point, **pointp;
    -  boolT firstpoint= True;
    -  realT dist;
    -  const char *pointfmt, *endfmt;
    -
    -  if (notfirst)
    -    qh_fprintf(fp, 9105, ",\n");
    -  vertices= qh_facet3vertex(facet);
    -  points= qh_settemp(qh_setsize(vertices));
    -  FOREACHvertex_(vertices) {
    -    zinc_(Zdistio);
    -    qh_distplane(vertex->point, facet, &dist);
    -    point= qh_projectpoint(vertex->point, facet, dist);
    -    qh_setappend(&points, point);
    -  }
    -  if (format == qh_PRINTmaple) {
    -    qh_fprintf(fp, 9106, "[");
    -    pointfmt= "[%16.8f, %16.8f, %16.8f]";
    -    endfmt= "]";
    -  }else {
    -    qh_fprintf(fp, 9107, "Polygon[{");
    -    pointfmt= "{%16.8f, %16.8f, %16.8f}";
    -    endfmt= "}]";
    -  }
    -  FOREACHpoint_(points) {
    -    if (firstpoint)
    -      firstpoint= False;
    -    else
    -      qh_fprintf(fp, 9108, ",\n");
    -    qh_fprintf(fp, 9109, pointfmt, point[0], point[1], point[2]);
    -  }
    -  FOREACHpoint_(points)
    -    qh_memfree(point, qh normal_size);
    -  qh_settempfree(&points);
    -  qh_settempfree(&vertices);
    -  qh_fprintf(fp, 9110, "%s", endfmt);
    -} /* printfacet3math */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacet3vertex( fp, facet, format )
    -    print vertices in a 3-d facet as point ids
    -
    -  notes:
    -    prints number of vertices first if format == qh_PRINToff
    -    the facet may be non-simplicial
    -*/
    -void qh_printfacet3vertex(FILE *fp, facetT *facet, qh_PRINT format) {
    -  vertexT *vertex, **vertexp;
    -  setT *vertices;
    -
    -  vertices= qh_facet3vertex(facet);
    -  if (format == qh_PRINToff)
    -    qh_fprintf(fp, 9111, "%d ", qh_setsize(vertices));
    -  FOREACHvertex_(vertices)
    -    qh_fprintf(fp, 9112, "%d ", qh_pointid(vertex->point));
    -  qh_fprintf(fp, 9113, "\n");
    -  qh_settempfree(&vertices);
    -} /* printfacet3vertex */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacet4geom_nonsimplicial(  )
    -    print Geomview 4OFF file for a 4d nonsimplicial facet
    -    prints all ridges to unvisited neighbors (qh.visit_id)
    -    if qh.DROPdim
    -      prints in OFF format
    -
    -  notes:
    -    must agree with printend4geom()
    -*/
    -void qh_printfacet4geom_nonsimplicial(FILE *fp, facetT *facet, realT color[3]) {
    -  facetT *neighbor;
    -  ridgeT *ridge, **ridgep;
    -  vertexT *vertex, **vertexp;
    -  pointT *point;
    -  int k;
    -  realT dist;
    -
    -  facet->visitid= qh visit_id;
    -  if (qh PRINTnoplanes || (facet->visible && qh NEWfacets))
    -    return;
    -  FOREACHridge_(facet->ridges) {
    -    neighbor= otherfacet_(ridge, facet);
    -    if (neighbor->visitid == qh visit_id)
    -      continue;
    -    if (qh PRINTtransparent && !neighbor->good)
    -      continue;
    -    if (qh DOintersections)
    -      qh_printhyperplaneintersection(fp, facet, neighbor, ridge->vertices, color);
    -    else {
    -      if (qh DROPdim >= 0)
    -        qh_fprintf(fp, 9114, "OFF 3 1 1 # f%d\n", facet->id);
    -      else {
    -        qh printoutvar++;
    -        qh_fprintf(fp, 9115, "# r%d between f%d f%d\n", ridge->id, facet->id, neighbor->id);
    -      }
    -      FOREACHvertex_(ridge->vertices) {
    -        zinc_(Zdistio);
    -        qh_distplane(vertex->point,facet, &dist);
    -        point=qh_projectpoint(vertex->point,facet, dist);
    -        for (k=0; k < qh hull_dim; k++) {
    -          if (k != qh DROPdim)
    -            qh_fprintf(fp, 9116, "%8.4g ", point[k]);
    -        }
    -        qh_fprintf(fp, 9117, "\n");
    -        qh_memfree(point, qh normal_size);
    -      }
    -      if (qh DROPdim >= 0)
    -        qh_fprintf(fp, 9118, "3 0 1 2 %8.4g %8.4g %8.4g\n", color[0], color[1], color[2]);
    -    }
    -  }
    -} /* printfacet4geom_nonsimplicial */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacet4geom_simplicial( fp, facet, color )
    -    print Geomview 4OFF file for a 4d simplicial facet
    -    prints triangles for unvisited neighbors (qh.visit_id)
    -
    -  notes:
    -    must agree with printend4geom()
    -*/
    -void qh_printfacet4geom_simplicial(FILE *fp, facetT *facet, realT color[3]) {
    -  setT *vertices;
    -  facetT *neighbor, **neighborp;
    -  vertexT *vertex, **vertexp;
    -  int k;
    -
    -  facet->visitid= qh visit_id;
    -  if (qh PRINTnoplanes || (facet->visible && qh NEWfacets))
    -    return;
    -  FOREACHneighbor_(facet) {
    -    if (neighbor->visitid == qh visit_id)
    -      continue;
    -    if (qh PRINTtransparent && !neighbor->good)
    -      continue;
    -    vertices= qh_setnew_delnthsorted(facet->vertices, qh hull_dim,
    -                          SETindex_(facet->neighbors, neighbor), 0);
    -    if (qh DOintersections)
    -      qh_printhyperplaneintersection(fp, facet, neighbor, vertices, color);
    -    else {
    -      if (qh DROPdim >= 0)
    -        qh_fprintf(fp, 9119, "OFF 3 1 1 # ridge between f%d f%d\n",
    -                facet->id, neighbor->id);
    -      else {
    -        qh printoutvar++;
    -        qh_fprintf(fp, 9120, "# ridge between f%d f%d\n", facet->id, neighbor->id);
    -      }
    -      FOREACHvertex_(vertices) {
    -        for (k=0; k < qh hull_dim; k++) {
    -          if (k != qh DROPdim)
    -            qh_fprintf(fp, 9121, "%8.4g ", vertex->point[k]);
    -        }
    -        qh_fprintf(fp, 9122, "\n");
    -      }
    -      if (qh DROPdim >= 0)
    -        qh_fprintf(fp, 9123, "3 0 1 2 %8.4g %8.4g %8.4g\n", color[0], color[1], color[2]);
    -    }
    -    qh_setfree(&vertices);
    -  }
    -} /* printfacet4geom_simplicial */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacetNvertex_nonsimplicial( fp, facet, id, format )
    -    print vertices for an N-d non-simplicial facet
    -    triangulates each ridge to the id
    -*/
    -void qh_printfacetNvertex_nonsimplicial(FILE *fp, facetT *facet, int id, qh_PRINT format) {
    -  vertexT *vertex, **vertexp;
    -  ridgeT *ridge, **ridgep;
    -
    -  if (facet->visible && qh NEWfacets)
    -    return;
    -  FOREACHridge_(facet->ridges) {
    -    if (format == qh_PRINTtriangles)
    -      qh_fprintf(fp, 9124, "%d ", qh hull_dim);
    -    qh_fprintf(fp, 9125, "%d ", id);
    -    if ((ridge->top == facet) ^ qh_ORIENTclock) {
    -      FOREACHvertex_(ridge->vertices)
    -        qh_fprintf(fp, 9126, "%d ", qh_pointid(vertex->point));
    -    }else {
    -      FOREACHvertexreverse12_(ridge->vertices)
    -        qh_fprintf(fp, 9127, "%d ", qh_pointid(vertex->point));
    -    }
    -    qh_fprintf(fp, 9128, "\n");
    -  }
    -} /* printfacetNvertex_nonsimplicial */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacetNvertex_simplicial( fp, facet, format )
    -    print vertices for an N-d simplicial facet
    -    prints vertices for non-simplicial facets
    -      2-d facets (orientation preserved by qh_mergefacet2d)
    -      PRINToff ('o') for 4-d and higher
    -*/
    -void qh_printfacetNvertex_simplicial(FILE *fp, facetT *facet, qh_PRINT format) {
    -  vertexT *vertex, **vertexp;
    -
    -  if (format == qh_PRINToff || format == qh_PRINTtriangles)
    -    qh_fprintf(fp, 9129, "%d ", qh_setsize(facet->vertices));
    -  if ((facet->toporient ^ qh_ORIENTclock)
    -  || (qh hull_dim > 2 && !facet->simplicial)) {
    -    FOREACHvertex_(facet->vertices)
    -      qh_fprintf(fp, 9130, "%d ", qh_pointid(vertex->point));
    -  }else {
    -    FOREACHvertexreverse12_(facet->vertices)
    -      qh_fprintf(fp, 9131, "%d ", qh_pointid(vertex->point));
    -  }
    -  qh_fprintf(fp, 9132, "\n");
    -} /* printfacetNvertex_simplicial */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacetheader( fp, facet )
    -    prints header fields of a facet to fp
    -
    -  notes:
    -    for 'f' output and debugging
    -    Same as QhullFacet::printHeader()
    -*/
    -void qh_printfacetheader(FILE *fp, facetT *facet) {
    -  pointT *point, **pointp, *furthest;
    -  facetT *neighbor, **neighborp;
    -  realT dist;
    -
    -  if (facet == qh_MERGEridge) {
    -    qh_fprintf(fp, 9133, " MERGEridge\n");
    -    return;
    -  }else if (facet == qh_DUPLICATEridge) {
    -    qh_fprintf(fp, 9134, " DUPLICATEridge\n");
    -    return;
    -  }else if (!facet) {
    -    qh_fprintf(fp, 9135, " NULLfacet\n");
    -    return;
    -  }
    -  qh old_randomdist= qh RANDOMdist;
    -  qh RANDOMdist= False;
    -  qh_fprintf(fp, 9136, "- f%d\n", facet->id);
    -  qh_fprintf(fp, 9137, "    - flags:");
    -  if (facet->toporient)
    -    qh_fprintf(fp, 9138, " top");
    -  else
    -    qh_fprintf(fp, 9139, " bottom");
    -  if (facet->simplicial)
    -    qh_fprintf(fp, 9140, " simplicial");
    -  if (facet->tricoplanar)
    -    qh_fprintf(fp, 9141, " tricoplanar");
    -  if (facet->upperdelaunay)
    -    qh_fprintf(fp, 9142, " upperDelaunay");
    -  if (facet->visible)
    -    qh_fprintf(fp, 9143, " visible");
    -  if (facet->newfacet)
    -    qh_fprintf(fp, 9144, " new");
    -  if (facet->tested)
    -    qh_fprintf(fp, 9145, " tested");
    -  if (!facet->good)
    -    qh_fprintf(fp, 9146, " notG");
    -  if (facet->seen)
    -    qh_fprintf(fp, 9147, " seen");
    -  if (facet->coplanar)
    -    qh_fprintf(fp, 9148, " coplanar");
    -  if (facet->mergehorizon)
    -    qh_fprintf(fp, 9149, " mergehorizon");
    -  if (facet->keepcentrum)
    -    qh_fprintf(fp, 9150, " keepcentrum");
    -  if (facet->dupridge)
    -    qh_fprintf(fp, 9151, " dupridge");
    -  if (facet->mergeridge && !facet->mergeridge2)
    -    qh_fprintf(fp, 9152, " mergeridge1");
    -  if (facet->mergeridge2)
    -    qh_fprintf(fp, 9153, " mergeridge2");
    -  if (facet->newmerge)
    -    qh_fprintf(fp, 9154, " newmerge");
    -  if (facet->flipped)
    -    qh_fprintf(fp, 9155, " flipped");
    -  if (facet->notfurthest)
    -    qh_fprintf(fp, 9156, " notfurthest");
    -  if (facet->degenerate)
    -    qh_fprintf(fp, 9157, " degenerate");
    -  if (facet->redundant)
    -    qh_fprintf(fp, 9158, " redundant");
    -  qh_fprintf(fp, 9159, "\n");
    -  if (facet->isarea)
    -    qh_fprintf(fp, 9160, "    - area: %2.2g\n", facet->f.area);
    -  else if (qh NEWfacets && facet->visible && facet->f.replace)
    -    qh_fprintf(fp, 9161, "    - replacement: f%d\n", facet->f.replace->id);
    -  else if (facet->newfacet) {
    -    if (facet->f.samecycle && facet->f.samecycle != facet)
    -      qh_fprintf(fp, 9162, "    - shares same visible/horizon as f%d\n", facet->f.samecycle->id);
    -  }else if (facet->tricoplanar /* !isarea */) {
    -    if (facet->f.triowner)
    -      qh_fprintf(fp, 9163, "    - owner of normal & centrum is facet f%d\n", facet->f.triowner->id);
    -  }else if (facet->f.newcycle)
    -    qh_fprintf(fp, 9164, "    - was horizon to f%d\n", facet->f.newcycle->id);
    -  if (facet->nummerge)
    -    qh_fprintf(fp, 9165, "    - merges: %d\n", facet->nummerge);
    -  qh_printpointid(fp, "    - normal: ", qh hull_dim, facet->normal, qh_IDunknown);
    -  qh_fprintf(fp, 9166, "    - offset: %10.7g\n", facet->offset);
    -  if (qh CENTERtype == qh_ASvoronoi || facet->center)
    -    qh_printcenter(fp, qh_PRINTfacets, "    - center: ", facet);
    -#if qh_MAXoutside
    -  if (facet->maxoutside > qh DISTround)
    -    qh_fprintf(fp, 9167, "    - maxoutside: %10.7g\n", facet->maxoutside);
    -#endif
    -  if (!SETempty_(facet->outsideset)) {
    -    furthest= (pointT*)qh_setlast(facet->outsideset);
    -    if (qh_setsize(facet->outsideset) < 6) {
    -      qh_fprintf(fp, 9168, "    - outside set(furthest p%d):\n", qh_pointid(furthest));
    -      FOREACHpoint_(facet->outsideset)
    -        qh_printpoint(fp, "     ", point);
    -    }else if (qh_setsize(facet->outsideset) < 21) {
    -      qh_printpoints(fp, "    - outside set:", facet->outsideset);
    -    }else {
    -      qh_fprintf(fp, 9169, "    - outside set:  %d points.", qh_setsize(facet->outsideset));
    -      qh_printpoint(fp, "  Furthest", furthest);
    -    }
    -#if !qh_COMPUTEfurthest
    -    qh_fprintf(fp, 9170, "    - furthest distance= %2.2g\n", facet->furthestdist);
    -#endif
    -  }
    -  if (!SETempty_(facet->coplanarset)) {
    -    furthest= (pointT*)qh_setlast(facet->coplanarset);
    -    if (qh_setsize(facet->coplanarset) < 6) {
    -      qh_fprintf(fp, 9171, "    - coplanar set(furthest p%d):\n", qh_pointid(furthest));
    -      FOREACHpoint_(facet->coplanarset)
    -        qh_printpoint(fp, "     ", point);
    -    }else if (qh_setsize(facet->coplanarset) < 21) {
    -      qh_printpoints(fp, "    - coplanar set:", facet->coplanarset);
    -    }else {
    -      qh_fprintf(fp, 9172, "    - coplanar set:  %d points.", qh_setsize(facet->coplanarset));
    -      qh_printpoint(fp, "  Furthest", furthest);
    -    }
    -    zinc_(Zdistio);
    -    qh_distplane(furthest, facet, &dist);
    -    qh_fprintf(fp, 9173, "      furthest distance= %2.2g\n", dist);
    -  }
    -  qh_printvertices(fp, "    - vertices:", facet->vertices);
    -  qh_fprintf(fp, 9174, "    - neighboring facets:");
    -  FOREACHneighbor_(facet) {
    -    if (neighbor == qh_MERGEridge)
    -      qh_fprintf(fp, 9175, " MERGE");
    -    else if (neighbor == qh_DUPLICATEridge)
    -      qh_fprintf(fp, 9176, " DUP");
    -    else
    -      qh_fprintf(fp, 9177, " f%d", neighbor->id);
    -  }
    -  qh_fprintf(fp, 9178, "\n");
    -  qh RANDOMdist= qh old_randomdist;
    -} /* printfacetheader */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacetridges( fp, facet )
    -    prints ridges of a facet to fp
    -
    -  notes:
    -    ridges printed in neighbor order
    -    assumes the ridges exist
    -    for 'f' output
    -    same as QhullFacet::printRidges
    -*/
    -void qh_printfacetridges(FILE *fp, facetT *facet) {
    -  facetT *neighbor, **neighborp;
    -  ridgeT *ridge, **ridgep;
    -  int numridges= 0;
    -
    -
    -  if (facet->visible && qh NEWfacets) {
    -    qh_fprintf(fp, 9179, "    - ridges(ids may be garbage):");
    -    FOREACHridge_(facet->ridges)
    -      qh_fprintf(fp, 9180, " r%d", ridge->id);
    -    qh_fprintf(fp, 9181, "\n");
    -  }else {
    -    qh_fprintf(fp, 9182, "    - ridges:\n");
    -    FOREACHridge_(facet->ridges)
    -      ridge->seen= False;
    -    if (qh hull_dim == 3) {
    -      ridge= SETfirstt_(facet->ridges, ridgeT);
    -      while (ridge && !ridge->seen) {
    -        ridge->seen= True;
    -        qh_printridge(fp, ridge);
    -        numridges++;
    -        ridge= qh_nextridge3d(ridge, facet, NULL);
    -        }
    -    }else {
    -      FOREACHneighbor_(facet) {
    -        FOREACHridge_(facet->ridges) {
    -          if (otherfacet_(ridge,facet) == neighbor) {
    -            ridge->seen= True;
    -            qh_printridge(fp, ridge);
    -            numridges++;
    -          }
    -        }
    -      }
    -    }
    -    if (numridges != qh_setsize(facet->ridges)) {
    -      qh_fprintf(fp, 9183, "     - all ridges:");
    -      FOREACHridge_(facet->ridges)
    -        qh_fprintf(fp, 9184, " r%d", ridge->id);
    -        qh_fprintf(fp, 9185, "\n");
    -    }
    -    FOREACHridge_(facet->ridges) {
    -      if (!ridge->seen)
    -        qh_printridge(fp, ridge);
    -    }
    -  }
    -} /* printfacetridges */
    -
    -/*---------------------------------
    -
    -  qh_printfacets( fp, format, facetlist, facets, printall )
    -    prints facetlist and/or facet set in output format
    -
    -  notes:
    -    also used for specialized formats ('FO' and summary)
    -    turns off 'Rn' option since want actual numbers
    -*/
    -void qh_printfacets(FILE *fp, qh_PRINT format, facetT *facetlist, setT *facets, boolT printall) {
    -  int numfacets, numsimplicial, numridges, totneighbors, numcoplanars, numtricoplanars;
    -  facetT *facet, **facetp;
    -  setT *vertices;
    -  coordT *center;
    -  realT outerplane, innerplane;
    -
    -  qh old_randomdist= qh RANDOMdist;
    -  qh RANDOMdist= False;
    -  if (qh CDDoutput && (format == qh_PRINTcentrums || format == qh_PRINTpointintersect || format == qh_PRINToff))
    -    qh_fprintf(qh ferr, 7056, "qhull warning: CDD format is not available for centrums, halfspace\nintersections, and OFF file format.\n");
    -  if (format == qh_PRINTnone)
    -    ; /* print nothing */
    -  else if (format == qh_PRINTaverage) {
    -    vertices= qh_facetvertices(facetlist, facets, printall);
    -    center= qh_getcenter(vertices);
    -    qh_fprintf(fp, 9186, "%d 1\n", qh hull_dim);
    -    qh_printpointid(fp, NULL, qh hull_dim, center, qh_IDunknown);
    -    qh_memfree(center, qh normal_size);
    -    qh_settempfree(&vertices);
    -  }else if (format == qh_PRINTextremes) {
    -    if (qh DELAUNAY)
    -      qh_printextremes_d(fp, facetlist, facets, printall);
    -    else if (qh hull_dim == 2)
    -      qh_printextremes_2d(fp, facetlist, facets, printall);
    -    else
    -      qh_printextremes(fp, facetlist, facets, printall);
    -  }else if (format == qh_PRINToptions)
    -    qh_fprintf(fp, 9187, "Options selected for Qhull %s:\n%s\n", qh_version, qh qhull_options);
    -  else if (format == qh_PRINTpoints && !qh VORONOI)
    -    qh_printpoints_out(fp, facetlist, facets, printall);
    -  else if (format == qh_PRINTqhull)
    -    qh_fprintf(fp, 9188, "%s | %s\n", qh rbox_command, qh qhull_command);
    -  else if (format == qh_PRINTsize) {
    -    qh_fprintf(fp, 9189, "0\n2 ");
    -    qh_fprintf(fp, 9190, qh_REAL_1, qh totarea);
    -    qh_fprintf(fp, 9191, qh_REAL_1, qh totvol);
    -    qh_fprintf(fp, 9192, "\n");
    -  }else if (format == qh_PRINTsummary) {
    -    qh_countfacets(facetlist, facets, printall, &numfacets, &numsimplicial,
    -      &totneighbors, &numridges, &numcoplanars, &numtricoplanars);
    -    vertices= qh_facetvertices(facetlist, facets, printall);
    -    qh_fprintf(fp, 9193, "10 %d %d %d %d %d %d %d %d %d %d\n2 ", qh hull_dim,
    -                qh num_points + qh_setsize(qh other_points),
    -                qh num_vertices, qh num_facets - qh num_visible,
    -                qh_setsize(vertices), numfacets, numcoplanars,
    -                numfacets - numsimplicial, zzval_(Zdelvertextot),
    -                numtricoplanars);
    -    qh_settempfree(&vertices);
    -    qh_outerinner(NULL, &outerplane, &innerplane);
    -    qh_fprintf(fp, 9194, qh_REAL_2n, outerplane, innerplane);
    -  }else if (format == qh_PRINTvneighbors)
    -    qh_printvneighbors(fp, facetlist, facets, printall);
    -  else if (qh VORONOI && format == qh_PRINToff)
    -    qh_printvoronoi(fp, format, facetlist, facets, printall);
    -  else if (qh VORONOI && format == qh_PRINTgeom) {
    -    qh_printbegin(fp, format, facetlist, facets, printall);
    -    qh_printvoronoi(fp, format, facetlist, facets, printall);
    -    qh_printend(fp, format, facetlist, facets, printall);
    -  }else if (qh VORONOI
    -  && (format == qh_PRINTvertices || format == qh_PRINTinner || format == qh_PRINTouter))
    -    qh_printvdiagram(fp, format, facetlist, facets, printall);
    -  else {
    -    qh_printbegin(fp, format, facetlist, facets, printall);
    -    FORALLfacet_(facetlist)
    -      qh_printafacet(fp, format, facet, printall);
    -    FOREACHfacet_(facets)
    -      qh_printafacet(fp, format, facet, printall);
    -    qh_printend(fp, format, facetlist, facets, printall);
    -  }
    -  qh RANDOMdist= qh old_randomdist;
    -} /* printfacets */
    -
    -
    -/*---------------------------------
    -
    -  qh_printhyperplaneintersection( fp, facet1, facet2, vertices, color )
    -    print Geomview OFF or 4OFF for the intersection of two hyperplanes in 3-d or 4-d
    -*/
    -void qh_printhyperplaneintersection(FILE *fp, facetT *facet1, facetT *facet2,
    -                   setT *vertices, realT color[3]) {
    -  realT costheta, denominator, dist1, dist2, s, t, mindenom, p[4];
    -  vertexT *vertex, **vertexp;
    -  int i, k;
    -  boolT nearzero1, nearzero2;
    -
    -  costheta= qh_getangle(facet1->normal, facet2->normal);
    -  denominator= 1 - costheta * costheta;
    -  i= qh_setsize(vertices);
    -  if (qh hull_dim == 3)
    -    qh_fprintf(fp, 9195, "VECT 1 %d 1 %d 1 ", i, i);
    -  else if (qh hull_dim == 4 && qh DROPdim >= 0)
    -    qh_fprintf(fp, 9196, "OFF 3 1 1 ");
    -  else
    -    qh printoutvar++;
    -  qh_fprintf(fp, 9197, "# intersect f%d f%d\n", facet1->id, facet2->id);
    -  mindenom= 1 / (10.0 * qh MAXabs_coord);
    -  FOREACHvertex_(vertices) {
    -    zadd_(Zdistio, 2);
    -    qh_distplane(vertex->point, facet1, &dist1);
    -    qh_distplane(vertex->point, facet2, &dist2);
    -    s= qh_divzero(-dist1 + costheta * dist2, denominator,mindenom,&nearzero1);
    -    t= qh_divzero(-dist2 + costheta * dist1, denominator,mindenom,&nearzero2);
    -    if (nearzero1 || nearzero2)
    -      s= t= 0.0;
    -    for (k=qh hull_dim; k--; )
    -      p[k]= vertex->point[k] + facet1->normal[k] * s + facet2->normal[k] * t;
    -    if (qh PRINTdim <= 3) {
    -      qh_projectdim3(p, p);
    -      qh_fprintf(fp, 9198, "%8.4g %8.4g %8.4g # ", p[0], p[1], p[2]);
    -    }else
    -      qh_fprintf(fp, 9199, "%8.4g %8.4g %8.4g %8.4g # ", p[0], p[1], p[2], p[3]);
    -    if (nearzero1+nearzero2)
    -      qh_fprintf(fp, 9200, "p%d(coplanar facets)\n", qh_pointid(vertex->point));
    -    else
    -      qh_fprintf(fp, 9201, "projected p%d\n", qh_pointid(vertex->point));
    -  }
    -  if (qh hull_dim == 3)
    -    qh_fprintf(fp, 9202, "%8.4g %8.4g %8.4g 1.0\n", color[0], color[1], color[2]);
    -  else if (qh hull_dim == 4 && qh DROPdim >= 0)
    -    qh_fprintf(fp, 9203, "3 0 1 2 %8.4g %8.4g %8.4g 1.0\n", color[0], color[1], color[2]);
    -} /* printhyperplaneintersection */
    -
    -/*---------------------------------
    -
    -  qh_printline3geom( fp, pointA, pointB, color )
    -    prints a line as a VECT
    -    prints 0's for qh.DROPdim
    -
    -  notes:
    -    if pointA == pointB,
    -      it's a 1 point VECT
    -*/
    -void qh_printline3geom(FILE *fp, pointT *pointA, pointT *pointB, realT color[3]) {
    -  int k;
    -  realT pA[4], pB[4];
    -
    -  qh_projectdim3(pointA, pA);
    -  qh_projectdim3(pointB, pB);
    -  if ((fabs(pA[0] - pB[0]) > 1e-3) ||
    -      (fabs(pA[1] - pB[1]) > 1e-3) ||
    -      (fabs(pA[2] - pB[2]) > 1e-3)) {
    -    qh_fprintf(fp, 9204, "VECT 1 2 1 2 1\n");
    -    for (k=0; k < 3; k++)
    -       qh_fprintf(fp, 9205, "%8.4g ", pB[k]);
    -    qh_fprintf(fp, 9206, " # p%d\n", qh_pointid(pointB));
    -  }else
    -    qh_fprintf(fp, 9207, "VECT 1 1 1 1 1\n");
    -  for (k=0; k < 3; k++)
    -    qh_fprintf(fp, 9208, "%8.4g ", pA[k]);
    -  qh_fprintf(fp, 9209, " # p%d\n", qh_pointid(pointA));
    -  qh_fprintf(fp, 9210, "%8.4g %8.4g %8.4g 1\n", color[0], color[1], color[2]);
    -}
    -
    -/*---------------------------------
    -
    -  qh_printneighborhood( fp, format, facetA, facetB, printall )
    -    print neighborhood of one or two facets
    -
    -  notes:
    -    calls qh_findgood_all()
    -    bumps qh.visit_id
    -*/
    -void qh_printneighborhood(FILE *fp, qh_PRINT format, facetT *facetA, facetT *facetB, boolT printall) {
    -  facetT *neighbor, **neighborp, *facet;
    -  setT *facets;
    -
    -  if (format == qh_PRINTnone)
    -    return;
    -  qh_findgood_all(qh facet_list);
    -  if (facetA == facetB)
    -    facetB= NULL;
    -  facets= qh_settemp(2*(qh_setsize(facetA->neighbors)+1));
    -  qh visit_id++;
    -  for (facet= facetA; facet; facet= ((facet == facetA) ? facetB : NULL)) {
    -    if (facet->visitid != qh visit_id) {
    -      facet->visitid= qh visit_id;
    -      qh_setappend(&facets, facet);
    -    }
    -    FOREACHneighbor_(facet) {
    -      if (neighbor->visitid == qh visit_id)
    -        continue;
    -      neighbor->visitid= qh visit_id;
    -      if (printall || !qh_skipfacet(neighbor))
    -        qh_setappend(&facets, neighbor);
    -    }
    -  }
    -  qh_printfacets(fp, format, NULL, facets, printall);
    -  qh_settempfree(&facets);
    -} /* printneighborhood */
    -
    -/*---------------------------------
    -
    -  qh_printpoint( fp, string, point )
    -  qh_printpointid( fp, string, dim, point, id )
    -    prints the coordinates of a point
    -
    -  returns:
    -    if string is defined
    -      prints 'string p%d'.  Skips p%d if id=qh_IDunknown(-1) or qh_IDnone(-3)
    -
    -  notes:
    -    nop if point is NULL
    -    Same as QhullPoint's printPoint
    -*/
    -void qh_printpoint(FILE *fp, const char *string, pointT *point) {
    -  int id= qh_pointid( point);
    -
    -  qh_printpointid( fp, string, qh hull_dim, point, id);
    -} /* printpoint */
    -
    -void qh_printpointid(FILE *fp, const char *string, int dim, pointT *point, int id) {
    -  int k;
    -  realT r; /*bug fix*/
    -
    -  if (!point)
    -    return;
    -  if (string) {
    -    qh_fprintf(fp, 9211, "%s", string);
    -    if (id != qh_IDunknown && id != qh_IDnone)
    -      qh_fprintf(fp, 9212, " p%d: ", id);
    -  }
    -  for (k=dim; k--; ) {
    -    r= *point++;
    -    if (string)
    -      qh_fprintf(fp, 9213, " %8.4g", r);
    -    else
    -      qh_fprintf(fp, 9214, qh_REAL_1, r);
    -  }
    -  qh_fprintf(fp, 9215, "\n");
    -} /* printpointid */
    -
    -/*---------------------------------
    -
    -  qh_printpoint3( fp, point )
    -    prints 2-d, 3-d, or 4-d point as Geomview 3-d coordinates
    -*/
    -void qh_printpoint3(FILE *fp, pointT *point) {
    -  int k;
    -  realT p[4];
    -
    -  qh_projectdim3(point, p);
    -  for (k=0; k < 3; k++)
    -    qh_fprintf(fp, 9216, "%8.4g ", p[k]);
    -  qh_fprintf(fp, 9217, " # p%d\n", qh_pointid(point));
    -} /* printpoint3 */
    -
    -/*----------------------------------------
    --printpoints- print pointids for a set of points starting at index
    -   see geom.c
    -*/
    -
    -/*---------------------------------
    -
    -  qh_printpoints_out( fp, facetlist, facets, printall )
    -    prints vertices, coplanar/inside points, for facets by their point coordinates
    -    allows qh.CDDoutput
    -
    -  notes:
    -    same format as qhull input
    -    if no coplanar/interior points,
    -      same order as qh_printextremes
    -*/
    -void qh_printpoints_out(FILE *fp, facetT *facetlist, setT *facets, boolT printall) {
    -  int allpoints= qh num_points + qh_setsize(qh other_points);
    -  int numpoints=0, point_i, point_n;
    -  setT *vertices, *points;
    -  facetT *facet, **facetp;
    -  pointT *point, **pointp;
    -  vertexT *vertex, **vertexp;
    -  int id;
    -
    -  points= qh_settemp(allpoints);
    -  qh_setzero(points, 0, allpoints);
    -  vertices= qh_facetvertices(facetlist, facets, printall);
    -  FOREACHvertex_(vertices) {
    -    id= qh_pointid(vertex->point);
    -    if (id >= 0)
    -      SETelem_(points, id)= vertex->point;
    -  }
    -  if (qh KEEPinside || qh KEEPcoplanar || qh KEEPnearinside) {
    -    FORALLfacet_(facetlist) {
    -      if (!printall && qh_skipfacet(facet))
    -        continue;
    -      FOREACHpoint_(facet->coplanarset) {
    -        id= qh_pointid(point);
    -        if (id >= 0)
    -          SETelem_(points, id)= point;
    -      }
    -    }
    -    FOREACHfacet_(facets) {
    -      if (!printall && qh_skipfacet(facet))
    -        continue;
    -      FOREACHpoint_(facet->coplanarset) {
    -        id= qh_pointid(point);
    -        if (id >= 0)
    -          SETelem_(points, id)= point;
    -      }
    -    }
    -  }
    -  qh_settempfree(&vertices);
    -  FOREACHpoint_i_(points) {
    -    if (point)
    -      numpoints++;
    -  }
    -  if (qh CDDoutput)
    -    qh_fprintf(fp, 9218, "%s | %s\nbegin\n%d %d real\n", qh rbox_command,
    -             qh qhull_command, numpoints, qh hull_dim + 1);
    -  else
    -    qh_fprintf(fp, 9219, "%d\n%d\n", qh hull_dim, numpoints);
    -  FOREACHpoint_i_(points) {
    -    if (point) {
    -      if (qh CDDoutput)
    -        qh_fprintf(fp, 9220, "1 ");
    -      qh_printpoint(fp, NULL, point);
    -    }
    -  }
    -  if (qh CDDoutput)
    -    qh_fprintf(fp, 9221, "end\n");
    -  qh_settempfree(&points);
    -} /* printpoints_out */
    -
    -
    -/*---------------------------------
    -
    -  qh_printpointvect( fp, point, normal, center, radius, color )
    -    prints a 2-d, 3-d, or 4-d point as 3-d VECT's relative to normal or to center point
    -*/
    -void qh_printpointvect(FILE *fp, pointT *point, coordT *normal, pointT *center, realT radius, realT color[3]) {
    -  realT diff[4], pointA[4];
    -  int k;
    -
    -  for (k=qh hull_dim; k--; ) {
    -    if (center)
    -      diff[k]= point[k]-center[k];
    -    else if (normal)
    -      diff[k]= normal[k];
    -    else
    -      diff[k]= 0;
    -  }
    -  if (center)
    -    qh_normalize2(diff, qh hull_dim, True, NULL, NULL);
    -  for (k=qh hull_dim; k--; )
    -    pointA[k]= point[k]+diff[k] * radius;
    -  qh_printline3geom(fp, point, pointA, color);
    -} /* printpointvect */
    -
    -/*---------------------------------
    -
    -  qh_printpointvect2( fp, point, normal, center, radius )
    -    prints a 2-d, 3-d, or 4-d point as 2 3-d VECT's for an imprecise point
    -*/
    -void qh_printpointvect2(FILE *fp, pointT *point, coordT *normal, pointT *center, realT radius) {
    -  realT red[3]={1, 0, 0}, yellow[3]={1, 1, 0};
    -
    -  qh_printpointvect(fp, point, normal, center, radius, red);
    -  qh_printpointvect(fp, point, normal, center, -radius, yellow);
    -} /* printpointvect2 */
    -
    -/*---------------------------------
    -
    -  qh_printridge( fp, ridge )
    -    prints the information in a ridge
    -
    -  notes:
    -    for qh_printfacetridges()
    -    same as operator<< [QhullRidge.cpp]
    -*/
    -void qh_printridge(FILE *fp, ridgeT *ridge) {
    -
    -  qh_fprintf(fp, 9222, "     - r%d", ridge->id);
    -  if (ridge->tested)
    -    qh_fprintf(fp, 9223, " tested");
    -  if (ridge->nonconvex)
    -    qh_fprintf(fp, 9224, " nonconvex");
    -  qh_fprintf(fp, 9225, "\n");
    -  qh_printvertices(fp, "           vertices:", ridge->vertices);
    -  if (ridge->top && ridge->bottom)
    -    qh_fprintf(fp, 9226, "           between f%d and f%d\n",
    -            ridge->top->id, ridge->bottom->id);
    -} /* printridge */
    -
    -/*---------------------------------
    -
    -  qh_printspheres( fp, vertices, radius )
    -    prints 3-d vertices as OFF spheres
    -
    -  notes:
    -    inflated octahedron from Stuart Levy earth/mksphere2
    -*/
    -void qh_printspheres(FILE *fp, setT *vertices, realT radius) {
    -  vertexT *vertex, **vertexp;
    -
    -  qh printoutnum++;
    -  qh_fprintf(fp, 9227, "{appearance {-edge -normal normscale 0} {\n\
    -INST geom {define vsphere OFF\n\
    -18 32 48\n\
    -\n\
    -0 0 1\n\
    -1 0 0\n\
    -0 1 0\n\
    --1 0 0\n\
    -0 -1 0\n\
    -0 0 -1\n\
    -0.707107 0 0.707107\n\
    -0 -0.707107 0.707107\n\
    -0.707107 -0.707107 0\n\
    --0.707107 0 0.707107\n\
    --0.707107 -0.707107 0\n\
    -0 0.707107 0.707107\n\
    --0.707107 0.707107 0\n\
    -0.707107 0.707107 0\n\
    -0.707107 0 -0.707107\n\
    -0 0.707107 -0.707107\n\
    --0.707107 0 -0.707107\n\
    -0 -0.707107 -0.707107\n\
    -\n\
    -3 0 6 11\n\
    -3 0 7 6 \n\
    -3 0 9 7 \n\
    -3 0 11 9\n\
    -3 1 6 8 \n\
    -3 1 8 14\n\
    -3 1 13 6\n\
    -3 1 14 13\n\
    -3 2 11 13\n\
    -3 2 12 11\n\
    -3 2 13 15\n\
    -3 2 15 12\n\
    -3 3 9 12\n\
    -3 3 10 9\n\
    -3 3 12 16\n\
    -3 3 16 10\n\
    -3 4 7 10\n\
    -3 4 8 7\n\
    -3 4 10 17\n\
    -3 4 17 8\n\
    -3 5 14 17\n\
    -3 5 15 14\n\
    -3 5 16 15\n\
    -3 5 17 16\n\
    -3 6 13 11\n\
    -3 7 8 6\n\
    -3 9 10 7\n\
    -3 11 12 9\n\
    -3 14 8 17\n\
    -3 15 13 14\n\
    -3 16 12 15\n\
    -3 17 10 16\n} transforms { TLIST\n");
    -  FOREACHvertex_(vertices) {
    -    qh_fprintf(fp, 9228, "%8.4g 0 0 0 # v%d\n 0 %8.4g 0 0\n0 0 %8.4g 0\n",
    -      radius, vertex->id, radius, radius);
    -    qh_printpoint3(fp, vertex->point);
    -    qh_fprintf(fp, 9229, "1\n");
    -  }
    -  qh_fprintf(fp, 9230, "}}}\n");
    -} /* printspheres */
    -
    -
    -/*----------------------------------------------
    --printsummary-
    -                see libqhull.c
    -*/
    -
    -/*---------------------------------
    -
    -  qh_printvdiagram( fp, format, facetlist, facets, printall )
    -    print voronoi diagram
    -      # of pairs of input sites
    -      #indices site1 site2 vertex1 ...
    -
    -    sites indexed by input point id
    -      point 0 is the first input point
    -    vertices indexed by 'o' and 'p' order
    -      vertex 0 is the 'vertex-at-infinity'
    -      vertex 1 is the first Voronoi vertex
    -
    -  see:
    -    qh_printvoronoi()
    -    qh_eachvoronoi_all()
    -
    -  notes:
    -    if all facets are upperdelaunay,
    -      prints upper hull (furthest-site Voronoi diagram)
    -*/
    -void qh_printvdiagram(FILE *fp, qh_PRINT format, facetT *facetlist, setT *facets, boolT printall) {
    -  setT *vertices;
    -  int totcount, numcenters;
    -  boolT isLower;
    -  qh_RIDGE innerouter= qh_RIDGEall;
    -  printvridgeT printvridge= NULL;
    -
    -  if (format == qh_PRINTvertices) {
    -    innerouter= qh_RIDGEall;
    -    printvridge= qh_printvridge;
    -  }else if (format == qh_PRINTinner) {
    -    innerouter= qh_RIDGEinner;
    -    printvridge= qh_printvnorm;
    -  }else if (format == qh_PRINTouter) {
    -    innerouter= qh_RIDGEouter;
    -    printvridge= qh_printvnorm;
    -  }else {
    -    qh_fprintf(qh ferr, 6219, "Qhull internal error (qh_printvdiagram): unknown print format %d.\n", format);
    -    qh_errexit(qh_ERRinput, NULL, NULL);
    -  }
    -  vertices= qh_markvoronoi(facetlist, facets, printall, &isLower, &numcenters);
    -  totcount= qh_printvdiagram2(NULL, NULL, vertices, innerouter, False);
    -  qh_fprintf(fp, 9231, "%d\n", totcount);
    -  totcount= qh_printvdiagram2(fp, printvridge, vertices, innerouter, True /* inorder*/);
    -  qh_settempfree(&vertices);
    -#if 0  /* for testing qh_eachvoronoi_all */
    -  qh_fprintf(fp, 9232, "\n");
    -  totcount= qh_eachvoronoi_all(fp, printvridge, qh UPPERdelaunay, innerouter, True /* inorder*/);
    -  qh_fprintf(fp, 9233, "%d\n", totcount);
    -#endif
    -} /* printvdiagram */
    -
    -/*---------------------------------
    -
    -  qh_printvdiagram2( fp, printvridge, vertices, innerouter, inorder )
    -    visit all pairs of input sites (vertices) for selected Voronoi vertices
    -    vertices may include NULLs
    -
    -  innerouter:
    -    qh_RIDGEall   print inner ridges(bounded) and outer ridges(unbounded)
    -    qh_RIDGEinner print only inner ridges
    -    qh_RIDGEouter print only outer ridges
    -
    -  inorder:
    -    print 3-d Voronoi vertices in order
    -
    -  assumes:
    -    qh_markvoronoi marked facet->visitid for Voronoi vertices
    -    all facet->seen= False
    -    all facet->seen2= True
    -
    -  returns:
    -    total number of Voronoi ridges
    -    if printvridge,
    -      calls printvridge( fp, vertex, vertexA, centers) for each ridge
    -      [see qh_eachvoronoi()]
    -
    -  see:
    -    qh_eachvoronoi_all()
    -*/
    -int qh_printvdiagram2(FILE *fp, printvridgeT printvridge, setT *vertices, qh_RIDGE innerouter, boolT inorder) {
    -  int totcount= 0;
    -  int vertex_i, vertex_n;
    -  vertexT *vertex;
    -
    -  FORALLvertices
    -    vertex->seen= False;
    -  FOREACHvertex_i_(vertices) {
    -    if (vertex) {
    -      if (qh GOODvertex > 0 && qh_pointid(vertex->point)+1 != qh GOODvertex)
    -        continue;
    -      totcount += qh_eachvoronoi(fp, printvridge, vertex, !qh_ALL, innerouter, inorder);
    -    }
    -  }
    -  return totcount;
    -} /* printvdiagram2 */
    -
    -/*---------------------------------
    -
    -  qh_printvertex( fp, vertex )
    -    prints the information in a vertex
    -    Duplicated as operator<< [QhullVertex.cpp]
    -*/
    -void qh_printvertex(FILE *fp, vertexT *vertex) {
    -  pointT *point;
    -  int k, count= 0;
    -  facetT *neighbor, **neighborp;
    -  realT r; /*bug fix*/
    -
    -  if (!vertex) {
    -    qh_fprintf(fp, 9234, "  NULLvertex\n");
    -    return;
    -  }
    -  qh_fprintf(fp, 9235, "- p%d(v%d):", qh_pointid(vertex->point), vertex->id);
    -  point= vertex->point;
    -  if (point) {
    -    for (k=qh hull_dim; k--; ) {
    -      r= *point++;
    -      qh_fprintf(fp, 9236, " %5.2g", r);
    -    }
    -  }
    -  if (vertex->deleted)
    -    qh_fprintf(fp, 9237, " deleted");
    -  if (vertex->delridge)
    -    qh_fprintf(fp, 9238, " ridgedeleted");
    -  qh_fprintf(fp, 9239, "\n");
    -  if (vertex->neighbors) {
    -    qh_fprintf(fp, 9240, "  neighbors:");
    -    FOREACHneighbor_(vertex) {
    -      if (++count % 100 == 0)
    -        qh_fprintf(fp, 9241, "\n     ");
    -      qh_fprintf(fp, 9242, " f%d", neighbor->id);
    -    }
    -    qh_fprintf(fp, 9243, "\n");
    -  }
    -} /* printvertex */
    -
    -
    -/*---------------------------------
    -
    -  qh_printvertexlist( fp, string, facetlist, facets, printall )
    -    prints vertices used by a facetlist or facet set
    -    tests qh_skipfacet() if !printall
    -*/
    -void qh_printvertexlist(FILE *fp, const char* string, facetT *facetlist,
    -                         setT *facets, boolT printall) {
    -  vertexT *vertex, **vertexp;
    -  setT *vertices;
    -
    -  vertices= qh_facetvertices(facetlist, facets, printall);
    -  qh_fprintf(fp, 9244, "%s", string);
    -  FOREACHvertex_(vertices)
    -    qh_printvertex(fp, vertex);
    -  qh_settempfree(&vertices);
    -} /* printvertexlist */
    -
    -
    -/*---------------------------------
    -
    -  qh_printvertices( fp, string, vertices )
    -    prints vertices in a set
    -    duplicated as printVertexSet [QhullVertex.cpp]
    -*/
    -void qh_printvertices(FILE *fp, const char* string, setT *vertices) {
    -  vertexT *vertex, **vertexp;
    -
    -  qh_fprintf(fp, 9245, "%s", string);
    -  FOREACHvertex_(vertices)
    -    qh_fprintf(fp, 9246, " p%d(v%d)", qh_pointid(vertex->point), vertex->id);
    -  qh_fprintf(fp, 9247, "\n");
    -} /* printvertices */
    -
    -/*---------------------------------
    -
    -  qh_printvneighbors( fp, facetlist, facets, printall )
    -    print vertex neighbors of vertices in facetlist and facets ('FN')
    -
    -  notes:
    -    qh_countfacets clears facet->visitid for non-printed facets
    -
    -  design:
    -    collect facet count and related statistics
    -    if necessary, build neighbor sets for each vertex
    -    collect vertices in facetlist and facets
    -    build a point array for point->vertex and point->coplanar facet
    -    for each point
    -      list vertex neighbors or coplanar facet
    -*/
    -void qh_printvneighbors(FILE *fp, facetT* facetlist, setT *facets, boolT printall) {
    -  int numfacets, numsimplicial, numridges, totneighbors, numneighbors, numcoplanars, numtricoplanars;
    -  setT *vertices, *vertex_points, *coplanar_points;
    -  int numpoints= qh num_points + qh_setsize(qh other_points);
    -  vertexT *vertex, **vertexp;
    -  int vertex_i, vertex_n;
    -  facetT *facet, **facetp, *neighbor, **neighborp;
    -  pointT *point, **pointp;
    -
    -  qh_countfacets(facetlist, facets, printall, &numfacets, &numsimplicial,
    -      &totneighbors, &numridges, &numcoplanars, &numtricoplanars);  /* sets facet->visitid */
    -  qh_fprintf(fp, 9248, "%d\n", numpoints);
    -  qh_vertexneighbors();
    -  vertices= qh_facetvertices(facetlist, facets, printall);
    -  vertex_points= qh_settemp(numpoints);
    -  coplanar_points= qh_settemp(numpoints);
    -  qh_setzero(vertex_points, 0, numpoints);
    -  qh_setzero(coplanar_points, 0, numpoints);
    -  FOREACHvertex_(vertices)
    -    qh_point_add(vertex_points, vertex->point, vertex);
    -  FORALLfacet_(facetlist) {
    -    FOREACHpoint_(facet->coplanarset)
    -      qh_point_add(coplanar_points, point, facet);
    -  }
    -  FOREACHfacet_(facets) {
    -    FOREACHpoint_(facet->coplanarset)
    -      qh_point_add(coplanar_points, point, facet);
    -  }
    -  FOREACHvertex_i_(vertex_points) {
    -    if (vertex) {
    -      numneighbors= qh_setsize(vertex->neighbors);
    -      qh_fprintf(fp, 9249, "%d", numneighbors);
    -      if (qh hull_dim == 3)
    -        qh_order_vertexneighbors(vertex);
    -      else if (qh hull_dim >= 4)
    -        qsort(SETaddr_(vertex->neighbors, facetT), (size_t)numneighbors,
    -             sizeof(facetT *), qh_compare_facetvisit);
    -      FOREACHneighbor_(vertex)
    -        qh_fprintf(fp, 9250, " %d",
    -                 neighbor->visitid ? neighbor->visitid - 1 : 0 - neighbor->id);
    -      qh_fprintf(fp, 9251, "\n");
    -    }else if ((facet= SETelemt_(coplanar_points, vertex_i, facetT)))
    -      qh_fprintf(fp, 9252, "1 %d\n",
    -                  facet->visitid ? facet->visitid - 1 : 0 - facet->id);
    -    else
    -      qh_fprintf(fp, 9253, "0\n");
    -  }
    -  qh_settempfree(&coplanar_points);
    -  qh_settempfree(&vertex_points);
    -  qh_settempfree(&vertices);
    -} /* printvneighbors */
    -
    -/*---------------------------------
    -
    -  qh_printvoronoi( fp, format, facetlist, facets, printall )
    -    print voronoi diagram in 'o' or 'G' format
    -    for 'o' format
    -      prints voronoi centers for each facet and for infinity
    -      for each vertex, lists ids of printed facets or infinity
    -      assumes facetlist and facets are disjoint
    -    for 'G' format
    -      prints an OFF object
    -      adds a 0 coordinate to center
    -      prints infinity but does not list in vertices
    -
    -  see:
    -    qh_printvdiagram()
    -
    -  notes:
    -    if 'o',
    -      prints a line for each point except "at-infinity"
    -    if all facets are upperdelaunay,
    -      reverses lower and upper hull
    -*/
    -void qh_printvoronoi(FILE *fp, qh_PRINT format, facetT *facetlist, setT *facets, boolT printall) {
    -  int k, numcenters, numvertices= 0, numneighbors, numinf, vid=1, vertex_i, vertex_n;
    -  facetT *facet, **facetp, *neighbor, **neighborp;
    -  setT *vertices;
    -  vertexT *vertex;
    -  boolT isLower;
    -  unsigned int numfacets= (unsigned int) qh num_facets;
    -
    -  vertices= qh_markvoronoi(facetlist, facets, printall, &isLower, &numcenters);
    -  FOREACHvertex_i_(vertices) {
    -    if (vertex) {
    -      numvertices++;
    -      numneighbors = numinf = 0;
    -      FOREACHneighbor_(vertex) {
    -        if (neighbor->visitid == 0)
    -          numinf= 1;
    -        else if (neighbor->visitid < numfacets)
    -          numneighbors++;
    -      }
    -      if (numinf && !numneighbors) {
    -        SETelem_(vertices, vertex_i)= NULL;
    -        numvertices--;
    -      }
    -    }
    -  }
    -  if (format == qh_PRINTgeom)
    -    qh_fprintf(fp, 9254, "{appearance {+edge -face} OFF %d %d 1 # Voronoi centers and cells\n",
    -                numcenters, numvertices);
    -  else
    -    qh_fprintf(fp, 9255, "%d\n%d %d 1\n", qh hull_dim-1, numcenters, qh_setsize(vertices));
    -  if (format == qh_PRINTgeom) {
    -    for (k=qh hull_dim-1; k--; )
    -      qh_fprintf(fp, 9256, qh_REAL_1, 0.0);
    -    qh_fprintf(fp, 9257, " 0 # infinity not used\n");
    -  }else {
    -    for (k=qh hull_dim-1; k--; )
    -      qh_fprintf(fp, 9258, qh_REAL_1, qh_INFINITE);
    -    qh_fprintf(fp, 9259, "\n");
    -  }
    -  FORALLfacet_(facetlist) {
    -    if (facet->visitid && facet->visitid < numfacets) {
    -      if (format == qh_PRINTgeom)
    -        qh_fprintf(fp, 9260, "# %d f%d\n", vid++, facet->id);
    -      qh_printcenter(fp, format, NULL, facet);
    -    }
    -  }
    -  FOREACHfacet_(facets) {
    -    if (facet->visitid && facet->visitid < numfacets) {
    -      if (format == qh_PRINTgeom)
    -        qh_fprintf(fp, 9261, "# %d f%d\n", vid++, facet->id);
    -      qh_printcenter(fp, format, NULL, facet);
    -    }
    -  }
    -  FOREACHvertex_i_(vertices) {
    -    numneighbors= 0;
    -    numinf=0;
    -    if (vertex) {
    -      if (qh hull_dim == 3)
    -        qh_order_vertexneighbors(vertex);
    -      else if (qh hull_dim >= 4)
    -        qsort(SETaddr_(vertex->neighbors, facetT),
    -             (size_t)qh_setsize(vertex->neighbors),
    -             sizeof(facetT *), qh_compare_facetvisit);
    -      FOREACHneighbor_(vertex) {
    -        if (neighbor->visitid == 0)
    -          numinf= 1;
    -        else if (neighbor->visitid < numfacets)
    -          numneighbors++;
    -      }
    -    }
    -    if (format == qh_PRINTgeom) {
    -      if (vertex) {
    -        qh_fprintf(fp, 9262, "%d", numneighbors);
    -        FOREACHneighbor_(vertex) {
    -          if (neighbor->visitid && neighbor->visitid < numfacets)
    -            qh_fprintf(fp, 9263, " %d", neighbor->visitid);
    -        }
    -        qh_fprintf(fp, 9264, " # p%d(v%d)\n", vertex_i, vertex->id);
    -      }else
    -        qh_fprintf(fp, 9265, " # p%d is coplanar or isolated\n", vertex_i);
    -    }else {
    -      if (numinf)
    -        numneighbors++;
    -      qh_fprintf(fp, 9266, "%d", numneighbors);
    -      if (vertex) {
    -        FOREACHneighbor_(vertex) {
    -          if (neighbor->visitid == 0) {
    -            if (numinf) {
    -              numinf= 0;
    -              qh_fprintf(fp, 9267, " %d", neighbor->visitid);
    -            }
    -          }else if (neighbor->visitid < numfacets)
    -            qh_fprintf(fp, 9268, " %d", neighbor->visitid);
    -        }
    -      }
    -      qh_fprintf(fp, 9269, "\n");
    -    }
    -  }
    -  if (format == qh_PRINTgeom)
    -    qh_fprintf(fp, 9270, "}\n");
    -  qh_settempfree(&vertices);
    -} /* printvoronoi */
    -
    -/*---------------------------------
    -
    -  qh_printvnorm( fp, vertex, vertexA, centers, unbounded )
    -    print one separating plane of the Voronoi diagram for a pair of input sites
    -    unbounded==True if centers includes vertex-at-infinity
    -
    -  assumes:
    -    qh_ASvoronoi and qh_vertexneighbors() already set
    -
    -  note:
    -    parameter unbounded is UNUSED by this callback
    -
    -  see:
    -    qh_printvdiagram()
    -    qh_eachvoronoi()
    -*/
    -void qh_printvnorm(FILE *fp, vertexT *vertex, vertexT *vertexA, setT *centers, boolT unbounded) {
    -  pointT *normal;
    -  realT offset;
    -  int k;
    -  QHULL_UNUSED(unbounded);
    -
    -  normal= qh_detvnorm(vertex, vertexA, centers, &offset);
    -  qh_fprintf(fp, 9271, "%d %d %d ",
    -      2+qh hull_dim, qh_pointid(vertex->point), qh_pointid(vertexA->point));
    -  for (k=0; k< qh hull_dim-1; k++)
    -    qh_fprintf(fp, 9272, qh_REAL_1, normal[k]);
    -  qh_fprintf(fp, 9273, qh_REAL_1, offset);
    -  qh_fprintf(fp, 9274, "\n");
    -} /* printvnorm */
    -
    -/*---------------------------------
    -
    -  qh_printvridge( fp, vertex, vertexA, centers, unbounded )
    -    print one ridge of the Voronoi diagram for a pair of input sites
    -    unbounded==True if centers includes vertex-at-infinity
    -
    -  see:
    -    qh_printvdiagram()
    -
    -  notes:
    -    the user may use a different function
    -    parameter unbounded is UNUSED
    -*/
    -void qh_printvridge(FILE *fp, vertexT *vertex, vertexT *vertexA, setT *centers, boolT unbounded) {
    -  facetT *facet, **facetp;
    -  QHULL_UNUSED(unbounded);
    -
    -  qh_fprintf(fp, 9275, "%d %d %d", qh_setsize(centers)+2,
    -       qh_pointid(vertex->point), qh_pointid(vertexA->point));
    -  FOREACHfacet_(centers)
    -    qh_fprintf(fp, 9276, " %d", facet->visitid);
    -  qh_fprintf(fp, 9277, "\n");
    -} /* printvridge */
    -
    -/*---------------------------------
    -
    -  qh_projectdim3( source, destination )
    -    project 2-d 3-d or 4-d point to a 3-d point
    -    uses qh.DROPdim and qh.hull_dim
    -    source and destination may be the same
    -
    -  notes:
    -    allocate 4 elements to destination just in case
    -*/
    -void qh_projectdim3(pointT *source, pointT *destination) {
    -  int i,k;
    -
    -  for (k=0, i=0; k < qh hull_dim; k++) {
    -    if (qh hull_dim == 4) {
    -      if (k != qh DROPdim)
    -        destination[i++]= source[k];
    -    }else if (k == qh DROPdim)
    -      destination[i++]= 0;
    -    else
    -      destination[i++]= source[k];
    -  }
    -  while (i < 3)
    -    destination[i++]= 0.0;
    -} /* projectdim3 */
    -
    -/*---------------------------------
    -
    -  qh_readfeasible( dim, curline )
    -    read feasible point from current line and qh.fin
    -
    -  returns:
    -    number of lines read from qh.fin
    -    sets qh.feasible_point with malloc'd coordinates
    -
    -  notes:
    -    checks for qh.HALFspace
    -    assumes dim > 1
    -
    -  see:
    -    qh_setfeasible
    -*/
    -int qh_readfeasible(int dim, const char *curline) {
    -  boolT isfirst= True;
    -  int linecount= 0, tokcount= 0;
    -  const char *s;
    -  char *t, firstline[qh_MAXfirst+1];
    -  coordT *coords, value;
    -
    -  if (!qh HALFspace) {
    -    qh_fprintf(qh ferr, 6070, "qhull input error: feasible point(dim 1 coords) is only valid for halfspace intersection\n");
    -    qh_errexit(qh_ERRinput, NULL, NULL);
    -  }
    -  if (qh feasible_string)
    -    qh_fprintf(qh ferr, 7057, "qhull input warning: feasible point(dim 1 coords) overrides 'Hn,n,n' feasible point for halfspace intersection\n");
    -  if (!(qh feasible_point= (coordT*)qh_malloc(dim* sizeof(coordT)))) {
    -    qh_fprintf(qh ferr, 6071, "qhull error: insufficient memory for feasible point\n");
    -    qh_errexit(qh_ERRmem, NULL, NULL);
    -  }
    -  coords= qh feasible_point;
    -  while ((s= (isfirst ?  curline : fgets(firstline, qh_MAXfirst, qh fin)))) {
    -    if (isfirst)
    -      isfirst= False;
    -    else
    -      linecount++;
    -    while (*s) {
    -      while (isspace(*s))
    -        s++;
    -      value= qh_strtod(s, &t);
    -      if (s == t)
    -        break;
    -      s= t;
    -      *(coords++)= value;
    -      if (++tokcount == dim) {
    -        while (isspace(*s))
    -          s++;
    -        qh_strtod(s, &t);
    -        if (s != t) {
    -          qh_fprintf(qh ferr, 6072, "qhull input error: coordinates for feasible point do not finish out the line: %s\n",
    -               s);
    -          qh_errexit(qh_ERRinput, NULL, NULL);
    -        }
    -        return linecount;
    -      }
    -    }
    -  }
    -  qh_fprintf(qh ferr, 6073, "qhull input error: only %d coordinates.  Could not read %d-d feasible point.\n",
    -           tokcount, dim);
    -  qh_errexit(qh_ERRinput, NULL, NULL);
    -  return 0;
    -} /* readfeasible */
    -
    -/*---------------------------------
    -
    -  qh_readpoints( numpoints, dimension, ismalloc )
    -    read points from qh.fin into qh.first_point, qh.num_points
    -    qh.fin is lines of coordinates, one per vertex, first line number of points
    -    if 'rbox D4',
    -      gives message
    -    if qh.ATinfinity,
    -      adds point-at-infinity for Delaunay triangulations
    -
    -  returns:
    -    number of points, array of point coordinates, dimension, ismalloc True
    -    if qh.DELAUNAY & !qh.PROJECTinput, projects points to paraboloid
    -        and clears qh.PROJECTdelaunay
    -    if qh.HALFspace, reads optional feasible point, reads halfspaces,
    -        converts to dual.
    -
    -  for feasible point in "cdd format" in 3-d:
    -    3 1
    -    coordinates
    -    comments
    -    begin
    -    n 4 real/integer
    -    ...
    -    end
    -
    -  notes:
    -    dimension will change in qh_initqhull_globals if qh.PROJECTinput
    -    uses malloc() since qh_mem not initialized
    -    FIXUP QH11012: qh_readpoints needs rewriting, too long
    -*/
    -coordT *qh_readpoints(int *numpoints, int *dimension, boolT *ismalloc) {
    -  coordT *points, *coords, *infinity= NULL;
    -  realT paraboloid, maxboloid= -REALmax, value;
    -  realT *coordp= NULL, *offsetp= NULL, *normalp= NULL;
    -  char *s= 0, *t, firstline[qh_MAXfirst+1];
    -  int diminput=0, numinput=0, dimfeasible= 0, newnum, k, tempi;
    -  int firsttext=0, firstshort=0, firstlong=0, firstpoint=0;
    -  int tokcount= 0, linecount=0, maxcount, coordcount=0;
    -  boolT islong, isfirst= True, wasbegin= False;
    -  boolT isdelaunay= qh DELAUNAY && !qh PROJECTinput;
    -
    -  if (qh CDDinput) {
    -    while ((s= fgets(firstline, qh_MAXfirst, qh fin))) {
    -      linecount++;
    -      if (qh HALFspace && linecount == 1 && isdigit(*s)) {
    -        dimfeasible= qh_strtol(s, &s);
    -        while (isspace(*s))
    -          s++;
    -        if (qh_strtol(s, &s) == 1)
    -          linecount += qh_readfeasible(dimfeasible, s);
    -        else
    -          dimfeasible= 0;
    -      }else if (!memcmp(firstline, "begin", (size_t)5) || !memcmp(firstline, "BEGIN", (size_t)5))
    -        break;
    -      else if (!*qh rbox_command)
    -        strncat(qh rbox_command, s, sizeof(qh rbox_command)-1);
    -    }
    -    if (!s) {
    -      qh_fprintf(qh ferr, 6074, "qhull input error: missing \"begin\" for cdd-formated input\n");
    -      qh_errexit(qh_ERRinput, NULL, NULL);
    -    }
    -  }
    -  while (!numinput && (s= fgets(firstline, qh_MAXfirst, qh fin))) {
    -    linecount++;
    -    if (!memcmp(s, "begin", (size_t)5) || !memcmp(s, "BEGIN", (size_t)5))
    -      wasbegin= True;
    -    while (*s) {
    -      while (isspace(*s))
    -        s++;
    -      if (!*s)
    -        break;
    -      if (!isdigit(*s)) {
    -        if (!*qh rbox_command) {
    -          strncat(qh rbox_command, s, sizeof(qh rbox_command)-1);
    -          firsttext= linecount;
    -        }
    -        break;
    -      }
    -      if (!diminput)
    -        diminput= qh_strtol(s, &s);
    -      else {
    -        numinput= qh_strtol(s, &s);
    -        if (numinput == 1 && diminput >= 2 && qh HALFspace && !qh CDDinput) {
    -          linecount += qh_readfeasible(diminput, s); /* checks if ok */
    -          dimfeasible= diminput;
    -          diminput= numinput= 0;
    -        }else
    -          break;
    -      }
    -    }
    -  }
    -  if (!s) {
    -    qh_fprintf(qh ferr, 6075, "qhull input error: short input file.  Did not find dimension and number of points\n");
    -    qh_errexit(qh_ERRinput, NULL, NULL);
    -  }
    -  if (diminput > numinput) {
    -    tempi= diminput;    /* exchange dim and n, e.g., for cdd input format */
    -    diminput= numinput;
    -    numinput= tempi;
    -  }
    -  if (diminput < 2) {
    -    qh_fprintf(qh ferr, 6220,"qhull input error: dimension %d(first number) should be at least 2\n",
    -            diminput);
    -    qh_errexit(qh_ERRinput, NULL, NULL);
    -  }
    -  if (isdelaunay) {
    -    qh PROJECTdelaunay= False;
    -    if (qh CDDinput)
    -      *dimension= diminput;
    -    else
    -      *dimension= diminput+1;
    -    *numpoints= numinput;
    -    if (qh ATinfinity)
    -      (*numpoints)++;
    -  }else if (qh HALFspace) {
    -    *dimension= diminput - 1;
    -    *numpoints= numinput;
    -    if (diminput < 3) {
    -      qh_fprintf(qh ferr, 6221,"qhull input error: dimension %d(first number, includes offset) should be at least 3 for halfspaces\n",
    -            diminput);
    -      qh_errexit(qh_ERRinput, NULL, NULL);
    -    }
    -    if (dimfeasible) {
    -      if (dimfeasible != *dimension) {
    -        qh_fprintf(qh ferr, 6222,"qhull input error: dimension %d of feasible point is not one less than dimension %d for halfspaces\n",
    -          dimfeasible, diminput);
    -        qh_errexit(qh_ERRinput, NULL, NULL);
    -      }
    -    }else
    -      qh_setfeasible(*dimension);
    -  }else {
    -    if (qh CDDinput)
    -      *dimension= diminput-1;
    -    else
    -      *dimension= diminput;
    -    *numpoints= numinput;
    -  }
    -  qh normal_size= *dimension * sizeof(coordT); /* for tracing with qh_printpoint */
    -  if (qh HALFspace) {
    -    qh half_space= coordp= (coordT*)qh_malloc(qh normal_size + sizeof(coordT));
    -    if (qh CDDinput) {
    -      offsetp= qh half_space;
    -      normalp= offsetp + 1;
    -    }else {
    -      normalp= qh half_space;
    -      offsetp= normalp + *dimension;
    -    }
    -  }
    -  qh maxline= diminput * (qh_REALdigits + 5);
    -  maximize_(qh maxline, 500);
    -  qh line= (char*)qh_malloc((qh maxline+1) * sizeof(char));
    -  *ismalloc= True;  /* use malloc since memory not setup */
    -  coords= points= qh temp_malloc=  /* numinput and diminput >=2 by QH6220 */
    -        (coordT*)qh_malloc((*numpoints)*(*dimension)*sizeof(coordT));
    -  if (!coords || !qh line || (qh HALFspace && !qh half_space)) {
    -    qh_fprintf(qh ferr, 6076, "qhull error: insufficient memory to read %d points\n",
    -            numinput);
    -    qh_errexit(qh_ERRmem, NULL, NULL);
    -  }
    -  if (isdelaunay && qh ATinfinity) {
    -    infinity= points + numinput * (*dimension);
    -    for (k= (*dimension) - 1; k--; )
    -      infinity[k]= 0.0;
    -  }
    -  maxcount= numinput * diminput;
    -  paraboloid= 0.0;
    -  while ((s= (isfirst ?  s : fgets(qh line, qh maxline, qh fin)))) {
    -    if (!isfirst) {
    -      linecount++;
    -      if (*s == 'e' || *s == 'E') {
    -        if (!memcmp(s, "end", (size_t)3) || !memcmp(s, "END", (size_t)3)) {
    -          if (qh CDDinput )
    -            break;
    -          else if (wasbegin)
    -            qh_fprintf(qh ferr, 7058, "qhull input warning: the input appears to be in cdd format.  If so, use 'Fd'\n");
    -        }
    -      }
    -    }
    -    islong= False;
    -    while (*s) {
    -      while (isspace(*s))
    -        s++;
    -      value= qh_strtod(s, &t);
    -      if (s == t) {
    -        if (!*qh rbox_command)
    -         strncat(qh rbox_command, s, sizeof(qh rbox_command)-1);
    -        if (*s && !firsttext)
    -          firsttext= linecount;
    -        if (!islong && !firstshort && coordcount)
    -          firstshort= linecount;
    -        break;
    -      }
    -      if (!firstpoint)
    -        firstpoint= linecount;
    -      s= t;
    -      if (++tokcount > maxcount)
    -        continue;
    -      if (qh HALFspace) {
    -        if (qh CDDinput)
    -          *(coordp++)= -value; /* both coefficients and offset */
    -        else
    -          *(coordp++)= value;
    -      }else {
    -        *(coords++)= value;
    -        if (qh CDDinput && !coordcount) {
    -          if (value != 1.0) {
    -            qh_fprintf(qh ferr, 6077, "qhull input error: for cdd format, point at line %d does not start with '1'\n",
    -                   linecount);
    -            qh_errexit(qh_ERRinput, NULL, NULL);
    -          }
    -          coords--;
    -        }else if (isdelaunay) {
    -          paraboloid += value * value;
    -          if (qh ATinfinity) {
    -            if (qh CDDinput)
    -              infinity[coordcount-1] += value;
    -            else
    -              infinity[coordcount] += value;
    -          }
    -        }
    -      }
    -      if (++coordcount == diminput) {
    -        coordcount= 0;
    -        if (isdelaunay) {
    -          *(coords++)= paraboloid;
    -          maximize_(maxboloid, paraboloid);
    -          paraboloid= 0.0;
    -        }else if (qh HALFspace) {
    -          if (!qh_sethalfspace(*dimension, coords, &coords, normalp, offsetp, qh feasible_point)) {
    -            qh_fprintf(qh ferr, 8048, "The halfspace was on line %d\n", linecount);
    -            if (wasbegin)
    -              qh_fprintf(qh ferr, 8049, "The input appears to be in cdd format.  If so, you should use option 'Fd'\n");
    -            qh_errexit(qh_ERRinput, NULL, NULL);
    -          }
    -          coordp= qh half_space;
    -        }
    -        while (isspace(*s))
    -          s++;
    -        if (*s) {
    -          islong= True;
    -          if (!firstlong)
    -            firstlong= linecount;
    -        }
    -      }
    -    }
    -    if (!islong && !firstshort && coordcount)
    -      firstshort= linecount;
    -    if (!isfirst && s - qh line >= qh maxline) {
    -      qh_fprintf(qh ferr, 6078, "qhull input error: line %d contained more than %d characters\n",
    -              linecount, (int) (s - qh line));   /* WARN64 */
    -      qh_errexit(qh_ERRinput, NULL, NULL);
    -    }
    -    isfirst= False;
    -  }
    -  if (tokcount != maxcount) {
    -    newnum= fmin_(numinput, tokcount/diminput);
    -    qh_fprintf(qh ferr, 7073,"\
    -qhull warning: instead of %d %d-dimensional points, input contains\n\
    -%d points and %d extra coordinates.  Line %d is the first\npoint",
    -       numinput, diminput, tokcount/diminput, tokcount % diminput, firstpoint);
    -    if (firsttext)
    -      qh_fprintf(qh ferr, 8051, ", line %d is the first comment", firsttext);
    -    if (firstshort)
    -      qh_fprintf(qh ferr, 8052, ", line %d is the first short\nline", firstshort);
    -    if (firstlong)
    -      qh_fprintf(qh ferr, 8053, ", line %d is the first long line", firstlong);
    -    qh_fprintf(qh ferr, 8054, ".  Continue with %d points.\n", newnum);
    -    numinput= newnum;
    -    if (isdelaunay && qh ATinfinity) {
    -      for (k= tokcount % diminput; k--; )
    -        infinity[k] -= *(--coords);
    -      *numpoints= newnum+1;
    -    }else {
    -      coords -= tokcount % diminput;
    -      *numpoints= newnum;
    -    }
    -  }
    -  if (isdelaunay && qh ATinfinity) {
    -    for (k= (*dimension) -1; k--; )
    -      infinity[k] /= numinput;
    -    if (coords == infinity)
    -      coords += (*dimension) -1;
    -    else {
    -      for (k=0; k < (*dimension) -1; k++)
    -        *(coords++)= infinity[k];
    -    }
    -    *(coords++)= maxboloid * 1.1;
    -  }
    -  if (qh rbox_command[0]) {
    -    qh rbox_command[strlen(qh rbox_command)-1]= '\0';
    -    if (!strcmp(qh rbox_command, "./rbox D4"))
    -      qh_fprintf(qh ferr, 8055, "\n\
    -This is the qhull test case.  If any errors or core dumps occur,\n\
    -recompile qhull with 'make new'.  If errors still occur, there is\n\
    -an incompatibility.  You should try a different compiler.  You can also\n\
    -change the choices in user.h.  If you discover the source of the problem,\n\
    -please send mail to qhull_bug@qhull.org.\n\
    -\n\
    -Type 'qhull' for a short list of options.\n");
    -  }
    -  qh_free(qh line);
    -  qh line= NULL;
    -  if (qh half_space) {
    -    qh_free(qh half_space);
    -    qh half_space= NULL;
    -  }
    -  qh temp_malloc= NULL;
    -  trace1((qh ferr, 1008,"qh_readpoints: read in %d %d-dimensional points\n",
    -          numinput, diminput));
    -  return(points);
    -} /* readpoints */
    -
    -
    -/*---------------------------------
    -
    -  qh_setfeasible( dim )
    -    set qh.feasible_point from qh.feasible_string in "n,n,n" or "n n n" format
    -
    -  notes:
    -    "n,n,n" already checked by qh_initflags()
    -    see qh_readfeasible()
    -    called only once from qh_new_qhull, otherwise leaks memory
    -*/
    -void qh_setfeasible(int dim) {
    -  int tokcount= 0;
    -  char *s;
    -  coordT *coords, value;
    -
    -  if (!(s= qh feasible_string)) {
    -    qh_fprintf(qh ferr, 6223, "\
    -qhull input error: halfspace intersection needs a feasible point.\n\
    -Either prepend the input with 1 point or use 'Hn,n,n'.  See manual.\n");
    -    qh_errexit(qh_ERRinput, NULL, NULL);
    -  }
    -  if (!(qh feasible_point= (pointT*)qh_malloc(dim * sizeof(coordT)))) {
    -    qh_fprintf(qh ferr, 6079, "qhull error: insufficient memory for 'Hn,n,n'\n");
    -    qh_errexit(qh_ERRmem, NULL, NULL);
    -  }
    -  coords= qh feasible_point;
    -  while (*s) {
    -    value= qh_strtod(s, &s);
    -    if (++tokcount > dim) {
    -      qh_fprintf(qh ferr, 7059, "qhull input warning: more coordinates for 'H%s' than dimension %d\n",
    -          qh feasible_string, dim);
    -      break;
    -    }
    -    *(coords++)= value;
    -    if (*s)
    -      s++;
    -  }
    -  while (++tokcount <= dim)
    -    *(coords++)= 0.0;
    -} /* setfeasible */
    -
    -/*---------------------------------
    -
    -  qh_skipfacet( facet )
    -    returns 'True' if this facet is not to be printed
    -
    -  notes:
    -    based on the user provided slice thresholds and 'good' specifications
    -*/
    -boolT qh_skipfacet(facetT *facet) {
    -  facetT *neighbor, **neighborp;
    -
    -  if (qh PRINTneighbors) {
    -    if (facet->good)
    -      return !qh PRINTgood;
    -    FOREACHneighbor_(facet) {
    -      if (neighbor->good)
    -        return False;
    -    }
    -    return True;
    -  }else if (qh PRINTgood)
    -    return !facet->good;
    -  else if (!facet->normal)
    -    return True;
    -  return(!qh_inthresholds(facet->normal, NULL));
    -} /* skipfacet */
    -
    -/*---------------------------------
    -
    -  qh_skipfilename( string )
    -    returns pointer to character after filename
    -
    -  notes:
    -    skips leading spaces
    -    ends with spacing or eol
    -    if starts with ' or " ends with the same, skipping \' or \"
    -    For qhull, qh_argv_to_command() only uses double quotes
    -*/
    -char *qh_skipfilename(char *filename) {
    -  char *s= filename;  /* non-const due to return */
    -  char c;
    -
    -  while (*s && isspace(*s))
    -    s++;
    -  c= *s++;
    -  if (c == '\0') {
    -    qh_fprintf(qh ferr, 6204, "qhull input error: filename expected, none found.\n");
    -    qh_errexit(qh_ERRinput, NULL, NULL);
    -  }
    -  if (c == '\'' || c == '"') {
    -    while (*s !=c || s[-1] == '\\') {
    -      if (!*s) {
    -        qh_fprintf(qh ferr, 6203, "qhull input error: missing quote after filename -- %s\n", filename);
    -        qh_errexit(qh_ERRinput, NULL, NULL);
    -      }
    -      s++;
    -    }
    -    s++;
    -  }
    -  else while (*s && !isspace(*s))
    -      s++;
    -  return s;
    -} /* skipfilename */
    -
    diff --git a/src/qhull/src/libqhull/io.h b/src/qhull/src/libqhull/io.h
    deleted file mode 100644
    index eca0369d30e..00000000000
    --- a/src/qhull/src/libqhull/io.h
    +++ /dev/null
    @@ -1,159 +0,0 @@
    -/*
      ---------------------------------
    -
    -   io.h
    -   declarations of Input/Output functions
    -
    -   see README, libqhull.h and io.c
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull/io.h#1 $$Change: 1981 $
    -   $DateTime: 2015/09/28 20:26:32 $$Author: bbarber $
    -*/
    -
    -#ifndef qhDEFio
    -#define qhDEFio 1
    -
    -#include "libqhull.h"
    -
    -/*============ constants and flags ==================*/
    -
    -/*----------------------------------
    -
    -  qh_MAXfirst
    -    maximum length of first two lines of stdin
    -*/
    -#define qh_MAXfirst  200
    -
    -/*----------------------------------
    -
    -  qh_MINradius
    -    min radius for Gp and Gv, fraction of maxcoord
    -*/
    -#define qh_MINradius 0.02
    -
    -/*----------------------------------
    -
    -  qh_GEOMepsilon
    -    adjust outer planes for 'lines closer' and geomview roundoff.
    -    This prevents bleed through.
    -*/
    -#define qh_GEOMepsilon 2e-3
    -
    -/*----------------------------------
    -
    -  qh_WHITESPACE
    -    possible values of white space
    -*/
    -#define qh_WHITESPACE " \n\t\v\r\f"
    -
    -
    -/*----------------------------------
    -
    -  qh_RIDGE
    -    to select which ridges to print in qh_eachvoronoi
    -*/
    -typedef enum
    -{
    -    qh_RIDGEall = 0, qh_RIDGEinner, qh_RIDGEouter
    -}
    -qh_RIDGE;
    -
    -/*----------------------------------
    -
    -  printvridgeT
    -    prints results of qh_printvdiagram
    -
    -  see:
    -    qh_printvridge for an example
    -*/
    -typedef void (*printvridgeT)(FILE *fp, vertexT *vertex, vertexT *vertexA, setT *centers, boolT unbounded);
    -
    -/*============== -prototypes in alphabetical order =========*/
    -
    -void    qh_dfacet(unsigned id);
    -void    qh_dvertex(unsigned id);
    -int     qh_compare_facetarea(const void *p1, const void *p2);
    -int     qh_compare_facetmerge(const void *p1, const void *p2);
    -int     qh_compare_facetvisit(const void *p1, const void *p2);
    -int     qh_compare_vertexpoint(const void *p1, const void *p2); /* not used, not in libqhull_r.h */
    -void    qh_copyfilename(char *filename, int size, const char* source, int length);
    -void    qh_countfacets(facetT *facetlist, setT *facets, boolT printall,
    -              int *numfacetsp, int *numsimplicialp, int *totneighborsp,
    -              int *numridgesp, int *numcoplanarsp, int *numnumtricoplanarsp);
    -pointT *qh_detvnorm(vertexT *vertex, vertexT *vertexA, setT *centers, realT *offsetp);
    -setT   *qh_detvridge(vertexT *vertex);
    -setT   *qh_detvridge3(vertexT *atvertex, vertexT *vertex);
    -int     qh_eachvoronoi(FILE *fp, printvridgeT printvridge, vertexT *atvertex, boolT visitall, qh_RIDGE innerouter, boolT inorder);
    -int     qh_eachvoronoi_all(FILE *fp, printvridgeT printvridge, boolT isUpper, qh_RIDGE innerouter, boolT inorder);
    -void    qh_facet2point(facetT *facet, pointT **point0, pointT **point1, realT *mindist);
    -setT   *qh_facetvertices(facetT *facetlist, setT *facets, boolT allfacets);
    -void    qh_geomplanes(facetT *facet, realT *outerplane, realT *innerplane);
    -void    qh_markkeep(facetT *facetlist);
    -setT   *qh_markvoronoi(facetT *facetlist, setT *facets, boolT printall, boolT *isLowerp, int *numcentersp);
    -void    qh_order_vertexneighbors(vertexT *vertex);
    -void    qh_prepare_output(void);
    -void    qh_printafacet(FILE *fp, qh_PRINT format, facetT *facet, boolT printall);
    -void    qh_printbegin(FILE *fp, qh_PRINT format, facetT *facetlist, setT *facets, boolT printall);
    -void    qh_printcenter(FILE *fp, qh_PRINT format, const char *string, facetT *facet);
    -void    qh_printcentrum(FILE *fp, facetT *facet, realT radius);
    -void    qh_printend(FILE *fp, qh_PRINT format, facetT *facetlist, setT *facets, boolT printall);
    -void    qh_printend4geom(FILE *fp, facetT *facet, int *num, boolT printall);
    -void    qh_printextremes(FILE *fp, facetT *facetlist, setT *facets, boolT printall);
    -void    qh_printextremes_2d(FILE *fp, facetT *facetlist, setT *facets, boolT printall);
    -void    qh_printextremes_d(FILE *fp, facetT *facetlist, setT *facets, boolT printall);
    -void    qh_printfacet(FILE *fp, facetT *facet);
    -void    qh_printfacet2math(FILE *fp, facetT *facet, qh_PRINT format, int notfirst);
    -void    qh_printfacet2geom(FILE *fp, facetT *facet, realT color[3]);
    -void    qh_printfacet2geom_points(FILE *fp, pointT *point1, pointT *point2,
    -                               facetT *facet, realT offset, realT color[3]);
    -void    qh_printfacet3math(FILE *fp, facetT *facet, qh_PRINT format, int notfirst);
    -void    qh_printfacet3geom_nonsimplicial(FILE *fp, facetT *facet, realT color[3]);
    -void    qh_printfacet3geom_points(FILE *fp, setT *points, facetT *facet, realT offset, realT color[3]);
    -void    qh_printfacet3geom_simplicial(FILE *fp, facetT *facet, realT color[3]);
    -void    qh_printfacet3vertex(FILE *fp, facetT *facet, qh_PRINT format);
    -void    qh_printfacet4geom_nonsimplicial(FILE *fp, facetT *facet, realT color[3]);
    -void    qh_printfacet4geom_simplicial(FILE *fp, facetT *facet, realT color[3]);
    -void    qh_printfacetNvertex_nonsimplicial(FILE *fp, facetT *facet, int id, qh_PRINT format);
    -void    qh_printfacetNvertex_simplicial(FILE *fp, facetT *facet, qh_PRINT format);
    -void    qh_printfacetheader(FILE *fp, facetT *facet);
    -void    qh_printfacetridges(FILE *fp, facetT *facet);
    -void    qh_printfacets(FILE *fp, qh_PRINT format, facetT *facetlist, setT *facets, boolT printall);
    -void    qh_printhyperplaneintersection(FILE *fp, facetT *facet1, facetT *facet2,
    -                   setT *vertices, realT color[3]);
    -void    qh_printneighborhood(FILE *fp, qh_PRINT format, facetT *facetA, facetT *facetB, boolT printall);
    -void    qh_printline3geom(FILE *fp, pointT *pointA, pointT *pointB, realT color[3]);
    -void    qh_printpoint(FILE *fp, const char *string, pointT *point);
    -void    qh_printpointid(FILE *fp, const char *string, int dim, pointT *point, int id);
    -void    qh_printpoint3(FILE *fp, pointT *point);
    -void    qh_printpoints_out(FILE *fp, facetT *facetlist, setT *facets, boolT printall);
    -void    qh_printpointvect(FILE *fp, pointT *point, coordT *normal, pointT *center, realT radius, realT color[3]);
    -void    qh_printpointvect2(FILE *fp, pointT *point, coordT *normal, pointT *center, realT radius);
    -void    qh_printridge(FILE *fp, ridgeT *ridge);
    -void    qh_printspheres(FILE *fp, setT *vertices, realT radius);
    -void    qh_printvdiagram(FILE *fp, qh_PRINT format, facetT *facetlist, setT *facets, boolT printall);
    -int     qh_printvdiagram2(FILE *fp, printvridgeT printvridge, setT *vertices, qh_RIDGE innerouter, boolT inorder);
    -void    qh_printvertex(FILE *fp, vertexT *vertex);
    -void    qh_printvertexlist(FILE *fp, const char* string, facetT *facetlist,
    -                         setT *facets, boolT printall);
    -void    qh_printvertices(FILE *fp, const char* string, setT *vertices);
    -void    qh_printvneighbors(FILE *fp, facetT* facetlist, setT *facets, boolT printall);
    -void    qh_printvoronoi(FILE *fp, qh_PRINT format, facetT *facetlist, setT *facets, boolT printall);
    -void    qh_printvnorm(FILE *fp, vertexT *vertex, vertexT *vertexA, setT *centers, boolT unbounded);
    -void    qh_printvridge(FILE *fp, vertexT *vertex, vertexT *vertexA, setT *centers, boolT unbounded);
    -void    qh_produce_output(void);
    -void    qh_produce_output2(void);
    -void    qh_projectdim3(pointT *source, pointT *destination);
    -int     qh_readfeasible(int dim, const char *curline);
    -coordT *qh_readpoints(int *numpoints, int *dimension, boolT *ismalloc);
    -void    qh_setfeasible(int dim);
    -boolT   qh_skipfacet(facetT *facet);
    -char   *qh_skipfilename(char *filename);
    -
    -#endif /* qhDEFio */
    diff --git a/src/qhull/src/libqhull/libqhull.c b/src/qhull/src/libqhull/libqhull.c
    deleted file mode 100644
    index 7696a8a9fee..00000000000
    --- a/src/qhull/src/libqhull/libqhull.c
    +++ /dev/null
    @@ -1,1403 +0,0 @@
    -/*
      ---------------------------------
    -
    -   libqhull.c
    -   Quickhull algorithm for convex hulls
    -
    -   qhull() and top-level routines
    -
    -   see qh-qhull.htm, libqhull.h, unix.c
    -
    -   see qhull_a.h for internal functions
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull/libqhull.c#3 $$Change: 2047 $
    -   $DateTime: 2016/01/04 22:03:18 $$Author: bbarber $
    -*/
    -
    -#include "qhull_a.h"
    -
    -/*============= functions in alphabetic order after qhull() =======*/
    -
    -/*---------------------------------
    -
    -  qh_qhull()
    -    compute DIM3 convex hull of qh.num_points starting at qh.first_point
    -    qh contains all global options and variables
    -
    -  returns:
    -    returns polyhedron
    -      qh.facet_list, qh.num_facets, qh.vertex_list, qh.num_vertices,
    -
    -    returns global variables
    -      qh.hulltime, qh.max_outside, qh.interior_point, qh.max_vertex, qh.min_vertex
    -
    -    returns precision constants
    -      qh.ANGLEround, centrum_radius, cos_max, DISTround, MAXabs_coord, ONEmerge
    -
    -  notes:
    -    unless needed for output
    -      qh.max_vertex and qh.min_vertex are max/min due to merges
    -
    -  see:
    -    to add individual points to either qh.num_points
    -      use qh_addpoint()
    -
    -    if qh.GETarea
    -      qh_produceoutput() returns qh.totarea and qh.totvol via qh_getarea()
    -
    -  design:
    -    record starting time
    -    initialize hull and partition points
    -    build convex hull
    -    unless early termination
    -      update facet->maxoutside for vertices, coplanar, and near-inside points
    -    error if temporary sets exist
    -    record end time
    -*/
    -
    -void qh_qhull(void) {
    -  int numoutside;
    -
    -  qh hulltime= qh_CPUclock;
    -  if (qh RERUN || qh JOGGLEmax < REALmax/2)
    -    qh_build_withrestart();
    -  else {
    -    qh_initbuild();
    -    qh_buildhull();
    -  }
    -  if (!qh STOPpoint && !qh STOPcone) {
    -    if (qh ZEROall_ok && !qh TESTvneighbors && qh MERGEexact)
    -      qh_checkzero( qh_ALL);
    -    if (qh ZEROall_ok && !qh TESTvneighbors && !qh WAScoplanar) {
    -      trace2((qh ferr, 2055, "qh_qhull: all facets are clearly convex and no coplanar points.  Post-merging and check of maxout not needed.\n"));
    -      qh DOcheckmax= False;
    -    }else {
    -      if (qh MERGEexact || (qh hull_dim > qh_DIMreduceBuild && qh PREmerge))
    -        qh_postmerge("First post-merge", qh premerge_centrum, qh premerge_cos,
    -             (qh POSTmerge ? False : qh TESTvneighbors));
    -      else if (!qh POSTmerge && qh TESTvneighbors)
    -        qh_postmerge("For testing vertex neighbors", qh premerge_centrum,
    -             qh premerge_cos, True);
    -      if (qh POSTmerge)
    -        qh_postmerge("For post-merging", qh postmerge_centrum,
    -             qh postmerge_cos, qh TESTvneighbors);
    -      if (qh visible_list == qh facet_list) { /* i.e., merging done */
    -        qh findbestnew= True;
    -        qh_partitionvisible(/*qh.visible_list*/ !qh_ALL, &numoutside);
    -        qh findbestnew= False;
    -        qh_deletevisible(/*qh.visible_list*/);
    -        qh_resetlists(False, qh_RESETvisible /*qh.visible_list newvertex_list newfacet_list */);
    -      }
    -    }
    -    if (qh DOcheckmax){
    -      if (qh REPORTfreq) {
    -        qh_buildtracing(NULL, NULL);
    -        qh_fprintf(qh ferr, 8115, "\nTesting all coplanar points.\n");
    -      }
    -      qh_check_maxout();
    -    }
    -    if (qh KEEPnearinside && !qh maxoutdone)
    -      qh_nearcoplanar();
    -  }
    -  if (qh_setsize(qhmem.tempstack) != 0) {
    -    qh_fprintf(qh ferr, 6164, "qhull internal error (qh_qhull): temporary sets not empty(%d)\n",
    -             qh_setsize(qhmem.tempstack));
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -  qh hulltime= qh_CPUclock - qh hulltime;
    -  qh QHULLfinished= True;
    -  trace1((qh ferr, 1036, "Qhull: algorithm completed\n"));
    -} /* qhull */
    -
    -/*---------------------------------
    -
    -  qh_addpoint( furthest, facet, checkdist )
    -    add point (usually furthest point) above facet to hull
    -    if checkdist,
    -      check that point is above facet.
    -      if point is not outside of the hull, uses qh_partitioncoplanar()
    -      assumes that facet is defined by qh_findbestfacet()
    -    else if facet specified,
    -      assumes that point is above facet (major damage if below)
    -    for Delaunay triangulations,
    -      Use qh_setdelaunay() to lift point to paraboloid and scale by 'Qbb' if needed
    -      Do not use options 'Qbk', 'QBk', or 'QbB' since they scale the coordinates.
    -
    -  returns:
    -    returns False if user requested an early termination
    -     qh.visible_list, newfacet_list, delvertex_list, NEWfacets may be defined
    -    updates qh.facet_list, qh.num_facets, qh.vertex_list, qh.num_vertices
    -    clear qh.maxoutdone (will need to call qh_check_maxout() for facet->maxoutside)
    -    if unknown point, adds a pointer to qh.other_points
    -      do not deallocate the point's coordinates
    -
    -  notes:
    -    assumes point is near its best facet and not at a local minimum of a lens
    -      distributions.  Use qh_findbestfacet to avoid this case.
    -    uses qh.visible_list, qh.newfacet_list, qh.delvertex_list, qh.NEWfacets
    -
    -  see also:
    -    qh_triangulate() -- triangulate non-simplicial facets
    -
    -  design:
    -    add point to other_points if needed
    -    if checkdist
    -      if point not above facet
    -        partition coplanar point
    -        exit
    -    exit if pre STOPpoint requested
    -    find horizon and visible facets for point
    -    make new facets for point to horizon
    -    make hyperplanes for point
    -    compute balance statistics
    -    match neighboring new facets
    -    update vertex neighbors and delete interior vertices
    -    exit if STOPcone requested
    -    merge non-convex new facets
    -    if merge found, many merges, or 'Qf'
    -       use qh_findbestnew() instead of qh_findbest()
    -    partition outside points from visible facets
    -    delete visible facets
    -    check polyhedron if requested
    -    exit if post STOPpoint requested
    -    reset working lists of facets and vertices
    -*/
    -boolT qh_addpoint(pointT *furthest, facetT *facet, boolT checkdist) {
    -  int goodvisible, goodhorizon;
    -  vertexT *vertex;
    -  facetT *newfacet;
    -  realT dist, newbalance, pbalance;
    -  boolT isoutside= False;
    -  int numpart, numpoints, numnew, firstnew;
    -
    -  qh maxoutdone= False;
    -  if (qh_pointid(furthest) == qh_IDunknown)
    -    qh_setappend(&qh other_points, furthest);
    -  if (!facet) {
    -    qh_fprintf(qh ferr, 6213, "qhull internal error (qh_addpoint): NULL facet.  Need to call qh_findbestfacet first\n");
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -  if (checkdist) {
    -    facet= qh_findbest(furthest, facet, !qh_ALL, !qh_ISnewfacets, !qh_NOupper,
    -                        &dist, &isoutside, &numpart);
    -    zzadd_(Zpartition, numpart);
    -    if (!isoutside) {
    -      zinc_(Znotmax);  /* last point of outsideset is no longer furthest. */
    -      facet->notfurthest= True;
    -      qh_partitioncoplanar(furthest, facet, &dist);
    -      return True;
    -    }
    -  }
    -  qh_buildtracing(furthest, facet);
    -  if (qh STOPpoint < 0 && qh furthest_id == -qh STOPpoint-1) {
    -    facet->notfurthest= True;
    -    return False;
    -  }
    -  qh_findhorizon(furthest, facet, &goodvisible, &goodhorizon);
    -  if (qh ONLYgood && !(goodvisible+goodhorizon) && !qh GOODclosest) {
    -    zinc_(Znotgood);
    -    facet->notfurthest= True;
    -    /* last point of outsideset is no longer furthest.  This is ok
    -       since all points of the outside are likely to be bad */
    -    qh_resetlists(False, qh_RESETvisible /*qh.visible_list newvertex_list newfacet_list */);
    -    return True;
    -  }
    -  zzinc_(Zprocessed);
    -  firstnew= qh facet_id;
    -  vertex= qh_makenewfacets(furthest /*visible_list, attaches if !ONLYgood */);
    -  qh_makenewplanes(/* newfacet_list */);
    -  numnew= qh facet_id - firstnew;
    -  newbalance= numnew - (realT) (qh num_facets-qh num_visible)
    -                         * qh hull_dim/qh num_vertices;
    -  wadd_(Wnewbalance, newbalance);
    -  wadd_(Wnewbalance2, newbalance * newbalance);
    -  if (qh ONLYgood
    -  && !qh_findgood(qh newfacet_list, goodhorizon) && !qh GOODclosest) {
    -    FORALLnew_facets
    -      qh_delfacet(newfacet);
    -    qh_delvertex(vertex);
    -    qh_resetlists(True, qh_RESETvisible /*qh.visible_list newvertex_list newfacet_list */);
    -    zinc_(Znotgoodnew);
    -    facet->notfurthest= True;
    -    return True;
    -  }
    -  if (qh ONLYgood)
    -    qh_attachnewfacets(/*visible_list*/);
    -  qh_matchnewfacets();
    -  qh_updatevertices();
    -  if (qh STOPcone && qh furthest_id == qh STOPcone-1) {
    -    facet->notfurthest= True;
    -    return False;  /* visible_list etc. still defined */
    -  }
    -  qh findbestnew= False;
    -  if (qh PREmerge || qh MERGEexact) {
    -    qh_premerge(vertex, qh premerge_centrum, qh premerge_cos);
    -    if (qh_USEfindbestnew)
    -      qh findbestnew= True;
    -    else {
    -      FORALLnew_facets {
    -        if (!newfacet->simplicial) {
    -          qh findbestnew= True;  /* use qh_findbestnew instead of qh_findbest*/
    -          break;
    -        }
    -      }
    -    }
    -  }else if (qh BESToutside)
    -    qh findbestnew= True;
    -  qh_partitionvisible(/*qh.visible_list*/ !qh_ALL, &numpoints);
    -  qh findbestnew= False;
    -  qh findbest_notsharp= False;
    -  zinc_(Zpbalance);
    -  pbalance= numpoints - (realT) qh hull_dim /* assumes all points extreme */
    -                * (qh num_points - qh num_vertices)/qh num_vertices;
    -  wadd_(Wpbalance, pbalance);
    -  wadd_(Wpbalance2, pbalance * pbalance);
    -  qh_deletevisible(/*qh.visible_list*/);
    -  zmax_(Zmaxvertex, qh num_vertices);
    -  qh NEWfacets= False;
    -  if (qh IStracing >= 4) {
    -    if (qh num_facets < 2000)
    -      qh_printlists();
    -    qh_printfacetlist(qh newfacet_list, NULL, True);
    -    qh_checkpolygon(qh facet_list);
    -  }else if (qh CHECKfrequently) {
    -    if (qh num_facets < 50)
    -      qh_checkpolygon(qh facet_list);
    -    else
    -      qh_checkpolygon(qh newfacet_list);
    -  }
    -  if (qh STOPpoint > 0 && qh furthest_id == qh STOPpoint-1)
    -    return False;
    -  qh_resetlists(True, qh_RESETvisible /*qh.visible_list newvertex_list newfacet_list */);
    -  /* qh_triangulate(); to test qh.TRInormals */
    -  trace2((qh ferr, 2056, "qh_addpoint: added p%d new facets %d new balance %2.2g point balance %2.2g\n",
    -    qh_pointid(furthest), numnew, newbalance, pbalance));
    -  return True;
    -} /* addpoint */
    -
    -/*---------------------------------
    -
    -  qh_build_withrestart()
    -    allow restarts due to qh.JOGGLEmax while calling qh_buildhull()
    -       qh_errexit always undoes qh_build_withrestart()
    -    qh.FIRSTpoint/qh.NUMpoints is point array
    -        it may be moved by qh_joggleinput()
    -*/
    -void qh_build_withrestart(void) {
    -  int restart;
    -
    -  qh ALLOWrestart= True;
    -  while (True) {
    -    restart= setjmp(qh restartexit); /* simple statement for CRAY J916 */
    -    if (restart) {       /* only from qh_precision() */
    -      zzinc_(Zretry);
    -      wmax_(Wretrymax, qh JOGGLEmax);
    -      /* QH7078 warns about using 'TCn' with 'QJn' */
    -      qh STOPcone= qh_IDunknown; /* if break from joggle, prevents normal output */
    -    }
    -    if (!qh RERUN && qh JOGGLEmax < REALmax/2) {
    -      if (qh build_cnt > qh_JOGGLEmaxretry) {
    -        qh_fprintf(qh ferr, 6229, "qhull precision error: %d attempts to construct a convex hull\n\
    -        with joggled input.  Increase joggle above 'QJ%2.2g'\n\
    -        or modify qh_JOGGLE... parameters in user.h\n",
    -           qh build_cnt, qh JOGGLEmax);
    -        qh_errexit(qh_ERRqhull, NULL, NULL);
    -      }
    -      if (qh build_cnt && !restart)
    -        break;
    -    }else if (qh build_cnt && qh build_cnt >= qh RERUN)
    -      break;
    -    qh STOPcone= 0;
    -    qh_freebuild(True);  /* first call is a nop */
    -    qh build_cnt++;
    -    if (!qh qhull_optionsiz)
    -      qh qhull_optionsiz= (int)strlen(qh qhull_options);   /* WARN64 */
    -    else {
    -      qh qhull_options [qh qhull_optionsiz]= '\0';
    -      qh qhull_optionlen= qh_OPTIONline;  /* starts a new line */
    -    }
    -    qh_option("_run", &qh build_cnt, NULL);
    -    if (qh build_cnt == qh RERUN) {
    -      qh IStracing= qh TRACElastrun;  /* duplicated from qh_initqhull_globals */
    -      if (qh TRACEpoint != qh_IDunknown || qh TRACEdist < REALmax/2 || qh TRACEmerge) {
    -        qh TRACElevel= (qh IStracing? qh IStracing : 3);
    -        qh IStracing= 0;
    -      }
    -      qhmem.IStracing= qh IStracing;
    -    }
    -    if (qh JOGGLEmax < REALmax/2)
    -      qh_joggleinput();
    -    qh_initbuild();
    -    qh_buildhull();
    -    if (qh JOGGLEmax < REALmax/2 && !qh MERGING)
    -      qh_checkconvex(qh facet_list, qh_ALGORITHMfault);
    -  }
    -  qh ALLOWrestart= False;
    -} /* qh_build_withrestart */
    -
    -/*---------------------------------
    -
    -  qh_buildhull()
    -    construct a convex hull by adding outside points one at a time
    -
    -  returns:
    -
    -  notes:
    -    may be called multiple times
    -    checks facet and vertex lists for incorrect flags
    -    to recover from STOPcone, call qh_deletevisible and qh_resetlists
    -
    -  design:
    -    check visible facet and newfacet flags
    -    check newlist vertex flags and qh.STOPcone/STOPpoint
    -    for each facet with a furthest outside point
    -      add point to facet
    -      exit if qh.STOPcone or qh.STOPpoint requested
    -    if qh.NARROWhull for initial simplex
    -      partition remaining outside points to coplanar sets
    -*/
    -void qh_buildhull(void) {
    -  facetT *facet;
    -  pointT *furthest;
    -  vertexT *vertex;
    -  int id;
    -
    -  trace1((qh ferr, 1037, "qh_buildhull: start build hull\n"));
    -  FORALLfacets {
    -    if (facet->visible || facet->newfacet) {
    -      qh_fprintf(qh ferr, 6165, "qhull internal error (qh_buildhull): visible or new facet f%d in facet list\n",
    -                   facet->id);
    -      qh_errexit(qh_ERRqhull, facet, NULL);
    -    }
    -  }
    -  FORALLvertices {
    -    if (vertex->newlist) {
    -      qh_fprintf(qh ferr, 6166, "qhull internal error (qh_buildhull): new vertex f%d in vertex list\n",
    -                   vertex->id);
    -      qh_errprint("ERRONEOUS", NULL, NULL, NULL, vertex);
    -      qh_errexit(qh_ERRqhull, NULL, NULL);
    -    }
    -    id= qh_pointid(vertex->point);
    -    if ((qh STOPpoint>0 && id == qh STOPpoint-1) ||
    -        (qh STOPpoint<0 && id == -qh STOPpoint-1) ||
    -        (qh STOPcone>0 && id == qh STOPcone-1)) {
    -      trace1((qh ferr, 1038,"qh_buildhull: stop point or cone P%d in initial hull\n", id));
    -      return;
    -    }
    -  }
    -  qh facet_next= qh facet_list;      /* advance facet when processed */
    -  while ((furthest= qh_nextfurthest(&facet))) {
    -    qh num_outside--;  /* if ONLYmax, furthest may not be outside */
    -    if (!qh_addpoint(furthest, facet, qh ONLYmax))
    -      break;
    -  }
    -  if (qh NARROWhull) /* move points from outsideset to coplanarset */
    -    qh_outcoplanar( /* facet_list */ );
    -  if (qh num_outside && !furthest) {
    -    qh_fprintf(qh ferr, 6167, "qhull internal error (qh_buildhull): %d outside points were never processed.\n", qh num_outside);
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -  trace1((qh ferr, 1039, "qh_buildhull: completed the hull construction\n"));
    -} /* buildhull */
    -
    -
    -/*---------------------------------
    -
    -  qh_buildtracing( furthest, facet )
    -    trace an iteration of qh_buildhull() for furthest point and facet
    -    if !furthest, prints progress message
    -
    -  returns:
    -    tracks progress with qh.lastreport
    -    updates qh.furthest_id (-3 if furthest is NULL)
    -    also resets visit_id, vertext_visit on wrap around
    -
    -  see:
    -    qh_tracemerging()
    -
    -  design:
    -    if !furthest
    -      print progress message
    -      exit
    -    if 'TFn' iteration
    -      print progress message
    -    else if tracing
    -      trace furthest point and facet
    -    reset qh.visit_id and qh.vertex_visit if overflow may occur
    -    set qh.furthest_id for tracing
    -*/
    -void qh_buildtracing(pointT *furthest, facetT *facet) {
    -  realT dist= 0;
    -  float cpu;
    -  int total, furthestid;
    -  time_t timedata;
    -  struct tm *tp;
    -  vertexT *vertex;
    -
    -  qh old_randomdist= qh RANDOMdist;
    -  qh RANDOMdist= False;
    -  if (!furthest) {
    -    time(&timedata);
    -    tp= localtime(&timedata);
    -    cpu= (float)qh_CPUclock - (float)qh hulltime;
    -    cpu /= (float)qh_SECticks;
    -    total= zzval_(Ztotmerge) - zzval_(Zcyclehorizon) + zzval_(Zcyclefacettot);
    -    qh_fprintf(qh ferr, 8118, "\n\
    -At %02d:%02d:%02d & %2.5g CPU secs, qhull has created %d facets and merged %d.\n\
    - The current hull contains %d facets and %d vertices.  Last point was p%d\n",
    -      tp->tm_hour, tp->tm_min, tp->tm_sec, cpu, qh facet_id -1,
    -      total, qh num_facets, qh num_vertices, qh furthest_id);
    -    return;
    -  }
    -  furthestid= qh_pointid(furthest);
    -  if (qh TRACEpoint == furthestid) {
    -    qh IStracing= qh TRACElevel;
    -    qhmem.IStracing= qh TRACElevel;
    -  }else if (qh TRACEpoint != qh_IDunknown && qh TRACEdist < REALmax/2) {
    -    qh IStracing= 0;
    -    qhmem.IStracing= 0;
    -  }
    -  if (qh REPORTfreq && (qh facet_id-1 > qh lastreport+qh REPORTfreq)) {
    -    qh lastreport= qh facet_id-1;
    -    time(&timedata);
    -    tp= localtime(&timedata);
    -    cpu= (float)qh_CPUclock - (float)qh hulltime;
    -    cpu /= (float)qh_SECticks;
    -    total= zzval_(Ztotmerge) - zzval_(Zcyclehorizon) + zzval_(Zcyclefacettot);
    -    zinc_(Zdistio);
    -    qh_distplane(furthest, facet, &dist);
    -    qh_fprintf(qh ferr, 8119, "\n\
    -At %02d:%02d:%02d & %2.5g CPU secs, qhull has created %d facets and merged %d.\n\
    - The current hull contains %d facets and %d vertices.  There are %d\n\
    - outside points.  Next is point p%d(v%d), %2.2g above f%d.\n",
    -      tp->tm_hour, tp->tm_min, tp->tm_sec, cpu, qh facet_id -1,
    -      total, qh num_facets, qh num_vertices, qh num_outside+1,
    -      furthestid, qh vertex_id, dist, getid_(facet));
    -  }else if (qh IStracing >=1) {
    -    cpu= (float)qh_CPUclock - (float)qh hulltime;
    -    cpu /= (float)qh_SECticks;
    -    qh_distplane(furthest, facet, &dist);
    -    qh_fprintf(qh ferr, 8120, "qh_addpoint: add p%d(v%d) to hull of %d facets(%2.2g above f%d) and %d outside at %4.4g CPU secs.  Previous was p%d.\n",
    -      furthestid, qh vertex_id, qh num_facets, dist,
    -      getid_(facet), qh num_outside+1, cpu, qh furthest_id);
    -  }
    -  zmax_(Zvisit2max, (int)qh visit_id/2);
    -  if (qh visit_id > (unsigned) INT_MAX) { /* 31 bits */
    -    zinc_(Zvisit);
    -    qh visit_id= 0;
    -    FORALLfacets
    -      facet->visitid= 0;
    -  }
    -  zmax_(Zvvisit2max, (int)qh vertex_visit/2);
    -  if (qh vertex_visit > (unsigned) INT_MAX) { /* 31 bits */
    -    zinc_(Zvvisit);
    -    qh vertex_visit= 0;
    -    FORALLvertices
    -      vertex->visitid= 0;
    -  }
    -  qh furthest_id= furthestid;
    -  qh RANDOMdist= qh old_randomdist;
    -} /* buildtracing */
    -
    -/*---------------------------------
    -
    -  qh_errexit2( exitcode, facet, otherfacet )
    -    return exitcode to system after an error
    -    report two facets
    -
    -  returns:
    -    assumes exitcode non-zero
    -
    -  see:
    -    normally use qh_errexit() in user.c(reports a facet and a ridge)
    -*/
    -void qh_errexit2(int exitcode, facetT *facet, facetT *otherfacet) {
    -
    -  qh_errprint("ERRONEOUS", facet, otherfacet, NULL, NULL);
    -  qh_errexit(exitcode, NULL, NULL);
    -} /* errexit2 */
    -
    -
    -/*---------------------------------
    -
    -  qh_findhorizon( point, facet, goodvisible, goodhorizon )
    -    given a visible facet, find the point's horizon and visible facets
    -    for all facets, !facet-visible
    -
    -  returns:
    -    returns qh.visible_list/num_visible with all visible facets
    -      marks visible facets with ->visible
    -    updates count of good visible and good horizon facets
    -    updates qh.max_outside, qh.max_vertex, facet->maxoutside
    -
    -  see:
    -    similar to qh_delpoint()
    -
    -  design:
    -    move facet to qh.visible_list at end of qh.facet_list
    -    for all visible facets
    -     for each unvisited neighbor of a visible facet
    -       compute distance of point to neighbor
    -       if point above neighbor
    -         move neighbor to end of qh.visible_list
    -       else if point is coplanar with neighbor
    -         update qh.max_outside, qh.max_vertex, neighbor->maxoutside
    -         mark neighbor coplanar (will create a samecycle later)
    -         update horizon statistics
    -*/
    -void qh_findhorizon(pointT *point, facetT *facet, int *goodvisible, int *goodhorizon) {
    -  facetT *neighbor, **neighborp, *visible;
    -  int numhorizon= 0, coplanar= 0;
    -  realT dist;
    -
    -  trace1((qh ferr, 1040,"qh_findhorizon: find horizon for point p%d facet f%d\n",qh_pointid(point),facet->id));
    -  *goodvisible= *goodhorizon= 0;
    -  zinc_(Ztotvisible);
    -  qh_removefacet(facet);  /* visible_list at end of qh facet_list */
    -  qh_appendfacet(facet);
    -  qh num_visible= 1;
    -  if (facet->good)
    -    (*goodvisible)++;
    -  qh visible_list= facet;
    -  facet->visible= True;
    -  facet->f.replace= NULL;
    -  if (qh IStracing >=4)
    -    qh_errprint("visible", facet, NULL, NULL, NULL);
    -  qh visit_id++;
    -  FORALLvisible_facets {
    -    if (visible->tricoplanar && !qh TRInormals) {
    -      qh_fprintf(qh ferr, 6230, "Qhull internal error (qh_findhorizon): does not work for tricoplanar facets.  Use option 'Q11'\n");
    -      qh_errexit(qh_ERRqhull, visible, NULL);
    -    }
    -    visible->visitid= qh visit_id;
    -    FOREACHneighbor_(visible) {
    -      if (neighbor->visitid == qh visit_id)
    -        continue;
    -      neighbor->visitid= qh visit_id;
    -      zzinc_(Znumvisibility);
    -      qh_distplane(point, neighbor, &dist);
    -      if (dist > qh MINvisible) {
    -        zinc_(Ztotvisible);
    -        qh_removefacet(neighbor);  /* append to end of qh visible_list */
    -        qh_appendfacet(neighbor);
    -        neighbor->visible= True;
    -        neighbor->f.replace= NULL;
    -        qh num_visible++;
    -        if (neighbor->good)
    -          (*goodvisible)++;
    -        if (qh IStracing >=4)
    -          qh_errprint("visible", neighbor, NULL, NULL, NULL);
    -      }else {
    -        if (dist > - qh MAXcoplanar) {
    -          neighbor->coplanar= True;
    -          zzinc_(Zcoplanarhorizon);
    -          qh_precision("coplanar horizon");
    -          coplanar++;
    -          if (qh MERGING) {
    -            if (dist > 0) {
    -              maximize_(qh max_outside, dist);
    -              maximize_(qh max_vertex, dist);
    -#if qh_MAXoutside
    -              maximize_(neighbor->maxoutside, dist);
    -#endif
    -            }else
    -              minimize_(qh min_vertex, dist);  /* due to merge later */
    -          }
    -          trace2((qh ferr, 2057, "qh_findhorizon: point p%d is coplanar to horizon f%d, dist=%2.7g < qh MINvisible(%2.7g)\n",
    -              qh_pointid(point), neighbor->id, dist, qh MINvisible));
    -        }else
    -          neighbor->coplanar= False;
    -        zinc_(Ztothorizon);
    -        numhorizon++;
    -        if (neighbor->good)
    -          (*goodhorizon)++;
    -        if (qh IStracing >=4)
    -          qh_errprint("horizon", neighbor, NULL, NULL, NULL);
    -      }
    -    }
    -  }
    -  if (!numhorizon) {
    -    qh_precision("empty horizon");
    -    qh_fprintf(qh ferr, 6168, "qhull precision error (qh_findhorizon): empty horizon\n\
    -QhullPoint p%d was above all facets.\n", qh_pointid(point));
    -    qh_printfacetlist(qh facet_list, NULL, True);
    -    qh_errexit(qh_ERRprec, NULL, NULL);
    -  }
    -  trace1((qh ferr, 1041, "qh_findhorizon: %d horizon facets(good %d), %d visible(good %d), %d coplanar\n",
    -       numhorizon, *goodhorizon, qh num_visible, *goodvisible, coplanar));
    -  if (qh IStracing >= 4 && qh num_facets < 50)
    -    qh_printlists();
    -} /* findhorizon */
    -
    -/*---------------------------------
    -
    -  qh_nextfurthest( visible )
    -    returns next furthest point and visible facet for qh_addpoint()
    -    starts search at qh.facet_next
    -
    -  returns:
    -    removes furthest point from outside set
    -    NULL if none available
    -    advances qh.facet_next over facets with empty outside sets
    -
    -  design:
    -    for each facet from qh.facet_next
    -      if empty outside set
    -        advance qh.facet_next
    -      else if qh.NARROWhull
    -        determine furthest outside point
    -        if furthest point is not outside
    -          advance qh.facet_next(point will be coplanar)
    -    remove furthest point from outside set
    -*/
    -pointT *qh_nextfurthest(facetT **visible) {
    -  facetT *facet;
    -  int size, idx;
    -  realT randr, dist;
    -  pointT *furthest;
    -
    -  while ((facet= qh facet_next) != qh facet_tail) {
    -    if (!facet->outsideset) {
    -      qh facet_next= facet->next;
    -      continue;
    -    }
    -    SETreturnsize_(facet->outsideset, size);
    -    if (!size) {
    -      qh_setfree(&facet->outsideset);
    -      qh facet_next= facet->next;
    -      continue;
    -    }
    -    if (qh NARROWhull) {
    -      if (facet->notfurthest)
    -        qh_furthestout(facet);
    -      furthest= (pointT*)qh_setlast(facet->outsideset);
    -#if qh_COMPUTEfurthest
    -      qh_distplane(furthest, facet, &dist);
    -      zinc_(Zcomputefurthest);
    -#else
    -      dist= facet->furthestdist;
    -#endif
    -      if (dist < qh MINoutside) { /* remainder of outside set is coplanar for qh_outcoplanar */
    -        qh facet_next= facet->next;
    -        continue;
    -      }
    -    }
    -    if (!qh RANDOMoutside && !qh VIRTUALmemory) {
    -      if (qh PICKfurthest) {
    -        qh_furthestnext(/* qh.facet_list */);
    -        facet= qh facet_next;
    -      }
    -      *visible= facet;
    -      return((pointT*)qh_setdellast(facet->outsideset));
    -    }
    -    if (qh RANDOMoutside) {
    -      int outcoplanar = 0;
    -      if (qh NARROWhull) {
    -        FORALLfacets {
    -          if (facet == qh facet_next)
    -            break;
    -          if (facet->outsideset)
    -            outcoplanar += qh_setsize( facet->outsideset);
    -        }
    -      }
    -      randr= qh_RANDOMint;
    -      randr= randr/(qh_RANDOMmax+1);
    -      idx= (int)floor((qh num_outside - outcoplanar) * randr);
    -      FORALLfacet_(qh facet_next) {
    -        if (facet->outsideset) {
    -          SETreturnsize_(facet->outsideset, size);
    -          if (!size)
    -            qh_setfree(&facet->outsideset);
    -          else if (size > idx) {
    -            *visible= facet;
    -            return((pointT*)qh_setdelnth(facet->outsideset, idx));
    -          }else
    -            idx -= size;
    -        }
    -      }
    -      qh_fprintf(qh ferr, 6169, "qhull internal error (qh_nextfurthest): num_outside %d is too low\nby at least %d, or a random real %g >= 1.0\n",
    -              qh num_outside, idx+1, randr);
    -      qh_errexit(qh_ERRqhull, NULL, NULL);
    -    }else { /* VIRTUALmemory */
    -      facet= qh facet_tail->previous;
    -      if (!(furthest= (pointT*)qh_setdellast(facet->outsideset))) {
    -        if (facet->outsideset)
    -          qh_setfree(&facet->outsideset);
    -        qh_removefacet(facet);
    -        qh_prependfacet(facet, &qh facet_list);
    -        continue;
    -      }
    -      *visible= facet;
    -      return furthest;
    -    }
    -  }
    -  return NULL;
    -} /* nextfurthest */
    -
    -/*---------------------------------
    -
    -  qh_partitionall( vertices, points, numpoints )
    -    partitions all points in points/numpoints to the outsidesets of facets
    -    vertices= vertices in qh.facet_list(!partitioned)
    -
    -  returns:
    -    builds facet->outsideset
    -    does not partition qh.GOODpoint
    -    if qh.ONLYgood && !qh.MERGING,
    -      does not partition qh.GOODvertex
    -
    -  notes:
    -    faster if qh.facet_list sorted by anticipated size of outside set
    -
    -  design:
    -    initialize pointset with all points
    -    remove vertices from pointset
    -    remove qh.GOODpointp from pointset (unless it's qh.STOPcone or qh.STOPpoint)
    -    for all facets
    -      for all remaining points in pointset
    -        compute distance from point to facet
    -        if point is outside facet
    -          remove point from pointset (by not reappending)
    -          update bestpoint
    -          append point or old bestpoint to facet's outside set
    -      append bestpoint to facet's outside set (furthest)
    -    for all points remaining in pointset
    -      partition point into facets' outside sets and coplanar sets
    -*/
    -void qh_partitionall(setT *vertices, pointT *points, int numpoints){
    -  setT *pointset;
    -  vertexT *vertex, **vertexp;
    -  pointT *point, **pointp, *bestpoint;
    -  int size, point_i, point_n, point_end, remaining, i, id;
    -  facetT *facet;
    -  realT bestdist= -REALmax, dist, distoutside;
    -
    -  trace1((qh ferr, 1042, "qh_partitionall: partition all points into outside sets\n"));
    -  pointset= qh_settemp(numpoints);
    -  qh num_outside= 0;
    -  pointp= SETaddr_(pointset, pointT);
    -  for (i=numpoints, point= points; i--; point += qh hull_dim)
    -    *(pointp++)= point;
    -  qh_settruncate(pointset, numpoints);
    -  FOREACHvertex_(vertices) {
    -    if ((id= qh_pointid(vertex->point)) >= 0)
    -      SETelem_(pointset, id)= NULL;
    -  }
    -  id= qh_pointid(qh GOODpointp);
    -  if (id >=0 && qh STOPcone-1 != id && -qh STOPpoint-1 != id)
    -    SETelem_(pointset, id)= NULL;
    -  if (qh GOODvertexp && qh ONLYgood && !qh MERGING) { /* matches qhull()*/
    -    if ((id= qh_pointid(qh GOODvertexp)) >= 0)
    -      SETelem_(pointset, id)= NULL;
    -  }
    -  if (!qh BESToutside) {  /* matches conditional for qh_partitionpoint below */
    -    distoutside= qh_DISToutside; /* multiple of qh.MINoutside & qh.max_outside, see user.h */
    -    zval_(Ztotpartition)= qh num_points - qh hull_dim - 1; /*misses GOOD... */
    -    remaining= qh num_facets;
    -    point_end= numpoints;
    -    FORALLfacets {
    -      size= point_end/(remaining--) + 100;
    -      facet->outsideset= qh_setnew(size);
    -      bestpoint= NULL;
    -      point_end= 0;
    -      FOREACHpoint_i_(pointset) {
    -        if (point) {
    -          zzinc_(Zpartitionall);
    -          qh_distplane(point, facet, &dist);
    -          if (dist < distoutside)
    -            SETelem_(pointset, point_end++)= point;
    -          else {
    -            qh num_outside++;
    -            if (!bestpoint) {
    -              bestpoint= point;
    -              bestdist= dist;
    -            }else if (dist > bestdist) {
    -              qh_setappend(&facet->outsideset, bestpoint);
    -              bestpoint= point;
    -              bestdist= dist;
    -            }else
    -              qh_setappend(&facet->outsideset, point);
    -          }
    -        }
    -      }
    -      if (bestpoint) {
    -        qh_setappend(&facet->outsideset, bestpoint);
    -#if !qh_COMPUTEfurthest
    -        facet->furthestdist= bestdist;
    -#endif
    -      }else
    -        qh_setfree(&facet->outsideset);
    -      qh_settruncate(pointset, point_end);
    -    }
    -  }
    -  /* if !qh BESToutside, pointset contains points not assigned to outsideset */
    -  if (qh BESToutside || qh MERGING || qh KEEPcoplanar || qh KEEPinside) {
    -    qh findbestnew= True;
    -    FOREACHpoint_i_(pointset) {
    -      if (point)
    -        qh_partitionpoint(point, qh facet_list);
    -    }
    -    qh findbestnew= False;
    -  }
    -  zzadd_(Zpartitionall, zzval_(Zpartition));
    -  zzval_(Zpartition)= 0;
    -  qh_settempfree(&pointset);
    -  if (qh IStracing >= 4)
    -    qh_printfacetlist(qh facet_list, NULL, True);
    -} /* partitionall */
    -
    -
    -/*---------------------------------
    -
    -  qh_partitioncoplanar( point, facet, dist )
    -    partition coplanar point to a facet
    -    dist is distance from point to facet
    -    if dist NULL,
    -      searches for bestfacet and does nothing if inside
    -    if qh.findbestnew set,
    -      searches new facets instead of using qh_findbest()
    -
    -  returns:
    -    qh.max_ouside updated
    -    if qh.KEEPcoplanar or qh.KEEPinside
    -      point assigned to best coplanarset
    -
    -  notes:
    -    facet->maxoutside is updated at end by qh_check_maxout
    -
    -  design:
    -    if dist undefined
    -      find best facet for point
    -      if point sufficiently below facet (depends on qh.NEARinside and qh.KEEPinside)
    -        exit
    -    if keeping coplanar/nearinside/inside points
    -      if point is above furthest coplanar point
    -        append point to coplanar set (it is the new furthest)
    -        update qh.max_outside
    -      else
    -        append point one before end of coplanar set
    -    else if point is clearly outside of qh.max_outside and bestfacet->coplanarset
    -    and bestfacet is more than perpendicular to facet
    -      repartition the point using qh_findbest() -- it may be put on an outsideset
    -    else
    -      update qh.max_outside
    -*/
    -void qh_partitioncoplanar(pointT *point, facetT *facet, realT *dist) {
    -  facetT *bestfacet;
    -  pointT *oldfurthest;
    -  realT bestdist, dist2= 0, angle;
    -  int numpart= 0, oldfindbest;
    -  boolT isoutside;
    -
    -  qh WAScoplanar= True;
    -  if (!dist) {
    -    if (qh findbestnew)
    -      bestfacet= qh_findbestnew(point, facet, &bestdist, qh_ALL, &isoutside, &numpart);
    -    else
    -      bestfacet= qh_findbest(point, facet, qh_ALL, !qh_ISnewfacets, qh DELAUNAY,
    -                          &bestdist, &isoutside, &numpart);
    -    zinc_(Ztotpartcoplanar);
    -    zzadd_(Zpartcoplanar, numpart);
    -    if (!qh DELAUNAY && !qh KEEPinside) { /*  for 'd', bestdist skips upperDelaunay facets */
    -      if (qh KEEPnearinside) {
    -        if (bestdist < -qh NEARinside) {
    -          zinc_(Zcoplanarinside);
    -          trace4((qh ferr, 4062, "qh_partitioncoplanar: point p%d is more than near-inside facet f%d dist %2.2g findbestnew %d\n",
    -                  qh_pointid(point), bestfacet->id, bestdist, qh findbestnew));
    -          return;
    -        }
    -      }else if (bestdist < -qh MAXcoplanar) {
    -          trace4((qh ferr, 4063, "qh_partitioncoplanar: point p%d is inside facet f%d dist %2.2g findbestnew %d\n",
    -                  qh_pointid(point), bestfacet->id, bestdist, qh findbestnew));
    -        zinc_(Zcoplanarinside);
    -        return;
    -      }
    -    }
    -  }else {
    -    bestfacet= facet;
    -    bestdist= *dist;
    -  }
    -  if (bestdist > qh max_outside) {
    -    if (!dist && facet != bestfacet) {
    -      zinc_(Zpartangle);
    -      angle= qh_getangle(facet->normal, bestfacet->normal);
    -      if (angle < 0) {
    -        /* typically due to deleted vertex and coplanar facets, e.g.,
    -             RBOX 1000 s Z1 G1e-13 t1001185205 | QHULL Tv */
    -        zinc_(Zpartflip);
    -        trace2((qh ferr, 2058, "qh_partitioncoplanar: repartition point p%d from f%d.  It is above flipped facet f%d dist %2.2g\n",
    -                qh_pointid(point), facet->id, bestfacet->id, bestdist));
    -        oldfindbest= qh findbestnew;
    -        qh findbestnew= False;
    -        qh_partitionpoint(point, bestfacet);
    -        qh findbestnew= oldfindbest;
    -        return;
    -      }
    -    }
    -    qh max_outside= bestdist;
    -    if (bestdist > qh TRACEdist) {
    -      qh_fprintf(qh ferr, 8122, "qh_partitioncoplanar: ====== p%d from f%d increases max_outside to %2.2g of f%d last p%d\n",
    -                     qh_pointid(point), facet->id, bestdist, bestfacet->id, qh furthest_id);
    -      qh_errprint("DISTANT", facet, bestfacet, NULL, NULL);
    -    }
    -  }
    -  if (qh KEEPcoplanar + qh KEEPinside + qh KEEPnearinside) {
    -    oldfurthest= (pointT*)qh_setlast(bestfacet->coplanarset);
    -    if (oldfurthest) {
    -      zinc_(Zcomputefurthest);
    -      qh_distplane(oldfurthest, bestfacet, &dist2);
    -    }
    -    if (!oldfurthest || dist2 < bestdist)
    -      qh_setappend(&bestfacet->coplanarset, point);
    -    else
    -      qh_setappend2ndlast(&bestfacet->coplanarset, point);
    -  }
    -  trace4((qh ferr, 4064, "qh_partitioncoplanar: point p%d is coplanar with facet f%d(or inside) dist %2.2g\n",
    -          qh_pointid(point), bestfacet->id, bestdist));
    -} /* partitioncoplanar */
    -
    -/*---------------------------------
    -
    -  qh_partitionpoint( point, facet )
    -    assigns point to an outside set, coplanar set, or inside set (i.e., dropt)
    -    if qh.findbestnew
    -      uses qh_findbestnew() to search all new facets
    -    else
    -      uses qh_findbest()
    -
    -  notes:
    -    after qh_distplane(), this and qh_findbest() are most expensive in 3-d
    -
    -  design:
    -    find best facet for point
    -      (either exhaustive search of new facets or directed search from facet)
    -    if qh.NARROWhull
    -      retain coplanar and nearinside points as outside points
    -    if point is outside bestfacet
    -      if point above furthest point for bestfacet
    -        append point to outside set (it becomes the new furthest)
    -        if outside set was empty
    -          move bestfacet to end of qh.facet_list (i.e., after qh.facet_next)
    -        update bestfacet->furthestdist
    -      else
    -        append point one before end of outside set
    -    else if point is coplanar to bestfacet
    -      if keeping coplanar points or need to update qh.max_outside
    -        partition coplanar point into bestfacet
    -    else if near-inside point
    -      partition as coplanar point into bestfacet
    -    else is an inside point
    -      if keeping inside points
    -        partition as coplanar point into bestfacet
    -*/
    -void qh_partitionpoint(pointT *point, facetT *facet) {
    -  realT bestdist;
    -  boolT isoutside;
    -  facetT *bestfacet;
    -  int numpart;
    -#if qh_COMPUTEfurthest
    -  realT dist;
    -#endif
    -
    -  if (qh findbestnew)
    -    bestfacet= qh_findbestnew(point, facet, &bestdist, qh BESToutside, &isoutside, &numpart);
    -  else
    -    bestfacet= qh_findbest(point, facet, qh BESToutside, qh_ISnewfacets, !qh_NOupper,
    -                          &bestdist, &isoutside, &numpart);
    -  zinc_(Ztotpartition);
    -  zzadd_(Zpartition, numpart);
    -  if (qh NARROWhull) {
    -    if (qh DELAUNAY && !isoutside && bestdist >= -qh MAXcoplanar)
    -      qh_precision("nearly incident point(narrow hull)");
    -    if (qh KEEPnearinside) {
    -      if (bestdist >= -qh NEARinside)
    -        isoutside= True;
    -    }else if (bestdist >= -qh MAXcoplanar)
    -      isoutside= True;
    -  }
    -
    -  if (isoutside) {
    -    if (!bestfacet->outsideset
    -    || !qh_setlast(bestfacet->outsideset)) {
    -      qh_setappend(&(bestfacet->outsideset), point);
    -      if (!bestfacet->newfacet) {
    -        qh_removefacet(bestfacet);  /* make sure it's after qh facet_next */
    -        qh_appendfacet(bestfacet);
    -      }
    -#if !qh_COMPUTEfurthest
    -      bestfacet->furthestdist= bestdist;
    -#endif
    -    }else {
    -#if qh_COMPUTEfurthest
    -      zinc_(Zcomputefurthest);
    -      qh_distplane(oldfurthest, bestfacet, &dist);
    -      if (dist < bestdist)
    -        qh_setappend(&(bestfacet->outsideset), point);
    -      else
    -        qh_setappend2ndlast(&(bestfacet->outsideset), point);
    -#else
    -      if (bestfacet->furthestdist < bestdist) {
    -        qh_setappend(&(bestfacet->outsideset), point);
    -        bestfacet->furthestdist= bestdist;
    -      }else
    -        qh_setappend2ndlast(&(bestfacet->outsideset), point);
    -#endif
    -    }
    -    qh num_outside++;
    -    trace4((qh ferr, 4065, "qh_partitionpoint: point p%d is outside facet f%d new? %d (or narrowhull)\n",
    -          qh_pointid(point), bestfacet->id, bestfacet->newfacet));
    -  }else if (qh DELAUNAY || bestdist >= -qh MAXcoplanar) { /* for 'd', bestdist skips upperDelaunay facets */
    -    zzinc_(Zcoplanarpart);
    -    if (qh DELAUNAY)
    -      qh_precision("nearly incident point");
    -    if ((qh KEEPcoplanar + qh KEEPnearinside) || bestdist > qh max_outside)
    -      qh_partitioncoplanar(point, bestfacet, &bestdist);
    -    else {
    -      trace4((qh ferr, 4066, "qh_partitionpoint: point p%d is coplanar to facet f%d (dropped)\n",
    -          qh_pointid(point), bestfacet->id));
    -    }
    -  }else if (qh KEEPnearinside && bestdist > -qh NEARinside) {
    -    zinc_(Zpartnear);
    -    qh_partitioncoplanar(point, bestfacet, &bestdist);
    -  }else {
    -    zinc_(Zpartinside);
    -    trace4((qh ferr, 4067, "qh_partitionpoint: point p%d is inside all facets, closest to f%d dist %2.2g\n",
    -          qh_pointid(point), bestfacet->id, bestdist));
    -    if (qh KEEPinside)
    -      qh_partitioncoplanar(point, bestfacet, &bestdist);
    -  }
    -} /* partitionpoint */
    -
    -/*---------------------------------
    -
    -  qh_partitionvisible( allpoints, numoutside )
    -    partitions points in visible facets to qh.newfacet_list
    -    qh.visible_list= visible facets
    -    for visible facets
    -      1st neighbor (if any) points to a horizon facet or a new facet
    -    if allpoints(!used),
    -      repartitions coplanar points
    -
    -  returns:
    -    updates outside sets and coplanar sets of qh.newfacet_list
    -    updates qh.num_outside (count of outside points)
    -
    -  notes:
    -    qh.findbest_notsharp should be clear (extra work if set)
    -
    -  design:
    -    for all visible facets with outside set or coplanar set
    -      select a newfacet for visible facet
    -      if outside set
    -        partition outside set into new facets
    -      if coplanar set and keeping coplanar/near-inside/inside points
    -        if allpoints
    -          partition coplanar set into new facets, may be assigned outside
    -        else
    -          partition coplanar set into coplanar sets of new facets
    -    for each deleted vertex
    -      if allpoints
    -        partition vertex into new facets, may be assigned outside
    -      else
    -        partition vertex into coplanar sets of new facets
    -*/
    -void qh_partitionvisible(/*qh.visible_list*/ boolT allpoints, int *numoutside) {
    -  facetT *visible, *newfacet;
    -  pointT *point, **pointp;
    -  int coplanar=0, size;
    -  unsigned count;
    -  vertexT *vertex, **vertexp;
    -
    -  if (qh ONLYmax)
    -    maximize_(qh MINoutside, qh max_vertex);
    -  *numoutside= 0;
    -  FORALLvisible_facets {
    -    if (!visible->outsideset && !visible->coplanarset)
    -      continue;
    -    newfacet= visible->f.replace;
    -    count= 0;
    -    while (newfacet && newfacet->visible) {
    -      newfacet= newfacet->f.replace;
    -      if (count++ > qh facet_id)
    -        qh_infiniteloop(visible);
    -    }
    -    if (!newfacet)
    -      newfacet= qh newfacet_list;
    -    if (newfacet == qh facet_tail) {
    -      qh_fprintf(qh ferr, 6170, "qhull precision error (qh_partitionvisible): all new facets deleted as\n        degenerate facets. Can not continue.\n");
    -      qh_errexit(qh_ERRprec, NULL, NULL);
    -    }
    -    if (visible->outsideset) {
    -      size= qh_setsize(visible->outsideset);
    -      *numoutside += size;
    -      qh num_outside -= size;
    -      FOREACHpoint_(visible->outsideset)
    -        qh_partitionpoint(point, newfacet);
    -    }
    -    if (visible->coplanarset && (qh KEEPcoplanar + qh KEEPinside + qh KEEPnearinside)) {
    -      size= qh_setsize(visible->coplanarset);
    -      coplanar += size;
    -      FOREACHpoint_(visible->coplanarset) {
    -        if (allpoints) /* not used */
    -          qh_partitionpoint(point, newfacet);
    -        else
    -          qh_partitioncoplanar(point, newfacet, NULL);
    -      }
    -    }
    -  }
    -  FOREACHvertex_(qh del_vertices) {
    -    if (vertex->point) {
    -      if (allpoints) /* not used */
    -        qh_partitionpoint(vertex->point, qh newfacet_list);
    -      else
    -        qh_partitioncoplanar(vertex->point, qh newfacet_list, NULL);
    -    }
    -  }
    -  trace1((qh ferr, 1043,"qh_partitionvisible: partitioned %d points from outsidesets and %d points from coplanarsets\n", *numoutside, coplanar));
    -} /* partitionvisible */
    -
    -
    -
    -/*---------------------------------
    -
    -  qh_precision( reason )
    -    restart on precision errors if not merging and if 'QJn'
    -*/
    -void qh_precision(const char *reason) {
    -
    -  if (qh ALLOWrestart && !qh PREmerge && !qh MERGEexact) {
    -    if (qh JOGGLEmax < REALmax/2) {
    -      trace0((qh ferr, 26, "qh_precision: qhull restart because of %s\n", reason));
    -      /* May be called repeatedly if qh->ALLOWrestart */
    -      longjmp(qh restartexit, qh_ERRprec);
    -    }
    -  }
    -} /* qh_precision */
    -
    -/*---------------------------------
    -
    -  qh_printsummary( fp )
    -    prints summary to fp
    -
    -  notes:
    -    not in io.c so that user_eg.c can prevent io.c from loading
    -    qh_printsummary and qh_countfacets must match counts
    -
    -  design:
    -    determine number of points, vertices, and coplanar points
    -    print summary
    -*/
    -void qh_printsummary(FILE *fp) {
    -  realT ratio, outerplane, innerplane;
    -  float cpu;
    -  int size, id, nummerged, numvertices, numcoplanars= 0, nonsimplicial=0;
    -  int goodused;
    -  facetT *facet;
    -  const char *s;
    -  int numdel= zzval_(Zdelvertextot);
    -  int numtricoplanars= 0;
    -
    -  size= qh num_points + qh_setsize(qh other_points);
    -  numvertices= qh num_vertices - qh_setsize(qh del_vertices);
    -  id= qh_pointid(qh GOODpointp);
    -  FORALLfacets {
    -    if (facet->coplanarset)
    -      numcoplanars += qh_setsize( facet->coplanarset);
    -    if (facet->good) {
    -      if (facet->simplicial) {
    -        if (facet->keepcentrum && facet->tricoplanar)
    -          numtricoplanars++;
    -      }else if (qh_setsize(facet->vertices) != qh hull_dim)
    -        nonsimplicial++;
    -    }
    -  }
    -  if (id >=0 && qh STOPcone-1 != id && -qh STOPpoint-1 != id)
    -    size--;
    -  if (qh STOPcone || qh STOPpoint)
    -      qh_fprintf(fp, 9288, "\nAt a premature exit due to 'TVn', 'TCn', 'TRn', or precision error with 'QJn'.");
    -  if (qh UPPERdelaunay)
    -    goodused= qh GOODvertex + qh GOODpoint + qh SPLITthresholds;
    -  else if (qh DELAUNAY)
    -    goodused= qh GOODvertex + qh GOODpoint + qh GOODthreshold;
    -  else
    -    goodused= qh num_good;
    -  nummerged= zzval_(Ztotmerge) - zzval_(Zcyclehorizon) + zzval_(Zcyclefacettot);
    -  if (qh VORONOI) {
    -    if (qh UPPERdelaunay)
    -      qh_fprintf(fp, 9289, "\n\
    -Furthest-site Voronoi vertices by the convex hull of %d points in %d-d:\n\n", size, qh hull_dim);
    -    else
    -      qh_fprintf(fp, 9290, "\n\
    -Voronoi diagram by the convex hull of %d points in %d-d:\n\n", size, qh hull_dim);
    -    qh_fprintf(fp, 9291, "  Number of Voronoi regions%s: %d\n",
    -              qh ATinfinity ? " and at-infinity" : "", numvertices);
    -    if (numdel)
    -      qh_fprintf(fp, 9292, "  Total number of deleted points due to merging: %d\n", numdel);
    -    if (numcoplanars - numdel > 0)
    -      qh_fprintf(fp, 9293, "  Number of nearly incident points: %d\n", numcoplanars - numdel);
    -    else if (size - numvertices - numdel > 0)
    -      qh_fprintf(fp, 9294, "  Total number of nearly incident points: %d\n", size - numvertices - numdel);
    -    qh_fprintf(fp, 9295, "  Number of%s Voronoi vertices: %d\n",
    -              goodused ? " 'good'" : "", qh num_good);
    -    if (nonsimplicial)
    -      qh_fprintf(fp, 9296, "  Number of%s non-simplicial Voronoi vertices: %d\n",
    -              goodused ? " 'good'" : "", nonsimplicial);
    -  }else if (qh DELAUNAY) {
    -    if (qh UPPERdelaunay)
    -      qh_fprintf(fp, 9297, "\n\
    -Furthest-site Delaunay triangulation by the convex hull of %d points in %d-d:\n\n", size, qh hull_dim);
    -    else
    -      qh_fprintf(fp, 9298, "\n\
    -Delaunay triangulation by the convex hull of %d points in %d-d:\n\n", size, qh hull_dim);
    -    qh_fprintf(fp, 9299, "  Number of input sites%s: %d\n",
    -              qh ATinfinity ? " and at-infinity" : "", numvertices);
    -    if (numdel)
    -      qh_fprintf(fp, 9300, "  Total number of deleted points due to merging: %d\n", numdel);
    -    if (numcoplanars - numdel > 0)
    -      qh_fprintf(fp, 9301, "  Number of nearly incident points: %d\n", numcoplanars - numdel);
    -    else if (size - numvertices - numdel > 0)
    -      qh_fprintf(fp, 9302, "  Total number of nearly incident points: %d\n", size - numvertices - numdel);
    -    qh_fprintf(fp, 9303, "  Number of%s Delaunay regions: %d\n",
    -              goodused ? " 'good'" : "", qh num_good);
    -    if (nonsimplicial)
    -      qh_fprintf(fp, 9304, "  Number of%s non-simplicial Delaunay regions: %d\n",
    -              goodused ? " 'good'" : "", nonsimplicial);
    -  }else if (qh HALFspace) {
    -    qh_fprintf(fp, 9305, "\n\
    -Halfspace intersection by the convex hull of %d points in %d-d:\n\n", size, qh hull_dim);
    -    qh_fprintf(fp, 9306, "  Number of halfspaces: %d\n", size);
    -    qh_fprintf(fp, 9307, "  Number of non-redundant halfspaces: %d\n", numvertices);
    -    if (numcoplanars) {
    -      if (qh KEEPinside && qh KEEPcoplanar)
    -        s= "similar and redundant";
    -      else if (qh KEEPinside)
    -        s= "redundant";
    -      else
    -        s= "similar";
    -      qh_fprintf(fp, 9308, "  Number of %s halfspaces: %d\n", s, numcoplanars);
    -    }
    -    qh_fprintf(fp, 9309, "  Number of intersection points: %d\n", qh num_facets - qh num_visible);
    -    if (goodused)
    -      qh_fprintf(fp, 9310, "  Number of 'good' intersection points: %d\n", qh num_good);
    -    if (nonsimplicial)
    -      qh_fprintf(fp, 9311, "  Number of%s non-simplicial intersection points: %d\n",
    -              goodused ? " 'good'" : "", nonsimplicial);
    -  }else {
    -    qh_fprintf(fp, 9312, "\n\
    -Convex hull of %d points in %d-d:\n\n", size, qh hull_dim);
    -    qh_fprintf(fp, 9313, "  Number of vertices: %d\n", numvertices);
    -    if (numcoplanars) {
    -      if (qh KEEPinside && qh KEEPcoplanar)
    -        s= "coplanar and interior";
    -      else if (qh KEEPinside)
    -        s= "interior";
    -      else
    -        s= "coplanar";
    -      qh_fprintf(fp, 9314, "  Number of %s points: %d\n", s, numcoplanars);
    -    }
    -    qh_fprintf(fp, 9315, "  Number of facets: %d\n", qh num_facets - qh num_visible);
    -    if (goodused)
    -      qh_fprintf(fp, 9316, "  Number of 'good' facets: %d\n", qh num_good);
    -    if (nonsimplicial)
    -      qh_fprintf(fp, 9317, "  Number of%s non-simplicial facets: %d\n",
    -              goodused ? " 'good'" : "", nonsimplicial);
    -  }
    -  if (numtricoplanars)
    -      qh_fprintf(fp, 9318, "  Number of triangulated facets: %d\n", numtricoplanars);
    -  qh_fprintf(fp, 9319, "\nStatistics for: %s | %s",
    -                      qh rbox_command, qh qhull_command);
    -  if (qh ROTATErandom != INT_MIN)
    -    qh_fprintf(fp, 9320, " QR%d\n\n", qh ROTATErandom);
    -  else
    -    qh_fprintf(fp, 9321, "\n\n");
    -  qh_fprintf(fp, 9322, "  Number of points processed: %d\n", zzval_(Zprocessed));
    -  qh_fprintf(fp, 9323, "  Number of hyperplanes created: %d\n", zzval_(Zsetplane));
    -  if (qh DELAUNAY)
    -    qh_fprintf(fp, 9324, "  Number of facets in hull: %d\n", qh num_facets - qh num_visible);
    -  qh_fprintf(fp, 9325, "  Number of distance tests for qhull: %d\n", zzval_(Zpartition)+
    -      zzval_(Zpartitionall)+zzval_(Znumvisibility)+zzval_(Zpartcoplanar));
    -#if 0  /* NOTE: must print before printstatistics() */
    -  {realT stddev, ave;
    -  qh_fprintf(fp, 9326, "  average new facet balance: %2.2g\n",
    -          wval_(Wnewbalance)/zval_(Zprocessed));
    -  stddev= qh_stddev(zval_(Zprocessed), wval_(Wnewbalance),
    -                                 wval_(Wnewbalance2), &ave);
    -  qh_fprintf(fp, 9327, "  new facet standard deviation: %2.2g\n", stddev);
    -  qh_fprintf(fp, 9328, "  average partition balance: %2.2g\n",
    -          wval_(Wpbalance)/zval_(Zpbalance));
    -  stddev= qh_stddev(zval_(Zpbalance), wval_(Wpbalance),
    -                                 wval_(Wpbalance2), &ave);
    -  qh_fprintf(fp, 9329, "  partition standard deviation: %2.2g\n", stddev);
    -  }
    -#endif
    -  if (nummerged) {
    -    qh_fprintf(fp, 9330,"  Number of distance tests for merging: %d\n",zzval_(Zbestdist)+
    -          zzval_(Zcentrumtests)+zzval_(Zdistconvex)+zzval_(Zdistcheck)+
    -          zzval_(Zdistzero));
    -    qh_fprintf(fp, 9331,"  Number of distance tests for checking: %d\n",zzval_(Zcheckpart));
    -    qh_fprintf(fp, 9332,"  Number of merged facets: %d\n", nummerged);
    -  }
    -  if (!qh RANDOMoutside && qh QHULLfinished) {
    -    cpu= (float)qh hulltime;
    -    cpu /= (float)qh_SECticks;
    -    wval_(Wcpu)= cpu;
    -    qh_fprintf(fp, 9333, "  CPU seconds to compute hull (after input): %2.4g\n", cpu);
    -  }
    -  if (qh RERUN) {
    -    if (!qh PREmerge && !qh MERGEexact)
    -      qh_fprintf(fp, 9334, "  Percentage of runs with precision errors: %4.1f\n",
    -           zzval_(Zretry)*100.0/qh build_cnt);  /* careful of order */
    -  }else if (qh JOGGLEmax < REALmax/2) {
    -    if (zzval_(Zretry))
    -      qh_fprintf(fp, 9335, "  After %d retries, input joggled by: %2.2g\n",
    -         zzval_(Zretry), qh JOGGLEmax);
    -    else
    -      qh_fprintf(fp, 9336, "  Input joggled by: %2.2g\n", qh JOGGLEmax);
    -  }
    -  if (qh totarea != 0.0)
    -    qh_fprintf(fp, 9337, "  %s facet area:   %2.8g\n",
    -            zzval_(Ztotmerge) ? "Approximate" : "Total", qh totarea);
    -  if (qh totvol != 0.0)
    -    qh_fprintf(fp, 9338, "  %s volume:       %2.8g\n",
    -            zzval_(Ztotmerge) ? "Approximate" : "Total", qh totvol);
    -  if (qh MERGING) {
    -    qh_outerinner(NULL, &outerplane, &innerplane);
    -    if (outerplane > 2 * qh DISTround) {
    -      qh_fprintf(fp, 9339, "  Maximum distance of %spoint above facet: %2.2g",
    -            (qh QHULLfinished ? "" : "merged "), outerplane);
    -      ratio= outerplane/(qh ONEmerge + qh DISTround);
    -      /* don't report ratio if MINoutside is large */
    -      if (ratio > 0.05 && 2* qh ONEmerge > qh MINoutside && qh JOGGLEmax > REALmax/2)
    -        qh_fprintf(fp, 9340, " (%.1fx)\n", ratio);
    -      else
    -        qh_fprintf(fp, 9341, "\n");
    -    }
    -    if (innerplane < -2 * qh DISTround) {
    -      qh_fprintf(fp, 9342, "  Maximum distance of %svertex below facet: %2.2g",
    -            (qh QHULLfinished ? "" : "merged "), innerplane);
    -      ratio= -innerplane/(qh ONEmerge+qh DISTround);
    -      if (ratio > 0.05 && qh JOGGLEmax > REALmax/2)
    -        qh_fprintf(fp, 9343, " (%.1fx)\n", ratio);
    -      else
    -        qh_fprintf(fp, 9344, "\n");
    -    }
    -  }
    -  qh_fprintf(fp, 9345, "\n");
    -} /* printsummary */
    -
    -
    diff --git a/src/qhull/src/libqhull/libqhull.h b/src/qhull/src/libqhull/libqhull.h
    deleted file mode 100644
    index 677085808d5..00000000000
    --- a/src/qhull/src/libqhull/libqhull.h
    +++ /dev/null
    @@ -1,1140 +0,0 @@
    -/*
      ---------------------------------
    -
    -   libqhull.h
    -   user-level header file for using qhull.a library
    -
    -   see qh-qhull.htm, qhull_a.h
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull/libqhull.h#7 $$Change: 2066 $
    -   $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    -
    -   NOTE: access to qh_qh is via the 'qh' macro.  This allows
    -   qh_qh to be either a pointer or a structure.  An example
    -   of using qh is "qh.DROPdim" which accesses the DROPdim
    -   field of qh_qh.  Similarly, access to qh_qhstat is via
    -   the 'qhstat' macro.
    -
    -   includes function prototypes for libqhull.c, geom.c, global.c, io.c, user.c
    -
    -   use mem.h for mem.c
    -   use qset.h for qset.c
    -
    -   see unix.c for an example of using libqhull.h
    -
    -   recompile qhull if you change this file
    -*/
    -
    -#ifndef qhDEFlibqhull
    -#define qhDEFlibqhull 1
    -
    -/*=========================== -included files ==============*/
    -
    -/* user_r.h first for QHULL_CRTDBG */
    -#include "user.h"      /* user definable constants (e.g., qh_QHpointer) */
    -
    -#include "mem.h"   /* Needed qhT in libqhull_r.h.  Here for compatibility */
    -#include "qset.h"   /* Needed for QHULL_LIB_CHECK */
    -/* include stat_r.h after defining boolT.  Needed for qhT in libqhull_r.h.  Here for compatibility and statT */
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#if __MWERKS__ && __POWERPC__
    -#include  
    -#include  
    -#include        
    -#endif
    -
    -#ifndef __STDC__
    -#ifndef __cplusplus
    -#if     !_MSC_VER
    -#error  Neither __STDC__ nor __cplusplus is defined.  Please use strict ANSI C or C++ to compile
    -#error  Qhull.  You may need to turn off compiler extensions in your project configuration.  If
    -#error  your compiler is a standard C compiler, you can delete this warning from libqhull.h
    -#endif
    -#endif
    -#endif
    -
    -/*============ constants and basic types ====================*/
    -
    -extern const char qh_version[]; /* defined in global.c */
    -extern const char qh_version2[]; /* defined in global.c */
    -
    -/*----------------------------------
    -
    -  coordT
    -    coordinates and coefficients are stored as realT (i.e., double)
    -
    -  notes:
    -    Qhull works well if realT is 'float'.  If so joggle (QJ) is not effective.
    -
    -    Could use 'float' for data and 'double' for calculations (realT vs. coordT)
    -      This requires many type casts, and adjusted error bounds.
    -      Also C compilers may do expressions in double anyway.
    -*/
    -#define coordT realT
    -
    -/*----------------------------------
    -
    -  pointT
    -    a point is an array of coordinates, usually qh.hull_dim
    -    qh_pointid returns
    -      qh_IDnone if point==0 or qh is undefined
    -      qh_IDinterior for qh.interior_point
    -      qh_IDunknown if point is neither in qh.first_point... nor qh.other_points
    -
    -  notes:
    -    qh.STOPcone and qh.STOPpoint assume that qh_IDunknown==-1 (other negative numbers indicate points)
    -    qh_IDunknown is also returned by getid_() for unknown facet, ridge, or vertex
    -*/
    -#define pointT coordT
    -typedef enum
    -{
    -    qh_IDnone = -3, qh_IDinterior = -2, qh_IDunknown = -1
    -}
    -qh_pointT;
    -
    -/*----------------------------------
    -
    -  flagT
    -    Boolean flag as a bit
    -*/
    -#define flagT unsigned int
    -
    -/*----------------------------------
    -
    -  boolT
    -    boolean value, either True or False
    -
    -  notes:
    -    needed for portability
    -    Use qh_False/qh_True as synonyms
    -*/
    -#define boolT unsigned int
    -#ifdef False
    -#undef False
    -#endif
    -#ifdef True
    -#undef True
    -#endif
    -#define False 0
    -#define True 1
    -#define qh_False 0
    -#define qh_True 1
    -
    -#include "stat.h"  /* after define of boolT */
    -
    -/*----------------------------------
    -
    -  qh_CENTER
    -    to distinguish facet->center
    -*/
    -typedef enum
    -{
    -    qh_ASnone = 0,   /* If not MERGING and not VORONOI */
    -    qh_ASvoronoi,    /* Set by qh_clearcenters on qh_prepare_output, or if not MERGING and VORONOI */
    -    qh_AScentrum     /* If MERGING (assumed during merging) */
    -}
    -qh_CENTER;
    -
    -/*----------------------------------
    -
    -  qh_PRINT
    -    output formats for printing (qh.PRINTout).
    -    'Fa' 'FV' 'Fc' 'FC'
    -
    -
    -   notes:
    -   some of these names are similar to qhT names.  The similar names are only
    -   used in switch statements in qh_printbegin() etc.
    -*/
    -typedef enum {qh_PRINTnone= 0,
    -  qh_PRINTarea, qh_PRINTaverage,           /* 'Fa' 'FV' 'Fc' 'FC' */
    -  qh_PRINTcoplanars, qh_PRINTcentrums,
    -  qh_PRINTfacets, qh_PRINTfacets_xridge,   /* 'f' 'FF' 'G' 'FI' 'Fi' 'Fn' */
    -  qh_PRINTgeom, qh_PRINTids, qh_PRINTinner, qh_PRINTneighbors,
    -  qh_PRINTnormals, qh_PRINTouter, qh_PRINTmaple, /* 'n' 'Fo' 'i' 'm' 'Fm' 'FM', 'o' */
    -  qh_PRINTincidences, qh_PRINTmathematica, qh_PRINTmerges, qh_PRINToff,
    -  qh_PRINToptions, qh_PRINTpointintersect, /* 'FO' 'Fp' 'FP' 'p' 'FQ' 'FS' */
    -  qh_PRINTpointnearest, qh_PRINTpoints, qh_PRINTqhull, qh_PRINTsize,
    -  qh_PRINTsummary, qh_PRINTtriangles,      /* 'Fs' 'Ft' 'Fv' 'FN' 'Fx' */
    -  qh_PRINTvertices, qh_PRINTvneighbors, qh_PRINTextremes,
    -  qh_PRINTEND} qh_PRINT;
    -
    -/*----------------------------------
    -
    -  qh_ALL
    -    argument flag for selecting everything
    -*/
    -#define qh_ALL      True
    -#define qh_NOupper  True     /* argument for qh_findbest */
    -#define qh_IScheckmax  True     /* argument for qh_findbesthorizon */
    -#define qh_ISnewfacets  True     /* argument for qh_findbest */
    -#define qh_RESETvisible  True     /* argument for qh_resetlists */
    -
    -/*----------------------------------
    -
    -  qh_ERR
    -    Qhull exit codes, for indicating errors
    -    See: MSG_ERROR and MSG_WARNING [user.h]
    -*/
    -#define qh_ERRnone  0    /* no error occurred during qhull */
    -#define qh_ERRinput 1    /* input inconsistency */
    -#define qh_ERRsingular 2 /* singular input data */
    -#define qh_ERRprec  3    /* precision error */
    -#define qh_ERRmem   4    /* insufficient memory, matches mem.h */
    -#define qh_ERRqhull 5    /* internal error detected, matches mem.h */
    -
    -/*----------------------------------
    -
    -qh_FILEstderr
    -Fake stderr to distinguish error output from normal output
    -For C++ interface.  Must redefine qh_fprintf_qhull
    -*/
    -#define qh_FILEstderr ((FILE*)1)
    -
    -/* ============ -structures- ====================
    -   each of the following structures is defined by a typedef
    -   all realT and coordT fields occur at the beginning of a structure
    -        (otherwise space may be wasted due to alignment)
    -   define all flags together and pack into 32-bit number
    -   DEFsetT is likewise defined in
    -   mem.h and qset.h
    -*/
    -
    -typedef struct vertexT vertexT;
    -typedef struct ridgeT ridgeT;
    -typedef struct facetT facetT;
    -#ifndef DEFsetT
    -#define DEFsetT 1
    -typedef struct setT setT;          /* defined in qset.h */
    -#endif
    -
    -/*----------------------------------
    -
    -  facetT
    -    defines a facet
    -
    -  notes:
    -   qhull() generates the hull as a list of facets.
    -
    -  topological information:
    -    f.previous,next     doubly-linked list of facets
    -    f.vertices          set of vertices
    -    f.ridges            set of ridges
    -    f.neighbors         set of neighbors
    -    f.toporient         True if facet has top-orientation (else bottom)
    -
    -  geometric information:
    -    f.offset,normal     hyperplane equation
    -    f.maxoutside        offset to outer plane -- all points inside
    -    f.center            centrum for testing convexity
    -    f.simplicial        True if facet is simplicial
    -    f.flipped           True if facet does not include qh.interior_point
    -
    -  for constructing hull:
    -    f.visible           True if facet on list of visible facets (will be deleted)
    -    f.newfacet          True if facet on list of newly created facets
    -    f.coplanarset       set of points coplanar with this facet
    -                        (includes near-inside points for later testing)
    -    f.outsideset        set of points outside of this facet
    -    f.furthestdist      distance to furthest point of outside set
    -    f.visitid           marks visited facets during a loop
    -    f.replace           replacement facet for to-be-deleted, visible facets
    -    f.samecycle,newcycle cycle of facets for merging into horizon facet
    -
    -  see below for other flags and fields
    -*/
    -struct facetT {
    -#if !qh_COMPUTEfurthest
    -  coordT   furthestdist;/* distance to furthest point of outsideset */
    -#endif
    -#if qh_MAXoutside
    -  coordT   maxoutside;  /* max computed distance of point to facet
    -                        Before QHULLfinished this is an approximation
    -                        since maxdist not always set for mergefacet
    -                        Actual outer plane is +DISTround and
    -                        computed outer plane is +2*DISTround */
    -#endif
    -  coordT   offset;      /* exact offset of hyperplane from origin */
    -  coordT  *normal;      /* normal of hyperplane, hull_dim coefficients */
    -                        /*   if tricoplanar, shared with a neighbor */
    -  union {               /* in order of testing */
    -   realT   area;        /* area of facet, only in io.c if  ->isarea */
    -   facetT *replace;     /*  replacement facet if ->visible and NEWfacets
    -                             is NULL only if qh_mergedegen_redundant or interior */
    -   facetT *samecycle;   /*  cycle of facets from the same visible/horizon intersection,
    -                             if ->newfacet */
    -   facetT *newcycle;    /*  in horizon facet, current samecycle of new facets */
    -   facetT *trivisible;  /* visible facet for ->tricoplanar facets during qh_triangulate() */
    -   facetT *triowner;    /* owner facet for ->tricoplanar, !isarea facets w/ ->keepcentrum */
    -  }f;
    -  coordT  *center;      /* set according to qh.CENTERtype */
    -                        /*   qh_ASnone:    no center (not MERGING) */
    -                        /*   qh_AScentrum: centrum for testing convexity (qh_getcentrum) */
    -                        /*                 assumed qh_AScentrum while merging */
    -                        /*   qh_ASvoronoi: Voronoi center (qh_facetcenter) */
    -                        /* after constructing the hull, it may be changed (qh_clearcenter) */
    -                        /* if tricoplanar and !keepcentrum, shared with a neighbor */
    -  facetT  *previous;    /* previous facet in the facet_list */
    -  facetT  *next;        /* next facet in the facet_list */
    -  setT    *vertices;    /* vertices for this facet, inverse sorted by ID
    -                           if simplicial, 1st vertex was apex/furthest */
    -  setT    *ridges;      /* explicit ridges for nonsimplicial facets.
    -                           for simplicial facets, neighbors define the ridges */
    -  setT    *neighbors;   /* neighbors of the facet.  If simplicial, the kth
    -                           neighbor is opposite the kth vertex, and the first
    -                           neighbor is the horizon facet for the first vertex*/
    -  setT    *outsideset;  /* set of points outside this facet
    -                           if non-empty, last point is furthest
    -                           if NARROWhull, includes coplanars for partitioning*/
    -  setT    *coplanarset; /* set of points coplanar with this facet
    -                           > qh.min_vertex and <= facet->max_outside
    -                           a point is assigned to the furthest facet
    -                           if non-empty, last point is furthest away */
    -  unsigned visitid;     /* visit_id, for visiting all neighbors,
    -                           all uses are independent */
    -  unsigned id;          /* unique identifier from qh.facet_id */
    -  unsigned nummerge:9;  /* number of merges */
    -#define qh_MAXnummerge 511 /*     2^9-1, 32 flags total, see "flags:" in io.c */
    -  flagT    tricoplanar:1; /* True if TRIangulate and simplicial and coplanar with a neighbor */
    -                          /*   all tricoplanars share the same apex */
    -                          /*   all tricoplanars share the same ->center, ->normal, ->offset, ->maxoutside */
    -                          /*     ->keepcentrum is true for the owner.  It has the ->coplanareset */
    -                          /*   if ->degenerate, does not span facet (one logical ridge) */
    -                          /*   during qh_triangulate, f.trivisible points to original facet */
    -  flagT    newfacet:1;  /* True if facet on qh.newfacet_list (new or merged) */
    -  flagT    visible:1;   /* True if visible facet (will be deleted) */
    -  flagT    toporient:1; /* True if created with top orientation
    -                           after merging, use ridge orientation */
    -  flagT    simplicial:1;/* True if simplicial facet, ->ridges may be implicit */
    -  flagT    seen:1;      /* used to perform operations only once, like visitid */
    -  flagT    seen2:1;     /* used to perform operations only once, like visitid */
    -  flagT    flipped:1;   /* True if facet is flipped */
    -  flagT    upperdelaunay:1; /* True if facet is upper envelope of Delaunay triangulation */
    -  flagT    notfurthest:1; /* True if last point of outsideset is not furthest*/
    -
    -/*-------- flags primarily for output ---------*/
    -  flagT    good:1;      /* True if a facet marked good for output */
    -  flagT    isarea:1;    /* True if facet->f.area is defined */
    -
    -/*-------- flags for merging ------------------*/
    -  flagT    dupridge:1;  /* True if duplicate ridge in facet */
    -  flagT    mergeridge:1; /* True if facet or neighbor contains a qh_MERGEridge
    -                            ->normal defined (also defined for mergeridge2) */
    -  flagT    mergeridge2:1; /* True if neighbor contains a qh_MERGEridge (mark_dupridges */
    -  flagT    coplanar:1;  /* True if horizon facet is coplanar at last use */
    -  flagT     mergehorizon:1; /* True if will merge into horizon (->coplanar) */
    -  flagT     cycledone:1;/* True if mergecycle_all already done */
    -  flagT    tested:1;    /* True if facet convexity has been tested (false after merge */
    -  flagT    keepcentrum:1; /* True if keep old centrum after a merge, or marks owner for ->tricoplanar */
    -  flagT    newmerge:1;  /* True if facet is newly merged for reducevertices */
    -  flagT    degenerate:1; /* True if facet is degenerate (degen_mergeset or ->tricoplanar) */
    -  flagT    redundant:1;  /* True if facet is redundant (degen_mergeset) */
    -};
    -
    -
    -/*----------------------------------
    -
    -  ridgeT
    -    defines a ridge
    -
    -  notes:
    -  a ridge is hull_dim-1 simplex between two neighboring facets.  If the
    -  facets are non-simplicial, there may be more than one ridge between
    -  two facets.  E.G. a 4-d hypercube has two triangles between each pair
    -  of neighboring facets.
    -
    -  topological information:
    -    vertices            a set of vertices
    -    top,bottom          neighboring facets with orientation
    -
    -  geometric information:
    -    tested              True if ridge is clearly convex
    -    nonconvex           True if ridge is non-convex
    -*/
    -struct ridgeT {
    -  setT    *vertices;    /* vertices belonging to this ridge, inverse sorted by ID
    -                           NULL if a degen ridge (matchsame) */
    -  facetT  *top;         /* top facet this ridge is part of */
    -  facetT  *bottom;      /* bottom facet this ridge is part of */
    -  unsigned id;          /* unique identifier.  Same size as vertex_id and ridge_id */
    -  flagT    seen:1;      /* used to perform operations only once */
    -  flagT    tested:1;    /* True when ridge is tested for convexity */
    -  flagT    nonconvex:1; /* True if getmergeset detected a non-convex neighbor
    -                           only one ridge between neighbors may have nonconvex */
    -};
    -
    -/*----------------------------------
    -
    -  vertexT
    -     defines a vertex
    -
    -  topological information:
    -    next,previous       doubly-linked list of all vertices
    -    neighbors           set of adjacent facets (only if qh.VERTEXneighbors)
    -
    -  geometric information:
    -    point               array of DIM3 coordinates
    -*/
    -struct vertexT {
    -  vertexT *next;        /* next vertex in vertex_list */
    -  vertexT *previous;    /* previous vertex in vertex_list */
    -  pointT  *point;       /* hull_dim coordinates (coordT) */
    -  setT    *neighbors;   /* neighboring facets of vertex, qh_vertexneighbors()
    -                           inits in io.c or after first merge */
    -  unsigned id;          /* unique identifier.  Same size as qh.vertex_id and qh.ridge_id */
    -  unsigned visitid;     /* for use with qh.vertex_visit, size must match */
    -  flagT    seen:1;      /* used to perform operations only once */
    -  flagT    seen2:1;     /* another seen flag */
    -  flagT    delridge:1;  /* vertex was part of a deleted ridge */
    -  flagT    deleted:1;   /* true if vertex on qh.del_vertices */
    -  flagT    newlist:1;   /* true if vertex on qh.newvertex_list */
    -};
    -
    -/*======= -global variables -qh ============================*/
    -
    -/*----------------------------------
    -
    -  qh
    -   all global variables for qhull are in qh, qhmem, and qhstat
    -
    -  notes:
    -   qhmem is defined in mem.h, qhstat is defined in stat.h, qhrbox is defined in rboxpoints.h
    -   Access to qh_qh is via the "qh" macro.  See qh_QHpointer in user.h
    -
    -   All global variables for qhull are in qh, qhmem, and qhstat
    -   qh must be unique for each instance of qhull
    -   qhstat may be shared between qhull instances.
    -   qhmem may be shared across multiple instances of Qhull.
    -   Rbox uses global variables rbox_inuse and rbox, but does not persist data across calls.
    -
    -   Qhull is not multi-threaded.  Global state could be stored in thread-local storage.
    -
    -   QHULL_LIB_CHECK checks that a program and the corresponding
    -   qhull library were built with the same type of header files.
    -*/
    -
    -typedef struct qhT qhT;
    -
    -#define QHULL_NON_REENTRANT 0
    -#define QHULL_QH_POINTER 1
    -#define QHULL_REENTRANT 2
    -
    -#if qh_QHpointer_dllimport
    -#define qh qh_qh->
    -__declspec(dllimport) extern qhT *qh_qh;     /* allocated in global.c */
    -#define QHULL_LIB_TYPE QHULL_QH_POINTER
    -
    -#elif qh_QHpointer
    -#define qh qh_qh->
    -extern qhT *qh_qh;     /* allocated in global.c */
    -#define QHULL_LIB_TYPE QHULL_QH_POINTER
    -
    -#elif qh_dllimport
    -#define qh qh_qh.
    -__declspec(dllimport) extern qhT qh_qh;      /* allocated in global.c */
    -#define QHULL_LIB_TYPE QHULL_NON_REENTRANT
    -
    -#else
    -#define qh qh_qh.
    -extern qhT qh_qh;
    -#define QHULL_LIB_TYPE QHULL_NON_REENTRANT
    -#endif
    -
    -#define QHULL_LIB_CHECK qh_lib_check(QHULL_LIB_TYPE, sizeof(qhT), sizeof(vertexT), sizeof(ridgeT), sizeof(facetT), sizeof(setT), sizeof(qhmemT));
    -#define QHULL_LIB_CHECK_RBOX qh_lib_check(QHULL_LIB_TYPE, sizeof(qhT), sizeof(vertexT), sizeof(ridgeT), sizeof(facetT), 0, 0);
    -
    -struct qhT {
    -
    -/*----------------------------------
    -
    -  qh constants
    -    configuration flags and constants for Qhull
    -
    -  notes:
    -    The user configures Qhull by defining flags.  They are
    -    copied into qh by qh_setflags().  qh-quick.htm#options defines the flags.
    -*/
    -  boolT ALLpoints;        /* true 'Qs' if search all points for initial simplex */
    -  boolT ANGLEmerge;       /* true 'Qa' if sort potential merges by angle */
    -  boolT APPROXhull;       /* true 'Wn' if MINoutside set */
    -  realT   MINoutside;     /*   'Wn' min. distance for an outside point */
    -  boolT ANNOTATEoutput;   /* true 'Ta' if annotate output with message codes */
    -  boolT ATinfinity;       /* true 'Qz' if point num_points-1 is "at-infinity"
    -                             for improving precision in Delaunay triangulations */
    -  boolT AVOIDold;         /* true 'Q4' if avoid old->new merges */
    -  boolT BESToutside;      /* true 'Qf' if partition points into best outsideset */
    -  boolT CDDinput;         /* true 'Pc' if input uses CDD format (1.0/offset first) */
    -  boolT CDDoutput;        /* true 'PC' if print normals in CDD format (offset first) */
    -  boolT CHECKfrequently;  /* true 'Tc' if checking frequently */
    -  realT premerge_cos;     /*   'A-n'   cos_max when pre merging */
    -  realT postmerge_cos;    /*   'An'    cos_max when post merging */
    -  boolT DELAUNAY;         /* true 'd' if computing DELAUNAY triangulation */
    -  boolT DOintersections;  /* true 'Gh' if print hyperplane intersections */
    -  int   DROPdim;          /* drops dim 'GDn' for 4-d -> 3-d output */
    -  boolT FORCEoutput;      /* true 'Po' if forcing output despite degeneracies */
    -  int   GOODpoint;        /* 1+n for 'QGn', good facet if visible/not(-) from point n*/
    -  pointT *GOODpointp;     /*   the actual point */
    -  boolT GOODthreshold;    /* true if qh.lower_threshold/upper_threshold defined
    -                             false if qh.SPLITthreshold */
    -  int   GOODvertex;       /* 1+n, good facet if vertex for point n */
    -  pointT *GOODvertexp;     /*   the actual point */
    -  boolT HALFspace;        /* true 'Hn,n,n' if halfspace intersection */
    -  boolT ISqhullQh;        /* Set by Qhull.cpp on initialization */
    -  int   IStracing;        /* trace execution, 0=none, 1=least, 4=most, -1=events */
    -  int   KEEParea;         /* 'PAn' number of largest facets to keep */
    -  boolT KEEPcoplanar;     /* true 'Qc' if keeping nearest facet for coplanar points */
    -  boolT KEEPinside;       /* true 'Qi' if keeping nearest facet for inside points
    -                              set automatically if 'd Qc' */
    -  int   KEEPmerge;        /* 'PMn' number of facets to keep with most merges */
    -  realT KEEPminArea;      /* 'PFn' minimum facet area to keep */
    -  realT MAXcoplanar;      /* 'Un' max distance below a facet to be coplanar*/
    -  boolT MERGEexact;       /* true 'Qx' if exact merges (coplanar, degen, dupridge, flipped) */
    -  boolT MERGEindependent; /* true 'Q2' if merging independent sets */
    -  boolT MERGING;          /* true if exact-, pre- or post-merging, with angle and centrum tests */
    -  realT   premerge_centrum;  /*   'C-n' centrum_radius when pre merging.  Default is round-off */
    -  realT   postmerge_centrum; /*   'Cn' centrum_radius when post merging.  Default is round-off */
    -  boolT MERGEvertices;    /* true 'Q3' if merging redundant vertices */
    -  realT MINvisible;       /* 'Vn' min. distance for a facet to be visible */
    -  boolT NOnarrow;         /* true 'Q10' if no special processing for narrow distributions */
    -  boolT NOnearinside;     /* true 'Q8' if ignore near-inside points when partitioning */
    -  boolT NOpremerge;       /* true 'Q0' if no defaults for C-0 or Qx */
    -  boolT NOwide;           /* true 'Q12' if no error on wide merge due to duplicate ridge */
    -  boolT ONLYgood;         /* true 'Qg' if process points with good visible or horizon facets */
    -  boolT ONLYmax;          /* true 'Qm' if only process points that increase max_outside */
    -  boolT PICKfurthest;     /* true 'Q9' if process furthest of furthest points*/
    -  boolT POSTmerge;        /* true if merging after buildhull (Cn or An) */
    -  boolT PREmerge;         /* true if merging during buildhull (C-n or A-n) */
    -                        /* NOTE: some of these names are similar to qh_PRINT names */
    -  boolT PRINTcentrums;    /* true 'Gc' if printing centrums */
    -  boolT PRINTcoplanar;    /* true 'Gp' if printing coplanar points */
    -  int   PRINTdim;         /* print dimension for Geomview output */
    -  boolT PRINTdots;        /* true 'Ga' if printing all points as dots */
    -  boolT PRINTgood;        /* true 'Pg' if printing good facets */
    -  boolT PRINTinner;       /* true 'Gi' if printing inner planes */
    -  boolT PRINTneighbors;   /* true 'PG' if printing neighbors of good facets */
    -  boolT PRINTnoplanes;    /* true 'Gn' if printing no planes */
    -  boolT PRINToptions1st;  /* true 'FO' if printing options to stderr */
    -  boolT PRINTouter;       /* true 'Go' if printing outer planes */
    -  boolT PRINTprecision;   /* false 'Pp' if not reporting precision problems */
    -  qh_PRINT PRINTout[qh_PRINTEND]; /* list of output formats to print */
    -  boolT PRINTridges;      /* true 'Gr' if print ridges */
    -  boolT PRINTspheres;     /* true 'Gv' if print vertices as spheres */
    -  boolT PRINTstatistics;  /* true 'Ts' if printing statistics to stderr */
    -  boolT PRINTsummary;     /* true 's' if printing summary to stderr */
    -  boolT PRINTtransparent; /* true 'Gt' if print transparent outer ridges */
    -  boolT PROJECTdelaunay;  /* true if DELAUNAY, no readpoints() and
    -                             need projectinput() for Delaunay in qh_init_B */
    -  int   PROJECTinput;     /* number of projected dimensions 'bn:0Bn:0' */
    -  boolT QUICKhelp;        /* true if quick help message for degen input */
    -  boolT RANDOMdist;       /* true if randomly change distplane and setfacetplane */
    -  realT RANDOMfactor;     /*    maximum random perturbation */
    -  realT RANDOMa;          /*    qh_randomfactor is randr * RANDOMa + RANDOMb */
    -  realT RANDOMb;
    -  boolT RANDOMoutside;    /* true if select a random outside point */
    -  int   REPORTfreq;       /* buildtracing reports every n facets */
    -  int   REPORTfreq2;      /* tracemerging reports every REPORTfreq/2 facets */
    -  int   RERUN;            /* 'TRn' rerun qhull n times (qh.build_cnt) */
    -  int   ROTATErandom;     /* 'QRn' seed, 0 time, >= rotate input */
    -  boolT SCALEinput;       /* true 'Qbk' if scaling input */
    -  boolT SCALElast;        /* true 'Qbb' if scale last coord to max prev coord */
    -  boolT SETroundoff;      /* true 'E' if qh.DISTround is predefined */
    -  boolT SKIPcheckmax;     /* true 'Q5' if skip qh_check_maxout */
    -  boolT SKIPconvex;       /* true 'Q6' if skip convexity testing during pre-merge */
    -  boolT SPLITthresholds;  /* true if upper_/lower_threshold defines a region
    -                               used only for printing (!for qh.ONLYgood) */
    -  int   STOPcone;         /* 'TCn' 1+n for stopping after cone for point n */
    -                          /*       also used by qh_build_withresart for err exit*/
    -  int   STOPpoint;        /* 'TVn' 'TV-n' 1+n for stopping after/before(-)
    -                                        adding point n */
    -  int   TESTpoints;       /* 'QTn' num of test points after qh.num_points.  Test points always coplanar. */
    -  boolT TESTvneighbors;   /*  true 'Qv' if test vertex neighbors at end */
    -  int   TRACElevel;       /* 'Tn' conditional IStracing level */
    -  int   TRACElastrun;     /*  qh.TRACElevel applies to last qh.RERUN */
    -  int   TRACEpoint;       /* 'TPn' start tracing when point n is a vertex */
    -  realT TRACEdist;        /* 'TWn' start tracing when merge distance too big */
    -  int   TRACEmerge;       /* 'TMn' start tracing before this merge */
    -  boolT TRIangulate;      /* true 'Qt' if triangulate non-simplicial facets */
    -  boolT TRInormals;       /* true 'Q11' if triangulate duplicates ->normal and ->center (sets Qt) */
    -  boolT UPPERdelaunay;    /* true 'Qu' if computing furthest-site Delaunay */
    -  boolT USEstdout;        /* true 'Tz' if using stdout instead of stderr */
    -  boolT VERIFYoutput;     /* true 'Tv' if verify output at end of qhull */
    -  boolT VIRTUALmemory;    /* true 'Q7' if depth-first processing in buildhull */
    -  boolT VORONOI;          /* true 'v' if computing Voronoi diagram */
    -
    -  /*--------input constants ---------*/
    -  realT AREAfactor;       /* 1/(hull_dim-1)! for converting det's to area */
    -  boolT DOcheckmax;       /* true if calling qh_check_maxout (qh_initqhull_globals) */
    -  char  *feasible_string;  /* feasible point 'Hn,n,n' for halfspace intersection */
    -  coordT *feasible_point;  /*    as coordinates, both malloc'd */
    -  boolT GETarea;          /* true 'Fa', 'FA', 'FS', 'PAn', 'PFn' if compute facet area/Voronoi volume in io.c */
    -  boolT KEEPnearinside;   /* true if near-inside points in coplanarset */
    -  int   hull_dim;         /* dimension of hull, set by initbuffers */
    -  int   input_dim;        /* dimension of input, set by initbuffers */
    -  int   num_points;       /* number of input points */
    -  pointT *first_point;    /* array of input points, see POINTSmalloc */
    -  boolT POINTSmalloc;     /*   true if qh.first_point/num_points allocated */
    -  pointT *input_points;   /* copy of original qh.first_point for input points for qh_joggleinput */
    -  boolT input_malloc;     /* true if qh.input_points malloc'd */
    -  char  qhull_command[256];/* command line that invoked this program */
    -  int   qhull_commandsiz2; /*    size of qhull_command at qh_clear_outputflags */
    -  char  rbox_command[256]; /* command line that produced the input points */
    -  char  qhull_options[512];/* descriptive list of options */
    -  int   qhull_optionlen;  /*    length of last line */
    -  int   qhull_optionsiz;  /*    size of qhull_options at qh_build_withrestart */
    -  int   qhull_optionsiz2; /*    size of qhull_options at qh_clear_outputflags */
    -  int   run_id;           /* non-zero, random identifier for this instance of qhull */
    -  boolT VERTEXneighbors;  /* true if maintaining vertex neighbors */
    -  boolT ZEROcentrum;      /* true if 'C-0' or 'C-0 Qx'.  sets ZEROall_ok */
    -  realT *upper_threshold; /* don't print if facet->normal[k]>=upper_threshold[k]
    -                             must set either GOODthreshold or SPLITthreshold
    -                             if Delaunay, default is 0.0 for upper envelope */
    -  realT *lower_threshold; /* don't print if facet->normal[k] <=lower_threshold[k] */
    -  realT *upper_bound;     /* scale point[k] to new upper bound */
    -  realT *lower_bound;     /* scale point[k] to new lower bound
    -                             project if both upper_ and lower_bound == 0 */
    -
    -/*----------------------------------
    -
    -  qh precision constants
    -    precision constants for Qhull
    -
    -  notes:
    -    qh_detroundoff() computes the maximum roundoff error for distance
    -    and other computations.  It also sets default values for the
    -    qh constants above.
    -*/
    -  realT ANGLEround;       /* max round off error for angles */
    -  realT centrum_radius;   /* max centrum radius for convexity (roundoff added) */
    -  realT cos_max;          /* max cosine for convexity (roundoff added) */
    -  realT DISTround;        /* max round off error for distances, 'E' overrides qh_distround() */
    -  realT MAXabs_coord;     /* max absolute coordinate */
    -  realT MAXlastcoord;     /* max last coordinate for qh_scalelast */
    -  realT MAXsumcoord;      /* max sum of coordinates */
    -  realT MAXwidth;         /* max rectilinear width of point coordinates */
    -  realT MINdenom_1;       /* min. abs. value for 1/x */
    -  realT MINdenom;         /*    use divzero if denominator < MINdenom */
    -  realT MINdenom_1_2;     /* min. abs. val for 1/x that allows normalization */
    -  realT MINdenom_2;       /*    use divzero if denominator < MINdenom_2 */
    -  realT MINlastcoord;     /* min. last coordinate for qh_scalelast */
    -  boolT NARROWhull;       /* set in qh_initialhull if angle < qh_MAXnarrow */
    -  realT *NEARzero;        /* hull_dim array for near zero in gausselim */
    -  realT NEARinside;       /* keep points for qh_check_maxout if close to facet */
    -  realT ONEmerge;         /* max distance for merging simplicial facets */
    -  realT outside_err;      /* application's epsilon for coplanar points
    -                             qh_check_bestdist() qh_check_points() reports error if point outside */
    -  realT WIDEfacet;        /* size of wide facet for skipping ridge in
    -                             area computation and locking centrum */
    -
    -/*----------------------------------
    -
    -  qh internal constants
    -    internal constants for Qhull
    -*/
    -  char qhull[sizeof("qhull")]; /* "qhull" for checking ownership while debugging */
    -  jmp_buf errexit;        /* exit label for qh_errexit, defined by setjmp() and NOerrexit */
    -  char jmpXtra[40];       /* extra bytes in case jmp_buf is defined wrong by compiler */
    -  jmp_buf restartexit;    /* restart label for qh_errexit, defined by setjmp() and ALLOWrestart */
    -  char jmpXtra2[40];      /* extra bytes in case jmp_buf is defined wrong by compiler*/
    -  FILE *fin;              /* pointer to input file, init by qh_initqhull_start2 */
    -  FILE *fout;             /* pointer to output file */
    -  FILE *ferr;             /* pointer to error file */
    -  pointT *interior_point; /* center point of the initial simplex*/
    -  int normal_size;     /* size in bytes for facet normals and point coords*/
    -  int center_size;     /* size in bytes for Voronoi centers */
    -  int   TEMPsize;         /* size for small, temporary sets (in quick mem) */
    -
    -/*----------------------------------
    -
    -  qh facet and vertex lists
    -    defines lists of facets, new facets, visible facets, vertices, and
    -    new vertices.  Includes counts, next ids, and trace ids.
    -  see:
    -    qh_resetlists()
    -*/
    -  facetT *facet_list;     /* first facet */
    -  facetT  *facet_tail;     /* end of facet_list (dummy facet) */
    -  facetT *facet_next;     /* next facet for buildhull()
    -                             previous facets do not have outside sets
    -                             NARROWhull: previous facets may have coplanar outside sets for qh_outcoplanar */
    -  facetT *newfacet_list;  /* list of new facets to end of facet_list */
    -  facetT *visible_list;   /* list of visible facets preceding newfacet_list,
    -                             facet->visible set */
    -  int       num_visible;  /* current number of visible facets */
    -  unsigned tracefacet_id;  /* set at init, then can print whenever */
    -  facetT *tracefacet;     /*   set in newfacet/mergefacet, undone in delfacet*/
    -  unsigned tracevertex_id;  /* set at buildtracing, can print whenever */
    -  vertexT *tracevertex;     /*   set in newvertex, undone in delvertex*/
    -  vertexT *vertex_list;     /* list of all vertices, to vertex_tail */
    -  vertexT  *vertex_tail;    /*      end of vertex_list (dummy vertex) */
    -  vertexT *newvertex_list; /* list of vertices in newfacet_list, to vertex_tail
    -                             all vertices have 'newlist' set */
    -  int   num_facets;       /* number of facets in facet_list
    -                             includes visible faces (num_visible) */
    -  int   num_vertices;     /* number of vertices in facet_list */
    -  int   num_outside;      /* number of points in outsidesets (for tracing and RANDOMoutside)
    -                               includes coplanar outsideset points for NARROWhull/qh_outcoplanar() */
    -  int   num_good;         /* number of good facets (after findgood_all) */
    -  unsigned facet_id;      /* ID of next, new facet from newfacet() */
    -  unsigned ridge_id;      /* ID of next, new ridge from newridge() */
    -  unsigned vertex_id;     /* ID of next, new vertex from newvertex() */
    -
    -/*----------------------------------
    -
    -  qh global variables
    -    defines minimum and maximum distances, next visit ids, several flags,
    -    and other global variables.
    -    initialize in qh_initbuild or qh_maxmin if used in qh_buildhull
    -*/
    -  unsigned long hulltime; /* ignore time to set up input and randomize */
    -                          /*   use unsigned to avoid wrap-around errors */
    -  boolT ALLOWrestart;     /* true if qh_precision can use qh.restartexit */
    -  int   build_cnt;        /* number of calls to qh_initbuild */
    -  qh_CENTER CENTERtype;   /* current type of facet->center, qh_CENTER */
    -  int   furthest_id;      /* pointid of furthest point, for tracing */
    -  facetT *GOODclosest;    /* closest facet to GOODthreshold in qh_findgood */
    -  boolT hasAreaVolume;    /* true if totarea, totvol was defined by qh_getarea */
    -  boolT hasTriangulation; /* true if triangulation created by qh_triangulate */
    -  realT JOGGLEmax;        /* set 'QJn' if randomly joggle input */
    -  boolT maxoutdone;       /* set qh_check_maxout(), cleared by qh_addpoint() */
    -  realT max_outside;      /* maximum distance from a point to a facet,
    -                               before roundoff, not simplicial vertices
    -                               actual outer plane is +DISTround and
    -                               computed outer plane is +2*DISTround */
    -  realT max_vertex;       /* maximum distance (>0) from vertex to a facet,
    -                               before roundoff, due to a merge */
    -  realT min_vertex;       /* minimum distance (<0) from vertex to a facet,
    -                               before roundoff, due to a merge
    -                               if qh.JOGGLEmax, qh_makenewplanes sets it
    -                               recomputed if qh.DOcheckmax, default -qh.DISTround */
    -  boolT NEWfacets;        /* true while visible facets invalid due to new or merge
    -                              from makecone/attachnewfacets to deletevisible */
    -  boolT findbestnew;      /* true if partitioning calls qh_findbestnew */
    -  boolT findbest_notsharp; /* true if new facets are at least 90 degrees */
    -  boolT NOerrexit;        /* true if qh.errexit is not available, cleared after setjmp */
    -  realT PRINTcradius;     /* radius for printing centrums */
    -  realT PRINTradius;      /* radius for printing vertex spheres and points */
    -  boolT POSTmerging;      /* true when post merging */
    -  int   printoutvar;      /* temporary variable for qh_printbegin, etc. */
    -  int   printoutnum;      /* number of facets printed */
    -  boolT QHULLfinished;    /* True after qhull() is finished */
    -  realT totarea;          /* 'FA': total facet area computed by qh_getarea, hasAreaVolume */
    -  realT totvol;           /* 'FA': total volume computed by qh_getarea, hasAreaVolume */
    -  unsigned int visit_id;  /* unique ID for searching neighborhoods, */
    -  unsigned int vertex_visit; /* unique ID for searching vertices, reset with qh_buildtracing */
    -  boolT ZEROall_ok;       /* True if qh_checkzero always succeeds */
    -  boolT WAScoplanar;      /* True if qh_partitioncoplanar (qh_check_maxout) */
    -
    -/*----------------------------------
    -
    -  qh global sets
    -    defines sets for merging, initial simplex, hashing, extra input points,
    -    and deleted vertices
    -*/
    -  setT *facet_mergeset;   /* temporary set of merges to be done */
    -  setT *degen_mergeset;   /* temporary set of degenerate and redundant merges */
    -  setT *hash_table;       /* hash table for matching ridges in qh_matchfacets
    -                             size is setsize() */
    -  setT *other_points;     /* additional points */
    -  setT *del_vertices;     /* vertices to partition and delete with visible
    -                             facets.  Have deleted set for checkfacet */
    -
    -/*----------------------------------
    -
    -  qh global buffers
    -    defines buffers for maxtrix operations, input, and error messages
    -*/
    -  coordT *gm_matrix;      /* (dim+1)Xdim matrix for geom.c */
    -  coordT **gm_row;        /* array of gm_matrix rows */
    -  char* line;             /* malloc'd input line of maxline+1 chars */
    -  int maxline;
    -  coordT *half_space;     /* malloc'd input array for halfspace (qh normal_size+coordT) */
    -  coordT *temp_malloc;    /* malloc'd input array for points */
    -
    -/*----------------------------------
    -
    -  qh static variables
    -    defines static variables for individual functions
    -
    -  notes:
    -    do not use 'static' within a function.  Multiple instances of qhull
    -    may exist.
    -
    -    do not assume zero initialization, 'QPn' may cause a restart
    -*/
    -  boolT ERREXITcalled;    /* true during qh_errexit (prevents duplicate calls */
    -  boolT firstcentrum;     /* for qh_printcentrum */
    -  boolT old_randomdist;   /* save RANDOMdist flag during io, tracing, or statistics */
    -  setT *coplanarfacetset;  /* set of coplanar facets for searching qh_findbesthorizon() */
    -  realT last_low;         /* qh_scalelast parameters for qh_setdelaunay */
    -  realT last_high;
    -  realT last_newhigh;
    -  unsigned lastreport;    /* for qh_buildtracing */
    -  int mergereport;        /* for qh_tracemerging */
    -  qhstatT *old_qhstat;    /* for saving qh_qhstat in save_qhull() and UsingLibQhull.  Free with qh_free() */
    -  setT *old_tempstack;    /* for saving qhmem.tempstack in save_qhull */
    -  int   ridgeoutnum;      /* number of ridges for 4OFF output (qh_printbegin,etc) */
    -};
    -
    -/*=========== -macros- =========================*/
    -
    -/*----------------------------------
    -
    -  otherfacet_(ridge, facet)
    -    return neighboring facet for a ridge in facet
    -*/
    -#define otherfacet_(ridge, facet) \
    -                        (((ridge)->top == (facet)) ? (ridge)->bottom : (ridge)->top)
    -
    -/*----------------------------------
    -
    -  getid_(p)
    -    return int ID for facet, ridge, or vertex
    -    return qh_IDunknown(-1) if NULL
    -*/
    -#define getid_(p)       ((p) ? (int)((p)->id) : qh_IDunknown)
    -
    -/*============== FORALL macros ===================*/
    -
    -/*----------------------------------
    -
    -  FORALLfacets { ... }
    -    assign 'facet' to each facet in qh.facet_list
    -
    -  notes:
    -    uses 'facetT *facet;'
    -    assumes last facet is a sentinel
    -
    -  see:
    -    FORALLfacet_( facetlist )
    -*/
    -#define FORALLfacets for (facet=qh facet_list;facet && facet->next;facet=facet->next)
    -
    -/*----------------------------------
    -
    -  FORALLpoints { ... }
    -    assign 'point' to each point in qh.first_point, qh.num_points
    -
    -  declare:
    -    coordT *point, *pointtemp;
    -*/
    -#define FORALLpoints FORALLpoint_(qh first_point, qh num_points)
    -
    -/*----------------------------------
    -
    -  FORALLpoint_( points, num) { ... }
    -    assign 'point' to each point in points array of num points
    -
    -  declare:
    -    coordT *point, *pointtemp;
    -*/
    -#define FORALLpoint_(points, num) for (point= (points), \
    -      pointtemp= (points)+qh hull_dim*(num); point < pointtemp; point += qh hull_dim)
    -
    -/*----------------------------------
    -
    -  FORALLvertices { ... }
    -    assign 'vertex' to each vertex in qh.vertex_list
    -
    -  declare:
    -    vertexT *vertex;
    -
    -  notes:
    -    assumes qh.vertex_list terminated with a sentinel
    -*/
    -#define FORALLvertices for (vertex=qh vertex_list;vertex && vertex->next;vertex= vertex->next)
    -
    -/*----------------------------------
    -
    -  FOREACHfacet_( facets ) { ... }
    -    assign 'facet' to each facet in facets
    -
    -  declare:
    -    facetT *facet, **facetp;
    -
    -  see:
    -    FOREACHsetelement_
    -*/
    -#define FOREACHfacet_(facets)    FOREACHsetelement_(facetT, facets, facet)
    -
    -/*----------------------------------
    -
    -  FOREACHneighbor_( facet ) { ... }
    -    assign 'neighbor' to each neighbor in facet->neighbors
    -
    -  FOREACHneighbor_( vertex ) { ... }
    -    assign 'neighbor' to each neighbor in vertex->neighbors
    -
    -  declare:
    -    facetT *neighbor, **neighborp;
    -
    -  see:
    -    FOREACHsetelement_
    -*/
    -#define FOREACHneighbor_(facet)  FOREACHsetelement_(facetT, facet->neighbors, neighbor)
    -
    -/*----------------------------------
    -
    -  FOREACHpoint_( points ) { ... }
    -    assign 'point' to each point in points set
    -
    -  declare:
    -    pointT *point, **pointp;
    -
    -  see:
    -    FOREACHsetelement_
    -*/
    -#define FOREACHpoint_(points)    FOREACHsetelement_(pointT, points, point)
    -
    -/*----------------------------------
    -
    -  FOREACHridge_( ridges ) { ... }
    -    assign 'ridge' to each ridge in ridges set
    -
    -  declare:
    -    ridgeT *ridge, **ridgep;
    -
    -  see:
    -    FOREACHsetelement_
    -*/
    -#define FOREACHridge_(ridges)    FOREACHsetelement_(ridgeT, ridges, ridge)
    -
    -/*----------------------------------
    -
    -  FOREACHvertex_( vertices ) { ... }
    -    assign 'vertex' to each vertex in vertices set
    -
    -  declare:
    -    vertexT *vertex, **vertexp;
    -
    -  see:
    -    FOREACHsetelement_
    -*/
    -#define FOREACHvertex_(vertices) FOREACHsetelement_(vertexT, vertices,vertex)
    -
    -/*----------------------------------
    -
    -  FOREACHfacet_i_( facets ) { ... }
    -    assign 'facet' and 'facet_i' for each facet in facets set
    -
    -  declare:
    -    facetT *facet;
    -    int     facet_n, facet_i;
    -
    -  see:
    -    FOREACHsetelement_i_
    -*/
    -#define FOREACHfacet_i_(facets)    FOREACHsetelement_i_(facetT, facets, facet)
    -
    -/*----------------------------------
    -
    -  FOREACHneighbor_i_( facet ) { ... }
    -    assign 'neighbor' and 'neighbor_i' for each neighbor in facet->neighbors
    -
    -  FOREACHneighbor_i_( vertex ) { ... }
    -    assign 'neighbor' and 'neighbor_i' for each neighbor in vertex->neighbors
    -
    -  declare:
    -    facetT *neighbor;
    -    int     neighbor_n, neighbor_i;
    -
    -  see:
    -    FOREACHsetelement_i_
    -*/
    -#define FOREACHneighbor_i_(facet)  FOREACHsetelement_i_(facetT, facet->neighbors, neighbor)
    -
    -/*----------------------------------
    -
    -  FOREACHpoint_i_( points ) { ... }
    -    assign 'point' and 'point_i' for each point in points set
    -
    -  declare:
    -    pointT *point;
    -    int     point_n, point_i;
    -
    -  see:
    -    FOREACHsetelement_i_
    -*/
    -#define FOREACHpoint_i_(points)    FOREACHsetelement_i_(pointT, points, point)
    -
    -/*----------------------------------
    -
    -  FOREACHridge_i_( ridges ) { ... }
    -    assign 'ridge' and 'ridge_i' for each ridge in ridges set
    -
    -  declare:
    -    ridgeT *ridge;
    -    int     ridge_n, ridge_i;
    -
    -  see:
    -    FOREACHsetelement_i_
    -*/
    -#define FOREACHridge_i_(ridges)    FOREACHsetelement_i_(ridgeT, ridges, ridge)
    -
    -/*----------------------------------
    -
    -  FOREACHvertex_i_( vertices ) { ... }
    -    assign 'vertex' and 'vertex_i' for each vertex in vertices set
    -
    -  declare:
    -    vertexT *vertex;
    -    int     vertex_n, vertex_i;
    -
    -  see:
    -    FOREACHsetelement_i_
    -*/
    -#define FOREACHvertex_i_(vertices) FOREACHsetelement_i_(vertexT, vertices,vertex)
    -
    -/********* -libqhull.c prototypes (duplicated from qhull_a.h) **********************/
    -
    -void    qh_qhull(void);
    -boolT   qh_addpoint(pointT *furthest, facetT *facet, boolT checkdist);
    -void    qh_printsummary(FILE *fp);
    -
    -/********* -user.c prototypes (alphabetical) **********************/
    -
    -void    qh_errexit(int exitcode, facetT *facet, ridgeT *ridge);
    -void    qh_errprint(const char* string, facetT *atfacet, facetT *otherfacet, ridgeT *atridge, vertexT *atvertex);
    -int     qh_new_qhull(int dim, int numpoints, coordT *points, boolT ismalloc,
    -                char *qhull_cmd, FILE *outfile, FILE *errfile);
    -void    qh_printfacetlist(facetT *facetlist, setT *facets, boolT printall);
    -void    qh_printhelp_degenerate(FILE *fp);
    -void    qh_printhelp_narrowhull(FILE *fp, realT minangle);
    -void    qh_printhelp_singular(FILE *fp);
    -void    qh_user_memsizes(void);
    -
    -/********* -usermem.c prototypes (alphabetical) **********************/
    -void    qh_exit(int exitcode);
    -void    qh_fprintf_stderr(int msgcode, const char *fmt, ... );
    -void    qh_free(void *mem);
    -void   *qh_malloc(size_t size);
    -
    -/********* -userprintf.c and userprintf_rbox.c prototypes **********************/
    -void    qh_fprintf(FILE *fp, int msgcode, const char *fmt, ... );
    -void    qh_fprintf_rbox(FILE *fp, int msgcode, const char *fmt, ... );
    -
    -/***** -geom.c/geom2.c/random.c prototypes (duplicated from geom.h, random.h) ****************/
    -
    -facetT *qh_findbest(pointT *point, facetT *startfacet,
    -                     boolT bestoutside, boolT newfacets, boolT noupper,
    -                     realT *dist, boolT *isoutside, int *numpart);
    -facetT *qh_findbestnew(pointT *point, facetT *startfacet,
    -                     realT *dist, boolT bestoutside, boolT *isoutside, int *numpart);
    -boolT   qh_gram_schmidt(int dim, realT **rows);
    -void    qh_outerinner(facetT *facet, realT *outerplane, realT *innerplane);
    -void    qh_printsummary(FILE *fp);
    -void    qh_projectinput(void);
    -void    qh_randommatrix(realT *buffer, int dim, realT **row);
    -void    qh_rotateinput(realT **rows);
    -void    qh_scaleinput(void);
    -void    qh_setdelaunay(int dim, int count, pointT *points);
    -coordT  *qh_sethalfspace_all(int dim, int count, coordT *halfspaces, pointT *feasible);
    -
    -/***** -global.c prototypes (alphabetical) ***********************/
    -
    -unsigned long qh_clock(void);
    -void    qh_checkflags(char *command, char *hiddenflags);
    -void    qh_clear_outputflags(void);
    -void    qh_freebuffers(void);
    -void    qh_freeqhull(boolT allmem);
    -void    qh_freeqhull2(boolT allmem);
    -void    qh_init_A(FILE *infile, FILE *outfile, FILE *errfile, int argc, char *argv[]);
    -void    qh_init_B(coordT *points, int numpoints, int dim, boolT ismalloc);
    -void    qh_init_qhull_command(int argc, char *argv[]);
    -void    qh_initbuffers(coordT *points, int numpoints, int dim, boolT ismalloc);
    -void    qh_initflags(char *command);
    -void    qh_initqhull_buffers(void);
    -void    qh_initqhull_globals(coordT *points, int numpoints, int dim, boolT ismalloc);
    -void    qh_initqhull_mem(void);
    -void    qh_initqhull_outputflags(void);
    -void    qh_initqhull_start(FILE *infile, FILE *outfile, FILE *errfile);
    -void    qh_initqhull_start2(FILE *infile, FILE *outfile, FILE *errfile);
    -void    qh_initthresholds(char *command);
    -void    qh_lib_check(int qhullLibraryType, int qhTsize, int vertexTsize, int ridgeTsize, int facetTsize, int setTsize, int qhmemTsize);
    -void    qh_option(const char *option, int *i, realT *r);
    -#if qh_QHpointer
    -void    qh_restore_qhull(qhT **oldqh);
    -qhT    *qh_save_qhull(void);
    -#endif
    -
    -/***** -io.c prototypes (duplicated from io.h) ***********************/
    -
    -void    qh_dfacet(unsigned id);
    -void    qh_dvertex(unsigned id);
    -void    qh_printneighborhood(FILE *fp, qh_PRINT format, facetT *facetA, facetT *facetB, boolT printall);
    -void    qh_produce_output(void);
    -coordT *qh_readpoints(int *numpoints, int *dimension, boolT *ismalloc);
    -
    -
    -/********* -mem.c prototypes (duplicated from mem.h) **********************/
    -
    -void qh_meminit(FILE *ferr);
    -void qh_memfreeshort(int *curlong, int *totlong);
    -
    -/********* -poly.c/poly2.c prototypes (duplicated from poly.h) **********************/
    -
    -void    qh_check_output(void);
    -void    qh_check_points(void);
    -setT   *qh_facetvertices(facetT *facetlist, setT *facets, boolT allfacets);
    -facetT *qh_findbestfacet(pointT *point, boolT bestoutside,
    -           realT *bestdist, boolT *isoutside);
    -vertexT *qh_nearvertex(facetT *facet, pointT *point, realT *bestdistp);
    -pointT *qh_point(int id);
    -setT   *qh_pointfacet(void /*qh.facet_list*/);
    -int     qh_pointid(pointT *point);
    -setT   *qh_pointvertex(void /*qh.facet_list*/);
    -void    qh_setvoronoi_all(void);
    -void    qh_triangulate(void /*qh.facet_list*/);
    -
    -/********* -rboxlib.c prototypes **********************/
    -int     qh_rboxpoints(FILE* fout, FILE* ferr, char* rbox_command);
    -void    qh_errexit_rbox(int exitcode);
    -
    -/********* -stat.c prototypes (duplicated from stat.h) **********************/
    -
    -void    qh_collectstatistics(void);
    -void    qh_printallstatistics(FILE *fp, const char *string);
    -
    -#endif /* qhDEFlibqhull */
    diff --git a/src/qhull/src/libqhull/libqhull.pro b/src/qhull/src/libqhull/libqhull.pro
    deleted file mode 100644
    index 18005da59d6..00000000000
    --- a/src/qhull/src/libqhull/libqhull.pro
    +++ /dev/null
    @@ -1,67 +0,0 @@
    -# -------------------------------------------------
    -# libqhull.pro -- Qt project for Qhull shared library
    -# -------------------------------------------------
    -
    -include(../qhull-warn.pri)
    -
    -DESTDIR = ../../lib
    -DLLDESTDIR = ../../bin
    -TEMPLATE = lib
    -CONFIG += shared warn_on
    -CONFIG -= qt
    -
    -build_pass:CONFIG(debug, debug|release):{
    -    TARGET = qhull_d
    -    OBJECTS_DIR = Debug
    -}else:build_pass:CONFIG(release, debug|release):{
    -    TARGET = qhull
    -    OBJECTS_DIR = Release
    -}
    -win32-msvc* : QMAKE_LFLAGS += /INCREMENTAL:NO
    -
    -win32-msvc* : DEF_FILE += ../../src/libqhull/qhull-exports.def
    -
    -# Order object files by frequency of execution.  Small files at end.
    -
    -# libqhull/libqhull.pro and ../qhull-libqhull-src.pri have the same SOURCES and HEADERS
    -SOURCES += ../libqhull/global.c
    -SOURCES += ../libqhull/stat.c
    -SOURCES += ../libqhull/geom2.c
    -SOURCES += ../libqhull/poly2.c
    -SOURCES += ../libqhull/merge.c
    -SOURCES += ../libqhull/libqhull.c
    -SOURCES += ../libqhull/geom.c
    -SOURCES += ../libqhull/poly.c
    -SOURCES += ../libqhull/qset.c
    -SOURCES += ../libqhull/mem.c
    -SOURCES += ../libqhull/random.c
    -SOURCES += ../libqhull/usermem.c
    -SOURCES += ../libqhull/userprintf.c
    -SOURCES += ../libqhull/io.c
    -SOURCES += ../libqhull/user.c
    -SOURCES += ../libqhull/rboxlib.c
    -SOURCES += ../libqhull/userprintf_rbox.c
    -
    -HEADERS += ../libqhull/geom.h
    -HEADERS += ../libqhull/io.h
    -HEADERS += ../libqhull/libqhull.h
    -HEADERS += ../libqhull/mem.h
    -HEADERS += ../libqhull/merge.h
    -HEADERS += ../libqhull/poly.h
    -HEADERS += ../libqhull/random.h
    -HEADERS += ../libqhull/qhull_a.h
    -HEADERS += ../libqhull/qset.h
    -HEADERS += ../libqhull/stat.h
    -HEADERS += ../libqhull/user.h
    -
    -OTHER_FILES += Mborland
    -OTHER_FILES += qh-geom.htm
    -OTHER_FILES += qh-globa.htm
    -OTHER_FILES += qh-io.htm
    -OTHER_FILES += qh-mem.htm
    -OTHER_FILES += qh-merge.htm
    -OTHER_FILES += qh-poly.htm
    -OTHER_FILES += qh-qhull.htm
    -OTHER_FILES += qh-set.htm
    -OTHER_FILES += qh-stat.htm
    -OTHER_FILES += qh-user.htm
    diff --git a/src/qhull/src/libqhull/mem.c b/src/qhull/src/libqhull/mem.c
    deleted file mode 100644
    index db72bb4e19d..00000000000
    --- a/src/qhull/src/libqhull/mem.c
    +++ /dev/null
    @@ -1,576 +0,0 @@
    -/*
      ---------------------------------
    -
    -  mem.c
    -    memory management routines for qhull
    -
    -  This is a standalone program.
    -
    -  To initialize memory:
    -
    -    qh_meminit(stderr);
    -    qh_meminitbuffers(qh IStracing, qh_MEMalign, 7, qh_MEMbufsize,qh_MEMinitbuf);
    -    qh_memsize((int)sizeof(facetT));
    -    qh_memsize((int)sizeof(facetT));
    -    ...
    -    qh_memsetup();
    -
    -  To free up all memory buffers:
    -    qh_memfreeshort(&curlong, &totlong);
    -
    -  if qh_NOmem,
    -    malloc/free is used instead of mem.c
    -
    -  notes:
    -    uses Quickfit algorithm (freelists for commonly allocated sizes)
    -    assumes small sizes for freelists (it discards the tail of memory buffers)
    -
    -  see:
    -    qh-mem.htm and mem.h
    -    global.c (qh_initbuffers) for an example of using mem.c
    -
    -  Copyright (c) 1993-2015 The Geometry Center.
    -  $Id: //main/2015/qhull/src/libqhull/mem.c#7 $$Change: 2065 $
    -  $DateTime: 2016/01/18 13:51:04 $$Author: bbarber $
    -*/
    -
    -#include "user.h"  /* for QHULL_CRTDBG */
    -#include "mem.h"
    -#include 
    -#include 
    -#include 
    -
    -#ifndef qhDEFlibqhull
    -typedef struct ridgeT ridgeT;
    -typedef struct facetT facetT;
    -#ifdef _MSC_VER  /* Microsoft Visual C++ -- warning level 4 */
    -#pragma warning( disable : 4127)  /* conditional expression is constant */
    -#pragma warning( disable : 4706)  /* assignment within conditional function */
    -#endif
    -void    qh_errexit(int exitcode, facetT *, ridgeT *);
    -void    qh_exit(int exitcode);
    -void    qh_fprintf(FILE *fp, int msgcode, const char *fmt, ... );
    -void    qh_fprintf_stderr(int msgcode, const char *fmt, ... );
    -void    qh_free(void *mem);
    -void   *qh_malloc(size_t size);
    -#endif
    -
    -/*============ -global data structure ==============
    -    see mem.h for definition
    -*/
    -
    -qhmemT qhmem= {0,0,0,0,0,0,0,0,0,0,0,
    -               0,0,0,0,0,0,0,0,0,0,0,
    -               0,0,0,0,0,0,0};     /* remove "= {0}" if this causes a compiler error */
    -
    -#ifndef qh_NOmem
    -
    -/*============= internal functions ==============*/
    -
    -static int qh_intcompare(const void *i, const void *j);
    -
    -/*========== functions in alphabetical order ======== */
    -
    -/*---------------------------------
    -
    -  qh_intcompare( i, j )
    -    used by qsort and bsearch to compare two integers
    -*/
    -static int qh_intcompare(const void *i, const void *j) {
    -  return(*((const int *)i) - *((const int *)j));
    -} /* intcompare */
    -
    -
    -/*----------------------------------
    -
    -  qh_memalloc( insize )
    -    returns object of insize bytes
    -    qhmem is the global memory structure
    -
    -  returns:
    -    pointer to allocated memory
    -    errors if insufficient memory
    -
    -  notes:
    -    use explicit type conversion to avoid type warnings on some compilers
    -    actual object may be larger than insize
    -    use qh_memalloc_() for inline code for quick allocations
    -    logs allocations if 'T5'
    -    caller is responsible for freeing the memory.
    -    short memory is freed on shutdown by qh_memfreeshort unless qh_NOmem
    -
    -  design:
    -    if size < qhmem.LASTsize
    -      if qhmem.freelists[size] non-empty
    -        return first object on freelist
    -      else
    -        round up request to size of qhmem.freelists[size]
    -        allocate new allocation buffer if necessary
    -        allocate object from allocation buffer
    -    else
    -      allocate object with qh_malloc() in user.c
    -*/
    -void *qh_memalloc(int insize) {
    -  void **freelistp, *newbuffer;
    -  int idx, size, n;
    -  int outsize, bufsize;
    -  void *object;
    -
    -  if (insize<0) {
    -      qh_fprintf(qhmem.ferr, 6235, "qhull error (qh_memalloc): negative request size (%d).  Did int overflow due to high-D?\n", insize); /* WARN64 */
    -      qh_errexit(qhmem_ERRmem, NULL, NULL);
    -  }
    -  if (insize>=0 && insize <= qhmem.LASTsize) {
    -    idx= qhmem.indextable[insize];
    -    outsize= qhmem.sizetable[idx];
    -    qhmem.totshort += outsize;
    -    freelistp= qhmem.freelists+idx;
    -    if ((object= *freelistp)) {
    -      qhmem.cntquick++;
    -      qhmem.totfree -= outsize;
    -      *freelistp= *((void **)*freelistp);  /* replace freelist with next object */
    -#ifdef qh_TRACEshort
    -      n= qhmem.cntshort+qhmem.cntquick+qhmem.freeshort;
    -      if (qhmem.IStracing >= 5)
    -          qh_fprintf(qhmem.ferr, 8141, "qh_mem %p n %8d alloc quick: %d bytes (tot %d cnt %d)\n", object, n, outsize, qhmem.totshort, qhmem.cntshort+qhmem.cntquick-qhmem.freeshort);
    -#endif
    -      return(object);
    -    }else {
    -      qhmem.cntshort++;
    -      if (outsize > qhmem.freesize) {
    -        qhmem.totdropped += qhmem.freesize;
    -        if (!qhmem.curbuffer)
    -          bufsize= qhmem.BUFinit;
    -        else
    -          bufsize= qhmem.BUFsize;
    -        if (!(newbuffer= qh_malloc((size_t)bufsize))) {
    -          qh_fprintf(qhmem.ferr, 6080, "qhull error (qh_memalloc): insufficient memory to allocate short memory buffer (%d bytes)\n", bufsize);
    -          qh_errexit(qhmem_ERRmem, NULL, NULL);
    -        }
    -        *((void **)newbuffer)= qhmem.curbuffer;  /* prepend newbuffer to curbuffer
    -                                                    list.  newbuffer!=0 by QH6080 */
    -        qhmem.curbuffer= newbuffer;
    -        size= (sizeof(void **) + qhmem.ALIGNmask) & ~qhmem.ALIGNmask;
    -        qhmem.freemem= (void *)((char *)newbuffer+size);
    -        qhmem.freesize= bufsize - size;
    -        qhmem.totbuffer += bufsize - size; /* easier to check */
    -        /* Periodically test totbuffer.  It matches at beginning and exit of every call */
    -        n = qhmem.totshort + qhmem.totfree + qhmem.totdropped + qhmem.freesize - outsize;
    -        if (qhmem.totbuffer != n) {
    -            qh_fprintf(qhmem.ferr, 6212, "qh_memalloc internal error: short totbuffer %d != totshort+totfree... %d\n", qhmem.totbuffer, n);
    -            qh_errexit(qhmem_ERRmem, NULL, NULL);
    -        }
    -      }
    -      object= qhmem.freemem;
    -      qhmem.freemem= (void *)((char *)qhmem.freemem + outsize);
    -      qhmem.freesize -= outsize;
    -      qhmem.totunused += outsize - insize;
    -#ifdef qh_TRACEshort
    -      n= qhmem.cntshort+qhmem.cntquick+qhmem.freeshort;
    -      if (qhmem.IStracing >= 5)
    -          qh_fprintf(qhmem.ferr, 8140, "qh_mem %p n %8d alloc short: %d bytes (tot %d cnt %d)\n", object, n, outsize, qhmem.totshort, qhmem.cntshort+qhmem.cntquick-qhmem.freeshort);
    -#endif
    -      return object;
    -    }
    -  }else {                     /* long allocation */
    -    if (!qhmem.indextable) {
    -      qh_fprintf(qhmem.ferr, 6081, "qhull internal error (qh_memalloc): qhmem has not been initialized.\n");
    -      qh_errexit(qhmem_ERRqhull, NULL, NULL);
    -    }
    -    outsize= insize;
    -    qhmem.cntlong++;
    -    qhmem.totlong += outsize;
    -    if (qhmem.maxlong < qhmem.totlong)
    -      qhmem.maxlong= qhmem.totlong;
    -    if (!(object= qh_malloc((size_t)outsize))) {
    -      qh_fprintf(qhmem.ferr, 6082, "qhull error (qh_memalloc): insufficient memory to allocate %d bytes\n", outsize);
    -      qh_errexit(qhmem_ERRmem, NULL, NULL);
    -    }
    -    if (qhmem.IStracing >= 5)
    -      qh_fprintf(qhmem.ferr, 8057, "qh_mem %p n %8d alloc long: %d bytes (tot %d cnt %d)\n", object, qhmem.cntlong+qhmem.freelong, outsize, qhmem.totlong, qhmem.cntlong-qhmem.freelong);
    -  }
    -  return(object);
    -} /* memalloc */
    -
    -
    -/*----------------------------------
    -
    -  qh_memcheck( )
    -*/
    -void qh_memcheck(void) {
    -  int i, count, totfree= 0;
    -  void *object;
    -
    -  if (qhmem.ferr == 0 || qhmem.IStracing < 0 || qhmem.IStracing > 10 || (((qhmem.ALIGNmask+1) & qhmem.ALIGNmask) != 0)) {
    -    qh_fprintf_stderr(6244, "qh_memcheck error: either qhmem is overwritten or qhmem is not initialized.  Call qh_meminit() or qh_new_qhull() before calling qh_mem routines.  ferr 0x%x IsTracing %d ALIGNmask 0x%x", qhmem.ferr, qhmem.IStracing, qhmem.ALIGNmask);
    -    qh_exit(qhmem_ERRqhull);  /* can not use qh_errexit() */
    -  }
    -  if (qhmem.IStracing != 0)
    -    qh_fprintf(qhmem.ferr, 8143, "qh_memcheck: check size of freelists on qhmem\nqh_memcheck: A segmentation fault indicates an overwrite of qhmem\n");
    -  for (i=0; i < qhmem.TABLEsize; i++) {
    -    count=0;
    -    for (object= qhmem.freelists[i]; object; object= *((void **)object))
    -      count++;
    -    totfree += qhmem.sizetable[i] * count;
    -  }
    -  if (totfree != qhmem.totfree) {
    -    qh_fprintf(qhmem.ferr, 6211, "Qhull internal error (qh_memcheck): totfree %d not equal to freelist total %d\n", qhmem.totfree, totfree);
    -    qh_errexit(qhmem_ERRqhull, NULL, NULL);
    -  }
    -  if (qhmem.IStracing != 0)
    -    qh_fprintf(qhmem.ferr, 8144, "qh_memcheck: total size of freelists totfree is the same as qhmem.totfree\n", totfree);
    -} /* memcheck */
    -
    -/*----------------------------------
    -
    -  qh_memfree( object, insize )
    -    free up an object of size bytes
    -    size is insize from qh_memalloc
    -
    -  notes:
    -    object may be NULL
    -    type checking warns if using (void **)object
    -    use qh_memfree_() for quick free's of small objects
    -
    -  design:
    -    if size <= qhmem.LASTsize
    -      append object to corresponding freelist
    -    else
    -      call qh_free(object)
    -*/
    -void qh_memfree(void *object, int insize) {
    -  void **freelistp;
    -  int idx, outsize;
    -
    -  if (!object)
    -    return;
    -  if (insize <= qhmem.LASTsize) {
    -    qhmem.freeshort++;
    -    idx= qhmem.indextable[insize];
    -    outsize= qhmem.sizetable[idx];
    -    qhmem.totfree += outsize;
    -    qhmem.totshort -= outsize;
    -    freelistp= qhmem.freelists + idx;
    -    *((void **)object)= *freelistp;
    -    *freelistp= object;
    -#ifdef qh_TRACEshort
    -    idx= qhmem.cntshort+qhmem.cntquick+qhmem.freeshort;
    -    if (qhmem.IStracing >= 5)
    -        qh_fprintf(qhmem.ferr, 8142, "qh_mem %p n %8d free short: %d bytes (tot %d cnt %d)\n", object, idx, outsize, qhmem.totshort, qhmem.cntshort+qhmem.cntquick-qhmem.freeshort);
    -#endif
    -  }else {
    -    qhmem.freelong++;
    -    qhmem.totlong -= insize;
    -    if (qhmem.IStracing >= 5)
    -      qh_fprintf(qhmem.ferr, 8058, "qh_mem %p n %8d free long: %d bytes (tot %d cnt %d)\n", object, qhmem.cntlong+qhmem.freelong, insize, qhmem.totlong, qhmem.cntlong-qhmem.freelong);
    -    qh_free(object);
    -  }
    -} /* memfree */
    -
    -
    -/*---------------------------------
    -
    -  qh_memfreeshort( curlong, totlong )
    -    frees up all short and qhmem memory allocations
    -
    -  returns:
    -    number and size of current long allocations
    -
    -  see:
    -    qh_freeqhull(allMem)
    -    qh_memtotal(curlong, totlong, curshort, totshort, maxlong, totbuffer);
    -*/
    -void qh_memfreeshort(int *curlong, int *totlong) {
    -  void *buffer, *nextbuffer;
    -  FILE *ferr;
    -
    -  *curlong= qhmem.cntlong - qhmem.freelong;
    -  *totlong= qhmem.totlong;
    -  for (buffer= qhmem.curbuffer; buffer; buffer= nextbuffer) {
    -    nextbuffer= *((void **) buffer);
    -    qh_free(buffer);
    -  }
    -  qhmem.curbuffer= NULL;
    -  if (qhmem.LASTsize) {
    -    qh_free(qhmem.indextable);
    -    qh_free(qhmem.freelists);
    -    qh_free(qhmem.sizetable);
    -  }
    -  ferr= qhmem.ferr;
    -  memset((char *)&qhmem, 0, sizeof(qhmem));  /* every field is 0, FALSE, NULL */
    -  qhmem.ferr= ferr;
    -} /* memfreeshort */
    -
    -
    -/*----------------------------------
    -
    -  qh_meminit( ferr )
    -    initialize qhmem and test sizeof( void*)
    -    Does not throw errors.  qh_exit on failure
    -*/
    -void qh_meminit(FILE *ferr) {
    -
    -  memset((char *)&qhmem, 0, sizeof(qhmem));  /* every field is 0, FALSE, NULL */
    -  if (ferr)
    -    qhmem.ferr= ferr;
    -  else
    -    qhmem.ferr= stderr;
    -  if (sizeof(void*) < sizeof(int)) {
    -    qh_fprintf(qhmem.ferr, 6083, "qhull internal error (qh_meminit): sizeof(void*) %d < sizeof(int) %d.  qset.c will not work\n", (int)sizeof(void*), (int)sizeof(int));
    -    qh_exit(qhmem_ERRqhull);  /* can not use qh_errexit() */
    -  }
    -  if (sizeof(void*) > sizeof(ptr_intT)) {
    -      qh_fprintf(qhmem.ferr, 6084, "qhull internal error (qh_meminit): sizeof(void*) %d > sizeof(ptr_intT) %d. Change ptr_intT in mem.h to 'long long'\n", (int)sizeof(void*), (int)sizeof(ptr_intT));
    -      qh_exit(qhmem_ERRqhull);  /* can not use qh_errexit() */
    -  }
    -  qh_memcheck();
    -} /* meminit */
    -
    -/*---------------------------------
    -
    -  qh_meminitbuffers( tracelevel, alignment, numsizes, bufsize, bufinit )
    -    initialize qhmem
    -    if tracelevel >= 5, trace memory allocations
    -    alignment= desired address alignment for memory allocations
    -    numsizes= number of freelists
    -    bufsize=  size of additional memory buffers for short allocations
    -    bufinit=  size of initial memory buffer for short allocations
    -*/
    -void qh_meminitbuffers(int tracelevel, int alignment, int numsizes, int bufsize, int bufinit) {
    -
    -  qhmem.IStracing= tracelevel;
    -  qhmem.NUMsizes= numsizes;
    -  qhmem.BUFsize= bufsize;
    -  qhmem.BUFinit= bufinit;
    -  qhmem.ALIGNmask= alignment-1;
    -  if (qhmem.ALIGNmask & ~qhmem.ALIGNmask) {
    -    qh_fprintf(qhmem.ferr, 6085, "qhull internal error (qh_meminit): memory alignment %d is not a power of 2\n", alignment);
    -    qh_errexit(qhmem_ERRqhull, NULL, NULL);
    -  }
    -  qhmem.sizetable= (int *) calloc((size_t)numsizes, sizeof(int));
    -  qhmem.freelists= (void **) calloc((size_t)numsizes, sizeof(void *));
    -  if (!qhmem.sizetable || !qhmem.freelists) {
    -    qh_fprintf(qhmem.ferr, 6086, "qhull error (qh_meminit): insufficient memory\n");
    -    qh_errexit(qhmem_ERRmem, NULL, NULL);
    -  }
    -  if (qhmem.IStracing >= 1)
    -    qh_fprintf(qhmem.ferr, 8059, "qh_meminitbuffers: memory initialized with alignment %d\n", alignment);
    -} /* meminitbuffers */
    -
    -/*---------------------------------
    -
    -  qh_memsetup()
    -    set up memory after running memsize()
    -*/
    -void qh_memsetup(void) {
    -  int k,i;
    -
    -  qsort(qhmem.sizetable, (size_t)qhmem.TABLEsize, sizeof(int), qh_intcompare);
    -  qhmem.LASTsize= qhmem.sizetable[qhmem.TABLEsize-1];
    -  if (qhmem.LASTsize >= qhmem.BUFsize || qhmem.LASTsize >= qhmem.BUFinit) {
    -    qh_fprintf(qhmem.ferr, 6087, "qhull error (qh_memsetup): largest mem size %d is >= buffer size %d or initial buffer size %d\n",
    -            qhmem.LASTsize, qhmem.BUFsize, qhmem.BUFinit);
    -    qh_errexit(qhmem_ERRmem, NULL, NULL);
    -  }
    -  if (!(qhmem.indextable= (int *)qh_malloc((qhmem.LASTsize+1) * sizeof(int)))) {
    -    qh_fprintf(qhmem.ferr, 6088, "qhull error (qh_memsetup): insufficient memory\n");
    -    qh_errexit(qhmem_ERRmem, NULL, NULL);
    -  }
    -  for (k=qhmem.LASTsize+1; k--; )
    -    qhmem.indextable[k]= k;
    -  i= 0;
    -  for (k=0; k <= qhmem.LASTsize; k++) {
    -    if (qhmem.indextable[k] <= qhmem.sizetable[i])
    -      qhmem.indextable[k]= i;
    -    else
    -      qhmem.indextable[k]= ++i;
    -  }
    -} /* memsetup */
    -
    -/*---------------------------------
    -
    -  qh_memsize( size )
    -    define a free list for this size
    -*/
    -void qh_memsize(int size) {
    -  int k;
    -
    -  if (qhmem.LASTsize) {
    -    qh_fprintf(qhmem.ferr, 6089, "qhull error (qh_memsize): called after qhmem_setup\n");
    -    qh_errexit(qhmem_ERRqhull, NULL, NULL);
    -  }
    -  size= (size + qhmem.ALIGNmask) & ~qhmem.ALIGNmask;
    -  for (k=qhmem.TABLEsize; k--; ) {
    -    if (qhmem.sizetable[k] == size)
    -      return;
    -  }
    -  if (qhmem.TABLEsize < qhmem.NUMsizes)
    -    qhmem.sizetable[qhmem.TABLEsize++]= size;
    -  else
    -    qh_fprintf(qhmem.ferr, 7060, "qhull warning (memsize): free list table has room for only %d sizes\n", qhmem.NUMsizes);
    -} /* memsize */
    -
    -
    -/*---------------------------------
    -
    -  qh_memstatistics( fp )
    -    print out memory statistics
    -
    -    Verifies that qhmem.totfree == sum of freelists
    -*/
    -void qh_memstatistics(FILE *fp) {
    -  int i;
    -  int count;
    -  void *object;
    -
    -  qh_memcheck();
    -  qh_fprintf(fp, 9278, "\nmemory statistics:\n\
    -%7d quick allocations\n\
    -%7d short allocations\n\
    -%7d long allocations\n\
    -%7d short frees\n\
    -%7d long frees\n\
    -%7d bytes of short memory in use\n\
    -%7d bytes of short memory in freelists\n\
    -%7d bytes of dropped short memory\n\
    -%7d bytes of unused short memory (estimated)\n\
    -%7d bytes of long memory allocated (max, except for input)\n\
    -%7d bytes of long memory in use (in %d pieces)\n\
    -%7d bytes of short memory buffers (minus links)\n\
    -%7d bytes per short memory buffer (initially %d bytes)\n",
    -           qhmem.cntquick, qhmem.cntshort, qhmem.cntlong,
    -           qhmem.freeshort, qhmem.freelong,
    -           qhmem.totshort, qhmem.totfree,
    -           qhmem.totdropped + qhmem.freesize, qhmem.totunused,
    -           qhmem.maxlong, qhmem.totlong, qhmem.cntlong - qhmem.freelong,
    -           qhmem.totbuffer, qhmem.BUFsize, qhmem.BUFinit);
    -  if (qhmem.cntlarger) {
    -    qh_fprintf(fp, 9279, "%7d calls to qh_setlarger\n%7.2g     average copy size\n",
    -           qhmem.cntlarger, ((float)qhmem.totlarger)/(float)qhmem.cntlarger);
    -    qh_fprintf(fp, 9280, "  freelists(bytes->count):");
    -  }
    -  for (i=0; i < qhmem.TABLEsize; i++) {
    -    count=0;
    -    for (object= qhmem.freelists[i]; object; object= *((void **)object))
    -      count++;
    -    qh_fprintf(fp, 9281, " %d->%d", qhmem.sizetable[i], count);
    -  }
    -  qh_fprintf(fp, 9282, "\n\n");
    -} /* memstatistics */
    -
    -
    -/*---------------------------------
    -
    -  qh_NOmem
    -    turn off quick-fit memory allocation
    -
    -  notes:
    -    uses qh_malloc() and qh_free() instead
    -*/
    -#else /* qh_NOmem */
    -
    -void *qh_memalloc(int insize) {
    -  void *object;
    -
    -  if (!(object= qh_malloc((size_t)insize))) {
    -    qh_fprintf(qhmem.ferr, 6090, "qhull error (qh_memalloc): insufficient memory\n");
    -    qh_errexit(qhmem_ERRmem, NULL, NULL);
    -  }
    -  qhmem.cntlong++;
    -  qhmem.totlong += insize;
    -  if (qhmem.maxlong < qhmem.totlong)
    -      qhmem.maxlong= qhmem.totlong;
    -  if (qhmem.IStracing >= 5)
    -    qh_fprintf(qhmem.ferr, 8060, "qh_mem %p n %8d alloc long: %d bytes (tot %d cnt %d)\n", object, qhmem.cntlong+qhmem.freelong, insize, qhmem.totlong, qhmem.cntlong-qhmem.freelong);
    -  return object;
    -}
    -
    -void qh_memfree(void *object, int insize) {
    -
    -  if (!object)
    -    return;
    -  qh_free(object);
    -  qhmem.freelong++;
    -  qhmem.totlong -= insize;
    -  if (qhmem.IStracing >= 5)
    -    qh_fprintf(qhmem.ferr, 8061, "qh_mem %p n %8d free long: %d bytes (tot %d cnt %d)\n", object, qhmem.cntlong+qhmem.freelong, insize, qhmem.totlong, qhmem.cntlong-qhmem.freelong);
    -}
    -
    -void qh_memfreeshort(int *curlong, int *totlong) {
    -  *totlong= qhmem.totlong;
    -  *curlong= qhmem.cntlong - qhmem.freelong;
    -  memset((char *)&qhmem, 0, sizeof(qhmem));  /* every field is 0, FALSE, NULL */
    -}
    -
    -void qh_meminit(FILE *ferr) {
    -
    -  memset((char *)&qhmem, 0, sizeof(qhmem));  /* every field is 0, FALSE, NULL */
    -  if (ferr)
    -      qhmem.ferr= ferr;
    -  else
    -      qhmem.ferr= stderr;
    -  if (sizeof(void*) < sizeof(int)) {
    -    qh_fprintf(qhmem.ferr, 6091, "qhull internal error (qh_meminit): sizeof(void*) %d < sizeof(int) %d.  qset.c will not work\n", (int)sizeof(void*), (int)sizeof(int));
    -    qh_errexit(qhmem_ERRqhull, NULL, NULL);
    -  }
    -}
    -
    -void qh_meminitbuffers(int tracelevel, int alignment, int numsizes, int bufsize, int bufinit) {
    -
    -  qhmem.IStracing= tracelevel;
    -}
    -
    -void qh_memsetup(void) {
    -
    -}
    -
    -void qh_memsize(int size) {
    -
    -}
    -
    -void qh_memstatistics(FILE *fp) {
    -
    -  qh_fprintf(fp, 9409, "\nmemory statistics:\n\
    -%7d long allocations\n\
    -%7d long frees\n\
    -%7d bytes of long memory allocated (max, except for input)\n\
    -%7d bytes of long memory in use (in %d pieces)\n",
    -           qhmem.cntlong,
    -           qhmem.freelong,
    -           qhmem.maxlong, qhmem.totlong, qhmem.cntlong - qhmem.freelong);
    -}
    -
    -#endif /* qh_NOmem */
    -
    -/*---------------------------------
    -
    -  qh_memtotal( totlong, curlong, totshort, curshort, maxlong, totbuffer )
    -    Return the total, allocated long and short memory
    -
    -  returns:
    -    Returns the total current bytes of long and short allocations
    -    Returns the current count of long and short allocations
    -    Returns the maximum long memory and total short buffer (minus one link per buffer)
    -    Does not error (UsingLibQhull.cpp)
    -*/
    -void qh_memtotal(int *totlong, int *curlong, int *totshort, int *curshort, int *maxlong, int *totbuffer) {
    -    *totlong= qhmem.totlong;
    -    *curlong= qhmem.cntlong - qhmem.freelong;
    -    *totshort= qhmem.totshort;
    -    *curshort= qhmem.cntshort + qhmem.cntquick - qhmem.freeshort;
    -    *maxlong= qhmem.maxlong;
    -    *totbuffer= qhmem.totbuffer;
    -} /* memtotlong */
    -
    diff --git a/src/qhull/src/libqhull/mem.h b/src/qhull/src/libqhull/mem.h
    deleted file mode 100644
    index 453f319df3a..00000000000
    --- a/src/qhull/src/libqhull/mem.h
    +++ /dev/null
    @@ -1,222 +0,0 @@
    -/*
      ---------------------------------
    -
    -   mem.h
    -     prototypes for memory management functions
    -
    -   see qh-mem.htm, mem.c and qset.h
    -
    -   for error handling, writes message and calls
    -     qh_errexit(qhmem_ERRmem, NULL, NULL) if insufficient memory
    -       and
    -     qh_errexit(qhmem_ERRqhull, NULL, NULL) otherwise
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull/mem.h#2 $$Change: 2062 $
    -   $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    -*/
    -
    -#ifndef qhDEFmem
    -#define qhDEFmem 1
    -
    -#include 
    -
    -/*---------------------------------
    -
    -  qh_NOmem
    -    turn off quick-fit memory allocation
    -
    -  notes:
    -    mem.c implements Quickfit memory allocation for about 20% time
    -    savings.  If it fails on your machine, try to locate the
    -    problem, and send the answer to qhull@qhull.org.  If this can
    -    not be done, define qh_NOmem to use malloc/free instead.
    -
    -   #define qh_NOmem
    -*/
    -
    -/*---------------------------------
    -
    -qh_TRACEshort
    -Trace short and quick memory allocations at T5
    -
    -*/
    -#define qh_TRACEshort
    -
    -/*-------------------------------------------
    -    to avoid bus errors, memory allocation must consider alignment requirements.
    -    malloc() automatically takes care of alignment.   Since mem.c manages
    -    its own memory, we need to explicitly specify alignment in
    -    qh_meminitbuffers().
    -
    -    A safe choice is sizeof(double).  sizeof(float) may be used if doubles
    -    do not occur in data structures and pointers are the same size.  Be careful
    -    of machines (e.g., DEC Alpha) with large pointers.  If gcc is available,
    -    use __alignof__(double) or fmax_(__alignof__(float), __alignof__(void *)).
    -
    -   see qh_MEMalign in user.h for qhull's alignment
    -*/
    -
    -#define qhmem_ERRmem 4    /* matches qh_ERRmem in libqhull.h */
    -#define qhmem_ERRqhull 5  /* matches qh_ERRqhull in libqhull.h */
    -
    -/*----------------------------------
    -
    -  ptr_intT
    -    for casting a void * to an integer-type that holds a pointer
    -    Used for integer expressions (e.g., computing qh_gethash() in poly.c)
    -
    -  notes:
    -    WARN64 -- these notes indicate 64-bit issues
    -    On 64-bit machines, a pointer may be larger than an 'int'.
    -    qh_meminit()/mem.c checks that 'ptr_intT' holds a 'void*'
    -    ptr_intT is typically a signed value, but not necessarily so
    -    size_t is typically unsigned, but should match the parameter type
    -    Qhull uses int instead of size_t except for system calls such as malloc, qsort, qh_malloc, etc.
    -    This matches Qt convention and is easier to work with.
    -*/
    -#if (defined(__MINGW64__)) && defined(_WIN64)
    -typedef long long ptr_intT;
    -#elif (_MSC_VER) && defined(_WIN64)
    -typedef long long ptr_intT;
    -#else
    -typedef long ptr_intT;
    -#endif
    -
    -/*----------------------------------
    -
    -  qhmemT
    -    global memory structure for mem.c
    -
    - notes:
    -   users should ignore qhmem except for writing extensions
    -   qhmem is allocated in mem.c
    -
    -   qhmem could be swapable like qh and qhstat, but then
    -   multiple qh's and qhmem's would need to keep in synch.
    -   A swapable qhmem would also waste memory buffers.  As long
    -   as memory operations are atomic, there is no problem with
    -   multiple qh structures being active at the same time.
    -   If you need separate address spaces, you can swap the
    -   contents of qhmem.
    -*/
    -typedef struct qhmemT qhmemT;
    -extern qhmemT qhmem;
    -
    -#ifndef DEFsetT
    -#define DEFsetT 1
    -typedef struct setT setT;          /* defined in qset.h */
    -#endif
    -
    -/* Update qhmem in mem.c if add or remove fields */
    -struct qhmemT {               /* global memory management variables */
    -  int      BUFsize;           /* size of memory allocation buffer */
    -  int      BUFinit;           /* initial size of memory allocation buffer */
    -  int      TABLEsize;         /* actual number of sizes in free list table */
    -  int      NUMsizes;          /* maximum number of sizes in free list table */
    -  int      LASTsize;          /* last size in free list table */
    -  int      ALIGNmask;         /* worst-case alignment, must be 2^n-1 */
    -  void   **freelists;          /* free list table, linked by offset 0 */
    -  int     *sizetable;         /* size of each freelist */
    -  int     *indextable;        /* size->index table */
    -  void    *curbuffer;         /* current buffer, linked by offset 0 */
    -  void    *freemem;           /*   free memory in curbuffer */
    -  int      freesize;          /*   size of freemem in bytes */
    -  setT    *tempstack;         /* stack of temporary memory, managed by users */
    -  FILE    *ferr;              /* file for reporting errors when 'qh' may be undefined */
    -  int      IStracing;         /* =5 if tracing memory allocations */
    -  int      cntquick;          /* count of quick allocations */
    -                              /* Note: removing statistics doesn't effect speed */
    -  int      cntshort;          /* count of short allocations */
    -  int      cntlong;           /* count of long allocations */
    -  int      freeshort;         /* count of short memfrees */
    -  int      freelong;          /* count of long memfrees */
    -  int      totbuffer;         /* total short memory buffers minus buffer links */
    -  int      totdropped;        /* total dropped memory at end of short memory buffers (e.g., freesize) */
    -  int      totfree;           /* total size of free, short memory on freelists */
    -  int      totlong;           /* total size of long memory in use */
    -  int      maxlong;           /*   maximum totlong */
    -  int      totshort;          /* total size of short memory in use */
    -  int      totunused;         /* total unused short memory (estimated, short size - request size of first allocations) */
    -  int      cntlarger;         /* count of setlarger's */
    -  int      totlarger;         /* total copied by setlarger */
    -};
    -
    -
    -/*==================== -macros ====================*/
    -
    -/*----------------------------------
    -
    -  qh_memalloc_(insize, freelistp, object, type)
    -    returns object of size bytes
    -        assumes size<=qhmem.LASTsize and void **freelistp is a temp
    -*/
    -
    -#if defined qh_NOmem
    -#define qh_memalloc_(insize, freelistp, object, type) {\
    -  object= (type*)qh_memalloc(insize); }
    -#elif defined qh_TRACEshort
    -#define qh_memalloc_(insize, freelistp, object, type) {\
    -    freelistp= NULL; /* Avoid warnings */ \
    -    object= (type*)qh_memalloc(insize); }
    -#else /* !qh_NOmem */
    -
    -#define qh_memalloc_(insize, freelistp, object, type) {\
    -  freelistp= qhmem.freelists + qhmem.indextable[insize];\
    -  if ((object= (type*)*freelistp)) {\
    -    qhmem.totshort += qhmem.sizetable[qhmem.indextable[insize]]; \
    -    qhmem.totfree -= qhmem.sizetable[qhmem.indextable[insize]]; \
    -    qhmem.cntquick++;  \
    -    *freelistp= *((void **)*freelistp);\
    -  }else object= (type*)qh_memalloc(insize);}
    -#endif
    -
    -/*----------------------------------
    -
    -  qh_memfree_(object, insize, freelistp)
    -    free up an object
    -
    -  notes:
    -    object may be NULL
    -    assumes size<=qhmem.LASTsize and void **freelistp is a temp
    -*/
    -#if defined qh_NOmem
    -#define qh_memfree_(object, insize, freelistp) {\
    -  qh_memfree(object, insize); }
    -#elif defined qh_TRACEshort
    -#define qh_memfree_(object, insize, freelistp) {\
    -    freelistp= NULL; /* Avoid warnings */ \
    -    qh_memfree(object, insize); }
    -#else /* !qh_NOmem */
    -
    -#define qh_memfree_(object, insize, freelistp) {\
    -  if (object) { \
    -    qhmem.freeshort++;\
    -    freelistp= qhmem.freelists + qhmem.indextable[insize];\
    -    qhmem.totshort -= qhmem.sizetable[qhmem.indextable[insize]]; \
    -    qhmem.totfree += qhmem.sizetable[qhmem.indextable[insize]]; \
    -    *((void **)object)= *freelistp;\
    -    *freelistp= object;}}
    -#endif
    -
    -/*=============== prototypes in alphabetical order ============*/
    -
    -void *qh_memalloc(int insize);
    -void qh_memcheck(void);
    -void qh_memfree(void *object, int insize);
    -void qh_memfreeshort(int *curlong, int *totlong);
    -void qh_meminit(FILE *ferr);
    -void qh_meminitbuffers(int tracelevel, int alignment, int numsizes,
    -                        int bufsize, int bufinit);
    -void qh_memsetup(void);
    -void qh_memsize(int size);
    -void qh_memstatistics(FILE *fp);
    -void qh_memtotal(int *totlong, int *curlong, int *totshort, int *curshort, int *maxlong, int *totbuffer);
    -
    -#endif /* qhDEFmem */
    diff --git a/src/qhull/src/libqhull/merge.c b/src/qhull/src/libqhull/merge.c
    deleted file mode 100644
    index 22104dc0313..00000000000
    --- a/src/qhull/src/libqhull/merge.c
    +++ /dev/null
    @@ -1,3628 +0,0 @@
    -/*
      ---------------------------------
    -
    -   merge.c
    -   merges non-convex facets
    -
    -   see qh-merge.htm and merge.h
    -
    -   other modules call qh_premerge() and qh_postmerge()
    -
    -   the user may call qh_postmerge() to perform additional merges.
    -
    -   To remove deleted facets and vertices (qhull() in libqhull.c):
    -     qh_partitionvisible(!qh_ALL, &numoutside);  // visible_list, newfacet_list
    -     qh_deletevisible();         // qh.visible_list
    -     qh_resetlists(False, qh_RESETvisible);       // qh.visible_list newvertex_list newfacet_list
    -
    -   assumes qh.CENTERtype= centrum
    -
    -   merges occur in qh_mergefacet and in qh_mergecycle
    -   vertex->neighbors not set until the first merge occurs
    -
    -   Copyright (c) 1993-2015 C.B. Barber.
    -   $Id: //main/2015/qhull/src/libqhull/merge.c#4 $$Change: 2064 $
    -   $DateTime: 2016/01/18 12:36:08 $$Author: bbarber $
    -*/
    -
    -#include "qhull_a.h"
    -
    -#ifndef qh_NOmerge
    -
    -/*===== functions(alphabetical after premerge and postmerge) ======*/
    -
    -/*---------------------------------
    -
    -  qh_premerge( apex, maxcentrum )
    -    pre-merge nonconvex facets in qh.newfacet_list for apex
    -    maxcentrum defines coplanar and concave (qh_test_appendmerge)
    -
    -  returns:
    -    deleted facets added to qh.visible_list with facet->visible set
    -
    -  notes:
    -    uses globals, qh.MERGEexact, qh.PREmerge
    -
    -  design:
    -    mark duplicate ridges in qh.newfacet_list
    -    merge facet cycles in qh.newfacet_list
    -    merge duplicate ridges and concave facets in qh.newfacet_list
    -    check merged facet cycles for degenerate and redundant facets
    -    merge degenerate and redundant facets
    -    collect coplanar and concave facets
    -    merge concave, coplanar, degenerate, and redundant facets
    -*/
    -void qh_premerge(vertexT *apex, realT maxcentrum, realT maxangle) {
    -  boolT othermerge= False;
    -  facetT *newfacet;
    -
    -  if (qh ZEROcentrum && qh_checkzero(!qh_ALL))
    -    return;
    -  trace2((qh ferr, 2008, "qh_premerge: premerge centrum %2.2g angle %2.2g for apex v%d facetlist f%d\n",
    -            maxcentrum, maxangle, apex->id, getid_(qh newfacet_list)));
    -  if (qh IStracing >= 4 && qh num_facets < 50)
    -    qh_printlists();
    -  qh centrum_radius= maxcentrum;
    -  qh cos_max= maxangle;
    -  qh degen_mergeset= qh_settemp(qh TEMPsize);
    -  qh facet_mergeset= qh_settemp(qh TEMPsize);
    -  if (qh hull_dim >=3) {
    -    qh_mark_dupridges(qh newfacet_list); /* facet_mergeset */
    -    qh_mergecycle_all(qh newfacet_list, &othermerge);
    -    qh_forcedmerges(&othermerge /* qh.facet_mergeset */);
    -    FORALLnew_facets {  /* test samecycle merges */
    -      if (!newfacet->simplicial && !newfacet->mergeridge)
    -        qh_degen_redundant_neighbors(newfacet, NULL);
    -    }
    -    if (qh_merge_degenredundant())
    -      othermerge= True;
    -  }else /* qh.hull_dim == 2 */
    -    qh_mergecycle_all(qh newfacet_list, &othermerge);
    -  qh_flippedmerges(qh newfacet_list, &othermerge);
    -  if (!qh MERGEexact || zzval_(Ztotmerge)) {
    -    zinc_(Zpremergetot);
    -    qh POSTmerging= False;
    -    qh_getmergeset_initial(qh newfacet_list);
    -    qh_all_merges(othermerge, False);
    -  }
    -  qh_settempfree(&qh facet_mergeset);
    -  qh_settempfree(&qh degen_mergeset);
    -} /* premerge */
    -
    -/*---------------------------------
    -
    -  qh_postmerge( reason, maxcentrum, maxangle, vneighbors )
    -    post-merge nonconvex facets as defined by maxcentrum and maxangle
    -    'reason' is for reporting progress
    -    if vneighbors,
    -      calls qh_test_vneighbors at end of qh_all_merge
    -    if firstmerge,
    -      calls qh_reducevertices before qh_getmergeset
    -
    -  returns:
    -    if first call (qh.visible_list != qh.facet_list),
    -      builds qh.facet_newlist, qh.newvertex_list
    -    deleted facets added to qh.visible_list with facet->visible
    -    qh.visible_list == qh.facet_list
    -
    -  notes:
    -
    -
    -  design:
    -    if first call
    -      set qh.visible_list and qh.newfacet_list to qh.facet_list
    -      add all facets to qh.newfacet_list
    -      mark non-simplicial facets, facet->newmerge
    -      set qh.newvertext_list to qh.vertex_list
    -      add all vertices to qh.newvertex_list
    -      if a pre-merge occured
    -        set vertex->delridge {will retest the ridge}
    -        if qh.MERGEexact
    -          call qh_reducevertices()
    -      if no pre-merging
    -        merge flipped facets
    -    determine non-convex facets
    -    merge all non-convex facets
    -*/
    -void qh_postmerge(const char *reason, realT maxcentrum, realT maxangle,
    -                      boolT vneighbors) {
    -  facetT *newfacet;
    -  boolT othermerges= False;
    -  vertexT *vertex;
    -
    -  if (qh REPORTfreq || qh IStracing) {
    -    qh_buildtracing(NULL, NULL);
    -    qh_printsummary(qh ferr);
    -    if (qh PRINTstatistics)
    -      qh_printallstatistics(qh ferr, "reason");
    -    qh_fprintf(qh ferr, 8062, "\n%s with 'C%.2g' and 'A%.2g'\n",
    -        reason, maxcentrum, maxangle);
    -  }
    -  trace2((qh ferr, 2009, "qh_postmerge: postmerge.  test vneighbors? %d\n",
    -            vneighbors));
    -  qh centrum_radius= maxcentrum;
    -  qh cos_max= maxangle;
    -  qh POSTmerging= True;
    -  qh degen_mergeset= qh_settemp(qh TEMPsize);
    -  qh facet_mergeset= qh_settemp(qh TEMPsize);
    -  if (qh visible_list != qh facet_list) {  /* first call */
    -    qh NEWfacets= True;
    -    qh visible_list= qh newfacet_list= qh facet_list;
    -    FORALLnew_facets {
    -      newfacet->newfacet= True;
    -       if (!newfacet->simplicial)
    -        newfacet->newmerge= True;
    -     zinc_(Zpostfacets);
    -    }
    -    qh newvertex_list= qh vertex_list;
    -    FORALLvertices
    -      vertex->newlist= True;
    -    if (qh VERTEXneighbors) { /* a merge has occurred */
    -      FORALLvertices
    -        vertex->delridge= True; /* test for redundant, needed? */
    -      if (qh MERGEexact) {
    -        if (qh hull_dim <= qh_DIMreduceBuild)
    -          qh_reducevertices(); /* was skipped during pre-merging */
    -      }
    -    }
    -    if (!qh PREmerge && !qh MERGEexact)
    -      qh_flippedmerges(qh newfacet_list, &othermerges);
    -  }
    -  qh_getmergeset_initial(qh newfacet_list);
    -  qh_all_merges(False, vneighbors);
    -  qh_settempfree(&qh facet_mergeset);
    -  qh_settempfree(&qh degen_mergeset);
    -} /* post_merge */
    -
    -/*---------------------------------
    -
    -  qh_all_merges( othermerge, vneighbors )
    -    merge all non-convex facets
    -
    -    set othermerge if already merged facets (for qh_reducevertices)
    -    if vneighbors
    -      tests vertex neighbors for convexity at end
    -    qh.facet_mergeset lists the non-convex ridges in qh_newfacet_list
    -    qh.degen_mergeset is defined
    -    if qh.MERGEexact && !qh.POSTmerging,
    -      does not merge coplanar facets
    -
    -  returns:
    -    deleted facets added to qh.visible_list with facet->visible
    -    deleted vertices added qh.delvertex_list with vertex->delvertex
    -
    -  notes:
    -    unless !qh.MERGEindependent,
    -      merges facets in independent sets
    -    uses qh.newfacet_list as argument since merges call qh_removefacet()
    -
    -  design:
    -    while merges occur
    -      for each merge in qh.facet_mergeset
    -        unless one of the facets was already merged in this pass
    -          merge the facets
    -        test merged facets for additional merges
    -        add merges to qh.facet_mergeset
    -      if vertices record neighboring facets
    -        rename redundant vertices
    -          update qh.facet_mergeset
    -    if vneighbors ??
    -      tests vertex neighbors for convexity at end
    -*/
    -void qh_all_merges(boolT othermerge, boolT vneighbors) {
    -  facetT *facet1, *facet2;
    -  mergeT *merge;
    -  boolT wasmerge= True, isreduce;
    -  void **freelistp;  /* used if !qh_NOmem by qh_memfree_() */
    -  vertexT *vertex;
    -  mergeType mergetype;
    -  int numcoplanar=0, numconcave=0, numdegenredun= 0, numnewmerges= 0;
    -
    -  trace2((qh ferr, 2010, "qh_all_merges: starting to merge facets beginning from f%d\n",
    -            getid_(qh newfacet_list)));
    -  while (True) {
    -    wasmerge= False;
    -    while (qh_setsize(qh facet_mergeset)) {
    -      while ((merge= (mergeT*)qh_setdellast(qh facet_mergeset))) {
    -        facet1= merge->facet1;
    -        facet2= merge->facet2;
    -        mergetype= merge->type;
    -        qh_memfree_(merge, (int)sizeof(mergeT), freelistp);
    -        if (facet1->visible || facet2->visible) /*deleted facet*/
    -          continue;
    -        if ((facet1->newfacet && !facet1->tested)
    -                || (facet2->newfacet && !facet2->tested)) {
    -          if (qh MERGEindependent && mergetype <= MRGanglecoplanar)
    -            continue;      /* perform independent sets of merges */
    -        }
    -        qh_merge_nonconvex(facet1, facet2, mergetype);
    -        numdegenredun += qh_merge_degenredundant();
    -        numnewmerges++;
    -        wasmerge= True;
    -        if (mergetype == MRGconcave)
    -          numconcave++;
    -        else /* MRGcoplanar or MRGanglecoplanar */
    -          numcoplanar++;
    -      } /* while setdellast */
    -      if (qh POSTmerging && qh hull_dim <= qh_DIMreduceBuild
    -      && numnewmerges > qh_MAXnewmerges) {
    -        numnewmerges= 0;
    -        qh_reducevertices();  /* otherwise large post merges too slow */
    -      }
    -      qh_getmergeset(qh newfacet_list); /* facet_mergeset */
    -    } /* while mergeset */
    -    if (qh VERTEXneighbors) {
    -      isreduce= False;
    -      if (qh hull_dim >=4 && qh POSTmerging) {
    -        FORALLvertices
    -          vertex->delridge= True;
    -        isreduce= True;
    -      }
    -      if ((wasmerge || othermerge) && (!qh MERGEexact || qh POSTmerging)
    -          && qh hull_dim <= qh_DIMreduceBuild) {
    -        othermerge= False;
    -        isreduce= True;
    -      }
    -      if (isreduce) {
    -        if (qh_reducevertices()) {
    -          qh_getmergeset(qh newfacet_list); /* facet_mergeset */
    -          continue;
    -        }
    -      }
    -    }
    -    if (vneighbors && qh_test_vneighbors(/* qh.newfacet_list */))
    -      continue;
    -    break;
    -  } /* while (True) */
    -  if (qh CHECKfrequently && !qh MERGEexact) {
    -    qh old_randomdist= qh RANDOMdist;
    -    qh RANDOMdist= False;
    -    qh_checkconvex(qh newfacet_list, qh_ALGORITHMfault);
    -    /* qh_checkconnect(); [this is slow and it changes the facet order] */
    -    qh RANDOMdist= qh old_randomdist;
    -  }
    -  trace1((qh ferr, 1009, "qh_all_merges: merged %d coplanar facets %d concave facets and %d degen or redundant facets.\n",
    -    numcoplanar, numconcave, numdegenredun));
    -  if (qh IStracing >= 4 && qh num_facets < 50)
    -    qh_printlists();
    -} /* all_merges */
    -
    -
    -/*---------------------------------
    -
    -  qh_appendmergeset( facet, neighbor, mergetype, angle )
    -    appends an entry to qh.facet_mergeset or qh.degen_mergeset
    -
    -    angle ignored if NULL or !qh.ANGLEmerge
    -
    -  returns:
    -    merge appended to facet_mergeset or degen_mergeset
    -      sets ->degenerate or ->redundant if degen_mergeset
    -
    -  see:
    -    qh_test_appendmerge()
    -
    -  design:
    -    allocate merge entry
    -    if regular merge
    -      append to qh.facet_mergeset
    -    else if degenerate merge and qh.facet_mergeset is all degenerate
    -      append to qh.degen_mergeset
    -    else if degenerate merge
    -      prepend to qh.degen_mergeset
    -    else if redundant merge
    -      append to qh.degen_mergeset
    -*/
    -void qh_appendmergeset(facetT *facet, facetT *neighbor, mergeType mergetype, realT *angle) {
    -  mergeT *merge, *lastmerge;
    -  void **freelistp; /* used if !qh_NOmem by qh_memalloc_() */
    -
    -  if (facet->redundant)
    -    return;
    -  if (facet->degenerate && mergetype == MRGdegen)
    -    return;
    -  qh_memalloc_((int)sizeof(mergeT), freelistp, merge, mergeT);
    -  merge->facet1= facet;
    -  merge->facet2= neighbor;
    -  merge->type= mergetype;
    -  if (angle && qh ANGLEmerge)
    -    merge->angle= *angle;
    -  if (mergetype < MRGdegen)
    -    qh_setappend(&(qh facet_mergeset), merge);
    -  else if (mergetype == MRGdegen) {
    -    facet->degenerate= True;
    -    if (!(lastmerge= (mergeT*)qh_setlast(qh degen_mergeset))
    -    || lastmerge->type == MRGdegen)
    -      qh_setappend(&(qh degen_mergeset), merge);
    -    else
    -      qh_setaddnth(&(qh degen_mergeset), 0, merge);
    -  }else if (mergetype == MRGredundant) {
    -    facet->redundant= True;
    -    qh_setappend(&(qh degen_mergeset), merge);
    -  }else /* mergetype == MRGmirror */ {
    -    if (facet->redundant || neighbor->redundant) {
    -      qh_fprintf(qh ferr, 6092, "qhull error (qh_appendmergeset): facet f%d or f%d is already a mirrored facet\n",
    -           facet->id, neighbor->id);
    -      qh_errexit2(qh_ERRqhull, facet, neighbor);
    -    }
    -    if (!qh_setequal(facet->vertices, neighbor->vertices)) {
    -      qh_fprintf(qh ferr, 6093, "qhull error (qh_appendmergeset): mirrored facets f%d and f%d do not have the same vertices\n",
    -           facet->id, neighbor->id);
    -      qh_errexit2(qh_ERRqhull, facet, neighbor);
    -    }
    -    facet->redundant= True;
    -    neighbor->redundant= True;
    -    qh_setappend(&(qh degen_mergeset), merge);
    -  }
    -} /* appendmergeset */
    -
    -
    -/*---------------------------------
    -
    -  qh_basevertices( samecycle )
    -    return temporary set of base vertices for samecycle
    -    samecycle is first facet in the cycle
    -    assumes apex is SETfirst_( samecycle->vertices )
    -
    -  returns:
    -    vertices(settemp)
    -    all ->seen are cleared
    -
    -  notes:
    -    uses qh_vertex_visit;
    -
    -  design:
    -    for each facet in samecycle
    -      for each unseen vertex in facet->vertices
    -        append to result
    -*/
    -setT *qh_basevertices(facetT *samecycle) {
    -  facetT *same;
    -  vertexT *apex, *vertex, **vertexp;
    -  setT *vertices= qh_settemp(qh TEMPsize);
    -
    -  apex= SETfirstt_(samecycle->vertices, vertexT);
    -  apex->visitid= ++qh vertex_visit;
    -  FORALLsame_cycle_(samecycle) {
    -    if (same->mergeridge)
    -      continue;
    -    FOREACHvertex_(same->vertices) {
    -      if (vertex->visitid != qh vertex_visit) {
    -        qh_setappend(&vertices, vertex);
    -        vertex->visitid= qh vertex_visit;
    -        vertex->seen= False;
    -      }
    -    }
    -  }
    -  trace4((qh ferr, 4019, "qh_basevertices: found %d vertices\n",
    -         qh_setsize(vertices)));
    -  return vertices;
    -} /* basevertices */
    -
    -/*---------------------------------
    -
    -  qh_checkconnect()
    -    check that new facets are connected
    -    new facets are on qh.newfacet_list
    -
    -  notes:
    -    this is slow and it changes the order of the facets
    -    uses qh.visit_id
    -
    -  design:
    -    move first new facet to end of qh.facet_list
    -    for all newly appended facets
    -      append unvisited neighbors to end of qh.facet_list
    -    for all new facets
    -      report error if unvisited
    -*/
    -void qh_checkconnect(void /* qh.newfacet_list */) {
    -  facetT *facet, *newfacet, *errfacet= NULL, *neighbor, **neighborp;
    -
    -  facet= qh newfacet_list;
    -  qh_removefacet(facet);
    -  qh_appendfacet(facet);
    -  facet->visitid= ++qh visit_id;
    -  FORALLfacet_(facet) {
    -    FOREACHneighbor_(facet) {
    -      if (neighbor->visitid != qh visit_id) {
    -        qh_removefacet(neighbor);
    -        qh_appendfacet(neighbor);
    -        neighbor->visitid= qh visit_id;
    -      }
    -    }
    -  }
    -  FORALLnew_facets {
    -    if (newfacet->visitid == qh visit_id)
    -      break;
    -    qh_fprintf(qh ferr, 6094, "qhull error: f%d is not attached to the new facets\n",
    -         newfacet->id);
    -    errfacet= newfacet;
    -  }
    -  if (errfacet)
    -    qh_errexit(qh_ERRqhull, errfacet, NULL);
    -} /* checkconnect */
    -
    -/*---------------------------------
    -
    -  qh_checkzero( testall )
    -    check that facets are clearly convex for qh.DISTround with qh.MERGEexact
    -
    -    if testall,
    -      test all facets for qh.MERGEexact post-merging
    -    else
    -      test qh.newfacet_list
    -
    -    if qh.MERGEexact,
    -      allows coplanar ridges
    -      skips convexity test while qh.ZEROall_ok
    -
    -  returns:
    -    True if all facets !flipped, !dupridge, normal
    -         if all horizon facets are simplicial
    -         if all vertices are clearly below neighbor
    -         if all opposite vertices of horizon are below
    -    clears qh.ZEROall_ok if any problems or coplanar facets
    -
    -  notes:
    -    uses qh.vertex_visit
    -    horizon facets may define multiple new facets
    -
    -  design:
    -    for all facets in qh.newfacet_list or qh.facet_list
    -      check for flagged faults (flipped, etc.)
    -    for all facets in qh.newfacet_list or qh.facet_list
    -      for each neighbor of facet
    -        skip horizon facets for qh.newfacet_list
    -        test the opposite vertex
    -      if qh.newfacet_list
    -        test the other vertices in the facet's horizon facet
    -*/
    -boolT qh_checkzero(boolT testall) {
    -  facetT *facet, *neighbor, **neighborp;
    -  facetT *horizon, *facetlist;
    -  int neighbor_i;
    -  vertexT *vertex, **vertexp;
    -  realT dist;
    -
    -  if (testall)
    -    facetlist= qh facet_list;
    -  else {
    -    facetlist= qh newfacet_list;
    -    FORALLfacet_(facetlist) {
    -      horizon= SETfirstt_(facet->neighbors, facetT);
    -      if (!horizon->simplicial)
    -        goto LABELproblem;
    -      if (facet->flipped || facet->dupridge || !facet->normal)
    -        goto LABELproblem;
    -    }
    -    if (qh MERGEexact && qh ZEROall_ok) {
    -      trace2((qh ferr, 2011, "qh_checkzero: skip convexity check until first pre-merge\n"));
    -      return True;
    -    }
    -  }
    -  FORALLfacet_(facetlist) {
    -    qh vertex_visit++;
    -    neighbor_i= 0;
    -    horizon= NULL;
    -    FOREACHneighbor_(facet) {
    -      if (!neighbor_i && !testall) {
    -        horizon= neighbor;
    -        neighbor_i++;
    -        continue; /* horizon facet tested in qh_findhorizon */
    -      }
    -      vertex= SETelemt_(facet->vertices, neighbor_i++, vertexT);
    -      vertex->visitid= qh vertex_visit;
    -      zzinc_(Zdistzero);
    -      qh_distplane(vertex->point, neighbor, &dist);
    -      if (dist >= -qh DISTround) {
    -        qh ZEROall_ok= False;
    -        if (!qh MERGEexact || testall || dist > qh DISTround)
    -          goto LABELnonconvex;
    -      }
    -    }
    -    if (!testall && horizon) {
    -      FOREACHvertex_(horizon->vertices) {
    -        if (vertex->visitid != qh vertex_visit) {
    -          zzinc_(Zdistzero);
    -          qh_distplane(vertex->point, facet, &dist);
    -          if (dist >= -qh DISTround) {
    -            qh ZEROall_ok= False;
    -            if (!qh MERGEexact || dist > qh DISTround)
    -              goto LABELnonconvex;
    -          }
    -          break;
    -        }
    -      }
    -    }
    -  }
    -  trace2((qh ferr, 2012, "qh_checkzero: testall %d, facets are %s\n", testall,
    -        (qh MERGEexact && !testall) ?
    -           "not concave, flipped, or duplicate ridged" : "clearly convex"));
    -  return True;
    -
    - LABELproblem:
    -  qh ZEROall_ok= False;
    -  trace2((qh ferr, 2013, "qh_checkzero: facet f%d needs pre-merging\n",
    -       facet->id));
    -  return False;
    -
    - LABELnonconvex:
    -  trace2((qh ferr, 2014, "qh_checkzero: facet f%d and f%d are not clearly convex.  v%d dist %.2g\n",
    -         facet->id, neighbor->id, vertex->id, dist));
    -  return False;
    -} /* checkzero */
    -
    -/*---------------------------------
    -
    -  qh_compareangle( angle1, angle2 )
    -    used by qsort() to order merges by angle
    -*/
    -int qh_compareangle(const void *p1, const void *p2) {
    -  const mergeT *a= *((mergeT *const*)p1), *b= *((mergeT *const*)p2);
    -
    -  return((a->angle > b->angle) ? 1 : -1);
    -} /* compareangle */
    -
    -/*---------------------------------
    -
    -  qh_comparemerge( merge1, merge2 )
    -    used by qsort() to order merges
    -*/
    -int qh_comparemerge(const void *p1, const void *p2) {
    -  const mergeT *a= *((mergeT *const*)p1), *b= *((mergeT *const*)p2);
    -
    -  return(a->type - b->type);
    -} /* comparemerge */
    -
    -/*---------------------------------
    -
    -  qh_comparevisit( vertex1, vertex2 )
    -    used by qsort() to order vertices by their visitid
    -*/
    -int qh_comparevisit(const void *p1, const void *p2) {
    -  const vertexT *a= *((vertexT *const*)p1), *b= *((vertexT *const*)p2);
    -
    -  return(a->visitid - b->visitid);
    -} /* comparevisit */
    -
    -/*---------------------------------
    -
    -  qh_copynonconvex( atridge )
    -    set non-convex flag on other ridges (if any) between same neighbors
    -
    -  notes:
    -    may be faster if use smaller ridge set
    -
    -  design:
    -    for each ridge of atridge's top facet
    -      if ridge shares the same neighbor
    -        set nonconvex flag
    -*/
    -void qh_copynonconvex(ridgeT *atridge) {
    -  facetT *facet, *otherfacet;
    -  ridgeT *ridge, **ridgep;
    -
    -  facet= atridge->top;
    -  otherfacet= atridge->bottom;
    -  FOREACHridge_(facet->ridges) {
    -    if (otherfacet == otherfacet_(ridge, facet) && ridge != atridge) {
    -      ridge->nonconvex= True;
    -      trace4((qh ferr, 4020, "qh_copynonconvex: moved nonconvex flag from r%d to r%d\n",
    -              atridge->id, ridge->id));
    -      break;
    -    }
    -  }
    -} /* copynonconvex */
    -
    -/*---------------------------------
    -
    -  qh_degen_redundant_facet( facet )
    -    check facet for degen. or redundancy
    -
    -  notes:
    -    bumps vertex_visit
    -    called if a facet was redundant but no longer is (qh_merge_degenredundant)
    -    qh_appendmergeset() only appends first reference to facet (i.e., redundant)
    -
    -  see:
    -    qh_degen_redundant_neighbors()
    -
    -  design:
    -    test for redundant neighbor
    -    test for degenerate facet
    -*/
    -void qh_degen_redundant_facet(facetT *facet) {
    -  vertexT *vertex, **vertexp;
    -  facetT *neighbor, **neighborp;
    -
    -  trace4((qh ferr, 4021, "qh_degen_redundant_facet: test facet f%d for degen/redundant\n",
    -          facet->id));
    -  FOREACHneighbor_(facet) {
    -    qh vertex_visit++;
    -    FOREACHvertex_(neighbor->vertices)
    -      vertex->visitid= qh vertex_visit;
    -    FOREACHvertex_(facet->vertices) {
    -      if (vertex->visitid != qh vertex_visit)
    -        break;
    -    }
    -    if (!vertex) {
    -      qh_appendmergeset(facet, neighbor, MRGredundant, NULL);
    -      trace2((qh ferr, 2015, "qh_degen_redundant_facet: f%d is contained in f%d.  merge\n", facet->id, neighbor->id));
    -      return;
    -    }
    -  }
    -  if (qh_setsize(facet->neighbors) < qh hull_dim) {
    -    qh_appendmergeset(facet, facet, MRGdegen, NULL);
    -    trace2((qh ferr, 2016, "qh_degen_redundant_neighbors: f%d is degenerate.\n", facet->id));
    -  }
    -} /* degen_redundant_facet */
    -
    -
    -/*---------------------------------
    -
    -  qh_degen_redundant_neighbors( facet, delfacet,  )
    -    append degenerate and redundant neighbors to facet_mergeset
    -    if delfacet,
    -      only checks neighbors of both delfacet and facet
    -    also checks current facet for degeneracy
    -
    -  notes:
    -    bumps vertex_visit
    -    called for each qh_mergefacet() and qh_mergecycle()
    -    merge and statistics occur in merge_nonconvex
    -    qh_appendmergeset() only appends first reference to facet (i.e., redundant)
    -      it appends redundant facets after degenerate ones
    -
    -    a degenerate facet has fewer than hull_dim neighbors
    -    a redundant facet's vertices is a subset of its neighbor's vertices
    -    tests for redundant merges first (appendmergeset is nop for others)
    -    in a merge, only needs to test neighbors of merged facet
    -
    -  see:
    -    qh_merge_degenredundant() and qh_degen_redundant_facet()
    -
    -  design:
    -    test for degenerate facet
    -    test for redundant neighbor
    -    test for degenerate neighbor
    -*/
    -void qh_degen_redundant_neighbors(facetT *facet, facetT *delfacet) {
    -  vertexT *vertex, **vertexp;
    -  facetT *neighbor, **neighborp;
    -  int size;
    -
    -  trace4((qh ferr, 4022, "qh_degen_redundant_neighbors: test neighbors of f%d with delfacet f%d\n",
    -          facet->id, getid_(delfacet)));
    -  if ((size= qh_setsize(facet->neighbors)) < qh hull_dim) {
    -    qh_appendmergeset(facet, facet, MRGdegen, NULL);
    -    trace2((qh ferr, 2017, "qh_degen_redundant_neighbors: f%d is degenerate with %d neighbors.\n", facet->id, size));
    -  }
    -  if (!delfacet)
    -    delfacet= facet;
    -  qh vertex_visit++;
    -  FOREACHvertex_(facet->vertices)
    -    vertex->visitid= qh vertex_visit;
    -  FOREACHneighbor_(delfacet) {
    -    /* uses early out instead of checking vertex count */
    -    if (neighbor == facet)
    -      continue;
    -    FOREACHvertex_(neighbor->vertices) {
    -      if (vertex->visitid != qh vertex_visit)
    -        break;
    -    }
    -    if (!vertex) {
    -      qh_appendmergeset(neighbor, facet, MRGredundant, NULL);
    -      trace2((qh ferr, 2018, "qh_degen_redundant_neighbors: f%d is contained in f%d.  merge\n", neighbor->id, facet->id));
    -    }
    -  }
    -  FOREACHneighbor_(delfacet) {   /* redundant merges occur first */
    -    if (neighbor == facet)
    -      continue;
    -    if ((size= qh_setsize(neighbor->neighbors)) < qh hull_dim) {
    -      qh_appendmergeset(neighbor, neighbor, MRGdegen, NULL);
    -      trace2((qh ferr, 2019, "qh_degen_redundant_neighbors: f%d is degenerate with %d neighbors.  Neighbor of f%d.\n", neighbor->id, size, facet->id));
    -    }
    -  }
    -} /* degen_redundant_neighbors */
    -
    -
    -/*---------------------------------
    -
    -  qh_find_newvertex( oldvertex, vertices, ridges )
    -    locate new vertex for renaming old vertex
    -    vertices is a set of possible new vertices
    -      vertices sorted by number of deleted ridges
    -
    -  returns:
    -    newvertex or NULL
    -      each ridge includes both vertex and oldvertex
    -    vertices sorted by number of deleted ridges
    -
    -  notes:
    -    modifies vertex->visitid
    -    new vertex is in one of the ridges
    -    renaming will not cause a duplicate ridge
    -    renaming will minimize the number of deleted ridges
    -    newvertex may not be adjacent in the dual (though unlikely)
    -
    -  design:
    -    for each vertex in vertices
    -      set vertex->visitid to number of references in ridges
    -    remove unvisited vertices
    -    set qh.vertex_visit above all possible values
    -    sort vertices by number of references in ridges
    -    add each ridge to qh.hash_table
    -    for each vertex in vertices
    -      look for a vertex that would not cause a duplicate ridge after a rename
    -*/
    -vertexT *qh_find_newvertex(vertexT *oldvertex, setT *vertices, setT *ridges) {
    -  vertexT *vertex, **vertexp;
    -  setT *newridges;
    -  ridgeT *ridge, **ridgep;
    -  int size, hashsize;
    -  int hash;
    -
    -#ifndef qh_NOtrace
    -  if (qh IStracing >= 4) {
    -    qh_fprintf(qh ferr, 8063, "qh_find_newvertex: find new vertex for v%d from ",
    -             oldvertex->id);
    -    FOREACHvertex_(vertices)
    -      qh_fprintf(qh ferr, 8064, "v%d ", vertex->id);
    -    FOREACHridge_(ridges)
    -      qh_fprintf(qh ferr, 8065, "r%d ", ridge->id);
    -    qh_fprintf(qh ferr, 8066, "\n");
    -  }
    -#endif
    -  FOREACHvertex_(vertices)
    -    vertex->visitid= 0;
    -  FOREACHridge_(ridges) {
    -    FOREACHvertex_(ridge->vertices)
    -      vertex->visitid++;
    -  }
    -  FOREACHvertex_(vertices) {
    -    if (!vertex->visitid) {
    -      qh_setdelnth(vertices, SETindex_(vertices,vertex));
    -      vertexp--; /* repeat since deleted this vertex */
    -    }
    -  }
    -  qh vertex_visit += (unsigned int)qh_setsize(ridges);
    -  if (!qh_setsize(vertices)) {
    -    trace4((qh ferr, 4023, "qh_find_newvertex: vertices not in ridges for v%d\n",
    -            oldvertex->id));
    -    return NULL;
    -  }
    -  qsort(SETaddr_(vertices, vertexT), (size_t)qh_setsize(vertices),
    -                sizeof(vertexT *), qh_comparevisit);
    -  /* can now use qh vertex_visit */
    -  if (qh PRINTstatistics) {
    -    size= qh_setsize(vertices);
    -    zinc_(Zintersect);
    -    zadd_(Zintersecttot, size);
    -    zmax_(Zintersectmax, size);
    -  }
    -  hashsize= qh_newhashtable(qh_setsize(ridges));
    -  FOREACHridge_(ridges)
    -    qh_hashridge(qh hash_table, hashsize, ridge, oldvertex);
    -  FOREACHvertex_(vertices) {
    -    newridges= qh_vertexridges(vertex);
    -    FOREACHridge_(newridges) {
    -      if (qh_hashridge_find(qh hash_table, hashsize, ridge, vertex, oldvertex, &hash)) {
    -        zinc_(Zdupridge);
    -        break;
    -      }
    -    }
    -    qh_settempfree(&newridges);
    -    if (!ridge)
    -      break;  /* found a rename */
    -  }
    -  if (vertex) {
    -    /* counted in qh_renamevertex */
    -    trace2((qh ferr, 2020, "qh_find_newvertex: found v%d for old v%d from %d vertices and %d ridges.\n",
    -      vertex->id, oldvertex->id, qh_setsize(vertices), qh_setsize(ridges)));
    -  }else {
    -    zinc_(Zfindfail);
    -    trace0((qh ferr, 14, "qh_find_newvertex: no vertex for renaming v%d(all duplicated ridges) during p%d\n",
    -      oldvertex->id, qh furthest_id));
    -  }
    -  qh_setfree(&qh hash_table);
    -  return vertex;
    -} /* find_newvertex */
    -
    -/*---------------------------------
    -
    -  qh_findbest_test( testcentrum, facet, neighbor, bestfacet, dist, mindist, maxdist )
    -    test neighbor of facet for qh_findbestneighbor()
    -    if testcentrum,
    -      tests centrum (assumes it is defined)
    -    else
    -      tests vertices
    -
    -  returns:
    -    if a better facet (i.e., vertices/centrum of facet closer to neighbor)
    -      updates bestfacet, dist, mindist, and maxdist
    -*/
    -void qh_findbest_test(boolT testcentrum, facetT *facet, facetT *neighbor,
    -      facetT **bestfacet, realT *distp, realT *mindistp, realT *maxdistp) {
    -  realT dist, mindist, maxdist;
    -
    -  if (testcentrum) {
    -    zzinc_(Zbestdist);
    -    qh_distplane(facet->center, neighbor, &dist);
    -    dist *= qh hull_dim; /* estimate furthest vertex */
    -    if (dist < 0) {
    -      maxdist= 0;
    -      mindist= dist;
    -      dist= -dist;
    -    }else {
    -      mindist= 0;
    -      maxdist= dist;
    -    }
    -  }else
    -    dist= qh_getdistance(facet, neighbor, &mindist, &maxdist);
    -  if (dist < *distp) {
    -    *bestfacet= neighbor;
    -    *mindistp= mindist;
    -    *maxdistp= maxdist;
    -    *distp= dist;
    -  }
    -} /* findbest_test */
    -
    -/*---------------------------------
    -
    -  qh_findbestneighbor( facet, dist, mindist, maxdist )
    -    finds best neighbor (least dist) of a facet for merging
    -
    -  returns:
    -    returns min and max distances and their max absolute value
    -
    -  notes:
    -    error if qh_ASvoronoi
    -    avoids merging old into new
    -    assumes ridge->nonconvex only set on one ridge between a pair of facets
    -    could use an early out predicate but not worth it
    -
    -  design:
    -    if a large facet
    -      will test centrum
    -    else
    -      will test vertices
    -    if a large facet
    -      test nonconvex neighbors for best merge
    -    else
    -      test all neighbors for the best merge
    -    if testing centrum
    -      get distance information
    -*/
    -facetT *qh_findbestneighbor(facetT *facet, realT *distp, realT *mindistp, realT *maxdistp) {
    -  facetT *neighbor, **neighborp, *bestfacet= NULL;
    -  ridgeT *ridge, **ridgep;
    -  boolT nonconvex= True, testcentrum= False;
    -  int size= qh_setsize(facet->vertices);
    -
    -  if(qh CENTERtype==qh_ASvoronoi){
    -    qh_fprintf(qh ferr, 6272, "qhull error: cannot call qh_findbestneighor for f%d while qh.CENTERtype is qh_ASvoronoi\n", facet->id);
    -    qh_errexit(qh_ERRqhull, facet, NULL);
    -  }
    -  *distp= REALmax;
    -  if (size > qh_BESTcentrum2 * qh hull_dim + qh_BESTcentrum) {
    -    testcentrum= True;
    -    zinc_(Zbestcentrum);
    -    if (!facet->center)
    -       facet->center= qh_getcentrum(facet);
    -  }
    -  if (size > qh hull_dim + qh_BESTnonconvex) {
    -    FOREACHridge_(facet->ridges) {
    -      if (ridge->nonconvex) {
    -        neighbor= otherfacet_(ridge, facet);
    -        qh_findbest_test(testcentrum, facet, neighbor,
    -                          &bestfacet, distp, mindistp, maxdistp);
    -      }
    -    }
    -  }
    -  if (!bestfacet) {
    -    nonconvex= False;
    -    FOREACHneighbor_(facet)
    -      qh_findbest_test(testcentrum, facet, neighbor,
    -                        &bestfacet, distp, mindistp, maxdistp);
    -  }
    -  if (!bestfacet) {
    -    qh_fprintf(qh ferr, 6095, "qhull internal error (qh_findbestneighbor): no neighbors for f%d\n", facet->id);
    -
    -    qh_errexit(qh_ERRqhull, facet, NULL);
    -  }
    -  if (testcentrum)
    -    qh_getdistance(facet, bestfacet, mindistp, maxdistp);
    -  trace3((qh ferr, 3002, "qh_findbestneighbor: f%d is best neighbor for f%d testcentrum? %d nonconvex? %d dist %2.2g min %2.2g max %2.2g\n",
    -     bestfacet->id, facet->id, testcentrum, nonconvex, *distp, *mindistp, *maxdistp));
    -  return(bestfacet);
    -} /* findbestneighbor */
    -
    -
    -/*---------------------------------
    -
    -  qh_flippedmerges( facetlist, wasmerge )
    -    merge flipped facets into best neighbor
    -    assumes qh.facet_mergeset at top of temporary stack
    -
    -  returns:
    -    no flipped facets on facetlist
    -    sets wasmerge if merge occurred
    -    degen/redundant merges passed through
    -
    -  notes:
    -    othermerges not needed since qh.facet_mergeset is empty before & after
    -      keep it in case of change
    -
    -  design:
    -    append flipped facets to qh.facetmergeset
    -    for each flipped merge
    -      find best neighbor
    -      merge facet into neighbor
    -      merge degenerate and redundant facets
    -    remove flipped merges from qh.facet_mergeset
    -*/
    -void qh_flippedmerges(facetT *facetlist, boolT *wasmerge) {
    -  facetT *facet, *neighbor, *facet1;
    -  realT dist, mindist, maxdist;
    -  mergeT *merge, **mergep;
    -  setT *othermerges;
    -  int nummerge=0;
    -
    -  trace4((qh ferr, 4024, "qh_flippedmerges: begin\n"));
    -  FORALLfacet_(facetlist) {
    -    if (facet->flipped && !facet->visible)
    -      qh_appendmergeset(facet, facet, MRGflip, NULL);
    -  }
    -  othermerges= qh_settemppop(); /* was facet_mergeset */
    -  qh facet_mergeset= qh_settemp(qh TEMPsize);
    -  qh_settemppush(othermerges);
    -  FOREACHmerge_(othermerges) {
    -    facet1= merge->facet1;
    -    if (merge->type != MRGflip || facet1->visible)
    -      continue;
    -    if (qh TRACEmerge-1 == zzval_(Ztotmerge))
    -      qhmem.IStracing= qh IStracing= qh TRACElevel;
    -    neighbor= qh_findbestneighbor(facet1, &dist, &mindist, &maxdist);
    -    trace0((qh ferr, 15, "qh_flippedmerges: merge flipped f%d into f%d dist %2.2g during p%d\n",
    -      facet1->id, neighbor->id, dist, qh furthest_id));
    -    qh_mergefacet(facet1, neighbor, &mindist, &maxdist, !qh_MERGEapex);
    -    nummerge++;
    -    if (qh PRINTstatistics) {
    -      zinc_(Zflipped);
    -      wadd_(Wflippedtot, dist);
    -      wmax_(Wflippedmax, dist);
    -    }
    -    qh_merge_degenredundant();
    -  }
    -  FOREACHmerge_(othermerges) {
    -    if (merge->facet1->visible || merge->facet2->visible)
    -      qh_memfree(merge, (int)sizeof(mergeT));
    -    else
    -      qh_setappend(&qh facet_mergeset, merge);
    -  }
    -  qh_settempfree(&othermerges);
    -  if (nummerge)
    -    *wasmerge= True;
    -  trace1((qh ferr, 1010, "qh_flippedmerges: merged %d flipped facets into a good neighbor\n", nummerge));
    -} /* flippedmerges */
    -
    -
    -/*---------------------------------
    -
    -  qh_forcedmerges( wasmerge )
    -    merge duplicated ridges
    -
    -  returns:
    -    removes all duplicate ridges on facet_mergeset
    -    wasmerge set if merge
    -    qh.facet_mergeset may include non-forced merges(none for now)
    -    qh.degen_mergeset includes degen/redun merges
    -
    -  notes:
    -    duplicate ridges occur when the horizon is pinched,
    -        i.e. a subridge occurs in more than two horizon ridges.
    -     could rename vertices that pinch the horizon
    -    assumes qh_merge_degenredundant() has not be called
    -    othermerges isn't needed since facet_mergeset is empty afterwards
    -      keep it in case of change
    -
    -  design:
    -    for each duplicate ridge
    -      find current facets by chasing f.replace links
    -      check for wide merge due to duplicate ridge
    -      determine best direction for facet
    -      merge one facet into the other
    -      remove duplicate ridges from qh.facet_mergeset
    -*/
    -void qh_forcedmerges(boolT *wasmerge) {
    -  facetT *facet1, *facet2;
    -  mergeT *merge, **mergep;
    -  realT dist1, dist2, mindist1, mindist2, maxdist1, maxdist2;
    -  setT *othermerges;
    -  int nummerge=0, numflip=0;
    -
    -  if (qh TRACEmerge-1 == zzval_(Ztotmerge))
    -    qhmem.IStracing= qh IStracing= qh TRACElevel;
    -  trace4((qh ferr, 4025, "qh_forcedmerges: begin\n"));
    -  othermerges= qh_settemppop(); /* was facet_mergeset */
    -  qh facet_mergeset= qh_settemp(qh TEMPsize);
    -  qh_settemppush(othermerges);
    -  FOREACHmerge_(othermerges) {
    -    if (merge->type != MRGridge)
    -        continue;
    -    if (qh TRACEmerge-1 == zzval_(Ztotmerge))
    -        qhmem.IStracing= qh IStracing= qh TRACElevel;
    -    facet1= merge->facet1;
    -    facet2= merge->facet2;
    -    while (facet1->visible)      /* must exist, no qh_merge_degenredunant */
    -      facet1= facet1->f.replace; /* previously merged facet */
    -    while (facet2->visible)
    -      facet2= facet2->f.replace; /* previously merged facet */
    -    if (facet1 == facet2)
    -      continue;
    -    if (!qh_setin(facet2->neighbors, facet1)) {
    -      qh_fprintf(qh ferr, 6096, "qhull internal error (qh_forcedmerges): f%d and f%d had a duplicate ridge but as f%d and f%d they are no longer neighbors\n",
    -               merge->facet1->id, merge->facet2->id, facet1->id, facet2->id);
    -      qh_errexit2(qh_ERRqhull, facet1, facet2);
    -    }
    -    dist1= qh_getdistance(facet1, facet2, &mindist1, &maxdist1);
    -    dist2= qh_getdistance(facet2, facet1, &mindist2, &maxdist2);
    -    qh_check_dupridge(facet1, dist1, facet2, dist2);
    -    if (dist1 < dist2)
    -      qh_mergefacet(facet1, facet2, &mindist1, &maxdist1, !qh_MERGEapex);
    -    else {
    -      qh_mergefacet(facet2, facet1, &mindist2, &maxdist2, !qh_MERGEapex);
    -      dist1= dist2;
    -      facet1= facet2;
    -    }
    -    if (facet1->flipped) {
    -      zinc_(Zmergeflipdup);
    -      numflip++;
    -    }else
    -      nummerge++;
    -    if (qh PRINTstatistics) {
    -      zinc_(Zduplicate);
    -      wadd_(Wduplicatetot, dist1);
    -      wmax_(Wduplicatemax, dist1);
    -    }
    -  }
    -  FOREACHmerge_(othermerges) {
    -    if (merge->type == MRGridge)
    -      qh_memfree(merge, (int)sizeof(mergeT));
    -    else
    -      qh_setappend(&qh facet_mergeset, merge);
    -  }
    -  qh_settempfree(&othermerges);
    -  if (nummerge)
    -    *wasmerge= True;
    -  trace1((qh ferr, 1011, "qh_forcedmerges: merged %d facets and %d flipped facets across duplicated ridges\n",
    -                nummerge, numflip));
    -} /* forcedmerges */
    -
    -
    -/*---------------------------------
    -
    -  qh_getmergeset( facetlist )
    -    determines nonconvex facets on facetlist
    -    tests !tested ridges and nonconvex ridges of !tested facets
    -
    -  returns:
    -    returns sorted qh.facet_mergeset of facet-neighbor pairs to be merged
    -    all ridges tested
    -
    -  notes:
    -    assumes no nonconvex ridges with both facets tested
    -    uses facet->tested/ridge->tested to prevent duplicate tests
    -    can not limit tests to modified ridges since the centrum changed
    -    uses qh.visit_id
    -
    -  see:
    -    qh_getmergeset_initial()
    -
    -  design:
    -    for each facet on facetlist
    -      for each ridge of facet
    -        if untested ridge
    -          test ridge for convexity
    -          if non-convex
    -            append ridge to qh.facet_mergeset
    -    sort qh.facet_mergeset by angle
    -*/
    -void qh_getmergeset(facetT *facetlist) {
    -  facetT *facet, *neighbor, **neighborp;
    -  ridgeT *ridge, **ridgep;
    -  int nummerges;
    -
    -  nummerges= qh_setsize(qh facet_mergeset);
    -  trace4((qh ferr, 4026, "qh_getmergeset: started.\n"));
    -  qh visit_id++;
    -  FORALLfacet_(facetlist) {
    -    if (facet->tested)
    -      continue;
    -    facet->visitid= qh visit_id;
    -    facet->tested= True;  /* must be non-simplicial due to merge */
    -    FOREACHneighbor_(facet)
    -      neighbor->seen= False;
    -    FOREACHridge_(facet->ridges) {
    -      if (ridge->tested && !ridge->nonconvex)
    -        continue;
    -      /* if tested & nonconvex, need to append merge */
    -      neighbor= otherfacet_(ridge, facet);
    -      if (neighbor->seen) {
    -        ridge->tested= True;
    -        ridge->nonconvex= False;
    -      }else if (neighbor->visitid != qh visit_id) {
    -        ridge->tested= True;
    -        ridge->nonconvex= False;
    -        neighbor->seen= True;      /* only one ridge is marked nonconvex */
    -        if (qh_test_appendmerge(facet, neighbor))
    -          ridge->nonconvex= True;
    -      }
    -    }
    -  }
    -  nummerges= qh_setsize(qh facet_mergeset);
    -  if (qh ANGLEmerge)
    -    qsort(SETaddr_(qh facet_mergeset, mergeT), (size_t)nummerges, sizeof(mergeT *), qh_compareangle);
    -  else
    -    qsort(SETaddr_(qh facet_mergeset, mergeT), (size_t)nummerges, sizeof(mergeT *), qh_comparemerge);
    -  if (qh POSTmerging) {
    -    zadd_(Zmergesettot2, nummerges);
    -  }else {
    -    zadd_(Zmergesettot, nummerges);
    -    zmax_(Zmergesetmax, nummerges);
    -  }
    -  trace2((qh ferr, 2021, "qh_getmergeset: %d merges found\n", nummerges));
    -} /* getmergeset */
    -
    -
    -/*---------------------------------
    -
    -  qh_getmergeset_initial( facetlist )
    -    determine initial qh.facet_mergeset for facets
    -    tests all facet/neighbor pairs on facetlist
    -
    -  returns:
    -    sorted qh.facet_mergeset with nonconvex ridges
    -    sets facet->tested, ridge->tested, and ridge->nonconvex
    -
    -  notes:
    -    uses visit_id, assumes ridge->nonconvex is False
    -
    -  see:
    -    qh_getmergeset()
    -
    -  design:
    -    for each facet on facetlist
    -      for each untested neighbor of facet
    -        test facet and neighbor for convexity
    -        if non-convex
    -          append merge to qh.facet_mergeset
    -          mark one of the ridges as nonconvex
    -    sort qh.facet_mergeset by angle
    -*/
    -void qh_getmergeset_initial(facetT *facetlist) {
    -  facetT *facet, *neighbor, **neighborp;
    -  ridgeT *ridge, **ridgep;
    -  int nummerges;
    -
    -  qh visit_id++;
    -  FORALLfacet_(facetlist) {
    -    facet->visitid= qh visit_id;
    -    facet->tested= True;
    -    FOREACHneighbor_(facet) {
    -      if (neighbor->visitid != qh visit_id) {
    -        if (qh_test_appendmerge(facet, neighbor)) {
    -          FOREACHridge_(neighbor->ridges) {
    -            if (facet == otherfacet_(ridge, neighbor)) {
    -              ridge->nonconvex= True;
    -              break;    /* only one ridge is marked nonconvex */
    -            }
    -          }
    -        }
    -      }
    -    }
    -    FOREACHridge_(facet->ridges)
    -      ridge->tested= True;
    -  }
    -  nummerges= qh_setsize(qh facet_mergeset);
    -  if (qh ANGLEmerge)
    -    qsort(SETaddr_(qh facet_mergeset, mergeT), (size_t)nummerges, sizeof(mergeT *), qh_compareangle);
    -  else
    -    qsort(SETaddr_(qh facet_mergeset, mergeT), (size_t)nummerges, sizeof(mergeT *), qh_comparemerge);
    -  if (qh POSTmerging) {
    -    zadd_(Zmergeinittot2, nummerges);
    -  }else {
    -    zadd_(Zmergeinittot, nummerges);
    -    zmax_(Zmergeinitmax, nummerges);
    -  }
    -  trace2((qh ferr, 2022, "qh_getmergeset_initial: %d merges found\n", nummerges));
    -} /* getmergeset_initial */
    -
    -
    -/*---------------------------------
    -
    -  qh_hashridge( hashtable, hashsize, ridge, oldvertex )
    -    add ridge to hashtable without oldvertex
    -
    -  notes:
    -    assumes hashtable is large enough
    -
    -  design:
    -    determine hash value for ridge without oldvertex
    -    find next empty slot for ridge
    -*/
    -void qh_hashridge(setT *hashtable, int hashsize, ridgeT *ridge, vertexT *oldvertex) {
    -  int hash;
    -  ridgeT *ridgeA;
    -
    -  hash= qh_gethash(hashsize, ridge->vertices, qh hull_dim-1, 0, oldvertex);
    -  while (True) {
    -    if (!(ridgeA= SETelemt_(hashtable, hash, ridgeT))) {
    -      SETelem_(hashtable, hash)= ridge;
    -      break;
    -    }else if (ridgeA == ridge)
    -      break;
    -    if (++hash == hashsize)
    -      hash= 0;
    -  }
    -} /* hashridge */
    -
    -
    -/*---------------------------------
    -
    -  qh_hashridge_find( hashtable, hashsize, ridge, vertex, oldvertex, hashslot )
    -    returns matching ridge without oldvertex in hashtable
    -      for ridge without vertex
    -    if oldvertex is NULL
    -      matches with any one skip
    -
    -  returns:
    -    matching ridge or NULL
    -    if no match,
    -      if ridge already in   table
    -        hashslot= -1
    -      else
    -        hashslot= next NULL index
    -
    -  notes:
    -    assumes hashtable is large enough
    -    can't match ridge to itself
    -
    -  design:
    -    get hash value for ridge without vertex
    -    for each hashslot
    -      return match if ridge matches ridgeA without oldvertex
    -*/
    -ridgeT *qh_hashridge_find(setT *hashtable, int hashsize, ridgeT *ridge,
    -              vertexT *vertex, vertexT *oldvertex, int *hashslot) {
    -  int hash;
    -  ridgeT *ridgeA;
    -
    -  *hashslot= 0;
    -  zinc_(Zhashridge);
    -  hash= qh_gethash(hashsize, ridge->vertices, qh hull_dim-1, 0, vertex);
    -  while ((ridgeA= SETelemt_(hashtable, hash, ridgeT))) {
    -    if (ridgeA == ridge)
    -      *hashslot= -1;
    -    else {
    -      zinc_(Zhashridgetest);
    -      if (qh_setequal_except(ridge->vertices, vertex, ridgeA->vertices, oldvertex))
    -        return ridgeA;
    -    }
    -    if (++hash == hashsize)
    -      hash= 0;
    -  }
    -  if (!*hashslot)
    -    *hashslot= hash;
    -  return NULL;
    -} /* hashridge_find */
    -
    -
    -/*---------------------------------
    -
    -  qh_makeridges( facet )
    -    creates explicit ridges between simplicial facets
    -
    -  returns:
    -    facet with ridges and without qh_MERGEridge
    -    ->simplicial is False
    -
    -  notes:
    -    allows qh_MERGEridge flag
    -    uses existing ridges
    -    duplicate neighbors ok if ridges already exist (qh_mergecycle_ridges)
    -
    -  see:
    -    qh_mergecycle_ridges()
    -
    -  design:
    -    look for qh_MERGEridge neighbors
    -    mark neighbors that already have ridges
    -    for each unprocessed neighbor of facet
    -      create a ridge for neighbor and facet
    -    if any qh_MERGEridge neighbors
    -      delete qh_MERGEridge flags (already handled by qh_mark_dupridges)
    -*/
    -void qh_makeridges(facetT *facet) {
    -  facetT *neighbor, **neighborp;
    -  ridgeT *ridge, **ridgep;
    -  int neighbor_i, neighbor_n;
    -  boolT toporient, mergeridge= False;
    -
    -  if (!facet->simplicial)
    -    return;
    -  trace4((qh ferr, 4027, "qh_makeridges: make ridges for f%d\n", facet->id));
    -  facet->simplicial= False;
    -  FOREACHneighbor_(facet) {
    -    if (neighbor == qh_MERGEridge)
    -      mergeridge= True;
    -    else
    -      neighbor->seen= False;
    -  }
    -  FOREACHridge_(facet->ridges)
    -    otherfacet_(ridge, facet)->seen= True;
    -  FOREACHneighbor_i_(facet) {
    -    if (neighbor == qh_MERGEridge)
    -      continue;  /* fixed by qh_mark_dupridges */
    -    else if (!neighbor->seen) {  /* no current ridges */
    -      ridge= qh_newridge();
    -      ridge->vertices= qh_setnew_delnthsorted(facet->vertices, qh hull_dim,
    -                                                          neighbor_i, 0);
    -      toporient= facet->toporient ^ (neighbor_i & 0x1);
    -      if (toporient) {
    -        ridge->top= facet;
    -        ridge->bottom= neighbor;
    -      }else {
    -        ridge->top= neighbor;
    -        ridge->bottom= facet;
    -      }
    -#if 0 /* this also works */
    -      flip= (facet->toporient ^ neighbor->toporient)^(skip1 & 0x1) ^ (skip2 & 0x1);
    -      if (facet->toporient ^ (skip1 & 0x1) ^ flip) {
    -        ridge->top= neighbor;
    -        ridge->bottom= facet;
    -      }else {
    -        ridge->top= facet;
    -        ridge->bottom= neighbor;
    -      }
    -#endif
    -      qh_setappend(&(facet->ridges), ridge);
    -      qh_setappend(&(neighbor->ridges), ridge);
    -    }
    -  }
    -  if (mergeridge) {
    -    while (qh_setdel(facet->neighbors, qh_MERGEridge))
    -      ; /* delete each one */
    -  }
    -} /* makeridges */
    -
    -
    -/*---------------------------------
    -
    -  qh_mark_dupridges( facetlist )
    -    add duplicated ridges to qh.facet_mergeset
    -    facet->dupridge is true
    -
    -  returns:
    -    duplicate ridges on qh.facet_mergeset
    -    ->mergeridge/->mergeridge2 set
    -    duplicate ridges marked by qh_MERGEridge and both sides facet->dupridge
    -    no MERGEridges in neighbor sets
    -
    -  notes:
    -    duplicate ridges occur when the horizon is pinched,
    -        i.e. a subridge occurs in more than two horizon ridges.
    -    could rename vertices that pinch the horizon (thus removing subridge)
    -    uses qh.visit_id
    -
    -  design:
    -    for all facets on facetlist
    -      if facet contains a duplicate ridge
    -        for each neighbor of facet
    -          if neighbor marked qh_MERGEridge (one side of the merge)
    -            set facet->mergeridge
    -          else
    -            if neighbor contains a duplicate ridge
    -            and the back link is qh_MERGEridge
    -              append duplicate ridge to qh.facet_mergeset
    -   for each duplicate ridge
    -     make ridge sets in preparation for merging
    -     remove qh_MERGEridge from neighbor set
    -   for each duplicate ridge
    -     restore the missing neighbor from the neighbor set that was qh_MERGEridge
    -     add the missing ridge for this neighbor
    -*/
    -void qh_mark_dupridges(facetT *facetlist) {
    -  facetT *facet, *neighbor, **neighborp;
    -  int nummerge=0;
    -  mergeT *merge, **mergep;
    -
    -
    -  trace4((qh ferr, 4028, "qh_mark_dupridges: identify duplicate ridges\n"));
    -  FORALLfacet_(facetlist) {
    -    if (facet->dupridge) {
    -      FOREACHneighbor_(facet) {
    -        if (neighbor == qh_MERGEridge) {
    -          facet->mergeridge= True;
    -          continue;
    -        }
    -        if (neighbor->dupridge
    -        && !qh_setin(neighbor->neighbors, facet)) { /* qh_MERGEridge */
    -          qh_appendmergeset(facet, neighbor, MRGridge, NULL);
    -          facet->mergeridge2= True;
    -          facet->mergeridge= True;
    -          nummerge++;
    -        }
    -      }
    -    }
    -  }
    -  if (!nummerge)
    -    return;
    -  FORALLfacet_(facetlist) {            /* gets rid of qh_MERGEridge */
    -    if (facet->mergeridge && !facet->mergeridge2)
    -      qh_makeridges(facet);
    -  }
    -  FOREACHmerge_(qh facet_mergeset) {   /* restore the missing neighbors */
    -    if (merge->type == MRGridge) {
    -      qh_setappend(&merge->facet2->neighbors, merge->facet1);
    -      qh_makeridges(merge->facet1);   /* and the missing ridges */
    -    }
    -  }
    -  trace1((qh ferr, 1012, "qh_mark_dupridges: found %d duplicated ridges\n",
    -                nummerge));
    -} /* mark_dupridges */
    -
    -/*---------------------------------
    -
    -  qh_maydropneighbor( facet )
    -    drop neighbor relationship if no ridge between facet and neighbor
    -
    -  returns:
    -    neighbor sets updated
    -    appends degenerate facets to qh.facet_mergeset
    -
    -  notes:
    -    won't cause redundant facets since vertex inclusion is the same
    -    may drop vertex and neighbor if no ridge
    -    uses qh.visit_id
    -
    -  design:
    -    visit all neighbors with ridges
    -    for each unvisited neighbor of facet
    -      delete neighbor and facet from the neighbor sets
    -      if neighbor becomes degenerate
    -        append neighbor to qh.degen_mergeset
    -    if facet is degenerate
    -      append facet to qh.degen_mergeset
    -*/
    -void qh_maydropneighbor(facetT *facet) {
    -  ridgeT *ridge, **ridgep;
    -  realT angledegen= qh_ANGLEdegen;
    -  facetT *neighbor, **neighborp;
    -
    -  qh visit_id++;
    -  trace4((qh ferr, 4029, "qh_maydropneighbor: test f%d for no ridges to a neighbor\n",
    -          facet->id));
    -  FOREACHridge_(facet->ridges) {
    -    ridge->top->visitid= qh visit_id;
    -    ridge->bottom->visitid= qh visit_id;
    -  }
    -  FOREACHneighbor_(facet) {
    -    if (neighbor->visitid != qh visit_id) {
    -      trace0((qh ferr, 17, "qh_maydropneighbor: facets f%d and f%d are no longer neighbors during p%d\n",
    -            facet->id, neighbor->id, qh furthest_id));
    -      zinc_(Zdropneighbor);
    -      qh_setdel(facet->neighbors, neighbor);
    -      neighborp--;  /* repeat, deleted a neighbor */
    -      qh_setdel(neighbor->neighbors, facet);
    -      if (qh_setsize(neighbor->neighbors) < qh hull_dim) {
    -        zinc_(Zdropdegen);
    -        qh_appendmergeset(neighbor, neighbor, MRGdegen, &angledegen);
    -        trace2((qh ferr, 2023, "qh_maydropneighbors: f%d is degenerate.\n", neighbor->id));
    -      }
    -    }
    -  }
    -  if (qh_setsize(facet->neighbors) < qh hull_dim) {
    -    zinc_(Zdropdegen);
    -    qh_appendmergeset(facet, facet, MRGdegen, &angledegen);
    -    trace2((qh ferr, 2024, "qh_maydropneighbors: f%d is degenerate.\n", facet->id));
    -  }
    -} /* maydropneighbor */
    -
    -
    -/*---------------------------------
    -
    -  qh_merge_degenredundant()
    -    merge all degenerate and redundant facets
    -    qh.degen_mergeset contains merges from qh_degen_redundant_neighbors()
    -
    -  returns:
    -    number of merges performed
    -    resets facet->degenerate/redundant
    -    if deleted (visible) facet has no neighbors
    -      sets ->f.replace to NULL
    -
    -  notes:
    -    redundant merges happen before degenerate ones
    -    merging and renaming vertices can result in degen/redundant facets
    -
    -  design:
    -    for each merge on qh.degen_mergeset
    -      if redundant merge
    -        if non-redundant facet merged into redundant facet
    -          recheck facet for redundancy
    -        else
    -          merge redundant facet into other facet
    -*/
    -int qh_merge_degenredundant(void) {
    -  int size;
    -  mergeT *merge;
    -  facetT *bestneighbor, *facet1, *facet2;
    -  realT dist, mindist, maxdist;
    -  vertexT *vertex, **vertexp;
    -  int nummerges= 0;
    -  mergeType mergetype;
    -
    -  while ((merge= (mergeT*)qh_setdellast(qh degen_mergeset))) {
    -    facet1= merge->facet1;
    -    facet2= merge->facet2;
    -    mergetype= merge->type;
    -    qh_memfree(merge, (int)sizeof(mergeT));
    -    if (facet1->visible)
    -      continue;
    -    facet1->degenerate= False;
    -    facet1->redundant= False;
    -    if (qh TRACEmerge-1 == zzval_(Ztotmerge))
    -      qhmem.IStracing= qh IStracing= qh TRACElevel;
    -    if (mergetype == MRGredundant) {
    -      zinc_(Zneighbor);
    -      while (facet2->visible) {
    -        if (!facet2->f.replace) {
    -          qh_fprintf(qh ferr, 6097, "qhull internal error (qh_merge_degenredunant): f%d redundant but f%d has no replacement\n",
    -               facet1->id, facet2->id);
    -          qh_errexit2(qh_ERRqhull, facet1, facet2);
    -        }
    -        facet2= facet2->f.replace;
    -      }
    -      if (facet1 == facet2) {
    -        qh_degen_redundant_facet(facet1); /* in case of others */
    -        continue;
    -      }
    -      trace2((qh ferr, 2025, "qh_merge_degenredundant: facet f%d is contained in f%d, will merge\n",
    -            facet1->id, facet2->id));
    -      qh_mergefacet(facet1, facet2, NULL, NULL, !qh_MERGEapex);
    -      /* merge distance is already accounted for */
    -      nummerges++;
    -    }else {  /* mergetype == MRGdegen, other merges may have fixed */
    -      if (!(size= qh_setsize(facet1->neighbors))) {
    -        zinc_(Zdelfacetdup);
    -        trace2((qh ferr, 2026, "qh_merge_degenredundant: facet f%d has no neighbors.  Deleted\n", facet1->id));
    -        qh_willdelete(facet1, NULL);
    -        FOREACHvertex_(facet1->vertices) {
    -          qh_setdel(vertex->neighbors, facet1);
    -          if (!SETfirst_(vertex->neighbors)) {
    -            zinc_(Zdegenvertex);
    -            trace2((qh ferr, 2027, "qh_merge_degenredundant: deleted v%d because f%d has no neighbors\n",
    -                 vertex->id, facet1->id));
    -            vertex->deleted= True;
    -            qh_setappend(&qh del_vertices, vertex);
    -          }
    -        }
    -        nummerges++;
    -      }else if (size < qh hull_dim) {
    -        bestneighbor= qh_findbestneighbor(facet1, &dist, &mindist, &maxdist);
    -        trace2((qh ferr, 2028, "qh_merge_degenredundant: facet f%d has %d neighbors, merge into f%d dist %2.2g\n",
    -              facet1->id, size, bestneighbor->id, dist));
    -        qh_mergefacet(facet1, bestneighbor, &mindist, &maxdist, !qh_MERGEapex);
    -        nummerges++;
    -        if (qh PRINTstatistics) {
    -          zinc_(Zdegen);
    -          wadd_(Wdegentot, dist);
    -          wmax_(Wdegenmax, dist);
    -        }
    -      } /* else, another merge fixed the degeneracy and redundancy tested */
    -    }
    -  }
    -  return nummerges;
    -} /* merge_degenredundant */
    -
    -/*---------------------------------
    -
    -  qh_merge_nonconvex( facet1, facet2, mergetype )
    -    remove non-convex ridge between facet1 into facet2
    -    mergetype gives why the facet's are non-convex
    -
    -  returns:
    -    merges one of the facets into the best neighbor
    -
    -  design:
    -    if one of the facets is a new facet
    -      prefer merging new facet into old facet
    -    find best neighbors for both facets
    -    merge the nearest facet into its best neighbor
    -    update the statistics
    -*/
    -void qh_merge_nonconvex(facetT *facet1, facetT *facet2, mergeType mergetype) {
    -  facetT *bestfacet, *bestneighbor, *neighbor;
    -  realT dist, dist2, mindist, mindist2, maxdist, maxdist2;
    -
    -  if (qh TRACEmerge-1 == zzval_(Ztotmerge))
    -    qhmem.IStracing= qh IStracing= qh TRACElevel;
    -  trace3((qh ferr, 3003, "qh_merge_nonconvex: merge #%d for f%d and f%d type %d\n",
    -      zzval_(Ztotmerge) + 1, facet1->id, facet2->id, mergetype));
    -  /* concave or coplanar */
    -  if (!facet1->newfacet) {
    -    bestfacet= facet2;   /* avoid merging old facet if new is ok */
    -    facet2= facet1;
    -    facet1= bestfacet;
    -  }else
    -    bestfacet= facet1;
    -  bestneighbor= qh_findbestneighbor(bestfacet, &dist, &mindist, &maxdist);
    -  neighbor= qh_findbestneighbor(facet2, &dist2, &mindist2, &maxdist2);
    -  if (dist < dist2) {
    -    qh_mergefacet(bestfacet, bestneighbor, &mindist, &maxdist, !qh_MERGEapex);
    -  }else if (qh AVOIDold && !facet2->newfacet
    -  && ((mindist >= -qh MAXcoplanar && maxdist <= qh max_outside)
    -       || dist * 1.5 < dist2)) {
    -    zinc_(Zavoidold);
    -    wadd_(Wavoidoldtot, dist);
    -    wmax_(Wavoidoldmax, dist);
    -    trace2((qh ferr, 2029, "qh_merge_nonconvex: avoid merging old facet f%d dist %2.2g.  Use f%d dist %2.2g instead\n",
    -           facet2->id, dist2, facet1->id, dist2));
    -    qh_mergefacet(bestfacet, bestneighbor, &mindist, &maxdist, !qh_MERGEapex);
    -  }else {
    -    qh_mergefacet(facet2, neighbor, &mindist2, &maxdist2, !qh_MERGEapex);
    -    dist= dist2;
    -  }
    -  if (qh PRINTstatistics) {
    -    if (mergetype == MRGanglecoplanar) {
    -      zinc_(Zacoplanar);
    -      wadd_(Wacoplanartot, dist);
    -      wmax_(Wacoplanarmax, dist);
    -    }else if (mergetype == MRGconcave) {
    -      zinc_(Zconcave);
    -      wadd_(Wconcavetot, dist);
    -      wmax_(Wconcavemax, dist);
    -    }else { /* MRGcoplanar */
    -      zinc_(Zcoplanar);
    -      wadd_(Wcoplanartot, dist);
    -      wmax_(Wcoplanarmax, dist);
    -    }
    -  }
    -} /* merge_nonconvex */
    -
    -/*---------------------------------
    -
    -  qh_mergecycle( samecycle, newfacet )
    -    merge a cycle of facets starting at samecycle into a newfacet
    -    newfacet is a horizon facet with ->normal
    -    samecycle facets are simplicial from an apex
    -
    -  returns:
    -    initializes vertex neighbors on first merge
    -    samecycle deleted (placed on qh.visible_list)
    -    newfacet at end of qh.facet_list
    -    deleted vertices on qh.del_vertices
    -
    -  see:
    -    qh_mergefacet()
    -    called by qh_mergecycle_all() for multiple, same cycle facets
    -
    -  design:
    -    make vertex neighbors if necessary
    -    make ridges for newfacet
    -    merge neighbor sets of samecycle into newfacet
    -    merge ridges of samecycle into newfacet
    -    merge vertex neighbors of samecycle into newfacet
    -    make apex of samecycle the apex of newfacet
    -    if newfacet wasn't a new facet
    -      add its vertices to qh.newvertex_list
    -    delete samecycle facets a make newfacet a newfacet
    -*/
    -void qh_mergecycle(facetT *samecycle, facetT *newfacet) {
    -  int traceonce= False, tracerestore= 0;
    -  vertexT *apex;
    -#ifndef qh_NOtrace
    -  facetT *same;
    -#endif
    -
    -  if (newfacet->tricoplanar) {
    -    if (!qh TRInormals) {
    -      qh_fprintf(qh ferr, 6224, "Qhull internal error (qh_mergecycle): does not work for tricoplanar facets.  Use option 'Q11'\n");
    -      qh_errexit(qh_ERRqhull, newfacet, NULL);
    -    }
    -    newfacet->tricoplanar= False;
    -    newfacet->keepcentrum= False;
    -  }
    -  if (!qh VERTEXneighbors)
    -    qh_vertexneighbors();
    -  zzinc_(Ztotmerge);
    -  if (qh REPORTfreq2 && qh POSTmerging) {
    -    if (zzval_(Ztotmerge) > qh mergereport + qh REPORTfreq2)
    -      qh_tracemerging();
    -  }
    -#ifndef qh_NOtrace
    -  if (qh TRACEmerge == zzval_(Ztotmerge))
    -    qhmem.IStracing= qh IStracing= qh TRACElevel;
    -  trace2((qh ferr, 2030, "qh_mergecycle: merge #%d for facets from cycle f%d into coplanar horizon f%d\n",
    -        zzval_(Ztotmerge), samecycle->id, newfacet->id));
    -  if (newfacet == qh tracefacet) {
    -    tracerestore= qh IStracing;
    -    qh IStracing= 4;
    -    qh_fprintf(qh ferr, 8068, "qh_mergecycle: ========= trace merge %d of samecycle %d into trace f%d, furthest is p%d\n",
    -               zzval_(Ztotmerge), samecycle->id, newfacet->id,  qh furthest_id);
    -    traceonce= True;
    -  }
    -  if (qh IStracing >=4) {
    -    qh_fprintf(qh ferr, 8069, "  same cycle:");
    -    FORALLsame_cycle_(samecycle)
    -      qh_fprintf(qh ferr, 8070, " f%d", same->id);
    -    qh_fprintf(qh ferr, 8071, "\n");
    -  }
    -  if (qh IStracing >=4)
    -    qh_errprint("MERGING CYCLE", samecycle, newfacet, NULL, NULL);
    -#endif /* !qh_NOtrace */
    -  apex= SETfirstt_(samecycle->vertices, vertexT);
    -  qh_makeridges(newfacet);
    -  qh_mergecycle_neighbors(samecycle, newfacet);
    -  qh_mergecycle_ridges(samecycle, newfacet);
    -  qh_mergecycle_vneighbors(samecycle, newfacet);
    -  if (SETfirstt_(newfacet->vertices, vertexT) != apex)
    -    qh_setaddnth(&newfacet->vertices, 0, apex);  /* apex has last id */
    -  if (!newfacet->newfacet)
    -    qh_newvertices(newfacet->vertices);
    -  qh_mergecycle_facets(samecycle, newfacet);
    -  qh_tracemerge(samecycle, newfacet);
    -  /* check for degen_redundant_neighbors after qh_forcedmerges() */
    -  if (traceonce) {
    -    qh_fprintf(qh ferr, 8072, "qh_mergecycle: end of trace facet\n");
    -    qh IStracing= tracerestore;
    -  }
    -} /* mergecycle */
    -
    -/*---------------------------------
    -
    -  qh_mergecycle_all( facetlist, wasmerge )
    -    merge all samecycles of coplanar facets into horizon
    -    don't merge facets with ->mergeridge (these already have ->normal)
    -    all facets are simplicial from apex
    -    all facet->cycledone == False
    -
    -  returns:
    -    all newfacets merged into coplanar horizon facets
    -    deleted vertices on  qh.del_vertices
    -    sets wasmerge if any merge
    -
    -  see:
    -    calls qh_mergecycle for multiple, same cycle facets
    -
    -  design:
    -    for each facet on facetlist
    -      skip facets with duplicate ridges and normals
    -      check that facet is in a samecycle (->mergehorizon)
    -      if facet only member of samecycle
    -        sets vertex->delridge for all vertices except apex
    -        merge facet into horizon
    -      else
    -        mark all facets in samecycle
    -        remove facets with duplicate ridges from samecycle
    -        merge samecycle into horizon (deletes facets from facetlist)
    -*/
    -void qh_mergecycle_all(facetT *facetlist, boolT *wasmerge) {
    -  facetT *facet, *same, *prev, *horizon;
    -  facetT *samecycle= NULL, *nextfacet, *nextsame;
    -  vertexT *apex, *vertex, **vertexp;
    -  int cycles=0, total=0, facets, nummerge;
    -
    -  trace2((qh ferr, 2031, "qh_mergecycle_all: begin\n"));
    -  for (facet= facetlist; facet && (nextfacet= facet->next); facet= nextfacet) {
    -    if (facet->normal)
    -      continue;
    -    if (!facet->mergehorizon) {
    -      qh_fprintf(qh ferr, 6225, "Qhull internal error (qh_mergecycle_all): f%d without normal\n", facet->id);
    -      qh_errexit(qh_ERRqhull, facet, NULL);
    -    }
    -    horizon= SETfirstt_(facet->neighbors, facetT);
    -    if (facet->f.samecycle == facet) {
    -      zinc_(Zonehorizon);
    -      /* merge distance done in qh_findhorizon */
    -      apex= SETfirstt_(facet->vertices, vertexT);
    -      FOREACHvertex_(facet->vertices) {
    -        if (vertex != apex)
    -          vertex->delridge= True;
    -      }
    -      horizon->f.newcycle= NULL;
    -      qh_mergefacet(facet, horizon, NULL, NULL, qh_MERGEapex);
    -    }else {
    -      samecycle= facet;
    -      facets= 0;
    -      prev= facet;
    -      for (same= facet->f.samecycle; same;  /* FORALLsame_cycle_(facet) */
    -           same= (same == facet ? NULL :nextsame)) { /* ends at facet */
    -        nextsame= same->f.samecycle;
    -        if (same->cycledone || same->visible)
    -          qh_infiniteloop(same);
    -        same->cycledone= True;
    -        if (same->normal) {
    -          prev->f.samecycle= same->f.samecycle; /* unlink ->mergeridge */
    -          same->f.samecycle= NULL;
    -        }else {
    -          prev= same;
    -          facets++;
    -        }
    -      }
    -      while (nextfacet && nextfacet->cycledone)  /* will delete samecycle */
    -        nextfacet= nextfacet->next;
    -      horizon->f.newcycle= NULL;
    -      qh_mergecycle(samecycle, horizon);
    -      nummerge= horizon->nummerge + facets;
    -      if (nummerge > qh_MAXnummerge)
    -        horizon->nummerge= qh_MAXnummerge;
    -      else
    -        horizon->nummerge= (short unsigned int)nummerge;
    -      zzinc_(Zcyclehorizon);
    -      total += facets;
    -      zzadd_(Zcyclefacettot, facets);
    -      zmax_(Zcyclefacetmax, facets);
    -    }
    -    cycles++;
    -  }
    -  if (cycles)
    -    *wasmerge= True;
    -  trace1((qh ferr, 1013, "qh_mergecycle_all: merged %d same cycles or facets into coplanar horizons\n", cycles));
    -} /* mergecycle_all */
    -
    -/*---------------------------------
    -
    -  qh_mergecycle_facets( samecycle, newfacet )
    -    finish merge of samecycle into newfacet
    -
    -  returns:
    -    samecycle prepended to visible_list for later deletion and partitioning
    -      each facet->f.replace == newfacet
    -
    -    newfacet moved to end of qh.facet_list
    -      makes newfacet a newfacet (get's facet1->id if it was old)
    -      sets newfacet->newmerge
    -      clears newfacet->center (unless merging into a large facet)
    -      clears newfacet->tested and ridge->tested for facet1
    -
    -    adds neighboring facets to facet_mergeset if redundant or degenerate
    -
    -  design:
    -    make newfacet a new facet and set its flags
    -    move samecycle facets to qh.visible_list for later deletion
    -    unless newfacet is large
    -      remove its centrum
    -*/
    -void qh_mergecycle_facets(facetT *samecycle, facetT *newfacet) {
    -  facetT *same, *next;
    -
    -  trace4((qh ferr, 4030, "qh_mergecycle_facets: make newfacet new and samecycle deleted\n"));
    -  qh_removefacet(newfacet);  /* append as a newfacet to end of qh facet_list */
    -  qh_appendfacet(newfacet);
    -  newfacet->newfacet= True;
    -  newfacet->simplicial= False;
    -  newfacet->newmerge= True;
    -
    -  for (same= samecycle->f.samecycle; same; same= (same == samecycle ?  NULL : next)) {
    -    next= same->f.samecycle;  /* reused by willdelete */
    -    qh_willdelete(same, newfacet);
    -  }
    -  if (newfacet->center
    -      && qh_setsize(newfacet->vertices) <= qh hull_dim + qh_MAXnewcentrum) {
    -    qh_memfree(newfacet->center, qh normal_size);
    -    newfacet->center= NULL;
    -  }
    -  trace3((qh ferr, 3004, "qh_mergecycle_facets: merged facets from cycle f%d into f%d\n",
    -             samecycle->id, newfacet->id));
    -} /* mergecycle_facets */
    -
    -/*---------------------------------
    -
    -  qh_mergecycle_neighbors( samecycle, newfacet )
    -    add neighbors for samecycle facets to newfacet
    -
    -  returns:
    -    newfacet with updated neighbors and vice-versa
    -    newfacet has ridges
    -    all neighbors of newfacet marked with qh.visit_id
    -    samecycle facets marked with qh.visit_id-1
    -    ridges updated for simplicial neighbors of samecycle with a ridge
    -
    -  notes:
    -    assumes newfacet not in samecycle
    -    usually, samecycle facets are new, simplicial facets without internal ridges
    -      not so if horizon facet is coplanar to two different samecycles
    -
    -  see:
    -    qh_mergeneighbors()
    -
    -  design:
    -    check samecycle
    -    delete neighbors from newfacet that are also in samecycle
    -    for each neighbor of a facet in samecycle
    -      if neighbor is simplicial
    -        if first visit
    -          move the neighbor relation to newfacet
    -          update facet links for its ridges
    -        else
    -          make ridges for neighbor
    -          remove samecycle reference
    -      else
    -        update neighbor sets
    -*/
    -void qh_mergecycle_neighbors(facetT *samecycle, facetT *newfacet) {
    -  facetT *same, *neighbor, **neighborp;
    -  int delneighbors= 0, newneighbors= 0;
    -  unsigned int samevisitid;
    -  ridgeT *ridge, **ridgep;
    -
    -  samevisitid= ++qh visit_id;
    -  FORALLsame_cycle_(samecycle) {
    -    if (same->visitid == samevisitid || same->visible)
    -      qh_infiniteloop(samecycle);
    -    same->visitid= samevisitid;
    -  }
    -  newfacet->visitid= ++qh visit_id;
    -  trace4((qh ferr, 4031, "qh_mergecycle_neighbors: delete shared neighbors from newfacet\n"));
    -  FOREACHneighbor_(newfacet) {
    -    if (neighbor->visitid == samevisitid) {
    -      SETref_(neighbor)= NULL;  /* samecycle neighbors deleted */
    -      delneighbors++;
    -    }else
    -      neighbor->visitid= qh visit_id;
    -  }
    -  qh_setcompact(newfacet->neighbors);
    -
    -  trace4((qh ferr, 4032, "qh_mergecycle_neighbors: update neighbors\n"));
    -  FORALLsame_cycle_(samecycle) {
    -    FOREACHneighbor_(same) {
    -      if (neighbor->visitid == samevisitid)
    -        continue;
    -      if (neighbor->simplicial) {
    -        if (neighbor->visitid != qh visit_id) {
    -          qh_setappend(&newfacet->neighbors, neighbor);
    -          qh_setreplace(neighbor->neighbors, same, newfacet);
    -          newneighbors++;
    -          neighbor->visitid= qh visit_id;
    -          FOREACHridge_(neighbor->ridges) { /* update ridge in case of qh_makeridges */
    -            if (ridge->top == same) {
    -              ridge->top= newfacet;
    -              break;
    -            }else if (ridge->bottom == same) {
    -              ridge->bottom= newfacet;
    -              break;
    -            }
    -          }
    -        }else {
    -          qh_makeridges(neighbor);
    -          qh_setdel(neighbor->neighbors, same);
    -          /* same can't be horizon facet for neighbor */
    -        }
    -      }else { /* non-simplicial neighbor */
    -        qh_setdel(neighbor->neighbors, same);
    -        if (neighbor->visitid != qh visit_id) {
    -          qh_setappend(&neighbor->neighbors, newfacet);
    -          qh_setappend(&newfacet->neighbors, neighbor);
    -          neighbor->visitid= qh visit_id;
    -          newneighbors++;
    -        }
    -      }
    -    }
    -  }
    -  trace2((qh ferr, 2032, "qh_mergecycle_neighbors: deleted %d neighbors and added %d\n",
    -             delneighbors, newneighbors));
    -} /* mergecycle_neighbors */
    -
    -/*---------------------------------
    -
    -  qh_mergecycle_ridges( samecycle, newfacet )
    -    add ridges/neighbors for facets in samecycle to newfacet
    -    all new/old neighbors of newfacet marked with qh.visit_id
    -    facets in samecycle marked with qh.visit_id-1
    -    newfacet marked with qh.visit_id
    -
    -  returns:
    -    newfacet has merged ridges
    -
    -  notes:
    -    ridge already updated for simplicial neighbors of samecycle with a ridge
    -
    -  see:
    -    qh_mergeridges()
    -    qh_makeridges()
    -
    -  design:
    -    remove ridges between newfacet and samecycle
    -    for each facet in samecycle
    -      for each ridge in facet
    -        update facet pointers in ridge
    -        skip ridges processed in qh_mergecycle_neighors
    -        free ridges between newfacet and samecycle
    -        free ridges between facets of samecycle (on 2nd visit)
    -        append remaining ridges to newfacet
    -      if simpilicial facet
    -        for each neighbor of facet
    -          if simplicial facet
    -          and not samecycle facet or newfacet
    -            make ridge between neighbor and newfacet
    -*/
    -void qh_mergecycle_ridges(facetT *samecycle, facetT *newfacet) {
    -  facetT *same, *neighbor= NULL;
    -  int numold=0, numnew=0;
    -  int neighbor_i, neighbor_n;
    -  unsigned int samevisitid;
    -  ridgeT *ridge, **ridgep;
    -  boolT toporient;
    -  void **freelistp; /* used if !qh_NOmem by qh_memfree_() */
    -
    -  trace4((qh ferr, 4033, "qh_mergecycle_ridges: delete shared ridges from newfacet\n"));
    -  samevisitid= qh visit_id -1;
    -  FOREACHridge_(newfacet->ridges) {
    -    neighbor= otherfacet_(ridge, newfacet);
    -    if (neighbor->visitid == samevisitid)
    -      SETref_(ridge)= NULL; /* ridge free'd below */
    -  }
    -  qh_setcompact(newfacet->ridges);
    -
    -  trace4((qh ferr, 4034, "qh_mergecycle_ridges: add ridges to newfacet\n"));
    -  FORALLsame_cycle_(samecycle) {
    -    FOREACHridge_(same->ridges) {
    -      if (ridge->top == same) {
    -        ridge->top= newfacet;
    -        neighbor= ridge->bottom;
    -      }else if (ridge->bottom == same) {
    -        ridge->bottom= newfacet;
    -        neighbor= ridge->top;
    -      }else if (ridge->top == newfacet || ridge->bottom == newfacet) {
    -        qh_setappend(&newfacet->ridges, ridge);
    -        numold++;  /* already set by qh_mergecycle_neighbors */
    -        continue;
    -      }else {
    -        qh_fprintf(qh ferr, 6098, "qhull internal error (qh_mergecycle_ridges): bad ridge r%d\n", ridge->id);
    -        qh_errexit(qh_ERRqhull, NULL, ridge);
    -      }
    -      if (neighbor == newfacet) {
    -        qh_setfree(&(ridge->vertices));
    -        qh_memfree_(ridge, (int)sizeof(ridgeT), freelistp);
    -        numold++;
    -      }else if (neighbor->visitid == samevisitid) {
    -        qh_setdel(neighbor->ridges, ridge);
    -        qh_setfree(&(ridge->vertices));
    -        qh_memfree_(ridge, (int)sizeof(ridgeT), freelistp);
    -        numold++;
    -      }else {
    -        qh_setappend(&newfacet->ridges, ridge);
    -        numold++;
    -      }
    -    }
    -    if (same->ridges)
    -      qh_settruncate(same->ridges, 0);
    -    if (!same->simplicial)
    -      continue;
    -    FOREACHneighbor_i_(same) {       /* note: !newfact->simplicial */
    -      if (neighbor->visitid != samevisitid && neighbor->simplicial) {
    -        ridge= qh_newridge();
    -        ridge->vertices= qh_setnew_delnthsorted(same->vertices, qh hull_dim,
    -                                                          neighbor_i, 0);
    -        toporient= same->toporient ^ (neighbor_i & 0x1);
    -        if (toporient) {
    -          ridge->top= newfacet;
    -          ridge->bottom= neighbor;
    -        }else {
    -          ridge->top= neighbor;
    -          ridge->bottom= newfacet;
    -        }
    -        qh_setappend(&(newfacet->ridges), ridge);
    -        qh_setappend(&(neighbor->ridges), ridge);
    -        numnew++;
    -      }
    -    }
    -  }
    -
    -  trace2((qh ferr, 2033, "qh_mergecycle_ridges: found %d old ridges and %d new ones\n",
    -             numold, numnew));
    -} /* mergecycle_ridges */
    -
    -/*---------------------------------
    -
    -  qh_mergecycle_vneighbors( samecycle, newfacet )
    -    create vertex neighbors for newfacet from vertices of facets in samecycle
    -    samecycle marked with visitid == qh.visit_id - 1
    -
    -  returns:
    -    newfacet vertices with updated neighbors
    -    marks newfacet with qh.visit_id-1
    -    deletes vertices that are merged away
    -    sets delridge on all vertices (faster here than in mergecycle_ridges)
    -
    -  see:
    -    qh_mergevertex_neighbors()
    -
    -  design:
    -    for each vertex of samecycle facet
    -      set vertex->delridge
    -      delete samecycle facets from vertex neighbors
    -      append newfacet to vertex neighbors
    -      if vertex only in newfacet
    -        delete it from newfacet
    -        add it to qh.del_vertices for later deletion
    -*/
    -void qh_mergecycle_vneighbors(facetT *samecycle, facetT *newfacet) {
    -  facetT *neighbor, **neighborp;
    -  unsigned int mergeid;
    -  vertexT *vertex, **vertexp, *apex;
    -  setT *vertices;
    -
    -  trace4((qh ferr, 4035, "qh_mergecycle_vneighbors: update vertex neighbors for newfacet\n"));
    -  mergeid= qh visit_id - 1;
    -  newfacet->visitid= mergeid;
    -  vertices= qh_basevertices(samecycle); /* temp */
    -  apex= SETfirstt_(samecycle->vertices, vertexT);
    -  qh_setappend(&vertices, apex);
    -  FOREACHvertex_(vertices) {
    -    vertex->delridge= True;
    -    FOREACHneighbor_(vertex) {
    -      if (neighbor->visitid == mergeid)
    -        SETref_(neighbor)= NULL;
    -    }
    -    qh_setcompact(vertex->neighbors);
    -    qh_setappend(&vertex->neighbors, newfacet);
    -    if (!SETsecond_(vertex->neighbors)) {
    -      zinc_(Zcyclevertex);
    -      trace2((qh ferr, 2034, "qh_mergecycle_vneighbors: deleted v%d when merging cycle f%d into f%d\n",
    -        vertex->id, samecycle->id, newfacet->id));
    -      qh_setdelsorted(newfacet->vertices, vertex);
    -      vertex->deleted= True;
    -      qh_setappend(&qh del_vertices, vertex);
    -    }
    -  }
    -  qh_settempfree(&vertices);
    -  trace3((qh ferr, 3005, "qh_mergecycle_vneighbors: merged vertices from cycle f%d into f%d\n",
    -             samecycle->id, newfacet->id));
    -} /* mergecycle_vneighbors */
    -
    -/*---------------------------------
    -
    -  qh_mergefacet( facet1, facet2, mindist, maxdist, mergeapex )
    -    merges facet1 into facet2
    -    mergeapex==qh_MERGEapex if merging new facet into coplanar horizon
    -
    -  returns:
    -    qh.max_outside and qh.min_vertex updated
    -    initializes vertex neighbors on first merge
    -
    -  returns:
    -    facet2 contains facet1's vertices, neighbors, and ridges
    -      facet2 moved to end of qh.facet_list
    -      makes facet2 a newfacet
    -      sets facet2->newmerge set
    -      clears facet2->center (unless merging into a large facet)
    -      clears facet2->tested and ridge->tested for facet1
    -
    -    facet1 prepended to visible_list for later deletion and partitioning
    -      facet1->f.replace == facet2
    -
    -    adds neighboring facets to facet_mergeset if redundant or degenerate
    -
    -  notes:
    -    mindist/maxdist may be NULL (only if both NULL)
    -    traces merge if fmax_(maxdist,-mindist) > TRACEdist
    -
    -  see:
    -    qh_mergecycle()
    -
    -  design:
    -    trace merge and check for degenerate simplex
    -    make ridges for both facets
    -    update qh.max_outside, qh.max_vertex, qh.min_vertex
    -    update facet2->maxoutside and keepcentrum
    -    update facet2->nummerge
    -    update tested flags for facet2
    -    if facet1 is simplicial
    -      merge facet1 into facet2
    -    else
    -      merge facet1's neighbors into facet2
    -      merge facet1's ridges into facet2
    -      merge facet1's vertices into facet2
    -      merge facet1's vertex neighbors into facet2
    -      add facet2's vertices to qh.new_vertexlist
    -      unless qh_MERGEapex
    -        test facet2 for degenerate or redundant neighbors
    -      move facet1 to qh.visible_list for later deletion
    -      move facet2 to end of qh.newfacet_list
    -*/
    -void qh_mergefacet(facetT *facet1, facetT *facet2, realT *mindist, realT *maxdist, boolT mergeapex) {
    -  boolT traceonce= False;
    -  vertexT *vertex, **vertexp;
    -  int tracerestore=0, nummerge;
    -
    -  if (facet1->tricoplanar || facet2->tricoplanar) {
    -    if (!qh TRInormals) {
    -      qh_fprintf(qh ferr, 6226, "Qhull internal error (qh_mergefacet): does not work for tricoplanar facets.  Use option 'Q11'\n");
    -      qh_errexit2(qh_ERRqhull, facet1, facet2);
    -    }
    -    if (facet2->tricoplanar) {
    -      facet2->tricoplanar= False;
    -      facet2->keepcentrum= False;
    -    }
    -  }
    -  zzinc_(Ztotmerge);
    -  if (qh REPORTfreq2 && qh POSTmerging) {
    -    if (zzval_(Ztotmerge) > qh mergereport + qh REPORTfreq2)
    -      qh_tracemerging();
    -  }
    -#ifndef qh_NOtrace
    -  if (qh build_cnt >= qh RERUN) {
    -    if (mindist && (-*mindist > qh TRACEdist || *maxdist > qh TRACEdist)) {
    -      tracerestore= 0;
    -      qh IStracing= qh TRACElevel;
    -      traceonce= True;
    -      qh_fprintf(qh ferr, 8075, "qh_mergefacet: ========= trace wide merge #%d(%2.2g) for f%d into f%d, last point was p%d\n", zzval_(Ztotmerge),
    -             fmax_(-*mindist, *maxdist), facet1->id, facet2->id, qh furthest_id);
    -    }else if (facet1 == qh tracefacet || facet2 == qh tracefacet) {
    -      tracerestore= qh IStracing;
    -      qh IStracing= 4;
    -      traceonce= True;
    -      qh_fprintf(qh ferr, 8076, "qh_mergefacet: ========= trace merge #%d involving f%d, furthest is p%d\n",
    -                 zzval_(Ztotmerge), qh tracefacet_id,  qh furthest_id);
    -    }
    -  }
    -  if (qh IStracing >= 2) {
    -    realT mergemin= -2;
    -    realT mergemax= -2;
    -
    -    if (mindist) {
    -      mergemin= *mindist;
    -      mergemax= *maxdist;
    -    }
    -    qh_fprintf(qh ferr, 8077, "qh_mergefacet: #%d merge f%d into f%d, mindist= %2.2g, maxdist= %2.2g\n",
    -    zzval_(Ztotmerge), facet1->id, facet2->id, mergemin, mergemax);
    -  }
    -#endif /* !qh_NOtrace */
    -  if (facet1 == facet2 || facet1->visible || facet2->visible) {
    -    qh_fprintf(qh ferr, 6099, "qhull internal error (qh_mergefacet): either f%d and f%d are the same or one is a visible facet\n",
    -             facet1->id, facet2->id);
    -    qh_errexit2(qh_ERRqhull, facet1, facet2);
    -  }
    -  if (qh num_facets - qh num_visible <= qh hull_dim + 1) {
    -    qh_fprintf(qh ferr, 6227, "\n\
    -qhull precision error: Only %d facets remain.  Can not merge another\n\
    -pair.  The input is too degenerate or the convexity constraints are\n\
    -too strong.\n", qh hull_dim+1);
    -    if (qh hull_dim >= 5 && !qh MERGEexact)
    -      qh_fprintf(qh ferr, 8079, "Option 'Qx' may avoid this problem.\n");
    -    qh_errexit(qh_ERRprec, NULL, NULL);
    -  }
    -  if (!qh VERTEXneighbors)
    -    qh_vertexneighbors();
    -  qh_makeridges(facet1);
    -  qh_makeridges(facet2);
    -  if (qh IStracing >=4)
    -    qh_errprint("MERGING", facet1, facet2, NULL, NULL);
    -  if (mindist) {
    -    maximize_(qh max_outside, *maxdist);
    -    maximize_(qh max_vertex, *maxdist);
    -#if qh_MAXoutside
    -    maximize_(facet2->maxoutside, *maxdist);
    -#endif
    -    minimize_(qh min_vertex, *mindist);
    -    if (!facet2->keepcentrum
    -    && (*maxdist > qh WIDEfacet || *mindist < -qh WIDEfacet)) {
    -      facet2->keepcentrum= True;
    -      zinc_(Zwidefacet);
    -    }
    -  }
    -  nummerge= facet1->nummerge + facet2->nummerge + 1;
    -  if (nummerge >= qh_MAXnummerge)
    -    facet2->nummerge= qh_MAXnummerge;
    -  else
    -    facet2->nummerge= (short unsigned int)nummerge;
    -  facet2->newmerge= True;
    -  facet2->dupridge= False;
    -  qh_updatetested(facet1, facet2);
    -  if (qh hull_dim > 2 && qh_setsize(facet1->vertices) == qh hull_dim)
    -    qh_mergesimplex(facet1, facet2, mergeapex);
    -  else {
    -    qh vertex_visit++;
    -    FOREACHvertex_(facet2->vertices)
    -      vertex->visitid= qh vertex_visit;
    -    if (qh hull_dim == 2)
    -      qh_mergefacet2d(facet1, facet2);
    -    else {
    -      qh_mergeneighbors(facet1, facet2);
    -      qh_mergevertices(facet1->vertices, &facet2->vertices);
    -    }
    -    qh_mergeridges(facet1, facet2);
    -    qh_mergevertex_neighbors(facet1, facet2);
    -    if (!facet2->newfacet)
    -      qh_newvertices(facet2->vertices);
    -  }
    -  if (!mergeapex)
    -    qh_degen_redundant_neighbors(facet2, facet1);
    -  if (facet2->coplanar || !facet2->newfacet) {
    -    zinc_(Zmergeintohorizon);
    -  }else if (!facet1->newfacet && facet2->newfacet) {
    -    zinc_(Zmergehorizon);
    -  }else {
    -    zinc_(Zmergenew);
    -  }
    -  qh_willdelete(facet1, facet2);
    -  qh_removefacet(facet2);  /* append as a newfacet to end of qh facet_list */
    -  qh_appendfacet(facet2);
    -  facet2->newfacet= True;
    -  facet2->tested= False;
    -  qh_tracemerge(facet1, facet2);
    -  if (traceonce) {
    -    qh_fprintf(qh ferr, 8080, "qh_mergefacet: end of wide tracing\n");
    -    qh IStracing= tracerestore;
    -  }
    -} /* mergefacet */
    -
    -
    -/*---------------------------------
    -
    -  qh_mergefacet2d( facet1, facet2 )
    -    in 2d, merges neighbors and vertices of facet1 into facet2
    -
    -  returns:
    -    build ridges for neighbors if necessary
    -    facet2 looks like a simplicial facet except for centrum, ridges
    -      neighbors are opposite the corresponding vertex
    -      maintains orientation of facet2
    -
    -  notes:
    -    qh_mergefacet() retains non-simplicial structures
    -      they are not needed in 2d, but later routines may use them
    -    preserves qh.vertex_visit for qh_mergevertex_neighbors()
    -
    -  design:
    -    get vertices and neighbors
    -    determine new vertices and neighbors
    -    set new vertices and neighbors and adjust orientation
    -    make ridges for new neighbor if needed
    -*/
    -void qh_mergefacet2d(facetT *facet1, facetT *facet2) {
    -  vertexT *vertex1A, *vertex1B, *vertex2A, *vertex2B, *vertexA, *vertexB;
    -  facetT *neighbor1A, *neighbor1B, *neighbor2A, *neighbor2B, *neighborA, *neighborB;
    -
    -  vertex1A= SETfirstt_(facet1->vertices, vertexT);
    -  vertex1B= SETsecondt_(facet1->vertices, vertexT);
    -  vertex2A= SETfirstt_(facet2->vertices, vertexT);
    -  vertex2B= SETsecondt_(facet2->vertices, vertexT);
    -  neighbor1A= SETfirstt_(facet1->neighbors, facetT);
    -  neighbor1B= SETsecondt_(facet1->neighbors, facetT);
    -  neighbor2A= SETfirstt_(facet2->neighbors, facetT);
    -  neighbor2B= SETsecondt_(facet2->neighbors, facetT);
    -  if (vertex1A == vertex2A) {
    -    vertexA= vertex1B;
    -    vertexB= vertex2B;
    -    neighborA= neighbor2A;
    -    neighborB= neighbor1A;
    -  }else if (vertex1A == vertex2B) {
    -    vertexA= vertex1B;
    -    vertexB= vertex2A;
    -    neighborA= neighbor2B;
    -    neighborB= neighbor1A;
    -  }else if (vertex1B == vertex2A) {
    -    vertexA= vertex1A;
    -    vertexB= vertex2B;
    -    neighborA= neighbor2A;
    -    neighborB= neighbor1B;
    -  }else { /* 1B == 2B */
    -    vertexA= vertex1A;
    -    vertexB= vertex2A;
    -    neighborA= neighbor2B;
    -    neighborB= neighbor1B;
    -  }
    -  /* vertexB always from facet2, neighborB always from facet1 */
    -  if (vertexA->id > vertexB->id) {
    -    SETfirst_(facet2->vertices)= vertexA;
    -    SETsecond_(facet2->vertices)= vertexB;
    -    if (vertexB == vertex2A)
    -      facet2->toporient= !facet2->toporient;
    -    SETfirst_(facet2->neighbors)= neighborA;
    -    SETsecond_(facet2->neighbors)= neighborB;
    -  }else {
    -    SETfirst_(facet2->vertices)= vertexB;
    -    SETsecond_(facet2->vertices)= vertexA;
    -    if (vertexB == vertex2B)
    -      facet2->toporient= !facet2->toporient;
    -    SETfirst_(facet2->neighbors)= neighborB;
    -    SETsecond_(facet2->neighbors)= neighborA;
    -  }
    -  qh_makeridges(neighborB);
    -  qh_setreplace(neighborB->neighbors, facet1, facet2);
    -  trace4((qh ferr, 4036, "qh_mergefacet2d: merged v%d and neighbor f%d of f%d into f%d\n",
    -       vertexA->id, neighborB->id, facet1->id, facet2->id));
    -} /* mergefacet2d */
    -
    -
    -/*---------------------------------
    -
    -  qh_mergeneighbors( facet1, facet2 )
    -    merges the neighbors of facet1 into facet2
    -
    -  see:
    -    qh_mergecycle_neighbors()
    -
    -  design:
    -    for each neighbor of facet1
    -      if neighbor is also a neighbor of facet2
    -        if neighbor is simpilicial
    -          make ridges for later deletion as a degenerate facet
    -        update its neighbor set
    -      else
    -        move the neighbor relation to facet2
    -    remove the neighbor relation for facet1 and facet2
    -*/
    -void qh_mergeneighbors(facetT *facet1, facetT *facet2) {
    -  facetT *neighbor, **neighborp;
    -
    -  trace4((qh ferr, 4037, "qh_mergeneighbors: merge neighbors of f%d and f%d\n",
    -          facet1->id, facet2->id));
    -  qh visit_id++;
    -  FOREACHneighbor_(facet2) {
    -    neighbor->visitid= qh visit_id;
    -  }
    -  FOREACHneighbor_(facet1) {
    -    if (neighbor->visitid == qh visit_id) {
    -      if (neighbor->simplicial)    /* is degen, needs ridges */
    -        qh_makeridges(neighbor);
    -      if (SETfirstt_(neighbor->neighbors, facetT) != facet1) /*keep newfacet->horizon*/
    -        qh_setdel(neighbor->neighbors, facet1);
    -      else {
    -        qh_setdel(neighbor->neighbors, facet2);
    -        qh_setreplace(neighbor->neighbors, facet1, facet2);
    -      }
    -    }else if (neighbor != facet2) {
    -      qh_setappend(&(facet2->neighbors), neighbor);
    -      qh_setreplace(neighbor->neighbors, facet1, facet2);
    -    }
    -  }
    -  qh_setdel(facet1->neighbors, facet2);  /* here for makeridges */
    -  qh_setdel(facet2->neighbors, facet1);
    -} /* mergeneighbors */
    -
    -
    -/*---------------------------------
    -
    -  qh_mergeridges( facet1, facet2 )
    -    merges the ridge set of facet1 into facet2
    -
    -  returns:
    -    may delete all ridges for a vertex
    -    sets vertex->delridge on deleted ridges
    -
    -  see:
    -    qh_mergecycle_ridges()
    -
    -  design:
    -    delete ridges between facet1 and facet2
    -      mark (delridge) vertices on these ridges for later testing
    -    for each remaining ridge
    -      rename facet1 to facet2
    -*/
    -void qh_mergeridges(facetT *facet1, facetT *facet2) {
    -  ridgeT *ridge, **ridgep;
    -  vertexT *vertex, **vertexp;
    -
    -  trace4((qh ferr, 4038, "qh_mergeridges: merge ridges of f%d and f%d\n",
    -          facet1->id, facet2->id));
    -  FOREACHridge_(facet2->ridges) {
    -    if ((ridge->top == facet1) || (ridge->bottom == facet1)) {
    -      FOREACHvertex_(ridge->vertices)
    -        vertex->delridge= True;
    -      qh_delridge(ridge);  /* expensive in high-d, could rebuild */
    -      ridgep--; /*repeat*/
    -    }
    -  }
    -  FOREACHridge_(facet1->ridges) {
    -    if (ridge->top == facet1)
    -      ridge->top= facet2;
    -    else
    -      ridge->bottom= facet2;
    -    qh_setappend(&(facet2->ridges), ridge);
    -  }
    -} /* mergeridges */
    -
    -
    -/*---------------------------------
    -
    -  qh_mergesimplex( facet1, facet2, mergeapex )
    -    merge simplicial facet1 into facet2
    -    mergeapex==qh_MERGEapex if merging samecycle into horizon facet
    -      vertex id is latest (most recently created)
    -    facet1 may be contained in facet2
    -    ridges exist for both facets
    -
    -  returns:
    -    facet2 with updated vertices, ridges, neighbors
    -    updated neighbors for facet1's vertices
    -    facet1 not deleted
    -    sets vertex->delridge on deleted ridges
    -
    -  notes:
    -    special case code since this is the most common merge
    -    called from qh_mergefacet()
    -
    -  design:
    -    if qh_MERGEapex
    -      add vertices of facet2 to qh.new_vertexlist if necessary
    -      add apex to facet2
    -    else
    -      for each ridge between facet1 and facet2
    -        set vertex->delridge
    -      determine the apex for facet1 (i.e., vertex to be merged)
    -      unless apex already in facet2
    -        insert apex into vertices for facet2
    -      add vertices of facet2 to qh.new_vertexlist if necessary
    -      add apex to qh.new_vertexlist if necessary
    -      for each vertex of facet1
    -        if apex
    -          rename facet1 to facet2 in its vertex neighbors
    -        else
    -          delete facet1 from vertex neighors
    -          if only in facet2
    -            add vertex to qh.del_vertices for later deletion
    -      for each ridge of facet1
    -        delete ridges between facet1 and facet2
    -        append other ridges to facet2 after renaming facet to facet2
    -*/
    -void qh_mergesimplex(facetT *facet1, facetT *facet2, boolT mergeapex) {
    -  vertexT *vertex, **vertexp, *apex;
    -  ridgeT *ridge, **ridgep;
    -  boolT issubset= False;
    -  int vertex_i= -1, vertex_n;
    -  facetT *neighbor, **neighborp, *otherfacet;
    -
    -  if (mergeapex) {
    -    if (!facet2->newfacet)
    -      qh_newvertices(facet2->vertices);  /* apex is new */
    -    apex= SETfirstt_(facet1->vertices, vertexT);
    -    if (SETfirstt_(facet2->vertices, vertexT) != apex)
    -      qh_setaddnth(&facet2->vertices, 0, apex);  /* apex has last id */
    -    else
    -      issubset= True;
    -  }else {
    -    zinc_(Zmergesimplex);
    -    FOREACHvertex_(facet1->vertices)
    -      vertex->seen= False;
    -    FOREACHridge_(facet1->ridges) {
    -      if (otherfacet_(ridge, facet1) == facet2) {
    -        FOREACHvertex_(ridge->vertices) {
    -          vertex->seen= True;
    -          vertex->delridge= True;
    -        }
    -        break;
    -      }
    -    }
    -    FOREACHvertex_(facet1->vertices) {
    -      if (!vertex->seen)
    -        break;  /* must occur */
    -    }
    -    apex= vertex;
    -    trace4((qh ferr, 4039, "qh_mergesimplex: merge apex v%d of f%d into facet f%d\n",
    -          apex->id, facet1->id, facet2->id));
    -    FOREACHvertex_i_(facet2->vertices) {
    -      if (vertex->id < apex->id) {
    -        break;
    -      }else if (vertex->id == apex->id) {
    -        issubset= True;
    -        break;
    -      }
    -    }
    -    if (!issubset)
    -      qh_setaddnth(&facet2->vertices, vertex_i, apex);
    -    if (!facet2->newfacet)
    -      qh_newvertices(facet2->vertices);
    -    else if (!apex->newlist) {
    -      qh_removevertex(apex);
    -      qh_appendvertex(apex);
    -    }
    -  }
    -  trace4((qh ferr, 4040, "qh_mergesimplex: update vertex neighbors of f%d\n",
    -          facet1->id));
    -  FOREACHvertex_(facet1->vertices) {
    -    if (vertex == apex && !issubset)
    -      qh_setreplace(vertex->neighbors, facet1, facet2);
    -    else {
    -      qh_setdel(vertex->neighbors, facet1);
    -      if (!SETsecond_(vertex->neighbors))
    -        qh_mergevertex_del(vertex, facet1, facet2);
    -    }
    -  }
    -  trace4((qh ferr, 4041, "qh_mergesimplex: merge ridges and neighbors of f%d into f%d\n",
    -          facet1->id, facet2->id));
    -  qh visit_id++;
    -  FOREACHneighbor_(facet2)
    -    neighbor->visitid= qh visit_id;
    -  FOREACHridge_(facet1->ridges) {
    -    otherfacet= otherfacet_(ridge, facet1);
    -    if (otherfacet == facet2) {
    -      qh_setdel(facet2->ridges, ridge);
    -      qh_setfree(&(ridge->vertices));
    -      qh_memfree(ridge, (int)sizeof(ridgeT));
    -      qh_setdel(facet2->neighbors, facet1);
    -    }else {
    -      qh_setappend(&facet2->ridges, ridge);
    -      if (otherfacet->visitid != qh visit_id) {
    -        qh_setappend(&facet2->neighbors, otherfacet);
    -        qh_setreplace(otherfacet->neighbors, facet1, facet2);
    -        otherfacet->visitid= qh visit_id;
    -      }else {
    -        if (otherfacet->simplicial)    /* is degen, needs ridges */
    -          qh_makeridges(otherfacet);
    -        if (SETfirstt_(otherfacet->neighbors, facetT) != facet1)
    -          qh_setdel(otherfacet->neighbors, facet1);
    -        else {   /*keep newfacet->neighbors->horizon*/
    -          qh_setdel(otherfacet->neighbors, facet2);
    -          qh_setreplace(otherfacet->neighbors, facet1, facet2);
    -        }
    -      }
    -      if (ridge->top == facet1) /* wait until after qh_makeridges */
    -        ridge->top= facet2;
    -      else
    -        ridge->bottom= facet2;
    -    }
    -  }
    -  SETfirst_(facet1->ridges)= NULL; /* it will be deleted */
    -  trace3((qh ferr, 3006, "qh_mergesimplex: merged simplex f%d apex v%d into facet f%d\n",
    -          facet1->id, getid_(apex), facet2->id));
    -} /* mergesimplex */
    -
    -/*---------------------------------
    -
    -  qh_mergevertex_del( vertex, facet1, facet2 )
    -    delete a vertex because of merging facet1 into facet2
    -
    -  returns:
    -    deletes vertex from facet2
    -    adds vertex to qh.del_vertices for later deletion
    -*/
    -void qh_mergevertex_del(vertexT *vertex, facetT *facet1, facetT *facet2) {
    -
    -  zinc_(Zmergevertex);
    -  trace2((qh ferr, 2035, "qh_mergevertex_del: deleted v%d when merging f%d into f%d\n",
    -          vertex->id, facet1->id, facet2->id));
    -  qh_setdelsorted(facet2->vertices, vertex);
    -  vertex->deleted= True;
    -  qh_setappend(&qh del_vertices, vertex);
    -} /* mergevertex_del */
    -
    -/*---------------------------------
    -
    -  qh_mergevertex_neighbors( facet1, facet2 )
    -    merge the vertex neighbors of facet1 to facet2
    -
    -  returns:
    -    if vertex is current qh.vertex_visit
    -      deletes facet1 from vertex->neighbors
    -    else
    -      renames facet1 to facet2 in vertex->neighbors
    -    deletes vertices if only one neighbor
    -
    -  notes:
    -    assumes vertex neighbor sets are good
    -*/
    -void qh_mergevertex_neighbors(facetT *facet1, facetT *facet2) {
    -  vertexT *vertex, **vertexp;
    -
    -  trace4((qh ferr, 4042, "qh_mergevertex_neighbors: merge vertex neighbors of f%d and f%d\n",
    -          facet1->id, facet2->id));
    -  if (qh tracevertex) {
    -    qh_fprintf(qh ferr, 8081, "qh_mergevertex_neighbors: of f%d and f%d at furthest p%d f0= %p\n",
    -             facet1->id, facet2->id, qh furthest_id, qh tracevertex->neighbors->e[0].p);
    -    qh_errprint("TRACE", NULL, NULL, NULL, qh tracevertex);
    -  }
    -  FOREACHvertex_(facet1->vertices) {
    -    if (vertex->visitid != qh vertex_visit)
    -      qh_setreplace(vertex->neighbors, facet1, facet2);
    -    else {
    -      qh_setdel(vertex->neighbors, facet1);
    -      if (!SETsecond_(vertex->neighbors))
    -        qh_mergevertex_del(vertex, facet1, facet2);
    -    }
    -  }
    -  if (qh tracevertex)
    -    qh_errprint("TRACE", NULL, NULL, NULL, qh tracevertex);
    -} /* mergevertex_neighbors */
    -
    -
    -/*---------------------------------
    -
    -  qh_mergevertices( vertices1, vertices2 )
    -    merges the vertex set of facet1 into facet2
    -
    -  returns:
    -    replaces vertices2 with merged set
    -    preserves vertex_visit for qh_mergevertex_neighbors
    -    updates qh.newvertex_list
    -
    -  design:
    -    create a merged set of both vertices (in inverse id order)
    -*/
    -void qh_mergevertices(setT *vertices1, setT **vertices2) {
    -  int newsize= qh_setsize(vertices1)+qh_setsize(*vertices2) - qh hull_dim + 1;
    -  setT *mergedvertices;
    -  vertexT *vertex, **vertexp, **vertex2= SETaddr_(*vertices2, vertexT);
    -
    -  mergedvertices= qh_settemp(newsize);
    -  FOREACHvertex_(vertices1) {
    -    if (!*vertex2 || vertex->id > (*vertex2)->id)
    -      qh_setappend(&mergedvertices, vertex);
    -    else {
    -      while (*vertex2 && (*vertex2)->id > vertex->id)
    -        qh_setappend(&mergedvertices, *vertex2++);
    -      if (!*vertex2 || (*vertex2)->id < vertex->id)
    -        qh_setappend(&mergedvertices, vertex);
    -      else
    -        qh_setappend(&mergedvertices, *vertex2++);
    -    }
    -  }
    -  while (*vertex2)
    -    qh_setappend(&mergedvertices, *vertex2++);
    -  if (newsize < qh_setsize(mergedvertices)) {
    -    qh_fprintf(qh ferr, 6100, "qhull internal error (qh_mergevertices): facets did not share a ridge\n");
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -  qh_setfree(vertices2);
    -  *vertices2= mergedvertices;
    -  qh_settemppop();
    -} /* mergevertices */
    -
    -
    -/*---------------------------------
    -
    -  qh_neighbor_intersections( vertex )
    -    return intersection of all vertices in vertex->neighbors except for vertex
    -
    -  returns:
    -    returns temporary set of vertices
    -    does not include vertex
    -    NULL if a neighbor is simplicial
    -    NULL if empty set
    -
    -  notes:
    -    used for renaming vertices
    -
    -  design:
    -    initialize the intersection set with vertices of the first two neighbors
    -    delete vertex from the intersection
    -    for each remaining neighbor
    -      intersect its vertex set with the intersection set
    -      return NULL if empty
    -    return the intersection set
    -*/
    -setT *qh_neighbor_intersections(vertexT *vertex) {
    -  facetT *neighbor, **neighborp, *neighborA, *neighborB;
    -  setT *intersect;
    -  int neighbor_i, neighbor_n;
    -
    -  FOREACHneighbor_(vertex) {
    -    if (neighbor->simplicial)
    -      return NULL;
    -  }
    -  neighborA= SETfirstt_(vertex->neighbors, facetT);
    -  neighborB= SETsecondt_(vertex->neighbors, facetT);
    -  zinc_(Zintersectnum);
    -  if (!neighborA)
    -    return NULL;
    -  if (!neighborB)
    -    intersect= qh_setcopy(neighborA->vertices, 0);
    -  else
    -    intersect= qh_vertexintersect_new(neighborA->vertices, neighborB->vertices);
    -  qh_settemppush(intersect);
    -  qh_setdelsorted(intersect, vertex);
    -  FOREACHneighbor_i_(vertex) {
    -    if (neighbor_i >= 2) {
    -      zinc_(Zintersectnum);
    -      qh_vertexintersect(&intersect, neighbor->vertices);
    -      if (!SETfirst_(intersect)) {
    -        zinc_(Zintersectfail);
    -        qh_settempfree(&intersect);
    -        return NULL;
    -      }
    -    }
    -  }
    -  trace3((qh ferr, 3007, "qh_neighbor_intersections: %d vertices in neighbor intersection of v%d\n",
    -          qh_setsize(intersect), vertex->id));
    -  return intersect;
    -} /* neighbor_intersections */
    -
    -/*---------------------------------
    -
    -  qh_newvertices( vertices )
    -    add vertices to end of qh.vertex_list (marks as new vertices)
    -
    -  returns:
    -    vertices on qh.newvertex_list
    -    vertex->newlist set
    -*/
    -void qh_newvertices(setT *vertices) {
    -  vertexT *vertex, **vertexp;
    -
    -  FOREACHvertex_(vertices) {
    -    if (!vertex->newlist) {
    -      qh_removevertex(vertex);
    -      qh_appendvertex(vertex);
    -    }
    -  }
    -} /* newvertices */
    -
    -/*---------------------------------
    -
    -  qh_reducevertices()
    -    reduce extra vertices, shared vertices, and redundant vertices
    -    facet->newmerge is set if merged since last call
    -    if !qh.MERGEvertices, only removes extra vertices
    -
    -  returns:
    -    True if also merged degen_redundant facets
    -    vertices are renamed if possible
    -    clears facet->newmerge and vertex->delridge
    -
    -  notes:
    -    ignored if 2-d
    -
    -  design:
    -    merge any degenerate or redundant facets
    -    for each newly merged facet
    -      remove extra vertices
    -    if qh.MERGEvertices
    -      for each newly merged facet
    -        for each vertex
    -          if vertex was on a deleted ridge
    -            rename vertex if it is shared
    -      remove delridge flag from new vertices
    -*/
    -boolT qh_reducevertices(void) {
    -  int numshare=0, numrename= 0;
    -  boolT degenredun= False;
    -  facetT *newfacet;
    -  vertexT *vertex, **vertexp;
    -
    -  if (qh hull_dim == 2)
    -    return False;
    -  if (qh_merge_degenredundant())
    -    degenredun= True;
    - LABELrestart:
    -  FORALLnew_facets {
    -    if (newfacet->newmerge) {
    -      if (!qh MERGEvertices)
    -        newfacet->newmerge= False;
    -      qh_remove_extravertices(newfacet);
    -    }
    -  }
    -  if (!qh MERGEvertices)
    -    return False;
    -  FORALLnew_facets {
    -    if (newfacet->newmerge) {
    -      newfacet->newmerge= False;
    -      FOREACHvertex_(newfacet->vertices) {
    -        if (vertex->delridge) {
    -          if (qh_rename_sharedvertex(vertex, newfacet)) {
    -            numshare++;
    -            vertexp--; /* repeat since deleted vertex */
    -          }
    -        }
    -      }
    -    }
    -  }
    -  FORALLvertex_(qh newvertex_list) {
    -    if (vertex->delridge && !vertex->deleted) {
    -      vertex->delridge= False;
    -      if (qh hull_dim >= 4 && qh_redundant_vertex(vertex)) {
    -        numrename++;
    -        if (qh_merge_degenredundant()) {
    -          degenredun= True;
    -          goto LABELrestart;
    -        }
    -      }
    -    }
    -  }
    -  trace1((qh ferr, 1014, "qh_reducevertices: renamed %d shared vertices and %d redundant vertices. Degen? %d\n",
    -          numshare, numrename, degenredun));
    -  return degenredun;
    -} /* reducevertices */
    -
    -/*---------------------------------
    -
    -  qh_redundant_vertex( vertex )
    -    detect and rename a redundant vertex
    -    vertices have full vertex->neighbors
    -
    -  returns:
    -    returns true if find a redundant vertex
    -      deletes vertex(vertex->deleted)
    -
    -  notes:
    -    only needed if vertex->delridge and hull_dim >= 4
    -    may add degenerate facets to qh.facet_mergeset
    -    doesn't change vertex->neighbors or create redundant facets
    -
    -  design:
    -    intersect vertices of all facet neighbors of vertex
    -    determine ridges for these vertices
    -    if find a new vertex for vertex amoung these ridges and vertices
    -      rename vertex to the new vertex
    -*/
    -vertexT *qh_redundant_vertex(vertexT *vertex) {
    -  vertexT *newvertex= NULL;
    -  setT *vertices, *ridges;
    -
    -  trace3((qh ferr, 3008, "qh_redundant_vertex: check if v%d can be renamed\n", vertex->id));
    -  if ((vertices= qh_neighbor_intersections(vertex))) {
    -    ridges= qh_vertexridges(vertex);
    -    if ((newvertex= qh_find_newvertex(vertex, vertices, ridges)))
    -      qh_renamevertex(vertex, newvertex, ridges, NULL, NULL);
    -    qh_settempfree(&ridges);
    -    qh_settempfree(&vertices);
    -  }
    -  return newvertex;
    -} /* redundant_vertex */
    -
    -/*---------------------------------
    -
    -  qh_remove_extravertices( facet )
    -    remove extra vertices from non-simplicial facets
    -
    -  returns:
    -    returns True if it finds them
    -
    -  design:
    -    for each vertex in facet
    -      if vertex not in a ridge (i.e., no longer used)
    -        delete vertex from facet
    -        delete facet from vertice's neighbors
    -        unless vertex in another facet
    -          add vertex to qh.del_vertices for later deletion
    -*/
    -boolT qh_remove_extravertices(facetT *facet) {
    -  ridgeT *ridge, **ridgep;
    -  vertexT *vertex, **vertexp;
    -  boolT foundrem= False;
    -
    -  trace4((qh ferr, 4043, "qh_remove_extravertices: test f%d for extra vertices\n",
    -          facet->id));
    -  FOREACHvertex_(facet->vertices)
    -    vertex->seen= False;
    -  FOREACHridge_(facet->ridges) {
    -    FOREACHvertex_(ridge->vertices)
    -      vertex->seen= True;
    -  }
    -  FOREACHvertex_(facet->vertices) {
    -    if (!vertex->seen) {
    -      foundrem= True;
    -      zinc_(Zremvertex);
    -      qh_setdelsorted(facet->vertices, vertex);
    -      qh_setdel(vertex->neighbors, facet);
    -      if (!qh_setsize(vertex->neighbors)) {
    -        vertex->deleted= True;
    -        qh_setappend(&qh del_vertices, vertex);
    -        zinc_(Zremvertexdel);
    -        trace2((qh ferr, 2036, "qh_remove_extravertices: v%d deleted because it's lost all ridges\n", vertex->id));
    -      }else
    -        trace3((qh ferr, 3009, "qh_remove_extravertices: v%d removed from f%d because it's lost all ridges\n", vertex->id, facet->id));
    -      vertexp--; /*repeat*/
    -    }
    -  }
    -  return foundrem;
    -} /* remove_extravertices */
    -
    -/*---------------------------------
    -
    -  qh_rename_sharedvertex( vertex, facet )
    -    detect and rename if shared vertex in facet
    -    vertices have full ->neighbors
    -
    -  returns:
    -    newvertex or NULL
    -    the vertex may still exist in other facets (i.e., a neighbor was pinched)
    -    does not change facet->neighbors
    -    updates vertex->neighbors
    -
    -  notes:
    -    a shared vertex for a facet is only in ridges to one neighbor
    -    this may undo a pinched facet
    -
    -    it does not catch pinches involving multiple facets.  These appear
    -      to be difficult to detect, since an exhaustive search is too expensive.
    -
    -  design:
    -    if vertex only has two neighbors
    -      determine the ridges that contain the vertex
    -      determine the vertices shared by both neighbors
    -      if can find a new vertex in this set
    -        rename the vertex to the new vertex
    -*/
    -vertexT *qh_rename_sharedvertex(vertexT *vertex, facetT *facet) {
    -  facetT *neighbor, **neighborp, *neighborA= NULL;
    -  setT *vertices, *ridges;
    -  vertexT *newvertex;
    -
    -  if (qh_setsize(vertex->neighbors) == 2) {
    -    neighborA= SETfirstt_(vertex->neighbors, facetT);
    -    if (neighborA == facet)
    -      neighborA= SETsecondt_(vertex->neighbors, facetT);
    -  }else if (qh hull_dim == 3)
    -    return NULL;
    -  else {
    -    qh visit_id++;
    -    FOREACHneighbor_(facet)
    -      neighbor->visitid= qh visit_id;
    -    FOREACHneighbor_(vertex) {
    -      if (neighbor->visitid == qh visit_id) {
    -        if (neighborA)
    -          return NULL;
    -        neighborA= neighbor;
    -      }
    -    }
    -    if (!neighborA) {
    -      qh_fprintf(qh ferr, 6101, "qhull internal error (qh_rename_sharedvertex): v%d's neighbors not in f%d\n",
    -        vertex->id, facet->id);
    -      qh_errprint("ERRONEOUS", facet, NULL, NULL, vertex);
    -      qh_errexit(qh_ERRqhull, NULL, NULL);
    -    }
    -  }
    -  /* the vertex is shared by facet and neighborA */
    -  ridges= qh_settemp(qh TEMPsize);
    -  neighborA->visitid= ++qh visit_id;
    -  qh_vertexridges_facet(vertex, facet, &ridges);
    -  trace2((qh ferr, 2037, "qh_rename_sharedvertex: p%d(v%d) is shared by f%d(%d ridges) and f%d\n",
    -    qh_pointid(vertex->point), vertex->id, facet->id, qh_setsize(ridges), neighborA->id));
    -  zinc_(Zintersectnum);
    -  vertices= qh_vertexintersect_new(facet->vertices, neighborA->vertices);
    -  qh_setdel(vertices, vertex);
    -  qh_settemppush(vertices);
    -  if ((newvertex= qh_find_newvertex(vertex, vertices, ridges)))
    -    qh_renamevertex(vertex, newvertex, ridges, facet, neighborA);
    -  qh_settempfree(&vertices);
    -  qh_settempfree(&ridges);
    -  return newvertex;
    -} /* rename_sharedvertex */
    -
    -/*---------------------------------
    -
    -  qh_renameridgevertex( ridge, oldvertex, newvertex )
    -    renames oldvertex as newvertex in ridge
    -
    -  returns:
    -
    -  design:
    -    delete oldvertex from ridge
    -    if newvertex already in ridge
    -      copy ridge->noconvex to another ridge if possible
    -      delete the ridge
    -    else
    -      insert newvertex into the ridge
    -      adjust the ridge's orientation
    -*/
    -void qh_renameridgevertex(ridgeT *ridge, vertexT *oldvertex, vertexT *newvertex) {
    -  int nth= 0, oldnth;
    -  facetT *temp;
    -  vertexT *vertex, **vertexp;
    -
    -  oldnth= qh_setindex(ridge->vertices, oldvertex);
    -  qh_setdelnthsorted(ridge->vertices, oldnth);
    -  FOREACHvertex_(ridge->vertices) {
    -    if (vertex == newvertex) {
    -      zinc_(Zdelridge);
    -      if (ridge->nonconvex) /* only one ridge has nonconvex set */
    -        qh_copynonconvex(ridge);
    -      trace2((qh ferr, 2038, "qh_renameridgevertex: ridge r%d deleted.  It contained both v%d and v%d\n",
    -        ridge->id, oldvertex->id, newvertex->id));
    -      qh_delridge(ridge);
    -      return;
    -    }
    -    if (vertex->id < newvertex->id)
    -      break;
    -    nth++;
    -  }
    -  qh_setaddnth(&ridge->vertices, nth, newvertex);
    -  if (abs(oldnth - nth)%2) {
    -    trace3((qh ferr, 3010, "qh_renameridgevertex: swapped the top and bottom of ridge r%d\n",
    -            ridge->id));
    -    temp= ridge->top;
    -    ridge->top= ridge->bottom;
    -    ridge->bottom= temp;
    -  }
    -} /* renameridgevertex */
    -
    -
    -/*---------------------------------
    -
    -  qh_renamevertex( oldvertex, newvertex, ridges, oldfacet, neighborA )
    -    renames oldvertex as newvertex in ridges
    -    gives oldfacet/neighborA if oldvertex is shared between two facets
    -
    -  returns:
    -    oldvertex may still exist afterwards
    -
    -
    -  notes:
    -    can not change neighbors of newvertex (since it's a subset)
    -
    -  design:
    -    for each ridge in ridges
    -      rename oldvertex to newvertex and delete degenerate ridges
    -    if oldfacet not defined
    -      for each neighbor of oldvertex
    -        delete oldvertex from neighbor's vertices
    -        remove extra vertices from neighbor
    -      add oldvertex to qh.del_vertices
    -    else if oldvertex only between oldfacet and neighborA
    -      delete oldvertex from oldfacet and neighborA
    -      add oldvertex to qh.del_vertices
    -    else oldvertex is in oldfacet and neighborA and other facets (i.e., pinched)
    -      delete oldvertex from oldfacet
    -      delete oldfacet from oldvertice's neighbors
    -      remove extra vertices (e.g., oldvertex) from neighborA
    -*/
    -void qh_renamevertex(vertexT *oldvertex, vertexT *newvertex, setT *ridges, facetT *oldfacet, facetT *neighborA) {
    -  facetT *neighbor, **neighborp;
    -  ridgeT *ridge, **ridgep;
    -  boolT istrace= False;
    -
    -  if (qh IStracing >= 2 || oldvertex->id == qh tracevertex_id ||
    -        newvertex->id == qh tracevertex_id)
    -    istrace= True;
    -  FOREACHridge_(ridges)
    -    qh_renameridgevertex(ridge, oldvertex, newvertex);
    -  if (!oldfacet) {
    -    zinc_(Zrenameall);
    -    if (istrace)
    -      qh_fprintf(qh ferr, 8082, "qh_renamevertex: renamed v%d to v%d in several facets\n",
    -               oldvertex->id, newvertex->id);
    -    FOREACHneighbor_(oldvertex) {
    -      qh_maydropneighbor(neighbor);
    -      qh_setdelsorted(neighbor->vertices, oldvertex);
    -      if (qh_remove_extravertices(neighbor))
    -        neighborp--; /* neighbor may be deleted */
    -    }
    -    if (!oldvertex->deleted) {
    -      oldvertex->deleted= True;
    -      qh_setappend(&qh del_vertices, oldvertex);
    -    }
    -  }else if (qh_setsize(oldvertex->neighbors) == 2) {
    -    zinc_(Zrenameshare);
    -    if (istrace)
    -      qh_fprintf(qh ferr, 8083, "qh_renamevertex: renamed v%d to v%d in oldfacet f%d\n",
    -               oldvertex->id, newvertex->id, oldfacet->id);
    -    FOREACHneighbor_(oldvertex)
    -      qh_setdelsorted(neighbor->vertices, oldvertex);
    -    oldvertex->deleted= True;
    -    qh_setappend(&qh del_vertices, oldvertex);
    -  }else {
    -    zinc_(Zrenamepinch);
    -    if (istrace || qh IStracing)
    -      qh_fprintf(qh ferr, 8084, "qh_renamevertex: renamed pinched v%d to v%d between f%d and f%d\n",
    -               oldvertex->id, newvertex->id, oldfacet->id, neighborA->id);
    -    qh_setdelsorted(oldfacet->vertices, oldvertex);
    -    qh_setdel(oldvertex->neighbors, oldfacet);
    -    qh_remove_extravertices(neighborA);
    -  }
    -} /* renamevertex */
    -
    -
    -/*---------------------------------
    -
    -  qh_test_appendmerge( facet, neighbor )
    -    tests facet/neighbor for convexity
    -    appends to mergeset if non-convex
    -    if pre-merging,
    -      nop if qh.SKIPconvex, or qh.MERGEexact and coplanar
    -
    -  returns:
    -    true if appends facet/neighbor to mergeset
    -    sets facet->center as needed
    -    does not change facet->seen
    -
    -  design:
    -    if qh.cos_max is defined
    -      if the angle between facet normals is too shallow
    -        append an angle-coplanar merge to qh.mergeset
    -        return True
    -    make facet's centrum if needed
    -    if facet's centrum is above the neighbor
    -      set isconcave
    -    else
    -      if facet's centrum is not below the neighbor
    -        set iscoplanar
    -      make neighbor's centrum if needed
    -      if neighbor's centrum is above the facet
    -        set isconcave
    -      else if neighbor's centrum is not below the facet
    -        set iscoplanar
    -   if isconcave or iscoplanar
    -     get angle if needed
    -     append concave or coplanar merge to qh.mergeset
    -*/
    -boolT qh_test_appendmerge(facetT *facet, facetT *neighbor) {
    -  realT dist, dist2= -REALmax, angle= -REALmax;
    -  boolT isconcave= False, iscoplanar= False, okangle= False;
    -
    -  if (qh SKIPconvex && !qh POSTmerging)
    -    return False;
    -  if ((!qh MERGEexact || qh POSTmerging) && qh cos_max < REALmax/2) {
    -    angle= qh_getangle(facet->normal, neighbor->normal);
    -    zinc_(Zangletests);
    -    if (angle > qh cos_max) {
    -      zinc_(Zcoplanarangle);
    -      qh_appendmergeset(facet, neighbor, MRGanglecoplanar, &angle);
    -      trace2((qh ferr, 2039, "qh_test_appendmerge: coplanar angle %4.4g between f%d and f%d\n",
    -         angle, facet->id, neighbor->id));
    -      return True;
    -    }else
    -      okangle= True;
    -  }
    -  if (!facet->center)
    -    facet->center= qh_getcentrum(facet);
    -  zzinc_(Zcentrumtests);
    -  qh_distplane(facet->center, neighbor, &dist);
    -  if (dist > qh centrum_radius)
    -    isconcave= True;
    -  else {
    -    if (dist > -qh centrum_radius)
    -      iscoplanar= True;
    -    if (!neighbor->center)
    -      neighbor->center= qh_getcentrum(neighbor);
    -    zzinc_(Zcentrumtests);
    -    qh_distplane(neighbor->center, facet, &dist2);
    -    if (dist2 > qh centrum_radius)
    -      isconcave= True;
    -    else if (!iscoplanar && dist2 > -qh centrum_radius)
    -      iscoplanar= True;
    -  }
    -  if (!isconcave && (!iscoplanar || (qh MERGEexact && !qh POSTmerging)))
    -    return False;
    -  if (!okangle && qh ANGLEmerge) {
    -    angle= qh_getangle(facet->normal, neighbor->normal);
    -    zinc_(Zangletests);
    -  }
    -  if (isconcave) {
    -    zinc_(Zconcaveridge);
    -    if (qh ANGLEmerge)
    -      angle += qh_ANGLEconcave + 0.5;
    -    qh_appendmergeset(facet, neighbor, MRGconcave, &angle);
    -    trace0((qh ferr, 18, "qh_test_appendmerge: concave f%d to f%d dist %4.4g and reverse dist %4.4g angle %4.4g during p%d\n",
    -           facet->id, neighbor->id, dist, dist2, angle, qh furthest_id));
    -  }else /* iscoplanar */ {
    -    zinc_(Zcoplanarcentrum);
    -    qh_appendmergeset(facet, neighbor, MRGcoplanar, &angle);
    -    trace2((qh ferr, 2040, "qh_test_appendmerge: coplanar f%d to f%d dist %4.4g, reverse dist %4.4g angle %4.4g\n",
    -              facet->id, neighbor->id, dist, dist2, angle));
    -  }
    -  return True;
    -} /* test_appendmerge */
    -
    -/*---------------------------------
    -
    -  qh_test_vneighbors()
    -    test vertex neighbors for convexity
    -    tests all facets on qh.newfacet_list
    -
    -  returns:
    -    true if non-convex vneighbors appended to qh.facet_mergeset
    -    initializes vertex neighbors if needed
    -
    -  notes:
    -    assumes all facet neighbors have been tested
    -    this can be expensive
    -    this does not guarantee that a centrum is below all facets
    -      but it is unlikely
    -    uses qh.visit_id
    -
    -  design:
    -    build vertex neighbors if necessary
    -    for all new facets
    -      for all vertices
    -        for each unvisited facet neighbor of the vertex
    -          test new facet and neighbor for convexity
    -*/
    -boolT qh_test_vneighbors(void /* qh.newfacet_list */) {
    -  facetT *newfacet, *neighbor, **neighborp;
    -  vertexT *vertex, **vertexp;
    -  int nummerges= 0;
    -
    -  trace1((qh ferr, 1015, "qh_test_vneighbors: testing vertex neighbors for convexity\n"));
    -  if (!qh VERTEXneighbors)
    -    qh_vertexneighbors();
    -  FORALLnew_facets
    -    newfacet->seen= False;
    -  FORALLnew_facets {
    -    newfacet->seen= True;
    -    newfacet->visitid= qh visit_id++;
    -    FOREACHneighbor_(newfacet)
    -      newfacet->visitid= qh visit_id;
    -    FOREACHvertex_(newfacet->vertices) {
    -      FOREACHneighbor_(vertex) {
    -        if (neighbor->seen || neighbor->visitid == qh visit_id)
    -          continue;
    -        if (qh_test_appendmerge(newfacet, neighbor))
    -          nummerges++;
    -      }
    -    }
    -  }
    -  zadd_(Ztestvneighbor, nummerges);
    -  trace1((qh ferr, 1016, "qh_test_vneighbors: found %d non-convex, vertex neighbors\n",
    -           nummerges));
    -  return (nummerges > 0);
    -} /* test_vneighbors */
    -
    -/*---------------------------------
    -
    -  qh_tracemerge( facet1, facet2 )
    -    print trace message after merge
    -*/
    -void qh_tracemerge(facetT *facet1, facetT *facet2) {
    -  boolT waserror= False;
    -
    -#ifndef qh_NOtrace
    -  if (qh IStracing >= 4)
    -    qh_errprint("MERGED", facet2, NULL, NULL, NULL);
    -  if (facet2 == qh tracefacet || (qh tracevertex && qh tracevertex->newlist)) {
    -    qh_fprintf(qh ferr, 8085, "qh_tracemerge: trace facet and vertex after merge of f%d and f%d, furthest p%d\n", facet1->id, facet2->id, qh furthest_id);
    -    if (facet2 != qh tracefacet)
    -      qh_errprint("TRACE", qh tracefacet,
    -        (qh tracevertex && qh tracevertex->neighbors) ?
    -           SETfirstt_(qh tracevertex->neighbors, facetT) : NULL,
    -        NULL, qh tracevertex);
    -  }
    -  if (qh tracevertex) {
    -    if (qh tracevertex->deleted)
    -      qh_fprintf(qh ferr, 8086, "qh_tracemerge: trace vertex deleted at furthest p%d\n",
    -            qh furthest_id);
    -    else
    -      qh_checkvertex(qh tracevertex);
    -  }
    -  if (qh tracefacet) {
    -    qh_checkfacet(qh tracefacet, True, &waserror);
    -    if (waserror)
    -      qh_errexit(qh_ERRqhull, qh tracefacet, NULL);
    -  }
    -#endif /* !qh_NOtrace */
    -  if (qh CHECKfrequently || qh IStracing >= 4) { /* can't check polygon here */
    -    qh_checkfacet(facet2, True, &waserror);
    -    if (waserror)
    -      qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -} /* tracemerge */
    -
    -/*---------------------------------
    -
    -  qh_tracemerging()
    -    print trace message during POSTmerging
    -
    -  returns:
    -    updates qh.mergereport
    -
    -  notes:
    -    called from qh_mergecycle() and qh_mergefacet()
    -
    -  see:
    -    qh_buildtracing()
    -*/
    -void qh_tracemerging(void) {
    -  realT cpu;
    -  int total;
    -  time_t timedata;
    -  struct tm *tp;
    -
    -  qh mergereport= zzval_(Ztotmerge);
    -  time(&timedata);
    -  tp= localtime(&timedata);
    -  cpu= qh_CPUclock;
    -  cpu /= qh_SECticks;
    -  total= zzval_(Ztotmerge) - zzval_(Zcyclehorizon) + zzval_(Zcyclefacettot);
    -  qh_fprintf(qh ferr, 8087, "\n\
    -At %d:%d:%d & %2.5g CPU secs, qhull has merged %d facets.  The hull\n\
    -  contains %d facets and %d vertices.\n",
    -      tp->tm_hour, tp->tm_min, tp->tm_sec, cpu,
    -      total, qh num_facets - qh num_visible,
    -      qh num_vertices-qh_setsize(qh del_vertices));
    -} /* tracemerging */
    -
    -/*---------------------------------
    -
    -  qh_updatetested( facet1, facet2 )
    -    clear facet2->tested and facet1->ridge->tested for merge
    -
    -  returns:
    -    deletes facet2->center unless it's already large
    -      if so, clears facet2->ridge->tested
    -
    -  design:
    -    clear facet2->tested
    -    clear ridge->tested for facet1's ridges
    -    if facet2 has a centrum
    -      if facet2 is large
    -        set facet2->keepcentrum
    -      else if facet2 has 3 vertices due to many merges, or not large and post merging
    -        clear facet2->keepcentrum
    -      unless facet2->keepcentrum
    -        clear facet2->center to recompute centrum later
    -        clear ridge->tested for facet2's ridges
    -*/
    -void qh_updatetested(facetT *facet1, facetT *facet2) {
    -  ridgeT *ridge, **ridgep;
    -  int size;
    -
    -  facet2->tested= False;
    -  FOREACHridge_(facet1->ridges)
    -    ridge->tested= False;
    -  if (!facet2->center)
    -    return;
    -  size= qh_setsize(facet2->vertices);
    -  if (!facet2->keepcentrum) {
    -    if (size > qh hull_dim + qh_MAXnewcentrum) {
    -      facet2->keepcentrum= True;
    -      zinc_(Zwidevertices);
    -    }
    -  }else if (size <= qh hull_dim + qh_MAXnewcentrum) {
    -    /* center and keepcentrum was set */
    -    if (size == qh hull_dim || qh POSTmerging)
    -      facet2->keepcentrum= False; /* if many merges need to recompute centrum */
    -  }
    -  if (!facet2->keepcentrum) {
    -    qh_memfree(facet2->center, qh normal_size);
    -    facet2->center= NULL;
    -    FOREACHridge_(facet2->ridges)
    -      ridge->tested= False;
    -  }
    -} /* updatetested */
    -
    -/*---------------------------------
    -
    -  qh_vertexridges( vertex )
    -    return temporary set of ridges adjacent to a vertex
    -    vertex->neighbors defined
    -
    -  ntoes:
    -    uses qh.visit_id
    -    does not include implicit ridges for simplicial facets
    -
    -  design:
    -    for each neighbor of vertex
    -      add ridges that include the vertex to ridges
    -*/
    -setT *qh_vertexridges(vertexT *vertex) {
    -  facetT *neighbor, **neighborp;
    -  setT *ridges= qh_settemp(qh TEMPsize);
    -  int size;
    -
    -  qh visit_id++;
    -  FOREACHneighbor_(vertex)
    -    neighbor->visitid= qh visit_id;
    -  FOREACHneighbor_(vertex) {
    -    if (*neighborp)   /* no new ridges in last neighbor */
    -      qh_vertexridges_facet(vertex, neighbor, &ridges);
    -  }
    -  if (qh PRINTstatistics || qh IStracing) {
    -    size= qh_setsize(ridges);
    -    zinc_(Zvertexridge);
    -    zadd_(Zvertexridgetot, size);
    -    zmax_(Zvertexridgemax, size);
    -    trace3((qh ferr, 3011, "qh_vertexridges: found %d ridges for v%d\n",
    -             size, vertex->id));
    -  }
    -  return ridges;
    -} /* vertexridges */
    -
    -/*---------------------------------
    -
    -  qh_vertexridges_facet( vertex, facet, ridges )
    -    add adjacent ridges for vertex in facet
    -    neighbor->visitid==qh.visit_id if it hasn't been visited
    -
    -  returns:
    -    ridges updated
    -    sets facet->visitid to qh.visit_id-1
    -
    -  design:
    -    for each ridge of facet
    -      if ridge of visited neighbor (i.e., unprocessed)
    -        if vertex in ridge
    -          append ridge to vertex
    -    mark facet processed
    -*/
    -void qh_vertexridges_facet(vertexT *vertex, facetT *facet, setT **ridges) {
    -  ridgeT *ridge, **ridgep;
    -  facetT *neighbor;
    -
    -  FOREACHridge_(facet->ridges) {
    -    neighbor= otherfacet_(ridge, facet);
    -    if (neighbor->visitid == qh visit_id
    -    && qh_setin(ridge->vertices, vertex))
    -      qh_setappend(ridges, ridge);
    -  }
    -  facet->visitid= qh visit_id-1;
    -} /* vertexridges_facet */
    -
    -/*---------------------------------
    -
    -  qh_willdelete( facet, replace )
    -    moves facet to visible list
    -    sets facet->f.replace to replace (may be NULL)
    -
    -  returns:
    -    bumps qh.num_visible
    -*/
    -void qh_willdelete(facetT *facet, facetT *replace) {
    -
    -  qh_removefacet(facet);
    -  qh_prependfacet(facet, &qh visible_list);
    -  qh num_visible++;
    -  facet->visible= True;
    -  facet->f.replace= replace;
    -} /* willdelete */
    -
    -#else /* qh_NOmerge */
    -void qh_premerge(vertexT *apex, realT maxcentrum, realT maxangle) {
    -}
    -void qh_postmerge(const char *reason, realT maxcentrum, realT maxangle,
    -                      boolT vneighbors) {
    -}
    -boolT qh_checkzero(boolT testall) {
    -   }
    -#endif /* qh_NOmerge */
    -
    diff --git a/src/qhull/src/libqhull/merge.h b/src/qhull/src/libqhull/merge.h
    deleted file mode 100644
    index 7f5ec3fb617..00000000000
    --- a/src/qhull/src/libqhull/merge.h
    +++ /dev/null
    @@ -1,178 +0,0 @@
    -/*
      ---------------------------------
    -
    -   merge.h
    -   header file for merge.c
    -
    -   see qh-merge.htm and merge.c
    -
    -   Copyright (c) 1993-2015 C.B. Barber.
    -   $Id: //main/2015/qhull/src/libqhull/merge.h#1 $$Change: 1981 $
    -   $DateTime: 2015/09/28 20:26:32 $$Author: bbarber $
    -*/
    -
    -#ifndef qhDEFmerge
    -#define qhDEFmerge 1
    -
    -#include "libqhull.h"
    -
    -
    -/*============ -constants- ==============*/
    -
    -/*----------------------------------
    -
    -  qh_ANGLEredundant
    -    indicates redundant merge in mergeT->angle
    -*/
    -#define qh_ANGLEredundant 6.0
    -
    -/*----------------------------------
    -
    -  qh_ANGLEdegen
    -    indicates degenerate facet in mergeT->angle
    -*/
    -#define qh_ANGLEdegen     5.0
    -
    -/*----------------------------------
    -
    -  qh_ANGLEconcave
    -    offset to indicate concave facets in mergeT->angle
    -
    -  notes:
    -    concave facets are assigned the range of [2,4] in mergeT->angle
    -    roundoff error may make the angle less than 2
    -*/
    -#define qh_ANGLEconcave  1.5
    -
    -/*----------------------------------
    -
    -  MRG... (mergeType)
    -    indicates the type of a merge (mergeT->type)
    -*/
    -typedef enum {  /* in sort order for facet_mergeset */
    -  MRGnone= 0,
    -  MRGcoplanar,          /* centrum coplanar */
    -  MRGanglecoplanar,     /* angle coplanar */
    -                        /* could detect half concave ridges */
    -  MRGconcave,           /* concave ridge */
    -  MRGflip,              /* flipped facet. facet1 == facet2 */
    -  MRGridge,             /* duplicate ridge (qh_MERGEridge) */
    -                        /* degen and redundant go onto degen_mergeset */
    -  MRGdegen,             /* degenerate facet (!enough neighbors) facet1 == facet2 */
    -  MRGredundant,         /* redundant facet (vertex subset) */
    -                        /* merge_degenredundant assumes degen < redundant */
    -  MRGmirror,            /* mirror facet from qh_triangulate */
    -  ENDmrg
    -} mergeType;
    -
    -/*----------------------------------
    -
    -  qh_MERGEapex
    -    flag for qh_mergefacet() to indicate an apex merge
    -*/
    -#define qh_MERGEapex     True
    -
    -/*============ -structures- ====================*/
    -
    -/*----------------------------------
    -
    -  mergeT
    -    structure used to merge facets
    -*/
    -
    -typedef struct mergeT mergeT;
    -struct mergeT {         /* initialize in qh_appendmergeset */
    -  realT   angle;        /* angle between normals of facet1 and facet2 */
    -  facetT *facet1;       /* will merge facet1 into facet2 */
    -  facetT *facet2;
    -  mergeType type;
    -};
    -
    -
    -/*=========== -macros- =========================*/
    -
    -/*----------------------------------
    -
    -  FOREACHmerge_( merges ) {...}
    -    assign 'merge' to each merge in merges
    -
    -  notes:
    -    uses 'mergeT *merge, **mergep;'
    -    if qh_mergefacet(),
    -      restart since qh.facet_mergeset may change
    -    see FOREACHsetelement_
    -*/
    -#define FOREACHmerge_( merges ) FOREACHsetelement_(mergeT, merges, merge)
    -
    -/*============ prototypes in alphabetical order after pre/postmerge =======*/
    -
    -void    qh_premerge(vertexT *apex, realT maxcentrum, realT maxangle);
    -void    qh_postmerge(const char *reason, realT maxcentrum, realT maxangle,
    -             boolT vneighbors);
    -void    qh_all_merges(boolT othermerge, boolT vneighbors);
    -void    qh_appendmergeset(facetT *facet, facetT *neighbor, mergeType mergetype, realT *angle);
    -setT   *qh_basevertices( facetT *samecycle);
    -void    qh_checkconnect(void /* qh.new_facets */);
    -boolT   qh_checkzero(boolT testall);
    -int     qh_compareangle(const void *p1, const void *p2);
    -int     qh_comparemerge(const void *p1, const void *p2);
    -int     qh_comparevisit(const void *p1, const void *p2);
    -void    qh_copynonconvex(ridgeT *atridge);
    -void    qh_degen_redundant_facet(facetT *facet);
    -void    qh_degen_redundant_neighbors(facetT *facet, facetT *delfacet);
    -vertexT *qh_find_newvertex(vertexT *oldvertex, setT *vertices, setT *ridges);
    -void    qh_findbest_test(boolT testcentrum, facetT *facet, facetT *neighbor,
    -           facetT **bestfacet, realT *distp, realT *mindistp, realT *maxdistp);
    -facetT *qh_findbestneighbor(facetT *facet, realT *distp, realT *mindistp, realT *maxdistp);
    -void    qh_flippedmerges(facetT *facetlist, boolT *wasmerge);
    -void    qh_forcedmerges( boolT *wasmerge);
    -void    qh_getmergeset(facetT *facetlist);
    -void    qh_getmergeset_initial(facetT *facetlist);
    -void    qh_hashridge(setT *hashtable, int hashsize, ridgeT *ridge, vertexT *oldvertex);
    -ridgeT *qh_hashridge_find(setT *hashtable, int hashsize, ridgeT *ridge,
    -              vertexT *vertex, vertexT *oldvertex, int *hashslot);
    -void    qh_makeridges(facetT *facet);
    -void    qh_mark_dupridges(facetT *facetlist);
    -void    qh_maydropneighbor(facetT *facet);
    -int     qh_merge_degenredundant(void);
    -void    qh_merge_nonconvex( facetT *facet1, facetT *facet2, mergeType mergetype);
    -void    qh_mergecycle(facetT *samecycle, facetT *newfacet);
    -void    qh_mergecycle_all(facetT *facetlist, boolT *wasmerge);
    -void    qh_mergecycle_facets( facetT *samecycle, facetT *newfacet);
    -void    qh_mergecycle_neighbors(facetT *samecycle, facetT *newfacet);
    -void    qh_mergecycle_ridges(facetT *samecycle, facetT *newfacet);
    -void    qh_mergecycle_vneighbors( facetT *samecycle, facetT *newfacet);
    -void    qh_mergefacet(facetT *facet1, facetT *facet2, realT *mindist, realT *maxdist, boolT mergeapex);
    -void    qh_mergefacet2d(facetT *facet1, facetT *facet2);
    -void    qh_mergeneighbors(facetT *facet1, facetT *facet2);
    -void    qh_mergeridges(facetT *facet1, facetT *facet2);
    -void    qh_mergesimplex(facetT *facet1, facetT *facet2, boolT mergeapex);
    -void    qh_mergevertex_del(vertexT *vertex, facetT *facet1, facetT *facet2);
    -void    qh_mergevertex_neighbors(facetT *facet1, facetT *facet2);
    -void    qh_mergevertices(setT *vertices1, setT **vertices);
    -setT   *qh_neighbor_intersections(vertexT *vertex);
    -void    qh_newvertices(setT *vertices);
    -boolT   qh_reducevertices(void);
    -vertexT *qh_redundant_vertex(vertexT *vertex);
    -boolT   qh_remove_extravertices(facetT *facet);
    -vertexT *qh_rename_sharedvertex(vertexT *vertex, facetT *facet);
    -void    qh_renameridgevertex(ridgeT *ridge, vertexT *oldvertex, vertexT *newvertex);
    -void    qh_renamevertex(vertexT *oldvertex, vertexT *newvertex, setT *ridges,
    -                        facetT *oldfacet, facetT *neighborA);
    -boolT   qh_test_appendmerge(facetT *facet, facetT *neighbor);
    -boolT   qh_test_vneighbors(void /* qh.newfacet_list */);
    -void    qh_tracemerge(facetT *facet1, facetT *facet2);
    -void    qh_tracemerging(void);
    -void    qh_updatetested( facetT *facet1, facetT *facet2);
    -setT   *qh_vertexridges(vertexT *vertex);
    -void    qh_vertexridges_facet(vertexT *vertex, facetT *facet, setT **ridges);
    -void    qh_willdelete(facetT *facet, facetT *replace);
    -
    -#endif /* qhDEFmerge */
    diff --git a/src/qhull/src/libqhull/poly.c b/src/qhull/src/libqhull/poly.c
    deleted file mode 100644
    index b8db6a9ef79..00000000000
    --- a/src/qhull/src/libqhull/poly.c
    +++ /dev/null
    @@ -1,1205 +0,0 @@
    -/*
      ---------------------------------
    -
    -   poly.c
    -   implements polygons and simplices
    -
    -   see qh-poly.htm, poly.h and libqhull.h
    -
    -   infrequent code is in poly2.c
    -   (all but top 50 and their callers 12/3/95)
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull/poly.c#3 $$Change: 2064 $
    -   $DateTime: 2016/01/18 12:36:08 $$Author: bbarber $
    -*/
    -
    -#include "qhull_a.h"
    -
    -/*======== functions in alphabetical order ==========*/
    -
    -/*---------------------------------
    -
    -  qh_appendfacet( facet )
    -    appends facet to end of qh.facet_list,
    -
    -  returns:
    -    updates qh.newfacet_list, facet_next, facet_list
    -    increments qh.numfacets
    -
    -  notes:
    -    assumes qh.facet_list/facet_tail is defined (createsimplex)
    -
    -  see:
    -    qh_removefacet()
    -
    -*/
    -void qh_appendfacet(facetT *facet) {
    -  facetT *tail= qh facet_tail;
    -
    -  if (tail == qh newfacet_list)
    -    qh newfacet_list= facet;
    -  if (tail == qh facet_next)
    -    qh facet_next= facet;
    -  facet->previous= tail->previous;
    -  facet->next= tail;
    -  if (tail->previous)
    -    tail->previous->next= facet;
    -  else
    -    qh facet_list= facet;
    -  tail->previous= facet;
    -  qh num_facets++;
    -  trace4((qh ferr, 4044, "qh_appendfacet: append f%d to facet_list\n", facet->id));
    -} /* appendfacet */
    -
    -
    -/*---------------------------------
    -
    -  qh_appendvertex( vertex )
    -    appends vertex to end of qh.vertex_list,
    -
    -  returns:
    -    sets vertex->newlist
    -    updates qh.vertex_list, newvertex_list
    -    increments qh.num_vertices
    -
    -  notes:
    -    assumes qh.vertex_list/vertex_tail is defined (createsimplex)
    -
    -*/
    -void qh_appendvertex(vertexT *vertex) {
    -  vertexT *tail= qh vertex_tail;
    -
    -  if (tail == qh newvertex_list)
    -    qh newvertex_list= vertex;
    -  vertex->newlist= True;
    -  vertex->previous= tail->previous;
    -  vertex->next= tail;
    -  if (tail->previous)
    -    tail->previous->next= vertex;
    -  else
    -    qh vertex_list= vertex;
    -  tail->previous= vertex;
    -  qh num_vertices++;
    -  trace4((qh ferr, 4045, "qh_appendvertex: append v%d to vertex_list\n", vertex->id));
    -} /* appendvertex */
    -
    -
    -/*---------------------------------
    -
    -  qh_attachnewfacets( )
    -    attach horizon facets to new facets in qh.newfacet_list
    -    newfacets have neighbor and ridge links to horizon but not vice versa
    -    only needed for qh.ONLYgood
    -
    -  returns:
    -    set qh.NEWfacets
    -    horizon facets linked to new facets
    -      ridges changed from visible facets to new facets
    -      simplicial ridges deleted
    -    qh.visible_list, no ridges valid
    -    facet->f.replace is a newfacet (if any)
    -
    -  design:
    -    delete interior ridges and neighbor sets by
    -      for each visible, non-simplicial facet
    -        for each ridge
    -          if last visit or if neighbor is simplicial
    -            if horizon neighbor
    -              delete ridge for horizon's ridge set
    -            delete ridge
    -        erase neighbor set
    -    attach horizon facets and new facets by
    -      for all new facets
    -        if corresponding horizon facet is simplicial
    -          locate corresponding visible facet {may be more than one}
    -          link visible facet to new facet
    -          replace visible facet with new facet in horizon
    -        else it's non-simplicial
    -          for all visible neighbors of the horizon facet
    -            link visible neighbor to new facet
    -            delete visible neighbor from horizon facet
    -          append new facet to horizon's neighbors
    -          the first ridge of the new facet is the horizon ridge
    -          link the new facet into the horizon ridge
    -*/
    -void qh_attachnewfacets(void /* qh.visible_list, newfacet_list */) {
    -  facetT *newfacet= NULL, *neighbor, **neighborp, *horizon, *visible;
    -  ridgeT *ridge, **ridgep;
    -
    -  qh NEWfacets= True;
    -  trace3((qh ferr, 3012, "qh_attachnewfacets: delete interior ridges\n"));
    -  qh visit_id++;
    -  FORALLvisible_facets {
    -    visible->visitid= qh visit_id;
    -    if (visible->ridges) {
    -      FOREACHridge_(visible->ridges) {
    -        neighbor= otherfacet_(ridge, visible);
    -        if (neighbor->visitid == qh visit_id
    -            || (!neighbor->visible && neighbor->simplicial)) {
    -          if (!neighbor->visible)  /* delete ridge for simplicial horizon */
    -            qh_setdel(neighbor->ridges, ridge);
    -          qh_setfree(&(ridge->vertices)); /* delete on 2nd visit */
    -          qh_memfree(ridge, (int)sizeof(ridgeT));
    -        }
    -      }
    -      SETfirst_(visible->ridges)= NULL;
    -    }
    -    SETfirst_(visible->neighbors)= NULL;
    -  }
    -  trace1((qh ferr, 1017, "qh_attachnewfacets: attach horizon facets to new facets\n"));
    -  FORALLnew_facets {
    -    horizon= SETfirstt_(newfacet->neighbors, facetT);
    -    if (horizon->simplicial) {
    -      visible= NULL;
    -      FOREACHneighbor_(horizon) {   /* may have more than one horizon ridge */
    -        if (neighbor->visible) {
    -          if (visible) {
    -            if (qh_setequal_skip(newfacet->vertices, 0, horizon->vertices,
    -                                  SETindex_(horizon->neighbors, neighbor))) {
    -              visible= neighbor;
    -              break;
    -            }
    -          }else
    -            visible= neighbor;
    -        }
    -      }
    -      if (visible) {
    -        visible->f.replace= newfacet;
    -        qh_setreplace(horizon->neighbors, visible, newfacet);
    -      }else {
    -        qh_fprintf(qh ferr, 6102, "qhull internal error (qh_attachnewfacets): couldn't find visible facet for horizon f%d of newfacet f%d\n",
    -                 horizon->id, newfacet->id);
    -        qh_errexit2(qh_ERRqhull, horizon, newfacet);
    -      }
    -    }else { /* non-simplicial, with a ridge for newfacet */
    -      FOREACHneighbor_(horizon) {    /* may hold for many new facets */
    -        if (neighbor->visible) {
    -          neighbor->f.replace= newfacet;
    -          qh_setdelnth(horizon->neighbors,
    -                        SETindex_(horizon->neighbors, neighbor));
    -          neighborp--; /* repeat */
    -        }
    -      }
    -      qh_setappend(&horizon->neighbors, newfacet);
    -      ridge= SETfirstt_(newfacet->ridges, ridgeT);
    -      if (ridge->top == horizon)
    -        ridge->bottom= newfacet;
    -      else
    -        ridge->top= newfacet;
    -      }
    -  } /* newfacets */
    -  if (qh PRINTstatistics) {
    -    FORALLvisible_facets {
    -      if (!visible->f.replace)
    -        zinc_(Zinsidevisible);
    -    }
    -  }
    -} /* attachnewfacets */
    -
    -/*---------------------------------
    -
    -  qh_checkflipped( facet, dist, allerror )
    -    checks facet orientation to interior point
    -
    -    if allerror set,
    -      tests against qh.DISTround
    -    else
    -      tests against 0 since tested against DISTround before
    -
    -  returns:
    -    False if it flipped orientation (sets facet->flipped)
    -    distance if non-NULL
    -*/
    -boolT qh_checkflipped(facetT *facet, realT *distp, boolT allerror) {
    -  realT dist;
    -
    -  if (facet->flipped && !distp)
    -    return False;
    -  zzinc_(Zdistcheck);
    -  qh_distplane(qh interior_point, facet, &dist);
    -  if (distp)
    -    *distp= dist;
    -  if ((allerror && dist > -qh DISTround)|| (!allerror && dist >= 0.0)) {
    -    facet->flipped= True;
    -    zzinc_(Zflippedfacets);
    -    trace0((qh ferr, 19, "qh_checkflipped: facet f%d is flipped, distance= %6.12g during p%d\n",
    -              facet->id, dist, qh furthest_id));
    -    qh_precision("flipped facet");
    -    return False;
    -  }
    -  return True;
    -} /* checkflipped */
    -
    -/*---------------------------------
    -
    -  qh_delfacet( facet )
    -    removes facet from facet_list and frees up its memory
    -
    -  notes:
    -    assumes vertices and ridges already freed
    -*/
    -void qh_delfacet(facetT *facet) {
    -  void **freelistp; /* used if !qh_NOmem by qh_memfree_() */
    -
    -  trace4((qh ferr, 4046, "qh_delfacet: delete f%d\n", facet->id));
    -  if (facet == qh tracefacet)
    -    qh tracefacet= NULL;
    -  if (facet == qh GOODclosest)
    -    qh GOODclosest= NULL;
    -  qh_removefacet(facet);
    -  if (!facet->tricoplanar || facet->keepcentrum) {
    -    qh_memfree_(facet->normal, qh normal_size, freelistp);
    -    if (qh CENTERtype == qh_ASvoronoi) {   /* braces for macro calls */
    -      qh_memfree_(facet->center, qh center_size, freelistp);
    -    }else /* AScentrum */ {
    -      qh_memfree_(facet->center, qh normal_size, freelistp);
    -    }
    -  }
    -  qh_setfree(&(facet->neighbors));
    -  if (facet->ridges)
    -    qh_setfree(&(facet->ridges));
    -  qh_setfree(&(facet->vertices));
    -  if (facet->outsideset)
    -    qh_setfree(&(facet->outsideset));
    -  if (facet->coplanarset)
    -    qh_setfree(&(facet->coplanarset));
    -  qh_memfree_(facet, (int)sizeof(facetT), freelistp);
    -} /* delfacet */
    -
    -
    -/*---------------------------------
    -
    -  qh_deletevisible()
    -    delete visible facets and vertices
    -
    -  returns:
    -    deletes each facet and removes from facetlist
    -    at exit, qh.visible_list empty (== qh.newfacet_list)
    -
    -  notes:
    -    ridges already deleted
    -    horizon facets do not reference facets on qh.visible_list
    -    new facets in qh.newfacet_list
    -    uses   qh.visit_id;
    -*/
    -void qh_deletevisible(void /*qh.visible_list*/) {
    -  facetT *visible, *nextfacet;
    -  vertexT *vertex, **vertexp;
    -  int numvisible= 0, numdel= qh_setsize(qh del_vertices);
    -
    -  trace1((qh ferr, 1018, "qh_deletevisible: delete %d visible facets and %d vertices\n",
    -         qh num_visible, numdel));
    -  for (visible= qh visible_list; visible && visible->visible;
    -                visible= nextfacet) { /* deleting current */
    -    nextfacet= visible->next;
    -    numvisible++;
    -    qh_delfacet(visible);
    -  }
    -  if (numvisible != qh num_visible) {
    -    qh_fprintf(qh ferr, 6103, "qhull internal error (qh_deletevisible): qh num_visible %d is not number of visible facets %d\n",
    -             qh num_visible, numvisible);
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -  qh num_visible= 0;
    -  zadd_(Zvisfacettot, numvisible);
    -  zmax_(Zvisfacetmax, numvisible);
    -  zzadd_(Zdelvertextot, numdel);
    -  zmax_(Zdelvertexmax, numdel);
    -  FOREACHvertex_(qh del_vertices)
    -    qh_delvertex(vertex);
    -  qh_settruncate(qh del_vertices, 0);
    -} /* deletevisible */
    -
    -/*---------------------------------
    -
    -  qh_facetintersect( facetA, facetB, skipa, skipB, prepend )
    -    return vertices for intersection of two simplicial facets
    -    may include 1 prepended entry (if more, need to settemppush)
    -
    -  returns:
    -    returns set of qh.hull_dim-1 + prepend vertices
    -    returns skipped index for each test and checks for exactly one
    -
    -  notes:
    -    does not need settemp since set in quick memory
    -
    -  see also:
    -    qh_vertexintersect and qh_vertexintersect_new
    -    use qh_setnew_delnthsorted to get nth ridge (no skip information)
    -
    -  design:
    -    locate skipped vertex by scanning facet A's neighbors
    -    locate skipped vertex by scanning facet B's neighbors
    -    intersect the vertex sets
    -*/
    -setT *qh_facetintersect(facetT *facetA, facetT *facetB,
    -                         int *skipA,int *skipB, int prepend) {
    -  setT *intersect;
    -  int dim= qh hull_dim, i, j;
    -  facetT **neighborsA, **neighborsB;
    -
    -  neighborsA= SETaddr_(facetA->neighbors, facetT);
    -  neighborsB= SETaddr_(facetB->neighbors, facetT);
    -  i= j= 0;
    -  if (facetB == *neighborsA++)
    -    *skipA= 0;
    -  else if (facetB == *neighborsA++)
    -    *skipA= 1;
    -  else if (facetB == *neighborsA++)
    -    *skipA= 2;
    -  else {
    -    for (i=3; i < dim; i++) {
    -      if (facetB == *neighborsA++) {
    -        *skipA= i;
    -        break;
    -      }
    -    }
    -  }
    -  if (facetA == *neighborsB++)
    -    *skipB= 0;
    -  else if (facetA == *neighborsB++)
    -    *skipB= 1;
    -  else if (facetA == *neighborsB++)
    -    *skipB= 2;
    -  else {
    -    for (j=3; j < dim; j++) {
    -      if (facetA == *neighborsB++) {
    -        *skipB= j;
    -        break;
    -      }
    -    }
    -  }
    -  if (i >= dim || j >= dim) {
    -    qh_fprintf(qh ferr, 6104, "qhull internal error (qh_facetintersect): f%d or f%d not in others neighbors\n",
    -            facetA->id, facetB->id);
    -    qh_errexit2(qh_ERRqhull, facetA, facetB);
    -  }
    -  intersect= qh_setnew_delnthsorted(facetA->vertices, qh hull_dim, *skipA, prepend);
    -  trace4((qh ferr, 4047, "qh_facetintersect: f%d skip %d matches f%d skip %d\n",
    -          facetA->id, *skipA, facetB->id, *skipB));
    -  return(intersect);
    -} /* facetintersect */
    -
    -/*---------------------------------
    -
    -  qh_gethash( hashsize, set, size, firstindex, skipelem )
    -    return hashvalue for a set with firstindex and skipelem
    -
    -  notes:
    -    returned hash is in [0,hashsize)
    -    assumes at least firstindex+1 elements
    -    assumes skipelem is NULL, in set, or part of hash
    -
    -    hashes memory addresses which may change over different runs of the same data
    -    using sum for hash does badly in high d
    -*/
    -int qh_gethash(int hashsize, setT *set, int size, int firstindex, void *skipelem) {
    -  void **elemp= SETelemaddr_(set, firstindex, void);
    -  ptr_intT hash = 0, elem;
    -  unsigned result;
    -  int i;
    -#ifdef _MSC_VER                   /* Microsoft Visual C++ -- warn about 64-bit issues */
    -#pragma warning( push)            /* WARN64 -- ptr_intT holds a 64-bit pointer */
    -#pragma warning( disable : 4311)  /* 'type cast': pointer truncation from 'void*' to 'ptr_intT' */
    -#endif
    -
    -  switch (size-firstindex) {
    -  case 1:
    -    hash= (ptr_intT)(*elemp) - (ptr_intT) skipelem;
    -    break;
    -  case 2:
    -    hash= (ptr_intT)(*elemp) + (ptr_intT)elemp[1] - (ptr_intT) skipelem;
    -    break;
    -  case 3:
    -    hash= (ptr_intT)(*elemp) + (ptr_intT)elemp[1] + (ptr_intT)elemp[2]
    -      - (ptr_intT) skipelem;
    -    break;
    -  case 4:
    -    hash= (ptr_intT)(*elemp) + (ptr_intT)elemp[1] + (ptr_intT)elemp[2]
    -      + (ptr_intT)elemp[3] - (ptr_intT) skipelem;
    -    break;
    -  case 5:
    -    hash= (ptr_intT)(*elemp) + (ptr_intT)elemp[1] + (ptr_intT)elemp[2]
    -      + (ptr_intT)elemp[3] + (ptr_intT)elemp[4] - (ptr_intT) skipelem;
    -    break;
    -  case 6:
    -    hash= (ptr_intT)(*elemp) + (ptr_intT)elemp[1] + (ptr_intT)elemp[2]
    -      + (ptr_intT)elemp[3] + (ptr_intT)elemp[4]+ (ptr_intT)elemp[5]
    -      - (ptr_intT) skipelem;
    -    break;
    -  default:
    -    hash= 0;
    -    i= 3;
    -    do {     /* this is about 10% in 10-d */
    -      if ((elem= (ptr_intT)*elemp++) != (ptr_intT)skipelem) {
    -        hash ^= (elem << i) + (elem >> (32-i));
    -        i += 3;
    -        if (i >= 32)
    -          i -= 32;
    -      }
    -    }while (*elemp);
    -    break;
    -  }
    -  if (hashsize<0) {
    -    qh_fprintf(qh ferr, 6202, "qhull internal error: negative hashsize %d passed to qh_gethash [poly.c]\n", hashsize);
    -    qh_errexit2(qh_ERRqhull, NULL, NULL);
    -  }
    -  result= (unsigned)hash;
    -  result %= (unsigned)hashsize;
    -  /* result= 0; for debugging */
    -  return result;
    -#ifdef _MSC_VER
    -#pragma warning( pop)
    -#endif
    -} /* gethash */
    -
    -/*---------------------------------
    -
    -  qh_makenewfacet( vertices, toporient, horizon )
    -    creates a toporient? facet from vertices
    -
    -  returns:
    -    returns newfacet
    -      adds newfacet to qh.facet_list
    -      newfacet->vertices= vertices
    -      if horizon
    -        newfacet->neighbor= horizon, but not vice versa
    -    newvertex_list updated with vertices
    -*/
    -facetT *qh_makenewfacet(setT *vertices, boolT toporient,facetT *horizon) {
    -  facetT *newfacet;
    -  vertexT *vertex, **vertexp;
    -
    -  FOREACHvertex_(vertices) {
    -    if (!vertex->newlist) {
    -      qh_removevertex(vertex);
    -      qh_appendvertex(vertex);
    -    }
    -  }
    -  newfacet= qh_newfacet();
    -  newfacet->vertices= vertices;
    -  newfacet->toporient= (unsigned char)toporient;
    -  if (horizon)
    -    qh_setappend(&(newfacet->neighbors), horizon);
    -  qh_appendfacet(newfacet);
    -  return(newfacet);
    -} /* makenewfacet */
    -
    -
    -/*---------------------------------
    -
    -  qh_makenewplanes()
    -    make new hyperplanes for facets on qh.newfacet_list
    -
    -  returns:
    -    all facets have hyperplanes or are marked for   merging
    -    doesn't create hyperplane if horizon is coplanar (will merge)
    -    updates qh.min_vertex if qh.JOGGLEmax
    -
    -  notes:
    -    facet->f.samecycle is defined for facet->mergehorizon facets
    -*/
    -void qh_makenewplanes(void /* newfacet_list */) {
    -  facetT *newfacet;
    -
    -  FORALLnew_facets {
    -    if (!newfacet->mergehorizon)
    -      qh_setfacetplane(newfacet);
    -  }
    -  if (qh JOGGLEmax < REALmax/2)
    -    minimize_(qh min_vertex, -wwval_(Wnewvertexmax));
    -} /* makenewplanes */
    -
    -/*---------------------------------
    -
    -  qh_makenew_nonsimplicial( visible, apex, numnew )
    -    make new facets for ridges of a visible facet
    -
    -  returns:
    -    first newfacet, bumps numnew as needed
    -    attaches new facets if !qh.ONLYgood
    -    marks ridge neighbors for simplicial visible
    -    if (qh.ONLYgood)
    -      ridges on newfacet, horizon, and visible
    -    else
    -      ridge and neighbors between newfacet and   horizon
    -      visible facet's ridges are deleted
    -
    -  notes:
    -    qh.visit_id if visible has already been processed
    -    sets neighbor->seen for building f.samecycle
    -      assumes all 'seen' flags initially false
    -
    -  design:
    -    for each ridge of visible facet
    -      get neighbor of visible facet
    -      if neighbor was already processed
    -        delete the ridge (will delete all visible facets later)
    -      if neighbor is a horizon facet
    -        create a new facet
    -        if neighbor coplanar
    -          adds newfacet to f.samecycle for later merging
    -        else
    -          updates neighbor's neighbor set
    -          (checks for non-simplicial facet with multiple ridges to visible facet)
    -        updates neighbor's ridge set
    -        (checks for simplicial neighbor to non-simplicial visible facet)
    -        (deletes ridge if neighbor is simplicial)
    -
    -*/
    -#ifndef qh_NOmerge
    -facetT *qh_makenew_nonsimplicial(facetT *visible, vertexT *apex, int *numnew) {
    -  void **freelistp; /* used if !qh_NOmem by qh_memfree_() */
    -  ridgeT *ridge, **ridgep;
    -  facetT *neighbor, *newfacet= NULL, *samecycle;
    -  setT *vertices;
    -  boolT toporient;
    -  int ridgeid;
    -
    -  FOREACHridge_(visible->ridges) {
    -    ridgeid= ridge->id;
    -    neighbor= otherfacet_(ridge, visible);
    -    if (neighbor->visible) {
    -      if (!qh ONLYgood) {
    -        if (neighbor->visitid == qh visit_id) {
    -          qh_setfree(&(ridge->vertices));  /* delete on 2nd visit */
    -          qh_memfree_(ridge, (int)sizeof(ridgeT), freelistp);
    -        }
    -      }
    -    }else {  /* neighbor is an horizon facet */
    -      toporient= (ridge->top == visible);
    -      vertices= qh_setnew(qh hull_dim); /* makes sure this is quick */
    -      qh_setappend(&vertices, apex);
    -      qh_setappend_set(&vertices, ridge->vertices);
    -      newfacet= qh_makenewfacet(vertices, toporient, neighbor);
    -      (*numnew)++;
    -      if (neighbor->coplanar) {
    -        newfacet->mergehorizon= True;
    -        if (!neighbor->seen) {
    -          newfacet->f.samecycle= newfacet;
    -          neighbor->f.newcycle= newfacet;
    -        }else {
    -          samecycle= neighbor->f.newcycle;
    -          newfacet->f.samecycle= samecycle->f.samecycle;
    -          samecycle->f.samecycle= newfacet;
    -        }
    -      }
    -      if (qh ONLYgood) {
    -        if (!neighbor->simplicial)
    -          qh_setappend(&(newfacet->ridges), ridge);
    -      }else {  /* qh_attachnewfacets */
    -        if (neighbor->seen) {
    -          if (neighbor->simplicial) {
    -            qh_fprintf(qh ferr, 6105, "qhull internal error (qh_makenew_nonsimplicial): simplicial f%d sharing two ridges with f%d\n",
    -                   neighbor->id, visible->id);
    -            qh_errexit2(qh_ERRqhull, neighbor, visible);
    -          }
    -          qh_setappend(&(neighbor->neighbors), newfacet);
    -        }else
    -          qh_setreplace(neighbor->neighbors, visible, newfacet);
    -        if (neighbor->simplicial) {
    -          qh_setdel(neighbor->ridges, ridge);
    -          qh_setfree(&(ridge->vertices));
    -          qh_memfree(ridge, (int)sizeof(ridgeT));
    -        }else {
    -          qh_setappend(&(newfacet->ridges), ridge);
    -          if (toporient)
    -            ridge->top= newfacet;
    -          else
    -            ridge->bottom= newfacet;
    -        }
    -      trace4((qh ferr, 4048, "qh_makenew_nonsimplicial: created facet f%d from v%d and r%d of horizon f%d\n",
    -            newfacet->id, apex->id, ridgeid, neighbor->id));
    -      }
    -    }
    -    neighbor->seen= True;
    -  } /* for each ridge */
    -  if (!qh ONLYgood)
    -    SETfirst_(visible->ridges)= NULL;
    -  return newfacet;
    -} /* makenew_nonsimplicial */
    -#else /* qh_NOmerge */
    -facetT *qh_makenew_nonsimplicial(facetT *visible, vertexT *apex, int *numnew) {
    -  return NULL;
    -}
    -#endif /* qh_NOmerge */
    -
    -/*---------------------------------
    -
    -  qh_makenew_simplicial( visible, apex, numnew )
    -    make new facets for simplicial visible facet and apex
    -
    -  returns:
    -    attaches new facets if (!qh.ONLYgood)
    -      neighbors between newfacet and horizon
    -
    -  notes:
    -    nop if neighbor->seen or neighbor->visible(see qh_makenew_nonsimplicial)
    -
    -  design:
    -    locate neighboring horizon facet for visible facet
    -    determine vertices and orientation
    -    create new facet
    -    if coplanar,
    -      add new facet to f.samecycle
    -    update horizon facet's neighbor list
    -*/
    -facetT *qh_makenew_simplicial(facetT *visible, vertexT *apex, int *numnew) {
    -  facetT *neighbor, **neighborp, *newfacet= NULL;
    -  setT *vertices;
    -  boolT flip, toporient;
    -  int horizonskip= 0, visibleskip= 0;
    -
    -  FOREACHneighbor_(visible) {
    -    if (!neighbor->seen && !neighbor->visible) {
    -      vertices= qh_facetintersect(neighbor,visible, &horizonskip, &visibleskip, 1);
    -      SETfirst_(vertices)= apex;
    -      flip= ((horizonskip & 0x1) ^ (visibleskip & 0x1));
    -      if (neighbor->toporient)
    -        toporient= horizonskip & 0x1;
    -      else
    -        toporient= (horizonskip & 0x1) ^ 0x1;
    -      newfacet= qh_makenewfacet(vertices, toporient, neighbor);
    -      (*numnew)++;
    -      if (neighbor->coplanar && (qh PREmerge || qh MERGEexact)) {
    -#ifndef qh_NOmerge
    -        newfacet->f.samecycle= newfacet;
    -        newfacet->mergehorizon= True;
    -#endif
    -      }
    -      if (!qh ONLYgood)
    -        SETelem_(neighbor->neighbors, horizonskip)= newfacet;
    -      trace4((qh ferr, 4049, "qh_makenew_simplicial: create facet f%d top %d from v%d and horizon f%d skip %d top %d and visible f%d skip %d, flip? %d\n",
    -            newfacet->id, toporient, apex->id, neighbor->id, horizonskip,
    -              neighbor->toporient, visible->id, visibleskip, flip));
    -    }
    -  }
    -  return newfacet;
    -} /* makenew_simplicial */
    -
    -/*---------------------------------
    -
    -  qh_matchneighbor( newfacet, newskip, hashsize, hashcount )
    -    either match subridge of newfacet with neighbor or add to hash_table
    -
    -  returns:
    -    duplicate ridges are unmatched and marked by qh_DUPLICATEridge
    -
    -  notes:
    -    ridge is newfacet->vertices w/o newskip vertex
    -    do not allocate memory (need to free hash_table cleanly)
    -    uses linear hash chains
    -
    -  see also:
    -    qh_matchduplicates
    -
    -  design:
    -    for each possible matching facet in qh.hash_table
    -      if vertices match
    -        set ismatch, if facets have opposite orientation
    -        if ismatch and matching facet doesn't have a match
    -          match the facets by updating their neighbor sets
    -        else
    -          indicate a duplicate ridge
    -          set facet hyperplane for later testing
    -          add facet to hashtable
    -          unless the other facet was already a duplicate ridge
    -            mark both facets with a duplicate ridge
    -            add other facet (if defined) to hash table
    -*/
    -void qh_matchneighbor(facetT *newfacet, int newskip, int hashsize, int *hashcount) {
    -  boolT newfound= False;   /* True, if new facet is already in hash chain */
    -  boolT same, ismatch;
    -  int hash, scan;
    -  facetT *facet, *matchfacet;
    -  int skip, matchskip;
    -
    -  hash= qh_gethash(hashsize, newfacet->vertices, qh hull_dim, 1,
    -                     SETelem_(newfacet->vertices, newskip));
    -  trace4((qh ferr, 4050, "qh_matchneighbor: newfacet f%d skip %d hash %d hashcount %d\n",
    -          newfacet->id, newskip, hash, *hashcount));
    -  zinc_(Zhashlookup);
    -  for (scan= hash; (facet= SETelemt_(qh hash_table, scan, facetT));
    -       scan= (++scan >= hashsize ? 0 : scan)) {
    -    if (facet == newfacet) {
    -      newfound= True;
    -      continue;
    -    }
    -    zinc_(Zhashtests);
    -    if (qh_matchvertices(1, newfacet->vertices, newskip, facet->vertices, &skip, &same)) {
    -      if (SETelem_(newfacet->vertices, newskip) ==
    -          SETelem_(facet->vertices, skip)) {
    -        qh_precision("two facets with the same vertices");
    -        qh_fprintf(qh ferr, 6106, "qhull precision error: Vertex sets are the same for f%d and f%d.  Can not force output.\n",
    -          facet->id, newfacet->id);
    -        qh_errexit2(qh_ERRprec, facet, newfacet);
    -      }
    -      ismatch= (same == (boolT)((newfacet->toporient ^ facet->toporient)));
    -      matchfacet= SETelemt_(facet->neighbors, skip, facetT);
    -      if (ismatch && !matchfacet) {
    -        SETelem_(facet->neighbors, skip)= newfacet;
    -        SETelem_(newfacet->neighbors, newskip)= facet;
    -        (*hashcount)--;
    -        trace4((qh ferr, 4051, "qh_matchneighbor: f%d skip %d matched with new f%d skip %d\n",
    -           facet->id, skip, newfacet->id, newskip));
    -        return;
    -      }
    -      if (!qh PREmerge && !qh MERGEexact) {
    -        qh_precision("a ridge with more than two neighbors");
    -        qh_fprintf(qh ferr, 6107, "qhull precision error: facets f%d, f%d and f%d meet at a ridge with more than 2 neighbors.  Can not continue.\n",
    -                 facet->id, newfacet->id, getid_(matchfacet));
    -        qh_errexit2(qh_ERRprec, facet, newfacet);
    -      }
    -      SETelem_(newfacet->neighbors, newskip)= qh_DUPLICATEridge;
    -      newfacet->dupridge= True;
    -      if (!newfacet->normal)
    -        qh_setfacetplane(newfacet);
    -      qh_addhash(newfacet, qh hash_table, hashsize, hash);
    -      (*hashcount)++;
    -      if (!facet->normal)
    -        qh_setfacetplane(facet);
    -      if (matchfacet != qh_DUPLICATEridge) {
    -        SETelem_(facet->neighbors, skip)= qh_DUPLICATEridge;
    -        facet->dupridge= True;
    -        if (!facet->normal)
    -          qh_setfacetplane(facet);
    -        if (matchfacet) {
    -          matchskip= qh_setindex(matchfacet->neighbors, facet);
    -          if (matchskip<0) {
    -              qh_fprintf(qh ferr, 6260, "qhull internal error (qh_matchneighbor): matchfacet f%d is in f%d neighbors but not vice versa.  Can not continue.\n",
    -                  matchfacet->id, facet->id);
    -              qh_errexit2(qh_ERRqhull, matchfacet, facet);
    -          }
    -          SETelem_(matchfacet->neighbors, matchskip)= qh_DUPLICATEridge; /* matchskip>=0 by QH6260 */
    -          matchfacet->dupridge= True;
    -          if (!matchfacet->normal)
    -            qh_setfacetplane(matchfacet);
    -          qh_addhash(matchfacet, qh hash_table, hashsize, hash);
    -          *hashcount += 2;
    -        }
    -      }
    -      trace4((qh ferr, 4052, "qh_matchneighbor: new f%d skip %d duplicates ridge for f%d skip %d matching f%d ismatch %d at hash %d\n",
    -           newfacet->id, newskip, facet->id, skip,
    -           (matchfacet == qh_DUPLICATEridge ? -2 : getid_(matchfacet)),
    -           ismatch, hash));
    -      return; /* end of duplicate ridge */
    -    }
    -  }
    -  if (!newfound)
    -    SETelem_(qh hash_table, scan)= newfacet;  /* same as qh_addhash */
    -  (*hashcount)++;
    -  trace4((qh ferr, 4053, "qh_matchneighbor: no match for f%d skip %d at hash %d\n",
    -           newfacet->id, newskip, hash));
    -} /* matchneighbor */
    -
    -
    -/*---------------------------------
    -
    -  qh_matchnewfacets()
    -    match newfacets in qh.newfacet_list to their newfacet neighbors
    -
    -  returns:
    -    qh.newfacet_list with full neighbor sets
    -      get vertices with nth neighbor by deleting nth vertex
    -    if qh.PREmerge/MERGEexact or qh.FORCEoutput
    -      sets facet->flippped if flipped normal (also prevents point partitioning)
    -    if duplicate ridges and qh.PREmerge/MERGEexact
    -      sets facet->dupridge
    -      missing neighbor links identifies extra ridges to be merging (qh_MERGEridge)
    -
    -  notes:
    -    newfacets already have neighbor[0] (horizon facet)
    -    assumes qh.hash_table is NULL
    -    vertex->neighbors has not been updated yet
    -    do not allocate memory after qh.hash_table (need to free it cleanly)
    -
    -  design:
    -    delete neighbor sets for all new facets
    -    initialize a hash table
    -    for all new facets
    -      match facet with neighbors
    -    if unmatched facets (due to duplicate ridges)
    -      for each new facet with a duplicate ridge
    -        match it with a facet
    -    check for flipped facets
    -*/
    -void qh_matchnewfacets(void /* qh.newfacet_list */) {
    -  int numnew=0, hashcount=0, newskip;
    -  facetT *newfacet, *neighbor;
    -  int dim= qh hull_dim, hashsize, neighbor_i, neighbor_n;
    -  setT *neighbors;
    -#ifndef qh_NOtrace
    -  int facet_i, facet_n, numfree= 0;
    -  facetT *facet;
    -#endif
    -
    -  trace1((qh ferr, 1019, "qh_matchnewfacets: match neighbors for new facets.\n"));
    -  FORALLnew_facets {
    -    numnew++;
    -    {  /* inline qh_setzero(newfacet->neighbors, 1, qh hull_dim); */
    -      neighbors= newfacet->neighbors;
    -      neighbors->e[neighbors->maxsize].i= dim+1; /*may be overwritten*/
    -      memset((char *)SETelemaddr_(neighbors, 1, void), 0, dim * SETelemsize);
    -    }
    -  }
    -
    -  qh_newhashtable(numnew*(qh hull_dim-1)); /* twice what is normally needed,
    -                                     but every ridge could be DUPLICATEridge */
    -  hashsize= qh_setsize(qh hash_table);
    -  FORALLnew_facets {
    -    for (newskip=1; newskip0 because hull_dim>1 and numnew>0 */
    -      qh_matchneighbor(newfacet, newskip, hashsize, &hashcount);
    -#if 0   /* use the following to trap hashcount errors */
    -    {
    -      int count= 0, k;
    -      facetT *facet, *neighbor;
    -
    -      count= 0;
    -      FORALLfacet_(qh newfacet_list) {  /* newfacet already in use */
    -        for (k=1; k < qh hull_dim; k++) {
    -          neighbor= SETelemt_(facet->neighbors, k, facetT);
    -          if (!neighbor || neighbor == qh_DUPLICATEridge)
    -            count++;
    -        }
    -        if (facet == newfacet)
    -          break;
    -      }
    -      if (count != hashcount) {
    -        qh_fprintf(qh ferr, 8088, "qh_matchnewfacets: after adding facet %d, hashcount %d != count %d\n",
    -                 newfacet->id, hashcount, count);
    -        qh_errexit(qh_ERRqhull, newfacet, NULL);
    -      }
    -    }
    -#endif  /* end of trap code */
    -  }
    -  if (hashcount) {
    -    FORALLnew_facets {
    -      if (newfacet->dupridge) {
    -        FOREACHneighbor_i_(newfacet) {
    -          if (neighbor == qh_DUPLICATEridge) {
    -            qh_matchduplicates(newfacet, neighbor_i, hashsize, &hashcount);
    -                    /* this may report MERGEfacet */
    -          }
    -        }
    -      }
    -    }
    -  }
    -  if (hashcount) {
    -    qh_fprintf(qh ferr, 6108, "qhull internal error (qh_matchnewfacets): %d neighbors did not match up\n",
    -        hashcount);
    -    qh_printhashtable(qh ferr);
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -#ifndef qh_NOtrace
    -  if (qh IStracing >= 2) {
    -    FOREACHfacet_i_(qh hash_table) {
    -      if (!facet)
    -        numfree++;
    -    }
    -    qh_fprintf(qh ferr, 8089, "qh_matchnewfacets: %d new facets, %d unused hash entries .  hashsize %d\n",
    -             numnew, numfree, qh_setsize(qh hash_table));
    -  }
    -#endif /* !qh_NOtrace */
    -  qh_setfree(&qh hash_table);
    -  if (qh PREmerge || qh MERGEexact) {
    -    if (qh IStracing >= 4)
    -      qh_printfacetlist(qh newfacet_list, NULL, qh_ALL);
    -    FORALLnew_facets {
    -      if (newfacet->normal)
    -        qh_checkflipped(newfacet, NULL, qh_ALL);
    -    }
    -  }else if (qh FORCEoutput)
    -    qh_checkflipped_all(qh newfacet_list);  /* prints warnings for flipped */
    -} /* matchnewfacets */
    -
    -
    -/*---------------------------------
    -
    -  qh_matchvertices( firstindex, verticesA, skipA, verticesB, skipB, same )
    -    tests whether vertices match with a single skip
    -    starts match at firstindex since all new facets have a common vertex
    -
    -  returns:
    -    true if matched vertices
    -    skip index for each set
    -    sets same iff vertices have the same orientation
    -
    -  notes:
    -    assumes skipA is in A and both sets are the same size
    -
    -  design:
    -    set up pointers
    -    scan both sets checking for a match
    -    test orientation
    -*/
    -boolT qh_matchvertices(int firstindex, setT *verticesA, int skipA,
    -       setT *verticesB, int *skipB, boolT *same) {
    -  vertexT **elemAp, **elemBp, **skipBp=NULL, **skipAp;
    -
    -  elemAp= SETelemaddr_(verticesA, firstindex, vertexT);
    -  elemBp= SETelemaddr_(verticesB, firstindex, vertexT);
    -  skipAp= SETelemaddr_(verticesA, skipA, vertexT);
    -  do if (elemAp != skipAp) {
    -    while (*elemAp != *elemBp++) {
    -      if (skipBp)
    -        return False;
    -      skipBp= elemBp;  /* one extra like FOREACH */
    -    }
    -  }while (*(++elemAp));
    -  if (!skipBp)
    -    skipBp= ++elemBp;
    -  *skipB= SETindex_(verticesB, skipB); /* i.e., skipBp - verticesB */
    -  *same= !((skipA & 0x1) ^ (*skipB & 0x1)); /* result is 0 or 1 */
    -  trace4((qh ferr, 4054, "qh_matchvertices: matched by skip %d(v%d) and skip %d(v%d) same? %d\n",
    -          skipA, (*skipAp)->id, *skipB, (*(skipBp-1))->id, *same));
    -  return(True);
    -} /* matchvertices */
    -
    -/*---------------------------------
    -
    -  qh_newfacet()
    -    return a new facet
    -
    -  returns:
    -    all fields initialized or cleared   (NULL)
    -    preallocates neighbors set
    -*/
    -facetT *qh_newfacet(void) {
    -  facetT *facet;
    -  void **freelistp; /* used if !qh_NOmem by qh_memalloc_() */
    -
    -  qh_memalloc_((int)sizeof(facetT), freelistp, facet, facetT);
    -  memset((char *)facet, (size_t)0, sizeof(facetT));
    -  if (qh facet_id == qh tracefacet_id)
    -    qh tracefacet= facet;
    -  facet->id= qh facet_id++;
    -  facet->neighbors= qh_setnew(qh hull_dim);
    -#if !qh_COMPUTEfurthest
    -  facet->furthestdist= 0.0;
    -#endif
    -#if qh_MAXoutside
    -  if (qh FORCEoutput && qh APPROXhull)
    -    facet->maxoutside= qh MINoutside;
    -  else
    -    facet->maxoutside= qh DISTround;
    -#endif
    -  facet->simplicial= True;
    -  facet->good= True;
    -  facet->newfacet= True;
    -  trace4((qh ferr, 4055, "qh_newfacet: created facet f%d\n", facet->id));
    -  return(facet);
    -} /* newfacet */
    -
    -
    -/*---------------------------------
    -
    -  qh_newridge()
    -    return a new ridge
    -*/
    -ridgeT *qh_newridge(void) {
    -  ridgeT *ridge;
    -  void **freelistp;   /* used if !qh_NOmem by qh_memalloc_() */
    -
    -  qh_memalloc_((int)sizeof(ridgeT), freelistp, ridge, ridgeT);
    -  memset((char *)ridge, (size_t)0, sizeof(ridgeT));
    -  zinc_(Ztotridges);
    -  if (qh ridge_id == UINT_MAX) {
    -    qh_fprintf(qh ferr, 7074, "\
    -qhull warning: more than 2^32 ridges.  Qhull results are OK.  Since the ridge ID wraps around to 0, two ridges may have the same identifier.\n");
    -  }
    -  ridge->id= qh ridge_id++;
    -  trace4((qh ferr, 4056, "qh_newridge: created ridge r%d\n", ridge->id));
    -  return(ridge);
    -} /* newridge */
    -
    -
    -/*---------------------------------
    -
    -  qh_pointid(  point )
    -    return id for a point,
    -    returns qh_IDnone(-3) if null, qh_IDinterior(-2) if interior, or qh_IDunknown(-1) if not known
    -
    -  alternative code if point is in qh.first_point...
    -    unsigned long id;
    -    id= ((unsigned long)point - (unsigned long)qh.first_point)/qh.normal_size;
    -
    -  notes:
    -    Valid points are non-negative
    -    WARN64 -- id truncated to 32-bits, at most 2G points
    -    NOerrors returned (QhullPoint::id)
    -    if point not in point array
    -      the code does a comparison of unrelated pointers.
    -*/
    -int qh_pointid(pointT *point) {
    -  ptr_intT offset, id;
    -
    -  if (!point)
    -    return qh_IDnone;
    -  else if (point == qh interior_point)
    -    return qh_IDinterior;
    -  else if (point >= qh first_point
    -  && point < qh first_point + qh num_points * qh hull_dim) {
    -    offset= (ptr_intT)(point - qh first_point);
    -    id= offset / qh hull_dim;
    -  }else if ((id= qh_setindex(qh other_points, point)) != -1)
    -    id += qh num_points;
    -  else
    -    return qh_IDunknown;
    -  return (int)id;
    -} /* pointid */
    -
    -/*---------------------------------
    -
    -  qh_removefacet( facet )
    -    unlinks facet from qh.facet_list,
    -
    -  returns:
    -    updates qh.facet_list .newfacet_list .facet_next visible_list
    -    decrements qh.num_facets
    -
    -  see:
    -    qh_appendfacet
    -*/
    -void qh_removefacet(facetT *facet) {
    -  facetT *next= facet->next, *previous= facet->previous;
    -
    -  if (facet == qh newfacet_list)
    -    qh newfacet_list= next;
    -  if (facet == qh facet_next)
    -    qh facet_next= next;
    -  if (facet == qh visible_list)
    -    qh visible_list= next;
    -  if (previous) {
    -    previous->next= next;
    -    next->previous= previous;
    -  }else {  /* 1st facet in qh facet_list */
    -    qh facet_list= next;
    -    qh facet_list->previous= NULL;
    -  }
    -  qh num_facets--;
    -  trace4((qh ferr, 4057, "qh_removefacet: remove f%d from facet_list\n", facet->id));
    -} /* removefacet */
    -
    -
    -/*---------------------------------
    -
    -  qh_removevertex( vertex )
    -    unlinks vertex from qh.vertex_list,
    -
    -  returns:
    -    updates qh.vertex_list .newvertex_list
    -    decrements qh.num_vertices
    -*/
    -void qh_removevertex(vertexT *vertex) {
    -  vertexT *next= vertex->next, *previous= vertex->previous;
    -
    -  if (vertex == qh newvertex_list)
    -    qh newvertex_list= next;
    -  if (previous) {
    -    previous->next= next;
    -    next->previous= previous;
    -  }else {  /* 1st vertex in qh vertex_list */
    -    qh vertex_list= vertex->next;
    -    qh vertex_list->previous= NULL;
    -  }
    -  qh num_vertices--;
    -  trace4((qh ferr, 4058, "qh_removevertex: remove v%d from vertex_list\n", vertex->id));
    -} /* removevertex */
    -
    -
    -/*---------------------------------
    -
    -  qh_updatevertices()
    -    update vertex neighbors and delete interior vertices
    -
    -  returns:
    -    if qh.VERTEXneighbors, updates neighbors for each vertex
    -      if qh.newvertex_list,
    -         removes visible neighbors  from vertex neighbors
    -      if qh.newfacet_list
    -         adds new facets to vertex neighbors
    -    if qh.visible_list
    -       interior vertices added to qh.del_vertices for later partitioning
    -
    -  design:
    -    if qh.VERTEXneighbors
    -      deletes references to visible facets from vertex neighbors
    -      appends new facets to the neighbor list for each vertex
    -      checks all vertices of visible facets
    -        removes visible facets from neighbor lists
    -        marks unused vertices for deletion
    -*/
    -void qh_updatevertices(void /*qh.newvertex_list, newfacet_list, visible_list*/) {
    -  facetT *newfacet= NULL, *neighbor, **neighborp, *visible;
    -  vertexT *vertex, **vertexp;
    -
    -  trace3((qh ferr, 3013, "qh_updatevertices: delete interior vertices and update vertex->neighbors\n"));
    -  if (qh VERTEXneighbors) {
    -    FORALLvertex_(qh newvertex_list) {
    -      FOREACHneighbor_(vertex) {
    -        if (neighbor->visible)
    -          SETref_(neighbor)= NULL;
    -      }
    -      qh_setcompact(vertex->neighbors);
    -    }
    -    FORALLnew_facets {
    -      FOREACHvertex_(newfacet->vertices)
    -        qh_setappend(&vertex->neighbors, newfacet);
    -    }
    -    FORALLvisible_facets {
    -      FOREACHvertex_(visible->vertices) {
    -        if (!vertex->newlist && !vertex->deleted) {
    -          FOREACHneighbor_(vertex) { /* this can happen under merging */
    -            if (!neighbor->visible)
    -              break;
    -          }
    -          if (neighbor)
    -            qh_setdel(vertex->neighbors, visible);
    -          else {
    -            vertex->deleted= True;
    -            qh_setappend(&qh del_vertices, vertex);
    -            trace2((qh ferr, 2041, "qh_updatevertices: delete vertex p%d(v%d) in f%d\n",
    -                  qh_pointid(vertex->point), vertex->id, visible->id));
    -          }
    -        }
    -      }
    -    }
    -  }else {  /* !VERTEXneighbors */
    -    FORALLvisible_facets {
    -      FOREACHvertex_(visible->vertices) {
    -        if (!vertex->newlist && !vertex->deleted) {
    -          vertex->deleted= True;
    -          qh_setappend(&qh del_vertices, vertex);
    -          trace2((qh ferr, 2042, "qh_updatevertices: delete vertex p%d(v%d) in f%d\n",
    -                  qh_pointid(vertex->point), vertex->id, visible->id));
    -        }
    -      }
    -    }
    -  }
    -} /* updatevertices */
    -
    -
    -
    diff --git a/src/qhull/src/libqhull/poly.h b/src/qhull/src/libqhull/poly.h
    deleted file mode 100644
    index af8b42077f1..00000000000
    --- a/src/qhull/src/libqhull/poly.h
    +++ /dev/null
    @@ -1,296 +0,0 @@
    -/*
      ---------------------------------
    -
    -   poly.h
    -   header file for poly.c and poly2.c
    -
    -   see qh-poly.htm, libqhull.h and poly.c
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull/poly.h#3 $$Change: 2047 $
    -   $DateTime: 2016/01/04 22:03:18 $$Author: bbarber $
    -*/
    -
    -#ifndef qhDEFpoly
    -#define qhDEFpoly 1
    -
    -#include "libqhull.h"
    -
    -/*===============   constants ========================== */
    -
    -/*----------------------------------
    -
    -  ALGORITHMfault
    -    use as argument to checkconvex() to report errors during buildhull
    -*/
    -#define qh_ALGORITHMfault 0
    -
    -/*----------------------------------
    -
    -  DATAfault
    -    use as argument to checkconvex() to report errors during initialhull
    -*/
    -#define qh_DATAfault 1
    -
    -/*----------------------------------
    -
    -  DUPLICATEridge
    -    special value for facet->neighbor to indicate a duplicate ridge
    -
    -  notes:
    -    set by matchneighbor, used by matchmatch and mark_dupridge
    -*/
    -#define qh_DUPLICATEridge (facetT *)1L
    -
    -/*----------------------------------
    -
    -  MERGEridge       flag in facet
    -    special value for facet->neighbor to indicate a merged ridge
    -
    -  notes:
    -    set by matchneighbor, used by matchmatch and mark_dupridge
    -*/
    -#define qh_MERGEridge (facetT *)2L
    -
    -
    -/*============ -structures- ====================*/
    -
    -/*=========== -macros- =========================*/
    -
    -/*----------------------------------
    -
    -  FORALLfacet_( facetlist ) { ... }
    -    assign 'facet' to each facet in facetlist
    -
    -  notes:
    -    uses 'facetT *facet;'
    -    assumes last facet is a sentinel
    -
    -  see:
    -    FORALLfacets
    -*/
    -#define FORALLfacet_( facetlist ) if (facetlist ) for ( facet=( facetlist ); facet && facet->next; facet= facet->next )
    -
    -/*----------------------------------
    -
    -  FORALLnew_facets { ... }
    -    assign 'newfacet' to each facet in qh.newfacet_list
    -
    -  notes:
    -    uses 'facetT *newfacet;'
    -    at exit, newfacet==NULL
    -*/
    -#define FORALLnew_facets for ( newfacet=qh newfacet_list;newfacet && newfacet->next;newfacet=newfacet->next )
    -
    -/*----------------------------------
    -
    -  FORALLvertex_( vertexlist ) { ... }
    -    assign 'vertex' to each vertex in vertexlist
    -
    -  notes:
    -    uses 'vertexT *vertex;'
    -    at exit, vertex==NULL
    -*/
    -#define FORALLvertex_( vertexlist ) for (vertex=( vertexlist );vertex && vertex->next;vertex= vertex->next )
    -
    -/*----------------------------------
    -
    -  FORALLvisible_facets { ... }
    -    assign 'visible' to each visible facet in qh.visible_list
    -
    -  notes:
    -    uses 'vacetT *visible;'
    -    at exit, visible==NULL
    -*/
    -#define FORALLvisible_facets for (visible=qh visible_list; visible && visible->visible; visible= visible->next)
    -
    -/*----------------------------------
    -
    -  FORALLsame_( newfacet ) { ... }
    -    assign 'same' to each facet in newfacet->f.samecycle
    -
    -  notes:
    -    uses 'facetT *same;'
    -    stops when it returns to newfacet
    -*/
    -#define FORALLsame_(newfacet) for (same= newfacet->f.samecycle; same != newfacet; same= same->f.samecycle)
    -
    -/*----------------------------------
    -
    -  FORALLsame_cycle_( newfacet ) { ... }
    -    assign 'same' to each facet in newfacet->f.samecycle
    -
    -  notes:
    -    uses 'facetT *same;'
    -    at exit, same == NULL
    -*/
    -#define FORALLsame_cycle_(newfacet) \
    -     for (same= newfacet->f.samecycle; \
    -         same; same= (same == newfacet ?  NULL : same->f.samecycle))
    -
    -/*----------------------------------
    -
    -  FOREACHneighborA_( facet ) { ... }
    -    assign 'neighborA' to each neighbor in facet->neighbors
    -
    -  FOREACHneighborA_( vertex ) { ... }
    -    assign 'neighborA' to each neighbor in vertex->neighbors
    -
    -  declare:
    -    facetT *neighborA, **neighborAp;
    -
    -  see:
    -    FOREACHsetelement_
    -*/
    -#define FOREACHneighborA_(facet)  FOREACHsetelement_(facetT, facet->neighbors, neighborA)
    -
    -/*----------------------------------
    -
    -  FOREACHvisible_( facets ) { ... }
    -    assign 'visible' to each facet in facets
    -
    -  notes:
    -    uses 'facetT *facet, *facetp;'
    -    see FOREACHsetelement_
    -*/
    -#define FOREACHvisible_(facets) FOREACHsetelement_(facetT, facets, visible)
    -
    -/*----------------------------------
    -
    -  FOREACHnewfacet_( facets ) { ... }
    -    assign 'newfacet' to each facet in facets
    -
    -  notes:
    -    uses 'facetT *newfacet, *newfacetp;'
    -    see FOREACHsetelement_
    -*/
    -#define FOREACHnewfacet_(facets) FOREACHsetelement_(facetT, facets, newfacet)
    -
    -/*----------------------------------
    -
    -  FOREACHvertexA_( vertices ) { ... }
    -    assign 'vertexA' to each vertex in vertices
    -
    -  notes:
    -    uses 'vertexT *vertexA, *vertexAp;'
    -    see FOREACHsetelement_
    -*/
    -#define FOREACHvertexA_(vertices) FOREACHsetelement_(vertexT, vertices, vertexA)
    -
    -/*----------------------------------
    -
    -  FOREACHvertexreverse12_( vertices ) { ... }
    -    assign 'vertex' to each vertex in vertices
    -    reverse order of first two vertices
    -
    -  notes:
    -    uses 'vertexT *vertex, *vertexp;'
    -    see FOREACHsetelement_
    -*/
    -#define FOREACHvertexreverse12_(vertices) FOREACHsetelementreverse12_(vertexT, vertices, vertex)
    -
    -
    -/*=============== prototypes poly.c in alphabetical order ================*/
    -
    -void    qh_appendfacet(facetT *facet);
    -void    qh_appendvertex(vertexT *vertex);
    -void    qh_attachnewfacets(void /* qh.visible_list, qh.newfacet_list */);
    -boolT   qh_checkflipped(facetT *facet, realT *dist, boolT allerror);
    -void    qh_delfacet(facetT *facet);
    -void    qh_deletevisible(void /*qh.visible_list, qh.horizon_list*/);
    -setT   *qh_facetintersect(facetT *facetA, facetT *facetB, int *skipAp,int *skipBp, int extra);
    -int     qh_gethash(int hashsize, setT *set, int size, int firstindex, void *skipelem);
    -facetT *qh_makenewfacet(setT *vertices, boolT toporient, facetT *facet);
    -void    qh_makenewplanes(void /* newfacet_list */);
    -facetT *qh_makenew_nonsimplicial(facetT *visible, vertexT *apex, int *numnew);
    -facetT *qh_makenew_simplicial(facetT *visible, vertexT *apex, int *numnew);
    -void    qh_matchneighbor(facetT *newfacet, int newskip, int hashsize,
    -                          int *hashcount);
    -void    qh_matchnewfacets(void);
    -boolT   qh_matchvertices(int firstindex, setT *verticesA, int skipA,
    -                          setT *verticesB, int *skipB, boolT *same);
    -facetT *qh_newfacet(void);
    -ridgeT *qh_newridge(void);
    -int     qh_pointid(pointT *point);
    -void    qh_removefacet(facetT *facet);
    -void    qh_removevertex(vertexT *vertex);
    -void    qh_updatevertices(void);
    -
    -
    -/*========== -prototypes poly2.c in alphabetical order ===========*/
    -
    -void    qh_addhash(void* newelem, setT *hashtable, int hashsize, int hash);
    -void    qh_check_bestdist(void);
    -void    qh_check_dupridge(facetT *facet1, realT dist1, facetT *facet2, realT dist2);
    -void    qh_check_maxout(void);
    -void    qh_check_output(void);
    -void    qh_check_point(pointT *point, facetT *facet, realT *maxoutside, realT *maxdist, facetT **errfacet1, facetT **errfacet2);
    -void    qh_check_points(void);
    -void    qh_checkconvex(facetT *facetlist, int fault);
    -void    qh_checkfacet(facetT *facet, boolT newmerge, boolT *waserrorp);
    -void    qh_checkflipped_all(facetT *facetlist);
    -void    qh_checkpolygon(facetT *facetlist);
    -void    qh_checkvertex(vertexT *vertex);
    -void    qh_clearcenters(qh_CENTER type);
    -void    qh_createsimplex(setT *vertices);
    -void    qh_delridge(ridgeT *ridge);
    -void    qh_delvertex(vertexT *vertex);
    -setT   *qh_facet3vertex(facetT *facet);
    -facetT *qh_findbestfacet(pointT *point, boolT bestoutside,
    -           realT *bestdist, boolT *isoutside);
    -facetT *qh_findbestlower(facetT *upperfacet, pointT *point, realT *bestdistp, int *numpart);
    -facetT *qh_findfacet_all(pointT *point, realT *bestdist, boolT *isoutside,
    -                          int *numpart);
    -int     qh_findgood(facetT *facetlist, int goodhorizon);
    -void    qh_findgood_all(facetT *facetlist);
    -void    qh_furthestnext(void /* qh.facet_list */);
    -void    qh_furthestout(facetT *facet);
    -void    qh_infiniteloop(facetT *facet);
    -void    qh_initbuild(void);
    -void    qh_initialhull(setT *vertices);
    -setT   *qh_initialvertices(int dim, setT *maxpoints, pointT *points, int numpoints);
    -vertexT *qh_isvertex(pointT *point, setT *vertices);
    -vertexT *qh_makenewfacets(pointT *point /*horizon_list, visible_list*/);
    -void    qh_matchduplicates(facetT *atfacet, int atskip, int hashsize, int *hashcount);
    -void    qh_nearcoplanar(void /* qh.facet_list */);
    -vertexT *qh_nearvertex(facetT *facet, pointT *point, realT *bestdistp);
    -int     qh_newhashtable(int newsize);
    -vertexT *qh_newvertex(pointT *point);
    -ridgeT *qh_nextridge3d(ridgeT *atridge, facetT *facet, vertexT **vertexp);
    -void    qh_outcoplanar(void /* facet_list */);
    -pointT *qh_point(int id);
    -void    qh_point_add(setT *set, pointT *point, void *elem);
    -setT   *qh_pointfacet(void /*qh.facet_list*/);
    -setT   *qh_pointvertex(void /*qh.facet_list*/);
    -void    qh_prependfacet(facetT *facet, facetT **facetlist);
    -void    qh_printhashtable(FILE *fp);
    -void    qh_printlists(void);
    -void    qh_resetlists(boolT stats, boolT resetVisible /*qh.newvertex_list qh.newfacet_list qh.visible_list*/);
    -void    qh_setvoronoi_all(void);
    -void    qh_triangulate(void /*qh.facet_list*/);
    -void    qh_triangulate_facet(facetT *facetA, vertexT **first_vertex);
    -void    qh_triangulate_link(facetT *oldfacetA, facetT *facetA, facetT *oldfacetB, facetT *facetB);
    -void    qh_triangulate_mirror(facetT *facetA, facetT *facetB);
    -void    qh_triangulate_null(facetT *facetA);
    -void    qh_vertexintersect(setT **vertexsetA,setT *vertexsetB);
    -setT   *qh_vertexintersect_new(setT *vertexsetA,setT *vertexsetB);
    -void    qh_vertexneighbors(void /*qh.facet_list*/);
    -boolT   qh_vertexsubset(setT *vertexsetA, setT *vertexsetB);
    -
    -
    -#endif /* qhDEFpoly */
    diff --git a/src/qhull/src/libqhull/poly2.c b/src/qhull/src/libqhull/poly2.c
    deleted file mode 100644
    index de3e6ad0bb8..00000000000
    --- a/src/qhull/src/libqhull/poly2.c
    +++ /dev/null
    @@ -1,3222 +0,0 @@
    -/*
      ---------------------------------
    -
    -   poly2.c
    -   implements polygons and simplices
    -
    -   see qh-poly.htm, poly.h and libqhull.h
    -
    -   frequently used code is in poly.c
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull/poly2.c#11 $$Change: 2069 $
    -   $DateTime: 2016/01/18 22:05:03 $$Author: bbarber $
    -*/
    -
    -#include "qhull_a.h"
    -
    -/*======== functions in alphabetical order ==========*/
    -
    -/*---------------------------------
    -
    -  qh_addhash( newelem, hashtable, hashsize, hash )
    -    add newelem to linear hash table at hash if not already there
    -*/
    -void qh_addhash(void* newelem, setT *hashtable, int hashsize, int hash) {
    -  int scan;
    -  void *elem;
    -
    -  for (scan= (int)hash; (elem= SETelem_(hashtable, scan));
    -       scan= (++scan >= hashsize ? 0 : scan)) {
    -    if (elem == newelem)
    -      break;
    -  }
    -  /* loop terminates because qh_HASHfactor >= 1.1 by qh_initbuffers */
    -  if (!elem)
    -    SETelem_(hashtable, scan)= newelem;
    -} /* addhash */
    -
    -/*---------------------------------
    -
    -  qh_check_bestdist()
    -    check that all points are within max_outside of the nearest facet
    -    if qh.ONLYgood,
    -      ignores !good facets
    -
    -  see:
    -    qh_check_maxout(), qh_outerinner()
    -
    -  notes:
    -    only called from qh_check_points()
    -      seldom used since qh.MERGING is almost always set
    -    if notverified>0 at end of routine
    -      some points were well inside the hull.  If the hull contains
    -      a lens-shaped component, these points were not verified.  Use
    -      options 'Qi Tv' to verify all points.  (Exhaustive check also verifies)
    -
    -  design:
    -    determine facet for each point (if any)
    -    for each point
    -      start with the assigned facet or with the first facet
    -      find the best facet for the point and check all coplanar facets
    -      error if point is outside of facet
    -*/
    -void qh_check_bestdist(void) {
    -  boolT waserror= False, unassigned;
    -  facetT *facet, *bestfacet, *errfacet1= NULL, *errfacet2= NULL;
    -  facetT *facetlist;
    -  realT dist, maxoutside, maxdist= -REALmax;
    -  pointT *point;
    -  int numpart= 0, facet_i, facet_n, notgood= 0, notverified= 0;
    -  setT *facets;
    -
    -  trace1((qh ferr, 1020, "qh_check_bestdist: check points below nearest facet.  Facet_list f%d\n",
    -      qh facet_list->id));
    -  maxoutside= qh_maxouter();
    -  maxoutside += qh DISTround;
    -  /* one more qh.DISTround for check computation */
    -  trace1((qh ferr, 1021, "qh_check_bestdist: check that all points are within %2.2g of best facet\n", maxoutside));
    -  facets= qh_pointfacet(/*qh.facet_list*/);
    -  if (!qh_QUICKhelp && qh PRINTprecision)
    -    qh_fprintf(qh ferr, 8091, "\n\
    -qhull output completed.  Verifying that %d points are\n\
    -below %2.2g of the nearest %sfacet.\n",
    -             qh_setsize(facets), maxoutside, (qh ONLYgood ?  "good " : ""));
    -  FOREACHfacet_i_(facets) {  /* for each point with facet assignment */
    -    if (facet)
    -      unassigned= False;
    -    else {
    -      unassigned= True;
    -      facet= qh facet_list;
    -    }
    -    point= qh_point(facet_i);
    -    if (point == qh GOODpointp)
    -      continue;
    -    qh_distplane(point, facet, &dist);
    -    numpart++;
    -    bestfacet= qh_findbesthorizon(!qh_IScheckmax, point, facet, qh_NOupper, &dist, &numpart);
    -    /* occurs after statistics reported */
    -    maximize_(maxdist, dist);
    -    if (dist > maxoutside) {
    -      if (qh ONLYgood && !bestfacet->good
    -          && !((bestfacet= qh_findgooddist(point, bestfacet, &dist, &facetlist))
    -               && dist > maxoutside))
    -        notgood++;
    -      else {
    -        waserror= True;
    -        qh_fprintf(qh ferr, 6109, "qhull precision error: point p%d is outside facet f%d, distance= %6.8g maxoutside= %6.8g\n",
    -                facet_i, bestfacet->id, dist, maxoutside);
    -        if (errfacet1 != bestfacet) {
    -          errfacet2= errfacet1;
    -          errfacet1= bestfacet;
    -        }
    -      }
    -    }else if (unassigned && dist < -qh MAXcoplanar)
    -      notverified++;
    -  }
    -  qh_settempfree(&facets);
    -  if (notverified && !qh DELAUNAY && !qh_QUICKhelp && qh PRINTprecision)
    -    qh_fprintf(qh ferr, 8092, "\n%d points were well inside the hull.  If the hull contains\n\
    -a lens-shaped component, these points were not verified.  Use\n\
    -options 'Qci Tv' to verify all points.\n", notverified);
    -  if (maxdist > qh outside_err) {
    -    qh_fprintf(qh ferr, 6110, "qhull precision error (qh_check_bestdist): a coplanar point is %6.2g from convex hull.  The maximum value(qh.outside_err) is %6.2g\n",
    -              maxdist, qh outside_err);
    -    qh_errexit2(qh_ERRprec, errfacet1, errfacet2);
    -  }else if (waserror && qh outside_err > REALmax/2)
    -    qh_errexit2(qh_ERRprec, errfacet1, errfacet2);
    -  /* else if waserror, the error was logged to qh.ferr but does not effect the output */
    -  trace0((qh ferr, 20, "qh_check_bestdist: max distance outside %2.2g\n", maxdist));
    -} /* check_bestdist */
    -
    -/*---------------------------------
    -
    -  qh_check_dupridge(facet1, dist1, facet2, dist2)
    -    Check duplicate ridge between facet1 and facet2 for wide merge
    -    dist1 is the maximum distance of facet1's vertices to facet2
    -    dist2 is the maximum distance of facet2's vertices to facet1
    -
    -  Returns
    -    Level 1 log of the duplicate ridge with the minimum distance between vertices
    -    Throws error if the merge will increase the maximum facet width by qh_WIDEduplicate (100x)
    -
    -  called from:
    -    qh_forcedmerges()
    -*/
    -#ifndef qh_NOmerge
    -void qh_check_dupridge(facetT *facet1, realT dist1, facetT *facet2, realT dist2) {
    -  vertexT *vertex, **vertexp, *vertexA, **vertexAp;
    -  realT dist, innerplane, mergedist, outerplane, prevdist, ratio;
    -  realT minvertex= REALmax;
    -
    -  mergedist= fmin_(dist1, dist2);
    -  qh_outerinner(NULL, &outerplane, &innerplane);  /* ratio from qh_printsummary */
    -  prevdist= fmax_(outerplane, innerplane);
    -  maximize_(prevdist, qh ONEmerge + qh DISTround);
    -  maximize_(prevdist, qh MINoutside + qh DISTround);
    -  ratio= mergedist/prevdist;
    -  FOREACHvertex_(facet1->vertices) {     /* The duplicate ridge is between facet1 and facet2, so either facet can be tested */
    -    FOREACHvertexA_(facet1->vertices) {
    -      if (vertex > vertexA){   /* Test each pair once */
    -        dist= qh_pointdist(vertex->point, vertexA->point, qh hull_dim);
    -        minimize_(minvertex, dist);
    -      }
    -    }
    -  }
    -  trace0((qh ferr, 16, "qh_check_dupridge: duplicate ridge between f%d and f%d due to nearly-coincident vertices (%2.2g), dist %2.2g, reverse dist %2.2g, ratio %2.2g while processing p%d\n",
    -        facet1->id, facet2->id, minvertex, dist1, dist2, ratio, qh furthest_id));
    -  if (ratio > qh_WIDEduplicate) {
    -    qh_fprintf(qh ferr, 6271, "qhull precision error (qh_check_dupridge): wide merge (%.0f times wider) due to duplicate ridge with nearly coincident points (%2.2g) between f%d and f%d, merge dist %2.2g, while processing p%d\n- Ignore error with option 'Q12'\n- To be fixed in a later version of Qhull\n",
    -          ratio, minvertex, facet1->id, facet2->id, mergedist, qh furthest_id);
    -    if (qh DELAUNAY)
    -      qh_fprintf(qh ferr, 8145, "- A bounding box for the input sites may alleviate this error.\n");
    -    if(minvertex > qh_WIDEduplicate*prevdist)
    -      qh_fprintf(qh ferr, 8146, "- Vertex distance %2.2g is greater than %d times maximum distance %2.2g\n  Please report to bradb@shore.net with steps to reproduce and all output\n",
    -          minvertex, qh_WIDEduplicate, prevdist);
    -    if (!qh NOwide)
    -      qh_errexit2(qh_ERRqhull, facet1, facet2);
    -  }
    -} /* check_dupridge */
    -#endif
    -
    -/*---------------------------------
    -
    -  qh_check_maxout()
    -    updates qh.max_outside by checking all points against bestfacet
    -    if qh.ONLYgood, ignores !good facets
    -
    -  returns:
    -    updates facet->maxoutside via qh_findbesthorizon()
    -    sets qh.maxoutdone
    -    if printing qh.min_vertex (qh_outerinner),
    -      it is updated to the current vertices
    -    removes inside/coplanar points from coplanarset as needed
    -
    -  notes:
    -    defines coplanar as min_vertex instead of MAXcoplanar
    -    may not need to check near-inside points because of qh.MAXcoplanar
    -      and qh.KEEPnearinside (before it was -DISTround)
    -
    -  see also:
    -    qh_check_bestdist()
    -
    -  design:
    -    if qh.min_vertex is needed
    -      for all neighbors of all vertices
    -        test distance from vertex to neighbor
    -    determine facet for each point (if any)
    -    for each point with an assigned facet
    -      find the best facet for the point and check all coplanar facets
    -        (updates outer planes)
    -    remove near-inside points from coplanar sets
    -*/
    -#ifndef qh_NOmerge
    -void qh_check_maxout(void) {
    -  facetT *facet, *bestfacet, *neighbor, **neighborp, *facetlist;
    -  realT dist, maxoutside, minvertex, old_maxoutside;
    -  pointT *point;
    -  int numpart= 0, facet_i, facet_n, notgood= 0;
    -  setT *facets, *vertices;
    -  vertexT *vertex;
    -
    -  trace1((qh ferr, 1022, "qh_check_maxout: check and update maxoutside for each facet.\n"));
    -  maxoutside= minvertex= 0;
    -  if (qh VERTEXneighbors
    -  && (qh PRINTsummary || qh KEEPinside || qh KEEPcoplanar
    -        || qh TRACElevel || qh PRINTstatistics
    -        || qh PRINTout[0] == qh_PRINTsummary || qh PRINTout[0] == qh_PRINTnone)) {
    -    trace1((qh ferr, 1023, "qh_check_maxout: determine actual maxoutside and minvertex\n"));
    -    vertices= qh_pointvertex(/*qh.facet_list*/);
    -    FORALLvertices {
    -      FOREACHneighbor_(vertex) {
    -        zinc_(Zdistvertex);  /* distance also computed by main loop below */
    -        qh_distplane(vertex->point, neighbor, &dist);
    -        minimize_(minvertex, dist);
    -        if (-dist > qh TRACEdist || dist > qh TRACEdist
    -        || neighbor == qh tracefacet || vertex == qh tracevertex)
    -          qh_fprintf(qh ferr, 8093, "qh_check_maxout: p%d(v%d) is %.2g from f%d\n",
    -                    qh_pointid(vertex->point), vertex->id, dist, neighbor->id);
    -      }
    -    }
    -    if (qh MERGING) {
    -      wmin_(Wminvertex, qh min_vertex);
    -    }
    -    qh min_vertex= minvertex;
    -    qh_settempfree(&vertices);
    -  }
    -  facets= qh_pointfacet(/*qh.facet_list*/);
    -  do {
    -    old_maxoutside= fmax_(qh max_outside, maxoutside);
    -    FOREACHfacet_i_(facets) {     /* for each point with facet assignment */
    -      if (facet) {
    -        point= qh_point(facet_i);
    -        if (point == qh GOODpointp)
    -          continue;
    -        zzinc_(Ztotcheck);
    -        qh_distplane(point, facet, &dist);
    -        numpart++;
    -        bestfacet= qh_findbesthorizon(qh_IScheckmax, point, facet, !qh_NOupper, &dist, &numpart);
    -        if (bestfacet && dist > maxoutside) {
    -          if (qh ONLYgood && !bestfacet->good
    -          && !((bestfacet= qh_findgooddist(point, bestfacet, &dist, &facetlist))
    -               && dist > maxoutside))
    -            notgood++;
    -          else
    -            maxoutside= dist;
    -        }
    -        if (dist > qh TRACEdist || (bestfacet && bestfacet == qh tracefacet))
    -          qh_fprintf(qh ferr, 8094, "qh_check_maxout: p%d is %.2g above f%d\n",
    -                     qh_pointid(point), dist, (bestfacet ? bestfacet->id : UINT_MAX));
    -      }
    -    }
    -  }while
    -    (maxoutside > 2*old_maxoutside);
    -    /* if qh.maxoutside increases substantially, qh_SEARCHdist is not valid
    -          e.g., RBOX 5000 s Z1 G1e-13 t1001200614 | qhull */
    -  zzadd_(Zcheckpart, numpart);
    -  qh_settempfree(&facets);
    -  wval_(Wmaxout)= maxoutside - qh max_outside;
    -  wmax_(Wmaxoutside, qh max_outside);
    -  qh max_outside= maxoutside;
    -  qh_nearcoplanar(/*qh.facet_list*/);
    -  qh maxoutdone= True;
    -  trace1((qh ferr, 1024, "qh_check_maxout: maxoutside %2.2g, min_vertex %2.2g, outside of not good %d\n",
    -       maxoutside, qh min_vertex, notgood));
    -} /* check_maxout */
    -#else /* qh_NOmerge */
    -void qh_check_maxout(void) {
    -}
    -#endif
    -
    -/*---------------------------------
    -
    -  qh_check_output()
    -    performs the checks at the end of qhull algorithm
    -    Maybe called after voronoi output.  Will recompute otherwise centrums are Voronoi centers instead
    -*/
    -void qh_check_output(void) {
    -  int i;
    -
    -  if (qh STOPcone)
    -    return;
    -  if (qh VERIFYoutput | qh IStracing | qh CHECKfrequently) {
    -    qh_checkpolygon(qh facet_list);
    -    qh_checkflipped_all(qh facet_list);
    -    qh_checkconvex(qh facet_list, qh_ALGORITHMfault);
    -  }else if (!qh MERGING && qh_newstats(qhstat precision, &i)) {
    -    qh_checkflipped_all(qh facet_list);
    -    qh_checkconvex(qh facet_list, qh_ALGORITHMfault);
    -  }
    -} /* check_output */
    -
    -
    -
    -/*---------------------------------
    -
    -  qh_check_point( point, facet, maxoutside, maxdist, errfacet1, errfacet2 )
    -    check that point is less than maxoutside from facet
    -*/
    -void qh_check_point(pointT *point, facetT *facet, realT *maxoutside, realT *maxdist, facetT **errfacet1, facetT **errfacet2) {
    -  realT dist;
    -
    -  /* occurs after statistics reported */
    -  qh_distplane(point, facet, &dist);
    -  if (dist > *maxoutside) {
    -    if (*errfacet1 != facet) {
    -      *errfacet2= *errfacet1;
    -      *errfacet1= facet;
    -    }
    -    qh_fprintf(qh ferr, 6111, "qhull precision error: point p%d is outside facet f%d, distance= %6.8g maxoutside= %6.8g\n",
    -              qh_pointid(point), facet->id, dist, *maxoutside);
    -  }
    -  maximize_(*maxdist, dist);
    -} /* qh_check_point */
    -
    -
    -/*---------------------------------
    -
    -  qh_check_points()
    -    checks that all points are inside all facets
    -
    -  notes:
    -    if many points and qh_check_maxout not called (i.e., !qh.MERGING),
    -       calls qh_findbesthorizon (seldom done).
    -    ignores flipped facets
    -    maxoutside includes 2 qh.DISTrounds
    -      one qh.DISTround for the computed distances in qh_check_points
    -    qh_printafacet and qh_printsummary needs only one qh.DISTround
    -    the computation for qh.VERIFYdirect does not account for qh.other_points
    -
    -  design:
    -    if many points
    -      use qh_check_bestdist()
    -    else
    -      for all facets
    -        for all points
    -          check that point is inside facet
    -*/
    -void qh_check_points(void) {
    -  facetT *facet, *errfacet1= NULL, *errfacet2= NULL;
    -  realT total, maxoutside, maxdist= -REALmax;
    -  pointT *point, **pointp, *pointtemp;
    -  boolT testouter;
    -
    -  maxoutside= qh_maxouter();
    -  maxoutside += qh DISTround;
    -  /* one more qh.DISTround for check computation */
    -  trace1((qh ferr, 1025, "qh_check_points: check all points below %2.2g of all facet planes\n",
    -          maxoutside));
    -  if (qh num_good)   /* miss counts other_points and !good facets */
    -     total= (float)qh num_good * (float)qh num_points;
    -  else
    -     total= (float)qh num_facets * (float)qh num_points;
    -  if (total >= qh_VERIFYdirect && !qh maxoutdone) {
    -    if (!qh_QUICKhelp && qh SKIPcheckmax && qh MERGING)
    -      qh_fprintf(qh ferr, 7075, "qhull input warning: merging without checking outer planes('Q5' or 'Po').\n\
    -Verify may report that a point is outside of a facet.\n");
    -    qh_check_bestdist();
    -  }else {
    -    if (qh_MAXoutside && qh maxoutdone)
    -      testouter= True;
    -    else
    -      testouter= False;
    -    if (!qh_QUICKhelp) {
    -      if (qh MERGEexact)
    -        qh_fprintf(qh ferr, 7076, "qhull input warning: exact merge ('Qx').  Verify may report that a point\n\
    -is outside of a facet.  See qh-optq.htm#Qx\n");
    -      else if (qh SKIPcheckmax || qh NOnearinside)
    -        qh_fprintf(qh ferr, 7077, "qhull input warning: no outer plane check ('Q5') or no processing of\n\
    -near-inside points ('Q8').  Verify may report that a point is outside\n\
    -of a facet.\n");
    -    }
    -    if (qh PRINTprecision) {
    -      if (testouter)
    -        qh_fprintf(qh ferr, 8098, "\n\
    -Output completed.  Verifying that all points are below outer planes of\n\
    -all %sfacets.  Will make %2.0f distance computations.\n",
    -              (qh ONLYgood ?  "good " : ""), total);
    -      else
    -        qh_fprintf(qh ferr, 8099, "\n\
    -Output completed.  Verifying that all points are below %2.2g of\n\
    -all %sfacets.  Will make %2.0f distance computations.\n",
    -              maxoutside, (qh ONLYgood ?  "good " : ""), total);
    -    }
    -    FORALLfacets {
    -      if (!facet->good && qh ONLYgood)
    -        continue;
    -      if (facet->flipped)
    -        continue;
    -      if (!facet->normal) {
    -        qh_fprintf(qh ferr, 7061, "qhull warning (qh_check_points): missing normal for facet f%d\n", facet->id);
    -        continue;
    -      }
    -      if (testouter) {
    -#if qh_MAXoutside
    -        maxoutside= facet->maxoutside + 2* qh DISTround;
    -        /* one DISTround to actual point and another to computed point */
    -#endif
    -      }
    -      FORALLpoints {
    -        if (point != qh GOODpointp)
    -          qh_check_point(point, facet, &maxoutside, &maxdist, &errfacet1, &errfacet2);
    -      }
    -      FOREACHpoint_(qh other_points) {
    -        if (point != qh GOODpointp)
    -          qh_check_point(point, facet, &maxoutside, &maxdist, &errfacet1, &errfacet2);
    -      }
    -    }
    -    if (maxdist > qh outside_err) {
    -      qh_fprintf(qh ferr, 6112, "qhull precision error (qh_check_points): a coplanar point is %6.2g from convex hull.  The maximum value(qh.outside_err) is %6.2g\n",
    -                maxdist, qh outside_err );
    -      qh_errexit2( qh_ERRprec, errfacet1, errfacet2 );
    -    }else if (errfacet1 && qh outside_err > REALmax/2)
    -        qh_errexit2( qh_ERRprec, errfacet1, errfacet2 );
    -    /* else if errfacet1, the error was logged to qh.ferr but does not effect the output */
    -    trace0((qh ferr, 21, "qh_check_points: max distance outside %2.2g\n", maxdist));
    -  }
    -} /* check_points */
    -
    -
    -/*---------------------------------
    -
    -  qh_checkconvex( facetlist, fault )
    -    check that each ridge in facetlist is convex
    -    fault = qh_DATAfault if reporting errors
    -          = qh_ALGORITHMfault otherwise
    -
    -  returns:
    -    counts Zconcaveridges and Zcoplanarridges
    -    errors if concaveridge or if merging an coplanar ridge
    -
    -  note:
    -    if not merging,
    -      tests vertices for neighboring simplicial facets
    -    else if ZEROcentrum,
    -      tests vertices for neighboring simplicial   facets
    -    else
    -      tests centrums of neighboring facets
    -
    -  design:
    -    for all facets
    -      report flipped facets
    -      if ZEROcentrum and simplicial neighbors
    -        test vertices for neighboring simplicial facets
    -      else
    -        test centrum against all neighbors
    -*/
    -void qh_checkconvex(facetT *facetlist, int fault) {
    -  facetT *facet, *neighbor, **neighborp, *errfacet1=NULL, *errfacet2=NULL;
    -  vertexT *vertex;
    -  realT dist;
    -  pointT *centrum;
    -  boolT waserror= False, centrum_warning= False, tempcentrum= False, allsimplicial;
    -  int neighbor_i;
    -
    -  trace1((qh ferr, 1026, "qh_checkconvex: check all ridges are convex\n"));
    -  if (!qh RERUN) {
    -    zzval_(Zconcaveridges)= 0;
    -    zzval_(Zcoplanarridges)= 0;
    -  }
    -  FORALLfacet_(facetlist) {
    -    if (facet->flipped) {
    -      qh_precision("flipped facet");
    -      qh_fprintf(qh ferr, 6113, "qhull precision error: f%d is flipped(interior point is outside)\n",
    -               facet->id);
    -      errfacet1= facet;
    -      waserror= True;
    -      continue;
    -    }
    -    if (qh MERGING && (!qh ZEROcentrum || !facet->simplicial || facet->tricoplanar))
    -      allsimplicial= False;
    -    else {
    -      allsimplicial= True;
    -      neighbor_i= 0;
    -      FOREACHneighbor_(facet) {
    -        vertex= SETelemt_(facet->vertices, neighbor_i++, vertexT);
    -        if (!neighbor->simplicial || neighbor->tricoplanar) {
    -          allsimplicial= False;
    -          continue;
    -        }
    -        qh_distplane(vertex->point, neighbor, &dist);
    -        if (dist > -qh DISTround) {
    -          if (fault == qh_DATAfault) {
    -            qh_precision("coplanar or concave ridge");
    -            qh_fprintf(qh ferr, 6114, "qhull precision error: initial simplex is not convex. Distance=%.2g\n", dist);
    -            qh_errexit(qh_ERRsingular, NULL, NULL);
    -          }
    -          if (dist > qh DISTround) {
    -            zzinc_(Zconcaveridges);
    -            qh_precision("concave ridge");
    -            qh_fprintf(qh ferr, 6115, "qhull precision error: f%d is concave to f%d, since p%d(v%d) is %6.4g above\n",
    -              facet->id, neighbor->id, qh_pointid(vertex->point), vertex->id, dist);
    -            errfacet1= facet;
    -            errfacet2= neighbor;
    -            waserror= True;
    -          }else if (qh ZEROcentrum) {
    -            if (dist > 0) {     /* qh_checkzero checks that dist < - qh DISTround */
    -              zzinc_(Zcoplanarridges);
    -              qh_precision("coplanar ridge");
    -              qh_fprintf(qh ferr, 6116, "qhull precision error: f%d is clearly not convex to f%d, since p%d(v%d) is %6.4g above\n",
    -                facet->id, neighbor->id, qh_pointid(vertex->point), vertex->id, dist);
    -              errfacet1= facet;
    -              errfacet2= neighbor;
    -              waserror= True;
    -            }
    -          }else {
    -            zzinc_(Zcoplanarridges);
    -            qh_precision("coplanar ridge");
    -            trace0((qh ferr, 22, "qhull precision error: f%d may be coplanar to f%d, since p%d(v%d) is within %6.4g during p%d\n",
    -              facet->id, neighbor->id, qh_pointid(vertex->point), vertex->id, dist, qh furthest_id));
    -          }
    -        }
    -      }
    -    }
    -    if (!allsimplicial) {
    -      if (qh CENTERtype == qh_AScentrum) {
    -        if (!facet->center)
    -          facet->center= qh_getcentrum(facet);
    -        centrum= facet->center;
    -      }else {
    -        if (!centrum_warning && (!facet->simplicial || facet->tricoplanar)) {
    -           centrum_warning= True;
    -           qh_fprintf(qh ferr, 7062, "qhull warning: recomputing centrums for convexity test.  This may lead to false, precision errors.\n");
    -        }
    -        centrum= qh_getcentrum(facet);
    -        tempcentrum= True;
    -      }
    -      FOREACHneighbor_(facet) {
    -        if (qh ZEROcentrum && facet->simplicial && neighbor->simplicial)
    -          continue;
    -        if (facet->tricoplanar || neighbor->tricoplanar)
    -          continue;
    -        zzinc_(Zdistconvex);
    -        qh_distplane(centrum, neighbor, &dist);
    -        if (dist > qh DISTround) {
    -          zzinc_(Zconcaveridges);
    -          qh_precision("concave ridge");
    -          qh_fprintf(qh ferr, 6117, "qhull precision error: f%d is concave to f%d.  Centrum of f%d is %6.4g above f%d\n",
    -            facet->id, neighbor->id, facet->id, dist, neighbor->id);
    -          errfacet1= facet;
    -          errfacet2= neighbor;
    -          waserror= True;
    -        }else if (dist >= 0.0) {   /* if arithmetic always rounds the same,
    -                                     can test against centrum radius instead */
    -          zzinc_(Zcoplanarridges);
    -          qh_precision("coplanar ridge");
    -          qh_fprintf(qh ferr, 6118, "qhull precision error: f%d is coplanar or concave to f%d.  Centrum of f%d is %6.4g above f%d\n",
    -            facet->id, neighbor->id, facet->id, dist, neighbor->id);
    -          errfacet1= facet;
    -          errfacet2= neighbor;
    -          waserror= True;
    -        }
    -      }
    -      if (tempcentrum)
    -        qh_memfree(centrum, qh normal_size);
    -    }
    -  }
    -  if (waserror && !qh FORCEoutput)
    -    qh_errexit2(qh_ERRprec, errfacet1, errfacet2);
    -} /* checkconvex */
    -
    -
    -/*---------------------------------
    -
    -  qh_checkfacet( facet, newmerge, waserror )
    -    checks for consistency errors in facet
    -    newmerge set if from merge.c
    -
    -  returns:
    -    sets waserror if any error occurs
    -
    -  checks:
    -    vertex ids are inverse sorted
    -    unless newmerge, at least hull_dim neighbors and vertices (exactly if simplicial)
    -    if non-simplicial, at least as many ridges as neighbors
    -    neighbors are not duplicated
    -    ridges are not duplicated
    -    in 3-d, ridges=verticies
    -    (qh.hull_dim-1) ridge vertices
    -    neighbors are reciprocated
    -    ridge neighbors are facet neighbors and a ridge for every neighbor
    -    simplicial neighbors match facetintersect
    -    vertex intersection matches vertices of common ridges
    -    vertex neighbors and facet vertices agree
    -    all ridges have distinct vertex sets
    -
    -  notes:
    -    uses neighbor->seen
    -
    -  design:
    -    check sets
    -    check vertices
    -    check sizes of neighbors and vertices
    -    check for qh_MERGEridge and qh_DUPLICATEridge flags
    -    check neighbor set
    -    check ridge set
    -    check ridges, neighbors, and vertices
    -*/
    -void qh_checkfacet(facetT *facet, boolT newmerge, boolT *waserrorp) {
    -  facetT *neighbor, **neighborp, *errother=NULL;
    -  ridgeT *ridge, **ridgep, *errridge= NULL, *ridge2;
    -  vertexT *vertex, **vertexp;
    -  unsigned previousid= INT_MAX;
    -  int numneighbors, numvertices, numridges=0, numRvertices=0;
    -  boolT waserror= False;
    -  int skipA, skipB, ridge_i, ridge_n, i;
    -  setT *intersection;
    -
    -  if (facet->visible) {
    -    qh_fprintf(qh ferr, 6119, "qhull internal error (qh_checkfacet): facet f%d is on the visible_list\n",
    -      facet->id);
    -    qh_errexit(qh_ERRqhull, facet, NULL);
    -  }
    -  if (!facet->normal) {
    -    qh_fprintf(qh ferr, 6120, "qhull internal error (qh_checkfacet): facet f%d does not have  a normal\n",
    -      facet->id);
    -    waserror= True;
    -  }
    -  qh_setcheck(facet->vertices, "vertices for f", facet->id);
    -  qh_setcheck(facet->ridges, "ridges for f", facet->id);
    -  qh_setcheck(facet->outsideset, "outsideset for f", facet->id);
    -  qh_setcheck(facet->coplanarset, "coplanarset for f", facet->id);
    -  qh_setcheck(facet->neighbors, "neighbors for f", facet->id);
    -  FOREACHvertex_(facet->vertices) {
    -    if (vertex->deleted) {
    -      qh_fprintf(qh ferr, 6121, "qhull internal error (qh_checkfacet): deleted vertex v%d in f%d\n", vertex->id, facet->id);
    -      qh_errprint("ERRONEOUS", NULL, NULL, NULL, vertex);
    -      waserror= True;
    -    }
    -    if (vertex->id >= previousid) {
    -      qh_fprintf(qh ferr, 6122, "qhull internal error (qh_checkfacet): vertices of f%d are not in descending id order at v%d\n", facet->id, vertex->id);
    -      waserror= True;
    -      break;
    -    }
    -    previousid= vertex->id;
    -  }
    -  numneighbors= qh_setsize(facet->neighbors);
    -  numvertices= qh_setsize(facet->vertices);
    -  numridges= qh_setsize(facet->ridges);
    -  if (facet->simplicial) {
    -    if (numvertices+numneighbors != 2*qh hull_dim
    -    && !facet->degenerate && !facet->redundant) {
    -      qh_fprintf(qh ferr, 6123, "qhull internal error (qh_checkfacet): for simplicial facet f%d, #vertices %d + #neighbors %d != 2*qh hull_dim\n",
    -                facet->id, numvertices, numneighbors);
    -      qh_setprint(qh ferr, "", facet->neighbors);
    -      waserror= True;
    -    }
    -  }else { /* non-simplicial */
    -    if (!newmerge
    -    &&(numvertices < qh hull_dim || numneighbors < qh hull_dim)
    -    && !facet->degenerate && !facet->redundant) {
    -      qh_fprintf(qh ferr, 6124, "qhull internal error (qh_checkfacet): for facet f%d, #vertices %d or #neighbors %d < qh hull_dim\n",
    -         facet->id, numvertices, numneighbors);
    -       waserror= True;
    -    }
    -    /* in 3-d, can get a vertex twice in an edge list, e.g., RBOX 1000 s W1e-13 t995849315 D2 | QHULL d Tc Tv TP624 TW1e-13 T4 */
    -    if (numridges < numneighbors
    -    ||(qh hull_dim == 3 && numvertices > numridges && !qh NEWfacets)
    -    ||(qh hull_dim == 2 && numridges + numvertices + numneighbors != 6)) {
    -      if (!facet->degenerate && !facet->redundant) {
    -        qh_fprintf(qh ferr, 6125, "qhull internal error (qh_checkfacet): for facet f%d, #ridges %d < #neighbors %d or(3-d) > #vertices %d or(2-d) not all 2\n",
    -            facet->id, numridges, numneighbors, numvertices);
    -        waserror= True;
    -      }
    -    }
    -  }
    -  FOREACHneighbor_(facet) {
    -    if (neighbor == qh_MERGEridge || neighbor == qh_DUPLICATEridge) {
    -      qh_fprintf(qh ferr, 6126, "qhull internal error (qh_checkfacet): facet f%d still has a MERGE or DUP neighbor\n", facet->id);
    -      qh_errexit(qh_ERRqhull, facet, NULL);
    -    }
    -    neighbor->seen= True;
    -  }
    -  FOREACHneighbor_(facet) {
    -    if (!qh_setin(neighbor->neighbors, facet)) {
    -      qh_fprintf(qh ferr, 6127, "qhull internal error (qh_checkfacet): facet f%d has neighbor f%d, but f%d does not have neighbor f%d\n",
    -              facet->id, neighbor->id, neighbor->id, facet->id);
    -      errother= neighbor;
    -      waserror= True;
    -    }
    -    if (!neighbor->seen) {
    -      qh_fprintf(qh ferr, 6128, "qhull internal error (qh_checkfacet): facet f%d has a duplicate neighbor f%d\n",
    -              facet->id, neighbor->id);
    -      errother= neighbor;
    -      waserror= True;
    -    }
    -    neighbor->seen= False;
    -  }
    -  FOREACHridge_(facet->ridges) {
    -    qh_setcheck(ridge->vertices, "vertices for r", ridge->id);
    -    ridge->seen= False;
    -  }
    -  FOREACHridge_(facet->ridges) {
    -    if (ridge->seen) {
    -      qh_fprintf(qh ferr, 6129, "qhull internal error (qh_checkfacet): facet f%d has a duplicate ridge r%d\n",
    -              facet->id, ridge->id);
    -      errridge= ridge;
    -      waserror= True;
    -    }
    -    ridge->seen= True;
    -    numRvertices= qh_setsize(ridge->vertices);
    -    if (numRvertices != qh hull_dim - 1) {
    -      qh_fprintf(qh ferr, 6130, "qhull internal error (qh_checkfacet): ridge between f%d and f%d has %d vertices\n",
    -                ridge->top->id, ridge->bottom->id, numRvertices);
    -      errridge= ridge;
    -      waserror= True;
    -    }
    -    neighbor= otherfacet_(ridge, facet);
    -    neighbor->seen= True;
    -    if (!qh_setin(facet->neighbors, neighbor)) {
    -      qh_fprintf(qh ferr, 6131, "qhull internal error (qh_checkfacet): for facet f%d, neighbor f%d of ridge r%d not in facet\n",
    -           facet->id, neighbor->id, ridge->id);
    -      errridge= ridge;
    -      waserror= True;
    -    }
    -  }
    -  if (!facet->simplicial) {
    -    FOREACHneighbor_(facet) {
    -      if (!neighbor->seen) {
    -        qh_fprintf(qh ferr, 6132, "qhull internal error (qh_checkfacet): facet f%d does not have a ridge for neighbor f%d\n",
    -              facet->id, neighbor->id);
    -        errother= neighbor;
    -        waserror= True;
    -      }
    -      intersection= qh_vertexintersect_new(facet->vertices, neighbor->vertices);
    -      qh_settemppush(intersection);
    -      FOREACHvertex_(facet->vertices) {
    -        vertex->seen= False;
    -        vertex->seen2= False;
    -      }
    -      FOREACHvertex_(intersection)
    -        vertex->seen= True;
    -      FOREACHridge_(facet->ridges) {
    -        if (neighbor != otherfacet_(ridge, facet))
    -            continue;
    -        FOREACHvertex_(ridge->vertices) {
    -          if (!vertex->seen) {
    -            qh_fprintf(qh ferr, 6133, "qhull internal error (qh_checkfacet): vertex v%d in r%d not in f%d intersect f%d\n",
    -                  vertex->id, ridge->id, facet->id, neighbor->id);
    -            qh_errexit(qh_ERRqhull, facet, ridge);
    -          }
    -          vertex->seen2= True;
    -        }
    -      }
    -      if (!newmerge) {
    -        FOREACHvertex_(intersection) {
    -          if (!vertex->seen2) {
    -            if (qh IStracing >=3 || !qh MERGING) {
    -              qh_fprintf(qh ferr, 6134, "qhull precision error (qh_checkfacet): vertex v%d in f%d intersect f%d but\n\
    - not in a ridge.  This is ok under merging.  Last point was p%d\n",
    -                     vertex->id, facet->id, neighbor->id, qh furthest_id);
    -              if (!qh FORCEoutput && !qh MERGING) {
    -                qh_errprint("ERRONEOUS", facet, neighbor, NULL, vertex);
    -                if (!qh MERGING)
    -                  qh_errexit(qh_ERRqhull, NULL, NULL);
    -              }
    -            }
    -          }
    -        }
    -      }
    -      qh_settempfree(&intersection);
    -    }
    -  }else { /* simplicial */
    -    FOREACHneighbor_(facet) {
    -      if (neighbor->simplicial) {
    -        skipA= SETindex_(facet->neighbors, neighbor);
    -        skipB= qh_setindex(neighbor->neighbors, facet);
    -        if (skipA<0 || skipB<0 || !qh_setequal_skip(facet->vertices, skipA, neighbor->vertices, skipB)) {
    -          qh_fprintf(qh ferr, 6135, "qhull internal error (qh_checkfacet): facet f%d skip %d and neighbor f%d skip %d do not match \n",
    -                   facet->id, skipA, neighbor->id, skipB);
    -          errother= neighbor;
    -          waserror= True;
    -        }
    -      }
    -    }
    -  }
    -  if (qh hull_dim < 5 && (qh IStracing > 2 || qh CHECKfrequently)) {
    -    FOREACHridge_i_(facet->ridges) {           /* expensive */
    -      for (i=ridge_i+1; i < ridge_n; i++) {
    -        ridge2= SETelemt_(facet->ridges, i, ridgeT);
    -        if (qh_setequal(ridge->vertices, ridge2->vertices)) {
    -          qh_fprintf(qh ferr, 6227, "Qhull internal error (qh_checkfacet): ridges r%d and r%d have the same vertices\n",
    -                  ridge->id, ridge2->id);
    -          errridge= ridge;
    -          waserror= True;
    -        }
    -      }
    -    }
    -  }
    -  if (waserror) {
    -    qh_errprint("ERRONEOUS", facet, errother, errridge, NULL);
    -    *waserrorp= True;
    -  }
    -} /* checkfacet */
    -
    -
    -/*---------------------------------
    -
    -  qh_checkflipped_all( facetlist )
    -    checks orientation of facets in list against interior point
    -*/
    -void qh_checkflipped_all(facetT *facetlist) {
    -  facetT *facet;
    -  boolT waserror= False;
    -  realT dist;
    -
    -  if (facetlist == qh facet_list)
    -    zzval_(Zflippedfacets)= 0;
    -  FORALLfacet_(facetlist) {
    -    if (facet->normal && !qh_checkflipped(facet, &dist, !qh_ALL)) {
    -      qh_fprintf(qh ferr, 6136, "qhull precision error: facet f%d is flipped, distance= %6.12g\n",
    -              facet->id, dist);
    -      if (!qh FORCEoutput) {
    -        qh_errprint("ERRONEOUS", facet, NULL, NULL, NULL);
    -        waserror= True;
    -      }
    -    }
    -  }
    -  if (waserror) {
    -    qh_fprintf(qh ferr, 8101, "\n\
    -A flipped facet occurs when its distance to the interior point is\n\
    -greater than %2.2g, the maximum roundoff error.\n", -qh DISTround);
    -    qh_errexit(qh_ERRprec, NULL, NULL);
    -  }
    -} /* checkflipped_all */
    -
    -/*---------------------------------
    -
    -  qh_checkpolygon( facetlist )
    -    checks the correctness of the structure
    -
    -  notes:
    -    call with either qh.facet_list or qh.newfacet_list
    -    checks num_facets and num_vertices if qh.facet_list
    -
    -  design:
    -    for each facet
    -      checks facet and outside set
    -    initializes vertexlist
    -    for each facet
    -      checks vertex set
    -    if checking all facets(qh.facetlist)
    -      check facet count
    -      if qh.VERTEXneighbors
    -        check vertex neighbors and count
    -      check vertex count
    -*/
    -void qh_checkpolygon(facetT *facetlist) {
    -  facetT *facet;
    -  vertexT *vertex, **vertexp, *vertexlist;
    -  int numfacets= 0, numvertices= 0, numridges= 0;
    -  int totvneighbors= 0, totvertices= 0;
    -  boolT waserror= False, nextseen= False, visibleseen= False;
    -
    -  trace1((qh ferr, 1027, "qh_checkpolygon: check all facets from f%d\n", facetlist->id));
    -  if (facetlist != qh facet_list || qh ONLYgood)
    -    nextseen= True;
    -  FORALLfacet_(facetlist) {
    -    if (facet == qh visible_list)
    -      visibleseen= True;
    -    if (!facet->visible) {
    -      if (!nextseen) {
    -        if (facet == qh facet_next)
    -          nextseen= True;
    -        else if (qh_setsize(facet->outsideset)) {
    -          if (!qh NARROWhull
    -#if !qh_COMPUTEfurthest
    -               || facet->furthestdist >= qh MINoutside
    -#endif
    -                        ) {
    -            qh_fprintf(qh ferr, 6137, "qhull internal error (qh_checkpolygon): f%d has outside points before qh facet_next\n",
    -                     facet->id);
    -            qh_errexit(qh_ERRqhull, facet, NULL);
    -          }
    -        }
    -      }
    -      numfacets++;
    -      qh_checkfacet(facet, False, &waserror);
    -    }
    -  }
    -  if (qh visible_list && !visibleseen && facetlist == qh facet_list) {
    -    qh_fprintf(qh ferr, 6138, "qhull internal error (qh_checkpolygon): visible list f%d no longer on facet list\n", qh visible_list->id);
    -    qh_printlists();
    -    qh_errexit(qh_ERRqhull, qh visible_list, NULL);
    -  }
    -  if (facetlist == qh facet_list)
    -    vertexlist= qh vertex_list;
    -  else if (facetlist == qh newfacet_list)
    -    vertexlist= qh newvertex_list;
    -  else
    -    vertexlist= NULL;
    -  FORALLvertex_(vertexlist) {
    -    vertex->seen= False;
    -    vertex->visitid= 0;
    -  }
    -  FORALLfacet_(facetlist) {
    -    if (facet->visible)
    -      continue;
    -    if (facet->simplicial)
    -      numridges += qh hull_dim;
    -    else
    -      numridges += qh_setsize(facet->ridges);
    -    FOREACHvertex_(facet->vertices) {
    -      vertex->visitid++;
    -      if (!vertex->seen) {
    -        vertex->seen= True;
    -        numvertices++;
    -        if (qh_pointid(vertex->point) == qh_IDunknown) {
    -          qh_fprintf(qh ferr, 6139, "qhull internal error (qh_checkpolygon): unknown point %p for vertex v%d first_point %p\n",
    -                   vertex->point, vertex->id, qh first_point);
    -          waserror= True;
    -        }
    -      }
    -    }
    -  }
    -  qh vertex_visit += (unsigned int)numfacets;
    -  if (facetlist == qh facet_list) {
    -    if (numfacets != qh num_facets - qh num_visible) {
    -      qh_fprintf(qh ferr, 6140, "qhull internal error (qh_checkpolygon): actual number of facets is %d, cumulative facet count is %d - %d visible facets\n",
    -              numfacets, qh num_facets, qh num_visible);
    -      waserror= True;
    -    }
    -    qh vertex_visit++;
    -    if (qh VERTEXneighbors) {
    -      FORALLvertices {
    -        qh_setcheck(vertex->neighbors, "neighbors for v", vertex->id);
    -        if (vertex->deleted)
    -          continue;
    -        totvneighbors += qh_setsize(vertex->neighbors);
    -      }
    -      FORALLfacet_(facetlist)
    -        totvertices += qh_setsize(facet->vertices);
    -      if (totvneighbors != totvertices) {
    -        qh_fprintf(qh ferr, 6141, "qhull internal error (qh_checkpolygon): vertex neighbors inconsistent.  Totvneighbors %d, totvertices %d\n",
    -                totvneighbors, totvertices);
    -        waserror= True;
    -      }
    -    }
    -    if (numvertices != qh num_vertices - qh_setsize(qh del_vertices)) {
    -      qh_fprintf(qh ferr, 6142, "qhull internal error (qh_checkpolygon): actual number of vertices is %d, cumulative vertex count is %d\n",
    -              numvertices, qh num_vertices - qh_setsize(qh del_vertices));
    -      waserror= True;
    -    }
    -    if (qh hull_dim == 2 && numvertices != numfacets) {
    -      qh_fprintf(qh ferr, 6143, "qhull internal error (qh_checkpolygon): #vertices %d != #facets %d\n",
    -        numvertices, numfacets);
    -      waserror= True;
    -    }
    -    if (qh hull_dim == 3 && numvertices + numfacets - numridges/2 != 2) {
    -      qh_fprintf(qh ferr, 7063, "qhull warning: #vertices %d + #facets %d - #edges %d != 2\n\
    -        A vertex appears twice in a edge list.  May occur during merging.",
    -        numvertices, numfacets, numridges/2);
    -      /* occurs if lots of merging and a vertex ends up twice in an edge list.  e.g., RBOX 1000 s W1e-13 t995849315 D2 | QHULL d Tc Tv */
    -    }
    -  }
    -  if (waserror)
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -} /* checkpolygon */
    -
    -
    -/*---------------------------------
    -
    -  qh_checkvertex( vertex )
    -    check vertex for consistency
    -    checks vertex->neighbors
    -
    -  notes:
    -    neighbors checked efficiently in checkpolygon
    -*/
    -void qh_checkvertex(vertexT *vertex) {
    -  boolT waserror= False;
    -  facetT *neighbor, **neighborp, *errfacet=NULL;
    -
    -  if (qh_pointid(vertex->point) == qh_IDunknown) {
    -    qh_fprintf(qh ferr, 6144, "qhull internal error (qh_checkvertex): unknown point id %p\n", vertex->point);
    -    waserror= True;
    -  }
    -  if (vertex->id >= qh vertex_id) {
    -    qh_fprintf(qh ferr, 6145, "qhull internal error (qh_checkvertex): unknown vertex id %d\n", vertex->id);
    -    waserror= True;
    -  }
    -  if (!waserror && !vertex->deleted) {
    -    if (qh_setsize(vertex->neighbors)) {
    -      FOREACHneighbor_(vertex) {
    -        if (!qh_setin(neighbor->vertices, vertex)) {
    -          qh_fprintf(qh ferr, 6146, "qhull internal error (qh_checkvertex): neighbor f%d does not contain v%d\n", neighbor->id, vertex->id);
    -          errfacet= neighbor;
    -          waserror= True;
    -        }
    -      }
    -    }
    -  }
    -  if (waserror) {
    -    qh_errprint("ERRONEOUS", NULL, NULL, NULL, vertex);
    -    qh_errexit(qh_ERRqhull, errfacet, NULL);
    -  }
    -} /* checkvertex */
    -
    -/*---------------------------------
    -
    -  qh_clearcenters( type )
    -    clear old data from facet->center
    -
    -  notes:
    -    sets new centertype
    -    nop if CENTERtype is the same
    -*/
    -void qh_clearcenters(qh_CENTER type) {
    -  facetT *facet;
    -
    -  if (qh CENTERtype != type) {
    -    FORALLfacets {
    -      if (facet->tricoplanar && !facet->keepcentrum)
    -          facet->center= NULL;  /* center is owned by the ->keepcentrum facet */
    -      else if (qh CENTERtype == qh_ASvoronoi){
    -        if (facet->center) {
    -          qh_memfree(facet->center, qh center_size);
    -          facet->center= NULL;
    -        }
    -      }else /* qh.CENTERtype == qh_AScentrum */ {
    -        if (facet->center) {
    -          qh_memfree(facet->center, qh normal_size);
    -          facet->center= NULL;
    -        }
    -      }
    -    }
    -    qh CENTERtype= type;
    -  }
    -  trace2((qh ferr, 2043, "qh_clearcenters: switched to center type %d\n", type));
    -} /* clearcenters */
    -
    -/*---------------------------------
    -
    -  qh_createsimplex( vertices )
    -    creates a simplex from a set of vertices
    -
    -  returns:
    -    initializes qh.facet_list to the simplex
    -    initializes qh.newfacet_list, .facet_tail
    -    initializes qh.vertex_list, .newvertex_list, .vertex_tail
    -
    -  design:
    -    initializes lists
    -    for each vertex
    -      create a new facet
    -    for each new facet
    -      create its neighbor set
    -*/
    -void qh_createsimplex(setT *vertices) {
    -  facetT *facet= NULL, *newfacet;
    -  boolT toporient= True;
    -  int vertex_i, vertex_n, nth;
    -  setT *newfacets= qh_settemp(qh hull_dim+1);
    -  vertexT *vertex;
    -
    -  qh facet_list= qh newfacet_list= qh facet_tail= qh_newfacet();
    -  qh num_facets= qh num_vertices= qh num_visible= 0;
    -  qh vertex_list= qh newvertex_list= qh vertex_tail= qh_newvertex(NULL);
    -  FOREACHvertex_i_(vertices) {
    -    newfacet= qh_newfacet();
    -    newfacet->vertices= qh_setnew_delnthsorted(vertices, vertex_n,
    -                                                vertex_i, 0);
    -    newfacet->toporient= (unsigned char)toporient;
    -    qh_appendfacet(newfacet);
    -    newfacet->newfacet= True;
    -    qh_appendvertex(vertex);
    -    qh_setappend(&newfacets, newfacet);
    -    toporient ^= True;
    -  }
    -  FORALLnew_facets {
    -    nth= 0;
    -    FORALLfacet_(qh newfacet_list) {
    -      if (facet != newfacet)
    -        SETelem_(newfacet->neighbors, nth++)= facet;
    -    }
    -    qh_settruncate(newfacet->neighbors, qh hull_dim);
    -  }
    -  qh_settempfree(&newfacets);
    -  trace1((qh ferr, 1028, "qh_createsimplex: created simplex\n"));
    -} /* createsimplex */
    -
    -/*---------------------------------
    -
    -  qh_delridge( ridge )
    -    deletes ridge from data structures it belongs to
    -    frees up its memory
    -
    -  notes:
    -    in merge.c, caller sets vertex->delridge for each vertex
    -    ridges also freed in qh_freeqhull
    -*/
    -void qh_delridge(ridgeT *ridge) {
    -  void **freelistp; /* used if !qh_NOmem by qh_memfree_() */
    -
    -  qh_setdel(ridge->top->ridges, ridge);
    -  qh_setdel(ridge->bottom->ridges, ridge);
    -  qh_setfree(&(ridge->vertices));
    -  qh_memfree_(ridge, (int)sizeof(ridgeT), freelistp);
    -} /* delridge */
    -
    -
    -/*---------------------------------
    -
    -  qh_delvertex( vertex )
    -    deletes a vertex and frees its memory
    -
    -  notes:
    -    assumes vertex->adjacencies have been updated if needed
    -    unlinks from vertex_list
    -*/
    -void qh_delvertex(vertexT *vertex) {
    -
    -  if (vertex == qh tracevertex)
    -    qh tracevertex= NULL;
    -  qh_removevertex(vertex);
    -  qh_setfree(&vertex->neighbors);
    -  qh_memfree(vertex, (int)sizeof(vertexT));
    -} /* delvertex */
    -
    -
    -/*---------------------------------
    -
    -  qh_facet3vertex(  )
    -    return temporary set of 3-d vertices in qh_ORIENTclock order
    -
    -  design:
    -    if simplicial facet
    -      build set from facet->vertices with facet->toporient
    -    else
    -      for each ridge in order
    -        build set from ridge's vertices
    -*/
    -setT *qh_facet3vertex(facetT *facet) {
    -  ridgeT *ridge, *firstridge;
    -  vertexT *vertex;
    -  int cntvertices, cntprojected=0;
    -  setT *vertices;
    -
    -  cntvertices= qh_setsize(facet->vertices);
    -  vertices= qh_settemp(cntvertices);
    -  if (facet->simplicial) {
    -    if (cntvertices != 3) {
    -      qh_fprintf(qh ferr, 6147, "qhull internal error (qh_facet3vertex): only %d vertices for simplicial facet f%d\n",
    -                  cntvertices, facet->id);
    -      qh_errexit(qh_ERRqhull, facet, NULL);
    -    }
    -    qh_setappend(&vertices, SETfirst_(facet->vertices));
    -    if (facet->toporient ^ qh_ORIENTclock)
    -      qh_setappend(&vertices, SETsecond_(facet->vertices));
    -    else
    -      qh_setaddnth(&vertices, 0, SETsecond_(facet->vertices));
    -    qh_setappend(&vertices, SETelem_(facet->vertices, 2));
    -  }else {
    -    ridge= firstridge= SETfirstt_(facet->ridges, ridgeT);   /* no infinite */
    -    while ((ridge= qh_nextridge3d(ridge, facet, &vertex))) {
    -      qh_setappend(&vertices, vertex);
    -      if (++cntprojected > cntvertices || ridge == firstridge)
    -        break;
    -    }
    -    if (!ridge || cntprojected != cntvertices) {
    -      qh_fprintf(qh ferr, 6148, "qhull internal error (qh_facet3vertex): ridges for facet %d don't match up.  got at least %d\n",
    -                  facet->id, cntprojected);
    -      qh_errexit(qh_ERRqhull, facet, ridge);
    -    }
    -  }
    -  return vertices;
    -} /* facet3vertex */
    -
    -/*---------------------------------
    -
    -  qh_findbestfacet( point, bestoutside, bestdist, isoutside )
    -    find facet that is furthest below a point
    -
    -    for Delaunay triangulations,
    -      Use qh_setdelaunay() to lift point to paraboloid and scale by 'Qbb' if needed
    -      Do not use options 'Qbk', 'QBk', or 'QbB' since they scale the coordinates.
    -
    -  returns:
    -    if bestoutside is set (e.g., qh_ALL)
    -      returns best facet that is not upperdelaunay
    -      if Delaunay and inside, point is outside circumsphere of bestfacet
    -    else
    -      returns first facet below point
    -      if point is inside, returns nearest, !upperdelaunay facet
    -    distance to facet
    -    isoutside set if outside of facet
    -
    -  notes:
    -    For tricoplanar facets, this finds one of the tricoplanar facets closest
    -    to the point.  For Delaunay triangulations, the point may be inside a
    -    different tricoplanar facet. See locate a facet with qh_findbestfacet()
    -
    -    If inside, qh_findbestfacet performs an exhaustive search
    -       this may be too conservative.  Sometimes it is clearly required.
    -
    -    qh_findbestfacet is not used by qhull.
    -    uses qh.visit_id and qh.coplanarset
    -
    -  see:
    -    qh_findbest
    -*/
    -facetT *qh_findbestfacet(pointT *point, boolT bestoutside,
    -           realT *bestdist, boolT *isoutside) {
    -  facetT *bestfacet= NULL;
    -  int numpart, totpart= 0;
    -
    -  bestfacet= qh_findbest(point, qh facet_list,
    -                            bestoutside, !qh_ISnewfacets, bestoutside /* qh_NOupper */,
    -                            bestdist, isoutside, &totpart);
    -  if (*bestdist < -qh DISTround) {
    -    bestfacet= qh_findfacet_all(point, bestdist, isoutside, &numpart);
    -    totpart += numpart;
    -    if ((isoutside && *isoutside && bestoutside)
    -    || (isoutside && !*isoutside && bestfacet->upperdelaunay)) {
    -      bestfacet= qh_findbest(point, bestfacet,
    -                            bestoutside, False, bestoutside,
    -                            bestdist, isoutside, &totpart);
    -      totpart += numpart;
    -    }
    -  }
    -  trace3((qh ferr, 3014, "qh_findbestfacet: f%d dist %2.2g isoutside %d totpart %d\n",
    -      bestfacet->id, *bestdist, (isoutside ? *isoutside : UINT_MAX), totpart));
    -  return bestfacet;
    -} /* findbestfacet */
    -
    -/*---------------------------------
    -
    -  qh_findbestlower( facet, point, bestdist, numpart )
    -    returns best non-upper, non-flipped neighbor of facet for point
    -    if needed, searches vertex neighbors
    -
    -  returns:
    -    returns bestdist and updates numpart
    -
    -  notes:
    -    if Delaunay and inside, point is outside of circumsphere of bestfacet
    -    called by qh_findbest() for points above an upperdelaunay facet
    -
    -*/
    -facetT *qh_findbestlower(facetT *upperfacet, pointT *point, realT *bestdistp, int *numpart) {
    -  facetT *neighbor, **neighborp, *bestfacet= NULL;
    -  realT bestdist= -REALmax/2 /* avoid underflow */;
    -  realT dist;
    -  vertexT *vertex;
    -  boolT isoutside= False;  /* not used */
    -
    -  zinc_(Zbestlower);
    -  FOREACHneighbor_(upperfacet) {
    -    if (neighbor->upperdelaunay || neighbor->flipped)
    -      continue;
    -    (*numpart)++;
    -    qh_distplane(point, neighbor, &dist);
    -    if (dist > bestdist) {
    -      bestfacet= neighbor;
    -      bestdist= dist;
    -    }
    -  }
    -  if (!bestfacet) {
    -    zinc_(Zbestlowerv);
    -    /* rarely called, numpart does not count nearvertex computations */
    -    vertex= qh_nearvertex(upperfacet, point, &dist);
    -    qh_vertexneighbors();
    -    FOREACHneighbor_(vertex) {
    -      if (neighbor->upperdelaunay || neighbor->flipped)
    -        continue;
    -      (*numpart)++;
    -      qh_distplane(point, neighbor, &dist);
    -      if (dist > bestdist) {
    -        bestfacet= neighbor;
    -        bestdist= dist;
    -      }
    -    }
    -  }
    -  if (!bestfacet) {
    -    zinc_(Zbestlowerall);  /* invoked once per point in outsideset */
    -    zmax_(Zbestloweralln, qh num_facets);
    -    /* [dec'15] Previously reported as QH6228 */
    -    trace3((qh ferr, 3025, "qh_findbestlower: all neighbors of facet %d are flipped or upper Delaunay.  Search all facets\n",
    -        upperfacet->id));
    -    /* rarely called */
    -    bestfacet= qh_findfacet_all(point, &bestdist, &isoutside, numpart);
    -  }
    -  *bestdistp= bestdist;
    -  trace3((qh ferr, 3015, "qh_findbestlower: f%d dist %2.2g for f%d p%d\n",
    -          bestfacet->id, bestdist, upperfacet->id, qh_pointid(point)));
    -  return bestfacet;
    -} /* findbestlower */
    -
    -/*---------------------------------
    -
    -  qh_findfacet_all( point, bestdist, isoutside, numpart )
    -    exhaustive search for facet below a point
    -
    -    for Delaunay triangulations,
    -      Use qh_setdelaunay() to lift point to paraboloid and scale by 'Qbb' if needed
    -      Do not use options 'Qbk', 'QBk', or 'QbB' since they scale the coordinates.
    -
    -  returns:
    -    returns first facet below point
    -    if point is inside,
    -      returns nearest facet
    -    distance to facet
    -    isoutside if point is outside of the hull
    -    number of distance tests
    -
    -  notes:
    -    primarily for library users, rarely used by Qhull
    -*/
    -facetT *qh_findfacet_all(pointT *point, realT *bestdist, boolT *isoutside,
    -                          int *numpart) {
    -  facetT *bestfacet= NULL, *facet;
    -  realT dist;
    -  int totpart= 0;
    -
    -  *bestdist= -REALmax;
    -  *isoutside= False;
    -  FORALLfacets {
    -    if (facet->flipped || !facet->normal)
    -      continue;
    -    totpart++;
    -    qh_distplane(point, facet, &dist);
    -    if (dist > *bestdist) {
    -      *bestdist= dist;
    -      bestfacet= facet;
    -      if (dist > qh MINoutside) {
    -        *isoutside= True;
    -        break;
    -      }
    -    }
    -  }
    -  *numpart= totpart;
    -  trace3((qh ferr, 3016, "qh_findfacet_all: f%d dist %2.2g isoutside %d totpart %d\n",
    -          getid_(bestfacet), *bestdist, *isoutside, totpart));
    -  return bestfacet;
    -} /* findfacet_all */
    -
    -/*---------------------------------
    -
    -  qh_findgood( facetlist, goodhorizon )
    -    identify good facets for qh.PRINTgood
    -    if qh.GOODvertex>0
    -      facet includes point as vertex
    -      if !match, returns goodhorizon
    -      inactive if qh.MERGING
    -    if qh.GOODpoint
    -      facet is visible or coplanar (>0) or not visible (<0)
    -    if qh.GOODthreshold
    -      facet->normal matches threshold
    -    if !goodhorizon and !match,
    -      selects facet with closest angle
    -      sets GOODclosest
    -
    -  returns:
    -    number of new, good facets found
    -    determines facet->good
    -    may update qh.GOODclosest
    -
    -  notes:
    -    qh_findgood_all further reduces the good region
    -
    -  design:
    -    count good facets
    -    mark good facets for qh.GOODpoint
    -    mark good facets for qh.GOODthreshold
    -    if necessary
    -      update qh.GOODclosest
    -*/
    -int qh_findgood(facetT *facetlist, int goodhorizon) {
    -  facetT *facet, *bestfacet= NULL;
    -  realT angle, bestangle= REALmax, dist;
    -  int  numgood=0;
    -
    -  FORALLfacet_(facetlist) {
    -    if (facet->good)
    -      numgood++;
    -  }
    -  if (qh GOODvertex>0 && !qh MERGING) {
    -    FORALLfacet_(facetlist) {
    -      if (!qh_isvertex(qh GOODvertexp, facet->vertices)) {
    -        facet->good= False;
    -        numgood--;
    -      }
    -    }
    -  }
    -  if (qh GOODpoint && numgood) {
    -    FORALLfacet_(facetlist) {
    -      if (facet->good && facet->normal) {
    -        zinc_(Zdistgood);
    -        qh_distplane(qh GOODpointp, facet, &dist);
    -        if ((qh GOODpoint > 0) ^ (dist > 0.0)) {
    -          facet->good= False;
    -          numgood--;
    -        }
    -      }
    -    }
    -  }
    -  if (qh GOODthreshold && (numgood || goodhorizon || qh GOODclosest)) {
    -    FORALLfacet_(facetlist) {
    -      if (facet->good && facet->normal) {
    -        if (!qh_inthresholds(facet->normal, &angle)) {
    -          facet->good= False;
    -          numgood--;
    -          if (angle < bestangle) {
    -            bestangle= angle;
    -            bestfacet= facet;
    -          }
    -        }
    -      }
    -    }
    -    if (!numgood && (!goodhorizon || qh GOODclosest)) {
    -      if (qh GOODclosest) {
    -        if (qh GOODclosest->visible)
    -          qh GOODclosest= NULL;
    -        else {
    -          qh_inthresholds(qh GOODclosest->normal, &angle);
    -          if (angle < bestangle)
    -            bestfacet= qh GOODclosest;
    -        }
    -      }
    -      if (bestfacet && bestfacet != qh GOODclosest) {
    -        if (qh GOODclosest)
    -          qh GOODclosest->good= False;
    -        qh GOODclosest= bestfacet;
    -        bestfacet->good= True;
    -        numgood++;
    -        trace2((qh ferr, 2044, "qh_findgood: f%d is closest(%2.2g) to thresholds\n",
    -           bestfacet->id, bestangle));
    -        return numgood;
    -      }
    -    }else if (qh GOODclosest) { /* numgood > 0 */
    -      qh GOODclosest->good= False;
    -      qh GOODclosest= NULL;
    -    }
    -  }
    -  zadd_(Zgoodfacet, numgood);
    -  trace2((qh ferr, 2045, "qh_findgood: found %d good facets with %d good horizon\n",
    -               numgood, goodhorizon));
    -  if (!numgood && qh GOODvertex>0 && !qh MERGING)
    -    return goodhorizon;
    -  return numgood;
    -} /* findgood */
    -
    -/*---------------------------------
    -
    -  qh_findgood_all( facetlist )
    -    apply other constraints for good facets (used by qh.PRINTgood)
    -    if qh.GOODvertex
    -      facet includes (>0) or doesn't include (<0) point as vertex
    -      if last good facet and ONLYgood, prints warning and continues
    -    if qh.SPLITthresholds
    -      facet->normal matches threshold, or if none, the closest one
    -    calls qh_findgood
    -    nop if good not used
    -
    -  returns:
    -    clears facet->good if not good
    -    sets qh.num_good
    -
    -  notes:
    -    this is like qh_findgood but more restrictive
    -
    -  design:
    -    uses qh_findgood to mark good facets
    -    marks facets for qh.GOODvertex
    -    marks facets for qh.SPLITthreholds
    -*/
    -void qh_findgood_all(facetT *facetlist) {
    -  facetT *facet, *bestfacet=NULL;
    -  realT angle, bestangle= REALmax;
    -  int  numgood=0, startgood;
    -
    -  if (!qh GOODvertex && !qh GOODthreshold && !qh GOODpoint
    -  && !qh SPLITthresholds)
    -    return;
    -  if (!qh ONLYgood)
    -    qh_findgood(qh facet_list, 0);
    -  FORALLfacet_(facetlist) {
    -    if (facet->good)
    -      numgood++;
    -  }
    -  if (qh GOODvertex <0 || (qh GOODvertex > 0 && qh MERGING)) {
    -    FORALLfacet_(facetlist) {
    -      if (facet->good && ((qh GOODvertex > 0) ^ !!qh_isvertex(qh GOODvertexp, facet->vertices))) {
    -        if (!--numgood) {
    -          if (qh ONLYgood) {
    -            qh_fprintf(qh ferr, 7064, "qhull warning: good vertex p%d does not match last good facet f%d.  Ignored.\n",
    -               qh_pointid(qh GOODvertexp), facet->id);
    -            return;
    -          }else if (qh GOODvertex > 0)
    -            qh_fprintf(qh ferr, 7065, "qhull warning: point p%d is not a vertex('QV%d').\n",
    -                qh GOODvertex-1, qh GOODvertex-1);
    -          else
    -            qh_fprintf(qh ferr, 7066, "qhull warning: point p%d is a vertex for every facet('QV-%d').\n",
    -                -qh GOODvertex - 1, -qh GOODvertex - 1);
    -        }
    -        facet->good= False;
    -      }
    -    }
    -  }
    -  startgood= numgood;
    -  if (qh SPLITthresholds) {
    -    FORALLfacet_(facetlist) {
    -      if (facet->good) {
    -        if (!qh_inthresholds(facet->normal, &angle)) {
    -          facet->good= False;
    -          numgood--;
    -          if (angle < bestangle) {
    -            bestangle= angle;
    -            bestfacet= facet;
    -          }
    -        }
    -      }
    -    }
    -    if (!numgood && bestfacet) {
    -      bestfacet->good= True;
    -      numgood++;
    -      trace0((qh ferr, 23, "qh_findgood_all: f%d is closest(%2.2g) to thresholds\n",
    -           bestfacet->id, bestangle));
    -      return;
    -    }
    -  }
    -  qh num_good= numgood;
    -  trace0((qh ferr, 24, "qh_findgood_all: %d good facets remain out of %d facets\n",
    -        numgood, startgood));
    -} /* findgood_all */
    -
    -/*---------------------------------
    -
    -  qh_furthestnext()
    -    set qh.facet_next to facet with furthest of all furthest points
    -    searches all facets on qh.facet_list
    -
    -  notes:
    -    this may help avoid precision problems
    -*/
    -void qh_furthestnext(void /* qh.facet_list */) {
    -  facetT *facet, *bestfacet= NULL;
    -  realT dist, bestdist= -REALmax;
    -
    -  FORALLfacets {
    -    if (facet->outsideset) {
    -#if qh_COMPUTEfurthest
    -      pointT *furthest;
    -      furthest= (pointT*)qh_setlast(facet->outsideset);
    -      zinc_(Zcomputefurthest);
    -      qh_distplane(furthest, facet, &dist);
    -#else
    -      dist= facet->furthestdist;
    -#endif
    -      if (dist > bestdist) {
    -        bestfacet= facet;
    -        bestdist= dist;
    -      }
    -    }
    -  }
    -  if (bestfacet) {
    -    qh_removefacet(bestfacet);
    -    qh_prependfacet(bestfacet, &qh facet_next);
    -    trace1((qh ferr, 1029, "qh_furthestnext: made f%d next facet(dist %.2g)\n",
    -            bestfacet->id, bestdist));
    -  }
    -} /* furthestnext */
    -
    -/*---------------------------------
    -
    -  qh_furthestout( facet )
    -    make furthest outside point the last point of outsideset
    -
    -  returns:
    -    updates facet->outsideset
    -    clears facet->notfurthest
    -    sets facet->furthestdist
    -
    -  design:
    -    determine best point of outsideset
    -    make it the last point of outsideset
    -*/
    -void qh_furthestout(facetT *facet) {
    -  pointT *point, **pointp, *bestpoint= NULL;
    -  realT dist, bestdist= -REALmax;
    -
    -  FOREACHpoint_(facet->outsideset) {
    -    qh_distplane(point, facet, &dist);
    -    zinc_(Zcomputefurthest);
    -    if (dist > bestdist) {
    -      bestpoint= point;
    -      bestdist= dist;
    -    }
    -  }
    -  if (bestpoint) {
    -    qh_setdel(facet->outsideset, point);
    -    qh_setappend(&facet->outsideset, point);
    -#if !qh_COMPUTEfurthest
    -    facet->furthestdist= bestdist;
    -#endif
    -  }
    -  facet->notfurthest= False;
    -  trace3((qh ferr, 3017, "qh_furthestout: p%d is furthest outside point of f%d\n",
    -          qh_pointid(point), facet->id));
    -} /* furthestout */
    -
    -
    -/*---------------------------------
    -
    -  qh_infiniteloop( facet )
    -    report infinite loop error due to facet
    -*/
    -void qh_infiniteloop(facetT *facet) {
    -
    -  qh_fprintf(qh ferr, 6149, "qhull internal error (qh_infiniteloop): potential infinite loop detected\n");
    -  qh_errexit(qh_ERRqhull, facet, NULL);
    -} /* qh_infiniteloop */
    -
    -/*---------------------------------
    -
    -  qh_initbuild()
    -    initialize hull and outside sets with point array
    -    qh.FIRSTpoint/qh.NUMpoints is point array
    -    if qh.GOODpoint
    -      adds qh.GOODpoint to initial hull
    -
    -  returns:
    -    qh_facetlist with initial hull
    -    points partioned into outside sets, coplanar sets, or inside
    -    initializes qh.GOODpointp, qh.GOODvertexp,
    -
    -  design:
    -    initialize global variables used during qh_buildhull
    -    determine precision constants and points with max/min coordinate values
    -      if qh.SCALElast, scale last coordinate(for 'd')
    -    build initial simplex
    -    partition input points into facets of initial simplex
    -    set up lists
    -    if qh.ONLYgood
    -      check consistency
    -      add qh.GOODvertex if defined
    -*/
    -void qh_initbuild( void) {
    -  setT *maxpoints, *vertices;
    -  facetT *facet;
    -  int i, numpart;
    -  realT dist;
    -  boolT isoutside;
    -
    -  qh furthest_id= qh_IDunknown;
    -  qh lastreport= 0;
    -  qh facet_id= qh vertex_id= qh ridge_id= 0;
    -  qh visit_id= qh vertex_visit= 0;
    -  qh maxoutdone= False;
    -
    -  if (qh GOODpoint > 0)
    -    qh GOODpointp= qh_point(qh GOODpoint-1);
    -  else if (qh GOODpoint < 0)
    -    qh GOODpointp= qh_point(-qh GOODpoint-1);
    -  if (qh GOODvertex > 0)
    -    qh GOODvertexp= qh_point(qh GOODvertex-1);
    -  else if (qh GOODvertex < 0)
    -    qh GOODvertexp= qh_point(-qh GOODvertex-1);
    -  if ((qh GOODpoint
    -       && (qh GOODpointp < qh first_point  /* also catches !GOODpointp */
    -           || qh GOODpointp > qh_point(qh num_points-1)))
    -    || (qh GOODvertex
    -        && (qh GOODvertexp < qh first_point  /* also catches !GOODvertexp */
    -            || qh GOODvertexp > qh_point(qh num_points-1)))) {
    -    qh_fprintf(qh ferr, 6150, "qhull input error: either QGn or QVn point is > p%d\n",
    -             qh num_points-1);
    -    qh_errexit(qh_ERRinput, NULL, NULL);
    -  }
    -  maxpoints= qh_maxmin(qh first_point, qh num_points, qh hull_dim);
    -  if (qh SCALElast)
    -    qh_scalelast(qh first_point, qh num_points, qh hull_dim,
    -               qh MINlastcoord, qh MAXlastcoord, qh MAXwidth);
    -  qh_detroundoff();
    -  if (qh DELAUNAY && qh upper_threshold[qh hull_dim-1] > REALmax/2
    -                  && qh lower_threshold[qh hull_dim-1] < -REALmax/2) {
    -    for (i=qh_PRINTEND; i--; ) {
    -      if (qh PRINTout[i] == qh_PRINTgeom && qh DROPdim < 0
    -          && !qh GOODthreshold && !qh SPLITthresholds)
    -        break;  /* in this case, don't set upper_threshold */
    -    }
    -    if (i < 0) {
    -      if (qh UPPERdelaunay) { /* matches qh.upperdelaunay in qh_setfacetplane */
    -        qh lower_threshold[qh hull_dim-1]= qh ANGLEround * qh_ZEROdelaunay;
    -        qh GOODthreshold= True;
    -      }else {
    -        qh upper_threshold[qh hull_dim-1]= -qh ANGLEround * qh_ZEROdelaunay;
    -        if (!qh GOODthreshold)
    -          qh SPLITthresholds= True; /* build upper-convex hull even if Qg */
    -          /* qh_initqhull_globals errors if Qg without Pdk/etc. */
    -      }
    -    }
    -  }
    -  vertices= qh_initialvertices(qh hull_dim, maxpoints, qh first_point, qh num_points);
    -  qh_initialhull(vertices);  /* initial qh facet_list */
    -  qh_partitionall(vertices, qh first_point, qh num_points);
    -  if (qh PRINToptions1st || qh TRACElevel || qh IStracing) {
    -    if (qh TRACElevel || qh IStracing)
    -      qh_fprintf(qh ferr, 8103, "\nTrace level %d for %s | %s\n",
    -         qh IStracing ? qh IStracing : qh TRACElevel, qh rbox_command, qh qhull_command);
    -    qh_fprintf(qh ferr, 8104, "Options selected for Qhull %s:\n%s\n", qh_version, qh qhull_options);
    -  }
    -  qh_resetlists(False, qh_RESETvisible /*qh.visible_list newvertex_list newfacet_list */);
    -  qh facet_next= qh facet_list;
    -  qh_furthestnext(/* qh.facet_list */);
    -  if (qh PREmerge) {
    -    qh cos_max= qh premerge_cos;
    -    qh centrum_radius= qh premerge_centrum;
    -  }
    -  if (qh ONLYgood) {
    -    if (qh GOODvertex > 0 && qh MERGING) {
    -      qh_fprintf(qh ferr, 6151, "qhull input error: 'Qg QVn' (only good vertex) does not work with merging.\nUse 'QJ' to joggle the input or 'Q0' to turn off merging.\n");
    -      qh_errexit(qh_ERRinput, NULL, NULL);
    -    }
    -    if (!(qh GOODthreshold || qh GOODpoint
    -         || (!qh MERGEexact && !qh PREmerge && qh GOODvertexp))) {
    -      qh_fprintf(qh ferr, 6152, "qhull input error: 'Qg' (ONLYgood) needs a good threshold('Pd0D0'), a\n\
    -good point(QGn or QG-n), or a good vertex with 'QJ' or 'Q0' (QVn).\n");
    -      qh_errexit(qh_ERRinput, NULL, NULL);
    -    }
    -    if (qh GOODvertex > 0  && !qh MERGING  /* matches qh_partitionall */
    -        && !qh_isvertex(qh GOODvertexp, vertices)) {
    -      facet= qh_findbestnew(qh GOODvertexp, qh facet_list,
    -                          &dist, !qh_ALL, &isoutside, &numpart);
    -      zadd_(Zdistgood, numpart);
    -      if (!isoutside) {
    -        qh_fprintf(qh ferr, 6153, "qhull input error: point for QV%d is inside initial simplex.  It can not be made a vertex.\n",
    -               qh_pointid(qh GOODvertexp));
    -        qh_errexit(qh_ERRinput, NULL, NULL);
    -      }
    -      if (!qh_addpoint(qh GOODvertexp, facet, False)) {
    -        qh_settempfree(&vertices);
    -        qh_settempfree(&maxpoints);
    -        return;
    -      }
    -    }
    -    qh_findgood(qh facet_list, 0);
    -  }
    -  qh_settempfree(&vertices);
    -  qh_settempfree(&maxpoints);
    -  trace1((qh ferr, 1030, "qh_initbuild: initial hull created and points partitioned\n"));
    -} /* initbuild */
    -
    -/*---------------------------------
    -
    -  qh_initialhull( vertices )
    -    constructs the initial hull as a DIM3 simplex of vertices
    -
    -  design:
    -    creates a simplex (initializes lists)
    -    determines orientation of simplex
    -    sets hyperplanes for facets
    -    doubles checks orientation (in case of axis-parallel facets with Gaussian elimination)
    -    checks for flipped facets and qh.NARROWhull
    -    checks the result
    -*/
    -void qh_initialhull(setT *vertices) {
    -  facetT *facet, *firstfacet, *neighbor, **neighborp;
    -  realT dist, angle, minangle= REALmax;
    -#ifndef qh_NOtrace
    -  int k;
    -#endif
    -
    -  qh_createsimplex(vertices);  /* qh.facet_list */
    -  qh_resetlists(False, qh_RESETvisible);
    -  qh facet_next= qh facet_list;      /* advance facet when processed */
    -  qh interior_point= qh_getcenter(vertices);
    -  firstfacet= qh facet_list;
    -  qh_setfacetplane(firstfacet);
    -  zinc_(Znumvisibility); /* needs to be in printsummary */
    -  qh_distplane(qh interior_point, firstfacet, &dist);
    -  if (dist > 0) {
    -    FORALLfacets
    -      facet->toporient ^= (unsigned char)True;
    -  }
    -  FORALLfacets
    -    qh_setfacetplane(facet);
    -  FORALLfacets {
    -    if (!qh_checkflipped(facet, NULL, qh_ALL)) {/* due to axis-parallel facet */
    -      trace1((qh ferr, 1031, "qh_initialhull: initial orientation incorrect.  Correct all facets\n"));
    -      facet->flipped= False;
    -      FORALLfacets {
    -        facet->toporient ^= (unsigned char)True;
    -        qh_orientoutside(facet);
    -      }
    -      break;
    -    }
    -  }
    -  FORALLfacets {
    -    if (!qh_checkflipped(facet, NULL, !qh_ALL)) {  /* can happen with 'R0.1' */
    -      if (qh DELAUNAY && ! qh ATinfinity) {
    -        if (qh UPPERdelaunay)
    -          qh_fprintf(qh ferr, 6240, "Qhull precision error: Initial simplex is cocircular or cospherical.  Option 'Qs' searches all points.  Can not compute the upper Delaunay triangulation or upper Voronoi diagram of cocircular/cospherical points.\n");
    -        else
    -          qh_fprintf(qh ferr, 6239, "Qhull precision error: Initial simplex is cocircular or cospherical.  Use option 'Qz' for the Delaunay triangulation or Voronoi diagram of cocircular/cospherical points.  Option 'Qz' adds a point \"at infinity\".    Use option 'Qs' to search all points for the initial simplex.\n");
    -        qh_errexit(qh_ERRinput, NULL, NULL);
    -      }
    -      qh_precision("initial simplex is flat");
    -      qh_fprintf(qh ferr, 6154, "Qhull precision error: Initial simplex is flat (facet %d is coplanar with the interior point)\n",
    -                 facet->id);
    -      qh_errexit(qh_ERRsingular, NULL, NULL);  /* calls qh_printhelp_singular */
    -    }
    -    FOREACHneighbor_(facet) {
    -      angle= qh_getangle(facet->normal, neighbor->normal);
    -      minimize_( minangle, angle);
    -    }
    -  }
    -  if (minangle < qh_MAXnarrow && !qh NOnarrow) {
    -    realT diff= 1.0 + minangle;
    -
    -    qh NARROWhull= True;
    -    qh_option("_narrow-hull", NULL, &diff);
    -    if (minangle < qh_WARNnarrow && !qh RERUN && qh PRINTprecision)
    -      qh_printhelp_narrowhull(qh ferr, minangle);
    -  }
    -  zzval_(Zprocessed)= qh hull_dim+1;
    -  qh_checkpolygon(qh facet_list);
    -  qh_checkconvex(qh facet_list,   qh_DATAfault);
    -#ifndef qh_NOtrace
    -  if (qh IStracing >= 1) {
    -    qh_fprintf(qh ferr, 8105, "qh_initialhull: simplex constructed, interior point:");
    -    for (k=0; k < qh hull_dim; k++)
    -      qh_fprintf(qh ferr, 8106, " %6.4g", qh interior_point[k]);
    -    qh_fprintf(qh ferr, 8107, "\n");
    -  }
    -#endif
    -} /* initialhull */
    -
    -/*---------------------------------
    -
    -  qh_initialvertices( dim, maxpoints, points, numpoints )
    -    determines a non-singular set of initial vertices
    -    maxpoints may include duplicate points
    -
    -  returns:
    -    temporary set of dim+1 vertices in descending order by vertex id
    -    if qh.RANDOMoutside && !qh.ALLpoints
    -      picks random points
    -    if dim >= qh_INITIALmax,
    -      uses min/max x and max points with non-zero determinants
    -
    -  notes:
    -    unless qh.ALLpoints,
    -      uses maxpoints as long as determinate is non-zero
    -*/
    -setT *qh_initialvertices(int dim, setT *maxpoints, pointT *points, int numpoints) {
    -  pointT *point, **pointp;
    -  setT *vertices, *simplex, *tested;
    -  realT randr;
    -  int idx, point_i, point_n, k;
    -  boolT nearzero= False;
    -
    -  vertices= qh_settemp(dim + 1);
    -  simplex= qh_settemp(dim+1);
    -  if (qh ALLpoints)
    -    qh_maxsimplex(dim, NULL, points, numpoints, &simplex);
    -  else if (qh RANDOMoutside) {
    -    while (qh_setsize(simplex) != dim+1) {
    -      randr= qh_RANDOMint;
    -      randr= randr/(qh_RANDOMmax+1);
    -      idx= (int)floor(qh num_points * randr);
    -      while (qh_setin(simplex, qh_point(idx))) {
    -        idx++; /* in case qh_RANDOMint always returns the same value */
    -        idx= idx < qh num_points ? idx : 0;
    -      }
    -      qh_setappend(&simplex, qh_point(idx));
    -    }
    -  }else if (qh hull_dim >= qh_INITIALmax) {
    -    tested= qh_settemp(dim+1);
    -    qh_setappend(&simplex, SETfirst_(maxpoints));   /* max and min X coord */
    -    qh_setappend(&simplex, SETsecond_(maxpoints));
    -    qh_maxsimplex(fmin_(qh_INITIALsearch, dim), maxpoints, points, numpoints, &simplex);
    -    k= qh_setsize(simplex);
    -    FOREACHpoint_i_(maxpoints) {
    -      if (point_i & 0x1) {     /* first pick up max. coord. points */
    -        if (!qh_setin(simplex, point) && !qh_setin(tested, point)){
    -          qh_detsimplex(point, simplex, k, &nearzero);
    -          if (nearzero)
    -            qh_setappend(&tested, point);
    -          else {
    -            qh_setappend(&simplex, point);
    -            if (++k == dim)  /* use search for last point */
    -              break;
    -          }
    -        }
    -      }
    -    }
    -    while (k != dim && (point= (pointT*)qh_setdellast(maxpoints))) {
    -      if (!qh_setin(simplex, point) && !qh_setin(tested, point)){
    -        qh_detsimplex(point, simplex, k, &nearzero);
    -        if (nearzero)
    -          qh_setappend(&tested, point);
    -        else {
    -          qh_setappend(&simplex, point);
    -          k++;
    -        }
    -      }
    -    }
    -    idx= 0;
    -    while (k != dim && (point= qh_point(idx++))) {
    -      if (!qh_setin(simplex, point) && !qh_setin(tested, point)){
    -        qh_detsimplex(point, simplex, k, &nearzero);
    -        if (!nearzero){
    -          qh_setappend(&simplex, point);
    -          k++;
    -        }
    -      }
    -    }
    -    qh_settempfree(&tested);
    -    qh_maxsimplex(dim, maxpoints, points, numpoints, &simplex);
    -  }else
    -    qh_maxsimplex(dim, maxpoints, points, numpoints, &simplex);
    -  FOREACHpoint_(simplex)
    -    qh_setaddnth(&vertices, 0, qh_newvertex(point)); /* descending order */
    -  qh_settempfree(&simplex);
    -  return vertices;
    -} /* initialvertices */
    -
    -
    -/*---------------------------------
    -
    -  qh_isvertex( point, vertices )
    -    returns vertex if point is in vertex set, else returns NULL
    -
    -  notes:
    -    for qh.GOODvertex
    -*/
    -vertexT *qh_isvertex(pointT *point, setT *vertices) {
    -  vertexT *vertex, **vertexp;
    -
    -  FOREACHvertex_(vertices) {
    -    if (vertex->point == point)
    -      return vertex;
    -  }
    -  return NULL;
    -} /* isvertex */
    -
    -/*---------------------------------
    -
    -  qh_makenewfacets( point )
    -    make new facets from point and qh.visible_list
    -
    -  returns:
    -    qh.newfacet_list= list of new facets with hyperplanes and ->newfacet
    -    qh.newvertex_list= list of vertices in new facets with ->newlist set
    -
    -    if (qh.ONLYgood)
    -      newfacets reference horizon facets, but not vice versa
    -      ridges reference non-simplicial horizon ridges, but not vice versa
    -      does not change existing facets
    -    else
    -      sets qh.NEWfacets
    -      new facets attached to horizon facets and ridges
    -      for visible facets,
    -        visible->r.replace is corresponding new facet
    -
    -  see also:
    -    qh_makenewplanes() -- make hyperplanes for facets
    -    qh_attachnewfacets() -- attachnewfacets if not done here(qh ONLYgood)
    -    qh_matchnewfacets() -- match up neighbors
    -    qh_updatevertices() -- update vertex neighbors and delvertices
    -    qh_deletevisible() -- delete visible facets
    -    qh_checkpolygon() --check the result
    -    qh_triangulate() -- triangulate a non-simplicial facet
    -
    -  design:
    -    for each visible facet
    -      make new facets to its horizon facets
    -      update its f.replace
    -      clear its neighbor set
    -*/
    -vertexT *qh_makenewfacets(pointT *point /*visible_list*/) {
    -  facetT *visible, *newfacet= NULL, *newfacet2= NULL, *neighbor, **neighborp;
    -  vertexT *apex;
    -  int numnew=0;
    -
    -  qh newfacet_list= qh facet_tail;
    -  qh newvertex_list= qh vertex_tail;
    -  apex= qh_newvertex(point);
    -  qh_appendvertex(apex);
    -  qh visit_id++;
    -  if (!qh ONLYgood)
    -    qh NEWfacets= True;
    -  FORALLvisible_facets {
    -    FOREACHneighbor_(visible)
    -      neighbor->seen= False;
    -    if (visible->ridges) {
    -      visible->visitid= qh visit_id;
    -      newfacet2= qh_makenew_nonsimplicial(visible, apex, &numnew);
    -    }
    -    if (visible->simplicial)
    -      newfacet= qh_makenew_simplicial(visible, apex, &numnew);
    -    if (!qh ONLYgood) {
    -      if (newfacet2)  /* newfacet is null if all ridges defined */
    -        newfacet= newfacet2;
    -      if (newfacet)
    -        visible->f.replace= newfacet;
    -      else
    -        zinc_(Zinsidevisible);
    -      SETfirst_(visible->neighbors)= NULL;
    -    }
    -  }
    -  trace1((qh ferr, 1032, "qh_makenewfacets: created %d new facets from point p%d to horizon\n",
    -          numnew, qh_pointid(point)));
    -  if (qh IStracing >= 4)
    -    qh_printfacetlist(qh newfacet_list, NULL, qh_ALL);
    -  return apex;
    -} /* makenewfacets */
    -
    -/*---------------------------------
    -
    -  qh_matchduplicates( atfacet, atskip, hashsize, hashcount )
    -    match duplicate ridges in qh.hash_table for atfacet/atskip
    -    duplicates marked with ->dupridge and qh_DUPLICATEridge
    -
    -  returns:
    -    picks match with worst merge (min distance apart)
    -    updates hashcount
    -
    -  see also:
    -    qh_matchneighbor
    -
    -  notes:
    -
    -  design:
    -    compute hash value for atfacet and atskip
    -    repeat twice -- once to make best matches, once to match the rest
    -      for each possible facet in qh.hash_table
    -        if it is a matching facet and pass 2
    -          make match
    -          unless tricoplanar, mark match for merging (qh_MERGEridge)
    -          [e.g., tricoplanar RBOX s 1000 t993602376 | QHULL C-1e-3 d Qbb FA Qt]
    -        if it is a matching facet and pass 1
    -          test if this is a better match
    -      if pass 1,
    -        make best match (it will not be merged)
    -*/
    -#ifndef qh_NOmerge
    -void qh_matchduplicates(facetT *atfacet, int atskip, int hashsize, int *hashcount) {
    -  boolT same, ismatch;
    -  int hash, scan;
    -  facetT *facet, *newfacet, *maxmatch= NULL, *maxmatch2= NULL, *nextfacet;
    -  int skip, newskip, nextskip= 0, maxskip= 0, maxskip2= 0, makematch;
    -  realT maxdist= -REALmax, mindist, dist2, low, high;
    -
    -  hash= qh_gethash(hashsize, atfacet->vertices, qh hull_dim, 1,
    -                     SETelem_(atfacet->vertices, atskip));
    -  trace2((qh ferr, 2046, "qh_matchduplicates: find duplicate matches for f%d skip %d hash %d hashcount %d\n",
    -          atfacet->id, atskip, hash, *hashcount));
    -  for (makematch= 0; makematch < 2; makematch++) {
    -    qh visit_id++;
    -    for (newfacet= atfacet, newskip= atskip; newfacet; newfacet= nextfacet, newskip= nextskip) {
    -      zinc_(Zhashlookup);
    -      nextfacet= NULL;
    -      newfacet->visitid= qh visit_id;
    -      for (scan= hash; (facet= SETelemt_(qh hash_table, scan, facetT));
    -           scan= (++scan >= hashsize ? 0 : scan)) {
    -        if (!facet->dupridge || facet->visitid == qh visit_id)
    -          continue;
    -        zinc_(Zhashtests);
    -        if (qh_matchvertices(1, newfacet->vertices, newskip, facet->vertices, &skip, &same)) {
    -          ismatch= (same == (boolT)(newfacet->toporient ^ facet->toporient));
    -          if (SETelemt_(facet->neighbors, skip, facetT) != qh_DUPLICATEridge) {
    -            if (!makematch) {
    -              qh_fprintf(qh ferr, 6155, "qhull internal error (qh_matchduplicates): missing dupridge at f%d skip %d for new f%d skip %d hash %d\n",
    -                     facet->id, skip, newfacet->id, newskip, hash);
    -              qh_errexit2(qh_ERRqhull, facet, newfacet);
    -            }
    -          }else if (ismatch && makematch) {
    -            if (SETelemt_(newfacet->neighbors, newskip, facetT) == qh_DUPLICATEridge) {
    -              SETelem_(facet->neighbors, skip)= newfacet;
    -              if (newfacet->tricoplanar)
    -                SETelem_(newfacet->neighbors, newskip)= facet;
    -              else
    -                SETelem_(newfacet->neighbors, newskip)= qh_MERGEridge;
    -              *hashcount -= 2; /* removed two unmatched facets */
    -              trace4((qh ferr, 4059, "qh_matchduplicates: duplicate f%d skip %d matched with new f%d skip %d merge\n",
    -                    facet->id, skip, newfacet->id, newskip));
    -            }
    -          }else if (ismatch) {
    -            mindist= qh_getdistance(facet, newfacet, &low, &high);
    -            dist2= qh_getdistance(newfacet, facet, &low, &high);
    -            minimize_(mindist, dist2);
    -            if (mindist > maxdist) {
    -              maxdist= mindist;
    -              maxmatch= facet;
    -              maxskip= skip;
    -              maxmatch2= newfacet;
    -              maxskip2= newskip;
    -            }
    -            trace3((qh ferr, 3018, "qh_matchduplicates: duplicate f%d skip %d new f%d skip %d at dist %2.2g, max is now f%d f%d\n",
    -                    facet->id, skip, newfacet->id, newskip, mindist,
    -                    maxmatch->id, maxmatch2->id));
    -          }else { /* !ismatch */
    -            nextfacet= facet;
    -            nextskip= skip;
    -          }
    -        }
    -        if (makematch && !facet
    -        && SETelemt_(facet->neighbors, skip, facetT) == qh_DUPLICATEridge) {
    -          qh_fprintf(qh ferr, 6156, "qhull internal error (qh_matchduplicates): no MERGEridge match for duplicate f%d skip %d at hash %d\n",
    -                     newfacet->id, newskip, hash);
    -          qh_errexit(qh_ERRqhull, newfacet, NULL);
    -        }
    -      }
    -    } /* end of for each new facet at hash */
    -    if (!makematch) {
    -      if (!maxmatch) {
    -        qh_fprintf(qh ferr, 6157, "qhull internal error (qh_matchduplicates): no maximum match at duplicate f%d skip %d at hash %d\n",
    -                     atfacet->id, atskip, hash);
    -        qh_errexit(qh_ERRqhull, atfacet, NULL);
    -      }
    -      SETelem_(maxmatch->neighbors, maxskip)= maxmatch2; /* maxmatch!=0 by QH6157 */
    -      SETelem_(maxmatch2->neighbors, maxskip2)= maxmatch;
    -      *hashcount -= 2; /* removed two unmatched facets */
    -      zzinc_(Zmultiridge);
    -      trace0((qh ferr, 25, "qh_matchduplicates: duplicate f%d skip %d matched with new f%d skip %d keep\n",
    -              maxmatch->id, maxskip, maxmatch2->id, maxskip2));
    -      qh_precision("ridge with multiple neighbors");
    -      if (qh IStracing >= 4)
    -        qh_errprint("DUPLICATED/MATCH", maxmatch, maxmatch2, NULL, NULL);
    -    }
    -  }
    -} /* matchduplicates */
    -
    -/*---------------------------------
    -
    -  qh_nearcoplanar()
    -    for all facets, remove near-inside points from facet->coplanarset
    -    coplanar points defined by innerplane from qh_outerinner()
    -
    -  returns:
    -    if qh KEEPcoplanar && !qh KEEPinside
    -      facet->coplanarset only contains coplanar points
    -    if qh.JOGGLEmax
    -      drops inner plane by another qh.JOGGLEmax diagonal since a
    -        vertex could shift out while a coplanar point shifts in
    -
    -  notes:
    -    used for qh.PREmerge and qh.JOGGLEmax
    -    must agree with computation of qh.NEARcoplanar in qh_detroundoff()
    -  design:
    -    if not keeping coplanar or inside points
    -      free all coplanar sets
    -    else if not keeping both coplanar and inside points
    -      remove !coplanar or !inside points from coplanar sets
    -*/
    -void qh_nearcoplanar(void /* qh.facet_list */) {
    -  facetT *facet;
    -  pointT *point, **pointp;
    -  int numpart;
    -  realT dist, innerplane;
    -
    -  if (!qh KEEPcoplanar && !qh KEEPinside) {
    -    FORALLfacets {
    -      if (facet->coplanarset)
    -        qh_setfree( &facet->coplanarset);
    -    }
    -  }else if (!qh KEEPcoplanar || !qh KEEPinside) {
    -    qh_outerinner(NULL, NULL, &innerplane);
    -    if (qh JOGGLEmax < REALmax/2)
    -      innerplane -= qh JOGGLEmax * sqrt((realT)qh hull_dim);
    -    numpart= 0;
    -    FORALLfacets {
    -      if (facet->coplanarset) {
    -        FOREACHpoint_(facet->coplanarset) {
    -          numpart++;
    -          qh_distplane(point, facet, &dist);
    -          if (dist < innerplane) {
    -            if (!qh KEEPinside)
    -              SETref_(point)= NULL;
    -          }else if (!qh KEEPcoplanar)
    -            SETref_(point)= NULL;
    -        }
    -        qh_setcompact(facet->coplanarset);
    -      }
    -    }
    -    zzadd_(Zcheckpart, numpart);
    -  }
    -} /* nearcoplanar */
    -
    -/*---------------------------------
    -
    -  qh_nearvertex( facet, point, bestdist )
    -    return nearest vertex in facet to point
    -
    -  returns:
    -    vertex and its distance
    -
    -  notes:
    -    if qh.DELAUNAY
    -      distance is measured in the input set
    -    searches neighboring tricoplanar facets (requires vertexneighbors)
    -      Slow implementation.  Recomputes vertex set for each point.
    -    The vertex set could be stored in the qh.keepcentrum facet.
    -*/
    -vertexT *qh_nearvertex(facetT *facet, pointT *point, realT *bestdistp) {
    -  realT bestdist= REALmax, dist;
    -  vertexT *bestvertex= NULL, *vertex, **vertexp, *apex;
    -  coordT *center;
    -  facetT *neighbor, **neighborp;
    -  setT *vertices;
    -  int dim= qh hull_dim;
    -
    -  if (qh DELAUNAY)
    -    dim--;
    -  if (facet->tricoplanar) {
    -    if (!qh VERTEXneighbors || !facet->center) {
    -      qh_fprintf(qh ferr, 6158, "qhull internal error (qh_nearvertex): qh.VERTEXneighbors and facet->center required for tricoplanar facets\n");
    -      qh_errexit(qh_ERRqhull, facet, NULL);
    -    }
    -    vertices= qh_settemp(qh TEMPsize);
    -    apex= SETfirstt_(facet->vertices, vertexT);
    -    center= facet->center;
    -    FOREACHneighbor_(apex) {
    -      if (neighbor->center == center) {
    -        FOREACHvertex_(neighbor->vertices)
    -          qh_setappend(&vertices, vertex);
    -      }
    -    }
    -  }else
    -    vertices= facet->vertices;
    -  FOREACHvertex_(vertices) {
    -    dist= qh_pointdist(vertex->point, point, -dim);
    -    if (dist < bestdist) {
    -      bestdist= dist;
    -      bestvertex= vertex;
    -    }
    -  }
    -  if (facet->tricoplanar)
    -    qh_settempfree(&vertices);
    -  *bestdistp= sqrt(bestdist);
    -  if (!bestvertex) {
    -      qh_fprintf(qh ferr, 6261, "qhull internal error (qh_nearvertex): did not find bestvertex for f%d p%d\n", facet->id, qh_pointid(point));
    -      qh_errexit(qh_ERRqhull, facet, NULL);
    -  }
    -  trace3((qh ferr, 3019, "qh_nearvertex: v%d dist %2.2g for f%d p%d\n",
    -        bestvertex->id, *bestdistp, facet->id, qh_pointid(point))); /* bestvertex!=0 by QH2161 */
    -  return bestvertex;
    -} /* nearvertex */
    -
    -/*---------------------------------
    -
    -  qh_newhashtable( newsize )
    -    returns size of qh.hash_table of at least newsize slots
    -
    -  notes:
    -    assumes qh.hash_table is NULL
    -    qh_HASHfactor determines the number of extra slots
    -    size is not divisible by 2, 3, or 5
    -*/
    -int qh_newhashtable(int newsize) {
    -  int size;
    -
    -  size= ((newsize+1)*qh_HASHfactor) | 0x1;  /* odd number */
    -  while (True) {
    -    if (newsize<0 || size<0) {
    -        qh_fprintf(qhmem.ferr, 6236, "qhull error (qh_newhashtable): negative request (%d) or size (%d).  Did int overflow due to high-D?\n", newsize, size); /* WARN64 */
    -        qh_errexit(qhmem_ERRmem, NULL, NULL);
    -    }
    -    if ((size%3) && (size%5))
    -      break;
    -    size += 2;
    -    /* loop terminates because there is an infinite number of primes */
    -  }
    -  qh hash_table= qh_setnew(size);
    -  qh_setzero(qh hash_table, 0, size);
    -  return size;
    -} /* newhashtable */
    -
    -/*---------------------------------
    -
    -  qh_newvertex( point )
    -    returns a new vertex for point
    -*/
    -vertexT *qh_newvertex(pointT *point) {
    -  vertexT *vertex;
    -
    -  zinc_(Ztotvertices);
    -  vertex= (vertexT *)qh_memalloc((int)sizeof(vertexT));
    -  memset((char *) vertex, (size_t)0, sizeof(vertexT));
    -  if (qh vertex_id == UINT_MAX) {
    -    qh_memfree(vertex, (int)sizeof(vertexT));
    -    qh_fprintf(qh ferr, 6159, "qhull error: more than 2^32 vertices.  vertexT.id field overflows.  Vertices would not be sorted correctly.\n");
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }
    -  if (qh vertex_id == qh tracevertex_id)
    -    qh tracevertex= vertex;
    -  vertex->id= qh vertex_id++;
    -  vertex->point= point;
    -  trace4((qh ferr, 4060, "qh_newvertex: vertex p%d(v%d) created\n", qh_pointid(vertex->point),
    -          vertex->id));
    -  return(vertex);
    -} /* newvertex */
    -
    -/*---------------------------------
    -
    -  qh_nextridge3d( atridge, facet, vertex )
    -    return next ridge and vertex for a 3d facet
    -    returns NULL on error
    -    [for QhullFacet::nextRidge3d] Does not call qh_errexit nor access qh_qh.
    -
    -  notes:
    -    in qh_ORIENTclock order
    -    this is a O(n^2) implementation to trace all ridges
    -    be sure to stop on any 2nd visit
    -    same as QhullRidge::nextRidge3d
    -    does not use qh_qh or qh_errexit [QhullFacet.cpp]
    -
    -  design:
    -    for each ridge
    -      exit if it is the ridge after atridge
    -*/
    -ridgeT *qh_nextridge3d(ridgeT *atridge, facetT *facet, vertexT **vertexp) {
    -  vertexT *atvertex, *vertex, *othervertex;
    -  ridgeT *ridge, **ridgep;
    -
    -  if ((atridge->top == facet) ^ qh_ORIENTclock)
    -    atvertex= SETsecondt_(atridge->vertices, vertexT);
    -  else
    -    atvertex= SETfirstt_(atridge->vertices, vertexT);
    -  FOREACHridge_(facet->ridges) {
    -    if (ridge == atridge)
    -      continue;
    -    if ((ridge->top == facet) ^ qh_ORIENTclock) {
    -      othervertex= SETsecondt_(ridge->vertices, vertexT);
    -      vertex= SETfirstt_(ridge->vertices, vertexT);
    -    }else {
    -      vertex= SETsecondt_(ridge->vertices, vertexT);
    -      othervertex= SETfirstt_(ridge->vertices, vertexT);
    -    }
    -    if (vertex == atvertex) {
    -      if (vertexp)
    -        *vertexp= othervertex;
    -      return ridge;
    -    }
    -  }
    -  return NULL;
    -} /* nextridge3d */
    -#else /* qh_NOmerge */
    -void qh_matchduplicates(facetT *atfacet, int atskip, int hashsize, int *hashcount) {
    -}
    -ridgeT *qh_nextridge3d(ridgeT *atridge, facetT *facet, vertexT **vertexp) {
    -
    -  return NULL;
    -}
    -#endif /* qh_NOmerge */
    -
    -/*---------------------------------
    -
    -  qh_outcoplanar()
    -    move points from all facets' outsidesets to their coplanarsets
    -
    -  notes:
    -    for post-processing under qh.NARROWhull
    -
    -  design:
    -    for each facet
    -      for each outside point for facet
    -        partition point into coplanar set
    -*/
    -void qh_outcoplanar(void /* facet_list */) {
    -  pointT *point, **pointp;
    -  facetT *facet;
    -  realT dist;
    -
    -  trace1((qh ferr, 1033, "qh_outcoplanar: move outsideset to coplanarset for qh NARROWhull\n"));
    -  FORALLfacets {
    -    FOREACHpoint_(facet->outsideset) {
    -      qh num_outside--;
    -      if (qh KEEPcoplanar || qh KEEPnearinside) {
    -        qh_distplane(point, facet, &dist);
    -        zinc_(Zpartition);
    -        qh_partitioncoplanar(point, facet, &dist);
    -      }
    -    }
    -    qh_setfree(&facet->outsideset);
    -  }
    -} /* outcoplanar */
    -
    -/*---------------------------------
    -
    -  qh_point( id )
    -    return point for a point id, or NULL if unknown
    -
    -  alternative code:
    -    return((pointT *)((unsigned   long)qh.first_point
    -           + (unsigned long)((id)*qh.normal_size)));
    -*/
    -pointT *qh_point(int id) {
    -
    -  if (id < 0)
    -    return NULL;
    -  if (id < qh num_points)
    -    return qh first_point + id * qh hull_dim;
    -  id -= qh num_points;
    -  if (id < qh_setsize(qh other_points))
    -    return SETelemt_(qh other_points, id, pointT);
    -  return NULL;
    -} /* point */
    -
    -/*---------------------------------
    -
    -  qh_point_add( set, point, elem )
    -    stores elem at set[point.id]
    -
    -  returns:
    -    access function for qh_pointfacet and qh_pointvertex
    -
    -  notes:
    -    checks point.id
    -*/
    -void qh_point_add(setT *set, pointT *point, void *elem) {
    -  int id, size;
    -
    -  SETreturnsize_(set, size);
    -  if ((id= qh_pointid(point)) < 0)
    -    qh_fprintf(qh ferr, 7067, "qhull internal warning (point_add): unknown point %p id %d\n",
    -      point, id);
    -  else if (id >= size) {
    -    qh_fprintf(qh ferr, 6160, "qhull internal errror(point_add): point p%d is out of bounds(%d)\n",
    -             id, size);
    -    qh_errexit(qh_ERRqhull, NULL, NULL);
    -  }else
    -    SETelem_(set, id)= elem;
    -} /* point_add */
    -
    -
    -/*---------------------------------
    -
    -  qh_pointfacet()
    -    return temporary set of facet for each point
    -    the set is indexed by point id
    -
    -  notes:
    -    vertices assigned to one of the facets
    -    coplanarset assigned to the facet
    -    outside set assigned to the facet
    -    NULL if no facet for point (inside)
    -      includes qh.GOODpointp
    -
    -  access:
    -    FOREACHfacet_i_(facets) { ... }
    -    SETelem_(facets, i)
    -
    -  design:
    -    for each facet
    -      add each vertex
    -      add each coplanar point
    -      add each outside point
    -*/
    -setT *qh_pointfacet(void /*qh.facet_list*/) {
    -  int numpoints= qh num_points + qh_setsize(qh other_points);
    -  setT *facets;
    -  facetT *facet;
    -  vertexT *vertex, **vertexp;
    -  pointT *point, **pointp;
    -
    -  facets= qh_settemp(numpoints);
    -  qh_setzero(facets, 0, numpoints);
    -  qh vertex_visit++;
    -  FORALLfacets {
    -    FOREACHvertex_(facet->vertices) {
    -      if (vertex->visitid != qh vertex_visit) {
    -        vertex->visitid= qh vertex_visit;
    -        qh_point_add(facets, vertex->point, facet);
    -      }
    -    }
    -    FOREACHpoint_(facet->coplanarset)
    -      qh_point_add(facets, point, facet);
    -    FOREACHpoint_(facet->outsideset)
    -      qh_point_add(facets, point, facet);
    -  }
    -  return facets;
    -} /* pointfacet */
    -
    -/*---------------------------------
    -
    -  qh_pointvertex(  )
    -    return temporary set of vertices indexed by point id
    -    entry is NULL if no vertex for a point
    -      this will include qh.GOODpointp
    -
    -  access:
    -    FOREACHvertex_i_(vertices) { ... }
    -    SETelem_(vertices, i)
    -*/
    -setT *qh_pointvertex(void /*qh.facet_list*/) {
    -  int numpoints= qh num_points + qh_setsize(qh other_points);
    -  setT *vertices;
    -  vertexT *vertex;
    -
    -  vertices= qh_settemp(numpoints);
    -  qh_setzero(vertices, 0, numpoints);
    -  FORALLvertices
    -    qh_point_add(vertices, vertex->point, vertex);
    -  return vertices;
    -} /* pointvertex */
    -
    -
    -/*---------------------------------
    -
    -  qh_prependfacet( facet, facetlist )
    -    prepend facet to the start of a facetlist
    -
    -  returns:
    -    increments qh.numfacets
    -    updates facetlist, qh.facet_list, facet_next
    -
    -  notes:
    -    be careful of prepending since it can lose a pointer.
    -      e.g., can lose _next by deleting and then prepending before _next
    -*/
    -void qh_prependfacet(facetT *facet, facetT **facetlist) {
    -  facetT *prevfacet, *list;
    -
    -
    -  trace4((qh ferr, 4061, "qh_prependfacet: prepend f%d before f%d\n",
    -          facet->id, getid_(*facetlist)));
    -  if (!*facetlist)
    -    (*facetlist)= qh facet_tail;
    -  list= *facetlist;
    -  prevfacet= list->previous;
    -  facet->previous= prevfacet;
    -  if (prevfacet)
    -    prevfacet->next= facet;
    -  list->previous= facet;
    -  facet->next= *facetlist;
    -  if (qh facet_list == list)  /* this may change *facetlist */
    -    qh facet_list= facet;
    -  if (qh facet_next == list)
    -    qh facet_next= facet;
    -  *facetlist= facet;
    -  qh num_facets++;
    -} /* prependfacet */
    -
    -
    -/*---------------------------------
    -
    -  qh_printhashtable( fp )
    -    print hash table to fp
    -
    -  notes:
    -    not in I/O to avoid bringing io.c in
    -
    -  design:
    -    for each hash entry
    -      if defined
    -        if unmatched or will merge (NULL, qh_MERGEridge, qh_DUPLICATEridge)
    -          print entry and neighbors
    -*/
    -void qh_printhashtable(FILE *fp) {
    -  facetT *facet, *neighbor;
    -  int id, facet_i, facet_n, neighbor_i= 0, neighbor_n= 0;
    -  vertexT *vertex, **vertexp;
    -
    -  FOREACHfacet_i_(qh hash_table) {
    -    if (facet) {
    -      FOREACHneighbor_i_(facet) {
    -        if (!neighbor || neighbor == qh_MERGEridge || neighbor == qh_DUPLICATEridge)
    -          break;
    -      }
    -      if (neighbor_i == neighbor_n)
    -        continue;
    -      qh_fprintf(fp, 9283, "hash %d f%d ", facet_i, facet->id);
    -      FOREACHvertex_(facet->vertices)
    -        qh_fprintf(fp, 9284, "v%d ", vertex->id);
    -      qh_fprintf(fp, 9285, "\n neighbors:");
    -      FOREACHneighbor_i_(facet) {
    -        if (neighbor == qh_MERGEridge)
    -          id= -3;
    -        else if (neighbor == qh_DUPLICATEridge)
    -          id= -2;
    -        else
    -          id= getid_(neighbor);
    -        qh_fprintf(fp, 9286, " %d", id);
    -      }
    -      qh_fprintf(fp, 9287, "\n");
    -    }
    -  }
    -} /* printhashtable */
    -
    -
    -/*---------------------------------
    -
    -  qh_printlists( fp )
    -    print out facet and vertex list for debugging (without 'f/v' tags)
    -*/
    -void qh_printlists(void) {
    -  facetT *facet;
    -  vertexT *vertex;
    -  int count= 0;
    -
    -  qh_fprintf(qh ferr, 8108, "qh_printlists: facets:");
    -  FORALLfacets {
    -    if (++count % 100 == 0)
    -      qh_fprintf(qh ferr, 8109, "\n     ");
    -    qh_fprintf(qh ferr, 8110, " %d", facet->id);
    -  }
    -  qh_fprintf(qh ferr, 8111, "\n  new facets %d visible facets %d next facet for qh_addpoint %d\n  vertices(new %d):",
    -     getid_(qh newfacet_list), getid_(qh visible_list), getid_(qh facet_next),
    -     getid_(qh newvertex_list));
    -  count = 0;
    -  FORALLvertices {
    -    if (++count % 100 == 0)
    -      qh_fprintf(qh ferr, 8112, "\n     ");
    -    qh_fprintf(qh ferr, 8113, " %d", vertex->id);
    -  }
    -  qh_fprintf(qh ferr, 8114, "\n");
    -} /* printlists */
    -
    -/*---------------------------------
    -
    -  qh_resetlists( stats, qh_RESETvisible )
    -    reset newvertex_list, newfacet_list, visible_list
    -    if stats,
    -      maintains statistics
    -
    -  returns:
    -    visible_list is empty if qh_deletevisible was called
    -*/
    -void qh_resetlists(boolT stats, boolT resetVisible /*qh.newvertex_list newfacet_list visible_list*/) {
    -  vertexT *vertex;
    -  facetT *newfacet, *visible;
    -  int totnew=0, totver=0;
    -
    -  if (stats) {
    -    FORALLvertex_(qh newvertex_list)
    -      totver++;
    -    FORALLnew_facets
    -      totnew++;
    -    zadd_(Zvisvertextot, totver);
    -    zmax_(Zvisvertexmax, totver);
    -    zadd_(Znewfacettot, totnew);
    -    zmax_(Znewfacetmax, totnew);
    -  }
    -  FORALLvertex_(qh newvertex_list)
    -    vertex->newlist= False;
    -  qh newvertex_list= NULL;
    -  FORALLnew_facets
    -    newfacet->newfacet= False;
    -  qh newfacet_list= NULL;
    -  if (resetVisible) {
    -    FORALLvisible_facets {
    -      visible->f.replace= NULL;
    -      visible->visible= False;
    -    }
    -    qh num_visible= 0;
    -  }
    -  qh visible_list= NULL; /* may still have visible facets via qh_triangulate */
    -  qh NEWfacets= False;
    -} /* resetlists */
    -
    -/*---------------------------------
    -
    -  qh_setvoronoi_all()
    -    compute Voronoi centers for all facets
    -    includes upperDelaunay facets if qh.UPPERdelaunay ('Qu')
    -
    -  returns:
    -    facet->center is the Voronoi center
    -
    -  notes:
    -    this is unused/untested code
    -      please email bradb@shore.net if this works ok for you
    -
    -  use:
    -    FORALLvertices {...} to locate the vertex for a point.
    -    FOREACHneighbor_(vertex) {...} to visit the Voronoi centers for a Voronoi cell.
    -*/
    -void qh_setvoronoi_all(void) {
    -  facetT *facet;
    -
    -  qh_clearcenters(qh_ASvoronoi);
    -  qh_vertexneighbors();
    -
    -  FORALLfacets {
    -    if (!facet->normal || !facet->upperdelaunay || qh UPPERdelaunay) {
    -      if (!facet->center)
    -        facet->center= qh_facetcenter(facet->vertices);
    -    }
    -  }
    -} /* setvoronoi_all */
    -
    -#ifndef qh_NOmerge
    -
    -/*---------------------------------
    -
    -  qh_triangulate()
    -    triangulate non-simplicial facets on qh.facet_list,
    -    if qh VORONOI, sets Voronoi centers of non-simplicial facets
    -    nop if hasTriangulation
    -
    -  returns:
    -    all facets simplicial
    -    each tricoplanar facet has ->f.triowner == owner of ->center,normal,etc.
    -
    -  notes:
    -    call after qh_check_output since may switch to Voronoi centers
    -    Output may overwrite ->f.triowner with ->f.area
    -*/
    -void qh_triangulate(void /*qh.facet_list*/) {
    -  facetT *facet, *nextfacet, *owner;
    -  int onlygood= qh ONLYgood;
    -  facetT *neighbor, *visible= NULL, *facet1, *facet2, *new_facet_list= NULL;
    -  facetT *orig_neighbor= NULL, *otherfacet;
    -  vertexT *new_vertex_list= NULL;
    -  mergeT *merge;
    -  mergeType mergetype;
    -  int neighbor_i, neighbor_n;
    -
    -  if (qh hasTriangulation)
    -      return;
    -  trace1((qh ferr, 1034, "qh_triangulate: triangulate non-simplicial facets\n"));
    -  if (qh hull_dim == 2)
    -    return;
    -  if (qh VORONOI) {  /* otherwise lose Voronoi centers [could rebuild vertex set from tricoplanar] */
    -    qh_clearcenters(qh_ASvoronoi);
    -    qh_vertexneighbors();
    -  }
    -  qh ONLYgood= False; /* for makenew_nonsimplicial */
    -  qh visit_id++;
    -  qh NEWfacets= True;
    -  qh degen_mergeset= qh_settemp(qh TEMPsize);
    -  qh newvertex_list= qh vertex_tail;
    -  for (facet= qh facet_list; facet && facet->next; facet= nextfacet) { /* non-simplicial facets moved to end */
    -    nextfacet= facet->next;
    -    if (facet->visible || facet->simplicial)
    -      continue;
    -    /* triangulate all non-simplicial facets, otherwise merging does not work, e.g., RBOX c P-0.1 P+0.1 P+0.1 D3 | QHULL d Qt Tv */
    -    if (!new_facet_list)
    -      new_facet_list= facet;  /* will be moved to end */
    -    qh_triangulate_facet(facet, &new_vertex_list);
    -  }
    -  trace2((qh ferr, 2047, "qh_triangulate: delete null facets from f%d -- apex same as second vertex\n", getid_(new_facet_list)));
    -  for (facet= new_facet_list; facet && facet->next; facet= nextfacet) { /* null facets moved to end */
    -    nextfacet= facet->next;
    -    if (facet->visible)
    -      continue;
    -    if (facet->ridges) {
    -      if (qh_setsize(facet->ridges) > 0) {
    -        qh_fprintf(qh ferr, 6161, "qhull error (qh_triangulate): ridges still defined for f%d\n", facet->id);
    -        qh_errexit(qh_ERRqhull, facet, NULL);
    -      }
    -      qh_setfree(&facet->ridges);
    -    }
    -    if (SETfirst_(facet->vertices) == SETsecond_(facet->vertices)) {
    -      zinc_(Ztrinull);
    -      qh_triangulate_null(facet);
    -    }
    -  }
    -  trace2((qh ferr, 2048, "qh_triangulate: delete %d or more mirror facets -- same vertices and neighbors\n", qh_setsize(qh degen_mergeset)));
    -  qh visible_list= qh facet_tail;
    -  while ((merge= (mergeT*)qh_setdellast(qh degen_mergeset))) {
    -    facet1= merge->facet1;
    -    facet2= merge->facet2;
    -    mergetype= merge->type;
    -    qh_memfree(merge, (int)sizeof(mergeT));
    -    if (mergetype == MRGmirror) {
    -      zinc_(Ztrimirror);
    -      qh_triangulate_mirror(facet1, facet2);
    -    }
    -  }
    -  qh_settempfree(&qh degen_mergeset);
    -  trace2((qh ferr, 2049, "qh_triangulate: update neighbor lists for vertices from v%d\n", getid_(new_vertex_list)));
    -  qh newvertex_list= new_vertex_list;  /* all vertices of new facets */
    -  qh visible_list= NULL;
    -  qh_updatevertices(/*qh.newvertex_list, empty newfacet_list and visible_list*/);
    -  qh_resetlists(False, !qh_RESETvisible /*qh.newvertex_list, empty newfacet_list and visible_list*/);
    -
    -  trace2((qh ferr, 2050, "qh_triangulate: identify degenerate tricoplanar facets from f%d\n", getid_(new_facet_list)));
    -  trace2((qh ferr, 2051, "qh_triangulate: and replace facet->f.triowner with tricoplanar facets that own center, normal, etc.\n"));
    -  FORALLfacet_(new_facet_list) {
    -    if (facet->tricoplanar && !facet->visible) {
    -      FOREACHneighbor_i_(facet) {
    -        if (neighbor_i == 0) {  /* first iteration */
    -          if (neighbor->tricoplanar)
    -            orig_neighbor= neighbor->f.triowner;
    -          else
    -            orig_neighbor= neighbor;
    -        }else {
    -          if (neighbor->tricoplanar)
    -            otherfacet= neighbor->f.triowner;
    -          else
    -            otherfacet= neighbor;
    -          if (orig_neighbor == otherfacet) {
    -            zinc_(Ztridegen);
    -            facet->degenerate= True;
    -            break;
    -          }
    -        }
    -      }
    -    }
    -  }
    -
    -  trace2((qh ferr, 2052, "qh_triangulate: delete visible facets -- non-simplicial, null, and mirrored facets\n"));
    -  owner= NULL;
    -  visible= NULL;
    -  for (facet= new_facet_list; facet && facet->next; facet= nextfacet) { /* may delete facet */
    -    nextfacet= facet->next;
    -    if (facet->visible) {
    -      if (facet->tricoplanar) { /* a null or mirrored facet */
    -        qh_delfacet(facet);
    -        qh num_visible--;
    -      }else {  /* a non-simplicial facet followed by its tricoplanars */
    -        if (visible && !owner) {
    -          /*  RBOX 200 s D5 t1001471447 | QHULL Qt C-0.01 Qx Qc Tv Qt -- f4483 had 6 vertices/neighbors and 8 ridges */
    -          trace2((qh ferr, 2053, "qh_triangulate: all tricoplanar facets degenerate for non-simplicial facet f%d\n",
    -                       visible->id));
    -          qh_delfacet(visible);
    -          qh num_visible--;
    -        }
    -        visible= facet;
    -        owner= NULL;
    -      }
    -    }else if (facet->tricoplanar) {
    -      if (facet->f.triowner != visible || visible==NULL) {
    -        qh_fprintf(qh ferr, 6162, "qhull error (qh_triangulate): tricoplanar facet f%d not owned by its visible, non-simplicial facet f%d\n", facet->id, getid_(visible));
    -        qh_errexit2(qh_ERRqhull, facet, visible);
    -      }
    -      if (owner)
    -        facet->f.triowner= owner;
    -      else if (!facet->degenerate) {
    -        owner= facet;
    -        nextfacet= visible->next; /* rescan tricoplanar facets with owner, visible!=0 by QH6162 */
    -        facet->keepcentrum= True;  /* one facet owns ->normal, etc. */
    -        facet->coplanarset= visible->coplanarset;
    -        facet->outsideset= visible->outsideset;
    -        visible->coplanarset= NULL;
    -        visible->outsideset= NULL;
    -        if (!qh TRInormals) { /* center and normal copied to tricoplanar facets */
    -          visible->center= NULL;
    -          visible->normal= NULL;
    -        }
    -        qh_delfacet(visible);
    -        qh num_visible--;
    -      }
    -    }
    -  }
    -  if (visible && !owner) {
    -    trace2((qh ferr, 2054, "qh_triangulate: all tricoplanar facets degenerate for last non-simplicial facet f%d\n",
    -                 visible->id));
    -    qh_delfacet(visible);
    -    qh num_visible--;
    -  }
    -  qh NEWfacets= False;
    -  qh ONLYgood= onlygood; /* restore value */
    -  if (qh CHECKfrequently)
    -    qh_checkpolygon(qh facet_list);
    -  qh hasTriangulation= True;
    -} /* triangulate */
    -
    -
    -/*---------------------------------
    -
    -  qh_triangulate_facet(qh, facetA, &firstVertex )
    -    triangulate a non-simplicial facet
    -      if qh.CENTERtype=qh_ASvoronoi, sets its Voronoi center
    -  returns:
    -    qh.newfacet_list == simplicial facets
    -      facet->tricoplanar set and ->keepcentrum false
    -      facet->degenerate set if duplicated apex
    -      facet->f.trivisible set to facetA
    -      facet->center copied from facetA (created if qh_ASvoronoi)
    -        qh_eachvoronoi, qh_detvridge, qh_detvridge3 assume centers copied
    -      facet->normal,offset,maxoutside copied from facetA
    -
    -  notes:
    -      only called by qh_triangulate
    -      qh_makenew_nonsimplicial uses neighbor->seen for the same
    -      if qh.TRInormals, newfacet->normal will need qh_free
    -        if qh.TRInormals and qh_AScentrum, newfacet->center will need qh_free
    -        keepcentrum is also set on Zwidefacet in qh_mergefacet
    -        freed by qh_clearcenters
    -
    -  see also:
    -      qh_addpoint() -- add a point
    -      qh_makenewfacets() -- construct a cone of facets for a new vertex
    -
    -  design:
    -      if qh_ASvoronoi,
    -         compute Voronoi center (facet->center)
    -      select first vertex (highest ID to preserve ID ordering of ->vertices)
    -      triangulate from vertex to ridges
    -      copy facet->center, normal, offset
    -      update vertex neighbors
    -*/
    -void qh_triangulate_facet(facetT *facetA, vertexT **first_vertex) {
    -  facetT *newfacet;
    -  facetT *neighbor, **neighborp;
    -  vertexT *apex;
    -  int numnew=0;
    -
    -  trace3((qh ferr, 3020, "qh_triangulate_facet: triangulate facet f%d\n", facetA->id));
    -
    -  if (qh IStracing >= 4)
    -    qh_printfacet(qh ferr, facetA);
    -  FOREACHneighbor_(facetA) {
    -    neighbor->seen= False;
    -    neighbor->coplanar= False;
    -  }
    -  if (qh CENTERtype == qh_ASvoronoi && !facetA->center  /* matches upperdelaunay in qh_setfacetplane() */
    -        && fabs_(facetA->normal[qh hull_dim -1]) >= qh ANGLEround * qh_ZEROdelaunay) {
    -    facetA->center= qh_facetcenter(facetA->vertices);
    -  }
    -  qh_willdelete(facetA, NULL);
    -  qh newfacet_list= qh facet_tail;
    -  facetA->visitid= qh visit_id;
    -  apex= SETfirstt_(facetA->vertices, vertexT);
    -  qh_makenew_nonsimplicial(facetA, apex, &numnew);
    -  SETfirst_(facetA->neighbors)= NULL;
    -  FORALLnew_facets {
    -    newfacet->tricoplanar= True;
    -    newfacet->f.trivisible= facetA;
    -    newfacet->degenerate= False;
    -    newfacet->upperdelaunay= facetA->upperdelaunay;
    -    newfacet->good= facetA->good;
    -    if (qh TRInormals) { /* 'Q11' triangulate duplicates ->normal and ->center */
    -      newfacet->keepcentrum= True;
    -      if(facetA->normal){
    -        newfacet->normal= qh_memalloc(qh normal_size);
    -        memcpy((char *)newfacet->normal, facetA->normal, qh normal_size);
    -      }
    -      if (qh CENTERtype == qh_AScentrum)
    -        newfacet->center= qh_getcentrum(newfacet);
    -      else if (qh CENTERtype == qh_ASvoronoi && facetA->center){
    -        newfacet->center= qh_memalloc(qh center_size);
    -        memcpy((char *)newfacet->center, facetA->center, qh center_size);
    -      }
    -    }else {
    -      newfacet->keepcentrum= False;
    -      /* one facet will have keepcentrum=True at end of qh_triangulate */
    -      newfacet->normal= facetA->normal;
    -      newfacet->center= facetA->center;
    -    }
    -    newfacet->offset= facetA->offset;
    -#if qh_MAXoutside
    -    newfacet->maxoutside= facetA->maxoutside;
    -#endif
    -  }
    -  qh_matchnewfacets(/*qh.newfacet_list*/);
    -  zinc_(Ztricoplanar);
    -  zadd_(Ztricoplanartot, numnew);
    -  zmax_(Ztricoplanarmax, numnew);
    -  qh visible_list= NULL;
    -  if (!(*first_vertex))
    -    (*first_vertex)= qh newvertex_list;
    -  qh newvertex_list= NULL;
    -  qh_updatevertices(/*qh.newfacet_list, qh.empty visible_list and qh.newvertex_list*/);
    -  qh_resetlists(False, !qh_RESETvisible /*qh.newfacet_list, qh.empty visible_list and qh.newvertex_list*/);
    -} /* triangulate_facet */
    -
    -/*---------------------------------
    -
    -  qh_triangulate_link(oldfacetA, facetA, oldfacetB, facetB)
    -    relink facetA to facetB via oldfacets
    -  returns:
    -    adds mirror facets to qh degen_mergeset (4-d and up only)
    -  design:
    -    if they are already neighbors, the opposing neighbors become MRGmirror facets
    -*/
    -void qh_triangulate_link(facetT *oldfacetA, facetT *facetA, facetT *oldfacetB, facetT *facetB) {
    -  int errmirror= False;
    -
    -  trace3((qh ferr, 3021, "qh_triangulate_link: relink old facets f%d and f%d between neighbors f%d and f%d\n",
    -         oldfacetA->id, oldfacetB->id, facetA->id, facetB->id));
    -  if (qh_setin(facetA->neighbors, facetB)) {
    -    if (!qh_setin(facetB->neighbors, facetA))
    -      errmirror= True;
    -    else
    -      qh_appendmergeset(facetA, facetB, MRGmirror, NULL);
    -  }else if (qh_setin(facetB->neighbors, facetA))
    -    errmirror= True;
    -  if (errmirror) {
    -    qh_fprintf(qh ferr, 6163, "qhull error (qh_triangulate_link): mirror facets f%d and f%d do not match for old facets f%d and f%d\n",
    -       facetA->id, facetB->id, oldfacetA->id, oldfacetB->id);
    -    qh_errexit2(qh_ERRqhull, facetA, facetB);
    -  }
    -  qh_setreplace(facetB->neighbors, oldfacetB, facetA);
    -  qh_setreplace(facetA->neighbors, oldfacetA, facetB);
    -} /* triangulate_link */
    -
    -/*---------------------------------
    -
    -  qh_triangulate_mirror(facetA, facetB)
    -    delete mirrored facets from qh_triangulate_null() and qh_triangulate_mirror
    -      a mirrored facet shares the same vertices of a logical ridge
    -  design:
    -    since a null facet duplicates the first two vertices, the opposing neighbors absorb the null facet
    -    if they are already neighbors, the opposing neighbors become MRGmirror facets
    -*/
    -void qh_triangulate_mirror(facetT *facetA, facetT *facetB) {
    -  facetT *neighbor, *neighborB;
    -  int neighbor_i, neighbor_n;
    -
    -  trace3((qh ferr, 3022, "qh_triangulate_mirror: delete mirrored facets f%d and f%d\n",
    -         facetA->id, facetB->id));
    -  FOREACHneighbor_i_(facetA) {
    -    neighborB= SETelemt_(facetB->neighbors, neighbor_i, facetT);
    -    if (neighbor == neighborB)
    -      continue; /* occurs twice */
    -    qh_triangulate_link(facetA, neighbor, facetB, neighborB);
    -  }
    -  qh_willdelete(facetA, NULL);
    -  qh_willdelete(facetB, NULL);
    -} /* triangulate_mirror */
    -
    -/*---------------------------------
    -
    -  qh_triangulate_null(facetA)
    -    remove null facetA from qh_triangulate_facet()
    -      a null facet has vertex #1 (apex) == vertex #2
    -  returns:
    -    adds facetA to ->visible for deletion after qh_updatevertices
    -    qh degen_mergeset contains mirror facets (4-d and up only)
    -  design:
    -    since a null facet duplicates the first two vertices, the opposing neighbors absorb the null facet
    -    if they are already neighbors, the opposing neighbors become MRGmirror facets
    -*/
    -void qh_triangulate_null(facetT *facetA) {
    -  facetT *neighbor, *otherfacet;
    -
    -  trace3((qh ferr, 3023, "qh_triangulate_null: delete null facet f%d\n", facetA->id));
    -  neighbor= SETfirstt_(facetA->neighbors, facetT);
    -  otherfacet= SETsecondt_(facetA->neighbors, facetT);
    -  qh_triangulate_link(facetA, neighbor, facetA, otherfacet);
    -  qh_willdelete(facetA, NULL);
    -} /* triangulate_null */
    -
    -#else /* qh_NOmerge */
    -void qh_triangulate(void) {
    -}
    -#endif /* qh_NOmerge */
    -
    -   /*---------------------------------
    -
    -  qh_vertexintersect( vertexsetA, vertexsetB )
    -    intersects two vertex sets (inverse id ordered)
    -    vertexsetA is a temporary set at the top of qhmem.tempstack
    -
    -  returns:
    -    replaces vertexsetA with the intersection
    -
    -  notes:
    -    could overwrite vertexsetA if currently too slow
    -*/
    -void qh_vertexintersect(setT **vertexsetA,setT *vertexsetB) {
    -  setT *intersection;
    -
    -  intersection= qh_vertexintersect_new(*vertexsetA, vertexsetB);
    -  qh_settempfree(vertexsetA);
    -  *vertexsetA= intersection;
    -  qh_settemppush(intersection);
    -} /* vertexintersect */
    -
    -/*---------------------------------
    -
    -  qh_vertexintersect_new(  )
    -    intersects two vertex sets (inverse id ordered)
    -
    -  returns:
    -    a new set
    -*/
    -setT *qh_vertexintersect_new(setT *vertexsetA,setT *vertexsetB) {
    -  setT *intersection= qh_setnew(qh hull_dim - 1);
    -  vertexT **vertexA= SETaddr_(vertexsetA, vertexT);
    -  vertexT **vertexB= SETaddr_(vertexsetB, vertexT);
    -
    -  while (*vertexA && *vertexB) {
    -    if (*vertexA  == *vertexB) {
    -      qh_setappend(&intersection, *vertexA);
    -      vertexA++; vertexB++;
    -    }else {
    -      if ((*vertexA)->id > (*vertexB)->id)
    -        vertexA++;
    -      else
    -        vertexB++;
    -    }
    -  }
    -  return intersection;
    -} /* vertexintersect_new */
    -
    -/*---------------------------------
    -
    -  qh_vertexneighbors()
    -    for each vertex in qh.facet_list,
    -      determine its neighboring facets
    -
    -  returns:
    -    sets qh.VERTEXneighbors
    -      nop if qh.VERTEXneighbors already set
    -      qh_addpoint() will maintain them
    -
    -  notes:
    -    assumes all vertex->neighbors are NULL
    -
    -  design:
    -    for each facet
    -      for each vertex
    -        append facet to vertex->neighbors
    -*/
    -void qh_vertexneighbors(void /*qh.facet_list*/) {
    -  facetT *facet;
    -  vertexT *vertex, **vertexp;
    -
    -  if (qh VERTEXneighbors)
    -    return;
    -  trace1((qh ferr, 1035, "qh_vertexneighbors: determining neighboring facets for each vertex\n"));
    -  qh vertex_visit++;
    -  FORALLfacets {
    -    if (facet->visible)
    -      continue;
    -    FOREACHvertex_(facet->vertices) {
    -      if (vertex->visitid != qh vertex_visit) {
    -        vertex->visitid= qh vertex_visit;
    -        vertex->neighbors= qh_setnew(qh hull_dim);
    -      }
    -      qh_setappend(&vertex->neighbors, facet);
    -    }
    -  }
    -  qh VERTEXneighbors= True;
    -} /* vertexneighbors */
    -
    -/*---------------------------------
    -
    -  qh_vertexsubset( vertexsetA, vertexsetB )
    -    returns True if vertexsetA is a subset of vertexsetB
    -    assumes vertexsets are sorted
    -
    -  note:
    -    empty set is a subset of any other set
    -*/
    -boolT qh_vertexsubset(setT *vertexsetA, setT *vertexsetB) {
    -  vertexT **vertexA= (vertexT **) SETaddr_(vertexsetA, vertexT);
    -  vertexT **vertexB= (vertexT **) SETaddr_(vertexsetB, vertexT);
    -
    -  while (True) {
    -    if (!*vertexA)
    -      return True;
    -    if (!*vertexB)
    -      return False;
    -    if ((*vertexA)->id > (*vertexB)->id)
    -      return False;
    -    if (*vertexA  == *vertexB)
    -      vertexA++;
    -    vertexB++;
    -  }
    -  return False; /* avoid warnings */
    -} /* vertexsubset */
    diff --git a/src/qhull/src/libqhull/qh-geom.htm b/src/qhull/src/libqhull/qh-geom.htm
    deleted file mode 100644
    index 6dc7465ebe8..00000000000
    --- a/src/qhull/src/libqhull/qh-geom.htm
    +++ /dev/null
    @@ -1,295 +0,0 @@
    -
    -
    -
    -
    -geom.c, geom2.c -- geometric and floating point routines
    -
    -
    -
    -
    -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser -

    - -
    - - -

    geom.c, geom2.c, random.c -- geometric and floating point routines

    -
    -

    Geometrically, a vertex is a point with d coordinates -and a facet is a halfspace. A halfspace is defined by an -oriented hyperplane through the facet's vertices. A hyperplane -is defined by d normalized coefficients and an offset. A -point is above a facet if its distance to the facet is -positive.

    - -

    Qhull uses floating point coordinates for input points, -vertices, halfspace equations, centrums, and an interior point.

    - -

    Qhull may be configured for single precision or double -precision floating point arithmetic (see realT -).

    - -

    Each floating point operation may incur round-off error (see -Merge). The maximum error for distance -computations is determined at initialization. The roundoff error -in halfspace computation is accounted for by computing the -distance from vertices to the halfspace.

    -
    -

    Copyright © 1995-2015 C.B. Barber

    -
    -

    » Geom - Global • -IoMem • -MergePoly • -QhullSet • -StatUser

    - -

    Index to geom.c, -geom2.c, geom.h, -random.c, random.h -

    - - - -

    »geometric data types -and constants

    - -
      -
    • coordT coordinates and -coefficients are stored as realT
    • -
    • pointT a point is an array -of DIM3 coordinates
    • -
    - -

    »mathematical macros

    - -
      -
    • fabs_ returns the absolute -value of a
    • -
    • fmax_ returns the maximum -value of a and b
    • -
    • fmin_ returns the minimum -value of a and b
    • -
    • maximize_ maximize a value -
    • -
    • minimize_ minimize a value -
    • -
    • det2_ compute a 2-d -determinate
    • -
    • det3_ compute a 3-d -determinate
    • -
    • dX, dY, dZ compute the difference -between two coordinates
    • -
    - -

    »mathematical functions

    - - - -

    »computational geometry functions

    - - - -

    »point array functions

    - - -

    »geometric facet functions

    - - -

    »geometric roundoff functions

    -
      -
    • qh_detjoggle determine -default joggle for points and distance roundoff error
    • -
    • qh_detroundoff -determine maximum roundoff error and other precision constants
    • -
    • qh_distround compute -maximum roundoff error due to a distance computation to a -normalized hyperplane
    • -
    • qh_divzero divide by a -number that is nearly zero
    • -
    • qh_maxouter return maximum outer -plane
    • -
    • qh_outerinner return actual -outer and inner planes -
    - -

    -
    -

    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: Geom • -GlobalIo -• MemMerge -• PolyQhull -• SetStat -• User
    - - -

    -
    -

    The -Geometry Center Home Page

    -

    Comments to: qhull@qhull.org -
    -Created: May 2, 1997 --- Last modified: see top

    - - diff --git a/src/qhull/src/libqhull/qh-globa.htm b/src/qhull/src/libqhull/qh-globa.htm deleted file mode 100644 index c87508b6630..00000000000 --- a/src/qhull/src/libqhull/qh-globa.htm +++ /dev/null @@ -1,165 +0,0 @@ - - - - -global.c -- global variables and their functions - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser -

    - -
    - - -

    global.c -- global variables and their functions

    -
    -

    Qhull uses a global data structure, qh, to store -globally defined constants, lists, sets, and variables. This -allows multiple instances of Qhull to execute at the same time. -The structure may be statically allocated or -dynamically allocated with malloc(). See -QHpointer. -

    -
    -

    Copyright © 1995-2015 C.B. Barber

    -
    -

    » Geom - Global • -IoMem • -MergePoly • -QhullSet • -StatUser

    - -

    Index to global.c and -libqhull.h

    - - - -

    »Qhull's global -variables

    - - - -

    »Global variable and -initialization routines

    - - - -

    -
    -

    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: Geom • -GlobalIo -• MemMerge -• PolyQhull -• SetStat -• User
    -

    -
    -

    The -Geometry Center Home Page

    -

    Comments to: qhull@qhull.org -
    -Created: May 2, 1997 --- Last modified: see top

    - - diff --git a/src/qhull/src/libqhull/qh-io.htm b/src/qhull/src/libqhull/qh-io.htm deleted file mode 100644 index 5cb591d8773..00000000000 --- a/src/qhull/src/libqhull/qh-io.htm +++ /dev/null @@ -1,305 +0,0 @@ - - - - -io.c -- input and output operations - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -
    - -

    io.c -- input and output operations

    -
    - -

    Qhull provides a wide range of input -and output options. To organize the code, most output formats use -the same driver:

    - -
    -    qh_printbegin( fp, format, facetlist, facets, printall );
    -
    -    FORALLfacet_( facetlist )
    -      qh_printafacet( fp, format, facet, printall );
    -
    -    FOREACHfacet_( facets )
    -      qh_printafacet( fp, format, facet, printall );
    -
    -    qh_printend( fp, format );
    -
    - -

    Note the 'printall' flag. It selects whether or not -qh_skipfacet() is tested.

    - -
    -

    Copyright © 1995-2015 C.B. Barber

    -
    -

    » Geom -GlobalIo • -MemMerge • -PolyQhull • -SetStat • -User

    - -

    Index to io.c and io.h

    - - - -

    »io.h constants and types

    - -
      -
    • qh_MAXfirst maximum length -of first two lines of stdin
    • -
    • qh_WHITESPACE possible -values of white space
    • -
    • printvridgeT function to -print results of qh_printvdiagram or qh_eachvoronoi
    • -
    - -

    »User level functions

    - - - -

    »Print functions for all -output formats

    - - - -

    »Text output functions

    - - -

    »Text utility functions

    - - -

    »Geomview output functions

    - -

    »Geomview utility functions

    - -

    -

    -
    -

    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: Geom • -GlobalIo -• MemMerge -• PolyQhull -• SetStat -• User
    -

    -

    -
    -

    The -Geometry Center Home Page

    -

    Comments to: qhull@qhull.org -
    -Created: May 2, 1997 --- Last modified: see top

    - - diff --git a/src/qhull/src/libqhull/qh-mem.htm b/src/qhull/src/libqhull/qh-mem.htm deleted file mode 100644 index b993b22297a..00000000000 --- a/src/qhull/src/libqhull/qh-mem.htm +++ /dev/null @@ -1,145 +0,0 @@ - - - - -mem.c -- memory operations - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -
    - -

    mem.c -- memory operations

    -
    -

    Qhull uses quick-fit memory allocation. It maintains a -set of free lists for a variety of small allocations. A -small request returns a block from the best fitting free -list. If the free list is empty, Qhull allocates a block -from a reserved buffer.

    -

    Use 'T5' to trace memory allocations.

    - -
    -

    Copyright © 1995-2015 C.B. Barber

    -
    -

    » Geom - Global • -IoMem -• MergePoly -• QhullSet -• StatUser -

    -

    Index to mem.c and -mem.h

    - -

    »mem.h data types and constants

    -
      -
    • ptr_intT for casting -a void* to an integer-type
    • -
    • qhmemT global memory -structure for mem.c
    • -
    • qh_NOmem disable memory allocation
    • -
    -

    »mem.h macros

    - -

    »User level -functions

    - - -

    »Initialization and -termination functions

    - - -

    -
    -

    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: Geom • -GlobalIo -• MemMerge -• PolyQhull -• SetStat -• User
    -

    -

    -
    -

    The -Geometry Center Home Page

    -

    Comments to: qhull@qhull.org -
    -Created: May 2, 1997 --- Last modified: see top

    - - diff --git a/src/qhull/src/libqhull/qh-merge.htm b/src/qhull/src/libqhull/qh-merge.htm deleted file mode 100644 index 54b97c88ee6..00000000000 --- a/src/qhull/src/libqhull/qh-merge.htm +++ /dev/null @@ -1,366 +0,0 @@ - - - - -merge.c -- facet merge operations - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -
    - -

    merge.c -- facet merge operations

    -
    -

    Qhull handles precision problems by merged facets or joggled input. -Except for redundant vertices, it corrects a problem by -merging two facets. When done, all facets are clearly -convex. See Imprecision in Qhull -for further information.

    -

    Users may joggle the input ('QJn') -instead of merging facets.

    -

    Qhull detects and corrects the following problems:

    -
      -
    • More than two facets meeting at a ridge. When -Qhull creates facets, it creates an even number -of facets for each ridge. A convex hull always -has two facets for each ridge. More than two -facets may be created if non-adjacent facets -share a vertex. This is called a duplicate -ridge. In 2-d, a duplicate ridge would -create a loop of facets.
    • -
    -
      -
    • A facet contained in another facet. Facet -merging may leave all vertices of one facet as a -subset of the vertices of another facet. This is -called a redundant facet.
    • -
    -
      -
    • A facet with fewer than three neighbors. Facet -merging may leave a facet with one or two -neighbors. This is called a degenerate facet. -
    • -
    -
      -
    • A facet with flipped orientation. A -facet's hyperplane may define a halfspace that -does not include the interior point.This is -called a flipped facet.
    • -
    -
      -
    • A coplanar horizon facet. A -newly processed point may be coplanar with an -horizon facet. Qhull creates a new facet without -a hyperplane. It links new facets for the same -horizon facet together. This is called a samecycle. -The new facet or samecycle is merged into the -horizon facet.
    • -
    -
      -
    • Concave facets. A facet's centrum may be -above a neighboring facet. If so, the facets meet -at a concave angle.
    • -
    -
      -
    • Coplanar facets. A facet's centrum may be -coplanar with a neighboring facet (i.e., it is -neither clearly below nor clearly above the -facet's hyperplane). Qhull removes coplanar -facets in independent sets sorted by angle.
    • -
    -
      -
    • Redundant vertex. A vertex may have fewer -than three neighboring facets. If so, it is -redundant and may be renamed to an adjacent -vertex without changing the topological -structure.This is called a redundant vertex. -
    • -
    -
    -

    Copyright © 1995-2015 C.B. Barber

    -
    -

    » Geom - Global -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -

    Index to merge.c and -merge.h

    - - -

    »merge.h data -types, macros, and global sets

    -
      -
    • mergeT structure to -identify a merge of two facets
    • -
    • FOREACHmerge_ -assign 'merge' to each merge in merges
    • -
    • qh global sets -qh.facet_mergeset contains non-convex merges -while qh.degen_mergeset contains degenerate and -redundant facets
    • -
    -

    »merge.h -constants

    - -

    »top-level merge -functions

    - - -

    »functions for -identifying merges

    - - -

    »functions for -determining the best merge

    - - -

    »functions for -merging facets

    - - -

    »functions for -merging a cycle of facets

    -

    If a point is coplanar with an horizon facet, the -corresponding new facets are linked together (a samecycle) -for merging.

    - -

    »functions -for renaming a vertex

    - - -

    »functions -for identifying vertices for renaming

    - - -

    »functions for check and -trace

    - - -

    -
    -

    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: Geom • -GlobalIo -• MemMerge -• PolyQhull -• SetStat -• User
    -

    -

    -
    -

    The -Geometry Center Home Page

    -

    Comments to: qhull@qhull.org -
    -Created: May 2, 1997 --- Last modified: see top

    - - diff --git a/src/qhull/src/libqhull/qh-poly.htm b/src/qhull/src/libqhull/qh-poly.htm deleted file mode 100644 index c8f6b38b0d6..00000000000 --- a/src/qhull/src/libqhull/qh-poly.htm +++ /dev/null @@ -1,485 +0,0 @@ - - - - -poly.c, poly2.c -- polyhedron operations - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -
    - -

    poly.c, poly2.c -- polyhedron operations

    -
    - -

    Qhull uses dimension-free terminology. Qhull builds a -polyhedron in dimension d. A polyhedron is a -simplicial complex of faces with geometric information for the -top and bottom-level faces. A (d-1)-face is a facet, -a (d-2)-face is a ridge, and a 0-face -is a vertex. For example in 3-d, a facet is a polygon -and a ridge is an edge. A facet is built from a ridge (the base) -and a vertex (the apex). See -Qhull's data structures.

    - -

    Qhull's primary data structure is a polyhedron. A -polyhedron is a list of facets. Each facet has a set of -neighboring facets and a set of vertices. Each facet has a -hyperplane. For example, a tetrahedron has four facets. -If its vertices are a, b, c, d, and its facets -are 1, 2, 3, 4, the tetrahedron is

    -
    -
      -
    • facet 1
        -
      • vertices: b c d
      • -
      • neighbors: 2 3 4
      • -
      -
    • -
    • facet 2
        -
      • vertices: a c d
      • -
      • neighbors: 1 3 4
      • -
      -
    • -
    • facet 3
        -
      • vertices: a b d
      • -
      • neighbors: 1 2 4
      • -
      -
    • -
    • facet 4
        -
      • vertices: a b c
      • -
      • neighbors: 1 2 3
      • -
      -
    • -
    -
    -

    A facet may be simplicial or non-simplicial. In 3-d, a -simplicial facet has three vertices and three -neighbors. A nonsimplicial facet has more than -three vertices and more than three neighbors. A -nonsimplicial facet has a set of ridges and a centrum.

    -

    -A simplicial facet has an orientation. An orientation -is either top or bottom. -The flag, facet->toporient, -defines the orientation of the facet's vertices. For example in 3-d, -'top' is left-handed orientation (i.e., the vertex order follows the direction -of the left-hand fingers when the thumb is pointing away from the center). -Except for axis-parallel facets in 5-d and higher, topological orientation -determines the geometric orientation of the facet's hyperplane. - -

    A nonsimplicial facet is due to merging two or more -facets. The facet's ridge set determine a simplicial -decomposition of the facet. Each ridge is a 1-face (i.e., -it has two vertices and two neighboring facets). The -orientation of a ridge is determined by the order of the -neighboring facets. The flag, facet->toporient,is -ignored.

    -

    A nonsimplicial facet has a centrum for testing -convexity. A centrum is a point on the facet's -hyperplane that is near the center of the facet. Except -for large facets, it is the arithmetic average of the -facet's vertices.

    -

    A nonsimplicial facet is an approximation that is -defined by offsets from the facet's hyperplane. When -Qhull finishes, the outer plane is above all -points while the inner plane is below the facet's -vertices. This guarantees that any exact convex hull -passes between the inner and outer planes. The outer -plane is defined by facet->maxoutside while -the inner plane is computed from the facet's vertices.

    - -

    Qhull 3.1 includes triangulation of non-simplicial facets -('Qt'). -These facets, -called tricoplanar, share the same normal. centrum, and Voronoi center. -One facet (keepcentrum) owns these data structures. -While tricoplanar facets are more accurate than the simplicial facets from -joggled input, they -may have zero area or flipped orientation. - -

    -

    Copyright © 1995-2015 C.B. Barber

    -
    -

    » Geom - Global -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -

    Index to poly.c, -poly2.c, poly.h, -and libqhull.h

    - -

    »Data -types and global lists for polyhedrons

    - -

    »poly.h constants

    -
      -
    • ALGORITHMfault -flag to not report errors in qh_checkconvex()
    • -
    • DATAfault flag to -report errors in qh_checkconvex()
    • -
    • DUPLICATEridge -special value for facet->neighbor to indicate -a duplicate ridge
    • -
    • MERGEridge -special value for facet->neighbor to indicate -a merged ridge
    • -
    -

    »Global FORALL -macros

    - -

    »FORALL macros

    - -

    »FOREACH macros

    - -

    »Indexed -FOREACH macros

    -
      -
    • FOREACHfacet_i_ -assign 'facet' and 'facet_i' to each facet in -facet set
    • -
    • FOREACHneighbor_i_ -assign 'neighbor' and 'neighbor_i' to each facet -in facet->neighbors or vertex->neighbors
    • -
    • FOREACHpoint_i_ -assign 'point' and 'point_i' to each point in -points set
    • -
    • FOREACHridge_i_ -assign 'ridge' and 'ridge_i' to each ridge in -ridges set
    • -
    • FOREACHvertex_i_ -assign 'vertex' and 'vertex_i' to each vertex in -vertices set
    • -
    • FOREACHvertexreverse12_ -assign 'vertex' to each vertex in vertex set; -reverse the order of first two vertices
    • -
    -

    »Other macros for polyhedrons

    -
      -
    • getid_ return ID for -a facet, ridge, or vertex
    • -
    • otherfacet_ -return neighboring facet for a ridge in a facet
    • -
    -

    »Facetlist -functions

    - -

    »Facet -functions

    - -

    »Vertex, -ridge, and point functions

    - -

    »Hashtable functions

    - -

    »Allocation and -deallocation functions

    - -

    »Check -functions

    - - - -

    -
    -

    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: Geom • -GlobalIo -• MemMerge -• PolyQhull -• SetStat -• User
    -

    -

    -
    -

    The -Geometry Center Home Page

    -

    Comments to: qhull@qhull.org -
    -Created: May 2, 1997 --- Last modified: see top

    - - diff --git a/src/qhull/src/libqhull/qh-qhull.htm b/src/qhull/src/libqhull/qh-qhull.htm deleted file mode 100644 index 5212c642266..00000000000 --- a/src/qhull/src/libqhull/qh-qhull.htm +++ /dev/null @@ -1,279 +0,0 @@ - - - - -libqhull.c -- top-level functions and basic data types - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -
    - -

    libqhull.c -- top-level functions and basic data types

    -
    -

    Qhull implements the Quickhull algorithm for computing -the convex hull. The Quickhull algorithm combines two -well-known algorithms: the 2-d quickhull algorithm and -the n-d beneath-beyond algorithm. See -Description of Qhull.

    -

    This section provides an index to the top-level -functions and base data types. The top-level header file, libqhull.h, -contains prototypes for these functions.

    -
    -

    Copyright © 1995-2015 C.B. Barber

    -
    -

    » Geom - Global -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -

    Index to libqhull.c, -libqhull.h, and -unix.c

    - - -

    »libqhull.h and unix.c -data types and constants

    -
      -
    • flagT Boolean flag as -a bit
    • -
    • boolT boolean value, -either True or False
    • -
    • CENTERtype to -distinguish facet->center
    • -
    • qh_PRINT output -formats for printing (qh.PRINTout)
    • -
    • qh_ALL argument flag -for selecting everything
    • -
    • qh_ERR Qhull exit -codes for indicating errors
    • -
    • qh_FILEstderr Fake stderr -to distinguish error output from normal output [C++ only]
    • -
    • qh_prompt version and long prompt for Qhull
    • -
    • qh_prompt2 synopsis for Qhull
    • -
    • qh_prompt3 concise prompt for Qhull
    • -
    • qh_version version stamp
    • -
    - -

    »libqhull.h other -macros

    -
      -
    • traceN print trace -message if qh.IStracing >= N.
    • -
    • QHULL_UNUSED declare an - unused variable to avoid warnings.
    • -
    - -

    »Quickhull -routines in call order

    - - -

    »Top-level routines for initializing and terminating Qhull (in other modules)

    - - -

    »Top-level routines for reading and modifying the input (in other modules)

    - - -

    »Top-level routines for calling Qhull (in other modules)

    - - -

    »Top-level routines for returning results (in other modules)

    - - -

    »Top-level routines for testing and debugging (in other modules)

    - - -

    -
    -

    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: Geom • -GlobalIo -• MemMerge -• PolyQhull -• SetStat -• User
    -

    -

    -
    -

    The -Geometry Center Home Page

    -

    Comments to: qhull@qhull.org -
    -Created: May 2, 1997 --- Last modified: see top

    - - diff --git a/src/qhull/src/libqhull/qh-set.htm b/src/qhull/src/libqhull/qh-set.htm deleted file mode 100644 index 06e71bbc929..00000000000 --- a/src/qhull/src/libqhull/qh-set.htm +++ /dev/null @@ -1,308 +0,0 @@ - - - - -qset.c -- set data type and operations - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -
    - -

    qset.c -- set data type and operations

    -
    -

    Qhull's data structures are constructed from sets. The -functions and macros in qset.c construct, iterate, and -modify these sets. They are the most frequently called -functions in Qhull. For this reason, efficiency is the -primary concern.

    -

    In Qhull, a set is represented by an unordered -array of pointers with a maximum size and a NULL -terminator (setT). -Most sets correspond to mathematical sets -(i.e., the pointers are unique). Some sets are sorted to -enforce uniqueness. Some sets are ordered. For example, -the order of vertices in a ridge determine the ridge's -orientation. If you reverse the order of adjacent -vertices, the orientation reverses. Some sets are not -mathematical sets. They may be indexed as an array and -they may include NULL pointers.

    -

    The most common operation on a set is to iterate its -members. This is done with a 'FOREACH...' macro. Each set -has a custom macro. For example, 'FOREACHvertex_' -iterates over a set of vertices. Each vertex is assigned -to the variable 'vertex' from the pointer 'vertexp'.

    -

    Most sets are constructed by appending elements to the -set. The last element of a set is either NULL or the -index of the terminating NULL for a partially full set. -If a set is full, appending an element copies the set to -a larger array.

    - -
    -

    Copyright © 1995-2015 C.B. Barber

    -
    -

    » Geom - Global • -IoMem • -MergePoly -• QhullSet -• StatUser -

    -

    Index to qset.c and -qset.h

    - -

    »Data types and -constants

    -
      -
    • SETelemsize size -of a set element in bytes
    • -
    • setT a set with a -maximum size and a current size
    • -
    • qh global sets -global sets for temporary sets, etc.
    • -
    -

    »FOREACH macros

    - -

    »Access and -size macros

    - -

    »Internal macros

    -
      -
    • SETsizeaddr_ -return pointer to end element of a set (indicates -current size)
    • -
    - -

    »address macros

    -
      -
    • SETaddr_ return -address of a set's elements
    • -
    • SETelemaddr_ -return address of the n'th element of a set
    • -
    • SETref_ l.h.s. for -modifying the current element in a FOREACH -iteration
    • -
    - -

    »Allocation and -deallocation functions

    - - -

    »Access and -predicate functions

    - - -

    »Add functions

    - - -

    »Check and print functions

    - - -

    »Copy, compact, and zero functions

    - - -

    »Delete functions

    - - -

    »Temporary set functions

    - - -

    -
    -

    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: Geom • -GlobalIo -• MemMerge -• PolyQhull -• SetStat -• User
    -

    -

    -
    -

    The -Geometry Center Home Page

    -

    Comments to: qhull@qhull.org -
    -Created: May 2, 1997 --- Last modified: see top

    - - diff --git a/src/qhull/src/libqhull/qh-stat.htm b/src/qhull/src/libqhull/qh-stat.htm deleted file mode 100644 index b9685403121..00000000000 --- a/src/qhull/src/libqhull/qh-stat.htm +++ /dev/null @@ -1,163 +0,0 @@ - - - - -stat.c -- statistical operations - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -
    - -

    stat.c -- statistical operations

    -
    -

    Qhull records many statistics. These functions and -macros make it inexpensive to add a statistic. -

    As with Qhull's global variables, the statistics data structure is -accessed by a macro, 'qhstat'. If qh_QHpointer is defined, the macro -is 'qh_qhstat->', otherwise the macro is 'qh_qhstat.'. -Statistics -may be turned off in user.h. If so, all but the 'zz' -statistics are ignored.

    -
    -

    Copyright © 1995-2015 C.B. Barber

    -
    -

    » Geom - Global -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -

    Index to stat.c and -stat.h

    - - -

    »stat.h types

    -
      -
    • intrealT union of -integer and real
    • -
    • qhstat global data -structure for statistics
    • -
    -

    »stat.h -constants

    -
      -
    • qh_KEEPstatistics 0 turns off most statistics
    • -
    • Z..., W... integer (Z) and real (W) statistics -
    • -
    • ZZstat Z.../W... statistics that -remain defined if qh_KEEPstatistics=0 -
    • -
    • ztype zdoc, zinc, etc. -for definining statistics
    • -
    -

    »stat.h macros

    -
      -
    • MAYdebugx called -frequently for error trapping
    • -
    • zadd_/wadd_ add value -to an integer or real statistic
    • -
    • zdef_ define a -statistic
    • -
    • zinc_ increment an -integer statistic
    • -
    • zmax_/wmax_ update -integer or real maximum statistic
    • -
    • zmin_/wmin_ update -integer or real minimum statistic
    • -
    • zval_/wval_ set or -return value of a statistic
    • -
    - -

    »stat.c -functions

    - - -

    -
    -

    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: Geom • -GlobalIo -• MemMerge -• PolyQhull -• SetStat -• User
    -

    -

    -
    -

    The -Geometry Center Home Page

    -

    Comments to: qhull@qhull.org -
    -Created: May 2, 1997 --- Last modified: see top

    - - diff --git a/src/qhull/src/libqhull/qh-user.htm b/src/qhull/src/libqhull/qh-user.htm deleted file mode 100644 index 6682f4b2fbe..00000000000 --- a/src/qhull/src/libqhull/qh-user.htm +++ /dev/null @@ -1,271 +0,0 @@ - - - - -user.c -- user-definable operations - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -
    -

    user.c -- user-definable operations

    -
    -

    This section contains functions and constants that the -user may want to change.

    - -
    -

    Copyright © 1995-2015 C.B. Barber

    -
    -

    » Geom - Global -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -

    Index to user.c, usermem.c, userprintf.c, userprintf_rbox.c and -user.h

    - - -

    »Qhull library constants

    - - - -

    »user.h data -types and configuration macros

    - - -

    »definition constants

    -
      -
    • qh_DEFAULTbox -define default box size for rbox, 'Qbb', and 'QbB' (Geomview expects 0.5)
    • -
    • qh_INFINITE on -output, indicates Voronoi center at infinity
    • -
    • qh_ORIENTclock -define convention for orienting facets
    • -
    • qh_ZEROdelaunay -define facets that are ignored in Delaunay triangulations
    • -
    - -

    »joggle constants

    - - -

    »performance -related constants

    - - -

    »memory constants

    - - -

    »conditional compilation

    -
      -
    • compiler defined symbols, -e.g., _STDC_ and _cplusplus - -
    • qh_COMPUTEfurthest - compute furthest distance to an outside point instead of storing it with the facet -
    • qh_KEEPstatistics - enable statistic gathering and reporting with option 'Ts' -
    • qh_MAXoutside -record outer plane for each facet -
    • qh_NOmerge -disable facet merging -
    • qh_NOtrace -disable tracing with option 'T4' -
    • qh_QHpointer -access global data with pointer or static structure -
    • qh_QUICKhelp -use abbreviated help messages, e.g., for degenerate inputs -
    - -

    »merge -constants

    - - -

    »user.c -functions

    - - -

    »usermem.c -functions

    -
      -
    • qh_exit exit program, same as exit(). May be redefined as throw "QH10003.." by libqhullcpp/usermem_r-cpp.cpp
    • -
    • qh_fprintf_stderr print to stderr when qh.ferr is not defined.
    • -
    • qh_free free memory, same as free().
    • -
    • qh_malloc allocate memory, same as malloc()
    • -
    - -

    »userprintf.c - and userprintf_rbox,c functions

    -
      -
    • qh_fprintf print -information from Qhull, sames as fprintf().
    • -
    • qh_fprintf_rbox print -information from Rbox, sames as fprintf().
    • -
    - -

    -
    -

    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: Geom • -GlobalIo -• MemMerge -• PolyQhull -• SetStat -• User
    -

    -

    -
    -

    The -Geometry Center Home Page

    -

    Comments to: qhull@qhull.org -
    -Created: May 2, 1997 --- Last modified: see top

    - - diff --git a/src/qhull/src/libqhull/qhull-exports.def b/src/qhull/src/libqhull/qhull-exports.def deleted file mode 100644 index 11a42b57eef..00000000000 --- a/src/qhull/src/libqhull/qhull-exports.def +++ /dev/null @@ -1,417 +0,0 @@ -; qhull-exports.def -- msvc module-definition file -; -; Generated from depends.exe by cut-and-paste of exported symbols by mingw gcc -; [mar'11] 399 symbols -; Annotate as DATA qh_last_random qh_qh qh_qhstat qhmem rbox rbox_inuse -; Annotate as __declspec for outside access in win32 -- qh_qh qh_qhstat -; Same as ../libqhullp/qhull_p-exports.def without qh_save_qhull and qh_restore_qhull -; -; $Id: //main/2015/qhull/src/libqhull/qhull-exports.def#3 $$Change: 2047 $ -; $DateTime: 2016/01/04 22:03:18 $$Author: bbarber $ -; -; Define qhull_VERSION in CMakeLists.txt, Makefile, qhull-exports.def, qhull_p-exports.def, qhull_r-exports.def, and qhull-warn.pri -VERSION 7.0 -EXPORTS -qh_addhash -qh_addpoint -qh_all_merges -qh_allstatA -qh_allstatB -qh_allstatC -qh_allstatD -qh_allstatE -qh_allstatE2 -qh_allstatF -qh_allstatG -qh_allstatH -qh_allstatI -qh_allstatistics -qh_appendfacet -qh_appendmergeset -qh_appendprint -qh_appendvertex -qh_argv_to_command -qh_argv_to_command_size -qh_attachnewfacets -qh_backnormal -qh_basevertices -qh_build_withrestart -qh_buildhull -qh_buildtracing -qh_check_bestdist -qh_check_dupridge -qh_check_maxout -qh_check_output -qh_check_point -qh_check_points -qh_checkconnect -qh_checkconvex -qh_checkfacet -qh_checkflags -qh_checkflipped -qh_checkflipped_all -qh_checkpolygon -qh_checkvertex -qh_checkzero -qh_clear_outputflags -qh_clearcenters -qh_clock -qh_collectstatistics -qh_compare_facetarea -qh_compare_facetmerge -qh_compare_facetvisit -qh_compare_vertexpoint -qh_compareangle -qh_comparemerge -qh_comparevisit -qh_copyfilename -qh_copynonconvex -qh_copypoints -qh_countfacets -qh_createsimplex -qh_crossproduct -qh_degen_redundant_facet -qh_degen_redundant_neighbors -qh_deletevisible -qh_delfacet -qh_delridge -qh_delvertex -qh_determinant -qh_detjoggle -qh_detroundoff -qh_detsimplex -qh_detvnorm -qh_detvridge -qh_detvridge3 -qh_dfacet -qh_distnorm -qh_distplane -qh_distround -qh_divzero -qh_dvertex -qh_eachvoronoi -qh_eachvoronoi_all -qh_errexit -qh_errexit2 -qh_errexit_rbox -qh_errprint -qh_exit -qh_facet2point -qh_facet3vertex -qh_facetarea -qh_facetarea_simplex -qh_facetcenter -qh_facetintersect -qh_facetvertices -qh_find_newvertex -qh_findbest -qh_findbest_test -qh_findbestfacet -qh_findbesthorizon -qh_findbestlower -qh_findbestneighbor -qh_findbestnew -qh_findfacet_all -qh_findgood -qh_findgood_all -qh_findgooddist -qh_findhorizon -qh_flippedmerges -qh_forcedmerges -qh_fprintf -qh_fprintf_rbox -qh_fprintf_stderr -qh_free -qh_freebuffers -qh_freebuild -qh_freeqhull -qh_freeqhull2 -qh_freestatistics -qh_furthestnext -qh_furthestout -qh_gausselim -qh_geomplanes -qh_getangle -qh_getarea -qh_getcenter -qh_getcentrum -qh_getdistance -qh_gethash -qh_getmergeset -qh_getmergeset_initial -qh_gram_schmidt -qh_hashridge -qh_hashridge_find -qh_infiniteloop -qh_init_A -qh_init_B -qh_init_qhull_command -qh_initbuild -qh_initflags -qh_initialhull -qh_initialvertices -qh_initqhull_buffers -qh_initqhull_globals -qh_initqhull_mem -qh_initqhull_outputflags -qh_initqhull_start -qh_initqhull_start2 -qh_initstatistics -qh_initthresholds -qh_inthresholds -qh_isvertex -qh_joggleinput -; Mark as DATA, otherwise links a separate qh_last_random. No __declspec. -qh_last_random DATA -qh_lib_check -qh_makenew_nonsimplicial -qh_makenew_simplicial -qh_makenewfacet -qh_makenewfacets -qh_makenewplanes -qh_makeridges -qh_malloc -qh_mark_dupridges -qh_markkeep -qh_markvoronoi -qh_matchduplicates -qh_matchneighbor -qh_matchnewfacets -qh_matchvertices -qh_maxabsval -qh_maxmin -qh_maxouter -qh_maxsimplex -qh_maydropneighbor -qh_memalloc -qh_memfree -qh_memfreeshort -qh_meminit -qh_meminitbuffers -qh_memsetup -qh_memsize -qh_memstatistics -qh_memtotal -qh_merge_degenredundant -qh_merge_nonconvex -qh_mergecycle -qh_mergecycle_all -qh_mergecycle_facets -qh_mergecycle_neighbors -qh_mergecycle_ridges -qh_mergecycle_vneighbors -qh_mergefacet -qh_mergefacet2d -qh_mergeneighbors -qh_mergeridges -qh_mergesimplex -qh_mergevertex_del -qh_mergevertex_neighbors -qh_mergevertices -qh_minabsval -qh_mindiff -qh_nearcoplanar -qh_nearvertex -qh_neighbor_intersections -qh_new_qhull -qh_newfacet -qh_newhashtable -qh_newridge -qh_newstats -qh_newvertex -qh_newvertices -qh_nextfurthest -qh_nextridge3d -qh_normalize -qh_normalize2 -qh_nostatistic -qh_option -qh_order_vertexneighbors -qh_orientoutside -qh_out1 -qh_out2n -qh_out3n -qh_outcoplanar -qh_outerinner -qh_partitionall -qh_partitioncoplanar -qh_partitionpoint -qh_partitionvisible -qh_point -qh_point_add -qh_pointdist -qh_pointfacet -qh_pointid -qh_pointvertex -qh_postmerge -qh_precision -qh_premerge -qh_prepare_output -qh_prependfacet -qh_printafacet -qh_printallstatistics -qh_printbegin -qh_printcenter -qh_printcentrum -qh_printend -qh_printend4geom -qh_printextremes -qh_printextremes_2d -qh_printextremes_d -qh_printfacet -qh_printfacet2geom -qh_printfacet2geom_points -qh_printfacet2math -qh_printfacet3geom_nonsimplicial -qh_printfacet3geom_points -qh_printfacet3geom_simplicial -qh_printfacet3math -qh_printfacet3vertex -qh_printfacet4geom_nonsimplicial -qh_printfacet4geom_simplicial -qh_printfacetNvertex_nonsimplicial -qh_printfacetNvertex_simplicial -qh_printfacetheader -qh_printfacetlist -qh_printfacetridges -qh_printfacets -qh_printhashtable -qh_printhelp_degenerate -qh_printhelp_narrowhull -qh_printhelp_singular -qh_printhyperplaneintersection -qh_printline3geom -qh_printlists -qh_printmatrix -qh_printneighborhood -qh_printpoint -qh_printpoint3 -qh_printpointid -qh_printpoints -qh_printpoints_out -qh_printpointvect -qh_printpointvect2 -qh_printridge -qh_printspheres -qh_printstatistics -qh_printstatlevel -qh_printstats -qh_printsummary -qh_printvdiagram -qh_printvdiagram2 -qh_printvertex -qh_printvertexlist -qh_printvertices -qh_printvneighbors -qh_printvnorm -qh_printvoronoi -qh_printvridge -qh_produce_output -qh_produce_output2 -qh_projectdim3 -qh_projectinput -qh_projectpoint -qh_projectpoints -; Mark as DATA, otherwise links a separate qh_qh. qh_qh and qh_qhstat requires __declspec -qh_qh DATA -qh_qhstat DATA -qh_qhull -qh_rand -qh_randomfactor -qh_randommatrix -qh_rboxpoints -qh_readfeasible -qh_readpoints -qh_reducevertices -qh_redundant_vertex -qh_remove_extravertices -qh_removefacet -qh_removevertex -qh_rename_sharedvertex -qh_renameridgevertex -qh_renamevertex -qh_resetlists -qh_rotateinput -qh_rotatepoints -qh_roundi -qh_scaleinput -qh_scalelast -qh_scalepoints -qh_setaddnth -qh_setaddsorted -qh_setappend -qh_setappend2ndlast -qh_setappend_set -qh_setcheck -qh_setcompact -qh_setcopy -qh_setdel -qh_setdelaunay -qh_setdellast -qh_setdelnth -qh_setdelnthsorted -qh_setdelsorted -qh_setduplicate -qh_setequal -qh_setequal_except -qh_setequal_skip -qh_setfacetplane -qh_setfeasible -qh_setfree -qh_setfree2 -qh_setfreelong -qh_sethalfspace -qh_sethalfspace_all -qh_sethyperplane_det -qh_sethyperplane_gauss -qh_setin -qh_setindex -qh_setlarger -qh_setlast -qh_setnew -qh_setnew_delnthsorted -qh_setprint -qh_setreplace -qh_setsize -qh_settemp -qh_settempfree -qh_settempfree_all -qh_settemppop -qh_settemppush -qh_settruncate -qh_setunique -qh_setvoronoi_all -qh_setzero -qh_sharpnewfacets -qh_skipfacet -qh_skipfilename -qh_srand -qh_stddev -qh_strtod -qh_strtol -qh_test_appendmerge -qh_test_vneighbors -qh_tracemerge -qh_tracemerging -qh_triangulate -qh_triangulate_facet -qh_triangulate_link -qh_triangulate_mirror -qh_triangulate_null -qh_updatetested -qh_updatevertices -qh_user_memsizes -qh_version -qh_version2 -qh_vertexintersect -qh_vertexintersect_new -qh_vertexneighbors -qh_vertexridges -qh_vertexridges_facet -qh_vertexsubset -qh_voronoi_center -qh_willdelete -; Mark as DATA, otherwise links a separate qhmem. No __declspec -qhmem DATA -rbox DATA -rbox_inuse DATA diff --git a/src/qhull/src/libqhull/qhull_a.h b/src/qhull/src/libqhull/qhull_a.h deleted file mode 100644 index 729b7232768..00000000000 --- a/src/qhull/src/libqhull/qhull_a.h +++ /dev/null @@ -1,150 +0,0 @@ -/*
      ---------------------------------
    -
    -   qhull_a.h
    -   all header files for compiling qhull with non-reentrant code
    -   included before C++ headers for user_r.h:QHULL_CRTDBG
    -
    -   see qh-qhull.htm
    -
    -   see libqhull.h for user-level definitions
    -
    -   see user.h for user-definable constants
    -
    -   defines internal functions for libqhull.c global.c
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull/qhull_a.h#4 $$Change: 2064 $
    -   $DateTime: 2016/01/18 12:36:08 $$Author: bbarber $
    -
    -   Notes:  grep for ((" and (" to catch fprintf("lkasdjf");
    -           full parens around (x?y:z)
    -           use '#include "libqhull/qhull_a.h"' to avoid name clashes
    -*/
    -
    -#ifndef qhDEFqhulla
    -#define qhDEFqhulla 1
    -
    -#include "libqhull.h"  /* Includes user_r.h and data types */
    -
    -#include "stat.h"
    -#include "random.h"
    -#include "mem.h"
    -#include "qset.h"
    -#include "geom.h"
    -#include "merge.h"
    -#include "poly.h"
    -#include "io.h"
    -
    -#include 
    -#include 
    -#include 
    -#include     /* some compilers will not need float.h */
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -/*** uncomment here and qset.c
    -     if string.h does not define memcpy()
    -#include 
    -*/
    -
    -#if qh_CLOCKtype == 2  /* defined in user.h from libqhull.h */
    -#include 
    -#include 
    -#include 
    -#endif
    -
    -#ifdef _MSC_VER  /* Microsoft Visual C++ -- warning level 4 */
    -#pragma warning( disable : 4100)  /* unreferenced formal parameter */
    -#pragma warning( disable : 4127)  /* conditional expression is constant */
    -#pragma warning( disable : 4706)  /* assignment within conditional function */
    -#pragma warning( disable : 4996)  /* function was declared deprecated(strcpy, localtime, etc.) */
    -#endif
    -
    -/* ======= -macros- =========== */
    -
    -/*----------------------------------
    -
    -  traceN((qh ferr, 0Nnnn, "format\n", vars));
    -    calls qh_fprintf if qh.IStracing >= N
    -
    -    Add debugging traps to the end of qh_fprintf
    -
    -  notes:
    -    removing tracing reduces code size but doesn't change execution speed
    -*/
    -#ifndef qh_NOtrace
    -#define trace0(args) {if (qh IStracing) qh_fprintf args;}
    -#define trace1(args) {if (qh IStracing >= 1) qh_fprintf args;}
    -#define trace2(args) {if (qh IStracing >= 2) qh_fprintf args;}
    -#define trace3(args) {if (qh IStracing >= 3) qh_fprintf args;}
    -#define trace4(args) {if (qh IStracing >= 4) qh_fprintf args;}
    -#define trace5(args) {if (qh IStracing >= 5) qh_fprintf args;}
    -#else /* qh_NOtrace */
    -#define trace0(args) {}
    -#define trace1(args) {}
    -#define trace2(args) {}
    -#define trace3(args) {}
    -#define trace4(args) {}
    -#define trace5(args) {}
    -#endif /* qh_NOtrace */
    -
    -/*----------------------------------
    -
    -  Define an unused variable to avoid compiler warnings
    -
    -  Derived from Qt's corelib/global/qglobal.h
    -
    -*/
    -
    -#if defined(__cplusplus) && defined(__INTEL_COMPILER) && !defined(QHULL_OS_WIN)
    -template 
    -inline void qhullUnused(T &x) { (void)x; }
    -#  define QHULL_UNUSED(x) qhullUnused(x);
    -#else
    -#  define QHULL_UNUSED(x) (void)x;
    -#endif
    -
    -/***** -libqhull.c prototypes (alphabetical after qhull) ********************/
    -
    -void    qh_qhull(void);
    -boolT   qh_addpoint(pointT *furthest, facetT *facet, boolT checkdist);
    -void    qh_buildhull(void);
    -void    qh_buildtracing(pointT *furthest, facetT *facet);
    -void    qh_build_withrestart(void);
    -void    qh_errexit2(int exitcode, facetT *facet, facetT *otherfacet);
    -void    qh_findhorizon(pointT *point, facetT *facet, int *goodvisible,int *goodhorizon);
    -pointT *qh_nextfurthest(facetT **visible);
    -void    qh_partitionall(setT *vertices, pointT *points,int npoints);
    -void    qh_partitioncoplanar(pointT *point, facetT *facet, realT *dist);
    -void    qh_partitionpoint(pointT *point, facetT *facet);
    -void    qh_partitionvisible(boolT allpoints, int *numpoints);
    -void    qh_precision(const char *reason);
    -void    qh_printsummary(FILE *fp);
    -
    -/***** -global.c internal prototypes (alphabetical) ***********************/
    -
    -void    qh_appendprint(qh_PRINT format);
    -void    qh_freebuild(boolT allmem);
    -void    qh_freebuffers(void);
    -void    qh_initbuffers(coordT *points, int numpoints, int dim, boolT ismalloc);
    -
    -/***** -stat.c internal prototypes (alphabetical) ***********************/
    -
    -void    qh_allstatA(void);
    -void    qh_allstatB(void);
    -void    qh_allstatC(void);
    -void    qh_allstatD(void);
    -void    qh_allstatE(void);
    -void    qh_allstatE2(void);
    -void    qh_allstatF(void);
    -void    qh_allstatG(void);
    -void    qh_allstatH(void);
    -void    qh_freebuffers(void);
    -void    qh_initbuffers(coordT *points, int numpoints, int dim, boolT ismalloc);
    -
    -#endif /* qhDEFqhulla */
    diff --git a/src/qhull/src/libqhull/qhull_p-exports.def b/src/qhull/src/libqhull/qhull_p-exports.def
    deleted file mode 100644
    index cadf8a4fa28..00000000000
    --- a/src/qhull/src/libqhull/qhull_p-exports.def
    +++ /dev/null
    @@ -1,418 +0,0 @@
    -; qhull_p-exports.def -- msvc module-definition file
    -;
    -;   Generated from depends.exe by cut-and-paste of exported symbols by mingw gcc
    -;   [mar'11] 399 symbols [jan'15] added 3 symbols
    -;   Annotate as DATA qh_last_random qh_qh qh_qhstat qhmem rbox rbox_inuse
    -;   Annotate as __declspec for outside access in win32 -- qh_qh qh_qhstat
    -;
    -; $Id: //main/2011/qhull/src/libqhull/qhull-exports.def#2 $$Change: 1368 $
    -; $DateTime: 2011/04/16 08:12:32 $$Author: bbarber $
    -;
    -; Define qhull_VERSION in CMakeLists.txt, Makefile, qhull-exports.def, qhull_p-exports.def, qhull_r-exports.def, and qhull-warn.pri
    -VERSION 7.0
    -EXPORTS
    -qh_addhash
    -qh_addpoint
    -qh_all_merges
    -qh_allstatA
    -qh_allstatB
    -qh_allstatC
    -qh_allstatD
    -qh_allstatE
    -qh_allstatE2
    -qh_allstatF
    -qh_allstatG
    -qh_allstatH
    -qh_allstatI
    -qh_allstatistics
    -qh_appendfacet
    -qh_appendmergeset
    -qh_appendprint
    -qh_appendvertex
    -qh_argv_to_command
    -qh_argv_to_command_size
    -qh_attachnewfacets
    -qh_backnormal
    -qh_basevertices
    -qh_build_withrestart
    -qh_buildhull
    -qh_buildtracing
    -qh_check_bestdist
    -qh_check_dupridge
    -qh_check_maxout
    -qh_check_output
    -qh_check_point
    -qh_check_points
    -qh_checkconnect
    -qh_checkconvex
    -qh_checkfacet
    -qh_checkflags
    -qh_checkflipped
    -qh_checkflipped_all
    -qh_checkpolygon
    -qh_checkvertex
    -qh_checkzero
    -qh_clear_outputflags
    -qh_clearcenters
    -qh_clock
    -qh_collectstatistics
    -qh_compare_facetarea
    -qh_compare_facetmerge
    -qh_compare_facetvisit
    -qh_compare_vertexpoint
    -qh_compareangle
    -qh_comparemerge
    -qh_comparevisit
    -qh_copyfilename
    -qh_copynonconvex
    -qh_copypoints
    -qh_countfacets
    -qh_createsimplex
    -qh_crossproduct
    -qh_degen_redundant_facet
    -qh_degen_redundant_neighbors
    -qh_deletevisible
    -qh_delfacet
    -qh_delridge
    -qh_delvertex
    -qh_determinant
    -qh_detjoggle
    -qh_detroundoff
    -qh_detsimplex
    -qh_detvnorm
    -qh_detvridge
    -qh_detvridge3
    -qh_dfacet
    -qh_distnorm
    -qh_distplane
    -qh_distround
    -qh_divzero
    -qh_dvertex
    -qh_eachvoronoi
    -qh_eachvoronoi_all
    -qh_errexit
    -qh_errexit2
    -qh_errexit_rbox
    -qh_errprint
    -qh_exit
    -qh_facet2point
    -qh_facet3vertex
    -qh_facetarea
    -qh_facetarea_simplex
    -qh_facetcenter
    -qh_facetintersect
    -qh_facetvertices
    -qh_find_newvertex
    -qh_findbest
    -qh_findbest_test
    -qh_findbestfacet
    -qh_findbesthorizon
    -qh_findbestlower
    -qh_findbestneighbor
    -qh_findbestnew
    -qh_findfacet_all
    -qh_findgood
    -qh_findgood_all
    -qh_findgooddist
    -qh_findhorizon
    -qh_flippedmerges
    -qh_forcedmerges
    -qh_fprintf
    -qh_fprintf_rbox
    -qh_fprintf_stderr
    -qh_free
    -qh_freebuffers
    -qh_freebuild
    -qh_freeqhull
    -qh_freeqhull2
    -qh_freestatistics
    -qh_furthestnext
    -qh_furthestout
    -qh_gausselim
    -qh_geomplanes
    -qh_getangle
    -qh_getarea
    -qh_getcenter
    -qh_getcentrum
    -qh_getdistance
    -qh_gethash
    -qh_getmergeset
    -qh_getmergeset_initial
    -qh_gram_schmidt
    -qh_hashridge
    -qh_hashridge_find
    -qh_infiniteloop
    -qh_init_A
    -qh_init_B
    -qh_init_qhull_command
    -qh_initbuild
    -qh_initflags
    -qh_initialhull
    -qh_initialvertices
    -qh_initqhull_buffers
    -qh_initqhull_globals
    -qh_initqhull_mem
    -qh_initqhull_outputflags
    -qh_initqhull_start
    -qh_initqhull_start2
    -qh_initstatistics
    -qh_initthresholds
    -qh_inthresholds
    -qh_isvertex
    -qh_joggleinput
    -; Mark as DATA, otherwise links a separate qh_last_random.  No __declspec.
    -qh_last_random      DATA
    -qh_lib_check
    -qh_makenew_nonsimplicial
    -qh_makenew_simplicial
    -qh_makenewfacet
    -qh_makenewfacets
    -qh_makenewplanes
    -qh_makeridges
    -qh_malloc
    -qh_mark_dupridges
    -qh_markkeep
    -qh_markvoronoi
    -qh_matchduplicates
    -qh_matchneighbor
    -qh_matchnewfacets
    -qh_matchvertices
    -qh_maxabsval
    -qh_maxmin
    -qh_maxouter
    -qh_maxsimplex
    -qh_maydropneighbor
    -qh_memalloc
    -qh_memfree
    -qh_memfreeshort
    -qh_meminit
    -qh_meminitbuffers
    -qh_memsetup
    -qh_memsize
    -qh_memstatistics
    -qh_memtotal
    -qh_merge_degenredundant
    -qh_merge_nonconvex
    -qh_mergecycle
    -qh_mergecycle_all
    -qh_mergecycle_facets
    -qh_mergecycle_neighbors
    -qh_mergecycle_ridges
    -qh_mergecycle_vneighbors
    -qh_mergefacet
    -qh_mergefacet2d
    -qh_mergeneighbors
    -qh_mergeridges
    -qh_mergesimplex
    -qh_mergevertex_del
    -qh_mergevertex_neighbors
    -qh_mergevertices
    -qh_minabsval
    -qh_mindiff
    -qh_nearcoplanar
    -qh_nearvertex
    -qh_neighbor_intersections
    -qh_new_qhull
    -qh_newfacet
    -qh_newhashtable
    -qh_newridge
    -qh_newstats
    -qh_newvertex
    -qh_newvertices
    -qh_nextfurthest
    -qh_nextridge3d
    -qh_normalize
    -qh_normalize2
    -qh_nostatistic
    -qh_option
    -qh_order_vertexneighbors
    -qh_orientoutside
    -qh_out1
    -qh_out2n
    -qh_out3n
    -qh_outcoplanar
    -qh_outerinner
    -qh_partitionall
    -qh_partitioncoplanar
    -qh_partitionpoint
    -qh_partitionvisible
    -qh_point
    -qh_point_add
    -qh_pointdist
    -qh_pointfacet
    -qh_pointid
    -qh_pointvertex
    -qh_postmerge
    -qh_precision
    -qh_premerge
    -qh_prepare_output
    -qh_prependfacet
    -qh_printafacet
    -qh_printallstatistics
    -qh_printbegin
    -qh_printcenter
    -qh_printcentrum
    -qh_printend
    -qh_printend4geom
    -qh_printextremes
    -qh_printextremes_2d
    -qh_printextremes_d
    -qh_printfacet
    -qh_printfacet2geom
    -qh_printfacet2geom_points
    -qh_printfacet2math
    -qh_printfacet3geom_nonsimplicial
    -qh_printfacet3geom_points
    -qh_printfacet3geom_simplicial
    -qh_printfacet3math
    -qh_printfacet3vertex
    -qh_printfacet4geom_nonsimplicial
    -qh_printfacet4geom_simplicial
    -qh_printfacetNvertex_nonsimplicial
    -qh_printfacetNvertex_simplicial
    -qh_printfacetheader
    -qh_printfacetlist
    -qh_printfacetridges
    -qh_printfacets
    -qh_printhashtable
    -qh_printhelp_degenerate
    -qh_printhelp_narrowhull
    -qh_printhelp_singular
    -qh_printhyperplaneintersection
    -qh_printline3geom
    -qh_printlists
    -qh_printmatrix
    -qh_printneighborhood
    -qh_printpoint
    -qh_printpoint3
    -qh_printpointid
    -qh_printpoints
    -qh_printpoints_out
    -qh_printpointvect
    -qh_printpointvect2
    -qh_printridge
    -qh_printspheres
    -qh_printstatistics
    -qh_printstatlevel
    -qh_printstats
    -qh_printsummary
    -qh_printvdiagram
    -qh_printvdiagram2
    -qh_printvertex
    -qh_printvertexlist
    -qh_printvertices
    -qh_printvneighbors
    -qh_printvnorm
    -qh_printvoronoi
    -qh_printvridge
    -qh_produce_output
    -qh_produce_output2
    -qh_projectdim3
    -qh_projectinput
    -qh_projectpoint
    -qh_projectpoints
    -; Mark as DATA, otherwise links a separate qh_qh.  qh_qh and qh_qhstat requires __declspec
    -qh_qh               DATA
    -qh_qhstat           DATA
    -qh_qhull
    -qh_rand
    -qh_randomfactor
    -qh_randommatrix
    -qh_rboxpoints
    -qh_readfeasible
    -qh_readpoints
    -qh_reducevertices
    -qh_redundant_vertex
    -qh_remove_extravertices
    -qh_removefacet
    -qh_removevertex
    -qh_rename_sharedvertex
    -qh_renameridgevertex
    -qh_renamevertex
    -qh_resetlists
    -qh_restore_qhull
    -qh_rotateinput
    -qh_rotatepoints
    -qh_roundi
    -qh_save_qhull
    -qh_scaleinput
    -qh_scalelast
    -qh_scalepoints
    -qh_setaddnth
    -qh_setaddsorted
    -qh_setappend
    -qh_setappend2ndlast
    -qh_setappend_set
    -qh_setcheck
    -qh_setcompact
    -qh_setcopy
    -qh_setdel
    -qh_setdelaunay
    -qh_setdellast
    -qh_setdelnth
    -qh_setdelnthsorted
    -qh_setdelsorted
    -qh_setduplicate
    -qh_setequal
    -qh_setequal_except
    -qh_setequal_skip
    -qh_setfacetplane
    -qh_setfeasible
    -qh_setfree
    -qh_setfree2
    -qh_setfreelong
    -qh_sethalfspace
    -qh_sethalfspace_all
    -qh_sethyperplane_det
    -qh_sethyperplane_gauss
    -qh_setin
    -qh_setindex
    -qh_setlarger
    -qh_setlast
    -qh_setnew
    -qh_setnew_delnthsorted
    -qh_setprint
    -qh_setreplace
    -qh_setsize
    -qh_settemp
    -qh_settempfree
    -qh_settempfree_all
    -qh_settemppop
    -qh_settemppush
    -qh_settruncate
    -qh_setunique
    -qh_setvoronoi_all
    -qh_setzero
    -qh_sharpnewfacets
    -qh_skipfacet
    -qh_skipfilename
    -qh_srand
    -qh_stddev
    -qh_strtod
    -qh_strtol
    -qh_test_appendmerge
    -qh_test_vneighbors
    -qh_tracemerge
    -qh_tracemerging
    -qh_triangulate
    -qh_triangulate_facet
    -qh_triangulate_link
    -qh_triangulate_mirror
    -qh_triangulate_null
    -qh_updatetested
    -qh_updatevertices
    -qh_user_memsizes
    -qh_version
    -qh_version2
    -qh_vertexintersect
    -qh_vertexintersect_new
    -qh_vertexneighbors
    -qh_vertexridges
    -qh_vertexridges_facet
    -qh_vertexsubset
    -qh_voronoi_center
    -qh_willdelete
    -; Mark as DATA, otherwise links a separate qhmem.  No __declspec
    -qhmem                   DATA
    -rbox			DATA
    -rbox_inuse              DATA
    diff --git a/src/qhull/src/libqhull/qset.c b/src/qhull/src/libqhull/qset.c
    deleted file mode 100644
    index a969252a759..00000000000
    --- a/src/qhull/src/libqhull/qset.c
    +++ /dev/null
    @@ -1,1340 +0,0 @@
    -/*
      ---------------------------------
    -
    -   qset.c
    -   implements set manipulations needed for quickhull
    -
    -   see qh-set.htm and qset.h
    -
    -   Be careful of strict aliasing (two pointers of different types
    -   that reference the same location).  The last slot of a set is
    -   either the actual size of the set plus 1, or the NULL terminator
    -   of the set (i.e., setelemT).
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull/qset.c#3 $$Change: 2062 $
    -   $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    -*/
    -
    -#include "user.h" /* for QHULL_CRTDBG */
    -#include "qset.h"
    -#include "mem.h"
    -#include 
    -#include 
    -/*** uncomment here and qhull_a.h
    -     if string.h does not define memcpy()
    -#include 
    -*/
    -
    -#ifndef qhDEFlibqhull
    -typedef struct ridgeT ridgeT;
    -typedef struct facetT facetT;
    -void    qh_errexit(int exitcode, facetT *, ridgeT *);
    -void    qh_fprintf(FILE *fp, int msgcode, const char *fmt, ... );
    -#  ifdef _MSC_VER  /* Microsoft Visual C++ -- warning level 4 */
    -#  pragma warning( disable : 4127)  /* conditional expression is constant */
    -#  pragma warning( disable : 4706)  /* assignment within conditional function */
    -#  endif
    -#endif
    -
    -/*=============== internal macros ===========================*/
    -
    -/*============ functions in alphabetical order ===================*/
    -
    -/*----------------------------------
    -
    -  qh_setaddnth( setp, nth, newelem)
    -    adds newelem as n'th element of sorted or unsorted *setp
    -
    -  notes:
    -    *setp and newelem must be defined
    -    *setp may be a temp set
    -    nth=0 is first element
    -    errors if nth is out of bounds
    -
    -  design:
    -    expand *setp if empty or full
    -    move tail of *setp up one
    -    insert newelem
    -*/
    -void qh_setaddnth(setT **setp, int nth, void *newelem) {
    -  int oldsize, i;
    -  setelemT *sizep;          /* avoid strict aliasing */
    -  setelemT *oldp, *newp;
    -
    -  if (!*setp || (sizep= SETsizeaddr_(*setp))->i==0) {
    -    qh_setlarger(setp);
    -    sizep= SETsizeaddr_(*setp);
    -  }
    -  oldsize= sizep->i - 1;
    -  if (nth < 0 || nth > oldsize) {
    -    qh_fprintf(qhmem.ferr, 6171, "qhull internal error (qh_setaddnth): nth %d is out-of-bounds for set:\n", nth);
    -    qh_setprint(qhmem.ferr, "", *setp);
    -    qh_errexit(qhmem_ERRqhull, NULL, NULL);
    -  }
    -  sizep->i++;
    -  oldp= (setelemT *)SETelemaddr_(*setp, oldsize, void);   /* NULL */
    -  newp= oldp+1;
    -  for (i=oldsize-nth+1; i--; )  /* move at least NULL  */
    -    (newp--)->p= (oldp--)->p;       /* may overwrite *sizep */
    -  newp->p= newelem;
    -} /* setaddnth */
    -
    -
    -/*----------------------------------
    -
    -  setaddsorted( setp, newelem )
    -    adds an newelem into sorted *setp
    -
    -  notes:
    -    *setp and newelem must be defined
    -    *setp may be a temp set
    -    nop if newelem already in set
    -
    -  design:
    -    find newelem's position in *setp
    -    insert newelem
    -*/
    -void qh_setaddsorted(setT **setp, void *newelem) {
    -  int newindex=0;
    -  void *elem, **elemp;
    -
    -  FOREACHelem_(*setp) {          /* could use binary search instead */
    -    if (elem < newelem)
    -      newindex++;
    -    else if (elem == newelem)
    -      return;
    -    else
    -      break;
    -  }
    -  qh_setaddnth(setp, newindex, newelem);
    -} /* setaddsorted */
    -
    -
    -/*---------------------------------
    -
    -  qh_setappend( setp, newelem)
    -    append newelem to *setp
    -
    -  notes:
    -    *setp may be a temp set
    -    *setp and newelem may be NULL
    -
    -  design:
    -    expand *setp if empty or full
    -    append newelem to *setp
    -
    -*/
    -void qh_setappend(setT **setp, void *newelem) {
    -  setelemT *sizep;  /* Avoid strict aliasing.  Writing to *endp may overwrite *sizep */
    -  setelemT *endp;
    -  int count;
    -
    -  if (!newelem)
    -    return;
    -  if (!*setp || (sizep= SETsizeaddr_(*setp))->i==0) {
    -    qh_setlarger(setp);
    -    sizep= SETsizeaddr_(*setp);
    -  }
    -  count= (sizep->i)++ - 1;
    -  endp= (setelemT *)SETelemaddr_(*setp, count, void);
    -  (endp++)->p= newelem;
    -  endp->p= NULL;
    -} /* setappend */
    -
    -/*---------------------------------
    -
    -  qh_setappend_set( setp, setA)
    -    appends setA to *setp
    -
    -  notes:
    -    *setp can not be a temp set
    -    *setp and setA may be NULL
    -
    -  design:
    -    setup for copy
    -    expand *setp if it is too small
    -    append all elements of setA to *setp
    -*/
    -void qh_setappend_set(setT **setp, setT *setA) {
    -  int sizeA, size;
    -  setT *oldset;
    -  setelemT *sizep;
    -
    -  if (!setA)
    -    return;
    -  SETreturnsize_(setA, sizeA);
    -  if (!*setp)
    -    *setp= qh_setnew(sizeA);
    -  sizep= SETsizeaddr_(*setp);
    -  if (!(size= sizep->i))
    -    size= (*setp)->maxsize;
    -  else
    -    size--;
    -  if (size + sizeA > (*setp)->maxsize) {
    -    oldset= *setp;
    -    *setp= qh_setcopy(oldset, sizeA);
    -    qh_setfree(&oldset);
    -    sizep= SETsizeaddr_(*setp);
    -  }
    -  if (sizeA > 0) {
    -    sizep->i= size+sizeA+1;   /* memcpy may overwrite */
    -    memcpy((char *)&((*setp)->e[size].p), (char *)&(setA->e[0].p), (size_t)(sizeA+1) * SETelemsize);
    -  }
    -} /* setappend_set */
    -
    -
    -/*---------------------------------
    -
    -  qh_setappend2ndlast( setp, newelem )
    -    makes newelem the next to the last element in *setp
    -
    -  notes:
    -    *setp must have at least one element
    -    newelem must be defined
    -    *setp may be a temp set
    -
    -  design:
    -    expand *setp if empty or full
    -    move last element of *setp up one
    -    insert newelem
    -*/
    -void qh_setappend2ndlast(setT **setp, void *newelem) {
    -    setelemT *sizep;  /* Avoid strict aliasing.  Writing to *endp may overwrite *sizep */
    -    setelemT *endp, *lastp;
    -    int count;
    -
    -    if (!*setp || (sizep= SETsizeaddr_(*setp))->i==0) {
    -        qh_setlarger(setp);
    -        sizep= SETsizeaddr_(*setp);
    -    }
    -    count= (sizep->i)++ - 1;
    -    endp= (setelemT *)SETelemaddr_(*setp, count, void); /* NULL */
    -    lastp= endp-1;
    -    *(endp++)= *lastp;
    -    endp->p= NULL;    /* may overwrite *sizep */
    -    lastp->p= newelem;
    -} /* setappend2ndlast */
    -
    -/*---------------------------------
    -
    -  qh_setcheck( set, typename, id )
    -    check set for validity
    -    report errors with typename and id
    -
    -  design:
    -    checks that maxsize, actual size, and NULL terminator agree
    -*/
    -void qh_setcheck(setT *set, const char *tname, unsigned id) {
    -  int maxsize, size;
    -  int waserr= 0;
    -
    -  if (!set)
    -    return;
    -  SETreturnsize_(set, size);
    -  maxsize= set->maxsize;
    -  if (size > maxsize || !maxsize) {
    -    qh_fprintf(qhmem.ferr, 6172, "qhull internal error (qh_setcheck): actual size %d of %s%d is greater than max size %d\n",
    -             size, tname, id, maxsize);
    -    waserr= 1;
    -  }else if (set->e[size].p) {
    -    qh_fprintf(qhmem.ferr, 6173, "qhull internal error (qh_setcheck): %s%d(size %d max %d) is not null terminated.\n",
    -             tname, id, size-1, maxsize);
    -    waserr= 1;
    -  }
    -  if (waserr) {
    -    qh_setprint(qhmem.ferr, "ERRONEOUS", set);
    -    qh_errexit(qhmem_ERRqhull, NULL, NULL);
    -  }
    -} /* setcheck */
    -
    -
    -/*---------------------------------
    -
    -  qh_setcompact( set )
    -    remove internal NULLs from an unsorted set
    -
    -  returns:
    -    updated set
    -
    -  notes:
    -    set may be NULL
    -    it would be faster to swap tail of set into holes, like qh_setdel
    -
    -  design:
    -    setup pointers into set
    -    skip NULLs while copying elements to start of set
    -    update the actual size
    -*/
    -void qh_setcompact(setT *set) {
    -  int size;
    -  void **destp, **elemp, **endp, **firstp;
    -
    -  if (!set)
    -    return;
    -  SETreturnsize_(set, size);
    -  destp= elemp= firstp= SETaddr_(set, void);
    -  endp= destp + size;
    -  while (1) {
    -    if (!(*destp++ = *elemp++)) {
    -      destp--;
    -      if (elemp > endp)
    -        break;
    -    }
    -  }
    -  qh_settruncate(set, (int)(destp-firstp));   /* WARN64 */
    -} /* setcompact */
    -
    -
    -/*---------------------------------
    -
    -  qh_setcopy( set, extra )
    -    make a copy of a sorted or unsorted set with extra slots
    -
    -  returns:
    -    new set
    -
    -  design:
    -    create a newset with extra slots
    -    copy the elements to the newset
    -
    -*/
    -setT *qh_setcopy(setT *set, int extra) {
    -  setT *newset;
    -  int size;
    -
    -  if (extra < 0)
    -    extra= 0;
    -  SETreturnsize_(set, size);
    -  newset= qh_setnew(size+extra);
    -  SETsizeaddr_(newset)->i= size+1;    /* memcpy may overwrite */
    -  memcpy((char *)&(newset->e[0].p), (char *)&(set->e[0].p), (size_t)(size+1) * SETelemsize);
    -  return(newset);
    -} /* setcopy */
    -
    -
    -/*---------------------------------
    -
    -  qh_setdel( set, oldelem )
    -    delete oldelem from an unsorted set
    -
    -  returns:
    -    returns oldelem if found
    -    returns NULL otherwise
    -
    -  notes:
    -    set may be NULL
    -    oldelem must not be NULL;
    -    only deletes one copy of oldelem in set
    -
    -  design:
    -    locate oldelem
    -    update actual size if it was full
    -    move the last element to the oldelem's location
    -*/
    -void *qh_setdel(setT *set, void *oldelem) {
    -  setelemT *sizep;
    -  setelemT *elemp;
    -  setelemT *lastp;
    -
    -  if (!set)
    -    return NULL;
    -  elemp= (setelemT *)SETaddr_(set, void);
    -  while (elemp->p != oldelem && elemp->p)
    -    elemp++;
    -  if (elemp->p) {
    -    sizep= SETsizeaddr_(set);
    -    if (!(sizep->i)--)         /*  if was a full set */
    -      sizep->i= set->maxsize;  /*     *sizep= (maxsize-1)+ 1 */
    -    lastp= (setelemT *)SETelemaddr_(set, sizep->i-1, void);
    -    elemp->p= lastp->p;      /* may overwrite itself */
    -    lastp->p= NULL;
    -    return oldelem;
    -  }
    -  return NULL;
    -} /* setdel */
    -
    -
    -/*---------------------------------
    -
    -  qh_setdellast( set)
    -    return last element of set or NULL
    -
    -  notes:
    -    deletes element from set
    -    set may be NULL
    -
    -  design:
    -    return NULL if empty
    -    if full set
    -      delete last element and set actual size
    -    else
    -      delete last element and update actual size
    -*/
    -void *qh_setdellast(setT *set) {
    -  int setsize;  /* actually, actual_size + 1 */
    -  int maxsize;
    -  setelemT *sizep;
    -  void *returnvalue;
    -
    -  if (!set || !(set->e[0].p))
    -    return NULL;
    -  sizep= SETsizeaddr_(set);
    -  if ((setsize= sizep->i)) {
    -    returnvalue= set->e[setsize - 2].p;
    -    set->e[setsize - 2].p= NULL;
    -    sizep->i--;
    -  }else {
    -    maxsize= set->maxsize;
    -    returnvalue= set->e[maxsize - 1].p;
    -    set->e[maxsize - 1].p= NULL;
    -    sizep->i= maxsize;
    -  }
    -  return returnvalue;
    -} /* setdellast */
    -
    -
    -/*---------------------------------
    -
    -  qh_setdelnth( set, nth )
    -    deletes nth element from unsorted set
    -    0 is first element
    -
    -  returns:
    -    returns the element (needs type conversion)
    -
    -  notes:
    -    errors if nth invalid
    -
    -  design:
    -    setup points and check nth
    -    delete nth element and overwrite with last element
    -*/
    -void *qh_setdelnth(setT *set, int nth) {
    -  void *elem;
    -  setelemT *sizep;
    -  setelemT *elemp, *lastp;
    -
    -  sizep= SETsizeaddr_(set);
    -  if ((sizep->i--)==0)         /*  if was a full set */
    -      sizep->i= set->maxsize;  /*     *sizep= (maxsize-1)+ 1 */
    -  if (nth < 0 || nth >= sizep->i) {
    -    qh_fprintf(qhmem.ferr, 6174, "qhull internal error (qh_setdelnth): nth %d is out-of-bounds for set:\n", nth);
    -    qh_setprint(qhmem.ferr, "", set);
    -    qh_errexit(qhmem_ERRqhull, NULL, NULL);
    -  }
    -  elemp= (setelemT *)SETelemaddr_(set, nth, void); /* nth valid by QH6174 */
    -  lastp= (setelemT *)SETelemaddr_(set, sizep->i-1, void);
    -  elem= elemp->p;
    -  elemp->p= lastp->p;      /* may overwrite itself */
    -  lastp->p= NULL;
    -  return elem;
    -} /* setdelnth */
    -
    -/*---------------------------------
    -
    -  qh_setdelnthsorted( set, nth )
    -    deletes nth element from sorted set
    -
    -  returns:
    -    returns the element (use type conversion)
    -
    -  notes:
    -    errors if nth invalid
    -
    -  see also:
    -    setnew_delnthsorted
    -
    -  design:
    -    setup points and check nth
    -    copy remaining elements down one
    -    update actual size
    -*/
    -void *qh_setdelnthsorted(setT *set, int nth) {
    -  void *elem;
    -  setelemT *sizep;
    -  setelemT *newp, *oldp;
    -
    -  sizep= SETsizeaddr_(set);
    -  if (nth < 0 || (sizep->i && nth >= sizep->i-1) || nth >= set->maxsize) {
    -    qh_fprintf(qhmem.ferr, 6175, "qhull internal error (qh_setdelnthsorted): nth %d is out-of-bounds for set:\n", nth);
    -    qh_setprint(qhmem.ferr, "", set);
    -    qh_errexit(qhmem_ERRqhull, NULL, NULL);
    -  }
    -  newp= (setelemT *)SETelemaddr_(set, nth, void);
    -  elem= newp->p;
    -  oldp= newp+1;
    -  while (((newp++)->p= (oldp++)->p))
    -    ; /* copy remaining elements and NULL */
    -  if ((sizep->i--)==0)         /*  if was a full set */
    -    sizep->i= set->maxsize;  /*     *sizep= (max size-1)+ 1 */
    -  return elem;
    -} /* setdelnthsorted */
    -
    -
    -/*---------------------------------
    -
    -  qh_setdelsorted( set, oldelem )
    -    deletes oldelem from sorted set
    -
    -  returns:
    -    returns oldelem if it was deleted
    -
    -  notes:
    -    set may be NULL
    -
    -  design:
    -    locate oldelem in set
    -    copy remaining elements down one
    -    update actual size
    -*/
    -void *qh_setdelsorted(setT *set, void *oldelem) {
    -  setelemT *sizep;
    -  setelemT *newp, *oldp;
    -
    -  if (!set)
    -    return NULL;
    -  newp= (setelemT *)SETaddr_(set, void);
    -  while(newp->p != oldelem && newp->p)
    -    newp++;
    -  if (newp->p) {
    -    oldp= newp+1;
    -    while (((newp++)->p= (oldp++)->p))
    -      ; /* copy remaining elements */
    -    sizep= SETsizeaddr_(set);
    -    if ((sizep->i--)==0)    /*  if was a full set */
    -      sizep->i= set->maxsize;  /*     *sizep= (max size-1)+ 1 */
    -    return oldelem;
    -  }
    -  return NULL;
    -} /* setdelsorted */
    -
    -
    -/*---------------------------------
    -
    -  qh_setduplicate( set, elemsize )
    -    duplicate a set of elemsize elements
    -
    -  notes:
    -    use setcopy if retaining old elements
    -
    -  design:
    -    create a new set
    -    for each elem of the old set
    -      create a newelem
    -      append newelem to newset
    -*/
    -setT *qh_setduplicate(setT *set, int elemsize) {
    -  void          *elem, **elemp, *newElem;
    -  setT          *newSet;
    -  int           size;
    -
    -  if (!(size= qh_setsize(set)))
    -    return NULL;
    -  newSet= qh_setnew(size);
    -  FOREACHelem_(set) {
    -    newElem= qh_memalloc(elemsize);
    -    memcpy(newElem, elem, (size_t)elemsize);
    -    qh_setappend(&newSet, newElem);
    -  }
    -  return newSet;
    -} /* setduplicate */
    -
    -
    -/*---------------------------------
    -
    -  qh_setendpointer( set )
    -    Returns pointer to NULL terminator of a set's elements
    -    set can not be NULL
    -
    -*/
    -void **qh_setendpointer(setT *set) {
    -
    -  setelemT *sizep= SETsizeaddr_(set);
    -  int n= sizep->i;
    -  return (n ? &set->e[n-1].p : &sizep->p);
    -} /* qh_setendpointer */
    -
    -/*---------------------------------
    -
    -  qh_setequal( setA, setB )
    -    returns 1 if two sorted sets are equal, otherwise returns 0
    -
    -  notes:
    -    either set may be NULL
    -
    -  design:
    -    check size of each set
    -    setup pointers
    -    compare elements of each set
    -*/
    -int qh_setequal(setT *setA, setT *setB) {
    -  void **elemAp, **elemBp;
    -  int sizeA= 0, sizeB= 0;
    -
    -  if (setA) {
    -    SETreturnsize_(setA, sizeA);
    -  }
    -  if (setB) {
    -    SETreturnsize_(setB, sizeB);
    -  }
    -  if (sizeA != sizeB)
    -    return 0;
    -  if (!sizeA)
    -    return 1;
    -  elemAp= SETaddr_(setA, void);
    -  elemBp= SETaddr_(setB, void);
    -  if (!memcmp((char *)elemAp, (char *)elemBp, sizeA*SETelemsize))
    -    return 1;
    -  return 0;
    -} /* setequal */
    -
    -
    -/*---------------------------------
    -
    -  qh_setequal_except( setA, skipelemA, setB, skipelemB )
    -    returns 1 if sorted setA and setB are equal except for skipelemA & B
    -
    -  returns:
    -    false if either skipelemA or skipelemB are missing
    -
    -  notes:
    -    neither set may be NULL
    -
    -    if skipelemB is NULL,
    -      can skip any one element of setB
    -
    -  design:
    -    setup pointers
    -    search for skipelemA, skipelemB, and mismatches
    -    check results
    -*/
    -int qh_setequal_except(setT *setA, void *skipelemA, setT *setB, void *skipelemB) {
    -  void **elemA, **elemB;
    -  int skip=0;
    -
    -  elemA= SETaddr_(setA, void);
    -  elemB= SETaddr_(setB, void);
    -  while (1) {
    -    if (*elemA == skipelemA) {
    -      skip++;
    -      elemA++;
    -    }
    -    if (skipelemB) {
    -      if (*elemB == skipelemB) {
    -        skip++;
    -        elemB++;
    -      }
    -    }else if (*elemA != *elemB) {
    -      skip++;
    -      if (!(skipelemB= *elemB++))
    -        return 0;
    -    }
    -    if (!*elemA)
    -      break;
    -    if (*elemA++ != *elemB++)
    -      return 0;
    -  }
    -  if (skip != 2 || *elemB)
    -    return 0;
    -  return 1;
    -} /* setequal_except */
    -
    -
    -/*---------------------------------
    -
    -  qh_setequal_skip( setA, skipA, setB, skipB )
    -    returns 1 if sorted setA and setB are equal except for elements skipA & B
    -
    -  returns:
    -    false if different size
    -
    -  notes:
    -    neither set may be NULL
    -
    -  design:
    -    setup pointers
    -    search for mismatches while skipping skipA and skipB
    -*/
    -int qh_setequal_skip(setT *setA, int skipA, setT *setB, int skipB) {
    -  void **elemA, **elemB, **skipAp, **skipBp;
    -
    -  elemA= SETaddr_(setA, void);
    -  elemB= SETaddr_(setB, void);
    -  skipAp= SETelemaddr_(setA, skipA, void);
    -  skipBp= SETelemaddr_(setB, skipB, void);
    -  while (1) {
    -    if (elemA == skipAp)
    -      elemA++;
    -    if (elemB == skipBp)
    -      elemB++;
    -    if (!*elemA)
    -      break;
    -    if (*elemA++ != *elemB++)
    -      return 0;
    -  }
    -  if (*elemB)
    -    return 0;
    -  return 1;
    -} /* setequal_skip */
    -
    -
    -/*---------------------------------
    -
    -  qh_setfree( setp )
    -    frees the space occupied by a sorted or unsorted set
    -
    -  returns:
    -    sets setp to NULL
    -
    -  notes:
    -    set may be NULL
    -
    -  design:
    -    free array
    -    free set
    -*/
    -void qh_setfree(setT **setp) {
    -  int size;
    -  void **freelistp;  /* used if !qh_NOmem by qh_memfree_() */
    -
    -  if (*setp) {
    -    size= sizeof(setT) + ((*setp)->maxsize)*SETelemsize;
    -    if (size <= qhmem.LASTsize) {
    -      qh_memfree_(*setp, size, freelistp);
    -    }else
    -      qh_memfree(*setp, size);
    -    *setp= NULL;
    -  }
    -} /* setfree */
    -
    -
    -/*---------------------------------
    -
    -  qh_setfree2( setp, elemsize )
    -    frees the space occupied by a set and its elements
    -
    -  notes:
    -    set may be NULL
    -
    -  design:
    -    free each element
    -    free set
    -*/
    -void qh_setfree2(setT **setp, int elemsize) {
    -  void          *elem, **elemp;
    -
    -  FOREACHelem_(*setp)
    -    qh_memfree(elem, elemsize);
    -  qh_setfree(setp);
    -} /* setfree2 */
    -
    -
    -
    -/*---------------------------------
    -
    -  qh_setfreelong( setp )
    -    frees a set only if it's in long memory
    -
    -  returns:
    -    sets setp to NULL if it is freed
    -
    -  notes:
    -    set may be NULL
    -
    -  design:
    -    if set is large
    -      free it
    -*/
    -void qh_setfreelong(setT **setp) {
    -  int size;
    -
    -  if (*setp) {
    -    size= sizeof(setT) + ((*setp)->maxsize)*SETelemsize;
    -    if (size > qhmem.LASTsize) {
    -      qh_memfree(*setp, size);
    -      *setp= NULL;
    -    }
    -  }
    -} /* setfreelong */
    -
    -
    -/*---------------------------------
    -
    -  qh_setin( set, setelem )
    -    returns 1 if setelem is in a set, 0 otherwise
    -
    -  notes:
    -    set may be NULL or unsorted
    -
    -  design:
    -    scans set for setelem
    -*/
    -int qh_setin(setT *set, void *setelem) {
    -  void *elem, **elemp;
    -
    -  FOREACHelem_(set) {
    -    if (elem == setelem)
    -      return 1;
    -  }
    -  return 0;
    -} /* setin */
    -
    -
    -/*---------------------------------
    -
    -  qh_setindex( set, atelem )
    -    returns the index of atelem in set.
    -    returns -1, if not in set or maxsize wrong
    -
    -  notes:
    -    set may be NULL and may contain nulls.
    -    NOerrors returned (qh_pointid, QhullPoint::id)
    -
    -  design:
    -    checks maxsize
    -    scans set for atelem
    -*/
    -int qh_setindex(setT *set, void *atelem) {
    -  void **elem;
    -  int size, i;
    -
    -  if (!set)
    -    return -1;
    -  SETreturnsize_(set, size);
    -  if (size > set->maxsize)
    -    return -1;
    -  elem= SETaddr_(set, void);
    -  for (i=0; i < size; i++) {
    -    if (*elem++ == atelem)
    -      return i;
    -  }
    -  return -1;
    -} /* setindex */
    -
    -
    -/*---------------------------------
    -
    -  qh_setlarger( oldsetp )
    -    returns a larger set that contains all elements of *oldsetp
    -
    -  notes:
    -    the set is at least twice as large
    -    if temp set, updates qhmem.tempstack
    -
    -  design:
    -    creates a new set
    -    copies the old set to the new set
    -    updates pointers in tempstack
    -    deletes the old set
    -*/
    -void qh_setlarger(setT **oldsetp) {
    -  int size= 1;
    -  setT *newset, *set, **setp, *oldset;
    -  setelemT *sizep;
    -  setelemT *newp, *oldp;
    -
    -  if (*oldsetp) {
    -    oldset= *oldsetp;
    -    SETreturnsize_(oldset, size);
    -    qhmem.cntlarger++;
    -    qhmem.totlarger += size+1;
    -    newset= qh_setnew(2 * size);
    -    oldp= (setelemT *)SETaddr_(oldset, void);
    -    newp= (setelemT *)SETaddr_(newset, void);
    -    memcpy((char *)newp, (char *)oldp, (size_t)(size+1) * SETelemsize);
    -    sizep= SETsizeaddr_(newset);
    -    sizep->i= size+1;
    -    FOREACHset_((setT *)qhmem.tempstack) {
    -      if (set == oldset)
    -        *(setp-1)= newset;
    -    }
    -    qh_setfree(oldsetp);
    -  }else
    -    newset= qh_setnew(3);
    -  *oldsetp= newset;
    -} /* setlarger */
    -
    -
    -/*---------------------------------
    -
    -  qh_setlast( set )
    -    return last element of set or NULL (use type conversion)
    -
    -  notes:
    -    set may be NULL
    -
    -  design:
    -    return last element
    -*/
    -void *qh_setlast(setT *set) {
    -  int size;
    -
    -  if (set) {
    -    size= SETsizeaddr_(set)->i;
    -    if (!size)
    -      return SETelem_(set, set->maxsize - 1);
    -    else if (size > 1)
    -      return SETelem_(set, size - 2);
    -  }
    -  return NULL;
    -} /* setlast */
    -
    -
    -/*---------------------------------
    -
    -  qh_setnew( setsize )
    -    creates and allocates space for a set
    -
    -  notes:
    -    setsize means the number of elements (!including the NULL terminator)
    -    use qh_settemp/qh_setfreetemp if set is temporary
    -
    -  design:
    -    allocate memory for set
    -    roundup memory if small set
    -    initialize as empty set
    -*/
    -setT *qh_setnew(int setsize) {
    -  setT *set;
    -  int sizereceived; /* used if !qh_NOmem */
    -  int size;
    -  void **freelistp; /* used if !qh_NOmem by qh_memalloc_() */
    -
    -  if (!setsize)
    -    setsize++;
    -  size= sizeof(setT) + setsize * SETelemsize;
    -  if (size>0 && size <= qhmem.LASTsize) {
    -    qh_memalloc_(size, freelistp, set, setT);
    -#ifndef qh_NOmem
    -    sizereceived= qhmem.sizetable[ qhmem.indextable[size]];
    -    if (sizereceived > size)
    -      setsize += (sizereceived - size)/SETelemsize;
    -#endif
    -  }else
    -    set= (setT*)qh_memalloc(size);
    -  set->maxsize= setsize;
    -  set->e[setsize].i= 1;
    -  set->e[0].p= NULL;
    -  return(set);
    -} /* setnew */
    -
    -
    -/*---------------------------------
    -
    -  qh_setnew_delnthsorted( set, size, nth, prepend )
    -    creates a sorted set not containing nth element
    -    if prepend, the first prepend elements are undefined
    -
    -  notes:
    -    set must be defined
    -    checks nth
    -    see also: setdelnthsorted
    -
    -  design:
    -    create new set
    -    setup pointers and allocate room for prepend'ed entries
    -    append head of old set to new set
    -    append tail of old set to new set
    -*/
    -setT *qh_setnew_delnthsorted(setT *set, int size, int nth, int prepend) {
    -  setT *newset;
    -  void **oldp, **newp;
    -  int tailsize= size - nth -1, newsize;
    -
    -  if (tailsize < 0) {
    -    qh_fprintf(qhmem.ferr, 6176, "qhull internal error (qh_setnew_delnthsorted): nth %d is out-of-bounds for set:\n", nth);
    -    qh_setprint(qhmem.ferr, "", set);
    -    qh_errexit(qhmem_ERRqhull, NULL, NULL);
    -  }
    -  newsize= size-1 + prepend;
    -  newset= qh_setnew(newsize);
    -  newset->e[newset->maxsize].i= newsize+1;  /* may be overwritten */
    -  oldp= SETaddr_(set, void);
    -  newp= SETaddr_(newset, void) + prepend;
    -  switch (nth) {
    -  case 0:
    -    break;
    -  case 1:
    -    *(newp++)= *oldp++;
    -    break;
    -  case 2:
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    break;
    -  case 3:
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    break;
    -  case 4:
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    break;
    -  default:
    -    memcpy((char *)newp, (char *)oldp, (size_t)nth * SETelemsize);
    -    newp += nth;
    -    oldp += nth;
    -    break;
    -  }
    -  oldp++;
    -  switch (tailsize) {
    -  case 0:
    -    break;
    -  case 1:
    -    *(newp++)= *oldp++;
    -    break;
    -  case 2:
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    break;
    -  case 3:
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    break;
    -  case 4:
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    break;
    -  default:
    -    memcpy((char *)newp, (char *)oldp, (size_t)tailsize * SETelemsize);
    -    newp += tailsize;
    -  }
    -  *newp= NULL;
    -  return(newset);
    -} /* setnew_delnthsorted */
    -
    -
    -/*---------------------------------
    -
    -  qh_setprint( fp, string, set )
    -    print set elements to fp with identifying string
    -
    -  notes:
    -    never errors
    -*/
    -void qh_setprint(FILE *fp, const char* string, setT *set) {
    -  int size, k;
    -
    -  if (!set)
    -    qh_fprintf(fp, 9346, "%s set is null\n", string);
    -  else {
    -    SETreturnsize_(set, size);
    -    qh_fprintf(fp, 9347, "%s set=%p maxsize=%d size=%d elems=",
    -             string, set, set->maxsize, size);
    -    if (size > set->maxsize)
    -      size= set->maxsize+1;
    -    for (k=0; k < size; k++)
    -      qh_fprintf(fp, 9348, " %p", set->e[k].p);
    -    qh_fprintf(fp, 9349, "\n");
    -  }
    -} /* setprint */
    -
    -/*---------------------------------
    -
    -  qh_setreplace( set, oldelem, newelem )
    -    replaces oldelem in set with newelem
    -
    -  notes:
    -    errors if oldelem not in the set
    -    newelem may be NULL, but it turns the set into an indexed set (no FOREACH)
    -
    -  design:
    -    find oldelem
    -    replace with newelem
    -*/
    -void qh_setreplace(setT *set, void *oldelem, void *newelem) {
    -  void **elemp;
    -
    -  elemp= SETaddr_(set, void);
    -  while (*elemp != oldelem && *elemp)
    -    elemp++;
    -  if (*elemp)
    -    *elemp= newelem;
    -  else {
    -    qh_fprintf(qhmem.ferr, 6177, "qhull internal error (qh_setreplace): elem %p not found in set\n",
    -       oldelem);
    -    qh_setprint(qhmem.ferr, "", set);
    -    qh_errexit(qhmem_ERRqhull, NULL, NULL);
    -  }
    -} /* setreplace */
    -
    -
    -/*---------------------------------
    -
    -  qh_setsize( set )
    -    returns the size of a set
    -
    -  notes:
    -    errors if set's maxsize is incorrect
    -    same as SETreturnsize_(set)
    -    same code for qh_setsize [qset.c] and QhullSetBase::count
    -
    -  design:
    -    determine actual size of set from maxsize
    -*/
    -int qh_setsize(setT *set) {
    -  int size;
    -  setelemT *sizep;
    -
    -  if (!set)
    -    return(0);
    -  sizep= SETsizeaddr_(set);
    -  if ((size= sizep->i)) {
    -    size--;
    -    if (size > set->maxsize) {
    -      qh_fprintf(qhmem.ferr, 6178, "qhull internal error (qh_setsize): current set size %d is greater than maximum size %d\n",
    -               size, set->maxsize);
    -      qh_setprint(qhmem.ferr, "set: ", set);
    -      qh_errexit(qhmem_ERRqhull, NULL, NULL);
    -    }
    -  }else
    -    size= set->maxsize;
    -  return size;
    -} /* setsize */
    -
    -/*---------------------------------
    -
    -  qh_settemp( setsize )
    -    return a stacked, temporary set of upto setsize elements
    -
    -  notes:
    -    use settempfree or settempfree_all to release from qhmem.tempstack
    -    see also qh_setnew
    -
    -  design:
    -    allocate set
    -    append to qhmem.tempstack
    -
    -*/
    -setT *qh_settemp(int setsize) {
    -  setT *newset;
    -
    -  newset= qh_setnew(setsize);
    -  qh_setappend(&qhmem.tempstack, newset);
    -  if (qhmem.IStracing >= 5)
    -    qh_fprintf(qhmem.ferr, 8123, "qh_settemp: temp set %p of %d elements, depth %d\n",
    -       newset, newset->maxsize, qh_setsize(qhmem.tempstack));
    -  return newset;
    -} /* settemp */
    -
    -/*---------------------------------
    -
    -  qh_settempfree( set )
    -    free temporary set at top of qhmem.tempstack
    -
    -  notes:
    -    nop if set is NULL
    -    errors if set not from previous   qh_settemp
    -
    -  to locate errors:
    -    use 'T2' to find source and then find mis-matching qh_settemp
    -
    -  design:
    -    check top of qhmem.tempstack
    -    free it
    -*/
    -void qh_settempfree(setT **set) {
    -  setT *stackedset;
    -
    -  if (!*set)
    -    return;
    -  stackedset= qh_settemppop();
    -  if (stackedset != *set) {
    -    qh_settemppush(stackedset);
    -    qh_fprintf(qhmem.ferr, 6179, "qhull internal error (qh_settempfree): set %p(size %d) was not last temporary allocated(depth %d, set %p, size %d)\n",
    -             *set, qh_setsize(*set), qh_setsize(qhmem.tempstack)+1,
    -             stackedset, qh_setsize(stackedset));
    -    qh_errexit(qhmem_ERRqhull, NULL, NULL);
    -  }
    -  qh_setfree(set);
    -} /* settempfree */
    -
    -/*---------------------------------
    -
    -  qh_settempfree_all(  )
    -    free all temporary sets in qhmem.tempstack
    -
    -  design:
    -    for each set in tempstack
    -      free set
    -    free qhmem.tempstack
    -*/
    -void qh_settempfree_all(void) {
    -  setT *set, **setp;
    -
    -  FOREACHset_(qhmem.tempstack)
    -    qh_setfree(&set);
    -  qh_setfree(&qhmem.tempstack);
    -} /* settempfree_all */
    -
    -/*---------------------------------
    -
    -  qh_settemppop(  )
    -    pop and return temporary set from qhmem.tempstack
    -
    -  notes:
    -    the returned set is permanent
    -
    -  design:
    -    pop and check top of qhmem.tempstack
    -*/
    -setT *qh_settemppop(void) {
    -  setT *stackedset;
    -
    -  stackedset= (setT*)qh_setdellast(qhmem.tempstack);
    -  if (!stackedset) {
    -    qh_fprintf(qhmem.ferr, 6180, "qhull internal error (qh_settemppop): pop from empty temporary stack\n");
    -    qh_errexit(qhmem_ERRqhull, NULL, NULL);
    -  }
    -  if (qhmem.IStracing >= 5)
    -    qh_fprintf(qhmem.ferr, 8124, "qh_settemppop: depth %d temp set %p of %d elements\n",
    -       qh_setsize(qhmem.tempstack)+1, stackedset, qh_setsize(stackedset));
    -  return stackedset;
    -} /* settemppop */
    -
    -/*---------------------------------
    -
    -  qh_settemppush( set )
    -    push temporary set unto qhmem.tempstack (makes it temporary)
    -
    -  notes:
    -    duplicates settemp() for tracing
    -
    -  design:
    -    append set to tempstack
    -*/
    -void qh_settemppush(setT *set) {
    -  if (!set) {
    -    qh_fprintf(qhmem.ferr, 6267, "qhull error (qh_settemppush): can not push a NULL temp\n");
    -    qh_errexit(qhmem_ERRqhull, NULL, NULL);
    -  }
    -  qh_setappend(&qhmem.tempstack, set);
    -  if (qhmem.IStracing >= 5)
    -    qh_fprintf(qhmem.ferr, 8125, "qh_settemppush: depth %d temp set %p of %d elements\n",
    -      qh_setsize(qhmem.tempstack), set, qh_setsize(set));
    -} /* settemppush */
    -
    -
    -/*---------------------------------
    -
    -  qh_settruncate( set, size )
    -    truncate set to size elements
    -
    -  notes:
    -    set must be defined
    -
    -  see:
    -    SETtruncate_
    -
    -  design:
    -    check size
    -    update actual size of set
    -*/
    -void qh_settruncate(setT *set, int size) {
    -
    -  if (size < 0 || size > set->maxsize) {
    -    qh_fprintf(qhmem.ferr, 6181, "qhull internal error (qh_settruncate): size %d out of bounds for set:\n", size);
    -    qh_setprint(qhmem.ferr, "", set);
    -    qh_errexit(qhmem_ERRqhull, NULL, NULL);
    -  }
    -  set->e[set->maxsize].i= size+1;   /* maybe overwritten */
    -  set->e[size].p= NULL;
    -} /* settruncate */
    -
    -/*---------------------------------
    -
    -  qh_setunique( set, elem )
    -    add elem to unsorted set unless it is already in set
    -
    -  notes:
    -    returns 1 if it is appended
    -
    -  design:
    -    if elem not in set
    -      append elem to set
    -*/
    -int qh_setunique(setT **set, void *elem) {
    -
    -  if (!qh_setin(*set, elem)) {
    -    qh_setappend(set, elem);
    -    return 1;
    -  }
    -  return 0;
    -} /* setunique */
    -
    -/*---------------------------------
    -
    -  qh_setzero( set, index, size )
    -    zero elements from index on
    -    set actual size of set to size
    -
    -  notes:
    -    set must be defined
    -    the set becomes an indexed set (can not use FOREACH...)
    -
    -  see also:
    -    qh_settruncate
    -
    -  design:
    -    check index and size
    -    update actual size
    -    zero elements starting at e[index]
    -*/
    -void qh_setzero(setT *set, int idx, int size) {
    -  int count;
    -
    -  if (idx < 0 || idx >= size || size > set->maxsize) {
    -    qh_fprintf(qhmem.ferr, 6182, "qhull internal error (qh_setzero): index %d or size %d out of bounds for set:\n", idx, size);
    -    qh_setprint(qhmem.ferr, "", set);
    -    qh_errexit(qhmem_ERRqhull, NULL, NULL);
    -  }
    -  set->e[set->maxsize].i=  size+1;  /* may be overwritten */
    -  count= size - idx + 1;   /* +1 for NULL terminator */
    -  memset((char *)SETelemaddr_(set, idx, void), 0, (size_t)count * SETelemsize);
    -} /* setzero */
    -
    -
    diff --git a/src/qhull/src/libqhull/qset.h b/src/qhull/src/libqhull/qset.h
    deleted file mode 100644
    index 7e4e7d14f6b..00000000000
    --- a/src/qhull/src/libqhull/qset.h
    +++ /dev/null
    @@ -1,490 +0,0 @@
    -/*
      ---------------------------------
    -
    -   qset.h
    -     header file for qset.c that implements set
    -
    -   see qh-set.htm and qset.c
    -
    -   only uses mem.c, malloc/free
    -
    -   for error handling, writes message and calls
    -      qh_errexit(qhmem_ERRqhull, NULL, NULL);
    -
    -   set operations satisfy the following properties:
    -    - sets have a max size, the actual size (if different) is stored at the end
    -    - every set is NULL terminated
    -    - sets may be sorted or unsorted, the caller must distinguish this
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull/qset.h#2 $$Change: 2062 $
    -   $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    -*/
    -
    -#ifndef qhDEFset
    -#define qhDEFset 1
    -
    -#include 
    -
    -/*================= -structures- ===============*/
    -
    -#ifndef DEFsetT
    -#define DEFsetT 1
    -typedef struct setT setT;   /* a set is a sorted or unsorted array of pointers */
    -#endif
    -
    -/* [jan'15] Decided not to use countT.  Most sets are small.  The code uses signed tests */
    -
    -/*------------------------------------------
    -
    -setT
    -  a set or list of pointers with maximum size and actual size.
    -
    -variations:
    -  unsorted, unique   -- a list of unique pointers with NULL terminator
    -                           user guarantees uniqueness
    -  sorted             -- a sorted list of unique pointers with NULL terminator
    -                           qset.c guarantees uniqueness
    -  unsorted           -- a list of pointers terminated with NULL
    -  indexed            -- an array of pointers with NULL elements
    -
    -structure for set of n elements:
    -
    -        --------------
    -        |  maxsize
    -        --------------
    -        |  e[0] - a pointer, may be NULL for indexed sets
    -        --------------
    -        |  e[1]
    -
    -        --------------
    -        |  ...
    -        --------------
    -        |  e[n-1]
    -        --------------
    -        |  e[n] = NULL
    -        --------------
    -        |  ...
    -        --------------
    -        |  e[maxsize] - n+1 or NULL (determines actual size of set)
    -        --------------
    -
    -*/
    -
    -/*-- setelemT -- internal type to allow both pointers and indices
    -*/
    -typedef union setelemT setelemT;
    -union setelemT {
    -  void    *p;
    -  int      i;         /* integer used for e[maxSize] */
    -};
    -
    -struct setT {
    -  int maxsize;          /* maximum number of elements (except NULL) */
    -  setelemT e[1];        /* array of pointers, tail is NULL */
    -                        /* last slot (unless NULL) is actual size+1
    -                           e[maxsize]==NULL or e[e[maxsize]-1]==NULL */
    -                        /* this may generate a warning since e[] contains
    -                           maxsize elements */
    -};
    -
    -/*=========== -constants- =========================*/
    -
    -/*-------------------------------------
    -
    -  SETelemsize
    -    size of a set element in bytes
    -*/
    -#define SETelemsize ((int)sizeof(setelemT))
    -
    -
    -/*=========== -macros- =========================*/
    -
    -/*-------------------------------------
    -
    -   FOREACHsetelement_(type, set, variable)
    -     define FOREACH iterator
    -
    -   declare:
    -     assumes *variable and **variablep are declared
    -     no space in "variable)" [DEC Alpha cc compiler]
    -
    -   each iteration:
    -     variable is set element
    -     variablep is one beyond variable.
    -
    -   to repeat an element:
    -     variablep--; / *repeat* /
    -
    -   at exit:
    -     variable is NULL at end of loop
    -
    -   example:
    -     #define FOREACHfacet_( facets ) FOREACHsetelement_( facetT, facets, facet )
    -
    -   notes:
    -     use FOREACHsetelement_i_() if need index or include NULLs
    -
    -   WARNING:
    -     nested loops can't use the same variable (define another FOREACH)
    -
    -     needs braces if nested inside another FOREACH
    -     this includes intervening blocks, e.g. FOREACH...{ if () FOREACH...} )
    -*/
    -#define FOREACHsetelement_(type, set, variable) \
    -        if (((variable= NULL), set)) for (\
    -          variable##p= (type **)&((set)->e[0].p); \
    -          (variable= *variable##p++);)
    -
    -/*------------------------------------------
    -
    -   FOREACHsetelement_i_(type, set, variable)
    -     define indexed FOREACH iterator
    -
    -   declare:
    -     type *variable, variable_n, variable_i;
    -
    -   each iteration:
    -     variable is set element, may be NULL
    -     variable_i is index, variable_n is qh_setsize()
    -
    -   to repeat an element:
    -     variable_i--; variable_n-- repeats for deleted element
    -
    -   at exit:
    -     variable==NULL and variable_i==variable_n
    -
    -   example:
    -     #define FOREACHfacet_i_( facets ) FOREACHsetelement_i_( facetT, facets, facet )
    -
    -   WARNING:
    -     nested loops can't use the same variable (define another FOREACH)
    -
    -     needs braces if nested inside another FOREACH
    -     this includes intervening blocks, e.g. FOREACH...{ if () FOREACH...} )
    -*/
    -#define FOREACHsetelement_i_(type, set, variable) \
    -        if (((variable= NULL), set)) for (\
    -          variable##_i= 0, variable= (type *)((set)->e[0].p), \
    -                   variable##_n= qh_setsize(set);\
    -          variable##_i < variable##_n;\
    -          variable= (type *)((set)->e[++variable##_i].p) )
    -
    -/*----------------------------------------
    -
    -   FOREACHsetelementreverse_(type, set, variable)-
    -     define FOREACH iterator in reverse order
    -
    -   declare:
    -     assumes *variable and **variablep are declared
    -     also declare 'int variabletemp'
    -
    -   each iteration:
    -     variable is set element
    -
    -   to repeat an element:
    -     variabletemp++; / *repeat* /
    -
    -   at exit:
    -     variable is NULL
    -
    -   example:
    -     #define FOREACHvertexreverse_( vertices ) FOREACHsetelementreverse_( vertexT, vertices, vertex )
    -
    -   notes:
    -     use FOREACHsetelementreverse12_() to reverse first two elements
    -     WARNING: needs braces if nested inside another FOREACH
    -*/
    -#define FOREACHsetelementreverse_(type, set, variable) \
    -        if (((variable= NULL), set)) for (\
    -           variable##temp= qh_setsize(set)-1, variable= qh_setlast(set);\
    -           variable; variable= \
    -           ((--variable##temp >= 0) ? SETelemt_(set, variable##temp, type) : NULL))
    -
    -/*-------------------------------------
    -
    -   FOREACHsetelementreverse12_(type, set, variable)-
    -     define FOREACH iterator with e[1] and e[0] reversed
    -
    -   declare:
    -     assumes *variable and **variablep are declared
    -
    -   each iteration:
    -     variable is set element
    -     variablep is one after variable.
    -
    -   to repeat an element:
    -     variablep--; / *repeat* /
    -
    -   at exit:
    -     variable is NULL at end of loop
    -
    -   example
    -     #define FOREACHvertexreverse12_( vertices ) FOREACHsetelementreverse12_( vertexT, vertices, vertex )
    -
    -   notes:
    -     WARNING: needs braces if nested inside another FOREACH
    -*/
    -#define FOREACHsetelementreverse12_(type, set, variable) \
    -        if (((variable= NULL), set)) for (\
    -          variable##p= (type **)&((set)->e[1].p); \
    -          (variable= *variable##p); \
    -          variable##p == ((type **)&((set)->e[0].p))?variable##p += 2: \
    -              (variable##p == ((type **)&((set)->e[1].p))?variable##p--:variable##p++))
    -
    -/*-------------------------------------
    -
    -   FOREACHelem_( set )-
    -     iterate elements in a set
    -
    -   declare:
    -     void *elem, *elemp;
    -
    -   each iteration:
    -     elem is set element
    -     elemp is one beyond
    -
    -   to repeat an element:
    -     elemp--; / *repeat* /
    -
    -   at exit:
    -     elem == NULL at end of loop
    -
    -   example:
    -     FOREACHelem_(set) {
    -
    -   notes:
    -     WARNING: needs braces if nested inside another FOREACH
    -*/
    -#define FOREACHelem_(set) FOREACHsetelement_(void, set, elem)
    -
    -/*-------------------------------------
    -
    -   FOREACHset_( set )-
    -     iterate a set of sets
    -
    -   declare:
    -     setT *set, **setp;
    -
    -   each iteration:
    -     set is set element
    -     setp is one beyond
    -
    -   to repeat an element:
    -     setp--; / *repeat* /
    -
    -   at exit:
    -     set == NULL at end of loop
    -
    -   example
    -     FOREACHset_(sets) {
    -
    -   notes:
    -     WARNING: needs braces if nested inside another FOREACH
    -*/
    -#define FOREACHset_(sets) FOREACHsetelement_(setT, sets, set)
    -
    -/*-------------------------------------------
    -
    -   SETindex_( set, elem )
    -     return index of elem in set
    -
    -   notes:
    -     for use with FOREACH iteration
    -     WARN64 -- Maximum set size is 2G
    -
    -   example:
    -     i= SETindex_(ridges, ridge)
    -*/
    -#define SETindex_(set, elem) ((int)((void **)elem##p - (void **)&(set)->e[1].p))
    -
    -/*-----------------------------------------
    -
    -   SETref_( elem )
    -     l.h.s. for modifying the current element in a FOREACH iteration
    -
    -   example:
    -     SETref_(ridge)= anotherridge;
    -*/
    -#define SETref_(elem) (elem##p[-1])
    -
    -/*-----------------------------------------
    -
    -   SETelem_(set, n)
    -     return the n'th element of set
    -
    -   notes:
    -      assumes that n is valid [0..size] and that set is defined
    -      use SETelemt_() for type cast
    -*/
    -#define SETelem_(set, n)           ((set)->e[n].p)
    -
    -/*-----------------------------------------
    -
    -   SETelemt_(set, n, type)
    -     return the n'th element of set as a type
    -
    -   notes:
    -      assumes that n is valid [0..size] and that set is defined
    -*/
    -#define SETelemt_(set, n, type)    ((type*)((set)->e[n].p))
    -
    -/*-----------------------------------------
    -
    -   SETelemaddr_(set, n, type)
    -     return address of the n'th element of a set
    -
    -   notes:
    -      assumes that n is valid [0..size] and set is defined
    -*/
    -#define SETelemaddr_(set, n, type) ((type **)(&((set)->e[n].p)))
    -
    -/*-----------------------------------------
    -
    -   SETfirst_(set)
    -     return first element of set
    -
    -*/
    -#define SETfirst_(set)             ((set)->e[0].p)
    -
    -/*-----------------------------------------
    -
    -   SETfirstt_(set, type)
    -     return first element of set as a type
    -
    -*/
    -#define SETfirstt_(set, type)      ((type*)((set)->e[0].p))
    -
    -/*-----------------------------------------
    -
    -   SETsecond_(set)
    -     return second element of set
    -
    -*/
    -#define SETsecond_(set)            ((set)->e[1].p)
    -
    -/*-----------------------------------------
    -
    -   SETsecondt_(set, type)
    -     return second element of set as a type
    -*/
    -#define SETsecondt_(set, type)     ((type*)((set)->e[1].p))
    -
    -/*-----------------------------------------
    -
    -   SETaddr_(set, type)
    -       return address of set's elements
    -*/
    -#define SETaddr_(set,type)         ((type **)(&((set)->e[0].p)))
    -
    -/*-----------------------------------------
    -
    -   SETreturnsize_(set, size)
    -     return size of a set
    -
    -   notes:
    -      set must be defined
    -      use qh_setsize(set) unless speed is critical
    -*/
    -#define SETreturnsize_(set, size) (((size)= ((set)->e[(set)->maxsize].i))?(--(size)):((size)= (set)->maxsize))
    -
    -/*-----------------------------------------
    -
    -   SETempty_(set)
    -     return true(1) if set is empty
    -
    -   notes:
    -      set may be NULL
    -*/
    -#define SETempty_(set)            (!set || (SETfirst_(set) ? 0 : 1))
    -
    -/*---------------------------------
    -
    -  SETsizeaddr_(set)
    -    return pointer to 'actual size+1' of set (set CANNOT be NULL!!)
    -    Its type is setelemT* for strict aliasing
    -    All SETelemaddr_ must be cast to setelemT
    -
    -
    -  notes:
    -    *SETsizeaddr==NULL or e[*SETsizeaddr-1].p==NULL
    -*/
    -#define SETsizeaddr_(set) (&((set)->e[(set)->maxsize]))
    -
    -/*-----------------------------------------
    -
    -   SETtruncate_(set, size)
    -     truncate set to size
    -
    -   see:
    -     qh_settruncate()
    -
    -*/
    -#define SETtruncate_(set, size) {set->e[set->maxsize].i= size+1; /* maybe overwritten */ \
    -      set->e[size].p= NULL;}
    -
    -/*======= prototypes in alphabetical order ============*/
    -
    -void  qh_setaddsorted(setT **setp, void *elem);
    -void  qh_setaddnth(setT **setp, int nth, void *newelem);
    -void  qh_setappend(setT **setp, void *elem);
    -void  qh_setappend_set(setT **setp, setT *setA);
    -void  qh_setappend2ndlast(setT **setp, void *elem);
    -void  qh_setcheck(setT *set, const char *tname, unsigned id);
    -void  qh_setcompact(setT *set);
    -setT *qh_setcopy(setT *set, int extra);
    -void *qh_setdel(setT *set, void *elem);
    -void *qh_setdellast(setT *set);
    -void *qh_setdelnth(setT *set, int nth);
    -void *qh_setdelnthsorted(setT *set, int nth);
    -void *qh_setdelsorted(setT *set, void *newelem);
    -setT *qh_setduplicate( setT *set, int elemsize);
    -void **qh_setendpointer(setT *set);
    -int   qh_setequal(setT *setA, setT *setB);
    -int   qh_setequal_except(setT *setA, void *skipelemA, setT *setB, void *skipelemB);
    -int   qh_setequal_skip(setT *setA, int skipA, setT *setB, int skipB);
    -void  qh_setfree(setT **set);
    -void  qh_setfree2( setT **setp, int elemsize);
    -void  qh_setfreelong(setT **set);
    -int   qh_setin(setT *set, void *setelem);
    -int   qh_setindex(setT *set, void *setelem);
    -void  qh_setlarger(setT **setp);
    -void *qh_setlast(setT *set);
    -setT *qh_setnew(int size);
    -setT *qh_setnew_delnthsorted(setT *set, int size, int nth, int prepend);
    -void  qh_setprint(FILE *fp, const char* string, setT *set);
    -void  qh_setreplace(setT *set, void *oldelem, void *newelem);
    -int   qh_setsize(setT *set);
    -setT *qh_settemp(int setsize);
    -void  qh_settempfree(setT **set);
    -void  qh_settempfree_all(void);
    -setT *qh_settemppop(void);
    -void  qh_settemppush(setT *set);
    -void  qh_settruncate(setT *set, int size);
    -int   qh_setunique(setT **set, void *elem);
    -void  qh_setzero(setT *set, int idx, int size);
    -
    -
    -#endif /* qhDEFset */
    diff --git a/src/qhull/src/libqhull/random.c b/src/qhull/src/libqhull/random.c
    deleted file mode 100644
    index 176d697aeb5..00000000000
    --- a/src/qhull/src/libqhull/random.c
    +++ /dev/null
    @@ -1,245 +0,0 @@
    -/*
      ---------------------------------
    -
    -   random.c and utilities
    -     Park & Miller's minimimal standard random number generator
    -     argc/argv conversion
    -
    -     Used by rbox.  Do not use 'qh' 
    -*/
    -
    -#include "libqhull.h"
    -#include "random.h"
    -
    -#include 
    -#include 
    -#include 
    -
    -#ifdef _MSC_VER  /* Microsoft Visual C++ -- warning level 4 */
    -#pragma warning( disable : 4706)  /* assignment within conditional function */
    -#pragma warning( disable : 4996)  /* function was declared deprecated(strcpy, localtime, etc.) */
    -#endif
    -
    -/*---------------------------------
    -
    - qh_argv_to_command( argc, argv, command, max_size )
    -
    -    build command from argc/argv
    -    max_size is at least
    -
    - returns:
    -    a space-delimited string of options (just as typed)
    -    returns false if max_size is too short
    -
    - notes:
    -    silently removes
    -    makes option string easy to input and output
    -    matches qh_argv_to_command_size()
    -
    -    argc may be 0
    -*/
    -int qh_argv_to_command(int argc, char *argv[], char* command, int max_size) {
    -  int i, remaining;
    -  char *s;
    -  *command= '\0';  /* max_size > 0 */
    -
    -  if (argc) {
    -    if ((s= strrchr( argv[0], '\\')) /* get filename w/o .exe extension */
    -    || (s= strrchr( argv[0], '/')))
    -        s++;
    -    else
    -        s= argv[0];
    -    if ((int)strlen(s) < max_size)   /* WARN64 */
    -        strcpy(command, s);
    -    else
    -        goto error_argv;
    -    if ((s= strstr(command, ".EXE"))
    -    ||  (s= strstr(command, ".exe")))
    -        *s= '\0';
    -  }
    -  for (i=1; i < argc; i++) {
    -    s= argv[i];
    -    remaining= max_size - (int)strlen(command) - (int)strlen(s) - 2;   /* WARN64 */
    -    if (!*s || strchr(s, ' ')) {
    -      char *t= command + strlen(command);
    -      remaining -= 2;
    -      if (remaining < 0) {
    -        goto error_argv;
    -      }
    -      *t++= ' ';
    -      *t++= '"';
    -      while (*s) {
    -        if (*s == '"') {
    -          if (--remaining < 0)
    -            goto error_argv;
    -          *t++= '\\';
    -        }
    -        *t++= *s++;
    -      }
    -      *t++= '"';
    -      *t= '\0';
    -    }else if (remaining < 0) {
    -      goto error_argv;
    -    }else
    -      strcat(command, " ");
    -      strcat(command, s);
    -  }
    -  return 1;
    -
    -error_argv:
    -  return 0;
    -} /* argv_to_command */
    -
    -/*---------------------------------
    -
    -qh_argv_to_command_size( argc, argv )
    -
    -    return size to allocate for qh_argv_to_command()
    -
    -notes:
    -    argc may be 0
    -    actual size is usually shorter
    -*/
    -int qh_argv_to_command_size(int argc, char *argv[]) {
    -    unsigned int count= 1; /* null-terminator if argc==0 */
    -    int i;
    -    char *s;
    -
    -    for (i=0; i0 && strchr(argv[i], ' ')) {
    -        count += 2;  /* quote delimiters */
    -        for (s=argv[i]; *s; s++) {
    -          if (*s == '"') {
    -            count++;
    -          }
    -        }
    -      }
    -    }
    -    return count;
    -} /* argv_to_command_size */
    -
    -/*---------------------------------
    -
    -  qh_rand()
    -  qh_srand( seed )
    -    generate pseudo-random number between 1 and 2^31 -2
    -
    -  notes:
    -    For qhull and rbox, called from qh_RANDOMint(),etc. [user.h]
    -
    -    From Park & Miller's minimal standard random number generator
    -      Communications of the ACM, 31:1192-1201, 1988.
    -    Does not use 0 or 2^31 -1
    -      this is silently enforced by qh_srand()
    -    Can make 'Rn' much faster by moving qh_rand to qh_distplane
    -*/
    -
    -/* Global variables and constants */
    -
    -int qh_last_random= 1;  /* define as global variable instead of using qh */
    -
    -#define qh_rand_a 16807
    -#define qh_rand_m 2147483647
    -#define qh_rand_q 127773  /* m div a */
    -#define qh_rand_r 2836    /* m mod a */
    -
    -int qh_rand( void) {
    -    int lo, hi, test;
    -    int seed = qh_last_random;
    -
    -    hi = seed / qh_rand_q;  /* seed div q */
    -    lo = seed % qh_rand_q;  /* seed mod q */
    -    test = qh_rand_a * lo - qh_rand_r * hi;
    -    if (test > 0)
    -        seed= test;
    -    else
    -        seed= test + qh_rand_m;
    -    qh_last_random= seed;
    -    /* seed = seed < qh_RANDOMmax/2 ? 0 : qh_RANDOMmax;  for testing */
    -    /* seed = qh_RANDOMmax;  for testing */
    -    return seed;
    -} /* rand */
    -
    -void qh_srand( int seed) {
    -    if (seed < 1)
    -        qh_last_random= 1;
    -    else if (seed >= qh_rand_m)
    -        qh_last_random= qh_rand_m - 1;
    -    else
    -        qh_last_random= seed;
    -} /* qh_srand */
    -
    -/*---------------------------------
    -
    -qh_randomfactor( scale, offset )
    -  return a random factor r * scale + offset
    -
    -notes:
    -  qh.RANDOMa/b are defined in global.c
    -*/
    -realT qh_randomfactor(realT scale, realT offset) {
    -    realT randr;
    -
    -    randr= qh_RANDOMint;
    -    return randr * scale + offset;
    -} /* randomfactor */
    -
    -/*---------------------------------
    -
    -qh_randommatrix( buffer, dim, rows )
    -  generate a random dim X dim matrix in range [-1,1]
    -  assumes buffer is [dim+1, dim]
    -
    -returns:
    -  sets buffer to random numbers
    -  sets rows to rows of buffer
    -  sets row[dim] as scratch row
    -*/
    -void qh_randommatrix(realT *buffer, int dim, realT **rows) {
    -    int i, k;
    -    realT **rowi, *coord, realr;
    -
    -    coord= buffer;
    -    rowi= rows;
    -    for (i=0; i < dim; i++) {
    -        *(rowi++)= coord;
    -        for (k=0; k < dim; k++) {
    -            realr= qh_RANDOMint;
    -            *(coord++)= 2.0 * realr/(qh_RANDOMmax+1) - 1.0;
    -        }
    -    }
    -    *rowi= coord;
    -} /* randommatrix */
    -
    -/*---------------------------------
    -
    -  qh_strtol( s, endp) qh_strtod( s, endp)
    -    internal versions of strtol() and strtod()
    -    does not skip trailing spaces
    -  notes:
    -    some implementations of strtol()/strtod() skip trailing spaces
    -*/
    -double qh_strtod(const char *s, char **endp) {
    -  double result;
    -
    -  result= strtod(s, endp);
    -  if (s < (*endp) && (*endp)[-1] == ' ')
    -    (*endp)--;
    -  return result;
    -} /* strtod */
    -
    -int qh_strtol(const char *s, char **endp) {
    -  int result;
    -
    -  result= (int) strtol(s, endp, 10);     /* WARN64 */
    -  if (s< (*endp) && (*endp)[-1] == ' ')
    -    (*endp)--;
    -  return result;
    -} /* strtol */
    diff --git a/src/qhull/src/libqhull/random.h b/src/qhull/src/libqhull/random.h
    deleted file mode 100644
    index 0c6896b7654..00000000000
    --- a/src/qhull/src/libqhull/random.h
    +++ /dev/null
    @@ -1,34 +0,0 @@
    -/*
      ---------------------------------
    -
    -  random.h
    -    header file for random and utility routines
    -
    -   see qh-geom.htm and random.c
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull/random.h#2 $$Change: 2026 $
    -   $DateTime: 2015/11/07 22:44:39 $$Author: bbarber $
    -*/
    -
    -#ifndef qhDEFrandom
    -#define qhDEFrandom 1
    -
    -#include "libqhull.h"
    -
    -/*============= prototypes in alphabetical order ======= */
    -
    -
    -int     qh_argv_to_command(int argc, char *argv[], char* command, int max_size);
    -int     qh_argv_to_command_size(int argc, char *argv[]);
    -int     qh_rand( void);
    -void    qh_srand( int seed);
    -realT   qh_randomfactor(realT scale, realT offset);
    -void    qh_randommatrix(realT *buffer, int dim, realT **row);
    -int     qh_strtol(const char *s, char **endp);
    -double  qh_strtod(const char *s, char **endp);
    -
    -#endif /* qhDEFrandom */
    -
    -
    -
    diff --git a/src/qhull/src/libqhull/rboxlib.c b/src/qhull/src/libqhull/rboxlib.c
    deleted file mode 100644
    index f945133fa0b..00000000000
    --- a/src/qhull/src/libqhull/rboxlib.c
    +++ /dev/null
    @@ -1,870 +0,0 @@
    -/*
      ---------------------------------
    -
    -   rboxlib.c
    -     Generate input points
    -
    -   notes:
    -     For documentation, see prompt[] of rbox.c
    -     50 points generated for 'rbox D4'
    -
    -   WARNING:
    -     incorrect range if qh_RANDOMmax is defined wrong (user.h)
    -*/
    -
    -#include "libqhull.h"  /* First for user.h */
    -#include "random.h"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#ifdef _MSC_VER  /* Microsoft Visual C++ */
    -#pragma warning( disable : 4706)  /* assignment within conditional expression. */
    -#pragma warning( disable : 4996)  /* this function (strncat,sprintf,strcpy) or variable may be unsafe. */
    -#endif
    -
    -#define MAXdim 200
    -#define PI 3.1415926535897932384
    -
    -/* ------------------------------ prototypes ----------------*/
    -int qh_roundi( double a);
    -void qh_out1( double a);
    -void qh_out2n( double a, double b);
    -void qh_out3n( double a, double b, double c);
    -void qh_outcoord(int iscdd, double *coord, int dim);
    -void qh_outcoincident(int coincidentpoints, double radius, int iscdd, double *coord, int dim);
    -
    -void    qh_fprintf_rbox(FILE *fp, int msgcode, const char *fmt, ... );
    -void    qh_free(void *mem);
    -void   *qh_malloc(size_t size);
    -int     qh_rand( void);
    -void    qh_srand( int seed);
    -
    -
    -/* ------------------------------ globals -------------------*/
    -
    -/* No state is carried between rbox requests */
    -typedef struct rboxT rboxT;
    -struct rboxT {
    -  FILE *fout;
    -  FILE *ferr;
    -  int isinteger;
    -  double out_offset;
    -  jmp_buf errexit;        /* exit label for rboxpoints, defined by setjmp(), called by qh_errexit_rbox() */
    -  char  jmpXtra[40];      /* extra bytes in case jmp_buf is defined wrong by compiler */
    -};
    -
    -
    -int rbox_inuse= 0;
    -rboxT rbox;
    -
    -/*---------------------------------
    -
    -  qh_rboxpoints( fout, ferr, rbox_command )
    -    Generate points to fout according to rbox options
    -    Report errors on ferr
    -
    -  returns:
    -    0 (qh_ERRnone) on success
    -    1 (qh_ERRinput) on input error
    -    4 (qh_ERRmem) on memory error
    -    5 (qh_ERRqhull) on internal error
    -
    -  notes:
    -    To avoid using stdio, redefine qh_malloc, qh_free, and qh_fprintf_rbox (user.c)
    -
    -  design:
    -    Straight line code (consider defining a struct and functions):
    -
    -    Parse arguments into variables
    -    Determine the number of points
    -    Generate the points
    -*/
    -int qh_rboxpoints(FILE* fout, FILE* ferr, char* rbox_command) {
    -  int i,j,k;
    -  int gendim;
    -  int coincidentcount=0, coincidenttotal=0, coincidentpoints=0;
    -  int cubesize, diamondsize, seed=0, count, apex;
    -  int dim=3, numpoints=0, totpoints, addpoints=0;
    -  int issphere=0, isaxis=0,  iscdd=0, islens=0, isregular=0, iswidth=0, addcube=0;
    -  int isgap=0, isspiral=0, NOcommand=0, adddiamond=0;
    -  int israndom=0, istime=0;
    -  int isbox=0, issimplex=0, issimplex2=0, ismesh=0;
    -  double width=0.0, gap=0.0, radius=0.0, coincidentradius=0.0;
    -  double coord[MAXdim], offset, meshm=3.0, meshn=4.0, meshr=5.0;
    -  double *coordp, *simplex= NULL, *simplexp;
    -  int nthroot, mult[MAXdim];
    -  double norm, factor, randr, rangap, lensangle=0, lensbase=1;
    -  double anglediff, angle, x, y, cube=0.0, diamond=0.0;
    -  double box= qh_DEFAULTbox; /* scale all numbers before output */
    -  double randmax= qh_RANDOMmax;
    -  char command[200], seedbuf[200];
    -  char *s= command, *t, *first_point= NULL;
    -  time_t timedata;
    -  int exitcode;
    -
    -  if (rbox_inuse) {
    -    qh_fprintf_rbox(rbox.ferr, 6188, "rbox error: rbox in use by another process.  Please lock calls to rbox.\n");
    -    return qh_ERRqhull;
    -  }
    -  rbox_inuse= True;
    -  rbox.ferr= ferr;
    -  rbox.fout= fout;
    -
    -  exitcode= setjmp(rbox.errexit);
    -  if (exitcode) {
    -    /* same code for error exit and normal return.  qh.NOerrexit is set */
    -    if (simplex)
    -        qh_free(simplex);
    -    rbox_inuse= False;
    -    return exitcode;
    -  }
    -
    -  *command= '\0';
    -  strncat(command, rbox_command, sizeof(command)-strlen(command)-1);
    -
    -  while (*s && !isspace(*s))  /* skip program name */
    -    s++;
    -  while (*s) {
    -    while (*s && isspace(*s))
    -      s++;
    -    if (*s == '-')
    -      s++;
    -    if (!*s)
    -      break;
    -    if (isdigit(*s)) {
    -      numpoints= qh_strtol(s, &s);
    -      continue;
    -    }
    -    /* ============= read flags =============== */
    -    switch (*s++) {
    -    case 'c':
    -      addcube= 1;
    -      t= s;
    -      while (isspace(*t))
    -        t++;
    -      if (*t == 'G')
    -        cube= qh_strtod(++t, &s);
    -      break;
    -    case 'd':
    -      adddiamond= 1;
    -      t= s;
    -      while (isspace(*t))
    -        t++;
    -      if (*t == 'G')
    -        diamond= qh_strtod(++t, &s);
    -      break;
    -    case 'h':
    -      iscdd= 1;
    -      break;
    -    case 'l':
    -      isspiral= 1;
    -      break;
    -    case 'n':
    -      NOcommand= 1;
    -      break;
    -    case 'r':
    -      isregular= 1;
    -      break;
    -    case 's':
    -      issphere= 1;
    -      break;
    -    case 't':
    -      istime= 1;
    -      if (isdigit(*s)) {
    -        seed= qh_strtol(s, &s);
    -        israndom= 0;
    -      }else
    -        israndom= 1;
    -      break;
    -    case 'x':
    -      issimplex= 1;
    -      break;
    -    case 'y':
    -      issimplex2= 1;
    -      break;
    -    case 'z':
    -      rbox.isinteger= 1;
    -      break;
    -    case 'B':
    -      box= qh_strtod(s, &s);
    -      isbox= 1;
    -      break;
    -    case 'C':
    -      if (*s)
    -        coincidentpoints=  qh_strtol(s, &s);
    -      if (*s == ',') {
    -        ++s;
    -        coincidentradius=  qh_strtod(s, &s);
    -      }
    -      if (*s == ',') {
    -        ++s;
    -        coincidenttotal=  qh_strtol(s, &s);
    -      }
    -      if (*s && !isspace(*s)) {
    -        qh_fprintf_rbox(rbox.ferr, 7080, "rbox error: arguments for 'Cn,r,m' are not 'int', 'float', and 'int'.  Remaining string is '%s'\n", s);
    -        qh_errexit_rbox(qh_ERRinput);
    -      }
    -      if (coincidentpoints==0){
    -        qh_fprintf_rbox(rbox.ferr, 6268, "rbox error: missing arguments for 'Cn,r,m' where n is the number of coincident points, r is the radius (default 0.0), and m is the number of points\n");
    -        qh_errexit_rbox(qh_ERRinput);
    -      }
    -      if (coincidentpoints<0 || coincidenttotal<0 || coincidentradius<0.0){
    -        qh_fprintf_rbox(rbox.ferr, 6269, "rbox error: negative arguments for 'Cn,m,r' where n (%d) is the number of coincident points, m (%d) is the number of points, and r (%.2g) is the radius (default 0.0)\n", coincidentpoints, coincidenttotal, coincidentradius);
    -        qh_errexit_rbox(qh_ERRinput);
    -      }
    -      break;
    -    case 'D':
    -      dim= qh_strtol(s, &s);
    -      if (dim < 1
    -      || dim > MAXdim) {
    -        qh_fprintf_rbox(rbox.ferr, 6189, "rbox error: dimension, D%d, out of bounds (>=%d or <=0)", dim, MAXdim);
    -        qh_errexit_rbox(qh_ERRinput);
    -      }
    -      break;
    -    case 'G':
    -      if (isdigit(*s))
    -        gap= qh_strtod(s, &s);
    -      else
    -        gap= 0.5;
    -      isgap= 1;
    -      break;
    -    case 'L':
    -      if (isdigit(*s))
    -        radius= qh_strtod(s, &s);
    -      else
    -        radius= 10;
    -      islens= 1;
    -      break;
    -    case 'M':
    -      ismesh= 1;
    -      if (*s)
    -        meshn= qh_strtod(s, &s);
    -      if (*s == ',') {
    -        ++s;
    -        meshm= qh_strtod(s, &s);
    -      }else
    -        meshm= 0.0;
    -      if (*s == ',') {
    -        ++s;
    -        meshr= qh_strtod(s, &s);
    -      }else
    -        meshr= sqrt(meshn*meshn + meshm*meshm);
    -      if (*s && !isspace(*s)) {
    -        qh_fprintf_rbox(rbox.ferr, 7069, "rbox warning: assuming 'M3,4,5' since mesh args are not integers or reals\n");
    -        meshn= 3.0, meshm=4.0, meshr=5.0;
    -      }
    -      break;
    -    case 'O':
    -      rbox.out_offset= qh_strtod(s, &s);
    -      break;
    -    case 'P':
    -      if (!first_point)
    -        first_point= s-1;
    -      addpoints++;
    -      while (*s && !isspace(*s))   /* read points later */
    -        s++;
    -      break;
    -    case 'W':
    -      width= qh_strtod(s, &s);
    -      iswidth= 1;
    -      break;
    -    case 'Z':
    -      if (isdigit(*s))
    -        radius= qh_strtod(s, &s);
    -      else
    -        radius= 1.0;
    -      isaxis= 1;
    -      break;
    -    default:
    -      qh_fprintf_rbox(rbox.ferr, 7070, "rbox error: unknown flag at %s.\nExecute 'rbox' without arguments for documentation.\n", s);
    -      qh_errexit_rbox(qh_ERRinput);
    -    }
    -    if (*s && !isspace(*s)) {
    -      qh_fprintf_rbox(rbox.ferr, 7071, "rbox error: missing space between flags at %s.\n", s);
    -      qh_errexit_rbox(qh_ERRinput);
    -    }
    -  }
    -
    -  /* ============= defaults, constants, and sizes =============== */
    -  if (rbox.isinteger && !isbox)
    -    box= qh_DEFAULTzbox;
    -  if (addcube) {
    -    cubesize= (int)floor(ldexp(1.0,dim)+0.5);
    -    if (cube == 0.0)
    -      cube= box;
    -  }else
    -    cubesize= 0;
    -  if (adddiamond) {
    -    diamondsize= 2*dim;
    -    if (diamond == 0.0)
    -      diamond= box;
    -  }else
    -    diamondsize= 0;
    -  if (islens) {
    -    if (isaxis) {
    -        qh_fprintf_rbox(rbox.ferr, 6190, "rbox error: can not combine 'Ln' with 'Zn'\n");
    -        qh_errexit_rbox(qh_ERRinput);
    -    }
    -    if (radius <= 1.0) {
    -        qh_fprintf_rbox(rbox.ferr, 6191, "rbox error: lens radius %.2g should be greater than 1.0\n",
    -               radius);
    -        qh_errexit_rbox(qh_ERRinput);
    -    }
    -    lensangle= asin(1.0/radius);
    -    lensbase= radius * cos(lensangle);
    -  }
    -
    -  if (!numpoints) {
    -    if (issimplex2)
    -        ; /* ok */
    -    else if (isregular + issimplex + islens + issphere + isaxis + isspiral + iswidth + ismesh) {
    -        qh_fprintf_rbox(rbox.ferr, 6192, "rbox error: missing count\n");
    -        qh_errexit_rbox(qh_ERRinput);
    -    }else if (adddiamond + addcube + addpoints)
    -        ; /* ok */
    -    else {
    -        numpoints= 50;  /* ./rbox D4 is the test case */
    -        issphere= 1;
    -    }
    -  }
    -  if ((issimplex + islens + isspiral + ismesh > 1)
    -  || (issimplex + issphere + isspiral + ismesh > 1)) {
    -    qh_fprintf_rbox(rbox.ferr, 6193, "rbox error: can only specify one of 'l', 's', 'x', 'Ln', or 'Mn,m,r' ('Ln s' is ok).\n");
    -    qh_errexit_rbox(qh_ERRinput);
    -  }
    -  if (coincidentpoints>0 && (numpoints == 0 || coincidenttotal > numpoints)) {
    -    qh_fprintf_rbox(rbox.ferr, 6270, "rbox error: 'Cn,r,m' requested n coincident points for each of m points.  Either there is no points or m (%d) is greater than the number of points (%d).\n", coincidenttotal, numpoints);
    -    qh_errexit_rbox(qh_ERRinput);
    -  }
    -  if (coincidenttotal == 0)
    -    coincidenttotal= numpoints;
    -
    -  /* ============= print header with total points =============== */
    -  if (issimplex || ismesh)
    -    totpoints= numpoints;
    -  else if (issimplex2)
    -    totpoints= numpoints+dim+1;
    -  else if (isregular) {
    -    totpoints= numpoints;
    -    if (dim == 2) {
    -        if (islens)
    -          totpoints += numpoints - 2;
    -    }else if (dim == 3) {
    -        if (islens)
    -          totpoints += 2 * numpoints;
    -      else if (isgap)
    -        totpoints += 1 + numpoints;
    -      else
    -        totpoints += 2;
    -    }
    -  }else
    -    totpoints= numpoints + isaxis;
    -  totpoints += cubesize + diamondsize + addpoints;
    -  totpoints += coincidentpoints*coincidenttotal;
    -
    -  /* ============= seed randoms =============== */
    -  if (istime == 0) {
    -    for (s=command; *s; s++) {
    -      if (issimplex2 && *s == 'y') /* make 'y' same seed as 'x' */
    -        i= 'x';
    -      else
    -        i= *s;
    -      seed= 11*seed + i;
    -    }
    -  }else if (israndom) {
    -    seed= (int)time(&timedata);
    -    sprintf(seedbuf, " t%d", seed);  /* appends an extra t, not worth removing */
    -    strncat(command, seedbuf, sizeof(command)-strlen(command)-1);
    -    t= strstr(command, " t ");
    -    if (t)
    -      strcpy(t+1, t+3); /* remove " t " */
    -  } /* else, seed explicitly set to n */
    -  qh_RANDOMseed_(seed);
    -
    -  /* ============= print header =============== */
    -
    -  if (iscdd)
    -      qh_fprintf_rbox(rbox.fout, 9391, "%s\nbegin\n        %d %d %s\n",
    -      NOcommand ? "" : command,
    -      totpoints, dim+1,
    -      rbox.isinteger ? "integer" : "real");
    -  else if (NOcommand)
    -      qh_fprintf_rbox(rbox.fout, 9392, "%d\n%d\n", dim, totpoints);
    -  else
    -      /* qh_fprintf_rbox special cases 9393 to append 'command' to the RboxPoints.comment() */
    -      qh_fprintf_rbox(rbox.fout, 9393, "%d %s\n%d\n", dim, command, totpoints);
    -
    -  /* ============= explicit points =============== */
    -  if ((s= first_point)) {
    -    while (s && *s) { /* 'P' */
    -      count= 0;
    -      if (iscdd)
    -        qh_out1( 1.0);
    -      while (*++s) {
    -        qh_out1( qh_strtod(s, &s));
    -        count++;
    -        if (isspace(*s) || !*s)
    -          break;
    -        if (*s != ',') {
    -          qh_fprintf_rbox(rbox.ferr, 6194, "rbox error: missing comma after coordinate in %s\n\n", s);
    -          qh_errexit_rbox(qh_ERRinput);
    -        }
    -      }
    -      if (count < dim) {
    -        for (k=dim-count; k--; )
    -          qh_out1( 0.0);
    -      }else if (count > dim) {
    -        qh_fprintf_rbox(rbox.ferr, 6195, "rbox error: %d coordinates instead of %d coordinates in %s\n\n",
    -                  count, dim, s);
    -        qh_errexit_rbox(qh_ERRinput);
    -      }
    -      qh_fprintf_rbox(rbox.fout, 9394, "\n");
    -      while ((s= strchr(s, 'P'))) {
    -        if (isspace(s[-1]))
    -          break;
    -      }
    -    }
    -  }
    -
    -  /* ============= simplex distribution =============== */
    -  if (issimplex+issimplex2) {
    -    if (!(simplex= (double*)qh_malloc( dim * (dim+1) * sizeof(double)))) {
    -      qh_fprintf_rbox(rbox.ferr, 6196, "rbox error: insufficient memory for simplex\n");
    -      qh_errexit_rbox(qh_ERRmem); /* qh_ERRmem */
    -    }
    -    simplexp= simplex;
    -    if (isregular) {
    -      for (i=0; i randmax/2)
    -          coord[dim-1]= -coord[dim-1];
    -      /* ============= project 'Wn' point toward boundary =============== */
    -      }else if (iswidth && !issphere) {
    -        j= qh_RANDOMint % gendim;
    -        if (coord[j] < 0)
    -          coord[j]= -1.0 - coord[j] * width;
    -        else
    -          coord[j]= 1.0 - coord[j] * width;
    -      }
    -      /* ============= scale point to box =============== */
    -      for (k=0; k=0; k--) {
    -        if (j & ( 1 << k))
    -          qh_out1( cube);
    -        else
    -          qh_out1( -cube);
    -      }
    -      qh_fprintf_rbox(rbox.fout, 9400, "\n");
    -    }
    -  }
    -
    -  /* ============= write diamond vertices =============== */
    -  if (adddiamond) {
    -    for (j=0; j=0; k--) {
    -        if (j/2 != k)
    -          qh_out1( 0.0);
    -        else if (j & 0x1)
    -          qh_out1( diamond);
    -        else
    -          qh_out1( -diamond);
    -      }
    -      qh_fprintf_rbox(rbox.fout, 9401, "\n");
    -    }
    -  }
    -
    -  if (iscdd)
    -    qh_fprintf_rbox(rbox.fout, 9402, "end\nhull\n");
    -
    -  /* same code for error exit and normal return */
    -  qh_free(simplex);
    -  rbox_inuse= False;
    -  return qh_ERRnone;
    -} /* rboxpoints */
    -
    -/*------------------------------------------------
    -outxxx - output functions for qh_rboxpoints
    -*/
    -int qh_roundi( double a) {
    -  if (a < 0.0) {
    -    if (a - 0.5 < INT_MIN) {
    -      qh_fprintf_rbox(rbox.ferr, 6200, "rbox input error: negative coordinate %2.2g is too large.  Reduce 'Bn'\n", a);
    -      qh_errexit_rbox(qh_ERRinput);
    -    }
    -    return (int)(a - 0.5);
    -  }else {
    -    if (a + 0.5 > INT_MAX) {
    -      qh_fprintf_rbox(rbox.ferr, 6201, "rbox input error: coordinate %2.2g is too large.  Reduce 'Bn'\n", a);
    -      qh_errexit_rbox(qh_ERRinput);
    -    }
    -    return (int)(a + 0.5);
    -  }
    -} /* qh_roundi */
    -
    -void qh_out1(double a) {
    -
    -  if (rbox.isinteger)
    -    qh_fprintf_rbox(rbox.fout, 9403, "%d ", qh_roundi( a+rbox.out_offset));
    -  else
    -    qh_fprintf_rbox(rbox.fout, 9404, qh_REAL_1, a+rbox.out_offset);
    -} /* qh_out1 */
    -
    -void qh_out2n( double a, double b) {
    -
    -  if (rbox.isinteger)
    -    qh_fprintf_rbox(rbox.fout, 9405, "%d %d\n", qh_roundi(a+rbox.out_offset), qh_roundi(b+rbox.out_offset));
    -  else
    -    qh_fprintf_rbox(rbox.fout, 9406, qh_REAL_2n, a+rbox.out_offset, b+rbox.out_offset);
    -} /* qh_out2n */
    -
    -void qh_out3n( double a, double b, double c) {
    -
    -  if (rbox.isinteger)
    -    qh_fprintf_rbox(rbox.fout, 9407, "%d %d %d\n", qh_roundi(a+rbox.out_offset), qh_roundi(b+rbox.out_offset), qh_roundi(c+rbox.out_offset));
    -  else
    -    qh_fprintf_rbox(rbox.fout, 9408, qh_REAL_3n, a+rbox.out_offset, b+rbox.out_offset, c+rbox.out_offset);
    -} /* qh_out3n */
    -
    -void qh_outcoord(int iscdd, double *coord, int dim) {
    -    double *p= coord;
    -    int k;
    -
    -    if (iscdd)
    -      qh_out1( 1.0);
    -    for (k=0; k < dim; k++)
    -      qh_out1(*(p++));
    -    qh_fprintf_rbox(rbox.fout, 9396, "\n");
    -} /* qh_outcoord */
    -
    -void qh_outcoincident(int coincidentpoints, double radius, int iscdd, double *coord, int dim) {
    -  double *p;
    -  double randr, delta;
    -  int i,k;
    -  double randmax= qh_RANDOMmax;
    -
    -  for (i= 0; i
      ---------------------------------
    -
    -   stat.c
    -   contains all statistics that are collected for qhull
    -
    -   see qh-stat.htm and stat.h
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull/stat.c#5 $$Change: 2062 $
    -   $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    -*/
    -
    -#include "qhull_a.h"
    -
    -/*============ global data structure ==========*/
    -
    -#if qh_QHpointer
    -qhstatT *qh_qhstat=NULL;  /* global data structure */
    -#else
    -qhstatT qh_qhstat;   /* add "={0}" if this causes a compiler error */
    -#endif
    -
    -/*========== functions in alphabetic order ================*/
    -
    -/*---------------------------------
    -
    -  qh_allstatA()
    -    define statistics in groups of 20
    -
    -  notes:
    -    (otherwise, 'gcc -O2' uses too much memory)
    -    uses qhstat.next
    -*/
    -void qh_allstatA(void) {
    -
    -   /* zdef_(type,name,doc,average) */
    -  zzdef_(zdoc, Zdoc2, "precision statistics", -1);
    -  zdef_(zinc, Znewvertex, NULL, -1);
    -  zdef_(wadd, Wnewvertex, "ave. distance of a new vertex to a facet(!0s)", Znewvertex);
    -  zzdef_(wmax, Wnewvertexmax, "max. distance of a new vertex to a facet", -1);
    -  zdef_(wmax, Wvertexmax, "max. distance of an output vertex to a facet", -1);
    -  zdef_(wmin, Wvertexmin, "min. distance of an output vertex to a facet", -1);
    -  zdef_(wmin, Wmindenom, "min. denominator in hyperplane computation", -1);
    -
    -  qhstat precision= qhstat next;  /* call qh_precision for each of these */
    -  zzdef_(zdoc, Zdoc3, "precision problems (corrected unless 'Q0' or an error)", -1);
    -  zzdef_(zinc, Zcoplanarridges, "coplanar half ridges in output", -1);
    -  zzdef_(zinc, Zconcaveridges, "concave half ridges in output", -1);
    -  zzdef_(zinc, Zflippedfacets, "flipped facets", -1);
    -  zzdef_(zinc, Zcoplanarhorizon, "coplanar horizon facets for new vertices", -1);
    -  zzdef_(zinc, Zcoplanarpart, "coplanar points during partitioning", -1);
    -  zzdef_(zinc, Zminnorm, "degenerate hyperplanes recomputed with gaussian elimination", -1);
    -  zzdef_(zinc, Znearlysingular, "nearly singular or axis-parallel hyperplanes", -1);
    -  zzdef_(zinc, Zback0, "zero divisors during back substitute", -1);
    -  zzdef_(zinc, Zgauss0, "zero divisors during gaussian elimination", -1);
    -  zzdef_(zinc, Zmultiridge, "ridges with multiple neighbors", -1);
    -}
    -void qh_allstatB(void) {
    -  zzdef_(zdoc, Zdoc1, "summary information", -1);
    -  zdef_(zinc, Zvertices, "number of vertices in output", -1);
    -  zdef_(zinc, Znumfacets, "number of facets in output", -1);
    -  zdef_(zinc, Znonsimplicial, "number of non-simplicial facets in output", -1);
    -  zdef_(zinc, Znowsimplicial, "number of simplicial facets that were merged", -1);
    -  zdef_(zinc, Znumridges, "number of ridges in output", -1);
    -  zdef_(zadd, Znumridges, "average number of ridges per facet", Znumfacets);
    -  zdef_(zmax, Zmaxridges, "maximum number of ridges", -1);
    -  zdef_(zadd, Znumneighbors, "average number of neighbors per facet", Znumfacets);
    -  zdef_(zmax, Zmaxneighbors, "maximum number of neighbors", -1);
    -  zdef_(zadd, Znumvertices, "average number of vertices per facet", Znumfacets);
    -  zdef_(zmax, Zmaxvertices, "maximum number of vertices", -1);
    -  zdef_(zadd, Znumvneighbors, "average number of neighbors per vertex", Zvertices);
    -  zdef_(zmax, Zmaxvneighbors, "maximum number of neighbors", -1);
    -  zdef_(wadd, Wcpu, "cpu seconds for qhull after input", -1);
    -  zdef_(zinc, Ztotvertices, "vertices created altogether", -1);
    -  zzdef_(zinc, Zsetplane, "facets created altogether", -1);
    -  zdef_(zinc, Ztotridges, "ridges created altogether", -1);
    -  zdef_(zinc, Zpostfacets, "facets before post merge", -1);
    -  zdef_(zadd, Znummergetot, "average merges per facet(at most 511)", Znumfacets);
    -  zdef_(zmax, Znummergemax, "  maximum merges for a facet(at most 511)", -1);
    -  zdef_(zinc, Zangle, NULL, -1);
    -  zdef_(wadd, Wangle, "average angle(cosine) of facet normals for all ridges", Zangle);
    -  zdef_(wmax, Wanglemax, "  maximum angle(cosine) of facet normals across a ridge", -1);
    -  zdef_(wmin, Wanglemin, "  minimum angle(cosine) of facet normals across a ridge", -1);
    -  zdef_(wadd, Wareatot, "total area of facets", -1);
    -  zdef_(wmax, Wareamax, "  maximum facet area", -1);
    -  zdef_(wmin, Wareamin, "  minimum facet area", -1);
    -}
    -void qh_allstatC(void) {
    -  zdef_(zdoc, Zdoc9, "build hull statistics", -1);
    -  zzdef_(zinc, Zprocessed, "points processed", -1);
    -  zzdef_(zinc, Zretry, "retries due to precision problems", -1);
    -  zdef_(wmax, Wretrymax, "  max. random joggle", -1);
    -  zdef_(zmax, Zmaxvertex, "max. vertices at any one time", -1);
    -  zdef_(zinc, Ztotvisible, "ave. visible facets per iteration", Zprocessed);
    -  zdef_(zinc, Zinsidevisible, "  ave. visible facets without an horizon neighbor", Zprocessed);
    -  zdef_(zadd, Zvisfacettot,  "  ave. facets deleted per iteration", Zprocessed);
    -  zdef_(zmax, Zvisfacetmax,  "    maximum", -1);
    -  zdef_(zadd, Zvisvertextot, "ave. visible vertices per iteration", Zprocessed);
    -  zdef_(zmax, Zvisvertexmax, "    maximum", -1);
    -  zdef_(zinc, Ztothorizon, "ave. horizon facets per iteration", Zprocessed);
    -  zdef_(zadd, Znewfacettot,  "ave. new or merged facets per iteration", Zprocessed);
    -  zdef_(zmax, Znewfacetmax,  "    maximum(includes initial simplex)", -1);
    -  zdef_(wadd, Wnewbalance, "average new facet balance", Zprocessed);
    -  zdef_(wadd, Wnewbalance2, "  standard deviation", -1);
    -  zdef_(wadd, Wpbalance, "average partition balance", Zpbalance);
    -  zdef_(wadd, Wpbalance2, "  standard deviation", -1);
    -  zdef_(zinc, Zpbalance, "  number of trials", -1);
    -  zdef_(zinc, Zsearchpoints, "searches of all points for initial simplex", -1);
    -  zdef_(zinc, Zdetsimplex, "determinants computed(area & initial hull)", -1);
    -  zdef_(zinc, Znoarea, "determinants not computed because vertex too low", -1);
    -  zdef_(zinc, Znotmax, "points ignored(!above max_outside)", -1);
    -  zdef_(zinc, Znotgood, "points ignored(!above a good facet)", -1);
    -  zdef_(zinc, Znotgoodnew, "points ignored(didn't create a good new facet)", -1);
    -  zdef_(zinc, Zgoodfacet, "good facets found", -1);
    -  zzdef_(zinc, Znumvisibility, "distance tests for facet visibility", -1);
    -  zdef_(zinc, Zdistvertex, "distance tests to report minimum vertex", -1);
    -  zzdef_(zinc, Ztotcheck, "points checked for facets' outer planes", -1);
    -  zzdef_(zinc, Zcheckpart, "  ave. distance tests per check", Ztotcheck);
    -}
    -void qh_allstatD(void) {
    -  zdef_(zinc, Zvisit, "resets of visit_id", -1);
    -  zdef_(zinc, Zvvisit, "  resets of vertex_visit", -1);
    -  zdef_(zmax, Zvisit2max, "  max visit_id/2", -1);
    -  zdef_(zmax, Zvvisit2max, "  max vertex_visit/2", -1);
    -
    -  zdef_(zdoc, Zdoc4, "partitioning statistics(see previous for outer planes)", -1);
    -  zzdef_(zadd, Zdelvertextot, "total vertices deleted", -1);
    -  zdef_(zmax, Zdelvertexmax, "    maximum vertices deleted per iteration", -1);
    -  zdef_(zinc, Zfindbest, "calls to findbest", -1);
    -  zdef_(zadd, Zfindbesttot, " ave. facets tested", Zfindbest);
    -  zdef_(zmax, Zfindbestmax, " max. facets tested", -1);
    -  zdef_(zadd, Zfindcoplanar, " ave. coplanar search", Zfindbest);
    -  zdef_(zinc, Zfindnew, "calls to findbestnew", -1);
    -  zdef_(zadd, Zfindnewtot, " ave. facets tested", Zfindnew);
    -  zdef_(zmax, Zfindnewmax, " max. facets tested", -1);
    -  zdef_(zinc, Zfindnewjump, " ave. clearly better", Zfindnew);
    -  zdef_(zinc, Zfindnewsharp, " calls due to qh_sharpnewfacets", -1);
    -  zdef_(zinc, Zfindhorizon, "calls to findhorizon", -1);
    -  zdef_(zadd, Zfindhorizontot, " ave. facets tested", Zfindhorizon);
    -  zdef_(zmax, Zfindhorizonmax, " max. facets tested", -1);
    -  zdef_(zinc, Zfindjump,       " ave. clearly better", Zfindhorizon);
    -  zdef_(zinc, Zparthorizon, " horizon facets better than bestfacet", -1);
    -  zdef_(zinc, Zpartangle, "angle tests for repartitioned coplanar points", -1);
    -  zdef_(zinc, Zpartflip, "  repartitioned coplanar points for flipped orientation", -1);
    -}
    -void qh_allstatE(void) {
    -  zdef_(zinc, Zpartinside, "inside points", -1);
    -  zdef_(zinc, Zpartnear, "  inside points kept with a facet", -1);
    -  zdef_(zinc, Zcoplanarinside, "  inside points that were coplanar with a facet", -1);
    -  zdef_(zinc, Zbestlower, "calls to findbestlower", -1);
    -  zdef_(zinc, Zbestlowerv, "  with search of vertex neighbors", -1);
    -  zdef_(zinc, Zbestlowerall, "  with rare search of all facets", -1);
    -  zdef_(zmax, Zbestloweralln, "  facets per search of all facets", -1);
    -  zdef_(wadd, Wmaxout, "difference in max_outside at final check", -1);
    -  zzdef_(zinc, Zpartitionall, "distance tests for initial partition", -1);
    -  zdef_(zinc, Ztotpartition, "partitions of a point", -1);
    -  zzdef_(zinc, Zpartition, "distance tests for partitioning", -1);
    -  zzdef_(zinc, Zdistcheck, "distance tests for checking flipped facets", -1);
    -  zzdef_(zinc, Zdistconvex, "distance tests for checking convexity", -1);
    -  zdef_(zinc, Zdistgood, "distance tests for checking good point", -1);
    -  zdef_(zinc, Zdistio, "distance tests for output", -1);
    -  zdef_(zinc, Zdiststat, "distance tests for statistics", -1);
    -  zdef_(zinc, Zdistplane, "total number of distance tests", -1);
    -  zdef_(zinc, Ztotpartcoplanar, "partitions of coplanar points or deleted vertices", -1);
    -  zzdef_(zinc, Zpartcoplanar, "   distance tests for these partitions", -1);
    -  zdef_(zinc, Zcomputefurthest, "distance tests for computing furthest", -1);
    -}
    -void qh_allstatE2(void) {
    -  zdef_(zdoc, Zdoc5, "statistics for matching ridges", -1);
    -  zdef_(zinc, Zhashlookup, "total lookups for matching ridges of new facets", -1);
    -  zdef_(zinc, Zhashtests, "average number of tests to match a ridge", Zhashlookup);
    -  zdef_(zinc, Zhashridge, "total lookups of subridges(duplicates and boundary)", -1);
    -  zdef_(zinc, Zhashridgetest, "average number of tests per subridge", Zhashridge);
    -  zdef_(zinc, Zdupsame, "duplicated ridges in same merge cycle", -1);
    -  zdef_(zinc, Zdupflip, "duplicated ridges with flipped facets", -1);
    -
    -  zdef_(zdoc, Zdoc6, "statistics for determining merges", -1);
    -  zdef_(zinc, Zangletests, "angles computed for ridge convexity", -1);
    -  zdef_(zinc, Zbestcentrum, "best merges used centrum instead of vertices",-1);
    -  zzdef_(zinc, Zbestdist, "distance tests for best merge", -1);
    -  zzdef_(zinc, Zcentrumtests, "distance tests for centrum convexity", -1);
    -  zzdef_(zinc, Zdistzero, "distance tests for checking simplicial convexity", -1);
    -  zdef_(zinc, Zcoplanarangle, "coplanar angles in getmergeset", -1);
    -  zdef_(zinc, Zcoplanarcentrum, "coplanar centrums in getmergeset", -1);
    -  zdef_(zinc, Zconcaveridge, "concave ridges in getmergeset", -1);
    -}
    -void qh_allstatF(void) {
    -  zdef_(zdoc, Zdoc7, "statistics for merging", -1);
    -  zdef_(zinc, Zpremergetot, "merge iterations", -1);
    -  zdef_(zadd, Zmergeinittot, "ave. initial non-convex ridges per iteration", Zpremergetot);
    -  zdef_(zadd, Zmergeinitmax, "  maximum", -1);
    -  zdef_(zadd, Zmergesettot, "  ave. additional non-convex ridges per iteration", Zpremergetot);
    -  zdef_(zadd, Zmergesetmax, "  maximum additional in one pass", -1);
    -  zdef_(zadd, Zmergeinittot2, "initial non-convex ridges for post merging", -1);
    -  zdef_(zadd, Zmergesettot2, "  additional non-convex ridges", -1);
    -  zdef_(wmax, Wmaxoutside, "max distance of vertex or coplanar point above facet(w/roundoff)", -1);
    -  zdef_(wmin, Wminvertex, "max distance of merged vertex below facet(or roundoff)", -1);
    -  zdef_(zinc, Zwidefacet, "centrums frozen due to a wide merge", -1);
    -  zdef_(zinc, Zwidevertices, "centrums frozen due to extra vertices", -1);
    -  zzdef_(zinc, Ztotmerge, "total number of facets or cycles of facets merged", -1);
    -  zdef_(zinc, Zmergesimplex, "merged a simplex", -1);
    -  zdef_(zinc, Zonehorizon, "simplices merged into coplanar horizon", -1);
    -  zzdef_(zinc, Zcyclehorizon, "cycles of facets merged into coplanar horizon", -1);
    -  zzdef_(zadd, Zcyclefacettot, "  ave. facets per cycle", Zcyclehorizon);
    -  zdef_(zmax, Zcyclefacetmax, "  max. facets", -1);
    -  zdef_(zinc, Zmergeintohorizon, "new facets merged into horizon", -1);
    -  zdef_(zinc, Zmergenew, "new facets merged", -1);
    -  zdef_(zinc, Zmergehorizon, "horizon facets merged into new facets", -1);
    -  zdef_(zinc, Zmergevertex, "vertices deleted by merging", -1);
    -  zdef_(zinc, Zcyclevertex, "vertices deleted by merging into coplanar horizon", -1);
    -  zdef_(zinc, Zdegenvertex, "vertices deleted by degenerate facet", -1);
    -  zdef_(zinc, Zmergeflipdup, "merges due to flipped facets in duplicated ridge", -1);
    -  zdef_(zinc, Zneighbor, "merges due to redundant neighbors", -1);
    -  zdef_(zadd, Ztestvneighbor, "non-convex vertex neighbors", -1);
    -}
    -void qh_allstatG(void) {
    -  zdef_(zinc, Zacoplanar, "merges due to angle coplanar facets", -1);
    -  zdef_(wadd, Wacoplanartot, "  average merge distance", Zacoplanar);
    -  zdef_(wmax, Wacoplanarmax, "  maximum merge distance", -1);
    -  zdef_(zinc, Zcoplanar, "merges due to coplanar facets", -1);
    -  zdef_(wadd, Wcoplanartot, "  average merge distance", Zcoplanar);
    -  zdef_(wmax, Wcoplanarmax, "  maximum merge distance", -1);
    -  zdef_(zinc, Zconcave, "merges due to concave facets", -1);
    -  zdef_(wadd, Wconcavetot, "  average merge distance", Zconcave);
    -  zdef_(wmax, Wconcavemax, "  maximum merge distance", -1);
    -  zdef_(zinc, Zavoidold, "coplanar/concave merges due to avoiding old merge", -1);
    -  zdef_(wadd, Wavoidoldtot, "  average merge distance", Zavoidold);
    -  zdef_(wmax, Wavoidoldmax, "  maximum merge distance", -1);
    -  zdef_(zinc, Zdegen, "merges due to degenerate facets", -1);
    -  zdef_(wadd, Wdegentot, "  average merge distance", Zdegen);
    -  zdef_(wmax, Wdegenmax, "  maximum merge distance", -1);
    -  zdef_(zinc, Zflipped, "merges due to removing flipped facets", -1);
    -  zdef_(wadd, Wflippedtot, "  average merge distance", Zflipped);
    -  zdef_(wmax, Wflippedmax, "  maximum merge distance", -1);
    -  zdef_(zinc, Zduplicate, "merges due to duplicated ridges", -1);
    -  zdef_(wadd, Wduplicatetot, "  average merge distance", Zduplicate);
    -  zdef_(wmax, Wduplicatemax, "  maximum merge distance", -1);
    -}
    -void qh_allstatH(void) {
    -  zdef_(zdoc, Zdoc8, "renamed vertex statistics", -1);
    -  zdef_(zinc, Zrenameshare, "renamed vertices shared by two facets", -1);
    -  zdef_(zinc, Zrenamepinch, "renamed vertices in a pinched facet", -1);
    -  zdef_(zinc, Zrenameall, "renamed vertices shared by multiple facets", -1);
    -  zdef_(zinc, Zfindfail, "rename failures due to duplicated ridges", -1);
    -  zdef_(zinc, Zdupridge, "  duplicate ridges detected", -1);
    -  zdef_(zinc, Zdelridge, "deleted ridges due to renamed vertices", -1);
    -  zdef_(zinc, Zdropneighbor, "dropped neighbors due to renamed vertices", -1);
    -  zdef_(zinc, Zdropdegen, "degenerate facets due to dropped neighbors", -1);
    -  zdef_(zinc, Zdelfacetdup, "  facets deleted because of no neighbors", -1);
    -  zdef_(zinc, Zremvertex, "vertices removed from facets due to no ridges", -1);
    -  zdef_(zinc, Zremvertexdel, "  deleted", -1);
    -  zdef_(zinc, Zintersectnum, "vertex intersections for locating redundant vertices", -1);
    -  zdef_(zinc, Zintersectfail, "intersections failed to find a redundant vertex", -1);
    -  zdef_(zinc, Zintersect, "intersections found redundant vertices", -1);
    -  zdef_(zadd, Zintersecttot, "   ave. number found per vertex", Zintersect);
    -  zdef_(zmax, Zintersectmax, "   max. found for a vertex", -1);
    -  zdef_(zinc, Zvertexridge, NULL, -1);
    -  zdef_(zadd, Zvertexridgetot, "  ave. number of ridges per tested vertex", Zvertexridge);
    -  zdef_(zmax, Zvertexridgemax, "  max. number of ridges per tested vertex", -1);
    -
    -  zdef_(zdoc, Zdoc10, "memory usage statistics(in bytes)", -1);
    -  zdef_(zadd, Zmemfacets, "for facets and their normals, neighbor and vertex sets", -1);
    -  zdef_(zadd, Zmemvertices, "for vertices and their neighbor sets", -1);
    -  zdef_(zadd, Zmempoints, "for input points and outside and coplanar sets",-1);
    -  zdef_(zadd, Zmemridges, "for ridges and their vertex sets", -1);
    -} /* allstat */
    -
    -void qh_allstatI(void) {
    -  qhstat vridges= qhstat next;
    -  zzdef_(zdoc, Zdoc11, "Voronoi ridge statistics", -1);
    -  zzdef_(zinc, Zridge, "non-simplicial Voronoi vertices for all ridges", -1);
    -  zzdef_(wadd, Wridge, "  ave. distance to ridge", Zridge);
    -  zzdef_(wmax, Wridgemax, "  max. distance to ridge", -1);
    -  zzdef_(zinc, Zridgemid, "bounded ridges", -1);
    -  zzdef_(wadd, Wridgemid, "  ave. distance of midpoint to ridge", Zridgemid);
    -  zzdef_(wmax, Wridgemidmax, "  max. distance of midpoint to ridge", -1);
    -  zzdef_(zinc, Zridgeok, "bounded ridges with ok normal", -1);
    -  zzdef_(wadd, Wridgeok, "  ave. angle to ridge", Zridgeok);
    -  zzdef_(wmax, Wridgeokmax, "  max. angle to ridge", -1);
    -  zzdef_(zinc, Zridge0, "bounded ridges with near-zero normal", -1);
    -  zzdef_(wadd, Wridge0, "  ave. angle to ridge", Zridge0);
    -  zzdef_(wmax, Wridge0max, "  max. angle to ridge", -1);
    -
    -  zdef_(zdoc, Zdoc12, "Triangulation statistics(Qt)", -1);
    -  zdef_(zinc, Ztricoplanar, "non-simplicial facets triangulated", -1);
    -  zdef_(zadd, Ztricoplanartot, "  ave. new facets created(may be deleted)", Ztricoplanar);
    -  zdef_(zmax, Ztricoplanarmax, "  max. new facets created", -1);
    -  zdef_(zinc, Ztrinull, "null new facets deleted(duplicated vertex)", -1);
    -  zdef_(zinc, Ztrimirror, "mirrored pairs of new facets deleted(same vertices)", -1);
    -  zdef_(zinc, Ztridegen, "degenerate new facets in output(same ridge)", -1);
    -} /* allstat */
    -
    -/*---------------------------------
    -
    -  qh_allstatistics()
    -    reset printed flag for all statistics
    -*/
    -void qh_allstatistics(void) {
    -  int i;
    -
    -  for(i=ZEND; i--; )
    -    qhstat printed[i]= False;
    -} /* allstatistics */
    -
    -#if qh_KEEPstatistics
    -/*---------------------------------
    -
    -  qh_collectstatistics()
    -    collect statistics for qh.facet_list
    -
    -*/
    -void qh_collectstatistics(void) {
    -  facetT *facet, *neighbor, **neighborp;
    -  vertexT *vertex, **vertexp;
    -  realT dotproduct, dist;
    -  int sizneighbors, sizridges, sizvertices, i;
    -
    -  qh old_randomdist= qh RANDOMdist;
    -  qh RANDOMdist= False;
    -  zval_(Zmempoints)= qh num_points * qh normal_size +
    -                             sizeof(qhT) + sizeof(qhstatT);
    -  zval_(Zmemfacets)= 0;
    -  zval_(Zmemridges)= 0;
    -  zval_(Zmemvertices)= 0;
    -  zval_(Zangle)= 0;
    -  wval_(Wangle)= 0.0;
    -  zval_(Znumridges)= 0;
    -  zval_(Znumfacets)= 0;
    -  zval_(Znumneighbors)= 0;
    -  zval_(Znumvertices)= 0;
    -  zval_(Znumvneighbors)= 0;
    -  zval_(Znummergetot)= 0;
    -  zval_(Znummergemax)= 0;
    -  zval_(Zvertices)= qh num_vertices - qh_setsize(qh del_vertices);
    -  if (qh MERGING || qh APPROXhull || qh JOGGLEmax < REALmax/2)
    -    wmax_(Wmaxoutside, qh max_outside);
    -  if (qh MERGING)
    -    wmin_(Wminvertex, qh min_vertex);
    -  FORALLfacets
    -    facet->seen= False;
    -  if (qh DELAUNAY) {
    -    FORALLfacets {
    -      if (facet->upperdelaunay != qh UPPERdelaunay)
    -        facet->seen= True; /* remove from angle statistics */
    -    }
    -  }
    -  FORALLfacets {
    -    if (facet->visible && qh NEWfacets)
    -      continue;
    -    sizvertices= qh_setsize(facet->vertices);
    -    sizneighbors= qh_setsize(facet->neighbors);
    -    sizridges= qh_setsize(facet->ridges);
    -    zinc_(Znumfacets);
    -    zadd_(Znumvertices, sizvertices);
    -    zmax_(Zmaxvertices, sizvertices);
    -    zadd_(Znumneighbors, sizneighbors);
    -    zmax_(Zmaxneighbors, sizneighbors);
    -    zadd_(Znummergetot, facet->nummerge);
    -    i= facet->nummerge; /* avoid warnings */
    -    zmax_(Znummergemax, i);
    -    if (!facet->simplicial) {
    -      if (sizvertices == qh hull_dim) {
    -        zinc_(Znowsimplicial);
    -      }else {
    -        zinc_(Znonsimplicial);
    -      }
    -    }
    -    if (sizridges) {
    -      zadd_(Znumridges, sizridges);
    -      zmax_(Zmaxridges, sizridges);
    -    }
    -    zadd_(Zmemfacets, sizeof(facetT) + qh normal_size + 2*sizeof(setT)
    -       + SETelemsize * (sizneighbors + sizvertices));
    -    if (facet->ridges) {
    -      zadd_(Zmemridges,
    -         sizeof(setT) + SETelemsize * sizridges + sizridges *
    -         (sizeof(ridgeT) + sizeof(setT) + SETelemsize * (qh hull_dim-1))/2);
    -    }
    -    if (facet->outsideset)
    -      zadd_(Zmempoints, sizeof(setT) + SETelemsize * qh_setsize(facet->outsideset));
    -    if (facet->coplanarset)
    -      zadd_(Zmempoints, sizeof(setT) + SETelemsize * qh_setsize(facet->coplanarset));
    -    if (facet->seen) /* Delaunay upper envelope */
    -      continue;
    -    facet->seen= True;
    -    FOREACHneighbor_(facet) {
    -      if (neighbor == qh_DUPLICATEridge || neighbor == qh_MERGEridge
    -          || neighbor->seen || !facet->normal || !neighbor->normal)
    -        continue;
    -      dotproduct= qh_getangle(facet->normal, neighbor->normal);
    -      zinc_(Zangle);
    -      wadd_(Wangle, dotproduct);
    -      wmax_(Wanglemax, dotproduct)
    -      wmin_(Wanglemin, dotproduct)
    -    }
    -    if (facet->normal) {
    -      FOREACHvertex_(facet->vertices) {
    -        zinc_(Zdiststat);
    -        qh_distplane(vertex->point, facet, &dist);
    -        wmax_(Wvertexmax, dist);
    -        wmin_(Wvertexmin, dist);
    -      }
    -    }
    -  }
    -  FORALLvertices {
    -    if (vertex->deleted)
    -      continue;
    -    zadd_(Zmemvertices, sizeof(vertexT));
    -    if (vertex->neighbors) {
    -      sizneighbors= qh_setsize(vertex->neighbors);
    -      zadd_(Znumvneighbors, sizneighbors);
    -      zmax_(Zmaxvneighbors, sizneighbors);
    -      zadd_(Zmemvertices, sizeof(vertexT) + SETelemsize * sizneighbors);
    -    }
    -  }
    -  qh RANDOMdist= qh old_randomdist;
    -} /* collectstatistics */
    -#endif /* qh_KEEPstatistics */
    -
    -/*---------------------------------
    -
    -  qh_freestatistics(  )
    -    free memory used for statistics
    -*/
    -void qh_freestatistics(void) {
    -
    -#if qh_QHpointer
    -  qh_free(qh_qhstat);
    -  qh_qhstat= NULL;
    -#endif
    -} /* freestatistics */
    -
    -/*---------------------------------
    -
    -  qh_initstatistics(  )
    -    allocate and initialize statistics
    -
    -  notes:
    -    uses qh_malloc() instead of qh_memalloc() since mem.c not set up yet
    -    NOerrors -- qh_initstatistics can not use qh_errexit(), qh_fprintf, or qh.ferr
    -    On first call, only qhmem.ferr is defined.  qh_memalloc is not setup.
    -    Also invoked by QhullQh().
    -*/
    -void qh_initstatistics(void) {
    -  int i;
    -  realT realx;
    -  int intx;
    -
    -#if qh_QHpointer
    -  if(qh_qhstat){  /* qh_initstatistics may be called from Qhull::resetStatistics() */
    -      qh_free(qh_qhstat);
    -      qh_qhstat= 0;
    -  }
    -  if (!(qh_qhstat= (qhstatT *)qh_malloc(sizeof(qhstatT)))) {
    -    qh_fprintf_stderr(6183, "qhull error (qh_initstatistics): insufficient memory\n");
    -    qh_exit(qh_ERRmem);  /* can not use qh_errexit() */
    -  }
    -#endif
    -
    -  qhstat next= 0;
    -  qh_allstatA();
    -  qh_allstatB();
    -  qh_allstatC();
    -  qh_allstatD();
    -  qh_allstatE();
    -  qh_allstatE2();
    -  qh_allstatF();
    -  qh_allstatG();
    -  qh_allstatH();
    -  qh_allstatI();
    -  if (qhstat next > (int)sizeof(qhstat id)) {
    -    qh_fprintf(qhmem.ferr, 6184, "qhull error (qh_initstatistics): increase size of qhstat.id[].\n\
    -      qhstat.next %d should be <= sizeof(qhstat id) %d\n", qhstat next, (int)sizeof(qhstat id));
    -#if 0 /* for locating error, Znumridges should be duplicated */
    -    for(i=0; i < ZEND; i++) {
    -      int j;
    -      for(j=i+1; j < ZEND; j++) {
    -        if (qhstat id[i] == qhstat id[j]) {
    -          qh_fprintf(qhmem.ferr, 6185, "qhull error (qh_initstatistics): duplicated statistic %d at indices %d and %d\n",
    -              qhstat id[i], i, j);
    -        }
    -      }
    -    }
    -#endif
    -    qh_exit(qh_ERRqhull);  /* can not use qh_errexit() */
    -  }
    -  qhstat init[zinc].i= 0;
    -  qhstat init[zadd].i= 0;
    -  qhstat init[zmin].i= INT_MAX;
    -  qhstat init[zmax].i= INT_MIN;
    -  qhstat init[wadd].r= 0;
    -  qhstat init[wmin].r= REALmax;
    -  qhstat init[wmax].r= -REALmax;
    -  for(i=0; i < ZEND; i++) {
    -    if (qhstat type[i] > ZTYPEreal) {
    -      realx= qhstat init[(unsigned char)(qhstat type[i])].r;
    -      qhstat stats[i].r= realx;
    -    }else if (qhstat type[i] != zdoc) {
    -      intx= qhstat init[(unsigned char)(qhstat type[i])].i;
    -      qhstat stats[i].i= intx;
    -    }
    -  }
    -} /* initstatistics */
    -
    -/*---------------------------------
    -
    -  qh_newstats(  )
    -    returns True if statistics for zdoc
    -
    -  returns:
    -    next zdoc
    -*/
    -boolT qh_newstats(int idx, int *nextindex) {
    -  boolT isnew= False;
    -  int start, i;
    -
    -  if (qhstat type[qhstat id[idx]] == zdoc)
    -    start= idx+1;
    -  else
    -    start= idx;
    -  for(i= start; i < qhstat next && qhstat type[qhstat id[i]] != zdoc; i++) {
    -    if (!qh_nostatistic(qhstat id[i]) && !qhstat printed[qhstat id[i]])
    -        isnew= True;
    -  }
    -  *nextindex= i;
    -  return isnew;
    -} /* newstats */
    -
    -/*---------------------------------
    -
    -  qh_nostatistic( index )
    -    true if no statistic to print
    -*/
    -boolT qh_nostatistic(int i) {
    -
    -  if ((qhstat type[i] > ZTYPEreal
    -       &&qhstat stats[i].r == qhstat init[(unsigned char)(qhstat type[i])].r)
    -      || (qhstat type[i] < ZTYPEreal
    -          &&qhstat stats[i].i == qhstat init[(unsigned char)(qhstat type[i])].i))
    -    return True;
    -  return False;
    -} /* nostatistic */
    -
    -#if qh_KEEPstatistics
    -/*---------------------------------
    -
    -  qh_printallstatistics( fp, string )
    -    print all statistics with header 'string'
    -*/
    -void qh_printallstatistics(FILE *fp, const char *string) {
    -
    -  qh_allstatistics();
    -  qh_collectstatistics();
    -  qh_printstatistics(fp, string);
    -  qh_memstatistics(fp);
    -}
    -
    -
    -/*---------------------------------
    -
    -  qh_printstatistics( fp, string )
    -    print statistics to a file with header 'string'
    -    skips statistics with qhstat.printed[] (reset with qh_allstatistics)
    -
    -  see:
    -    qh_printallstatistics()
    -*/
    -void qh_printstatistics(FILE *fp, const char *string) {
    -  int i, k;
    -  realT ave;
    -
    -  if (qh num_points != qh num_vertices) {
    -    wval_(Wpbalance)= 0;
    -    wval_(Wpbalance2)= 0;
    -  }else
    -    wval_(Wpbalance2)= qh_stddev(zval_(Zpbalance), wval_(Wpbalance),
    -                                 wval_(Wpbalance2), &ave);
    -  wval_(Wnewbalance2)= qh_stddev(zval_(Zprocessed), wval_(Wnewbalance),
    -                                 wval_(Wnewbalance2), &ave);
    -  qh_fprintf(fp, 9350, "\n\
    -%s\n\
    - qhull invoked by: %s | %s\n%s with options:\n%s\n", string, qh rbox_command,
    -     qh qhull_command, qh_version, qh qhull_options);
    -  qh_fprintf(fp, 9351, "\nprecision constants:\n\
    - %6.2g max. abs. coordinate in the (transformed) input('Qbd:n')\n\
    - %6.2g max. roundoff error for distance computation('En')\n\
    - %6.2g max. roundoff error for angle computations\n\
    - %6.2g min. distance for outside points ('Wn')\n\
    - %6.2g min. distance for visible facets ('Vn')\n\
    - %6.2g max. distance for coplanar facets ('Un')\n\
    - %6.2g max. facet width for recomputing centrum and area\n\
    -",
    -  qh MAXabs_coord, qh DISTround, qh ANGLEround, qh MINoutside,
    -        qh MINvisible, qh MAXcoplanar, qh WIDEfacet);
    -  if (qh KEEPnearinside)
    -    qh_fprintf(fp, 9352, "\
    - %6.2g max. distance for near-inside points\n", qh NEARinside);
    -  if (qh premerge_cos < REALmax/2) qh_fprintf(fp, 9353, "\
    - %6.2g max. cosine for pre-merge angle\n", qh premerge_cos);
    -  if (qh PREmerge) qh_fprintf(fp, 9354, "\
    - %6.2g radius of pre-merge centrum\n", qh premerge_centrum);
    -  if (qh postmerge_cos < REALmax/2) qh_fprintf(fp, 9355, "\
    - %6.2g max. cosine for post-merge angle\n", qh postmerge_cos);
    -  if (qh POSTmerge) qh_fprintf(fp, 9356, "\
    - %6.2g radius of post-merge centrum\n", qh postmerge_centrum);
    -  qh_fprintf(fp, 9357, "\
    - %6.2g max. distance for merging two simplicial facets\n\
    - %6.2g max. roundoff error for arithmetic operations\n\
    - %6.2g min. denominator for divisions\n\
    -  zero diagonal for Gauss: ", qh ONEmerge, REALepsilon, qh MINdenom);
    -  for(k=0; k < qh hull_dim; k++)
    -    qh_fprintf(fp, 9358, "%6.2e ", qh NEARzero[k]);
    -  qh_fprintf(fp, 9359, "\n\n");
    -  for(i=0 ; i < qhstat next; )
    -    qh_printstats(fp, i, &i);
    -} /* printstatistics */
    -#endif /* qh_KEEPstatistics */
    -
    -/*---------------------------------
    -
    -  qh_printstatlevel( fp, id )
    -    print level information for a statistic
    -
    -  notes:
    -    nop if id >= ZEND, printed, or same as initial value
    -*/
    -void qh_printstatlevel(FILE *fp, int id) {
    -#define NULLfield "       "
    -
    -  if (id >= ZEND || qhstat printed[id])
    -    return;
    -  if (qhstat type[id] == zdoc) {
    -    qh_fprintf(fp, 9360, "%s\n", qhstat doc[id]);
    -    return;
    -  }
    -  if (qh_nostatistic(id) || !qhstat doc[id])
    -    return;
    -  qhstat printed[id]= True;
    -  if (qhstat count[id] != -1
    -      && qhstat stats[(unsigned char)(qhstat count[id])].i == 0)
    -    qh_fprintf(fp, 9361, " *0 cnt*");
    -  else if (qhstat type[id] >= ZTYPEreal && qhstat count[id] == -1)
    -    qh_fprintf(fp, 9362, "%7.2g", qhstat stats[id].r);
    -  else if (qhstat type[id] >= ZTYPEreal && qhstat count[id] != -1)
    -    qh_fprintf(fp, 9363, "%7.2g", qhstat stats[id].r/ qhstat stats[(unsigned char)(qhstat count[id])].i);
    -  else if (qhstat type[id] < ZTYPEreal && qhstat count[id] == -1)
    -    qh_fprintf(fp, 9364, "%7d", qhstat stats[id].i);
    -  else if (qhstat type[id] < ZTYPEreal && qhstat count[id] != -1)
    -    qh_fprintf(fp, 9365, "%7.3g", (realT) qhstat stats[id].i / qhstat stats[(unsigned char)(qhstat count[id])].i);
    -  qh_fprintf(fp, 9366, " %s\n", qhstat doc[id]);
    -} /* printstatlevel */
    -
    -
    -/*---------------------------------
    -
    -  qh_printstats( fp, index, nextindex )
    -    print statistics for a zdoc group
    -
    -  returns:
    -    next zdoc if non-null
    -*/
    -void qh_printstats(FILE *fp, int idx, int *nextindex) {
    -  int j, nexti;
    -
    -  if (qh_newstats(idx, &nexti)) {
    -    qh_fprintf(fp, 9367, "\n");
    -    for (j=idx; j--------------------------------
    -
    -  qh_stddev( num, tot, tot2, ave )
    -    compute the standard deviation and average from statistics
    -
    -    tot2 is the sum of the squares
    -  notes:
    -    computes r.m.s.:
    -      (x-ave)^2
    -      == x^2 - 2x tot/num +   (tot/num)^2
    -      == tot2 - 2 tot tot/num + tot tot/num
    -      == tot2 - tot ave
    -*/
    -realT qh_stddev(int num, realT tot, realT tot2, realT *ave) {
    -  realT stddev;
    -
    -  *ave= tot/num;
    -  stddev= sqrt(tot2/num - *ave * *ave);
    -  return stddev;
    -} /* stddev */
    -
    -#endif /* qh_KEEPstatistics */
    -
    -#if !qh_KEEPstatistics
    -void    qh_collectstatistics(void) {}
    -void    qh_printallstatistics(FILE *fp, char *string) {};
    -void    qh_printstatistics(FILE *fp, char *string) {}
    -#endif
    -
    diff --git a/src/qhull/src/libqhull/stat.h b/src/qhull/src/libqhull/stat.h
    deleted file mode 100644
    index d86fc0a87af..00000000000
    --- a/src/qhull/src/libqhull/stat.h
    +++ /dev/null
    @@ -1,543 +0,0 @@
    -/*
      ---------------------------------
    -
    -   stat.h
    -     contains all statistics that are collected for qhull
    -
    -   see qh-stat.htm and stat.c
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull/stat.h#4 $$Change: 2062 $
    -   $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    -
    -   recompile qhull if you change this file
    -
    -   Integer statistics are Z* while real statistics are W*.
    -
    -   define maydebugx to call a routine at every statistic event
    -
    -*/
    -
    -#ifndef qhDEFstat
    -#define qhDEFstat 1
    -
    -#include "libqhull.h"
    -
    -/*---------------------------------
    -
    -  qh_KEEPstatistics
    -    0 turns off statistic gathering (except zzdef/zzinc/zzadd/zzval/wwval)
    -*/
    -#ifndef qh_KEEPstatistics
    -#define qh_KEEPstatistics 1
    -#endif
    -
    -/*---------------------------------
    -
    -  Zxxx for integers, Wxxx for reals
    -
    -  notes:
    -    be sure that all statistics are defined in stat.c
    -      otherwise initialization may core dump
    -    can pick up all statistics by:
    -      grep '[zw].*_[(][ZW]' *.c >z.x
    -    remove trailers with query">-
    -    remove leaders with  query-replace-regexp [ ^I]+  (
    -*/
    -#if qh_KEEPstatistics
    -enum qh_statistics {     /* alphabetical after Z/W */
    -    Zacoplanar,
    -    Wacoplanarmax,
    -    Wacoplanartot,
    -    Zangle,
    -    Wangle,
    -    Wanglemax,
    -    Wanglemin,
    -    Zangletests,
    -    Wareatot,
    -    Wareamax,
    -    Wareamin,
    -    Zavoidold,
    -    Wavoidoldmax,
    -    Wavoidoldtot,
    -    Zback0,
    -    Zbestcentrum,
    -    Zbestdist,
    -    Zbestlower,
    -    Zbestlowerall,
    -    Zbestloweralln,
    -    Zbestlowerv,
    -    Zcentrumtests,
    -    Zcheckpart,
    -    Zcomputefurthest,
    -    Zconcave,
    -    Wconcavemax,
    -    Wconcavetot,
    -    Zconcaveridges,
    -    Zconcaveridge,
    -    Zcoplanar,
    -    Wcoplanarmax,
    -    Wcoplanartot,
    -    Zcoplanarangle,
    -    Zcoplanarcentrum,
    -    Zcoplanarhorizon,
    -    Zcoplanarinside,
    -    Zcoplanarpart,
    -    Zcoplanarridges,
    -    Wcpu,
    -    Zcyclefacetmax,
    -    Zcyclefacettot,
    -    Zcyclehorizon,
    -    Zcyclevertex,
    -    Zdegen,
    -    Wdegenmax,
    -    Wdegentot,
    -    Zdegenvertex,
    -    Zdelfacetdup,
    -    Zdelridge,
    -    Zdelvertextot,
    -    Zdelvertexmax,
    -    Zdetsimplex,
    -    Zdistcheck,
    -    Zdistconvex,
    -    Zdistgood,
    -    Zdistio,
    -    Zdistplane,
    -    Zdiststat,
    -    Zdistvertex,
    -    Zdistzero,
    -    Zdoc1,
    -    Zdoc2,
    -    Zdoc3,
    -    Zdoc4,
    -    Zdoc5,
    -    Zdoc6,
    -    Zdoc7,
    -    Zdoc8,
    -    Zdoc9,
    -    Zdoc10,
    -    Zdoc11,
    -    Zdoc12,
    -    Zdropdegen,
    -    Zdropneighbor,
    -    Zdupflip,
    -    Zduplicate,
    -    Wduplicatemax,
    -    Wduplicatetot,
    -    Zdupridge,
    -    Zdupsame,
    -    Zflipped,
    -    Wflippedmax,
    -    Wflippedtot,
    -    Zflippedfacets,
    -    Zfindbest,
    -    Zfindbestmax,
    -    Zfindbesttot,
    -    Zfindcoplanar,
    -    Zfindfail,
    -    Zfindhorizon,
    -    Zfindhorizonmax,
    -    Zfindhorizontot,
    -    Zfindjump,
    -    Zfindnew,
    -    Zfindnewmax,
    -    Zfindnewtot,
    -    Zfindnewjump,
    -    Zfindnewsharp,
    -    Zgauss0,
    -    Zgoodfacet,
    -    Zhashlookup,
    -    Zhashridge,
    -    Zhashridgetest,
    -    Zhashtests,
    -    Zinsidevisible,
    -    Zintersect,
    -    Zintersectfail,
    -    Zintersectmax,
    -    Zintersectnum,
    -    Zintersecttot,
    -    Zmaxneighbors,
    -    Wmaxout,
    -    Wmaxoutside,
    -    Zmaxridges,
    -    Zmaxvertex,
    -    Zmaxvertices,
    -    Zmaxvneighbors,
    -    Zmemfacets,
    -    Zmempoints,
    -    Zmemridges,
    -    Zmemvertices,
    -    Zmergeflipdup,
    -    Zmergehorizon,
    -    Zmergeinittot,
    -    Zmergeinitmax,
    -    Zmergeinittot2,
    -    Zmergeintohorizon,
    -    Zmergenew,
    -    Zmergesettot,
    -    Zmergesetmax,
    -    Zmergesettot2,
    -    Zmergesimplex,
    -    Zmergevertex,
    -    Wmindenom,
    -    Wminvertex,
    -    Zminnorm,
    -    Zmultiridge,
    -    Znearlysingular,
    -    Zneighbor,
    -    Wnewbalance,
    -    Wnewbalance2,
    -    Znewfacettot,
    -    Znewfacetmax,
    -    Znewvertex,
    -    Wnewvertex,
    -    Wnewvertexmax,
    -    Znoarea,
    -    Znonsimplicial,
    -    Znowsimplicial,
    -    Znotgood,
    -    Znotgoodnew,
    -    Znotmax,
    -    Znumfacets,
    -    Znummergemax,
    -    Znummergetot,
    -    Znumneighbors,
    -    Znumridges,
    -    Znumvertices,
    -    Znumvisibility,
    -    Znumvneighbors,
    -    Zonehorizon,
    -    Zpartangle,
    -    Zpartcoplanar,
    -    Zpartflip,
    -    Zparthorizon,
    -    Zpartinside,
    -    Zpartition,
    -    Zpartitionall,
    -    Zpartnear,
    -    Zpbalance,
    -    Wpbalance,
    -    Wpbalance2,
    -    Zpostfacets,
    -    Zpremergetot,
    -    Zprocessed,
    -    Zremvertex,
    -    Zremvertexdel,
    -    Zrenameall,
    -    Zrenamepinch,
    -    Zrenameshare,
    -    Zretry,
    -    Wretrymax,
    -    Zridge,
    -    Wridge,
    -    Wridgemax,
    -    Zridge0,
    -    Wridge0,
    -    Wridge0max,
    -    Zridgemid,
    -    Wridgemid,
    -    Wridgemidmax,
    -    Zridgeok,
    -    Wridgeok,
    -    Wridgeokmax,
    -    Zsearchpoints,
    -    Zsetplane,
    -    Ztestvneighbor,
    -    Ztotcheck,
    -    Ztothorizon,
    -    Ztotmerge,
    -    Ztotpartcoplanar,
    -    Ztotpartition,
    -    Ztotridges,
    -    Ztotvertices,
    -    Ztotvisible,
    -    Ztricoplanar,
    -    Ztricoplanarmax,
    -    Ztricoplanartot,
    -    Ztridegen,
    -    Ztrimirror,
    -    Ztrinull,
    -    Wvertexmax,
    -    Wvertexmin,
    -    Zvertexridge,
    -    Zvertexridgetot,
    -    Zvertexridgemax,
    -    Zvertices,
    -    Zvisfacettot,
    -    Zvisfacetmax,
    -    Zvisit,
    -    Zvisit2max,
    -    Zvisvertextot,
    -    Zvisvertexmax,
    -    Zvvisit,
    -    Zvvisit2max,
    -    Zwidefacet,
    -    Zwidevertices,
    -    ZEND};
    -
    -/*---------------------------------
    -
    -  Zxxx/Wxxx statistics that remain defined if qh_KEEPstatistics=0
    -
    -  notes:
    -    be sure to use zzdef, zzinc, etc. with these statistics (no double checking!)
    -*/
    -#else
    -enum qh_statistics {     /* for zzdef etc. macros */
    -  Zback0,
    -  Zbestdist,
    -  Zcentrumtests,
    -  Zcheckpart,
    -  Zconcaveridges,
    -  Zcoplanarhorizon,
    -  Zcoplanarpart,
    -  Zcoplanarridges,
    -  Zcyclefacettot,
    -  Zcyclehorizon,
    -  Zdelvertextot,
    -  Zdistcheck,
    -  Zdistconvex,
    -  Zdistzero,
    -  Zdoc1,
    -  Zdoc2,
    -  Zdoc3,
    -  Zdoc11,
    -  Zflippedfacets,
    -  Zgauss0,
    -  Zminnorm,
    -  Zmultiridge,
    -  Znearlysingular,
    -  Wnewvertexmax,
    -  Znumvisibility,
    -  Zpartcoplanar,
    -  Zpartition,
    -  Zpartitionall,
    -  Zprocessed,
    -  Zretry,
    -  Zridge,
    -  Wridge,
    -  Wridgemax,
    -  Zridge0,
    -  Wridge0,
    -  Wridge0max,
    -  Zridgemid,
    -  Wridgemid,
    -  Wridgemidmax,
    -  Zridgeok,
    -  Wridgeok,
    -  Wridgeokmax,
    -  Zsetplane,
    -  Ztotcheck,
    -  Ztotmerge,
    -    ZEND};
    -#endif
    -
    -/*---------------------------------
    -
    -  ztype
    -    the type of a statistic sets its initial value.
    -
    -  notes:
    -    The type should be the same as the macro for collecting the statistic
    -*/
    -enum ztypes {zdoc,zinc,zadd,zmax,zmin,ZTYPEreal,wadd,wmax,wmin,ZTYPEend};
    -
    -/*========== macros and constants =============*/
    -
    -/*----------------------------------
    -
    -  MAYdebugx
    -    define as maydebug() to be called frequently for error trapping
    -*/
    -#define MAYdebugx
    -
    -/*----------------------------------
    -
    -  zzdef_, zdef_( type, name, doc, -1)
    -    define a statistic (assumes 'qhstat.next= 0;')
    -
    -  zdef_( type, name, doc, count)
    -    define an averaged statistic
    -    printed as name/count
    -*/
    -#define zzdef_(stype,name,string,cnt) qhstat id[qhstat next++]=name; \
    -   qhstat doc[name]= string; qhstat count[name]= cnt; qhstat type[name]= stype
    -#if qh_KEEPstatistics
    -#define zdef_(stype,name,string,cnt) qhstat id[qhstat next++]=name; \
    -   qhstat doc[name]= string; qhstat count[name]= cnt; qhstat type[name]= stype
    -#else
    -#define zdef_(type,name,doc,count)
    -#endif
    -
    -/*----------------------------------
    -
    -  zzinc_( name ), zinc_( name)
    -    increment an integer statistic
    -*/
    -#define zzinc_(id) {MAYdebugx; qhstat stats[id].i++;}
    -#if qh_KEEPstatistics
    -#define zinc_(id) {MAYdebugx; qhstat stats[id].i++;}
    -#else
    -#define zinc_(id) {}
    -#endif
    -
    -/*----------------------------------
    -
    -  zzadd_( name, value ), zadd_( name, value ), wadd_( name, value )
    -    add value to an integer or real statistic
    -*/
    -#define zzadd_(id, val) {MAYdebugx; qhstat stats[id].i += (val);}
    -#define wwadd_(id, val) {MAYdebugx; qhstat stats[id].r += (val);}
    -#if qh_KEEPstatistics
    -#define zadd_(id, val) {MAYdebugx; qhstat stats[id].i += (val);}
    -#define wadd_(id, val) {MAYdebugx; qhstat stats[id].r += (val);}
    -#else
    -#define zadd_(id, val) {}
    -#define wadd_(id, val) {}
    -#endif
    -
    -/*----------------------------------
    -
    -  zzval_( name ), zval_( name ), wwval_( name )
    -    set or return value of a statistic
    -*/
    -#define zzval_(id) ((qhstat stats[id]).i)
    -#define wwval_(id) ((qhstat stats[id]).r)
    -#if qh_KEEPstatistics
    -#define zval_(id) ((qhstat stats[id]).i)
    -#define wval_(id) ((qhstat stats[id]).r)
    -#else
    -#define zval_(id) qhstat tempi
    -#define wval_(id) qhstat tempr
    -#endif
    -
    -/*----------------------------------
    -
    -  zmax_( id, val ), wmax_( id, value )
    -    maximize id with val
    -*/
    -#define wwmax_(id, val) {MAYdebugx; maximize_(qhstat stats[id].r,(val));}
    -#if qh_KEEPstatistics
    -#define zmax_(id, val) {MAYdebugx; maximize_(qhstat stats[id].i,(val));}
    -#define wmax_(id, val) {MAYdebugx; maximize_(qhstat stats[id].r,(val));}
    -#else
    -#define zmax_(id, val) {}
    -#define wmax_(id, val) {}
    -#endif
    -
    -/*----------------------------------
    -
    -  zmin_( id, val ), wmin_( id, value )
    -    minimize id with val
    -*/
    -#if qh_KEEPstatistics
    -#define zmin_(id, val) {MAYdebugx; minimize_(qhstat stats[id].i,(val));}
    -#define wmin_(id, val) {MAYdebugx; minimize_(qhstat stats[id].r,(val));}
    -#else
    -#define zmin_(id, val) {}
    -#define wmin_(id, val) {}
    -#endif
    -
    -/*================== stat.h types ==============*/
    -
    -
    -/*----------------------------------
    -
    -  intrealT
    -    union of integer and real, used for statistics
    -*/
    -typedef union intrealT intrealT;    /* union of int and realT */
    -union intrealT {
    -    int i;
    -    realT r;
    -};
    -
    -/*----------------------------------
    -
    -  qhstat
    -    global data structure for statistics, similar to qh and qhrbox
    -
    -  notes:
    -   access to qh_qhstat is via the "qhstat" macro.  There are two choices
    -   qh_QHpointer = 1     access globals via a pointer
    -                        enables qh_saveqhull() and qh_restoreqhull()
    -                = 0     qh_qhstat is a static data structure
    -                        only one instance of qhull() can be active at a time
    -                        default value
    -   qh_QHpointer is defined in libqhull.h
    -   qh_QHpointer_dllimport and qh_dllimport define qh_qh as __declspec(dllimport) [libqhull.h]
    -
    -   allocated in stat.c using qh_malloc()
    -*/
    -#ifndef DEFqhstatT
    -#define DEFqhstatT 1
    -typedef struct qhstatT qhstatT;
    -#endif
    -
    -#if qh_QHpointer_dllimport
    -#define qhstat qh_qhstat->
    -__declspec(dllimport) extern qhstatT *qh_qhstat;
    -#elif qh_QHpointer
    -#define qhstat qh_qhstat->
    -extern qhstatT *qh_qhstat;
    -#elif qh_dllimport
    -#define qhstat qh_qhstat.
    -__declspec(dllimport) extern qhstatT qh_qhstat;
    -#else
    -#define qhstat qh_qhstat.
    -extern qhstatT qh_qhstat;
    -#endif
    -struct qhstatT {
    -  intrealT   stats[ZEND];     /* integer and real statistics */
    -  unsigned   char id[ZEND+10]; /* id's in print order */
    -  const char *doc[ZEND];       /* array of documentation strings */
    -  short int  count[ZEND];     /* -1 if none, else index of count to use */
    -  char       type[ZEND];      /* type, see ztypes above */
    -  char       printed[ZEND];   /* true, if statistic has been printed */
    -  intrealT   init[ZTYPEend];  /* initial values by types, set initstatistics */
    -
    -  int        next;            /* next index for zdef_ */
    -  int        precision;       /* index for precision problems */
    -  int        vridges;         /* index for Voronoi ridges */
    -  int        tempi;
    -  realT      tempr;
    -};
    -
    -/*========== function prototypes ===========*/
    -
    -void    qh_allstatA(void);
    -void    qh_allstatB(void);
    -void    qh_allstatC(void);
    -void    qh_allstatD(void);
    -void    qh_allstatE(void);
    -void    qh_allstatE2(void);
    -void    qh_allstatF(void);
    -void    qh_allstatG(void);
    -void    qh_allstatH(void);
    -void    qh_allstatI(void);
    -void    qh_allstatistics(void);
    -void    qh_collectstatistics(void);
    -void    qh_freestatistics(void);
    -void    qh_initstatistics(void);
    -boolT   qh_newstats(int idx, int *nextindex);
    -boolT   qh_nostatistic(int i);
    -void    qh_printallstatistics(FILE *fp, const char *string);
    -void    qh_printstatistics(FILE *fp, const char *string);
    -void    qh_printstatlevel(FILE *fp, int id);
    -void    qh_printstats(FILE *fp, int idx, int *nextindex);
    -realT   qh_stddev(int num, realT tot, realT tot2, realT *ave);
    -
    -#endif   /* qhDEFstat */
    diff --git a/src/qhull/src/libqhull/user.c b/src/qhull/src/libqhull/user.c
    deleted file mode 100644
    index d4726eaa31a..00000000000
    --- a/src/qhull/src/libqhull/user.c
    +++ /dev/null
    @@ -1,538 +0,0 @@
    -/*
      ---------------------------------
    -
    -   user.c
    -   user redefinable functions
    -
    -   see user2.c for qh_fprintf, qh_malloc, qh_free
    -
    -   see README.txt  see COPYING.txt for copyright information.
    -
    -   see libqhull.h for data structures, macros, and user-callable functions.
    -
    -   see user_eg.c, user_eg2.c, and unix.c for examples.
    -
    -   see user.h for user-definable constants
    -
    -      use qh_NOmem in mem.h to turn off memory management
    -      use qh_NOmerge in user.h to turn off facet merging
    -      set qh_KEEPstatistics in user.h to 0 to turn off statistics
    -
    -   This is unsupported software.  You're welcome to make changes,
    -   but you're on your own if something goes wrong.  Use 'Tc' to
    -   check frequently.  Usually qhull will report an error if
    -   a data structure becomes inconsistent.  If so, it also reports
    -   the last point added to the hull, e.g., 102.  You can then trace
    -   the execution of qhull with "T4P102".
    -
    -   Please report any errors that you fix to qhull@qhull.org
    -
    -   Qhull-template is a template for calling qhull from within your application
    -
    -   if you recompile and load this module, then user.o will not be loaded
    -   from qhull.a
    -
    -   you can add additional quick allocation sizes in qh_user_memsizes
    -
    -   if the other functions here are redefined to not use qh_print...,
    -   then io.o will not be loaded from qhull.a.  See user_eg.c for an
    -   example.  We recommend keeping io.o for the extra debugging
    -   information it supplies.
    -*/
    -
    -#include "qhull_a.h"
    -
    -#include 
    -
    -/*---------------------------------
    -
    -  Qhull-template
    -    Template for calling qhull from inside your program
    -
    -  returns:
    -    exit code(see qh_ERR... in libqhull.h)
    -    all memory freed
    -
    -  notes:
    -    This can be called any number of times.
    -*/
    -#if 0
    -{
    -  int dim;                  /* dimension of points */
    -  int numpoints;            /* number of points */
    -  coordT *points;           /* array of coordinates for each point */
    -  boolT ismalloc;           /* True if qhull should free points in qh_freeqhull() or reallocation */
    -  char flags[]= "qhull Tv"; /* option flags for qhull, see qh_opt.htm */
    -  FILE *outfile= stdout;    /* output from qh_produce_output()
    -                               use NULL to skip qh_produce_output() */
    -  FILE *errfile= stderr;    /* error messages from qhull code */
    -  int exitcode;             /* 0 if no error from qhull */
    -  facetT *facet;            /* set by FORALLfacets */
    -  int curlong, totlong;     /* memory remaining after qh_memfreeshort */
    -
    -  QHULL_LIB_CHECK /* Check for compatible library */
    -
    -#if qh_QHpointer  /* see user.h */
    -  if (qh_qh){ /* should be NULL */
    -      qh_printf_stderr(6238, "Qhull link error.  The global variable qh_qh was not initialized\n\
    -              to NULL by global.c.  Please compile this program with -Dqh_QHpointer_dllimport\n\
    -              as well as -Dqh_QHpointer, or use libqhullstatic, or use a different tool chain.\n\n");
    -      exit(1);
    -  }
    -#endif
    -
    -  /* initialize dim, numpoints, points[], ismalloc here */
    -  exitcode= qh_new_qhull(dim, numpoints, points, ismalloc,
    -                      flags, outfile, errfile);
    -  if (!exitcode) {                  /* if no error */
    -    /* 'qh facet_list' contains the convex hull */
    -    FORALLfacets {
    -       /* ... your code ... */
    -    }
    -  }
    -  qh_freeqhull(!qh_ALL);
    -  qh_memfreeshort(&curlong, &totlong);
    -  if (curlong || totlong)
    -    qh_fprintf(errfile, 7068, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n", totlong, curlong);
    -}
    -#endif
    -
    -/*---------------------------------
    -
    -  qh_new_qhull( dim, numpoints, points, ismalloc, qhull_cmd, outfile, errfile )
    -    build new qhull data structure and return exitcode (0 if no errors)
    -    if numpoints=0 and points=NULL, initializes qhull
    -
    -  notes:
    -    do not modify points until finished with results.
    -      The qhull data structure contains pointers into the points array.
    -    do not call qhull functions before qh_new_qhull().
    -      The qhull data structure is not initialized until qh_new_qhull().
    -
    -    Default errfile is stderr, outfile may be null
    -    qhull_cmd must start with "qhull "
    -    projects points to a new point array for Delaunay triangulations ('d' and 'v')
    -    transforms points into a new point array for halfspace intersection ('H')
    -
    -
    -  To allow multiple, concurrent calls to qhull()
    -    - set qh_QHpointer in user.h
    -    - use qh_save_qhull and qh_restore_qhull to swap the global data structure between calls.
    -    - use qh_freeqhull(qh_ALL) to free intermediate convex hulls
    -
    -  see:
    -      Qhull-template at the beginning of this file.
    -      An example of using qh_new_qhull is user_eg.c
    -*/
    -int qh_new_qhull(int dim, int numpoints, coordT *points, boolT ismalloc,
    -                char *qhull_cmd, FILE *outfile, FILE *errfile) {
    -  /* gcc may issue a "might be clobbered" warning for dim, points, and ismalloc [-Wclobbered].
    -     These parameters are not referenced after a longjmp() and hence not clobbered.
    -     See http://stackoverflow.com/questions/7721854/what-sense-do-these-clobbered-variable-warnings-make */
    -  int exitcode, hulldim;
    -  boolT new_ismalloc;
    -  static boolT firstcall = True;
    -  coordT *new_points;
    -  if(!errfile){
    -      errfile= stderr;
    -  }
    -  if (firstcall) {
    -    qh_meminit(errfile);
    -    firstcall= False;
    -  } else {
    -    qh_memcheck();
    -  }
    -  if (strncmp(qhull_cmd, "qhull ", (size_t)6)) {
    -    qh_fprintf(errfile, 6186, "qhull error (qh_new_qhull): start qhull_cmd argument with \"qhull \"\n");
    -    return qh_ERRinput;
    -  }
    -  qh_initqhull_start(NULL, outfile, errfile);
    -  if(numpoints==0 && points==NULL){
    -      trace1((qh ferr, 1047, "qh_new_qhull: initialize Qhull\n"));
    -      return 0;
    -  }
    -  trace1((qh ferr, 1044, "qh_new_qhull: build new Qhull for %d %d-d points with %s\n", numpoints, dim, qhull_cmd));
    -  exitcode = setjmp(qh errexit);
    -  if (!exitcode)
    -  {
    -    qh NOerrexit = False;
    -    qh_initflags(qhull_cmd);
    -    if (qh DELAUNAY)
    -      qh PROJECTdelaunay= True;
    -    if (qh HALFspace) {
    -      /* points is an array of halfspaces,
    -         the last coordinate of each halfspace is its offset */
    -      hulldim= dim-1;
    -      qh_setfeasible(hulldim);
    -      new_points= qh_sethalfspace_all(dim, numpoints, points, qh feasible_point);
    -      new_ismalloc= True;
    -      if (ismalloc)
    -        qh_free(points);
    -    }else {
    -      hulldim= dim;
    -      new_points= points;
    -      new_ismalloc= ismalloc;
    -    }
    -    qh_init_B(new_points, numpoints, hulldim, new_ismalloc);
    -    qh_qhull();
    -    qh_check_output();
    -    if (outfile) {
    -      qh_produce_output();
    -    }else {
    -      qh_prepare_output();
    -    }
    -    if (qh VERIFYoutput && !qh STOPpoint && !qh STOPcone)
    -      qh_check_points();
    -  }
    -  qh NOerrexit = True;
    -  return exitcode;
    -} /* new_qhull */
    -
    -/*---------------------------------
    -
    -  qh_errexit( exitcode, facet, ridge )
    -    report and exit from an error
    -    report facet and ridge if non-NULL
    -    reports useful information such as last point processed
    -    set qh.FORCEoutput to print neighborhood of facet
    -
    -  see:
    -    qh_errexit2() in libqhull.c for printing 2 facets
    -
    -  design:
    -    check for error within error processing
    -    compute qh.hulltime
    -    print facet and ridge (if any)
    -    report commandString, options, qh.furthest_id
    -    print summary and statistics (including precision statistics)
    -    if qh_ERRsingular
    -      print help text for singular data set
    -    exit program via long jump (if defined) or exit()
    -*/
    -void qh_errexit(int exitcode, facetT *facet, ridgeT *ridge) {
    -
    -  if (qh ERREXITcalled) {
    -    qh_fprintf(qh ferr, 8126, "\nqhull error while processing previous error.  Exit program\n");
    -    qh_exit(qh_ERRqhull);
    -  }
    -  qh ERREXITcalled= True;
    -  if (!qh QHULLfinished)
    -    qh hulltime= qh_CPUclock - qh hulltime;
    -  qh_errprint("ERRONEOUS", facet, NULL, ridge, NULL);
    -  qh_fprintf(qh ferr, 8127, "\nWhile executing: %s | %s\n", qh rbox_command, qh qhull_command);
    -  qh_fprintf(qh ferr, 8128, "Options selected for Qhull %s:\n%s\n", qh_version, qh qhull_options);
    -  if (qh furthest_id >= 0) {
    -    qh_fprintf(qh ferr, 8129, "Last point added to hull was p%d.", qh furthest_id);
    -    if (zzval_(Ztotmerge))
    -      qh_fprintf(qh ferr, 8130, "  Last merge was #%d.", zzval_(Ztotmerge));
    -    if (qh QHULLfinished)
    -      qh_fprintf(qh ferr, 8131, "\nQhull has finished constructing the hull.");
    -    else if (qh POSTmerging)
    -      qh_fprintf(qh ferr, 8132, "\nQhull has started post-merging.");
    -    qh_fprintf(qh ferr, 8133, "\n");
    -  }
    -  if (qh FORCEoutput && (qh QHULLfinished || (!facet && !ridge)))
    -    qh_produce_output();
    -  else if (exitcode != qh_ERRinput) {
    -    if (exitcode != qh_ERRsingular && zzval_(Zsetplane) > qh hull_dim+1) {
    -      qh_fprintf(qh ferr, 8134, "\nAt error exit:\n");
    -      qh_printsummary(qh ferr);
    -      if (qh PRINTstatistics) {
    -        qh_collectstatistics();
    -        qh_printstatistics(qh ferr, "at error exit");
    -        qh_memstatistics(qh ferr);
    -      }
    -    }
    -    if (qh PRINTprecision)
    -      qh_printstats(qh ferr, qhstat precision, NULL);
    -  }
    -  if (!exitcode)
    -    exitcode= qh_ERRqhull;
    -  else if (exitcode == qh_ERRsingular)
    -    qh_printhelp_singular(qh ferr);
    -  else if (exitcode == qh_ERRprec && !qh PREmerge)
    -    qh_printhelp_degenerate(qh ferr);
    -  if (qh NOerrexit) {
    -    qh_fprintf(qh ferr, 6187, "qhull error while ending program, or qh->NOerrexit not cleared after setjmp(). Exit program with error.\n");
    -    qh_exit(qh_ERRqhull);
    -  }
    -  qh ERREXITcalled= False;
    -  qh NOerrexit= True;
    -  qh ALLOWrestart= False;  /* longjmp will undo qh_build_withrestart */
    -  longjmp(qh errexit, exitcode);
    -} /* errexit */
    -
    -
    -/*---------------------------------
    -
    -  qh_errprint( fp, string, atfacet, otherfacet, atridge, atvertex )
    -    prints out the information of facets and ridges to fp
    -    also prints neighbors and geomview output
    -
    -  notes:
    -    except for string, any parameter may be NULL
    -*/
    -void qh_errprint(const char *string, facetT *atfacet, facetT *otherfacet, ridgeT *atridge, vertexT *atvertex) {
    -  int i;
    -
    -  if (atfacet) {
    -    qh_fprintf(qh ferr, 8135, "%s FACET:\n", string);
    -    qh_printfacet(qh ferr, atfacet);
    -  }
    -  if (otherfacet) {
    -    qh_fprintf(qh ferr, 8136, "%s OTHER FACET:\n", string);
    -    qh_printfacet(qh ferr, otherfacet);
    -  }
    -  if (atridge) {
    -    qh_fprintf(qh ferr, 8137, "%s RIDGE:\n", string);
    -    qh_printridge(qh ferr, atridge);
    -    if (atridge->top && atridge->top != atfacet && atridge->top != otherfacet)
    -      qh_printfacet(qh ferr, atridge->top);
    -    if (atridge->bottom
    -        && atridge->bottom != atfacet && atridge->bottom != otherfacet)
    -      qh_printfacet(qh ferr, atridge->bottom);
    -    if (!atfacet)
    -      atfacet= atridge->top;
    -    if (!otherfacet)
    -      otherfacet= otherfacet_(atridge, atfacet);
    -  }
    -  if (atvertex) {
    -    qh_fprintf(qh ferr, 8138, "%s VERTEX:\n", string);
    -    qh_printvertex(qh ferr, atvertex);
    -  }
    -  if (qh fout && qh FORCEoutput && atfacet && !qh QHULLfinished && !qh IStracing) {
    -    qh_fprintf(qh ferr, 8139, "ERRONEOUS and NEIGHBORING FACETS to output\n");
    -    for (i=0; i < qh_PRINTEND; i++)  /* use fout for geomview output */
    -      qh_printneighborhood(qh fout, qh PRINTout[i], atfacet, otherfacet,
    -                            !qh_ALL);
    -  }
    -} /* errprint */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacetlist( fp, facetlist, facets, printall )
    -    print all fields for a facet list and/or set of facets to fp
    -    if !printall,
    -      only prints good facets
    -
    -  notes:
    -    also prints all vertices
    -*/
    -void qh_printfacetlist(facetT *facetlist, setT *facets, boolT printall) {
    -  facetT *facet, **facetp;
    -
    -  qh_printbegin(qh ferr, qh_PRINTfacets, facetlist, facets, printall);
    -  FORALLfacet_(facetlist)
    -    qh_printafacet(qh ferr, qh_PRINTfacets, facet, printall);
    -  FOREACHfacet_(facets)
    -    qh_printafacet(qh ferr, qh_PRINTfacets, facet, printall);
    -  qh_printend(qh ferr, qh_PRINTfacets, facetlist, facets, printall);
    -} /* printfacetlist */
    -
    -
    -/*---------------------------------
    -
    -  qh_printhelp_degenerate( fp )
    -    prints descriptive message for precision error
    -
    -  notes:
    -    no message if qh_QUICKhelp
    -*/
    -void qh_printhelp_degenerate(FILE *fp) {
    -
    -  if (qh MERGEexact || qh PREmerge || qh JOGGLEmax < REALmax/2)
    -    qh_fprintf(fp, 9368, "\n\
    -A Qhull error has occurred.  Qhull should have corrected the above\n\
    -precision error.  Please send the input and all of the output to\n\
    -qhull_bug@qhull.org\n");
    -  else if (!qh_QUICKhelp) {
    -    qh_fprintf(fp, 9369, "\n\
    -Precision problems were detected during construction of the convex hull.\n\
    -This occurs because convex hull algorithms assume that calculations are\n\
    -exact, but floating-point arithmetic has roundoff errors.\n\
    -\n\
    -To correct for precision problems, do not use 'Q0'.  By default, Qhull\n\
    -selects 'C-0' or 'Qx' and merges non-convex facets.  With option 'QJ',\n\
    -Qhull joggles the input to prevent precision problems.  See \"Imprecision\n\
    -in Qhull\" (qh-impre.htm).\n\
    -\n\
    -If you use 'Q0', the output may include\n\
    -coplanar ridges, concave ridges, and flipped facets.  In 4-d and higher,\n\
    -Qhull may produce a ridge with four neighbors or two facets with the same \n\
    -vertices.  Qhull reports these events when they occur.  It stops when a\n\
    -concave ridge, flipped facet, or duplicate facet occurs.\n");
    -#if REALfloat
    -    qh_fprintf(fp, 9370, "\
    -\n\
    -Qhull is currently using single precision arithmetic.  The following\n\
    -will probably remove the precision problems:\n\
    -  - recompile qhull for realT precision(#define REALfloat 0 in user.h).\n");
    -#endif
    -    if (qh DELAUNAY && !qh SCALElast && qh MAXabs_coord > 1e4)
    -      qh_fprintf(fp, 9371, "\
    -\n\
    -When computing the Delaunay triangulation of coordinates > 1.0,\n\
    -  - use 'Qbb' to scale the last coordinate to [0,m] (max previous coordinate)\n");
    -    if (qh DELAUNAY && !qh ATinfinity)
    -      qh_fprintf(fp, 9372, "\
    -When computing the Delaunay triangulation:\n\
    -  - use 'Qz' to add a point at-infinity.  This reduces precision problems.\n");
    -
    -    qh_fprintf(fp, 9373, "\
    -\n\
    -If you need triangular output:\n\
    -  - use option 'Qt' to triangulate the output\n\
    -  - use option 'QJ' to joggle the input points and remove precision errors\n\
    -  - use option 'Ft'.  It triangulates non-simplicial facets with added points.\n\
    -\n\
    -If you must use 'Q0',\n\
    -try one or more of the following options.  They can not guarantee an output.\n\
    -  - use 'QbB' to scale the input to a cube.\n\
    -  - use 'Po' to produce output and prevent partitioning for flipped facets\n\
    -  - use 'V0' to set min. distance to visible facet as 0 instead of roundoff\n\
    -  - use 'En' to specify a maximum roundoff error less than %2.2g.\n\
    -  - options 'Qf', 'Qbb', and 'QR0' may also help\n",
    -               qh DISTround);
    -    qh_fprintf(fp, 9374, "\
    -\n\
    -To guarantee simplicial output:\n\
    -  - use option 'Qt' to triangulate the output\n\
    -  - use option 'QJ' to joggle the input points and remove precision errors\n\
    -  - use option 'Ft' to triangulate the output by adding points\n\
    -  - use exact arithmetic (see \"Imprecision in Qhull\", qh-impre.htm)\n\
    -");
    -  }
    -} /* printhelp_degenerate */
    -
    -
    -/*---------------------------------
    -
    -  qh_printhelp_narrowhull( minangle )
    -    Warn about a narrow hull
    -
    -  notes:
    -    Alternatively, reduce qh_WARNnarrow in user.h
    -
    -*/
    -void qh_printhelp_narrowhull(FILE *fp, realT minangle) {
    -
    -    qh_fprintf(fp, 9375, "qhull precision warning: \n\
    -The initial hull is narrow (cosine of min. angle is %.16f).\n\
    -Is the input lower dimensional (e.g., on a plane in 3-d)?  Qhull may\n\
    -produce a wide facet.  Options 'QbB' (scale to unit box) or 'Qbb' (scale\n\
    -last coordinate) may remove this warning.  Use 'Pp' to skip this warning.\n\
    -See 'Limitations' in qh-impre.htm.\n",
    -          -minangle);   /* convert from angle between normals to angle between facets */
    -} /* printhelp_narrowhull */
    -
    -/*---------------------------------
    -
    -  qh_printhelp_singular( fp )
    -    prints descriptive message for singular input
    -*/
    -void qh_printhelp_singular(FILE *fp) {
    -  facetT *facet;
    -  vertexT *vertex, **vertexp;
    -  realT min, max, *coord, dist;
    -  int i,k;
    -
    -  qh_fprintf(fp, 9376, "\n\
    -The input to qhull appears to be less than %d dimensional, or a\n\
    -computation has overflowed.\n\n\
    -Qhull could not construct a clearly convex simplex from points:\n",
    -           qh hull_dim);
    -  qh_printvertexlist(fp, "", qh facet_list, NULL, qh_ALL);
    -  if (!qh_QUICKhelp)
    -    qh_fprintf(fp, 9377, "\n\
    -The center point is coplanar with a facet, or a vertex is coplanar\n\
    -with a neighboring facet.  The maximum round off error for\n\
    -computing distances is %2.2g.  The center point, facets and distances\n\
    -to the center point are as follows:\n\n", qh DISTround);
    -  qh_printpointid(fp, "center point", qh hull_dim, qh interior_point, qh_IDunknown);
    -  qh_fprintf(fp, 9378, "\n");
    -  FORALLfacets {
    -    qh_fprintf(fp, 9379, "facet");
    -    FOREACHvertex_(facet->vertices)
    -      qh_fprintf(fp, 9380, " p%d", qh_pointid(vertex->point));
    -    zinc_(Zdistio);
    -    qh_distplane(qh interior_point, facet, &dist);
    -    qh_fprintf(fp, 9381, " distance= %4.2g\n", dist);
    -  }
    -  if (!qh_QUICKhelp) {
    -    if (qh HALFspace)
    -      qh_fprintf(fp, 9382, "\n\
    -These points are the dual of the given halfspaces.  They indicate that\n\
    -the intersection is degenerate.\n");
    -    qh_fprintf(fp, 9383,"\n\
    -These points either have a maximum or minimum x-coordinate, or\n\
    -they maximize the determinant for k coordinates.  Trial points\n\
    -are first selected from points that maximize a coordinate.\n");
    -    if (qh hull_dim >= qh_INITIALmax)
    -      qh_fprintf(fp, 9384, "\n\
    -Because of the high dimension, the min x-coordinate and max-coordinate\n\
    -points are used if the determinant is non-zero.  Option 'Qs' will\n\
    -do a better, though much slower, job.  Instead of 'Qs', you can change\n\
    -the points by randomly rotating the input with 'QR0'.\n");
    -  }
    -  qh_fprintf(fp, 9385, "\nThe min and max coordinates for each dimension are:\n");
    -  for (k=0; k < qh hull_dim; k++) {
    -    min= REALmax;
    -    max= -REALmin;
    -    for (i=qh num_points, coord= qh first_point+k; i--; coord += qh hull_dim) {
    -      maximize_(max, *coord);
    -      minimize_(min, *coord);
    -    }
    -    qh_fprintf(fp, 9386, "  %d:  %8.4g  %8.4g  difference= %4.4g\n", k, min, max, max-min);
    -  }
    -  if (!qh_QUICKhelp) {
    -    qh_fprintf(fp, 9387, "\n\
    -If the input should be full dimensional, you have several options that\n\
    -may determine an initial simplex:\n\
    -  - use 'QJ'  to joggle the input and make it full dimensional\n\
    -  - use 'QbB' to scale the points to the unit cube\n\
    -  - use 'QR0' to randomly rotate the input for different maximum points\n\
    -  - use 'Qs'  to search all points for the initial simplex\n\
    -  - use 'En'  to specify a maximum roundoff error less than %2.2g.\n\
    -  - trace execution with 'T3' to see the determinant for each point.\n",
    -                     qh DISTround);
    -#if REALfloat
    -    qh_fprintf(fp, 9388, "\
    -  - recompile qhull for realT precision(#define REALfloat 0 in libqhull.h).\n");
    -#endif
    -    qh_fprintf(fp, 9389, "\n\
    -If the input is lower dimensional:\n\
    -  - use 'QJ' to joggle the input and make it full dimensional\n\
    -  - use 'Qbk:0Bk:0' to delete coordinate k from the input.  You should\n\
    -    pick the coordinate with the least range.  The hull will have the\n\
    -    correct topology.\n\
    -  - determine the flat containing the points, rotate the points\n\
    -    into a coordinate plane, and delete the other coordinates.\n\
    -  - add one or more points to make the input full dimensional.\n\
    -");
    -  }
    -} /* printhelp_singular */
    -
    -/*---------------------------------
    -
    -  qh_user_memsizes()
    -    allocate up to 10 additional, quick allocation sizes
    -
    -  notes:
    -    increase maximum number of allocations in qh_initqhull_mem()
    -*/
    -void qh_user_memsizes(void) {
    -
    -  /* qh_memsize(size); */
    -} /* user_memsizes */
    -
    -
    diff --git a/src/qhull/src/libqhull/user.h b/src/qhull/src/libqhull/user.h
    deleted file mode 100644
    index 523aa7b4e84..00000000000
    --- a/src/qhull/src/libqhull/user.h
    +++ /dev/null
    @@ -1,909 +0,0 @@
    -/*
      ---------------------------------
    -
    -   user.h
    -   user redefinable constants
    -
    -   for each source file, user.h is included first
    -   see qh-user.htm.  see COPYING for copyright information.
    -
    -   See user.c for sample code.
    -
    -   before reading any code, review libqhull.h for data structure definitions and
    -   the "qh" macro.
    -
    -Sections:
    -   ============= qhull library constants ======================
    -   ============= data types and configuration macros ==========
    -   ============= performance related constants ================
    -   ============= memory constants =============================
    -   ============= joggle constants =============================
    -   ============= conditional compilation ======================
    -   ============= -merge constants- ============================
    -
    -Code flags --
    -  NOerrors -- the code does not call qh_errexit()
    -  WARN64 -- the code may be incompatible with 64-bit pointers
    -
    -*/
    -
    -#include 
    -
    -#ifndef qhDEFuser
    -#define qhDEFuser 1
    -
    -/* Derived from Qt's corelib/global/qglobal.h */
    -#if !defined(SAG_COM) && !defined(__CYGWIN__) && (defined(WIN64) || defined(_WIN64) || defined(__WIN64__) || defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__))
    -#   define QHULL_OS_WIN
    -#elif defined(__MWERKS__) && defined(__INTEL__) /* Metrowerks discontinued before the release of Intel Macs */
    -#   define QHULL_OS_WIN
    -#endif
    -/*============================================================*/
    -/*============= qhull library constants ======================*/
    -/*============================================================*/
    -
    -/*----------------------------------
    -
    -  FILENAMElen -- max length for TI and TO filenames
    -
    -*/
    -
    -#define qh_FILENAMElen 500
    -
    -/*----------------------------------
    -
    -  msgcode -- Unique message codes for qh_fprintf
    -
    -  If add new messages, assign these values and increment in user.h and user_r.h
    -  See QhullError.h for 10000 errors.
    -
    -  def counters =  [27, 1048, 2059, 3026, 4068, 5003,
    -     6273, 7081, 8147, 9411, 10000, 11029]
    -
    -  See: qh_ERR* [libqhull.h]
    -*/
    -
    -#define MSG_TRACE0 0
    -#define MSG_TRACE1 1000
    -#define MSG_TRACE2 2000
    -#define MSG_TRACE3 3000
    -#define MSG_TRACE4 4000
    -#define MSG_TRACE5 5000
    -#define MSG_ERROR  6000   /* errors written to qh.ferr */
    -#define MSG_WARNING 7000
    -#define MSG_STDERR  8000  /* log messages Written to qh.ferr */
    -#define MSG_OUTPUT  9000
    -#define MSG_QHULL_ERROR 10000 /* errors thrown by QhullError.cpp (QHULLlastError is in QhullError.h) */
    -#define MSG_FIXUP  11000  /* FIXUP QH11... */
    -#define MSG_MAXLEN  3000 /* qh_printhelp_degenerate() in user.c */
    -
    -
    -/*----------------------------------
    -
    -  qh_OPTIONline -- max length of an option line 'FO'
    -*/
    -#define qh_OPTIONline 80
    -
    -/*============================================================*/
    -/*============= data types and configuration macros ==========*/
    -/*============================================================*/
    -
    -/*----------------------------------
    -
    -  realT
    -    set the size of floating point numbers
    -
    -  qh_REALdigits
    -    maximimum number of significant digits
    -
    -  qh_REAL_1, qh_REAL_2n, qh_REAL_3n
    -    format strings for printf
    -
    -  qh_REALmax, qh_REALmin
    -    maximum and minimum (near zero) values
    -
    -  qh_REALepsilon
    -    machine roundoff.  Maximum roundoff error for addition and multiplication.
    -
    -  notes:
    -   Select whether to store floating point numbers in single precision (float)
    -   or double precision (double).
    -
    -   Use 'float' to save about 8% in time and 25% in space.  This is particularly
    -   helpful if high-d where convex hulls are space limited.  Using 'float' also
    -   reduces the printed size of Qhull's output since numbers have 8 digits of
    -   precision.
    -
    -   Use 'double' when greater arithmetic precision is needed.  This is needed
    -   for Delaunay triangulations and Voronoi diagrams when you are not merging
    -   facets.
    -
    -   If 'double' gives insufficient precision, your data probably includes
    -   degeneracies.  If so you should use facet merging (done by default)
    -   or exact arithmetic (see imprecision section of manual, qh-impre.htm).
    -   You may also use option 'Po' to force output despite precision errors.
    -
    -   You may use 'long double', but many format statements need to be changed
    -   and you may need a 'long double' square root routine.  S. Grundmann
    -   (sg@eeiwzb.et.tu-dresden.de) has done this.  He reports that the code runs
    -   much slower with little gain in precision.
    -
    -   WARNING: on some machines,    int f(){realT a= REALmax;return (a == REALmax);}
    -      returns False.  Use (a > REALmax/2) instead of (a == REALmax).
    -
    -   REALfloat =   1      all numbers are 'float' type
    -             =   0      all numbers are 'double' type
    -*/
    -#define REALfloat 0
    -
    -#if (REALfloat == 1)
    -#define realT float
    -#define REALmax FLT_MAX
    -#define REALmin FLT_MIN
    -#define REALepsilon FLT_EPSILON
    -#define qh_REALdigits 8   /* maximum number of significant digits */
    -#define qh_REAL_1 "%6.8g "
    -#define qh_REAL_2n "%6.8g %6.8g\n"
    -#define qh_REAL_3n "%6.8g %6.8g %6.8g\n"
    -
    -#elif (REALfloat == 0)
    -#define realT double
    -#define REALmax DBL_MAX
    -#define REALmin DBL_MIN
    -#define REALepsilon DBL_EPSILON
    -#define qh_REALdigits 16    /* maximum number of significant digits */
    -#define qh_REAL_1 "%6.16g "
    -#define qh_REAL_2n "%6.16g %6.16g\n"
    -#define qh_REAL_3n "%6.16g %6.16g %6.16g\n"
    -
    -#else
    -#error unknown float option
    -#endif
    -
    -/*----------------------------------
    -
    -  qh_CPUclock
    -    define the clock() function for reporting the total time spent by Qhull
    -    returns CPU ticks as a 'long int'
    -    qh_CPUclock is only used for reporting the total time spent by Qhull
    -
    -  qh_SECticks
    -    the number of clock ticks per second
    -
    -  notes:
    -    looks for CLOCKS_PER_SEC, CLOCKS_PER_SECOND, or assumes microseconds
    -    to define a custom clock, set qh_CLOCKtype to 0
    -
    -    if your system does not use clock() to return CPU ticks, replace
    -    qh_CPUclock with the corresponding function.  It is converted
    -    to 'unsigned long' to prevent wrap-around during long runs.  By default,
    -     defines clock_t as 'long'
    -
    -   Set qh_CLOCKtype to
    -
    -     1          for CLOCKS_PER_SEC, CLOCKS_PER_SECOND, or microsecond
    -                Note:  may fail if more than 1 hour elapsed time
    -
    -     2          use qh_clock() with POSIX times() (see global.c)
    -*/
    -#define qh_CLOCKtype 1  /* change to the desired number */
    -
    -#if (qh_CLOCKtype == 1)
    -
    -#if defined(CLOCKS_PER_SECOND)
    -#define qh_CPUclock    ((unsigned long)clock())  /* return CPU clock */
    -#define qh_SECticks CLOCKS_PER_SECOND
    -
    -#elif defined(CLOCKS_PER_SEC)
    -#define qh_CPUclock    ((unsigned long)clock())  /* return CPU clock */
    -#define qh_SECticks CLOCKS_PER_SEC
    -
    -#elif defined(CLK_TCK)
    -#define qh_CPUclock    ((unsigned long)clock())  /* return CPU clock */
    -#define qh_SECticks CLK_TCK
    -
    -#else
    -#define qh_CPUclock    ((unsigned long)clock())  /* return CPU clock */
    -#define qh_SECticks 1E6
    -#endif
    -
    -#elif (qh_CLOCKtype == 2)
    -#define qh_CPUclock    qh_clock()  /* return CPU clock */
    -#define qh_SECticks 100
    -
    -#else /* qh_CLOCKtype == ? */
    -#error unknown clock option
    -#endif
    -
    -/*----------------------------------
    -
    -  qh_RANDOMtype, qh_RANDOMmax, qh_RANDOMseed
    -    define random number generator
    -
    -    qh_RANDOMint generates a random integer between 0 and qh_RANDOMmax.
    -    qh_RANDOMseed sets the random number seed for qh_RANDOMint
    -
    -  Set qh_RANDOMtype (default 5) to:
    -    1       for random() with 31 bits (UCB)
    -    2       for rand() with RAND_MAX or 15 bits (system 5)
    -    3       for rand() with 31 bits (Sun)
    -    4       for lrand48() with 31 bits (Solaris)
    -    5       for qh_rand() with 31 bits (included with Qhull)
    -
    -  notes:
    -    Random numbers are used by rbox to generate point sets.  Random
    -    numbers are used by Qhull to rotate the input ('QRn' option),
    -    simulate a randomized algorithm ('Qr' option), and to simulate
    -    roundoff errors ('Rn' option).
    -
    -    Random number generators differ between systems.  Most systems provide
    -    rand() but the period varies.  The period of rand() is not critical
    -    since qhull does not normally use random numbers.
    -
    -    The default generator is Park & Miller's minimal standard random
    -    number generator [CACM 31:1195 '88].  It is included with Qhull.
    -
    -    If qh_RANDOMmax is wrong, qhull will report a warning and Geomview
    -    output will likely be invisible.
    -*/
    -#define qh_RANDOMtype 5   /* *** change to the desired number *** */
    -
    -#if (qh_RANDOMtype == 1)
    -#define qh_RANDOMmax ((realT)0x7fffffffUL)  /* 31 bits, random()/MAX */
    -#define qh_RANDOMint random()
    -#define qh_RANDOMseed_(seed) srandom(seed);
    -
    -#elif (qh_RANDOMtype == 2)
    -#ifdef RAND_MAX
    -#define qh_RANDOMmax ((realT)RAND_MAX)
    -#else
    -#define qh_RANDOMmax ((realT)32767)   /* 15 bits (System 5) */
    -#endif
    -#define qh_RANDOMint  rand()
    -#define qh_RANDOMseed_(seed) srand((unsigned)seed);
    -
    -#elif (qh_RANDOMtype == 3)
    -#define qh_RANDOMmax ((realT)0x7fffffffUL)  /* 31 bits, Sun */
    -#define qh_RANDOMint  rand()
    -#define qh_RANDOMseed_(seed) srand((unsigned)seed);
    -
    -#elif (qh_RANDOMtype == 4)
    -#define qh_RANDOMmax ((realT)0x7fffffffUL)  /* 31 bits, lrand38()/MAX */
    -#define qh_RANDOMint lrand48()
    -#define qh_RANDOMseed_(seed) srand48(seed);
    -
    -#elif (qh_RANDOMtype == 5)
    -#define qh_RANDOMmax ((realT)2147483646UL)  /* 31 bits, qh_rand/MAX */
    -#define qh_RANDOMint qh_rand()
    -#define qh_RANDOMseed_(seed) qh_srand(seed);
    -/* unlike rand(), never returns 0 */
    -
    -#else
    -#error: unknown random option
    -#endif
    -
    -/*----------------------------------
    -
    -  qh_ORIENTclock
    -    0 for inward pointing normals by Geomview convention
    -*/
    -#define qh_ORIENTclock 0
    -
    -
    -/*============================================================*/
    -/*============= joggle constants =============================*/
    -/*============================================================*/
    -
    -/*----------------------------------
    -
    -qh_JOGGLEdefault
    -default qh.JOGGLEmax is qh.DISTround * qh_JOGGLEdefault
    -
    -notes:
    -rbox s r 100 | qhull QJ1e-15 QR0 generates 90% faults at distround 7e-16
    -rbox s r 100 | qhull QJ1e-14 QR0 generates 70% faults
    -rbox s r 100 | qhull QJ1e-13 QR0 generates 35% faults
    -rbox s r 100 | qhull QJ1e-12 QR0 generates 8% faults
    -rbox s r 100 | qhull QJ1e-11 QR0 generates 1% faults
    -rbox s r 100 | qhull QJ1e-10 QR0 generates 0% faults
    -rbox 1000 W0 | qhull QJ1e-12 QR0 generates 86% faults
    -rbox 1000 W0 | qhull QJ1e-11 QR0 generates 20% faults
    -rbox 1000 W0 | qhull QJ1e-10 QR0 generates 2% faults
    -the later have about 20 points per facet, each of which may interfere
    -
    -pick a value large enough to avoid retries on most inputs
    -*/
    -#define qh_JOGGLEdefault 30000.0
    -
    -/*----------------------------------
    -
    -qh_JOGGLEincrease
    -factor to increase qh.JOGGLEmax on qh_JOGGLEretry or qh_JOGGLEagain
    -*/
    -#define qh_JOGGLEincrease 10.0
    -
    -/*----------------------------------
    -
    -qh_JOGGLEretry
    -if ZZretry = qh_JOGGLEretry, increase qh.JOGGLEmax
    -
    -notes:
    -try twice at the original value in case of bad luck the first time
    -*/
    -#define qh_JOGGLEretry 2
    -
    -/*----------------------------------
    -
    -qh_JOGGLEagain
    -every following qh_JOGGLEagain, increase qh.JOGGLEmax
    -
    -notes:
    -1 is OK since it's already failed qh_JOGGLEretry times
    -*/
    -#define qh_JOGGLEagain 1
    -
    -/*----------------------------------
    -
    -qh_JOGGLEmaxincrease
    -maximum qh.JOGGLEmax due to qh_JOGGLEincrease
    -relative to qh.MAXwidth
    -
    -notes:
    -qh.joggleinput will retry at this value until qh_JOGGLEmaxretry
    -*/
    -#define qh_JOGGLEmaxincrease 1e-2
    -
    -/*----------------------------------
    -
    -qh_JOGGLEmaxretry
    -stop after qh_JOGGLEmaxretry attempts
    -*/
    -#define qh_JOGGLEmaxretry 100
    -
    -/*============================================================*/
    -/*============= performance related constants ================*/
    -/*============================================================*/
    -
    -/*----------------------------------
    -
    -  qh_HASHfactor
    -    total hash slots / used hash slots.  Must be at least 1.1.
    -
    -  notes:
    -    =2 for at worst 50% occupancy for qh.hash_table and normally 25% occupancy
    -*/
    -#define qh_HASHfactor 2
    -
    -/*----------------------------------
    -
    -  qh_VERIFYdirect
    -    with 'Tv' verify all points against all facets if op count is smaller
    -
    -  notes:
    -    if greater, calls qh_check_bestdist() instead
    -*/
    -#define qh_VERIFYdirect 1000000
    -
    -/*----------------------------------
    -
    -  qh_INITIALsearch
    -     if qh_INITIALmax, search points up to this dimension
    -*/
    -#define qh_INITIALsearch 6
    -
    -/*----------------------------------
    -
    -  qh_INITIALmax
    -    if dim >= qh_INITIALmax, use min/max coordinate points for initial simplex
    -
    -  notes:
    -    from points with non-zero determinants
    -    use option 'Qs' to override (much slower)
    -*/
    -#define qh_INITIALmax 8
    -
    -/*============================================================*/
    -/*============= memory constants =============================*/
    -/*============================================================*/
    -
    -/*----------------------------------
    -
    -  qh_MEMalign
    -    memory alignment for qh_meminitbuffers() in global.c
    -
    -  notes:
    -    to avoid bus errors, memory allocation must consider alignment requirements.
    -    malloc() automatically takes care of alignment.   Since mem.c manages
    -    its own memory, we need to explicitly specify alignment in
    -    qh_meminitbuffers().
    -
    -    A safe choice is sizeof(double).  sizeof(float) may be used if doubles
    -    do not occur in data structures and pointers are the same size.  Be careful
    -    of machines (e.g., DEC Alpha) with large pointers.
    -
    -    If using gcc, best alignment is  [fmax_() is defined in geom_r.h]
    -              #define qh_MEMalign fmax_(__alignof__(realT),__alignof__(void *))
    -*/
    -#define qh_MEMalign ((int)(fmax_(sizeof(realT), sizeof(void *))))
    -
    -/*----------------------------------
    -
    -  qh_MEMbufsize
    -    size of additional memory buffers
    -
    -  notes:
    -    used for qh_meminitbuffers() in global.c
    -*/
    -#define qh_MEMbufsize 0x10000       /* allocate 64K memory buffers */
    -
    -/*----------------------------------
    -
    -  qh_MEMinitbuf
    -    size of initial memory buffer
    -
    -  notes:
    -    use for qh_meminitbuffers() in global.c
    -*/
    -#define qh_MEMinitbuf 0x20000      /* initially allocate 128K buffer */
    -
    -/*----------------------------------
    -
    -  qh_INFINITE
    -    on output, indicates Voronoi center at infinity
    -*/
    -#define qh_INFINITE  -10.101
    -
    -/*----------------------------------
    -
    -  qh_DEFAULTbox
    -    default box size (Geomview expects 0.5)
    -
    -  qh_DEFAULTbox
    -    default box size for integer coorindate (rbox only)
    -*/
    -#define qh_DEFAULTbox 0.5
    -#define qh_DEFAULTzbox 1e6
    -
    -/*============================================================*/
    -/*============= conditional compilation ======================*/
    -/*============================================================*/
    -
    -/*----------------------------------
    -
    -  __cplusplus
    -    defined by C++ compilers
    -
    -  __MSC_VER
    -    defined by Microsoft Visual C++
    -
    -  __MWERKS__ && __INTEL__
    -    defined by Metrowerks when compiling for Windows (not Intel-based Macintosh)
    -
    -  __MWERKS__ && __POWERPC__
    -    defined by Metrowerks when compiling for PowerPC-based Macintosh
    -  __STDC__
    -    defined for strict ANSI C
    -*/
    -
    -/*----------------------------------
    -
    -  qh_COMPUTEfurthest
    -    compute furthest distance to an outside point instead of storing it with the facet
    -    =1 to compute furthest
    -
    -  notes:
    -    computing furthest saves memory but costs time
    -      about 40% more distance tests for partitioning
    -      removes facet->furthestdist
    -*/
    -#define qh_COMPUTEfurthest 0
    -
    -/*----------------------------------
    -
    -  qh_KEEPstatistics
    -    =0 removes most of statistic gathering and reporting
    -
    -  notes:
    -    if 0, code size is reduced by about 4%.
    -*/
    -#define qh_KEEPstatistics 1
    -
    -/*----------------------------------
    -
    -  qh_MAXoutside
    -    record outer plane for each facet
    -    =1 to record facet->maxoutside
    -
    -  notes:
    -    this takes a realT per facet and slightly slows down qhull
    -    it produces better outer planes for geomview output
    -*/
    -#define qh_MAXoutside 1
    -
    -/*----------------------------------
    -
    -  qh_NOmerge
    -    disables facet merging if defined
    -
    -  notes:
    -    This saves about 10% space.
    -
    -    Unless 'Q0'
    -      qh_NOmerge sets 'QJ' to avoid precision errors
    -
    -    #define qh_NOmerge
    -
    -  see:
    -    qh_NOmem in mem.c
    -
    -    see user.c/user_eg.c for removing io.o
    -*/
    -
    -/*----------------------------------
    -
    -  qh_NOtrace
    -    no tracing if defined
    -
    -  notes:
    -    This saves about 5% space.
    -
    -    #define qh_NOtrace
    -*/
    -
    -/*----------------------------------
    -
    -  qh_QHpointer
    -    access global data with pointer or static structure
    -
    -  qh_QHpointer  = 1     access globals via a pointer to allocated memory
    -                        enables qh_saveqhull() and qh_restoreqhull()
    -                        [2010, gcc] costs about 4% in time and 4% in space
    -                        [2003, msvc] costs about 8% in time and 2% in space
    -
    -                = 0     qh_qh and qh_qhstat are static data structures
    -                        only one instance of qhull() can be active at a time
    -                        default value
    -
    -  qh_QHpointer_dllimport and qh_dllimport define qh_qh as __declspec(dllimport) [libqhull.h]
    -  It is required for msvc-2005.  It is not needed for gcc.
    -
    -  notes:
    -    [jan'16] qh_QHpointer is deprecated for Qhull.  Use libqhull_r instead.
    -    all global variables for qhull are in qh, qhmem, and qhstat
    -    qh is defined in libqhull.h
    -    qhmem is defined in mem.h
    -    qhstat is defined in stat.h
    -
    -*/
    -#ifdef qh_QHpointer
    -#if qh_dllimport
    -#error QH6207 Qhull error: Use qh_QHpointer_dllimport instead of qh_dllimport with qh_QHpointer
    -#endif
    -#else
    -#define qh_QHpointer 0
    -#if qh_QHpointer_dllimport
    -#error QH6234 Qhull error: Use qh_dllimport instead of qh_QHpointer_dllimport when qh_QHpointer is not defined
    -#endif
    -#endif
    -#if 0  /* sample code */
    -    qhT *oldqhA, *oldqhB;
    -
    -    exitcode= qh_new_qhull(dim, numpoints, points, ismalloc,
    -                      flags, outfile, errfile);
    -    /* use results from first call to qh_new_qhull */
    -    oldqhA= qh_save_qhull();
    -    exitcode= qh_new_qhull(dimB, numpointsB, pointsB, ismalloc,
    -                      flags, outfile, errfile);
    -    /* use results from second call to qh_new_qhull */
    -    oldqhB= qh_save_qhull();
    -    qh_restore_qhull(&oldqhA);
    -    /* use results from first call to qh_new_qhull */
    -    qh_freeqhull(qh_ALL);  /* frees all memory used by first call */
    -    qh_restore_qhull(&oldqhB);
    -    /* use results from second call to qh_new_qhull */
    -    qh_freeqhull(!qh_ALL); /* frees long memory used by second call */
    -    qh_memfreeshort(&curlong, &totlong);  /* frees short memory and memory allocator */
    -#endif
    -
    -/*----------------------------------
    -
    -  qh_QUICKhelp
    -    =1 to use abbreviated help messages, e.g., for degenerate inputs
    -*/
    -#define qh_QUICKhelp    0
    -
    -/*============================================================*/
    -/*============= -merge constants- ============================*/
    -/*============================================================*/
    -/*
    -   These constants effect facet merging.  You probably will not need
    -   to modify them.  They effect the performance of facet merging.
    -*/
    -
    -/*----------------------------------
    -
    -  qh_DIMmergeVertex
    -    max dimension for vertex merging (it is not effective in high-d)
    -*/
    -#define qh_DIMmergeVertex 6
    -
    -/*----------------------------------
    -
    -  qh_DIMreduceBuild
    -     max dimension for vertex reduction during build (slow in high-d)
    -*/
    -#define qh_DIMreduceBuild 5
    -
    -/*----------------------------------
    -
    -  qh_BESTcentrum
    -     if > 2*dim+n vertices, qh_findbestneighbor() tests centrums (faster)
    -     else, qh_findbestneighbor() tests all vertices (much better merges)
    -
    -  qh_BESTcentrum2
    -     if qh_BESTcentrum2 * DIM3 + BESTcentrum < #vertices tests centrums
    -*/
    -#define qh_BESTcentrum 20
    -#define qh_BESTcentrum2 2
    -
    -/*----------------------------------
    -
    -  qh_BESTnonconvex
    -    if > dim+n neighbors, qh_findbestneighbor() tests nonconvex ridges.
    -
    -  notes:
    -    It is needed because qh_findbestneighbor is slow for large facets
    -*/
    -#define qh_BESTnonconvex 15
    -
    -/*----------------------------------
    -
    -  qh_MAXnewmerges
    -    if >n newmerges, qh_merge_nonconvex() calls qh_reducevertices_centrums.
    -
    -  notes:
    -    It is needed because postmerge can merge many facets at once
    -*/
    -#define qh_MAXnewmerges 2
    -
    -/*----------------------------------
    -
    -  qh_MAXnewcentrum
    -    if <= dim+n vertices (n approximates the number of merges),
    -      reset the centrum in qh_updatetested() and qh_mergecycle_facets()
    -
    -  notes:
    -    needed to reduce cost and because centrums may move too much if
    -    many vertices in high-d
    -*/
    -#define qh_MAXnewcentrum 5
    -
    -/*----------------------------------
    -
    -  qh_COPLANARratio
    -    for 3-d+ merging, qh.MINvisible is n*premerge_centrum
    -
    -  notes:
    -    for non-merging, it's DISTround
    -*/
    -#define qh_COPLANARratio 3
    -
    -/*----------------------------------
    -
    -  qh_DISToutside
    -    When is a point clearly outside of a facet?
    -    Stops search in qh_findbestnew or qh_partitionall
    -    qh_findbest uses qh.MINoutside since since it is only called if no merges.
    -
    -  notes:
    -    'Qf' always searches for best facet
    -    if !qh.MERGING, same as qh.MINoutside.
    -    if qh_USEfindbestnew, increase value since neighboring facets may be ill-behaved
    -      [Note: Zdelvertextot occurs normally with interior points]
    -            RBOX 1000 s Z1 G1e-13 t1001188774 | QHULL Tv
    -    When there is a sharp edge, need to move points to a
    -    clearly good facet; otherwise may be lost in another partitioning.
    -    if too big then O(n^2) behavior for partitioning in cone
    -    if very small then important points not processed
    -    Needed in qh_partitionall for
    -      RBOX 1000 s Z1 G1e-13 t1001032651 | QHULL Tv
    -    Needed in qh_findbestnew for many instances of
    -      RBOX 1000 s Z1 G1e-13 t | QHULL Tv
    -
    -  See:
    -    qh_DISToutside -- when is a point clearly outside of a facet
    -    qh_SEARCHdist -- when is facet coplanar with the best facet?
    -    qh_USEfindbestnew -- when to use qh_findbestnew for qh_partitionpoint()
    -*/
    -#define qh_DISToutside ((qh_USEfindbestnew ? 2 : 1) * \
    -     fmax_((qh MERGING ? 2 : 1)*qh MINoutside, qh max_outside))
    -
    -/*----------------------------------
    -
    -  qh_RATIOnearinside
    -    ratio of qh.NEARinside to qh.ONEmerge for retaining inside points for
    -    qh_check_maxout().
    -
    -  notes:
    -    This is overkill since do not know the correct value.
    -    It effects whether 'Qc' reports all coplanar points
    -    Not used for 'd' since non-extreme points are coplanar
    -*/
    -#define qh_RATIOnearinside 5
    -
    -/*----------------------------------
    -
    -  qh_SEARCHdist
    -    When is a facet coplanar with the best facet?
    -    qh_findbesthorizon: all coplanar facets of the best facet need to be searched.
    -
    -  See:
    -    qh_DISToutside -- when is a point clearly outside of a facet
    -    qh_SEARCHdist -- when is facet coplanar with the best facet?
    -    qh_USEfindbestnew -- when to use qh_findbestnew for qh_partitionpoint()
    -*/
    -#define qh_SEARCHdist ((qh_USEfindbestnew ? 2 : 1) * \
    -      (qh max_outside + 2 * qh DISTround + fmax_( qh MINvisible, qh MAXcoplanar)));
    -
    -/*----------------------------------
    -
    -  qh_USEfindbestnew
    -     Always use qh_findbestnew for qh_partitionpoint, otherwise use
    -     qh_findbestnew if merged new facet or sharpnewfacets.
    -
    -  See:
    -    qh_DISToutside -- when is a point clearly outside of a facet
    -    qh_SEARCHdist -- when is facet coplanar with the best facet?
    -    qh_USEfindbestnew -- when to use qh_findbestnew for qh_partitionpoint()
    -*/
    -#define qh_USEfindbestnew (zzval_(Ztotmerge) > 50)
    -
    -/*----------------------------------
    -
    -  qh_WIDEcoplanar
    -    n*MAXcoplanar or n*MINvisible for a WIDEfacet
    -
    -    if vertex is further than qh.WIDEfacet from the hyperplane
    -    then its ridges are not counted in computing the area, and
    -    the facet's centrum is frozen.
    -
    -  notes:
    -   qh.WIDEfacet= max(qh.MAXoutside,qh_WIDEcoplanar*qh.MAXcoplanar,
    -      qh_WIDEcoplanar * qh.MINvisible);
    -*/
    -#define qh_WIDEcoplanar 6
    -
    -/*----------------------------------
    -
    -  qh_WIDEduplicate
    -    Merge ratio for errexit from qh_forcedmerges due to duplicate ridge
    -    Override with option Q12 no-wide-duplicate
    -
    -    Notes:
    -      Merging a duplicate ridge can lead to very wide facets.
    -      A future release of qhull will avoid duplicate ridges by removing duplicate sub-ridges from the horizon
    -*/
    -#define qh_WIDEduplicate 100
    -
    -/*----------------------------------
    -
    -  qh_MAXnarrow
    -    max. cosine in initial hull that sets qh.NARROWhull
    -
    -  notes:
    -    If qh.NARROWhull, the initial partition does not make
    -    coplanar points.  If narrow, a coplanar point can be
    -    coplanar to two facets of opposite orientations and
    -    distant from the exact convex hull.
    -
    -    Conservative estimate.  Don't actually see problems until it is -1.0
    -*/
    -#define qh_MAXnarrow -0.99999999
    -
    -/*----------------------------------
    -
    -  qh_WARNnarrow
    -    max. cosine in initial hull to warn about qh.NARROWhull
    -
    -  notes:
    -    this is a conservative estimate.
    -    Don't actually see problems until it is -1.0.  See qh-impre.htm
    -*/
    -#define qh_WARNnarrow -0.999999999999999
    -
    -/*----------------------------------
    -
    -  qh_ZEROdelaunay
    -    a zero Delaunay facet occurs for input sites coplanar with their convex hull
    -    the last normal coefficient of a zero Delaunay facet is within
    -        qh_ZEROdelaunay * qh.ANGLEround of 0
    -
    -  notes:
    -    qh_ZEROdelaunay does not allow for joggled input ('QJ').
    -
    -    You can avoid zero Delaunay facets by surrounding the input with a box.
    -
    -    Use option 'PDk:-n' to explicitly define zero Delaunay facets
    -      k= dimension of input sites (e.g., 3 for 3-d Delaunay triangulation)
    -      n= the cutoff for zero Delaunay facets (e.g., 'PD3:-1e-12')
    -*/
    -#define qh_ZEROdelaunay 2
    -
    -/*============================================================*/
    -/*============= Microsoft DevStudio ==========================*/
    -/*============================================================*/
    -
    -/*
    -   Finding Memory Leaks Using the CRT Library
    -   https://msdn.microsoft.com/en-us/library/x98tx3cf(v=vs.100).aspx
    -
    -   Reports enabled in qh_lib_check for Debug window and stderr
    -
    -   From 2005=>msvcr80d, 2010=>msvcr100d, 2012=>msvcr110d
    -
    -   Watch: {,,msvcr80d.dll}_crtBreakAlloc  Value from {n} in the leak report
    -   _CrtSetBreakAlloc(689); // qh_lib_check() [global_r.c]
    -
    -   Examples
    -     http://free-cad.sourceforge.net/SrcDocu/d2/d7f/MemDebug_8cpp_source.html
    -     https://github.com/illlust/Game/blob/master/library/MemoryLeak.cpp
    -*/
    -#if 0   /* off (0) by default for QHULL_CRTDBG */
    -#define QHULL_CRTDBG
    -#endif
    -
    -#if defined(_MSC_VER) && defined(_DEBUG) && defined(QHULL_CRTDBG)
    -#define _CRTDBG_MAP_ALLOC
    -#include 
    -#include 
    -#endif
    -#endif /* qh_DEFuser */
    -
    -
    -
    diff --git a/src/qhull/src/libqhull/usermem.c b/src/qhull/src/libqhull/usermem.c
    deleted file mode 100644
    index 0e99e8f66c1..00000000000
    --- a/src/qhull/src/libqhull/usermem.c
    +++ /dev/null
    @@ -1,94 +0,0 @@
    -/*
      ---------------------------------
    -
    -   usermem.c
    -   qh_exit(), qh_free(), and qh_malloc()
    -
    -   See README.txt.
    -
    -   If you redefine one of these functions you must redefine all of them.
    -   If you recompile and load this file, then usermem.o will not be loaded
    -   from qhull.a or qhull.lib
    -
    -   See libqhull.h for data structures, macros, and user-callable functions.
    -   See user.c for qhull-related, redefinable functions
    -   see user.h for user-definable constants
    -   See userprintf.c for qh_fprintf and userprintf_rbox.c for qh_fprintf_rbox
    -
    -   Please report any errors that you fix to qhull@qhull.org
    -*/
    -
    -#include "libqhull.h"
    -
    -#include 
    -#include 
    -
    -/*---------------------------------
    -
    -  qh_exit( exitcode )
    -    exit program
    -
    -  notes:
    -    qh_exit() is called when qh_errexit() and longjmp() are not available.
    -
    -    This is the only use of exit() in Qhull
    -    To replace qh_exit with 'throw', see libqhullcpp/usermem_r-cpp.cpp
    -*/
    -void qh_exit(int exitcode) {
    -    exit(exitcode);
    -} /* exit */
    -
    -/*---------------------------------
    -
    -  qh_fprintf_stderr( msgcode, format, list of args )
    -    fprintf to stderr with msgcode (non-zero)
    -
    -  notes:
    -    qh_fprintf_stderr() is called when qh.ferr is not defined, usually due to an initialization error
    -    
    -    It is typically followed by qh_errexit().
    -
    -    Redefine this function to avoid using stderr
    -
    -    Use qh_fprintf [userprintf.c] for normal printing
    -*/
    -void qh_fprintf_stderr(int msgcode, const char *fmt, ... ) {
    -    va_list args;
    -
    -    va_start(args, fmt);
    -    if(msgcode)
    -      fprintf(stderr, "QH%.4d ", msgcode);
    -    vfprintf(stderr, fmt, args);
    -    va_end(args);
    -} /* fprintf_stderr */
    -
    -/*---------------------------------
    -
    -  qh_free( mem )
    -    free memory
    -
    -  notes:
    -    same as free()
    -    No calls to qh_errexit() 
    -*/
    -void qh_free(void *mem) {
    -    free(mem);
    -} /* free */
    -
    -/*---------------------------------
    -
    -    qh_malloc( mem )
    -      allocate memory
    -
    -    notes:
    -      same as malloc()
    -*/
    -void *qh_malloc(size_t size) {
    -    return malloc(size);
    -} /* malloc */
    -
    -
    diff --git a/src/qhull/src/libqhull/userprintf.c b/src/qhull/src/libqhull/userprintf.c
    deleted file mode 100644
    index 190d7cd79b3..00000000000
    --- a/src/qhull/src/libqhull/userprintf.c
    +++ /dev/null
    @@ -1,66 +0,0 @@
    -/*
      ---------------------------------
    -
    -   userprintf.c
    -   qh_fprintf()
    -
    -   see README.txt  see COPYING.txt for copyright information.
    -
    -   If you recompile and load this file, then userprintf.o will not be loaded
    -   from qhull.a or qhull.lib
    -
    -   See libqhull.h for data structures, macros, and user-callable functions.
    -   See user.c for qhull-related, redefinable functions
    -   see user.h for user-definable constants
    -   See usermem.c for qh_exit(), qh_free(), and qh_malloc()
    -   see Qhull.cpp and RboxPoints.cpp for examples.
    -
    -   Please report any errors that you fix to qhull@qhull.org
    -*/
    -
    -#include "libqhull.h"
    -#include "mem.h"
    -
    -#include 
    -#include 
    -#include 
    -
    -/*---------------------------------
    -
    -   qh_fprintf(fp, msgcode, format, list of args )
    -     print arguments to *fp according to format
    -     Use qh_fprintf_rbox() for rboxlib.c
    -
    -   notes:
    -     same as fprintf()
    -     fgets() is not trapped like fprintf()
    -     exit qh_fprintf via qh_errexit()
    -     may be called for errors in qh_initstatistics and qh_meminit
    -*/
    -
    -void qh_fprintf(FILE *fp, int msgcode, const char *fmt, ... ) {
    -    va_list args;
    -
    -    if (!fp) {
    -        /* could use qhmem.ferr, but probably better to be cautious */
    -        qh_fprintf_stderr(6232, "Qhull internal error (userprintf.c): fp is 0.  Wrong qh_fprintf called.\n");
    -        qh_errexit(6232, NULL, NULL);
    -    }
    -    va_start(args, fmt);
    -#if qh_QHpointer
    -    if (qh_qh && qh ANNOTATEoutput) {
    -#else
    -    if (qh ANNOTATEoutput) {
    -#endif
    -      fprintf(fp, "[QH%.4d]", msgcode);
    -    }else if (msgcode >= MSG_ERROR && msgcode < MSG_STDERR ) {
    -      fprintf(fp, "QH%.4d ", msgcode);
    -    }
    -    vfprintf(fp, fmt, args);
    -    va_end(args);
    -
    -    /* Place debugging traps here. Use with option 'Tn' */
    -
    -} /* qh_fprintf */
    -
    diff --git a/src/qhull/src/libqhull/userprintf_rbox.c b/src/qhull/src/libqhull/userprintf_rbox.c
    deleted file mode 100644
    index 8edd2001aa5..00000000000
    --- a/src/qhull/src/libqhull/userprintf_rbox.c
    +++ /dev/null
    @@ -1,53 +0,0 @@
    -/*
      ---------------------------------
    -
    -   userprintf_rbox.c
    -   qh_fprintf_rbox()
    -
    -   see README.txt  see COPYING.txt for copyright information.
    -
    -   If you recompile and load this file, then userprintf_rbox.o will not be loaded
    -   from qhull.a or qhull.lib
    -
    -   See libqhull.h for data structures, macros, and user-callable functions.
    -   See user.c for qhull-related, redefinable functions
    -   see user.h for user-definable constants
    -   See usermem.c for qh_exit(), qh_free(), and qh_malloc()
    -   see Qhull.cpp and RboxPoints.cpp for examples.
    -
    -   Please report any errors that you fix to qhull@qhull.org
    -*/
    -
    -#include "libqhull.h"
    -
    -#include 
    -#include 
    -#include 
    -
    -/*---------------------------------
    -
    -   qh_fprintf_rbox(fp, msgcode, format, list of args )
    -     print arguments to *fp according to format
    -     Use qh_fprintf_rbox() for rboxlib.c
    -
    -   notes:
    -     same as fprintf()
    -     fgets() is not trapped like fprintf()
    -     exit qh_fprintf_rbox via qh_errexit_rbox()
    -*/
    -
    -void qh_fprintf_rbox(FILE *fp, int msgcode, const char *fmt, ... ) {
    -    va_list args;
    -
    -    if (!fp) {
    -        qh_fprintf_stderr(6231, "Qhull internal error (userprintf_rbox.c): fp is 0.  Wrong qh_fprintf_rbox called.\n");
    -        qh_errexit_rbox(6231);
    -    }
    -    if (msgcode >= MSG_ERROR && msgcode < MSG_STDERR)
    -      fprintf(fp, "QH%.4d ", msgcode);
    -    va_start(args, fmt);
    -    vfprintf(fp, fmt, args);
    -    va_end(args);
    -} /* qh_fprintf_rbox */
    -
    diff --git a/src/qhull/src/libqhull_r/Makefile b/src/qhull/src/libqhull_r/Makefile
    deleted file mode 100644
    index 5c40969e01c..00000000000
    --- a/src/qhull/src/libqhull_r/Makefile
    +++ /dev/null
    @@ -1,240 +0,0 @@
    -# Simple gcc Makefile for reentrant qhull and rbox (default gcc/g++)
    -#
    -#   make help
    -#   See README.txt and ../../Makefile
    -#       
    -# Variables
    -#   BINDIR         directory where to copy executables
    -#   DESTDIR        destination directory for 'make install'
    -#   DOCDIR         directory where to copy html documentation
    -#   INCDIR         directory where to copy headers
    -#   LIBDIR         directory where to copy libraries
    -#   MANDIR         directory where to copy manual pages
    -#   PRINTMAN       command for printing manual pages
    -#   PRINTC         command for printing C files
    -#   CC             ANSI C or C++ compiler
    -#   CC_OPTS1       options used to compile .c files
    -#   CC_OPTS2       options used to link .o files
    -#   CC_OPTS3       options to build shared libraries
    -#
    -#   LIBQHULL_OBJS  .o files for linking
    -#   LIBQHULL_HDRS  .h files for printing
    -#   CFILES         .c files for printing
    -#   DOCFILES       documentation files
    -#   FILES          miscellaneous files for printing
    -#   TFILES         .txt versions of html files
    -#   FILES          all other files
    -#   LIBQHULL_OBJS  specifies the object files of libqhullstatic_r.a
    -#
    -# Results
    -#   rbox           Generates points sets for qhull, qconvex, etc.
    -#   qhull          Computes convex hulls and related structures
    -#   qconvex, qdelaunay, qhalf, qvoronoi
    -#                  Specializations of qhull for each geometric structure
    -#   libqhullstatic_r.a Static library for reentrant qhull
    -#   testqset_r     Standalone test of reentrant qset_r.c with mem_r.c
    -#   user_eg        An example of using qhull (reentrant)
    -#   user_eg2       An example of using qhull (reentrant)
    -#
    -# Make targets
    -#   make           Build results using gcc or another compiler
    -#   make clean     Remove object files
    -#   make cleanall  Remove generated files
    -#   make doc       Print documentation
    -#   make help
    -#   make install   Copy qhull, rbox, qhull.1, rbox.1 to BINDIR, MANDIR
    -#   make new       Rebuild qhull and rbox from source
    -#   make printall  Print all files
    -#   make qtest     Quick test of qset, rbox, and qhull
    -#   make test      Quck test of qhull, qconvex, etc.
    -#
    -# Do not replace tabs with spaces.  Needed for build rules
    -# Unix line endings (\n)
    -# $Id: //main/2015/qhull/src/libqhull_r/Makefile#6 $
    -
    -DESTDIR = /usr/local
    -BINDIR	= $(DESTDIR)/bin
    -INCDIR	= $(DESTDIR)/include
    -LIBDIR	= $(DESTDIR)/lib
    -DOCDIR	= $(DESTDIR)/share/doc/qhull
    -MANDIR	= $(DESTDIR)/share/man/man1
    -
    -# if you do not have enscript, try a2ps or just use lpr.  The files are text.
    -PRINTMAN = enscript -2rl
    -PRINTC = enscript -2r
    -# PRINTMAN = lpr
    -# PRINTC = lpr
    -
    -#for Gnu's gcc compiler, -O3 for optimization, -g for debugging, -pg for profiling
    -# -fpic  needed for gcc x86_64-linux-gnu.  Not needed for mingw
    -CC        = gcc
    -CC_OPTS1  = -O3 -ansi -I../../src -fpic $(CC_WARNINGS)
    -
    -# for Sun's cc compiler, -fast or O2 for optimization, -g for debugging, -Xc for ANSI
    -#CC       = cc
    -#CC_OPTS1 = -Xc -v -fast -I../../src 
    -
    -# for Silicon Graphics cc compiler, -O2 for optimization, -g for debugging
    -#CC       = cc
    -#CC_OPTS1 = -ansi -O2 -I../../src 
    -
    -# for Next cc compiler with fat executable
    -#CC       = cc
    -#CC_OPTS1 = -ansi -O2 -I../../src -arch m68k -arch i386 -arch hppa
    -
    -# For loader, ld, 
    -CC_OPTS2 = $(CC_OPTS1)
    -
    -# Default targets for make
    -
    -all: qhull_links qhull_all qtest
    -
    -help:
    -	head -n 50 Makefile
    -
    -clean:
    -	rm -f *.o 
    -	# Delete linked files from other directories [qhull_links]
    -	rm -f qconvex_r.c unix_r.c qdelaun_r.c qhalf_r.c qvoronoi_r.c rbox_r.c
    -	rm -f user_eg_r.c user_eg2_r.c testqset_r.c
    -	
    -cleanall: clean
    -	rm -f qconvex qdelaunay qhalf qvoronoi qhull *.exe
    -	rm -f core user_eg_r user_eg2_r testqset_r libqhullstatic_r.a
    -
    -doc: 
    -	$(PRINTMAN) $(TXTFILES) $(DOCFILES)
    -
    -install:
    -	mkdir -p $(BINDIR)
    -	mkdir -p $(DOCDIR)
    -	mkdir -p $(INCDIR)/libqhull
    -	mkdir -p $(MANDIR)
    -	cp -p qconvex qdelaunay qhalf qhull qvoronoi rbox $(BINDIR)
    -	cp -p libqhullstatic_r.a $(LIBDIR)
    -	cp -p ../../html/qhull.man $(MANDIR)/qhull.1
    -	cp -p ../../html/rbox.man $(MANDIR)/rbox.1
    -	cp -p ../../html/* $(DOCDIR)
    -	cp *.h $(INCDIR)/libqhull_r
    -
    -new:	cleanall all
    -
    -printall: doc printh printc printf
    -
    -printh:
    -	$(PRINTC) $(LIBQHULL_HDRS)
    -
    -printc:
    -	$(PRINTC) $(CFILES)
    -
    -# LIBQHULL_OBJS_1 ordered by frequency of execution with small files at end.  Better locality.
    -# Same definitions as ../../Makefile
    -
    -LIBQHULLS_OBJS_1= global_r.o stat_r.o geom2_r.o poly2_r.o merge_r.o \
    -        libqhull_r.o geom_r.o poly_r.o qset_r.o mem_r.o random_r.o 
    -
    -LIBQHULLS_OBJS_2= $(LIBQHULLS_OBJS_1) usermem_r.o userprintf_r.o io_r.o user_r.o
    -
    -LIBQHULLS_OBJS= $(LIBQHULLS_OBJS_2)  rboxlib_r.o userprintf_rbox_r.o
    -
    -LIBQHULL_HDRS= user_r.h libqhull_r.h qhull_ra.h geom_r.h \
    -        io_r.h mem_r.h merge_r.h poly_r.h random_r.h \
    -        qset_r.h stat_r.h
    -
    -# CFILES ordered alphabetically after libqhull.c 
    -CFILES= ../qhull/unix_r.c libqhull_r.c geom_r.c geom2_r.c global_r.c io_r.c \
    -	mem_r.c merge_r.c poly_r.c poly2_r.c random_r.c rboxlib_r.c \
    -	qset_r.c stat_r.c user_r.c usermem_r.c userprintf_r.c \
    -	../qconvex/qconvex.c ../qdelaunay/qdelaun.c ../qhalf/qhalf.c ../qvoronoi/qvoronoi.c
    -
    -TXTFILES= ../../Announce.txt ../../REGISTER.txt ../../COPYING.txt ../../README.txt ../Changes.txt
    -DOCFILES= ../../html/rbox.txt ../../html/qhull.txt
    -
    -.c.o:
    -	$(CC) -c $(CC_OPTS1) -o $@ $<
    -
    -# Work around problems with ../ in Red Hat Linux
    -qhull_links:
    -	# On MINSYS, 'ln -s' may create a copy instead of a symbolic link
    -	[ -f qconvex_r.c ]  || ln -s ../qconvex/qconvex_r.c
    -	[ -f qdelaun_r.c ]  || ln -s ../qdelaunay/qdelaun_r.c
    -	[ -f qhalf_r.c ]    || ln -s ../qhalf/qhalf_r.c
    -	[ -f qvoronoi_r.c ] || ln -s ../qvoronoi/qvoronoi_r.c
    -	[ -f rbox_r.c ]     || ln -s ../rbox/rbox_r.c
    -	[ -f testqset_r.c ] || ln -s ../testqset_r/testqset_r.c
    -	[ -f unix_r.c ]     || ln -s ../qhull/unix_r.c
    -	[ -f user_eg_r.c ]  || ln -s ../user_eg/user_eg_r.c
    -	[ -f user_eg2_r.c ] || ln -s ../user_eg2/user_eg2_r.c
    -
    -# compile qhull without using bin/libqhullstatic_r.a
    -qhull_all: qconvex_r.o qdelaun_r.o qhalf_r.o qvoronoi_r.o unix_r.o user_eg_r.o user_eg2_r.o rbox_r.o testqset_r.o $(LIBQHULLS_OBJS)
    -	$(CC) -o qconvex $(CC_OPTS2) -lm $(LIBQHULLS_OBJS_2) qconvex_r.o
    -	$(CC) -o qdelaunay $(CC_OPTS2) -lm $(LIBQHULLS_OBJS_2) qdelaun_r.o
    -	$(CC) -o qhalf $(CC_OPTS2) -lm $(LIBQHULLS_OBJS_2) qhalf_r.o
    -	$(CC) -o qvoronoi $(CC_OPTS2) -lm $(LIBQHULLS_OBJS_2) qvoronoi_r.o
    -	$(CC) -o qhull $(CC_OPTS2) -lm $(LIBQHULLS_OBJS_2) unix_r.o 
    -	$(CC) -o rbox $(CC_OPTS2) -lm $(LIBQHULLS_OBJS) rbox_r.o
    -	$(CC) -o user_eg $(CC_OPTS2) -lm $(LIBQHULLS_OBJS_2) user_eg_r.o 
    -	$(CC) -o user_eg2 $(CC_OPTS2) -lm $(LIBQHULLS_OBJS_1) user_eg2_r.o  usermem_r.o userprintf_r.o io_r.o
    -	$(CC) -o testqset_r $(CC_OPTS2) -lm mem_r.o qset_r.o usermem_r.o testqset_r.o
    -	-ar -rs libqhullstatic_r.a $(LIBQHULLS_OBJS)
    -	#libqhullstatic_r.a is not needed for qhull
    -	#If 'ar -rs' fails try using 'ar -s' with 'ranlib'
    -	#ranlib libqhullstatic_r.a
    -
    -qtest:
    -	@echo ============================================
    -	@echo == make qtest ==============================
    -	@echo ============================================
    -	@echo -n "== "
    -	@date
    -	@echo
    -	@echo Testing qset.c and mem.c with testqset
    -	./testqset_r 10000
    -	@echo Run the qhull smoketest
    -	./rbox D4 | ./qhull
    -	@echo ============================================
    -	@echo == To smoketest qhull programs
    -	@echo '==     make test'
    -	@echo ============================================
    -	@echo
    -	@echo ============================================
    -	@echo == For all make targets
    -	@echo '==     make help'
    -	@echo ============================================
    -	@echo
    -
    -test: qtest
    -	@echo ==============================
    -	@echo ========= qconvex ============
    -	@echo ==============================
    -	-./rbox 10 | ./qconvex Tv 
    -	@echo
    -	@echo ==============================
    -	@echo ========= qdelaunay ==========
    -	@echo ==============================
    -	-./rbox 10 | ./qdelaunay Tv 
    -	@echo
    -	@echo ==============================
    -	@echo ========= qhalf ==============
    -	@echo ==============================
    -	-./rbox 10 | ./qconvex FQ FV n Tv | ./qhalf Tv
    -	@echo
    -	@echo ==============================
    -	@echo ========= qvoronoi ===========
    -	@echo ==============================
    -	-./rbox 10 | ./qvoronoi Tv
    -	@echo
    -	@echo ==============================
    -	@echo ========= user_eg ============
    -	@echo == w/o shared library ========
    -	@echo ==============================
    -	-./user_eg
    -	@echo
    -	@echo ==============================
    -	@echo ========= user_eg2 ===========
    -	@echo ==============================
    -	-./user_eg2
    -	@echo
    -
    -# end of Makefile
    diff --git a/src/qhull/src/libqhull_r/geom2_r.c b/src/qhull/src/libqhull_r/geom2_r.c
    deleted file mode 100644
    index 0345440be2d..00000000000
    --- a/src/qhull/src/libqhull_r/geom2_r.c
    +++ /dev/null
    @@ -1,2096 +0,0 @@
    -/*
      ---------------------------------
    -
    -
    -   geom2_r.c
    -   infrequently used geometric routines of qhull
    -
    -   see qh-geom_r.htm and geom_r.h
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull_r/geom2_r.c#6 $$Change: 2065 $
    -   $DateTime: 2016/01/18 13:51:04 $$Author: bbarber $
    -
    -   frequently used code goes into geom_r.c
    -*/
    -
    -#include "qhull_ra.h"
    -
    -/*================== functions in alphabetic order ============*/
    -
    -/*---------------------------------
    -
    -  qh_copypoints(qh, points, numpoints, dimension)
    -    return qh_malloc'd copy of points
    -  
    -  notes:
    -    qh_free the returned points to avoid a memory leak
    -*/
    -coordT *qh_copypoints(qhT *qh, coordT *points, int numpoints, int dimension) {
    -  int size;
    -  coordT *newpoints;
    -
    -  size= numpoints * dimension * (int)sizeof(coordT);
    -  if (!(newpoints= (coordT*)qh_malloc((size_t)size))) {
    -    qh_fprintf(qh, qh->ferr, 6004, "qhull error: insufficient memory to copy %d points\n",
    -        numpoints);
    -    qh_errexit(qh, qh_ERRmem, NULL, NULL);
    -  }
    -  memcpy((char *)newpoints, (char *)points, (size_t)size); /* newpoints!=0 by QH6004 */
    -  return newpoints;
    -} /* copypoints */
    -
    -/*---------------------------------
    -
    -  qh_crossproduct( dim, vecA, vecB, vecC )
    -    crossproduct of 2 dim vectors
    -    C= A x B
    -
    -  notes:
    -    from Glasner, Graphics Gems I, p. 639
    -    only defined for dim==3
    -*/
    -void qh_crossproduct(int dim, realT vecA[3], realT vecB[3], realT vecC[3]){
    -
    -  if (dim == 3) {
    -    vecC[0]=   det2_(vecA[1], vecA[2],
    -                     vecB[1], vecB[2]);
    -    vecC[1]= - det2_(vecA[0], vecA[2],
    -                     vecB[0], vecB[2]);
    -    vecC[2]=   det2_(vecA[0], vecA[1],
    -                     vecB[0], vecB[1]);
    -  }
    -} /* vcross */
    -
    -/*---------------------------------
    -
    -  qh_determinant(qh, rows, dim, nearzero )
    -    compute signed determinant of a square matrix
    -    uses qh.NEARzero to test for degenerate matrices
    -
    -  returns:
    -    determinant
    -    overwrites rows and the matrix
    -    if dim == 2 or 3
    -      nearzero iff determinant < qh->NEARzero[dim-1]
    -      (!quite correct, not critical)
    -    if dim >= 4
    -      nearzero iff diagonal[k] < qh->NEARzero[k]
    -*/
    -realT qh_determinant(qhT *qh, realT **rows, int dim, boolT *nearzero) {
    -  realT det=0;
    -  int i;
    -  boolT sign= False;
    -
    -  *nearzero= False;
    -  if (dim < 2) {
    -    qh_fprintf(qh, qh->ferr, 6005, "qhull internal error (qh_determinate): only implemented for dimension >= 2\n");
    -    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -  }else if (dim == 2) {
    -    det= det2_(rows[0][0], rows[0][1],
    -                 rows[1][0], rows[1][1]);
    -    if (fabs_(det) < 10*qh->NEARzero[1])  /* not really correct, what should this be? */
    -      *nearzero= True;
    -  }else if (dim == 3) {
    -    det= det3_(rows[0][0], rows[0][1], rows[0][2],
    -                 rows[1][0], rows[1][1], rows[1][2],
    -                 rows[2][0], rows[2][1], rows[2][2]);
    -    if (fabs_(det) < 10*qh->NEARzero[2])  /* what should this be?  det 5.5e-12 was flat for qh_maxsimplex of qdelaunay 0,0 27,27 -36,36 -9,63 */
    -      *nearzero= True;
    -  }else {
    -    qh_gausselim(qh, rows, dim, dim, &sign, nearzero);  /* if nearzero, diagonal still ok*/
    -    det= 1.0;
    -    for (i=dim; i--; )
    -      det *= (rows[i])[i];
    -    if (sign)
    -      det= -det;
    -  }
    -  return det;
    -} /* determinant */
    -
    -/*---------------------------------
    -
    -  qh_detjoggle(qh, points, numpoints, dimension )
    -    determine default max joggle for point array
    -      as qh_distround * qh_JOGGLEdefault
    -
    -  returns:
    -    initial value for JOGGLEmax from points and REALepsilon
    -
    -  notes:
    -    computes DISTround since qh_maxmin not called yet
    -    if qh->SCALElast, last dimension will be scaled later to MAXwidth
    -
    -    loop duplicated from qh_maxmin
    -*/
    -realT qh_detjoggle(qhT *qh, pointT *points, int numpoints, int dimension) {
    -  realT abscoord, distround, joggle, maxcoord, mincoord;
    -  pointT *point, *pointtemp;
    -  realT maxabs= -REALmax;
    -  realT sumabs= 0;
    -  realT maxwidth= 0;
    -  int k;
    -
    -  for (k=0; k < dimension; k++) {
    -    if (qh->SCALElast && k == dimension-1)
    -      abscoord= maxwidth;
    -    else if (qh->DELAUNAY && k == dimension-1) /* will qh_setdelaunay() */
    -      abscoord= 2 * maxabs * maxabs;  /* may be low by qh->hull_dim/2 */
    -    else {
    -      maxcoord= -REALmax;
    -      mincoord= REALmax;
    -      FORALLpoint_(qh, points, numpoints) {
    -        maximize_(maxcoord, point[k]);
    -        minimize_(mincoord, point[k]);
    -      }
    -      maximize_(maxwidth, maxcoord-mincoord);
    -      abscoord= fmax_(maxcoord, -mincoord);
    -    }
    -    sumabs += abscoord;
    -    maximize_(maxabs, abscoord);
    -  } /* for k */
    -  distround= qh_distround(qh, qh->hull_dim, maxabs, sumabs);
    -  joggle= distround * qh_JOGGLEdefault;
    -  maximize_(joggle, REALepsilon * qh_JOGGLEdefault);
    -  trace2((qh, qh->ferr, 2001, "qh_detjoggle: joggle=%2.2g maxwidth=%2.2g\n", joggle, maxwidth));
    -  return joggle;
    -} /* detjoggle */
    -
    -/*---------------------------------
    -
    -  qh_detroundoff(qh)
    -    determine maximum roundoff errors from
    -      REALepsilon, REALmax, REALmin, qh.hull_dim, qh.MAXabs_coord,
    -      qh.MAXsumcoord, qh.MAXwidth, qh.MINdenom_1
    -
    -    accounts for qh.SETroundoff, qh.RANDOMdist, qh->MERGEexact
    -      qh.premerge_cos, qh.postmerge_cos, qh.premerge_centrum,
    -      qh.postmerge_centrum, qh.MINoutside,
    -      qh_RATIOnearinside, qh_COPLANARratio, qh_WIDEcoplanar
    -
    -  returns:
    -    sets qh.DISTround, etc. (see below)
    -    appends precision constants to qh.qhull_options
    -
    -  see:
    -    qh_maxmin() for qh.NEARzero
    -
    -  design:
    -    determine qh.DISTround for distance computations
    -    determine minimum denominators for qh_divzero
    -    determine qh.ANGLEround for angle computations
    -    adjust qh.premerge_cos,... for roundoff error
    -    determine qh.ONEmerge for maximum error due to a single merge
    -    determine qh.NEARinside, qh.MAXcoplanar, qh.MINvisible,
    -      qh.MINoutside, qh.WIDEfacet
    -    initialize qh.max_vertex and qh.minvertex
    -*/
    -void qh_detroundoff(qhT *qh) {
    -
    -  qh_option(qh, "_max-width", NULL, &qh->MAXwidth);
    -  if (!qh->SETroundoff) {
    -    qh->DISTround= qh_distround(qh, qh->hull_dim, qh->MAXabs_coord, qh->MAXsumcoord);
    -    if (qh->RANDOMdist)
    -      qh->DISTround += qh->RANDOMfactor * qh->MAXabs_coord;
    -    qh_option(qh, "Error-roundoff", NULL, &qh->DISTround);
    -  }
    -  qh->MINdenom= qh->MINdenom_1 * qh->MAXabs_coord;
    -  qh->MINdenom_1_2= sqrt(qh->MINdenom_1 * qh->hull_dim) ;  /* if will be normalized */
    -  qh->MINdenom_2= qh->MINdenom_1_2 * qh->MAXabs_coord;
    -                                              /* for inner product */
    -  qh->ANGLEround= 1.01 * qh->hull_dim * REALepsilon;
    -  if (qh->RANDOMdist)
    -    qh->ANGLEround += qh->RANDOMfactor;
    -  if (qh->premerge_cos < REALmax/2) {
    -    qh->premerge_cos -= qh->ANGLEround;
    -    if (qh->RANDOMdist)
    -      qh_option(qh, "Angle-premerge-with-random", NULL, &qh->premerge_cos);
    -  }
    -  if (qh->postmerge_cos < REALmax/2) {
    -    qh->postmerge_cos -= qh->ANGLEround;
    -    if (qh->RANDOMdist)
    -      qh_option(qh, "Angle-postmerge-with-random", NULL, &qh->postmerge_cos);
    -  }
    -  qh->premerge_centrum += 2 * qh->DISTround;    /*2 for centrum and distplane()*/
    -  qh->postmerge_centrum += 2 * qh->DISTround;
    -  if (qh->RANDOMdist && (qh->MERGEexact || qh->PREmerge))
    -    qh_option(qh, "Centrum-premerge-with-random", NULL, &qh->premerge_centrum);
    -  if (qh->RANDOMdist && qh->POSTmerge)
    -    qh_option(qh, "Centrum-postmerge-with-random", NULL, &qh->postmerge_centrum);
    -  { /* compute ONEmerge, max vertex offset for merging simplicial facets */
    -    realT maxangle= 1.0, maxrho;
    -
    -    minimize_(maxangle, qh->premerge_cos);
    -    minimize_(maxangle, qh->postmerge_cos);
    -    /* max diameter * sin theta + DISTround for vertex to its hyperplane */
    -    qh->ONEmerge= sqrt((realT)qh->hull_dim) * qh->MAXwidth *
    -      sqrt(1.0 - maxangle * maxangle) + qh->DISTround;
    -    maxrho= qh->hull_dim * qh->premerge_centrum + qh->DISTround;
    -    maximize_(qh->ONEmerge, maxrho);
    -    maxrho= qh->hull_dim * qh->postmerge_centrum + qh->DISTround;
    -    maximize_(qh->ONEmerge, maxrho);
    -    if (qh->MERGING)
    -      qh_option(qh, "_one-merge", NULL, &qh->ONEmerge);
    -  }
    -  qh->NEARinside= qh->ONEmerge * qh_RATIOnearinside; /* only used if qh->KEEPnearinside */
    -  if (qh->JOGGLEmax < REALmax/2 && (qh->KEEPcoplanar || qh->KEEPinside)) {
    -    realT maxdist;             /* adjust qh.NEARinside for joggle */
    -    qh->KEEPnearinside= True;
    -    maxdist= sqrt((realT)qh->hull_dim) * qh->JOGGLEmax + qh->DISTround;
    -    maxdist= 2*maxdist;        /* vertex and coplanar point can joggle in opposite directions */
    -    maximize_(qh->NEARinside, maxdist);  /* must agree with qh_nearcoplanar() */
    -  }
    -  if (qh->KEEPnearinside)
    -    qh_option(qh, "_near-inside", NULL, &qh->NEARinside);
    -  if (qh->JOGGLEmax < qh->DISTround) {
    -    qh_fprintf(qh, qh->ferr, 6006, "qhull error: the joggle for 'QJn', %.2g, is below roundoff for distance computations, %.2g\n",
    -         qh->JOGGLEmax, qh->DISTround);
    -    qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -  }
    -  if (qh->MINvisible > REALmax/2) {
    -    if (!qh->MERGING)
    -      qh->MINvisible= qh->DISTround;
    -    else if (qh->hull_dim <= 3)
    -      qh->MINvisible= qh->premerge_centrum;
    -    else
    -      qh->MINvisible= qh_COPLANARratio * qh->premerge_centrum;
    -    if (qh->APPROXhull && qh->MINvisible > qh->MINoutside)
    -      qh->MINvisible= qh->MINoutside;
    -    qh_option(qh, "Visible-distance", NULL, &qh->MINvisible);
    -  }
    -  if (qh->MAXcoplanar > REALmax/2) {
    -    qh->MAXcoplanar= qh->MINvisible;
    -    qh_option(qh, "U-coplanar-distance", NULL, &qh->MAXcoplanar);
    -  }
    -  if (!qh->APPROXhull) {             /* user may specify qh->MINoutside */
    -    qh->MINoutside= 2 * qh->MINvisible;
    -    if (qh->premerge_cos < REALmax/2)
    -      maximize_(qh->MINoutside, (1- qh->premerge_cos) * qh->MAXabs_coord);
    -    qh_option(qh, "Width-outside", NULL, &qh->MINoutside);
    -  }
    -  qh->WIDEfacet= qh->MINoutside;
    -  maximize_(qh->WIDEfacet, qh_WIDEcoplanar * qh->MAXcoplanar);
    -  maximize_(qh->WIDEfacet, qh_WIDEcoplanar * qh->MINvisible);
    -  qh_option(qh, "_wide-facet", NULL, &qh->WIDEfacet);
    -  if (qh->MINvisible > qh->MINoutside + 3 * REALepsilon
    -  && !qh->BESToutside && !qh->FORCEoutput)
    -    qh_fprintf(qh, qh->ferr, 7001, "qhull input warning: minimum visibility V%.2g is greater than \nminimum outside W%.2g.  Flipped facets are likely.\n",
    -             qh->MINvisible, qh->MINoutside);
    -  qh->max_vertex= qh->DISTround;
    -  qh->min_vertex= -qh->DISTround;
    -  /* numeric constants reported in printsummary */
    -} /* detroundoff */
    -
    -/*---------------------------------
    -
    -  qh_detsimplex(qh, apex, points, dim, nearzero )
    -    compute determinant of a simplex with point apex and base points
    -
    -  returns:
    -     signed determinant and nearzero from qh_determinant
    -
    -  notes:
    -     uses qh.gm_matrix/qh.gm_row (assumes they're big enough)
    -
    -  design:
    -    construct qm_matrix by subtracting apex from points
    -    compute determinate
    -*/
    -realT qh_detsimplex(qhT *qh, pointT *apex, setT *points, int dim, boolT *nearzero) {
    -  pointT *coorda, *coordp, *gmcoord, *point, **pointp;
    -  coordT **rows;
    -  int k,  i=0;
    -  realT det;
    -
    -  zinc_(Zdetsimplex);
    -  gmcoord= qh->gm_matrix;
    -  rows= qh->gm_row;
    -  FOREACHpoint_(points) {
    -    if (i == dim)
    -      break;
    -    rows[i++]= gmcoord;
    -    coordp= point;
    -    coorda= apex;
    -    for (k=dim; k--; )
    -      *(gmcoord++)= *coordp++ - *coorda++;
    -  }
    -  if (i < dim) {
    -    qh_fprintf(qh, qh->ferr, 6007, "qhull internal error (qh_detsimplex): #points %d < dimension %d\n",
    -               i, dim);
    -    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -  }
    -  det= qh_determinant(qh, rows, dim, nearzero);
    -  trace2((qh, qh->ferr, 2002, "qh_detsimplex: det=%2.2g for point p%d, dim %d, nearzero? %d\n",
    -          det, qh_pointid(qh, apex), dim, *nearzero));
    -  return det;
    -} /* detsimplex */
    -
    -/*---------------------------------
    -
    -  qh_distnorm( dim, point, normal, offset )
    -    return distance from point to hyperplane at normal/offset
    -
    -  returns:
    -    dist
    -
    -  notes:
    -    dist > 0 if point is outside of hyperplane
    -
    -  see:
    -    qh_distplane in geom_r.c
    -*/
    -realT qh_distnorm(int dim, pointT *point, pointT *normal, realT *offsetp) {
    -  coordT *normalp= normal, *coordp= point;
    -  realT dist;
    -  int k;
    -
    -  dist= *offsetp;
    -  for (k=dim; k--; )
    -    dist += *(coordp++) * *(normalp++);
    -  return dist;
    -} /* distnorm */
    -
    -/*---------------------------------
    -
    -  qh_distround(qh, dimension, maxabs, maxsumabs )
    -    compute maximum round-off error for a distance computation
    -      to a normalized hyperplane
    -    maxabs is the maximum absolute value of a coordinate
    -    maxsumabs is the maximum possible sum of absolute coordinate values
    -
    -  returns:
    -    max dist round for REALepsilon
    -
    -  notes:
    -    calculate roundoff error according to Golub & van Loan, 1983, Lemma 3.2-1, "Rounding Errors"
    -    use sqrt(dim) since one vector is normalized
    -      or use maxsumabs since one vector is < 1
    -*/
    -realT qh_distround(qhT *qh, int dimension, realT maxabs, realT maxsumabs) {
    -  realT maxdistsum, maxround;
    -
    -  maxdistsum= sqrt((realT)dimension) * maxabs;
    -  minimize_( maxdistsum, maxsumabs);
    -  maxround= REALepsilon * (dimension * maxdistsum * 1.01 + maxabs);
    -              /* adds maxabs for offset */
    -  trace4((qh, qh->ferr, 4008, "qh_distround: %2.2g maxabs %2.2g maxsumabs %2.2g maxdistsum %2.2g\n",
    -                 maxround, maxabs, maxsumabs, maxdistsum));
    -  return maxround;
    -} /* distround */
    -
    -/*---------------------------------
    -
    -  qh_divzero( numer, denom, mindenom1, zerodiv )
    -    divide by a number that's nearly zero
    -    mindenom1= minimum denominator for dividing into 1.0
    -
    -  returns:
    -    quotient
    -    sets zerodiv and returns 0.0 if it would overflow
    -
    -  design:
    -    if numer is nearly zero and abs(numer) < abs(denom)
    -      return numer/denom
    -    else if numer is nearly zero
    -      return 0 and zerodiv
    -    else if denom/numer non-zero
    -      return numer/denom
    -    else
    -      return 0 and zerodiv
    -*/
    -realT qh_divzero(realT numer, realT denom, realT mindenom1, boolT *zerodiv) {
    -  realT temp, numerx, denomx;
    -
    -
    -  if (numer < mindenom1 && numer > -mindenom1) {
    -    numerx= fabs_(numer);
    -    denomx= fabs_(denom);
    -    if (numerx < denomx) {
    -      *zerodiv= False;
    -      return numer/denom;
    -    }else {
    -      *zerodiv= True;
    -      return 0.0;
    -    }
    -  }
    -  temp= denom/numer;
    -  if (temp > mindenom1 || temp < -mindenom1) {
    -    *zerodiv= False;
    -    return numer/denom;
    -  }else {
    -    *zerodiv= True;
    -    return 0.0;
    -  }
    -} /* divzero */
    -
    -
    -/*---------------------------------
    -
    -  qh_facetarea(qh, facet )
    -    return area for a facet
    -
    -  notes:
    -    if non-simplicial,
    -      uses centrum to triangulate facet and sums the projected areas.
    -    if (qh->DELAUNAY),
    -      computes projected area instead for last coordinate
    -    assumes facet->normal exists
    -    projecting tricoplanar facets to the hyperplane does not appear to make a difference
    -
    -  design:
    -    if simplicial
    -      compute area
    -    else
    -      for each ridge
    -        compute area from centrum to ridge
    -    negate area if upper Delaunay facet
    -*/
    -realT qh_facetarea(qhT *qh, facetT *facet) {
    -  vertexT *apex;
    -  pointT *centrum;
    -  realT area= 0.0;
    -  ridgeT *ridge, **ridgep;
    -
    -  if (facet->simplicial) {
    -    apex= SETfirstt_(facet->vertices, vertexT);
    -    area= qh_facetarea_simplex(qh, qh->hull_dim, apex->point, facet->vertices,
    -                    apex, facet->toporient, facet->normal, &facet->offset);
    -  }else {
    -    if (qh->CENTERtype == qh_AScentrum)
    -      centrum= facet->center;
    -    else
    -      centrum= qh_getcentrum(qh, facet);
    -    FOREACHridge_(facet->ridges)
    -      area += qh_facetarea_simplex(qh, qh->hull_dim, centrum, ridge->vertices,
    -                 NULL, (boolT)(ridge->top == facet),  facet->normal, &facet->offset);
    -    if (qh->CENTERtype != qh_AScentrum)
    -      qh_memfree(qh, centrum, qh->normal_size);
    -  }
    -  if (facet->upperdelaunay && qh->DELAUNAY)
    -    area= -area;  /* the normal should be [0,...,1] */
    -  trace4((qh, qh->ferr, 4009, "qh_facetarea: f%d area %2.2g\n", facet->id, area));
    -  return area;
    -} /* facetarea */
    -
    -/*---------------------------------
    -
    -  qh_facetarea_simplex(qh, dim, apex, vertices, notvertex, toporient, normal, offset )
    -    return area for a simplex defined by
    -      an apex, a base of vertices, an orientation, and a unit normal
    -    if simplicial or tricoplanar facet,
    -      notvertex is defined and it is skipped in vertices
    -
    -  returns:
    -    computes area of simplex projected to plane [normal,offset]
    -    returns 0 if vertex too far below plane (qh->WIDEfacet)
    -      vertex can't be apex of tricoplanar facet
    -
    -  notes:
    -    if (qh->DELAUNAY),
    -      computes projected area instead for last coordinate
    -    uses qh->gm_matrix/gm_row and qh->hull_dim
    -    helper function for qh_facetarea
    -
    -  design:
    -    if Notvertex
    -      translate simplex to apex
    -    else
    -      project simplex to normal/offset
    -      translate simplex to apex
    -    if Delaunay
    -      set last row/column to 0 with -1 on diagonal
    -    else
    -      set last row to Normal
    -    compute determinate
    -    scale and flip sign for area
    -*/
    -realT qh_facetarea_simplex(qhT *qh, int dim, coordT *apex, setT *vertices,
    -        vertexT *notvertex,  boolT toporient, coordT *normal, realT *offset) {
    -  pointT *coorda, *coordp, *gmcoord;
    -  coordT **rows, *normalp;
    -  int k,  i=0;
    -  realT area, dist;
    -  vertexT *vertex, **vertexp;
    -  boolT nearzero;
    -
    -  gmcoord= qh->gm_matrix;
    -  rows= qh->gm_row;
    -  FOREACHvertex_(vertices) {
    -    if (vertex == notvertex)
    -      continue;
    -    rows[i++]= gmcoord;
    -    coorda= apex;
    -    coordp= vertex->point;
    -    normalp= normal;
    -    if (notvertex) {
    -      for (k=dim; k--; )
    -        *(gmcoord++)= *coordp++ - *coorda++;
    -    }else {
    -      dist= *offset;
    -      for (k=dim; k--; )
    -        dist += *coordp++ * *normalp++;
    -      if (dist < -qh->WIDEfacet) {
    -        zinc_(Znoarea);
    -        return 0.0;
    -      }
    -      coordp= vertex->point;
    -      normalp= normal;
    -      for (k=dim; k--; )
    -        *(gmcoord++)= (*coordp++ - dist * *normalp++) - *coorda++;
    -    }
    -  }
    -  if (i != dim-1) {
    -    qh_fprintf(qh, qh->ferr, 6008, "qhull internal error (qh_facetarea_simplex): #points %d != dim %d -1\n",
    -               i, dim);
    -    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -  }
    -  rows[i]= gmcoord;
    -  if (qh->DELAUNAY) {
    -    for (i=0; i < dim-1; i++)
    -      rows[i][dim-1]= 0.0;
    -    for (k=dim; k--; )
    -      *(gmcoord++)= 0.0;
    -    rows[dim-1][dim-1]= -1.0;
    -  }else {
    -    normalp= normal;
    -    for (k=dim; k--; )
    -      *(gmcoord++)= *normalp++;
    -  }
    -  zinc_(Zdetsimplex);
    -  area= qh_determinant(qh, rows, dim, &nearzero);
    -  if (toporient)
    -    area= -area;
    -  area *= qh->AREAfactor;
    -  trace4((qh, qh->ferr, 4010, "qh_facetarea_simplex: area=%2.2g for point p%d, toporient %d, nearzero? %d\n",
    -          area, qh_pointid(qh, apex), toporient, nearzero));
    -  return area;
    -} /* facetarea_simplex */
    -
    -/*---------------------------------
    -
    -  qh_facetcenter(qh, vertices )
    -    return Voronoi center (Voronoi vertex) for a facet's vertices
    -
    -  returns:
    -    return temporary point equal to the center
    -
    -  see:
    -    qh_voronoi_center()
    -*/
    -pointT *qh_facetcenter(qhT *qh, setT *vertices) {
    -  setT *points= qh_settemp(qh, qh_setsize(qh, vertices));
    -  vertexT *vertex, **vertexp;
    -  pointT *center;
    -
    -  FOREACHvertex_(vertices)
    -    qh_setappend(qh, &points, vertex->point);
    -  center= qh_voronoi_center(qh, qh->hull_dim-1, points);
    -  qh_settempfree(qh, &points);
    -  return center;
    -} /* facetcenter */
    -
    -/*---------------------------------
    -
    -  qh_findgooddist(qh, point, facetA, dist, facetlist )
    -    find best good facet visible for point from facetA
    -    assumes facetA is visible from point
    -
    -  returns:
    -    best facet, i.e., good facet that is furthest from point
    -      distance to best facet
    -      NULL if none
    -
    -    moves good, visible facets (and some other visible facets)
    -      to end of qh->facet_list
    -
    -  notes:
    -    uses qh->visit_id
    -
    -  design:
    -    initialize bestfacet if facetA is good
    -    move facetA to end of facetlist
    -    for each facet on facetlist
    -      for each unvisited neighbor of facet
    -        move visible neighbors to end of facetlist
    -        update best good neighbor
    -        if no good neighbors, update best facet
    -*/
    -facetT *qh_findgooddist(qhT *qh, pointT *point, facetT *facetA, realT *distp,
    -               facetT **facetlist) {
    -  realT bestdist= -REALmax, dist;
    -  facetT *neighbor, **neighborp, *bestfacet=NULL, *facet;
    -  boolT goodseen= False;
    -
    -  if (facetA->good) {
    -    zzinc_(Zcheckpart);  /* calls from check_bestdist occur after print stats */
    -    qh_distplane(qh, point, facetA, &bestdist);
    -    bestfacet= facetA;
    -    goodseen= True;
    -  }
    -  qh_removefacet(qh, facetA);
    -  qh_appendfacet(qh, facetA);
    -  *facetlist= facetA;
    -  facetA->visitid= ++qh->visit_id;
    -  FORALLfacet_(*facetlist) {
    -    FOREACHneighbor_(facet) {
    -      if (neighbor->visitid == qh->visit_id)
    -        continue;
    -      neighbor->visitid= qh->visit_id;
    -      if (goodseen && !neighbor->good)
    -        continue;
    -      zzinc_(Zcheckpart);
    -      qh_distplane(qh, point, neighbor, &dist);
    -      if (dist > 0) {
    -        qh_removefacet(qh, neighbor);
    -        qh_appendfacet(qh, neighbor);
    -        if (neighbor->good) {
    -          goodseen= True;
    -          if (dist > bestdist) {
    -            bestdist= dist;
    -            bestfacet= neighbor;
    -          }
    -        }
    -      }
    -    }
    -  }
    -  if (bestfacet) {
    -    *distp= bestdist;
    -    trace2((qh, qh->ferr, 2003, "qh_findgooddist: p%d is %2.2g above good facet f%d\n",
    -      qh_pointid(qh, point), bestdist, bestfacet->id));
    -    return bestfacet;
    -  }
    -  trace4((qh, qh->ferr, 4011, "qh_findgooddist: no good facet for p%d above f%d\n",
    -      qh_pointid(qh, point), facetA->id));
    -  return NULL;
    -}  /* findgooddist */
    -
    -/*---------------------------------
    -
    -  qh_getarea(qh, facetlist )
    -    set area of all facets in facetlist
    -    collect statistics
    -    nop if hasAreaVolume
    -
    -  returns:
    -    sets qh->totarea/totvol to total area and volume of convex hull
    -    for Delaunay triangulation, computes projected area of the lower or upper hull
    -      ignores upper hull if qh->ATinfinity
    -
    -  notes:
    -    could compute outer volume by expanding facet area by rays from interior
    -    the following attempt at perpendicular projection underestimated badly:
    -      qh.totoutvol += (-dist + facet->maxoutside + qh->DISTround)
    -                            * area/ qh->hull_dim;
    -  design:
    -    for each facet on facetlist
    -      compute facet->area
    -      update qh.totarea and qh.totvol
    -*/
    -void qh_getarea(qhT *qh, facetT *facetlist) {
    -  realT area;
    -  realT dist;
    -  facetT *facet;
    -
    -  if (qh->hasAreaVolume)
    -    return;
    -  if (qh->REPORTfreq)
    -    qh_fprintf(qh, qh->ferr, 8020, "computing area of each facet and volume of the convex hull\n");
    -  else
    -    trace1((qh, qh->ferr, 1001, "qh_getarea: computing volume and area for each facet\n"));
    -  qh->totarea= qh->totvol= 0.0;
    -  FORALLfacet_(facetlist) {
    -    if (!facet->normal)
    -      continue;
    -    if (facet->upperdelaunay && qh->ATinfinity)
    -      continue;
    -    if (!facet->isarea) {
    -      facet->f.area= qh_facetarea(qh, facet);
    -      facet->isarea= True;
    -    }
    -    area= facet->f.area;
    -    if (qh->DELAUNAY) {
    -      if (facet->upperdelaunay == qh->UPPERdelaunay)
    -        qh->totarea += area;
    -    }else {
    -      qh->totarea += area;
    -      qh_distplane(qh, qh->interior_point, facet, &dist);
    -      qh->totvol += -dist * area/ qh->hull_dim;
    -    }
    -    if (qh->PRINTstatistics) {
    -      wadd_(Wareatot, area);
    -      wmax_(Wareamax, area);
    -      wmin_(Wareamin, area);
    -    }
    -  }
    -  qh->hasAreaVolume= True;
    -} /* getarea */
    -
    -/*---------------------------------
    -
    -  qh_gram_schmidt(qh, dim, row )
    -    implements Gram-Schmidt orthogonalization by rows
    -
    -  returns:
    -    false if zero norm
    -    overwrites rows[dim][dim]
    -
    -  notes:
    -    see Golub & van Loan, 1983, Algorithm 6.2-2, "Modified Gram-Schmidt"
    -    overflow due to small divisors not handled
    -
    -  design:
    -    for each row
    -      compute norm for row
    -      if non-zero, normalize row
    -      for each remaining rowA
    -        compute inner product of row and rowA
    -        reduce rowA by row * inner product
    -*/
    -boolT qh_gram_schmidt(qhT *qh, int dim, realT **row) {
    -  realT *rowi, *rowj, norm;
    -  int i, j, k;
    -
    -  for (i=0; i < dim; i++) {
    -    rowi= row[i];
    -    for (norm= 0.0, k= dim; k--; rowi++)
    -      norm += *rowi * *rowi;
    -    norm= sqrt(norm);
    -    wmin_(Wmindenom, norm);
    -    if (norm == 0.0)  /* either 0 or overflow due to sqrt */
    -      return False;
    -    for (k=dim; k--; )
    -      *(--rowi) /= norm;
    -    for (j=i+1; j < dim; j++) {
    -      rowj= row[j];
    -      for (norm= 0.0, k=dim; k--; )
    -        norm += *rowi++ * *rowj++;
    -      for (k=dim; k--; )
    -        *(--rowj) -= *(--rowi) * norm;
    -    }
    -  }
    -  return True;
    -} /* gram_schmidt */
    -
    -
    -/*---------------------------------
    -
    -  qh_inthresholds(qh, normal, angle )
    -    return True if normal within qh.lower_/upper_threshold
    -
    -  returns:
    -    estimate of angle by summing of threshold diffs
    -      angle may be NULL
    -      smaller "angle" is better
    -
    -  notes:
    -    invalid if qh.SPLITthresholds
    -
    -  see:
    -    qh.lower_threshold in qh_initbuild()
    -    qh_initthresholds()
    -
    -  design:
    -    for each dimension
    -      test threshold
    -*/
    -boolT qh_inthresholds(qhT *qh, coordT *normal, realT *angle) {
    -  boolT within= True;
    -  int k;
    -  realT threshold;
    -
    -  if (angle)
    -    *angle= 0.0;
    -  for (k=0; k < qh->hull_dim; k++) {
    -    threshold= qh->lower_threshold[k];
    -    if (threshold > -REALmax/2) {
    -      if (normal[k] < threshold)
    -        within= False;
    -      if (angle) {
    -        threshold -= normal[k];
    -        *angle += fabs_(threshold);
    -      }
    -    }
    -    if (qh->upper_threshold[k] < REALmax/2) {
    -      threshold= qh->upper_threshold[k];
    -      if (normal[k] > threshold)
    -        within= False;
    -      if (angle) {
    -        threshold -= normal[k];
    -        *angle += fabs_(threshold);
    -      }
    -    }
    -  }
    -  return within;
    -} /* inthresholds */
    -
    -
    -/*---------------------------------
    -
    -  qh_joggleinput(qh)
    -    randomly joggle input to Qhull by qh.JOGGLEmax
    -    initial input is qh.first_point/qh.num_points of qh.hull_dim
    -      repeated calls use qh.input_points/qh.num_points
    -
    -  returns:
    -    joggles points at qh.first_point/qh.num_points
    -    copies data to qh.input_points/qh.input_malloc if first time
    -    determines qh.JOGGLEmax if it was zero
    -    if qh.DELAUNAY
    -      computes the Delaunay projection of the joggled points
    -
    -  notes:
    -    if qh.DELAUNAY, unnecessarily joggles the last coordinate
    -    the initial 'QJn' may be set larger than qh_JOGGLEmaxincrease
    -
    -  design:
    -    if qh.DELAUNAY
    -      set qh.SCALElast for reduced precision errors
    -    if first call
    -      initialize qh.input_points to the original input points
    -      if qh.JOGGLEmax == 0
    -        determine default qh.JOGGLEmax
    -    else
    -      increase qh.JOGGLEmax according to qh.build_cnt
    -    joggle the input by adding a random number in [-qh.JOGGLEmax,qh.JOGGLEmax]
    -    if qh.DELAUNAY
    -      sets the Delaunay projection
    -*/
    -void qh_joggleinput(qhT *qh) {
    -  int i, seed, size;
    -  coordT *coordp, *inputp;
    -  realT randr, randa, randb;
    -
    -  if (!qh->input_points) { /* first call */
    -    qh->input_points= qh->first_point;
    -    qh->input_malloc= qh->POINTSmalloc;
    -    size= qh->num_points * qh->hull_dim * sizeof(coordT);
    -    if (!(qh->first_point=(coordT*)qh_malloc((size_t)size))) {
    -      qh_fprintf(qh, qh->ferr, 6009, "qhull error: insufficient memory to joggle %d points\n",
    -          qh->num_points);
    -      qh_errexit(qh, qh_ERRmem, NULL, NULL);
    -    }
    -    qh->POINTSmalloc= True;
    -    if (qh->JOGGLEmax == 0.0) {
    -      qh->JOGGLEmax= qh_detjoggle(qh, qh->input_points, qh->num_points, qh->hull_dim);
    -      qh_option(qh, "QJoggle", NULL, &qh->JOGGLEmax);
    -    }
    -  }else {                 /* repeated call */
    -    if (!qh->RERUN && qh->build_cnt > qh_JOGGLEretry) {
    -      if (((qh->build_cnt-qh_JOGGLEretry-1) % qh_JOGGLEagain) == 0) {
    -        realT maxjoggle= qh->MAXwidth * qh_JOGGLEmaxincrease;
    -        if (qh->JOGGLEmax < maxjoggle) {
    -          qh->JOGGLEmax *= qh_JOGGLEincrease;
    -          minimize_(qh->JOGGLEmax, maxjoggle);
    -        }
    -      }
    -    }
    -    qh_option(qh, "QJoggle", NULL, &qh->JOGGLEmax);
    -  }
    -  if (qh->build_cnt > 1 && qh->JOGGLEmax > fmax_(qh->MAXwidth/4, 0.1)) {
    -      qh_fprintf(qh, qh->ferr, 6010, "qhull error: the current joggle for 'QJn', %.2g, is too large for the width\nof the input.  If possible, recompile Qhull with higher-precision reals.\n",
    -                qh->JOGGLEmax);
    -      qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -  }
    -  /* for some reason, using qh->ROTATErandom and qh_RANDOMseed does not repeat the run. Use 'TRn' instead */
    -  seed= qh_RANDOMint;
    -  qh_option(qh, "_joggle-seed", &seed, NULL);
    -  trace0((qh, qh->ferr, 6, "qh_joggleinput: joggle input by %2.2g with seed %d\n",
    -    qh->JOGGLEmax, seed));
    -  inputp= qh->input_points;
    -  coordp= qh->first_point;
    -  randa= 2.0 * qh->JOGGLEmax/qh_RANDOMmax;
    -  randb= -qh->JOGGLEmax;
    -  size= qh->num_points * qh->hull_dim;
    -  for (i=size; i--; ) {
    -    randr= qh_RANDOMint;
    -    *(coordp++)= *(inputp++) + (randr * randa + randb);
    -  }
    -  if (qh->DELAUNAY) {
    -    qh->last_low= qh->last_high= qh->last_newhigh= REALmax;
    -    qh_setdelaunay(qh, qh->hull_dim, qh->num_points, qh->first_point);
    -  }
    -} /* joggleinput */
    -
    -/*---------------------------------
    -
    -  qh_maxabsval( normal, dim )
    -    return pointer to maximum absolute value of a dim vector
    -    returns NULL if dim=0
    -*/
    -realT *qh_maxabsval(realT *normal, int dim) {
    -  realT maxval= -REALmax;
    -  realT *maxp= NULL, *colp, absval;
    -  int k;
    -
    -  for (k=dim, colp= normal; k--; colp++) {
    -    absval= fabs_(*colp);
    -    if (absval > maxval) {
    -      maxval= absval;
    -      maxp= colp;
    -    }
    -  }
    -  return maxp;
    -} /* maxabsval */
    -
    -
    -/*---------------------------------
    -
    -  qh_maxmin(qh, points, numpoints, dimension )
    -    return max/min points for each dimension
    -    determine max and min coordinates
    -
    -  returns:
    -    returns a temporary set of max and min points
    -      may include duplicate points. Does not include qh.GOODpoint
    -    sets qh.NEARzero, qh.MAXabs_coord, qh.MAXsumcoord, qh.MAXwidth
    -         qh.MAXlastcoord, qh.MINlastcoord
    -    initializes qh.max_outside, qh.min_vertex, qh.WAScoplanar, qh.ZEROall_ok
    -
    -  notes:
    -    loop duplicated in qh_detjoggle()
    -
    -  design:
    -    initialize global precision variables
    -    checks definition of REAL...
    -    for each dimension
    -      for each point
    -        collect maximum and minimum point
    -      collect maximum of maximums and minimum of minimums
    -      determine qh.NEARzero for Gaussian Elimination
    -*/
    -setT *qh_maxmin(qhT *qh, pointT *points, int numpoints, int dimension) {
    -  int k;
    -  realT maxcoord, temp;
    -  pointT *minimum, *maximum, *point, *pointtemp;
    -  setT *set;
    -
    -  qh->max_outside= 0.0;
    -  qh->MAXabs_coord= 0.0;
    -  qh->MAXwidth= -REALmax;
    -  qh->MAXsumcoord= 0.0;
    -  qh->min_vertex= 0.0;
    -  qh->WAScoplanar= False;
    -  if (qh->ZEROcentrum)
    -    qh->ZEROall_ok= True;
    -  if (REALmin < REALepsilon && REALmin < REALmax && REALmin > -REALmax
    -  && REALmax > 0.0 && -REALmax < 0.0)
    -    ; /* all ok */
    -  else {
    -    qh_fprintf(qh, qh->ferr, 6011, "qhull error: floating point constants in user.h are wrong\n\
    -REALepsilon %g REALmin %g REALmax %g -REALmax %g\n",
    -             REALepsilon, REALmin, REALmax, -REALmax);
    -    qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -  }
    -  set= qh_settemp(qh, 2*dimension);
    -  for (k=0; k < dimension; k++) {
    -    if (points == qh->GOODpointp)
    -      minimum= maximum= points + dimension;
    -    else
    -      minimum= maximum= points;
    -    FORALLpoint_(qh, points, numpoints) {
    -      if (point == qh->GOODpointp)
    -        continue;
    -      if (maximum[k] < point[k])
    -        maximum= point;
    -      else if (minimum[k] > point[k])
    -        minimum= point;
    -    }
    -    if (k == dimension-1) {
    -      qh->MINlastcoord= minimum[k];
    -      qh->MAXlastcoord= maximum[k];
    -    }
    -    if (qh->SCALElast && k == dimension-1)
    -      maxcoord= qh->MAXwidth;
    -    else {
    -      maxcoord= fmax_(maximum[k], -minimum[k]);
    -      if (qh->GOODpointp) {
    -        temp= fmax_(qh->GOODpointp[k], -qh->GOODpointp[k]);
    -        maximize_(maxcoord, temp);
    -      }
    -      temp= maximum[k] - minimum[k];
    -      maximize_(qh->MAXwidth, temp);
    -    }
    -    maximize_(qh->MAXabs_coord, maxcoord);
    -    qh->MAXsumcoord += maxcoord;
    -    qh_setappend(qh, &set, maximum);
    -    qh_setappend(qh, &set, minimum);
    -    /* calculation of qh NEARzero is based on Golub & van Loan, 1983,
    -       Eq. 4.4-13 for "Gaussian elimination with complete pivoting".
    -       Golub & van Loan say that n^3 can be ignored and 10 be used in
    -       place of rho */
    -    qh->NEARzero[k]= 80 * qh->MAXsumcoord * REALepsilon;
    -  }
    -  if (qh->IStracing >=1)
    -    qh_printpoints(qh, qh->ferr, "qh_maxmin: found the max and min points(by dim):", set);
    -  return(set);
    -} /* maxmin */
    -
    -/*---------------------------------
    -
    -  qh_maxouter(qh)
    -    return maximum distance from facet to outer plane
    -    normally this is qh.max_outside+qh.DISTround
    -    does not include qh.JOGGLEmax
    -
    -  see:
    -    qh_outerinner()
    -
    -  notes:
    -    need to add another qh.DISTround if testing actual point with computation
    -
    -  for joggle:
    -    qh_setfacetplane() updated qh.max_outer for Wnewvertexmax (max distance to vertex)
    -    need to use Wnewvertexmax since could have a coplanar point for a high
    -      facet that is replaced by a low facet
    -    need to add qh.JOGGLEmax if testing input points
    -*/
    -realT qh_maxouter(qhT *qh) {
    -  realT dist;
    -
    -  dist= fmax_(qh->max_outside, qh->DISTround);
    -  dist += qh->DISTround;
    -  trace4((qh, qh->ferr, 4012, "qh_maxouter: max distance from facet to outer plane is %2.2g max_outside is %2.2g\n", dist, qh->max_outside));
    -  return dist;
    -} /* maxouter */
    -
    -/*---------------------------------
    -
    -  qh_maxsimplex(qh, dim, maxpoints, points, numpoints, simplex )
    -    determines maximum simplex for a set of points
    -    starts from points already in simplex
    -    skips qh.GOODpointp (assumes that it isn't in maxpoints)
    -
    -  returns:
    -    simplex with dim+1 points
    -
    -  notes:
    -    assumes at least pointsneeded points in points
    -    maximizes determinate for x,y,z,w, etc.
    -    uses maxpoints as long as determinate is clearly non-zero
    -
    -  design:
    -    initialize simplex with at least two points
    -      (find points with max or min x coordinate)
    -    for each remaining dimension
    -      add point that maximizes the determinate
    -        (use points from maxpoints first)
    -*/
    -void qh_maxsimplex(qhT *qh, int dim, setT *maxpoints, pointT *points, int numpoints, setT **simplex) {
    -  pointT *point, **pointp, *pointtemp, *maxpoint, *minx=NULL, *maxx=NULL;
    -  boolT nearzero, maxnearzero= False;
    -  int k, sizinit;
    -  realT maxdet= -REALmax, det, mincoord= REALmax, maxcoord= -REALmax;
    -
    -  sizinit= qh_setsize(qh, *simplex);
    -  if (sizinit < 2) {
    -    if (qh_setsize(qh, maxpoints) >= 2) {
    -      FOREACHpoint_(maxpoints) {
    -        if (maxcoord < point[0]) {
    -          maxcoord= point[0];
    -          maxx= point;
    -        }
    -        if (mincoord > point[0]) {
    -          mincoord= point[0];
    -          minx= point;
    -        }
    -      }
    -    }else {
    -      FORALLpoint_(qh, points, numpoints) {
    -        if (point == qh->GOODpointp)
    -          continue;
    -        if (maxcoord < point[0]) {
    -          maxcoord= point[0];
    -          maxx= point;
    -        }
    -        if (mincoord > point[0]) {
    -          mincoord= point[0];
    -          minx= point;
    -        }
    -      }
    -    }
    -    qh_setunique(qh, simplex, minx);
    -    if (qh_setsize(qh, *simplex) < 2)
    -      qh_setunique(qh, simplex, maxx);
    -    sizinit= qh_setsize(qh, *simplex);
    -    if (sizinit < 2) {
    -      qh_precision(qh, "input has same x coordinate");
    -      if (zzval_(Zsetplane) > qh->hull_dim+1) {
    -        qh_fprintf(qh, qh->ferr, 6012, "qhull precision error (qh_maxsimplex for voronoi_center):\n%d points with the same x coordinate.\n",
    -                 qh_setsize(qh, maxpoints)+numpoints);
    -        qh_errexit(qh, qh_ERRprec, NULL, NULL);
    -      }else {
    -        qh_fprintf(qh, qh->ferr, 6013, "qhull input error: input is less than %d-dimensional since it has the same x coordinate\n", qh->hull_dim);
    -        qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -      }
    -    }
    -  }
    -  for (k=sizinit; k < dim+1; k++) {
    -    maxpoint= NULL;
    -    maxdet= -REALmax;
    -    FOREACHpoint_(maxpoints) {
    -      if (!qh_setin(*simplex, point)) {
    -        det= qh_detsimplex(qh, point, *simplex, k, &nearzero);
    -        if ((det= fabs_(det)) > maxdet) {
    -          maxdet= det;
    -          maxpoint= point;
    -          maxnearzero= nearzero;
    -        }
    -      }
    -    }
    -    if (!maxpoint || maxnearzero) {
    -      zinc_(Zsearchpoints);
    -      if (!maxpoint) {
    -        trace0((qh, qh->ferr, 7, "qh_maxsimplex: searching all points for %d-th initial vertex.\n", k+1));
    -      }else {
    -        trace0((qh, qh->ferr, 8, "qh_maxsimplex: searching all points for %d-th initial vertex, better than p%d det %2.2g\n",
    -                k+1, qh_pointid(qh, maxpoint), maxdet));
    -      }
    -      FORALLpoint_(qh, points, numpoints) {
    -        if (point == qh->GOODpointp)
    -          continue;
    -        if (!qh_setin(*simplex, point)) {
    -          det= qh_detsimplex(qh, point, *simplex, k, &nearzero);
    -          if ((det= fabs_(det)) > maxdet) {
    -            maxdet= det;
    -            maxpoint= point;
    -            maxnearzero= nearzero;
    -          }
    -        }
    -      }
    -    } /* !maxpoint */
    -    if (!maxpoint) {
    -      qh_fprintf(qh, qh->ferr, 6014, "qhull internal error (qh_maxsimplex): not enough points available\n");
    -      qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -    }
    -    qh_setappend(qh, simplex, maxpoint);
    -    trace1((qh, qh->ferr, 1002, "qh_maxsimplex: selected point p%d for %d`th initial vertex, det=%2.2g\n",
    -            qh_pointid(qh, maxpoint), k+1, maxdet));
    -  } /* k */
    -} /* maxsimplex */
    -
    -/*---------------------------------
    -
    -  qh_minabsval( normal, dim )
    -    return minimum absolute value of a dim vector
    -*/
    -realT qh_minabsval(realT *normal, int dim) {
    -  realT minval= 0;
    -  realT maxval= 0;
    -  realT *colp;
    -  int k;
    -
    -  for (k=dim, colp=normal; k--; colp++) {
    -    maximize_(maxval, *colp);
    -    minimize_(minval, *colp);
    -  }
    -  return fmax_(maxval, -minval);
    -} /* minabsval */
    -
    -
    -/*---------------------------------
    -
    -  qh_mindif(qh, vecA, vecB, dim )
    -    return index of min abs. difference of two vectors
    -*/
    -int qh_mindiff(realT *vecA, realT *vecB, int dim) {
    -  realT mindiff= REALmax, diff;
    -  realT *vecAp= vecA, *vecBp= vecB;
    -  int k, mink= 0;
    -
    -  for (k=0; k < dim; k++) {
    -    diff= *vecAp++ - *vecBp++;
    -    diff= fabs_(diff);
    -    if (diff < mindiff) {
    -      mindiff= diff;
    -      mink= k;
    -    }
    -  }
    -  return mink;
    -} /* mindiff */
    -
    -
    -
    -/*---------------------------------
    -
    -  qh_orientoutside(qh, facet  )
    -    make facet outside oriented via qh.interior_point
    -
    -  returns:
    -    True if facet reversed orientation.
    -*/
    -boolT qh_orientoutside(qhT *qh, facetT *facet) {
    -  int k;
    -  realT dist;
    -
    -  qh_distplane(qh, qh->interior_point, facet, &dist);
    -  if (dist > 0) {
    -    for (k=qh->hull_dim; k--; )
    -      facet->normal[k]= -facet->normal[k];
    -    facet->offset= -facet->offset;
    -    return True;
    -  }
    -  return False;
    -} /* orientoutside */
    -
    -/*---------------------------------
    -
    -  qh_outerinner(qh, facet, outerplane, innerplane  )
    -    if facet and qh.maxoutdone (i.e., qh_check_maxout)
    -      returns outer and inner plane for facet
    -    else
    -      returns maximum outer and inner plane
    -    accounts for qh.JOGGLEmax
    -
    -  see:
    -    qh_maxouter(qh), qh_check_bestdist(), qh_check_points()
    -
    -  notes:
    -    outerplaner or innerplane may be NULL
    -    facet is const
    -    Does not error (QhullFacet)
    -
    -    includes qh.DISTround for actual points
    -    adds another qh.DISTround if testing with floating point arithmetic
    -*/
    -void qh_outerinner(qhT *qh, facetT *facet, realT *outerplane, realT *innerplane) {
    -  realT dist, mindist;
    -  vertexT *vertex, **vertexp;
    -
    -  if (outerplane) {
    -    if (!qh_MAXoutside || !facet || !qh->maxoutdone) {
    -      *outerplane= qh_maxouter(qh);       /* includes qh.DISTround */
    -    }else { /* qh_MAXoutside ... */
    -#if qh_MAXoutside
    -      *outerplane= facet->maxoutside + qh->DISTround;
    -#endif
    -
    -    }
    -    if (qh->JOGGLEmax < REALmax/2)
    -      *outerplane += qh->JOGGLEmax * sqrt((realT)qh->hull_dim);
    -  }
    -  if (innerplane) {
    -    if (facet) {
    -      mindist= REALmax;
    -      FOREACHvertex_(facet->vertices) {
    -        zinc_(Zdistio);
    -        qh_distplane(qh, vertex->point, facet, &dist);
    -        minimize_(mindist, dist);
    -      }
    -      *innerplane= mindist - qh->DISTround;
    -    }else
    -      *innerplane= qh->min_vertex - qh->DISTround;
    -    if (qh->JOGGLEmax < REALmax/2)
    -      *innerplane -= qh->JOGGLEmax * sqrt((realT)qh->hull_dim);
    -  }
    -} /* outerinner */
    -
    -/*---------------------------------
    -
    -  qh_pointdist( point1, point2, dim )
    -    return distance between two points
    -
    -  notes:
    -    returns distance squared if 'dim' is negative
    -*/
    -coordT qh_pointdist(pointT *point1, pointT *point2, int dim) {
    -  coordT dist, diff;
    -  int k;
    -
    -  dist= 0.0;
    -  for (k= (dim > 0 ? dim : -dim); k--; ) {
    -    diff= *point1++ - *point2++;
    -    dist += diff * diff;
    -  }
    -  if (dim > 0)
    -    return(sqrt(dist));
    -  return dist;
    -} /* pointdist */
    -
    -
    -/*---------------------------------
    -
    -  qh_printmatrix(qh, fp, string, rows, numrow, numcol )
    -    print matrix to fp given by row vectors
    -    print string as header
    -    qh may be NULL if fp is defined
    -
    -  notes:
    -    print a vector by qh_printmatrix(qh, fp, "", &vect, 1, len)
    -*/
    -void qh_printmatrix(qhT *qh, FILE *fp, const char *string, realT **rows, int numrow, int numcol) {
    -  realT *rowp;
    -  realT r; /*bug fix*/
    -  int i,k;
    -
    -  qh_fprintf(qh, fp, 9001, "%s\n", string);
    -  for (i=0; i < numrow; i++) {
    -    rowp= rows[i];
    -    for (k=0; k < numcol; k++) {
    -      r= *rowp++;
    -      qh_fprintf(qh, fp, 9002, "%6.3g ", r);
    -    }
    -    qh_fprintf(qh, fp, 9003, "\n");
    -  }
    -} /* printmatrix */
    -
    -
    -/*---------------------------------
    -
    -  qh_printpoints(qh, fp, string, points )
    -    print pointids to fp for a set of points
    -    if string, prints string and 'p' point ids
    -*/
    -void qh_printpoints(qhT *qh, FILE *fp, const char *string, setT *points) {
    -  pointT *point, **pointp;
    -
    -  if (string) {
    -    qh_fprintf(qh, fp, 9004, "%s", string);
    -    FOREACHpoint_(points)
    -      qh_fprintf(qh, fp, 9005, " p%d", qh_pointid(qh, point));
    -    qh_fprintf(qh, fp, 9006, "\n");
    -  }else {
    -    FOREACHpoint_(points)
    -      qh_fprintf(qh, fp, 9007, " %d", qh_pointid(qh, point));
    -    qh_fprintf(qh, fp, 9008, "\n");
    -  }
    -} /* printpoints */
    -
    -
    -/*---------------------------------
    -
    -  qh_projectinput(qh)
    -    project input points using qh.lower_bound/upper_bound and qh->DELAUNAY
    -    if qh.lower_bound[k]=qh.upper_bound[k]= 0,
    -      removes dimension k
    -    if halfspace intersection
    -      removes dimension k from qh.feasible_point
    -    input points in qh->first_point, num_points, input_dim
    -
    -  returns:
    -    new point array in qh->first_point of qh->hull_dim coordinates
    -    sets qh->POINTSmalloc
    -    if qh->DELAUNAY
    -      projects points to paraboloid
    -      lowbound/highbound is also projected
    -    if qh->ATinfinity
    -      adds point "at-infinity"
    -    if qh->POINTSmalloc
    -      frees old point array
    -
    -  notes:
    -    checks that qh.hull_dim agrees with qh.input_dim, PROJECTinput, and DELAUNAY
    -
    -
    -  design:
    -    sets project[k] to -1 (delete), 0 (keep), 1 (add for Delaunay)
    -    determines newdim and newnum for qh->hull_dim and qh->num_points
    -    projects points to newpoints
    -    projects qh.lower_bound to itself
    -    projects qh.upper_bound to itself
    -    if qh->DELAUNAY
    -      if qh->ATINFINITY
    -        projects points to paraboloid
    -        computes "infinity" point as vertex average and 10% above all points
    -      else
    -        uses qh_setdelaunay to project points to paraboloid
    -*/
    -void qh_projectinput(qhT *qh) {
    -  int k,i;
    -  int newdim= qh->input_dim, newnum= qh->num_points;
    -  signed char *project;
    -  int projectsize= (qh->input_dim+1)*sizeof(*project);
    -  pointT *newpoints, *coord, *infinity;
    -  realT paraboloid, maxboloid= 0;
    -
    -  project= (signed char*)qh_memalloc(qh, projectsize);
    -  memset((char*)project, 0, (size_t)projectsize);
    -  for (k=0; k < qh->input_dim; k++) {   /* skip Delaunay bound */
    -    if (qh->lower_bound[k] == 0 && qh->upper_bound[k] == 0) {
    -      project[k]= -1;
    -      newdim--;
    -    }
    -  }
    -  if (qh->DELAUNAY) {
    -    project[k]= 1;
    -    newdim++;
    -    if (qh->ATinfinity)
    -      newnum++;
    -  }
    -  if (newdim != qh->hull_dim) {
    -    qh_memfree(qh, project, projectsize);
    -    qh_fprintf(qh, qh->ferr, 6015, "qhull internal error (qh_projectinput): dimension after projection %d != hull_dim %d\n", newdim, qh->hull_dim);
    -    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -  }
    -  if (!(newpoints= qh->temp_malloc= (coordT*)qh_malloc(newnum*newdim*sizeof(coordT)))){
    -    qh_memfree(qh, project, projectsize);
    -    qh_fprintf(qh, qh->ferr, 6016, "qhull error: insufficient memory to project %d points\n",
    -           qh->num_points);
    -    qh_errexit(qh, qh_ERRmem, NULL, NULL);
    -  }
    -  /* qh_projectpoints throws error if mismatched dimensions */
    -  qh_projectpoints(qh, project, qh->input_dim+1, qh->first_point,
    -                    qh->num_points, qh->input_dim, newpoints, newdim);
    -  trace1((qh, qh->ferr, 1003, "qh_projectinput: updating lower and upper_bound\n"));
    -  qh_projectpoints(qh, project, qh->input_dim+1, qh->lower_bound,
    -                    1, qh->input_dim+1, qh->lower_bound, newdim+1);
    -  qh_projectpoints(qh, project, qh->input_dim+1, qh->upper_bound,
    -                    1, qh->input_dim+1, qh->upper_bound, newdim+1);
    -  if (qh->HALFspace) {
    -    if (!qh->feasible_point) {
    -      qh_memfree(qh, project, projectsize);
    -      qh_fprintf(qh, qh->ferr, 6017, "qhull internal error (qh_projectinput): HALFspace defined without qh.feasible_point\n");
    -      qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -    }
    -    qh_projectpoints(qh, project, qh->input_dim, qh->feasible_point,
    -                      1, qh->input_dim, qh->feasible_point, newdim);
    -  }
    -  qh_memfree(qh, project, projectsize);
    -  if (qh->POINTSmalloc)
    -    qh_free(qh->first_point);
    -  qh->first_point= newpoints;
    -  qh->POINTSmalloc= True;
    -  qh->temp_malloc= NULL;
    -  if (qh->DELAUNAY && qh->ATinfinity) {
    -    coord= qh->first_point;
    -    infinity= qh->first_point + qh->hull_dim * qh->num_points;
    -    for (k=qh->hull_dim-1; k--; )
    -      infinity[k]= 0.0;
    -    for (i=qh->num_points; i--; ) {
    -      paraboloid= 0.0;
    -      for (k=0; k < qh->hull_dim-1; k++) {
    -        paraboloid += *coord * *coord;
    -        infinity[k] += *coord;
    -        coord++;
    -      }
    -      *(coord++)= paraboloid;
    -      maximize_(maxboloid, paraboloid);
    -    }
    -    /* coord == infinity */
    -    for (k=qh->hull_dim-1; k--; )
    -      *(coord++) /= qh->num_points;
    -    *(coord++)= maxboloid * 1.1;
    -    qh->num_points++;
    -    trace0((qh, qh->ferr, 9, "qh_projectinput: projected points to paraboloid for Delaunay\n"));
    -  }else if (qh->DELAUNAY)  /* !qh->ATinfinity */
    -    qh_setdelaunay(qh, qh->hull_dim, qh->num_points, qh->first_point);
    -} /* projectinput */
    -
    -
    -/*---------------------------------
    -
    -  qh_projectpoints(qh, project, n, points, numpoints, dim, newpoints, newdim )
    -    project points/numpoints/dim to newpoints/newdim
    -    if project[k] == -1
    -      delete dimension k
    -    if project[k] == 1
    -      add dimension k by duplicating previous column
    -    n is size of project
    -
    -  notes:
    -    newpoints may be points if only adding dimension at end
    -
    -  design:
    -    check that 'project' and 'newdim' agree
    -    for each dimension
    -      if project == -1
    -        skip dimension
    -      else
    -        determine start of column in newpoints
    -        determine start of column in points
    -          if project == +1, duplicate previous column
    -        copy dimension (column) from points to newpoints
    -*/
    -void qh_projectpoints(qhT *qh, signed char *project, int n, realT *points,
    -        int numpoints, int dim, realT *newpoints, int newdim) {
    -  int testdim= dim, oldk=0, newk=0, i,j=0,k;
    -  realT *newp, *oldp;
    -
    -  for (k=0; k < n; k++)
    -    testdim += project[k];
    -  if (testdim != newdim) {
    -    qh_fprintf(qh, qh->ferr, 6018, "qhull internal error (qh_projectpoints): newdim %d should be %d after projection\n",
    -      newdim, testdim);
    -    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -  }
    -  for (j=0; j= dim)
    -          continue;
    -        oldp= points+oldk;
    -      }else
    -        oldp= points+oldk++;
    -      for (i=numpoints; i--; ) {
    -        *newp= *oldp;
    -        newp += newdim;
    -        oldp += dim;
    -      }
    -    }
    -    if (oldk >= dim)
    -      break;
    -  }
    -  trace1((qh, qh->ferr, 1004, "qh_projectpoints: projected %d points from dim %d to dim %d\n",
    -    numpoints, dim, newdim));
    -} /* projectpoints */
    -
    -
    -/*---------------------------------
    -
    -  qh_rotateinput(qh, rows )
    -    rotate input using row matrix
    -    input points given by qh->first_point, num_points, hull_dim
    -    assumes rows[dim] is a scratch buffer
    -    if qh->POINTSmalloc, overwrites input points, else mallocs a new array
    -
    -  returns:
    -    rotated input
    -    sets qh->POINTSmalloc
    -
    -  design:
    -    see qh_rotatepoints
    -*/
    -void qh_rotateinput(qhT *qh, realT **rows) {
    -
    -  if (!qh->POINTSmalloc) {
    -    qh->first_point= qh_copypoints(qh, qh->first_point, qh->num_points, qh->hull_dim);
    -    qh->POINTSmalloc= True;
    -  }
    -  qh_rotatepoints(qh, qh->first_point, qh->num_points, qh->hull_dim, rows);
    -}  /* rotateinput */
    -
    -/*---------------------------------
    -
    -  qh_rotatepoints(qh, points, numpoints, dim, row )
    -    rotate numpoints points by a d-dim row matrix
    -    assumes rows[dim] is a scratch buffer
    -
    -  returns:
    -    rotated points in place
    -
    -  design:
    -    for each point
    -      for each coordinate
    -        use row[dim] to compute partial inner product
    -      for each coordinate
    -        rotate by partial inner product
    -*/
    -void qh_rotatepoints(qhT *qh, realT *points, int numpoints, int dim, realT **row) {
    -  realT *point, *rowi, *coord= NULL, sum, *newval;
    -  int i,j,k;
    -
    -  if (qh->IStracing >= 1)
    -    qh_printmatrix(qh, qh->ferr, "qh_rotatepoints: rotate points by", row, dim, dim);
    -  for (point= points, j= numpoints; j--; point += dim) {
    -    newval= row[dim];
    -    for (i=0; i < dim; i++) {
    -      rowi= row[i];
    -      coord= point;
    -      for (sum= 0.0, k= dim; k--; )
    -        sum += *rowi++ * *coord++;
    -      *(newval++)= sum;
    -    }
    -    for (k=dim; k--; )
    -      *(--coord)= *(--newval);
    -  }
    -} /* rotatepoints */
    -
    -
    -/*---------------------------------
    -
    -  qh_scaleinput(qh)
    -    scale input points using qh->low_bound/high_bound
    -    input points given by qh->first_point, num_points, hull_dim
    -    if qh->POINTSmalloc, overwrites input points, else mallocs a new array
    -
    -  returns:
    -    scales coordinates of points to low_bound[k], high_bound[k]
    -    sets qh->POINTSmalloc
    -
    -  design:
    -    see qh_scalepoints
    -*/
    -void qh_scaleinput(qhT *qh) {
    -
    -  if (!qh->POINTSmalloc) {
    -    qh->first_point= qh_copypoints(qh, qh->first_point, qh->num_points, qh->hull_dim);
    -    qh->POINTSmalloc= True;
    -  }
    -  qh_scalepoints(qh, qh->first_point, qh->num_points, qh->hull_dim,
    -       qh->lower_bound, qh->upper_bound);
    -}  /* scaleinput */
    -
    -/*---------------------------------
    -
    -  qh_scalelast(qh, points, numpoints, dim, low, high, newhigh )
    -    scale last coordinate to [0,m] for Delaunay triangulations
    -    input points given by points, numpoints, dim
    -
    -  returns:
    -    changes scale of last coordinate from [low, high] to [0, newhigh]
    -    overwrites last coordinate of each point
    -    saves low/high/newhigh in qh.last_low, etc. for qh_setdelaunay()
    -
    -  notes:
    -    when called by qh_setdelaunay, low/high may not match actual data
    -
    -  design:
    -    compute scale and shift factors
    -    apply to last coordinate of each point
    -*/
    -void qh_scalelast(qhT *qh, coordT *points, int numpoints, int dim, coordT low,
    -                   coordT high, coordT newhigh) {
    -  realT scale, shift;
    -  coordT *coord;
    -  int i;
    -  boolT nearzero= False;
    -
    -  trace4((qh, qh->ferr, 4013, "qh_scalelast: scale last coordinate from [%2.2g, %2.2g] to [0,%2.2g]\n",
    -    low, high, newhigh));
    -  qh->last_low= low;
    -  qh->last_high= high;
    -  qh->last_newhigh= newhigh;
    -  scale= qh_divzero(newhigh, high - low,
    -                  qh->MINdenom_1, &nearzero);
    -  if (nearzero) {
    -    if (qh->DELAUNAY)
    -      qh_fprintf(qh, qh->ferr, 6019, "qhull input error: can not scale last coordinate.  Input is cocircular\n   or cospherical.   Use option 'Qz' to add a point at infinity.\n");
    -    else
    -      qh_fprintf(qh, qh->ferr, 6020, "qhull input error: can not scale last coordinate.  New bounds [0, %2.2g] are too wide for\nexisting bounds [%2.2g, %2.2g] (width %2.2g)\n",
    -                newhigh, low, high, high-low);
    -    qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -  }
    -  shift= - low * newhigh / (high-low);
    -  coord= points + dim - 1;
    -  for (i=numpoints; i--; coord += dim)
    -    *coord= *coord * scale + shift;
    -} /* scalelast */
    -
    -/*---------------------------------
    -
    -  qh_scalepoints(qh, points, numpoints, dim, newlows, newhighs )
    -    scale points to new lowbound and highbound
    -    retains old bound when newlow= -REALmax or newhigh= +REALmax
    -
    -  returns:
    -    scaled points
    -    overwrites old points
    -
    -  design:
    -    for each coordinate
    -      compute current low and high bound
    -      compute scale and shift factors
    -      scale all points
    -      enforce new low and high bound for all points
    -*/
    -void qh_scalepoints(qhT *qh, pointT *points, int numpoints, int dim,
    -        realT *newlows, realT *newhighs) {
    -  int i,k;
    -  realT shift, scale, *coord, low, high, newlow, newhigh, mincoord, maxcoord;
    -  boolT nearzero= False;
    -
    -  for (k=0; k < dim; k++) {
    -    newhigh= newhighs[k];
    -    newlow= newlows[k];
    -    if (newhigh > REALmax/2 && newlow < -REALmax/2)
    -      continue;
    -    low= REALmax;
    -    high= -REALmax;
    -    for (i=numpoints, coord=points+k; i--; coord += dim) {
    -      minimize_(low, *coord);
    -      maximize_(high, *coord);
    -    }
    -    if (newhigh > REALmax/2)
    -      newhigh= high;
    -    if (newlow < -REALmax/2)
    -      newlow= low;
    -    if (qh->DELAUNAY && k == dim-1 && newhigh < newlow) {
    -      qh_fprintf(qh, qh->ferr, 6021, "qhull input error: 'Qb%d' or 'QB%d' inverts paraboloid since high bound %.2g < low bound %.2g\n",
    -               k, k, newhigh, newlow);
    -      qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -    }
    -    scale= qh_divzero(newhigh - newlow, high - low,
    -                  qh->MINdenom_1, &nearzero);
    -    if (nearzero) {
    -      qh_fprintf(qh, qh->ferr, 6022, "qhull input error: %d'th dimension's new bounds [%2.2g, %2.2g] too wide for\nexisting bounds [%2.2g, %2.2g]\n",
    -              k, newlow, newhigh, low, high);
    -      qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -    }
    -    shift= (newlow * high - low * newhigh)/(high-low);
    -    coord= points+k;
    -    for (i=numpoints; i--; coord += dim)
    -      *coord= *coord * scale + shift;
    -    coord= points+k;
    -    if (newlow < newhigh) {
    -      mincoord= newlow;
    -      maxcoord= newhigh;
    -    }else {
    -      mincoord= newhigh;
    -      maxcoord= newlow;
    -    }
    -    for (i=numpoints; i--; coord += dim) {
    -      minimize_(*coord, maxcoord);  /* because of roundoff error */
    -      maximize_(*coord, mincoord);
    -    }
    -    trace0((qh, qh->ferr, 10, "qh_scalepoints: scaled %d'th coordinate [%2.2g, %2.2g] to [%.2g, %.2g] for %d points by %2.2g and shifted %2.2g\n",
    -      k, low, high, newlow, newhigh, numpoints, scale, shift));
    -  }
    -} /* scalepoints */
    -
    -
    -/*---------------------------------
    -
    -  qh_setdelaunay(qh, dim, count, points )
    -    project count points to dim-d paraboloid for Delaunay triangulation
    -
    -    dim is one more than the dimension of the input set
    -    assumes dim is at least 3 (i.e., at least a 2-d Delaunay triangulation)
    -
    -    points is a dim*count realT array.  The first dim-1 coordinates
    -    are the coordinates of the first input point.  array[dim] is
    -    the first coordinate of the second input point.  array[2*dim] is
    -    the first coordinate of the third input point.
    -
    -    if qh.last_low defined (i.e., 'Qbb' called qh_scalelast)
    -      calls qh_scalelast to scale the last coordinate the same as the other points
    -
    -  returns:
    -    for each point
    -      sets point[dim-1] to sum of squares of coordinates
    -    scale points to 'Qbb' if needed
    -
    -  notes:
    -    to project one point, use
    -      qh_setdelaunay(qh, qh->hull_dim, 1, point)
    -
    -    Do not use options 'Qbk', 'QBk', or 'QbB' since they scale
    -    the coordinates after the original projection.
    -
    -*/
    -void qh_setdelaunay(qhT *qh, int dim, int count, pointT *points) {
    -  int i, k;
    -  coordT *coordp, coord;
    -  realT paraboloid;
    -
    -  trace0((qh, qh->ferr, 11, "qh_setdelaunay: project %d points to paraboloid for Delaunay triangulation\n", count));
    -  coordp= points;
    -  for (i=0; i < count; i++) {
    -    coord= *coordp++;
    -    paraboloid= coord*coord;
    -    for (k=dim-2; k--; ) {
    -      coord= *coordp++;
    -      paraboloid += coord*coord;
    -    }
    -    *coordp++ = paraboloid;
    -  }
    -  if (qh->last_low < REALmax/2)
    -    qh_scalelast(qh, points, count, dim, qh->last_low, qh->last_high, qh->last_newhigh);
    -} /* setdelaunay */
    -
    -
    -/*---------------------------------
    -
    -  qh_sethalfspace(qh, dim, coords, nextp, normal, offset, feasible )
    -    set point to dual of halfspace relative to feasible point
    -    halfspace is normal coefficients and offset.
    -
    -  returns:
    -    false and prints error if feasible point is outside of hull
    -    overwrites coordinates for point at dim coords
    -    nextp= next point (coords)
    -    does not call qh_errexit
    -
    -  design:
    -    compute distance from feasible point to halfspace
    -    divide each normal coefficient by -dist
    -*/
    -boolT qh_sethalfspace(qhT *qh, int dim, coordT *coords, coordT **nextp,
    -         coordT *normal, coordT *offset, coordT *feasible) {
    -  coordT *normp= normal, *feasiblep= feasible, *coordp= coords;
    -  realT dist;
    -  realT r; /*bug fix*/
    -  int k;
    -  boolT zerodiv;
    -
    -  dist= *offset;
    -  for (k=dim; k--; )
    -    dist += *(normp++) * *(feasiblep++);
    -  if (dist > 0)
    -    goto LABELerroroutside;
    -  normp= normal;
    -  if (dist < -qh->MINdenom) {
    -    for (k=dim; k--; )
    -      *(coordp++)= *(normp++) / -dist;
    -  }else {
    -    for (k=dim; k--; ) {
    -      *(coordp++)= qh_divzero(*(normp++), -dist, qh->MINdenom_1, &zerodiv);
    -      if (zerodiv)
    -        goto LABELerroroutside;
    -    }
    -  }
    -  *nextp= coordp;
    -  if (qh->IStracing >= 4) {
    -    qh_fprintf(qh, qh->ferr, 8021, "qh_sethalfspace: halfspace at offset %6.2g to point: ", *offset);
    -    for (k=dim, coordp=coords; k--; ) {
    -      r= *coordp++;
    -      qh_fprintf(qh, qh->ferr, 8022, " %6.2g", r);
    -    }
    -    qh_fprintf(qh, qh->ferr, 8023, "\n");
    -  }
    -  return True;
    -LABELerroroutside:
    -  feasiblep= feasible;
    -  normp= normal;
    -  qh_fprintf(qh, qh->ferr, 6023, "qhull input error: feasible point is not clearly inside halfspace\nfeasible point: ");
    -  for (k=dim; k--; )
    -    qh_fprintf(qh, qh->ferr, 8024, qh_REAL_1, r=*(feasiblep++));
    -  qh_fprintf(qh, qh->ferr, 8025, "\n     halfspace: ");
    -  for (k=dim; k--; )
    -    qh_fprintf(qh, qh->ferr, 8026, qh_REAL_1, r=*(normp++));
    -  qh_fprintf(qh, qh->ferr, 8027, "\n     at offset: ");
    -  qh_fprintf(qh, qh->ferr, 8028, qh_REAL_1, *offset);
    -  qh_fprintf(qh, qh->ferr, 8029, " and distance: ");
    -  qh_fprintf(qh, qh->ferr, 8030, qh_REAL_1, dist);
    -  qh_fprintf(qh, qh->ferr, 8031, "\n");
    -  return False;
    -} /* sethalfspace */
    -
    -/*---------------------------------
    -
    -  qh_sethalfspace_all(qh, dim, count, halfspaces, feasible )
    -    generate dual for halfspace intersection with feasible point
    -    array of count halfspaces
    -      each halfspace is normal coefficients followed by offset
    -      the origin is inside the halfspace if the offset is negative
    -    feasible is a point inside all halfspaces (http://www.qhull.org/html/qhalf.htm#notes)
    -
    -  returns:
    -    malloc'd array of count X dim-1 points
    -
    -  notes:
    -    call before qh_init_B or qh_initqhull_globals
    -    free memory when done
    -    unused/untested code: please email bradb@shore.net if this works ok for you
    -    if using option 'Fp', qh->feasible_point must be set (e.g., to 'feasible')
    -    qh->feasible_point is a malloc'd array that is freed by qh_freebuffers.
    -
    -  design:
    -    see qh_sethalfspace
    -*/
    -coordT *qh_sethalfspace_all(qhT *qh, int dim, int count, coordT *halfspaces, pointT *feasible) {
    -  int i, newdim;
    -  pointT *newpoints;
    -  coordT *coordp, *normalp, *offsetp;
    -
    -  trace0((qh, qh->ferr, 12, "qh_sethalfspace_all: compute dual for halfspace intersection\n"));
    -  newdim= dim - 1;
    -  if (!(newpoints=(coordT*)qh_malloc(count*newdim*sizeof(coordT)))){
    -    qh_fprintf(qh, qh->ferr, 6024, "qhull error: insufficient memory to compute dual of %d halfspaces\n",
    -          count);
    -    qh_errexit(qh, qh_ERRmem, NULL, NULL);
    -  }
    -  coordp= newpoints;
    -  normalp= halfspaces;
    -  for (i=0; i < count; i++) {
    -    offsetp= normalp + newdim;
    -    if (!qh_sethalfspace(qh, newdim, coordp, &coordp, normalp, offsetp, feasible)) {
    -      qh_free(newpoints);  /* feasible is not inside halfspace as reported by qh_sethalfspace */
    -      qh_fprintf(qh, qh->ferr, 8032, "The halfspace was at index %d\n", i);
    -      qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -    }
    -    normalp= offsetp + 1;
    -  }
    -  return newpoints;
    -} /* sethalfspace_all */
    -
    -
    -/*---------------------------------
    -
    -  qh_sharpnewfacets(qh)
    -
    -  returns:
    -    true if could be an acute angle (facets in different quadrants)
    -
    -  notes:
    -    for qh_findbest
    -
    -  design:
    -    for all facets on qh.newfacet_list
    -      if two facets are in different quadrants
    -        set issharp
    -*/
    -boolT qh_sharpnewfacets(qhT *qh) {
    -  facetT *facet;
    -  boolT issharp = False;
    -  int *quadrant, k;
    -
    -  quadrant= (int*)qh_memalloc(qh, qh->hull_dim * sizeof(int));
    -  FORALLfacet_(qh->newfacet_list) {
    -    if (facet == qh->newfacet_list) {
    -      for (k=qh->hull_dim; k--; )
    -        quadrant[ k]= (facet->normal[ k] > 0);
    -    }else {
    -      for (k=qh->hull_dim; k--; ) {
    -        if (quadrant[ k] != (facet->normal[ k] > 0)) {
    -          issharp= True;
    -          break;
    -        }
    -      }
    -    }
    -    if (issharp)
    -      break;
    -  }
    -  qh_memfree(qh, quadrant, qh->hull_dim * sizeof(int));
    -  trace3((qh, qh->ferr, 3001, "qh_sharpnewfacets: %d\n", issharp));
    -  return issharp;
    -} /* sharpnewfacets */
    -
    -/*---------------------------------
    -
    -  qh_voronoi_center(qh, dim, points )
    -    return Voronoi center for a set of points
    -    dim is the orginal dimension of the points
    -    gh.gm_matrix/qh.gm_row are scratch buffers
    -
    -  returns:
    -    center as a temporary point (qh_memalloc)
    -    if non-simplicial,
    -      returns center for max simplex of points
    -
    -  notes:
    -    only called by qh_facetcenter
    -    from Bowyer & Woodwark, A Programmer's Geometry, 1983, p. 65
    -
    -  design:
    -    if non-simplicial
    -      determine max simplex for points
    -    translate point0 of simplex to origin
    -    compute sum of squares of diagonal
    -    compute determinate
    -    compute Voronoi center (see Bowyer & Woodwark)
    -*/
    -pointT *qh_voronoi_center(qhT *qh, int dim, setT *points) {
    -  pointT *point, **pointp, *point0;
    -  pointT *center= (pointT*)qh_memalloc(qh, qh->center_size);
    -  setT *simplex;
    -  int i, j, k, size= qh_setsize(qh, points);
    -  coordT *gmcoord;
    -  realT *diffp, sum2, *sum2row, *sum2p, det, factor;
    -  boolT nearzero, infinite;
    -
    -  if (size == dim+1)
    -    simplex= points;
    -  else if (size < dim+1) {
    -    qh_memfree(qh, center, qh->center_size);
    -    qh_fprintf(qh, qh->ferr, 6025, "qhull internal error (qh_voronoi_center):\n  need at least %d points to construct a Voronoi center\n",
    -             dim+1);
    -    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -    simplex= points;  /* never executed -- avoids warning */
    -  }else {
    -    simplex= qh_settemp(qh, dim+1);
    -    qh_maxsimplex(qh, dim, points, NULL, 0, &simplex);
    -  }
    -  point0= SETfirstt_(simplex, pointT);
    -  gmcoord= qh->gm_matrix;
    -  for (k=0; k < dim; k++) {
    -    qh->gm_row[k]= gmcoord;
    -    FOREACHpoint_(simplex) {
    -      if (point != point0)
    -        *(gmcoord++)= point[k] - point0[k];
    -    }
    -  }
    -  sum2row= gmcoord;
    -  for (i=0; i < dim; i++) {
    -    sum2= 0.0;
    -    for (k=0; k < dim; k++) {
    -      diffp= qh->gm_row[k] + i;
    -      sum2 += *diffp * *diffp;
    -    }
    -    *(gmcoord++)= sum2;
    -  }
    -  det= qh_determinant(qh, qh->gm_row, dim, &nearzero);
    -  factor= qh_divzero(0.5, det, qh->MINdenom, &infinite);
    -  if (infinite) {
    -    for (k=dim; k--; )
    -      center[k]= (float)qh_INFINITE;
    -    if (qh->IStracing)
    -      qh_printpoints(qh, qh->ferr, "qh_voronoi_center: at infinity for ", simplex);
    -  }else {
    -    for (i=0; i < dim; i++) {
    -      gmcoord= qh->gm_matrix;
    -      sum2p= sum2row;
    -      for (k=0; k < dim; k++) {
    -        qh->gm_row[k]= gmcoord;
    -        if (k == i) {
    -          for (j=dim; j--; )
    -            *(gmcoord++)= *sum2p++;
    -        }else {
    -          FOREACHpoint_(simplex) {
    -            if (point != point0)
    -              *(gmcoord++)= point[k] - point0[k];
    -          }
    -        }
    -      }
    -      center[i]= qh_determinant(qh, qh->gm_row, dim, &nearzero)*factor + point0[i];
    -    }
    -#ifndef qh_NOtrace
    -    if (qh->IStracing >= 3) {
    -      qh_fprintf(qh, qh->ferr, 8033, "qh_voronoi_center: det %2.2g factor %2.2g ", det, factor);
    -      qh_printmatrix(qh, qh->ferr, "center:", ¢er, 1, dim);
    -      if (qh->IStracing >= 5) {
    -        qh_printpoints(qh, qh->ferr, "points", simplex);
    -        FOREACHpoint_(simplex)
    -          qh_fprintf(qh, qh->ferr, 8034, "p%d dist %.2g, ", qh_pointid(qh, point),
    -                   qh_pointdist(point, center, dim));
    -        qh_fprintf(qh, qh->ferr, 8035, "\n");
    -      }
    -    }
    -#endif
    -  }
    -  if (simplex != points)
    -    qh_settempfree(qh, &simplex);
    -  return center;
    -} /* voronoi_center */
    -
    diff --git a/src/qhull/src/libqhull_r/geom_r.c b/src/qhull/src/libqhull_r/geom_r.c
    deleted file mode 100644
    index 8104813cad0..00000000000
    --- a/src/qhull/src/libqhull_r/geom_r.c
    +++ /dev/null
    @@ -1,1234 +0,0 @@
    -/*
      ---------------------------------
    -
    -   geom_r.c
    -   geometric routines of qhull
    -
    -   see qh-geom_r.htm and geom_r.h
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull_r/geom_r.c#2 $$Change: 1995 $
    -   $DateTime: 2015/10/13 21:59:42 $$Author: bbarber $
    -
    -   infrequent code goes into geom2_r.c
    -*/
    -
    -#include "qhull_ra.h"
    -
    -/*---------------------------------
    -
    -  qh_distplane(qh, point, facet, dist )
    -    return distance from point to facet
    -
    -  returns:
    -    dist
    -    if qh.RANDOMdist, joggles result
    -
    -  notes:
    -    dist > 0 if point is above facet (i.e., outside)
    -    does not error (for qh_sortfacets, qh_outerinner)
    -
    -  see:
    -    qh_distnorm in geom2_r.c
    -    qh_distplane [geom_r.c], QhullFacet::distance, and QhullHyperplane::distance are copies
    -*/
    -void qh_distplane(qhT *qh, pointT *point, facetT *facet, realT *dist) {
    -  coordT *normal= facet->normal, *coordp, randr;
    -  int k;
    -
    -  switch (qh->hull_dim){
    -  case 2:
    -    *dist= facet->offset + point[0] * normal[0] + point[1] * normal[1];
    -    break;
    -  case 3:
    -    *dist= facet->offset + point[0] * normal[0] + point[1] * normal[1] + point[2] * normal[2];
    -    break;
    -  case 4:
    -    *dist= facet->offset+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3];
    -    break;
    -  case 5:
    -    *dist= facet->offset+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3]+point[4]*normal[4];
    -    break;
    -  case 6:
    -    *dist= facet->offset+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3]+point[4]*normal[4]+point[5]*normal[5];
    -    break;
    -  case 7:
    -    *dist= facet->offset+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3]+point[4]*normal[4]+point[5]*normal[5]+point[6]*normal[6];
    -    break;
    -  case 8:
    -    *dist= facet->offset+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3]+point[4]*normal[4]+point[5]*normal[5]+point[6]*normal[6]+point[7]*normal[7];
    -    break;
    -  default:
    -    *dist= facet->offset;
    -    coordp= point;
    -    for (k=qh->hull_dim; k--; )
    -      *dist += *coordp++ * *normal++;
    -    break;
    -  }
    -  zinc_(Zdistplane);
    -  if (!qh->RANDOMdist && qh->IStracing < 4)
    -    return;
    -  if (qh->RANDOMdist) {
    -    randr= qh_RANDOMint;
    -    *dist += (2.0 * randr / qh_RANDOMmax - 1.0) *
    -      qh->RANDOMfactor * qh->MAXabs_coord;
    -  }
    -  if (qh->IStracing >= 4) {
    -    qh_fprintf(qh, qh->ferr, 8001, "qh_distplane: ");
    -    qh_fprintf(qh, qh->ferr, 8002, qh_REAL_1, *dist);
    -    qh_fprintf(qh, qh->ferr, 8003, "from p%d to f%d\n", qh_pointid(qh, point), facet->id);
    -  }
    -  return;
    -} /* distplane */
    -
    -
    -/*---------------------------------
    -
    -  qh_findbest(qh, point, startfacet, bestoutside, qh_ISnewfacets, qh_NOupper, dist, isoutside, numpart )
    -    find facet that is furthest below a point
    -    for upperDelaunay facets
    -      returns facet only if !qh_NOupper and clearly above
    -
    -  input:
    -    starts search at 'startfacet' (can not be flipped)
    -    if !bestoutside(qh_ALL), stops at qh.MINoutside
    -
    -  returns:
    -    best facet (reports error if NULL)
    -    early out if isoutside defined and bestdist > qh.MINoutside
    -    dist is distance to facet
    -    isoutside is true if point is outside of facet
    -    numpart counts the number of distance tests
    -
    -  see also:
    -    qh_findbestnew()
    -
    -  notes:
    -    If merging (testhorizon), searches horizon facets of coplanar best facets because
    -    after qh_distplane, this and qh_partitionpoint are the most expensive in 3-d
    -      avoid calls to distplane, function calls, and real number operations.
    -    caller traces result
    -    Optimized for outside points.   Tried recording a search set for qh_findhorizon.
    -    Made code more complicated.
    -
    -  when called by qh_partitionvisible():
    -    indicated by qh_ISnewfacets
    -    qh.newfacet_list is list of simplicial, new facets
    -    qh_findbestnew set if qh_sharpnewfacets returns True (to use qh_findbestnew)
    -    qh.bestfacet_notsharp set if qh_sharpnewfacets returns False
    -
    -  when called by qh_findfacet(), qh_partitionpoint(), qh_partitioncoplanar(),
    -                 qh_check_bestdist(), qh_addpoint()
    -    indicated by !qh_ISnewfacets
    -    returns best facet in neighborhood of given facet
    -      this is best facet overall if dist > -   qh.MAXcoplanar
    -        or hull has at least a "spherical" curvature
    -
    -  design:
    -    initialize and test for early exit
    -    repeat while there are better facets
    -      for each neighbor of facet
    -        exit if outside facet found
    -        test for better facet
    -    if point is inside and partitioning
    -      test for new facets with a "sharp" intersection
    -      if so, future calls go to qh_findbestnew()
    -    test horizon facets
    -*/
    -facetT *qh_findbest(qhT *qh, pointT *point, facetT *startfacet,
    -                     boolT bestoutside, boolT isnewfacets, boolT noupper,
    -                     realT *dist, boolT *isoutside, int *numpart) {
    -  realT bestdist= -REALmax/2 /* avoid underflow */;
    -  facetT *facet, *neighbor, **neighborp;
    -  facetT *bestfacet= NULL, *lastfacet= NULL;
    -  int oldtrace= qh->IStracing;
    -  unsigned int visitid= ++qh->visit_id;
    -  int numpartnew=0;
    -  boolT testhorizon = True; /* needed if precise, e.g., rbox c D6 | qhull Q0 Tv */
    -
    -  zinc_(Zfindbest);
    -  if (qh->IStracing >= 3 || (qh->TRACElevel && qh->TRACEpoint >= 0 && qh->TRACEpoint == qh_pointid(qh, point))) {
    -    if (qh->TRACElevel > qh->IStracing)
    -      qh->IStracing= qh->TRACElevel;
    -    qh_fprintf(qh, qh->ferr, 8004, "qh_findbest: point p%d starting at f%d isnewfacets? %d, unless %d exit if > %2.2g\n",
    -             qh_pointid(qh, point), startfacet->id, isnewfacets, bestoutside, qh->MINoutside);
    -    qh_fprintf(qh, qh->ferr, 8005, "  testhorizon? %d noupper? %d", testhorizon, noupper);
    -    qh_fprintf(qh, qh->ferr, 8006, "  Last point added was p%d.", qh->furthest_id);
    -    qh_fprintf(qh, qh->ferr, 8007, "  Last merge was #%d.  max_outside %2.2g\n", zzval_(Ztotmerge), qh->max_outside);
    -  }
    -  if (isoutside)
    -    *isoutside= True;
    -  if (!startfacet->flipped) {  /* test startfacet */
    -    *numpart= 1;
    -    qh_distplane(qh, point, startfacet, dist);  /* this code is duplicated below */
    -    if (!bestoutside && *dist >= qh->MINoutside
    -    && (!startfacet->upperdelaunay || !noupper)) {
    -      bestfacet= startfacet;
    -      goto LABELreturn_best;
    -    }
    -    bestdist= *dist;
    -    if (!startfacet->upperdelaunay) {
    -      bestfacet= startfacet;
    -    }
    -  }else
    -    *numpart= 0;
    -  startfacet->visitid= visitid;
    -  facet= startfacet;
    -  while (facet) {
    -    trace4((qh, qh->ferr, 4001, "qh_findbest: neighbors of f%d, bestdist %2.2g f%d\n",
    -                facet->id, bestdist, getid_(bestfacet)));
    -    lastfacet= facet;
    -    FOREACHneighbor_(facet) {
    -      if (!neighbor->newfacet && isnewfacets)
    -        continue;
    -      if (neighbor->visitid == visitid)
    -        continue;
    -      neighbor->visitid= visitid;
    -      if (!neighbor->flipped) {  /* code duplicated above */
    -        (*numpart)++;
    -        qh_distplane(qh, point, neighbor, dist);
    -        if (*dist > bestdist) {
    -          if (!bestoutside && *dist >= qh->MINoutside
    -          && (!neighbor->upperdelaunay || !noupper)) {
    -            bestfacet= neighbor;
    -            goto LABELreturn_best;
    -          }
    -          if (!neighbor->upperdelaunay) {
    -            bestfacet= neighbor;
    -            bestdist= *dist;
    -            break; /* switch to neighbor */
    -          }else if (!bestfacet) {
    -            bestdist= *dist;
    -            break; /* switch to neighbor */
    -          }
    -        } /* end of *dist>bestdist */
    -      } /* end of !flipped */
    -    } /* end of FOREACHneighbor */
    -    facet= neighbor;  /* non-NULL only if *dist>bestdist */
    -  } /* end of while facet (directed search) */
    -  if (isnewfacets) {
    -    if (!bestfacet) {
    -      bestdist= -REALmax/2;
    -      bestfacet= qh_findbestnew(qh, point, startfacet->next, &bestdist, bestoutside, isoutside, &numpartnew);
    -      testhorizon= False; /* qh_findbestnew calls qh_findbesthorizon */
    -    }else if (!qh->findbest_notsharp && bestdist < - qh->DISTround) {
    -      if (qh_sharpnewfacets(qh)) {
    -        /* seldom used, qh_findbestnew will retest all facets */
    -        zinc_(Zfindnewsharp);
    -        bestfacet= qh_findbestnew(qh, point, bestfacet, &bestdist, bestoutside, isoutside, &numpartnew);
    -        testhorizon= False; /* qh_findbestnew calls qh_findbesthorizon */
    -        qh->findbestnew= True;
    -      }else
    -        qh->findbest_notsharp= True;
    -    }
    -  }
    -  if (!bestfacet)
    -    bestfacet= qh_findbestlower(qh, lastfacet, point, &bestdist, numpart);
    -  if (testhorizon)
    -    bestfacet= qh_findbesthorizon(qh, !qh_IScheckmax, point, bestfacet, noupper, &bestdist, &numpartnew);
    -  *dist= bestdist;
    -  if (isoutside && bestdist < qh->MINoutside)
    -    *isoutside= False;
    -LABELreturn_best:
    -  zadd_(Zfindbesttot, *numpart);
    -  zmax_(Zfindbestmax, *numpart);
    -  (*numpart) += numpartnew;
    -  qh->IStracing= oldtrace;
    -  return bestfacet;
    -}  /* findbest */
    -
    -
    -/*---------------------------------
    -
    -  qh_findbesthorizon(qh, qh_IScheckmax, point, startfacet, qh_NOupper, &bestdist, &numpart )
    -    search coplanar and better horizon facets from startfacet/bestdist
    -    ischeckmax turns off statistics and minsearch update
    -    all arguments must be initialized
    -  returns(ischeckmax):
    -    best facet
    -  returns(!ischeckmax):
    -    best facet that is not upperdelaunay
    -    allows upperdelaunay that is clearly outside
    -  returns:
    -    bestdist is distance to bestfacet
    -    numpart -- updates number of distance tests
    -
    -  notes:
    -    no early out -- use qh_findbest() or qh_findbestnew()
    -    Searches coplanar or better horizon facets
    -
    -  when called by qh_check_maxout() (qh_IScheckmax)
    -    startfacet must be closest to the point
    -      Otherwise, if point is beyond and below startfacet, startfacet may be a local minimum
    -      even though other facets are below the point.
    -    updates facet->maxoutside for good, visited facets
    -    may return NULL
    -
    -    searchdist is qh.max_outside + 2 * DISTround
    -      + max( MINvisible('Vn'), MAXcoplanar('Un'));
    -    This setting is a guess.  It must be at least max_outside + 2*DISTround
    -    because a facet may have a geometric neighbor across a vertex
    -
    -  design:
    -    for each horizon facet of coplanar best facets
    -      continue if clearly inside
    -      unless upperdelaunay or clearly outside
    -         update best facet
    -*/
    -facetT *qh_findbesthorizon(qhT *qh, boolT ischeckmax, pointT* point, facetT *startfacet, boolT noupper, realT *bestdist, int *numpart) {
    -  facetT *bestfacet= startfacet;
    -  realT dist;
    -  facetT *neighbor, **neighborp, *facet;
    -  facetT *nextfacet= NULL; /* optimize last facet of coplanarfacetset */
    -  int numpartinit= *numpart, coplanarfacetset_size;
    -  unsigned int visitid= ++qh->visit_id;
    -  boolT newbest= False; /* for tracing */
    -  realT minsearch, searchdist;  /* skip facets that are too far from point */
    -
    -  if (!ischeckmax) {
    -    zinc_(Zfindhorizon);
    -  }else {
    -#if qh_MAXoutside
    -    if ((!qh->ONLYgood || startfacet->good) && *bestdist > startfacet->maxoutside)
    -      startfacet->maxoutside= *bestdist;
    -#endif
    -  }
    -  searchdist= qh_SEARCHdist; /* multiple of qh.max_outside and precision constants */
    -  minsearch= *bestdist - searchdist;
    -  if (ischeckmax) {
    -    /* Always check coplanar facets.  Needed for RBOX 1000 s Z1 G1e-13 t996564279 | QHULL Tv */
    -    minimize_(minsearch, -searchdist);
    -  }
    -  coplanarfacetset_size= 0;
    -  facet= startfacet;
    -  while (True) {
    -    trace4((qh, qh->ferr, 4002, "qh_findbesthorizon: neighbors of f%d bestdist %2.2g f%d ischeckmax? %d noupper? %d minsearch %2.2g searchdist %2.2g\n",
    -                facet->id, *bestdist, getid_(bestfacet), ischeckmax, noupper,
    -                minsearch, searchdist));
    -    FOREACHneighbor_(facet) {
    -      if (neighbor->visitid == visitid)
    -        continue;
    -      neighbor->visitid= visitid;
    -      if (!neighbor->flipped) {
    -        qh_distplane(qh, point, neighbor, &dist);
    -        (*numpart)++;
    -        if (dist > *bestdist) {
    -          if (!neighbor->upperdelaunay || ischeckmax || (!noupper && dist >= qh->MINoutside)) {
    -            bestfacet= neighbor;
    -            *bestdist= dist;
    -            newbest= True;
    -            if (!ischeckmax) {
    -              minsearch= dist - searchdist;
    -              if (dist > *bestdist + searchdist) {
    -                zinc_(Zfindjump);  /* everything in qh.coplanarfacetset at least searchdist below */
    -                coplanarfacetset_size= 0;
    -              }
    -            }
    -          }
    -        }else if (dist < minsearch)
    -          continue;  /* if ischeckmax, dist can't be positive */
    -#if qh_MAXoutside
    -        if (ischeckmax && dist > neighbor->maxoutside)
    -          neighbor->maxoutside= dist;
    -#endif
    -      } /* end of !flipped */
    -      if (nextfacet) {
    -        if (!coplanarfacetset_size++) {
    -          SETfirst_(qh->coplanarfacetset)= nextfacet;
    -          SETtruncate_(qh->coplanarfacetset, 1);
    -        }else
    -          qh_setappend(qh, &qh->coplanarfacetset, nextfacet); /* Was needed for RBOX 1000 s W1e-13 P0 t996547055 | QHULL d Qbb Qc Tv
    -                                                 and RBOX 1000 s Z1 G1e-13 t996564279 | qhull Tv  */
    -      }
    -      nextfacet= neighbor;
    -    } /* end of EACHneighbor */
    -    facet= nextfacet;
    -    if (facet)
    -      nextfacet= NULL;
    -    else if (!coplanarfacetset_size)
    -      break;
    -    else if (!--coplanarfacetset_size) {
    -      facet= SETfirstt_(qh->coplanarfacetset, facetT);
    -      SETtruncate_(qh->coplanarfacetset, 0);
    -    }else
    -      facet= (facetT*)qh_setdellast(qh->coplanarfacetset);
    -  } /* while True, for each facet in qh.coplanarfacetset */
    -  if (!ischeckmax) {
    -    zadd_(Zfindhorizontot, *numpart - numpartinit);
    -    zmax_(Zfindhorizonmax, *numpart - numpartinit);
    -    if (newbest)
    -      zinc_(Zparthorizon);
    -  }
    -  trace4((qh, qh->ferr, 4003, "qh_findbesthorizon: newbest? %d bestfacet f%d bestdist %2.2g\n", newbest, getid_(bestfacet), *bestdist));
    -  return bestfacet;
    -}  /* findbesthorizon */
    -
    -/*---------------------------------
    -
    -  qh_findbestnew(qh, point, startfacet, dist, isoutside, numpart )
    -    find best newfacet for point
    -    searches all of qh.newfacet_list starting at startfacet
    -    searches horizon facets of coplanar best newfacets
    -    searches all facets if startfacet == qh.facet_list
    -  returns:
    -    best new or horizon facet that is not upperdelaunay
    -    early out if isoutside and not 'Qf'
    -    dist is distance to facet
    -    isoutside is true if point is outside of facet
    -    numpart is number of distance tests
    -
    -  notes:
    -    Always used for merged new facets (see qh_USEfindbestnew)
    -    Avoids upperdelaunay facet unless (isoutside and outside)
    -
    -    Uses qh.visit_id, qh.coplanarfacetset.
    -    If share visit_id with qh_findbest, coplanarfacetset is incorrect.
    -
    -    If merging (testhorizon), searches horizon facets of coplanar best facets because
    -    a point maybe coplanar to the bestfacet, below its horizon facet,
    -    and above a horizon facet of a coplanar newfacet.  For example,
    -      rbox 1000 s Z1 G1e-13 | qhull
    -      rbox 1000 s W1e-13 P0 t992110337 | QHULL d Qbb Qc
    -
    -    qh_findbestnew() used if
    -       qh_sharpnewfacets -- newfacets contains a sharp angle
    -       if many merges, qh_premerge found a merge, or 'Qf' (qh.findbestnew)
    -
    -  see also:
    -    qh_partitionall() and qh_findbest()
    -
    -  design:
    -    for each new facet starting from startfacet
    -      test distance from point to facet
    -      return facet if clearly outside
    -      unless upperdelaunay and a lowerdelaunay exists
    -         update best facet
    -    test horizon facets
    -*/
    -facetT *qh_findbestnew(qhT *qh, pointT *point, facetT *startfacet,
    -           realT *dist, boolT bestoutside, boolT *isoutside, int *numpart) {
    -  realT bestdist= -REALmax/2;
    -  facetT *bestfacet= NULL, *facet;
    -  int oldtrace= qh->IStracing, i;
    -  unsigned int visitid= ++qh->visit_id;
    -  realT distoutside= 0.0;
    -  boolT isdistoutside; /* True if distoutside is defined */
    -  boolT testhorizon = True; /* needed if precise, e.g., rbox c D6 | qhull Q0 Tv */
    -
    -  if (!startfacet) {
    -    if (qh->MERGING)
    -      qh_fprintf(qh, qh->ferr, 6001, "qhull precision error (qh_findbestnew): merging has formed and deleted a cone of new facets.  Can not continue.\n");
    -    else
    -      qh_fprintf(qh, qh->ferr, 6002, "qhull internal error (qh_findbestnew): no new facets for point p%d\n",
    -              qh->furthest_id);
    -    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -  }
    -  zinc_(Zfindnew);
    -  if (qh->BESToutside || bestoutside)
    -    isdistoutside= False;
    -  else {
    -    isdistoutside= True;
    -    distoutside= qh_DISToutside; /* multiple of qh.MINoutside & qh.max_outside, see user.h */
    -  }
    -  if (isoutside)
    -    *isoutside= True;
    -  *numpart= 0;
    -  if (qh->IStracing >= 3 || (qh->TRACElevel && qh->TRACEpoint >= 0 && qh->TRACEpoint == qh_pointid(qh, point))) {
    -    if (qh->TRACElevel > qh->IStracing)
    -      qh->IStracing= qh->TRACElevel;
    -    qh_fprintf(qh, qh->ferr, 8008, "qh_findbestnew: point p%d facet f%d. Stop? %d if dist > %2.2g\n",
    -             qh_pointid(qh, point), startfacet->id, isdistoutside, distoutside);
    -    qh_fprintf(qh, qh->ferr, 8009, "  Last point added p%d visitid %d.",  qh->furthest_id, visitid);
    -    qh_fprintf(qh, qh->ferr, 8010, "  Last merge was #%d.\n", zzval_(Ztotmerge));
    -  }
    -  /* visit all new facets starting with startfacet, maybe qh->facet_list */
    -  for (i=0, facet=startfacet; i < 2; i++, facet= qh->newfacet_list) {
    -    FORALLfacet_(facet) {
    -      if (facet == startfacet && i)
    -        break;
    -      facet->visitid= visitid;
    -      if (!facet->flipped) {
    -        qh_distplane(qh, point, facet, dist);
    -        (*numpart)++;
    -        if (*dist > bestdist) {
    -          if (!facet->upperdelaunay || *dist >= qh->MINoutside) {
    -            bestfacet= facet;
    -            if (isdistoutside && *dist >= distoutside)
    -              goto LABELreturn_bestnew;
    -            bestdist= *dist;
    -          }
    -        }
    -      } /* end of !flipped */
    -    } /* FORALLfacet from startfacet or qh->newfacet_list */
    -  }
    -  if (testhorizon || !bestfacet) /* testhorizon is always True.  Keep the same code as qh_findbest */
    -    bestfacet= qh_findbesthorizon(qh, !qh_IScheckmax, point, bestfacet ? bestfacet : startfacet,
    -                                        !qh_NOupper, &bestdist, numpart);
    -  *dist= bestdist;
    -  if (isoutside && *dist < qh->MINoutside)
    -    *isoutside= False;
    -LABELreturn_bestnew:
    -  zadd_(Zfindnewtot, *numpart);
    -  zmax_(Zfindnewmax, *numpart);
    -  trace4((qh, qh->ferr, 4004, "qh_findbestnew: bestfacet f%d bestdist %2.2g\n", getid_(bestfacet), *dist));
    -  qh->IStracing= oldtrace;
    -  return bestfacet;
    -}  /* findbestnew */
    -
    -/* ============ hyperplane functions -- keep code together [?] ============ */
    -
    -/*---------------------------------
    -
    -  qh_backnormal(qh, rows, numrow, numcol, sign, normal, nearzero )
    -    given an upper-triangular rows array and a sign,
    -    solve for normal equation x using back substitution over rows U
    -
    -  returns:
    -     normal= x
    -
    -     if will not be able to divzero() when normalized(qh.MINdenom_2 and qh.MINdenom_1_2),
    -       if fails on last row
    -         this means that the hyperplane intersects [0,..,1]
    -         sets last coordinate of normal to sign
    -       otherwise
    -         sets tail of normal to [...,sign,0,...], i.e., solves for b= [0...0]
    -         sets nearzero
    -
    -  notes:
    -     assumes numrow == numcol-1
    -
    -     see Golub & van Loan, 1983, Eq. 4.4-9 for "Gaussian elimination with complete pivoting"
    -
    -     solves Ux=b where Ax=b and PA=LU
    -     b= [0,...,0,sign or 0]  (sign is either -1 or +1)
    -     last row of A= [0,...,0,1]
    -
    -     1) Ly=Pb == y=b since P only permutes the 0's of   b
    -
    -  design:
    -    for each row from end
    -      perform back substitution
    -      if near zero
    -        use qh_divzero for division
    -        if zero divide and not last row
    -          set tail of normal to 0
    -*/
    -void qh_backnormal(qhT *qh, realT **rows, int numrow, int numcol, boolT sign,
    -        coordT *normal, boolT *nearzero) {
    -  int i, j;
    -  coordT *normalp, *normal_tail, *ai, *ak;
    -  realT diagonal;
    -  boolT waszero;
    -  int zerocol= -1;
    -
    -  normalp= normal + numcol - 1;
    -  *normalp--= (sign ? -1.0 : 1.0);
    -  for (i=numrow; i--; ) {
    -    *normalp= 0.0;
    -    ai= rows[i] + i + 1;
    -    ak= normalp+1;
    -    for (j=i+1; j < numcol; j++)
    -      *normalp -= *ai++ * *ak++;
    -    diagonal= (rows[i])[i];
    -    if (fabs_(diagonal) > qh->MINdenom_2)
    -      *(normalp--) /= diagonal;
    -    else {
    -      waszero= False;
    -      *normalp= qh_divzero(*normalp, diagonal, qh->MINdenom_1_2, &waszero);
    -      if (waszero) {
    -        zerocol= i;
    -        *(normalp--)= (sign ? -1.0 : 1.0);
    -        for (normal_tail= normalp+2; normal_tail < normal + numcol; normal_tail++)
    -          *normal_tail= 0.0;
    -      }else
    -        normalp--;
    -    }
    -  }
    -  if (zerocol != -1) {
    -    zzinc_(Zback0);
    -    *nearzero= True;
    -    trace4((qh, qh->ferr, 4005, "qh_backnormal: zero diagonal at column %d.\n", i));
    -    qh_precision(qh, "zero diagonal on back substitution");
    -  }
    -} /* backnormal */
    -
    -/*---------------------------------
    -
    -  qh_gausselim(qh, rows, numrow, numcol, sign )
    -    Gaussian elimination with partial pivoting
    -
    -  returns:
    -    rows is upper triangular (includes row exchanges)
    -    flips sign for each row exchange
    -    sets nearzero if pivot[k] < qh.NEARzero[k], else clears it
    -
    -  notes:
    -    if nearzero, the determinant's sign may be incorrect.
    -    assumes numrow <= numcol
    -
    -  design:
    -    for each row
    -      determine pivot and exchange rows if necessary
    -      test for near zero
    -      perform gaussian elimination step
    -*/
    -void qh_gausselim(qhT *qh, realT **rows, int numrow, int numcol, boolT *sign, boolT *nearzero) {
    -  realT *ai, *ak, *rowp, *pivotrow;
    -  realT n, pivot, pivot_abs= 0.0, temp;
    -  int i, j, k, pivoti, flip=0;
    -
    -  *nearzero= False;
    -  for (k=0; k < numrow; k++) {
    -    pivot_abs= fabs_((rows[k])[k]);
    -    pivoti= k;
    -    for (i=k+1; i < numrow; i++) {
    -      if ((temp= fabs_((rows[i])[k])) > pivot_abs) {
    -        pivot_abs= temp;
    -        pivoti= i;
    -      }
    -    }
    -    if (pivoti != k) {
    -      rowp= rows[pivoti];
    -      rows[pivoti]= rows[k];
    -      rows[k]= rowp;
    -      *sign ^= 1;
    -      flip ^= 1;
    -    }
    -    if (pivot_abs <= qh->NEARzero[k]) {
    -      *nearzero= True;
    -      if (pivot_abs == 0.0) {   /* remainder of column == 0 */
    -        if (qh->IStracing >= 4) {
    -          qh_fprintf(qh, qh->ferr, 8011, "qh_gausselim: 0 pivot at column %d. (%2.2g < %2.2g)\n", k, pivot_abs, qh->DISTround);
    -          qh_printmatrix(qh, qh->ferr, "Matrix:", rows, numrow, numcol);
    -        }
    -        zzinc_(Zgauss0);
    -        qh_precision(qh, "zero pivot for Gaussian elimination");
    -        goto LABELnextcol;
    -      }
    -    }
    -    pivotrow= rows[k] + k;
    -    pivot= *pivotrow++;  /* signed value of pivot, and remainder of row */
    -    for (i=k+1; i < numrow; i++) {
    -      ai= rows[i] + k;
    -      ak= pivotrow;
    -      n= (*ai++)/pivot;   /* divzero() not needed since |pivot| >= |*ai| */
    -      for (j= numcol - (k+1); j--; )
    -        *ai++ -= n * *ak++;
    -    }
    -  LABELnextcol:
    -    ;
    -  }
    -  wmin_(Wmindenom, pivot_abs);  /* last pivot element */
    -  if (qh->IStracing >= 5)
    -    qh_printmatrix(qh, qh->ferr, "qh_gausselem: result", rows, numrow, numcol);
    -} /* gausselim */
    -
    -
    -/*---------------------------------
    -
    -  qh_getangle(qh, vect1, vect2 )
    -    returns the dot product of two vectors
    -    if qh.RANDOMdist, joggles result
    -
    -  notes:
    -    the angle may be > 1.0 or < -1.0 because of roundoff errors
    -
    -*/
    -realT qh_getangle(qhT *qh, pointT *vect1, pointT *vect2) {
    -  realT angle= 0, randr;
    -  int k;
    -
    -  for (k=qh->hull_dim; k--; )
    -    angle += *vect1++ * *vect2++;
    -  if (qh->RANDOMdist) {
    -    randr= qh_RANDOMint;
    -    angle += (2.0 * randr / qh_RANDOMmax - 1.0) *
    -      qh->RANDOMfactor;
    -  }
    -  trace4((qh, qh->ferr, 4006, "qh_getangle: %2.2g\n", angle));
    -  return(angle);
    -} /* getangle */
    -
    -
    -/*---------------------------------
    -
    -  qh_getcenter(qh, vertices )
    -    returns arithmetic center of a set of vertices as a new point
    -
    -  notes:
    -    allocates point array for center
    -*/
    -pointT *qh_getcenter(qhT *qh, setT *vertices) {
    -  int k;
    -  pointT *center, *coord;
    -  vertexT *vertex, **vertexp;
    -  int count= qh_setsize(qh, vertices);
    -
    -  if (count < 2) {
    -    qh_fprintf(qh, qh->ferr, 6003, "qhull internal error (qh_getcenter): not defined for %d points\n", count);
    -    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -  }
    -  center= (pointT *)qh_memalloc(qh, qh->normal_size);
    -  for (k=0; k < qh->hull_dim; k++) {
    -    coord= center+k;
    -    *coord= 0.0;
    -    FOREACHvertex_(vertices)
    -      *coord += vertex->point[k];
    -    *coord /= count;  /* count>=2 by QH6003 */
    -  }
    -  return(center);
    -} /* getcenter */
    -
    -
    -/*---------------------------------
    -
    -  qh_getcentrum(qh, facet )
    -    returns the centrum for a facet as a new point
    -
    -  notes:
    -    allocates the centrum
    -*/
    -pointT *qh_getcentrum(qhT *qh, facetT *facet) {
    -  realT dist;
    -  pointT *centrum, *point;
    -
    -  point= qh_getcenter(qh, facet->vertices);
    -  zzinc_(Zcentrumtests);
    -  qh_distplane(qh, point, facet, &dist);
    -  centrum= qh_projectpoint(qh, point, facet, dist);
    -  qh_memfree(qh, point, qh->normal_size);
    -  trace4((qh, qh->ferr, 4007, "qh_getcentrum: for f%d, %d vertices dist= %2.2g\n",
    -          facet->id, qh_setsize(qh, facet->vertices), dist));
    -  return centrum;
    -} /* getcentrum */
    -
    -
    -/*---------------------------------
    -
    -  qh_getdistance(qh, facet, neighbor, mindist, maxdist )
    -    returns the maxdist and mindist distance of any vertex from neighbor
    -
    -  returns:
    -    the max absolute value
    -
    -  design:
    -    for each vertex of facet that is not in neighbor
    -      test the distance from vertex to neighbor
    -*/
    -realT qh_getdistance(qhT *qh, facetT *facet, facetT *neighbor, realT *mindist, realT *maxdist) {
    -  vertexT *vertex, **vertexp;
    -  realT dist, maxd, mind;
    -
    -  FOREACHvertex_(facet->vertices)
    -    vertex->seen= False;
    -  FOREACHvertex_(neighbor->vertices)
    -    vertex->seen= True;
    -  mind= 0.0;
    -  maxd= 0.0;
    -  FOREACHvertex_(facet->vertices) {
    -    if (!vertex->seen) {
    -      zzinc_(Zbestdist);
    -      qh_distplane(qh, vertex->point, neighbor, &dist);
    -      if (dist < mind)
    -        mind= dist;
    -      else if (dist > maxd)
    -        maxd= dist;
    -    }
    -  }
    -  *mindist= mind;
    -  *maxdist= maxd;
    -  mind= -mind;
    -  if (maxd > mind)
    -    return maxd;
    -  else
    -    return mind;
    -} /* getdistance */
    -
    -
    -/*---------------------------------
    -
    -  qh_normalize(qh, normal, dim, toporient )
    -    normalize a vector and report if too small
    -    does not use min norm
    -
    -  see:
    -    qh_normalize2
    -*/
    -void qh_normalize(qhT *qh, coordT *normal, int dim, boolT toporient) {
    -  qh_normalize2(qh, normal, dim, toporient, NULL, NULL);
    -} /* normalize */
    -
    -/*---------------------------------
    -
    -  qh_normalize2(qh, normal, dim, toporient, minnorm, ismin )
    -    normalize a vector and report if too small
    -    qh.MINdenom/MINdenom1 are the upper limits for divide overflow
    -
    -  returns:
    -    normalized vector
    -    flips sign if !toporient
    -    if minnorm non-NULL,
    -      sets ismin if normal < minnorm
    -
    -  notes:
    -    if zero norm
    -       sets all elements to sqrt(1.0/dim)
    -    if divide by zero (divzero())
    -       sets largest element to   +/-1
    -       bumps Znearlysingular
    -
    -  design:
    -    computes norm
    -    test for minnorm
    -    if not near zero
    -      normalizes normal
    -    else if zero norm
    -      sets normal to standard value
    -    else
    -      uses qh_divzero to normalize
    -      if nearzero
    -        sets norm to direction of maximum value
    -*/
    -void qh_normalize2(qhT *qh, coordT *normal, int dim, boolT toporient,
    -            realT *minnorm, boolT *ismin) {
    -  int k;
    -  realT *colp, *maxp, norm= 0, temp, *norm1, *norm2, *norm3;
    -  boolT zerodiv;
    -
    -  norm1= normal+1;
    -  norm2= normal+2;
    -  norm3= normal+3;
    -  if (dim == 2)
    -    norm= sqrt((*normal)*(*normal) + (*norm1)*(*norm1));
    -  else if (dim == 3)
    -    norm= sqrt((*normal)*(*normal) + (*norm1)*(*norm1) + (*norm2)*(*norm2));
    -  else if (dim == 4) {
    -    norm= sqrt((*normal)*(*normal) + (*norm1)*(*norm1) + (*norm2)*(*norm2)
    -               + (*norm3)*(*norm3));
    -  }else if (dim > 4) {
    -    norm= (*normal)*(*normal) + (*norm1)*(*norm1) + (*norm2)*(*norm2)
    -               + (*norm3)*(*norm3);
    -    for (k=dim-4, colp=normal+4; k--; colp++)
    -      norm += (*colp) * (*colp);
    -    norm= sqrt(norm);
    -  }
    -  if (minnorm) {
    -    if (norm < *minnorm)
    -      *ismin= True;
    -    else
    -      *ismin= False;
    -  }
    -  wmin_(Wmindenom, norm);
    -  if (norm > qh->MINdenom) {
    -    if (!toporient)
    -      norm= -norm;
    -    *normal /= norm;
    -    *norm1 /= norm;
    -    if (dim == 2)
    -      ; /* all done */
    -    else if (dim == 3)
    -      *norm2 /= norm;
    -    else if (dim == 4) {
    -      *norm2 /= norm;
    -      *norm3 /= norm;
    -    }else if (dim >4) {
    -      *norm2 /= norm;
    -      *norm3 /= norm;
    -      for (k=dim-4, colp=normal+4; k--; )
    -        *colp++ /= norm;
    -    }
    -  }else if (norm == 0.0) {
    -    temp= sqrt(1.0/dim);
    -    for (k=dim, colp=normal; k--; )
    -      *colp++ = temp;
    -  }else {
    -    if (!toporient)
    -      norm= -norm;
    -    for (k=dim, colp=normal; k--; colp++) { /* k used below */
    -      temp= qh_divzero(*colp, norm, qh->MINdenom_1, &zerodiv);
    -      if (!zerodiv)
    -        *colp= temp;
    -      else {
    -        maxp= qh_maxabsval(normal, dim);
    -        temp= ((*maxp * norm >= 0.0) ? 1.0 : -1.0);
    -        for (k=dim, colp=normal; k--; colp++)
    -          *colp= 0.0;
    -        *maxp= temp;
    -        zzinc_(Znearlysingular);
    -        trace0((qh, qh->ferr, 1, "qh_normalize: norm=%2.2g too small during p%d\n",
    -               norm, qh->furthest_id));
    -        return;
    -      }
    -    }
    -  }
    -} /* normalize */
    -
    -
    -/*---------------------------------
    -
    -  qh_projectpoint(qh, point, facet, dist )
    -    project point onto a facet by dist
    -
    -  returns:
    -    returns a new point
    -
    -  notes:
    -    if dist= distplane(point,facet)
    -      this projects point to hyperplane
    -    assumes qh_memfree_() is valid for normal_size
    -*/
    -pointT *qh_projectpoint(qhT *qh, pointT *point, facetT *facet, realT dist) {
    -  pointT *newpoint, *np, *normal;
    -  int normsize= qh->normal_size;
    -  int k;
    -  void **freelistp; /* used if !qh_NOmem by qh_memalloc_() */
    -
    -  qh_memalloc_(qh, normsize, freelistp, newpoint, pointT);
    -  np= newpoint;
    -  normal= facet->normal;
    -  for (k=qh->hull_dim; k--; )
    -    *(np++)= *point++ - dist * *normal++;
    -  return(newpoint);
    -} /* projectpoint */
    -
    -
    -/*---------------------------------
    -
    -  qh_setfacetplane(qh, facet )
    -    sets the hyperplane for a facet
    -    if qh.RANDOMdist, joggles hyperplane
    -
    -  notes:
    -    uses global buffers qh.gm_matrix and qh.gm_row
    -    overwrites facet->normal if already defined
    -    updates Wnewvertex if PRINTstatistics
    -    sets facet->upperdelaunay if upper envelope of Delaunay triangulation
    -
    -  design:
    -    copy vertex coordinates to qh.gm_matrix/gm_row
    -    compute determinate
    -    if nearzero
    -      recompute determinate with gaussian elimination
    -      if nearzero
    -        force outside orientation by testing interior point
    -*/
    -void qh_setfacetplane(qhT *qh, facetT *facet) {
    -  pointT *point;
    -  vertexT *vertex, **vertexp;
    -  int normsize= qh->normal_size;
    -  int k,i, oldtrace= 0;
    -  realT dist;
    -  void **freelistp; /* used if !qh_NOmem by qh_memalloc_() */
    -  coordT *coord, *gmcoord;
    -  pointT *point0= SETfirstt_(facet->vertices, vertexT)->point;
    -  boolT nearzero= False;
    -
    -  zzinc_(Zsetplane);
    -  if (!facet->normal)
    -    qh_memalloc_(qh, normsize, freelistp, facet->normal, coordT);
    -  if (facet == qh->tracefacet) {
    -    oldtrace= qh->IStracing;
    -    qh->IStracing= 5;
    -    qh_fprintf(qh, qh->ferr, 8012, "qh_setfacetplane: facet f%d created.\n", facet->id);
    -    qh_fprintf(qh, qh->ferr, 8013, "  Last point added to hull was p%d.", qh->furthest_id);
    -    if (zzval_(Ztotmerge))
    -      qh_fprintf(qh, qh->ferr, 8014, "  Last merge was #%d.", zzval_(Ztotmerge));
    -    qh_fprintf(qh, qh->ferr, 8015, "\n\nCurrent summary is:\n");
    -      qh_printsummary(qh, qh->ferr);
    -  }
    -  if (qh->hull_dim <= 4) {
    -    i= 0;
    -    if (qh->RANDOMdist) {
    -      gmcoord= qh->gm_matrix;
    -      FOREACHvertex_(facet->vertices) {
    -        qh->gm_row[i++]= gmcoord;
    -        coord= vertex->point;
    -        for (k=qh->hull_dim; k--; )
    -          *(gmcoord++)= *coord++ * qh_randomfactor(qh, qh->RANDOMa, qh->RANDOMb);
    -      }
    -    }else {
    -      FOREACHvertex_(facet->vertices)
    -       qh->gm_row[i++]= vertex->point;
    -    }
    -    qh_sethyperplane_det(qh, qh->hull_dim, qh->gm_row, point0, facet->toporient,
    -                facet->normal, &facet->offset, &nearzero);
    -  }
    -  if (qh->hull_dim > 4 || nearzero) {
    -    i= 0;
    -    gmcoord= qh->gm_matrix;
    -    FOREACHvertex_(facet->vertices) {
    -      if (vertex->point != point0) {
    -        qh->gm_row[i++]= gmcoord;
    -        coord= vertex->point;
    -        point= point0;
    -        for (k=qh->hull_dim; k--; )
    -          *(gmcoord++)= *coord++ - *point++;
    -      }
    -    }
    -    qh->gm_row[i]= gmcoord;  /* for areasimplex */
    -    if (qh->RANDOMdist) {
    -      gmcoord= qh->gm_matrix;
    -      for (i=qh->hull_dim-1; i--; ) {
    -        for (k=qh->hull_dim; k--; )
    -          *(gmcoord++) *= qh_randomfactor(qh, qh->RANDOMa, qh->RANDOMb);
    -      }
    -    }
    -    qh_sethyperplane_gauss(qh, qh->hull_dim, qh->gm_row, point0, facet->toporient,
    -                facet->normal, &facet->offset, &nearzero);
    -    if (nearzero) {
    -      if (qh_orientoutside(qh, facet)) {
    -        trace0((qh, qh->ferr, 2, "qh_setfacetplane: flipped orientation after testing interior_point during p%d\n", qh->furthest_id));
    -      /* this is part of using Gaussian Elimination.  For example in 5-d
    -           1 1 1 1 0
    -           1 1 1 1 1
    -           0 0 0 1 0
    -           0 1 0 0 0
    -           1 0 0 0 0
    -           norm= 0.38 0.38 -0.76 0.38 0
    -         has a determinate of 1, but g.e. after subtracting pt. 0 has
    -         0's in the diagonal, even with full pivoting.  It does work
    -         if you subtract pt. 4 instead. */
    -      }
    -    }
    -  }
    -  facet->upperdelaunay= False;
    -  if (qh->DELAUNAY) {
    -    if (qh->UPPERdelaunay) {     /* matches qh_triangulate_facet and qh.lower_threshold in qh_initbuild */
    -      if (facet->normal[qh->hull_dim -1] >= qh->ANGLEround * qh_ZEROdelaunay)
    -        facet->upperdelaunay= True;
    -    }else {
    -      if (facet->normal[qh->hull_dim -1] > -qh->ANGLEround * qh_ZEROdelaunay)
    -        facet->upperdelaunay= True;
    -    }
    -  }
    -  if (qh->PRINTstatistics || qh->IStracing || qh->TRACElevel || qh->JOGGLEmax < REALmax) {
    -    qh->old_randomdist= qh->RANDOMdist;
    -    qh->RANDOMdist= False;
    -    FOREACHvertex_(facet->vertices) {
    -      if (vertex->point != point0) {
    -        boolT istrace= False;
    -        zinc_(Zdiststat);
    -        qh_distplane(qh, vertex->point, facet, &dist);
    -        dist= fabs_(dist);
    -        zinc_(Znewvertex);
    -        wadd_(Wnewvertex, dist);
    -        if (dist > wwval_(Wnewvertexmax)) {
    -          wwval_(Wnewvertexmax)= dist;
    -          if (dist > qh->max_outside) {
    -            qh->max_outside= dist;  /* used by qh_maxouter(qh) */
    -            if (dist > qh->TRACEdist)
    -              istrace= True;
    -          }
    -        }else if (-dist > qh->TRACEdist)
    -          istrace= True;
    -        if (istrace) {
    -          qh_fprintf(qh, qh->ferr, 8016, "qh_setfacetplane: ====== vertex p%d(v%d) increases max_outside to %2.2g for new facet f%d last p%d\n",
    -                qh_pointid(qh, vertex->point), vertex->id, dist, facet->id, qh->furthest_id);
    -          qh_errprint(qh, "DISTANT", facet, NULL, NULL, NULL);
    -        }
    -      }
    -    }
    -    qh->RANDOMdist= qh->old_randomdist;
    -  }
    -  if (qh->IStracing >= 3) {
    -    qh_fprintf(qh, qh->ferr, 8017, "qh_setfacetplane: f%d offset %2.2g normal: ",
    -             facet->id, facet->offset);
    -    for (k=0; k < qh->hull_dim; k++)
    -      qh_fprintf(qh, qh->ferr, 8018, "%2.2g ", facet->normal[k]);
    -    qh_fprintf(qh, qh->ferr, 8019, "\n");
    -  }
    -  if (facet == qh->tracefacet)
    -    qh->IStracing= oldtrace;
    -} /* setfacetplane */
    -
    -
    -/*---------------------------------
    -
    -  qh_sethyperplane_det(qh, dim, rows, point0, toporient, normal, offset, nearzero )
    -    given dim X dim array indexed by rows[], one row per point,
    -        toporient(flips all signs),
    -        and point0 (any row)
    -    set normalized hyperplane equation from oriented simplex
    -
    -  returns:
    -    normal (normalized)
    -    offset (places point0 on the hyperplane)
    -    sets nearzero if hyperplane not through points
    -
    -  notes:
    -    only defined for dim == 2..4
    -    rows[] is not modified
    -    solves det(P-V_0, V_n-V_0, ..., V_1-V_0)=0, i.e. every point is on hyperplane
    -    see Bower & Woodworth, A programmer's geometry, Butterworths 1983.
    -
    -  derivation of 3-d minnorm
    -    Goal: all vertices V_i within qh.one_merge of hyperplane
    -    Plan: exactly translate the facet so that V_0 is the origin
    -          exactly rotate the facet so that V_1 is on the x-axis and y_2=0.
    -          exactly rotate the effective perturbation to only effect n_0
    -             this introduces a factor of sqrt(3)
    -    n_0 = ((y_2-y_0)*(z_1-z_0) - (z_2-z_0)*(y_1-y_0)) / norm
    -    Let M_d be the max coordinate difference
    -    Let M_a be the greater of M_d and the max abs. coordinate
    -    Let u be machine roundoff and distround be max error for distance computation
    -    The max error for n_0 is sqrt(3) u M_a M_d / norm.  n_1 is approx. 1 and n_2 is approx. 0
    -    The max error for distance of V_1 is sqrt(3) u M_a M_d M_d / norm.  Offset=0 at origin
    -    Then minnorm = 1.8 u M_a M_d M_d / qh.ONEmerge
    -    Note that qh.one_merge is approx. 45.5 u M_a and norm is usually about M_d M_d
    -
    -  derivation of 4-d minnorm
    -    same as above except rotate the facet so that V_1 on x-axis and w_2, y_3, w_3=0
    -     [if two vertices fixed on x-axis, can rotate the other two in yzw.]
    -    n_0 = det3_(...) = y_2 det2_(z_1, w_1, z_3, w_3) = - y_2 w_1 z_3
    -     [all other terms contain at least two factors nearly zero.]
    -    The max error for n_0 is sqrt(4) u M_a M_d M_d / norm
    -    Then minnorm = 2 u M_a M_d M_d M_d / qh.ONEmerge
    -    Note that qh.one_merge is approx. 82 u M_a and norm is usually about M_d M_d M_d
    -*/
    -void qh_sethyperplane_det(qhT *qh, int dim, coordT **rows, coordT *point0,
    -          boolT toporient, coordT *normal, realT *offset, boolT *nearzero) {
    -  realT maxround, dist;
    -  int i;
    -  pointT *point;
    -
    -
    -  if (dim == 2) {
    -    normal[0]= dY(1,0);
    -    normal[1]= dX(0,1);
    -    qh_normalize2(qh, normal, dim, toporient, NULL, NULL);
    -    *offset= -(point0[0]*normal[0]+point0[1]*normal[1]);
    -    *nearzero= False;  /* since nearzero norm => incident points */
    -  }else if (dim == 3) {
    -    normal[0]= det2_(dY(2,0), dZ(2,0),
    -                     dY(1,0), dZ(1,0));
    -    normal[1]= det2_(dX(1,0), dZ(1,0),
    -                     dX(2,0), dZ(2,0));
    -    normal[2]= det2_(dX(2,0), dY(2,0),
    -                     dX(1,0), dY(1,0));
    -    qh_normalize2(qh, normal, dim, toporient, NULL, NULL);
    -    *offset= -(point0[0]*normal[0] + point0[1]*normal[1]
    -               + point0[2]*normal[2]);
    -    maxround= qh->DISTround;
    -    for (i=dim; i--; ) {
    -      point= rows[i];
    -      if (point != point0) {
    -        dist= *offset + (point[0]*normal[0] + point[1]*normal[1]
    -               + point[2]*normal[2]);
    -        if (dist > maxround || dist < -maxround) {
    -          *nearzero= True;
    -          break;
    -        }
    -      }
    -    }
    -  }else if (dim == 4) {
    -    normal[0]= - det3_(dY(2,0), dZ(2,0), dW(2,0),
    -                        dY(1,0), dZ(1,0), dW(1,0),
    -                        dY(3,0), dZ(3,0), dW(3,0));
    -    normal[1]=   det3_(dX(2,0), dZ(2,0), dW(2,0),
    -                        dX(1,0), dZ(1,0), dW(1,0),
    -                        dX(3,0), dZ(3,0), dW(3,0));
    -    normal[2]= - det3_(dX(2,0), dY(2,0), dW(2,0),
    -                        dX(1,0), dY(1,0), dW(1,0),
    -                        dX(3,0), dY(3,0), dW(3,0));
    -    normal[3]=   det3_(dX(2,0), dY(2,0), dZ(2,0),
    -                        dX(1,0), dY(1,0), dZ(1,0),
    -                        dX(3,0), dY(3,0), dZ(3,0));
    -    qh_normalize2(qh, normal, dim, toporient, NULL, NULL);
    -    *offset= -(point0[0]*normal[0] + point0[1]*normal[1]
    -               + point0[2]*normal[2] + point0[3]*normal[3]);
    -    maxround= qh->DISTround;
    -    for (i=dim; i--; ) {
    -      point= rows[i];
    -      if (point != point0) {
    -        dist= *offset + (point[0]*normal[0] + point[1]*normal[1]
    -               + point[2]*normal[2] + point[3]*normal[3]);
    -        if (dist > maxround || dist < -maxround) {
    -          *nearzero= True;
    -          break;
    -        }
    -      }
    -    }
    -  }
    -  if (*nearzero) {
    -    zzinc_(Zminnorm);
    -    trace0((qh, qh->ferr, 3, "qh_sethyperplane_det: degenerate norm during p%d.\n", qh->furthest_id));
    -    zzinc_(Znearlysingular);
    -  }
    -} /* sethyperplane_det */
    -
    -
    -/*---------------------------------
    -
    -  qh_sethyperplane_gauss(qh, dim, rows, point0, toporient, normal, offset, nearzero )
    -    given(dim-1) X dim array of rows[i]= V_{i+1} - V_0 (point0)
    -    set normalized hyperplane equation from oriented simplex
    -
    -  returns:
    -    normal (normalized)
    -    offset (places point0 on the hyperplane)
    -
    -  notes:
    -    if nearzero
    -      orientation may be incorrect because of incorrect sign flips in gausselim
    -    solves [V_n-V_0,...,V_1-V_0, 0 .. 0 1] * N == [0 .. 0 1]
    -        or [V_n-V_0,...,V_1-V_0, 0 .. 0 1] * N == [0]
    -    i.e., N is normal to the hyperplane, and the unnormalized
    -        distance to [0 .. 1] is either 1 or   0
    -
    -  design:
    -    perform gaussian elimination
    -    flip sign for negative values
    -    perform back substitution
    -    normalize result
    -    compute offset
    -*/
    -void qh_sethyperplane_gauss(qhT *qh, int dim, coordT **rows, pointT *point0,
    -                boolT toporient, coordT *normal, coordT *offset, boolT *nearzero) {
    -  coordT *pointcoord, *normalcoef;
    -  int k;
    -  boolT sign= toporient, nearzero2= False;
    -
    -  qh_gausselim(qh, rows, dim-1, dim, &sign, nearzero);
    -  for (k=dim-1; k--; ) {
    -    if ((rows[k])[k] < 0)
    -      sign ^= 1;
    -  }
    -  if (*nearzero) {
    -    zzinc_(Znearlysingular);
    -    trace0((qh, qh->ferr, 4, "qh_sethyperplane_gauss: nearly singular or axis parallel hyperplane during p%d.\n", qh->furthest_id));
    -    qh_backnormal(qh, rows, dim-1, dim, sign, normal, &nearzero2);
    -  }else {
    -    qh_backnormal(qh, rows, dim-1, dim, sign, normal, &nearzero2);
    -    if (nearzero2) {
    -      zzinc_(Znearlysingular);
    -      trace0((qh, qh->ferr, 5, "qh_sethyperplane_gauss: singular or axis parallel hyperplane at normalization during p%d.\n", qh->furthest_id));
    -    }
    -  }
    -  if (nearzero2)
    -    *nearzero= True;
    -  qh_normalize2(qh, normal, dim, True, NULL, NULL);
    -  pointcoord= point0;
    -  normalcoef= normal;
    -  *offset= -(*pointcoord++ * *normalcoef++);
    -  for (k=dim-1; k--; )
    -    *offset -= *pointcoord++ * *normalcoef++;
    -} /* sethyperplane_gauss */
    -
    -
    -
    diff --git a/src/qhull/src/libqhull_r/geom_r.h b/src/qhull/src/libqhull_r/geom_r.h
    deleted file mode 100644
    index d73e9534531..00000000000
    --- a/src/qhull/src/libqhull_r/geom_r.h
    +++ /dev/null
    @@ -1,184 +0,0 @@
    -/*
      ---------------------------------
    -
    -  geom_r.h
    -    header file for geometric routines
    -
    -   see qh-geom_r.htm and geom_r.c
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull_r/geom_r.h#3 $$Change: 2079 $
    -   $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -*/
    -
    -#ifndef qhDEFgeom
    -#define qhDEFgeom 1
    -
    -#include "libqhull_r.h"
    -
    -/* ============ -macros- ======================== */
    -
    -/*----------------------------------
    -
    -  fabs_(a)
    -    returns the absolute value of a
    -*/
    -#define fabs_( a ) ((( a ) < 0 ) ? -( a ):( a ))
    -
    -/*----------------------------------
    -
    -  fmax_(a,b)
    -    returns the maximum value of a and b
    -*/
    -#define fmax_( a,b )  ( ( a ) < ( b ) ? ( b ) : ( a ) )
    -
    -/*----------------------------------
    -
    -  fmin_(a,b)
    -    returns the minimum value of a and b
    -*/
    -#define fmin_( a,b )  ( ( a ) > ( b ) ? ( b ) : ( a ) )
    -
    -/*----------------------------------
    -
    -  maximize_(maxval, val)
    -    set maxval to val if val is greater than maxval
    -*/
    -#define maximize_( maxval, val ) { if (( maxval ) < ( val )) ( maxval )= ( val ); }
    -
    -/*----------------------------------
    -
    -  minimize_(minval, val)
    -    set minval to val if val is less than minval
    -*/
    -#define minimize_( minval, val ) { if (( minval ) > ( val )) ( minval )= ( val ); }
    -
    -/*----------------------------------
    -
    -  det2_(a1, a2,
    -        b1, b2)
    -
    -    compute a 2-d determinate
    -*/
    -#define det2_( a1,a2,b1,b2 ) (( a1 )*( b2 ) - ( a2 )*( b1 ))
    -
    -/*----------------------------------
    -
    -  det3_(a1, a2, a3,
    -       b1, b2, b3,
    -       c1, c2, c3)
    -
    -    compute a 3-d determinate
    -*/
    -#define det3_( a1,a2,a3,b1,b2,b3,c1,c2,c3 ) ( ( a1 )*det2_( b2,b3,c2,c3 ) \
    -                - ( b1 )*det2_( a2,a3,c2,c3 ) + ( c1 )*det2_( a2,a3,b2,b3 ) )
    -
    -/*----------------------------------
    -
    -  dX( p1, p2 )
    -  dY( p1, p2 )
    -  dZ( p1, p2 )
    -
    -    given two indices into rows[],
    -
    -    compute the difference between X, Y, or Z coordinates
    -*/
    -#define dX( p1,p2 )  ( *( rows[p1] ) - *( rows[p2] ))
    -#define dY( p1,p2 )  ( *( rows[p1]+1 ) - *( rows[p2]+1 ))
    -#define dZ( p1,p2 )  ( *( rows[p1]+2 ) - *( rows[p2]+2 ))
    -#define dW( p1,p2 )  ( *( rows[p1]+3 ) - *( rows[p2]+3 ))
    -
    -/*============= prototypes in alphabetical order, infrequent at end ======= */
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -void    qh_backnormal(qhT *qh, realT **rows, int numrow, int numcol, boolT sign, coordT *normal, boolT *nearzero);
    -void    qh_distplane(qhT *qh, pointT *point, facetT *facet, realT *dist);
    -facetT *qh_findbest(qhT *qh, pointT *point, facetT *startfacet,
    -                     boolT bestoutside, boolT isnewfacets, boolT noupper,
    -                     realT *dist, boolT *isoutside, int *numpart);
    -facetT *qh_findbesthorizon(qhT *qh, boolT ischeckmax, pointT *point,
    -                     facetT *startfacet, boolT noupper, realT *bestdist, int *numpart);
    -facetT *qh_findbestnew(qhT *qh, pointT *point, facetT *startfacet, realT *dist,
    -                     boolT bestoutside, boolT *isoutside, int *numpart);
    -void    qh_gausselim(qhT *qh, realT **rows, int numrow, int numcol, boolT *sign, boolT *nearzero);
    -realT   qh_getangle(qhT *qh, pointT *vect1, pointT *vect2);
    -pointT *qh_getcenter(qhT *qh, setT *vertices);
    -pointT *qh_getcentrum(qhT *qh, facetT *facet);
    -realT   qh_getdistance(qhT *qh, facetT *facet, facetT *neighbor, realT *mindist, realT *maxdist);
    -void    qh_normalize(qhT *qh, coordT *normal, int dim, boolT toporient);
    -void    qh_normalize2(qhT *qh, coordT *normal, int dim, boolT toporient,
    -            realT *minnorm, boolT *ismin);
    -pointT *qh_projectpoint(qhT *qh, pointT *point, facetT *facet, realT dist);
    -
    -void    qh_setfacetplane(qhT *qh, facetT *newfacets);
    -void    qh_sethyperplane_det(qhT *qh, int dim, coordT **rows, coordT *point0,
    -              boolT toporient, coordT *normal, realT *offset, boolT *nearzero);
    -void    qh_sethyperplane_gauss(qhT *qh, int dim, coordT **rows, pointT *point0,
    -             boolT toporient, coordT *normal, coordT *offset, boolT *nearzero);
    -boolT   qh_sharpnewfacets(qhT *qh);
    -
    -/*========= infrequently used code in geom2_r.c =============*/
    -
    -coordT *qh_copypoints(qhT *qh, coordT *points, int numpoints, int dimension);
    -void    qh_crossproduct(int dim, realT vecA[3], realT vecB[3], realT vecC[3]);
    -realT   qh_determinant(qhT *qh, realT **rows, int dim, boolT *nearzero);
    -realT   qh_detjoggle(qhT *qh, pointT *points, int numpoints, int dimension);
    -void    qh_detroundoff(qhT *qh);
    -realT   qh_detsimplex(qhT *qh, pointT *apex, setT *points, int dim, boolT *nearzero);
    -realT   qh_distnorm(int dim, pointT *point, pointT *normal, realT *offsetp);
    -realT   qh_distround(qhT *qh, int dimension, realT maxabs, realT maxsumabs);
    -realT   qh_divzero(realT numer, realT denom, realT mindenom1, boolT *zerodiv);
    -realT   qh_facetarea(qhT *qh, facetT *facet);
    -realT   qh_facetarea_simplex(qhT *qh, int dim, coordT *apex, setT *vertices,
    -          vertexT *notvertex,  boolT toporient, coordT *normal, realT *offset);
    -pointT *qh_facetcenter(qhT *qh, setT *vertices);
    -facetT *qh_findgooddist(qhT *qh, pointT *point, facetT *facetA, realT *distp, facetT **facetlist);
    -void    qh_getarea(qhT *qh, facetT *facetlist);
    -boolT   qh_gram_schmidt(qhT *qh, int dim, realT **rows);
    -boolT   qh_inthresholds(qhT *qh, coordT *normal, realT *angle);
    -void    qh_joggleinput(qhT *qh);
    -realT  *qh_maxabsval(realT *normal, int dim);
    -setT   *qh_maxmin(qhT *qh, pointT *points, int numpoints, int dimension);
    -realT   qh_maxouter(qhT *qh);
    -void    qh_maxsimplex(qhT *qh, int dim, setT *maxpoints, pointT *points, int numpoints, setT **simplex);
    -realT   qh_minabsval(realT *normal, int dim);
    -int     qh_mindiff(realT *vecA, realT *vecB, int dim);
    -boolT   qh_orientoutside(qhT *qh, facetT *facet);
    -void    qh_outerinner(qhT *qh, facetT *facet, realT *outerplane, realT *innerplane);
    -coordT  qh_pointdist(pointT *point1, pointT *point2, int dim);
    -void    qh_printmatrix(qhT *qh, FILE *fp, const char *string, realT **rows, int numrow, int numcol);
    -void    qh_printpoints(qhT *qh, FILE *fp, const char *string, setT *points);
    -void    qh_projectinput(qhT *qh);
    -void    qh_projectpoints(qhT *qh, signed char *project, int n, realT *points,
    -             int numpoints, int dim, realT *newpoints, int newdim);
    -void    qh_rotateinput(qhT *qh, realT **rows);
    -void    qh_rotatepoints(qhT *qh, realT *points, int numpoints, int dim, realT **rows);
    -void    qh_scaleinput(qhT *qh);
    -void    qh_scalelast(qhT *qh, coordT *points, int numpoints, int dim, coordT low,
    -                   coordT high, coordT newhigh);
    -void    qh_scalepoints(qhT *qh, pointT *points, int numpoints, int dim,
    -                realT *newlows, realT *newhighs);
    -boolT   qh_sethalfspace(qhT *qh, int dim, coordT *coords, coordT **nextp,
    -              coordT *normal, coordT *offset, coordT *feasible);
    -coordT *qh_sethalfspace_all(qhT *qh, int dim, int count, coordT *halfspaces, pointT *feasible);
    -pointT *qh_voronoi_center(qhT *qh, int dim, setT *points);
    -
    -#ifdef __cplusplus
    -} /* extern "C"*/
    -#endif
    -
    -#endif /* qhDEFgeom */
    -
    -
    -
    diff --git a/src/qhull/src/libqhull_r/global_r.c b/src/qhull/src/libqhull_r/global_r.c
    deleted file mode 100644
    index eef465ca146..00000000000
    --- a/src/qhull/src/libqhull_r/global_r.c
    +++ /dev/null
    @@ -1,2100 +0,0 @@
    -
    -/*
      ---------------------------------
    -
    -   global_r.c
    -   initializes all the globals of the qhull application
    -
    -   see README
    -
    -   see libqhull_r.h for qh.globals and function prototypes
    -
    -   see qhull_ra.h for internal functions
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull_r/global_r.c#16 $$Change: 2066 $
    -   $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    - */
    -
    -#include "qhull_ra.h"
    -
    -/*========= qh->definition -- globals defined in libqhull_r.h =======================*/
    -
    -/*----------------------------------
    -
    -  qh_version
    -    version string by year and date
    -    qh_version2 for Unix users and -V
    -
    -    the revision increases on code changes only
    -
    -  notes:
    -    change date:    Changes.txt, Announce.txt, index.htm, README.txt,
    -                    qhull-news.html, Eudora signatures, CMakeLists.txt
    -    change version: README.txt, qh-get.htm, File_id.diz, Makefile.txt, CMakeLists.txt
    -    check that CmakeLists @version is the same as qh_version2
    -    change year:    Copying.txt
    -    check download size
    -    recompile user_eg_r.c, rbox_r.c, libqhull_r.c, qconvex_r.c, qdelaun_r.c qvoronoi_r.c, qhalf_r.c, testqset_r.c
    -*/
    -
    -const char qh_version[]= "2015.2.r 2016/01/18";
    -const char qh_version2[]= "qhull_r 7.2.0 (2015.2.r 2016/01/18)";
    -
    -/*---------------------------------
    -
    -  qh_appendprint(qh, printFormat )
    -    append printFormat to qh.PRINTout unless already defined
    -*/
    -void qh_appendprint(qhT *qh, qh_PRINT format) {
    -  int i;
    -
    -  for (i=0; i < qh_PRINTEND; i++) {
    -    if (qh->PRINTout[i] == format && format != qh_PRINTqhull)
    -      break;
    -    if (!qh->PRINTout[i]) {
    -      qh->PRINTout[i]= format;
    -      break;
    -    }
    -  }
    -} /* appendprint */
    -
    -/*---------------------------------
    -
    -  qh_checkflags(qh, commandStr, hiddenFlags )
    -    errors if commandStr contains hiddenFlags
    -    hiddenFlags starts and ends with a space and is space delimited (checked)
    -
    -  notes:
    -    ignores first word (e.g., "qconvex i")
    -    use qh_strtol/strtod since strtol/strtod may or may not skip trailing spaces
    -
    -  see:
    -    qh_initflags() initializes Qhull according to commandStr
    -*/
    -void qh_checkflags(qhT *qh, char *command, char *hiddenflags) {
    -  char *s= command, *t, *chkerr; /* qh_skipfilename is non-const */
    -  char key, opt, prevopt;
    -  char chkkey[]= "   ";
    -  char chkopt[]=  "    ";
    -  char chkopt2[]= "     ";
    -  boolT waserr= False;
    -
    -  if (*hiddenflags != ' ' || hiddenflags[strlen(hiddenflags)-1] != ' ') {
    -    qh_fprintf(qh, qh->ferr, 6026, "qhull error (qh_checkflags): hiddenflags must start and end with a space: \"%s\"", hiddenflags);
    -    qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -  }
    -  if (strpbrk(hiddenflags, ",\n\r\t")) {
    -    qh_fprintf(qh, qh->ferr, 6027, "qhull error (qh_checkflags): hiddenflags contains commas, newlines, or tabs: \"%s\"", hiddenflags);
    -    qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -  }
    -  while (*s && !isspace(*s))  /* skip program name */
    -    s++;
    -  while (*s) {
    -    while (*s && isspace(*s))
    -      s++;
    -    if (*s == '-')
    -      s++;
    -    if (!*s)
    -      break;
    -    key = *s++;
    -    chkerr = NULL;
    -    if (key == 'T' && (*s == 'I' || *s == 'O')) {  /* TI or TO 'file name' */
    -      s= qh_skipfilename(qh, ++s);
    -      continue;
    -    }
    -    chkkey[1]= key;
    -    if (strstr(hiddenflags, chkkey)) {
    -      chkerr= chkkey;
    -    }else if (isupper(key)) {
    -      opt= ' ';
    -      prevopt= ' ';
    -      chkopt[1]= key;
    -      chkopt2[1]= key;
    -      while (!chkerr && *s && !isspace(*s)) {
    -        opt= *s++;
    -        if (isalpha(opt)) {
    -          chkopt[2]= opt;
    -          if (strstr(hiddenflags, chkopt))
    -            chkerr= chkopt;
    -          if (prevopt != ' ') {
    -            chkopt2[2]= prevopt;
    -            chkopt2[3]= opt;
    -            if (strstr(hiddenflags, chkopt2))
    -              chkerr= chkopt2;
    -          }
    -        }else if (key == 'Q' && isdigit(opt) && prevopt != 'b'
    -              && (prevopt == ' ' || islower(prevopt))) {
    -            chkopt[2]= opt;
    -            if (strstr(hiddenflags, chkopt))
    -              chkerr= chkopt;
    -        }else {
    -          qh_strtod(s-1, &t);
    -          if (s < t)
    -            s= t;
    -        }
    -        prevopt= opt;
    -      }
    -    }
    -    if (chkerr) {
    -      *chkerr= '\'';
    -      chkerr[strlen(chkerr)-1]=  '\'';
    -      qh_fprintf(qh, qh->ferr, 6029, "qhull error: option %s is not used with this program.\n             It may be used with qhull.\n", chkerr);
    -      waserr= True;
    -    }
    -  }
    -  if (waserr)
    -    qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -} /* checkflags */
    -
    -/*---------------------------------
    -
    -  qh_clear_outputflags(qh)
    -    Clear output flags for QhullPoints
    -*/
    -void qh_clear_outputflags(qhT *qh) {
    -  int i,k;
    -
    -  qh->ANNOTATEoutput= False;
    -  qh->DOintersections= False;
    -  qh->DROPdim= -1;
    -  qh->FORCEoutput= False;
    -  qh->GETarea= False;
    -  qh->GOODpoint= 0;
    -  qh->GOODpointp= NULL;
    -  qh->GOODthreshold= False;
    -  qh->GOODvertex= 0;
    -  qh->GOODvertexp= NULL;
    -  qh->IStracing= 0;
    -  qh->KEEParea= False;
    -  qh->KEEPmerge= False;
    -  qh->KEEPminArea= REALmax;
    -  qh->PRINTcentrums= False;
    -  qh->PRINTcoplanar= False;
    -  qh->PRINTdots= False;
    -  qh->PRINTgood= False;
    -  qh->PRINTinner= False;
    -  qh->PRINTneighbors= False;
    -  qh->PRINTnoplanes= False;
    -  qh->PRINToptions1st= False;
    -  qh->PRINTouter= False;
    -  qh->PRINTprecision= True;
    -  qh->PRINTridges= False;
    -  qh->PRINTspheres= False;
    -  qh->PRINTstatistics= False;
    -  qh->PRINTsummary= False;
    -  qh->PRINTtransparent= False;
    -  qh->SPLITthresholds= False;
    -  qh->TRACElevel= 0;
    -  qh->TRInormals= False;
    -  qh->USEstdout= False;
    -  qh->VERIFYoutput= False;
    -  for (k=qh->input_dim+1; k--; ) {  /* duplicated in qh_initqhull_buffers and qh_clear_outputflags */
    -    qh->lower_threshold[k]= -REALmax;
    -    qh->upper_threshold[k]= REALmax;
    -    qh->lower_bound[k]= -REALmax;
    -    qh->upper_bound[k]= REALmax;
    -  }
    -
    -  for (i=0; i < qh_PRINTEND; i++) {
    -    qh->PRINTout[i]= qh_PRINTnone;
    -  }
    -
    -  if (!qh->qhull_commandsiz2)
    -      qh->qhull_commandsiz2= (int)strlen(qh->qhull_command); /* WARN64 */
    -  else {
    -      qh->qhull_command[qh->qhull_commandsiz2]= '\0';
    -  }
    -  if (!qh->qhull_optionsiz2)
    -    qh->qhull_optionsiz2= (int)strlen(qh->qhull_options);  /* WARN64 */
    -  else {
    -    qh->qhull_options[qh->qhull_optionsiz2]= '\0';
    -    qh->qhull_optionlen= qh_OPTIONline;  /* start a new line */
    -  }
    -} /* clear_outputflags */
    -
    -/*---------------------------------
    -
    -  qh_clock()
    -    return user CPU time in 100ths (qh_SECtick)
    -    only defined for qh_CLOCKtype == 2
    -
    -  notes:
    -    use first value to determine time 0
    -    from Stevens '92 8.15
    -*/
    -unsigned long qh_clock(qhT *qh) {
    -
    -#if (qh_CLOCKtype == 2)
    -  struct tms time;
    -  static long clktck;  /* initialized first call and never updated */
    -  double ratio, cpu;
    -  unsigned long ticks;
    -
    -  if (!clktck) {
    -    if ((clktck= sysconf(_SC_CLK_TCK)) < 0) {
    -      qh_fprintf(qh, qh->ferr, 6030, "qhull internal error (qh_clock): sysconf() failed.  Use qh_CLOCKtype 1 in user.h\n");
    -      qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -    }
    -  }
    -  if (times(&time) == -1) {
    -    qh_fprintf(qh, qh->ferr, 6031, "qhull internal error (qh_clock): times() failed.  Use qh_CLOCKtype 1 in user.h\n");
    -    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -  }
    -  ratio= qh_SECticks / (double)clktck;
    -  ticks= time.tms_utime * ratio;
    -  return ticks;
    -#else
    -  qh_fprintf(qh, qh->ferr, 6032, "qhull internal error (qh_clock): use qh_CLOCKtype 2 in user.h\n");
    -  qh_errexit(qh, qh_ERRqhull, NULL, NULL); /* never returns */
    -  return 0;
    -#endif
    -} /* clock */
    -
    -/*---------------------------------
    -
    -  qh_freebuffers()
    -    free up global memory buffers
    -
    -  notes:
    -    must match qh_initbuffers()
    -*/
    -void qh_freebuffers(qhT *qh) {
    -
    -  trace5((qh, qh->ferr, 5001, "qh_freebuffers: freeing up global memory buffers\n"));
    -  /* allocated by qh_initqhull_buffers */
    -  qh_memfree(qh, qh->NEARzero, qh->hull_dim * sizeof(realT));
    -  qh_memfree(qh, qh->lower_threshold, (qh->input_dim+1) * sizeof(realT));
    -  qh_memfree(qh, qh->upper_threshold, (qh->input_dim+1) * sizeof(realT));
    -  qh_memfree(qh, qh->lower_bound, (qh->input_dim+1) * sizeof(realT));
    -  qh_memfree(qh, qh->upper_bound, (qh->input_dim+1) * sizeof(realT));
    -  qh_memfree(qh, qh->gm_matrix, (qh->hull_dim+1) * qh->hull_dim * sizeof(coordT));
    -  qh_memfree(qh, qh->gm_row, (qh->hull_dim+1) * sizeof(coordT *));
    -  qh->NEARzero= qh->lower_threshold= qh->upper_threshold= NULL;
    -  qh->lower_bound= qh->upper_bound= NULL;
    -  qh->gm_matrix= NULL;
    -  qh->gm_row= NULL;
    -  qh_setfree(qh, &qh->other_points);
    -  qh_setfree(qh, &qh->del_vertices);
    -  qh_setfree(qh, &qh->coplanarfacetset);
    -  if (qh->line)                /* allocated by qh_readinput, freed if no error */
    -    qh_free(qh->line);
    -  if (qh->half_space)
    -    qh_free(qh->half_space);
    -  if (qh->temp_malloc)
    -    qh_free(qh->temp_malloc);
    -  if (qh->feasible_point)      /* allocated by qh_readfeasible */
    -    qh_free(qh->feasible_point);
    -  if (qh->feasible_string)     /* allocated by qh_initflags */
    -    qh_free(qh->feasible_string);
    -  qh->line= qh->feasible_string= NULL;
    -  qh->half_space= qh->feasible_point= qh->temp_malloc= NULL;
    -  /* usually allocated by qh_readinput */
    -  if (qh->first_point && qh->POINTSmalloc) {
    -    qh_free(qh->first_point);
    -    qh->first_point= NULL;
    -  }
    -  if (qh->input_points && qh->input_malloc) { /* set by qh_joggleinput */
    -    qh_free(qh->input_points);
    -    qh->input_points= NULL;
    -  }
    -  trace5((qh, qh->ferr, 5002, "qh_freebuffers: finished\n"));
    -} /* freebuffers */
    -
    -
    -/*---------------------------------
    -
    -  qh_freebuild(qh, allmem )
    -    free global memory used by qh_initbuild and qh_buildhull
    -    if !allmem,
    -      does not free short memory (e.g., facetT, freed by qh_memfreeshort)
    -
    -  design:
    -    free centrums
    -    free each vertex
    -    mark unattached ridges
    -    for each facet
    -      free ridges
    -      free outside set, coplanar set, neighbor set, ridge set, vertex set
    -      free facet
    -    free hash table
    -    free interior point
    -    free merge set
    -    free temporary sets
    -*/
    -void qh_freebuild(qhT *qh, boolT allmem) {
    -  facetT *facet;
    -  vertexT *vertex;
    -  ridgeT *ridge, **ridgep;
    -  mergeT *merge, **mergep;
    -
    -  trace1((qh, qh->ferr, 1005, "qh_freebuild: free memory from qh_inithull and qh_buildhull\n"));
    -  if (qh->del_vertices)
    -    qh_settruncate(qh, qh->del_vertices, 0);
    -  if (allmem) {
    -    while ((vertex= qh->vertex_list)) {
    -      if (vertex->next)
    -        qh_delvertex(qh, vertex);
    -      else {
    -        qh_memfree(qh, vertex, (int)sizeof(vertexT));
    -        qh->newvertex_list= qh->vertex_list= NULL;
    -      }
    -    }
    -  }else if (qh->VERTEXneighbors) {
    -    FORALLvertices
    -      qh_setfreelong(qh, &(vertex->neighbors));
    -  }
    -  qh->VERTEXneighbors= False;
    -  qh->GOODclosest= NULL;
    -  if (allmem) {
    -    FORALLfacets {
    -      FOREACHridge_(facet->ridges)
    -        ridge->seen= False;
    -    }
    -    FORALLfacets {
    -      if (facet->visible) {
    -        FOREACHridge_(facet->ridges) {
    -          if (!otherfacet_(ridge, facet)->visible)
    -            ridge->seen= True;  /* an unattached ridge */
    -        }
    -      }
    -    }
    -    while ((facet= qh->facet_list)) {
    -      FOREACHridge_(facet->ridges) {
    -        if (ridge->seen) {
    -          qh_setfree(qh, &(ridge->vertices));
    -          qh_memfree(qh, ridge, (int)sizeof(ridgeT));
    -        }else
    -          ridge->seen= True;
    -      }
    -      qh_setfree(qh, &(facet->outsideset));
    -      qh_setfree(qh, &(facet->coplanarset));
    -      qh_setfree(qh, &(facet->neighbors));
    -      qh_setfree(qh, &(facet->ridges));
    -      qh_setfree(qh, &(facet->vertices));
    -      if (facet->next)
    -        qh_delfacet(qh, facet);
    -      else {
    -        qh_memfree(qh, facet, (int)sizeof(facetT));
    -        qh->visible_list= qh->newfacet_list= qh->facet_list= NULL;
    -      }
    -    }
    -  }else {
    -    FORALLfacets {
    -      qh_setfreelong(qh, &(facet->outsideset));
    -      qh_setfreelong(qh, &(facet->coplanarset));
    -      if (!facet->simplicial) {
    -        qh_setfreelong(qh, &(facet->neighbors));
    -        qh_setfreelong(qh, &(facet->ridges));
    -        qh_setfreelong(qh, &(facet->vertices));
    -      }
    -    }
    -  }
    -  qh_setfree(qh, &(qh->hash_table));
    -  qh_memfree(qh, qh->interior_point, qh->normal_size);
    -  qh->interior_point= NULL;
    -  FOREACHmerge_(qh->facet_mergeset)  /* usually empty */
    -    qh_memfree(qh, merge, (int)sizeof(mergeT));
    -  qh->facet_mergeset= NULL;  /* temp set */
    -  qh->degen_mergeset= NULL;  /* temp set */
    -  qh_settempfree_all(qh);
    -} /* freebuild */
    -
    -/*---------------------------------
    -
    -  qh_freeqhull(qh, allmem )
    -
    -  free global memory and set qhT to 0
    -  if !allmem,
    -    does not free short memory (freed by qh_memfreeshort unless qh_NOmem)
    -
    -notes:
    -  sets qh.NOerrexit in case caller forgets to
    -  Does not throw errors
    -
    -see:
    -  see qh_initqhull_start2()
    -  For libqhull_r, qhstatT is part of qhT
    -
    -design:
    -  free global and temporary memory from qh_initbuild and qh_buildhull
    -  free buffers
    -*/
    -void qh_freeqhull(qhT *qh, boolT allmem) {
    -
    -  qh->NOerrexit= True;  /* no more setjmp since called at exit and ~QhullQh */
    -  trace1((qh, qh->ferr, 1006, "qh_freeqhull: free global memory\n"));
    -  qh_freebuild(qh, allmem);
    -  qh_freebuffers(qh);
    -  /* memset is the same in qh_freeqhull() and qh_initqhull_start2() */
    -  memset((char *)qh, 0, sizeof(qhT)-sizeof(qhmemT)-sizeof(qhstatT));
    -  qh->NOerrexit= True;
    -} /* freeqhull2 */
    -
    -/*---------------------------------
    -
    -  qh_init_A(qh, infile, outfile, errfile, argc, argv )
    -    initialize memory and stdio files
    -    convert input options to option string (qh.qhull_command)
    -
    -  notes:
    -    infile may be NULL if qh_readpoints() is not called
    -
    -    errfile should always be defined.  It is used for reporting
    -    errors.  outfile is used for output and format options.
    -
    -    argc/argv may be 0/NULL
    -
    -    called before error handling initialized
    -    qh_errexit() may not be used
    -*/
    -void qh_init_A(qhT *qh, FILE *infile, FILE *outfile, FILE *errfile, int argc, char *argv[]) {
    -  qh_meminit(qh, errfile);
    -  qh_initqhull_start(qh, infile, outfile, errfile);
    -  qh_init_qhull_command(qh, argc, argv);
    -} /* init_A */
    -
    -/*---------------------------------
    -
    -  qh_init_B(qh, points, numpoints, dim, ismalloc )
    -    initialize globals for points array
    -
    -    points has numpoints dim-dimensional points
    -      points[0] is the first coordinate of the first point
    -      points[1] is the second coordinate of the first point
    -      points[dim] is the first coordinate of the second point
    -
    -    ismalloc=True
    -      Qhull will call qh_free(points) on exit or input transformation
    -    ismalloc=False
    -      Qhull will allocate a new point array if needed for input transformation
    -
    -    qh.qhull_command
    -      is the option string.
    -      It is defined by qh_init_B(), qh_qhull_command(), or qh_initflags
    -
    -  returns:
    -    if qh.PROJECTinput or (qh.DELAUNAY and qh.PROJECTdelaunay)
    -      projects the input to a new point array
    -
    -        if qh.DELAUNAY,
    -          qh.hull_dim is increased by one
    -        if qh.ATinfinity,
    -          qh_projectinput adds point-at-infinity for Delaunay tri.
    -
    -    if qh.SCALEinput
    -      changes the upper and lower bounds of the input, see qh_scaleinput(qh)
    -
    -    if qh.ROTATEinput
    -      rotates the input by a random rotation, see qh_rotateinput()
    -      if qh.DELAUNAY
    -        rotates about the last coordinate
    -
    -  notes:
    -    called after points are defined
    -    qh_errexit() may be used
    -*/
    -void qh_init_B(qhT *qh, coordT *points, int numpoints, int dim, boolT ismalloc) {
    -  qh_initqhull_globals(qh, points, numpoints, dim, ismalloc);
    -  if (qh->qhmem.LASTsize == 0)
    -    qh_initqhull_mem(qh);
    -  /* mem_r.c and qset_r.c are initialized */
    -  qh_initqhull_buffers(qh);
    -  qh_initthresholds(qh, qh->qhull_command);
    -  if (qh->PROJECTinput || (qh->DELAUNAY && qh->PROJECTdelaunay))
    -    qh_projectinput(qh);
    -  if (qh->SCALEinput)
    -    qh_scaleinput(qh);
    -  if (qh->ROTATErandom >= 0) {
    -    qh_randommatrix(qh, qh->gm_matrix, qh->hull_dim, qh->gm_row);
    -    if (qh->DELAUNAY) {
    -      int k, lastk= qh->hull_dim-1;
    -      for (k=0; k < lastk; k++) {
    -        qh->gm_row[k][lastk]= 0.0;
    -        qh->gm_row[lastk][k]= 0.0;
    -      }
    -      qh->gm_row[lastk][lastk]= 1.0;
    -    }
    -    qh_gram_schmidt(qh, qh->hull_dim, qh->gm_row);
    -    qh_rotateinput(qh, qh->gm_row);
    -  }
    -} /* init_B */
    -
    -/*---------------------------------
    -
    -  qh_init_qhull_command(qh, argc, argv )
    -    build qh.qhull_command from argc/argv
    -    Calls qh_exit if qhull_command is too short
    -
    -  returns:
    -    a space-delimited string of options (just as typed)
    -
    -  notes:
    -    makes option string easy to input and output
    -
    -    argc/argv may be 0/NULL
    -*/
    -void qh_init_qhull_command(qhT *qh, int argc, char *argv[]) {
    -
    -  if (!qh_argv_to_command(argc, argv, qh->qhull_command, (int)sizeof(qh->qhull_command))){
    -    /* Assumes qh.ferr is defined. */
    -    qh_fprintf(qh, qh->ferr, 6033, "qhull input error: more than %d characters in command line.\n",
    -          (int)sizeof(qh->qhull_command));
    -    qh_exit(qh_ERRinput);  /* error reported, can not use qh_errexit */
    -  }
    -} /* init_qhull_command */
    -
    -/*---------------------------------
    -
    -  qh_initflags(qh, commandStr )
    -    set flags and initialized constants from commandStr
    -    calls qh_exit() if qh->NOerrexit
    -
    -  returns:
    -    sets qh.qhull_command to command if needed
    -
    -  notes:
    -    ignores first word (e.g., "qhull d")
    -    use qh_strtol/strtod since strtol/strtod may or may not skip trailing spaces
    -
    -  see:
    -    qh_initthresholds() continues processing of 'Pdn' and 'PDn'
    -    'prompt' in unix_r.c for documentation
    -
    -  design:
    -    for each space-delimited option group
    -      if top-level option
    -        check syntax
    -        append appropriate option to option string
    -        set appropriate global variable or append printFormat to print options
    -      else
    -        for each sub-option
    -          check syntax
    -          append appropriate option to option string
    -          set appropriate global variable or append printFormat to print options
    -*/
    -void qh_initflags(qhT *qh, char *command) {
    -  int k, i, lastproject;
    -  char *s= command, *t, *prev_s, *start, key;
    -  boolT isgeom= False, wasproject;
    -  realT r;
    -
    -  if(qh->NOerrexit){
    -    qh_fprintf(qh, qh->ferr, 6245, "qhull initflags error: qh.NOerrexit was not cleared before calling qh_initflags().  It should be cleared after setjmp().  Exit qhull.");
    -    qh_exit(6245);
    -  }
    -  if (command <= &qh->qhull_command[0] || command > &qh->qhull_command[0] + sizeof(qh->qhull_command)) {
    -    if (command != &qh->qhull_command[0]) {
    -      *qh->qhull_command= '\0';
    -      strncat(qh->qhull_command, command, sizeof(qh->qhull_command)-strlen(qh->qhull_command)-1);
    -    }
    -    while (*s && !isspace(*s))  /* skip program name */
    -      s++;
    -  }
    -  while (*s) {
    -    while (*s && isspace(*s))
    -      s++;
    -    if (*s == '-')
    -      s++;
    -    if (!*s)
    -      break;
    -    prev_s= s;
    -    switch (*s++) {
    -    case 'd':
    -      qh_option(qh, "delaunay", NULL, NULL);
    -      qh->DELAUNAY= True;
    -      break;
    -    case 'f':
    -      qh_option(qh, "facets", NULL, NULL);
    -      qh_appendprint(qh, qh_PRINTfacets);
    -      break;
    -    case 'i':
    -      qh_option(qh, "incidence", NULL, NULL);
    -      qh_appendprint(qh, qh_PRINTincidences);
    -      break;
    -    case 'm':
    -      qh_option(qh, "mathematica", NULL, NULL);
    -      qh_appendprint(qh, qh_PRINTmathematica);
    -      break;
    -    case 'n':
    -      qh_option(qh, "normals", NULL, NULL);
    -      qh_appendprint(qh, qh_PRINTnormals);
    -      break;
    -    case 'o':
    -      qh_option(qh, "offFile", NULL, NULL);
    -      qh_appendprint(qh, qh_PRINToff);
    -      break;
    -    case 'p':
    -      qh_option(qh, "points", NULL, NULL);
    -      qh_appendprint(qh, qh_PRINTpoints);
    -      break;
    -    case 's':
    -      qh_option(qh, "summary", NULL, NULL);
    -      qh->PRINTsummary= True;
    -      break;
    -    case 'v':
    -      qh_option(qh, "voronoi", NULL, NULL);
    -      qh->VORONOI= True;
    -      qh->DELAUNAY= True;
    -      break;
    -    case 'A':
    -      if (!isdigit(*s) && *s != '.' && *s != '-')
    -        qh_fprintf(qh, qh->ferr, 7002, "qhull warning: no maximum cosine angle given for option 'An'.  Ignored.\n");
    -      else {
    -        if (*s == '-') {
    -          qh->premerge_cos= -qh_strtod(s, &s);
    -          qh_option(qh, "Angle-premerge-", NULL, &qh->premerge_cos);
    -          qh->PREmerge= True;
    -        }else {
    -          qh->postmerge_cos= qh_strtod(s, &s);
    -          qh_option(qh, "Angle-postmerge", NULL, &qh->postmerge_cos);
    -          qh->POSTmerge= True;
    -        }
    -        qh->MERGING= True;
    -      }
    -      break;
    -    case 'C':
    -      if (!isdigit(*s) && *s != '.' && *s != '-')
    -        qh_fprintf(qh, qh->ferr, 7003, "qhull warning: no centrum radius given for option 'Cn'.  Ignored.\n");
    -      else {
    -        if (*s == '-') {
    -          qh->premerge_centrum= -qh_strtod(s, &s);
    -          qh_option(qh, "Centrum-premerge-", NULL, &qh->premerge_centrum);
    -          qh->PREmerge= True;
    -        }else {
    -          qh->postmerge_centrum= qh_strtod(s, &s);
    -          qh_option(qh, "Centrum-postmerge", NULL, &qh->postmerge_centrum);
    -          qh->POSTmerge= True;
    -        }
    -        qh->MERGING= True;
    -      }
    -      break;
    -    case 'E':
    -      if (*s == '-')
    -        qh_fprintf(qh, qh->ferr, 7004, "qhull warning: negative maximum roundoff given for option 'An'.  Ignored.\n");
    -      else if (!isdigit(*s))
    -        qh_fprintf(qh, qh->ferr, 7005, "qhull warning: no maximum roundoff given for option 'En'.  Ignored.\n");
    -      else {
    -        qh->DISTround= qh_strtod(s, &s);
    -        qh_option(qh, "Distance-roundoff", NULL, &qh->DISTround);
    -        qh->SETroundoff= True;
    -      }
    -      break;
    -    case 'H':
    -      start= s;
    -      qh->HALFspace= True;
    -      qh_strtod(s, &t);
    -      while (t > s)  {
    -        if (*t && !isspace(*t)) {
    -          if (*t == ',')
    -            t++;
    -          else
    -            qh_fprintf(qh, qh->ferr, 7006, "qhull warning: origin for Halfspace intersection should be 'Hn,n,n,...'\n");
    -        }
    -        s= t;
    -        qh_strtod(s, &t);
    -      }
    -      if (start < t) {
    -        if (!(qh->feasible_string= (char*)calloc((size_t)(t-start+1), (size_t)1))) {
    -          qh_fprintf(qh, qh->ferr, 6034, "qhull error: insufficient memory for 'Hn,n,n'\n");
    -          qh_errexit(qh, qh_ERRmem, NULL, NULL);
    -        }
    -        strncpy(qh->feasible_string, start, (size_t)(t-start));
    -        qh_option(qh, "Halfspace-about", NULL, NULL);
    -        qh_option(qh, qh->feasible_string, NULL, NULL);
    -      }else
    -        qh_option(qh, "Halfspace", NULL, NULL);
    -      break;
    -    case 'R':
    -      if (!isdigit(*s))
    -        qh_fprintf(qh, qh->ferr, 7007, "qhull warning: missing random perturbation for option 'Rn'.  Ignored\n");
    -      else {
    -        qh->RANDOMfactor= qh_strtod(s, &s);
    -        qh_option(qh, "Random_perturb", NULL, &qh->RANDOMfactor);
    -        qh->RANDOMdist= True;
    -      }
    -      break;
    -    case 'V':
    -      if (!isdigit(*s) && *s != '-')
    -        qh_fprintf(qh, qh->ferr, 7008, "qhull warning: missing visible distance for option 'Vn'.  Ignored\n");
    -      else {
    -        qh->MINvisible= qh_strtod(s, &s);
    -        qh_option(qh, "Visible", NULL, &qh->MINvisible);
    -      }
    -      break;
    -    case 'U':
    -      if (!isdigit(*s) && *s != '-')
    -        qh_fprintf(qh, qh->ferr, 7009, "qhull warning: missing coplanar distance for option 'Un'.  Ignored\n");
    -      else {
    -        qh->MAXcoplanar= qh_strtod(s, &s);
    -        qh_option(qh, "U-coplanar", NULL, &qh->MAXcoplanar);
    -      }
    -      break;
    -    case 'W':
    -      if (*s == '-')
    -        qh_fprintf(qh, qh->ferr, 7010, "qhull warning: negative outside width for option 'Wn'.  Ignored.\n");
    -      else if (!isdigit(*s))
    -        qh_fprintf(qh, qh->ferr, 7011, "qhull warning: missing outside width for option 'Wn'.  Ignored\n");
    -      else {
    -        qh->MINoutside= qh_strtod(s, &s);
    -        qh_option(qh, "W-outside", NULL, &qh->MINoutside);
    -        qh->APPROXhull= True;
    -      }
    -      break;
    -    /************  sub menus ***************/
    -    case 'F':
    -      while (*s && !isspace(*s)) {
    -        switch (*s++) {
    -        case 'a':
    -          qh_option(qh, "Farea", NULL, NULL);
    -          qh_appendprint(qh, qh_PRINTarea);
    -          qh->GETarea= True;
    -          break;
    -        case 'A':
    -          qh_option(qh, "FArea-total", NULL, NULL);
    -          qh->GETarea= True;
    -          break;
    -        case 'c':
    -          qh_option(qh, "Fcoplanars", NULL, NULL);
    -          qh_appendprint(qh, qh_PRINTcoplanars);
    -          break;
    -        case 'C':
    -          qh_option(qh, "FCentrums", NULL, NULL);
    -          qh_appendprint(qh, qh_PRINTcentrums);
    -          break;
    -        case 'd':
    -          qh_option(qh, "Fd-cdd-in", NULL, NULL);
    -          qh->CDDinput= True;
    -          break;
    -        case 'D':
    -          qh_option(qh, "FD-cdd-out", NULL, NULL);
    -          qh->CDDoutput= True;
    -          break;
    -        case 'F':
    -          qh_option(qh, "FFacets-xridge", NULL, NULL);
    -          qh_appendprint(qh, qh_PRINTfacets_xridge);
    -          break;
    -        case 'i':
    -          qh_option(qh, "Finner", NULL, NULL);
    -          qh_appendprint(qh, qh_PRINTinner);
    -          break;
    -        case 'I':
    -          qh_option(qh, "FIDs", NULL, NULL);
    -          qh_appendprint(qh, qh_PRINTids);
    -          break;
    -        case 'm':
    -          qh_option(qh, "Fmerges", NULL, NULL);
    -          qh_appendprint(qh, qh_PRINTmerges);
    -          break;
    -        case 'M':
    -          qh_option(qh, "FMaple", NULL, NULL);
    -          qh_appendprint(qh, qh_PRINTmaple);
    -          break;
    -        case 'n':
    -          qh_option(qh, "Fneighbors", NULL, NULL);
    -          qh_appendprint(qh, qh_PRINTneighbors);
    -          break;
    -        case 'N':
    -          qh_option(qh, "FNeighbors-vertex", NULL, NULL);
    -          qh_appendprint(qh, qh_PRINTvneighbors);
    -          break;
    -        case 'o':
    -          qh_option(qh, "Fouter", NULL, NULL);
    -          qh_appendprint(qh, qh_PRINTouter);
    -          break;
    -        case 'O':
    -          if (qh->PRINToptions1st) {
    -            qh_option(qh, "FOptions", NULL, NULL);
    -            qh_appendprint(qh, qh_PRINToptions);
    -          }else
    -            qh->PRINToptions1st= True;
    -          break;
    -        case 'p':
    -          qh_option(qh, "Fpoint-intersect", NULL, NULL);
    -          qh_appendprint(qh, qh_PRINTpointintersect);
    -          break;
    -        case 'P':
    -          qh_option(qh, "FPoint-nearest", NULL, NULL);
    -          qh_appendprint(qh, qh_PRINTpointnearest);
    -          break;
    -        case 'Q':
    -          qh_option(qh, "FQhull", NULL, NULL);
    -          qh_appendprint(qh, qh_PRINTqhull);
    -          break;
    -        case 's':
    -          qh_option(qh, "Fsummary", NULL, NULL);
    -          qh_appendprint(qh, qh_PRINTsummary);
    -          break;
    -        case 'S':
    -          qh_option(qh, "FSize", NULL, NULL);
    -          qh_appendprint(qh, qh_PRINTsize);
    -          qh->GETarea= True;
    -          break;
    -        case 't':
    -          qh_option(qh, "Ftriangles", NULL, NULL);
    -          qh_appendprint(qh, qh_PRINTtriangles);
    -          break;
    -        case 'v':
    -          /* option set in qh_initqhull_globals */
    -          qh_appendprint(qh, qh_PRINTvertices);
    -          break;
    -        case 'V':
    -          qh_option(qh, "FVertex-average", NULL, NULL);
    -          qh_appendprint(qh, qh_PRINTaverage);
    -          break;
    -        case 'x':
    -          qh_option(qh, "Fxtremes", NULL, NULL);
    -          qh_appendprint(qh, qh_PRINTextremes);
    -          break;
    -        default:
    -          s--;
    -          qh_fprintf(qh, qh->ferr, 7012, "qhull warning: unknown 'F' output option %c, rest ignored\n", (int)s[0]);
    -          while (*++s && !isspace(*s));
    -          break;
    -        }
    -      }
    -      break;
    -    case 'G':
    -      isgeom= True;
    -      qh_appendprint(qh, qh_PRINTgeom);
    -      while (*s && !isspace(*s)) {
    -        switch (*s++) {
    -        case 'a':
    -          qh_option(qh, "Gall-points", NULL, NULL);
    -          qh->PRINTdots= True;
    -          break;
    -        case 'c':
    -          qh_option(qh, "Gcentrums", NULL, NULL);
    -          qh->PRINTcentrums= True;
    -          break;
    -        case 'h':
    -          qh_option(qh, "Gintersections", NULL, NULL);
    -          qh->DOintersections= True;
    -          break;
    -        case 'i':
    -          qh_option(qh, "Ginner", NULL, NULL);
    -          qh->PRINTinner= True;
    -          break;
    -        case 'n':
    -          qh_option(qh, "Gno-planes", NULL, NULL);
    -          qh->PRINTnoplanes= True;
    -          break;
    -        case 'o':
    -          qh_option(qh, "Gouter", NULL, NULL);
    -          qh->PRINTouter= True;
    -          break;
    -        case 'p':
    -          qh_option(qh, "Gpoints", NULL, NULL);
    -          qh->PRINTcoplanar= True;
    -          break;
    -        case 'r':
    -          qh_option(qh, "Gridges", NULL, NULL);
    -          qh->PRINTridges= True;
    -          break;
    -        case 't':
    -          qh_option(qh, "Gtransparent", NULL, NULL);
    -          qh->PRINTtransparent= True;
    -          break;
    -        case 'v':
    -          qh_option(qh, "Gvertices", NULL, NULL);
    -          qh->PRINTspheres= True;
    -          break;
    -        case 'D':
    -          if (!isdigit(*s))
    -            qh_fprintf(qh, qh->ferr, 6035, "qhull input error: missing dimension for option 'GDn'\n");
    -          else {
    -            if (qh->DROPdim >= 0)
    -              qh_fprintf(qh, qh->ferr, 7013, "qhull warning: can only drop one dimension.  Previous 'GD%d' ignored\n",
    -                   qh->DROPdim);
    -            qh->DROPdim= qh_strtol(s, &s);
    -            qh_option(qh, "GDrop-dim", &qh->DROPdim, NULL);
    -          }
    -          break;
    -        default:
    -          s--;
    -          qh_fprintf(qh, qh->ferr, 7014, "qhull warning: unknown 'G' print option %c, rest ignored\n", (int)s[0]);
    -          while (*++s && !isspace(*s));
    -          break;
    -        }
    -      }
    -      break;
    -    case 'P':
    -      while (*s && !isspace(*s)) {
    -        switch (*s++) {
    -        case 'd': case 'D':  /* see qh_initthresholds() */
    -          key= s[-1];
    -          i= qh_strtol(s, &s);
    -          r= 0;
    -          if (*s == ':') {
    -            s++;
    -            r= qh_strtod(s, &s);
    -          }
    -          if (key == 'd')
    -            qh_option(qh, "Pdrop-facets-dim-less", &i, &r);
    -          else
    -            qh_option(qh, "PDrop-facets-dim-more", &i, &r);
    -          break;
    -        case 'g':
    -          qh_option(qh, "Pgood-facets", NULL, NULL);
    -          qh->PRINTgood= True;
    -          break;
    -        case 'G':
    -          qh_option(qh, "PGood-facet-neighbors", NULL, NULL);
    -          qh->PRINTneighbors= True;
    -          break;
    -        case 'o':
    -          qh_option(qh, "Poutput-forced", NULL, NULL);
    -          qh->FORCEoutput= True;
    -          break;
    -        case 'p':
    -          qh_option(qh, "Pprecision-ignore", NULL, NULL);
    -          qh->PRINTprecision= False;
    -          break;
    -        case 'A':
    -          if (!isdigit(*s))
    -            qh_fprintf(qh, qh->ferr, 6036, "qhull input error: missing facet count for keep area option 'PAn'\n");
    -          else {
    -            qh->KEEParea= qh_strtol(s, &s);
    -            qh_option(qh, "PArea-keep", &qh->KEEParea, NULL);
    -            qh->GETarea= True;
    -          }
    -          break;
    -        case 'F':
    -          if (!isdigit(*s))
    -            qh_fprintf(qh, qh->ferr, 6037, "qhull input error: missing facet area for option 'PFn'\n");
    -          else {
    -            qh->KEEPminArea= qh_strtod(s, &s);
    -            qh_option(qh, "PFacet-area-keep", NULL, &qh->KEEPminArea);
    -            qh->GETarea= True;
    -          }
    -          break;
    -        case 'M':
    -          if (!isdigit(*s))
    -            qh_fprintf(qh, qh->ferr, 6038, "qhull input error: missing merge count for option 'PMn'\n");
    -          else {
    -            qh->KEEPmerge= qh_strtol(s, &s);
    -            qh_option(qh, "PMerge-keep", &qh->KEEPmerge, NULL);
    -          }
    -          break;
    -        default:
    -          s--;
    -          qh_fprintf(qh, qh->ferr, 7015, "qhull warning: unknown 'P' print option %c, rest ignored\n", (int)s[0]);
    -          while (*++s && !isspace(*s));
    -          break;
    -        }
    -      }
    -      break;
    -    case 'Q':
    -      lastproject= -1;
    -      while (*s && !isspace(*s)) {
    -        switch (*s++) {
    -        case 'b': case 'B':  /* handled by qh_initthresholds */
    -          key= s[-1];
    -          if (key == 'b' && *s == 'B') {
    -            s++;
    -            r= qh_DEFAULTbox;
    -            qh->SCALEinput= True;
    -            qh_option(qh, "QbBound-unit-box", NULL, &r);
    -            break;
    -          }
    -          if (key == 'b' && *s == 'b') {
    -            s++;
    -            qh->SCALElast= True;
    -            qh_option(qh, "Qbbound-last", NULL, NULL);
    -            break;
    -          }
    -          k= qh_strtol(s, &s);
    -          r= 0.0;
    -          wasproject= False;
    -          if (*s == ':') {
    -            s++;
    -            if ((r= qh_strtod(s, &s)) == 0.0) {
    -              t= s;            /* need true dimension for memory allocation */
    -              while (*t && !isspace(*t)) {
    -                if (toupper(*t++) == 'B'
    -                 && k == qh_strtol(t, &t)
    -                 && *t++ == ':'
    -                 && qh_strtod(t, &t) == 0.0) {
    -                  qh->PROJECTinput++;
    -                  trace2((qh, qh->ferr, 2004, "qh_initflags: project dimension %d\n", k));
    -                  qh_option(qh, "Qb-project-dim", &k, NULL);
    -                  wasproject= True;
    -                  lastproject= k;
    -                  break;
    -                }
    -              }
    -            }
    -          }
    -          if (!wasproject) {
    -            if (lastproject == k && r == 0.0)
    -              lastproject= -1;  /* doesn't catch all possible sequences */
    -            else if (key == 'b') {
    -              qh->SCALEinput= True;
    -              if (r == 0.0)
    -                r= -qh_DEFAULTbox;
    -              qh_option(qh, "Qbound-dim-low", &k, &r);
    -            }else {
    -              qh->SCALEinput= True;
    -              if (r == 0.0)
    -                r= qh_DEFAULTbox;
    -              qh_option(qh, "QBound-dim-high", &k, &r);
    -            }
    -          }
    -          break;
    -        case 'c':
    -          qh_option(qh, "Qcoplanar-keep", NULL, NULL);
    -          qh->KEEPcoplanar= True;
    -          break;
    -        case 'f':
    -          qh_option(qh, "Qfurthest-outside", NULL, NULL);
    -          qh->BESToutside= True;
    -          break;
    -        case 'g':
    -          qh_option(qh, "Qgood-facets-only", NULL, NULL);
    -          qh->ONLYgood= True;
    -          break;
    -        case 'i':
    -          qh_option(qh, "Qinterior-keep", NULL, NULL);
    -          qh->KEEPinside= True;
    -          break;
    -        case 'm':
    -          qh_option(qh, "Qmax-outside-only", NULL, NULL);
    -          qh->ONLYmax= True;
    -          break;
    -        case 'r':
    -          qh_option(qh, "Qrandom-outside", NULL, NULL);
    -          qh->RANDOMoutside= True;
    -          break;
    -        case 's':
    -          qh_option(qh, "Qsearch-initial-simplex", NULL, NULL);
    -          qh->ALLpoints= True;
    -          break;
    -        case 't':
    -          qh_option(qh, "Qtriangulate", NULL, NULL);
    -          qh->TRIangulate= True;
    -          break;
    -        case 'T':
    -          qh_option(qh, "QTestPoints", NULL, NULL);
    -          if (!isdigit(*s))
    -            qh_fprintf(qh, qh->ferr, 6039, "qhull input error: missing number of test points for option 'QTn'\n");
    -          else {
    -            qh->TESTpoints= qh_strtol(s, &s);
    -            qh_option(qh, "QTestPoints", &qh->TESTpoints, NULL);
    -          }
    -          break;
    -        case 'u':
    -          qh_option(qh, "QupperDelaunay", NULL, NULL);
    -          qh->UPPERdelaunay= True;
    -          break;
    -        case 'v':
    -          qh_option(qh, "Qvertex-neighbors-convex", NULL, NULL);
    -          qh->TESTvneighbors= True;
    -          break;
    -        case 'x':
    -          qh_option(qh, "Qxact-merge", NULL, NULL);
    -          qh->MERGEexact= True;
    -          break;
    -        case 'z':
    -          qh_option(qh, "Qz-infinity-point", NULL, NULL);
    -          qh->ATinfinity= True;
    -          break;
    -        case '0':
    -          qh_option(qh, "Q0-no-premerge", NULL, NULL);
    -          qh->NOpremerge= True;
    -          break;
    -        case '1':
    -          if (!isdigit(*s)) {
    -            qh_option(qh, "Q1-no-angle-sort", NULL, NULL);
    -            qh->ANGLEmerge= False;
    -            break;
    -          }
    -          switch (*s++) {
    -          case '0':
    -            qh_option(qh, "Q10-no-narrow", NULL, NULL);
    -            qh->NOnarrow= True;
    -            break;
    -          case '1':
    -            qh_option(qh, "Q11-trinormals Qtriangulate", NULL, NULL);
    -            qh->TRInormals= True;
    -            qh->TRIangulate= True;
    -            break;
    -          case '2':
    -              qh_option(qh, "Q12-no-wide-dup", NULL, NULL);
    -              qh->NOwide= True;
    -            break;
    -          default:
    -            s--;
    -            qh_fprintf(qh, qh->ferr, 7016, "qhull warning: unknown 'Q' qhull option 1%c, rest ignored\n", (int)s[0]);
    -            while (*++s && !isspace(*s));
    -            break;
    -          }
    -          break;
    -        case '2':
    -          qh_option(qh, "Q2-no-merge-independent", NULL, NULL);
    -          qh->MERGEindependent= False;
    -          goto LABELcheckdigit;
    -          break; /* no warnings */
    -        case '3':
    -          qh_option(qh, "Q3-no-merge-vertices", NULL, NULL);
    -          qh->MERGEvertices= False;
    -        LABELcheckdigit:
    -          if (isdigit(*s))
    -            qh_fprintf(qh, qh->ferr, 7017, "qhull warning: can not follow '1', '2', or '3' with a digit.  '%c' skipped.\n",
    -                     *s++);
    -          break;
    -        case '4':
    -          qh_option(qh, "Q4-avoid-old-into-new", NULL, NULL);
    -          qh->AVOIDold= True;
    -          break;
    -        case '5':
    -          qh_option(qh, "Q5-no-check-outer", NULL, NULL);
    -          qh->SKIPcheckmax= True;
    -          break;
    -        case '6':
    -          qh_option(qh, "Q6-no-concave-merge", NULL, NULL);
    -          qh->SKIPconvex= True;
    -          break;
    -        case '7':
    -          qh_option(qh, "Q7-no-breadth-first", NULL, NULL);
    -          qh->VIRTUALmemory= True;
    -          break;
    -        case '8':
    -          qh_option(qh, "Q8-no-near-inside", NULL, NULL);
    -          qh->NOnearinside= True;
    -          break;
    -        case '9':
    -          qh_option(qh, "Q9-pick-furthest", NULL, NULL);
    -          qh->PICKfurthest= True;
    -          break;
    -        case 'G':
    -          i= qh_strtol(s, &t);
    -          if (qh->GOODpoint)
    -            qh_fprintf(qh, qh->ferr, 7018, "qhull warning: good point already defined for option 'QGn'.  Ignored\n");
    -          else if (s == t)
    -            qh_fprintf(qh, qh->ferr, 7019, "qhull warning: missing good point id for option 'QGn'.  Ignored\n");
    -          else if (i < 0 || *s == '-') {
    -            qh->GOODpoint= i-1;
    -            qh_option(qh, "QGood-if-dont-see-point", &i, NULL);
    -          }else {
    -            qh->GOODpoint= i+1;
    -            qh_option(qh, "QGood-if-see-point", &i, NULL);
    -          }
    -          s= t;
    -          break;
    -        case 'J':
    -          if (!isdigit(*s) && *s != '-')
    -            qh->JOGGLEmax= 0.0;
    -          else {
    -            qh->JOGGLEmax= (realT) qh_strtod(s, &s);
    -            qh_option(qh, "QJoggle", NULL, &qh->JOGGLEmax);
    -          }
    -          break;
    -        case 'R':
    -          if (!isdigit(*s) && *s != '-')
    -            qh_fprintf(qh, qh->ferr, 7020, "qhull warning: missing random seed for option 'QRn'.  Ignored\n");
    -          else {
    -            qh->ROTATErandom= i= qh_strtol(s, &s);
    -            if (i > 0)
    -              qh_option(qh, "QRotate-id", &i, NULL );
    -            else if (i < -1)
    -              qh_option(qh, "QRandom-seed", &i, NULL );
    -          }
    -          break;
    -        case 'V':
    -          i= qh_strtol(s, &t);
    -          if (qh->GOODvertex)
    -            qh_fprintf(qh, qh->ferr, 7021, "qhull warning: good vertex already defined for option 'QVn'.  Ignored\n");
    -          else if (s == t)
    -            qh_fprintf(qh, qh->ferr, 7022, "qhull warning: no good point id given for option 'QVn'.  Ignored\n");
    -          else if (i < 0) {
    -            qh->GOODvertex= i - 1;
    -            qh_option(qh, "QV-good-facets-not-point", &i, NULL);
    -          }else {
    -            qh_option(qh, "QV-good-facets-point", &i, NULL);
    -            qh->GOODvertex= i + 1;
    -          }
    -          s= t;
    -          break;
    -        default:
    -          s--;
    -          qh_fprintf(qh, qh->ferr, 7023, "qhull warning: unknown 'Q' qhull option %c, rest ignored\n", (int)s[0]);
    -          while (*++s && !isspace(*s));
    -          break;
    -        }
    -      }
    -      break;
    -    case 'T':
    -      while (*s && !isspace(*s)) {
    -        if (isdigit(*s) || *s == '-')
    -          qh->IStracing= qh_strtol(s, &s);
    -        else switch (*s++) {
    -        case 'a':
    -          qh_option(qh, "Tannotate-output", NULL, NULL);
    -          qh->ANNOTATEoutput= True;
    -          break;
    -        case 'c':
    -          qh_option(qh, "Tcheck-frequently", NULL, NULL);
    -          qh->CHECKfrequently= True;
    -          break;
    -        case 's':
    -          qh_option(qh, "Tstatistics", NULL, NULL);
    -          qh->PRINTstatistics= True;
    -          break;
    -        case 'v':
    -          qh_option(qh, "Tverify", NULL, NULL);
    -          qh->VERIFYoutput= True;
    -          break;
    -        case 'z':
    -          if (qh->ferr == qh_FILEstderr) {
    -            /* The C++ interface captures the output in qh_fprint_qhull() */
    -            qh_option(qh, "Tz-stdout", NULL, NULL);
    -            qh->USEstdout= True;
    -          }else if (!qh->fout)
    -            qh_fprintf(qh, qh->ferr, 7024, "qhull warning: output file undefined(stdout).  Option 'Tz' ignored.\n");
    -          else {
    -            qh_option(qh, "Tz-stdout", NULL, NULL);
    -            qh->USEstdout= True;
    -            qh->ferr= qh->fout;
    -            qh->qhmem.ferr= qh->fout;
    -          }
    -          break;
    -        case 'C':
    -          if (!isdigit(*s))
    -            qh_fprintf(qh, qh->ferr, 7025, "qhull warning: missing point id for cone for trace option 'TCn'.  Ignored\n");
    -          else {
    -            i= qh_strtol(s, &s);
    -            qh_option(qh, "TCone-stop", &i, NULL);
    -            qh->STOPcone= i + 1;
    -          }
    -          break;
    -        case 'F':
    -          if (!isdigit(*s))
    -            qh_fprintf(qh, qh->ferr, 7026, "qhull warning: missing frequency count for trace option 'TFn'.  Ignored\n");
    -          else {
    -            qh->REPORTfreq= qh_strtol(s, &s);
    -            qh_option(qh, "TFacet-log", &qh->REPORTfreq, NULL);
    -            qh->REPORTfreq2= qh->REPORTfreq/2;  /* for tracemerging() */
    -          }
    -          break;
    -        case 'I':
    -          if (!isspace(*s))
    -            qh_fprintf(qh, qh->ferr, 7027, "qhull warning: missing space between 'TI' and filename, %s\n", s);
    -          while (isspace(*s))
    -            s++;
    -          t= qh_skipfilename(qh, s);
    -          {
    -            char filename[qh_FILENAMElen];
    -
    -            qh_copyfilename(qh, filename, (int)sizeof(filename), s, (int)(t-s));   /* WARN64 */
    -            s= t;
    -            if (!freopen(filename, "r", stdin)) {
    -              qh_fprintf(qh, qh->ferr, 6041, "qhull error: could not open file \"%s\".", filename);
    -              qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -            }else {
    -              qh_option(qh, "TInput-file", NULL, NULL);
    -              qh_option(qh, filename, NULL, NULL);
    -            }
    -          }
    -          break;
    -        case 'O':
    -            if (!isspace(*s))
    -                qh_fprintf(qh, qh->ferr, 7028, "qhull warning: missing space between 'TO' and filename, %s\n", s);
    -            while (isspace(*s))
    -                s++;
    -            t= qh_skipfilename(qh, s);
    -            {
    -              char filename[qh_FILENAMElen];
    -
    -              qh_copyfilename(qh, filename, (int)sizeof(filename), s, (int)(t-s));  /* WARN64 */
    -              s= t;
    -              if (!qh->fout) {
    -                qh_fprintf(qh, qh->ferr, 6266, "qhull input warning: qh.fout was not set by caller.  Cannot use option 'TO' to redirect output.  Ignoring option 'TO'\n");
    -              }else if (!freopen(filename, "w", qh->fout)) {
    -                qh_fprintf(qh, qh->ferr, 6044, "qhull error: could not open file \"%s\".", filename);
    -                qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -              }else {
    -                qh_option(qh, "TOutput-file", NULL, NULL);
    -              qh_option(qh, filename, NULL, NULL);
    -            }
    -          }
    -          break;
    -        case 'P':
    -          if (!isdigit(*s))
    -            qh_fprintf(qh, qh->ferr, 7029, "qhull warning: missing point id for trace option 'TPn'.  Ignored\n");
    -          else {
    -            qh->TRACEpoint= qh_strtol(s, &s);
    -            qh_option(qh, "Trace-point", &qh->TRACEpoint, NULL);
    -          }
    -          break;
    -        case 'M':
    -          if (!isdigit(*s))
    -            qh_fprintf(qh, qh->ferr, 7030, "qhull warning: missing merge id for trace option 'TMn'.  Ignored\n");
    -          else {
    -            qh->TRACEmerge= qh_strtol(s, &s);
    -            qh_option(qh, "Trace-merge", &qh->TRACEmerge, NULL);
    -          }
    -          break;
    -        case 'R':
    -          if (!isdigit(*s))
    -            qh_fprintf(qh, qh->ferr, 7031, "qhull warning: missing rerun count for trace option 'TRn'.  Ignored\n");
    -          else {
    -            qh->RERUN= qh_strtol(s, &s);
    -            qh_option(qh, "TRerun", &qh->RERUN, NULL);
    -          }
    -          break;
    -        case 'V':
    -          i= qh_strtol(s, &t);
    -          if (s == t)
    -            qh_fprintf(qh, qh->ferr, 7032, "qhull warning: missing furthest point id for trace option 'TVn'.  Ignored\n");
    -          else if (i < 0) {
    -            qh->STOPpoint= i - 1;
    -            qh_option(qh, "TV-stop-before-point", &i, NULL);
    -          }else {
    -            qh->STOPpoint= i + 1;
    -            qh_option(qh, "TV-stop-after-point", &i, NULL);
    -          }
    -          s= t;
    -          break;
    -        case 'W':
    -          if (!isdigit(*s))
    -            qh_fprintf(qh, qh->ferr, 7033, "qhull warning: missing max width for trace option 'TWn'.  Ignored\n");
    -          else {
    -            qh->TRACEdist= (realT) qh_strtod(s, &s);
    -            qh_option(qh, "TWide-trace", NULL, &qh->TRACEdist);
    -          }
    -          break;
    -        default:
    -          s--;
    -          qh_fprintf(qh, qh->ferr, 7034, "qhull warning: unknown 'T' trace option %c, rest ignored\n", (int)s[0]);
    -          while (*++s && !isspace(*s));
    -          break;
    -        }
    -      }
    -      break;
    -    default:
    -      qh_fprintf(qh, qh->ferr, 7035, "qhull warning: unknown flag %c(%x)\n", (int)s[-1],
    -               (int)s[-1]);
    -      break;
    -    }
    -    if (s-1 == prev_s && *s && !isspace(*s)) {
    -      qh_fprintf(qh, qh->ferr, 7036, "qhull warning: missing space after flag %c(%x); reserved for menu. Skipped.\n",
    -               (int)*prev_s, (int)*prev_s);
    -      while (*s && !isspace(*s))
    -        s++;
    -    }
    -  }
    -  if (qh->STOPcone && qh->JOGGLEmax < REALmax/2)
    -    qh_fprintf(qh, qh->ferr, 7078, "qhull warning: 'TCn' (stopCone) ignored when used with 'QJn' (joggle)\n");
    -  if (isgeom && !qh->FORCEoutput && qh->PRINTout[1])
    -    qh_fprintf(qh, qh->ferr, 7037, "qhull warning: additional output formats are not compatible with Geomview\n");
    -  /* set derived values in qh_initqhull_globals */
    -} /* initflags */
    -
    -
    -/*---------------------------------
    -
    -  qh_initqhull_buffers(qh)
    -    initialize global memory buffers
    -
    -  notes:
    -    must match qh_freebuffers()
    -*/
    -void qh_initqhull_buffers(qhT *qh) {
    -  int k;
    -
    -  qh->TEMPsize= (qh->qhmem.LASTsize - sizeof(setT))/SETelemsize;
    -  if (qh->TEMPsize <= 0 || qh->TEMPsize > qh->qhmem.LASTsize)
    -    qh->TEMPsize= 8;  /* e.g., if qh_NOmem */
    -  qh->other_points= qh_setnew(qh, qh->TEMPsize);
    -  qh->del_vertices= qh_setnew(qh, qh->TEMPsize);
    -  qh->coplanarfacetset= qh_setnew(qh, qh->TEMPsize);
    -  qh->NEARzero= (realT *)qh_memalloc(qh, qh->hull_dim * sizeof(realT));
    -  qh->lower_threshold= (realT *)qh_memalloc(qh, (qh->input_dim+1) * sizeof(realT));
    -  qh->upper_threshold= (realT *)qh_memalloc(qh, (qh->input_dim+1) * sizeof(realT));
    -  qh->lower_bound= (realT *)qh_memalloc(qh, (qh->input_dim+1) * sizeof(realT));
    -  qh->upper_bound= (realT *)qh_memalloc(qh, (qh->input_dim+1) * sizeof(realT));
    -  for (k=qh->input_dim+1; k--; ) {  /* duplicated in qh_initqhull_buffers and qh_clear_outputflags */
    -    qh->lower_threshold[k]= -REALmax;
    -    qh->upper_threshold[k]= REALmax;
    -    qh->lower_bound[k]= -REALmax;
    -    qh->upper_bound[k]= REALmax;
    -  }
    -  qh->gm_matrix= (coordT *)qh_memalloc(qh, (qh->hull_dim+1) * qh->hull_dim * sizeof(coordT));
    -  qh->gm_row= (coordT **)qh_memalloc(qh, (qh->hull_dim+1) * sizeof(coordT *));
    -} /* initqhull_buffers */
    -
    -/*---------------------------------
    -
    -  qh_initqhull_globals(qh, points, numpoints, dim, ismalloc )
    -    initialize globals
    -    if ismalloc
    -      points were malloc'd and qhull should free at end
    -
    -  returns:
    -    sets qh.first_point, num_points, input_dim, hull_dim and others
    -    seeds random number generator (seed=1 if tracing)
    -    modifies qh.hull_dim if ((qh.DELAUNAY and qh.PROJECTdelaunay) or qh.PROJECTinput)
    -    adjust user flags as needed
    -    also checks DIM3 dependencies and constants
    -
    -  notes:
    -    do not use qh_point() since an input transformation may move them elsewhere
    -
    -  see:
    -    qh_initqhull_start() sets default values for non-zero globals
    -
    -  design:
    -    initialize points array from input arguments
    -    test for qh.ZEROcentrum
    -      (i.e., use opposite vertex instead of cetrum for convexity testing)
    -    initialize qh.CENTERtype, qh.normal_size,
    -      qh.center_size, qh.TRACEpoint/level,
    -    initialize and test random numbers
    -    qh_initqhull_outputflags() -- adjust and test output flags
    -*/
    -void qh_initqhull_globals(qhT *qh, coordT *points, int numpoints, int dim, boolT ismalloc) {
    -  int seed, pointsneeded, extra= 0, i, randi, k;
    -  realT randr;
    -  realT factorial;
    -
    -  time_t timedata;
    -
    -  trace0((qh, qh->ferr, 13, "qh_initqhull_globals: for %s | %s\n", qh->rbox_command,
    -      qh->qhull_command));
    -  qh->POINTSmalloc= ismalloc;
    -  qh->first_point= points;
    -  qh->num_points= numpoints;
    -  qh->hull_dim= qh->input_dim= dim;
    -  if (!qh->NOpremerge && !qh->MERGEexact && !qh->PREmerge && qh->JOGGLEmax > REALmax/2) {
    -    qh->MERGING= True;
    -    if (qh->hull_dim <= 4) {
    -      qh->PREmerge= True;
    -      qh_option(qh, "_pre-merge", NULL, NULL);
    -    }else {
    -      qh->MERGEexact= True;
    -      qh_option(qh, "Qxact_merge", NULL, NULL);
    -    }
    -  }else if (qh->MERGEexact)
    -    qh->MERGING= True;
    -  if (!qh->NOpremerge && qh->JOGGLEmax > REALmax/2) {
    -#ifdef qh_NOmerge
    -    qh->JOGGLEmax= 0.0;
    -#endif
    -  }
    -  if (qh->TRIangulate && qh->JOGGLEmax < REALmax/2 && qh->PRINTprecision)
    -    qh_fprintf(qh, qh->ferr, 7038, "qhull warning: joggle('QJ') always produces simplicial output.  Triangulated output('Qt') does nothing.\n");
    -  if (qh->JOGGLEmax < REALmax/2 && qh->DELAUNAY && !qh->SCALEinput && !qh->SCALElast) {
    -    qh->SCALElast= True;
    -    qh_option(qh, "Qbbound-last-qj", NULL, NULL);
    -  }
    -  if (qh->MERGING && !qh->POSTmerge && qh->premerge_cos > REALmax/2
    -  && qh->premerge_centrum == 0) {
    -    qh->ZEROcentrum= True;
    -    qh->ZEROall_ok= True;
    -    qh_option(qh, "_zero-centrum", NULL, NULL);
    -  }
    -  if (qh->JOGGLEmax < REALmax/2 && REALepsilon > 2e-8 && qh->PRINTprecision)
    -    qh_fprintf(qh, qh->ferr, 7039, "qhull warning: real epsilon, %2.2g, is probably too large for joggle('QJn')\nRecompile with double precision reals(see user.h).\n",
    -          REALepsilon);
    -#ifdef qh_NOmerge
    -  if (qh->MERGING) {
    -    qh_fprintf(qh, qh->ferr, 6045, "qhull input error: merging not installed(qh_NOmerge + 'Qx', 'Cn' or 'An')\n");
    -    qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -  }
    -#endif
    -  if (qh->DELAUNAY && qh->KEEPcoplanar && !qh->KEEPinside) {
    -    qh->KEEPinside= True;
    -    qh_option(qh, "Qinterior-keep", NULL, NULL);
    -  }
    -  if (qh->DELAUNAY && qh->HALFspace) {
    -    qh_fprintf(qh, qh->ferr, 6046, "qhull input error: can not use Delaunay('d') or Voronoi('v') with halfspace intersection('H')\n");
    -    qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -  }
    -  if (!qh->DELAUNAY && (qh->UPPERdelaunay || qh->ATinfinity)) {
    -    qh_fprintf(qh, qh->ferr, 6047, "qhull input error: use upper-Delaunay('Qu') or infinity-point('Qz') with Delaunay('d') or Voronoi('v')\n");
    -    qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -  }
    -  if (qh->UPPERdelaunay && qh->ATinfinity) {
    -    qh_fprintf(qh, qh->ferr, 6048, "qhull input error: can not use infinity-point('Qz') with upper-Delaunay('Qu')\n");
    -    qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -  }
    -  if (qh->SCALElast && !qh->DELAUNAY && qh->PRINTprecision)
    -    qh_fprintf(qh, qh->ferr, 7040, "qhull input warning: option 'Qbb' (scale-last-coordinate) is normally used with 'd' or 'v'\n");
    -  qh->DOcheckmax= (!qh->SKIPcheckmax && qh->MERGING );
    -  qh->KEEPnearinside= (qh->DOcheckmax && !(qh->KEEPinside && qh->KEEPcoplanar)
    -                          && !qh->NOnearinside);
    -  if (qh->MERGING)
    -    qh->CENTERtype= qh_AScentrum;
    -  else if (qh->VORONOI)
    -    qh->CENTERtype= qh_ASvoronoi;
    -  if (qh->TESTvneighbors && !qh->MERGING) {
    -    qh_fprintf(qh, qh->ferr, 6049, "qhull input error: test vertex neighbors('Qv') needs a merge option\n");
    -    qh_errexit(qh, qh_ERRinput, NULL ,NULL);
    -  }
    -  if (qh->PROJECTinput || (qh->DELAUNAY && qh->PROJECTdelaunay)) {
    -    qh->hull_dim -= qh->PROJECTinput;
    -    if (qh->DELAUNAY) {
    -      qh->hull_dim++;
    -      if (qh->ATinfinity)
    -        extra= 1;
    -    }
    -  }
    -  if (qh->hull_dim <= 1) {
    -    qh_fprintf(qh, qh->ferr, 6050, "qhull error: dimension %d must be > 1\n", qh->hull_dim);
    -    qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -  }
    -  for (k=2, factorial=1.0; k < qh->hull_dim; k++)
    -    factorial *= k;
    -  qh->AREAfactor= 1.0 / factorial;
    -  trace2((qh, qh->ferr, 2005, "qh_initqhull_globals: initialize globals.  dim %d numpoints %d malloc? %d projected %d to hull_dim %d\n",
    -        dim, numpoints, ismalloc, qh->PROJECTinput, qh->hull_dim));
    -  qh->normal_size= qh->hull_dim * sizeof(coordT);
    -  qh->center_size= qh->normal_size - sizeof(coordT);
    -  pointsneeded= qh->hull_dim+1;
    -  if (qh->hull_dim > qh_DIMmergeVertex) {
    -    qh->MERGEvertices= False;
    -    qh_option(qh, "Q3-no-merge-vertices-dim-high", NULL, NULL);
    -  }
    -  if (qh->GOODpoint)
    -    pointsneeded++;
    -#ifdef qh_NOtrace
    -  if (qh->IStracing) {
    -    qh_fprintf(qh, qh->ferr, 6051, "qhull input error: tracing is not installed(qh_NOtrace in user.h)");
    -    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -  }
    -#endif
    -  if (qh->RERUN > 1) {
    -    qh->TRACElastrun= qh->IStracing; /* qh_build_withrestart duplicates next conditional */
    -    if (qh->IStracing != -1)
    -      qh->IStracing= 0;
    -  }else if (qh->TRACEpoint != qh_IDunknown || qh->TRACEdist < REALmax/2 || qh->TRACEmerge) {
    -    qh->TRACElevel= (qh->IStracing? qh->IStracing : 3);
    -    qh->IStracing= 0;
    -  }
    -  if (qh->ROTATErandom == 0 || qh->ROTATErandom == -1) {
    -    seed= (int)time(&timedata);
    -    if (qh->ROTATErandom  == -1) {
    -      seed= -seed;
    -      qh_option(qh, "QRandom-seed", &seed, NULL );
    -    }else
    -      qh_option(qh, "QRotate-random", &seed, NULL);
    -    qh->ROTATErandom= seed;
    -  }
    -  seed= qh->ROTATErandom;
    -  if (seed == INT_MIN)    /* default value */
    -    seed= 1;
    -  else if (seed < 0)
    -    seed= -seed;
    -  qh_RANDOMseed_(qh, seed);
    -  randr= 0.0;
    -  for (i=1000; i--; ) {
    -    randi= qh_RANDOMint;
    -    randr += randi;
    -    if (randi > qh_RANDOMmax) {
    -      qh_fprintf(qh, qh->ferr, 8036, "\
    -qhull configuration error (qh_RANDOMmax in user.h):\n\
    -   random integer %d > qh_RANDOMmax(qh, %.8g)\n",
    -               randi, qh_RANDOMmax);
    -      qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -    }
    -  }
    -  qh_RANDOMseed_(qh, seed);
    -  randr = randr/1000;
    -  if (randr < qh_RANDOMmax * 0.1
    -  || randr > qh_RANDOMmax * 0.9)
    -    qh_fprintf(qh, qh->ferr, 8037, "\
    -qhull configuration warning (qh_RANDOMmax in user.h):\n\
    -   average of 1000 random integers (%.2g) is much different than expected (%.2g).\n\
    -   Is qh_RANDOMmax (%.2g) wrong?\n",
    -             randr, qh_RANDOMmax * 0.5, qh_RANDOMmax);
    -  qh->RANDOMa= 2.0 * qh->RANDOMfactor/qh_RANDOMmax;
    -  qh->RANDOMb= 1.0 - qh->RANDOMfactor;
    -  if (qh_HASHfactor < 1.1) {
    -    qh_fprintf(qh, qh->ferr, 6052, "qhull internal error (qh_initqhull_globals): qh_HASHfactor %d must be at least 1.1.  Qhull uses linear hash probing\n",
    -      qh_HASHfactor);
    -    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -  }
    -  if (numpoints+extra < pointsneeded) {
    -    qh_fprintf(qh, qh->ferr, 6214, "qhull input error: not enough points(%d) to construct initial simplex (need %d)\n",
    -            numpoints, pointsneeded);
    -    qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -  }
    -  qh_initqhull_outputflags(qh);
    -} /* initqhull_globals */
    -
    -/*---------------------------------
    -
    -  qh_initqhull_mem(qh, )
    -    initialize mem_r.c for qhull
    -    qh.hull_dim and qh.normal_size determine some of the allocation sizes
    -    if qh.MERGING,
    -      includes ridgeT
    -    calls qh_user_memsizes(qh) to add up to 10 additional sizes for quick allocation
    -      (see numsizes below)
    -
    -  returns:
    -    mem_r.c already for qh_memalloc/qh_memfree (errors if called beforehand)
    -
    -  notes:
    -    qh_produceoutput() prints memsizes
    -
    -*/
    -void qh_initqhull_mem(qhT *qh) {
    -  int numsizes;
    -  int i;
    -
    -  numsizes= 8+10;
    -  qh_meminitbuffers(qh, qh->IStracing, qh_MEMalign, numsizes,
    -                     qh_MEMbufsize, qh_MEMinitbuf);
    -  qh_memsize(qh, (int)sizeof(vertexT));
    -  if (qh->MERGING) {
    -    qh_memsize(qh, (int)sizeof(ridgeT));
    -    qh_memsize(qh, (int)sizeof(mergeT));
    -  }
    -  qh_memsize(qh, (int)sizeof(facetT));
    -  i= sizeof(setT) + (qh->hull_dim - 1) * SETelemsize;  /* ridge.vertices */
    -  qh_memsize(qh, i);
    -  qh_memsize(qh, qh->normal_size);        /* normal */
    -  i += SETelemsize;                 /* facet.vertices, .ridges, .neighbors */
    -  qh_memsize(qh, i);
    -  qh_user_memsizes(qh);
    -  qh_memsetup(qh);
    -} /* initqhull_mem */
    -
    -/*---------------------------------
    -
    -  qh_initqhull_outputflags
    -    initialize flags concerned with output
    -
    -  returns:
    -    adjust user flags as needed
    -
    -  see:
    -    qh_clear_outputflags() resets the flags
    -
    -  design:
    -    test for qh.PRINTgood (i.e., only print 'good' facets)
    -    check for conflicting print output options
    -*/
    -void qh_initqhull_outputflags(qhT *qh) {
    -  boolT printgeom= False, printmath= False, printcoplanar= False;
    -  int i;
    -
    -  trace3((qh, qh->ferr, 3024, "qh_initqhull_outputflags: %s\n", qh->qhull_command));
    -  if (!(qh->PRINTgood || qh->PRINTneighbors)) {
    -    if (qh->KEEParea || qh->KEEPminArea < REALmax/2 || qh->KEEPmerge || qh->DELAUNAY
    -        || (!qh->ONLYgood && (qh->GOODvertex || qh->GOODpoint))) {
    -      qh->PRINTgood= True;
    -      qh_option(qh, "Pgood", NULL, NULL);
    -    }
    -  }
    -  if (qh->PRINTtransparent) {
    -    if (qh->hull_dim != 4 || !qh->DELAUNAY || qh->VORONOI || qh->DROPdim >= 0) {
    -      qh_fprintf(qh, qh->ferr, 6215, "qhull input error: transparent Delaunay('Gt') needs 3-d Delaunay('d') w/o 'GDn'\n");
    -      qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -    }
    -    qh->DROPdim = 3;
    -    qh->PRINTridges = True;
    -  }
    -  for (i=qh_PRINTEND; i--; ) {
    -    if (qh->PRINTout[i] == qh_PRINTgeom)
    -      printgeom= True;
    -    else if (qh->PRINTout[i] == qh_PRINTmathematica || qh->PRINTout[i] == qh_PRINTmaple)
    -      printmath= True;
    -    else if (qh->PRINTout[i] == qh_PRINTcoplanars)
    -      printcoplanar= True;
    -    else if (qh->PRINTout[i] == qh_PRINTpointnearest)
    -      printcoplanar= True;
    -    else if (qh->PRINTout[i] == qh_PRINTpointintersect && !qh->HALFspace) {
    -      qh_fprintf(qh, qh->ferr, 6053, "qhull input error: option 'Fp' is only used for \nhalfspace intersection('Hn,n,n').\n");
    -      qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -    }else if (qh->PRINTout[i] == qh_PRINTtriangles && (qh->HALFspace || qh->VORONOI)) {
    -      qh_fprintf(qh, qh->ferr, 6054, "qhull input error: option 'Ft' is not available for Voronoi vertices or halfspace intersection\n");
    -      qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -    }else if (qh->PRINTout[i] == qh_PRINTcentrums && qh->VORONOI) {
    -      qh_fprintf(qh, qh->ferr, 6055, "qhull input error: option 'FC' is not available for Voronoi vertices('v')\n");
    -      qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -    }else if (qh->PRINTout[i] == qh_PRINTvertices) {
    -      if (qh->VORONOI)
    -        qh_option(qh, "Fvoronoi", NULL, NULL);
    -      else
    -        qh_option(qh, "Fvertices", NULL, NULL);
    -    }
    -  }
    -  if (printcoplanar && qh->DELAUNAY && qh->JOGGLEmax < REALmax/2) {
    -    if (qh->PRINTprecision)
    -      qh_fprintf(qh, qh->ferr, 7041, "qhull input warning: 'QJ' (joggle) will usually prevent coincident input sites for options 'Fc' and 'FP'\n");
    -  }
    -  if (printmath && (qh->hull_dim > 3 || qh->VORONOI)) {
    -    qh_fprintf(qh, qh->ferr, 6056, "qhull input error: Mathematica and Maple output is only available for 2-d and 3-d convex hulls and 2-d Delaunay triangulations\n");
    -    qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -  }
    -  if (printgeom) {
    -    if (qh->hull_dim > 4) {
    -      qh_fprintf(qh, qh->ferr, 6057, "qhull input error: Geomview output is only available for 2-d, 3-d and 4-d\n");
    -      qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -    }
    -    if (qh->PRINTnoplanes && !(qh->PRINTcoplanar + qh->PRINTcentrums
    -     + qh->PRINTdots + qh->PRINTspheres + qh->DOintersections + qh->PRINTridges)) {
    -      qh_fprintf(qh, qh->ferr, 6058, "qhull input error: no output specified for Geomview\n");
    -      qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -    }
    -    if (qh->VORONOI && (qh->hull_dim > 3 || qh->DROPdim >= 0)) {
    -      qh_fprintf(qh, qh->ferr, 6059, "qhull input error: Geomview output for Voronoi diagrams only for 2-d\n");
    -      qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -    }
    -    /* can not warn about furthest-site Geomview output: no lower_threshold */
    -    if (qh->hull_dim == 4 && qh->DROPdim == -1 &&
    -        (qh->PRINTcoplanar || qh->PRINTspheres || qh->PRINTcentrums)) {
    -      qh_fprintf(qh, qh->ferr, 7042, "qhull input warning: coplanars, vertices, and centrums output not\n\
    -available for 4-d output(ignored).  Could use 'GDn' instead.\n");
    -      qh->PRINTcoplanar= qh->PRINTspheres= qh->PRINTcentrums= False;
    -    }
    -  }
    -  if (!qh->KEEPcoplanar && !qh->KEEPinside && !qh->ONLYgood) {
    -    if ((qh->PRINTcoplanar && qh->PRINTspheres) || printcoplanar) {
    -      if (qh->QHULLfinished) {
    -        qh_fprintf(qh, qh->ferr, 7072, "qhull output warning: ignoring coplanar points, option 'Qc' was not set for the first run of qhull.\n");
    -      }else {
    -        qh->KEEPcoplanar = True;
    -        qh_option(qh, "Qcoplanar", NULL, NULL);
    -      }
    -    }
    -  }
    -  qh->PRINTdim= qh->hull_dim;
    -  if (qh->DROPdim >=0) {    /* after Geomview checks */
    -    if (qh->DROPdim < qh->hull_dim) {
    -      qh->PRINTdim--;
    -      if (!printgeom || qh->hull_dim < 3)
    -        qh_fprintf(qh, qh->ferr, 7043, "qhull input warning: drop dimension 'GD%d' is only available for 3-d/4-d Geomview\n", qh->DROPdim);
    -    }else
    -      qh->DROPdim= -1;
    -  }else if (qh->VORONOI) {
    -    qh->DROPdim= qh->hull_dim-1;
    -    qh->PRINTdim= qh->hull_dim-1;
    -  }
    -} /* qh_initqhull_outputflags */
    -
    -/*---------------------------------
    -
    -  qh_initqhull_start(qh, infile, outfile, errfile )
    -    allocate memory if needed and call qh_initqhull_start2()
    -*/
    -void qh_initqhull_start(qhT *qh, FILE *infile, FILE *outfile, FILE *errfile) {
    -
    -  qh_initstatistics(qh);
    -  qh_initqhull_start2(qh, infile, outfile, errfile);
    -} /* initqhull_start */
    -
    -/*---------------------------------
    -
    -  qh_initqhull_start2(qh, infile, outfile, errfile )
    -    start initialization of qhull
    -    initialize statistics, stdio, default values for global variables
    -    assumes qh is allocated
    -  notes:
    -    report errors elsewhere, error handling and g_qhull_output [Qhull.cpp, QhullQh()] not in initialized
    -  see:
    -    qh_maxmin() determines the precision constants
    -    qh_freeqhull()
    -*/
    -void qh_initqhull_start2(qhT *qh, FILE *infile, FILE *outfile, FILE *errfile) {
    -  time_t timedata;
    -  int seed;
    -
    -  qh_CPUclock; /* start the clock(for qh_clock).  One-shot. */
    -  /* memset is the same in qh_freeqhull() and qh_initqhull_start2() */
    -  memset((char *)qh, 0, sizeof(qhT)-sizeof(qhmemT)-sizeof(qhstatT));   /* every field is 0, FALSE, NULL */
    -  qh->NOerrexit= True;
    -  qh->ANGLEmerge= True;
    -  qh->DROPdim= -1;
    -  qh->ferr= errfile;
    -  qh->fin= infile;
    -  qh->fout= outfile;
    -  qh->furthest_id= qh_IDunknown;
    -  qh->JOGGLEmax= REALmax;
    -  qh->KEEPminArea = REALmax;
    -  qh->last_low= REALmax;
    -  qh->last_high= REALmax;
    -  qh->last_newhigh= REALmax;
    -  qh->last_random= 1;
    -  qh->max_outside= 0.0;
    -  qh->max_vertex= 0.0;
    -  qh->MAXabs_coord= 0.0;
    -  qh->MAXsumcoord= 0.0;
    -  qh->MAXwidth= -REALmax;
    -  qh->MERGEindependent= True;
    -  qh->MINdenom_1= fmax_(1.0/REALmax, REALmin); /* used by qh_scalepoints */
    -  qh->MINoutside= 0.0;
    -  qh->MINvisible= REALmax;
    -  qh->MAXcoplanar= REALmax;
    -  qh->outside_err= REALmax;
    -  qh->premerge_centrum= 0.0;
    -  qh->premerge_cos= REALmax;
    -  qh->PRINTprecision= True;
    -  qh->PRINTradius= 0.0;
    -  qh->postmerge_cos= REALmax;
    -  qh->postmerge_centrum= 0.0;
    -  qh->ROTATErandom= INT_MIN;
    -  qh->MERGEvertices= True;
    -  qh->totarea= 0.0;
    -  qh->totvol= 0.0;
    -  qh->TRACEdist= REALmax;
    -  qh->TRACEpoint= qh_IDunknown; /* recompile or use 'TPn' */
    -  qh->tracefacet_id= UINT_MAX;  /* recompile to trace a facet */
    -  qh->tracevertex_id= UINT_MAX; /* recompile to trace a vertex */
    -  seed= (int)time(&timedata);
    -  qh_RANDOMseed_(qh, seed);
    -  qh->run_id= qh_RANDOMint;
    -  if(!qh->run_id)
    -      qh->run_id++;  /* guarantee non-zero */
    -  qh_option(qh, "run-id", &qh->run_id, NULL);
    -  strcat(qh->qhull, "qhull");
    -} /* initqhull_start2 */
    -
    -/*---------------------------------
    -
    -  qh_initthresholds(qh, commandString )
    -    set thresholds for printing and scaling from commandString
    -
    -  returns:
    -    sets qh.GOODthreshold or qh.SPLITthreshold if 'Pd0D1' used
    -
    -  see:
    -    qh_initflags(), 'Qbk' 'QBk' 'Pdk' and 'PDk'
    -    qh_inthresholds()
    -
    -  design:
    -    for each 'Pdn' or 'PDn' option
    -      check syntax
    -      set qh.lower_threshold or qh.upper_threshold
    -    set qh.GOODthreshold if an unbounded threshold is used
    -    set qh.SPLITthreshold if a bounded threshold is used
    -*/
    -void qh_initthresholds(qhT *qh, char *command) {
    -  realT value;
    -  int idx, maxdim, k;
    -  char *s= command; /* non-const due to strtol */
    -  char key;
    -
    -  maxdim= qh->input_dim;
    -  if (qh->DELAUNAY && (qh->PROJECTdelaunay || qh->PROJECTinput))
    -    maxdim++;
    -  while (*s) {
    -    if (*s == '-')
    -      s++;
    -    if (*s == 'P') {
    -      s++;
    -      while (*s && !isspace(key= *s++)) {
    -        if (key == 'd' || key == 'D') {
    -          if (!isdigit(*s)) {
    -            qh_fprintf(qh, qh->ferr, 7044, "qhull warning: no dimension given for Print option '%c' at: %s.  Ignored\n",
    -                    key, s-1);
    -            continue;
    -          }
    -          idx= qh_strtol(s, &s);
    -          if (idx >= qh->hull_dim) {
    -            qh_fprintf(qh, qh->ferr, 7045, "qhull warning: dimension %d for Print option '%c' is >= %d.  Ignored\n",
    -                idx, key, qh->hull_dim);
    -            continue;
    -          }
    -          if (*s == ':') {
    -            s++;
    -            value= qh_strtod(s, &s);
    -            if (fabs((double)value) > 1.0) {
    -              qh_fprintf(qh, qh->ferr, 7046, "qhull warning: value %2.4g for Print option %c is > +1 or < -1.  Ignored\n",
    -                      value, key);
    -              continue;
    -            }
    -          }else
    -            value= 0.0;
    -          if (key == 'd')
    -            qh->lower_threshold[idx]= value;
    -          else
    -            qh->upper_threshold[idx]= value;
    -        }
    -      }
    -    }else if (*s == 'Q') {
    -      s++;
    -      while (*s && !isspace(key= *s++)) {
    -        if (key == 'b' && *s == 'B') {
    -          s++;
    -          for (k=maxdim; k--; ) {
    -            qh->lower_bound[k]= -qh_DEFAULTbox;
    -            qh->upper_bound[k]= qh_DEFAULTbox;
    -          }
    -        }else if (key == 'b' && *s == 'b')
    -          s++;
    -        else if (key == 'b' || key == 'B') {
    -          if (!isdigit(*s)) {
    -            qh_fprintf(qh, qh->ferr, 7047, "qhull warning: no dimension given for Qhull option %c.  Ignored\n",
    -                    key);
    -            continue;
    -          }
    -          idx= qh_strtol(s, &s);
    -          if (idx >= maxdim) {
    -            qh_fprintf(qh, qh->ferr, 7048, "qhull warning: dimension %d for Qhull option %c is >= %d.  Ignored\n",
    -                idx, key, maxdim);
    -            continue;
    -          }
    -          if (*s == ':') {
    -            s++;
    -            value= qh_strtod(s, &s);
    -          }else if (key == 'b')
    -            value= -qh_DEFAULTbox;
    -          else
    -            value= qh_DEFAULTbox;
    -          if (key == 'b')
    -            qh->lower_bound[idx]= value;
    -          else
    -            qh->upper_bound[idx]= value;
    -        }
    -      }
    -    }else {
    -      while (*s && !isspace(*s))
    -        s++;
    -    }
    -    while (isspace(*s))
    -      s++;
    -  }
    -  for (k=qh->hull_dim; k--; ) {
    -    if (qh->lower_threshold[k] > -REALmax/2) {
    -      qh->GOODthreshold= True;
    -      if (qh->upper_threshold[k] < REALmax/2) {
    -        qh->SPLITthresholds= True;
    -        qh->GOODthreshold= False;
    -        break;
    -      }
    -    }else if (qh->upper_threshold[k] < REALmax/2)
    -      qh->GOODthreshold= True;
    -  }
    -} /* initthresholds */
    -
    -/*---------------------------------
    -
    -  qh_lib_check( qhullLibraryType, qhTsize, vertexTsize, ridgeTsize, facetTsize, setTsize, qhmemTsize )
    -    Report error if library does not agree with caller
    -
    -  notes:
    -    NOerrors -- qh_lib_check can not call qh_errexit()
    -*/
    -void qh_lib_check(int qhullLibraryType, int qhTsize, int vertexTsize, int ridgeTsize, int facetTsize, int setTsize, int qhmemTsize) {
    -    boolT iserror= False;
    -
    -#if defined(_MSC_VER) && defined(_DEBUG) && defined(QHULL_CRTDBG)  /* user_r.h */
    -    // _CrtSetBreakAlloc(744);  /* Break at memalloc {744}, or 'watch' _crtBreakAlloc */
    -    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_DELAY_FREE_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) );
    -    _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG );
    -    _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDERR );
    -    _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG );
    -    _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDERR );
    -    _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG );
    -    _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDERR );
    -#endif
    -
    -    if (qhullLibraryType==QHULL_NON_REENTRANT) { /* 0 */
    -        qh_fprintf_stderr(6257, "qh_lib_check: Incorrect qhull library called.  Caller uses non-reentrant Qhull with a static qhT.  Library is reentrant.\n");
    -        iserror= True;
    -    }else if (qhullLibraryType==QHULL_QH_POINTER) { /* 1 */
    -        qh_fprintf_stderr(6258, "qh_lib_check: Incorrect qhull library called.  Caller uses non-reentrant Qhull with a dynamic qhT via qh_QHpointer.  Library is reentrant.\n");
    -        iserror= True;
    -    }else if (qhullLibraryType!=QHULL_REENTRANT) { /* 2 */
    -        qh_fprintf_stderr(6262, "qh_lib_check: Expecting qhullLibraryType QHULL_NON_REENTRANT(0), QHULL_QH_POINTER(1), or QHULL_REENTRANT(2).  Got %d\n", qhullLibraryType);
    -        iserror= True;
    -    }
    -    if (qhTsize != sizeof(qhT)) {
    -        qh_fprintf_stderr(6249, "qh_lib_check: Incorrect qhull library called.  Size of qhT for caller is %d, but for library is %d.\n", qhTsize, sizeof(qhT));
    -        iserror= True;
    -    }
    -    if (vertexTsize != sizeof(vertexT)) {
    -        qh_fprintf_stderr(6250, "qh_lib_check: Incorrect qhull library called.  Size of vertexT for caller is %d, but for library is %d.\n", vertexTsize, sizeof(vertexT));
    -        iserror= True;
    -    }
    -    if (ridgeTsize != sizeof(ridgeT)) {
    -        qh_fprintf_stderr(6251, "qh_lib_check: Incorrect qhull library called.  Size of ridgeT for caller is %d, but for library is %d.\n", ridgeTsize, sizeof(ridgeT));
    -        iserror= True;
    -    }
    -    if (facetTsize != sizeof(facetT)) {
    -        qh_fprintf_stderr(6252, "qh_lib_check: Incorrect qhull library called.  Size of facetT for caller is %d, but for library is %d.\n", facetTsize, sizeof(facetT));
    -        iserror= True;
    -    }
    -    if (setTsize && setTsize != sizeof(setT)) {
    -        qh_fprintf_stderr(6253, "qh_lib_check: Incorrect qhull library called.  Size of setT for caller is %d, but for library is %d.\n", setTsize, sizeof(setT));
    -        iserror= True;
    -    }
    -    if (qhmemTsize && qhmemTsize != sizeof(qhmemT)) {
    -        qh_fprintf_stderr(6254, "qh_lib_check: Incorrect qhull library called.  Size of qhmemT for caller is %d, but for library is %d.\n", qhmemTsize, sizeof(qhmemT));
    -        iserror= True;
    -    }
    -    if (iserror) {
    -        qh_fprintf_stderr(6259, "qh_lib_check: Cannot continue.  Library '%s' is reentrant (e.g., qhull_r.so)\n", qh_version2);
    -        qh_exit(qh_ERRqhull);  /* can not use qh_errexit() */
    -    }
    -} /* lib_check */
    -
    -/*---------------------------------
    -
    -  qh_option(qh, option, intVal, realVal )
    -    add an option description to qh.qhull_options
    -
    -  notes:
    -    NOerrors -- qh_option can not call qh_errexit() [qh_initqhull_start2]
    -    will be printed with statistics ('Ts') and errors
    -    strlen(option) < 40
    -*/
    -void qh_option(qhT *qh, const char *option, int *i, realT *r) {
    -  char buf[200];
    -  int len, maxlen;
    -
    -  sprintf(buf, "  %s", option);
    -  if (i)
    -    sprintf(buf+strlen(buf), " %d", *i);
    -  if (r)
    -    sprintf(buf+strlen(buf), " %2.2g", *r);
    -  len= (int)strlen(buf);  /* WARN64 */
    -  qh->qhull_optionlen += len;
    -  maxlen= sizeof(qh->qhull_options) - len -1;
    -  maximize_(maxlen, 0);
    -  if (qh->qhull_optionlen >= qh_OPTIONline && maxlen > 0) {
    -    qh->qhull_optionlen= len;
    -    strncat(qh->qhull_options, "\n", (size_t)(maxlen--));
    -  }
    -  strncat(qh->qhull_options, buf, (size_t)maxlen);
    -} /* option */
    -
    -/*---------------------------------
    -
    -  qh_zero( qh, errfile )
    -    Initialize and zero Qhull's memory for qh_new_qhull()
    -
    -  notes:
    -    Not needed in global.c because static variables are initialized to zero
    -*/
    -void qh_zero(qhT *qh, FILE *errfile) {
    -    memset((char *)qh, 0, sizeof(qhT));   /* every field is 0, FALSE, NULL */
    -    qh->NOerrexit= True;
    -    qh_meminit(qh, errfile);
    -} /* zero */
    -
    diff --git a/src/qhull/src/libqhull_r/index.htm b/src/qhull/src/libqhull_r/index.htm
    deleted file mode 100644
    index c62030e06bd..00000000000
    --- a/src/qhull/src/libqhull_r/index.htm
    +++ /dev/null
    @@ -1,266 +0,0 @@
    -
    -
    -
    -
    -Reentrant Qhull functions, macros, and data structures
    -
    -
    -
    -
    -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code
    -To: Qhull files
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser - -


    - - -

    Reentrant Qhull functions, macros, and data structures

    -
    -

    The following sections provide an overview and index to -reentrant Qhull's functions, macros, and data structures. -Each section starts with an introduction. -See also Calling -Qhull from C programs and Calling Qhull from C++ programs.

    - -

    Qhull uses the following conventions:

    -
    - -
      -
    • in code, global variables start with "qh " -
    • in documentation, global variables start with 'qh.' -
    • constants start with an upper case word -
    • important globals include an '_' -
    • functions, macros, and constants start with "qh_"
    • -
    • data types end in "T"
    • -
    • macros with arguments end in "_"
    • -
    • iterators are macros that use local variables
    • -
    • iterators for sets start with "FOREACH"
    • -
    • iterators for lists start with "FORALL"
    • -
    • qhull options are in single quotes (e.g., 'Pdn')
    • -
    • lists are sorted alphabetically
    • -
    • preprocessor directives on left margin for older compilers
    • -
    -
    -

    -Reentrant Qhull is nearly the same as non-reentrant Qhull. In reentrant -Qhull, the qhT data structure is the first parameter to most functions. Qhull accesses -this data structure with 'qh->...'. -In non-reentrant Qhull, the global data structure is either a struct (qh_QHpointer==0) -or a pointer (qh_QHpointer==1). The non-reentrant code looks different because this data -structure is accessed via the 'qh' macro. This macro expands to 'qh_qh.' or 'qh_qh->' (resp.). -

    -When reading code with an editor, a search for -'"function' -will locate the header of qh_function. A search for '* function' -will locate the tail of qh_function. - -

    A useful starting point is libqhull_r.h. It defines most -of Qhull data structures and top-level functions. Search for 'PFn' to -determine the corresponding constant in Qhull. Search for 'Fp' to -determine the corresponding qh_PRINT... constant. -Search io_r.c to learn how the print function is implemented.

    - -

    If your web browser is configured for .c and .h files, the function, macro, and data type links -go to the corresponding source location. To configure your web browser for .c and .h files. -

      -
    • In the Download Preferences or Options panel, add file extensions 'c' and 'h' to mime type 'text/html'. -
    • Opera 12.10 -
        -
      1. In Tools > Preferences > Advanced > Downloads -
      2. Uncheck 'Hide file types opened with Opera' -
      3. Quick find 'html' -
      4. Select 'text/html' > Edit -
      5. Add File extensions 'c,h,' -
      6. Click 'OK' -
      -
    • Internet Explorer -- Mime types are not available from 'Internet Options'. Is there a registry key for these settings? -
    • Firefox -- Mime types are not available from 'Preferences'. Is there an add-on to change the file extensions for a mime type? -
    • Chrome -- Can Chrome be configured? -
    - -

    -Please report documentation and link errors -to qhull-bug@qhull.org. -

    - -

    Copyright © 1997-2015 C.B. Barber

    - -
    - -

    »Qhull files

    -
    - -

    This sections lists the .c and .h files for Qhull. Please -refer to these files for detailed information.

    -
    - -
    -
    Makefile, CMakeLists.txt
    -
    Makefile is preconfigured for gcc. CMakeLists.txt supports multiple -platforms with CMake. -Qhull includes project files for Visual Studio and Qt. -
    - -
     
    -
    libqhull_r.h
    -
    Include file for the Qhull library (libqhull.so, qhull.dll, libqhullstatic.a). -Data structures are documented under Poly. -Global variables are documented under Global. -Other data structures and variables are documented under -Qhull or Geom.
    - -
     
    -
    Geom, -geom_r.h, -geom_r.c, -geom2_r.c, -random_r.c, -random_r.h
    -
    Geometric routines. These routines implement mathematical -functions such as Gaussian elimination and geometric -routines needed for Qhull. Frequently used routines are -in geom_r.c while infrequent ones are in geom2_r.c. -
    - -
     
    -
    Global, -global_r.c, -libqhull_r.h
    -
    Global routines. Qhull uses a global data structure, qh, -to store globally defined constants, lists, sets, and -variables. -global_r.c initializes and frees these -structures.
    - -
     
    -
    Io, io_r.h, -io_r.c
    -
    Input and output routines. Qhull provides a wide range of -input and output options.
    - -
     
    -
    Mem, -mem_r.h, -mem_r.c
    -
    Memory routines. Qhull provides memory allocation and -deallocation. It uses quick-fit allocation.
    - -
     
    -
    Merge, -merge_r.h, -merge_r.c
    -
    Merge routines. Qhull handles precision problems by -merged facets or joggled input. These routines merge simplicial facets, -merge non-simplicial facets, merge cycles of facets, and -rename redundant vertices.
    - -
     
    -
    Poly, -poly_r.h, -poly_r.c, -poly2_r.c, -libqhull_r.h
    -
    Polyhedral routines. Qhull produces a polyhedron as a -list of facets with vertices, neighbors, ridges, and -geometric information. libqhull_r.h defines the main -data structures. Frequently used routines are in poly_r.c -while infrequent ones are in poly2_r.c.
    - -
     
    -
    Qhull, -libqhull_r.c, -libqhull_r.h, -qhull_ra.h, -unix_r.c , -qconvex_r.c , -qdelaun_r.c , -qhalf_r.c , -qvoronoi_r.c
    -
    Top-level routines. The Quickhull algorithm is -implemented by libqhull_r.c. qhull_ra.h -includes all header files.
    - -
     
    -
    Set, -qset_r.h, -qset_r.c
    -
    Set routines. Qhull implements its data structures as -sets. A set is an array of pointers that is expanded as -needed. This is a separate package that may be used in -other applications.
    - -
     
    -
    Stat, -stat_r.h, -stat_r.c
    -
    Statistical routines. Qhull maintains statistics about -its implementation.
    - -
     
    -
    User, -user_r.h, -user_r.c, -user_eg_r.c, -user_eg2_r.c, -user_eg3_r.cpp, -
    -
    User-defined routines. Qhull allows the user to configure -the code with defined constants and specialized routines. -
    -
    -
    - -
    -

    -
    -

    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull files
    -To: Geom • -GlobalIo -• MemMerge -• PolyQhull -• SetStat -• User
    - -

    -
    -

    The -Geometry Center Home Page

    -

    Comments to: qhull@qhull.org -
    -Created: May 2, 1997 --- Last modified: see top

    - - diff --git a/src/qhull/src/libqhull_r/io_r.c b/src/qhull/src/libqhull_r/io_r.c deleted file mode 100644 index 9721a000dd2..00000000000 --- a/src/qhull/src/libqhull_r/io_r.c +++ /dev/null @@ -1,4062 +0,0 @@ -/*
      ---------------------------------
    -
    -   io_r.c
    -   Input/Output routines of qhull application
    -
    -   see qh-io_r.htm and io_r.h
    -
    -   see user_r.c for qh_errprint and qh_printfacetlist
    -
    -   unix_r.c calls qh_readpoints and qh_produce_output
    -
    -   unix_r.c and user_r.c are the only callers of io_r.c functions
    -   This allows the user to avoid loading io_r.o from qhull.a
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull_r/io_r.c#4 $$Change: 2064 $
    -   $DateTime: 2016/01/18 12:36:08 $$Author: bbarber $
    -*/
    -
    -#include "qhull_ra.h"
    -
    -/*========= -functions in alphabetical order after qh_produce_output(qh)  =====*/
    -
    -/*---------------------------------
    -
    -  qh_produce_output(qh)
    -  qh_produce_output2(qh)
    -    prints out the result of qhull in desired format
    -    qh_produce_output2(qh) does not call qh_prepare_output(qh)
    -    if qh.GETarea
    -      computes and prints area and volume
    -    qh.PRINTout[] is an array of output formats
    -
    -  notes:
    -    prints output in qh.PRINTout order
    -*/
    -void qh_produce_output(qhT *qh) {
    -    int tempsize= qh_setsize(qh, qh->qhmem.tempstack);
    -
    -    qh_prepare_output(qh);
    -    qh_produce_output2(qh);
    -    if (qh_setsize(qh, qh->qhmem.tempstack) != tempsize) {
    -        qh_fprintf(qh, qh->ferr, 6206, "qhull internal error (qh_produce_output): temporary sets not empty(%d)\n",
    -            qh_setsize(qh, qh->qhmem.tempstack));
    -        qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -    }
    -} /* produce_output */
    -
    -
    -void qh_produce_output2(qhT *qh) {
    -  int i, tempsize= qh_setsize(qh, qh->qhmem.tempstack), d_1;
    -
    -  if (qh->PRINTsummary)
    -    qh_printsummary(qh, qh->ferr);
    -  else if (qh->PRINTout[0] == qh_PRINTnone)
    -    qh_printsummary(qh, qh->fout);
    -  for (i=0; i < qh_PRINTEND; i++)
    -    qh_printfacets(qh, qh->fout, qh->PRINTout[i], qh->facet_list, NULL, !qh_ALL);
    -  qh_allstatistics(qh);
    -  if (qh->PRINTprecision && !qh->MERGING && (qh->JOGGLEmax > REALmax/2 || qh->RERUN))
    -    qh_printstats(qh, qh->ferr, qh->qhstat.precision, NULL);
    -  if (qh->VERIFYoutput && (zzval_(Zridge) > 0 || zzval_(Zridgemid) > 0))
    -    qh_printstats(qh, qh->ferr, qh->qhstat.vridges, NULL);
    -  if (qh->PRINTstatistics) {
    -    qh_printstatistics(qh, qh->ferr, "");
    -    qh_memstatistics(qh, qh->ferr);
    -    d_1= sizeof(setT) + (qh->hull_dim - 1) * SETelemsize;
    -    qh_fprintf(qh, qh->ferr, 8040, "\
    -    size in bytes: merge %d ridge %d vertex %d facet %d\n\
    -         normal %d ridge vertices %d facet vertices or neighbors %d\n",
    -            (int)sizeof(mergeT), (int)sizeof(ridgeT),
    -            (int)sizeof(vertexT), (int)sizeof(facetT),
    -            qh->normal_size, d_1, d_1 + SETelemsize);
    -  }
    -  if (qh_setsize(qh, qh->qhmem.tempstack) != tempsize) {
    -    qh_fprintf(qh, qh->ferr, 6065, "qhull internal error (qh_produce_output2): temporary sets not empty(%d)\n",
    -             qh_setsize(qh, qh->qhmem.tempstack));
    -    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -  }
    -} /* produce_output2 */
    -
    -/*---------------------------------
    -
    -  qh_dfacet(qh, id )
    -    print facet by id, for debugging
    -
    -*/
    -void qh_dfacet(qhT *qh, unsigned id) {
    -  facetT *facet;
    -
    -  FORALLfacets {
    -    if (facet->id == id) {
    -      qh_printfacet(qh, qh->fout, facet);
    -      break;
    -    }
    -  }
    -} /* dfacet */
    -
    -
    -/*---------------------------------
    -
    -  qh_dvertex(qh, id )
    -    print vertex by id, for debugging
    -*/
    -void qh_dvertex(qhT *qh, unsigned id) {
    -  vertexT *vertex;
    -
    -  FORALLvertices {
    -    if (vertex->id == id) {
    -      qh_printvertex(qh, qh->fout, vertex);
    -      break;
    -    }
    -  }
    -} /* dvertex */
    -
    -
    -/*---------------------------------
    -
    -  qh_compare_facetarea(p1, p2 )
    -    used by qsort() to order facets by area
    -*/
    -int qh_compare_facetarea(const void *p1, const void *p2) {
    -  const facetT *a= *((facetT *const*)p1), *b= *((facetT *const*)p2);
    -
    -  if (!a->isarea)
    -    return -1;
    -  if (!b->isarea)
    -    return 1;
    -  if (a->f.area > b->f.area)
    -    return 1;
    -  else if (a->f.area == b->f.area)
    -    return 0;
    -  return -1;
    -} /* compare_facetarea */
    -
    -/*---------------------------------
    -
    -  qh_compare_facetmerge(p1, p2 )
    -    used by qsort() to order facets by number of merges
    -*/
    -int qh_compare_facetmerge(const void *p1, const void *p2) {
    -  const facetT *a= *((facetT *const*)p1), *b= *((facetT *const*)p2);
    -
    -  return(a->nummerge - b->nummerge);
    -} /* compare_facetvisit */
    -
    -/*---------------------------------
    -
    -  qh_compare_facetvisit(p1, p2 )
    -    used by qsort() to order facets by visit id or id
    -*/
    -int qh_compare_facetvisit(const void *p1, const void *p2) {
    -  const facetT *a= *((facetT *const*)p1), *b= *((facetT *const*)p2);
    -  int i,j;
    -
    -  if (!(i= a->visitid))
    -    i= 0 - a->id; /* do not convert to int, sign distinguishes id from visitid */
    -  if (!(j= b->visitid))
    -    j= 0 - b->id;
    -  return(i - j);
    -} /* compare_facetvisit */
    -
    -/*---------------------------------
    -
    -  qh_compare_vertexpoint( p1, p2 )
    -    used by qsort() to order vertices by point id
    -
    -  Not usable in qhulllib_r since qh_pointid depends on qh
    -
    -  int qh_compare_vertexpoint(const void *p1, const void *p2) {
    -  const vertexT *a= *((vertexT *const*)p1), *b= *((vertexT *const*)p2);
    -
    -  return((qh_pointid(qh, a->point) > qh_pointid(qh, b->point)?1:-1));
    -}*/
    -
    -/*---------------------------------
    -
    -  qh_copyfilename(qh, dest, size, source, length )
    -    copy filename identified by qh_skipfilename()
    -
    -  notes:
    -    see qh_skipfilename() for syntax
    -*/
    -void qh_copyfilename(qhT *qh, char *filename, int size, const char* source, int length) {
    -  char c= *source;
    -
    -  if (length > size + 1) {
    -      qh_fprintf(qh, qh->ferr, 6040, "qhull error: filename is more than %d characters, %s\n",  size-1, source);
    -      qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -  }
    -  strncpy(filename, source, length);
    -  filename[length]= '\0';
    -  if (c == '\'' || c == '"') {
    -    char *s= filename + 1;
    -    char *t= filename;
    -    while (*s) {
    -      if (*s == c) {
    -          if (s[-1] == '\\')
    -              t[-1]= c;
    -      }else
    -          *t++= *s;
    -      s++;
    -    }
    -    *t= '\0';
    -  }
    -} /* copyfilename */
    -
    -/*---------------------------------
    -
    -  qh_countfacets(qh, facetlist, facets, printall,
    -          numfacets, numsimplicial, totneighbors, numridges, numcoplanar, numtricoplanars  )
    -    count good facets for printing and set visitid
    -    if allfacets, ignores qh_skipfacet()
    -
    -  notes:
    -    qh_printsummary and qh_countfacets must match counts
    -
    -  returns:
    -    numfacets, numsimplicial, total neighbors, numridges, coplanars
    -    each facet with ->visitid indicating 1-relative position
    -      ->visitid==0 indicates not good
    -
    -  notes
    -    numfacets >= numsimplicial
    -    if qh.NEWfacets,
    -      does not count visible facets (matches qh_printafacet)
    -
    -  design:
    -    for all facets on facetlist and in facets set
    -      unless facet is skipped or visible (i.e., will be deleted)
    -        mark facet->visitid
    -        update counts
    -*/
    -void qh_countfacets(qhT *qh, facetT *facetlist, setT *facets, boolT printall,
    -    int *numfacetsp, int *numsimplicialp, int *totneighborsp, int *numridgesp, int *numcoplanarsp, int *numtricoplanarsp) {
    -  facetT *facet, **facetp;
    -  int numfacets= 0, numsimplicial= 0, numridges= 0, totneighbors= 0, numcoplanars= 0, numtricoplanars= 0;
    -
    -  FORALLfacet_(facetlist) {
    -    if ((facet->visible && qh->NEWfacets)
    -    || (!printall && qh_skipfacet(qh, facet)))
    -      facet->visitid= 0;
    -    else {
    -      facet->visitid= ++numfacets;
    -      totneighbors += qh_setsize(qh, facet->neighbors);
    -      if (facet->simplicial) {
    -        numsimplicial++;
    -        if (facet->keepcentrum && facet->tricoplanar)
    -          numtricoplanars++;
    -      }else
    -        numridges += qh_setsize(qh, facet->ridges);
    -      if (facet->coplanarset)
    -        numcoplanars += qh_setsize(qh, facet->coplanarset);
    -    }
    -  }
    -
    -  FOREACHfacet_(facets) {
    -    if ((facet->visible && qh->NEWfacets)
    -    || (!printall && qh_skipfacet(qh, facet)))
    -      facet->visitid= 0;
    -    else {
    -      facet->visitid= ++numfacets;
    -      totneighbors += qh_setsize(qh, facet->neighbors);
    -      if (facet->simplicial){
    -        numsimplicial++;
    -        if (facet->keepcentrum && facet->tricoplanar)
    -          numtricoplanars++;
    -      }else
    -        numridges += qh_setsize(qh, facet->ridges);
    -      if (facet->coplanarset)
    -        numcoplanars += qh_setsize(qh, facet->coplanarset);
    -    }
    -  }
    -  qh->visit_id += numfacets+1;
    -  *numfacetsp= numfacets;
    -  *numsimplicialp= numsimplicial;
    -  *totneighborsp= totneighbors;
    -  *numridgesp= numridges;
    -  *numcoplanarsp= numcoplanars;
    -  *numtricoplanarsp= numtricoplanars;
    -} /* countfacets */
    -
    -/*---------------------------------
    -
    -  qh_detvnorm(qh, vertex, vertexA, centers, offset )
    -    compute separating plane of the Voronoi diagram for a pair of input sites
    -    centers= set of facets (i.e., Voronoi vertices)
    -      facet->visitid= 0 iff vertex-at-infinity (i.e., unbounded)
    -
    -  assumes:
    -    qh_ASvoronoi and qh_vertexneighbors() already set
    -
    -  returns:
    -    norm
    -      a pointer into qh.gm_matrix to qh.hull_dim-1 reals
    -      copy the data before reusing qh.gm_matrix
    -    offset
    -      if 'QVn'
    -        sign adjusted so that qh.GOODvertexp is inside
    -      else
    -        sign adjusted so that vertex is inside
    -
    -    qh.gm_matrix= simplex of points from centers relative to first center
    -
    -  notes:
    -    in io_r.c so that code for 'v Tv' can be removed by removing io_r.c
    -    returns pointer into qh.gm_matrix to avoid tracking of temporary memory
    -
    -  design:
    -    determine midpoint of input sites
    -    build points as the set of Voronoi vertices
    -    select a simplex from points (if necessary)
    -      include midpoint if the Voronoi region is unbounded
    -    relocate the first vertex of the simplex to the origin
    -    compute the normalized hyperplane through the simplex
    -    orient the hyperplane toward 'QVn' or 'vertex'
    -    if 'Tv' or 'Ts'
    -      if bounded
    -        test that hyperplane is the perpendicular bisector of the input sites
    -      test that Voronoi vertices not in the simplex are still on the hyperplane
    -    free up temporary memory
    -*/
    -pointT *qh_detvnorm(qhT *qh, vertexT *vertex, vertexT *vertexA, setT *centers, realT *offsetp) {
    -  facetT *facet, **facetp;
    -  int  i, k, pointid, pointidA, point_i, point_n;
    -  setT *simplex= NULL;
    -  pointT *point, **pointp, *point0, *midpoint, *normal, *inpoint;
    -  coordT *coord, *gmcoord, *normalp;
    -  setT *points= qh_settemp(qh, qh->TEMPsize);
    -  boolT nearzero= False;
    -  boolT unbounded= False;
    -  int numcenters= 0;
    -  int dim= qh->hull_dim - 1;
    -  realT dist, offset, angle, zero= 0.0;
    -
    -  midpoint= qh->gm_matrix + qh->hull_dim * qh->hull_dim;  /* last row */
    -  for (k=0; k < dim; k++)
    -    midpoint[k]= (vertex->point[k] + vertexA->point[k])/2;
    -  FOREACHfacet_(centers) {
    -    numcenters++;
    -    if (!facet->visitid)
    -      unbounded= True;
    -    else {
    -      if (!facet->center)
    -        facet->center= qh_facetcenter(qh, facet->vertices);
    -      qh_setappend(qh, &points, facet->center);
    -    }
    -  }
    -  if (numcenters > dim) {
    -    simplex= qh_settemp(qh, qh->TEMPsize);
    -    qh_setappend(qh, &simplex, vertex->point);
    -    if (unbounded)
    -      qh_setappend(qh, &simplex, midpoint);
    -    qh_maxsimplex(qh, dim, points, NULL, 0, &simplex);
    -    qh_setdelnth(qh, simplex, 0);
    -  }else if (numcenters == dim) {
    -    if (unbounded)
    -      qh_setappend(qh, &points, midpoint);
    -    simplex= points;
    -  }else {
    -    qh_fprintf(qh, qh->ferr, 6216, "qhull internal error (qh_detvnorm): too few points(%d) to compute separating plane\n", numcenters);
    -    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -  }
    -  i= 0;
    -  gmcoord= qh->gm_matrix;
    -  point0= SETfirstt_(simplex, pointT);
    -  FOREACHpoint_(simplex) {
    -    if (qh->IStracing >= 4)
    -      qh_printmatrix(qh, qh->ferr, "qh_detvnorm: Voronoi vertex or midpoint",
    -                              &point, 1, dim);
    -    if (point != point0) {
    -      qh->gm_row[i++]= gmcoord;
    -      coord= point0;
    -      for (k=dim; k--; )
    -        *(gmcoord++)= *point++ - *coord++;
    -    }
    -  }
    -  qh->gm_row[i]= gmcoord;  /* does not overlap midpoint, may be used later for qh_areasimplex */
    -  normal= gmcoord;
    -  qh_sethyperplane_gauss(qh, dim, qh->gm_row, point0, True,
    -                normal, &offset, &nearzero);
    -  if (qh->GOODvertexp == vertexA->point)
    -    inpoint= vertexA->point;
    -  else
    -    inpoint= vertex->point;
    -  zinc_(Zdistio);
    -  dist= qh_distnorm(dim, inpoint, normal, &offset);
    -  if (dist > 0) {
    -    offset= -offset;
    -    normalp= normal;
    -    for (k=dim; k--; ) {
    -      *normalp= -(*normalp);
    -      normalp++;
    -    }
    -  }
    -  if (qh->VERIFYoutput || qh->PRINTstatistics) {
    -    pointid= qh_pointid(qh, vertex->point);
    -    pointidA= qh_pointid(qh, vertexA->point);
    -    if (!unbounded) {
    -      zinc_(Zdiststat);
    -      dist= qh_distnorm(dim, midpoint, normal, &offset);
    -      if (dist < 0)
    -        dist= -dist;
    -      zzinc_(Zridgemid);
    -      wwmax_(Wridgemidmax, dist);
    -      wwadd_(Wridgemid, dist);
    -      trace4((qh, qh->ferr, 4014, "qh_detvnorm: points %d %d midpoint dist %2.2g\n",
    -                 pointid, pointidA, dist));
    -      for (k=0; k < dim; k++)
    -        midpoint[k]= vertexA->point[k] - vertex->point[k];  /* overwrites midpoint! */
    -      qh_normalize(qh, midpoint, dim, False);
    -      angle= qh_distnorm(dim, midpoint, normal, &zero); /* qh_detangle uses dim+1 */
    -      if (angle < 0.0)
    -        angle= angle + 1.0;
    -      else
    -        angle= angle - 1.0;
    -      if (angle < 0.0)
    -        angle -= angle;
    -      trace4((qh, qh->ferr, 4015, "qh_detvnorm: points %d %d angle %2.2g nearzero %d\n",
    -                 pointid, pointidA, angle, nearzero));
    -      if (nearzero) {
    -        zzinc_(Zridge0);
    -        wwmax_(Wridge0max, angle);
    -        wwadd_(Wridge0, angle);
    -      }else {
    -        zzinc_(Zridgeok)
    -        wwmax_(Wridgeokmax, angle);
    -        wwadd_(Wridgeok, angle);
    -      }
    -    }
    -    if (simplex != points) {
    -      FOREACHpoint_i_(qh, points) {
    -        if (!qh_setin(simplex, point)) {
    -          facet= SETelemt_(centers, point_i, facetT);
    -          zinc_(Zdiststat);
    -          dist= qh_distnorm(dim, point, normal, &offset);
    -          if (dist < 0)
    -            dist= -dist;
    -          zzinc_(Zridge);
    -          wwmax_(Wridgemax, dist);
    -          wwadd_(Wridge, dist);
    -          trace4((qh, qh->ferr, 4016, "qh_detvnorm: points %d %d Voronoi vertex %d dist %2.2g\n",
    -                             pointid, pointidA, facet->visitid, dist));
    -        }
    -      }
    -    }
    -  }
    -  *offsetp= offset;
    -  if (simplex != points)
    -    qh_settempfree(qh, &simplex);
    -  qh_settempfree(qh, &points);
    -  return normal;
    -} /* detvnorm */
    -
    -/*---------------------------------
    -
    -  qh_detvridge(qh, vertexA )
    -    determine Voronoi ridge from 'seen' neighbors of vertexA
    -    include one vertex-at-infinite if an !neighbor->visitid
    -
    -  returns:
    -    temporary set of centers (facets, i.e., Voronoi vertices)
    -    sorted by center id
    -*/
    -setT *qh_detvridge(qhT *qh, vertexT *vertex) {
    -  setT *centers= qh_settemp(qh, qh->TEMPsize);
    -  setT *tricenters= qh_settemp(qh, qh->TEMPsize);
    -  facetT *neighbor, **neighborp;
    -  boolT firstinf= True;
    -
    -  FOREACHneighbor_(vertex) {
    -    if (neighbor->seen) {
    -      if (neighbor->visitid) {
    -        if (!neighbor->tricoplanar || qh_setunique(qh, &tricenters, neighbor->center))
    -          qh_setappend(qh, ¢ers, neighbor);
    -      }else if (firstinf) {
    -        firstinf= False;
    -        qh_setappend(qh, ¢ers, neighbor);
    -      }
    -    }
    -  }
    -  qsort(SETaddr_(centers, facetT), (size_t)qh_setsize(qh, centers),
    -             sizeof(facetT *), qh_compare_facetvisit);
    -  qh_settempfree(qh, &tricenters);
    -  return centers;
    -} /* detvridge */
    -
    -/*---------------------------------
    -
    -  qh_detvridge3(qh, atvertex, vertex )
    -    determine 3-d Voronoi ridge from 'seen' neighbors of atvertex and vertex
    -    include one vertex-at-infinite for !neighbor->visitid
    -    assumes all facet->seen2= True
    -
    -  returns:
    -    temporary set of centers (facets, i.e., Voronoi vertices)
    -    listed in adjacency order (!oriented)
    -    all facet->seen2= True
    -
    -  design:
    -    mark all neighbors of atvertex
    -    for each adjacent neighbor of both atvertex and vertex
    -      if neighbor selected
    -        add neighbor to set of Voronoi vertices
    -*/
    -setT *qh_detvridge3(qhT *qh, vertexT *atvertex, vertexT *vertex) {
    -  setT *centers= qh_settemp(qh, qh->TEMPsize);
    -  setT *tricenters= qh_settemp(qh, qh->TEMPsize);
    -  facetT *neighbor, **neighborp, *facet= NULL;
    -  boolT firstinf= True;
    -
    -  FOREACHneighbor_(atvertex)
    -    neighbor->seen2= False;
    -  FOREACHneighbor_(vertex) {
    -    if (!neighbor->seen2) {
    -      facet= neighbor;
    -      break;
    -    }
    -  }
    -  while (facet) {
    -    facet->seen2= True;
    -    if (neighbor->seen) {
    -      if (facet->visitid) {
    -        if (!facet->tricoplanar || qh_setunique(qh, &tricenters, facet->center))
    -          qh_setappend(qh, ¢ers, facet);
    -      }else if (firstinf) {
    -        firstinf= False;
    -        qh_setappend(qh, ¢ers, facet);
    -      }
    -    }
    -    FOREACHneighbor_(facet) {
    -      if (!neighbor->seen2) {
    -        if (qh_setin(vertex->neighbors, neighbor))
    -          break;
    -        else
    -          neighbor->seen2= True;
    -      }
    -    }
    -    facet= neighbor;
    -  }
    -  if (qh->CHECKfrequently) {
    -    FOREACHneighbor_(vertex) {
    -      if (!neighbor->seen2) {
    -          qh_fprintf(qh, qh->ferr, 6217, "qhull internal error (qh_detvridge3): neighbors of vertex p%d are not connected at facet %d\n",
    -                 qh_pointid(qh, vertex->point), neighbor->id);
    -        qh_errexit(qh, qh_ERRqhull, neighbor, NULL);
    -      }
    -    }
    -  }
    -  FOREACHneighbor_(atvertex)
    -    neighbor->seen2= True;
    -  qh_settempfree(qh, &tricenters);
    -  return centers;
    -} /* detvridge3 */
    -
    -/*---------------------------------
    -
    -  qh_eachvoronoi(qh, fp, printvridge, vertex, visitall, innerouter, inorder )
    -    if visitall,
    -      visit all Voronoi ridges for vertex (i.e., an input site)
    -    else
    -      visit all unvisited Voronoi ridges for vertex
    -      all vertex->seen= False if unvisited
    -    assumes
    -      all facet->seen= False
    -      all facet->seen2= True (for qh_detvridge3)
    -      all facet->visitid == 0 if vertex_at_infinity
    -                         == index of Voronoi vertex
    -                         >= qh.num_facets if ignored
    -    innerouter:
    -      qh_RIDGEall--  both inner (bounded) and outer(unbounded) ridges
    -      qh_RIDGEinner- only inner
    -      qh_RIDGEouter- only outer
    -
    -    if inorder
    -      orders vertices for 3-d Voronoi diagrams
    -
    -  returns:
    -    number of visited ridges (does not include previously visited ridges)
    -
    -    if printvridge,
    -      calls printvridge( fp, vertex, vertexA, centers)
    -        fp== any pointer (assumes FILE*)
    -        vertex,vertexA= pair of input sites that define a Voronoi ridge
    -        centers= set of facets (i.e., Voronoi vertices)
    -                 ->visitid == index or 0 if vertex_at_infinity
    -                 ordered for 3-d Voronoi diagram
    -  notes:
    -    uses qh.vertex_visit
    -
    -  see:
    -    qh_eachvoronoi_all()
    -
    -  design:
    -    mark selected neighbors of atvertex
    -    for each selected neighbor (either Voronoi vertex or vertex-at-infinity)
    -      for each unvisited vertex
    -        if atvertex and vertex share more than d-1 neighbors
    -          bump totalcount
    -          if printvridge defined
    -            build the set of shared neighbors (i.e., Voronoi vertices)
    -            call printvridge
    -*/
    -int qh_eachvoronoi(qhT *qh, FILE *fp, printvridgeT printvridge, vertexT *atvertex, boolT visitall, qh_RIDGE innerouter, boolT inorder) {
    -  boolT unbounded;
    -  int count;
    -  facetT *neighbor, **neighborp, *neighborA, **neighborAp;
    -  setT *centers;
    -  setT *tricenters= qh_settemp(qh, qh->TEMPsize);
    -
    -  vertexT *vertex, **vertexp;
    -  boolT firstinf;
    -  unsigned int numfacets= (unsigned int)qh->num_facets;
    -  int totridges= 0;
    -
    -  qh->vertex_visit++;
    -  atvertex->seen= True;
    -  if (visitall) {
    -    FORALLvertices
    -      vertex->seen= False;
    -  }
    -  FOREACHneighbor_(atvertex) {
    -    if (neighbor->visitid < numfacets)
    -      neighbor->seen= True;
    -  }
    -  FOREACHneighbor_(atvertex) {
    -    if (neighbor->seen) {
    -      FOREACHvertex_(neighbor->vertices) {
    -        if (vertex->visitid != qh->vertex_visit && !vertex->seen) {
    -          vertex->visitid= qh->vertex_visit;
    -          count= 0;
    -          firstinf= True;
    -          qh_settruncate(qh, tricenters, 0);
    -          FOREACHneighborA_(vertex) {
    -            if (neighborA->seen) {
    -              if (neighborA->visitid) {
    -                if (!neighborA->tricoplanar || qh_setunique(qh, &tricenters, neighborA->center))
    -                  count++;
    -              }else if (firstinf) {
    -                count++;
    -                firstinf= False;
    -              }
    -            }
    -          }
    -          if (count >= qh->hull_dim - 1) {  /* e.g., 3 for 3-d Voronoi */
    -            if (firstinf) {
    -              if (innerouter == qh_RIDGEouter)
    -                continue;
    -              unbounded= False;
    -            }else {
    -              if (innerouter == qh_RIDGEinner)
    -                continue;
    -              unbounded= True;
    -            }
    -            totridges++;
    -            trace4((qh, qh->ferr, 4017, "qh_eachvoronoi: Voronoi ridge of %d vertices between sites %d and %d\n",
    -                  count, qh_pointid(qh, atvertex->point), qh_pointid(qh, vertex->point)));
    -            if (printvridge && fp) {
    -              if (inorder && qh->hull_dim == 3+1) /* 3-d Voronoi diagram */
    -                centers= qh_detvridge3(qh, atvertex, vertex);
    -              else
    -                centers= qh_detvridge(qh, vertex);
    -              (*printvridge)(qh, fp, atvertex, vertex, centers, unbounded);
    -              qh_settempfree(qh, ¢ers);
    -            }
    -          }
    -        }
    -      }
    -    }
    -  }
    -  FOREACHneighbor_(atvertex)
    -    neighbor->seen= False;
    -  qh_settempfree(qh, &tricenters);
    -  return totridges;
    -} /* eachvoronoi */
    -
    -
    -/*---------------------------------
    -
    -  qh_eachvoronoi_all(qh, fp, printvridge, isUpper, innerouter, inorder )
    -    visit all Voronoi ridges
    -
    -    innerouter:
    -      see qh_eachvoronoi()
    -
    -    if inorder
    -      orders vertices for 3-d Voronoi diagrams
    -
    -  returns
    -    total number of ridges
    -
    -    if isUpper == facet->upperdelaunay  (i.e., a Vornoi vertex)
    -      facet->visitid= Voronoi vertex index(same as 'o' format)
    -    else
    -      facet->visitid= 0
    -
    -    if printvridge,
    -      calls printvridge( fp, vertex, vertexA, centers)
    -      [see qh_eachvoronoi]
    -
    -  notes:
    -    Not used for qhull.exe
    -    same effect as qh_printvdiagram but ridges not sorted by point id
    -*/
    -int qh_eachvoronoi_all(qhT *qh, FILE *fp, printvridgeT printvridge, boolT isUpper, qh_RIDGE innerouter, boolT inorder) {
    -  facetT *facet;
    -  vertexT *vertex;
    -  int numcenters= 1;  /* vertex 0 is vertex-at-infinity */
    -  int totridges= 0;
    -
    -  qh_clearcenters(qh, qh_ASvoronoi);
    -  qh_vertexneighbors(qh);
    -  maximize_(qh->visit_id, (unsigned) qh->num_facets);
    -  FORALLfacets {
    -    facet->visitid= 0;
    -    facet->seen= False;
    -    facet->seen2= True;
    -  }
    -  FORALLfacets {
    -    if (facet->upperdelaunay == isUpper)
    -      facet->visitid= numcenters++;
    -  }
    -  FORALLvertices
    -    vertex->seen= False;
    -  FORALLvertices {
    -    if (qh->GOODvertex > 0 && qh_pointid(qh, vertex->point)+1 != qh->GOODvertex)
    -      continue;
    -    totridges += qh_eachvoronoi(qh, fp, printvridge, vertex,
    -                   !qh_ALL, innerouter, inorder);
    -  }
    -  return totridges;
    -} /* eachvoronoi_all */
    -
    -/*---------------------------------
    -
    -  qh_facet2point(qh, facet, point0, point1, mindist )
    -    return two projected temporary vertices for a 2-d facet
    -    may be non-simplicial
    -
    -  returns:
    -    point0 and point1 oriented and projected to the facet
    -    returns mindist (maximum distance below plane)
    -*/
    -void qh_facet2point(qhT *qh, facetT *facet, pointT **point0, pointT **point1, realT *mindist) {
    -  vertexT *vertex0, *vertex1;
    -  realT dist;
    -
    -  if (facet->toporient ^ qh_ORIENTclock) {
    -    vertex0= SETfirstt_(facet->vertices, vertexT);
    -    vertex1= SETsecondt_(facet->vertices, vertexT);
    -  }else {
    -    vertex1= SETfirstt_(facet->vertices, vertexT);
    -    vertex0= SETsecondt_(facet->vertices, vertexT);
    -  }
    -  zadd_(Zdistio, 2);
    -  qh_distplane(qh, vertex0->point, facet, &dist);
    -  *mindist= dist;
    -  *point0= qh_projectpoint(qh, vertex0->point, facet, dist);
    -  qh_distplane(qh, vertex1->point, facet, &dist);
    -  minimize_(*mindist, dist);
    -  *point1= qh_projectpoint(qh, vertex1->point, facet, dist);
    -} /* facet2point */
    -
    -
    -/*---------------------------------
    -
    -  qh_facetvertices(qh, facetlist, facets, allfacets )
    -    returns temporary set of vertices in a set and/or list of facets
    -    if allfacets, ignores qh_skipfacet()
    -
    -  returns:
    -    vertices with qh.vertex_visit
    -
    -  notes:
    -    optimized for allfacets of facet_list
    -
    -  design:
    -    if allfacets of facet_list
    -      create vertex set from vertex_list
    -    else
    -      for each selected facet in facets or facetlist
    -        append unvisited vertices to vertex set
    -*/
    -setT *qh_facetvertices(qhT *qh, facetT *facetlist, setT *facets, boolT allfacets) {
    -  setT *vertices;
    -  facetT *facet, **facetp;
    -  vertexT *vertex, **vertexp;
    -
    -  qh->vertex_visit++;
    -  if (facetlist == qh->facet_list && allfacets && !facets) {
    -    vertices= qh_settemp(qh, qh->num_vertices);
    -    FORALLvertices {
    -      vertex->visitid= qh->vertex_visit;
    -      qh_setappend(qh, &vertices, vertex);
    -    }
    -  }else {
    -    vertices= qh_settemp(qh, qh->TEMPsize);
    -    FORALLfacet_(facetlist) {
    -      if (!allfacets && qh_skipfacet(qh, facet))
    -        continue;
    -      FOREACHvertex_(facet->vertices) {
    -        if (vertex->visitid != qh->vertex_visit) {
    -          vertex->visitid= qh->vertex_visit;
    -          qh_setappend(qh, &vertices, vertex);
    -        }
    -      }
    -    }
    -  }
    -  FOREACHfacet_(facets) {
    -    if (!allfacets && qh_skipfacet(qh, facet))
    -      continue;
    -    FOREACHvertex_(facet->vertices) {
    -      if (vertex->visitid != qh->vertex_visit) {
    -        vertex->visitid= qh->vertex_visit;
    -        qh_setappend(qh, &vertices, vertex);
    -      }
    -    }
    -  }
    -  return vertices;
    -} /* facetvertices */
    -
    -/*---------------------------------
    -
    -  qh_geomplanes(qh, facet, outerplane, innerplane )
    -    return outer and inner planes for Geomview
    -    qh.PRINTradius is size of vertices and points (includes qh.JOGGLEmax)
    -
    -  notes:
    -    assume precise calculations in io.c with roundoff covered by qh_GEOMepsilon
    -*/
    -void qh_geomplanes(qhT *qh, facetT *facet, realT *outerplane, realT *innerplane) {
    -  realT radius;
    -
    -  if (qh->MERGING || qh->JOGGLEmax < REALmax/2) {
    -    qh_outerinner(qh, facet, outerplane, innerplane);
    -    radius= qh->PRINTradius;
    -    if (qh->JOGGLEmax < REALmax/2)
    -      radius -= qh->JOGGLEmax * sqrt((realT)qh->hull_dim);  /* already accounted for in qh_outerinner() */
    -    *outerplane += radius;
    -    *innerplane -= radius;
    -    if (qh->PRINTcoplanar || qh->PRINTspheres) {
    -      *outerplane += qh->MAXabs_coord * qh_GEOMepsilon;
    -      *innerplane -= qh->MAXabs_coord * qh_GEOMepsilon;
    -    }
    -  }else
    -    *innerplane= *outerplane= 0;
    -} /* geomplanes */
    -
    -
    -/*---------------------------------
    -
    -  qh_markkeep(qh, facetlist )
    -    mark good facets that meet qh.KEEParea, qh.KEEPmerge, and qh.KEEPminArea
    -    ignores visible facets (!part of convex hull)
    -
    -  returns:
    -    may clear facet->good
    -    recomputes qh.num_good
    -
    -  design:
    -    get set of good facets
    -    if qh.KEEParea
    -      sort facets by area
    -      clear facet->good for all but n largest facets
    -    if qh.KEEPmerge
    -      sort facets by merge count
    -      clear facet->good for all but n most merged facets
    -    if qh.KEEPminarea
    -      clear facet->good if area too small
    -    update qh.num_good
    -*/
    -void qh_markkeep(qhT *qh, facetT *facetlist) {
    -  facetT *facet, **facetp;
    -  setT *facets= qh_settemp(qh, qh->num_facets);
    -  int size, count;
    -
    -  trace2((qh, qh->ferr, 2006, "qh_markkeep: only keep %d largest and/or %d most merged facets and/or min area %.2g\n",
    -          qh->KEEParea, qh->KEEPmerge, qh->KEEPminArea));
    -  FORALLfacet_(facetlist) {
    -    if (!facet->visible && facet->good)
    -      qh_setappend(qh, &facets, facet);
    -  }
    -  size= qh_setsize(qh, facets);
    -  if (qh->KEEParea) {
    -    qsort(SETaddr_(facets, facetT), (size_t)size,
    -             sizeof(facetT *), qh_compare_facetarea);
    -    if ((count= size - qh->KEEParea) > 0) {
    -      FOREACHfacet_(facets) {
    -        facet->good= False;
    -        if (--count == 0)
    -          break;
    -      }
    -    }
    -  }
    -  if (qh->KEEPmerge) {
    -    qsort(SETaddr_(facets, facetT), (size_t)size,
    -             sizeof(facetT *), qh_compare_facetmerge);
    -    if ((count= size - qh->KEEPmerge) > 0) {
    -      FOREACHfacet_(facets) {
    -        facet->good= False;
    -        if (--count == 0)
    -          break;
    -      }
    -    }
    -  }
    -  if (qh->KEEPminArea < REALmax/2) {
    -    FOREACHfacet_(facets) {
    -      if (!facet->isarea || facet->f.area < qh->KEEPminArea)
    -        facet->good= False;
    -    }
    -  }
    -  qh_settempfree(qh, &facets);
    -  count= 0;
    -  FORALLfacet_(facetlist) {
    -    if (facet->good)
    -      count++;
    -  }
    -  qh->num_good= count;
    -} /* markkeep */
    -
    -
    -/*---------------------------------
    -
    -  qh_markvoronoi(qh, facetlist, facets, printall, isLower, numcenters )
    -    mark voronoi vertices for printing by site pairs
    -
    -  returns:
    -    temporary set of vertices indexed by pointid
    -    isLower set if printing lower hull (i.e., at least one facet is lower hull)
    -    numcenters= total number of Voronoi vertices
    -    bumps qh.printoutnum for vertex-at-infinity
    -    clears all facet->seen and sets facet->seen2
    -
    -    if selected
    -      facet->visitid= Voronoi vertex id
    -    else if upper hull (or 'Qu' and lower hull)
    -      facet->visitid= 0
    -    else
    -      facet->visitid >= qh->num_facets
    -
    -  notes:
    -    ignores qh.ATinfinity, if defined
    -*/
    -setT *qh_markvoronoi(qhT *qh, facetT *facetlist, setT *facets, boolT printall, boolT *isLowerp, int *numcentersp) {
    -  int numcenters=0;
    -  facetT *facet, **facetp;
    -  setT *vertices;
    -  boolT isLower= False;
    -
    -  qh->printoutnum++;
    -  qh_clearcenters(qh, qh_ASvoronoi);  /* in case, qh_printvdiagram2 called by user */
    -  qh_vertexneighbors(qh);
    -  vertices= qh_pointvertex(qh);
    -  if (qh->ATinfinity)
    -    SETelem_(vertices, qh->num_points-1)= NULL;
    -  qh->visit_id++;
    -  maximize_(qh->visit_id, (unsigned) qh->num_facets);
    -  FORALLfacet_(facetlist) {
    -    if (printall || !qh_skipfacet(qh, facet)) {
    -      if (!facet->upperdelaunay) {
    -        isLower= True;
    -        break;
    -      }
    -    }
    -  }
    -  FOREACHfacet_(facets) {
    -    if (printall || !qh_skipfacet(qh, facet)) {
    -      if (!facet->upperdelaunay) {
    -        isLower= True;
    -        break;
    -      }
    -    }
    -  }
    -  FORALLfacets {
    -    if (facet->normal && (facet->upperdelaunay == isLower))
    -      facet->visitid= 0;  /* facetlist or facets may overwrite */
    -    else
    -      facet->visitid= qh->visit_id;
    -    facet->seen= False;
    -    facet->seen2= True;
    -  }
    -  numcenters++;  /* qh_INFINITE */
    -  FORALLfacet_(facetlist) {
    -    if (printall || !qh_skipfacet(qh, facet))
    -      facet->visitid= numcenters++;
    -  }
    -  FOREACHfacet_(facets) {
    -    if (printall || !qh_skipfacet(qh, facet))
    -      facet->visitid= numcenters++;
    -  }
    -  *isLowerp= isLower;
    -  *numcentersp= numcenters;
    -  trace2((qh, qh->ferr, 2007, "qh_markvoronoi: isLower %d numcenters %d\n", isLower, numcenters));
    -  return vertices;
    -} /* markvoronoi */
    -
    -/*---------------------------------
    -
    -  qh_order_vertexneighbors(qh, vertex )
    -    order facet neighbors of a 2-d or 3-d vertex by adjacency
    -
    -  notes:
    -    does not orient the neighbors
    -
    -  design:
    -    initialize a new neighbor set with the first facet in vertex->neighbors
    -    while vertex->neighbors non-empty
    -      select next neighbor in the previous facet's neighbor set
    -    set vertex->neighbors to the new neighbor set
    -*/
    -void qh_order_vertexneighbors(qhT *qh, vertexT *vertex) {
    -  setT *newset;
    -  facetT *facet, *neighbor, **neighborp;
    -
    -  trace4((qh, qh->ferr, 4018, "qh_order_vertexneighbors: order neighbors of v%d for 3-d\n", vertex->id));
    -  newset= qh_settemp(qh, qh_setsize(qh, vertex->neighbors));
    -  facet= (facetT*)qh_setdellast(vertex->neighbors);
    -  qh_setappend(qh, &newset, facet);
    -  while (qh_setsize(qh, vertex->neighbors)) {
    -    FOREACHneighbor_(vertex) {
    -      if (qh_setin(facet->neighbors, neighbor)) {
    -        qh_setdel(vertex->neighbors, neighbor);
    -        qh_setappend(qh, &newset, neighbor);
    -        facet= neighbor;
    -        break;
    -      }
    -    }
    -    if (!neighbor) {
    -      qh_fprintf(qh, qh->ferr, 6066, "qhull internal error (qh_order_vertexneighbors): no neighbor of v%d for f%d\n",
    -        vertex->id, facet->id);
    -      qh_errexit(qh, qh_ERRqhull, facet, NULL);
    -    }
    -  }
    -  qh_setfree(qh, &vertex->neighbors);
    -  qh_settemppop(qh);
    -  vertex->neighbors= newset;
    -} /* order_vertexneighbors */
    -
    -/*---------------------------------
    -
    -  qh_prepare_output(qh, )
    -    prepare for qh_produce_output2(qh) according to
    -      qh.KEEPminArea, KEEParea, KEEPmerge, GOODvertex, GOODthreshold, GOODpoint, ONLYgood, SPLITthresholds
    -    does not reset facet->good
    -
    -  notes
    -    except for PRINTstatistics, no-op if previously called with same options
    -*/
    -void qh_prepare_output(qhT *qh) {
    -  if (qh->VORONOI) {
    -    qh_clearcenters(qh, qh_ASvoronoi);  /* must be before qh_triangulate */
    -    qh_vertexneighbors(qh);
    -  }
    -  if (qh->TRIangulate && !qh->hasTriangulation) {
    -    qh_triangulate(qh);
    -    if (qh->VERIFYoutput && !qh->CHECKfrequently)
    -      qh_checkpolygon(qh, qh->facet_list);
    -  }
    -  qh_findgood_all(qh, qh->facet_list);
    -  if (qh->GETarea)
    -    qh_getarea(qh, qh->facet_list);
    -  if (qh->KEEParea || qh->KEEPmerge || qh->KEEPminArea < REALmax/2)
    -    qh_markkeep(qh, qh->facet_list);
    -  if (qh->PRINTstatistics)
    -    qh_collectstatistics(qh);
    -}
    -
    -/*---------------------------------
    -
    -  qh_printafacet(qh, fp, format, facet, printall )
    -    print facet to fp in given output format (see qh.PRINTout)
    -
    -  returns:
    -    nop if !printall and qh_skipfacet()
    -    nop if visible facet and NEWfacets and format != PRINTfacets
    -    must match qh_countfacets
    -
    -  notes
    -    preserves qh.visit_id
    -    facet->normal may be null if PREmerge/MERGEexact and STOPcone before merge
    -
    -  see
    -    qh_printbegin() and qh_printend()
    -
    -  design:
    -    test for printing facet
    -    call appropriate routine for format
    -    or output results directly
    -*/
    -void qh_printafacet(qhT *qh, FILE *fp, qh_PRINT format, facetT *facet, boolT printall) {
    -  realT color[4], offset, dist, outerplane, innerplane;
    -  boolT zerodiv;
    -  coordT *point, *normp, *coordp, **pointp, *feasiblep;
    -  int k;
    -  vertexT *vertex, **vertexp;
    -  facetT *neighbor, **neighborp;
    -
    -  if (!printall && qh_skipfacet(qh, facet))
    -    return;
    -  if (facet->visible && qh->NEWfacets && format != qh_PRINTfacets)
    -    return;
    -  qh->printoutnum++;
    -  switch (format) {
    -  case qh_PRINTarea:
    -    if (facet->isarea) {
    -      qh_fprintf(qh, fp, 9009, qh_REAL_1, facet->f.area);
    -      qh_fprintf(qh, fp, 9010, "\n");
    -    }else
    -      qh_fprintf(qh, fp, 9011, "0\n");
    -    break;
    -  case qh_PRINTcoplanars:
    -    qh_fprintf(qh, fp, 9012, "%d", qh_setsize(qh, facet->coplanarset));
    -    FOREACHpoint_(facet->coplanarset)
    -      qh_fprintf(qh, fp, 9013, " %d", qh_pointid(qh, point));
    -    qh_fprintf(qh, fp, 9014, "\n");
    -    break;
    -  case qh_PRINTcentrums:
    -    qh_printcenter(qh, fp, format, NULL, facet);
    -    break;
    -  case qh_PRINTfacets:
    -    qh_printfacet(qh, fp, facet);
    -    break;
    -  case qh_PRINTfacets_xridge:
    -    qh_printfacetheader(qh, fp, facet);
    -    break;
    -  case qh_PRINTgeom:  /* either 2 , 3, or 4-d by qh_printbegin */
    -    if (!facet->normal)
    -      break;
    -    for (k=qh->hull_dim; k--; ) {
    -      color[k]= (facet->normal[k]+1.0)/2.0;
    -      maximize_(color[k], -1.0);
    -      minimize_(color[k], +1.0);
    -    }
    -    qh_projectdim3(qh, color, color);
    -    if (qh->PRINTdim != qh->hull_dim)
    -      qh_normalize2(qh, color, 3, True, NULL, NULL);
    -    if (qh->hull_dim <= 2)
    -      qh_printfacet2geom(qh, fp, facet, color);
    -    else if (qh->hull_dim == 3) {
    -      if (facet->simplicial)
    -        qh_printfacet3geom_simplicial(qh, fp, facet, color);
    -      else
    -        qh_printfacet3geom_nonsimplicial(qh, fp, facet, color);
    -    }else {
    -      if (facet->simplicial)
    -        qh_printfacet4geom_simplicial(qh, fp, facet, color);
    -      else
    -        qh_printfacet4geom_nonsimplicial(qh, fp, facet, color);
    -    }
    -    break;
    -  case qh_PRINTids:
    -    qh_fprintf(qh, fp, 9015, "%d\n", facet->id);
    -    break;
    -  case qh_PRINTincidences:
    -  case qh_PRINToff:
    -  case qh_PRINTtriangles:
    -    if (qh->hull_dim == 3 && format != qh_PRINTtriangles)
    -      qh_printfacet3vertex(qh, fp, facet, format);
    -    else if (facet->simplicial || qh->hull_dim == 2 || format == qh_PRINToff)
    -      qh_printfacetNvertex_simplicial(qh, fp, facet, format);
    -    else
    -      qh_printfacetNvertex_nonsimplicial(qh, fp, facet, qh->printoutvar++, format);
    -    break;
    -  case qh_PRINTinner:
    -    qh_outerinner(qh, facet, NULL, &innerplane);
    -    offset= facet->offset - innerplane;
    -    goto LABELprintnorm;
    -    break; /* prevent warning */
    -  case qh_PRINTmerges:
    -    qh_fprintf(qh, fp, 9016, "%d\n", facet->nummerge);
    -    break;
    -  case qh_PRINTnormals:
    -    offset= facet->offset;
    -    goto LABELprintnorm;
    -    break; /* prevent warning */
    -  case qh_PRINTouter:
    -    qh_outerinner(qh, facet, &outerplane, NULL);
    -    offset= facet->offset - outerplane;
    -  LABELprintnorm:
    -    if (!facet->normal) {
    -      qh_fprintf(qh, fp, 9017, "no normal for facet f%d\n", facet->id);
    -      break;
    -    }
    -    if (qh->CDDoutput) {
    -      qh_fprintf(qh, fp, 9018, qh_REAL_1, -offset);
    -      for (k=0; k < qh->hull_dim; k++)
    -        qh_fprintf(qh, fp, 9019, qh_REAL_1, -facet->normal[k]);
    -    }else {
    -      for (k=0; k < qh->hull_dim; k++)
    -        qh_fprintf(qh, fp, 9020, qh_REAL_1, facet->normal[k]);
    -      qh_fprintf(qh, fp, 9021, qh_REAL_1, offset);
    -    }
    -    qh_fprintf(qh, fp, 9022, "\n");
    -    break;
    -  case qh_PRINTmathematica:  /* either 2 or 3-d by qh_printbegin */
    -  case qh_PRINTmaple:
    -    if (qh->hull_dim == 2)
    -      qh_printfacet2math(qh, fp, facet, format, qh->printoutvar++);
    -    else
    -      qh_printfacet3math(qh, fp, facet, format, qh->printoutvar++);
    -    break;
    -  case qh_PRINTneighbors:
    -    qh_fprintf(qh, fp, 9023, "%d", qh_setsize(qh, facet->neighbors));
    -    FOREACHneighbor_(facet)
    -      qh_fprintf(qh, fp, 9024, " %d",
    -               neighbor->visitid ? neighbor->visitid - 1: 0 - neighbor->id);
    -    qh_fprintf(qh, fp, 9025, "\n");
    -    break;
    -  case qh_PRINTpointintersect:
    -    if (!qh->feasible_point) {
    -      qh_fprintf(qh, qh->ferr, 6067, "qhull input error (qh_printafacet): option 'Fp' needs qh->feasible_point\n");
    -      qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -    }
    -    if (facet->offset > 0)
    -      goto LABELprintinfinite;
    -    point= coordp= (coordT*)qh_memalloc(qh, qh->normal_size);
    -    normp= facet->normal;
    -    feasiblep= qh->feasible_point;
    -    if (facet->offset < -qh->MINdenom) {
    -      for (k=qh->hull_dim; k--; )
    -        *(coordp++)= (*(normp++) / - facet->offset) + *(feasiblep++);
    -    }else {
    -      for (k=qh->hull_dim; k--; ) {
    -        *(coordp++)= qh_divzero(*(normp++), facet->offset, qh->MINdenom_1,
    -                                 &zerodiv) + *(feasiblep++);
    -        if (zerodiv) {
    -          qh_memfree(qh, point, qh->normal_size);
    -          goto LABELprintinfinite;
    -        }
    -      }
    -    }
    -    qh_printpoint(qh, fp, NULL, point);
    -    qh_memfree(qh, point, qh->normal_size);
    -    break;
    -  LABELprintinfinite:
    -    for (k=qh->hull_dim; k--; )
    -      qh_fprintf(qh, fp, 9026, qh_REAL_1, qh_INFINITE);
    -    qh_fprintf(qh, fp, 9027, "\n");
    -    break;
    -  case qh_PRINTpointnearest:
    -    FOREACHpoint_(facet->coplanarset) {
    -      int id, id2;
    -      vertex= qh_nearvertex(qh, facet, point, &dist);
    -      id= qh_pointid(qh, vertex->point);
    -      id2= qh_pointid(qh, point);
    -      qh_fprintf(qh, fp, 9028, "%d %d %d " qh_REAL_1 "\n", id, id2, facet->id, dist);
    -    }
    -    break;
    -  case qh_PRINTpoints:  /* VORONOI only by qh_printbegin */
    -    if (qh->CDDoutput)
    -      qh_fprintf(qh, fp, 9029, "1 ");
    -    qh_printcenter(qh, fp, format, NULL, facet);
    -    break;
    -  case qh_PRINTvertices:
    -    qh_fprintf(qh, fp, 9030, "%d", qh_setsize(qh, facet->vertices));
    -    FOREACHvertex_(facet->vertices)
    -      qh_fprintf(qh, fp, 9031, " %d", qh_pointid(qh, vertex->point));
    -    qh_fprintf(qh, fp, 9032, "\n");
    -    break;
    -  default:
    -    break;
    -  }
    -} /* printafacet */
    -
    -/*---------------------------------
    -
    -  qh_printbegin(qh, )
    -    prints header for all output formats
    -
    -  returns:
    -    checks for valid format
    -
    -  notes:
    -    uses qh.visit_id for 3/4off
    -    changes qh.interior_point if printing centrums
    -    qh_countfacets clears facet->visitid for non-good facets
    -
    -  see
    -    qh_printend() and qh_printafacet()
    -
    -  design:
    -    count facets and related statistics
    -    print header for format
    -*/
    -void qh_printbegin(qhT *qh, FILE *fp, qh_PRINT format, facetT *facetlist, setT *facets, boolT printall) {
    -  int numfacets, numsimplicial, numridges, totneighbors, numcoplanars, numtricoplanars;
    -  int i, num;
    -  facetT *facet, **facetp;
    -  vertexT *vertex, **vertexp;
    -  setT *vertices;
    -  pointT *point, **pointp, *pointtemp;
    -
    -  qh->printoutnum= 0;
    -  qh_countfacets(qh, facetlist, facets, printall, &numfacets, &numsimplicial,
    -      &totneighbors, &numridges, &numcoplanars, &numtricoplanars);
    -  switch (format) {
    -  case qh_PRINTnone:
    -    break;
    -  case qh_PRINTarea:
    -    qh_fprintf(qh, fp, 9033, "%d\n", numfacets);
    -    break;
    -  case qh_PRINTcoplanars:
    -    qh_fprintf(qh, fp, 9034, "%d\n", numfacets);
    -    break;
    -  case qh_PRINTcentrums:
    -    if (qh->CENTERtype == qh_ASnone)
    -      qh_clearcenters(qh, qh_AScentrum);
    -    qh_fprintf(qh, fp, 9035, "%d\n%d\n", qh->hull_dim, numfacets);
    -    break;
    -  case qh_PRINTfacets:
    -  case qh_PRINTfacets_xridge:
    -    if (facetlist)
    -      qh_printvertexlist(qh, fp, "Vertices and facets:\n", facetlist, facets, printall);
    -    break;
    -  case qh_PRINTgeom:
    -    if (qh->hull_dim > 4)  /* qh_initqhull_globals also checks */
    -      goto LABELnoformat;
    -    if (qh->VORONOI && qh->hull_dim > 3)  /* PRINTdim == DROPdim == hull_dim-1 */
    -      goto LABELnoformat;
    -    if (qh->hull_dim == 2 && (qh->PRINTridges || qh->DOintersections))
    -      qh_fprintf(qh, qh->ferr, 7049, "qhull warning: output for ridges and intersections not implemented in 2-d\n");
    -    if (qh->hull_dim == 4 && (qh->PRINTinner || qh->PRINTouter ||
    -                             (qh->PRINTdim == 4 && qh->PRINTcentrums)))
    -      qh_fprintf(qh, qh->ferr, 7050, "qhull warning: output for outer/inner planes and centrums not implemented in 4-d\n");
    -    if (qh->PRINTdim == 4 && (qh->PRINTspheres))
    -      qh_fprintf(qh, qh->ferr, 7051, "qhull warning: output for vertices not implemented in 4-d\n");
    -    if (qh->PRINTdim == 4 && qh->DOintersections && qh->PRINTnoplanes)
    -      qh_fprintf(qh, qh->ferr, 7052, "qhull warning: 'Gnh' generates no output in 4-d\n");
    -    if (qh->PRINTdim == 2) {
    -      qh_fprintf(qh, fp, 9036, "{appearance {linewidth 3} LIST # %s | %s\n",
    -              qh->rbox_command, qh->qhull_command);
    -    }else if (qh->PRINTdim == 3) {
    -      qh_fprintf(qh, fp, 9037, "{appearance {+edge -evert linewidth 2} LIST # %s | %s\n",
    -              qh->rbox_command, qh->qhull_command);
    -    }else if (qh->PRINTdim == 4) {
    -      qh->visit_id++;
    -      num= 0;
    -      FORALLfacet_(facetlist)    /* get number of ridges to be printed */
    -        qh_printend4geom(qh, NULL, facet, &num, printall);
    -      FOREACHfacet_(facets)
    -        qh_printend4geom(qh, NULL, facet, &num, printall);
    -      qh->ridgeoutnum= num;
    -      qh->printoutvar= 0;  /* counts number of ridges in output */
    -      qh_fprintf(qh, fp, 9038, "LIST # %s | %s\n", qh->rbox_command, qh->qhull_command);
    -    }
    -
    -    if (qh->PRINTdots) {
    -      qh->printoutnum++;
    -      num= qh->num_points + qh_setsize(qh, qh->other_points);
    -      if (qh->DELAUNAY && qh->ATinfinity)
    -        num--;
    -      if (qh->PRINTdim == 4)
    -        qh_fprintf(qh, fp, 9039, "4VECT %d %d 1\n", num, num);
    -      else
    -        qh_fprintf(qh, fp, 9040, "VECT %d %d 1\n", num, num);
    -
    -      for (i=num; i--; ) {
    -        if (i % 20 == 0)
    -          qh_fprintf(qh, fp, 9041, "\n");
    -        qh_fprintf(qh, fp, 9042, "1 ");
    -      }
    -      qh_fprintf(qh, fp, 9043, "# 1 point per line\n1 ");
    -      for (i=num-1; i--; ) { /* num at least 3 for D2 */
    -        if (i % 20 == 0)
    -          qh_fprintf(qh, fp, 9044, "\n");
    -        qh_fprintf(qh, fp, 9045, "0 ");
    -      }
    -      qh_fprintf(qh, fp, 9046, "# 1 color for all\n");
    -      FORALLpoints {
    -        if (!qh->DELAUNAY || !qh->ATinfinity || qh_pointid(qh, point) != qh->num_points-1) {
    -          if (qh->PRINTdim == 4)
    -            qh_printpoint(qh, fp, NULL, point);
    -            else
    -              qh_printpoint3(qh, fp, point);
    -        }
    -      }
    -      FOREACHpoint_(qh->other_points) {
    -        if (qh->PRINTdim == 4)
    -          qh_printpoint(qh, fp, NULL, point);
    -        else
    -          qh_printpoint3(qh, fp, point);
    -      }
    -      qh_fprintf(qh, fp, 9047, "0 1 1 1  # color of points\n");
    -    }
    -
    -    if (qh->PRINTdim == 4  && !qh->PRINTnoplanes)
    -      /* 4dview loads up multiple 4OFF objects slowly */
    -      qh_fprintf(qh, fp, 9048, "4OFF %d %d 1\n", 3*qh->ridgeoutnum, qh->ridgeoutnum);
    -    qh->PRINTcradius= 2 * qh->DISTround;  /* include test DISTround */
    -    if (qh->PREmerge) {
    -      maximize_(qh->PRINTcradius, qh->premerge_centrum + qh->DISTround);
    -    }else if (qh->POSTmerge)
    -      maximize_(qh->PRINTcradius, qh->postmerge_centrum + qh->DISTround);
    -    qh->PRINTradius= qh->PRINTcradius;
    -    if (qh->PRINTspheres + qh->PRINTcoplanar)
    -      maximize_(qh->PRINTradius, qh->MAXabs_coord * qh_MINradius);
    -    if (qh->premerge_cos < REALmax/2) {
    -      maximize_(qh->PRINTradius, (1- qh->premerge_cos) * qh->MAXabs_coord);
    -    }else if (!qh->PREmerge && qh->POSTmerge && qh->postmerge_cos < REALmax/2) {
    -      maximize_(qh->PRINTradius, (1- qh->postmerge_cos) * qh->MAXabs_coord);
    -    }
    -    maximize_(qh->PRINTradius, qh->MINvisible);
    -    if (qh->JOGGLEmax < REALmax/2)
    -      qh->PRINTradius += qh->JOGGLEmax * sqrt((realT)qh->hull_dim);
    -    if (qh->PRINTdim != 4 &&
    -        (qh->PRINTcoplanar || qh->PRINTspheres || qh->PRINTcentrums)) {
    -      vertices= qh_facetvertices(qh, facetlist, facets, printall);
    -      if (qh->PRINTspheres && qh->PRINTdim <= 3)
    -        qh_printspheres(qh, fp, vertices, qh->PRINTradius);
    -      if (qh->PRINTcoplanar || qh->PRINTcentrums) {
    -        qh->firstcentrum= True;
    -        if (qh->PRINTcoplanar&& !qh->PRINTspheres) {
    -          FOREACHvertex_(vertices)
    -            qh_printpointvect2(qh, fp, vertex->point, NULL, qh->interior_point, qh->PRINTradius);
    -        }
    -        FORALLfacet_(facetlist) {
    -          if (!printall && qh_skipfacet(qh, facet))
    -            continue;
    -          if (!facet->normal)
    -            continue;
    -          if (qh->PRINTcentrums && qh->PRINTdim <= 3)
    -            qh_printcentrum(qh, fp, facet, qh->PRINTcradius);
    -          if (!qh->PRINTcoplanar)
    -            continue;
    -          FOREACHpoint_(facet->coplanarset)
    -            qh_printpointvect2(qh, fp, point, facet->normal, NULL, qh->PRINTradius);
    -          FOREACHpoint_(facet->outsideset)
    -            qh_printpointvect2(qh, fp, point, facet->normal, NULL, qh->PRINTradius);
    -        }
    -        FOREACHfacet_(facets) {
    -          if (!printall && qh_skipfacet(qh, facet))
    -            continue;
    -          if (!facet->normal)
    -            continue;
    -          if (qh->PRINTcentrums && qh->PRINTdim <= 3)
    -            qh_printcentrum(qh, fp, facet, qh->PRINTcradius);
    -          if (!qh->PRINTcoplanar)
    -            continue;
    -          FOREACHpoint_(facet->coplanarset)
    -            qh_printpointvect2(qh, fp, point, facet->normal, NULL, qh->PRINTradius);
    -          FOREACHpoint_(facet->outsideset)
    -            qh_printpointvect2(qh, fp, point, facet->normal, NULL, qh->PRINTradius);
    -        }
    -      }
    -      qh_settempfree(qh, &vertices);
    -    }
    -    qh->visit_id++; /* for printing hyperplane intersections */
    -    break;
    -  case qh_PRINTids:
    -    qh_fprintf(qh, fp, 9049, "%d\n", numfacets);
    -    break;
    -  case qh_PRINTincidences:
    -    if (qh->VORONOI && qh->PRINTprecision)
    -      qh_fprintf(qh, qh->ferr, 7053, "qhull warning: writing Delaunay.  Use 'p' or 'o' for Voronoi centers\n");
    -    qh->printoutvar= qh->vertex_id;  /* centrum id for non-simplicial facets */
    -    if (qh->hull_dim <= 3)
    -      qh_fprintf(qh, fp, 9050, "%d\n", numfacets);
    -    else
    -      qh_fprintf(qh, fp, 9051, "%d\n", numsimplicial+numridges);
    -    break;
    -  case qh_PRINTinner:
    -  case qh_PRINTnormals:
    -  case qh_PRINTouter:
    -    if (qh->CDDoutput)
    -      qh_fprintf(qh, fp, 9052, "%s | %s\nbegin\n    %d %d real\n", qh->rbox_command,
    -            qh->qhull_command, numfacets, qh->hull_dim+1);
    -    else
    -      qh_fprintf(qh, fp, 9053, "%d\n%d\n", qh->hull_dim+1, numfacets);
    -    break;
    -  case qh_PRINTmathematica:
    -  case qh_PRINTmaple:
    -    if (qh->hull_dim > 3)  /* qh_initbuffers also checks */
    -      goto LABELnoformat;
    -    if (qh->VORONOI)
    -      qh_fprintf(qh, qh->ferr, 7054, "qhull warning: output is the Delaunay triangulation\n");
    -    if (format == qh_PRINTmaple) {
    -      if (qh->hull_dim == 2)
    -        qh_fprintf(qh, fp, 9054, "PLOT(CURVES(\n");
    -      else
    -        qh_fprintf(qh, fp, 9055, "PLOT3D(POLYGONS(\n");
    -    }else
    -      qh_fprintf(qh, fp, 9056, "{\n");
    -    qh->printoutvar= 0;   /* counts number of facets for notfirst */
    -    break;
    -  case qh_PRINTmerges:
    -    qh_fprintf(qh, fp, 9057, "%d\n", numfacets);
    -    break;
    -  case qh_PRINTpointintersect:
    -    qh_fprintf(qh, fp, 9058, "%d\n%d\n", qh->hull_dim, numfacets);
    -    break;
    -  case qh_PRINTneighbors:
    -    qh_fprintf(qh, fp, 9059, "%d\n", numfacets);
    -    break;
    -  case qh_PRINToff:
    -  case qh_PRINTtriangles:
    -    if (qh->VORONOI)
    -      goto LABELnoformat;
    -    num = qh->hull_dim;
    -    if (format == qh_PRINToff || qh->hull_dim == 2)
    -      qh_fprintf(qh, fp, 9060, "%d\n%d %d %d\n", num,
    -        qh->num_points+qh_setsize(qh, qh->other_points), numfacets, totneighbors/2);
    -    else { /* qh_PRINTtriangles */
    -      qh->printoutvar= qh->num_points+qh_setsize(qh, qh->other_points); /* first centrum */
    -      if (qh->DELAUNAY)
    -        num--;  /* drop last dimension */
    -      qh_fprintf(qh, fp, 9061, "%d\n%d %d %d\n", num, qh->printoutvar
    -        + numfacets - numsimplicial, numsimplicial + numridges, totneighbors/2);
    -    }
    -    FORALLpoints
    -      qh_printpointid(qh, qh->fout, NULL, num, point, qh_IDunknown);
    -    FOREACHpoint_(qh->other_points)
    -      qh_printpointid(qh, qh->fout, NULL, num, point, qh_IDunknown);
    -    if (format == qh_PRINTtriangles && qh->hull_dim > 2) {
    -      FORALLfacets {
    -        if (!facet->simplicial && facet->visitid)
    -          qh_printcenter(qh, qh->fout, format, NULL, facet);
    -      }
    -    }
    -    break;
    -  case qh_PRINTpointnearest:
    -    qh_fprintf(qh, fp, 9062, "%d\n", numcoplanars);
    -    break;
    -  case qh_PRINTpoints:
    -    if (!qh->VORONOI)
    -      goto LABELnoformat;
    -    if (qh->CDDoutput)
    -      qh_fprintf(qh, fp, 9063, "%s | %s\nbegin\n%d %d real\n", qh->rbox_command,
    -           qh->qhull_command, numfacets, qh->hull_dim);
    -    else
    -      qh_fprintf(qh, fp, 9064, "%d\n%d\n", qh->hull_dim-1, numfacets);
    -    break;
    -  case qh_PRINTvertices:
    -    qh_fprintf(qh, fp, 9065, "%d\n", numfacets);
    -    break;
    -  case qh_PRINTsummary:
    -  default:
    -  LABELnoformat:
    -    qh_fprintf(qh, qh->ferr, 6068, "qhull internal error (qh_printbegin): can not use this format for dimension %d\n",
    -         qh->hull_dim);
    -    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -  }
    -} /* printbegin */
    -
    -/*---------------------------------
    -
    -  qh_printcenter(qh, fp, string, facet )
    -    print facet->center as centrum or Voronoi center
    -    string may be NULL.  Don't include '%' codes.
    -    nop if qh->CENTERtype neither CENTERvoronoi nor CENTERcentrum
    -    if upper envelope of Delaunay triangulation and point at-infinity
    -      prints qh_INFINITE instead;
    -
    -  notes:
    -    defines facet->center if needed
    -    if format=PRINTgeom, adds a 0 if would otherwise be 2-d
    -    Same as QhullFacet::printCenter
    -*/
    -void qh_printcenter(qhT *qh, FILE *fp, qh_PRINT format, const char *string, facetT *facet) {
    -  int k, num;
    -
    -  if (qh->CENTERtype != qh_ASvoronoi && qh->CENTERtype != qh_AScentrum)
    -    return;
    -  if (string)
    -    qh_fprintf(qh, fp, 9066, string);
    -  if (qh->CENTERtype == qh_ASvoronoi) {
    -    num= qh->hull_dim-1;
    -    if (!facet->normal || !facet->upperdelaunay || !qh->ATinfinity) {
    -      if (!facet->center)
    -        facet->center= qh_facetcenter(qh, facet->vertices);
    -      for (k=0; k < num; k++)
    -        qh_fprintf(qh, fp, 9067, qh_REAL_1, facet->center[k]);
    -    }else {
    -      for (k=0; k < num; k++)
    -        qh_fprintf(qh, fp, 9068, qh_REAL_1, qh_INFINITE);
    -    }
    -  }else /* qh->CENTERtype == qh_AScentrum */ {
    -    num= qh->hull_dim;
    -    if (format == qh_PRINTtriangles && qh->DELAUNAY)
    -      num--;
    -    if (!facet->center)
    -      facet->center= qh_getcentrum(qh, facet);
    -    for (k=0; k < num; k++)
    -      qh_fprintf(qh, fp, 9069, qh_REAL_1, facet->center[k]);
    -  }
    -  if (format == qh_PRINTgeom && num == 2)
    -    qh_fprintf(qh, fp, 9070, " 0\n");
    -  else
    -    qh_fprintf(qh, fp, 9071, "\n");
    -} /* printcenter */
    -
    -/*---------------------------------
    -
    -  qh_printcentrum(qh, fp, facet, radius )
    -    print centrum for a facet in OOGL format
    -    radius defines size of centrum
    -    2-d or 3-d only
    -
    -  returns:
    -    defines facet->center if needed
    -*/
    -void qh_printcentrum(qhT *qh, FILE *fp, facetT *facet, realT radius) {
    -  pointT *centrum, *projpt;
    -  boolT tempcentrum= False;
    -  realT xaxis[4], yaxis[4], normal[4], dist;
    -  realT green[3]={0, 1, 0};
    -  vertexT *apex;
    -  int k;
    -
    -  if (qh->CENTERtype == qh_AScentrum) {
    -    if (!facet->center)
    -      facet->center= qh_getcentrum(qh, facet);
    -    centrum= facet->center;
    -  }else {
    -    centrum= qh_getcentrum(qh, facet);
    -    tempcentrum= True;
    -  }
    -  qh_fprintf(qh, fp, 9072, "{appearance {-normal -edge normscale 0} ");
    -  if (qh->firstcentrum) {
    -    qh->firstcentrum= False;
    -    qh_fprintf(qh, fp, 9073, "{INST geom { define centrum CQUAD  # f%d\n\
    --0.3 -0.3 0.0001     0 0 1 1\n\
    - 0.3 -0.3 0.0001     0 0 1 1\n\
    - 0.3  0.3 0.0001     0 0 1 1\n\
    --0.3  0.3 0.0001     0 0 1 1 } transform { \n", facet->id);
    -  }else
    -    qh_fprintf(qh, fp, 9074, "{INST geom { : centrum } transform { # f%d\n", facet->id);
    -  apex= SETfirstt_(facet->vertices, vertexT);
    -  qh_distplane(qh, apex->point, facet, &dist);
    -  projpt= qh_projectpoint(qh, apex->point, facet, dist);
    -  for (k=qh->hull_dim; k--; ) {
    -    xaxis[k]= projpt[k] - centrum[k];
    -    normal[k]= facet->normal[k];
    -  }
    -  if (qh->hull_dim == 2) {
    -    xaxis[2]= 0;
    -    normal[2]= 0;
    -  }else if (qh->hull_dim == 4) {
    -    qh_projectdim3(qh, xaxis, xaxis);
    -    qh_projectdim3(qh, normal, normal);
    -    qh_normalize2(qh, normal, qh->PRINTdim, True, NULL, NULL);
    -  }
    -  qh_crossproduct(3, xaxis, normal, yaxis);
    -  qh_fprintf(qh, fp, 9075, "%8.4g %8.4g %8.4g 0\n", xaxis[0], xaxis[1], xaxis[2]);
    -  qh_fprintf(qh, fp, 9076, "%8.4g %8.4g %8.4g 0\n", yaxis[0], yaxis[1], yaxis[2]);
    -  qh_fprintf(qh, fp, 9077, "%8.4g %8.4g %8.4g 0\n", normal[0], normal[1], normal[2]);
    -  qh_printpoint3(qh, fp, centrum);
    -  qh_fprintf(qh, fp, 9078, "1 }}}\n");
    -  qh_memfree(qh, projpt, qh->normal_size);
    -  qh_printpointvect(qh, fp, centrum, facet->normal, NULL, radius, green);
    -  if (tempcentrum)
    -    qh_memfree(qh, centrum, qh->normal_size);
    -} /* printcentrum */
    -
    -/*---------------------------------
    -
    -  qh_printend(qh, fp, format )
    -    prints trailer for all output formats
    -
    -  see:
    -    qh_printbegin() and qh_printafacet()
    -
    -*/
    -void qh_printend(qhT *qh, FILE *fp, qh_PRINT format, facetT *facetlist, setT *facets, boolT printall) {
    -  int num;
    -  facetT *facet, **facetp;
    -
    -  if (!qh->printoutnum)
    -    qh_fprintf(qh, qh->ferr, 7055, "qhull warning: no facets printed\n");
    -  switch (format) {
    -  case qh_PRINTgeom:
    -    if (qh->hull_dim == 4 && qh->DROPdim < 0  && !qh->PRINTnoplanes) {
    -      qh->visit_id++;
    -      num= 0;
    -      FORALLfacet_(facetlist)
    -        qh_printend4geom(qh, fp, facet,&num, printall);
    -      FOREACHfacet_(facets)
    -        qh_printend4geom(qh, fp, facet, &num, printall);
    -      if (num != qh->ridgeoutnum || qh->printoutvar != qh->ridgeoutnum) {
    -        qh_fprintf(qh, qh->ferr, 6069, "qhull internal error (qh_printend): number of ridges %d != number printed %d and at end %d\n", qh->ridgeoutnum, qh->printoutvar, num);
    -        qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -      }
    -    }else
    -      qh_fprintf(qh, fp, 9079, "}\n");
    -    break;
    -  case qh_PRINTinner:
    -  case qh_PRINTnormals:
    -  case qh_PRINTouter:
    -    if (qh->CDDoutput)
    -      qh_fprintf(qh, fp, 9080, "end\n");
    -    break;
    -  case qh_PRINTmaple:
    -    qh_fprintf(qh, fp, 9081, "));\n");
    -    break;
    -  case qh_PRINTmathematica:
    -    qh_fprintf(qh, fp, 9082, "}\n");
    -    break;
    -  case qh_PRINTpoints:
    -    if (qh->CDDoutput)
    -      qh_fprintf(qh, fp, 9083, "end\n");
    -    break;
    -  default:
    -    break;
    -  }
    -} /* printend */
    -
    -/*---------------------------------
    -
    -  qh_printend4geom(qh, fp, facet, numridges, printall )
    -    helper function for qh_printbegin/printend
    -
    -  returns:
    -    number of printed ridges
    -
    -  notes:
    -    just counts printed ridges if fp=NULL
    -    uses facet->visitid
    -    must agree with qh_printfacet4geom...
    -
    -  design:
    -    computes color for facet from its normal
    -    prints each ridge of facet
    -*/
    -void qh_printend4geom(qhT *qh, FILE *fp, facetT *facet, int *nump, boolT printall) {
    -  realT color[3];
    -  int i, num= *nump;
    -  facetT *neighbor, **neighborp;
    -  ridgeT *ridge, **ridgep;
    -
    -  if (!printall && qh_skipfacet(qh, facet))
    -    return;
    -  if (qh->PRINTnoplanes || (facet->visible && qh->NEWfacets))
    -    return;
    -  if (!facet->normal)
    -    return;
    -  if (fp) {
    -    for (i=0; i < 3; i++) {
    -      color[i]= (facet->normal[i]+1.0)/2.0;
    -      maximize_(color[i], -1.0);
    -      minimize_(color[i], +1.0);
    -    }
    -  }
    -  facet->visitid= qh->visit_id;
    -  if (facet->simplicial) {
    -    FOREACHneighbor_(facet) {
    -      if (neighbor->visitid != qh->visit_id) {
    -        if (fp)
    -          qh_fprintf(qh, fp, 9084, "3 %d %d %d %8.4g %8.4g %8.4g 1 # f%d f%d\n",
    -                 3*num, 3*num+1, 3*num+2, color[0], color[1], color[2],
    -                 facet->id, neighbor->id);
    -        num++;
    -      }
    -    }
    -  }else {
    -    FOREACHridge_(facet->ridges) {
    -      neighbor= otherfacet_(ridge, facet);
    -      if (neighbor->visitid != qh->visit_id) {
    -        if (fp)
    -          qh_fprintf(qh, fp, 9085, "3 %d %d %d %8.4g %8.4g %8.4g 1 #r%d f%d f%d\n",
    -                 3*num, 3*num+1, 3*num+2, color[0], color[1], color[2],
    -                 ridge->id, facet->id, neighbor->id);
    -        num++;
    -      }
    -    }
    -  }
    -  *nump= num;
    -} /* printend4geom */
    -
    -/*---------------------------------
    -
    -  qh_printextremes(qh, fp, facetlist, facets, printall )
    -    print extreme points for convex hulls or halfspace intersections
    -
    -  notes:
    -    #points, followed by ids, one per line
    -
    -    sorted by id
    -    same order as qh_printpoints_out if no coplanar/interior points
    -*/
    -void qh_printextremes(qhT *qh, FILE *fp, facetT *facetlist, setT *facets, boolT printall) {
    -  setT *vertices, *points;
    -  pointT *point;
    -  vertexT *vertex, **vertexp;
    -  int id;
    -  int numpoints=0, point_i, point_n;
    -  int allpoints= qh->num_points + qh_setsize(qh, qh->other_points);
    -
    -  points= qh_settemp(qh, allpoints);
    -  qh_setzero(qh, points, 0, allpoints);
    -  vertices= qh_facetvertices(qh, facetlist, facets, printall);
    -  FOREACHvertex_(vertices) {
    -    id= qh_pointid(qh, vertex->point);
    -    if (id >= 0) {
    -      SETelem_(points, id)= vertex->point;
    -      numpoints++;
    -    }
    -  }
    -  qh_settempfree(qh, &vertices);
    -  qh_fprintf(qh, fp, 9086, "%d\n", numpoints);
    -  FOREACHpoint_i_(qh, points) {
    -    if (point)
    -      qh_fprintf(qh, fp, 9087, "%d\n", point_i);
    -  }
    -  qh_settempfree(qh, &points);
    -} /* printextremes */
    -
    -/*---------------------------------
    -
    -  qh_printextremes_2d(qh, fp, facetlist, facets, printall )
    -    prints point ids for facets in qh_ORIENTclock order
    -
    -  notes:
    -    #points, followed by ids, one per line
    -    if facetlist/facets are disjoint than the output includes skips
    -    errors if facets form a loop
    -    does not print coplanar points
    -*/
    -void qh_printextremes_2d(qhT *qh, FILE *fp, facetT *facetlist, setT *facets, boolT printall) {
    -  int numfacets, numridges, totneighbors, numcoplanars, numsimplicial, numtricoplanars;
    -  setT *vertices;
    -  facetT *facet, *startfacet, *nextfacet;
    -  vertexT *vertexA, *vertexB;
    -
    -  qh_countfacets(qh, facetlist, facets, printall, &numfacets, &numsimplicial,
    -      &totneighbors, &numridges, &numcoplanars, &numtricoplanars); /* marks qh->visit_id */
    -  vertices= qh_facetvertices(qh, facetlist, facets, printall);
    -  qh_fprintf(qh, fp, 9088, "%d\n", qh_setsize(qh, vertices));
    -  qh_settempfree(qh, &vertices);
    -  if (!numfacets)
    -    return;
    -  facet= startfacet= facetlist ? facetlist : SETfirstt_(facets, facetT);
    -  qh->vertex_visit++;
    -  qh->visit_id++;
    -  do {
    -    if (facet->toporient ^ qh_ORIENTclock) {
    -      vertexA= SETfirstt_(facet->vertices, vertexT);
    -      vertexB= SETsecondt_(facet->vertices, vertexT);
    -      nextfacet= SETfirstt_(facet->neighbors, facetT);
    -    }else {
    -      vertexA= SETsecondt_(facet->vertices, vertexT);
    -      vertexB= SETfirstt_(facet->vertices, vertexT);
    -      nextfacet= SETsecondt_(facet->neighbors, facetT);
    -    }
    -    if (facet->visitid == qh->visit_id) {
    -      qh_fprintf(qh, qh->ferr, 6218, "Qhull internal error (qh_printextremes_2d): loop in facet list.  facet %d nextfacet %d\n",
    -                 facet->id, nextfacet->id);
    -      qh_errexit2(qh, qh_ERRqhull, facet, nextfacet);
    -    }
    -    if (facet->visitid) {
    -      if (vertexA->visitid != qh->vertex_visit) {
    -        vertexA->visitid= qh->vertex_visit;
    -        qh_fprintf(qh, fp, 9089, "%d\n", qh_pointid(qh, vertexA->point));
    -      }
    -      if (vertexB->visitid != qh->vertex_visit) {
    -        vertexB->visitid= qh->vertex_visit;
    -        qh_fprintf(qh, fp, 9090, "%d\n", qh_pointid(qh, vertexB->point));
    -      }
    -    }
    -    facet->visitid= qh->visit_id;
    -    facet= nextfacet;
    -  }while (facet && facet != startfacet);
    -} /* printextremes_2d */
    -
    -/*---------------------------------
    -
    -  qh_printextremes_d(qh, fp, facetlist, facets, printall )
    -    print extreme points of input sites for Delaunay triangulations
    -
    -  notes:
    -    #points, followed by ids, one per line
    -
    -    unordered
    -*/
    -void qh_printextremes_d(qhT *qh, FILE *fp, facetT *facetlist, setT *facets, boolT printall) {
    -  setT *vertices;
    -  vertexT *vertex, **vertexp;
    -  boolT upperseen, lowerseen;
    -  facetT *neighbor, **neighborp;
    -  int numpoints=0;
    -
    -  vertices= qh_facetvertices(qh, facetlist, facets, printall);
    -  qh_vertexneighbors(qh);
    -  FOREACHvertex_(vertices) {
    -    upperseen= lowerseen= False;
    -    FOREACHneighbor_(vertex) {
    -      if (neighbor->upperdelaunay)
    -        upperseen= True;
    -      else
    -        lowerseen= True;
    -    }
    -    if (upperseen && lowerseen) {
    -      vertex->seen= True;
    -      numpoints++;
    -    }else
    -      vertex->seen= False;
    -  }
    -  qh_fprintf(qh, fp, 9091, "%d\n", numpoints);
    -  FOREACHvertex_(vertices) {
    -    if (vertex->seen)
    -      qh_fprintf(qh, fp, 9092, "%d\n", qh_pointid(qh, vertex->point));
    -  }
    -  qh_settempfree(qh, &vertices);
    -} /* printextremes_d */
    -
    -/*---------------------------------
    -
    -  qh_printfacet(qh, fp, facet )
    -    prints all fields of a facet to fp
    -
    -  notes:
    -    ridges printed in neighbor order
    -*/
    -void qh_printfacet(qhT *qh, FILE *fp, facetT *facet) {
    -
    -  qh_printfacetheader(qh, fp, facet);
    -  if (facet->ridges)
    -    qh_printfacetridges(qh, fp, facet);
    -} /* printfacet */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacet2geom(qh, fp, facet, color )
    -    print facet as part of a 2-d VECT for Geomview
    -
    -    notes:
    -      assume precise calculations in io_r.c with roundoff covered by qh_GEOMepsilon
    -      mindist is calculated within io_r.c.  maxoutside is calculated elsewhere
    -      so a DISTround error may have occurred.
    -*/
    -void qh_printfacet2geom(qhT *qh, FILE *fp, facetT *facet, realT color[3]) {
    -  pointT *point0, *point1;
    -  realT mindist, innerplane, outerplane;
    -  int k;
    -
    -  qh_facet2point(qh, facet, &point0, &point1, &mindist);
    -  qh_geomplanes(qh, facet, &outerplane, &innerplane);
    -  if (qh->PRINTouter || (!qh->PRINTnoplanes && !qh->PRINTinner))
    -    qh_printfacet2geom_points(qh, fp, point0, point1, facet, outerplane, color);
    -  if (qh->PRINTinner || (!qh->PRINTnoplanes && !qh->PRINTouter &&
    -                outerplane - innerplane > 2 * qh->MAXabs_coord * qh_GEOMepsilon)) {
    -    for (k=3; k--; )
    -      color[k]= 1.0 - color[k];
    -    qh_printfacet2geom_points(qh, fp, point0, point1, facet, innerplane, color);
    -  }
    -  qh_memfree(qh, point1, qh->normal_size);
    -  qh_memfree(qh, point0, qh->normal_size);
    -} /* printfacet2geom */
    -
    -/*---------------------------------
    -
    -  qh_printfacet2geom_points(qh, fp, point1, point2, facet, offset, color )
    -    prints a 2-d facet as a VECT with 2 points at some offset.
    -    The points are on the facet's plane.
    -*/
    -void qh_printfacet2geom_points(qhT *qh, FILE *fp, pointT *point1, pointT *point2,
    -                               facetT *facet, realT offset, realT color[3]) {
    -  pointT *p1= point1, *p2= point2;
    -
    -  qh_fprintf(qh, fp, 9093, "VECT 1 2 1 2 1 # f%d\n", facet->id);
    -  if (offset != 0.0) {
    -    p1= qh_projectpoint(qh, p1, facet, -offset);
    -    p2= qh_projectpoint(qh, p2, facet, -offset);
    -  }
    -  qh_fprintf(qh, fp, 9094, "%8.4g %8.4g %8.4g\n%8.4g %8.4g %8.4g\n",
    -           p1[0], p1[1], 0.0, p2[0], p2[1], 0.0);
    -  if (offset != 0.0) {
    -    qh_memfree(qh, p1, qh->normal_size);
    -    qh_memfree(qh, p2, qh->normal_size);
    -  }
    -  qh_fprintf(qh, fp, 9095, "%8.4g %8.4g %8.4g 1.0\n", color[0], color[1], color[2]);
    -} /* printfacet2geom_points */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacet2math(qh, fp, facet, format, notfirst )
    -    print 2-d Maple or Mathematica output for a facet
    -    may be non-simplicial
    -
    -  notes:
    -    use %16.8f since Mathematica 2.2 does not handle exponential format
    -    see qh_printfacet3math
    -*/
    -void qh_printfacet2math(qhT *qh, FILE *fp, facetT *facet, qh_PRINT format, int notfirst) {
    -  pointT *point0, *point1;
    -  realT mindist;
    -  const char *pointfmt;
    -
    -  qh_facet2point(qh, facet, &point0, &point1, &mindist);
    -  if (notfirst)
    -    qh_fprintf(qh, fp, 9096, ",");
    -  if (format == qh_PRINTmaple)
    -    pointfmt= "[[%16.8f, %16.8f], [%16.8f, %16.8f]]\n";
    -  else
    -    pointfmt= "Line[{{%16.8f, %16.8f}, {%16.8f, %16.8f}}]\n";
    -  qh_fprintf(qh, fp, 9097, pointfmt, point0[0], point0[1], point1[0], point1[1]);
    -  qh_memfree(qh, point1, qh->normal_size);
    -  qh_memfree(qh, point0, qh->normal_size);
    -} /* printfacet2math */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacet3geom_nonsimplicial(qh, fp, facet, color )
    -    print Geomview OFF for a 3-d nonsimplicial facet.
    -    if DOintersections, prints ridges to unvisited neighbors(qh->visit_id)
    -
    -  notes
    -    uses facet->visitid for intersections and ridges
    -*/
    -void qh_printfacet3geom_nonsimplicial(qhT *qh, FILE *fp, facetT *facet, realT color[3]) {
    -  ridgeT *ridge, **ridgep;
    -  setT *projectedpoints, *vertices;
    -  vertexT *vertex, **vertexp, *vertexA, *vertexB;
    -  pointT *projpt, *point, **pointp;
    -  facetT *neighbor;
    -  realT dist, outerplane, innerplane;
    -  int cntvertices, k;
    -  realT black[3]={0, 0, 0}, green[3]={0, 1, 0};
    -
    -  qh_geomplanes(qh, facet, &outerplane, &innerplane);
    -  vertices= qh_facet3vertex(qh, facet); /* oriented */
    -  cntvertices= qh_setsize(qh, vertices);
    -  projectedpoints= qh_settemp(qh, cntvertices);
    -  FOREACHvertex_(vertices) {
    -    zinc_(Zdistio);
    -    qh_distplane(qh, vertex->point, facet, &dist);
    -    projpt= qh_projectpoint(qh, vertex->point, facet, dist);
    -    qh_setappend(qh, &projectedpoints, projpt);
    -  }
    -  if (qh->PRINTouter || (!qh->PRINTnoplanes && !qh->PRINTinner))
    -    qh_printfacet3geom_points(qh, fp, projectedpoints, facet, outerplane, color);
    -  if (qh->PRINTinner || (!qh->PRINTnoplanes && !qh->PRINTouter &&
    -                outerplane - innerplane > 2 * qh->MAXabs_coord * qh_GEOMepsilon)) {
    -    for (k=3; k--; )
    -      color[k]= 1.0 - color[k];
    -    qh_printfacet3geom_points(qh, fp, projectedpoints, facet, innerplane, color);
    -  }
    -  FOREACHpoint_(projectedpoints)
    -    qh_memfree(qh, point, qh->normal_size);
    -  qh_settempfree(qh, &projectedpoints);
    -  qh_settempfree(qh, &vertices);
    -  if ((qh->DOintersections || qh->PRINTridges)
    -  && (!facet->visible || !qh->NEWfacets)) {
    -    facet->visitid= qh->visit_id;
    -    FOREACHridge_(facet->ridges) {
    -      neighbor= otherfacet_(ridge, facet);
    -      if (neighbor->visitid != qh->visit_id) {
    -        if (qh->DOintersections)
    -          qh_printhyperplaneintersection(qh, fp, facet, neighbor, ridge->vertices, black);
    -        if (qh->PRINTridges) {
    -          vertexA= SETfirstt_(ridge->vertices, vertexT);
    -          vertexB= SETsecondt_(ridge->vertices, vertexT);
    -          qh_printline3geom(qh, fp, vertexA->point, vertexB->point, green);
    -        }
    -      }
    -    }
    -  }
    -} /* printfacet3geom_nonsimplicial */
    -
    -/*---------------------------------
    -
    -  qh_printfacet3geom_points(qh, fp, points, facet, offset )
    -    prints a 3-d facet as OFF Geomview object.
    -    offset is relative to the facet's hyperplane
    -    Facet is determined as a list of points
    -*/
    -void qh_printfacet3geom_points(qhT *qh, FILE *fp, setT *points, facetT *facet, realT offset, realT color[3]) {
    -  int k, n= qh_setsize(qh, points), i;
    -  pointT *point, **pointp;
    -  setT *printpoints;
    -
    -  qh_fprintf(qh, fp, 9098, "{ OFF %d 1 1 # f%d\n", n, facet->id);
    -  if (offset != 0.0) {
    -    printpoints= qh_settemp(qh, n);
    -    FOREACHpoint_(points)
    -      qh_setappend(qh, &printpoints, qh_projectpoint(qh, point, facet, -offset));
    -  }else
    -    printpoints= points;
    -  FOREACHpoint_(printpoints) {
    -    for (k=0; k < qh->hull_dim; k++) {
    -      if (k == qh->DROPdim)
    -        qh_fprintf(qh, fp, 9099, "0 ");
    -      else
    -        qh_fprintf(qh, fp, 9100, "%8.4g ", point[k]);
    -    }
    -    if (printpoints != points)
    -      qh_memfree(qh, point, qh->normal_size);
    -    qh_fprintf(qh, fp, 9101, "\n");
    -  }
    -  if (printpoints != points)
    -    qh_settempfree(qh, &printpoints);
    -  qh_fprintf(qh, fp, 9102, "%d ", n);
    -  for (i=0; i < n; i++)
    -    qh_fprintf(qh, fp, 9103, "%d ", i);
    -  qh_fprintf(qh, fp, 9104, "%8.4g %8.4g %8.4g 1.0 }\n", color[0], color[1], color[2]);
    -} /* printfacet3geom_points */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacet3geom_simplicial(qh, )
    -    print Geomview OFF for a 3-d simplicial facet.
    -
    -  notes:
    -    may flip color
    -    uses facet->visitid for intersections and ridges
    -
    -    assume precise calculations in io_r.c with roundoff covered by qh_GEOMepsilon
    -    innerplane may be off by qh->DISTround.  Maxoutside is calculated elsewhere
    -    so a DISTround error may have occurred.
    -*/
    -void qh_printfacet3geom_simplicial(qhT *qh, FILE *fp, facetT *facet, realT color[3]) {
    -  setT *points, *vertices;
    -  vertexT *vertex, **vertexp, *vertexA, *vertexB;
    -  facetT *neighbor, **neighborp;
    -  realT outerplane, innerplane;
    -  realT black[3]={0, 0, 0}, green[3]={0, 1, 0};
    -  int k;
    -
    -  qh_geomplanes(qh, facet, &outerplane, &innerplane);
    -  vertices= qh_facet3vertex(qh, facet);
    -  points= qh_settemp(qh, qh->TEMPsize);
    -  FOREACHvertex_(vertices)
    -    qh_setappend(qh, &points, vertex->point);
    -  if (qh->PRINTouter || (!qh->PRINTnoplanes && !qh->PRINTinner))
    -    qh_printfacet3geom_points(qh, fp, points, facet, outerplane, color);
    -  if (qh->PRINTinner || (!qh->PRINTnoplanes && !qh->PRINTouter &&
    -              outerplane - innerplane > 2 * qh->MAXabs_coord * qh_GEOMepsilon)) {
    -    for (k=3; k--; )
    -      color[k]= 1.0 - color[k];
    -    qh_printfacet3geom_points(qh, fp, points, facet, innerplane, color);
    -  }
    -  qh_settempfree(qh, &points);
    -  qh_settempfree(qh, &vertices);
    -  if ((qh->DOintersections || qh->PRINTridges)
    -  && (!facet->visible || !qh->NEWfacets)) {
    -    facet->visitid= qh->visit_id;
    -    FOREACHneighbor_(facet) {
    -      if (neighbor->visitid != qh->visit_id) {
    -        vertices= qh_setnew_delnthsorted(qh, facet->vertices, qh->hull_dim,
    -                          SETindex_(facet->neighbors, neighbor), 0);
    -        if (qh->DOintersections)
    -           qh_printhyperplaneintersection(qh, fp, facet, neighbor, vertices, black);
    -        if (qh->PRINTridges) {
    -          vertexA= SETfirstt_(vertices, vertexT);
    -          vertexB= SETsecondt_(vertices, vertexT);
    -          qh_printline3geom(qh, fp, vertexA->point, vertexB->point, green);
    -        }
    -        qh_setfree(qh, &vertices);
    -      }
    -    }
    -  }
    -} /* printfacet3geom_simplicial */
    -
    -/*---------------------------------
    -
    -  qh_printfacet3math(qh, fp, facet, notfirst )
    -    print 3-d Maple or Mathematica output for a facet
    -
    -  notes:
    -    may be non-simplicial
    -    use %16.8f since Mathematica 2.2 does not handle exponential format
    -    see qh_printfacet2math
    -*/
    -void qh_printfacet3math(qhT *qh, FILE *fp, facetT *facet, qh_PRINT format, int notfirst) {
    -  vertexT *vertex, **vertexp;
    -  setT *points, *vertices;
    -  pointT *point, **pointp;
    -  boolT firstpoint= True;
    -  realT dist;
    -  const char *pointfmt, *endfmt;
    -
    -  if (notfirst)
    -    qh_fprintf(qh, fp, 9105, ",\n");
    -  vertices= qh_facet3vertex(qh, facet);
    -  points= qh_settemp(qh, qh_setsize(qh, vertices));
    -  FOREACHvertex_(vertices) {
    -    zinc_(Zdistio);
    -    qh_distplane(qh, vertex->point, facet, &dist);
    -    point= qh_projectpoint(qh, vertex->point, facet, dist);
    -    qh_setappend(qh, &points, point);
    -  }
    -  if (format == qh_PRINTmaple) {
    -    qh_fprintf(qh, fp, 9106, "[");
    -    pointfmt= "[%16.8f, %16.8f, %16.8f]";
    -    endfmt= "]";
    -  }else {
    -    qh_fprintf(qh, fp, 9107, "Polygon[{");
    -    pointfmt= "{%16.8f, %16.8f, %16.8f}";
    -    endfmt= "}]";
    -  }
    -  FOREACHpoint_(points) {
    -    if (firstpoint)
    -      firstpoint= False;
    -    else
    -      qh_fprintf(qh, fp, 9108, ",\n");
    -    qh_fprintf(qh, fp, 9109, pointfmt, point[0], point[1], point[2]);
    -  }
    -  FOREACHpoint_(points)
    -    qh_memfree(qh, point, qh->normal_size);
    -  qh_settempfree(qh, &points);
    -  qh_settempfree(qh, &vertices);
    -  qh_fprintf(qh, fp, 9110, "%s", endfmt);
    -} /* printfacet3math */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacet3vertex(qh, fp, facet, format )
    -    print vertices in a 3-d facet as point ids
    -
    -  notes:
    -    prints number of vertices first if format == qh_PRINToff
    -    the facet may be non-simplicial
    -*/
    -void qh_printfacet3vertex(qhT *qh, FILE *fp, facetT *facet, qh_PRINT format) {
    -  vertexT *vertex, **vertexp;
    -  setT *vertices;
    -
    -  vertices= qh_facet3vertex(qh, facet);
    -  if (format == qh_PRINToff)
    -    qh_fprintf(qh, fp, 9111, "%d ", qh_setsize(qh, vertices));
    -  FOREACHvertex_(vertices)
    -    qh_fprintf(qh, fp, 9112, "%d ", qh_pointid(qh, vertex->point));
    -  qh_fprintf(qh, fp, 9113, "\n");
    -  qh_settempfree(qh, &vertices);
    -} /* printfacet3vertex */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacet4geom_nonsimplicial(qh, )
    -    print Geomview 4OFF file for a 4d nonsimplicial facet
    -    prints all ridges to unvisited neighbors (qh.visit_id)
    -    if qh.DROPdim
    -      prints in OFF format
    -
    -  notes:
    -    must agree with printend4geom()
    -*/
    -void qh_printfacet4geom_nonsimplicial(qhT *qh, FILE *fp, facetT *facet, realT color[3]) {
    -  facetT *neighbor;
    -  ridgeT *ridge, **ridgep;
    -  vertexT *vertex, **vertexp;
    -  pointT *point;
    -  int k;
    -  realT dist;
    -
    -  facet->visitid= qh->visit_id;
    -  if (qh->PRINTnoplanes || (facet->visible && qh->NEWfacets))
    -    return;
    -  FOREACHridge_(facet->ridges) {
    -    neighbor= otherfacet_(ridge, facet);
    -    if (neighbor->visitid == qh->visit_id)
    -      continue;
    -    if (qh->PRINTtransparent && !neighbor->good)
    -      continue;
    -    if (qh->DOintersections)
    -      qh_printhyperplaneintersection(qh, fp, facet, neighbor, ridge->vertices, color);
    -    else {
    -      if (qh->DROPdim >= 0)
    -        qh_fprintf(qh, fp, 9114, "OFF 3 1 1 # f%d\n", facet->id);
    -      else {
    -        qh->printoutvar++;
    -        qh_fprintf(qh, fp, 9115, "# r%d between f%d f%d\n", ridge->id, facet->id, neighbor->id);
    -      }
    -      FOREACHvertex_(ridge->vertices) {
    -        zinc_(Zdistio);
    -        qh_distplane(qh, vertex->point,facet, &dist);
    -        point=qh_projectpoint(qh, vertex->point,facet, dist);
    -        for (k=0; k < qh->hull_dim; k++) {
    -          if (k != qh->DROPdim)
    -            qh_fprintf(qh, fp, 9116, "%8.4g ", point[k]);
    -        }
    -        qh_fprintf(qh, fp, 9117, "\n");
    -        qh_memfree(qh, point, qh->normal_size);
    -      }
    -      if (qh->DROPdim >= 0)
    -        qh_fprintf(qh, fp, 9118, "3 0 1 2 %8.4g %8.4g %8.4g\n", color[0], color[1], color[2]);
    -    }
    -  }
    -} /* printfacet4geom_nonsimplicial */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacet4geom_simplicial(qh, fp, facet, color )
    -    print Geomview 4OFF file for a 4d simplicial facet
    -    prints triangles for unvisited neighbors (qh.visit_id)
    -
    -  notes:
    -    must agree with printend4geom()
    -*/
    -void qh_printfacet4geom_simplicial(qhT *qh, FILE *fp, facetT *facet, realT color[3]) {
    -  setT *vertices;
    -  facetT *neighbor, **neighborp;
    -  vertexT *vertex, **vertexp;
    -  int k;
    -
    -  facet->visitid= qh->visit_id;
    -  if (qh->PRINTnoplanes || (facet->visible && qh->NEWfacets))
    -    return;
    -  FOREACHneighbor_(facet) {
    -    if (neighbor->visitid == qh->visit_id)
    -      continue;
    -    if (qh->PRINTtransparent && !neighbor->good)
    -      continue;
    -    vertices= qh_setnew_delnthsorted(qh, facet->vertices, qh->hull_dim,
    -                          SETindex_(facet->neighbors, neighbor), 0);
    -    if (qh->DOintersections)
    -      qh_printhyperplaneintersection(qh, fp, facet, neighbor, vertices, color);
    -    else {
    -      if (qh->DROPdim >= 0)
    -        qh_fprintf(qh, fp, 9119, "OFF 3 1 1 # ridge between f%d f%d\n",
    -                facet->id, neighbor->id);
    -      else {
    -        qh->printoutvar++;
    -        qh_fprintf(qh, fp, 9120, "# ridge between f%d f%d\n", facet->id, neighbor->id);
    -      }
    -      FOREACHvertex_(vertices) {
    -        for (k=0; k < qh->hull_dim; k++) {
    -          if (k != qh->DROPdim)
    -            qh_fprintf(qh, fp, 9121, "%8.4g ", vertex->point[k]);
    -        }
    -        qh_fprintf(qh, fp, 9122, "\n");
    -      }
    -      if (qh->DROPdim >= 0)
    -        qh_fprintf(qh, fp, 9123, "3 0 1 2 %8.4g %8.4g %8.4g\n", color[0], color[1], color[2]);
    -    }
    -    qh_setfree(qh, &vertices);
    -  }
    -} /* printfacet4geom_simplicial */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacetNvertex_nonsimplicial(qh, fp, facet, id, format )
    -    print vertices for an N-d non-simplicial facet
    -    triangulates each ridge to the id
    -*/
    -void qh_printfacetNvertex_nonsimplicial(qhT *qh, FILE *fp, facetT *facet, int id, qh_PRINT format) {
    -  vertexT *vertex, **vertexp;
    -  ridgeT *ridge, **ridgep;
    -
    -  if (facet->visible && qh->NEWfacets)
    -    return;
    -  FOREACHridge_(facet->ridges) {
    -    if (format == qh_PRINTtriangles)
    -      qh_fprintf(qh, fp, 9124, "%d ", qh->hull_dim);
    -    qh_fprintf(qh, fp, 9125, "%d ", id);
    -    if ((ridge->top == facet) ^ qh_ORIENTclock) {
    -      FOREACHvertex_(ridge->vertices)
    -        qh_fprintf(qh, fp, 9126, "%d ", qh_pointid(qh, vertex->point));
    -    }else {
    -      FOREACHvertexreverse12_(ridge->vertices)
    -        qh_fprintf(qh, fp, 9127, "%d ", qh_pointid(qh, vertex->point));
    -    }
    -    qh_fprintf(qh, fp, 9128, "\n");
    -  }
    -} /* printfacetNvertex_nonsimplicial */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacetNvertex_simplicial(qh, fp, facet, format )
    -    print vertices for an N-d simplicial facet
    -    prints vertices for non-simplicial facets
    -      2-d facets (orientation preserved by qh_mergefacet2d)
    -      PRINToff ('o') for 4-d and higher
    -*/
    -void qh_printfacetNvertex_simplicial(qhT *qh, FILE *fp, facetT *facet, qh_PRINT format) {
    -  vertexT *vertex, **vertexp;
    -
    -  if (format == qh_PRINToff || format == qh_PRINTtriangles)
    -    qh_fprintf(qh, fp, 9129, "%d ", qh_setsize(qh, facet->vertices));
    -  if ((facet->toporient ^ qh_ORIENTclock)
    -  || (qh->hull_dim > 2 && !facet->simplicial)) {
    -    FOREACHvertex_(facet->vertices)
    -      qh_fprintf(qh, fp, 9130, "%d ", qh_pointid(qh, vertex->point));
    -  }else {
    -    FOREACHvertexreverse12_(facet->vertices)
    -      qh_fprintf(qh, fp, 9131, "%d ", qh_pointid(qh, vertex->point));
    -  }
    -  qh_fprintf(qh, fp, 9132, "\n");
    -} /* printfacetNvertex_simplicial */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacetheader(qh, fp, facet )
    -    prints header fields of a facet to fp
    -
    -  notes:
    -    for 'f' output and debugging
    -    Same as QhullFacet::printHeader()
    -*/
    -void qh_printfacetheader(qhT *qh, FILE *fp, facetT *facet) {
    -  pointT *point, **pointp, *furthest;
    -  facetT *neighbor, **neighborp;
    -  realT dist;
    -
    -  if (facet == qh_MERGEridge) {
    -    qh_fprintf(qh, fp, 9133, " MERGEridge\n");
    -    return;
    -  }else if (facet == qh_DUPLICATEridge) {
    -    qh_fprintf(qh, fp, 9134, " DUPLICATEridge\n");
    -    return;
    -  }else if (!facet) {
    -    qh_fprintf(qh, fp, 9135, " NULLfacet\n");
    -    return;
    -  }
    -  qh->old_randomdist= qh->RANDOMdist;
    -  qh->RANDOMdist= False;
    -  qh_fprintf(qh, fp, 9136, "- f%d\n", facet->id);
    -  qh_fprintf(qh, fp, 9137, "    - flags:");
    -  if (facet->toporient)
    -    qh_fprintf(qh, fp, 9138, " top");
    -  else
    -    qh_fprintf(qh, fp, 9139, " bottom");
    -  if (facet->simplicial)
    -    qh_fprintf(qh, fp, 9140, " simplicial");
    -  if (facet->tricoplanar)
    -    qh_fprintf(qh, fp, 9141, " tricoplanar");
    -  if (facet->upperdelaunay)
    -    qh_fprintf(qh, fp, 9142, " upperDelaunay");
    -  if (facet->visible)
    -    qh_fprintf(qh, fp, 9143, " visible");
    -  if (facet->newfacet)
    -    qh_fprintf(qh, fp, 9144, " new");
    -  if (facet->tested)
    -    qh_fprintf(qh, fp, 9145, " tested");
    -  if (!facet->good)
    -    qh_fprintf(qh, fp, 9146, " notG");
    -  if (facet->seen)
    -    qh_fprintf(qh, fp, 9147, " seen");
    -  if (facet->coplanar)
    -    qh_fprintf(qh, fp, 9148, " coplanar");
    -  if (facet->mergehorizon)
    -    qh_fprintf(qh, fp, 9149, " mergehorizon");
    -  if (facet->keepcentrum)
    -    qh_fprintf(qh, fp, 9150, " keepcentrum");
    -  if (facet->dupridge)
    -    qh_fprintf(qh, fp, 9151, " dupridge");
    -  if (facet->mergeridge && !facet->mergeridge2)
    -    qh_fprintf(qh, fp, 9152, " mergeridge1");
    -  if (facet->mergeridge2)
    -    qh_fprintf(qh, fp, 9153, " mergeridge2");
    -  if (facet->newmerge)
    -    qh_fprintf(qh, fp, 9154, " newmerge");
    -  if (facet->flipped)
    -    qh_fprintf(qh, fp, 9155, " flipped");
    -  if (facet->notfurthest)
    -    qh_fprintf(qh, fp, 9156, " notfurthest");
    -  if (facet->degenerate)
    -    qh_fprintf(qh, fp, 9157, " degenerate");
    -  if (facet->redundant)
    -    qh_fprintf(qh, fp, 9158, " redundant");
    -  qh_fprintf(qh, fp, 9159, "\n");
    -  if (facet->isarea)
    -    qh_fprintf(qh, fp, 9160, "    - area: %2.2g\n", facet->f.area);
    -  else if (qh->NEWfacets && facet->visible && facet->f.replace)
    -    qh_fprintf(qh, fp, 9161, "    - replacement: f%d\n", facet->f.replace->id);
    -  else if (facet->newfacet) {
    -    if (facet->f.samecycle && facet->f.samecycle != facet)
    -      qh_fprintf(qh, fp, 9162, "    - shares same visible/horizon as f%d\n", facet->f.samecycle->id);
    -  }else if (facet->tricoplanar /* !isarea */) {
    -    if (facet->f.triowner)
    -      qh_fprintf(qh, fp, 9163, "    - owner of normal & centrum is facet f%d\n", facet->f.triowner->id);
    -  }else if (facet->f.newcycle)
    -    qh_fprintf(qh, fp, 9164, "    - was horizon to f%d\n", facet->f.newcycle->id);
    -  if (facet->nummerge)
    -    qh_fprintf(qh, fp, 9165, "    - merges: %d\n", facet->nummerge);
    -  qh_printpointid(qh, fp, "    - normal: ", qh->hull_dim, facet->normal, qh_IDunknown);
    -  qh_fprintf(qh, fp, 9166, "    - offset: %10.7g\n", facet->offset);
    -  if (qh->CENTERtype == qh_ASvoronoi || facet->center)
    -    qh_printcenter(qh, fp, qh_PRINTfacets, "    - center: ", facet);
    -#if qh_MAXoutside
    -  if (facet->maxoutside > qh->DISTround)
    -    qh_fprintf(qh, fp, 9167, "    - maxoutside: %10.7g\n", facet->maxoutside);
    -#endif
    -  if (!SETempty_(facet->outsideset)) {
    -    furthest= (pointT*)qh_setlast(facet->outsideset);
    -    if (qh_setsize(qh, facet->outsideset) < 6) {
    -      qh_fprintf(qh, fp, 9168, "    - outside set(furthest p%d):\n", qh_pointid(qh, furthest));
    -      FOREACHpoint_(facet->outsideset)
    -        qh_printpoint(qh, fp, "     ", point);
    -    }else if (qh_setsize(qh, facet->outsideset) < 21) {
    -      qh_printpoints(qh, fp, "    - outside set:", facet->outsideset);
    -    }else {
    -      qh_fprintf(qh, fp, 9169, "    - outside set:  %d points.", qh_setsize(qh, facet->outsideset));
    -      qh_printpoint(qh, fp, "  Furthest", furthest);
    -    }
    -#if !qh_COMPUTEfurthest
    -    qh_fprintf(qh, fp, 9170, "    - furthest distance= %2.2g\n", facet->furthestdist);
    -#endif
    -  }
    -  if (!SETempty_(facet->coplanarset)) {
    -    furthest= (pointT*)qh_setlast(facet->coplanarset);
    -    if (qh_setsize(qh, facet->coplanarset) < 6) {
    -      qh_fprintf(qh, fp, 9171, "    - coplanar set(furthest p%d):\n", qh_pointid(qh, furthest));
    -      FOREACHpoint_(facet->coplanarset)
    -        qh_printpoint(qh, fp, "     ", point);
    -    }else if (qh_setsize(qh, facet->coplanarset) < 21) {
    -      qh_printpoints(qh, fp, "    - coplanar set:", facet->coplanarset);
    -    }else {
    -      qh_fprintf(qh, fp, 9172, "    - coplanar set:  %d points.", qh_setsize(qh, facet->coplanarset));
    -      qh_printpoint(qh, fp, "  Furthest", furthest);
    -    }
    -    zinc_(Zdistio);
    -    qh_distplane(qh, furthest, facet, &dist);
    -    qh_fprintf(qh, fp, 9173, "      furthest distance= %2.2g\n", dist);
    -  }
    -  qh_printvertices(qh, fp, "    - vertices:", facet->vertices);
    -  qh_fprintf(qh, fp, 9174, "    - neighboring facets:");
    -  FOREACHneighbor_(facet) {
    -    if (neighbor == qh_MERGEridge)
    -      qh_fprintf(qh, fp, 9175, " MERGE");
    -    else if (neighbor == qh_DUPLICATEridge)
    -      qh_fprintf(qh, fp, 9176, " DUP");
    -    else
    -      qh_fprintf(qh, fp, 9177, " f%d", neighbor->id);
    -  }
    -  qh_fprintf(qh, fp, 9178, "\n");
    -  qh->RANDOMdist= qh->old_randomdist;
    -} /* printfacetheader */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacetridges(qh, fp, facet )
    -    prints ridges of a facet to fp
    -
    -  notes:
    -    ridges printed in neighbor order
    -    assumes the ridges exist
    -    for 'f' output
    -    same as QhullFacet::printRidges
    -*/
    -void qh_printfacetridges(qhT *qh, FILE *fp, facetT *facet) {
    -  facetT *neighbor, **neighborp;
    -  ridgeT *ridge, **ridgep;
    -  int numridges= 0;
    -
    -
    -  if (facet->visible && qh->NEWfacets) {
    -    qh_fprintf(qh, fp, 9179, "    - ridges(ids may be garbage):");
    -    FOREACHridge_(facet->ridges)
    -      qh_fprintf(qh, fp, 9180, " r%d", ridge->id);
    -    qh_fprintf(qh, fp, 9181, "\n");
    -  }else {
    -    qh_fprintf(qh, fp, 9182, "    - ridges:\n");
    -    FOREACHridge_(facet->ridges)
    -      ridge->seen= False;
    -    if (qh->hull_dim == 3) {
    -      ridge= SETfirstt_(facet->ridges, ridgeT);
    -      while (ridge && !ridge->seen) {
    -        ridge->seen= True;
    -        qh_printridge(qh, fp, ridge);
    -        numridges++;
    -        ridge= qh_nextridge3d(ridge, facet, NULL);
    -        }
    -    }else {
    -      FOREACHneighbor_(facet) {
    -        FOREACHridge_(facet->ridges) {
    -          if (otherfacet_(ridge,facet) == neighbor) {
    -            ridge->seen= True;
    -            qh_printridge(qh, fp, ridge);
    -            numridges++;
    -          }
    -        }
    -      }
    -    }
    -    if (numridges != qh_setsize(qh, facet->ridges)) {
    -      qh_fprintf(qh, fp, 9183, "     - all ridges:");
    -      FOREACHridge_(facet->ridges)
    -        qh_fprintf(qh, fp, 9184, " r%d", ridge->id);
    -        qh_fprintf(qh, fp, 9185, "\n");
    -    }
    -    FOREACHridge_(facet->ridges) {
    -      if (!ridge->seen)
    -        qh_printridge(qh, fp, ridge);
    -    }
    -  }
    -} /* printfacetridges */
    -
    -/*---------------------------------
    -
    -  qh_printfacets(qh, fp, format, facetlist, facets, printall )
    -    prints facetlist and/or facet set in output format
    -
    -  notes:
    -    also used for specialized formats ('FO' and summary)
    -    turns off 'Rn' option since want actual numbers
    -*/
    -void qh_printfacets(qhT *qh, FILE *fp, qh_PRINT format, facetT *facetlist, setT *facets, boolT printall) {
    -  int numfacets, numsimplicial, numridges, totneighbors, numcoplanars, numtricoplanars;
    -  facetT *facet, **facetp;
    -  setT *vertices;
    -  coordT *center;
    -  realT outerplane, innerplane;
    -
    -  qh->old_randomdist= qh->RANDOMdist;
    -  qh->RANDOMdist= False;
    -  if (qh->CDDoutput && (format == qh_PRINTcentrums || format == qh_PRINTpointintersect || format == qh_PRINToff))
    -    qh_fprintf(qh, qh->ferr, 7056, "qhull warning: CDD format is not available for centrums, halfspace\nintersections, and OFF file format.\n");
    -  if (format == qh_PRINTnone)
    -    ; /* print nothing */
    -  else if (format == qh_PRINTaverage) {
    -    vertices= qh_facetvertices(qh, facetlist, facets, printall);
    -    center= qh_getcenter(qh, vertices);
    -    qh_fprintf(qh, fp, 9186, "%d 1\n", qh->hull_dim);
    -    qh_printpointid(qh, fp, NULL, qh->hull_dim, center, qh_IDunknown);
    -    qh_memfree(qh, center, qh->normal_size);
    -    qh_settempfree(qh, &vertices);
    -  }else if (format == qh_PRINTextremes) {
    -    if (qh->DELAUNAY)
    -      qh_printextremes_d(qh, fp, facetlist, facets, printall);
    -    else if (qh->hull_dim == 2)
    -      qh_printextremes_2d(qh, fp, facetlist, facets, printall);
    -    else
    -      qh_printextremes(qh, fp, facetlist, facets, printall);
    -  }else if (format == qh_PRINToptions)
    -    qh_fprintf(qh, fp, 9187, "Options selected for Qhull %s:\n%s\n", qh_version, qh->qhull_options);
    -  else if (format == qh_PRINTpoints && !qh->VORONOI)
    -    qh_printpoints_out(qh, fp, facetlist, facets, printall);
    -  else if (format == qh_PRINTqhull)
    -    qh_fprintf(qh, fp, 9188, "%s | %s\n", qh->rbox_command, qh->qhull_command);
    -  else if (format == qh_PRINTsize) {
    -    qh_fprintf(qh, fp, 9189, "0\n2 ");
    -    qh_fprintf(qh, fp, 9190, qh_REAL_1, qh->totarea);
    -    qh_fprintf(qh, fp, 9191, qh_REAL_1, qh->totvol);
    -    qh_fprintf(qh, fp, 9192, "\n");
    -  }else if (format == qh_PRINTsummary) {
    -    qh_countfacets(qh, facetlist, facets, printall, &numfacets, &numsimplicial,
    -      &totneighbors, &numridges, &numcoplanars, &numtricoplanars);
    -    vertices= qh_facetvertices(qh, facetlist, facets, printall);
    -    qh_fprintf(qh, fp, 9193, "10 %d %d %d %d %d %d %d %d %d %d\n2 ", qh->hull_dim,
    -                qh->num_points + qh_setsize(qh, qh->other_points),
    -                qh->num_vertices, qh->num_facets - qh->num_visible,
    -                qh_setsize(qh, vertices), numfacets, numcoplanars,
    -                numfacets - numsimplicial, zzval_(Zdelvertextot),
    -                numtricoplanars);
    -    qh_settempfree(qh, &vertices);
    -    qh_outerinner(qh, NULL, &outerplane, &innerplane);
    -    qh_fprintf(qh, fp, 9194, qh_REAL_2n, outerplane, innerplane);
    -  }else if (format == qh_PRINTvneighbors)
    -    qh_printvneighbors(qh, fp, facetlist, facets, printall);
    -  else if (qh->VORONOI && format == qh_PRINToff)
    -    qh_printvoronoi(qh, fp, format, facetlist, facets, printall);
    -  else if (qh->VORONOI && format == qh_PRINTgeom) {
    -    qh_printbegin(qh, fp, format, facetlist, facets, printall);
    -    qh_printvoronoi(qh, fp, format, facetlist, facets, printall);
    -    qh_printend(qh, fp, format, facetlist, facets, printall);
    -  }else if (qh->VORONOI
    -  && (format == qh_PRINTvertices || format == qh_PRINTinner || format == qh_PRINTouter))
    -    qh_printvdiagram(qh, fp, format, facetlist, facets, printall);
    -  else {
    -    qh_printbegin(qh, fp, format, facetlist, facets, printall);
    -    FORALLfacet_(facetlist)
    -      qh_printafacet(qh, fp, format, facet, printall);
    -    FOREACHfacet_(facets)
    -      qh_printafacet(qh, fp, format, facet, printall);
    -    qh_printend(qh, fp, format, facetlist, facets, printall);
    -  }
    -  qh->RANDOMdist= qh->old_randomdist;
    -} /* printfacets */
    -
    -
    -/*---------------------------------
    -
    -  qh_printhyperplaneintersection(qh, fp, facet1, facet2, vertices, color )
    -    print Geomview OFF or 4OFF for the intersection of two hyperplanes in 3-d or 4-d
    -*/
    -void qh_printhyperplaneintersection(qhT *qh, FILE *fp, facetT *facet1, facetT *facet2,
    -                   setT *vertices, realT color[3]) {
    -  realT costheta, denominator, dist1, dist2, s, t, mindenom, p[4];
    -  vertexT *vertex, **vertexp;
    -  int i, k;
    -  boolT nearzero1, nearzero2;
    -
    -  costheta= qh_getangle(qh, facet1->normal, facet2->normal);
    -  denominator= 1 - costheta * costheta;
    -  i= qh_setsize(qh, vertices);
    -  if (qh->hull_dim == 3)
    -    qh_fprintf(qh, fp, 9195, "VECT 1 %d 1 %d 1 ", i, i);
    -  else if (qh->hull_dim == 4 && qh->DROPdim >= 0)
    -    qh_fprintf(qh, fp, 9196, "OFF 3 1 1 ");
    -  else
    -    qh->printoutvar++;
    -  qh_fprintf(qh, fp, 9197, "# intersect f%d f%d\n", facet1->id, facet2->id);
    -  mindenom= 1 / (10.0 * qh->MAXabs_coord);
    -  FOREACHvertex_(vertices) {
    -    zadd_(Zdistio, 2);
    -    qh_distplane(qh, vertex->point, facet1, &dist1);
    -    qh_distplane(qh, vertex->point, facet2, &dist2);
    -    s= qh_divzero(-dist1 + costheta * dist2, denominator,mindenom,&nearzero1);
    -    t= qh_divzero(-dist2 + costheta * dist1, denominator,mindenom,&nearzero2);
    -    if (nearzero1 || nearzero2)
    -      s= t= 0.0;
    -    for (k=qh->hull_dim; k--; )
    -      p[k]= vertex->point[k] + facet1->normal[k] * s + facet2->normal[k] * t;
    -    if (qh->PRINTdim <= 3) {
    -      qh_projectdim3(qh, p, p);
    -      qh_fprintf(qh, fp, 9198, "%8.4g %8.4g %8.4g # ", p[0], p[1], p[2]);
    -    }else
    -      qh_fprintf(qh, fp, 9199, "%8.4g %8.4g %8.4g %8.4g # ", p[0], p[1], p[2], p[3]);
    -    if (nearzero1+nearzero2)
    -      qh_fprintf(qh, fp, 9200, "p%d(coplanar facets)\n", qh_pointid(qh, vertex->point));
    -    else
    -      qh_fprintf(qh, fp, 9201, "projected p%d\n", qh_pointid(qh, vertex->point));
    -  }
    -  if (qh->hull_dim == 3)
    -    qh_fprintf(qh, fp, 9202, "%8.4g %8.4g %8.4g 1.0\n", color[0], color[1], color[2]);
    -  else if (qh->hull_dim == 4 && qh->DROPdim >= 0)
    -    qh_fprintf(qh, fp, 9203, "3 0 1 2 %8.4g %8.4g %8.4g 1.0\n", color[0], color[1], color[2]);
    -} /* printhyperplaneintersection */
    -
    -/*---------------------------------
    -
    -  qh_printline3geom(qh, fp, pointA, pointB, color )
    -    prints a line as a VECT
    -    prints 0's for qh.DROPdim
    -
    -  notes:
    -    if pointA == pointB,
    -      it's a 1 point VECT
    -*/
    -void qh_printline3geom(qhT *qh, FILE *fp, pointT *pointA, pointT *pointB, realT color[3]) {
    -  int k;
    -  realT pA[4], pB[4];
    -
    -  qh_projectdim3(qh, pointA, pA);
    -  qh_projectdim3(qh, pointB, pB);
    -  if ((fabs(pA[0] - pB[0]) > 1e-3) ||
    -      (fabs(pA[1] - pB[1]) > 1e-3) ||
    -      (fabs(pA[2] - pB[2]) > 1e-3)) {
    -    qh_fprintf(qh, fp, 9204, "VECT 1 2 1 2 1\n");
    -    for (k=0; k < 3; k++)
    -       qh_fprintf(qh, fp, 9205, "%8.4g ", pB[k]);
    -    qh_fprintf(qh, fp, 9206, " # p%d\n", qh_pointid(qh, pointB));
    -  }else
    -    qh_fprintf(qh, fp, 9207, "VECT 1 1 1 1 1\n");
    -  for (k=0; k < 3; k++)
    -    qh_fprintf(qh, fp, 9208, "%8.4g ", pA[k]);
    -  qh_fprintf(qh, fp, 9209, " # p%d\n", qh_pointid(qh, pointA));
    -  qh_fprintf(qh, fp, 9210, "%8.4g %8.4g %8.4g 1\n", color[0], color[1], color[2]);
    -}
    -
    -/*---------------------------------
    -
    -  qh_printneighborhood(qh, fp, format, facetA, facetB, printall )
    -    print neighborhood of one or two facets
    -
    -  notes:
    -    calls qh_findgood_all()
    -    bumps qh.visit_id
    -*/
    -void qh_printneighborhood(qhT *qh, FILE *fp, qh_PRINT format, facetT *facetA, facetT *facetB, boolT printall) {
    -  facetT *neighbor, **neighborp, *facet;
    -  setT *facets;
    -
    -  if (format == qh_PRINTnone)
    -    return;
    -  qh_findgood_all(qh, qh->facet_list);
    -  if (facetA == facetB)
    -    facetB= NULL;
    -  facets= qh_settemp(qh, 2*(qh_setsize(qh, facetA->neighbors)+1));
    -  qh->visit_id++;
    -  for (facet= facetA; facet; facet= ((facet == facetA) ? facetB : NULL)) {
    -    if (facet->visitid != qh->visit_id) {
    -      facet->visitid= qh->visit_id;
    -      qh_setappend(qh, &facets, facet);
    -    }
    -    FOREACHneighbor_(facet) {
    -      if (neighbor->visitid == qh->visit_id)
    -        continue;
    -      neighbor->visitid= qh->visit_id;
    -      if (printall || !qh_skipfacet(qh, neighbor))
    -        qh_setappend(qh, &facets, neighbor);
    -    }
    -  }
    -  qh_printfacets(qh, fp, format, NULL, facets, printall);
    -  qh_settempfree(qh, &facets);
    -} /* printneighborhood */
    -
    -/*---------------------------------
    -
    -  qh_printpoint(qh, fp, string, point )
    -  qh_printpointid(qh, fp, string, dim, point, id )
    -    prints the coordinates of a point
    -
    -  returns:
    -    if string is defined
    -      prints 'string p%d'.  Skips p%d if id=qh_IDunknown(-1) or qh_IDnone(-3)
    -
    -  notes:
    -    nop if point is NULL
    -    Same as QhullPoint's printPoint
    -*/
    -void qh_printpoint(qhT *qh, FILE *fp, const char *string, pointT *point) {
    -  int id= qh_pointid(qh, point);
    -
    -  qh_printpointid(qh, fp, string, qh->hull_dim, point, id);
    -} /* printpoint */
    -
    -void qh_printpointid(qhT *qh, FILE *fp, const char *string, int dim, pointT *point, int id) {
    -  int k;
    -  realT r; /*bug fix*/
    -
    -  if (!point)
    -    return;
    -  if (string) {
    -    qh_fprintf(qh, fp, 9211, "%s", string);
    -    if (id != qh_IDunknown && id != qh_IDnone)
    -      qh_fprintf(qh, fp, 9212, " p%d: ", id);
    -  }
    -  for (k=dim; k--; ) {
    -    r= *point++;
    -    if (string)
    -      qh_fprintf(qh, fp, 9213, " %8.4g", r);
    -    else
    -      qh_fprintf(qh, fp, 9214, qh_REAL_1, r);
    -  }
    -  qh_fprintf(qh, fp, 9215, "\n");
    -} /* printpointid */
    -
    -/*---------------------------------
    -
    -  qh_printpoint3(qh, fp, point )
    -    prints 2-d, 3-d, or 4-d point as Geomview 3-d coordinates
    -*/
    -void qh_printpoint3(qhT *qh, FILE *fp, pointT *point) {
    -  int k;
    -  realT p[4];
    -
    -  qh_projectdim3(qh, point, p);
    -  for (k=0; k < 3; k++)
    -    qh_fprintf(qh, fp, 9216, "%8.4g ", p[k]);
    -  qh_fprintf(qh, fp, 9217, " # p%d\n", qh_pointid(qh, point));
    -} /* printpoint3 */
    -
    -/*----------------------------------------
    --printpoints- print pointids for a set of points starting at index
    -   see geom_r.c
    -*/
    -
    -/*---------------------------------
    -
    -  qh_printpoints_out(qh, fp, facetlist, facets, printall )
    -    prints vertices, coplanar/inside points, for facets by their point coordinates
    -    allows qh.CDDoutput
    -
    -  notes:
    -    same format as qhull input
    -    if no coplanar/interior points,
    -      same order as qh_printextremes
    -*/
    -void qh_printpoints_out(qhT *qh, FILE *fp, facetT *facetlist, setT *facets, boolT printall) {
    -  int allpoints= qh->num_points + qh_setsize(qh, qh->other_points);
    -  int numpoints=0, point_i, point_n;
    -  setT *vertices, *points;
    -  facetT *facet, **facetp;
    -  pointT *point, **pointp;
    -  vertexT *vertex, **vertexp;
    -  int id;
    -
    -  points= qh_settemp(qh, allpoints);
    -  qh_setzero(qh, points, 0, allpoints);
    -  vertices= qh_facetvertices(qh, facetlist, facets, printall);
    -  FOREACHvertex_(vertices) {
    -    id= qh_pointid(qh, vertex->point);
    -    if (id >= 0)
    -      SETelem_(points, id)= vertex->point;
    -  }
    -  if (qh->KEEPinside || qh->KEEPcoplanar || qh->KEEPnearinside) {
    -    FORALLfacet_(facetlist) {
    -      if (!printall && qh_skipfacet(qh, facet))
    -        continue;
    -      FOREACHpoint_(facet->coplanarset) {
    -        id= qh_pointid(qh, point);
    -        if (id >= 0)
    -          SETelem_(points, id)= point;
    -      }
    -    }
    -    FOREACHfacet_(facets) {
    -      if (!printall && qh_skipfacet(qh, facet))
    -        continue;
    -      FOREACHpoint_(facet->coplanarset) {
    -        id= qh_pointid(qh, point);
    -        if (id >= 0)
    -          SETelem_(points, id)= point;
    -      }
    -    }
    -  }
    -  qh_settempfree(qh, &vertices);
    -  FOREACHpoint_i_(qh, points) {
    -    if (point)
    -      numpoints++;
    -  }
    -  if (qh->CDDoutput)
    -    qh_fprintf(qh, fp, 9218, "%s | %s\nbegin\n%d %d real\n", qh->rbox_command,
    -             qh->qhull_command, numpoints, qh->hull_dim + 1);
    -  else
    -    qh_fprintf(qh, fp, 9219, "%d\n%d\n", qh->hull_dim, numpoints);
    -  FOREACHpoint_i_(qh, points) {
    -    if (point) {
    -      if (qh->CDDoutput)
    -        qh_fprintf(qh, fp, 9220, "1 ");
    -      qh_printpoint(qh, fp, NULL, point);
    -    }
    -  }
    -  if (qh->CDDoutput)
    -    qh_fprintf(qh, fp, 9221, "end\n");
    -  qh_settempfree(qh, &points);
    -} /* printpoints_out */
    -
    -
    -/*---------------------------------
    -
    -  qh_printpointvect(qh, fp, point, normal, center, radius, color )
    -    prints a 2-d, 3-d, or 4-d point as 3-d VECT's relative to normal or to center point
    -*/
    -void qh_printpointvect(qhT *qh, FILE *fp, pointT *point, coordT *normal, pointT *center, realT radius, realT color[3]) {
    -  realT diff[4], pointA[4];
    -  int k;
    -
    -  for (k=qh->hull_dim; k--; ) {
    -    if (center)
    -      diff[k]= point[k]-center[k];
    -    else if (normal)
    -      diff[k]= normal[k];
    -    else
    -      diff[k]= 0;
    -  }
    -  if (center)
    -    qh_normalize2(qh, diff, qh->hull_dim, True, NULL, NULL);
    -  for (k=qh->hull_dim; k--; )
    -    pointA[k]= point[k]+diff[k] * radius;
    -  qh_printline3geom(qh, fp, point, pointA, color);
    -} /* printpointvect */
    -
    -/*---------------------------------
    -
    -  qh_printpointvect2(qh, fp, point, normal, center, radius )
    -    prints a 2-d, 3-d, or 4-d point as 2 3-d VECT's for an imprecise point
    -*/
    -void qh_printpointvect2(qhT *qh, FILE *fp, pointT *point, coordT *normal, pointT *center, realT radius) {
    -  realT red[3]={1, 0, 0}, yellow[3]={1, 1, 0};
    -
    -  qh_printpointvect(qh, fp, point, normal, center, radius, red);
    -  qh_printpointvect(qh, fp, point, normal, center, -radius, yellow);
    -} /* printpointvect2 */
    -
    -/*---------------------------------
    -
    -  qh_printridge(qh, fp, ridge )
    -    prints the information in a ridge
    -
    -  notes:
    -    for qh_printfacetridges()
    -    same as operator<< [QhullRidge.cpp]
    -*/
    -void qh_printridge(qhT *qh, FILE *fp, ridgeT *ridge) {
    -
    -  qh_fprintf(qh, fp, 9222, "     - r%d", ridge->id);
    -  if (ridge->tested)
    -    qh_fprintf(qh, fp, 9223, " tested");
    -  if (ridge->nonconvex)
    -    qh_fprintf(qh, fp, 9224, " nonconvex");
    -  qh_fprintf(qh, fp, 9225, "\n");
    -  qh_printvertices(qh, fp, "           vertices:", ridge->vertices);
    -  if (ridge->top && ridge->bottom)
    -    qh_fprintf(qh, fp, 9226, "           between f%d and f%d\n",
    -            ridge->top->id, ridge->bottom->id);
    -} /* printridge */
    -
    -/*---------------------------------
    -
    -  qh_printspheres(qh, fp, vertices, radius )
    -    prints 3-d vertices as OFF spheres
    -
    -  notes:
    -    inflated octahedron from Stuart Levy earth/mksphere2
    -*/
    -void qh_printspheres(qhT *qh, FILE *fp, setT *vertices, realT radius) {
    -  vertexT *vertex, **vertexp;
    -
    -  qh->printoutnum++;
    -  qh_fprintf(qh, fp, 9227, "{appearance {-edge -normal normscale 0} {\n\
    -INST geom {define vsphere OFF\n\
    -18 32 48\n\
    -\n\
    -0 0 1\n\
    -1 0 0\n\
    -0 1 0\n\
    --1 0 0\n\
    -0 -1 0\n\
    -0 0 -1\n\
    -0.707107 0 0.707107\n\
    -0 -0.707107 0.707107\n\
    -0.707107 -0.707107 0\n\
    --0.707107 0 0.707107\n\
    --0.707107 -0.707107 0\n\
    -0 0.707107 0.707107\n\
    --0.707107 0.707107 0\n\
    -0.707107 0.707107 0\n\
    -0.707107 0 -0.707107\n\
    -0 0.707107 -0.707107\n\
    --0.707107 0 -0.707107\n\
    -0 -0.707107 -0.707107\n\
    -\n\
    -3 0 6 11\n\
    -3 0 7 6 \n\
    -3 0 9 7 \n\
    -3 0 11 9\n\
    -3 1 6 8 \n\
    -3 1 8 14\n\
    -3 1 13 6\n\
    -3 1 14 13\n\
    -3 2 11 13\n\
    -3 2 12 11\n\
    -3 2 13 15\n\
    -3 2 15 12\n\
    -3 3 9 12\n\
    -3 3 10 9\n\
    -3 3 12 16\n\
    -3 3 16 10\n\
    -3 4 7 10\n\
    -3 4 8 7\n\
    -3 4 10 17\n\
    -3 4 17 8\n\
    -3 5 14 17\n\
    -3 5 15 14\n\
    -3 5 16 15\n\
    -3 5 17 16\n\
    -3 6 13 11\n\
    -3 7 8 6\n\
    -3 9 10 7\n\
    -3 11 12 9\n\
    -3 14 8 17\n\
    -3 15 13 14\n\
    -3 16 12 15\n\
    -3 17 10 16\n} transforms { TLIST\n");
    -  FOREACHvertex_(vertices) {
    -    qh_fprintf(qh, fp, 9228, "%8.4g 0 0 0 # v%d\n 0 %8.4g 0 0\n0 0 %8.4g 0\n",
    -      radius, vertex->id, radius, radius);
    -    qh_printpoint3(qh, fp, vertex->point);
    -    qh_fprintf(qh, fp, 9229, "1\n");
    -  }
    -  qh_fprintf(qh, fp, 9230, "}}}\n");
    -} /* printspheres */
    -
    -
    -/*----------------------------------------------
    --printsummary-
    -                see libqhull_r.c
    -*/
    -
    -/*---------------------------------
    -
    -  qh_printvdiagram(qh, fp, format, facetlist, facets, printall )
    -    print voronoi diagram
    -      # of pairs of input sites
    -      #indices site1 site2 vertex1 ...
    -
    -    sites indexed by input point id
    -      point 0 is the first input point
    -    vertices indexed by 'o' and 'p' order
    -      vertex 0 is the 'vertex-at-infinity'
    -      vertex 1 is the first Voronoi vertex
    -
    -  see:
    -    qh_printvoronoi()
    -    qh_eachvoronoi_all()
    -
    -  notes:
    -    if all facets are upperdelaunay,
    -      prints upper hull (furthest-site Voronoi diagram)
    -*/
    -void qh_printvdiagram(qhT *qh, FILE *fp, qh_PRINT format, facetT *facetlist, setT *facets, boolT printall) {
    -  setT *vertices;
    -  int totcount, numcenters;
    -  boolT isLower;
    -  qh_RIDGE innerouter= qh_RIDGEall;
    -  printvridgeT printvridge= NULL;
    -
    -  if (format == qh_PRINTvertices) {
    -    innerouter= qh_RIDGEall;
    -    printvridge= qh_printvridge;
    -  }else if (format == qh_PRINTinner) {
    -    innerouter= qh_RIDGEinner;
    -    printvridge= qh_printvnorm;
    -  }else if (format == qh_PRINTouter) {
    -    innerouter= qh_RIDGEouter;
    -    printvridge= qh_printvnorm;
    -  }else {
    -    qh_fprintf(qh, qh->ferr, 6219, "Qhull internal error (qh_printvdiagram): unknown print format %d.\n", format);
    -    qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -  }
    -  vertices= qh_markvoronoi(qh, facetlist, facets, printall, &isLower, &numcenters);
    -  totcount= qh_printvdiagram2(qh, NULL, NULL, vertices, innerouter, False);
    -  qh_fprintf(qh, fp, 9231, "%d\n", totcount);
    -  totcount= qh_printvdiagram2(qh, fp, printvridge, vertices, innerouter, True /* inorder*/);
    -  qh_settempfree(qh, &vertices);
    -#if 0  /* for testing qh_eachvoronoi_all */
    -  qh_fprintf(qh, fp, 9232, "\n");
    -  totcount= qh_eachvoronoi_all(qh, fp, printvridge, qh->UPPERdelaunay, innerouter, True /* inorder*/);
    -  qh_fprintf(qh, fp, 9233, "%d\n", totcount);
    -#endif
    -} /* printvdiagram */
    -
    -/*---------------------------------
    -
    -  qh_printvdiagram2(qh, fp, printvridge, vertices, innerouter, inorder )
    -    visit all pairs of input sites (vertices) for selected Voronoi vertices
    -    vertices may include NULLs
    -
    -  innerouter:
    -    qh_RIDGEall   print inner ridges(bounded) and outer ridges(unbounded)
    -    qh_RIDGEinner print only inner ridges
    -    qh_RIDGEouter print only outer ridges
    -
    -  inorder:
    -    print 3-d Voronoi vertices in order
    -
    -  assumes:
    -    qh_markvoronoi marked facet->visitid for Voronoi vertices
    -    all facet->seen= False
    -    all facet->seen2= True
    -
    -  returns:
    -    total number of Voronoi ridges
    -    if printvridge,
    -      calls printvridge( fp, vertex, vertexA, centers) for each ridge
    -      [see qh_eachvoronoi()]
    -
    -  see:
    -    qh_eachvoronoi_all()
    -*/
    -int qh_printvdiagram2(qhT *qh, FILE *fp, printvridgeT printvridge, setT *vertices, qh_RIDGE innerouter, boolT inorder) {
    -  int totcount= 0;
    -  int vertex_i, vertex_n;
    -  vertexT *vertex;
    -
    -  FORALLvertices
    -    vertex->seen= False;
    -  FOREACHvertex_i_(qh, vertices) {
    -    if (vertex) {
    -      if (qh->GOODvertex > 0 && qh_pointid(qh, vertex->point)+1 != qh->GOODvertex)
    -        continue;
    -      totcount += qh_eachvoronoi(qh, fp, printvridge, vertex, !qh_ALL, innerouter, inorder);
    -    }
    -  }
    -  return totcount;
    -} /* printvdiagram2 */
    -
    -/*---------------------------------
    -
    -  qh_printvertex(qh, fp, vertex )
    -    prints the information in a vertex
    -    Duplicated as operator<< [QhullVertex.cpp]
    -*/
    -void qh_printvertex(qhT *qh, FILE *fp, vertexT *vertex) {
    -  pointT *point;
    -  int k, count= 0;
    -  facetT *neighbor, **neighborp;
    -  realT r; /*bug fix*/
    -
    -  if (!vertex) {
    -    qh_fprintf(qh, fp, 9234, "  NULLvertex\n");
    -    return;
    -  }
    -  qh_fprintf(qh, fp, 9235, "- p%d(v%d):", qh_pointid(qh, vertex->point), vertex->id);
    -  point= vertex->point;
    -  if (point) {
    -    for (k=qh->hull_dim; k--; ) {
    -      r= *point++;
    -      qh_fprintf(qh, fp, 9236, " %5.2g", r);
    -    }
    -  }
    -  if (vertex->deleted)
    -    qh_fprintf(qh, fp, 9237, " deleted");
    -  if (vertex->delridge)
    -    qh_fprintf(qh, fp, 9238, " ridgedeleted");
    -  qh_fprintf(qh, fp, 9239, "\n");
    -  if (vertex->neighbors) {
    -    qh_fprintf(qh, fp, 9240, "  neighbors:");
    -    FOREACHneighbor_(vertex) {
    -      if (++count % 100 == 0)
    -        qh_fprintf(qh, fp, 9241, "\n     ");
    -      qh_fprintf(qh, fp, 9242, " f%d", neighbor->id);
    -    }
    -    qh_fprintf(qh, fp, 9243, "\n");
    -  }
    -} /* printvertex */
    -
    -
    -/*---------------------------------
    -
    -  qh_printvertexlist(qh, fp, string, facetlist, facets, printall )
    -    prints vertices used by a facetlist or facet set
    -    tests qh_skipfacet() if !printall
    -*/
    -void qh_printvertexlist(qhT *qh, FILE *fp, const char* string, facetT *facetlist,
    -                         setT *facets, boolT printall) {
    -  vertexT *vertex, **vertexp;
    -  setT *vertices;
    -
    -  vertices= qh_facetvertices(qh, facetlist, facets, printall);
    -  qh_fprintf(qh, fp, 9244, "%s", string);
    -  FOREACHvertex_(vertices)
    -    qh_printvertex(qh, fp, vertex);
    -  qh_settempfree(qh, &vertices);
    -} /* printvertexlist */
    -
    -
    -/*---------------------------------
    -
    -  qh_printvertices(qh, fp, string, vertices )
    -    prints vertices in a set
    -    duplicated as printVertexSet [QhullVertex.cpp]
    -*/
    -void qh_printvertices(qhT *qh, FILE *fp, const char* string, setT *vertices) {
    -  vertexT *vertex, **vertexp;
    -
    -  qh_fprintf(qh, fp, 9245, "%s", string);
    -  FOREACHvertex_(vertices)
    -    qh_fprintf(qh, fp, 9246, " p%d(v%d)", qh_pointid(qh, vertex->point), vertex->id);
    -  qh_fprintf(qh, fp, 9247, "\n");
    -} /* printvertices */
    -
    -/*---------------------------------
    -
    -  qh_printvneighbors(qh, fp, facetlist, facets, printall )
    -    print vertex neighbors of vertices in facetlist and facets ('FN')
    -
    -  notes:
    -    qh_countfacets clears facet->visitid for non-printed facets
    -
    -  design:
    -    collect facet count and related statistics
    -    if necessary, build neighbor sets for each vertex
    -    collect vertices in facetlist and facets
    -    build a point array for point->vertex and point->coplanar facet
    -    for each point
    -      list vertex neighbors or coplanar facet
    -*/
    -void qh_printvneighbors(qhT *qh, FILE *fp, facetT* facetlist, setT *facets, boolT printall) {
    -  int numfacets, numsimplicial, numridges, totneighbors, numneighbors, numcoplanars, numtricoplanars;
    -  setT *vertices, *vertex_points, *coplanar_points;
    -  int numpoints= qh->num_points + qh_setsize(qh, qh->other_points);
    -  vertexT *vertex, **vertexp;
    -  int vertex_i, vertex_n;
    -  facetT *facet, **facetp, *neighbor, **neighborp;
    -  pointT *point, **pointp;
    -
    -  qh_countfacets(qh, facetlist, facets, printall, &numfacets, &numsimplicial,
    -      &totneighbors, &numridges, &numcoplanars, &numtricoplanars);  /* sets facet->visitid */
    -  qh_fprintf(qh, fp, 9248, "%d\n", numpoints);
    -  qh_vertexneighbors(qh);
    -  vertices= qh_facetvertices(qh, facetlist, facets, printall);
    -  vertex_points= qh_settemp(qh, numpoints);
    -  coplanar_points= qh_settemp(qh, numpoints);
    -  qh_setzero(qh, vertex_points, 0, numpoints);
    -  qh_setzero(qh, coplanar_points, 0, numpoints);
    -  FOREACHvertex_(vertices)
    -    qh_point_add(qh, vertex_points, vertex->point, vertex);
    -  FORALLfacet_(facetlist) {
    -    FOREACHpoint_(facet->coplanarset)
    -      qh_point_add(qh, coplanar_points, point, facet);
    -  }
    -  FOREACHfacet_(facets) {
    -    FOREACHpoint_(facet->coplanarset)
    -      qh_point_add(qh, coplanar_points, point, facet);
    -  }
    -  FOREACHvertex_i_(qh, vertex_points) {
    -    if (vertex) {
    -      numneighbors= qh_setsize(qh, vertex->neighbors);
    -      qh_fprintf(qh, fp, 9249, "%d", numneighbors);
    -      if (qh->hull_dim == 3)
    -        qh_order_vertexneighbors(qh, vertex);
    -      else if (qh->hull_dim >= 4)
    -        qsort(SETaddr_(vertex->neighbors, facetT), (size_t)numneighbors,
    -             sizeof(facetT *), qh_compare_facetvisit);
    -      FOREACHneighbor_(vertex)
    -        qh_fprintf(qh, fp, 9250, " %d",
    -                 neighbor->visitid ? neighbor->visitid - 1 : 0 - neighbor->id);
    -      qh_fprintf(qh, fp, 9251, "\n");
    -    }else if ((facet= SETelemt_(coplanar_points, vertex_i, facetT)))
    -      qh_fprintf(qh, fp, 9252, "1 %d\n",
    -                  facet->visitid ? facet->visitid - 1 : 0 - facet->id);
    -    else
    -      qh_fprintf(qh, fp, 9253, "0\n");
    -  }
    -  qh_settempfree(qh, &coplanar_points);
    -  qh_settempfree(qh, &vertex_points);
    -  qh_settempfree(qh, &vertices);
    -} /* printvneighbors */
    -
    -/*---------------------------------
    -
    -  qh_printvoronoi(qh, fp, format, facetlist, facets, printall )
    -    print voronoi diagram in 'o' or 'G' format
    -    for 'o' format
    -      prints voronoi centers for each facet and for infinity
    -      for each vertex, lists ids of printed facets or infinity
    -      assumes facetlist and facets are disjoint
    -    for 'G' format
    -      prints an OFF object
    -      adds a 0 coordinate to center
    -      prints infinity but does not list in vertices
    -
    -  see:
    -    qh_printvdiagram()
    -
    -  notes:
    -    if 'o',
    -      prints a line for each point except "at-infinity"
    -    if all facets are upperdelaunay,
    -      reverses lower and upper hull
    -*/
    -void qh_printvoronoi(qhT *qh, FILE *fp, qh_PRINT format, facetT *facetlist, setT *facets, boolT printall) {
    -  int k, numcenters, numvertices= 0, numneighbors, numinf, vid=1, vertex_i, vertex_n;
    -  facetT *facet, **facetp, *neighbor, **neighborp;
    -  setT *vertices;
    -  vertexT *vertex;
    -  boolT isLower;
    -  unsigned int numfacets= (unsigned int) qh->num_facets;
    -
    -  vertices= qh_markvoronoi(qh, facetlist, facets, printall, &isLower, &numcenters);
    -  FOREACHvertex_i_(qh, vertices) {
    -    if (vertex) {
    -      numvertices++;
    -      numneighbors = numinf = 0;
    -      FOREACHneighbor_(vertex) {
    -        if (neighbor->visitid == 0)
    -          numinf= 1;
    -        else if (neighbor->visitid < numfacets)
    -          numneighbors++;
    -      }
    -      if (numinf && !numneighbors) {
    -        SETelem_(vertices, vertex_i)= NULL;
    -        numvertices--;
    -      }
    -    }
    -  }
    -  if (format == qh_PRINTgeom)
    -    qh_fprintf(qh, fp, 9254, "{appearance {+edge -face} OFF %d %d 1 # Voronoi centers and cells\n",
    -                numcenters, numvertices);
    -  else
    -    qh_fprintf(qh, fp, 9255, "%d\n%d %d 1\n", qh->hull_dim-1, numcenters, qh_setsize(qh, vertices));
    -  if (format == qh_PRINTgeom) {
    -    for (k=qh->hull_dim-1; k--; )
    -      qh_fprintf(qh, fp, 9256, qh_REAL_1, 0.0);
    -    qh_fprintf(qh, fp, 9257, " 0 # infinity not used\n");
    -  }else {
    -    for (k=qh->hull_dim-1; k--; )
    -      qh_fprintf(qh, fp, 9258, qh_REAL_1, qh_INFINITE);
    -    qh_fprintf(qh, fp, 9259, "\n");
    -  }
    -  FORALLfacet_(facetlist) {
    -    if (facet->visitid && facet->visitid < numfacets) {
    -      if (format == qh_PRINTgeom)
    -        qh_fprintf(qh, fp, 9260, "# %d f%d\n", vid++, facet->id);
    -      qh_printcenter(qh, fp, format, NULL, facet);
    -    }
    -  }
    -  FOREACHfacet_(facets) {
    -    if (facet->visitid && facet->visitid < numfacets) {
    -      if (format == qh_PRINTgeom)
    -        qh_fprintf(qh, fp, 9261, "# %d f%d\n", vid++, facet->id);
    -      qh_printcenter(qh, fp, format, NULL, facet);
    -    }
    -  }
    -  FOREACHvertex_i_(qh, vertices) {
    -    numneighbors= 0;
    -    numinf=0;
    -    if (vertex) {
    -      if (qh->hull_dim == 3)
    -        qh_order_vertexneighbors(qh, vertex);
    -      else if (qh->hull_dim >= 4)
    -        qsort(SETaddr_(vertex->neighbors, facetT),
    -             (size_t)qh_setsize(qh, vertex->neighbors),
    -             sizeof(facetT *), qh_compare_facetvisit);
    -      FOREACHneighbor_(vertex) {
    -        if (neighbor->visitid == 0)
    -          numinf= 1;
    -        else if (neighbor->visitid < numfacets)
    -          numneighbors++;
    -      }
    -    }
    -    if (format == qh_PRINTgeom) {
    -      if (vertex) {
    -        qh_fprintf(qh, fp, 9262, "%d", numneighbors);
    -        FOREACHneighbor_(vertex) {
    -          if (neighbor->visitid && neighbor->visitid < numfacets)
    -            qh_fprintf(qh, fp, 9263, " %d", neighbor->visitid);
    -        }
    -        qh_fprintf(qh, fp, 9264, " # p%d(v%d)\n", vertex_i, vertex->id);
    -      }else
    -        qh_fprintf(qh, fp, 9265, " # p%d is coplanar or isolated\n", vertex_i);
    -    }else {
    -      if (numinf)
    -        numneighbors++;
    -      qh_fprintf(qh, fp, 9266, "%d", numneighbors);
    -      if (vertex) {
    -        FOREACHneighbor_(vertex) {
    -          if (neighbor->visitid == 0) {
    -            if (numinf) {
    -              numinf= 0;
    -              qh_fprintf(qh, fp, 9267, " %d", neighbor->visitid);
    -            }
    -          }else if (neighbor->visitid < numfacets)
    -            qh_fprintf(qh, fp, 9268, " %d", neighbor->visitid);
    -        }
    -      }
    -      qh_fprintf(qh, fp, 9269, "\n");
    -    }
    -  }
    -  if (format == qh_PRINTgeom)
    -    qh_fprintf(qh, fp, 9270, "}\n");
    -  qh_settempfree(qh, &vertices);
    -} /* printvoronoi */
    -
    -/*---------------------------------
    -
    -  qh_printvnorm(qh, fp, vertex, vertexA, centers, unbounded )
    -    print one separating plane of the Voronoi diagram for a pair of input sites
    -    unbounded==True if centers includes vertex-at-infinity
    -
    -  assumes:
    -    qh_ASvoronoi and qh_vertexneighbors() already set
    -
    -  note:
    -    parameter unbounded is UNUSED by this callback
    -
    -  see:
    -    qh_printvdiagram()
    -    qh_eachvoronoi()
    -*/
    -void qh_printvnorm(qhT *qh, FILE *fp, vertexT *vertex, vertexT *vertexA, setT *centers, boolT unbounded) {
    -  pointT *normal;
    -  realT offset;
    -  int k;
    -  QHULL_UNUSED(unbounded);
    -
    -  normal= qh_detvnorm(qh, vertex, vertexA, centers, &offset);
    -  qh_fprintf(qh, fp, 9271, "%d %d %d ",
    -      2+qh->hull_dim, qh_pointid(qh, vertex->point), qh_pointid(qh, vertexA->point));
    -  for (k=0; k< qh->hull_dim-1; k++)
    -    qh_fprintf(qh, fp, 9272, qh_REAL_1, normal[k]);
    -  qh_fprintf(qh, fp, 9273, qh_REAL_1, offset);
    -  qh_fprintf(qh, fp, 9274, "\n");
    -} /* printvnorm */
    -
    -/*---------------------------------
    -
    -  qh_printvridge(qh, fp, vertex, vertexA, centers, unbounded )
    -    print one ridge of the Voronoi diagram for a pair of input sites
    -    unbounded==True if centers includes vertex-at-infinity
    -
    -  see:
    -    qh_printvdiagram()
    -
    -  notes:
    -    the user may use a different function
    -    parameter unbounded is UNUSED
    -*/
    -void qh_printvridge(qhT *qh, FILE *fp, vertexT *vertex, vertexT *vertexA, setT *centers, boolT unbounded) {
    -  facetT *facet, **facetp;
    -  QHULL_UNUSED(unbounded);
    -
    -  qh_fprintf(qh, fp, 9275, "%d %d %d", qh_setsize(qh, centers)+2,
    -       qh_pointid(qh, vertex->point), qh_pointid(qh, vertexA->point));
    -  FOREACHfacet_(centers)
    -    qh_fprintf(qh, fp, 9276, " %d", facet->visitid);
    -  qh_fprintf(qh, fp, 9277, "\n");
    -} /* printvridge */
    -
    -/*---------------------------------
    -
    -  qh_projectdim3(qh, source, destination )
    -    project 2-d 3-d or 4-d point to a 3-d point
    -    uses qh.DROPdim and qh.hull_dim
    -    source and destination may be the same
    -
    -  notes:
    -    allocate 4 elements to destination just in case
    -*/
    -void qh_projectdim3(qhT *qh, pointT *source, pointT *destination) {
    -  int i,k;
    -
    -  for (k=0, i=0; k < qh->hull_dim; k++) {
    -    if (qh->hull_dim == 4) {
    -      if (k != qh->DROPdim)
    -        destination[i++]= source[k];
    -    }else if (k == qh->DROPdim)
    -      destination[i++]= 0;
    -    else
    -      destination[i++]= source[k];
    -  }
    -  while (i < 3)
    -    destination[i++]= 0.0;
    -} /* projectdim3 */
    -
    -/*---------------------------------
    -
    -  qh_readfeasible(qh, dim, curline )
    -    read feasible point from current line and qh.fin
    -
    -  returns:
    -    number of lines read from qh.fin
    -    sets qh.feasible_point with malloc'd coordinates
    -
    -  notes:
    -    checks for qh.HALFspace
    -    assumes dim > 1
    -
    -  see:
    -    qh_setfeasible
    -*/
    -int qh_readfeasible(qhT *qh, int dim, const char *curline) {
    -  boolT isfirst= True;
    -  int linecount= 0, tokcount= 0;
    -  const char *s;
    -  char *t, firstline[qh_MAXfirst+1];
    -  coordT *coords, value;
    -
    -  if (!qh->HALFspace) {
    -    qh_fprintf(qh, qh->ferr, 6070, "qhull input error: feasible point(dim 1 coords) is only valid for halfspace intersection\n");
    -    qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -  }
    -  if (qh->feasible_string)
    -    qh_fprintf(qh, qh->ferr, 7057, "qhull input warning: feasible point(dim 1 coords) overrides 'Hn,n,n' feasible point for halfspace intersection\n");
    -  if (!(qh->feasible_point= (coordT*)qh_malloc(dim* sizeof(coordT)))) {
    -    qh_fprintf(qh, qh->ferr, 6071, "qhull error: insufficient memory for feasible point\n");
    -    qh_errexit(qh, qh_ERRmem, NULL, NULL);
    -  }
    -  coords= qh->feasible_point;
    -  while ((s= (isfirst ?  curline : fgets(firstline, qh_MAXfirst, qh->fin)))) {
    -    if (isfirst)
    -      isfirst= False;
    -    else
    -      linecount++;
    -    while (*s) {
    -      while (isspace(*s))
    -        s++;
    -      value= qh_strtod(s, &t);
    -      if (s == t)
    -        break;
    -      s= t;
    -      *(coords++)= value;
    -      if (++tokcount == dim) {
    -        while (isspace(*s))
    -          s++;
    -        qh_strtod(s, &t);
    -        if (s != t) {
    -          qh_fprintf(qh, qh->ferr, 6072, "qhull input error: coordinates for feasible point do not finish out the line: %s\n",
    -               s);
    -          qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -        }
    -        return linecount;
    -      }
    -    }
    -  }
    -  qh_fprintf(qh, qh->ferr, 6073, "qhull input error: only %d coordinates.  Could not read %d-d feasible point.\n",
    -           tokcount, dim);
    -  qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -  return 0;
    -} /* readfeasible */
    -
    -/*---------------------------------
    -
    -  qh_readpoints(qh, numpoints, dimension, ismalloc )
    -    read points from qh.fin into qh.first_point, qh.num_points
    -    qh.fin is lines of coordinates, one per vertex, first line number of points
    -    if 'rbox D4',
    -      gives message
    -    if qh.ATinfinity,
    -      adds point-at-infinity for Delaunay triangulations
    -
    -  returns:
    -    number of points, array of point coordinates, dimension, ismalloc True
    -    if qh.DELAUNAY & !qh.PROJECTinput, projects points to paraboloid
    -        and clears qh.PROJECTdelaunay
    -    if qh.HALFspace, reads optional feasible point, reads halfspaces,
    -        converts to dual.
    -
    -  for feasible point in "cdd format" in 3-d:
    -    3 1
    -    coordinates
    -    comments
    -    begin
    -    n 4 real/integer
    -    ...
    -    end
    -
    -  notes:
    -    dimension will change in qh_initqhull_globals if qh.PROJECTinput
    -    uses malloc() since qh_mem not initialized
    -    FIXUP QH11012: qh_readpoints needs rewriting, too long
    -*/
    -coordT *qh_readpoints(qhT *qh, int *numpoints, int *dimension, boolT *ismalloc) {
    -  coordT *points, *coords, *infinity= NULL;
    -  realT paraboloid, maxboloid= -REALmax, value;
    -  realT *coordp= NULL, *offsetp= NULL, *normalp= NULL;
    -  char *s= 0, *t, firstline[qh_MAXfirst+1];
    -  int diminput=0, numinput=0, dimfeasible= 0, newnum, k, tempi;
    -  int firsttext=0, firstshort=0, firstlong=0, firstpoint=0;
    -  int tokcount= 0, linecount=0, maxcount, coordcount=0;
    -  boolT islong, isfirst= True, wasbegin= False;
    -  boolT isdelaunay= qh->DELAUNAY && !qh->PROJECTinput;
    -
    -  if (qh->CDDinput) {
    -    while ((s= fgets(firstline, qh_MAXfirst, qh->fin))) {
    -      linecount++;
    -      if (qh->HALFspace && linecount == 1 && isdigit(*s)) {
    -        dimfeasible= qh_strtol(s, &s);
    -        while (isspace(*s))
    -          s++;
    -        if (qh_strtol(s, &s) == 1)
    -          linecount += qh_readfeasible(qh, dimfeasible, s);
    -        else
    -          dimfeasible= 0;
    -      }else if (!memcmp(firstline, "begin", (size_t)5) || !memcmp(firstline, "BEGIN", (size_t)5))
    -        break;
    -      else if (!*qh->rbox_command)
    -        strncat(qh->rbox_command, s, sizeof(qh->rbox_command)-1);
    -    }
    -    if (!s) {
    -      qh_fprintf(qh, qh->ferr, 6074, "qhull input error: missing \"begin\" for cdd-formated input\n");
    -      qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -    }
    -  }
    -  while (!numinput && (s= fgets(firstline, qh_MAXfirst, qh->fin))) {
    -    linecount++;
    -    if (!memcmp(s, "begin", (size_t)5) || !memcmp(s, "BEGIN", (size_t)5))
    -      wasbegin= True;
    -    while (*s) {
    -      while (isspace(*s))
    -        s++;
    -      if (!*s)
    -        break;
    -      if (!isdigit(*s)) {
    -        if (!*qh->rbox_command) {
    -          strncat(qh->rbox_command, s, sizeof(qh->rbox_command)-1);
    -          firsttext= linecount;
    -        }
    -        break;
    -      }
    -      if (!diminput)
    -        diminput= qh_strtol(s, &s);
    -      else {
    -        numinput= qh_strtol(s, &s);
    -        if (numinput == 1 && diminput >= 2 && qh->HALFspace && !qh->CDDinput) {
    -          linecount += qh_readfeasible(qh, diminput, s); /* checks if ok */
    -          dimfeasible= diminput;
    -          diminput= numinput= 0;
    -        }else
    -          break;
    -      }
    -    }
    -  }
    -  if (!s) {
    -    qh_fprintf(qh, qh->ferr, 6075, "qhull input error: short input file.  Did not find dimension and number of points\n");
    -    qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -  }
    -  if (diminput > numinput) {
    -    tempi= diminput;    /* exchange dim and n, e.g., for cdd input format */
    -    diminput= numinput;
    -    numinput= tempi;
    -  }
    -  if (diminput < 2) {
    -    qh_fprintf(qh, qh->ferr, 6220,"qhull input error: dimension %d(first number) should be at least 2\n",
    -            diminput);
    -    qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -  }
    -  if (isdelaunay) {
    -    qh->PROJECTdelaunay= False;
    -    if (qh->CDDinput)
    -      *dimension= diminput;
    -    else
    -      *dimension= diminput+1;
    -    *numpoints= numinput;
    -    if (qh->ATinfinity)
    -      (*numpoints)++;
    -  }else if (qh->HALFspace) {
    -    *dimension= diminput - 1;
    -    *numpoints= numinput;
    -    if (diminput < 3) {
    -      qh_fprintf(qh, qh->ferr, 6221,"qhull input error: dimension %d(first number, includes offset) should be at least 3 for halfspaces\n",
    -            diminput);
    -      qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -    }
    -    if (dimfeasible) {
    -      if (dimfeasible != *dimension) {
    -        qh_fprintf(qh, qh->ferr, 6222,"qhull input error: dimension %d of feasible point is not one less than dimension %d for halfspaces\n",
    -          dimfeasible, diminput);
    -        qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -      }
    -    }else
    -      qh_setfeasible(qh, *dimension);
    -  }else {
    -    if (qh->CDDinput)
    -      *dimension= diminput-1;
    -    else
    -      *dimension= diminput;
    -    *numpoints= numinput;
    -  }
    -  qh->normal_size= *dimension * sizeof(coordT); /* for tracing with qh_printpoint */
    -  if (qh->HALFspace) {
    -    qh->half_space= coordp= (coordT*)qh_malloc(qh->normal_size + sizeof(coordT));
    -    if (qh->CDDinput) {
    -      offsetp= qh->half_space;
    -      normalp= offsetp + 1;
    -    }else {
    -      normalp= qh->half_space;
    -      offsetp= normalp + *dimension;
    -    }
    -  }
    -  qh->maxline= diminput * (qh_REALdigits + 5);
    -  maximize_(qh->maxline, 500);
    -  qh->line= (char*)qh_malloc((qh->maxline+1) * sizeof(char));
    -  *ismalloc= True;  /* use malloc since memory not setup */
    -  coords= points= qh->temp_malloc=  /* numinput and diminput >=2 by QH6220 */
    -        (coordT*)qh_malloc((*numpoints)*(*dimension)*sizeof(coordT));
    -  if (!coords || !qh->line || (qh->HALFspace && !qh->half_space)) {
    -    qh_fprintf(qh, qh->ferr, 6076, "qhull error: insufficient memory to read %d points\n",
    -            numinput);
    -    qh_errexit(qh, qh_ERRmem, NULL, NULL);
    -  }
    -  if (isdelaunay && qh->ATinfinity) {
    -    infinity= points + numinput * (*dimension);
    -    for (k= (*dimension) - 1; k--; )
    -      infinity[k]= 0.0;
    -  }
    -  maxcount= numinput * diminput;
    -  paraboloid= 0.0;
    -  while ((s= (isfirst ?  s : fgets(qh->line, qh->maxline, qh->fin)))) {
    -    if (!isfirst) {
    -      linecount++;
    -      if (*s == 'e' || *s == 'E') {
    -        if (!memcmp(s, "end", (size_t)3) || !memcmp(s, "END", (size_t)3)) {
    -          if (qh->CDDinput )
    -            break;
    -          else if (wasbegin)
    -            qh_fprintf(qh, qh->ferr, 7058, "qhull input warning: the input appears to be in cdd format.  If so, use 'Fd'\n");
    -        }
    -      }
    -    }
    -    islong= False;
    -    while (*s) {
    -      while (isspace(*s))
    -        s++;
    -      value= qh_strtod(s, &t);
    -      if (s == t) {
    -        if (!*qh->rbox_command)
    -         strncat(qh->rbox_command, s, sizeof(qh->rbox_command)-1);
    -        if (*s && !firsttext)
    -          firsttext= linecount;
    -        if (!islong && !firstshort && coordcount)
    -          firstshort= linecount;
    -        break;
    -      }
    -      if (!firstpoint)
    -        firstpoint= linecount;
    -      s= t;
    -      if (++tokcount > maxcount)
    -        continue;
    -      if (qh->HALFspace) {
    -        if (qh->CDDinput)
    -          *(coordp++)= -value; /* both coefficients and offset */
    -        else
    -          *(coordp++)= value;
    -      }else {
    -        *(coords++)= value;
    -        if (qh->CDDinput && !coordcount) {
    -          if (value != 1.0) {
    -            qh_fprintf(qh, qh->ferr, 6077, "qhull input error: for cdd format, point at line %d does not start with '1'\n",
    -                   linecount);
    -            qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -          }
    -          coords--;
    -        }else if (isdelaunay) {
    -          paraboloid += value * value;
    -          if (qh->ATinfinity) {
    -            if (qh->CDDinput)
    -              infinity[coordcount-1] += value;
    -            else
    -              infinity[coordcount] += value;
    -          }
    -        }
    -      }
    -      if (++coordcount == diminput) {
    -        coordcount= 0;
    -        if (isdelaunay) {
    -          *(coords++)= paraboloid;
    -          maximize_(maxboloid, paraboloid);
    -          paraboloid= 0.0;
    -        }else if (qh->HALFspace) {
    -          if (!qh_sethalfspace(qh, *dimension, coords, &coords, normalp, offsetp, qh->feasible_point)) {
    -            qh_fprintf(qh, qh->ferr, 8048, "The halfspace was on line %d\n", linecount);
    -            if (wasbegin)
    -              qh_fprintf(qh, qh->ferr, 8049, "The input appears to be in cdd format.  If so, you should use option 'Fd'\n");
    -            qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -          }
    -          coordp= qh->half_space;
    -        }
    -        while (isspace(*s))
    -          s++;
    -        if (*s) {
    -          islong= True;
    -          if (!firstlong)
    -            firstlong= linecount;
    -        }
    -      }
    -    }
    -    if (!islong && !firstshort && coordcount)
    -      firstshort= linecount;
    -    if (!isfirst && s - qh->line >= qh->maxline) {
    -      qh_fprintf(qh, qh->ferr, 6078, "qhull input error: line %d contained more than %d characters\n",
    -              linecount, (int) (s - qh->line));   /* WARN64 */
    -      qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -    }
    -    isfirst= False;
    -  }
    -  if (tokcount != maxcount) {
    -    newnum= fmin_(numinput, tokcount/diminput);
    -    qh_fprintf(qh, qh->ferr, 7073,"\
    -qhull warning: instead of %d %d-dimensional points, input contains\n\
    -%d points and %d extra coordinates.  Line %d is the first\npoint",
    -       numinput, diminput, tokcount/diminput, tokcount % diminput, firstpoint);
    -    if (firsttext)
    -      qh_fprintf(qh, qh->ferr, 8051, ", line %d is the first comment", firsttext);
    -    if (firstshort)
    -      qh_fprintf(qh, qh->ferr, 8052, ", line %d is the first short\nline", firstshort);
    -    if (firstlong)
    -      qh_fprintf(qh, qh->ferr, 8053, ", line %d is the first long line", firstlong);
    -    qh_fprintf(qh, qh->ferr, 8054, ".  Continue with %d points.\n", newnum);
    -    numinput= newnum;
    -    if (isdelaunay && qh->ATinfinity) {
    -      for (k= tokcount % diminput; k--; )
    -        infinity[k] -= *(--coords);
    -      *numpoints= newnum+1;
    -    }else {
    -      coords -= tokcount % diminput;
    -      *numpoints= newnum;
    -    }
    -  }
    -  if (isdelaunay && qh->ATinfinity) {
    -    for (k= (*dimension) -1; k--; )
    -      infinity[k] /= numinput;
    -    if (coords == infinity)
    -      coords += (*dimension) -1;
    -    else {
    -      for (k=0; k < (*dimension) -1; k++)
    -        *(coords++)= infinity[k];
    -    }
    -    *(coords++)= maxboloid * 1.1;
    -  }
    -  if (qh->rbox_command[0]) {
    -    qh->rbox_command[strlen(qh->rbox_command)-1]= '\0';
    -    if (!strcmp(qh->rbox_command, "./rbox D4"))
    -      qh_fprintf(qh, qh->ferr, 8055, "\n\
    -This is the qhull test case.  If any errors or core dumps occur,\n\
    -recompile qhull with 'make new'.  If errors still occur, there is\n\
    -an incompatibility.  You should try a different compiler.  You can also\n\
    -change the choices in user.h.  If you discover the source of the problem,\n\
    -please send mail to qhull_bug@qhull.org.\n\
    -\n\
    -Type 'qhull' for a short list of options.\n");
    -  }
    -  qh_free(qh->line);
    -  qh->line= NULL;
    -  if (qh->half_space) {
    -    qh_free(qh->half_space);
    -    qh->half_space= NULL;
    -  }
    -  qh->temp_malloc= NULL;
    -  trace1((qh, qh->ferr, 1008,"qh_readpoints: read in %d %d-dimensional points\n",
    -          numinput, diminput));
    -  return(points);
    -} /* readpoints */
    -
    -
    -/*---------------------------------
    -
    -  qh_setfeasible(qh, dim )
    -    set qh.feasible_point from qh.feasible_string in "n,n,n" or "n n n" format
    -
    -  notes:
    -    "n,n,n" already checked by qh_initflags()
    -    see qh_readfeasible()
    -    called only once from qh_new_qhull, otherwise leaks memory
    -*/
    -void qh_setfeasible(qhT *qh, int dim) {
    -  int tokcount= 0;
    -  char *s;
    -  coordT *coords, value;
    -
    -  if (!(s= qh->feasible_string)) {
    -    qh_fprintf(qh, qh->ferr, 6223, "\
    -qhull input error: halfspace intersection needs a feasible point.\n\
    -Either prepend the input with 1 point or use 'Hn,n,n'.  See manual.\n");
    -    qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -  }
    -  if (!(qh->feasible_point= (pointT*)qh_malloc(dim * sizeof(coordT)))) {
    -    qh_fprintf(qh, qh->ferr, 6079, "qhull error: insufficient memory for 'Hn,n,n'\n");
    -    qh_errexit(qh, qh_ERRmem, NULL, NULL);
    -  }
    -  coords= qh->feasible_point;
    -  while (*s) {
    -    value= qh_strtod(s, &s);
    -    if (++tokcount > dim) {
    -      qh_fprintf(qh, qh->ferr, 7059, "qhull input warning: more coordinates for 'H%s' than dimension %d\n",
    -          qh->feasible_string, dim);
    -      break;
    -    }
    -    *(coords++)= value;
    -    if (*s)
    -      s++;
    -  }
    -  while (++tokcount <= dim)
    -    *(coords++)= 0.0;
    -} /* setfeasible */
    -
    -/*---------------------------------
    -
    -  qh_skipfacet(qh, facet )
    -    returns 'True' if this facet is not to be printed
    -
    -  notes:
    -    based on the user provided slice thresholds and 'good' specifications
    -*/
    -boolT qh_skipfacet(qhT *qh, facetT *facet) {
    -  facetT *neighbor, **neighborp;
    -
    -  if (qh->PRINTneighbors) {
    -    if (facet->good)
    -      return !qh->PRINTgood;
    -    FOREACHneighbor_(facet) {
    -      if (neighbor->good)
    -        return False;
    -    }
    -    return True;
    -  }else if (qh->PRINTgood)
    -    return !facet->good;
    -  else if (!facet->normal)
    -    return True;
    -  return(!qh_inthresholds(qh, facet->normal, NULL));
    -} /* skipfacet */
    -
    -/*---------------------------------
    -
    -  qh_skipfilename(qh, string )
    -    returns pointer to character after filename
    -
    -  notes:
    -    skips leading spaces
    -    ends with spacing or eol
    -    if starts with ' or " ends with the same, skipping \' or \"
    -    For qhull, qh_argv_to_command() only uses double quotes
    -*/
    -char *qh_skipfilename(qhT *qh, char *filename) {
    -  char *s= filename;  /* non-const due to return */
    -  char c;
    -
    -  while (*s && isspace(*s))
    -    s++;
    -  c= *s++;
    -  if (c == '\0') {
    -    qh_fprintf(qh, qh->ferr, 6204, "qhull input error: filename expected, none found.\n");
    -    qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -  }
    -  if (c == '\'' || c == '"') {
    -    while (*s !=c || s[-1] == '\\') {
    -      if (!*s) {
    -        qh_fprintf(qh, qh->ferr, 6203, "qhull input error: missing quote after filename -- %s\n", filename);
    -        qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -      }
    -      s++;
    -    }
    -    s++;
    -  }
    -  else while (*s && !isspace(*s))
    -      s++;
    -  return s;
    -} /* skipfilename */
    -
    diff --git a/src/qhull/src/libqhull_r/io_r.h b/src/qhull/src/libqhull_r/io_r.h
    deleted file mode 100644
    index 12e05ae7acc..00000000000
    --- a/src/qhull/src/libqhull_r/io_r.h
    +++ /dev/null
    @@ -1,167 +0,0 @@
    -/*
      ---------------------------------
    -
    -   io_r.h
    -   declarations of Input/Output functions
    -
    -   see README, libqhull_r.h and io_r.c
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull_r/io_r.h#3 $$Change: 2079 $
    -   $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -*/
    -
    -#ifndef qhDEFio
    -#define qhDEFio 1
    -
    -#include "libqhull_r.h"
    -
    -/*============ constants and flags ==================*/
    -
    -/*----------------------------------
    -
    -  qh_MAXfirst
    -    maximum length of first two lines of stdin
    -*/
    -#define qh_MAXfirst  200
    -
    -/*----------------------------------
    -
    -  qh_MINradius
    -    min radius for Gp and Gv, fraction of maxcoord
    -*/
    -#define qh_MINradius 0.02
    -
    -/*----------------------------------
    -
    -  qh_GEOMepsilon
    -    adjust outer planes for 'lines closer' and geomview roundoff.
    -    This prevents bleed through.
    -*/
    -#define qh_GEOMepsilon 2e-3
    -
    -/*----------------------------------
    -
    -  qh_WHITESPACE
    -    possible values of white space
    -*/
    -#define qh_WHITESPACE " \n\t\v\r\f"
    -
    -
    -/*----------------------------------
    -
    -  qh_RIDGE
    -    to select which ridges to print in qh_eachvoronoi
    -*/
    -typedef enum
    -{
    -    qh_RIDGEall = 0, qh_RIDGEinner, qh_RIDGEouter
    -}
    -qh_RIDGE;
    -
    -/*----------------------------------
    -
    -  printvridgeT
    -    prints results of qh_printvdiagram
    -
    -  see:
    -    qh_printvridge for an example
    -*/
    -typedef void (*printvridgeT)(qhT *qh, FILE *fp, vertexT *vertex, vertexT *vertexA, setT *centers, boolT unbounded);
    -
    -/*============== -prototypes in alphabetical order =========*/
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -void    qh_dfacet(qhT *qh, unsigned id);
    -void    qh_dvertex(qhT *qh, unsigned id);
    -int     qh_compare_facetarea(const void *p1, const void *p2);
    -int     qh_compare_facetmerge(const void *p1, const void *p2);
    -int     qh_compare_facetvisit(const void *p1, const void *p2);
    -/* int  qh_compare_vertexpoint(const void *p1, const void *p2); Not useable since it depends on qh */
    -void    qh_copyfilename(qhT *qh, char *filename, int size, const char* source, int length);
    -void    qh_countfacets(qhT *qh, facetT *facetlist, setT *facets, boolT printall,
    -              int *numfacetsp, int *numsimplicialp, int *totneighborsp,
    -              int *numridgesp, int *numcoplanarsp, int *numnumtricoplanarsp);
    -pointT *qh_detvnorm(qhT *qh, vertexT *vertex, vertexT *vertexA, setT *centers, realT *offsetp);
    -setT   *qh_detvridge(qhT *qh, vertexT *vertex);
    -setT   *qh_detvridge3(qhT *qh, vertexT *atvertex, vertexT *vertex);
    -int     qh_eachvoronoi(qhT *qh, FILE *fp, printvridgeT printvridge, vertexT *atvertex, boolT visitall, qh_RIDGE innerouter, boolT inorder);
    -int     qh_eachvoronoi_all(qhT *qh, FILE *fp, printvridgeT printvridge, boolT isUpper, qh_RIDGE innerouter, boolT inorder);
    -void    qh_facet2point(qhT *qh, facetT *facet, pointT **point0, pointT **point1, realT *mindist);
    -setT   *qh_facetvertices(qhT *qh, facetT *facetlist, setT *facets, boolT allfacets);
    -void    qh_geomplanes(qhT *qh, facetT *facet, realT *outerplane, realT *innerplane);
    -void    qh_markkeep(qhT *qh, facetT *facetlist);
    -setT   *qh_markvoronoi(qhT *qh, facetT *facetlist, setT *facets, boolT printall, boolT *isLowerp, int *numcentersp);
    -void    qh_order_vertexneighbors(qhT *qh, vertexT *vertex);
    -void    qh_prepare_output(qhT *qh);
    -void    qh_printafacet(qhT *qh, FILE *fp, qh_PRINT format, facetT *facet, boolT printall);
    -void    qh_printbegin(qhT *qh, FILE *fp, qh_PRINT format, facetT *facetlist, setT *facets, boolT printall);
    -void    qh_printcenter(qhT *qh, FILE *fp, qh_PRINT format, const char *string, facetT *facet);
    -void    qh_printcentrum(qhT *qh, FILE *fp, facetT *facet, realT radius);
    -void    qh_printend(qhT *qh, FILE *fp, qh_PRINT format, facetT *facetlist, setT *facets, boolT printall);
    -void    qh_printend4geom(qhT *qh, FILE *fp, facetT *facet, int *num, boolT printall);
    -void    qh_printextremes(qhT *qh, FILE *fp, facetT *facetlist, setT *facets, boolT printall);
    -void    qh_printextremes_2d(qhT *qh, FILE *fp, facetT *facetlist, setT *facets, boolT printall);
    -void    qh_printextremes_d(qhT *qh, FILE *fp, facetT *facetlist, setT *facets, boolT printall);
    -void    qh_printfacet(qhT *qh, FILE *fp, facetT *facet);
    -void    qh_printfacet2math(qhT *qh, FILE *fp, facetT *facet, qh_PRINT format, int notfirst);
    -void    qh_printfacet2geom(qhT *qh, FILE *fp, facetT *facet, realT color[3]);
    -void    qh_printfacet2geom_points(qhT *qh, FILE *fp, pointT *point1, pointT *point2,
    -                               facetT *facet, realT offset, realT color[3]);
    -void    qh_printfacet3math(qhT *qh, FILE *fp, facetT *facet, qh_PRINT format, int notfirst);
    -void    qh_printfacet3geom_nonsimplicial(qhT *qh, FILE *fp, facetT *facet, realT color[3]);
    -void    qh_printfacet3geom_points(qhT *qh, FILE *fp, setT *points, facetT *facet, realT offset, realT color[3]);
    -void    qh_printfacet3geom_simplicial(qhT *qh, FILE *fp, facetT *facet, realT color[3]);
    -void    qh_printfacet3vertex(qhT *qh, FILE *fp, facetT *facet, qh_PRINT format);
    -void    qh_printfacet4geom_nonsimplicial(qhT *qh, FILE *fp, facetT *facet, realT color[3]);
    -void    qh_printfacet4geom_simplicial(qhT *qh, FILE *fp, facetT *facet, realT color[3]);
    -void    qh_printfacetNvertex_nonsimplicial(qhT *qh, FILE *fp, facetT *facet, int id, qh_PRINT format);
    -void    qh_printfacetNvertex_simplicial(qhT *qh, FILE *fp, facetT *facet, qh_PRINT format);
    -void    qh_printfacetheader(qhT *qh, FILE *fp, facetT *facet);
    -void    qh_printfacetridges(qhT *qh, FILE *fp, facetT *facet);
    -void    qh_printfacets(qhT *qh, FILE *fp, qh_PRINT format, facetT *facetlist, setT *facets, boolT printall);
    -void    qh_printhyperplaneintersection(qhT *qh, FILE *fp, facetT *facet1, facetT *facet2,
    -                   setT *vertices, realT color[3]);
    -void    qh_printneighborhood(qhT *qh, FILE *fp, qh_PRINT format, facetT *facetA, facetT *facetB, boolT printall);
    -void    qh_printline3geom(qhT *qh, FILE *fp, pointT *pointA, pointT *pointB, realT color[3]);
    -void    qh_printpoint(qhT *qh, FILE *fp, const char *string, pointT *point);
    -void    qh_printpointid(qhT *qh, FILE *fp, const char *string, int dim, pointT *point, int id);
    -void    qh_printpoint3(qhT *qh, FILE *fp, pointT *point);
    -void    qh_printpoints_out(qhT *qh, FILE *fp, facetT *facetlist, setT *facets, boolT printall);
    -void    qh_printpointvect(qhT *qh, FILE *fp, pointT *point, coordT *normal, pointT *center, realT radius, realT color[3]);
    -void    qh_printpointvect2(qhT *qh, FILE *fp, pointT *point, coordT *normal, pointT *center, realT radius);
    -void    qh_printridge(qhT *qh, FILE *fp, ridgeT *ridge);
    -void    qh_printspheres(qhT *qh, FILE *fp, setT *vertices, realT radius);
    -void    qh_printvdiagram(qhT *qh, FILE *fp, qh_PRINT format, facetT *facetlist, setT *facets, boolT printall);
    -int     qh_printvdiagram2(qhT *qh, FILE *fp, printvridgeT printvridge, setT *vertices, qh_RIDGE innerouter, boolT inorder);
    -void    qh_printvertex(qhT *qh, FILE *fp, vertexT *vertex);
    -void    qh_printvertexlist(qhT *qh, FILE *fp, const char* string, facetT *facetlist,
    -                         setT *facets, boolT printall);
    -void    qh_printvertices(qhT *qh, FILE *fp, const char* string, setT *vertices);
    -void    qh_printvneighbors(qhT *qh, FILE *fp, facetT* facetlist, setT *facets, boolT printall);
    -void    qh_printvoronoi(qhT *qh, FILE *fp, qh_PRINT format, facetT *facetlist, setT *facets, boolT printall);
    -void    qh_printvnorm(qhT *qh, FILE *fp, vertexT *vertex, vertexT *vertexA, setT *centers, boolT unbounded);
    -void    qh_printvridge(qhT *qh, FILE *fp, vertexT *vertex, vertexT *vertexA, setT *centers, boolT unbounded);
    -void    qh_produce_output(qhT *qh);
    -void    qh_produce_output2(qhT *qh);
    -void    qh_projectdim3(qhT *qh, pointT *source, pointT *destination);
    -int     qh_readfeasible(qhT *qh, int dim, const char *curline);
    -coordT *qh_readpoints(qhT *qh, int *numpoints, int *dimension, boolT *ismalloc);
    -void    qh_setfeasible(qhT *qh, int dim);
    -boolT   qh_skipfacet(qhT *qh, facetT *facet);
    -char   *qh_skipfilename(qhT *qh, char *filename);
    -
    -#ifdef __cplusplus
    -} /* extern "C" */
    -#endif
    -
    -#endif /* qhDEFio */
    diff --git a/src/qhull/src/libqhull_r/libqhull_r.c b/src/qhull/src/libqhull_r/libqhull_r.c
    deleted file mode 100644
    index 0fe0c980dcc..00000000000
    --- a/src/qhull/src/libqhull_r/libqhull_r.c
    +++ /dev/null
    @@ -1,1403 +0,0 @@
    -/*
      ---------------------------------
    -
    -   libqhull_r.c
    -   Quickhull algorithm for convex hulls
    -
    -   qhull() and top-level routines
    -
    -   see qh-qhull_r.htm, libqhull.h, unix_r.c
    -
    -   see qhull_ra.h for internal functions
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull_r/libqhull_r.c#2 $$Change: 2047 $
    -   $DateTime: 2016/01/04 22:03:18 $$Author: bbarber $
    -*/
    -
    -#include "qhull_ra.h"
    -
    -/*============= functions in alphabetic order after qhull() =======*/
    -
    -/*---------------------------------
    -
    -  qh_qhull(qh)
    -    compute DIM3 convex hull of qh.num_points starting at qh.first_point
    -    qh->contains all global options and variables
    -
    -  returns:
    -    returns polyhedron
    -      qh.facet_list, qh.num_facets, qh.vertex_list, qh.num_vertices,
    -
    -    returns global variables
    -      qh.hulltime, qh.max_outside, qh.interior_point, qh.max_vertex, qh.min_vertex
    -
    -    returns precision constants
    -      qh.ANGLEround, centrum_radius, cos_max, DISTround, MAXabs_coord, ONEmerge
    -
    -  notes:
    -    unless needed for output
    -      qh.max_vertex and qh.min_vertex are max/min due to merges
    -
    -  see:
    -    to add individual points to either qh.num_points
    -      use qh_addpoint()
    -
    -    if qh.GETarea
    -      qh_produceoutput() returns qh.totarea and qh.totvol via qh_getarea()
    -
    -  design:
    -    record starting time
    -    initialize hull and partition points
    -    build convex hull
    -    unless early termination
    -      update facet->maxoutside for vertices, coplanar, and near-inside points
    -    error if temporary sets exist
    -    record end time
    -*/
    -
    -void qh_qhull(qhT *qh) {
    -  int numoutside;
    -
    -  qh->hulltime= qh_CPUclock;
    -  if (qh->RERUN || qh->JOGGLEmax < REALmax/2)
    -    qh_build_withrestart(qh);
    -  else {
    -    qh_initbuild(qh);
    -    qh_buildhull(qh);
    -  }
    -  if (!qh->STOPpoint && !qh->STOPcone) {
    -    if (qh->ZEROall_ok && !qh->TESTvneighbors && qh->MERGEexact)
    -      qh_checkzero(qh, qh_ALL);
    -    if (qh->ZEROall_ok && !qh->TESTvneighbors && !qh->WAScoplanar) {
    -      trace2((qh, qh->ferr, 2055, "qh_qhull: all facets are clearly convex and no coplanar points.  Post-merging and check of maxout not needed.\n"));
    -      qh->DOcheckmax= False;
    -    }else {
    -      if (qh->MERGEexact || (qh->hull_dim > qh_DIMreduceBuild && qh->PREmerge))
    -        qh_postmerge(qh, "First post-merge", qh->premerge_centrum, qh->premerge_cos,
    -             (qh->POSTmerge ? False : qh->TESTvneighbors));
    -      else if (!qh->POSTmerge && qh->TESTvneighbors)
    -        qh_postmerge(qh, "For testing vertex neighbors", qh->premerge_centrum,
    -             qh->premerge_cos, True);
    -      if (qh->POSTmerge)
    -        qh_postmerge(qh, "For post-merging", qh->postmerge_centrum,
    -             qh->postmerge_cos, qh->TESTvneighbors);
    -      if (qh->visible_list == qh->facet_list) { /* i.e., merging done */
    -        qh->findbestnew= True;
    -        qh_partitionvisible(qh /*qh.visible_list*/, !qh_ALL, &numoutside);
    -        qh->findbestnew= False;
    -        qh_deletevisible(qh /*qh.visible_list*/);
    -        qh_resetlists(qh, False, qh_RESETvisible /*qh.visible_list newvertex_list newfacet_list */);
    -      }
    -    }
    -    if (qh->DOcheckmax){
    -      if (qh->REPORTfreq) {
    -        qh_buildtracing(qh, NULL, NULL);
    -        qh_fprintf(qh, qh->ferr, 8115, "\nTesting all coplanar points.\n");
    -      }
    -      qh_check_maxout(qh);
    -    }
    -    if (qh->KEEPnearinside && !qh->maxoutdone)
    -      qh_nearcoplanar(qh);
    -  }
    -  if (qh_setsize(qh, qh->qhmem.tempstack) != 0) {
    -    qh_fprintf(qh, qh->ferr, 6164, "qhull internal error (qh_qhull): temporary sets not empty(%d)\n",
    -             qh_setsize(qh, qh->qhmem.tempstack));
    -    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -  }
    -  qh->hulltime= qh_CPUclock - qh->hulltime;
    -  qh->QHULLfinished= True;
    -  trace1((qh, qh->ferr, 1036, "Qhull: algorithm completed\n"));
    -} /* qhull */
    -
    -/*---------------------------------
    -
    -  qh_addpoint(qh, furthest, facet, checkdist )
    -    add point (usually furthest point) above facet to hull
    -    if checkdist,
    -      check that point is above facet.
    -      if point is not outside of the hull, uses qh_partitioncoplanar()
    -      assumes that facet is defined by qh_findbestfacet()
    -    else if facet specified,
    -      assumes that point is above facet (major damage if below)
    -    for Delaunay triangulations,
    -      Use qh_setdelaunay() to lift point to paraboloid and scale by 'Qbb' if needed
    -      Do not use options 'Qbk', 'QBk', or 'QbB' since they scale the coordinates.
    -
    -  returns:
    -    returns False if user requested an early termination
    -     qh.visible_list, newfacet_list, delvertex_list, NEWfacets may be defined
    -    updates qh.facet_list, qh.num_facets, qh.vertex_list, qh.num_vertices
    -    clear qh.maxoutdone (will need to call qh_check_maxout() for facet->maxoutside)
    -    if unknown point, adds a pointer to qh.other_points
    -      do not deallocate the point's coordinates
    -
    -  notes:
    -    assumes point is near its best facet and not at a local minimum of a lens
    -      distributions.  Use qh_findbestfacet to avoid this case.
    -    uses qh.visible_list, qh.newfacet_list, qh.delvertex_list, qh.NEWfacets
    -
    -  see also:
    -    qh_triangulate() -- triangulate non-simplicial facets
    -
    -  design:
    -    add point to other_points if needed
    -    if checkdist
    -      if point not above facet
    -        partition coplanar point
    -        exit
    -    exit if pre STOPpoint requested
    -    find horizon and visible facets for point
    -    make new facets for point to horizon
    -    make hyperplanes for point
    -    compute balance statistics
    -    match neighboring new facets
    -    update vertex neighbors and delete interior vertices
    -    exit if STOPcone requested
    -    merge non-convex new facets
    -    if merge found, many merges, or 'Qf'
    -       use qh_findbestnew() instead of qh_findbest()
    -    partition outside points from visible facets
    -    delete visible facets
    -    check polyhedron if requested
    -    exit if post STOPpoint requested
    -    reset working lists of facets and vertices
    -*/
    -boolT qh_addpoint(qhT *qh, pointT *furthest, facetT *facet, boolT checkdist) {
    -  int goodvisible, goodhorizon;
    -  vertexT *vertex;
    -  facetT *newfacet;
    -  realT dist, newbalance, pbalance;
    -  boolT isoutside= False;
    -  int numpart, numpoints, numnew, firstnew;
    -
    -  qh->maxoutdone= False;
    -  if (qh_pointid(qh, furthest) == qh_IDunknown)
    -    qh_setappend(qh, &qh->other_points, furthest);
    -  if (!facet) {
    -    qh_fprintf(qh, qh->ferr, 6213, "qhull internal error (qh_addpoint): NULL facet.  Need to call qh_findbestfacet first\n");
    -    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -  }
    -  if (checkdist) {
    -    facet= qh_findbest(qh, furthest, facet, !qh_ALL, !qh_ISnewfacets, !qh_NOupper,
    -                        &dist, &isoutside, &numpart);
    -    zzadd_(Zpartition, numpart);
    -    if (!isoutside) {
    -      zinc_(Znotmax);  /* last point of outsideset is no longer furthest. */
    -      facet->notfurthest= True;
    -      qh_partitioncoplanar(qh, furthest, facet, &dist);
    -      return True;
    -    }
    -  }
    -  qh_buildtracing(qh, furthest, facet);
    -  if (qh->STOPpoint < 0 && qh->furthest_id == -qh->STOPpoint-1) {
    -    facet->notfurthest= True;
    -    return False;
    -  }
    -  qh_findhorizon(qh, furthest, facet, &goodvisible, &goodhorizon);
    -  if (qh->ONLYgood && !(goodvisible+goodhorizon) && !qh->GOODclosest) {
    -    zinc_(Znotgood);
    -    facet->notfurthest= True;
    -    /* last point of outsideset is no longer furthest.  This is ok
    -       since all points of the outside are likely to be bad */
    -    qh_resetlists(qh, False, qh_RESETvisible /*qh.visible_list newvertex_list newfacet_list */);
    -    return True;
    -  }
    -  zzinc_(Zprocessed);
    -  firstnew= qh->facet_id;
    -  vertex= qh_makenewfacets(qh, furthest /*visible_list, attaches if !ONLYgood */);
    -  qh_makenewplanes(qh /* newfacet_list */);
    -  numnew= qh->facet_id - firstnew;
    -  newbalance= numnew - (realT) (qh->num_facets-qh->num_visible)
    -                         * qh->hull_dim/qh->num_vertices;
    -  wadd_(Wnewbalance, newbalance);
    -  wadd_(Wnewbalance2, newbalance * newbalance);
    -  if (qh->ONLYgood
    -  && !qh_findgood(qh, qh->newfacet_list, goodhorizon) && !qh->GOODclosest) {
    -    FORALLnew_facets
    -      qh_delfacet(qh, newfacet);
    -    qh_delvertex(qh, vertex);
    -    qh_resetlists(qh, True, qh_RESETvisible /*qh.visible_list newvertex_list newfacet_list */);
    -    zinc_(Znotgoodnew);
    -    facet->notfurthest= True;
    -    return True;
    -  }
    -  if (qh->ONLYgood)
    -    qh_attachnewfacets(qh /*visible_list*/);
    -  qh_matchnewfacets(qh);
    -  qh_updatevertices(qh);
    -  if (qh->STOPcone && qh->furthest_id == qh->STOPcone-1) {
    -    facet->notfurthest= True;
    -    return False;  /* visible_list etc. still defined */
    -  }
    -  qh->findbestnew= False;
    -  if (qh->PREmerge || qh->MERGEexact) {
    -    qh_premerge(qh, vertex, qh->premerge_centrum, qh->premerge_cos);
    -    if (qh_USEfindbestnew)
    -      qh->findbestnew= True;
    -    else {
    -      FORALLnew_facets {
    -        if (!newfacet->simplicial) {
    -          qh->findbestnew= True;  /* use qh_findbestnew instead of qh_findbest*/
    -          break;
    -        }
    -      }
    -    }
    -  }else if (qh->BESToutside)
    -    qh->findbestnew= True;
    -  qh_partitionvisible(qh /*qh.visible_list*/, !qh_ALL, &numpoints);
    -  qh->findbestnew= False;
    -  qh->findbest_notsharp= False;
    -  zinc_(Zpbalance);
    -  pbalance= numpoints - (realT) qh->hull_dim /* assumes all points extreme */
    -                * (qh->num_points - qh->num_vertices)/qh->num_vertices;
    -  wadd_(Wpbalance, pbalance);
    -  wadd_(Wpbalance2, pbalance * pbalance);
    -  qh_deletevisible(qh /*qh.visible_list*/);
    -  zmax_(Zmaxvertex, qh->num_vertices);
    -  qh->NEWfacets= False;
    -  if (qh->IStracing >= 4) {
    -    if (qh->num_facets < 2000)
    -      qh_printlists(qh);
    -    qh_printfacetlist(qh, qh->newfacet_list, NULL, True);
    -    qh_checkpolygon(qh, qh->facet_list);
    -  }else if (qh->CHECKfrequently) {
    -    if (qh->num_facets < 50)
    -      qh_checkpolygon(qh, qh->facet_list);
    -    else
    -      qh_checkpolygon(qh, qh->newfacet_list);
    -  }
    -  if (qh->STOPpoint > 0 && qh->furthest_id == qh->STOPpoint-1)
    -    return False;
    -  qh_resetlists(qh, True, qh_RESETvisible /*qh.visible_list newvertex_list newfacet_list */);
    -  /* qh_triangulate(qh); to test qh.TRInormals */
    -  trace2((qh, qh->ferr, 2056, "qh_addpoint: added p%d new facets %d new balance %2.2g point balance %2.2g\n",
    -    qh_pointid(qh, furthest), numnew, newbalance, pbalance));
    -  return True;
    -} /* addpoint */
    -
    -/*---------------------------------
    -
    -  qh_build_withrestart(qh)
    -    allow restarts due to qh.JOGGLEmax while calling qh_buildhull()
    -       qh_errexit always undoes qh_build_withrestart()
    -    qh.FIRSTpoint/qh.NUMpoints is point array
    -       it may be moved by qh_joggleinput(qh)
    -*/
    -void qh_build_withrestart(qhT *qh) {
    -  int restart;
    -
    -  qh->ALLOWrestart= True;
    -  while (True) {
    -    restart= setjmp(qh->restartexit); /* simple statement for CRAY J916 */
    -    if (restart) {       /* only from qh_precision() */
    -      zzinc_(Zretry);
    -      wmax_(Wretrymax, qh->JOGGLEmax);
    -      /* QH7078 warns about using 'TCn' with 'QJn' */
    -      qh->STOPcone= qh_IDunknown; /* if break from joggle, prevents normal output */
    -    }
    -    if (!qh->RERUN && qh->JOGGLEmax < REALmax/2) {
    -      if (qh->build_cnt > qh_JOGGLEmaxretry) {
    -        qh_fprintf(qh, qh->ferr, 6229, "qhull precision error: %d attempts to construct a convex hull\n\
    -        with joggled input.  Increase joggle above 'QJ%2.2g'\n\
    -        or modify qh_JOGGLE... parameters in user.h\n",
    -           qh->build_cnt, qh->JOGGLEmax);
    -        qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -      }
    -      if (qh->build_cnt && !restart)
    -        break;
    -    }else if (qh->build_cnt && qh->build_cnt >= qh->RERUN)
    -      break;
    -    qh->STOPcone= 0;
    -    qh_freebuild(qh, True);  /* first call is a nop */
    -    qh->build_cnt++;
    -    if (!qh->qhull_optionsiz)
    -      qh->qhull_optionsiz= (int)strlen(qh->qhull_options);   /* WARN64 */
    -    else {
    -      qh->qhull_options [qh->qhull_optionsiz]= '\0';
    -      qh->qhull_optionlen= qh_OPTIONline;  /* starts a new line */
    -    }
    -    qh_option(qh, "_run", &qh->build_cnt, NULL);
    -    if (qh->build_cnt == qh->RERUN) {
    -      qh->IStracing= qh->TRACElastrun;  /* duplicated from qh_initqhull_globals */
    -      if (qh->TRACEpoint != qh_IDunknown || qh->TRACEdist < REALmax/2 || qh->TRACEmerge) {
    -        qh->TRACElevel= (qh->IStracing? qh->IStracing : 3);
    -        qh->IStracing= 0;
    -      }
    -      qh->qhmem.IStracing= qh->IStracing;
    -    }
    -    if (qh->JOGGLEmax < REALmax/2)
    -      qh_joggleinput(qh);
    -    qh_initbuild(qh);
    -    qh_buildhull(qh);
    -    if (qh->JOGGLEmax < REALmax/2 && !qh->MERGING)
    -      qh_checkconvex(qh, qh->facet_list, qh_ALGORITHMfault);
    -  }
    -  qh->ALLOWrestart= False;
    -} /* qh_build_withrestart */
    -
    -/*---------------------------------
    -
    -  qh_buildhull(qh)
    -    construct a convex hull by adding outside points one at a time
    -
    -  returns:
    -
    -  notes:
    -    may be called multiple times
    -    checks facet and vertex lists for incorrect flags
    -    to recover from STOPcone, call qh_deletevisible and qh_resetlists
    -
    -  design:
    -    check visible facet and newfacet flags
    -    check newlist vertex flags and qh.STOPcone/STOPpoint
    -    for each facet with a furthest outside point
    -      add point to facet
    -      exit if qh.STOPcone or qh.STOPpoint requested
    -    if qh.NARROWhull for initial simplex
    -      partition remaining outside points to coplanar sets
    -*/
    -void qh_buildhull(qhT *qh) {
    -  facetT *facet;
    -  pointT *furthest;
    -  vertexT *vertex;
    -  int id;
    -
    -  trace1((qh, qh->ferr, 1037, "qh_buildhull: start build hull\n"));
    -  FORALLfacets {
    -    if (facet->visible || facet->newfacet) {
    -      qh_fprintf(qh, qh->ferr, 6165, "qhull internal error (qh_buildhull): visible or new facet f%d in facet list\n",
    -                   facet->id);
    -      qh_errexit(qh, qh_ERRqhull, facet, NULL);
    -    }
    -  }
    -  FORALLvertices {
    -    if (vertex->newlist) {
    -      qh_fprintf(qh, qh->ferr, 6166, "qhull internal error (qh_buildhull): new vertex f%d in vertex list\n",
    -                   vertex->id);
    -      qh_errprint(qh, "ERRONEOUS", NULL, NULL, NULL, vertex);
    -      qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -    }
    -    id= qh_pointid(qh, vertex->point);
    -    if ((qh->STOPpoint>0 && id == qh->STOPpoint-1) ||
    -        (qh->STOPpoint<0 && id == -qh->STOPpoint-1) ||
    -        (qh->STOPcone>0 && id == qh->STOPcone-1)) {
    -      trace1((qh, qh->ferr, 1038,"qh_buildhull: stop point or cone P%d in initial hull\n", id));
    -      return;
    -    }
    -  }
    -  qh->facet_next= qh->facet_list;      /* advance facet when processed */
    -  while ((furthest= qh_nextfurthest(qh, &facet))) {
    -    qh->num_outside--;  /* if ONLYmax, furthest may not be outside */
    -    if (!qh_addpoint(qh, furthest, facet, qh->ONLYmax))
    -      break;
    -  }
    -  if (qh->NARROWhull) /* move points from outsideset to coplanarset */
    -    qh_outcoplanar(qh /* facet_list */ );
    -  if (qh->num_outside && !furthest) {
    -    qh_fprintf(qh, qh->ferr, 6167, "qhull internal error (qh_buildhull): %d outside points were never processed.\n", qh->num_outside);
    -    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -  }
    -  trace1((qh, qh->ferr, 1039, "qh_buildhull: completed the hull construction\n"));
    -} /* buildhull */
    -
    -
    -/*---------------------------------
    -
    -  qh_buildtracing(qh, furthest, facet )
    -    trace an iteration of qh_buildhull() for furthest point and facet
    -    if !furthest, prints progress message
    -
    -  returns:
    -    tracks progress with qh.lastreport
    -    updates qh.furthest_id (-3 if furthest is NULL)
    -    also resets visit_id, vertext_visit on wrap around
    -
    -  see:
    -    qh_tracemerging()
    -
    -  design:
    -    if !furthest
    -      print progress message
    -      exit
    -    if 'TFn' iteration
    -      print progress message
    -    else if tracing
    -      trace furthest point and facet
    -    reset qh.visit_id and qh.vertex_visit if overflow may occur
    -    set qh.furthest_id for tracing
    -*/
    -void qh_buildtracing(qhT *qh, pointT *furthest, facetT *facet) {
    -  realT dist= 0;
    -  float cpu;
    -  int total, furthestid;
    -  time_t timedata;
    -  struct tm *tp;
    -  vertexT *vertex;
    -
    -  qh->old_randomdist= qh->RANDOMdist;
    -  qh->RANDOMdist= False;
    -  if (!furthest) {
    -    time(&timedata);
    -    tp= localtime(&timedata);
    -    cpu= (float)qh_CPUclock - (float)qh->hulltime;
    -    cpu /= (float)qh_SECticks;
    -    total= zzval_(Ztotmerge) - zzval_(Zcyclehorizon) + zzval_(Zcyclefacettot);
    -    qh_fprintf(qh, qh->ferr, 8118, "\n\
    -At %02d:%02d:%02d & %2.5g CPU secs, qhull has created %d facets and merged %d.\n\
    - The current hull contains %d facets and %d vertices.  Last point was p%d\n",
    -      tp->tm_hour, tp->tm_min, tp->tm_sec, cpu, qh->facet_id -1,
    -      total, qh->num_facets, qh->num_vertices, qh->furthest_id);
    -    return;
    -  }
    -  furthestid= qh_pointid(qh, furthest);
    -  if (qh->TRACEpoint == furthestid) {
    -    qh->IStracing= qh->TRACElevel;
    -    qh->qhmem.IStracing= qh->TRACElevel;
    -  }else if (qh->TRACEpoint != qh_IDunknown && qh->TRACEdist < REALmax/2) {
    -    qh->IStracing= 0;
    -    qh->qhmem.IStracing= 0;
    -  }
    -  if (qh->REPORTfreq && (qh->facet_id-1 > qh->lastreport+qh->REPORTfreq)) {
    -    qh->lastreport= qh->facet_id-1;
    -    time(&timedata);
    -    tp= localtime(&timedata);
    -    cpu= (float)qh_CPUclock - (float)qh->hulltime;
    -    cpu /= (float)qh_SECticks;
    -    total= zzval_(Ztotmerge) - zzval_(Zcyclehorizon) + zzval_(Zcyclefacettot);
    -    zinc_(Zdistio);
    -    qh_distplane(qh, furthest, facet, &dist);
    -    qh_fprintf(qh, qh->ferr, 8119, "\n\
    -At %02d:%02d:%02d & %2.5g CPU secs, qhull has created %d facets and merged %d.\n\
    - The current hull contains %d facets and %d vertices.  There are %d\n\
    - outside points.  Next is point p%d(v%d), %2.2g above f%d.\n",
    -      tp->tm_hour, tp->tm_min, tp->tm_sec, cpu, qh->facet_id -1,
    -      total, qh->num_facets, qh->num_vertices, qh->num_outside+1,
    -      furthestid, qh->vertex_id, dist, getid_(facet));
    -  }else if (qh->IStracing >=1) {
    -    cpu= (float)qh_CPUclock - (float)qh->hulltime;
    -    cpu /= (float)qh_SECticks;
    -    qh_distplane(qh, furthest, facet, &dist);
    -    qh_fprintf(qh, qh->ferr, 8120, "qh_addpoint: add p%d(v%d) to hull of %d facets(%2.2g above f%d) and %d outside at %4.4g CPU secs.  Previous was p%d.\n",
    -      furthestid, qh->vertex_id, qh->num_facets, dist,
    -      getid_(facet), qh->num_outside+1, cpu, qh->furthest_id);
    -  }
    -  zmax_(Zvisit2max, (int)qh->visit_id/2);
    -  if (qh->visit_id > (unsigned) INT_MAX) { /* 31 bits */
    -    zinc_(Zvisit);
    -    qh->visit_id= 0;
    -    FORALLfacets
    -      facet->visitid= 0;
    -  }
    -  zmax_(Zvvisit2max, (int)qh->vertex_visit/2);
    -  if (qh->vertex_visit > (unsigned) INT_MAX) { /* 31 bits */ 
    -    zinc_(Zvvisit);
    -    qh->vertex_visit= 0;
    -    FORALLvertices
    -      vertex->visitid= 0;
    -  }
    -  qh->furthest_id= furthestid;
    -  qh->RANDOMdist= qh->old_randomdist;
    -} /* buildtracing */
    -
    -/*---------------------------------
    -
    -  qh_errexit2(qh, exitcode, facet, otherfacet )
    -    return exitcode to system after an error
    -    report two facets
    -
    -  returns:
    -    assumes exitcode non-zero
    -
    -  see:
    -    normally use qh_errexit() in user.c(reports a facet and a ridge)
    -*/
    -void qh_errexit2(qhT *qh, int exitcode, facetT *facet, facetT *otherfacet) {
    -
    -  qh_errprint(qh, "ERRONEOUS", facet, otherfacet, NULL, NULL);
    -  qh_errexit(qh, exitcode, NULL, NULL);
    -} /* errexit2 */
    -
    -
    -/*---------------------------------
    -
    -  qh_findhorizon(qh, point, facet, goodvisible, goodhorizon )
    -    given a visible facet, find the point's horizon and visible facets
    -    for all facets, !facet-visible
    -
    -  returns:
    -    returns qh.visible_list/num_visible with all visible facets
    -      marks visible facets with ->visible
    -    updates count of good visible and good horizon facets
    -    updates qh.max_outside, qh.max_vertex, facet->maxoutside
    -
    -  see:
    -    similar to qh_delpoint()
    -
    -  design:
    -    move facet to qh.visible_list at end of qh.facet_list
    -    for all visible facets
    -     for each unvisited neighbor of a visible facet
    -       compute distance of point to neighbor
    -       if point above neighbor
    -         move neighbor to end of qh.visible_list
    -       else if point is coplanar with neighbor
    -         update qh.max_outside, qh.max_vertex, neighbor->maxoutside
    -         mark neighbor coplanar (will create a samecycle later)
    -         update horizon statistics
    -*/
    -void qh_findhorizon(qhT *qh, pointT *point, facetT *facet, int *goodvisible, int *goodhorizon) {
    -  facetT *neighbor, **neighborp, *visible;
    -  int numhorizon= 0, coplanar= 0;
    -  realT dist;
    -
    -  trace1((qh, qh->ferr, 1040,"qh_findhorizon: find horizon for point p%d facet f%d\n",qh_pointid(qh, point),facet->id));
    -  *goodvisible= *goodhorizon= 0;
    -  zinc_(Ztotvisible);
    -  qh_removefacet(qh, facet);  /* visible_list at end of qh->facet_list */
    -  qh_appendfacet(qh, facet);
    -  qh->num_visible= 1;
    -  if (facet->good)
    -    (*goodvisible)++;
    -  qh->visible_list= facet;
    -  facet->visible= True;
    -  facet->f.replace= NULL;
    -  if (qh->IStracing >=4)
    -    qh_errprint(qh, "visible", facet, NULL, NULL, NULL);
    -  qh->visit_id++;
    -  FORALLvisible_facets {
    -    if (visible->tricoplanar && !qh->TRInormals) {
    -      qh_fprintf(qh, qh->ferr, 6230, "Qhull internal error (qh_findhorizon): does not work for tricoplanar facets.  Use option 'Q11'\n");
    -      qh_errexit(qh, qh_ERRqhull, visible, NULL);
    -    }
    -    visible->visitid= qh->visit_id;
    -    FOREACHneighbor_(visible) {
    -      if (neighbor->visitid == qh->visit_id)
    -        continue;
    -      neighbor->visitid= qh->visit_id;
    -      zzinc_(Znumvisibility);
    -      qh_distplane(qh, point, neighbor, &dist);
    -      if (dist > qh->MINvisible) {
    -        zinc_(Ztotvisible);
    -        qh_removefacet(qh, neighbor);  /* append to end of qh->visible_list */
    -        qh_appendfacet(qh, neighbor);
    -        neighbor->visible= True;
    -        neighbor->f.replace= NULL;
    -        qh->num_visible++;
    -        if (neighbor->good)
    -          (*goodvisible)++;
    -        if (qh->IStracing >=4)
    -          qh_errprint(qh, "visible", neighbor, NULL, NULL, NULL);
    -      }else {
    -        if (dist > - qh->MAXcoplanar) {
    -          neighbor->coplanar= True;
    -          zzinc_(Zcoplanarhorizon);
    -          qh_precision(qh, "coplanar horizon");
    -          coplanar++;
    -          if (qh->MERGING) {
    -            if (dist > 0) {
    -              maximize_(qh->max_outside, dist);
    -              maximize_(qh->max_vertex, dist);
    -#if qh_MAXoutside
    -              maximize_(neighbor->maxoutside, dist);
    -#endif
    -            }else
    -              minimize_(qh->min_vertex, dist);  /* due to merge later */
    -          }
    -          trace2((qh, qh->ferr, 2057, "qh_findhorizon: point p%d is coplanar to horizon f%d, dist=%2.7g < qh->MINvisible(%2.7g)\n",
    -              qh_pointid(qh, point), neighbor->id, dist, qh->MINvisible));
    -        }else
    -          neighbor->coplanar= False;
    -        zinc_(Ztothorizon);
    -        numhorizon++;
    -        if (neighbor->good)
    -          (*goodhorizon)++;
    -        if (qh->IStracing >=4)
    -          qh_errprint(qh, "horizon", neighbor, NULL, NULL, NULL);
    -      }
    -    }
    -  }
    -  if (!numhorizon) {
    -    qh_precision(qh, "empty horizon");
    -    qh_fprintf(qh, qh->ferr, 6168, "qhull precision error (qh_findhorizon): empty horizon\n\
    -QhullPoint p%d was above all facets.\n", qh_pointid(qh, point));
    -    qh_printfacetlist(qh, qh->facet_list, NULL, True);
    -    qh_errexit(qh, qh_ERRprec, NULL, NULL);
    -  }
    -  trace1((qh, qh->ferr, 1041, "qh_findhorizon: %d horizon facets(good %d), %d visible(good %d), %d coplanar\n",
    -       numhorizon, *goodhorizon, qh->num_visible, *goodvisible, coplanar));
    -  if (qh->IStracing >= 4 && qh->num_facets < 50)
    -    qh_printlists(qh);
    -} /* findhorizon */
    -
    -/*---------------------------------
    -
    -  qh_nextfurthest(qh, visible )
    -    returns next furthest point and visible facet for qh_addpoint()
    -    starts search at qh.facet_next
    -
    -  returns:
    -    removes furthest point from outside set
    -    NULL if none available
    -    advances qh.facet_next over facets with empty outside sets
    -
    -  design:
    -    for each facet from qh.facet_next
    -      if empty outside set
    -        advance qh.facet_next
    -      else if qh.NARROWhull
    -        determine furthest outside point
    -        if furthest point is not outside
    -          advance qh.facet_next(point will be coplanar)
    -    remove furthest point from outside set
    -*/
    -pointT *qh_nextfurthest(qhT *qh, facetT **visible) {
    -  facetT *facet;
    -  int size, idx;
    -  realT randr, dist;
    -  pointT *furthest;
    -
    -  while ((facet= qh->facet_next) != qh->facet_tail) {
    -    if (!facet->outsideset) {
    -      qh->facet_next= facet->next;
    -      continue;
    -    }
    -    SETreturnsize_(facet->outsideset, size);
    -    if (!size) {
    -      qh_setfree(qh, &facet->outsideset);
    -      qh->facet_next= facet->next;
    -      continue;
    -    }
    -    if (qh->NARROWhull) {
    -      if (facet->notfurthest)
    -        qh_furthestout(qh, facet);
    -      furthest= (pointT*)qh_setlast(facet->outsideset);
    -#if qh_COMPUTEfurthest
    -      qh_distplane(qh, furthest, facet, &dist);
    -      zinc_(Zcomputefurthest);
    -#else
    -      dist= facet->furthestdist;
    -#endif
    -      if (dist < qh->MINoutside) { /* remainder of outside set is coplanar for qh_outcoplanar */
    -        qh->facet_next= facet->next;
    -        continue;
    -      }
    -    }
    -    if (!qh->RANDOMoutside && !qh->VIRTUALmemory) {
    -      if (qh->PICKfurthest) {
    -        qh_furthestnext(qh /* qh->facet_list */);
    -        facet= qh->facet_next;
    -      }
    -      *visible= facet;
    -      return((pointT*)qh_setdellast(facet->outsideset));
    -    }
    -    if (qh->RANDOMoutside) {
    -      int outcoplanar = 0;
    -      if (qh->NARROWhull) {
    -        FORALLfacets {
    -          if (facet == qh->facet_next)
    -            break;
    -          if (facet->outsideset)
    -            outcoplanar += qh_setsize(qh, facet->outsideset);
    -        }
    -      }
    -      randr= qh_RANDOMint;
    -      randr= randr/(qh_RANDOMmax+1);
    -      idx= (int)floor((qh->num_outside - outcoplanar) * randr);
    -      FORALLfacet_(qh->facet_next) {
    -        if (facet->outsideset) {
    -          SETreturnsize_(facet->outsideset, size);
    -          if (!size)
    -            qh_setfree(qh, &facet->outsideset);
    -          else if (size > idx) {
    -            *visible= facet;
    -            return((pointT*)qh_setdelnth(qh, facet->outsideset, idx));
    -          }else
    -            idx -= size;
    -        }
    -      }
    -      qh_fprintf(qh, qh->ferr, 6169, "qhull internal error (qh_nextfurthest): num_outside %d is too low\nby at least %d, or a random real %g >= 1.0\n",
    -              qh->num_outside, idx+1, randr);
    -      qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -    }else { /* VIRTUALmemory */
    -      facet= qh->facet_tail->previous;
    -      if (!(furthest= (pointT*)qh_setdellast(facet->outsideset))) {
    -        if (facet->outsideset)
    -          qh_setfree(qh, &facet->outsideset);
    -        qh_removefacet(qh, facet);
    -        qh_prependfacet(qh, facet, &qh->facet_list);
    -        continue;
    -      }
    -      *visible= facet;
    -      return furthest;
    -    }
    -  }
    -  return NULL;
    -} /* nextfurthest */
    -
    -/*---------------------------------
    -
    -  qh_partitionall(qh, vertices, points, numpoints )
    -    partitions all points in points/numpoints to the outsidesets of facets
    -    vertices= vertices in qh.facet_list(!partitioned)
    -
    -  returns:
    -    builds facet->outsideset
    -    does not partition qh.GOODpoint
    -    if qh.ONLYgood && !qh.MERGING,
    -      does not partition qh.GOODvertex
    -
    -  notes:
    -    faster if qh.facet_list sorted by anticipated size of outside set
    -
    -  design:
    -    initialize pointset with all points
    -    remove vertices from pointset
    -    remove qh.GOODpointp from pointset (unless it's qh.STOPcone or qh.STOPpoint)
    -    for all facets
    -      for all remaining points in pointset
    -        compute distance from point to facet
    -        if point is outside facet
    -          remove point from pointset (by not reappending)
    -          update bestpoint
    -          append point or old bestpoint to facet's outside set
    -      append bestpoint to facet's outside set (furthest)
    -    for all points remaining in pointset
    -      partition point into facets' outside sets and coplanar sets
    -*/
    -void qh_partitionall(qhT *qh, setT *vertices, pointT *points, int numpoints){
    -  setT *pointset;
    -  vertexT *vertex, **vertexp;
    -  pointT *point, **pointp, *bestpoint;
    -  int size, point_i, point_n, point_end, remaining, i, id;
    -  facetT *facet;
    -  realT bestdist= -REALmax, dist, distoutside;
    -
    -  trace1((qh, qh->ferr, 1042, "qh_partitionall: partition all points into outside sets\n"));
    -  pointset= qh_settemp(qh, numpoints);
    -  qh->num_outside= 0;
    -  pointp= SETaddr_(pointset, pointT);
    -  for (i=numpoints, point= points; i--; point += qh->hull_dim)
    -    *(pointp++)= point;
    -  qh_settruncate(qh, pointset, numpoints);
    -  FOREACHvertex_(vertices) {
    -    if ((id= qh_pointid(qh, vertex->point)) >= 0)
    -      SETelem_(pointset, id)= NULL;
    -  }
    -  id= qh_pointid(qh, qh->GOODpointp);
    -  if (id >=0 && qh->STOPcone-1 != id && -qh->STOPpoint-1 != id)
    -    SETelem_(pointset, id)= NULL;
    -  if (qh->GOODvertexp && qh->ONLYgood && !qh->MERGING) { /* matches qhull()*/
    -    if ((id= qh_pointid(qh, qh->GOODvertexp)) >= 0)
    -      SETelem_(pointset, id)= NULL;
    -  }
    -  if (!qh->BESToutside) {  /* matches conditional for qh_partitionpoint below */
    -    distoutside= qh_DISToutside; /* multiple of qh.MINoutside & qh.max_outside, see user.h */
    -    zval_(Ztotpartition)= qh->num_points - qh->hull_dim - 1; /*misses GOOD... */
    -    remaining= qh->num_facets;
    -    point_end= numpoints;
    -    FORALLfacets {
    -      size= point_end/(remaining--) + 100;
    -      facet->outsideset= qh_setnew(qh, size);
    -      bestpoint= NULL;
    -      point_end= 0;
    -      FOREACHpoint_i_(qh, pointset) {
    -        if (point) {
    -          zzinc_(Zpartitionall);
    -          qh_distplane(qh, point, facet, &dist);
    -          if (dist < distoutside)
    -            SETelem_(pointset, point_end++)= point;
    -          else {
    -            qh->num_outside++;
    -            if (!bestpoint) {
    -              bestpoint= point;
    -              bestdist= dist;
    -            }else if (dist > bestdist) {
    -              qh_setappend(qh, &facet->outsideset, bestpoint);
    -              bestpoint= point;
    -              bestdist= dist;
    -            }else
    -              qh_setappend(qh, &facet->outsideset, point);
    -          }
    -        }
    -      }
    -      if (bestpoint) {
    -        qh_setappend(qh, &facet->outsideset, bestpoint);
    -#if !qh_COMPUTEfurthest
    -        facet->furthestdist= bestdist;
    -#endif
    -      }else
    -        qh_setfree(qh, &facet->outsideset);
    -      qh_settruncate(qh, pointset, point_end);
    -    }
    -  }
    -  /* if !qh->BESToutside, pointset contains points not assigned to outsideset */
    -  if (qh->BESToutside || qh->MERGING || qh->KEEPcoplanar || qh->KEEPinside) {
    -    qh->findbestnew= True;
    -    FOREACHpoint_i_(qh, pointset) {
    -      if (point)
    -        qh_partitionpoint(qh, point, qh->facet_list);
    -    }
    -    qh->findbestnew= False;
    -  }
    -  zzadd_(Zpartitionall, zzval_(Zpartition));
    -  zzval_(Zpartition)= 0;
    -  qh_settempfree(qh, &pointset);
    -  if (qh->IStracing >= 4)
    -    qh_printfacetlist(qh, qh->facet_list, NULL, True);
    -} /* partitionall */
    -
    -
    -/*---------------------------------
    -
    -  qh_partitioncoplanar(qh, point, facet, dist )
    -    partition coplanar point to a facet
    -    dist is distance from point to facet
    -    if dist NULL,
    -      searches for bestfacet and does nothing if inside
    -    if qh.findbestnew set,
    -      searches new facets instead of using qh_findbest()
    -
    -  returns:
    -    qh.max_ouside updated
    -    if qh.KEEPcoplanar or qh.KEEPinside
    -      point assigned to best coplanarset
    -
    -  notes:
    -    facet->maxoutside is updated at end by qh_check_maxout
    -
    -  design:
    -    if dist undefined
    -      find best facet for point
    -      if point sufficiently below facet (depends on qh.NEARinside and qh.KEEPinside)
    -        exit
    -    if keeping coplanar/nearinside/inside points
    -      if point is above furthest coplanar point
    -        append point to coplanar set (it is the new furthest)
    -        update qh.max_outside
    -      else
    -        append point one before end of coplanar set
    -    else if point is clearly outside of qh.max_outside and bestfacet->coplanarset
    -    and bestfacet is more than perpendicular to facet
    -      repartition the point using qh_findbest() -- it may be put on an outsideset
    -    else
    -      update qh.max_outside
    -*/
    -void qh_partitioncoplanar(qhT *qh, pointT *point, facetT *facet, realT *dist) {
    -  facetT *bestfacet;
    -  pointT *oldfurthest;
    -  realT bestdist, dist2= 0, angle;
    -  int numpart= 0, oldfindbest;
    -  boolT isoutside;
    -
    -  qh->WAScoplanar= True;
    -  if (!dist) {
    -    if (qh->findbestnew)
    -      bestfacet= qh_findbestnew(qh, point, facet, &bestdist, qh_ALL, &isoutside, &numpart);
    -    else
    -      bestfacet= qh_findbest(qh, point, facet, qh_ALL, !qh_ISnewfacets, qh->DELAUNAY,
    -                          &bestdist, &isoutside, &numpart);
    -    zinc_(Ztotpartcoplanar);
    -    zzadd_(Zpartcoplanar, numpart);
    -    if (!qh->DELAUNAY && !qh->KEEPinside) { /*  for 'd', bestdist skips upperDelaunay facets */
    -      if (qh->KEEPnearinside) {
    -        if (bestdist < -qh->NEARinside) {
    -          zinc_(Zcoplanarinside);
    -          trace4((qh, qh->ferr, 4062, "qh_partitioncoplanar: point p%d is more than near-inside facet f%d dist %2.2g findbestnew %d\n",
    -                  qh_pointid(qh, point), bestfacet->id, bestdist, qh->findbestnew));
    -          return;
    -        }
    -      }else if (bestdist < -qh->MAXcoplanar) {
    -          trace4((qh, qh->ferr, 4063, "qh_partitioncoplanar: point p%d is inside facet f%d dist %2.2g findbestnew %d\n",
    -                  qh_pointid(qh, point), bestfacet->id, bestdist, qh->findbestnew));
    -        zinc_(Zcoplanarinside);
    -        return;
    -      }
    -    }
    -  }else {
    -    bestfacet= facet;
    -    bestdist= *dist;
    -  }
    -  if (bestdist > qh->max_outside) {
    -    if (!dist && facet != bestfacet) {
    -      zinc_(Zpartangle);
    -      angle= qh_getangle(qh, facet->normal, bestfacet->normal);
    -      if (angle < 0) {
    -        /* typically due to deleted vertex and coplanar facets, e.g.,
    -             RBOX 1000 s Z1 G1e-13 t1001185205 | QHULL Tv */
    -        zinc_(Zpartflip);
    -        trace2((qh, qh->ferr, 2058, "qh_partitioncoplanar: repartition point p%d from f%d.  It is above flipped facet f%d dist %2.2g\n",
    -                qh_pointid(qh, point), facet->id, bestfacet->id, bestdist));
    -        oldfindbest= qh->findbestnew;
    -        qh->findbestnew= False;
    -        qh_partitionpoint(qh, point, bestfacet);
    -        qh->findbestnew= oldfindbest;
    -        return;
    -      }
    -    }
    -    qh->max_outside= bestdist;
    -    if (bestdist > qh->TRACEdist) {
    -      qh_fprintf(qh, qh->ferr, 8122, "qh_partitioncoplanar: ====== p%d from f%d increases max_outside to %2.2g of f%d last p%d\n",
    -                     qh_pointid(qh, point), facet->id, bestdist, bestfacet->id, qh->furthest_id);
    -      qh_errprint(qh, "DISTANT", facet, bestfacet, NULL, NULL);
    -    }
    -  }
    -  if (qh->KEEPcoplanar + qh->KEEPinside + qh->KEEPnearinside) {
    -    oldfurthest= (pointT*)qh_setlast(bestfacet->coplanarset);
    -    if (oldfurthest) {
    -      zinc_(Zcomputefurthest);
    -      qh_distplane(qh, oldfurthest, bestfacet, &dist2);
    -    }
    -    if (!oldfurthest || dist2 < bestdist)
    -      qh_setappend(qh, &bestfacet->coplanarset, point);
    -    else
    -      qh_setappend2ndlast(qh, &bestfacet->coplanarset, point);
    -  }
    -  trace4((qh, qh->ferr, 4064, "qh_partitioncoplanar: point p%d is coplanar with facet f%d(or inside) dist %2.2g\n",
    -          qh_pointid(qh, point), bestfacet->id, bestdist));
    -} /* partitioncoplanar */
    -
    -/*---------------------------------
    -
    -  qh_partitionpoint(qh, point, facet )
    -    assigns point to an outside set, coplanar set, or inside set (i.e., dropt)
    -    if qh.findbestnew
    -      uses qh_findbestnew() to search all new facets
    -    else
    -      uses qh_findbest()
    -
    -  notes:
    -    after qh_distplane(), this and qh_findbest() are most expensive in 3-d
    -
    -  design:
    -    find best facet for point
    -      (either exhaustive search of new facets or directed search from facet)
    -    if qh.NARROWhull
    -      retain coplanar and nearinside points as outside points
    -    if point is outside bestfacet
    -      if point above furthest point for bestfacet
    -        append point to outside set (it becomes the new furthest)
    -        if outside set was empty
    -          move bestfacet to end of qh.facet_list (i.e., after qh.facet_next)
    -        update bestfacet->furthestdist
    -      else
    -        append point one before end of outside set
    -    else if point is coplanar to bestfacet
    -      if keeping coplanar points or need to update qh.max_outside
    -        partition coplanar point into bestfacet
    -    else if near-inside point
    -      partition as coplanar point into bestfacet
    -    else is an inside point
    -      if keeping inside points
    -        partition as coplanar point into bestfacet
    -*/
    -void qh_partitionpoint(qhT *qh, pointT *point, facetT *facet) {
    -  realT bestdist;
    -  boolT isoutside;
    -  facetT *bestfacet;
    -  int numpart;
    -#if qh_COMPUTEfurthest
    -  realT dist;
    -#endif
    -
    -  if (qh->findbestnew)
    -    bestfacet= qh_findbestnew(qh, point, facet, &bestdist, qh->BESToutside, &isoutside, &numpart);
    -  else
    -    bestfacet= qh_findbest(qh, point, facet, qh->BESToutside, qh_ISnewfacets, !qh_NOupper,
    -                          &bestdist, &isoutside, &numpart);
    -  zinc_(Ztotpartition);
    -  zzadd_(Zpartition, numpart);
    -  if (qh->NARROWhull) {
    -    if (qh->DELAUNAY && !isoutside && bestdist >= -qh->MAXcoplanar)
    -      qh_precision(qh, "nearly incident point(narrow hull)");
    -    if (qh->KEEPnearinside) {
    -      if (bestdist >= -qh->NEARinside)
    -        isoutside= True;
    -    }else if (bestdist >= -qh->MAXcoplanar)
    -      isoutside= True;
    -  }
    -
    -  if (isoutside) {
    -    if (!bestfacet->outsideset
    -    || !qh_setlast(bestfacet->outsideset)) {
    -      qh_setappend(qh, &(bestfacet->outsideset), point);
    -      if (!bestfacet->newfacet) {
    -        qh_removefacet(qh, bestfacet);  /* make sure it's after qh->facet_next */
    -        qh_appendfacet(qh, bestfacet);
    -      }
    -#if !qh_COMPUTEfurthest
    -      bestfacet->furthestdist= bestdist;
    -#endif
    -    }else {
    -#if qh_COMPUTEfurthest
    -      zinc_(Zcomputefurthest);
    -      qh_distplane(qh, oldfurthest, bestfacet, &dist);
    -      if (dist < bestdist)
    -        qh_setappend(qh, &(bestfacet->outsideset), point);
    -      else
    -        qh_setappend2ndlast(qh, &(bestfacet->outsideset), point);
    -#else
    -      if (bestfacet->furthestdist < bestdist) {
    -        qh_setappend(qh, &(bestfacet->outsideset), point);
    -        bestfacet->furthestdist= bestdist;
    -      }else
    -        qh_setappend2ndlast(qh, &(bestfacet->outsideset), point);
    -#endif
    -    }
    -    qh->num_outside++;
    -    trace4((qh, qh->ferr, 4065, "qh_partitionpoint: point p%d is outside facet f%d new? %d (or narrowhull)\n",
    -          qh_pointid(qh, point), bestfacet->id, bestfacet->newfacet));
    -  }else if (qh->DELAUNAY || bestdist >= -qh->MAXcoplanar) { /* for 'd', bestdist skips upperDelaunay facets */
    -    zzinc_(Zcoplanarpart);
    -    if (qh->DELAUNAY)
    -      qh_precision(qh, "nearly incident point");
    -    if ((qh->KEEPcoplanar + qh->KEEPnearinside) || bestdist > qh->max_outside)
    -      qh_partitioncoplanar(qh, point, bestfacet, &bestdist);
    -    else {
    -      trace4((qh, qh->ferr, 4066, "qh_partitionpoint: point p%d is coplanar to facet f%d (dropped)\n",
    -          qh_pointid(qh, point), bestfacet->id));
    -    }
    -  }else if (qh->KEEPnearinside && bestdist > -qh->NEARinside) {
    -    zinc_(Zpartnear);
    -    qh_partitioncoplanar(qh, point, bestfacet, &bestdist);
    -  }else {
    -    zinc_(Zpartinside);
    -    trace4((qh, qh->ferr, 4067, "qh_partitionpoint: point p%d is inside all facets, closest to f%d dist %2.2g\n",
    -          qh_pointid(qh, point), bestfacet->id, bestdist));
    -    if (qh->KEEPinside)
    -      qh_partitioncoplanar(qh, point, bestfacet, &bestdist);
    -  }
    -} /* partitionpoint */
    -
    -/*---------------------------------
    -
    -  qh_partitionvisible(qh, allpoints, numoutside )
    -    partitions points in visible facets to qh.newfacet_list
    -    qh.visible_list= visible facets
    -    for visible facets
    -      1st neighbor (if any) points to a horizon facet or a new facet
    -    if allpoints(!used),
    -      repartitions coplanar points
    -
    -  returns:
    -    updates outside sets and coplanar sets of qh.newfacet_list
    -    updates qh.num_outside (count of outside points)
    -
    -  notes:
    -    qh.findbest_notsharp should be clear (extra work if set)
    -
    -  design:
    -    for all visible facets with outside set or coplanar set
    -      select a newfacet for visible facet
    -      if outside set
    -        partition outside set into new facets
    -      if coplanar set and keeping coplanar/near-inside/inside points
    -        if allpoints
    -          partition coplanar set into new facets, may be assigned outside
    -        else
    -          partition coplanar set into coplanar sets of new facets
    -    for each deleted vertex
    -      if allpoints
    -        partition vertex into new facets, may be assigned outside
    -      else
    -        partition vertex into coplanar sets of new facets
    -*/
    -void qh_partitionvisible(qhT *qh /*qh.visible_list*/, boolT allpoints, int *numoutside) {
    -  facetT *visible, *newfacet;
    -  pointT *point, **pointp;
    -  int coplanar=0, size;
    -  unsigned count;
    -  vertexT *vertex, **vertexp;
    -
    -  if (qh->ONLYmax)
    -    maximize_(qh->MINoutside, qh->max_vertex);
    -  *numoutside= 0;
    -  FORALLvisible_facets {
    -    if (!visible->outsideset && !visible->coplanarset)
    -      continue;
    -    newfacet= visible->f.replace;
    -    count= 0;
    -    while (newfacet && newfacet->visible) {
    -      newfacet= newfacet->f.replace;
    -      if (count++ > qh->facet_id)
    -        qh_infiniteloop(qh, visible);
    -    }
    -    if (!newfacet)
    -      newfacet= qh->newfacet_list;
    -    if (newfacet == qh->facet_tail) {
    -      qh_fprintf(qh, qh->ferr, 6170, "qhull precision error (qh_partitionvisible): all new facets deleted as\n        degenerate facets. Can not continue.\n");
    -      qh_errexit(qh, qh_ERRprec, NULL, NULL);
    -    }
    -    if (visible->outsideset) {
    -      size= qh_setsize(qh, visible->outsideset);
    -      *numoutside += size;
    -      qh->num_outside -= size;
    -      FOREACHpoint_(visible->outsideset)
    -        qh_partitionpoint(qh, point, newfacet);
    -    }
    -    if (visible->coplanarset && (qh->KEEPcoplanar + qh->KEEPinside + qh->KEEPnearinside)) {
    -      size= qh_setsize(qh, visible->coplanarset);
    -      coplanar += size;
    -      FOREACHpoint_(visible->coplanarset) {
    -        if (allpoints) /* not used */
    -          qh_partitionpoint(qh, point, newfacet);
    -        else
    -          qh_partitioncoplanar(qh, point, newfacet, NULL);
    -      }
    -    }
    -  }
    -  FOREACHvertex_(qh->del_vertices) {
    -    if (vertex->point) {
    -      if (allpoints) /* not used */
    -        qh_partitionpoint(qh, vertex->point, qh->newfacet_list);
    -      else
    -        qh_partitioncoplanar(qh, vertex->point, qh->newfacet_list, NULL);
    -    }
    -  }
    -  trace1((qh, qh->ferr, 1043,"qh_partitionvisible: partitioned %d points from outsidesets and %d points from coplanarsets\n", *numoutside, coplanar));
    -} /* partitionvisible */
    -
    -
    -
    -/*---------------------------------
    -
    -  qh_precision(qh, reason )
    -    restart on precision errors if not merging and if 'QJn'
    -*/
    -void qh_precision(qhT *qh, const char *reason) {
    -
    -  if (qh->ALLOWrestart && !qh->PREmerge && !qh->MERGEexact) {
    -    if (qh->JOGGLEmax < REALmax/2) {
    -      trace0((qh, qh->ferr, 26, "qh_precision: qhull restart because of %s\n", reason));
    -      /* May be called repeatedly if qh->ALLOWrestart */
    -      longjmp(qh->restartexit, qh_ERRprec);
    -    }
    -  }
    -} /* qh_precision */
    -
    -/*---------------------------------
    -
    -  qh_printsummary(qh, fp )
    -    prints summary to fp
    -
    -  notes:
    -    not in io_r.c so that user_eg.c can prevent io_r.c from loading
    -    qh_printsummary and qh_countfacets must match counts
    -
    -  design:
    -    determine number of points, vertices, and coplanar points
    -    print summary
    -*/
    -void qh_printsummary(qhT *qh, FILE *fp) {
    -  realT ratio, outerplane, innerplane;
    -  float cpu;
    -  int size, id, nummerged, numvertices, numcoplanars= 0, nonsimplicial=0;
    -  int goodused;
    -  facetT *facet;
    -  const char *s;
    -  int numdel= zzval_(Zdelvertextot);
    -  int numtricoplanars= 0;
    -
    -  size= qh->num_points + qh_setsize(qh, qh->other_points);
    -  numvertices= qh->num_vertices - qh_setsize(qh, qh->del_vertices);
    -  id= qh_pointid(qh, qh->GOODpointp);
    -  FORALLfacets {
    -    if (facet->coplanarset)
    -      numcoplanars += qh_setsize(qh, facet->coplanarset);
    -    if (facet->good) {
    -      if (facet->simplicial) {
    -        if (facet->keepcentrum && facet->tricoplanar)
    -          numtricoplanars++;
    -      }else if (qh_setsize(qh, facet->vertices) != qh->hull_dim)
    -        nonsimplicial++;
    -    }
    -  }
    -  if (id >=0 && qh->STOPcone-1 != id && -qh->STOPpoint-1 != id)
    -    size--;
    -  if (qh->STOPcone || qh->STOPpoint)
    -      qh_fprintf(qh, fp, 9288, "\nAt a premature exit due to 'TVn', 'TCn', 'TRn', or precision error with 'QJn'.");
    -  if (qh->UPPERdelaunay)
    -    goodused= qh->GOODvertex + qh->GOODpoint + qh->SPLITthresholds;
    -  else if (qh->DELAUNAY)
    -    goodused= qh->GOODvertex + qh->GOODpoint + qh->GOODthreshold;
    -  else
    -    goodused= qh->num_good;
    -  nummerged= zzval_(Ztotmerge) - zzval_(Zcyclehorizon) + zzval_(Zcyclefacettot);
    -  if (qh->VORONOI) {
    -    if (qh->UPPERdelaunay)
    -      qh_fprintf(qh, fp, 9289, "\n\
    -Furthest-site Voronoi vertices by the convex hull of %d points in %d-d:\n\n", size, qh->hull_dim);
    -    else
    -      qh_fprintf(qh, fp, 9290, "\n\
    -Voronoi diagram by the convex hull of %d points in %d-d:\n\n", size, qh->hull_dim);
    -    qh_fprintf(qh, fp, 9291, "  Number of Voronoi regions%s: %d\n",
    -              qh->ATinfinity ? " and at-infinity" : "", numvertices);
    -    if (numdel)
    -      qh_fprintf(qh, fp, 9292, "  Total number of deleted points due to merging: %d\n", numdel);
    -    if (numcoplanars - numdel > 0)
    -      qh_fprintf(qh, fp, 9293, "  Number of nearly incident points: %d\n", numcoplanars - numdel);
    -    else if (size - numvertices - numdel > 0)
    -      qh_fprintf(qh, fp, 9294, "  Total number of nearly incident points: %d\n", size - numvertices - numdel);
    -    qh_fprintf(qh, fp, 9295, "  Number of%s Voronoi vertices: %d\n",
    -              goodused ? " 'good'" : "", qh->num_good);
    -    if (nonsimplicial)
    -      qh_fprintf(qh, fp, 9296, "  Number of%s non-simplicial Voronoi vertices: %d\n",
    -              goodused ? " 'good'" : "", nonsimplicial);
    -  }else if (qh->DELAUNAY) {
    -    if (qh->UPPERdelaunay)
    -      qh_fprintf(qh, fp, 9297, "\n\
    -Furthest-site Delaunay triangulation by the convex hull of %d points in %d-d:\n\n", size, qh->hull_dim);
    -    else
    -      qh_fprintf(qh, fp, 9298, "\n\
    -Delaunay triangulation by the convex hull of %d points in %d-d:\n\n", size, qh->hull_dim);
    -    qh_fprintf(qh, fp, 9299, "  Number of input sites%s: %d\n",
    -              qh->ATinfinity ? " and at-infinity" : "", numvertices);
    -    if (numdel)
    -      qh_fprintf(qh, fp, 9300, "  Total number of deleted points due to merging: %d\n", numdel);
    -    if (numcoplanars - numdel > 0)
    -      qh_fprintf(qh, fp, 9301, "  Number of nearly incident points: %d\n", numcoplanars - numdel);
    -    else if (size - numvertices - numdel > 0)
    -      qh_fprintf(qh, fp, 9302, "  Total number of nearly incident points: %d\n", size - numvertices - numdel);
    -    qh_fprintf(qh, fp, 9303, "  Number of%s Delaunay regions: %d\n",
    -              goodused ? " 'good'" : "", qh->num_good);
    -    if (nonsimplicial)
    -      qh_fprintf(qh, fp, 9304, "  Number of%s non-simplicial Delaunay regions: %d\n",
    -              goodused ? " 'good'" : "", nonsimplicial);
    -  }else if (qh->HALFspace) {
    -    qh_fprintf(qh, fp, 9305, "\n\
    -Halfspace intersection by the convex hull of %d points in %d-d:\n\n", size, qh->hull_dim);
    -    qh_fprintf(qh, fp, 9306, "  Number of halfspaces: %d\n", size);
    -    qh_fprintf(qh, fp, 9307, "  Number of non-redundant halfspaces: %d\n", numvertices);
    -    if (numcoplanars) {
    -      if (qh->KEEPinside && qh->KEEPcoplanar)
    -        s= "similar and redundant";
    -      else if (qh->KEEPinside)
    -        s= "redundant";
    -      else
    -        s= "similar";
    -      qh_fprintf(qh, fp, 9308, "  Number of %s halfspaces: %d\n", s, numcoplanars);
    -    }
    -    qh_fprintf(qh, fp, 9309, "  Number of intersection points: %d\n", qh->num_facets - qh->num_visible);
    -    if (goodused)
    -      qh_fprintf(qh, fp, 9310, "  Number of 'good' intersection points: %d\n", qh->num_good);
    -    if (nonsimplicial)
    -      qh_fprintf(qh, fp, 9311, "  Number of%s non-simplicial intersection points: %d\n",
    -              goodused ? " 'good'" : "", nonsimplicial);
    -  }else {
    -    qh_fprintf(qh, fp, 9312, "\n\
    -Convex hull of %d points in %d-d:\n\n", size, qh->hull_dim);
    -    qh_fprintf(qh, fp, 9313, "  Number of vertices: %d\n", numvertices);
    -    if (numcoplanars) {
    -      if (qh->KEEPinside && qh->KEEPcoplanar)
    -        s= "coplanar and interior";
    -      else if (qh->KEEPinside)
    -        s= "interior";
    -      else
    -        s= "coplanar";
    -      qh_fprintf(qh, fp, 9314, "  Number of %s points: %d\n", s, numcoplanars);
    -    }
    -    qh_fprintf(qh, fp, 9315, "  Number of facets: %d\n", qh->num_facets - qh->num_visible);
    -    if (goodused)
    -      qh_fprintf(qh, fp, 9316, "  Number of 'good' facets: %d\n", qh->num_good);
    -    if (nonsimplicial)
    -      qh_fprintf(qh, fp, 9317, "  Number of%s non-simplicial facets: %d\n",
    -              goodused ? " 'good'" : "", nonsimplicial);
    -  }
    -  if (numtricoplanars)
    -      qh_fprintf(qh, fp, 9318, "  Number of triangulated facets: %d\n", numtricoplanars);
    -  qh_fprintf(qh, fp, 9319, "\nStatistics for: %s | %s",
    -                      qh->rbox_command, qh->qhull_command);
    -  if (qh->ROTATErandom != INT_MIN)
    -    qh_fprintf(qh, fp, 9320, " QR%d\n\n", qh->ROTATErandom);
    -  else
    -    qh_fprintf(qh, fp, 9321, "\n\n");
    -  qh_fprintf(qh, fp, 9322, "  Number of points processed: %d\n", zzval_(Zprocessed));
    -  qh_fprintf(qh, fp, 9323, "  Number of hyperplanes created: %d\n", zzval_(Zsetplane));
    -  if (qh->DELAUNAY)
    -    qh_fprintf(qh, fp, 9324, "  Number of facets in hull: %d\n", qh->num_facets - qh->num_visible);
    -  qh_fprintf(qh, fp, 9325, "  Number of distance tests for qhull: %d\n", zzval_(Zpartition)+
    -      zzval_(Zpartitionall)+zzval_(Znumvisibility)+zzval_(Zpartcoplanar));
    -#if 0  /* NOTE: must print before printstatistics() */
    -  {realT stddev, ave;
    -  qh_fprintf(qh, fp, 9326, "  average new facet balance: %2.2g\n",
    -          wval_(Wnewbalance)/zval_(Zprocessed));
    -  stddev= qh_stddev(zval_(Zprocessed), wval_(Wnewbalance),
    -                                 wval_(Wnewbalance2), &ave);
    -  qh_fprintf(qh, fp, 9327, "  new facet standard deviation: %2.2g\n", stddev);
    -  qh_fprintf(qh, fp, 9328, "  average partition balance: %2.2g\n",
    -          wval_(Wpbalance)/zval_(Zpbalance));
    -  stddev= qh_stddev(zval_(Zpbalance), wval_(Wpbalance),
    -                                 wval_(Wpbalance2), &ave);
    -  qh_fprintf(qh, fp, 9329, "  partition standard deviation: %2.2g\n", stddev);
    -  }
    -#endif
    -  if (nummerged) {
    -    qh_fprintf(qh, fp, 9330,"  Number of distance tests for merging: %d\n",zzval_(Zbestdist)+
    -          zzval_(Zcentrumtests)+zzval_(Zdistconvex)+zzval_(Zdistcheck)+
    -          zzval_(Zdistzero));
    -    qh_fprintf(qh, fp, 9331,"  Number of distance tests for checking: %d\n",zzval_(Zcheckpart));
    -    qh_fprintf(qh, fp, 9332,"  Number of merged facets: %d\n", nummerged);
    -  }
    -  if (!qh->RANDOMoutside && qh->QHULLfinished) {
    -    cpu= (float)qh->hulltime;
    -    cpu /= (float)qh_SECticks;
    -    wval_(Wcpu)= cpu;
    -    qh_fprintf(qh, fp, 9333, "  CPU seconds to compute hull (after input): %2.4g\n", cpu);
    -  }
    -  if (qh->RERUN) {
    -    if (!qh->PREmerge && !qh->MERGEexact)
    -      qh_fprintf(qh, fp, 9334, "  Percentage of runs with precision errors: %4.1f\n",
    -           zzval_(Zretry)*100.0/qh->build_cnt);  /* careful of order */
    -  }else if (qh->JOGGLEmax < REALmax/2) {
    -    if (zzval_(Zretry))
    -      qh_fprintf(qh, fp, 9335, "  After %d retries, input joggled by: %2.2g\n",
    -         zzval_(Zretry), qh->JOGGLEmax);
    -    else
    -      qh_fprintf(qh, fp, 9336, "  Input joggled by: %2.2g\n", qh->JOGGLEmax);
    -  }
    -  if (qh->totarea != 0.0)
    -    qh_fprintf(qh, fp, 9337, "  %s facet area:   %2.8g\n",
    -            zzval_(Ztotmerge) ? "Approximate" : "Total", qh->totarea);
    -  if (qh->totvol != 0.0)
    -    qh_fprintf(qh, fp, 9338, "  %s volume:       %2.8g\n",
    -            zzval_(Ztotmerge) ? "Approximate" : "Total", qh->totvol);
    -  if (qh->MERGING) {
    -    qh_outerinner(qh, NULL, &outerplane, &innerplane);
    -    if (outerplane > 2 * qh->DISTround) {
    -      qh_fprintf(qh, fp, 9339, "  Maximum distance of %spoint above facet: %2.2g",
    -            (qh->QHULLfinished ? "" : "merged "), outerplane);
    -      ratio= outerplane/(qh->ONEmerge + qh->DISTround);
    -      /* don't report ratio if MINoutside is large */
    -      if (ratio > 0.05 && 2* qh->ONEmerge > qh->MINoutside && qh->JOGGLEmax > REALmax/2)
    -        qh_fprintf(qh, fp, 9340, " (%.1fx)\n", ratio);
    -      else
    -        qh_fprintf(qh, fp, 9341, "\n");
    -    }
    -    if (innerplane < -2 * qh->DISTround) {
    -      qh_fprintf(qh, fp, 9342, "  Maximum distance of %svertex below facet: %2.2g",
    -            (qh->QHULLfinished ? "" : "merged "), innerplane);
    -      ratio= -innerplane/(qh->ONEmerge+qh->DISTround);
    -      if (ratio > 0.05 && qh->JOGGLEmax > REALmax/2)
    -        qh_fprintf(qh, fp, 9343, " (%.1fx)\n", ratio);
    -      else
    -        qh_fprintf(qh, fp, 9344, "\n");
    -    }
    -  }
    -  qh_fprintf(qh, fp, 9345, "\n");
    -} /* printsummary */
    -
    -
    diff --git a/src/qhull/src/libqhull_r/libqhull_r.h b/src/qhull/src/libqhull_r/libqhull_r.h
    deleted file mode 100644
    index 363e6da6a73..00000000000
    --- a/src/qhull/src/libqhull_r/libqhull_r.h
    +++ /dev/null
    @@ -1,1134 +0,0 @@
    -/*
      ---------------------------------
    -
    -   libqhull_r.h
    -   user-level header file for using qhull.a library
    -
    -   see qh-qhull_r.htm, qhull_ra.h
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull_r/libqhull_r.h#8 $$Change: 2079 $
    -   $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -
    -   includes function prototypes for libqhull_r.c, geom_r.c, global_r.c, io_r.c, user.c
    -
    -   use mem_r.h for mem_r.c
    -   use qset_r.h for qset_r.c
    -
    -   see unix_r.c for an example of using libqhull_r.h
    -
    -   recompile qhull if you change this file
    -*/
    -
    -#ifndef qhDEFlibqhull
    -#define qhDEFlibqhull 1
    -
    -/*=========================== -included files ==============*/
    -
    -/* user_r.h first for QHULL_CRTDBG */
    -#include "user_r.h"      /* user definable constants (e.g., realT). */
    -
    -#include "mem_r.h"   /* Needed for qhT in libqhull_r.h */
    -#include "qset_r.h"   /* Needed for QHULL_LIB_CHECK */
    -/* include stat_r.h after defining boolT.  statT needed for qhT in libqhull_r.h */
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#ifndef __STDC__
    -#ifndef __cplusplus
    -#if     !_MSC_VER
    -#error  Neither __STDC__ nor __cplusplus is defined.  Please use strict ANSI C or C++ to compile
    -#error  Qhull.  You may need to turn off compiler extensions in your project configuration.  If
    -#error  your compiler is a standard C compiler, you can delete this warning from libqhull_r.h
    -#endif
    -#endif
    -#endif
    -
    -/*============ constants and basic types ====================*/
    -
    -extern const char qh_version[]; /* defined in global_r.c */
    -extern const char qh_version2[]; /* defined in global_r.c */
    -
    -/*----------------------------------
    -
    -  coordT
    -    coordinates and coefficients are stored as realT (i.e., double)
    -
    -  notes:
    -    Qhull works well if realT is 'float'.  If so joggle (QJ) is not effective.
    -
    -    Could use 'float' for data and 'double' for calculations (realT vs. coordT)
    -      This requires many type casts, and adjusted error bounds.
    -      Also C compilers may do expressions in double anyway.
    -*/
    -#define coordT realT
    -
    -/*----------------------------------
    -
    -  pointT
    -    a point is an array of coordinates, usually qh.hull_dim
    -    qh_pointid returns
    -      qh_IDnone if point==0 or qh is undefined
    -      qh_IDinterior for qh.interior_point
    -      qh_IDunknown if point is neither in qh.first_point... nor qh.other_points
    -
    -  notes:
    -    qh.STOPcone and qh.STOPpoint assume that qh_IDunknown==-1 (other negative numbers indicate points)
    -    qh_IDunknown is also returned by getid_() for unknown facet, ridge, or vertex
    -*/
    -#define pointT coordT
    -typedef enum
    -{
    -    qh_IDnone = -3, qh_IDinterior = -2, qh_IDunknown = -1
    -}
    -qh_pointT;
    -
    -/*----------------------------------
    -
    -  flagT
    -    Boolean flag as a bit
    -*/
    -#define flagT unsigned int
    -
    -/*----------------------------------
    -
    -  boolT
    -    boolean value, either True or False
    -
    -  notes:
    -    needed for portability
    -    Use qh_False/qh_True as synonyms
    -*/
    -#define boolT unsigned int
    -#ifdef False
    -#undef False
    -#endif
    -#ifdef True
    -#undef True
    -#endif
    -#define False 0
    -#define True 1
    -#define qh_False 0
    -#define qh_True 1
    -
    -#include "stat_r.h"  /* needs boolT */
    -
    -/*----------------------------------
    -
    -  qh_CENTER
    -    to distinguish facet->center
    -*/
    -typedef enum
    -{
    -    qh_ASnone = 0,   /* If not MERGING and not VORONOI */
    -    qh_ASvoronoi,    /* Set by qh_clearcenters on qh_prepare_output, or if not MERGING and VORONOI */
    -    qh_AScentrum     /* If MERGING (assumed during merging) */
    -}
    -qh_CENTER;
    -
    -/*----------------------------------
    -
    -  qh_PRINT
    -    output formats for printing (qh.PRINTout).
    -    'Fa' 'FV' 'Fc' 'FC'
    -
    -
    -   notes:
    -   some of these names are similar to qhT names.  The similar names are only
    -   used in switch statements in qh_printbegin() etc.
    -*/
    -typedef enum {qh_PRINTnone= 0,
    -  qh_PRINTarea, qh_PRINTaverage,           /* 'Fa' 'FV' 'Fc' 'FC' */
    -  qh_PRINTcoplanars, qh_PRINTcentrums,
    -  qh_PRINTfacets, qh_PRINTfacets_xridge,   /* 'f' 'FF' 'G' 'FI' 'Fi' 'Fn' */
    -  qh_PRINTgeom, qh_PRINTids, qh_PRINTinner, qh_PRINTneighbors,
    -  qh_PRINTnormals, qh_PRINTouter, qh_PRINTmaple, /* 'n' 'Fo' 'i' 'm' 'Fm' 'FM', 'o' */
    -  qh_PRINTincidences, qh_PRINTmathematica, qh_PRINTmerges, qh_PRINToff,
    -  qh_PRINToptions, qh_PRINTpointintersect, /* 'FO' 'Fp' 'FP' 'p' 'FQ' 'FS' */
    -  qh_PRINTpointnearest, qh_PRINTpoints, qh_PRINTqhull, qh_PRINTsize,
    -  qh_PRINTsummary, qh_PRINTtriangles,      /* 'Fs' 'Ft' 'Fv' 'FN' 'Fx' */
    -  qh_PRINTvertices, qh_PRINTvneighbors, qh_PRINTextremes,
    -  qh_PRINTEND} qh_PRINT;
    -
    -/*----------------------------------
    -
    -  qh_ALL
    -    argument flag for selecting everything
    -*/
    -#define qh_ALL      True
    -#define qh_NOupper  True     /* argument for qh_findbest */
    -#define qh_IScheckmax  True     /* argument for qh_findbesthorizon */
    -#define qh_ISnewfacets  True     /* argument for qh_findbest */
    -#define qh_RESETvisible  True     /* argument for qh_resetlists */
    -
    -/*----------------------------------
    -
    -  qh_ERR
    -    Qhull exit codes, for indicating errors
    -    See: MSG_ERROR and MSG_WARNING [user.h]
    -*/
    -#define qh_ERRnone  0    /* no error occurred during qhull */
    -#define qh_ERRinput 1    /* input inconsistency */
    -#define qh_ERRsingular 2 /* singular input data */
    -#define qh_ERRprec  3    /* precision error */
    -#define qh_ERRmem   4    /* insufficient memory, matches mem_r.h */
    -#define qh_ERRqhull 5    /* internal error detected, matches mem_r.h */
    -
    -/*----------------------------------
    -
    -qh_FILEstderr
    -Fake stderr to distinguish error output from normal output
    -For C++ interface.  Must redefine qh_fprintf_qhull
    -*/
    -#define qh_FILEstderr ((FILE*)1)
    -
    -/* ============ -structures- ====================
    -   each of the following structures is defined by a typedef
    -   all realT and coordT fields occur at the beginning of a structure
    -        (otherwise space may be wasted due to alignment)
    -   define all flags together and pack into 32-bit number
    -
    -   DEFqhT and DEFsetT are likewise defined in
    -   mem_r.h, qset_r.h, and stat_r.h.
    -
    -*/
    -
    -typedef struct vertexT vertexT;
    -typedef struct ridgeT ridgeT;
    -typedef struct facetT facetT;
    -
    -#ifndef DEFqhT
    -#define DEFqhT 1
    -typedef struct qhT qhT;          /* defined below */
    -#endif
    -
    -#ifndef DEFsetT
    -#define DEFsetT 1
    -typedef struct setT setT;          /* defined in qset_r.h */
    -#endif
    -
    -/*----------------------------------
    -
    -  facetT
    -    defines a facet
    -
    -  notes:
    -   qhull() generates the hull as a list of facets.
    -
    -  topological information:
    -    f.previous,next     doubly-linked list of facets
    -    f.vertices          set of vertices
    -    f.ridges            set of ridges
    -    f.neighbors         set of neighbors
    -    f.toporient         True if facet has top-orientation (else bottom)
    -
    -  geometric information:
    -    f.offset,normal     hyperplane equation
    -    f.maxoutside        offset to outer plane -- all points inside
    -    f.center            centrum for testing convexity or Voronoi center for output
    -    f.simplicial        True if facet is simplicial
    -    f.flipped           True if facet does not include qh.interior_point
    -
    -  for constructing hull:
    -    f.visible           True if facet on list of visible facets (will be deleted)
    -    f.newfacet          True if facet on list of newly created facets
    -    f.coplanarset       set of points coplanar with this facet
    -                        (includes near-inside points for later testing)
    -    f.outsideset        set of points outside of this facet
    -    f.furthestdist      distance to furthest point of outside set
    -    f.visitid           marks visited facets during a loop
    -    f.replace           replacement facet for to-be-deleted, visible facets
    -    f.samecycle,newcycle cycle of facets for merging into horizon facet
    -
    -  see below for other flags and fields
    -*/
    -struct facetT {
    -#if !qh_COMPUTEfurthest
    -  coordT   furthestdist;/* distance to furthest point of outsideset */
    -#endif
    -#if qh_MAXoutside
    -  coordT   maxoutside;  /* max computed distance of point to facet
    -                        Before QHULLfinished this is an approximation
    -                        since maxdist not always set for mergefacet
    -                        Actual outer plane is +DISTround and
    -                        computed outer plane is +2*DISTround */
    -#endif
    -  coordT   offset;      /* exact offset of hyperplane from origin */
    -  coordT  *normal;      /* normal of hyperplane, hull_dim coefficients */
    -                        /*   if ->tricoplanar, shared with a neighbor */
    -  union {               /* in order of testing */
    -   realT   area;        /* area of facet, only in io_r.c if  ->isarea */
    -   facetT *replace;     /*  replacement facet if ->visible and NEWfacets
    -                             is NULL only if qh_mergedegen_redundant or interior */
    -   facetT *samecycle;   /*  cycle of facets from the same visible/horizon intersection,
    -                             if ->newfacet */
    -   facetT *newcycle;    /*  in horizon facet, current samecycle of new facets */
    -   facetT *trivisible;  /* visible facet for ->tricoplanar facets during qh_triangulate() */
    -   facetT *triowner;    /* owner facet for ->tricoplanar, !isarea facets w/ ->keepcentrum */
    -  }f;
    -  coordT  *center;      /* set according to qh.CENTERtype */
    -                        /*   qh_ASnone:    no center (not MERGING) */
    -                        /*   qh_AScentrum: centrum for testing convexity (qh_getcentrum) */
    -                        /*                 assumed qh_AScentrum while merging */
    -                        /*   qh_ASvoronoi: Voronoi center (qh_facetcenter) */
    -                        /* after constructing the hull, it may be changed (qh_clearcenter) */
    -                        /* if tricoplanar and !keepcentrum, shared with a neighbor */
    -  facetT  *previous;    /* previous facet in the facet_list */
    -  facetT  *next;        /* next facet in the facet_list */
    -  setT    *vertices;    /* vertices for this facet, inverse sorted by ID
    -                           if simplicial, 1st vertex was apex/furthest */
    -  setT    *ridges;      /* explicit ridges for nonsimplicial facets.
    -                           for simplicial facets, neighbors define the ridges */
    -  setT    *neighbors;   /* neighbors of the facet.  If simplicial, the kth
    -                           neighbor is opposite the kth vertex, and the first
    -                           neighbor is the horizon facet for the first vertex*/
    -  setT    *outsideset;  /* set of points outside this facet
    -                           if non-empty, last point is furthest
    -                           if NARROWhull, includes coplanars for partitioning*/
    -  setT    *coplanarset; /* set of points coplanar with this facet
    -                           > qh.min_vertex and <= facet->max_outside
    -                           a point is assigned to the furthest facet
    -                           if non-empty, last point is furthest away */
    -  unsigned visitid;     /* visit_id, for visiting all neighbors,
    -                           all uses are independent */
    -  unsigned id;          /* unique identifier from qh.facet_id */
    -  unsigned nummerge:9;  /* number of merges */
    -#define qh_MAXnummerge 511 /*     2^9-1, 32 flags total, see "flags:" in io_r.c */
    -  flagT    tricoplanar:1; /* True if TRIangulate and simplicial and coplanar with a neighbor */
    -                          /*   all tricoplanars share the same apex */
    -                          /*   all tricoplanars share the same ->center, ->normal, ->offset, ->maxoutside */
    -                          /*     ->keepcentrum is true for the owner.  It has the ->coplanareset */
    -                          /*   if ->degenerate, does not span facet (one logical ridge) */
    -                          /*   during qh_triangulate, f.trivisible points to original facet */
    -  flagT    newfacet:1;  /* True if facet on qh.newfacet_list (new or merged) */
    -  flagT    visible:1;   /* True if visible facet (will be deleted) */
    -  flagT    toporient:1; /* True if created with top orientation
    -                           after merging, use ridge orientation */
    -  flagT    simplicial:1;/* True if simplicial facet, ->ridges may be implicit */
    -  flagT    seen:1;      /* used to perform operations only once, like visitid */
    -  flagT    seen2:1;     /* used to perform operations only once, like visitid */
    -  flagT    flipped:1;   /* True if facet is flipped */
    -  flagT    upperdelaunay:1; /* True if facet is upper envelope of Delaunay triangulation */
    -  flagT    notfurthest:1; /* True if last point of outsideset is not furthest*/
    -
    -/*-------- flags primarily for output ---------*/
    -  flagT    good:1;      /* True if a facet marked good for output */
    -  flagT    isarea:1;    /* True if facet->f.area is defined */
    -
    -/*-------- flags for merging ------------------*/
    -  flagT    dupridge:1;  /* True if duplicate ridge in facet */
    -  flagT    mergeridge:1; /* True if facet or neighbor contains a qh_MERGEridge
    -                            ->normal defined (also defined for mergeridge2) */
    -  flagT    mergeridge2:1; /* True if neighbor contains a qh_MERGEridge (qhT *qh, mark_dupridges */
    -  flagT    coplanar:1;  /* True if horizon facet is coplanar at last use */
    -  flagT     mergehorizon:1; /* True if will merge into horizon (->coplanar) */
    -  flagT     cycledone:1;/* True if mergecycle_all already done */
    -  flagT    tested:1;    /* True if facet convexity has been tested (false after merge */
    -  flagT    keepcentrum:1; /* True if keep old centrum after a merge, or marks owner for ->tricoplanar */
    -  flagT    newmerge:1;  /* True if facet is newly merged for reducevertices */
    -  flagT    degenerate:1; /* True if facet is degenerate (degen_mergeset or ->tricoplanar) */
    -  flagT    redundant:1;  /* True if facet is redundant (degen_mergeset) */
    -};
    -
    -
    -/*----------------------------------
    -
    -  ridgeT
    -    defines a ridge
    -
    -  notes:
    -  a ridge is hull_dim-1 simplex between two neighboring facets.  If the
    -  facets are non-simplicial, there may be more than one ridge between
    -  two facets.  E.G. a 4-d hypercube has two triangles between each pair
    -  of neighboring facets.
    -
    -  topological information:
    -    vertices            a set of vertices
    -    top,bottom          neighboring facets with orientation
    -
    -  geometric information:
    -    tested              True if ridge is clearly convex
    -    nonconvex           True if ridge is non-convex
    -*/
    -struct ridgeT {
    -  setT    *vertices;    /* vertices belonging to this ridge, inverse sorted by ID
    -                           NULL if a degen ridge (matchsame) */
    -  facetT  *top;         /* top facet this ridge is part of */
    -  facetT  *bottom;      /* bottom facet this ridge is part of */
    -  unsigned id;          /* unique identifier.  Same size as vertex_id and ridge_id */
    -  flagT    seen:1;      /* used to perform operations only once */
    -  flagT    tested:1;    /* True when ridge is tested for convexity */
    -  flagT    nonconvex:1; /* True if getmergeset detected a non-convex neighbor
    -                           only one ridge between neighbors may have nonconvex */
    -};
    -
    -/*----------------------------------
    -
    -  vertexT
    -     defines a vertex
    -
    -  topological information:
    -    next,previous       doubly-linked list of all vertices
    -    neighbors           set of adjacent facets (only if qh.VERTEXneighbors)
    -
    -  geometric information:
    -    point               array of DIM3 coordinates
    -*/
    -struct vertexT {
    -  vertexT *next;        /* next vertex in vertex_list */
    -  vertexT *previous;    /* previous vertex in vertex_list */
    -  pointT  *point;       /* hull_dim coordinates (coordT) */
    -  setT    *neighbors;   /* neighboring facets of vertex, qh_vertexneighbors()
    -                           inits in io_r.c or after first merge */
    -  unsigned id;          /* unique identifier.  Same size as qh.vertex_id and qh.ridge_id */
    -  unsigned visitid;    /* for use with qh.vertex_visit, size must match */
    -  flagT    seen:1;      /* used to perform operations only once */
    -  flagT    seen2:1;     /* another seen flag */
    -  flagT    delridge:1;  /* vertex was part of a deleted ridge */
    -  flagT    deleted:1;   /* true if vertex on qh.del_vertices */
    -  flagT    newlist:1;   /* true if vertex on qh.newvertex_list */
    -};
    -
    -/*======= -global variables -qh ============================*/
    -
    -/*----------------------------------
    -
    -  qhT
    -   All global variables for qhull are in qhT.  It includes qhmemT, qhstatT, and rbox globals
    -
    -   This version of Qhull is reentrant, but it is not thread-safe.
    -
    -   Do not run separate threads on the same instance of qhT.
    -
    -   QHULL_LIB_CHECK checks that a program and the corresponding
    -   qhull library were built with the same type of header files.
    -*/
    -
    -#define QHULL_NON_REENTRANT 0
    -#define QHULL_QH_POINTER 1
    -#define QHULL_REENTRANT 2
    -
    -#define QHULL_LIB_TYPE QHULL_REENTRANT
    -
    -#define QHULL_LIB_CHECK qh_lib_check(QHULL_LIB_TYPE, sizeof(qhT), sizeof(vertexT), sizeof(ridgeT), sizeof(facetT), sizeof(setT), sizeof(qhmemT));
    -#define QHULL_LIB_CHECK_RBOX qh_lib_check(QHULL_LIB_TYPE, sizeof(qhT), sizeof(vertexT), sizeof(ridgeT), sizeof(facetT), 0, 0);
    -
    -struct qhT {
    -
    -/*----------------------------------
    -
    -  qh constants
    -    configuration flags and constants for Qhull
    -
    -  notes:
    -    The user configures Qhull by defining flags.  They are
    -    copied into qh by qh_setflags().  qh-quick_r.htm#options defines the flags.
    -*/
    -  boolT ALLpoints;        /* true 'Qs' if search all points for initial simplex */
    -  boolT ANGLEmerge;       /* true 'Qa' if sort potential merges by angle */
    -  boolT APPROXhull;       /* true 'Wn' if MINoutside set */
    -  realT   MINoutside;     /*   'Wn' min. distance for an outside point */
    -  boolT ANNOTATEoutput;   /* true 'Ta' if annotate output with message codes */
    -  boolT ATinfinity;       /* true 'Qz' if point num_points-1 is "at-infinity"
    -                             for improving precision in Delaunay triangulations */
    -  boolT AVOIDold;         /* true 'Q4' if avoid old->new merges */
    -  boolT BESToutside;      /* true 'Qf' if partition points into best outsideset */
    -  boolT CDDinput;         /* true 'Pc' if input uses CDD format (1.0/offset first) */
    -  boolT CDDoutput;        /* true 'PC' if print normals in CDD format (offset first) */
    -  boolT CHECKfrequently;  /* true 'Tc' if checking frequently */
    -  realT premerge_cos;     /*   'A-n'   cos_max when pre merging */
    -  realT postmerge_cos;    /*   'An'    cos_max when post merging */
    -  boolT DELAUNAY;         /* true 'd' if computing DELAUNAY triangulation */
    -  boolT DOintersections;  /* true 'Gh' if print hyperplane intersections */
    -  int   DROPdim;          /* drops dim 'GDn' for 4-d -> 3-d output */
    -  boolT FORCEoutput;      /* true 'Po' if forcing output despite degeneracies */
    -  int   GOODpoint;        /* 1+n for 'QGn', good facet if visible/not(-) from point n*/
    -  pointT *GOODpointp;     /*   the actual point */
    -  boolT GOODthreshold;    /* true if qh.lower_threshold/upper_threshold defined
    -                             false if qh.SPLITthreshold */
    -  int   GOODvertex;       /* 1+n, good facet if vertex for point n */
    -  pointT *GOODvertexp;     /*   the actual point */
    -  boolT HALFspace;        /* true 'Hn,n,n' if halfspace intersection */
    -  boolT ISqhullQh;        /* Set by Qhull.cpp on initialization */
    -  int   IStracing;        /* trace execution, 0=none, 1=least, 4=most, -1=events */
    -  int   KEEParea;         /* 'PAn' number of largest facets to keep */
    -  boolT KEEPcoplanar;     /* true 'Qc' if keeping nearest facet for coplanar points */
    -  boolT KEEPinside;       /* true 'Qi' if keeping nearest facet for inside points
    -                              set automatically if 'd Qc' */
    -  int   KEEPmerge;        /* 'PMn' number of facets to keep with most merges */
    -  realT KEEPminArea;      /* 'PFn' minimum facet area to keep */
    -  realT MAXcoplanar;      /* 'Un' max distance below a facet to be coplanar*/
    -  boolT MERGEexact;       /* true 'Qx' if exact merges (coplanar, degen, dupridge, flipped) */
    -  boolT MERGEindependent; /* true 'Q2' if merging independent sets */
    -  boolT MERGING;          /* true if exact-, pre- or post-merging, with angle and centrum tests */
    -  realT   premerge_centrum;  /*   'C-n' centrum_radius when pre merging.  Default is round-off */
    -  realT   postmerge_centrum; /*   'Cn' centrum_radius when post merging.  Default is round-off */
    -  boolT MERGEvertices;    /* true 'Q3' if merging redundant vertices */
    -  realT MINvisible;       /* 'Vn' min. distance for a facet to be visible */
    -  boolT NOnarrow;         /* true 'Q10' if no special processing for narrow distributions */
    -  boolT NOnearinside;     /* true 'Q8' if ignore near-inside points when partitioning */
    -  boolT NOpremerge;       /* true 'Q0' if no defaults for C-0 or Qx */
    -  boolT NOwide;           /* true 'Q12' if no error on wide merge due to duplicate ridge */
    -  boolT ONLYgood;         /* true 'Qg' if process points with good visible or horizon facets */
    -  boolT ONLYmax;          /* true 'Qm' if only process points that increase max_outside */
    -  boolT PICKfurthest;     /* true 'Q9' if process furthest of furthest points*/
    -  boolT POSTmerge;        /* true if merging after buildhull (Cn or An) */
    -  boolT PREmerge;         /* true if merging during buildhull (C-n or A-n) */
    -                        /* NOTE: some of these names are similar to qh_PRINT names */
    -  boolT PRINTcentrums;    /* true 'Gc' if printing centrums */
    -  boolT PRINTcoplanar;    /* true 'Gp' if printing coplanar points */
    -  int   PRINTdim;         /* print dimension for Geomview output */
    -  boolT PRINTdots;        /* true 'Ga' if printing all points as dots */
    -  boolT PRINTgood;        /* true 'Pg' if printing good facets */
    -  boolT PRINTinner;       /* true 'Gi' if printing inner planes */
    -  boolT PRINTneighbors;   /* true 'PG' if printing neighbors of good facets */
    -  boolT PRINTnoplanes;    /* true 'Gn' if printing no planes */
    -  boolT PRINToptions1st;  /* true 'FO' if printing options to stderr */
    -  boolT PRINTouter;       /* true 'Go' if printing outer planes */
    -  boolT PRINTprecision;   /* false 'Pp' if not reporting precision problems */
    -  qh_PRINT PRINTout[qh_PRINTEND]; /* list of output formats to print */
    -  boolT PRINTridges;      /* true 'Gr' if print ridges */
    -  boolT PRINTspheres;     /* true 'Gv' if print vertices as spheres */
    -  boolT PRINTstatistics;  /* true 'Ts' if printing statistics to stderr */
    -  boolT PRINTsummary;     /* true 's' if printing summary to stderr */
    -  boolT PRINTtransparent; /* true 'Gt' if print transparent outer ridges */
    -  boolT PROJECTdelaunay;  /* true if DELAUNAY, no readpoints() and
    -                             need projectinput() for Delaunay in qh_init_B */
    -  int   PROJECTinput;     /* number of projected dimensions 'bn:0Bn:0' */
    -  boolT QUICKhelp;        /* true if quick help message for degen input */
    -  boolT RANDOMdist;       /* true if randomly change distplane and setfacetplane */
    -  realT RANDOMfactor;     /*    maximum random perturbation */
    -  realT RANDOMa;          /*    qh_randomfactor is randr * RANDOMa + RANDOMb */
    -  realT RANDOMb;
    -  boolT RANDOMoutside;    /* true if select a random outside point */
    -  int   REPORTfreq;       /* buildtracing reports every n facets */
    -  int   REPORTfreq2;      /* tracemerging reports every REPORTfreq/2 facets */
    -  int   RERUN;            /* 'TRn' rerun qhull n times (qh.build_cnt) */
    -  int   ROTATErandom;     /* 'QRn' seed, 0 time, >= rotate input */
    -  boolT SCALEinput;       /* true 'Qbk' if scaling input */
    -  boolT SCALElast;        /* true 'Qbb' if scale last coord to max prev coord */
    -  boolT SETroundoff;      /* true 'E' if qh.DISTround is predefined */
    -  boolT SKIPcheckmax;     /* true 'Q5' if skip qh_check_maxout */
    -  boolT SKIPconvex;       /* true 'Q6' if skip convexity testing during pre-merge */
    -  boolT SPLITthresholds;  /* true if upper_/lower_threshold defines a region
    -                               used only for printing (!for qh.ONLYgood) */
    -  int   STOPcone;         /* 'TCn' 1+n for stopping after cone for point n */
    -                          /*       also used by qh_build_withresart for err exit*/
    -  int   STOPpoint;        /* 'TVn' 'TV-n' 1+n for stopping after/before(-)
    -                                        adding point n */
    -  int   TESTpoints;       /* 'QTn' num of test points after qh.num_points.  Test points always coplanar. */
    -  boolT TESTvneighbors;   /*  true 'Qv' if test vertex neighbors at end */
    -  int   TRACElevel;       /* 'Tn' conditional IStracing level */
    -  int   TRACElastrun;     /*  qh.TRACElevel applies to last qh.RERUN */
    -  int   TRACEpoint;       /* 'TPn' start tracing when point n is a vertex */
    -  realT TRACEdist;        /* 'TWn' start tracing when merge distance too big */
    -  int   TRACEmerge;       /* 'TMn' start tracing before this merge */
    -  boolT TRIangulate;      /* true 'Qt' if triangulate non-simplicial facets */
    -  boolT TRInormals;       /* true 'Q11' if triangulate duplicates ->normal and ->center (sets Qt) */
    -  boolT UPPERdelaunay;    /* true 'Qu' if computing furthest-site Delaunay */
    -  boolT USEstdout;        /* true 'Tz' if using stdout instead of stderr */
    -  boolT VERIFYoutput;     /* true 'Tv' if verify output at end of qhull */
    -  boolT VIRTUALmemory;    /* true 'Q7' if depth-first processing in buildhull */
    -  boolT VORONOI;          /* true 'v' if computing Voronoi diagram */
    -
    -  /*--------input constants ---------*/
    -  realT AREAfactor;       /* 1/(hull_dim-1)! for converting det's to area */
    -  boolT DOcheckmax;       /* true if calling qh_check_maxout (qhT *qh, qh_initqhull_globals) */
    -  char  *feasible_string;  /* feasible point 'Hn,n,n' for halfspace intersection */
    -  coordT *feasible_point;  /*    as coordinates, both malloc'd */
    -  boolT GETarea;          /* true 'Fa', 'FA', 'FS', 'PAn', 'PFn' if compute facet area/Voronoi volume in io_r.c */
    -  boolT KEEPnearinside;   /* true if near-inside points in coplanarset */
    -  int   hull_dim;         /* dimension of hull, set by initbuffers */
    -  int   input_dim;        /* dimension of input, set by initbuffers */
    -  int   num_points;       /* number of input points */
    -  pointT *first_point;    /* array of input points, see POINTSmalloc */
    -  boolT POINTSmalloc;     /*   true if qh.first_point/num_points allocated */
    -  pointT *input_points;   /* copy of original qh.first_point for input points for qh_joggleinput */
    -  boolT input_malloc;     /* true if qh.input_points malloc'd */
    -  char  qhull_command[256];/* command line that invoked this program */
    -  int   qhull_commandsiz2; /*    size of qhull_command at qh_clear_outputflags */
    -  char  rbox_command[256]; /* command line that produced the input points */
    -  char  qhull_options[512];/* descriptive list of options */
    -  int   qhull_optionlen;  /*    length of last line */
    -  int   qhull_optionsiz;  /*    size of qhull_options at qh_build_withrestart */
    -  int   qhull_optionsiz2; /*    size of qhull_options at qh_clear_outputflags */
    -  int   run_id;           /* non-zero, random identifier for this instance of qhull */
    -  boolT VERTEXneighbors;  /* true if maintaining vertex neighbors */
    -  boolT ZEROcentrum;      /* true if 'C-0' or 'C-0 Qx'.  sets ZEROall_ok */
    -  realT *upper_threshold; /* don't print if facet->normal[k]>=upper_threshold[k]
    -                             must set either GOODthreshold or SPLITthreshold
    -                             if Delaunay, default is 0.0 for upper envelope */
    -  realT *lower_threshold; /* don't print if facet->normal[k] <=lower_threshold[k] */
    -  realT *upper_bound;     /* scale point[k] to new upper bound */
    -  realT *lower_bound;     /* scale point[k] to new lower bound
    -                             project if both upper_ and lower_bound == 0 */
    -
    -/*----------------------------------
    -
    -  qh precision constants
    -    precision constants for Qhull
    -
    -  notes:
    -    qh_detroundoff(qh) computes the maximum roundoff error for distance
    -    and other computations.  It also sets default values for the
    -    qh constants above.
    -*/
    -  realT ANGLEround;       /* max round off error for angles */
    -  realT centrum_radius;   /* max centrum radius for convexity (roundoff added) */
    -  realT cos_max;          /* max cosine for convexity (roundoff added) */
    -  realT DISTround;        /* max round off error for distances, 'E' overrides qh_distround() */
    -  realT MAXabs_coord;     /* max absolute coordinate */
    -  realT MAXlastcoord;     /* max last coordinate for qh_scalelast */
    -  realT MAXsumcoord;      /* max sum of coordinates */
    -  realT MAXwidth;         /* max rectilinear width of point coordinates */
    -  realT MINdenom_1;       /* min. abs. value for 1/x */
    -  realT MINdenom;         /*    use divzero if denominator < MINdenom */
    -  realT MINdenom_1_2;     /* min. abs. val for 1/x that allows normalization */
    -  realT MINdenom_2;       /*    use divzero if denominator < MINdenom_2 */
    -  realT MINlastcoord;     /* min. last coordinate for qh_scalelast */
    -  boolT NARROWhull;       /* set in qh_initialhull if angle < qh_MAXnarrow */
    -  realT *NEARzero;        /* hull_dim array for near zero in gausselim */
    -  realT NEARinside;       /* keep points for qh_check_maxout if close to facet */
    -  realT ONEmerge;         /* max distance for merging simplicial facets */
    -  realT outside_err;      /* application's epsilon for coplanar points
    -                             qh_check_bestdist() qh_check_points() reports error if point outside */
    -  realT WIDEfacet;        /* size of wide facet for skipping ridge in
    -                             area computation and locking centrum */
    -
    -/*----------------------------------
    -
    -  qh internal constants
    -    internal constants for Qhull
    -*/
    -  char qhull[sizeof("qhull")]; /* "qhull" for checking ownership while debugging */
    -  jmp_buf errexit;        /* exit label for qh_errexit, defined by setjmp() and NOerrexit */
    -  char jmpXtra[40];       /* extra bytes in case jmp_buf is defined wrong by compiler */
    -  jmp_buf restartexit;    /* restart label for qh_errexit, defined by setjmp() and ALLOWrestart */
    -  char jmpXtra2[40];      /* extra bytes in case jmp_buf is defined wrong by compiler*/
    -  FILE *fin;              /* pointer to input file, init by qh_initqhull_start */
    -  FILE *fout;             /* pointer to output file */
    -  FILE *ferr;             /* pointer to error file */
    -  pointT *interior_point; /* center point of the initial simplex*/
    -  int normal_size;     /* size in bytes for facet normals and point coords*/
    -  int center_size;     /* size in bytes for Voronoi centers */
    -  int   TEMPsize;         /* size for small, temporary sets (in quick mem) */
    -
    -/*----------------------------------
    -
    -  qh facet and vertex lists
    -    defines lists of facets, new facets, visible facets, vertices, and
    -    new vertices.  Includes counts, next ids, and trace ids.
    -  see:
    -    qh_resetlists()
    -*/
    -  facetT *facet_list;     /* first facet */
    -  facetT  *facet_tail;     /* end of facet_list (dummy facet) */
    -  facetT *facet_next;     /* next facet for buildhull()
    -                             previous facets do not have outside sets
    -                             NARROWhull: previous facets may have coplanar outside sets for qh_outcoplanar */
    -  facetT *newfacet_list;  /* list of new facets to end of facet_list */
    -  facetT *visible_list;   /* list of visible facets preceding newfacet_list,
    -                             facet->visible set */
    -  int       num_visible;  /* current number of visible facets */
    -  unsigned tracefacet_id;  /* set at init, then can print whenever */
    -  facetT *tracefacet;     /*   set in newfacet/mergefacet, undone in delfacet*/
    -  unsigned tracevertex_id;  /* set at buildtracing, can print whenever */
    -  vertexT *tracevertex;     /*   set in newvertex, undone in delvertex*/
    -  vertexT *vertex_list;     /* list of all vertices, to vertex_tail */
    -  vertexT  *vertex_tail;    /*      end of vertex_list (dummy vertex) */
    -  vertexT *newvertex_list; /* list of vertices in newfacet_list, to vertex_tail
    -                             all vertices have 'newlist' set */
    -  int   num_facets;       /* number of facets in facet_list
    -                             includes visible faces (num_visible) */
    -  int   num_vertices;     /* number of vertices in facet_list */
    -  int   num_outside;      /* number of points in outsidesets (for tracing and RANDOMoutside)
    -                               includes coplanar outsideset points for NARROWhull/qh_outcoplanar() */
    -  int   num_good;         /* number of good facets (after findgood_all) */
    -  unsigned facet_id;      /* ID of next, new facet from newfacet() */
    -  unsigned ridge_id;      /* ID of next, new ridge from newridge() */
    -  unsigned vertex_id;     /* ID of next, new vertex from newvertex() */
    -
    -/*----------------------------------
    -
    -  qh global variables
    -    defines minimum and maximum distances, next visit ids, several flags,
    -    and other global variables.
    -    initialize in qh_initbuild or qh_maxmin if used in qh_buildhull
    -*/
    -  unsigned long hulltime; /* ignore time to set up input and randomize */
    -                          /*   use unsigned to avoid wrap-around errors */
    -  boolT ALLOWrestart;     /* true if qh_precision can use qh.restartexit */
    -  int   build_cnt;        /* number of calls to qh_initbuild */
    -  qh_CENTER CENTERtype;   /* current type of facet->center, qh_CENTER */
    -  int   furthest_id;      /* pointid of furthest point, for tracing */
    -  facetT *GOODclosest;    /* closest facet to GOODthreshold in qh_findgood */
    -  boolT hasAreaVolume;    /* true if totarea, totvol was defined by qh_getarea */
    -  boolT hasTriangulation; /* true if triangulation created by qh_triangulate */
    -  realT JOGGLEmax;        /* set 'QJn' if randomly joggle input */
    -  boolT maxoutdone;       /* set qh_check_maxout(), cleared by qh_addpoint() */
    -  realT max_outside;      /* maximum distance from a point to a facet,
    -                               before roundoff, not simplicial vertices
    -                               actual outer plane is +DISTround and
    -                               computed outer plane is +2*DISTround */
    -  realT max_vertex;       /* maximum distance (>0) from vertex to a facet,
    -                               before roundoff, due to a merge */
    -  realT min_vertex;       /* minimum distance (<0) from vertex to a facet,
    -                               before roundoff, due to a merge
    -                               if qh.JOGGLEmax, qh_makenewplanes sets it
    -                               recomputed if qh.DOcheckmax, default -qh.DISTround */
    -  boolT NEWfacets;        /* true while visible facets invalid due to new or merge
    -                              from makecone/attachnewfacets to deletevisible */
    -  boolT findbestnew;      /* true if partitioning calls qh_findbestnew */
    -  boolT findbest_notsharp; /* true if new facets are at least 90 degrees */
    -  boolT NOerrexit;        /* true if qh.errexit is not available, cleared after setjmp */
    -  realT PRINTcradius;     /* radius for printing centrums */
    -  realT PRINTradius;      /* radius for printing vertex spheres and points */
    -  boolT POSTmerging;      /* true when post merging */
    -  int   printoutvar;      /* temporary variable for qh_printbegin, etc. */
    -  int   printoutnum;      /* number of facets printed */
    -  boolT QHULLfinished;    /* True after qhull() is finished */
    -  realT totarea;          /* 'FA': total facet area computed by qh_getarea, hasAreaVolume */
    -  realT totvol;           /* 'FA': total volume computed by qh_getarea, hasAreaVolume */
    -  unsigned int visit_id;  /* unique ID for searching neighborhoods, */
    -  unsigned int vertex_visit; /* unique ID for searching vertices, reset with qh_buildtracing */
    -  boolT ZEROall_ok;       /* True if qh_checkzero always succeeds */
    -  boolT WAScoplanar;      /* True if qh_partitioncoplanar (qhT *qh, qh_check_maxout) */
    -
    -/*----------------------------------
    -
    -  qh global sets
    -    defines sets for merging, initial simplex, hashing, extra input points,
    -    and deleted vertices
    -*/
    -  setT *facet_mergeset;   /* temporary set of merges to be done */
    -  setT *degen_mergeset;   /* temporary set of degenerate and redundant merges */
    -  setT *hash_table;       /* hash table for matching ridges in qh_matchfacets
    -                             size is setsize() */
    -  setT *other_points;     /* additional points */
    -  setT *del_vertices;     /* vertices to partition and delete with visible
    -                             facets.  Have deleted set for checkfacet */
    -
    -/*----------------------------------
    -
    -  qh global buffers
    -    defines buffers for maxtrix operations, input, and error messages
    -*/
    -  coordT *gm_matrix;      /* (dim+1)Xdim matrix for geom_r.c */
    -  coordT **gm_row;        /* array of gm_matrix rows */
    -  char* line;             /* malloc'd input line of maxline+1 chars */
    -  int maxline;
    -  coordT *half_space;     /* malloc'd input array for halfspace (qh.normal_size+coordT) */
    -  coordT *temp_malloc;    /* malloc'd input array for points */
    -
    -/*----------------------------------
    -
    -  qh static variables
    -    defines static variables for individual functions
    -
    -  notes:
    -    do not use 'static' within a function.  Multiple instances of qhull
    -    may exist.
    -
    -    do not assume zero initialization, 'QPn' may cause a restart
    -*/
    -  boolT ERREXITcalled;    /* true during qh_errexit (qhT *qh, prevents duplicate calls */
    -  boolT firstcentrum;     /* for qh_printcentrum */
    -  boolT old_randomdist;   /* save RANDOMdist flag during io, tracing, or statistics */
    -  setT *coplanarfacetset;  /* set of coplanar facets for searching qh_findbesthorizon() */
    -  realT last_low;         /* qh_scalelast parameters for qh_setdelaunay */
    -  realT last_high;
    -  realT last_newhigh;
    -  unsigned lastreport;    /* for qh_buildtracing */
    -  int mergereport;        /* for qh_tracemerging */
    -  setT *old_tempstack;    /* for saving qh->qhmem.tempstack in save_qhull */
    -  int   ridgeoutnum;      /* number of ridges for 4OFF output (qh_printbegin,etc) */
    -
    -/*----------------------------------
    -
    -  qh memory management, rbox globals, and statistics
    -
    -  Replaces global data structures defined for libqhull
    -*/
    -  int     last_random;    /* Last random number from qh_rand (random_r.c) */
    -  jmp_buf rbox_errexit;   /* errexit from rboxlib_r.c, defined by qh_rboxpoints() only */
    -  char    jmpXtra3[40];   /* extra bytes in case jmp_buf is defined wrong by compiler */
    -  int     rbox_isinteger;
    -  double  rbox_out_offset;
    -  void *  cpp_object;     /* C++ pointer.  Currently used by RboxPoints.qh_fprintf_rbox */
    -
    -  /* Last, otherwise zero'd by qh_initqhull_start2 (global_r.c */
    -  qhmemT  qhmem;          /* Qhull managed memory (mem_r.h) */
    -  /* After qhmem because its size depends on the number of statistics */
    -  qhstatT qhstat;         /* Qhull statistics (stat_r.h) */
    -};
    -
    -/*=========== -macros- =========================*/
    -
    -/*----------------------------------
    -
    -  otherfacet_(ridge, facet)
    -    return neighboring facet for a ridge in facet
    -*/
    -#define otherfacet_(ridge, facet) \
    -                        (((ridge)->top == (facet)) ? (ridge)->bottom : (ridge)->top)
    -
    -/*----------------------------------
    -
    -  getid_(p)
    -    return int ID for facet, ridge, or vertex
    -    return qh_IDunknown(-1) if NULL
    -*/
    -#define getid_(p)       ((p) ? (int)((p)->id) : qh_IDunknown)
    -
    -/*============== FORALL macros ===================*/
    -
    -/*----------------------------------
    -
    -  FORALLfacets { ... }
    -    assign 'facet' to each facet in qh.facet_list
    -
    -  notes:
    -    uses 'facetT *facet;'
    -    assumes last facet is a sentinel
    -    assumes qh defined
    -
    -  see:
    -    FORALLfacet_( facetlist )
    -*/
    -#define FORALLfacets for (facet=qh->facet_list;facet && facet->next;facet=facet->next)
    -
    -/*----------------------------------
    -
    -  FORALLpoints { ... }
    -    assign 'point' to each point in qh.first_point, qh.num_points
    -
    -  notes:
    -    assumes qh defined
    -
    -  declare:
    -    coordT *point, *pointtemp;
    -*/
    -#define FORALLpoints FORALLpoint_(qh, qh->first_point, qh->num_points)
    -
    -/*----------------------------------
    -
    -  FORALLpoint_( qh, points, num) { ... }
    -    assign 'point' to each point in points array of num points
    -
    -  declare:
    -    coordT *point, *pointtemp;
    -*/
    -#define FORALLpoint_(qh, points, num) for (point= (points), \
    -      pointtemp= (points)+qh->hull_dim*(num); point < pointtemp; point += qh->hull_dim)
    -
    -/*----------------------------------
    -
    -  FORALLvertices { ... }
    -    assign 'vertex' to each vertex in qh.vertex_list
    -
    -  declare:
    -    vertexT *vertex;
    -
    -  notes:
    -    assumes qh.vertex_list terminated with a sentinel
    -    assumes qh defined
    -*/
    -#define FORALLvertices for (vertex=qh->vertex_list;vertex && vertex->next;vertex= vertex->next)
    -
    -/*----------------------------------
    -
    -  FOREACHfacet_( facets ) { ... }
    -    assign 'facet' to each facet in facets
    -
    -  declare:
    -    facetT *facet, **facetp;
    -
    -  see:
    -    FOREACHsetelement_
    -*/
    -#define FOREACHfacet_(facets)    FOREACHsetelement_(facetT, facets, facet)
    -
    -/*----------------------------------
    -
    -  FOREACHneighbor_( facet ) { ... }
    -    assign 'neighbor' to each neighbor in facet->neighbors
    -
    -  FOREACHneighbor_( vertex ) { ... }
    -    assign 'neighbor' to each neighbor in vertex->neighbors
    -
    -  declare:
    -    facetT *neighbor, **neighborp;
    -
    -  see:
    -    FOREACHsetelement_
    -*/
    -#define FOREACHneighbor_(facet)  FOREACHsetelement_(facetT, facet->neighbors, neighbor)
    -
    -/*----------------------------------
    -
    -  FOREACHpoint_( points ) { ... }
    -    assign 'point' to each point in points set
    -
    -  declare:
    -    pointT *point, **pointp;
    -
    -  see:
    -    FOREACHsetelement_
    -*/
    -#define FOREACHpoint_(points)    FOREACHsetelement_(pointT, points, point)
    -
    -/*----------------------------------
    -
    -  FOREACHridge_( ridges ) { ... }
    -    assign 'ridge' to each ridge in ridges set
    -
    -  declare:
    -    ridgeT *ridge, **ridgep;
    -
    -  see:
    -    FOREACHsetelement_
    -*/
    -#define FOREACHridge_(ridges)    FOREACHsetelement_(ridgeT, ridges, ridge)
    -
    -/*----------------------------------
    -
    -  FOREACHvertex_( vertices ) { ... }
    -    assign 'vertex' to each vertex in vertices set
    -
    -  declare:
    -    vertexT *vertex, **vertexp;
    -
    -  see:
    -    FOREACHsetelement_
    -*/
    -#define FOREACHvertex_(vertices) FOREACHsetelement_(vertexT, vertices,vertex)
    -
    -/*----------------------------------
    -
    -  FOREACHfacet_i_( qh, facets ) { ... }
    -    assign 'facet' and 'facet_i' for each facet in facets set
    -
    -  declare:
    -    facetT *facet;
    -    int     facet_n, facet_i;
    -
    -  see:
    -    FOREACHsetelement_i_
    -*/
    -#define FOREACHfacet_i_(qh, facets)    FOREACHsetelement_i_(qh, facetT, facets, facet)
    -
    -/*----------------------------------
    -
    -  FOREACHneighbor_i_( qh, facet ) { ... }
    -    assign 'neighbor' and 'neighbor_i' for each neighbor in facet->neighbors
    -
    -  FOREACHneighbor_i_( qh, vertex ) { ... }
    -    assign 'neighbor' and 'neighbor_i' for each neighbor in vertex->neighbors
    -
    -  declare:
    -    facetT *neighbor;
    -    int     neighbor_n, neighbor_i;
    -
    -  see:
    -    FOREACHsetelement_i_
    -*/
    -#define FOREACHneighbor_i_(qh, facet)  FOREACHsetelement_i_(qh, facetT, facet->neighbors, neighbor)
    -
    -/*----------------------------------
    -
    -  FOREACHpoint_i_( qh, points ) { ... }
    -    assign 'point' and 'point_i' for each point in points set
    -
    -  declare:
    -    pointT *point;
    -    int     point_n, point_i;
    -
    -  see:
    -    FOREACHsetelement_i_
    -*/
    -#define FOREACHpoint_i_(qh, points)    FOREACHsetelement_i_(qh, pointT, points, point)
    -
    -/*----------------------------------
    -
    -  FOREACHridge_i_( qh, ridges ) { ... }
    -    assign 'ridge' and 'ridge_i' for each ridge in ridges set
    -
    -  declare:
    -    ridgeT *ridge;
    -    int     ridge_n, ridge_i;
    -
    -  see:
    -    FOREACHsetelement_i_
    -*/
    -#define FOREACHridge_i_(qh, ridges)    FOREACHsetelement_i_(qh, ridgeT, ridges, ridge)
    -
    -/*----------------------------------
    -
    -  FOREACHvertex_i_( qh, vertices ) { ... }
    -    assign 'vertex' and 'vertex_i' for each vertex in vertices set
    -
    -  declare:
    -    vertexT *vertex;
    -    int     vertex_n, vertex_i;
    -
    -  see:
    -    FOREACHsetelement_i_
    -*/
    -#define FOREACHvertex_i_(qh, vertices) FOREACHsetelement_i_(qh, vertexT, vertices,vertex)
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/********* -libqhull_r.c prototypes (duplicated from qhull_ra.h) **********************/
    -
    -void    qh_qhull(qhT *qh);
    -boolT   qh_addpoint(qhT *qh, pointT *furthest, facetT *facet, boolT checkdist);
    -void    qh_printsummary(qhT *qh, FILE *fp);
    -
    -/********* -user.c prototypes (alphabetical) **********************/
    -
    -void    qh_errexit(qhT *qh, int exitcode, facetT *facet, ridgeT *ridge);
    -void    qh_errprint(qhT *qh, const char* string, facetT *atfacet, facetT *otherfacet, ridgeT *atridge, vertexT *atvertex);
    -int     qh_new_qhull(qhT *qh, int dim, int numpoints, coordT *points, boolT ismalloc,
    -                char *qhull_cmd, FILE *outfile, FILE *errfile);
    -void    qh_printfacetlist(qhT *qh, facetT *facetlist, setT *facets, boolT printall);
    -void    qh_printhelp_degenerate(qhT *qh, FILE *fp);
    -void    qh_printhelp_narrowhull(qhT *qh, FILE *fp, realT minangle);
    -void    qh_printhelp_singular(qhT *qh, FILE *fp);
    -void    qh_user_memsizes(qhT *qh);
    -
    -/********* -usermem_r.c prototypes (alphabetical) **********************/
    -void    qh_exit(int exitcode);
    -void    qh_fprintf_stderr(int msgcode, const char *fmt, ... );
    -void    qh_free(void *mem);
    -void   *qh_malloc(size_t size);
    -
    -/********* -userprintf_r.c and userprintf_rbox_r.c prototypes **********************/
    -void    qh_fprintf(qhT *qh, FILE *fp, int msgcode, const char *fmt, ... );
    -void    qh_fprintf_rbox(qhT *qh, FILE *fp, int msgcode, const char *fmt, ... );
    -
    -/***** -geom_r.c/geom2_r.c/random_r.c prototypes (duplicated from geom_r.h, random_r.h) ****************/
    -
    -facetT *qh_findbest(qhT *qh, pointT *point, facetT *startfacet,
    -                     boolT bestoutside, boolT newfacets, boolT noupper,
    -                     realT *dist, boolT *isoutside, int *numpart);
    -facetT *qh_findbestnew(qhT *qh, pointT *point, facetT *startfacet,
    -                     realT *dist, boolT bestoutside, boolT *isoutside, int *numpart);
    -boolT   qh_gram_schmidt(qhT *qh, int dim, realT **rows);
    -void    qh_outerinner(qhT *qh, facetT *facet, realT *outerplane, realT *innerplane);
    -void    qh_printsummary(qhT *qh, FILE *fp);
    -void    qh_projectinput(qhT *qh);
    -void    qh_randommatrix(qhT *qh, realT *buffer, int dim, realT **row);
    -void    qh_rotateinput(qhT *qh, realT **rows);
    -void    qh_scaleinput(qhT *qh);
    -void    qh_setdelaunay(qhT *qh, int dim, int count, pointT *points);
    -coordT  *qh_sethalfspace_all(qhT *qh, int dim, int count, coordT *halfspaces, pointT *feasible);
    -
    -/***** -global_r.c prototypes (alphabetical) ***********************/
    -
    -unsigned long qh_clock(qhT *qh);
    -void    qh_checkflags(qhT *qh, char *command, char *hiddenflags);
    -void    qh_clear_outputflags(qhT *qh);
    -void    qh_freebuffers(qhT *qh);
    -void    qh_freeqhull(qhT *qh, boolT allmem);
    -void    qh_init_A(qhT *qh, FILE *infile, FILE *outfile, FILE *errfile, int argc, char *argv[]);
    -void    qh_init_B(qhT *qh, coordT *points, int numpoints, int dim, boolT ismalloc);
    -void    qh_init_qhull_command(qhT *qh, int argc, char *argv[]);
    -void    qh_initbuffers(qhT *qh, coordT *points, int numpoints, int dim, boolT ismalloc);
    -void    qh_initflags(qhT *qh, char *command);
    -void    qh_initqhull_buffers(qhT *qh);
    -void    qh_initqhull_globals(qhT *qh, coordT *points, int numpoints, int dim, boolT ismalloc);
    -void    qh_initqhull_mem(qhT *qh);
    -void    qh_initqhull_outputflags(qhT *qh);
    -void    qh_initqhull_start(qhT *qh, FILE *infile, FILE *outfile, FILE *errfile);
    -void    qh_initqhull_start2(qhT *qh, FILE *infile, FILE *outfile, FILE *errfile);
    -void    qh_initthresholds(qhT *qh, char *command);
    -void    qh_lib_check(int qhullLibraryType, int qhTsize, int vertexTsize, int ridgeTsize, int facetTsize, int setTsize, int qhmemTsize);
    -void    qh_option(qhT *qh, const char *option, int *i, realT *r);
    -void    qh_zero(qhT *qh, FILE *errfile);
    -
    -/***** -io_r.c prototypes (duplicated from io_r.h) ***********************/
    -
    -void    qh_dfacet(qhT *qh, unsigned id);
    -void    qh_dvertex(qhT *qh, unsigned id);
    -void    qh_printneighborhood(qhT *qh, FILE *fp, qh_PRINT format, facetT *facetA, facetT *facetB, boolT printall);
    -void    qh_produce_output(qhT *qh);
    -coordT *qh_readpoints(qhT *qh, int *numpoints, int *dimension, boolT *ismalloc);
    -
    -
    -/********* -mem_r.c prototypes (duplicated from mem_r.h) **********************/
    -
    -void qh_meminit(qhT *qh, FILE *ferr);
    -void qh_memfreeshort(qhT *qh, int *curlong, int *totlong);
    -
    -/********* -poly_r.c/poly2_r.c prototypes (duplicated from poly_r.h) **********************/
    -
    -void    qh_check_output(qhT *qh);
    -void    qh_check_points(qhT *qh);
    -setT   *qh_facetvertices(qhT *qh, facetT *facetlist, setT *facets, boolT allfacets);
    -facetT *qh_findbestfacet(qhT *qh, pointT *point, boolT bestoutside,
    -           realT *bestdist, boolT *isoutside);
    -vertexT *qh_nearvertex(qhT *qh, facetT *facet, pointT *point, realT *bestdistp);
    -pointT *qh_point(qhT *qh, int id);
    -setT   *qh_pointfacet(qhT *qh /*qh.facet_list*/);
    -int     qh_pointid(qhT *qh, pointT *point);
    -setT   *qh_pointvertex(qhT *qh /*qh.facet_list*/);
    -void    qh_setvoronoi_all(qhT *qh);
    -void    qh_triangulate(qhT *qh /*qh.facet_list*/);
    -
    -/********* -rboxpoints_r.c prototypes **********************/
    -int     qh_rboxpoints(qhT *qh, char* rbox_command);
    -void    qh_errexit_rbox(qhT *qh, int exitcode);
    -
    -/********* -stat_r.c prototypes (duplicated from stat_r.h) **********************/
    -
    -void    qh_collectstatistics(qhT *qh);
    -void    qh_printallstatistics(qhT *qh, FILE *fp, const char *string);
    -
    -#ifdef __cplusplus
    -} /* extern "C" */
    -#endif
    -
    -#endif /* qhDEFlibqhull */
    diff --git a/src/qhull/src/libqhull_r/libqhull_r.pro b/src/qhull/src/libqhull_r/libqhull_r.pro
    deleted file mode 100644
    index 6b8db44b750..00000000000
    --- a/src/qhull/src/libqhull_r/libqhull_r.pro
    +++ /dev/null
    @@ -1,67 +0,0 @@
    -# -------------------------------------------------
    -# libqhull_r.pro -- Qt project for Qhull shared library
    -#
    -# It uses reentrant Qhull
    -# -------------------------------------------------
    -
    -include(../qhull-warn.pri)
    -
    -DESTDIR = ../../lib
    -DLLDESTDIR = ../../bin
    -TEMPLATE = lib
    -CONFIG += shared warn_on
    -CONFIG -= qt
    -
    -build_pass:CONFIG(debug, debug|release):{
    -    TARGET = qhull_rd
    -    OBJECTS_DIR = Debug
    -}else:build_pass:CONFIG(release, debug|release):{
    -    TARGET = qhull_r
    -    OBJECTS_DIR = Release
    -}
    -win32-msvc* : QMAKE_LFLAGS += /INCREMENTAL:NO
    -
    -win32-msvc* : DEF_FILE += ../../src/libqhull_r/qhull_r-exports.def
    -
    -# libqhull_r/libqhull_r.pro and ../qhull-libqhull-src_r.pri have the same SOURCES and HEADERS
    -
    -SOURCES += ../libqhull_r/global_r.c
    -SOURCES += ../libqhull_r/stat_r.c
    -SOURCES += ../libqhull_r/geom2_r.c
    -SOURCES += ../libqhull_r/poly2_r.c
    -SOURCES += ../libqhull_r/merge_r.c
    -SOURCES += ../libqhull_r/libqhull_r.c
    -SOURCES += ../libqhull_r/geom_r.c
    -SOURCES += ../libqhull_r/poly_r.c
    -SOURCES += ../libqhull_r/qset_r.c
    -SOURCES += ../libqhull_r/mem_r.c
    -SOURCES += ../libqhull_r/random_r.c
    -SOURCES += ../libqhull_r/usermem_r.c
    -SOURCES += ../libqhull_r/userprintf_r.c
    -SOURCES += ../libqhull_r/io_r.c
    -SOURCES += ../libqhull_r/user_r.c
    -SOURCES += ../libqhull_r/rboxlib_r.c
    -SOURCES += ../libqhull_r/userprintf_rbox_r.c
    -
    -HEADERS += ../libqhull_r/geom_r.h
    -HEADERS += ../libqhull_r/io_r.h
    -HEADERS += ../libqhull_r/libqhull_r.h
    -HEADERS += ../libqhull_r/mem_r.h
    -HEADERS += ../libqhull_r/merge_r.h
    -HEADERS += ../libqhull_r/poly_r.h
    -HEADERS += ../libqhull_r/random_r.h
    -HEADERS += ../libqhull_r/qhull_ra.h
    -HEADERS += ../libqhull_r/qset_r.h
    -HEADERS += ../libqhull_r/stat_r.h
    -HEADERS += ../libqhull_r/user_r.h
    -
    -OTHER_FILES += qh-geom_r.htm
    -OTHER_FILES += qh-globa_r.htm
    -OTHER_FILES += qh-io_r.htm
    -OTHER_FILES += qh-mem_r.htm
    -OTHER_FILES += qh-merge_r.htm
    -OTHER_FILES += qh-poly_r.htm
    -OTHER_FILES += qh-qhull_r.htm
    -OTHER_FILES += qh-set_r.htm
    -OTHER_FILES += qh-stat_r.htm
    -OTHER_FILES += qh-user_r.htm
    diff --git a/src/qhull/src/libqhull_r/mem_r.c b/src/qhull/src/libqhull_r/mem_r.c
    deleted file mode 100644
    index 801a8c76a19..00000000000
    --- a/src/qhull/src/libqhull_r/mem_r.c
    +++ /dev/null
    @@ -1,562 +0,0 @@
    -/*
      ---------------------------------
    -
    -  mem_r.c
    -    memory management routines for qhull
    -
    -  See libqhull/mem_r.c for a standalone program.
    -
    -  To initialize memory:
    -
    -    qh_meminit(qh, stderr);
    -    qh_meminitbuffers(qh, qh->IStracing, qh_MEMalign, 7, qh_MEMbufsize,qh_MEMinitbuf);
    -    qh_memsize(qh, (int)sizeof(facetT));
    -    qh_memsize(qh, (int)sizeof(facetT));
    -    ...
    -    qh_memsetup(qh);
    -
    -  To free up all memory buffers:
    -    qh_memfreeshort(qh, &curlong, &totlong);
    -
    -  if qh_NOmem,
    -    malloc/free is used instead of mem.c
    -
    -  notes:
    -    uses Quickfit algorithm (freelists for commonly allocated sizes)
    -    assumes small sizes for freelists (it discards the tail of memory buffers)
    -
    -  see:
    -    qh-mem_r.htm and mem_r.h
    -    global_r.c (qh_initbuffers) for an example of using mem_r.c
    -
    -  Copyright (c) 1993-2015 The Geometry Center.
    -  $Id: //main/2015/qhull/src/libqhull_r/mem_r.c#5 $$Change: 2065 $
    -  $DateTime: 2016/01/18 13:51:04 $$Author: bbarber $
    -*/
    -
    -#include "libqhull_r.h"  /* includes user_r.h and mem_r.h */
    -
    -#include 
    -#include 
    -#include 
    -
    -#ifndef qh_NOmem
    -
    -/*============= internal functions ==============*/
    -
    -static int qh_intcompare(const void *i, const void *j);
    -
    -/*========== functions in alphabetical order ======== */
    -
    -/*---------------------------------
    -
    -  qh_intcompare( i, j )
    -    used by qsort and bsearch to compare two integers
    -*/
    -static int qh_intcompare(const void *i, const void *j) {
    -  return(*((const int *)i) - *((const int *)j));
    -} /* intcompare */
    -
    -
    -/*----------------------------------
    -
    -  qh_memalloc( qh, insize )
    -    returns object of insize bytes
    -    qhmem is the global memory structure
    -
    -  returns:
    -    pointer to allocated memory
    -    errors if insufficient memory
    -
    -  notes:
    -    use explicit type conversion to avoid type warnings on some compilers
    -    actual object may be larger than insize
    -    use qh_memalloc_() for inline code for quick allocations
    -    logs allocations if 'T5'
    -    caller is responsible for freeing the memory.
    -    short memory is freed on shutdown by qh_memfreeshort unless qh_NOmem
    -
    -  design:
    -    if size < qh->qhmem.LASTsize
    -      if qh->qhmem.freelists[size] non-empty
    -        return first object on freelist
    -      else
    -        round up request to size of qh->qhmem.freelists[size]
    -        allocate new allocation buffer if necessary
    -        allocate object from allocation buffer
    -    else
    -      allocate object with qh_malloc() in user.c
    -*/
    -void *qh_memalloc(qhT *qh, int insize) {
    -  void **freelistp, *newbuffer;
    -  int idx, size, n;
    -  int outsize, bufsize;
    -  void *object;
    -
    -  if (insize<0) {
    -      qh_fprintf(qh, qh->qhmem.ferr, 6235, "qhull error (qh_memalloc): negative request size (%d).  Did int overflow due to high-D?\n", insize); /* WARN64 */
    -      qh_errexit(qh, qhmem_ERRmem, NULL, NULL);
    -  }
    -  if (insize>=0 && insize <= qh->qhmem.LASTsize) {
    -    idx= qh->qhmem.indextable[insize];
    -    outsize= qh->qhmem.sizetable[idx];
    -    qh->qhmem.totshort += outsize;
    -    freelistp= qh->qhmem.freelists+idx;
    -    if ((object= *freelistp)) {
    -      qh->qhmem.cntquick++;
    -      qh->qhmem.totfree -= outsize;
    -      *freelistp= *((void **)*freelistp);  /* replace freelist with next object */
    -#ifdef qh_TRACEshort
    -      n= qh->qhmem.cntshort+qh->qhmem.cntquick+qh->qhmem.freeshort;
    -      if (qh->qhmem.IStracing >= 5)
    -          qh_fprintf(qh, qh->qhmem.ferr, 8141, "qh_mem %p n %8d alloc quick: %d bytes (tot %d cnt %d)\n", object, n, outsize, qh->qhmem.totshort, qh->qhmem.cntshort+qh->qhmem.cntquick-qh->qhmem.freeshort);
    -#endif
    -      return(object);
    -    }else {
    -      qh->qhmem.cntshort++;
    -      if (outsize > qh->qhmem.freesize) {
    -        qh->qhmem.totdropped += qh->qhmem.freesize;
    -        if (!qh->qhmem.curbuffer)
    -          bufsize= qh->qhmem.BUFinit;
    -        else
    -          bufsize= qh->qhmem.BUFsize;
    -        if (!(newbuffer= qh_malloc((size_t)bufsize))) {
    -          qh_fprintf(qh, qh->qhmem.ferr, 6080, "qhull error (qh_memalloc): insufficient memory to allocate short memory buffer (%d bytes)\n", bufsize);
    -          qh_errexit(qh, qhmem_ERRmem, NULL, NULL);
    -        }
    -        *((void **)newbuffer)= qh->qhmem.curbuffer;  /* prepend newbuffer to curbuffer
    -                                                    list.  newbuffer!=0 by QH6080 */
    -        qh->qhmem.curbuffer= newbuffer;
    -        size= (sizeof(void **) + qh->qhmem.ALIGNmask) & ~qh->qhmem.ALIGNmask;
    -        qh->qhmem.freemem= (void *)((char *)newbuffer+size);
    -        qh->qhmem.freesize= bufsize - size;
    -        qh->qhmem.totbuffer += bufsize - size; /* easier to check */
    -        /* Periodically test totbuffer.  It matches at beginning and exit of every call */
    -        n = qh->qhmem.totshort + qh->qhmem.totfree + qh->qhmem.totdropped + qh->qhmem.freesize - outsize;
    -        if (qh->qhmem.totbuffer != n) {
    -            qh_fprintf(qh, qh->qhmem.ferr, 6212, "qh_memalloc internal error: short totbuffer %d != totshort+totfree... %d\n", qh->qhmem.totbuffer, n);
    -            qh_errexit(qh, qhmem_ERRmem, NULL, NULL);
    -        }
    -      }
    -      object= qh->qhmem.freemem;
    -      qh->qhmem.freemem= (void *)((char *)qh->qhmem.freemem + outsize);
    -      qh->qhmem.freesize -= outsize;
    -      qh->qhmem.totunused += outsize - insize;
    -#ifdef qh_TRACEshort
    -      n= qh->qhmem.cntshort+qh->qhmem.cntquick+qh->qhmem.freeshort;
    -      if (qh->qhmem.IStracing >= 5)
    -          qh_fprintf(qh, qh->qhmem.ferr, 8140, "qh_mem %p n %8d alloc short: %d bytes (tot %d cnt %d)\n", object, n, outsize, qh->qhmem.totshort, qh->qhmem.cntshort+qh->qhmem.cntquick-qh->qhmem.freeshort);
    -#endif
    -      return object;
    -    }
    -  }else {                     /* long allocation */
    -    if (!qh->qhmem.indextable) {
    -      qh_fprintf(qh, qh->qhmem.ferr, 6081, "qhull internal error (qh_memalloc): qhmem has not been initialized.\n");
    -      qh_errexit(qh, qhmem_ERRqhull, NULL, NULL);
    -    }
    -    outsize= insize;
    -    qh->qhmem.cntlong++;
    -    qh->qhmem.totlong += outsize;
    -    if (qh->qhmem.maxlong < qh->qhmem.totlong)
    -      qh->qhmem.maxlong= qh->qhmem.totlong;
    -    if (!(object= qh_malloc((size_t)outsize))) {
    -      qh_fprintf(qh, qh->qhmem.ferr, 6082, "qhull error (qh_memalloc): insufficient memory to allocate %d bytes\n", outsize);
    -      qh_errexit(qh, qhmem_ERRmem, NULL, NULL);
    -    }
    -    if (qh->qhmem.IStracing >= 5)
    -      qh_fprintf(qh, qh->qhmem.ferr, 8057, "qh_mem %p n %8d alloc long: %d bytes (tot %d cnt %d)\n", object, qh->qhmem.cntlong+qh->qhmem.freelong, outsize, qh->qhmem.totlong, qh->qhmem.cntlong-qh->qhmem.freelong);
    -  }
    -  return(object);
    -} /* memalloc */
    -
    -
    -/*----------------------------------
    -
    -  qh_memcheck(qh)
    -*/
    -void qh_memcheck(qhT *qh) {
    -  int i, count, totfree= 0;
    -  void *object;
    -
    -  if (!qh) {
    -    qh_fprintf_stderr(6243, "qh_memcheck(qh) error: qh is 0.  It does not point to a qhT");
    -    qh_exit(qhmem_ERRqhull);  /* can not use qh_errexit() */
    -  }
    -  if (qh->qhmem.ferr == 0 || qh->qhmem.IStracing < 0 || qh->qhmem.IStracing > 10 || (((qh->qhmem.ALIGNmask+1) & qh->qhmem.ALIGNmask) != 0)) {
    -    qh_fprintf_stderr(6244, "qh_memcheck error: either qh->qhmem is overwritten or qh->qhmem is not initialized.  Call qh_mem_new() or qh_new_qhull() before calling qh_mem routines.  ferr 0x%x IsTracing %d ALIGNmask 0x%x", qh->qhmem.ferr, qh->qhmem.IStracing, qh->qhmem.ALIGNmask);
    -    qh_exit(qhmem_ERRqhull);  /* can not use qh_errexit() */
    -  }
    -  if (qh->qhmem.IStracing != 0)
    -    qh_fprintf(qh, qh->qhmem.ferr, 8143, "qh_memcheck: check size of freelists on qh->qhmem\nqh_memcheck: A segmentation fault indicates an overwrite of qh->qhmem\n");
    -  for (i=0; i < qh->qhmem.TABLEsize; i++) {
    -    count=0;
    -    for (object= qh->qhmem.freelists[i]; object; object= *((void **)object))
    -      count++;
    -    totfree += qh->qhmem.sizetable[i] * count;
    -  }
    -  if (totfree != qh->qhmem.totfree) {
    -    qh_fprintf(qh, qh->qhmem.ferr, 6211, "Qhull internal error (qh_memcheck): totfree %d not equal to freelist total %d\n", qh->qhmem.totfree, totfree);
    -    qh_errexit(qh, qhmem_ERRqhull, NULL, NULL);
    -  }
    -  if (qh->qhmem.IStracing != 0)
    -    qh_fprintf(qh, qh->qhmem.ferr, 8144, "qh_memcheck: total size of freelists totfree is the same as qh->qhmem.totfree\n", totfree);
    -} /* memcheck */
    -
    -/*----------------------------------
    -
    -  qh_memfree(qh, object, insize )
    -    free up an object of size bytes
    -    size is insize from qh_memalloc
    -
    -  notes:
    -    object may be NULL
    -    type checking warns if using (void **)object
    -    use qh_memfree_() for quick free's of small objects
    -
    -  design:
    -    if size <= qh->qhmem.LASTsize
    -      append object to corresponding freelist
    -    else
    -      call qh_free(object)
    -*/
    -void qh_memfree(qhT *qh, void *object, int insize) {
    -  void **freelistp;
    -  int idx, outsize;
    -
    -  if (!object)
    -    return;
    -  if (insize <= qh->qhmem.LASTsize) {
    -    qh->qhmem.freeshort++;
    -    idx= qh->qhmem.indextable[insize];
    -    outsize= qh->qhmem.sizetable[idx];
    -    qh->qhmem.totfree += outsize;
    -    qh->qhmem.totshort -= outsize;
    -    freelistp= qh->qhmem.freelists + idx;
    -    *((void **)object)= *freelistp;
    -    *freelistp= object;
    -#ifdef qh_TRACEshort
    -    idx= qh->qhmem.cntshort+qh->qhmem.cntquick+qh->qhmem.freeshort;
    -    if (qh->qhmem.IStracing >= 5)
    -        qh_fprintf(qh, qh->qhmem.ferr, 8142, "qh_mem %p n %8d free short: %d bytes (tot %d cnt %d)\n", object, idx, outsize, qh->qhmem.totshort, qh->qhmem.cntshort+qh->qhmem.cntquick-qh->qhmem.freeshort);
    -#endif
    -  }else {
    -    qh->qhmem.freelong++;
    -    qh->qhmem.totlong -= insize;
    -    if (qh->qhmem.IStracing >= 5)
    -      qh_fprintf(qh, qh->qhmem.ferr, 8058, "qh_mem %p n %8d free long: %d bytes (tot %d cnt %d)\n", object, qh->qhmem.cntlong+qh->qhmem.freelong, insize, qh->qhmem.totlong, qh->qhmem.cntlong-qh->qhmem.freelong);
    -    qh_free(object);
    -  }
    -} /* memfree */
    -
    -
    -/*---------------------------------
    -
    -  qh_memfreeshort(qh, curlong, totlong )
    -    frees up all short and qhmem memory allocations
    -
    -  returns:
    -    number and size of current long allocations
    -  
    -  notes:
    -    if qh_NOmem (qh_malloc() for all allocations), 
    -       short objects (e.g., facetT) are not recovered.
    -       use qh_freeqhull(qh, qh_ALL) instead.
    - 
    -  see:
    -    qh_freeqhull(qh, allMem)
    -    qh_memtotal(qh, curlong, totlong, curshort, totshort, maxlong, totbuffer);
    -*/
    -void qh_memfreeshort(qhT *qh, int *curlong, int *totlong) {
    -  void *buffer, *nextbuffer;
    -  FILE *ferr;
    -
    -  *curlong= qh->qhmem.cntlong - qh->qhmem.freelong;
    -  *totlong= qh->qhmem.totlong;
    -  for (buffer= qh->qhmem.curbuffer; buffer; buffer= nextbuffer) {
    -    nextbuffer= *((void **) buffer);
    -    qh_free(buffer);
    -  }
    -  qh->qhmem.curbuffer= NULL;
    -  if (qh->qhmem.LASTsize) {
    -    qh_free(qh->qhmem.indextable);
    -    qh_free(qh->qhmem.freelists);
    -    qh_free(qh->qhmem.sizetable);
    -  }
    -  ferr= qh->qhmem.ferr;
    -  memset((char *)&qh->qhmem, 0, sizeof(qh->qhmem));  /* every field is 0, FALSE, NULL */
    -  qh->qhmem.ferr= ferr;
    -} /* memfreeshort */
    -
    -
    -/*----------------------------------
    -
    -  qh_meminit(qh, ferr )
    -    initialize qhmem and test sizeof( void*)
    -    Does not throw errors.  qh_exit on failure
    -*/
    -void qh_meminit(qhT *qh, FILE *ferr) {
    -
    -  memset((char *)&qh->qhmem, 0, sizeof(qh->qhmem));  /* every field is 0, FALSE, NULL */
    -  if (ferr)
    -      qh->qhmem.ferr= ferr;
    -  else
    -      qh->qhmem.ferr= stderr;
    -  if (sizeof(void*) < sizeof(int)) {
    -    qh_fprintf(qh, qh->qhmem.ferr, 6083, "qhull internal error (qh_meminit): sizeof(void*) %d < sizeof(int) %d.  qset.c will not work\n", (int)sizeof(void*), (int)sizeof(int));
    -    qh_exit(qhmem_ERRqhull);  /* can not use qh_errexit() */
    -  }
    -  if (sizeof(void*) > sizeof(ptr_intT)) {
    -      qh_fprintf(qh, qh->qhmem.ferr, 6084, "qhull internal error (qh_meminit): sizeof(void*) %d > sizeof(ptr_intT) %d. Change ptr_intT in mem.h to 'long long'\n", (int)sizeof(void*), (int)sizeof(ptr_intT));
    -      qh_exit(qhmem_ERRqhull);  /* can not use qh_errexit() */
    -  }
    -  qh_memcheck(qh);
    -} /* meminit */
    -
    -/*---------------------------------
    -
    -  qh_meminitbuffers(qh, tracelevel, alignment, numsizes, bufsize, bufinit )
    -    initialize qhmem
    -    if tracelevel >= 5, trace memory allocations
    -    alignment= desired address alignment for memory allocations
    -    numsizes= number of freelists
    -    bufsize=  size of additional memory buffers for short allocations
    -    bufinit=  size of initial memory buffer for short allocations
    -*/
    -void qh_meminitbuffers(qhT *qh, int tracelevel, int alignment, int numsizes, int bufsize, int bufinit) {
    -
    -  qh->qhmem.IStracing= tracelevel;
    -  qh->qhmem.NUMsizes= numsizes;
    -  qh->qhmem.BUFsize= bufsize;
    -  qh->qhmem.BUFinit= bufinit;
    -  qh->qhmem.ALIGNmask= alignment-1;
    -  if (qh->qhmem.ALIGNmask & ~qh->qhmem.ALIGNmask) {
    -    qh_fprintf(qh, qh->qhmem.ferr, 6085, "qhull internal error (qh_meminit): memory alignment %d is not a power of 2\n", alignment);
    -    qh_errexit(qh, qhmem_ERRqhull, NULL, NULL);
    -  }
    -  qh->qhmem.sizetable= (int *) calloc((size_t)numsizes, sizeof(int));
    -  qh->qhmem.freelists= (void **) calloc((size_t)numsizes, sizeof(void *));
    -  if (!qh->qhmem.sizetable || !qh->qhmem.freelists) {
    -    qh_fprintf(qh, qh->qhmem.ferr, 6086, "qhull error (qh_meminit): insufficient memory\n");
    -    qh_errexit(qh, qhmem_ERRmem, NULL, NULL);
    -  }
    -  if (qh->qhmem.IStracing >= 1)
    -    qh_fprintf(qh, qh->qhmem.ferr, 8059, "qh_meminitbuffers: memory initialized with alignment %d\n", alignment);
    -} /* meminitbuffers */
    -
    -/*---------------------------------
    -
    -  qh_memsetup(qh)
    -    set up memory after running memsize()
    -*/
    -void qh_memsetup(qhT *qh) {
    -  int k,i;
    -
    -  qsort(qh->qhmem.sizetable, (size_t)qh->qhmem.TABLEsize, sizeof(int), qh_intcompare);
    -  qh->qhmem.LASTsize= qh->qhmem.sizetable[qh->qhmem.TABLEsize-1];
    -  if(qh->qhmem.LASTsize >= qh->qhmem.BUFsize || qh->qhmem.LASTsize >= qh->qhmem.BUFinit) {
    -    qh_fprintf(qh, qh->qhmem.ferr, 6087, "qhull error (qh_memsetup): largest mem size %d is >= buffer size %d or initial buffer size %d\n",
    -            qh->qhmem.LASTsize, qh->qhmem.BUFsize, qh->qhmem.BUFinit);
    -    qh_errexit(qh, qhmem_ERRmem, NULL, NULL);
    -  }
    -  if (!(qh->qhmem.indextable= (int *)qh_malloc((qh->qhmem.LASTsize+1) * sizeof(int)))) {
    -    qh_fprintf(qh, qh->qhmem.ferr, 6088, "qhull error (qh_memsetup): insufficient memory\n");
    -    qh_errexit(qh, qhmem_ERRmem, NULL, NULL);
    -  }
    -  for (k=qh->qhmem.LASTsize+1; k--; )
    -    qh->qhmem.indextable[k]= k;
    -  i= 0;
    -  for (k=0; k <= qh->qhmem.LASTsize; k++) {
    -    if (qh->qhmem.indextable[k] <= qh->qhmem.sizetable[i])
    -      qh->qhmem.indextable[k]= i;
    -    else
    -      qh->qhmem.indextable[k]= ++i;
    -  }
    -} /* memsetup */
    -
    -/*---------------------------------
    -
    -  qh_memsize(qh, size )
    -    define a free list for this size
    -*/
    -void qh_memsize(qhT *qh, int size) {
    -  int k;
    -
    -  if(qh->qhmem.LASTsize) {
    -    qh_fprintf(qh, qh->qhmem.ferr, 6089, "qhull error (qh_memsize): called after qhmem_setup\n");
    -    qh_errexit(qh, qhmem_ERRqhull, NULL, NULL);
    -  }
    -  size= (size + qh->qhmem.ALIGNmask) & ~qh->qhmem.ALIGNmask;
    -  for (k=qh->qhmem.TABLEsize; k--; ) {
    -    if (qh->qhmem.sizetable[k] == size)
    -      return;
    -  }
    -  if (qh->qhmem.TABLEsize < qh->qhmem.NUMsizes)
    -    qh->qhmem.sizetable[qh->qhmem.TABLEsize++]= size;
    -  else
    -    qh_fprintf(qh, qh->qhmem.ferr, 7060, "qhull warning (memsize): free list table has room for only %d sizes\n", qh->qhmem.NUMsizes);
    -} /* memsize */
    -
    -
    -/*---------------------------------
    -
    -  qh_memstatistics(qh, fp )
    -    print out memory statistics
    -
    -    Verifies that qh->qhmem.totfree == sum of freelists
    -*/
    -void qh_memstatistics(qhT *qh, FILE *fp) {
    -  int i;
    -  int count;
    -  void *object;
    -
    -  qh_memcheck(qh);
    -  qh_fprintf(qh, fp, 9278, "\nmemory statistics:\n\
    -%7d quick allocations\n\
    -%7d short allocations\n\
    -%7d long allocations\n\
    -%7d short frees\n\
    -%7d long frees\n\
    -%7d bytes of short memory in use\n\
    -%7d bytes of short memory in freelists\n\
    -%7d bytes of dropped short memory\n\
    -%7d bytes of unused short memory (estimated)\n\
    -%7d bytes of long memory allocated (max, except for input)\n\
    -%7d bytes of long memory in use (in %d pieces)\n\
    -%7d bytes of short memory buffers (minus links)\n\
    -%7d bytes per short memory buffer (initially %d bytes)\n",
    -           qh->qhmem.cntquick, qh->qhmem.cntshort, qh->qhmem.cntlong,
    -           qh->qhmem.freeshort, qh->qhmem.freelong,
    -           qh->qhmem.totshort, qh->qhmem.totfree,
    -           qh->qhmem.totdropped + qh->qhmem.freesize, qh->qhmem.totunused,
    -           qh->qhmem.maxlong, qh->qhmem.totlong, qh->qhmem.cntlong - qh->qhmem.freelong,
    -           qh->qhmem.totbuffer, qh->qhmem.BUFsize, qh->qhmem.BUFinit);
    -  if (qh->qhmem.cntlarger) {
    -    qh_fprintf(qh, fp, 9279, "%7d calls to qh_setlarger\n%7.2g     average copy size\n",
    -           qh->qhmem.cntlarger, ((float)qh->qhmem.totlarger)/(float)qh->qhmem.cntlarger);
    -    qh_fprintf(qh, fp, 9280, "  freelists(bytes->count):");
    -  }
    -  for (i=0; i < qh->qhmem.TABLEsize; i++) {
    -    count=0;
    -    for (object= qh->qhmem.freelists[i]; object; object= *((void **)object))
    -      count++;
    -    qh_fprintf(qh, fp, 9281, " %d->%d", qh->qhmem.sizetable[i], count);
    -  }
    -  qh_fprintf(qh, fp, 9282, "\n\n");
    -} /* memstatistics */
    -
    -
    -/*---------------------------------
    -
    -  qh_NOmem
    -    turn off quick-fit memory allocation
    -
    -  notes:
    -    uses qh_malloc() and qh_free() instead
    -*/
    -#else /* qh_NOmem */
    -
    -void *qh_memalloc(qhT *qh, int insize) {
    -  void *object;
    -
    -  if (!(object= qh_malloc((size_t)insize))) {
    -    qh_fprintf(qh, qh->qhmem.ferr, 6090, "qhull error (qh_memalloc): insufficient memory\n");
    -    qh_errexit(qh, qhmem_ERRmem, NULL, NULL);
    -  }
    -  qh->qhmem.cntlong++;
    -  qh->qhmem.totlong += insize;
    -  if (qh->qhmem.maxlong < qh->qhmem.totlong)
    -      qh->qhmem.maxlong= qh->qhmem.totlong;
    -  if (qh->qhmem.IStracing >= 5)
    -    qh_fprintf(qh, qh->qhmem.ferr, 8060, "qh_mem %p n %8d alloc long: %d bytes (tot %d cnt %d)\n", object, qh->qhmem.cntlong+qh->qhmem.freelong, insize, qh->qhmem.totlong, qh->qhmem.cntlong-qh->qhmem.freelong);
    -  return object;
    -}
    -
    -void qh_memfree(qhT *qh, void *object, int insize) {
    -
    -  if (!object)
    -    return;
    -  qh_free(object);
    -  qh->qhmem.freelong++;
    -  qh->qhmem.totlong -= insize;
    -  if (qh->qhmem.IStracing >= 5)
    -    qh_fprintf(qh, qh->qhmem.ferr, 8061, "qh_mem %p n %8d free long: %d bytes (tot %d cnt %d)\n", object, qh->qhmem.cntlong+qh->qhmem.freelong, insize, qh->qhmem.totlong, qh->qhmem.cntlong-qh->qhmem.freelong);
    -}
    -
    -void qh_memfreeshort(qhT *qh, int *curlong, int *totlong) {
    -  *totlong= qh->qhmem.totlong;
    -  *curlong= qh->qhmem.cntlong - qh->qhmem.freelong;
    -  memset((char *)&qh->qhmem, 0, sizeof(qh->qhmem));  /* every field is 0, FALSE, NULL */
    -}
    -
    -void qh_meminit(qhT *qh, FILE *ferr) {
    -
    -  memset((char *)&qh->qhmem, 0, sizeof(qh->qhmem));  /* every field is 0, FALSE, NULL */
    -  if (ferr)
    -      qh->qhmem.ferr= ferr;
    -  else
    -      qh->qhmem.ferr= stderr;
    -  if (sizeof(void*) < sizeof(int)) {
    -    qh_fprintf(qh, qh->qhmem.ferr, 6091, "qhull internal error (qh_meminit): sizeof(void*) %d < sizeof(int) %d.  qset.c will not work\n", (int)sizeof(void*), (int)sizeof(int));
    -    qh_errexit(qh, qhmem_ERRqhull, NULL, NULL);
    -  }
    -}
    -
    -void qh_meminitbuffers(qhT *qh, int tracelevel, int alignment, int numsizes, int bufsize, int bufinit) {
    -
    -  qh->qhmem.IStracing= tracelevel;
    -}
    -
    -void qh_memsetup(qhT *qh) {
    -
    -}
    -
    -void qh_memsize(qhT *qh, int size) {
    -
    -}
    -
    -void qh_memstatistics(qhT *qh, FILE *fp) {
    -
    -  qh_fprintf(qh, fp, 9409, "\nmemory statistics:\n\
    -%7d long allocations\n\
    -%7d long frees\n\
    -%7d bytes of long memory allocated (max, except for input)\n\
    -%7d bytes of long memory in use (in %d pieces)\n",
    -           qh->qhmem.cntlong,
    -           qh->qhmem.freelong,
    -           qh->qhmem.maxlong, qh->qhmem.totlong, qh->qhmem.cntlong - qh->qhmem.freelong);
    -}
    -
    -#endif /* qh_NOmem */
    -
    -/*---------------------------------
    -
    -  qh_memtotal(qh, totlong, curlong, totshort, curshort, maxlong, totbuffer )
    -    Return the total, allocated long and short memory
    -
    -  returns:
    -    Returns the total current bytes of long and short allocations
    -    Returns the current count of long and short allocations
    -    Returns the maximum long memory and total short buffer (minus one link per buffer)
    -    Does not error (for deprecated UsingLibQhull.cpp (libqhullpcpp))
    -*/
    -void qh_memtotal(qhT *qh, int *totlong, int *curlong, int *totshort, int *curshort, int *maxlong, int *totbuffer) {
    -    *totlong= qh->qhmem.totlong;
    -    *curlong= qh->qhmem.cntlong - qh->qhmem.freelong;
    -    *totshort= qh->qhmem.totshort;
    -    *curshort= qh->qhmem.cntshort + qh->qhmem.cntquick - qh->qhmem.freeshort;
    -    *maxlong= qh->qhmem.maxlong;
    -    *totbuffer= qh->qhmem.totbuffer;
    -} /* memtotlong */
    -
    diff --git a/src/qhull/src/libqhull_r/mem_r.h b/src/qhull/src/libqhull_r/mem_r.h
    deleted file mode 100644
    index 25b5513330e..00000000000
    --- a/src/qhull/src/libqhull_r/mem_r.h
    +++ /dev/null
    @@ -1,234 +0,0 @@
    -/*
      ---------------------------------
    -
    -   mem_r.h
    -     prototypes for memory management functions
    -
    -   see qh-mem_r.htm, mem_r.c and qset_r.h
    -
    -   for error handling, writes message and calls
    -     qh_errexit(qhT *qh, qhmem_ERRmem, NULL, NULL) if insufficient memory
    -       and
    -     qh_errexit(qhT *qh, qhmem_ERRqhull, NULL, NULL) otherwise
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull_r/mem_r.h#4 $$Change: 2079 $
    -   $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -*/
    -
    -#ifndef qhDEFmem
    -#define qhDEFmem 1
    -
    -#include 
    -
    -#ifndef DEFsetT
    -#define DEFsetT 1
    -typedef struct setT setT;          /* defined in qset_r.h */
    -#endif
    -
    -#ifndef DEFqhT
    -#define DEFqhT 1
    -typedef struct qhT qhT;          /* defined in libqhull_r.h */
    -#endif
    -
    -/*---------------------------------
    -
    -  qh_NOmem
    -    turn off quick-fit memory allocation
    -
    -  notes:
    -    mem_r.c implements Quickfit memory allocation for about 20% time
    -    savings.  If it fails on your machine, try to locate the
    -    problem, and send the answer to qhull@qhull.org.  If this can
    -    not be done, define qh_NOmem to use malloc/free instead.
    -
    -   #define qh_NOmem
    -*/
    -
    -/*---------------------------------
    -
    -qh_TRACEshort
    -Trace short and quick memory allocations at T5
    -
    -*/
    -#define qh_TRACEshort
    -
    -/*-------------------------------------------
    -    to avoid bus errors, memory allocation must consider alignment requirements.
    -    malloc() automatically takes care of alignment.   Since mem_r.c manages
    -    its own memory, we need to explicitly specify alignment in
    -    qh_meminitbuffers().
    -
    -    A safe choice is sizeof(double).  sizeof(float) may be used if doubles
    -    do not occur in data structures and pointers are the same size.  Be careful
    -    of machines (e.g., DEC Alpha) with large pointers.  If gcc is available,
    -    use __alignof__(double) or fmax_(__alignof__(float), __alignof__(void *)).
    -
    -   see qh_MEMalign in user.h for qhull's alignment
    -*/
    -
    -#define qhmem_ERRmem 4    /* matches qh_ERRmem in libqhull_r.h */
    -#define qhmem_ERRqhull 5  /* matches qh_ERRqhull in libqhull_r.h */
    -
    -/*----------------------------------
    -
    -  ptr_intT
    -    for casting a void * to an integer-type that holds a pointer
    -    Used for integer expressions (e.g., computing qh_gethash() in poly_r.c)
    -
    -  notes:
    -    WARN64 -- these notes indicate 64-bit issues
    -    On 64-bit machines, a pointer may be larger than an 'int'.
    -    qh_meminit()/mem_r.c checks that 'ptr_intT' holds a 'void*'
    -    ptr_intT is typically a signed value, but not necessarily so
    -    size_t is typically unsigned, but should match the parameter type
    -    Qhull uses int instead of size_t except for system calls such as malloc, qsort, qh_malloc, etc.
    -    This matches Qt convention and is easier to work with.
    -*/
    -#if (defined(__MINGW64__)) && defined(_WIN64)
    -typedef long long ptr_intT;
    -#elif (_MSC_VER) && defined(_WIN64)
    -typedef long long ptr_intT;
    -#else
    -typedef long ptr_intT;
    -#endif
    -
    -/*----------------------------------
    -
    -  qhmemT
    -    global memory structure for mem_r.c
    -
    - notes:
    -   users should ignore qhmem except for writing extensions
    -   qhmem is allocated in mem_r.c
    -
    -   qhmem could be swapable like qh and qhstat, but then
    -   multiple qh's and qhmem's would need to keep in synch.
    -   A swapable qhmem would also waste memory buffers.  As long
    -   as memory operations are atomic, there is no problem with
    -   multiple qh structures being active at the same time.
    -   If you need separate address spaces, you can swap the
    -   contents of qh->qhmem.
    -*/
    -typedef struct qhmemT qhmemT;
    -
    -/* Update qhmem in mem_r.c if add or remove fields */
    -struct qhmemT {               /* global memory management variables */
    -  int      BUFsize;           /* size of memory allocation buffer */
    -  int      BUFinit;           /* initial size of memory allocation buffer */
    -  int      TABLEsize;         /* actual number of sizes in free list table */
    -  int      NUMsizes;          /* maximum number of sizes in free list table */
    -  int      LASTsize;          /* last size in free list table */
    -  int      ALIGNmask;         /* worst-case alignment, must be 2^n-1 */
    -  void   **freelists;          /* free list table, linked by offset 0 */
    -  int     *sizetable;         /* size of each freelist */
    -  int     *indextable;        /* size->index table */
    -  void    *curbuffer;         /* current buffer, linked by offset 0 */
    -  void    *freemem;           /*   free memory in curbuffer */
    -  int      freesize;          /*   size of freemem in bytes */
    -  setT    *tempstack;         /* stack of temporary memory, managed by users */
    -  FILE    *ferr;              /* file for reporting errors when 'qh' may be undefined */
    -  int      IStracing;         /* =5 if tracing memory allocations */
    -  int      cntquick;          /* count of quick allocations */
    -                              /* Note: removing statistics doesn't effect speed */
    -  int      cntshort;          /* count of short allocations */
    -  int      cntlong;           /* count of long allocations */
    -  int      freeshort;         /* count of short memfrees */
    -  int      freelong;          /* count of long memfrees */
    -  int      totbuffer;         /* total short memory buffers minus buffer links */
    -  int      totdropped;        /* total dropped memory at end of short memory buffers (e.g., freesize) */
    -  int      totfree;           /* total size of free, short memory on freelists */
    -  int      totlong;           /* total size of long memory in use */
    -  int      maxlong;           /*   maximum totlong */
    -  int      totshort;          /* total size of short memory in use */
    -  int      totunused;         /* total unused short memory (estimated, short size - request size of first allocations) */
    -  int      cntlarger;         /* count of setlarger's */
    -  int      totlarger;         /* total copied by setlarger */
    -};
    -
    -
    -/*==================== -macros ====================*/
    -
    -/*----------------------------------
    -
    -  qh_memalloc_(qh, insize, freelistp, object, type)
    -    returns object of size bytes
    -        assumes size<=qh->qhmem.LASTsize and void **freelistp is a temp
    -*/
    -
    -#if defined qh_NOmem
    -#define qh_memalloc_(qh, insize, freelistp, object, type) {\
    -  object= (type*)qh_memalloc(qh, insize); }
    -#elif defined qh_TRACEshort
    -#define qh_memalloc_(qh, insize, freelistp, object, type) {\
    -    freelistp= NULL; /* Avoid warnings */ \
    -    object= (type*)qh_memalloc(qh, insize); }
    -#else /* !qh_NOmem */
    -
    -#define qh_memalloc_(qh, insize, freelistp, object, type) {\
    -  freelistp= qh->qhmem.freelists + qh->qhmem.indextable[insize];\
    -  if ((object= (type*)*freelistp)) {\
    -    qh->qhmem.totshort += qh->qhmem.sizetable[qh->qhmem.indextable[insize]]; \
    -    qh->qhmem.totfree -= qh->qhmem.sizetable[qh->qhmem.indextable[insize]]; \
    -    qh->qhmem.cntquick++;  \
    -    *freelistp= *((void **)*freelistp);\
    -  }else object= (type*)qh_memalloc(qh, insize);}
    -#endif
    -
    -/*----------------------------------
    -
    -  qh_memfree_(qh, object, insize, freelistp)
    -    free up an object
    -
    -  notes:
    -    object may be NULL
    -    assumes size<=qh->qhmem.LASTsize and void **freelistp is a temp
    -*/
    -#if defined qh_NOmem
    -#define qh_memfree_(qh, object, insize, freelistp) {\
    -  qh_memfree(qh, object, insize); }
    -#elif defined qh_TRACEshort
    -#define qh_memfree_(qh, object, insize, freelistp) {\
    -    freelistp= NULL; /* Avoid warnings */ \
    -    qh_memfree(qh, object, insize); }
    -#else /* !qh_NOmem */
    -
    -#define qh_memfree_(qh, object, insize, freelistp) {\
    -  if (object) { \
    -    qh->qhmem.freeshort++;\
    -    freelistp= qh->qhmem.freelists + qh->qhmem.indextable[insize];\
    -    qh->qhmem.totshort -= qh->qhmem.sizetable[qh->qhmem.indextable[insize]]; \
    -    qh->qhmem.totfree += qh->qhmem.sizetable[qh->qhmem.indextable[insize]]; \
    -    *((void **)object)= *freelistp;\
    -    *freelistp= object;}}
    -#endif
    -
    -/*=============== prototypes in alphabetical order ============*/
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -void *qh_memalloc(qhT *qh, int insize);
    -void qh_memcheck(qhT *qh);
    -void qh_memfree(qhT *qh, void *object, int insize);
    -void qh_memfreeshort(qhT *qh, int *curlong, int *totlong);
    -void qh_meminit(qhT *qh, FILE *ferr);
    -void qh_meminitbuffers(qhT *qh, int tracelevel, int alignment, int numsizes,
    -                        int bufsize, int bufinit);
    -void qh_memsetup(qhT *qh);
    -void qh_memsize(qhT *qh, int size);
    -void qh_memstatistics(qhT *qh, FILE *fp);
    -void qh_memtotal(qhT *qh, int *totlong, int *curlong, int *totshort, int *curshort, int *maxlong, int *totbuffer);
    -
    -#ifdef __cplusplus
    -} /* extern "C" */
    -#endif
    -
    -#endif /* qhDEFmem */
    diff --git a/src/qhull/src/libqhull_r/merge_r.c b/src/qhull/src/libqhull_r/merge_r.c
    deleted file mode 100644
    index e5823de8d18..00000000000
    --- a/src/qhull/src/libqhull_r/merge_r.c
    +++ /dev/null
    @@ -1,3627 +0,0 @@
    -/*
      ---------------------------------
    -
    -   merge_r.c
    -   merges non-convex facets
    -
    -   see qh-merge_r.htm and merge_r.h
    -
    -   other modules call qh_premerge() and qh_postmerge()
    -
    -   the user may call qh_postmerge() to perform additional merges.
    -
    -   To remove deleted facets and vertices (qhull() in libqhull_r.c):
    -     qh_partitionvisible(qh, !qh_ALL, &numoutside);  // visible_list, newfacet_list
    -     qh_deletevisible();         // qh.visible_list
    -     qh_resetlists(qh, False, qh_RESETvisible);       // qh.visible_list newvertex_list newfacet_list
    -
    -   assumes qh.CENTERtype= centrum
    -
    -   merges occur in qh_mergefacet and in qh_mergecycle
    -   vertex->neighbors not set until the first merge occurs
    -
    -   Copyright (c) 1993-2015 C.B. Barber.
    -   $Id: //main/2015/qhull/src/libqhull_r/merge_r.c#5 $$Change: 2064 $
    -   $DateTime: 2016/01/18 12:36:08 $$Author: bbarber $
    -*/
    -
    -#include "qhull_ra.h"
    -
    -#ifndef qh_NOmerge
    -
    -/*===== functions(alphabetical after premerge and postmerge) ======*/
    -
    -/*---------------------------------
    -
    -  qh_premerge(qh, apex, maxcentrum )
    -    pre-merge nonconvex facets in qh.newfacet_list for apex
    -    maxcentrum defines coplanar and concave (qh_test_appendmerge)
    -
    -  returns:
    -    deleted facets added to qh.visible_list with facet->visible set
    -
    -  notes:
    -    uses globals, qh.MERGEexact, qh.PREmerge
    -
    -  design:
    -    mark duplicate ridges in qh.newfacet_list
    -    merge facet cycles in qh.newfacet_list
    -    merge duplicate ridges and concave facets in qh.newfacet_list
    -    check merged facet cycles for degenerate and redundant facets
    -    merge degenerate and redundant facets
    -    collect coplanar and concave facets
    -    merge concave, coplanar, degenerate, and redundant facets
    -*/
    -void qh_premerge(qhT *qh, vertexT *apex, realT maxcentrum, realT maxangle) {
    -  boolT othermerge= False;
    -  facetT *newfacet;
    -
    -  if (qh->ZEROcentrum && qh_checkzero(qh, !qh_ALL))
    -    return;
    -  trace2((qh, qh->ferr, 2008, "qh_premerge: premerge centrum %2.2g angle %2.2g for apex v%d facetlist f%d\n",
    -            maxcentrum, maxangle, apex->id, getid_(qh->newfacet_list)));
    -  if (qh->IStracing >= 4 && qh->num_facets < 50)
    -    qh_printlists(qh);
    -  qh->centrum_radius= maxcentrum;
    -  qh->cos_max= maxangle;
    -  qh->degen_mergeset= qh_settemp(qh, qh->TEMPsize);
    -  qh->facet_mergeset= qh_settemp(qh, qh->TEMPsize);
    -  if (qh->hull_dim >=3) {
    -    qh_mark_dupridges(qh, qh->newfacet_list); /* facet_mergeset */
    -    qh_mergecycle_all(qh, qh->newfacet_list, &othermerge);
    -    qh_forcedmerges(qh, &othermerge /* qh->facet_mergeset */);
    -    FORALLnew_facets {  /* test samecycle merges */
    -      if (!newfacet->simplicial && !newfacet->mergeridge)
    -        qh_degen_redundant_neighbors(qh, newfacet, NULL);
    -    }
    -    if (qh_merge_degenredundant(qh))
    -      othermerge= True;
    -  }else /* qh->hull_dim == 2 */
    -    qh_mergecycle_all(qh, qh->newfacet_list, &othermerge);
    -  qh_flippedmerges(qh, qh->newfacet_list, &othermerge);
    -  if (!qh->MERGEexact || zzval_(Ztotmerge)) {
    -    zinc_(Zpremergetot);
    -    qh->POSTmerging= False;
    -    qh_getmergeset_initial(qh, qh->newfacet_list);
    -    qh_all_merges(qh, othermerge, False);
    -  }
    -  qh_settempfree(qh, &qh->facet_mergeset);
    -  qh_settempfree(qh, &qh->degen_mergeset);
    -} /* premerge */
    -
    -/*---------------------------------
    -
    -  qh_postmerge(qh, reason, maxcentrum, maxangle, vneighbors )
    -    post-merge nonconvex facets as defined by maxcentrum and maxangle
    -    'reason' is for reporting progress
    -    if vneighbors,
    -      calls qh_test_vneighbors at end of qh_all_merge
    -    if firstmerge,
    -      calls qh_reducevertices before qh_getmergeset
    -
    -  returns:
    -    if first call (qh.visible_list != qh.facet_list),
    -      builds qh.facet_newlist, qh.newvertex_list
    -    deleted facets added to qh.visible_list with facet->visible
    -    qh.visible_list == qh.facet_list
    -
    -  notes:
    -
    -
    -  design:
    -    if first call
    -      set qh.visible_list and qh.newfacet_list to qh.facet_list
    -      add all facets to qh.newfacet_list
    -      mark non-simplicial facets, facet->newmerge
    -      set qh.newvertext_list to qh.vertex_list
    -      add all vertices to qh.newvertex_list
    -      if a pre-merge occured
    -        set vertex->delridge {will retest the ridge}
    -        if qh.MERGEexact
    -          call qh_reducevertices()
    -      if no pre-merging
    -        merge flipped facets
    -    determine non-convex facets
    -    merge all non-convex facets
    -*/
    -void qh_postmerge(qhT *qh, const char *reason, realT maxcentrum, realT maxangle,
    -                      boolT vneighbors) {
    -  facetT *newfacet;
    -  boolT othermerges= False;
    -  vertexT *vertex;
    -
    -  if (qh->REPORTfreq || qh->IStracing) {
    -    qh_buildtracing(qh, NULL, NULL);
    -    qh_printsummary(qh, qh->ferr);
    -    if (qh->PRINTstatistics)
    -      qh_printallstatistics(qh, qh->ferr, "reason");
    -    qh_fprintf(qh, qh->ferr, 8062, "\n%s with 'C%.2g' and 'A%.2g'\n",
    -        reason, maxcentrum, maxangle);
    -  }
    -  trace2((qh, qh->ferr, 2009, "qh_postmerge: postmerge.  test vneighbors? %d\n",
    -            vneighbors));
    -  qh->centrum_radius= maxcentrum;
    -  qh->cos_max= maxangle;
    -  qh->POSTmerging= True;
    -  qh->degen_mergeset= qh_settemp(qh, qh->TEMPsize);
    -  qh->facet_mergeset= qh_settemp(qh, qh->TEMPsize);
    -  if (qh->visible_list != qh->facet_list) {  /* first call */
    -    qh->NEWfacets= True;
    -    qh->visible_list= qh->newfacet_list= qh->facet_list;
    -    FORALLnew_facets {
    -      newfacet->newfacet= True;
    -       if (!newfacet->simplicial)
    -        newfacet->newmerge= True;
    -     zinc_(Zpostfacets);
    -    }
    -    qh->newvertex_list= qh->vertex_list;
    -    FORALLvertices
    -      vertex->newlist= True;
    -    if (qh->VERTEXneighbors) { /* a merge has occurred */
    -      FORALLvertices
    -        vertex->delridge= True; /* test for redundant, needed? */
    -      if (qh->MERGEexact) {
    -        if (qh->hull_dim <= qh_DIMreduceBuild)
    -          qh_reducevertices(qh); /* was skipped during pre-merging */
    -      }
    -    }
    -    if (!qh->PREmerge && !qh->MERGEexact)
    -      qh_flippedmerges(qh, qh->newfacet_list, &othermerges);
    -  }
    -  qh_getmergeset_initial(qh, qh->newfacet_list);
    -  qh_all_merges(qh, False, vneighbors);
    -  qh_settempfree(qh, &qh->facet_mergeset);
    -  qh_settempfree(qh, &qh->degen_mergeset);
    -} /* post_merge */
    -
    -/*---------------------------------
    -
    -  qh_all_merges(qh, othermerge, vneighbors )
    -    merge all non-convex facets
    -
    -    set othermerge if already merged facets (for qh_reducevertices)
    -    if vneighbors
    -      tests vertex neighbors for convexity at end
    -    qh.facet_mergeset lists the non-convex ridges in qh_newfacet_list
    -    qh.degen_mergeset is defined
    -    if qh.MERGEexact && !qh.POSTmerging,
    -      does not merge coplanar facets
    -
    -  returns:
    -    deleted facets added to qh.visible_list with facet->visible
    -    deleted vertices added qh.delvertex_list with vertex->delvertex
    -
    -  notes:
    -    unless !qh.MERGEindependent,
    -      merges facets in independent sets
    -    uses qh.newfacet_list as argument since merges call qh_removefacet()
    -
    -  design:
    -    while merges occur
    -      for each merge in qh.facet_mergeset
    -        unless one of the facets was already merged in this pass
    -          merge the facets
    -        test merged facets for additional merges
    -        add merges to qh.facet_mergeset
    -      if vertices record neighboring facets
    -        rename redundant vertices
    -          update qh.facet_mergeset
    -    if vneighbors ??
    -      tests vertex neighbors for convexity at end
    -*/
    -void qh_all_merges(qhT *qh, boolT othermerge, boolT vneighbors) {
    -  facetT *facet1, *facet2;
    -  mergeT *merge;
    -  boolT wasmerge= True, isreduce;
    -  void **freelistp;  /* used if !qh_NOmem by qh_memfree_() */
    -  vertexT *vertex;
    -  mergeType mergetype;
    -  int numcoplanar=0, numconcave=0, numdegenredun= 0, numnewmerges= 0;
    -
    -  trace2((qh, qh->ferr, 2010, "qh_all_merges: starting to merge facets beginning from f%d\n",
    -            getid_(qh->newfacet_list)));
    -  while (True) {
    -    wasmerge= False;
    -    while (qh_setsize(qh, qh->facet_mergeset)) {
    -      while ((merge= (mergeT*)qh_setdellast(qh->facet_mergeset))) {
    -        facet1= merge->facet1;
    -        facet2= merge->facet2;
    -        mergetype= merge->type;
    -        qh_memfree_(qh, merge, (int)sizeof(mergeT), freelistp);
    -        if (facet1->visible || facet2->visible) /*deleted facet*/
    -          continue;
    -        if ((facet1->newfacet && !facet1->tested)
    -                || (facet2->newfacet && !facet2->tested)) {
    -          if (qh->MERGEindependent && mergetype <= MRGanglecoplanar)
    -            continue;      /* perform independent sets of merges */
    -        }
    -        qh_merge_nonconvex(qh, facet1, facet2, mergetype);
    -        numdegenredun += qh_merge_degenredundant(qh);
    -        numnewmerges++;
    -        wasmerge= True;
    -        if (mergetype == MRGconcave)
    -          numconcave++;
    -        else /* MRGcoplanar or MRGanglecoplanar */
    -          numcoplanar++;
    -      } /* while setdellast */
    -      if (qh->POSTmerging && qh->hull_dim <= qh_DIMreduceBuild
    -      && numnewmerges > qh_MAXnewmerges) {
    -        numnewmerges= 0;
    -        qh_reducevertices(qh);  /* otherwise large post merges too slow */
    -      }
    -      qh_getmergeset(qh, qh->newfacet_list); /* facet_mergeset */
    -    } /* while mergeset */
    -    if (qh->VERTEXneighbors) {
    -      isreduce= False;
    -      if (qh->hull_dim >=4 && qh->POSTmerging) {
    -        FORALLvertices
    -          vertex->delridge= True;
    -        isreduce= True;
    -      }
    -      if ((wasmerge || othermerge) && (!qh->MERGEexact || qh->POSTmerging)
    -          && qh->hull_dim <= qh_DIMreduceBuild) {
    -        othermerge= False;
    -        isreduce= True;
    -      }
    -      if (isreduce) {
    -        if (qh_reducevertices(qh)) {
    -          qh_getmergeset(qh, qh->newfacet_list); /* facet_mergeset */
    -          continue;
    -        }
    -      }
    -    }
    -    if (vneighbors && qh_test_vneighbors(qh /* qh->newfacet_list */))
    -      continue;
    -    break;
    -  } /* while (True) */
    -  if (qh->CHECKfrequently && !qh->MERGEexact) {
    -    qh->old_randomdist= qh->RANDOMdist;
    -    qh->RANDOMdist= False;
    -    qh_checkconvex(qh, qh->newfacet_list, qh_ALGORITHMfault);
    -    /* qh_checkconnect(qh); [this is slow and it changes the facet order] */
    -    qh->RANDOMdist= qh->old_randomdist;
    -  }
    -  trace1((qh, qh->ferr, 1009, "qh_all_merges: merged %d coplanar facets %d concave facets and %d degen or redundant facets.\n",
    -    numcoplanar, numconcave, numdegenredun));
    -  if (qh->IStracing >= 4 && qh->num_facets < 50)
    -    qh_printlists(qh);
    -} /* all_merges */
    -
    -
    -/*---------------------------------
    -
    -  qh_appendmergeset(qh, facet, neighbor, mergetype, angle )
    -    appends an entry to qh.facet_mergeset or qh.degen_mergeset
    -
    -    angle ignored if NULL or !qh.ANGLEmerge
    -
    -  returns:
    -    merge appended to facet_mergeset or degen_mergeset
    -      sets ->degenerate or ->redundant if degen_mergeset
    -
    -  see:
    -    qh_test_appendmerge()
    -
    -  design:
    -    allocate merge entry
    -    if regular merge
    -      append to qh.facet_mergeset
    -    else if degenerate merge and qh.facet_mergeset is all degenerate
    -      append to qh.degen_mergeset
    -    else if degenerate merge
    -      prepend to qh.degen_mergeset
    -    else if redundant merge
    -      append to qh.degen_mergeset
    -*/
    -void qh_appendmergeset(qhT *qh, facetT *facet, facetT *neighbor, mergeType mergetype, realT *angle) {
    -  mergeT *merge, *lastmerge;
    -  void **freelistp; /* used if !qh_NOmem by qh_memalloc_() */
    -
    -  if (facet->redundant)
    -    return;
    -  if (facet->degenerate && mergetype == MRGdegen)
    -    return;
    -  qh_memalloc_(qh, (int)sizeof(mergeT), freelistp, merge, mergeT);
    -  merge->facet1= facet;
    -  merge->facet2= neighbor;
    -  merge->type= mergetype;
    -  if (angle && qh->ANGLEmerge)
    -    merge->angle= *angle;
    -  if (mergetype < MRGdegen)
    -    qh_setappend(qh, &(qh->facet_mergeset), merge);
    -  else if (mergetype == MRGdegen) {
    -    facet->degenerate= True;
    -    if (!(lastmerge= (mergeT*)qh_setlast(qh->degen_mergeset))
    -    || lastmerge->type == MRGdegen)
    -      qh_setappend(qh, &(qh->degen_mergeset), merge);
    -    else
    -      qh_setaddnth(qh, &(qh->degen_mergeset), 0, merge);
    -  }else if (mergetype == MRGredundant) {
    -    facet->redundant= True;
    -    qh_setappend(qh, &(qh->degen_mergeset), merge);
    -  }else /* mergetype == MRGmirror */ {
    -    if (facet->redundant || neighbor->redundant) {
    -      qh_fprintf(qh, qh->ferr, 6092, "qhull error (qh_appendmergeset): facet f%d or f%d is already a mirrored facet\n",
    -           facet->id, neighbor->id);
    -      qh_errexit2(qh, qh_ERRqhull, facet, neighbor);
    -    }
    -    if (!qh_setequal(facet->vertices, neighbor->vertices)) {
    -      qh_fprintf(qh, qh->ferr, 6093, "qhull error (qh_appendmergeset): mirrored facets f%d and f%d do not have the same vertices\n",
    -           facet->id, neighbor->id);
    -      qh_errexit2(qh, qh_ERRqhull, facet, neighbor);
    -    }
    -    facet->redundant= True;
    -    neighbor->redundant= True;
    -    qh_setappend(qh, &(qh->degen_mergeset), merge);
    -  }
    -} /* appendmergeset */
    -
    -
    -/*---------------------------------
    -
    -  qh_basevertices(qh, samecycle )
    -    return temporary set of base vertices for samecycle
    -    samecycle is first facet in the cycle
    -    assumes apex is SETfirst_( samecycle->vertices )
    -
    -  returns:
    -    vertices(settemp)
    -    all ->seen are cleared
    -
    -  notes:
    -    uses qh_vertex_visit;
    -
    -  design:
    -    for each facet in samecycle
    -      for each unseen vertex in facet->vertices
    -        append to result
    -*/
    -setT *qh_basevertices(qhT *qh, facetT *samecycle) {
    -  facetT *same;
    -  vertexT *apex, *vertex, **vertexp;
    -  setT *vertices= qh_settemp(qh, qh->TEMPsize);
    -
    -  apex= SETfirstt_(samecycle->vertices, vertexT);
    -  apex->visitid= ++qh->vertex_visit;
    -  FORALLsame_cycle_(samecycle) {
    -    if (same->mergeridge)
    -      continue;
    -    FOREACHvertex_(same->vertices) {
    -      if (vertex->visitid != qh->vertex_visit) {
    -        qh_setappend(qh, &vertices, vertex);
    -        vertex->visitid= qh->vertex_visit;
    -        vertex->seen= False;
    -      }
    -    }
    -  }
    -  trace4((qh, qh->ferr, 4019, "qh_basevertices: found %d vertices\n",
    -         qh_setsize(qh, vertices)));
    -  return vertices;
    -} /* basevertices */
    -
    -/*---------------------------------
    -
    -  qh_checkconnect(qh)
    -    check that new facets are connected
    -    new facets are on qh.newfacet_list
    -
    -  notes:
    -    this is slow and it changes the order of the facets
    -    uses qh.visit_id
    -
    -  design:
    -    move first new facet to end of qh.facet_list
    -    for all newly appended facets
    -      append unvisited neighbors to end of qh.facet_list
    -    for all new facets
    -      report error if unvisited
    -*/
    -void qh_checkconnect(qhT *qh /* qh->newfacet_list */) {
    -  facetT *facet, *newfacet, *errfacet= NULL, *neighbor, **neighborp;
    -
    -  facet= qh->newfacet_list;
    -  qh_removefacet(qh, facet);
    -  qh_appendfacet(qh, facet);
    -  facet->visitid= ++qh->visit_id;
    -  FORALLfacet_(facet) {
    -    FOREACHneighbor_(facet) {
    -      if (neighbor->visitid != qh->visit_id) {
    -        qh_removefacet(qh, neighbor);
    -        qh_appendfacet(qh, neighbor);
    -        neighbor->visitid= qh->visit_id;
    -      }
    -    }
    -  }
    -  FORALLnew_facets {
    -    if (newfacet->visitid == qh->visit_id)
    -      break;
    -    qh_fprintf(qh, qh->ferr, 6094, "qhull error: f%d is not attached to the new facets\n",
    -         newfacet->id);
    -    errfacet= newfacet;
    -  }
    -  if (errfacet)
    -    qh_errexit(qh, qh_ERRqhull, errfacet, NULL);
    -} /* checkconnect */
    -
    -/*---------------------------------
    -
    -  qh_checkzero(qh, testall )
    -    check that facets are clearly convex for qh.DISTround with qh.MERGEexact
    -
    -    if testall,
    -      test all facets for qh.MERGEexact post-merging
    -    else
    -      test qh.newfacet_list
    -
    -    if qh.MERGEexact,
    -      allows coplanar ridges
    -      skips convexity test while qh.ZEROall_ok
    -
    -  returns:
    -    True if all facets !flipped, !dupridge, normal
    -         if all horizon facets are simplicial
    -         if all vertices are clearly below neighbor
    -         if all opposite vertices of horizon are below
    -    clears qh.ZEROall_ok if any problems or coplanar facets
    -
    -  notes:
    -    uses qh.vertex_visit
    -    horizon facets may define multiple new facets
    -
    -  design:
    -    for all facets in qh.newfacet_list or qh.facet_list
    -      check for flagged faults (flipped, etc.)
    -    for all facets in qh.newfacet_list or qh.facet_list
    -      for each neighbor of facet
    -        skip horizon facets for qh.newfacet_list
    -        test the opposite vertex
    -      if qh.newfacet_list
    -        test the other vertices in the facet's horizon facet
    -*/
    -boolT qh_checkzero(qhT *qh, boolT testall) {
    -  facetT *facet, *neighbor, **neighborp;
    -  facetT *horizon, *facetlist;
    -  int neighbor_i;
    -  vertexT *vertex, **vertexp;
    -  realT dist;
    -
    -  if (testall)
    -    facetlist= qh->facet_list;
    -  else {
    -    facetlist= qh->newfacet_list;
    -    FORALLfacet_(facetlist) {
    -      horizon= SETfirstt_(facet->neighbors, facetT);
    -      if (!horizon->simplicial)
    -        goto LABELproblem;
    -      if (facet->flipped || facet->dupridge || !facet->normal)
    -        goto LABELproblem;
    -    }
    -    if (qh->MERGEexact && qh->ZEROall_ok) {
    -      trace2((qh, qh->ferr, 2011, "qh_checkzero: skip convexity check until first pre-merge\n"));
    -      return True;
    -    }
    -  }
    -  FORALLfacet_(facetlist) {
    -    qh->vertex_visit++;
    -    neighbor_i= 0;
    -    horizon= NULL;
    -    FOREACHneighbor_(facet) {
    -      if (!neighbor_i && !testall) {
    -        horizon= neighbor;
    -        neighbor_i++;
    -        continue; /* horizon facet tested in qh_findhorizon */
    -      }
    -      vertex= SETelemt_(facet->vertices, neighbor_i++, vertexT);
    -      vertex->visitid= qh->vertex_visit;
    -      zzinc_(Zdistzero);
    -      qh_distplane(qh, vertex->point, neighbor, &dist);
    -      if (dist >= -qh->DISTround) {
    -        qh->ZEROall_ok= False;
    -        if (!qh->MERGEexact || testall || dist > qh->DISTround)
    -          goto LABELnonconvex;
    -      }
    -    }
    -    if (!testall && horizon) {
    -      FOREACHvertex_(horizon->vertices) {
    -        if (vertex->visitid != qh->vertex_visit) {
    -          zzinc_(Zdistzero);
    -          qh_distplane(qh, vertex->point, facet, &dist);
    -          if (dist >= -qh->DISTround) {
    -            qh->ZEROall_ok= False;
    -            if (!qh->MERGEexact || dist > qh->DISTround)
    -              goto LABELnonconvex;
    -          }
    -          break;
    -        }
    -      }
    -    }
    -  }
    -  trace2((qh, qh->ferr, 2012, "qh_checkzero: testall %d, facets are %s\n", testall,
    -        (qh->MERGEexact && !testall) ?
    -           "not concave, flipped, or duplicate ridged" : "clearly convex"));
    -  return True;
    -
    - LABELproblem:
    -  qh->ZEROall_ok= False;
    -  trace2((qh, qh->ferr, 2013, "qh_checkzero: facet f%d needs pre-merging\n",
    -       facet->id));
    -  return False;
    -
    - LABELnonconvex:
    -  trace2((qh, qh->ferr, 2014, "qh_checkzero: facet f%d and f%d are not clearly convex.  v%d dist %.2g\n",
    -         facet->id, neighbor->id, vertex->id, dist));
    -  return False;
    -} /* checkzero */
    -
    -/*---------------------------------
    -
    -  qh_compareangle(angle1, angle2 )
    -    used by qsort() to order merges by angle
    -*/
    -int qh_compareangle(const void *p1, const void *p2) {
    -  const mergeT *a= *((mergeT *const*)p1), *b= *((mergeT *const*)p2);
    -
    -  return((a->angle > b->angle) ? 1 : -1);
    -} /* compareangle */
    -
    -/*---------------------------------
    -
    -  qh_comparemerge(merge1, merge2 )
    -    used by qsort() to order merges
    -*/
    -int qh_comparemerge(const void *p1, const void *p2) {
    -  const mergeT *a= *((mergeT *const*)p1), *b= *((mergeT *const*)p2);
    -
    -  return(a->type - b->type);
    -} /* comparemerge */
    -
    -/*---------------------------------
    -
    -  qh_comparevisit(vertex1, vertex2 )
    -    used by qsort() to order vertices by their visitid
    -*/
    -int qh_comparevisit(const void *p1, const void *p2) {
    -  const vertexT *a= *((vertexT *const*)p1), *b= *((vertexT *const*)p2);
    -
    -  return(a->visitid - b->visitid);
    -} /* comparevisit */
    -
    -/*---------------------------------
    -
    -  qh_copynonconvex(qh, atridge )
    -    set non-convex flag on other ridges (if any) between same neighbors
    -
    -  notes:
    -    may be faster if use smaller ridge set
    -
    -  design:
    -    for each ridge of atridge's top facet
    -      if ridge shares the same neighbor
    -        set nonconvex flag
    -*/
    -void qh_copynonconvex(qhT *qh, ridgeT *atridge) {
    -  facetT *facet, *otherfacet;
    -  ridgeT *ridge, **ridgep;
    -
    -  facet= atridge->top;
    -  otherfacet= atridge->bottom;
    -  FOREACHridge_(facet->ridges) {
    -    if (otherfacet == otherfacet_(ridge, facet) && ridge != atridge) {
    -      ridge->nonconvex= True;
    -      trace4((qh, qh->ferr, 4020, "qh_copynonconvex: moved nonconvex flag from r%d to r%d\n",
    -              atridge->id, ridge->id));
    -      break;
    -    }
    -  }
    -} /* copynonconvex */
    -
    -/*---------------------------------
    -
    -  qh_degen_redundant_facet(qh, facet )
    -    check facet for degen. or redundancy
    -
    -  notes:
    -    bumps vertex_visit
    -    called if a facet was redundant but no longer is (qh_merge_degenredundant)
    -    qh_appendmergeset() only appends first reference to facet (i.e., redundant)
    -
    -  see:
    -    qh_degen_redundant_neighbors()
    -
    -  design:
    -    test for redundant neighbor
    -    test for degenerate facet
    -*/
    -void qh_degen_redundant_facet(qhT *qh, facetT *facet) {
    -  vertexT *vertex, **vertexp;
    -  facetT *neighbor, **neighborp;
    -
    -  trace4((qh, qh->ferr, 4021, "qh_degen_redundant_facet: test facet f%d for degen/redundant\n",
    -          facet->id));
    -  FOREACHneighbor_(facet) {
    -    qh->vertex_visit++;
    -    FOREACHvertex_(neighbor->vertices)
    -      vertex->visitid= qh->vertex_visit;
    -    FOREACHvertex_(facet->vertices) {
    -      if (vertex->visitid != qh->vertex_visit)
    -        break;
    -    }
    -    if (!vertex) {
    -      qh_appendmergeset(qh, facet, neighbor, MRGredundant, NULL);
    -      trace2((qh, qh->ferr, 2015, "qh_degen_redundant_facet: f%d is contained in f%d.  merge\n", facet->id, neighbor->id));
    -      return;
    -    }
    -  }
    -  if (qh_setsize(qh, facet->neighbors) < qh->hull_dim) {
    -    qh_appendmergeset(qh, facet, facet, MRGdegen, NULL);
    -    trace2((qh, qh->ferr, 2016, "qh_degen_redundant_neighbors: f%d is degenerate.\n", facet->id));
    -  }
    -} /* degen_redundant_facet */
    -
    -
    -/*---------------------------------
    -
    -  qh_degen_redundant_neighbors(qh, facet, delfacet,  )
    -    append degenerate and redundant neighbors to facet_mergeset
    -    if delfacet,
    -      only checks neighbors of both delfacet and facet
    -    also checks current facet for degeneracy
    -
    -  notes:
    -    bumps vertex_visit
    -    called for each qh_mergefacet() and qh_mergecycle()
    -    merge and statistics occur in merge_nonconvex
    -    qh_appendmergeset() only appends first reference to facet (i.e., redundant)
    -      it appends redundant facets after degenerate ones
    -
    -    a degenerate facet has fewer than hull_dim neighbors
    -    a redundant facet's vertices is a subset of its neighbor's vertices
    -    tests for redundant merges first (appendmergeset is nop for others)
    -    in a merge, only needs to test neighbors of merged facet
    -
    -  see:
    -    qh_merge_degenredundant() and qh_degen_redundant_facet()
    -
    -  design:
    -    test for degenerate facet
    -    test for redundant neighbor
    -    test for degenerate neighbor
    -*/
    -void qh_degen_redundant_neighbors(qhT *qh, facetT *facet, facetT *delfacet) {
    -  vertexT *vertex, **vertexp;
    -  facetT *neighbor, **neighborp;
    -  int size;
    -
    -  trace4((qh, qh->ferr, 4022, "qh_degen_redundant_neighbors: test neighbors of f%d with delfacet f%d\n",
    -          facet->id, getid_(delfacet)));
    -  if ((size= qh_setsize(qh, facet->neighbors)) < qh->hull_dim) {
    -    qh_appendmergeset(qh, facet, facet, MRGdegen, NULL);
    -    trace2((qh, qh->ferr, 2017, "qh_degen_redundant_neighbors: f%d is degenerate with %d neighbors.\n", facet->id, size));
    -  }
    -  if (!delfacet)
    -    delfacet= facet;
    -  qh->vertex_visit++;
    -  FOREACHvertex_(facet->vertices)
    -    vertex->visitid= qh->vertex_visit;
    -  FOREACHneighbor_(delfacet) {
    -    /* uses early out instead of checking vertex count */
    -    if (neighbor == facet)
    -      continue;
    -    FOREACHvertex_(neighbor->vertices) {
    -      if (vertex->visitid != qh->vertex_visit)
    -        break;
    -    }
    -    if (!vertex) {
    -      qh_appendmergeset(qh, neighbor, facet, MRGredundant, NULL);
    -      trace2((qh, qh->ferr, 2018, "qh_degen_redundant_neighbors: f%d is contained in f%d.  merge\n", neighbor->id, facet->id));
    -    }
    -  }
    -  FOREACHneighbor_(delfacet) {   /* redundant merges occur first */
    -    if (neighbor == facet)
    -      continue;
    -    if ((size= qh_setsize(qh, neighbor->neighbors)) < qh->hull_dim) {
    -      qh_appendmergeset(qh, neighbor, neighbor, MRGdegen, NULL);
    -      trace2((qh, qh->ferr, 2019, "qh_degen_redundant_neighbors: f%d is degenerate with %d neighbors.  Neighbor of f%d.\n", neighbor->id, size, facet->id));
    -    }
    -  }
    -} /* degen_redundant_neighbors */
    -
    -
    -/*---------------------------------
    -
    -  qh_find_newvertex(qh, oldvertex, vertices, ridges )
    -    locate new vertex for renaming old vertex
    -    vertices is a set of possible new vertices
    -      vertices sorted by number of deleted ridges
    -
    -  returns:
    -    newvertex or NULL
    -      each ridge includes both vertex and oldvertex
    -    vertices sorted by number of deleted ridges
    -
    -  notes:
    -    modifies vertex->visitid
    -    new vertex is in one of the ridges
    -    renaming will not cause a duplicate ridge
    -    renaming will minimize the number of deleted ridges
    -    newvertex may not be adjacent in the dual (though unlikely)
    -
    -  design:
    -    for each vertex in vertices
    -      set vertex->visitid to number of references in ridges
    -    remove unvisited vertices
    -    set qh.vertex_visit above all possible values
    -    sort vertices by number of references in ridges
    -    add each ridge to qh.hash_table
    -    for each vertex in vertices
    -      look for a vertex that would not cause a duplicate ridge after a rename
    -*/
    -vertexT *qh_find_newvertex(qhT *qh, vertexT *oldvertex, setT *vertices, setT *ridges) {
    -  vertexT *vertex, **vertexp;
    -  setT *newridges;
    -  ridgeT *ridge, **ridgep;
    -  int size, hashsize;
    -  int hash;
    -
    -#ifndef qh_NOtrace
    -  if (qh->IStracing >= 4) {
    -    qh_fprintf(qh, qh->ferr, 8063, "qh_find_newvertex: find new vertex for v%d from ",
    -             oldvertex->id);
    -    FOREACHvertex_(vertices)
    -      qh_fprintf(qh, qh->ferr, 8064, "v%d ", vertex->id);
    -    FOREACHridge_(ridges)
    -      qh_fprintf(qh, qh->ferr, 8065, "r%d ", ridge->id);
    -    qh_fprintf(qh, qh->ferr, 8066, "\n");
    -  }
    -#endif
    -  FOREACHvertex_(vertices)
    -    vertex->visitid= 0;
    -  FOREACHridge_(ridges) {
    -    FOREACHvertex_(ridge->vertices)
    -      vertex->visitid++;
    -  }
    -  FOREACHvertex_(vertices) {
    -    if (!vertex->visitid) {
    -      qh_setdelnth(qh, vertices, SETindex_(vertices,vertex));
    -      vertexp--; /* repeat since deleted this vertex */
    -    }
    -  }
    -  qh->vertex_visit += (unsigned int)qh_setsize(qh, ridges);
    -  if (!qh_setsize(qh, vertices)) {
    -    trace4((qh, qh->ferr, 4023, "qh_find_newvertex: vertices not in ridges for v%d\n",
    -            oldvertex->id));
    -    return NULL;
    -  }
    -  qsort(SETaddr_(vertices, vertexT), (size_t)qh_setsize(qh, vertices),
    -                sizeof(vertexT *), qh_comparevisit);
    -  /* can now use qh->vertex_visit */
    -  if (qh->PRINTstatistics) {
    -    size= qh_setsize(qh, vertices);
    -    zinc_(Zintersect);
    -    zadd_(Zintersecttot, size);
    -    zmax_(Zintersectmax, size);
    -  }
    -  hashsize= qh_newhashtable(qh, qh_setsize(qh, ridges));
    -  FOREACHridge_(ridges)
    -    qh_hashridge(qh, qh->hash_table, hashsize, ridge, oldvertex);
    -  FOREACHvertex_(vertices) {
    -    newridges= qh_vertexridges(qh, vertex);
    -    FOREACHridge_(newridges) {
    -      if (qh_hashridge_find(qh, qh->hash_table, hashsize, ridge, vertex, oldvertex, &hash)) {
    -        zinc_(Zdupridge);
    -        break;
    -      }
    -    }
    -    qh_settempfree(qh, &newridges);
    -    if (!ridge)
    -      break;  /* found a rename */
    -  }
    -  if (vertex) {
    -    /* counted in qh_renamevertex */
    -    trace2((qh, qh->ferr, 2020, "qh_find_newvertex: found v%d for old v%d from %d vertices and %d ridges.\n",
    -      vertex->id, oldvertex->id, qh_setsize(qh, vertices), qh_setsize(qh, ridges)));
    -  }else {
    -    zinc_(Zfindfail);
    -    trace0((qh, qh->ferr, 14, "qh_find_newvertex: no vertex for renaming v%d(all duplicated ridges) during p%d\n",
    -      oldvertex->id, qh->furthest_id));
    -  }
    -  qh_setfree(qh, &qh->hash_table);
    -  return vertex;
    -} /* find_newvertex */
    -
    -/*---------------------------------
    -
    -  qh_findbest_test(qh, testcentrum, facet, neighbor, bestfacet, dist, mindist, maxdist )
    -    test neighbor of facet for qh_findbestneighbor()
    -    if testcentrum,
    -      tests centrum (assumes it is defined)
    -    else
    -      tests vertices
    -
    -  returns:
    -    if a better facet (i.e., vertices/centrum of facet closer to neighbor)
    -      updates bestfacet, dist, mindist, and maxdist
    -*/
    -void qh_findbest_test(qhT *qh, boolT testcentrum, facetT *facet, facetT *neighbor,
    -      facetT **bestfacet, realT *distp, realT *mindistp, realT *maxdistp) {
    -  realT dist, mindist, maxdist;
    -
    -  if (testcentrum) {
    -    zzinc_(Zbestdist);
    -    qh_distplane(qh, facet->center, neighbor, &dist);
    -    dist *= qh->hull_dim; /* estimate furthest vertex */
    -    if (dist < 0) {
    -      maxdist= 0;
    -      mindist= dist;
    -      dist= -dist;
    -    }else {
    -      mindist= 0;
    -      maxdist= dist;
    -    }
    -  }else
    -    dist= qh_getdistance(qh, facet, neighbor, &mindist, &maxdist);
    -  if (dist < *distp) {
    -    *bestfacet= neighbor;
    -    *mindistp= mindist;
    -    *maxdistp= maxdist;
    -    *distp= dist;
    -  }
    -} /* findbest_test */
    -
    -/*---------------------------------
    -
    -  qh_findbestneighbor(qh, facet, dist, mindist, maxdist )
    -    finds best neighbor (least dist) of a facet for merging
    -
    -  returns:
    -    returns min and max distances and their max absolute value
    -
    -  notes:
    -    error if qh_ASvoronoi
    -    avoids merging old into new
    -    assumes ridge->nonconvex only set on one ridge between a pair of facets
    -    could use an early out predicate but not worth it
    -
    -  design:
    -    if a large facet
    -      will test centrum
    -    else
    -      will test vertices
    -    if a large facet
    -      test nonconvex neighbors for best merge
    -    else
    -      test all neighbors for the best merge
    -    if testing centrum
    -      get distance information
    -*/
    -facetT *qh_findbestneighbor(qhT *qh, facetT *facet, realT *distp, realT *mindistp, realT *maxdistp) {
    -  facetT *neighbor, **neighborp, *bestfacet= NULL;
    -  ridgeT *ridge, **ridgep;
    -  boolT nonconvex= True, testcentrum= False;
    -  int size= qh_setsize(qh, facet->vertices);
    -
    -  if(qh->CENTERtype==qh_ASvoronoi){
    -    qh_fprintf(qh, qh->ferr, 6272, "qhull error: cannot call qh_findbestneighor for f%d while qh.CENTERtype is qh_ASvoronoi\n", facet->id);
    -    qh_errexit(qh, qh_ERRqhull, facet, NULL);
    -  }
    -  *distp= REALmax;
    -  if (size > qh_BESTcentrum2 * qh->hull_dim + qh_BESTcentrum) {
    -    testcentrum= True;
    -    zinc_(Zbestcentrum);
    -    if (!facet->center)
    -       facet->center= qh_getcentrum(qh, facet);
    -  }
    -  if (size > qh->hull_dim + qh_BESTnonconvex) {
    -    FOREACHridge_(facet->ridges) {
    -      if (ridge->nonconvex) {
    -        neighbor= otherfacet_(ridge, facet);
    -        qh_findbest_test(qh, testcentrum, facet, neighbor,
    -                          &bestfacet, distp, mindistp, maxdistp);
    -      }
    -    }
    -  }
    -  if (!bestfacet) {
    -    nonconvex= False;
    -    FOREACHneighbor_(facet)
    -      qh_findbest_test(qh, testcentrum, facet, neighbor,
    -                        &bestfacet, distp, mindistp, maxdistp);
    -  }
    -  if (!bestfacet) {
    -    qh_fprintf(qh, qh->ferr, 6095, "qhull internal error (qh_findbestneighbor): no neighbors for f%d\n", facet->id);
    -    qh_errexit(qh, qh_ERRqhull, facet, NULL);
    -  }
    -  if (testcentrum)
    -    qh_getdistance(qh, facet, bestfacet, mindistp, maxdistp);
    -  trace3((qh, qh->ferr, 3002, "qh_findbestneighbor: f%d is best neighbor for f%d testcentrum? %d nonconvex? %d dist %2.2g min %2.2g max %2.2g\n",
    -     bestfacet->id, facet->id, testcentrum, nonconvex, *distp, *mindistp, *maxdistp));
    -  return(bestfacet);
    -} /* findbestneighbor */
    -
    -
    -/*---------------------------------
    -
    -  qh_flippedmerges(qh, facetlist, wasmerge )
    -    merge flipped facets into best neighbor
    -    assumes qh.facet_mergeset at top of temporary stack
    -
    -  returns:
    -    no flipped facets on facetlist
    -    sets wasmerge if merge occurred
    -    degen/redundant merges passed through
    -
    -  notes:
    -    othermerges not needed since qh.facet_mergeset is empty before & after
    -      keep it in case of change
    -
    -  design:
    -    append flipped facets to qh.facetmergeset
    -    for each flipped merge
    -      find best neighbor
    -      merge facet into neighbor
    -      merge degenerate and redundant facets
    -    remove flipped merges from qh.facet_mergeset
    -*/
    -void qh_flippedmerges(qhT *qh, facetT *facetlist, boolT *wasmerge) {
    -  facetT *facet, *neighbor, *facet1;
    -  realT dist, mindist, maxdist;
    -  mergeT *merge, **mergep;
    -  setT *othermerges;
    -  int nummerge=0;
    -
    -  trace4((qh, qh->ferr, 4024, "qh_flippedmerges: begin\n"));
    -  FORALLfacet_(facetlist) {
    -    if (facet->flipped && !facet->visible)
    -      qh_appendmergeset(qh, facet, facet, MRGflip, NULL);
    -  }
    -  othermerges= qh_settemppop(qh); /* was facet_mergeset */
    -  qh->facet_mergeset= qh_settemp(qh, qh->TEMPsize);
    -  qh_settemppush(qh, othermerges);
    -  FOREACHmerge_(othermerges) {
    -    facet1= merge->facet1;
    -    if (merge->type != MRGflip || facet1->visible)
    -      continue;
    -    if (qh->TRACEmerge-1 == zzval_(Ztotmerge))
    -      qh->qhmem.IStracing= qh->IStracing= qh->TRACElevel;
    -    neighbor= qh_findbestneighbor(qh, facet1, &dist, &mindist, &maxdist);
    -    trace0((qh, qh->ferr, 15, "qh_flippedmerges: merge flipped f%d into f%d dist %2.2g during p%d\n",
    -      facet1->id, neighbor->id, dist, qh->furthest_id));
    -    qh_mergefacet(qh, facet1, neighbor, &mindist, &maxdist, !qh_MERGEapex);
    -    nummerge++;
    -    if (qh->PRINTstatistics) {
    -      zinc_(Zflipped);
    -      wadd_(Wflippedtot, dist);
    -      wmax_(Wflippedmax, dist);
    -    }
    -    qh_merge_degenredundant(qh);
    -  }
    -  FOREACHmerge_(othermerges) {
    -    if (merge->facet1->visible || merge->facet2->visible)
    -      qh_memfree(qh, merge, (int)sizeof(mergeT));
    -    else
    -      qh_setappend(qh, &qh->facet_mergeset, merge);
    -  }
    -  qh_settempfree(qh, &othermerges);
    -  if (nummerge)
    -    *wasmerge= True;
    -  trace1((qh, qh->ferr, 1010, "qh_flippedmerges: merged %d flipped facets into a good neighbor\n", nummerge));
    -} /* flippedmerges */
    -
    -
    -/*---------------------------------
    -
    -  qh_forcedmerges(qh, wasmerge )
    -    merge duplicated ridges
    -
    -  returns:
    -    removes all duplicate ridges on facet_mergeset
    -    wasmerge set if merge
    -    qh.facet_mergeset may include non-forced merges(none for now)
    -    qh.degen_mergeset includes degen/redun merges
    -
    -  notes:
    -    duplicate ridges occur when the horizon is pinched,
    -        i.e. a subridge occurs in more than two horizon ridges.
    -     could rename vertices that pinch the horizon
    -    assumes qh_merge_degenredundant() has not be called
    -    othermerges isn't needed since facet_mergeset is empty afterwards
    -      keep it in case of change
    -
    -  design:
    -    for each duplicate ridge
    -      find current facets by chasing f.replace links
    -      check for wide merge due to duplicate ridge
    -      determine best direction for facet
    -      merge one facet into the other
    -      remove duplicate ridges from qh.facet_mergeset
    -*/
    -void qh_forcedmerges(qhT *qh, boolT *wasmerge) {
    -  facetT *facet1, *facet2;
    -  mergeT *merge, **mergep;
    -  realT dist1, dist2, mindist1, mindist2, maxdist1, maxdist2;
    -  setT *othermerges;
    -  int nummerge=0, numflip=0;
    -
    -  if (qh->TRACEmerge-1 == zzval_(Ztotmerge))
    -    qh->qhmem.IStracing= qh->IStracing= qh->TRACElevel;
    -  trace4((qh, qh->ferr, 4025, "qh_forcedmerges: begin\n"));
    -  othermerges= qh_settemppop(qh); /* was facet_mergeset */
    -  qh->facet_mergeset= qh_settemp(qh, qh->TEMPsize);
    -  qh_settemppush(qh, othermerges);
    -  FOREACHmerge_(othermerges) {
    -    if (merge->type != MRGridge)
    -        continue;
    -    if (qh->TRACEmerge-1 == zzval_(Ztotmerge))
    -        qh->qhmem.IStracing= qh->IStracing= qh->TRACElevel;
    -    facet1= merge->facet1;
    -    facet2= merge->facet2;
    -    while (facet1->visible)      /* must exist, no qh_merge_degenredunant */
    -      facet1= facet1->f.replace; /* previously merged facet */
    -    while (facet2->visible)
    -      facet2= facet2->f.replace; /* previously merged facet */
    -    if (facet1 == facet2)
    -      continue;
    -    if (!qh_setin(facet2->neighbors, facet1)) {
    -      qh_fprintf(qh, qh->ferr, 6096, "qhull internal error (qh_forcedmerges): f%d and f%d had a duplicate ridge but as f%d and f%d they are no longer neighbors\n",
    -               merge->facet1->id, merge->facet2->id, facet1->id, facet2->id);
    -      qh_errexit2(qh, qh_ERRqhull, facet1, facet2);
    -    }
    -    dist1= qh_getdistance(qh, facet1, facet2, &mindist1, &maxdist1);
    -    dist2= qh_getdistance(qh, facet2, facet1, &mindist2, &maxdist2);
    -    qh_check_dupridge(qh, facet1, dist1, facet2, dist2);
    -    if (dist1 < dist2)
    -      qh_mergefacet(qh, facet1, facet2, &mindist1, &maxdist1, !qh_MERGEapex);
    -    else {
    -      qh_mergefacet(qh, facet2, facet1, &mindist2, &maxdist2, !qh_MERGEapex);
    -      dist1= dist2;
    -      facet1= facet2;
    -    }
    -    if (facet1->flipped) {
    -      zinc_(Zmergeflipdup);
    -      numflip++;
    -    }else
    -      nummerge++;
    -    if (qh->PRINTstatistics) {
    -      zinc_(Zduplicate);
    -      wadd_(Wduplicatetot, dist1);
    -      wmax_(Wduplicatemax, dist1);
    -    }
    -  }
    -  FOREACHmerge_(othermerges) {
    -    if (merge->type == MRGridge)
    -      qh_memfree(qh, merge, (int)sizeof(mergeT));
    -    else
    -      qh_setappend(qh, &qh->facet_mergeset, merge);
    -  }
    -  qh_settempfree(qh, &othermerges);
    -  if (nummerge)
    -    *wasmerge= True;
    -  trace1((qh, qh->ferr, 1011, "qh_forcedmerges: merged %d facets and %d flipped facets across duplicated ridges\n",
    -                nummerge, numflip));
    -} /* forcedmerges */
    -
    -
    -/*---------------------------------
    -
    -  qh_getmergeset(qh, facetlist )
    -    determines nonconvex facets on facetlist
    -    tests !tested ridges and nonconvex ridges of !tested facets
    -
    -  returns:
    -    returns sorted qh.facet_mergeset of facet-neighbor pairs to be merged
    -    all ridges tested
    -
    -  notes:
    -    assumes no nonconvex ridges with both facets tested
    -    uses facet->tested/ridge->tested to prevent duplicate tests
    -    can not limit tests to modified ridges since the centrum changed
    -    uses qh.visit_id
    -
    -  see:
    -    qh_getmergeset_initial()
    -
    -  design:
    -    for each facet on facetlist
    -      for each ridge of facet
    -        if untested ridge
    -          test ridge for convexity
    -          if non-convex
    -            append ridge to qh.facet_mergeset
    -    sort qh.facet_mergeset by angle
    -*/
    -void qh_getmergeset(qhT *qh, facetT *facetlist) {
    -  facetT *facet, *neighbor, **neighborp;
    -  ridgeT *ridge, **ridgep;
    -  int nummerges;
    -
    -  nummerges= qh_setsize(qh, qh->facet_mergeset);
    -  trace4((qh, qh->ferr, 4026, "qh_getmergeset: started.\n"));
    -  qh->visit_id++;
    -  FORALLfacet_(facetlist) {
    -    if (facet->tested)
    -      continue;
    -    facet->visitid= qh->visit_id;
    -    facet->tested= True;  /* must be non-simplicial due to merge */
    -    FOREACHneighbor_(facet)
    -      neighbor->seen= False;
    -    FOREACHridge_(facet->ridges) {
    -      if (ridge->tested && !ridge->nonconvex)
    -        continue;
    -      /* if tested & nonconvex, need to append merge */
    -      neighbor= otherfacet_(ridge, facet);
    -      if (neighbor->seen) {
    -        ridge->tested= True;
    -        ridge->nonconvex= False;
    -      }else if (neighbor->visitid != qh->visit_id) {
    -        ridge->tested= True;
    -        ridge->nonconvex= False;
    -        neighbor->seen= True;      /* only one ridge is marked nonconvex */
    -        if (qh_test_appendmerge(qh, facet, neighbor))
    -          ridge->nonconvex= True;
    -      }
    -    }
    -  }
    -  nummerges= qh_setsize(qh, qh->facet_mergeset);
    -  if (qh->ANGLEmerge)
    -    qsort(SETaddr_(qh->facet_mergeset, mergeT), (size_t)nummerges, sizeof(mergeT *), qh_compareangle);
    -  else
    -    qsort(SETaddr_(qh->facet_mergeset, mergeT), (size_t)nummerges, sizeof(mergeT *), qh_comparemerge);
    -  if (qh->POSTmerging) {
    -    zadd_(Zmergesettot2, nummerges);
    -  }else {
    -    zadd_(Zmergesettot, nummerges);
    -    zmax_(Zmergesetmax, nummerges);
    -  }
    -  trace2((qh, qh->ferr, 2021, "qh_getmergeset: %d merges found\n", nummerges));
    -} /* getmergeset */
    -
    -
    -/*---------------------------------
    -
    -  qh_getmergeset_initial(qh, facetlist )
    -    determine initial qh.facet_mergeset for facets
    -    tests all facet/neighbor pairs on facetlist
    -
    -  returns:
    -    sorted qh.facet_mergeset with nonconvex ridges
    -    sets facet->tested, ridge->tested, and ridge->nonconvex
    -
    -  notes:
    -    uses visit_id, assumes ridge->nonconvex is False
    -
    -  see:
    -    qh_getmergeset()
    -
    -  design:
    -    for each facet on facetlist
    -      for each untested neighbor of facet
    -        test facet and neighbor for convexity
    -        if non-convex
    -          append merge to qh.facet_mergeset
    -          mark one of the ridges as nonconvex
    -    sort qh.facet_mergeset by angle
    -*/
    -void qh_getmergeset_initial(qhT *qh, facetT *facetlist) {
    -  facetT *facet, *neighbor, **neighborp;
    -  ridgeT *ridge, **ridgep;
    -  int nummerges;
    -
    -  qh->visit_id++;
    -  FORALLfacet_(facetlist) {
    -    facet->visitid= qh->visit_id;
    -    facet->tested= True;
    -    FOREACHneighbor_(facet) {
    -      if (neighbor->visitid != qh->visit_id) {
    -        if (qh_test_appendmerge(qh, facet, neighbor)) {
    -          FOREACHridge_(neighbor->ridges) {
    -            if (facet == otherfacet_(ridge, neighbor)) {
    -              ridge->nonconvex= True;
    -              break;    /* only one ridge is marked nonconvex */
    -            }
    -          }
    -        }
    -      }
    -    }
    -    FOREACHridge_(facet->ridges)
    -      ridge->tested= True;
    -  }
    -  nummerges= qh_setsize(qh, qh->facet_mergeset);
    -  if (qh->ANGLEmerge)
    -    qsort(SETaddr_(qh->facet_mergeset, mergeT), (size_t)nummerges, sizeof(mergeT *), qh_compareangle);
    -  else
    -    qsort(SETaddr_(qh->facet_mergeset, mergeT), (size_t)nummerges, sizeof(mergeT *), qh_comparemerge);
    -  if (qh->POSTmerging) {
    -    zadd_(Zmergeinittot2, nummerges);
    -  }else {
    -    zadd_(Zmergeinittot, nummerges);
    -    zmax_(Zmergeinitmax, nummerges);
    -  }
    -  trace2((qh, qh->ferr, 2022, "qh_getmergeset_initial: %d merges found\n", nummerges));
    -} /* getmergeset_initial */
    -
    -
    -/*---------------------------------
    -
    -  qh_hashridge(qh, hashtable, hashsize, ridge, oldvertex )
    -    add ridge to hashtable without oldvertex
    -
    -  notes:
    -    assumes hashtable is large enough
    -
    -  design:
    -    determine hash value for ridge without oldvertex
    -    find next empty slot for ridge
    -*/
    -void qh_hashridge(qhT *qh, setT *hashtable, int hashsize, ridgeT *ridge, vertexT *oldvertex) {
    -  int hash;
    -  ridgeT *ridgeA;
    -
    -  hash= qh_gethash(qh, hashsize, ridge->vertices, qh->hull_dim-1, 0, oldvertex);
    -  while (True) {
    -    if (!(ridgeA= SETelemt_(hashtable, hash, ridgeT))) {
    -      SETelem_(hashtable, hash)= ridge;
    -      break;
    -    }else if (ridgeA == ridge)
    -      break;
    -    if (++hash == hashsize)
    -      hash= 0;
    -  }
    -} /* hashridge */
    -
    -
    -/*---------------------------------
    -
    -  qh_hashridge_find(qh, hashtable, hashsize, ridge, vertex, oldvertex, hashslot )
    -    returns matching ridge without oldvertex in hashtable
    -      for ridge without vertex
    -    if oldvertex is NULL
    -      matches with any one skip
    -
    -  returns:
    -    matching ridge or NULL
    -    if no match,
    -      if ridge already in   table
    -        hashslot= -1
    -      else
    -        hashslot= next NULL index
    -
    -  notes:
    -    assumes hashtable is large enough
    -    can't match ridge to itself
    -
    -  design:
    -    get hash value for ridge without vertex
    -    for each hashslot
    -      return match if ridge matches ridgeA without oldvertex
    -*/
    -ridgeT *qh_hashridge_find(qhT *qh, setT *hashtable, int hashsize, ridgeT *ridge,
    -              vertexT *vertex, vertexT *oldvertex, int *hashslot) {
    -  int hash;
    -  ridgeT *ridgeA;
    -
    -  *hashslot= 0;
    -  zinc_(Zhashridge);
    -  hash= qh_gethash(qh, hashsize, ridge->vertices, qh->hull_dim-1, 0, vertex);
    -  while ((ridgeA= SETelemt_(hashtable, hash, ridgeT))) {
    -    if (ridgeA == ridge)
    -      *hashslot= -1;
    -    else {
    -      zinc_(Zhashridgetest);
    -      if (qh_setequal_except(ridge->vertices, vertex, ridgeA->vertices, oldvertex))
    -        return ridgeA;
    -    }
    -    if (++hash == hashsize)
    -      hash= 0;
    -  }
    -  if (!*hashslot)
    -    *hashslot= hash;
    -  return NULL;
    -} /* hashridge_find */
    -
    -
    -/*---------------------------------
    -
    -  qh_makeridges(qh, facet )
    -    creates explicit ridges between simplicial facets
    -
    -  returns:
    -    facet with ridges and without qh_MERGEridge
    -    ->simplicial is False
    -
    -  notes:
    -    allows qh_MERGEridge flag
    -    uses existing ridges
    -    duplicate neighbors ok if ridges already exist (qh_mergecycle_ridges)
    -
    -  see:
    -    qh_mergecycle_ridges()
    -
    -  design:
    -    look for qh_MERGEridge neighbors
    -    mark neighbors that already have ridges
    -    for each unprocessed neighbor of facet
    -      create a ridge for neighbor and facet
    -    if any qh_MERGEridge neighbors
    -      delete qh_MERGEridge flags (already handled by qh_mark_dupridges)
    -*/
    -void qh_makeridges(qhT *qh, facetT *facet) {
    -  facetT *neighbor, **neighborp;
    -  ridgeT *ridge, **ridgep;
    -  int neighbor_i, neighbor_n;
    -  boolT toporient, mergeridge= False;
    -
    -  if (!facet->simplicial)
    -    return;
    -  trace4((qh, qh->ferr, 4027, "qh_makeridges: make ridges for f%d\n", facet->id));
    -  facet->simplicial= False;
    -  FOREACHneighbor_(facet) {
    -    if (neighbor == qh_MERGEridge)
    -      mergeridge= True;
    -    else
    -      neighbor->seen= False;
    -  }
    -  FOREACHridge_(facet->ridges)
    -    otherfacet_(ridge, facet)->seen= True;
    -  FOREACHneighbor_i_(qh, facet) {
    -    if (neighbor == qh_MERGEridge)
    -      continue;  /* fixed by qh_mark_dupridges */
    -    else if (!neighbor->seen) {  /* no current ridges */
    -      ridge= qh_newridge(qh);
    -      ridge->vertices= qh_setnew_delnthsorted(qh, facet->vertices, qh->hull_dim,
    -                                                          neighbor_i, 0);
    -      toporient= facet->toporient ^ (neighbor_i & 0x1);
    -      if (toporient) {
    -        ridge->top= facet;
    -        ridge->bottom= neighbor;
    -      }else {
    -        ridge->top= neighbor;
    -        ridge->bottom= facet;
    -      }
    -#if 0 /* this also works */
    -      flip= (facet->toporient ^ neighbor->toporient)^(skip1 & 0x1) ^ (skip2 & 0x1);
    -      if (facet->toporient ^ (skip1 & 0x1) ^ flip) {
    -        ridge->top= neighbor;
    -        ridge->bottom= facet;
    -      }else {
    -        ridge->top= facet;
    -        ridge->bottom= neighbor;
    -      }
    -#endif
    -      qh_setappend(qh, &(facet->ridges), ridge);
    -      qh_setappend(qh, &(neighbor->ridges), ridge);
    -    }
    -  }
    -  if (mergeridge) {
    -    while (qh_setdel(facet->neighbors, qh_MERGEridge))
    -      ; /* delete each one */
    -  }
    -} /* makeridges */
    -
    -
    -/*---------------------------------
    -
    -  qh_mark_dupridges(qh, facetlist )
    -    add duplicated ridges to qh.facet_mergeset
    -    facet->dupridge is true
    -
    -  returns:
    -    duplicate ridges on qh.facet_mergeset
    -    ->mergeridge/->mergeridge2 set
    -    duplicate ridges marked by qh_MERGEridge and both sides facet->dupridge
    -    no MERGEridges in neighbor sets
    -
    -  notes:
    -    duplicate ridges occur when the horizon is pinched,
    -        i.e. a subridge occurs in more than two horizon ridges.
    -    could rename vertices that pinch the horizon (thus removing subridge)
    -    uses qh.visit_id
    -
    -  design:
    -    for all facets on facetlist
    -      if facet contains a duplicate ridge
    -        for each neighbor of facet
    -          if neighbor marked qh_MERGEridge (one side of the merge)
    -            set facet->mergeridge
    -          else
    -            if neighbor contains a duplicate ridge
    -            and the back link is qh_MERGEridge
    -              append duplicate ridge to qh.facet_mergeset
    -   for each duplicate ridge
    -     make ridge sets in preparation for merging
    -     remove qh_MERGEridge from neighbor set
    -   for each duplicate ridge
    -     restore the missing neighbor from the neighbor set that was qh_MERGEridge
    -     add the missing ridge for this neighbor
    -*/
    -void qh_mark_dupridges(qhT *qh, facetT *facetlist) {
    -  facetT *facet, *neighbor, **neighborp;
    -  int nummerge=0;
    -  mergeT *merge, **mergep;
    -
    -
    -  trace4((qh, qh->ferr, 4028, "qh_mark_dupridges: identify duplicate ridges\n"));
    -  FORALLfacet_(facetlist) {
    -    if (facet->dupridge) {
    -      FOREACHneighbor_(facet) {
    -        if (neighbor == qh_MERGEridge) {
    -          facet->mergeridge= True;
    -          continue;
    -        }
    -        if (neighbor->dupridge
    -        && !qh_setin(neighbor->neighbors, facet)) { /* qh_MERGEridge */
    -          qh_appendmergeset(qh, facet, neighbor, MRGridge, NULL);
    -          facet->mergeridge2= True;
    -          facet->mergeridge= True;
    -          nummerge++;
    -        }
    -      }
    -    }
    -  }
    -  if (!nummerge)
    -    return;
    -  FORALLfacet_(facetlist) {            /* gets rid of qh_MERGEridge */
    -    if (facet->mergeridge && !facet->mergeridge2)
    -      qh_makeridges(qh, facet);
    -  }
    -  FOREACHmerge_(qh->facet_mergeset) {   /* restore the missing neighbors */
    -    if (merge->type == MRGridge) {
    -      qh_setappend(qh, &merge->facet2->neighbors, merge->facet1);
    -      qh_makeridges(qh, merge->facet1);   /* and the missing ridges */
    -    }
    -  }
    -  trace1((qh, qh->ferr, 1012, "qh_mark_dupridges: found %d duplicated ridges\n",
    -                nummerge));
    -} /* mark_dupridges */
    -
    -/*---------------------------------
    -
    -  qh_maydropneighbor(qh, facet )
    -    drop neighbor relationship if no ridge between facet and neighbor
    -
    -  returns:
    -    neighbor sets updated
    -    appends degenerate facets to qh.facet_mergeset
    -
    -  notes:
    -    won't cause redundant facets since vertex inclusion is the same
    -    may drop vertex and neighbor if no ridge
    -    uses qh.visit_id
    -
    -  design:
    -    visit all neighbors with ridges
    -    for each unvisited neighbor of facet
    -      delete neighbor and facet from the neighbor sets
    -      if neighbor becomes degenerate
    -        append neighbor to qh.degen_mergeset
    -    if facet is degenerate
    -      append facet to qh.degen_mergeset
    -*/
    -void qh_maydropneighbor(qhT *qh, facetT *facet) {
    -  ridgeT *ridge, **ridgep;
    -  realT angledegen= qh_ANGLEdegen;
    -  facetT *neighbor, **neighborp;
    -
    -  qh->visit_id++;
    -  trace4((qh, qh->ferr, 4029, "qh_maydropneighbor: test f%d for no ridges to a neighbor\n",
    -          facet->id));
    -  FOREACHridge_(facet->ridges) {
    -    ridge->top->visitid= qh->visit_id;
    -    ridge->bottom->visitid= qh->visit_id;
    -  }
    -  FOREACHneighbor_(facet) {
    -    if (neighbor->visitid != qh->visit_id) {
    -      trace0((qh, qh->ferr, 17, "qh_maydropneighbor: facets f%d and f%d are no longer neighbors during p%d\n",
    -            facet->id, neighbor->id, qh->furthest_id));
    -      zinc_(Zdropneighbor);
    -      qh_setdel(facet->neighbors, neighbor);
    -      neighborp--;  /* repeat, deleted a neighbor */
    -      qh_setdel(neighbor->neighbors, facet);
    -      if (qh_setsize(qh, neighbor->neighbors) < qh->hull_dim) {
    -        zinc_(Zdropdegen);
    -        qh_appendmergeset(qh, neighbor, neighbor, MRGdegen, &angledegen);
    -        trace2((qh, qh->ferr, 2023, "qh_maydropneighbors: f%d is degenerate.\n", neighbor->id));
    -      }
    -    }
    -  }
    -  if (qh_setsize(qh, facet->neighbors) < qh->hull_dim) {
    -    zinc_(Zdropdegen);
    -    qh_appendmergeset(qh, facet, facet, MRGdegen, &angledegen);
    -    trace2((qh, qh->ferr, 2024, "qh_maydropneighbors: f%d is degenerate.\n", facet->id));
    -  }
    -} /* maydropneighbor */
    -
    -
    -/*---------------------------------
    -
    -  qh_merge_degenredundant(qh)
    -    merge all degenerate and redundant facets
    -    qh.degen_mergeset contains merges from qh_degen_redundant_neighbors()
    -
    -  returns:
    -    number of merges performed
    -    resets facet->degenerate/redundant
    -    if deleted (visible) facet has no neighbors
    -      sets ->f.replace to NULL
    -
    -  notes:
    -    redundant merges happen before degenerate ones
    -    merging and renaming vertices can result in degen/redundant facets
    -
    -  design:
    -    for each merge on qh.degen_mergeset
    -      if redundant merge
    -        if non-redundant facet merged into redundant facet
    -          recheck facet for redundancy
    -        else
    -          merge redundant facet into other facet
    -*/
    -int qh_merge_degenredundant(qhT *qh) {
    -  int size;
    -  mergeT *merge;
    -  facetT *bestneighbor, *facet1, *facet2;
    -  realT dist, mindist, maxdist;
    -  vertexT *vertex, **vertexp;
    -  int nummerges= 0;
    -  mergeType mergetype;
    -
    -  while ((merge= (mergeT*)qh_setdellast(qh->degen_mergeset))) {
    -    facet1= merge->facet1;
    -    facet2= merge->facet2;
    -    mergetype= merge->type;
    -    qh_memfree(qh, merge, (int)sizeof(mergeT));
    -    if (facet1->visible)
    -      continue;
    -    facet1->degenerate= False;
    -    facet1->redundant= False;
    -    if (qh->TRACEmerge-1 == zzval_(Ztotmerge))
    -      qh->qhmem.IStracing= qh->IStracing= qh->TRACElevel;
    -    if (mergetype == MRGredundant) {
    -      zinc_(Zneighbor);
    -      while (facet2->visible) {
    -        if (!facet2->f.replace) {
    -          qh_fprintf(qh, qh->ferr, 6097, "qhull internal error (qh_merge_degenredunant): f%d redundant but f%d has no replacement\n",
    -               facet1->id, facet2->id);
    -          qh_errexit2(qh, qh_ERRqhull, facet1, facet2);
    -        }
    -        facet2= facet2->f.replace;
    -      }
    -      if (facet1 == facet2) {
    -        qh_degen_redundant_facet(qh, facet1); /* in case of others */
    -        continue;
    -      }
    -      trace2((qh, qh->ferr, 2025, "qh_merge_degenredundant: facet f%d is contained in f%d, will merge\n",
    -            facet1->id, facet2->id));
    -      qh_mergefacet(qh, facet1, facet2, NULL, NULL, !qh_MERGEapex);
    -      /* merge distance is already accounted for */
    -      nummerges++;
    -    }else {  /* mergetype == MRGdegen, other merges may have fixed */
    -      if (!(size= qh_setsize(qh, facet1->neighbors))) {
    -        zinc_(Zdelfacetdup);
    -        trace2((qh, qh->ferr, 2026, "qh_merge_degenredundant: facet f%d has no neighbors.  Deleted\n", facet1->id));
    -        qh_willdelete(qh, facet1, NULL);
    -        FOREACHvertex_(facet1->vertices) {
    -          qh_setdel(vertex->neighbors, facet1);
    -          if (!SETfirst_(vertex->neighbors)) {
    -            zinc_(Zdegenvertex);
    -            trace2((qh, qh->ferr, 2027, "qh_merge_degenredundant: deleted v%d because f%d has no neighbors\n",
    -                 vertex->id, facet1->id));
    -            vertex->deleted= True;
    -            qh_setappend(qh, &qh->del_vertices, vertex);
    -          }
    -        }
    -        nummerges++;
    -      }else if (size < qh->hull_dim) {
    -        bestneighbor= qh_findbestneighbor(qh, facet1, &dist, &mindist, &maxdist);
    -        trace2((qh, qh->ferr, 2028, "qh_merge_degenredundant: facet f%d has %d neighbors, merge into f%d dist %2.2g\n",
    -              facet1->id, size, bestneighbor->id, dist));
    -        qh_mergefacet(qh, facet1, bestneighbor, &mindist, &maxdist, !qh_MERGEapex);
    -        nummerges++;
    -        if (qh->PRINTstatistics) {
    -          zinc_(Zdegen);
    -          wadd_(Wdegentot, dist);
    -          wmax_(Wdegenmax, dist);
    -        }
    -      } /* else, another merge fixed the degeneracy and redundancy tested */
    -    }
    -  }
    -  return nummerges;
    -} /* merge_degenredundant */
    -
    -/*---------------------------------
    -
    -  qh_merge_nonconvex(qh, facet1, facet2, mergetype )
    -    remove non-convex ridge between facet1 into facet2
    -    mergetype gives why the facet's are non-convex
    -
    -  returns:
    -    merges one of the facets into the best neighbor
    -
    -  design:
    -    if one of the facets is a new facet
    -      prefer merging new facet into old facet
    -    find best neighbors for both facets
    -    merge the nearest facet into its best neighbor
    -    update the statistics
    -*/
    -void qh_merge_nonconvex(qhT *qh, facetT *facet1, facetT *facet2, mergeType mergetype) {
    -  facetT *bestfacet, *bestneighbor, *neighbor;
    -  realT dist, dist2, mindist, mindist2, maxdist, maxdist2;
    -
    -  if (qh->TRACEmerge-1 == zzval_(Ztotmerge))
    -    qh->qhmem.IStracing= qh->IStracing= qh->TRACElevel;
    -  trace3((qh, qh->ferr, 3003, "qh_merge_nonconvex: merge #%d for f%d and f%d type %d\n",
    -      zzval_(Ztotmerge) + 1, facet1->id, facet2->id, mergetype));
    -  /* concave or coplanar */
    -  if (!facet1->newfacet) {
    -    bestfacet= facet2;   /* avoid merging old facet if new is ok */
    -    facet2= facet1;
    -    facet1= bestfacet;
    -  }else
    -    bestfacet= facet1;
    -  bestneighbor= qh_findbestneighbor(qh, bestfacet, &dist, &mindist, &maxdist);
    -  neighbor= qh_findbestneighbor(qh, facet2, &dist2, &mindist2, &maxdist2);
    -  if (dist < dist2) {
    -    qh_mergefacet(qh, bestfacet, bestneighbor, &mindist, &maxdist, !qh_MERGEapex);
    -  }else if (qh->AVOIDold && !facet2->newfacet
    -  && ((mindist >= -qh->MAXcoplanar && maxdist <= qh->max_outside)
    -       || dist * 1.5 < dist2)) {
    -    zinc_(Zavoidold);
    -    wadd_(Wavoidoldtot, dist);
    -    wmax_(Wavoidoldmax, dist);
    -    trace2((qh, qh->ferr, 2029, "qh_merge_nonconvex: avoid merging old facet f%d dist %2.2g.  Use f%d dist %2.2g instead\n",
    -           facet2->id, dist2, facet1->id, dist2));
    -    qh_mergefacet(qh, bestfacet, bestneighbor, &mindist, &maxdist, !qh_MERGEapex);
    -  }else {
    -    qh_mergefacet(qh, facet2, neighbor, &mindist2, &maxdist2, !qh_MERGEapex);
    -    dist= dist2;
    -  }
    -  if (qh->PRINTstatistics) {
    -    if (mergetype == MRGanglecoplanar) {
    -      zinc_(Zacoplanar);
    -      wadd_(Wacoplanartot, dist);
    -      wmax_(Wacoplanarmax, dist);
    -    }else if (mergetype == MRGconcave) {
    -      zinc_(Zconcave);
    -      wadd_(Wconcavetot, dist);
    -      wmax_(Wconcavemax, dist);
    -    }else { /* MRGcoplanar */
    -      zinc_(Zcoplanar);
    -      wadd_(Wcoplanartot, dist);
    -      wmax_(Wcoplanarmax, dist);
    -    }
    -  }
    -} /* merge_nonconvex */
    -
    -/*---------------------------------
    -
    -  qh_mergecycle(qh, samecycle, newfacet )
    -    merge a cycle of facets starting at samecycle into a newfacet
    -    newfacet is a horizon facet with ->normal
    -    samecycle facets are simplicial from an apex
    -
    -  returns:
    -    initializes vertex neighbors on first merge
    -    samecycle deleted (placed on qh.visible_list)
    -    newfacet at end of qh.facet_list
    -    deleted vertices on qh.del_vertices
    -
    -  see:
    -    qh_mergefacet()
    -    called by qh_mergecycle_all() for multiple, same cycle facets
    -
    -  design:
    -    make vertex neighbors if necessary
    -    make ridges for newfacet
    -    merge neighbor sets of samecycle into newfacet
    -    merge ridges of samecycle into newfacet
    -    merge vertex neighbors of samecycle into newfacet
    -    make apex of samecycle the apex of newfacet
    -    if newfacet wasn't a new facet
    -      add its vertices to qh.newvertex_list
    -    delete samecycle facets a make newfacet a newfacet
    -*/
    -void qh_mergecycle(qhT *qh, facetT *samecycle, facetT *newfacet) {
    -  int traceonce= False, tracerestore= 0;
    -  vertexT *apex;
    -#ifndef qh_NOtrace
    -  facetT *same;
    -#endif
    -
    -  if (newfacet->tricoplanar) {
    -    if (!qh->TRInormals) {
    -      qh_fprintf(qh, qh->ferr, 6224, "Qhull internal error (qh_mergecycle): does not work for tricoplanar facets.  Use option 'Q11'\n");
    -      qh_errexit(qh, qh_ERRqhull, newfacet, NULL);
    -    }
    -    newfacet->tricoplanar= False;
    -    newfacet->keepcentrum= False;
    -  }
    -  if (!qh->VERTEXneighbors)
    -    qh_vertexneighbors(qh);
    -  zzinc_(Ztotmerge);
    -  if (qh->REPORTfreq2 && qh->POSTmerging) {
    -    if (zzval_(Ztotmerge) > qh->mergereport + qh->REPORTfreq2)
    -      qh_tracemerging(qh);
    -  }
    -#ifndef qh_NOtrace
    -  if (qh->TRACEmerge == zzval_(Ztotmerge))
    -    qh->qhmem.IStracing= qh->IStracing= qh->TRACElevel;
    -  trace2((qh, qh->ferr, 2030, "qh_mergecycle: merge #%d for facets from cycle f%d into coplanar horizon f%d\n",
    -        zzval_(Ztotmerge), samecycle->id, newfacet->id));
    -  if (newfacet == qh->tracefacet) {
    -    tracerestore= qh->IStracing;
    -    qh->IStracing= 4;
    -    qh_fprintf(qh, qh->ferr, 8068, "qh_mergecycle: ========= trace merge %d of samecycle %d into trace f%d, furthest is p%d\n",
    -               zzval_(Ztotmerge), samecycle->id, newfacet->id,  qh->furthest_id);
    -    traceonce= True;
    -  }
    -  if (qh->IStracing >=4) {
    -    qh_fprintf(qh, qh->ferr, 8069, "  same cycle:");
    -    FORALLsame_cycle_(samecycle)
    -      qh_fprintf(qh, qh->ferr, 8070, " f%d", same->id);
    -    qh_fprintf(qh, qh->ferr, 8071, "\n");
    -  }
    -  if (qh->IStracing >=4)
    -    qh_errprint(qh, "MERGING CYCLE", samecycle, newfacet, NULL, NULL);
    -#endif /* !qh_NOtrace */
    -  apex= SETfirstt_(samecycle->vertices, vertexT);
    -  qh_makeridges(qh, newfacet);
    -  qh_mergecycle_neighbors(qh, samecycle, newfacet);
    -  qh_mergecycle_ridges(qh, samecycle, newfacet);
    -  qh_mergecycle_vneighbors(qh, samecycle, newfacet);
    -  if (SETfirstt_(newfacet->vertices, vertexT) != apex)
    -    qh_setaddnth(qh, &newfacet->vertices, 0, apex);  /* apex has last id */
    -  if (!newfacet->newfacet)
    -    qh_newvertices(qh, newfacet->vertices);
    -  qh_mergecycle_facets(qh, samecycle, newfacet);
    -  qh_tracemerge(qh, samecycle, newfacet);
    -  /* check for degen_redundant_neighbors after qh_forcedmerges() */
    -  if (traceonce) {
    -    qh_fprintf(qh, qh->ferr, 8072, "qh_mergecycle: end of trace facet\n");
    -    qh->IStracing= tracerestore;
    -  }
    -} /* mergecycle */
    -
    -/*---------------------------------
    -
    -  qh_mergecycle_all(qh, facetlist, wasmerge )
    -    merge all samecycles of coplanar facets into horizon
    -    don't merge facets with ->mergeridge (these already have ->normal)
    -    all facets are simplicial from apex
    -    all facet->cycledone == False
    -
    -  returns:
    -    all newfacets merged into coplanar horizon facets
    -    deleted vertices on  qh.del_vertices
    -    sets wasmerge if any merge
    -
    -  see:
    -    calls qh_mergecycle for multiple, same cycle facets
    -
    -  design:
    -    for each facet on facetlist
    -      skip facets with duplicate ridges and normals
    -      check that facet is in a samecycle (->mergehorizon)
    -      if facet only member of samecycle
    -        sets vertex->delridge for all vertices except apex
    -        merge facet into horizon
    -      else
    -        mark all facets in samecycle
    -        remove facets with duplicate ridges from samecycle
    -        merge samecycle into horizon (deletes facets from facetlist)
    -*/
    -void qh_mergecycle_all(qhT *qh, facetT *facetlist, boolT *wasmerge) {
    -  facetT *facet, *same, *prev, *horizon;
    -  facetT *samecycle= NULL, *nextfacet, *nextsame;
    -  vertexT *apex, *vertex, **vertexp;
    -  int cycles=0, total=0, facets, nummerge;
    -
    -  trace2((qh, qh->ferr, 2031, "qh_mergecycle_all: begin\n"));
    -  for (facet= facetlist; facet && (nextfacet= facet->next); facet= nextfacet) {
    -    if (facet->normal)
    -      continue;
    -    if (!facet->mergehorizon) {
    -      qh_fprintf(qh, qh->ferr, 6225, "Qhull internal error (qh_mergecycle_all): f%d without normal\n", facet->id);
    -      qh_errexit(qh, qh_ERRqhull, facet, NULL);
    -    }
    -    horizon= SETfirstt_(facet->neighbors, facetT);
    -    if (facet->f.samecycle == facet) {
    -      zinc_(Zonehorizon);
    -      /* merge distance done in qh_findhorizon */
    -      apex= SETfirstt_(facet->vertices, vertexT);
    -      FOREACHvertex_(facet->vertices) {
    -        if (vertex != apex)
    -          vertex->delridge= True;
    -      }
    -      horizon->f.newcycle= NULL;
    -      qh_mergefacet(qh, facet, horizon, NULL, NULL, qh_MERGEapex);
    -    }else {
    -      samecycle= facet;
    -      facets= 0;
    -      prev= facet;
    -      for (same= facet->f.samecycle; same;  /* FORALLsame_cycle_(facet) */
    -           same= (same == facet ? NULL :nextsame)) { /* ends at facet */
    -        nextsame= same->f.samecycle;
    -        if (same->cycledone || same->visible)
    -          qh_infiniteloop(qh, same);
    -        same->cycledone= True;
    -        if (same->normal) {
    -          prev->f.samecycle= same->f.samecycle; /* unlink ->mergeridge */
    -          same->f.samecycle= NULL;
    -        }else {
    -          prev= same;
    -          facets++;
    -        }
    -      }
    -      while (nextfacet && nextfacet->cycledone)  /* will delete samecycle */
    -        nextfacet= nextfacet->next;
    -      horizon->f.newcycle= NULL;
    -      qh_mergecycle(qh, samecycle, horizon);
    -      nummerge= horizon->nummerge + facets;
    -      if (nummerge > qh_MAXnummerge)
    -        horizon->nummerge= qh_MAXnummerge;
    -      else
    -        horizon->nummerge= (short unsigned int)nummerge;
    -      zzinc_(Zcyclehorizon);
    -      total += facets;
    -      zzadd_(Zcyclefacettot, facets);
    -      zmax_(Zcyclefacetmax, facets);
    -    }
    -    cycles++;
    -  }
    -  if (cycles)
    -    *wasmerge= True;
    -  trace1((qh, qh->ferr, 1013, "qh_mergecycle_all: merged %d same cycles or facets into coplanar horizons\n", cycles));
    -} /* mergecycle_all */
    -
    -/*---------------------------------
    -
    -  qh_mergecycle_facets(qh, samecycle, newfacet )
    -    finish merge of samecycle into newfacet
    -
    -  returns:
    -    samecycle prepended to visible_list for later deletion and partitioning
    -      each facet->f.replace == newfacet
    -
    -    newfacet moved to end of qh.facet_list
    -      makes newfacet a newfacet (get's facet1->id if it was old)
    -      sets newfacet->newmerge
    -      clears newfacet->center (unless merging into a large facet)
    -      clears newfacet->tested and ridge->tested for facet1
    -
    -    adds neighboring facets to facet_mergeset if redundant or degenerate
    -
    -  design:
    -    make newfacet a new facet and set its flags
    -    move samecycle facets to qh.visible_list for later deletion
    -    unless newfacet is large
    -      remove its centrum
    -*/
    -void qh_mergecycle_facets(qhT *qh, facetT *samecycle, facetT *newfacet) {
    -  facetT *same, *next;
    -
    -  trace4((qh, qh->ferr, 4030, "qh_mergecycle_facets: make newfacet new and samecycle deleted\n"));
    -  qh_removefacet(qh, newfacet);  /* append as a newfacet to end of qh->facet_list */
    -  qh_appendfacet(qh, newfacet);
    -  newfacet->newfacet= True;
    -  newfacet->simplicial= False;
    -  newfacet->newmerge= True;
    -
    -  for (same= samecycle->f.samecycle; same; same= (same == samecycle ?  NULL : next)) {
    -    next= same->f.samecycle;  /* reused by willdelete */
    -    qh_willdelete(qh, same, newfacet);
    -  }
    -  if (newfacet->center
    -      && qh_setsize(qh, newfacet->vertices) <= qh->hull_dim + qh_MAXnewcentrum) {
    -    qh_memfree(qh, newfacet->center, qh->normal_size);
    -    newfacet->center= NULL;
    -  }
    -  trace3((qh, qh->ferr, 3004, "qh_mergecycle_facets: merged facets from cycle f%d into f%d\n",
    -             samecycle->id, newfacet->id));
    -} /* mergecycle_facets */
    -
    -/*---------------------------------
    -
    -  qh_mergecycle_neighbors(qh, samecycle, newfacet )
    -    add neighbors for samecycle facets to newfacet
    -
    -  returns:
    -    newfacet with updated neighbors and vice-versa
    -    newfacet has ridges
    -    all neighbors of newfacet marked with qh.visit_id
    -    samecycle facets marked with qh.visit_id-1
    -    ridges updated for simplicial neighbors of samecycle with a ridge
    -
    -  notes:
    -    assumes newfacet not in samecycle
    -    usually, samecycle facets are new, simplicial facets without internal ridges
    -      not so if horizon facet is coplanar to two different samecycles
    -
    -  see:
    -    qh_mergeneighbors()
    -
    -  design:
    -    check samecycle
    -    delete neighbors from newfacet that are also in samecycle
    -    for each neighbor of a facet in samecycle
    -      if neighbor is simplicial
    -        if first visit
    -          move the neighbor relation to newfacet
    -          update facet links for its ridges
    -        else
    -          make ridges for neighbor
    -          remove samecycle reference
    -      else
    -        update neighbor sets
    -*/
    -void qh_mergecycle_neighbors(qhT *qh, facetT *samecycle, facetT *newfacet) {
    -  facetT *same, *neighbor, **neighborp;
    -  int delneighbors= 0, newneighbors= 0;
    -  unsigned int samevisitid;
    -  ridgeT *ridge, **ridgep;
    -
    -  samevisitid= ++qh->visit_id;
    -  FORALLsame_cycle_(samecycle) {
    -    if (same->visitid == samevisitid || same->visible)
    -      qh_infiniteloop(qh, samecycle);
    -    same->visitid= samevisitid;
    -  }
    -  newfacet->visitid= ++qh->visit_id;
    -  trace4((qh, qh->ferr, 4031, "qh_mergecycle_neighbors: delete shared neighbors from newfacet\n"));
    -  FOREACHneighbor_(newfacet) {
    -    if (neighbor->visitid == samevisitid) {
    -      SETref_(neighbor)= NULL;  /* samecycle neighbors deleted */
    -      delneighbors++;
    -    }else
    -      neighbor->visitid= qh->visit_id;
    -  }
    -  qh_setcompact(qh, newfacet->neighbors);
    -
    -  trace4((qh, qh->ferr, 4032, "qh_mergecycle_neighbors: update neighbors\n"));
    -  FORALLsame_cycle_(samecycle) {
    -    FOREACHneighbor_(same) {
    -      if (neighbor->visitid == samevisitid)
    -        continue;
    -      if (neighbor->simplicial) {
    -        if (neighbor->visitid != qh->visit_id) {
    -          qh_setappend(qh, &newfacet->neighbors, neighbor);
    -          qh_setreplace(qh, neighbor->neighbors, same, newfacet);
    -          newneighbors++;
    -          neighbor->visitid= qh->visit_id;
    -          FOREACHridge_(neighbor->ridges) { /* update ridge in case of qh_makeridges */
    -            if (ridge->top == same) {
    -              ridge->top= newfacet;
    -              break;
    -            }else if (ridge->bottom == same) {
    -              ridge->bottom= newfacet;
    -              break;
    -            }
    -          }
    -        }else {
    -          qh_makeridges(qh, neighbor);
    -          qh_setdel(neighbor->neighbors, same);
    -          /* same can't be horizon facet for neighbor */
    -        }
    -      }else { /* non-simplicial neighbor */
    -        qh_setdel(neighbor->neighbors, same);
    -        if (neighbor->visitid != qh->visit_id) {
    -          qh_setappend(qh, &neighbor->neighbors, newfacet);
    -          qh_setappend(qh, &newfacet->neighbors, neighbor);
    -          neighbor->visitid= qh->visit_id;
    -          newneighbors++;
    -        }
    -      }
    -    }
    -  }
    -  trace2((qh, qh->ferr, 2032, "qh_mergecycle_neighbors: deleted %d neighbors and added %d\n",
    -             delneighbors, newneighbors));
    -} /* mergecycle_neighbors */
    -
    -/*---------------------------------
    -
    -  qh_mergecycle_ridges(qh, samecycle, newfacet )
    -    add ridges/neighbors for facets in samecycle to newfacet
    -    all new/old neighbors of newfacet marked with qh.visit_id
    -    facets in samecycle marked with qh.visit_id-1
    -    newfacet marked with qh.visit_id
    -
    -  returns:
    -    newfacet has merged ridges
    -
    -  notes:
    -    ridge already updated for simplicial neighbors of samecycle with a ridge
    -
    -  see:
    -    qh_mergeridges()
    -    qh_makeridges()
    -
    -  design:
    -    remove ridges between newfacet and samecycle
    -    for each facet in samecycle
    -      for each ridge in facet
    -        update facet pointers in ridge
    -        skip ridges processed in qh_mergecycle_neighors
    -        free ridges between newfacet and samecycle
    -        free ridges between facets of samecycle (on 2nd visit)
    -        append remaining ridges to newfacet
    -      if simpilicial facet
    -        for each neighbor of facet
    -          if simplicial facet
    -          and not samecycle facet or newfacet
    -            make ridge between neighbor and newfacet
    -*/
    -void qh_mergecycle_ridges(qhT *qh, facetT *samecycle, facetT *newfacet) {
    -  facetT *same, *neighbor= NULL;
    -  int numold=0, numnew=0;
    -  int neighbor_i, neighbor_n;
    -  unsigned int samevisitid;
    -  ridgeT *ridge, **ridgep;
    -  boolT toporient;
    -  void **freelistp; /* used if !qh_NOmem by qh_memfree_() */
    -
    -  trace4((qh, qh->ferr, 4033, "qh_mergecycle_ridges: delete shared ridges from newfacet\n"));
    -  samevisitid= qh->visit_id -1;
    -  FOREACHridge_(newfacet->ridges) {
    -    neighbor= otherfacet_(ridge, newfacet);
    -    if (neighbor->visitid == samevisitid)
    -      SETref_(ridge)= NULL; /* ridge free'd below */
    -  }
    -  qh_setcompact(qh, newfacet->ridges);
    -
    -  trace4((qh, qh->ferr, 4034, "qh_mergecycle_ridges: add ridges to newfacet\n"));
    -  FORALLsame_cycle_(samecycle) {
    -    FOREACHridge_(same->ridges) {
    -      if (ridge->top == same) {
    -        ridge->top= newfacet;
    -        neighbor= ridge->bottom;
    -      }else if (ridge->bottom == same) {
    -        ridge->bottom= newfacet;
    -        neighbor= ridge->top;
    -      }else if (ridge->top == newfacet || ridge->bottom == newfacet) {
    -        qh_setappend(qh, &newfacet->ridges, ridge);
    -        numold++;  /* already set by qh_mergecycle_neighbors */
    -        continue;
    -      }else {
    -        qh_fprintf(qh, qh->ferr, 6098, "qhull internal error (qh_mergecycle_ridges): bad ridge r%d\n", ridge->id);
    -        qh_errexit(qh, qh_ERRqhull, NULL, ridge);
    -      }
    -      if (neighbor == newfacet) {
    -        qh_setfree(qh, &(ridge->vertices));
    -        qh_memfree_(qh, ridge, (int)sizeof(ridgeT), freelistp);
    -        numold++;
    -      }else if (neighbor->visitid == samevisitid) {
    -        qh_setdel(neighbor->ridges, ridge);
    -        qh_setfree(qh, &(ridge->vertices));
    -        qh_memfree_(qh, ridge, (int)sizeof(ridgeT), freelistp);
    -        numold++;
    -      }else {
    -        qh_setappend(qh, &newfacet->ridges, ridge);
    -        numold++;
    -      }
    -    }
    -    if (same->ridges)
    -      qh_settruncate(qh, same->ridges, 0);
    -    if (!same->simplicial)
    -      continue;
    -    FOREACHneighbor_i_(qh, same) {       /* note: !newfact->simplicial */
    -      if (neighbor->visitid != samevisitid && neighbor->simplicial) {
    -        ridge= qh_newridge(qh);
    -        ridge->vertices= qh_setnew_delnthsorted(qh, same->vertices, qh->hull_dim,
    -                                                          neighbor_i, 0);
    -        toporient= same->toporient ^ (neighbor_i & 0x1);
    -        if (toporient) {
    -          ridge->top= newfacet;
    -          ridge->bottom= neighbor;
    -        }else {
    -          ridge->top= neighbor;
    -          ridge->bottom= newfacet;
    -        }
    -        qh_setappend(qh, &(newfacet->ridges), ridge);
    -        qh_setappend(qh, &(neighbor->ridges), ridge);
    -        numnew++;
    -      }
    -    }
    -  }
    -
    -  trace2((qh, qh->ferr, 2033, "qh_mergecycle_ridges: found %d old ridges and %d new ones\n",
    -             numold, numnew));
    -} /* mergecycle_ridges */
    -
    -/*---------------------------------
    -
    -  qh_mergecycle_vneighbors(qh, samecycle, newfacet )
    -    create vertex neighbors for newfacet from vertices of facets in samecycle
    -    samecycle marked with visitid == qh.visit_id - 1
    -
    -  returns:
    -    newfacet vertices with updated neighbors
    -    marks newfacet with qh.visit_id-1
    -    deletes vertices that are merged away
    -    sets delridge on all vertices (faster here than in mergecycle_ridges)
    -
    -  see:
    -    qh_mergevertex_neighbors()
    -
    -  design:
    -    for each vertex of samecycle facet
    -      set vertex->delridge
    -      delete samecycle facets from vertex neighbors
    -      append newfacet to vertex neighbors
    -      if vertex only in newfacet
    -        delete it from newfacet
    -        add it to qh.del_vertices for later deletion
    -*/
    -void qh_mergecycle_vneighbors(qhT *qh, facetT *samecycle, facetT *newfacet) {
    -  facetT *neighbor, **neighborp;
    -  unsigned int mergeid;
    -  vertexT *vertex, **vertexp, *apex;
    -  setT *vertices;
    -
    -  trace4((qh, qh->ferr, 4035, "qh_mergecycle_vneighbors: update vertex neighbors for newfacet\n"));
    -  mergeid= qh->visit_id - 1;
    -  newfacet->visitid= mergeid;
    -  vertices= qh_basevertices(qh, samecycle); /* temp */
    -  apex= SETfirstt_(samecycle->vertices, vertexT);
    -  qh_setappend(qh, &vertices, apex);
    -  FOREACHvertex_(vertices) {
    -    vertex->delridge= True;
    -    FOREACHneighbor_(vertex) {
    -      if (neighbor->visitid == mergeid)
    -        SETref_(neighbor)= NULL;
    -    }
    -    qh_setcompact(qh, vertex->neighbors);
    -    qh_setappend(qh, &vertex->neighbors, newfacet);
    -    if (!SETsecond_(vertex->neighbors)) {
    -      zinc_(Zcyclevertex);
    -      trace2((qh, qh->ferr, 2034, "qh_mergecycle_vneighbors: deleted v%d when merging cycle f%d into f%d\n",
    -        vertex->id, samecycle->id, newfacet->id));
    -      qh_setdelsorted(newfacet->vertices, vertex);
    -      vertex->deleted= True;
    -      qh_setappend(qh, &qh->del_vertices, vertex);
    -    }
    -  }
    -  qh_settempfree(qh, &vertices);
    -  trace3((qh, qh->ferr, 3005, "qh_mergecycle_vneighbors: merged vertices from cycle f%d into f%d\n",
    -             samecycle->id, newfacet->id));
    -} /* mergecycle_vneighbors */
    -
    -/*---------------------------------
    -
    -  qh_mergefacet(qh, facet1, facet2, mindist, maxdist, mergeapex )
    -    merges facet1 into facet2
    -    mergeapex==qh_MERGEapex if merging new facet into coplanar horizon
    -
    -  returns:
    -    qh.max_outside and qh.min_vertex updated
    -    initializes vertex neighbors on first merge
    -
    -  returns:
    -    facet2 contains facet1's vertices, neighbors, and ridges
    -      facet2 moved to end of qh.facet_list
    -      makes facet2 a newfacet
    -      sets facet2->newmerge set
    -      clears facet2->center (unless merging into a large facet)
    -      clears facet2->tested and ridge->tested for facet1
    -
    -    facet1 prepended to visible_list for later deletion and partitioning
    -      facet1->f.replace == facet2
    -
    -    adds neighboring facets to facet_mergeset if redundant or degenerate
    -
    -  notes:
    -    mindist/maxdist may be NULL (only if both NULL)
    -    traces merge if fmax_(maxdist,-mindist) > TRACEdist
    -
    -  see:
    -    qh_mergecycle()
    -
    -  design:
    -    trace merge and check for degenerate simplex
    -    make ridges for both facets
    -    update qh.max_outside, qh.max_vertex, qh.min_vertex
    -    update facet2->maxoutside and keepcentrum
    -    update facet2->nummerge
    -    update tested flags for facet2
    -    if facet1 is simplicial
    -      merge facet1 into facet2
    -    else
    -      merge facet1's neighbors into facet2
    -      merge facet1's ridges into facet2
    -      merge facet1's vertices into facet2
    -      merge facet1's vertex neighbors into facet2
    -      add facet2's vertices to qh.new_vertexlist
    -      unless qh_MERGEapex
    -        test facet2 for degenerate or redundant neighbors
    -      move facet1 to qh.visible_list for later deletion
    -      move facet2 to end of qh.newfacet_list
    -*/
    -void qh_mergefacet(qhT *qh, facetT *facet1, facetT *facet2, realT *mindist, realT *maxdist, boolT mergeapex) {
    -  boolT traceonce= False;
    -  vertexT *vertex, **vertexp;
    -  int tracerestore=0, nummerge;
    -
    -  if (facet1->tricoplanar || facet2->tricoplanar) {
    -    if (!qh->TRInormals) {
    -      qh_fprintf(qh, qh->ferr, 6226, "Qhull internal error (qh_mergefacet): does not work for tricoplanar facets.  Use option 'Q11'\n");
    -      qh_errexit2(qh, qh_ERRqhull, facet1, facet2);
    -    }
    -    if (facet2->tricoplanar) {
    -      facet2->tricoplanar= False;
    -      facet2->keepcentrum= False;
    -    }
    -  }
    -  zzinc_(Ztotmerge);
    -  if (qh->REPORTfreq2 && qh->POSTmerging) {
    -    if (zzval_(Ztotmerge) > qh->mergereport + qh->REPORTfreq2)
    -      qh_tracemerging(qh);
    -  }
    -#ifndef qh_NOtrace
    -  if (qh->build_cnt >= qh->RERUN) {
    -    if (mindist && (-*mindist > qh->TRACEdist || *maxdist > qh->TRACEdist)) {
    -      tracerestore= 0;
    -      qh->IStracing= qh->TRACElevel;
    -      traceonce= True;
    -      qh_fprintf(qh, qh->ferr, 8075, "qh_mergefacet: ========= trace wide merge #%d(%2.2g) for f%d into f%d, last point was p%d\n", zzval_(Ztotmerge),
    -             fmax_(-*mindist, *maxdist), facet1->id, facet2->id, qh->furthest_id);
    -    }else if (facet1 == qh->tracefacet || facet2 == qh->tracefacet) {
    -      tracerestore= qh->IStracing;
    -      qh->IStracing= 4;
    -      traceonce= True;
    -      qh_fprintf(qh, qh->ferr, 8076, "qh_mergefacet: ========= trace merge #%d involving f%d, furthest is p%d\n",
    -                 zzval_(Ztotmerge), qh->tracefacet_id,  qh->furthest_id);
    -    }
    -  }
    -  if (qh->IStracing >= 2) {
    -    realT mergemin= -2;
    -    realT mergemax= -2;
    -
    -    if (mindist) {
    -      mergemin= *mindist;
    -      mergemax= *maxdist;
    -    }
    -    qh_fprintf(qh, qh->ferr, 8077, "qh_mergefacet: #%d merge f%d into f%d, mindist= %2.2g, maxdist= %2.2g\n",
    -    zzval_(Ztotmerge), facet1->id, facet2->id, mergemin, mergemax);
    -  }
    -#endif /* !qh_NOtrace */
    -  if (facet1 == facet2 || facet1->visible || facet2->visible) {
    -    qh_fprintf(qh, qh->ferr, 6099, "qhull internal error (qh_mergefacet): either f%d and f%d are the same or one is a visible facet\n",
    -             facet1->id, facet2->id);
    -    qh_errexit2(qh, qh_ERRqhull, facet1, facet2);
    -  }
    -  if (qh->num_facets - qh->num_visible <= qh->hull_dim + 1) {
    -    qh_fprintf(qh, qh->ferr, 6227, "\n\
    -qhull precision error: Only %d facets remain.  Can not merge another\n\
    -pair.  The input is too degenerate or the convexity constraints are\n\
    -too strong.\n", qh->hull_dim+1);
    -    if (qh->hull_dim >= 5 && !qh->MERGEexact)
    -      qh_fprintf(qh, qh->ferr, 8079, "Option 'Qx' may avoid this problem.\n");
    -    qh_errexit(qh, qh_ERRprec, NULL, NULL);
    -  }
    -  if (!qh->VERTEXneighbors)
    -    qh_vertexneighbors(qh);
    -  qh_makeridges(qh, facet1);
    -  qh_makeridges(qh, facet2);
    -  if (qh->IStracing >=4)
    -    qh_errprint(qh, "MERGING", facet1, facet2, NULL, NULL);
    -  if (mindist) {
    -    maximize_(qh->max_outside, *maxdist);
    -    maximize_(qh->max_vertex, *maxdist);
    -#if qh_MAXoutside
    -    maximize_(facet2->maxoutside, *maxdist);
    -#endif
    -    minimize_(qh->min_vertex, *mindist);
    -    if (!facet2->keepcentrum
    -    && (*maxdist > qh->WIDEfacet || *mindist < -qh->WIDEfacet)) {
    -      facet2->keepcentrum= True;
    -      zinc_(Zwidefacet);
    -    }
    -  }
    -  nummerge= facet1->nummerge + facet2->nummerge + 1;
    -  if (nummerge >= qh_MAXnummerge)
    -    facet2->nummerge= qh_MAXnummerge;
    -  else
    -    facet2->nummerge= (short unsigned int)nummerge;
    -  facet2->newmerge= True;
    -  facet2->dupridge= False;
    -  qh_updatetested(qh, facet1, facet2);
    -  if (qh->hull_dim > 2 && qh_setsize(qh, facet1->vertices) == qh->hull_dim)
    -    qh_mergesimplex(qh, facet1, facet2, mergeapex);
    -  else {
    -    qh->vertex_visit++;
    -    FOREACHvertex_(facet2->vertices)
    -      vertex->visitid= qh->vertex_visit;
    -    if (qh->hull_dim == 2)
    -      qh_mergefacet2d(qh, facet1, facet2);
    -    else {
    -      qh_mergeneighbors(qh, facet1, facet2);
    -      qh_mergevertices(qh, facet1->vertices, &facet2->vertices);
    -    }
    -    qh_mergeridges(qh, facet1, facet2);
    -    qh_mergevertex_neighbors(qh, facet1, facet2);
    -    if (!facet2->newfacet)
    -      qh_newvertices(qh, facet2->vertices);
    -  }
    -  if (!mergeapex)
    -    qh_degen_redundant_neighbors(qh, facet2, facet1);
    -  if (facet2->coplanar || !facet2->newfacet) {
    -    zinc_(Zmergeintohorizon);
    -  }else if (!facet1->newfacet && facet2->newfacet) {
    -    zinc_(Zmergehorizon);
    -  }else {
    -    zinc_(Zmergenew);
    -  }
    -  qh_willdelete(qh, facet1, facet2);
    -  qh_removefacet(qh, facet2);  /* append as a newfacet to end of qh->facet_list */
    -  qh_appendfacet(qh, facet2);
    -  facet2->newfacet= True;
    -  facet2->tested= False;
    -  qh_tracemerge(qh, facet1, facet2);
    -  if (traceonce) {
    -    qh_fprintf(qh, qh->ferr, 8080, "qh_mergefacet: end of wide tracing\n");
    -    qh->IStracing= tracerestore;
    -  }
    -} /* mergefacet */
    -
    -
    -/*---------------------------------
    -
    -  qh_mergefacet2d(qh, facet1, facet2 )
    -    in 2d, merges neighbors and vertices of facet1 into facet2
    -
    -  returns:
    -    build ridges for neighbors if necessary
    -    facet2 looks like a simplicial facet except for centrum, ridges
    -      neighbors are opposite the corresponding vertex
    -      maintains orientation of facet2
    -
    -  notes:
    -    qh_mergefacet() retains non-simplicial structures
    -      they are not needed in 2d, but later routines may use them
    -    preserves qh.vertex_visit for qh_mergevertex_neighbors()
    -
    -  design:
    -    get vertices and neighbors
    -    determine new vertices and neighbors
    -    set new vertices and neighbors and adjust orientation
    -    make ridges for new neighbor if needed
    -*/
    -void qh_mergefacet2d(qhT *qh, facetT *facet1, facetT *facet2) {
    -  vertexT *vertex1A, *vertex1B, *vertex2A, *vertex2B, *vertexA, *vertexB;
    -  facetT *neighbor1A, *neighbor1B, *neighbor2A, *neighbor2B, *neighborA, *neighborB;
    -
    -  vertex1A= SETfirstt_(facet1->vertices, vertexT);
    -  vertex1B= SETsecondt_(facet1->vertices, vertexT);
    -  vertex2A= SETfirstt_(facet2->vertices, vertexT);
    -  vertex2B= SETsecondt_(facet2->vertices, vertexT);
    -  neighbor1A= SETfirstt_(facet1->neighbors, facetT);
    -  neighbor1B= SETsecondt_(facet1->neighbors, facetT);
    -  neighbor2A= SETfirstt_(facet2->neighbors, facetT);
    -  neighbor2B= SETsecondt_(facet2->neighbors, facetT);
    -  if (vertex1A == vertex2A) {
    -    vertexA= vertex1B;
    -    vertexB= vertex2B;
    -    neighborA= neighbor2A;
    -    neighborB= neighbor1A;
    -  }else if (vertex1A == vertex2B) {
    -    vertexA= vertex1B;
    -    vertexB= vertex2A;
    -    neighborA= neighbor2B;
    -    neighborB= neighbor1A;
    -  }else if (vertex1B == vertex2A) {
    -    vertexA= vertex1A;
    -    vertexB= vertex2B;
    -    neighborA= neighbor2A;
    -    neighborB= neighbor1B;
    -  }else { /* 1B == 2B */
    -    vertexA= vertex1A;
    -    vertexB= vertex2A;
    -    neighborA= neighbor2B;
    -    neighborB= neighbor1B;
    -  }
    -  /* vertexB always from facet2, neighborB always from facet1 */
    -  if (vertexA->id > vertexB->id) {
    -    SETfirst_(facet2->vertices)= vertexA;
    -    SETsecond_(facet2->vertices)= vertexB;
    -    if (vertexB == vertex2A)
    -      facet2->toporient= !facet2->toporient;
    -    SETfirst_(facet2->neighbors)= neighborA;
    -    SETsecond_(facet2->neighbors)= neighborB;
    -  }else {
    -    SETfirst_(facet2->vertices)= vertexB;
    -    SETsecond_(facet2->vertices)= vertexA;
    -    if (vertexB == vertex2B)
    -      facet2->toporient= !facet2->toporient;
    -    SETfirst_(facet2->neighbors)= neighborB;
    -    SETsecond_(facet2->neighbors)= neighborA;
    -  }
    -  qh_makeridges(qh, neighborB);
    -  qh_setreplace(qh, neighborB->neighbors, facet1, facet2);
    -  trace4((qh, qh->ferr, 4036, "qh_mergefacet2d: merged v%d and neighbor f%d of f%d into f%d\n",
    -       vertexA->id, neighborB->id, facet1->id, facet2->id));
    -} /* mergefacet2d */
    -
    -
    -/*---------------------------------
    -
    -  qh_mergeneighbors(qh, facet1, facet2 )
    -    merges the neighbors of facet1 into facet2
    -
    -  see:
    -    qh_mergecycle_neighbors()
    -
    -  design:
    -    for each neighbor of facet1
    -      if neighbor is also a neighbor of facet2
    -        if neighbor is simpilicial
    -          make ridges for later deletion as a degenerate facet
    -        update its neighbor set
    -      else
    -        move the neighbor relation to facet2
    -    remove the neighbor relation for facet1 and facet2
    -*/
    -void qh_mergeneighbors(qhT *qh, facetT *facet1, facetT *facet2) {
    -  facetT *neighbor, **neighborp;
    -
    -  trace4((qh, qh->ferr, 4037, "qh_mergeneighbors: merge neighbors of f%d and f%d\n",
    -          facet1->id, facet2->id));
    -  qh->visit_id++;
    -  FOREACHneighbor_(facet2) {
    -    neighbor->visitid= qh->visit_id;
    -  }
    -  FOREACHneighbor_(facet1) {
    -    if (neighbor->visitid == qh->visit_id) {
    -      if (neighbor->simplicial)    /* is degen, needs ridges */
    -        qh_makeridges(qh, neighbor);
    -      if (SETfirstt_(neighbor->neighbors, facetT) != facet1) /*keep newfacet->horizon*/
    -        qh_setdel(neighbor->neighbors, facet1);
    -      else {
    -        qh_setdel(neighbor->neighbors, facet2);
    -        qh_setreplace(qh, neighbor->neighbors, facet1, facet2);
    -      }
    -    }else if (neighbor != facet2) {
    -      qh_setappend(qh, &(facet2->neighbors), neighbor);
    -      qh_setreplace(qh, neighbor->neighbors, facet1, facet2);
    -    }
    -  }
    -  qh_setdel(facet1->neighbors, facet2);  /* here for makeridges */
    -  qh_setdel(facet2->neighbors, facet1);
    -} /* mergeneighbors */
    -
    -
    -/*---------------------------------
    -
    -  qh_mergeridges(qh, facet1, facet2 )
    -    merges the ridge set of facet1 into facet2
    -
    -  returns:
    -    may delete all ridges for a vertex
    -    sets vertex->delridge on deleted ridges
    -
    -  see:
    -    qh_mergecycle_ridges()
    -
    -  design:
    -    delete ridges between facet1 and facet2
    -      mark (delridge) vertices on these ridges for later testing
    -    for each remaining ridge
    -      rename facet1 to facet2
    -*/
    -void qh_mergeridges(qhT *qh, facetT *facet1, facetT *facet2) {
    -  ridgeT *ridge, **ridgep;
    -  vertexT *vertex, **vertexp;
    -
    -  trace4((qh, qh->ferr, 4038, "qh_mergeridges: merge ridges of f%d and f%d\n",
    -          facet1->id, facet2->id));
    -  FOREACHridge_(facet2->ridges) {
    -    if ((ridge->top == facet1) || (ridge->bottom == facet1)) {
    -      FOREACHvertex_(ridge->vertices)
    -        vertex->delridge= True;
    -      qh_delridge(qh, ridge);  /* expensive in high-d, could rebuild */
    -      ridgep--; /*repeat*/
    -    }
    -  }
    -  FOREACHridge_(facet1->ridges) {
    -    if (ridge->top == facet1)
    -      ridge->top= facet2;
    -    else
    -      ridge->bottom= facet2;
    -    qh_setappend(qh, &(facet2->ridges), ridge);
    -  }
    -} /* mergeridges */
    -
    -
    -/*---------------------------------
    -
    -  qh_mergesimplex(qh, facet1, facet2, mergeapex )
    -    merge simplicial facet1 into facet2
    -    mergeapex==qh_MERGEapex if merging samecycle into horizon facet
    -      vertex id is latest (most recently created)
    -    facet1 may be contained in facet2
    -    ridges exist for both facets
    -
    -  returns:
    -    facet2 with updated vertices, ridges, neighbors
    -    updated neighbors for facet1's vertices
    -    facet1 not deleted
    -    sets vertex->delridge on deleted ridges
    -
    -  notes:
    -    special case code since this is the most common merge
    -    called from qh_mergefacet()
    -
    -  design:
    -    if qh_MERGEapex
    -      add vertices of facet2 to qh.new_vertexlist if necessary
    -      add apex to facet2
    -    else
    -      for each ridge between facet1 and facet2
    -        set vertex->delridge
    -      determine the apex for facet1 (i.e., vertex to be merged)
    -      unless apex already in facet2
    -        insert apex into vertices for facet2
    -      add vertices of facet2 to qh.new_vertexlist if necessary
    -      add apex to qh.new_vertexlist if necessary
    -      for each vertex of facet1
    -        if apex
    -          rename facet1 to facet2 in its vertex neighbors
    -        else
    -          delete facet1 from vertex neighors
    -          if only in facet2
    -            add vertex to qh.del_vertices for later deletion
    -      for each ridge of facet1
    -        delete ridges between facet1 and facet2
    -        append other ridges to facet2 after renaming facet to facet2
    -*/
    -void qh_mergesimplex(qhT *qh, facetT *facet1, facetT *facet2, boolT mergeapex) {
    -  vertexT *vertex, **vertexp, *apex;
    -  ridgeT *ridge, **ridgep;
    -  boolT issubset= False;
    -  int vertex_i= -1, vertex_n;
    -  facetT *neighbor, **neighborp, *otherfacet;
    -
    -  if (mergeapex) {
    -    if (!facet2->newfacet)
    -      qh_newvertices(qh, facet2->vertices);  /* apex is new */
    -    apex= SETfirstt_(facet1->vertices, vertexT);
    -    if (SETfirstt_(facet2->vertices, vertexT) != apex)
    -      qh_setaddnth(qh, &facet2->vertices, 0, apex);  /* apex has last id */
    -    else
    -      issubset= True;
    -  }else {
    -    zinc_(Zmergesimplex);
    -    FOREACHvertex_(facet1->vertices)
    -      vertex->seen= False;
    -    FOREACHridge_(facet1->ridges) {
    -      if (otherfacet_(ridge, facet1) == facet2) {
    -        FOREACHvertex_(ridge->vertices) {
    -          vertex->seen= True;
    -          vertex->delridge= True;
    -        }
    -        break;
    -      }
    -    }
    -    FOREACHvertex_(facet1->vertices) {
    -      if (!vertex->seen)
    -        break;  /* must occur */
    -    }
    -    apex= vertex;
    -    trace4((qh, qh->ferr, 4039, "qh_mergesimplex: merge apex v%d of f%d into facet f%d\n",
    -          apex->id, facet1->id, facet2->id));
    -    FOREACHvertex_i_(qh, facet2->vertices) {
    -      if (vertex->id < apex->id) {
    -        break;
    -      }else if (vertex->id == apex->id) {
    -        issubset= True;
    -        break;
    -      }
    -    }
    -    if (!issubset)
    -      qh_setaddnth(qh, &facet2->vertices, vertex_i, apex);
    -    if (!facet2->newfacet)
    -      qh_newvertices(qh, facet2->vertices);
    -    else if (!apex->newlist) {
    -      qh_removevertex(qh, apex);
    -      qh_appendvertex(qh, apex);
    -    }
    -  }
    -  trace4((qh, qh->ferr, 4040, "qh_mergesimplex: update vertex neighbors of f%d\n",
    -          facet1->id));
    -  FOREACHvertex_(facet1->vertices) {
    -    if (vertex == apex && !issubset)
    -      qh_setreplace(qh, vertex->neighbors, facet1, facet2);
    -    else {
    -      qh_setdel(vertex->neighbors, facet1);
    -      if (!SETsecond_(vertex->neighbors))
    -        qh_mergevertex_del(qh, vertex, facet1, facet2);
    -    }
    -  }
    -  trace4((qh, qh->ferr, 4041, "qh_mergesimplex: merge ridges and neighbors of f%d into f%d\n",
    -          facet1->id, facet2->id));
    -  qh->visit_id++;
    -  FOREACHneighbor_(facet2)
    -    neighbor->visitid= qh->visit_id;
    -  FOREACHridge_(facet1->ridges) {
    -    otherfacet= otherfacet_(ridge, facet1);
    -    if (otherfacet == facet2) {
    -      qh_setdel(facet2->ridges, ridge);
    -      qh_setfree(qh, &(ridge->vertices));
    -      qh_memfree(qh, ridge, (int)sizeof(ridgeT));
    -      qh_setdel(facet2->neighbors, facet1);
    -    }else {
    -      qh_setappend(qh, &facet2->ridges, ridge);
    -      if (otherfacet->visitid != qh->visit_id) {
    -        qh_setappend(qh, &facet2->neighbors, otherfacet);
    -        qh_setreplace(qh, otherfacet->neighbors, facet1, facet2);
    -        otherfacet->visitid= qh->visit_id;
    -      }else {
    -        if (otherfacet->simplicial)    /* is degen, needs ridges */
    -          qh_makeridges(qh, otherfacet);
    -        if (SETfirstt_(otherfacet->neighbors, facetT) != facet1)
    -          qh_setdel(otherfacet->neighbors, facet1);
    -        else {   /*keep newfacet->neighbors->horizon*/
    -          qh_setdel(otherfacet->neighbors, facet2);
    -          qh_setreplace(qh, otherfacet->neighbors, facet1, facet2);
    -        }
    -      }
    -      if (ridge->top == facet1) /* wait until after qh_makeridges */
    -        ridge->top= facet2;
    -      else
    -        ridge->bottom= facet2;
    -    }
    -  }
    -  SETfirst_(facet1->ridges)= NULL; /* it will be deleted */
    -  trace3((qh, qh->ferr, 3006, "qh_mergesimplex: merged simplex f%d apex v%d into facet f%d\n",
    -          facet1->id, getid_(apex), facet2->id));
    -} /* mergesimplex */
    -
    -/*---------------------------------
    -
    -  qh_mergevertex_del(qh, vertex, facet1, facet2 )
    -    delete a vertex because of merging facet1 into facet2
    -
    -  returns:
    -    deletes vertex from facet2
    -    adds vertex to qh.del_vertices for later deletion
    -*/
    -void qh_mergevertex_del(qhT *qh, vertexT *vertex, facetT *facet1, facetT *facet2) {
    -
    -  zinc_(Zmergevertex);
    -  trace2((qh, qh->ferr, 2035, "qh_mergevertex_del: deleted v%d when merging f%d into f%d\n",
    -          vertex->id, facet1->id, facet2->id));
    -  qh_setdelsorted(facet2->vertices, vertex);
    -  vertex->deleted= True;
    -  qh_setappend(qh, &qh->del_vertices, vertex);
    -} /* mergevertex_del */
    -
    -/*---------------------------------
    -
    -  qh_mergevertex_neighbors(qh, facet1, facet2 )
    -    merge the vertex neighbors of facet1 to facet2
    -
    -  returns:
    -    if vertex is current qh.vertex_visit
    -      deletes facet1 from vertex->neighbors
    -    else
    -      renames facet1 to facet2 in vertex->neighbors
    -    deletes vertices if only one neighbor
    -
    -  notes:
    -    assumes vertex neighbor sets are good
    -*/
    -void qh_mergevertex_neighbors(qhT *qh, facetT *facet1, facetT *facet2) {
    -  vertexT *vertex, **vertexp;
    -
    -  trace4((qh, qh->ferr, 4042, "qh_mergevertex_neighbors: merge vertex neighbors of f%d and f%d\n",
    -          facet1->id, facet2->id));
    -  if (qh->tracevertex) {
    -    qh_fprintf(qh, qh->ferr, 8081, "qh_mergevertex_neighbors: of f%d and f%d at furthest p%d f0= %p\n",
    -             facet1->id, facet2->id, qh->furthest_id, qh->tracevertex->neighbors->e[0].p);
    -    qh_errprint(qh, "TRACE", NULL, NULL, NULL, qh->tracevertex);
    -  }
    -  FOREACHvertex_(facet1->vertices) {
    -    if (vertex->visitid != qh->vertex_visit)
    -      qh_setreplace(qh, vertex->neighbors, facet1, facet2);
    -    else {
    -      qh_setdel(vertex->neighbors, facet1);
    -      if (!SETsecond_(vertex->neighbors))
    -        qh_mergevertex_del(qh, vertex, facet1, facet2);
    -    }
    -  }
    -  if (qh->tracevertex)
    -    qh_errprint(qh, "TRACE", NULL, NULL, NULL, qh->tracevertex);
    -} /* mergevertex_neighbors */
    -
    -
    -/*---------------------------------
    -
    -  qh_mergevertices(qh, vertices1, vertices2 )
    -    merges the vertex set of facet1 into facet2
    -
    -  returns:
    -    replaces vertices2 with merged set
    -    preserves vertex_visit for qh_mergevertex_neighbors
    -    updates qh.newvertex_list
    -
    -  design:
    -    create a merged set of both vertices (in inverse id order)
    -*/
    -void qh_mergevertices(qhT *qh, setT *vertices1, setT **vertices2) {
    -  int newsize= qh_setsize(qh, vertices1)+qh_setsize(qh, *vertices2) - qh->hull_dim + 1;
    -  setT *mergedvertices;
    -  vertexT *vertex, **vertexp, **vertex2= SETaddr_(*vertices2, vertexT);
    -
    -  mergedvertices= qh_settemp(qh, newsize);
    -  FOREACHvertex_(vertices1) {
    -    if (!*vertex2 || vertex->id > (*vertex2)->id)
    -      qh_setappend(qh, &mergedvertices, vertex);
    -    else {
    -      while (*vertex2 && (*vertex2)->id > vertex->id)
    -        qh_setappend(qh, &mergedvertices, *vertex2++);
    -      if (!*vertex2 || (*vertex2)->id < vertex->id)
    -        qh_setappend(qh, &mergedvertices, vertex);
    -      else
    -        qh_setappend(qh, &mergedvertices, *vertex2++);
    -    }
    -  }
    -  while (*vertex2)
    -    qh_setappend(qh, &mergedvertices, *vertex2++);
    -  if (newsize < qh_setsize(qh, mergedvertices)) {
    -    qh_fprintf(qh, qh->ferr, 6100, "qhull internal error (qh_mergevertices): facets did not share a ridge\n");
    -    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -  }
    -  qh_setfree(qh, vertices2);
    -  *vertices2= mergedvertices;
    -  qh_settemppop(qh);
    -} /* mergevertices */
    -
    -
    -/*---------------------------------
    -
    -  qh_neighbor_intersections(qh, vertex )
    -    return intersection of all vertices in vertex->neighbors except for vertex
    -
    -  returns:
    -    returns temporary set of vertices
    -    does not include vertex
    -    NULL if a neighbor is simplicial
    -    NULL if empty set
    -
    -  notes:
    -    used for renaming vertices
    -
    -  design:
    -    initialize the intersection set with vertices of the first two neighbors
    -    delete vertex from the intersection
    -    for each remaining neighbor
    -      intersect its vertex set with the intersection set
    -      return NULL if empty
    -    return the intersection set
    -*/
    -setT *qh_neighbor_intersections(qhT *qh, vertexT *vertex) {
    -  facetT *neighbor, **neighborp, *neighborA, *neighborB;
    -  setT *intersect;
    -  int neighbor_i, neighbor_n;
    -
    -  FOREACHneighbor_(vertex) {
    -    if (neighbor->simplicial)
    -      return NULL;
    -  }
    -  neighborA= SETfirstt_(vertex->neighbors, facetT);
    -  neighborB= SETsecondt_(vertex->neighbors, facetT);
    -  zinc_(Zintersectnum);
    -  if (!neighborA)
    -    return NULL;
    -  if (!neighborB)
    -    intersect= qh_setcopy(qh, neighborA->vertices, 0);
    -  else
    -    intersect= qh_vertexintersect_new(qh, neighborA->vertices, neighborB->vertices);
    -  qh_settemppush(qh, intersect);
    -  qh_setdelsorted(intersect, vertex);
    -  FOREACHneighbor_i_(qh, vertex) {
    -    if (neighbor_i >= 2) {
    -      zinc_(Zintersectnum);
    -      qh_vertexintersect(qh, &intersect, neighbor->vertices);
    -      if (!SETfirst_(intersect)) {
    -        zinc_(Zintersectfail);
    -        qh_settempfree(qh, &intersect);
    -        return NULL;
    -      }
    -    }
    -  }
    -  trace3((qh, qh->ferr, 3007, "qh_neighbor_intersections: %d vertices in neighbor intersection of v%d\n",
    -          qh_setsize(qh, intersect), vertex->id));
    -  return intersect;
    -} /* neighbor_intersections */
    -
    -/*---------------------------------
    -
    -  qh_newvertices(qh, vertices )
    -    add vertices to end of qh.vertex_list (marks as new vertices)
    -
    -  returns:
    -    vertices on qh.newvertex_list
    -    vertex->newlist set
    -*/
    -void qh_newvertices(qhT *qh, setT *vertices) {
    -  vertexT *vertex, **vertexp;
    -
    -  FOREACHvertex_(vertices) {
    -    if (!vertex->newlist) {
    -      qh_removevertex(qh, vertex);
    -      qh_appendvertex(qh, vertex);
    -    }
    -  }
    -} /* newvertices */
    -
    -/*---------------------------------
    -
    -  qh_reducevertices(qh)
    -    reduce extra vertices, shared vertices, and redundant vertices
    -    facet->newmerge is set if merged since last call
    -    if !qh.MERGEvertices, only removes extra vertices
    -
    -  returns:
    -    True if also merged degen_redundant facets
    -    vertices are renamed if possible
    -    clears facet->newmerge and vertex->delridge
    -
    -  notes:
    -    ignored if 2-d
    -
    -  design:
    -    merge any degenerate or redundant facets
    -    for each newly merged facet
    -      remove extra vertices
    -    if qh.MERGEvertices
    -      for each newly merged facet
    -        for each vertex
    -          if vertex was on a deleted ridge
    -            rename vertex if it is shared
    -      remove delridge flag from new vertices
    -*/
    -boolT qh_reducevertices(qhT *qh) {
    -  int numshare=0, numrename= 0;
    -  boolT degenredun= False;
    -  facetT *newfacet;
    -  vertexT *vertex, **vertexp;
    -
    -  if (qh->hull_dim == 2)
    -    return False;
    -  if (qh_merge_degenredundant(qh))
    -    degenredun= True;
    - LABELrestart:
    -  FORALLnew_facets {
    -    if (newfacet->newmerge) {
    -      if (!qh->MERGEvertices)
    -        newfacet->newmerge= False;
    -      qh_remove_extravertices(qh, newfacet);
    -    }
    -  }
    -  if (!qh->MERGEvertices)
    -    return False;
    -  FORALLnew_facets {
    -    if (newfacet->newmerge) {
    -      newfacet->newmerge= False;
    -      FOREACHvertex_(newfacet->vertices) {
    -        if (vertex->delridge) {
    -          if (qh_rename_sharedvertex(qh, vertex, newfacet)) {
    -            numshare++;
    -            vertexp--; /* repeat since deleted vertex */
    -          }
    -        }
    -      }
    -    }
    -  }
    -  FORALLvertex_(qh->newvertex_list) {
    -    if (vertex->delridge && !vertex->deleted) {
    -      vertex->delridge= False;
    -      if (qh->hull_dim >= 4 && qh_redundant_vertex(qh, vertex)) {
    -        numrename++;
    -        if (qh_merge_degenredundant(qh)) {
    -          degenredun= True;
    -          goto LABELrestart;
    -        }
    -      }
    -    }
    -  }
    -  trace1((qh, qh->ferr, 1014, "qh_reducevertices: renamed %d shared vertices and %d redundant vertices. Degen? %d\n",
    -          numshare, numrename, degenredun));
    -  return degenredun;
    -} /* reducevertices */
    -
    -/*---------------------------------
    -
    -  qh_redundant_vertex(qh, vertex )
    -    detect and rename a redundant vertex
    -    vertices have full vertex->neighbors
    -
    -  returns:
    -    returns true if find a redundant vertex
    -      deletes vertex(vertex->deleted)
    -
    -  notes:
    -    only needed if vertex->delridge and hull_dim >= 4
    -    may add degenerate facets to qh.facet_mergeset
    -    doesn't change vertex->neighbors or create redundant facets
    -
    -  design:
    -    intersect vertices of all facet neighbors of vertex
    -    determine ridges for these vertices
    -    if find a new vertex for vertex amoung these ridges and vertices
    -      rename vertex to the new vertex
    -*/
    -vertexT *qh_redundant_vertex(qhT *qh, vertexT *vertex) {
    -  vertexT *newvertex= NULL;
    -  setT *vertices, *ridges;
    -
    -  trace3((qh, qh->ferr, 3008, "qh_redundant_vertex: check if v%d can be renamed\n", vertex->id));
    -  if ((vertices= qh_neighbor_intersections(qh, vertex))) {
    -    ridges= qh_vertexridges(qh, vertex);
    -    if ((newvertex= qh_find_newvertex(qh, vertex, vertices, ridges)))
    -      qh_renamevertex(qh, vertex, newvertex, ridges, NULL, NULL);
    -    qh_settempfree(qh, &ridges);
    -    qh_settempfree(qh, &vertices);
    -  }
    -  return newvertex;
    -} /* redundant_vertex */
    -
    -/*---------------------------------
    -
    -  qh_remove_extravertices(qh, facet )
    -    remove extra vertices from non-simplicial facets
    -
    -  returns:
    -    returns True if it finds them
    -
    -  design:
    -    for each vertex in facet
    -      if vertex not in a ridge (i.e., no longer used)
    -        delete vertex from facet
    -        delete facet from vertice's neighbors
    -        unless vertex in another facet
    -          add vertex to qh.del_vertices for later deletion
    -*/
    -boolT qh_remove_extravertices(qhT *qh, facetT *facet) {
    -  ridgeT *ridge, **ridgep;
    -  vertexT *vertex, **vertexp;
    -  boolT foundrem= False;
    -
    -  trace4((qh, qh->ferr, 4043, "qh_remove_extravertices: test f%d for extra vertices\n",
    -          facet->id));
    -  FOREACHvertex_(facet->vertices)
    -    vertex->seen= False;
    -  FOREACHridge_(facet->ridges) {
    -    FOREACHvertex_(ridge->vertices)
    -      vertex->seen= True;
    -  }
    -  FOREACHvertex_(facet->vertices) {
    -    if (!vertex->seen) {
    -      foundrem= True;
    -      zinc_(Zremvertex);
    -      qh_setdelsorted(facet->vertices, vertex);
    -      qh_setdel(vertex->neighbors, facet);
    -      if (!qh_setsize(qh, vertex->neighbors)) {
    -        vertex->deleted= True;
    -        qh_setappend(qh, &qh->del_vertices, vertex);
    -        zinc_(Zremvertexdel);
    -        trace2((qh, qh->ferr, 2036, "qh_remove_extravertices: v%d deleted because it's lost all ridges\n", vertex->id));
    -      }else
    -        trace3((qh, qh->ferr, 3009, "qh_remove_extravertices: v%d removed from f%d because it's lost all ridges\n", vertex->id, facet->id));
    -      vertexp--; /*repeat*/
    -    }
    -  }
    -  return foundrem;
    -} /* remove_extravertices */
    -
    -/*---------------------------------
    -
    -  qh_rename_sharedvertex(qh, vertex, facet )
    -    detect and rename if shared vertex in facet
    -    vertices have full ->neighbors
    -
    -  returns:
    -    newvertex or NULL
    -    the vertex may still exist in other facets (i.e., a neighbor was pinched)
    -    does not change facet->neighbors
    -    updates vertex->neighbors
    -
    -  notes:
    -    a shared vertex for a facet is only in ridges to one neighbor
    -    this may undo a pinched facet
    -
    -    it does not catch pinches involving multiple facets.  These appear
    -      to be difficult to detect, since an exhaustive search is too expensive.
    -
    -  design:
    -    if vertex only has two neighbors
    -      determine the ridges that contain the vertex
    -      determine the vertices shared by both neighbors
    -      if can find a new vertex in this set
    -        rename the vertex to the new vertex
    -*/
    -vertexT *qh_rename_sharedvertex(qhT *qh, vertexT *vertex, facetT *facet) {
    -  facetT *neighbor, **neighborp, *neighborA= NULL;
    -  setT *vertices, *ridges;
    -  vertexT *newvertex;
    -
    -  if (qh_setsize(qh, vertex->neighbors) == 2) {
    -    neighborA= SETfirstt_(vertex->neighbors, facetT);
    -    if (neighborA == facet)
    -      neighborA= SETsecondt_(vertex->neighbors, facetT);
    -  }else if (qh->hull_dim == 3)
    -    return NULL;
    -  else {
    -    qh->visit_id++;
    -    FOREACHneighbor_(facet)
    -      neighbor->visitid= qh->visit_id;
    -    FOREACHneighbor_(vertex) {
    -      if (neighbor->visitid == qh->visit_id) {
    -        if (neighborA)
    -          return NULL;
    -        neighborA= neighbor;
    -      }
    -    }
    -    if (!neighborA) {
    -      qh_fprintf(qh, qh->ferr, 6101, "qhull internal error (qh_rename_sharedvertex): v%d's neighbors not in f%d\n",
    -        vertex->id, facet->id);
    -      qh_errprint(qh, "ERRONEOUS", facet, NULL, NULL, vertex);
    -      qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -    }
    -  }
    -  /* the vertex is shared by facet and neighborA */
    -  ridges= qh_settemp(qh, qh->TEMPsize);
    -  neighborA->visitid= ++qh->visit_id;
    -  qh_vertexridges_facet(qh, vertex, facet, &ridges);
    -  trace2((qh, qh->ferr, 2037, "qh_rename_sharedvertex: p%d(v%d) is shared by f%d(%d ridges) and f%d\n",
    -    qh_pointid(qh, vertex->point), vertex->id, facet->id, qh_setsize(qh, ridges), neighborA->id));
    -  zinc_(Zintersectnum);
    -  vertices= qh_vertexintersect_new(qh, facet->vertices, neighborA->vertices);
    -  qh_setdel(vertices, vertex);
    -  qh_settemppush(qh, vertices);
    -  if ((newvertex= qh_find_newvertex(qh, vertex, vertices, ridges)))
    -    qh_renamevertex(qh, vertex, newvertex, ridges, facet, neighborA);
    -  qh_settempfree(qh, &vertices);
    -  qh_settempfree(qh, &ridges);
    -  return newvertex;
    -} /* rename_sharedvertex */
    -
    -/*---------------------------------
    -
    -  qh_renameridgevertex(qh, ridge, oldvertex, newvertex )
    -    renames oldvertex as newvertex in ridge
    -
    -  returns:
    -
    -  design:
    -    delete oldvertex from ridge
    -    if newvertex already in ridge
    -      copy ridge->noconvex to another ridge if possible
    -      delete the ridge
    -    else
    -      insert newvertex into the ridge
    -      adjust the ridge's orientation
    -*/
    -void qh_renameridgevertex(qhT *qh, ridgeT *ridge, vertexT *oldvertex, vertexT *newvertex) {
    -  int nth= 0, oldnth;
    -  facetT *temp;
    -  vertexT *vertex, **vertexp;
    -
    -  oldnth= qh_setindex(ridge->vertices, oldvertex);
    -  qh_setdelnthsorted(qh, ridge->vertices, oldnth);
    -  FOREACHvertex_(ridge->vertices) {
    -    if (vertex == newvertex) {
    -      zinc_(Zdelridge);
    -      if (ridge->nonconvex) /* only one ridge has nonconvex set */
    -        qh_copynonconvex(qh, ridge);
    -      trace2((qh, qh->ferr, 2038, "qh_renameridgevertex: ridge r%d deleted.  It contained both v%d and v%d\n",
    -        ridge->id, oldvertex->id, newvertex->id));
    -      qh_delridge(qh, ridge);
    -      return;
    -    }
    -    if (vertex->id < newvertex->id)
    -      break;
    -    nth++;
    -  }
    -  qh_setaddnth(qh, &ridge->vertices, nth, newvertex);
    -  if (abs(oldnth - nth)%2) {
    -    trace3((qh, qh->ferr, 3010, "qh_renameridgevertex: swapped the top and bottom of ridge r%d\n",
    -            ridge->id));
    -    temp= ridge->top;
    -    ridge->top= ridge->bottom;
    -    ridge->bottom= temp;
    -  }
    -} /* renameridgevertex */
    -
    -
    -/*---------------------------------
    -
    -  qh_renamevertex(qh, oldvertex, newvertex, ridges, oldfacet, neighborA )
    -    renames oldvertex as newvertex in ridges
    -    gives oldfacet/neighborA if oldvertex is shared between two facets
    -
    -  returns:
    -    oldvertex may still exist afterwards
    -
    -
    -  notes:
    -    can not change neighbors of newvertex (since it's a subset)
    -
    -  design:
    -    for each ridge in ridges
    -      rename oldvertex to newvertex and delete degenerate ridges
    -    if oldfacet not defined
    -      for each neighbor of oldvertex
    -        delete oldvertex from neighbor's vertices
    -        remove extra vertices from neighbor
    -      add oldvertex to qh.del_vertices
    -    else if oldvertex only between oldfacet and neighborA
    -      delete oldvertex from oldfacet and neighborA
    -      add oldvertex to qh.del_vertices
    -    else oldvertex is in oldfacet and neighborA and other facets (i.e., pinched)
    -      delete oldvertex from oldfacet
    -      delete oldfacet from oldvertice's neighbors
    -      remove extra vertices (e.g., oldvertex) from neighborA
    -*/
    -void qh_renamevertex(qhT *qh, vertexT *oldvertex, vertexT *newvertex, setT *ridges, facetT *oldfacet, facetT *neighborA) {
    -  facetT *neighbor, **neighborp;
    -  ridgeT *ridge, **ridgep;
    -  boolT istrace= False;
    -
    -  if (qh->IStracing >= 2 || oldvertex->id == qh->tracevertex_id ||
    -        newvertex->id == qh->tracevertex_id)
    -    istrace= True;
    -  FOREACHridge_(ridges)
    -    qh_renameridgevertex(qh, ridge, oldvertex, newvertex);
    -  if (!oldfacet) {
    -    zinc_(Zrenameall);
    -    if (istrace)
    -      qh_fprintf(qh, qh->ferr, 8082, "qh_renamevertex: renamed v%d to v%d in several facets\n",
    -               oldvertex->id, newvertex->id);
    -    FOREACHneighbor_(oldvertex) {
    -      qh_maydropneighbor(qh, neighbor);
    -      qh_setdelsorted(neighbor->vertices, oldvertex);
    -      if (qh_remove_extravertices(qh, neighbor))
    -        neighborp--; /* neighbor may be deleted */
    -    }
    -    if (!oldvertex->deleted) {
    -      oldvertex->deleted= True;
    -      qh_setappend(qh, &qh->del_vertices, oldvertex);
    -    }
    -  }else if (qh_setsize(qh, oldvertex->neighbors) == 2) {
    -    zinc_(Zrenameshare);
    -    if (istrace)
    -      qh_fprintf(qh, qh->ferr, 8083, "qh_renamevertex: renamed v%d to v%d in oldfacet f%d\n",
    -               oldvertex->id, newvertex->id, oldfacet->id);
    -    FOREACHneighbor_(oldvertex)
    -      qh_setdelsorted(neighbor->vertices, oldvertex);
    -    oldvertex->deleted= True;
    -    qh_setappend(qh, &qh->del_vertices, oldvertex);
    -  }else {
    -    zinc_(Zrenamepinch);
    -    if (istrace || qh->IStracing)
    -      qh_fprintf(qh, qh->ferr, 8084, "qh_renamevertex: renamed pinched v%d to v%d between f%d and f%d\n",
    -               oldvertex->id, newvertex->id, oldfacet->id, neighborA->id);
    -    qh_setdelsorted(oldfacet->vertices, oldvertex);
    -    qh_setdel(oldvertex->neighbors, oldfacet);
    -    qh_remove_extravertices(qh, neighborA);
    -  }
    -} /* renamevertex */
    -
    -
    -/*---------------------------------
    -
    -  qh_test_appendmerge(qh, facet, neighbor )
    -    tests facet/neighbor for convexity
    -    appends to mergeset if non-convex
    -    if pre-merging,
    -      nop if qh.SKIPconvex, or qh.MERGEexact and coplanar
    -
    -  returns:
    -    true if appends facet/neighbor to mergeset
    -    sets facet->center as needed
    -    does not change facet->seen
    -
    -  design:
    -    if qh.cos_max is defined
    -      if the angle between facet normals is too shallow
    -        append an angle-coplanar merge to qh.mergeset
    -        return True
    -    make facet's centrum if needed
    -    if facet's centrum is above the neighbor
    -      set isconcave
    -    else
    -      if facet's centrum is not below the neighbor
    -        set iscoplanar
    -      make neighbor's centrum if needed
    -      if neighbor's centrum is above the facet
    -        set isconcave
    -      else if neighbor's centrum is not below the facet
    -        set iscoplanar
    -   if isconcave or iscoplanar
    -     get angle if needed
    -     append concave or coplanar merge to qh.mergeset
    -*/
    -boolT qh_test_appendmerge(qhT *qh, facetT *facet, facetT *neighbor) {
    -  realT dist, dist2= -REALmax, angle= -REALmax;
    -  boolT isconcave= False, iscoplanar= False, okangle= False;
    -
    -  if (qh->SKIPconvex && !qh->POSTmerging)
    -    return False;
    -  if ((!qh->MERGEexact || qh->POSTmerging) && qh->cos_max < REALmax/2) {
    -    angle= qh_getangle(qh, facet->normal, neighbor->normal);
    -    zinc_(Zangletests);
    -    if (angle > qh->cos_max) {
    -      zinc_(Zcoplanarangle);
    -      qh_appendmergeset(qh, facet, neighbor, MRGanglecoplanar, &angle);
    -      trace2((qh, qh->ferr, 2039, "qh_test_appendmerge: coplanar angle %4.4g between f%d and f%d\n",
    -         angle, facet->id, neighbor->id));
    -      return True;
    -    }else
    -      okangle= True;
    -  }
    -  if (!facet->center)
    -    facet->center= qh_getcentrum(qh, facet);
    -  zzinc_(Zcentrumtests);
    -  qh_distplane(qh, facet->center, neighbor, &dist);
    -  if (dist > qh->centrum_radius)
    -    isconcave= True;
    -  else {
    -    if (dist > -qh->centrum_radius)
    -      iscoplanar= True;
    -    if (!neighbor->center)
    -      neighbor->center= qh_getcentrum(qh, neighbor);
    -    zzinc_(Zcentrumtests);
    -    qh_distplane(qh, neighbor->center, facet, &dist2);
    -    if (dist2 > qh->centrum_radius)
    -      isconcave= True;
    -    else if (!iscoplanar && dist2 > -qh->centrum_radius)
    -      iscoplanar= True;
    -  }
    -  if (!isconcave && (!iscoplanar || (qh->MERGEexact && !qh->POSTmerging)))
    -    return False;
    -  if (!okangle && qh->ANGLEmerge) {
    -    angle= qh_getangle(qh, facet->normal, neighbor->normal);
    -    zinc_(Zangletests);
    -  }
    -  if (isconcave) {
    -    zinc_(Zconcaveridge);
    -    if (qh->ANGLEmerge)
    -      angle += qh_ANGLEconcave + 0.5;
    -    qh_appendmergeset(qh, facet, neighbor, MRGconcave, &angle);
    -    trace0((qh, qh->ferr, 18, "qh_test_appendmerge: concave f%d to f%d dist %4.4g and reverse dist %4.4g angle %4.4g during p%d\n",
    -           facet->id, neighbor->id, dist, dist2, angle, qh->furthest_id));
    -  }else /* iscoplanar */ {
    -    zinc_(Zcoplanarcentrum);
    -    qh_appendmergeset(qh, facet, neighbor, MRGcoplanar, &angle);
    -    trace2((qh, qh->ferr, 2040, "qh_test_appendmerge: coplanar f%d to f%d dist %4.4g, reverse dist %4.4g angle %4.4g\n",
    -              facet->id, neighbor->id, dist, dist2, angle));
    -  }
    -  return True;
    -} /* test_appendmerge */
    -
    -/*---------------------------------
    -
    -  qh_test_vneighbors(qh)
    -    test vertex neighbors for convexity
    -    tests all facets on qh.newfacet_list
    -
    -  returns:
    -    true if non-convex vneighbors appended to qh.facet_mergeset
    -    initializes vertex neighbors if needed
    -
    -  notes:
    -    assumes all facet neighbors have been tested
    -    this can be expensive
    -    this does not guarantee that a centrum is below all facets
    -      but it is unlikely
    -    uses qh.visit_id
    -
    -  design:
    -    build vertex neighbors if necessary
    -    for all new facets
    -      for all vertices
    -        for each unvisited facet neighbor of the vertex
    -          test new facet and neighbor for convexity
    -*/
    -boolT qh_test_vneighbors(qhT *qh /* qh->newfacet_list */) {
    -  facetT *newfacet, *neighbor, **neighborp;
    -  vertexT *vertex, **vertexp;
    -  int nummerges= 0;
    -
    -  trace1((qh, qh->ferr, 1015, "qh_test_vneighbors: testing vertex neighbors for convexity\n"));
    -  if (!qh->VERTEXneighbors)
    -    qh_vertexneighbors(qh);
    -  FORALLnew_facets
    -    newfacet->seen= False;
    -  FORALLnew_facets {
    -    newfacet->seen= True;
    -    newfacet->visitid= qh->visit_id++;
    -    FOREACHneighbor_(newfacet)
    -      newfacet->visitid= qh->visit_id;
    -    FOREACHvertex_(newfacet->vertices) {
    -      FOREACHneighbor_(vertex) {
    -        if (neighbor->seen || neighbor->visitid == qh->visit_id)
    -          continue;
    -        if (qh_test_appendmerge(qh, newfacet, neighbor))
    -          nummerges++;
    -      }
    -    }
    -  }
    -  zadd_(Ztestvneighbor, nummerges);
    -  trace1((qh, qh->ferr, 1016, "qh_test_vneighbors: found %d non-convex, vertex neighbors\n",
    -           nummerges));
    -  return (nummerges > 0);
    -} /* test_vneighbors */
    -
    -/*---------------------------------
    -
    -  qh_tracemerge(qh, facet1, facet2 )
    -    print trace message after merge
    -*/
    -void qh_tracemerge(qhT *qh, facetT *facet1, facetT *facet2) {
    -  boolT waserror= False;
    -
    -#ifndef qh_NOtrace
    -  if (qh->IStracing >= 4)
    -    qh_errprint(qh, "MERGED", facet2, NULL, NULL, NULL);
    -  if (facet2 == qh->tracefacet || (qh->tracevertex && qh->tracevertex->newlist)) {
    -    qh_fprintf(qh, qh->ferr, 8085, "qh_tracemerge: trace facet and vertex after merge of f%d and f%d, furthest p%d\n", facet1->id, facet2->id, qh->furthest_id);
    -    if (facet2 != qh->tracefacet)
    -      qh_errprint(qh, "TRACE", qh->tracefacet,
    -        (qh->tracevertex && qh->tracevertex->neighbors) ?
    -           SETfirstt_(qh->tracevertex->neighbors, facetT) : NULL,
    -        NULL, qh->tracevertex);
    -  }
    -  if (qh->tracevertex) {
    -    if (qh->tracevertex->deleted)
    -      qh_fprintf(qh, qh->ferr, 8086, "qh_tracemerge: trace vertex deleted at furthest p%d\n",
    -            qh->furthest_id);
    -    else
    -      qh_checkvertex(qh, qh->tracevertex);
    -  }
    -  if (qh->tracefacet) {
    -    qh_checkfacet(qh, qh->tracefacet, True, &waserror);
    -    if (waserror)
    -      qh_errexit(qh, qh_ERRqhull, qh->tracefacet, NULL);
    -  }
    -#endif /* !qh_NOtrace */
    -  if (qh->CHECKfrequently || qh->IStracing >= 4) { /* can't check polygon here */
    -    qh_checkfacet(qh, facet2, True, &waserror);
    -    if (waserror)
    -      qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -  }
    -} /* tracemerge */
    -
    -/*---------------------------------
    -
    -  qh_tracemerging(qh)
    -    print trace message during POSTmerging
    -
    -  returns:
    -    updates qh.mergereport
    -
    -  notes:
    -    called from qh_mergecycle() and qh_mergefacet()
    -
    -  see:
    -    qh_buildtracing()
    -*/
    -void qh_tracemerging(qhT *qh) {
    -  realT cpu;
    -  int total;
    -  time_t timedata;
    -  struct tm *tp;
    -
    -  qh->mergereport= zzval_(Ztotmerge);
    -  time(&timedata);
    -  tp= localtime(&timedata);
    -  cpu= qh_CPUclock;
    -  cpu /= qh_SECticks;
    -  total= zzval_(Ztotmerge) - zzval_(Zcyclehorizon) + zzval_(Zcyclefacettot);
    -  qh_fprintf(qh, qh->ferr, 8087, "\n\
    -At %d:%d:%d & %2.5g CPU secs, qhull has merged %d facets.  The hull\n\
    -  contains %d facets and %d vertices.\n",
    -      tp->tm_hour, tp->tm_min, tp->tm_sec, cpu,
    -      total, qh->num_facets - qh->num_visible,
    -      qh->num_vertices-qh_setsize(qh, qh->del_vertices));
    -} /* tracemerging */
    -
    -/*---------------------------------
    -
    -  qh_updatetested(qh, facet1, facet2 )
    -    clear facet2->tested and facet1->ridge->tested for merge
    -
    -  returns:
    -    deletes facet2->center unless it's already large
    -      if so, clears facet2->ridge->tested
    -
    -  design:
    -    clear facet2->tested
    -    clear ridge->tested for facet1's ridges
    -    if facet2 has a centrum
    -      if facet2 is large
    -        set facet2->keepcentrum
    -      else if facet2 has 3 vertices due to many merges, or not large and post merging
    -        clear facet2->keepcentrum
    -      unless facet2->keepcentrum
    -        clear facet2->center to recompute centrum later
    -        clear ridge->tested for facet2's ridges
    -*/
    -void qh_updatetested(qhT *qh, facetT *facet1, facetT *facet2) {
    -  ridgeT *ridge, **ridgep;
    -  int size;
    -
    -  facet2->tested= False;
    -  FOREACHridge_(facet1->ridges)
    -    ridge->tested= False;
    -  if (!facet2->center)
    -    return;
    -  size= qh_setsize(qh, facet2->vertices);
    -  if (!facet2->keepcentrum) {
    -    if (size > qh->hull_dim + qh_MAXnewcentrum) {
    -      facet2->keepcentrum= True;
    -      zinc_(Zwidevertices);
    -    }
    -  }else if (size <= qh->hull_dim + qh_MAXnewcentrum) {
    -    /* center and keepcentrum was set */
    -    if (size == qh->hull_dim || qh->POSTmerging)
    -      facet2->keepcentrum= False; /* if many merges need to recompute centrum */
    -  }
    -  if (!facet2->keepcentrum) {
    -    qh_memfree(qh, facet2->center, qh->normal_size);
    -    facet2->center= NULL;
    -    FOREACHridge_(facet2->ridges)
    -      ridge->tested= False;
    -  }
    -} /* updatetested */
    -
    -/*---------------------------------
    -
    -  qh_vertexridges(qh, vertex )
    -    return temporary set of ridges adjacent to a vertex
    -    vertex->neighbors defined
    -
    -  ntoes:
    -    uses qh.visit_id
    -    does not include implicit ridges for simplicial facets
    -
    -  design:
    -    for each neighbor of vertex
    -      add ridges that include the vertex to ridges
    -*/
    -setT *qh_vertexridges(qhT *qh, vertexT *vertex) {
    -  facetT *neighbor, **neighborp;
    -  setT *ridges= qh_settemp(qh, qh->TEMPsize);
    -  int size;
    -
    -  qh->visit_id++;
    -  FOREACHneighbor_(vertex)
    -    neighbor->visitid= qh->visit_id;
    -  FOREACHneighbor_(vertex) {
    -    if (*neighborp)   /* no new ridges in last neighbor */
    -      qh_vertexridges_facet(qh, vertex, neighbor, &ridges);
    -  }
    -  if (qh->PRINTstatistics || qh->IStracing) {
    -    size= qh_setsize(qh, ridges);
    -    zinc_(Zvertexridge);
    -    zadd_(Zvertexridgetot, size);
    -    zmax_(Zvertexridgemax, size);
    -    trace3((qh, qh->ferr, 3011, "qh_vertexridges: found %d ridges for v%d\n",
    -             size, vertex->id));
    -  }
    -  return ridges;
    -} /* vertexridges */
    -
    -/*---------------------------------
    -
    -  qh_vertexridges_facet(qh, vertex, facet, ridges )
    -    add adjacent ridges for vertex in facet
    -    neighbor->visitid==qh.visit_id if it hasn't been visited
    -
    -  returns:
    -    ridges updated
    -    sets facet->visitid to qh.visit_id-1
    -
    -  design:
    -    for each ridge of facet
    -      if ridge of visited neighbor (i.e., unprocessed)
    -        if vertex in ridge
    -          append ridge to vertex
    -    mark facet processed
    -*/
    -void qh_vertexridges_facet(qhT *qh, vertexT *vertex, facetT *facet, setT **ridges) {
    -  ridgeT *ridge, **ridgep;
    -  facetT *neighbor;
    -
    -  FOREACHridge_(facet->ridges) {
    -    neighbor= otherfacet_(ridge, facet);
    -    if (neighbor->visitid == qh->visit_id
    -    && qh_setin(ridge->vertices, vertex))
    -      qh_setappend(qh, ridges, ridge);
    -  }
    -  facet->visitid= qh->visit_id-1;
    -} /* vertexridges_facet */
    -
    -/*---------------------------------
    -
    -  qh_willdelete(qh, facet, replace )
    -    moves facet to visible list
    -    sets facet->f.replace to replace (may be NULL)
    -
    -  returns:
    -    bumps qh.num_visible
    -*/
    -void qh_willdelete(qhT *qh, facetT *facet, facetT *replace) {
    -
    -  qh_removefacet(qh, facet);
    -  qh_prependfacet(qh, facet, &qh->visible_list);
    -  qh->num_visible++;
    -  facet->visible= True;
    -  facet->f.replace= replace;
    -} /* willdelete */
    -
    -#else /* qh_NOmerge */
    -void qh_premerge(qhT *qh, vertexT *apex, realT maxcentrum, realT maxangle) {
    -}
    -void qh_postmerge(qhT *qh, const char *reason, realT maxcentrum, realT maxangle,
    -                      boolT vneighbors) {
    -}
    -boolT qh_checkzero(qhT *qh, boolT testall) {
    -   }
    -#endif /* qh_NOmerge */
    -
    diff --git a/src/qhull/src/libqhull_r/merge_r.h b/src/qhull/src/libqhull_r/merge_r.h
    deleted file mode 100644
    index 30a51815dac..00000000000
    --- a/src/qhull/src/libqhull_r/merge_r.h
    +++ /dev/null
    @@ -1,186 +0,0 @@
    -/*
      ---------------------------------
    -
    -   merge_r.h
    -   header file for merge_r.c
    -
    -   see qh-merge_r.htm and merge_r.c
    -
    -   Copyright (c) 1993-2015 C.B. Barber.
    -   $Id: //main/2015/qhull/src/libqhull_r/merge_r.h#3 $$Change: 2079 $
    -   $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -*/
    -
    -#ifndef qhDEFmerge
    -#define qhDEFmerge 1
    -
    -#include "libqhull_r.h"
    -
    -
    -/*============ -constants- ==============*/
    -
    -/*----------------------------------
    -
    -  qh_ANGLEredundant
    -    indicates redundant merge in mergeT->angle
    -*/
    -#define qh_ANGLEredundant 6.0
    -
    -/*----------------------------------
    -
    -  qh_ANGLEdegen
    -    indicates degenerate facet in mergeT->angle
    -*/
    -#define qh_ANGLEdegen     5.0
    -
    -/*----------------------------------
    -
    -  qh_ANGLEconcave
    -    offset to indicate concave facets in mergeT->angle
    -
    -  notes:
    -    concave facets are assigned the range of [2,4] in mergeT->angle
    -    roundoff error may make the angle less than 2
    -*/
    -#define qh_ANGLEconcave  1.5
    -
    -/*----------------------------------
    -
    -  MRG... (mergeType)
    -    indicates the type of a merge (mergeT->type)
    -*/
    -typedef enum {  /* in sort order for facet_mergeset */
    -  MRGnone= 0,
    -  MRGcoplanar,          /* centrum coplanar */
    -  MRGanglecoplanar,     /* angle coplanar */
    -                        /* could detect half concave ridges */
    -  MRGconcave,           /* concave ridge */
    -  MRGflip,              /* flipped facet. facet1 == facet2 */
    -  MRGridge,             /* duplicate ridge (qh_MERGEridge) */
    -                        /* degen and redundant go onto degen_mergeset */
    -  MRGdegen,             /* degenerate facet (!enough neighbors) facet1 == facet2 */
    -  MRGredundant,         /* redundant facet (vertex subset) */
    -                        /* merge_degenredundant assumes degen < redundant */
    -  MRGmirror,            /* mirror facet from qh_triangulate */
    -  ENDmrg
    -} mergeType;
    -
    -/*----------------------------------
    -
    -  qh_MERGEapex
    -    flag for qh_mergefacet() to indicate an apex merge
    -*/
    -#define qh_MERGEapex     True
    -
    -/*============ -structures- ====================*/
    -
    -/*----------------------------------
    -
    -  mergeT
    -    structure used to merge facets
    -*/
    -
    -typedef struct mergeT mergeT;
    -struct mergeT {         /* initialize in qh_appendmergeset */
    -  realT   angle;        /* angle between normals of facet1 and facet2 */
    -  facetT *facet1;       /* will merge facet1 into facet2 */
    -  facetT *facet2;
    -  mergeType type;
    -};
    -
    -
    -/*=========== -macros- =========================*/
    -
    -/*----------------------------------
    -
    -  FOREACHmerge_( merges ) {...}
    -    assign 'merge' to each merge in merges
    -
    -  notes:
    -    uses 'mergeT *merge, **mergep;'
    -    if qh_mergefacet(),
    -      restart since qh.facet_mergeset may change
    -    see FOREACHsetelement_
    -*/
    -#define FOREACHmerge_( merges ) FOREACHsetelement_(mergeT, merges, merge)
    -
    -/*============ prototypes in alphabetical order after pre/postmerge =======*/
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -void    qh_premerge(qhT *qh, vertexT *apex, realT maxcentrum, realT maxangle);
    -void    qh_postmerge(qhT *qh, const char *reason, realT maxcentrum, realT maxangle,
    -             boolT vneighbors);
    -void    qh_all_merges(qhT *qh, boolT othermerge, boolT vneighbors);
    -void    qh_appendmergeset(qhT *qh, facetT *facet, facetT *neighbor, mergeType mergetype, realT *angle);
    -setT   *qh_basevertices(qhT *qh, facetT *samecycle);
    -void    qh_checkconnect(qhT *qh /* qh.new_facets */);
    -boolT   qh_checkzero(qhT *qh, boolT testall);
    -int     qh_compareangle(const void *p1, const void *p2);
    -int     qh_comparemerge(const void *p1, const void *p2);
    -int     qh_comparevisit(const void *p1, const void *p2);
    -void    qh_copynonconvex(qhT *qh, ridgeT *atridge);
    -void    qh_degen_redundant_facet(qhT *qh, facetT *facet);
    -void    qh_degen_redundant_neighbors(qhT *qh, facetT *facet, facetT *delfacet);
    -vertexT *qh_find_newvertex(qhT *qh, vertexT *oldvertex, setT *vertices, setT *ridges);
    -void    qh_findbest_test(qhT *qh, boolT testcentrum, facetT *facet, facetT *neighbor,
    -           facetT **bestfacet, realT *distp, realT *mindistp, realT *maxdistp);
    -facetT *qh_findbestneighbor(qhT *qh, facetT *facet, realT *distp, realT *mindistp, realT *maxdistp);
    -void    qh_flippedmerges(qhT *qh, facetT *facetlist, boolT *wasmerge);
    -void    qh_forcedmerges(qhT *qh, boolT *wasmerge);
    -void    qh_getmergeset(qhT *qh, facetT *facetlist);
    -void    qh_getmergeset_initial(qhT *qh, facetT *facetlist);
    -void    qh_hashridge(qhT *qh, setT *hashtable, int hashsize, ridgeT *ridge, vertexT *oldvertex);
    -ridgeT *qh_hashridge_find(qhT *qh, setT *hashtable, int hashsize, ridgeT *ridge,
    -              vertexT *vertex, vertexT *oldvertex, int *hashslot);
    -void    qh_makeridges(qhT *qh, facetT *facet);
    -void    qh_mark_dupridges(qhT *qh, facetT *facetlist);
    -void    qh_maydropneighbor(qhT *qh, facetT *facet);
    -int     qh_merge_degenredundant(qhT *qh);
    -void    qh_merge_nonconvex(qhT *qh, facetT *facet1, facetT *facet2, mergeType mergetype);
    -void    qh_mergecycle(qhT *qh, facetT *samecycle, facetT *newfacet);
    -void    qh_mergecycle_all(qhT *qh, facetT *facetlist, boolT *wasmerge);
    -void    qh_mergecycle_facets(qhT *qh, facetT *samecycle, facetT *newfacet);
    -void    qh_mergecycle_neighbors(qhT *qh, facetT *samecycle, facetT *newfacet);
    -void    qh_mergecycle_ridges(qhT *qh, facetT *samecycle, facetT *newfacet);
    -void    qh_mergecycle_vneighbors(qhT *qh, facetT *samecycle, facetT *newfacet);
    -void    qh_mergefacet(qhT *qh, facetT *facet1, facetT *facet2, realT *mindist, realT *maxdist, boolT mergeapex);
    -void    qh_mergefacet2d(qhT *qh, facetT *facet1, facetT *facet2);
    -void    qh_mergeneighbors(qhT *qh, facetT *facet1, facetT *facet2);
    -void    qh_mergeridges(qhT *qh, facetT *facet1, facetT *facet2);
    -void    qh_mergesimplex(qhT *qh, facetT *facet1, facetT *facet2, boolT mergeapex);
    -void    qh_mergevertex_del(qhT *qh, vertexT *vertex, facetT *facet1, facetT *facet2);
    -void    qh_mergevertex_neighbors(qhT *qh, facetT *facet1, facetT *facet2);
    -void    qh_mergevertices(qhT *qh, setT *vertices1, setT **vertices);
    -setT   *qh_neighbor_intersections(qhT *qh, vertexT *vertex);
    -void    qh_newvertices(qhT *qh, setT *vertices);
    -boolT   qh_reducevertices(qhT *qh);
    -vertexT *qh_redundant_vertex(qhT *qh, vertexT *vertex);
    -boolT   qh_remove_extravertices(qhT *qh, facetT *facet);
    -vertexT *qh_rename_sharedvertex(qhT *qh, vertexT *vertex, facetT *facet);
    -void    qh_renameridgevertex(qhT *qh, ridgeT *ridge, vertexT *oldvertex, vertexT *newvertex);
    -void    qh_renamevertex(qhT *qh, vertexT *oldvertex, vertexT *newvertex, setT *ridges,
    -                        facetT *oldfacet, facetT *neighborA);
    -boolT   qh_test_appendmerge(qhT *qh, facetT *facet, facetT *neighbor);
    -boolT   qh_test_vneighbors(qhT *qh /* qh.newfacet_list */);
    -void    qh_tracemerge(qhT *qh, facetT *facet1, facetT *facet2);
    -void    qh_tracemerging(qhT *qh);
    -void    qh_updatetested(qhT *qh, facetT *facet1, facetT *facet2);
    -setT   *qh_vertexridges(qhT *qh, vertexT *vertex);
    -void    qh_vertexridges_facet(qhT *qh, vertexT *vertex, facetT *facet, setT **ridges);
    -void    qh_willdelete(qhT *qh, facetT *facet, facetT *replace);
    -
    -#ifdef __cplusplus
    -} /* extern "C" */
    -#endif
    -
    -#endif /* qhDEFmerge */
    diff --git a/src/qhull/src/libqhull_r/poly2_r.c b/src/qhull/src/libqhull_r/poly2_r.c
    deleted file mode 100644
    index b8ae9af9f4e..00000000000
    --- a/src/qhull/src/libqhull_r/poly2_r.c
    +++ /dev/null
    @@ -1,3222 +0,0 @@
    -/*
      ---------------------------------
    -
    -   poly2_r.c
    -   implements polygons and simplicies
    -
    -   see qh-poly_r.htm, poly_r.h and libqhull_r.h
    -
    -   frequently used code is in poly_r.c
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull_r/poly2_r.c#10 $$Change: 2069 $
    -   $DateTime: 2016/01/18 22:05:03 $$Author: bbarber $
    -*/
    -
    -#include "qhull_ra.h"
    -
    -/*======== functions in alphabetical order ==========*/
    -
    -/*---------------------------------
    -
    -  qh_addhash( newelem, hashtable, hashsize, hash )
    -    add newelem to linear hash table at hash if not already there
    -*/
    -void qh_addhash(void *newelem, setT *hashtable, int hashsize, int hash) {
    -  int scan;
    -  void *elem;
    -
    -  for (scan= (int)hash; (elem= SETelem_(hashtable, scan));
    -       scan= (++scan >= hashsize ? 0 : scan)) {
    -    if (elem == newelem)
    -      break;
    -  }
    -  /* loop terminates because qh_HASHfactor >= 1.1 by qh_initbuffers */
    -  if (!elem)
    -    SETelem_(hashtable, scan)= newelem;
    -} /* addhash */
    -
    -/*---------------------------------
    -
    -  qh_check_bestdist(qh)
    -    check that all points are within max_outside of the nearest facet
    -    if qh.ONLYgood,
    -      ignores !good facets
    -
    -  see:
    -    qh_check_maxout(), qh_outerinner()
    -
    -  notes:
    -    only called from qh_check_points()
    -      seldom used since qh.MERGING is almost always set
    -    if notverified>0 at end of routine
    -      some points were well inside the hull.  If the hull contains
    -      a lens-shaped component, these points were not verified.  Use
    -      options 'Qi Tv' to verify all points.  (Exhaustive check also verifies)
    -
    -  design:
    -    determine facet for each point (if any)
    -    for each point
    -      start with the assigned facet or with the first facet
    -      find the best facet for the point and check all coplanar facets
    -      error if point is outside of facet
    -*/
    -void qh_check_bestdist(qhT *qh) {
    -  boolT waserror= False, unassigned;
    -  facetT *facet, *bestfacet, *errfacet1= NULL, *errfacet2= NULL;
    -  facetT *facetlist;
    -  realT dist, maxoutside, maxdist= -REALmax;
    -  pointT *point;
    -  int numpart= 0, facet_i, facet_n, notgood= 0, notverified= 0;
    -  setT *facets;
    -
    -  trace1((qh, qh->ferr, 1020, "qh_check_bestdist: check points below nearest facet.  Facet_list f%d\n",
    -      qh->facet_list->id));
    -  maxoutside= qh_maxouter(qh);
    -  maxoutside += qh->DISTround;
    -  /* one more qh.DISTround for check computation */
    -  trace1((qh, qh->ferr, 1021, "qh_check_bestdist: check that all points are within %2.2g of best facet\n", maxoutside));
    -  facets= qh_pointfacet(qh /*qh.facet_list*/);
    -  if (!qh_QUICKhelp && qh->PRINTprecision)
    -    qh_fprintf(qh, qh->ferr, 8091, "\n\
    -qhull output completed.  Verifying that %d points are\n\
    -below %2.2g of the nearest %sfacet.\n",
    -             qh_setsize(qh, facets), maxoutside, (qh->ONLYgood ?  "good " : ""));
    -  FOREACHfacet_i_(qh, facets) {  /* for each point with facet assignment */
    -    if (facet)
    -      unassigned= False;
    -    else {
    -      unassigned= True;
    -      facet= qh->facet_list;
    -    }
    -    point= qh_point(qh, facet_i);
    -    if (point == qh->GOODpointp)
    -      continue;
    -    qh_distplane(qh, point, facet, &dist);
    -    numpart++;
    -    bestfacet= qh_findbesthorizon(qh, !qh_IScheckmax, point, facet, qh_NOupper, &dist, &numpart);
    -    /* occurs after statistics reported */
    -    maximize_(maxdist, dist);
    -    if (dist > maxoutside) {
    -      if (qh->ONLYgood && !bestfacet->good
    -          && !((bestfacet= qh_findgooddist(qh, point, bestfacet, &dist, &facetlist))
    -               && dist > maxoutside))
    -        notgood++;
    -      else {
    -        waserror= True;
    -        qh_fprintf(qh, qh->ferr, 6109, "qhull precision error: point p%d is outside facet f%d, distance= %6.8g maxoutside= %6.8g\n",
    -                facet_i, bestfacet->id, dist, maxoutside);
    -        if (errfacet1 != bestfacet) {
    -          errfacet2= errfacet1;
    -          errfacet1= bestfacet;
    -        }
    -      }
    -    }else if (unassigned && dist < -qh->MAXcoplanar)
    -      notverified++;
    -  }
    -  qh_settempfree(qh, &facets);
    -  if (notverified && !qh->DELAUNAY && !qh_QUICKhelp && qh->PRINTprecision)
    -    qh_fprintf(qh, qh->ferr, 8092, "\n%d points were well inside the hull.  If the hull contains\n\
    -a lens-shaped component, these points were not verified.  Use\n\
    -options 'Qci Tv' to verify all points.\n", notverified);
    -  if (maxdist > qh->outside_err) {
    -    qh_fprintf(qh, qh->ferr, 6110, "qhull precision error (qh_check_bestdist): a coplanar point is %6.2g from convex hull.  The maximum value(qh.outside_err) is %6.2g\n",
    -              maxdist, qh->outside_err);
    -    qh_errexit2(qh, qh_ERRprec, errfacet1, errfacet2);
    -  }else if (waserror && qh->outside_err > REALmax/2)
    -    qh_errexit2(qh, qh_ERRprec, errfacet1, errfacet2);
    -  /* else if waserror, the error was logged to qh.ferr but does not effect the output */
    -  trace0((qh, qh->ferr, 20, "qh_check_bestdist: max distance outside %2.2g\n", maxdist));
    -} /* check_bestdist */
    -
    -/*---------------------------------
    -
    -  qh_check_dupridge(qh, facet1, dist1, facet2, dist2)
    -    Check duplicate ridge between facet1 and facet2 for wide merge
    -    dist1 is the maximum distance of facet1's vertices to facet2
    -    dist2 is the maximum distance of facet2's vertices to facet1
    -
    -  Returns
    -    Level 1 log of the duplicate ridge with the minimum distance between vertices
    -    Throws error if the merge will increase the maximum facet width by qh_WIDEduplicate (100x)
    -
    -  called from:
    -    qh_forcedmerges()
    -*/
    -#ifndef qh_NOmerge
    -void qh_check_dupridge(qhT *qh, facetT *facet1, realT dist1, facetT *facet2, realT dist2) {
    -  vertexT *vertex, **vertexp, *vertexA, **vertexAp;
    -  realT dist, innerplane, mergedist, outerplane, prevdist, ratio;
    -  realT minvertex= REALmax;
    -
    -  mergedist= fmin_(dist1, dist2);
    -  qh_outerinner(qh, NULL, &outerplane, &innerplane);  /* ratio from qh_printsummary */
    -  prevdist= fmax_(outerplane, innerplane);
    -  maximize_(prevdist, qh->ONEmerge + qh->DISTround);
    -  maximize_(prevdist, qh->MINoutside + qh->DISTround);
    -  ratio= mergedist/prevdist;
    -  FOREACHvertex_(facet1->vertices) {     /* The duplicate ridge is between facet1 and facet2, so either facet can be tested */
    -    FOREACHvertexA_(facet1->vertices) {
    -      if (vertex > vertexA){   /* Test each pair once */
    -        dist= qh_pointdist(vertex->point, vertexA->point, qh->hull_dim);
    -        minimize_(minvertex, dist);
    -      }
    -    }
    -  }
    -  trace0((qh, qh->ferr, 16, "qh_check_dupridge: duplicate ridge between f%d and f%d due to nearly-coincident vertices (%2.2g), dist %2.2g, reverse dist %2.2g, ratio %2.2g while processing p%d\n",
    -        facet1->id, facet2->id, minvertex, dist1, dist2, ratio, qh->furthest_id));
    -  if (ratio > qh_WIDEduplicate) {
    -    qh_fprintf(qh, qh->ferr, 6271, "qhull precision error (qh_check_dupridge): wide merge (%.0f times wider) due to duplicate ridge with nearly coincident points (%2.2g) between f%d and f%d, merge dist %2.2g, while processing p%d\n- Ignore error with option 'Q12'\n- To be fixed in a later version of Qhull\n",
    -          ratio, minvertex, facet1->id, facet2->id, mergedist, qh->furthest_id);
    -    if (qh->DELAUNAY)
    -      qh_fprintf(qh, qh->ferr, 8145, "- A bounding box for the input sites may alleviate this error.\n");
    -    if(minvertex > qh_WIDEduplicate*prevdist)
    -      qh_fprintf(qh, qh->ferr, 8146, "- Vertex distance %2.2g is greater than %d times maximum distance %2.2g\n  Please report to bradb@shore.net with steps to reproduce and all output\n",
    -          minvertex, qh_WIDEduplicate, prevdist);
    -    if (!qh->NOwide)
    -      qh_errexit2(qh, qh_ERRqhull, facet1, facet2);
    -  }
    -} /* check_dupridge */
    -#endif
    -
    -/*---------------------------------
    -
    -  qh_check_maxout(qh)
    -    updates qh.max_outside by checking all points against bestfacet
    -    if qh.ONLYgood, ignores !good facets
    -
    -  returns:
    -    updates facet->maxoutside via qh_findbesthorizon()
    -    sets qh.maxoutdone
    -    if printing qh.min_vertex (qh_outerinner),
    -      it is updated to the current vertices
    -    removes inside/coplanar points from coplanarset as needed
    -
    -  notes:
    -    defines coplanar as min_vertex instead of MAXcoplanar
    -    may not need to check near-inside points because of qh.MAXcoplanar
    -      and qh.KEEPnearinside (before it was -DISTround)
    -
    -  see also:
    -    qh_check_bestdist()
    -
    -  design:
    -    if qh.min_vertex is needed
    -      for all neighbors of all vertices
    -        test distance from vertex to neighbor
    -    determine facet for each point (if any)
    -    for each point with an assigned facet
    -      find the best facet for the point and check all coplanar facets
    -        (updates outer planes)
    -    remove near-inside points from coplanar sets
    -*/
    -#ifndef qh_NOmerge
    -void qh_check_maxout(qhT *qh) {
    -  facetT *facet, *bestfacet, *neighbor, **neighborp, *facetlist;
    -  realT dist, maxoutside, minvertex, old_maxoutside;
    -  pointT *point;
    -  int numpart= 0, facet_i, facet_n, notgood= 0;
    -  setT *facets, *vertices;
    -  vertexT *vertex;
    -
    -  trace1((qh, qh->ferr, 1022, "qh_check_maxout: check and update maxoutside for each facet.\n"));
    -  maxoutside= minvertex= 0;
    -  if (qh->VERTEXneighbors
    -  && (qh->PRINTsummary || qh->KEEPinside || qh->KEEPcoplanar
    -        || qh->TRACElevel || qh->PRINTstatistics
    -        || qh->PRINTout[0] == qh_PRINTsummary || qh->PRINTout[0] == qh_PRINTnone)) {
    -    trace1((qh, qh->ferr, 1023, "qh_check_maxout: determine actual maxoutside and minvertex\n"));
    -    vertices= qh_pointvertex(qh /*qh.facet_list*/);
    -    FORALLvertices {
    -      FOREACHneighbor_(vertex) {
    -        zinc_(Zdistvertex);  /* distance also computed by main loop below */
    -        qh_distplane(qh, vertex->point, neighbor, &dist);
    -        minimize_(minvertex, dist);
    -        if (-dist > qh->TRACEdist || dist > qh->TRACEdist
    -        || neighbor == qh->tracefacet || vertex == qh->tracevertex)
    -          qh_fprintf(qh, qh->ferr, 8093, "qh_check_maxout: p%d(v%d) is %.2g from f%d\n",
    -                    qh_pointid(qh, vertex->point), vertex->id, dist, neighbor->id);
    -      }
    -    }
    -    if (qh->MERGING) {
    -      wmin_(Wminvertex, qh->min_vertex);
    -    }
    -    qh->min_vertex= minvertex;
    -    qh_settempfree(qh, &vertices);
    -  }
    -  facets= qh_pointfacet(qh /*qh.facet_list*/);
    -  do {
    -    old_maxoutside= fmax_(qh->max_outside, maxoutside);
    -    FOREACHfacet_i_(qh, facets) {     /* for each point with facet assignment */
    -      if (facet) {
    -        point= qh_point(qh, facet_i);
    -        if (point == qh->GOODpointp)
    -          continue;
    -        zzinc_(Ztotcheck);
    -        qh_distplane(qh, point, facet, &dist);
    -        numpart++;
    -        bestfacet= qh_findbesthorizon(qh, qh_IScheckmax, point, facet, !qh_NOupper, &dist, &numpart);
    -        if (bestfacet && dist > maxoutside) {
    -          if (qh->ONLYgood && !bestfacet->good
    -          && !((bestfacet= qh_findgooddist(qh, point, bestfacet, &dist, &facetlist))
    -               && dist > maxoutside))
    -            notgood++;
    -          else
    -            maxoutside= dist;
    -        }
    -        if (dist > qh->TRACEdist || (bestfacet && bestfacet == qh->tracefacet))
    -          qh_fprintf(qh, qh->ferr, 8094, "qh_check_maxout: p%d is %.2g above f%d\n",
    -          qh_pointid(qh, point), dist, (bestfacet ? bestfacet->id : UINT_MAX));
    -      }
    -    }
    -  }while
    -    (maxoutside > 2*old_maxoutside);
    -    /* if qh.maxoutside increases substantially, qh_SEARCHdist is not valid
    -          e.g., RBOX 5000 s Z1 G1e-13 t1001200614 | qhull */
    -  zzadd_(Zcheckpart, numpart);
    -  qh_settempfree(qh, &facets);
    -  wval_(Wmaxout)= maxoutside - qh->max_outside;
    -  wmax_(Wmaxoutside, qh->max_outside);
    -  qh->max_outside= maxoutside;
    -  qh_nearcoplanar(qh /*qh.facet_list*/);
    -  qh->maxoutdone= True;
    -  trace1((qh, qh->ferr, 1024, "qh_check_maxout: maxoutside %2.2g, min_vertex %2.2g, outside of not good %d\n",
    -       maxoutside, qh->min_vertex, notgood));
    -} /* check_maxout */
    -#else /* qh_NOmerge */
    -void qh_check_maxout(qhT *qh) {
    -}
    -#endif
    -
    -/*---------------------------------
    -
    -  qh_check_output(qh)
    -    performs the checks at the end of qhull algorithm
    -    Maybe called after voronoi output.  Will recompute otherwise centrums are Voronoi centers instead
    -*/
    -void qh_check_output(qhT *qh) {
    -  int i;
    -
    -  if (qh->STOPcone)
    -    return;
    -  if (qh->VERIFYoutput | qh->IStracing | qh->CHECKfrequently) {
    -    qh_checkpolygon(qh, qh->facet_list);
    -    qh_checkflipped_all(qh, qh->facet_list);
    -    qh_checkconvex(qh, qh->facet_list, qh_ALGORITHMfault);
    -  }else if (!qh->MERGING && qh_newstats(qh, qh->qhstat.precision, &i)) {
    -    qh_checkflipped_all(qh, qh->facet_list);
    -    qh_checkconvex(qh, qh->facet_list, qh_ALGORITHMfault);
    -  }
    -} /* check_output */
    -
    -
    -
    -/*---------------------------------
    -
    -  qh_check_point(qh, point, facet, maxoutside, maxdist, errfacet1, errfacet2 )
    -    check that point is less than maxoutside from facet
    -*/
    -void qh_check_point(qhT *qh, pointT *point, facetT *facet, realT *maxoutside, realT *maxdist, facetT **errfacet1, facetT **errfacet2) {
    -  realT dist;
    -
    -  /* occurs after statistics reported */
    -  qh_distplane(qh, point, facet, &dist);
    -  if (dist > *maxoutside) {
    -    if (*errfacet1 != facet) {
    -      *errfacet2= *errfacet1;
    -      *errfacet1= facet;
    -    }
    -    qh_fprintf(qh, qh->ferr, 6111, "qhull precision error: point p%d is outside facet f%d, distance= %6.8g maxoutside= %6.8g\n",
    -              qh_pointid(qh, point), facet->id, dist, *maxoutside);
    -  }
    -  maximize_(*maxdist, dist);
    -} /* qh_check_point */
    -
    -
    -/*---------------------------------
    -
    -  qh_check_points(qh)
    -    checks that all points are inside all facets
    -
    -  notes:
    -    if many points and qh_check_maxout not called (i.e., !qh.MERGING),
    -       calls qh_findbesthorizon (seldom done).
    -    ignores flipped facets
    -    maxoutside includes 2 qh.DISTrounds
    -      one qh.DISTround for the computed distances in qh_check_points
    -    qh_printafacet and qh_printsummary needs only one qh.DISTround
    -    the computation for qh.VERIFYdirect does not account for qh.other_points
    -
    -  design:
    -    if many points
    -      use qh_check_bestdist()
    -    else
    -      for all facets
    -        for all points
    -          check that point is inside facet
    -*/
    -void qh_check_points(qhT *qh) {
    -  facetT *facet, *errfacet1= NULL, *errfacet2= NULL;
    -  realT total, maxoutside, maxdist= -REALmax;
    -  pointT *point, **pointp, *pointtemp;
    -  boolT testouter;
    -
    -  maxoutside= qh_maxouter(qh);
    -  maxoutside += qh->DISTround;
    -  /* one more qh.DISTround for check computation */
    -  trace1((qh, qh->ferr, 1025, "qh_check_points: check all points below %2.2g of all facet planes\n",
    -          maxoutside));
    -  if (qh->num_good)   /* miss counts other_points and !good facets */
    -     total= (float)qh->num_good * (float)qh->num_points;
    -  else
    -     total= (float)qh->num_facets * (float)qh->num_points;
    -  if (total >= qh_VERIFYdirect && !qh->maxoutdone) {
    -    if (!qh_QUICKhelp && qh->SKIPcheckmax && qh->MERGING)
    -      qh_fprintf(qh, qh->ferr, 7075, "qhull input warning: merging without checking outer planes('Q5' or 'Po').\n\
    -Verify may report that a point is outside of a facet.\n");
    -    qh_check_bestdist(qh);
    -  }else {
    -    if (qh_MAXoutside && qh->maxoutdone)
    -      testouter= True;
    -    else
    -      testouter= False;
    -    if (!qh_QUICKhelp) {
    -      if (qh->MERGEexact)
    -        qh_fprintf(qh, qh->ferr, 7076, "qhull input warning: exact merge ('Qx').  Verify may report that a point\n\
    -is outside of a facet.  See qh-optq.htm#Qx\n");
    -      else if (qh->SKIPcheckmax || qh->NOnearinside)
    -        qh_fprintf(qh, qh->ferr, 7077, "qhull input warning: no outer plane check ('Q5') or no processing of\n\
    -near-inside points ('Q8').  Verify may report that a point is outside\n\
    -of a facet.\n");
    -    }
    -    if (qh->PRINTprecision) {
    -      if (testouter)
    -        qh_fprintf(qh, qh->ferr, 8098, "\n\
    -Output completed.  Verifying that all points are below outer planes of\n\
    -all %sfacets.  Will make %2.0f distance computations.\n",
    -              (qh->ONLYgood ?  "good " : ""), total);
    -      else
    -        qh_fprintf(qh, qh->ferr, 8099, "\n\
    -Output completed.  Verifying that all points are below %2.2g of\n\
    -all %sfacets.  Will make %2.0f distance computations.\n",
    -              maxoutside, (qh->ONLYgood ?  "good " : ""), total);
    -    }
    -    FORALLfacets {
    -      if (!facet->good && qh->ONLYgood)
    -        continue;
    -      if (facet->flipped)
    -        continue;
    -      if (!facet->normal) {
    -        qh_fprintf(qh, qh->ferr, 7061, "qhull warning (qh_check_points): missing normal for facet f%d\n", facet->id);
    -        continue;
    -      }
    -      if (testouter) {
    -#if qh_MAXoutside
    -        maxoutside= facet->maxoutside + 2* qh->DISTround;
    -        /* one DISTround to actual point and another to computed point */
    -#endif
    -      }
    -      FORALLpoints {
    -        if (point != qh->GOODpointp)
    -          qh_check_point(qh, point, facet, &maxoutside, &maxdist, &errfacet1, &errfacet2);
    -      }
    -      FOREACHpoint_(qh->other_points) {
    -        if (point != qh->GOODpointp)
    -          qh_check_point(qh, point, facet, &maxoutside, &maxdist, &errfacet1, &errfacet2);
    -      }
    -    }
    -    if (maxdist > qh->outside_err) {
    -      qh_fprintf(qh, qh->ferr, 6112, "qhull precision error (qh_check_points): a coplanar point is %6.2g from convex hull.  The maximum value(qh.outside_err) is %6.2g\n",
    -                maxdist, qh->outside_err );
    -      qh_errexit2(qh, qh_ERRprec, errfacet1, errfacet2 );
    -    }else if (errfacet1 && qh->outside_err > REALmax/2)
    -        qh_errexit2(qh, qh_ERRprec, errfacet1, errfacet2 );
    -    /* else if errfacet1, the error was logged to qh.ferr but does not effect the output */
    -    trace0((qh, qh->ferr, 21, "qh_check_points: max distance outside %2.2g\n", maxdist));
    -  }
    -} /* check_points */
    -
    -
    -/*---------------------------------
    -
    -  qh_checkconvex(qh, facetlist, fault )
    -    check that each ridge in facetlist is convex
    -    fault = qh_DATAfault if reporting errors
    -          = qh_ALGORITHMfault otherwise
    -
    -  returns:
    -    counts Zconcaveridges and Zcoplanarridges
    -    errors if concaveridge or if merging an coplanar ridge
    -
    -  note:
    -    if not merging,
    -      tests vertices for neighboring simplicial facets
    -    else if ZEROcentrum,
    -      tests vertices for neighboring simplicial   facets
    -    else
    -      tests centrums of neighboring facets
    -
    -  design:
    -    for all facets
    -      report flipped facets
    -      if ZEROcentrum and simplicial neighbors
    -        test vertices for neighboring simplicial facets
    -      else
    -        test centrum against all neighbors
    -*/
    -void qh_checkconvex(qhT *qh, facetT *facetlist, int fault) {
    -  facetT *facet, *neighbor, **neighborp, *errfacet1=NULL, *errfacet2=NULL;
    -  vertexT *vertex;
    -  realT dist;
    -  pointT *centrum;
    -  boolT waserror= False, centrum_warning= False, tempcentrum= False, allsimplicial;
    -  int neighbor_i;
    -
    -  trace1((qh, qh->ferr, 1026, "qh_checkconvex: check all ridges are convex\n"));
    -  if (!qh->RERUN) {
    -    zzval_(Zconcaveridges)= 0;
    -    zzval_(Zcoplanarridges)= 0;
    -  }
    -  FORALLfacet_(facetlist) {
    -    if (facet->flipped) {
    -      qh_precision(qh, "flipped facet");
    -      qh_fprintf(qh, qh->ferr, 6113, "qhull precision error: f%d is flipped(interior point is outside)\n",
    -               facet->id);
    -      errfacet1= facet;
    -      waserror= True;
    -      continue;
    -    }
    -    if (qh->MERGING && (!qh->ZEROcentrum || !facet->simplicial || facet->tricoplanar))
    -      allsimplicial= False;
    -    else {
    -      allsimplicial= True;
    -      neighbor_i= 0;
    -      FOREACHneighbor_(facet) {
    -        vertex= SETelemt_(facet->vertices, neighbor_i++, vertexT);
    -        if (!neighbor->simplicial || neighbor->tricoplanar) {
    -          allsimplicial= False;
    -          continue;
    -        }
    -        qh_distplane(qh, vertex->point, neighbor, &dist);
    -        if (dist > -qh->DISTround) {
    -          if (fault == qh_DATAfault) {
    -            qh_precision(qh, "coplanar or concave ridge");
    -            qh_fprintf(qh, qh->ferr, 6114, "qhull precision error: initial simplex is not convex. Distance=%.2g\n", dist);
    -            qh_errexit(qh, qh_ERRsingular, NULL, NULL);
    -          }
    -          if (dist > qh->DISTround) {
    -            zzinc_(Zconcaveridges);
    -            qh_precision(qh, "concave ridge");
    -            qh_fprintf(qh, qh->ferr, 6115, "qhull precision error: f%d is concave to f%d, since p%d(v%d) is %6.4g above\n",
    -              facet->id, neighbor->id, qh_pointid(qh, vertex->point), vertex->id, dist);
    -            errfacet1= facet;
    -            errfacet2= neighbor;
    -            waserror= True;
    -          }else if (qh->ZEROcentrum) {
    -            if (dist > 0) {     /* qh_checkzero checks that dist < - qh->DISTround */
    -              zzinc_(Zcoplanarridges);
    -              qh_precision(qh, "coplanar ridge");
    -              qh_fprintf(qh, qh->ferr, 6116, "qhull precision error: f%d is clearly not convex to f%d, since p%d(v%d) is %6.4g above\n",
    -                facet->id, neighbor->id, qh_pointid(qh, vertex->point), vertex->id, dist);
    -              errfacet1= facet;
    -              errfacet2= neighbor;
    -              waserror= True;
    -            }
    -          }else {
    -            zzinc_(Zcoplanarridges);
    -            qh_precision(qh, "coplanar ridge");
    -            trace0((qh, qh->ferr, 22, "qhull precision error: f%d may be coplanar to f%d, since p%d(v%d) is within %6.4g during p%d\n",
    -              facet->id, neighbor->id, qh_pointid(qh, vertex->point), vertex->id, dist, qh->furthest_id));
    -          }
    -        }
    -      }
    -    }
    -    if (!allsimplicial) {
    -      if (qh->CENTERtype == qh_AScentrum) {
    -        if (!facet->center)
    -          facet->center= qh_getcentrum(qh, facet);
    -        centrum= facet->center;
    -      }else {
    -        if (!centrum_warning && (!facet->simplicial || facet->tricoplanar)) {
    -           centrum_warning= True;
    -           qh_fprintf(qh, qh->ferr, 7062, "qhull warning: recomputing centrums for convexity test.  This may lead to false, precision errors.\n");
    -        }
    -        centrum= qh_getcentrum(qh, facet);
    -        tempcentrum= True;
    -      }
    -      FOREACHneighbor_(facet) {
    -        if (qh->ZEROcentrum && facet->simplicial && neighbor->simplicial)
    -          continue;
    -        if (facet->tricoplanar || neighbor->tricoplanar)
    -          continue;
    -        zzinc_(Zdistconvex);
    -        qh_distplane(qh, centrum, neighbor, &dist);
    -        if (dist > qh->DISTround) {
    -          zzinc_(Zconcaveridges);
    -          qh_precision(qh, "concave ridge");
    -          qh_fprintf(qh, qh->ferr, 6117, "qhull precision error: f%d is concave to f%d.  Centrum of f%d is %6.4g above f%d\n",
    -            facet->id, neighbor->id, facet->id, dist, neighbor->id);
    -          errfacet1= facet;
    -          errfacet2= neighbor;
    -          waserror= True;
    -        }else if (dist >= 0.0) {   /* if arithmetic always rounds the same,
    -                                     can test against centrum radius instead */
    -          zzinc_(Zcoplanarridges);
    -          qh_precision(qh, "coplanar ridge");
    -          qh_fprintf(qh, qh->ferr, 6118, "qhull precision error: f%d is coplanar or concave to f%d.  Centrum of f%d is %6.4g above f%d\n",
    -            facet->id, neighbor->id, facet->id, dist, neighbor->id);
    -          errfacet1= facet;
    -          errfacet2= neighbor;
    -          waserror= True;
    -        }
    -      }
    -      if (tempcentrum)
    -        qh_memfree(qh, centrum, qh->normal_size);
    -    }
    -  }
    -  if (waserror && !qh->FORCEoutput)
    -    qh_errexit2(qh, qh_ERRprec, errfacet1, errfacet2);
    -} /* checkconvex */
    -
    -
    -/*---------------------------------
    -
    -  qh_checkfacet(qh, facet, newmerge, waserror )
    -    checks for consistency errors in facet
    -    newmerge set if from merge_r.c
    -
    -  returns:
    -    sets waserror if any error occurs
    -
    -  checks:
    -    vertex ids are inverse sorted
    -    unless newmerge, at least hull_dim neighbors and vertices (exactly if simplicial)
    -    if non-simplicial, at least as many ridges as neighbors
    -    neighbors are not duplicated
    -    ridges are not duplicated
    -    in 3-d, ridges=verticies
    -    (qh.hull_dim-1) ridge vertices
    -    neighbors are reciprocated
    -    ridge neighbors are facet neighbors and a ridge for every neighbor
    -    simplicial neighbors match facetintersect
    -    vertex intersection matches vertices of common ridges
    -    vertex neighbors and facet vertices agree
    -    all ridges have distinct vertex sets
    -
    -  notes:
    -    uses neighbor->seen
    -
    -  design:
    -    check sets
    -    check vertices
    -    check sizes of neighbors and vertices
    -    check for qh_MERGEridge and qh_DUPLICATEridge flags
    -    check neighbor set
    -    check ridge set
    -    check ridges, neighbors, and vertices
    -*/
    -void qh_checkfacet(qhT *qh, facetT *facet, boolT newmerge, boolT *waserrorp) {
    -  facetT *neighbor, **neighborp, *errother=NULL;
    -  ridgeT *ridge, **ridgep, *errridge= NULL, *ridge2;
    -  vertexT *vertex, **vertexp;
    -  unsigned previousid= INT_MAX;
    -  int numneighbors, numvertices, numridges=0, numRvertices=0;
    -  boolT waserror= False;
    -  int skipA, skipB, ridge_i, ridge_n, i;
    -  setT *intersection;
    -
    -  if (facet->visible) {
    -    qh_fprintf(qh, qh->ferr, 6119, "qhull internal error (qh_checkfacet): facet f%d is on the visible_list\n",
    -      facet->id);
    -    qh_errexit(qh, qh_ERRqhull, facet, NULL);
    -  }
    -  if (!facet->normal) {
    -    qh_fprintf(qh, qh->ferr, 6120, "qhull internal error (qh_checkfacet): facet f%d does not have  a normal\n",
    -      facet->id);
    -    waserror= True;
    -  }
    -  qh_setcheck(qh, facet->vertices, "vertices for f", facet->id);
    -  qh_setcheck(qh, facet->ridges, "ridges for f", facet->id);
    -  qh_setcheck(qh, facet->outsideset, "outsideset for f", facet->id);
    -  qh_setcheck(qh, facet->coplanarset, "coplanarset for f", facet->id);
    -  qh_setcheck(qh, facet->neighbors, "neighbors for f", facet->id);
    -  FOREACHvertex_(facet->vertices) {
    -    if (vertex->deleted) {
    -      qh_fprintf(qh, qh->ferr, 6121, "qhull internal error (qh_checkfacet): deleted vertex v%d in f%d\n", vertex->id, facet->id);
    -      qh_errprint(qh, "ERRONEOUS", NULL, NULL, NULL, vertex);
    -      waserror= True;
    -    }
    -    if (vertex->id >= previousid) {
    -      qh_fprintf(qh, qh->ferr, 6122, "qhull internal error (qh_checkfacet): vertices of f%d are not in descending id order at v%d\n", facet->id, vertex->id);
    -      waserror= True;
    -      break;
    -    }
    -    previousid= vertex->id;
    -  }
    -  numneighbors= qh_setsize(qh, facet->neighbors);
    -  numvertices= qh_setsize(qh, facet->vertices);
    -  numridges= qh_setsize(qh, facet->ridges);
    -  if (facet->simplicial) {
    -    if (numvertices+numneighbors != 2*qh->hull_dim
    -    && !facet->degenerate && !facet->redundant) {
    -      qh_fprintf(qh, qh->ferr, 6123, "qhull internal error (qh_checkfacet): for simplicial facet f%d, #vertices %d + #neighbors %d != 2*qh->hull_dim\n",
    -                facet->id, numvertices, numneighbors);
    -      qh_setprint(qh, qh->ferr, "", facet->neighbors);
    -      waserror= True;
    -    }
    -  }else { /* non-simplicial */
    -    if (!newmerge
    -    &&(numvertices < qh->hull_dim || numneighbors < qh->hull_dim)
    -    && !facet->degenerate && !facet->redundant) {
    -      qh_fprintf(qh, qh->ferr, 6124, "qhull internal error (qh_checkfacet): for facet f%d, #vertices %d or #neighbors %d < qh->hull_dim\n",
    -         facet->id, numvertices, numneighbors);
    -       waserror= True;
    -    }
    -    /* in 3-d, can get a vertex twice in an edge list, e.g., RBOX 1000 s W1e-13 t995849315 D2 | QHULL d Tc Tv TP624 TW1e-13 T4 */
    -    if (numridges < numneighbors
    -    ||(qh->hull_dim == 3 && numvertices > numridges && !qh->NEWfacets)
    -    ||(qh->hull_dim == 2 && numridges + numvertices + numneighbors != 6)) {
    -      if (!facet->degenerate && !facet->redundant) {
    -        qh_fprintf(qh, qh->ferr, 6125, "qhull internal error (qh_checkfacet): for facet f%d, #ridges %d < #neighbors %d or(3-d) > #vertices %d or(2-d) not all 2\n",
    -            facet->id, numridges, numneighbors, numvertices);
    -        waserror= True;
    -      }
    -    }
    -  }
    -  FOREACHneighbor_(facet) {
    -    if (neighbor == qh_MERGEridge || neighbor == qh_DUPLICATEridge) {
    -      qh_fprintf(qh, qh->ferr, 6126, "qhull internal error (qh_checkfacet): facet f%d still has a MERGE or DUP neighbor\n", facet->id);
    -      qh_errexit(qh, qh_ERRqhull, facet, NULL);
    -    }
    -    neighbor->seen= True;
    -  }
    -  FOREACHneighbor_(facet) {
    -    if (!qh_setin(neighbor->neighbors, facet)) {
    -      qh_fprintf(qh, qh->ferr, 6127, "qhull internal error (qh_checkfacet): facet f%d has neighbor f%d, but f%d does not have neighbor f%d\n",
    -              facet->id, neighbor->id, neighbor->id, facet->id);
    -      errother= neighbor;
    -      waserror= True;
    -    }
    -    if (!neighbor->seen) {
    -      qh_fprintf(qh, qh->ferr, 6128, "qhull internal error (qh_checkfacet): facet f%d has a duplicate neighbor f%d\n",
    -              facet->id, neighbor->id);
    -      errother= neighbor;
    -      waserror= True;
    -    }
    -    neighbor->seen= False;
    -  }
    -  FOREACHridge_(facet->ridges) {
    -    qh_setcheck(qh, ridge->vertices, "vertices for r", ridge->id);
    -    ridge->seen= False;
    -  }
    -  FOREACHridge_(facet->ridges) {
    -    if (ridge->seen) {
    -      qh_fprintf(qh, qh->ferr, 6129, "qhull internal error (qh_checkfacet): facet f%d has a duplicate ridge r%d\n",
    -              facet->id, ridge->id);
    -      errridge= ridge;
    -      waserror= True;
    -    }
    -    ridge->seen= True;
    -    numRvertices= qh_setsize(qh, ridge->vertices);
    -    if (numRvertices != qh->hull_dim - 1) {
    -      qh_fprintf(qh, qh->ferr, 6130, "qhull internal error (qh_checkfacet): ridge between f%d and f%d has %d vertices\n",
    -                ridge->top->id, ridge->bottom->id, numRvertices);
    -      errridge= ridge;
    -      waserror= True;
    -    }
    -    neighbor= otherfacet_(ridge, facet);
    -    neighbor->seen= True;
    -    if (!qh_setin(facet->neighbors, neighbor)) {
    -      qh_fprintf(qh, qh->ferr, 6131, "qhull internal error (qh_checkfacet): for facet f%d, neighbor f%d of ridge r%d not in facet\n",
    -           facet->id, neighbor->id, ridge->id);
    -      errridge= ridge;
    -      waserror= True;
    -    }
    -  }
    -  if (!facet->simplicial) {
    -    FOREACHneighbor_(facet) {
    -      if (!neighbor->seen) {
    -        qh_fprintf(qh, qh->ferr, 6132, "qhull internal error (qh_checkfacet): facet f%d does not have a ridge for neighbor f%d\n",
    -              facet->id, neighbor->id);
    -        errother= neighbor;
    -        waserror= True;
    -      }
    -      intersection= qh_vertexintersect_new(qh, facet->vertices, neighbor->vertices);
    -      qh_settemppush(qh, intersection);
    -      FOREACHvertex_(facet->vertices) {
    -        vertex->seen= False;
    -        vertex->seen2= False;
    -      }
    -      FOREACHvertex_(intersection)
    -        vertex->seen= True;
    -      FOREACHridge_(facet->ridges) {
    -        if (neighbor != otherfacet_(ridge, facet))
    -            continue;
    -        FOREACHvertex_(ridge->vertices) {
    -          if (!vertex->seen) {
    -            qh_fprintf(qh, qh->ferr, 6133, "qhull internal error (qh_checkfacet): vertex v%d in r%d not in f%d intersect f%d\n",
    -                  vertex->id, ridge->id, facet->id, neighbor->id);
    -            qh_errexit(qh, qh_ERRqhull, facet, ridge);
    -          }
    -          vertex->seen2= True;
    -        }
    -      }
    -      if (!newmerge) {
    -        FOREACHvertex_(intersection) {
    -          if (!vertex->seen2) {
    -            if (qh->IStracing >=3 || !qh->MERGING) {
    -              qh_fprintf(qh, qh->ferr, 6134, "qhull precision error (qh_checkfacet): vertex v%d in f%d intersect f%d but\n\
    - not in a ridge.  This is ok under merging.  Last point was p%d\n",
    -                     vertex->id, facet->id, neighbor->id, qh->furthest_id);
    -              if (!qh->FORCEoutput && !qh->MERGING) {
    -                qh_errprint(qh, "ERRONEOUS", facet, neighbor, NULL, vertex);
    -                if (!qh->MERGING)
    -                  qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -              }
    -            }
    -          }
    -        }
    -      }
    -      qh_settempfree(qh, &intersection);
    -    }
    -  }else { /* simplicial */
    -    FOREACHneighbor_(facet) {
    -      if (neighbor->simplicial) {
    -        skipA= SETindex_(facet->neighbors, neighbor);
    -        skipB= qh_setindex(neighbor->neighbors, facet);
    -        if (skipA<0 || skipB<0 || !qh_setequal_skip(facet->vertices, skipA, neighbor->vertices, skipB)) {
    -          qh_fprintf(qh, qh->ferr, 6135, "qhull internal error (qh_checkfacet): facet f%d skip %d and neighbor f%d skip %d do not match \n",
    -                   facet->id, skipA, neighbor->id, skipB);
    -          errother= neighbor;
    -          waserror= True;
    -        }
    -      }
    -    }
    -  }
    -  if (qh->hull_dim < 5 && (qh->IStracing > 2 || qh->CHECKfrequently)) {
    -    FOREACHridge_i_(qh, facet->ridges) {           /* expensive */
    -      for (i=ridge_i+1; i < ridge_n; i++) {
    -        ridge2= SETelemt_(facet->ridges, i, ridgeT);
    -        if (qh_setequal(ridge->vertices, ridge2->vertices)) {
    -          qh_fprintf(qh, qh->ferr, 6227, "Qhull internal error (qh_checkfacet): ridges r%d and r%d have the same vertices\n",
    -                  ridge->id, ridge2->id);
    -          errridge= ridge;
    -          waserror= True;
    -        }
    -      }
    -    }
    -  }
    -  if (waserror) {
    -    qh_errprint(qh, "ERRONEOUS", facet, errother, errridge, NULL);
    -    *waserrorp= True;
    -  }
    -} /* checkfacet */
    -
    -
    -/*---------------------------------
    -
    -  qh_checkflipped_all(qh, facetlist )
    -    checks orientation of facets in list against interior point
    -*/
    -void qh_checkflipped_all(qhT *qh, facetT *facetlist) {
    -  facetT *facet;
    -  boolT waserror= False;
    -  realT dist;
    -
    -  if (facetlist == qh->facet_list)
    -    zzval_(Zflippedfacets)= 0;
    -  FORALLfacet_(facetlist) {
    -    if (facet->normal && !qh_checkflipped(qh, facet, &dist, !qh_ALL)) {
    -      qh_fprintf(qh, qh->ferr, 6136, "qhull precision error: facet f%d is flipped, distance= %6.12g\n",
    -              facet->id, dist);
    -      if (!qh->FORCEoutput) {
    -        qh_errprint(qh, "ERRONEOUS", facet, NULL, NULL, NULL);
    -        waserror= True;
    -      }
    -    }
    -  }
    -  if (waserror) {
    -    qh_fprintf(qh, qh->ferr, 8101, "\n\
    -A flipped facet occurs when its distance to the interior point is\n\
    -greater than %2.2g, the maximum roundoff error.\n", -qh->DISTround);
    -    qh_errexit(qh, qh_ERRprec, NULL, NULL);
    -  }
    -} /* checkflipped_all */
    -
    -/*---------------------------------
    -
    -  qh_checkpolygon(qh, facetlist )
    -    checks the correctness of the structure
    -
    -  notes:
    -    call with either qh.facet_list or qh.newfacet_list
    -    checks num_facets and num_vertices if qh.facet_list
    -
    -  design:
    -    for each facet
    -      checks facet and outside set
    -    initializes vertexlist
    -    for each facet
    -      checks vertex set
    -    if checking all facets(qh.facetlist)
    -      check facet count
    -      if qh.VERTEXneighbors
    -        check vertex neighbors and count
    -      check vertex count
    -*/
    -void qh_checkpolygon(qhT *qh, facetT *facetlist) {
    -  facetT *facet;
    -  vertexT *vertex, **vertexp, *vertexlist;
    -  int numfacets= 0, numvertices= 0, numridges= 0;
    -  int totvneighbors= 0, totvertices= 0;
    -  boolT waserror= False, nextseen= False, visibleseen= False;
    -
    -  trace1((qh, qh->ferr, 1027, "qh_checkpolygon: check all facets from f%d\n", facetlist->id));
    -  if (facetlist != qh->facet_list || qh->ONLYgood)
    -    nextseen= True;
    -  FORALLfacet_(facetlist) {
    -    if (facet == qh->visible_list)
    -      visibleseen= True;
    -    if (!facet->visible) {
    -      if (!nextseen) {
    -        if (facet == qh->facet_next)
    -          nextseen= True;
    -        else if (qh_setsize(qh, facet->outsideset)) {
    -          if (!qh->NARROWhull
    -#if !qh_COMPUTEfurthest
    -               || facet->furthestdist >= qh->MINoutside
    -#endif
    -                        ) {
    -            qh_fprintf(qh, qh->ferr, 6137, "qhull internal error (qh_checkpolygon): f%d has outside points before qh->facet_next\n",
    -                     facet->id);
    -            qh_errexit(qh, qh_ERRqhull, facet, NULL);
    -          }
    -        }
    -      }
    -      numfacets++;
    -      qh_checkfacet(qh, facet, False, &waserror);
    -    }
    -  }
    -  if (qh->visible_list && !visibleseen && facetlist == qh->facet_list) {
    -    qh_fprintf(qh, qh->ferr, 6138, "qhull internal error (qh_checkpolygon): visible list f%d no longer on facet list\n", qh->visible_list->id);
    -    qh_printlists(qh);
    -    qh_errexit(qh, qh_ERRqhull, qh->visible_list, NULL);
    -  }
    -  if (facetlist == qh->facet_list)
    -    vertexlist= qh->vertex_list;
    -  else if (facetlist == qh->newfacet_list)
    -    vertexlist= qh->newvertex_list;
    -  else
    -    vertexlist= NULL;
    -  FORALLvertex_(vertexlist) {
    -    vertex->seen= False;
    -    vertex->visitid= 0;
    -  }
    -  FORALLfacet_(facetlist) {
    -    if (facet->visible)
    -      continue;
    -    if (facet->simplicial)
    -      numridges += qh->hull_dim;
    -    else
    -      numridges += qh_setsize(qh, facet->ridges);
    -    FOREACHvertex_(facet->vertices) {
    -      vertex->visitid++;
    -      if (!vertex->seen) {
    -        vertex->seen= True;
    -        numvertices++;
    -        if (qh_pointid(qh, vertex->point) == qh_IDunknown) {
    -          qh_fprintf(qh, qh->ferr, 6139, "qhull internal error (qh_checkpolygon): unknown point %p for vertex v%d first_point %p\n",
    -                   vertex->point, vertex->id, qh->first_point);
    -          waserror= True;
    -        }
    -      }
    -    }
    -  }
    -  qh->vertex_visit += (unsigned int)numfacets;
    -  if (facetlist == qh->facet_list) {
    -    if (numfacets != qh->num_facets - qh->num_visible) {
    -      qh_fprintf(qh, qh->ferr, 6140, "qhull internal error (qh_checkpolygon): actual number of facets is %d, cumulative facet count is %d - %d visible facets\n",
    -              numfacets, qh->num_facets, qh->num_visible);
    -      waserror= True;
    -    }
    -    qh->vertex_visit++;
    -    if (qh->VERTEXneighbors) {
    -      FORALLvertices {
    -        qh_setcheck(qh, vertex->neighbors, "neighbors for v", vertex->id);
    -        if (vertex->deleted)
    -          continue;
    -        totvneighbors += qh_setsize(qh, vertex->neighbors);
    -      }
    -      FORALLfacet_(facetlist)
    -        totvertices += qh_setsize(qh, facet->vertices);
    -      if (totvneighbors != totvertices) {
    -        qh_fprintf(qh, qh->ferr, 6141, "qhull internal error (qh_checkpolygon): vertex neighbors inconsistent.  Totvneighbors %d, totvertices %d\n",
    -                totvneighbors, totvertices);
    -        waserror= True;
    -      }
    -    }
    -    if (numvertices != qh->num_vertices - qh_setsize(qh, qh->del_vertices)) {
    -      qh_fprintf(qh, qh->ferr, 6142, "qhull internal error (qh_checkpolygon): actual number of vertices is %d, cumulative vertex count is %d\n",
    -              numvertices, qh->num_vertices - qh_setsize(qh, qh->del_vertices));
    -      waserror= True;
    -    }
    -    if (qh->hull_dim == 2 && numvertices != numfacets) {
    -      qh_fprintf(qh, qh->ferr, 6143, "qhull internal error (qh_checkpolygon): #vertices %d != #facets %d\n",
    -        numvertices, numfacets);
    -      waserror= True;
    -    }
    -    if (qh->hull_dim == 3 && numvertices + numfacets - numridges/2 != 2) {
    -      qh_fprintf(qh, qh->ferr, 7063, "qhull warning: #vertices %d + #facets %d - #edges %d != 2\n\
    -        A vertex appears twice in a edge list.  May occur during merging.",
    -        numvertices, numfacets, numridges/2);
    -      /* occurs if lots of merging and a vertex ends up twice in an edge list.  e.g., RBOX 1000 s W1e-13 t995849315 D2 | QHULL d Tc Tv */
    -    }
    -  }
    -  if (waserror)
    -    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -} /* checkpolygon */
    -
    -
    -/*---------------------------------
    -
    -  qh_checkvertex(qh, vertex )
    -    check vertex for consistency
    -    checks vertex->neighbors
    -
    -  notes:
    -    neighbors checked efficiently in checkpolygon
    -*/
    -void qh_checkvertex(qhT *qh, vertexT *vertex) {
    -  boolT waserror= False;
    -  facetT *neighbor, **neighborp, *errfacet=NULL;
    -
    -  if (qh_pointid(qh, vertex->point) == qh_IDunknown) {
    -    qh_fprintf(qh, qh->ferr, 6144, "qhull internal error (qh_checkvertex): unknown point id %p\n", vertex->point);
    -    waserror= True;
    -  }
    -  if (vertex->id >= qh->vertex_id) {
    -    qh_fprintf(qh, qh->ferr, 6145, "qhull internal error (qh_checkvertex): unknown vertex id %d\n", vertex->id);
    -    waserror= True;
    -  }
    -  if (!waserror && !vertex->deleted) {
    -    if (qh_setsize(qh, vertex->neighbors)) {
    -      FOREACHneighbor_(vertex) {
    -        if (!qh_setin(neighbor->vertices, vertex)) {
    -          qh_fprintf(qh, qh->ferr, 6146, "qhull internal error (qh_checkvertex): neighbor f%d does not contain v%d\n", neighbor->id, vertex->id);
    -          errfacet= neighbor;
    -          waserror= True;
    -        }
    -      }
    -    }
    -  }
    -  if (waserror) {
    -    qh_errprint(qh, "ERRONEOUS", NULL, NULL, NULL, vertex);
    -    qh_errexit(qh, qh_ERRqhull, errfacet, NULL);
    -  }
    -} /* checkvertex */
    -
    -/*---------------------------------
    -
    -  qh_clearcenters(qh, type )
    -    clear old data from facet->center
    -
    -  notes:
    -    sets new centertype
    -    nop if CENTERtype is the same
    -*/
    -void qh_clearcenters(qhT *qh, qh_CENTER type) {
    -  facetT *facet;
    -
    -  if (qh->CENTERtype != type) {
    -    FORALLfacets {
    -      if (facet->tricoplanar && !facet->keepcentrum)
    -          facet->center= NULL;  /* center is owned by the ->keepcentrum facet */
    -      else if (qh->CENTERtype == qh_ASvoronoi){
    -        if (facet->center) {
    -          qh_memfree(qh, facet->center, qh->center_size);
    -          facet->center= NULL;
    -        }
    -      }else /* qh->CENTERtype == qh_AScentrum */ {
    -        if (facet->center) {
    -          qh_memfree(qh, facet->center, qh->normal_size);
    -          facet->center= NULL;
    -        }
    -      }
    -    }
    -    qh->CENTERtype= type;
    -  }
    -  trace2((qh, qh->ferr, 2043, "qh_clearcenters: switched to center type %d\n", type));
    -} /* clearcenters */
    -
    -/*---------------------------------
    -
    -  qh_createsimplex(qh, vertices )
    -    creates a simplex from a set of vertices
    -
    -  returns:
    -    initializes qh.facet_list to the simplex
    -    initializes qh.newfacet_list, .facet_tail
    -    initializes qh.vertex_list, .newvertex_list, .vertex_tail
    -
    -  design:
    -    initializes lists
    -    for each vertex
    -      create a new facet
    -    for each new facet
    -      create its neighbor set
    -*/
    -void qh_createsimplex(qhT *qh, setT *vertices) {
    -  facetT *facet= NULL, *newfacet;
    -  boolT toporient= True;
    -  int vertex_i, vertex_n, nth;
    -  setT *newfacets= qh_settemp(qh, qh->hull_dim+1);
    -  vertexT *vertex;
    -
    -  qh->facet_list= qh->newfacet_list= qh->facet_tail= qh_newfacet(qh);
    -  qh->num_facets= qh->num_vertices= qh->num_visible= 0;
    -  qh->vertex_list= qh->newvertex_list= qh->vertex_tail= qh_newvertex(qh, NULL);
    -  FOREACHvertex_i_(qh, vertices) {
    -    newfacet= qh_newfacet(qh);
    -    newfacet->vertices= qh_setnew_delnthsorted(qh, vertices, vertex_n,
    -                                                vertex_i, 0);
    -    newfacet->toporient= (unsigned char)toporient;
    -    qh_appendfacet(qh, newfacet);
    -    newfacet->newfacet= True;
    -    qh_appendvertex(qh, vertex);
    -    qh_setappend(qh, &newfacets, newfacet);
    -    toporient ^= True;
    -  }
    -  FORALLnew_facets {
    -    nth= 0;
    -    FORALLfacet_(qh->newfacet_list) {
    -      if (facet != newfacet)
    -        SETelem_(newfacet->neighbors, nth++)= facet;
    -    }
    -    qh_settruncate(qh, newfacet->neighbors, qh->hull_dim);
    -  }
    -  qh_settempfree(qh, &newfacets);
    -  trace1((qh, qh->ferr, 1028, "qh_createsimplex: created simplex\n"));
    -} /* createsimplex */
    -
    -/*---------------------------------
    -
    -  qh_delridge(qh, ridge )
    -    deletes ridge from data structures it belongs to
    -    frees up its memory
    -
    -  notes:
    -    in merge_r.c, caller sets vertex->delridge for each vertex
    -    ridges also freed in qh_freeqhull
    -*/
    -void qh_delridge(qhT *qh, ridgeT *ridge) {
    -  void **freelistp; /* used if !qh_NOmem by qh_memfree_() */
    -
    -  qh_setdel(ridge->top->ridges, ridge);
    -  qh_setdel(ridge->bottom->ridges, ridge);
    -  qh_setfree(qh, &(ridge->vertices));
    -  qh_memfree_(qh, ridge, (int)sizeof(ridgeT), freelistp);
    -} /* delridge */
    -
    -
    -/*---------------------------------
    -
    -  qh_delvertex(qh, vertex )
    -    deletes a vertex and frees its memory
    -
    -  notes:
    -    assumes vertex->adjacencies have been updated if needed
    -    unlinks from vertex_list
    -*/
    -void qh_delvertex(qhT *qh, vertexT *vertex) {
    -
    -  if (vertex == qh->tracevertex)
    -    qh->tracevertex= NULL;
    -  qh_removevertex(qh, vertex);
    -  qh_setfree(qh, &vertex->neighbors);
    -  qh_memfree(qh, vertex, (int)sizeof(vertexT));
    -} /* delvertex */
    -
    -
    -/*---------------------------------
    -
    -  qh_facet3vertex(qh, )
    -    return temporary set of 3-d vertices in qh_ORIENTclock order
    -
    -  design:
    -    if simplicial facet
    -      build set from facet->vertices with facet->toporient
    -    else
    -      for each ridge in order
    -        build set from ridge's vertices
    -*/
    -setT *qh_facet3vertex(qhT *qh, facetT *facet) {
    -  ridgeT *ridge, *firstridge;
    -  vertexT *vertex;
    -  int cntvertices, cntprojected=0;
    -  setT *vertices;
    -
    -  cntvertices= qh_setsize(qh, facet->vertices);
    -  vertices= qh_settemp(qh, cntvertices);
    -  if (facet->simplicial) {
    -    if (cntvertices != 3) {
    -      qh_fprintf(qh, qh->ferr, 6147, "qhull internal error (qh_facet3vertex): only %d vertices for simplicial facet f%d\n",
    -                  cntvertices, facet->id);
    -      qh_errexit(qh, qh_ERRqhull, facet, NULL);
    -    }
    -    qh_setappend(qh, &vertices, SETfirst_(facet->vertices));
    -    if (facet->toporient ^ qh_ORIENTclock)
    -      qh_setappend(qh, &vertices, SETsecond_(facet->vertices));
    -    else
    -      qh_setaddnth(qh, &vertices, 0, SETsecond_(facet->vertices));
    -    qh_setappend(qh, &vertices, SETelem_(facet->vertices, 2));
    -  }else {
    -    ridge= firstridge= SETfirstt_(facet->ridges, ridgeT);   /* no infinite */
    -    while ((ridge= qh_nextridge3d(ridge, facet, &vertex))) {
    -      qh_setappend(qh, &vertices, vertex);
    -      if (++cntprojected > cntvertices || ridge == firstridge)
    -        break;
    -    }
    -    if (!ridge || cntprojected != cntvertices) {
    -      qh_fprintf(qh, qh->ferr, 6148, "qhull internal error (qh_facet3vertex): ridges for facet %d don't match up.  got at least %d\n",
    -                  facet->id, cntprojected);
    -      qh_errexit(qh, qh_ERRqhull, facet, ridge);
    -    }
    -  }
    -  return vertices;
    -} /* facet3vertex */
    -
    -/*---------------------------------
    -
    -  qh_findbestfacet(qh, point, bestoutside, bestdist, isoutside )
    -    find facet that is furthest below a point
    -
    -    for Delaunay triangulations,
    -      Use qh_setdelaunay() to lift point to paraboloid and scale by 'Qbb' if needed
    -      Do not use options 'Qbk', 'QBk', or 'QbB' since they scale the coordinates.
    -
    -  returns:
    -    if bestoutside is set (e.g., qh_ALL)
    -      returns best facet that is not upperdelaunay
    -      if Delaunay and inside, point is outside circumsphere of bestfacet
    -    else
    -      returns first facet below point
    -      if point is inside, returns nearest, !upperdelaunay facet
    -    distance to facet
    -    isoutside set if outside of facet
    -
    -  notes:
    -    For tricoplanar facets, this finds one of the tricoplanar facets closest
    -    to the point.  For Delaunay triangulations, the point may be inside a
    -    different tricoplanar facet. See locate a facet with qh_findbestfacet()
    -
    -    If inside, qh_findbestfacet performs an exhaustive search
    -       this may be too conservative.  Sometimes it is clearly required.
    -
    -    qh_findbestfacet is not used by qhull.
    -    uses qh.visit_id and qh.coplanarset
    -
    -  see:
    -    qh_findbest
    -*/
    -facetT *qh_findbestfacet(qhT *qh, pointT *point, boolT bestoutside,
    -           realT *bestdist, boolT *isoutside) {
    -  facetT *bestfacet= NULL;
    -  int numpart, totpart= 0;
    -
    -  bestfacet= qh_findbest(qh, point, qh->facet_list,
    -                            bestoutside, !qh_ISnewfacets, bestoutside /* qh_NOupper */,
    -                            bestdist, isoutside, &totpart);
    -  if (*bestdist < -qh->DISTround) {
    -    bestfacet= qh_findfacet_all(qh, point, bestdist, isoutside, &numpart);
    -    totpart += numpart;
    -    if ((isoutside && *isoutside && bestoutside)
    -    || (isoutside && !*isoutside && bestfacet->upperdelaunay)) {
    -      bestfacet= qh_findbest(qh, point, bestfacet,
    -                            bestoutside, False, bestoutside,
    -                            bestdist, isoutside, &totpart);
    -      totpart += numpart;
    -    }
    -  }
    -  trace3((qh, qh->ferr, 3014, "qh_findbestfacet: f%d dist %2.2g isoutside %d totpart %d\n",
    -          bestfacet->id, *bestdist, (isoutside ? *isoutside : UINT_MAX), totpart));
    -  return bestfacet;
    -} /* findbestfacet */
    -
    -/*---------------------------------
    -
    -  qh_findbestlower(qh, facet, point, bestdist, numpart )
    -    returns best non-upper, non-flipped neighbor of facet for point
    -    if needed, searches vertex neighbors
    -
    -  returns:
    -    returns bestdist and updates numpart
    -
    -  notes:
    -    if Delaunay and inside, point is outside of circumsphere of bestfacet
    -    called by qh_findbest() for points above an upperdelaunay facet
    -
    -*/
    -facetT *qh_findbestlower(qhT *qh, facetT *upperfacet, pointT *point, realT *bestdistp, int *numpart) {
    -  facetT *neighbor, **neighborp, *bestfacet= NULL;
    -  realT bestdist= -REALmax/2 /* avoid underflow */;
    -  realT dist;
    -  vertexT *vertex;
    -  boolT isoutside= False;  /* not used */
    -
    -  zinc_(Zbestlower);
    -  FOREACHneighbor_(upperfacet) {
    -    if (neighbor->upperdelaunay || neighbor->flipped)
    -      continue;
    -    (*numpart)++;
    -    qh_distplane(qh, point, neighbor, &dist);
    -    if (dist > bestdist) {
    -      bestfacet= neighbor;
    -      bestdist= dist;
    -    }
    -  }
    -  if (!bestfacet) {
    -    zinc_(Zbestlowerv);
    -    /* rarely called, numpart does not count nearvertex computations */
    -    vertex= qh_nearvertex(qh, upperfacet, point, &dist);
    -    qh_vertexneighbors(qh);
    -    FOREACHneighbor_(vertex) {
    -      if (neighbor->upperdelaunay || neighbor->flipped)
    -        continue;
    -      (*numpart)++;
    -      qh_distplane(qh, point, neighbor, &dist);
    -      if (dist > bestdist) {
    -        bestfacet= neighbor;
    -        bestdist= dist;
    -      }
    -    }
    -  }
    -  if (!bestfacet) {
    -    zinc_(Zbestlowerall);  /* invoked once per point in outsideset */
    -    zmax_(Zbestloweralln, qh->num_facets);
    -    /* [dec'15] Previously reported as QH6228 */
    -    trace3((qh, qh->ferr, 3025, "qh_findbestlower: all neighbors of facet %d are flipped or upper Delaunay.  Search all facets\n",
    -       upperfacet->id));
    -    /* rarely called */
    -    bestfacet= qh_findfacet_all(qh, point, &bestdist, &isoutside, numpart);
    -  }
    -  *bestdistp= bestdist;
    -  trace3((qh, qh->ferr, 3015, "qh_findbestlower: f%d dist %2.2g for f%d p%d\n",
    -          bestfacet->id, bestdist, upperfacet->id, qh_pointid(qh, point)));
    -  return bestfacet;
    -} /* findbestlower */
    -
    -/*---------------------------------
    -
    -  qh_findfacet_all(qh, point, bestdist, isoutside, numpart )
    -    exhaustive search for facet below a point
    -
    -    for Delaunay triangulations,
    -      Use qh_setdelaunay() to lift point to paraboloid and scale by 'Qbb' if needed
    -      Do not use options 'Qbk', 'QBk', or 'QbB' since they scale the coordinates.
    -
    -  returns:
    -    returns first facet below point
    -    if point is inside,
    -      returns nearest facet
    -    distance to facet
    -    isoutside if point is outside of the hull
    -    number of distance tests
    -
    -  notes:
    -    primarily for library users, rarely used by Qhull
    -*/
    -facetT *qh_findfacet_all(qhT *qh, pointT *point, realT *bestdist, boolT *isoutside,
    -                          int *numpart) {
    -  facetT *bestfacet= NULL, *facet;
    -  realT dist;
    -  int totpart= 0;
    -
    -  *bestdist= -REALmax;
    -  *isoutside= False;
    -  FORALLfacets {
    -    if (facet->flipped || !facet->normal)
    -      continue;
    -    totpart++;
    -    qh_distplane(qh, point, facet, &dist);
    -    if (dist > *bestdist) {
    -      *bestdist= dist;
    -      bestfacet= facet;
    -      if (dist > qh->MINoutside) {
    -        *isoutside= True;
    -        break;
    -      }
    -    }
    -  }
    -  *numpart= totpart;
    -  trace3((qh, qh->ferr, 3016, "qh_findfacet_all: f%d dist %2.2g isoutside %d totpart %d\n",
    -          getid_(bestfacet), *bestdist, *isoutside, totpart));
    -  return bestfacet;
    -} /* findfacet_all */
    -
    -/*---------------------------------
    -
    -  qh_findgood(qh, facetlist, goodhorizon )
    -    identify good facets for qh.PRINTgood
    -    if qh.GOODvertex>0
    -      facet includes point as vertex
    -      if !match, returns goodhorizon
    -      inactive if qh.MERGING
    -    if qh.GOODpoint
    -      facet is visible or coplanar (>0) or not visible (<0)
    -    if qh.GOODthreshold
    -      facet->normal matches threshold
    -    if !goodhorizon and !match,
    -      selects facet with closest angle
    -      sets GOODclosest
    -
    -  returns:
    -    number of new, good facets found
    -    determines facet->good
    -    may update qh.GOODclosest
    -
    -  notes:
    -    qh_findgood_all further reduces the good region
    -
    -  design:
    -    count good facets
    -    mark good facets for qh.GOODpoint
    -    mark good facets for qh.GOODthreshold
    -    if necessary
    -      update qh.GOODclosest
    -*/
    -int qh_findgood(qhT *qh, facetT *facetlist, int goodhorizon) {
    -  facetT *facet, *bestfacet= NULL;
    -  realT angle, bestangle= REALmax, dist;
    -  int  numgood=0;
    -
    -  FORALLfacet_(facetlist) {
    -    if (facet->good)
    -      numgood++;
    -  }
    -  if (qh->GOODvertex>0 && !qh->MERGING) {
    -    FORALLfacet_(facetlist) {
    -      if (!qh_isvertex(qh->GOODvertexp, facet->vertices)) {
    -        facet->good= False;
    -        numgood--;
    -      }
    -    }
    -  }
    -  if (qh->GOODpoint && numgood) {
    -    FORALLfacet_(facetlist) {
    -      if (facet->good && facet->normal) {
    -        zinc_(Zdistgood);
    -        qh_distplane(qh, qh->GOODpointp, facet, &dist);
    -        if ((qh->GOODpoint > 0) ^ (dist > 0.0)) {
    -          facet->good= False;
    -          numgood--;
    -        }
    -      }
    -    }
    -  }
    -  if (qh->GOODthreshold && (numgood || goodhorizon || qh->GOODclosest)) {
    -    FORALLfacet_(facetlist) {
    -      if (facet->good && facet->normal) {
    -        if (!qh_inthresholds(qh, facet->normal, &angle)) {
    -          facet->good= False;
    -          numgood--;
    -          if (angle < bestangle) {
    -            bestangle= angle;
    -            bestfacet= facet;
    -          }
    -        }
    -      }
    -    }
    -    if (!numgood && (!goodhorizon || qh->GOODclosest)) {
    -      if (qh->GOODclosest) {
    -        if (qh->GOODclosest->visible)
    -          qh->GOODclosest= NULL;
    -        else {
    -          qh_inthresholds(qh, qh->GOODclosest->normal, &angle);
    -          if (angle < bestangle)
    -            bestfacet= qh->GOODclosest;
    -        }
    -      }
    -      if (bestfacet && bestfacet != qh->GOODclosest) {
    -        if (qh->GOODclosest)
    -          qh->GOODclosest->good= False;
    -        qh->GOODclosest= bestfacet;
    -        bestfacet->good= True;
    -        numgood++;
    -        trace2((qh, qh->ferr, 2044, "qh_findgood: f%d is closest(%2.2g) to thresholds\n",
    -           bestfacet->id, bestangle));
    -        return numgood;
    -      }
    -    }else if (qh->GOODclosest) { /* numgood > 0 */
    -      qh->GOODclosest->good= False;
    -      qh->GOODclosest= NULL;
    -    }
    -  }
    -  zadd_(Zgoodfacet, numgood);
    -  trace2((qh, qh->ferr, 2045, "qh_findgood: found %d good facets with %d good horizon\n",
    -               numgood, goodhorizon));
    -  if (!numgood && qh->GOODvertex>0 && !qh->MERGING)
    -    return goodhorizon;
    -  return numgood;
    -} /* findgood */
    -
    -/*---------------------------------
    -
    -  qh_findgood_all(qh, facetlist )
    -    apply other constraints for good facets (used by qh.PRINTgood)
    -    if qh.GOODvertex
    -      facet includes (>0) or doesn't include (<0) point as vertex
    -      if last good facet and ONLYgood, prints warning and continues
    -    if qh.SPLITthresholds
    -      facet->normal matches threshold, or if none, the closest one
    -    calls qh_findgood
    -    nop if good not used
    -
    -  returns:
    -    clears facet->good if not good
    -    sets qh.num_good
    -
    -  notes:
    -    this is like qh_findgood but more restrictive
    -
    -  design:
    -    uses qh_findgood to mark good facets
    -    marks facets for qh.GOODvertex
    -    marks facets for qh.SPLITthreholds
    -*/
    -void qh_findgood_all(qhT *qh, facetT *facetlist) {
    -  facetT *facet, *bestfacet=NULL;
    -  realT angle, bestangle= REALmax;
    -  int  numgood=0, startgood;
    -
    -  if (!qh->GOODvertex && !qh->GOODthreshold && !qh->GOODpoint
    -  && !qh->SPLITthresholds)
    -    return;
    -  if (!qh->ONLYgood)
    -    qh_findgood(qh, qh->facet_list, 0);
    -  FORALLfacet_(facetlist) {
    -    if (facet->good)
    -      numgood++;
    -  }
    -  if (qh->GOODvertex <0 || (qh->GOODvertex > 0 && qh->MERGING)) {
    -    FORALLfacet_(facetlist) {
    -      if (facet->good && ((qh->GOODvertex > 0) ^ !!qh_isvertex(qh->GOODvertexp, facet->vertices))) {
    -        if (!--numgood) {
    -          if (qh->ONLYgood) {
    -            qh_fprintf(qh, qh->ferr, 7064, "qhull warning: good vertex p%d does not match last good facet f%d.  Ignored.\n",
    -               qh_pointid(qh, qh->GOODvertexp), facet->id);
    -            return;
    -          }else if (qh->GOODvertex > 0)
    -            qh_fprintf(qh, qh->ferr, 7065, "qhull warning: point p%d is not a vertex('QV%d').\n",
    -                qh->GOODvertex-1, qh->GOODvertex-1);
    -          else
    -            qh_fprintf(qh, qh->ferr, 7066, "qhull warning: point p%d is a vertex for every facet('QV-%d').\n",
    -                -qh->GOODvertex - 1, -qh->GOODvertex - 1);
    -        }
    -        facet->good= False;
    -      }
    -    }
    -  }
    -  startgood= numgood;
    -  if (qh->SPLITthresholds) {
    -    FORALLfacet_(facetlist) {
    -      if (facet->good) {
    -        if (!qh_inthresholds(qh, facet->normal, &angle)) {
    -          facet->good= False;
    -          numgood--;
    -          if (angle < bestangle) {
    -            bestangle= angle;
    -            bestfacet= facet;
    -          }
    -        }
    -      }
    -    }
    -    if (!numgood && bestfacet) {
    -      bestfacet->good= True;
    -      numgood++;
    -      trace0((qh, qh->ferr, 23, "qh_findgood_all: f%d is closest(%2.2g) to thresholds\n",
    -           bestfacet->id, bestangle));
    -      return;
    -    }
    -  }
    -  qh->num_good= numgood;
    -  trace0((qh, qh->ferr, 24, "qh_findgood_all: %d good facets remain out of %d facets\n",
    -        numgood, startgood));
    -} /* findgood_all */
    -
    -/*---------------------------------
    -
    -  qh_furthestnext()
    -    set qh.facet_next to facet with furthest of all furthest points
    -    searches all facets on qh.facet_list
    -
    -  notes:
    -    this may help avoid precision problems
    -*/
    -void qh_furthestnext(qhT *qh /* qh->facet_list */) {
    -  facetT *facet, *bestfacet= NULL;
    -  realT dist, bestdist= -REALmax;
    -
    -  FORALLfacets {
    -    if (facet->outsideset) {
    -#if qh_COMPUTEfurthest
    -      pointT *furthest;
    -      furthest= (pointT*)qh_setlast(facet->outsideset);
    -      zinc_(Zcomputefurthest);
    -      qh_distplane(qh, furthest, facet, &dist);
    -#else
    -      dist= facet->furthestdist;
    -#endif
    -      if (dist > bestdist) {
    -        bestfacet= facet;
    -        bestdist= dist;
    -      }
    -    }
    -  }
    -  if (bestfacet) {
    -    qh_removefacet(qh, bestfacet);
    -    qh_prependfacet(qh, bestfacet, &qh->facet_next);
    -    trace1((qh, qh->ferr, 1029, "qh_furthestnext: made f%d next facet(dist %.2g)\n",
    -            bestfacet->id, bestdist));
    -  }
    -} /* furthestnext */
    -
    -/*---------------------------------
    -
    -  qh_furthestout(qh, facet )
    -    make furthest outside point the last point of outsideset
    -
    -  returns:
    -    updates facet->outsideset
    -    clears facet->notfurthest
    -    sets facet->furthestdist
    -
    -  design:
    -    determine best point of outsideset
    -    make it the last point of outsideset
    -*/
    -void qh_furthestout(qhT *qh, facetT *facet) {
    -  pointT *point, **pointp, *bestpoint= NULL;
    -  realT dist, bestdist= -REALmax;
    -
    -  FOREACHpoint_(facet->outsideset) {
    -    qh_distplane(qh, point, facet, &dist);
    -    zinc_(Zcomputefurthest);
    -    if (dist > bestdist) {
    -      bestpoint= point;
    -      bestdist= dist;
    -    }
    -  }
    -  if (bestpoint) {
    -    qh_setdel(facet->outsideset, point);
    -    qh_setappend(qh, &facet->outsideset, point);
    -#if !qh_COMPUTEfurthest
    -    facet->furthestdist= bestdist;
    -#endif
    -  }
    -  facet->notfurthest= False;
    -  trace3((qh, qh->ferr, 3017, "qh_furthestout: p%d is furthest outside point of f%d\n",
    -          qh_pointid(qh, point), facet->id));
    -} /* furthestout */
    -
    -
    -/*---------------------------------
    -
    -  qh_infiniteloop(qh, facet )
    -    report infinite loop error due to facet
    -*/
    -void qh_infiniteloop(qhT *qh, facetT *facet) {
    -
    -  qh_fprintf(qh, qh->ferr, 6149, "qhull internal error (qh_infiniteloop): potential infinite loop detected\n");
    -  qh_errexit(qh, qh_ERRqhull, facet, NULL);
    -} /* qh_infiniteloop */
    -
    -/*---------------------------------
    -
    -  qh_initbuild()
    -    initialize hull and outside sets with point array
    -    qh.FIRSTpoint/qh.NUMpoints is point array
    -    if qh.GOODpoint
    -      adds qh.GOODpoint to initial hull
    -
    -  returns:
    -    qh_facetlist with initial hull
    -    points partioned into outside sets, coplanar sets, or inside
    -    initializes qh.GOODpointp, qh.GOODvertexp,
    -
    -  design:
    -    initialize global variables used during qh_buildhull
    -    determine precision constants and points with max/min coordinate values
    -      if qh.SCALElast, scale last coordinate(for 'd')
    -    build initial simplex
    -    partition input points into facets of initial simplex
    -    set up lists
    -    if qh.ONLYgood
    -      check consistency
    -      add qh.GOODvertex if defined
    -*/
    -void qh_initbuild(qhT *qh) {
    -  setT *maxpoints, *vertices;
    -  facetT *facet;
    -  int i, numpart;
    -  realT dist;
    -  boolT isoutside;
    -
    -  qh->furthest_id= qh_IDunknown;
    -  qh->lastreport= 0;
    -  qh->facet_id= qh->vertex_id= qh->ridge_id= 0;
    -  qh->visit_id= qh->vertex_visit= 0;
    -  qh->maxoutdone= False;
    -
    -  if (qh->GOODpoint > 0)
    -    qh->GOODpointp= qh_point(qh, qh->GOODpoint-1);
    -  else if (qh->GOODpoint < 0)
    -    qh->GOODpointp= qh_point(qh, -qh->GOODpoint-1);
    -  if (qh->GOODvertex > 0)
    -    qh->GOODvertexp= qh_point(qh, qh->GOODvertex-1);
    -  else if (qh->GOODvertex < 0)
    -    qh->GOODvertexp= qh_point(qh, -qh->GOODvertex-1);
    -  if ((qh->GOODpoint
    -       && (qh->GOODpointp < qh->first_point  /* also catches !GOODpointp */
    -           || qh->GOODpointp > qh_point(qh, qh->num_points-1)))
    -    || (qh->GOODvertex
    -        && (qh->GOODvertexp < qh->first_point  /* also catches !GOODvertexp */
    -            || qh->GOODvertexp > qh_point(qh, qh->num_points-1)))) {
    -    qh_fprintf(qh, qh->ferr, 6150, "qhull input error: either QGn or QVn point is > p%d\n",
    -             qh->num_points-1);
    -    qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -  }
    -  maxpoints= qh_maxmin(qh, qh->first_point, qh->num_points, qh->hull_dim);
    -  if (qh->SCALElast)
    -    qh_scalelast(qh, qh->first_point, qh->num_points, qh->hull_dim,
    -               qh->MINlastcoord, qh->MAXlastcoord, qh->MAXwidth);
    -  qh_detroundoff(qh);
    -  if (qh->DELAUNAY && qh->upper_threshold[qh->hull_dim-1] > REALmax/2
    -                  && qh->lower_threshold[qh->hull_dim-1] < -REALmax/2) {
    -    for (i=qh_PRINTEND; i--; ) {
    -      if (qh->PRINTout[i] == qh_PRINTgeom && qh->DROPdim < 0
    -          && !qh->GOODthreshold && !qh->SPLITthresholds)
    -        break;  /* in this case, don't set upper_threshold */
    -    }
    -    if (i < 0) {
    -      if (qh->UPPERdelaunay) { /* matches qh.upperdelaunay in qh_setfacetplane */
    -        qh->lower_threshold[qh->hull_dim-1]= qh->ANGLEround * qh_ZEROdelaunay;
    -        qh->GOODthreshold= True;
    -      }else {
    -        qh->upper_threshold[qh->hull_dim-1]= -qh->ANGLEround * qh_ZEROdelaunay;
    -        if (!qh->GOODthreshold)
    -          qh->SPLITthresholds= True; /* build upper-convex hull even if Qg */
    -          /* qh_initqhull_globals errors if Qg without Pdk/etc. */
    -      }
    -    }
    -  }
    -  vertices= qh_initialvertices(qh, qh->hull_dim, maxpoints, qh->first_point, qh->num_points);
    -  qh_initialhull(qh, vertices);  /* initial qh->facet_list */
    -  qh_partitionall(qh, vertices, qh->first_point, qh->num_points);
    -  if (qh->PRINToptions1st || qh->TRACElevel || qh->IStracing) {
    -    if (qh->TRACElevel || qh->IStracing)
    -      qh_fprintf(qh, qh->ferr, 8103, "\nTrace level %d for %s | %s\n",
    -         qh->IStracing ? qh->IStracing : qh->TRACElevel, qh->rbox_command, qh->qhull_command);
    -    qh_fprintf(qh, qh->ferr, 8104, "Options selected for Qhull %s:\n%s\n", qh_version, qh->qhull_options);
    -  }
    -  qh_resetlists(qh, False, qh_RESETvisible /*qh.visible_list newvertex_list newfacet_list */);
    -  qh->facet_next= qh->facet_list;
    -  qh_furthestnext(qh /* qh->facet_list */);
    -  if (qh->PREmerge) {
    -    qh->cos_max= qh->premerge_cos;
    -    qh->centrum_radius= qh->premerge_centrum;
    -  }
    -  if (qh->ONLYgood) {
    -    if (qh->GOODvertex > 0 && qh->MERGING) {
    -      qh_fprintf(qh, qh->ferr, 6151, "qhull input error: 'Qg QVn' (only good vertex) does not work with merging.\nUse 'QJ' to joggle the input or 'Q0' to turn off merging.\n");
    -      qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -    }
    -    if (!(qh->GOODthreshold || qh->GOODpoint
    -         || (!qh->MERGEexact && !qh->PREmerge && qh->GOODvertexp))) {
    -      qh_fprintf(qh, qh->ferr, 6152, "qhull input error: 'Qg' (ONLYgood) needs a good threshold('Pd0D0'), a\n\
    -good point(QGn or QG-n), or a good vertex with 'QJ' or 'Q0' (QVn).\n");
    -      qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -    }
    -    if (qh->GOODvertex > 0  && !qh->MERGING  /* matches qh_partitionall */
    -        && !qh_isvertex(qh->GOODvertexp, vertices)) {
    -      facet= qh_findbestnew(qh, qh->GOODvertexp, qh->facet_list,
    -                          &dist, !qh_ALL, &isoutside, &numpart);
    -      zadd_(Zdistgood, numpart);
    -      if (!isoutside) {
    -        qh_fprintf(qh, qh->ferr, 6153, "qhull input error: point for QV%d is inside initial simplex.  It can not be made a vertex.\n",
    -               qh_pointid(qh, qh->GOODvertexp));
    -        qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -      }
    -      if (!qh_addpoint(qh, qh->GOODvertexp, facet, False)) {
    -        qh_settempfree(qh, &vertices);
    -        qh_settempfree(qh, &maxpoints);
    -        return;
    -      }
    -    }
    -    qh_findgood(qh, qh->facet_list, 0);
    -  }
    -  qh_settempfree(qh, &vertices);
    -  qh_settempfree(qh, &maxpoints);
    -  trace1((qh, qh->ferr, 1030, "qh_initbuild: initial hull created and points partitioned\n"));
    -} /* initbuild */
    -
    -/*---------------------------------
    -
    -  qh_initialhull(qh, vertices )
    -    constructs the initial hull as a DIM3 simplex of vertices
    -
    -  design:
    -    creates a simplex (initializes lists)
    -    determines orientation of simplex
    -    sets hyperplanes for facets
    -    doubles checks orientation (in case of axis-parallel facets with Gaussian elimination)
    -    checks for flipped facets and qh.NARROWhull
    -    checks the result
    -*/
    -void qh_initialhull(qhT *qh, setT *vertices) {
    -  facetT *facet, *firstfacet, *neighbor, **neighborp;
    -  realT dist, angle, minangle= REALmax;
    -#ifndef qh_NOtrace
    -  int k;
    -#endif
    -
    -  qh_createsimplex(qh, vertices);  /* qh->facet_list */
    -  qh_resetlists(qh, False, qh_RESETvisible);
    -  qh->facet_next= qh->facet_list;      /* advance facet when processed */
    -  qh->interior_point= qh_getcenter(qh, vertices);
    -  firstfacet= qh->facet_list;
    -  qh_setfacetplane(qh, firstfacet);
    -  zinc_(Znumvisibility); /* needs to be in printsummary */
    -  qh_distplane(qh, qh->interior_point, firstfacet, &dist);
    -  if (dist > 0) {
    -    FORALLfacets
    -      facet->toporient ^= (unsigned char)True;
    -  }
    -  FORALLfacets
    -    qh_setfacetplane(qh, facet);
    -  FORALLfacets {
    -    if (!qh_checkflipped(qh, facet, NULL, qh_ALL)) {/* due to axis-parallel facet */
    -      trace1((qh, qh->ferr, 1031, "qh_initialhull: initial orientation incorrect.  Correct all facets\n"));
    -      facet->flipped= False;
    -      FORALLfacets {
    -        facet->toporient ^= (unsigned char)True;
    -        qh_orientoutside(qh, facet);
    -      }
    -      break;
    -    }
    -  }
    -  FORALLfacets {
    -    if (!qh_checkflipped(qh, facet, NULL, !qh_ALL)) {  /* can happen with 'R0.1' */
    -      if (qh->DELAUNAY && ! qh->ATinfinity) {
    -        if (qh->UPPERdelaunay)
    -          qh_fprintf(qh, qh->ferr, 6240, "Qhull precision error: Initial simplex is cocircular or cospherical.  Option 'Qs' searches all points.  Can not compute the upper Delaunay triangulation or upper Voronoi diagram of cocircular/cospherical points.\n");
    -        else
    -          qh_fprintf(qh, qh->ferr, 6239, "Qhull precision error: Initial simplex is cocircular or cospherical.  Use option 'Qz' for the Delaunay triangulation or Voronoi diagram of cocircular/cospherical points.  Option 'Qz' adds a point \"at infinity\".  Use option 'Qs' to search all points for the initial simplex.\n");
    -        qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -      }
    -      qh_precision(qh, "initial simplex is flat");
    -      qh_fprintf(qh, qh->ferr, 6154, "Qhull precision error: Initial simplex is flat (facet %d is coplanar with the interior point)\n",
    -                   facet->id);
    -      qh_errexit(qh, qh_ERRsingular, NULL, NULL);  /* calls qh_printhelp_singular */
    -    }
    -    FOREACHneighbor_(facet) {
    -      angle= qh_getangle(qh, facet->normal, neighbor->normal);
    -      minimize_( minangle, angle);
    -    }
    -  }
    -  if (minangle < qh_MAXnarrow && !qh->NOnarrow) {
    -    realT diff= 1.0 + minangle;
    -
    -    qh->NARROWhull= True;
    -    qh_option(qh, "_narrow-hull", NULL, &diff);
    -    if (minangle < qh_WARNnarrow && !qh->RERUN && qh->PRINTprecision)
    -      qh_printhelp_narrowhull(qh, qh->ferr, minangle);
    -  }
    -  zzval_(Zprocessed)= qh->hull_dim+1;
    -  qh_checkpolygon(qh, qh->facet_list);
    -  qh_checkconvex(qh, qh->facet_list,   qh_DATAfault);
    -#ifndef qh_NOtrace
    -  if (qh->IStracing >= 1) {
    -    qh_fprintf(qh, qh->ferr, 8105, "qh_initialhull: simplex constructed, interior point:");
    -    for (k=0; k < qh->hull_dim; k++)
    -      qh_fprintf(qh, qh->ferr, 8106, " %6.4g", qh->interior_point[k]);
    -    qh_fprintf(qh, qh->ferr, 8107, "\n");
    -  }
    -#endif
    -} /* initialhull */
    -
    -/*---------------------------------
    -
    -  qh_initialvertices(qh, dim, maxpoints, points, numpoints )
    -    determines a non-singular set of initial vertices
    -    maxpoints may include duplicate points
    -
    -  returns:
    -    temporary set of dim+1 vertices in descending order by vertex id
    -    if qh.RANDOMoutside && !qh.ALLpoints
    -      picks random points
    -    if dim >= qh_INITIALmax,
    -      uses min/max x and max points with non-zero determinants
    -
    -  notes:
    -    unless qh.ALLpoints,
    -      uses maxpoints as long as determinate is non-zero
    -*/
    -setT *qh_initialvertices(qhT *qh, int dim, setT *maxpoints, pointT *points, int numpoints) {
    -  pointT *point, **pointp;
    -  setT *vertices, *simplex, *tested;
    -  realT randr;
    -  int idx, point_i, point_n, k;
    -  boolT nearzero= False;
    -
    -  vertices= qh_settemp(qh, dim + 1);
    -  simplex= qh_settemp(qh, dim+1);
    -  if (qh->ALLpoints)
    -    qh_maxsimplex(qh, dim, NULL, points, numpoints, &simplex);
    -  else if (qh->RANDOMoutside) {
    -    while (qh_setsize(qh, simplex) != dim+1) {
    -      randr= qh_RANDOMint;
    -      randr= randr/(qh_RANDOMmax+1);
    -      idx= (int)floor(qh->num_points * randr);
    -      while (qh_setin(simplex, qh_point(qh, idx))) {
    -            idx++; /* in case qh_RANDOMint always returns the same value */
    -        idx= idx < qh->num_points ? idx : 0;
    -      }
    -      qh_setappend(qh, &simplex, qh_point(qh, idx));
    -    }
    -  }else if (qh->hull_dim >= qh_INITIALmax) {
    -    tested= qh_settemp(qh, dim+1);
    -    qh_setappend(qh, &simplex, SETfirst_(maxpoints));   /* max and min X coord */
    -    qh_setappend(qh, &simplex, SETsecond_(maxpoints));
    -    qh_maxsimplex(qh, fmin_(qh_INITIALsearch, dim), maxpoints, points, numpoints, &simplex);
    -    k= qh_setsize(qh, simplex);
    -    FOREACHpoint_i_(qh, maxpoints) {
    -      if (point_i & 0x1) {     /* first pick up max. coord. points */
    -        if (!qh_setin(simplex, point) && !qh_setin(tested, point)){
    -          qh_detsimplex(qh, point, simplex, k, &nearzero);
    -          if (nearzero)
    -            qh_setappend(qh, &tested, point);
    -          else {
    -            qh_setappend(qh, &simplex, point);
    -            if (++k == dim)  /* use search for last point */
    -              break;
    -          }
    -        }
    -      }
    -    }
    -    while (k != dim && (point= (pointT*)qh_setdellast(maxpoints))) {
    -      if (!qh_setin(simplex, point) && !qh_setin(tested, point)){
    -        qh_detsimplex(qh, point, simplex, k, &nearzero);
    -        if (nearzero)
    -          qh_setappend(qh, &tested, point);
    -        else {
    -          qh_setappend(qh, &simplex, point);
    -          k++;
    -        }
    -      }
    -    }
    -    idx= 0;
    -    while (k != dim && (point= qh_point(qh, idx++))) {
    -      if (!qh_setin(simplex, point) && !qh_setin(tested, point)){
    -        qh_detsimplex(qh, point, simplex, k, &nearzero);
    -        if (!nearzero){
    -          qh_setappend(qh, &simplex, point);
    -          k++;
    -        }
    -      }
    -    }
    -    qh_settempfree(qh, &tested);
    -    qh_maxsimplex(qh, dim, maxpoints, points, numpoints, &simplex);
    -  }else
    -    qh_maxsimplex(qh, dim, maxpoints, points, numpoints, &simplex);
    -  FOREACHpoint_(simplex)
    -    qh_setaddnth(qh, &vertices, 0, qh_newvertex(qh, point)); /* descending order */
    -  qh_settempfree(qh, &simplex);
    -  return vertices;
    -} /* initialvertices */
    -
    -
    -/*---------------------------------
    -
    -  qh_isvertex( point, vertices )
    -    returns vertex if point is in vertex set, else returns NULL
    -
    -  notes:
    -    for qh.GOODvertex
    -*/
    -vertexT *qh_isvertex(pointT *point, setT *vertices) {
    -  vertexT *vertex, **vertexp;
    -
    -  FOREACHvertex_(vertices) {
    -    if (vertex->point == point)
    -      return vertex;
    -  }
    -  return NULL;
    -} /* isvertex */
    -
    -/*---------------------------------
    -
    -  qh_makenewfacets(qh, point )
    -    make new facets from point and qh.visible_list
    -
    -  returns:
    -    qh.newfacet_list= list of new facets with hyperplanes and ->newfacet
    -    qh.newvertex_list= list of vertices in new facets with ->newlist set
    -
    -    if (qh.ONLYgood)
    -      newfacets reference horizon facets, but not vice versa
    -      ridges reference non-simplicial horizon ridges, but not vice versa
    -      does not change existing facets
    -    else
    -      sets qh.NEWfacets
    -      new facets attached to horizon facets and ridges
    -      for visible facets,
    -        visible->r.replace is corresponding new facet
    -
    -  see also:
    -    qh_makenewplanes() -- make hyperplanes for facets
    -    qh_attachnewfacets() -- attachnewfacets if not done here(qh->ONLYgood)
    -    qh_matchnewfacets() -- match up neighbors
    -    qh_updatevertices() -- update vertex neighbors and delvertices
    -    qh_deletevisible() -- delete visible facets
    -    qh_checkpolygon() --check the result
    -    qh_triangulate() -- triangulate a non-simplicial facet
    -
    -  design:
    -    for each visible facet
    -      make new facets to its horizon facets
    -      update its f.replace
    -      clear its neighbor set
    -*/
    -vertexT *qh_makenewfacets(qhT *qh, pointT *point /*visible_list*/) {
    -  facetT *visible, *newfacet= NULL, *newfacet2= NULL, *neighbor, **neighborp;
    -  vertexT *apex;
    -  int numnew=0;
    -
    -  qh->newfacet_list= qh->facet_tail;
    -  qh->newvertex_list= qh->vertex_tail;
    -  apex= qh_newvertex(qh, point);
    -  qh_appendvertex(qh, apex);
    -  qh->visit_id++;
    -  if (!qh->ONLYgood)
    -    qh->NEWfacets= True;
    -  FORALLvisible_facets {
    -    FOREACHneighbor_(visible)
    -      neighbor->seen= False;
    -    if (visible->ridges) {
    -      visible->visitid= qh->visit_id;
    -      newfacet2= qh_makenew_nonsimplicial(qh, visible, apex, &numnew);
    -    }
    -    if (visible->simplicial)
    -      newfacet= qh_makenew_simplicial(qh, visible, apex, &numnew);
    -    if (!qh->ONLYgood) {
    -      if (newfacet2)  /* newfacet is null if all ridges defined */
    -        newfacet= newfacet2;
    -      if (newfacet)
    -        visible->f.replace= newfacet;
    -      else
    -        zinc_(Zinsidevisible);
    -      SETfirst_(visible->neighbors)= NULL;
    -    }
    -  }
    -  trace1((qh, qh->ferr, 1032, "qh_makenewfacets: created %d new facets from point p%d to horizon\n",
    -          numnew, qh_pointid(qh, point)));
    -  if (qh->IStracing >= 4)
    -    qh_printfacetlist(qh, qh->newfacet_list, NULL, qh_ALL);
    -  return apex;
    -} /* makenewfacets */
    -
    -/*---------------------------------
    -
    -  qh_matchduplicates(qh, atfacet, atskip, hashsize, hashcount )
    -    match duplicate ridges in qh.hash_table for atfacet/atskip
    -    duplicates marked with ->dupridge and qh_DUPLICATEridge
    -
    -  returns:
    -    picks match with worst merge (min distance apart)
    -    updates hashcount
    -
    -  see also:
    -    qh_matchneighbor
    -
    -  notes:
    -
    -  design:
    -    compute hash value for atfacet and atskip
    -    repeat twice -- once to make best matches, once to match the rest
    -      for each possible facet in qh.hash_table
    -        if it is a matching facet and pass 2
    -          make match
    -          unless tricoplanar, mark match for merging (qh_MERGEridge)
    -          [e.g., tricoplanar RBOX s 1000 t993602376 | QHULL C-1e-3 d Qbb FA Qt]
    -        if it is a matching facet and pass 1
    -          test if this is a better match
    -      if pass 1,
    -        make best match (it will not be merged)
    -*/
    -#ifndef qh_NOmerge
    -void qh_matchduplicates(qhT *qh, facetT *atfacet, int atskip, int hashsize, int *hashcount) {
    -  boolT same, ismatch;
    -  int hash, scan;
    -  facetT *facet, *newfacet, *maxmatch= NULL, *maxmatch2= NULL, *nextfacet;
    -  int skip, newskip, nextskip= 0, maxskip= 0, maxskip2= 0, makematch;
    -  realT maxdist= -REALmax, mindist, dist2, low, high;
    -
    -  hash= qh_gethash(qh, hashsize, atfacet->vertices, qh->hull_dim, 1,
    -                     SETelem_(atfacet->vertices, atskip));
    -  trace2((qh, qh->ferr, 2046, "qh_matchduplicates: find duplicate matches for f%d skip %d hash %d hashcount %d\n",
    -          atfacet->id, atskip, hash, *hashcount));
    -  for (makematch= 0; makematch < 2; makematch++) {
    -    qh->visit_id++;
    -    for (newfacet= atfacet, newskip= atskip; newfacet; newfacet= nextfacet, newskip= nextskip) {
    -      zinc_(Zhashlookup);
    -      nextfacet= NULL;
    -      newfacet->visitid= qh->visit_id;
    -      for (scan= hash; (facet= SETelemt_(qh->hash_table, scan, facetT));
    -           scan= (++scan >= hashsize ? 0 : scan)) {
    -        if (!facet->dupridge || facet->visitid == qh->visit_id)
    -          continue;
    -        zinc_(Zhashtests);
    -        if (qh_matchvertices(qh, 1, newfacet->vertices, newskip, facet->vertices, &skip, &same)) {
    -          ismatch= (same == (boolT)(newfacet->toporient ^ facet->toporient));
    -          if (SETelemt_(facet->neighbors, skip, facetT) != qh_DUPLICATEridge) {
    -            if (!makematch) {
    -              qh_fprintf(qh, qh->ferr, 6155, "qhull internal error (qh_matchduplicates): missing dupridge at f%d skip %d for new f%d skip %d hash %d\n",
    -                     facet->id, skip, newfacet->id, newskip, hash);
    -              qh_errexit2(qh, qh_ERRqhull, facet, newfacet);
    -            }
    -          }else if (ismatch && makematch) {
    -            if (SETelemt_(newfacet->neighbors, newskip, facetT) == qh_DUPLICATEridge) {
    -              SETelem_(facet->neighbors, skip)= newfacet;
    -              if (newfacet->tricoplanar)
    -                SETelem_(newfacet->neighbors, newskip)= facet;
    -              else
    -                SETelem_(newfacet->neighbors, newskip)= qh_MERGEridge;
    -              *hashcount -= 2; /* removed two unmatched facets */
    -              trace4((qh, qh->ferr, 4059, "qh_matchduplicates: duplicate f%d skip %d matched with new f%d skip %d merge\n",
    -                    facet->id, skip, newfacet->id, newskip));
    -            }
    -          }else if (ismatch) {
    -            mindist= qh_getdistance(qh, facet, newfacet, &low, &high);
    -            dist2= qh_getdistance(qh, newfacet, facet, &low, &high);
    -            minimize_(mindist, dist2);
    -            if (mindist > maxdist) {
    -              maxdist= mindist;
    -              maxmatch= facet;
    -              maxskip= skip;
    -              maxmatch2= newfacet;
    -              maxskip2= newskip;
    -            }
    -            trace3((qh, qh->ferr, 3018, "qh_matchduplicates: duplicate f%d skip %d new f%d skip %d at dist %2.2g, max is now f%d f%d\n",
    -                    facet->id, skip, newfacet->id, newskip, mindist,
    -                    maxmatch->id, maxmatch2->id));
    -          }else { /* !ismatch */
    -            nextfacet= facet;
    -            nextskip= skip;
    -          }
    -        }
    -        if (makematch && !facet
    -        && SETelemt_(facet->neighbors, skip, facetT) == qh_DUPLICATEridge) {
    -          qh_fprintf(qh, qh->ferr, 6156, "qhull internal error (qh_matchduplicates): no MERGEridge match for duplicate f%d skip %d at hash %d\n",
    -                     newfacet->id, newskip, hash);
    -          qh_errexit(qh, qh_ERRqhull, newfacet, NULL);
    -        }
    -      }
    -    } /* end of for each new facet at hash */
    -    if (!makematch) {
    -      if (!maxmatch) {
    -        qh_fprintf(qh, qh->ferr, 6157, "qhull internal error (qh_matchduplicates): no maximum match at duplicate f%d skip %d at hash %d\n",
    -                     atfacet->id, atskip, hash);
    -        qh_errexit(qh, qh_ERRqhull, atfacet, NULL);
    -      }
    -      SETelem_(maxmatch->neighbors, maxskip)= maxmatch2; /* maxmatch!=0 by QH6157 */
    -      SETelem_(maxmatch2->neighbors, maxskip2)= maxmatch;
    -      *hashcount -= 2; /* removed two unmatched facets */
    -      zzinc_(Zmultiridge);
    -      trace0((qh, qh->ferr, 25, "qh_matchduplicates: duplicate f%d skip %d matched with new f%d skip %d keep\n",
    -              maxmatch->id, maxskip, maxmatch2->id, maxskip2));
    -      qh_precision(qh, "ridge with multiple neighbors");
    -      if (qh->IStracing >= 4)
    -        qh_errprint(qh, "DUPLICATED/MATCH", maxmatch, maxmatch2, NULL, NULL);
    -    }
    -  }
    -} /* matchduplicates */
    -
    -/*---------------------------------
    -
    -  qh_nearcoplanar()
    -    for all facets, remove near-inside points from facet->coplanarset
    -    coplanar points defined by innerplane from qh_outerinner()
    -
    -  returns:
    -    if qh->KEEPcoplanar && !qh->KEEPinside
    -      facet->coplanarset only contains coplanar points
    -    if qh.JOGGLEmax
    -      drops inner plane by another qh.JOGGLEmax diagonal since a
    -        vertex could shift out while a coplanar point shifts in
    -
    -  notes:
    -    used for qh.PREmerge and qh.JOGGLEmax
    -    must agree with computation of qh.NEARcoplanar in qh_detroundoff(qh)
    -  design:
    -    if not keeping coplanar or inside points
    -      free all coplanar sets
    -    else if not keeping both coplanar and inside points
    -      remove !coplanar or !inside points from coplanar sets
    -*/
    -void qh_nearcoplanar(qhT *qh /* qh.facet_list */) {
    -  facetT *facet;
    -  pointT *point, **pointp;
    -  int numpart;
    -  realT dist, innerplane;
    -
    -  if (!qh->KEEPcoplanar && !qh->KEEPinside) {
    -    FORALLfacets {
    -      if (facet->coplanarset)
    -        qh_setfree(qh, &facet->coplanarset);
    -    }
    -  }else if (!qh->KEEPcoplanar || !qh->KEEPinside) {
    -    qh_outerinner(qh, NULL, NULL, &innerplane);
    -    if (qh->JOGGLEmax < REALmax/2)
    -      innerplane -= qh->JOGGLEmax * sqrt((realT)qh->hull_dim);
    -    numpart= 0;
    -    FORALLfacets {
    -      if (facet->coplanarset) {
    -        FOREACHpoint_(facet->coplanarset) {
    -          numpart++;
    -          qh_distplane(qh, point, facet, &dist);
    -          if (dist < innerplane) {
    -            if (!qh->KEEPinside)
    -              SETref_(point)= NULL;
    -          }else if (!qh->KEEPcoplanar)
    -            SETref_(point)= NULL;
    -        }
    -        qh_setcompact(qh, facet->coplanarset);
    -      }
    -    }
    -    zzadd_(Zcheckpart, numpart);
    -  }
    -} /* nearcoplanar */
    -
    -/*---------------------------------
    -
    -  qh_nearvertex(qh, facet, point, bestdist )
    -    return nearest vertex in facet to point
    -
    -  returns:
    -    vertex and its distance
    -
    -  notes:
    -    if qh.DELAUNAY
    -      distance is measured in the input set
    -    searches neighboring tricoplanar facets (requires vertexneighbors)
    -      Slow implementation.  Recomputes vertex set for each point.
    -    The vertex set could be stored in the qh.keepcentrum facet.
    -*/
    -vertexT *qh_nearvertex(qhT *qh, facetT *facet, pointT *point, realT *bestdistp) {
    -  realT bestdist= REALmax, dist;
    -  vertexT *bestvertex= NULL, *vertex, **vertexp, *apex;
    -  coordT *center;
    -  facetT *neighbor, **neighborp;
    -  setT *vertices;
    -  int dim= qh->hull_dim;
    -
    -  if (qh->DELAUNAY)
    -    dim--;
    -  if (facet->tricoplanar) {
    -    if (!qh->VERTEXneighbors || !facet->center) {
    -      qh_fprintf(qh, qh->ferr, 6158, "qhull internal error (qh_nearvertex): qh.VERTEXneighbors and facet->center required for tricoplanar facets\n");
    -      qh_errexit(qh, qh_ERRqhull, facet, NULL);
    -    }
    -    vertices= qh_settemp(qh, qh->TEMPsize);
    -    apex= SETfirstt_(facet->vertices, vertexT);
    -    center= facet->center;
    -    FOREACHneighbor_(apex) {
    -      if (neighbor->center == center) {
    -        FOREACHvertex_(neighbor->vertices)
    -          qh_setappend(qh, &vertices, vertex);
    -      }
    -    }
    -  }else
    -    vertices= facet->vertices;
    -  FOREACHvertex_(vertices) {
    -    dist= qh_pointdist(vertex->point, point, -dim);
    -    if (dist < bestdist) {
    -      bestdist= dist;
    -      bestvertex= vertex;
    -    }
    -  }
    -  if (facet->tricoplanar)
    -    qh_settempfree(qh, &vertices);
    -  *bestdistp= sqrt(bestdist);
    -  if (!bestvertex) {
    -      qh_fprintf(qh, qh->ferr, 6261, "qhull internal error (qh_nearvertex): did not find bestvertex for f%d p%d\n", facet->id, qh_pointid(qh, point));
    -      qh_errexit(qh, qh_ERRqhull, facet, NULL);
    -  }
    -  trace3((qh, qh->ferr, 3019, "qh_nearvertex: v%d dist %2.2g for f%d p%d\n",
    -        bestvertex->id, *bestdistp, facet->id, qh_pointid(qh, point))); /* bestvertex!=0 by QH2161 */
    -  return bestvertex;
    -} /* nearvertex */
    -
    -/*---------------------------------
    -
    -  qh_newhashtable(qh, newsize )
    -    returns size of qh.hash_table of at least newsize slots
    -
    -  notes:
    -    assumes qh.hash_table is NULL
    -    qh_HASHfactor determines the number of extra slots
    -    size is not divisible by 2, 3, or 5
    -*/
    -int qh_newhashtable(qhT *qh, int newsize) {
    -  int size;
    -
    -  size= ((newsize+1)*qh_HASHfactor) | 0x1;  /* odd number */
    -  while (True) {
    -    if (newsize<0 || size<0) {
    -        qh_fprintf(qh, qh->qhmem.ferr, 6236, "qhull error (qh_newhashtable): negative request (%d) or size (%d).  Did int overflow due to high-D?\n", newsize, size); /* WARN64 */
    -        qh_errexit(qh, qhmem_ERRmem, NULL, NULL);
    -    }
    -    if ((size%3) && (size%5))
    -      break;
    -    size += 2;
    -    /* loop terminates because there is an infinite number of primes */
    -  }
    -  qh->hash_table= qh_setnew(qh, size);
    -  qh_setzero(qh, qh->hash_table, 0, size);
    -  return size;
    -} /* newhashtable */
    -
    -/*---------------------------------
    -
    -  qh_newvertex(qh, point )
    -    returns a new vertex for point
    -*/
    -vertexT *qh_newvertex(qhT *qh, pointT *point) {
    -  vertexT *vertex;
    -
    -  zinc_(Ztotvertices);
    -  vertex= (vertexT *)qh_memalloc(qh, (int)sizeof(vertexT));
    -  memset((char *) vertex, (size_t)0, sizeof(vertexT));
    -  if (qh->vertex_id == UINT_MAX) {
    -    qh_memfree(qh, vertex, (int)sizeof(vertexT));
    -    qh_fprintf(qh, qh->ferr, 6159, "qhull error: more than 2^32 vertices.  vertexT.id field overflows.  Vertices would not be sorted correctly.\n");
    -    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -  }
    -  if (qh->vertex_id == qh->tracevertex_id)
    -    qh->tracevertex= vertex;
    -  vertex->id= qh->vertex_id++;
    -  vertex->point= point;
    -  trace4((qh, qh->ferr, 4060, "qh_newvertex: vertex p%d(v%d) created\n", qh_pointid(qh, vertex->point),
    -          vertex->id));
    -  return(vertex);
    -} /* newvertex */
    -
    -/*---------------------------------
    -
    -  qh_nextridge3d( atridge, facet, vertex )
    -    return next ridge and vertex for a 3d facet
    -    returns NULL on error
    -    [for QhullFacet::nextRidge3d] Does not call qh_errexit nor access qhT.
    -
    -  notes:
    -    in qh_ORIENTclock order
    -    this is a O(n^2) implementation to trace all ridges
    -    be sure to stop on any 2nd visit
    -    same as QhullRidge::nextRidge3d
    -    does not use qhT or qh_errexit [QhullFacet.cpp]
    -
    -  design:
    -    for each ridge
    -      exit if it is the ridge after atridge
    -*/
    -ridgeT *qh_nextridge3d(ridgeT *atridge, facetT *facet, vertexT **vertexp) {
    -  vertexT *atvertex, *vertex, *othervertex;
    -  ridgeT *ridge, **ridgep;
    -
    -  if ((atridge->top == facet) ^ qh_ORIENTclock)
    -    atvertex= SETsecondt_(atridge->vertices, vertexT);
    -  else
    -    atvertex= SETfirstt_(atridge->vertices, vertexT);
    -  FOREACHridge_(facet->ridges) {
    -    if (ridge == atridge)
    -      continue;
    -    if ((ridge->top == facet) ^ qh_ORIENTclock) {
    -      othervertex= SETsecondt_(ridge->vertices, vertexT);
    -      vertex= SETfirstt_(ridge->vertices, vertexT);
    -    }else {
    -      vertex= SETsecondt_(ridge->vertices, vertexT);
    -      othervertex= SETfirstt_(ridge->vertices, vertexT);
    -    }
    -    if (vertex == atvertex) {
    -      if (vertexp)
    -        *vertexp= othervertex;
    -      return ridge;
    -    }
    -  }
    -  return NULL;
    -} /* nextridge3d */
    -#else /* qh_NOmerge */
    -void qh_matchduplicates(qhT *qh, facetT *atfacet, int atskip, int hashsize, int *hashcount) {
    -}
    -ridgeT *qh_nextridge3d(ridgeT *atridge, facetT *facet, vertexT **vertexp) {
    -
    -  return NULL;
    -}
    -#endif /* qh_NOmerge */
    -
    -/*---------------------------------
    -
    -  qh_outcoplanar()
    -    move points from all facets' outsidesets to their coplanarsets
    -
    -  notes:
    -    for post-processing under qh.NARROWhull
    -
    -  design:
    -    for each facet
    -      for each outside point for facet
    -        partition point into coplanar set
    -*/
    -void qh_outcoplanar(qhT *qh /* facet_list */) {
    -  pointT *point, **pointp;
    -  facetT *facet;
    -  realT dist;
    -
    -  trace1((qh, qh->ferr, 1033, "qh_outcoplanar: move outsideset to coplanarset for qh->NARROWhull\n"));
    -  FORALLfacets {
    -    FOREACHpoint_(facet->outsideset) {
    -      qh->num_outside--;
    -      if (qh->KEEPcoplanar || qh->KEEPnearinside) {
    -        qh_distplane(qh, point, facet, &dist);
    -        zinc_(Zpartition);
    -        qh_partitioncoplanar(qh, point, facet, &dist);
    -      }
    -    }
    -    qh_setfree(qh, &facet->outsideset);
    -  }
    -} /* outcoplanar */
    -
    -/*---------------------------------
    -
    -  qh_point(qh, id )
    -    return point for a point id, or NULL if unknown
    -
    -  alternative code:
    -    return((pointT *)((unsigned   long)qh.first_point
    -           + (unsigned long)((id)*qh.normal_size)));
    -*/
    -pointT *qh_point(qhT *qh, int id) {
    -
    -  if (id < 0)
    -    return NULL;
    -  if (id < qh->num_points)
    -    return qh->first_point + id * qh->hull_dim;
    -  id -= qh->num_points;
    -  if (id < qh_setsize(qh, qh->other_points))
    -    return SETelemt_(qh->other_points, id, pointT);
    -  return NULL;
    -} /* point */
    -
    -/*---------------------------------
    -
    -  qh_point_add(qh, set, point, elem )
    -    stores elem at set[point.id]
    -
    -  returns:
    -    access function for qh_pointfacet and qh_pointvertex
    -
    -  notes:
    -    checks point.id
    -*/
    -void qh_point_add(qhT *qh, setT *set, pointT *point, void *elem) {
    -  int id, size;
    -
    -  SETreturnsize_(set, size);
    -  if ((id= qh_pointid(qh, point)) < 0)
    -    qh_fprintf(qh, qh->ferr, 7067, "qhull internal warning (point_add): unknown point %p id %d\n",
    -      point, id);
    -  else if (id >= size) {
    -    qh_fprintf(qh, qh->ferr, 6160, "qhull internal errror(point_add): point p%d is out of bounds(%d)\n",
    -             id, size);
    -    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -  }else
    -    SETelem_(set, id)= elem;
    -} /* point_add */
    -
    -
    -/*---------------------------------
    -
    -  qh_pointfacet()
    -    return temporary set of facet for each point
    -    the set is indexed by point id
    -
    -  notes:
    -    vertices assigned to one of the facets
    -    coplanarset assigned to the facet
    -    outside set assigned to the facet
    -    NULL if no facet for point (inside)
    -      includes qh.GOODpointp
    -
    -  access:
    -    FOREACHfacet_i_(qh, facets) { ... }
    -    SETelem_(facets, i)
    -
    -  design:
    -    for each facet
    -      add each vertex
    -      add each coplanar point
    -      add each outside point
    -*/
    -setT *qh_pointfacet(qhT *qh /*qh.facet_list*/) {
    -  int numpoints= qh->num_points + qh_setsize(qh, qh->other_points);
    -  setT *facets;
    -  facetT *facet;
    -  vertexT *vertex, **vertexp;
    -  pointT *point, **pointp;
    -
    -  facets= qh_settemp(qh, numpoints);
    -  qh_setzero(qh, facets, 0, numpoints);
    -  qh->vertex_visit++;
    -  FORALLfacets {
    -    FOREACHvertex_(facet->vertices) {
    -      if (vertex->visitid != qh->vertex_visit) {
    -        vertex->visitid= qh->vertex_visit;
    -        qh_point_add(qh, facets, vertex->point, facet);
    -      }
    -    }
    -    FOREACHpoint_(facet->coplanarset)
    -      qh_point_add(qh, facets, point, facet);
    -    FOREACHpoint_(facet->outsideset)
    -      qh_point_add(qh, facets, point, facet);
    -  }
    -  return facets;
    -} /* pointfacet */
    -
    -/*---------------------------------
    -
    -  qh_pointvertex(qh, )
    -    return temporary set of vertices indexed by point id
    -    entry is NULL if no vertex for a point
    -      this will include qh.GOODpointp
    -
    -  access:
    -    FOREACHvertex_i_(qh, vertices) { ... }
    -    SETelem_(vertices, i)
    -*/
    -setT *qh_pointvertex(qhT *qh /*qh.facet_list*/) {
    -  int numpoints= qh->num_points + qh_setsize(qh, qh->other_points);
    -  setT *vertices;
    -  vertexT *vertex;
    -
    -  vertices= qh_settemp(qh, numpoints);
    -  qh_setzero(qh, vertices, 0, numpoints);
    -  FORALLvertices
    -    qh_point_add(qh, vertices, vertex->point, vertex);
    -  return vertices;
    -} /* pointvertex */
    -
    -
    -/*---------------------------------
    -
    -  qh_prependfacet(qh, facet, facetlist )
    -    prepend facet to the start of a facetlist
    -
    -  returns:
    -    increments qh.numfacets
    -    updates facetlist, qh.facet_list, facet_next
    -
    -  notes:
    -    be careful of prepending since it can lose a pointer.
    -      e.g., can lose _next by deleting and then prepending before _next
    -*/
    -void qh_prependfacet(qhT *qh, facetT *facet, facetT **facetlist) {
    -  facetT *prevfacet, *list;
    -
    -
    -  trace4((qh, qh->ferr, 4061, "qh_prependfacet: prepend f%d before f%d\n",
    -          facet->id, getid_(*facetlist)));
    -  if (!*facetlist)
    -    (*facetlist)= qh->facet_tail;
    -  list= *facetlist;
    -  prevfacet= list->previous;
    -  facet->previous= prevfacet;
    -  if (prevfacet)
    -    prevfacet->next= facet;
    -  list->previous= facet;
    -  facet->next= *facetlist;
    -  if (qh->facet_list == list)  /* this may change *facetlist */
    -    qh->facet_list= facet;
    -  if (qh->facet_next == list)
    -    qh->facet_next= facet;
    -  *facetlist= facet;
    -  qh->num_facets++;
    -} /* prependfacet */
    -
    -
    -/*---------------------------------
    -
    -  qh_printhashtable(qh, fp )
    -    print hash table to fp
    -
    -  notes:
    -    not in I/O to avoid bringing io_r.c in
    -
    -  design:
    -    for each hash entry
    -      if defined
    -        if unmatched or will merge (NULL, qh_MERGEridge, qh_DUPLICATEridge)
    -          print entry and neighbors
    -*/
    -void qh_printhashtable(qhT *qh, FILE *fp) {
    -  facetT *facet, *neighbor;
    -  int id, facet_i, facet_n, neighbor_i= 0, neighbor_n= 0;
    -  vertexT *vertex, **vertexp;
    -
    -  FOREACHfacet_i_(qh, qh->hash_table) {
    -    if (facet) {
    -      FOREACHneighbor_i_(qh, facet) {
    -        if (!neighbor || neighbor == qh_MERGEridge || neighbor == qh_DUPLICATEridge)
    -          break;
    -      }
    -      if (neighbor_i == neighbor_n)
    -        continue;
    -      qh_fprintf(qh, fp, 9283, "hash %d f%d ", facet_i, facet->id);
    -      FOREACHvertex_(facet->vertices)
    -        qh_fprintf(qh, fp, 9284, "v%d ", vertex->id);
    -      qh_fprintf(qh, fp, 9285, "\n neighbors:");
    -      FOREACHneighbor_i_(qh, facet) {
    -        if (neighbor == qh_MERGEridge)
    -          id= -3;
    -        else if (neighbor == qh_DUPLICATEridge)
    -          id= -2;
    -        else
    -          id= getid_(neighbor);
    -        qh_fprintf(qh, fp, 9286, " %d", id);
    -      }
    -      qh_fprintf(qh, fp, 9287, "\n");
    -    }
    -  }
    -} /* printhashtable */
    -
    -
    -/*---------------------------------
    -
    -  qh_printlists(qh, fp )
    -    print out facet and vertex list for debugging (without 'f/v' tags)
    -*/
    -void qh_printlists(qhT *qh) {
    -  facetT *facet;
    -  vertexT *vertex;
    -  int count= 0;
    -
    -  qh_fprintf(qh, qh->ferr, 8108, "qh_printlists: facets:");
    -  FORALLfacets {
    -    if (++count % 100 == 0)
    -      qh_fprintf(qh, qh->ferr, 8109, "\n     ");
    -    qh_fprintf(qh, qh->ferr, 8110, " %d", facet->id);
    -  }
    -  qh_fprintf(qh, qh->ferr, 8111, "\n  new facets %d visible facets %d next facet for qh_addpoint %d\n  vertices(new %d):",
    -     getid_(qh->newfacet_list), getid_(qh->visible_list), getid_(qh->facet_next),
    -     getid_(qh->newvertex_list));
    -  count = 0;
    -  FORALLvertices {
    -    if (++count % 100 == 0)
    -      qh_fprintf(qh, qh->ferr, 8112, "\n     ");
    -    qh_fprintf(qh, qh->ferr, 8113, " %d", vertex->id);
    -  }
    -  qh_fprintf(qh, qh->ferr, 8114, "\n");
    -} /* printlists */
    -
    -/*---------------------------------
    -
    -  qh_resetlists(qh, stats, qh_RESETvisible )
    -    reset newvertex_list, newfacet_list, visible_list
    -    if stats,
    -      maintains statistics
    -
    -  returns:
    -    visible_list is empty if qh_deletevisible was called
    -*/
    -void qh_resetlists(qhT *qh, boolT stats, boolT resetVisible /*qh.newvertex_list newfacet_list visible_list*/) {
    -  vertexT *vertex;
    -  facetT *newfacet, *visible;
    -  int totnew=0, totver=0;
    -
    -  if (stats) {
    -    FORALLvertex_(qh->newvertex_list)
    -      totver++;
    -    FORALLnew_facets
    -      totnew++;
    -    zadd_(Zvisvertextot, totver);
    -    zmax_(Zvisvertexmax, totver);
    -    zadd_(Znewfacettot, totnew);
    -    zmax_(Znewfacetmax, totnew);
    -  }
    -  FORALLvertex_(qh->newvertex_list)
    -    vertex->newlist= False;
    -  qh->newvertex_list= NULL;
    -  FORALLnew_facets
    -    newfacet->newfacet= False;
    -  qh->newfacet_list= NULL;
    -  if (resetVisible) {
    -    FORALLvisible_facets {
    -      visible->f.replace= NULL;
    -      visible->visible= False;
    -    }
    -    qh->num_visible= 0;
    -  }
    -  qh->visible_list= NULL; /* may still have visible facets via qh_triangulate */
    -  qh->NEWfacets= False;
    -} /* resetlists */
    -
    -/*---------------------------------
    -
    -  qh_setvoronoi_all(qh)
    -    compute Voronoi centers for all facets
    -    includes upperDelaunay facets if qh.UPPERdelaunay ('Qu')
    -
    -  returns:
    -    facet->center is the Voronoi center
    -
    -  notes:
    -    this is unused/untested code
    -      please email bradb@shore.net if this works ok for you
    -
    -  use:
    -    FORALLvertices {...} to locate the vertex for a point.
    -    FOREACHneighbor_(vertex) {...} to visit the Voronoi centers for a Voronoi cell.
    -*/
    -void qh_setvoronoi_all(qhT *qh) {
    -  facetT *facet;
    -
    -  qh_clearcenters(qh, qh_ASvoronoi);
    -  qh_vertexneighbors(qh);
    -
    -  FORALLfacets {
    -    if (!facet->normal || !facet->upperdelaunay || qh->UPPERdelaunay) {
    -      if (!facet->center)
    -        facet->center= qh_facetcenter(qh, facet->vertices);
    -    }
    -  }
    -} /* setvoronoi_all */
    -
    -#ifndef qh_NOmerge
    -
    -/*---------------------------------
    -
    -  qh_triangulate()
    -    triangulate non-simplicial facets on qh.facet_list,
    -    if qh->VORONOI, sets Voronoi centers of non-simplicial facets
    -    nop if hasTriangulation
    -
    -  returns:
    -    all facets simplicial
    -    each tricoplanar facet has ->f.triowner == owner of ->center,normal,etc.
    -
    -  notes:
    -    call after qh_check_output since may switch to Voronoi centers
    -    Output may overwrite ->f.triowner with ->f.area
    -*/
    -void qh_triangulate(qhT *qh /*qh.facet_list*/) {
    -  facetT *facet, *nextfacet, *owner;
    -  int onlygood= qh->ONLYgood;
    -  facetT *neighbor, *visible= NULL, *facet1, *facet2, *new_facet_list= NULL;
    -  facetT *orig_neighbor= NULL, *otherfacet;
    -  vertexT *new_vertex_list= NULL;
    -  mergeT *merge;
    -  mergeType mergetype;
    -  int neighbor_i, neighbor_n;
    -
    -  if (qh->hasTriangulation)
    -      return;
    -  trace1((qh, qh->ferr, 1034, "qh_triangulate: triangulate non-simplicial facets\n"));
    -  if (qh->hull_dim == 2)
    -    return;
    -  if (qh->VORONOI) {  /* otherwise lose Voronoi centers [could rebuild vertex set from tricoplanar] */
    -    qh_clearcenters(qh, qh_ASvoronoi);
    -    qh_vertexneighbors(qh);
    -  }
    -  qh->ONLYgood= False; /* for makenew_nonsimplicial */
    -  qh->visit_id++;
    -  qh->NEWfacets= True;
    -  qh->degen_mergeset= qh_settemp(qh, qh->TEMPsize);
    -  qh->newvertex_list= qh->vertex_tail;
    -  for (facet= qh->facet_list; facet && facet->next; facet= nextfacet) { /* non-simplicial facets moved to end */
    -    nextfacet= facet->next;
    -    if (facet->visible || facet->simplicial)
    -      continue;
    -    /* triangulate all non-simplicial facets, otherwise merging does not work, e.g., RBOX c P-0.1 P+0.1 P+0.1 D3 | QHULL d Qt Tv */
    -    if (!new_facet_list)
    -      new_facet_list= facet;  /* will be moved to end */
    -    qh_triangulate_facet(qh, facet, &new_vertex_list);
    -  }
    -  trace2((qh, qh->ferr, 2047, "qh_triangulate: delete null facets from f%d -- apex same as second vertex\n", getid_(new_facet_list)));
    -  for (facet= new_facet_list; facet && facet->next; facet= nextfacet) { /* null facets moved to end */
    -    nextfacet= facet->next;
    -    if (facet->visible)
    -      continue;
    -    if (facet->ridges) {
    -      if (qh_setsize(qh, facet->ridges) > 0) {
    -        qh_fprintf(qh, qh->ferr, 6161, "qhull error (qh_triangulate): ridges still defined for f%d\n", facet->id);
    -        qh_errexit(qh, qh_ERRqhull, facet, NULL);
    -      }
    -      qh_setfree(qh, &facet->ridges);
    -    }
    -    if (SETfirst_(facet->vertices) == SETsecond_(facet->vertices)) {
    -      zinc_(Ztrinull);
    -      qh_triangulate_null(qh, facet);
    -    }
    -  }
    -  trace2((qh, qh->ferr, 2048, "qh_triangulate: delete %d or more mirror facets -- same vertices and neighbors\n", qh_setsize(qh, qh->degen_mergeset)));
    -  qh->visible_list= qh->facet_tail;
    -  while ((merge= (mergeT*)qh_setdellast(qh->degen_mergeset))) {
    -    facet1= merge->facet1;
    -    facet2= merge->facet2;
    -    mergetype= merge->type;
    -    qh_memfree(qh, merge, (int)sizeof(mergeT));
    -    if (mergetype == MRGmirror) {
    -      zinc_(Ztrimirror);
    -      qh_triangulate_mirror(qh, facet1, facet2);
    -    }
    -  }
    -  qh_settempfree(qh, &qh->degen_mergeset);
    -  trace2((qh, qh->ferr, 2049, "qh_triangulate: update neighbor lists for vertices from v%d\n", getid_(new_vertex_list)));
    -  qh->newvertex_list= new_vertex_list;  /* all vertices of new facets */
    -  qh->visible_list= NULL;
    -  qh_updatevertices(qh /*qh.newvertex_list, empty newfacet_list and visible_list*/);
    -  qh_resetlists(qh, False, !qh_RESETvisible /*qh.newvertex_list, empty newfacet_list and visible_list*/);
    -
    -  trace2((qh, qh->ferr, 2050, "qh_triangulate: identify degenerate tricoplanar facets from f%d\n", getid_(new_facet_list)));
    -  trace2((qh, qh->ferr, 2051, "qh_triangulate: and replace facet->f.triowner with tricoplanar facets that own center, normal, etc.\n"));
    -  FORALLfacet_(new_facet_list) {
    -    if (facet->tricoplanar && !facet->visible) {
    -      FOREACHneighbor_i_(qh, facet) {
    -        if (neighbor_i == 0) {  /* first iteration */
    -          if (neighbor->tricoplanar)
    -            orig_neighbor= neighbor->f.triowner;
    -          else
    -            orig_neighbor= neighbor;
    -        }else {
    -          if (neighbor->tricoplanar)
    -            otherfacet= neighbor->f.triowner;
    -          else
    -            otherfacet= neighbor;
    -          if (orig_neighbor == otherfacet) {
    -            zinc_(Ztridegen);
    -            facet->degenerate= True;
    -            break;
    -          }
    -        }
    -      }
    -    }
    -  }
    -
    -  trace2((qh, qh->ferr, 2052, "qh_triangulate: delete visible facets -- non-simplicial, null, and mirrored facets\n"));
    -  owner= NULL;
    -  visible= NULL;
    -  for (facet= new_facet_list; facet && facet->next; facet= nextfacet) { /* may delete facet */
    -    nextfacet= facet->next;
    -    if (facet->visible) {
    -      if (facet->tricoplanar) { /* a null or mirrored facet */
    -        qh_delfacet(qh, facet);
    -        qh->num_visible--;
    -      }else {  /* a non-simplicial facet followed by its tricoplanars */
    -        if (visible && !owner) {
    -          /*  RBOX 200 s D5 t1001471447 | QHULL Qt C-0.01 Qx Qc Tv Qt -- f4483 had 6 vertices/neighbors and 8 ridges */
    -          trace2((qh, qh->ferr, 2053, "qh_triangulate: all tricoplanar facets degenerate for non-simplicial facet f%d\n",
    -                       visible->id));
    -          qh_delfacet(qh, visible);
    -          qh->num_visible--;
    -        }
    -        visible= facet;
    -        owner= NULL;
    -      }
    -    }else if (facet->tricoplanar) {
    -      if (facet->f.triowner != visible || visible==NULL) {
    -        qh_fprintf(qh, qh->ferr, 6162, "qhull error (qh_triangulate): tricoplanar facet f%d not owned by its visible, non-simplicial facet f%d\n", facet->id, getid_(visible));
    -        qh_errexit2(qh, qh_ERRqhull, facet, visible);
    -      }
    -      if (owner)
    -        facet->f.triowner= owner;
    -      else if (!facet->degenerate) {
    -        owner= facet;
    -        nextfacet= visible->next; /* rescan tricoplanar facets with owner, visible!=0 by QH6162 */
    -        facet->keepcentrum= True;  /* one facet owns ->normal, etc. */
    -        facet->coplanarset= visible->coplanarset;
    -        facet->outsideset= visible->outsideset;
    -        visible->coplanarset= NULL;
    -        visible->outsideset= NULL;
    -        if (!qh->TRInormals) { /* center and normal copied to tricoplanar facets */
    -          visible->center= NULL;
    -          visible->normal= NULL;
    -        }
    -        qh_delfacet(qh, visible);
    -        qh->num_visible--;
    -      }
    -    }
    -  }
    -  if (visible && !owner) {
    -    trace2((qh, qh->ferr, 2054, "qh_triangulate: all tricoplanar facets degenerate for last non-simplicial facet f%d\n",
    -                 visible->id));
    -    qh_delfacet(qh, visible);
    -    qh->num_visible--;
    -  }
    -  qh->NEWfacets= False;
    -  qh->ONLYgood= onlygood; /* restore value */
    -  if (qh->CHECKfrequently)
    -    qh_checkpolygon(qh, qh->facet_list);
    -  qh->hasTriangulation= True;
    -} /* triangulate */
    -
    -
    -/*---------------------------------
    -
    -  qh_triangulate_facet(qh, facetA, &firstVertex )
    -    triangulate a non-simplicial facet
    -      if qh.CENTERtype=qh_ASvoronoi, sets its Voronoi center
    -  returns:
    -    qh.newfacet_list == simplicial facets
    -      facet->tricoplanar set and ->keepcentrum false
    -      facet->degenerate set if duplicated apex
    -      facet->f.trivisible set to facetA
    -      facet->center copied from facetA (created if qh_ASvoronoi)
    -        qh_eachvoronoi, qh_detvridge, qh_detvridge3 assume centers copied
    -      facet->normal,offset,maxoutside copied from facetA
    -
    -  notes:
    -      only called by qh_triangulate
    -      qh_makenew_nonsimplicial uses neighbor->seen for the same
    -      if qh.TRInormals, newfacet->normal will need qh_free
    -        if qh.TRInormals and qh_AScentrum, newfacet->center will need qh_free
    -        keepcentrum is also set on Zwidefacet in qh_mergefacet
    -        freed by qh_clearcenters
    -
    -  see also:
    -      qh_addpoint() -- add a point
    -      qh_makenewfacets() -- construct a cone of facets for a new vertex
    -
    -  design:
    -      if qh_ASvoronoi,
    -         compute Voronoi center (facet->center)
    -      select first vertex (highest ID to preserve ID ordering of ->vertices)
    -      triangulate from vertex to ridges
    -      copy facet->center, normal, offset
    -      update vertex neighbors
    -*/
    -void qh_triangulate_facet(qhT *qh, facetT *facetA, vertexT **first_vertex) {
    -  facetT *newfacet;
    -  facetT *neighbor, **neighborp;
    -  vertexT *apex;
    -  int numnew=0;
    -
    -  trace3((qh, qh->ferr, 3020, "qh_triangulate_facet: triangulate facet f%d\n", facetA->id));
    -
    -  if (qh->IStracing >= 4)
    -    qh_printfacet(qh, qh->ferr, facetA);
    -  FOREACHneighbor_(facetA) {
    -    neighbor->seen= False;
    -    neighbor->coplanar= False;
    -  }
    -  if (qh->CENTERtype == qh_ASvoronoi && !facetA->center  /* matches upperdelaunay in qh_setfacetplane() */
    -        && fabs_(facetA->normal[qh->hull_dim -1]) >= qh->ANGLEround * qh_ZEROdelaunay) {
    -    facetA->center= qh_facetcenter(qh, facetA->vertices);
    -  }
    -  qh_willdelete(qh, facetA, NULL);
    -  qh->newfacet_list= qh->facet_tail;
    -  facetA->visitid= qh->visit_id;
    -  apex= SETfirstt_(facetA->vertices, vertexT);
    -  qh_makenew_nonsimplicial(qh, facetA, apex, &numnew);
    -  SETfirst_(facetA->neighbors)= NULL;
    -  FORALLnew_facets {
    -    newfacet->tricoplanar= True;
    -    newfacet->f.trivisible= facetA;
    -    newfacet->degenerate= False;
    -    newfacet->upperdelaunay= facetA->upperdelaunay;
    -    newfacet->good= facetA->good;
    -    if (qh->TRInormals) { /* 'Q11' triangulate duplicates ->normal and ->center */
    -      newfacet->keepcentrum= True;
    -      if(facetA->normal){
    -        newfacet->normal= qh_memalloc(qh, qh->normal_size);
    -        memcpy((char *)newfacet->normal, facetA->normal, qh->normal_size);
    -      }
    -      if (qh->CENTERtype == qh_AScentrum)
    -        newfacet->center= qh_getcentrum(qh, newfacet);
    -      else if (qh->CENTERtype == qh_ASvoronoi && facetA->center){
    -        newfacet->center= qh_memalloc(qh, qh->center_size);
    -        memcpy((char *)newfacet->center, facetA->center, qh->center_size);
    -      }
    -    }else {
    -      newfacet->keepcentrum= False;
    -      /* one facet will have keepcentrum=True at end of qh_triangulate */
    -      newfacet->normal= facetA->normal;
    -      newfacet->center= facetA->center;
    -    }
    -    newfacet->offset= facetA->offset;
    -#if qh_MAXoutside
    -    newfacet->maxoutside= facetA->maxoutside;
    -#endif
    -  }
    -  qh_matchnewfacets(qh /*qh.newfacet_list*/);
    -  zinc_(Ztricoplanar);
    -  zadd_(Ztricoplanartot, numnew);
    -  zmax_(Ztricoplanarmax, numnew);
    -  qh->visible_list= NULL;
    -  if (!(*first_vertex))
    -    (*first_vertex)= qh->newvertex_list;
    -  qh->newvertex_list= NULL;
    -  qh_updatevertices(qh /*qh.newfacet_list, qh.empty visible_list and qh.newvertex_list*/);
    -  qh_resetlists(qh, False, !qh_RESETvisible /*qh.newfacet_list, qh.empty visible_list and qh.newvertex_list*/);
    -} /* triangulate_facet */
    -
    -/*---------------------------------
    -
    -  qh_triangulate_link(qh, oldfacetA, facetA, oldfacetB, facetB)
    -    relink facetA to facetB via oldfacets
    -  returns:
    -    adds mirror facets to qh->degen_mergeset (4-d and up only)
    -  design:
    -    if they are already neighbors, the opposing neighbors become MRGmirror facets
    -*/
    -void qh_triangulate_link(qhT *qh, facetT *oldfacetA, facetT *facetA, facetT *oldfacetB, facetT *facetB) {
    -  int errmirror= False;
    -
    -  trace3((qh, qh->ferr, 3021, "qh_triangulate_link: relink old facets f%d and f%d between neighbors f%d and f%d\n",
    -         oldfacetA->id, oldfacetB->id, facetA->id, facetB->id));
    -  if (qh_setin(facetA->neighbors, facetB)) {
    -    if (!qh_setin(facetB->neighbors, facetA))
    -      errmirror= True;
    -    else
    -      qh_appendmergeset(qh, facetA, facetB, MRGmirror, NULL);
    -  }else if (qh_setin(facetB->neighbors, facetA))
    -    errmirror= True;
    -  if (errmirror) {
    -    qh_fprintf(qh, qh->ferr, 6163, "qhull error (qh_triangulate_link): mirror facets f%d and f%d do not match for old facets f%d and f%d\n",
    -       facetA->id, facetB->id, oldfacetA->id, oldfacetB->id);
    -    qh_errexit2(qh, qh_ERRqhull, facetA, facetB);
    -  }
    -  qh_setreplace(qh, facetB->neighbors, oldfacetB, facetA);
    -  qh_setreplace(qh, facetA->neighbors, oldfacetA, facetB);
    -} /* triangulate_link */
    -
    -/*---------------------------------
    -
    -  qh_triangulate_mirror(qh, facetA, facetB)
    -    delete mirrored facets from qh_triangulate_null() and qh_triangulate_mirror
    -      a mirrored facet shares the same vertices of a logical ridge
    -  design:
    -    since a null facet duplicates the first two vertices, the opposing neighbors absorb the null facet
    -    if they are already neighbors, the opposing neighbors become MRGmirror facets
    -*/
    -void qh_triangulate_mirror(qhT *qh, facetT *facetA, facetT *facetB) {
    -  facetT *neighbor, *neighborB;
    -  int neighbor_i, neighbor_n;
    -
    -  trace3((qh, qh->ferr, 3022, "qh_triangulate_mirror: delete mirrored facets f%d and f%d\n",
    -         facetA->id, facetB->id));
    -  FOREACHneighbor_i_(qh, facetA) {
    -    neighborB= SETelemt_(facetB->neighbors, neighbor_i, facetT);
    -    if (neighbor == neighborB)
    -      continue; /* occurs twice */
    -    qh_triangulate_link(qh, facetA, neighbor, facetB, neighborB);
    -  }
    -  qh_willdelete(qh, facetA, NULL);
    -  qh_willdelete(qh, facetB, NULL);
    -} /* triangulate_mirror */
    -
    -/*---------------------------------
    -
    -  qh_triangulate_null(qh, facetA)
    -    remove null facetA from qh_triangulate_facet()
    -      a null facet has vertex #1 (apex) == vertex #2
    -  returns:
    -    adds facetA to ->visible for deletion after qh_updatevertices
    -    qh->degen_mergeset contains mirror facets (4-d and up only)
    -  design:
    -    since a null facet duplicates the first two vertices, the opposing neighbors absorb the null facet
    -    if they are already neighbors, the opposing neighbors become MRGmirror facets
    -*/
    -void qh_triangulate_null(qhT *qh, facetT *facetA) {
    -  facetT *neighbor, *otherfacet;
    -
    -  trace3((qh, qh->ferr, 3023, "qh_triangulate_null: delete null facet f%d\n", facetA->id));
    -  neighbor= SETfirstt_(facetA->neighbors, facetT);
    -  otherfacet= SETsecondt_(facetA->neighbors, facetT);
    -  qh_triangulate_link(qh, facetA, neighbor, facetA, otherfacet);
    -  qh_willdelete(qh, facetA, NULL);
    -} /* triangulate_null */
    -
    -#else /* qh_NOmerge */
    -void qh_triangulate(qhT *qh) {
    -}
    -#endif /* qh_NOmerge */
    -
    -   /*---------------------------------
    -
    -  qh_vertexintersect(qh, vertexsetA, vertexsetB )
    -    intersects two vertex sets (inverse id ordered)
    -    vertexsetA is a temporary set at the top of qh->qhmem.tempstack
    -
    -  returns:
    -    replaces vertexsetA with the intersection
    -
    -  notes:
    -    could overwrite vertexsetA if currently too slow
    -*/
    -void qh_vertexintersect(qhT *qh, setT **vertexsetA,setT *vertexsetB) {
    -  setT *intersection;
    -
    -  intersection= qh_vertexintersect_new(qh, *vertexsetA, vertexsetB);
    -  qh_settempfree(qh, vertexsetA);
    -  *vertexsetA= intersection;
    -  qh_settemppush(qh, intersection);
    -} /* vertexintersect */
    -
    -/*---------------------------------
    -
    -  qh_vertexintersect_new(qh, )
    -    intersects two vertex sets (inverse id ordered)
    -
    -  returns:
    -    a new set
    -*/
    -setT *qh_vertexintersect_new(qhT *qh, setT *vertexsetA,setT *vertexsetB) {
    -  setT *intersection= qh_setnew(qh, qh->hull_dim - 1);
    -  vertexT **vertexA= SETaddr_(vertexsetA, vertexT);
    -  vertexT **vertexB= SETaddr_(vertexsetB, vertexT);
    -
    -  while (*vertexA && *vertexB) {
    -    if (*vertexA  == *vertexB) {
    -      qh_setappend(qh, &intersection, *vertexA);
    -      vertexA++; vertexB++;
    -    }else {
    -      if ((*vertexA)->id > (*vertexB)->id)
    -        vertexA++;
    -      else
    -        vertexB++;
    -    }
    -  }
    -  return intersection;
    -} /* vertexintersect_new */
    -
    -/*---------------------------------
    -
    -  qh_vertexneighbors(qh)
    -    for each vertex in qh.facet_list,
    -      determine its neighboring facets
    -
    -  returns:
    -    sets qh.VERTEXneighbors
    -      nop if qh.VERTEXneighbors already set
    -      qh_addpoint() will maintain them
    -
    -  notes:
    -    assumes all vertex->neighbors are NULL
    -
    -  design:
    -    for each facet
    -      for each vertex
    -        append facet to vertex->neighbors
    -*/
    -void qh_vertexneighbors(qhT *qh /*qh.facet_list*/) {
    -  facetT *facet;
    -  vertexT *vertex, **vertexp;
    -
    -  if (qh->VERTEXneighbors)
    -    return;
    -  trace1((qh, qh->ferr, 1035, "qh_vertexneighbors: determining neighboring facets for each vertex\n"));
    -  qh->vertex_visit++;
    -  FORALLfacets {
    -    if (facet->visible)
    -      continue;
    -    FOREACHvertex_(facet->vertices) {
    -      if (vertex->visitid != qh->vertex_visit) {
    -        vertex->visitid= qh->vertex_visit;
    -        vertex->neighbors= qh_setnew(qh, qh->hull_dim);
    -      }
    -      qh_setappend(qh, &vertex->neighbors, facet);
    -    }
    -  }
    -  qh->VERTEXneighbors= True;
    -} /* vertexneighbors */
    -
    -/*---------------------------------
    -
    -  qh_vertexsubset( vertexsetA, vertexsetB )
    -    returns True if vertexsetA is a subset of vertexsetB
    -    assumes vertexsets are sorted
    -
    -  note:
    -    empty set is a subset of any other set
    -*/
    -boolT qh_vertexsubset(setT *vertexsetA, setT *vertexsetB) {
    -  vertexT **vertexA= (vertexT **) SETaddr_(vertexsetA, vertexT);
    -  vertexT **vertexB= (vertexT **) SETaddr_(vertexsetB, vertexT);
    -
    -  while (True) {
    -    if (!*vertexA)
    -      return True;
    -    if (!*vertexB)
    -      return False;
    -    if ((*vertexA)->id > (*vertexB)->id)
    -      return False;
    -    if (*vertexA  == *vertexB)
    -      vertexA++;
    -    vertexB++;
    -  }
    -  return False; /* avoid warnings */
    -} /* vertexsubset */
    diff --git a/src/qhull/src/libqhull_r/poly_r.c b/src/qhull/src/libqhull_r/poly_r.c
    deleted file mode 100644
    index e5b47974377..00000000000
    --- a/src/qhull/src/libqhull_r/poly_r.c
    +++ /dev/null
    @@ -1,1205 +0,0 @@
    -/*
      ---------------------------------
    -
    -   poly_r.c
    -   implements polygons and simplices
    -
    -   see qh-poly_r.htm, poly_r.h and libqhull_r.h
    -
    -   infrequent code is in poly2_r.c
    -   (all but top 50 and their callers 12/3/95)
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull_r/poly_r.c#3 $$Change: 2064 $
    -   $DateTime: 2016/01/18 12:36:08 $$Author: bbarber $
    -*/
    -
    -#include "qhull_ra.h"
    -
    -/*======== functions in alphabetical order ==========*/
    -
    -/*---------------------------------
    -
    -  qh_appendfacet(qh, facet )
    -    appends facet to end of qh.facet_list,
    -
    -  returns:
    -    updates qh.newfacet_list, facet_next, facet_list
    -    increments qh.numfacets
    -
    -  notes:
    -    assumes qh.facet_list/facet_tail is defined (createsimplex)
    -
    -  see:
    -    qh_removefacet()
    -
    -*/
    -void qh_appendfacet(qhT *qh, facetT *facet) {
    -  facetT *tail= qh->facet_tail;
    -
    -  if (tail == qh->newfacet_list)
    -    qh->newfacet_list= facet;
    -  if (tail == qh->facet_next)
    -    qh->facet_next= facet;
    -  facet->previous= tail->previous;
    -  facet->next= tail;
    -  if (tail->previous)
    -    tail->previous->next= facet;
    -  else
    -    qh->facet_list= facet;
    -  tail->previous= facet;
    -  qh->num_facets++;
    -  trace4((qh, qh->ferr, 4044, "qh_appendfacet: append f%d to facet_list\n", facet->id));
    -} /* appendfacet */
    -
    -
    -/*---------------------------------
    -
    -  qh_appendvertex(qh, vertex )
    -    appends vertex to end of qh.vertex_list,
    -
    -  returns:
    -    sets vertex->newlist
    -    updates qh.vertex_list, newvertex_list
    -    increments qh.num_vertices
    -
    -  notes:
    -    assumes qh.vertex_list/vertex_tail is defined (createsimplex)
    -
    -*/
    -void qh_appendvertex(qhT *qh, vertexT *vertex) {
    -  vertexT *tail= qh->vertex_tail;
    -
    -  if (tail == qh->newvertex_list)
    -    qh->newvertex_list= vertex;
    -  vertex->newlist= True;
    -  vertex->previous= tail->previous;
    -  vertex->next= tail;
    -  if (tail->previous)
    -    tail->previous->next= vertex;
    -  else
    -    qh->vertex_list= vertex;
    -  tail->previous= vertex;
    -  qh->num_vertices++;
    -  trace4((qh, qh->ferr, 4045, "qh_appendvertex: append v%d to vertex_list\n", vertex->id));
    -} /* appendvertex */
    -
    -
    -/*---------------------------------
    -
    -  qh_attachnewfacets(qh, )
    -    attach horizon facets to new facets in qh.newfacet_list
    -    newfacets have neighbor and ridge links to horizon but not vice versa
    -    only needed for qh.ONLYgood
    -
    -  returns:
    -    set qh.NEWfacets
    -    horizon facets linked to new facets
    -      ridges changed from visible facets to new facets
    -      simplicial ridges deleted
    -    qh.visible_list, no ridges valid
    -    facet->f.replace is a newfacet (if any)
    -
    -  design:
    -    delete interior ridges and neighbor sets by
    -      for each visible, non-simplicial facet
    -        for each ridge
    -          if last visit or if neighbor is simplicial
    -            if horizon neighbor
    -              delete ridge for horizon's ridge set
    -            delete ridge
    -        erase neighbor set
    -    attach horizon facets and new facets by
    -      for all new facets
    -        if corresponding horizon facet is simplicial
    -          locate corresponding visible facet {may be more than one}
    -          link visible facet to new facet
    -          replace visible facet with new facet in horizon
    -        else it's non-simplicial
    -          for all visible neighbors of the horizon facet
    -            link visible neighbor to new facet
    -            delete visible neighbor from horizon facet
    -          append new facet to horizon's neighbors
    -          the first ridge of the new facet is the horizon ridge
    -          link the new facet into the horizon ridge
    -*/
    -void qh_attachnewfacets(qhT *qh /* qh.visible_list, newfacet_list */) {
    -  facetT *newfacet= NULL, *neighbor, **neighborp, *horizon, *visible;
    -  ridgeT *ridge, **ridgep;
    -
    -  qh->NEWfacets= True;
    -  trace3((qh, qh->ferr, 3012, "qh_attachnewfacets: delete interior ridges\n"));
    -  qh->visit_id++;
    -  FORALLvisible_facets {
    -    visible->visitid= qh->visit_id;
    -    if (visible->ridges) {
    -      FOREACHridge_(visible->ridges) {
    -        neighbor= otherfacet_(ridge, visible);
    -        if (neighbor->visitid == qh->visit_id
    -            || (!neighbor->visible && neighbor->simplicial)) {
    -          if (!neighbor->visible)  /* delete ridge for simplicial horizon */
    -            qh_setdel(neighbor->ridges, ridge);
    -          qh_setfree(qh, &(ridge->vertices)); /* delete on 2nd visit */
    -          qh_memfree(qh, ridge, (int)sizeof(ridgeT));
    -        }
    -      }
    -      SETfirst_(visible->ridges)= NULL;
    -    }
    -    SETfirst_(visible->neighbors)= NULL;
    -  }
    -  trace1((qh, qh->ferr, 1017, "qh_attachnewfacets: attach horizon facets to new facets\n"));
    -  FORALLnew_facets {
    -    horizon= SETfirstt_(newfacet->neighbors, facetT);
    -    if (horizon->simplicial) {
    -      visible= NULL;
    -      FOREACHneighbor_(horizon) {   /* may have more than one horizon ridge */
    -        if (neighbor->visible) {
    -          if (visible) {
    -            if (qh_setequal_skip(newfacet->vertices, 0, horizon->vertices,
    -                                  SETindex_(horizon->neighbors, neighbor))) {
    -              visible= neighbor;
    -              break;
    -            }
    -          }else
    -            visible= neighbor;
    -        }
    -      }
    -      if (visible) {
    -        visible->f.replace= newfacet;
    -        qh_setreplace(qh, horizon->neighbors, visible, newfacet);
    -      }else {
    -        qh_fprintf(qh, qh->ferr, 6102, "qhull internal error (qh_attachnewfacets): couldn't find visible facet for horizon f%d of newfacet f%d\n",
    -                 horizon->id, newfacet->id);
    -        qh_errexit2(qh, qh_ERRqhull, horizon, newfacet);
    -      }
    -    }else { /* non-simplicial, with a ridge for newfacet */
    -      FOREACHneighbor_(horizon) {    /* may hold for many new facets */
    -        if (neighbor->visible) {
    -          neighbor->f.replace= newfacet;
    -          qh_setdelnth(qh, horizon->neighbors,
    -                        SETindex_(horizon->neighbors, neighbor));
    -          neighborp--; /* repeat */
    -        }
    -      }
    -      qh_setappend(qh, &horizon->neighbors, newfacet);
    -      ridge= SETfirstt_(newfacet->ridges, ridgeT);
    -      if (ridge->top == horizon)
    -        ridge->bottom= newfacet;
    -      else
    -        ridge->top= newfacet;
    -      }
    -  } /* newfacets */
    -  if (qh->PRINTstatistics) {
    -    FORALLvisible_facets {
    -      if (!visible->f.replace)
    -        zinc_(Zinsidevisible);
    -    }
    -  }
    -} /* attachnewfacets */
    -
    -/*---------------------------------
    -
    -  qh_checkflipped(qh, facet, dist, allerror )
    -    checks facet orientation to interior point
    -
    -    if allerror set,
    -      tests against qh.DISTround
    -    else
    -      tests against 0 since tested against DISTround before
    -
    -  returns:
    -    False if it flipped orientation (sets facet->flipped)
    -    distance if non-NULL
    -*/
    -boolT qh_checkflipped(qhT *qh, facetT *facet, realT *distp, boolT allerror) {
    -  realT dist;
    -
    -  if (facet->flipped && !distp)
    -    return False;
    -  zzinc_(Zdistcheck);
    -  qh_distplane(qh, qh->interior_point, facet, &dist);
    -  if (distp)
    -    *distp= dist;
    -  if ((allerror && dist > -qh->DISTround)|| (!allerror && dist >= 0.0)) {
    -    facet->flipped= True;
    -    zzinc_(Zflippedfacets);
    -    trace0((qh, qh->ferr, 19, "qh_checkflipped: facet f%d is flipped, distance= %6.12g during p%d\n",
    -              facet->id, dist, qh->furthest_id));
    -    qh_precision(qh, "flipped facet");
    -    return False;
    -  }
    -  return True;
    -} /* checkflipped */
    -
    -/*---------------------------------
    -
    -  qh_delfacet(qh, facet )
    -    removes facet from facet_list and frees up its memory
    -
    -  notes:
    -    assumes vertices and ridges already freed
    -*/
    -void qh_delfacet(qhT *qh, facetT *facet) {
    -  void **freelistp; /* used if !qh_NOmem by qh_memfree_() */
    -
    -  trace4((qh, qh->ferr, 4046, "qh_delfacet: delete f%d\n", facet->id));
    -  if (facet == qh->tracefacet)
    -    qh->tracefacet= NULL;
    -  if (facet == qh->GOODclosest)
    -    qh->GOODclosest= NULL;
    -  qh_removefacet(qh, facet);
    -  if (!facet->tricoplanar || facet->keepcentrum) {
    -    qh_memfree_(qh, facet->normal, qh->normal_size, freelistp);
    -    if (qh->CENTERtype == qh_ASvoronoi) {   /* braces for macro calls */
    -      qh_memfree_(qh, facet->center, qh->center_size, freelistp);
    -    }else /* AScentrum */ {
    -      qh_memfree_(qh, facet->center, qh->normal_size, freelistp);
    -    }
    -  }
    -  qh_setfree(qh, &(facet->neighbors));
    -  if (facet->ridges)
    -    qh_setfree(qh, &(facet->ridges));
    -  qh_setfree(qh, &(facet->vertices));
    -  if (facet->outsideset)
    -    qh_setfree(qh, &(facet->outsideset));
    -  if (facet->coplanarset)
    -    qh_setfree(qh, &(facet->coplanarset));
    -  qh_memfree_(qh, facet, (int)sizeof(facetT), freelistp);
    -} /* delfacet */
    -
    -
    -/*---------------------------------
    -
    -  qh_deletevisible()
    -    delete visible facets and vertices
    -
    -  returns:
    -    deletes each facet and removes from facetlist
    -    at exit, qh.visible_list empty (== qh.newfacet_list)
    -
    -  notes:
    -    ridges already deleted
    -    horizon facets do not reference facets on qh.visible_list
    -    new facets in qh.newfacet_list
    -    uses   qh.visit_id;
    -*/
    -void qh_deletevisible(qhT *qh /*qh.visible_list*/) {
    -  facetT *visible, *nextfacet;
    -  vertexT *vertex, **vertexp;
    -  int numvisible= 0, numdel= qh_setsize(qh, qh->del_vertices);
    -
    -  trace1((qh, qh->ferr, 1018, "qh_deletevisible: delete %d visible facets and %d vertices\n",
    -         qh->num_visible, numdel));
    -  for (visible= qh->visible_list; visible && visible->visible;
    -                visible= nextfacet) { /* deleting current */
    -    nextfacet= visible->next;
    -    numvisible++;
    -    qh_delfacet(qh, visible);
    -  }
    -  if (numvisible != qh->num_visible) {
    -    qh_fprintf(qh, qh->ferr, 6103, "qhull internal error (qh_deletevisible): qh->num_visible %d is not number of visible facets %d\n",
    -             qh->num_visible, numvisible);
    -    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -  }
    -  qh->num_visible= 0;
    -  zadd_(Zvisfacettot, numvisible);
    -  zmax_(Zvisfacetmax, numvisible);
    -  zzadd_(Zdelvertextot, numdel);
    -  zmax_(Zdelvertexmax, numdel);
    -  FOREACHvertex_(qh->del_vertices)
    -    qh_delvertex(qh, vertex);
    -  qh_settruncate(qh, qh->del_vertices, 0);
    -} /* deletevisible */
    -
    -/*---------------------------------
    -
    -  qh_facetintersect(qh, facetA, facetB, skipa, skipB, prepend )
    -    return vertices for intersection of two simplicial facets
    -    may include 1 prepended entry (if more, need to settemppush)
    -
    -  returns:
    -    returns set of qh.hull_dim-1 + prepend vertices
    -    returns skipped index for each test and checks for exactly one
    -
    -  notes:
    -    does not need settemp since set in quick memory
    -
    -  see also:
    -    qh_vertexintersect and qh_vertexintersect_new
    -    use qh_setnew_delnthsorted to get nth ridge (no skip information)
    -
    -  design:
    -    locate skipped vertex by scanning facet A's neighbors
    -    locate skipped vertex by scanning facet B's neighbors
    -    intersect the vertex sets
    -*/
    -setT *qh_facetintersect(qhT *qh, facetT *facetA, facetT *facetB,
    -                         int *skipA,int *skipB, int prepend) {
    -  setT *intersect;
    -  int dim= qh->hull_dim, i, j;
    -  facetT **neighborsA, **neighborsB;
    -
    -  neighborsA= SETaddr_(facetA->neighbors, facetT);
    -  neighborsB= SETaddr_(facetB->neighbors, facetT);
    -  i= j= 0;
    -  if (facetB == *neighborsA++)
    -    *skipA= 0;
    -  else if (facetB == *neighborsA++)
    -    *skipA= 1;
    -  else if (facetB == *neighborsA++)
    -    *skipA= 2;
    -  else {
    -    for (i=3; i < dim; i++) {
    -      if (facetB == *neighborsA++) {
    -        *skipA= i;
    -        break;
    -      }
    -    }
    -  }
    -  if (facetA == *neighborsB++)
    -    *skipB= 0;
    -  else if (facetA == *neighborsB++)
    -    *skipB= 1;
    -  else if (facetA == *neighborsB++)
    -    *skipB= 2;
    -  else {
    -    for (j=3; j < dim; j++) {
    -      if (facetA == *neighborsB++) {
    -        *skipB= j;
    -        break;
    -      }
    -    }
    -  }
    -  if (i >= dim || j >= dim) {
    -    qh_fprintf(qh, qh->ferr, 6104, "qhull internal error (qh_facetintersect): f%d or f%d not in others neighbors\n",
    -            facetA->id, facetB->id);
    -    qh_errexit2(qh, qh_ERRqhull, facetA, facetB);
    -  }
    -  intersect= qh_setnew_delnthsorted(qh, facetA->vertices, qh->hull_dim, *skipA, prepend);
    -  trace4((qh, qh->ferr, 4047, "qh_facetintersect: f%d skip %d matches f%d skip %d\n",
    -          facetA->id, *skipA, facetB->id, *skipB));
    -  return(intersect);
    -} /* facetintersect */
    -
    -/*---------------------------------
    -
    -  qh_gethash(qh, hashsize, set, size, firstindex, skipelem )
    -    return hashvalue for a set with firstindex and skipelem
    -
    -  notes:
    -    returned hash is in [0,hashsize)
    -    assumes at least firstindex+1 elements
    -    assumes skipelem is NULL, in set, or part of hash
    -
    -    hashes memory addresses which may change over different runs of the same data
    -    using sum for hash does badly in high d
    -*/
    -int qh_gethash(qhT *qh, int hashsize, setT *set, int size, int firstindex, void *skipelem) {
    -  void **elemp= SETelemaddr_(set, firstindex, void);
    -  ptr_intT hash = 0, elem;
    -  unsigned result;
    -  int i;
    -#ifdef _MSC_VER                   /* Microsoft Visual C++ -- warn about 64-bit issues */
    -#pragma warning( push)            /* WARN64 -- ptr_intT holds a 64-bit pointer */
    -#pragma warning( disable : 4311)  /* 'type cast': pointer truncation from 'void*' to 'ptr_intT' */
    -#endif
    -
    -  switch (size-firstindex) {
    -  case 1:
    -    hash= (ptr_intT)(*elemp) - (ptr_intT) skipelem;
    -    break;
    -  case 2:
    -    hash= (ptr_intT)(*elemp) + (ptr_intT)elemp[1] - (ptr_intT) skipelem;
    -    break;
    -  case 3:
    -    hash= (ptr_intT)(*elemp) + (ptr_intT)elemp[1] + (ptr_intT)elemp[2]
    -      - (ptr_intT) skipelem;
    -    break;
    -  case 4:
    -    hash= (ptr_intT)(*elemp) + (ptr_intT)elemp[1] + (ptr_intT)elemp[2]
    -      + (ptr_intT)elemp[3] - (ptr_intT) skipelem;
    -    break;
    -  case 5:
    -    hash= (ptr_intT)(*elemp) + (ptr_intT)elemp[1] + (ptr_intT)elemp[2]
    -      + (ptr_intT)elemp[3] + (ptr_intT)elemp[4] - (ptr_intT) skipelem;
    -    break;
    -  case 6:
    -    hash= (ptr_intT)(*elemp) + (ptr_intT)elemp[1] + (ptr_intT)elemp[2]
    -      + (ptr_intT)elemp[3] + (ptr_intT)elemp[4]+ (ptr_intT)elemp[5]
    -      - (ptr_intT) skipelem;
    -    break;
    -  default:
    -    hash= 0;
    -    i= 3;
    -    do {     /* this is about 10% in 10-d */
    -      if ((elem= (ptr_intT)*elemp++) != (ptr_intT)skipelem) {
    -        hash ^= (elem << i) + (elem >> (32-i));
    -        i += 3;
    -        if (i >= 32)
    -          i -= 32;
    -      }
    -    }while (*elemp);
    -    break;
    -  }
    -  if (hashsize<0) {
    -    qh_fprintf(qh, qh->ferr, 6202, "qhull internal error: negative hashsize %d passed to qh_gethash [poly.c]\n", hashsize);
    -    qh_errexit2(qh, qh_ERRqhull, NULL, NULL);
    -  }
    -  result= (unsigned)hash;
    -  result %= (unsigned)hashsize;
    -  /* result= 0; for debugging */
    -  return result;
    -#ifdef _MSC_VER
    -#pragma warning( pop)
    -#endif
    -} /* gethash */
    -
    -/*---------------------------------
    -
    -  qh_makenewfacet(qh, vertices, toporient, horizon )
    -    creates a toporient? facet from vertices
    -
    -  returns:
    -    returns newfacet
    -      adds newfacet to qh.facet_list
    -      newfacet->vertices= vertices
    -      if horizon
    -        newfacet->neighbor= horizon, but not vice versa
    -    newvertex_list updated with vertices
    -*/
    -facetT *qh_makenewfacet(qhT *qh, setT *vertices, boolT toporient,facetT *horizon) {
    -  facetT *newfacet;
    -  vertexT *vertex, **vertexp;
    -
    -  FOREACHvertex_(vertices) {
    -    if (!vertex->newlist) {
    -      qh_removevertex(qh, vertex);
    -      qh_appendvertex(qh, vertex);
    -    }
    -  }
    -  newfacet= qh_newfacet(qh);
    -  newfacet->vertices= vertices;
    -  newfacet->toporient= (unsigned char)toporient;
    -  if (horizon)
    -    qh_setappend(qh, &(newfacet->neighbors), horizon);
    -  qh_appendfacet(qh, newfacet);
    -  return(newfacet);
    -} /* makenewfacet */
    -
    -
    -/*---------------------------------
    -
    -  qh_makenewplanes()
    -    make new hyperplanes for facets on qh.newfacet_list
    -
    -  returns:
    -    all facets have hyperplanes or are marked for   merging
    -    doesn't create hyperplane if horizon is coplanar (will merge)
    -    updates qh.min_vertex if qh.JOGGLEmax
    -
    -  notes:
    -    facet->f.samecycle is defined for facet->mergehorizon facets
    -*/
    -void qh_makenewplanes(qhT *qh /* qh.newfacet_list */) {
    -  facetT *newfacet;
    -
    -  FORALLnew_facets {
    -    if (!newfacet->mergehorizon)
    -      qh_setfacetplane(qh, newfacet);
    -  }
    -  if (qh->JOGGLEmax < REALmax/2)
    -    minimize_(qh->min_vertex, -wwval_(Wnewvertexmax));
    -} /* makenewplanes */
    -
    -/*---------------------------------
    -
    -  qh_makenew_nonsimplicial(qh, visible, apex, numnew )
    -    make new facets for ridges of a visible facet
    -
    -  returns:
    -    first newfacet, bumps numnew as needed
    -    attaches new facets if !qh.ONLYgood
    -    marks ridge neighbors for simplicial visible
    -    if (qh.ONLYgood)
    -      ridges on newfacet, horizon, and visible
    -    else
    -      ridge and neighbors between newfacet and   horizon
    -      visible facet's ridges are deleted
    -
    -  notes:
    -    qh.visit_id if visible has already been processed
    -    sets neighbor->seen for building f.samecycle
    -      assumes all 'seen' flags initially false
    -
    -  design:
    -    for each ridge of visible facet
    -      get neighbor of visible facet
    -      if neighbor was already processed
    -        delete the ridge (will delete all visible facets later)
    -      if neighbor is a horizon facet
    -        create a new facet
    -        if neighbor coplanar
    -          adds newfacet to f.samecycle for later merging
    -        else
    -          updates neighbor's neighbor set
    -          (checks for non-simplicial facet with multiple ridges to visible facet)
    -        updates neighbor's ridge set
    -        (checks for simplicial neighbor to non-simplicial visible facet)
    -        (deletes ridge if neighbor is simplicial)
    -
    -*/
    -#ifndef qh_NOmerge
    -facetT *qh_makenew_nonsimplicial(qhT *qh, facetT *visible, vertexT *apex, int *numnew) {
    -  void **freelistp; /* used if !qh_NOmem by qh_memfree_() */
    -  ridgeT *ridge, **ridgep;
    -  facetT *neighbor, *newfacet= NULL, *samecycle;
    -  setT *vertices;
    -  boolT toporient;
    -  int ridgeid;
    -
    -  FOREACHridge_(visible->ridges) {
    -    ridgeid= ridge->id;
    -    neighbor= otherfacet_(ridge, visible);
    -    if (neighbor->visible) {
    -      if (!qh->ONLYgood) {
    -        if (neighbor->visitid == qh->visit_id) {
    -          qh_setfree(qh, &(ridge->vertices));  /* delete on 2nd visit */
    -          qh_memfree_(qh, ridge, (int)sizeof(ridgeT), freelistp);
    -        }
    -      }
    -    }else {  /* neighbor is an horizon facet */
    -      toporient= (ridge->top == visible);
    -      vertices= qh_setnew(qh, qh->hull_dim); /* makes sure this is quick */
    -      qh_setappend(qh, &vertices, apex);
    -      qh_setappend_set(qh, &vertices, ridge->vertices);
    -      newfacet= qh_makenewfacet(qh, vertices, toporient, neighbor);
    -      (*numnew)++;
    -      if (neighbor->coplanar) {
    -        newfacet->mergehorizon= True;
    -        if (!neighbor->seen) {
    -          newfacet->f.samecycle= newfacet;
    -          neighbor->f.newcycle= newfacet;
    -        }else {
    -          samecycle= neighbor->f.newcycle;
    -          newfacet->f.samecycle= samecycle->f.samecycle;
    -          samecycle->f.samecycle= newfacet;
    -        }
    -      }
    -      if (qh->ONLYgood) {
    -        if (!neighbor->simplicial)
    -          qh_setappend(qh, &(newfacet->ridges), ridge);
    -      }else {  /* qh_attachnewfacets */
    -        if (neighbor->seen) {
    -          if (neighbor->simplicial) {
    -            qh_fprintf(qh, qh->ferr, 6105, "qhull internal error (qh_makenew_nonsimplicial): simplicial f%d sharing two ridges with f%d\n",
    -                   neighbor->id, visible->id);
    -            qh_errexit2(qh, qh_ERRqhull, neighbor, visible);
    -          }
    -          qh_setappend(qh, &(neighbor->neighbors), newfacet);
    -        }else
    -          qh_setreplace(qh, neighbor->neighbors, visible, newfacet);
    -        if (neighbor->simplicial) {
    -          qh_setdel(neighbor->ridges, ridge);
    -          qh_setfree(qh, &(ridge->vertices));
    -          qh_memfree(qh, ridge, (int)sizeof(ridgeT));
    -        }else {
    -          qh_setappend(qh, &(newfacet->ridges), ridge);
    -          if (toporient)
    -            ridge->top= newfacet;
    -          else
    -            ridge->bottom= newfacet;
    -        }
    -      trace4((qh, qh->ferr, 4048, "qh_makenew_nonsimplicial: created facet f%d from v%d and r%d of horizon f%d\n",
    -            newfacet->id, apex->id, ridgeid, neighbor->id));
    -      }
    -    }
    -    neighbor->seen= True;
    -  } /* for each ridge */
    -  if (!qh->ONLYgood)
    -    SETfirst_(visible->ridges)= NULL;
    -  return newfacet;
    -} /* makenew_nonsimplicial */
    -#else /* qh_NOmerge */
    -facetT *qh_makenew_nonsimplicial(qhT *qh, facetT *visible, vertexT *apex, int *numnew) {
    -  return NULL;
    -}
    -#endif /* qh_NOmerge */
    -
    -/*---------------------------------
    -
    -  qh_makenew_simplicial(qh, visible, apex, numnew )
    -    make new facets for simplicial visible facet and apex
    -
    -  returns:
    -    attaches new facets if (!qh.ONLYgood)
    -      neighbors between newfacet and horizon
    -
    -  notes:
    -    nop if neighbor->seen or neighbor->visible(see qh_makenew_nonsimplicial)
    -
    -  design:
    -    locate neighboring horizon facet for visible facet
    -    determine vertices and orientation
    -    create new facet
    -    if coplanar,
    -      add new facet to f.samecycle
    -    update horizon facet's neighbor list
    -*/
    -facetT *qh_makenew_simplicial(qhT *qh, facetT *visible, vertexT *apex, int *numnew) {
    -  facetT *neighbor, **neighborp, *newfacet= NULL;
    -  setT *vertices;
    -  boolT flip, toporient;
    -  int horizonskip= 0, visibleskip= 0;
    -
    -  FOREACHneighbor_(visible) {
    -    if (!neighbor->seen && !neighbor->visible) {
    -      vertices= qh_facetintersect(qh, neighbor,visible, &horizonskip, &visibleskip, 1);
    -      SETfirst_(vertices)= apex;
    -      flip= ((horizonskip & 0x1) ^ (visibleskip & 0x1));
    -      if (neighbor->toporient)
    -        toporient= horizonskip & 0x1;
    -      else
    -        toporient= (horizonskip & 0x1) ^ 0x1;
    -      newfacet= qh_makenewfacet(qh, vertices, toporient, neighbor);
    -      (*numnew)++;
    -      if (neighbor->coplanar && (qh->PREmerge || qh->MERGEexact)) {
    -#ifndef qh_NOmerge
    -        newfacet->f.samecycle= newfacet;
    -        newfacet->mergehorizon= True;
    -#endif
    -      }
    -      if (!qh->ONLYgood)
    -        SETelem_(neighbor->neighbors, horizonskip)= newfacet;
    -      trace4((qh, qh->ferr, 4049, "qh_makenew_simplicial: create facet f%d top %d from v%d and horizon f%d skip %d top %d and visible f%d skip %d, flip? %d\n",
    -            newfacet->id, toporient, apex->id, neighbor->id, horizonskip,
    -              neighbor->toporient, visible->id, visibleskip, flip));
    -    }
    -  }
    -  return newfacet;
    -} /* makenew_simplicial */
    -
    -/*---------------------------------
    -
    -  qh_matchneighbor(qh, newfacet, newskip, hashsize, hashcount )
    -    either match subridge of newfacet with neighbor or add to hash_table
    -
    -  returns:
    -    duplicate ridges are unmatched and marked by qh_DUPLICATEridge
    -
    -  notes:
    -    ridge is newfacet->vertices w/o newskip vertex
    -    do not allocate memory (need to free hash_table cleanly)
    -    uses linear hash chains
    -
    -  see also:
    -    qh_matchduplicates
    -
    -  design:
    -    for each possible matching facet in qh.hash_table
    -      if vertices match
    -        set ismatch, if facets have opposite orientation
    -        if ismatch and matching facet doesn't have a match
    -          match the facets by updating their neighbor sets
    -        else
    -          indicate a duplicate ridge
    -          set facet hyperplane for later testing
    -          add facet to hashtable
    -          unless the other facet was already a duplicate ridge
    -            mark both facets with a duplicate ridge
    -            add other facet (if defined) to hash table
    -*/
    -void qh_matchneighbor(qhT *qh, facetT *newfacet, int newskip, int hashsize, int *hashcount) {
    -  boolT newfound= False;   /* True, if new facet is already in hash chain */
    -  boolT same, ismatch;
    -  int hash, scan;
    -  facetT *facet, *matchfacet;
    -  int skip, matchskip;
    -
    -  hash= qh_gethash(qh, hashsize, newfacet->vertices, qh->hull_dim, 1,
    -                     SETelem_(newfacet->vertices, newskip));
    -  trace4((qh, qh->ferr, 4050, "qh_matchneighbor: newfacet f%d skip %d hash %d hashcount %d\n",
    -          newfacet->id, newskip, hash, *hashcount));
    -  zinc_(Zhashlookup);
    -  for (scan= hash; (facet= SETelemt_(qh->hash_table, scan, facetT));
    -       scan= (++scan >= hashsize ? 0 : scan)) {
    -    if (facet == newfacet) {
    -      newfound= True;
    -      continue;
    -    }
    -    zinc_(Zhashtests);
    -    if (qh_matchvertices(qh, 1, newfacet->vertices, newskip, facet->vertices, &skip, &same)) {
    -      if (SETelem_(newfacet->vertices, newskip) ==
    -          SETelem_(facet->vertices, skip)) {
    -        qh_precision(qh, "two facets with the same vertices");
    -        qh_fprintf(qh, qh->ferr, 6106, "qhull precision error: Vertex sets are the same for f%d and f%d.  Can not force output.\n",
    -          facet->id, newfacet->id);
    -        qh_errexit2(qh, qh_ERRprec, facet, newfacet);
    -      }
    -      ismatch= (same == (boolT)((newfacet->toporient ^ facet->toporient)));
    -      matchfacet= SETelemt_(facet->neighbors, skip, facetT);
    -      if (ismatch && !matchfacet) {
    -        SETelem_(facet->neighbors, skip)= newfacet;
    -        SETelem_(newfacet->neighbors, newskip)= facet;
    -        (*hashcount)--;
    -        trace4((qh, qh->ferr, 4051, "qh_matchneighbor: f%d skip %d matched with new f%d skip %d\n",
    -           facet->id, skip, newfacet->id, newskip));
    -        return;
    -      }
    -      if (!qh->PREmerge && !qh->MERGEexact) {
    -        qh_precision(qh, "a ridge with more than two neighbors");
    -        qh_fprintf(qh, qh->ferr, 6107, "qhull precision error: facets f%d, f%d and f%d meet at a ridge with more than 2 neighbors.  Can not continue.\n",
    -                 facet->id, newfacet->id, getid_(matchfacet));
    -        qh_errexit2(qh, qh_ERRprec, facet, newfacet);
    -      }
    -      SETelem_(newfacet->neighbors, newskip)= qh_DUPLICATEridge;
    -      newfacet->dupridge= True;
    -      if (!newfacet->normal)
    -        qh_setfacetplane(qh, newfacet);
    -      qh_addhash(newfacet, qh->hash_table, hashsize, hash);
    -      (*hashcount)++;
    -      if (!facet->normal)
    -        qh_setfacetplane(qh, facet);
    -      if (matchfacet != qh_DUPLICATEridge) {
    -        SETelem_(facet->neighbors, skip)= qh_DUPLICATEridge;
    -        facet->dupridge= True;
    -        if (!facet->normal)
    -          qh_setfacetplane(qh, facet);
    -        if (matchfacet) {
    -          matchskip= qh_setindex(matchfacet->neighbors, facet);
    -          if (matchskip<0) {
    -              qh_fprintf(qh, qh->ferr, 6260, "qhull internal error (qh_matchneighbor): matchfacet f%d is in f%d neighbors but not vice versa.  Can not continue.\n",
    -                  matchfacet->id, facet->id);
    -              qh_errexit2(qh, qh_ERRqhull, matchfacet, facet);
    -          }
    -          SETelem_(matchfacet->neighbors, matchskip)= qh_DUPLICATEridge; /* matchskip>=0 by QH6260 */
    -          matchfacet->dupridge= True;
    -          if (!matchfacet->normal)
    -            qh_setfacetplane(qh, matchfacet);
    -          qh_addhash(matchfacet, qh->hash_table, hashsize, hash);
    -          *hashcount += 2;
    -        }
    -      }
    -      trace4((qh, qh->ferr, 4052, "qh_matchneighbor: new f%d skip %d duplicates ridge for f%d skip %d matching f%d ismatch %d at hash %d\n",
    -           newfacet->id, newskip, facet->id, skip,
    -           (matchfacet == qh_DUPLICATEridge ? -2 : getid_(matchfacet)),
    -           ismatch, hash));
    -      return; /* end of duplicate ridge */
    -    }
    -  }
    -  if (!newfound)
    -    SETelem_(qh->hash_table, scan)= newfacet;  /* same as qh_addhash */
    -  (*hashcount)++;
    -  trace4((qh, qh->ferr, 4053, "qh_matchneighbor: no match for f%d skip %d at hash %d\n",
    -           newfacet->id, newskip, hash));
    -} /* matchneighbor */
    -
    -
    -/*---------------------------------
    -
    -  qh_matchnewfacets()
    -    match newfacets in qh.newfacet_list to their newfacet neighbors
    -
    -  returns:
    -    qh.newfacet_list with full neighbor sets
    -      get vertices with nth neighbor by deleting nth vertex
    -    if qh.PREmerge/MERGEexact or qh.FORCEoutput
    -      sets facet->flippped if flipped normal (also prevents point partitioning)
    -    if duplicate ridges and qh.PREmerge/MERGEexact
    -      sets facet->dupridge
    -      missing neighbor links identifies extra ridges to be merging (qh_MERGEridge)
    -
    -  notes:
    -    newfacets already have neighbor[0] (horizon facet)
    -    assumes qh.hash_table is NULL
    -    vertex->neighbors has not been updated yet
    -    do not allocate memory after qh.hash_table (need to free it cleanly)
    -
    -  design:
    -    delete neighbor sets for all new facets
    -    initialize a hash table
    -    for all new facets
    -      match facet with neighbors
    -    if unmatched facets (due to duplicate ridges)
    -      for each new facet with a duplicate ridge
    -        match it with a facet
    -    check for flipped facets
    -*/
    -void qh_matchnewfacets(qhT *qh /* qh.newfacet_list */) {
    -  int numnew=0, hashcount=0, newskip;
    -  facetT *newfacet, *neighbor;
    -  int dim= qh->hull_dim, hashsize, neighbor_i, neighbor_n;
    -  setT *neighbors;
    -#ifndef qh_NOtrace
    -  int facet_i, facet_n, numfree= 0;
    -  facetT *facet;
    -#endif
    -
    -  trace1((qh, qh->ferr, 1019, "qh_matchnewfacets: match neighbors for new facets.\n"));
    -  FORALLnew_facets {
    -    numnew++;
    -    {  /* inline qh_setzero(qh, newfacet->neighbors, 1, qh->hull_dim); */
    -      neighbors= newfacet->neighbors;
    -      neighbors->e[neighbors->maxsize].i= dim+1; /*may be overwritten*/
    -      memset((char *)SETelemaddr_(neighbors, 1, void), 0, dim * SETelemsize);
    -    }
    -  }
    -
    -  qh_newhashtable(qh, numnew*(qh->hull_dim-1)); /* twice what is normally needed,
    -                                     but every ridge could be DUPLICATEridge */
    -  hashsize= qh_setsize(qh, qh->hash_table);
    -  FORALLnew_facets {
    -    for (newskip=1; newskiphull_dim; newskip++) /* furthest/horizon already matched */
    -      /* hashsize>0 because hull_dim>1 and numnew>0 */
    -      qh_matchneighbor(qh, newfacet, newskip, hashsize, &hashcount);
    -#if 0   /* use the following to trap hashcount errors */
    -    {
    -      int count= 0, k;
    -      facetT *facet, *neighbor;
    -
    -      count= 0;
    -      FORALLfacet_(qh->newfacet_list) {  /* newfacet already in use */
    -        for (k=1; k < qh->hull_dim; k++) {
    -          neighbor= SETelemt_(facet->neighbors, k, facetT);
    -          if (!neighbor || neighbor == qh_DUPLICATEridge)
    -            count++;
    -        }
    -        if (facet == newfacet)
    -          break;
    -      }
    -      if (count != hashcount) {
    -        qh_fprintf(qh, qh->ferr, 8088, "qh_matchnewfacets: after adding facet %d, hashcount %d != count %d\n",
    -                 newfacet->id, hashcount, count);
    -        qh_errexit(qh, qh_ERRqhull, newfacet, NULL);
    -      }
    -    }
    -#endif  /* end of trap code */
    -  }
    -  if (hashcount) {
    -    FORALLnew_facets {
    -      if (newfacet->dupridge) {
    -        FOREACHneighbor_i_(qh, newfacet) {
    -          if (neighbor == qh_DUPLICATEridge) {
    -            qh_matchduplicates(qh, newfacet, neighbor_i, hashsize, &hashcount);
    -                    /* this may report MERGEfacet */
    -          }
    -        }
    -      }
    -    }
    -  }
    -  if (hashcount) {
    -    qh_fprintf(qh, qh->ferr, 6108, "qhull internal error (qh_matchnewfacets): %d neighbors did not match up\n",
    -        hashcount);
    -    qh_printhashtable(qh, qh->ferr);
    -    qh_errexit(qh, qh_ERRqhull, NULL, NULL);
    -  }
    -#ifndef qh_NOtrace
    -  if (qh->IStracing >= 2) {
    -    FOREACHfacet_i_(qh, qh->hash_table) {
    -      if (!facet)
    -        numfree++;
    -    }
    -    qh_fprintf(qh, qh->ferr, 8089, "qh_matchnewfacets: %d new facets, %d unused hash entries .  hashsize %d\n",
    -             numnew, numfree, qh_setsize(qh, qh->hash_table));
    -  }
    -#endif /* !qh_NOtrace */
    -  qh_setfree(qh, &qh->hash_table);
    -  if (qh->PREmerge || qh->MERGEexact) {
    -    if (qh->IStracing >= 4)
    -      qh_printfacetlist(qh, qh->newfacet_list, NULL, qh_ALL);
    -    FORALLnew_facets {
    -      if (newfacet->normal)
    -        qh_checkflipped(qh, newfacet, NULL, qh_ALL);
    -    }
    -  }else if (qh->FORCEoutput)
    -    qh_checkflipped_all(qh, qh->newfacet_list);  /* prints warnings for flipped */
    -} /* matchnewfacets */
    -
    -
    -/*---------------------------------
    -
    -  qh_matchvertices(qh, firstindex, verticesA, skipA, verticesB, skipB, same )
    -    tests whether vertices match with a single skip
    -    starts match at firstindex since all new facets have a common vertex
    -
    -  returns:
    -    true if matched vertices
    -    skip index for each set
    -    sets same iff vertices have the same orientation
    -
    -  notes:
    -    assumes skipA is in A and both sets are the same size
    -
    -  design:
    -    set up pointers
    -    scan both sets checking for a match
    -    test orientation
    -*/
    -boolT qh_matchvertices(qhT *qh, int firstindex, setT *verticesA, int skipA,
    -       setT *verticesB, int *skipB, boolT *same) {
    -  vertexT **elemAp, **elemBp, **skipBp=NULL, **skipAp;
    -
    -  elemAp= SETelemaddr_(verticesA, firstindex, vertexT);
    -  elemBp= SETelemaddr_(verticesB, firstindex, vertexT);
    -  skipAp= SETelemaddr_(verticesA, skipA, vertexT);
    -  do if (elemAp != skipAp) {
    -    while (*elemAp != *elemBp++) {
    -      if (skipBp)
    -        return False;
    -      skipBp= elemBp;  /* one extra like FOREACH */
    -    }
    -  }while (*(++elemAp));
    -  if (!skipBp)
    -    skipBp= ++elemBp;
    -  *skipB= SETindex_(verticesB, skipB); /* i.e., skipBp - verticesB */
    -  *same= !((skipA & 0x1) ^ (*skipB & 0x1)); /* result is 0 or 1 */
    -  trace4((qh, qh->ferr, 4054, "qh_matchvertices: matched by skip %d(v%d) and skip %d(v%d) same? %d\n",
    -          skipA, (*skipAp)->id, *skipB, (*(skipBp-1))->id, *same));
    -  return(True);
    -} /* matchvertices */
    -
    -/*---------------------------------
    -
    -  qh_newfacet(qh)
    -    return a new facet
    -
    -  returns:
    -    all fields initialized or cleared   (NULL)
    -    preallocates neighbors set
    -*/
    -facetT *qh_newfacet(qhT *qh) {
    -  facetT *facet;
    -  void **freelistp; /* used if !qh_NOmem by qh_memalloc_() */
    -
    -  qh_memalloc_(qh, (int)sizeof(facetT), freelistp, facet, facetT);
    -  memset((char *)facet, (size_t)0, sizeof(facetT));
    -  if (qh->facet_id == qh->tracefacet_id)
    -    qh->tracefacet= facet;
    -  facet->id= qh->facet_id++;
    -  facet->neighbors= qh_setnew(qh, qh->hull_dim);
    -#if !qh_COMPUTEfurthest
    -  facet->furthestdist= 0.0;
    -#endif
    -#if qh_MAXoutside
    -  if (qh->FORCEoutput && qh->APPROXhull)
    -    facet->maxoutside= qh->MINoutside;
    -  else
    -    facet->maxoutside= qh->DISTround;
    -#endif
    -  facet->simplicial= True;
    -  facet->good= True;
    -  facet->newfacet= True;
    -  trace4((qh, qh->ferr, 4055, "qh_newfacet: created facet f%d\n", facet->id));
    -  return(facet);
    -} /* newfacet */
    -
    -
    -/*---------------------------------
    -
    -  qh_newridge()
    -    return a new ridge
    -*/
    -ridgeT *qh_newridge(qhT *qh) {
    -  ridgeT *ridge;
    -  void **freelistp;   /* used if !qh_NOmem by qh_memalloc_() */
    -
    -  qh_memalloc_(qh, (int)sizeof(ridgeT), freelistp, ridge, ridgeT);
    -  memset((char *)ridge, (size_t)0, sizeof(ridgeT));
    -  zinc_(Ztotridges);
    -  if (qh->ridge_id == UINT_MAX) {
    -    qh_fprintf(qh, qh->ferr, 7074, "\
    -qhull warning: more than 2^32 ridges.  Qhull results are OK.  Since the ridge ID wraps around to 0, two ridges may have the same identifier.\n");
    -  }
    -  ridge->id= qh->ridge_id++;
    -  trace4((qh, qh->ferr, 4056, "qh_newridge: created ridge r%d\n", ridge->id));
    -  return(ridge);
    -} /* newridge */
    -
    -
    -/*---------------------------------
    -
    -  qh_pointid(qh, point )
    -    return id for a point,
    -    returns qh_IDnone(-3) if null, qh_IDinterior(-2) if interior, or qh_IDunknown(-1) if not known
    -
    -  alternative code if point is in qh.first_point...
    -    unsigned long id;
    -    id= ((unsigned long)point - (unsigned long)qh.first_point)/qh.normal_size;
    -
    -  notes:
    -    Valid points are non-negative
    -    WARN64 -- id truncated to 32-bits, at most 2G points
    -    NOerrors returned (QhullPoint::id)
    -    if point not in point array
    -      the code does a comparison of unrelated pointers.
    -*/
    -int qh_pointid(qhT *qh, pointT *point) {
    -  ptr_intT offset, id;
    -
    -  if (!point || !qh)
    -    return qh_IDnone;
    -  else if (point == qh->interior_point)
    -    return qh_IDinterior;
    -  else if (point >= qh->first_point
    -  && point < qh->first_point + qh->num_points * qh->hull_dim) {
    -    offset= (ptr_intT)(point - qh->first_point);
    -    id= offset / qh->hull_dim;
    -  }else if ((id= qh_setindex(qh->other_points, point)) != -1)
    -    id += qh->num_points;
    -  else
    -    return qh_IDunknown;
    -  return (int)id;
    -} /* pointid */
    -
    -/*---------------------------------
    -
    -  qh_removefacet(qh, facet )
    -    unlinks facet from qh.facet_list,
    -
    -  returns:
    -    updates qh.facet_list .newfacet_list .facet_next visible_list
    -    decrements qh.num_facets
    -
    -  see:
    -    qh_appendfacet
    -*/
    -void qh_removefacet(qhT *qh, facetT *facet) {
    -  facetT *next= facet->next, *previous= facet->previous;
    -
    -  if (facet == qh->newfacet_list)
    -    qh->newfacet_list= next;
    -  if (facet == qh->facet_next)
    -    qh->facet_next= next;
    -  if (facet == qh->visible_list)
    -    qh->visible_list= next;
    -  if (previous) {
    -    previous->next= next;
    -    next->previous= previous;
    -  }else {  /* 1st facet in qh->facet_list */
    -    qh->facet_list= next;
    -    qh->facet_list->previous= NULL;
    -  }
    -  qh->num_facets--;
    -  trace4((qh, qh->ferr, 4057, "qh_removefacet: remove f%d from facet_list\n", facet->id));
    -} /* removefacet */
    -
    -
    -/*---------------------------------
    -
    -  qh_removevertex(qh, vertex )
    -    unlinks vertex from qh.vertex_list,
    -
    -  returns:
    -    updates qh.vertex_list .newvertex_list
    -    decrements qh.num_vertices
    -*/
    -void qh_removevertex(qhT *qh, vertexT *vertex) {
    -  vertexT *next= vertex->next, *previous= vertex->previous;
    -
    -  if (vertex == qh->newvertex_list)
    -    qh->newvertex_list= next;
    -  if (previous) {
    -    previous->next= next;
    -    next->previous= previous;
    -  }else {  /* 1st vertex in qh->vertex_list */
    -    qh->vertex_list= vertex->next;
    -    qh->vertex_list->previous= NULL;
    -  }
    -  qh->num_vertices--;
    -  trace4((qh, qh->ferr, 4058, "qh_removevertex: remove v%d from vertex_list\n", vertex->id));
    -} /* removevertex */
    -
    -
    -/*---------------------------------
    -
    -  qh_updatevertices()
    -    update vertex neighbors and delete interior vertices
    -
    -  returns:
    -    if qh.VERTEXneighbors, updates neighbors for each vertex
    -      if qh.newvertex_list,
    -         removes visible neighbors  from vertex neighbors
    -      if qh.newfacet_list
    -         adds new facets to vertex neighbors
    -    if qh.visible_list
    -       interior vertices added to qh.del_vertices for later partitioning
    -
    -  design:
    -    if qh.VERTEXneighbors
    -      deletes references to visible facets from vertex neighbors
    -      appends new facets to the neighbor list for each vertex
    -      checks all vertices of visible facets
    -        removes visible facets from neighbor lists
    -        marks unused vertices for deletion
    -*/
    -void qh_updatevertices(qhT *qh /*qh.newvertex_list, newfacet_list, visible_list*/) {
    -  facetT *newfacet= NULL, *neighbor, **neighborp, *visible;
    -  vertexT *vertex, **vertexp;
    -
    -  trace3((qh, qh->ferr, 3013, "qh_updatevertices: delete interior vertices and update vertex->neighbors\n"));
    -  if (qh->VERTEXneighbors) {
    -    FORALLvertex_(qh->newvertex_list) {
    -      FOREACHneighbor_(vertex) {
    -        if (neighbor->visible)
    -          SETref_(neighbor)= NULL;
    -      }
    -      qh_setcompact(qh, vertex->neighbors);
    -    }
    -    FORALLnew_facets {
    -      FOREACHvertex_(newfacet->vertices)
    -        qh_setappend(qh, &vertex->neighbors, newfacet);
    -    }
    -    FORALLvisible_facets {
    -      FOREACHvertex_(visible->vertices) {
    -        if (!vertex->newlist && !vertex->deleted) {
    -          FOREACHneighbor_(vertex) { /* this can happen under merging */
    -            if (!neighbor->visible)
    -              break;
    -          }
    -          if (neighbor)
    -            qh_setdel(vertex->neighbors, visible);
    -          else {
    -            vertex->deleted= True;
    -            qh_setappend(qh, &qh->del_vertices, vertex);
    -            trace2((qh, qh->ferr, 2041, "qh_updatevertices: delete vertex p%d(v%d) in f%d\n",
    -                  qh_pointid(qh, vertex->point), vertex->id, visible->id));
    -          }
    -        }
    -      }
    -    }
    -  }else {  /* !VERTEXneighbors */
    -    FORALLvisible_facets {
    -      FOREACHvertex_(visible->vertices) {
    -        if (!vertex->newlist && !vertex->deleted) {
    -          vertex->deleted= True;
    -          qh_setappend(qh, &qh->del_vertices, vertex);
    -          trace2((qh, qh->ferr, 2042, "qh_updatevertices: delete vertex p%d(v%d) in f%d\n",
    -                  qh_pointid(qh, vertex->point), vertex->id, visible->id));
    -        }
    -      }
    -    }
    -  }
    -} /* updatevertices */
    -
    -
    -
    diff --git a/src/qhull/src/libqhull_r/poly_r.h b/src/qhull/src/libqhull_r/poly_r.h
    deleted file mode 100644
    index c71511bd692..00000000000
    --- a/src/qhull/src/libqhull_r/poly_r.h
    +++ /dev/null
    @@ -1,303 +0,0 @@
    -/*
      ---------------------------------
    -
    -   poly_r.h
    -   header file for poly_r.c and poly2_r.c
    -
    -   see qh-poly_r.htm, libqhull_r.h and poly_r.c
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull_r/poly_r.h#5 $$Change: 2079 $
    -   $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -*/
    -
    -#ifndef qhDEFpoly
    -#define qhDEFpoly 1
    -
    -#include "libqhull_r.h"
    -
    -/*===============   constants ========================== */
    -
    -/*----------------------------------
    -
    -  ALGORITHMfault
    -    use as argument to checkconvex() to report errors during buildhull
    -*/
    -#define qh_ALGORITHMfault 0
    -
    -/*----------------------------------
    -
    -  DATAfault
    -    use as argument to checkconvex() to report errors during initialhull
    -*/
    -#define qh_DATAfault 1
    -
    -/*----------------------------------
    -
    -  DUPLICATEridge
    -    special value for facet->neighbor to indicate a duplicate ridge
    -
    -  notes:
    -    set by matchneighbor, used by matchmatch and mark_dupridge
    -*/
    -#define qh_DUPLICATEridge (facetT *)1L
    -
    -/*----------------------------------
    -
    -  MERGEridge       flag in facet
    -    special value for facet->neighbor to indicate a merged ridge
    -
    -  notes:
    -    set by matchneighbor, used by matchmatch and mark_dupridge
    -*/
    -#define qh_MERGEridge (facetT *)2L
    -
    -
    -/*============ -structures- ====================*/
    -
    -/*=========== -macros- =========================*/
    -
    -/*----------------------------------
    -
    -  FORALLfacet_( facetlist ) { ... }
    -    assign 'facet' to each facet in facetlist
    -
    -  notes:
    -    uses 'facetT *facet;'
    -    assumes last facet is a sentinel
    -
    -  see:
    -    FORALLfacets
    -*/
    -#define FORALLfacet_( facetlist ) if (facetlist ) for ( facet=( facetlist ); facet && facet->next; facet= facet->next )
    -
    -/*----------------------------------
    -
    -  FORALLnew_facets { ... }
    -    assign 'newfacet' to each facet in qh.newfacet_list
    -
    -  notes:
    -    uses 'facetT *newfacet;'
    -    at exit, newfacet==NULL
    -*/
    -#define FORALLnew_facets for ( newfacet=qh->newfacet_list;newfacet && newfacet->next;newfacet=newfacet->next )
    -
    -/*----------------------------------
    -
    -  FORALLvertex_( vertexlist ) { ... }
    -    assign 'vertex' to each vertex in vertexlist
    -
    -  notes:
    -    uses 'vertexT *vertex;'
    -    at exit, vertex==NULL
    -*/
    -#define FORALLvertex_( vertexlist ) for (vertex=( vertexlist );vertex && vertex->next;vertex= vertex->next )
    -
    -/*----------------------------------
    -
    -  FORALLvisible_facets { ... }
    -    assign 'visible' to each visible facet in qh.visible_list
    -
    -  notes:
    -    uses 'vacetT *visible;'
    -    at exit, visible==NULL
    -*/
    -#define FORALLvisible_facets for (visible=qh->visible_list; visible && visible->visible; visible= visible->next)
    -
    -/*----------------------------------
    -
    -  FORALLsame_( newfacet ) { ... }
    -    assign 'same' to each facet in newfacet->f.samecycle
    -
    -  notes:
    -    uses 'facetT *same;'
    -    stops when it returns to newfacet
    -*/
    -#define FORALLsame_(newfacet) for (same= newfacet->f.samecycle; same != newfacet; same= same->f.samecycle)
    -
    -/*----------------------------------
    -
    -  FORALLsame_cycle_( newfacet ) { ... }
    -    assign 'same' to each facet in newfacet->f.samecycle
    -
    -  notes:
    -    uses 'facetT *same;'
    -    at exit, same == NULL
    -*/
    -#define FORALLsame_cycle_(newfacet) \
    -     for (same= newfacet->f.samecycle; \
    -         same; same= (same == newfacet ?  NULL : same->f.samecycle))
    -
    -/*----------------------------------
    -
    -  FOREACHneighborA_( facet ) { ... }
    -    assign 'neighborA' to each neighbor in facet->neighbors
    -
    -  FOREACHneighborA_( vertex ) { ... }
    -    assign 'neighborA' to each neighbor in vertex->neighbors
    -
    -  declare:
    -    facetT *neighborA, **neighborAp;
    -
    -  see:
    -    FOREACHsetelement_
    -*/
    -#define FOREACHneighborA_(facet)  FOREACHsetelement_(facetT, facet->neighbors, neighborA)
    -
    -/*----------------------------------
    -
    -  FOREACHvisible_( facets ) { ... }
    -    assign 'visible' to each facet in facets
    -
    -  notes:
    -    uses 'facetT *facet, *facetp;'
    -    see FOREACHsetelement_
    -*/
    -#define FOREACHvisible_(facets) FOREACHsetelement_(facetT, facets, visible)
    -
    -/*----------------------------------
    -
    -  FOREACHnewfacet_( facets ) { ... }
    -    assign 'newfacet' to each facet in facets
    -
    -  notes:
    -    uses 'facetT *newfacet, *newfacetp;'
    -    see FOREACHsetelement_
    -*/
    -#define FOREACHnewfacet_(facets) FOREACHsetelement_(facetT, facets, newfacet)
    -
    -/*----------------------------------
    -
    -  FOREACHvertexA_( vertices ) { ... }
    -    assign 'vertexA' to each vertex in vertices
    -
    -  notes:
    -    uses 'vertexT *vertexA, *vertexAp;'
    -    see FOREACHsetelement_
    -*/
    -#define FOREACHvertexA_(vertices) FOREACHsetelement_(vertexT, vertices, vertexA)
    -
    -/*----------------------------------
    -
    -  FOREACHvertexreverse12_( vertices ) { ... }
    -    assign 'vertex' to each vertex in vertices
    -    reverse order of first two vertices
    -
    -  notes:
    -    uses 'vertexT *vertex, *vertexp;'
    -    see FOREACHsetelement_
    -*/
    -#define FOREACHvertexreverse12_(vertices) FOREACHsetelementreverse12_(vertexT, vertices, vertex)
    -
    -
    -/*=============== prototypes poly_r.c in alphabetical order ================*/
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -void    qh_appendfacet(qhT *qh, facetT *facet);
    -void    qh_appendvertex(qhT *qh, vertexT *vertex);
    -void    qh_attachnewfacets(qhT *qh /* qh.visible_list, qh.newfacet_list */);
    -boolT   qh_checkflipped(qhT *qh, facetT *facet, realT *dist, boolT allerror);
    -void    qh_delfacet(qhT *qh, facetT *facet);
    -void    qh_deletevisible(qhT *qh /* qh.visible_list, qh.horizon_list */);
    -setT   *qh_facetintersect(qhT *qh, facetT *facetA, facetT *facetB, int *skipAp,int *skipBp, int extra);
    -int     qh_gethash(qhT *qh, int hashsize, setT *set, int size, int firstindex, void *skipelem);
    -facetT *qh_makenewfacet(qhT *qh, setT *vertices, boolT toporient, facetT *facet);
    -void    qh_makenewplanes(qhT *qh /* qh.newfacet_list */);
    -facetT *qh_makenew_nonsimplicial(qhT *qh, facetT *visible, vertexT *apex, int *numnew);
    -facetT *qh_makenew_simplicial(qhT *qh, facetT *visible, vertexT *apex, int *numnew);
    -void    qh_matchneighbor(qhT *qh, facetT *newfacet, int newskip, int hashsize,
    -                          int *hashcount);
    -void    qh_matchnewfacets(qhT *qh);
    -boolT   qh_matchvertices(qhT *qh, int firstindex, setT *verticesA, int skipA,
    -                          setT *verticesB, int *skipB, boolT *same);
    -facetT *qh_newfacet(qhT *qh);
    -ridgeT *qh_newridge(qhT *qh);
    -int     qh_pointid(qhT *qh, pointT *point);
    -void    qh_removefacet(qhT *qh, facetT *facet);
    -void    qh_removevertex(qhT *qh, vertexT *vertex);
    -void    qh_updatevertices(qhT *qh);
    -
    -
    -/*========== -prototypes poly2_r.c in alphabetical order ===========*/
    -
    -void    qh_addhash(void *newelem, setT *hashtable, int hashsize, int hash);
    -void    qh_check_bestdist(qhT *qh);
    -void    qh_check_dupridge(qhT *qh, facetT *facet1, realT dist1, facetT *facet2, realT dist2);
    -void    qh_check_maxout(qhT *qh);
    -void    qh_check_output(qhT *qh);
    -void    qh_check_point(qhT *qh, pointT *point, facetT *facet, realT *maxoutside, realT *maxdist, facetT **errfacet1, facetT **errfacet2);
    -void    qh_check_points(qhT *qh);
    -void    qh_checkconvex(qhT *qh, facetT *facetlist, int fault);
    -void    qh_checkfacet(qhT *qh, facetT *facet, boolT newmerge, boolT *waserrorp);
    -void    qh_checkflipped_all(qhT *qh, facetT *facetlist);
    -void    qh_checkpolygon(qhT *qh, facetT *facetlist);
    -void    qh_checkvertex(qhT *qh, vertexT *vertex);
    -void    qh_clearcenters(qhT *qh, qh_CENTER type);
    -void    qh_createsimplex(qhT *qh, setT *vertices);
    -void    qh_delridge(qhT *qh, ridgeT *ridge);
    -void    qh_delvertex(qhT *qh, vertexT *vertex);
    -setT   *qh_facet3vertex(qhT *qh, facetT *facet);
    -facetT *qh_findbestfacet(qhT *qh, pointT *point, boolT bestoutside,
    -           realT *bestdist, boolT *isoutside);
    -facetT *qh_findbestlower(qhT *qh, facetT *upperfacet, pointT *point, realT *bestdistp, int *numpart);
    -facetT *qh_findfacet_all(qhT *qh, pointT *point, realT *bestdist, boolT *isoutside,
    -                          int *numpart);
    -int     qh_findgood(qhT *qh, facetT *facetlist, int goodhorizon);
    -void    qh_findgood_all(qhT *qh, facetT *facetlist);
    -void    qh_furthestnext(qhT *qh /* qh.facet_list */);
    -void    qh_furthestout(qhT *qh, facetT *facet);
    -void    qh_infiniteloop(qhT *qh, facetT *facet);
    -void    qh_initbuild(qhT *qh);
    -void    qh_initialhull(qhT *qh, setT *vertices);
    -setT   *qh_initialvertices(qhT *qh, int dim, setT *maxpoints, pointT *points, int numpoints);
    -vertexT *qh_isvertex(pointT *point, setT *vertices);
    -vertexT *qh_makenewfacets(qhT *qh, pointT *point /*horizon_list, visible_list*/);
    -void    qh_matchduplicates(qhT *qh, facetT *atfacet, int atskip, int hashsize, int *hashcount);
    -void    qh_nearcoplanar(qhT *qh /* qh.facet_list */);
    -vertexT *qh_nearvertex(qhT *qh, facetT *facet, pointT *point, realT *bestdistp);
    -int     qh_newhashtable(qhT *qh, int newsize);
    -vertexT *qh_newvertex(qhT *qh, pointT *point);
    -ridgeT *qh_nextridge3d(ridgeT *atridge, facetT *facet, vertexT **vertexp);
    -void    qh_outcoplanar(qhT *qh /* qh.facet_list */);
    -pointT *qh_point(qhT *qh, int id);
    -void    qh_point_add(qhT *qh, setT *set, pointT *point, void *elem);
    -setT   *qh_pointfacet(qhT *qh /*qh.facet_list*/);
    -setT   *qh_pointvertex(qhT *qh /*qh.facet_list*/);
    -void    qh_prependfacet(qhT *qh, facetT *facet, facetT **facetlist);
    -void    qh_printhashtable(qhT *qh, FILE *fp);
    -void    qh_printlists(qhT *qh);
    -void    qh_resetlists(qhT *qh, boolT stats, boolT resetVisible /*qh.newvertex_list qh.newfacet_list qh.visible_list*/);
    -void    qh_setvoronoi_all(qhT *qh);
    -void    qh_triangulate(qhT *qh /*qh.facet_list*/);
    -void    qh_triangulate_facet(qhT *qh, facetT *facetA, vertexT **first_vertex);
    -void    qh_triangulate_link(qhT *qh, facetT *oldfacetA, facetT *facetA, facetT *oldfacetB, facetT *facetB);
    -void    qh_triangulate_mirror(qhT *qh, facetT *facetA, facetT *facetB);
    -void    qh_triangulate_null(qhT *qh, facetT *facetA);
    -void    qh_vertexintersect(qhT *qh, setT **vertexsetA,setT *vertexsetB);
    -setT   *qh_vertexintersect_new(qhT *qh, setT *vertexsetA,setT *vertexsetB);
    -void    qh_vertexneighbors(qhT *qh /*qh.facet_list*/);
    -boolT   qh_vertexsubset(setT *vertexsetA, setT *vertexsetB);
    -
    -#ifdef __cplusplus
    -} /* extern "C" */
    -#endif
    -
    -#endif /* qhDEFpoly */
    diff --git a/src/qhull/src/libqhull_r/qh-geom_r.htm b/src/qhull/src/libqhull_r/qh-geom_r.htm
    deleted file mode 100644
    index eeefc0c7584..00000000000
    --- a/src/qhull/src/libqhull_r/qh-geom_r.htm
    +++ /dev/null
    @@ -1,295 +0,0 @@
    -
    -
    -
    -
    -geom_r.c, geom2_r.c -- geometric and floating point routines
    -
    -
    -
    -
    -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser -

    - -
    - - -

    geom_r.c, geom2_r.c, random_r.c -- geometric and floating point routines

    -
    -

    Geometrically, a vertex is a point with d coordinates -and a facet is a halfspace. A halfspace is defined by an -oriented hyperplane through the facet's vertices. A hyperplane -is defined by d normalized coefficients and an offset. A -point is above a facet if its distance to the facet is -positive.

    - -

    Qhull uses floating point coordinates for input points, -vertices, halfspace equations, centrums, and an interior point.

    - -

    Qhull may be configured for single precision or double -precision floating point arithmetic (see realT -).

    - -

    Each floating point operation may incur round-off error (see -Merge). The maximum error for distance -computations is determined at initialization. The roundoff error -in halfspace computation is accounted for by computing the -distance from vertices to the halfspace.

    -
    -

    Copyright © 1995-2015 C.B. Barber

    -
    -

    » Geom - Global • -IoMem • -MergePoly • -QhullSet • -StatUser

    - -

    Index to geom_r.c, -geom2_r.c, geom_r.h, -random_r.c, random_r.h -

    - - - -

    »geometric data types -and constants

    - -
      -
    • coordT coordinates and -coefficients are stored as realT
    • -
    • pointT a point is an array -of DIM3 coordinates
    • -
    - -

    »mathematical macros

    - -
      -
    • fabs_ returns the absolute -value of a
    • -
    • fmax_ returns the maximum -value of a and b
    • -
    • fmin_ returns the minimum -value of a and b
    • -
    • maximize_ maximize a value -
    • -
    • minimize_ minimize a value -
    • -
    • det2_ compute a 2-d -determinate
    • -
    • det3_ compute a 3-d -determinate
    • -
    • dX, dY, dZ compute the difference -between two coordinates
    • -
    - -

    »mathematical functions

    - - - -

    »computational geometry functions

    - - - -

    »point array functions

    - - -

    »geometric facet functions

    - - -

    »geometric roundoff functions

    -
      -
    • qh_detjoggle determine -default joggle for points and distance roundoff error
    • -
    • qh_detroundoff -determine maximum roundoff error and other precision constants
    • -
    • qh_distround compute -maximum roundoff error due to a distance computation to a -normalized hyperplane
    • -
    • qh_divzero divide by a -number that is nearly zero
    • -
    • qh_maxouter return maximum outer -plane
    • -
    • qh_outerinner return actual -outer and inner planes -
    - -

    -
    -

    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: Geom • -GlobalIo -• MemMerge -• PolyQhull -• SetStat -• User
    - - -

    -
    -

    The -Geometry Center Home Page

    -

    Comments to: qhull@qhull.org -
    -Created: May 2, 1997 --- Last modified: see top

    - - diff --git a/src/qhull/src/libqhull_r/qh-globa_r.htm b/src/qhull/src/libqhull_r/qh-globa_r.htm deleted file mode 100644 index 45437a05979..00000000000 --- a/src/qhull/src/libqhull_r/qh-globa_r.htm +++ /dev/null @@ -1,163 +0,0 @@ - - - - -global_r.c -- global variables and their functions - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser -

    - -
    - - -

    global_r.c -- global variables and their functions

    -
    -

    Qhull uses a data structure, qhT, to store -globally defined constants, lists, sets, and variables. It is passed as the -first argument to most functions. -

    -
    -

    Copyright © 1995-2015 C.B. Barber

    -
    -

    » Geom - Global • -IoMem • -MergePoly • -QhullSet • -StatUser

    - -

    Index to global_r.c and -libqhull_r.h

    - - - -

    »Qhull's global -variables

    - - - -

    »Global variable and -initialization routines

    - - - -

    -
    -

    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: Geom • -GlobalIo -• MemMerge -• PolyQhull -• SetStat -• User
    -

    -
    -

    The -Geometry Center Home Page

    -

    Comments to: qhull@qhull.org -
    -Created: May 2, 1997 --- Last modified: see top

    - - diff --git a/src/qhull/src/libqhull_r/qh-io_r.htm b/src/qhull/src/libqhull_r/qh-io_r.htm deleted file mode 100644 index 8a8a96300f6..00000000000 --- a/src/qhull/src/libqhull_r/qh-io_r.htm +++ /dev/null @@ -1,305 +0,0 @@ - - - - -io_r.c -- input and output operations - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -
    - -

    io_r.c -- input and output operations

    -
    - -

    Qhull provides a wide range of input -and output options. To organize the code, most output formats use -the same driver:

    - -
    -    qh_printbegin( fp, format, facetlist, facets, printall );
    -
    -    FORALLfacet_( facetlist )
    -      qh_printafacet( fp, format, facet, printall );
    -
    -    FOREACHfacet_( facets )
    -      qh_printafacet( fp, format, facet, printall );
    -
    -    qh_printend( fp, format );
    -
    - -

    Note the 'printall' flag. It selects whether or not -qh_skipfacet() is tested.

    - -
    -

    Copyright © 1995-2015 C.B. Barber

    -
    -

    » Geom -GlobalIo • -MemMerge • -PolyQhull • -SetStat • -User

    - -

    Index to io_r.c and io_r.h

    - - - -

    »io_r.h constants and types

    - -
      -
    • qh_MAXfirst maximum length -of first two lines of stdin
    • -
    • qh_WHITESPACE possible -values of white space
    • -
    • printvridgeT function to -print results of qh_printvdiagram or qh_eachvoronoi
    • -
    - -

    »User level functions

    - - - -

    »Print functions for all -output formats

    - - - -

    »Text output functions

    - - -

    »Text utility functions

    - - -

    »Geomview output functions

    - -

    »Geomview utility functions

    - -

    -

    -
    -

    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: Geom • -GlobalIo -• MemMerge -• PolyQhull -• SetStat -• User
    -

    -

    -
    -

    The -Geometry Center Home Page

    -

    Comments to: qhull@qhull.org -
    -Created: May 2, 1997 --- Last modified: see top

    - - diff --git a/src/qhull/src/libqhull_r/qh-mem_r.htm b/src/qhull/src/libqhull_r/qh-mem_r.htm deleted file mode 100644 index db59119cb9c..00000000000 --- a/src/qhull/src/libqhull_r/qh-mem_r.htm +++ /dev/null @@ -1,145 +0,0 @@ - - - - -mem_r.c -- memory operations - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -
    - -

    mem_r.c -- memory operations

    -
    -

    Qhull uses quick-fit memory allocation. It maintains a -set of free lists for a variety of small allocations. A -small request returns a block from the best fitting free -list. If the free list is empty, Qhull allocates a block -from a reserved buffer.

    -

    Use 'T5' to trace memory allocations.

    - -
    -

    Copyright © 1995-2015 C.B. Barber

    -
    -

    » Geom - Global • -IoMem -• MergePoly -• QhullSet -• StatUser -

    -

    Index to mem_r.c and -mem_r.h

    - -

    »mem_r.h data types and constants

    -
      -
    • ptr_intT for casting -a void* to an integer-type
    • -
    • qhmemT global memory -structure for mem_r.c
    • -
    • qh_NOmem disable memory allocation
    • -
    -

    »mem_r.h macros

    - -

    »User level -functions

    - - -

    »Initialization and -termination functions

    - - -

    -
    -

    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: Geom • -GlobalIo -• MemMerge -• PolyQhull -• SetStat -• User
    -

    -

    -
    -

    The -Geometry Center Home Page

    -

    Comments to: qhull@qhull.org -
    -Created: May 2, 1997 --- Last modified: see top

    - - diff --git a/src/qhull/src/libqhull_r/qh-merge_r.htm b/src/qhull/src/libqhull_r/qh-merge_r.htm deleted file mode 100644 index 63e5135be14..00000000000 --- a/src/qhull/src/libqhull_r/qh-merge_r.htm +++ /dev/null @@ -1,366 +0,0 @@ - - - - -merge_r.c -- facet merge operations - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -
    - -

    merge_r.c -- facet merge operations

    -
    -

    Qhull handles precision problems by merged facets or joggled input. -Except for redundant vertices, it corrects a problem by -merging two facets. When done, all facets are clearly -convex. See Imprecision in Qhull -for further information.

    -

    Users may joggle the input ('QJn') -instead of merging facets.

    -

    Qhull detects and corrects the following problems:

    -
      -
    • More than two facets meeting at a ridge. When -Qhull creates facets, it creates an even number -of facets for each ridge. A convex hull always -has two facets for each ridge. More than two -facets may be created if non-adjacent facets -share a vertex. This is called a duplicate -ridge. In 2-d, a duplicate ridge would -create a loop of facets.
    • -
    -
      -
    • A facet contained in another facet. Facet -merging may leave all vertices of one facet as a -subset of the vertices of another facet. This is -called a redundant facet.
    • -
    -
      -
    • A facet with fewer than three neighbors. Facet -merging may leave a facet with one or two -neighbors. This is called a degenerate facet. -
    • -
    -
      -
    • A facet with flipped orientation. A -facet's hyperplane may define a halfspace that -does not include the interior point.This is -called a flipped facet.
    • -
    -
      -
    • A coplanar horizon facet. A -newly processed point may be coplanar with an -horizon facet. Qhull creates a new facet without -a hyperplane. It links new facets for the same -horizon facet together. This is called a samecycle. -The new facet or samecycle is merged into the -horizon facet.
    • -
    -
      -
    • Concave facets. A facet's centrum may be -above a neighboring facet. If so, the facets meet -at a concave angle.
    • -
    -
      -
    • Coplanar facets. A facet's centrum may be -coplanar with a neighboring facet (i.e., it is -neither clearly below nor clearly above the -facet's hyperplane). Qhull removes coplanar -facets in independent sets sorted by angle.
    • -
    -
      -
    • Redundant vertex. A vertex may have fewer -than three neighboring facets. If so, it is -redundant and may be renamed to an adjacent -vertex without changing the topological -structure.This is called a redundant vertex. -
    • -
    -
    -

    Copyright © 1995-2015 C.B. Barber

    -
    -

    » Geom - Global -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -

    Index to merge_r.c and -merge_r.h

    - - -

    »merge_r.h data -types, macros, and global sets

    -
      -
    • mergeT structure to -identify a merge of two facets
    • -
    • FOREACHmerge_ -assign 'merge' to each merge in merges
    • -
    • qh global sets -qh.facet_mergeset contains non-convex merges -while qh.degen_mergeset contains degenerate and -redundant facets
    • -
    -

    »merge_r.h -constants

    - -

    »top-level merge -functions

    - - -

    »functions for -identifying merges

    - - -

    »functions for -determining the best merge

    - - -

    »functions for -merging facets

    - - -

    »functions for -merging a cycle of facets

    -

    If a point is coplanar with an horizon facet, the -corresponding new facets are linked together (a samecycle) -for merging.

    - -

    »functions -for renaming a vertex

    - - -

    »functions -for identifying vertices for renaming

    - - -

    »functions for check and -trace

    - - -

    -
    -

    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: Geom • -GlobalIo -• MemMerge -• PolyQhull -• SetStat -• User
    -

    -

    -
    -

    The -Geometry Center Home Page

    -

    Comments to: qhull@qhull.org -
    -Created: May 2, 1997 --- Last modified: see top

    - - diff --git a/src/qhull/src/libqhull_r/qh-poly_r.htm b/src/qhull/src/libqhull_r/qh-poly_r.htm deleted file mode 100644 index c5b6f2f8366..00000000000 --- a/src/qhull/src/libqhull_r/qh-poly_r.htm +++ /dev/null @@ -1,485 +0,0 @@ - - - - -poly_r.c, poly2_r.c -- polyhedron operations - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -
    - -

    poly_r.c, poly2_r.c -- polyhedron operations

    -
    - -

    Qhull uses dimension-free terminology. Qhull builds a -polyhedron in dimension d. A polyhedron is a -simplicial complex of faces with geometric information for the -top and bottom-level faces. A (d-1)-face is a facet, -a (d-2)-face is a ridge, and a 0-face -is a vertex. For example in 3-d, a facet is a polygon -and a ridge is an edge. A facet is built from a ridge (the base) -and a vertex (the apex). See -Qhull's data structures.

    - -

    Qhull's primary data structure is a polyhedron. A -polyhedron is a list of facets. Each facet has a set of -neighboring facets and a set of vertices. Each facet has a -hyperplane. For example, a tetrahedron has four facets. -If its vertices are a, b, c, d, and its facets -are 1, 2, 3, 4, the tetrahedron is

    -
    -
      -
    • facet 1
        -
      • vertices: b c d
      • -
      • neighbors: 2 3 4
      • -
      -
    • -
    • facet 2
        -
      • vertices: a c d
      • -
      • neighbors: 1 3 4
      • -
      -
    • -
    • facet 3
        -
      • vertices: a b d
      • -
      • neighbors: 1 2 4
      • -
      -
    • -
    • facet 4
        -
      • vertices: a b c
      • -
      • neighbors: 1 2 3
      • -
      -
    • -
    -
    -

    A facet may be simplicial or non-simplicial. In 3-d, a -simplicial facet has three vertices and three -neighbors. A nonsimplicial facet has more than -three vertices and more than three neighbors. A -nonsimplicial facet has a set of ridges and a centrum.

    -

    -A simplicial facet has an orientation. An orientation -is either top or bottom. -The flag, facet->toporient, -defines the orientation of the facet's vertices. For example in 3-d, -'top' is left-handed orientation (i.e., the vertex order follows the direction -of the left-hand fingers when the thumb is pointing away from the center). -Except for axis-parallel facets in 5-d and higher, topological orientation -determines the geometric orientation of the facet's hyperplane. - -

    A nonsimplicial facet is due to merging two or more -facets. The facet's ridge set determine a simplicial -decomposition of the facet. Each ridge is a 1-face (i.e., -it has two vertices and two neighboring facets). The -orientation of a ridge is determined by the order of the -neighboring facets. The flag, facet->toporient,is -ignored.

    -

    A nonsimplicial facet has a centrum for testing -convexity. A centrum is a point on the facet's -hyperplane that is near the center of the facet. Except -for large facets, it is the arithmetic average of the -facet's vertices.

    -

    A nonsimplicial facet is an approximation that is -defined by offsets from the facet's hyperplane. When -Qhull finishes, the outer plane is above all -points while the inner plane is below the facet's -vertices. This guarantees that any exact convex hull -passes between the inner and outer planes. The outer -plane is defined by facet->maxoutside while -the inner plane is computed from the facet's vertices.

    - -

    Qhull 3.1 includes triangulation of non-simplicial facets -('Qt'). -These facets, -called tricoplanar, share the same normal. centrum, and Voronoi center. -One facet (keepcentrum) owns these data structures. -While tricoplanar facets are more accurate than the simplicial facets from -joggled input, they -may have zero area or flipped orientation. - -

    -

    Copyright © 1995-2015 C.B. Barber

    -
    -

    » Geom - Global -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -

    Index to poly_r.c, -poly2_r.c, poly_r.h, -and libqhull_r.h

    - -

    »Data -types and global lists for polyhedrons

    - -

    »poly_r.h constants

    -
      -
    • ALGORITHMfault -flag to not report errors in qh_checkconvex()
    • -
    • DATAfault flag to -report errors in qh_checkconvex()
    • -
    • DUPLICATEridge -special value for facet->neighbor to indicate -a duplicate ridge
    • -
    • MERGEridge -special value for facet->neighbor to indicate -a merged ridge
    • -
    -

    »Global FORALL -macros

    - -

    »FORALL macros

    - -

    »FOREACH macros

    - -

    »Indexed -FOREACH macros

    -
      -
    • FOREACHfacet_i_ -assign 'facet' and 'facet_i' to each facet in -facet set
    • -
    • FOREACHneighbor_i_ -assign 'neighbor' and 'neighbor_i' to each facet -in facet->neighbors or vertex->neighbors
    • -
    • FOREACHpoint_i_ -assign 'point' and 'point_i' to each point in -points set
    • -
    • FOREACHridge_i_ -assign 'ridge' and 'ridge_i' to each ridge in -ridges set
    • -
    • FOREACHvertex_i_ -assign 'vertex' and 'vertex_i' to each vertex in -vertices set
    • -
    • FOREACHvertexreverse12_ -assign 'vertex' to each vertex in vertex set; -reverse the order of first two vertices
    • -
    -

    »Other macros for polyhedrons

    -
      -
    • getid_ return ID for -a facet, ridge, or vertex
    • -
    • otherfacet_ -return neighboring facet for a ridge in a facet
    • -
    -

    »Facetlist -functions

    - -

    »Facet -functions

    - -

    »Vertex, -ridge, and point functions

    - -

    »Hashtable functions

    - -

    »Allocation and -deallocation functions

    - -

    »Check -functions

    - - - -

    -
    -

    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: Geom • -GlobalIo -• MemMerge -• PolyQhull -• SetStat -• User
    -

    -

    -
    -

    The -Geometry Center Home Page

    -

    Comments to: qhull@qhull.org -
    -Created: May 2, 1997 --- Last modified: see top

    - - diff --git a/src/qhull/src/libqhull_r/qh-qhull_r.htm b/src/qhull/src/libqhull_r/qh-qhull_r.htm deleted file mode 100644 index 25d5e497222..00000000000 --- a/src/qhull/src/libqhull_r/qh-qhull_r.htm +++ /dev/null @@ -1,279 +0,0 @@ - - - - -libqhull_r.c -- top-level functions and basic data types - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -
    - -

    libqhull_r.c -- top-level functions and basic data types

    -
    -

    Qhull implements the Quickhull algorithm for computing -the convex hull. The Quickhull algorithm combines two -well-known algorithms: the 2-d quickhull algorithm and -the n-d beneath-beyond algorithm. See -Description of Qhull.

    -

    This section provides an index to the top-level -functions and base data types. The top-level header file, libqhull_r.h, -contains prototypes for these functions.

    -
    -

    Copyright © 1995-2015 C.B. Barber

    -
    -

    » Geom - Global -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -

    Index to libqhull_r.c, -libqhull_r.h, and -unix_r.c

    - - -

    »libqhull_r.h and unix_r.c -data types and constants

    -
      -
    • flagT Boolean flag as -a bit
    • -
    • boolT boolean value, -either True or False
    • -
    • CENTERtype to -distinguish facet->center
    • -
    • qh_PRINT output -formats for printing (qh.PRINTout)
    • -
    • qh_ALL argument flag -for selecting everything
    • -
    • qh_ERR Qhull exit -codes for indicating errors
    • -
    • qh_FILEstderr Fake stderr -to distinguish error output from normal output [C++ only]
    • -
    • qh_prompt version and long prompt for Qhull
    • -
    • qh_prompt2 synopsis for Qhull
    • -
    • qh_prompt3 concise prompt for Qhull
    • -
    • qh_version version stamp
    • -
    - -

    »libqhull_r.h other -macros

    -
      -
    • traceN print trace -message if qh.IStracing >= N.
    • -
    • QHULL_UNUSED declare an - unused variable to avoid warnings.
    • -
    - -

    »Quickhull -routines in call order

    - - -

    »Top-level routines for initializing and terminating Qhull (in other modules)

    - - -

    »Top-level routines for reading and modifying the input (in other modules)

    - - -

    »Top-level routines for calling Qhull (in other modules)

    - - -

    »Top-level routines for returning results (in other modules)

    - - -

    »Top-level routines for testing and debugging (in other modules)

    - - -

    -
    -

    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: Geom • -GlobalIo -• MemMerge -• PolyQhull -• SetStat -• User
    -

    -

    -
    -

    The -Geometry Center Home Page

    -

    Comments to: qhull@qhull.org -
    -Created: May 2, 1997 --- Last modified: see top

    - - diff --git a/src/qhull/src/libqhull_r/qh-set_r.htm b/src/qhull/src/libqhull_r/qh-set_r.htm deleted file mode 100644 index cf8ab63af99..00000000000 --- a/src/qhull/src/libqhull_r/qh-set_r.htm +++ /dev/null @@ -1,308 +0,0 @@ - - - - -qset_r.c -- set data type and operations - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -
    - -

    qset_r.c -- set data type and operations

    -
    -

    Qhull's data structures are constructed from sets. The -functions and macros in qset_r.c construct, iterate, and -modify these sets. They are the most frequently called -functions in Qhull. For this reason, efficiency is the -primary concern.

    -

    In Qhull, a set is represented by an unordered -array of pointers with a maximum size and a NULL -terminator (setT). -Most sets correspond to mathematical sets -(i.e., the pointers are unique). Some sets are sorted to -enforce uniqueness. Some sets are ordered. For example, -the order of vertices in a ridge determine the ridge's -orientation. If you reverse the order of adjacent -vertices, the orientation reverses. Some sets are not -mathematical sets. They may be indexed as an array and -they may include NULL pointers.

    -

    The most common operation on a set is to iterate its -members. This is done with a 'FOREACH...' macro. Each set -has a custom macro. For example, 'FOREACHvertex_' -iterates over a set of vertices. Each vertex is assigned -to the variable 'vertex' from the pointer 'vertexp'.

    -

    Most sets are constructed by appending elements to the -set. The last element of a set is either NULL or the -index of the terminating NULL for a partially full set. -If a set is full, appending an element copies the set to -a larger array.

    - -
    -

    Copyright © 1995-2015 C.B. Barber

    -
    -

    » Geom - Global • -IoMem • -MergePoly -• QhullSet -• StatUser -

    -

    Index to qset_r.c and -qset_r.h

    - -

    »Data types and -constants

    -
      -
    • SETelemsize size -of a set element in bytes
    • -
    • setT a set with a -maximum size and a current size
    • -
    • qh global sets -global sets for temporary sets, etc.
    • -
    -

    »FOREACH macros

    - -

    »Access and -size macros

    - -

    »Internal macros

    -
      -
    • SETsizeaddr_ -return pointer to end element of a set (indicates -current size)
    • -
    - -

    »address macros

    -
      -
    • SETaddr_ return -address of a set's elements
    • -
    • SETelemaddr_ -return address of the n'th element of a set
    • -
    • SETref_ l_r.h.s. for -modifying the current element in a FOREACH -iteration
    • -
    - -

    »Allocation and -deallocation functions

    - - -

    »Access and -predicate functions

    - - -

    »Add functions

    - - -

    »Check and print functions

    - - -

    »Copy, compact, and zero functions

    - - -

    »Delete functions

    - - -

    »Temporary set functions

    - - -

    -
    -

    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: Geom • -GlobalIo -• MemMerge -• PolyQhull -• SetStat -• User
    -

    -

    -
    -

    The -Geometry Center Home Page

    -

    Comments to: qhull@qhull.org -
    -Created: May 2, 1997 --- Last modified: see top

    - - diff --git a/src/qhull/src/libqhull_r/qh-stat_r.htm b/src/qhull/src/libqhull_r/qh-stat_r.htm deleted file mode 100644 index ea9d7fc565c..00000000000 --- a/src/qhull/src/libqhull_r/qh-stat_r.htm +++ /dev/null @@ -1,161 +0,0 @@ - - - - -stat_r.c -- statistical operations - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -
    - -

    stat_r.c -- statistical operations

    -
    -

    Qhull records many statistics. These functions and -macros make it inexpensive to add a statistic. -

    As with Qhull's global variables, the statistics data structure is -accessed by a macro, 'qhstat'. If qh_QHpointer is defined, the macro -is 'qh_qhstat->', otherwise the macro is 'qh_qhstat.'. -Statistics -may be turned off in user_r.h. If so, all but the 'zz' -statistics are ignored.

    -
    -

    Copyright © 1995-2015 C.B. Barber

    -
    -

    » Geom - Global -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -

    Index to stat_r.c and -stat_r.h

    - - -

    »stat_r.h types

    -
      -
    • intrealT union of -integer and real
    • -
    • qhstat global data -structure for statistics
    • -
    -

    »stat_r.h -constants

    -
      -
    • qh_KEEPstatistics 0 turns off most statistics
    • -
    • Z..., W... integer (Z) and real (W) statistics -
    • -
    • ZZstat Z.../W... statistics that -remain defined if qh_KEEPstatistics=0 -
    • -
    • ztype zdoc, zinc, etc. -for definining statistics
    • -
    -

    »stat_r.h macros

    -
      -
    • MAYdebugx called -frequently for error trapping
    • -
    • zadd_/wadd_ add value -to an integer or real statistic
    • -
    • zdef_ define a -statistic
    • -
    • zinc_ increment an -integer statistic
    • -
    • zmax_/wmax_ update -integer or real maximum statistic
    • -
    • zmin_/wmin_ update -integer or real minimum statistic
    • -
    • zval_/wval_ set or -return value of a statistic
    • -
    - -

    »stat_r.c -functions

    - - -

    -
    -

    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: Geom • -GlobalIo -• MemMerge -• PolyQhull -• SetStat -• User
    -

    -

    -
    -

    The -Geometry Center Home Page

    -

    Comments to: qhull@qhull.org -
    -Created: May 2, 1997 --- Last modified: see top

    - - diff --git a/src/qhull/src/libqhull_r/qh-user_r.htm b/src/qhull/src/libqhull_r/qh-user_r.htm deleted file mode 100644 index 909fec6564e..00000000000 --- a/src/qhull/src/libqhull_r/qh-user_r.htm +++ /dev/null @@ -1,271 +0,0 @@ - - - - -user_r.c -- user-definable operations - - - - -

    Up: Home page for Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: GeomGlobal -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -
    -

    user_r.c -- user-definable operations

    -
    -

    This section contains functions and constants that the -user may want to change.

    - -
    -

    Copyright © 1995-2015 C.B. Barber

    -
    -

    » Geom - Global -• IoMem -• MergePoly -• QhullSet -• StatUser -

    -

    Index to user_r.c, usermem_r.c, userprintf_r.c, userprintf_rbox_r.c and -user_r.h

    - - -

    »Qhull library constants

    - - - -

    »user_r.h data -types and configuration macros

    - - -

    »definition constants

    -
      -
    • qh_DEFAULTbox -define default box size for rbox, 'Qbb', and 'QbB' (Geomview expects 0.5)
    • -
    • qh_INFINITE on -output, indicates Voronoi center at infinity
    • -
    • qh_ORIENTclock -define convention for orienting facets
    • -
    • qh_ZEROdelaunay -define facets that are ignored in Delaunay triangulations
    • -
    - -

    »joggle constants

    - - -

    »performance -related constants

    - - -

    »memory constants

    - - -

    »conditional compilation

    -
      -
    • compiler defined symbols, -e.g., _STDC_ and _cplusplus - -
    • qh_COMPUTEfurthest - compute furthest distance to an outside point instead of storing it with the facet -
    • qh_KEEPstatistics - enable statistic gathering and reporting with option 'Ts' -
    • qh_MAXoutside -record outer plane for each facet -
    • qh_NOmerge -disable facet merging -
    • qh_NOtrace -disable tracing with option 'T4' -
    • qh_QHpointer -access global data with pointer or static structure -
    • qh_QUICKhelp -use abbreviated help messages, e.g., for degenerate inputs -
    - -

    »merge -constants

    - - -

    »user_r.c -functions

    - - -

    »usermem_r.c -functions

    -
      -
    • qh_exit exit program, same as exit(). May be redefined as throw "QH10003.." by libqhullcpp/usermem_r-cpp.cpp
    • -
    • qh_fprintf_stderr print to stderr when qh->ferr is not defined.
    • -
    • qh_free free memory, same as free().
    • -
    • qh_malloc allocate memory, same as malloc()
    • -
    - -

    »userprintf_r.c - and userprintf_rbox,c functions

    -
      -
    • qh_fprintf print -information from Qhull, sames as fprintf().
    • -
    • qh_fprintf_rbox print -information from Rbox, sames as fprintf().
    • -
    - -

    -
    -

    Up: -Home page for -Qhull
    -Up: Qhull manual: Table of Contents
    -Up: Programs -• Options -• Output -• Formats -• Geomview -• Print -• Qhull -• Precision -• Trace -• Functions
    -Up: Qhull code: Table of Contents
    -To: Qhull functions, macros, and data structures
    -To: Geom • -GlobalIo -• MemMerge -• PolyQhull -• SetStat -• User
    -

    -

    -
    -

    The -Geometry Center Home Page

    -

    Comments to: qhull@qhull.org -
    -Created: May 2, 1997 --- Last modified: see top

    - - diff --git a/src/qhull/src/libqhull_r/qhull_r-exports.def b/src/qhull/src/libqhull_r/qhull_r-exports.def deleted file mode 100644 index 325d57c3b83..00000000000 --- a/src/qhull/src/libqhull_r/qhull_r-exports.def +++ /dev/null @@ -1,404 +0,0 @@ -; qhull_r-exports.def -- msvc module-definition file -; -; Generated from depends.exe by cut-and-paste of exported symbols by mingw gcc -; [jan'14] 391 symbols -; Same as ../libqhullp/qhull-exports.def without DATA items (reentrant) -; -; $Id: //main/2015/qhull/src/libqhull_r/qhull_r-exports.def#3 $$Change: 2047 $ -; $DateTime: 2016/01/04 22:03:18 $$Author: bbarber $ -; -; Define qhull_VERSION in CMakeLists.txt, Makefile, qhull-exports.def, qhull_p-exports.def, qhull_r-exports.def, and qhull-warn.pri -VERSION 7.0 -EXPORTS -qh_addhash -qh_addpoint -qh_all_merges -qh_allstatA -qh_allstatB -qh_allstatC -qh_allstatD -qh_allstatE -qh_allstatE2 -qh_allstatF -qh_allstatG -qh_allstatH -qh_allstatI -qh_allstatistics -qh_appendfacet -qh_appendmergeset -qh_appendprint -qh_appendvertex -qh_argv_to_command -qh_argv_to_command_size -qh_attachnewfacets -qh_backnormal -qh_basevertices -qh_build_withrestart -qh_buildhull -qh_buildtracing -qh_check_bestdist -qh_check_dupridge -qh_check_maxout -qh_check_output -qh_check_point -qh_check_points -qh_checkconnect -qh_checkconvex -qh_checkfacet -qh_checkflags -qh_checkflipped -qh_checkflipped_all -qh_checkpolygon -qh_checkvertex -qh_checkzero -qh_clear_outputflags -qh_clearcenters -qh_clock -qh_collectstatistics -qh_compare_facetarea -qh_compare_facetmerge -qh_compare_facetvisit -qh_compareangle -qh_comparemerge -qh_comparevisit -qh_copyfilename -qh_copynonconvex -qh_copypoints -qh_countfacets -qh_createsimplex -qh_crossproduct -qh_degen_redundant_facet -qh_degen_redundant_neighbors -qh_deletevisible -qh_delfacet -qh_delridge -qh_delvertex -qh_determinant -qh_detjoggle -qh_detroundoff -qh_detsimplex -qh_detvnorm -qh_detvridge -qh_detvridge3 -qh_dfacet -qh_distnorm -qh_distplane -qh_distround -qh_divzero -qh_dvertex -qh_eachvoronoi -qh_eachvoronoi_all -qh_errexit -qh_errexit2 -qh_errexit_rbox -qh_errprint -qh_exit -qh_facet2point -qh_facet3vertex -qh_facetarea -qh_facetarea_simplex -qh_facetcenter -qh_facetintersect -qh_facetvertices -qh_find_newvertex -qh_findbest -qh_findbest_test -qh_findbestfacet -qh_findbesthorizon -qh_findbestlower -qh_findbestneighbor -qh_findbestnew -qh_findfacet_all -qh_findgood -qh_findgood_all -qh_findgooddist -qh_findhorizon -qh_flippedmerges -qh_forcedmerges -qh_fprintf -qh_fprintf_rbox -qh_fprintf_stderr -qh_free -qh_freebuffers -qh_freebuild -qh_freeqhull -qh_furthestnext -qh_furthestout -qh_gausselim -qh_geomplanes -qh_getangle -qh_getarea -qh_getcenter -qh_getcentrum -qh_getdistance -qh_gethash -qh_getmergeset -qh_getmergeset_initial -qh_gram_schmidt -qh_hashridge -qh_hashridge_find -qh_infiniteloop -qh_init_A -qh_init_B -qh_init_qhull_command -qh_initbuild -qh_initflags -qh_initialhull -qh_initialvertices -qh_initqhull_buffers -qh_initqhull_globals -qh_initqhull_mem -qh_initqhull_outputflags -qh_initqhull_start -qh_initqhull_start2 -qh_initstatistics -qh_initthresholds -qh_inthresholds -qh_isvertex -qh_joggleinput -qh_lib_check -qh_makenew_nonsimplicial -qh_makenew_simplicial -qh_makenewfacet -qh_makenewfacets -qh_makenewplanes -qh_makeridges -qh_malloc -qh_mark_dupridges -qh_markkeep -qh_markvoronoi -qh_matchduplicates -qh_matchneighbor -qh_matchnewfacets -qh_matchvertices -qh_maxabsval -qh_maxmin -qh_maxouter -qh_maxsimplex -qh_maydropneighbor -qh_memalloc -qh_memfree -qh_memfreeshort -qh_meminit -qh_meminitbuffers -qh_memsetup -qh_memsize -qh_memstatistics -qh_memtotal -qh_merge_degenredundant -qh_merge_nonconvex -qh_mergecycle -qh_mergecycle_all -qh_mergecycle_facets -qh_mergecycle_neighbors -qh_mergecycle_ridges -qh_mergecycle_vneighbors -qh_mergefacet -qh_mergefacet2d -qh_mergeneighbors -qh_mergeridges -qh_mergesimplex -qh_mergevertex_del -qh_mergevertex_neighbors -qh_mergevertices -qh_minabsval -qh_mindiff -qh_nearcoplanar -qh_nearvertex -qh_neighbor_intersections -qh_new_qhull -qh_newfacet -qh_newhashtable -qh_newridge -qh_newstats -qh_newvertex -qh_newvertices -qh_nextfurthest -qh_nextridge3d -qh_normalize -qh_normalize2 -qh_nostatistic -qh_option -qh_order_vertexneighbors -qh_orientoutside -qh_out1 -qh_out2n -qh_out3n -qh_outcoplanar -qh_outerinner -qh_partitionall -qh_partitioncoplanar -qh_partitionpoint -qh_partitionvisible -qh_point -qh_point_add -qh_pointdist -qh_pointfacet -qh_pointid -qh_pointvertex -qh_postmerge -qh_precision -qh_premerge -qh_prepare_output -qh_prependfacet -qh_printafacet -qh_printallstatistics -qh_printbegin -qh_printcenter -qh_printcentrum -qh_printend -qh_printend4geom -qh_printextremes -qh_printextremes_2d -qh_printextremes_d -qh_printfacet -qh_printfacet2geom -qh_printfacet2geom_points -qh_printfacet2math -qh_printfacet3geom_nonsimplicial -qh_printfacet3geom_points -qh_printfacet3geom_simplicial -qh_printfacet3math -qh_printfacet3vertex -qh_printfacet4geom_nonsimplicial -qh_printfacet4geom_simplicial -qh_printfacetNvertex_nonsimplicial -qh_printfacetNvertex_simplicial -qh_printfacetheader -qh_printfacetlist -qh_printfacetridges -qh_printfacets -qh_printhashtable -qh_printhelp_degenerate -qh_printhelp_narrowhull -qh_printhelp_singular -qh_printhyperplaneintersection -qh_printline3geom -qh_printlists -qh_printmatrix -qh_printneighborhood -qh_printpoint -qh_printpoint3 -qh_printpointid -qh_printpoints -qh_printpoints_out -qh_printpointvect -qh_printpointvect2 -qh_printridge -qh_printspheres -qh_printstatistics -qh_printstatlevel -qh_printstats -qh_printsummary -qh_printvdiagram -qh_printvdiagram2 -qh_printvertex -qh_printvertexlist -qh_printvertices -qh_printvneighbors -qh_printvnorm -qh_printvoronoi -qh_printvridge -qh_produce_output -qh_produce_output2 -qh_projectdim3 -qh_projectinput -qh_projectpoint -qh_projectpoints -qh_qhull -qh_rand -qh_randomfactor -qh_randommatrix -qh_rboxpoints -qh_readfeasible -qh_readpoints -qh_reducevertices -qh_redundant_vertex -qh_remove_extravertices -qh_removefacet -qh_removevertex -qh_rename_sharedvertex -qh_renameridgevertex -qh_renamevertex -qh_resetlists -qh_rotateinput -qh_rotatepoints -qh_roundi -qh_scaleinput -qh_scalelast -qh_scalepoints -qh_setaddnth -qh_setaddsorted -qh_setappend -qh_setappend2ndlast -qh_setappend_set -qh_setcheck -qh_setcompact -qh_setcopy -qh_setdel -qh_setdelaunay -qh_setdellast -qh_setdelnth -qh_setdelnthsorted -qh_setdelsorted -qh_setduplicate -qh_setequal -qh_setequal_except -qh_setequal_skip -qh_setfacetplane -qh_setfeasible -qh_setfree -qh_setfree2 -qh_setfreelong -qh_sethalfspace -qh_sethalfspace_all -qh_sethyperplane_det -qh_sethyperplane_gauss -qh_setin -qh_setindex -qh_setlarger -qh_setlast -qh_setnew -qh_setnew_delnthsorted -qh_setprint -qh_setreplace -qh_setsize -qh_settemp -qh_settempfree -qh_settempfree_all -qh_settemppop -qh_settemppush -qh_settruncate -qh_setunique -qh_setvoronoi_all -qh_setzero -qh_sharpnewfacets -qh_skipfacet -qh_skipfilename -qh_srand -qh_stddev -qh_strtod -qh_strtol -qh_test_appendmerge -qh_test_vneighbors -qh_tracemerge -qh_tracemerging -qh_triangulate -qh_triangulate_facet -qh_triangulate_link -qh_triangulate_mirror -qh_triangulate_null -qh_updatetested -qh_updatevertices -qh_user_memsizes -qh_version -qh_version2 -qh_vertexintersect -qh_vertexintersect_new -qh_vertexneighbors -qh_vertexridges -qh_vertexridges_facet -qh_vertexsubset -qh_voronoi_center -qh_willdelete -qh_zero diff --git a/src/qhull/src/libqhull_r/qhull_ra.h b/src/qhull/src/libqhull_r/qhull_ra.h deleted file mode 100644 index 5c5bd8779ce..00000000000 --- a/src/qhull/src/libqhull_r/qhull_ra.h +++ /dev/null @@ -1,158 +0,0 @@ -/*
      ---------------------------------
    -
    -   qhull_ra.h
    -   all header files for compiling qhull with reentrant code
    -   included before C++ headers for user_r.h:QHULL_CRTDBG
    -
    -   see qh-qhull.htm
    -
    -   see libqhull_r.h for user-level definitions
    -
    -   see user_r.h for user-definable constants
    -
    -   defines internal functions for libqhull_r.c global_r.c
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull_r/qhull_ra.h#6 $$Change: 2079 $
    -   $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -
    -   Notes:  grep for ((" and (" to catch fprintf("lkasdjf");
    -           full parens around (x?y:z)
    -           use '#include "libqhull_r/qhull_ra.h"' to avoid name clashes
    -*/
    -
    -#ifndef qhDEFqhulla
    -#define qhDEFqhulla 1
    -
    -#include "libqhull_r.h"  /* Includes user_r.h and data types */
    -
    -#include "stat_r.h"
    -#include "random_r.h"
    -#include "mem_r.h"
    -#include "qset_r.h"
    -#include "geom_r.h"
    -#include "merge_r.h"
    -#include "poly_r.h"
    -#include "io_r.h"
    -
    -#include 
    -#include 
    -#include 
    -#include     /* some compilers will not need float.h */
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -/*** uncomment here and qset_r.c
    -     if string.h does not define memcpy()
    -#include 
    -*/
    -
    -#if qh_CLOCKtype == 2  /* defined in user_r.h from libqhull_r.h */
    -#include 
    -#include 
    -#include 
    -#endif
    -
    -#ifdef _MSC_VER  /* Microsoft Visual C++ -- warning level 4 */
    -#pragma warning( disable : 4100)  /* unreferenced formal parameter */
    -#pragma warning( disable : 4127)  /* conditional expression is constant */
    -#pragma warning( disable : 4706)  /* assignment within conditional function */
    -#pragma warning( disable : 4996)  /* function was declared deprecated(strcpy, localtime, etc.) */
    -#endif
    -
    -/* ======= -macros- =========== */
    -
    -/*----------------------------------
    -
    -  traceN((qh, qh->ferr, 0Nnnn, "format\n", vars));
    -    calls qh_fprintf if qh.IStracing >= N
    -
    -    Add debugging traps to the end of qh_fprintf
    -
    -  notes:
    -    removing tracing reduces code size but doesn't change execution speed
    -*/
    -#ifndef qh_NOtrace
    -#define trace0(args) {if (qh->IStracing) qh_fprintf args;}
    -#define trace1(args) {if (qh->IStracing >= 1) qh_fprintf args;}
    -#define trace2(args) {if (qh->IStracing >= 2) qh_fprintf args;}
    -#define trace3(args) {if (qh->IStracing >= 3) qh_fprintf args;}
    -#define trace4(args) {if (qh->IStracing >= 4) qh_fprintf args;}
    -#define trace5(args) {if (qh->IStracing >= 5) qh_fprintf args;}
    -#else /* qh_NOtrace */
    -#define trace0(args) {}
    -#define trace1(args) {}
    -#define trace2(args) {}
    -#define trace3(args) {}
    -#define trace4(args) {}
    -#define trace5(args) {}
    -#endif /* qh_NOtrace */
    -
    -/*----------------------------------
    -
    -  Define an unused variable to avoid compiler warnings
    -
    -  Derived from Qt's corelib/global/qglobal.h
    -
    -*/
    -
    -#if defined(__cplusplus) && defined(__INTEL_COMPILER) && !defined(QHULL_OS_WIN)
    -template 
    -inline void qhullUnused(T &x) { (void)x; }
    -#  define QHULL_UNUSED(x) qhullUnused(x);
    -#else
    -#  define QHULL_UNUSED(x) (void)x;
    -#endif
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/***** -libqhull_r.c prototypes (alphabetical after qhull) ********************/
    -
    -void    qh_qhull(qhT *qh);
    -boolT   qh_addpoint(qhT *qh, pointT *furthest, facetT *facet, boolT checkdist);
    -void    qh_buildhull(qhT *qh);
    -void    qh_buildtracing(qhT *qh, pointT *furthest, facetT *facet);
    -void    qh_build_withrestart(qhT *qh);
    -void    qh_errexit2(qhT *qh, int exitcode, facetT *facet, facetT *otherfacet);
    -void    qh_findhorizon(qhT *qh, pointT *point, facetT *facet, int *goodvisible,int *goodhorizon);
    -pointT *qh_nextfurthest(qhT *qh, facetT **visible);
    -void    qh_partitionall(qhT *qh, setT *vertices, pointT *points,int npoints);
    -void    qh_partitioncoplanar(qhT *qh, pointT *point, facetT *facet, realT *dist);
    -void    qh_partitionpoint(qhT *qh, pointT *point, facetT *facet);
    -void    qh_partitionvisible(qhT *qh, boolT allpoints, int *numpoints);
    -void    qh_precision(qhT *qh, const char *reason);
    -void    qh_printsummary(qhT *qh, FILE *fp);
    -
    -/***** -global_r.c internal prototypes (alphabetical) ***********************/
    -
    -void    qh_appendprint(qhT *qh, qh_PRINT format);
    -void    qh_freebuild(qhT *qh, boolT allmem);
    -void    qh_freebuffers(qhT *qh);
    -void    qh_initbuffers(qhT *qh, coordT *points, int numpoints, int dim, boolT ismalloc);
    -
    -/***** -stat_r.c internal prototypes (alphabetical) ***********************/
    -
    -void    qh_allstatA(qhT *qh);
    -void    qh_allstatB(qhT *qh);
    -void    qh_allstatC(qhT *qh);
    -void    qh_allstatD(qhT *qh);
    -void    qh_allstatE(qhT *qh);
    -void    qh_allstatE2(qhT *qh);
    -void    qh_allstatF(qhT *qh);
    -void    qh_allstatG(qhT *qh);
    -void    qh_allstatH(qhT *qh);
    -void    qh_freebuffers(qhT *qh);
    -void    qh_initbuffers(qhT *qh, coordT *points, int numpoints, int dim, boolT ismalloc);
    -
    -#ifdef __cplusplus
    -} /* extern "C" */
    -#endif
    -
    -#endif /* qhDEFqhulla */
    diff --git a/src/qhull/src/libqhull_r/qset_r.c b/src/qhull/src/libqhull_r/qset_r.c
    deleted file mode 100644
    index 15cd3c0e29d..00000000000
    --- a/src/qhull/src/libqhull_r/qset_r.c
    +++ /dev/null
    @@ -1,1340 +0,0 @@
    -/*
      ---------------------------------
    -
    -   qset_r.c
    -   implements set manipulations needed for quickhull
    -
    -   see qh-set_r.htm and qset_r.h
    -
    -   Be careful of strict aliasing (two pointers of different types
    -   that reference the same location).  The last slot of a set is
    -   either the actual size of the set plus 1, or the NULL terminator
    -   of the set (i.e., setelemT).
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull_r/qset_r.c#3 $$Change: 2062 $
    -   $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    -*/
    -
    -#include "libqhull_r.h" /* for qhT and QHULL_CRTDBG */
    -#include "qset_r.h"
    -#include "mem_r.h"
    -#include 
    -#include 
    -/*** uncomment here and qhull_ra.h
    -     if string.h does not define memcpy()
    -#include 
    -*/
    -
    -#ifndef qhDEFlibqhull
    -typedef struct ridgeT ridgeT;
    -typedef struct facetT facetT;
    -void    qh_errexit(qhT *qh, int exitcode, facetT *, ridgeT *);
    -void    qh_fprintf(qhT *qh, FILE *fp, int msgcode, const char *fmt, ... );
    -#  ifdef _MSC_VER  /* Microsoft Visual C++ -- warning level 4 */
    -#  pragma warning( disable : 4127)  /* conditional expression is constant */
    -#  pragma warning( disable : 4706)  /* assignment within conditional function */
    -#  endif
    -#endif
    -
    -/*=============== internal macros ===========================*/
    -
    -/*============ functions in alphabetical order ===================*/
    -
    -/*----------------------------------
    -
    -  qh_setaddnth(qh, setp, nth, newelem)
    -    adds newelem as n'th element of sorted or unsorted *setp
    -
    -  notes:
    -    *setp and newelem must be defined
    -    *setp may be a temp set
    -    nth=0 is first element
    -    errors if nth is out of bounds
    -
    -  design:
    -    expand *setp if empty or full
    -    move tail of *setp up one
    -    insert newelem
    -*/
    -void qh_setaddnth(qhT *qh, setT **setp, int nth, void *newelem) {
    -  int oldsize, i;
    -  setelemT *sizep;          /* avoid strict aliasing */
    -  setelemT *oldp, *newp;
    -
    -  if (!*setp || (sizep= SETsizeaddr_(*setp))->i==0) {
    -    qh_setlarger(qh, setp);
    -    sizep= SETsizeaddr_(*setp);
    -  }
    -  oldsize= sizep->i - 1;
    -  if (nth < 0 || nth > oldsize) {
    -    qh_fprintf(qh, qh->qhmem.ferr, 6171, "qhull internal error (qh_setaddnth): nth %d is out-of-bounds for set:\n", nth);
    -    qh_setprint(qh, qh->qhmem.ferr, "", *setp);
    -    qh_errexit(qh, qhmem_ERRqhull, NULL, NULL);
    -  }
    -  sizep->i++;
    -  oldp= (setelemT *)SETelemaddr_(*setp, oldsize, void);   /* NULL */
    -  newp= oldp+1;
    -  for (i=oldsize-nth+1; i--; )  /* move at least NULL  */
    -    (newp--)->p= (oldp--)->p;       /* may overwrite *sizep */
    -  newp->p= newelem;
    -} /* setaddnth */
    -
    -
    -/*----------------------------------
    -
    -  setaddsorted( setp, newelem )
    -    adds an newelem into sorted *setp
    -
    -  notes:
    -    *setp and newelem must be defined
    -    *setp may be a temp set
    -    nop if newelem already in set
    -
    -  design:
    -    find newelem's position in *setp
    -    insert newelem
    -*/
    -void qh_setaddsorted(qhT *qh, setT **setp, void *newelem) {
    -  int newindex=0;
    -  void *elem, **elemp;
    -
    -  FOREACHelem_(*setp) {          /* could use binary search instead */
    -    if (elem < newelem)
    -      newindex++;
    -    else if (elem == newelem)
    -      return;
    -    else
    -      break;
    -  }
    -  qh_setaddnth(qh, setp, newindex, newelem);
    -} /* setaddsorted */
    -
    -
    -/*---------------------------------
    -
    -  qh_setappend(qh, setp, newelem)
    -    append newelem to *setp
    -
    -  notes:
    -    *setp may be a temp set
    -    *setp and newelem may be NULL
    -
    -  design:
    -    expand *setp if empty or full
    -    append newelem to *setp
    -
    -*/
    -void qh_setappend(qhT *qh, setT **setp, void *newelem) {
    -  setelemT *sizep;  /* Avoid strict aliasing.  Writing to *endp may overwrite *sizep */
    -  setelemT *endp;
    -  int count;
    -
    -  if (!newelem)
    -    return;
    -  if (!*setp || (sizep= SETsizeaddr_(*setp))->i==0) {
    -    qh_setlarger(qh, setp);
    -    sizep= SETsizeaddr_(*setp);
    -  }
    -  count= (sizep->i)++ - 1;
    -  endp= (setelemT *)SETelemaddr_(*setp, count, void);
    -  (endp++)->p= newelem;
    -  endp->p= NULL;
    -} /* setappend */
    -
    -/*---------------------------------
    -
    -  qh_setappend_set(qh, setp, setA)
    -    appends setA to *setp
    -
    -  notes:
    -    *setp can not be a temp set
    -    *setp and setA may be NULL
    -
    -  design:
    -    setup for copy
    -    expand *setp if it is too small
    -    append all elements of setA to *setp
    -*/
    -void qh_setappend_set(qhT *qh, setT **setp, setT *setA) {
    -  int sizeA, size;
    -  setT *oldset;
    -  setelemT *sizep;
    -
    -  if (!setA)
    -    return;
    -  SETreturnsize_(setA, sizeA);
    -  if (!*setp)
    -    *setp= qh_setnew(qh, sizeA);
    -  sizep= SETsizeaddr_(*setp);
    -  if (!(size= sizep->i))
    -    size= (*setp)->maxsize;
    -  else
    -    size--;
    -  if (size + sizeA > (*setp)->maxsize) {
    -    oldset= *setp;
    -    *setp= qh_setcopy(qh, oldset, sizeA);
    -    qh_setfree(qh, &oldset);
    -    sizep= SETsizeaddr_(*setp);
    -  }
    -  if (sizeA > 0) {
    -    sizep->i= size+sizeA+1;   /* memcpy may overwrite */
    -    memcpy((char *)&((*setp)->e[size].p), (char *)&(setA->e[0].p), (size_t)(sizeA+1) * SETelemsize);
    -  }
    -} /* setappend_set */
    -
    -
    -/*---------------------------------
    -
    -  qh_setappend2ndlast(qh, setp, newelem )
    -    makes newelem the next to the last element in *setp
    -
    -  notes:
    -    *setp must have at least one element
    -    newelem must be defined
    -    *setp may be a temp set
    -
    -  design:
    -    expand *setp if empty or full
    -    move last element of *setp up one
    -    insert newelem
    -*/
    -void qh_setappend2ndlast(qhT *qh, setT **setp, void *newelem) {
    -    setelemT *sizep;  /* Avoid strict aliasing.  Writing to *endp may overwrite *sizep */
    -    setelemT *endp, *lastp;
    -    int count;
    -
    -    if (!*setp || (sizep= SETsizeaddr_(*setp))->i==0) {
    -        qh_setlarger(qh, setp);
    -        sizep= SETsizeaddr_(*setp);
    -    }
    -    count= (sizep->i)++ - 1;
    -    endp= (setelemT *)SETelemaddr_(*setp, count, void); /* NULL */
    -    lastp= endp-1;
    -    *(endp++)= *lastp;
    -    endp->p= NULL;    /* may overwrite *sizep */
    -    lastp->p= newelem;
    -} /* setappend2ndlast */
    -
    -/*---------------------------------
    -
    -  qh_setcheck(qh, set, typename, id )
    -    check set for validity
    -    report errors with typename and id
    -
    -  design:
    -    checks that maxsize, actual size, and NULL terminator agree
    -*/
    -void qh_setcheck(qhT *qh, setT *set, const char *tname, unsigned id) {
    -  int maxsize, size;
    -  int waserr= 0;
    -
    -  if (!set)
    -    return;
    -  SETreturnsize_(set, size);
    -  maxsize= set->maxsize;
    -  if (size > maxsize || !maxsize) {
    -    qh_fprintf(qh, qh->qhmem.ferr, 6172, "qhull internal error (qh_setcheck): actual size %d of %s%d is greater than max size %d\n",
    -             size, tname, id, maxsize);
    -    waserr= 1;
    -  }else if (set->e[size].p) {
    -    qh_fprintf(qh, qh->qhmem.ferr, 6173, "qhull internal error (qh_setcheck): %s%d(size %d max %d) is not null terminated.\n",
    -             tname, id, size-1, maxsize);
    -    waserr= 1;
    -  }
    -  if (waserr) {
    -    qh_setprint(qh, qh->qhmem.ferr, "ERRONEOUS", set);
    -    qh_errexit(qh, qhmem_ERRqhull, NULL, NULL);
    -  }
    -} /* setcheck */
    -
    -
    -/*---------------------------------
    -
    -  qh_setcompact(qh, set )
    -    remove internal NULLs from an unsorted set
    -
    -  returns:
    -    updated set
    -
    -  notes:
    -    set may be NULL
    -    it would be faster to swap tail of set into holes, like qh_setdel
    -
    -  design:
    -    setup pointers into set
    -    skip NULLs while copying elements to start of set
    -    update the actual size
    -*/
    -void qh_setcompact(qhT *qh, setT *set) {
    -  int size;
    -  void **destp, **elemp, **endp, **firstp;
    -
    -  if (!set)
    -    return;
    -  SETreturnsize_(set, size);
    -  destp= elemp= firstp= SETaddr_(set, void);
    -  endp= destp + size;
    -  while (1) {
    -    if (!(*destp++ = *elemp++)) {
    -      destp--;
    -      if (elemp > endp)
    -        break;
    -    }
    -  }
    -  qh_settruncate(qh, set, (int)(destp-firstp));   /* WARN64 */
    -} /* setcompact */
    -
    -
    -/*---------------------------------
    -
    -  qh_setcopy(qh, set, extra )
    -    make a copy of a sorted or unsorted set with extra slots
    -
    -  returns:
    -    new set
    -
    -  design:
    -    create a newset with extra slots
    -    copy the elements to the newset
    -
    -*/
    -setT *qh_setcopy(qhT *qh, setT *set, int extra) {
    -  setT *newset;
    -  int size;
    -
    -  if (extra < 0)
    -    extra= 0;
    -  SETreturnsize_(set, size);
    -  newset= qh_setnew(qh, size+extra);
    -  SETsizeaddr_(newset)->i= size+1;    /* memcpy may overwrite */
    -  memcpy((char *)&(newset->e[0].p), (char *)&(set->e[0].p), (size_t)(size+1) * SETelemsize);
    -  return(newset);
    -} /* setcopy */
    -
    -
    -/*---------------------------------
    -
    -  qh_setdel(set, oldelem )
    -    delete oldelem from an unsorted set
    -
    -  returns:
    -    returns oldelem if found
    -    returns NULL otherwise
    -
    -  notes:
    -    set may be NULL
    -    oldelem must not be NULL;
    -    only deletes one copy of oldelem in set
    -
    -  design:
    -    locate oldelem
    -    update actual size if it was full
    -    move the last element to the oldelem's location
    -*/
    -void *qh_setdel(setT *set, void *oldelem) {
    -  setelemT *sizep;
    -  setelemT *elemp;
    -  setelemT *lastp;
    -
    -  if (!set)
    -    return NULL;
    -  elemp= (setelemT *)SETaddr_(set, void);
    -  while (elemp->p != oldelem && elemp->p)
    -    elemp++;
    -  if (elemp->p) {
    -    sizep= SETsizeaddr_(set);
    -    if (!(sizep->i)--)         /*  if was a full set */
    -      sizep->i= set->maxsize;  /*     *sizep= (maxsize-1)+ 1 */
    -    lastp= (setelemT *)SETelemaddr_(set, sizep->i-1, void);
    -    elemp->p= lastp->p;      /* may overwrite itself */
    -    lastp->p= NULL;
    -    return oldelem;
    -  }
    -  return NULL;
    -} /* setdel */
    -
    -
    -/*---------------------------------
    -
    -  qh_setdellast(set)
    -    return last element of set or NULL
    -
    -  notes:
    -    deletes element from set
    -    set may be NULL
    -
    -  design:
    -    return NULL if empty
    -    if full set
    -      delete last element and set actual size
    -    else
    -      delete last element and update actual size
    -*/
    -void *qh_setdellast(setT *set) {
    -  int setsize;  /* actually, actual_size + 1 */
    -  int maxsize;
    -  setelemT *sizep;
    -  void *returnvalue;
    -
    -  if (!set || !(set->e[0].p))
    -    return NULL;
    -  sizep= SETsizeaddr_(set);
    -  if ((setsize= sizep->i)) {
    -    returnvalue= set->e[setsize - 2].p;
    -    set->e[setsize - 2].p= NULL;
    -    sizep->i--;
    -  }else {
    -    maxsize= set->maxsize;
    -    returnvalue= set->e[maxsize - 1].p;
    -    set->e[maxsize - 1].p= NULL;
    -    sizep->i= maxsize;
    -  }
    -  return returnvalue;
    -} /* setdellast */
    -
    -
    -/*---------------------------------
    -
    -  qh_setdelnth(qh, set, nth )
    -    deletes nth element from unsorted set
    -    0 is first element
    -
    -  returns:
    -    returns the element (needs type conversion)
    -
    -  notes:
    -    errors if nth invalid
    -
    -  design:
    -    setup points and check nth
    -    delete nth element and overwrite with last element
    -*/
    -void *qh_setdelnth(qhT *qh, setT *set, int nth) {
    -  void *elem;
    -  setelemT *sizep;
    -  setelemT *elemp, *lastp;
    -
    -  sizep= SETsizeaddr_(set);
    -  if ((sizep->i--)==0)         /*  if was a full set */
    -    sizep->i= set->maxsize;  /*     *sizep= (maxsize-1)+ 1 */
    -  if (nth < 0 || nth >= sizep->i) {
    -    qh_fprintf(qh, qh->qhmem.ferr, 6174, "qhull internal error (qh_setdelnth): nth %d is out-of-bounds for set:\n", nth);
    -    qh_setprint(qh, qh->qhmem.ferr, "", set);
    -    qh_errexit(qh, qhmem_ERRqhull, NULL, NULL);
    -  }
    -  elemp= (setelemT *)SETelemaddr_(set, nth, void); /* nth valid by QH6174 */
    -  lastp= (setelemT *)SETelemaddr_(set, sizep->i-1, void);
    -  elem= elemp->p;
    -  elemp->p= lastp->p;      /* may overwrite itself */
    -  lastp->p= NULL;
    -  return elem;
    -} /* setdelnth */
    -
    -/*---------------------------------
    -
    -  qh_setdelnthsorted(qh, set, nth )
    -    deletes nth element from sorted set
    -
    -  returns:
    -    returns the element (use type conversion)
    -
    -  notes:
    -    errors if nth invalid
    -
    -  see also:
    -    setnew_delnthsorted
    -
    -  design:
    -    setup points and check nth
    -    copy remaining elements down one
    -    update actual size
    -*/
    -void *qh_setdelnthsorted(qhT *qh, setT *set, int nth) {
    -  void *elem;
    -  setelemT *sizep;
    -  setelemT *newp, *oldp;
    -
    -  sizep= SETsizeaddr_(set);
    -  if (nth < 0 || (sizep->i && nth >= sizep->i-1) || nth >= set->maxsize) {
    -    qh_fprintf(qh, qh->qhmem.ferr, 6175, "qhull internal error (qh_setdelnthsorted): nth %d is out-of-bounds for set:\n", nth);
    -    qh_setprint(qh, qh->qhmem.ferr, "", set);
    -    qh_errexit(qh, qhmem_ERRqhull, NULL, NULL);
    -  }
    -  newp= (setelemT *)SETelemaddr_(set, nth, void);
    -  elem= newp->p;
    -  oldp= newp+1;
    -  while (((newp++)->p= (oldp++)->p))
    -    ; /* copy remaining elements and NULL */
    -  if ((sizep->i--)==0)         /*  if was a full set */
    -    sizep->i= set->maxsize;  /*     *sizep= (max size-1)+ 1 */
    -  return elem;
    -} /* setdelnthsorted */
    -
    -
    -/*---------------------------------
    -
    -  qh_setdelsorted(set, oldelem )
    -    deletes oldelem from sorted set
    -
    -  returns:
    -    returns oldelem if it was deleted
    -
    -  notes:
    -    set may be NULL
    -
    -  design:
    -    locate oldelem in set
    -    copy remaining elements down one
    -    update actual size
    -*/
    -void *qh_setdelsorted(setT *set, void *oldelem) {
    -  setelemT *sizep;
    -  setelemT *newp, *oldp;
    -
    -  if (!set)
    -    return NULL;
    -  newp= (setelemT *)SETaddr_(set, void);
    -  while(newp->p != oldelem && newp->p)
    -    newp++;
    -  if (newp->p) {
    -    oldp= newp+1;
    -    while (((newp++)->p= (oldp++)->p))
    -      ; /* copy remaining elements */
    -    sizep= SETsizeaddr_(set);
    -    if ((sizep->i--)==0)    /*  if was a full set */
    -      sizep->i= set->maxsize;  /*     *sizep= (max size-1)+ 1 */
    -    return oldelem;
    -  }
    -  return NULL;
    -} /* setdelsorted */
    -
    -
    -/*---------------------------------
    -
    -  qh_setduplicate(qh, set, elemsize )
    -    duplicate a set of elemsize elements
    -
    -  notes:
    -    use setcopy if retaining old elements
    -
    -  design:
    -    create a new set
    -    for each elem of the old set
    -      create a newelem
    -      append newelem to newset
    -*/
    -setT *qh_setduplicate(qhT *qh, setT *set, int elemsize) {
    -  void          *elem, **elemp, *newElem;
    -  setT          *newSet;
    -  int           size;
    -
    -  if (!(size= qh_setsize(qh, set)))
    -    return NULL;
    -  newSet= qh_setnew(qh, size);
    -  FOREACHelem_(set) {
    -    newElem= qh_memalloc(qh, elemsize);
    -    memcpy(newElem, elem, (size_t)elemsize);
    -    qh_setappend(qh, &newSet, newElem);
    -  }
    -  return newSet;
    -} /* setduplicate */
    -
    -
    -/*---------------------------------
    -
    -  qh_setendpointer( set )
    -    Returns pointer to NULL terminator of a set's elements
    -    set can not be NULL
    -
    -*/
    -void **qh_setendpointer(setT *set) {
    -
    -  setelemT *sizep= SETsizeaddr_(set);
    -  int n= sizep->i;
    -  return (n ? &set->e[n-1].p : &sizep->p);
    -} /* qh_setendpointer */
    -
    -/*---------------------------------
    -
    -  qh_setequal( setA, setB )
    -    returns 1 if two sorted sets are equal, otherwise returns 0
    -
    -  notes:
    -    either set may be NULL
    -
    -  design:
    -    check size of each set
    -    setup pointers
    -    compare elements of each set
    -*/
    -int qh_setequal(setT *setA, setT *setB) {
    -  void **elemAp, **elemBp;
    -  int sizeA= 0, sizeB= 0;
    -
    -  if (setA) {
    -    SETreturnsize_(setA, sizeA);
    -  }
    -  if (setB) {
    -    SETreturnsize_(setB, sizeB);
    -  }
    -  if (sizeA != sizeB)
    -    return 0;
    -  if (!sizeA)
    -    return 1;
    -  elemAp= SETaddr_(setA, void);
    -  elemBp= SETaddr_(setB, void);
    -  if (!memcmp((char *)elemAp, (char *)elemBp, sizeA*SETelemsize))
    -    return 1;
    -  return 0;
    -} /* setequal */
    -
    -
    -/*---------------------------------
    -
    -  qh_setequal_except( setA, skipelemA, setB, skipelemB )
    -    returns 1 if sorted setA and setB are equal except for skipelemA & B
    -
    -  returns:
    -    false if either skipelemA or skipelemB are missing
    -
    -  notes:
    -    neither set may be NULL
    -
    -    if skipelemB is NULL,
    -      can skip any one element of setB
    -
    -  design:
    -    setup pointers
    -    search for skipelemA, skipelemB, and mismatches
    -    check results
    -*/
    -int qh_setequal_except(setT *setA, void *skipelemA, setT *setB, void *skipelemB) {
    -  void **elemA, **elemB;
    -  int skip=0;
    -
    -  elemA= SETaddr_(setA, void);
    -  elemB= SETaddr_(setB, void);
    -  while (1) {
    -    if (*elemA == skipelemA) {
    -      skip++;
    -      elemA++;
    -    }
    -    if (skipelemB) {
    -      if (*elemB == skipelemB) {
    -        skip++;
    -        elemB++;
    -      }
    -    }else if (*elemA != *elemB) {
    -      skip++;
    -      if (!(skipelemB= *elemB++))
    -        return 0;
    -    }
    -    if (!*elemA)
    -      break;
    -    if (*elemA++ != *elemB++)
    -      return 0;
    -  }
    -  if (skip != 2 || *elemB)
    -    return 0;
    -  return 1;
    -} /* setequal_except */
    -
    -
    -/*---------------------------------
    -
    -  qh_setequal_skip( setA, skipA, setB, skipB )
    -    returns 1 if sorted setA and setB are equal except for elements skipA & B
    -
    -  returns:
    -    false if different size
    -
    -  notes:
    -    neither set may be NULL
    -
    -  design:
    -    setup pointers
    -    search for mismatches while skipping skipA and skipB
    -*/
    -int qh_setequal_skip(setT *setA, int skipA, setT *setB, int skipB) {
    -  void **elemA, **elemB, **skipAp, **skipBp;
    -
    -  elemA= SETaddr_(setA, void);
    -  elemB= SETaddr_(setB, void);
    -  skipAp= SETelemaddr_(setA, skipA, void);
    -  skipBp= SETelemaddr_(setB, skipB, void);
    -  while (1) {
    -    if (elemA == skipAp)
    -      elemA++;
    -    if (elemB == skipBp)
    -      elemB++;
    -    if (!*elemA)
    -      break;
    -    if (*elemA++ != *elemB++)
    -      return 0;
    -  }
    -  if (*elemB)
    -    return 0;
    -  return 1;
    -} /* setequal_skip */
    -
    -
    -/*---------------------------------
    -
    -  qh_setfree(qh, setp )
    -    frees the space occupied by a sorted or unsorted set
    -
    -  returns:
    -    sets setp to NULL
    -
    -  notes:
    -    set may be NULL
    -
    -  design:
    -    free array
    -    free set
    -*/
    -void qh_setfree(qhT *qh, setT **setp) {
    -  int size;
    -  void **freelistp;  /* used if !qh_NOmem by qh_memfree_() */
    -
    -  if (*setp) {
    -    size= sizeof(setT) + ((*setp)->maxsize)*SETelemsize;
    -    if (size <= qh->qhmem.LASTsize) {
    -      qh_memfree_(qh, *setp, size, freelistp);
    -    }else
    -      qh_memfree(qh, *setp, size);
    -    *setp= NULL;
    -  }
    -} /* setfree */
    -
    -
    -/*---------------------------------
    -
    -  qh_setfree2(qh, setp, elemsize )
    -    frees the space occupied by a set and its elements
    -
    -  notes:
    -    set may be NULL
    -
    -  design:
    -    free each element
    -    free set
    -*/
    -void qh_setfree2(qhT *qh, setT **setp, int elemsize) {
    -  void          *elem, **elemp;
    -
    -  FOREACHelem_(*setp)
    -    qh_memfree(qh, elem, elemsize);
    -  qh_setfree(qh, setp);
    -} /* setfree2 */
    -
    -
    -
    -/*---------------------------------
    -
    -  qh_setfreelong(qh, setp )
    -    frees a set only if it's in long memory
    -
    -  returns:
    -    sets setp to NULL if it is freed
    -
    -  notes:
    -    set may be NULL
    -
    -  design:
    -    if set is large
    -      free it
    -*/
    -void qh_setfreelong(qhT *qh, setT **setp) {
    -  int size;
    -
    -  if (*setp) {
    -    size= sizeof(setT) + ((*setp)->maxsize)*SETelemsize;
    -    if (size > qh->qhmem.LASTsize) {
    -      qh_memfree(qh, *setp, size);
    -      *setp= NULL;
    -    }
    -  }
    -} /* setfreelong */
    -
    -
    -/*---------------------------------
    -
    -  qh_setin(set, setelem )
    -    returns 1 if setelem is in a set, 0 otherwise
    -
    -  notes:
    -    set may be NULL or unsorted
    -
    -  design:
    -    scans set for setelem
    -*/
    -int qh_setin(setT *set, void *setelem) {
    -  void *elem, **elemp;
    -
    -  FOREACHelem_(set) {
    -    if (elem == setelem)
    -      return 1;
    -  }
    -  return 0;
    -} /* setin */
    -
    -
    -/*---------------------------------
    -
    -  qh_setindex(set, atelem )
    -    returns the index of atelem in set.
    -    returns -1, if not in set or maxsize wrong
    -
    -  notes:
    -    set may be NULL and may contain nulls.
    -    NOerrors returned (qh_pointid, QhullPoint::id)
    -
    -  design:
    -    checks maxsize
    -    scans set for atelem
    -*/
    -int qh_setindex(setT *set, void *atelem) {
    -  void **elem;
    -  int size, i;
    -
    -  if (!set)
    -    return -1;
    -  SETreturnsize_(set, size);
    -  if (size > set->maxsize)
    -    return -1;
    -  elem= SETaddr_(set, void);
    -  for (i=0; i < size; i++) {
    -    if (*elem++ == atelem)
    -      return i;
    -  }
    -  return -1;
    -} /* setindex */
    -
    -
    -/*---------------------------------
    -
    -  qh_setlarger(qh, oldsetp )
    -    returns a larger set that contains all elements of *oldsetp
    -
    -  notes:
    -    the set is at least twice as large
    -    if temp set, updates qh->qhmem.tempstack
    -
    -  design:
    -    creates a new set
    -    copies the old set to the new set
    -    updates pointers in tempstack
    -    deletes the old set
    -*/
    -void qh_setlarger(qhT *qh, setT **oldsetp) {
    -  int size= 1;
    -  setT *newset, *set, **setp, *oldset;
    -  setelemT *sizep;
    -  setelemT *newp, *oldp;
    -
    -  if (*oldsetp) {
    -    oldset= *oldsetp;
    -    SETreturnsize_(oldset, size);
    -    qh->qhmem.cntlarger++;
    -    qh->qhmem.totlarger += size+1;
    -    newset= qh_setnew(qh, 2 * size);
    -    oldp= (setelemT *)SETaddr_(oldset, void);
    -    newp= (setelemT *)SETaddr_(newset, void);
    -    memcpy((char *)newp, (char *)oldp, (size_t)(size+1) * SETelemsize);
    -    sizep= SETsizeaddr_(newset);
    -    sizep->i= size+1;
    -    FOREACHset_((setT *)qh->qhmem.tempstack) {
    -      if (set == oldset)
    -        *(setp-1)= newset;
    -    }
    -    qh_setfree(qh, oldsetp);
    -  }else
    -    newset= qh_setnew(qh, 3);
    -  *oldsetp= newset;
    -} /* setlarger */
    -
    -
    -/*---------------------------------
    -
    -  qh_setlast( set )
    -    return last element of set or NULL (use type conversion)
    -
    -  notes:
    -    set may be NULL
    -
    -  design:
    -    return last element
    -*/
    -void *qh_setlast(setT *set) {
    -  int size;
    -
    -  if (set) {
    -    size= SETsizeaddr_(set)->i;
    -    if (!size)
    -      return SETelem_(set, set->maxsize - 1);
    -    else if (size > 1)
    -      return SETelem_(set, size - 2);
    -  }
    -  return NULL;
    -} /* setlast */
    -
    -
    -/*---------------------------------
    -
    -  qh_setnew(qh, setsize )
    -    creates and allocates space for a set
    -
    -  notes:
    -    setsize means the number of elements (!including the NULL terminator)
    -    use qh_settemp/qh_setfreetemp if set is temporary
    -
    -  design:
    -    allocate memory for set
    -    roundup memory if small set
    -    initialize as empty set
    -*/
    -setT *qh_setnew(qhT *qh, int setsize) {
    -  setT *set;
    -  int sizereceived; /* used if !qh_NOmem */
    -  int size;
    -  void **freelistp; /* used if !qh_NOmem by qh_memalloc_() */
    -
    -  if (!setsize)
    -    setsize++;
    -  size= sizeof(setT) + setsize * SETelemsize;
    -  if (size>0 && size <= qh->qhmem.LASTsize) {
    -    qh_memalloc_(qh, size, freelistp, set, setT);
    -#ifndef qh_NOmem
    -    sizereceived= qh->qhmem.sizetable[ qh->qhmem.indextable[size]];
    -    if (sizereceived > size)
    -      setsize += (sizereceived - size)/SETelemsize;
    -#endif
    -  }else
    -    set= (setT*)qh_memalloc(qh, size);
    -  set->maxsize= setsize;
    -  set->e[setsize].i= 1;
    -  set->e[0].p= NULL;
    -  return(set);
    -} /* setnew */
    -
    -
    -/*---------------------------------
    -
    -  qh_setnew_delnthsorted(qh, set, size, nth, prepend )
    -    creates a sorted set not containing nth element
    -    if prepend, the first prepend elements are undefined
    -
    -  notes:
    -    set must be defined
    -    checks nth
    -    see also: setdelnthsorted
    -
    -  design:
    -    create new set
    -    setup pointers and allocate room for prepend'ed entries
    -    append head of old set to new set
    -    append tail of old set to new set
    -*/
    -setT *qh_setnew_delnthsorted(qhT *qh, setT *set, int size, int nth, int prepend) {
    -  setT *newset;
    -  void **oldp, **newp;
    -  int tailsize= size - nth -1, newsize;
    -
    -  if (tailsize < 0) {
    -    qh_fprintf(qh, qh->qhmem.ferr, 6176, "qhull internal error (qh_setnew_delnthsorted): nth %d is out-of-bounds for set:\n", nth);
    -    qh_setprint(qh, qh->qhmem.ferr, "", set);
    -    qh_errexit(qh, qhmem_ERRqhull, NULL, NULL);
    -  }
    -  newsize= size-1 + prepend;
    -  newset= qh_setnew(qh, newsize);
    -  newset->e[newset->maxsize].i= newsize+1;  /* may be overwritten */
    -  oldp= SETaddr_(set, void);
    -  newp= SETaddr_(newset, void) + prepend;
    -  switch (nth) {
    -  case 0:
    -    break;
    -  case 1:
    -    *(newp++)= *oldp++;
    -    break;
    -  case 2:
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    break;
    -  case 3:
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    break;
    -  case 4:
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    break;
    -  default:
    -    memcpy((char *)newp, (char *)oldp, (size_t)nth * SETelemsize);
    -    newp += nth;
    -    oldp += nth;
    -    break;
    -  }
    -  oldp++;
    -  switch (tailsize) {
    -  case 0:
    -    break;
    -  case 1:
    -    *(newp++)= *oldp++;
    -    break;
    -  case 2:
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    break;
    -  case 3:
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    break;
    -  case 4:
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    *(newp++)= *oldp++;
    -    break;
    -  default:
    -    memcpy((char *)newp, (char *)oldp, (size_t)tailsize * SETelemsize);
    -    newp += tailsize;
    -  }
    -  *newp= NULL;
    -  return(newset);
    -} /* setnew_delnthsorted */
    -
    -
    -/*---------------------------------
    -
    -  qh_setprint(qh, fp, string, set )
    -    print set elements to fp with identifying string
    -
    -  notes:
    -    never errors
    -*/
    -void qh_setprint(qhT *qh, FILE *fp, const char* string, setT *set) {
    -  int size, k;
    -
    -  if (!set)
    -    qh_fprintf(qh, fp, 9346, "%s set is null\n", string);
    -  else {
    -    SETreturnsize_(set, size);
    -    qh_fprintf(qh, fp, 9347, "%s set=%p maxsize=%d size=%d elems=",
    -             string, set, set->maxsize, size);
    -    if (size > set->maxsize)
    -      size= set->maxsize+1;
    -    for (k=0; k < size; k++)
    -      qh_fprintf(qh, fp, 9348, " %p", set->e[k].p);
    -    qh_fprintf(qh, fp, 9349, "\n");
    -  }
    -} /* setprint */
    -
    -/*---------------------------------
    -
    -  qh_setreplace(qh, set, oldelem, newelem )
    -    replaces oldelem in set with newelem
    -
    -  notes:
    -    errors if oldelem not in the set
    -    newelem may be NULL, but it turns the set into an indexed set (no FOREACH)
    -
    -  design:
    -    find oldelem
    -    replace with newelem
    -*/
    -void qh_setreplace(qhT *qh, setT *set, void *oldelem, void *newelem) {
    -  void **elemp;
    -
    -  elemp= SETaddr_(set, void);
    -  while (*elemp != oldelem && *elemp)
    -    elemp++;
    -  if (*elemp)
    -    *elemp= newelem;
    -  else {
    -    qh_fprintf(qh, qh->qhmem.ferr, 6177, "qhull internal error (qh_setreplace): elem %p not found in set\n",
    -       oldelem);
    -    qh_setprint(qh, qh->qhmem.ferr, "", set);
    -    qh_errexit(qh, qhmem_ERRqhull, NULL, NULL);
    -  }
    -} /* setreplace */
    -
    -
    -/*---------------------------------
    -
    -  qh_setsize(qh, set )
    -    returns the size of a set
    -
    -  notes:
    -    errors if set's maxsize is incorrect
    -    same as SETreturnsize_(set)
    -    same code for qh_setsize [qset_r.c] and QhullSetBase::count
    -
    -  design:
    -    determine actual size of set from maxsize
    -*/
    -int qh_setsize(qhT *qh, setT *set) {
    -  int size;
    -  setelemT *sizep;
    -
    -  if (!set)
    -    return(0);
    -  sizep= SETsizeaddr_(set);
    -  if ((size= sizep->i)) {
    -    size--;
    -    if (size > set->maxsize) {
    -      qh_fprintf(qh, qh->qhmem.ferr, 6178, "qhull internal error (qh_setsize): current set size %d is greater than maximum size %d\n",
    -               size, set->maxsize);
    -      qh_setprint(qh, qh->qhmem.ferr, "set: ", set);
    -      qh_errexit(qh, qhmem_ERRqhull, NULL, NULL);
    -    }
    -  }else
    -    size= set->maxsize;
    -  return size;
    -} /* setsize */
    -
    -/*---------------------------------
    -
    -  qh_settemp(qh, setsize )
    -    return a stacked, temporary set of upto setsize elements
    -
    -  notes:
    -    use settempfree or settempfree_all to release from qh->qhmem.tempstack
    -    see also qh_setnew
    -
    -  design:
    -    allocate set
    -    append to qh->qhmem.tempstack
    -
    -*/
    -setT *qh_settemp(qhT *qh, int setsize) {
    -  setT *newset;
    -
    -  newset= qh_setnew(qh, setsize);
    -  qh_setappend(qh, &qh->qhmem.tempstack, newset);
    -  if (qh->qhmem.IStracing >= 5)
    -    qh_fprintf(qh, qh->qhmem.ferr, 8123, "qh_settemp: temp set %p of %d elements, depth %d\n",
    -       newset, newset->maxsize, qh_setsize(qh, qh->qhmem.tempstack));
    -  return newset;
    -} /* settemp */
    -
    -/*---------------------------------
    -
    -  qh_settempfree(qh, set )
    -    free temporary set at top of qh->qhmem.tempstack
    -
    -  notes:
    -    nop if set is NULL
    -    errors if set not from previous   qh_settemp
    -
    -  to locate errors:
    -    use 'T2' to find source and then find mis-matching qh_settemp
    -
    -  design:
    -    check top of qh->qhmem.tempstack
    -    free it
    -*/
    -void qh_settempfree(qhT *qh, setT **set) {
    -  setT *stackedset;
    -
    -  if (!*set)
    -    return;
    -  stackedset= qh_settemppop(qh);
    -  if (stackedset != *set) {
    -    qh_settemppush(qh, stackedset);
    -    qh_fprintf(qh, qh->qhmem.ferr, 6179, "qhull internal error (qh_settempfree): set %p(size %d) was not last temporary allocated(depth %d, set %p, size %d)\n",
    -             *set, qh_setsize(qh, *set), qh_setsize(qh, qh->qhmem.tempstack)+1,
    -             stackedset, qh_setsize(qh, stackedset));
    -    qh_errexit(qh, qhmem_ERRqhull, NULL, NULL);
    -  }
    -  qh_setfree(qh, set);
    -} /* settempfree */
    -
    -/*---------------------------------
    -
    -  qh_settempfree_all(qh)
    -    free all temporary sets in qh->qhmem.tempstack
    -
    -  design:
    -    for each set in tempstack
    -      free set
    -    free qh->qhmem.tempstack
    -*/
    -void qh_settempfree_all(qhT *qh) {
    -  setT *set, **setp;
    -
    -  FOREACHset_(qh->qhmem.tempstack)
    -    qh_setfree(qh, &set);
    -  qh_setfree(qh, &qh->qhmem.tempstack);
    -} /* settempfree_all */
    -
    -/*---------------------------------
    -
    -  qh_settemppop(qh)
    -    pop and return temporary set from qh->qhmem.tempstack
    -
    -  notes:
    -    the returned set is permanent
    -
    -  design:
    -    pop and check top of qh->qhmem.tempstack
    -*/
    -setT *qh_settemppop(qhT *qh) {
    -  setT *stackedset;
    -
    -  stackedset= (setT*)qh_setdellast(qh->qhmem.tempstack);
    -  if (!stackedset) {
    -    qh_fprintf(qh, qh->qhmem.ferr, 6180, "qhull internal error (qh_settemppop): pop from empty temporary stack\n");
    -    qh_errexit(qh, qhmem_ERRqhull, NULL, NULL);
    -  }
    -  if (qh->qhmem.IStracing >= 5)
    -    qh_fprintf(qh, qh->qhmem.ferr, 8124, "qh_settemppop: depth %d temp set %p of %d elements\n",
    -       qh_setsize(qh, qh->qhmem.tempstack)+1, stackedset, qh_setsize(qh, stackedset));
    -  return stackedset;
    -} /* settemppop */
    -
    -/*---------------------------------
    -
    -  qh_settemppush(qh, set )
    -    push temporary set unto qh->qhmem.tempstack (makes it temporary)
    -
    -  notes:
    -    duplicates settemp() for tracing
    -
    -  design:
    -    append set to tempstack
    -*/
    -void qh_settemppush(qhT *qh, setT *set) {
    -  if (!set) {
    -    qh_fprintf(qh, qh->qhmem.ferr, 6267, "qhull error (qh_settemppush): can not push a NULL temp\n");
    -    qh_errexit(qh, qhmem_ERRqhull, NULL, NULL);
    -  }
    -  qh_setappend(qh, &qh->qhmem.tempstack, set);
    -  if (qh->qhmem.IStracing >= 5)
    -    qh_fprintf(qh, qh->qhmem.ferr, 8125, "qh_settemppush: depth %d temp set %p of %d elements\n",
    -      qh_setsize(qh, qh->qhmem.tempstack), set, qh_setsize(qh, set));
    -} /* settemppush */
    -
    -
    -/*---------------------------------
    -
    -  qh_settruncate(qh, set, size )
    -    truncate set to size elements
    -
    -  notes:
    -    set must be defined
    -
    -  see:
    -    SETtruncate_
    -
    -  design:
    -    check size
    -    update actual size of set
    -*/
    -void qh_settruncate(qhT *qh, setT *set, int size) {
    -
    -  if (size < 0 || size > set->maxsize) {
    -    qh_fprintf(qh, qh->qhmem.ferr, 6181, "qhull internal error (qh_settruncate): size %d out of bounds for set:\n", size);
    -    qh_setprint(qh, qh->qhmem.ferr, "", set);
    -    qh_errexit(qh, qhmem_ERRqhull, NULL, NULL);
    -  }
    -  set->e[set->maxsize].i= size+1;   /* maybe overwritten */
    -  set->e[size].p= NULL;
    -} /* settruncate */
    -
    -/*---------------------------------
    -
    -  qh_setunique(qh, set, elem )
    -    add elem to unsorted set unless it is already in set
    -
    -  notes:
    -    returns 1 if it is appended
    -
    -  design:
    -    if elem not in set
    -      append elem to set
    -*/
    -int qh_setunique(qhT *qh, setT **set, void *elem) {
    -
    -  if (!qh_setin(*set, elem)) {
    -    qh_setappend(qh, set, elem);
    -    return 1;
    -  }
    -  return 0;
    -} /* setunique */
    -
    -/*---------------------------------
    -
    -  qh_setzero(qh, set, index, size )
    -    zero elements from index on
    -    set actual size of set to size
    -
    -  notes:
    -    set must be defined
    -    the set becomes an indexed set (can not use FOREACH...)
    -
    -  see also:
    -    qh_settruncate
    -
    -  design:
    -    check index and size
    -    update actual size
    -    zero elements starting at e[index]
    -*/
    -void qh_setzero(qhT *qh, setT *set, int idx, int size) {
    -  int count;
    -
    -  if (idx < 0 || idx >= size || size > set->maxsize) {
    -    qh_fprintf(qh, qh->qhmem.ferr, 6182, "qhull internal error (qh_setzero): index %d or size %d out of bounds for set:\n", idx, size);
    -    qh_setprint(qh, qh->qhmem.ferr, "", set);
    -    qh_errexit(qh, qhmem_ERRqhull, NULL, NULL);
    -  }
    -  set->e[set->maxsize].i=  size+1;  /* may be overwritten */
    -  count= size - idx + 1;   /* +1 for NULL terminator */
    -  memset((char *)SETelemaddr_(set, idx, void), 0, (size_t)count * SETelemsize);
    -} /* setzero */
    -
    -
    diff --git a/src/qhull/src/libqhull_r/qset_r.h b/src/qhull/src/libqhull_r/qset_r.h
    deleted file mode 100644
    index 7ba199d6f44..00000000000
    --- a/src/qhull/src/libqhull_r/qset_r.h
    +++ /dev/null
    @@ -1,502 +0,0 @@
    -/*
      ---------------------------------
    -
    -   qset_r.h
    -     header file for qset_r.c that implements set
    -
    -   see qh-set_r.htm and qset_r.c
    -
    -   only uses mem_r.c, malloc/free
    -
    -   for error handling, writes message and calls
    -      qh_errexit(qhT *qh, qhmem_ERRqhull, NULL, NULL);
    -
    -   set operations satisfy the following properties:
    -    - sets have a max size, the actual size (if different) is stored at the end
    -    - every set is NULL terminated
    -    - sets may be sorted or unsorted, the caller must distinguish this
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull_r/qset_r.h#4 $$Change: 2079 $
    -   $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -*/
    -
    -#ifndef qhDEFset
    -#define qhDEFset 1
    -
    -#include 
    -
    -/*================= -structures- ===============*/
    -
    -#ifndef DEFsetT
    -#define DEFsetT 1
    -typedef struct setT setT;   /* a set is a sorted or unsorted array of pointers */
    -#endif
    -
    -#ifndef DEFqhT
    -#define DEFqhT 1
    -typedef struct qhT qhT;          /* defined in libqhull_r.h */
    -#endif
    -
    -/* [jan'15] Decided not to use countT.  Most sets are small.  The code uses signed tests */
    -
    -/*------------------------------------------
    -
    -setT
    -  a set or list of pointers with maximum size and actual size.
    -
    -variations:
    -  unsorted, unique   -- a list of unique pointers with NULL terminator
    -                           user guarantees uniqueness
    -  sorted             -- a sorted list of unique pointers with NULL terminator
    -                           qset_r.c guarantees uniqueness
    -  unsorted           -- a list of pointers terminated with NULL
    -  indexed            -- an array of pointers with NULL elements
    -
    -structure for set of n elements:
    -
    -        --------------
    -        |  maxsize
    -        --------------
    -        |  e[0] - a pointer, may be NULL for indexed sets
    -        --------------
    -        |  e[1]
    -
    -        --------------
    -        |  ...
    -        --------------
    -        |  e[n-1]
    -        --------------
    -        |  e[n] = NULL
    -        --------------
    -        |  ...
    -        --------------
    -        |  e[maxsize] - n+1 or NULL (determines actual size of set)
    -        --------------
    -
    -*/
    -
    -/*-- setelemT -- internal type to allow both pointers and indices
    -*/
    -typedef union setelemT setelemT;
    -union setelemT {
    -  void    *p;
    -  int   i;         /* integer used for e[maxSize] */
    -};
    -
    -struct setT {
    -  int maxsize;          /* maximum number of elements (except NULL) */
    -  setelemT e[1];        /* array of pointers, tail is NULL */
    -                        /* last slot (unless NULL) is actual size+1
    -                           e[maxsize]==NULL or e[e[maxsize]-1]==NULL */
    -                        /* this may generate a warning since e[] contains
    -                           maxsize elements */
    -};
    -
    -/*=========== -constants- =========================*/
    -
    -/*-------------------------------------
    -
    -  SETelemsize
    -    size of a set element in bytes
    -*/
    -#define SETelemsize ((int)sizeof(setelemT))
    -
    -
    -/*=========== -macros- =========================*/
    -
    -/*-------------------------------------
    -
    -   FOREACHsetelement_(type, set, variable)
    -     define FOREACH iterator
    -
    -   declare:
    -     assumes *variable and **variablep are declared
    -     no space in "variable)" [DEC Alpha cc compiler]
    -
    -   each iteration:
    -     variable is set element
    -     variablep is one beyond variable.
    -
    -   to repeat an element:
    -     variablep--; / *repeat* /
    -
    -   at exit:
    -     variable is NULL at end of loop
    -
    -   example:
    -     #define FOREACHfacet_( facets ) FOREACHsetelement_( facetT, facets, facet )
    -
    -   notes:
    -     use FOREACHsetelement_i_() if need index or include NULLs
    -
    -   WARNING:
    -     nested loops can't use the same variable (define another FOREACH)
    -
    -     needs braces if nested inside another FOREACH
    -     this includes intervening blocks, e.g. FOREACH...{ if () FOREACH...} )
    -*/
    -#define FOREACHsetelement_(type, set, variable) \
    -        if (((variable= NULL), set)) for (\
    -          variable##p= (type **)&((set)->e[0].p); \
    -          (variable= *variable##p++);)
    -
    -/*------------------------------------------
    -
    -   FOREACHsetelement_i_(qh, type, set, variable)
    -     define indexed FOREACH iterator
    -
    -   declare:
    -     type *variable, variable_n, variable_i;
    -
    -   each iteration:
    -     variable is set element, may be NULL
    -     variable_i is index, variable_n is qh_setsize()
    -
    -   to repeat an element:
    -     variable_i--; variable_n-- repeats for deleted element
    -
    -   at exit:
    -     variable==NULL and variable_i==variable_n
    -
    -   example:
    -     #define FOREACHfacet_i_( qh, facets ) FOREACHsetelement_i_( qh, facetT, facets, facet )
    -
    -   WARNING:
    -     nested loops can't use the same variable (define another FOREACH)
    -
    -     needs braces if nested inside another FOREACH
    -     this includes intervening blocks, e.g. FOREACH...{ if () FOREACH...} )
    -*/
    -#define FOREACHsetelement_i_(qh, type, set, variable) \
    -        if (((variable= NULL), set)) for (\
    -          variable##_i= 0, variable= (type *)((set)->e[0].p), \
    -                   variable##_n= qh_setsize(qh, set);\
    -          variable##_i < variable##_n;\
    -          variable= (type *)((set)->e[++variable##_i].p) )
    -
    -/*----------------------------------------
    -
    -   FOREACHsetelementreverse_(qh, type, set, variable)-
    -     define FOREACH iterator in reverse order
    -
    -   declare:
    -     assumes *variable and **variablep are declared
    -     also declare 'int variabletemp'
    -
    -   each iteration:
    -     variable is set element
    -
    -   to repeat an element:
    -     variabletemp++; / *repeat* /
    -
    -   at exit:
    -     variable is NULL
    -
    -   example:
    -     #define FOREACHvertexreverse_( vertices ) FOREACHsetelementreverse_( vertexT, vertices, vertex )
    -
    -   notes:
    -     use FOREACHsetelementreverse12_() to reverse first two elements
    -     WARNING: needs braces if nested inside another FOREACH
    -*/
    -#define FOREACHsetelementreverse_(qh, type, set, variable) \
    -        if (((variable= NULL), set)) for (\
    -           variable##temp= qh_setsize(qh, set)-1, variable= qh_setlast(qh, set);\
    -           variable; variable= \
    -           ((--variable##temp >= 0) ? SETelemt_(set, variable##temp, type) : NULL))
    -
    -/*-------------------------------------
    -
    -   FOREACHsetelementreverse12_(type, set, variable)-
    -     define FOREACH iterator with e[1] and e[0] reversed
    -
    -   declare:
    -     assumes *variable and **variablep are declared
    -
    -   each iteration:
    -     variable is set element
    -     variablep is one after variable.
    -
    -   to repeat an element:
    -     variablep--; / *repeat* /
    -
    -   at exit:
    -     variable is NULL at end of loop
    -
    -   example
    -     #define FOREACHvertexreverse12_( vertices ) FOREACHsetelementreverse12_( vertexT, vertices, vertex )
    -
    -   notes:
    -     WARNING: needs braces if nested inside another FOREACH
    -*/
    -#define FOREACHsetelementreverse12_(type, set, variable) \
    -        if (((variable= NULL), set)) for (\
    -          variable##p= (type **)&((set)->e[1].p); \
    -          (variable= *variable##p); \
    -          variable##p == ((type **)&((set)->e[0].p))?variable##p += 2: \
    -              (variable##p == ((type **)&((set)->e[1].p))?variable##p--:variable##p++))
    -
    -/*-------------------------------------
    -
    -   FOREACHelem_( set )-
    -     iterate elements in a set
    -
    -   declare:
    -     void *elem, *elemp;
    -
    -   each iteration:
    -     elem is set element
    -     elemp is one beyond
    -
    -   to repeat an element:
    -     elemp--; / *repeat* /
    -
    -   at exit:
    -     elem == NULL at end of loop
    -
    -   example:
    -     FOREACHelem_(set) {
    -
    -   notes:
    -     WARNING: needs braces if nested inside another FOREACH
    -*/
    -#define FOREACHelem_(set) FOREACHsetelement_(void, set, elem)
    -
    -/*-------------------------------------
    -
    -   FOREACHset_( set )-
    -     iterate a set of sets
    -
    -   declare:
    -     setT *set, **setp;
    -
    -   each iteration:
    -     set is set element
    -     setp is one beyond
    -
    -   to repeat an element:
    -     setp--; / *repeat* /
    -
    -   at exit:
    -     set == NULL at end of loop
    -
    -   example
    -     FOREACHset_(sets) {
    -
    -   notes:
    -     WARNING: needs braces if nested inside another FOREACH
    -*/
    -#define FOREACHset_(sets) FOREACHsetelement_(setT, sets, set)
    -
    -/*-------------------------------------------
    -
    -   SETindex_( set, elem )
    -     return index of elem in set
    -
    -   notes:
    -     for use with FOREACH iteration
    -     WARN64 -- Maximum set size is 2G
    -
    -   example:
    -     i= SETindex_(ridges, ridge)
    -*/
    -#define SETindex_(set, elem) ((int)((void **)elem##p - (void **)&(set)->e[1].p))
    -
    -/*-----------------------------------------
    -
    -   SETref_( elem )
    -     l.h.s. for modifying the current element in a FOREACH iteration
    -
    -   example:
    -     SETref_(ridge)= anotherridge;
    -*/
    -#define SETref_(elem) (elem##p[-1])
    -
    -/*-----------------------------------------
    -
    -   SETelem_(set, n)
    -     return the n'th element of set
    -
    -   notes:
    -      assumes that n is valid [0..size] and that set is defined
    -      use SETelemt_() for type cast
    -*/
    -#define SETelem_(set, n)           ((set)->e[n].p)
    -
    -/*-----------------------------------------
    -
    -   SETelemt_(set, n, type)
    -     return the n'th element of set as a type
    -
    -   notes:
    -      assumes that n is valid [0..size] and that set is defined
    -*/
    -#define SETelemt_(set, n, type)    ((type*)((set)->e[n].p))
    -
    -/*-----------------------------------------
    -
    -   SETelemaddr_(set, n, type)
    -     return address of the n'th element of a set
    -
    -   notes:
    -      assumes that n is valid [0..size] and set is defined
    -*/
    -#define SETelemaddr_(set, n, type) ((type **)(&((set)->e[n].p)))
    -
    -/*-----------------------------------------
    -
    -   SETfirst_(set)
    -     return first element of set
    -
    -*/
    -#define SETfirst_(set)             ((set)->e[0].p)
    -
    -/*-----------------------------------------
    -
    -   SETfirstt_(set, type)
    -     return first element of set as a type
    -
    -*/
    -#define SETfirstt_(set, type)      ((type*)((set)->e[0].p))
    -
    -/*-----------------------------------------
    -
    -   SETsecond_(set)
    -     return second element of set
    -
    -*/
    -#define SETsecond_(set)            ((set)->e[1].p)
    -
    -/*-----------------------------------------
    -
    -   SETsecondt_(set, type)
    -     return second element of set as a type
    -*/
    -#define SETsecondt_(set, type)     ((type*)((set)->e[1].p))
    -
    -/*-----------------------------------------
    -
    -   SETaddr_(set, type)
    -       return address of set's elements
    -*/
    -#define SETaddr_(set,type)         ((type **)(&((set)->e[0].p)))
    -
    -/*-----------------------------------------
    -
    -   SETreturnsize_(set, size)
    -     return size of a set
    -
    -   notes:
    -      set must be defined
    -      use qh_setsize(qhT *qh, set) unless speed is critical
    -*/
    -#define SETreturnsize_(set, size) (((size)= ((set)->e[(set)->maxsize].i))?(--(size)):((size)= (set)->maxsize))
    -
    -/*-----------------------------------------
    -
    -   SETempty_(set)
    -     return true(1) if set is empty
    -
    -   notes:
    -      set may be NULL
    -*/
    -#define SETempty_(set)            (!set || (SETfirst_(set) ? 0 : 1))
    -
    -/*---------------------------------
    -
    -  SETsizeaddr_(set)
    -    return pointer to 'actual size+1' of set (set CANNOT be NULL!!)
    -    Its type is setelemT* for strict aliasing
    -    All SETelemaddr_ must be cast to setelemT
    -
    -
    -  notes:
    -    *SETsizeaddr==NULL or e[*SETsizeaddr-1].p==NULL
    -*/
    -#define SETsizeaddr_(set) (&((set)->e[(set)->maxsize]))
    -
    -/*-----------------------------------------
    -
    -   SETtruncate_(set, size)
    -     truncate set to size
    -
    -   see:
    -     qh_settruncate()
    -
    -*/
    -#define SETtruncate_(set, size) {set->e[set->maxsize].i= size+1; /* maybe overwritten */ \
    -      set->e[size].p= NULL;}
    -
    -/*======= prototypes in alphabetical order ============*/
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -void  qh_setaddsorted(qhT *qh, setT **setp, void *elem);
    -void  qh_setaddnth(qhT *qh, setT **setp, int nth, void *newelem);
    -void  qh_setappend(qhT *qh, setT **setp, void *elem);
    -void  qh_setappend_set(qhT *qh, setT **setp, setT *setA);
    -void  qh_setappend2ndlast(qhT *qh, setT **setp, void *elem);
    -void  qh_setcheck(qhT *qh, setT *set, const char *tname, unsigned id);
    -void  qh_setcompact(qhT *qh, setT *set);
    -setT *qh_setcopy(qhT *qh, setT *set, int extra);
    -void *qh_setdel(setT *set, void *elem);
    -void *qh_setdellast(setT *set);
    -void *qh_setdelnth(qhT *qh, setT *set, int nth);
    -void *qh_setdelnthsorted(qhT *qh, setT *set, int nth);
    -void *qh_setdelsorted(setT *set, void *newelem);
    -setT *qh_setduplicate(qhT *qh, setT *set, int elemsize);
    -void **qh_setendpointer(setT *set);
    -int   qh_setequal(setT *setA, setT *setB);
    -int   qh_setequal_except(setT *setA, void *skipelemA, setT *setB, void *skipelemB);
    -int   qh_setequal_skip(setT *setA, int skipA, setT *setB, int skipB);
    -void  qh_setfree(qhT *qh, setT **set);
    -void  qh_setfree2(qhT *qh, setT **setp, int elemsize);
    -void  qh_setfreelong(qhT *qh, setT **set);
    -int   qh_setin(setT *set, void *setelem);
    -int qh_setindex(setT *set, void *setelem);
    -void  qh_setlarger(qhT *qh, setT **setp);
    -void *qh_setlast(setT *set);
    -setT *qh_setnew(qhT *qh, int size);
    -setT *qh_setnew_delnthsorted(qhT *qh, setT *set, int size, int nth, int prepend);
    -void  qh_setprint(qhT *qh, FILE *fp, const char* string, setT *set);
    -void  qh_setreplace(qhT *qh, setT *set, void *oldelem, void *newelem);
    -int qh_setsize(qhT *qh, setT *set);
    -setT *qh_settemp(qhT *qh, int setsize);
    -void  qh_settempfree(qhT *qh, setT **set);
    -void  qh_settempfree_all(qhT *qh);
    -setT *qh_settemppop(qhT *qh);
    -void  qh_settemppush(qhT *qh, setT *set);
    -void  qh_settruncate(qhT *qh, setT *set, int size);
    -int   qh_setunique(qhT *qh, setT **set, void *elem);
    -void  qh_setzero(qhT *qh, setT *set, int idx, int size);
    -
    -#ifdef __cplusplus
    -} /* extern "C" */
    -#endif
    -
    -#endif /* qhDEFset */
    diff --git a/src/qhull/src/libqhull_r/random_r.c b/src/qhull/src/libqhull_r/random_r.c
    deleted file mode 100644
    index 1fefb51c36d..00000000000
    --- a/src/qhull/src/libqhull_r/random_r.c
    +++ /dev/null
    @@ -1,247 +0,0 @@
    -/*
      ---------------------------------
    -
    -   random_r.c and utilities
    -     Park & Miller's minimimal standard random number generator
    -     argc/argv conversion
    -
    -     Used by rbox.  Do not use 'qh' 
    -*/
    -
    -#include "libqhull_r.h"
    -#include "random_r.h"
    -
    -#include 
    -#include 
    -#include 
    -
    -#ifdef _MSC_VER  /* Microsoft Visual C++ -- warning level 4 */
    -#pragma warning( disable : 4706)  /* assignment within conditional function */
    -#pragma warning( disable : 4996)  /* function was declared deprecated(strcpy, localtime, etc.) */
    -#endif
    -
    -/*---------------------------------
    -
    - qh_argv_to_command(argc, argv, command, max_size )
    -
    -    build command from argc/argv
    -    max_size is at least
    -
    - returns:
    -    a space-delimited string of options (just as typed)
    -    returns false if max_size is too short
    -
    - notes:
    -    silently removes
    -    makes option string easy to input and output
    -    matches qh_argv_to_command_size()
    -
    -    argc may be 0
    -*/
    -int qh_argv_to_command(int argc, char *argv[], char* command, int max_size) {
    -  int i, remaining;
    -  char *s;
    -  *command= '\0';  /* max_size > 0 */
    -
    -  if (argc) {
    -    if ((s= strrchr( argv[0], '\\')) /* get filename w/o .exe extension */
    -    || (s= strrchr( argv[0], '/')))
    -        s++;
    -    else
    -        s= argv[0];
    -    if ((int)strlen(s) < max_size)   /* WARN64 */
    -        strcpy(command, s);
    -    else
    -        goto error_argv;
    -    if ((s= strstr(command, ".EXE"))
    -    ||  (s= strstr(command, ".exe")))
    -        *s= '\0';
    -  }
    -  for (i=1; i < argc; i++) {
    -    s= argv[i];
    -    remaining= max_size - (int)strlen(command) - (int)strlen(s) - 2;   /* WARN64 */
    -    if (!*s || strchr(s, ' ')) {
    -      char *t= command + strlen(command);
    -      remaining -= 2;
    -      if (remaining < 0) {
    -        goto error_argv;
    -      }
    -      *t++= ' ';
    -      *t++= '"';
    -      while (*s) {
    -        if (*s == '"') {
    -          if (--remaining < 0)
    -            goto error_argv;
    -          *t++= '\\';
    -        }
    -        *t++= *s++;
    -      }
    -      *t++= '"';
    -      *t= '\0';
    -    }else if (remaining < 0) {
    -      goto error_argv;
    -    }else
    -      strcat(command, " ");
    -      strcat(command, s);
    -  }
    -  return 1;
    -
    -error_argv:
    -  return 0;
    -} /* argv_to_command */
    -
    -/*---------------------------------
    -
    -qh_argv_to_command_size(argc, argv )
    -
    -    return size to allocate for qh_argv_to_command()
    -
    -notes:
    -    argc may be 0
    -    actual size is usually shorter
    -*/
    -int qh_argv_to_command_size(int argc, char *argv[]) {
    -    unsigned int count= 1; /* null-terminator if argc==0 */
    -    int i;
    -    char *s;
    -
    -    for (i=0; i0 && strchr(argv[i], ' ')) {
    -        count += 2;  /* quote delimiters */
    -        for (s=argv[i]; *s; s++) {
    -          if (*s == '"') {
    -            count++;
    -          }
    -        }
    -      }
    -    }
    -    return count;
    -} /* argv_to_command_size */
    -
    -/*---------------------------------
    -
    -  qh_rand()
    -  qh_srand(qh, seed )
    -    generate pseudo-random number between 1 and 2^31 -2
    -
    -  notes:
    -    For qhull and rbox, called from qh_RANDOMint(),etc. [user.h]
    -
    -    From Park & Miller's minimal standard random number generator
    -      Communications of the ACM, 31:1192-1201, 1988.
    -    Does not use 0 or 2^31 -1
    -      this is silently enforced by qh_srand()
    -    Can make 'Rn' much faster by moving qh_rand to qh_distplane
    -*/
    -
    -/* Global variables and constants */
    -
    -#define qh_rand_a 16807
    -#define qh_rand_m 2147483647
    -#define qh_rand_q 127773  /* m div a */
    -#define qh_rand_r 2836    /* m mod a */
    -
    -int qh_rand(qhT *qh) {
    -    int lo, hi, test;
    -    int seed = qh->last_random;
    -
    -    hi = seed / qh_rand_q;  /* seed div q */
    -    lo = seed % qh_rand_q;  /* seed mod q */
    -    test = qh_rand_a * lo - qh_rand_r * hi;
    -    if (test > 0)
    -        seed= test;
    -    else
    -        seed= test + qh_rand_m;
    -    qh->last_random= seed;
    -    /* seed = seed < qh_RANDOMmax/2 ? 0 : qh_RANDOMmax;  for testing */
    -    /* seed = qh_RANDOMmax;  for testing */
    -    return seed;
    -} /* rand */
    -
    -void qh_srand(qhT *qh, int seed) {
    -    if (seed < 1)
    -        qh->last_random= 1;
    -    else if (seed >= qh_rand_m)
    -        qh->last_random= qh_rand_m - 1;
    -    else
    -        qh->last_random= seed;
    -} /* qh_srand */
    -
    -/*---------------------------------
    -
    -qh_randomfactor(qh, scale, offset )
    -  return a random factor r * scale + offset
    -
    -notes:
    -  qh.RANDOMa/b are defined in global_r.c
    -  qh_RANDOMint requires 'qh'
    -*/
    -realT qh_randomfactor(qhT *qh, realT scale, realT offset) {
    -    realT randr;
    -
    -    randr= qh_RANDOMint;
    -    return randr * scale + offset;
    -} /* randomfactor */
    -
    -/*---------------------------------
    -
    -qh_randommatrix(qh, buffer, dim, rows )
    -  generate a random dim X dim matrix in range [-1,1]
    -  assumes buffer is [dim+1, dim]
    -
    -  returns:
    -    sets buffer to random numbers
    -    sets rows to rows of buffer
    -    sets row[dim] as scratch row
    -
    -  notes:
    -    qh_RANDOMint requires 'qh'
    -*/
    -void qh_randommatrix(qhT *qh, realT *buffer, int dim, realT **rows) {
    -    int i, k;
    -    realT **rowi, *coord, realr;
    -
    -    coord= buffer;
    -    rowi= rows;
    -    for (i=0; i < dim; i++) {
    -        *(rowi++)= coord;
    -        for (k=0; k < dim; k++) {
    -            realr= qh_RANDOMint;
    -            *(coord++)= 2.0 * realr/(qh_RANDOMmax+1) - 1.0;
    -        }
    -    }
    -    *rowi= coord;
    -} /* randommatrix */
    -
    -/*---------------------------------
    -
    -  qh_strtol( s, endp) qh_strtod( s, endp)
    -    internal versions of strtol() and strtod()
    -    does not skip trailing spaces
    -  notes:
    -    some implementations of strtol()/strtod() skip trailing spaces
    -*/
    -double qh_strtod(const char *s, char **endp) {
    -  double result;
    -
    -  result= strtod(s, endp);
    -  if (s < (*endp) && (*endp)[-1] == ' ')
    -    (*endp)--;
    -  return result;
    -} /* strtod */
    -
    -int qh_strtol(const char *s, char **endp) {
    -  int result;
    -
    -  result= (int) strtol(s, endp, 10);     /* WARN64 */
    -  if (s< (*endp) && (*endp)[-1] == ' ')
    -    (*endp)--;
    -  return result;
    -} /* strtol */
    diff --git a/src/qhull/src/libqhull_r/random_r.h b/src/qhull/src/libqhull_r/random_r.h
    deleted file mode 100644
    index dc884b33cb6..00000000000
    --- a/src/qhull/src/libqhull_r/random_r.h
    +++ /dev/null
    @@ -1,41 +0,0 @@
    -/*
      ---------------------------------
    -
    -  random.h
    -    header file for random and utility routines
    -
    -   see qh-geom_r.htm and random_r.c
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull_r/random_r.h#4 $$Change: 2079 $
    -   $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -*/
    -
    -#ifndef qhDEFrandom
    -#define qhDEFrandom 1
    -
    -#include "libqhull_r.h"
    -
    -/*============= prototypes in alphabetical order ======= */
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -int     qh_argv_to_command(int argc, char *argv[], char* command, int max_size);
    -int     qh_argv_to_command_size(int argc, char *argv[]);
    -int     qh_rand(qhT *qh);
    -void    qh_srand(qhT *qh, int seed);
    -realT   qh_randomfactor(qhT *qh, realT scale, realT offset);
    -void    qh_randommatrix(qhT *qh, realT *buffer, int dim, realT **row);
    -int     qh_strtol(const char *s, char **endp);
    -double  qh_strtod(const char *s, char **endp);
    -
    -#ifdef __cplusplus
    -} /* extern "C" */
    -#endif
    -
    -#endif /* qhDEFrandom */
    -
    -
    -
    diff --git a/src/qhull/src/libqhull_r/rboxlib_r.c b/src/qhull/src/libqhull_r/rboxlib_r.c
    deleted file mode 100644
    index 6c0c7e35ef2..00000000000
    --- a/src/qhull/src/libqhull_r/rboxlib_r.c
    +++ /dev/null
    @@ -1,842 +0,0 @@
    -/*
      ---------------------------------
    -
    -   rboxlib_r.c
    -     Generate input points
    -
    -   notes:
    -     For documentation, see prompt[] of rbox_r.c
    -     50 points generated for 'rbox D4'
    -
    -   WARNING:
    -     incorrect range if qh_RANDOMmax is defined wrong (user_r.h)
    -*/
    -
    -#include "libqhull_r.h"  /* First for user_r.h */
    -#include "random_r.h"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#ifdef _MSC_VER  /* Microsoft Visual C++ */
    -#pragma warning( disable : 4706)  /* assignment within conditional expression. */
    -#pragma warning( disable : 4996)  /* this function (strncat,sprintf,strcpy) or variable may be unsafe. */
    -#endif
    -
    -#define MAXdim 200
    -#define PI 3.1415926535897932384
    -
    -/* ------------------------------ prototypes ----------------*/
    -int qh_roundi(qhT *qh, double a);
    -void qh_out1(qhT *qh, double a);
    -void qh_out2n(qhT *qh, double a, double b);
    -void qh_out3n(qhT *qh, double a, double b, double c);
    -void qh_outcoord(qhT *qh, int iscdd, double *coord, int dim);
    -void qh_outcoincident(qhT *qh, int coincidentpoints, double radius, int iscdd, double *coord, int dim);
    -
    -void    qh_fprintf_rbox(qhT *qh, FILE *fp, int msgcode, const char *fmt, ... );
    -void    qh_free(void *mem);
    -void   *qh_malloc(size_t size);
    -int     qh_rand(qhT *qh);
    -void    qh_srand(qhT *qh, int seed);
    -
    -/*---------------------------------
    -
    -  qh_rboxpoints(qh, rbox_command )
    -    Generate points to qh->fout according to rbox options
    -    Report errors on qh->ferr
    -
    -  returns:
    -    0 (qh_ERRnone) on success
    -    1 (qh_ERRinput) on input error
    -    4 (qh_ERRmem) on memory error
    -    5 (qh_ERRqhull) on internal error
    -
    -  notes:
    -    To avoid using stdio, redefine qh_malloc, qh_free, and qh_fprintf_rbox (user_r.c)
    -
    -  design:
    -    Straight line code (consider defining a struct and functions):
    -
    -    Parse arguments into variables
    -    Determine the number of points
    -    Generate the points
    -*/
    -int qh_rboxpoints(qhT *qh, char* rbox_command) {
    -  int i,j,k;
    -  int gendim;
    -  int coincidentcount=0, coincidenttotal=0, coincidentpoints=0;
    -  int cubesize, diamondsize, seed=0, count, apex;
    -  int dim=3 , numpoints= 0, totpoints, addpoints=0;
    -  int issphere=0, isaxis=0,  iscdd= 0, islens= 0, isregular=0, iswidth=0, addcube=0;
    -  int isgap=0, isspiral=0, NOcommand= 0, adddiamond=0;
    -  int israndom=0, istime=0;
    -  int isbox=0, issimplex=0, issimplex2=0, ismesh=0;
    -  double width=0.0, gap=0.0, radius=0.0, coincidentradius=0.0;
    -  double coord[MAXdim], offset, meshm=3.0, meshn=4.0, meshr=5.0;
    -  double *coordp, *simplex= NULL, *simplexp;
    -  int nthroot, mult[MAXdim];
    -  double norm, factor, randr, rangap, lensangle= 0, lensbase= 1;
    -  double anglediff, angle, x, y, cube= 0.0, diamond= 0.0;
    -  double box= qh_DEFAULTbox; /* scale all numbers before output */
    -  double randmax= qh_RANDOMmax;
    -  char command[200], seedbuf[200];
    -  char *s= command, *t, *first_point= NULL;
    -  time_t timedata;
    -  int exitcode;
    -
    -  exitcode= setjmp(qh->rbox_errexit);
    -  if (exitcode) {
    -    /* same code for error exit and normal return, qh->NOerrexit is set */
    -    if (simplex)
    -        qh_free(simplex);
    -    return exitcode;
    -  }
    -
    -  *command= '\0';
    -  strncat(command, rbox_command, sizeof(command)-strlen(command)-1);
    -
    -  while (*s && !isspace(*s))  /* skip program name */
    -    s++;
    -  while (*s) {
    -    while (*s && isspace(*s))
    -      s++;
    -    if (*s == '-')
    -      s++;
    -    if (!*s)
    -      break;
    -    if (isdigit(*s)) {
    -      numpoints= qh_strtol(s, &s);
    -      continue;
    -    }
    -    /* ============= read flags =============== */
    -    switch (*s++) {
    -    case 'c':
    -      addcube= 1;
    -      t= s;
    -      while (isspace(*t))
    -        t++;
    -      if (*t == 'G')
    -        cube= qh_strtod(++t, &s);
    -      break;
    -    case 'd':
    -      adddiamond= 1;
    -      t= s;
    -      while (isspace(*t))
    -        t++;
    -      if (*t == 'G')
    -        diamond= qh_strtod(++t, &s);
    -      break;
    -    case 'h':
    -      iscdd= 1;
    -      break;
    -    case 'l':
    -      isspiral= 1;
    -      break;
    -    case 'n':
    -      NOcommand= 1;
    -      break;
    -    case 'r':
    -      isregular= 1;
    -      break;
    -    case 's':
    -      issphere= 1;
    -      break;
    -    case 't':
    -      istime= 1;
    -      if (isdigit(*s)) {
    -        seed= qh_strtol(s, &s);
    -        israndom= 0;
    -      }else
    -        israndom= 1;
    -      break;
    -    case 'x':
    -      issimplex= 1;
    -      break;
    -    case 'y':
    -      issimplex2= 1;
    -      break;
    -    case 'z':
    -      qh->rbox_isinteger= 1;
    -      break;
    -    case 'B':
    -      box= qh_strtod(s, &s);
    -      isbox= 1;
    -      break;
    -    case 'C':
    -      if (*s)
    -        coincidentpoints=  qh_strtol(s, &s);
    -      if (*s == ',') {
    -        ++s;
    -        coincidentradius=  qh_strtod(s, &s);
    -      }
    -      if (*s == ',') {
    -        ++s;
    -        coincidenttotal=  qh_strtol(s, &s);
    -      }
    -      if (*s && !isspace(*s)) {
    -        qh_fprintf_rbox(qh, qh->ferr, 7080, "rbox error: arguments for 'Cn,r,m' are not 'int', 'float', and 'int'.  Remaining string is '%s'\n", s);
    -        qh_errexit_rbox(qh, qh_ERRinput);
    -      }
    -      if (coincidentpoints==0){
    -        qh_fprintf_rbox(qh, qh->ferr, 6268, "rbox error: missing arguments for 'Cn,r,m' where n is the number of coincident points, r is the radius (default 0.0), and m is the number of points\n");
    -        qh_errexit_rbox(qh, qh_ERRinput);
    -      }
    -      if (coincidentpoints<0 || coincidenttotal<0 || coincidentradius<0.0){
    -        qh_fprintf_rbox(qh, qh->ferr, 6269, "rbox error: negative arguments for 'Cn,m,r' where n (%d) is the number of coincident points, m (%d) is the number of points, and r (%.2g) is the radius (default 0.0)\n", coincidentpoints, coincidenttotal, coincidentradius);
    -        qh_errexit_rbox(qh, qh_ERRinput);
    -      }
    -      break;
    -    case 'D':
    -      dim= qh_strtol(s, &s);
    -      if (dim < 1
    -      || dim > MAXdim) {
    -        qh_fprintf_rbox(qh, qh->ferr, 6189, "rbox error: dimension, D%d, out of bounds (>=%d or <=0)", dim, MAXdim);
    -        qh_errexit_rbox(qh, qh_ERRinput);
    -      }
    -      break;
    -    case 'G':
    -      if (isdigit(*s))
    -        gap= qh_strtod(s, &s);
    -      else
    -        gap= 0.5;
    -      isgap= 1;
    -      break;
    -    case 'L':
    -      if (isdigit(*s))
    -        radius= qh_strtod(s, &s);
    -      else
    -        radius= 10;
    -      islens= 1;
    -      break;
    -    case 'M':
    -      ismesh= 1;
    -      if (*s)
    -        meshn= qh_strtod(s, &s);
    -      if (*s == ',') {
    -        ++s;
    -        meshm= qh_strtod(s, &s);
    -      }else
    -        meshm= 0.0;
    -      if (*s == ',') {
    -        ++s;
    -        meshr= qh_strtod(s, &s);
    -      }else
    -        meshr= sqrt(meshn*meshn + meshm*meshm);
    -      if (*s && !isspace(*s)) {
    -        qh_fprintf_rbox(qh, qh->ferr, 7069, "rbox warning: assuming 'M3,4,5' since mesh args are not integers or reals\n");
    -        meshn= 3.0, meshm=4.0, meshr=5.0;
    -      }
    -      break;
    -    case 'O':
    -      qh->rbox_out_offset= qh_strtod(s, &s);
    -      break;
    -    case 'P':
    -      if (!first_point)
    -        first_point= s-1;
    -      addpoints++;
    -      while (*s && !isspace(*s))   /* read points later */
    -        s++;
    -      break;
    -    case 'W':
    -      width= qh_strtod(s, &s);
    -      iswidth= 1;
    -      break;
    -    case 'Z':
    -      if (isdigit(*s))
    -        radius= qh_strtod(s, &s);
    -      else
    -        radius= 1.0;
    -      isaxis= 1;
    -      break;
    -    default:
    -      qh_fprintf_rbox(qh, qh->ferr, 7070, "rbox error: unknown flag at %s.\nExecute 'rbox' without arguments for documentation.\n", s);
    -      qh_errexit_rbox(qh, qh_ERRinput);
    -    }
    -    if (*s && !isspace(*s)) {
    -      qh_fprintf_rbox(qh, qh->ferr, 7071, "rbox error: missing space between flags at %s.\n", s);
    -      qh_errexit_rbox(qh, qh_ERRinput);
    -    }
    -  }
    -
    -  /* ============= defaults, constants, and sizes =============== */
    -  if (qh->rbox_isinteger && !isbox)
    -    box= qh_DEFAULTzbox;
    -  if (addcube) {
    -    cubesize= (int)floor(ldexp(1.0,dim)+0.5);
    -    if (cube == 0.0)
    -      cube= box;
    -  }else
    -    cubesize= 0;
    -  if (adddiamond) {
    -    diamondsize= 2*dim;
    -    if (diamond == 0.0)
    -      diamond= box;
    -  }else
    -    diamondsize= 0;
    -  if (islens) {
    -    if (isaxis) {
    -        qh_fprintf_rbox(qh, qh->ferr, 6190, "rbox error: can not combine 'Ln' with 'Zn'\n");
    -        qh_errexit_rbox(qh, qh_ERRinput);
    -    }
    -    if (radius <= 1.0) {
    -        qh_fprintf_rbox(qh, qh->ferr, 6191, "rbox error: lens radius %.2g should be greater than 1.0\n",
    -               radius);
    -        qh_errexit_rbox(qh, qh_ERRinput);
    -    }
    -    lensangle= asin(1.0/radius);
    -    lensbase= radius * cos(lensangle);
    -  }
    -
    -  if (!numpoints) {
    -    if (issimplex2)
    -        ; /* ok */
    -    else if (isregular + issimplex + islens + issphere + isaxis + isspiral + iswidth + ismesh) {
    -        qh_fprintf_rbox(qh, qh->ferr, 6192, "rbox error: missing count\n");
    -        qh_errexit_rbox(qh, qh_ERRinput);
    -    }else if (adddiamond + addcube + addpoints)
    -        ; /* ok */
    -    else {
    -        numpoints= 50;  /* ./rbox D4 is the test case */
    -        issphere= 1;
    -    }
    -  }
    -  if ((issimplex + islens + isspiral + ismesh > 1)
    -  || (issimplex + issphere + isspiral + ismesh > 1)) {
    -    qh_fprintf_rbox(qh, qh->ferr, 6193, "rbox error: can only specify one of 'l', 's', 'x', 'Ln', or 'Mn,m,r' ('Ln s' is ok).\n");
    -    qh_errexit_rbox(qh, qh_ERRinput);
    -  }
    -  if (coincidentpoints>0 && (numpoints == 0 || coincidenttotal > numpoints)) {
    -    qh_fprintf_rbox(qh, qh->ferr, 6270, "rbox error: 'Cn,r,m' requested n coincident points for each of m points.  Either there is no points or m (%d) is greater than the number of points (%d).\n", coincidenttotal, numpoints);
    -    qh_errexit_rbox(qh, qh_ERRinput);
    -  }
    -  if (coincidenttotal == 0)
    -    coincidenttotal= numpoints;
    -
    -  /* ============= print header with total points =============== */
    -  if (issimplex || ismesh)
    -    totpoints= numpoints;
    -  else if (issimplex2)
    -    totpoints= numpoints+dim+1;
    -  else if (isregular) {
    -    totpoints= numpoints;
    -    if (dim == 2) {
    -        if (islens)
    -          totpoints += numpoints - 2;
    -    }else if (dim == 3) {
    -        if (islens)
    -          totpoints += 2 * numpoints;
    -      else if (isgap)
    -        totpoints += 1 + numpoints;
    -      else
    -        totpoints += 2;
    -    }
    -  }else
    -    totpoints= numpoints + isaxis;
    -  totpoints += cubesize + diamondsize + addpoints;
    -  totpoints += coincidentpoints*coincidenttotal;
    -
    -  /* ============= seed randoms =============== */
    -  if (istime == 0) {
    -    for (s=command; *s; s++) {
    -      if (issimplex2 && *s == 'y') /* make 'y' same seed as 'x' */
    -        i= 'x';
    -      else
    -        i= *s;
    -      seed= 11*seed + i;
    -    }
    -  }else if (israndom) {
    -    seed= (int)time(&timedata);
    -    sprintf(seedbuf, " t%d", seed);  /* appends an extra t, not worth removing */
    -    strncat(command, seedbuf, sizeof(command)-strlen(command)-1);
    -    t= strstr(command, " t ");
    -    if (t)
    -      strcpy(t+1, t+3); /* remove " t " */
    -  } /* else, seed explicitly set to n */
    -  qh_RANDOMseed_(qh, seed);
    -
    -  /* ============= print header =============== */
    -
    -  if (iscdd)
    -      qh_fprintf_rbox(qh, qh->fout, 9391, "%s\nbegin\n        %d %d %s\n",
    -      NOcommand ? "" : command,
    -      totpoints, dim+1,
    -      qh->rbox_isinteger ? "integer" : "real");
    -  else if (NOcommand)
    -      qh_fprintf_rbox(qh, qh->fout, 9392, "%d\n%d\n", dim, totpoints);
    -  else
    -      /* qh_fprintf_rbox special cases 9393 to append 'command' to the RboxPoints.comment() */
    -      qh_fprintf_rbox(qh, qh->fout, 9393, "%d %s\n%d\n", dim, command, totpoints);
    -
    -  /* ============= explicit points =============== */
    -  if ((s= first_point)) {
    -    while (s && *s) { /* 'P' */
    -      count= 0;
    -      if (iscdd)
    -        qh_out1(qh, 1.0);
    -      while (*++s) {
    -        qh_out1(qh, qh_strtod(s, &s));
    -        count++;
    -        if (isspace(*s) || !*s)
    -          break;
    -        if (*s != ',') {
    -          qh_fprintf_rbox(qh, qh->ferr, 6194, "rbox error: missing comma after coordinate in %s\n\n", s);
    -          qh_errexit_rbox(qh, qh_ERRinput);
    -        }
    -      }
    -      if (count < dim) {
    -        for (k=dim-count; k--; )
    -          qh_out1(qh, 0.0);
    -      }else if (count > dim) {
    -        qh_fprintf_rbox(qh, qh->ferr, 6195, "rbox error: %d coordinates instead of %d coordinates in %s\n\n",
    -                  count, dim, s);
    -        qh_errexit_rbox(qh, qh_ERRinput);
    -      }
    -      qh_fprintf_rbox(qh, qh->fout, 9394, "\n");
    -      while ((s= strchr(s, 'P'))) {
    -        if (isspace(s[-1]))
    -          break;
    -      }
    -    }
    -  }
    -
    -  /* ============= simplex distribution =============== */
    -  if (issimplex+issimplex2) {
    -    if (!(simplex= (double*)qh_malloc( dim * (dim+1) * sizeof(double)))) {
    -      qh_fprintf_rbox(qh, qh->ferr, 6196, "rbox error: insufficient memory for simplex\n");
    -      qh_errexit_rbox(qh, qh_ERRmem); /* qh_ERRmem */
    -    }
    -    simplexp= simplex;
    -    if (isregular) {
    -      for (i=0; ifout, 9395, "\n");
    -      }
    -    }
    -    for (j=0; jferr, 6197, "rbox error: regular points can be used only in 2-d and 3-d\n\n");
    -      qh_errexit_rbox(qh, qh_ERRinput);
    -    }
    -    if (!isaxis || radius == 0.0) {
    -      isaxis= 1;
    -      radius= 1.0;
    -    }
    -    if (dim == 3) {
    -      if (iscdd)
    -        qh_out1(qh, 1.0);
    -      qh_out3n(qh, 0.0, 0.0, -box);
    -      if (!isgap) {
    -        if (iscdd)
    -          qh_out1(qh, 1.0);
    -        qh_out3n(qh, 0.0, 0.0, box);
    -      }
    -    }
    -    angle= 0.0;
    -    anglediff= 2.0 * PI/numpoints;
    -    for (i=0; i < numpoints; i++) {
    -      angle += anglediff;
    -      x= radius * cos(angle);
    -      y= radius * sin(angle);
    -      if (dim == 2) {
    -        if (iscdd)
    -          qh_out1(qh, 1.0);
    -        qh_out2n(qh, x*box, y*box);
    -      }else {
    -        norm= sqrt(1.0 + x*x + y*y);
    -        if (iscdd)
    -          qh_out1(qh, 1.0);
    -        qh_out3n(qh, box*x/norm, box*y/norm, box/norm);
    -        if (isgap) {
    -          x *= 1-gap;
    -          y *= 1-gap;
    -          norm= sqrt(1.0 + x*x + y*y);
    -          if (iscdd)
    -            qh_out1(qh, 1.0);
    -          qh_out3n(qh, box*x/norm, box*y/norm, box/norm);
    -        }
    -      }
    -    }
    -  }
    -  /* ============= regular points for 'r Ln D2' =============== */
    -  else if (isregular && islens && dim == 2) {
    -    double cos_0;
    -
    -    angle= lensangle;
    -    anglediff= 2 * lensangle/(numpoints - 1);
    -    cos_0= cos(lensangle);
    -    for (i=0; i < numpoints; i++, angle -= anglediff) {
    -      x= radius * sin(angle);
    -      y= radius * (cos(angle) - cos_0);
    -      if (iscdd)
    -        qh_out1(qh, 1.0);
    -      qh_out2n(qh, x*box, y*box);
    -      if (i != 0 && i != numpoints - 1) {
    -        if (iscdd)
    -          qh_out1(qh, 1.0);
    -        qh_out2n(qh, x*box, -y*box);
    -      }
    -    }
    -  }
    -  /* ============= regular points for 'r Ln D3' =============== */
    -  else if (isregular && islens && dim != 2) {
    -    if (dim != 3) {
    -      qh_free(simplex);
    -      qh_fprintf_rbox(qh, qh->ferr, 6198, "rbox error: regular points can be used only in 2-d and 3-d\n\n");
    -      qh_errexit_rbox(qh, qh_ERRinput);
    -    }
    -    angle= 0.0;
    -    anglediff= 2* PI/numpoints;
    -    if (!isgap) {
    -      isgap= 1;
    -      gap= 0.5;
    -    }
    -    offset= sqrt(radius * radius - (1-gap)*(1-gap)) - lensbase;
    -    for (i=0; i < numpoints; i++, angle += anglediff) {
    -      x= cos(angle);
    -      y= sin(angle);
    -      if (iscdd)
    -        qh_out1(qh, 1.0);
    -      qh_out3n(qh, box*x, box*y, 0.0);
    -      x *= 1-gap;
    -      y *= 1-gap;
    -      if (iscdd)
    -        qh_out1(qh, 1.0);
    -      qh_out3n(qh, box*x, box*y, box * offset);
    -      if (iscdd)
    -        qh_out1(qh, 1.0);
    -      qh_out3n(qh, box*x, box*y, -box * offset);
    -    }
    -  }
    -  /* ============= apex of 'Zn' distribution + gendim =============== */
    -  else {
    -    if (isaxis) {
    -      gendim= dim-1;
    -      if (iscdd)
    -        qh_out1(qh, 1.0);
    -      for (j=0; j < gendim; j++)
    -        qh_out1(qh, 0.0);
    -      qh_out1(qh, -box);
    -      qh_fprintf_rbox(qh, qh->fout, 9398, "\n");
    -    }else if (islens)
    -      gendim= dim-1;
    -    else
    -      gendim= dim;
    -    /* ============= generate random point in unit cube =============== */
    -    for (i=0; i < numpoints; i++) {
    -      norm= 0.0;
    -      for (j=0; j < gendim; j++) {
    -        randr= qh_RANDOMint;
    -        coord[j]= 2.0 * randr/randmax - 1.0;
    -        norm += coord[j] * coord[j];
    -      }
    -      norm= sqrt(norm);
    -      /* ============= dim-1 point of 'Zn' distribution ========== */
    -      if (isaxis) {
    -        if (!isgap) {
    -          isgap= 1;
    -          gap= 1.0;
    -        }
    -        randr= qh_RANDOMint;
    -        rangap= 1.0 - gap * randr/randmax;
    -        factor= radius * rangap / norm;
    -        for (j=0; jferr, 6199, "rbox error: spiral distribution is available only in 3d\n\n");
    -          qh_errexit_rbox(qh, qh_ERRinput);
    -        }
    -        coord[0]= cos(2*PI*i/(numpoints - 1));
    -        coord[1]= sin(2*PI*i/(numpoints - 1));
    -        coord[2]= 2.0*(double)i/(double)(numpoints-1) - 1.0;
    -      /* ============= point of 's' distribution =============== */
    -      }else if (issphere) {
    -        factor= 1.0/norm;
    -        if (iswidth) {
    -          randr= qh_RANDOMint;
    -          factor *= 1.0 - width * randr/randmax;
    -        }
    -        for (j=0; j randmax/2)
    -          coord[dim-1]= -coord[dim-1];
    -      /* ============= project 'Wn' point toward boundary =============== */
    -      }else if (iswidth && !issphere) {
    -        j= qh_RANDOMint % gendim;
    -        if (coord[j] < 0)
    -          coord[j]= -1.0 - coord[j] * width;
    -        else
    -          coord[j]= 1.0 - coord[j] * width;
    -      }
    -      /* ============= scale point to box =============== */
    -      for (k=0; k=0; k--) {
    -        if (j & ( 1 << k))
    -          qh_out1(qh, cube);
    -        else
    -          qh_out1(qh, -cube);
    -      }
    -      qh_fprintf_rbox(qh, qh->fout, 9400, "\n");
    -    }
    -  }
    -
    -  /* ============= write diamond vertices =============== */
    -  if (adddiamond) {
    -    for (j=0; j=0; k--) {
    -        if (j/2 != k)
    -          qh_out1(qh, 0.0);
    -        else if (j & 0x1)
    -          qh_out1(qh, diamond);
    -        else
    -          qh_out1(qh, -diamond);
    -      }
    -      qh_fprintf_rbox(qh, qh->fout, 9401, "\n");
    -    }
    -  }
    -
    -  if (iscdd)
    -    qh_fprintf_rbox(qh, qh->fout, 9402, "end\nhull\n");
    -
    -  /* same code for error exit and normal return */
    -  qh_free(simplex);
    -  return qh_ERRnone;
    -} /* rboxpoints */
    -
    -/*------------------------------------------------
    -outxxx - output functions for qh_rboxpoints
    -*/
    -int qh_roundi(qhT *qh, double a) {
    -  if (a < 0.0) {
    -    if (a - 0.5 < INT_MIN) {
    -      qh_fprintf_rbox(qh, qh->ferr, 6200, "rbox input error: negative coordinate %2.2g is too large.  Reduce 'Bn'\n", a);
    -      qh_errexit_rbox(qh, qh_ERRinput);
    -    }
    -    return (int)(a - 0.5);
    -  }else {
    -    if (a + 0.5 > INT_MAX) {
    -      qh_fprintf_rbox(qh, qh->ferr, 6201, "rbox input error: coordinate %2.2g is too large.  Reduce 'Bn'\n", a);
    -      qh_errexit_rbox(qh, qh_ERRinput);
    -    }
    -    return (int)(a + 0.5);
    -  }
    -} /* qh_roundi */
    -
    -void qh_out1(qhT *qh, double a) {
    -
    -  if (qh->rbox_isinteger)
    -    qh_fprintf_rbox(qh, qh->fout, 9403, "%d ", qh_roundi(qh, a+qh->rbox_out_offset));
    -  else
    -    qh_fprintf_rbox(qh, qh->fout, 9404, qh_REAL_1, a+qh->rbox_out_offset);
    -} /* qh_out1 */
    -
    -void qh_out2n(qhT *qh, double a, double b) {
    -
    -  if (qh->rbox_isinteger)
    -    qh_fprintf_rbox(qh, qh->fout, 9405, "%d %d\n", qh_roundi(qh, a+qh->rbox_out_offset), qh_roundi(qh, b+qh->rbox_out_offset));
    -  else
    -    qh_fprintf_rbox(qh, qh->fout, 9406, qh_REAL_2n, a+qh->rbox_out_offset, b+qh->rbox_out_offset);
    -} /* qh_out2n */
    -
    -void qh_out3n(qhT *qh, double a, double b, double c) {
    -
    -  if (qh->rbox_isinteger)
    -    qh_fprintf_rbox(qh, qh->fout, 9407, "%d %d %d\n", qh_roundi(qh, a+qh->rbox_out_offset), qh_roundi(qh, b+qh->rbox_out_offset), qh_roundi(qh, c+qh->rbox_out_offset));
    -  else
    -    qh_fprintf_rbox(qh, qh->fout, 9408, qh_REAL_3n, a+qh->rbox_out_offset, b+qh->rbox_out_offset, c+qh->rbox_out_offset);
    -} /* qh_out3n */
    -
    -void qh_outcoord(qhT *qh, int iscdd, double *coord, int dim) {
    -    double *p= coord;
    -    int k;
    -
    -    if (iscdd)
    -      qh_out1(qh, 1.0);
    -    for (k=0; k < dim; k++)
    -      qh_out1(qh, *(p++));
    -    qh_fprintf_rbox(qh, qh->fout, 9396, "\n");
    -} /* qh_outcoord */
    -
    -void qh_outcoincident(qhT *qh, int coincidentpoints, double radius, int iscdd, double *coord, int dim) {
    -  double *p;
    -  double randr, delta;
    -  int i,k;
    -  double randmax= qh_RANDOMmax;
    -
    -  for (i= 0; ifout, 9410, "\n");
    -  }
    -} /* qh_outcoincident */
    -
    -/*------------------------------------------------
    -   Only called from qh_rboxpoints or qh_fprintf_rbox
    -   qh_fprintf_rbox is only called from qh_rboxpoints
    -*/
    -void qh_errexit_rbox(qhT *qh, int exitcode)
    -{
    -    longjmp(qh->rbox_errexit, exitcode);
    -} /* qh_errexit_rbox */
    -
    diff --git a/src/qhull/src/libqhull_r/stat_r.c b/src/qhull/src/libqhull_r/stat_r.c
    deleted file mode 100644
    index 0f3ff0d3d4a..00000000000
    --- a/src/qhull/src/libqhull_r/stat_r.c
    +++ /dev/null
    @@ -1,682 +0,0 @@
    -/*
      ---------------------------------
    -
    -   stat_r.c
    -   contains all statistics that are collected for qhull
    -
    -   see qh-stat_r.htm and stat_r.h
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull_r/stat_r.c#5 $$Change: 2062 $
    -   $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    -*/
    -
    -#include "qhull_ra.h"
    -
    -/*========== functions in alphabetic order ================*/
    -
    -/*---------------------------------
    -
    -  qh_allstatA()
    -    define statistics in groups of 20
    -
    -  notes:
    -    (otherwise, 'gcc -O2' uses too much memory)
    -    uses qhstat.next
    -*/
    -void qh_allstatA(qhT *qh) {
    -
    -   /* zdef_(type,name,doc,average) */
    -  zzdef_(zdoc, Zdoc2, "precision statistics", -1);
    -  zdef_(zinc, Znewvertex, NULL, -1);
    -  zdef_(wadd, Wnewvertex, "ave. distance of a new vertex to a facet(!0s)", Znewvertex);
    -  zzdef_(wmax, Wnewvertexmax, "max. distance of a new vertex to a facet", -1);
    -  zdef_(wmax, Wvertexmax, "max. distance of an output vertex to a facet", -1);
    -  zdef_(wmin, Wvertexmin, "min. distance of an output vertex to a facet", -1);
    -  zdef_(wmin, Wmindenom, "min. denominator in hyperplane computation", -1);
    -
    -  qh->qhstat.precision= qh->qhstat.next;  /* call qh_precision for each of these */
    -  zzdef_(zdoc, Zdoc3, "precision problems (corrected unless 'Q0' or an error)", -1);
    -  zzdef_(zinc, Zcoplanarridges, "coplanar half ridges in output", -1);
    -  zzdef_(zinc, Zconcaveridges, "concave half ridges in output", -1);
    -  zzdef_(zinc, Zflippedfacets, "flipped facets", -1);
    -  zzdef_(zinc, Zcoplanarhorizon, "coplanar horizon facets for new vertices", -1);
    -  zzdef_(zinc, Zcoplanarpart, "coplanar points during partitioning", -1);
    -  zzdef_(zinc, Zminnorm, "degenerate hyperplanes recomputed with gaussian elimination", -1);
    -  zzdef_(zinc, Znearlysingular, "nearly singular or axis-parallel hyperplanes", -1);
    -  zzdef_(zinc, Zback0, "zero divisors during back substitute", -1);
    -  zzdef_(zinc, Zgauss0, "zero divisors during gaussian elimination", -1);
    -  zzdef_(zinc, Zmultiridge, "ridges with multiple neighbors", -1);
    -}
    -void qh_allstatB(qhT *qh) {
    -  zzdef_(zdoc, Zdoc1, "summary information", -1);
    -  zdef_(zinc, Zvertices, "number of vertices in output", -1);
    -  zdef_(zinc, Znumfacets, "number of facets in output", -1);
    -  zdef_(zinc, Znonsimplicial, "number of non-simplicial facets in output", -1);
    -  zdef_(zinc, Znowsimplicial, "number of simplicial facets that were merged", -1);
    -  zdef_(zinc, Znumridges, "number of ridges in output", -1);
    -  zdef_(zadd, Znumridges, "average number of ridges per facet", Znumfacets);
    -  zdef_(zmax, Zmaxridges, "maximum number of ridges", -1);
    -  zdef_(zadd, Znumneighbors, "average number of neighbors per facet", Znumfacets);
    -  zdef_(zmax, Zmaxneighbors, "maximum number of neighbors", -1);
    -  zdef_(zadd, Znumvertices, "average number of vertices per facet", Znumfacets);
    -  zdef_(zmax, Zmaxvertices, "maximum number of vertices", -1);
    -  zdef_(zadd, Znumvneighbors, "average number of neighbors per vertex", Zvertices);
    -  zdef_(zmax, Zmaxvneighbors, "maximum number of neighbors", -1);
    -  zdef_(wadd, Wcpu, "cpu seconds for qhull after input", -1);
    -  zdef_(zinc, Ztotvertices, "vertices created altogether", -1);
    -  zzdef_(zinc, Zsetplane, "facets created altogether", -1);
    -  zdef_(zinc, Ztotridges, "ridges created altogether", -1);
    -  zdef_(zinc, Zpostfacets, "facets before post merge", -1);
    -  zdef_(zadd, Znummergetot, "average merges per facet(at most 511)", Znumfacets);
    -  zdef_(zmax, Znummergemax, "  maximum merges for a facet(at most 511)", -1);
    -  zdef_(zinc, Zangle, NULL, -1);
    -  zdef_(wadd, Wangle, "average angle(cosine) of facet normals for all ridges", Zangle);
    -  zdef_(wmax, Wanglemax, "  maximum angle(cosine) of facet normals across a ridge", -1);
    -  zdef_(wmin, Wanglemin, "  minimum angle(cosine) of facet normals across a ridge", -1);
    -  zdef_(wadd, Wareatot, "total area of facets", -1);
    -  zdef_(wmax, Wareamax, "  maximum facet area", -1);
    -  zdef_(wmin, Wareamin, "  minimum facet area", -1);
    -}
    -void qh_allstatC(qhT *qh) {
    -  zdef_(zdoc, Zdoc9, "build hull statistics", -1);
    -  zzdef_(zinc, Zprocessed, "points processed", -1);
    -  zzdef_(zinc, Zretry, "retries due to precision problems", -1);
    -  zdef_(wmax, Wretrymax, "  max. random joggle", -1);
    -  zdef_(zmax, Zmaxvertex, "max. vertices at any one time", -1);
    -  zdef_(zinc, Ztotvisible, "ave. visible facets per iteration", Zprocessed);
    -  zdef_(zinc, Zinsidevisible, "  ave. visible facets without an horizon neighbor", Zprocessed);
    -  zdef_(zadd, Zvisfacettot,  "  ave. facets deleted per iteration", Zprocessed);
    -  zdef_(zmax, Zvisfacetmax,  "    maximum", -1);
    -  zdef_(zadd, Zvisvertextot, "ave. visible vertices per iteration", Zprocessed);
    -  zdef_(zmax, Zvisvertexmax, "    maximum", -1);
    -  zdef_(zinc, Ztothorizon, "ave. horizon facets per iteration", Zprocessed);
    -  zdef_(zadd, Znewfacettot,  "ave. new or merged facets per iteration", Zprocessed);
    -  zdef_(zmax, Znewfacetmax,  "    maximum(includes initial simplex)", -1);
    -  zdef_(wadd, Wnewbalance, "average new facet balance", Zprocessed);
    -  zdef_(wadd, Wnewbalance2, "  standard deviation", -1);
    -  zdef_(wadd, Wpbalance, "average partition balance", Zpbalance);
    -  zdef_(wadd, Wpbalance2, "  standard deviation", -1);
    -  zdef_(zinc, Zpbalance, "  number of trials", -1);
    -  zdef_(zinc, Zsearchpoints, "searches of all points for initial simplex", -1);
    -  zdef_(zinc, Zdetsimplex, "determinants computed(area & initial hull)", -1);
    -  zdef_(zinc, Znoarea, "determinants not computed because vertex too low", -1);
    -  zdef_(zinc, Znotmax, "points ignored(!above max_outside)", -1);
    -  zdef_(zinc, Znotgood, "points ignored(!above a good facet)", -1);
    -  zdef_(zinc, Znotgoodnew, "points ignored(didn't create a good new facet)", -1);
    -  zdef_(zinc, Zgoodfacet, "good facets found", -1);
    -  zzdef_(zinc, Znumvisibility, "distance tests for facet visibility", -1);
    -  zdef_(zinc, Zdistvertex, "distance tests to report minimum vertex", -1);
    -  zzdef_(zinc, Ztotcheck, "points checked for facets' outer planes", -1);
    -  zzdef_(zinc, Zcheckpart, "  ave. distance tests per check", Ztotcheck);
    -}
    -void qh_allstatD(qhT *qh) {
    -  zdef_(zinc, Zvisit, "resets of visit_id", -1);
    -  zdef_(zinc, Zvvisit, "  resets of vertex_visit", -1);
    -  zdef_(zmax, Zvisit2max, "  max visit_id/2", -1);
    -  zdef_(zmax, Zvvisit2max, "  max vertex_visit/2", -1);
    -
    -  zdef_(zdoc, Zdoc4, "partitioning statistics(see previous for outer planes)", -1);
    -  zzdef_(zadd, Zdelvertextot, "total vertices deleted", -1);
    -  zdef_(zmax, Zdelvertexmax, "    maximum vertices deleted per iteration", -1);
    -  zdef_(zinc, Zfindbest, "calls to findbest", -1);
    -  zdef_(zadd, Zfindbesttot, " ave. facets tested", Zfindbest);
    -  zdef_(zmax, Zfindbestmax, " max. facets tested", -1);
    -  zdef_(zadd, Zfindcoplanar, " ave. coplanar search", Zfindbest);
    -  zdef_(zinc, Zfindnew, "calls to findbestnew", -1);
    -  zdef_(zadd, Zfindnewtot, " ave. facets tested", Zfindnew);
    -  zdef_(zmax, Zfindnewmax, " max. facets tested", -1);
    -  zdef_(zinc, Zfindnewjump, " ave. clearly better", Zfindnew);
    -  zdef_(zinc, Zfindnewsharp, " calls due to qh_sharpnewfacets", -1);
    -  zdef_(zinc, Zfindhorizon, "calls to findhorizon", -1);
    -  zdef_(zadd, Zfindhorizontot, " ave. facets tested", Zfindhorizon);
    -  zdef_(zmax, Zfindhorizonmax, " max. facets tested", -1);
    -  zdef_(zinc, Zfindjump,       " ave. clearly better", Zfindhorizon);
    -  zdef_(zinc, Zparthorizon, " horizon facets better than bestfacet", -1);
    -  zdef_(zinc, Zpartangle, "angle tests for repartitioned coplanar points", -1);
    -  zdef_(zinc, Zpartflip, "  repartitioned coplanar points for flipped orientation", -1);
    -}
    -void qh_allstatE(qhT *qh) {
    -  zdef_(zinc, Zpartinside, "inside points", -1);
    -  zdef_(zinc, Zpartnear, "  inside points kept with a facet", -1);
    -  zdef_(zinc, Zcoplanarinside, "  inside points that were coplanar with a facet", -1);
    -  zdef_(zinc, Zbestlower, "calls to findbestlower", -1);
    -  zdef_(zinc, Zbestlowerv, "  with search of vertex neighbors", -1);
    -  zdef_(zinc, Zbestlowerall, "  with rare search of all facets", -1);
    -  zdef_(zmax, Zbestloweralln, "  facets per search of all facets", -1);
    -  zdef_(wadd, Wmaxout, "difference in max_outside at final check", -1);
    -  zzdef_(zinc, Zpartitionall, "distance tests for initial partition", -1);
    -  zdef_(zinc, Ztotpartition, "partitions of a point", -1);
    -  zzdef_(zinc, Zpartition, "distance tests for partitioning", -1);
    -  zzdef_(zinc, Zdistcheck, "distance tests for checking flipped facets", -1);
    -  zzdef_(zinc, Zdistconvex, "distance tests for checking convexity", -1);
    -  zdef_(zinc, Zdistgood, "distance tests for checking good point", -1);
    -  zdef_(zinc, Zdistio, "distance tests for output", -1);
    -  zdef_(zinc, Zdiststat, "distance tests for statistics", -1);
    -  zdef_(zinc, Zdistplane, "total number of distance tests", -1);
    -  zdef_(zinc, Ztotpartcoplanar, "partitions of coplanar points or deleted vertices", -1);
    -  zzdef_(zinc, Zpartcoplanar, "   distance tests for these partitions", -1);
    -  zdef_(zinc, Zcomputefurthest, "distance tests for computing furthest", -1);
    -}
    -void qh_allstatE2(qhT *qh) {
    -  zdef_(zdoc, Zdoc5, "statistics for matching ridges", -1);
    -  zdef_(zinc, Zhashlookup, "total lookups for matching ridges of new facets", -1);
    -  zdef_(zinc, Zhashtests, "average number of tests to match a ridge", Zhashlookup);
    -  zdef_(zinc, Zhashridge, "total lookups of subridges(duplicates and boundary)", -1);
    -  zdef_(zinc, Zhashridgetest, "average number of tests per subridge", Zhashridge);
    -  zdef_(zinc, Zdupsame, "duplicated ridges in same merge cycle", -1);
    -  zdef_(zinc, Zdupflip, "duplicated ridges with flipped facets", -1);
    -
    -  zdef_(zdoc, Zdoc6, "statistics for determining merges", -1);
    -  zdef_(zinc, Zangletests, "angles computed for ridge convexity", -1);
    -  zdef_(zinc, Zbestcentrum, "best merges used centrum instead of vertices",-1);
    -  zzdef_(zinc, Zbestdist, "distance tests for best merge", -1);
    -  zzdef_(zinc, Zcentrumtests, "distance tests for centrum convexity", -1);
    -  zzdef_(zinc, Zdistzero, "distance tests for checking simplicial convexity", -1);
    -  zdef_(zinc, Zcoplanarangle, "coplanar angles in getmergeset", -1);
    -  zdef_(zinc, Zcoplanarcentrum, "coplanar centrums in getmergeset", -1);
    -  zdef_(zinc, Zconcaveridge, "concave ridges in getmergeset", -1);
    -}
    -void qh_allstatF(qhT *qh) {
    -  zdef_(zdoc, Zdoc7, "statistics for merging", -1);
    -  zdef_(zinc, Zpremergetot, "merge iterations", -1);
    -  zdef_(zadd, Zmergeinittot, "ave. initial non-convex ridges per iteration", Zpremergetot);
    -  zdef_(zadd, Zmergeinitmax, "  maximum", -1);
    -  zdef_(zadd, Zmergesettot, "  ave. additional non-convex ridges per iteration", Zpremergetot);
    -  zdef_(zadd, Zmergesetmax, "  maximum additional in one pass", -1);
    -  zdef_(zadd, Zmergeinittot2, "initial non-convex ridges for post merging", -1);
    -  zdef_(zadd, Zmergesettot2, "  additional non-convex ridges", -1);
    -  zdef_(wmax, Wmaxoutside, "max distance of vertex or coplanar point above facet(w/roundoff)", -1);
    -  zdef_(wmin, Wminvertex, "max distance of merged vertex below facet(or roundoff)", -1);
    -  zdef_(zinc, Zwidefacet, "centrums frozen due to a wide merge", -1);
    -  zdef_(zinc, Zwidevertices, "centrums frozen due to extra vertices", -1);
    -  zzdef_(zinc, Ztotmerge, "total number of facets or cycles of facets merged", -1);
    -  zdef_(zinc, Zmergesimplex, "merged a simplex", -1);
    -  zdef_(zinc, Zonehorizon, "simplices merged into coplanar horizon", -1);
    -  zzdef_(zinc, Zcyclehorizon, "cycles of facets merged into coplanar horizon", -1);
    -  zzdef_(zadd, Zcyclefacettot, "  ave. facets per cycle", Zcyclehorizon);
    -  zdef_(zmax, Zcyclefacetmax, "  max. facets", -1);
    -  zdef_(zinc, Zmergeintohorizon, "new facets merged into horizon", -1);
    -  zdef_(zinc, Zmergenew, "new facets merged", -1);
    -  zdef_(zinc, Zmergehorizon, "horizon facets merged into new facets", -1);
    -  zdef_(zinc, Zmergevertex, "vertices deleted by merging", -1);
    -  zdef_(zinc, Zcyclevertex, "vertices deleted by merging into coplanar horizon", -1);
    -  zdef_(zinc, Zdegenvertex, "vertices deleted by degenerate facet", -1);
    -  zdef_(zinc, Zmergeflipdup, "merges due to flipped facets in duplicated ridge", -1);
    -  zdef_(zinc, Zneighbor, "merges due to redundant neighbors", -1);
    -  zdef_(zadd, Ztestvneighbor, "non-convex vertex neighbors", -1);
    -}
    -void qh_allstatG(qhT *qh) {
    -  zdef_(zinc, Zacoplanar, "merges due to angle coplanar facets", -1);
    -  zdef_(wadd, Wacoplanartot, "  average merge distance", Zacoplanar);
    -  zdef_(wmax, Wacoplanarmax, "  maximum merge distance", -1);
    -  zdef_(zinc, Zcoplanar, "merges due to coplanar facets", -1);
    -  zdef_(wadd, Wcoplanartot, "  average merge distance", Zcoplanar);
    -  zdef_(wmax, Wcoplanarmax, "  maximum merge distance", -1);
    -  zdef_(zinc, Zconcave, "merges due to concave facets", -1);
    -  zdef_(wadd, Wconcavetot, "  average merge distance", Zconcave);
    -  zdef_(wmax, Wconcavemax, "  maximum merge distance", -1);
    -  zdef_(zinc, Zavoidold, "coplanar/concave merges due to avoiding old merge", -1);
    -  zdef_(wadd, Wavoidoldtot, "  average merge distance", Zavoidold);
    -  zdef_(wmax, Wavoidoldmax, "  maximum merge distance", -1);
    -  zdef_(zinc, Zdegen, "merges due to degenerate facets", -1);
    -  zdef_(wadd, Wdegentot, "  average merge distance", Zdegen);
    -  zdef_(wmax, Wdegenmax, "  maximum merge distance", -1);
    -  zdef_(zinc, Zflipped, "merges due to removing flipped facets", -1);
    -  zdef_(wadd, Wflippedtot, "  average merge distance", Zflipped);
    -  zdef_(wmax, Wflippedmax, "  maximum merge distance", -1);
    -  zdef_(zinc, Zduplicate, "merges due to duplicated ridges", -1);
    -  zdef_(wadd, Wduplicatetot, "  average merge distance", Zduplicate);
    -  zdef_(wmax, Wduplicatemax, "  maximum merge distance", -1);
    -}
    -void qh_allstatH(qhT *qh) {
    -  zdef_(zdoc, Zdoc8, "renamed vertex statistics", -1);
    -  zdef_(zinc, Zrenameshare, "renamed vertices shared by two facets", -1);
    -  zdef_(zinc, Zrenamepinch, "renamed vertices in a pinched facet", -1);
    -  zdef_(zinc, Zrenameall, "renamed vertices shared by multiple facets", -1);
    -  zdef_(zinc, Zfindfail, "rename failures due to duplicated ridges", -1);
    -  zdef_(zinc, Zdupridge, "  duplicate ridges detected", -1);
    -  zdef_(zinc, Zdelridge, "deleted ridges due to renamed vertices", -1);
    -  zdef_(zinc, Zdropneighbor, "dropped neighbors due to renamed vertices", -1);
    -  zdef_(zinc, Zdropdegen, "degenerate facets due to dropped neighbors", -1);
    -  zdef_(zinc, Zdelfacetdup, "  facets deleted because of no neighbors", -1);
    -  zdef_(zinc, Zremvertex, "vertices removed from facets due to no ridges", -1);
    -  zdef_(zinc, Zremvertexdel, "  deleted", -1);
    -  zdef_(zinc, Zintersectnum, "vertex intersections for locating redundant vertices", -1);
    -  zdef_(zinc, Zintersectfail, "intersections failed to find a redundant vertex", -1);
    -  zdef_(zinc, Zintersect, "intersections found redundant vertices", -1);
    -  zdef_(zadd, Zintersecttot, "   ave. number found per vertex", Zintersect);
    -  zdef_(zmax, Zintersectmax, "   max. found for a vertex", -1);
    -  zdef_(zinc, Zvertexridge, NULL, -1);
    -  zdef_(zadd, Zvertexridgetot, "  ave. number of ridges per tested vertex", Zvertexridge);
    -  zdef_(zmax, Zvertexridgemax, "  max. number of ridges per tested vertex", -1);
    -
    -  zdef_(zdoc, Zdoc10, "memory usage statistics(in bytes)", -1);
    -  zdef_(zadd, Zmemfacets, "for facets and their normals, neighbor and vertex sets", -1);
    -  zdef_(zadd, Zmemvertices, "for vertices and their neighbor sets", -1);
    -  zdef_(zadd, Zmempoints, "for input points, outside and coplanar sets, and qhT",-1);
    -  zdef_(zadd, Zmemridges, "for ridges and their vertex sets", -1);
    -} /* allstat */
    -
    -void qh_allstatI(qhT *qh) {
    -  qh->qhstat.vridges= qh->qhstat.next;
    -  zzdef_(zdoc, Zdoc11, "Voronoi ridge statistics", -1);
    -  zzdef_(zinc, Zridge, "non-simplicial Voronoi vertices for all ridges", -1);
    -  zzdef_(wadd, Wridge, "  ave. distance to ridge", Zridge);
    -  zzdef_(wmax, Wridgemax, "  max. distance to ridge", -1);
    -  zzdef_(zinc, Zridgemid, "bounded ridges", -1);
    -  zzdef_(wadd, Wridgemid, "  ave. distance of midpoint to ridge", Zridgemid);
    -  zzdef_(wmax, Wridgemidmax, "  max. distance of midpoint to ridge", -1);
    -  zzdef_(zinc, Zridgeok, "bounded ridges with ok normal", -1);
    -  zzdef_(wadd, Wridgeok, "  ave. angle to ridge", Zridgeok);
    -  zzdef_(wmax, Wridgeokmax, "  max. angle to ridge", -1);
    -  zzdef_(zinc, Zridge0, "bounded ridges with near-zero normal", -1);
    -  zzdef_(wadd, Wridge0, "  ave. angle to ridge", Zridge0);
    -  zzdef_(wmax, Wridge0max, "  max. angle to ridge", -1);
    -
    -  zdef_(zdoc, Zdoc12, "Triangulation statistics(Qt)", -1);
    -  zdef_(zinc, Ztricoplanar, "non-simplicial facets triangulated", -1);
    -  zdef_(zadd, Ztricoplanartot, "  ave. new facets created(may be deleted)", Ztricoplanar);
    -  zdef_(zmax, Ztricoplanarmax, "  max. new facets created", -1);
    -  zdef_(zinc, Ztrinull, "null new facets deleted(duplicated vertex)", -1);
    -  zdef_(zinc, Ztrimirror, "mirrored pairs of new facets deleted(same vertices)", -1);
    -  zdef_(zinc, Ztridegen, "degenerate new facets in output(same ridge)", -1);
    -} /* allstat */
    -
    -/*---------------------------------
    -
    -  qh_allstatistics()
    -    reset printed flag for all statistics
    -*/
    -void qh_allstatistics(qhT *qh) {
    -  int i;
    -
    -  for(i=ZEND; i--; )
    -    qh->qhstat.printed[i]= False;
    -} /* allstatistics */
    -
    -#if qh_KEEPstatistics
    -/*---------------------------------
    -
    -  qh_collectstatistics()
    -    collect statistics for qh.facet_list
    -
    -*/
    -void qh_collectstatistics(qhT *qh) {
    -  facetT *facet, *neighbor, **neighborp;
    -  vertexT *vertex, **vertexp;
    -  realT dotproduct, dist;
    -  int sizneighbors, sizridges, sizvertices, i;
    -
    -  qh->old_randomdist= qh->RANDOMdist;
    -  qh->RANDOMdist= False;
    -  zval_(Zmempoints)= qh->num_points * qh->normal_size + sizeof(qhT);
    -  zval_(Zmemfacets)= 0;
    -  zval_(Zmemridges)= 0;
    -  zval_(Zmemvertices)= 0;
    -  zval_(Zangle)= 0;
    -  wval_(Wangle)= 0.0;
    -  zval_(Znumridges)= 0;
    -  zval_(Znumfacets)= 0;
    -  zval_(Znumneighbors)= 0;
    -  zval_(Znumvertices)= 0;
    -  zval_(Znumvneighbors)= 0;
    -  zval_(Znummergetot)= 0;
    -  zval_(Znummergemax)= 0;
    -  zval_(Zvertices)= qh->num_vertices - qh_setsize(qh, qh->del_vertices);
    -  if (qh->MERGING || qh->APPROXhull || qh->JOGGLEmax < REALmax/2)
    -    wmax_(Wmaxoutside, qh->max_outside);
    -  if (qh->MERGING)
    -    wmin_(Wminvertex, qh->min_vertex);
    -  FORALLfacets
    -    facet->seen= False;
    -  if (qh->DELAUNAY) {
    -    FORALLfacets {
    -      if (facet->upperdelaunay != qh->UPPERdelaunay)
    -        facet->seen= True; /* remove from angle statistics */
    -    }
    -  }
    -  FORALLfacets {
    -    if (facet->visible && qh->NEWfacets)
    -      continue;
    -    sizvertices= qh_setsize(qh, facet->vertices);
    -    sizneighbors= qh_setsize(qh, facet->neighbors);
    -    sizridges= qh_setsize(qh, facet->ridges);
    -    zinc_(Znumfacets);
    -    zadd_(Znumvertices, sizvertices);
    -    zmax_(Zmaxvertices, sizvertices);
    -    zadd_(Znumneighbors, sizneighbors);
    -    zmax_(Zmaxneighbors, sizneighbors);
    -    zadd_(Znummergetot, facet->nummerge);
    -    i= facet->nummerge; /* avoid warnings */
    -    zmax_(Znummergemax, i);
    -    if (!facet->simplicial) {
    -      if (sizvertices == qh->hull_dim) {
    -        zinc_(Znowsimplicial);
    -      }else {
    -        zinc_(Znonsimplicial);
    -      }
    -    }
    -    if (sizridges) {
    -      zadd_(Znumridges, sizridges);
    -      zmax_(Zmaxridges, sizridges);
    -    }
    -    zadd_(Zmemfacets, sizeof(facetT) + qh->normal_size + 2*sizeof(setT)
    -       + SETelemsize * (sizneighbors + sizvertices));
    -    if (facet->ridges) {
    -      zadd_(Zmemridges,
    -         sizeof(setT) + SETelemsize * sizridges + sizridges *
    -         (sizeof(ridgeT) + sizeof(setT) + SETelemsize * (qh->hull_dim-1))/2);
    -    }
    -    if (facet->outsideset)
    -      zadd_(Zmempoints, sizeof(setT) + SETelemsize * qh_setsize(qh, facet->outsideset));
    -    if (facet->coplanarset)
    -      zadd_(Zmempoints, sizeof(setT) + SETelemsize * qh_setsize(qh, facet->coplanarset));
    -    if (facet->seen) /* Delaunay upper envelope */
    -      continue;
    -    facet->seen= True;
    -    FOREACHneighbor_(facet) {
    -      if (neighbor == qh_DUPLICATEridge || neighbor == qh_MERGEridge
    -          || neighbor->seen || !facet->normal || !neighbor->normal)
    -        continue;
    -      dotproduct= qh_getangle(qh, facet->normal, neighbor->normal);
    -      zinc_(Zangle);
    -      wadd_(Wangle, dotproduct);
    -      wmax_(Wanglemax, dotproduct)
    -      wmin_(Wanglemin, dotproduct)
    -    }
    -    if (facet->normal) {
    -      FOREACHvertex_(facet->vertices) {
    -        zinc_(Zdiststat);
    -        qh_distplane(qh, vertex->point, facet, &dist);
    -        wmax_(Wvertexmax, dist);
    -        wmin_(Wvertexmin, dist);
    -      }
    -    }
    -  }
    -  FORALLvertices {
    -    if (vertex->deleted)
    -      continue;
    -    zadd_(Zmemvertices, sizeof(vertexT));
    -    if (vertex->neighbors) {
    -      sizneighbors= qh_setsize(qh, vertex->neighbors);
    -      zadd_(Znumvneighbors, sizneighbors);
    -      zmax_(Zmaxvneighbors, sizneighbors);
    -      zadd_(Zmemvertices, sizeof(vertexT) + SETelemsize * sizneighbors);
    -    }
    -  }
    -  qh->RANDOMdist= qh->old_randomdist;
    -} /* collectstatistics */
    -#endif /* qh_KEEPstatistics */
    -
    -/*---------------------------------
    -
    -  qh_initstatistics(qh)
    -    initialize statistics
    -
    -  notes:
    -  NOerrors -- qh_initstatistics can not use qh_errexit(), qh_fprintf, or qh.ferr
    -  On first call, only qhmem.ferr is defined.  qh_memalloc is not setup.
    -  Also invoked by QhullQh().
    -*/
    -void qh_initstatistics(qhT *qh) {
    -  int i;
    -  realT realx;
    -  int intx;
    -
    -  qh->qhstat.next= 0;
    -  qh_allstatA(qh);
    -  qh_allstatB(qh);
    -  qh_allstatC(qh);
    -  qh_allstatD(qh);
    -  qh_allstatE(qh);
    -  qh_allstatE2(qh);
    -  qh_allstatF(qh);
    -  qh_allstatG(qh);
    -  qh_allstatH(qh);
    -  qh_allstatI(qh);
    -  if (qh->qhstat.next > (int)sizeof(qh->qhstat.id)) {
    -    qh_fprintf(qh, qh->qhmem.ferr, 6184, "qhull error (qh_initstatistics): increase size of qhstat.id[].\n\
    -      qhstat.next %d should be <= sizeof(qh->qhstat.id) %d\n", qh->qhstat.next, (int)sizeof(qh->qhstat.id));
    -#if 0 /* for locating error, Znumridges should be duplicated */
    -    for(i=0; i < ZEND; i++) {
    -      int j;
    -      for(j=i+1; j < ZEND; j++) {
    -        if (qh->qhstat.id[i] == qh->qhstat.id[j]) {
    -          qh_fprintf(qh, qh->qhmem.ferr, 6185, "qhull error (qh_initstatistics): duplicated statistic %d at indices %d and %d\n",
    -              qh->qhstat.id[i], i, j);
    -        }
    -      }
    -    }
    -#endif
    -    qh_exit(qh_ERRqhull);  /* can not use qh_errexit() */
    -  }
    -  qh->qhstat.init[zinc].i= 0;
    -  qh->qhstat.init[zadd].i= 0;
    -  qh->qhstat.init[zmin].i= INT_MAX;
    -  qh->qhstat.init[zmax].i= INT_MIN;
    -  qh->qhstat.init[wadd].r= 0;
    -  qh->qhstat.init[wmin].r= REALmax;
    -  qh->qhstat.init[wmax].r= -REALmax;
    -  for(i=0; i < ZEND; i++) {
    -    if (qh->qhstat.type[i] > ZTYPEreal) {
    -      realx= qh->qhstat.init[(unsigned char)(qh->qhstat.type[i])].r;
    -      qh->qhstat.stats[i].r= realx;
    -    }else if (qh->qhstat.type[i] != zdoc) {
    -      intx= qh->qhstat.init[(unsigned char)(qh->qhstat.type[i])].i;
    -      qh->qhstat.stats[i].i= intx;
    -    }
    -  }
    -} /* initstatistics */
    -
    -/*---------------------------------
    -
    -  qh_newstats(qh, )
    -    returns True if statistics for zdoc
    -
    -  returns:
    -    next zdoc
    -*/
    -boolT qh_newstats(qhT *qh, int idx, int *nextindex) {
    -  boolT isnew= False;
    -  int start, i;
    -
    -  if (qh->qhstat.type[qh->qhstat.id[idx]] == zdoc)
    -    start= idx+1;
    -  else
    -    start= idx;
    -  for(i= start; i < qh->qhstat.next && qh->qhstat.type[qh->qhstat.id[i]] != zdoc; i++) {
    -    if (!qh_nostatistic(qh, qh->qhstat.id[i]) && !qh->qhstat.printed[qh->qhstat.id[i]])
    -        isnew= True;
    -  }
    -  *nextindex= i;
    -  return isnew;
    -} /* newstats */
    -
    -/*---------------------------------
    -
    -  qh_nostatistic(qh, index )
    -    true if no statistic to print
    -*/
    -boolT qh_nostatistic(qhT *qh, int i) {
    -
    -  if ((qh->qhstat.type[i] > ZTYPEreal
    -       &&qh->qhstat.stats[i].r == qh->qhstat.init[(unsigned char)(qh->qhstat.type[i])].r)
    -      || (qh->qhstat.type[i] < ZTYPEreal
    -          &&qh->qhstat.stats[i].i == qh->qhstat.init[(unsigned char)(qh->qhstat.type[i])].i))
    -    return True;
    -  return False;
    -} /* nostatistic */
    -
    -#if qh_KEEPstatistics
    -/*---------------------------------
    -
    -  qh_printallstatistics(qh, fp, string )
    -    print all statistics with header 'string'
    -*/
    -void qh_printallstatistics(qhT *qh, FILE *fp, const char *string) {
    -
    -  qh_allstatistics(qh);
    -  qh_collectstatistics(qh);
    -  qh_printstatistics(qh, fp, string);
    -  qh_memstatistics(qh, fp);
    -}
    -
    -
    -/*---------------------------------
    -
    -  qh_printstatistics(qh, fp, string )
    -    print statistics to a file with header 'string'
    -    skips statistics with qhstat.printed[] (reset with qh_allstatistics)
    -
    -  see:
    -    qh_printallstatistics()
    -*/
    -void qh_printstatistics(qhT *qh, FILE *fp, const char *string) {
    -  int i, k;
    -  realT ave;
    -
    -  if (qh->num_points != qh->num_vertices) {
    -    wval_(Wpbalance)= 0;
    -    wval_(Wpbalance2)= 0;
    -  }else
    -    wval_(Wpbalance2)= qh_stddev(zval_(Zpbalance), wval_(Wpbalance),
    -                                 wval_(Wpbalance2), &ave);
    -  wval_(Wnewbalance2)= qh_stddev(zval_(Zprocessed), wval_(Wnewbalance),
    -                                 wval_(Wnewbalance2), &ave);
    -  qh_fprintf(qh, fp, 9350, "\n\
    -%s\n\
    - qhull invoked by: %s | %s\n%s with options:\n%s\n", string, qh->rbox_command,
    -     qh->qhull_command, qh_version, qh->qhull_options);
    -  qh_fprintf(qh, fp, 9351, "\nprecision constants:\n\
    - %6.2g max. abs. coordinate in the (transformed) input('Qbd:n')\n\
    - %6.2g max. roundoff error for distance computation('En')\n\
    - %6.2g max. roundoff error for angle computations\n\
    - %6.2g min. distance for outside points ('Wn')\n\
    - %6.2g min. distance for visible facets ('Vn')\n\
    - %6.2g max. distance for coplanar facets ('Un')\n\
    - %6.2g max. facet width for recomputing centrum and area\n\
    -",
    -  qh->MAXabs_coord, qh->DISTround, qh->ANGLEround, qh->MINoutside,
    -        qh->MINvisible, qh->MAXcoplanar, qh->WIDEfacet);
    -  if (qh->KEEPnearinside)
    -    qh_fprintf(qh, fp, 9352, "\
    - %6.2g max. distance for near-inside points\n", qh->NEARinside);
    -  if (qh->premerge_cos < REALmax/2) qh_fprintf(qh, fp, 9353, "\
    - %6.2g max. cosine for pre-merge angle\n", qh->premerge_cos);
    -  if (qh->PREmerge) qh_fprintf(qh, fp, 9354, "\
    - %6.2g radius of pre-merge centrum\n", qh->premerge_centrum);
    -  if (qh->postmerge_cos < REALmax/2) qh_fprintf(qh, fp, 9355, "\
    - %6.2g max. cosine for post-merge angle\n", qh->postmerge_cos);
    -  if (qh->POSTmerge) qh_fprintf(qh, fp, 9356, "\
    - %6.2g radius of post-merge centrum\n", qh->postmerge_centrum);
    -  qh_fprintf(qh, fp, 9357, "\
    - %6.2g max. distance for merging two simplicial facets\n\
    - %6.2g max. roundoff error for arithmetic operations\n\
    - %6.2g min. denominator for divisions\n\
    -  zero diagonal for Gauss: ", qh->ONEmerge, REALepsilon, qh->MINdenom);
    -  for(k=0; k < qh->hull_dim; k++)
    -    qh_fprintf(qh, fp, 9358, "%6.2e ", qh->NEARzero[k]);
    -  qh_fprintf(qh, fp, 9359, "\n\n");
    -  for(i=0 ; i < qh->qhstat.next; )
    -    qh_printstats(qh, fp, i, &i);
    -} /* printstatistics */
    -#endif /* qh_KEEPstatistics */
    -
    -/*---------------------------------
    -
    -  qh_printstatlevel(qh, fp, id )
    -    print level information for a statistic
    -
    -  notes:
    -    nop if id >= ZEND, printed, or same as initial value
    -*/
    -void qh_printstatlevel(qhT *qh, FILE *fp, int id) {
    -#define NULLfield "       "
    -
    -  if (id >= ZEND || qh->qhstat.printed[id])
    -    return;
    -  if (qh->qhstat.type[id] == zdoc) {
    -    qh_fprintf(qh, fp, 9360, "%s\n", qh->qhstat.doc[id]);
    -    return;
    -  }
    -  if (qh_nostatistic(qh, id) || !qh->qhstat.doc[id])
    -    return;
    -  qh->qhstat.printed[id]= True;
    -  if (qh->qhstat.count[id] != -1
    -      && qh->qhstat.stats[(unsigned char)(qh->qhstat.count[id])].i == 0)
    -    qh_fprintf(qh, fp, 9361, " *0 cnt*");
    -  else if (qh->qhstat.type[id] >= ZTYPEreal && qh->qhstat.count[id] == -1)
    -    qh_fprintf(qh, fp, 9362, "%7.2g", qh->qhstat.stats[id].r);
    -  else if (qh->qhstat.type[id] >= ZTYPEreal && qh->qhstat.count[id] != -1)
    -    qh_fprintf(qh, fp, 9363, "%7.2g", qh->qhstat.stats[id].r/ qh->qhstat.stats[(unsigned char)(qh->qhstat.count[id])].i);
    -  else if (qh->qhstat.type[id] < ZTYPEreal && qh->qhstat.count[id] == -1)
    -    qh_fprintf(qh, fp, 9364, "%7d", qh->qhstat.stats[id].i);
    -  else if (qh->qhstat.type[id] < ZTYPEreal && qh->qhstat.count[id] != -1)
    -    qh_fprintf(qh, fp, 9365, "%7.3g", (realT) qh->qhstat.stats[id].i / qh->qhstat.stats[(unsigned char)(qh->qhstat.count[id])].i);
    -  qh_fprintf(qh, fp, 9366, " %s\n", qh->qhstat.doc[id]);
    -} /* printstatlevel */
    -
    -
    -/*---------------------------------
    -
    -  qh_printstats(qh, fp, index, nextindex )
    -    print statistics for a zdoc group
    -
    -  returns:
    -    next zdoc if non-null
    -*/
    -void qh_printstats(qhT *qh, FILE *fp, int idx, int *nextindex) {
    -  int j, nexti;
    -
    -  if (qh_newstats(qh, idx, &nexti)) {
    -    qh_fprintf(qh, fp, 9367, "\n");
    -    for (j=idx; jqhstat.id[j]);
    -  }
    -  if (nextindex)
    -    *nextindex= nexti;
    -} /* printstats */
    -
    -#if qh_KEEPstatistics
    -
    -/*---------------------------------
    -
    -  qh_stddev(num, tot, tot2, ave )
    -    compute the standard deviation and average from statistics
    -
    -    tot2 is the sum of the squares
    -  notes:
    -    computes r.m.s.:
    -      (x-ave)^2
    -      == x^2 - 2x tot/num +   (tot/num)^2
    -      == tot2 - 2 tot tot/num + tot tot/num
    -      == tot2 - tot ave
    -*/
    -realT qh_stddev(int num, realT tot, realT tot2, realT *ave) {
    -  realT stddev;
    -
    -  *ave= tot/num;
    -  stddev= sqrt(tot2/num - *ave * *ave);
    -  return stddev;
    -} /* stddev */
    -
    -#endif /* qh_KEEPstatistics */
    -
    -#if !qh_KEEPstatistics
    -void    qh_collectstatistics(qhT *qh) {}
    -void    qh_printallstatistics(qhT *qh, FILE *fp, char *string) {};
    -void    qh_printstatistics(qhT *qh, FILE *fp, char *string) {}
    -#endif
    -
    diff --git a/src/qhull/src/libqhull_r/stat_r.h b/src/qhull/src/libqhull_r/stat_r.h
    deleted file mode 100644
    index 75e7d105781..00000000000
    --- a/src/qhull/src/libqhull_r/stat_r.h
    +++ /dev/null
    @@ -1,533 +0,0 @@
    -/*
      ---------------------------------
    -
    -   stat_r.h
    -     contains all statistics that are collected for qhull
    -
    -   see qh-stat_r.htm and stat_r.c
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/libqhull_r/stat_r.h#5 $$Change: 2079 $
    -   $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -
    -   recompile qhull if you change this file
    -
    -   Integer statistics are Z* while real statistics are W*.
    -
    -   define MAYdebugx to call a routine at every statistic event
    -
    -*/
    -
    -#ifndef qhDEFstat
    -#define qhDEFstat 1
    -
    -/* Depends on realT.  Do not include libqhull_r to avoid circular dependency */
    -
    -#ifndef DEFqhT
    -#define DEFqhT 1
    -typedef struct qhT qhT;         /* Defined by libqhull_r.h */
    -#endif
    -
    -#ifndef DEFqhstatT
    -#define DEFqhstatT 1
    -typedef struct qhstatT qhstatT; /* Defined here */
    -#endif
    -
    -/*---------------------------------
    -
    -  qh_KEEPstatistics
    -    0 turns off statistic gathering (except zzdef/zzinc/zzadd/zzval/wwval)
    -*/
    -#ifndef qh_KEEPstatistics
    -#define qh_KEEPstatistics 1
    -#endif
    -
    -/*---------------------------------
    -
    -  Zxxx for integers, Wxxx for reals
    -
    -  notes:
    -    be sure that all statistics are defined in stat_r.c
    -      otherwise initialization may core dump
    -    can pick up all statistics by:
    -      grep '[zw].*_[(][ZW]' *.c >z.x
    -    remove trailers with query">-
    -    remove leaders with  query-replace-regexp [ ^I]+  (
    -*/
    -#if qh_KEEPstatistics
    -enum qh_statistics {     /* alphabetical after Z/W */
    -    Zacoplanar,
    -    Wacoplanarmax,
    -    Wacoplanartot,
    -    Zangle,
    -    Wangle,
    -    Wanglemax,
    -    Wanglemin,
    -    Zangletests,
    -    Wareatot,
    -    Wareamax,
    -    Wareamin,
    -    Zavoidold,
    -    Wavoidoldmax,
    -    Wavoidoldtot,
    -    Zback0,
    -    Zbestcentrum,
    -    Zbestdist,
    -    Zbestlower,
    -    Zbestlowerall,
    -    Zbestloweralln,
    -    Zbestlowerv,
    -    Zcentrumtests,
    -    Zcheckpart,
    -    Zcomputefurthest,
    -    Zconcave,
    -    Wconcavemax,
    -    Wconcavetot,
    -    Zconcaveridges,
    -    Zconcaveridge,
    -    Zcoplanar,
    -    Wcoplanarmax,
    -    Wcoplanartot,
    -    Zcoplanarangle,
    -    Zcoplanarcentrum,
    -    Zcoplanarhorizon,
    -    Zcoplanarinside,
    -    Zcoplanarpart,
    -    Zcoplanarridges,
    -    Wcpu,
    -    Zcyclefacetmax,
    -    Zcyclefacettot,
    -    Zcyclehorizon,
    -    Zcyclevertex,
    -    Zdegen,
    -    Wdegenmax,
    -    Wdegentot,
    -    Zdegenvertex,
    -    Zdelfacetdup,
    -    Zdelridge,
    -    Zdelvertextot,
    -    Zdelvertexmax,
    -    Zdetsimplex,
    -    Zdistcheck,
    -    Zdistconvex,
    -    Zdistgood,
    -    Zdistio,
    -    Zdistplane,
    -    Zdiststat,
    -    Zdistvertex,
    -    Zdistzero,
    -    Zdoc1,
    -    Zdoc2,
    -    Zdoc3,
    -    Zdoc4,
    -    Zdoc5,
    -    Zdoc6,
    -    Zdoc7,
    -    Zdoc8,
    -    Zdoc9,
    -    Zdoc10,
    -    Zdoc11,
    -    Zdoc12,
    -    Zdropdegen,
    -    Zdropneighbor,
    -    Zdupflip,
    -    Zduplicate,
    -    Wduplicatemax,
    -    Wduplicatetot,
    -    Zdupridge,
    -    Zdupsame,
    -    Zflipped,
    -    Wflippedmax,
    -    Wflippedtot,
    -    Zflippedfacets,
    -    Zfindbest,
    -    Zfindbestmax,
    -    Zfindbesttot,
    -    Zfindcoplanar,
    -    Zfindfail,
    -    Zfindhorizon,
    -    Zfindhorizonmax,
    -    Zfindhorizontot,
    -    Zfindjump,
    -    Zfindnew,
    -    Zfindnewmax,
    -    Zfindnewtot,
    -    Zfindnewjump,
    -    Zfindnewsharp,
    -    Zgauss0,
    -    Zgoodfacet,
    -    Zhashlookup,
    -    Zhashridge,
    -    Zhashridgetest,
    -    Zhashtests,
    -    Zinsidevisible,
    -    Zintersect,
    -    Zintersectfail,
    -    Zintersectmax,
    -    Zintersectnum,
    -    Zintersecttot,
    -    Zmaxneighbors,
    -    Wmaxout,
    -    Wmaxoutside,
    -    Zmaxridges,
    -    Zmaxvertex,
    -    Zmaxvertices,
    -    Zmaxvneighbors,
    -    Zmemfacets,
    -    Zmempoints,
    -    Zmemridges,
    -    Zmemvertices,
    -    Zmergeflipdup,
    -    Zmergehorizon,
    -    Zmergeinittot,
    -    Zmergeinitmax,
    -    Zmergeinittot2,
    -    Zmergeintohorizon,
    -    Zmergenew,
    -    Zmergesettot,
    -    Zmergesetmax,
    -    Zmergesettot2,
    -    Zmergesimplex,
    -    Zmergevertex,
    -    Wmindenom,
    -    Wminvertex,
    -    Zminnorm,
    -    Zmultiridge,
    -    Znearlysingular,
    -    Zneighbor,
    -    Wnewbalance,
    -    Wnewbalance2,
    -    Znewfacettot,
    -    Znewfacetmax,
    -    Znewvertex,
    -    Wnewvertex,
    -    Wnewvertexmax,
    -    Znoarea,
    -    Znonsimplicial,
    -    Znowsimplicial,
    -    Znotgood,
    -    Znotgoodnew,
    -    Znotmax,
    -    Znumfacets,
    -    Znummergemax,
    -    Znummergetot,
    -    Znumneighbors,
    -    Znumridges,
    -    Znumvertices,
    -    Znumvisibility,
    -    Znumvneighbors,
    -    Zonehorizon,
    -    Zpartangle,
    -    Zpartcoplanar,
    -    Zpartflip,
    -    Zparthorizon,
    -    Zpartinside,
    -    Zpartition,
    -    Zpartitionall,
    -    Zpartnear,
    -    Zpbalance,
    -    Wpbalance,
    -    Wpbalance2,
    -    Zpostfacets,
    -    Zpremergetot,
    -    Zprocessed,
    -    Zremvertex,
    -    Zremvertexdel,
    -    Zrenameall,
    -    Zrenamepinch,
    -    Zrenameshare,
    -    Zretry,
    -    Wretrymax,
    -    Zridge,
    -    Wridge,
    -    Wridgemax,
    -    Zridge0,
    -    Wridge0,
    -    Wridge0max,
    -    Zridgemid,
    -    Wridgemid,
    -    Wridgemidmax,
    -    Zridgeok,
    -    Wridgeok,
    -    Wridgeokmax,
    -    Zsearchpoints,
    -    Zsetplane,
    -    Ztestvneighbor,
    -    Ztotcheck,
    -    Ztothorizon,
    -    Ztotmerge,
    -    Ztotpartcoplanar,
    -    Ztotpartition,
    -    Ztotridges,
    -    Ztotvertices,
    -    Ztotvisible,
    -    Ztricoplanar,
    -    Ztricoplanarmax,
    -    Ztricoplanartot,
    -    Ztridegen,
    -    Ztrimirror,
    -    Ztrinull,
    -    Wvertexmax,
    -    Wvertexmin,
    -    Zvertexridge,
    -    Zvertexridgetot,
    -    Zvertexridgemax,
    -    Zvertices,
    -    Zvisfacettot,
    -    Zvisfacetmax,
    -    Zvisit,
    -    Zvisit2max,
    -    Zvisvertextot,
    -    Zvisvertexmax,
    -    Zvvisit,
    -    Zvvisit2max,
    -    Zwidefacet,
    -    Zwidevertices,
    -    ZEND};
    -
    -/*---------------------------------
    -
    -  Zxxx/Wxxx statistics that remain defined if qh_KEEPstatistics=0
    -
    -  notes:
    -    be sure to use zzdef, zzinc, etc. with these statistics (no double checking!)
    -*/
    -#else
    -enum qh_statistics {     /* for zzdef etc. macros */
    -  Zback0,
    -  Zbestdist,
    -  Zcentrumtests,
    -  Zcheckpart,
    -  Zconcaveridges,
    -  Zcoplanarhorizon,
    -  Zcoplanarpart,
    -  Zcoplanarridges,
    -  Zcyclefacettot,
    -  Zcyclehorizon,
    -  Zdelvertextot,
    -  Zdistcheck,
    -  Zdistconvex,
    -  Zdistzero,
    -  Zdoc1,
    -  Zdoc2,
    -  Zdoc3,
    -  Zdoc11,
    -  Zflippedfacets,
    -  Zgauss0,
    -  Zminnorm,
    -  Zmultiridge,
    -  Znearlysingular,
    -  Wnewvertexmax,
    -  Znumvisibility,
    -  Zpartcoplanar,
    -  Zpartition,
    -  Zpartitionall,
    -  Zprocessed,
    -  Zretry,
    -  Zridge,
    -  Wridge,
    -  Wridgemax,
    -  Zridge0,
    -  Wridge0,
    -  Wridge0max,
    -  Zridgemid,
    -  Wridgemid,
    -  Wridgemidmax,
    -  Zridgeok,
    -  Wridgeok,
    -  Wridgeokmax,
    -  Zsetplane,
    -  Ztotcheck,
    -  Ztotmerge,
    -    ZEND};
    -#endif
    -
    -/*---------------------------------
    -
    -  ztype
    -    the type of a statistic sets its initial value.
    -
    -  notes:
    -    The type should be the same as the macro for collecting the statistic
    -*/
    -enum ztypes {zdoc,zinc,zadd,zmax,zmin,ZTYPEreal,wadd,wmax,wmin,ZTYPEend};
    -
    -/*========== macros and constants =============*/
    -
    -/*----------------------------------
    -
    -  MAYdebugx
    -    define as maydebug() to be called frequently for error trapping
    -*/
    -#define MAYdebugx
    -
    -/*----------------------------------
    -
    -  zzdef_, zdef_( type, name, doc, -1)
    -    define a statistic (assumes 'qhstat.next= 0;')
    -
    -  zdef_( type, name, doc, count)
    -    define an averaged statistic
    -    printed as name/count
    -*/
    -#define zzdef_(stype,name,string,cnt) qh->qhstat.id[qh->qhstat.next++]=name; \
    -   qh->qhstat.doc[name]= string; qh->qhstat.count[name]= cnt; qh->qhstat.type[name]= stype
    -#if qh_KEEPstatistics
    -#define zdef_(stype,name,string,cnt) qh->qhstat.id[qh->qhstat.next++]=name; \
    -   qh->qhstat.doc[name]= string; qh->qhstat.count[name]= cnt; qh->qhstat.type[name]= stype
    -#else
    -#define zdef_(type,name,doc,count)
    -#endif
    -
    -/*----------------------------------
    -
    -  zzinc_( name ), zinc_( name)
    -    increment an integer statistic
    -*/
    -#define zzinc_(id) {MAYdebugx; qh->qhstat.stats[id].i++;}
    -#if qh_KEEPstatistics
    -#define zinc_(id) {MAYdebugx; qh->qhstat.stats[id].i++;}
    -#else
    -#define zinc_(id) {}
    -#endif
    -
    -/*----------------------------------
    -
    -  zzadd_( name, value ), zadd_( name, value ), wadd_( name, value )
    -    add value to an integer or real statistic
    -*/
    -#define zzadd_(id, val) {MAYdebugx; qh->qhstat.stats[id].i += (val);}
    -#define wwadd_(id, val) {MAYdebugx; qh->qhstat.stats[id].r += (val);}
    -#if qh_KEEPstatistics
    -#define zadd_(id, val) {MAYdebugx; qh->qhstat.stats[id].i += (val);}
    -#define wadd_(id, val) {MAYdebugx; qh->qhstat.stats[id].r += (val);}
    -#else
    -#define zadd_(id, val) {}
    -#define wadd_(id, val) {}
    -#endif
    -
    -/*----------------------------------
    -
    -  zzval_( name ), zval_( name ), wwval_( name )
    -    set or return value of a statistic
    -*/
    -#define zzval_(id) ((qh->qhstat.stats[id]).i)
    -#define wwval_(id) ((qh->qhstat.stats[id]).r)
    -#if qh_KEEPstatistics
    -#define zval_(id) ((qh->qhstat.stats[id]).i)
    -#define wval_(id) ((qh->qhstat.stats[id]).r)
    -#else
    -#define zval_(id) qh->qhstat.tempi
    -#define wval_(id) qh->qhstat.tempr
    -#endif
    -
    -/*----------------------------------
    -
    -  zmax_( id, val ), wmax_( id, value )
    -    maximize id with val
    -*/
    -#define wwmax_(id, val) {MAYdebugx; maximize_(qh->qhstat.stats[id].r,(val));}
    -#if qh_KEEPstatistics
    -#define zmax_(id, val) {MAYdebugx; maximize_(qh->qhstat.stats[id].i,(val));}
    -#define wmax_(id, val) {MAYdebugx; maximize_(qh->qhstat.stats[id].r,(val));}
    -#else
    -#define zmax_(id, val) {}
    -#define wmax_(id, val) {}
    -#endif
    -
    -/*----------------------------------
    -
    -  zmin_( id, val ), wmin_( id, value )
    -    minimize id with val
    -*/
    -#if qh_KEEPstatistics
    -#define zmin_(id, val) {MAYdebugx; minimize_(qh->qhstat.stats[id].i,(val));}
    -#define wmin_(id, val) {MAYdebugx; minimize_(qh->qhstat.stats[id].r,(val));}
    -#else
    -#define zmin_(id, val) {}
    -#define wmin_(id, val) {}
    -#endif
    -
    -/*================== stat_r.h types ==============*/
    -
    -
    -/*----------------------------------
    -
    -  intrealT
    -    union of integer and real, used for statistics
    -*/
    -typedef union intrealT intrealT;    /* union of int and realT */
    -union intrealT {
    -    int i;
    -    realT r;
    -};
    -
    -/*----------------------------------
    -
    -  qhstat
    -    Data structure for statistics, similar to qh and qhrbox
    -
    -    Allocated as part of qhT (libqhull_r.h)
    -*/
    -
    -struct qhstatT {
    -  intrealT   stats[ZEND];     /* integer and real statistics */
    -  unsigned   char id[ZEND+10]; /* id's in print order */
    -  const char *doc[ZEND];       /* array of documentation strings */
    -  short int  count[ZEND];     /* -1 if none, else index of count to use */
    -  char       type[ZEND];      /* type, see ztypes above */
    -  char       printed[ZEND];   /* true, if statistic has been printed */
    -  intrealT   init[ZTYPEend];  /* initial values by types, set initstatistics */
    -
    -  int        next;            /* next index for zdef_ */
    -  int        precision;       /* index for precision problems */
    -  int        vridges;         /* index for Voronoi ridges */
    -  int        tempi;
    -  realT      tempr;
    -};
    -
    -/*========== function prototypes ===========*/
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -void    qh_allstatA(qhT *qh);
    -void    qh_allstatB(qhT *qh);
    -void    qh_allstatC(qhT *qh);
    -void    qh_allstatD(qhT *qh);
    -void    qh_allstatE(qhT *qh);
    -void    qh_allstatE2(qhT *qh);
    -void    qh_allstatF(qhT *qh);
    -void    qh_allstatG(qhT *qh);
    -void    qh_allstatH(qhT *qh);
    -void    qh_allstatI(qhT *qh);
    -void    qh_allstatistics(qhT *qh);
    -void    qh_collectstatistics(qhT *qh);
    -void    qh_initstatistics(qhT *qh);
    -boolT   qh_newstats(qhT *qh, int idx, int *nextindex);
    -boolT   qh_nostatistic(qhT *qh, int i);
    -void    qh_printallstatistics(qhT *qh, FILE *fp, const char *string);
    -void    qh_printstatistics(qhT *qh, FILE *fp, const char *string);
    -void    qh_printstatlevel(qhT *qh, FILE *fp, int id);
    -void    qh_printstats(qhT *qh, FILE *fp, int idx, int *nextindex);
    -realT   qh_stddev(int num, realT tot, realT tot2, realT *ave);
    -
    -#ifdef __cplusplus
    -} /* extern "C" */
    -#endif
    -
    -#endif   /* qhDEFstat */
    diff --git a/src/qhull/src/libqhull_r/user_r.c b/src/qhull/src/libqhull_r/user_r.c
    deleted file mode 100644
    index bf7ed1d8d68..00000000000
    --- a/src/qhull/src/libqhull_r/user_r.c
    +++ /dev/null
    @@ -1,527 +0,0 @@
    -/*
      ---------------------------------
    -
    -   user.c
    -   user redefinable functions
    -
    -   see user2_r.c for qh_fprintf, qh_malloc, qh_free
    -
    -   see README.txt  see COPYING.txt for copyright information.
    -
    -   see libqhull_r.h for data structures, macros, and user-callable functions.
    -
    -   see user_eg.c, user_eg2.c, and unix.c for examples.
    -
    -   see user.h for user-definable constants
    -
    -      use qh_NOmem in mem_r.h to turn off memory management
    -      use qh_NOmerge in user.h to turn off facet merging
    -      set qh_KEEPstatistics in user.h to 0 to turn off statistics
    -
    -   This is unsupported software.  You're welcome to make changes,
    -   but you're on your own if something goes wrong.  Use 'Tc' to
    -   check frequently.  Usually qhull will report an error if
    -   a data structure becomes inconsistent.  If so, it also reports
    -   the last point added to the hull, e.g., 102.  You can then trace
    -   the execution of qhull with "T4P102".
    -
    -   Please report any errors that you fix to qhull@qhull.org
    -
    -   Qhull-template is a template for calling qhull from within your application
    -
    -   if you recompile and load this module, then user.o will not be loaded
    -   from qhull.a
    -
    -   you can add additional quick allocation sizes in qh_user_memsizes
    -
    -   if the other functions here are redefined to not use qh_print...,
    -   then io.o will not be loaded from qhull.a.  See user_eg_r.c for an
    -   example.  We recommend keeping io.o for the extra debugging
    -   information it supplies.
    -*/
    -
    -#include "qhull_ra.h"
    -
    -#include 
    -
    -/*---------------------------------
    -
    -  Qhull-template
    -    Template for calling qhull from inside your program
    -
    -  returns:
    -    exit code(see qh_ERR... in libqhull_r.h)
    -    all memory freed
    -
    -  notes:
    -    This can be called any number of times.
    -
    -*/
    -#if 0
    -{
    -  int dim;                  /* dimension of points */
    -  int numpoints;            /* number of points */
    -  coordT *points;           /* array of coordinates for each point */
    -  boolT ismalloc;           /* True if qhull should free points in qh_freeqhull() or reallocation */
    -  char flags[]= "qhull Tv"; /* option flags for qhull, see qh_opt.htm */
    -  FILE *outfile= stdout;    /* output from qh_produce_output(qh)
    -                               use NULL to skip qh_produce_output(qh) */
    -  FILE *errfile= stderr;    /* error messages from qhull code */
    -  int exitcode;             /* 0 if no error from qhull */
    -  facetT *facet;            /* set by FORALLfacets */
    -  int curlong, totlong;     /* memory remaining after qh_memfreeshort */
    -
    -  qhT qh_qh;                /* Qhull's data structure.  First argument of most calls */
    -  qhT *qh= &qh_qh;          /* Alternatively -- qhT *qh= (qhT*)malloc(sizeof(qhT)) */
    -
    -  QHULL_LIB_CHECK /* Check for compatible library */
    -
    -  qh_zero(qh, errfile);
    -
    -  /* initialize dim, numpoints, points[], ismalloc here */
    -  exitcode= qh_new_qhull(qh, dim, numpoints, points, ismalloc,
    -                      flags, outfile, errfile);
    -  if (!exitcode) {                  /* if no error */
    -    /* 'qh->facet_list' contains the convex hull */
    -    FORALLfacets {
    -       /* ... your code ... */
    -    }
    -  }
    -  qh_freeqhull(qh, !qh_ALL);
    -  qh_memfreeshort(qh, &curlong, &totlong);
    -  if (curlong || totlong)
    -    qh_fprintf(qh, errfile, 7068, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n", totlong, curlong);
    -}
    -#endif
    -
    -/*---------------------------------
    -
    -  qh_new_qhull(qh, dim, numpoints, points, ismalloc, qhull_cmd, outfile, errfile )
    -    Run qhull and return results in qh.
    -    Returns exitcode (0 if no errors).
    -    Before first call, either call qh_zero(qh, errfile), or set qh to all zero.
    -
    -  notes:
    -    do not modify points until finished with results.
    -      The qhull data structure contains pointers into the points array.
    -    do not call qhull functions before qh_new_qhull().
    -      The qhull data structure is not initialized until qh_new_qhull().
    -    do not call qh_init_A (global_r.c)
    -
    -    Default errfile is stderr, outfile may be null
    -    qhull_cmd must start with "qhull "
    -    projects points to a new point array for Delaunay triangulations ('d' and 'v')
    -    transforms points into a new point array for halfspace intersection ('H')
    -
    -  see:
    -    Qhull-template at the beginning of this file.
    -    An example of using qh_new_qhull is user_eg_r.c
    -*/
    -int qh_new_qhull(qhT *qh, int dim, int numpoints, coordT *points, boolT ismalloc,
    -                char *qhull_cmd, FILE *outfile, FILE *errfile) {
    -  /* gcc may issue a "might be clobbered" warning for dim, points, and ismalloc [-Wclobbered].
    -     These parameters are not referenced after a longjmp() and hence not clobbered.
    -     See http://stackoverflow.com/questions/7721854/what-sense-do-these-clobbered-variable-warnings-make */
    -  int exitcode, hulldim;
    -  boolT new_ismalloc;
    -  coordT *new_points;
    -
    -  if(!errfile){
    -    errfile= stderr;
    -  }
    -  if (!qh->qhmem.ferr) {
    -    qh_meminit(qh, errfile);
    -  } else {
    -    qh_memcheck(qh);
    -  }
    -  if (strncmp(qhull_cmd, "qhull ", (size_t)6)) {
    -    qh_fprintf(qh, errfile, 6186, "qhull error (qh_new_qhull): start qhull_cmd argument with \"qhull \"\n");
    -    return qh_ERRinput;
    -  }
    -  qh_initqhull_start(qh, NULL, outfile, errfile);
    -  trace1((qh, qh->ferr, 1044, "qh_new_qhull: build new Qhull for %d %d-d points with %s\n", numpoints, dim, qhull_cmd));
    -  exitcode = setjmp(qh->errexit);
    -  if (!exitcode)
    -  {
    -    qh->NOerrexit = False;
    -    qh_initflags(qh, qhull_cmd);
    -    if (qh->DELAUNAY)
    -      qh->PROJECTdelaunay= True;
    -    if (qh->HALFspace) {
    -      /* points is an array of halfspaces,
    -         the last coordinate of each halfspace is its offset */
    -      hulldim= dim-1;
    -      qh_setfeasible(qh, hulldim);
    -      new_points= qh_sethalfspace_all(qh, dim, numpoints, points, qh->feasible_point);
    -      new_ismalloc= True;
    -      if (ismalloc)
    -        qh_free(points);
    -    }else {
    -      hulldim= dim;
    -      new_points= points;
    -      new_ismalloc= ismalloc;
    -    }
    -    qh_init_B(qh, new_points, numpoints, hulldim, new_ismalloc);
    -    qh_qhull(qh);
    -    qh_check_output(qh);
    -    if (outfile) {
    -      qh_produce_output(qh);
    -    }else {
    -      qh_prepare_output(qh);
    -    }
    -    if (qh->VERIFYoutput && !qh->STOPpoint && !qh->STOPcone)
    -      qh_check_points(qh);
    -  }
    -  qh->NOerrexit = True;
    -  return exitcode;
    -} /* new_qhull */
    -
    -/*---------------------------------
    -
    -  qh_errexit(qh, exitcode, facet, ridge )
    -    report and exit from an error
    -    report facet and ridge if non-NULL
    -    reports useful information such as last point processed
    -    set qh.FORCEoutput to print neighborhood of facet
    -
    -  see:
    -    qh_errexit2() in libqhull_r.c for printing 2 facets
    -
    -  design:
    -    check for error within error processing
    -    compute qh.hulltime
    -    print facet and ridge (if any)
    -    report commandString, options, qh.furthest_id
    -    print summary and statistics (including precision statistics)
    -    if qh_ERRsingular
    -      print help text for singular data set
    -    exit program via long jump (if defined) or exit()
    -*/
    -void qh_errexit(qhT *qh, int exitcode, facetT *facet, ridgeT *ridge) {
    -
    -  if (qh->ERREXITcalled) {
    -    qh_fprintf(qh, qh->ferr, 8126, "\nqhull error while processing previous error.  Exit program\n");
    -    qh_exit(qh_ERRqhull);
    -  }
    -  qh->ERREXITcalled= True;
    -  if (!qh->QHULLfinished)
    -    qh->hulltime= qh_CPUclock - qh->hulltime;
    -  qh_errprint(qh, "ERRONEOUS", facet, NULL, ridge, NULL);
    -  qh_fprintf(qh, qh->ferr, 8127, "\nWhile executing: %s | %s\n", qh->rbox_command, qh->qhull_command);
    -  qh_fprintf(qh, qh->ferr, 8128, "Options selected for Qhull %s:\n%s\n", qh_version, qh->qhull_options);
    -  if (qh->furthest_id >= 0) {
    -    qh_fprintf(qh, qh->ferr, 8129, "Last point added to hull was p%d.", qh->furthest_id);
    -    if (zzval_(Ztotmerge))
    -      qh_fprintf(qh, qh->ferr, 8130, "  Last merge was #%d.", zzval_(Ztotmerge));
    -    if (qh->QHULLfinished)
    -      qh_fprintf(qh, qh->ferr, 8131, "\nQhull has finished constructing the hull.");
    -    else if (qh->POSTmerging)
    -      qh_fprintf(qh, qh->ferr, 8132, "\nQhull has started post-merging.");
    -    qh_fprintf(qh, qh->ferr, 8133, "\n");
    -  }
    -  if (qh->FORCEoutput && (qh->QHULLfinished || (!facet && !ridge)))
    -    qh_produce_output(qh);
    -  else if (exitcode != qh_ERRinput) {
    -    if (exitcode != qh_ERRsingular && zzval_(Zsetplane) > qh->hull_dim+1) {
    -      qh_fprintf(qh, qh->ferr, 8134, "\nAt error exit:\n");
    -      qh_printsummary(qh, qh->ferr);
    -      if (qh->PRINTstatistics) {
    -        qh_collectstatistics(qh);
    -        qh_printstatistics(qh, qh->ferr, "at error exit");
    -        qh_memstatistics(qh, qh->ferr);
    -      }
    -    }
    -    if (qh->PRINTprecision)
    -      qh_printstats(qh, qh->ferr, qh->qhstat.precision, NULL);
    -  }
    -  if (!exitcode)
    -    exitcode= qh_ERRqhull;
    -  else if (exitcode == qh_ERRsingular)
    -    qh_printhelp_singular(qh, qh->ferr);
    -  else if (exitcode == qh_ERRprec && !qh->PREmerge)
    -    qh_printhelp_degenerate(qh, qh->ferr);
    -  if (qh->NOerrexit) {
    -    qh_fprintf(qh, qh->ferr, 6187, "qhull error while ending program, or qh->NOerrexit not cleared after setjmp(). Exit program with error.\n");
    -    qh_exit(qh_ERRqhull);
    -  }
    -  qh->ERREXITcalled= False;
    -  qh->NOerrexit= True;
    -  qh->ALLOWrestart= False;  /* longjmp will undo qh_build_withrestart */
    -  longjmp(qh->errexit, exitcode);
    -} /* errexit */
    -
    -
    -/*---------------------------------
    -
    -  qh_errprint(qh, fp, string, atfacet, otherfacet, atridge, atvertex )
    -    prints out the information of facets and ridges to fp
    -    also prints neighbors and geomview output
    -
    -  notes:
    -    except for string, any parameter may be NULL
    -*/
    -void qh_errprint(qhT *qh, const char *string, facetT *atfacet, facetT *otherfacet, ridgeT *atridge, vertexT *atvertex) {
    -  int i;
    -
    -  if (atfacet) {
    -    qh_fprintf(qh, qh->ferr, 8135, "%s FACET:\n", string);
    -    qh_printfacet(qh, qh->ferr, atfacet);
    -  }
    -  if (otherfacet) {
    -    qh_fprintf(qh, qh->ferr, 8136, "%s OTHER FACET:\n", string);
    -    qh_printfacet(qh, qh->ferr, otherfacet);
    -  }
    -  if (atridge) {
    -    qh_fprintf(qh, qh->ferr, 8137, "%s RIDGE:\n", string);
    -    qh_printridge(qh, qh->ferr, atridge);
    -    if (atridge->top && atridge->top != atfacet && atridge->top != otherfacet)
    -      qh_printfacet(qh, qh->ferr, atridge->top);
    -    if (atridge->bottom
    -        && atridge->bottom != atfacet && atridge->bottom != otherfacet)
    -      qh_printfacet(qh, qh->ferr, atridge->bottom);
    -    if (!atfacet)
    -      atfacet= atridge->top;
    -    if (!otherfacet)
    -      otherfacet= otherfacet_(atridge, atfacet);
    -  }
    -  if (atvertex) {
    -    qh_fprintf(qh, qh->ferr, 8138, "%s VERTEX:\n", string);
    -    qh_printvertex(qh, qh->ferr, atvertex);
    -  }
    -  if (qh->fout && qh->FORCEoutput && atfacet && !qh->QHULLfinished && !qh->IStracing) {
    -    qh_fprintf(qh, qh->ferr, 8139, "ERRONEOUS and NEIGHBORING FACETS to output\n");
    -    for (i=0; i < qh_PRINTEND; i++)  /* use fout for geomview output */
    -      qh_printneighborhood(qh, qh->fout, qh->PRINTout[i], atfacet, otherfacet,
    -                            !qh_ALL);
    -  }
    -} /* errprint */
    -
    -
    -/*---------------------------------
    -
    -  qh_printfacetlist(qh, fp, facetlist, facets, printall )
    -    print all fields for a facet list and/or set of facets to fp
    -    if !printall,
    -      only prints good facets
    -
    -  notes:
    -    also prints all vertices
    -*/
    -void qh_printfacetlist(qhT *qh, facetT *facetlist, setT *facets, boolT printall) {
    -  facetT *facet, **facetp;
    -
    -  qh_printbegin(qh, qh->ferr, qh_PRINTfacets, facetlist, facets, printall);
    -  FORALLfacet_(facetlist)
    -    qh_printafacet(qh, qh->ferr, qh_PRINTfacets, facet, printall);
    -  FOREACHfacet_(facets)
    -    qh_printafacet(qh, qh->ferr, qh_PRINTfacets, facet, printall);
    -  qh_printend(qh, qh->ferr, qh_PRINTfacets, facetlist, facets, printall);
    -} /* printfacetlist */
    -
    -
    -/*---------------------------------
    -
    -  qh_printhelp_degenerate(qh, fp )
    -    prints descriptive message for precision error
    -
    -  notes:
    -    no message if qh_QUICKhelp
    -*/
    -void qh_printhelp_degenerate(qhT *qh, FILE *fp) {
    -
    -  if (qh->MERGEexact || qh->PREmerge || qh->JOGGLEmax < REALmax/2)
    -    qh_fprintf(qh, fp, 9368, "\n\
    -A Qhull error has occurred.  Qhull should have corrected the above\n\
    -precision error.  Please send the input and all of the output to\n\
    -qhull_bug@qhull.org\n");
    -  else if (!qh_QUICKhelp) {
    -    qh_fprintf(qh, fp, 9369, "\n\
    -Precision problems were detected during construction of the convex hull.\n\
    -This occurs because convex hull algorithms assume that calculations are\n\
    -exact, but floating-point arithmetic has roundoff errors.\n\
    -\n\
    -To correct for precision problems, do not use 'Q0'.  By default, Qhull\n\
    -selects 'C-0' or 'Qx' and merges non-convex facets.  With option 'QJ',\n\
    -Qhull joggles the input to prevent precision problems.  See \"Imprecision\n\
    -in Qhull\" (qh-impre.htm).\n\
    -\n\
    -If you use 'Q0', the output may include\n\
    -coplanar ridges, concave ridges, and flipped facets.  In 4-d and higher,\n\
    -Qhull may produce a ridge with four neighbors or two facets with the same \n\
    -vertices.  Qhull reports these events when they occur.  It stops when a\n\
    -concave ridge, flipped facet, or duplicate facet occurs.\n");
    -#if REALfloat
    -    qh_fprintf(qh, fp, 9370, "\
    -\n\
    -Qhull is currently using single precision arithmetic.  The following\n\
    -will probably remove the precision problems:\n\
    -  - recompile qhull for realT precision(#define REALfloat 0 in user.h).\n");
    -#endif
    -    if (qh->DELAUNAY && !qh->SCALElast && qh->MAXabs_coord > 1e4)
    -      qh_fprintf(qh, fp, 9371, "\
    -\n\
    -When computing the Delaunay triangulation of coordinates > 1.0,\n\
    -  - use 'Qbb' to scale the last coordinate to [0,m] (max previous coordinate)\n");
    -    if (qh->DELAUNAY && !qh->ATinfinity)
    -      qh_fprintf(qh, fp, 9372, "\
    -When computing the Delaunay triangulation:\n\
    -  - use 'Qz' to add a point at-infinity.  This reduces precision problems.\n");
    -
    -    qh_fprintf(qh, fp, 9373, "\
    -\n\
    -If you need triangular output:\n\
    -  - use option 'Qt' to triangulate the output\n\
    -  - use option 'QJ' to joggle the input points and remove precision errors\n\
    -  - use option 'Ft'.  It triangulates non-simplicial facets with added points.\n\
    -\n\
    -If you must use 'Q0',\n\
    -try one or more of the following options.  They can not guarantee an output.\n\
    -  - use 'QbB' to scale the input to a cube.\n\
    -  - use 'Po' to produce output and prevent partitioning for flipped facets\n\
    -  - use 'V0' to set min. distance to visible facet as 0 instead of roundoff\n\
    -  - use 'En' to specify a maximum roundoff error less than %2.2g.\n\
    -  - options 'Qf', 'Qbb', and 'QR0' may also help\n",
    -               qh->DISTround);
    -    qh_fprintf(qh, fp, 9374, "\
    -\n\
    -To guarantee simplicial output:\n\
    -  - use option 'Qt' to triangulate the output\n\
    -  - use option 'QJ' to joggle the input points and remove precision errors\n\
    -  - use option 'Ft' to triangulate the output by adding points\n\
    -  - use exact arithmetic (see \"Imprecision in Qhull\", qh-impre.htm)\n\
    -");
    -  }
    -} /* printhelp_degenerate */
    -
    -
    -/*---------------------------------
    -
    -  qh_printhelp_narrowhull(qh, minangle )
    -    Warn about a narrow hull
    -
    -  notes:
    -    Alternatively, reduce qh_WARNnarrow in user.h
    -
    -*/
    -void qh_printhelp_narrowhull(qhT *qh, FILE *fp, realT minangle) {
    -
    -    qh_fprintf(qh, fp, 9375, "qhull precision warning: \n\
    -The initial hull is narrow (cosine of min. angle is %.16f).\n\
    -Is the input lower dimensional (e.g., on a plane in 3-d)?  Qhull may\n\
    -produce a wide facet.  Options 'QbB' (scale to unit box) or 'Qbb' (scale\n\
    -last coordinate) may remove this warning.  Use 'Pp' to skip this warning.\n\
    -See 'Limitations' in qh-impre.htm.\n",
    -          -minangle);   /* convert from angle between normals to angle between facets */
    -} /* printhelp_narrowhull */
    -
    -/*---------------------------------
    -
    -  qh_printhelp_singular(qh, fp )
    -    prints descriptive message for singular input
    -*/
    -void qh_printhelp_singular(qhT *qh, FILE *fp) {
    -  facetT *facet;
    -  vertexT *vertex, **vertexp;
    -  realT min, max, *coord, dist;
    -  int i,k;
    -
    -  qh_fprintf(qh, fp, 9376, "\n\
    -The input to qhull appears to be less than %d dimensional, or a\n\
    -computation has overflowed.\n\n\
    -Qhull could not construct a clearly convex simplex from points:\n",
    -           qh->hull_dim);
    -  qh_printvertexlist(qh, fp, "", qh->facet_list, NULL, qh_ALL);
    -  if (!qh_QUICKhelp)
    -    qh_fprintf(qh, fp, 9377, "\n\
    -The center point is coplanar with a facet, or a vertex is coplanar\n\
    -with a neighboring facet.  The maximum round off error for\n\
    -computing distances is %2.2g.  The center point, facets and distances\n\
    -to the center point are as follows:\n\n", qh->DISTround);
    -  qh_printpointid(qh, fp, "center point", qh->hull_dim, qh->interior_point, qh_IDunknown);
    -  qh_fprintf(qh, fp, 9378, "\n");
    -  FORALLfacets {
    -    qh_fprintf(qh, fp, 9379, "facet");
    -    FOREACHvertex_(facet->vertices)
    -      qh_fprintf(qh, fp, 9380, " p%d", qh_pointid(qh, vertex->point));
    -    zinc_(Zdistio);
    -    qh_distplane(qh, qh->interior_point, facet, &dist);
    -    qh_fprintf(qh, fp, 9381, " distance= %4.2g\n", dist);
    -  }
    -  if (!qh_QUICKhelp) {
    -    if (qh->HALFspace)
    -      qh_fprintf(qh, fp, 9382, "\n\
    -These points are the dual of the given halfspaces.  They indicate that\n\
    -the intersection is degenerate.\n");
    -    qh_fprintf(qh, fp, 9383,"\n\
    -These points either have a maximum or minimum x-coordinate, or\n\
    -they maximize the determinant for k coordinates.  Trial points\n\
    -are first selected from points that maximize a coordinate.\n");
    -    if (qh->hull_dim >= qh_INITIALmax)
    -      qh_fprintf(qh, fp, 9384, "\n\
    -Because of the high dimension, the min x-coordinate and max-coordinate\n\
    -points are used if the determinant is non-zero.  Option 'Qs' will\n\
    -do a better, though much slower, job.  Instead of 'Qs', you can change\n\
    -the points by randomly rotating the input with 'QR0'.\n");
    -  }
    -  qh_fprintf(qh, fp, 9385, "\nThe min and max coordinates for each dimension are:\n");
    -  for (k=0; k < qh->hull_dim; k++) {
    -    min= REALmax;
    -    max= -REALmin;
    -    for (i=qh->num_points, coord= qh->first_point+k; i--; coord += qh->hull_dim) {
    -      maximize_(max, *coord);
    -      minimize_(min, *coord);
    -    }
    -    qh_fprintf(qh, fp, 9386, "  %d:  %8.4g  %8.4g  difference= %4.4g\n", k, min, max, max-min);
    -  }
    -  if (!qh_QUICKhelp) {
    -    qh_fprintf(qh, fp, 9387, "\n\
    -If the input should be full dimensional, you have several options that\n\
    -may determine an initial simplex:\n\
    -  - use 'QJ'  to joggle the input and make it full dimensional\n\
    -  - use 'QbB' to scale the points to the unit cube\n\
    -  - use 'QR0' to randomly rotate the input for different maximum points\n\
    -  - use 'Qs'  to search all points for the initial simplex\n\
    -  - use 'En'  to specify a maximum roundoff error less than %2.2g.\n\
    -  - trace execution with 'T3' to see the determinant for each point.\n",
    -                     qh->DISTround);
    -#if REALfloat
    -    qh_fprintf(qh, fp, 9388, "\
    -  - recompile qhull for realT precision(#define REALfloat 0 in libqhull_r.h).\n");
    -#endif
    -    qh_fprintf(qh, fp, 9389, "\n\
    -If the input is lower dimensional:\n\
    -  - use 'QJ' to joggle the input and make it full dimensional\n\
    -  - use 'Qbk:0Bk:0' to delete coordinate k from the input.  You should\n\
    -    pick the coordinate with the least range.  The hull will have the\n\
    -    correct topology.\n\
    -  - determine the flat containing the points, rotate the points\n\
    -    into a coordinate plane, and delete the other coordinates.\n\
    -  - add one or more points to make the input full dimensional.\n\
    -");
    -  }
    -} /* printhelp_singular */
    -
    -/*---------------------------------
    -
    -  qh_user_memsizes(qh)
    -    allocate up to 10 additional, quick allocation sizes
    -
    -  notes:
    -    increase maximum number of allocations in qh_initqhull_mem()
    -*/
    -void qh_user_memsizes(qhT *qh) {
    -
    -  QHULL_UNUSED(qh)
    -  /* qh_memsize(qh, size); */
    -} /* user_memsizes */
    -
    -
    diff --git a/src/qhull/src/libqhull_r/user_r.h b/src/qhull/src/libqhull_r/user_r.h
    deleted file mode 100644
    index fc105b9cace..00000000000
    --- a/src/qhull/src/libqhull_r/user_r.h
    +++ /dev/null
    @@ -1,882 +0,0 @@
    -/*
      ---------------------------------
    -
    -   user.h
    -   user redefinable constants
    -
    -   for each source file, user_r.h is included first
    -
    -   see qh-user_r.htm.  see COPYING for copyright information.
    -
    -   See user_r.c for sample code.
    -
    -   before reading any code, review libqhull_r.h for data structure definitions
    -
    -Sections:
    -   ============= qhull library constants ======================
    -   ============= data types and configuration macros ==========
    -   ============= performance related constants ================
    -   ============= memory constants =============================
    -   ============= joggle constants =============================
    -   ============= conditional compilation ======================
    -   ============= -merge constants- ============================
    -
    -Code flags --
    -  NOerrors -- the code does not call qh_errexit()
    -  WARN64 -- the code may be incompatible with 64-bit pointers
    -
    -*/
    -
    -#include 
    -
    -#ifndef qhDEFuser
    -#define qhDEFuser 1
    -
    -/* Derived from Qt's corelib/global/qglobal.h */
    -#if !defined(SAG_COM) && !defined(__CYGWIN__) && (defined(WIN64) || defined(_WIN64) || defined(__WIN64__) || defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__))
    -#   define QHULL_OS_WIN
    -#elif defined(__MWERKS__) && defined(__INTEL__) /* Metrowerks discontinued before the release of Intel Macs */
    -#   define QHULL_OS_WIN
    -#endif
    -
    -/*============================================================*/
    -/*============= qhull library constants ======================*/
    -/*============================================================*/
    -
    -/*----------------------------------
    -
    -  FILENAMElen -- max length for TI and TO filenames
    -
    -*/
    -
    -#define qh_FILENAMElen 500
    -
    -/*----------------------------------
    -
    -  msgcode -- Unique message codes for qh_fprintf
    -
    -  If add new messages, assign these values and increment in user.h and user_r.h
    -  See QhullError.h for 10000 errors.
    -
    -  def counters =  [27, 1048, 2059, 3026, 4068, 5003,
    -     6273, 7081, 8147, 9411, 10000, 11029]
    -
    -  See: qh_ERR* [libqhull_r.h]
    -*/
    -
    -#define MSG_TRACE0 0
    -#define MSG_TRACE1 1000
    -#define MSG_TRACE2 2000
    -#define MSG_TRACE3 3000
    -#define MSG_TRACE4 4000
    -#define MSG_TRACE5 5000
    -#define MSG_ERROR  6000   /* errors written to qh.ferr */
    -#define MSG_WARNING 7000
    -#define MSG_STDERR  8000  /* log messages Written to qh.ferr */
    -#define MSG_OUTPUT  9000
    -#define MSG_QHULL_ERROR 10000 /* errors thrown by QhullError.cpp (QHULLlastError is in QhullError.h) */
    -#define MSG_FIXUP  11000  /* FIXUP QH11... */
    -#define MSG_MAXLEN  3000 /* qh_printhelp_degenerate() in user.c */
    -
    -
    -/*----------------------------------
    -
    -  qh_OPTIONline -- max length of an option line 'FO'
    -*/
    -#define qh_OPTIONline 80
    -
    -/*============================================================*/
    -/*============= data types and configuration macros ==========*/
    -/*============================================================*/
    -
    -/*----------------------------------
    -
    -  realT
    -    set the size of floating point numbers
    -
    -  qh_REALdigits
    -    maximimum number of significant digits
    -
    -  qh_REAL_1, qh_REAL_2n, qh_REAL_3n
    -    format strings for printf
    -
    -  qh_REALmax, qh_REALmin
    -    maximum and minimum (near zero) values
    -
    -  qh_REALepsilon
    -    machine roundoff.  Maximum roundoff error for addition and multiplication.
    -
    -  notes:
    -   Select whether to store floating point numbers in single precision (float)
    -   or double precision (double).
    -
    -   Use 'float' to save about 8% in time and 25% in space.  This is particularly
    -   helpful if high-d where convex hulls are space limited.  Using 'float' also
    -   reduces the printed size of Qhull's output since numbers have 8 digits of
    -   precision.
    -
    -   Use 'double' when greater arithmetic precision is needed.  This is needed
    -   for Delaunay triangulations and Voronoi diagrams when you are not merging
    -   facets.
    -
    -   If 'double' gives insufficient precision, your data probably includes
    -   degeneracies.  If so you should use facet merging (done by default)
    -   or exact arithmetic (see imprecision section of manual, qh-impre.htm).
    -   You may also use option 'Po' to force output despite precision errors.
    -
    -   You may use 'long double', but many format statements need to be changed
    -   and you may need a 'long double' square root routine.  S. Grundmann
    -   (sg@eeiwzb.et.tu-dresden.de) has done this.  He reports that the code runs
    -   much slower with little gain in precision.
    -
    -   WARNING: on some machines,    int f(){realT a= REALmax;return (a == REALmax);}
    -      returns False.  Use (a > REALmax/2) instead of (a == REALmax).
    -
    -   REALfloat =   1      all numbers are 'float' type
    -             =   0      all numbers are 'double' type
    -*/
    -#define REALfloat 0
    -
    -#if (REALfloat == 1)
    -#define realT float
    -#define REALmax FLT_MAX
    -#define REALmin FLT_MIN
    -#define REALepsilon FLT_EPSILON
    -#define qh_REALdigits 8   /* maximum number of significant digits */
    -#define qh_REAL_1 "%6.8g "
    -#define qh_REAL_2n "%6.8g %6.8g\n"
    -#define qh_REAL_3n "%6.8g %6.8g %6.8g\n"
    -
    -#elif (REALfloat == 0)
    -#define realT double
    -#define REALmax DBL_MAX
    -#define REALmin DBL_MIN
    -#define REALepsilon DBL_EPSILON
    -#define qh_REALdigits 16    /* maximum number of significant digits */
    -#define qh_REAL_1 "%6.16g "
    -#define qh_REAL_2n "%6.16g %6.16g\n"
    -#define qh_REAL_3n "%6.16g %6.16g %6.16g\n"
    -
    -#else
    -#error unknown float option
    -#endif
    -
    -/*----------------------------------
    -
    -  countT
    -    The type for counts and identifiers (e.g., the number of points, vertex identifiers)
    -    Currently used by C++ code-only.  Decided against using it for setT because most sets are small.
    -
    -    Defined as 'int' for C-code compatibility and QH11026
    -
    -    FIXUP QH11026 countT may be defined as a unsigned value, but several code issues need to be solved first.  See countT in Changes.txt
    -*/
    -
    -#ifndef DEFcountT
    -#define DEFcountT 1
    -typedef int countT;
    -#endif
    -#define COUNTmax 0x7fffffff
    -
    -
    -/*----------------------------------
    -
    -  qh_CPUclock
    -    define the clock() function for reporting the total time spent by Qhull
    -    returns CPU ticks as a 'long int'
    -    qh_CPUclock is only used for reporting the total time spent by Qhull
    -
    -  qh_SECticks
    -    the number of clock ticks per second
    -
    -  notes:
    -    looks for CLOCKS_PER_SEC, CLOCKS_PER_SECOND, or assumes microseconds
    -    to define a custom clock, set qh_CLOCKtype to 0
    -
    -    if your system does not use clock() to return CPU ticks, replace
    -    qh_CPUclock with the corresponding function.  It is converted
    -    to 'unsigned long' to prevent wrap-around during long runs.  By default,
    -     defines clock_t as 'long'
    -
    -   Set qh_CLOCKtype to
    -
    -     1          for CLOCKS_PER_SEC, CLOCKS_PER_SECOND, or microsecond
    -                Note:  may fail if more than 1 hour elapsed time
    -
    -     2          use qh_clock() with POSIX times() (see global_r.c)
    -*/
    -#define qh_CLOCKtype 1  /* change to the desired number */
    -
    -#if (qh_CLOCKtype == 1)
    -
    -#if defined(CLOCKS_PER_SECOND)
    -#define qh_CPUclock    ((unsigned long)clock())  /* return CPU clock */
    -#define qh_SECticks CLOCKS_PER_SECOND
    -
    -#elif defined(CLOCKS_PER_SEC)
    -#define qh_CPUclock    ((unsigned long)clock())  /* return CPU clock */
    -#define qh_SECticks CLOCKS_PER_SEC
    -
    -#elif defined(CLK_TCK)
    -#define qh_CPUclock    ((unsigned long)clock())  /* return CPU clock */
    -#define qh_SECticks CLK_TCK
    -
    -#else
    -#define qh_CPUclock    ((unsigned long)clock())  /* return CPU clock */
    -#define qh_SECticks 1E6
    -#endif
    -
    -#elif (qh_CLOCKtype == 2)
    -#define qh_CPUclock    qh_clock()  /* return CPU clock */
    -#define qh_SECticks 100
    -
    -#else /* qh_CLOCKtype == ? */
    -#error unknown clock option
    -#endif
    -
    -/*----------------------------------
    -
    -  qh_RANDOMtype, qh_RANDOMmax, qh_RANDOMseed
    -    define random number generator
    -
    -    qh_RANDOMint generates a random integer between 0 and qh_RANDOMmax.
    -    qh_RANDOMseed sets the random number seed for qh_RANDOMint
    -
    -  Set qh_RANDOMtype (default 5) to:
    -    1       for random() with 31 bits (UCB)
    -    2       for rand() with RAND_MAX or 15 bits (system 5)
    -    3       for rand() with 31 bits (Sun)
    -    4       for lrand48() with 31 bits (Solaris)
    -    5       for qh_rand(qh) with 31 bits (included with Qhull, requires 'qh')
    -
    -  notes:
    -    Random numbers are used by rbox to generate point sets.  Random
    -    numbers are used by Qhull to rotate the input ('QRn' option),
    -    simulate a randomized algorithm ('Qr' option), and to simulate
    -    roundoff errors ('Rn' option).
    -
    -    Random number generators differ between systems.  Most systems provide
    -    rand() but the period varies.  The period of rand() is not critical
    -    since qhull does not normally use random numbers.
    -
    -    The default generator is Park & Miller's minimal standard random
    -    number generator [CACM 31:1195 '88].  It is included with Qhull.
    -
    -    If qh_RANDOMmax is wrong, qhull will report a warning and Geomview
    -    output will likely be invisible.
    -*/
    -#define qh_RANDOMtype 5   /* *** change to the desired number *** */
    -
    -#if (qh_RANDOMtype == 1)
    -#define qh_RANDOMmax ((realT)0x7fffffffUL)  /* 31 bits, random()/MAX */
    -#define qh_RANDOMint random()
    -#define qh_RANDOMseed_(qh, seed) srandom(seed);
    -
    -#elif (qh_RANDOMtype == 2)
    -#ifdef RAND_MAX
    -#define qh_RANDOMmax ((realT)RAND_MAX)
    -#else
    -#define qh_RANDOMmax ((realT)32767)   /* 15 bits (System 5) */
    -#endif
    -#define qh_RANDOMint  rand()
    -#define qh_RANDOMseed_(qh, seed) srand((unsigned)seed);
    -
    -#elif (qh_RANDOMtype == 3)
    -#define qh_RANDOMmax ((realT)0x7fffffffUL)  /* 31 bits, Sun */
    -#define qh_RANDOMint  rand()
    -#define qh_RANDOMseed_(qh, seed) srand((unsigned)seed);
    -
    -#elif (qh_RANDOMtype == 4)
    -#define qh_RANDOMmax ((realT)0x7fffffffUL)  /* 31 bits, lrand38()/MAX */
    -#define qh_RANDOMint lrand48()
    -#define qh_RANDOMseed_(qh, seed) srand48(seed);
    -
    -#elif (qh_RANDOMtype == 5)  /* 'qh' is an implicit parameter */
    -#define qh_RANDOMmax ((realT)2147483646UL)  /* 31 bits, qh_rand/MAX */
    -#define qh_RANDOMint qh_rand(qh)
    -#define qh_RANDOMseed_(qh, seed) qh_srand(qh, seed);
    -/* unlike rand(), never returns 0 */
    -
    -#else
    -#error: unknown random option
    -#endif
    -
    -/*----------------------------------
    -
    -  qh_ORIENTclock
    -    0 for inward pointing normals by Geomview convention
    -*/
    -#define qh_ORIENTclock 0
    -
    -
    -/*============================================================*/
    -/*============= joggle constants =============================*/
    -/*============================================================*/
    -
    -/*----------------------------------
    -
    -qh_JOGGLEdefault
    -default qh.JOGGLEmax is qh.DISTround * qh_JOGGLEdefault
    -
    -notes:
    -rbox s r 100 | qhull QJ1e-15 QR0 generates 90% faults at distround 7e-16
    -rbox s r 100 | qhull QJ1e-14 QR0 generates 70% faults
    -rbox s r 100 | qhull QJ1e-13 QR0 generates 35% faults
    -rbox s r 100 | qhull QJ1e-12 QR0 generates 8% faults
    -rbox s r 100 | qhull QJ1e-11 QR0 generates 1% faults
    -rbox s r 100 | qhull QJ1e-10 QR0 generates 0% faults
    -rbox 1000 W0 | qhull QJ1e-12 QR0 generates 86% faults
    -rbox 1000 W0 | qhull QJ1e-11 QR0 generates 20% faults
    -rbox 1000 W0 | qhull QJ1e-10 QR0 generates 2% faults
    -the later have about 20 points per facet, each of which may interfere
    -
    -pick a value large enough to avoid retries on most inputs
    -*/
    -#define qh_JOGGLEdefault 30000.0
    -
    -/*----------------------------------
    -
    -qh_JOGGLEincrease
    -factor to increase qh.JOGGLEmax on qh_JOGGLEretry or qh_JOGGLEagain
    -*/
    -#define qh_JOGGLEincrease 10.0
    -
    -/*----------------------------------
    -
    -qh_JOGGLEretry
    -if ZZretry = qh_JOGGLEretry, increase qh.JOGGLEmax
    -
    -notes:
    -try twice at the original value in case of bad luck the first time
    -*/
    -#define qh_JOGGLEretry 2
    -
    -/*----------------------------------
    -
    -qh_JOGGLEagain
    -every following qh_JOGGLEagain, increase qh.JOGGLEmax
    -
    -notes:
    -1 is OK since it's already failed qh_JOGGLEretry times
    -*/
    -#define qh_JOGGLEagain 1
    -
    -/*----------------------------------
    -
    -qh_JOGGLEmaxincrease
    -maximum qh.JOGGLEmax due to qh_JOGGLEincrease
    -relative to qh.MAXwidth
    -
    -notes:
    -qh.joggleinput will retry at this value until qh_JOGGLEmaxretry
    -*/
    -#define qh_JOGGLEmaxincrease 1e-2
    -
    -/*----------------------------------
    -
    -qh_JOGGLEmaxretry
    -stop after qh_JOGGLEmaxretry attempts
    -*/
    -#define qh_JOGGLEmaxretry 100
    -
    -/*============================================================*/
    -/*============= performance related constants ================*/
    -/*============================================================*/
    -
    -/*----------------------------------
    -
    -  qh_HASHfactor
    -    total hash slots / used hash slots.  Must be at least 1.1.
    -
    -  notes:
    -    =2 for at worst 50% occupancy for qh.hash_table and normally 25% occupancy
    -*/
    -#define qh_HASHfactor 2
    -
    -/*----------------------------------
    -
    -  qh_VERIFYdirect
    -    with 'Tv' verify all points against all facets if op count is smaller
    -
    -  notes:
    -    if greater, calls qh_check_bestdist() instead
    -*/
    -#define qh_VERIFYdirect 1000000
    -
    -/*----------------------------------
    -
    -  qh_INITIALsearch
    -     if qh_INITIALmax, search points up to this dimension
    -*/
    -#define qh_INITIALsearch 6
    -
    -/*----------------------------------
    -
    -  qh_INITIALmax
    -    if dim >= qh_INITIALmax, use min/max coordinate points for initial simplex
    -
    -  notes:
    -    from points with non-zero determinants
    -    use option 'Qs' to override (much slower)
    -*/
    -#define qh_INITIALmax 8
    -
    -/*============================================================*/
    -/*============= memory constants =============================*/
    -/*============================================================*/
    -
    -/*----------------------------------
    -
    -  qh_MEMalign
    -    memory alignment for qh_meminitbuffers() in global_r.c
    -
    -  notes:
    -    to avoid bus errors, memory allocation must consider alignment requirements.
    -    malloc() automatically takes care of alignment.   Since mem_r.c manages
    -    its own memory, we need to explicitly specify alignment in
    -    qh_meminitbuffers().
    -
    -    A safe choice is sizeof(double).  sizeof(float) may be used if doubles
    -    do not occur in data structures and pointers are the same size.  Be careful
    -    of machines (e.g., DEC Alpha) with large pointers.
    -
    -    If using gcc, best alignment is [fmax_() is defined in geom_r.h]
    -              #define qh_MEMalign fmax_(__alignof__(realT),__alignof__(void *))
    -*/
    -#define qh_MEMalign ((int)(fmax_(sizeof(realT), sizeof(void *))))
    -
    -/*----------------------------------
    -
    -  qh_MEMbufsize
    -    size of additional memory buffers
    -
    -  notes:
    -    used for qh_meminitbuffers() in global_r.c
    -*/
    -#define qh_MEMbufsize 0x10000       /* allocate 64K memory buffers */
    -
    -/*----------------------------------
    -
    -  qh_MEMinitbuf
    -    size of initial memory buffer
    -
    -  notes:
    -    use for qh_meminitbuffers() in global_r.c
    -*/
    -#define qh_MEMinitbuf 0x20000      /* initially allocate 128K buffer */
    -
    -/*----------------------------------
    -
    -  qh_INFINITE
    -    on output, indicates Voronoi center at infinity
    -*/
    -#define qh_INFINITE  -10.101
    -
    -/*----------------------------------
    -
    -  qh_DEFAULTbox
    -    default box size (Geomview expects 0.5)
    -
    -  qh_DEFAULTbox
    -    default box size for integer coorindate (rbox only)
    -*/
    -#define qh_DEFAULTbox 0.5
    -#define qh_DEFAULTzbox 1e6
    -
    -/*============================================================*/
    -/*============= conditional compilation ======================*/
    -/*============================================================*/
    -
    -/*----------------------------------
    -
    -  __cplusplus
    -    defined by C++ compilers
    -
    -  __MSC_VER
    -    defined by Microsoft Visual C++
    -
    -  __MWERKS__ && __INTEL__
    -    defined by Metrowerks when compiling for Windows (not Intel-based Macintosh)
    -
    -  __MWERKS__ && __POWERPC__
    -    defined by Metrowerks when compiling for PowerPC-based Macintosh
    -
    -  __STDC__
    -    defined for strict ANSI C
    -*/
    -
    -/*----------------------------------
    -
    -  qh_COMPUTEfurthest
    -    compute furthest distance to an outside point instead of storing it with the facet
    -    =1 to compute furthest
    -
    -  notes:
    -    computing furthest saves memory but costs time
    -      about 40% more distance tests for partitioning
    -      removes facet->furthestdist
    -*/
    -#define qh_COMPUTEfurthest 0
    -
    -/*----------------------------------
    -
    -  qh_KEEPstatistics
    -    =0 removes most of statistic gathering and reporting
    -
    -  notes:
    -    if 0, code size is reduced by about 4%.
    -*/
    -#define qh_KEEPstatistics 1
    -
    -/*----------------------------------
    -
    -  qh_MAXoutside
    -    record outer plane for each facet
    -    =1 to record facet->maxoutside
    -
    -  notes:
    -    this takes a realT per facet and slightly slows down qhull
    -    it produces better outer planes for geomview output
    -*/
    -#define qh_MAXoutside 1
    -
    -/*----------------------------------
    -
    -  qh_NOmerge
    -    disables facet merging if defined
    -
    -  notes:
    -    This saves about 10% space.
    -
    -    Unless 'Q0'
    -      qh_NOmerge sets 'QJ' to avoid precision errors
    -
    -    #define qh_NOmerge
    -
    -  see:
    -    qh_NOmem in mem_r.c
    -
    -    see user_r.c/user_eg.c for removing io_r.o
    -*/
    -
    -/*----------------------------------
    -
    -  qh_NOtrace
    -    no tracing if defined
    -
    -  notes:
    -    This saves about 5% space.
    -
    -    #define qh_NOtrace
    -*/
    -
    -#if 0  /* sample code */
    -    exitcode= qh_new_qhull(qhT *qh, dim, numpoints, points, ismalloc,
    -                      flags, outfile, errfile);
    -    qh_freeqhull(qhT *qh, !qh_ALL); /* frees long memory used by second call */
    -    qh_memfreeshort(qhT *qh, &curlong, &totlong);  /* frees short memory and memory allocator */
    -#endif
    -
    -/*----------------------------------
    -
    -  qh_QUICKhelp
    -    =1 to use abbreviated help messages, e.g., for degenerate inputs
    -*/
    -#define qh_QUICKhelp    0
    -
    -/*============================================================*/
    -/*============= -merge constants- ============================*/
    -/*============================================================*/
    -/*
    -   These constants effect facet merging.  You probably will not need
    -   to modify them.  They effect the performance of facet merging.
    -*/
    -
    -/*----------------------------------
    -
    -  qh_DIMmergeVertex
    -    max dimension for vertex merging (it is not effective in high-d)
    -*/
    -#define qh_DIMmergeVertex 6
    -
    -/*----------------------------------
    -
    -  qh_DIMreduceBuild
    -     max dimension for vertex reduction during build (slow in high-d)
    -*/
    -#define qh_DIMreduceBuild 5
    -
    -/*----------------------------------
    -
    -  qh_BESTcentrum
    -     if > 2*dim+n vertices, qh_findbestneighbor() tests centrums (faster)
    -     else, qh_findbestneighbor() tests all vertices (much better merges)
    -
    -  qh_BESTcentrum2
    -     if qh_BESTcentrum2 * DIM3 + BESTcentrum < #vertices tests centrums
    -*/
    -#define qh_BESTcentrum 20
    -#define qh_BESTcentrum2 2
    -
    -/*----------------------------------
    -
    -  qh_BESTnonconvex
    -    if > dim+n neighbors, qh_findbestneighbor() tests nonconvex ridges.
    -
    -  notes:
    -    It is needed because qh_findbestneighbor is slow for large facets
    -*/
    -#define qh_BESTnonconvex 15
    -
    -/*----------------------------------
    -
    -  qh_MAXnewmerges
    -    if >n newmerges, qh_merge_nonconvex() calls qh_reducevertices_centrums.
    -
    -  notes:
    -    It is needed because postmerge can merge many facets at once
    -*/
    -#define qh_MAXnewmerges 2
    -
    -/*----------------------------------
    -
    -  qh_MAXnewcentrum
    -    if <= dim+n vertices (n approximates the number of merges),
    -      reset the centrum in qh_updatetested() and qh_mergecycle_facets()
    -
    -  notes:
    -    needed to reduce cost and because centrums may move too much if
    -    many vertices in high-d
    -*/
    -#define qh_MAXnewcentrum 5
    -
    -/*----------------------------------
    -
    -  qh_COPLANARratio
    -    for 3-d+ merging, qh.MINvisible is n*premerge_centrum
    -
    -  notes:
    -    for non-merging, it's DISTround
    -*/
    -#define qh_COPLANARratio 3
    -
    -/*----------------------------------
    -
    -  qh_DISToutside
    -    When is a point clearly outside of a facet?
    -    Stops search in qh_findbestnew or qh_partitionall
    -    qh_findbest uses qh.MINoutside since since it is only called if no merges.
    -
    -  notes:
    -    'Qf' always searches for best facet
    -    if !qh.MERGING, same as qh.MINoutside.
    -    if qh_USEfindbestnew, increase value since neighboring facets may be ill-behaved
    -      [Note: Zdelvertextot occurs normally with interior points]
    -            RBOX 1000 s Z1 G1e-13 t1001188774 | QHULL Tv
    -    When there is a sharp edge, need to move points to a
    -    clearly good facet; otherwise may be lost in another partitioning.
    -    if too big then O(n^2) behavior for partitioning in cone
    -    if very small then important points not processed
    -    Needed in qh_partitionall for
    -      RBOX 1000 s Z1 G1e-13 t1001032651 | QHULL Tv
    -    Needed in qh_findbestnew for many instances of
    -      RBOX 1000 s Z1 G1e-13 t | QHULL Tv
    -
    -  See:
    -    qh_DISToutside -- when is a point clearly outside of a facet
    -    qh_SEARCHdist -- when is facet coplanar with the best facet?
    -    qh_USEfindbestnew -- when to use qh_findbestnew for qh_partitionpoint()
    -*/
    -#define qh_DISToutside ((qh_USEfindbestnew ? 2 : 1) * \
    -     fmax_((qh->MERGING ? 2 : 1)*qh->MINoutside, qh->max_outside))
    -
    -/*----------------------------------
    -
    -  qh_RATIOnearinside
    -    ratio of qh.NEARinside to qh.ONEmerge for retaining inside points for
    -    qh_check_maxout().
    -
    -  notes:
    -    This is overkill since do not know the correct value.
    -    It effects whether 'Qc' reports all coplanar points
    -    Not used for 'd' since non-extreme points are coplanar
    -*/
    -#define qh_RATIOnearinside 5
    -
    -/*----------------------------------
    -
    -  qh_SEARCHdist
    -    When is a facet coplanar with the best facet?
    -    qh_findbesthorizon: all coplanar facets of the best facet need to be searched.
    -
    -  See:
    -    qh_DISToutside -- when is a point clearly outside of a facet
    -    qh_SEARCHdist -- when is facet coplanar with the best facet?
    -    qh_USEfindbestnew -- when to use qh_findbestnew for qh_partitionpoint()
    -*/
    -#define qh_SEARCHdist ((qh_USEfindbestnew ? 2 : 1) * \
    -      (qh->max_outside + 2 * qh->DISTround + fmax_( qh->MINvisible, qh->MAXcoplanar)));
    -
    -/*----------------------------------
    -
    -  qh_USEfindbestnew
    -     Always use qh_findbestnew for qh_partitionpoint, otherwise use
    -     qh_findbestnew if merged new facet or sharpnewfacets.
    -
    -  See:
    -    qh_DISToutside -- when is a point clearly outside of a facet
    -    qh_SEARCHdist -- when is facet coplanar with the best facet?
    -    qh_USEfindbestnew -- when to use qh_findbestnew for qh_partitionpoint()
    -*/
    -#define qh_USEfindbestnew (zzval_(Ztotmerge) > 50)
    -
    -/*----------------------------------
    -
    -  qh_WIDEcoplanar
    -    n*MAXcoplanar or n*MINvisible for a WIDEfacet
    -
    -    if vertex is further than qh.WIDEfacet from the hyperplane
    -    then its ridges are not counted in computing the area, and
    -    the facet's centrum is frozen.
    -
    -  notes:
    -   qh.WIDEfacet= max(qh.MAXoutside,qh_WIDEcoplanar*qh.MAXcoplanar,
    -      qh_WIDEcoplanar * qh.MINvisible);
    -*/
    -#define qh_WIDEcoplanar 6
    -
    -/*----------------------------------
    -
    -  qh_WIDEduplicate
    -    Merge ratio for errexit from qh_forcedmerges due to duplicate ridge
    -    Override with option Q12 no-wide-duplicate
    -
    -    Notes:
    -      Merging a duplicate ridge can lead to very wide facets.
    -      A future release of qhull will avoid duplicate ridges by removing duplicate sub-ridges from the horizon
    -*/
    -#define qh_WIDEduplicate 100
    -
    -/*----------------------------------
    -
    -  qh_MAXnarrow
    -    max. cosine in initial hull that sets qh.NARROWhull
    -
    -  notes:
    -    If qh.NARROWhull, the initial partition does not make
    -    coplanar points.  If narrow, a coplanar point can be
    -    coplanar to two facets of opposite orientations and
    -    distant from the exact convex hull.
    -
    -    Conservative estimate.  Don't actually see problems until it is -1.0
    -*/
    -#define qh_MAXnarrow -0.99999999
    -
    -/*----------------------------------
    -
    -  qh_WARNnarrow
    -    max. cosine in initial hull to warn about qh.NARROWhull
    -
    -  notes:
    -    this is a conservative estimate.
    -    Don't actually see problems until it is -1.0.  See qh-impre.htm
    -*/
    -#define qh_WARNnarrow -0.999999999999999
    -
    -/*----------------------------------
    -
    -  qh_ZEROdelaunay
    -    a zero Delaunay facet occurs for input sites coplanar with their convex hull
    -    the last normal coefficient of a zero Delaunay facet is within
    -        qh_ZEROdelaunay * qh.ANGLEround of 0
    -
    -  notes:
    -    qh_ZEROdelaunay does not allow for joggled input ('QJ').
    -
    -    You can avoid zero Delaunay facets by surrounding the input with a box.
    -
    -    Use option 'PDk:-n' to explicitly define zero Delaunay facets
    -      k= dimension of input sites (e.g., 3 for 3-d Delaunay triangulation)
    -      n= the cutoff for zero Delaunay facets (e.g., 'PD3:-1e-12')
    -*/
    -#define qh_ZEROdelaunay 2
    -
    -/*============================================================*/
    -/*============= Microsoft DevStudio ==========================*/
    -/*============================================================*/
    -
    -/*
    -   Finding Memory Leaks Using the CRT Library
    -   https://msdn.microsoft.com/en-us/library/x98tx3cf(v=vs.100).aspx
    -
    -   Reports enabled in qh_lib_check for Debug window and stderr
    -
    -   From 2005=>msvcr80d, 2010=>msvcr100d, 2012=>msvcr110d
    -
    -   Watch: {,,msvcr80d.dll}_crtBreakAlloc  Value from {n} in the leak report
    -   _CrtSetBreakAlloc(689); // qh_lib_check() [global_r.c]
    -
    -   Examples
    -     http://free-cad.sourceforge.net/SrcDocu/d2/d7f/MemDebug_8cpp_source.html
    -     https://github.com/illlust/Game/blob/master/library/MemoryLeak.cpp
    -*/
    -#if 0   /* off (0) by default for QHULL_CRTDBG */
    -#define QHULL_CRTDBG
    -#endif
    -
    -#if defined(_MSC_VER) && defined(_DEBUG) && defined(QHULL_CRTDBG)
    -#define _CRTDBG_MAP_ALLOC
    -#include 
    -#include 
    -#endif
    -
    -#endif /* qh_DEFuser */
    -
    -
    -
    diff --git a/src/qhull/src/libqhull_r/usermem_r.c b/src/qhull/src/libqhull_r/usermem_r.c
    deleted file mode 100644
    index 3297b03185e..00000000000
    --- a/src/qhull/src/libqhull_r/usermem_r.c
    +++ /dev/null
    @@ -1,94 +0,0 @@
    -/*
      ---------------------------------
    -
    -   usermem_r.c
    -   qh_exit(), qh_free(), and qh_malloc()
    -
    -   See README.txt.
    -
    -   If you redefine one of these functions you must redefine all of them.
    -   If you recompile and load this file, then usermem.o will not be loaded
    -   from qhull.a or qhull.lib
    -
    -   See libqhull_r.h for data structures, macros, and user-callable functions.
    -   See user_r.c for qhull-related, redefinable functions
    -   see user_r.h for user-definable constants
    -   See userprintf_r.c for qh_fprintf and userprintf_rbox_r.c for qh_fprintf_rbox
    -
    -   Please report any errors that you fix to qhull@qhull.org
    -*/
    -
    -#include "libqhull_r.h"
    -
    -#include 
    -#include 
    -
    -/*---------------------------------
    -
    -  qh_exit( exitcode )
    -    exit program
    -
    -  notes:
    -    qh_exit() is called when qh_errexit() and longjmp() are not available.
    -
    -    This is the only use of exit() in Qhull
    -    To replace qh_exit with 'throw', see libqhullcpp/usermem_r-cpp.cpp
    -*/
    -void qh_exit(int exitcode) {
    -    exit(exitcode);
    -} /* exit */
    -
    -/*---------------------------------
    -
    -  qh_fprintf_stderr( msgcode, format, list of args )
    -    fprintf to stderr with msgcode (non-zero)
    -
    -  notes:
    -    qh_fprintf_stderr() is called when qh->ferr is not defined, usually due to an initialization error
    -    
    -    It is typically followed by qh_errexit().
    -
    -    Redefine this function to avoid using stderr
    -
    -    Use qh_fprintf [userprintf_r.c] for normal printing
    -*/
    -void qh_fprintf_stderr(int msgcode, const char *fmt, ... ) {
    -    va_list args;
    -
    -    va_start(args, fmt);
    -    if(msgcode)
    -      fprintf(stderr, "QH%.4d ", msgcode);
    -    vfprintf(stderr, fmt, args);
    -    va_end(args);
    -} /* fprintf_stderr */
    -
    -/*---------------------------------
    -
    -  qh_free(qhT *qh, mem )
    -    free memory
    -
    -  notes:
    -    same as free()
    -    No calls to qh_errexit() 
    -*/
    -void qh_free(void *mem) {
    -    free(mem);
    -} /* free */
    -
    -/*---------------------------------
    -
    -    qh_malloc( mem )
    -      allocate memory
    -
    -    notes:
    -      same as malloc()
    -*/
    -void *qh_malloc(size_t size) {
    -    return malloc(size);
    -} /* malloc */
    -
    -
    diff --git a/src/qhull/src/libqhull_r/userprintf_r.c b/src/qhull/src/libqhull_r/userprintf_r.c
    deleted file mode 100644
    index 6004491a1c3..00000000000
    --- a/src/qhull/src/libqhull_r/userprintf_r.c
    +++ /dev/null
    @@ -1,65 +0,0 @@
    -/*
      ---------------------------------
    -
    -   userprintf_r.c
    -   qh_fprintf()
    -
    -   see README.txt  see COPYING.txt for copyright information.
    -
    -   If you recompile and load this file, then userprintf_r.o will not be loaded
    -   from qhull.a or qhull.lib
    -
    -   See libqhull_r.h for data structures, macros, and user-callable functions.
    -   See user_r.c for qhull-related, redefinable functions
    -   see user_r.h for user-definable constants
    -   See usermem_r.c for qh_exit(), qh_free(), and qh_malloc()
    -   see Qhull.cpp and RboxPoints.cpp for examples.
    -
    -   Please report any errors that you fix to qhull@qhull.org
    -*/
    -
    -#include "libqhull_r.h"
    -
    -#include 
    -#include 
    -#include 
    -
    -/*---------------------------------
    -
    -   qh_fprintf(qh, fp, msgcode, format, list of args )
    -     print arguments to *fp according to format
    -     Use qh_fprintf_rbox() for rboxlib_r.c
    -
    -   notes:
    -     same as fprintf()
    -     fgets() is not trapped like fprintf()
    -     exit qh_fprintf via qh_errexit()
    -     may be called for errors in qh_initstatistics and qh_meminit
    -*/
    -
    -void qh_fprintf(qhT *qh, FILE *fp, int msgcode, const char *fmt, ... ) {
    -    va_list args;
    -
    -    if (!fp) {
    -        if(!qh){
    -            qh_fprintf_stderr(6241, "userprintf_r.c: fp and qh not defined for qh_fprintf '%s'", fmt);
    -            qh_exit(qhmem_ERRqhull);  /* can not use qh_errexit() */
    -        }
    -        /* could use qh->qhmem.ferr, but probably better to be cautious */
    -        qh_fprintf_stderr(6232, "Qhull internal error (userprintf_r.c): fp is 0.  Wrong qh_fprintf called.\n");
    -        qh_errexit(qh, 6232, NULL, NULL);
    -    }
    -    va_start(args, fmt);
    -    if (qh && qh->ANNOTATEoutput) {
    -      fprintf(fp, "[QH%.4d]", msgcode);
    -    }else if (msgcode >= MSG_ERROR && msgcode < MSG_STDERR ) {
    -      fprintf(fp, "QH%.4d ", msgcode);
    -    }
    -    vfprintf(fp, fmt, args);
    -    va_end(args);
    -
    -    /* Place debugging traps here. Use with option 'Tn' */
    -
    -} /* qh_fprintf */
    -
    diff --git a/src/qhull/src/libqhull_r/userprintf_rbox_r.c b/src/qhull/src/libqhull_r/userprintf_rbox_r.c
    deleted file mode 100644
    index 1e721a22aee..00000000000
    --- a/src/qhull/src/libqhull_r/userprintf_rbox_r.c
    +++ /dev/null
    @@ -1,53 +0,0 @@
    -/*
      ---------------------------------
    -
    -   userprintf_rbox_r.c
    -   qh_fprintf_rbox()
    -
    -   see README.txt  see COPYING.txt for copyright information.
    -
    -   If you recompile and load this file, then userprintf_rbox_r.o will not be loaded
    -   from qhull.a or qhull.lib
    -
    -   See libqhull_r.h for data structures, macros, and user-callable functions.
    -   See user_r.c for qhull-related, redefinable functions
    -   see user_r.h for user-definable constants
    -   See usermem_r.c for qh_exit(), qh_free(), and qh_malloc()
    -   see Qhull.cpp and RboxPoints.cpp for examples.
    -
    -   Please report any errors that you fix to qhull@qhull.org
    -*/
    -
    -#include "libqhull_r.h"
    -
    -#include 
    -#include 
    -#include 
    -
    -/*---------------------------------
    -
    -   qh_fprintf_rbox(qh, fp, msgcode, format, list of args )
    -     print arguments to *fp according to format
    -     Use qh_fprintf_rbox() for rboxlib_r.c
    -
    -   notes:
    -     same as fprintf()
    -     fgets() is not trapped like fprintf()
    -     exit qh_fprintf_rbox via qh_errexit_rbox()
    -*/
    -
    -void qh_fprintf_rbox(qhT *qh, FILE *fp, int msgcode, const char *fmt, ... ) {
    -    va_list args;
    -
    -    if (!fp) {
    -        qh_fprintf_stderr(6231, "Qhull internal error (userprintf_rbox_r.c): fp is 0.  Wrong qh_fprintf_rbox called.\n");
    -        qh_errexit_rbox(qh, 6231);
    -    }
    -    if (msgcode >= MSG_ERROR && msgcode < MSG_STDERR)
    -      fprintf(fp, "QH%.4d ", msgcode);
    -    va_start(args, fmt);
    -    vfprintf(fp, fmt, args);
    -    va_end(args);
    -} /* qh_fprintf_rbox */
    -
    diff --git a/src/qhull/src/libqhullcpp/Coordinates.cpp b/src/qhull/src/libqhullcpp/Coordinates.cpp
    deleted file mode 100644
    index 806b438aba5..00000000000
    --- a/src/qhull/src/libqhullcpp/Coordinates.cpp
    +++ /dev/null
    @@ -1,198 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/Coordinates.cpp#4 $$Change: 2066 $
    -** $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#include "libqhullcpp/Coordinates.h"
    -
    -#include "libqhullcpp/functionObjects.h"
    -#include "libqhullcpp/QhullError.h"
    -
    -#include 
    -#include 
    -#include 
    -
    -#ifdef _MSC_VER  // Microsoft Visual C++ -- warning level 4
    -#endif
    -
    -namespace orgQhull {
    -
    -#//! Coordinates -- vector of coordT (normally double)
    -
    -#//!\name Constructor
    -
    -#//!\name Element access
    -
    -// Inefficient without result-value-optimization or implicitly shared object
    -Coordinates Coordinates::
    -mid(countT idx, countT length) const
    -{
    -    countT newLength= length;
    -    if(length<0 || idx+length > count()){
    -        newLength= count()-idx;
    -    }
    -    Coordinates result;
    -    if(newLength>0){
    -        std::copy(begin()+idx, begin()+(idx+newLength), std::back_inserter(result));
    -    }
    -    return result;
    -}//mid
    -
    -coordT Coordinates::
    -value(countT idx, const coordT &defaultValue) const
    -{
    -    return ((idx < 0 || idx >= count()) ? defaultValue : (*this)[idx]);
    -}//value
    -
    -#//!\name GetSet
    -
    -Coordinates Coordinates::
    -operator+(const Coordinates &other) const
    -{
    -    Coordinates result(*this);
    -    std::copy(other.begin(), other.end(), std::back_inserter(result));
    -    return result;
    -}//operator+
    -
    -Coordinates & Coordinates::
    -operator+=(const Coordinates &other)
    -{
    -    if(&other==this){
    -        Coordinates clone(other);
    -        std::copy(clone.begin(), clone.end(), std::back_inserter(*this));
    -    }else{
    -        std::copy(other.begin(), other.end(), std::back_inserter(*this));
    -    }
    -    return *this;
    -}//operator+=
    -
    -#//!\name Read-write
    -
    -void Coordinates::
    -append(int pointDimension, coordT *c)
    -{
    -    if(c){
    -        coordT *p= c;
    -        for(int i= 0; i(i-begin())); // WARN64 coordinate index
    -            }
    -            ++i;
    -        }
    -    }
    -    return -1;
    -}//indexOf
    -
    -countT Coordinates::
    -lastIndexOf(const coordT &t, countT from) const
    -{
    -    if(from<0){
    -        from += count();
    -    }else if(from>=count()){
    -        from= count()-1;
    -    }
    -    if(from>=0){
    -        const_iterator i= begin()+from+1;
    -        while(i-- != constBegin()){
    -            if(*i==t){
    -                return (static_cast(i-begin())); // WARN64 coordinate index
    -            }
    -        }
    -    }
    -    return -1;
    -}//lastIndexOf
    -
    -void Coordinates::
    -removeAll(const coordT &t)
    -{
    -    MutableCoordinatesIterator i(*this);
    -    while(i.findNext(t)){
    -        i.remove();
    -    }
    -}//removeAll
    -
    -}//namespace orgQhull
    -
    -#//!\name Global functions
    -
    -using std::endl;
    -using std::istream;
    -using std::ostream;
    -using std::string;
    -using std::ws;
    -using orgQhull::Coordinates;
    -
    -ostream &
    -operator<<(ostream &os, const Coordinates &cs)
    -{
    -    Coordinates::const_iterator c= cs.begin();
    -    for(countT i=cs.count(); i--; ){
    -        os << *c++ << " ";
    -    }
    -    return os;
    -}//operator<<
    -
    diff --git a/src/qhull/src/libqhullcpp/Coordinates.h b/src/qhull/src/libqhullcpp/Coordinates.h
    deleted file mode 100644
    index df8bd113861..00000000000
    --- a/src/qhull/src/libqhullcpp/Coordinates.h
    +++ /dev/null
    @@ -1,303 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/Coordinates.h#6 $$Change: 2079 $
    -** $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#ifndef QHCOORDINATES_H
    -#define QHCOORDINATES_H
    -
    -#include "libqhull_r/qhull_ra.h"
    -#include "libqhullcpp/QhullError.h"
    -#include "libqhullcpp/QhullIterator.h"
    -
    -#include  // ptrdiff_t, size_t
    -#include 
    -// Requires STL vector class.  Can use with another vector class such as QList.
    -#include 
    -
    -namespace orgQhull {
    -
    -#//!\name Defined here
    -    //! An std::vector of point coordinates independent of dimension
    -    //! Used by PointCoordinates for RboxPoints and by Qhull for feasiblePoint
    -    //! A QhullPoint refers to previously allocated coordinates
    -    class Coordinates;
    -    class MutableCoordinatesIterator;
    -
    -class Coordinates {
    -
    -private:
    -#//!\name Fields
    -    std::vector coordinate_array;
    -
    -public:
    -#//!\name Subtypes
    -
    -    class const_iterator;
    -    class iterator;
    -    typedef iterator Iterator;
    -    typedef const_iterator ConstIterator;
    -
    -    typedef coordT              value_type;
    -    typedef const value_type   *const_pointer;
    -    typedef const value_type &  const_reference;
    -    typedef value_type *        pointer;
    -    typedef value_type &        reference;
    -    typedef ptrdiff_t           difference_type;
    -    typedef countT              size_type;
    -
    -#//!\name Construct
    -                        Coordinates() {};
    -    explicit            Coordinates(const std::vector &other) : coordinate_array(other) {}
    -                        Coordinates(const Coordinates &other) : coordinate_array(other.coordinate_array) {}
    -    Coordinates &       operator=(const Coordinates &other) { coordinate_array= other.coordinate_array; return *this; }
    -    Coordinates &       operator=(const std::vector &other) { coordinate_array= other; return *this; }
    -                        ~Coordinates() {}
    -
    -#//!\name Conversion
    -
    -#ifndef QHULL_NO_STL
    -    std::vector toStdVector() const { return coordinate_array; }
    -#endif //QHULL_NO_STL
    -#ifdef QHULL_USES_QT
    -    QList       toQList() const;
    -#endif //QHULL_USES_QT
    -
    -#//!\name GetSet
    -    countT              count() const { return static_cast(size()); }
    -    coordT *            data() { return isEmpty() ? 0 : &at(0); }
    -    const coordT *      data() const { return const_cast(isEmpty() ? 0 : &at(0)); }
    -    bool                isEmpty() const { return coordinate_array.empty(); }
    -    bool                operator==(const Coordinates &other) const  { return coordinate_array==other.coordinate_array; }
    -    bool                operator!=(const Coordinates &other) const  { return coordinate_array!=other.coordinate_array; }
    -    size_t              size() const { return coordinate_array.size(); }
    -
    -#//!\name Element access
    -    coordT &            at(countT idx) { return coordinate_array.at(idx); }
    -    const coordT &      at(countT idx) const { return coordinate_array.at(idx); }
    -    coordT &            back() { return coordinate_array.back(); }
    -    const coordT &      back() const { return coordinate_array.back(); }
    -    coordT &            first() { return front(); }
    -    const coordT &      first() const { return front(); }
    -    coordT &            front() { return coordinate_array.front(); }
    -    const coordT &      front() const { return coordinate_array.front(); }
    -    coordT &            last() { return back(); }
    -    const coordT &      last() const { return back(); }
    -    Coordinates         mid(countT idx, countT length= -1) const; //!<\todo countT -1 indicates
    -    coordT &            operator[](countT idx) { return coordinate_array.operator[](idx); }
    -    const coordT &      operator[](countT idx) const { return coordinate_array.operator[](idx); }
    -    coordT              value(countT idx, const coordT &defaultValue) const;
    -
    -#//!\name Iterator
    -    iterator            begin() { return iterator(coordinate_array.begin()); }
    -    const_iterator      begin() const { return const_iterator(coordinate_array.begin()); }
    -    const_iterator      constBegin() const { return begin(); }
    -    const_iterator      constEnd() const { return end(); }
    -    iterator            end() { return iterator(coordinate_array.end()); }
    -    const_iterator      end() const { return const_iterator(coordinate_array.end()); }
    -
    -#//!\name GetSet
    -    Coordinates         operator+(const Coordinates &other) const;
    -
    -#//!\name Modify
    -    void                append(int pointDimension, coordT *c);
    -    void                append(const coordT &c) { push_back(c); }
    -    void                clear() { coordinate_array.clear(); }
    -    iterator            erase(iterator idx) { return iterator(coordinate_array.erase(idx.base())); }
    -    iterator            erase(iterator beginIterator, iterator endIterator) { return iterator(coordinate_array.erase(beginIterator.base(), endIterator.base())); }
    -    void                insert(countT before, const coordT &c) { insert(begin()+before, c); }
    -    iterator            insert(iterator before, const coordT &c) { return iterator(coordinate_array.insert(before.base(), c)); }
    -    void                move(countT from, countT to) { insert(to, takeAt(from)); }
    -    Coordinates &       operator+=(const Coordinates &other);
    -    Coordinates &       operator+=(const coordT &c) { append(c); return *this; }
    -    Coordinates &       operator<<(const Coordinates &other) { return *this += other; }
    -    Coordinates &       operator<<(const coordT &c) { return *this += c; }
    -    void                pop_back() { coordinate_array.pop_back(); }
    -    void                pop_front() { removeFirst(); }
    -    void                prepend(const coordT &c) { insert(begin(), c); }
    -    void                push_back(const coordT &c) { coordinate_array.push_back(c); }
    -    void                push_front(const coordT &c) { insert(begin(), c); }
    -                        //removeAll below
    -    void                removeAt(countT idx) { erase(begin()+idx); }
    -    void                removeFirst() { erase(begin()); }
    -    void                removeLast() { erase(--end()); }
    -    void                replace(countT idx, const coordT &c) { (*this)[idx]= c; }
    -    void                reserve(countT i) { coordinate_array.reserve(i); }
    -    void                swap(countT idx, countT other);
    -    coordT              takeAt(countT idx);
    -    coordT              takeFirst() { return takeAt(0); }
    -    coordT              takeLast();
    -
    -#//!\name Search
    -    bool                contains(const coordT &t) const;
    -    countT              count(const coordT &t) const;
    -    countT              indexOf(const coordT &t, countT from = 0) const;
    -    countT              lastIndexOf(const coordT &t, countT from = -1) const;
    -    void                removeAll(const coordT &t);
    -
    -#//!\name Coordinates::iterator -- from QhullPoints, forwarding to coordinate_array
    -    // before const_iterator for conversion with comparison operators
    -    // Reviewed corelib/tools/qlist.h and corelib/tools/qvector.h w/o QT_STRICT_ITERATORS
    -    class iterator {
    -
    -    private:
    -        std::vector::iterator i;
    -        friend class const_iterator;
    -
    -    public:
    -        typedef std::random_access_iterator_tag  iterator_category;
    -        typedef coordT      value_type;
    -        typedef value_type *pointer;
    -        typedef value_type &reference;
    -        typedef ptrdiff_t   difference_type;
    -
    -                        iterator() {}
    -                        iterator(const iterator &other) { i= other.i; }
    -        explicit        iterator(const std::vector::iterator &vi) { i= vi; }
    -        iterator &      operator=(const iterator &other) { i= other.i; return *this; }
    -        std::vector::iterator &base() { return i; }
    -        coordT &        operator*() const { return *i; }
    -        // No operator->() when the base type is double
    -        coordT &        operator[](countT idx) const { return i[idx]; }
    -
    -        bool            operator==(const iterator &other) const { return i==other.i; }
    -        bool            operator!=(const iterator &other) const { return i!=other.i; }
    -        bool            operator<(const iterator &other) const { return i(const iterator &other) const { return i>other.i; }
    -        bool            operator>=(const iterator &other) const { return i>=other.i; }
    -              // reinterpret_cast to break circular dependency
    -        bool            operator==(const Coordinates::const_iterator &other) const { return *this==reinterpret_cast(other); }
    -        bool            operator!=(const Coordinates::const_iterator &other) const { return *this!=reinterpret_cast(other); }
    -        bool            operator<(const Coordinates::const_iterator &other) const { return *this(other); }
    -        bool            operator<=(const Coordinates::const_iterator &other) const { return *this<=reinterpret_cast(other); }
    -        bool            operator>(const Coordinates::const_iterator &other) const { return *this>reinterpret_cast(other); }
    -        bool            operator>=(const Coordinates::const_iterator &other) const { return *this>=reinterpret_cast(other); }
    -
    -        iterator &      operator++() { ++i; return *this; }
    -        iterator        operator++(int) { return iterator(i++); }
    -        iterator &      operator--() { --i; return *this; }
    -        iterator        operator--(int) { return iterator(i--); }
    -        iterator &      operator+=(countT idx) { i += idx; return *this; }
    -        iterator &      operator-=(countT idx) { i -= idx; return *this; }
    -        iterator        operator+(countT idx) const { return iterator(i+idx); }
    -        iterator        operator-(countT idx) const { return iterator(i-idx); }
    -        difference_type operator-(iterator other) const { return i-other.i; }
    -    };//Coordinates::iterator
    -
    -#//!\name Coordinates::const_iterator
    -    class const_iterator {
    -
    -    private:
    -        std::vector::const_iterator i;
    -
    -    public:
    -        typedef std::random_access_iterator_tag  iterator_category;
    -        typedef coordT            value_type;
    -        typedef const value_type *pointer;
    -        typedef const value_type &reference;
    -        typedef ptrdiff_t         difference_type;
    -
    -                        const_iterator() {}
    -                        const_iterator(const const_iterator &other) { i= other.i; }
    -                        const_iterator(const iterator &o) : i(o.i) {}
    -        explicit        const_iterator(const std::vector::const_iterator &vi) { i= vi; }
    -        const_iterator &operator=(const const_iterator &other) { i= other.i; return *this; }
    -        const coordT &  operator*() const { return *i; }
    -        // No operator->() when the base type is double
    -        const coordT &  operator[](countT idx) const { return i[idx]; }
    -
    -        bool            operator==(const const_iterator &other) const { return i==other.i; }
    -        bool            operator!=(const const_iterator &other) const { return i!=other.i; }
    -        bool            operator<(const const_iterator &other) const { return i(const const_iterator &other) const { return i>other.i; }
    -        bool            operator>=(const const_iterator &other) const { return i>=other.i; }
    -
    -        const_iterator & operator++() { ++i; return *this; } 
    -        const_iterator  operator++(int) { return const_iterator(i++); }
    -        const_iterator & operator--() { --i; return *this; }
    -        const_iterator  operator--(int) { return const_iterator(i--); }
    -        const_iterator & operator+=(countT idx) { i += idx; return *this; }
    -        const_iterator & operator-=(countT idx) { i -= idx; return *this; }
    -        const_iterator  operator+(countT idx) const { return const_iterator(i+idx); }
    -        const_iterator  operator-(countT idx) const { return const_iterator(i-idx); }
    -        difference_type operator-(const_iterator other) const { return i-other.i; }
    -    };//Coordinates::const_iterator
    -
    -};//Coordinates
    -
    -//class CoordinatesIterator
    -//QHULL_DECLARE_SEQUENTIAL_ITERATOR(Coordinates, coordT)
    -
    -class CoordinatesIterator
    -{
    -    typedef Coordinates::const_iterator const_iterator;
    -
    -private:
    -    const Coordinates * c;
    -    const_iterator      i;
    -
    -public:
    -                        CoordinatesIterator(const Coordinates &container): c(&container), i(c->constBegin()) {}
    -    CoordinatesIterator &operator=(const Coordinates &container) { c= &container; i= c->constBegin(); return *this; }
    -                        ~CoordinatesIterator() {}
    -
    -    bool                findNext(const coordT &t) { while (i != c->constEnd()) if(*i++ == t){ return true;} return false; }
    -    bool                findPrevious(const coordT &t) { while (i != c->constBegin())if (*(--i) == t){ return true;} return false;  }
    -    bool                hasNext() const { return i != c->constEnd(); }
    -    bool                hasPrevious() const { return i != c->constBegin(); }
    -    const coordT &      next() { return *i++; }
    -    const coordT &      previous() { return *--i; }
    -    const coordT &      peekNext() const { return *i; }
    -    const coordT &      peekPrevious() const { const_iterator p= i; return *--p; }
    -    void                toFront() { i= c->constBegin(); }
    -    void                toBack() { i= c->constEnd(); }
    -};//CoordinatesIterator
    -
    -//class MutableCoordinatesIterator
    -//QHULL_DECLARE_MUTABLE_SEQUENTIAL_ITERATOR(Coordinates, coordT)
    -class MutableCoordinatesIterator
    -{
    -    typedef Coordinates::iterator iterator;
    -    typedef Coordinates::const_iterator const_iterator;
    -
    -private:
    -    Coordinates *       c;
    -    iterator            i;
    -    iterator            n;
    -    bool                item_exists() const { return const_iterator(n) != c->constEnd(); }
    -
    -public:
    -                        MutableCoordinatesIterator(Coordinates &container) : c(&container) { i= c->begin(); n= c->end(); }
    -    MutableCoordinatesIterator &operator=(Coordinates &container) { c= &container; i= c->begin(); n= c->end(); return *this; }
    -                        ~MutableCoordinatesIterator() {}
    -
    -    bool                findNext(const coordT &t) { while(c->constEnd()!=const_iterator(n= i)){ if(*i++==t){ return true;}} return false; }
    -    bool                findPrevious(const coordT &t) { while(c->constBegin()!=const_iterator(i)){ if(*(n= --i)== t){ return true;}} n= c->end(); return false;  }
    -    bool                hasNext() const { return (c->constEnd()!=const_iterator(i)); }
    -    bool                hasPrevious() const { return (c->constBegin()!=const_iterator(i)); }
    -    void                insert(const coordT &t) { n= i= c->insert(i, t); ++i; }
    -    coordT &            next() { n= i++; return *n; }
    -    coordT &            peekNext() const { return *i; }
    -    coordT &            peekPrevious() const { iterator p= i; return *--p; }
    -    coordT &            previous() { n= --i; return *n; }
    -    void                remove() { if(c->constEnd()!=const_iterator(n)){ i= c->erase(n); n= c->end();} }
    -    void                setValue(const coordT &t) const { if(c->constEnd()!=const_iterator(n)){ *n= t;} }
    -    void                toFront() { i= c->begin(); n= c->end(); }
    -    void                toBack() { i= c->end(); n= i; }
    -    coordT &            value() { QHULL_ASSERT(item_exists()); return *n; }
    -    const coordT &      value() const { QHULL_ASSERT(item_exists()); return *n; }
    -};//MutableCoordinatesIterator
    -
    -
    -}//namespace orgQhull
    -
    -#//!\name Global
    -
    -std::ostream &operator<<(std::ostream &os, const orgQhull::Coordinates &c);
    -
    -#endif // QHCOORDINATES_H
    diff --git a/src/qhull/src/libqhullcpp/PointCoordinates.cpp b/src/qhull/src/libqhullcpp/PointCoordinates.cpp
    deleted file mode 100644
    index a5b71e901da..00000000000
    --- a/src/qhull/src/libqhullcpp/PointCoordinates.cpp
    +++ /dev/null
    @@ -1,348 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/PointCoordinates.cpp#3 $$Change: 2066 $
    -** $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#include "libqhullcpp/PointCoordinates.h"
    -
    -#include "libqhullcpp/QhullError.h"
    -#include "libqhullcpp/QhullPoint.h"
    -
    -#include 
    -#include 
    -
    -using std::istream;
    -using std::string;
    -using std::ws;
    -
    -#ifdef _MSC_VER  // Microsoft Visual C++ -- warning level 4
    -#pragma warning( disable : 4996)  // function was declared deprecated(strcpy, localtime, etc.)
    -#endif
    -
    -namespace orgQhull {
    -
    -#//! PointCoordinates -- vector of PointCoordinates
    -
    -#//!\name Constructors
    -
    -PointCoordinates::
    -PointCoordinates()
    -: QhullPoints()
    -, point_coordinates()
    -, describe_points()
    -{
    -}
    -
    -PointCoordinates::
    -PointCoordinates(const std::string &aComment)
    -: QhullPoints()
    -, point_coordinates()
    -, describe_points(aComment)
    -{
    -}
    -
    -PointCoordinates::
    -PointCoordinates(int pointDimension, const std::string &aComment)
    -: QhullPoints()
    -, point_coordinates()
    -, describe_points(aComment)
    -{
    -    setDimension(pointDimension);
    -}
    -
    -//! Qhull and QhullQh constructors are the same
    -PointCoordinates::
    -PointCoordinates(const Qhull &q)
    -: QhullPoints(q)
    -, point_coordinates()
    -, describe_points()
    -{
    -}
    -
    -PointCoordinates::
    -PointCoordinates(const Qhull &q, const std::string &aComment)
    -: QhullPoints(q)
    -, point_coordinates()
    -, describe_points(aComment)
    -{
    -}
    -
    -PointCoordinates::
    -PointCoordinates(const Qhull &q, int pointDimension, const std::string &aComment)
    -: QhullPoints(q)
    -, point_coordinates()
    -, describe_points(aComment)
    -{
    -    setDimension(pointDimension);
    -}
    -
    -PointCoordinates::
    -PointCoordinates(const Qhull &q, int pointDimension, const std::string &aComment, countT coordinatesCount, const coordT *c)
    -: QhullPoints(q)
    -, point_coordinates()
    -, describe_points(aComment)
    -{
    -    setDimension(pointDimension);
    -    append(coordinatesCount, c);
    -}
    -
    -PointCoordinates::
    -PointCoordinates(QhullQh *qqh)
    -: QhullPoints(qqh)
    -, point_coordinates()
    -, describe_points()
    -{
    -}
    -
    -PointCoordinates::
    -PointCoordinates(QhullQh *qqh, const std::string &aComment)
    -: QhullPoints(qqh)
    -, point_coordinates()
    -, describe_points(aComment)
    -{
    -}
    -
    -PointCoordinates::
    -PointCoordinates(QhullQh *qqh, int pointDimension, const std::string &aComment)
    -: QhullPoints(qqh)
    -, point_coordinates()
    -, describe_points(aComment)
    -{
    -    setDimension(pointDimension);
    -}
    -
    -PointCoordinates::
    -PointCoordinates(QhullQh *qqh, int pointDimension, const std::string &aComment, countT coordinatesCount, const coordT *c)
    -: QhullPoints(qqh)
    -, point_coordinates()
    -, describe_points(aComment)
    -{
    -    setDimension(pointDimension);
    -    append(coordinatesCount, c);
    -}
    -
    -PointCoordinates::
    -PointCoordinates(const PointCoordinates &other)
    -: QhullPoints(other)
    -, point_coordinates(other.point_coordinates)
    -, describe_points(other.describe_points)
    -{
    -    makeValid();  // Update point_first and point_end
    -}
    -
    -PointCoordinates & PointCoordinates::
    -operator=(const PointCoordinates &other)
    -{
    -    QhullPoints::operator=(other);
    -    point_coordinates= other.point_coordinates;
    -    describe_points= other.describe_points;
    -    makeValid(); // Update point_first and point_end
    -    return *this;
    -}//operator=
    -
    -PointCoordinates::
    -~PointCoordinates()
    -{ }
    -
    -#//!\name GetSet
    -
    -void PointCoordinates::
    -checkValid() const
    -{
    -    if(getCoordinates().data()!=data()
    -    || getCoordinates().count()!=coordinateCount()){
    -        throw QhullError(10060, "Qhull error: first point (%x) is not PointCoordinates.data() or count (%d) is not PointCoordinates.count (%d)", coordinateCount(), getCoordinates().count(), 0.0, data());
    -    }
    -}//checkValid
    -
    -void PointCoordinates::
    -setDimension(int i)
    -{
    -    if(i<0){
    -        throw QhullError(10062, "Qhull error: can not set PointCoordinates dimension to %d", i);
    -    }
    -    int currentDimension=QhullPoints::dimension();
    -    if(currentDimension!=0 && i!=currentDimension){
    -        throw QhullError(10063, "Qhull error: can not change PointCoordinates dimension (from %d to %d)", currentDimension, i);
    -    }
    -    QhullPoints::setDimension(i);
    -}//setDimension
    -
    -#//!\name Foreach
    -
    -Coordinates::ConstIterator PointCoordinates::
    -beginCoordinates(countT pointIndex) const
    -{
    -    return point_coordinates.begin()+indexOffset(pointIndex);
    -}
    -
    -Coordinates::Iterator PointCoordinates::
    -beginCoordinates(countT pointIndex)
    -{
    -    return point_coordinates.begin()+indexOffset(pointIndex);
    -}
    -
    -#//!\name Methods
    -
    -void PointCoordinates::
    -append(countT coordinatesCount, const coordT *c)
    -{
    -    if(coordinatesCount<=0){
    -        return;
    -    }
    -    if(includesCoordinates(c)){
    -        throw QhullError(10065, "Qhull error: can not append a subset of PointCoordinates to itself.  The coordinates for point %d may move.", indexOf(c, QhullError::NOthrow));
    -    }
    -    reserveCoordinates(coordinatesCount);
    -    std::copy(c, c+coordinatesCount, std::back_inserter(point_coordinates));
    -    makeValid();
    -}//append coordT
    -
    -void PointCoordinates::
    -append(const PointCoordinates &other)
    -{
    -    setDimension(other.dimension());
    -    append(other.coordinateCount(), other.data());
    -}//append PointCoordinates
    -
    -void PointCoordinates::
    -append(const QhullPoint &p)
    -{
    -    setDimension(p.dimension());
    -    append(p.dimension(), p.coordinates());
    -}//append QhullPoint
    -
    -void PointCoordinates::
    -appendComment(const std::string &s){
    -    if(char c= s[0] && describe_points.empty()){
    -        if(c=='-' || isdigit(c)){
    -            throw QhullError(10028, "Qhull argument error: comments can not start with a number or minus, %s", 0, 0, 0.0, s.c_str());
    -        }
    -    }
    -    describe_points += s;
    -}//appendComment
    -
    -//! Read PointCoordinates from istream.  First two numbers are dimension and count.  A non-digit starts a rboxCommand.
    -//! Overwrites describe_points.  See qh_readpoints [io.c]
    -void PointCoordinates::
    -appendPoints(istream &in)
    -{
    -    int inDimension;
    -    countT inCount;
    -    in >> ws >> inDimension >> ws;
    -    if(!in.good()){
    -        in.clear();
    -        string remainder;
    -        getline(in, remainder);
    -        throw QhullError(10005, "Qhull error: input did not start with dimension or count -- %s", 0, 0, 0, remainder.c_str());
    -    }
    -    char c= (char)in.peek();
    -    if(c!='-' && !isdigit(c)){         // Comments start with a non-digit
    -        getline(in, describe_points);
    -        in >> ws;
    -    }
    -    in >> inCount >> ws;
    -    if(!in.good()){
    -        in.clear();
    -        string remainder;
    -        getline(in, remainder);
    -        throw QhullError(10009, "Qhull error: input did not start with dimension and count -- %d %s", inDimension, 0, 0, remainder.c_str());
    -    }
    -    c= (char)in.peek();
    -    if(c!='-' && !isdigit(c)){         // Comments start with a non-digit
    -        getline(in, describe_points);
    -        in >> ws;
    -    }
    -    if(inCount> p >> ws;
    -        if(in.fail()){
    -            in.clear();
    -            string remainder;
    -            getline(in, remainder);
    -            throw QhullError(10008, "Qhull error: failed to read coordinate %d  of point %d\n   %s", coordinatesCount % inDimension, coordinatesCount/inDimension, 0, remainder.c_str());
    -        }else{
    -            point_coordinates.push_back(p);
    -            coordinatesCount++;
    -        }
    -    }
    -    if(coordinatesCount != inCount*inDimension){
    -        if(coordinatesCount%inDimension==0){
    -            throw QhullError(10006, "Qhull error: expected %d %d-d PointCoordinates but read %i PointCoordinates", int(inCount), inDimension, 0.0, int(coordinatesCount/inDimension));
    -        }else{
    -            throw QhullError(10012, "Qhull error: expected %d %d-d PointCoordinates but read %i PointCoordinates plus %f extra coordinates", inCount, inDimension, float(coordinatesCount%inDimension), coordinatesCount/inDimension);
    -        }
    -    }
    -    makeValid();
    -}//appendPoints istream
    -
    -PointCoordinates PointCoordinates::
    -operator+(const PointCoordinates &other) const
    -{
    -    PointCoordinates pc= *this;
    -    pc << other;
    -    return pc;
    -}//operator+
    -
    -void PointCoordinates::
    -reserveCoordinates(countT newCoordinates)
    -{
    -    // vector::reserve is not const
    -    point_coordinates.reserve((countT)point_coordinates.size()+newCoordinates); // WARN64
    -    makeValid();
    -}//reserveCoordinates
    -
    -#//!\name Helpers
    -
    -countT PointCoordinates::
    -indexOffset(countT i) const {
    -    countT n= i*dimension();
    -    countT coordinatesCount= point_coordinates.count();
    -    if(i<0 || n>coordinatesCount){
    -        throw QhullError(10061, "Qhull error: point_coordinates is too short (%d) for point %d", coordinatesCount, i);
    -    }
    -    return n;
    -}
    -
    -}//namespace orgQhull
    -
    -#//!\name Global functions
    -
    -using std::endl;
    -using std::ostream;
    -
    -using orgQhull::Coordinates;
    -using orgQhull::PointCoordinates;
    -
    -ostream&
    -operator<<(ostream &os, const PointCoordinates &p)
    -{
    -    p.checkValid();
    -    countT count= p.count();
    -    int dimension= p.dimension();
    -    string comment= p.comment();
    -    if(comment.empty()){
    -        os << dimension << endl;
    -    }else{
    -        os << dimension << " " << comment << endl;
    -    }
    -    os << count << endl;
    -    Coordinates::ConstIterator c= p.beginCoordinates();
    -    for(countT i=0; i
    -#include 
    -
    -#ifndef QHULL_NO_STL
    -#include 
    -#endif
    -
    -namespace orgQhull {
    -
    -#//!\name Defined here
    -    //! QhullPoints with Coordinates and description
    -    //! Inherited by RboxPoints
    -    class PointCoordinates;
    -
    -class PointCoordinates : public QhullPoints {
    -
    -private:
    -#//!\name Fields
    -    Coordinates         point_coordinates;      //! std::vector of point coordinates
    -                                                //! may have extraCoordinates()
    -    std::string         describe_points;          //! Comment describing PointCoordinates
    -
    -public:
    -#//!\name Construct
    -    //! QhullPoint, PointCoordinates, and QhullPoints have similar constructors
    -    //! If Qhull/QhullQh is not initialized, then dimension()==0                        PointCoordinates();
    -                        PointCoordinates();
    -    explicit            PointCoordinates(const std::string &aComment);
    -                        PointCoordinates(int pointDimension, const std::string &aComment);
    -                        //! Qhull/QhullQh used for dimension() and QhullPoint equality
    -    explicit            PointCoordinates(const Qhull &q);
    -                        PointCoordinates(const Qhull &q, const std::string &aComment);
    -                        PointCoordinates(const Qhull &q, int pointDimension, const std::string &aComment);
    -                        PointCoordinates(const Qhull &q, int pointDimension, const std::string &aComment, countT coordinatesCount, const coordT *c); // may be invalid
    -                        //! Use append() and appendPoints() for Coordinates and vector
    -    explicit            PointCoordinates(QhullQh *qqh);
    -                        PointCoordinates(QhullQh *qqh, const std::string &aComment);
    -                        PointCoordinates(QhullQh *qqh, int pointDimension, const std::string &aComment);
    -                        PointCoordinates(QhullQh *qqh, int pointDimension, const std::string &aComment, countT coordinatesCount, const coordT *c); // may be invalid
    -                        //! Use append() and appendPoints() for Coordinates and vector
    -                        PointCoordinates(const PointCoordinates &other);
    -    PointCoordinates &  operator=(const PointCoordinates &other);
    -                        ~PointCoordinates();
    -
    -#//!\name Convert
    -    //! QhullPoints coordinates, constData, data, count, size
    -#ifndef QHULL_NO_STL
    -    void                append(const std::vector &otherCoordinates) { if(!otherCoordinates.empty()){ append((int)otherCoordinates.size(), &otherCoordinates[0]); } }
    -    std::vector toStdVector() const { return point_coordinates.toStdVector(); }
    -#endif //QHULL_NO_STL
    -#ifdef QHULL_USES_QT
    -    void                append(const QList &pointCoordinates) { if(!pointCoordinates.isEmpty()){ append(pointCoordinates.count(), &pointCoordinates[0]); } }
    -    QList       toQList() const { return point_coordinates.toQList(); }
    -#endif //QHULL_USES_QT
    -
    -#//!\name GetSet
    -    //! See QhullPoints for coordinates, coordinateCount, dimension, empty, isEmpty, ==, !=
    -    void                checkValid() const;
    -    std::string         comment() const { return describe_points; }
    -    void                makeValid() { defineAs(point_coordinates.count(), point_coordinates.data()); }
    -    const Coordinates & getCoordinates() const { return point_coordinates; }
    -    void                setComment(const std::string &s) { describe_points= s; }
    -    void                setDimension(int i);
    -
    -private:
    -    //! disable QhullPoints.defineAs()
    -    void                defineAs(countT coordinatesCount, coordT *c) { QhullPoints::defineAs(coordinatesCount, c); }
    -public:
    -
    -#//!\name ElementAccess
    -    //! See QhullPoints for at, back, first, front, last, mid, [], value
    -
    -#//!\name Foreach
    -    //! See QhullPoints for begin, constBegin, end
    -    Coordinates::ConstIterator  beginCoordinates() const { return point_coordinates.begin(); }
    -    Coordinates::Iterator       beginCoordinates() { return point_coordinates.begin(); }
    -    Coordinates::ConstIterator  beginCoordinates(countT pointIndex) const;
    -    Coordinates::Iterator       beginCoordinates(countT pointIndex);
    -    Coordinates::ConstIterator  endCoordinates() const { return point_coordinates.end(); }
    -    Coordinates::Iterator       endCoordinates() { return point_coordinates.end(); }
    -
    -#//!\name Search
    -    //! See QhullPoints for contains, count, indexOf, lastIndexOf
    -
    -#//!\name GetSet
    -    PointCoordinates    operator+(const PointCoordinates &other) const;
    -
    -#//!\name Modify
    -    //FIXUP QH11001: Add clear() and other modify operators from Coordinates.h.  Include QhullPoint::operator=()
    -    void                append(countT coordinatesCount, const coordT *c);  //! Dimension previously defined
    -    void                append(const coordT &c) { append(1, &c); } //! Dimension previously defined
    -    void                append(const QhullPoint &p);
    -    //! See convert for std::vector and QList
    -    void                append(const Coordinates &c) { append(c.count(), c.data()); }
    -    void                append(const PointCoordinates &other);
    -    void                appendComment(const std::string &s);
    -    void                appendPoints(std::istream &in);
    -    PointCoordinates &  operator+=(const PointCoordinates &other) { append(other); return *this; }
    -    PointCoordinates &  operator+=(const coordT &c) { append(c); return *this; }
    -    PointCoordinates &  operator+=(const QhullPoint &p) { append(p); return *this; }
    -    PointCoordinates &  operator<<(const PointCoordinates &other) { return *this += other; }
    -    PointCoordinates &  operator<<(const coordT &c) { return *this += c; }
    -    PointCoordinates &  operator<<(const QhullPoint &p) { return *this += p; }
    -    // reserve() is non-const
    -    void                reserveCoordinates(countT newCoordinates);
    -
    -#//!\name Helpers
    -private:
    -    int                 indexOffset(int i) const;
    -
    -};//PointCoordinates
    -
    -// No references to QhullPoint.  Prevents use of QHULL_DECLARE_SEQUENTIAL_ITERATOR(PointCoordinates, QhullPoint)
    -class PointCoordinatesIterator
    -{
    -    typedef PointCoordinates::const_iterator const_iterator;
    -
    -private:
    -    const PointCoordinates *c;
    -    const_iterator      i;
    -
    -public:
    -                        PointCoordinatesIterator(const PointCoordinates &container) : c(&container), i(c->constBegin()) {}
    -                        PointCoordinatesIterator &operator=(const PointCoordinates &container) { c = &container; i = c->constBegin(); return *this; }
    -
    -    void                toFront() { i = c->constBegin(); }
    -    void                toBack() { i = c->constEnd(); }
    -    bool                hasNext() const { return i != c->constEnd(); }
    -    const QhullPoint    next() { return *i++; }
    -    const QhullPoint    peekNext() const { return *i; }
    -    bool                hasPrevious() const { return i != c->constBegin(); }
    -    const QhullPoint    previous() { return *--i; }
    -    const QhullPoint    peekPrevious() const { const_iterator p = i; return *--p; }
    -    bool                findNext(const QhullPoint &t) { while(i != c->constEnd()){ if (*i++ == t) return true;} return false; }
    -    bool                findPrevious(const QhullPoint &t) { while(i != c->constBegin()){ if (*(--i) == t) return true;} return false;  }
    -};//CoordinatesIterator
    -
    -// FIXUP QH11002:  Add MutablePointCoordinatesIterator after adding modify operators
    -\
    -}//namespace orgQhull
    -
    -#//!\name Global
    -
    -std::ostream &          operator<<(std::ostream &os, const orgQhull::PointCoordinates &p);
    -
    -#endif // QHPOINTCOORDINATES_H
    diff --git a/src/qhull/src/libqhullcpp/Qhull.cpp b/src/qhull/src/libqhullcpp/Qhull.cpp
    deleted file mode 100644
    index 7124a15cdcb..00000000000
    --- a/src/qhull/src/libqhullcpp/Qhull.cpp
    +++ /dev/null
    @@ -1,352 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/Qhull.cpp#4 $$Change: 2078 $
    -** $DateTime: 2016/02/07 16:53:56 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#//! Qhull -- invoke qhull from C++
    -#//! Compile libqhull_r and Qhull together due to use of setjmp/longjmp()
    -
    -#include "libqhullcpp/Qhull.h"
    -
    -#include "libqhullcpp/QhullError.h"
    -#include "libqhullcpp/RboxPoints.h"
    -#include "libqhullcpp/QhullQh.h"
    -#include "libqhullcpp/QhullFacet.h"
    -#include "libqhullcpp/QhullFacetList.h"
    -
    -#include 
    -
    -using std::cerr;
    -using std::string;
    -using std::vector;
    -using std::ostream;
    -
    -#ifdef _MSC_VER  // Microsoft Visual C++ -- warning level 4
    -#pragma warning( disable : 4611)  // interaction between '_setjmp' and C++ object destruction is non-portable
    -#pragma warning( disable : 4996)  // function was declared deprecated(strcpy, localtime, etc.)
    -#endif
    -
    -namespace orgQhull {
    -
    -#//!\name Global variables
    -
    -const char s_unsupported_options[]=" Fd TI ";
    -const char s_not_output_options[]= " Fd TI A C d E H P Qb QbB Qbb Qc Qf Qg Qi Qm QJ Qr QR Qs Qt Qv Qx Qz Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 R Tc TC TM TP TR Tv TV TW U v V W ";
    -
    -#//!\name Constructor, destructor, etc.
    -Qhull::
    -Qhull()
    -: qh_qh(0)
    -, origin_point()
    -, run_called(false)
    -, feasible_point()
    -{
    -    allocateQhullQh();
    -}//Qhull
    -
    -//! Invokes Qhull on rboxPoints
    -//! Same as runQhull()
    -//! For rbox commands, see http://www.qhull.org/html/rbox.htm or html/rbox.htm
    -//! For qhull commands, see http://www.qhull.org/html/qhull.htm or html/qhull.htm
    -Qhull::
    -Qhull(const RboxPoints &rboxPoints, const char *qhullCommand2)
    -: qh_qh(0)
    -, origin_point()
    -, run_called(false)
    -, feasible_point()
    -{
    -    allocateQhullQh();
    -    runQhull(rboxPoints, qhullCommand2);
    -}//Qhull rbox
    -
    -//! Invokes Qhull on a set of input points
    -//! Same as runQhull()
    -//! For qhull commands, see http://www.qhull.org/html/qhull.htm or html/qhull.htm
    -Qhull::
    -Qhull(const char *inputComment2, int pointDimension, int pointCount, const realT *pointCoordinates, const char *qhullCommand2)
    -: qh_qh(0)
    -, origin_point()
    -, run_called(false)
    -, feasible_point()
    -{
    -    allocateQhullQh();
    -    runQhull(inputComment2, pointDimension, pointCount, pointCoordinates, qhullCommand2);
    -}//Qhull points
    -
    -void Qhull::
    -allocateQhullQh()
    -{
    -  QHULL_LIB_CHECK /* Check for compatible library */
    -
    -    qh_qh= new QhullQh;
    -    void *p= qh_qh;
    -    void *p2= static_cast(qh_qh);
    -    char *s= static_cast(p);
    -    char *s2= static_cast(p2);
    -    if(s!=s2){
    -        throw QhullError(10074, "Qhull error: QhullQh at a different address than base type QhT (%d bytes).  Please report compiler to qhull.org", int(s2-s));
    -    }
    -}//allocateQhullQh
    -
    -Qhull::
    -~Qhull() throw()
    -{
    -    // Except for cerr, does not throw errors
    -    if(qh_qh->hasQhullMessage()){
    -        cerr<< "\nQhull output at end\n"; //FIXUP QH11005: where should error and log messages go on ~Qhull?
    -        cerr<< qh_qh->qhullMessage();
    -        qh_qh->clearQhullMessage();
    -    }
    -    delete qh_qh;
    -    qh_qh= 0;
    -}//~Qhull
    -
    -#//!\name GetSet
    -
    -void Qhull::
    -checkIfQhullInitialized()
    -{
    -    if(!initialized()){ // qh_initqhull_buffers() not called
    -        throw QhullError(10023, "Qhull error: checkIfQhullInitialized failed.  Call runQhull() first.");
    -    }
    -}//checkIfQhullInitialized
    -
    -//! Return feasiblePoint for halfspace intersection
    -//! If called before runQhull(), then it returns the value from setFeasiblePoint.  qh.feasible_string overrides this value if it is defined.
    -Coordinates Qhull::
    -feasiblePoint() const
    -{
    -    Coordinates result;
    -    if(qh_qh->feasible_point){
    -        result.append(qh_qh->hull_dim, qh_qh->feasible_point);
    -    }else{
    -        result= feasible_point;
    -    }
    -    return result;
    -}//feasiblePoint
    -
    -//! Return origin point for qh.input_dim
    -QhullPoint Qhull::
    -inputOrigin()
    -{
    -    QhullPoint result= origin();
    -    result.setDimension(qh_qh->input_dim);
    -    return result;
    -}//inputOrigin
    -
    -#//!\name GetValue
    -
    -double Qhull::
    -area(){
    -    checkIfQhullInitialized();
    -    if(!qh_qh->hasAreaVolume){
    -        QH_TRY_(qh_qh){ // no object creation -- destructors skipped on longjmp()
    -            qh_getarea(qh_qh, qh_qh->facet_list);
    -        }
    -        qh_qh->NOerrexit= true;
    -        qh_qh->maybeThrowQhullMessage(QH_TRY_status);
    -    }
    -    return qh_qh->totarea;
    -}//area
    -
    -double Qhull::
    -volume(){
    -    checkIfQhullInitialized();
    -    if(!qh_qh->hasAreaVolume){
    -        QH_TRY_(qh_qh){ // no object creation -- destructors skipped on longjmp()
    -            qh_getarea(qh_qh, qh_qh->facet_list);
    -        }
    -        qh_qh->NOerrexit= true;
    -        qh_qh->maybeThrowQhullMessage(QH_TRY_status);
    -    }
    -    return qh_qh->totvol;
    -}//volume
    -
    -#//!\name Foreach
    -
    -//! Define QhullVertex::neighborFacets().
    -//! Automatically called if merging facets or computing the Voronoi diagram.
    -//! Noop if called multiple times.
    -void Qhull::
    -defineVertexNeighborFacets(){
    -    checkIfQhullInitialized();
    -    if(!qh_qh->hasAreaVolume){
    -        QH_TRY_(qh_qh){ // no object creation -- destructors skipped on longjmp()
    -            qh_vertexneighbors(qh_qh);
    -        }
    -        qh_qh->NOerrexit= true;
    -        qh_qh->maybeThrowQhullMessage(QH_TRY_status);
    -    }
    -}//defineVertexNeighborFacets
    -
    -QhullFacetList Qhull::
    -facetList() const{
    -    return QhullFacetList(beginFacet(), endFacet());
    -}//facetList
    -
    -QhullPoints Qhull::
    -points() const
    -{
    -    return QhullPoints(qh_qh, qh_qh->hull_dim, qh_qh->num_points*qh_qh->hull_dim, qh_qh->first_point);
    -}//points
    -
    -QhullPointSet Qhull::
    -otherPoints() const
    -{
    -    return QhullPointSet(qh_qh, qh_qh->other_points);
    -}//otherPoints
    -
    -//! Return vertices of the convex hull.
    -QhullVertexList Qhull::
    -vertexList() const{
    -    return QhullVertexList(beginVertex(), endVertex());
    -}//vertexList
    -
    -#//!\name Methods
    -
    -void Qhull::
    -outputQhull()
    -{
    -    checkIfQhullInitialized();
    -    QH_TRY_(qh_qh){ // no object creation -- destructors skipped on longjmp()
    -        qh_produce_output2(qh_qh);
    -    }
    -    qh_qh->NOerrexit= true;
    -    qh_qh->maybeThrowQhullMessage(QH_TRY_status);
    -}//outputQhull
    -
    -void Qhull::
    -outputQhull(const char *outputflags)
    -{
    -    checkIfQhullInitialized();
    -    string cmd(" "); // qh_checkflags skips first word
    -    cmd += outputflags;
    -    char *command= const_cast(cmd.c_str());
    -    QH_TRY_(qh_qh){ // no object creation -- destructors skipped on longjmp()
    -        qh_clear_outputflags(qh_qh);
    -        char *s = qh_qh->qhull_command + strlen(qh_qh->qhull_command) + 1; //space
    -        strncat(qh_qh->qhull_command, command, sizeof(qh_qh->qhull_command)-strlen(qh_qh->qhull_command)-1);
    -        qh_checkflags(qh_qh, command, const_cast(s_not_output_options));
    -        qh_initflags(qh_qh, s);
    -        qh_initqhull_outputflags(qh_qh);
    -        if(qh_qh->KEEPminArea < REALmax/2
    -           || (0 != qh_qh->KEEParea + qh_qh->KEEPmerge + qh_qh->GOODvertex
    -                    + qh_qh->GOODthreshold + qh_qh->GOODpoint + qh_qh->SPLITthresholds)){
    -            facetT *facet;
    -            qh_qh->ONLYgood= False;
    -            FORALLfacet_(qh_qh->facet_list) {
    -                facet->good= True;
    -            }
    -            qh_prepare_output(qh_qh);
    -        }
    -        qh_produce_output2(qh_qh);
    -        if(qh_qh->VERIFYoutput && !qh_qh->STOPpoint && !qh_qh->STOPcone){
    -            qh_check_points(qh_qh);
    -        }
    -    }
    -    qh_qh->NOerrexit= true;
    -    qh_qh->maybeThrowQhullMessage(QH_TRY_status);
    -}//outputQhull
    -
    -//! For qhull commands, see http://www.qhull.org/html/qhull.htm or html/qhull.htm
    -void Qhull::
    -runQhull(const RboxPoints &rboxPoints, const char *qhullCommand2)
    -{
    -    runQhull(rboxPoints.comment().c_str(), rboxPoints.dimension(), rboxPoints.count(), &*rboxPoints.coordinates(), qhullCommand2);
    -}//runQhull, RboxPoints
    -
    -//! pointCoordinates is a array of points, input sites ('d' or 'v'), or halfspaces with offset last ('H')
    -//! Derived from qh_new_qhull [user.c]
    -//! For rbox commands, see http://www.qhull.org/html/rbox.htm or html/rbox.htm
    -//! For qhull commands, see http://www.qhull.org/html/qhull.htm or html/qhull.htm
    -void Qhull::
    -runQhull(const char *inputComment, int pointDimension, int pointCount, const realT *pointCoordinates, const char *qhullCommand)
    -{
    -  /* gcc may issue a "might be clobbered" warning for pointDimension and pointCoordinates [-Wclobbered].
    -     These parameters are not referenced after a longjmp() and hence not clobbered.
    -     See http://stackoverflow.com/questions/7721854/what-sense-do-these-clobbered-variable-warnings-make */
    -    if(run_called){
    -        throw QhullError(10027, "Qhull error: runQhull called twice.  Only one call allowed.");
    -    }
    -    run_called= true;
    -    string s("qhull ");
    -    s += qhullCommand;
    -    char *command= const_cast(s.c_str());
    -    /************* Expansion of QH_TRY_ for debugging
    -    int QH_TRY_status;
    -    if(qh_qh->NOerrexit){
    -        qh_qh->NOerrexit= False;
    -        QH_TRY_status= setjmp(qh_qh->errexit);
    -    }else{
    -        QH_TRY_status= QH_TRY_ERROR;
    -    }
    -    if(!QH_TRY_status){
    -    *************/
    -    QH_TRY_(qh_qh){ // no object creation -- destructors are skipped on longjmp()
    -        qh_checkflags(qh_qh, command, const_cast(s_unsupported_options));
    -        qh_initflags(qh_qh, command);
    -        *qh_qh->rbox_command= '\0';
    -        strncat( qh_qh->rbox_command, inputComment, sizeof(qh_qh->rbox_command)-1);
    -        if(qh_qh->DELAUNAY){
    -            qh_qh->PROJECTdelaunay= True;   // qh_init_B() calls qh_projectinput()
    -        }
    -        pointT *newPoints= const_cast(pointCoordinates);
    -        int newDimension= pointDimension;
    -        int newIsMalloc= False;
    -        if(qh_qh->HALFspace){
    -            --newDimension;
    -            initializeFeasiblePoint(newDimension);
    -            newPoints= qh_sethalfspace_all(qh_qh, pointDimension, pointCount, newPoints, qh_qh->feasible_point);
    -            newIsMalloc= True;
    -        }
    -        qh_init_B(qh_qh, newPoints, pointCount, newDimension, newIsMalloc);
    -        qh_qhull(qh_qh);
    -        qh_check_output(qh_qh);
    -        qh_prepare_output(qh_qh);
    -        if(qh_qh->VERIFYoutput && !qh_qh->STOPpoint && !qh_qh->STOPcone){
    -            qh_check_points(qh_qh);
    -        }
    -    }
    -    qh_qh->NOerrexit= true;
    -    for(int k= qh_qh->hull_dim; k--; ){  // Do not move into QH_TRY block.  It may throw an error
    -        origin_point << 0.0;
    -    }
    -    qh_qh->maybeThrowQhullMessage(QH_TRY_status);
    -}//runQhull
    -
    -#//!\name Helpers -- be careful of allocating C++ objects due to setjmp/longjmp() error handling by qh_... routines
    -
    -//! initialize qh.feasible_point for half-space intersection
    -//! Sets from qh.feasible_string if available, otherwise from Qhull::feasible_point
    -//! called only once from runQhull(), otherwise it leaks memory (the same as qh_setFeasible)
    -void Qhull::
    -initializeFeasiblePoint(int hulldim)
    -{
    -    if(qh_qh->feasible_string){
    -        qh_setfeasible(qh_qh, hulldim);
    -    }else{
    -        if(feasible_point.isEmpty()){
    -            qh_fprintf(qh_qh, qh_qh->ferr, 6209, "qhull error: missing feasible point for halfspace intersection.  Use option 'Hn,n' or Qhull::setFeasiblePoint before runQhull()\n");
    -            qh_errexit(qh_qh, qh_ERRmem, NULL, NULL);
    -        }
    -        if(feasible_point.size()!=(size_t)hulldim){
    -            qh_fprintf(qh_qh, qh_qh->ferr, 6210, "qhull error: dimension of feasiblePoint should be %d.  It is %u", hulldim, feasible_point.size());
    -            qh_errexit(qh_qh, qh_ERRmem, NULL, NULL);
    -        }
    -        if (!(qh_qh->feasible_point= (coordT*)qh_malloc(hulldim * sizeof(coordT)))) {
    -            qh_fprintf(qh_qh, qh_qh->ferr, 6202, "qhull error: insufficient memory for feasible point\n");
    -            qh_errexit(qh_qh, qh_ERRmem, NULL, NULL);
    -        }
    -        coordT *t= qh_qh->feasible_point;
    -        // No qh_... routines after here -- longjmp() ignores destructor
    -        for(Coordinates::ConstIterator p=feasible_point.begin(); p.  It could be rewritten for another vector class such as QList
    -   #define QHULL_USES_QT
    -      Supply conversions to QT
    -      qhulltest requires QT.  It is defined in RoadTest.h
    -
    -  #define QHULL_ASSERT
    -      Defined by QhullError.h
    -      It invokes assert()
    -*/
    -
    -#//!\name Used here
    -    class QhullFacetList;
    -    class QhullPoints;
    -    class QhullQh;
    -    class RboxPoints;
    -
    -#//!\name Defined here
    -    class Qhull;
    -
    -//! Interface to Qhull from C++
    -class Qhull {
    -
    -private:
    -#//!\name Members and friends
    -    QhullQh *           qh_qh;          //! qhT for this instance
    -    Coordinates         origin_point;   //! origin for qh_qh->hull_dim.  Set by runQhull()
    -    bool                run_called;     //! True at start of runQhull.  Errors if call again.
    -    Coordinates         feasible_point;  //! feasible point for half-space intersection (alternative to qh.feasible_string for qh.feasible_point)
    -
    -public:
    -#//!\name Constructors
    -                        Qhull();      //!< call runQhull() next
    -                        Qhull(const RboxPoints &rboxPoints, const char *qhullCommand2);
    -                        Qhull(const char *inputComment2, int pointDimension, int pointCount, const realT *pointCoordinates, const char *qhullCommand2);
    -                        ~Qhull() throw();
    -private:                //! Disable copy constructor and assignment.  Qhull owns QhullQh.
    -                        Qhull(const Qhull &);
    -    Qhull &             operator=(const Qhull &);
    -
    -private:
    -    void                allocateQhullQh();
    -
    -public:
    -
    -#//!\name GetSet
    -    void                checkIfQhullInitialized();
    -    int                 dimension() const { return qh_qh->input_dim; } //!< Dimension of input and result
    -    void                disableOutputStream() { qh_qh->disableOutputStream(); }
    -    void                enableOutputStream() { qh_qh->enableOutputStream(); }
    -    countT              facetCount() const { return qh_qh->num_facets; }
    -    Coordinates         feasiblePoint() const; 
    -    int                 hullDimension() const { return qh_qh->hull_dim; } //!< Dimension of the computed hull
    -    bool                hasOutputStream() const { return qh_qh->hasOutputStream(); }
    -    bool                initialized() const { return (qh_qh->hull_dim>0); }
    -    const char *        inputComment() const { return qh_qh->rbox_command; }
    -    QhullPoint          inputOrigin();
    -                        //! non-const due to QhullPoint
    -    QhullPoint          origin() { QHULL_ASSERT(initialized()); return QhullPoint(qh_qh, origin_point.data()); }
    -    QhullQh *           qh() const { return qh_qh; };
    -    const char *        qhullCommand() const { return qh_qh->qhull_command; }
    -    const char *        rboxCommand() const { return qh_qh->rbox_command; }
    -    int                 rotateRandom() const { return qh_qh->ROTATErandom; } //!< Return QRn for repeating QR0 runs
    -    void                setFeasiblePoint(const Coordinates &c) { feasible_point= c; } //!< Sets qh.feasible_point via initializeFeasiblePoint
    -    countT              vertexCount() const { return qh_qh->num_vertices; }
    -
    -#//!\name Delegated to QhullQh
    -    double              angleEpsilon() const { return qh_qh->angleEpsilon(); } //!< Epsilon for hyperplane angle equality
    -    void                appendQhullMessage(const std::string &s) { qh_qh->appendQhullMessage(s); }
    -    void                clearQhullMessage() { qh_qh->clearQhullMessage(); }
    -    double              distanceEpsilon() const { return qh_qh->distanceEpsilon(); } //!< Epsilon for distance to hyperplane
    -    double              factorEpsilon() const { return qh_qh->factorEpsilon(); }  //!< Factor for angleEpsilon and distanceEpsilon
    -    std::string         qhullMessage() const { return qh_qh->qhullMessage(); }
    -    bool                hasQhullMessage() const { return qh_qh->hasQhullMessage(); }
    -    int                 qhullStatus() const { return qh_qh->qhullStatus(); }
    -    void                setErrorStream(std::ostream *os) { qh_qh->setErrorStream(os); }
    -    void                setFactorEpsilon(double a) { qh_qh->setFactorEpsilon(a); }
    -    void                setOutputStream(std::ostream *os) { qh_qh->setOutputStream(os); }
    -
    -#//!\name ForEach
    -    QhullFacet          beginFacet() const { return QhullFacet(qh_qh, qh_qh->facet_list); }
    -    QhullVertex         beginVertex() const { return QhullVertex(qh_qh, qh_qh->vertex_list); }
    -    void                defineVertexNeighborFacets(); //!< Automatically called if merging facets or Voronoi diagram
    -    QhullFacet          endFacet() const { return QhullFacet(qh_qh, qh_qh->facet_tail); }
    -    QhullVertex         endVertex() const { return QhullVertex(qh_qh, qh_qh->vertex_tail); }
    -    QhullFacetList      facetList() const;
    -    QhullFacet          firstFacet() const { return beginFacet(); }
    -    QhullVertex         firstVertex() const { return beginVertex(); }
    -    QhullPoints         points() const;
    -    QhullPointSet       otherPoints() const;
    -                        //! Same as points().coordinates()
    -    coordT *            pointCoordinateBegin() const { return qh_qh->first_point; }
    -    coordT *            pointCoordinateEnd() const { return qh_qh->first_point + qh_qh->num_points*qh_qh->hull_dim; }
    -    QhullVertexList     vertexList() const;
    -
    -#//!\name Methods
    -    double              area();
    -    void                outputQhull();
    -    void                outputQhull(const char * outputflags);
    -    void                runQhull(const RboxPoints &rboxPoints, const char *qhullCommand2);
    -    void                runQhull(const char *inputComment2, int pointDimension, int pointCount, const realT *pointCoordinates, const char *qhullCommand2);
    -    double              volume();
    -
    -#//!\name Helpers
    -private:
    -    void                initializeFeasiblePoint(int hulldim);
    -};//Qhull
    -
    -}//namespace orgQhull
    -
    -#endif // QHULLCPP_H
    diff --git a/src/qhull/src/libqhullcpp/QhullError.h b/src/qhull/src/libqhullcpp/QhullError.h
    deleted file mode 100644
    index 08d50aa0ff8..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullError.h
    +++ /dev/null
    @@ -1,62 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullError.h#2 $$Change: 2066 $
    -** $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#ifndef QHULLERROR_H
    -#define QHULLERROR_H
    -
    -#include "libqhullcpp/RoadError.h"
    -// No dependencies on libqhull
    -
    -#ifndef QHULL_ASSERT
    -#define QHULL_ASSERT assert
    -#include 
    -#endif
    -
    -namespace orgQhull {
    -
    -#//!\name Defined here
    -    //! QhullError -- std::exception class for Qhull
    -    class QhullError;
    -
    -class QhullError : public RoadError {
    -
    -public:
    -#//!\name Constants
    -    enum {
    -        QHULLfirstError= 10000, //MSG_QHULL_ERROR in Qhull's user.h
    -        QHULLlastError= 10078,
    -        NOthrow= 1 //! For flag to indexOf()
    -    };
    -
    -#//!\name Constructors
    -    // default constructors
    -    QhullError() : RoadError() {};
    -    QhullError(const QhullError &other) : RoadError(other) {}
    -    QhullError(int code, const std::string &message) : RoadError(code, message) {};
    -    QhullError(int code, const char *fmt) : RoadError(code, fmt) {};
    -    QhullError(int code, const char *fmt, int d) : RoadError(code, fmt, d) {};
    -    QhullError(int code, const char *fmt, int d, int d2) : RoadError(code, fmt, d, d2) {};
    -    QhullError(int code, const char *fmt, int d, int d2, float f) : RoadError(code, fmt, d, d2, f) {};
    -    QhullError(int code, const char *fmt, int d, int d2, float f, const char *s) : RoadError(code, fmt, d, d2, f, s) {};
    -    QhullError(int code, const char *fmt, int d, int d2, float f, const void *x) : RoadError(code, fmt, d, d2, f, x) {};
    -    QhullError(int code, const char *fmt, int d, int d2, float f, int i) : RoadError(code, fmt, d, d2, f, i) {};
    -    QhullError(int code, const char *fmt, int d, int d2, float f, long long i) : RoadError(code, fmt, d, d2, f, i) {};
    -    QhullError(int code, const char *fmt, int d, int d2, float f, double e) : RoadError(code, fmt, d, d2, f, e) {};
    -    QhullError &operator=(const QhullError &other) { this->RoadError::operator=(other); return *this; }
    -    ~QhullError() throw() {}
    -
    -};//class QhullError
    -
    -
    -}//namespace orgQhull
    -
    -#//!\name Global
    -
    -inline std::ostream &operator<<(std::ostream &os, const orgQhull::QhullError &e) { return os << e.what(); }
    -
    -#endif // QHULLERROR_H
    diff --git a/src/qhull/src/libqhullcpp/QhullFacet.cpp b/src/qhull/src/libqhullcpp/QhullFacet.cpp
    deleted file mode 100644
    index 40d3828a4ca..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullFacet.cpp
    +++ /dev/null
    @@ -1,519 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullFacet.cpp#3 $$Change: 2066 $
    -** $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#//! QhullFacet -- Qhull's facet structure, facetT, as a C++ class
    -
    -#include "libqhullcpp/QhullFacet.h"
    -
    -#include "libqhullcpp/QhullError.h"
    -#include "libqhullcpp/Qhull.h"
    -#include "libqhullcpp/QhullSet.h"
    -#include "libqhullcpp/QhullPoint.h"
    -#include "libqhullcpp/QhullPointSet.h"
    -#include "libqhullcpp/QhullRidge.h"
    -#include "libqhullcpp/QhullFacetSet.h"
    -#include "libqhullcpp/QhullVertex.h"
    -
    -#include 
    -
    -using std::endl;
    -using std::ostream;
    -
    -#ifdef _MSC_VER  // Microsoft Visual C++ -- warning level 4
    -#pragma warning( disable : 4611)  // interaction between '_setjmp' and C++ object destruction is non-portable
    -#pragma warning( disable : 4996)  // function was declared deprecated(strcpy, localtime, etc.)
    -#endif
    -
    -namespace orgQhull {
    -
    -#//!\name Class objects
    -facetT QhullFacet::
    -s_empty_facet= {0,0,0,0,{0},
    -        0,0,0,0,0,
    -        0,0,0,0,0,
    -        0,0,0,0,0,
    -        0,0,0,0,0,
    -        0,0,0,0,0,
    -        0,0,0,0,0,
    -        0,0,0,0};
    -
    -#//!\name Constructors
    -
    -QhullFacet::
    -QhullFacet(const Qhull &q) 
    -: qh_facet(&s_empty_facet)
    -, qh_qh(q.qh())
    -{
    -}
    -
    -QhullFacet::
    -QhullFacet(const Qhull &q, facetT *f) 
    -: qh_facet(f ? f : &s_empty_facet)
    -, qh_qh(q.qh())
    -{
    -}
    -
    -#//!\name GetSet
    -
    -//! Return voronoi center or facet centrum.  Derived from qh_printcenter [io_r.c]
    -//! if printFormat=qh_PRINTtriangles and qh.DELAUNAY, returns centrum of a Delaunay facet
    -//! Sets center if needed
    -//! Code duplicated for PrintCenter and getCenter
    -//! Returns QhullPoint() if none or qh_INFINITE
    -QhullPoint QhullFacet::
    -getCenter(qh_PRINT printFormat)
    -{
    -    if(!qh_qh){
    -        // returns QhullPoint()
    -    }else if(qh_qh->CENTERtype==qh_ASvoronoi){
    -        if(!qh_facet->normal || !qh_facet->upperdelaunay || !qh_qh->ATinfinity){
    -            if(!qh_facet->center){
    -                QH_TRY_(qh_qh){ // no object creation -- destructors skipped on longjmp()
    -                    qh_facet->center= qh_facetcenter(qh_qh, qh_facet->vertices);
    -                }
    -                qh_qh->NOerrexit= true;
    -                qh_qh->maybeThrowQhullMessage(QH_TRY_status);
    -            }
    -            return QhullPoint(qh_qh, qh_qh->hull_dim-1, qh_facet->center);
    -        }
    -    }else if(qh_qh->CENTERtype==qh_AScentrum){
    -        volatile int numCoords= qh_qh->hull_dim;
    -        if(printFormat==qh_PRINTtriangles && qh_qh->DELAUNAY){
    -            numCoords--;
    -        }
    -        if(!qh_facet->center){
    -            QH_TRY_(qh_qh){ // no object creation -- destructors skipped on longjmp()
    -                qh_facet->center= qh_getcentrum(qh_qh, getFacetT());
    -            }
    -            qh_qh->NOerrexit= true;
    -            qh_qh->maybeThrowQhullMessage(QH_TRY_status);
    -        }
    -        return QhullPoint(qh_qh, numCoords, qh_facet->center);
    -    }
    -    return QhullPoint();
    - }//getCenter
    -
    -//! Return innerplane clearly below the vertices
    -//! from io_r.c[qh_PRINTinner]
    -QhullHyperplane QhullFacet::
    -innerplane() const{
    -    QhullHyperplane h;
    -    if(qh_qh){
    -        realT inner;
    -        // Does not error, TRY_QHULL_ not needed
    -        qh_outerinner(qh_qh, const_cast(getFacetT()), NULL, &inner);
    -        h= hyperplane();
    -        h.setOffset(h.offset()-inner); //inner is negative
    -    }
    -    return h;
    -}//innerplane
    -
    -//! Return outerplane clearly above all points
    -//! from io_r.c[qh_PRINTouter]
    -QhullHyperplane QhullFacet::
    -outerplane() const{
    -    QhullHyperplane h;
    -    if(qh_qh){
    -        realT outer;
    -        // Does not error, TRY_QHULL_ not needed
    -        qh_outerinner(qh_qh, const_cast(getFacetT()), &outer, NULL);
    -        h= hyperplane();
    -        h.setOffset(h.offset()-outer); //outer is positive
    -    }
    -    return h;
    -}//outerplane
    -
    -//! Set by qh_triangulate for option 'Qt'.
    -//! Errors if tricoplanar and facetArea() or qh_getarea() called first.
    -QhullFacet QhullFacet::
    -tricoplanarOwner() const
    -{
    -    if(qh_facet->tricoplanar){
    -        if(qh_facet->isarea){
    -            throw QhullError(10018, "Qhull error: facetArea() or qh_getarea() previously called.  triCoplanarOwner() is not available.");
    -        }
    -        return QhullFacet(qh_qh, qh_facet->f.triowner);
    -    }
    -    return QhullFacet(qh_qh); 
    -}//tricoplanarOwner
    -
    -QhullPoint QhullFacet::
    -voronoiVertex()
    -{
    -    if(qh_qh && qh_qh->CENTERtype!=qh_ASvoronoi){
    -          throw QhullError(10052, "Error: QhullFacet.voronoiVertex() requires option 'v' (qh_ASvoronoi)");
    -    }
    -    return getCenter();
    -}//voronoiVertex
    -
    -#//!\name Value
    -
    -//! Disables tricoplanarOwner()
    -double QhullFacet::
    -facetArea()
    -{
    -    if(qh_qh && !qh_facet->isarea){
    -        QH_TRY_(qh_qh){ // no object creation -- destructors skipped on longjmp()
    -            qh_facet->f.area= qh_facetarea(qh_qh, qh_facet);
    -            qh_facet->isarea= True;
    -        }
    -        qh_qh->NOerrexit= true;
    -        qh_qh->maybeThrowQhullMessage(QH_TRY_status);
    -    }
    -    return qh_facet->f.area;
    -}//facetArea
    -
    -#//!\name Foreach
    -
    -QhullPointSet QhullFacet::
    -coplanarPoints() const
    -{
    -    return QhullPointSet(qh_qh, qh_facet->coplanarset);
    -}//coplanarPoints
    -
    -QhullFacetSet QhullFacet::
    -neighborFacets() const
    -{
    -    return QhullFacetSet(qh_qh, qh_facet->neighbors);
    -}//neighborFacets
    -
    -QhullPointSet QhullFacet::
    -outsidePoints() const
    -{
    -    return QhullPointSet(qh_qh, qh_facet->outsideset);
    -}//outsidePoints
    -
    -QhullRidgeSet QhullFacet::
    -ridges() const
    -{
    -    return QhullRidgeSet(qh_qh, qh_facet->ridges);
    -}//ridges
    -
    -QhullVertexSet QhullFacet::
    -vertices() const
    -{
    -    return QhullVertexSet(qh_qh, qh_facet->vertices);
    -}//vertices
    -
    -}//namespace orgQhull
    -
    -#//!\name operator<<
    -
    -using std::ostream;
    -
    -using orgQhull::QhullFacet;
    -using orgQhull::QhullFacetSet;
    -using orgQhull::QhullPoint;
    -using orgQhull::QhullPointSet;
    -using orgQhull::QhullRidge;
    -using orgQhull::QhullRidgeSet;
    -using orgQhull::QhullSetBase;
    -using orgQhull::QhullVertexSet;
    -
    -ostream &
    -operator<<(ostream &os, const QhullFacet::PrintFacet &pr)
    -{
    -    os << pr.message;
    -    QhullFacet f= *pr.facet;
    -    if(f.getFacetT()==0){ // Special values from set iterator
    -        os << " NULLfacet" << endl;
    -        return os;
    -    }
    -    if(f.getFacetT()==qh_MERGEridge){
    -        os << " MERGEridge" << endl;
    -        return os;
    -    }
    -    if(f.getFacetT()==qh_DUPLICATEridge){
    -        os << " DUPLICATEridge" << endl;
    -        return os;
    -    }
    -    os << f.printHeader();
    -    if(!f.ridges().isEmpty()){
    -        os << f.printRidges();
    -    }
    -    return os;
    -}//operator<< PrintFacet
    -
    -//! Print Voronoi center or facet centrum to stream.  Same as qh_printcenter [_r.]
    -//! Code duplicated for PrintCenter and getCenter
    -//! Sets center if needed
    -ostream &
    -operator<<(ostream &os, const QhullFacet::PrintCenter &pr)
    -{
    -    facetT *f= pr.facet->getFacetT();
    -    if(pr.facet->qh()->CENTERtype!=qh_ASvoronoi && pr.facet->qh()->CENTERtype!=qh_AScentrum){
    -        return os;
    -    }
    -    if (pr.message){
    -        os << pr.message;
    -    }
    -    int numCoords;
    -    if(pr.facet->qh()->CENTERtype==qh_ASvoronoi){
    -        numCoords= pr.facet->qh()->hull_dim-1;
    -        if(!f->normal || !f->upperdelaunay || !pr.facet->qh()->ATinfinity){
    -            if(!f->center){
    -                f->center= qh_facetcenter(pr.facet->qh(), f->vertices);
    -            }
    -            for(int k=0; kcenter[k] << " "; // FIXUP QH11010 qh_REAL_1
    -            }
    -        }else{
    -            for(int k=0; kqh()->hull_dim;
    -        if(pr.print_format==qh_PRINTtriangles && pr.facet->qh()->DELAUNAY){
    -            numCoords--;
    -        }
    -        if(!f->center){
    -            f->center= qh_getcentrum(pr.facet->qh(), f);
    -        }
    -        for(int k=0; kcenter[k] << " "; // FIXUP QH11010 qh_REAL_1
    -        }
    -    }
    -    if(pr.print_format==qh_PRINTgeom && numCoords==2){
    -        os << " 0";
    -    }
    -    os << endl;
    -    return os;
    -}//operator<< PrintCenter
    -
    -//! Print flags for facet to stream.  Space prefix.  From qh_printfacetheader [io_r.c]
    -ostream &
    -operator<<(ostream &os, const QhullFacet::PrintFlags &p)
    -{
    -    const facetT *f= p.facet->getFacetT();
    -    if(p.message){
    -        os << p.message;
    -    }
    -
    -    os << (p.facet->isTopOrient() ? " top" : " bottom");
    -    if(p.facet->isSimplicial()){
    -        os << " simplicial";
    -    }
    -    if(p.facet->isTriCoplanar()){
    -        os << " tricoplanar";
    -    }
    -    if(p.facet->isUpperDelaunay()){
    -        os << " upperDelaunay";
    -    }
    -    if(f->visible){
    -        os << " visible";
    -    }
    -    if(f->newfacet){
    -        os << " new";
    -    }
    -    if(f->tested){
    -        os << " tested";
    -    }
    -    if(!f->good){
    -        os << " notG";
    -    }
    -    if(f->seen){
    -        os << " seen";
    -    }
    -    if(f->coplanar){
    -        os << " coplanar";
    -    }
    -    if(f->mergehorizon){
    -        os << " mergehorizon";
    -    }
    -    if(f->keepcentrum){
    -        os << " keepcentrum";
    -    }
    -    if(f->dupridge){
    -        os << " dupridge";
    -    }
    -    if(f->mergeridge && !f->mergeridge2){
    -        os << " mergeridge1";
    -    }
    -    if(f->mergeridge2){
    -        os << " mergeridge2";
    -    }
    -    if(f->newmerge){
    -        os << " newmerge";
    -    }
    -    if(f->flipped){
    -        os << " flipped";
    -    }
    -    if(f->notfurthest){
    -        os << " notfurthest";
    -    }
    -    if(f->degenerate){
    -        os << " degenerate";
    -    }
    -    if(f->redundant){
    -        os << " redundant";
    -    }
    -    os << endl;
    -    return os;
    -}//operator<< PrintFlags
    -
    -//! Print header for facet to stream. Space prefix.  From qh_printfacetheader [io_r.c]
    -ostream &
    -operator<<(ostream &os, const QhullFacet::PrintHeader &pr)
    -{
    -    QhullFacet facet= *pr.facet;
    -    facetT *f= facet.getFacetT();
    -    os << "- f" << facet.id() << endl;
    -    os << facet.printFlags("    - flags:");
    -    if(f->isarea){
    -        os << "    - area: " << f->f.area << endl; //FIXUP QH11010 2.2g
    -    }else if(pr.facet->qh()->NEWfacets && f->visible && f->f.replace){
    -        os << "    - replacement: f" << f->f.replace->id << endl;
    -    }else if(f->newfacet){
    -        if(f->f.samecycle && f->f.samecycle != f){
    -            os << "    - shares same visible/horizon as f" << f->f.samecycle->id << endl;
    -        }
    -    }else if(f->tricoplanar /* !isarea */){
    -        if(f->f.triowner){
    -            os << "    - owner of normal & centrum is facet f" << f->f.triowner->id << endl;
    -        }
    -    }else if(f->f.newcycle){
    -        os << "    - was horizon to f" << f->f.newcycle->id << endl;
    -    }
    -    if(f->nummerge){
    -        os << "    - merges: " << f->nummerge << endl;
    -    }
    -    os << facet.hyperplane().print("    - normal: ", "\n    - offset: "); // FIXUP QH11010 %10.7g
    -    if(pr.facet->qh()->CENTERtype==qh_ASvoronoi || f->center){
    -        os << facet.printCenter(qh_PRINTfacets, "    - center: ");
    -    }
    -#if qh_MAXoutside
    -    if(f->maxoutside > pr.facet->qh()->DISTround){
    -        os << "    - maxoutside: " << f->maxoutside << endl; //FIXUP QH11010 %10.7g
    -    }
    -#endif
    -    QhullPointSet ps= facet.outsidePoints();
    -    if(!ps.isEmpty()){
    -        QhullPoint furthest= ps.last();
    -        if (ps.size() < 6) {
    -            os << "    - outside set(furthest p" << furthest.id() << "):" << endl;
    -            for(QhullPointSet::iterator i=ps.begin(); i!=ps.end(); ++i){
    -                QhullPoint p= *i;
    -                os << p.print("     ");
    -            }
    -        }else if(ps.size()<21){
    -            os << ps.print("    - outside set:");
    -        }else{
    -            os << "    - outside set:  " << ps.size() << " points.";
    -            os << furthest.print("  Furthest");
    -        }
    -#if !qh_COMPUTEfurthest
    -        os << "    - furthest distance= " << f->furthestdist << endl; //FIXUP QH11010 %2.2g
    -#endif
    -    }
    -    QhullPointSet cs= facet.coplanarPoints();
    -    if(!cs.isEmpty()){
    -        QhullPoint furthest= cs.last();
    -        if (cs.size() < 6) {
    -            os << "    - coplanar set(furthest p" << furthest.id() << "):" << endl;
    -            for(QhullPointSet::iterator i=cs.begin(); i!=cs.end(); ++i){
    -                QhullPoint p= *i;
    -                os << p.print("     ");
    -            }
    -        }else if(cs.size()<21){
    -            os << cs.print("    - coplanar set:");
    -        }else{
    -            os << "    - coplanar set:  " << cs.size() << " points.";
    -            os << furthest.print("  Furthest");
    -        }
    -        // FIXUP QH11027 Can/should zinc_(Zdistio) be called from C++ interface
    -        double d= facet.distance(furthest);
    -        os << "      furthest distance= " << d << endl; //FIXUP QH11010 %2.2g
    -    }
    -    QhullVertexSet vs= facet.vertices();
    -    if(!vs.isEmpty()){
    -        os << vs.print("    - vertices:");
    -    }
    -    QhullFacetSet fs= facet.neighborFacets();
    -    fs.selectAll();
    -    if(!fs.isEmpty()){
    -        os << fs.printIdentifiers("    - neighboring facets:");
    -    }
    -    return os;
    -}//operator<< PrintHeader
    -
    -
    -//! Print ridges of facet to stream.  Same as qh_printfacetridges [io_r.c]
    -ostream &
    -operator<<(ostream &os, const QhullFacet::PrintRidges &pr)
    -{
    -    const QhullFacet facet= *pr.facet;
    -    facetT *f= facet.getFacetT();
    -    QhullRidgeSet rs= facet.ridges();
    -    if(!rs.isEmpty()){
    -        if(f->visible && pr.facet->qh()->NEWfacets){
    -            os << "    - ridges(ids may be garbage):";
    -            for(QhullRidgeSet::iterator i=rs.begin(); i!=rs.end(); ++i){
    -                QhullRidge r= *i;
    -                os << " r" << r.id();
    -            }
    -            os << endl;
    -        }else{
    -            os << "    - ridges:" << endl;
    -        }
    -
    -        // Keep track of printed ridges
    -        for(QhullRidgeSet::iterator i=rs.begin(); i!=rs.end(); ++i){
    -            QhullRidge r= *i;
    -            r.getRidgeT()->seen= false;
    -        }
    -        int ridgeCount= 0;
    -        if(facet.dimension()==3){
    -            for(QhullRidge r= rs.first(); !r.getRidgeT()->seen; r= r.nextRidge3d(facet)){
    -                r.getRidgeT()->seen= true;
    -                os << r.print("");
    -                ++ridgeCount;
    -                if(!r.hasNextRidge3d(facet)){
    -                    break;
    -                }
    -            }
    -        }else {
    -            QhullFacetSet ns(facet.neighborFacets());
    -            for(QhullFacetSet::iterator i=ns.begin(); i!=ns.end(); ++i){
    -                QhullFacet neighbor= *i;
    -                QhullRidgeSet nrs(neighbor.ridges());
    -                for(QhullRidgeSet::iterator j=nrs.begin(); j!=nrs.end(); ++j){
    -                    QhullRidge r= *j;
    -                    if(r.otherFacet(neighbor)==facet){
    -                        r.getRidgeT()->seen= true;
    -                        os << r.print("");
    -                        ridgeCount++;
    -                    }
    -                }
    -            }
    -        }
    -        if(ridgeCount!=rs.count()){
    -            os << "     - all ridges:";
    -            for(QhullRidgeSet::iterator i=rs.begin(); i!=rs.end(); ++i){
    -                QhullRidge r= *i;
    -                os << " r" << r.id();
    -            }
    -            os << endl;
    -        }
    -        for(QhullRidgeSet::iterator i=rs.begin(); i!=rs.end(); ++i){
    -            QhullRidge r= *i;
    -            if(!r.getRidgeT()->seen){
    -                os << r.print("");
    -            }
    -        }
    -    }
    -    return os;
    -}//operator<< PrintRidges
    -
    -// "No conversion" error if defined inline
    -ostream &
    -operator<<(ostream &os, QhullFacet &f)
    -{
    -    os << f.print("");
    -    return os;
    -}//<< QhullFacet
    diff --git a/src/qhull/src/libqhullcpp/QhullFacet.h b/src/qhull/src/libqhullcpp/QhullFacet.h
    deleted file mode 100644
    index ae4f008fd25..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullFacet.h
    +++ /dev/null
    @@ -1,151 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullFacet.h#4 $$Change: 2079 $
    -** $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#ifndef QHULLFACET_H
    -#define QHULLFACET_H
    -
    -#include "libqhull_r/qhull_ra.h"
    -#include "libqhullcpp/QhullHyperplane.h"
    -#include "libqhullcpp/QhullPoint.h"
    -#include "libqhullcpp/QhullSet.h"
    -#include "libqhullcpp/QhullPointSet.h"
    -
    -#include 
    -
    -namespace orgQhull {
    -
    -#//!\name Used here
    -    class Coordinates;
    -    class Qhull;
    -    class QhullFacetSet;
    -    class QhullRidge;
    -    class QhullVertex;
    -    class QhullVertexSet;
    -
    -#//!\name Defined here
    -    class QhullFacet;
    -    typedef QhullSet  QhullRidgeSet;
    -
    -//! A QhullFacet is the C++ equivalent to Qhull's facetT*
    -class QhullFacet {
    -
    -#//!\name Defined here
    -public:
    -    typedef facetT *   base_type;  // for QhullVertexSet
    -
    -private:
    -#//!\name Fields -- no additions (QhullFacetSet of facetT*)
    -    facetT *            qh_facet;  //!< Corresponding facetT, may be 0 for corner cases (e.g., *facetSet.end()==0) and tricoplanarOwner()
    -    QhullQh *           qh_qh;     //!< QhullQh/qhT for facetT, may be 0
    -
    -#//!\name Class objects
    -    static facetT       s_empty_facet; // needed for shallow copy
    -
    -public:
    -#//!\name Constructors
    -                        QhullFacet() : qh_facet(&s_empty_facet), qh_qh(0) {}
    -    explicit            QhullFacet(const Qhull &q);
    -                        QhullFacet(const Qhull &q, facetT *f);
    -    explicit            QhullFacet(QhullQh *qqh) : qh_facet(&s_empty_facet), qh_qh(qqh) {}
    -                        QhullFacet(QhullQh *qqh, facetT *f) : qh_facet(f ? f : &s_empty_facet), qh_qh(qqh) {}
    -                        // Creates an alias.  Does not copy QhullFacet.  Needed for return by value and parameter passing
    -                        QhullFacet(const QhullFacet &other) : qh_facet(other.qh_facet ? other.qh_facet : &s_empty_facet), qh_qh(other.qh_qh) {}
    -                        // Creates an alias.  Does not copy QhullFacet.  Needed for vector
    -    QhullFacet &        operator=(const QhullFacet &other) { qh_facet= other.qh_facet ? other.qh_facet : &s_empty_facet; qh_qh= other.qh_qh; return *this; }
    -                        ~QhullFacet() {}
    -
    -
    -#//!\name GetSet
    -    int                 dimension() const { return (qh_qh ? qh_qh->hull_dim : 0); }
    -    QhullPoint          getCenter() { return getCenter(qh_PRINTpoints); }
    -    QhullPoint          getCenter(qh_PRINT printFormat);
    -    facetT *            getBaseT() const { return getFacetT(); } //!< For QhullSet
    -                        // Do not define facetT().  It conflicts with return type facetT*
    -    facetT *            getFacetT() const { return qh_facet; }
    -    QhullHyperplane     hyperplane() const { return QhullHyperplane(qh_qh, dimension(), qh_facet->normal, qh_facet->offset); }
    -    countT              id() const { return (qh_facet ? qh_facet->id : (int)qh_IDunknown); }
    -    QhullHyperplane     innerplane() const;
    -    bool                isValid() const { return qh_qh && qh_facet && qh_facet != &s_empty_facet; }
    -    bool                isGood() const { return qh_facet && qh_facet->good; }
    -    bool                isSimplicial() const { return qh_facet && qh_facet->simplicial; }
    -    bool                isTopOrient() const { return qh_facet && qh_facet->toporient; }
    -    bool                isTriCoplanar() const { return qh_facet && qh_facet->tricoplanar; }
    -    bool                isUpperDelaunay() const { return qh_facet && qh_facet->upperdelaunay; }
    -    QhullFacet          next() const { return QhullFacet(qh_qh, qh_facet->next); }
    -    bool                operator==(const QhullFacet &other) const { return qh_facet==other.qh_facet; }
    -    bool                operator!=(const QhullFacet &other) const { return !operator==(other); }
    -    QhullHyperplane     outerplane() const;
    -    QhullFacet          previous() const { return QhullFacet(qh_qh, qh_facet->previous); }
    -    QhullQh *           qh() const { return qh_qh; }
    -    QhullFacet          tricoplanarOwner() const;
    -    QhullPoint          voronoiVertex();
    -
    -#//!\name value
    -    //! Undefined if c.size() != dimension()
    -    double              distance(const Coordinates &c) const { return distance(c.data()); }
    -    double              distance(const pointT *p) const { return distance(QhullPoint(qh_qh, const_cast(p))); }
    -    double              distance(const QhullPoint &p) const { return hyperplane().distance(p); }
    -    double              facetArea();
    -
    -#//!\name foreach
    -    // Can not inline.  Otherwise circular reference
    -    QhullPointSet       coplanarPoints() const;
    -    QhullFacetSet       neighborFacets() const;
    -    QhullPointSet       outsidePoints() const;
    -    QhullRidgeSet       ridges() const;
    -    QhullVertexSet      vertices() const;
    -
    -#//!\name IO
    -    struct PrintCenter{
    -        QhullFacet *    facet;  // non-const due to facet.center()
    -        const char *    message;
    -        qh_PRINT        print_format;
    -                        PrintCenter(QhullFacet &f, qh_PRINT printFormat, const char * s) : facet(&f), message(s), print_format(printFormat){}
    -    };//PrintCenter
    -    PrintCenter         printCenter(qh_PRINT printFormat, const char *message) { return PrintCenter(*this, printFormat, message); }
    -
    -    struct PrintFacet{
    -        QhullFacet *    facet;  // non-const due to f->center()
    -        const char *    message;
    -        explicit        PrintFacet(QhullFacet &f, const char * s) : facet(&f), message(s) {}
    -    };//PrintFacet
    -    PrintFacet          print(const char *message) { return PrintFacet(*this, message); }
    -
    -    struct PrintFlags{
    -        const QhullFacet *facet;
    -        const char *    message;
    -                        PrintFlags(const QhullFacet &f, const char *s) : facet(&f), message(s) {}
    -    };//PrintFlags
    -    PrintFlags          printFlags(const char *message) const { return PrintFlags(*this, message); }
    -
    -    struct PrintHeader{
    -        QhullFacet *    facet;  // non-const due to f->center()
    -                        PrintHeader(QhullFacet &f) : facet(&f) {}
    -    };//PrintHeader
    -    PrintHeader         printHeader() { return PrintHeader(*this); }
    -
    -    struct PrintRidges{
    -        const QhullFacet *facet;
    -                        PrintRidges(QhullFacet &f) : facet(&f) {}
    -    };//PrintRidges
    -    PrintRidges         printRidges() { return PrintRidges(*this); }
    -
    -};//class QhullFacet
    -
    -}//namespace orgQhull
    -
    -#//!\name Global
    -
    -std::ostream &operator<<(std::ostream &os, const orgQhull::QhullFacet::PrintFacet &pr);
    -std::ostream &operator<<(std::ostream &os, const orgQhull::QhullFacet::PrintCenter &pr);
    -std::ostream &operator<<(std::ostream &os, const orgQhull::QhullFacet::PrintFlags &pr);
    -std::ostream &operator<<(std::ostream &os, const orgQhull::QhullFacet::PrintHeader &pr);
    -std::ostream &operator<<(std::ostream &os, const orgQhull::QhullFacet::PrintRidges &pr);
    -std::ostream &operator<<(std::ostream &os, orgQhull::QhullFacet &f); // non-const due to qh_getcenter()
    -
    -#endif // QHULLFACET_H
    diff --git a/src/qhull/src/libqhullcpp/QhullFacetList.cpp b/src/qhull/src/libqhullcpp/QhullFacetList.cpp
    deleted file mode 100644
    index 9e6ddfe9ece..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullFacetList.cpp
    +++ /dev/null
    @@ -1,174 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullFacetList.cpp#3 $$Change: 2066 $
    -** $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#//! QhullFacetList -- Qhull's linked facets, as a C++ class
    -
    -#include "libqhullcpp/QhullFacetList.h"
    -
    -#include "libqhullcpp/QhullFacet.h"
    -#include "libqhullcpp/QhullPoint.h"
    -#include "libqhullcpp/QhullRidge.h"
    -#include "libqhullcpp/QhullVertex.h"
    -
    -using std::string;
    -using std::vector;
    -
    -#ifdef _MSC_VER  // Microsoft Visual C++ -- warning level 4
    -#pragma warning( disable : 4611)  // interaction between '_setjmp' and C++ object destruction is non-portable
    -#pragma warning( disable : 4996)  // function was declared deprecated(strcpy, localtime, etc.)
    -#endif
    -
    -namespace orgQhull {
    -
    -#//!\name Constructors
    -
    -QhullFacetList::
    -QhullFacetList(const Qhull &q, facetT *b, facetT *e ) 
    -: QhullLinkedList(QhullFacet(q, b), QhullFacet(q, e))
    -, select_all(false)
    -{
    -}
    -
    -#//!\name Conversions
    -
    -// See qt_qhull.cpp for QList conversions
    -
    -#ifndef QHULL_NO_STL
    -std::vector QhullFacetList::
    -toStdVector() const
    -{
    -    QhullLinkedListIterator i(*this);
    -    std::vector vs;
    -    while(i.hasNext()){
    -        QhullFacet f= i.next();
    -        if(isSelectAll() || f.isGood()){
    -            vs.push_back(f);
    -        }
    -    }
    -    return vs;
    -}//toStdVector
    -#endif //QHULL_NO_STL
    -
    -#ifndef QHULL_NO_STL
    -//! Same as PrintVertices
    -std::vector QhullFacetList::
    -vertices_toStdVector() const
    -{
    -    std::vector vs;
    -    QhullVertexSet qvs(qh(), first().getFacetT(), 0, isSelectAll());
    -
    -    for(QhullVertexSet::iterator i=qvs.begin(); i!=qvs.end(); ++i){
    -        vs.push_back(*i);
    -    }
    -    return vs;
    -}//vertices_toStdVector
    -#endif //QHULL_NO_STL
    -
    -#//!\name GetSet
    -
    -bool QhullFacetList::
    -contains(const QhullFacet &facet) const
    -{
    -    if(isSelectAll()){
    -        return QhullLinkedList::contains(facet);
    -    }
    -    for(QhullFacetList::const_iterator i=begin(); i != end(); ++i){
    -        QhullFacet f= *i;
    -        if(f==facet && f.isGood()){
    -            return true;
    -        }
    -    }
    -    return false;
    -}//contains
    -
    -int QhullFacetList::
    -count() const
    -{
    -    if(isSelectAll()){
    -        return QhullLinkedList::count();
    -    }
    -    int counter= 0;
    -    for(QhullFacetList::const_iterator i=begin(); i != end(); ++i){
    -        if((*i).isGood()){
    -            counter++;
    -        }
    -    }
    -    return counter;
    -}//count
    -
    -int QhullFacetList::
    -count(const QhullFacet &facet) const
    -{
    -    if(isSelectAll()){
    -        return QhullLinkedList::count(facet);
    -    }
    -    int counter= 0;
    -    for(QhullFacetList::const_iterator i=begin(); i != end(); ++i){
    -        QhullFacet f= *i;
    -        if(f==facet && f.isGood()){
    -            counter++;
    -        }
    -    }
    -    return counter;
    -}//count
    -
    -}//namespace orgQhull
    -
    -#//!\name Global functions
    -
    -using std::endl;
    -using std::ostream;
    -using orgQhull::QhullFacet;
    -using orgQhull::QhullFacetList;
    -using orgQhull::QhullVertex;
    -using orgQhull::QhullVertexSet;
    -
    -ostream &
    -operator<<(ostream &os, const QhullFacetList::PrintFacetList &pr)
    -{
    -    os << pr.print_message;
    -    QhullFacetList fs= *pr.facet_list;
    -    os << "Vertices for " << fs.count() << " facets" << endl;
    -    os << fs.printVertices();
    -    os << fs.printFacets();
    -    return os;
    -}//operator<<
    -
    -//! Print facet list to stream.  From qh_printafacet [io_r.c]
    -ostream &
    -operator<<(ostream &os, const QhullFacetList::PrintFacets &pr)
    -{
    -    for(QhullFacetList::const_iterator i= pr.facet_list->begin(); i != pr.facet_list->end(); ++i){
    -        QhullFacet f= *i;
    -        if(pr.facet_list->isSelectAll() || f.isGood()){
    -            os << f.print("");
    -        }
    -    }
    -    return os;
    -}//printFacets
    -
    -//! Print vertices of good faces in facet list to stream.  From qh_printvertexlist [io_r.c]
    -//! Same as vertices_toStdVector
    -ostream &
    -operator<<(ostream &os, const QhullFacetList::PrintVertices &pr)
    -{
    -    QhullVertexSet vs(pr.facet_list->qh(), pr.facet_list->first().getFacetT(), NULL, pr.facet_list->isSelectAll());
    -    for(QhullVertexSet::iterator i=vs.begin(); i!=vs.end(); ++i){
    -        QhullVertex v= *i;
    -        os << v.print("");
    -    }
    -    return os;
    -}//printVertices
    -
    -std::ostream &
    -operator<<(ostream &os, const QhullFacetList &fs)
    -{
    -    os << fs.printFacets();
    -    return os;
    -}//QhullFacetList
    -
    diff --git a/src/qhull/src/libqhullcpp/QhullFacetList.h b/src/qhull/src/libqhullcpp/QhullFacetList.h
    deleted file mode 100644
    index e61e568403c..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullFacetList.h
    +++ /dev/null
    @@ -1,106 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullFacetList.h#2 $$Change: 2066 $
    -** $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#ifndef QHULLFACETLIST_H
    -#define QHULLFACETLIST_H
    -
    -#include "libqhullcpp/QhullLinkedList.h"
    -#include "libqhullcpp/QhullFacet.h"
    -
    -#include 
    -
    -#ifndef QHULL_NO_STL
    -#include 
    -#endif
    -
    -namespace orgQhull {
    -
    -#//!\name Used here
    -    class Qhull;
    -    class QhullFacet;
    -    class QhullQh;
    -
    -#//!\name Defined here
    -    //! QhullFacetList -- List of QhullFacet/facetT, as a C++ class.  
    -    //!\see QhullFacetSet.h
    -    class QhullFacetList;
    -    //! QhullFacetListIterator -- if(f.isGood()){ ... }
    -    typedef QhullLinkedListIterator QhullFacetListIterator;
    -
    -class QhullFacetList : public QhullLinkedList {
    -
    -#//!\name  Fields
    -private:
    -    bool                select_all;   //! True if include bad facets.  Default is false.
    -
    -#//!\name Constructors
    -public:
    -                        QhullFacetList(const Qhull &q, facetT *b, facetT *e);
    -                        QhullFacetList(QhullQh *qqh, facetT *b, facetT *e);
    -                        QhullFacetList(QhullFacet b, QhullFacet e) : QhullLinkedList(b, e), select_all(false) {}
    -                        //Copy constructor copies pointer but not contents.  Needed for return by value and parameter passing.
    -                        QhullFacetList(const QhullFacetList &other) : QhullLinkedList(*other.begin(), *other.end()), select_all(other.select_all) {}
    -    QhullFacetList &    operator=(const QhullFacetList &other) { QhullLinkedList::operator =(other); select_all= other.select_all; return *this; }
    -                        ~QhullFacetList() {}
    -
    -private:                //!Disable default constructor.  See QhullLinkedList
    -                    QhullFacetList();
    -public:
    -
    -#//!\name Conversion
    -#ifndef QHULL_NO_STL
    -    std::vector toStdVector() const;
    -    std::vector vertices_toStdVector() const;
    -#endif //QHULL_NO_STL
    -#ifdef QHULL_USES_QT
    -    QList   toQList() const;
    -    QList  vertices_toQList() const;
    -#endif //QHULL_USES_QT
    -
    -#//!\name GetSet
    -                        //! Filtered by facet.isGood().  May be 0 when !isEmpty().
    -    countT              count() const;
    -    bool                contains(const QhullFacet &f) const;
    -    countT              count(const QhullFacet &f) const;
    -    bool                isSelectAll() const { return select_all; }
    -    QhullQh *           qh() const { return first().qh(); }
    -    void                selectAll() { select_all= true; }
    -    void                selectGood() { select_all= false; }
    -                        //!< operator==() does not depend on isGood()
    -
    -#//!\name IO
    -    struct PrintFacetList{
    -        const QhullFacetList *facet_list;
    -        const char *    print_message;   //!< non-null message
    -                        PrintFacetList(const QhullFacetList &fl, const char *message) : facet_list(&fl), print_message(message) {}
    -    };//PrintFacetList
    -    PrintFacetList      print(const char *message) const  { return PrintFacetList(*this, message); }
    -
    -    struct PrintFacets{
    -        const QhullFacetList *facet_list;
    -                        PrintFacets(const QhullFacetList &fl) : facet_list(&fl) {}
    -    };//PrintFacets
    -    PrintFacets         printFacets() const { return PrintFacets(*this); }
    -
    -    struct PrintVertices{
    -        const QhullFacetList *facet_list;
    -                        PrintVertices(const QhullFacetList &fl) : facet_list(&fl) {}
    -    };//PrintVertices
    -    PrintVertices       printVertices() const { return PrintVertices(*this); }
    -};//class QhullFacetList
    -
    -}//namespace orgQhull
    -
    -#//!\name == Global namespace =========================================
    -
    -std::ostream &operator<<(std::ostream &os, const orgQhull::QhullFacetList::PrintFacetList &p);
    -std::ostream &operator<<(std::ostream &os, const orgQhull::QhullFacetList::PrintFacets &p);
    -std::ostream &operator<<(std::ostream &os, const orgQhull::QhullFacetList::PrintVertices &p);
    -std::ostream &operator<<(std::ostream &os, const orgQhull::QhullFacetList &fs);
    -
    -#endif // QHULLFACETLIST_H
    diff --git a/src/qhull/src/libqhullcpp/QhullFacetSet.cpp b/src/qhull/src/libqhullcpp/QhullFacetSet.cpp
    deleted file mode 100644
    index d30c21e26a6..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullFacetSet.cpp
    +++ /dev/null
    @@ -1,147 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullFacetSet.cpp#2 $$Change: 2066 $
    -** $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#//! QhullFacetSet -- Qhull's linked facets, as a C++ class
    -
    -#include "libqhullcpp/QhullFacetSet.h"
    -
    -#include "libqhullcpp/QhullFacet.h"
    -#include "libqhullcpp/QhullPoint.h"
    -#include "libqhullcpp/QhullRidge.h"
    -#include "libqhullcpp/QhullVertex.h"
    -
    -#ifndef QHULL_NO_STL
    -using std::vector;
    -#endif
    -
    -#ifdef _MSC_VER  // Microsoft Visual C++ -- warning level 4
    -#pragma warning( disable : 4611)  // interaction between '_setjmp' and C++ object destruction is non-portable
    -#pragma warning( disable : 4996)  // function was declared deprecated(strcpy, localtime, etc.)
    -#endif
    -
    -namespace orgQhull {
    -
    -#//!\name Conversions
    -
    -// See qt-qhull.cpp for QList conversions
    -
    -#ifndef QHULL_NO_STL
    -std::vector QhullFacetSet::
    -toStdVector() const
    -{
    -    QhullSetIterator i(*this);
    -    std::vector vs;
    -    while(i.hasNext()){
    -        QhullFacet f= i.next();
    -        if(isSelectAll() || f.isGood()){
    -            vs.push_back(f);
    -        }
    -    }
    -    return vs;
    -}//toStdVector
    -#endif //QHULL_NO_STL
    -
    -#//!\name GetSet
    -
    -bool QhullFacetSet::
    -contains(const QhullFacet &facet) const
    -{
    -    if(isSelectAll()){
    -        return QhullSet::contains(facet);
    -    }
    -    for(QhullFacetSet::const_iterator i=begin(); i != end(); ++i){
    -        QhullFacet f= *i;
    -        if(f==facet && f.isGood()){
    -            return true;
    -        }
    -    }
    -    return false;
    -}//contains
    -
    -int QhullFacetSet::
    -count() const
    -{
    -    if(isSelectAll()){
    -        return QhullSet::count();
    -    }
    -    int counter= 0;
    -    for(QhullFacetSet::const_iterator i=begin(); i != end(); ++i){
    -        QhullFacet f= *i;
    -        if(f.isGood()){
    -            counter++;
    -        }
    -    }
    -    return counter;
    -}//count
    -
    -int QhullFacetSet::
    -count(const QhullFacet &facet) const
    -{
    -    if(isSelectAll()){
    -        return QhullSet::count(facet);
    -    }
    -    int counter= 0;
    -    for(QhullFacetSet::const_iterator i=begin(); i != end(); ++i){
    -        QhullFacet f= *i;
    -        if(f==facet && f.isGood()){
    -            counter++;
    -        }
    -    }
    -    return counter;
    -}//count
    -
    -}//namespace orgQhull
    -
    -#//!\name Global functions
    -
    -using std::endl;
    -using std::ostream;
    -using orgQhull::QhullFacet;
    -using orgQhull::QhullFacetSet;
    -
    -ostream &
    -operator<<(ostream &os, const QhullFacetSet &fs)
    -{
    -    os << fs.print("");
    -    return os;
    -}//<begin(); i!=p.facet_set->end(); ++i){
    -        const QhullFacet f= *i;
    -        if(f.getFacetT()==qh_MERGEridge){
    -            os << " MERGE";
    -        }else if(f.getFacetT()==qh_DUPLICATEridge){
    -            os << " DUP";
    -        }else if(p.facet_set->isSelectAll() || f.isGood()){
    -            os << " f" << f.id();
    -        }
    -    }
    -    os << endl;
    -    return os;
    -}//<
    -
    -namespace orgQhull {
    -
    -#//!\name Used here
    -    class Qhull;
    -
    -#//!\name Defined here
    -    //! QhullFacetSet -- a set of Qhull facets, as a C++ class.  See QhullFacetList.h
    -    class QhullFacetSet;
    -    typedef QhullSetIterator QhullFacetSetIterator;
    -
    -class QhullFacetSet : public QhullSet {
    -
    -#//!\name Defined here
    -public:
    -    typedef facetT *   base_type;  // for QhullVertexSet
    -
    -private:
    -#//!\name Fields
    -    bool                select_all;   //! True if include bad facets.  Default is false.
    -
    -public:
    -#//!\name Constructor
    -                        //Conversion from setT* is not type-safe.  Implicit conversion for void* to T
    -                        QhullFacetSet(const Qhull &q, setT *s) : QhullSet(q, s), select_all(false) {}
    -                        QhullFacetSet(QhullQh *qqh, setT *s) : QhullSet(qqh, s), select_all(false) {}
    -                        //!Copy constructor copies pointers but not contents.  Needed for return by value and parameter passing.
    -                        QhullFacetSet(const QhullFacetSet &other) : QhullSet(other), select_all(other.select_all) {}
    -                        //!Assignment copies pointers but not contents.
    -    QhullFacetSet &     operator=(const QhullFacetSet &other) { QhullSet::operator=(other); select_all= other.select_all; return *this; }
    -
    -private:
    -                        //!Disable default constructor.  See QhullSetBase
    -                        QhullFacetSet();
    -public:
    -
    -#//!\name Conversion
    -#ifndef QHULL_NO_STL
    -    std::vector toStdVector() const;
    -#endif //QHULL_NO_STL
    -#ifdef QHULL_USES_QT
    -    QList   toQList() const;
    -#endif //QHULL_USES_QT
    -
    -#//!\name GetSet
    -                        //! Filtered by facet.isGood().  May be 0 when !isEmpty().
    -    countT              count() const;
    -    bool                contains(const QhullFacet &f) const;
    -    countT              count(const QhullFacet &f) const;
    -    bool                isSelectAll() const { return select_all; }
    -                        //! operator==() does not depend on isGood()
    -    void                selectAll() { select_all= true; }
    -    void                selectGood() { select_all= false; }
    -
    -#//!\name IO
    -    // Not same as QhullFacetList#IO.  A QhullFacetSet is a component of a QhullFacetList.
    -
    -    struct PrintFacetSet{
    -        const QhullFacetSet *facet_set;
    -        const char *    print_message;  //!< non-null message
    -                        PrintFacetSet(const char *message, const QhullFacetSet *s) : facet_set(s), print_message(message) {}
    -    };//PrintFacetSet
    -    const PrintFacetSet print(const char *message) const { return PrintFacetSet(message, this); }
    -
    -    struct PrintIdentifiers{
    -        const QhullFacetSet *facet_set;
    -        const char *    print_message;  //!< non-null message
    -                        PrintIdentifiers(const char *message, const QhullFacetSet *s) : facet_set(s), print_message(message) {}
    -    };//PrintIdentifiers
    -    PrintIdentifiers    printIdentifiers(const char *message) const { return PrintIdentifiers(message, this); }
    -
    -};//class QhullFacetSet
    -
    -}//namespace orgQhull
    -
    -#//!\name == Global namespace =========================================
    -
    -std::ostream &operator<<(std::ostream &os, const orgQhull::QhullFacetSet &fs);
    -std::ostream &operator<<(std::ostream &os, const orgQhull::QhullFacetSet::PrintFacetSet &pr);
    -std::ostream &operator<<(std::ostream &os, const orgQhull::QhullFacetSet::PrintIdentifiers &p);
    -
    -#endif // QHULLFACETSET_H
    diff --git a/src/qhull/src/libqhullcpp/QhullHyperplane.cpp b/src/qhull/src/libqhullcpp/QhullHyperplane.cpp
    deleted file mode 100644
    index ed5cc4bae1c..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullHyperplane.cpp
    +++ /dev/null
    @@ -1,187 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullHyperplane.cpp#3 $$Change: 2066 $
    -** $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#include "libqhullcpp/QhullHyperplane.h"
    -
    -#include "libqhullcpp/Qhull.h"
    -#include "libqhullcpp/QhullPoint.h"
    -
    -#include 
    -
    -
    -#ifdef _MSC_VER  // Microsoft Visual C++ -- warning level 4
    -#endif
    -
    -namespace orgQhull {
    -
    -#//!\name Constructors
    -
    -QhullHyperplane::
    -QhullHyperplane(const Qhull &q) 
    -: hyperplane_coordinates(0)
    -, qh_qh(q.qh())
    -, hyperplane_offset(0.0)
    -, hyperplane_dimension(0)
    -{
    -}
    -
    -QhullHyperplane::
    -QhullHyperplane(const Qhull &q, int hyperplaneDimension, coordT *c, coordT hyperplaneOffset) 
    -: hyperplane_coordinates(c)
    -, qh_qh(q.qh())
    -, hyperplane_offset(hyperplaneOffset)
    -, hyperplane_dimension(hyperplaneDimension)
    -{
    -}
    -
    -#//!\name Conversions
    -
    -// See qt-qhull.cpp for QList conversions
    -
    -#ifndef QHULL_NO_STL
    -std::vector QhullHyperplane::
    -toStdVector() const
    -{
    -    QhullHyperplaneIterator i(*this);
    -    std::vector fs;
    -    while(i.hasNext()){
    -        fs.push_back(i.next());
    -    }
    -    fs.push_back(hyperplane_offset);
    -    return fs;
    -}//toStdVector
    -#endif //QHULL_NO_STL
    -
    -#//!\name GetSet
    -
    -//! Return true if equal
    -//! If qh_qh defined, tests qh.distanceEpsilon and qh.angleEpsilon
    -//! otherwise, tests equal coordinates and offset
    -bool QhullHyperplane::
    -operator==(const QhullHyperplane &other) const
    -{
    -    if(hyperplane_dimension!=other.hyperplane_dimension || !hyperplane_coordinates || !other.hyperplane_coordinates){
    -        return false;
    -    }
    -    double d= fabs(hyperplane_offset-other.hyperplane_offset);
    -    if(d > (qh_qh ? qh_qh->distanceEpsilon() : 0.0)){
    -        return false;
    -    }
    -    double angle= hyperplaneAngle(other);
    -
    -    double a= fabs(angle-1.0);
    -    if(a > (qh_qh ? qh_qh->angleEpsilon() : 0.0)){
    -        return false;
    -    }
    -    return true;
    -}//operator==
    -
    -#//!\name Methods
    -
    -//! Return distance from point to hyperplane.
    -//!   If greater than zero, the point is above the facet (i.e., outside).
    -// qh_distplane [geom_r.c], QhullFacet::distance, and QhullHyperplane::distance are copies
    -//    Does not support RANDOMdist or logging
    -double QhullHyperplane::
    -distance(const QhullPoint &p) const
    -{
    -    const coordT *point= p.coordinates();
    -    int dim= p.dimension();
    -    QHULL_ASSERT(dim==dimension());
    -    const coordT *normal= coordinates();
    -    double dist;
    -
    -    switch (dim){
    -  case 2:
    -      dist= offset() + point[0] * normal[0] + point[1] * normal[1];
    -      break;
    -  case 3:
    -      dist= offset() + point[0] * normal[0] + point[1] * normal[1] + point[2] * normal[2];
    -      break;
    -  case 4:
    -      dist= offset()+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3];
    -      break;
    -  case 5:
    -      dist= offset()+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3]+point[4]*normal[4];
    -      break;
    -  case 6:
    -      dist= offset()+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3]+point[4]*normal[4]+point[5]*normal[5];
    -      break;
    -  case 7:
    -      dist= offset()+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3]+point[4]*normal[4]+point[5]*normal[5]+point[6]*normal[6];
    -      break;
    -  case 8:
    -      dist= offset()+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3]+point[4]*normal[4]+point[5]*normal[5]+point[6]*normal[6]+point[7]*normal[7];
    -      break;
    -  default:
    -      dist= offset();
    -      for (int k=dim; k--; )
    -          dist += *point++ * *normal++;
    -      break;
    -    }
    -    return dist;
    -}//distance
    -
    -double QhullHyperplane::
    -hyperplaneAngle(const QhullHyperplane &other) const
    -{
    -    volatile realT result= 0.0;
    -    QH_TRY_(qh_qh){ // no object creation -- destructors skipped on longjmp()
    -        result= qh_getangle(qh_qh, hyperplane_coordinates, other.hyperplane_coordinates);
    -    }
    -    qh_qh->NOerrexit= true;
    -    qh_qh->maybeThrowQhullMessage(QH_TRY_status);
    -    return result;
    -}//hyperplaneAngle
    -
    -double QhullHyperplane::
    -norm() const {
    -    double d= 0.0;
    -    const coordT *c= coordinates();
    -    for (int k=dimension(); k--; ){
    -        d += *c * *c;
    -        ++c;
    -    }
    -    return sqrt(d);
    -}//norm
    -
    -}//namespace orgQhull
    -
    -#//!\name Global functions
    -
    -using std::ostream;
    -using orgQhull::QhullHyperplane;
    -
    -#//!\name GetSet<<
    -
    -ostream &
    -operator<<(ostream &os, const QhullHyperplane &p)
    -{
    -    os << p.print("");
    -    return os;
    -}
    -
    -ostream &
    -operator<<(ostream &os, const QhullHyperplane::PrintHyperplane &pr)
    -{
    -    os << pr.print_message;
    -    QhullHyperplane p= *pr.hyperplane;
    -    const realT *c= p.coordinates();
    -    for(int k=p.dimension(); k--; ){
    -        realT r= *c++;
    -        if(pr.print_message){
    -            os << " " << r; // FIXUP QH11010 %8.4g
    -        }else{
    -            os << " " << r; // FIXUP QH11010 qh_REAL_1
    -        }
    -    }
    -    os << pr.hyperplane_offset_message << " " << p.offset();
    -    os << std::endl;
    -    return os;
    -}//PrintHyperplane
    -
    diff --git a/src/qhull/src/libqhullcpp/QhullHyperplane.h b/src/qhull/src/libqhullcpp/QhullHyperplane.h
    deleted file mode 100644
    index 2868ce5c993..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullHyperplane.h
    +++ /dev/null
    @@ -1,123 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullHyperplane.h#4 $$Change: 2079 $
    -** $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#ifndef QHHYPERPLANE_H
    -#define QHHYPERPLANE_H
    -
    -#include "libqhull_r/qhull_ra.h"
    -#include "libqhullcpp/QhullError.h"
    -#include "libqhullcpp/QhullIterator.h"
    -#include "libqhullcpp/QhullQh.h"
    -
    -#include 
    -
    -namespace orgQhull {
    -
    -#//!\name Used here
    -    class Qhull;
    -    class QhullPoint;
    -
    -#//!\name Defined here
    -    //! QhullHyperplane as an offset, dimension, and pointer to coordinates
    -    class QhullHyperplane;
    -    //! Java-style iterator for QhullHyperplane coordinates
    -    class QhullHyperplaneIterator;
    -
    -class QhullHyperplane { // Similar to QhullPoint
    -public:
    -#//!\name Subtypes
    -    typedef const coordT *                  iterator;
    -    typedef const coordT *                  const_iterator;
    -    typedef QhullHyperplane::iterator       Iterator;
    -    typedef QhullHyperplane::const_iterator ConstIterator;
    -
    -private:
    -#//!\name Fields
    -    coordT *            hyperplane_coordinates;  //!< Normal to hyperplane.   facetT.normal is normalized to 1.0
    -    QhullQh *           qh_qh;                  //!< qhT for distanceEpsilon() in operator==
    -    coordT              hyperplane_offset;      //!< Distance from hyperplane to origin
    -    int                 hyperplane_dimension;   //!< Dimension of hyperplane
    -
    -#//!\name Construct
    -public:
    -                        QhullHyperplane() : hyperplane_coordinates(0), qh_qh(0), hyperplane_offset(0.0), hyperplane_dimension(0) {}
    -    explicit            QhullHyperplane(const Qhull &q);
    -                        QhullHyperplane(const Qhull &q, int hyperplaneDimension, coordT *c, coordT hyperplaneOffset);
    -    explicit            QhullHyperplane(QhullQh *qqh) : hyperplane_coordinates(0), qh_qh(qqh), hyperplane_offset(0.0), hyperplane_dimension(0) {}
    -                        QhullHyperplane(QhullQh *qqh, int hyperplaneDimension, coordT *c, coordT hyperplaneOffset) : hyperplane_coordinates(c), qh_qh(qqh), hyperplane_offset(hyperplaneOffset), hyperplane_dimension(hyperplaneDimension) {}
    -                        // Creates an alias.  Does not copy the hyperplane's coordinates.  Needed for return by value and parameter passing.
    -                        QhullHyperplane(const QhullHyperplane &other)  : hyperplane_coordinates(other.hyperplane_coordinates), qh_qh(other.qh_qh), hyperplane_offset(other.hyperplane_offset), hyperplane_dimension(other.hyperplane_dimension) {}
    -                        // Creates an alias.  Does not copy the hyperplane's coordinates.  Needed for vector
    -    QhullHyperplane &   operator=(const QhullHyperplane &other) { hyperplane_coordinates= other.hyperplane_coordinates; qh_qh= other.qh_qh; hyperplane_offset= other.hyperplane_offset; hyperplane_dimension= other.hyperplane_dimension; return *this; }
    -                        ~QhullHyperplane() {}
    -
    -#//!\name Conversions --
    -//! Includes offset at end
    -#ifndef QHULL_NO_STL
    -    std::vector toStdVector() const;
    -#endif //QHULL_NO_STL
    -#ifdef QHULL_USES_QT
    -    QList       toQList() const;
    -#endif //QHULL_USES_QT
    -
    -#//!\name GetSet
    -public:
    -    const coordT *      coordinates() const { return hyperplane_coordinates; }
    -    coordT *            coordinates() { return hyperplane_coordinates; }
    -    void                defineAs(int hyperplaneDimension, coordT *c, coordT hyperplaneOffset) { QHULL_ASSERT(hyperplaneDimension>=0); hyperplane_coordinates= c; hyperplane_dimension= hyperplaneDimension; hyperplane_offset= hyperplaneOffset; }
    -    //! Creates an alias to other using the same qh_qh
    -    void                defineAs(QhullHyperplane &other) { hyperplane_coordinates= other.coordinates(); hyperplane_dimension= other.dimension();  hyperplane_offset= other.offset(); }
    -    int                 dimension() const { return hyperplane_dimension; }
    -    bool                isValid() const { return hyperplane_coordinates!=0 && hyperplane_dimension>0; }
    -    coordT              offset() const { return hyperplane_offset; }
    -    bool                operator==(const QhullHyperplane &other) const;
    -    bool                operator!=(const QhullHyperplane &other) const { return !operator==(other); }
    -    const coordT &      operator[](int idx) const { QHULL_ASSERT(idx>=0 && idx=0 && idx
    -#include 
    -#include 
    -#include 
    -
    -namespace orgQhull {
    -
    -#//!\name Defined here
    -    //! Only QHULL_DECLARE_SEQUENTIAL_ITERATOR is used in libqhullcpp.  The others need further development
    -    //! QHULL_DECLARE_SEQUENTIAL_ITERATOR(C) -- Declare a Java-style iterator
    -    //! QHULL_DECLARE_MUTABLE_SEQUENTIAL_ITERATOR(C) -- Declare a mutable Java-style iterator
    -    //! QHULL_DECLARE_SET_ITERATOR(C) -- Declare a set iterator
    -    //! QHULL_DECLARE_MUTABLE_SET_ITERATOR(C) -- Declare a mutable set iterator
    -    //! Derived from Qt/core/tools/qiterator.h and qset_r.h/FOREACHsetelement_()
    -
    -// Stores C* as done in Mutable...  Assumes the container is not deleted.
    -// C::const_iterator is an STL-style iterator that returns T&
    -#define QHULL_DECLARE_SEQUENTIAL_ITERATOR(C, T) \
    -    \
    -    class C##Iterator \
    -    { \
    -        typedef C::const_iterator const_iterator; \
    -        const C *c; \
    -        const_iterator i; \
    -        public: \
    -        inline C##Iterator(const C &container) \
    -        : c(&container), i(c->constBegin()) {} \
    -        inline C##Iterator &operator=(const C &container) \
    -        { c = &container; i = c->constBegin(); return *this; } \
    -        inline void toFront() { i = c->constBegin(); } \
    -        inline void toBack() { i = c->constEnd(); } \
    -        inline bool hasNext() const { return i != c->constEnd(); } \
    -        inline const T &next() { return *i++; } \
    -        inline const T &peekNext() const { return *i; } \
    -        inline bool hasPrevious() const { return i != c->constBegin(); } \
    -        inline const T &previous() { return *--i; } \
    -        inline const T &peekPrevious() const { const_iterator p = i; return *--p; } \
    -        inline bool findNext(const T &t) \
    -        { while (i != c->constEnd()) if (*i++ == t) return true; return false; } \
    -        inline bool findPrevious(const T &t) \
    -        { while (i != c->constBegin()) if (*(--i) == t) return true; \
    -        return false;  } \
    -    };//C##Iterator
    -
    -// Remove setShareable() from Q_DECLARE_MUTABLE_SEQUENTIAL_ITERATOR
    -// Uses QHULL_ASSERT (assert.h)
    -// Duplicated in MutablePointIterator without insert or remove
    -// Not used in libqhullcpp.  See Coordinates.h
    -#define QHULL_DECLARE_MUTABLE_SEQUENTIAL_ITERATOR(C, T) \
    -    class Mutable##C##Iterator \
    -    { \
    -        typedef C::iterator iterator; \
    -        typedef C::const_iterator const_iterator; \
    -        C *c; \
    -        iterator i, n; \
    -        inline bool item_exists() const { return const_iterator(n) != c->constEnd(); } \
    -        public: \
    -        inline Mutable##C##Iterator(C &container) \
    -        : c(&container) \
    -        { i = c->begin(); n = c->end(); } \
    -        inline ~Mutable##C##Iterator() \
    -        {} \
    -        inline Mutable##C##Iterator &operator=(C &container) \
    -        { c = &container; \
    -        i = c->begin(); n = c->end(); return *this; } \
    -        inline void toFront() { i = c->begin(); n = c->end(); } \
    -        inline void toBack() { i = c->end(); n = i; } \
    -        inline bool hasNext() const { return c->constEnd() != const_iterator(i); } \
    -        inline T &next() { n = i++; return *n; } \
    -        inline T &peekNext() const { return *i; } \
    -        inline bool hasPrevious() const { return c->constBegin() != const_iterator(i); } \
    -        inline T &previous() { n = --i; return *n; } \
    -        inline T &peekPrevious() const { iterator p = i; return *--p; } \
    -        inline void remove() \
    -        { if (c->constEnd() != const_iterator(n)) { i = c->erase(n); n = c->end(); } } \
    -        inline void setValue(const T &t) const { if (c->constEnd() != const_iterator(n)) *n = t; } \
    -        inline T &value() { QHULL_ASSERT(item_exists()); return *n; } \
    -        inline const T &value() const { QHULL_ASSERT(item_exists()); return *n; } \
    -        inline void insert(const T &t) { n = i = c->insert(i, t); ++i; } \
    -        inline bool findNext(const T &t) \
    -        { while (c->constEnd() != const_iterator(n = i)) if (*i++ == t) return true; return false; } \
    -        inline bool findPrevious(const T &t) \
    -        { while (c->constBegin() != const_iterator(i)) if (*(n = --i) == t) return true; \
    -        n = c->end(); return false;  } \
    -    };//Mutable##C##Iterator
    -
    -// Not used in libqhullcpp.
    -#define QHULL_DECLARE_SET_ITERATOR(C) \
    -\
    -    template  \
    -    class Qhull##C##Iterator \
    -    { \
    -        typedef typename Qhull##C::const_iterator const_iterator; \
    -        Qhull##C c; \
    -        const_iterator i; \
    -    public: \
    -        inline Qhull##C##Iterator(const Qhull##C &container) \
    -        : c(container), i(c.constBegin()) {} \
    -        inline Qhull##C##Iterator &operator=(const Qhull##C &container) \
    -        { c = container; i = c.constBegin(); return *this; } \
    -        inline void toFront() { i = c.constBegin(); } \
    -        inline void toBack() { i = c.constEnd(); } \
    -        inline bool hasNext() const { return i != c.constEnd(); } \
    -        inline const T &next() { return *i++; } \
    -        inline const T &peekNext() const { return *i; } \
    -        inline bool hasPrevious() const { return i != c.constBegin(); } \
    -        inline const T &previous() { return *--i; } \
    -        inline const T &peekPrevious() const { const_iterator p = i; return *--p; } \
    -        inline bool findNext(const T &t) \
    -        { while (i != c.constEnd()) if (*i++ == t) return true; return false; } \
    -        inline bool findPrevious(const T &t) \
    -        { while (i != c.constBegin()) if (*(--i) == t) return true; \
    -        return false;  } \
    -    };//Qhull##C##Iterator
    -
    -// Not used in libqhullcpp.
    -#define QHULL_DECLARE_MUTABLE_SET_ITERATOR(C) \
    -\
    -template  \
    -class QhullMutable##C##Iterator \
    -{ \
    -    typedef typename Qhull##C::iterator iterator; \
    -    typedef typename Qhull##C::const_iterator const_iterator; \
    -    Qhull##C *c; \
    -    iterator i, n; \
    -    inline bool item_exists() const { return const_iterator(n) != c->constEnd(); } \
    -public: \
    -    inline Mutable##C##Iterator(Qhull##C &container) \
    -        : c(&container) \
    -    { c->setSharable(false); i = c->begin(); n = c->end(); } \
    -    inline ~Mutable##C##Iterator() \
    -    { c->setSharable(true); } \
    -    inline Mutable##C##Iterator &operator=(Qhull##C &container) \
    -    { c->setSharable(true); c = &container; c->setSharable(false); \
    -      i = c->begin(); n = c->end(); return *this; } \
    -    inline void toFront() { i = c->begin(); n = c->end(); } \
    -    inline void toBack() { i = c->end(); n = i; } \
    -    inline bool hasNext() const { return c->constEnd() != const_iterator(i); } \
    -    inline T &next() { n = i++; return *n; } \
    -    inline T &peekNext() const { return *i; } \
    -    inline bool hasPrevious() const { return c->constBegin() != const_iterator(i); } \
    -    inline T &previous() { n = --i; return *n; } \
    -    inline T &peekPrevious() const { iterator p = i; return *--p; } \
    -    inline void remove() \
    -    { if (c->constEnd() != const_iterator(n)) { i = c->erase(n); n = c->end(); } } \
    -    inline void setValue(const T &t) const { if (c->constEnd() != const_iterator(n)) *n = t; } \
    -    inline T &value() { Q_ASSERT(item_exists()); return *n; } \
    -    inline const T &value() const { Q_ASSERT(item_exists()); return *n; } \
    -    inline void insert(const T &t) { n = i = c->insert(i, t); ++i; } \
    -    inline bool findNext(const T &t) \
    -    { while (c->constEnd() != const_iterator(n = i)) if (*i++ == t) return true; return false; } \
    -    inline bool findPrevious(const T &t) \
    -    { while (c->constBegin() != const_iterator(i)) if (*(n = --i) == t) return true; \
    -      n = c->end(); return false;  } \
    -};//QhullMutable##C##Iterator
    -
    -}//namespace orgQhull
    -
    -#endif // QHULLITERATOR_H
    -
    diff --git a/src/qhull/src/libqhullcpp/QhullLinkedList.h b/src/qhull/src/libqhullcpp/QhullLinkedList.h
    deleted file mode 100644
    index d4caf52c188..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullLinkedList.h
    +++ /dev/null
    @@ -1,388 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullLinkedList.h#7 $$Change: 2079 $
    -** $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#ifndef QHULLLINKEDLIST_H
    -#define QHULLLINKEDLIST_H
    -
    -#include "libqhull_r/qhull_ra.h"
    -#include "libqhullcpp/QhullError.h"
    -
    -#include   // ptrdiff_t, size_t
    -
    -#ifdef QHULL_USES_QT
    -#include 
    -#endif
    -
    -#ifndef QHULL_NO_STL
    -#include 
    -#include 
    -#include 
    -#endif
    -
    -namespace orgQhull {
    -
    -#//!\name Defined here
    -    //! QhullLinkedList -- A linked list modeled on QLinkedList.
    -    //!   T is an opaque type with T(B *b), b=t.getBaseT(), t=t.next(), and t=t.prev().  The end node is a sentinel.
    -    //!   QhullQh/qhT owns the contents.
    -    //!   QhullLinkedList does not define erase(), clear(), removeFirst(), removeLast(), pop_back(), pop_front(), fromStdList()
    -    //!   Derived from Qt/core/tools/qlinkedlist.h and libqhull_r.h/FORALLfacets_()
    -    //! QhullLinkedList::const_iterator -- STL-style iterator
    -    //! QhullLinkedList::iterator -- STL-style iterator
    -    //! QhullLinkedListIterator -- Java-style iterator
    -    //!   Derived from Qt/core/tools/qiterator.h
    -    //!   Works with Qt's foreach keyword [Qt/src/corelib/global/qglobal.h]
    -
    -template 
    -class QhullLinkedList
    -{
    -#//!\name Defined here
    -public:
    -    class const_iterator;
    -    class iterator;
    -    typedef const_iterator  ConstIterator;
    -    typedef iterator    Iterator;
    -    typedef ptrdiff_t   difference_type;
    -    typedef countT      size_type;
    -    typedef T           value_type;
    -    typedef const value_type *const_pointer;
    -    typedef const value_type &const_reference;
    -    typedef value_type *pointer;
    -    typedef value_type &reference;
    -
    -#//!\name Fields
    -private:
    -    T                   begin_node;
    -    T                   end_node;     //! Sentinel node at end of list
    -
    -#//!\name Constructors
    -public:
    -                        QhullLinkedList(T b, T e) : begin_node(b), end_node(e) {}
    -                        //! Copy constructor copies begin_node and end_node, but not the list elements.  Needed for return by value and parameter passing.
    -                        QhullLinkedList(const QhullLinkedList &other) : begin_node(other.begin_node), end_node(other.end_node) {}
    -                        //! Copy assignment copies begin_node and end_node, but not the list elements.
    -                        QhullLinkedList & operator=(const QhullLinkedList &other) { begin_node= other.begin_node; end_node= other.end_node; return *this; }
    -                        ~QhullLinkedList() {}
    -
    -private:
    -                        //!disabled since a sentinel must be allocated as the private type
    -                        QhullLinkedList() {}
    -
    -public:
    -
    -#//!\name Conversions
    -#ifndef QHULL_NO_STL
    -    std::vector      toStdVector() const;
    -#endif
    -#ifdef QHULL_USES_QT
    -    QList            toQList() const;
    -#endif
    -
    -#//!\name GetSet
    -    countT              count() const;
    -                        //count(t) under #//!\name Search
    -    bool                isEmpty() const { return (begin_node==end_node); }
    -    bool                operator==(const QhullLinkedList &o) const;
    -    bool                operator!=(const QhullLinkedList &o) const { return !operator==(o); }
    -    size_t              size() const { return count(); }
    -
    -#//!\name Element access
    -    //! For back() and last(), return T instead of T& (T is computed)
    -    const T             back() const { return last(); }
    -    T                   back() { return last(); }
    -    const T &           first() const { QHULL_ASSERT(!isEmpty()); return begin_node; }
    -    T &                 first() { QHULL_ASSERT(!isEmpty()); return begin_node; }
    -    const T &           front() const { return first(); }
    -    T &                 front() { return first(); }
    -    const T             last() const { QHULL_ASSERT(!isEmpty()); return *--end(); }
    -    T                   last() { QHULL_ASSERT(!isEmpty()); return *--end(); }
    -
    -#//!\name Modify -- Allocation of opaque types not implemented.
    -
    -#//!\name Search
    -    bool                contains(const T &t) const;
    -    countT              count(const T &t) const;
    -
    -#//!\name Iterator
    -    iterator            begin() { return begin_node; }
    -    const_iterator      begin() const { return begin_node; }
    -    const_iterator      constBegin() const { return begin_node; }
    -    const_iterator      constEnd() const { return end_node; }
    -    iterator            end() { return end_node; }
    -    const_iterator      end() const { return end_node; }
    -
    -    class iterator {
    -
    -    private:
    -        T               i;
    -        friend class const_iterator;
    -
    -    public:
    -        typedef std::bidirectional_iterator_tag  iterator_category;
    -        typedef T           value_type;
    -        typedef value_type *pointer;
    -        typedef value_type &reference;
    -        typedef ptrdiff_t   difference_type;
    -
    -                        iterator() : i() {}
    -                        iterator(const T &t) : i(t) {}  //!< Automatic conversion to iterator
    -                        iterator(const iterator &o) : i(o.i) {}
    -        iterator &      operator=(const iterator &o) { i= o.i; return *this; }
    -
    -        const T &       operator*() const { return i; }
    -        T &             operator*() { return i; }
    -        // Do not define operator[]
    -        const T *       operator->() const { return &i; }
    -        T *             operator->() { return &i; }
    -        bool            operator==(const iterator &o) const { return i == o.i; }
    -        bool            operator!=(const iterator &o) const { return !operator==(o); }
    -        bool            operator==(const const_iterator &o) const { return i==reinterpret_cast(o).i; }
    -        bool            operator!=(const const_iterator &o) const { return !operator==(o); }
    -        iterator &      operator++() { i= i.next(); return *this; }
    -        iterator        operator++(int) { iterator o= i; i= i.next(); return o; }
    -        iterator &      operator--() { i= i.previous(); return *this; }
    -        iterator        operator--(int) { iterator o= i; i= i.previous(); return o; }
    -        iterator        operator+(int j) const;
    -        iterator        operator-(int j) const { return operator+(-j); }
    -        iterator &      operator+=(int j) { return (*this= *this + j); }
    -        iterator &      operator-=(int j) { return (*this= *this - j); }
    -    };//QhullLinkedList::iterator
    -
    -    class const_iterator {
    -
    -    private:
    -        T               i;
    -
    -    public:
    -        typedef std::bidirectional_iterator_tag  iterator_category;
    -        typedef T                 value_type;
    -        typedef const value_type *pointer;
    -        typedef const value_type &reference;
    -        typedef ptrdiff_t         difference_type;
    -
    -                        const_iterator() : i() {}
    -                        const_iterator(const T &t) : i(t) {}  //!< Automatic conversion to const_iterator
    -                        const_iterator(const iterator &o) : i(o.i) {}
    -                        const_iterator(const const_iterator &o) : i(o.i) {}
    -        const_iterator &operator=(const const_iterator &o) { i= o.i; return *this; }
    -
    -        const T &       operator*() const { return i; }
    -        const T *       operator->() const { return i; }
    -        bool            operator==(const const_iterator &o) const { return i == o.i; }
    -        bool            operator!=(const const_iterator &o) const { return !operator==(o); }
    -                        // No comparisons or iterator diff
    -        const_iterator &operator++() { i= i.next(); return *this; }
    -        const_iterator  operator++(int) { const_iterator o= i; i= i.next(); return o; }
    -        const_iterator &operator--() { i= i.previous(); return *this; }
    -        const_iterator  operator--(int) { const_iterator o= i; i= i.previous(); return o; }
    -        const_iterator  operator+(int j) const;
    -        const_iterator  operator-(int j) const { return operator+(-j); }
    -        const_iterator &operator+=(int j) { return (*this= *this + j); }
    -        const_iterator &operator-=(int j) { return (*this= *this - j); }
    -    };//QhullLinkedList::const_iterator
    -
    -};//QhullLinkedList
    -
    -template 
    -class QhullLinkedListIterator // FIXUP QH11016 define QhullMutableLinkedListIterator
    -{
    -    typedef typename QhullLinkedList::const_iterator const_iterator;
    -    const QhullLinkedList *c;
    -    const_iterator      i;
    -
    -public:
    -                        QhullLinkedListIterator(const QhullLinkedList &container) : c(&container), i(c->constBegin()) {}
    -    QhullLinkedListIterator & operator=(const QhullLinkedList &container) { c= &container; i= c->constBegin(); return *this; }
    -    bool                findNext(const T &t);
    -    bool                findPrevious(const T &t);
    -    bool                hasNext() const { return i != c->constEnd(); }
    -    bool                hasPrevious() const { return i != c->constBegin(); }
    -    T                   next() { return *i++; }
    -    T                   peekNext() const { return *i; }
    -    T                   peekPrevious() const { const_iterator p= i; return *--p; }
    -    T                   previous() { return *--i; }
    -    void                toFront() { i= c->constBegin(); }
    -    void                toBack() { i= c->constEnd(); }
    -};//QhullLinkedListIterator
    -
    -#//!\name == Definitions =========================================
    -
    -#//!\name Conversion
    -
    -#ifndef QHULL_NO_STL
    -template 
    -std::vector QhullLinkedList::
    -toStdVector() const
    -{
    -    std::vector tmp;
    -    std::copy(constBegin(), constEnd(), std::back_inserter(tmp));
    -    return tmp;
    -}//toStdVector
    -#endif
    -
    -#ifdef QHULL_USES_QT
    -template 
    -QList  QhullLinkedList::
    -toQList() const
    -{
    -    QhullLinkedListIterator i(*this);
    -    QList ls;
    -    while(i.hasNext()){
    -        ls.append(i.next());
    -    }
    -    return ls;
    -}//toQList
    -#endif
    -
    -#//!\name GetSet
    -
    -template 
    -countT QhullLinkedList::
    -count() const
    -{
    -    const_iterator i= begin_node;
    -    countT c= 0;
    -    while(i != end_node){
    -        c++;
    -        i++;
    -    }
    -    return c;
    -}//count
    -
    -#//!\name Search
    -
    -template 
    -bool QhullLinkedList::
    -contains(const T &t) const
    -{
    -    const_iterator i= begin_node;
    -    while(i != end_node){
    -        if(i==t){
    -            return true;
    -        }
    -        i++;
    -    }
    -    return false;
    -}//contains
    -
    -template 
    -countT QhullLinkedList::
    -count(const T &t) const
    -{
    -    const_iterator i= begin_node;
    -    countT c= 0;
    -    while(i != end_node){
    -        if(i==t){
    -            c++;
    -        }
    -        i++;
    -    }
    -    return c;
    -}//count
    -
    -template 
    -bool QhullLinkedList::
    -operator==(const QhullLinkedList &l) const
    -{
    -    if(begin_node==l.begin_node){
    -        return (end_node==l.end_node);
    -    }
    -    T i= begin_node;
    -    T il= l.begin_node;
    -    while(i != end_node){
    -        if(i != il){
    -            return false;
    -        }
    -        i= static_cast(i.next());
    -        il= static_cast(il.next());
    -    }
    -    if(il != l.end_node){
    -        return false;
    -    }
    -    return true;
    -}//operator==
    -
    -#//!\name Iterator
    -
    -template 
    -typename QhullLinkedList::iterator  QhullLinkedList::iterator::
    -operator+(int j) const
    -{
    -    T n= i;
    -    if(j>0){
    -        while(j--){
    -            n= n.next();
    -        }
    -    }else{
    -        while(j++){
    -            n= n.previous();
    -        }
    -    }
    -    return iterator(n);
    -}//operator+
    -
    -template 
    -typename QhullLinkedList::const_iterator  QhullLinkedList::const_iterator::
    -operator+(int j) const
    -{
    -    T n= i;
    -    if(j>0){
    -        while(j--){
    -            n= n.next();
    -        }
    -    }else{
    -        while(j++){
    -            n= n.previous();
    -        }
    -    }
    -    return const_iterator(n);
    -}//operator+
    -
    -#//!\name QhullLinkedListIterator
    -
    -template 
    -bool QhullLinkedListIterator::
    -findNext(const T &t)
    -{
    -    while(i != c->constEnd()){
    -        if (*i++ == t){
    -            return true;
    -        }
    -    }
    -    return false;
    -}//findNext
    -
    -template 
    -bool QhullLinkedListIterator::
    -findPrevious(const T &t)
    -{
    -    while(i!=c->constBegin()){
    -        if(*(--i)==t){
    -            return true;
    -        }
    -    }
    -    return false;
    -}//findNext
    -
    -}//namespace orgQhull
    -
    -#//!\name Global
    -
    -template 
    -std::ostream &
    -operator<<(std::ostream &os, const orgQhull::QhullLinkedList &qs)
    -{
    -    typename orgQhull::QhullLinkedList::const_iterator i;
    -    for(i= qs.begin(); i != qs.end(); ++i){
    -        os << *i;
    -    }
    -    return os;
    -}//operator<<
    -
    -#endif // QHULLLINKEDLIST_H
    -
    diff --git a/src/qhull/src/libqhullcpp/QhullPoint.cpp b/src/qhull/src/libqhullcpp/QhullPoint.cpp
    deleted file mode 100644
    index f5e91246092..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullPoint.cpp
    +++ /dev/null
    @@ -1,203 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullPoint.cpp#3 $$Change: 2066 $
    -** $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#include "libqhullcpp/QhullPoint.h"
    -
    -#include "libqhullcpp/QhullError.h"
    -#include "libqhullcpp/Qhull.h"
    -
    -#include 
    -#include 
    -
    -#ifdef _MSC_VER  // Microsoft Visual C++ -- warning level 4
    -#endif
    -
    -namespace orgQhull {
    -
    -#//!\name Constructors
    -
    -
    -QhullPoint::
    -QhullPoint(const Qhull &q) 
    -: point_coordinates(0)
    -, qh_qh(q.qh())
    -, point_dimension(q.hullDimension())
    -{
    -}//QhullPoint
    -
    -QhullPoint::
    -QhullPoint(const Qhull &q, coordT *c) 
    -: point_coordinates(c)
    -, qh_qh(q.qh())
    -, point_dimension(q.hullDimension())
    -{
    -    QHULL_ASSERT(q.hullDimension()>0);
    -}//QhullPoint dim, coordT
    -
    -QhullPoint::
    -QhullPoint(const Qhull &q, int pointDimension, coordT *c) 
    -: point_coordinates(c)
    -, qh_qh(q.qh())
    -, point_dimension(pointDimension)
    -{
    -}//QhullPoint dim, coordT
    -
    -//! QhullPoint of Coordinates with point_dimension==c.count()
    -QhullPoint::
    -QhullPoint(const Qhull &q, Coordinates &c) 
    -: point_coordinates(c.data())
    -, qh_qh(q.qh())
    -, point_dimension(c.count())
    -{
    -}//QhullPoint Coordinates
    -
    -#//!\name Conversions
    -
    -// See qt-qhull.cpp for QList conversion
    -
    -#ifndef QHULL_NO_STL
    -std::vector QhullPoint::
    -toStdVector() const
    -{
    -    QhullPointIterator i(*this);
    -    std::vector vs;
    -    while(i.hasNext()){
    -        vs.push_back(i.next());
    -    }
    -    return vs;
    -}//toStdVector
    -#endif //QHULL_NO_STL
    -
    -#//!\name GetSet
    -
    -//! QhullPoint is equal if it has the same address and dimension
    -//! If !qh_qh, returns true if dimension and coordinates are equal
    -//! If qh_qh, returns true if the distance between points is less than qh_qh->distanceEpsilon()
    -//!\todo Compares distance with distance-to-hyperplane (distanceEpsilon).   Is that correct?
    -bool QhullPoint::
    -operator==(const QhullPoint &other) const
    -{
    -    if(point_dimension!=other.point_dimension){
    -        return false;
    -    }
    -    const coordT *c= point_coordinates;
    -    const coordT *c2= other.point_coordinates;
    -    if(c==c2){
    -        return true;
    -    }
    -    if(!c || !c2){
    -        return false;
    -    }
    -    if(!qh_qh || qh_qh->hull_dim==0){
    -        for(int k= point_dimension; k--; ){
    -            if(*c++ != *c2++){
    -                return false;
    -            }
    -        }
    -        return true;
    -    }
    -    double dist2= 0.0;
    -    for(int k= point_dimension; k--; ){
    -        double diff= *c++ - *c2++;
    -        dist2 += diff*diff;
    -    }
    -    dist2= sqrt(dist2);
    -    return (dist2 < qh_qh->distanceEpsilon());
    -}//operator==
    -
    -#//!\name Methods
    -
    -//! Return distance between two points.
    -double QhullPoint::
    -distance(const QhullPoint &p) const
    -{
    -    const coordT *c= point_coordinates;
    -    const coordT *c2= p.point_coordinates;
    -    int dim= point_dimension;
    -    if(dim!=p.point_dimension){
    -        throw QhullError(10075, "QhullPoint error: Expecting dimension %d for distance().  Got %d", dim, p.point_dimension);
    -    }
    -    if(!c || !c2){
    -        throw QhullError(10076, "QhullPoint error: Cannot compute distance() for undefined point");
    -    }
    -    double dist;
    -
    -    switch(dim){
    -  case 2:
    -      dist= (c[0]-c2[0])*(c[0]-c2[0]) + (c[1]-c2[1])*(c[1]-c2[1]);
    -      break;
    -  case 3:
    -      dist= (c[0]-c2[0])*(c[0]-c2[0]) + (c[1]-c2[1])*(c[1]-c2[1]) + (c[2]-c2[2])*(c[2]-c2[2]);
    -      break;
    -  case 4:
    -      dist= (c[0]-c2[0])*(c[0]-c2[0]) + (c[1]-c2[1])*(c[1]-c2[1]) + (c[2]-c2[2])*(c[2]-c2[2]) + (c[3]-c2[3])*(c[3]-c2[3]);
    -      break;
    -  case 5:
    -      dist= (c[0]-c2[0])*(c[0]-c2[0]) + (c[1]-c2[1])*(c[1]-c2[1]) + (c[2]-c2[2])*(c[2]-c2[2]) + (c[3]-c2[3])*(c[3]-c2[3]) + (c[4]-c2[4])*(c[4]-c2[4]);
    -      break;
    -  case 6:
    -      dist= (c[0]-c2[0])*(c[0]-c2[0]) + (c[1]-c2[1])*(c[1]-c2[1]) + (c[2]-c2[2])*(c[2]-c2[2]) + (c[3]-c2[3])*(c[3]-c2[3]) + (c[4]-c2[4])*(c[4]-c2[4]) + (c[5]-c2[5])*(c[5]-c2[5]);
    -      break;
    -  case 7:
    -      dist= (c[0]-c2[0])*(c[0]-c2[0]) + (c[1]-c2[1])*(c[1]-c2[1]) + (c[2]-c2[2])*(c[2]-c2[2]) + (c[3]-c2[3])*(c[3]-c2[3]) + (c[4]-c2[4])*(c[4]-c2[4]) + (c[5]-c2[5])*(c[5]-c2[5]) + (c[6]-c2[6])*(c[6]-c2[6]);
    -      break;
    -  case 8:
    -      dist= (c[0]-c2[0])*(c[0]-c2[0]) + (c[1]-c2[1])*(c[1]-c2[1]) + (c[2]-c2[2])*(c[2]-c2[2]) + (c[3]-c2[3])*(c[3]-c2[3]) + (c[4]-c2[4])*(c[4]-c2[4]) + (c[5]-c2[5])*(c[5]-c2[5]) + (c[6]-c2[6])*(c[6]-c2[6]) + (c[7]-c2[7])*(c[7]-c2[7]);
    -      break;
    -  default:
    -      dist= 0.0;
    -      for(int k=dim; k--; ){
    -          dist += (*c - *c2) * (*c - *c2);
    -          ++c;
    -          ++c2;
    -      }
    -      break;
    -    }
    -    return sqrt(dist);
    -}//distance
    -
    -}//namespace orgQhull
    -
    -#//!\name Global functions
    -
    -using std::ostream;
    -using orgQhull::QhullPoint;
    -
    -//! Same as qh_printpointid [io.c]
    -ostream &
    -operator<<(ostream &os, const QhullPoint::PrintPoint &pr)
    -{
    -    QhullPoint p= *pr.point; 
    -    countT i= p.id();
    -    if(pr.point_message){
    -        if(*pr.point_message){
    -            os << pr.point_message << " ";
    -        }
    -        if(pr.with_identifier && (i!=qh_IDunknown) && (i!=qh_IDnone)){
    -            os << "p" << i << ": ";
    -        }
    -    }
    -    const realT *c= p.coordinates();
    -    for(int k=p.dimension(); k--; ){
    -        realT r= *c++;
    -        if(pr.point_message){
    -            os << " " << r; // FIXUP QH11010 %8.4g
    -        }else{
    -            os << " " << r; // FIXUP QH11010 qh_REAL_1
    -        }
    -    }
    -    os << std::endl;
    -    return os;
    -}//printPoint
    -
    -ostream & 
    -operator<<(ostream &os, const QhullPoint &p)
    -{
    -    os << p.print(""); 
    -    return os;
    -}//operator<<
    diff --git a/src/qhull/src/libqhullcpp/QhullPoint.h b/src/qhull/src/libqhullcpp/QhullPoint.h
    deleted file mode 100644
    index 17f94ab3642..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullPoint.h
    +++ /dev/null
    @@ -1,136 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullPoint.h#4 $$Change: 2079 $
    -** $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#ifndef QHPOINT_H
    -#define QHPOINT_H
    -
    -#include "libqhull_r/qhull_ra.h"
    -#include "libqhullcpp/QhullError.h"
    -#include "libqhullcpp/QhullIterator.h"
    -#include "libqhullcpp/QhullQh.h"
    -#include "libqhullcpp/Coordinates.h"
    -
    -#include 
    -
    -namespace orgQhull {
    -
    -#//!\name Defined here
    -    class QhullPoint;  //!<  QhullPoint as a pointer and dimension to shared memory
    -    class QhullPointIterator; //!< Java-style iterator for QhullPoint coordinates
    -
    -#//!\name Used here
    -    class Qhull;
    -
    -//! A QhullPoint is a dimension and an array of coordinates.
    -//! With Qhull/QhullQh, a QhullPoint has an identifier.  Point equality is relative to qh.distanceEpsilon
    -class QhullPoint {
    -
    -#//!\name Iterators
    -public:
    -    typedef coordT *                    base_type;  // for QhullPointSet
    -    typedef const coordT *              iterator;
    -    typedef const coordT *              const_iterator;
    -    typedef QhullPoint::iterator        Iterator;
    -    typedef QhullPoint::const_iterator  ConstIterator;
    -
    -#//!\name Fields
    -protected: // For QhullPoints::iterator, QhullPoints::const_iterator
    -    coordT *            point_coordinates;  //!< Pointer to first coordinate,   0 if undefined
    -    QhullQh *           qh_qh;              //!< qhT for this instance of Qhull.  0 if undefined.
    -                                            //!< operator==() returns true if points within sqrt(qh_qh->distanceEpsilon())
    -                                            //!< If !qh_qh, id() is -3, and operator==() requires equal coordinates
    -    int                 point_dimension;    //!< Default dimension is qh_qh->hull_dim
    -public:
    -
    -#//!\name Constructors
    -    //! QhullPoint, PointCoordinates, and QhullPoints have similar constructors
    -    //! If Qhull/QhullQh is not initialized, then QhullPoint.dimension() is zero unless explicitly set
    -    //! Cannot define QhullPoints(int pointDimension) since it is ambiguous with QhullPoints(QhullQh *qqh)
    -                        QhullPoint() : point_coordinates(0), qh_qh(0), point_dimension(0) {}
    -                        QhullPoint(int pointDimension, coordT *c) : point_coordinates(c), qh_qh(0), point_dimension(pointDimension) { QHULL_ASSERT(pointDimension>0); }
    -    explicit            QhullPoint(const Qhull &q);
    -                        QhullPoint(const Qhull &q, coordT *c);
    -                        QhullPoint(const Qhull &q, Coordinates &c);
    -                        QhullPoint(const Qhull &q, int pointDimension, coordT *c);
    -    explicit            QhullPoint(QhullQh *qqh) : point_coordinates(0), qh_qh(qqh), point_dimension(qqh->hull_dim) {}
    -                        QhullPoint(QhullQh *qqh, coordT *c) : point_coordinates(c), qh_qh(qqh), point_dimension(qqh->hull_dim) { QHULL_ASSERT(qqh->hull_dim>0); }
    -                        QhullPoint(QhullQh *qqh, Coordinates &c) : point_coordinates(c.data()), qh_qh(qqh), point_dimension(c.count()) {}
    -                        QhullPoint(QhullQh *qqh, int pointDimension, coordT *c) : point_coordinates(c), qh_qh(qqh), point_dimension(pointDimension) {}
    -                        //! Creates an alias.  Does not make a deep copy of the point.  Needed for return by value and parameter passing.
    -                        QhullPoint(const QhullPoint &other) : point_coordinates(other.point_coordinates), qh_qh(other.qh_qh), point_dimension(other.point_dimension) {}
    -                        //! Creates an alias.  Does not make a deep copy of the point.  Needed for vector
    -    QhullPoint &        operator=(const QhullPoint &other) { point_coordinates= other.point_coordinates; qh_qh= other.qh_qh; point_dimension= other.point_dimension; return *this; }
    -                        ~QhullPoint() {}
    -
    -
    -#//!\name Conversions
    -
    -#ifndef QHULL_NO_STL
    -    std::vector toStdVector() const;
    -#endif //QHULL_NO_STL
    -#ifdef QHULL_USES_QT
    -    QList       toQList() const;
    -#endif //QHULL_USES_QT
    -
    -#//!\name GetSet
    -public:
    -    const coordT *      coordinates() const { return point_coordinates; }  //!< 0 if undefined
    -    coordT *            coordinates() { return point_coordinates; }        //!< 0 if undefined
    -    void                defineAs(coordT *c) { QHULL_ASSERT(point_dimension>0); point_coordinates= c; }
    -    void                defineAs(int pointDimension, coordT *c) { QHULL_ASSERT(pointDimension>=0); point_coordinates= c; point_dimension= pointDimension; }
    -    void                defineAs(QhullPoint &other) { point_coordinates= other.point_coordinates; qh_qh= other.qh_qh; point_dimension= other.point_dimension; }
    -    int                 dimension() const { return point_dimension; }
    -    coordT *            getBaseT() const { return point_coordinates; } // for QhullPointSet
    -    countT              id() const { return qh_pointid(qh_qh, point_coordinates); } // NOerrors
    -    bool                isValid() const { return (point_coordinates!=0 && point_dimension>0); };
    -    bool                operator==(const QhullPoint &other) const;
    -    bool                operator!=(const QhullPoint &other) const { return ! operator==(other); }
    -    const coordT &      operator[](int idx) const { QHULL_ASSERT(point_coordinates!=0 && idx>=0 && idx=0 && idx
    -#include 
    -
    -#ifdef _MSC_VER  // Microsoft Visual C++ -- warning level 4
    -#endif
    -
    -namespace orgQhull {
    -
    -// Implemented via QhullSet.h
    -
    -}//namespace orgQhull
    -
    -#//!\name Global functions
    -
    -using std::endl;
    -using std::ostream;
    -using orgQhull::QhullPoint;
    -using orgQhull::QhullPointSet;
    -using orgQhull::QhullPointSetIterator;
    -
    -ostream &
    -operator<<(ostream &os, const QhullPointSet::PrintIdentifiers &pr)
    -{
    -    os << pr.print_message;
    -    const QhullPointSet s= *pr.point_set;
    -    QhullPointSetIterator i(s);
    -    while(i.hasNext()){
    -        if(i.hasPrevious()){
    -            os << " ";
    -        }
    -        const QhullPoint point= i.next();
    -        countT id= point.id();
    -        os << "p" << id;
    -
    -    }
    -    os << endl;
    -    return os;
    -}//PrintIdentifiers
    -
    -ostream &
    -operator<<(ostream &os, const QhullPointSet::PrintPointSet &pr)
    -{
    -    os << pr.print_message;
    -    const QhullPointSet s= *pr.point_set;
    -    for(QhullPointSet::const_iterator i=s.begin(); i != s.end(); ++i){
    -        const QhullPoint point= *i;
    -        os << point;
    -    }
    -    return os;
    -}//printPointSet
    -
    -
    diff --git a/src/qhull/src/libqhullcpp/QhullPointSet.h b/src/qhull/src/libqhullcpp/QhullPointSet.h
    deleted file mode 100644
    index 8562e170ea8..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullPointSet.h
    +++ /dev/null
    @@ -1,77 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullPointSet.h#4 $$Change: 2079 $
    -** $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#ifndef QHULLPOINTSET_H
    -#define QHULLPOINTSET_H
    -
    -#include "libqhull_r/qhull_ra.h"
    -#include "libqhullcpp/QhullSet.h"
    -#include "libqhullcpp/QhullPoint.h"
    -
    -#include 
    -
    -namespace orgQhull {
    -
    -#//!\name Used here
    -    class Qhull;
    -    class QhullPoint;
    -
    -#//!\name Defined here
    -    //! QhullPointSet -- a set of coordinate pointers with input dimension
    -    // with const_iterator and iterator
    -    class QhullPointSet;
    -
    -class QhullPointSet : public QhullSet {
    -
    -private:
    -#//!\name Fields
    -    // no fields
    -public:
    -
    -#//!\name Construct
    -                        QhullPointSet(const Qhull &q, setT *s) : QhullSet(q, s) {}
    -                        //Conversion from setT* is not type-safe.  Implicit conversion for void* to T
    -                        QhullPointSet(QhullQh *qqh, setT *s) : QhullSet(qqh, s) {}
    -                        //Copy constructor copies pointer but not contents.  Needed for return by value and parameter passing.
    -                        QhullPointSet(const QhullPointSet &other) : QhullSet(other) {}
    -                        //!Assignment copies pointers but not contents.
    -    QhullPointSet &     operator=(const QhullPointSet &other) { QhullSet::operator=(other); return *this; }
    -                        ~QhullPointSet() {}
    -
    -                        //!Default constructor disabled.
    -private:
    -                        QhullPointSet();
    -public:
    -
    -#//!\name IO
    -    struct PrintIdentifiers{
    -        const QhullPointSet *point_set;
    -        const char *    print_message; //!< non-null message
    -        PrintIdentifiers(const char *message, const QhullPointSet *s) : point_set(s), print_message(message) {}
    -    };//PrintIdentifiers
    -    PrintIdentifiers printIdentifiers(const char *message) const { return PrintIdentifiers(message, this); }
    -
    -    struct PrintPointSet{
    -        const QhullPointSet *point_set;
    -        const char *    print_message;  //!< non-null message
    -        PrintPointSet(const char *message, const QhullPointSet &s) : point_set(&s), print_message(message) {}
    -    };//PrintPointSet
    -    PrintPointSet       print(const char *message) const { return PrintPointSet(message, *this); }
    -
    -};//QhullPointSet
    -
    -typedef QhullSetIterator  QhullPointSetIterator;
    -
    -}//namespace orgQhull
    -
    -#//!\name Global
    -
    -std::ostream &operator<<(std::ostream &os, const orgQhull::QhullPointSet::PrintIdentifiers &pr);
    -std::ostream &operator<<(std::ostream &os, const orgQhull::QhullPointSet::PrintPointSet &pr);
    -
    -#endif // QHULLPOINTSET_H
    diff --git a/src/qhull/src/libqhullcpp/QhullPoints.cpp b/src/qhull/src/libqhullcpp/QhullPoints.cpp
    deleted file mode 100644
    index 2320b5007a5..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullPoints.cpp
    +++ /dev/null
    @@ -1,320 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullPoints.cpp#3 $$Change: 2066 $
    -** $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#include "libqhullcpp/QhullPoints.h"
    -
    -#include "libqhullcpp/Qhull.h"
    -
    -#include 
    -
    -#ifndef QHULL_NO_STL
    -#include 
    -#endif
    -
    -#ifdef _MSC_VER  // Microsoft Visual C++ -- warning level 4
    -#endif
    -
    -namespace orgQhull {
    -
    -#//!\name Constructors
    -
    -QhullPoints::
    -QhullPoints(const Qhull &q)
    -: point_first(0)
    -, point_end(0)
    -, qh_qh(q.qh())
    -, point_dimension(q.hullDimension())
    -{
    -}//QhullPoints Qhull
    -
    -QhullPoints::
    -QhullPoints(const Qhull &q, countT coordinateCount2, coordT *c)
    -: point_first(c)
    -, point_end(c+coordinateCount2)
    -, qh_qh(q.qh())
    -, point_dimension(q.hullDimension())
    -{
    -    QHULL_ASSERT(q.hullDimension());
    -    QHULL_ASSERT(coordinateCount2>=0);
    -}//QhullPoints Qhull dim
    -
    -QhullPoints::
    -QhullPoints(const Qhull &q, int pointDimension, countT coordinateCount2, coordT *c)
    -: point_first(c)
    -, point_end(c+coordinateCount2)
    -, qh_qh(q.qh())
    -, point_dimension(pointDimension)
    -{
    -    QHULL_ASSERT(pointDimension>=0);
    -    QHULL_ASSERT(coordinateCount2>=0);
    -}//QhullPoints Qhull dim coordT
    -
    -QhullPoints::
    -QhullPoints(QhullQh *qqh, int pointDimension, countT coordinateCount2, coordT *c)
    -: point_first(c)
    -, point_end(c+coordinateCount2)
    -, qh_qh(qqh)
    -, point_dimension(pointDimension)
    -{
    -    QHULL_ASSERT(pointDimension>=0);
    -    QHULL_ASSERT(coordinateCount2>=0);
    -}//QhullPoints QhullQh dim coordT
    -
    -#//!\name Conversions
    -// See qt-qhull.cpp for QList conversion
    -
    -#ifndef QHULL_NO_STL
    -std::vector QhullPoints::
    -toStdVector() const
    -{
    -    QhullPointsIterator i(*this);
    -    std::vector vs;
    -    while(i.hasNext()){
    -        vs.push_back(i.next());
    -    }
    -    return vs;
    -}//toStdVector
    -#endif //QHULL_NO_STL
    -
    -#//!\name GetSet
    -
    -countT QhullPoints::
    -extraCoordinatesCount() const
    -{
    -    if(point_dimension>0){
    -        return (countT)((point_end-point_first)%(size_t)point_dimension);
    -    }
    -    return 0;
    -}//extraCoordinatesCount
    -
    -//! QhullPoints is equal if the same address, or if the coordinates are identical
    -//! Use QhullPoint.operator==() for DISTround equality
    -bool QhullPoints::
    -operator==(const QhullPoints &other) const
    -{
    -    if((point_end-point_first) != (other.point_end-other.point_first)){
    -        return false;
    -    }
    -    if(point_dimension!=other.point_dimension){
    -        return false;
    -    }
    -    if(point_first==other.point_first){
    -        return true;
    -    }
    -    if(!qh_qh || qh_qh->hull_dim==0){
    -        const coordT *c= point_first;
    -        const coordT *c2= other.point_first;
    -        while(chull_dim : 0);
    -    point_first= 0;
    -    point_end= 0;
    -}//resetQhullQh
    -
    -QhullPoint QhullPoints::
    -value(countT idx) const
    -{
    -    QhullPoint p(qh_qh);
    -    if(idx>=0 && idx=0 && idx=n){
    -        n= 0;
    -    }else if(length<0 || idx+length>=n){
    -        n -= idx;
    -    }else{
    -        n -= idx+length;
    -    }
    -    return QhullPoints(qh_qh, point_dimension, n*point_dimension, point_first+idx*point_dimension);
    -}//mid
    -
    -#//!\name QhullPointsIterator
    -
    -bool QhullPointsIterator::
    -findNext(const QhullPoint &p)
    -{
    -    while(i!=ps->constEnd()){
    -        if(*i++ == p){
    -            return true;
    -        }
    -    }
    -    return false;
    -}//findNext
    -
    -bool QhullPointsIterator::
    -findPrevious(const QhullPoint &p)
    -{
    -    while(i!=ps->constBegin()){
    -        if(*--i == p){
    -            return true;
    -        }
    -    }
    -    return false;
    -}//findPrevious
    -
    -}//namespace orgQhull
    -
    -#//!\name Global functions
    -
    -using std::ostream;
    -using orgQhull::QhullPoint;
    -using orgQhull::QhullPoints;
    -using orgQhull::QhullPointsIterator;
    -
    -ostream &
    -operator<<(ostream &os, const QhullPoints &p)
    -{
    -    QhullPointsIterator i(p);
    -    while(i.hasNext()){
    -        os << i.next();
    -    }
    -    return os;
    -}//operator<  // ptrdiff_t, size_t
    -#include 
    -
    -namespace orgQhull {
    -
    -#//!\name Defined here
    -    class QhullPoints;          //!< One or more points Coordinate pointers with dimension and iterators
    -    class QhullPointsIterator;  //!< Java-style iterator
    -
    -//! QhullPoints are an array of QhullPoint as pointers into an array of coordinates.
    -//! For Qhull/QhullQh, QhullPoints must use hull_dim.  Can change QhullPoint to input_dim if needed for Delaunay input site
    -class QhullPoints {
    -
    -private:
    -#//!\name Fields
    -    coordT *            point_first; //!< First coordinate of an array of points of point_dimension
    -    coordT *            point_end;   //!< End of point coordinates (end>=first).  Trailing coordinates ignored
    -    QhullQh *           qh_qh;       //!< Maybe initialized NULL to allow ownership by RboxPoints
    -                                     //!< qh_qh used for QhullPoint() and qh_qh->hull_dim in constructor
    -    int                 point_dimension;  //!< Dimension, >=0
    -
    -public:
    -#//!\name Subtypes
    -    class const_iterator;
    -    class iterator;
    -    typedef QhullPoints::const_iterator ConstIterator;
    -    typedef QhullPoints::iterator       Iterator;
    -
    -#//!\name Construct
    -    //! QhullPoint, PointCoordinates, and QhullPoints have similar constructors
    -    //! If Qhull/QhullQh is not initialized, then QhullPoints.dimension() is zero unless explicitly set
    -    //! Cannot define QhullPoints(int pointDimension) since it is ambiguous with QhullPoints(QhullQh *qqh)
    -                        QhullPoints() : point_first(0), point_end(0), qh_qh(0), point_dimension(0) { }
    -                        QhullPoints(int pointDimension, countT coordinateCount2, coordT *c) : point_first(c), point_end(c+coordinateCount2), qh_qh(0), point_dimension(pointDimension) { QHULL_ASSERT(pointDimension>=0); }
    -    explicit            QhullPoints(const Qhull &q);
    -                        QhullPoints(const Qhull &q, countT coordinateCount2, coordT *c);
    -                        QhullPoints(const Qhull &q, int pointDimension, countT coordinateCount2, coordT *c);
    -    explicit            QhullPoints(QhullQh *qqh) : point_first(0), point_end(0), qh_qh(qqh), point_dimension(qqh ? qqh->hull_dim : 0) { }
    -                        QhullPoints(QhullQh *qqh, countT coordinateCount2, coordT *c) : point_first(c), point_end(c+coordinateCount2), qh_qh(qqh), point_dimension(qqh ? qqh->hull_dim : 0) { QHULL_ASSERT(qqh && qqh->hull_dim>0); }
    -                        QhullPoints(QhullQh *qqh, int pointDimension, countT coordinateCount2, coordT *c);
    -                        //! Copy constructor copies pointers but not contents.  Needed for return by value and parameter passing.
    -                        QhullPoints(const QhullPoints &other)  : point_first(other.point_first), point_end(other.point_end), qh_qh(other.qh_qh), point_dimension(other.point_dimension) {}
    -    QhullPoints &       operator=(const QhullPoints &other) { point_first= other.point_first; point_end= other.point_end; qh_qh= other.qh_qh; point_dimension= other.point_dimension; return *this; }
    -                        ~QhullPoints() {}
    -
    -public:
    -
    -#//!\name Conversion
    -
    -#ifndef QHULL_NO_STL
    -    std::vector toStdVector() const;
    -#endif //QHULL_NO_STL
    -#ifdef QHULL_USES_QT
    -    QList   toQList() const;
    -#endif //QHULL_USES_QT
    -
    -#//!\name GetSet
    -    // Constructs QhullPoint.  Cannot return reference.
    -    const QhullPoint    at(countT idx) const { /* point_first==0 caught by point_end assert */ coordT *p= point_first+idx*point_dimension; QHULL_ASSERT(p=0 && coordinatesCount>=0 && c!=0); point_first= c; point_end= c+coordinatesCount; point_dimension= pointDimension; }
    -    void                defineAs(countT coordinatesCount, coordT *c) { QHULL_ASSERT((point_dimension>0 && coordinatesCount>=0 && c!=0) || (c==0 && coordinatesCount==0)); point_first= c; point_end= c+coordinatesCount; }
    -    void                defineAs(const QhullPoints &other) { point_first= other.point_first; point_end= other.point_end; qh_qh= other.qh_qh; point_dimension= other.point_dimension; }
    -    int                 dimension() const { return point_dimension; }
    -    ConstIterator       end() const { return ConstIterator(qh_qh, point_dimension, point_end); }
    -    Iterator            end() { return Iterator(qh_qh, point_dimension, point_end); }
    -    coordT *            extraCoordinates() const { return extraCoordinatesCount() ? (point_end-extraCoordinatesCount()) : 0; }
    -    countT              extraCoordinatesCount() const;  // WARN64
    -    // Constructs QhullPoint.  Cannot return reference.
    -    const QhullPoint    first() const { return QhullPoint(qh_qh, point_dimension, point_first); }
    -    QhullPoint          first() { return QhullPoint(qh_qh, point_dimension, point_first); }
    -    // Constructs QhullPoint.  Cannot return reference.
    -    const QhullPoint    front() const { return first(); }
    -    QhullPoint          front() { return first(); }
    -    bool                includesCoordinates(const coordT *c) const { return c>=point_first && c(other)); return *this; }
    -
    -        // Need 'const QhullPoint' to maintain const
    -        const QhullPoint & operator*() const { return *this; }
    -        QhullPoint &    operator*() { return *this; }
    -        const QhullPoint * operator->() const { return this; }
    -        QhullPoint *    operator->() { return this; }
    -        // value instead of reference since advancePoint() modifies self
    -        QhullPoint      operator[](countT idx) const { QhullPoint result= *this; result.advancePoint(idx); return result; }
    -        bool            operator==(const iterator &o) const { QHULL_ASSERT(qh_qh==o.qh_qh); return (point_coordinates==o.point_coordinates && point_dimension==o.point_dimension); }
    -        bool            operator!=(const iterator &o) const { return !operator==(o); }
    -        bool            operator<(const iterator &o) const  { QHULL_ASSERT(qh_qh==o.qh_qh); return point_coordinates < o.point_coordinates; }
    -        bool            operator<=(const iterator &o) const { QHULL_ASSERT(qh_qh==o.qh_qh); return point_coordinates <= o.point_coordinates; }
    -        bool            operator>(const iterator &o) const  { QHULL_ASSERT(qh_qh==o.qh_qh); return point_coordinates > o.point_coordinates; }
    -        bool            operator>=(const iterator &o) const { QHULL_ASSERT(qh_qh==o.qh_qh); return point_coordinates >= o.point_coordinates; }
    -        // reinterpret_cast to break circular dependency
    -        bool            operator==(const QhullPoints::const_iterator &o) const { QHULL_ASSERT(qh_qh==reinterpret_cast(o).qh_qh); return (point_coordinates==reinterpret_cast(o).point_coordinates && point_dimension==reinterpret_cast(o).point_dimension); }
    -        bool            operator!=(const QhullPoints::const_iterator &o) const { return !operator==(reinterpret_cast(o)); }
    -        bool            operator<(const QhullPoints::const_iterator &o) const  { QHULL_ASSERT(qh_qh==reinterpret_cast(o).qh_qh); return point_coordinates < reinterpret_cast(o).point_coordinates; }
    -        bool            operator<=(const QhullPoints::const_iterator &o) const { QHULL_ASSERT(qh_qh==reinterpret_cast(o).qh_qh); return point_coordinates <= reinterpret_cast(o).point_coordinates; }
    -        bool            operator>(const QhullPoints::const_iterator &o) const  { QHULL_ASSERT(qh_qh==reinterpret_cast(o).qh_qh); return point_coordinates > reinterpret_cast(o).point_coordinates; }
    -        bool            operator>=(const QhullPoints::const_iterator &o) const { QHULL_ASSERT(qh_qh==reinterpret_cast(o).qh_qh); return point_coordinates >= reinterpret_cast(o).point_coordinates; }
    -        iterator &      operator++() { advancePoint(1); return *this; }
    -        iterator        operator++(int) { iterator n= *this; operator++(); return iterator(n); }
    -        iterator &      operator--() { advancePoint(-1); return *this; }
    -        iterator        operator--(int) { iterator n= *this; operator--(); return iterator(n); }
    -        iterator &      operator+=(countT idx) { advancePoint(idx); return *this; }
    -        iterator &      operator-=(countT idx) { advancePoint(-idx); return *this; }
    -        iterator        operator+(countT idx) const { iterator n= *this; n.advancePoint(idx); return n; }
    -        iterator        operator-(countT idx) const { iterator n= *this; n.advancePoint(-idx); return n; }
    -        difference_type operator-(iterator o) const { QHULL_ASSERT(qh_qh==o.qh_qh && point_dimension==o.point_dimension); return (point_dimension ? (point_coordinates-o.point_coordinates)/point_dimension : 0); }
    -    };//QhullPoints::iterator
    -
    -#//!\name QhullPoints::const_iterator
    -    //!\todo FIXUP QH11018 const_iterator same as iterator.  SHould have a common definition
    -    class const_iterator : public QhullPoint {
    -
    -    public:
    -        typedef std::random_access_iterator_tag  iterator_category;
    -        typedef QhullPoint          value_type;
    -        typedef const value_type *  pointer;
    -        typedef const value_type &  reference;
    -        typedef ptrdiff_t           difference_type;
    -
    -                        const_iterator(const QhullPoints::iterator &o) : QhullPoint(*o) {}
    -        explicit        const_iterator(const QhullPoints &ps) : QhullPoint(ps.qh(), ps.dimension(), ps.coordinates()) {}
    -                        const_iterator(const int pointDimension, coordT *c): QhullPoint(pointDimension, c) {}
    -                        const_iterator(const Qhull &q, coordT *c): QhullPoint(q, c) {}
    -                        const_iterator(const Qhull &q, int pointDimension, coordT *c): QhullPoint(q, pointDimension, c) {}
    -                        const_iterator(QhullQh *qqh, coordT *c): QhullPoint(qqh, c) {}
    -                        const_iterator(QhullQh *qqh, int pointDimension, coordT *c): QhullPoint(qqh, pointDimension, c) {}
    -                        const_iterator(const const_iterator &o) : QhullPoint(*o) {}
    -        const_iterator &operator=(const const_iterator &o) { defineAs(const_cast(o)); return *this; }
    -
    -        // value/non-const since advancePoint(1), etc. modifies self
    -        const QhullPoint & operator*() const { return *this; }
    -        const QhullPoint * operator->() const { return this; }
    -        // value instead of reference since advancePoint() modifies self
    -        const QhullPoint operator[](countT idx) const { QhullPoint n= *this; n.advancePoint(idx); return n; }
    -        bool            operator==(const const_iterator &o) const { QHULL_ASSERT(qh_qh==o.qh_qh); return (point_coordinates==o.point_coordinates && point_dimension==o.point_dimension); }
    -        bool            operator!=(const const_iterator &o) const { return ! operator==(o); }
    -        bool            operator<(const const_iterator &o) const  { QHULL_ASSERT(qh_qh==o.qh_qh); return point_coordinates < o.point_coordinates; }
    -        bool            operator<=(const const_iterator &o) const { QHULL_ASSERT(qh_qh==o.qh_qh); return point_coordinates <= o.point_coordinates; }
    -        bool            operator>(const const_iterator &o) const  { QHULL_ASSERT(qh_qh==o.qh_qh); return point_coordinates > o.point_coordinates; }
    -        bool            operator>=(const const_iterator &o) const { QHULL_ASSERT(qh_qh==o.qh_qh); return point_coordinates >= o.point_coordinates; }
    -        const_iterator &operator++() { advancePoint(1); return *this; }
    -        const_iterator  operator++(int) { const_iterator n= *this; operator++(); return const_iterator(n); }
    -        const_iterator &operator--() { advancePoint(-1); return *this; }
    -        const_iterator  operator--(int) { const_iterator n= *this; operator--(); return const_iterator(n); }
    -        const_iterator &operator+=(countT idx) { advancePoint(idx); return *this; }
    -        const_iterator &operator-=(countT idx) { advancePoint(-idx); return *this; }
    -        const_iterator  operator+(countT idx) const { const_iterator n= *this; n.advancePoint(idx); return n; }
    -        const_iterator  operator-(countT idx) const { const_iterator n= *this; n.advancePoint(-idx); return n; }
    -        difference_type operator-(const_iterator o) const { QHULL_ASSERT(qh_qh==o.qh_qh && point_dimension==o.point_dimension); return (point_dimension ? (point_coordinates-o.point_coordinates)/point_dimension : 0); }
    -    };//QhullPoints::const_iterator
    -
    -#//!\name IO
    -    struct PrintPoints{
    -        const QhullPoints  *points;
    -        const char *    point_message;
    -        bool            with_identifier;
    -        PrintPoints(const char *message, bool withIdentifier, const QhullPoints &ps) : points(&ps), point_message(message), with_identifier(withIdentifier) {}
    -    };//PrintPoints
    -    PrintPoints          print(const char *message) const { return PrintPoints(message, false, *this); }
    -    PrintPoints          printWithIdentifier(const char *message) const { return PrintPoints(message, true, *this); }
    -};//QhullPoints
    -
    -// Instead of QHULL_DECLARE_SEQUENTIAL_ITERATOR because next(),etc would return a reference to a temporary
    -class QhullPointsIterator
    -{
    -    typedef QhullPoints::const_iterator const_iterator;
    -
    -#//!\name Fields
    -private:
    -    const QhullPoints  *ps;
    -    const_iterator      i;
    -
    -public:
    -                        QhullPointsIterator(const QhullPoints &other) : ps(&other), i(ps->constBegin()) {}
    -    QhullPointsIterator &operator=(const QhullPoints &other) { ps = &other; i = ps->constBegin(); return *this; }
    -
    -    bool                findNext(const QhullPoint &t);
    -    bool                findPrevious(const QhullPoint &t);
    -    bool                hasNext() const { return i != ps->constEnd(); }
    -    bool                hasPrevious() const { return i != ps->constBegin(); }
    -    QhullPoint          next() { return *i++; }
    -    QhullPoint          peekNext() const { return *i; }
    -    QhullPoint          peekPrevious() const { const_iterator p = i; return *--p; }
    -    QhullPoint          previous() { return *--i; }
    -    void                toBack() { i = ps->constEnd(); }
    -    void                toFront() { i = ps->constBegin(); }
    -};//QhullPointsIterator
    -
    -}//namespace orgQhull
    -
    -#//!\name Global
    -
    -std::ostream &          operator<<(std::ostream &os, const orgQhull::QhullPoints &p);
    -std::ostream &          operator<<(std::ostream &os, const orgQhull::QhullPoints::PrintPoints &pr);
    -
    -#endif // QHULLPOINTS_H
    diff --git a/src/qhull/src/libqhullcpp/QhullQh.cpp b/src/qhull/src/libqhullcpp/QhullQh.cpp
    deleted file mode 100644
    index 3635337001b..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullQh.cpp
    +++ /dev/null
    @@ -1,237 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullQh.cpp#5 $$Change: 2066 $
    -** $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#//! QhullQh -- Qhull's global data structure, qhT, as a C++ class
    -
    -
    -#include "libqhullcpp/QhullQh.h"
    -
    -#include "libqhullcpp/QhullError.h"
    -#include "libqhullcpp/QhullStat.h"
    -
    -#include 
    -#include 
    -
    -#include 
    -
    -using std::cerr;
    -using std::string;
    -using std::vector;
    -using std::ostream;
    -
    -#ifdef _MSC_VER  // Microsoft Visual C++ -- warning level 4
    -#pragma warning( disable : 4611)  // interaction between '_setjmp' and C++ object destruction is non-portable
    -#pragma warning( disable : 4996)  // function was declared deprecated(strcpy, localtime, etc.)
    -#endif
    -
    -namespace orgQhull {
    -
    -#//!\name Global variables
    -const double QhullQh::
    -default_factor_epsilon= 1.0;
    -
    -#//!\name Constructor, destructor, etc.
    -
    -//! Derived from qh_new_qhull[user.c]
    -QhullQh::
    -QhullQh()
    -: qhull_status(qh_ERRnone)
    -, qhull_message()
    -, error_stream(0)
    -, output_stream(0)
    -, factor_epsilon(QhullQh::default_factor_epsilon)
    -, use_output_stream(false)
    -{
    -    // NOerrors: TRY_QHULL_ not needed since these routines do not call qh_errexit()
    -    qh_meminit(this, NULL);
    -    qh_initstatistics(this);
    -    qh_initqhull_start2(this, NULL, NULL, qh_FILEstderr);  // Initialize qhT
    -    this->ISqhullQh= True;
    -}//QhullQh
    -
    -QhullQh::
    -~QhullQh()
    -{
    -    checkAndFreeQhullMemory();
    -}//~QhullQh
    -
    -#//!\name Methods
    -
    -//! Check memory for internal consistency
    -//! Free global memory used by qh_initbuild and qh_buildhull
    -//! Zero the qhT data structure, except for memory (qhmemT) and statistics (qhstatT)
    -//! Check and free short memory (e.g., facetT)
    -//! Zero the qhmemT data structure
    -void QhullQh::
    -checkAndFreeQhullMemory()
    -{
    -#ifdef qh_NOmem
    -    qh_freeqhull(this, qh_ALL);
    -#else
    -    qh_memcheck(this);
    -    qh_freeqhull(this, !qh_ALL);
    -    countT curlong;
    -    countT totlong;
    -    qh_memfreeshort(this, &curlong, &totlong);
    -    if (curlong || totlong)
    -        throw QhullError(10026, "Qhull error: qhull did not free %d bytes of long memory (%d pieces).", totlong, curlong);
    -#endif
    -}//checkAndFreeQhullMemory
    -
    -#//!\name Messaging
    -
    -void QhullQh::
    -appendQhullMessage(const string &s)
    -{
    -    if(output_stream && use_output_stream && this->USEstdout){ 
    -        *output_stream << s;
    -    }else if(error_stream){
    -        *error_stream << s;
    -    }else{
    -        qhull_message += s;
    -    }
    -}//appendQhullMessage
    -
    -//! clearQhullMessage does not throw errors (~Qhull)
    -void QhullQh::
    -clearQhullMessage()
    -{
    -    qhull_status= qh_ERRnone;
    -    qhull_message.clear();
    -    RoadError::clearGlobalLog();
    -}//clearQhullMessage
    -
    -//! hasQhullMessage does not throw errors (~Qhull)
    -bool QhullQh::
    -hasQhullMessage() const
    -{
    -    return (!qhull_message.empty() || qhull_status!=qh_ERRnone);
    -    //FIXUP QH11006 -- inconsistent usage with Rbox.  hasRboxMessage just tests rbox_status.  No appendRboxMessage()
    -}
    -
    -void QhullQh::
    -maybeThrowQhullMessage(int exitCode)
    -{
    -    if(!NOerrexit){
    -        if(qhull_message.size()>0){
    -            qhull_message.append("\n");
    -        }
    -        if(exitCode || qhull_status==qh_ERRnone){
    -            qhull_status= 10073;
    -        }else{
    -            qhull_message.append("QH10073: ");
    -        }
    -        qhull_message.append("Cannot call maybeThrowQhullMessage() from QH_TRY_().  Or missing 'qh->NOerrexit=true;' after QH_TRY_(){...}.");
    -    }
    -    if(qhull_status==qh_ERRnone){
    -        qhull_status= exitCode;
    -    }
    -    if(qhull_status!=qh_ERRnone){
    -        QhullError e(qhull_status, qhull_message);
    -        clearQhullMessage();
    -        throw e; // FIXUP QH11007: copy constructor is expensive if logging
    -    }
    -}//maybeThrowQhullMessage
    -
    -void QhullQh::
    -maybeThrowQhullMessage(int exitCode, int noThrow)  throw()
    -{
    -    QHULL_UNUSED(noThrow);
    -
    -    if(qhull_status==qh_ERRnone){
    -        qhull_status= exitCode;
    -    }
    -    if(qhull_status!=qh_ERRnone){
    -        QhullError e(qhull_status, qhull_message);
    -        e.logErrorLastResort();
    -    }
    -}//maybeThrowQhullMessage
    -
    -//! qhullMessage does not throw errors (~Qhull)
    -std::string QhullQh::
    -qhullMessage() const
    -{
    -    if(qhull_message.empty() && qhull_status!=qh_ERRnone){
    -        return "qhull: no message for error.  Check cerr or error stream\n";
    -    }else{
    -        return qhull_message;
    -    }
    -}//qhullMessage
    -
    -int QhullQh::
    -qhullStatus() const
    -{
    -    return qhull_status;
    -}//qhullStatus
    -
    -void QhullQh::
    -setErrorStream(ostream *os)
    -{
    -    error_stream= os;
    -}//setErrorStream
    -
    -//! Updates use_output_stream
    -void QhullQh::
    -setOutputStream(ostream *os)
    -{
    -    output_stream= os;
    -    use_output_stream= (os!=0);
    -}//setOutputStream
    -
    -}//namespace orgQhull
    -
    -/*---------------------------------
    -
    -  qh_fprintf(qhT *qh, fp, msgcode, format, list of args )
    -    replaces qh_fprintf() in userprintf_r.c
    -
    -notes:
    -    only called from libqhull
    -    same as fprintf() and RboxPoints.qh_fprintf_rbox()
    -    fgets() is not trapped like fprintf()
    -    Do not throw errors from here.  Use qh_errexit;
    -*/
    -extern "C"
    -void qh_fprintf(qhT *qh, FILE *fp, int msgcode, const char *fmt, ... ) {
    -    va_list args;
    -
    -    using namespace orgQhull;
    -
    -    if(!qh->ISqhullQh){
    -        qh_fprintf_stderr(10025, "Qhull error: qh_fprintf called from a Qhull instance without QhullQh defined\n");
    -        qh_exit(10025);
    -    }
    -    QhullQh *qhullQh= static_cast(qh);
    -    va_start(args, fmt);
    -    if(msgcode=MSG_ERROR && msgcodeqhull_statusqhull_status>=MSG_WARNING){
    -                qhullQh->qhull_status= msgcode;
    -            }
    -        }
    -        char newMessage[MSG_MAXLEN];
    -        // RoadError will add the message tag
    -        vsnprintf(newMessage, sizeof(newMessage), fmt, args);
    -        qhullQh->appendQhullMessage(newMessage);
    -        va_end(args);
    -        return;
    -    }
    -    if(qhullQh->output_stream && qhullQh->use_output_stream){
    -        char newMessage[MSG_MAXLEN];
    -        vsnprintf(newMessage, sizeof(newMessage), fmt, args);
    -        *qhullQh->output_stream << newMessage;
    -        va_end(args);
    -        return;
    -    }
    -    // FIXUP QH11008: how do users trap messages and handle input?  A callback?
    -    char newMessage[MSG_MAXLEN];
    -    vsnprintf(newMessage, sizeof(newMessage), fmt, args);
    -    qhullQh->appendQhullMessage(newMessage);
    -    va_end(args);
    -} /* qh_fprintf */
    diff --git a/src/qhull/src/libqhullcpp/QhullQh.h b/src/qhull/src/libqhullcpp/QhullQh.h
    deleted file mode 100644
    index c3b277ff0fa..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullQh.h
    +++ /dev/null
    @@ -1,110 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullQh.h#2 $$Change: 2079 $
    -** $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#ifndef QHULLQH_H
    -#define QHULLQH_H
    -
    -#include "libqhull_r/qhull_ra.h"
    -
    -#include 
    -
    -#ifdef _MSC_VER  // Microsoft Visual C++ -- warning level 4
    -#pragma warning( disable : 4611)  /* interaction between '_setjmp' and C++ object destruction is non-portable */
    -/* setjmp should not be implemented with 'catch' */
    -#endif
    -
    -//! Use QH_TRY_ or QH_TRY_NOTHROW_ to call a libqhull_r routine that may invoke qh_errexit()
    -//! QH_TRY_(qh){...} qh->NOerrexit=true;
    -//! No object creation -- longjmp() skips object destructors
    -//! To test for error when done -- qh->maybeThrowQhullMessage(QH_TRY_status);
    -//! Use the same compiler for QH_TRY_, libqhullcpp, and libqhull_r.  setjmp() is not portable between compilers.
    -
    -#define QH_TRY_ERROR 10071
    -
    -#define QH_TRY_(qh) \
    -    int QH_TRY_status; \
    -    if(qh->NOerrexit){ \
    -        qh->NOerrexit= False; \
    -        QH_TRY_status= setjmp(qh->errexit); \
    -    }else{ \
    -        throw QhullError(QH_TRY_ERROR, "Cannot invoke QH_TRY_() from inside a QH_TRY_.  Or missing 'qh->NOerrexit=true' after previously called QH_TRY_(qh){...}"); \
    -    } \
    -    if(!QH_TRY_status)
    -
    -#define QH_TRY_NO_THROW_(qh) \
    -    int QH_TRY_status; \
    -    if(qh->NOerrexit){ \
    -        qh->NOerrexit= False; \
    -        QH_TRY_status= setjmp(qh->errexit); \
    -    }else{ \
    -        QH_TRY_status= QH_TRY_ERROR; \
    -    } \
    -    if(!QH_TRY_status)
    -
    -namespace orgQhull {
    -
    -#//!\name Defined here
    -    //! QhullQh -- Qhull's global data structure, qhT, as a C++ class
    -    class QhullQh;
    -
    -//! POD type equivalent to qhT.  No virtual members
    -class QhullQh : public qhT {
    -
    -#//!\name Constants
    -
    -#//!\name Fields
    -private:
    -    int                 qhull_status;   //!< qh_ERRnone if valid
    -    std::string         qhull_message;  //!< Returned messages from libqhull_r
    -    std::ostream *      error_stream;   //!< overrides errorMessage, use appendQhullMessage()
    -    std::ostream *      output_stream;  //!< send output to stream
    -    double              factor_epsilon; //!< Factor to increase ANGLEround and DISTround for hyperplane equality
    -    bool                use_output_stream; //!< True if using output_stream
    -
    -    friend void         ::qh_fprintf(qhT *qh, FILE *fp, int msgcode, const char *fmt, ... );
    -
    -    static const double default_factor_epsilon;  //!< Default factor_epsilon is 1.0, never updated
    -
    -#//!\name Constructors
    -public:
    -                        QhullQh();
    -                        ~QhullQh();
    -private:
    -                        //!disable copy constructor and assignment
    -                        QhullQh(const QhullQh &);
    -    QhullQh &           operator=(const QhullQh &);
    -public:
    -
    -#//!\name GetSet
    -    double              factorEpsilon() const { return factor_epsilon; }
    -    void                setFactorEpsilon(double a) { factor_epsilon= a; }
    -    void                disableOutputStream() { use_output_stream= false; }
    -    void                enableOutputStream() { use_output_stream= true; }
    -
    -#//!\name Messaging
    -    void                appendQhullMessage(const std::string &s);
    -    void                clearQhullMessage();
    -    std::string         qhullMessage() const;
    -    bool                hasOutputStream() const { return use_output_stream; }
    -    bool                hasQhullMessage() const;
    -    void                maybeThrowQhullMessage(int exitCode);
    -    void                maybeThrowQhullMessage(int exitCode, int noThrow) throw();
    -    int                 qhullStatus() const;
    -    void                setErrorStream(std::ostream *os);
    -    void                setOutputStream(std::ostream *os);
    -
    -#//!\name Methods
    -    double              angleEpsilon() const { return this->ANGLEround*factor_epsilon; } //!< Epsilon for hyperplane angle equality
    -    void                checkAndFreeQhullMemory();
    -    double              distanceEpsilon() const { return this->DISTround*factor_epsilon; } //!< Epsilon for distance to hyperplane
    -
    -};//class QhullQh
    -
    -}//namespace orgQhull
    -
    -#endif // QHULLQH_H
    diff --git a/src/qhull/src/libqhullcpp/QhullRidge.cpp b/src/qhull/src/libqhullcpp/QhullRidge.cpp
    deleted file mode 100644
    index 7a01812805f..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullRidge.cpp
    +++ /dev/null
    @@ -1,124 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullRidge.cpp#3 $$Change: 2066 $
    -** $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#//! QhullRidge -- Qhull's ridge structure, ridgeT, as a C++ class
    -
    -#include "libqhullcpp/QhullRidge.h"
    -
    -#include "libqhullcpp/QhullSets.h"
    -#include "libqhullcpp/QhullVertex.h"
    -#include "libqhullcpp/Qhull.h"
    -
    -#ifdef _MSC_VER  // Microsoft Visual C++ -- warning level 4
    -#pragma warning( disable : 4611)  // interaction between '_setjmp' and C++ object destruction is non-portable
    -#pragma warning( disable : 4996)  // function was declared deprecated(strcpy, localtime, etc.)
    -#endif
    -
    -namespace orgQhull {
    -
    -#//!\name Class objects
    -ridgeT QhullRidge::
    -s_empty_ridge= {0,0,0,0,0,
    -                0,0};
    -
    -#//!\name Constructors
    -
    -QhullRidge::QhullRidge(const Qhull &q)
    -: qh_ridge(&s_empty_ridge)
    -, qh_qh(q.qh())
    -{
    -}//Default
    -
    -QhullRidge::QhullRidge(const Qhull &q, ridgeT *r)
    -: qh_ridge(r ? r : &s_empty_ridge)
    -, qh_qh(q.qh())
    -{
    -}//ridgeT
    -
    -#//!\name foreach
    -
    -//! Return True if nextRidge3d
    -//! Simplicial facets may have incomplete ridgeSets
    -//! Does not use qh_errexit()
    -bool QhullRidge::
    -hasNextRidge3d(const QhullFacet &f) const
    -{
    -    if(!qh_qh){
    -        return false;
    -    }
    -    vertexT *v= 0;
    -    // Does not call qh_errexit(), TRY_QHULL_ not needed
    -    ridgeT *ridge= qh_nextridge3d(getRidgeT(), f.getFacetT(), &v);
    -    return (ridge!=0);
    -}//hasNextRidge3d
    -
    -//! Return next ridge and optional vertex for a 3d facet and ridge
    -//! Does not use qh_errexit()
    -QhullRidge QhullRidge::
    -nextRidge3d(const QhullFacet &f, QhullVertex *nextVertex) const
    -{
    -    vertexT *v= 0;
    -    ridgeT *ridge= 0;
    -    if(qh_qh){
    -        // Does not call qh_errexit(), TRY_QHULL_ not needed
    -        ridge= qh_nextridge3d(getRidgeT(), f.getFacetT(), &v);
    -        if(!ridge){
    -            throw QhullError(10030, "Qhull error nextRidge3d:  missing next ridge for facet %d ridge %d.  Does facet contain ridge?", f.id(), id());
    -        }
    -    }
    -    if(nextVertex!=0){
    -        *nextVertex= QhullVertex(qh_qh, v);
    -    }
    -    return QhullRidge(qh_qh, ridge);
    -}//nextRidge3d
    -
    -}//namespace orgQhull
    -
    -#//!\name Global functions
    -
    -using std::endl;
    -using std::ostream;
    -using orgQhull::QhullRidge;
    -using orgQhull::QhullVertex;
    -
    -ostream &
    -operator<<(ostream &os, const QhullRidge &r)
    -{
    -    os << r.print("");
    -    return os;
    -}//<< QhullRidge
    -
    -//! Duplicate of qh_printridge [io_r.c]
    -ostream &
    -operator<<(ostream &os, const QhullRidge::PrintRidge &pr)
    -{
    -    if(*pr.print_message){
    -        os << pr.print_message << " ";
    -    }else{
    -        os << "     - ";
    -    }
    -    QhullRidge r= *pr.ridge;
    -    os << "r" << r.id();
    -    if(r.getRidgeT()->tested){
    -        os << " tested";
    -    }
    -    if(r.getRidgeT()->nonconvex){
    -        os << " nonconvex";
    -    }
    -    os << endl;
    -    os << r.vertices().print("           vertices:");
    -    if(r.getRidgeT()->top && r.getRidgeT()->bottom){
    -        os << "           between f" << r.topFacet().id() << " and f" << r.bottomFacet().id() << endl;
    -    }else if(r.getRidgeT()->top){
    -        os << "           top f" << r.topFacet().id() << endl;
    -    }else if(r.getRidgeT()->bottom){
    -        os << "           bottom f" << r.bottomFacet().id() << endl;
    -    }
    -
    -    return os;
    -}//<< PrintRidge
    diff --git a/src/qhull/src/libqhullcpp/QhullRidge.h b/src/qhull/src/libqhullcpp/QhullRidge.h
    deleted file mode 100644
    index 924340fb094..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullRidge.h
    +++ /dev/null
    @@ -1,112 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullRidge.h#4 $$Change: 2079 $
    -** $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#ifndef QHULLRIDGE_H
    -#define QHULLRIDGE_H
    -
    -#include "libqhull_r/qhull_ra.h"
    -#include "libqhullcpp/QhullSet.h"
    -#include "libqhullcpp/QhullVertex.h"
    -#include "libqhullcpp/QhullVertexSet.h"
    -#include "libqhullcpp/QhullFacet.h"
    -
    -#include 
    -
    -namespace orgQhull {
    -
    -#//!\name Used here
    -    class Qhull;
    -    class QhullVertex;
    -    class QhullVertexSet;
    -    class QhullFacet;
    -
    -#//!\name Defined here
    -    //! QhullRidge -- Qhull's ridge structure, ridgeT [libqhull.h], as a C++ class
    -    class QhullRidge;
    -    typedef QhullSet  QhullRidgeSet;
    -    typedef QhullSetIterator  QhullRidgeSetIterator;
    -    // see QhullSets.h for QhullRidgeSet and QhullRidgeSetIterator -- avoids circular references
    -
    -/************************
    -a ridge is hull_dim-1 simplex between two neighboring facets.  If the
    -facets are non-simplicial, there may be more than one ridge between
    -two facets.  E.G. a 4-d hypercube has two triangles between each pair
    -of neighboring facets.
    -
    -topological information:
    -    vertices            a set of vertices
    -    top,bottom          neighboring facets with orientation
    -
    -geometric information:
    -    tested              True if ridge is clearly convex
    -    nonconvex           True if ridge is non-convex
    -*/
    -
    -class QhullRidge {
    -
    -#//!\name Defined here
    -public:
    -    typedef ridgeT *   base_type;  // for QhullRidgeSet
    -
    -#//!\name Fields
    -private:
    -    ridgeT *            qh_ridge;  //!< Corresponding ridgeT, never 0
    -    QhullQh *           qh_qh;     //!< QhullQh/qhT for ridgeT, may be 0
    -
    -#//!\name Class objects
    -    static ridgeT       s_empty_ridge;
    -
    -public:
    -#//!\name Constants
    -
    -#//!\name Constructors
    -                        QhullRidge() : qh_ridge(&s_empty_ridge), qh_qh(0) {}
    -    explicit            QhullRidge(const Qhull &q);
    -                        QhullRidge(const Qhull &q, ridgeT *r);
    -    explicit            QhullRidge(QhullQh *qqh) : qh_ridge(&s_empty_ridge), qh_qh(qqh) {}
    -                        QhullRidge(QhullQh *qqh, ridgeT *r) : qh_ridge(r ? r : &s_empty_ridge), qh_qh(qqh) {}
    -                        // Creates an alias.  Does not copy QhullRidge.  Needed for return by value and parameter passing
    -                        QhullRidge(const QhullRidge &other) : qh_ridge(other.qh_ridge), qh_qh(other.qh_qh) {}
    -                        // Creates an alias.  Does not copy QhullRidge.  Needed for vector
    -    QhullRidge &        operator=(const QhullRidge &other) { qh_ridge= other.qh_ridge; qh_qh= other.qh_qh; return *this; }
    -                        ~QhullRidge() {}
    -
    -#//!\name GetSet
    -    QhullFacet          bottomFacet() const { return QhullFacet(qh_qh, qh_ridge->bottom); }
    -    int                 dimension() const { return ((qh_qh && qh_qh->hull_dim) ? qh_qh->hull_dim-1 : 0); }
    -    ridgeT *            getBaseT() const { return getRidgeT(); } //!< For QhullSet
    -    ridgeT *            getRidgeT() const { return qh_ridge; }
    -    countT              id() const { return qh_ridge->id; }
    -    bool                isValid() const { return (qh_qh && qh_ridge != &s_empty_ridge); }
    -    bool                operator==(const QhullRidge &other) const { return qh_ridge==other.qh_ridge; }
    -    bool                operator!=(const QhullRidge &other) const { return !operator==(other); }
    -    QhullFacet          otherFacet(const QhullFacet &f) const { return QhullFacet(qh_qh, (qh_ridge->top==f.getFacetT() ? qh_ridge->bottom : qh_ridge->top)); }
    -    QhullFacet          topFacet() const { return QhullFacet(qh_qh, qh_ridge->top); }
    -
    -#//!\name foreach
    -    bool                hasNextRidge3d(const QhullFacet &f) const;
    -    QhullRidge          nextRidge3d(const QhullFacet &f) const { return nextRidge3d(f, 0); }
    -    QhullRidge          nextRidge3d(const QhullFacet &f, QhullVertex *nextVertex) const;
    -    QhullVertexSet      vertices() const { return QhullVertexSet(qh_qh, qh_ridge->vertices); }
    -
    -#//!\name IO
    -
    -    struct PrintRidge{
    -        const QhullRidge *ridge;
    -        const char *    print_message;    //!< non-null message
    -                        PrintRidge(const char *message, const QhullRidge &r) : ridge(&r), print_message(message) {}
    -    };//PrintRidge
    -    PrintRidge          print(const char* message) const { return PrintRidge(message, *this); }
    -};//class QhullRidge
    -
    -}//namespace orgQhull
    -
    -std::ostream &operator<<(std::ostream &os, const orgQhull::QhullRidge &r);
    -std::ostream &operator<<(std::ostream &os, const orgQhull::QhullRidge::PrintRidge &pr);
    -
    -#endif // QHULLRIDGE_H
    diff --git a/src/qhull/src/libqhullcpp/QhullSet.cpp b/src/qhull/src/libqhullcpp/QhullSet.cpp
    deleted file mode 100644
    index dfdc3c51f36..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullSet.cpp
    +++ /dev/null
    @@ -1,62 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullSet.cpp#3 $$Change: 2066 $
    -** $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#//! QhullSet -- Qhull's set structure, setT, as a C++ class
    -
    -#include "libqhullcpp/QhullSet.h"
    -
    -#include "libqhullcpp/Qhull.h"
    -#include "libqhullcpp/QhullError.h"
    -
    -#ifdef _MSC_VER  // Microsoft Visual C++ -- warning level 4
    -#endif
    -
    -namespace orgQhull {
    -
    -#//!\name Class objects
    -
    -setT QhullSetBase::
    -s_empty_set;
    -
    -#//!\name Constructors
    -
    -QhullSetBase::
    -QhullSetBase(const Qhull &q, setT *s) 
    -: qh_set(s ? s : &s_empty_set)
    -, qh_qh(q.qh())
    -{
    -}
    -
    -#//!\name Class methods
    -
    -// Same code for qh_setsize [qset_r.c] and QhullSetBase::count [static]
    -countT QhullSetBase::
    -count(const setT *set)
    -{
    -    countT size;
    -    const setelemT *sizep;
    -
    -    if (!set){
    -        return(0);
    -    }
    -    sizep= SETsizeaddr_(set);
    -    if ((size= sizep->i)) {
    -        size--;
    -        if (size > set->maxsize) {
    -            // FIXUP QH11022 How to add additional output to a error? -- qh_setprint(qhmem.ferr, "set: ", set);
    -            throw QhullError(10032, "QhullSet internal error: current set size %d is greater than maximum size %d\n",
    -                size, set->maxsize);
    -        }
    -    }else{
    -        size= set->maxsize;
    -    }
    -    return size;
    -}//count
    -
    -}//namespace orgQhull
    -
    diff --git a/src/qhull/src/libqhullcpp/QhullSet.h b/src/qhull/src/libqhullcpp/QhullSet.h
    deleted file mode 100644
    index afb6b51d9f7..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullSet.h
    +++ /dev/null
    @@ -1,462 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullSet.h#6 $$Change: 2079 $
    -** $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#ifndef QhullSet_H
    -#define QhullSet_H
    -
    -#include "libqhull_r/qhull_ra.h"
    -#include "libqhullcpp/QhullError.h"
    -#include "libqhullcpp/QhullQh.h"
    -
    -#include   // ptrdiff_t, size_t
    -
    -#ifndef QHULL_NO_STL
    -#include 
    -#endif
    -
    -#ifdef QHULL_USES_QT
    - #include 
    -#endif
    -
    -namespace orgQhull {
    -
    -#//!\name Used here
    -    class Qhull;
    -
    -#//!\name Defined here
    -    class QhullSetBase;  //! Base class for QhullSet
    -    //! QhullSet defined below
    -    //! QhullSetIterator defined below
    -    //! \see QhullPointSet, QhullLinkedList
    -
    -//! QhullSetBase is a wrapper for Qhull's setT of void* pointers
    -//! \see libqhull_r/qset.h
    -class QhullSetBase {
    -
    -private:
    -#//!\name Fields --
    -    setT *              qh_set;
    -    QhullQh *           qh_qh;             //! Provides access to setT memory allocator
    -
    -#//!\name Class objects
    -    static setT         s_empty_set;  //! Used if setT* is NULL
    -
    -public:
    -#//!\name Constructors
    -                        QhullSetBase(const Qhull &q, setT *s);
    -                        QhullSetBase(QhullQh *qqh, setT *s) : qh_set(s ? s : &s_empty_set), qh_qh(qqh) {}
    -                        //! Copy constructor copies the pointer but not the set.  Needed for return by value and parameter passing.
    -                        QhullSetBase(const QhullSetBase &other) : qh_set(other.qh_set), qh_qh(other.qh_qh) {}
    -    QhullSetBase &      operator=(const QhullSetBase &other) { qh_set= other.qh_set; qh_qh= other.qh_qh; return *this; }
    -                        ~QhullSetBase() {}
    -
    -private:
    -                        //!disabled since memory allocation for QhullSet not defined
    -                        QhullSetBase() {}
    -public:
    -
    -#//!\name GetSet
    -    countT              count() const { return QhullSetBase::count(qh_set); }
    -    void                defineAs(setT *s) { qh_set= s ? s : &s_empty_set; } //!< Not type-safe since setT may contain any type
    -    void                forceEmpty() { qh_set= &s_empty_set; }
    -    setT *              getSetT() const { return qh_set; }
    -    bool                isEmpty() const { return SETempty_(qh_set); }
    -    QhullQh *           qh() const { return qh_qh; }
    -    setT **             referenceSetT() { return &qh_set; }
    -    size_t              size() const { return QhullSetBase::count(qh_set); }
    -
    -#//!\name Element
    -protected:
    -    void **             beginPointer() const { return &qh_set->e[0].p; }
    -    void **             elementPointer(countT idx) const { QHULL_ASSERT(idx>=0 && idxmaxsize); return &SETelem_(qh_set, idx); }
    -                        //! Always points to 0
    -    void **             endPointer() const { return qh_setendpointer(qh_set); }
    -
    -#//!\name Class methods
    -public:
    -    static countT       count(const setT *set);
    -    //s may be null
    -    static bool         isEmpty(const setT *s) { return SETempty_(s); }
    -};//QhullSetBase
    -
    -
    -//! QhullSet -- A read-only wrapper to Qhull's collection class, setT.
    -//!  QhullSet is similar to STL's  and Qt's QVector
    -//!  QhullSet is unrelated to STL and Qt's set and map types (e.g., QSet and QMap)
    -//!  T is a Qhull type that defines 'base_type' and getBaseT() (e.g., QhullFacet with base_type 'facetT *'
    -//!  A QhullSet does not own its contents -- erase(), clear(), removeFirst(), removeLast(), pop_back(), pop_front(), fromStdList() not defined
    -//!  QhullSetIterator is faster than STL-style iterator/const_iterator
    -//!  Qhull's FOREACHelement_() [qset_r.h] maybe more efficient than QhullSet.  It uses a NULL terminator instead of an end pointer.  STL requires an end pointer.
    -//!  Derived from QhullLinkedList.h and Qt/core/tools/qlist.h w/o QT_STRICT_ITERATORS
    -template 
    -class QhullSet : public QhullSetBase {
    -
    -private:
    -#//!\name Fields -- see QhullSetBase
    -
    -#//!\name Class objects
    -    static setT         s_empty_set;  //! Workaround for no setT allocator.  Used if setT* is NULL
    -
    -public:
    -#//!\name Defined here
    -    class iterator;
    -    class const_iterator;
    -    typedef typename QhullSet::iterator Iterator;
    -    typedef typename QhullSet::const_iterator ConstIterator;
    -
    -#//!\name Constructors
    -                        QhullSet(const Qhull &q, setT *s) : QhullSetBase(q, s) { }
    -                        QhullSet(QhullQh *qqh, setT *s) : QhullSetBase(qqh, s) { }
    -                        //Conversion from setT* is not type-safe.  Implicit conversion for void* to T
    -                        //Copy constructor copies pointer but not contents.  Needed for return by value.
    -                        QhullSet(const QhullSet &other) : QhullSetBase(other) {}
    -    QhullSet &       operator=(const QhullSet &other) { QhullSetBase::operator=(other); return *this; }
    -                        ~QhullSet() {}
    -
    -private:
    -                        //!Disable default constructor.  See QhullSetBase
    -                        QhullSet();
    -public:
    -
    -#//!\name Conversion
    -
    -#ifndef QHULL_NO_STL
    -    std::vector toStdVector() const;
    -#endif
    -#ifdef QHULL_USES_QT
    -    QList toQList() const;
    -#endif
    -
    -#//!\name GetSet -- see QhullSetBase for count(), empty(), isEmpty(), size()
    -    using QhullSetBase::count;
    -    using QhullSetBase::isEmpty;
    -    // operator== defined for QhullSets of the same type
    -    bool                operator==(const QhullSet &other) const { return qh_setequal(getSetT(), other.getSetT()); }
    -    bool                operator!=(const QhullSet &other) const { return !operator==(other); }
    -
    -#//!\name Element access
    -    // Constructs T.  Cannot return reference.
    -    const T             at(countT idx) const { return operator[](idx); }
    -    // Constructs T.  Cannot return reference.
    -    const T             back() const { return last(); }
    -    T                   back() { return last(); }
    -    //! end element is NULL
    -    const typename T::base_type * constData() const { return reinterpret_cast(beginPointer()); }
    -    typename T::base_type *     data() { return reinterpret_cast(beginPointer()); }
    -    const typename T::base_type *data() const { return reinterpret_cast(beginPointer()); }
    -    typename T::base_type *     endData() { return reinterpret_cast(endPointer()); }
    -    const typename T::base_type * endData() const { return reinterpret_cast(endPointer()); }
    -    // Constructs T.  Cannot return reference.
    -    const T             first() const { QHULL_ASSERT(!isEmpty()); return T(qh(), *data()); }
    -    T                   first() { QHULL_ASSERT(!isEmpty()); return T(qh(), *data()); }
    -    // Constructs T.  Cannot return reference.
    -    const T             front() const { return first(); }
    -    T                   front() { return first(); }
    -    // Constructs T.  Cannot return reference.
    -    const T             last() const { QHULL_ASSERT(!isEmpty()); return T(qh(), *(endData()-1)); }
    -    T                   last() { QHULL_ASSERT(!isEmpty()); return T(qh(), *(endData()-1)); }
    -    // mid() not available.  No setT constructor
    -    // Constructs T.  Cannot return reference.
    -    const T             operator[](countT idx) const { const typename T::base_type *p= reinterpret_cast(elementPointer(idx)); QHULL_ASSERT(idx>=0 && p < endData()); return T(qh(), *p); }
    -    T                   operator[](countT idx) { typename T::base_type *p= reinterpret_cast(elementPointer(idx)); QHULL_ASSERT(idx>=0 && p < endData()); return T(qh(), *p); }
    -    const T             second() const { return operator[](1); }
    -    T                   second() { return operator[](1); }
    -    T                   value(countT idx) const;
    -    T                   value(countT idx, const T &defaultValue) const;
    -
    -#//!\name Read-write -- Not available, no setT constructor
    -
    -#//!\name iterator
    -    iterator            begin() { return iterator(qh(), reinterpret_cast(beginPointer())); }
    -    const_iterator      begin() const { return const_iterator(qh(), data()); }
    -    const_iterator      constBegin() const { return const_iterator(qh(), data()); }
    -    const_iterator      constEnd() const { return const_iterator(qh(), endData()); }
    -    iterator            end() { return iterator(qh(), endData()); }
    -    const_iterator      end() const { return const_iterator(qh(), endData()); }
    -
    -#//!\name Search
    -    bool                contains(const T &t) const;
    -    countT              count(const T &t) const;
    -    countT              indexOf(const T &t) const { /* no qh_qh */ return qh_setindex(getSetT(), t.getBaseT()); }
    -    countT              lastIndexOf(const T &t) const;
    -
    -    // before const_iterator for conversion with comparison operators
    -    class iterator {
    -        friend class const_iterator;
    -    private:
    -        typename T::base_type *  i;  // e.g., facetT**, first for debugger
    -        QhullQh *       qh_qh;
    -
    -    public:
    -        typedef ptrdiff_t       difference_type;
    -        typedef std::bidirectional_iterator_tag  iterator_category;
    -        typedef T               value_type;
    -
    -                        iterator(QhullQh *qqh, typename T::base_type *p) : i(p), qh_qh(qqh) {}
    -                        iterator(const iterator &o) : i(o.i), qh_qh(o.qh_qh) {}
    -        iterator &      operator=(const iterator &o) { i= o.i; qh_qh= o.qh_qh; return *this; }
    -
    -        // Constructs T.  Cannot return reference.  
    -        T               operator*() const { return T(qh_qh, *i); }
    -        //operator->() n/a, value-type
    -        // Constructs T.  Cannot return reference.  
    -        T               operator[](countT idx) const { return T(qh_qh, *(i+idx)); } //!< No error checking
    -        bool            operator==(const iterator &o) const { return i == o.i; }
    -        bool            operator!=(const iterator &o) const { return !operator==(o); }
    -        bool            operator==(const const_iterator &o) const { return (i==reinterpret_cast(o).i); }
    -        bool            operator!=(const const_iterator &o) const { return !operator==(o); }
    -
    -        //! Assumes same point set
    -        countT          operator-(const iterator &o) const { return (countT)(i-o.i); } //WARN64
    -        bool            operator>(const iterator &o) const { return i>o.i; }
    -        bool            operator<=(const iterator &o) const { return !operator>(o); }
    -        bool            operator<(const iterator &o) const { return i=(const iterator &o) const { return !operator<(o); }
    -        bool            operator>(const const_iterator &o) const { return (i > reinterpret_cast(o).i); }
    -        bool            operator<=(const const_iterator &o) const { return !operator>(o); }
    -        bool            operator<(const const_iterator &o) const { return (i < reinterpret_cast(o).i); }
    -        bool            operator>=(const const_iterator &o) const { return !operator<(o); }
    -
    -        //! No error checking
    -        iterator &      operator++() { ++i; return *this; }
    -        iterator        operator++(int) { iterator o= *this; ++i; return o; }
    -        iterator &      operator--() { --i; return *this; }
    -        iterator        operator--(int) { iterator o= *this; --i; return o; }
    -        iterator        operator+(countT j) const { return iterator(qh_qh, i+j); }
    -        iterator        operator-(countT j) const { return operator+(-j); }
    -        iterator &      operator+=(countT j) { i += j; return *this; }
    -        iterator &      operator-=(countT j) { i -= j; return *this; }
    -    };//QhullPointSet::iterator
    -
    -    class const_iterator {
    -    private:
    -        const typename T::base_type *  i;  // e.g., const facetT**, first for debugger
    -        QhullQh *       qh_qh;
    -
    -    public:
    -        typedef ptrdiff_t       difference_type;
    -        typedef std::random_access_iterator_tag  iterator_category;
    -        typedef T               value_type;
    -
    -                        const_iterator(QhullQh *qqh, const typename T::base_type * p) : i(p), qh_qh(qqh) {}
    -                        const_iterator(const const_iterator &o) : i(o.i), qh_qh(o.qh_qh) {}
    -                        const_iterator(const iterator &o) : i(o.i), qh_qh(o.qh_qh) {}
    -        const_iterator &operator=(const const_iterator &o) { i= o.i; qh_qh= o.qh_qh; return *this; }
    -
    -        // Constructs T.  Cannot return reference.  Retaining 'const T' return type for consistency with QList/QVector
    -        const T         operator*() const { return T(qh_qh, *i); }
    -        const T         operator[](countT idx) const { return T(qh_qh, *(i+idx)); }  //!< No error checking
    -        //operator->() n/a, value-type
    -        bool            operator==(const const_iterator &o) const { return i == o.i; }
    -        bool            operator!=(const const_iterator &o) const { return !operator==(o); }
    -
    -        //! Assumes same point set
    -        countT          operator-(const const_iterator &o) { return (countT)(i-o.i); } //WARN64
    -        bool            operator>(const const_iterator &o) const { return i>o.i; }
    -        bool            operator<=(const const_iterator &o) const { return !operator>(o); }
    -        bool            operator<(const const_iterator &o) const { return i=(const const_iterator &o) const { return !operator<(o); }
    -
    -        //!< No error checking
    -        const_iterator &operator++() { ++i; return *this; }
    -        const_iterator  operator++(int) { const_iterator o= *this; ++i; return o; }
    -        const_iterator &operator--() { --i; return *this; }
    -        const_iterator  operator--(int) { const_iterator o= *this; --i; return o; }
    -        const_iterator  operator+(int j) const { return const_iterator(qh_qh, i+j); }
    -        const_iterator  operator-(int j) const { return operator+(-j); }
    -        const_iterator &operator+=(int j) { i += j; return *this; }
    -        const_iterator &operator-=(int j) { i -= j; return *this; }
    -    };//QhullPointSet::const_iterator
    -
    -};//class QhullSet
    -
    -
    -//! Faster then interator/const_iterator due to T::base_type
    -template 
    -class QhullSetIterator {
    -
    -#//!\name Subtypes
    -    typedef typename QhullSet::const_iterator const_iterator;
    -
    -private:
    -#//!\name Fields
    -    const typename T::base_type *  i;  // e.g., facetT**, first for debugger
    -    const typename T::base_type *  begin_i;  // must be initialized after i
    -    const typename T::base_type *  end_i;
    -    QhullQh *                qh_qh;
    -
    -public:
    -#//!\name Constructors
    -                        QhullSetIterator(const QhullSet &s) : i(s.data()), begin_i(i), end_i(s.endData()), qh_qh(s.qh()) {}
    -                        QhullSetIterator(const QhullSetIterator &o) : i(o.i), begin_i(o.begin_i), end_i(o.end_i), qh_qh(o.qh_qh) {}
    -    QhullSetIterator &operator=(const QhullSetIterator &o) { i= o.i; begin_i= o.begin_i; end_i= o.end_i; qh_qh= o.qh_qh; return *this; }
    -
    -#//!\name ReadOnly
    -    countT              countRemaining() { return (countT)(end_i-i); } // WARN64
    -
    -#//!\name Search
    -    bool                findNext(const T &t);
    -    bool                findPrevious(const T &t);
    -
    -#//!\name Foreach
    -    bool                hasNext() const { return i != end_i; }
    -    bool                hasPrevious() const { return i != begin_i; }
    -    T                   next() { return T(qh_qh, *i++); }
    -    T                   peekNext() const { return T(qh_qh, *i); }
    -    T                   peekPrevious() const { const typename T::base_type *p = i; return T(qh_qh, *--p); }
    -    T                   previous() { return T(qh_qh, *--i); }
    -    void                toBack() { i = end_i; }
    -    void                toFront() { i = begin_i; }
    -};//class QhullSetIterator
    -
    -#//!\name == Definitions =========================================
    -
    -#//!\name Conversions
    -
    -// See qt-qhull.cpp for QList conversion
    -
    -#ifndef QHULL_NO_STL
    -template 
    -std::vector QhullSet::
    -toStdVector() const
    -{
    -	typename QhullSet::const_iterator i = begin();
    -	typename QhullSet::const_iterator e = end();
    -    std::vector vs;
    -    while(i!=e){
    -        vs.push_back(*i++);
    -    }
    -    return vs;
    -}//toStdVector
    -#endif //QHULL_NO_STL
    -
    -#ifdef QHULL_USES_QT
    -template 
    -QList QhullSet::
    -toQList() const
    -{
    -    QhullSet::const_iterator i= begin();
    -    QhullSet::const_iterator e= end();
    -    QList vs;
    -    while(i!=e){
    -        vs.append(*i++);
    -    }
    -    return vs;
    -}//toQList
    -#endif
    -
    -#//!\name Element
    -
    -template 
    -T QhullSet::
    -value(countT idx) const
    -{
    -    // Avoid call to qh_setsize() and assert in elementPointer()
    -    const typename T::base_type *p= reinterpret_cast(&SETelem_(getSetT(), idx));
    -    return (idx>=0 && p
    -T QhullSet::
    -value(countT idx, const T &defaultValue) const
    -{
    -    // Avoid call to qh_setsize() and assert in elementPointer()
    -    const typename T::base_type *p= reinterpret_cast(&SETelem_(getSetT(), idx));
    -    return (idx>=0 && p
    -bool QhullSet::
    -contains(const T &t) const
    -{
    -    setT *s= getSetT();
    -    void *p= t.getBaseT();  // contains() is not inline for better error reporting
    -    int result= qh_setin(s, p);
    -    return result!=0;
    -}//contains
    -
    -template 
    -countT QhullSet::
    -count(const T &t) const
    -{
    -    countT n= 0;
    -    const typename T::base_type *i= data();
    -    const typename T::base_type *e= endData();
    -    typename T::base_type p= t.getBaseT();
    -    while(i
    -countT QhullSet::
    -lastIndexOf(const T &t) const
    -{
    -    const typename T::base_type *b= data();
    -    const typename T::base_type *i= endData();
    -    typename T::base_type p= t.getBaseT();
    -    while(--i>=b){
    -        if(*i==p){
    -            break;
    -        }
    -    }
    -    return (countT)(i-b); // WARN64
    -}//lastIndexOf
    -
    -#//!\name QhullSetIterator
    -
    -template 
    -bool QhullSetIterator::
    -findNext(const T &t)
    -{
    -    typename T::base_type p= t.getBaseT();
    -    while(i!=end_i){
    -        if(*(++i)==p){
    -            return true;
    -        }
    -    }
    -    return false;
    -}//findNext
    -
    -template 
    -bool QhullSetIterator::
    -findPrevious(const T &t)
    -{
    -    typename T::base_type p= t.getBaseT();
    -    while(i!=begin_i){
    -        if(*(--i)==p){
    -            return true;
    -        }
    -    }
    -    return false;
    -}//findPrevious
    -
    -}//namespace orgQhull
    -
    -
    -#//!\name == Global namespace =========================================
    -
    -template 
    -std::ostream &
    -operator<<(std::ostream &os, const orgQhull::QhullSet &qs)
    -{
    -    const typename T::base_type *i= qs.data();
    -    const typename T::base_type *e= qs.endData();
    -    while(i!=e){
    -        os << T(qs.qh(), *i++);
    -    }
    -    return os;
    -}//operator<<
    -
    -#endif // QhullSet_H
    diff --git a/src/qhull/src/libqhullcpp/QhullSets.h b/src/qhull/src/libqhullcpp/QhullSets.h
    deleted file mode 100644
    index d0f200cbcfd..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullSets.h
    +++ /dev/null
    @@ -1,27 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullSets.h#2 $$Change: 2066 $
    -** $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#ifndef QHULLSETS_H
    -#define QHULLSETS_H
    -
    -#include "libqhullcpp/QhullSet.h"
    -
    -namespace orgQhull {
    -
    -    //See: QhullFacetSet.h
    -    //See: QhullPointSet.h
    -    //See: QhullVertexSet.h
    -
    -    // Avoid circular references between QhullFacet, QhullRidge, and QhullVertex
    -    class QhullRidge;
    -    typedef QhullSet  QhullRidgeSet;
    -    typedef QhullSetIterator  QhullRidgeSetIterator;
    -
    -}//namespace orgQhull
    -
    -#endif // QHULLSETS_H
    diff --git a/src/qhull/src/libqhullcpp/QhullStat.cpp b/src/qhull/src/libqhullcpp/QhullStat.cpp
    deleted file mode 100644
    index c4fe6c4918f..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullStat.cpp
    +++ /dev/null
    @@ -1,42 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullStat.cpp#3 $$Change: 2066 $
    -** $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#//! QhullStat -- Qhull's global data structure, statT, as a C++ class
    -
    -#include "libqhullcpp/QhullStat.h"
    -
    -#include "libqhullcpp/QhullError.h"
    -
    -#include 
    -#include 
    -
    -using std::cerr;
    -using std::string;
    -using std::vector;
    -using std::ostream;
    -
    -#ifdef _MSC_VER  // Microsoft Visual C++ -- warning level 4
    -#endif
    -
    -namespace orgQhull {
    -
    -#//!\name Constructor, destructor, etc.
    -
    -//! If qh_QHpointer==0, invoke with placement new on qh_stat;
    -QhullStat::
    -QhullStat()
    -{
    -}//QhullStat
    -
    -QhullStat::
    -~QhullStat()
    -{
    -}//~QhullStat
    -
    -}//namespace orgQhull
    -
    diff --git a/src/qhull/src/libqhullcpp/QhullStat.h b/src/qhull/src/libqhullcpp/QhullStat.h
    deleted file mode 100644
    index 54bde8fc79c..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullStat.h
    +++ /dev/null
    @@ -1,49 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullStat.h#2 $$Change: 2079 $
    -** $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#ifndef QHULLSTAT_H
    -#define QHULLSTAT_H
    -
    -#include "libqhull_r/qhull_ra.h"
    -
    -#include 
    -#include 
    -
    -namespace orgQhull {
    -
    -#//!\name defined here
    -    //! QhullStat -- Qhull's statistics, qhstatT, as a C++ class
    -    //! Statistics defined with zzdef_() control Qhull's behavior, summarize its result, and report precision problems.
    -    class QhullStat;
    -
    -class QhullStat : public qhstatT {
    -
    -private:
    -#//!\name Fields (empty) -- POD type equivalent to qhstatT.  No data or virtual members
    -
    -public:
    -#//!\name Constants
    -
    -#//!\name class methods
    -
    -#//!\name constructor, assignment, destructor, invariant
    -                        QhullStat();
    -                        ~QhullStat();
    -
    -private:
    -    //!disable copy constructor and assignment
    -                        QhullStat(const QhullStat &);
    -    QhullStat &         operator=(const QhullStat &);
    -public:
    -
    -#//!\name Access
    -};//class QhullStat
    -
    -}//namespace orgQhull
    -
    -#endif // QHULLSTAT_H
    diff --git a/src/qhull/src/libqhullcpp/QhullVertex.cpp b/src/qhull/src/libqhullcpp/QhullVertex.cpp
    deleted file mode 100644
    index fd7aef08937..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullVertex.cpp
    +++ /dev/null
    @@ -1,112 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullVertex.cpp#3 $$Change: 2066 $
    -** $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#//! QhullVertex -- Qhull's vertex structure, vertexT, as a C++ class
    -
    -#include "libqhullcpp/QhullVertex.h"
    -
    -#include "libqhullcpp/Qhull.h"
    -#include "libqhullcpp/QhullPoint.h"
    -#include "libqhullcpp/QhullFacetSet.h"
    -#include "libqhullcpp/QhullFacet.h"
    -
    -#ifdef _MSC_VER  // Microsoft Visual C++ -- warning level 4
    -#pragma warning( disable : 4611)  // interaction between '_setjmp' and C++ object destruction is non-portable
    -#pragma warning( disable : 4996)  // function was declared deprecated(strcpy, localtime, etc.)
    -#endif
    -
    -namespace orgQhull {
    -
    -#//!\name Class objects
    -vertexT QhullVertex::
    -s_empty_vertex= {0,0,0,0,0,
    -                 0,0,0,0,0,
    -                 0};
    -
    -#//!\name Constructors
    -
    -QhullVertex::QhullVertex(const Qhull &q)
    -: qh_vertex(&s_empty_vertex)
    -, qh_qh(q.qh())
    -{
    -}//Default
    -
    -QhullVertex::QhullVertex(const Qhull &q, vertexT *v)
    -: qh_vertex(v ? v : &s_empty_vertex)
    -, qh_qh(q.qh())
    -{
    -}//vertexT
    -
    -#//!\name foreach
    -
    -//! Return neighboring facets for a vertex
    -//! If neither merging nor Voronoi diagram, requires Qhull::defineVertexNeighborFacets() beforehand.
    -QhullFacetSet QhullVertex::
    -neighborFacets() const
    -{
    -    if(!neighborFacetsDefined()){
    -        throw QhullError(10034, "Qhull error: neighboring facets of vertex %d not defined.  Please call Qhull::defineVertexNeighborFacets() beforehand.", id());
    -    }
    -    return QhullFacetSet(qh_qh, qh_vertex->neighbors);
    -}//neighborFacets
    -
    -}//namespace orgQhull
    -
    -#//!\name Global functions
    -
    -using std::endl;
    -using std::ostream;
    -using std::string;
    -using std::vector;
    -using orgQhull::QhullPoint;
    -using orgQhull::QhullFacet;
    -using orgQhull::QhullFacetSet;
    -using orgQhull::QhullFacetSetIterator;
    -using orgQhull::QhullVertex;
    -
    -//! Duplicate of qh_printvertex [io_r.c]
    -ostream &
    -operator<<(ostream &os, const QhullVertex::PrintVertex &pr)
    -{
    -    QhullVertex v= *pr.vertex;
    -    QhullPoint p= v.point();
    -    if(*pr.print_message){
    -        os << pr.print_message << " ";
    -    }else{
    -        os << "- ";
    -    }
    -    os << "p" << p.id() << " (v" << v.id() << "): ";
    -    const realT *c= p.coordinates();
    -    for(int k= p.dimension(); k--; ){
    -        os << " " << *c++; // FIXUP QH11010 %5.2g
    -    }
    -    if(v.getVertexT()->deleted){
    -        os << " deleted";
    -    }
    -    if(v.getVertexT()->delridge){
    -        os << " ridgedeleted";
    -    }
    -    os << endl;
    -    if(v.neighborFacetsDefined()){
    -        QhullFacetSetIterator i= v.neighborFacets();
    -        if(i.hasNext()){
    -            os << " neighborFacets:";
    -            countT count= 0;
    -            while(i.hasNext()){
    -                if(++count % 100 == 0){
    -                    os << endl << "     ";
    -                }
    -                QhullFacet f= i.next();
    -                os << " f" << f.id();
    -            }
    -            os << endl;
    -        }
    -    }
    -    return os;
    -}//<< PrintVertex
    -
    diff --git a/src/qhull/src/libqhullcpp/QhullVertex.h b/src/qhull/src/libqhullcpp/QhullVertex.h
    deleted file mode 100644
    index 0137766db55..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullVertex.h
    +++ /dev/null
    @@ -1,104 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullVertex.h#4 $$Change: 2079 $
    -** $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#ifndef QHULLVERTEX_H
    -#define QHULLVERTEX_H
    -
    -#include "libqhull_r/qhull_ra.h"
    -#include "libqhullcpp/QhullPoint.h"
    -#include "libqhullcpp/QhullLinkedList.h"
    -#include "libqhullcpp/QhullSet.h"
    -
    -#include 
    -
    -namespace orgQhull {
    -
    -#//!\name Used here
    -    class QhullFacetSet;
    -
    -#//!\name Defined here
    -    //! QhullVertex -- Qhull's vertex structure, vertexT [libqhull_r.h], as a C++ class
    -    class QhullVertex;
    -    typedef QhullLinkedList QhullVertexList;
    -    typedef QhullLinkedListIterator QhullVertexListIterator;
    -
    -
    -/*********************
    -  topological information:
    -    next,previous       doubly-linked list of all vertices
    -    neighborFacets           set of adjacent facets (only if qh.VERTEXneighbors)
    -
    -  geometric information:
    -    point               array of DIM coordinates
    -*/
    -
    -class QhullVertex {
    -
    -#//!\name Defined here
    -public:
    -    typedef vertexT *   base_type;  // for QhullVertexSet
    -
    -private:
    -#//!\name Fields
    -    vertexT *           qh_vertex;  //!< Corresponding vertexT, never 0
    -    QhullQh *           qh_qh;      //!< QhullQh/qhT for vertexT, may be 0
    -
    -#//!\name Class objects
    -    static vertexT      s_empty_vertex;  // needed for shallow copy
    -
    -public:
    -#//!\name Constants
    -
    -#//!\name Constructors
    -                        QhullVertex() : qh_vertex(&s_empty_vertex), qh_qh(0) {}
    -    explicit            QhullVertex(const Qhull &q);
    -                        QhullVertex(const Qhull &q, vertexT *v);
    -    explicit            QhullVertex(QhullQh *qqh) : qh_vertex(&s_empty_vertex), qh_qh(qqh) {}
    -                        QhullVertex(QhullQh *qqh, vertexT *v) : qh_vertex(v ? v : &s_empty_vertex), qh_qh(qqh) {}
    -                        // Creates an alias.  Does not copy QhullVertex.  Needed for return by value and parameter passing
    -                        QhullVertex(const QhullVertex &other) : qh_vertex(other.qh_vertex), qh_qh(other.qh_qh) {}
    -                        // Creates an alias.  Does not copy QhullVertex.  Needed for vector
    -    QhullVertex &       operator=(const QhullVertex &other) { qh_vertex= other.qh_vertex; qh_qh= other.qh_qh; return *this; }
    -                        ~QhullVertex() {}
    -
    -#//!\name GetSet
    -    int                 dimension() const { return (qh_qh ? qh_qh->hull_dim : 0); }
    -    vertexT *           getBaseT() const { return getVertexT(); } //!< For QhullSet
    -    vertexT *           getVertexT() const { return qh_vertex; }
    -    countT              id() const { return qh_vertex->id; }
    -    bool                isValid() const { return (qh_qh && qh_vertex != &s_empty_vertex); }
    -                        //! True if defineVertexNeighborFacets() already called.  Auotomatically set for facet merging, Voronoi diagrams
    -    bool                neighborFacetsDefined() const { return qh_vertex->neighbors != 0; }
    -    QhullVertex         next() const { return QhullVertex(qh_qh, qh_vertex->next); }
    -    bool                operator==(const QhullVertex &other) const { return qh_vertex==other.qh_vertex; }
    -    bool                operator!=(const QhullVertex &other) const { return !operator==(other); }
    -    QhullPoint          point() const { return QhullPoint(qh_qh, qh_vertex->point); }
    -    QhullVertex         previous() const { return QhullVertex(qh_qh, qh_vertex->previous); }
    -    QhullQh *           qh() const { return qh_qh; }
    -
    -#//!\name foreach
    -    //See also QhullVertexList
    -    QhullFacetSet       neighborFacets() const;
    -
    -#//!\name IO
    -    struct PrintVertex{
    -        const QhullVertex *vertex;
    -        const char *    print_message;    //!< non-null message
    -                        PrintVertex(const char *message, const QhullVertex &v) : vertex(&v), print_message(message) {}
    -    };//PrintVertex
    -    PrintVertex         print(const char *message) const { return PrintVertex(message, *this); }
    -};//class QhullVertex
    -
    -}//namespace orgQhull
    -
    -#//!\name GLobal
    -
    -std::ostream &operator<<(std::ostream &os, const orgQhull::QhullVertex::PrintVertex &pr);
    -inline std::ostream &operator<<(std::ostream &os, const orgQhull::QhullVertex &v) { os << v.print(""); return os; }
    -
    -#endif // QHULLVERTEX_H
    diff --git a/src/qhull/src/libqhullcpp/QhullVertexSet.cpp b/src/qhull/src/libqhullcpp/QhullVertexSet.cpp
    deleted file mode 100644
    index 00ba62d1969..00000000000
    --- a/src/qhull/src/libqhullcpp/QhullVertexSet.cpp
    +++ /dev/null
    @@ -1,161 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/QhullVertexSet.cpp#3 $$Change: 2066 $
    -** $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#//! QhullVertexSet -- Qhull's linked Vertexs, as a C++ class
    -
    -#include "libqhullcpp/QhullVertexSet.h"
    -
    -#include "libqhullcpp/QhullVertex.h"
    -#include "libqhullcpp/QhullPoint.h"
    -#include "libqhullcpp/QhullRidge.h"
    -#include "libqhullcpp/QhullVertex.h"
    -#include "libqhullcpp/Qhull.h"
    -
    -using std::string;
    -using std::vector;
    -
    -#ifdef _MSC_VER  // Microsoft Visual C++ -- warning level 4
    -#pragma warning( disable : 4611)  /* interaction between '_setjmp' and C++ object destruction is non-portable */
    -                                    /* setjmp should not be implemented with 'catch' */
    -#endif
    -
    -namespace orgQhull {
    -
    -QhullVertexSet::
    -QhullVertexSet(const Qhull &q, facetT *facetlist, setT *facetset, bool allfacets)
    -: QhullSet(q.qh(), 0)
    -, qhsettemp_defined(false)
    -{
    -    QH_TRY_(q.qh()){ // no object creation -- destructors skipped on longjmp()
    -        setT *vertices= qh_facetvertices(q.qh(), facetlist, facetset, allfacets);
    -        defineAs(vertices);
    -        qhsettemp_defined= true;
    -    }
    -    q.qh()->NOerrexit= true;
    -    q.qh()->maybeThrowQhullMessage(QH_TRY_status);
    -}//QhullVertexSet facetlist facetset
    -
    -//! Return tempory QhullVertexSet of vertices for a list and/or a set of facets
    -//! Sets qhsettemp_defined (disallows copy constructor and assignment to prevent double-free)
    -QhullVertexSet::
    -QhullVertexSet(QhullQh *qqh, facetT *facetlist, setT *facetset, bool allfacets)
    -: QhullSet(qqh, 0)
    -, qhsettemp_defined(false)
    -{
    -    QH_TRY_(qh()){ // no object creation -- destructors skipped on longjmp()
    -        setT *vertices= qh_facetvertices(qh(), facetlist, facetset, allfacets);
    -        defineAs(vertices);
    -        qhsettemp_defined= true;
    -    }
    -    qh()->NOerrexit= true;
    -    qh()->maybeThrowQhullMessage(QH_TRY_status);
    -}//QhullVertexSet facetlist facetset
    -
    -//! Copy constructor for argument passing and returning a result
    -//! Only copies a pointer to the set.
    -//! Throws an error if qhsettemp_defined, otherwise have a double-free
    -//!\todo Convert QhullVertexSet to a shared pointer with reference counting
    -QhullVertexSet::
    -QhullVertexSet(const QhullVertexSet &other)
    -: QhullSet(other)
    -, qhsettemp_defined(false)
    -{
    -    if(other.qhsettemp_defined){
    -        throw QhullError(10077, "QhullVertexSet: Cannot use copy constructor since qhsettemp_defined (e.g., QhullVertexSet for a set and/or list of QhFacet).  Contains %d vertices", other.count());
    -    }
    -}//copy constructor
    -
    -//! Copy assignment only copies a pointer to the set.
    -//! Throws an error if qhsettemp_defined, otherwise have a double-free
    -QhullVertexSet & QhullVertexSet::
    -operator=(const QhullVertexSet &other)
    -{
    -    QhullSet::operator=(other);
    -    qhsettemp_defined= false;
    -    if(other.qhsettemp_defined){
    -        throw QhullError(10078, "QhullVertexSet: Cannot use copy constructor since qhsettemp_defined (e.g., QhullVertexSet for a set and/or list of QhFacet).  Contains %d vertices", other.count());
    -    }
    -    return *this;
    -}//assignment
    -
    -void QhullVertexSet::
    -freeQhSetTemp()
    -{
    -    if(qhsettemp_defined){
    -        qhsettemp_defined= false;
    -        QH_TRY_(qh()){ // no object creation -- destructors skipped on longjmp()
    -            qh_settempfree(qh(), referenceSetT()); // errors if not top of tempstack or if qhmem corrupted
    -        }
    -        qh()->NOerrexit= true;
    -        qh()->maybeThrowQhullMessage(QH_TRY_status, QhullError::NOthrow);
    -    }
    -}//freeQhSetTemp
    -
    -QhullVertexSet::
    -~QhullVertexSet()
    -{
    -    freeQhSetTemp();
    -}//~QhullVertexSet
    -
    -//FIXUP -- Move conditional, QhullVertexSet code to QhullVertexSet.cpp
    -#ifndef QHULL_NO_STL
    -std::vector QhullVertexSet::
    -toStdVector() const
    -{
    -    QhullSetIterator i(*this);
    -    std::vector vs;
    -    while(i.hasNext()){
    -        QhullVertex v= i.next();
    -        vs.push_back(v);
    -    }
    -    return vs;
    -}//toStdVector
    -#endif //QHULL_NO_STL
    -
    -}//namespace orgQhull
    -
    -#//!\name Global functions
    -
    -using std::endl;
    -using std::ostream;
    -using orgQhull::QhullPoint;
    -using orgQhull::QhullVertex;
    -using orgQhull::QhullVertexSet;
    -using orgQhull::QhullVertexSetIterator;
    -
    -//! Print Vertex identifiers to stream.  Space prefix.  From qh_printVertexheader [io_r.c]
    -ostream &
    -operator<<(ostream &os, const QhullVertexSet::PrintIdentifiers &pr)
    -{
    -    os << pr.print_message;
    -    for(QhullVertexSet::const_iterator i= pr.vertex_set->begin(); i!=pr.vertex_set->end(); ++i){
    -        const QhullVertex v= *i;
    -        os << " v" << v.id();
    -    }
    -    os << endl;
    -    return os;
    -}//<
    -
    -namespace orgQhull {
    -
    -#//!\name Used here
    -
    -#//!\name Defined here
    -    //! QhullVertexSet -- a set of Qhull Vertices, as a C++ class.
    -    //! See Qhull
    -    class QhullVertexSet;
    -    typedef QhullSetIterator QhullVertexSetIterator;
    -
    -class QhullVertexSet : public QhullSet {
    -
    -private:
    -#//!\name Fields
    -    bool                qhsettemp_defined;  //! Set was allocated with qh_settemp()
    -
    -public:
    -#//!\name Constructor
    -                        QhullVertexSet(const Qhull &q, setT *s) : QhullSet(q, s), qhsettemp_defined(false) {}
    -                        QhullVertexSet(const Qhull &q, facetT *facetlist, setT *facetset, bool allfacets);
    -                        //Conversion from setT* is not type-safe.  Implicit conversion for void* to T
    -                        QhullVertexSet(QhullQh *qqh, setT *s) : QhullSet(qqh, s), qhsettemp_defined(false) {}
    -                        QhullVertexSet(QhullQh *qqh, facetT *facetlist, setT *facetset, bool allfacets);
    -                        //Copy constructor and assignment copies pointer but not contents.  Throws error if qhsettemp_defined.  Needed for return by value.
    -                        QhullVertexSet(const QhullVertexSet &other);
    -    QhullVertexSet &    operator=(const QhullVertexSet &other);
    -                        ~QhullVertexSet();
    -
    -private:                //!Default constructor disabled.  Will implement allocation later
    -                        QhullVertexSet();
    -public:
    -
    -#//!\name Destructor
    -    void                freeQhSetTemp();
    -
    -#//!\name Conversion
    -#ifndef QHULL_NO_STL
    -    std::vector toStdVector() const;
    -#endif //QHULL_NO_STL
    -#ifdef QHULL_USES_QT
    -    QList   toQList() const;
    -#endif //QHULL_USES_QT
    -
    -#//!\name IO
    -    struct PrintVertexSet{
    -        const QhullVertexSet *vertex_set;
    -        const char *    print_message;     //!< non-null message
    -                        
    -                        PrintVertexSet(const char *message, const QhullVertexSet *s) : vertex_set(s), print_message(message) {}
    -    };//PrintVertexSet
    -    const PrintVertexSet print(const char *message) const { return PrintVertexSet(message, this); }
    -
    -    struct PrintIdentifiers{
    -        const QhullVertexSet *vertex_set;
    -        const char *    print_message;    //!< non-null message
    -                        PrintIdentifiers(const char *message, const QhullVertexSet *s) : vertex_set(s), print_message(message) {}
    -    };//PrintIdentifiers
    -    PrintIdentifiers    printIdentifiers(const char *message) const { return PrintIdentifiers(message, this); }
    -
    -};//class QhullVertexSet
    -
    -}//namespace orgQhull
    -
    -#//!\name Global
    -
    -std::ostream &operator<<(std::ostream &os, const orgQhull::QhullVertexSet::PrintVertexSet &pr);
    -std::ostream &operator<<(std::ostream &os, const orgQhull::QhullVertexSet::PrintIdentifiers &p);
    -inline std::ostream &operator<<(std::ostream &os, const orgQhull::QhullVertexSet &vs) { os << vs.print(""); return os; }
    -
    -#endif // QHULLVERTEXSET_H
    diff --git a/src/qhull/src/libqhullcpp/RboxPoints.cpp b/src/qhull/src/libqhullcpp/RboxPoints.cpp
    deleted file mode 100644
    index d7acd9fce0a..00000000000
    --- a/src/qhull/src/libqhullcpp/RboxPoints.cpp
    +++ /dev/null
    @@ -1,224 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/RboxPoints.cpp#3 $$Change: 2066 $
    -** $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#include "libqhullcpp/RboxPoints.h"
    -
    -#include "libqhullcpp/QhullError.h"
    -
    -#include 
    -
    -using std::cerr;
    -using std::endl;
    -using std::istream;
    -using std::ostream;
    -using std::ostringstream;
    -using std::string;
    -using std::vector;
    -using std::ws;
    -
    -#ifdef _MSC_VER  // Microsoft Visual C++ -- warning level 4
    -#pragma warning( disable : 4996)  // function was declared deprecated(strcpy, localtime, etc.)
    -#endif
    -
    -namespace orgQhull {
    -
    -#//! RboxPoints -- generate random PointCoordinates for qhull (rbox)
    -
    -
    -#//!\name Constructors
    -RboxPoints::
    -RboxPoints()
    -: PointCoordinates("rbox")
    -, rbox_new_count(0)
    -, rbox_status(qh_ERRnone)
    -, rbox_message()
    -{
    -    allocateQhullQh();
    -}
    -
    -//! Allocate and generate points according to rboxCommand
    -//! For rbox commands, see http://www.qhull.org/html/rbox.htm or html/rbox.htm
    -//! Same as appendPoints()
    -RboxPoints::
    -RboxPoints(const char *rboxCommand)
    -: PointCoordinates("rbox")
    -, rbox_new_count(0)
    -, rbox_status(qh_ERRnone)
    -, rbox_message()
    -{
    -    allocateQhullQh();
    -    // rbox arguments added to comment() via qh_rboxpoints > qh_fprintf_rbox
    -    appendPoints(rboxCommand);
    -}
    -
    -RboxPoints::
    -~RboxPoints()
    -{
    -    delete qh();
    -    resetQhullQh(0);
    -}
    -
    -// RboxPoints and qh_rboxpoints has several fields in qhT (rbox_errexit..cpp_object)
    -// It shares last_random with qh_rand and qh_srand
    -// The other fields are unused
    -void RboxPoints::
    -allocateQhullQh()
    -{
    -    QHULL_LIB_CHECK /* Check for compatible library */
    -    resetQhullQh(new QhullQh);
    -}//allocateQhullQh
    -
    -#//!\name Messaging
    -
    -void RboxPoints::
    -clearRboxMessage()
    -{
    -    rbox_status= qh_ERRnone;
    -    rbox_message.clear();
    -}//clearRboxMessage
    -
    -std::string RboxPoints::
    -rboxMessage() const
    -{
    -    if(rbox_status!=qh_ERRnone){
    -        return rbox_message;
    -    }
    -    if(isEmpty()){
    -        return "rbox warning: no points generated\n";
    -    }
    -    return "rbox: OK\n";
    -}//rboxMessage
    -
    -int RboxPoints::
    -rboxStatus() const
    -{
    -    return rbox_status;
    -}
    -
    -bool RboxPoints::
    -hasRboxMessage() const
    -{
    -    return (rbox_status!=qh_ERRnone);
    -}
    -
    -#//!\name Methods
    -
    -//! Appends points as defined by rboxCommand
    -//! Appends rboxCommand to comment
    -//! For rbox commands, see http://www.qhull.org/html/rbox.htm or html/rbox.htm
    -void RboxPoints::
    -appendPoints(const char *rboxCommand)
    -{
    -    string s("rbox ");
    -    s += rboxCommand;
    -    char *command= const_cast(s.c_str());
    -    if(qh()->cpp_object){
    -        throw QhullError(10001, "Qhull error: conflicting user of cpp_object for RboxPoints::appendPoints() or corrupted qh_qh");
    -    }
    -    if(extraCoordinatesCount()!=0){
    -        throw QhullError(10067, "Qhull error: Extra coordinates (%d) prior to calling RboxPoints::appendPoints.  Was %s", extraCoordinatesCount(), 0, 0.0, comment().c_str());
    -    }
    -    countT previousCount= count();
    -    qh()->cpp_object= this;           // for qh_fprintf_rbox()
    -    int status= qh_rboxpoints(qh(), command);
    -    qh()->cpp_object= 0;
    -    if(rbox_status==qh_ERRnone){
    -        rbox_status= status;
    -    }
    -    if(rbox_status!=qh_ERRnone){
    -        throw QhullError(rbox_status, rbox_message);
    -    }
    -    if(extraCoordinatesCount()!=0){
    -        throw QhullError(10002, "Qhull error: extra coordinates (%d) for PointCoordinates (%x)", extraCoordinatesCount(), 0, 0.0, coordinates());
    -    }
    -    if(previousCount+newCount()!=count()){
    -        throw QhullError(10068, "Qhull error: rbox specified %d points but got %d points for command '%s'", newCount(), count()-previousCount, 0.0, comment().c_str());
    -    }
    -}//appendPoints
    -
    -}//namespace orgQhull
    -
    -#//!\name Global functions
    -
    -/*---------------------------------
    -
    -  qh_fprintf_rbox(qh, fp, msgcode, format, list of args )
    -    fp is ignored (replaces qh_fprintf_rbox() in userprintf_rbox.c)
    -    cpp_object == RboxPoints
    -
    -notes:
    -    only called from qh_rboxpoints()
    -    same as fprintf() and Qhull.qh_fprintf()
    -    fgets() is not trapped like fprintf()
    -    Do not throw errors from here.  Use qh_errexit_rbox;
    -    A similar technique can be used for qh_fprintf to capture all of its output
    -*/
    -extern "C"
    -void qh_fprintf_rbox(qhT *qh, FILE*, int msgcode, const char *fmt, ... ) {
    -    va_list args;
    -
    -    using namespace orgQhull;
    -
    -    if(!qh->cpp_object){
    -        qh_errexit_rbox(qh, 10072);
    -    }
    -    RboxPoints *out= reinterpret_cast(qh->cpp_object);
    -    va_start(args, fmt);
    -    if(msgcoderbox_message += newMessage;
    -        if(out->rbox_statusrbox_status>=MSG_STDERR){
    -            out->rbox_status= msgcode;
    -        }
    -        va_end(args);
    -        return;
    -    }
    -    switch(msgcode){
    -    case 9391:
    -    case 9392:
    -        out->rbox_message += "RboxPoints error: options 'h', 'n' not supported.\n";
    -        qh_errexit_rbox(qh, 10010);
    -        /* never returns */
    -    case 9393:  // FIXUP QH11026 countT vs. int
    -        {
    -            int dimension= va_arg(args, int);
    -            string command(va_arg(args, char*));
    -            countT count= va_arg(args, countT);
    -            out->setDimension(dimension);
    -            out->appendComment(" \"");
    -            out->appendComment(command.substr(command.find(' ')+1));
    -            out->appendComment("\"");
    -            out->setNewCount(count);
    -            out->reservePoints();
    -        }
    -        break;
    -    case 9407:
    -        *out << va_arg(args, int);
    -        // fall through
    -    case 9405:
    -        *out << va_arg(args, int);
    -        // fall through
    -    case 9403:
    -        *out << va_arg(args, int);
    -        break;
    -    case 9408:
    -        *out << va_arg(args, double);
    -        // fall through
    -    case 9406:
    -        *out << va_arg(args, double);
    -        // fall through
    -    case 9404:
    -        *out << va_arg(args, double);
    -        break;
    -    }
    -    va_end(args);
    -} /* qh_fprintf_rbox */
    -
    diff --git a/src/qhull/src/libqhullcpp/RboxPoints.h b/src/qhull/src/libqhullcpp/RboxPoints.h
    deleted file mode 100644
    index e8ec72b14a0..00000000000
    --- a/src/qhull/src/libqhullcpp/RboxPoints.h
    +++ /dev/null
    @@ -1,69 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/RboxPoints.h#4 $$Change: 2079 $
    -** $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#ifndef RBOXPOINTS_H
    -#define RBOXPOINTS_H
    -
    -#include "libqhull_r/qhull_ra.h"
    -#include "libqhullcpp/QhullPoint.h"
    -#include "libqhullcpp/PointCoordinates.h"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -namespace orgQhull {
    -
    -#//!\name Defined here
    -    //! RboxPoints -- generate random PointCoordinates for Qhull
    -    class RboxPoints;
    -
    -class RboxPoints : public PointCoordinates {
    -
    -private:
    -#//!\name Fields and friends
    -                        //! PointCoordinates.qh() is owned by RboxPoints
    -    countT              rbox_new_count;     //! Number of points for PointCoordinates
    -    int                 rbox_status;    //! error status from rboxpoints.  qh_ERRnone if none.
    -    std::string         rbox_message;   //! stderr from rboxpoints
    -
    -    // '::' is required for friend references
    -    friend void ::qh_fprintf_rbox(qhT *qh, FILE *fp, int msgcode, const char *fmt, ... );
    -
    -public:
    -#//!\name Construct
    -                        RboxPoints();
    -    explicit            RboxPoints(const char *rboxCommand);
    -                        ~RboxPoints();
    -private:                // Disable copy constructor and assignment.  RboxPoints owns QhullQh.
    -                        RboxPoints(const RboxPoints &);
    -                        RboxPoints &operator=(const RboxPoints &);
    -private:
    -    void                allocateQhullQh();
    -
    -public:
    -#//!\name GetSet
    -    void                clearRboxMessage();
    -    countT              newCount() const { return rbox_new_count; }
    -    std::string         rboxMessage() const;
    -    int                 rboxStatus() const;
    -    bool                hasRboxMessage() const;
    -    void                setNewCount(countT pointCount) { QHULL_ASSERT(pointCount>=0); rbox_new_count= pointCount; }
    -
    -#//!\name Modify
    -    void                appendPoints(const char* rboxCommand);
    -    using               PointCoordinates::appendPoints;
    -    void                reservePoints() { reserveCoordinates((count()+newCount())*dimension()); }
    -};//class RboxPoints
    -
    -}//namespace orgQhull
    -
    -#endif // RBOXPOINTS_H
    diff --git a/src/qhull/src/libqhullcpp/RoadError.cpp b/src/qhull/src/libqhullcpp/RoadError.cpp
    deleted file mode 100644
    index 1d41ec1bc1f..00000000000
    --- a/src/qhull/src/libqhullcpp/RoadError.cpp
    +++ /dev/null
    @@ -1,158 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/RoadError.cpp#2 $$Change: 2066 $
    -** $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#//! RoadError -- All exceptions thrown by Qhull are RoadErrors
    -#//! Do not throw RoadError's from destructors.  Use e.logError() instead.
    -
    -#include "libqhullcpp/RoadError.h"
    -
    -#include 
    -#include 
    -#include 
    -
    -using std::cerr;
    -using std::cout;
    -using std::string;
    -
    -#ifdef _MSC_VER  // Microsoft Visual C++ -- warning level 4
    -#endif
    -
    -namespace orgQhull {
    -
    -#//!\name Class fields
    -
    -//! Identifies error messages from Qhull and Road for web searches.
    -//! See QhullError.h#QHULLlastError and user.h#MSG_ERROR
    -const char * RoadError::
    -ROADtag= "QH";
    -
    -std::ostringstream RoadError::
    -global_log;
    -
    -#//!\name Constructor
    -
    -RoadError::
    -RoadError()
    -: error_code(0)
    -, log_event()
    -, error_message()
    -{ }
    -
    -RoadError::
    -RoadError(const RoadError &other)
    -: error_code(other.error_code)
    -, log_event(other.log_event)
    -, error_message(other.error_message)
    -{
    -}//copy construct
    -
    -RoadError::
    -RoadError(int code, const std::string &message)
    -: error_code(code)
    -, log_event(message.c_str())
    -, error_message(log_event.toString(ROADtag, error_code))
    -{
    -    log_event.cstr_1= error_message.c_str(); // overwrites initial value
    -}
    -
    -RoadError::
    -RoadError(int code, const char *fmt)
    -: error_code(code)
    -, log_event(fmt)
    -, error_message()
    -{ }
    -
    -RoadError::
    -RoadError(int code, const char *fmt, int d)
    -: error_code(code)
    -, log_event(fmt, d)
    -, error_message()
    -{ }
    -
    -RoadError::
    -RoadError(int code, const char *fmt, int d, int d2)
    -: error_code(code)
    -, log_event(fmt, d, d2)
    -, error_message()
    -{ }
    -
    -RoadError::
    -RoadError(int code, const char *fmt, int d, int d2, float f)
    -: error_code(code)
    -, log_event(fmt, d, d2, f)
    -, error_message()
    -{ }
    -
    -RoadError::
    -RoadError(int code, const char *fmt, int d, int d2, float f, const char *s)
    -: error_code(code)
    -, log_event(fmt, d, d2, f, s)
    -, error_message(log_event.toString(ROADtag, code)) // char * may go out of scope
    -{ }
    -
    -RoadError::
    -RoadError(int code, const char *fmt, int d, int d2, float f, const void *x)
    -: error_code(code)
    -, log_event(fmt, d, d2, f, x)
    -, error_message()
    -{ }
    -
    -RoadError::
    -RoadError(int code, const char *fmt, int d, int d2, float f, int i)
    -: error_code(code)
    -, log_event(fmt, d, d2, f, i)
    -, error_message()
    -{ }
    -
    -RoadError::
    -RoadError(int code, const char *fmt, int d, int d2, float f, long long i)
    -: error_code(code)
    -, log_event(fmt, d, d2, f, i)
    -, error_message()
    -{ }
    -
    -RoadError::
    -RoadError(int code, const char *fmt, int d, int d2, float f, double e)
    -: error_code(code)
    -, log_event(fmt, d, d2, f, e)
    -, error_message()
    -{ }
    -
    -RoadError & RoadError::
    -operator=(const RoadError &other)
    -{
    -    error_code= other.error_code;
    -    error_message= other.error_message;
    -    log_event= other.log_event;
    -    return *this;
    -}//operator=
    -
    -#//!\name Virtual
    -const char * RoadError::
    -what() const throw()
    -{
    -    if(error_message.empty()){
    -        error_message= log_event.toString(ROADtag, error_code);
    -    }
    -    return error_message.c_str();
    -}//what
    -
    -#//!\name Updates
    -
    -//! Log error instead of throwing it.
    -//! Not reentrant, so avoid using it if possible
    -//!\todo Redesign with a thread-local stream or a reentrant ostringstream
    -void RoadError::
    -logErrorLastResort() const
    -{
    -    global_log << what() << endl;
    -}//logError
    -
    -
    -}//namespace orgQhull
    -
    diff --git a/src/qhull/src/libqhullcpp/RoadError.h b/src/qhull/src/libqhullcpp/RoadError.h
    deleted file mode 100644
    index 1c9f6cdd5a0..00000000000
    --- a/src/qhull/src/libqhullcpp/RoadError.h
    +++ /dev/null
    @@ -1,88 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/RoadError.h#4 $$Change: 2079 $
    -** $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#ifndef ROADERROR_H
    -#define ROADERROR_H
    -
    -#include "libqhull_r/user_r.h"  /* for QHULL_CRTDBG */
    -#include "libqhullcpp/RoadLogEvent.h"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -using std::endl;
    -
    -namespace orgQhull {
    -
    -#//!\name Defined here
    -    //! RoadError -- Report and log errors
    -    //!  See discussion in Saylan, G., "Practical C++ error handling in hybrid environments," Dr. Dobb's Journal, p. 50-55, March 2007.
    -    //!   He uses an auto_ptr to track a stringstream.  It constructs a string on the fly.  RoadError uses the copy constructor to transform RoadLogEvent into a string
    -    class RoadError;
    -
    -class RoadError : public std::exception {
    -
    -private:
    -#//!\name Fields
    -    int                 error_code;  //! Non-zero code (not logged), maybe returned as program status
    -    RoadLogEvent        log_event;   //! Format string w/ arguments
    -    mutable std::string error_message;  //! Formated error message.  Must be after log_event.
    -
    -#//!\name Class fields
    -    static const char  *  ROADtag;
    -    static std::ostringstream  global_log; //!< May be replaced with any ostream object
    -                                    //!< Not reentrant -- only used by RoadError::logErrorLastResort()
    -
    -public:
    -#//!\name Constants
    -
    -#//!\name Constructors
    -    RoadError();
    -    RoadError(const RoadError &other);  //! Called on throw, generates error_message
    -    RoadError(int code, const std::string &message);
    -    RoadError(int code, const char *fmt);
    -    RoadError(int code, const char *fmt, int d);
    -    RoadError(int code, const char *fmt, int d, int d2);
    -    RoadError(int code, const char *fmt, int d, int d2, float f);
    -    RoadError(int code, const char *fmt, int d, int d2, float f, const char *s);
    -    RoadError(int code, const char *fmt, int d, int d2, float f, const void *x);
    -    RoadError(int code, const char *fmt, int d, int d2, float f, int i);
    -    RoadError(int code, const char *fmt, int d, int d2, float f, long long i);
    -    RoadError(int code, const char *fmt, int d, int d2, float f, double e);
    -
    -    RoadError &         operator=(const RoadError &other);
    -                        ~RoadError() throw() {};
    -
    -#//!\name Class methods
    -
    -    static void         clearGlobalLog() { global_log.seekp(0); }
    -    static bool         emptyGlobalLog() { return global_log.tellp()<=0; }
    -    static const char  *stringGlobalLog() { return global_log.str().c_str(); }
    -
    -#//!\name Virtual
    -    virtual const char *what() const throw();
    -
    -#//!\name GetSet
    -    bool                isValid() const { return log_event.isValid(); }
    -    int                 errorCode() const { return error_code; };
    -   // FIXUP QH11021 should RoadError provide errorMessage().  Currently what()
    -    RoadLogEvent        roadLogEvent() const { return log_event; };
    -
    -#//!\name Update
    -    void                logErrorLastResort() const;
    -};//class RoadError
    -
    -}//namespace orgQhull
    -
    -#//!\name Global
    -
    -inline std::ostream &   operator<<(std::ostream &os, const orgQhull::RoadError &e) { return os << e.what(); }
    -
    -#endif // ROADERROR_H
    diff --git a/src/qhull/src/libqhullcpp/RoadLogEvent.cpp b/src/qhull/src/libqhullcpp/RoadLogEvent.cpp
    deleted file mode 100644
    index 9a9cf5960ac..00000000000
    --- a/src/qhull/src/libqhullcpp/RoadLogEvent.cpp
    +++ /dev/null
    @@ -1,122 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/RoadLogEvent.cpp#3 $$Change: 2066 $
    -** $Date: 2016/01/18 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#//! RoadLogEvent -- All exceptions thrown by Qhull are RoadErrors
    -
    -#include "libqhullcpp/RoadLogEvent.h"
    -
    -#include 
    -#include 
    -#include 
    -
    -using std::cout;
    -using std::endl;
    -using std::ostringstream;
    -using std::string;
    -
    -#ifdef _MSC_VER  // Microsoft Visual C++ -- warning level 4
    -#endif
    -
    -namespace orgQhull {
    -
    -#//!\name Conversion
    -string RoadLogEvent::
    -toString(const char *tag, int code) const
    -{
    -    ostringstream os;
    -    if(tag && code){
    -        os << tag << code;
    -        if(format_string){
    -            os << " ";
    -        }
    -    }
    -    if(!format_string){
    -        return os.str();
    -    }
    -    const char *s= format_string;
    -    int dCount= 0;  // Count of %d
    -    int fCount= 0;  // Count of %f
    -    char extraCode= '\0';
    -    while(*s){
    -        if(*s!='%'){
    -            os << *s++;
    -        }else{
    -            char c= *++s;
    -            s++;
    -            switch(c){
    -            case 'd':
    -                if(++dCount>2){
    -                    os << " ERROR_three_%d_in_format ";
    -                }else if(dCount==2){
    -                    os << int_2;
    -                }else{
    -                    os << int_1;
    -                }
    -                break;
    -            case 'e':
    -                if(firstExtraCode(os, c, &extraCode)){
    -                    os << double_1;
    -                }
    -                break;
    -            case 'f':
    -                if(++fCount>1){
    -                    os << " ERROR_two_%f_in_format ";
    -                }else{
    -                    os << float_1;
    -                }
    -                break;
    -            case 'i':
    -                if(firstExtraCode(os, c, &extraCode)){
    -                    os << int64_1;
    -                }
    -                break;
    -            case 's':
    -                if(firstExtraCode(os, c, &extraCode)){
    -                    os << cstr_1;
    -                }
    -                break;
    -            case 'u':
    -                if(firstExtraCode(os, c, &extraCode)){
    -                    os << "0x" << std::hex << int64_1 << std::dec;
    -                }
    -                break;
    -            case 'x':
    -                if(firstExtraCode(os, c, &extraCode)){
    -                    os << void_1;
    -                }
    -                break;
    -            case '%':
    -                os << c;
    -                break;
    -            default:
    -                os << " ERROR_%" << c << "_not_defined_in_format";
    -                break;
    -            }
    -        }
    -    }
    -    if(s[-1]!='\n'){
    -        os << endl;
    -    }
    -    return os.str();
    -}//toString
    -
    -#//!\name Class helpers (static)
    -
    -//! True if this char is the first extra code
    -bool RoadLogEvent::
    -firstExtraCode(std::ostream &os, char c, char *extraCode){
    -    if(*extraCode){
    -        os << " ERROR_%" << *extraCode << "_and_%" << c << "_in_format ";
    -        return false;
    -    }
    -    *extraCode= c;
    -    return true;
    -}//firstExtraCode
    -
    -}//namespace orgQhull
    -
    diff --git a/src/qhull/src/libqhullcpp/RoadLogEvent.h b/src/qhull/src/libqhullcpp/RoadLogEvent.h
    deleted file mode 100644
    index 7c4cfba0de3..00000000000
    --- a/src/qhull/src/libqhullcpp/RoadLogEvent.h
    +++ /dev/null
    @@ -1,77 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/RoadLogEvent.h#1 $$Change: 1981 $
    -** $DateTime: 2015/09/28 20:26:32 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#ifndef ROADLOGEVENT_H
    -#define ROADLOGEVENT_H
    -
    -#include 
    -#include 
    -#include 
    -
    -namespace orgQhull {
    -
    -#//!\name Defined here
    -    //! RoadLogEvent -- Record an event for the RoadLog
    -    struct RoadLogEvent;
    -
    -struct RoadLogEvent {
    -
    -public:
    -#//!\name Fields
    -    const char *    format_string; //! Format string (a literal with format codes, for logging)
    -    int             int_1;       //! Integer argument (%d, for logging)
    -    int             int_2;       //! Integer argument (%d, for logging)
    -    float           float_1;     //! Float argument (%f, for logging)
    -    union {                      //! One additional argument (for logging)
    -        const char *cstr_1;      //!   Cstr argument (%s) -- type checked at construct-time
    -        const void *void_1;      //!   Void* argument (%x) -- Use upper-case codes for object types
    -        long long   int64_1;     //!   signed int64 (%i).  Ambiguous if unsigned is also defined.
    -        double      double_1;    //!   Double argument (%e)
    -    };
    -
    -#//!\name Constants
    -
    -#//!\name Constructors
    -    RoadLogEvent() : format_string(0), int_1(0), int_2(0), float_1(0), int64_1(0) {};
    -    explicit RoadLogEvent(const char *fmt) : format_string(fmt), int_1(0), int_2(0), float_1(0), int64_1(0) {};
    -    RoadLogEvent(const char *fmt, int d) : format_string(fmt), int_1(d), int_2(0), float_1(0), int64_1(0) {};
    -    RoadLogEvent(const char *fmt, int d, int d2) : format_string(fmt), int_1(d), int_2(d2), float_1(0), int64_1(0) {};
    -    RoadLogEvent(const char *fmt, int d, int d2, float f) : format_string(fmt), int_1(d), int_2(d2), float_1(f), int64_1(0) {};
    -    RoadLogEvent(const char *fmt, int d, int d2, float f, const char *s) : format_string(fmt), int_1(d), int_2(d2), float_1(f), cstr_1(s) {};
    -    RoadLogEvent(const char *fmt, int d, int d2, float f, const void *x) : format_string(fmt), int_1(d), int_2(d2), float_1(f), void_1(x) {};
    -    RoadLogEvent(const char *fmt, int d, int d2, float f, int i) : format_string(fmt), int_1(d), int_2(d2), float_1(f), int64_1(i) {};
    -    RoadLogEvent(const char *fmt, int d, int d2, float f, long long i) : format_string(fmt), int_1(d), int_2(d2), float_1(f), int64_1(i) {};
    -    RoadLogEvent(const char *fmt, int d, int d2, float f, double g) : format_string(fmt), int_1(d), int_2(d2), float_1(f), double_1(g) {};
    -    ~RoadLogEvent() {};
    -    //! Default copy constructor and assignment
    -
    -#//!\name GetSet
    -    bool                isValid() const { return format_string!=0; }
    -    int                 int1() const { return int_1; };
    -    int                 int2() const { return int_2; };
    -    float               float1() const { return float_1; };
    -    const char *        format() const { return format_string; };
    -    const char *        cstr1() const { return cstr_1; };
    -    const void *        void1() const { return void_1; };
    -    long long           int64() const { return int64_1; };
    -    double              double1() const { return double_1; };
    -
    -#//!\name Conversion
    -
    -    std::string        toString(const char* tag, int code) const;
    -
    -private:
    -#//!\name Class helpers
    -    static bool         firstExtraCode(std::ostream &os, char c, char *extraCode);
    -
    -
    -};//class RoadLogEvent
    -
    -}//namespace orgQhull
    -
    -#endif // ROADLOGEVENT_H
    diff --git a/src/qhull/src/libqhullcpp/functionObjects.h b/src/qhull/src/libqhullcpp/functionObjects.h
    deleted file mode 100644
    index 3645c0713a7..00000000000
    --- a/src/qhull/src/libqhullcpp/functionObjects.h
    +++ /dev/null
    @@ -1,67 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/functionObjects.h#1 $$Change: 1981 $
    -** $DateTime: 2015/09/28 20:26:32 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#ifndef QHFUNCTIONOBJECTS_H
    -#define QHFUNCTIONOBJECTS_H
    -
    -#include 
    -#include 
    -
    -namespace orgQhull {
    -
    -#//!\name Defined here
    -
    -    //! Sum of absolute values of the elements in a container
    -    class AbsoluteSumOf;
    -    //! Sum of the elements in a container
    -    class SumOf;
    -    //! Sum of squares of the elements in a container
    -    class SumSquaresOf;
    -
    -#//!\name Class
    -
    -//! Absolute sum of the elements in a container
    -class AbsoluteSumOf
    -{
    -private:
    -    double sum;
    -public:
    -    inline AbsoluteSumOf() : sum(0.0) {}
    -    inline void operator()(double v) { sum += fabs(v); }
    -    inline operator double() { return sum; }
    -};//AbsoluteSumOf
    -
    -//! Sum of the elements in a container
    -class SumOf
    -{
    -private:
    -    double sum;
    -public:
    -    inline SumOf() : sum(0.0) {}
    -    inline void operator()(double v) { sum += v; }
    -    inline operator double() { return sum; }
    -};//SumOf
    -
    -
    -//! Sum of squares of the elements in a container
    -class SumSquaresOf
    -{
    -private:
    -    double sum;
    -public:
    -    inline SumSquaresOf() : sum(0.0) {}
    -    inline void operator()(double v) { sum += v*v; }
    -    inline operator double() { return sum; }
    -};//SumSquaresOf
    -
    -
    -}//orgQhull
    -
    -
    -#endif //QHFUNCTIONOBJECTS_H
    -
    diff --git a/src/qhull/src/libqhullcpp/libqhullcpp.pro b/src/qhull/src/libqhullcpp/libqhullcpp.pro
    deleted file mode 100644
    index 89b967bef20..00000000000
    --- a/src/qhull/src/libqhullcpp/libqhullcpp.pro
    +++ /dev/null
    @@ -1,71 +0,0 @@
    -# -------------------------------------------------
    -# libqhullcpp.pro -- Qt project for Qhull cpp shared library
    -#
    -# It uses reentrant Qhull
    -# -------------------------------------------------
    -
    -include(../qhull-warn.pri)
    -
    -DESTDIR = ../../lib
    -TEMPLATE = lib
    -# Do not create libqhullcpp as a shared library.  Qhull C++ classes may change layout and size. 
    -CONFIG += staticlib warn_on
    -CONFIG -= qt rtti
    -build_pass:CONFIG(debug, debug|release):{
    -   TARGET = qhullcpp_d
    -   OBJECTS_DIR = Debug
    -}else:build_pass:CONFIG(release, debug|release):{
    -   TARGET = qhullcpp
    -   OBJECTS_DIR = Release
    -}
    -MOC_DIR = moc
    -
    -INCLUDEPATH += ../../src
    -INCLUDEPATH += $$PWD # for MOC_DIR
    -
    -CONFIG += qhull_warn_shadow qhull_warn_conversion
    -
    -SOURCES += ../libqhullcpp/Coordinates.cpp
    -SOURCES += ../libqhullcpp/PointCoordinates.cpp
    -SOURCES += ../libqhullcpp/Qhull.cpp
    -SOURCES += ../libqhullcpp/QhullFacet.cpp
    -SOURCES += ../libqhullcpp/QhullFacetList.cpp
    -SOURCES += ../libqhullcpp/QhullFacetSet.cpp
    -SOURCES += ../libqhullcpp/QhullHyperplane.cpp
    -SOURCES += ../libqhullcpp/QhullPoint.cpp
    -SOURCES += ../libqhullcpp/QhullPoints.cpp
    -SOURCES += ../libqhullcpp/QhullPointSet.cpp
    -SOURCES += ../libqhullcpp/QhullQh.cpp
    -SOURCES += ../libqhullcpp/QhullRidge.cpp
    -SOURCES += ../libqhullcpp/QhullSet.cpp
    -SOURCES += ../libqhullcpp/QhullStat.cpp
    -SOURCES += ../libqhullcpp/QhullVertex.cpp
    -SOURCES += ../libqhullcpp/QhullVertexSet.cpp
    -SOURCES += ../libqhullcpp/RboxPoints.cpp
    -SOURCES += ../libqhullcpp/RoadError.cpp
    -SOURCES += ../libqhullcpp/RoadLogEvent.cpp
    -
    -HEADERS += ../libqhullcpp/Coordinates.h
    -HEADERS += ../libqhullcpp/functionObjects.h
    -HEADERS += ../libqhullcpp/PointCoordinates.h
    -HEADERS += ../libqhullcpp/Qhull.h
    -HEADERS += ../libqhullcpp/QhullError.h
    -HEADERS += ../libqhullcpp/QhullFacet.h
    -HEADERS += ../libqhullcpp/QhullFacetList.h
    -HEADERS += ../libqhullcpp/QhullFacetSet.h
    -HEADERS += ../libqhullcpp/QhullHyperplane.h
    -HEADERS += ../libqhullcpp/QhullIterator.h
    -HEADERS += ../libqhullcpp/QhullLinkedList.h
    -HEADERS += ../libqhullcpp/QhullPoint.h
    -HEADERS += ../libqhullcpp/QhullPoints.h
    -HEADERS += ../libqhullcpp/QhullPointSet.h
    -HEADERS += ../libqhullcpp/QhullQh.h
    -HEADERS += ../libqhullcpp/QhullRidge.h
    -HEADERS += ../libqhullcpp/QhullSet.h
    -HEADERS += ../libqhullcpp/QhullSets.h
    -HEADERS += ../libqhullcpp/QhullStat.h
    -HEADERS += ../libqhullcpp/QhullVertex.h
    -HEADERS += ../libqhullcpp/QhullVertexSet.h
    -HEADERS += ../libqhullcpp/RboxPoints.h
    -HEADERS += ../libqhullcpp/RoadError.h
    -HEADERS += ../libqhullcpp/RoadLogEvent.h
    diff --git a/src/qhull/src/libqhullcpp/qt-qhull.cpp b/src/qhull/src/libqhullcpp/qt-qhull.cpp
    deleted file mode 100644
    index 895f591a85e..00000000000
    --- a/src/qhull/src/libqhullcpp/qt-qhull.cpp
    +++ /dev/null
    @@ -1,130 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/libqhullcpp/qt-qhull.cpp#1 $$Change: 1981 $
    -** $DateTime: 2015/09/28 20:26:32 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#include 
    -#include "qhulltest/RoadTest.h"
    -
    -#ifndef QHULL_USES_QT
    -#define QHULL_USES_QT 1
    -#endif
    -
    -#include "Coordinates.h"
    -#include "QhullFacetList.h"
    -#include "QhullFacetSet.h"
    -#include "QhullHyperplane.h"
    -#include "QhullPoint.h"
    -#include "QhullPoints.h"
    -#include "QhullPointSet.h"
    -#include "QhullVertex.h"
    -#include "QhullVertexSet.h"
    -
    -namespace orgQhull {
    -
    -#//!\name Conversions
    -
    -QList Coordinates::
    -toQList() const
    -{
    -    CoordinatesIterator i(*this);
    -    QList cs;
    -    while(i.hasNext()){
    -        cs.append(i.next());
    -    }
    -    return cs;
    -}//toQList
    -
    -QList QhullFacetList::
    -toQList() const
    -{
    -    QhullLinkedListIterator i(*this);
    -    QList vs;
    -    while(i.hasNext()){
    -        QhullFacet f= i.next();
    -        if(isSelectAll() || f.isGood()){
    -            vs.append(f);
    -        }
    -    }
    -    return vs;
    -}//toQList
    -
    -//! Same as PrintVertices
    -QList QhullFacetList::
    -vertices_toQList() const
    -{
    -    QList vs;
    -    QhullVertexSet qvs(qh(), first().getFacetT(), NULL, isSelectAll());
    -    for(QhullVertexSet::iterator i=qvs.begin(); i!=qvs.end(); ++i){
    -        vs.push_back(*i);
    -    }
    -    return vs;
    -}//vertices_toQList
    -
    -QList QhullFacetSet::
    -toQList() const
    -{
    -    QhullSetIterator i(*this);
    -    QList vs;
    -    while(i.hasNext()){
    -        QhullFacet f= i.next();
    -        if(isSelectAll() || f.isGood()){
    -            vs.append(f);
    -        }
    -    }
    -    return vs;
    -}//toQList
    -
    -#ifdef QHULL_USES_QT
    -QList QhullHyperplane::
    -toQList() const
    -{
    -    QhullHyperplaneIterator i(*this);
    -    QList fs;
    -    while(i.hasNext()){
    -        fs.append(i.next());
    -    }
    -    fs.append(hyperplane_offset);
    -    return fs;
    -}//toQList
    -#endif //QHULL_USES_QT
    -
    -QList QhullPoint::
    -toQList() const
    -{
    -    QhullPointIterator i(*this);
    -    QList vs;
    -    while(i.hasNext()){
    -        vs.append(i.next());
    -    }
    -    return vs;
    -}//toQList
    -
    -QList QhullPoints::
    -toQList() const
    -{
    -    QhullPointsIterator i(*this);
    -    QList vs;
    -    while(i.hasNext()){
    -        vs.append(i.next());
    -    }
    -    return vs;
    -}//toQList
    -
    -/******
    -QList QhullPointSet::
    -toQList() const
    -{
    -    QhullPointSetIterator i(*this);
    -    QList vs;
    -    while(i.hasNext()){
    -        vs.append(i.next());
    -    }
    -    return vs;
    -}//toQList
    -*/
    -}//orgQhull
    -
    diff --git a/src/qhull/src/libqhullcpp/usermem_r-cpp.cpp b/src/qhull/src/libqhullcpp/usermem_r-cpp.cpp
    deleted file mode 100644
    index bb9534d0983..00000000000
    --- a/src/qhull/src/libqhullcpp/usermem_r-cpp.cpp
    +++ /dev/null
    @@ -1,93 +0,0 @@
    -/*
      ---------------------------------
    -
    -   usermem_r-cpp.cpp
    -
    -   Redefine qh_exit() as 'throw std::runtime_error("QH10003 ...")'
    -
    -   This file is not included in the Qhull builds.
    -
    -   qhull_r calls qh_exit() when qh_errexit() is not available.  For example,
    -   it calls qh_exit() if you linked the wrong qhull library.
    -
    -   The C++ interface avoids most of the calls to qh_exit().
    -
    -   If needed, include usermem_r-cpp.o before libqhullstatic_r.a.  You may need to
    -   override duplicate symbol errors (e.g. /FORCE:MULTIPLE for DevStudio).  It
    -   may produce a warning about throwing an error from C code.
    -*/
    -
    -extern "C" {
    -    void    qh_exit(int exitcode);
    -}
    -
    -#include 
    -#include 
    -
    -/*---------------------------------
    -
    -  qh_exit( exitcode )
    -    exit program
    -
    -  notes:
    -    same as exit()
    -*/
    -void qh_exit(int exitcode) {
    -    exitcode= exitcode;
    -    throw std::runtime_error("QH10003 Qhull error.  See stderr or errfile.");
    -} /* exit */
    -
    -/*---------------------------------
    -
    -  qh_fprintf_stderr( msgcode, format, list of args )
    -    fprintf to stderr with msgcode (non-zero)
    -
    -  notes:
    -    qh_fprintf_stderr() is called when qh->ferr is not defined, usually due to an initialization error
    -
    -    It is typically followed by qh_errexit().
    -
    -    Redefine this function to avoid using stderr
    -
    -    Use qh_fprintf [userprintf_r.c] for normal printing
    -*/
    -void qh_fprintf_stderr(int msgcode, const char *fmt, ... ) {
    -    va_list args;
    -
    -    va_start(args, fmt);
    -    if(msgcode)
    -      fprintf(stderr, "QH%.4d ", msgcode);
    -    vfprintf(stderr, fmt, args);
    -    va_end(args);
    -} /* fprintf_stderr */
    -
    -/*---------------------------------
    -
    -  qh_free(qhT *qh, mem )
    -    free memory
    -
    -  notes:
    -    same as free()
    -    No calls to qh_errexit()
    -*/
    -void qh_free(void *mem) {
    -    free(mem);
    -} /* free */
    -
    -/*---------------------------------
    -
    -    qh_malloc( mem )
    -      allocate memory
    -
    -    notes:
    -      same as malloc()
    -*/
    -void *qh_malloc(size_t size) {
    -    return malloc(size);
    -} /* malloc */
    -
    -
    diff --git a/src/qhull/src/libqhullstatic/libqhullstatic.pro b/src/qhull/src/libqhullstatic/libqhullstatic.pro
    deleted file mode 100644
    index 1a516db73ca..00000000000
    --- a/src/qhull/src/libqhullstatic/libqhullstatic.pro
    +++ /dev/null
    @@ -1,19 +0,0 @@
    -# -------------------------------------------------
    -# libqhullstatic.pro -- Qt project for Qhull static library
    -#   Built with qh_QHpointer=0.  See libqhullp.pro
    -# -------------------------------------------------
    -
    -include(../qhull-warn.pri)
    -include(../qhull-libqhull-src.pri)
    -
    -DESTDIR = ../../lib
    -TEMPLATE = lib
    -CONFIG += staticlib warn_on
    -CONFIG -= qt
    -build_pass:CONFIG(debug, debug|release):{
    -    TARGET = qhullstatic_d
    -    OBJECTS_DIR = Debug
    -}else:build_pass:CONFIG(release, debug|release):{
    -    TARGET = qhullstatic
    -    OBJECTS_DIR = Release
    -}
    diff --git a/src/qhull/src/libqhullstatic_r/libqhullstatic_r.pro b/src/qhull/src/libqhullstatic_r/libqhullstatic_r.pro
    deleted file mode 100644
    index 2f5bf4d0765..00000000000
    --- a/src/qhull/src/libqhullstatic_r/libqhullstatic_r.pro
    +++ /dev/null
    @@ -1,21 +0,0 @@
    -# -------------------------------------------------
    -# libqhullstatic_r.pro -- Qt project for Qhull static library
    -#
    -# It uses reeentrant Qhull
    -# -------------------------------------------------
    -
    -include(../qhull-warn.pri)
    -
    -DESTDIR = ../../lib
    -TEMPLATE = lib
    -CONFIG += staticlib warn_on
    -CONFIG -= qt
    -build_pass:CONFIG(debug, debug|release):{
    -    TARGET = qhullstatic_rd
    -    OBJECTS_DIR = Debug
    -}else:build_pass:CONFIG(release, debug|release):{
    -    TARGET = qhullstatic_r
    -    OBJECTS_DIR = Release
    -}
    -
    -include(../qhull-libqhull-src_r.pri)
    diff --git a/src/qhull/src/qconvex/qconvex.c b/src/qhull/src/qconvex/qconvex.c
    deleted file mode 100644
    index 41bd666da16..00000000000
    --- a/src/qhull/src/qconvex/qconvex.c
    +++ /dev/null
    @@ -1,326 +0,0 @@
    -/*
      ---------------------------------
    -
    -   qconvex.c
    -      compute convex hulls using qhull
    -
    -   see unix.c for full interface
    -
    -   Copyright (c) 1993-2015, The Geometry Center
    -*/
    -
    -#include "libqhull/libqhull.h"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#if __cplusplus
    -extern "C" {
    -  int isatty(int);
    -}
    -
    -#elif _MSC_VER
    -#include 
    -#define isatty _isatty
    -/* int _isatty(int); */
    -
    -#else
    -int isatty(int);  /* returns 1 if stdin is a tty
    -                   if "Undefined symbol" this can be deleted along with call in main() */
    -#endif
    -
    -/*---------------------------------
    -
    -  qh_prompt
    -    long prompt for qconvex
    -
    -  notes:
    -    restricted version of libqhull.c
    -
    -  see:
    -    concise prompt below
    -*/
    -
    -/* duplicated in qconvex.htm */
    -char hidden_options[]=" d v H Qbb Qf Qg Qm Qr Qu Qv Qx Qz TR E V Fp Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 ";
    -
    -char qh_prompta[]= "\n\
    -qconvex- compute the convex hull\n\
    -    http://www.qhull.org  %s\n\
    -\n\
    -input (stdin):\n\
    -    first lines: dimension and number of points (or vice-versa).\n\
    -    other lines: point coordinates, best if one point per line\n\
    -    comments:    start with a non-numeric character\n\
    -\n\
    -options:\n\
    -    Qt   - triangulated output\n\
    -    QJ   - joggled input instead of merged facets\n\
    -    Qc   - keep coplanar points with nearest facet\n\
    -    Qi   - keep interior points with nearest facet\n\
    -\n\
    -Qhull control options:\n\
    -    Qbk:n   - scale coord k so that low bound is n\n\
    -      QBk:n - scale coord k so that upper bound is n (QBk is %2.2g)\n\
    -    QbB  - scale input to unit cube centered at the origin\n\
    -    Qbk:0Bk:0 - remove k-th coordinate from input\n\
    -    QJn  - randomly joggle input in range [-n,n]\n\
    -    QRn  - random rotation (n=seed, n=0 time, n=-1 time/no rotate)\n\
    -%s%s%s%s";  /* split up qh_prompt for Visual C++ */
    -char qh_promptb[]= "\
    -    Qs   - search all points for the initial simplex\n\
    -    QGn  - good facet if visible from point n, -n for not visible\n\
    -    QVn  - good facet if it includes point n, -n if not\n\
    -\n\
    -";
    -char qh_promptc[]= "\
    -Trace options:\n\
    -    T4   - trace at level n, 4=all, 5=mem/gauss, -1= events\n\
    -    Tc   - check frequently during execution\n\
    -    Ts   - print statistics\n\
    -    Tv   - verify result: structure, convexity, and point inclusion\n\
    -    Tz   - send all output to stdout\n\
    -    TFn  - report summary when n or more facets created\n\
    -    TI file - input data from file, no spaces or single quotes\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    -    TPn  - turn on tracing when point n added to hull\n\
    -     TMn - turn on tracing at merge n\n\
    -     TWn - trace merge facets when width > n\n\
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)\n\
    -     TCn - stop qhull after building cone for point n (see TVn)\n\
    -\n\
    -Precision options:\n\
    -    Cn   - radius of centrum (roundoff added).  Merge facets if non-convex\n\
    -     An  - cosine of maximum angle.  Merge facets if cosine > n or non-convex\n\
    -           C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge\n\
    -    Rn   - randomly perturb computations by a factor of [1-n,1+n]\n\
    -    Un   - max distance below plane for a new, coplanar point\n\
    -    Wn   - min facet width for outside point (before roundoff)\n\
    -\n\
    -Output formats (may be combined; if none, produces a summary to stdout):\n\
    -    f    - facet dump\n\
    -    G    - Geomview output (see below)\n\
    -    i    - vertices incident to each facet\n\
    -    m    - Mathematica output (2-d and 3-d)\n\
    -    n    - normals with offsets\n\
    -    o    - OFF file format (dim, points and facets; Voronoi regions)\n\
    -    p    - point coordinates \n\
    -    s    - summary (stderr)\n\
    -\n\
    -";
    -char qh_promptd[]= "\
    -More formats:\n\
    -    Fa   - area for each facet\n\
    -    FA   - compute total area and volume for option 's'\n\
    -    Fc   - count plus coplanar points for each facet\n\
    -           use 'Qc' (default) for coplanar and 'Qi' for interior\n\
    -    FC   - centrum for each facet\n\
    -    Fd   - use cdd format for input (homogeneous with offset first)\n\
    -    FD   - use cdd format for numeric output (offset first)\n\
    -    FF   - facet dump without ridges\n\
    -    Fi   - inner plane for each facet\n\
    -    FI   - ID for each facet\n\
    -    Fm   - merge count for each facet (511 max)\n\
    -    Fn   - count plus neighboring facets for each facet\n\
    -    FN   - count plus neighboring facets for each point\n\
    -    Fo   - outer plane (or max_outside) for each facet\n\
    -    FO   - options and precision constants\n\
    -    FP   - nearest vertex for each coplanar point\n\
    -    FQ   - command used for qconvex\n\
    -    Fs   - summary: #int (8), dimension, #points, tot vertices, tot facets,\n\
    -                      for output: #vertices, #facets,\n\
    -                                  #coplanar points, #non-simplicial facets\n\
    -                    #real (2), max outer plane, min vertex\n\
    -    FS   - sizes:   #int (0) \n\
    -                    #real (2) tot area, tot volume\n\
    -    Ft   - triangulation with centrums for non-simplicial facets (OFF format)\n\
    -    Fv   - count plus vertices for each facet\n\
    -    FV   - average of vertices (a feasible point for 'H')\n\
    -    Fx   - extreme points (in order for 2-d)\n\
    -\n\
    -";
    -char qh_prompte[]= "\
    -Geomview output (2-d, 3-d, and 4-d)\n\
    -    Ga   - all points as dots\n\
    -     Gp  -  coplanar points and vertices as radii\n\
    -     Gv  -  vertices as spheres\n\
    -    Gi   - inner planes only\n\
    -     Gn  -  no planes\n\
    -     Go  -  outer planes only\n\
    -    Gc   - centrums\n\
    -    Gh   - hyperplane intersections\n\
    -    Gr   - ridges\n\
    -    GDn  - drop dimension n in 3-d and 4-d output\n\
    -\n\
    -Print options:\n\
    -    PAn  - keep n largest facets by area\n\
    -    Pdk:n - drop facet if normal[k] <= n (default 0.0)\n\
    -    PDk:n - drop facet if normal[k] >= n\n\
    -    Pg   - print good facets (needs 'QGn' or 'QVn')\n\
    -    PFn  - keep facets whose area is at least n\n\
    -    PG   - print neighbors of good facets\n\
    -    PMn  - keep n facets with most merges\n\
    -    Po   - force output.  If error, output neighborhood of facet\n\
    -    Pp   - do not report precision problems\n\
    -\n\
    -    .    - list of all options\n\
    -    -    - one line descriptions of all options\n\
    -    -V   - version\n\
    -";
    -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    -
    -/*---------------------------------
    -
    -  qh_prompt2
    -    synopsis for qhull
    -*/
    -char qh_prompt2[]= "\n\
    -qconvex- compute the convex hull.  Qhull %s\n\
    -    input (stdin): dimension, number of points, point coordinates\n\
    -    comments start with a non-numeric character\n\
    -\n\
    -options (qconvex.htm):\n\
    -    Qt   - triangulated output\n\
    -    QJ   - joggled input instead of merged facets\n\
    -    Tv   - verify result: structure, convexity, and point inclusion\n\
    -    .    - concise list of all options\n\
    -    -    - one-line description of all options\n\
    -    -V   - version\n\
    -\n\
    -output options (subset):\n\
    -    s    - summary of results (default)\n\
    -    i    - vertices incident to each facet\n\
    -    n    - normals with offsets\n\
    -    p    - vertex coordinates (includes coplanar points if 'Qc')\n\
    -    Fx   - extreme points (convex hull vertices)\n\
    -    FA   - report total area and volume\n\
    -    FS   - compute total area and volume\n\
    -    o    - OFF format (dim, n, points, facets)\n\
    -    G    - Geomview output (2-d, 3-d, and 4-d)\n\
    -    m    - Mathematica output (2-d and 3-d)\n\
    -    QVn  - print facets that include point n, -n if not\n\
    -    TO file- output results to file, may be enclosed in single quotes\n\
    -\n\
    -examples:\n\
    -    rbox c D2 | qconvex s n                    rbox c D2 | qconvex i\n\
    -    rbox c D2 | qconvex o                      rbox 1000 s | qconvex s Tv FA\n\
    -    rbox c d D2 | qconvex s Qc Fx              rbox y 1000 W0 | qconvex s n\n\
    -    rbox y 1000 W0 | qconvex s QJ              rbox d G1 D12 | qconvex QR0 FA Pp\n\
    -    rbox c D7 | qconvex FA TF1000\n\
    -\n\
    -";
    -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    -
    -/*---------------------------------
    -
    -  qh_prompt3
    -    concise prompt for qhull
    -*/
    -char qh_prompt3[]= "\n\
    -Qhull %s.\n\
    -Except for 'F.' and 'PG', upper-case options take an argument.\n\
    -\n\
    - incidences     mathematica    normals        OFF_format     points\n\
    - summary        facet_dump\n\
    -\n\
    - Farea          FArea_total    Fcoplanars     FCentrums      Fd_cdd_in\n\
    - FD_cdd_out     FFacet_xridge  Finner         FIDs           Fmerges\n\
    - Fneighbors     FNeigh_vertex  Fouter         FOptions       FPoint_near\n\
    - FQhull         Fsummary       FSize          Fvertices      FVertex_ave\n\
    - Fxtremes       FMaple\n\
    -\n\
    - Gvertices      Gpoints        Gall_points    Gno_planes     Ginner\n\
    - Gcentrums      Ghyperplanes   Gridges        Gouter         GDrop_dim\n\
    -\n\
    - PArea_keep     Pdrop d0:0D0   PFacet_area_keep Pgood        PGood_neighbors\n\
    - PMerge_keep    Poutput_forced Pprecision_not\n\
    -\n\
    - QbBound 0:0.5  QbB_scale_box  Qcoplanar      QGood_point    Qinterior\n\
    - QJoggle        Qrandom        QRotate        Qsearch_1st    Qtriangulate\n\
    - QVertex_good\n\
    -\n\
    - T4_trace       Tcheck_often   Tstatistics    Tverify        Tz_stdout\n\
    - TFacet_log     TInput_file    TPoint_trace   TMerge_trace   TOutput_file\n\
    - TWide_trace    TVertex_stop   TCone_stop\n\
    -\n\
    - Angle_max      Centrum_size   Random_dist    Ucoplanar_max  Wide_outside\n\
    -";
    -
    -/*---------------------------------
    -
    -  main( argc, argv )
    -    processes the command line, calls qhull() to do the work, and exits
    -
    -  design:
    -    initializes data structures
    -    reads points
    -    finishes initialization
    -    computes convex hull and other structures
    -    checks the result
    -    writes the output
    -    frees memory
    -*/
    -int main(int argc, char *argv[]) {
    -  int curlong, totlong; /* used !qh_NOmem */
    -  int exitcode, numpoints, dim;
    -  coordT *points;
    -  boolT ismalloc;
    -
    -  QHULL_LIB_CHECK /* Check for compatible library */
    -
    -  if ((argc == 1) && isatty( 0 /*stdin*/)) {
    -    fprintf(stdout, qh_prompt2, qh_version);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) {
    -    fprintf(stdout, qh_prompta, qh_version, qh_DEFAULTbox,
    -                qh_promptb, qh_promptc, qh_promptd, qh_prompte);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '.' && !*(argv[1]+1)) {
    -    fprintf(stdout, qh_prompt3, qh_version);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '-' && *(argv[1]+1)=='V') {
    -      fprintf(stdout, "%s\n", qh_version2);
    -      exit(qh_ERRnone);
    -  }
    -  qh_init_A(stdin, stdout, stderr, argc, argv);  /* sets qh qhull_command */
    -  exitcode= setjmp(qh errexit); /* simple statement for CRAY J916 */
    -  if (!exitcode) {
    -    qh NOerrexit = False;
    -    qh_checkflags(qh qhull_command, hidden_options);
    -    qh_initflags(qh qhull_command);
    -    points= qh_readpoints(&numpoints, &dim, &ismalloc);
    -    if (dim >= 5) {
    -      qh_option("Qxact_merge", NULL, NULL);
    -      qh MERGEexact= True; /* 'Qx' always */
    -    }
    -    qh_init_B(points, numpoints, dim, ismalloc);
    -    qh_qhull();
    -    qh_check_output();
    -    qh_produce_output();
    -    if (qh VERIFYoutput && !qh FORCEoutput && !qh STOPpoint && !qh STOPcone)
    -      qh_check_points();
    -    exitcode= qh_ERRnone;
    -  }
    -  qh NOerrexit= True;  /* no more setjmp */
    -#ifdef qh_NOmem
    -  qh_freeqhull(qh_ALL);
    -#else
    -  qh_freeqhull(!qh_ALL);
    -  qh_memfreeshort(&curlong, &totlong);
    -  if (curlong || totlong)
    -    qh_fprintf_stderr(6263, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
    -       totlong, curlong);
    -#endif
    -  return exitcode;
    -} /* main */
    -
    diff --git a/src/qhull/src/qconvex/qconvex.pro b/src/qhull/src/qconvex/qconvex.pro
    deleted file mode 100644
    index 1bf631bff66..00000000000
    --- a/src/qhull/src/qconvex/qconvex.pro
    +++ /dev/null
    @@ -1,9 +0,0 @@
    -# -------------------------------------------------
    -# qconvex.pro -- Qt project file for qconvex.exe
    -# -------------------------------------------------
    -
    -include(../qhull-app-c.pri)
    -
    -TARGET = qconvex
    -
    -SOURCES += qconvex.c
    diff --git a/src/qhull/src/qconvex/qconvex_r.c b/src/qhull/src/qconvex/qconvex_r.c
    deleted file mode 100644
    index abf68ce37e8..00000000000
    --- a/src/qhull/src/qconvex/qconvex_r.c
    +++ /dev/null
    @@ -1,328 +0,0 @@
    -/*
      ---------------------------------
    -
    -   qconvex.c
    -      compute convex hulls using qhull
    -
    -   see unix.c for full interface
    -
    -   Copyright (c) 1993-2015, The Geometry Center
    -*/
    -
    -#include "libqhull_r/libqhull_r.h"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#if __cplusplus
    -extern "C" {
    -  int isatty(int);
    -}
    -
    -#elif _MSC_VER
    -#include 
    -#define isatty _isatty
    -/* int _isatty(int); */
    -
    -#else
    -int isatty(int);  /* returns 1 if stdin is a tty
    -                   if "Undefined symbol" this can be deleted along with call in main() */
    -#endif
    -
    -/*---------------------------------
    -
    -  qh_prompt
    -    long prompt for qconvex
    -
    -  notes:
    -    restricted version of libqhull.c
    -
    -  see:
    -    concise prompt below
    -*/
    -
    -/* duplicated in qconvex.htm */
    -char hidden_options[]=" d v H Qbb Qf Qg Qm Qr Qu Qv Qx Qz TR E V Fp Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 ";
    -
    -char qh_prompta[]= "\n\
    -qconvex- compute the convex hull\n\
    -    http://www.qhull.org  %s\n\
    -\n\
    -input (stdin):\n\
    -    first lines: dimension and number of points (or vice-versa).\n\
    -    other lines: point coordinates, best if one point per line\n\
    -    comments:    start with a non-numeric character\n\
    -\n\
    -options:\n\
    -    Qt   - triangulated output\n\
    -    QJ   - joggled input instead of merged facets\n\
    -    Qc   - keep coplanar points with nearest facet\n\
    -    Qi   - keep interior points with nearest facet\n\
    -\n\
    -Qhull control options:\n\
    -    Qbk:n   - scale coord k so that low bound is n\n\
    -      QBk:n - scale coord k so that upper bound is n (QBk is %2.2g)\n\
    -    QbB  - scale input to unit cube centered at the origin\n\
    -    Qbk:0Bk:0 - remove k-th coordinate from input\n\
    -    QJn  - randomly joggle input in range [-n,n]\n\
    -    QRn  - random rotation (n=seed, n=0 time, n=-1 time/no rotate)\n\
    -%s%s%s%s";  /* split up qh_prompt for Visual C++ */
    -char qh_promptb[]= "\
    -    Qs   - search all points for the initial simplex\n\
    -    QGn  - good facet if visible from point n, -n for not visible\n\
    -    QVn  - good facet if it includes point n, -n if not\n\
    -\n\
    -";
    -char qh_promptc[]= "\
    -Trace options:\n\
    -    T4   - trace at level n, 4=all, 5=mem/gauss, -1= events\n\
    -    Tc   - check frequently during execution\n\
    -    Ts   - print statistics\n\
    -    Tv   - verify result: structure, convexity, and point inclusion\n\
    -    Tz   - send all output to stdout\n\
    -    TFn  - report summary when n or more facets created\n\
    -    TI file - input data from file, no spaces or single quotes\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    -    TPn  - turn on tracing when point n added to hull\n\
    -     TMn - turn on tracing at merge n\n\
    -     TWn - trace merge facets when width > n\n\
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)\n\
    -     TCn - stop qhull after building cone for point n (see TVn)\n\
    -\n\
    -Precision options:\n\
    -    Cn   - radius of centrum (roundoff added).  Merge facets if non-convex\n\
    -     An  - cosine of maximum angle.  Merge facets if cosine > n or non-convex\n\
    -           C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge\n\
    -    Rn   - randomly perturb computations by a factor of [1-n,1+n]\n\
    -    Un   - max distance below plane for a new, coplanar point\n\
    -    Wn   - min facet width for outside point (before roundoff)\n\
    -\n\
    -Output formats (may be combined; if none, produces a summary to stdout):\n\
    -    f    - facet dump\n\
    -    G    - Geomview output (see below)\n\
    -    i    - vertices incident to each facet\n\
    -    m    - Mathematica output (2-d and 3-d)\n\
    -    n    - normals with offsets\n\
    -    o    - OFF file format (dim, points and facets; Voronoi regions)\n\
    -    p    - point coordinates \n\
    -    s    - summary (stderr)\n\
    -\n\
    -";
    -char qh_promptd[]= "\
    -More formats:\n\
    -    Fa   - area for each facet\n\
    -    FA   - compute total area and volume for option 's'\n\
    -    Fc   - count plus coplanar points for each facet\n\
    -           use 'Qc' (default) for coplanar and 'Qi' for interior\n\
    -    FC   - centrum for each facet\n\
    -    Fd   - use cdd format for input (homogeneous with offset first)\n\
    -    FD   - use cdd format for numeric output (offset first)\n\
    -    FF   - facet dump without ridges\n\
    -    Fi   - inner plane for each facet\n\
    -    FI   - ID for each facet\n\
    -    Fm   - merge count for each facet (511 max)\n\
    -    Fn   - count plus neighboring facets for each facet\n\
    -    FN   - count plus neighboring facets for each point\n\
    -    Fo   - outer plane (or max_outside) for each facet\n\
    -    FO   - options and precision constants\n\
    -    FP   - nearest vertex for each coplanar point\n\
    -    FQ   - command used for qconvex\n\
    -    Fs   - summary: #int (8), dimension, #points, tot vertices, tot facets,\n\
    -                      for output: #vertices, #facets,\n\
    -                                  #coplanar points, #non-simplicial facets\n\
    -                    #real (2), max outer plane, min vertex\n\
    -    FS   - sizes:   #int (0) \n\
    -                    #real (2) tot area, tot volume\n\
    -    Ft   - triangulation with centrums for non-simplicial facets (OFF format)\n\
    -    Fv   - count plus vertices for each facet\n\
    -    FV   - average of vertices (a feasible point for 'H')\n\
    -    Fx   - extreme points (in order for 2-d)\n\
    -\n\
    -";
    -char qh_prompte[]= "\
    -Geomview output (2-d, 3-d, and 4-d)\n\
    -    Ga   - all points as dots\n\
    -     Gp  -  coplanar points and vertices as radii\n\
    -     Gv  -  vertices as spheres\n\
    -    Gi   - inner planes only\n\
    -     Gn  -  no planes\n\
    -     Go  -  outer planes only\n\
    -    Gc   - centrums\n\
    -    Gh   - hyperplane intersections\n\
    -    Gr   - ridges\n\
    -    GDn  - drop dimension n in 3-d and 4-d output\n\
    -\n\
    -Print options:\n\
    -    PAn  - keep n largest facets by area\n\
    -    Pdk:n - drop facet if normal[k] <= n (default 0.0)\n\
    -    PDk:n - drop facet if normal[k] >= n\n\
    -    Pg   - print good facets (needs 'QGn' or 'QVn')\n\
    -    PFn  - keep facets whose area is at least n\n\
    -    PG   - print neighbors of good facets\n\
    -    PMn  - keep n facets with most merges\n\
    -    Po   - force output.  If error, output neighborhood of facet\n\
    -    Pp   - do not report precision problems\n\
    -\n\
    -    .    - list of all options\n\
    -    -    - one line descriptions of all options\n\
    -    -V   - version\n\
    -";
    -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    -
    -/*---------------------------------
    -
    -  qh_prompt2
    -    synopsis for qhull
    -*/
    -char qh_prompt2[]= "\n\
    -qconvex- compute the convex hull.  Qhull %s\n\
    -    input (stdin): dimension, number of points, point coordinates\n\
    -    comments start with a non-numeric character\n\
    -\n\
    -options (qconvex.htm):\n\
    -    Qt   - triangulated output\n\
    -    QJ   - joggled input instead of merged facets\n\
    -    Tv   - verify result: structure, convexity, and point inclusion\n\
    -    .    - concise list of all options\n\
    -    -    - one-line description of all options\n\
    -    -V   - version\n\
    -\n\
    -output options (subset):\n\
    -    s    - summary of results (default)\n\
    -    i    - vertices incident to each facet\n\
    -    n    - normals with offsets\n\
    -    p    - vertex coordinates (includes coplanar points if 'Qc')\n\
    -    Fx   - extreme points (convex hull vertices)\n\
    -    FA   - report total area and volume\n\
    -    FS   - compute total area and volume\n\
    -    o    - OFF format (dim, n, points, facets)\n\
    -    G    - Geomview output (2-d, 3-d, and 4-d)\n\
    -    m    - Mathematica output (2-d and 3-d)\n\
    -    QVn  - print facets that include point n, -n if not\n\
    -    TO file- output results to file, may be enclosed in single quotes\n\
    -\n\
    -examples:\n\
    -    rbox c D2 | qconvex s n                    rbox c D2 | qconvex i\n\
    -    rbox c D2 | qconvex o                      rbox 1000 s | qconvex s Tv FA\n\
    -    rbox c d D2 | qconvex s Qc Fx              rbox y 1000 W0 | qconvex s n\n\
    -    rbox y 1000 W0 | qconvex s QJ              rbox d G1 D12 | qconvex QR0 FA Pp\n\
    -    rbox c D7 | qconvex FA TF1000\n\
    -\n\
    -";
    -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    -
    -/*---------------------------------
    -
    -  qh_prompt3
    -    concise prompt for qhull
    -*/
    -char qh_prompt3[]= "\n\
    -Qhull %s.\n\
    -Except for 'F.' and 'PG', upper-case options take an argument.\n\
    -\n\
    - incidences     mathematica    normals        OFF_format     points\n\
    - summary        facet_dump\n\
    -\n\
    - Farea          FArea_total    Fcoplanars     FCentrums      Fd_cdd_in\n\
    - FD_cdd_out     FFacet_xridge  Finner         FIDs           Fmerges\n\
    - Fneighbors     FNeigh_vertex  Fouter         FOptions       FPoint_near\n\
    - FQhull         Fsummary       FSize          Fvertices      FVertex_ave\n\
    - Fxtremes       FMaple\n\
    -\n\
    - Gvertices      Gpoints        Gall_points    Gno_planes     Ginner\n\
    - Gcentrums      Ghyperplanes   Gridges        Gouter         GDrop_dim\n\
    -\n\
    - PArea_keep     Pdrop d0:0D0   PFacet_area_keep Pgood        PGood_neighbors\n\
    - PMerge_keep    Poutput_forced Pprecision_not\n\
    -\n\
    - QbBound 0:0.5  QbB_scale_box  Qcoplanar      QGood_point    Qinterior\n\
    - QJoggle        Qrandom        QRotate        Qsearch_1st    Qtriangulate\n\
    - QVertex_good\n\
    -\n\
    - T4_trace       Tcheck_often   Tstatistics    Tverify        Tz_stdout\n\
    - TFacet_log     TInput_file    TPoint_trace   TMerge_trace   TOutput_file\n\
    - TWide_trace    TVertex_stop   TCone_stop\n\
    -\n\
    - Angle_max      Centrum_size   Random_dist    Ucoplanar_max  Wide_outside\n\
    -";
    -
    -/*---------------------------------
    -
    -  main( argc, argv )
    -    processes the command line, calls qhull() to do the work, and exits
    -
    -  design:
    -    initializes data structures
    -    reads points
    -    finishes initialization
    -    computes convex hull and other structures
    -    checks the result
    -    writes the output
    -    frees memory
    -*/
    -int main(int argc, char *argv[]) {
    -  int curlong, totlong; /* used !qh_NOmem */
    -  int exitcode, numpoints, dim;
    -  coordT *points;
    -  boolT ismalloc;
    -  qhT qh_qh;
    -  qhT *qh= &qh_qh;
    -
    -  QHULL_LIB_CHECK /* Check for compatible library */
    -
    -  if ((argc == 1) && isatty( 0 /*stdin*/)) {
    -    fprintf(stdout, qh_prompt2, qh_version);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) {
    -    fprintf(stdout, qh_prompta, qh_version, qh_DEFAULTbox,
    -                qh_promptb, qh_promptc, qh_promptd, qh_prompte);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '.' && !*(argv[1]+1)) {
    -    fprintf(stdout, qh_prompt3, qh_version);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '-' && *(argv[1]+1)=='V') {
    -      fprintf(stdout, "%s\n", qh_version2);
    -      exit(qh_ERRnone);
    -  }
    -  qh_init_A(qh, stdin, stdout, stderr, argc, argv);  /* sets qh->qhull_command */
    -  exitcode= setjmp(qh->errexit); /* simple statement for CRAY J916 */
    -  if (!exitcode) {
    -    qh->NOerrexit = False;
    -    qh_checkflags(qh, qh->qhull_command, hidden_options);
    -    qh_initflags(qh, qh->qhull_command);
    -    points= qh_readpoints(qh, &numpoints, &dim, &ismalloc);
    -    if (dim >= 5) {
    -      qh_option(qh, "Qxact_merge", NULL, NULL);
    -      qh->MERGEexact= True; /* 'Qx' always */
    -    }
    -    qh_init_B(qh, points, numpoints, dim, ismalloc);
    -    qh_qhull(qh);
    -    qh_check_output(qh);
    -    qh_produce_output(qh);
    -    if (qh->VERIFYoutput && !qh->FORCEoutput && !qh->STOPpoint && !qh->STOPcone)
    -      qh_check_points(qh);
    -    exitcode= qh_ERRnone;
    -  }
    -  qh->NOerrexit= True;  /* no more setjmp */
    -#ifdef qh_NOmem
    -  qh_freeqhull(qh, qh_ALL);
    -#else
    -  qh_freeqhull(qh, !qh_ALL);
    -  qh_memfreeshort(qh, &curlong, &totlong);
    -  if (curlong || totlong)
    -    qh_fprintf_stderr(6263, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
    -       totlong, curlong);
    -#endif
    -  return exitcode;
    -} /* main */
    -
    diff --git a/src/qhull/src/qdelaunay/qdelaun.c b/src/qhull/src/qdelaunay/qdelaun.c
    deleted file mode 100644
    index 9011d9fcc05..00000000000
    --- a/src/qhull/src/qdelaunay/qdelaun.c
    +++ /dev/null
    @@ -1,315 +0,0 @@
    -/*
      ---------------------------------
    -
    -   qdelaun.c
    -     compute Delaunay triangulations and furthest-point Delaunay
    -     triangulations using qhull
    -
    -   see unix.c for full interface
    -
    -   Copyright (c) 1993-2015, The Geometry Center
    -*/
    -
    -#include "libqhull/libqhull.h"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#if __cplusplus
    -extern "C" {
    -  int isatty(int);
    -}
    -
    -#elif _MSC_VER
    -#include 
    -#define isatty _isatty
    -/* int _isatty(int); */
    -
    -#else
    -int isatty(int);  /* returns 1 if stdin is a tty
    -                   if "Undefined symbol" this can be deleted along with call in main() */
    -#endif
    -
    -/*---------------------------------
    -
    -  qh_prompt
    -    long prompt for qhull
    -
    -  notes:
    -    restricted version of libqhull.c
    -
    -  see:
    -    concise prompt below
    -*/
    -
    -/* duplicated in qdelau_f.htm and qdelaun.htm */
    -char hidden_options[]=" d n v H U Qb QB Qc Qf Qg Qi Qm Qr QR Qv Qx TR E V FC Fi Fo Ft Fp FV Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 ";
    -
    -char qh_prompta[]= "\n\
    -qdelaunay- compute the Delaunay triangulation\n\
    -    http://www.qhull.org  %s\n\
    -\n\
    -input (stdin):\n\
    -    first lines: dimension and number of points (or vice-versa).\n\
    -    other lines: point coordinates, best if one point per line\n\
    -    comments:    start with a non-numeric character\n\
    -\n\
    -options:\n\
    -    Qu   - compute furthest-site Delaunay triangulation\n\
    -    Qt   - triangulated output\n\
    -    QJ   - joggled input instead of merged facets\n\
    -\n\
    -Qhull control options:\n\
    -    QJn  - randomly joggle input in range [-n,n]\n\
    -%s%s%s%s";  /* split up qh_prompt for Visual C++ */
    -char qh_promptb[]= "\
    -    Qs   - search all points for the initial simplex\n\
    -    Qz   - add point-at-infinity to Delaunay triangulation\n\
    -    QGn  - print Delaunay region if visible from point n, -n if not\n\
    -    QVn  - print Delaunay regions that include point n, -n if not\n\
    -\n\
    -";
    -char qh_promptc[]= "\
    -Trace options:\n\
    -    T4   - trace at level n, 4=all, 5=mem/gauss, -1= events\n\
    -    Tc   - check frequently during execution\n\
    -    Ts   - print statistics\n\
    -    Tv   - verify result: structure, convexity, and in-circle test\n\
    -    Tz   - send all output to stdout\n\
    -    TFn  - report summary when n or more facets created\n\
    -    TI file - input data from file, no spaces or single quotes\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    -    TPn  - turn on tracing when point n added to hull\n\
    -     TMn - turn on tracing at merge n\n\
    -     TWn - trace merge facets when width > n\n\
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)\n\
    -     TCn - stop qhull after building cone for point n (see TVn)\n\
    -\n\
    -Precision options:\n\
    -    Cn   - radius of centrum (roundoff added).  Merge facets if non-convex\n\
    -     An  - cosine of maximum angle.  Merge facets if cosine > n or non-convex\n\
    -           C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge\n\
    -    Rn   - randomly perturb computations by a factor of [1-n,1+n]\n\
    -    Wn   - min facet width for outside point (before roundoff)\n\
    -\n\
    -Output formats (may be combined; if none, produces a summary to stdout):\n\
    -    f    - facet dump\n\
    -    G    - Geomview output (see below)\n\
    -    i    - vertices incident to each Delaunay region\n\
    -    m    - Mathematica output (2-d only, lifted to a paraboloid)\n\
    -    o    - OFF format (dim, points, and facets as a paraboloid)\n\
    -    p    - point coordinates (lifted to a paraboloid)\n\
    -    s    - summary (stderr)\n\
    -\n\
    -";
    -char qh_promptd[]= "\
    -More formats:\n\
    -    Fa   - area for each Delaunay region\n\
    -    FA   - compute total area for option 's'\n\
    -    Fc   - count plus coincident points for each Delaunay region\n\
    -    Fd   - use cdd format for input (homogeneous with offset first)\n\
    -    FD   - use cdd format for numeric output (offset first)\n\
    -    FF   - facet dump without ridges\n\
    -    FI   - ID of each Delaunay region\n\
    -    Fm   - merge count for each Delaunay region (511 max)\n\
    -    FM   - Maple output (2-d only, lifted to a paraboloid)\n\
    -    Fn   - count plus neighboring region for each Delaunay region\n\
    -    FN   - count plus neighboring region for each point\n\
    -    FO   - options and precision constants\n\
    -    FP   - nearest point and distance for each coincident point\n\
    -    FQ   - command used for qdelaunay\n\
    -    Fs   - summary: #int (8), dimension, #points, tot vertices, tot facets,\n\
    -                    for output: #vertices, #Delaunay regions,\n\
    -                                #coincident points, #non-simplicial regions\n\
    -                    #real (2), max outer plane, min vertex\n\
    -    FS   - sizes:   #int (0)\n\
    -                    #real (2), tot area, 0\n\
    -    Fv   - count plus vertices for each Delaunay region\n\
    -    Fx   - extreme points of Delaunay triangulation (on convex hull)\n\
    -\n\
    -";
    -char qh_prompte[]= "\
    -Geomview options (2-d and 3-d)\n\
    -    Ga   - all points as dots\n\
    -     Gp  -  coplanar points and vertices as radii\n\
    -     Gv  -  vertices as spheres\n\
    -    Gi   - inner planes only\n\
    -     Gn  -  no planes\n\
    -     Go  -  outer planes only\n\
    -    Gc     - centrums\n\
    -    Gh   - hyperplane intersections\n\
    -    Gr   - ridges\n\
    -    GDn  - drop dimension n in 3-d and 4-d output\n\
    -    Gt   - transparent outer ridges to view 3-d Delaunay\n\
    -\n\
    -Print options:\n\
    -    PAn  - keep n largest Delaunay regions by area\n\
    -    Pdk:n - drop facet if normal[k] <= n (default 0.0)\n\
    -    PDk:n - drop facet if normal[k] >= n\n\
    -    Pg   - print good Delaunay regions (needs 'QGn' or 'QVn')\n\
    -    PFn  - keep Delaunay regions whose area is at least n\n\
    -    PG   - print neighbors of good regions (needs 'QGn' or 'QVn')\n\
    -    PMn  - keep n Delaunay regions with most merges\n\
    -    Po   - force output.  If error, output neighborhood of facet\n\
    -    Pp   - do not report precision problems\n\
    -\n\
    -    .    - list of all options\n\
    -    -    - one line descriptions of all options\n\
    -    -V   - version\n\
    -";
    -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    -
    -/*---------------------------------
    -
    -  qh_prompt2
    -    synopsis for qhull
    -*/
    -char qh_prompt2[]= "\n\
    -qdelaunay- compute the Delaunay triangulation.  Qhull %s\n\
    -    input (stdin): dimension, number of points, point coordinates\n\
    -    comments start with a non-numeric character\n\
    -\n\
    -options (qdelaun.htm):\n\
    -    Qu   - furthest-site Delaunay triangulation\n\
    -    Qt   - triangulated output\n\
    -    QJ   - joggled input instead of merged facets\n\
    -    Tv   - verify result: structure, convexity, and in-circle test\n\
    -    .    - concise list of all options\n\
    -    -    - one-line description of all options\n\
    -    -V   - version\n\
    -\n\
    -output options (subset):\n\
    -    s    - summary of results (default)\n\
    -    i    - vertices incident to each Delaunay region\n\
    -    Fx   - extreme points (vertices of the convex hull)\n\
    -    o    - OFF format (shows the points lifted to a paraboloid)\n\
    -    G    - Geomview output (2-d and 3-d points lifted to a paraboloid)\n\
    -    m    - Mathematica output (2-d inputs lifted to a paraboloid)\n\
    -    QVn  - print Delaunay regions that include point n, -n if not\n\
    -    TO file- output results to file, may be enclosed in single quotes\n\
    -\n\
    -examples:\n\
    -    rbox c P0 D2 | qdelaunay s o          rbox c P0 D2 | qdelaunay i\n\
    -    rbox c P0 D2 | qdelaunay Fv           rbox c P0 D2 | qdelaunay s Qu Fv\n\
    -    rbox c G1 d D2 | qdelaunay s i        rbox c G1 d D2 | qdelaunay Qt\n\
    -    rbox M3,4 z 100 D2 | qdelaunay s      rbox M3,4 z 100 D2 | qdelaunay s Qt\n\
    -\n\
    -";
    -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    -
    -/*---------------------------------
    -
    -  qh_prompt3
    -    concise prompt for qhull
    -*/
    -char qh_prompt3[]= "\n\
    -Qhull %s.\n\
    -Except for 'F.' and 'PG', upper-case options take an argument.\n\
    -\n\
    - incidences     mathematica    OFF_format     points_lifted  summary\n\
    - facet_dump\n\
    -\n\
    - Farea          FArea_total    Fcoincident    Fd_cdd_in      FD_cdd_out\n\
    - FF_dump_xridge FIDs           Fmerges        Fneighbors     FNeigh_vertex\n\
    - FOptions       FPoint_near    FQdelaun       Fsummary       FSize\n\
    - Fvertices      Fxtremes       FMaple\n\
    -\n\
    - Gvertices      Gpoints        Gall_points    Gno_planes     Ginner\n\
    - Gcentrums      Ghyperplanes   Gridges        Gouter         GDrop_dim\n\
    - Gtransparent\n\
    -\n\
    - PArea_keep     Pdrop d0:0D0   Pgood          PFacet_area_keep\n\
    - PGood_neighbors PMerge_keep   Poutput_forced Pprecision_not\n\
    -\n\
    - QGood_point    QJoggle        Qsearch_1st    Qtriangulate   QupperDelaunay\n\
    - QVertex_good   Qzinfinite\n\
    -\n\
    - T4_trace       Tcheck_often   Tstatistics    Tverify        Tz_stdout\n\
    - TFacet_log     TInput_file    TPoint_trace   TMerge_trace   TOutput_file\n\
    - TWide_trace    TVertex_stop   TCone_stop\n\
    -\n\
    - Angle_max      Centrum_size   Random_dist    Wide_outside\n\
    -";
    -
    -/*---------------------------------
    -
    -  main( argc, argv )
    -    processes the command line, calls qhull() to do the work, and exits
    -
    -  design:
    -    initializes data structures
    -    reads points
    -    finishes initialization
    -    computes convex hull and other structures
    -    checks the result
    -    writes the output
    -    frees memory
    -*/
    -int main(int argc, char *argv[]) {
    -  int curlong, totlong; /* used !qh_NOmem */
    -  int exitcode, numpoints, dim;
    -  coordT *points;
    -  boolT ismalloc;
    -
    -  QHULL_LIB_CHECK /* Check for compatible library */
    -
    -  if ((argc == 1) && isatty( 0 /*stdin*/)) {
    -    fprintf(stdout, qh_prompt2, qh_version);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) {
    -    fprintf(stdout, qh_prompta, qh_version,
    -                qh_promptb, qh_promptc, qh_promptd, qh_prompte);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '.' && !*(argv[1]+1)) {
    -    fprintf(stdout, qh_prompt3, qh_version);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '-' && *(argv[1]+1)=='V') {
    -      fprintf(stdout, "%s\n", qh_version2);
    -      exit(qh_ERRnone);
    -  }
    -  qh_init_A(stdin, stdout, stderr, argc, argv);  /* sets qh qhull_command */
    -  exitcode= setjmp(qh errexit); /* simple statement for CRAY J916 */
    -  if (!exitcode) {
    -    qh NOerrexit = False;
    -    qh_option("delaunay  Qbbound-last", NULL, NULL);
    -    qh DELAUNAY= True;     /* 'd'   */
    -    qh SCALElast= True;    /* 'Qbb' */
    -    qh KEEPcoplanar= True; /* 'Qc', to keep coplanars in 'p' */
    -    qh_checkflags(qh qhull_command, hidden_options);
    -    qh_initflags(qh qhull_command);
    -    points= qh_readpoints(&numpoints, &dim, &ismalloc);
    -    if (dim >= 5) {
    -      qh_option("Qxact_merge", NULL, NULL);
    -      qh MERGEexact= True; /* 'Qx' always */
    -    }
    -    qh_init_B(points, numpoints, dim, ismalloc);
    -    qh_qhull();
    -    qh_check_output();
    -    qh_produce_output();
    -    if (qh VERIFYoutput && !qh FORCEoutput && !qh STOPpoint && !qh STOPcone)
    -      qh_check_points();
    -    exitcode= qh_ERRnone;
    -  }
    -  qh NOerrexit= True;  /* no more setjmp */
    -#ifdef qh_NOmem
    -  qh_freeqhull(qh_ALL);
    -#else
    -  qh_freeqhull(!qh_ALL);
    -  qh_memfreeshort(&curlong, &totlong);
    -  if (curlong || totlong)
    -    qh_fprintf_stderr(6263, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
    -       totlong, curlong);
    -#endif
    -  return exitcode;
    -} /* main */
    -
    diff --git a/src/qhull/src/qdelaunay/qdelaun_r.c b/src/qhull/src/qdelaunay/qdelaun_r.c
    deleted file mode 100644
    index 0854b8bb979..00000000000
    --- a/src/qhull/src/qdelaunay/qdelaun_r.c
    +++ /dev/null
    @@ -1,317 +0,0 @@
    -/*
      ---------------------------------
    -
    -   qdelaun.c
    -     compute Delaunay triangulations and furthest-point Delaunay
    -     triangulations using qhull
    -
    -   see unix.c for full interface
    -
    -   Copyright (c) 1993-2015, The Geometry Center
    -*/
    -
    -#include "libqhull_r/libqhull_r.h"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#if __cplusplus
    -extern "C" {
    -  int isatty(int);
    -}
    -
    -#elif _MSC_VER
    -#include 
    -#define isatty _isatty
    -/* int _isatty(int); */
    -
    -#else
    -int isatty(int);  /* returns 1 if stdin is a tty
    -                   if "Undefined symbol" this can be deleted along with call in main() */
    -#endif
    -
    -/*---------------------------------
    -
    -  qh_prompt
    -    long prompt for qhull
    -
    -  notes:
    -    restricted version of libqhull.c
    -
    -  see:
    -    concise prompt below
    -*/
    -
    -/* duplicated in qdelau_f.htm and qdelaun.htm */
    -char hidden_options[]=" d n v H U Qb QB Qc Qf Qg Qi Qm Qr QR Qv Qx TR E V FC Fi Fo Ft Fp FV Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 ";
    -
    -char qh_prompta[]= "\n\
    -qdelaunay- compute the Delaunay triangulation\n\
    -    http://www.qhull.org  %s\n\
    -\n\
    -input (stdin):\n\
    -    first lines: dimension and number of points (or vice-versa).\n\
    -    other lines: point coordinates, best if one point per line\n\
    -    comments:    start with a non-numeric character\n\
    -\n\
    -options:\n\
    -    Qu   - compute furthest-site Delaunay triangulation\n\
    -    Qt   - triangulated output\n\
    -    QJ   - joggled input instead of merged facets\n\
    -\n\
    -Qhull control options:\n\
    -    QJn  - randomly joggle input in range [-n,n]\n\
    -%s%s%s%s";  /* split up qh_prompt for Visual C++ */
    -char qh_promptb[]= "\
    -    Qs   - search all points for the initial simplex\n\
    -    Qz   - add point-at-infinity to Delaunay triangulation\n\
    -    QGn  - print Delaunay region if visible from point n, -n if not\n\
    -    QVn  - print Delaunay regions that include point n, -n if not\n\
    -\n\
    -";
    -char qh_promptc[]= "\
    -Trace options:\n\
    -    T4   - trace at level n, 4=all, 5=mem/gauss, -1= events\n\
    -    Tc   - check frequently during execution\n\
    -    Ts   - print statistics\n\
    -    Tv   - verify result: structure, convexity, and in-circle test\n\
    -    Tz   - send all output to stdout\n\
    -    TFn  - report summary when n or more facets created\n\
    -    TI file - input data from file, no spaces or single quotes\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    -    TPn  - turn on tracing when point n added to hull\n\
    -     TMn - turn on tracing at merge n\n\
    -     TWn - trace merge facets when width > n\n\
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)\n\
    -     TCn - stop qhull after building cone for point n (see TVn)\n\
    -\n\
    -Precision options:\n\
    -    Cn   - radius of centrum (roundoff added).  Merge facets if non-convex\n\
    -     An  - cosine of maximum angle.  Merge facets if cosine > n or non-convex\n\
    -           C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge\n\
    -    Rn   - randomly perturb computations by a factor of [1-n,1+n]\n\
    -    Wn   - min facet width for outside point (before roundoff)\n\
    -\n\
    -Output formats (may be combined; if none, produces a summary to stdout):\n\
    -    f    - facet dump\n\
    -    G    - Geomview output (see below)\n\
    -    i    - vertices incident to each Delaunay region\n\
    -    m    - Mathematica output (2-d only, lifted to a paraboloid)\n\
    -    o    - OFF format (dim, points, and facets as a paraboloid)\n\
    -    p    - point coordinates (lifted to a paraboloid)\n\
    -    s    - summary (stderr)\n\
    -\n\
    -";
    -char qh_promptd[]= "\
    -More formats:\n\
    -    Fa   - area for each Delaunay region\n\
    -    FA   - compute total area for option 's'\n\
    -    Fc   - count plus coincident points for each Delaunay region\n\
    -    Fd   - use cdd format for input (homogeneous with offset first)\n\
    -    FD   - use cdd format for numeric output (offset first)\n\
    -    FF   - facet dump without ridges\n\
    -    FI   - ID of each Delaunay region\n\
    -    Fm   - merge count for each Delaunay region (511 max)\n\
    -    FM   - Maple output (2-d only, lifted to a paraboloid)\n\
    -    Fn   - count plus neighboring region for each Delaunay region\n\
    -    FN   - count plus neighboring region for each point\n\
    -    FO   - options and precision constants\n\
    -    FP   - nearest point and distance for each coincident point\n\
    -    FQ   - command used for qdelaunay\n\
    -    Fs   - summary: #int (8), dimension, #points, tot vertices, tot facets,\n\
    -                    for output: #vertices, #Delaunay regions,\n\
    -                                #coincident points, #non-simplicial regions\n\
    -                    #real (2), max outer plane, min vertex\n\
    -    FS   - sizes:   #int (0)\n\
    -                    #real (2), tot area, 0\n\
    -    Fv   - count plus vertices for each Delaunay region\n\
    -    Fx   - extreme points of Delaunay triangulation (on convex hull)\n\
    -\n\
    -";
    -char qh_prompte[]= "\
    -Geomview options (2-d and 3-d)\n\
    -    Ga   - all points as dots\n\
    -     Gp  -  coplanar points and vertices as radii\n\
    -     Gv  -  vertices as spheres\n\
    -    Gi   - inner planes only\n\
    -     Gn  -  no planes\n\
    -     Go  -  outer planes only\n\
    -    Gc     - centrums\n\
    -    Gh   - hyperplane intersections\n\
    -    Gr   - ridges\n\
    -    GDn  - drop dimension n in 3-d and 4-d output\n\
    -    Gt   - transparent outer ridges to view 3-d Delaunay\n\
    -\n\
    -Print options:\n\
    -    PAn  - keep n largest Delaunay regions by area\n\
    -    Pdk:n - drop facet if normal[k] <= n (default 0.0)\n\
    -    PDk:n - drop facet if normal[k] >= n\n\
    -    Pg   - print good Delaunay regions (needs 'QGn' or 'QVn')\n\
    -    PFn  - keep Delaunay regions whose area is at least n\n\
    -    PG   - print neighbors of good regions (needs 'QGn' or 'QVn')\n\
    -    PMn  - keep n Delaunay regions with most merges\n\
    -    Po   - force output.  If error, output neighborhood of facet\n\
    -    Pp   - do not report precision problems\n\
    -\n\
    -    .    - list of all options\n\
    -    -    - one line descriptions of all options\n\
    -    -V   - version\n\
    -";
    -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    -
    -/*---------------------------------
    -
    -  qh_prompt2
    -    synopsis for qhull
    -*/
    -char qh_prompt2[]= "\n\
    -qdelaunay- compute the Delaunay triangulation.  Qhull %s\n\
    -    input (stdin): dimension, number of points, point coordinates\n\
    -    comments start with a non-numeric character\n\
    -\n\
    -options (qdelaun.htm):\n\
    -    Qu   - furthest-site Delaunay triangulation\n\
    -    Qt   - triangulated output\n\
    -    QJ   - joggled input instead of merged facets\n\
    -    Tv   - verify result: structure, convexity, and in-circle test\n\
    -    .    - concise list of all options\n\
    -    -    - one-line description of all options\n\
    -    -V   - version\n\
    -\n\
    -output options (subset):\n\
    -    s    - summary of results (default)\n\
    -    i    - vertices incident to each Delaunay region\n\
    -    Fx   - extreme points (vertices of the convex hull)\n\
    -    o    - OFF format (shows the points lifted to a paraboloid)\n\
    -    G    - Geomview output (2-d and 3-d points lifted to a paraboloid)\n\
    -    m    - Mathematica output (2-d inputs lifted to a paraboloid)\n\
    -    QVn  - print Delaunay regions that include point n, -n if not\n\
    -    TO file- output results to file, may be enclosed in single quotes\n\
    -\n\
    -examples:\n\
    -    rbox c P0 D2 | qdelaunay s o          rbox c P0 D2 | qdelaunay i\n\
    -    rbox c P0 D2 | qdelaunay Fv           rbox c P0 D2 | qdelaunay s Qu Fv\n\
    -    rbox c G1 d D2 | qdelaunay s i        rbox c G1 d D2 | qdelaunay Qt\n\
    -    rbox M3,4 z 100 D2 | qdelaunay s      rbox M3,4 z 100 D2 | qdelaunay s Qt\n\
    -\n\
    -";
    -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    -
    -/*---------------------------------
    -
    -  qh_prompt3
    -    concise prompt for qhull
    -*/
    -char qh_prompt3[]= "\n\
    -Qhull %s.\n\
    -Except for 'F.' and 'PG', upper-case options take an argument.\n\
    -\n\
    - incidences     mathematica    OFF_format     points_lifted  summary\n\
    - facet_dump\n\
    -\n\
    - Farea          FArea_total    Fcoincident    Fd_cdd_in      FD_cdd_out\n\
    - FF_dump_xridge FIDs           Fmerges        Fneighbors     FNeigh_vertex\n\
    - FOptions       FPoint_near    FQdelaun       Fsummary       FSize\n\
    - Fvertices      Fxtremes       FMaple\n\
    -\n\
    - Gvertices      Gpoints        Gall_points    Gno_planes     Ginner\n\
    - Gcentrums      Ghyperplanes   Gridges        Gouter         GDrop_dim\n\
    - Gtransparent\n\
    -\n\
    - PArea_keep     Pdrop d0:0D0   Pgood          PFacet_area_keep\n\
    - PGood_neighbors PMerge_keep   Poutput_forced Pprecision_not\n\
    -\n\
    - QGood_point    QJoggle        Qsearch_1st    Qtriangulate   QupperDelaunay\n\
    - QVertex_good   Qzinfinite\n\
    -\n\
    - T4_trace       Tcheck_often   Tstatistics    Tverify        Tz_stdout\n\
    - TFacet_log     TInput_file    TPoint_trace   TMerge_trace   TOutput_file\n\
    - TWide_trace    TVertex_stop   TCone_stop\n\
    -\n\
    - Angle_max      Centrum_size   Random_dist    Wide_outside\n\
    -";
    -
    -/*---------------------------------
    -
    -  main( argc, argv )
    -    processes the command line, calls qhull() to do the work, and exits
    -
    -  design:
    -    initializes data structures
    -    reads points
    -    finishes initialization
    -    computes convex hull and other structures
    -    checks the result
    -    writes the output
    -    frees memory
    -*/
    -int main(int argc, char *argv[]) {
    -  int curlong, totlong; /* used !qh_NOmem */
    -  int exitcode, numpoints, dim;
    -  coordT *points;
    -  boolT ismalloc;
    -  qhT qh_qh;
    -  qhT *qh= &qh_qh;
    -
    -  QHULL_LIB_CHECK /* Check for compatible library */
    -
    -  if ((argc == 1) && isatty( 0 /*stdin*/)) {
    -    fprintf(stdout, qh_prompt2, qh_version);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) {
    -    fprintf(stdout, qh_prompta, qh_version,
    -                qh_promptb, qh_promptc, qh_promptd, qh_prompte);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '.' && !*(argv[1]+1)) {
    -    fprintf(stdout, qh_prompt3, qh_version);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '-' && *(argv[1]+1)=='V') {
    -      fprintf(stdout, "%s\n", qh_version2);
    -      exit(qh_ERRnone);
    -  }
    -  qh_init_A(qh, stdin, stdout, stderr, argc, argv);  /* sets qh->qhull_command */
    -  exitcode= setjmp(qh->errexit); /* simple statement for CRAY J916 */
    -  if (!exitcode) {
    -    qh->NOerrexit = False;
    -    qh_option(qh, "delaunay  Qbbound-last", NULL, NULL);
    -    qh->DELAUNAY= True;     /* 'd'   */
    -    qh->SCALElast= True;    /* 'Qbb' */
    -    qh->KEEPcoplanar= True; /* 'Qc', to keep coplanars in 'p' */
    -    qh_checkflags(qh, qh->qhull_command, hidden_options);
    -    qh_initflags(qh, qh->qhull_command);
    -    points= qh_readpoints(qh, &numpoints, &dim, &ismalloc);
    -    if (dim >= 5) {
    -      qh_option(qh, "Qxact_merge", NULL, NULL);
    -      qh->MERGEexact= True; /* 'Qx' always */
    -    }
    -    qh_init_B(qh, points, numpoints, dim, ismalloc);
    -    qh_qhull(qh);
    -    qh_check_output(qh);
    -    qh_produce_output(qh);
    -    if (qh->VERIFYoutput && !qh->FORCEoutput && !qh->STOPpoint && !qh->STOPcone)
    -      qh_check_points(qh);
    -    exitcode= qh_ERRnone;
    -  }
    -  qh->NOerrexit= True;  /* no more setjmp */
    -#ifdef qh_NOmem
    -  qh_freeqhull(qh, qh_ALL);
    -#else
    -  qh_freeqhull(qh, !qh_ALL);
    -  qh_memfreeshort(qh, &curlong, &totlong);
    -  if (curlong || totlong)
    -    qh_fprintf_stderr(6263, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
    -       totlong, curlong);
    -#endif
    -  return exitcode;
    -} /* main */
    -
    diff --git a/src/qhull/src/qdelaunay/qdelaunay.pro b/src/qhull/src/qdelaunay/qdelaunay.pro
    deleted file mode 100644
    index 138ac0589d8..00000000000
    --- a/src/qhull/src/qdelaunay/qdelaunay.pro
    +++ /dev/null
    @@ -1,9 +0,0 @@
    -# -------------------------------------------------
    -# qdelaunay.pro -- Qt project file for qvoronoi.exe
    -# -------------------------------------------------
    -
    -include(../qhull-app-c.pri)
    -
    -TARGET = qdelaunay
    -
    -SOURCES += qdelaun.c
    diff --git a/src/qhull/src/qhalf/qhalf.c b/src/qhull/src/qhalf/qhalf.c
    deleted file mode 100644
    index 4a5889ed782..00000000000
    --- a/src/qhull/src/qhalf/qhalf.c
    +++ /dev/null
    @@ -1,316 +0,0 @@
    -/*
      ---------------------------------
    -
    -   qhalf.c
    -     compute the intersection of halfspaces about a point
    -
    -   see unix.c for full interface
    -
    -   Copyright (c) 1993-2015, The Geometry Center
    -*/
    -
    -#include "libqhull/libqhull.h"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#if __cplusplus
    -extern "C" {
    -  int isatty(int);
    -}
    -
    -#elif _MSC_VER
    -#include 
    -#define isatty _isatty
    -/* int _isatty(int); */
    -
    -#else
    -int isatty(int);  /* returns 1 if stdin is a tty
    -                   if "Undefined symbol" this can be deleted along with call in main() */
    -#endif
    -
    -/*---------------------------------
    -
    -  qh_prompt
    -    long prompt for qhull
    -
    -  notes:
    -    restricted version of libqhull.c
    -
    -  see:
    -    concise prompt below
    -*/
    -
    -/* duplicated in qhalf.htm */
    -char hidden_options[]=" d n v Qbb QbB Qf Qg Qm Qr QR Qv Qx Qz TR E V Fa FA FC FD FS Ft FV Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 ";
    -
    -char qh_prompta[]= "\n\
    -qhalf- compute the intersection of halfspaces about a point\n\
    -    http://www.qhull.org  %s\n\
    -\n\
    -input (stdin):\n\
    -    optional interior point: dimension, 1, coordinates\n\
    -    first lines: dimension+1 and number of halfspaces\n\
    -    other lines: halfspace coefficients followed by offset\n\
    -    comments:    start with a non-numeric character\n\
    -\n\
    -options:\n\
    -    Hn,n - specify coordinates of interior point\n\
    -    Qt   - triangulated output\n\
    -    QJ   - joggled input instead of merged facets\n\
    -    Qc   - keep coplanar halfspaces\n\
    -    Qi   - keep other redundant halfspaces\n\
    -\n\
    -Qhull control options:\n\
    -    QJn  - randomly joggle input in range [-n,n]\n\
    -%s%s%s%s";  /* split up qh_prompt for Visual C++ */
    -char qh_promptb[]= "\
    -    Qbk:0Bk:0 - remove k-th coordinate from input\n\
    -    Qs   - search all halfspaces for the initial simplex\n\
    -    QGn  - print intersection if visible to halfspace n, -n for not\n\
    -    QVn  - print intersections for halfspace n, -n if not\n\
    -\n\
    -";
    -char qh_promptc[]= "\
    -Trace options:\n\
    -    T4   - trace at level n, 4=all, 5=mem/gauss, -1= events\n\
    -    Tc   - check frequently during execution\n\
    -    Ts   - print statistics\n\
    -    Tv   - verify result: structure, convexity, and redundancy\n\
    -    Tz   - send all output to stdout\n\
    -    TFn  - report summary when n or more facets created\n\
    -    TI file - input data from file, no spaces or single quotes\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    -    TPn  - turn on tracing when halfspace n added to intersection\n\
    -    TMn  - turn on tracing at merge n\n\
    -    TWn  - trace merge facets when width > n\n\
    -    TVn  - stop qhull after adding halfspace n, -n for before (see TCn)\n\
    -    TCn  - stop qhull after building cone for halfspace n (see TVn)\n\
    -\n\
    -Precision options:\n\
    -    Cn   - radius of centrum (roundoff added).  Merge facets if non-convex\n\
    -     An  - cosine of maximum angle.  Merge facets if cosine > n or non-convex\n\
    -           C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge\n\
    -    Rn   - randomly perturb computations by a factor of [1-n,1+n]\n\
    -    Un   - max distance below plane for a new, coplanar halfspace\n\
    -    Wn   - min facet width for outside halfspace (before roundoff)\n\
    -\n\
    -Output formats (may be combined; if none, produces a summary to stdout):\n\
    -    f    - facet dump\n\
    -    G    - Geomview output (dual convex hull)\n\
    -    i    - non-redundant halfspaces incident to each intersection\n\
    -    m    - Mathematica output (dual convex hull)\n\
    -    o    - OFF format (dual convex hull: dimension, points, and facets)\n\
    -    p    - vertex coordinates of dual convex hull (coplanars if 'Qc' or 'Qi')\n\
    -    s    - summary (stderr)\n\
    -\n\
    -";
    -char qh_promptd[]= "\
    -More formats:\n\
    -    Fc   - count plus redundant halfspaces for each intersection\n\
    -         -   Qc (default) for coplanar and Qi for other redundant\n\
    -    Fd   - use cdd format for input (homogeneous with offset first)\n\
    -    FF   - facet dump without ridges\n\
    -    FI   - ID of each intersection\n\
    -    Fm   - merge count for each intersection (511 max)\n\
    -    FM   - Maple output (dual convex hull)\n\
    -    Fn   - count plus neighboring intersections for each intersection\n\
    -    FN   - count plus intersections for each non-redundant halfspace\n\
    -    FO   - options and precision constants\n\
    -    Fp   - dim, count, and intersection coordinates\n\
    -    FP   - nearest halfspace and distance for each redundant halfspace\n\
    -    FQ   - command used for qhalf\n\
    -    Fs   - summary: #int (8), dim, #halfspaces, #non-redundant, #intersections\n\
    -                      for output: #non-redundant, #intersections, #coplanar\n\
    -                                  halfspaces, #non-simplicial intersections\n\
    -                    #real (2), max outer plane, min vertex\n\
    -    Fv   - count plus non-redundant halfspaces for each intersection\n\
    -    Fx   - non-redundant halfspaces\n\
    -\n\
    -";
    -char qh_prompte[]= "\
    -Geomview output (2-d, 3-d and 4-d; dual convex hull)\n\
    -    Ga   - all points (i.e., transformed halfspaces) as dots\n\
    -     Gp  -  coplanar points and vertices as radii\n\
    -     Gv  -  vertices (i.e., non-redundant halfspaces) as spheres\n\
    -    Gi   - inner planes (i.e., halfspace intersections) only\n\
    -     Gn  -  no planes\n\
    -     Go  -  outer planes only\n\
    -    Gc   - centrums\n\
    -    Gh   - hyperplane intersections\n\
    -    Gr   - ridges\n\
    -    GDn  - drop dimension n in 3-d and 4-d output\n\
    -\n\
    -Print options:\n\
    -    PAn  - keep n largest facets (i.e., intersections) by area\n\
    -    Pdk:n- drop facet if normal[k] <= n (default 0.0)\n\
    -    PDk:n- drop facet if normal[k] >= n\n\
    -    Pg   - print good facets (needs 'QGn' or 'QVn')\n\
    -    PFn  - keep facets whose area is at least n\n\
    -    PG   - print neighbors of good facets\n\
    -    PMn  - keep n facets with most merges\n\
    -    Po   - force output.  If error, output neighborhood of facet\n\
    -    Pp   - do not report precision problems\n\
    -\n\
    -    .    - list of all options\n\
    -    -    - one line descriptions of all options\n\
    -    -V   - version\n\
    -";
    -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    -
    -/*---------------------------------
    -
    -  qh_prompt2
    -    synopsis for qhull
    -*/
    -char qh_prompt2[]= "\n\
    -qhalf- halfspace intersection about a point.  Qhull %s\n\
    -    input (stdin): [dim, 1, interior point], dim+1, n, coefficients+offset\n\
    -    comments start with a non-numeric character\n\
    -\n\
    -options (qhalf.htm):\n\
    -    Hn,n - specify coordinates of interior point\n\
    -    Qt   - triangulated output\n\
    -    QJ   - joggled input instead of merged facets\n\
    -    Tv   - verify result: structure, convexity, and redundancy\n\
    -    .    - concise list of all options\n\
    -    -    - one-line description of all options\n\
    -    -V   - version\n\
    -\n\
    -output options (subset):\n\
    -    s    - summary of results (default)\n\
    -    Fp   - intersection coordinates\n\
    -    Fv   - non-redundant halfspaces incident to each intersection\n\
    -    Fx   - non-redundant halfspaces\n\
    -    o    - OFF file format (dual convex hull)\n\
    -    G    - Geomview output (dual convex hull)\n\
    -    m    - Mathematica output (dual convex hull)\n\
    -    QVn  - print intersections for halfspace n, -n if not\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    -\n\
    -examples:\n\
    -    rbox d | qconvex FQ n | qhalf s H0,0,0 Fp\n\
    -    rbox c | qconvex FQ FV n | qhalf s i\n\
    -    rbox c | qconvex FQ FV n | qhalf s o\n\
    -\n\
    -";
    -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    -
    -/*---------------------------------
    -
    -  qh_prompt3
    -    concise prompt for qhull
    -*/
    -char qh_prompt3[]= "\n\
    -Qhull %s.\n\
    -Except for 'F.' and 'PG', upper_case options take an argument.\n\
    -\n\
    - incidences     Geomview       mathematica    OFF_format     point_dual\n\
    - summary        facet_dump\n\
    -\n\
    - Fc_redundant   Fd_cdd_in      FF_dump_xridge FIDs           Fmerges\n\
    - Fneighbors     FN_intersect   FOptions       Fp_coordinates FP_nearest\n\
    - FQhalf         Fsummary       Fv_halfspace   FMaple         Fx_non_redundant\n\
    -\n\
    - Gvertices      Gpoints        Gall_points    Gno_planes     Ginner\n\
    - Gcentrums      Ghyperplanes   Gridges        Gouter         GDrop_dim\n\
    -\n\
    - PArea_keep     Pdrop d0:0D0   Pgood          PFacet_area_keep\n\
    - PGood_neighbors PMerge_keep   Poutput_forced Pprecision_not\n\
    -\n\
    - Qbk:0Bk:0_drop Qcoplanar      QG_half_good   Qi_redundant   QJoggle\n\
    - Qsearch_1st    Qtriangulate   QVertex_good\n\
    -\n\
    - T4_trace       Tcheck_often   Tstatistics    Tverify        Tz_stdout\n\
    - TFacet_log     TInput_file    TPoint_trace   TMerge_trace   TOutput_file\n\
    - TWide_trace    TVertex_stop   TCone_stop\n\
    -\n\
    - Angle_max      Centrum_size   Random_dist    Ucoplanar_max  Wide_outside\n\
    -";
    -
    -/*---------------------------------
    -
    -  main( argc, argv )
    -    processes the command line, calls qhull() to do the work, and exits
    -
    -  design:
    -    initializes data structures
    -    reads points
    -    finishes initialization
    -    computes convex hull and other structures
    -    checks the result
    -    writes the output
    -    frees memory
    -*/
    -int main(int argc, char *argv[]) {
    -  int curlong, totlong; /* used !qh_NOmem */
    -  int exitcode, numpoints, dim;
    -  coordT *points;
    -  boolT ismalloc;
    -
    -  QHULL_LIB_CHECK /* Check for compatible library */
    -
    -  if ((argc == 1) && isatty( 0 /*stdin*/)) {
    -    fprintf(stdout, qh_prompt2, qh_version);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) {
    -    fprintf(stdout, qh_prompta, qh_version,
    -        qh_promptb, qh_promptc, qh_promptd, qh_prompte);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '.' && !*(argv[1]+1)) {
    -    fprintf(stdout, qh_prompt3, qh_version);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '-' && *(argv[1]+1)=='V') {
    -      fprintf(stdout, "%s\n", qh_version2);
    -      exit(qh_ERRnone);
    -  }
    -  qh_init_A(stdin, stdout, stderr, argc, argv);  /* sets qh qhull_command */
    -  exitcode= setjmp(qh errexit); /* simple statement for CRAY J916 */
    -  if (!exitcode) {
    -    qh NOerrexit = False;
    -    qh_option("Halfspace", NULL, NULL);
    -    qh HALFspace= True;    /* 'H'   */
    -    qh_checkflags(qh qhull_command, hidden_options);
    -    qh_initflags(qh qhull_command);
    -    if (qh SCALEinput) {
    -      fprintf(qh ferr, "\
    -qhull error: options 'Qbk:n' and 'QBk:n' are not used with qhalf.\n\
    -             Use 'Qbk:0Bk:0 to drop dimension k.\n");
    -      qh_errexit(qh_ERRinput, NULL, NULL);
    -    }
    -    points= qh_readpoints(&numpoints, &dim, &ismalloc);
    -    if (dim >= 5) {
    -      qh_option("Qxact_merge", NULL, NULL);
    -      qh MERGEexact= True; /* 'Qx' always */
    -    }
    -    qh_init_B(points, numpoints, dim, ismalloc);
    -    qh_qhull();
    -    qh_check_output();
    -    qh_produce_output();
    -    if (qh VERIFYoutput && !qh FORCEoutput && !qh STOPpoint && !qh STOPcone)
    -      qh_check_points();
    -    exitcode= qh_ERRnone;
    -  }
    -  qh NOerrexit= True;  /* no more setjmp */
    -#ifdef qh_NOmem
    -  qh_freeqhull(qh_ALL);
    -#else
    -  qh_freeqhull(!qh_ALL);
    -  qh_memfreeshort(&curlong, &totlong);
    -  if (curlong || totlong)
    -    qh_fprintf_stderr(6263, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
    -       totlong, curlong);
    -#endif
    -  return exitcode;
    -} /* main */
    -
    diff --git a/src/qhull/src/qhalf/qhalf.pro b/src/qhull/src/qhalf/qhalf.pro
    deleted file mode 100644
    index ebad3878935..00000000000
    --- a/src/qhull/src/qhalf/qhalf.pro
    +++ /dev/null
    @@ -1,9 +0,0 @@
    -# -------------------------------------------------
    -# qhalf.pro -- Qt project file for qconvex.exe
    -# -------------------------------------------------
    -
    -include(../qhull-app-c.pri)
    -
    -TARGET = qhalf
    -
    -SOURCES += qhalf.c
    diff --git a/src/qhull/src/qhalf/qhalf_r.c b/src/qhull/src/qhalf/qhalf_r.c
    deleted file mode 100644
    index c49d777f95f..00000000000
    --- a/src/qhull/src/qhalf/qhalf_r.c
    +++ /dev/null
    @@ -1,318 +0,0 @@
    -/*
      ---------------------------------
    -
    -   qhalf.c
    -     compute the intersection of halfspaces about a point
    -
    -   see unix.c for full interface
    -
    -   Copyright (c) 1993-2015, The Geometry Center
    -*/
    -
    -#include "libqhull_r/libqhull_r.h"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#if __cplusplus
    -extern "C" {
    -  int isatty(int);
    -}
    -
    -#elif _MSC_VER
    -#include 
    -#define isatty _isatty
    -/* int _isatty(int); */
    -
    -#else
    -int isatty(int);  /* returns 1 if stdin is a tty
    -                   if "Undefined symbol" this can be deleted along with call in main() */
    -#endif
    -
    -/*---------------------------------
    -
    -  qh_prompt
    -    long prompt for qhull
    -
    -  notes:
    -    restricted version of libqhull.c
    -
    -  see:
    -    concise prompt below
    -*/
    -
    -/* duplicated in qhalf.htm */
    -char hidden_options[]=" d n v Qbb QbB Qf Qg Qm Qr QR Qv Qx Qz TR E V Fa FA FC FD FS Ft FV Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 ";
    -
    -char qh_prompta[]= "\n\
    -qhalf- compute the intersection of halfspaces about a point\n\
    -    http://www.qhull.org  %s\n\
    -\n\
    -input (stdin):\n\
    -    optional interior point: dimension, 1, coordinates\n\
    -    first lines: dimension+1 and number of halfspaces\n\
    -    other lines: halfspace coefficients followed by offset\n\
    -    comments:    start with a non-numeric character\n\
    -\n\
    -options:\n\
    -    Hn,n - specify coordinates of interior point\n\
    -    Qt   - triangulated output\n\
    -    QJ   - joggled input instead of merged facets\n\
    -    Qc   - keep coplanar halfspaces\n\
    -    Qi   - keep other redundant halfspaces\n\
    -\n\
    -Qhull control options:\n\
    -    QJn  - randomly joggle input in range [-n,n]\n\
    -%s%s%s%s";  /* split up qh_prompt for Visual C++ */
    -char qh_promptb[]= "\
    -    Qbk:0Bk:0 - remove k-th coordinate from input\n\
    -    Qs   - search all halfspaces for the initial simplex\n\
    -    QGn  - print intersection if visible to halfspace n, -n for not\n\
    -    QVn  - print intersections for halfspace n, -n if not\n\
    -\n\
    -";
    -char qh_promptc[]= "\
    -Trace options:\n\
    -    T4   - trace at level n, 4=all, 5=mem/gauss, -1= events\n\
    -    Tc   - check frequently during execution\n\
    -    Ts   - print statistics\n\
    -    Tv   - verify result: structure, convexity, and redundancy\n\
    -    Tz   - send all output to stdout\n\
    -    TFn  - report summary when n or more facets created\n\
    -    TI file - input data from file, no spaces or single quotes\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    -    TPn  - turn on tracing when halfspace n added to intersection\n\
    -    TMn  - turn on tracing at merge n\n\
    -    TWn  - trace merge facets when width > n\n\
    -    TVn  - stop qhull after adding halfspace n, -n for before (see TCn)\n\
    -    TCn  - stop qhull after building cone for halfspace n (see TVn)\n\
    -\n\
    -Precision options:\n\
    -    Cn   - radius of centrum (roundoff added).  Merge facets if non-convex\n\
    -     An  - cosine of maximum angle.  Merge facets if cosine > n or non-convex\n\
    -           C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge\n\
    -    Rn   - randomly perturb computations by a factor of [1-n,1+n]\n\
    -    Un   - max distance below plane for a new, coplanar halfspace\n\
    -    Wn   - min facet width for outside halfspace (before roundoff)\n\
    -\n\
    -Output formats (may be combined; if none, produces a summary to stdout):\n\
    -    f    - facet dump\n\
    -    G    - Geomview output (dual convex hull)\n\
    -    i    - non-redundant halfspaces incident to each intersection\n\
    -    m    - Mathematica output (dual convex hull)\n\
    -    o    - OFF format (dual convex hull: dimension, points, and facets)\n\
    -    p    - vertex coordinates of dual convex hull (coplanars if 'Qc' or 'Qi')\n\
    -    s    - summary (stderr)\n\
    -\n\
    -";
    -char qh_promptd[]= "\
    -More formats:\n\
    -    Fc   - count plus redundant halfspaces for each intersection\n\
    -         -   Qc (default) for coplanar and Qi for other redundant\n\
    -    Fd   - use cdd format for input (homogeneous with offset first)\n\
    -    FF   - facet dump without ridges\n\
    -    FI   - ID of each intersection\n\
    -    Fm   - merge count for each intersection (511 max)\n\
    -    FM   - Maple output (dual convex hull)\n\
    -    Fn   - count plus neighboring intersections for each intersection\n\
    -    FN   - count plus intersections for each non-redundant halfspace\n\
    -    FO   - options and precision constants\n\
    -    Fp   - dim, count, and intersection coordinates\n\
    -    FP   - nearest halfspace and distance for each redundant halfspace\n\
    -    FQ   - command used for qhalf\n\
    -    Fs   - summary: #int (8), dim, #halfspaces, #non-redundant, #intersections\n\
    -                      for output: #non-redundant, #intersections, #coplanar\n\
    -                                  halfspaces, #non-simplicial intersections\n\
    -                    #real (2), max outer plane, min vertex\n\
    -    Fv   - count plus non-redundant halfspaces for each intersection\n\
    -    Fx   - non-redundant halfspaces\n\
    -\n\
    -";
    -char qh_prompte[]= "\
    -Geomview output (2-d, 3-d and 4-d; dual convex hull)\n\
    -    Ga   - all points (i.e., transformed halfspaces) as dots\n\
    -     Gp  -  coplanar points and vertices as radii\n\
    -     Gv  -  vertices (i.e., non-redundant halfspaces) as spheres\n\
    -    Gi   - inner planes (i.e., halfspace intersections) only\n\
    -     Gn  -  no planes\n\
    -     Go  -  outer planes only\n\
    -    Gc   - centrums\n\
    -    Gh   - hyperplane intersections\n\
    -    Gr   - ridges\n\
    -    GDn  - drop dimension n in 3-d and 4-d output\n\
    -\n\
    -Print options:\n\
    -    PAn  - keep n largest facets (i.e., intersections) by area\n\
    -    Pdk:n- drop facet if normal[k] <= n (default 0.0)\n\
    -    PDk:n- drop facet if normal[k] >= n\n\
    -    Pg   - print good facets (needs 'QGn' or 'QVn')\n\
    -    PFn  - keep facets whose area is at least n\n\
    -    PG   - print neighbors of good facets\n\
    -    PMn  - keep n facets with most merges\n\
    -    Po   - force output.  If error, output neighborhood of facet\n\
    -    Pp   - do not report precision problems\n\
    -\n\
    -    .    - list of all options\n\
    -    -    - one line descriptions of all options\n\
    -    -V   - version\n\
    -";
    -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    -
    -/*---------------------------------
    -
    -  qh_prompt2
    -    synopsis for qhull
    -*/
    -char qh_prompt2[]= "\n\
    -qhalf- halfspace intersection about a point.  Qhull %s\n\
    -    input (stdin): [dim, 1, interior point], dim+1, n, coefficients+offset\n\
    -    comments start with a non-numeric character\n\
    -\n\
    -options (qhalf.htm):\n\
    -    Hn,n - specify coordinates of interior point\n\
    -    Qt   - triangulated output\n\
    -    QJ   - joggled input instead of merged facets\n\
    -    Tv   - verify result: structure, convexity, and redundancy\n\
    -    .    - concise list of all options\n\
    -    -    - one-line description of all options\n\
    -    -V   - version\n\
    -\n\
    -output options (subset):\n\
    -    s    - summary of results (default)\n\
    -    Fp   - intersection coordinates\n\
    -    Fv   - non-redundant halfspaces incident to each intersection\n\
    -    Fx   - non-redundant halfspaces\n\
    -    o    - OFF file format (dual convex hull)\n\
    -    G    - Geomview output (dual convex hull)\n\
    -    m    - Mathematica output (dual convex hull)\n\
    -    QVn  - print intersections for halfspace n, -n if not\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    -\n\
    -examples:\n\
    -    rbox d | qconvex FQ n | qhalf s H0,0,0 Fp\n\
    -    rbox c | qconvex FQ FV n | qhalf s i\n\
    -    rbox c | qconvex FQ FV n | qhalf s o\n\
    -\n\
    -";
    -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    -
    -/*---------------------------------
    -
    -  qh_prompt3
    -    concise prompt for qhull
    -*/
    -char qh_prompt3[]= "\n\
    -Qhull %s.\n\
    -Except for 'F.' and 'PG', upper_case options take an argument.\n\
    -\n\
    - incidences     Geomview       mathematica    OFF_format     point_dual\n\
    - summary        facet_dump\n\
    -\n\
    - Fc_redundant   Fd_cdd_in      FF_dump_xridge FIDs           Fmerges\n\
    - Fneighbors     FN_intersect   FOptions       Fp_coordinates FP_nearest\n\
    - FQhalf         Fsummary       Fv_halfspace   FMaple         Fx_non_redundant\n\
    -\n\
    - Gvertices      Gpoints        Gall_points    Gno_planes     Ginner\n\
    - Gcentrums      Ghyperplanes   Gridges        Gouter         GDrop_dim\n\
    -\n\
    - PArea_keep     Pdrop d0:0D0   Pgood          PFacet_area_keep\n\
    - PGood_neighbors PMerge_keep   Poutput_forced Pprecision_not\n\
    -\n\
    - Qbk:0Bk:0_drop Qcoplanar      QG_half_good   Qi_redundant   QJoggle\n\
    - Qsearch_1st    Qtriangulate   QVertex_good\n\
    -\n\
    - T4_trace       Tcheck_often   Tstatistics    Tverify        Tz_stdout\n\
    - TFacet_log     TInput_file    TPoint_trace   TMerge_trace   TOutput_file\n\
    - TWide_trace    TVertex_stop   TCone_stop\n\
    -\n\
    - Angle_max      Centrum_size   Random_dist    Ucoplanar_max  Wide_outside\n\
    -";
    -
    -/*---------------------------------
    -
    -  main( argc, argv )
    -    processes the command line, calls qhull() to do the work, and exits
    -
    -  design:
    -    initializes data structures
    -    reads points
    -    finishes initialization
    -    computes convex hull and other structures
    -    checks the result
    -    writes the output
    -    frees memory
    -*/
    -int main(int argc, char *argv[]) {
    -  int curlong, totlong; /* used !qh_NOmem */
    -  int exitcode, numpoints, dim;
    -  coordT *points;
    -  boolT ismalloc;
    -  qhT qh_qh;
    -  qhT *qh= &qh_qh;
    -
    -  QHULL_LIB_CHECK /* Check for compatible library */
    -
    -  if ((argc == 1) && isatty( 0 /*stdin*/)) {
    -    fprintf(stdout, qh_prompt2, qh_version);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) {
    -    fprintf(stdout, qh_prompta, qh_version,
    -        qh_promptb, qh_promptc, qh_promptd, qh_prompte);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '.' && !*(argv[1]+1)) {
    -    fprintf(stdout, qh_prompt3, qh_version);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '-' && *(argv[1]+1)=='V') {
    -      fprintf(stdout, "%s\n", qh_version2);
    -      exit(qh_ERRnone);
    -  }
    -  qh_init_A(qh, stdin, stdout, stderr, argc, argv);  /* sets qh->qhull_command */
    -  exitcode= setjmp(qh->errexit); /* simple statement for CRAY J916 */
    -  if (!exitcode) {
    -    qh->NOerrexit = False;
    -    qh_option(qh, "Halfspace", NULL, NULL);
    -    qh->HALFspace= True;    /* 'H'   */
    -    qh_checkflags(qh, qh->qhull_command, hidden_options);
    -    qh_initflags(qh, qh->qhull_command);
    -    if (qh->SCALEinput) {
    -      fprintf(qh->ferr, "\
    -qhull error: options 'Qbk:n' and 'QBk:n' are not used with qhalf.\n\
    -             Use 'Qbk:0Bk:0 to drop dimension k.\n");
    -      qh_errexit(qh, qh_ERRinput, NULL, NULL);
    -    }
    -    points= qh_readpoints(qh, &numpoints, &dim, &ismalloc);
    -    if (dim >= 5) {
    -      qh_option(qh, "Qxact_merge", NULL, NULL);
    -      qh->MERGEexact= True; /* 'Qx' always */
    -    }
    -    qh_init_B(qh, points, numpoints, dim, ismalloc);
    -    qh_qhull(qh);
    -    qh_check_output(qh);
    -    qh_produce_output(qh);
    -    if (qh->VERIFYoutput && !qh->FORCEoutput && !qh->STOPpoint && !qh->STOPcone)
    -      qh_check_points(qh);
    -    exitcode= qh_ERRnone;
    -  }
    -  qh->NOerrexit= True;  /* no more setjmp */
    -#ifdef qh_NOmem
    -  qh_freeqhull(qh, qh_ALL);
    -#else
    -  qh_freeqhull(qh, !qh_ALL);
    -  qh_memfreeshort(qh, &curlong, &totlong);
    -  if (curlong || totlong)
    -    qh_fprintf_stderr(6263, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
    -       totlong, curlong);
    -#endif
    -  return exitcode;
    -} /* main */
    -
    diff --git a/src/qhull/src/qhull-all.pro b/src/qhull/src/qhull-all.pro
    deleted file mode 100644
    index 1d3a0ac6f31..00000000000
    --- a/src/qhull/src/qhull-all.pro
    +++ /dev/null
    @@ -1,94 +0,0 @@
    -# -------------------------------------------------
    -# qhull-all.pro -- Qt project to build executables and static libraries
    -#
    -# To build with Qt on mingw
    -#   Download Qt SDK, install Perl
    -#   /c/qt/2010.05/qt> ./configure -static -platform win32-g++ -fast -no-qt3support
    -#
    -# To build DevStudio sln and proj files (Qhull ships with cmake derived files)
    -# qmake is in Qt's bin directory
    -# mkdir -p build && cd build && qmake -tp vc -r ../src/qhull-all.pro
    -# Additional Library Directories -- C:\qt\Qt5.2.0\5.2.0\msvc2012_64\lib
    -# libqhullcpp and libqhullstatic refered to $(QTDIR) but apparently didn't retrieve (should be %QTDIR%?)
    -# libqhull_r also needs ..\..\lib
    -# Need to change build/x64/Debug/*.lib to lib/ (or copy libs by hand, each time)
    -# Additional Build Dependencies
    -# See README.txt -- Need to add Build Dependencies, disable rtti, rename targets to qhull.dll, qhull6_p.dll and qhull6_pd.dll
    -# -------------------------------------------------
    -
    -TEMPLATE = subdirs
    -CONFIG += ordered
    -
    -SUBDIRS += libqhull_r      #shared library with reentrant code
    -SUBDIRS += libqhullstatic  #static library
    -SUBDIRS += libqhullstatic_r #static library with reentrant code
    -SUBDIRS += libqhullcpp     #static library for C++ interface with libqhullstatic_r
    -
    -SUBDIRS += qhull           #qhull program linked to libqhullstatic_r
    -SUBDIRS += rbox         
    -SUBDIRS += qconvex         #qhull programs linked to libqhullstatic
    -SUBDIRS += qdelaunay
    -SUBDIRS += qhalf
    -SUBDIRS += qvoronoi
    -
    -SUBDIRS += user_eg         #user programs linked to libqhull_r
    -SUBDIRS += user_eg2  
    -SUBDIRS += user_eg3        #user program with libqhullcpp and libqhullstatic_r
    -
    -SUBDIRS += qhulltest       #C++ test program with Qt, libqhullcpp, and libqhullstatic_r
    -SUBDIRS += testqset        #test program for qset.c with mem.c
    -SUBDIRS += testqset_r      #test program for qset_r.c with mem_r.c
    -                           #See eg/q_test for qhull tests
    -
    -OTHER_FILES += Changes.txt
    -OTHER_FILES += CMakeLists.txt
    -OTHER_FILES += Make-config.sh
    -OTHER_FILES += ../Announce.txt
    -OTHER_FILES += ../CMakeLists.txt
    -OTHER_FILES += ../COPYING.txt
    -OTHER_FILES += ../File_id.diz
    -OTHER_FILES += ../index.htm
    -OTHER_FILES += ../Makefile
    -OTHER_FILES += ../README.txt
    -OTHER_FILES += ../REGISTER.txt
    -OTHER_FILES += ../eg/q_eg
    -OTHER_FILES += ../eg/q_egtest
    -OTHER_FILES += ../eg/q_test
    -OTHER_FILES += ../html/index.htm
    -OTHER_FILES += ../html/qconvex.htm
    -OTHER_FILES += ../html/qdelau_f.htm
    -OTHER_FILES += ../html/qdelaun.htm
    -OTHER_FILES += ../html/qhalf.htm
    -OTHER_FILES += ../html/qh-code.htm
    -OTHER_FILES += ../html/qh-eg.htm
    -OTHER_FILES += ../html/qh-faq.htm
    -OTHER_FILES += ../html/qh-get.htm
    -OTHER_FILES += ../html/qh-impre.htm
    -OTHER_FILES += ../html/qh-optc.htm
    -OTHER_FILES += ../html/qh-optf.htm
    -OTHER_FILES += ../html/qh-optg.htm
    -OTHER_FILES += ../html/qh-opto.htm
    -OTHER_FILES += ../html/qh-optp.htm
    -OTHER_FILES += ../html/qh-optq.htm
    -OTHER_FILES += ../html/qh-optt.htm
    -OTHER_FILES += ../html/qh-quick.htm
    -OTHER_FILES += ../html/qhull.htm
    -OTHER_FILES += ../html/qhull.man
    -OTHER_FILES += ../html/qhull.txt
    -OTHER_FILES += ../html/qhull-cpp.xml
    -OTHER_FILES += ../html/qvoron_f.htm
    -OTHER_FILES += ../html/qvoronoi.htm
    -OTHER_FILES += ../html/rbox.htm
    -OTHER_FILES += ../html/rbox.man
    -OTHER_FILES += ../html/rbox.txt
    -OTHER_FILES += ../src/libqhull/Makefile
    -OTHER_FILES += ../src/libqhull_r/Makefile
    -OTHER_FILES += ../src/libqhull_r/qhull_r-exports.def
    -OTHER_FILES += ../src/qconvex/qconvex_r.c
    -OTHER_FILES += ../src/qdelaunay/qdelaun_r.c
    -OTHER_FILES += ../src/qhalf/qhalf_r.c
    -OTHER_FILES += ../src/qhull/rbox_r.c
    -OTHER_FILES += ../src/qvoronoi/qvoronoi_r.c
    -OTHER_FILES += ../src/qhull/unix.c
    -OTHER_FILES += ../src/user_eg/user_eg.c
    -OTHER_FILES += ../src/user_eg2/user_eg2.c
    diff --git a/src/qhull/src/qhull-app-c.pri b/src/qhull/src/qhull-app-c.pri
    deleted file mode 100644
    index 05e5a00f288..00000000000
    --- a/src/qhull/src/qhull-app-c.pri
    +++ /dev/null
    @@ -1,24 +0,0 @@
    -# -------------------------------------------------
    -# qhull-app-c.pri -- Qt include project for C qhull applications linked to libqhull
    -# -------------------------------------------------
    -
    -include(qhull-warn.pri)
    -
    -DESTDIR = ../../bin
    -TEMPLATE = app
    -CONFIG += console warn_on
    -CONFIG -= qt
    -
    -LIBS += -L../../lib
    -build_pass:CONFIG(debug, debug|release){
    -   LIBS += -lqhullstatic_d
    -   OBJECTS_DIR = Debug
    -}else:build_pass:CONFIG(release, debug|release){
    -   LIBS += -lqhullstatic
    -   OBJECTS_DIR = Release
    -}
    -win32-msvc* : QMAKE_LFLAGS += /INCREMENTAL:NO
    -
    -INCLUDEPATH += ..
    -CONFIG += qhull_warn_conversion
    -
    diff --git a/src/qhull/src/qhull-app-c_r.pri b/src/qhull/src/qhull-app-c_r.pri
    deleted file mode 100644
    index 9c2ef5600be..00000000000
    --- a/src/qhull/src/qhull-app-c_r.pri
    +++ /dev/null
    @@ -1,26 +0,0 @@
    -# -------------------------------------------------
    -# qhull-app-c_r.pri -- Qt include project for C qhull applications linked to qhullstatic_r
    -#
    -# It uses reentrant Qhull
    -# -------------------------------------------------
    -
    -include(qhull-warn.pri)
    -
    -DESTDIR = ../../bin
    -TEMPLATE = app
    -CONFIG += console warn_on
    -CONFIG -= qt
    -
    -LIBS += -L../../lib
    -build_pass:CONFIG(debug, debug|release){
    -   LIBS += -lqhullstatic_rd
    -   OBJECTS_DIR = Debug
    -}else:build_pass:CONFIG(release, debug|release){
    -   LIBS += -lqhullstatic_r
    -   OBJECTS_DIR = Release
    -}
    -win32-msvc* : QMAKE_LFLAGS += /INCREMENTAL:NO
    -
    -INCLUDEPATH += ..
    -CONFIG += qhull_warn_conversion
    -
    diff --git a/src/qhull/src/qhull-app-cpp.pri b/src/qhull/src/qhull-app-cpp.pri
    deleted file mode 100644
    index a6f17d8ec4f..00000000000
    --- a/src/qhull/src/qhull-app-cpp.pri
    +++ /dev/null
    @@ -1,23 +0,0 @@
    -# -------------------------------------------------
    -# qhull-app-cpp.pri -- Qt include project for qhull as C++ classes
    -# -------------------------------------------------
    -
    -include(qhull-warn.pri)
    -
    -DESTDIR = ../../bin
    -TEMPLATE = app
    -CONFIG += console warn_on
    -CONFIG -= rtti
    -LIBS += -L../../lib
    -build_pass:CONFIG(debug, debug|release){
    -   LIBS += -lqhullcpp_d
    -   LIBS += -lqhullstatic_rd  # Must be last, otherwise qh_fprintf,etc. are loaded from here instead of qhullcpp-d.lib
    -   OBJECTS_DIR = Debug
    -}else:build_pass:CONFIG(release, debug|release){
    -   LIBS += -lqhullcpp
    -   LIBS += -lqhullstatic_r  # Must be last, otherwise qh_fprintf,etc. are loaded from here instead of qhullcpp.lib
    -   OBJECTS_DIR = Release
    -}
    -win32-msvc* : QMAKE_LFLAGS += /INCREMENTAL:NO
    -
    -INCLUDEPATH += ../../src # "libqhull_r/qhull_a.h"
    diff --git a/src/qhull/src/qhull-app-shared.pri b/src/qhull/src/qhull-app-shared.pri
    deleted file mode 100644
    index 1f4026a6aaf..00000000000
    --- a/src/qhull/src/qhull-app-shared.pri
    +++ /dev/null
    @@ -1,27 +0,0 @@
    -# -------------------------------------------------
    -# qhull-app-shared.pri -- Deprecated Qt include project for C qhull applications linked with libqhull (shared library)
    -# -------------------------------------------------
    -
    -include(qhull-warn.pri)
    -
    -DESTDIR = ../../bin
    -TEMPLATE = app
    -CONFIG += console warn_on
    -CONFIG -= qt
    -
    -LIBS += -L../../lib
    -build_pass:CONFIG(debug, debug|release){
    -   LIBS += -lqhull_d
    -   OBJECTS_DIR = Debug
    -}else:build_pass:CONFIG(release, debug|release){
    -   LIBS += -lqhull
    -   OBJECTS_DIR = Release
    -}
    -win32-msvc* : QMAKE_LFLAGS += /INCREMENTAL:NO
    -
    -win32-msvc* : DEFINES += qh_dllimport # libqhull/user.h
    -
    -INCLUDEPATH += ../libqhull
    -CONFIG += qhull_warn_conversion
    -
    -
    diff --git a/src/qhull/src/qhull-app-shared_r.pri b/src/qhull/src/qhull-app-shared_r.pri
    deleted file mode 100644
    index e55c1a65f8b..00000000000
    --- a/src/qhull/src/qhull-app-shared_r.pri
    +++ /dev/null
    @@ -1,29 +0,0 @@
    -# -------------------------------------------------
    -# qhull-app-shared_r.pri -- Qt include project for C qhull applications linked with libqhull_r (shared library)
    -#
    -# It uses reentrant Qhull
    -# -------------------------------------------------
    -
    -include(qhull-warn.pri)
    -
    -DESTDIR = ../../bin
    -TEMPLATE = app
    -CONFIG += console warn_on
    -CONFIG -= qt
    -
    -LIBS += -L../../lib
    -build_pass:CONFIG(debug, debug|release){
    -   LIBS += -lqhull_rd
    -   OBJECTS_DIR = Debug
    -}else:build_pass:CONFIG(release, debug|release){
    -   LIBS += -lqhull_r
    -   OBJECTS_DIR = Release
    -}
    -win32-msvc* : QMAKE_LFLAGS += /INCREMENTAL:NO
    -
    -win32-msvc* : DEFINES += qh_dllimport # libqhull_r/user.h
    -
    -INCLUDEPATH += ..
    -CONFIG += qhull_warn_conversion
    -
    -
    diff --git a/src/qhull/src/qhull-libqhull-src.pri b/src/qhull/src/qhull-libqhull-src.pri
    deleted file mode 100644
    index e7aff3f781a..00000000000
    --- a/src/qhull/src/qhull-libqhull-src.pri
    +++ /dev/null
    @@ -1,39 +0,0 @@
    -# -------------------------------------------------
    -# qhull-libqhull-src.pri -- Qt include project for libqhull sources and headers
    -#   libqhull.pro, libqhullp.pro, and libqhulldll.pro are the same for SOURCES and HEADERS
    -# -------------------------------------------------
    -
    -# Order object files by frequency of execution.  Small files at end.
    -# Current directory is caller
    -
    -# libqhull/libqhull.pro and ../qhull-libqhull-src.pri have the same SOURCES and HEADERS
    -SOURCES += ../libqhull/global.c
    -SOURCES += ../libqhull/stat.c
    -SOURCES += ../libqhull/geom2.c
    -SOURCES += ../libqhull/poly2.c
    -SOURCES += ../libqhull/merge.c
    -SOURCES += ../libqhull/libqhull.c
    -SOURCES += ../libqhull/geom.c
    -SOURCES += ../libqhull/poly.c
    -SOURCES += ../libqhull/qset.c
    -SOURCES += ../libqhull/mem.c
    -SOURCES += ../libqhull/random.c
    -SOURCES += ../libqhull/usermem.c
    -SOURCES += ../libqhull/userprintf.c
    -SOURCES += ../libqhull/io.c
    -SOURCES += ../libqhull/user.c
    -SOURCES += ../libqhull/rboxlib.c
    -SOURCES += ../libqhull/userprintf_rbox.c
    -
    -# [2014] qmake locates the headers in the shadow build directory not the src directory
    -HEADERS += ../libqhull/geom.h
    -HEADERS += ../libqhull/io.h
    -HEADERS += ../libqhull/libqhull.h
    -HEADERS += ../libqhull/mem.h
    -HEADERS += ../libqhull/merge.h
    -HEADERS += ../libqhull/poly.h
    -HEADERS += ../libqhull/random.h
    -HEADERS += ../libqhull/qhull_a.h
    -HEADERS += ../libqhull/qset.h
    -HEADERS += ../libqhull/stat.h
    -HEADERS += ../libqhull/user.h
    diff --git a/src/qhull/src/qhull-libqhull-src_r.pri b/src/qhull/src/qhull-libqhull-src_r.pri
    deleted file mode 100644
    index 3b53291b1b1..00000000000
    --- a/src/qhull/src/qhull-libqhull-src_r.pri
    +++ /dev/null
    @@ -1,39 +0,0 @@
    -# -------------------------------------------------
    -# qhull-libqhull-src_r.pri -- Qt include project for libqhull_r sources and headers
    -#
    -# It uses reentrant Qhull
    -# -------------------------------------------------
    -
    -# Order object files by frequency of execution.  Small files at end.
    -# Current directory is caller
    -
    -# libqhull_r/libqhull_r.pro and ../qhull-libqhull-src_r.pri have the same SOURCES and HEADERS
    -SOURCES += ../libqhull_r/global_r.c
    -SOURCES += ../libqhull_r/stat_r.c
    -SOURCES += ../libqhull_r/geom2_r.c
    -SOURCES += ../libqhull_r/poly2_r.c
    -SOURCES += ../libqhull_r/merge_r.c
    -SOURCES += ../libqhull_r/libqhull_r.c
    -SOURCES += ../libqhull_r/geom_r.c
    -SOURCES += ../libqhull_r/poly_r.c
    -SOURCES += ../libqhull_r/qset_r.c
    -SOURCES += ../libqhull_r/mem_r.c
    -SOURCES += ../libqhull_r/random_r.c
    -SOURCES += ../libqhull_r/usermem_r.c
    -SOURCES += ../libqhull_r/userprintf_r.c
    -SOURCES += ../libqhull_r/io_r.c
    -SOURCES += ../libqhull_r/user_r.c
    -SOURCES += ../libqhull_r/rboxlib_r.c
    -SOURCES += ../libqhull_r/userprintf_rbox_r.c
    -
    -HEADERS += ../libqhull_r/geom_r.h
    -HEADERS += ../libqhull_r/io_r.h
    -HEADERS += ../libqhull_r/libqhull_r.h
    -HEADERS += ../libqhull_r/mem_r.h
    -HEADERS += ../libqhull_r/merge_r.h
    -HEADERS += ../libqhull_r/poly_r.h
    -HEADERS += ../libqhull_r/random_r.h
    -HEADERS += ../libqhull_r/qhull_ra.h
    -HEADERS += ../libqhull_r/qset_r.h
    -HEADERS += ../libqhull_r/stat_r.h
    -HEADERS += ../libqhull_r/user_r.h
    diff --git a/src/qhull/src/qhull-warn.pri b/src/qhull/src/qhull-warn.pri
    deleted file mode 100644
    index 7d0e7fa2f4f..00000000000
    --- a/src/qhull/src/qhull-warn.pri
    +++ /dev/null
    @@ -1,57 +0,0 @@
    -# -------------------------------------------------
    -# qhull-warn.pri -- Qt project warnings for warn_on
    -#   CONFIG += qhull_warn_all        # Qhull compiles with all warnings except for qhull_warn_shadow and qhull_warn_conversion
    -#   CONFIG += qhull_warn_conversion # Warn in Qt and Qhull about conversion errors
    -#   CONFIG += qhull_warn_error      # Turn warnings into errors
    -#   CONFIG += qhull_warn_shadow     # Warn in Qt about shadowing of functions and fields
    -# -------------------------------------------------
    -
    -# [apr'11] VERSION works erratically for msvc builds
    -# VERSION = 7.2.0
    -qhull_SOVERSION = 7
    -
    -# Uncomment to report warnings as errors
    -#CONFIG += qhull_warn_error
    -
    -*g++{
    -    qhull_warn_error{
    -        QMAKE_CFLAGS_WARN_ON += -Werror
    -        QMAKE_CXXFLAGS_WARN_ON += -Werror
    -    }
    -
    -    QMAKE_CFLAGS_WARN_ON += -Wcast-qual -Wextra -Wshadow -Wwrite-strings
    -
    -    QMAKE_CXXFLAGS_WARN_ON += -Wcast-qual -Wextra -Wwrite-strings
    -    QMAKE_CXXFLAGS_WARN_ON += -Wno-sign-conversion
    -
    -    qhull_warn_shadow{
    -        QMAKE_CXXFLAGS_WARN_ON += -Wshadow     # Shadowing occurs in Qt, e.g., nested foreach
    -    }
    -
    -    qhull_warn_conversion{
    -        QMAKE_CFLAGS_WARN_ON += -Wno-sign-conversion   # libqhullstatic has many size_t vs. int warnings
    -        QMAKE_CFLAGS_WARN_ON += -Wconversion           # libqhullstatic has no workaround for bit-field conversions
    -        QMAKE_CXXFLAGS_WARN_ON += -Wconversion         # Qt has conversion errors for qbitarray and qpalette
    -    }
    -
    -    qhull_warn_all{
    -        QMAKE_CFLAGS_WARN_ON += -Waddress -Warray-bounds -Wchar-subscripts -Wclobbered -Wcomment -Wempty-body
    -        QMAKE_CFLAGS_WARN_ON += -Wformat -Wignored-qualifiers -Wimplicit-function-declaration -Wimplicit-int
    -        QMAKE_CFLAGS_WARN_ON += -Wmain -Wmissing-braces -Wmissing-field-initializers -Wmissing-parameter-type
    -        QMAKE_CFLAGS_WARN_ON += -Wnonnull -Wold-style-declaration -Woverride-init -Wparentheses
    -        QMAKE_CFLAGS_WARN_ON += -Wpointer-sign -Wreturn-type -Wsequence-point -Wsign-compare
    -        QMAKE_CFLAGS_WARN_ON += -Wsign-compare -Wstrict-aliasing -Wstrict-overflow=1 -Wswitch
    -        QMAKE_CFLAGS_WARN_ON += -Wtrigraphs -Wtype-limits -Wuninitialized -Wuninitialized
    -        QMAKE_CFLAGS_WARN_ON += -Wunknown-pragmas -Wunused-function -Wunused-label -Wunused-parameter
    -        QMAKE_CFLAGS_WARN_ON += -Wunused-value -Wunused-variable -Wvolatile-register-var
    -
    -        QMAKE_CXXFLAGS_WARN_ON += -Waddress -Warray-bounds -Wc++0x-compat -Wchar-subscripts
    -        QMAKE_CXXFLAGS_WARN_ON += -Wclobbered -Wcomment -Wempty-body -Wenum-compare
    -        QMAKE_CXXFLAGS_WARN_ON += -Wformat -Wignored-qualifiers -Wmain -Wmissing-braces
    -        QMAKE_CXXFLAGS_WARN_ON += -Wmissing-field-initializers -Wparentheses -Wreorder -Wreturn-type
    -        QMAKE_CXXFLAGS_WARN_ON += -Wsequence-point -Wsign-compare -Wsign-compare -Wstrict-aliasing
    -        QMAKE_CXXFLAGS_WARN_ON += -Wstrict-overflow=1 -Wswitch -Wtrigraphs -Wtype-limits
    -        QMAKE_CXXFLAGS_WARN_ON += -Wuninitialized -Wunknown-pragmas -Wunused-function -Wunused-label
    -        QMAKE_CXXFLAGS_WARN_ON += -Wunused-parameter -Wunused-value -Wunused-variable -Wvolatile-register-var
    -    }
    -}
    diff --git a/src/qhull/src/qhull/qhull.pro b/src/qhull/src/qhull/qhull.pro
    deleted file mode 100644
    index 83937285673..00000000000
    --- a/src/qhull/src/qhull/qhull.pro
    +++ /dev/null
    @@ -1,9 +0,0 @@
    -# -------------------------------------------------
    -# qhull.pro -- Qt project file for qhull.exe with libqhullstatic_r
    -# -------------------------------------------------
    -
    -include(../qhull-app-c_r.pri)
    -
    -TARGET = qhull
    -
    -SOURCES += unix_r.c
    diff --git a/src/qhull/src/qhull/unix.c b/src/qhull/src/qhull/unix.c
    deleted file mode 100644
    index 892a819c31f..00000000000
    --- a/src/qhull/src/qhull/unix.c
    +++ /dev/null
    @@ -1,372 +0,0 @@
    -/*
      ---------------------------------
    -
    -   unix.c
    -     command line interface to qhull
    -         includes SIOUX interface for Macintoshes
    -
    -   see qh-qhull.htm
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/qhull/unix.c#4 $$Change: 2066 $
    -   $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    -*/
    -
    -#include "libqhull/libqhull.h"
    -#include "libqhull/qset.h"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#if __cplusplus
    -extern "C" {
    -  int isatty(int);
    -}
    -
    -#elif _MSC_VER
    -#include 
    -#define isatty _isatty
    -/* int _isatty(int); */
    -
    -#else
    -int isatty(int);  /* returns 1 if stdin is a tty
    -                   if "Undefined symbol" this can be deleted along with call in main() */
    -#endif
    -
    -/*---------------------------------
    -
    -  qh_prompt
    -    long prompt for qhull
    -
    -  see:
    -    concise prompt below
    -*/
    -char qh_prompta[]= "\n\
    -qhull- compute convex hulls and related structures.\n\
    -    http://www.qhull.org  %s\n\
    -\n\
    -input (stdin):\n\
    -    first lines: dimension and number of points (or vice-versa).\n\
    -    other lines: point coordinates, best if one point per line\n\
    -    comments:    start with a non-numeric character\n\
    -    halfspaces:  use dim plus one and put offset after coefficients.\n\
    -                 May be preceded by a single interior point ('H').\n\
    -\n\
    -options:\n\
    -    d    - Delaunay triangulation by lifting points to a paraboloid\n\
    -    d Qu - furthest-site Delaunay triangulation (upper convex hull)\n\
    -    v    - Voronoi diagram (dual of the Delaunay triangulation)\n\
    -    v Qu - furthest-site Voronoi diagram\n\
    -    Hn,n,... - halfspace intersection about point [n,n,0,...]\n\
    -    Qt   - triangulated output\n\
    -    QJ   - joggled input instead of merged facets\n\
    -    Qc   - keep coplanar points with nearest facet\n\
    -    Qi   - keep interior points with nearest facet\n\
    -\n\
    -Qhull control options:\n\
    -    Qbk:n   - scale coord k so that low bound is n\n\
    -      QBk:n - scale coord k so that upper bound is n (QBk is %2.2g)\n\
    -    QbB  - scale input to unit cube centered at the origin\n\
    -    Qbb  - scale last coordinate to [0,m] for Delaunay triangulations\n\
    -    Qbk:0Bk:0 - remove k-th coordinate from input\n\
    -    QJn  - randomly joggle input in range [-n,n]\n\
    -    QRn  - random rotation (n=seed, n=0 time, n=-1 time/no rotate)\n\
    -%s%s%s%s";  /* split up qh_prompt for Visual C++ */
    -char qh_promptb[]= "\
    -    Qf   - partition point to furthest outside facet\n\
    -    Qg   - only build good facets (needs 'QGn', 'QVn', or 'PdD')\n\
    -    Qm   - only process points that would increase max_outside\n\
    -    Qr   - process random outside points instead of furthest ones\n\
    -    Qs   - search all points for the initial simplex\n\
    -    Qu   - for 'd' or 'v', compute upper hull without point at-infinity\n\
    -              returns furthest-site Delaunay triangulation\n\
    -    Qv   - test vertex neighbors for convexity\n\
    -    Qx   - exact pre-merges (skips coplanar and angle-coplanar facets)\n\
    -    Qz   - add point-at-infinity to Delaunay triangulation\n\
    -    QGn  - good facet if visible from point n, -n for not visible\n\
    -    QVn  - good facet if it includes point n, -n if not\n\
    -    Q0   - turn off default premerge with 'C-0'/'Qx'\n\
    -    Q1     - sort merges by type instead of angle\n\
    -    Q2   - merge all non-convex at once instead of independent sets\n\
    -    Q3   - do not merge redundant vertices\n\
    -    Q4   - avoid old->new merges\n\
    -    Q5   - do not correct outer planes at end of qhull\n\
    -    Q6   - do not pre-merge concave or coplanar facets\n\
    -    Q7   - depth-first processing instead of breadth-first\n\
    -    Q8   - do not process near-inside points\n\
    -    Q9   - process furthest of furthest points\n\
    -    Q10  - no special processing for narrow distributions\n\
    -    Q11  - copy normals and recompute centrums for tricoplanar facets\n\
    -    Q12  - no error on wide merge due to duplicate ridge\n\
    -\n\
    -";
    -char qh_promptc[]= "\
    -Topts- Trace options:\n\
    -    T4   - trace at level n, 4=all, 5=mem/gauss, -1= events\n\
    -    Ta   - annotate output with message codes\n\
    -    Tc   - check frequently during execution\n\
    -    Ts   - print statistics\n\
    -    Tv   - verify result: structure, convexity, and point inclusion\n\
    -    Tz   - send all output to stdout\n\
    -    TFn  - report summary when n or more facets created\n\
    -    TI file - input data from file, no spaces or single quotes\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    -    TPn  - turn on tracing when point n added to hull\n\
    -     TMn - turn on tracing at merge n\n\
    -     TWn - trace merge facets when width > n\n\
    -    TRn  - rerun qhull n times.  Use with 'QJn'\n\
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)\n\
    -     TCn - stop qhull after building cone for point n (see TVn)\n\
    -\n\
    -Precision options:\n\
    -    Cn   - radius of centrum (roundoff added).  Merge facets if non-convex\n\
    -     An  - cosine of maximum angle.  Merge facets if cosine > n or non-convex\n\
    -           C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge\n\
    -    En   - max roundoff error for distance computation\n\
    -    Rn   - randomly perturb computations by a factor of [1-n,1+n]\n\
    -    Vn   - min distance above plane for a visible facet (default 3C-n or En)\n\
    -    Un   - max distance below plane for a new, coplanar point (default Vn)\n\
    -    Wn   - min facet width for outside point (before roundoff, default 2Vn)\n\
    -\n\
    -Output formats (may be combined; if none, produces a summary to stdout):\n\
    -    f    - facet dump\n\
    -    G    - Geomview output (see below)\n\
    -    i    - vertices incident to each facet\n\
    -    m    - Mathematica output (2-d and 3-d)\n\
    -    o    - OFF format (dim, points and facets; Voronoi regions)\n\
    -    n    - normals with offsets\n\
    -    p    - vertex coordinates or Voronoi vertices (coplanar points if 'Qc')\n\
    -    s    - summary (stderr)\n\
    -\n\
    -";
    -char qh_promptd[]= "\
    -More formats:\n\
    -    Fa   - area for each facet\n\
    -    FA   - compute total area and volume for option 's'\n\
    -    Fc   - count plus coplanar points for each facet\n\
    -           use 'Qc' (default) for coplanar and 'Qi' for interior\n\
    -    FC   - centrum or Voronoi center for each facet\n\
    -    Fd   - use cdd format for input (homogeneous with offset first)\n\
    -    FD   - use cdd format for numeric output (offset first)\n\
    -    FF   - facet dump without ridges\n\
    -    Fi   - inner plane for each facet\n\
    -           for 'v', separating hyperplanes for bounded Voronoi regions\n\
    -    FI   - ID of each facet\n\
    -    Fm   - merge count for each facet (511 max)\n\
    -    FM   - Maple output (2-d and 3-d)\n\
    -    Fn   - count plus neighboring facets for each facet\n\
    -    FN   - count plus neighboring facets for each point\n\
    -    Fo   - outer plane (or max_outside) for each facet\n\
    -           for 'v', separating hyperplanes for unbounded Voronoi regions\n\
    -    FO   - options and precision constants\n\
    -    Fp   - dim, count, and intersection coordinates (halfspace only)\n\
    -    FP   - nearest vertex and distance for each coplanar point\n\
    -    FQ   - command used for qhull\n\
    -    Fs   - summary: #int (8), dimension, #points, tot vertices, tot facets,\n\
    -                      output: #vertices, #facets, #coplanars, #nonsimplicial\n\
    -                    #real (2), max outer plane, min vertex\n\
    -    FS   - sizes:   #int (0)\n\
    -                    #real (2) tot area, tot volume\n\
    -    Ft   - triangulation with centrums for non-simplicial facets (OFF format)\n\
    -    Fv   - count plus vertices for each facet\n\
    -           for 'v', Voronoi diagram as Voronoi vertices for pairs of sites\n\
    -    FV   - average of vertices (a feasible point for 'H')\n\
    -    Fx   - extreme points (in order for 2-d)\n\
    -\n\
    -";
    -char qh_prompte[]= "\
    -Geomview options (2-d, 3-d, and 4-d; 2-d Voronoi)\n\
    -    Ga   - all points as dots\n\
    -     Gp  -  coplanar points and vertices as radii\n\
    -     Gv  -  vertices as spheres\n\
    -    Gi   - inner planes only\n\
    -     Gn  -  no planes\n\
    -     Go  -  outer planes only\n\
    -    Gc   - centrums\n\
    -    Gh   - hyperplane intersections\n\
    -    Gr   - ridges\n\
    -    GDn  - drop dimension n in 3-d and 4-d output\n\
    -    Gt   - for 3-d 'd', transparent outer ridges\n\
    -\n\
    -Print options:\n\
    -    PAn  - keep n largest facets by area\n\
    -    Pdk:n - drop facet if normal[k] <= n (default 0.0)\n\
    -    PDk:n - drop facet if normal[k] >= n\n\
    -    Pg   - print good facets (needs 'QGn' or 'QVn')\n\
    -    PFn  - keep facets whose area is at least n\n\
    -    PG   - print neighbors of good facets\n\
    -    PMn  - keep n facets with most merges\n\
    -    Po   - force output.  If error, output neighborhood of facet\n\
    -    Pp   - do not report precision problems\n\
    -\n\
    -    .    - list of all options\n\
    -    -    - one line descriptions of all options\n\
    -    -V   - version\n\
    -";
    -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    -
    -/*---------------------------------
    -
    -  qh_prompt2
    -    synopsis for qhull
    -*/
    -char qh_prompt2[]= "\n\
    -qhull- compute convex hulls and related structures.  Qhull %s\n\
    -    input (stdin): dimension, n, point coordinates\n\
    -    comments start with a non-numeric character\n\
    -    halfspace: use dim+1 and put offsets after coefficients\n\
    -\n\
    -options (qh-quick.htm):\n\
    -    d    - Delaunay triangulation by lifting points to a paraboloid\n\
    -    d Qu - furthest-site Delaunay triangulation (upper convex hull)\n\
    -    v    - Voronoi diagram as the dual of the Delaunay triangulation\n\
    -    v Qu - furthest-site Voronoi diagram\n\
    -    H1,1 - Halfspace intersection about [1,1,0,...] via polar duality\n\
    -    Qt   - triangulated output\n\
    -    QJ   - joggled input instead of merged facets\n\
    -    Tv   - verify result: structure, convexity, and point inclusion\n\
    -    .    - concise list of all options\n\
    -    -    - one-line description of each option\n\
    -    -V   - version\n\
    -\n\
    -Output options (subset):\n\
    -    s    - summary of results (default)\n\
    -    i    - vertices incident to each facet\n\
    -    n    - normals with offsets\n\
    -    p    - vertex coordinates (if 'Qc', includes coplanar points)\n\
    -           if 'v', Voronoi vertices\n\
    -    Fp   - halfspace intersections\n\
    -    Fx   - extreme points (convex hull vertices)\n\
    -    FA   - compute total area and volume\n\
    -    o    - OFF format (if 'v', outputs Voronoi regions)\n\
    -    G    - Geomview output (2-d, 3-d and 4-d)\n\
    -    m    - Mathematica output (2-d and 3-d)\n\
    -    QVn  - print facets that include point n, -n if not\n\
    -    TO file- output results to file, may be enclosed in single quotes\n\
    -\n\
    -examples:\n\
    -    rbox D4 | qhull Tv                        rbox 1000 s | qhull Tv s FA\n\
    -    rbox 10 D2 | qhull d QJ s i TO result     rbox 10 D2 | qhull v Qbb Qt p\n\
    -    rbox 10 D2 | qhull d Qu QJ m              rbox 10 D2 | qhull v Qu QJ o\n\
    -    rbox c d D2 | qhull Qc s f Fx | more      rbox c | qhull FV n | qhull H Fp\n\
    -    rbox d D12 | qhull QR0 FA                 rbox c D7 | qhull FA TF1000\n\
    -    rbox y 1000 W0 | qhull                    rbox c | qhull n\n\
    -\n\
    -";
    -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    -
    -/*---------------------------------
    -
    -  qh_prompt3
    -    concise prompt for qhull
    -*/
    -char qh_prompt3[]= "\n\
    -Qhull %s.\n\
    -Except for 'F.' and 'PG', upper-case options take an argument.\n\
    -\n\
    - delaunay       voronoi        Geomview       Halfspace      facet_dump\n\
    - incidences     mathematica    normals        OFF_format     points\n\
    - summary\n\
    -\n\
    - Farea          FArea-total    Fcoplanars     FCentrums      Fd-cdd-in\n\
    - FD-cdd-out     FF-dump-xridge Finner         FIDs           Fmerges\n\
    - Fneighbors     FNeigh-vertex  Fouter         FOptions       Fpoint-intersect\n\
    - FPoint_near    FQhull         Fsummary       FSize          Ftriangles\n\
    - Fvertices      Fvoronoi       FVertex-ave    Fxtremes       FMaple\n\
    -\n\
    - Gvertices      Gpoints        Gall_points    Gno_planes     Ginner\n\
    - Gcentrums      Ghyperplanes   Gridges        Gouter         GDrop_dim\n\
    - Gtransparent\n\
    -\n\
    - PArea-keep     Pdrop d0:0D0   Pgood          PFacet_area_keep\n\
    - PGood_neighbors PMerge-keep   Poutput_forced Pprecision_not\n\
    -\n\
    - QbBound 0:0.5  Qbk:0Bk:0_drop QbB-scale-box  Qbb-scale-last Qcoplanar\n\
    - Qfurthest      Qgood_only     QGood_point    Qinterior      Qmax_out\n\
    - QJoggle        Qrandom        QRotate        Qsearch_1st    Qtriangulate\n\
    - QupperDelaunay QVertex_good   Qvneighbors    Qxact_merge    Qzinfinite\n\
    -\n\
    - Q0_no_premerge Q1_no_angle    Q2_no_independ Q3_no_redundant Q4_no_old\n\
    - Q5_no_check_out Q6_no_concave Q7_depth_first Q8_no_near_in  Q9_pick_furthest\n\
    - Q10_no_narrow  Q11_trinormals Q12_no_wide_dup\n\
    -\n\
    - T4_trace       Tannotate      Tcheck_often   Tstatistics    Tverify\n\
    - Tz_stdout      TFacet_log     TInput_file    TPoint_trace   TMerge_trace\n\
    - TOutput_file   TRerun         TWide_trace    TVertex_stop   TCone_stop\n\
    -\n\
    - Angle_max      Centrum_size   Error_round    Random_dist    Visible_min\n\
    - Ucoplanar_max  Wide_outside\n\
    -";
    -
    -/*---------------------------------
    -
    -  main( argc, argv )
    -    processes the command line, calls qhull() to do the work, and exits
    -
    -  design:
    -    initializes data structures
    -    reads points
    -    finishes initialization
    -    computes convex hull and other structures
    -    checks the result
    -    writes the output
    -    frees memory
    -*/
    -int main(int argc, char *argv[]) {
    -  int curlong, totlong; /* used !qh_NOmem */
    -  int exitcode, numpoints, dim;
    -  coordT *points;
    -  boolT ismalloc;
    -
    -  QHULL_LIB_CHECK /* Check for compatible library */
    -
    -  if ((argc == 1) && isatty( 0 /*stdin*/)) {
    -    fprintf(stdout, qh_prompt2, qh_version);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) {
    -    fprintf(stdout, qh_prompta, qh_version, qh_DEFAULTbox,
    -                qh_promptb, qh_promptc, qh_promptd, qh_prompte);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '.' && !*(argv[1]+1)) {
    -    fprintf(stdout, qh_prompt3, qh_version);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '-' && *(argv[1]+1)=='V') {
    -      fprintf(stdout, "%s\n", qh_version2);
    -      exit(qh_ERRnone);
    -  }
    -  qh_init_A(stdin, stdout, stderr, argc, argv);  /* sets qh qhull_command */
    -  exitcode= setjmp(qh errexit); /* simple statement for CRAY J916 */
    -  if (!exitcode) {
    -    qh_initflags(qh qhull_command);
    -    points= qh_readpoints(&numpoints, &dim, &ismalloc);
    -    qh_init_B(points, numpoints, dim, ismalloc);
    -    qh_qhull();
    -    qh_check_output();
    -    qh_produce_output();
    -    if (qh VERIFYoutput && !qh FORCEoutput && !qh STOPpoint && !qh STOPcone)
    -      qh_check_points();
    -    exitcode= qh_ERRnone;
    -  }
    -  qh NOerrexit= True;  /* no more setjmp */
    -#ifdef qh_NOmem
    -  qh_freeqhull( qh_ALL);
    -#else
    -  qh_freeqhull( !qh_ALL);
    -  qh_memfreeshort(&curlong, &totlong);
    -  if (curlong || totlong)
    -    qh_fprintf_stderr(6263, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
    -       totlong, curlong);
    -#endif
    -  return exitcode;
    -} /* main */
    -
    diff --git a/src/qhull/src/qhull/unix_r.c b/src/qhull/src/qhull/unix_r.c
    deleted file mode 100644
    index 3f999f7fa9d..00000000000
    --- a/src/qhull/src/qhull/unix_r.c
    +++ /dev/null
    @@ -1,374 +0,0 @@
    -/*
      ---------------------------------
    -
    -   unix.c
    -     command line interface to qhull
    -         includes SIOUX interface for Macintoshes
    -
    -   see qh-qhull.htm
    -
    -   Copyright (c) 1993-2015 The Geometry Center.
    -   $Id: //main/2015/qhull/src/qhull/unix_r.c#6 $$Change: 2066 $
    -   $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $
    -*/
    -
    -#include "libqhull_r/libqhull_r.h"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#if __cplusplus
    -extern "C" {
    -  int isatty(int);
    -}
    -
    -#elif _MSC_VER
    -#include 
    -#define isatty _isatty
    -/* int _isatty(int); */
    -
    -#else
    -int isatty(int);  /* returns 1 if stdin is a tty
    -                   if "Undefined symbol" this can be deleted along with call in main() */
    -#endif
    -
    -/*---------------------------------
    -
    -  qh_prompt
    -    long prompt for qhull
    -
    -  see:
    -    concise prompt below
    -*/
    -char qh_prompta[]= "\n\
    -qhull- compute convex hulls and related structures.\n\
    -    http://www.qhull.org  %s\n\
    -\n\
    -input (stdin):\n\
    -    first lines: dimension and number of points (or vice-versa).\n\
    -    other lines: point coordinates, best if one point per line\n\
    -    comments:    start with a non-numeric character\n\
    -    halfspaces:  use dim plus one and put offset after coefficients.\n\
    -                 May be preceded by a single interior point ('H').\n\
    -\n\
    -options:\n\
    -    d    - Delaunay triangulation by lifting points to a paraboloid\n\
    -    d Qu - furthest-site Delaunay triangulation (upper convex hull)\n\
    -    v    - Voronoi diagram (dual of the Delaunay triangulation)\n\
    -    v Qu - furthest-site Voronoi diagram\n\
    -    Hn,n,... - halfspace intersection about point [n,n,0,...]\n\
    -    Qt   - triangulated output\n\
    -    QJ   - joggled input instead of merged facets\n\
    -    Qc   - keep coplanar points with nearest facet\n\
    -    Qi   - keep interior points with nearest facet\n\
    -\n\
    -Qhull control options:\n\
    -    Qbk:n   - scale coord k so that low bound is n\n\
    -      QBk:n - scale coord k so that upper bound is n (QBk is %2.2g)\n\
    -    QbB  - scale input to unit cube centered at the origin\n\
    -    Qbb  - scale last coordinate to [0,m] for Delaunay triangulations\n\
    -    Qbk:0Bk:0 - remove k-th coordinate from input\n\
    -    QJn  - randomly joggle input in range [-n,n]\n\
    -    QRn  - random rotation (n=seed, n=0 time, n=-1 time/no rotate)\n\
    -%s%s%s%s";  /* split up qh_prompt for Visual C++ */
    -char qh_promptb[]= "\
    -    Qf   - partition point to furthest outside facet\n\
    -    Qg   - only build good facets (needs 'QGn', 'QVn', or 'PdD')\n\
    -    Qm   - only process points that would increase max_outside\n\
    -    Qr   - process random outside points instead of furthest ones\n\
    -    Qs   - search all points for the initial simplex\n\
    -    Qu   - for 'd' or 'v', compute upper hull without point at-infinity\n\
    -              returns furthest-site Delaunay triangulation\n\
    -    Qv   - test vertex neighbors for convexity\n\
    -    Qx   - exact pre-merges (skips coplanar and angle-coplanar facets)\n\
    -    Qz   - add point-at-infinity to Delaunay triangulation\n\
    -    QGn  - good facet if visible from point n, -n for not visible\n\
    -    QVn  - good facet if it includes point n, -n if not\n\
    -    Q0   - turn off default premerge with 'C-0'/'Qx'\n\
    -    Q1     - sort merges by type instead of angle\n\
    -    Q2   - merge all non-convex at once instead of independent sets\n\
    -    Q3   - do not merge redundant vertices\n\
    -    Q4   - avoid old->new merges\n\
    -    Q5   - do not correct outer planes at end of qhull\n\
    -    Q6   - do not pre-merge concave or coplanar facets\n\
    -    Q7   - depth-first processing instead of breadth-first\n\
    -    Q8   - do not process near-inside points\n\
    -    Q9   - process furthest of furthest points\n\
    -    Q10  - no special processing for narrow distributions\n\
    -    Q11  - copy normals and recompute centrums for tricoplanar facets\n\
    -    Q12  - no error on wide merge due to duplicate ridge\n\
    -\n\
    -";
    -char qh_promptc[]= "\
    -Topts- Trace options:\n\
    -    T4   - trace at level n, 4=all, 5=mem/gauss, -1= events\n\
    -    Ta   - annotate output with message codes\n\
    -    Tc   - check frequently during execution\n\
    -    Ts   - print statistics\n\
    -    Tv   - verify result: structure, convexity, and point inclusion\n\
    -    Tz   - send all output to stdout\n\
    -    TFn  - report summary when n or more facets created\n\
    -    TI file - input data from file, no spaces or single quotes\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    -    TPn  - turn on tracing when point n added to hull\n\
    -     TMn - turn on tracing at merge n\n\
    -     TWn - trace merge facets when width > n\n\
    -    TRn  - rerun qhull n times.  Use with 'QJn'\n\
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)\n\
    -     TCn - stop qhull after building cone for point n (see TVn)\n\
    -\n\
    -Precision options:\n\
    -    Cn   - radius of centrum (roundoff added).  Merge facets if non-convex\n\
    -     An  - cosine of maximum angle.  Merge facets if cosine > n or non-convex\n\
    -           C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge\n\
    -    En   - max roundoff error for distance computation\n\
    -    Rn   - randomly perturb computations by a factor of [1-n,1+n]\n\
    -    Vn   - min distance above plane for a visible facet (default 3C-n or En)\n\
    -    Un   - max distance below plane for a new, coplanar point (default Vn)\n\
    -    Wn   - min facet width for outside point (before roundoff, default 2Vn)\n\
    -\n\
    -Output formats (may be combined; if none, produces a summary to stdout):\n\
    -    f    - facet dump\n\
    -    G    - Geomview output (see below)\n\
    -    i    - vertices incident to each facet\n\
    -    m    - Mathematica output (2-d and 3-d)\n\
    -    o    - OFF format (dim, points and facets; Voronoi regions)\n\
    -    n    - normals with offsets\n\
    -    p    - vertex coordinates or Voronoi vertices (coplanar points if 'Qc')\n\
    -    s    - summary (stderr)\n\
    -\n\
    -";
    -char qh_promptd[]= "\
    -More formats:\n\
    -    Fa   - area for each facet\n\
    -    FA   - compute total area and volume for option 's'\n\
    -    Fc   - count plus coplanar points for each facet\n\
    -           use 'Qc' (default) for coplanar and 'Qi' for interior\n\
    -    FC   - centrum or Voronoi center for each facet\n\
    -    Fd   - use cdd format for input (homogeneous with offset first)\n\
    -    FD   - use cdd format for numeric output (offset first)\n\
    -    FF   - facet dump without ridges\n\
    -    Fi   - inner plane for each facet\n\
    -           for 'v', separating hyperplanes for bounded Voronoi regions\n\
    -    FI   - ID of each facet\n\
    -    Fm   - merge count for each facet (511 max)\n\
    -    FM   - Maple output (2-d and 3-d)\n\
    -    Fn   - count plus neighboring facets for each facet\n\
    -    FN   - count plus neighboring facets for each point\n\
    -    Fo   - outer plane (or max_outside) for each facet\n\
    -           for 'v', separating hyperplanes for unbounded Voronoi regions\n\
    -    FO   - options and precision constants\n\
    -    Fp   - dim, count, and intersection coordinates (halfspace only)\n\
    -    FP   - nearest vertex and distance for each coplanar point\n\
    -    FQ   - command used for qhull\n\
    -    Fs   - summary: #int (8), dimension, #points, tot vertices, tot facets,\n\
    -                      output: #vertices, #facets, #coplanars, #nonsimplicial\n\
    -                    #real (2), max outer plane, min vertex\n\
    -    FS   - sizes:   #int (0)\n\
    -                    #real (2) tot area, tot volume\n\
    -    Ft   - triangulation with centrums for non-simplicial facets (OFF format)\n\
    -    Fv   - count plus vertices for each facet\n\
    -           for 'v', Voronoi diagram as Voronoi vertices for pairs of sites\n\
    -    FV   - average of vertices (a feasible point for 'H')\n\
    -    Fx   - extreme points (in order for 2-d)\n\
    -\n\
    -";
    -char qh_prompte[]= "\
    -Geomview options (2-d, 3-d, and 4-d; 2-d Voronoi)\n\
    -    Ga   - all points as dots\n\
    -     Gp  -  coplanar points and vertices as radii\n\
    -     Gv  -  vertices as spheres\n\
    -    Gi   - inner planes only\n\
    -     Gn  -  no planes\n\
    -     Go  -  outer planes only\n\
    -    Gc   - centrums\n\
    -    Gh   - hyperplane intersections\n\
    -    Gr   - ridges\n\
    -    GDn  - drop dimension n in 3-d and 4-d output\n\
    -    Gt   - for 3-d 'd', transparent outer ridges\n\
    -\n\
    -Print options:\n\
    -    PAn  - keep n largest facets by area\n\
    -    Pdk:n - drop facet if normal[k] <= n (default 0.0)\n\
    -    PDk:n - drop facet if normal[k] >= n\n\
    -    Pg   - print good facets (needs 'QGn' or 'QVn')\n\
    -    PFn  - keep facets whose area is at least n\n\
    -    PG   - print neighbors of good facets\n\
    -    PMn  - keep n facets with most merges\n\
    -    Po   - force output.  If error, output neighborhood of facet\n\
    -    Pp   - do not report precision problems\n\
    -\n\
    -    .    - list of all options\n\
    -    -    - one line descriptions of all options\n\
    -    -V   - version\n\
    -";
    -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    -
    -/*---------------------------------
    -
    -  qh_prompt2
    -    synopsis for qhull
    -*/
    -char qh_prompt2[]= "\n\
    -qhull- compute convex hulls and related structures.  Qhull %s\n\
    -    input (stdin): dimension, n, point coordinates\n\
    -    comments start with a non-numeric character\n\
    -    halfspace: use dim+1 and put offsets after coefficients\n\
    -\n\
    -options (qh-quick.htm):\n\
    -    d    - Delaunay triangulation by lifting points to a paraboloid\n\
    -    d Qu - furthest-site Delaunay triangulation (upper convex hull)\n\
    -    v    - Voronoi diagram as the dual of the Delaunay triangulation\n\
    -    v Qu - furthest-site Voronoi diagram\n\
    -    H1,1 - Halfspace intersection about [1,1,0,...] via polar duality\n\
    -    Qt   - triangulated output\n\
    -    QJ   - joggled input instead of merged facets\n\
    -    Tv   - verify result: structure, convexity, and point inclusion\n\
    -    .    - concise list of all options\n\
    -    -    - one-line description of each option\n\
    -    -V   - version\n\
    -\n\
    -Output options (subset):\n\
    -    s    - summary of results (default)\n\
    -    i    - vertices incident to each facet\n\
    -    n    - normals with offsets\n\
    -    p    - vertex coordinates (if 'Qc', includes coplanar points)\n\
    -           if 'v', Voronoi vertices\n\
    -    Fp   - halfspace intersections\n\
    -    Fx   - extreme points (convex hull vertices)\n\
    -    FA   - compute total area and volume\n\
    -    o    - OFF format (if 'v', outputs Voronoi regions)\n\
    -    G    - Geomview output (2-d, 3-d and 4-d)\n\
    -    m    - Mathematica output (2-d and 3-d)\n\
    -    QVn  - print facets that include point n, -n if not\n\
    -    TO file- output results to file, may be enclosed in single quotes\n\
    -\n\
    -examples:\n\
    -    rbox D4 | qhull Tv                        rbox 1000 s | qhull Tv s FA\n\
    -    rbox 10 D2 | qhull d QJ s i TO result     rbox 10 D2 | qhull v Qbb Qt p\n\
    -    rbox 10 D2 | qhull d Qu QJ m              rbox 10 D2 | qhull v Qu QJ o\n\
    -    rbox c d D2 | qhull Qc s f Fx | more      rbox c | qhull FV n | qhull H Fp\n\
    -    rbox d D12 | qhull QR0 FA                 rbox c D7 | qhull FA TF1000\n\
    -    rbox y 1000 W0 | qhull                    rbox c | qhull n\n\
    -\n\
    -";
    -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    -
    -/*---------------------------------
    -
    -  qh_prompt3
    -    concise prompt for qhull
    -*/
    -char qh_prompt3[]= "\n\
    -Qhull %s.\n\
    -Except for 'F.' and 'PG', upper-case options take an argument.\n\
    -\n\
    - delaunay       voronoi        Geomview       Halfspace      facet_dump\n\
    - incidences     mathematica    normals        OFF_format     points\n\
    - summary\n\
    -\n\
    - Farea          FArea-total    Fcoplanars     FCentrums      Fd-cdd-in\n\
    - FD-cdd-out     FF-dump-xridge Finner         FIDs           Fmerges\n\
    - Fneighbors     FNeigh-vertex  Fouter         FOptions       Fpoint-intersect\n\
    - FPoint_near    FQhull         Fsummary       FSize          Ftriangles\n\
    - Fvertices      Fvoronoi       FVertex-ave    Fxtremes       FMaple\n\
    -\n\
    - Gvertices      Gpoints        Gall_points    Gno_planes     Ginner\n\
    - Gcentrums      Ghyperplanes   Gridges        Gouter         GDrop_dim\n\
    - Gtransparent\n\
    -\n\
    - PArea-keep     Pdrop d0:0D0   Pgood          PFacet_area_keep\n\
    - PGood_neighbors PMerge-keep   Poutput_forced Pprecision_not\n\
    -\n\
    - QbBound 0:0.5  Qbk:0Bk:0_drop QbB-scale-box  Qbb-scale-last Qcoplanar\n\
    - Qfurthest      Qgood_only     QGood_point    Qinterior      Qmax_out\n\
    - QJoggle        Qrandom        QRotate        Qsearch_1st    Qtriangulate\n\
    - QupperDelaunay QVertex_good   Qvneighbors    Qxact_merge    Qzinfinite\n\
    -\n\
    - Q0_no_premerge Q1_no_angle    Q2_no_independ Q3_no_redundant Q4_no_old\n\
    - Q5_no_check_out Q6_no_concave Q7_depth_first Q8_no_near_in  Q9_pick_furthest\n\
    - Q10_no_narrow  Q11_trinormals Q12_no_wide_dup\n\
    -\n\
    - T4_trace       Tannotate      Tcheck_often   Tstatistics    Tverify\n\
    - Tz_stdout      TFacet_log     TInput_file    TPoint_trace   TMerge_trace\n\
    - TOutput_file   TRerun         TWide_trace    TVertex_stop   TCone_stop\n\
    -\n\
    - Angle_max      Centrum_size   Error_round    Random_dist    Visible_min\n\
    - Ucoplanar_max  Wide_outside\n\
    -";
    -
    -/*---------------------------------
    -
    -  main( argc, argv )
    -    processes the command line, calls qhull() to do the work, and exits
    -
    -  design:
    -    initializes data structures
    -    reads points
    -    finishes initialization
    -    computes convex hull and other structures
    -    checks the result
    -    writes the output
    -    frees memory
    -*/
    -int main(int argc, char *argv[]) {
    -  int curlong, totlong; /* used !qh_NOmem */
    -  int exitcode, numpoints, dim;
    -  coordT *points;
    -  boolT ismalloc;
    -  qhT qh_qh;
    -  qhT *qh= &qh_qh;
    -
    -  QHULL_LIB_CHECK /* Check for compatible library */
    -
    -  if ((argc == 1) && isatty( 0 /*stdin*/)) {
    -    fprintf(stdout, qh_prompt2, qh_version);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) {
    -    fprintf(stdout, qh_prompta, qh_version, qh_DEFAULTbox,
    -                qh_promptb, qh_promptc, qh_promptd, qh_prompte);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '.' && !*(argv[1]+1)) {
    -    fprintf(stdout, qh_prompt3, qh_version);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '-' && *(argv[1]+1)=='V') {
    -      fprintf(stdout, "%s\n", qh_version2);
    -      exit(qh_ERRnone);
    -  }
    -  qh_init_A(qh, stdin, stdout, stderr, argc, argv);  /* sets qh->qhull_command */
    -  exitcode= setjmp(qh->errexit); /* simple statement for CRAY J916 */
    -  if (!exitcode) {
    -    qh->NOerrexit = False;
    -    qh_initflags(qh, qh->qhull_command);
    -    points= qh_readpoints(qh, &numpoints, &dim, &ismalloc);
    -    qh_init_B(qh, points, numpoints, dim, ismalloc);
    -    qh_qhull(qh);
    -    qh_check_output(qh);
    -    qh_produce_output(qh);
    -    if (qh->VERIFYoutput && !qh->FORCEoutput && !qh->STOPpoint && !qh->STOPcone)
    -      qh_check_points(qh);
    -    exitcode= qh_ERRnone;
    -  }
    -  qh->NOerrexit= True;  /* no more setjmp */
    -#ifdef qh_NOmem
    -  qh_freeqhull(qh, qh_ALL);
    -#else
    -  qh_freeqhull(qh, !qh_ALL);
    -  qh_memfreeshort(qh, &curlong, &totlong);
    -  if (curlong || totlong)
    -    qh_fprintf_stderr(6263, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
    -       totlong, curlong);
    -#endif
    -  return exitcode;
    -} /* main */
    -
    diff --git a/src/qhull/src/qhulltest/Coordinates_test.cpp b/src/qhull/src/qhulltest/Coordinates_test.cpp
    deleted file mode 100644
    index 3e8658a5bde..00000000000
    --- a/src/qhull/src/qhulltest/Coordinates_test.cpp
    +++ /dev/null
    @@ -1,539 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/Coordinates_test.cpp#2 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -//pre-compiled headers
    -#include 
    -#include "qhulltest/RoadTest.h" // QT_VERSION
    -
    -#include "libqhullcpp/Coordinates.h"
    -#include "libqhullcpp/QhullError.h"
    -#include "libqhullcpp/RboxPoints.h"
    -#include "libqhullcpp/Qhull.h"
    -
    -using std::cout;
    -using std::endl;
    -using std::ostringstream;
    -using std::ostream;
    -using std::string;
    -
    -namespace orgQhull {
    -
    -class Coordinates_test : public RoadTest
    -{
    -    Q_OBJECT
    -
    -#//!\name Test slots
    -private slots:
    -    void t_construct();
    -    void t_convert();
    -    void t_element();
    -    void t_readonly();
    -    void t_operator();
    -    void t_const_iterator();
    -    void t_iterator();
    -    void t_coord_iterator();
    -    void t_mutable_coord_iterator();
    -    void t_readwrite();
    -    void t_search();
    -    void t_io();
    -};//Coordinates_test
    -
    -void
    -add_Coordinates_test()
    -{
    -    new Coordinates_test();  // RoadTest::s_testcases
    -}
    -
    -void Coordinates_test::
    -t_construct()
    -{
    -    Coordinates c;
    -    QCOMPARE(c.size(), 0U);
    -    QVERIFY(c.isEmpty());
    -    c << 1.0;
    -    QCOMPARE(c.count(), 1);
    -    Coordinates c2(c);
    -    c2 << 2.0;
    -    QCOMPARE(c2.count(), 2);
    -    Coordinates c3;
    -    c3 = c2;
    -    QCOMPARE(c3.count(), 2);
    -    QCOMPARE(c3[0]+c3[1], 3.0);
    -    QVERIFY(c2==c3);
    -    std::vector vc;
    -    vc.push_back(3.0);
    -    vc.push_back(4.0);
    -    Coordinates c4(vc);
    -    QCOMPARE(c4[0]+c4[1], 7.0);
    -    Coordinates c5(c3);
    -    QVERIFY(c5==c3);
    -    c5= vc;
    -    QVERIFY(c5!=c3);
    -    QVERIFY(c5==c4);
    -}//t_construct
    -
    -void Coordinates_test::
    -t_convert()
    -{
    -    Coordinates c;
    -    c << 1.0 << 3.0;
    -    QCOMPARE(c.data()[1], 3.0);
    -    coordT *c2= c.data();
    -    const coordT *c3= c.data();
    -    QCOMPARE(c2, c3);
    -    std::vector vc= c.toStdVector();
    -    QCOMPARE((size_t)vc.size(), c.size());
    -    for(int k= (int)vc.size(); k--; ){
    -        QCOMPARE(vc[k], c[k]);
    -    }
    -    QList qc= c.toQList();
    -    QCOMPARE(qc.count(), c.count());
    -    for(int k= qc.count(); k--; ){
    -        QCOMPARE(qc[k], c[k]);
    -    }
    -    Coordinates c4;
    -    c4= std::vector(2, 0.0);
    -    QCOMPARE(c4.back(), 0.0);
    -    Coordinates c5(std::vector(2, 0.0));
    -    QCOMPARE(c4.size(), c5.size());
    -    QVERIFY(c4==c5);
    -}//t_convert
    -
    -void Coordinates_test::
    -t_element()
    -{
    -    Coordinates c;
    -    c << 1.0 << -2.0;
    -    c.at(1)= -3;
    -    QCOMPARE(c.at(1), -3.0);
    -    QCOMPARE(c.back(), -3.0);
    -    QCOMPARE(c.front(), 1.0);
    -    c[1]= -2.0;
    -    QCOMPARE(c[1],-2.0);
    -    QCOMPARE(c.first(), 1.0);
    -    c.first()= 2.0;
    -    QCOMPARE(c.first(), 2.0);
    -    QCOMPARE(c.last(), -2.0);
    -    c.last()= 0.0;
    -    QCOMPARE(c.first()+c.last(), 2.0);
    -    coordT *c4= &c.first();
    -    const coordT *c5= &c.first();
    -    QCOMPARE(c4, c5);
    -    coordT *c6= &c.last();
    -    const coordT *c7= &c.last();
    -    QCOMPARE(c6, c7);
    -    Coordinates c2= c.mid(1);
    -    QCOMPARE(c2.count(), 1);
    -    c << 3.0;
    -    Coordinates c3= c.mid(1,1);
    -    QCOMPARE(c2, c3);
    -    QCOMPARE(c3.value(-1, -1.0), -1.0);
    -    QCOMPARE(c3.value(3, 4.0), 4.0);
    -    QCOMPARE(c.value(2, 4.0), 3.0);
    -}//t_element
    -
    -void Coordinates_test::
    -t_readonly()
    -{
    -    Coordinates c;
    -    QCOMPARE(c.size(), 0u);
    -    QCOMPARE(c.count(), 0);
    -    QVERIFY(c.isEmpty());
    -    c << 1.0 << -2.0;
    -    QCOMPARE(c.size(), 2u);
    -    QCOMPARE(c.count(), 2);
    -    QVERIFY(!c.isEmpty());
    -}//t_readonly
    -
    -void Coordinates_test::
    -t_operator()
    -{
    -    Coordinates c;
    -    Coordinates c2(c);
    -    QVERIFY(c==c2);
    -    QVERIFY(!(c!=c2));
    -    c << 1.0;
    -    QVERIFY(!(c==c2));
    -    QVERIFY(c!=c2);
    -    c2 << 1.0;
    -    QVERIFY(c==c2);
    -    QVERIFY(!(c!=c2));
    -    c[0]= 0.0;
    -    QVERIFY(c!=c2);
    -    Coordinates c3= c+c2;
    -    QCOMPARE(c3.count(), 2);
    -    QCOMPARE(c3[0], 0.0);
    -    QCOMPARE(c3[1], 1.0);
    -    c3 += c3;
    -    QCOMPARE(c3.count(), 4);
    -    QCOMPARE(c3[2], 0.0);
    -    QCOMPARE(c3[3], 1.0);
    -    c3 += c2;
    -    QCOMPARE(c3[4], 1.0);
    -    c3 += 5.0;
    -    QCOMPARE(c3.count(), 6);
    -    QCOMPARE(c3[5], 5.0);
    -    // << checked above
    -}//t_operator
    -
    -void Coordinates_test::
    -t_const_iterator()
    -{
    -    Coordinates c;
    -    QCOMPARE(c.begin(), c.end());
    -    // begin and end checked elsewhere
    -    c << 1.0 << 3.0;
    -    Coordinates::const_iterator i= c.begin();
    -    QCOMPARE(*i, 1.0);
    -    QCOMPARE(i[1], 3.0);
    -    // i[1]= -3.0; // compiler error
    -    // operator-> is not applicable to double
    -    QCOMPARE(*i++, 1.0);
    -    QCOMPARE(*i, 3.0);
    -    QCOMPARE(*i--, 3.0);
    -    QCOMPARE(*i, 1.0);
    -    QCOMPARE(*(i+1), 3.0);
    -    QCOMPARE(*++i, 3.0);
    -    QCOMPARE(*(i-1), 1.0);
    -    QCOMPARE(*--i, 1.0);
    -    QVERIFY(i==c.begin());
    -    QVERIFY(i==c.constBegin());
    -    QVERIFY(i!=c.end());
    -    QVERIFY(i!=c.constEnd());
    -    QVERIFY(i=c.begin());
    -    QVERIFY(i+1<=c.end());
    -    QVERIFY(i+1>c.begin());
    -    Coordinates::iterator i2= c.begin();
    -    Coordinates::const_iterator i3(i2);
    -    QCOMPARE(*i3, 1.0);
    -    QCOMPARE(i3[1], 3.0);
    -}//t_const_iterator
    -
    -void Coordinates_test::
    -t_iterator()
    -{
    -    Coordinates c;
    -    QCOMPARE(c.begin(), c.end());
    -    // begin and end checked elsewhere
    -    c << 1.0 << 3.0;
    -    Coordinates::iterator i= c.begin();
    -    QCOMPARE(*i, 1.0);
    -    QCOMPARE(i[1], 3.0);
    -    *i= -1.0;
    -    QCOMPARE(*i, -1.0);
    -    i[1]= -3.0;
    -    QCOMPARE(i[1], -3.0);
    -    *i= 1.0;
    -    // operator-> is not applicable to double
    -    QCOMPARE(*i++, 1.0);
    -    QCOMPARE(*i, -3.0);
    -    *i= 3.0;
    -    QCOMPARE(*i--, 3.0);
    -    QCOMPARE(*i, 1.0);
    -    QCOMPARE(*(i+1), 3.0);
    -    QCOMPARE(*++i, 3.0);
    -    QCOMPARE(*(i-1), 1.0);
    -    QCOMPARE(*--i, 1.0);
    -    QVERIFY(i==c.begin());
    -    QVERIFY(i==c.constBegin());
    -    QVERIFY(i!=c.end());
    -    QVERIFY(i!=c.constEnd());
    -    QVERIFY(i=c.begin());
    -    QVERIFY(i+1<=c.end());
    -    QVERIFY(i+1>c.begin());
    -}//t_iterator
    -
    -void Coordinates_test::
    -t_coord_iterator()
    -{
    -    Coordinates c;
    -    c << 1.0 << 3.0;
    -    CoordinatesIterator i(c);
    -    CoordinatesIterator i2= c;
    -    QVERIFY(i.findNext(1.0));
    -    QVERIFY(!i.findNext(2.0));
    -    QVERIFY(!i.findNext(3.0));
    -    QVERIFY(i.findPrevious(3.0));
    -    QVERIFY(!i.findPrevious(2.0));
    -    QVERIFY(!i.findPrevious(1.0));
    -    QVERIFY(i2.findNext(3.0));
    -    QVERIFY(i2.findPrevious(3.0));
    -    QVERIFY(i2.findNext(3.0));
    -    QVERIFY(i2.findPrevious(1.0));
    -    QVERIFY(i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    QVERIFY(i.hasNext());
    -    QVERIFY(!i.hasPrevious());
    -    i.toBack();
    -    i2.toFront();
    -    QVERIFY(!i.hasNext());
    -    QVERIFY(i.hasPrevious());
    -    QVERIFY(i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    Coordinates c2;
    -    i2= c2;
    -    QVERIFY(!i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    i2.toBack();
    -    QVERIFY(!i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    QCOMPARE(i.peekPrevious(), 3.0);
    -    QCOMPARE(i.previous(), 3.0);
    -    QCOMPARE(i.previous(), 1.0);
    -    QVERIFY(!i.hasPrevious());
    -    QCOMPARE(i.peekNext(), 1.0);
    -    // i.peekNext()= 1.0; // compiler error
    -    QCOMPARE(i.next(), 1.0);
    -    QCOMPARE(i.peekNext(), 3.0);
    -    QCOMPARE(i.next(), 3.0);
    -    QVERIFY(!i.hasNext());
    -    i.toFront();
    -    QCOMPARE(i.next(), 1.0);
    -}//t_coord_iterator
    -
    -void Coordinates_test::
    -t_mutable_coord_iterator()
    -{
    -    // Same tests as CoordinatesIterator
    -    Coordinates c;
    -    c << 1.0 << 3.0;
    -    MutableCoordinatesIterator i(c);
    -    MutableCoordinatesIterator i2= c;
    -    QVERIFY(i.findNext(1.0));
    -    QVERIFY(!i.findNext(2.0));
    -    QVERIFY(!i.findNext(3.0));
    -    QVERIFY(i.findPrevious(3.0));
    -    QVERIFY(!i.findPrevious(2.0));
    -    QVERIFY(!i.findPrevious(1.0));
    -    QVERIFY(i2.findNext(3.0));
    -    QVERIFY(i2.findPrevious(3.0));
    -    QVERIFY(i2.findNext(3.0));
    -    QVERIFY(i2.findPrevious(1.0));
    -    QVERIFY(i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    QVERIFY(i.hasNext());
    -    QVERIFY(!i.hasPrevious());
    -    i.toBack();
    -    i2.toFront();
    -    QVERIFY(!i.hasNext());
    -    QVERIFY(i.hasPrevious());
    -    QVERIFY(i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    Coordinates c2;
    -    i2= c2;
    -    QVERIFY(!i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    i2.toBack();
    -    QVERIFY(!i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    QCOMPARE(i.peekPrevious(), 3.0);
    -    QCOMPARE(i.peekPrevious(), 3.0);
    -    QCOMPARE(i.previous(), 3.0);
    -    QCOMPARE(i.previous(), 1.0);
    -    QVERIFY(!i.hasPrevious());
    -    QCOMPARE(i.peekNext(), 1.0);
    -    QCOMPARE(i.next(), 1.0);
    -    QCOMPARE(i.peekNext(), 3.0);
    -    QCOMPARE(i.next(), 3.0);
    -    QVERIFY(!i.hasNext());
    -    i.toFront();
    -    QCOMPARE(i.next(), 1.0);
    -
    -    // Mutable tests
    -    i.toFront();
    -    i.peekNext()= -1.0;
    -    QCOMPARE(i.peekNext(), -1.0);
    -    QCOMPARE((i.next()= 1.0), 1.0);
    -    QCOMPARE(i.peekPrevious(), 1.0);
    -    i.remove();
    -    QCOMPARE(c.count(), 1);
    -    i.remove();
    -    QCOMPARE(c.count(), 1);
    -    QCOMPARE(i.peekNext(), 3.0);
    -    i.insert(1.0);
    -    i.insert(2.0);
    -    QCOMPARE(c.count(), 3);
    -    QCOMPARE(i.peekNext(), 3.0);
    -    QCOMPARE(i.peekPrevious(), 2.0);
    -    i.peekPrevious()= -2.0;
    -    QCOMPARE(i.peekPrevious(), -2.0);
    -    QCOMPARE((i.previous()= 2.0), 2.0);
    -    QCOMPARE(i.peekNext(), 2.0);
    -    i.toBack();
    -    i.remove();
    -    QCOMPARE(c.count(), 3); // unchanged
    -    i.toFront();
    -    i.remove();
    -    QCOMPARE(c.count(), 3); // unchanged
    -    QCOMPARE(i.peekNext(), 1.0);
    -    i.remove();
    -    QCOMPARE(c.count(), 3); // unchanged
    -    i.insert(0.0);
    -    QCOMPARE(c.count(), 4);
    -    QCOMPARE(i.value(), 0.0);
    -    QCOMPARE(i.peekPrevious(), 0.0);
    -    i.setValue(-10.0);
    -    QCOMPARE(c.count(), 4); // unchanged
    -    QCOMPARE(i.peekNext(), 1.0);
    -    QCOMPARE(i.peekPrevious(), -10.0);
    -    i.findNext(1.0);
    -    i.setValue(-1.0);
    -    QCOMPARE(i.peekPrevious(), -1.0);
    -    i.setValue(1.0);
    -    QCOMPARE(i.peekPrevious(), 1.0);
    -    QCOMPARE(i.value(), 1.0);
    -    i.findPrevious(1.0);
    -    i.setValue(-1.0);
    -    QCOMPARE(i.peekNext(), -1.0);
    -    i.toBack();
    -    QCOMPARE(i.previous(), 3.0);
    -    i.setValue(-3.0);
    -    QCOMPARE(i.peekNext(), -3.0);
    -    double d= i.value();
    -    QCOMPARE(d, -3.0);
    -    QCOMPARE(i.previous(), 2.0);
    -}//t_mutable_coord_iterator
    -
    -void Coordinates_test::
    -t_readwrite()
    -{
    -    Coordinates c;
    -    c.clear();
    -    QCOMPARE(c.count(), 0);
    -    c << 1.0 << 3.0;
    -    c.clear();
    -    QCOMPARE(c.count(), 0);
    -    coordT c2[4]= { 0.0, 1.0, 2.0, 3.0};
    -    c.append(4, c2);
    -    QCOMPARE(c.count(), 4);
    -    QCOMPARE(c[0], 0.0);
    -    QCOMPARE(c[1], 1.0);
    -    QCOMPARE(c[3], 3.0);
    -    c.clear();
    -    c << 1.0 << 3.0;
    -    c.erase(c.begin(), c.end());
    -    QCOMPARE(c.count(), 0);
    -    c << 1.0 << 0.0;
    -    Coordinates::iterator i= c.erase(c.begin());
    -    QCOMPARE(*i, 0.0);
    -    i= c.insert(c.end(), 1.0);
    -    QCOMPARE(*i, 1.0);
    -    QCOMPARE(c.count(), 2);
    -    c.pop_back();
    -    QCOMPARE(c.count(), 1);   // 0
    -    QCOMPARE(c[0], 0.0);
    -    c.push_back(2.0);
    -    QCOMPARE(c.count(), 2);
    -    c.append(3.0);
    -    QCOMPARE(c.count(), 3);   // 0, 2, 3
    -    QCOMPARE(c[2], 3.0);
    -    c.insert(0, 4.0);
    -    QCOMPARE(c[0], 4.0);
    -    QCOMPARE(c[3], 3.0);
    -    c.insert(c.count(), 5.0);
    -    QCOMPARE(c.count(), 5);   // 4, 0, 2, 3, 5
    -    QCOMPARE(c[4], 5.0);
    -    c.move(4, 0);
    -    QCOMPARE(c.count(), 5);   // 5, 4, 0, 2, 3
    -    QCOMPARE(c[0], 5.0);
    -    c.pop_front();
    -    QCOMPARE(c.count(), 4);
    -    QCOMPARE(c[0], 4.0);
    -    c.prepend(6.0);
    -    QCOMPARE(c.count(), 5);   // 6, 4, 0, 2, 3
    -    QCOMPARE(c[0], 6.0);
    -    c.push_front(7.0);
    -    QCOMPARE(c.count(), 6);
    -    QCOMPARE(c[0], 7.0);
    -    c.removeAt(1);
    -    QCOMPARE(c.count(), 5);   // 7, 4, 0, 2, 3
    -    QCOMPARE(c[1], 4.0);
    -    c.removeFirst();
    -    QCOMPARE(c.count(), 4);   // 4, 0, 2, 3
    -    QCOMPARE(c[0], 4.0);
    -    c.removeLast();
    -    QCOMPARE(c.count(), 3);
    -    QCOMPARE(c.last(), 2.0);
    -    c.replace(2, 8.0);
    -    QCOMPARE(c.count(), 3);   // 4, 0, 8
    -    QCOMPARE(c[2], 8.0);
    -    c.swap(0, 2);
    -    QCOMPARE(c[2], 4.0);
    -    double d= c.takeAt(2);
    -    QCOMPARE(c.count(), 2);   // 8, 0
    -    QCOMPARE(d, 4.0);
    -    double d2= c.takeFirst();
    -    QCOMPARE(c.count(), 1);   // 0
    -    QCOMPARE(d2, 8.0);
    -    double d3= c.takeLast();
    -    QVERIFY(c.isEmpty()); \
    -    QCOMPARE(d3, 0.0);
    -}//t_readwrite
    -
    -void Coordinates_test::
    -t_search()
    -{
    -    Coordinates c;
    -    c << 1.0 << 3.0 << 1.0;
    -    QVERIFY(c.contains(1.0));
    -    QVERIFY(c.contains(3.0));
    -    QVERIFY(!c.contains(0.0));
    -    QCOMPARE(c.count(1.0), 2);
    -    QCOMPARE(c.count(3.0), 1);
    -    QCOMPARE(c.count(0.0), 0);
    -    QCOMPARE(c.indexOf(1.0), 0);
    -    QCOMPARE(c.indexOf(3.0), 1);
    -    QCOMPARE(c.indexOf(1.0, -1), 2);
    -    QCOMPARE(c.indexOf(3.0, -1), -1);
    -    QCOMPARE(c.indexOf(3.0, -2), 1);
    -    QCOMPARE(c.indexOf(1.0, -3), 0);
    -    QCOMPARE(c.indexOf(1.0, -4), 0);
    -    QCOMPARE(c.indexOf(1.0, 1), 2);
    -    QCOMPARE(c.indexOf(3.0, 2), -1);
    -    QCOMPARE(c.indexOf(1.0, 2), 2);
    -    QCOMPARE(c.indexOf(1.0, 3), -1);
    -    QCOMPARE(c.indexOf(1.0, 4), -1);
    -    QCOMPARE(c.lastIndexOf(1.0), 2);
    -    QCOMPARE(c.lastIndexOf(3.0), 1);
    -    QCOMPARE(c.lastIndexOf(1.0, -1), 2);
    -    QCOMPARE(c.lastIndexOf(3.0, -1), 1);
    -    QCOMPARE(c.lastIndexOf(3.0, -2), 1);
    -    QCOMPARE(c.lastIndexOf(1.0, -3), 0);
    -    QCOMPARE(c.lastIndexOf(1.0, -4), -1);
    -    QCOMPARE(c.lastIndexOf(1.0, 1), 0);
    -    QCOMPARE(c.lastIndexOf(3.0, 2), 1);
    -    QCOMPARE(c.lastIndexOf(1.0, 2), 2);
    -    QCOMPARE(c.lastIndexOf(1.0, 3), 2);
    -    QCOMPARE(c.lastIndexOf(1.0, 4), 2);
    -    c.removeAll(3.0);
    -    QCOMPARE(c.count(), 2);
    -    c.removeAll(4.0);
    -    QCOMPARE(c.count(), 2);
    -    c.removeAll(1.0);
    -    QCOMPARE(c.count(), 0);
    -    c.removeAll(4.0);
    -    QCOMPARE(c.count(), 0);
    -}//t_search
    -
    -void Coordinates_test::
    -t_io()
    -{
    -    Coordinates c;
    -    c << 1.0 << 2.0 << 3.0;
    -    ostringstream os;
    -    os << "Coordinates 1-2-3\n" << c;
    -    cout << os.str();
    -    QString s= QString::fromStdString(os.str());
    -    QCOMPARE(s.count("2"), 2);
    -}//t_io
    -
    -}//orgQhull
    -
    -#include "moc/Coordinates_test.moc"
    diff --git a/src/qhull/src/qhulltest/PointCoordinates_test.cpp b/src/qhull/src/qhulltest/PointCoordinates_test.cpp
    deleted file mode 100644
    index 09285954dff..00000000000
    --- a/src/qhull/src/qhulltest/PointCoordinates_test.cpp
    +++ /dev/null
    @@ -1,478 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/PointCoordinates_test.cpp#2 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -//pre-compiled headers
    -#include 
    -#include "qhulltest/RoadTest.h" // QT_VERSION
    -
    -#include "libqhullcpp/PointCoordinates.h"
    -#include "libqhullcpp/QhullError.h"
    -#include "libqhullcpp/RboxPoints.h"
    -#include "libqhullcpp/Qhull.h"
    -
    -using std::cout;
    -using std::endl;
    -using std::ostringstream;
    -using std::ostream;
    -using std::string;
    -using std::stringstream;
    -
    -namespace orgQhull {
    -
    -class PointCoordinates_test : public RoadTest
    -{
    -    Q_OBJECT
    -
    -#//!\name Test slots
    -private slots:
    -    void t_construct_q();
    -    void t_construct_qh();
    -    void t_convert();
    -    void t_getset();
    -    void t_element();
    -    void t_foreach();
    -    void t_search();
    -    void t_modify();
    -    void t_append_points();
    -    void t_coord_iterator();
    -    void t_io();
    -};//PointCoordinates_test
    -
    -void
    -add_PointCoordinates_test()
    -{
    -    new PointCoordinates_test();  // RoadTest::s_testcases
    -}
    -
    -void PointCoordinates_test::
    -t_construct_q()
    -{
    -    Qhull q;
    -    PointCoordinates pc(q);
    -    QCOMPARE(pc.size(), 0U);
    -    QCOMPARE(pc.coordinateCount(), 0);
    -    QCOMPARE(pc.dimension(), 0);
    -    QCOMPARE(pc.coordinates(), (coordT *)0);
    -    QVERIFY(pc.isEmpty());
    -    pc.checkValid();
    -    PointCoordinates pc7(q, 2, "test explicit dimension");
    -    QCOMPARE(pc7.dimension(), 2);
    -    QCOMPARE(pc7.count(), 0);
    -    QVERIFY(pc7.isEmpty());
    -    QCOMPARE(pc7.comment(), std::string("test explicit dimension"));
    -    pc7.checkValid();
    -    PointCoordinates pc2(q, "Test pc2");
    -    QCOMPARE(pc2.count(), 0);
    -    QVERIFY(pc2.isEmpty());
    -    QCOMPARE(pc2.comment(), std::string("Test pc2"));
    -    pc2.checkValid();
    -    PointCoordinates pc3(q, 3, "Test 3-d pc3");
    -    QCOMPARE(pc3.dimension(), 3);
    -    QVERIFY(pc3.isEmpty());
    -    pc3.checkValid();
    -    coordT c[]= { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 };
    -    PointCoordinates pc4(q, 2, "Test 2-d pc4", 6, c);
    -    QCOMPARE(pc4.dimension(), 2);
    -    QCOMPARE(pc4.count(), 3);
    -    QCOMPARE(pc4.size(), 3u);
    -    QVERIFY(!pc4.isEmpty());
    -    pc4.checkValid();
    -    QhullPoint p= pc4[2];
    -    QCOMPARE(p[1], 5.0);
    -    // QhullPoint refers to PointCoordinates
    -    p[1] += 1.0;
    -    QCOMPARE(pc4[2][1], 6.0);
    -    PointCoordinates pc5(q, 4, "Test 4-d pc5 with insufficient coordinates", 6, c);
    -    QCOMPARE(pc5.dimension(), 4);
    -    QCOMPARE(pc5.count(), 1);
    -    QCOMPARE(pc5.extraCoordinatesCount(), 2);
    -    QCOMPARE(pc5.extraCoordinates()[1], 5.0);
    -    QVERIFY(!pc5.isEmpty());;
    -    std::vector vc;
    -    vc.push_back(3.0);
    -    vc.push_back(4.0);
    -    vc.push_back(5.0);
    -    vc.push_back(6.0);
    -    vc.push_back(7.0);
    -    vc.push_back(9.0);
    -    pc5.append(2, &vc[3]); // Copy of vc[]
    -    pc5.checkValid();
    -    QhullPoint p5(q, 4, &vc[1]);
    -    QCOMPARE(pc5[1], p5);
    -    PointCoordinates pc6(pc5); // Makes copy of point_coordinates
    -    QCOMPARE(pc6[1], p5);
    -    QVERIFY(pc6==pc5);
    -    QhullPoint p6= pc5[1];  // Refers to pc5.coordinates
    -    pc5[1][0] += 1.0;
    -    QCOMPARE(pc5[1], p6);
    -    QVERIFY(pc5[1]!=p5);
    -    QVERIFY(pc6!=pc5);
    -    pc6= pc5;
    -    QVERIFY(pc6==pc5);
    -    PointCoordinates pc8(q);
    -    pc6= pc8;
    -    QVERIFY(pc6!=pc5);
    -    QVERIFY(pc6.isEmpty());
    -}//t_construct_q
    -
    -void PointCoordinates_test::
    -t_construct_qh()
    -{
    -    QhullQh qh;
    -    PointCoordinates pc(&qh);
    -    QCOMPARE(pc.size(), 0U);
    -    QCOMPARE(pc.coordinateCount(), 0);
    -    QCOMPARE(pc.dimension(), 0);
    -    QCOMPARE(pc.coordinates(), (coordT *)0);
    -    QVERIFY(pc.isEmpty());
    -    pc.checkValid();
    -    PointCoordinates pc7(&qh, 2, "test explicit dimension");
    -    QCOMPARE(pc7.dimension(), 2);
    -    QCOMPARE(pc7.count(), 0);
    -    QVERIFY(pc7.isEmpty());
    -    QCOMPARE(pc7.comment(), std::string("test explicit dimension"));
    -    pc7.checkValid();
    -    PointCoordinates pc2(&qh, "Test pc2");
    -    QCOMPARE(pc2.count(), 0);
    -    QVERIFY(pc2.isEmpty());
    -    QCOMPARE(pc2.comment(), std::string("Test pc2"));
    -    pc2.checkValid();
    -    PointCoordinates pc3(&qh, 3, "Test 3-d pc3");
    -    QCOMPARE(pc3.dimension(), 3);
    -    QVERIFY(pc3.isEmpty());
    -    pc3.checkValid();
    -    coordT c[]= { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 };
    -    PointCoordinates pc4(&qh, 2, "Test 2-d pc4", 6, c);
    -    QCOMPARE(pc4.dimension(), 2);
    -    QCOMPARE(pc4.count(), 3);
    -    QCOMPARE(pc4.size(), 3u);
    -    QVERIFY(!pc4.isEmpty());
    -    pc4.checkValid();
    -    QhullPoint p= pc4[2];
    -    QCOMPARE(p[1], 5.0);
    -    // QhullPoint refers to PointCoordinates
    -    p[1] += 1.0;
    -    QCOMPARE(pc4[2][1], 6.0);
    -    PointCoordinates pc5(&qh, 4, "Test 4-d pc5 with insufficient coordinates", 6, c);
    -    QCOMPARE(pc5.dimension(), 4);
    -    QCOMPARE(pc5.count(), 1);
    -    QCOMPARE(pc5.extraCoordinatesCount(), 2);
    -    QCOMPARE(pc5.extraCoordinates()[1], 5.0);
    -    QVERIFY(!pc5.isEmpty());;
    -    std::vector vc;
    -    vc.push_back(3.0);
    -    vc.push_back(4.0);
    -    vc.push_back(5.0);
    -    vc.push_back(6.0);
    -    vc.push_back(7.0);
    -    vc.push_back(9.0);
    -    pc5.append(2, &vc[3]); // Copy of vc[]
    -    pc5.checkValid();
    -    QhullPoint p5(&qh, 4, &vc[1]);
    -    QCOMPARE(pc5[1], p5);
    -    PointCoordinates pc6(pc5); // Makes copy of point_coordinates
    -    QCOMPARE(pc6[1], p5);
    -    QVERIFY(pc6==pc5);
    -    QhullPoint p6= pc5[1];  // Refers to pc5.coordinates
    -    pc5[1][0] += 1.0;
    -    QCOMPARE(pc5[1], p6);
    -    QVERIFY(pc5[1]!=p5);
    -    QVERIFY(pc6!=pc5);
    -    pc6= pc5;
    -    QVERIFY(pc6==pc5);
    -    PointCoordinates pc8(&qh);
    -    pc6= pc8;
    -    QVERIFY(pc6!=pc5);
    -    QVERIFY(pc6.isEmpty());
    -}//t_construct_qh
    -
    -void PointCoordinates_test::
    -t_convert()
    -{
    -    Qhull q;
    -    //defineAs tested above
    -    coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
    -    PointCoordinates ps(q, 3, "two 3-d points", 6, c);
    -    QCOMPARE(ps.dimension(), 3);
    -    QCOMPARE(ps.size(), 2u);
    -    const coordT *c2= ps.constData();
    -    QVERIFY(c!=c2);
    -    QCOMPARE(c[0], c2[0]);
    -    const coordT *c3= ps.data();
    -    QCOMPARE(c3, c2);
    -    coordT *c4= ps.data();
    -    QCOMPARE(c4, c2);
    -    std::vector vs= ps.toStdVector();
    -    QCOMPARE(vs.size(), 6u);
    -    QCOMPARE(vs[5], 5.0);
    -    QList qs= ps.toQList();
    -    QCOMPARE(qs.size(), 6);
    -    QCOMPARE(qs[5], 5.0);
    -}//t_convert
    -
    -void PointCoordinates_test::
    -t_getset()
    -{
    -    // See t_construct() for test of coordinates, coordinateCount, dimension, empty, isEmpty, ==, !=
    -    // See t_construct() for test of checkValid, comment, setDimension
    -    Qhull q;
    -    PointCoordinates pc(q, "Coordinates c");
    -    pc.setComment("New comment");
    -    QCOMPARE(pc.comment(), std::string("New comment"));
    -    pc.checkValid();
    -    pc.makeValid();  // A no-op
    -    pc.checkValid();
    -    Coordinates cs= pc.getCoordinates();
    -    QVERIFY(cs.isEmpty());
    -    PointCoordinates pc2(pc);
    -    pc.setDimension(3);
    -    QVERIFY(pc2!=pc);
    -    coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
    -    pc.append(6, c);
    -    pc.checkValid();
    -    pc.makeValid();  // A no-op
    -    QhullPoint p= pc[0];
    -    QCOMPARE(p[2], 2.0);
    -    try{
    -        pc.setDimension(2);
    -        QFAIL("setDimension(2) did not fail for 3-d.");
    -    }catch (const std::exception &e) {
    -        const char *s= e.what();
    -        cout << "INFO   : Caught " << s;
    -    }
    -}//t_getset
    -
    -void PointCoordinates_test::
    -t_element()
    -{
    -    Qhull q;
    -    coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
    -    PointCoordinates pc(q, 2, "2-d points", 6, c);
    -    QhullPoint p= pc.at(0);
    -    QCOMPARE(p, pc[0]);
    -    QCOMPARE(p, pc.first());
    -    QCOMPARE(p, pc.value(0));
    -    p= pc.back();
    -    QCOMPARE(p, pc[2]);
    -    QCOMPARE(p, pc.last());
    -    QCOMPARE(p, pc.value(2));
    -    QhullPoints ps= pc.mid(1, 2);
    -    QCOMPARE(ps[1], p);
    -}//t_element
    -
    -void PointCoordinates_test::
    -t_foreach()
    -{
    -    Qhull q;
    -    coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
    -    PointCoordinates pc(q, 2, "2-d points", 6, c);
    -    QhullPoints::Iterator i= pc.begin();
    -    QhullPoint p= pc[0];
    -    QCOMPARE(*i, p);
    -    QCOMPARE((*i)[0], 0.0);
    -    QhullPoint p3= pc[2];
    -    i= pc.end();
    -    QCOMPARE(i[-1], p3);
    -    const PointCoordinates pc2(q, 2, "2-d points", 6, c);
    -    QhullPoints::ConstIterator i2= pc.begin();
    -    const QhullPoint p0= pc2[0];
    -    QCOMPARE(*i2, p0);
    -    QCOMPARE((*i2)[0], 0.0);
    -    QhullPoints::ConstIterator i3= i2;
    -    QCOMPARE(i3, i2);
    -    QCOMPARE((*i3)[0], 0.0);
    -    i3= pc.constEnd();
    -    --i3;
    -    QhullPoint p2= pc2[2];
    -    QCOMPARE(*i3, p2);
    -    i= pc.end();
    -    QVERIFY(i-1==i3);
    -    i2= pc2.end();
    -    QVERIFY(i2-1!=i3);
    -    QCOMPARE(*(i2-1), *i3);
    -    foreach(QhullPoint p3, pc){ //Qt only
    -        QVERIFY(p3[0]>=0.0);
    -        QVERIFY(p3[0]<=5.0);
    -    }
    -    Coordinates::ConstIterator i4= pc.beginCoordinates();
    -    QCOMPARE(*i4, 0.0);
    -    Coordinates::Iterator i5= pc.beginCoordinates();
    -    QCOMPARE(*i5, 0.0);
    -    i4= pc.beginCoordinates(1);
    -    QCOMPARE(*i4, 2.0);
    -    i5= pc.beginCoordinates(1);
    -    QCOMPARE(*i5, 2.0);
    -    i4= pc.endCoordinates();
    -    QCOMPARE(*--i4, 5.0);
    -    i5= pc.endCoordinates();
    -    QCOMPARE(*--i5, 5.0);
    -}//t_foreach
    -
    -void PointCoordinates_test::
    -t_search()
    -{
    -    Qhull q;
    -    coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
    -    PointCoordinates pc(q, 2, "2-d points", 6, c);
    -    QhullPoint p0= pc[0];
    -    QhullPoint p2= pc[2];
    -    QVERIFY(pc.contains(p0));
    -    QVERIFY(pc.contains(p2));
    -    QCOMPARE(pc.count(p0), 1);
    -    QCOMPARE(pc.indexOf(p2), 2);
    -    QCOMPARE(pc.lastIndexOf(p0), 0);
    -}//t_search
    -
    -void PointCoordinates_test::
    -t_modify()
    -{
    -    Qhull q;
    -    coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
    -    PointCoordinates pc(q, 2, "2-d points", 6, c);
    -    coordT c3[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
    -    PointCoordinates pc5(q, 2, "test explicit dimension");
    -    pc5.append(6, c3); // 0-5
    -    QVERIFY(pc5==pc);
    -    PointCoordinates pc2(q, 2, "2-d");
    -    coordT c2[]= {6.0, 7.0, 8.0, 9.0, 10.0, 11.0};
    -    pc2.append(6, c2);
    -    QCOMPARE(pc2.count(), 3);
    -    pc2.append(14.0);
    -    QCOMPARE(pc2.count(), 3);
    -    QCOMPARE(pc2.extraCoordinatesCount(), 1);
    -    pc2.append(15.0); // 6-11, 14,15
    -    QCOMPARE(pc2.count(), 4);
    -    QCOMPARE(pc2.extraCoordinatesCount(), 0);
    -    QhullPoint p(pc[0]);
    -    pc2.append(p); // 6-11, 14,15, 0,1
    -    QCOMPARE(pc2.count(), 5);
    -    QCOMPARE(pc2.extraCoordinatesCount(), 0);
    -    QCOMPARE(pc2.lastIndexOf(p), 4);
    -    pc.append(pc2); // Invalidates p
    -    QCOMPARE(pc.count(), 8); // 0-11, 14,15, 0,1
    -    QCOMPARE(pc.extraCoordinatesCount(), 0);
    -    QCOMPARE(pc.lastIndexOf(pc[0]), 7);
    -    pc.appendComment(" operators");
    -    QCOMPARE(pc.comment(), std::string("2-d points operators"));
    -    pc.checkValid();
    -    // see t_append_points for appendPoints
    -    PointCoordinates pc3= pc+pc2;
    -    pc3.checkValid();
    -    QCOMPARE(pc3.count(), 13);
    -    QCOMPARE(pc3[6][0], 14.0);
    -    QCOMPARE(pc3[8][0], 6.0);
    -    pc3 += pc;
    -    QCOMPARE(pc3.count(), 21);
    -    QCOMPARE(pc3[14][0], 2.0);
    -    pc3 += 12.0;
    -    pc3 += 14.0;
    -    QCOMPARE(pc3.count(), 22);
    -    QCOMPARE(pc3.last()[0], 12.0);
    -    // QhullPoint p3= pc3.first(); // += throws error because append may move the data
    -    QhullPoint p3= pc2.first();
    -    pc3 += p3;
    -    QCOMPARE(pc3.count(), 23);
    -    QCOMPARE(pc3.last()[0], 6.0);
    -    pc3 << pc;
    -    QCOMPARE(pc3.count(), 31);
    -    QCOMPARE(pc3.last()[0], 0.0);
    -    pc3 << 12.0 << 14.0;
    -    QCOMPARE(pc3.count(), 32);
    -    QCOMPARE(pc3.last()[0], 12.0);
    -    PointCoordinates pc4(pc3);
    -    pc4.reserveCoordinates(100);
    -    QVERIFY(pc3==pc4);
    -}//t_modify
    -
    -void PointCoordinates_test::
    -t_append_points()
    -{
    -    Qhull q;
    -    PointCoordinates pc(q, 2, "stringstream");
    -    stringstream s("2 3 1 2 3 4 5 6");
    -    pc.appendPoints(s);
    -    QCOMPARE(pc.count(), 3);
    -}//t_append_points
    -
    -void PointCoordinates_test::
    -t_coord_iterator()
    -{
    -    Qhull q;
    -    PointCoordinates c(q, 2, "2-d");
    -    c << 0.0 << 1.0 << 2.0 << 3.0 << 4.0 << 5.0;
    -    PointCoordinatesIterator i(c);
    -    QhullPoint p0(c[0]);
    -    QhullPoint p1(c[1]);
    -    QhullPoint p2(c[2]);
    -    coordT c2[] = {-1.0, -2.0};
    -    QhullPoint p3(q, 2, c2);
    -    PointCoordinatesIterator i2= c;
    -    QVERIFY(i.findNext(p1));
    -    QVERIFY(!i.findNext(p1));
    -    QVERIFY(!i.findNext(p2));
    -    QVERIFY(!i.findNext(p3));
    -    QVERIFY(i.findPrevious(p2));
    -    QVERIFY(!i.findPrevious(p2));
    -    QVERIFY(!i.findPrevious(p0));
    -    QVERIFY(!i.findPrevious(p3));
    -    QVERIFY(i2.findNext(p2));
    -    QVERIFY(i2.findPrevious(p0));
    -    QVERIFY(i2.findNext(p1));
    -    QVERIFY(i2.findPrevious(p0));
    -    QVERIFY(i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    QVERIFY(i.hasNext());
    -    QVERIFY(!i.hasPrevious());
    -    i.toBack();
    -    i2.toFront();
    -    QVERIFY(!i.hasNext());
    -    QVERIFY(i.hasPrevious());
    -    QVERIFY(i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    PointCoordinates c3(q);
    -    PointCoordinatesIterator i3= c3;
    -    QVERIFY(!i3.hasNext());
    -    QVERIFY(!i3.hasPrevious());
    -    i3.toBack();
    -    QVERIFY(!i3.hasNext());
    -    QVERIFY(!i3.hasPrevious());
    -    QCOMPARE(i.peekPrevious(), p2);
    -    QCOMPARE(i.previous(), p2);
    -    QCOMPARE(i.previous(), p1);
    -    QCOMPARE(i.previous(), p0);
    -    QVERIFY(!i.hasPrevious());
    -    QCOMPARE(i.peekNext(), p0);
    -    // i.peekNext()= 1.0; // compiler error
    -    QCOMPARE(i.next(), p0);
    -    QCOMPARE(i.peekNext(), p1);
    -    QCOMPARE(i.next(), p1);
    -    QCOMPARE(i.next(), p2);
    -    QVERIFY(!i.hasNext());
    -    i.toFront();
    -    QCOMPARE(i.next(), p0);
    -}//t_coord_iterator
    -
    -void PointCoordinates_test::
    -t_io()
    -{
    -    Qhull q;
    -    PointCoordinates c(q);
    -    ostringstream os;
    -    os << "PointCoordinates 0-d\n" << c;
    -    c.setDimension(2);
    -    c << 1.0 << 2.0 << 3.0 << 1.0 << 2.0 << 3.0;
    -    os << "PointCoordinates 1,2 3,1 2,3\n" << c;
    -    cout << os.str();
    -    QString s= QString::fromStdString(os.str());
    -    QCOMPARE(s.count("0"), 3);
    -    QCOMPARE(s.count("2"), 5);
    -}//t_io
    -
    -}//orgQhull
    -
    -#include "moc/PointCoordinates_test.moc"
    diff --git a/src/qhull/src/qhulltest/QhullFacetList_test.cpp b/src/qhull/src/qhulltest/QhullFacetList_test.cpp
    deleted file mode 100644
    index 5a09d01da96..00000000000
    --- a/src/qhull/src/qhulltest/QhullFacetList_test.cpp
    +++ /dev/null
    @@ -1,196 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/QhullFacetList_test.cpp#3 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -//pre-compiled headers
    -#include 
    -#include "qhulltest/RoadTest.h" // QT_VERSION
    -
    -#include "libqhullcpp/QhullFacetList.h"
    -#include "libqhullcpp/QhullError.h"
    -#include "libqhullcpp/QhullFacet.h"
    -#include "libqhullcpp/QhullVertex.h"
    -#include "libqhullcpp/QhullVertexSet.h"
    -#include "libqhullcpp/Qhull.h"
    -#include "libqhullcpp/RboxPoints.h"
    -
    -using std::cout;
    -using std::endl;
    -using std::ostringstream;
    -using std::ostream;
    -using std::string;
    -
    -namespace orgQhull {
    -
    -class QhullFacetList_test : public RoadTest
    -{
    -    Q_OBJECT
    -
    -#//!\name Test slots
    -private slots:
    -    void cleanup();
    -    void t_construct_qh();
    -    void t_construct_q();
    -    void t_convert();
    -    void t_readonly();
    -    void t_foreach();
    -    void t_io();
    -};//QhullFacetList_test
    -
    -void
    -add_QhullFacetList_test()
    -{
    -    new QhullFacetList_test();  // RoadTest::s_testcases
    -}
    -
    -//Executed after each testcase
    -void QhullFacetList_test::
    -cleanup()
    -{
    -    RoadTest::cleanup();
    -}
    -
    -void QhullFacetList_test::
    -t_construct_qh()
    -{
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"QR0");  // rotated unit cube
    -    QhullFacetList fs2= q.facetList();
    -    QVERIFY(!fs2.isEmpty());
    -    QCOMPARE(fs2.count(),6);
    -    QhullFacetList fs3(q.endFacet(), q.endFacet());
    -    QVERIFY(fs3.isEmpty());
    -    QhullFacetList fs4(q.endFacet().previous(), q.endFacet());
    -    QCOMPARE(fs4.count(), 1);
    -    QhullFacetList fs5(q.beginFacet(), q.endFacet());
    -    QCOMPARE(fs2.count(), fs5.count());
    -    QVERIFY(fs2==fs5);
    -    QhullFacetList fs6= fs2; // copy constructor
    -    QVERIFY(fs6==fs2);
    -    std::vector fv= fs2.toStdVector();
    -    QCOMPARE(fv.size(), 6u);
    -}//t_construct_qh
    -
    -void QhullFacetList_test::
    -t_construct_q()
    -{
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"QR0");  // rotated unit cube
    -    QhullFacetList fs2= q.facetList();
    -    QVERIFY(!fs2.isEmpty());
    -    QCOMPARE(fs2.count(),6);
    -    QhullFacetList fs3(q.endFacet(), q.endFacet());
    -    QVERIFY(fs3.isEmpty());
    -    QhullFacetList fs4(q.endFacet().previous(), q.endFacet());
    -    QCOMPARE(fs4.count(), 1);
    -    QhullFacetList fs5(q.beginFacet(), q.endFacet());
    -    QCOMPARE(fs2.count(), fs5.count());
    -    QVERIFY(fs2==fs5);
    -    QhullFacetList fs6= fs2; // copy constructor
    -    QVERIFY(fs6==fs2);
    -    std::vector fv= fs2.toStdVector();
    -    QCOMPARE(fv.size(), 6u);
    -}//t_construct_q
    -
    -void QhullFacetList_test::
    -t_convert()
    -{
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"QR0 QV2");  // rotated unit cube
    -    QhullFacetList fs2= q.facetList();
    -    QVERIFY(!fs2.isSelectAll());
    -    QVERIFY(!fs2.isEmpty());
    -    QCOMPARE(fs2.count(),3);
    -    std::vector fv= fs2.toStdVector();
    -    QCOMPARE(fv.size(), 3u);
    -    QList fv2= fs2.toQList();
    -    QCOMPARE(fv2.size(), 3);
    -    std::vector fv5= fs2.vertices_toStdVector();
    -    QCOMPARE(fv5.size(), 7u);
    -    QList fv6= fs2.vertices_toQList();
    -    QCOMPARE(fv6.size(), 7);
    -    fs2.selectAll();
    -    QVERIFY(fs2.isSelectAll());
    -    std::vector fv3= fs2.toStdVector();
    -    QCOMPARE(fv3.size(), 6u);
    -    QList fv4= fs2.toQList();
    -    QCOMPARE(fv4.size(), 6);
    -    std::vector fv7= fs2.vertices_toStdVector();
    -    QCOMPARE(fv7.size(), 8u);
    -    QList fv8= fs2.vertices_toQList();
    -    QCOMPARE(fv8.size(), 8);
    -}//t_convert
    -
    -//! Spot check properties and read-only.  See QhullLinkedList_test
    -void QhullFacetList_test::
    -t_readonly()
    -{
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"QV0");  // good facets are adjacent to point 0
    -    QhullFacetList fs= q.facetList();
    -    QVERIFY(!fs.isSelectAll());
    -    QCOMPARE(fs.count(), 3);
    -    QCOMPARE(fs.first(), q.firstFacet());
    -    fs.selectAll();
    -    QVERIFY(fs.isSelectAll());
    -    QCOMPARE(fs.count(), 6);
    -    fs.selectGood();
    -    QVERIFY(!fs.isSelectAll());
    -    QCOMPARE(fs.count(), 3);
    -    fs.selectAll();
    -    QVERIFY(fs.isSelectAll());
    -    QCOMPARE(fs.count(), 6);
    -    QhullFacet f= fs.first();
    -    QhullFacet f2= fs.last();
    -    fs.selectAll();
    -    QVERIFY(fs.contains(f));
    -    QVERIFY(fs.contains(f2));
    -    QVERIFY(f.isGood());
    -    QVERIFY(!f2.isGood());
    -    fs.selectGood();
    -    QVERIFY(fs.contains(f));
    -    QVERIFY(!fs.contains(f2));
    -}//t_readonly
    -
    -void QhullFacetList_test::
    -t_foreach()
    -{
    -    RboxPoints rcube("c");
    -    // Spot check predicates and accessors.  See QhullLinkedList_test
    -    Qhull q(rcube,"Qt QR0");  // triangulation of rotated unit cube
    -    QhullFacetList fs= q.facetList();
    -    QVERIFY(fs.contains(q.firstFacet()));
    -    QhullFacet f= q.firstFacet().next();
    -    QVERIFY(fs.contains(f));
    -    QCOMPARE(fs.first(), *fs.begin());
    -    QCOMPARE(*(fs.end()-1), fs.last());
    -    QCOMPARE(fs.first(), q.firstFacet());
    -    QCOMPARE(*fs.begin(), q.beginFacet());
    -    QCOMPARE(*fs.end(), q.endFacet());
    -}//t_foreach
    -
    -void QhullFacetList_test::
    -t_io()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube,"QR0 QV0");   // good facets are adjacent to point 0
    -        QhullFacetList fs= q.facetList();
    -        ostringstream os;
    -        os << fs.print("Show all of FacetList\n");
    -        os << "\nFacets only\n" << fs;
    -        os << "\nVertices only\n" << fs.printVertices();
    -        cout << os.str();
    -        QString facets= QString::fromStdString(os.str());
    -        QCOMPARE(facets.count("(v"), 2*7+12*3*2);
    -        QCOMPARE(facets.count(QRegExp("f\\d")), 2*3*7 + 13*3*2);
    -    }
    -}//t_io
    -
    -}//orgQhull
    -
    -#include "moc/QhullFacetList_test.moc"
    diff --git a/src/qhull/src/qhulltest/QhullFacetSet_test.cpp b/src/qhull/src/qhulltest/QhullFacetSet_test.cpp
    deleted file mode 100644
    index a7fe123a28f..00000000000
    --- a/src/qhull/src/qhulltest/QhullFacetSet_test.cpp
    +++ /dev/null
    @@ -1,153 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/QhullFacetSet_test.cpp#3 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -//pre-compiled headers
    -#include 
    -#include "qhulltest/RoadTest.h" // QT_VERSION
    -
    -#include "libqhullcpp/QhullFacetSet.h"
    -#include "libqhullcpp/QhullError.h"
    -#include "libqhullcpp/QhullFacet.h"
    -#include "libqhullcpp/Qhull.h"
    -#include "libqhullcpp/RboxPoints.h"
    -
    -using std::cout;
    -using std::endl;
    -using std::ostringstream;
    -using std::ostream;
    -using std::string;
    -
    -namespace orgQhull {
    -
    -class QhullFacetSet_test : public RoadTest
    -{
    -    Q_OBJECT
    -
    -#//!\name Test slots
    -private slots:
    -    void cleanup();
    -    void t_construct();
    -    void t_convert();
    -    void t_readonly();
    -    void t_foreach();
    -    void t_io();
    -};//QhullFacetSet_test
    -
    -void
    -add_QhullFacetSet_test()
    -{
    -    new QhullFacetSet_test();  // RoadTest::s_testcases
    -}
    -
    -//Executed after each testcase
    -void QhullFacetSet_test::
    -cleanup()
    -{
    -    RoadTest::cleanup();
    -}
    -
    -void QhullFacetSet_test::
    -t_construct()
    -{
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"QR0");  // rotated unit cube
    -    QhullFacet f= q.firstFacet();
    -    QhullFacetSet fs2= f.neighborFacets();
    -    QVERIFY(!fs2.isEmpty());
    -    QCOMPARE(fs2.count(),4);
    -    QhullFacetSet fs4= fs2; // copy constructor
    -    QVERIFY(fs4==fs2);
    -    QhullFacetSet fs3(q, q.qh()->facet_mergeset);
    -    QVERIFY(fs3.isEmpty());
    -}//t_construct
    -
    -void QhullFacetSet_test::
    -t_convert()
    -{
    -    RboxPoints rcube("c");
    -    Qhull q2(rcube,"QR0 QV2");  // rotated unit cube
    -    QhullFacet f2= q2.firstFacet();
    -    QhullFacetSet fs2= f2.neighborFacets();
    -    QVERIFY(!fs2.isSelectAll());
    -    QCOMPARE(fs2.count(),2);
    -    std::vector fv= fs2.toStdVector();
    -    QCOMPARE(fv.size(), 2u);
    -    QList fv2= fs2.toQList();
    -    QCOMPARE(fv2.size(), 2);
    -    fs2.selectAll();
    -    QVERIFY(fs2.isSelectAll());
    -    std::vector fv3= fs2.toStdVector();
    -    QCOMPARE(fv3.size(), 4u);
    -    QList fv4= fs2.toQList();
    -    QCOMPARE(fv4.size(), 4);
    -}//t_convert
    -
    -//! Spot check properties and read-only.  See QhullSet_test
    -void QhullFacetSet_test::
    -t_readonly()
    -{
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"QV0");  // good facets are adjacent to point 0
    -    QhullFacetSet fs= q.firstFacet().neighborFacets();
    -    QVERIFY(!fs.isSelectAll());
    -    QCOMPARE(fs.count(), 2);
    -    fs.selectAll();
    -    QVERIFY(fs.isSelectAll());
    -    QCOMPARE(fs.count(), 4);
    -    fs.selectGood();
    -    QVERIFY(!fs.isSelectAll());
    -    QCOMPARE(fs.count(), 2);
    -    QhullFacet f= fs.first();
    -    QhullFacet f2= fs.last();
    -    fs.selectAll();
    -    QVERIFY(fs.contains(f));
    -    QVERIFY(fs.contains(f2));
    -    QVERIFY(f.isGood());
    -    QVERIFY(!f2.isGood());
    -    fs.selectGood();
    -    QVERIFY(fs.contains(f));
    -    QVERIFY(!fs.contains(f2));
    -}//t_readonly
    -
    -void QhullFacetSet_test::
    -t_foreach()
    -{
    -    RboxPoints rcube("c");
    -    // Spot check predicates and accessors.  See QhullLinkedList_test
    -    Qhull q(rcube,"QR0");  // rotated unit cube
    -    QhullFacetSet fs= q.firstFacet().neighborFacets();
    -    QVERIFY(!fs.contains(q.firstFacet()));
    -    QVERIFY(fs.contains(fs.first()));
    -    QhullFacet f= q.firstFacet().next();
    -    if(!fs.contains(f)){  // check if 'f' is the facet opposite firstFacet()
    -        f= f.next();
    -    }
    -    QVERIFY(fs.contains(f));
    -    QCOMPARE(fs.first(), *fs.begin());
    -    QCOMPARE(*(fs.end()-1), fs.last());
    -}//t_foreach
    -
    -void QhullFacetSet_test::
    -t_io()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube,"QR0 QV0");   // good facets are adjacent to point 0
    -        QhullFacetSet fs= q.firstFacet().neighborFacets();
    -        ostringstream os;
    -        os << fs.print("Neighbors of first facet with point 0");
    -        os << fs.printIdentifiers("\nFacet identifiers: ");
    -        cout << os.str();
    -        QString facets= QString::fromStdString(os.str());
    -        QCOMPARE(facets.count(QRegExp(" f[0-9]")), 2+13*2);
    -    }
    -}//t_io
    -
    -}//orgQhull
    -
    -#include "moc/QhullFacetSet_test.moc"
    diff --git a/src/qhull/src/qhulltest/QhullFacet_test.cpp b/src/qhull/src/qhulltest/QhullFacet_test.cpp
    deleted file mode 100644
    index 271f63753c1..00000000000
    --- a/src/qhull/src/qhulltest/QhullFacet_test.cpp
    +++ /dev/null
    @@ -1,283 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/QhullFacet_test.cpp#4 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -//pre-compiled headers
    -#include 
    -#include "qhulltest/RoadTest.h" // QT_VERSION
    -
    -#include "libqhullcpp/QhullFacet.h"
    -#include "libqhullcpp/QhullError.h"
    -#include "libqhullcpp/Coordinates.h"
    -#include "libqhullcpp/RboxPoints.h"
    -#include "libqhullcpp/QhullFacetList.h"
    -#include "libqhullcpp/QhullFacetSet.h"
    -#include "libqhullcpp/QhullPointSet.h"
    -#include "libqhullcpp/QhullRidge.h"
    -#include "libqhullcpp/Qhull.h"
    -
    -using std::cout;
    -using std::endl;
    -using std::ostringstream;
    -using std::ostream;
    -using std::string;
    -
    -namespace orgQhull {
    -
    -class QhullFacet_test : public RoadTest
    -{
    -    Q_OBJECT
    -
    -#//!\name Test slots
    -private slots:
    -    void cleanup();
    -    void t_construct_qh();
    -    void t_constructConvert();
    -    void t_getSet();
    -    void t_value();
    -    void t_foreach();
    -    void t_io();
    -};//QhullFacet_test
    -
    -void
    -add_QhullFacet_test()
    -{
    -    new QhullFacet_test();  // RoadTest::s_testcases
    -}
    -
    -//Executed after each testcase
    -void QhullFacet_test::
    -cleanup()
    -{
    -    RoadTest::cleanup();
    -}
    -
    -void QhullFacet_test::
    -t_construct_qh()
    -{
    -    // Qhull.runQhull() constructs QhullFacets as facetT
    -    QhullQh qh;
    -    QhullFacet f(&qh);
    -    QVERIFY(!f.isValid());
    -    QCOMPARE(f.dimension(),0);
    -}//t_construct_qh
    -
    -void QhullFacet_test::
    -t_constructConvert()
    -{
    -    // Qhull.runQhull() constructs QhullFacets as facetT
    -    Qhull q2;
    -    QhullFacet f(q2);
    -    QVERIFY(!f.isValid());
    -    QCOMPARE(f.dimension(),0);
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"Qt QR0");  // triangulation of rotated unit cube
    -    QhullFacet f2(q.beginFacet());
    -    QCOMPARE(f2.dimension(),3);
    -    f= f2; // copy assignment
    -    QVERIFY(f.isValid());
    -    QCOMPARE(f.dimension(),3);
    -    QhullFacet f5= f2;
    -    QVERIFY(f5==f2);
    -    QVERIFY(f5==f);
    -    QhullFacet f3(q, f2.getFacetT());
    -    QCOMPARE(f,f3);
    -    QhullFacet f4(q, f2.getBaseT());
    -    QCOMPARE(f,f4);
    -}//t_constructConvert
    -
    -void QhullFacet_test::
    -t_getSet()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube,"Qt QR0");  // triangulation of rotated unit cube
    -        cout << " rbox c | qhull Qt QR0 QR" << q.rotateRandom() << "   distanceEpsilon " << q.distanceEpsilon() << endl;
    -        QCOMPARE(q.facetCount(), 12);
    -        QCOMPARE(q.vertexCount(), 8);
    -        QhullFacetListIterator i(q.facetList());
    -        while(i.hasNext()){
    -            const QhullFacet f= i.next();
    -            cout << f.id() << endl;
    -            QCOMPARE(f.dimension(),3);
    -            QVERIFY(f.id()>0 && f.id()<=39);
    -            QVERIFY(f.isValid());
    -            if(i.hasNext()){
    -                QCOMPARE(f.next(), i.peekNext());
    -                QVERIFY(f.next()!=f);
    -            }
    -            QVERIFY(i.hasPrevious());
    -            QCOMPARE(f, i.peekPrevious());
    -        }
    -
    -        // test tricoplanarOwner
    -        QhullFacet facet = q.beginFacet();
    -        QhullFacet tricoplanarOwner = facet.tricoplanarOwner();
    -        int tricoplanarCount= 0;
    -        i.toFront();
    -        while(i.hasNext()){
    -            const QhullFacet f= i.next();
    -            if(f.tricoplanarOwner()==tricoplanarOwner){
    -                tricoplanarCount++;
    -            }
    -        }
    -        QCOMPARE(tricoplanarCount, 2);
    -        int tricoplanarCount2= 0;
    -        foreach (QhullFacet f, q.facetList()){  // Qt only
    -            QhullHyperplane h= f.hyperplane();
    -            cout << "Hyperplane: " << h;
    -            QCOMPARE(h.count(), 3);
    -            QCOMPARE(h.offset(), -0.5);
    -            double n= h.norm();
    -            QCOMPARE(n, 1.0);
    -            QhullHyperplane hi= f.innerplane();
    -            QCOMPARE(hi.count(), 3);
    -            double innerOffset= hi.offset()+0.5;
    -            cout << "InnerPlane: " << hi << "   innerOffset+0.5 " << innerOffset << endl;
    -            QVERIFY(innerOffset >= 0.0-(2*q.distanceEpsilon())); // A guessed epsilon.  It needs to account for roundoff due to rotation of the vertices
    -            QhullHyperplane ho= f.outerplane();
    -            QCOMPARE(ho.count(), 3);
    -            double outerOffset= ho.offset()+0.5;
    -            cout << "OuterPlane: " << ho << "   outerOffset+0.5 " << outerOffset << endl;
    -            QVERIFY(outerOffset <= 0.0+(2*q.distanceEpsilon())); // A guessed epsilon.  It needs to account for roundoff due to rotation of the vertices
    -            QVERIFY(outerOffset-innerOffset < 1e-7);
    -            for(int k= 0; k<3; k++){
    -                QVERIFY(ho[k]==hi[k]);
    -                QVERIFY(ho[k]==h[k]);
    -            }
    -            QhullPoint center= f.getCenter();
    -            cout << "Center: " << center;
    -            double d= f.distance(center);
    -            QVERIFY(d < innerOffset-outerOffset);
    -            QhullPoint center2= f.getCenter(qh_PRINTcentrums);
    -            QCOMPARE(center, center2);
    -            if(f.tricoplanarOwner()==tricoplanarOwner){
    -                tricoplanarCount2++;
    -            }
    -            cout << endl;
    -        }
    -        QCOMPARE(tricoplanarCount2, 2);
    -        Qhull q2(rcube,"d Qz Qt QR0");  // 3-d triangulation of Delaunay triangulation (the cube)
    -        cout << " rbox c | qhull d Qz Qt QR0 QR" << q2.rotateRandom() << "   distanceEpsilon " << q2.distanceEpsilon() << endl;
    -        QhullFacet f2= q2.firstFacet();
    -        QhullPoint center3= f2.getCenter(qh_PRINTtriangles);
    -        QCOMPARE(center3.dimension(), 3);
    -        QhullPoint center4= f2.getCenter();
    -        QCOMPARE(center4.dimension(), 4);
    -        for(int k= 0; k<3; k++){
    -            QVERIFY(center4[k]==center3[k]);
    -        }
    -        Qhull q3(rcube,"v Qz QR0");  // Voronoi diagram of a cube (one vertex)
    -        cout << " rbox c | qhull v Qz QR0 QR" << q3.rotateRandom() << "   distanceEpsilon " << q3.distanceEpsilon() << endl;
    -
    -        q3.setFactorEpsilon(400); // Voronoi vertices are not necessarily within distance episilon
    -        QhullPoint origin= q3.inputOrigin();
    -        int voronoiCount= 0;
    -        foreach(QhullFacet f, q3.facetList()){ //Qt only
    -            if(f.isGood()){
    -                ++voronoiCount;
    -                QhullPoint p= f.voronoiVertex();
    -                cout << p.print("Voronoi vertex: ")
    -                    << " Is it within " << q3.factorEpsilon() << " * distanceEpsilon (" << q3.distanceEpsilon() << ") of the origin?" << endl;
    -                QCOMPARE(p, origin);
    -            }
    -        }
    -        QCOMPARE(voronoiCount, 1);
    -    }
    -}//t_getSet
    -
    -void QhullFacet_test::
    -t_value()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube, "");
    -        coordT c[]= {0.0, 0.0, 0.0};
    -        foreach (QhullFacet f, q.facetList()){  // Qt only
    -            double d= f.distance(q.origin());
    -            QCOMPARE(d, -0.5);
    -            double d0= f.distance(c);
    -            QCOMPARE(d0, -0.5);
    -            double facetArea= f.facetArea();
    -            QCOMPARE(facetArea, 1.0);
    -            #if qh_MAXoutside
    -                double maxoutside= f.getFacetT()->maxoutside;
    -                QVERIFY(maxoutside<1e-7);
    -            #endif
    -        }
    -    }
    -}//t_value
    -
    -void QhullFacet_test::
    -t_foreach()
    -{
    -    RboxPoints rcube("c W0 300");  // cube plus 300 points on its surface
    -    {
    -        Qhull q(rcube, "QR0 Qc"); // keep coplanars, thick facet, and rotate the cube
    -        int coplanarCount= 0;
    -        foreach(const QhullFacet f, q.facetList()){
    -            QhullPointSet coplanars= f.coplanarPoints();
    -            coplanarCount += coplanars.count();
    -            QhullFacetSet neighbors= f.neighborFacets();
    -            QCOMPARE(neighbors.count(), 4);
    -            QhullPointSet outsides= f.outsidePoints();
    -            QCOMPARE(outsides.count(), 0);
    -            QhullRidgeSet ridges= f.ridges();
    -            QCOMPARE(ridges.count(), 4);
    -            QhullVertexSet vertices= f.vertices();
    -            QCOMPARE(vertices.count(), 4);
    -            int ridgeCount= 0;
    -            QhullRidge r= ridges.first();
    -            for(int r0= r.id(); ridgeCount==0 || r.id()!=r0; r= r.nextRidge3d(f)){
    -                ++ridgeCount;
    -                if(!r.hasNextRidge3d(f)){
    -                    QFAIL("Unexpected simplicial facet.  They only have ridges to non-simplicial neighbors.");
    -                }
    -            }
    -            QCOMPARE(ridgeCount, 4);
    -        }
    -        QCOMPARE(coplanarCount, 300);
    -    }
    -}//t_foreach
    -
    -void QhullFacet_test::
    -t_io()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube, "");
    -        QhullFacet f= q.beginFacet();
    -        cout << f;
    -        ostringstream os;
    -        os << f.print("\nWith a message\n");
    -        os << "\nPrint header for the same facet\n";
    -        os << f.printHeader();
    -        os << "\nPrint each component\n";
    -        os << f.printFlags("    - flags:");
    -        os << f.printCenter(qh_PRINTfacets, "    - center: ");
    -        os << f.printRidges();
    -        cout << os.str();
    -        ostringstream os2;
    -        os2 << f;
    -        QString facetString2= QString::fromStdString(os2.str());
    -        facetString2.replace(QRegExp("\\s\\s+"), " ");
    -        ostringstream os3;
    -        q.qh()->setOutputStream(&os3);
    -        q.outputQhull("f");
    -        QString facetsString= QString::fromStdString(os3.str());
    -        QString facetString3= facetsString.mid(facetsString.indexOf("- f1\n"));
    -        facetString3= facetString3.left(facetString3.indexOf("\n- f")+1);
    -        facetString3.replace(QRegExp("\\s\\s+"), " ");
    -        QCOMPARE(facetString2, facetString3);
    -    }
    -}//t_io
    -
    -// toQhullFacet is static_cast only
    -
    -}//orgQhull
    -
    -#include "moc/QhullFacet_test.moc"
    diff --git a/src/qhull/src/qhulltest/QhullHyperplane_test.cpp b/src/qhull/src/qhulltest/QhullHyperplane_test.cpp
    deleted file mode 100644
    index d016989a97f..00000000000
    --- a/src/qhull/src/qhulltest/QhullHyperplane_test.cpp
    +++ /dev/null
    @@ -1,429 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/QhullHyperplane_test.cpp#4 $$Change: 2064 $
    -** $DateTime: 2016/01/18 12:36:08 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -//pre-compiled headers
    -#include 
    -#include "qhulltest/RoadTest.h" // QT_VERSION
    -
    -#include "libqhullcpp/QhullHyperplane.h"
    -#include "libqhullcpp/QhullError.h"
    -#include "libqhullcpp/RboxPoints.h"
    -#include "libqhullcpp/QhullFacet.h"
    -#include "libqhullcpp/QhullFacetList.h"
    -#include "libqhullcpp/QhullFacetSet.h"
    -#include "libqhullcpp/Qhull.h"
    -
    -#include 
    -#include 
    -
    -using std::cout;
    -using std::endl;
    -using std::ostringstream;
    -using std::ostream;
    -using std::string;
    -
    -namespace orgQhull {
    -
    -class QhullHyperplane_test : public RoadTest
    -{
    -    Q_OBJECT
    -
    -#//!\name Test slots
    -private slots:
    -    void cleanup();
    -    void t_construct();
    -    void t_construct_qh();
    -    void t_convert();
    -    void t_readonly();
    -    void t_define();
    -    void t_value();
    -    void t_operator();
    -    void t_iterator();
    -    void t_const_iterator();
    -    void t_qhullHyperplane_iterator();
    -    void t_io();
    -};//QhullHyperplane_test
    -
    -void
    -add_QhullHyperplane_test()
    -{
    -    new QhullHyperplane_test();  // RoadTest::s_testcases
    -}
    -
    -//Executed after each testcase
    -void QhullHyperplane_test::
    -cleanup()
    -{
    -    RoadTest::cleanup();
    -}
    -
    -void QhullHyperplane_test::
    -t_construct()
    -{
    -    QhullHyperplane h4;
    -    QVERIFY(!h4.isValid());
    -    QCOMPARE(h4.dimension(), 0);
    -    // Qhull.runQhull() constructs QhullFacets as facetT
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"Qt QR0");  // triangulation of rotated unit cube
    -    QhullHyperplane h(q);
    -    QVERIFY(!h.isValid());
    -    QCOMPARE(h.dimension(), 0);
    -    QCOMPARE(h.coordinates(),static_cast(0));
    -    QhullFacet f= q.firstFacet();
    -    QhullHyperplane h2(f.hyperplane());
    -    QVERIFY(h2.isValid());
    -    QCOMPARE(h2.dimension(), 3);
    -    h= h2;
    -    QCOMPARE(h, h2);
    -    QhullHyperplane h3(q, h2.dimension(), h2.coordinates(), h2.offset());
    -    QCOMPARE(h2, h3);
    -    QhullHyperplane h5= h2; // copy constructor
    -    QVERIFY(h5==h2);
    -}//t_construct
    -
    -void QhullHyperplane_test::
    -t_construct_qh()
    -{
    -    // Qhull.runQhull() constructs QhullFacets as facetT
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"Qt QR0");  // triangulation of rotated unit cube
    -    QhullFacet f= q.firstFacet();
    -    QhullHyperplane h2(f.hyperplane());
    -    QVERIFY(h2.isValid());
    -    QCOMPARE(h2.dimension(), 3);
    -    // h= h2;  // copy assignment disabled, ambiguous
    -    QhullHyperplane h3(q.qh(), h2.dimension(), h2.coordinates(), h2.offset());
    -    QCOMPARE(h2, h3);
    -    QhullHyperplane h5= h2; // copy constructor
    -    QVERIFY(h5==h2);
    -}//t_construct_qh
    -
    -void QhullHyperplane_test::
    -t_convert()
    -{
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"Qt QR0");  // triangulation of rotated unit cube
    -    QhullHyperplane h= q.firstFacet().hyperplane();
    -    std::vector fs= h.toStdVector();
    -    QCOMPARE(fs.size(), 4u);
    -    double offset= fs.back();
    -    fs.pop_back();
    -    QCOMPARE(offset, -0.5);
    -
    -    double squareNorm= inner_product(fs.begin(), fs.end(), fs.begin(), 0.0);
    -    QCOMPARE(squareNorm, 1.0);
    -    QList qs= h.toQList();
    -    QCOMPARE(qs.size(), 4);
    -    double offset2= qs.takeLast();
    -    QCOMPARE(offset2, -0.5);
    -    double squareNorm2= std::inner_product(qs.begin(), qs.end(), qs.begin(), 0.0);
    -    QCOMPARE(squareNorm2, 1.0);
    -}//t_convert
    -
    -void QhullHyperplane_test::
    -t_readonly()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube,"Qt QR0");  // triangulation of rotated unit cube
    -        QhullFacetList fs= q.facetList();
    -        QhullFacetListIterator i(fs);
    -        while(i.hasNext()){
    -            QhullFacet f= i.next();
    -            QhullHyperplane h= f.hyperplane();
    -            int id= f.id();
    -            cout << "h" << id << endl;
    -            QVERIFY(h.isValid());
    -            QCOMPARE(h.dimension(),3);
    -            const coordT *c= h.coordinates();
    -            coordT *c2= h.coordinates();
    -            QCOMPARE(c, c2);
    -            const coordT *c3= h.begin();
    -            QCOMPARE(c, c3);
    -            QCOMPARE(h.offset(), -0.5);
    -            int j= h.end()-h.begin();
    -            QCOMPARE(j, 3);
    -            double squareNorm= std::inner_product(h.begin(), h.end(), h.begin(), 0.0);
    -            QCOMPARE(squareNorm, 1.0);
    -        }
    -        QhullHyperplane h2= fs.first().hyperplane();
    -        QhullHyperplane h3= fs.last().hyperplane();
    -        QVERIFY(h2!=h3);
    -        QVERIFY(h3.coordinates()!=h2.coordinates());
    -    }
    -}//t_readonly
    -
    -void QhullHyperplane_test::
    -t_define()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube,"Qt QR0");  // triangulation of rotated unit cube
    -        QhullFacetList fs= q.facetList();
    -        QhullHyperplane h= fs.first().hyperplane();
    -        QhullHyperplane h2= h;
    -        QVERIFY(h==h2);
    -        QhullHyperplane h3= fs.last().hyperplane();
    -        QVERIFY(h2!=h3);
    -
    -        QhullHyperplane h4= h3;
    -        h4.defineAs(h2);
    -        QVERIFY(h2==h4);
    -        QhullHyperplane p5= h3;
    -        p5.defineAs(h2.dimension(), h2.coordinates(), h2.offset());
    -        QVERIFY(h2==p5);
    -        QhullHyperplane h6= h3;
    -        h6.setCoordinates(h2.coordinates());
    -        QCOMPARE(h2.coordinates(), h6.coordinates());
    -        h6.setOffset(h2.offset());
    -        QCOMPARE(h2.offset(), h6.offset());
    -        QVERIFY(h2==h6);
    -        h6.setDimension(2);
    -        QCOMPARE(h6.dimension(), 2);
    -        QVERIFY(h2!=h6);
    -    }
    -}//t_define
    -
    -void QhullHyperplane_test::
    -t_value()
    -{
    -    RboxPoints rcube("c G1");
    -    Qhull q(rcube,"Qt QR0");  // triangulation of rotated unit cube
    -    QhullFacet f= q.firstFacet();
    -    QhullFacet f2= f.neighborFacets().at(0);
    -    const QhullHyperplane h= f.hyperplane();
    -    const QhullHyperplane h2= f2.hyperplane();   // At right angles
    -    double dist= h.distance(q.origin());
    -    QCOMPARE(dist, -1.0);
    -    double norm= h.norm();
    -    QCOMPARE(norm, 1.0);
    -    double angle= h.hyperplaneAngle(h2);
    -    cout << "angle " << angle << endl;
    -    QCOMPARE(angle+1.0, 1.0); // qFuzzyCompare does not work for 0.0
    -    QVERIFY(h==h);
    -    QVERIFY(h!=h2);
    -}//t_value
    -
    -void QhullHyperplane_test::
    -t_operator()
    -{
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"Qt QR0");  // triangulation of rotated unit cube
    -    const QhullHyperplane h= q.firstFacet().hyperplane();
    -    //operator== and operator!= tested elsewhere
    -    const coordT *c= h.coordinates();
    -    for(int k=h.dimension(); k--; ){
    -        QCOMPARE(c[k], h[k]);
    -    }
    -    //h[0]= 10.0; // compiler error, const
    -    QhullHyperplane h2= q.firstFacet().hyperplane();
    -    h2[0]= 10.0;  // Overwrites Hyperplane coordinate!
    -    QCOMPARE(h2[0], 10.0);
    -}//t_operator
    -
    -void QhullHyperplane_test::
    -t_iterator()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube,"QR0");  // rotated unit cube
    -        QhullHyperplane h= q.firstFacet().hyperplane();
    -        QCOMPARE(h.count(), 3);
    -        QCOMPARE(h.size(), 3u);
    -        QhullHyperplane::Iterator i= h.begin();
    -        QhullHyperplane::iterator i2= h.begin();
    -        QVERIFY(i==i2);
    -        QVERIFY(i>=i2);
    -        QVERIFY(i<=i2);
    -        i= h.begin();
    -        QVERIFY(i==i2);
    -        i2= h.end();
    -        QVERIFY(i!=i2);
    -        double d3= *i;
    -        i2--;
    -        double d2= *i2;
    -        QCOMPARE(d3, h[0]);
    -        QCOMPARE(d2, h[2]);
    -        QhullHyperplane::Iterator i3(i2);
    -        QCOMPARE(*i2, *i3);
    -
    -        (i3= i)++;
    -        QCOMPARE((*i3), h[1]);
    -        QVERIFY(i==i);
    -        QVERIFY(i!=i2);
    -        QVERIFY(ii);
    -        QVERIFY(i2>=i);
    -
    -        QhullHyperplane::ConstIterator i4= h.begin();
    -        QVERIFY(i==i4); // iterator COMP const_iterator
    -        QVERIFY(i<=i4);
    -        QVERIFY(i>=i4);
    -        QVERIFY(i4==i); // const_iterator COMP iterator
    -        QVERIFY(i4<=i);
    -        QVERIFY(i4>=i);
    -        QVERIFY(i>=i4);
    -        QVERIFY(i4<=i);
    -        QVERIFY(i2!=i4);
    -        QVERIFY(i2>i4);
    -        QVERIFY(i2>=i4);
    -        QVERIFY(i4!=i2);
    -        QVERIFY(i4i);
    -        QVERIFY(i4>=i);
    -
    -        i= h.begin();
    -        i2= h.begin();
    -        QCOMPARE(i, i2++);
    -        QCOMPARE(*i2, h[1]);
    -        QCOMPARE(++i, i2);
    -        QCOMPARE(i, i2--);
    -        QCOMPARE(i2, h.begin());
    -        QCOMPARE(--i, i2);
    -        QCOMPARE(i2 += 3, h.end());
    -        QCOMPARE(i2 -= 3, h.begin());
    -        QCOMPARE(i2+0, h.begin());
    -        QCOMPARE(i2+3, h.end());
    -        i2 += 3;
    -        i= i2-0;
    -        QCOMPARE(i, i2);
    -        i= i2-3;
    -        QCOMPARE(i, h.begin());
    -        QCOMPARE(i2-i, 3);
    -
    -        //h.begin end tested above
    -
    -        // QhullHyperplane is const-only
    -    }
    -}//t_iterator
    -
    -void QhullHyperplane_test::
    -t_const_iterator()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube,"QR0");  // rotated unit cube
    -        QhullHyperplane h= q.firstFacet().hyperplane();
    -        QhullHyperplane::ConstIterator i= h.begin();
    -        QhullHyperplane::const_iterator i2= h.begin();
    -        QVERIFY(i==i2);
    -        QVERIFY(i>=i2);
    -        QVERIFY(i<=i2);
    -        i= h.begin();
    -        QVERIFY(i==i2);
    -        i2= h.end();
    -        QVERIFY(i!=i2);
    -        double d3= *i;
    -        i2--;
    -        double d2= *i2;
    -        QCOMPARE(d3, h[0]);
    -        QCOMPARE(d2, h[2]);
    -        QhullHyperplane::ConstIterator i3(i2);
    -        QCOMPARE(*i2, *i3);
    -
    -        (i3= i)++;
    -        QCOMPARE((*i3), h[1]);
    -        QVERIFY(i==i);
    -        QVERIFY(i!=i2);
    -        QVERIFY(ii);
    -        QVERIFY(i2>=i);
    -
    -        // See t_iterator for const_iterator COMP iterator
    -
    -        i= h.begin();
    -        i2= h.constBegin();
    -        QCOMPARE(i, i2++);
    -        QCOMPARE(*i2, h[1]);
    -        QCOMPARE(++i, i2);
    -        QCOMPARE(i, i2--);
    -        QCOMPARE(i2, h.constBegin());
    -        QCOMPARE(--i, i2);
    -        QCOMPARE(i2+=3, h.constEnd());
    -        QCOMPARE(i2-=3, h.constBegin());
    -        QCOMPARE(i2+0, h.constBegin());
    -        QCOMPARE(i2+3, h.constEnd());
    -        i2 += 3;
    -        i= i2-0;
    -        QCOMPARE(i, i2);
    -        i= i2-3;
    -        QCOMPARE(i, h.constBegin());
    -        QCOMPARE(i2-i, 3);
    -
    -        // QhullHyperplane is const-only
    -    }
    -}//t_const_iterator
    -
    -void QhullHyperplane_test::
    -t_qhullHyperplane_iterator()
    -{
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"QR0");  // rotated unit cube
    -    QhullHyperplane h = q.firstFacet().hyperplane();
    -    QhullHyperplaneIterator i2(h);
    -    QCOMPARE(h.dimension(), 3);
    -    QhullHyperplaneIterator i= h;
    -    QVERIFY(i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    QVERIFY(i.hasNext());
    -    QVERIFY(!i.hasPrevious());
    -    i2.toBack();
    -    i.toFront();
    -    QVERIFY(!i2.hasNext());
    -    QVERIFY(i2.hasPrevious());
    -    QVERIFY(i.hasNext());
    -    QVERIFY(!i.hasPrevious());
    -
    -    // i at front, i2 at end/back, 3 coordinates
    -    QCOMPARE(i.peekNext(), h[0]);
    -    QCOMPARE(i2.peekPrevious(), h[2]);
    -    QCOMPARE(i2.previous(), h[2]);
    -    QCOMPARE(i2.previous(), h[1]);
    -    QCOMPARE(i2.previous(), h[0]);
    -    QVERIFY(!i2.hasPrevious());
    -    QCOMPARE(i.peekNext(), h[0]);
    -    // i.peekNext()= 1.0; // compiler error, i is const
    -    QCOMPARE(i.next(), h[0]);
    -    QCOMPARE(i.peekNext(), h[1]);
    -    QCOMPARE(i.next(), h[1]);
    -    QCOMPARE(i.next(), h[2]);
    -    QVERIFY(!i.hasNext());
    -    i.toFront();
    -    QCOMPARE(i.next(), h[0]);
    -}//t_qhullHyperplane_iterator
    -
    -void QhullHyperplane_test::
    -t_io()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube, "");
    -        QhullHyperplane h= q.firstFacet().hyperplane();
    -        ostringstream os;
    -        os << "Hyperplane:\n";
    -        os << h;
    -        os << h.print("message");
    -        os << h.print(" and a message ", " offset ");
    -        cout << os.str();
    -        QString s= QString::fromStdString(os.str());
    -        QCOMPARE(s.count("1"), 3);
    -        // QCOMPARE(s.count(QRegExp("f\\d")), 3*7 + 13*3*2);
    -    }
    -}//t_io
    -
    -
    -}//orgQhull
    -
    -#include "moc/QhullHyperplane_test.moc"
    diff --git a/src/qhull/src/qhulltest/QhullLinkedList_test.cpp b/src/qhull/src/qhulltest/QhullLinkedList_test.cpp
    deleted file mode 100644
    index e0cde4050f4..00000000000
    --- a/src/qhull/src/qhulltest/QhullLinkedList_test.cpp
    +++ /dev/null
    @@ -1,330 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/QhullLinkedList_test.cpp#3 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -//pre-compiled headers
    -#include 
    -#include "qhulltest/RoadTest.h"
    -
    -#include "libqhullcpp/QhullLinkedList.h"
    -#include "libqhullcpp/Qhull.h"
    -#include "libqhullcpp/QhullVertex.h"
    -#include "libqhullcpp/RboxPoints.h"
    -
    -namespace orgQhull {
    -
    -class QhullLinkedList_test : public RoadTest
    -{
    -    Q_OBJECT
    -
    -#//!\name Test slots
    -private slots:
    -    void cleanup();
    -    void t_construct();
    -    void t_convert();
    -    void t_element();
    -    void t_search();
    -    void t_iterator();
    -    void t_const_iterator();
    -    void t_QhullLinkedList_iterator();
    -    void t_io();
    -};//QhullLinkedList_test
    -
    -void
    -add_QhullLinkedList_test()
    -{
    -    new QhullLinkedList_test();  // RoadTest::s_testcases
    -}
    -
    -//Executed after each testcase
    -void QhullLinkedList_test::
    -cleanup()
    -{
    -    RoadTest::cleanup();
    -}
    -
    -void QhullLinkedList_test::
    -t_construct()
    -{
    -    // QhullLinkedList vs; //private (compiler error).  No memory allocation
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube,"Qt QR0");  // triangulation of rotated unit cube
    -        QCOMPARE(q.facetCount(), 12);
    -        QhullVertexList vs = QhullVertexList(q.beginVertex(), q.endVertex());
    -        QCOMPARE(vs.count(), 8);
    -        QCOMPARE(vs.size(), 8u);
    -        QVERIFY(!vs.isEmpty());
    -        QhullVertexList vs2 = q.vertexList();
    -        QCOMPARE(vs2.count(), 8);
    -        QCOMPARE(vs2.size(),8u);
    -        QVERIFY(!vs2.isEmpty());
    -        QVERIFY(vs==vs2);
    -        // vs= vs2; // disabled.  Would not copy the vertices
    -        QhullVertexList vs3= vs2; // copy constructor
    -        QVERIFY(vs3==vs2);
    -    }
    -}//t_construct
    -
    -void QhullLinkedList_test::
    -t_convert()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube,"Qt QR0");  // triangulation of rotated unit cube
    -        QCOMPARE(q.facetCount(), 12);
    -        QhullVertexList vs = q.vertexList();
    -        QCOMPARE(vs.size(), 8u);
    -        QVERIFY(!vs.isEmpty());
    -        std::vector vs2= vs.toStdVector();
    -        QCOMPARE(vs2.size(), vs.size());
    -        QhullVertexList::Iterator i= vs.begin();
    -        for(int k= 0; k<(int)vs2.size(); k++){
    -            QCOMPARE(vs2[k], *i++);
    -        }
    -        QList vs3= vs.toQList();
    -        QCOMPARE(vs3.count(), vs.count());
    -        i= vs.begin();
    -        for(int k= 0; k
    -#include "RoadTest.h" // QT_VERSION
    -
    -#include "libqhullcpp/QhullPointSet.h"
    -#include "libqhullcpp/RboxPoints.h"
    -#include "libqhullcpp/QhullPoint.h"
    -#include "libqhullcpp/QhullFacet.h"
    -#include "libqhullcpp/QhullFacetList.h"
    -#include "libqhullcpp/Qhull.h"
    -
    -using std::cout;
    -using std::endl;
    -using std::ostringstream;
    -
    -namespace orgQhull {
    -
    -class QhullPointSet_test : public RoadTest
    -{
    -    Q_OBJECT
    -
    -#//!\name Test slots
    -private slots:
    -    void cleanup();
    -    void t_construct();
    -    void t_convert();
    -    void t_element();
    -    void t_iterator();
    -    void t_const_iterator();
    -    void t_search();
    -    void t_pointset_iterator();
    -    void t_io();
    -};//QhullPointSet_test
    -
    -void
    -add_QhullPointSet_test()
    -{
    -    new QhullPointSet_test();  // RoadTest::s_testcases
    -}
    -
    -//Executed after each testcase
    -void QhullPointSet_test::
    -cleanup()
    -{
    -    RoadTest::cleanup();
    -}
    -
    -void QhullPointSet_test::
    -t_construct()
    -{
    -    // Default constructor is disallowed (i.e., private)
    -    RboxPoints rcube("c W0 1000");
    -    Qhull q(rcube,"Qc");  // cube with 1000 coplanar points
    -    int coplanarCount= 0;
    -    foreach(QhullFacet f, q.facetList()){
    -        QhullPointSet ps(q, f.getFacetT()->outsideset);
    -        QVERIFY(ps.isEmpty());
    -        QCOMPARE(ps.count(), 0);
    -        QCOMPARE(ps.size(), 0u);
    -        QhullPointSet ps2(q.qh(), f.getFacetT()->coplanarset);
    -        QVERIFY(!ps2.isEmpty());
    -        coplanarCount += ps2.count();
    -        QCOMPARE(ps2.count(), (int)ps2.size());
    -        QhullPointSet ps3(ps2);
    -        QVERIFY(!ps3.isEmpty());
    -        QCOMPARE(ps3.count(), ps2.count());
    -        QVERIFY(ps3==ps2);
    -        QVERIFY(ps3!=ps);
    -        QhullPointSet ps4= ps3;
    -        QVERIFY(ps4==ps2);
    -    }
    -    QCOMPARE(coplanarCount, 1000);
    -}//t_construct
    -
    -void QhullPointSet_test::
    -t_convert()
    -{
    -    RboxPoints rcube("c W0 1000");
    -    Qhull q(rcube,"Qc");  // cube with 1000 coplanar points
    -    QhullFacet f= q.firstFacet();
    -    QhullPointSet ps= f.coplanarPoints();
    -    QVERIFY(ps.count()>=1);   // Sometimes no coplanar points
    -    std::vector vs= ps.toStdVector();
    -    QCOMPARE(vs.size(), ps.size());
    -    QhullPoint p= ps[0];
    -    QhullPoint p2= vs[0];
    -    QCOMPARE(p, p2);
    -    QList qs= ps.toQList();
    -    QCOMPARE(qs.size(), static_cast(ps.size()));
    -    QhullPoint p3= qs[0];
    -    QCOMPARE(p3, p);
    -}//t_convert
    -
    -// readonly tested in t_construct
    -//   empty, isEmpty, ==, !=, size
    -
    -void QhullPointSet_test::
    -t_element()
    -{
    -    RboxPoints rcube("c W0 1000");
    -    Qhull q(rcube,"Qc");  // cube with 1000 coplanar points
    -    QhullFacet f= q.firstFacet();
    -    QhullPointSet ps= f.coplanarPoints();
    -    QVERIFY(ps.count()>=3);  // Sometimes no coplanar points
    -    QhullPoint p= ps[0];
    -    QCOMPARE(p, ps[0]);
    -    QhullPoint p2= ps[ps.count()-1];
    -    QCOMPARE(ps.at(1), ps[1]);
    -    QCOMPARE(ps.second(), ps[1]);
    -    QCOMPARE(ps.first(), p);
    -    QCOMPARE(ps.front(), ps.first());
    -    QCOMPARE(ps.last(), p2);
    -    QCOMPARE(ps.back(), ps.last());
    -    QhullPoint p8(q);
    -    QCOMPARE(ps.value(2), ps[2]);
    -    QCOMPARE(ps.value(-1), p8);
    -    QCOMPARE(ps.value(ps.count()), p8);
    -    QCOMPARE(ps.value(ps.count(), p), p);
    -    QVERIFY(ps.value(1, p)!=p);
    -    QhullPointSet ps8= f.coplanarPoints();
    -    QhullPointSet::Iterator i= ps8.begin();
    -    foreach(QhullPoint p9, ps){  // Qt only
    -        QCOMPARE(p9.dimension(), 3);
    -        QCOMPARE(p9, *i++);
    -    }
    -}//t_element
    -
    -void QhullPointSet_test::
    -t_iterator()
    -{
    -    RboxPoints rcube("c W0 1000");
    -    Qhull q(rcube,"Qc");  // cube with 1000 coplanar points
    -    QhullFacet f= q.firstFacet();
    -    QhullPointSet ps= f.coplanarPoints();
    -    QVERIFY(ps.count()>=3);  // Sometimes no coplanar points
    -    QhullPointSet::Iterator i= ps.begin();
    -    QhullPointSet::iterator i2= ps.begin();
    -    QVERIFY(i==i2);
    -    QVERIFY(i>=i2);
    -    QVERIFY(i<=i2);
    -    i= ps.begin();
    -    QVERIFY(i==i2);
    -    i2= ps.end();
    -    QVERIFY(i!=i2);
    -    QhullPoint p= *i;
    -    QCOMPARE(p.dimension(), q.dimension());
    -    QCOMPARE(p, ps[0]);
    -    i2--;
    -    QhullPoint p2= *i2;
    -    QCOMPARE(p2.dimension(), q.dimension());
    -    QCOMPARE(p2, ps.last());
    -    QhullPointSet::Iterator i5(i2);
    -    QCOMPARE(*i2, *i5);
    -    QhullPointSet::Iterator i3= i+1;
    -    QVERIFY(i!=i3);
    -    QCOMPARE(i[1], *i3);
    -    (i3= i)++;
    -    QCOMPARE((*i3)[0], ps[1][0]);
    -    QCOMPARE((*i3).dimension(), 3);
    -
    -    QVERIFY(i==i);
    -    QVERIFY(i!=i3);
    -    QVERIFY(ii);
    -    QVERIFY(i3>=i);
    -
    -    QhullPointSet::ConstIterator i4= ps.begin();
    -    QVERIFY(i==i4); // iterator COMP const_iterator
    -    QVERIFY(i<=i4);
    -    QVERIFY(i>=i4);
    -    QVERIFY(i4==i); // const_iterator COMP iterator
    -    QVERIFY(i4<=i);
    -    QVERIFY(i4>=i);
    -    QVERIFY(i>=i4);
    -    QVERIFY(i4<=i);
    -    QVERIFY(i2!=i4);
    -    QVERIFY(i2>i4);
    -    QVERIFY(i2>=i4);
    -    QVERIFY(i4!=i2);
    -    QVERIFY(i4i);
    -    QVERIFY(i4>=i);
    -    i4= ps.constBegin();
    -    QVERIFY(i==i4); // iterator COMP const_iterator
    -    QCOMPARE(i4+ps.count(), ps.constEnd());
    -
    -    i= ps.begin();
    -    i2= ps.begin();
    -    QCOMPARE(i, i2++);
    -    QCOMPARE(*i2, ps[1]);
    -    QCOMPARE(++i, i2);
    -    QCOMPARE(i, i2--);
    -    QCOMPARE(i2, ps.begin());
    -    QCOMPARE(--i, i2);
    -    QCOMPARE(i2+=ps.count(), ps.end());
    -    QCOMPARE(i2-=ps.count(), ps.begin());
    -    QCOMPARE(i2+0, ps.begin());
    -    QCOMPARE(i2+ps.count(), ps.end());
    -    i2 += ps.count();
    -    i= i2-0;
    -    QCOMPARE(i, i2);
    -    i= i2-ps.count();
    -    QCOMPARE(i, ps.begin());
    -    QCOMPARE(i2-i, ps.count());
    -
    -    //ps.begin end tested above
    -
    -    // QhullPointSet is const-only
    -}//t_iterator
    -
    -void QhullPointSet_test::
    -t_const_iterator()
    -{
    -    RboxPoints rcube("c W0 1000");
    -    Qhull q(rcube,"Qc");  // cube with 1000 coplanar points
    -    QhullFacet f= q.firstFacet();
    -    QhullPointSet ps= f.coplanarPoints();
    -    QVERIFY(ps.count()>=3);  // Sometimes no coplanar points
    -    QhullPointSet::ConstIterator i= ps.begin();
    -    QhullPointSet::const_iterator i2= ps.begin();
    -    QVERIFY(i==i2);
    -    QVERIFY(i>=i2);
    -    QVERIFY(i<=i2);
    -
    -    // See t_iterator for const_iterator COMP iterator
    -
    -    i= ps.begin();
    -    QVERIFY(i==i2);
    -    i2= ps.end();
    -    QVERIFY(i!=i2);
    -    QhullPoint p= *i; // QhullPoint is the base class for QhullPointSet::iterator
    -    QCOMPARE(p.dimension(), q.dimension());
    -    QCOMPARE(p, ps[0]);
    -    i2--;
    -    QhullPoint p2= *i2;
    -    QCOMPARE(p2.dimension(), q.dimension());
    -    QCOMPARE(p2, ps.last());
    -    QhullPointSet::ConstIterator i5(i2);
    -    QCOMPARE(*i2, *i5);
    -
    -
    -    QhullPointSet::ConstIterator i3= i+1;
    -    QVERIFY(i!=i3);
    -    QCOMPARE(i[1], *i3);
    -
    -    QVERIFY(i==i);
    -    QVERIFY(i!=i3);
    -    QVERIFY(ii);
    -    QVERIFY(i3>=i);
    -
    -    // QhullPointSet is const-only
    -}//t_const_iterator
    -
    -
    -void QhullPointSet_test::
    -t_search()
    -{
    -    RboxPoints rcube("c W0 1000");
    -    Qhull q(rcube,"Qc");  // cube with 1000 coplanar points
    -    QhullFacet f= q.firstFacet();
    -    QhullPointSet ps= f.coplanarPoints();
    -    QVERIFY(ps.count()>=3);  // Sometimes no coplanar points
    -    QhullPoint p= ps.first();
    -    QhullPoint p2= ps.last();
    -    QVERIFY(ps.contains(p));
    -    QVERIFY(ps.contains(p2));
    -    QVERIFY(p!=p2);
    -    QhullPoint p3= ps[2];
    -    QVERIFY(ps.contains(p3));
    -    QVERIFY(p!=p3);
    -    QCOMPARE(ps.indexOf(p), 0);
    -    QCOMPARE(ps.indexOf(p2), ps.count()-1);
    -    QCOMPARE(ps.indexOf(p3), 2);
    -    QhullPoint p4(q);
    -    QCOMPARE(ps.indexOf(p4), -1);
    -    QCOMPARE(ps.lastIndexOf(p), 0);
    -    QCOMPARE(ps.lastIndexOf(p2), ps.count()-1);
    -    QCOMPARE(ps.lastIndexOf(p3), 2);
    -    QCOMPARE(ps.lastIndexOf(p4), -1);
    -}//t_search
    -
    -void QhullPointSet_test::
    -t_pointset_iterator()
    -{
    -    RboxPoints rcube("c W0 1000");
    -    Qhull q(rcube,"Qc");  // cube with 1000 coplanar points
    -    QhullFacet f= q.firstFacet();
    -    QhullPointSet ps2= f.outsidePoints();
    -    QVERIFY(ps2.count()==0); // No outside points after constructing the convex hull
    -    QhullPointSetIterator i2= ps2;
    -    QCOMPARE(i2.countRemaining(), 0);
    -    QVERIFY(!i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    i2.toBack();
    -    QVERIFY(!i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -
    -    QhullPointSet ps= f.coplanarPoints();
    -    QVERIFY(ps.count()>=3);  // Sometimes no coplanar points
    -    QhullPointSetIterator i(ps);
    -    i2= ps;
    -    QCOMPARE(i2.countRemaining(), ps.count());
    -    QVERIFY(i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    QVERIFY(i.hasNext());
    -    QVERIFY(!i.hasPrevious());
    -    i2.toBack();
    -    QCOMPARE(i2.countRemaining(), 0);
    -    i.toFront();
    -    QCOMPARE(i.countRemaining(), ps.count());
    -    QCOMPARE(i2.countRemaining(), 0);
    -    QVERIFY(!i2.hasNext());
    -    QVERIFY(i2.hasPrevious());
    -    QVERIFY(i.hasNext());
    -    QVERIFY(!i.hasPrevious());
    -
    -    QhullPoint p= ps[0];
    -    QhullPoint p2(ps[0]);
    -    QCOMPARE(p, p2);
    -    QVERIFY(p==p2);
    -    QhullPoint p3(ps.last());
    - // p2[0]= 0.0;
    -    QVERIFY(p==p2);
    -    QCOMPARE(i2.peekPrevious(), p3);
    -    QCOMPARE(i2.previous(), p3);
    -    QCOMPARE(i2.previous(), ps[ps.count()-2]);
    -    QVERIFY(i2.hasPrevious());
    -    QCOMPARE(i.peekNext(), p);
    -    // i.peekNext()= 1.0; // compiler error
    -    QCOMPARE(i.next(), p);
    -    QCOMPARE(i.countRemaining(), ps.count()-1);
    -    QhullPoint p4= i.peekNext();
    -    QVERIFY(p4!=p3);
    -    QCOMPARE(i.next(), p4);
    -    QVERIFY(i.hasNext());
    -    i.toFront();
    -    QCOMPARE(i.next(), p);
    -}//t_pointset_iterator
    -
    -void QhullPointSet_test::
    -t_io()
    -{
    -    ostringstream os;
    -    RboxPoints rcube("c W0 120");
    -    Qhull q(rcube,"Qc");  // cube with 100 coplanar points
    -    QhullFacet f= q.firstFacet();
    -    QhullPointSet ps= f.coplanarPoints();
    -    QVERIFY(ps.count()>=3);  // Sometimes no coplanar points
    -    os << "QhullPointSet from coplanarPoints\n" << ps << endl;
    -    os << ps.print("\nWith message\n");
    -    os << ps.printIdentifiers("\nCoplanar points: ");
    -    os << "\nAs a point set:\n";
    -    os << ps;
    -    cout << os.str();
    -    QString s= QString::fromStdString(os.str());
    -    QCOMPARE(s.count(" 0.5\n"), 3*ps.count());
    -    QCOMPARE(s.count("p"), ps.count()+4);
    -}//t_io
    -
    -}//orgQhull
    -
    -#include "moc/QhullPointSet_test.moc"
    diff --git a/src/qhull/src/qhulltest/QhullPoint_test.cpp b/src/qhull/src/qhulltest/QhullPoint_test.cpp
    deleted file mode 100644
    index 1528086a153..00000000000
    --- a/src/qhull/src/qhulltest/QhullPoint_test.cpp
    +++ /dev/null
    @@ -1,437 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/QhullPoint_test.cpp#3 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -//pre-compiled headers
    -#include 
    -#include "RoadTest.h" // QT_VERSION
    -
    -#include "libqhullcpp/QhullPoint.h"
    -#include "libqhullcpp/Coordinates.h"
    -#include "libqhullcpp/RboxPoints.h"
    -#include "libqhullcpp/QhullError.h"
    -#include "libqhullcpp/QhullFacet.h"
    -#include "libqhullcpp/QhullPoint.h"
    -#include "libqhullcpp/Qhull.h"
    -
    -#include 
    -
    -using std::cout;
    -using std::endl;
    -using std::ostringstream;
    -using std::ostream;
    -using std::string;
    -
    -namespace orgQhull {
    -
    -class QhullPoint_test : public RoadTest
    -{
    -    Q_OBJECT
    -
    -#//!\name Test slots
    -private slots:
    -    void cleanup();
    -    void t_construct();
    -    void t_convert();
    -    void t_readonly();
    -    void t_define();
    -    void t_operator();
    -    void t_iterator();
    -    void t_const_iterator();
    -    void t_qhullpoint_iterator();
    -    void t_method();
    -    void t_io();
    -};//QhullPoint_test
    -
    -void
    -add_QhullPoint_test()
    -{
    -    new QhullPoint_test();  // RoadTest::s_testcases
    -}
    -
    -//Executed after each test
    -void QhullPoint_test::
    -cleanup()
    -{
    -    RoadTest::cleanup();
    -}
    -
    -void QhullPoint_test::
    -t_construct()
    -{
    -    QhullPoint p12;
    -    QVERIFY(!p12.isValid());
    -    QCOMPARE(p12.coordinates(), (coordT *)0);
    -    QCOMPARE(p12.dimension(), 0);
    -    QCOMPARE(p12.qh(), (QhullQh *)0);
    -    QCOMPARE(p12.id(), -3);
    -    QCOMPARE(p12.begin(), p12.end());
    -    QCOMPARE(p12.constBegin(), p12.constEnd());
    -
    -    RboxPoints rcube("c");
    -    Qhull q(rcube, "Qt QR0");  // triangulation of rotated unit cube
    -    QhullPoint p(q);
    -    QVERIFY(!p.isValid());
    -    QCOMPARE(p.dimension(),3);
    -    QCOMPARE(p.coordinates(),static_cast(0));
    -    QhullPoint p7(q.qh());
    -    QCOMPARE(p, p7);
    -
    -    // copy constructor and copy assignment
    -    QhullVertex v2(q.beginVertex());
    -    QhullPoint p2(v2.point());
    -    QVERIFY(p2.isValid());
    -    QCOMPARE(p2.dimension(),3);
    -    QVERIFY(p2!=p12);
    -    p= p2;
    -    QCOMPARE(p, p2);
    -
    -    QhullPoint p3(q, p2.dimension(), p2.coordinates());
    -    QCOMPARE(p3, p2);
    -    QhullPoint p8(q, p2.coordinates()); // Qhull defines dimension
    -    QCOMPARE(p8, p2);
    -    QhullPoint p9(q.qh(), p2.dimension(), p2.coordinates());
    -    QCOMPARE(p9, p2);
    -    QhullPoint p10(q.qh(), p2.coordinates()); // Qhull defines dimension
    -    QCOMPARE(p10, p2);
    -
    -    Coordinates c;
    -    c << 0.0 << 0.0 << 0.0;
    -    QhullPoint p6(q, c);
    -    QCOMPARE(p6, q.origin());
    -    QhullPoint p11(q.qh(), c);
    -    QCOMPARE(p11, q.origin());
    -
    -    QhullPoint p5= p2; // copy constructor
    -    QVERIFY(p5==p2);
    -}//t_construct
    -
    -void QhullPoint_test::
    -t_convert()
    -{
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"Qt QR0");  // triangulation of rotated unit cube
    -    QhullVertex v= q.firstVertex();
    -    QhullPoint p= v.point();
    -    std::vector vs= p.toStdVector();
    -    QCOMPARE(vs.size(), 3u);
    -    for(int k=3; k--; ){
    -        QCOMPARE(vs[k], p[k]);
    -    }
    -    QList qs= p.toQList();
    -    QCOMPARE(qs.size(), 3);
    -    for(int k=3; k--; ){
    -        QCOMPARE(qs[k], p[k]);
    -    }
    -}//t_convert
    -
    -void QhullPoint_test::
    -t_readonly()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube,"Qt QR0");  // triangulation of rotated unit cube
    -        QhullVertexList vs= q.vertexList();
    -        cout << "Point ids in 'rbox c'\n";
    -        QhullVertexListIterator i(vs);
    -        while(i.hasNext()){
    -            QhullPoint p= i.next().point();
    -            int id= p.id();
    -            cout << "p" << id << endl;
    -            QVERIFY(p.isValid());
    -            QCOMPARE(p.dimension(),3);
    -            QCOMPARE(id, p.id());
    -            QVERIFY(p.id()>=0 && p.id()<9);
    -            const coordT *c= p.coordinates();
    -            coordT *c2= p.coordinates();
    -            QCOMPARE(c, c2);
    -            QCOMPARE(p.dimension(), 3);
    -            QCOMPARE(q.qh(), p.qh());
    -        }
    -        QhullPoint p2= vs.first().point();
    -        QhullPoint p3= vs.last().point();
    -        QVERIFY(p2!=p3);
    -        QVERIFY(p3.coordinates()!=p2.coordinates());
    -    }
    -}//t_readonly
    -
    -void QhullPoint_test::
    -t_define()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube,"Qt QR0");  // triangulation of rotated unit cube
    -        QhullVertexList vs= q.vertexList();
    -        QhullPoint p= vs.first().point();
    -        QhullPoint p2= p;
    -        QVERIFY(p==p2);
    -        QhullPoint p3= vs.last().point();
    -        QVERIFY(p2!=p3);
    -        int idx= (p3.coordinates()-p2.coordinates())/p2.dimension();
    -        QVERIFY(idx>-8 && idx<8);
    -        p2.advancePoint(idx);
    -        QVERIFY(p2==p3);
    -        p2.advancePoint(-idx);
    -        QVERIFY(p2==p);
    -        p2.advancePoint(0);
    -        QVERIFY(p2==p);
    -
    -        QhullPoint p4= p3;
    -        QVERIFY(p4==p3);
    -        p4.defineAs(p2);
    -        QVERIFY(p2==p4);
    -        QhullPoint p5= p3;
    -        p5.defineAs(p2.dimension(), p2.coordinates());
    -        QVERIFY(p2==p5);
    -        QhullPoint p6= p3;
    -        p6.setCoordinates(p2.coordinates());
    -        QCOMPARE(p2.coordinates(), p6.coordinates());
    -        QVERIFY(p2==p6);
    -        p6.setDimension(2);
    -        QCOMPARE(p6.dimension(), 2);
    -        QVERIFY(p2!=p6);
    -    }
    -}//t_define
    -
    -void QhullPoint_test::
    -t_operator()
    -{
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"Qt QR0");  // triangulation of rotated unit cube
    -    const QhullPoint p= q.firstVertex().point();
    -    //operator== and operator!= tested elsewhere
    -    const coordT *c= p.coordinates();
    -    for(int k=p.dimension(); k--; ){
    -        QCOMPARE(c[k], p[k]);
    -    }
    -    //p[0]= 10.0; // compiler error, const
    -    QhullPoint p2= q.firstVertex().point();
    -    p2[0]= 10.0;  // Overwrites point coordinate
    -    QCOMPARE(p2[0], 10.0);
    -}//t_operator
    -
    -void QhullPoint_test::
    -t_iterator()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube,"QR0");  // rotated unit cube
    -        QhullPoint p2(q);
    -        QCOMPARE(p2.begin(), p2.end());
    -
    -        QhullPoint p= q.firstVertex().point();
    -        QhullPoint::Iterator i= p.begin();
    -        QhullPoint::iterator i2= p.begin();
    -        QVERIFY(i==i2);
    -        QVERIFY(i>=i2);
    -        QVERIFY(i<=i2);
    -        i= p.begin();
    -        QVERIFY(i==i2);
    -        i2= p.end();
    -        QVERIFY(i!=i2);
    -        double d3= *i;
    -        i2--;
    -        double d2= *i2;
    -        QCOMPARE(d3, p[0]);
    -        QCOMPARE(d2, p[2]);
    -        QhullPoint::Iterator i3(i2);
    -        QCOMPARE(*i2, *i3);
    -
    -        (i3= i)++;
    -        QCOMPARE((*i3), p[1]);
    -        QVERIFY(i==i);
    -        QVERIFY(i!=i2);
    -        QVERIFY(ii);
    -        QVERIFY(i2>=i);
    -
    -        QhullPoint::ConstIterator i4= p.begin();
    -        QVERIFY(i==i4); // iterator COMP const_iterator
    -        QVERIFY(i<=i4);
    -        QVERIFY(i>=i4);
    -        QVERIFY(i4==i); // const_iterator COMP iterator
    -        QVERIFY(i4<=i);
    -        QVERIFY(i4>=i);
    -        QVERIFY(i>=i4);
    -        QVERIFY(i4<=i);
    -        QVERIFY(i2!=i4);
    -        QVERIFY(i2>i4);
    -        QVERIFY(i2>=i4);
    -        QVERIFY(i4!=i2);
    -        QVERIFY(i4i);
    -        QVERIFY(i4>=i);
    -
    -        i= p.begin();
    -        i2= p.begin();
    -        QCOMPARE(i, i2++);
    -        QCOMPARE(*i2, p[1]);
    -        QCOMPARE(++i, i2);
    -        QCOMPARE(i, i2--);
    -        QCOMPARE(i2, p.begin());
    -        QCOMPARE(--i, i2);
    -        QCOMPARE(i2 += 3, p.end());
    -        QCOMPARE(i2 -= 3, p.begin());
    -        QCOMPARE(i2+0, p.begin());
    -        QCOMPARE(i2+3, p.end());
    -        i2 += 3;
    -        i= i2-0;
    -        QCOMPARE(i, i2);
    -        i= i2-3;
    -        QCOMPARE(i, p.begin());
    -        QCOMPARE(i2-i, 3);
    -
    -        //p.begin end tested above
    -
    -        // QhullPoint is const-only
    -    }
    -}//t_iterator
    -
    -void QhullPoint_test::
    -t_const_iterator()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube,"QR0");  // rotated unit cube
    -        QhullPoint p= q.firstVertex().point();
    -        QhullPoint::ConstIterator i= p.begin();
    -        QhullPoint::const_iterator i2= p.begin();
    -        QVERIFY(i==i2);
    -        QVERIFY(i>=i2);
    -        QVERIFY(i<=i2);
    -        i= p.begin();
    -        QVERIFY(i==i2);
    -        i2= p.end();
    -        QVERIFY(i!=i2);
    -        double d3= *i;
    -        i2--;
    -        double d2= *i2;
    -        QCOMPARE(d3, p[0]);
    -        QCOMPARE(d2, p[2]);
    -        QhullPoint::ConstIterator i3(i2);
    -        QCOMPARE(*i2, *i3);
    -
    -        (i3= i)++;
    -        QCOMPARE((*i3), p[1]);
    -        QVERIFY(i==i);
    -        QVERIFY(i!=i2);
    -        QVERIFY(ii);
    -        QVERIFY(i2>=i);
    -
    -        // See t_iterator for const_iterator COMP iterator
    -
    -        i= p.begin();
    -        i2= p.constBegin();
    -        QCOMPARE(i, i2++);
    -        QCOMPARE(*i2, p[1]);
    -        QCOMPARE(++i, i2);
    -        QCOMPARE(i, i2--);
    -        QCOMPARE(i2, p.constBegin());
    -        QCOMPARE(--i, i2);
    -        QCOMPARE(i2+=3, p.constEnd());
    -        QCOMPARE(i2-=3, p.constBegin());
    -        QCOMPARE(i2+0, p.constBegin());
    -        QCOMPARE(i2+3, p.constEnd());
    -        i2 += 3;
    -        i= i2-0;
    -        QCOMPARE(i, i2);
    -        i= i2-3;
    -        QCOMPARE(i, p.constBegin());
    -        QCOMPARE(i2-i, 3);
    -
    -        // QhullPoint is const-only
    -    }
    -}//t_const_iterator
    -
    -void QhullPoint_test::
    -t_qhullpoint_iterator()
    -{
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"QR0");  // rotated unit cube
    -
    -    QhullPoint p2(q);
    -    QhullPointIterator i= p2;
    -    QCOMPARE(p2.dimension(), 3);
    -    QVERIFY(!i.hasNext());
    -    QVERIFY(!i.hasPrevious());
    -    i.toBack();
    -    QVERIFY(!i.hasNext());
    -    QVERIFY(!i.hasPrevious());
    -
    -    QhullPoint p = q.firstVertex().point();
    -    QhullPointIterator i2(p);
    -    QCOMPARE(p.dimension(), 3);
    -    i= p;
    -    QVERIFY(i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    QVERIFY(i.hasNext());
    -    QVERIFY(!i.hasPrevious());
    -    i2.toBack();
    -    i.toFront();
    -    QVERIFY(!i2.hasNext());
    -    QVERIFY(i2.hasPrevious());
    -    QVERIFY(i.hasNext());
    -    QVERIFY(!i.hasPrevious());
    -
    -    // i at front, i2 at end/back, 3 coordinates
    -    QCOMPARE(i.peekNext(), p[0]);
    -    QCOMPARE(i2.peekPrevious(), p[2]);
    -    QCOMPARE(i2.previous(), p[2]);
    -    QCOMPARE(i2.previous(), p[1]);
    -    QCOMPARE(i2.previous(), p[0]);
    -    QVERIFY(!i2.hasPrevious());
    -    QCOMPARE(i.peekNext(), p[0]);
    -    // i.peekNext()= 1.0; // compiler error, i is const
    -    QCOMPARE(i.next(), p[0]);
    -    QCOMPARE(i.peekNext(), p[1]);
    -    QCOMPARE(i.next(), p[1]);
    -    QCOMPARE(i.next(), p[2]);
    -    QVERIFY(!i.hasNext());
    -    i.toFront();
    -    QCOMPARE(i.next(), p[0]);
    -}//t_qhullpoint_iterator
    -
    -void QhullPoint_test::
    -t_method()
    -{
    -    // advancePoint tested above
    -    RboxPoints rcube("c");
    -    Qhull q(rcube, "");
    -    QhullPoint p = q.firstVertex().point();
    -    double dist= p.distance(q.origin());
    -    QCOMPARE(dist, sqrt(double(2.0+1.0))/2); // half diagonal of unit cube
    -}//t_qhullpoint_iterator
    -
    -void QhullPoint_test::
    -t_io()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube, "");
    -        QhullPoint p= q.beginVertex().point();
    -        ostringstream os;
    -        os << "Point:\n";
    -        os << p;
    -        os << "Point w/ print:\n";
    -        os << p.print(" message ");
    -        os << p.printWithIdentifier(" Point with id and a message ");
    -        cout << os.str();
    -        QString s= QString::fromStdString(os.str());
    -        QCOMPARE(s.count("p"), 2);
    -    }
    -}//t_io
    -
    -}//orgQhull
    -
    -#include "moc/QhullPoint_test.moc"
    diff --git a/src/qhull/src/qhulltest/QhullPoints_test.cpp b/src/qhull/src/qhulltest/QhullPoints_test.cpp
    deleted file mode 100644
    index c2d8347e28b..00000000000
    --- a/src/qhull/src/qhulltest/QhullPoints_test.cpp
    +++ /dev/null
    @@ -1,561 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (p) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/QhullPoints_test.cpp#3 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -//pre-compiled header
    -#include 
    -#include "qhulltest/RoadTest.h" // QT_VERSION
    -
    -#include "libqhullcpp/QhullPoints.h"
    -#include "libqhullcpp/RboxPoints.h"
    -#include "libqhullcpp/Qhull.h"
    -
    -using std::cout;
    -using std::endl;
    -using std::ostringstream;
    -
    -namespace orgQhull {
    -
    -class QhullPoints_test : public RoadTest
    -{
    -    Q_OBJECT
    -
    -#//!\name Test slots
    -private slots:
    -    void cleanup();
    -    void t_construct_q();
    -    void t_construct_qh();
    -    void t_convert();
    -    void t_getset();
    -    void t_element();
    -    void t_iterator();
    -    void t_const_iterator();
    -    void t_search();
    -    void t_points_iterator();
    -    void t_io();
    -};//QhullPoints_test
    -
    -void
    -add_QhullPoints_test()
    -{
    -    new QhullPoints_test();  // RoadTest::s_testcases
    -}
    -
    -//Executed after each testcase
    -void QhullPoints_test::
    -cleanup()
    -{
    -    RoadTest::cleanup();
    -}
    -
    -void QhullPoints_test::
    -t_construct_q()
    -{
    -    Qhull q;
    -    QhullPoints ps(q);
    -    QCOMPARE(ps.dimension(), 0);
    -    QVERIFY(ps.isEmpty());
    -    QCOMPARE(ps.count(), 0);
    -    QCOMPARE(ps.size(), 0u);
    -    QCOMPARE(ps.coordinateCount(), 0);
    -    coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
    -    QhullPoints ps2(q);
    -    ps2.defineAs(2, 6, c);
    -    QCOMPARE(ps2.dimension(), 2);
    -    QVERIFY(!ps2.isEmpty());
    -    QCOMPARE(ps2.count(), 3);
    -    QCOMPARE(ps2.size(), 3u);
    -    QCOMPARE(ps2.coordinates(), c);
    -    QhullPoints ps3(q, 2, 6, c);
    -    QCOMPARE(ps3.dimension(), 2);
    -    QVERIFY(!ps3.isEmpty());
    -    QCOMPARE(ps3.coordinates(), ps2.coordinates());
    -    QVERIFY(ps3==ps2);
    -    QVERIFY(ps3!=ps);
    -    QhullPoints ps4= ps3;
    -    QVERIFY(ps4==ps3);
    -    // ps4= ps3; //compiler error
    -    QhullPoints ps5(ps4);
    -    QVERIFY(ps5==ps4);
    -    QVERIFY(!(ps5!=ps4));
    -    coordT c2[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
    -    QhullPoints ps6(q, 2, 6, c2);
    -    QVERIFY(ps6==ps2);
    -
    -    RboxPoints rbox("c D2");
    -    Qhull q2(rbox, "");
    -    QhullPoints ps8(q2);
    -    QCOMPARE(ps8.dimension(), 2);
    -    QCOMPARE(ps8.count(), 0);
    -    QCOMPARE(ps8.size(), 0u);
    -    QCOMPARE(ps8.coordinateCount(), 0);
    -    coordT c3[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
    -    QhullPoints ps9(q2, 6, c3);
    -    QCOMPARE(ps9.dimension(), 2);
    -    QCOMPARE(ps9.coordinateCount(), 6);
    -    QCOMPARE(ps9.count(), 3);
    -    QCOMPARE(ps9.coordinates(), c3);
    -    QCOMPARE(ps9, ps2);  // DISTround
    -    c3[1]= 1.0+1e-17;
    -    QCOMPARE(ps9, ps2);  // DISTround
    -    c3[1]= 1.0+1e-15;
    -    QVERIFY(ps9!=ps2);  // DISTround
    -
    -    ps9.defineAs(6, c2);
    -    QCOMPARE(ps9.dimension(), 2);
    -    QCOMPARE(ps9.coordinateCount(), 6);
    -    QCOMPARE(ps9.count(), 3);
    -    QCOMPARE(ps9.coordinates(), c2);
    -}//t_construct_q
    -
    -void QhullPoints_test::
    -t_construct_qh()
    -{
    -    Qhull q;
    -    QhullQh *qh= q.qh();
    -    QhullPoints ps(qh);
    -    QCOMPARE(ps.dimension(), 0);
    -    QVERIFY(ps.isEmpty());
    -    QCOMPARE(ps.count(), 0);
    -    QCOMPARE(ps.size(), 0u);
    -    QCOMPARE(ps.coordinateCount(), 0);
    -    coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
    -    QhullPoints ps2(qh);
    -    ps2.defineAs(2, 6, c);
    -    QCOMPARE(ps2.dimension(), 2);
    -    QVERIFY(!ps2.isEmpty());
    -    QCOMPARE(ps2.count(), 3);
    -    QCOMPARE(ps2.size(), 3u);
    -    QCOMPARE(ps2.coordinates(), c);
    -    QhullPoints ps3(qh, 2, 6, c);
    -    QCOMPARE(ps3.dimension(), 2);
    -    QVERIFY(!ps3.isEmpty());
    -    QCOMPARE(ps3.coordinates(), ps2.coordinates());
    -    QVERIFY(ps3==ps2);
    -    QVERIFY(ps3!=ps);
    -    QhullPoints ps4= ps3;
    -    QVERIFY(ps4==ps3);
    -    // ps4= ps3; //compiler error
    -    QhullPoints ps5(ps4);
    -    QVERIFY(ps5==ps4);
    -    QVERIFY(!(ps5!=ps4));
    -    coordT c2[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
    -    QhullPoints ps6(qh, 2, 6, c2);
    -    QVERIFY(ps6==ps2);
    -
    -    RboxPoints rbox("c D2");
    -    Qhull q2(rbox, "");
    -    QhullPoints ps8(q2.qh());
    -    QCOMPARE(ps8.dimension(), 2);
    -    QCOMPARE(ps8.count(), 0);
    -    QCOMPARE(ps8.size(), 0u);
    -    QCOMPARE(ps8.coordinateCount(), 0);
    -    coordT c3[]= {10.0, 11.0, 12.0, 13.0, 14.0, 15.0};
    -    QhullPoints ps9(q2.qh(), 6, c3);
    -    QCOMPARE(ps9.dimension(), 2);
    -    QCOMPARE(ps9.coordinateCount(), 6);
    -    QCOMPARE(ps9.count(), 3);
    -    QCOMPARE(ps9.coordinates(), c3);
    -    ps9.defineAs(6, c2);
    -    QCOMPARE(ps9.dimension(), 2);
    -    QCOMPARE(ps9.coordinateCount(), 6);
    -    QCOMPARE(ps9.count(), 3);
    -    QCOMPARE(ps9.coordinates(), c2);
    -}//t_construct_qh
    -
    -void QhullPoints_test::
    -t_convert()
    -{
    -    Qhull q;
    -    //defineAs tested above
    -    coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
    -    QhullPoints ps(q, 3, 6, c);
    -    QCOMPARE(ps.dimension(), 3);
    -    QCOMPARE(ps.size(), 2u);
    -    const coordT *c2= ps.constData();
    -    QCOMPARE(c, c2);
    -    const coordT *c3= ps.data();
    -    QCOMPARE(c, c3);
    -    coordT *c4= ps.data();
    -    QCOMPARE(c, c4);
    -    std::vector vs= ps.toStdVector();
    -    QCOMPARE(vs.size(), 2u);
    -    QhullPoint p= vs[1];
    -    QCOMPARE(p[2], 5.0);
    -    QList qs= ps.toQList();
    -    QCOMPARE(qs.size(), 2);
    -    QhullPoint p2= qs[1];
    -    QCOMPARE(p2[2], 5.0);
    -}//t_convert
    -
    -void QhullPoints_test::
    -t_getset()
    -{
    -    Qhull q;
    -    //See t_construct for coordinates, count, defineAs, dimension, isempty, ==, !=, size
    -    coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
    -    QhullPoints ps(q, 3, 6, c);
    -    QhullPoints ps2(q, 3, 6, c);
    -    QCOMPARE(ps2.dimension(), 3);
    -    QCOMPARE(ps2.coordinates(), c);
    -    QCOMPARE(ps2.count(), 2);
    -    QCOMPARE(ps2.coordinateCount(), 6);
    -    coordT c2[]= {-1.0, -2.0, -3.0, -4.0, -5.0, -6.0};
    -    ps2.defineAs(6, c2);
    -    QCOMPARE(ps2.coordinates(), c2);
    -    QCOMPARE(ps2.count(), 2);
    -    QCOMPARE(ps2.size(), 2u);
    -    QCOMPARE(ps2.dimension(), 3);
    -    QVERIFY(!ps2.isEmpty());
    -    QVERIFY(ps!=ps2);
    -    // ps2= ps; // assignment not available, compiler error
    -    ps2.defineAs(ps);
    -    QVERIFY(ps==ps2);
    -    ps2.setDimension(2);
    -    QCOMPARE(ps2.dimension(), 2);
    -    QCOMPARE(ps2.coordinates(), c);
    -    QVERIFY(!ps2.isEmpty());
    -    QCOMPARE(ps2.count(), 3);
    -    QCOMPARE(ps2.size(), 3u);
    -    QVERIFY(ps!=ps2);
    -    QhullPoints ps3(ps2);
    -    ps3.setDimension(3);
    -    ps3.defineAs(5, c2);
    -    QCOMPARE(ps3.count(), 1);
    -    QCOMPARE(ps3.extraCoordinatesCount(), 2);
    -    QCOMPARE(ps3.extraCoordinates()[0], -4.0);
    -    QVERIFY(ps3.includesCoordinates(ps3.data()));
    -    QVERIFY(ps3.includesCoordinates(ps3.data()+ps3.count()-1));
    -    QVERIFY(!ps3.includesCoordinates(ps3.data()-1));
    -    QVERIFY(!ps3.includesCoordinates(ps3.data()+ps3.coordinateCount()));
    -}//t_getset
    -
    -
    -void QhullPoints_test::
    -t_element()
    -{
    -    Qhull q;
    -    coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
    -    QhullPoints ps(q, 2, 6, c);
    -    QCOMPARE(ps.count(), 3);
    -    QhullPoint p(q, 2, c);
    -    QCOMPARE(ps[0], p);
    -    QCOMPARE(ps.at(1), ps[1]);
    -    QCOMPARE(ps.first(), p);
    -    QCOMPARE(ps.front(), ps.first());
    -    QCOMPARE(ps.last(), ps.at(2));
    -    QCOMPARE(ps.back(), ps.last());
    -    QhullPoints ps2= ps.mid(2);
    -    QCOMPARE(ps2.count(), 1);
    -    QhullPoints ps3= ps.mid(3);
    -    QVERIFY(ps3.isEmpty());
    -    QhullPoints ps4= ps.mid(10);
    -    QVERIFY(ps4.isEmpty());
    -    QhullPoints ps5= ps.mid(-1);
    -    QVERIFY(ps5.isEmpty());
    -    QhullPoints ps6= ps.mid(1, 1);
    -    QCOMPARE(ps6.count(), 1);
    -    QCOMPARE(ps6[0], ps[1]);
    -    QhullPoints ps7= ps.mid(1, 10);
    -    QCOMPARE(ps7.count(), 2);
    -    QCOMPARE(ps7[1], ps[2]);
    -    QhullPoint p8(q);
    -    QCOMPARE(ps.value(2), ps[2]);
    -    QCOMPARE(ps.value(-1), p8);
    -    QCOMPARE(ps.value(3), p8);
    -    QCOMPARE(ps.value(3, p), p);
    -    QVERIFY(ps.value(1, p)!=p);
    -    foreach(QhullPoint p9, ps){  // Qt only
    -        QCOMPARE(p9.dimension(), 2);
    -        QVERIFY(p9[0]==0.0 || p9[0]==2.0 || p9[0]==4.0);
    -    }
    -}//t_element
    -
    -void QhullPoints_test::
    -t_iterator()
    -{
    -    Qhull q;
    -    coordT c[]= {0.0, 1.0, 2.0};
    -    QhullPoints ps(q, 1, 3, c);
    -    QCOMPARE(ps.dimension(), 1);
    -    QhullPoints::Iterator i(ps);
    -    QhullPoints::iterator i2= ps.begin();
    -    QVERIFY(i==i2);
    -    QVERIFY(i>=i2);
    -    QVERIFY(i<=i2);
    -    i= ps.begin();
    -    QVERIFY(i==i2);
    -    i2= ps.end();
    -    QVERIFY(i!=i2);
    -    QhullPoint p(i); // QhullPoint is the base class for QhullPoints::iterator
    -    QCOMPARE(p.dimension(), ps.dimension());
    -    QCOMPARE(p.coordinates(), ps.coordinates());
    -    i2--;
    -    QhullPoint p2= *i2;
    -    QCOMPARE(p[0], 0.0);
    -    QCOMPARE(p2[0], 2.0);
    -    QhullPoints::Iterator i5(i2);
    -    QCOMPARE(*i2, *i5);
    -    coordT c3[]= {0.0, -1.0, -2.0};
    -    QhullPoints::Iterator i3(q, 1, c3);
    -    QVERIFY(i!=i3);
    -    QCOMPARE(*i, *i3);
    -
    -    (i3= i)++;
    -    QCOMPARE((*i3)[0], 1.0);
    -    QCOMPARE(i3->dimension(), 1);
    -    QCOMPARE(i3[0][0], 1.0);
    -    QCOMPARE(i3[0], ps[1]);
    -
    -    QVERIFY(i==i);
    -    QVERIFY(i!=i2);
    -    QVERIFY(ii);
    -    QVERIFY(i2>=i);
    -
    -    QhullPoints::ConstIterator i4(q, 1, c);
    -    QVERIFY(i==i4); // iterator COMP const_iterator
    -    QVERIFY(i<=i4);
    -    QVERIFY(i>=i4);
    -    QVERIFY(i4==i); // const_iterator COMP iterator
    -    QVERIFY(i4<=i);
    -    QVERIFY(i4>=i);
    -    QVERIFY(i>=i4);
    -    QVERIFY(i4<=i);
    -    QVERIFY(i2!=i4);
    -    QVERIFY(i2>i4);
    -    QVERIFY(i2>=i4);
    -    QVERIFY(i4!=i2);
    -    QVERIFY(i4i);
    -    QVERIFY(i4>=i);
    -
    -    i= ps.begin();
    -    i2= ps.begin();
    -    QCOMPARE(i, i2++);
    -    QCOMPARE(*i2, ps[1]);
    -    QCOMPARE(++i, i2);
    -    QCOMPARE(i, i2--);
    -    QCOMPARE(i2, ps.begin());
    -    QCOMPARE(--i, i2);
    -    QCOMPARE(i2+=3, ps.end());
    -    QCOMPARE(i2-=3, ps.begin());
    -    QCOMPARE(i2+0, ps.begin());
    -    QCOMPARE(i2+3, ps.end());
    -    i2 += 3;
    -    i= i2-0;
    -    QCOMPARE(i, i2);
    -    i= i2-3;
    -    QCOMPARE(i, ps.begin());
    -    QCOMPARE(i2-i, 3);
    -
    -    //ps.begin end tested above
    -
    -    // QhullPoints is const-only
    -}//t_iterator
    -
    -void QhullPoints_test::
    -t_const_iterator()
    -{
    -    Qhull q;
    -    coordT c[]= {0.0, 1.0, 2.0};
    -    const QhullPoints ps(q, 1, 3, c);
    -    QhullPoints::ConstIterator i(ps);
    -    QhullPoints::const_iterator i2= ps.begin();
    -    QVERIFY(i==i2);
    -    QVERIFY(i>=i2);
    -    QVERIFY(i<=i2);
    -    i= ps.begin();
    -    QVERIFY(i==i2);
    -    i2= ps.end();
    -    QVERIFY(i!=i2);
    -    QhullPoint p(i);
    -    QCOMPARE(p.dimension(), ps.dimension());
    -    QCOMPARE(p.coordinates(), ps.coordinates());
    -    i2--;
    -    QhullPoint p2= *i2;
    -    QCOMPARE(p[0], 0.0);
    -    QCOMPARE(p2[0], 2.0);
    -    QhullPoints::ConstIterator i5(i2);
    -    QCOMPARE(*i2, *i5);
    -    coordT c3[]= {0.0, -1.0, -2.0};
    -    QhullPoints::ConstIterator i3(q, 1, c3);
    -    QVERIFY(i!=i3);
    -    QCOMPARE(*i, *i3);
    -
    -    (i3= i)++;
    -    QCOMPARE((*i3)[0], 1.0);
    -    QCOMPARE(i3->dimension(), 1);
    -    QCOMPARE(i3[0][0], 1.0);
    -    QCOMPARE(i3[0][0], 1.0);
    -    QCOMPARE(i3[0], ps[1]);
    -
    -    QVERIFY(i==i);
    -    QVERIFY(i!=i2);
    -    QVERIFY(ii);
    -    QVERIFY(i2>=i);
    -
    -    // See t_iterator for const_iterator COMP iterator
    -
    -    i= ps.begin();
    -    i2= ps.constBegin();
    -    QCOMPARE(i, i2++);
    -    QCOMPARE(*i2, ps[1]);
    -    QCOMPARE(++i, i2);
    -    QCOMPARE(i, i2--);
    -    QCOMPARE(i2, ps.constBegin());
    -    QCOMPARE(--i, i2);
    -    QCOMPARE(i2+=3, ps.constEnd());
    -    QCOMPARE(i2-=3, ps.constBegin());
    -    QCOMPARE(i2+0, ps.constBegin());
    -    QCOMPARE(i2+3, ps.constEnd());
    -    i2 += 3;
    -    i= i2-0;
    -    QCOMPARE(i, i2);
    -    i= i2-3;
    -    QCOMPARE(i, ps.constBegin());
    -    QCOMPARE(i2-i, 3);
    -
    -    // QhullPoints is const-only
    -}//t_const_iterator
    -
    -
    -void QhullPoints_test::
    -t_search()
    -{
    -    Qhull q;
    -    coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 0, 1};
    -    QhullPoints ps(q, 2, 8, c); //2-d array of 4 points
    -    QhullPoint p= ps.first();
    -    QhullPoint p2= ps.last();
    -    QVERIFY(ps.contains(p));
    -    QVERIFY(ps.contains(p2));
    -    QVERIFY(p==p2);
    -    QhullPoint p5= ps[2];
    -    QVERIFY(p!=p5);
    -    QVERIFY(ps.contains(p5));
    -    coordT c2[]= {0.0, 1.0, 2.0, 3.0};
    -    QhullPoint p3(q, 2, c2); //2-d point
    -    QVERIFY(ps.contains(p3));
    -    QhullPoint p4(q, 3, c2); //3-d point
    -    QVERIFY(!ps.contains(p4));
    -    p4.defineAs(2, c); //2-d point
    -    QVERIFY(ps.contains(p4));
    -    p4.defineAs(2, c+1); //2-d point
    -    QVERIFY(!ps.contains(p4));
    -    QhullPoint p6(q, 2, c2+2); //2-d point
    -    QCOMPARE(ps.count(p), 2);
    -    QCOMPARE(ps.count(p2), 2);
    -    QCOMPARE(ps.count(p3), 2);
    -    QCOMPARE(ps.count(p4), 0);
    -    QCOMPARE(ps.count(p6), 1);
    -    QCOMPARE(ps.indexOf(&ps[0][0]), 0);
    -    //QCOMPARE(ps.indexOf(ps.end()), -1); //ps.end() is a QhullPoint which may match
    -    QCOMPARE(ps.indexOf(0), -1);
    -    QCOMPARE(ps.indexOf(&ps[3][0]), 3);
    -    QCOMPARE(ps.indexOf(&ps[3][1], QhullError::NOthrow), 3);
    -    QCOMPARE(ps.indexOf(ps.data()+ps.coordinateCount(), QhullError::NOthrow), -1);
    -    QCOMPARE(ps.indexOf(p), 0);
    -    QCOMPARE(ps.indexOf(p2), 0);
    -    QCOMPARE(ps.indexOf(p3), 0);
    -    QCOMPARE(ps.indexOf(p4), -1);
    -    QCOMPARE(ps.indexOf(p5), 2);
    -    QCOMPARE(ps.indexOf(p6), 1);
    -    QCOMPARE(ps.lastIndexOf(p), 3);
    -    QCOMPARE(ps.lastIndexOf(p4), -1);
    -    QCOMPARE(ps.lastIndexOf(p6), 1);
    -    QhullPoints ps3(q);
    -    QCOMPARE(ps3.indexOf(ps3.data()), -1);
    -    QCOMPARE(ps3.indexOf(ps3.data()+1, QhullError::NOthrow), -1);
    -    QCOMPARE(ps3.indexOf(p), -1);
    -    QCOMPARE(ps3.lastIndexOf(p), -1);
    -    QhullPoints ps4(q, 2, 0, c);
    -    QCOMPARE(ps4.indexOf(p), -1);
    -    QCOMPARE(ps4.lastIndexOf(p), -1);
    -}//t_search
    -
    -void QhullPoints_test::
    -t_points_iterator()
    -{
    -    Qhull q;
    -    coordT c2[]= {0.0};
    -    QhullPoints ps2(q, 0, 0, c2); // 0-dimensional
    -    QhullPointsIterator i2= ps2;
    -    QVERIFY(!i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    i2.toBack();
    -    QVERIFY(!i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -
    -    coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
    -    QhullPoints ps(q, 3, 6, c); // 3-dimensional
    -    QhullPointsIterator i(ps);
    -    i2= ps;
    -    QVERIFY(i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    QVERIFY(i.hasNext());
    -    QVERIFY(!i.hasPrevious());
    -    i2.toBack();
    -    i.toFront();
    -    QVERIFY(!i2.hasNext());
    -    QVERIFY(i2.hasPrevious());
    -    QVERIFY(i.hasNext());
    -    QVERIFY(!i.hasPrevious());
    -
    -    QhullPoint p= ps[0];
    -    QhullPoint p2(ps[0]);
    -    QCOMPARE(p, p2);
    -    QVERIFY(p==p2);
    -    QhullPoint p3(ps[1]);
    - // p2[0]= 0.0;
    -    QVERIFY(p==p2);
    -    QCOMPARE(i2.peekPrevious(), p3);
    -    QCOMPARE(i2.previous(), p3);
    -    QCOMPARE(i2.previous(), p);
    -    QVERIFY(!i2.hasPrevious());
    -    QCOMPARE(i.peekNext(), p);
    -    // i.peekNext()= 1.0; // compiler error
    -    QCOMPARE(i.next(), p);
    -    QCOMPARE(i.peekNext(), p3);
    -    QCOMPARE(i.next(), p3);
    -    QVERIFY(!i.hasNext());
    -    i.toFront();
    -    QCOMPARE(i.next(), p);
    -}//t_points_iterator
    -
    -void QhullPoints_test::
    -t_io()
    -{
    -    Qhull q;
    -    QhullPoints ps(q);
    -    ostringstream os;
    -    os << "Empty QhullPoints\n" << ps << endl;
    -    coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
    -    QhullPoints ps2(q, 3, 6, c); // 3-dimensional explicit
    -    os << "QhullPoints from c[]\n" << ps2 << endl;
    -
    -    RboxPoints rcube("c");
    -    Qhull q2(rcube,"Qt QR0");  // triangulation of rotated unit cube
    -    QhullPoints ps3= q2.points();
    -    os << "QhullPoints\n" << ps3;
    -    os << ps3.print("message\n");
    -    os << ps3.printWithIdentifier("w/ identifiers\n");
    -    cout << os.str();
    -    QString s= QString::fromStdString(os.str());
    -    QCOMPARE(s.count("p"), 8+1);
    -}//t_io
    -
    -}//orgQhull
    -
    -#include "moc/QhullPoints_test.moc"
    diff --git a/src/qhull/src/qhulltest/QhullRidge_test.cpp b/src/qhull/src/qhulltest/QhullRidge_test.cpp
    deleted file mode 100644
    index 420a7f06d3a..00000000000
    --- a/src/qhull/src/qhulltest/QhullRidge_test.cpp
    +++ /dev/null
    @@ -1,159 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/QhullRidge_test.cpp#3 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -//pre-compiled headers
    -#include 
    -#include "RoadTest.h" // QT_VERSION
    -
    -#include "libqhullcpp/QhullRidge.h"
    -#include "libqhullcpp/QhullError.h"
    -#include "libqhullcpp/RboxPoints.h"
    -#include "libqhullcpp/QhullFacet.h"
    -#include "libqhullcpp/Qhull.h"
    -
    -using std::cout;
    -using std::endl;
    -using std::ostringstream;
    -using std::ostream;
    -using std::string;
    -
    -namespace orgQhull {
    -
    -class QhullRidge_test : public RoadTest
    -{
    -    Q_OBJECT
    -
    -#//!\name Test slots
    -private slots:
    -    void cleanup();
    -    void t_construct();
    -    void t_getSet();
    -    void t_foreach();
    -    void t_io();
    -};//QhullRidge_test
    -
    -void
    -add_QhullRidge_test()
    -{
    -    new QhullRidge_test();  // RoadTest::s_testcases
    -}
    -
    -//Executed after each testcase
    -void QhullRidge_test::
    -cleanup()
    -{
    -    RoadTest::cleanup();
    -}
    -
    -void QhullRidge_test::
    -t_construct()
    -{
    -    // Qhull.runQhull() constructs QhullFacets as facetT
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"QR0");  // triangulation of rotated unit cube
    -    QhullRidge r(q);
    -    QVERIFY(!r.isValid());
    -    QCOMPARE(r.dimension(),2);
    -    QhullFacet f(q.firstFacet());
    -    QhullRidgeSet rs(f.ridges());
    -    QVERIFY(!rs.isEmpty()); // Simplicial facets do not have ridges()
    -    QhullRidge r2(rs.first());
    -    QCOMPARE(r2.dimension(), 2); // One dimension lower than the facet
    -    r= r2;
    -    QVERIFY(r.isValid());
    -    QCOMPARE(r.dimension(), 2);
    -    QhullRidge r3(q, r2.getRidgeT());
    -    QCOMPARE(r,r3);
    -    QhullRidge r4(q, r2.getBaseT());
    -    QCOMPARE(r,r4);
    -    QhullRidge r5= r2; // copy constructor
    -    QVERIFY(r5==r2);
    -    QVERIFY(r5==r);
    -}//t_construct
    -
    -void QhullRidge_test::
    -t_getSet()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube,"QR0");  // triangulation of rotated unit cube
    -        QCOMPARE(q.facetCount(), 6);
    -        QCOMPARE(q.vertexCount(), 8);
    -        QhullFacet f(q.firstFacet());
    -        QhullRidgeSet rs= f.ridges();
    -        QhullRidgeSetIterator i(rs);
    -        while(i.hasNext()){
    -            const QhullRidge r= i.next();
    -            cout << r.id() << endl;
    -            QVERIFY(r.bottomFacet()!=r.topFacet());
    -            QCOMPARE(r.dimension(), 2); // Ridge one-dimension less than facet
    -            QVERIFY(r.id()>=0 && r.id()<9*27);
    -            QVERIFY(r.isValid());
    -            QVERIFY(r==r);
    -            QVERIFY(r==i.peekPrevious());
    -            QCOMPARE(r.otherFacet(r.bottomFacet()),r.topFacet());
    -            QCOMPARE(r.otherFacet(r.topFacet()),r.bottomFacet());
    -        }
    -    }
    -}//t_getSet
    -
    -void QhullRidge_test::
    -t_foreach()
    -{
    -    RboxPoints rcube("c");  // cube
    -    {
    -        Qhull q(rcube, "QR0"); // rotated cube
    -        QhullFacet f(q.firstFacet());
    -        foreach (const QhullRidge &r, f.ridges()){  // Qt only
    -            QhullVertexSet vs= r.vertices();
    -            QCOMPARE(vs.count(), 2);
    -            foreach (const QhullVertex &v, vs){  // Qt only
    -                QVERIFY(f.vertices().contains(v));
    -            }
    -        }
    -        QhullRidgeSet rs= f.ridges();
    -        QhullRidge r= rs.first();
    -        QhullRidge r2= r;
    -        QList vs;
    -        int count= 0;
    -        while(!count || r2!=r){
    -            ++count;
    -            QhullVertex v(q);
    -            QVERIFY2(r2.hasNextRidge3d(f),"A cube should only have non-simplicial facets.");
    -            QhullRidge r3= r2.nextRidge3d(f, &v);
    -            QVERIFY(!vs.contains(v));
    -            vs << v;
    -            r2= r2.nextRidge3d(f);
    -            QCOMPARE(r3, r2);
    -        }
    -        QCOMPARE(vs.count(), rs.count());
    -        QCOMPARE(count, rs.count());
    -    }
    -}//t_foreach
    -
    -void QhullRidge_test::
    -t_io()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube, "");
    -        QhullFacet f(q.firstFacet());
    -        QhullRidgeSet rs= f.ridges();
    -        QhullRidge r= rs.first();
    -        ostringstream os;
    -        os << "Ridges\n" << rs << "Ridge\n" << r;
    -        os << r.print("\nRidge with message");
    -        cout << os.str();
    -        QString s= QString::fromStdString(os.str());
    -        QCOMPARE(s.count(" r"), 6);
    -    }
    -}//t_io
    -
    -}//orgQhull
    -
    -#include "moc/QhullRidge_test.moc"
    diff --git a/src/qhull/src/qhulltest/QhullSet_test.cpp b/src/qhull/src/qhulltest/QhullSet_test.cpp
    deleted file mode 100644
    index 87fcf4acf2e..00000000000
    --- a/src/qhull/src/qhulltest/QhullSet_test.cpp
    +++ /dev/null
    @@ -1,434 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2009-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/QhullSet_test.cpp#3 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -//pre-compiled headers
    -#include 
    -#include "RoadTest.h" // QT_VERSION
    -
    -#include "libqhullcpp/QhullRidge.h"
    -#include "libqhullcpp/QhullFacetSet.h"
    -#include "libqhullcpp/Qhull.h"
    -#include "libqhullcpp/RboxPoints.h"
    -
    -#include 
    -
    -using std::cout;
    -using std::endl;
    -
    -namespace orgQhull {
    -
    -class QhullSet_test : public RoadTest
    -{
    -    Q_OBJECT
    -
    -#//!\name Test slots
    -private slots:
    -    void cleanup();
    -    void t_qhullsetbase();
    -    void t_convert();
    -    void t_element();
    -    void t_search();
    -    void t_iterator();
    -    void t_const_iterator();
    -    void t_qhullset_iterator();
    -    void t_io();
    -};//QhullSet_test
    -
    -void
    -add_QhullSet_test()
    -{
    -    new QhullSet_test();  // RoadTest::s_testcases
    -}
    -
    -//Executed after each testcase
    -void QhullSet_test::
    -cleanup()
    -{
    -    RoadTest::cleanup();
    -}
    -
    -// Test QhullFacetSet and QhullSet.
    -// Use QhullRidgeSet to test methods overloaded by QhullFacetSet
    -
    -void QhullSet_test::
    -t_qhullsetbase()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube,"QR0");  // triangulation of rotated unit cube
    -        // Fake an empty set.  Default constructor not defined.  No memory allocation.
    -        QhullFacet f4 = q.beginFacet();
    -        QhullFacetSet fs = f4.neighborFacets();
    -        fs.defineAs(q.qh()->other_points); // Force an empty set
    -        QVERIFY(fs.isEmpty());
    -        QCOMPARE(fs.count(), 0);
    -        QCOMPARE(fs.size(), 0u);
    -        QCOMPARE(fs.begin(), fs.end()); // beginPointer(), endPointer()
    -        QVERIFY(QhullSetBase::isEmpty(fs.getSetT()));
    -
    -        QhullRidgeSet rs = f4.ridges();
    -        QVERIFY(!rs.isEmpty());
    -        QCOMPARE(rs.count(), 4);
    -        QCOMPARE(rs.size(), 4u);
    -        QVERIFY(rs.begin()!=rs.end());
    -        QVERIFY(!QhullSetBase::isEmpty(rs.getSetT()));
    -        QhullRidgeSet rs2= rs; // copy constructor
    -        // rs= rs2; // disabled.  Would not copy ridges
    -        QCOMPARE(rs2, rs);
    -
    -        QCOMPARE(q.facetCount(), 6);
    -        QhullFacet f = q.beginFacet();
    -        QhullFacetSet fs2 = f.neighborFacets();
    -        QCOMPARE(fs2.count(), 4);
    -        QCOMPARE(fs2.size(), 4u);
    -        QVERIFY(!fs2.isEmpty());
    -        QVERIFY(!QhullSetBase::isEmpty(fs2.getSetT()));
    -        QVERIFY(fs!=fs2);
    -        setT *s= fs2.getSetT();
    -        fs.defineAs(s);
    -        QVERIFY(fs==fs2);
    -        QCOMPARE(fs[1], fs2[1]); // elementPointer
    -        QhullFacetSet fs3(fs2);
    -        QVERIFY(fs3==fs);
    -        // fs= fs2; // disabled.  Would not copy facets
    -        QhullFacetSet fs4= fs2; // copy constructor
    -        QVERIFY(fs4==fs2);
    -    }
    -}//t_qhullsetbase
    -
    -// constructors tested by t_qhullsetbase
    -
    -void QhullSet_test::
    -t_convert()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube,"QR0");  // rotated unit cube
    -        QhullFacet f= q.firstFacet();
    -        f= f.next();
    -        QhullRidgeSet rs= f.ridges();
    -        QCOMPARE(rs.count(),4);
    -        std::vector rv= rs.toStdVector();
    -        QCOMPARE(rv.size(), 4u);
    -        QList rv2= rs.toQList();
    -        QCOMPARE(rv2.size(), 4);
    -        std::vector::iterator i= rv.begin();
    -        foreach(QhullRidge r, rv2){  // Qt only
    -            QhullRidge r2= *i++;
    -            QCOMPARE(r, r2);
    -        }
    -
    -        Qhull q2(rcube,"Qt QR0");  // triangulation of rotated unit cube
    -        QCOMPARE(q2.facetCount(), 12);
    -        QhullFacet f2 = q2.beginFacet();
    -        QhullFacetSet fs = f2.neighborFacets();
    -        QCOMPARE(fs.size(), 3U);
    -        std::vector vs= fs.toStdVector();
    -        QCOMPARE(vs.size(), fs.size());
    -        for(int k= fs.count(); k--; ){
    -            QCOMPARE(vs[k], fs[k]);
    -        }
    -        QList qv= fs.toQList();
    -        QCOMPARE(qv.count(), fs.count());
    -        for(int k= fs.count(); k--; ){
    -            QCOMPARE(qv[k], fs[k]);
    -        }
    -    }
    -}//t_convert
    -
    -//ReadOnly (count, isEmpty) tested by t_convert
    -//  operator== tested by t_search
    -
    -void QhullSet_test::
    -t_element()
    -{
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"QR0");  // rotated unit cube
    -    QhullFacet f = q.beginFacet();
    -    QhullFacetSet fs = f.neighborFacets();
    -
    -    QCOMPARE(fs.at(1), fs[1]);
    -    QCOMPARE(fs.first(), fs[0]);
    -    QCOMPARE(fs.front(), fs.first());
    -    QCOMPARE(fs.last(), fs.at(3));
    -    QCOMPARE(fs.back(), fs.last());
    -    facetT **d = fs.data();
    -    facetT * const *d2= fs.data();
    -    facetT * const *d3= fs.constData();
    -    QVERIFY(d==d2);
    -    QVERIFY(d2==d3);
    -    QCOMPARE(QhullFacet(q, *d), fs.first());
    -    QhullFacetSet::iterator i(q.qh(), d+4);
    -    QCOMPARE(i, fs.end());
    -    QCOMPARE(d[4], static_cast(0));
    -    QhullFacet f4(q, d[4]);
    -    QVERIFY(!f4.isValid());
    -    QCOMPARE(fs.second(), fs[1]);
    -    const QhullFacet f2= fs.second();
    -    QVERIFY(f2==fs[1]);
    -    const QhullFacet f3= fs[1];
    -    QCOMPARE(f2, f3);
    -
    -    QCOMPARE(fs.value(2), fs[2]);
    -    QCOMPARE(fs.value(-1), QhullFacet());
    -    QCOMPARE(fs.value(10), QhullFacet());
    -    QCOMPARE(fs.value(2, f), fs[2]);
    -    QCOMPARE(fs.value(4, f), f);
    -    // mid() not available (read-only)
    -}//t_element
    -
    -void QhullSet_test::
    -t_search()
    -{
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"QR0");  // rotated unit cube
    -    QhullFacet f = q.beginFacet();
    -    QhullFacetSet fs = f.neighborFacets();
    -    QhullFacet f2= *fs.begin();
    -    QhullFacet f3= fs.last();
    -    QVERIFY(fs.contains(f2));
    -    QVERIFY(fs.contains(f3));
    -    QVERIFY(!fs.contains(f));
    -
    -    QhullFacetSet fs2= f2.neighborFacets();
    -    QVERIFY(fs==fs);
    -    QVERIFY(fs!=fs2);
    -    QCOMPARE(fs.count(f2), 1);
    -    QCOMPARE(fs.count(f3), 1);
    -    QCOMPARE(fs.count(f), 0);
    -    QCOMPARE(fs.indexOf(f2), 0);
    -    QCOMPARE(fs.indexOf(f3), 3);
    -    QCOMPARE(fs.indexOf(f), -1);
    -    QCOMPARE(fs.lastIndexOf(f2), 0);
    -    QCOMPARE(fs.lastIndexOf(f3), 3);
    -    QCOMPARE(fs.lastIndexOf(f), -1);
    -}//t_search
    -
    -void QhullSet_test::
    -t_iterator()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube,"QR0");  // rotated unit cube
    -        QhullFacet f = q.beginFacet();
    -        QhullFacetSet fs = f.neighborFacets();
    -        QhullFacetSet::Iterator i= fs.begin();
    -        QhullFacetSet::iterator i2= fs.begin();
    -        QVERIFY(i==i2);
    -        QVERIFY(i>=i2);
    -        QVERIFY(i<=i2);
    -        i= fs.begin();
    -        QVERIFY(i==i2);
    -        i2= fs.end();
    -        QVERIFY(i!=i2);
    -        QhullFacet f3(*i);
    -        i2--;
    -        QhullFacet f2= *i2;
    -        QCOMPARE(f3.id(), fs[0].id());
    -        QCOMPARE(f2.id(), fs[3].id());
    -        QhullFacetSet::Iterator i3(i2);
    -        QCOMPARE(*i2, *i3);
    -
    -        (i3= i)++;
    -        QCOMPARE((*i3).id(), fs[1].id());
    -        QVERIFY(i==i);
    -        QVERIFY(i!=i2);
    -        QVERIFY(ii);
    -        QVERIFY(i2>=i);
    -
    -        QhullFacetSet::ConstIterator i4= fs.begin();
    -        QVERIFY(i==i4); // iterator COMP const_iterator
    -        QVERIFY(i<=i4);
    -        QVERIFY(i>=i4);
    -        QVERIFY(i4==i); // const_iterator COMP iterator
    -        QVERIFY(i4<=i);
    -        QVERIFY(i4>=i);
    -        QVERIFY(i>=i4);
    -        QVERIFY(i4<=i);
    -        QVERIFY(i2!=i4);
    -        QVERIFY(i2>i4);
    -        QVERIFY(i2>=i4);
    -        QVERIFY(i4!=i2);
    -        QVERIFY(i4i);
    -        QVERIFY(i4>=i);
    -
    -        i= fs.begin();
    -        i2= fs.begin();
    -        QCOMPARE(i, i2++);
    -        QCOMPARE(*i2, fs[1]);
    -        QCOMPARE(++i, i2);
    -        QCOMPARE(i, i2--);
    -        QCOMPARE(i2, fs.begin());
    -        QCOMPARE(--i, i2);
    -        QCOMPARE(i2 += 4, fs.end());
    -        QCOMPARE(i2 -= 4, fs.begin());
    -        QCOMPARE(i2+0, fs.begin());
    -        QCOMPARE(i2+4, fs.end());
    -        i2 += 4;
    -        i= i2-0;
    -        QCOMPARE(i, i2);
    -        i= i2-4;
    -        QCOMPARE(i, fs.begin());
    -        QCOMPARE(i2-i, 4);
    -
    -        //fs.begin end tested above
    -
    -        // QhullFacetSet is const-only
    -    }
    -}//t_iterator
    -
    -void QhullSet_test::
    -t_const_iterator()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube,"QR0");  // rotated unit cube
    -        QhullFacet f = q.beginFacet();
    -        QhullFacetSet fs = f.neighborFacets();
    -        QhullFacetSet::ConstIterator i= fs.begin();
    -        QhullFacetSet::const_iterator i2= fs.begin();
    -        QVERIFY(i==i2);
    -        QVERIFY(i>=i2);
    -        QVERIFY(i<=i2);
    -        i= fs.begin();
    -        QVERIFY(i==i2);
    -        i2= fs.end();
    -        QVERIFY(i!=i2);
    -        QhullFacet f3(*i);
    -        i2--;
    -        QhullFacet f2= *i2;
    -        QCOMPARE(f3.id(), fs[0].id());
    -        QCOMPARE(f2.id(), fs[3].id());
    -        QhullFacetSet::ConstIterator i3(i2);
    -        QCOMPARE(*i2, *i3);
    -
    -        (i3= i)++;
    -        QCOMPARE((*i3).id(), fs[1].id());
    -        QVERIFY(i==i);
    -        QVERIFY(i!=i2);
    -        QVERIFY(ii);
    -        QVERIFY(i2>=i);
    -
    -        // See t_iterator for const_iterator COMP iterator
    -
    -        i= fs.begin();
    -        i2= fs.constBegin();
    -        QCOMPARE(i, i2++);
    -        QCOMPARE(*i2, fs[1]);
    -        QCOMPARE(++i, i2);
    -        QCOMPARE(i, i2--);
    -        QCOMPARE(i2, fs.constBegin());
    -        QCOMPARE(--i, i2);
    -        QCOMPARE(i2+=4, fs.constEnd());
    -        QCOMPARE(i2-=4, fs.constBegin());
    -        QCOMPARE(i2+0, fs.constBegin());
    -        QCOMPARE(i2+4, fs.constEnd());
    -        i2 += 4;
    -        i= i2-0;
    -        QCOMPARE(i, i2);
    -        i= i2-4;
    -        QCOMPARE(i, fs.constBegin());
    -        QCOMPARE(i2-i, 4);
    -
    -        // QhullFacetSet is const-only
    -    }
    -}//t_const_iterator
    -
    -void QhullSet_test::
    -t_qhullset_iterator()
    -{
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"QR0");  // rotated unit cube
    -    // Fake an empty set.  Default constructor not defined.  No memory allocation.
    -    QhullFacet f = q.beginFacet();
    -    QhullFacetSet fs = f.neighborFacets();
    -    fs.defineAs(q.qh()->other_points);
    -    QhullFacetSetIterator i(fs);
    -    QCOMPARE(fs.count(), 0);
    -    QVERIFY(!i.hasNext());
    -    QVERIFY(!i.hasPrevious());
    -    i.toBack();
    -    QVERIFY(!i.hasNext());
    -    QVERIFY(!i.hasPrevious());
    -
    -    QhullFacet f2 = q.beginFacet();
    -    QhullFacetSet fs2 = f2.neighborFacets();
    -    QhullFacetSetIterator i2(fs2);
    -    QCOMPARE(fs2.count(), 4);
    -    i= fs2;
    -    QVERIFY(i2.hasNext());
    -    QVERIFY(!i2.hasPrevious());
    -    QVERIFY(i.hasNext());
    -    QVERIFY(!i.hasPrevious());
    -    i2.toBack();
    -    i.toFront();
    -    QVERIFY(!i2.hasNext());
    -    QVERIFY(i2.hasPrevious());
    -    QVERIFY(i.hasNext());
    -    QVERIFY(!i.hasPrevious());
    -
    -    // i at front, i2 at end/back, 4 neighbors
    -    QhullFacetSet fs3 = f2.neighborFacets(); // same as fs2
    -    QhullFacet f3(fs2[0]);
    -    QhullFacet f4= fs3[0];
    -    QCOMPARE(f3, f4);
    -    QVERIFY(f3==f4);
    -    QhullFacet f5(fs3[1]);
    -    QVERIFY(f4!=f5);
    -    QhullFacet f6(fs3[2]);
    -    QhullFacet f7(fs3[3]);
    -    QCOMPARE(i2.peekPrevious(), f7);
    -    QCOMPARE(i2.previous(), f7);
    -    QCOMPARE(i2.previous(), f6);
    -    QCOMPARE(i2.previous(), f5);
    -    QCOMPARE(i2.previous(), f4);
    -    QVERIFY(!i2.hasPrevious());
    -    QCOMPARE(i.peekNext(), f4);
    -    // i.peekNext()= 1.0; // compiler error
    -    QCOMPARE(i.next(), f4);
    -    QCOMPARE(i.peekNext(), f5);
    -    QCOMPARE(i.next(), f5);
    -    QCOMPARE(i.next(), f6);
    -    QCOMPARE(i.next(), f7);
    -    QVERIFY(!i.hasNext());
    -    i.toFront();
    -    QCOMPARE(i.next(), f4);
    -}//t_qhullset_iterator
    -
    -void QhullSet_test::
    -t_io()
    -{
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"QR0");  // rotated unit cube
    -    // Fake an empty set.  Default constructor not defined.  No memory allocation.
    -    QhullFacet f= q.beginFacet();
    -    QhullFacetSet fs= f.neighborFacets();
    -    fs.defineAs(q.qh()->other_points);
    -    cout << "INFO:     empty set" << fs << std::endl;
    -    QhullFacet f2= q.beginFacet();
    -    QhullFacetSet fs2= f2.neighborFacets();
    -    cout << "INFO:   Neighboring facets\n";
    -    cout << fs2 << std::endl;
    -
    -    QhullRidgeSet rs= f.ridges();
    -    cout << "INFO:   Ridges for a facet\n";
    -    cout << rs << std::endl;
    -}//t_io
    -
    -}//namespace orgQhull
    -
    -#include "moc/QhullSet_test.moc"
    diff --git a/src/qhull/src/qhulltest/QhullVertexSet_test.cpp b/src/qhull/src/qhulltest/QhullVertexSet_test.cpp
    deleted file mode 100644
    index 41caacd2902..00000000000
    --- a/src/qhull/src/qhulltest/QhullVertexSet_test.cpp
    +++ /dev/null
    @@ -1,152 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/QhullVertexSet_test.cpp#3 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -//pre-compiled headers
    -#include 
    -#include "qhulltest/RoadTest.h" // QT_VERSION
    -
    -#include "libqhullcpp/QhullVertexSet.h"
    -#include "libqhullcpp/QhullVertex.h"
    -#include "libqhullcpp/Qhull.h"
    -#include "libqhullcpp/QhullError.h"
    -#include "libqhullcpp/QhullFacet.h"
    -#include "libqhullcpp/RboxPoints.h"
    -
    -using std::cout;
    -using std::endl;
    -using std::ostringstream;
    -using std::ostream;
    -using std::string;
    -
    -namespace orgQhull {
    -
    -class QhullVertexSet_test : public RoadTest
    -{
    -    Q_OBJECT
    -
    -#//!\name Test slots
    -private slots:
    -    void cleanup();
    -    void t_construct();
    -    void t_convert();
    -    void t_readonly();
    -    void t_foreach();
    -    void t_io();
    -};//QhullVertexSet_test
    -
    -void
    -add_QhullVertexSet_test()
    -{
    -    new QhullVertexSet_test();  // RoadTest::s_testcases
    -}
    -
    -//Executed after each testcase
    -void QhullVertexSet_test::
    -cleanup()
    -{
    -    RoadTest::cleanup();
    -}
    -
    -void QhullVertexSet_test::
    -t_construct()
    -{
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"QR0");  // rotated unit cube
    -    cout << "INFO   : Cube rotated by QR" << q.rotateRandom() << std::endl;
    -    QhullFacet f= q.firstFacet();
    -    QhullVertexSet vs= f.vertices();
    -    QVERIFY(!vs.isEmpty());
    -    QCOMPARE(vs.count(),4);
    -    QhullVertexSet vs4= vs; // copy constructor
    -    QVERIFY(vs4==vs);
    -    QhullVertexSet vs3(q, q.qh()->del_vertices);
    -    QVERIFY(vs3.isEmpty());
    -}//t_construct
    -
    -void QhullVertexSet_test::
    -t_convert()
    -{
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"QR0 QV2");  // rotated unit cube with "good" facets adjacent to point 0
    -    cout << "INFO   : Cube rotated by QR" << q.rotateRandom() << std::endl;
    -    QhullFacet f= q.firstFacet();
    -    QhullVertexSet vs2= f.vertices();
    -    QCOMPARE(vs2.count(),4);
    -    std::vector fv= vs2.toStdVector();
    -    QCOMPARE(fv.size(), 4u);
    -    QList fv2= vs2.toQList();
    -    QCOMPARE(fv2.size(), 4);
    -    std::vector fv3= vs2.toStdVector();
    -    QCOMPARE(fv3.size(), 4u);
    -    QList fv4= vs2.toQList();
    -    QCOMPARE(fv4.size(), 4);
    -}//t_convert
    -
    -//! Spot check properties and read-only.  See QhullSet_test
    -void QhullVertexSet_test::
    -t_readonly()
    -{
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"QV0");  // good facets are adjacent to point 0
    -    QhullVertexSet vs= q.firstFacet().vertices();
    -    QCOMPARE(vs.count(), 4);
    -    QCOMPARE(vs.count(), 4);
    -    QhullVertex v= vs.first();
    -    QhullVertex v2= vs.last();
    -    QVERIFY(vs.contains(v));
    -    QVERIFY(vs.contains(v2));
    -}//t_readonly
    -
    -void QhullVertexSet_test::
    -t_foreach()
    -{
    -    RboxPoints rcube("c");
    -    // Spot check predicates and accessors.  See QhullLinkedList_test
    -    Qhull q(rcube,"QR0");  // rotated unit cube
    -    cout << "INFO   : Cube rotated by QR" << q.rotateRandom() << std::endl;
    -    QhullVertexSet vs= q.firstFacet().vertices();
    -    QVERIFY(vs.contains(vs.first()));
    -    QVERIFY(vs.contains(vs.last()));
    -    QCOMPARE(vs.first(), *vs.begin());
    -    QCOMPARE(*(vs.end()-1), vs.last());
    -}//t_foreach
    -
    -void QhullVertexSet_test::
    -t_io()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube,"QR0 QV0");   // good facets are adjacent to point 0
    -        cout << "INFO   : Cube rotated by QR" << q.rotateRandom() << std::endl;
    -        QhullVertexSet vs= q.firstFacet().vertices();
    -        ostringstream os;
    -        os << vs.print("Vertices of first facet with point 0");
    -        os << vs.printIdentifiers("\nVertex identifiers: ");
    -        cout<< os.str();
    -        QString vertices= QString::fromStdString(os.str());
    -        QCOMPARE(vertices.count(QRegExp(" v[0-9]")), 4);
    -    }
    -}//t_io
    -
    -#ifdef QHULL_USES_QT
    -QList QhullVertexSet::
    -toQList() const
    -{
    -    QhullSetIterator i(*this);
    -    QList vs;
    -    while(i.hasNext()){
    -        QhullVertex v= i.next();
    -        vs.append(v);
    -    }
    -    return vs;
    -}//toQList
    -#endif //QHULL_USES_QT
    -
    -}//orgQhull
    -
    -#include "moc/QhullVertexSet_test.moc"
    diff --git a/src/qhull/src/qhulltest/QhullVertex_test.cpp b/src/qhull/src/qhulltest/QhullVertex_test.cpp
    deleted file mode 100644
    index fb6ec9640ae..00000000000
    --- a/src/qhull/src/qhulltest/QhullVertex_test.cpp
    +++ /dev/null
    @@ -1,184 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/QhullVertex_test.cpp#3 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -//pre-compiled headers
    -#include 
    -#include "RoadTest.h" // QT_VERSION
    -
    -#include "libqhullcpp/QhullVertex.h"
    -#include "libqhullcpp/Coordinates.h"
    -#include "libqhullcpp/QhullError.h"
    -#include "libqhullcpp/RboxPoints.h"
    -#include "libqhullcpp/QhullFacet.h"
    -#include "libqhullcpp/QhullFacetSet.h"
    -#include "libqhullcpp/QhullVertexSet.h"
    -#include "libqhullcpp/Qhull.h"
    -
    -using std::cout;
    -using std::endl;
    -using std::ostringstream;
    -using std::ostream;
    -using std::string;
    -
    -namespace orgQhull {
    -
    -class QhullVertex_test : public RoadTest
    -{
    -    Q_OBJECT
    -
    -#//!\name Test slots
    -private slots:
    -    void cleanup();
    -    void t_constructConvert();
    -    void t_getSet();
    -    void t_foreach();
    -    void t_io();
    -};//QhullVertex_test
    -
    -void
    -add_QhullVertex_test()
    -{
    -    new QhullVertex_test();  // RoadTest::s_testcases
    -}
    -
    -//Executed after each testcase
    -void QhullVertex_test::
    -cleanup()
    -{
    -    RoadTest::cleanup();
    -}
    -
    -void QhullVertex_test::
    -t_constructConvert()
    -{
    -    QhullVertex v6;
    -    QVERIFY(!v6.isValid());
    -    QCOMPARE(v6.dimension(),0);
    -    // Qhull.runQhull() constructs QhullFacets as facetT
    -    RboxPoints rcube("c");
    -    Qhull q(rcube,"Qt QR0");  // triangulation of rotated unit cube
    -    QhullVertex v(q);
    -    QVERIFY(!v.isValid());
    -    QCOMPARE(v.dimension(),3);
    -    QhullVertex v2(q.beginVertex());
    -    QCOMPARE(v2.dimension(),3);
    -    v= v2;  // copy assignment
    -    QVERIFY(v.isValid());
    -    QCOMPARE(v.dimension(),3);
    -    QhullVertex v5= v2; // copy constructor
    -    QVERIFY(v5==v2);
    -    QVERIFY(v5==v);
    -    QhullVertex v3(q, v2.getVertexT());
    -    QCOMPARE(v,v3);
    -    QhullVertex v4(q, v2.getBaseT());
    -    QCOMPARE(v,v4);
    -}//t_constructConvert
    -
    -void QhullVertex_test::
    -t_getSet()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube,"Qt QR0");  // triangulation of rotated unit cube
    -        QCOMPARE(q.facetCount(), 12);
    -        QCOMPARE(q.vertexCount(), 8);
    -
    -        // Also spot-test QhullVertexList.  See QhullLinkedList_test.cpp
    -        QhullVertexList vs= q.vertexList();
    -        QhullVertexListIterator i(vs);
    -        while(i.hasNext()){
    -            const QhullVertex v= i.next();
    -            cout << v.id() << endl;
    -            QCOMPARE(v.dimension(),3);
    -            QVERIFY(v.id()>=0 && v.id()<9);
    -            QVERIFY(v.isValid());
    -            if(i.hasNext()){
    -                QCOMPARE(v.next(), i.peekNext());
    -                QVERIFY(v.next()!=v);
    -                QVERIFY(v.next().previous()==v);
    -            }
    -            QVERIFY(i.hasPrevious());
    -            QCOMPARE(v, i.peekPrevious());
    -        }
    -
    -        // test point()
    -        foreach (QhullVertex v, q.vertexList()){  // Qt only
    -            QhullPoint p= v.point();
    -            int j= p.id();
    -            cout << "Point " << j << ":\n" << p << endl;
    -            QVERIFY(j>=0 && j<8);
    -        }
    -    }
    -}//t_getSet
    -
    -void QhullVertex_test::
    -t_foreach()
    -{
    -    RboxPoints rcube("c W0 300");  // 300 points on surface of cube
    -    {
    -        Qhull q(rcube, "QR0 Qc"); // keep coplanars, thick facet, and rotate the cube
    -        foreach (QhullVertex v, q.vertexList()){  // Qt only
    -            QhullFacetSet fs= v.neighborFacets();
    -            QCOMPARE(fs.count(), 3);
    -            foreach (QhullFacet f, fs){  // Qt only
    -                QVERIFY(f.vertices().contains(v));
    -            }
    -        }
    -    }
    -}//t_foreach
    -
    -void QhullVertex_test::
    -t_io()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q(rcube, "");
    -        QhullVertex v= q.beginVertex();
    -        ostringstream os;
    -        os << "Vertex and vertices:\n";
    -        os << v;
    -        QhullVertexSet vs= q.firstFacet().vertices();
    -        os << vs;
    -        os << "\nVertex and vertices with message:\n";
    -        os << v.print("Vertex");
    -        os << vs.print("\nVertices:");
    -        cout << os.str();
    -        QString s= QString::fromStdString(os.str());
    -        QCOMPARE(s.count("(v"), 10);
    -        QCOMPARE(s.count(": f"), 2);
    -    }
    -    RboxPoints r10("10 D3");  // Without QhullVertex::facetNeighbors
    -    {
    -        Qhull q(r10, "");
    -        QhullVertex v= q.beginVertex();
    -        ostringstream os;
    -        os << "\nTry again with simplicial facets.  No neighboring facets listed for vertices.\n";
    -        os << "Vertex and vertices:\n";
    -        os << v;
    -        q.defineVertexNeighborFacets();
    -        os << "This time with neighborFacets() defined for all vertices:\n";
    -        os << v;
    -        cout << os.str();
    -        QString s= QString::fromStdString(os.str());
    -        QCOMPARE(s.count(": f"), 1);
    -
    -        Qhull q2(r10, "v"); // Voronoi diagram
    -        QhullVertex v2= q2.beginVertex();
    -        ostringstream os2;
    -        os2 << "\nTry again with Voronoi diagram of simplicial facets.  Neighboring facets automatically defined for vertices.\n";
    -        os2 << "Vertex and vertices:\n";
    -        os2 << v2;
    -        cout << os2.str();
    -        QString s2= QString::fromStdString(os2.str());
    -        QCOMPARE(s2.count(": f"), 1);
    -    }
    -}//t_io
    -
    -}//orgQhull
    -
    -#include "moc/QhullVertex_test.moc"
    diff --git a/src/qhull/src/qhulltest/Qhull_test.cpp b/src/qhull/src/qhulltest/Qhull_test.cpp
    deleted file mode 100644
    index cc3918a0504..00000000000
    --- a/src/qhull/src/qhulltest/Qhull_test.cpp
    +++ /dev/null
    @@ -1,360 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/Qhull_test.cpp#4 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -//pre-compiled headers
    -#include 
    -#include "qhulltest/RoadTest.h" // QT_VERSION
    -
    -#include "libqhullcpp/Qhull.h"
    -#include "libqhullcpp/QhullError.h"
    -#include "libqhullcpp/RboxPoints.h"
    -#include "libqhullcpp/QhullFacetList.h"
    -
    -using std::cout;
    -using std::endl;
    -using std::string;
    -
    -namespace orgQhull {
    -
    -//! Test C++ interface to Qhull
    -//! See eg/q_test for tests of Qhull commands
    -class Qhull_test : public RoadTest
    -{
    -    Q_OBJECT
    -
    -#//!\name Test slots
    -private slots:
    -    void cleanup();
    -    void t_construct();
    -    void t_attribute();
    -    void t_message();
    -    void t_getSet();
    -    void t_getQh();
    -    void t_getValue();
    -    void t_foreach();
    -    void t_modify();
    -};//Qhull_test
    -
    -void
    -add_Qhull_test()
    -{
    -    new Qhull_test();  // RoadTest::s_testcases
    -}
    -
    -//Executed after each testcase
    -void Qhull_test::
    -cleanup()
    -{
    -    RoadTest::cleanup();
    -}
    -
    -void Qhull_test::
    -t_construct()
    -{
    -    {
    -        Qhull q;
    -        QCOMPARE(q.dimension(),0);
    -        QVERIFY(q.qh()!=0);
    -        QCOMPARE(QString(q.qhullCommand()),QString(""));
    -        QCOMPARE(QString(q.rboxCommand()),QString(""));
    -        try{
    -            QCOMPARE(q.area(),0.0);
    -            QFAIL("area() did not fail.");
    -        }catch (const std::exception &e) {
    -            cout << "INFO   : Caught " << e.what();
    -        }
    -    }
    -    {
    -        RboxPoints rbox("10000");
    -        Qhull q(rbox, "QR0"); // Random points in a randomly rotated cube.
    -        QCOMPARE(q.dimension(),3);
    -        QVERIFY(q.volume() < 1.0);
    -        QVERIFY(q.volume() > 0.99);
    -    }
    -    {
    -        double points[] = {
    -            0, 0,
    -            1, 0,
    -            1, 1
    -        };
    -        Qhull q("triangle", 2, 3, points, "");
    -        QCOMPARE(q.dimension(),2);
    -        QCOMPARE(q.facetCount(),3);
    -        QCOMPARE(q.vertexCount(),3);
    -        QCOMPARE(q.dimension(),2);
    -        QCOMPARE(q.area(), 2.0+sqrt(2.0)); // length of boundary
    -        QCOMPARE(q.volume(), 0.5);        // the 2-d area
    -    }
    -}//t_construct
    -
    -void Qhull_test::
    -t_attribute()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        double normals[] = {
    -            0,  -1, -0.5,
    -           -1,   0, -0.5,
    -            1,   0, -0.5,
    -            0,   1, -0.5
    -        };
    -        Qhull q;
    -        Coordinates feasible;
    -        feasible << 0.0 << 0.0;
    -        q.setFeasiblePoint(feasible);
    -        Coordinates c(std::vector(2, 0.0));
    -        QVERIFY(q.feasiblePoint()==c);
    -        q.setOutputStream(&cout);
    -        q.runQhull("normals of square", 3, 4, normals, "H"); // halfspace intersect
    -        QVERIFY(q.feasiblePoint()==c); // from qh.feasible_point after runQhull()
    -        QCOMPARE(q.facetList().count(), 4); // Vertices of square
    -        cout << "Expecting summary of halfspace intersection\n";
    -        q.outputQhull();
    -        q.qh()->disableOutputStream();  // Same as q.disableOutputStream()
    -        cout << "Expecting no output from qh_fprintf() in Qhull.cpp\n";
    -        q.outputQhull();
    -    }
    -}//t_attribute
    -
    -//! No QhullMessage for errors outside of qhull
    -void Qhull_test::
    -t_message()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q;
    -        QCOMPARE(q.qhullMessage(), string(""));
    -        QCOMPARE(q.qhullStatus(), qh_ERRnone);
    -        QVERIFY(!q.hasQhullMessage());
    -        try{
    -            q.runQhull(rcube, "Fd");
    -            QFAIL("runQhull Fd did not fail.");
    -        }catch (const std::exception &e) {
    -            const char *s= e.what();
    -            cout << "INFO   : Caught " << s;
    -            QCOMPARE(QString::fromStdString(s).left(6), QString("QH6029"));
    -            // FIXUP QH11025 -- review decision to clearQhullMessage at QhullError()            // Cleared when copied to QhullError
    -            QVERIFY(!q.hasQhullMessage());
    -            // QCOMPARE(q.qhullMessage(), QString::fromStdString(s).remove(0, 7));
    -            // QCOMPARE(q.qhullStatus(), 6029);
    -            q.clearQhullMessage();
    -            QVERIFY(!q.hasQhullMessage());
    -        }
    -        q.appendQhullMessage("Append 1");
    -        QVERIFY(q.hasQhullMessage());
    -        QCOMPARE(QString::fromStdString(q.qhullMessage()), QString("Append 1"));
    -        q.appendQhullMessage("\nAppend 2\n");
    -        QCOMPARE(QString::fromStdString(q.qhullMessage()), QString("Append 1\nAppend 2\n"));
    -        q.clearQhullMessage();
    -        QVERIFY(!q.hasQhullMessage());
    -        QCOMPARE(QString::fromStdString(q.qhullMessage()), QString(""));
    -    }
    -    {
    -        cout << "INFO   : Error stream without output stream\n";
    -        Qhull q;
    -        q.setErrorStream(&cout);
    -        q.setOutputStream(0);
    -        try{
    -            q.runQhull(rcube, "Fd");
    -            QFAIL("runQhull Fd did not fail.");
    -        }catch (const QhullError &e) {
    -            cout << "INFO   : Caught " << e;
    -            QCOMPARE(e.errorCode(), 6029);
    -        }
    -        //FIXUP QH11025 Qhullmessage cleared when QhullError thrown.  Switched to e
    -        //QVERIFY(q.hasQhullMessage());
    -        //QCOMPARE(QString::fromStdString(q.qhullMessage()).left(6), QString("QH6029"));
    -        q.clearQhullMessage();
    -        QVERIFY(!q.hasQhullMessage());
    -    }
    -    {
    -        cout << "INFO   : Error output sent to output stream without error stream\n";
    -        Qhull q;
    -        q.setErrorStream(0);
    -        q.setOutputStream(&cout);
    -        try{
    -            q.runQhull(rcube, "Tz H0");
    -            QFAIL("runQhull TZ did not fail.");
    -        }catch (const std::exception &e) {
    -            const char *s= e.what();
    -            cout << "INFO   : Caught " << s;
    -            QCOMPARE(QString::fromLatin1(s).left(6), QString("QH6023"));
    -        }
    -        //FIXUP QH11025 Qhullmessage cleared when QhullError thrown.  Switched to e
    -        //QVERIFY(q.hasQhullMessage());
    -        //QCOMPARE(QString::fromStdString(q.qhullMessage()).left(17), QString("qhull: no message"));
    -        //QCOMPARE(q.qhullStatus(), 6023);
    -        q.clearQhullMessage();
    -        QVERIFY(!q.hasQhullMessage());
    -    }
    -    {
    -        cout << "INFO   : No error stream or output stream\n";
    -        Qhull q;
    -        q.setErrorStream(0);
    -        q.setOutputStream(0);
    -        try{
    -            q.runQhull(rcube, "Fd");
    -            QFAIL("outputQhull did not fail.");
    -        }catch (const std::exception &e) {
    -            const char *s= e.what();
    -            cout << "INFO   : Caught " << s;
    -            QCOMPARE(QString::fromLatin1(s).left(6), QString("QH6029"));
    -        }
    -        //FIXUP QH11025 Qhullmessage cleared when QhullError thrown.  Switched to e
    -        //QVERIFY(q.hasQhullMessage());
    -        //QCOMPARE(QString::fromStdString(q.qhullMessage()).left(9), QString("qhull err"));
    -        //QCOMPARE(q.qhullStatus(), 6029);
    -        q.clearQhullMessage();
    -        QVERIFY(!q.hasQhullMessage());
    -    }
    -}//t_message
    -
    -void Qhull_test::
    -t_getSet()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q;
    -        QVERIFY(!q.initialized());
    -        q.runQhull(rcube, "s");
    -        QVERIFY(q.initialized());
    -        QCOMPARE(q.dimension(), 3);
    -        QhullPoint p= q.origin();
    -        QCOMPARE(p.dimension(), 3);
    -        QCOMPARE(p[0]+p[1]+p[2], 0.0);
    -        q.setErrorStream(&cout);
    -        q.outputQhull();
    -    }
    -    {
    -        Qhull q;
    -        q.runQhull(rcube, "");
    -        q.setOutputStream(&cout);
    -        q.outputQhull();
    -    }
    -}//t_getSet
    -
    -void Qhull_test::
    -t_getQh()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q;
    -        q.runQhull(rcube, "s");
    -        QCOMPARE(QString(q.qhullCommand()), QString("qhull s"));
    -        QCOMPARE(QString(q.rboxCommand()), QString("rbox \"c\""));
    -        QCOMPARE(q.facetCount(), 6);
    -        QCOMPARE(q.vertexCount(), 8);
    -        // Sample fields from Qhull's qhT [libqhull.h]
    -        QCOMPARE(q.qh()->ALLpoints, 0u);
    -        QCOMPARE(q.qh()->GOODpoint, 0);
    -        QCOMPARE(q.qh()->IStracing, 0);
    -        QCOMPARE(q.qh()->MAXcoplanar+1.0, 1.0); // fuzzy compare
    -        QCOMPARE(q.qh()->MERGING, 1u);
    -        QCOMPARE(q.qh()->input_dim, 3);
    -        QCOMPARE(QString(q.qh()->qhull_options).left(8), QString("  run-id"));
    -        QCOMPARE(q.qh()->num_facets, 6);
    -        QCOMPARE(q.qh()->hasTriangulation, 0u);
    -        QCOMPARE(q.qh()->max_outside - q.qh()->min_vertex + 1.0, 1.0); // fuzzy compare
    -        QCOMPARE(*q.qh()->gm_matrix+1.0, 1.0); // fuzzy compare
    -    }
    -}//t_getQh
    -
    -void Qhull_test::
    -t_getValue()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q;
    -        q.runQhull(rcube, "");
    -        QCOMPARE(q.area(), 6.0);
    -        QCOMPARE(q.volume(), 1.0);
    -    }
    -}//t_getValue
    -
    -void Qhull_test::
    -t_foreach()
    -{
    -    RboxPoints rcube("c");
    -    {
    -        Qhull q;
    -        QCOMPARE(q.beginFacet(),q.endFacet());
    -        QCOMPARE(q.beginVertex(),q.endVertex());
    -        q.runQhull(rcube, "");
    -        QCOMPARE(q.facetList().count(), 6);
    -
    -        // defineVertexNeighborFacets() tested in QhullVertex_test::t_io()
    -
    -        QhullFacetList facets(q.beginFacet(), q.endFacet());
    -        QCOMPARE(facets.count(), 6);
    -        QCOMPARE(q.firstFacet(), q.beginFacet());
    -        QhullVertexList vertices(q.beginVertex(), q.endVertex());
    -        QCOMPARE(vertices.count(), 8);
    -        QCOMPARE(q.firstVertex(), q.beginVertex());
    -        QhullPoints ps= q.points();
    -        QCOMPARE(ps.count(), 8);
    -        QhullPointSet ps2= q.otherPoints();
    -        QCOMPARE(ps2.count(), 0);
    -        // ps2= q.otherPoints(); //disabled, would not copy the points
    -        QCOMPARE(q.facetCount(), 6);
    -        QCOMPARE(q.vertexCount(), 8);
    -        coordT *c= q.pointCoordinateBegin(); // of q.points()
    -        QVERIFY(*c==0.5 || *c==-0.5);
    -        coordT *c3= q.pointCoordinateEnd();
    -        QVERIFY(c3[-1]==0.5 || c3[-1]==-0.5);
    -        QCOMPARE(c3-c, 8*3);
    -        QCOMPARE(q.vertexList().count(), 8);
    -    }
    -}//t_foreach
    -
    -void Qhull_test::
    -t_modify()
    -{
    -    //addPoint() tested in t_foreach
    -    RboxPoints diamond("d");
    -    Qhull q(diamond, "o");
    -    q.setOutputStream(&cout);
    -    cout << "Expecting vertexList and facetList of a 3-d diamond.\n";
    -    q.outputQhull();
    -    cout << "Expecting normals of a 3-d diamond.\n";
    -    q.outputQhull("n");
    -    // runQhull tested in t_attribute(), t_message(), etc.
    -}//t_modify
    -
    -}//orgQhull
    -
    -// Redefine Qhull's usermem_r.c in order to report erroneous calls to qh_exit
    -void qh_exit(int exitcode) {
    -    cout << "FAIL!  : Qhull called qh_exit().  Qhull's error handling not available.\n.. See the corresponding Qhull:qhull_message or setErrorStream().\n";
    -    exit(exitcode);
    -}
    -void qh_fprintf_stderr(int msgcode, const char *fmt, ... ) {
    -    va_list args;
    -
    -    va_start(args, fmt);
    -    if(msgcode)
    -        fprintf(stderr, "QH%.4d ", msgcode);
    -    vfprintf(stderr, fmt, args);
    -    va_end(args);
    -} /* fprintf_stderr */
    -void qh_free(void *mem) {
    -    free(mem);
    -}
    -void *qh_malloc(size_t size) {
    -    return malloc(size);
    -}
    -
    -#if 0
    -template<> char * QTest::
    -toString(const std::string &s)
    -{
    -    QByteArray ba = s.c_str();
    -    return qstrdup(ba.data());
    -}
    -#endif
    -
    -#include "moc/Qhull_test.moc"
    diff --git a/src/qhull/src/qhulltest/RboxPoints_test.cpp b/src/qhull/src/qhulltest/RboxPoints_test.cpp
    deleted file mode 100644
    index 4f4ea984f8b..00000000000
    --- a/src/qhull/src/qhulltest/RboxPoints_test.cpp
    +++ /dev/null
    @@ -1,215 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2006-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/RboxPoints_test.cpp#2 $$Change: 2062 $
    -** $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -//pre-compiled headers
    -#include 
    -#include "RoadTest.h" // QT_VERSION
    -
    -#include "libqhullcpp/RboxPoints.h"
    -#include "libqhullcpp/QhullError.h"
    -
    -using std::cout;
    -using std::endl;
    -using std::ostringstream;
    -using std::string;
    -using std::stringstream;
    -
    -namespace orgQhull {
    -
    -//! Test C++ interface to Rbox
    -//! See eg/q_test for tests of rbox commands
    -class RboxPoints_test : public RoadTest
    -{
    -    Q_OBJECT
    -
    -#//!\name Test slots
    -private slots:
    -    void t_construct();
    -    void t_error();
    -    void t_test();
    -    void t_getSet();
    -    void t_foreach();
    -    void t_change();
    -    void t_ostream();
    -};
    -
    -void
    -add_RboxPoints_test()
    -{
    -    new RboxPoints_test();  // RoadTest::s_testcases
    -}
    -
    -void RboxPoints_test::
    -t_construct()
    -{
    -    RboxPoints rp;
    -    QCOMPARE(rp.dimension(), 0);
    -    QCOMPARE(rp.count(), 0);
    -    QVERIFY(QString::fromStdString(rp.comment()) != QString(""));
    -    QVERIFY(rp.isEmpty());
    -    QVERIFY(!rp.hasRboxMessage());
    -    QCOMPARE(rp.rboxStatus(), qh_ERRnone);
    -    QCOMPARE(QString::fromStdString(rp.rboxMessage()), QString("rbox warning: no points generated\n"));
    -
    -    RboxPoints rp2("c"); // 3-d cube
    -    QCOMPARE(rp2.dimension(), 3);
    -    QCOMPARE(rp2.count(), 8);
    -    QCOMPARE(QString::fromStdString(rp2.comment()), QString("rbox \"c\""));
    -    QVERIFY(!rp2.isEmpty());
    -    QVERIFY(!rp2.hasRboxMessage());
    -    QCOMPARE(rp2.rboxStatus(), qh_ERRnone);
    -    QCOMPARE(QString::fromStdString(rp2.rboxMessage()), QString("rbox: OK\n"));
    -}//t_construct
    -
    -void RboxPoints_test::
    -t_error()
    -{
    -    RboxPoints rp;
    -    try{
    -        rp.appendPoints("D0 c");
    -        QFAIL("'D0 c' did not fail.");
    -    }catch (const std::exception &e) {
    -        const char *s= e.what();
    -        cout << "INFO   : Caught " << s;
    -        QCOMPARE(QString(s).left(6), QString("QH6189"));
    -        QVERIFY(rp.hasRboxMessage());
    -        QCOMPARE(QString::fromStdString(rp.rboxMessage()).left(8), QString("rbox err"));
    -        QCOMPARE(rp.rboxStatus(), 6189);
    -        rp.clearRboxMessage();
    -        QVERIFY(!rp.hasRboxMessage());
    -    }
    -    try{
    -        RboxPoints rp2;
    -        rp2.setDimension(-1);
    -        QFAIL("setDimension(-1) did not fail.");
    -    }catch (const RoadError &e) {
    -        const char *s= e.what();
    -        cout << "INFO   : Caught " << s;
    -        QCOMPARE(QString(s).left(7), QString("QH10062"));
    -        QCOMPARE(e.errorCode(), 10062);
    -        QCOMPARE(QString::fromStdString(e.what()), QString(s));
    -        RoadLogEvent logEvent= e.roadLogEvent();
    -        QCOMPARE(logEvent.int1(), -1);
    -    }
    -}//t_error
    -
    -void RboxPoints_test::
    -t_test()
    -{
    -    // isEmpty -- t_construct
    -}//t_test
    -
    -void RboxPoints_test::
    -t_getSet()
    -{
    -    // comment -- t_construct
    -    // count -- t_construct
    -    // dimension -- t_construct
    -
    -    RboxPoints rp;
    -    QCOMPARE(rp.dimension(), 0);
    -    rp.setDimension(2);
    -    QCOMPARE(rp.dimension(), 2);
    -    try{
    -        rp.setDimension(102);
    -        QFAIL("setDimension(102) did not fail.");
    -    }catch (const std::exception &e) {
    -        cout << "INFO   : Caught " << e.what();
    -    }
    -    QCOMPARE(rp.newCount(), 0);
    -    rp.appendPoints("D2 P1 P2");
    -    QCOMPARE(rp.count(), 2);
    -    QCOMPARE(rp.newCount(), 2); // From previous appendPoints();
    -    PointCoordinates pc(rp.qh(), 2, "Test qh() and <<");
    -    pc << 1.0 << 0.0 << 2.0 << 0.0;
    -    QCOMPARE(pc.dimension(), 2);
    -    QCOMPARE(pc.count(), 2);
    -    QVERIFY(rp==pc);
    -    rp.setNewCount(10);  // Normally only used by appendPoints for rbox processing
    -    QCOMPARE(rp.newCount(), 10);
    -    rp.reservePoints();
    -    QVERIFY(rp==pc);
    -}//t_getSet
    -
    -void RboxPoints_test::
    -t_foreach()
    -{
    -    RboxPoints rp("c");
    -    Coordinates::ConstIterator cci= rp.beginCoordinates();
    -    orgQhull::Coordinates::Iterator ci= rp.beginCoordinates();
    -    QCOMPARE(*cci, -0.5);
    -    QCOMPARE(*ci, *cci);
    -    int i=1;
    -    while(++cci
    -#include "RoadTest.h" // QT_VERSION
    -
    -#include 
    -
    -using std::cout;
    -using std::endl;
    -
    -namespace orgQhull {
    -
    -#//!\name class variable
    -
    -QList RoadTest::
    -s_testcases;
    -
    -int RoadTest::
    -s_test_count= 0;
    -
    -int RoadTest::
    -s_test_fail= 0;
    -
    -QStringList RoadTest::
    -s_failed_tests;
    -
    -#//!\name Slot
    -
    -//! Executed after each test
    -void RoadTest::
    -cleanup()
    -{
    -    s_test_count++;
    -    if(QTest::currentTestFailed()){
    -        recordFailedTest();
    -    }
    -}//cleanup
    -
    -#//!\name Helper
    -
    -void RoadTest::
    -recordFailedTest()
    -{
    -    s_test_fail++;
    -    QString className= metaObject()->className();
    -    s_failed_tests << className + "::" + QTest::currentTestFunction();
    -}
    -
    -#//!\name class function
    -
    -void RoadTest::
    -deleteTests()
    -{
    -    foreach(RoadTest *testcase, s_testcases){
    -        delete testcase;
    -    }
    -    s_failed_tests.clear();
    -}
    -
    -int RoadTest::
    -runTests(QStringList arguments)
    -{
    -    int result= 0; // assume success
    -
    -    foreach(RoadTest *testcase, s_testcases){
    -        try{
    -            result += QTest::qExec(testcase, arguments);
    -        }catch(const std::exception &e){
    -            cout << "FAIL!  : Threw error ";
    -            cout << e.what() << endl;
    -    s_test_count++;
    -            testcase->recordFailedTest();
    -            // Qt 4.5.2 OK.  In Qt 4.3.3, qtestcase did not clear currentTestObject
    -        }
    -    }
    -    if(s_test_fail){
    -        cout << "Failed " << s_test_fail << " of " << s_test_count << " tests.\n";
    -        cout << s_failed_tests.join("\n").toLocal8Bit().constData() << std::endl;
    -    }else{
    -        cout << "Passed " << s_test_count << " tests.\n";
    -    }
    -    return result;
    -}//runTests
    -
    -}//orgQhull
    -
    -#include "moc/moc_RoadTest.cpp"
    diff --git a/src/qhull/src/qhulltest/RoadTest.h b/src/qhull/src/qhulltest/RoadTest.h
    deleted file mode 100644
    index adfe0bf8c13..00000000000
    --- a/src/qhull/src/qhulltest/RoadTest.h
    +++ /dev/null
    @@ -1,102 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/RoadTest.h#2 $$Change: 2062 $
    -** $Date: 2016/01/17 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -#ifndef ROADTEST_H
    -#define ROADTEST_H
    -
    -//pre-compiled with RoadTest.h
    -#include     // Qt C++ Framework
    -#include 
    -
    -#define QHULL_USES_QT 1
    -
    -namespace orgQhull {
    -
    -#//!\name Defined here
    -
    -    //! RoadTest -- Generic test for Qt's QTest
    -    class RoadTest;
    -    //! TESTadd_(t) -- Add a RoadTest
    -
    -/** Test Name objects using Qt's QTestLib
    -
    -Template:
    -
    -class Name_test : public RoadTest
    -{
    -    Q_OBJECT
    -#//!\name Test slot
    -private slots:
    -    void t_name();
    -    //Executed before any test
    -    void initTestCase();
    -    void init();          // Each test
    -    //Executed after each test
    -    void cleanup(); //RoadTest::cleanup();
    -    // Executed after last test
    -    void cleanupTestCase();
    -};
    -
    -void
    -add_Name_test()
    -{
    -    new Name_test();  // RoadTest::s_testcases
    -}
    -
    -Send additional output to cout
    -*/
    -
    -class RoadTest : public QObject
    -{
    -    Q_OBJECT
    -
    -#//!\name Class globals
    -protected:
    -    static QList
    -                        s_testcases; ///! List of testcases to execute.  Initialized via add_...()
    -    static int          s_test_count; ///! Total number of tests executed
    -    static int          s_test_fail; ///! Number of failed tests
    -    static QStringList  s_failed_tests; ///! List of failed tests
    -
    -#//!\name Test slots
    -public slots:
    -    void cleanup();
    -
    -public:
    -#//!\name Constructors, etc.
    -                        RoadTest()  { s_testcases.append(this); }
    -    virtual             ~RoadTest() {} // Derived from QObject
    -
    -#//!\name Helper
    -    void                recordFailedTest();
    -
    -
    -#//!\name Class functions
    -    static void         deleteTests();
    -    static int          runTests(QStringList arguments);
    -
    -};//RoadTest
    -
    -#define TESTadd_(t) extern void t(); t();
    -
    -
    -}//orgQhull
    -
    -namespace QTest{
    -
    -template<>
    -inline char *
    -toString(const std::string &s)
    -{
    -    return qstrdup(s.c_str());
    -}
    -
    -}//namespace QTest
    -
    -#endif //ROADTEST_H
    -
    diff --git a/src/qhull/src/qhulltest/qhulltest.cpp b/src/qhull/src/qhulltest/qhulltest.cpp
    deleted file mode 100644
    index 5bfe16e9cfd..00000000000
    --- a/src/qhull/src/qhulltest/qhulltest.cpp
    +++ /dev/null
    @@ -1,94 +0,0 @@
    -/****************************************************************************
    -**
    -** Copyright (c) 2008-2015 C.B. Barber. All rights reserved.
    -** $Id: //main/2015/qhull/src/qhulltest/qhulltest.cpp#5 $$Change: 2079 $
    -** $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
    -**
    -****************************************************************************/
    -
    -//pre-compiled headers
    -#include "libqhull_r/user_r.h"
    -
    -#include 
    -#include "RoadTest.h" // QT_VERSION
    -
    -#include "libqhullcpp/RoadError.h"
    -#include "libqhull_r/qhull_ra.h"
    -
    -#include 
    -#include 
    -#include 
    -
    -using std::cout;
    -using std::endl;
    -
    -namespace orgQhull {
    -
    -void addQhullTests(QStringList &args)
    -{
    -    TESTadd_(add_Qhull_test);
    -
    -    if(args.contains("--all")){
    -        args.removeAll("--all");
    -        // up-to-date
    -        TESTadd_(add_Coordinates_test);
    -        TESTadd_(add_PointCoordinates_test);
    -        TESTadd_(add_QhullFacet_test);
    -        TESTadd_(add_QhullFacetList_test);
    -        TESTadd_(add_QhullFacetSet_test);
    -        TESTadd_(add_QhullHyperplane_test);
    -        TESTadd_(add_QhullLinkedList_test);
    -        TESTadd_(add_QhullPoint_test);
    -        TESTadd_(add_QhullPoints_test);
    -        TESTadd_(add_QhullPointSet_test);
    -        TESTadd_(add_QhullRidge_test);
    -        TESTadd_(add_QhullSet_test);
    -        TESTadd_(add_QhullVertex_test);
    -        TESTadd_(add_QhullVertexSet_test);
    -        TESTadd_(add_RboxPoints_test);
    -        // qhullStat
    -        TESTadd_(add_Qhull_test);
    -    }//--all
    -}//addQhullTests
    -
    -int main(int argc, char *argv[])
    -{
    -
    -    QCoreApplication app(argc, argv);
    -    QStringList args= app.arguments();
    -    bool isAll= args.contains("--all");
    -
    -    QHULL_LIB_CHECK /* Check for compatible library */
    -
    -    addQhullTests(args);
    -    int status=1010;
    -    try{
    -        status= RoadTest::runTests(args);
    -    }catch(const std::exception &e){
    -        cout << "FAIL!  : runTests() did not catch error\n";
    -        cout << e.what() << endl;
    -        if(!RoadError::emptyGlobalLog()){
    -            cout << RoadError::stringGlobalLog() << endl;
    -            RoadError::clearGlobalLog();
    -        }
    -    }
    -    if(!RoadError::emptyGlobalLog()){
    -        cout << RoadError::stringGlobalLog() << endl;
    -        RoadError::clearGlobalLog();
    -    }
    -    if(isAll){
    -        cout << "Finished test of libqhullcpp.  Test libqhull_r with eg/q_test after building libqhull_r/Makefile" << endl;
    -    }else{
    -        cout << "Finished test of one class.  Test all classes with 'qhulltest --all'" << endl;
    -    }
    -    RoadTest::deleteTests();
    -    return status;
    -}
    -
    -}//orgQhull
    -
    -int main(int argc, char *argv[])
    -{
    -    return orgQhull::main(argc, argv); // Needs RoadTest:: for TESTadd_() linkage
    -}
    -
    diff --git a/src/qhull/src/qhulltest/qhulltest.pro b/src/qhull/src/qhulltest/qhulltest.pro
    deleted file mode 100644
    index 0da34d37557..00000000000
    --- a/src/qhull/src/qhulltest/qhulltest.pro
    +++ /dev/null
    @@ -1,36 +0,0 @@
    -# -------------------------------------------------
    -# qhulltest.pro -- Qt project for qhulltest.exe (QTestLib)
    -# cd $qh/build/qhulltest && qmake -tp vc -r ../../src/qhulltest/qhulltest.pro
    -# -------------------------------------------------
    -
    -include(../qhull-app-cpp.pri)
    -
    -TARGET = qhulltest
    -QT += testlib
    -MOC_DIR = moc
    -INCLUDEPATH += ..  # for MOC_DIR
    -
    -PRECOMPILED_HEADER = RoadTest.h
    -
    -HEADERS += RoadTest.h
    -
    -SOURCES += ../libqhullcpp/qt-qhull.cpp
    -SOURCES += Coordinates_test.cpp
    -SOURCES += PointCoordinates_test.cpp
    -SOURCES += Qhull_test.cpp
    -SOURCES += QhullFacet_test.cpp
    -SOURCES += QhullFacetList_test.cpp
    -SOURCES += QhullFacetSet_test.cpp
    -SOURCES += QhullHyperplane_test.cpp
    -SOURCES += QhullLinkedList_test.cpp
    -SOURCES += QhullPoint_test.cpp
    -SOURCES += QhullPoints_test.cpp
    -SOURCES += QhullPointSet_test.cpp
    -SOURCES += QhullRidge_test.cpp
    -SOURCES += QhullSet_test.cpp
    -SOURCES += qhulltest.cpp
    -SOURCES += QhullVertex_test.cpp
    -SOURCES += QhullVertexSet_test.cpp
    -SOURCES += RboxPoints_test.cpp
    -SOURCES += RoadTest.cpp
    -
    diff --git a/src/qhull/src/qvoronoi/qvoronoi.c b/src/qhull/src/qvoronoi/qvoronoi.c
    deleted file mode 100644
    index b93d2371143..00000000000
    --- a/src/qhull/src/qvoronoi/qvoronoi.c
    +++ /dev/null
    @@ -1,303 +0,0 @@
    -/*
      ---------------------------------
    -
    -   qvoronoi.c
    -     compute Voronoi diagrams and furthest-point Voronoi
    -     diagrams using qhull
    -
    -   see unix.c for full interface
    -
    -   Copyright (c) 1993-2015, The Geometry Center
    -*/
    -
    -#include "libqhull/libqhull.h"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#if __cplusplus
    -extern "C" {
    -  int isatty(int);
    -}
    -
    -#elif _MSC_VER
    -#include 
    -#define isatty _isatty
    -/* int _isatty(int); */
    -
    -#else
    -int isatty(int);  /* returns 1 if stdin is a tty
    -                   if "Undefined symbol" this can be deleted along with call in main() */
    -#endif
    -
    -/*---------------------------------
    -
    -  qh_prompt
    -    long prompt for qhull
    -
    -  notes:
    -    restricted version of libqhull.c
    -
    -  see:
    -    concise prompt below
    -*/
    -
    -/* duplicated in qvoron_f.htm and qvoronoi.htm
    -   QJ and Qt are deprecated, but allowed for backwards compatibility
    -*/
    -char hidden_options[]=" d n m v H U Qb QB Qc Qf Qg Qi Qm Qr QR Qv Qx TR E V Fa FA FC Fp FS Ft FV Pv Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 ";
    -
    -char qh_prompta[]= "\n\
    -qvoronoi- compute the Voronoi diagram\n\
    -    http://www.qhull.org  %s\n\
    -\n\
    -input (stdin):\n\
    -    first lines: dimension and number of points (or vice-versa).\n\
    -    other lines: point coordinates, best if one point per line\n\
    -    comments:    start with a non-numeric character\n\
    -\n\
    -options:\n\
    -    Qu   - compute furthest-site Voronoi diagram\n\
    -\n\
    -Qhull control options:\n\
    -    Qz   - add point-at-infinity to Voronoi diagram\n\
    -%s%s%s%s";  /* split up qh_prompt for Visual C++ */
    -char qh_promptb[]= "\
    -    Qs   - search all points for the initial simplex\n\
    -    QGn  - Voronoi vertices if visible from point n, -n if not\n\
    -    QVn  - Voronoi vertices for input point n, -n if not\n\
    -\n\
    -";
    -char qh_promptc[]= "\
    -Trace options:\n\
    -    T4   - trace at level n, 4=all, 5=mem/gauss, -1= events\n\
    -    Tc   - check frequently during execution\n\
    -    Ts   - statistics\n\
    -    Tv   - verify result: structure, convexity, and in-circle test\n\
    -    Tz   - send all output to stdout\n\
    -    TFn  - report summary when n or more facets created\n\
    -    TI file - input data from file, no spaces or single quotes\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    -    TPn  - turn on tracing when point n added to hull\n\
    -     TMn - turn on tracing at merge n\n\
    -     TWn - trace merge facets when width > n\n\
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)\n\
    -     TCn - stop qhull after building cone for point n (see TVn)\n\
    -\n\
    -Precision options:\n\
    -    Cn   - radius of centrum (roundoff added).  Merge facets if non-convex\n\
    -     An  - cosine of maximum angle.  Merge facets if cosine > n or non-convex\n\
    -           C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge\n\
    -    Rn   - randomly perturb computations by a factor of [1-n,1+n]\n\
    -    Wn   - min facet width for non-coincident point (before roundoff)\n\
    -\n\
    -Output formats (may be combined; if none, produces a summary to stdout):\n\
    -    s    - summary to stderr\n\
    -    p    - Voronoi vertices\n\
    -    o    - OFF format (dim, Voronoi vertices, and Voronoi regions)\n\
    -    i    - Delaunay regions (use 'Pp' to avoid warning)\n\
    -    f    - facet dump\n\
    -\n\
    -";
    -char qh_promptd[]= "\
    -More formats:\n\
    -    Fc   - count plus coincident points (by Voronoi vertex)\n\
    -    Fd   - use cdd format for input (homogeneous with offset first)\n\
    -    FD   - use cdd format for output (offset first)\n\
    -    FF   - facet dump without ridges\n\
    -    Fi   - separating hyperplanes for bounded Voronoi regions\n\
    -    FI   - ID for each Voronoi vertex\n\
    -    Fm   - merge count for each Voronoi vertex (511 max)\n\
    -    Fn   - count plus neighboring Voronoi vertices for each Voronoi vertex\n\
    -    FN   - count and Voronoi vertices for each Voronoi region\n\
    -    Fo   - separating hyperplanes for unbounded Voronoi regions\n\
    -    FO   - options and precision constants\n\
    -    FP   - nearest point and distance for each coincident point\n\
    -    FQ   - command used for qvoronoi\n\
    -    Fs   - summary: #int (8), dimension, #points, tot vertices, tot facets,\n\
    -                    for output: #Voronoi regions, #Voronoi vertices,\n\
    -                                #coincident points, #non-simplicial regions\n\
    -                    #real (2), max outer plane and min vertex\n\
    -    Fv   - Voronoi diagram as Voronoi vertices between adjacent input sites\n\
    -    Fx   - extreme points of Delaunay triangulation (on convex hull)\n\
    -\n\
    -";
    -char qh_prompte[]= "\
    -Geomview options (2-d only)\n\
    -    Ga   - all points as dots\n\
    -     Gp  -  coplanar points and vertices as radii\n\
    -     Gv  -  vertices as spheres\n\
    -    Gi   - inner planes only\n\
    -     Gn  -  no planes\n\
    -     Go  -  outer planes only\n\
    -    Gc   - centrums\n\
    -    Gh   - hyperplane intersections\n\
    -    Gr   - ridges\n\
    -    GDn  - drop dimension n in 3-d and 4-d output\n\
    -\n\
    -Print options:\n\
    -    PAn  - keep n largest Voronoi vertices by 'area'\n\
    -    Pdk:n - drop facet if normal[k] <= n (default 0.0)\n\
    -    PDk:n - drop facet if normal[k] >= n\n\
    -    Pg   - print good Voronoi vertices (needs 'QGn' or 'QVn')\n\
    -    PFn  - keep Voronoi vertices whose 'area' is at least n\n\
    -    PG   - print neighbors of good Voronoi vertices\n\
    -    PMn  - keep n Voronoi vertices with most merges\n\
    -    Po   - force output.  If error, output neighborhood of facet\n\
    -    Pp   - do not report precision problems\n\
    -\n\
    -    .    - list of all options\n\
    -    -    - one line descriptions of all options\n\
    -    -V   - version\n\
    -";
    -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    -
    -/*---------------------------------
    -
    -  qh_prompt2
    -    synopsis for qhull
    -*/
    -char qh_prompt2[]= "\n\
    -qvoronoi- compute the Voronoi diagram.  Qhull %s\n\
    -    input (stdin): dimension, number of points, point coordinates\n\
    -    comments start with a non-numeric character\n\
    -\n\
    -options (qvoronoi.htm):\n\
    -    Qu   - compute furthest-site Voronoi diagram\n\
    -    Tv   - verify result: structure, convexity, and in-circle test\n\
    -    .    - concise list of all options\n\
    -    -    - one-line description of all options\n\
    -    -V   - version\n\
    -\n\
    -output options (subset):\n\
    -    s    - summary of results (default)\n\
    -    p    - Voronoi vertices\n\
    -    o    - OFF file format (dim, Voronoi vertices, and Voronoi regions)\n\
    -    FN   - count and Voronoi vertices for each Voronoi region\n\
    -    Fv   - Voronoi diagram as Voronoi vertices between adjacent input sites\n\
    -    Fi   - separating hyperplanes for bounded regions, 'Fo' for unbounded\n\
    -    G    - Geomview output (2-d only)\n\
    -    QVn  - Voronoi vertices for input point n, -n if not\n\
    -    TO file- output results to file, may be enclosed in single quotes\n\
    -\n\
    -examples:\n\
    -rbox c P0 D2 | qvoronoi s o         rbox c P0 D2 | qvoronoi Fi\n\
    -rbox c P0 D2 | qvoronoi Fo          rbox c P0 D2 | qvoronoi Fv\n\
    -rbox c P0 D2 | qvoronoi s Qu Fv     rbox c P0 D2 | qvoronoi Qu Fo\n\
    -rbox c G1 d D2 | qvoronoi s p       rbox c P0 D2 | qvoronoi s Fv QV0\n\
    -\n\
    -";
    -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    -
    -/*---------------------------------
    -
    -  qh_prompt3
    -    concise prompt for qhull
    -*/
    -char qh_prompt3[]= "\n\
    -Qhull %s.\n\
    -Except for 'F.' and 'PG', upper-case options take an argument.\n\
    -\n\
    - OFF_format     p_vertices     i_delaunay     summary        facet_dump\n\
    -\n\
    - Fcoincident    Fd_cdd_in      FD_cdd_out     FF-dump-xridge Fi_bounded\n\
    - Fxtremes       Fmerges        Fneighbors     FNeigh_region  FOptions\n\
    - Fo_unbounded   FPoint_near    FQvoronoi      Fsummary       Fvoronoi\n\
    - FIDs\n\
    -\n\
    - Gvertices      Gpoints        Gall_points    Gno_planes     Ginner\n\
    - Gcentrums      Ghyperplanes   Gridges        Gouter         GDrop_dim\n\
    -\n\
    - PArea_keep     Pdrop d0:0D0   Pgood          PFacet_area_keep\n\
    - PGood_neighbors PMerge_keep   Poutput_forced Pprecision_not\n\
    -\n\
    - QG_vertex_good Qsearch_1st    Qupper_voronoi QV_point_good  Qzinfinite\n\
    - T4_trace       Tcheck_often   Tstatistics    Tverify        Tz_stdout\n\
    - TFacet_log     TInput_file    TPoint_trace   TMerge_trace   TOutput_file\n\
    - TWide_trace    TVertex_stop   TCone_stop\n\
    -\n\
    - Angle_max      Centrum_size   Random_dist    Wide_outside\n\
    -";
    -
    -/*---------------------------------
    -
    -  main( argc, argv )
    -    processes the command line, calls qhull() to do the work, and exits
    -
    -  design:
    -    initializes data structures
    -    reads points
    -    finishes initialization
    -    computes convex hull and other structures
    -    checks the result
    -    writes the output
    -    frees memory
    -*/
    -int main(int argc, char *argv[]) {
    -  int curlong, totlong; /* used !qh_NOmem */
    -  int exitcode, numpoints, dim;
    -  coordT *points;
    -  boolT ismalloc;
    -
    -  QHULL_LIB_CHECK /* Check for compatible library */
    -
    -  if ((argc == 1) && isatty( 0 /*stdin*/)) {
    -    fprintf(stdout, qh_prompt2, qh_version);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) {
    -    fprintf(stdout, qh_prompta, qh_version,
    -                qh_promptb, qh_promptc, qh_promptd, qh_prompte);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '.' && !*(argv[1]+1)) {
    -    fprintf(stdout, qh_prompt3, qh_version);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '-' && *(argv[1]+1)=='V') {
    -      fprintf(stdout, "%s\n", qh_version2);
    -      exit(qh_ERRnone);
    -  }
    -  qh_init_A(stdin, stdout, stderr, argc, argv);  /* sets qh qhull_command */
    -  exitcode= setjmp(qh errexit); /* simple statement for CRAY J916 */
    -  if (!exitcode) {
    -    qh NOerrexit= False;
    -    qh_option("voronoi  _bbound-last  _coplanar-keep", NULL, NULL);
    -    qh DELAUNAY= True;     /* 'v'   */
    -    qh VORONOI= True;
    -    qh SCALElast= True;    /* 'Qbb' */
    -    qh_checkflags(qh qhull_command, hidden_options);
    -    qh_initflags(qh qhull_command);
    -    points= qh_readpoints(&numpoints, &dim, &ismalloc);
    -    if (dim >= 5) {
    -      qh_option("_merge-exact", NULL, NULL);
    -      qh MERGEexact= True; /* 'Qx' always */
    -    }
    -    qh_init_B(points, numpoints, dim, ismalloc);
    -    qh_qhull();
    -    qh_check_output();
    -    qh_produce_output();
    -    if (qh VERIFYoutput && !qh FORCEoutput && !qh STOPpoint && !qh STOPcone)
    -      qh_check_points();
    -    exitcode= qh_ERRnone;
    -  }
    -  qh NOerrexit= True;  /* no more setjmp */
    -#ifdef qh_NOmem
    -  qh_freeqhull(qh_ALL);
    -#else
    -  qh_freeqhull(!qh_ALL);
    -  qh_memfreeshort(&curlong, &totlong);
    -  if (curlong || totlong)
    -    qh_fprintf_stderr(6263, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
    -       totlong, curlong);
    -#endif
    -  return exitcode;
    -} /* main */
    -
    diff --git a/src/qhull/src/qvoronoi/qvoronoi.pro b/src/qhull/src/qvoronoi/qvoronoi.pro
    deleted file mode 100644
    index 4646c84472d..00000000000
    --- a/src/qhull/src/qvoronoi/qvoronoi.pro
    +++ /dev/null
    @@ -1,9 +0,0 @@
    -# -------------------------------------------------
    -# qvoronoi.pro -- Qt project file for qvoronoi.exe
    -# -------------------------------------------------
    -
    -include(../qhull-app-c.pri)
    -
    -TARGET = qvoronoi
    -
    -SOURCES += qvoronoi.c
    diff --git a/src/qhull/src/qvoronoi/qvoronoi_r.c b/src/qhull/src/qvoronoi/qvoronoi_r.c
    deleted file mode 100644
    index 6323c8b496a..00000000000
    --- a/src/qhull/src/qvoronoi/qvoronoi_r.c
    +++ /dev/null
    @@ -1,305 +0,0 @@
    -/*
      ---------------------------------
    -
    -   qvoronoi.c
    -     compute Voronoi diagrams and furthest-point Voronoi
    -     diagrams using qhull
    -
    -   see unix.c for full interface
    -
    -   Copyright (c) 1993-2015, The Geometry Center
    -*/
    -
    -#include "libqhull_r/libqhull_r.h"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#if __cplusplus
    -extern "C" {
    -  int isatty(int);
    -}
    -
    -#elif _MSC_VER
    -#include 
    -#define isatty _isatty
    -/* int _isatty(int); */
    -
    -#else
    -int isatty(int);  /* returns 1 if stdin is a tty
    -                   if "Undefined symbol" this can be deleted along with call in main() */
    -#endif
    -
    -/*---------------------------------
    -
    -  qh_prompt
    -    long prompt for qhull
    -
    -  notes:
    -    restricted version of libqhull.c
    -
    -  see:
    -    concise prompt below
    -*/
    -
    -/* duplicated in qvoron_f.htm and qvoronoi.htm
    -   QJ and Qt are deprecated, but allowed for backwards compatibility
    -*/
    -char hidden_options[]=" d n m v H U Qb QB Qc Qf Qg Qi Qm Qr QR Qv Qx TR E V Fa FA FC Fp FS Ft FV Pv Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 ";
    -
    -char qh_prompta[]= "\n\
    -qvoronoi- compute the Voronoi diagram\n\
    -    http://www.qhull.org  %s\n\
    -\n\
    -input (stdin):\n\
    -    first lines: dimension and number of points (or vice-versa).\n\
    -    other lines: point coordinates, best if one point per line\n\
    -    comments:    start with a non-numeric character\n\
    -\n\
    -options:\n\
    -    Qu   - compute furthest-site Voronoi diagram\n\
    -\n\
    -Qhull control options:\n\
    -    Qz   - add point-at-infinity to Voronoi diagram\n\
    -%s%s%s%s";  /* split up qh_prompt for Visual C++ */
    -char qh_promptb[]= "\
    -    Qs   - search all points for the initial simplex\n\
    -    QGn  - Voronoi vertices if visible from point n, -n if not\n\
    -    QVn  - Voronoi vertices for input point n, -n if not\n\
    -\n\
    -";
    -char qh_promptc[]= "\
    -Trace options:\n\
    -    T4   - trace at level n, 4=all, 5=mem/gauss, -1= events\n\
    -    Tc   - check frequently during execution\n\
    -    Ts   - statistics\n\
    -    Tv   - verify result: structure, convexity, and in-circle test\n\
    -    Tz   - send all output to stdout\n\
    -    TFn  - report summary when n or more facets created\n\
    -    TI file - input data from file, no spaces or single quotes\n\
    -    TO file - output results to file, may be enclosed in single quotes\n\
    -    TPn  - turn on tracing when point n added to hull\n\
    -     TMn - turn on tracing at merge n\n\
    -     TWn - trace merge facets when width > n\n\
    -    TVn  - stop qhull after adding point n, -n for before (see TCn)\n\
    -     TCn - stop qhull after building cone for point n (see TVn)\n\
    -\n\
    -Precision options:\n\
    -    Cn   - radius of centrum (roundoff added).  Merge facets if non-convex\n\
    -     An  - cosine of maximum angle.  Merge facets if cosine > n or non-convex\n\
    -           C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge\n\
    -    Rn   - randomly perturb computations by a factor of [1-n,1+n]\n\
    -    Wn   - min facet width for non-coincident point (before roundoff)\n\
    -\n\
    -Output formats (may be combined; if none, produces a summary to stdout):\n\
    -    s    - summary to stderr\n\
    -    p    - Voronoi vertices\n\
    -    o    - OFF format (dim, Voronoi vertices, and Voronoi regions)\n\
    -    i    - Delaunay regions (use 'Pp' to avoid warning)\n\
    -    f    - facet dump\n\
    -\n\
    -";
    -char qh_promptd[]= "\
    -More formats:\n\
    -    Fc   - count plus coincident points (by Voronoi vertex)\n\
    -    Fd   - use cdd format for input (homogeneous with offset first)\n\
    -    FD   - use cdd format for output (offset first)\n\
    -    FF   - facet dump without ridges\n\
    -    Fi   - separating hyperplanes for bounded Voronoi regions\n\
    -    FI   - ID for each Voronoi vertex\n\
    -    Fm   - merge count for each Voronoi vertex (511 max)\n\
    -    Fn   - count plus neighboring Voronoi vertices for each Voronoi vertex\n\
    -    FN   - count and Voronoi vertices for each Voronoi region\n\
    -    Fo   - separating hyperplanes for unbounded Voronoi regions\n\
    -    FO   - options and precision constants\n\
    -    FP   - nearest point and distance for each coincident point\n\
    -    FQ   - command used for qvoronoi\n\
    -    Fs   - summary: #int (8), dimension, #points, tot vertices, tot facets,\n\
    -                    for output: #Voronoi regions, #Voronoi vertices,\n\
    -                                #coincident points, #non-simplicial regions\n\
    -                    #real (2), max outer plane and min vertex\n\
    -    Fv   - Voronoi diagram as Voronoi vertices between adjacent input sites\n\
    -    Fx   - extreme points of Delaunay triangulation (on convex hull)\n\
    -\n\
    -";
    -char qh_prompte[]= "\
    -Geomview options (2-d only)\n\
    -    Ga   - all points as dots\n\
    -     Gp  -  coplanar points and vertices as radii\n\
    -     Gv  -  vertices as spheres\n\
    -    Gi   - inner planes only\n\
    -     Gn  -  no planes\n\
    -     Go  -  outer planes only\n\
    -    Gc   - centrums\n\
    -    Gh   - hyperplane intersections\n\
    -    Gr   - ridges\n\
    -    GDn  - drop dimension n in 3-d and 4-d output\n\
    -\n\
    -Print options:\n\
    -    PAn  - keep n largest Voronoi vertices by 'area'\n\
    -    Pdk:n - drop facet if normal[k] <= n (default 0.0)\n\
    -    PDk:n - drop facet if normal[k] >= n\n\
    -    Pg   - print good Voronoi vertices (needs 'QGn' or 'QVn')\n\
    -    PFn  - keep Voronoi vertices whose 'area' is at least n\n\
    -    PG   - print neighbors of good Voronoi vertices\n\
    -    PMn  - keep n Voronoi vertices with most merges\n\
    -    Po   - force output.  If error, output neighborhood of facet\n\
    -    Pp   - do not report precision problems\n\
    -\n\
    -    .    - list of all options\n\
    -    -    - one line descriptions of all options\n\
    -    -V   - version\n\
    -";
    -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    -
    -/*---------------------------------
    -
    -  qh_prompt2
    -    synopsis for qhull
    -*/
    -char qh_prompt2[]= "\n\
    -qvoronoi- compute the Voronoi diagram.  Qhull %s\n\
    -    input (stdin): dimension, number of points, point coordinates\n\
    -    comments start with a non-numeric character\n\
    -\n\
    -options (qvoronoi.htm):\n\
    -    Qu   - compute furthest-site Voronoi diagram\n\
    -    Tv   - verify result: structure, convexity, and in-circle test\n\
    -    .    - concise list of all options\n\
    -    -    - one-line description of all options\n\
    -    -V   - version\n\
    -\n\
    -output options (subset):\n\
    -    s    - summary of results (default)\n\
    -    p    - Voronoi vertices\n\
    -    o    - OFF file format (dim, Voronoi vertices, and Voronoi regions)\n\
    -    FN   - count and Voronoi vertices for each Voronoi region\n\
    -    Fv   - Voronoi diagram as Voronoi vertices between adjacent input sites\n\
    -    Fi   - separating hyperplanes for bounded regions, 'Fo' for unbounded\n\
    -    G    - Geomview output (2-d only)\n\
    -    QVn  - Voronoi vertices for input point n, -n if not\n\
    -    TO file- output results to file, may be enclosed in single quotes\n\
    -\n\
    -examples:\n\
    -rbox c P0 D2 | qvoronoi s o         rbox c P0 D2 | qvoronoi Fi\n\
    -rbox c P0 D2 | qvoronoi Fo          rbox c P0 D2 | qvoronoi Fv\n\
    -rbox c P0 D2 | qvoronoi s Qu Fv     rbox c P0 D2 | qvoronoi Qu Fo\n\
    -rbox c G1 d D2 | qvoronoi s p       rbox c P0 D2 | qvoronoi s Fv QV0\n\
    -\n\
    -";
    -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
    -
    -/*---------------------------------
    -
    -  qh_prompt3
    -    concise prompt for qhull
    -*/
    -char qh_prompt3[]= "\n\
    -Qhull %s.\n\
    -Except for 'F.' and 'PG', upper-case options take an argument.\n\
    -\n\
    - OFF_format     p_vertices     i_delaunay     summary        facet_dump\n\
    -\n\
    - Fcoincident    Fd_cdd_in      FD_cdd_out     FF-dump-xridge Fi_bounded\n\
    - Fxtremes       Fmerges        Fneighbors     FNeigh_region  FOptions\n\
    - Fo_unbounded   FPoint_near    FQvoronoi      Fsummary       Fvoronoi\n\
    - FIDs\n\
    -\n\
    - Gvertices      Gpoints        Gall_points    Gno_planes     Ginner\n\
    - Gcentrums      Ghyperplanes   Gridges        Gouter         GDrop_dim\n\
    -\n\
    - PArea_keep     Pdrop d0:0D0   Pgood          PFacet_area_keep\n\
    - PGood_neighbors PMerge_keep   Poutput_forced Pprecision_not\n\
    -\n\
    - QG_vertex_good Qsearch_1st    Qupper_voronoi QV_point_good  Qzinfinite\n\
    - T4_trace       Tcheck_often   Tstatistics    Tverify        Tz_stdout\n\
    - TFacet_log     TInput_file    TPoint_trace   TMerge_trace   TOutput_file\n\
    - TWide_trace    TVertex_stop   TCone_stop\n\
    -\n\
    - Angle_max      Centrum_size   Random_dist    Wide_outside\n\
    -";
    -
    -/*---------------------------------
    -
    -  main( argc, argv )
    -    processes the command line, calls qhull() to do the work, and exits
    -
    -  design:
    -    initializes data structures
    -    reads points
    -    finishes initialization
    -    computes convex hull and other structures
    -    checks the result
    -    writes the output
    -    frees memory
    -*/
    -int main(int argc, char *argv[]) {
    -  int curlong, totlong; /* used !qh_NOmem */
    -  int exitcode, numpoints, dim;
    -  coordT *points;
    -  boolT ismalloc;
    -  qhT qh_qh;
    -  qhT *qh= &qh_qh;
    -
    -  QHULL_LIB_CHECK /* Check for compatible library */
    -
    -  if ((argc == 1) && isatty( 0 /*stdin*/)) {
    -    fprintf(stdout, qh_prompt2, qh_version);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) {
    -    fprintf(stdout, qh_prompta, qh_version,
    -                qh_promptb, qh_promptc, qh_promptd, qh_prompte);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '.' && !*(argv[1]+1)) {
    -    fprintf(stdout, qh_prompt3, qh_version);
    -    exit(qh_ERRnone);
    -  }
    -  if (argc > 1 && *argv[1] == '-' && *(argv[1]+1)=='V') {
    -      fprintf(stdout, "%s\n", qh_version2);
    -      exit(qh_ERRnone);
    -  }
    -  qh_init_A(qh, stdin, stdout, stderr, argc, argv);  /* sets qh->qhull_command */
    -  exitcode= setjmp(qh->errexit); /* simple statement for CRAY J916 */
    -  if (!exitcode) {
    -    qh->NOerrexit = False;
    -    qh_option(qh, "voronoi  _bbound-last  _coplanar-keep", NULL, NULL);
    -    qh->DELAUNAY= True;     /* 'v'   */
    -    qh->VORONOI= True;
    -    qh->SCALElast= True;    /* 'Qbb' */
    -    qh_checkflags(qh, qh->qhull_command, hidden_options);
    -    qh_initflags(qh, qh->qhull_command);
    -    points= qh_readpoints(qh, &numpoints, &dim, &ismalloc);
    -    if (dim >= 5) {
    -      qh_option(qh, "_merge-exact", NULL, NULL);
    -      qh->MERGEexact= True; /* 'Qx' always */
    -    }
    -    qh_init_B(qh, points, numpoints, dim, ismalloc);
    -    qh_qhull(qh);
    -    qh_check_output(qh);
    -    qh_produce_output(qh);
    -    if (qh->VERIFYoutput && !qh->FORCEoutput && !qh->STOPpoint && !qh->STOPcone)
    -      qh_check_points(qh);
    -    exitcode= qh_ERRnone;
    -  }
    -  qh->NOerrexit= True;  /* no more setjmp */
    -#ifdef qh_NOmem
    -  qh_freeqhull(qh, qh_ALL);
    -#else
    -  qh_freeqhull(qh, !qh_ALL);
    -  qh_memfreeshort(qh, &curlong, &totlong);
    -  if (curlong || totlong)
    -    qh_fprintf_stderr(6263, "qhull internal warning (main): did not free %d bytes of long memory(%d pieces)\n",
    -       totlong, curlong);
    -#endif
    -  return exitcode;
    -} /* main */
    -
    diff --git a/src/qhull/src/rbox/rbox.c b/src/qhull/src/rbox/rbox.c
    deleted file mode 100644
    index d7c51b1aaff..00000000000
    --- a/src/qhull/src/rbox/rbox.c
    +++ /dev/null
    @@ -1,88 +0,0 @@
    -/*
      ---------------------------------
    -
    -   rbox.c
    -     rbox program for generating input points for qhull.
    -
    -   notes:
    -     50 points generated for 'rbox D4'
    -
    -*/
    -
    -#include "libqhull/libqhull.h"
    -#include "libqhull/random.h"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#ifdef _MSC_VER  /* Microsoft Visual C++ -- warning level 4 */
    -#pragma warning( disable : 4706)  /* assignment within conditional function */
    -#endif
    -
    -char prompt[]= "\n\
    --rbox- generate various point distributions.  Default is random in cube.\n\
    -\n\
    -args (any order, space separated):                    Version: 2016/01/18\n\
    -  3000    number of random points in cube, lens, spiral, sphere or grid\n\
    -  D3      dimension 3-d\n\
    -  c       add a unit cube to the output ('c G2.0' sets size)\n\
    -  d       add a unit diamond to the output ('d G2.0' sets size)\n\
    -  l       generate a regular 3-d spiral\n\
    -  r       generate a regular polygon, ('r s Z1 G0.1' makes a cone)\n\
    -  s       generate cospherical points\n\
    -  x       generate random points in simplex, may use 'r' or 'Wn'\n\
    -  y       same as 'x', plus simplex\n\
    -  Cn,r,m  add n nearly coincident points within radius r of m points\n\
    -  Pn,m,r  add point [n,m,r] first, pads with 0, maybe repeated\n\
    -\n\
    -  Ln      lens distribution of radius n.  Also 's', 'r', 'G', 'W'.\n\
    -  Mn,m,r  lattice(Mesh) rotated by [n,-m,0], [m,n,0], [0,0,r], ...\n\
    -          '27 M1,0,1' is {0,1,2} x {0,1,2} x {0,1,2}.  Try 'M3,4 z'.\n\
    -  W0.1    random distribution within 0.1 of the cube's or sphere's surface\n\
    -  Z0.5 s  random points in a 0.5 disk projected to a sphere\n\
    -  Z0.5 s G0.6 same as Z0.5 within a 0.6 gap\n\
    -\n\
    -  Bn      bounding box coordinates, default %2.2g\n\
    -  h       output as homogeneous coordinates for cdd\n\
    -  n       remove command line from the first line of output\n\
    -  On      offset coordinates by n\n\
    -  t       use time as the random number seed(default is command line)\n\
    -  tn      use n as the random number seed\n\
    -  z       print integer coordinates, default 'Bn' is %2.2g\n\
    -";
    -
    -/*--------------------------------------------
    --rbox-  main procedure of rbox application
    -*/
    -int main(int argc, char **argv) {
    -  char *command;
    -  int command_size;
    -  int return_status;
    -
    -  QHULL_LIB_CHECK_RBOX
    -
    -  if (argc == 1) {
    -    printf(prompt, qh_DEFAULTbox, qh_DEFAULTzbox);
    -    return 1;
    -  }
    -  if (argc == 2 && strcmp(argv[1], "D4")==0)
    -    qh_fprintf_stderr(0, "\nStarting the rbox smoketest for qhull.  An immediate failure indicates\nthat non-reentrant rbox was linked to reentrant routines.  An immediate\nfailure of qhull may indicate that qhull was linked to the wrong\nqhull library.  Also try 'rbox D4 | qhull T1'\n");
    -
    -  command_size= qh_argv_to_command_size(argc, argv);
    -  if ((command= (char *)qh_malloc((size_t)command_size))) {
    -    if (!qh_argv_to_command(argc, argv, command, command_size)) {
    -      qh_fprintf_stderr(6264, "rbox internal error: allocated insufficient memory (%d) for arguments\n", command_size);
    -      return_status= qh_ERRinput;
    -    }else{
    -      return_status= qh_rboxpoints(stdout, stderr, command);
    -    }
    -    qh_free(command);
    -  }else {
    -    qh_fprintf_stderr(6265, "rbox error: insufficient memory for %d bytes\n", command_size);
    -    return_status= qh_ERRmem;
    -  }
    -  return return_status;
    -}/*main*/
    -
    diff --git a/src/qhull/src/rbox/rbox.pro b/src/qhull/src/rbox/rbox.pro
    deleted file mode 100644
    index 6c21bdb6df0..00000000000
    --- a/src/qhull/src/rbox/rbox.pro
    +++ /dev/null
    @@ -1,9 +0,0 @@
    -# -------------------------------------------------
    -# rbox.pro -- Qt project for rbox.exe with libqhullstatic
    -# -------------------------------------------------
    -
    -include(../qhull-app-c.pri)
    -
    -TARGET = rbox
    -
    -SOURCES += rbox.c
    diff --git a/src/qhull/src/rbox/rbox_r.c b/src/qhull/src/rbox/rbox_r.c
    deleted file mode 100644
    index 6ec74d914b5..00000000000
    --- a/src/qhull/src/rbox/rbox_r.c
    +++ /dev/null
    @@ -1,78 +0,0 @@
    -
    -/*
      ---------------------------------
    -
    -   rbox.c
    -     rbox program for generating input points for qhull.
    -
    -   notes:
    -     50 points generated for 'rbox D4'
    -
    -*/
    -
    -#include "libqhull_r/libqhull_r.h"
    -#include "libqhull/random_r.h"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#ifdef _MSC_VER  /* Microsoft Visual C++ -- warning level 4 */
    -#pragma warning( disable : 4706)  /* assignment within conditional function */
    -#endif
    -
    -char prompt[]= "\n\
    --rbox- generate various point distributions.  Default is random in cube.\n\
    -\n\
    -args (any order, space separated):                    Version: 2016/01/18 r\n\
    -  3000    number of random points in cube, lens, spiral, sphere or grid\n\
    -  D3      dimension 3-d\n\
    -  c       add a unit cube to the output ('c G2.0' sets size)\n\
    -  d       add a unit diamond to the output ('d G2.0' sets size)\n\
    -  l       generate a regular 3-d spiral\n\
    -  r       generate a regular polygon, ('r s Z1 G0.1' makes a cone)\n\
    -  s       generate cospherical points\n\
    -  x       generate random points in simplex, may use 'r' or 'Wn'\n\
    -  y       same as 'x', plus simplex\n\
    -  Cn,r,m  add n nearly coincident points within radius r of m points\n\
    -  Pn,m,r  add point [n,m,r] first, pads with 0, maybe repeated\n\
    -\n\
    -  Ln      lens distribution of radius n.  Also 's', 'r', 'G', 'W'.\n\
    -  Mn,m,r  lattice(Mesh) rotated by [n,-m,0], [m,n,0], [0,0,r], ...\n\
    -          '27 M1,0,1' is {0,1,2} x {0,1,2} x {0,1,2}.  Try 'M3,4 z'.\n\
    -  W0.1    random distribution within 0.1 of the cube's or sphere's surface\n\
    -  Z0.5 s  random points in a 0.5 disk projected to a sphere\n\
    -  Z0.5 s G0.6 same as Z0.5 within a 0.6 gap\n\
    -\n\
    -  Bn      bounding box coordinates, default %2.2g\n\
    -  h       output as homogeneous coordinates for cdd\n\
    -  n       remove command line from the first line of output\n\
    -  On      offset coordinates by n\n\
    -  t       use time as the random number seed(default is command line)\n\
    -  tn      use n as the random number seed\n\
    -  z       print integer coordinates, default 'Bn' is %2.2g\n\
    -";
    -
    -/*--------------------------------------------
    --rbox-  main procedure of rbox application
    -*/
    -int main(int argc, char **argv) {
    -  int return_status;
    -  qhT qh_qh;
    -  qhT *qh= &qh_qh;
    -
    -  QHULL_LIB_CHECK_RBOX
    -
    -  if (argc == 1) {
    -    printf(prompt, qh_DEFAULTbox, qh_DEFAULTzbox);
    -    return 1;
    -  }
    -  if (argc == 2 && strcmp(argv[1], "D4")==0)
    -    qh_fprintf_stderr(0, "\nStarting the rbox smoketest for qhull.  An immediate failure indicates\nthat reentrant rbox was linked to non-reentrant routines.  An immediate\nfailure of qhull may indicate that qhull was linked to the wrong\nqhull library.  Also try 'rbox D4 | qhull T1'\n");
    -
    -  qh_init_A(qh, stdin, stdout, stderr, argc, argv);  /*no qh_errexit, sets qh->qhull_command */
    -  return_status= qh_rboxpoints(qh, qh->qhull_command); /* Traps its own errors, qh_errexit_rbox() */
    -  return return_status;
    -}/*main*/
    -
    diff --git a/src/qhull/src/testqset/testqset.c b/src/qhull/src/testqset/testqset.c
    deleted file mode 100644
    index 61057eef9c3..00000000000
    --- a/src/qhull/src/testqset/testqset.c
    +++ /dev/null
    @@ -1,891 +0,0 @@
    -/*
      ---------------------------------
    -
    -   testset.c -- test qset.c and its use of mem.c
    -
    -   The test sets are pointers to int.  Normally a set is a pointer to a type (e.g., facetT, ridgeT, etc.).
    -   For consistency in notation, an "int" is typedef'd to i2T
    -
    -Functions and macros from qset.h.  Counts occurrences in this test.  Does not correspond to thoroughness.
    -    qh_setaddsorted -- 4 tests
    -    qh_setaddnth -- 1 test
    -    qh_setappend -- 7 tests
    -    qh_setappend_set -- 1 test
    -    qh_setappend2ndlast -- 1 test
    -    qh_setcheck -- lots of tests
    -    qh_setcompact -- 7 tests
    -    qh_setcopy -- 3 tests
    -    qh_setdel -- 1 tests
    -    qh_setdellast -- 1 tests
    -    qh_setdelnth -- 2 tests
    -    qh_setdelnthsorted -- 2 tests
    -    qh_setdelsorted -- 1 test
    -    qh_setduplicate -- not testable here
    -    qh_setequal -- 4 tests
    -    qh_setequal_except -- 2 tests
    -    qh_setequal_skip -- 2 tests
    -    qh_setfree -- 11+ tests
    -    qh_setfree2 -- not testable here
    -    qh_setfreelong -- 2 tests
    -    qh_setin -- 3 tests
    -    qh_setindex -- 4 tests
    -    qh_setlarger -- 1 test
    -    qh_setlast -- 2 tests
    -    qh_setnew -- 6 tests
    -    qh_setnew_delnthsorted
    -    qh_setprint -- tested elsewhere
    -    qh_setreplace -- 1 test
    -    qh_setsize -- 9+ tests
    -    qh_settemp -- 2 tests
    -    qh_settempfree -- 1 test
    -    qh_settempfree_all -- 1 test
    -    qh_settemppop -- 1 test
    -    qh_settemppush -- 1 test
    -    qh_settruncate -- 3 tests
    -    qh_setunique -- 3 tests
    -    qh_setzero -- 1 test
    -    FOREACHint_ -- 2 test
    -    FOREACHint4_
    -    FOREACHint_i_ -- 1 test
    -    FOREACHintreverse_
    -    FOREACHintreverse12_
    -    FOREACHsetelement_ -- 1 test
    -    FOREACHsetelement_i_ -- 1 test
    -    FOREACHsetelementreverse_ -- 1 test
    -    FOREACHsetelementreverse12_ -- 1 test
    -    SETelem_ -- 3 tests
    -    SETelemaddr_ -- 2 tests
    -    SETelemt_ -- not tested (generic)
    -    SETempty_ -- 1 test
    -    SETfirst_ -- 4 tests
    -    SETfirstt_ -- 2 tests
    -    SETindex_ -- 2 tests
    -    SETref_ -- 2 tests
    -    SETreturnsize_ -- 2 tests
    -    SETsecond_ -- 1 test
    -    SETsecondt_ -- 2 tests
    -    SETtruncate_ -- 2 tests
    -
    -    Copyright (c) 2012-2015 C.B. Barber. All rights reserved.
    -    $Id: //main/2015/qhull/src/testqset/testqset.c#4 $$Change: 2062 $
    -    $DateTime: 2016/01/17 13:13:18 $$Author: bbarber $
    -*/
    -
    -#include "libqhull/user.h"  /* QHULL_CRTDBG */
    -#include "libqhull/qset.h"
    -#include "libqhull/mem.h"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -typedef int i2T;
    -#define MAXerrorCount 100 /* quit after n errors */
    -
    -#define FOREACHint_( ints ) FOREACHsetelement_( i2T, ints, i2)
    -#define FOREACHint4_( ints ) FOREACHsetelement_( i2T, ints, i4)
    -#define FOREACHint_i_( ints ) FOREACHsetelement_i_( i2T, ints, i2)
    -#define FOREACHintreverse_( ints ) FOREACHsetelementreverse_( i2T, ints, i2)
    -#define FOREACHintreverse12_( ints ) FOREACHsetelementreverse12_( i2T, ints, i2)
    -
    -enum {
    -    MAXint= 0x7fffffff,
    -};
    -
    -char prompt[]= "testqset N [M] [T5] -- Test qset.c and mem.c\n\
    -  \n\
    -  If this test fails then qhull will not work.\n\
    -  \n\
    -  Test qsets of 0..N integers with a check every M iterations (default ~log10)\n\
    -  Additional checking and logging if M is 1\n\
    -  \n\
    -  T5 turns on memory logging (qset does not log)\n\
    -  \n\
    -  For example:\n\
    -    testqset 10000\n\
    -";
    -
    -int error_count= 0;  /* Global error_count.  checkSetContents() keeps its own error count.  It exits on too many errors */
    -
    -/* Macros normally defined in geom.h */
    -#define fmax_( a,b )  ( ( a ) < ( b ) ? ( b ) : ( a ) )
    -
    -/* Macros normally defined in user.h */
    -
    -#define realT double
    -#define qh_MEMalign ((int)(fmax_(sizeof(realT), sizeof(void *))))
    -#define qh_MEMbufsize 0x10000       /* allocate 64K memory buffers */
    -#define qh_MEMinitbuf 0x20000      /* initially allocate 128K buffer */
    -
    -/* Macros normally defined in QhullSet.h */
    -
    -
    -/* Functions normally defined in user.h for usermem.c */
    -
    -void    qh_exit(int exitcode);
    -void    qh_fprintf_stderr(int msgcode, const char *fmt, ... );
    -void    qh_free(void *mem);
    -void   *qh_malloc(size_t size);
    -
    -/* Normally defined in user.c */
    -
    -void    qh_errexit(int exitcode, void *f, void *r)
    -{
    -    (void)f; /* unused */
    -    (void)r; /* unused */
    -    qh_exit(exitcode);
    -}
    -
    -/* Normally defined in userprintf.c */
    -
    -void    qh_fprintf(FILE *fp, int msgcode, const char *fmt, ... )
    -{
    -    static int needs_cr= 0;  /* True if qh_fprintf needs a CR */
    -
    -    size_t fmtlen= strlen(fmt);
    -    va_list args;
    -
    -    if (!fp) {
    -        /* Do not use qh_fprintf_stderr.  This is a standalone program */
    -        fprintf(stderr, "QH6232 qh_fprintf: fp not defined for '%s'", fmt);
    -        qh_errexit(6232, NULL, NULL);
    -    }
    -    if(fmtlen>0){
    -        if(fmt[fmtlen-1]=='\n'){
    -            if(needs_cr && fmtlen>1){
    -                fprintf(fp, "\n");
    -            }
    -            needs_cr= 0;
    -        }else{
    -            needs_cr= 1;
    -        }
    -    }
    -    if(msgcode>=6000 && msgcode<7000){
    -        fprintf(fp, "Error TQ%d ", msgcode);
    -    }
    -    va_start(args, fmt);
    -    vfprintf(fp, fmt, args);
    -    va_end(args);
    -}
    -
    -/* Defined below in order of use */
    -int main(int argc, char **argv);
    -void readOptions(int argc, char **argv, const char *promptstr, int *numInts, int *checkEvery, int *traceLevel);
    -void setupMemory(int tracelevel, int numInts, int **intarray);
    -
    -void testSetappendSettruncate(int numInts, int *intarray, int checkEvery);
    -void testSetdelSetadd(int numInts, int *intarray, int checkEvery);
    -void testSetappendSet(int numInts, int *intarray, int checkEvery);
    -void testSetcompactCopy(int numInts, int *intarray, int checkEvery);
    -void testSetequalInEtc(int numInts, int *intarray, int checkEvery);
    -void testSettemp(int numInts, int *intarray, int checkEvery);
    -void testSetlastEtc(int numInts, int *intarray, int checkEvery);
    -void testSetdelsortedEtc(int numInts, int *intarray, int checkEvery);
    -
    -int log_i(setT *set, const char *s, int i, int numInts, int checkEvery);
    -void checkSetContents(const char *name, setT *set, int count, int rangeA, int rangeB, int rangeC);
    -
    -int main(int argc, char **argv) {
    -    int *intarray= NULL;
    -    int numInts;
    -    int checkEvery= MAXint;
    -    int curlong, totlong;
    -    int traceLevel= 4; /* 4 normally, no tracing since qset does not log.  5 for memory tracing */
    -
    -#if defined(_MSC_VER) && defined(_DEBUG) && defined(QHULL_CRTDBG)  /* user.h */
    -    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_DELAY_FREE_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) );
    -    _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG );
    -    _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDERR );
    -#endif
    -
    -    readOptions(argc, argv, prompt, &numInts, &checkEvery, &traceLevel);
    -    setupMemory(traceLevel, numInts, &intarray);
    -
    -    testSetappendSettruncate(numInts, intarray, checkEvery);
    -    testSetdelSetadd(numInts, intarray, checkEvery);
    -    testSetappendSet(numInts, intarray, checkEvery);
    -    testSetcompactCopy(numInts, intarray, checkEvery);
    -    testSetequalInEtc(numInts, intarray, checkEvery);
    -    testSettemp(numInts, intarray, checkEvery);
    -    testSetlastEtc(numInts, intarray, checkEvery);
    -    testSetdelsortedEtc(numInts, intarray, checkEvery);
    -    printf("\n\nNot testing qh_setduplicate and qh_setfree2.\n  These routines use heap-allocated set contents.  See qhull tests.\n");
    -
    -    qh_memstatistics(stdout);
    -    qh_memfreeshort(&curlong, &totlong);
    -    if (curlong || totlong){
    -        qh_fprintf(stderr, 8043, "qh_memfreeshort: did not free %d bytes of long memory(%d pieces)\n", totlong, curlong);
    -        error_count++;
    -    }
    -    if(error_count){
    -        qh_fprintf(stderr, 8012, "testqset: %d errors\n\n", error_count);
    -        exit(1);
    -    }else{
    -        printf("testqset: OK\n\n");
    -    }
    -    return 0;
    -}/*main*/
    -
    -void readOptions(int argc, char **argv, const char *promptstr, int *numInts, int *checkEvery, int *traceLevel)
    -{
    -    long numIntsArg;
    -    long checkEveryArg;
    -    char *endp;
    -    int isTracing= 0;
    -
    -    if (argc < 2 || argc > 4) {
    -        printf("%s", promptstr);
    -        exit(0);
    -    }
    -    numIntsArg= strtol(argv[1], &endp, 10);
    -    if(numIntsArg<1){
    -        qh_fprintf(stderr, 6301, "First argument should be 1 or greater.  Got '%s'\n", argv[1]);
    -        exit(1);
    -    }
    -    if(numIntsArg>MAXint){
    -        qh_fprintf(stderr, 6302, "qset does not currently support 64-bit ints.  Maximum count is %d\n", MAXint);
    -        exit(1);
    -    }
    -    *numInts= (int)numIntsArg;
    -
    -    if(argc==3 && argv[2][0]=='T' && argv[2][1]=='5' ){
    -        isTracing= 1;
    -        *traceLevel= 5;
    -    }
    -    if(argc==4 || (argc==3 && !isTracing)){
    -        checkEveryArg= strtol(argv[2], &endp, 10);
    -        if(checkEveryArg<1){
    -            qh_fprintf(stderr, 6321, "checkEvery argument should be 1 or greater.  Got '%s'\n", argv[2]);
    -            exit(1);
    -        }
    -        if(checkEveryArg>MAXint){
    -            qh_fprintf(stderr, 6322, "qset does not currently support 64-bit ints.  Maximum checkEvery is %d\n", MAXint);
    -            exit(1);
    -        }
    -        if(argc==4){
    -            if(argv[3][0]=='T' && argv[3][1]=='5' ){
    -                isTracing= 1;
    -                *traceLevel= 5;
    -            }else{
    -                qh_fprintf(stderr, 6242, "Optional third argument must be 'T5'.  Got '%s'\n", argv[3]);
    -                exit(1);
    -            }
    -        }
    -        *checkEvery= (int)checkEveryArg;
    -    }
    -}/*readOptions*/
    -
    -void setupMemory(int tracelevel, int numInts, int **intarray)
    -{
    -    int i;
    -    if(numInts<0 || numInts*(int)sizeof(int)<0){
    -        qh_fprintf(stderr, 6303, "qset does not currently support 64-bit ints.  Integer overflow\n");
    -        exit(1);
    -    }
    -    *intarray= qh_malloc(numInts * sizeof(int));
    -    if(!*intarray){
    -        qh_fprintf(stderr, 6304, "Failed to allocate %d bytes of memory\n", numInts * sizeof(int));
    -        exit(1);
    -    }
    -    for(i= 0; i=2){
    -        isCheck= log_i(ints, "n", numInts/2, numInts, checkEvery);
    -        qh_settruncate(ints, numInts/2);
    -        checkSetContents("qh_settruncate by half", ints, numInts/2, 0, -1, -1);
    -    }
    -    isCheck= log_i(ints, "n", 0, numInts, checkEvery);
    -    qh_settruncate(ints, 0);
    -    checkSetContents("qh_settruncate", ints, 0, -1, -1, -1);
    -
    -    qh_fprintf(stderr, 8003, "\n\nTesting qh_setappend2ndlast 0,0..%d.  Test 0", numInts-1);
    -    qh_setfree(&ints);
    -    ints= qh_setnew(4);
    -    qh_setappend(&ints, intarray+0);
    -    for(i= 0; i=2){
    -        isCheck= log_i(ints, "n", numInts/2, numInts, checkEvery);
    -        SETtruncate_(ints, numInts/2);
    -        checkSetContents("SETtruncate_ by half", ints, numInts/2, 0, -1, -1);
    -    }
    -    isCheck= log_i(ints, "n", 0, numInts, checkEvery);
    -    SETtruncate_(ints, 0);
    -    checkSetContents("SETtruncate_", ints, 0, -1, -1, -1);
    -
    -    qh_setfree(&ints);
    -}/*testSetappendSettruncate*/
    -
    -void testSetdelSetadd(int numInts, int *intarray, int checkEvery)
    -{
    -    setT *ints=qh_setnew(1);
    -    int i,j,isCheck;
    -
    -    qh_fprintf(stderr, 8003, "\n\nTesting qh_setdelnthsorted and qh_setaddnth 1..%d. Test", numInts-1);
    -    for(j=1; j3){
    -                qh_setdelsorted(ints, intarray+i/2);
    -                checkSetContents("qh_setdelsorted", ints, j-1, 0, i/2+1, -1);
    -                qh_setaddsorted(&ints, intarray+i/2);
    -                checkSetContents("qh_setaddsorted i/2", ints, j, 0, 0, -1);
    -            }
    -            qh_setdellast(ints);
    -            checkSetContents("qh_setdellast", ints, (j ? j-1 : 0), 0, -1, -1);
    -            if(j>0){
    -                qh_setaddsorted(&ints, intarray+j-1);
    -                checkSetContents("qh_setaddsorted j-1", ints, j, 0, -1, -1);
    -            }
    -            if(j>4){
    -                qh_setdelnthsorted(ints, i/2);
    -                if (checkEvery==1)
    -                  checkSetContents("qh_setdelnthsorted", ints, j-1, 0, i/2+1, -1);
    -                /* test qh_setdelnth and move-to-front */
    -                qh_setdelsorted(ints, intarray+i/2+1);
    -                checkSetContents("qh_setdelsorted 2", ints, j-2, 0, i/2+2, -1);
    -                qh_setaddsorted(&ints, intarray+i/2+1);
    -                if (checkEvery==1)
    -                  checkSetContents("qh_setaddsorted i/2+1", ints, j-1, 0, i/2+1, -1);
    -                qh_setaddsorted(&ints, intarray+i/2);
    -                checkSetContents("qh_setaddsorted i/2 again", ints, j, 0, -1, -1);
    -            }
    -            qh_setfree(&ints2);
    -            ints2= qh_setcopy(ints, 0);
    -            qh_setcompact(ints);
    -            qh_setcompact(ints2);
    -            checkSetContents("qh_setcompact", ints, j, 0, 0, -1);
    -            checkSetContents("qh_setcompact 2", ints2, j, 0, 0, -1);
    -            qh_setcompact(ints);
    -            checkSetContents("qh_setcompact 3", ints, j, 0, 0, -1);
    -            qh_setfree(&ints2);
    -        }
    -    }
    -    qh_setfreelong(&ints);
    -    if(ints){
    -        qh_setfree(&ints); /* Was quick memory */
    -    }
    -}/*testSetdelsortedEtc*/
    -
    -void testSetequalInEtc(int numInts, int *intarray, int checkEvery)
    -{
    -    setT *ints= NULL;
    -    setT *ints2= NULL;
    -    setT *ints3= NULL;
    -    int i,j,n;
    -
    -    qh_fprintf(stderr, 8019, "\n\nTesting qh_setequal*, qh_setin*, qh_setdel, qh_setdelnth, and qh_setlarger 0..%d. Test", numInts-1);
    -    for(j=0; j0){
    -                if(qh_setequal(ints, ints2)){
    -                    qh_fprintf(stderr, 6324, "testSetequalInEtc: non-empty set equal to empty set\n", j);
    -                    error_count++;
    -                }
    -                qh_setfree(&ints3);
    -                ints3= qh_setcopy(ints, 0);
    -                checkSetContents("qh_setreplace", ints3, j, 0, -1, -1);
    -                qh_setreplace(ints3, intarray+j/2, intarray+j/2+1);
    -                if(j==1){
    -                    checkSetContents("qh_setreplace 2", ints3, j, j/2+1, -1, -1);
    -                }else if(j==2){
    -                    checkSetContents("qh_setreplace 3", ints3, j, 0, j/2+1, -1);
    -                }else{
    -                    checkSetContents("qh_setreplace 3", ints3, j, 0, j/2+1, j/2+1);
    -                }
    -                if(qh_setequal(ints, ints3)){
    -                    qh_fprintf(stderr, 6325, "testSetequalInEtc: modified set equal to original set at %d/2\n", j);
    -                    error_count++;
    -                }
    -                if(!qh_setequal_except(ints, intarray+j/2, ints3, intarray+j/2+1)){
    -                    qh_fprintf(stderr, 6326, "qh_setequal_except: modified set not equal to original set except modified\n", j);
    -                    error_count++;
    -                }
    -                if(qh_setequal_except(ints, intarray+j/2, ints3, intarray)){
    -                    qh_fprintf(stderr, 6327, "qh_setequal_except: modified set equal to original set with wrong excepts\n", j);
    -                    error_count++;
    -                }
    -                if(!qh_setequal_skip(ints, j/2, ints3, j/2)){
    -                    qh_fprintf(stderr, 6328, "qh_setequal_skip: modified set not equal to original set except modified\n", j);
    -                    error_count++;
    -                }
    -                if(j>2 && qh_setequal_skip(ints, j/2, ints3, 0)){
    -                    qh_fprintf(stderr, 6329, "qh_setequal_skip: modified set equal to original set with wrong excepts\n", j);
    -                    error_count++;
    -                }
    -                if(intarray+j/2+1!=qh_setdel(ints3, intarray+j/2+1)){
    -                    qh_fprintf(stderr, 6330, "qh_setdel: failed to find added element\n", j);
    -                    error_count++;
    -                }
    -                checkSetContents("qh_setdel", ints3, j-1, 0, j-1, (j==1 ? -1 : j/2+1));  /* swaps last element with deleted element */
    -                if(j>3){
    -                    qh_setdelnth(ints3, j/2); /* Delete at the same location as the original replace, for only one out-of-order element */
    -                    checkSetContents("qh_setdelnth", ints3, j-2, 0, j-2, (j==2 ? -1 : j/2+1));
    -                }
    -                if(qh_setin(ints3, intarray+j/2)){
    -                    qh_fprintf(stderr, 6331, "qh_setin: found deleted element\n");
    -                    error_count++;
    -                }
    -                if(j>4 && !qh_setin(ints3, intarray+1)){
    -                    qh_fprintf(stderr, 6332, "qh_setin: did not find second element\n");
    -                    error_count++;
    -                }
    -                if(j>4 && !qh_setin(ints3, intarray+j-2)){
    -                    qh_fprintf(stderr, 6333, "qh_setin: did not find last element\n");
    -                    error_count++;
    -                }
    -                if(-1!=qh_setindex(ints2, intarray)){
    -                    qh_fprintf(stderr, 6334, "qh_setindex: found element in empty set\n");
    -                    error_count++;
    -                }
    -                if(-1!=qh_setindex(ints3, intarray+j/2)){
    -                    qh_fprintf(stderr, 6335, "qh_setindex: found deleted element in set\n");
    -                    error_count++;
    -                }
    -                if(0!=qh_setindex(ints, intarray)){
    -                    qh_fprintf(stderr, 6336, "qh_setindex: did not find first in set\n");
    -                    error_count++;
    -                }
    -                if(j-1!=qh_setindex(ints, intarray+j-1)){
    -                    qh_fprintf(stderr, 6337, "qh_setindex: did not find last in set\n");
    -                    error_count++;
    -                }
    -            }
    -            qh_setfree(&ints2);
    -        }
    -    }
    -    qh_setfree(&ints3);
    -    qh_setfreelong(&ints);
    -    if(ints){
    -        qh_setfree(&ints); /* Was quick memory */
    -    }
    -}/*testSetequalInEtc*/
    -
    -
    -void testSetlastEtc(int numInts, int *intarray, int checkEvery)
    -{
    -    setT *ints= NULL;
    -    setT *ints2= NULL;
    -    int i,j,prepend;
    -
    -    qh_fprintf(stderr, 8020, "\n\nTesting qh_setlast, qh_setnew_delnthsorted, qh_setunique, and qh_setzero 0..%d. Test", numInts-1);
    -    for(j=0; j0){
    -                if(intarray+j-1!=qh_setlast(ints)){
    -                    qh_fprintf(stderr, 6338, "qh_setlast: wrong last element\n");
    -                    error_count++;
    -                }
    -                prepend= (j<100 ? j/4 : 0);
    -                ints2= qh_setnew_delnthsorted(ints, qh_setsize(ints), j/2, prepend);
    -                if(qh_setsize(ints2)!=j+prepend-1){
    -                    qh_fprintf(stderr, 6345, "qh_setnew_delnthsorted: Expecting %d elements, got %d\n", j+prepend-1, qh_setsize(ints2));
    -                    error_count++;
    -                }
    -                /* Define prepended elements.  Otherwise qh_setdelnthsorted may fail */
    -                for(i= 0; i2){
    -                    qh_setzero(ints2, j/2, j-1);  /* max size may be j-1 */
    -                    if(qh_setsize(ints2)!=j-1){
    -                        qh_fprintf(stderr, 6342, "qh_setzero: Expecting %d elements, got %d\n", j, qh_setsize(ints2));
    -                        error_count++;
    -                    }
    -                    qh_setcompact(ints2);
    -                    checkSetContents("qh_setzero", ints2, j/2, 0, -1, -1);
    -                }
    -            }
    -            qh_setfree(&ints2);
    -        }
    -    }
    -    qh_setfreelong(&ints);
    -    if(ints){
    -        qh_setfree(&ints); /* Was quick memory */
    -    }
    -}/*testSetlastEtc*/
    -
    -void testSettemp(int numInts, int *intarray, int checkEvery)
    -{
    -    setT *ints= NULL;
    -    setT *ints2= NULL;
    -    setT *ints3= NULL;
    -    int i,j;
    -
    -    qh_fprintf(stderr, 8021, "\n\nTesting qh_settemp* 0..%d. Test", numInts-1);
    -    for(j=0; j0){
    -                qh_settemppush(ints);
    -                ints3= qh_settemppop();
    -                if(ints!=ints3){
    -                    qh_fprintf(stderr, 6343, "qh_settemppop: didn't pop the push\n");
    -                    error_count++;
    -                }
    -            }
    -            qh_settempfree(&ints2);
    -        }
    -    }
    -    qh_setfreelong(&ints);
    -    if(ints){
    -        qh_setfree(&ints); /* Was quick memory */
    -    }
    -}/*testSettemp*/
    -
    -/* Check that a set contains count elements
    -   Ranges are consecutive (e.g., 1,2,3,...) starting with first, mid, and last
    -   Use -1 for missing ranges
    -   Returns -1 if should check results
    -*/
    -int log_i(setT *set, const char *s, int i, int numInts, int checkEvery)
    -{
    -    int j= i;
    -    int scale= 1;
    -    int e= 0;
    -    int *i2, **i2p;
    -
    -    if(*s || checkEvery==1){
    -        if(i<10){
    -            qh_fprintf(stderr, 8004, " %s%d", s, i);
    -        }else{
    -            if(i==11 && checkEvery==1){
    -                qh_fprintf(stderr, 8005, "\nResults after 10: ");
    -                FOREACHint_(set){
    -                    qh_fprintf(stderr, 8006, " %d", *i2);
    -                }
    -                qh_fprintf(stderr, 8007, " Continue");
    -            }
    -            while((j= j/10)>=1){
    -                scale *= 10;
    -                e++;
    -            }
    -            if(i==numInts-1){
    -                qh_fprintf(stderr, 8008, " %s%d", s, i);
    -            }else if(i==scale){
    -                if(i<=1000){
    -                    qh_fprintf(stderr, 8010, " %s%d", s, i);
    -                }else{
    -                    qh_fprintf(stderr, 8009, " %s1e%d", s, e);
    -                }
    -            }
    -        }
    -    }
    -    if(i<1000 || i%checkEvery==0 || i== scale || i==numInts-1){
    -        return 1;
    -    }
    -    return 0;
    -}/*log_i*/
    -
    -/* Check that a set contains count elements
    -   Ranges are consecutive (e.g., 1,2,3,...) starting with first, mid, and last
    -   Use -1 for missing ranges
    -*/
    -void checkSetContents(const char *name, setT *set, int count, int rangeA, int rangeB, int rangeC)
    -{
    -
    -    i2T *i2, **i2p;
    -    int i2_i, i2_n;
    -    int prev= -1; /* avoid warning */
    -    int i;
    -    int first= -3;
    -    int second= -3;
    -    int rangeCount=1;
    -    int actualSize= 0;
    -
    -    qh_setcheck(set, name, 0);
    -    if(set){
    -        SETreturnsize_(set, actualSize);  /* normally used only when speed is critical */
    -        if(*qh_setendpointer(set)!=NULL){
    -            qh_fprintf(stderr, 6344, "%s: qh_setendpointer(), 0x%x, is not NULL terminator of set 0x%x", name, qh_setendpointer(set), set);
    -            error_count++;
    -        }
    -    }
    -    if(actualSize!=qh_setsize(set)){
    -        qh_fprintf(stderr, 6305, "%s: SETreturnsize_() returned %d while qh_setsize() returns %d\n", name, actualSize, qh_setsize(set));
    -        error_count++;
    -    }else if(actualSize!=count){
    -        qh_fprintf(stderr, 6306, "%s: Expecting %d elements for set.  Got %d elements\n", name, count, actualSize);
    -        error_count++;
    -    }
    -    if(SETempty_(set)){
    -        if(count!=0){
    -            qh_fprintf(stderr, 6307, "%s: Got empty set instead of count %d, rangeA %d, rangeB %d, rangeC %d\n", name, count, rangeA, rangeB, rangeC);
    -            error_count++;
    -        }
    -    }else{
    -        /* Must be first, otherwise trips msvc 8 */
    -        i2T **p= SETaddr_(set, i2T);
    -        if(*p!=SETfirstt_(set, i2T)){
    -            qh_fprintf(stderr, 6309, "%s: SETaddr_(set, i2t) [%p] is not the same as SETfirst_(set) [%p]\n", name, SETaddr_(set, i2T), SETfirst_(set));
    -            error_count++;
    -        }
    -        first= *(int *)SETfirst_(set);
    -        if(SETfirst_(set)!=SETfirstt_(set, i2T)){
    -            qh_fprintf(stderr, 6308, "%s: SETfirst_(set) [%p] is not the same as SETfirstt_(set, i2T [%p]\n", name, SETfirst_(set), SETfirstt_(set, i2T));
    -            error_count++;
    -        }
    -        if(qh_setsize(set)>1){
    -            second= *(int *)SETsecond_(set);
    -            if(SETsecond_(set)!=SETsecondt_(set, i2T)){
    -                qh_fprintf(stderr, 6310, "%s: SETsecond_(set) [%p] is not the same as SETsecondt_(set, i2T) [%p]\n", name, SETsecond_(set), SETsecondt_(set, i2T));
    -                error_count++;
    -            }
    -        }
    -    }
    -    /* Test first run of ints in set*/
    -    i= 0;
    -    FOREACHint_(set){
    -        if(i2!=SETfirst_(set) && *i2!=prev+1){
    -            break;
    -        }
    -        prev= *i2;
    -        if(SETindex_(set, i2)!=i){
    -            qh_fprintf(stderr, 6311, "%s: Expecting SETIndex_(set, pointer-to-%d) to be %d.  Got %d\n", name, *i2, i, SETindex_(set, i2));
    -            error_count++;;
    -        }
    -        if(i2!=SETref_(i2)){
    -            qh_fprintf(stderr, 6312, "%s: SETref_(i2) [%p] does not point to i2 (the %d'th element)\n", name, SETref_(i2), i);
    -            error_count++;;
    -        }
    -        i++;
    -    }
    -    FOREACHint_i_(set){
    -        /* Must be first conditional, otherwise it trips up msvc 8 */
    -        i2T **p= SETelemaddr_(set, i2_i, i2T);
    -        if(i2!=*p){
    -            qh_fprintf(stderr, 6320, "%s: SETelemaddr_(set, %d, i2T) [%p] does not point to i2\n", name, i2_i, SETelemaddr_(set, i2_i, int));
    -            error_count++;;
    -        }
    -        if(i2_i==0){
    -            if(first!=*i2){
    -                qh_fprintf(stderr, 6314, "%s: First element is %d instead of SETfirst %d\n", name, *i2, first);
    -                error_count++;;
    -            }
    -            if(rangeA!=*i2){
    -                qh_fprintf(stderr, 6315, "%s: starts with %d instead of rangeA %d\n", name, *i2, rangeA);
    -                error_count++;;
    -            }
    -            prev= rangeA;
    -        }else{
    -            if(i2_i==1 && second!=*i2){
    -                qh_fprintf(stderr, 6316, "%s: Second element is %d instead of SETsecond %d\n", name, *i2, second);
    -                error_count++;;
    -            }
    -            if(prev+1==*i2){
    -                prev++;
    -            }else{
    -                if(*i2==rangeB){
    -                    prev= rangeB;
    -                    rangeB= -1;
    -                    rangeCount++;
    -                }else if(rangeB==-1 && *i2==rangeC){
    -                    prev= rangeC;
    -                    rangeC= -1;
    -                    rangeCount++;
    -                }else{
    -                    prev++;
    -                    qh_fprintf(stderr, 6317, "%s: Expecting %d'th element to be %d.  Got %d\n", name, i2_i, prev, *i2);
    -                    error_count++;
    -                }
    -            }
    -        }
    -        if(i2!=SETelem_(set, i2_i)){
    -            qh_fprintf(stderr, 6318, "%s: SETelem_(set, %d) [%p] is not i2 [%p] (the %d'th element)\n", name, i2_i, SETelem_(set, i2_i), i2, i2_i);
    -            error_count++;;
    -        }
    -        if(SETelemt_(set, i2_i, i2T)!=SETelem_(set, i2_i)){   /* Normally SETelemt_ is used for generic sets */
    -            qh_fprintf(stderr, 6319, "%s: SETelemt_(set, %d, i2T) [%p] is not SETelem_(set, %d) [%p] (the %d'th element)\n", name, i2_i, SETelemt_(set, i2_i, int), i2_i, SETelem_(set, i2_i), i2_i);
    -            error_count++;;
    -        }
    -    }
    -    if(error_count>=MAXerrorCount){
    -        qh_fprintf(stderr, 8011, "testqset: Stop testing after %d errors\n", error_count);
    -        exit(1);
    -    }
    -}/*checkSetContents*/
    -
    diff --git a/src/qhull/src/testqset/testqset.pro b/src/qhull/src/testqset/testqset.pro
    deleted file mode 100644
    index 3f69048aac2..00000000000
    --- a/src/qhull/src/testqset/testqset.pro
    +++ /dev/null
    @@ -1,30 +0,0 @@
    -# -------------------------------------------------
    -# testqset.pro -- Qt project file for testqset.exe
    -# -------------------------------------------------
    -
    -include(../qhull-warn.pri)
    -
    -TARGET = testqset
    -
    -DESTDIR = ../../bin
    -TEMPLATE = app
    -CONFIG += console warn_on
    -CONFIG -= qt
    -CONFIG += qhull_warn_conversion
    -
    -build_pass:CONFIG(debug, debug|release){
    -   OBJECTS_DIR = Debug
    -}else:build_pass:CONFIG(release, debug|release){
    -   OBJECTS_DIR = Release
    -}
    -
    -INCLUDEPATH += ..
    -
    -SOURCES += testqset.c
    -SOURCES += ../libqhull/qset.c
    -SOURCES += ../libqhull/mem.c
    -SOURCES += ../libqhull/usermem.c
    -
    -HEADERS += ../libqhull/mem.h
    -HEADERS += ../libqhull/qset.h
    -
    diff --git a/src/qhull/src/testqset_r/testqset_r.c b/src/qhull/src/testqset_r/testqset_r.c
    deleted file mode 100644
    index 9a6d496e400..00000000000
    --- a/src/qhull/src/testqset_r/testqset_r.c
    +++ /dev/null
    @@ -1,890 +0,0 @@
    -/*
      ---------------------------------
    -
    -   testset.c -- test qset.c and its use of mem.c
    -
    -   The test sets are pointers to int.  Normally a set is a pointer to a type (e.g., facetT, ridgeT, etc.).
    -   For consistency in notation, an "int" is typedef'd to i2T
    -
    -Functions and macros from qset.h.  Counts occurrences in this test.  Does not correspond to thoroughness.
    -    qh_setaddsorted -- 4 tests
    -    qh_setaddnth -- 1 test
    -    qh_setappend -- 7 tests
    -    qh_setappend_set -- 1 test
    -    qh_setappend2ndlast -- 1 test
    -    qh_setcheck -- lots of tests
    -    qh_setcompact -- 7 tests
    -    qh_setcopy -- 3 tests
    -    qh_setdel -- 1 tests
    -    qh_setdellast -- 1 tests
    -    qh_setdelnth -- 2 tests
    -    qh_setdelnthsorted -- 2 tests
    -    qh_setdelsorted -- 1 test
    -    qh_setduplicate -- not testable here
    -    qh_setequal -- 4 tests
    -    qh_setequal_except -- 2 tests
    -    qh_setequal_skip -- 2 tests
    -    qh_setfree -- 11+ tests
    -    qh_setfree2 -- not testable here
    -    qh_setfreelong -- 2 tests
    -    qh_setin -- 3 tests
    -    qh_setindex -- 4 tests
    -    qh_setlarger -- 1 test
    -    qh_setlast -- 2 tests
    -    qh_setnew -- 6 tests
    -    qh_setnew_delnthsorted
    -    qh_setprint -- tested elsewhere
    -    qh_setreplace -- 1 test
    -    qh_setsize -- 9+ tests
    -    qh_settemp -- 2 tests
    -    qh_settempfree -- 1 test
    -    qh_settempfree_all -- 1 test
    -    qh_settemppop -- 1 test
    -    qh_settemppush -- 1 test
    -    qh_settruncate -- 3 tests
    -    qh_setunique -- 3 tests
    -    qh_setzero -- 1 test
    -    FOREACHint_ -- 2 test
    -    FOREACHint4_
    -    FOREACHint_i_ -- 1 test
    -    FOREACHintreverse_
    -    FOREACHintreverse12_
    -    FOREACHsetelement_ -- 1 test
    -    FOREACHsetelement_i_ -- 1 test
    -    FOREACHsetelementreverse_ -- 1 test
    -    FOREACHsetelementreverse12_ -- 1 test
    -    SETelem_ -- 3 tests
    -    SETelemaddr_ -- 2 tests
    -    SETelemt_ -- not tested (generic)
    -    SETempty_ -- 1 test
    -    SETfirst_ -- 4 tests
    -    SETfirstt_ -- 2 tests
    -    SETindex_ -- 2 tests
    -    SETref_ -- 2 tests
    -    SETreturnsize_ -- 2 tests
    -    SETsecond_ -- 1 test
    -    SETsecondt_ -- 2 tests
    -    SETtruncate_ -- 2 tests
    -
    -    Copyright (c) 2012-2015 C.B. Barber. All rights reserved.
    -    $Id: //main/2015/qhull/src/testqset_r/testqset_r.c#5 $$Change: 2064 $
    -    $DateTime: 2016/01/18 12:36:08 $$Author: bbarber $
    -*/
    -
    -#include "libqhull_r/user_r.h"  /* QHULL_CRTDBG */
    -#include "libqhull_r/qset_r.h"
    -#include "libqhull_r/mem_r.h"
    -#include "libqhull_r/libqhull_r.h"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -typedef int i2T;
    -#define MAXerrorCount 100 /* quit after n errors */
    -
    -#define FOREACHint_( ints ) FOREACHsetelement_( i2T, ints, i2)
    -#define FOREACHint4_( ints ) FOREACHsetelement_( i2T, ints, i4)
    -#define FOREACHint_i_( qh, ints ) FOREACHsetelement_i_( qh, i2T, ints, i2)
    -#define FOREACHintreverse_( qh, ints ) FOREACHsetelementreverse_( qh, i2T, ints, i2)
    -#define FOREACHintreverse12_( ints ) FOREACHsetelementreverse12_( i2T, ints, i2)
    -
    -enum {
    -    MAXint= 0x7fffffff,
    -};
    -
    -char prompt[]= "testqset_r N [M] [T5] -- Test reentrant qset_r.c and mem_r.c\n\
    -  \n\
    -  If this test fails then reentrant Qhull will not work.\n\
    -  \n\
    -  Test qsets of 0..N integers with a check every M iterations (default ~log10)\n\
    -  Additional checking and logging if M is 1\n\
    -  \n\
    -  T5 turns on memory logging (qset does not log)\n\
    -  \n\
    -  For example:\n\
    -    testqset_r 10000\n\
    -";
    -
    -int error_count= 0;  /* Global error_count.  checkSetContents(qh) keeps its own error count.  It exits on too many errors */
    -
    -/* Macros normally defined in geom.h */
    -#define fmax_( a,b )  ( ( a ) < ( b ) ? ( b ) : ( a ) )
    -
    -/* Macros normally defined in QhullSet.h */
    -
    -/* Functions normally defined in user_r.h for usermem_r.c */
    -
    -void    qh_exit(int exitcode);
    -void    qh_fprintf_stderr(int msgcode, const char *fmt, ... );
    -void    qh_free(void *mem);
    -void   *qh_malloc(size_t size);
    -
    -/* Normally defined in user_r.c */
    -
    -void    qh_errexit(qhT *qh, int exitcode, facetT *f, ridgeT *r)
    -{
    -    (void)f; /* unused */
    -    (void)r; /* unused */
    -    (void)qh; /* unused */
    -    qh_exit(exitcode);
    -}
    -
    -/* Normally defined in userprintf.c */
    -
    -void    qh_fprintf(qhT *qh, FILE *fp, int msgcode, const char *fmt, ... )
    -{
    -    static int needs_cr= 0;  /* True if qh_fprintf needs a CR. testqset_r is not itself reentrant */
    -
    -    size_t fmtlen= strlen(fmt);
    -    va_list args;
    -
    -    if (!fp) {
    -        /* Do not use qh_fprintf_stderr.  This is a standalone program */
    -        if(!qh)
    -            fprintf(stderr, "QH6241 qh_fprintf: fp and qh not defined for '%s'", fmt);
    -        else
    -            fprintf(stderr, "QH6232 qh_fprintf: fp is 0.  Was wrong qh_fprintf called for '%s'", fmt);
    -        qh_errexit(qh, 6232, NULL, NULL);
    -    }
    -    if(fmtlen>0){
    -        if(fmt[fmtlen-1]=='\n'){
    -            if(needs_cr && fmtlen>1){
    -                fprintf(fp, "\n");
    -            }
    -            needs_cr= 0;
    -        }else{
    -            needs_cr= 1;
    -        }
    -    }
    -    if(msgcode>=6000 && msgcode<7000){
    -        fprintf(fp, "Error TQ%d ", msgcode);
    -    }
    -    va_start(args, fmt);
    -    vfprintf(fp, fmt, args);
    -    va_end(args);
    -}
    -
    -/* Defined below in order of use */
    -int main(int argc, char **argv);
    -void readOptions(qhT *qh, int argc, char **argv, const char *promptstr, int *numInts, int *checkEvery, int *traceLevel);
    -void setupMemory(qhT *qh, int tracelevel, int numInts, int **intarray);
    -
    -void testSetappendSettruncate(qhT *qh, int numInts, int *intarray, int checkEvery);
    -void testSetdelSetadd(qhT *qh, int numInts, int *intarray, int checkEvery);
    -void testSetappendSet(qhT *qh, int numInts, int *intarray, int checkEvery);
    -void testSetcompactCopy(qhT *qh, int numInts, int *intarray, int checkEvery);
    -void testSetequalInEtc(qhT *qh, int numInts, int *intarray, int checkEvery);
    -void testSettemp(qhT *qh, int numInts, int *intarray, int checkEvery);
    -void testSetlastEtc(qhT *qh, int numInts, int *intarray, int checkEvery);
    -void testSetdelsortedEtc(qhT *qh, int numInts, int *intarray, int checkEvery);
    -
    -int log_i(qhT *qh, setT *set, const char *s, int i, int numInts, int checkEvery);
    -void checkSetContents(qhT *qh, const char *name, setT *set, int count, int rangeA, int rangeB, int rangeC);
    -
    -int main(int argc, char **argv) {
    -    int *intarray= NULL;
    -    int numInts;
    -    int checkEvery= MAXint;
    -    int curlong, totlong;
    -    int traceLevel= 4; /* 4 normally, no tracing since qset does not log.  Option 'T5' for memory tracing */
    -    qhT qh_qh;
    -    qhT *qh= &qh_qh;
    -
    -#if defined(_MSC_VER) && defined(_DEBUG) && defined(QHULL_CRTDBG)  /* user_r.h */
    -    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_DELAY_FREE_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) );
    -    _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG );
    -    _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDERR );
    -#endif
    -
    -    readOptions(qh, argc, argv, prompt, &numInts, &checkEvery, &traceLevel);
    -    setupMemory(qh, traceLevel, numInts, &intarray);
    -
    -    testSetappendSettruncate(qh, numInts, intarray, checkEvery);
    -    testSetdelSetadd(qh, numInts, intarray, checkEvery);
    -    testSetappendSet(qh, numInts, intarray, checkEvery);
    -    testSetcompactCopy(qh, numInts, intarray, checkEvery);
    -    testSetequalInEtc(qh, numInts, intarray, checkEvery);
    -    testSettemp(qh, numInts, intarray, checkEvery);
    -    testSetlastEtc(qh, numInts, intarray, checkEvery);
    -    testSetdelsortedEtc(qh, numInts, intarray, checkEvery);
    -    printf("\n\nNot testing qh_setduplicate and qh_setfree2.\n  These routines use heap-allocated set contents.  See qhull tests.\n");
    -
    -    qh_memstatistics(qh, stdout);
    -    qh_memfreeshort(qh, &curlong, &totlong);
    -    if (curlong || totlong){
    -        qh_fprintf(qh, stderr, 8043, "qh_memfreeshort: did not free %d bytes of long memory(%d pieces)\n", totlong, curlong);
    -        error_count++;
    -    }
    -    if(error_count){
    -        qh_fprintf(qh, stderr, 8012, "testqset: %d errors\n\n", error_count);
    -        exit(1);
    -    }else{
    -        printf("testqset_r: OK\n\n");
    -    }
    -    return 0;
    -}/*main*/
    -
    -void readOptions(qhT *qh, int argc, char **argv, const char *promptstr, int *numInts, int *checkEvery, int *traceLevel)
    -{
    -    long numIntsArg;
    -    long checkEveryArg;
    -    char *endp;
    -    int isTracing= 0;
    -
    -    if (argc < 2 || argc > 4) {
    -        printf("%s", promptstr);
    -        exit(0);
    -    }
    -    numIntsArg= strtol(argv[1], &endp, 10);
    -    if(numIntsArg<1){
    -        qh_fprintf(qh, stderr, 6301, "First argument should be 1 or greater.  Got '%s'\n", argv[1]);
    -        exit(1);
    -    }
    -    if(numIntsArg>MAXint){
    -        qh_fprintf(qh, stderr, 6302, "qset does not currently support 64-bit ints.  Maximum count is %d\n", MAXint);
    -        exit(1);
    -    }
    -    *numInts= (int)numIntsArg;
    -
    -    if(argc==3 && argv[2][0]=='T' && argv[2][1]=='5' ){
    -        isTracing= 1;
    -        *traceLevel= 5;
    -    }
    -    if(argc==4 || (argc==3 && !isTracing)){
    -        checkEveryArg= strtol(argv[2], &endp, 10);
    -        if(checkEveryArg<1){
    -            qh_fprintf(qh, stderr, 6321, "checkEvery argument should be 1 or greater.  Got '%s'\n", argv[2]);
    -            exit(1);
    -        }
    -        if(checkEveryArg>MAXint){
    -            qh_fprintf(qh, stderr, 6322, "qset does not currently support 64-bit ints.  Maximum checkEvery is %d\n", MAXint);
    -            exit(1);
    -        }
    -        if(argc==4){
    -            if(argv[3][0]=='T' && argv[3][1]=='5' ){
    -                isTracing= 1;
    -                *traceLevel= 5;
    -            }else{
    -                qh_fprintf(qh, stderr, 6242, "Optional third argument must be 'T5'.  Got '%s'\n", argv[3]);
    -                exit(1);
    -            }
    -        }
    -        *checkEvery= (int)checkEveryArg;
    -    }
    -}/*readOptions*/
    -
    -void setupMemory(qhT *qh, int tracelevel, int numInts, int **intarray)
    -{
    -    int i;
    -    if(numInts<0 || numInts*(int)sizeof(int)<0){
    -        qh_fprintf(qh, stderr, 6303, "qset does not currently support 64-bit ints.  Integer overflow\n");
    -        exit(1);
    -    }
    -    *intarray= qh_malloc(numInts * sizeof(int));
    -    if(!*intarray){
    -        qh_fprintf(qh, stderr, 6304, "Failed to allocate %d bytes of memory\n", numInts * sizeof(int));
    -        exit(1);
    -    }
    -    for(i= 0; i=2){
    -        isCheck= log_i(qh, ints, "n", numInts/2, numInts, checkEvery);
    -        qh_settruncate(qh, ints, numInts/2);
    -        checkSetContents(qh, "qh_settruncate by half", ints, numInts/2, 0, -1, -1);
    -    }
    -    isCheck= log_i(qh, ints, "n", 0, numInts, checkEvery);
    -    qh_settruncate(qh, ints, 0);
    -    checkSetContents(qh, "qh_settruncate", ints, 0, -1, -1, -1);
    -
    -    qh_fprintf(qh, stderr, 8003, "\n\nTesting qh_setappend2ndlast 0,0..%d.  Test 0", numInts-1);
    -    qh_setfree(qh, &ints);
    -    ints= qh_setnew(qh, 4);
    -    qh_setappend(qh, &ints, intarray+0);
    -    for(i= 0; i=2){
    -        isCheck= log_i(qh, ints, "n", numInts/2, numInts, checkEvery);
    -        SETtruncate_(ints, numInts/2);
    -        checkSetContents(qh, "SETtruncate_ by half", ints, numInts/2, 0, -1, -1);
    -    }
    -    isCheck= log_i(qh, ints, "n", 0, numInts, checkEvery);
    -    SETtruncate_(ints, 0);
    -    checkSetContents(qh, "SETtruncate_", ints, 0, -1, -1, -1);
    -
    -    qh_setfree(qh, &ints);
    -}/*testSetappendSettruncate*/
    -
    -void testSetdelSetadd(qhT *qh, int numInts, int *intarray, int checkEvery)
    -{
    -    setT *ints=qh_setnew(qh, 1);
    -    int i,j,isCheck;
    -
    -    qh_fprintf(qh, stderr, 8003, "\n\nTesting qh_setdelnthsorted and qh_setaddnth 1..%d. Test", numInts-1);
    -    for(j=1; j3){
    -                qh_setdelsorted(ints, intarray+i/2);
    -                checkSetContents(qh, "qh_setdelsorted", ints, j-1, 0, i/2+1, -1);
    -                qh_setaddsorted(qh, &ints, intarray+i/2);
    -                checkSetContents(qh, "qh_setaddsorted i/2", ints, j, 0, 0, -1);
    -            }
    -            qh_setdellast(ints);
    -            checkSetContents(qh, "qh_setdellast", ints, (j ? j-1 : 0), 0, -1, -1);
    -            if(j>0){
    -                qh_setaddsorted(qh, &ints, intarray+j-1);
    -                checkSetContents(qh, "qh_setaddsorted j-1", ints, j, 0, -1, -1);
    -            }
    -            if(j>4){
    -                qh_setdelnthsorted(qh, ints, i/2);
    -                if (checkEvery==1)
    -                  checkSetContents(qh, "qh_setdelnthsorted", ints, j-1, 0, i/2+1, -1);
    -                /* test qh_setdelnth and move-to-front */
    -                qh_setdelsorted(ints, intarray+i/2+1);
    -                checkSetContents(qh, "qh_setdelsorted 2", ints, j-2, 0, i/2+2, -1);
    -                qh_setaddsorted(qh, &ints, intarray+i/2+1);
    -                if (checkEvery==1)
    -                  checkSetContents(qh, "qh_setaddsorted i/2+1", ints, j-1, 0, i/2+1, -1);
    -                qh_setaddsorted(qh, &ints, intarray+i/2);
    -                checkSetContents(qh, "qh_setaddsorted i/2 again", ints, j, 0, -1, -1);
    -            }
    -            qh_setfree(qh, &ints2);
    -            ints2= qh_setcopy(qh, ints, 0);
    -            qh_setcompact(qh, ints);
    -            qh_setcompact(qh, ints2);
    -            checkSetContents(qh, "qh_setcompact", ints, j, 0, 0, -1);
    -            checkSetContents(qh, "qh_setcompact 2", ints2, j, 0, 0, -1);
    -            qh_setcompact(qh, ints);
    -            checkSetContents(qh, "qh_setcompact 3", ints, j, 0, 0, -1);
    -            qh_setfree(qh, &ints2);
    -        }
    -    }
    -    qh_setfreelong(qh, &ints);
    -    if(ints){
    -        qh_setfree(qh, &ints); /* Was quick memory */
    -    }
    -}/*testSetdelsortedEtc*/
    -
    -void testSetequalInEtc(qhT *qh, int numInts, int *intarray, int checkEvery)
    -{
    -    setT *ints= NULL;
    -    setT *ints2= NULL;
    -    setT *ints3= NULL;
    -    int i,j,n;
    -
    -    qh_fprintf(qh, stderr, 8019, "\n\nTesting qh_setequal*, qh_setin*, qh_setdel, qh_setdelnth, and qh_setlarger 0..%d. Test", numInts-1);
    -    for(j=0; j0){
    -                if(qh_setequal(ints, ints2)){
    -                    qh_fprintf(qh, stderr, 6324, "testSetequalInEtc: non-empty set equal to empty set\n", j);
    -                    error_count++;
    -                }
    -                qh_setfree(qh, &ints3);
    -                ints3= qh_setcopy(qh, ints, 0);
    -                checkSetContents(qh, "qh_setreplace", ints3, j, 0, -1, -1);
    -                qh_setreplace(qh, ints3, intarray+j/2, intarray+j/2+1);
    -                if(j==1){
    -                    checkSetContents(qh, "qh_setreplace 2", ints3, j, j/2+1, -1, -1);
    -                }else if(j==2){
    -                    checkSetContents(qh, "qh_setreplace 3", ints3, j, 0, j/2+1, -1);
    -                }else{
    -                    checkSetContents(qh, "qh_setreplace 3", ints3, j, 0, j/2+1, j/2+1);
    -                }
    -                if(qh_setequal(ints, ints3)){
    -                    qh_fprintf(qh, stderr, 6325, "testSetequalInEtc: modified set equal to original set at %d/2\n", j);
    -                    error_count++;
    -                }
    -                if(!qh_setequal_except(ints, intarray+j/2, ints3, intarray+j/2+1)){
    -                    qh_fprintf(qh, stderr, 6326, "qh_setequal_except: modified set not equal to original set except modified\n", j);
    -                    error_count++;
    -                }
    -                if(qh_setequal_except(ints, intarray+j/2, ints3, intarray)){
    -                    qh_fprintf(qh, stderr, 6327, "qh_setequal_except: modified set equal to original set with wrong excepts\n", j);
    -                    error_count++;
    -                }
    -                if(!qh_setequal_skip(ints, j/2, ints3, j/2)){
    -                    qh_fprintf(qh, stderr, 6328, "qh_setequal_skip: modified set not equal to original set except modified\n", j);
    -                    error_count++;
    -                }
    -                if(j>2 && qh_setequal_skip(ints, j/2, ints3, 0)){
    -                    qh_fprintf(qh, stderr, 6329, "qh_setequal_skip: modified set equal to original set with wrong excepts\n", j);
    -                    error_count++;
    -                }
    -                if(intarray+j/2+1!=qh_setdel(ints3, intarray+j/2+1)){
    -                    qh_fprintf(qh, stderr, 6330, "qh_setdel: failed to find added element\n", j);
    -                    error_count++;
    -                }
    -                checkSetContents(qh, "qh_setdel", ints3, j-1, 0, j-1, (j==1 ? -1 : j/2+1));  /* swaps last element with deleted element */
    -                if(j>3){
    -                    qh_setdelnth(qh, ints3, j/2); /* Delete at the same location as the original replace, for only one out-of-order element */
    -                    checkSetContents(qh, "qh_setdelnth", ints3, j-2, 0, j-2, (j==2 ? -1 : j/2+1));
    -                }
    -                if(qh_setin(ints3, intarray+j/2)){
    -                    qh_fprintf(qh, stderr, 6331, "qh_setin: found deleted element\n");
    -                    error_count++;
    -                }
    -                if(j>4 && !qh_setin(ints3, intarray+1)){
    -                    qh_fprintf(qh, stderr, 6332, "qh_setin: did not find second element\n");
    -                    error_count++;
    -                }
    -                if(j>4 && !qh_setin(ints3, intarray+j-2)){
    -                    qh_fprintf(qh, stderr, 6333, "qh_setin: did not find last element\n");
    -                    error_count++;
    -                }
    -                if(-1!=qh_setindex(ints2, intarray)){
    -                    qh_fprintf(qh, stderr, 6334, "qh_setindex: found element in empty set\n");
    -                    error_count++;
    -                }
    -                if(-1!=qh_setindex(ints3, intarray+j/2)){
    -                    qh_fprintf(qh, stderr, 6335, "qh_setindex: found deleted element in set\n");
    -                    error_count++;
    -                }
    -                if(0!=qh_setindex(ints, intarray)){
    -                    qh_fprintf(qh, stderr, 6336, "qh_setindex: did not find first in set\n");
    -                    error_count++;
    -                }
    -                if(j-1!=qh_setindex(ints, intarray+j-1)){
    -                    qh_fprintf(qh, stderr, 6337, "qh_setindex: did not find last in set\n");
    -                    error_count++;
    -                }
    -            }
    -            qh_setfree(qh, &ints2);
    -        }
    -    }
    -    qh_setfree(qh, &ints3);
    -    qh_setfreelong(qh, &ints);
    -    if(ints){
    -        qh_setfree(qh, &ints); /* Was quick memory */
    -    }
    -}/*testSetequalInEtc*/
    -
    -
    -void testSetlastEtc(qhT *qh, int numInts, int *intarray, int checkEvery)
    -{
    -    setT *ints= NULL;
    -    setT *ints2= NULL;
    -    int i,j,prepend;
    -
    -    qh_fprintf(qh, stderr, 8020, "\n\nTesting qh_setlast, qh_setnew_delnthsorted, qh_setunique, and qh_setzero 0..%d. Test", numInts-1);
    -    for(j=0; j0){
    -                if(intarray+j-1!=qh_setlast(ints)){
    -                    qh_fprintf(qh, stderr, 6338, "qh_setlast: wrong last element\n");
    -                    error_count++;
    -                }
    -                prepend= (j<100 ? j/4 : 0);
    -                ints2= qh_setnew_delnthsorted(qh, ints, qh_setsize(qh, ints), j/2, prepend);
    -                if(qh_setsize(qh, ints2)!=j+prepend-1){
    -                    qh_fprintf(qh, stderr, 6345, "qh_setnew_delnthsorted: Expecting %d elements, got %d\n", j+prepend-1, qh_setsize(qh, ints2));
    -                    error_count++;
    -                }
    -                /* Define prepended elements.  Otherwise qh_setdelnthsorted may fail */
    -                for(i= 0; i2){
    -                    qh_setzero(qh, ints2, j/2, j-1);  /* max size may be j-1 */
    -                    if(qh_setsize(qh, ints2)!=j-1){
    -                        qh_fprintf(qh, stderr, 6342, "qh_setzero: Expecting %d elements, got %d\n", j, qh_setsize(qh, ints2));
    -                        error_count++;
    -                    }
    -                    qh_setcompact(qh, ints2);
    -                    checkSetContents(qh, "qh_setzero", ints2, j/2, 0, -1, -1);
    -                }
    -            }
    -            qh_setfree(qh, &ints2);
    -        }
    -    }
    -    qh_setfreelong(qh, &ints);
    -    if(ints){
    -        qh_setfree(qh, &ints); /* Was quick memory */
    -    }
    -}/*testSetlastEtc*/
    -
    -void testSettemp(qhT *qh, int numInts, int *intarray, int checkEvery)
    -{
    -    setT *ints= NULL;
    -    setT *ints2= NULL;
    -    setT *ints3= NULL;
    -    int i,j;
    -
    -    qh_fprintf(qh, stderr, 8021, "\n\nTesting qh_settemp* 0..%d. Test", numInts-1);
    -    for(j=0; j0){
    -                qh_settemppush(qh, ints);
    -                ints3= qh_settemppop(qh);
    -                if(ints!=ints3){
    -                    qh_fprintf(qh, stderr, 6343, "qh_settemppop: didn't pop the push\n");
    -                    error_count++;
    -                }
    -            }
    -            qh_settempfree(qh, &ints2);
    -        }
    -    }
    -    qh_setfreelong(qh, &ints);
    -    if(ints){
    -        qh_setfree(qh, &ints); /* Was quick memory */
    -    }
    -}/*testSettemp*/
    -
    -/* Check that a set contains count elements
    -   Ranges are consecutive (e.g., 1,2,3,...) starting with first, mid, and last
    -   Use -1 for missing ranges
    -   Returns -1 if should check results
    -*/
    -int log_i(qhT *qh, setT *set, const char *s, int i, int numInts, int checkEvery)
    -{
    -    int j= i;
    -    int scale= 1;
    -    int e= 0;
    -    int *i2, **i2p;
    -
    -    if(*s || checkEvery==1){
    -        if(i<10){
    -            qh_fprintf(qh, stderr, 8004, " %s%d", s, i);
    -        }else{
    -            if(i==11 && checkEvery==1){
    -                qh_fprintf(qh, stderr, 8005, "\nResults after 10: ");
    -                FOREACHint_(set){
    -                    qh_fprintf(qh, stderr, 8006, " %d", *i2);
    -                }
    -                qh_fprintf(qh, stderr, 8007, " Continue");
    -            }
    -            while((j= j/10)>=1){
    -                scale *= 10;
    -                e++;
    -            }
    -            if(i==numInts-1){
    -                qh_fprintf(qh, stderr, 8008, " %s%d", s, i);
    -            }else if(i==scale){
    -                if(i<=1000){
    -                    qh_fprintf(qh, stderr, 8010, " %s%d", s, i);
    -                }else{
    -                    qh_fprintf(qh, stderr, 8009, " %s1e%d", s, e);
    -                }
    -            }
    -        }
    -    }
    -    if(i<1000 || i%checkEvery==0 || i== scale || i==numInts-1){
    -        return 1;
    -    }
    -    return 0;
    -}/*log_i*/
    -
    -/* Check that a set contains count elements
    -   Ranges are consecutive (e.g., 1,2,3,...) starting with first, mid, and last
    -   Use -1 for missing ranges
    -*/
    -void checkSetContents(qhT *qh, const char *name, setT *set, int count, int rangeA, int rangeB, int rangeC)
    -{
    -
    -    i2T *i2, **i2p;
    -    int i2_i, i2_n;
    -    int prev= -1; /* avoid warning */
    -    int i;
    -    int first= -3;
    -    int second= -3;
    -    int rangeCount=1;
    -    int actualSize= 0;
    -
    -    qh_setcheck(qh, set, name, 0);
    -    if(set){
    -        SETreturnsize_(set, actualSize);  /* normally used only when speed is critical */
    -        if(*qh_setendpointer(set)!=NULL){
    -            qh_fprintf(qh, stderr, 6344, "%s: qh_setendpointer(set), 0x%x, is not NULL terminator of set 0x%x", name, qh_setendpointer(set), set);
    -            error_count++;
    -        }
    -    }
    -    if(actualSize!=qh_setsize(qh, set)){
    -        qh_fprintf(qh, stderr, 6305, "%s: SETreturnsize_(qh) returned %d while qh_setsize(qh) returns %d\n", name, actualSize, qh_setsize(qh, set));
    -        error_count++;
    -    }else if(actualSize!=count){
    -        qh_fprintf(qh, stderr, 6306, "%s: Expecting %d elements for set.  Got %d elements\n", name, count, actualSize);
    -        error_count++;
    -    }
    -    if(SETempty_(set)){
    -        if(count!=0){
    -            qh_fprintf(qh, stderr, 6307, "%s: Got empty set instead of count %d, rangeA %d, rangeB %d, rangeC %d\n", name, count, rangeA, rangeB, rangeC);
    -            error_count++;
    -        }
    -    }else{
    -        /* Must be first, otherwise trips msvc 8 */
    -        i2T **p= SETaddr_(set, i2T);
    -        if(*p!=SETfirstt_(set, i2T)){
    -            qh_fprintf(qh, stderr, 6309, "%s: SETaddr_(set, i2t) [%p] is not the same as SETfirst_(set) [%p]\n", name, SETaddr_(set, i2T), SETfirst_(set));
    -            error_count++;
    -        }
    -        first= *(int *)SETfirst_(set);
    -        if(SETfirst_(set)!=SETfirstt_(set, i2T)){
    -            qh_fprintf(qh, stderr, 6308, "%s: SETfirst_(set) [%p] is not the same as SETfirstt_(set, i2T [%p]\n", name, SETfirst_(set), SETfirstt_(set, i2T));
    -            error_count++;
    -        }
    -        if(qh_setsize(qh, set)>1){
    -            second= *(int *)SETsecond_(set);
    -            if(SETsecond_(set)!=SETsecondt_(set, i2T)){
    -                qh_fprintf(qh, stderr, 6310, "%s: SETsecond_(set) [%p] is not the same as SETsecondt_(set, i2T) [%p]\n", name, SETsecond_(set), SETsecondt_(set, i2T));
    -                error_count++;
    -            }
    -        }
    -    }
    -    /* Test first run of ints in set*/
    -    i= 0;
    -    FOREACHint_(set){
    -        if(i2!=SETfirst_(set) && *i2!=prev+1){
    -            break;
    -        }
    -        prev= *i2;
    -        if(SETindex_(set, i2)!=i){
    -            qh_fprintf(qh, stderr, 6311, "%s: Expecting SETindex_(set, pointer-to-%d) to be %d.  Got %d\n", name, *i2, i, SETindex_(set, i2));
    -            error_count++;;
    -        }
    -        if(i2!=SETref_(i2)){
    -            qh_fprintf(qh, stderr, 6312, "%s: SETref_(i2) [%p] does not point to i2 (the %d'th element)\n", name, SETref_(i2), i);
    -            error_count++;;
    -        }
    -        i++;
    -    }
    -    FOREACHint_i_(qh, set){
    -        /* Must be first conditional, otherwise it trips up msvc 8 */
    -        i2T **p= SETelemaddr_(set, i2_i, i2T);
    -        if(i2!=*p){
    -            qh_fprintf(qh, stderr, 6320, "%s: SETelemaddr_(set, %d, i2T) [%p] does not point to i2\n", name, i2_i, SETelemaddr_(set, i2_i, int));
    -            error_count++;;
    -        }
    -        if(i2_i==0){
    -            if(first!=*i2){
    -                qh_fprintf(qh, stderr, 6314, "%s: First element is %d instead of SETfirst %d\n", name, *i2, first);
    -                error_count++;;
    -            }
    -            if(rangeA!=*i2){
    -                qh_fprintf(qh, stderr, 6315, "%s: starts with %d instead of rangeA %d\n", name, *i2, rangeA);
    -                error_count++;;
    -            }
    -            prev= rangeA;
    -        }else{
    -            if(i2_i==1 && second!=*i2){
    -                qh_fprintf(qh, stderr, 6316, "%s: Second element is %d instead of SETsecond %d\n", name, *i2, second);
    -                error_count++;;
    -            }
    -            if(prev+1==*i2){
    -                prev++;
    -            }else{
    -                if(*i2==rangeB){
    -                    prev= rangeB;
    -                    rangeB= -1;
    -                    rangeCount++;
    -                }else if(rangeB==-1 && *i2==rangeC){
    -                    prev= rangeC;
    -                    rangeC= -1;
    -                    rangeCount++;
    -                }else{
    -                    prev++;
    -                    qh_fprintf(qh, stderr, 6317, "%s: Expecting %d'th element to be %d.  Got %d\n", name, i2_i, prev, *i2);
    -                    error_count++;
    -                }
    -            }
    -        }
    -        if(i2!=SETelem_(set, i2_i)){
    -            qh_fprintf(qh, stderr, 6318, "%s: SETelem_(set, %d) [%p] is not i2 [%p] (the %d'th element)\n", name, i2_i, SETelem_(set, i2_i), i2, i2_i);
    -            error_count++;;
    -        }
    -        if(SETelemt_(set, i2_i, i2T)!=SETelem_(set, i2_i)){   /* Normally SETelemt_ is used for generic sets */
    -            qh_fprintf(qh, stderr, 6319, "%s: SETelemt_(set, %d, i2T) [%p] is not SETelem_(set, %d) [%p] (the %d'th element)\n", name, i2_i, SETelemt_(set, i2_i, int), i2_i, SETelem_(set, i2_i), i2_i);
    -            error_count++;;
    -        }
    -    }
    -    if(error_count>=MAXerrorCount){
    -        qh_fprintf(qh, stderr, 8011, "testqset: Stop testing after %d errors\n", error_count);
    -        exit(1);
    -    }
    -}/*checkSetContents*/
    -
    diff --git a/src/qhull/src/testqset_r/testqset_r.pro b/src/qhull/src/testqset_r/testqset_r.pro
    deleted file mode 100644
    index 951e0624e8c..00000000000
    --- a/src/qhull/src/testqset_r/testqset_r.pro
    +++ /dev/null
    @@ -1,30 +0,0 @@
    -# -------------------------------------------------
    -# testqset_r.pro -- Qt project file for testqset_r.exe
    -# -------------------------------------------------
    -
    -include(../qhull-warn.pri)
    -
    -TARGET = testqset_r
    -
    -DESTDIR = ../../bin
    -TEMPLATE = app
    -CONFIG += console warn_on
    -CONFIG -= qt
    -CONFIG += qhull_warn_conversion
    -
    -build_pass:CONFIG(debug, debug|release){
    -   OBJECTS_DIR = Debug
    -}else:build_pass:CONFIG(release, debug|release){
    -   OBJECTS_DIR = Release
    -}
    -
    -INCLUDEPATH += ..
    -
    -SOURCES += testqset_r.c
    -SOURCES += ../libqhull_r/qset_r.c
    -SOURCES += ../libqhull_r/mem_r.c
    -SOURCES += ../libqhull_r/usermem_r.c
    -
    -HEADERS += ../libqhull_r/mem_r.h
    -HEADERS += ../libqhull_r/qset_r.h
    -
    diff --git a/src/qhull/src/user_eg/user_eg.c b/src/qhull/src/user_eg/user_eg.c
    deleted file mode 100644
    index 9c5fee51b34..00000000000
    --- a/src/qhull/src/user_eg/user_eg.c
    +++ /dev/null
    @@ -1,330 +0,0 @@
    -/*
      ---------------------------------
    -
    -  user_eg.c
    -  sample code for calling qhull() from an application
    -
    -  call with:
    -
    -     user_eg "cube/diamond options" "delaunay options" "halfspace options"
    -
    -  for example:
    -
    -     user_eg                             # return summaries
    -
    -     user_eg "n" "o" "Fp"                # return normals, OFF, points
    -
    -     user_eg "n Qt" "o" "Fp"             # triangulated cube
    -
    -     user_eg "QR0 p" "QR0 v p" "QR0 Fp"  # rotate input and return points
    -                                         # 'v' returns Voronoi
    -                                         # transform is rotated for halfspaces
    -
    -   main() makes three runs of qhull.
    -
    -     1) compute the convex hull of a cube
    -
    -     2a) compute the Delaunay triangulation of random points
    -
    -     2b) find the Delaunay triangle closest to a point.
    -
    -     3) compute the halfspace intersection of a diamond
    -
    - notes:
    -
    -   For another example, see main() in unix.c and user_eg2.c.
    -   These examples, call qh_qhull() directly.  They allow
    -   tighter control on the code loaded with Qhull.
    -
    -   For a C++ example, see user_eg3/user_eg3_r.cpp
    -
    -   Summaries are sent to stderr if other output formats are used
    -
    -   compiled by 'make bin/user_eg'
    -
    -   see libqhull.h for data structures, macros, and user-callable functions.
    -*/
    -
    -#define qh_QHimport
    -#include "libqhull/qhull_a.h"
    -
    -/*-------------------------------------------------
    --internal function prototypes
    -*/
    -void print_summary(void);
    -void makecube(coordT *points, int numpoints, int dim);
    -void makeDelaunay(coordT *points, int numpoints, int dim, int seed);
    -void findDelaunay(int dim);
    -void makehalf(coordT *points, int numpoints, int dim);
    -
    -/*-------------------------------------------------
    --print_summary()
    -*/
    -void print_summary(void) {
    -  facetT *facet;
    -  int k;
    -
    -  printf("\n%d vertices and %d facets with normals:\n",
    -                 qh num_vertices, qh num_facets);
    -  FORALLfacets {
    -    for (k=0; k < qh hull_dim; k++)
    -      printf("%6.2g ", facet->normal[k]);
    -    printf("\n");
    -  }
    -}
    -
    -/*--------------------------------------------------
    --makecube- set points to vertices of cube
    -  points is numpoints X dim
    -*/
    -void makecube(coordT *points, int numpoints, int dim) {
    -  int j,k;
    -  coordT *point;
    -
    -  for (j=0; jlocate a facet with qh_findbestfacet()
    -*/
    -void findDelaunay(int dim) {
    -  int k;
    -  coordT point[ 100];
    -  boolT isoutside;
    -  realT bestdist;
    -  facetT *facet;
    -  vertexT *vertex, **vertexp;
    -
    -  for (k= 0; k < dim; k++)
    -    point[k]= 0.5;
    -  qh_setdelaunay(dim+1, 1, point);
    -  facet= qh_findbestfacet(point, qh_ALL, &bestdist, &isoutside);
    -  if (facet->tricoplanar) {
    -    fprintf(stderr, "findDelaunay: not implemented for triangulated, non-simplicial Delaunay regions (tricoplanar facet, f%d).\n",
    -       facet->id);
    -    qh_errexit(qh_ERRqhull, facet, NULL);
    -  }
    -  FOREACHvertex_(facet->vertices) {
    -    for (k=0; k < dim; k++)
    -      printf("%5.2f ", vertex->point[k]);
    -    printf("\n");
    -  }
    -} /*.findDelaunay.*/
    -
    -/*--------------------------------------------------
    --makehalf- set points to halfspaces for a (dim)-dimensional diamond
    -  points is numpoints X dim+1
    -
    -  each halfspace consists of dim coefficients followed by an offset
    -*/
    -void makehalf(coordT *points, int numpoints, int dim) {
    -  int j,k;
    -  coordT *point;
    -
    -  for (j=0; j&1'\n\n");
    -
    -#if qh_QHpointer  /* see user.h */
    -  if (qh_qh){
    -      printf("QH6233: Qhull link error.  The global variable qh_qh was not initialized\n\
    -to NULL by global.c.  Please compile user_eg.c with -Dqh_QHpointer_dllimport\n\
    -as well as -Dqh_QHpointer, or use libqhullstatic, or use a different tool chain.\n\n");
    -      return -1;
    -  }
    -#endif
    -
    -  /*
    -    Run 1: convex hull
    -  */
    -  printf( "\ncompute convex hull of cube after rotating input\n");
    -  sprintf(flags, "qhull s Tcv %s", argc >= 2 ? argv[1] : "");
    -  numpoints= SIZEcube;
    -  makecube(points, numpoints, DIM);
    -  for (i=numpoints; i--; )
    -    rows[i]= points+dim*i;
    -  qh_printmatrix(outfile, "input", rows, numpoints, dim);
    -  exitcode= qh_new_qhull(dim, numpoints, points, ismalloc,
    -                      flags, outfile, errfile);
    -  if (!exitcode) {                  /* if no error */
    -    /* 'qh facet_list' contains the convex hull */
    -    print_summary();
    -    FORALLfacets {
    -       /* ... your code ... */
    -    }
    -  }
    -  qh_freeqhull(!qh_ALL);                   /* free long memory  */
    -  qh_memfreeshort(&curlong, &totlong);    /* free short memory and memory allocator */
    -  if (curlong || totlong)
    -    fprintf(errfile, "qhull internal warning (user_eg, #1): did not free %d bytes of long memory (%d pieces)\n", totlong, curlong);
    -
    -  /*
    -    Run 2: Delaunay triangulation
    -  */
    -
    -  printf( "\ncompute %d-d Delaunay triangulation\n", dim);
    -  sprintf(flags, "qhull s d Tcv %s", argc >= 3 ? argv[2] : "");
    -  numpoints= SIZEcube;
    -  makeDelaunay(points, numpoints, dim, (int)time(NULL));
    -  for (i=numpoints; i--; )
    -    rows[i]= points+dim*i;
    -  qh_printmatrix(outfile, "input", rows, numpoints, dim);
    -  exitcode= qh_new_qhull(dim, numpoints, points, ismalloc,
    -                      flags, outfile, errfile);
    -  if (!exitcode) {                  /* if no error */
    -    /* 'qh facet_list' contains the convex hull */
    -    /* If you want a Voronoi diagram ('v') and do not request output (i.e., outfile=NULL),
    -       call qh_setvoronoi_all() after qh_new_qhull(). */
    -    print_summary();
    -    FORALLfacets {
    -       /* ... your code ... */
    -    }
    -    printf( "\nfind %d-d Delaunay triangle closest to [0.5, 0.5, ...]\n", dim);
    -    exitcode= setjmp(qh errexit);
    -    if (!exitcode) {
    -      /* Trap Qhull errors in findDelaunay().  Without the setjmp(), Qhull
    -         will exit() after reporting an error */
    -      qh NOerrexit= False;
    -      findDelaunay(DIM);
    -    }
    -    qh NOerrexit= True;
    -  }
    -#if qh_QHpointer  /* see user.h */
    -  {
    -    qhT *oldqhA, *oldqhB;
    -    coordT pointsB[DIM*TOTpoints]; /* array of coordinates for each point */
    -
    -    printf( "\nsave first triangulation and compute a new triangulation\n");
    -    oldqhA= qh_save_qhull();
    -    sprintf(flags, "qhull s d Tcv %s", argc >= 3 ? argv[2] : "");
    -    numpoints= SIZEcube;
    -    makeDelaunay(pointsB, numpoints, dim, (int)time(NULL)+1);
    -    for (i=numpoints; i--; )
    -      rows[i]= pointsB+dim*i;
    -    qh_printmatrix(outfile, "input", rows, numpoints, dim);
    -    exitcode= qh_new_qhull(dim, numpoints, pointsB, ismalloc,
    -                      flags, outfile, errfile);
    -    if (!exitcode)
    -      print_summary();
    -    printf( "\nsave second triangulation and restore first one\n");
    -    oldqhB= qh_save_qhull();
    -    qh_restore_qhull(&oldqhA);
    -    print_summary();
    -    printf( "\nfree first triangulation and restore second one.\n");
    -    qh_freeqhull(qh_ALL);               /* free short and long memory used by first call */
    -                                         /* do not use qh_memfreeshort */
    -    qh_restore_qhull(&oldqhB);
    -    print_summary();
    -  }
    -#endif
    -  qh_freeqhull(!qh_ALL);                 /* free long memory */
    -  qh_memfreeshort(&curlong, &totlong);  /* free short memory and memory allocator */
    -  if (curlong || totlong)
    -    fprintf(errfile, "qhull internal warning (user_eg, #2): did not free %d bytes of long memory (%d pieces)\n", totlong, curlong);
    -
    -  /*
    -    Run 3: halfspace intersection about the origin
    -  */
    -  printf( "\ncompute halfspace intersection about the origin for a diamond\n");
    -  sprintf(flags, "qhull H0 s Tcv %s", argc >= 4 ? argv[3] : "Fp");
    -  numpoints= SIZEcube;
    -  makehalf(points, numpoints, dim);
    -  for (i=numpoints; i--; )
    -    rows[i]= points+(dim+1)*i;
    -  qh_printmatrix(outfile, "input as halfspace coefficients + offsets", rows, numpoints, dim+1);
    -  /* use qh_sethalfspace_all to transform the halfspaces yourself.
    -     If so, set 'qh feasible_point and do not use option 'Hn,...' [it would retransform the halfspaces]
    -  */
    -  exitcode= qh_new_qhull(dim+1, numpoints, points, ismalloc,
    -                      flags, outfile, errfile);
    -  if (!exitcode)
    -    print_summary();
    -  qh_freeqhull(!qh_ALL);
    -  qh_memfreeshort(&curlong, &totlong);
    -  if (curlong || totlong)  /* could also check previous runs */
    -    fprintf(stderr, "qhull internal warning (user_eg, #3): did not free %d bytes of long memory (%d pieces)\n",
    -       totlong, curlong);
    -  return exitcode;
    -} /* main */
    -
    diff --git a/src/qhull/src/user_eg/user_eg.pro b/src/qhull/src/user_eg/user_eg.pro
    deleted file mode 100644
    index 9dda0100997..00000000000
    --- a/src/qhull/src/user_eg/user_eg.pro
    +++ /dev/null
    @@ -1,11 +0,0 @@
    -# -------------------------------------------------
    -# user_eg.pro -- Qt project for Qhull demonstration using shared Qhull library
    -#
    -# It uses reentrant Qhull
    -# -------------------------------------------------
    -
    -include(../qhull-app-shared_r.pri)
    -
    -TARGET = user_eg
    -
    -SOURCES += user_eg_r.c
    diff --git a/src/qhull/src/user_eg/user_eg_r.c b/src/qhull/src/user_eg/user_eg_r.c
    deleted file mode 100644
    index 21b0ccf4e9f..00000000000
    --- a/src/qhull/src/user_eg/user_eg_r.c
    +++ /dev/null
    @@ -1,326 +0,0 @@
    -/*
      ---------------------------------
    -
    -  user_eg_r.c
    -  sample code for calling qhull() from an application.  Uses reentrant libqhull_r
    -
    -  call with:
    -
    -     user_eg "cube/diamond options" "delaunay options" "halfspace options"
    -
    -  for example:
    -
    -     user_eg                             # return summaries
    -
    -     user_eg "n" "o" "Fp"                # return normals, OFF, points
    -
    -     user_eg "n Qt" "o" "Fp"             # triangulated cube
    -
    -     user_eg "QR0 p" "QR0 v p" "QR0 Fp"  # rotate input and return points
    -                                         # 'v' returns Voronoi
    -                                         # transform is rotated for halfspaces
    -
    -   main() makes three runs of qhull.
    -
    -     1) compute the convex hull of a cube
    -
    -     2a) compute the Delaunay triangulation of random points
    -
    -     2b) find the Delaunay triangle closest to a point.
    -
    -     3) compute the halfspace intersection of a diamond
    -
    - notes:
    -
    -   For another example, see main() in unix_r.c and user_eg2_r.c.
    -   These examples, call qh_qhull() directly.  They allow
    -   tighter control on the code loaded with Qhull.
    -
    -   For a C++ example, see user_eg3/user_eg3_r.cpp
    -
    -   Summaries are sent to stderr if other output formats are used
    -
    -   compiled by 'make bin/user_eg'
    -
    -   see libqhull.h for data structures, macros, and user-callable functions.
    -*/
    -
    -#define qh_QHimport
    -#include "libqhull_r/qhull_ra.h"
    -
    -/*-------------------------------------------------
    --internal function prototypes
    -*/
    -void print_summary(qhT *qh);
    -void makecube(coordT *points, int numpoints, int dim);
    -void makeDelaunay(qhT *qh, coordT *points, int numpoints, int dim, int seed);
    -void findDelaunay(qhT *qh, int dim);
    -void makehalf(coordT *points, int numpoints, int dim);
    -
    -/*-------------------------------------------------
    --print_summary(qh)
    -*/
    -void print_summary(qhT *qh) {
    -  facetT *facet;
    -  int k;
    -
    -  printf("\n%d vertices and %d facets with normals:\n",
    -                 qh->num_vertices, qh->num_facets);
    -  FORALLfacets {
    -    for (k=0; k < qh->hull_dim; k++)
    -      printf("%6.2g ", facet->normal[k]);
    -    printf("\n");
    -  }
    -}
    -
    -/*--------------------------------------------------
    --makecube- set points to vertices of cube
    -  points is numpoints X dim
    -*/
    -void makecube(coordT *points, int numpoints, int dim) {
    -  int j,k;
    -  coordT *point;
    -
    -  for (j=0; jlocate a facet with qh_findbestfacet()
    -*/
    -void findDelaunay(qhT *qh, int dim) {
    -  int k;
    -  coordT point[ 100];
    -  boolT isoutside;
    -  realT bestdist;
    -  facetT *facet;
    -  vertexT *vertex, **vertexp;
    -
    -  for (k= 0; k < dim; k++)
    -    point[k]= 0.5;
    -  qh_setdelaunay(qh, dim+1, 1, point);
    -  facet= qh_findbestfacet(qh, point, qh_ALL, &bestdist, &isoutside);
    -  if (facet->tricoplanar) {
    -    fprintf(stderr, "findDelaunay: not implemented for triangulated, non-simplicial Delaunay regions (tricoplanar facet, f%d).\n",
    -       facet->id);
    -    qh_errexit(qh, qh_ERRqhull, facet, NULL);
    -  }
    -  FOREACHvertex_(facet->vertices) {
    -    for (k=0; k < dim; k++)
    -      printf("%5.2f ", vertex->point[k]);
    -    printf("\n");
    -  }
    -} /*.findDelaunay.*/
    -
    -/*--------------------------------------------------
    --makehalf- set points to halfspaces for a (dim)-dimensional diamond
    -  points is numpoints X dim+1
    -
    -  each halfspace consists of dim coefficients followed by an offset
    -*/
    -void makehalf(coordT *points, int numpoints, int dim) {
    -  int j,k;
    -  coordT *point;
    -
    -  for (j=0; j&1'\n\n");
    -
    -  /*
    -    Run 1: convex hull
    -  */
    -  printf( "\ncompute convex hull of cube after rotating input\n");
    -  sprintf(flags, "qhull s Tcv %s", argc >= 2 ? argv[1] : "");
    -  numpoints= SIZEcube;
    -  makecube(points, numpoints, DIM);
    -  for (i=numpoints; i--; )
    -    rows[i]= points+dim*i;
    -  qh_printmatrix(qh, outfile, "input", rows, numpoints, dim);
    -  exitcode= qh_new_qhull(qh, dim, numpoints, points, ismalloc,
    -                      flags, outfile, errfile);
    -  if (!exitcode) {                  /* if no error */
    -    /* 'qh->facet_list' contains the convex hull */
    -    print_summary(qh);
    -    FORALLfacets {
    -       /* ... your code ... */
    -    }
    -  }
    -  qh_freeqhull(qh, !qh_ALL);                   /* free long memory  */
    -  qh_memfreeshort(qh, &curlong, &totlong);    /* free short memory and memory allocator */
    -  if (curlong || totlong)
    -    fprintf(errfile, "qhull internal warning (user_eg, #1): did not free %d bytes of long memory (%d pieces)\n", totlong, curlong);
    -
    -  /*
    -    Run 2: Delaunay triangulation, reusing the previous qh/qh_qh
    -  */
    -
    -  printf( "\ncompute %d-d Delaunay triangulation\n", dim);
    -  sprintf(flags, "qhull s d Tcv %s", argc >= 3 ? argv[2] : "");
    -  numpoints= SIZEcube;
    -  makeDelaunay(qh, points, numpoints, dim, (int)time(NULL));
    -  for (i=numpoints; i--; )
    -    rows[i]= points+dim*i;
    -  qh_printmatrix(qh, outfile, "input", rows, numpoints, dim);
    -  exitcode= qh_new_qhull(qh, dim, numpoints, points, ismalloc,
    -                      flags, outfile, errfile);
    -  if (!exitcode) {                  /* if no error */
    -    /* 'qh->facet_list' contains the convex hull */
    -    /* If you want a Voronoi diagram ('v') and do not request output (i.e., outfile=NULL),
    -       call qh_setvoronoi_all() after qh_new_qhull(). */
    -    print_summary(qh);
    -    FORALLfacets {
    -       /* ... your code ... */
    -    }
    -    printf( "\nfind %d-d Delaunay triangle closest to [0.5, 0.5, ...]\n", dim);
    -    exitcode= setjmp(qh->errexit);
    -    if (!exitcode) {
    -      /* Trap Qhull errors in findDelaunay().  Without the setjmp(), Qhull
    -         will exit() after reporting an error */
    -      qh->NOerrexit= False;
    -      findDelaunay(qh, DIM);
    -    }
    -    qh->NOerrexit= True;
    -  }
    -  {
    -    coordT pointsB[DIM*TOTpoints]; /* array of coordinates for each point */
    -
    -    qhT qh_qhB;    /* Create a new instance of Qhull (qhB) */
    -    qhT *qhB= &qh_qhB;
    -    qh_zero(qhB, errfile);
    -
    -    printf( "\nCompute a new triangulation as a separate instance of Qhull\n");
    -    sprintf(flags, "qhull s d Tcv %s", argc >= 3 ? argv[2] : "");
    -    numpoints= SIZEcube;
    -    makeDelaunay(qhB, pointsB, numpoints, dim, (int)time(NULL)+1);
    -    for (i=numpoints; i--; )
    -      rows[i]= pointsB+dim*i;
    -    qh_printmatrix(qhB, outfile, "input", rows, numpoints, dim);
    -    exitcode= qh_new_qhull(qhB, dim, numpoints, pointsB, ismalloc,
    -                      flags, outfile, errfile);
    -    if (!exitcode)
    -      print_summary(qhB);
    -    printf( "\nFree memory allocated by the new instance of Qhull, and redisplay the old results.\n");
    -    qh_freeqhull(qhB, !qh_ALL);                 /* free long memory */
    -    qh_memfreeshort(qhB, &curlong, &totlong);  /* free short memory and memory allocator */
    -    if (curlong || totlong)
    -        fprintf(errfile, "qhull internal warning (user_eg, #4): did not free %d bytes of long memory (%d pieces)\n", totlong, curlong);
    -
    -    printf( "\n\n");
    -    print_summary(qh);  /* The other instance is unchanged */
    -    /* Exiting the block frees qh_qhB */
    -  }
    -  qh_freeqhull(qh, !qh_ALL);                 /* free long memory */
    -  qh_memfreeshort(qh, &curlong, &totlong);  /* free short memory and memory allocator */
    -  if (curlong || totlong)
    -    fprintf(errfile, "qhull internal warning (user_eg, #2): did not free %d bytes of long memory (%d pieces)\n", totlong, curlong);
    -
    -  /*
    -    Run 3: halfspace intersection about the origin
    -  */
    -  printf( "\ncompute halfspace intersection about the origin for a diamond\n");
    -  sprintf(flags, "qhull H0 s Tcv %s", argc >= 4 ? argv[3] : "Fp");
    -  numpoints= SIZEcube;
    -  makehalf(points, numpoints, dim);
    -  for (i=numpoints; i--; )
    -    rows[i]= points+(dim+1)*i;
    -  qh_printmatrix(qh, outfile, "input as halfspace coefficients + offsets", rows, numpoints, dim+1);
    -  /* use qh_sethalfspace_all to transform the halfspaces yourself.
    -     If so, set 'qh->feasible_point and do not use option 'Hn,...' [it would retransform the halfspaces]
    -  */
    -  exitcode= qh_new_qhull(qh, dim+1, numpoints, points, ismalloc,
    -                      flags, outfile, errfile);
    -  if (!exitcode)
    -    print_summary(qh);
    -  qh_freeqhull(qh, !qh_ALL);
    -  qh_memfreeshort(qh, &curlong, &totlong);
    -  if (curlong || totlong)  /* could also check previous runs */
    -    fprintf(stderr, "qhull internal warning (user_eg, #3): did not free %d bytes of long memory (%d pieces)\n",
    -       totlong, curlong);
    -  return exitcode;
    -} /* main */
    -
    diff --git a/src/qhull/src/user_eg2/user_eg2.c b/src/qhull/src/user_eg2/user_eg2.c
    deleted file mode 100644
    index a455f025d14..00000000000
    --- a/src/qhull/src/user_eg2/user_eg2.c
    +++ /dev/null
    @@ -1,746 +0,0 @@
    -/*
      ---------------------------------
    -
    -  user_eg2.c
    -
    -  sample code for calling qhull() from an application.
    -
    -  See user_eg.c for a simpler method using qh_new_qhull().
    -  The method used here and in unix.c gives you additional
    -  control over Qhull.
    -
    -  See user_eg3/user_eg3_r.cpp for a C++ example
    -
    -  call with:
    -
    -     user_eg2 "triangulated cube/diamond options" "delaunay options" "halfspace options"
    -
    -  for example:
    -
    -     user_eg2                             # return summaries
    -
    -     user_eg2 "n" "o" "Fp"                # return normals, OFF, points
    -
    -     user_eg2 "QR0 p" "QR0 v p" "QR0 Fp"  # rotate input and return points
    -                                         # 'v' returns Voronoi
    -                                         # transform is rotated for halfspaces
    -
    -   main() makes three runs of qhull.
    -
    -     1) compute the convex hull of a cube, and incrementally add a diamond
    -
    -     2a) compute the Delaunay triangulation of random points, and add points.
    -
    -     2b) find the Delaunay triangle closest to a point.
    -
    -     3) compute the halfspace intersection of a diamond, and add a cube
    -
    - notes:
    -
    -   summaries are sent to stderr if other output formats are used
    -
    -   derived from unix.c and compiled by 'make bin/user_eg2'
    -
    -   see libqhull.h for data structures, macros, and user-callable functions.
    -
    -   If you want to control all output to stdio and input to stdin,
    -   set the #if below to "1" and delete all lines that contain "io.c".
    -   This prevents the loading of io.o.  Qhull will
    -   still write to 'qh ferr' (stderr) for error reporting and tracing.
    -
    -   Defining #if 1, also prevents user.o from being loaded.
    -*/
    -
    -#include "libqhull/qhull_a.h"
    -
    -/*-------------------------------------------------
    --internal function prototypes
    -*/
    -void print_summary(void);
    -void makecube(coordT *points, int numpoints, int dim);
    -void adddiamond(coordT *points, int numpoints, int numnew, int dim);
    -void makeDelaunay(coordT *points, int numpoints, int dim);
    -void addDelaunay(coordT *points, int numpoints, int numnew, int dim);
    -void findDelaunay(int dim);
    -void makehalf(coordT *points, int numpoints, int dim);
    -void addhalf(coordT *points, int numpoints, int numnew, int dim, coordT *feasible);
    -
    -/*-------------------------------------------------
    --print_summary()
    -*/
    -void print_summary(void) {
    -  facetT *facet;
    -  int k;
    -
    -  printf("\n%d vertices and %d facets with normals:\n",
    -                 qh num_vertices, qh num_facets);
    -  FORALLfacets {
    -    for (k=0; k < qh hull_dim; k++)
    -      printf("%6.2g ", facet->normal[k]);
    -    printf("\n");
    -  }
    -}
    -
    -/*--------------------------------------------------
    --makecube- set points to vertices of cube
    -  points is numpoints X dim
    -*/
    -void makecube(coordT *points, int numpoints, int dim) {
    -  int j,k;
    -  coordT *point;
    -
    -  for (j=0; jlocate a facet with qh_findbestfacet()
    -*/
    -void findDelaunay(int dim) {
    -  int k;
    -  coordT point[ 100];
    -  boolT isoutside;
    -  realT bestdist;
    -  facetT *facet;
    -  vertexT *vertex, **vertexp;
    -
    -  for (k= 0; k < dim-1; k++)
    -    point[k]= 0.5;
    -  qh_setdelaunay(dim, 1, point);
    -  facet= qh_findbestfacet(point, qh_ALL, &bestdist, &isoutside);
    -  if (facet->tricoplanar) {
    -    fprintf(stderr, "findDelaunay: not implemented for triangulated, non-simplicial Delaunay regions (tricoplanar facet, f%d).\n",
    -       facet->id);
    -    qh_errexit(qh_ERRqhull, facet, NULL);
    -  }
    -  FOREACHvertex_(facet->vertices) {
    -    for (k=0; k < dim-1; k++)
    -      printf("%5.2f ", vertex->point[k]);
    -    printf("\n");
    -  }
    -} /*.findDelaunay.*/
    -
    -/*--------------------------------------------------
    --makehalf- set points to halfspaces for a (dim)-d diamond
    -  points is numpoints X dim+1
    -
    -  each halfspace consists of dim coefficients followed by an offset
    -*/
    -void makehalf(coordT *points, int numpoints, int dim) {
    -  int j,k;
    -  coordT *point;
    -
    -  for (j=0; j= 2 ? argv[1] : "");
    -    qh_initflags(options);
    -    printf( "\ncompute triangulated convex hull of cube after rotating input\n");
    -    makecube(array[0], SIZEcube, DIM);
    -    qh_init_B(array[0], SIZEcube, DIM, ismalloc);
    -    qh_qhull();
    -    qh_check_output();
    -    qh_triangulate();  /* requires option 'Q11' if want to add points */
    -    print_summary();
    -    if (qh VERIFYoutput && !qh STOPpoint && !qh STOPcone)
    -      qh_check_points();
    -    printf( "\nadd points in a diamond\n");
    -    adddiamond(array[0], SIZEcube, SIZEdiamond, DIM);
    -    qh_check_output();
    -    print_summary();
    -    qh_produce_output();  /* delete this line to help avoid io.c */
    -    if (qh VERIFYoutput && !qh STOPpoint && !qh STOPcone)
    -      qh_check_points();
    -  }
    -  qh NOerrexit= True;
    -  qh_freeqhull(!qh_ALL);
    -  qh_memfreeshort(&curlong, &totlong);
    -  if (curlong || totlong)
    -    fprintf(stderr, "qhull warning (user_eg, run 1): did not free %d bytes of long memory (%d pieces)\n",
    -       totlong, curlong);
    -
    -  /*
    -    Run 2: Delaunay triangulation
    -  */
    -  qh_init_A(stdin, stdout, stderr, 0, NULL);
    -  exitcode= setjmp(qh errexit);
    -  if (!exitcode) {
    -    coordT array[TOTpoints][DIM];
    -
    -    strcat(qh rbox_command, "user_eg Delaunay");
    -    sprintf(options, "qhull s d Tcv %s", argc >= 3 ? argv[2] : "");
    -    qh_initflags(options);
    -    printf( "\ncompute %d-d Delaunay triangulation\n", DIM-1);
    -    makeDelaunay(array[0], SIZEcube, DIM);
    -    /* Instead of makeDelaunay with qh_setdelaunay, you may
    -       produce a 2-d array of points, set DIM to 2, and set
    -       qh PROJECTdelaunay to True.  qh_init_B will call
    -       qh_projectinput to project the points to the paraboloid
    -       and add a point "at-infinity".
    -    */
    -    qh_init_B(array[0], SIZEcube, DIM, ismalloc);
    -    qh_qhull();
    -    /* If you want Voronoi ('v') without qh_produce_output(), call
    -       qh_setvoronoi_all() after qh_qhull() */
    -    qh_check_output();
    -    print_summary();
    -    qh_produce_output();  /* delete this line to help avoid io.c */
    -    if (qh VERIFYoutput && !qh STOPpoint && !qh STOPcone)
    -      qh_check_points();
    -    printf( "\nadd points to triangulation\n");
    -    addDelaunay(array[0], SIZEcube, SIZEdiamond, DIM);
    -    qh_check_output();
    -    qh_produce_output();  /* delete this line to help avoid io.c */
    -    if (qh VERIFYoutput && !qh STOPpoint && !qh STOPcone)
    -      qh_check_points();
    -    printf( "\nfind Delaunay triangle closest to [0.5, 0.5, ...]\n");
    -    findDelaunay(DIM);
    -  }
    -  qh NOerrexit= True;
    -  qh_freeqhull(!qh_ALL);
    -  qh_memfreeshort(&curlong, &totlong);
    -  if (curlong || totlong)
    -    fprintf(stderr, "qhull warning (user_eg, run 2): did not free %d bytes of long memory (%d pieces)\n",
    -       totlong, curlong);
    -
    -  /*
    -    Run 3: halfspace intersection
    -  */
    -  qh_init_A(stdin, stdout, stderr, 0, NULL);
    -  exitcode= setjmp(qh errexit);
    -  if (!exitcode) {
    -    coordT array[TOTpoints][DIM+1];  /* +1 for halfspace offset */
    -    pointT *points;
    -
    -    strcat(qh rbox_command, "user_eg halfspaces");
    -    sprintf(options, "qhull H0 s Tcv %s", argc >= 4 ? argv[3] : "");
    -    qh_initflags(options);
    -    printf( "\ncompute halfspace intersection about the origin for a diamond\n");
    -    makehalf(array[0], SIZEcube, DIM);
    -    qh_setfeasible(DIM); /* from io.c, sets qh feasible_point from 'Hn,n' */
    -    /* you may malloc and set qh feasible_point directly.  It is only used for
    -       option 'Fp' */
    -    points= qh_sethalfspace_all( DIM+1, SIZEcube, array[0], qh feasible_point);
    -    qh_init_B(points, SIZEcube, DIM, True); /* qh_freeqhull frees points */
    -    qh_qhull();
    -    qh_check_output();
    -    qh_produce_output();  /* delete this line to help avoid io.c */
    -    if (qh VERIFYoutput && !qh STOPpoint && !qh STOPcone)
    -      qh_check_points();
    -    printf( "\nadd halfspaces for cube to intersection\n");
    -    addhalf(array[0], SIZEcube, SIZEdiamond, DIM, qh feasible_point);
    -    qh_check_output();
    -    qh_produce_output();  /* delete this line to help avoid io.c */
    -    if (qh VERIFYoutput && !qh STOPpoint && !qh STOPcone)
    -      qh_check_points();
    -  }
    -  qh NOerrexit= True;
    -  qh NOerrexit= True;
    -  qh_freeqhull(!qh_ALL);
    -  qh_memfreeshort(&curlong, &totlong);
    -  if (curlong || totlong)
    -    fprintf(stderr, "qhull warning (user_eg, run 3): did not free %d bytes of long memory (%d pieces)\n",
    -       totlong, curlong);
    -  return exitcode;
    -} /* main */
    -
    -#if 1    /* use 1 to prevent loading of io.o and user.o */
    -/*-------------------------------------------
    --errexit- return exitcode to system after an error
    -  assumes exitcode non-zero
    -  prints useful information
    -  see qh_errexit2() in libqhull.c for 2 facets
    -*/
    -void qh_errexit(int exitcode, facetT *facet, ridgeT *ridge) {
    -  QHULL_UNUSED(facet);
    -  QHULL_UNUSED(ridge);
    -
    -  if (qh ERREXITcalled) {
    -    fprintf(qh ferr, "qhull error while processing previous error.  Exit program\n");
    -    exit(1);
    -  }
    -  qh ERREXITcalled= True;
    -  if (!qh QHULLfinished)
    -    qh hulltime= (unsigned)clock() - qh hulltime;
    -  fprintf(qh ferr, "\nWhile executing: %s | %s\n", qh rbox_command, qh qhull_command);
    -  fprintf(qh ferr, "Options selected:\n%s\n", qh qhull_options);
    -  if (qh furthest_id >= 0) {
    -    fprintf(qh ferr, "\nLast point added to hull was p%d", qh furthest_id);
    -    if (zzval_(Ztotmerge))
    -      fprintf(qh ferr, "  Last merge was #%d.", zzval_(Ztotmerge));
    -    if (qh QHULLfinished)
    -      fprintf(qh ferr, "\nQhull has finished constructing the hull.");
    -    else if (qh POSTmerging)
    -      fprintf(qh ferr, "\nQhull has started post-merging");
    -    fprintf(qh ferr, "\n\n");
    -  }
    -  if (qh NOerrexit) {
    -    fprintf(qh ferr, "qhull error while ending program.  Exit program\n");
    -    exit(1);
    -  }
    -  if (!exitcode)
    -    exitcode= qh_ERRqhull;
    -  qh NOerrexit= True;
    -  longjmp(qh errexit, exitcode);
    -} /* errexit */
    -
    -
    -/*-------------------------------------------
    --errprint- prints out the information of the erroneous object
    -    any parameter may be NULL, also prints neighbors and geomview output
    -*/
    -void qh_errprint(const char *string, facetT *atfacet, facetT *otherfacet, ridgeT *atridge, vertexT *atvertex) {
    -
    -  fprintf(qh ferr, "%s facets f%d f%d ridge r%d vertex v%d\n",
    -           string, getid_(atfacet), getid_(otherfacet), getid_(atridge),
    -           getid_(atvertex));
    -} /* errprint */
    -
    -
    -void qh_printfacetlist(facetT *facetlist, setT *facets, boolT printall) {
    -  facetT *facet, **facetp;
    -
    -  /* remove these calls to help avoid io.c */
    -  qh_printbegin(qh ferr, qh_PRINTfacets, facetlist, facets, printall);/*io.c*/
    -  FORALLfacet_(facetlist)                                              /*io.c*/
    -    qh_printafacet(qh ferr, qh_PRINTfacets, facet, printall);          /*io.c*/
    -  FOREACHfacet_(facets)                                                /*io.c*/
    -    qh_printafacet(qh ferr, qh_PRINTfacets, facet, printall);          /*io.c*/
    -  qh_printend(qh ferr, qh_PRINTfacets, facetlist, facets, printall);  /*io.c*/
    -
    -  FORALLfacet_(facetlist)
    -    fprintf( qh ferr, "facet f%d\n", facet->id);
    -} /* printfacetlist */
    -
    -/* qh_printhelp_degenerate( fp )
    -    prints descriptive message for precision error
    -
    -  notes:
    -    no message if qh_QUICKhelp
    -*/
    -void qh_printhelp_degenerate(FILE *fp) {
    -
    -  if (qh MERGEexact || qh PREmerge || qh JOGGLEmax < REALmax/2)
    -    qh_fprintf(fp, 9368, "\n\
    -A Qhull error has occurred.  Qhull should have corrected the above\n\
    -precision error.  Please send the input and all of the output to\n\
    -qhull_bug@qhull.org\n");
    -  else if (!qh_QUICKhelp) {
    -    qh_fprintf(fp, 9369, "\n\
    -Precision problems were detected during construction of the convex hull.\n\
    -This occurs because convex hull algorithms assume that calculations are\n\
    -exact, but floating-point arithmetic has roundoff errors.\n\
    -\n\
    -To correct for precision problems, do not use 'Q0'.  By default, Qhull\n\
    -selects 'C-0' or 'Qx' and merges non-convex facets.  With option 'QJ',\n\
    -Qhull joggles the input to prevent precision problems.  See \"Imprecision\n\
    -in Qhull\" (qh-impre.htm).\n\
    -\n\
    -If you use 'Q0', the output may include\n\
    -coplanar ridges, concave ridges, and flipped facets.  In 4-d and higher,\n\
    -Qhull may produce a ridge with four neighbors or two facets with the same \n\
    -vertices.  Qhull reports these events when they occur.  It stops when a\n\
    -concave ridge, flipped facet, or duplicate facet occurs.\n");
    -#if REALfloat
    -    qh_fprintf(fp, 9370, "\
    -\n\
    -Qhull is currently using single precision arithmetic.  The following\n\
    -will probably remove the precision problems:\n\
    -  - recompile qhull for realT precision(#define REALfloat 0 in user.h).\n");
    -#endif
    -    if (qh DELAUNAY && !qh SCALElast && qh MAXabs_coord > 1e4)
    -      qh_fprintf(fp, 9371, "\
    -\n\
    -When computing the Delaunay triangulation of coordinates > 1.0,\n\
    -  - use 'Qbb' to scale the last coordinate to [0,m] (max previous coordinate)\n");
    -    if (qh DELAUNAY && !qh ATinfinity)
    -      qh_fprintf(fp, 9372, "\
    -When computing the Delaunay triangulation:\n\
    -  - use 'Qz' to add a point at-infinity.  This reduces precision problems.\n");
    -
    -    qh_fprintf(fp, 9373, "\
    -\n\
    -If you need triangular output:\n\
    -  - use option 'Qt' to triangulate the output\n\
    -  - use option 'QJ' to joggle the input points and remove precision errors\n\
    -  - use option 'Ft'.  It triangulates non-simplicial facets with added points.\n\
    -\n\
    -If you must use 'Q0',\n\
    -try one or more of the following options.  They can not guarantee an output.\n\
    -  - use 'QbB' to scale the input to a cube.\n\
    -  - use 'Po' to produce output and prevent partitioning for flipped facets\n\
    -  - use 'V0' to set min. distance to visible facet as 0 instead of roundoff\n\
    -  - use 'En' to specify a maximum roundoff error less than %2.2g.\n\
    -  - options 'Qf', 'Qbb', and 'QR0' may also help\n",
    -               qh DISTround);
    -    qh_fprintf(fp, 9374, "\
    -\n\
    -To guarantee simplicial output:\n\
    -  - use option 'Qt' to triangulate the output\n\
    -  - use option 'QJ' to joggle the input points and remove precision errors\n\
    -  - use option 'Ft' to triangulate the output by adding points\n\
    -  - use exact arithmetic (see \"Imprecision in Qhull\", qh-impre.htm)\n\
    -");
    -  }
    -} /* printhelp_degenerate */
    -
    -
    -/* qh_printhelp_narrowhull( minangle )
    -     Warn about a narrow hull
    -
    -  notes:
    -    Alternatively, reduce qh_WARNnarrow in user.h
    -
    -*/
    -void qh_printhelp_narrowhull(FILE *fp, realT minangle) {
    -
    -    qh_fprintf(fp, 9375, "qhull precision warning: \n\
    -The initial hull is narrow (cosine of min. angle is %.16f).\n\
    -A coplanar point may lead to a wide facet.  Options 'QbB' (scale to unit box)\n\
    -or 'Qbb' (scale last coordinate) may remove this warning.  Use 'Pp' to skip\n\
    -this warning.  See 'Limitations' in qh-impre.htm.\n",
    -          -minangle);   /* convert from angle between normals to angle between facets */
    -} /* printhelp_narrowhull */
    -
    -/* qh_printhelp_singular
    -      prints descriptive message for singular input
    -*/
    -void qh_printhelp_singular(FILE *fp) {
    -  facetT *facet;
    -  vertexT *vertex, **vertexp;
    -  realT min, max, *coord, dist;
    -  int i,k;
    -
    -  qh_fprintf(fp, 9376, "\n\
    -The input to qhull appears to be less than %d dimensional, or a\n\
    -computation has overflowed.\n\n\
    -Qhull could not construct a clearly convex simplex from points:\n",
    -           qh hull_dim);
    -  qh_printvertexlist(fp, "", qh facet_list, NULL, qh_ALL);
    -  if (!qh_QUICKhelp)
    -    qh_fprintf(fp, 9377, "\n\
    -The center point is coplanar with a facet, or a vertex is coplanar\n\
    -with a neighboring facet.  The maximum round off error for\n\
    -computing distances is %2.2g.  The center point, facets and distances\n\
    -to the center point are as follows:\n\n", qh DISTround);
    -  qh_printpointid(fp, "center point", qh hull_dim, qh interior_point, -1);
    -  qh_fprintf(fp, 9378, "\n");
    -  FORALLfacets {
    -    qh_fprintf(fp, 9379, "facet");
    -    FOREACHvertex_(facet->vertices)
    -      qh_fprintf(fp, 9380, " p%d", qh_pointid(vertex->point));
    -    zinc_(Zdistio);
    -    qh_distplane(qh interior_point, facet, &dist);
    -    qh_fprintf(fp, 9381, " distance= %4.2g\n", dist);
    -  }
    -  if (!qh_QUICKhelp) {
    -    if (qh HALFspace)
    -      qh_fprintf(fp, 9382, "\n\
    -These points are the dual of the given halfspaces.  They indicate that\n\
    -the intersection is degenerate.\n");
    -    qh_fprintf(fp, 9383,"\n\
    -These points either have a maximum or minimum x-coordinate, or\n\
    -they maximize the determinant for k coordinates.  Trial points\n\
    -are first selected from points that maximize a coordinate.\n");
    -    if (qh hull_dim >= qh_INITIALmax)
    -      qh_fprintf(fp, 9384, "\n\
    -Because of the high dimension, the min x-coordinate and max-coordinate\n\
    -points are used if the determinant is non-zero.  Option 'Qs' will\n\
    -do a better, though much slower, job.  Instead of 'Qs', you can change\n\
    -the points by randomly rotating the input with 'QR0'.\n");
    -  }
    -  qh_fprintf(fp, 9385, "\nThe min and max coordinates for each dimension are:\n");
    -  for (k=0; k < qh hull_dim; k++) {
    -    min= REALmax;
    -    max= -REALmin;
    -    for (i=qh num_points, coord= qh first_point+k; i--; coord += qh hull_dim) {
    -      maximize_(max, *coord);
    -      minimize_(min, *coord);
    -    }
    -    qh_fprintf(fp, 9386, "  %d:  %8.4g  %8.4g  difference= %4.4g\n", k, min, max, max-min);
    -  }
    -  if (!qh_QUICKhelp) {
    -    qh_fprintf(fp, 9387, "\n\
    -If the input should be full dimensional, you have several options that\n\
    -may determine an initial simplex:\n\
    -  - use 'QJ'  to joggle the input and make it full dimensional\n\
    -  - use 'QbB' to scale the points to the unit cube\n\
    -  - use 'QR0' to randomly rotate the input for different maximum points\n\
    -  - use 'Qs'  to search all points for the initial simplex\n\
    -  - use 'En'  to specify a maximum roundoff error less than %2.2g.\n\
    -  - trace execution with 'T3' to see the determinant for each point.\n",
    -                     qh DISTround);
    -#if REALfloat
    -    qh_fprintf(fp, 9388, "\
    -  - recompile qhull for realT precision(#define REALfloat 0 in libqhull.h).\n");
    -#endif
    -    qh_fprintf(fp, 9389, "\n\
    -If the input is lower dimensional:\n\
    -  - use 'QJ' to joggle the input and make it full dimensional\n\
    -  - use 'Qbk:0Bk:0' to delete coordinate k from the input.  You should\n\
    -    pick the coordinate with the least range.  The hull will have the\n\
    -    correct topology.\n\
    -  - determine the flat containing the points, rotate the points\n\
    -    into a coordinate plane, and delete the other coordinates.\n\
    -  - add one or more points to make the input full dimensional.\n\
    -");
    -    if (qh DELAUNAY && !qh ATinfinity)
    -      qh_fprintf(fp, 9390, "\n\n\
    -This is a Delaunay triangulation and the input is co-circular or co-spherical:\n\
    -  - use 'Qz' to add a point \"at infinity\" (i.e., above the paraboloid)\n\
    -  - or use 'QJ' to joggle the input and avoid co-circular data\n");
    -  }
    -} /* printhelp_singular */
    -
    -
    -/*-----------------------------------------
    --user_memsizes- allocate up to 10 additional, quick allocation sizes
    -*/
    -void qh_user_memsizes(void) {
    -
    -  /* qh_memsize(size); */
    -} /* user_memsizes */
    -
    -#endif
    diff --git a/src/qhull/src/user_eg2/user_eg2.pro b/src/qhull/src/user_eg2/user_eg2.pro
    deleted file mode 100644
    index c841bfe1347..00000000000
    --- a/src/qhull/src/user_eg2/user_eg2.pro
    +++ /dev/null
    @@ -1,11 +0,0 @@
    -# -------------------------------------------------
    -# user_eg2.pro -- Qt project for Qhull demonstration using the static Qhull library
    -#
    -# It uses reentrant Qhull
    -# -------------------------------------------------
    -
    -include(../qhull-app-c_r.pri)
    -
    -TARGET = user_eg2
    -
    -SOURCES += user_eg2_r.c
    diff --git a/src/qhull/src/user_eg2/user_eg2_r.c b/src/qhull/src/user_eg2/user_eg2_r.c
    deleted file mode 100644
    index 2f8b4e6c760..00000000000
    --- a/src/qhull/src/user_eg2/user_eg2_r.c
    +++ /dev/null
    @@ -1,742 +0,0 @@
    -/*
      ---------------------------------
    -
    -  user_eg2_r.c
    -
    -  sample code for calling qhull() from an application.
    -
    -  See user_eg_r.c for a simpler method using qh_new_qhull().
    -  The method used here and in unix_r.c gives you additional
    -  control over Qhull.
    -
    -  See user_eg3/user_eg3_r.cpp for a C++ example
    -
    -  call with:
    -
    -     user_eg2 "triangulated cube/diamond options" "delaunay options" "halfspace options"
    -
    -  for example:
    -
    -     user_eg2                             # return summaries
    -
    -     user_eg2 "n" "o" "Fp"                # return normals, OFF, points
    -
    -     user_eg2 "QR0 p" "QR0 v p" "QR0 Fp"  # rotate input and return points
    -                                         # 'v' returns Voronoi
    -                                         # transform is rotated for halfspaces
    -
    -   main() makes three runs of qhull.
    -
    -     1) compute the convex hull of a cube, and incrementally add a diamond
    -
    -     2a) compute the Delaunay triangulation of random points, and add points.
    -
    -     2b) find the Delaunay triangle closest to a point.
    -
    -     3) compute the halfspace intersection of a diamond, and add a cube
    -
    - notes:
    -
    -   summaries are sent to stderr if other output formats are used
    -
    -   derived from unix.c and compiled by 'make bin/user_eg2'
    -
    -   see libqhull.h for data structures, macros, and user-callable functions.
    -
    -   If you want to control all output to stdio and input to stdin,
    -   set the #if below to "1" and delete all lines that contain "io.c".
    -   This prevents the loading of io.o.  Qhull will
    -   still write to 'qh->ferr' (stderr) for error reporting and tracing.
    -
    -   Defining #if 1, also prevents user.o from being loaded.
    -*/
    -
    -#include "libqhull_r/qhull_ra.h"
    -
    -/*-------------------------------------------------
    --internal function prototypes
    -*/
    -void print_summary(qhT *qh);
    -void makecube(coordT *points, int numpoints, int dim);
    -void adddiamond(qhT *qh, coordT *points, int numpoints, int numnew, int dim);
    -void makeDelaunay(qhT *qh, coordT *points, int numpoints, int dim);
    -void addDelaunay(qhT *qh, coordT *points, int numpoints, int numnew, int dim);
    -void findDelaunay(qhT *qh, int dim);
    -void makehalf(coordT *points, int numpoints, int dim);
    -void addhalf(qhT *qh, coordT *points, int numpoints, int numnew, int dim, coordT *feasible);
    -
    -/*-------------------------------------------------
    --print_summary(qh)
    -*/
    -void print_summary(qhT *qh) {
    -  facetT *facet;
    -  int k;
    -
    -  printf("\n%d vertices and %d facets with normals:\n",
    -                 qh->num_vertices, qh->num_facets);
    -  FORALLfacets {
    -    for (k=0; k < qh->hull_dim; k++)
    -      printf("%6.2g ", facet->normal[k]);
    -    printf("\n");
    -  }
    -}
    -
    -/*--------------------------------------------------
    --makecube- set points to vertices of cube
    -  points is numpoints X dim
    -*/
    -void makecube(coordT *points, int numpoints, int dim) {
    -  int j,k;
    -  coordT *point;
    -
    -  for (j=0; jfirst_point)  /* in case of 'QRn' */
    -      qh->num_points= numpoints+j+1;
    -    /* qh.num_points sets the size of the points array.  You may
    -       allocate the points elsewhere.  If so, qh_addpoint records
    -       the point's address in qh->other_points
    -    */
    -    for (k=dim; k--; ) {
    -      if (j/2 == k)
    -        point[k]= (j & 1) ? 2.0 : -2.0;
    -      else
    -        point[k]= 0.0;
    -    }
    -    facet= qh_findbestfacet(qh, point, !qh_ALL, &bestdist, &isoutside);
    -    if (isoutside) {
    -      if (!qh_addpoint(qh, point, facet, False))
    -        break;  /* user requested an early exit with 'TVn' or 'TCn' */
    -    }
    -    printf("%d vertices and %d facets\n",
    -                 qh->num_vertices, qh->num_facets);
    -    /* qh_produce_output(); */
    -  }
    -  if (qh->DOcheckmax)
    -    qh_check_maxout(qh);
    -  else if (qh->KEEPnearinside)
    -    qh_nearcoplanar(qh);
    -} /*.adddiamond.*/
    -
    -/*--------------------------------------------------
    --makeDelaunay- set points for dim-1 Delaunay triangulation of random points
    -  points is numpoints X dim.  Each point is projected to a paraboloid.
    -*/
    -void makeDelaunay(qhT *qh, coordT *points, int numpoints, int dim) {
    -  int j,k, seed;
    -  coordT *point, realr;
    -
    -  seed= (int)time(NULL); /* time_t to int */
    -  printf("seed: %d\n", seed);
    -  qh_RANDOMseed_(qh, seed);
    -  for (j=0; jfirst_point)  /* in case of 'QRn' */
    -      qh->num_points= numpoints+j+1;
    -    /* qh.num_points sets the size of the points array.  You may
    -       allocate the point elsewhere.  If so, qh_addpoint records
    -       the point's address in qh->other_points
    -    */
    -    for (k= 0; k < dim-1; k++) {
    -      realr= qh_RANDOMint;
    -      point[k]= 2.0 * realr/(qh_RANDOMmax+1) - 1.0;
    -    }
    -    qh_setdelaunay(qh, dim, 1, point);
    -    facet= qh_findbestfacet(qh, point, !qh_ALL, &bestdist, &isoutside);
    -    if (isoutside) {
    -      if (!qh_addpoint(qh, point, facet, False))
    -        break;  /* user requested an early exit with 'TVn' or 'TCn' */
    -    }
    -    qh_printpoint(qh, stdout, "added point", point);
    -    printf("%d points, %d extra points, %d vertices, and %d facets in total\n",
    -                  qh->num_points, qh_setsize(qh, qh->other_points),
    -                  qh->num_vertices, qh->num_facets);
    -
    -    /* qh_produce_output(qh); */
    -  }
    -  if (qh->DOcheckmax)
    -    qh_check_maxout(qh);
    -  else if (qh->KEEPnearinside)
    -    qh_nearcoplanar(qh);
    -} /*.addDelaunay.*/
    -
    -/*--------------------------------------------------
    --findDelaunay- find Delaunay triangle for [0.5,0.5,...]
    -  assumes dim < 100
    -notes:
    -  calls qh_setdelaunay() to project the point to a parabaloid
    -warning:
    -  This is not implemented for tricoplanar facets ('Qt'),
    -  See locate a facet with qh_findbestfacet()
    -*/
    -void findDelaunay(qhT *qh, int dim) {
    -  int k;
    -  coordT point[ 100];
    -  boolT isoutside;
    -  realT bestdist;
    -  facetT *facet;
    -  vertexT *vertex, **vertexp;
    -
    -  for (k= 0; k < dim-1; k++)
    -    point[k]= 0.5;
    -  qh_setdelaunay(qh, dim, 1, point);
    -  facet= qh_findbestfacet(qh, point, qh_ALL, &bestdist, &isoutside);
    -  if (facet->tricoplanar) {
    -    fprintf(stderr, "findDelaunay: not implemented for triangulated, non-simplicial Delaunay regions (tricoplanar facet, f%d).\n",
    -       facet->id);
    -    qh_errexit(qh, qh_ERRqhull, facet, NULL);
    -  }
    -  FOREACHvertex_(facet->vertices) {
    -    for (k=0; k < dim-1; k++)
    -      printf("%5.2f ", vertex->point[k]);
    -    printf("\n");
    -  }
    -} /*.findDelaunay.*/
    -
    -/*--------------------------------------------------
    --makehalf- set points to halfspaces for a (dim)-d diamond
    -  points is numpoints X dim+1
    -
    -  each halfspace consists of dim coefficients followed by an offset
    -*/
    -void makehalf(coordT *points, int numpoints, int dim) {
    -  int j,k;
    -  coordT *point;
    -
    -  for (j=0; jnum_points, qh_setsize(qh, qh->other_points),
    -                  qh->num_vertices, qh->num_facets);
    -    /* qh_produce_output(qh); */
    -  }
    -  if (qh->DOcheckmax)
    -    qh_check_maxout(qh);
    -  else if (qh->KEEPnearinside)
    -    qh_nearcoplanar(qh);
    -} /*.addhalf.*/
    -
    -#define DIM 3     /* dimension of points, must be < 31 for SIZEcube */
    -#define SIZEcube (1<&1'\n\n");
    -
    -  ismalloc= False;      /* True if qh_freeqhull should 'free(array)' */
    -  /*
    -    Run 1: convex hull
    -  */
    -  qh_init_A(qh, stdin, stdout, stderr, 0, NULL);
    -  exitcode= setjmp(qh->errexit);
    -  if (!exitcode) {
    -    coordT array[TOTpoints][DIM];
    -
    -    qh->NOerrexit= False;
    -    strcat(qh->rbox_command, "user_eg2 cube example");
    -    sprintf(options, "qhull s Tcv Q11 %s ", argc >= 2 ? argv[1] : "");
    -    qh_initflags(qh, options);
    -    printf( "\ncompute triangulated convex hull of cube after rotating input\n");
    -    makecube(array[0], SIZEcube, DIM);
    -    qh_init_B(qh, array[0], SIZEcube, DIM, ismalloc);
    -    qh_qhull(qh);
    -    qh_check_output(qh);
    -    qh_triangulate(qh);  /* requires option 'Q11' if want to add points */
    -    print_summary(qh);
    -    if (qh->VERIFYoutput && !qh->STOPpoint && !qh->STOPcone)
    -      qh_check_points(qh);
    -    printf( "\nadd points in a diamond\n");
    -    adddiamond(qh, array[0], SIZEcube, SIZEdiamond, DIM);
    -    qh_check_output(qh);
    -    print_summary(qh);
    -    qh_produce_output(qh);  /* delete this line to help avoid io.c */
    -    if (qh->VERIFYoutput && !qh->STOPpoint && !qh->STOPcone)
    -      qh_check_points(qh);
    -  }
    -  qh->NOerrexit= True;
    -  qh_freeqhull(qh, !qh_ALL);
    -  qh_memfreeshort(qh, &curlong, &totlong);
    -  if (curlong || totlong)
    -      fprintf(stderr, "qhull warning (user_eg2, run 1): did not free %d bytes of long memory (%d pieces)\n",
    -          totlong, curlong);
    -  /*
    -    Run 2: Delaunay triangulation
    -  */
    -  qh_init_A(qh, stdin, stdout, stderr, 0, NULL);
    -  exitcode= setjmp(qh->errexit);
    -  if (!exitcode) {
    -    coordT array[TOTpoints][DIM];
    -
    -    qh->NOerrexit= False;
    -    strcat(qh->rbox_command, "user_eg2 Delaunay example");
    -    sprintf(options, "qhull s d Tcv %s", argc >= 3 ? argv[2] : "");
    -    qh_initflags(qh, options);
    -    printf( "\ncompute %d-d Delaunay triangulation\n", DIM-1);
    -    makeDelaunay(qh, array[0], SIZEcube, DIM);
    -    /* Instead of makeDelaunay with qh_setdelaunay, you may
    -       produce a 2-d array of points, set DIM to 2, and set
    -       qh->PROJECTdelaunay to True.  qh_init_B will call
    -       qh_projectinput to project the points to the paraboloid
    -       and add a point "at-infinity".
    -    */
    -    qh_init_B(qh, array[0], SIZEcube, DIM, ismalloc);
    -    qh_qhull(qh);
    -    /* If you want Voronoi ('v') without qh_produce_output(), call
    -       qh_setvoronoi_all() after qh_qhull() */
    -    qh_check_output(qh);
    -    print_summary(qh);
    -    qh_produce_output(qh);  /* delete this line to help avoid io.c */
    -    if (qh->VERIFYoutput && !qh->STOPpoint && !qh->STOPcone)
    -      qh_check_points(qh);
    -    printf( "\nadd points to triangulation\n");
    -    addDelaunay(qh, array[0], SIZEcube, SIZEdiamond, DIM);
    -    qh_check_output(qh);
    -    qh_produce_output(qh);  /* delete this line to help avoid io.c */
    -    if (qh->VERIFYoutput && !qh->STOPpoint && !qh->STOPcone)
    -      qh_check_points(qh);
    -    printf( "\nfind Delaunay triangle closest to [0.5, 0.5, ...]\n");
    -    findDelaunay(qh, DIM);
    -  }
    -  qh->NOerrexit= True;
    -  qh_freeqhull(qh, !qh_ALL);
    -  qh_memfreeshort(qh, &curlong, &totlong);
    -  if (curlong || totlong) 
    -      fprintf(stderr, "qhull warning (user_eg2, run 2): did not free %d bytes of long memory (%d pieces)\n",
    -         totlong, curlong);
    -  /*
    -    Run 3: halfspace intersection
    -  */
    -  qh_init_A(qh, stdin, stdout, stderr, 0, NULL);
    -  exitcode= setjmp(qh->errexit);
    -  if (!exitcode) {
    -    coordT array[TOTpoints][DIM+1];  /* +1 for halfspace offset */
    -    pointT *points;
    -
    -    qh->NOerrexit= False;
    -    strcat(qh->rbox_command, "user_eg2 halfspace example");
    -    sprintf(options, "qhull H0 s Tcv %s", argc >= 4 ? argv[3] : "");
    -    qh_initflags(qh, options);
    -    printf( "\ncompute halfspace intersection about the origin for a diamond\n");
    -    makehalf(array[0], SIZEcube, DIM);
    -    qh_setfeasible(qh, DIM); /* from io.c, sets qh->feasible_point from 'Hn,n' */
    -    /* you may malloc and set qh->feasible_point directly.  It is only used for
    -       option 'Fp' */
    -    points= qh_sethalfspace_all(qh, DIM+1, SIZEcube, array[0], qh->feasible_point);
    -    qh_init_B(qh, points, SIZEcube, DIM, True); /* qh_freeqhull frees points */
    -    qh_qhull(qh);
    -    qh_check_output(qh);
    -    qh_produce_output(qh);  /* delete this line to help avoid io.c */
    -    if (qh->VERIFYoutput && !qh->STOPpoint && !qh->STOPcone)
    -      qh_check_points(qh);
    -    printf( "\nadd halfspaces for cube to intersection\n");
    -    addhalf(qh, array[0], SIZEcube, SIZEdiamond, DIM, qh->feasible_point);
    -    qh_check_output(qh);
    -    qh_produce_output(qh);  /* delete this line to help avoid io.c */
    -    if (qh->VERIFYoutput && !qh->STOPpoint && !qh->STOPcone)
    -      qh_check_points(qh);
    -  }
    -  qh->NOerrexit= True;
    -  qh->NOerrexit= True;
    -  qh_freeqhull(qh, !qh_ALL);
    -  qh_memfreeshort(qh, &curlong, &totlong);
    -  if (curlong || totlong)
    -      fprintf(stderr, "qhull warning (user_eg2, run 3): did not free %d bytes of long memory (%d pieces)\n",
    -          totlong, curlong);
    -  return exitcode;
    -} /* main */
    -
    -#if 1    /* use 1 to prevent loading of io.o and user.o */
    -/*-------------------------------------------
    --errexit- return exitcode to system after an error
    -  assumes exitcode non-zero
    -  prints useful information
    -  see qh_errexit2() in libqhull.c for 2 facets
    -*/
    -void qh_errexit(qhT *qh, int exitcode, facetT *facet, ridgeT *ridge) {
    -  QHULL_UNUSED(facet);
    -  QHULL_UNUSED(ridge);
    -
    -  if (qh->ERREXITcalled) {
    -    fprintf(qh->ferr, "qhull error while processing previous error.  Exit program\n");
    -    exit(1);
    -  }
    -  qh->ERREXITcalled= True;
    -  if (!qh->QHULLfinished)
    -    qh->hulltime= (unsigned)clock() - qh->hulltime;
    -  fprintf(qh->ferr, "\nWhile executing: %s | %s\n", qh->rbox_command, qh->qhull_command);
    -  fprintf(qh->ferr, "Options selected:\n%s\n", qh->qhull_options);
    -  if (qh->furthest_id >= 0) {
    -    fprintf(qh->ferr, "\nLast point added to hull was p%d", qh->furthest_id);
    -    if (zzval_(Ztotmerge))
    -      fprintf(qh->ferr, "  Last merge was #%d.", zzval_(Ztotmerge));
    -    if (qh->QHULLfinished)
    -      fprintf(qh->ferr, "\nQhull has finished constructing the hull.");
    -    else if (qh->POSTmerging)
    -      fprintf(qh->ferr, "\nQhull has started post-merging");
    -    fprintf(qh->ferr, "\n\n");
    -  }
    -  if (qh->NOerrexit) {
    -    fprintf(qh->ferr, "qhull error while ending program.  Exit program\n");
    -    exit(1);
    -  }
    -  if (!exitcode)
    -    exitcode= qh_ERRqhull;
    -  qh->NOerrexit= True;
    -  longjmp(qh->errexit, exitcode);
    -} /* errexit */
    -
    -
    -/*-------------------------------------------
    --errprint- prints out the information of the erroneous object
    -    any parameter may be NULL, also prints neighbors and geomview output
    -*/
    -void qh_errprint(qhT *qh, const char *string, facetT *atfacet, facetT *otherfacet, ridgeT *atridge, vertexT *atvertex) {
    -
    -  fprintf(qh->ferr, "%s facets f%d f%d ridge r%d vertex v%d\n",
    -           string, getid_(atfacet), getid_(otherfacet), getid_(atridge),
    -           getid_(atvertex));
    -} /* errprint */
    -
    -
    -void qh_printfacetlist(qhT *qh, facetT *facetlist, setT *facets, boolT printall) {
    -  facetT *facet, **facetp;
    -
    -  /* remove these calls to help avoid io.c */
    -  qh_printbegin(qh, qh->ferr, qh_PRINTfacets, facetlist, facets, printall);/*io.c*/
    -  FORALLfacet_(facetlist)                                              /*io.c*/
    -    qh_printafacet(qh, qh->ferr, qh_PRINTfacets, facet, printall);          /*io.c*/
    -  FOREACHfacet_(facets)                                                /*io.c*/
    -    qh_printafacet(qh, qh->ferr, qh_PRINTfacets, facet, printall);          /*io.c*/
    -  qh_printend(qh, qh->ferr, qh_PRINTfacets, facetlist, facets, printall);  /*io.c*/
    -
    -  FORALLfacet_(facetlist)
    -    fprintf( qh->ferr, "facet f%d\n", facet->id);
    -} /* printfacetlist */
    -
    -/* qh_printhelp_degenerate( fp )
    -    prints descriptive message for precision error
    -
    -  notes:
    -    no message if qh_QUICKhelp
    -*/
    -void qh_printhelp_degenerate(qhT *qh, FILE *fp) {
    -
    -  if (qh->MERGEexact || qh->PREmerge || qh->JOGGLEmax < REALmax/2)
    -    qh_fprintf(qh, fp, 9368, "\n\
    -A Qhull error has occurred.  Qhull should have corrected the above\n\
    -precision error.  Please send the input and all of the output to\n\
    -qhull_bug@qhull.org\n");
    -  else if (!qh_QUICKhelp) {
    -    qh_fprintf(qh, fp, 9369, "\n\
    -Precision problems were detected during construction of the convex hull.\n\
    -This occurs because convex hull algorithms assume that calculations are\n\
    -exact, but floating-point arithmetic has roundoff errors.\n\
    -\n\
    -To correct for precision problems, do not use 'Q0'.  By default, Qhull\n\
    -selects 'C-0' or 'Qx' and merges non-convex facets.  With option 'QJ',\n\
    -Qhull joggles the input to prevent precision problems.  See \"Imprecision\n\
    -in Qhull\" (qh-impre.htm).\n\
    -\n\
    -If you use 'Q0', the output may include\n\
    -coplanar ridges, concave ridges, and flipped facets.  In 4-d and higher,\n\
    -Qhull may produce a ridge with four neighbors or two facets with the same \n\
    -vertices.  Qhull reports these events when they occur.  It stops when a\n\
    -concave ridge, flipped facet, or duplicate facet occurs.\n");
    -#if REALfloat
    -    qh_fprintf(qh, fp, 9370, "\
    -\n\
    -Qhull is currently using single precision arithmetic.  The following\n\
    -will probably remove the precision problems:\n\
    -  - recompile qhull for realT precision(#define REALfloat 0 in user.h).\n");
    -#endif
    -    if (qh->DELAUNAY && !qh->SCALElast && qh->MAXabs_coord > 1e4)
    -      qh_fprintf(qh, fp, 9371, "\
    -\n\
    -When computing the Delaunay triangulation of coordinates > 1.0,\n\
    -  - use 'Qbb' to scale the last coordinate to [0,m] (max previous coordinate)\n");
    -    if (qh->DELAUNAY && !qh->ATinfinity)
    -      qh_fprintf(qh, fp, 9372, "\
    -When computing the Delaunay triangulation:\n\
    -  - use 'Qz' to add a point at-infinity.  This reduces precision problems.\n");
    -
    -    qh_fprintf(qh, fp, 9373, "\
    -\n\
    -If you need triangular output:\n\
    -  - use option 'Qt' to triangulate the output\n\
    -  - use option 'QJ' to joggle the input points and remove precision errors\n\
    -  - use option 'Ft'.  It triangulates non-simplicial facets with added points.\n\
    -\n\
    -If you must use 'Q0',\n\
    -try one or more of the following options.  They can not guarantee an output.\n\
    -  - use 'QbB' to scale the input to a cube.\n\
    -  - use 'Po' to produce output and prevent partitioning for flipped facets\n\
    -  - use 'V0' to set min. distance to visible facet as 0 instead of roundoff\n\
    -  - use 'En' to specify a maximum roundoff error less than %2.2g.\n\
    -  - options 'Qf', 'Qbb', and 'QR0' may also help\n",
    -               qh->DISTround);
    -    qh_fprintf(qh, fp, 9374, "\
    -\n\
    -To guarantee simplicial output:\n\
    -  - use option 'Qt' to triangulate the output\n\
    -  - use option 'QJ' to joggle the input points and remove precision errors\n\
    -  - use option 'Ft' to triangulate the output by adding points\n\
    -  - use exact arithmetic (see \"Imprecision in Qhull\", qh-impre.htm)\n\
    -");
    -  }
    -} /* printhelp_degenerate */
    -
    -
    -/* qh_printhelp_narrowhull( minangle )
    -     Warn about a narrow hull
    -
    -  notes:
    -    Alternatively, reduce qh_WARNnarrow in user.h
    -
    -*/
    -void qh_printhelp_narrowhull(qhT *qh, FILE *fp, realT minangle) {
    -
    -    qh_fprintf(qh, fp, 9375, "qhull precision warning: \n\
    -The initial hull is narrow (cosine of min. angle is %.16f).\n\
    -A coplanar point may lead to a wide facet.  Options 'QbB' (scale to unit box)\n\
    -or 'Qbb' (scale last coordinate) may remove this warning.  Use 'Pp' to skip\n\
    -this warning.  See 'Limitations' in qh-impre.htm.\n",
    -          -minangle);   /* convert from angle between normals to angle between facets */
    -} /* printhelp_narrowhull */
    -
    -/* qh_printhelp_singular
    -      prints descriptive message for singular input
    -*/
    -void qh_printhelp_singular(qhT *qh, FILE *fp) {
    -  facetT *facet;
    -  vertexT *vertex, **vertexp;
    -  realT min, max, *coord, dist;
    -  int i,k;
    -
    -  qh_fprintf(qh, fp, 9376, "\n\
    -The input to qhull appears to be less than %d dimensional, or a\n\
    -computation has overflowed.\n\n\
    -Qhull could not construct a clearly convex simplex from points:\n",
    -           qh->hull_dim);
    -  qh_printvertexlist(qh, fp, "", qh->facet_list, NULL, qh_ALL);
    -  if (!qh_QUICKhelp)
    -    qh_fprintf(qh, fp, 9377, "\n\
    -The center point is coplanar with a facet, or a vertex is coplanar\n\
    -with a neighboring facet.  The maximum round off error for\n\
    -computing distances is %2.2g.  The center point, facets and distances\n\
    -to the center point are as follows:\n\n", qh->DISTround);
    -  qh_printpointid(qh, fp, "center point", qh->hull_dim, qh->interior_point, -1);
    -  qh_fprintf(qh, fp, 9378, "\n");
    -  FORALLfacets {
    -    qh_fprintf(qh, fp, 9379, "facet");
    -    FOREACHvertex_(facet->vertices)
    -      qh_fprintf(qh, fp, 9380, " p%d", qh_pointid(qh, vertex->point));
    -    zinc_(Zdistio);
    -    qh_distplane(qh, qh->interior_point, facet, &dist);
    -    qh_fprintf(qh, fp, 9381, " distance= %4.2g\n", dist);
    -  }
    -  if (!qh_QUICKhelp) {
    -    if (qh->HALFspace)
    -      qh_fprintf(qh, fp, 9382, "\n\
    -These points are the dual of the given halfspaces.  They indicate that\n\
    -the intersection is degenerate.\n");
    -    qh_fprintf(qh, fp, 9383,"\n\
    -These points either have a maximum or minimum x-coordinate, or\n\
    -they maximize the determinant for k coordinates.  Trial points\n\
    -are first selected from points that maximize a coordinate.\n");
    -    if (qh->hull_dim >= qh_INITIALmax)
    -      qh_fprintf(qh, fp, 9384, "\n\
    -Because of the high dimension, the min x-coordinate and max-coordinate\n\
    -points are used if the determinant is non-zero.  Option 'Qs' will\n\
    -do a better, though much slower, job.  Instead of 'Qs', you can change\n\
    -the points by randomly rotating the input with 'QR0'.\n");
    -  }
    -  qh_fprintf(qh, fp, 9385, "\nThe min and max coordinates for each dimension are:\n");
    -  for (k=0; k < qh->hull_dim; k++) {
    -    min= REALmax;
    -    max= -REALmin;
    -    for (i=qh->num_points, coord= qh->first_point+k; i--; coord += qh->hull_dim) {
    -      maximize_(max, *coord);
    -      minimize_(min, *coord);
    -    }
    -    qh_fprintf(qh, fp, 9386, "  %d:  %8.4g  %8.4g  difference= %4.4g\n", k, min, max, max-min);
    -  }
    -  if (!qh_QUICKhelp) {
    -    qh_fprintf(qh, fp, 9387, "\n\
    -If the input should be full dimensional, you have several options that\n\
    -may determine an initial simplex:\n\
    -  - use 'QJ'  to joggle the input and make it full dimensional\n\
    -  - use 'QbB' to scale the points to the unit cube\n\
    -  - use 'QR0' to randomly rotate the input for different maximum points\n\
    -  - use 'Qs'  to search all points for the initial simplex\n\
    -  - use 'En'  to specify a maximum roundoff error less than %2.2g.\n\
    -  - trace execution with 'T3' to see the determinant for each point.\n",
    -                     qh->DISTround);
    -#if REALfloat
    -    qh_fprintf(qh, fp, 9388, "\
    -  - recompile qhull for realT precision(#define REALfloat 0 in libqhull.h).\n");
    -#endif
    -    qh_fprintf(qh, fp, 9389, "\n\
    -If the input is lower dimensional:\n\
    -  - use 'QJ' to joggle the input and make it full dimensional\n\
    -  - use 'Qbk:0Bk:0' to delete coordinate k from the input.  You should\n\
    -    pick the coordinate with the least range.  The hull will have the\n\
    -    correct topology.\n\
    -  - determine the flat containing the points, rotate the points\n\
    -    into a coordinate plane, and delete the other coordinates.\n\
    -  - add one or more points to make the input full dimensional.\n\
    -");
    -    if (qh->DELAUNAY && !qh->ATinfinity)
    -      qh_fprintf(qh, fp, 9390, "\n\n\
    -This is a Delaunay triangulation and the input is co-circular or co-spherical:\n\
    -  - use 'Qz' to add a point \"at infinity\" (i.e., above the paraboloid)\n\
    -  - or use 'QJ' to joggle the input and avoid co-circular data\n");
    -  }
    -} /* printhelp_singular */
    -
    -
    -/*-----------------------------------------
    --user_memsizes- allocate up to 10 additional, quick allocation sizes
    -*/
    -void qh_user_memsizes(qhT *qh) {
    -
    -  QHULL_UNUSED(qh);
    -  /* qh_memsize(qh, size); */
    -} /* user_memsizes */
    -
    -#endif
    diff --git a/src/qhull/src/user_eg3/user_eg3.pro b/src/qhull/src/user_eg3/user_eg3.pro
    deleted file mode 100644
    index 35372fbf928..00000000000
    --- a/src/qhull/src/user_eg3/user_eg3.pro
    +++ /dev/null
    @@ -1,12 +0,0 @@
    -# -------------------------------------------------
    -# user_eg3.pro -- Qt project for cpp demonstration user_eg3.exe
    -#
    -# The C++ interface requires reentrant Qhull.
    -# -------------------------------------------------
    -
    -include(../qhull-app-cpp.pri)
    -
    -TARGET = user_eg3
    -CONFIG -= qt
    -
    -SOURCES += user_eg3_r.cpp
    diff --git a/src/qhull/src/user_eg3/user_eg3_r.cpp b/src/qhull/src/user_eg3/user_eg3_r.cpp
    deleted file mode 100644
    index 5257872ab8f..00000000000
    --- a/src/qhull/src/user_eg3/user_eg3_r.cpp
    +++ /dev/null
    @@ -1,162 +0,0 @@
    -#//! user_eg3_r.cpp -- Invoke rbox and qhull from C++
    -
    -#include "libqhullcpp/RboxPoints.h"
    -#include "libqhullcpp/QhullError.h"
    -#include "libqhullcpp/QhullQh.h"
    -#include "libqhullcpp/QhullFacet.h"
    -#include "libqhullcpp/QhullFacetList.h"
    -#include "libqhullcpp/QhullLinkedList.h"
    -#include "libqhullcpp/QhullVertex.h"
    -#include "libqhullcpp/Qhull.h"
    -
    -#include    /* for printf() of help message */
    -#include 
    -#include 
    -
    -using std::cerr;
    -using std::cin;
    -using std::cout;
    -using std::endl;
    -
    -using orgQhull::Qhull;
    -using orgQhull::QhullError;
    -using orgQhull::QhullFacet;
    -using orgQhull::QhullFacetList;
    -using orgQhull::QhullQh;
    -using orgQhull::RboxPoints;
    -using orgQhull::QhullVertex;
    -using orgQhull::QhullVertexSet;
    -
    -int main(int argc, char **argv);
    -int user_eg3(int argc, char **argv);
    -
    -char prompt[]= "\n\
    -user_eg3 -- demonstrate calling rbox and qhull from C++.\n\
    -\n\
    -user_eg3 is statically linked to reentrant qhull.  If user_eg3\n\
    -fails immediately, it is probably linked to the non-reentrant qhull.\n\
    -Try 'user_eg3 rbox qhull \"T1\"'\n\
    -\n\
    -  eg-100                       Run the example in qh-code.htm\n\
    -  rbox \"200 D4\" ...            Generate points from rbox\n\
    -  qhull \"d p\" ...              Run qhull and produce output\n\
    -  qhull-cout \"o\" ...           Run qhull and produce output to cout\n\
    -  qhull \"T1\" ...               Run qhull with level-1 trace to cerr\n\
    -  facets                       Print facets when done\n\
    -\n\
    -For example\n\
    -  user_eg3 rbox qhull\n\
    -  user_eg3 rbox qhull d\n\
    -  user_eg3 rbox \"10 D2\"  \"2 D2\" qhull  \"s p\" facets\n\
    -\n\
    -";
    -
    -
    -/*--------------------------------------------
    --user_eg3-  main procedure of user_eg3 application
    -*/
    -int main(int argc, char **argv) {
    -
    -    QHULL_LIB_CHECK
    -
    -    if(argc==1){
    -        cout << prompt;
    -        return 1;
    -    }
    -    try{
    -        return user_eg3(argc, argv);
    -    }catch(QhullError &e){
    -        cerr << e.what() << std::endl;
    -        return e.errorCode();
    -    }
    -}//main
    -
    -int user_eg3(int argc, char **argv)
    -{
    -    if(strcmp(argv[1], "eg-100")==0){
    -        RboxPoints rbox("100");
    -        Qhull q(rbox, "");
    -        QhullFacetList facets= q.facetList();
    -        cout << facets;
    -        return 0;
    -    }
    -    bool printFacets= false;
    -    RboxPoints rbox;
    -    Qhull qhull;
    -    int readingRbox= 0;
    -    int readingQhull= 0;
    -    for(int i=1; i& shape)
     #else
     		auto color = wxSystemSettings::GetColour(wxSYS_COLOUR_3DLIGHT); //GetSystemColour
     #endif
    -		dc.SetPen(*new wxPen(color, 1, wxPENSTYLE_SOLID));
    -		dc.SetBrush(*new wxBrush(color, wxBRUSHSTYLE_SOLID));
    +		dc.SetPen(wxPen(color, 1, wxPENSTYLE_SOLID));
    +		dc.SetBrush(wxBrush(color, wxBRUSHSTYLE_SOLID));
     		auto rect = GetUpdateRegion().GetBox();
     		dc.DrawRectangle(rect.GetLeft(), rect.GetTop(), rect.GetWidth(), rect.GetHeight());
     	}
    @@ -75,11 +75,15 @@ void Bed_2D::repaint(const std::vector& shape)
     
     	// draw bed fill
     	dc.SetBrush(wxBrush(wxColour(255, 255, 255), wxBRUSHSTYLE_SOLID));
    +
     	wxPointList pt_list;
    -    for (auto pt : shape)
    -    {
    -        Point pt_pix = to_pixels(pt, ch);
    -        pt_list.push_back(new wxPoint(pt_pix(0), pt_pix(1)));
    +	const size_t pt_cnt = shape.size();
    +	std::vector points;
    +    points.reserve(pt_cnt);
    +    for (const auto& shape_pt : shape) {
    +        Point pt_pix = to_pixels(shape_pt, ch);
    +		points.emplace_back(wxPoint(pt_pix(0), pt_pix(1)));
    +        pt_list.Append(&points.back());
     	}
     	dc.DrawPolygon(&pt_list, 0, 0);
     
    diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp
    index bd5ca9f5212..f43afdf4269 100644
    --- a/src/slic3r/GUI/3DBed.cpp
    +++ b/src/slic3r/GUI/3DBed.cpp
    @@ -11,6 +11,8 @@
     
     #include "GUI_App.hpp"
     #include "GLCanvas3D.hpp"
    +#include "Plater.hpp"
    +#include "Camera.hpp"
     
     #include 
     
    @@ -19,124 +21,14 @@
     #include 
     
     static const float GROUND_Z = -0.02f;
    -static const std::array DEFAULT_MODEL_COLOR = { 0.235f, 0.235f, 0.235f, 1.0f };
    -static const std::array PICKING_MODEL_COLOR = { 0.0f, 0.0f, 0.0f, 1.0f };
    +static const Slic3r::ColorRGBA DEFAULT_MODEL_COLOR             = Slic3r::ColorRGBA::DARK_GRAY();
    +static const Slic3r::ColorRGBA PICKING_MODEL_COLOR             = Slic3r::ColorRGBA::BLACK();
    +static const Slic3r::ColorRGBA DEFAULT_SOLID_GRID_COLOR        = { 0.9f, 0.9f, 0.9f, 1.0f };
    +static const Slic3r::ColorRGBA DEFAULT_TRANSPARENT_GRID_COLOR  = { 0.9f, 0.9f, 0.9f, 0.6f };
     
     namespace Slic3r {
     namespace GUI {
     
    -bool GeometryBuffer::set_from_triangles(const std::vector &triangles, float z)
    -{
    -    if (triangles.empty()) {
    -        m_vertices.clear();
    -        return false;
    -    }
    -
    -    assert(triangles.size() % 3 == 0);
    -    m_vertices = std::vector(triangles.size(), Vertex());
    -
    -    Vec2f min = triangles.front();
    -    Vec2f max = min;
    -
    -    for (size_t v_count = 0; v_count < triangles.size(); ++ v_count) {
    -        const Vec2f &p = triangles[v_count];
    -        Vertex      &v = m_vertices[v_count];
    -        v.position   = Vec3f(p.x(), p.y(), z);
    -        v.tex_coords = p;
    -        min = min.cwiseMin(p).eval();
    -        max = max.cwiseMax(p).eval();
    -    }
    -
    -    Vec2f size = max - min;
    -    if (size.x() != 0.f && size.y() != 0.f) {
    -        Vec2f inv_size = size.cwiseInverse();
    -        inv_size.y() *= -1;
    -        for (Vertex& v : m_vertices) {
    -            v.tex_coords -= min;
    -            v.tex_coords.x() *= inv_size.x();
    -            v.tex_coords.y() *= inv_size.y();
    -        }
    -    }
    -
    -    return true;
    -}
    -
    -bool GeometryBuffer::set_from_lines(const Lines& lines, float z)
    -{
    -    m_vertices.clear();
    -
    -    unsigned int v_size = 2 * (unsigned int)lines.size();
    -    if (v_size == 0)
    -        return false;
    -
    -    m_vertices = std::vector(v_size, Vertex());
    -
    -    unsigned int v_count = 0;
    -    for (const Line& l : lines) {
    -        Vertex& v1 = m_vertices[v_count];
    -        v1.position[0] = unscale(l.a(0));
    -        v1.position[1] = unscale(l.a(1));
    -        v1.position[2] = z;
    -        ++v_count;
    -
    -        Vertex& v2 = m_vertices[v_count];
    -        v2.position[0] = unscale(l.b(0));
    -        v2.position[1] = unscale(l.b(1));
    -        v2.position[2] = z;
    -        ++v_count;
    -    }
    -
    -    return true;
    -}
    -
    -const float* GeometryBuffer::get_vertices_data() const
    -{
    -    return (m_vertices.size() > 0) ? (const float*)m_vertices.data() : nullptr;
    -}
    -
    -const float Bed3D::Axes::DefaultStemRadius = 0.5f;
    -const float Bed3D::Axes::DefaultStemLength = 25.0f;
    -const float Bed3D::Axes::DefaultTipRadius = 2.5f * Bed3D::Axes::DefaultStemRadius;
    -const float Bed3D::Axes::DefaultTipLength = 5.0f;
    -
    -void Bed3D::Axes::render() const
    -{
    -    auto render_axis = [this](const Transform3f& transform) {
    -        glsafe(::glPushMatrix());
    -        glsafe(::glMultMatrixf(transform.data()));
    -        m_arrow.render();
    -        glsafe(::glPopMatrix());
    -    };
    -
    -    if (!m_arrow.is_initialized())
    -        const_cast(&m_arrow)->init_from(stilized_arrow(16, DefaultTipRadius, DefaultTipLength, DefaultStemRadius, m_stem_length));
    -
    -    GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light");
    -    if (shader == nullptr)
    -        return;
    -
    -    glsafe(::glEnable(GL_DEPTH_TEST));
    -
    -    shader->start_using();
    -    shader->set_uniform("emission_factor", 0.0f);
    -
    -    // x axis
    -    const_cast(&m_arrow)->set_color(-1, { 0.75f, 0.0f, 0.0f, 1.0f });
    -    render_axis(Geometry::assemble_transform(m_origin, { 0.0, 0.5 * M_PI, 0.0 }).cast());
    -
    -    // y axis
    -    const_cast(&m_arrow)->set_color(-1, { 0.0f, 0.75f, 0.0f, 1.0f });
    -    render_axis(Geometry::assemble_transform(m_origin, { -0.5 * M_PI, 0.0, 0.0 }).cast());
    -
    -    // z axis
    -    const_cast(&m_arrow)->set_color(-1, { 0.0f, 0.0f, 0.75f, 1.0f });
    -    render_axis(Geometry::assemble_transform(m_origin).cast());
    -
    -    shader->stop_using();
    -
    -    glsafe(::glDisable(GL_DEPTH_TEST));
    -}
    -
     bool Bed3D::set_shape(const Pointfs& bed_shape, const double max_print_height, const std::string& custom_texture, const std::string& custom_model, bool force_as_custom)
     {
         auto check_texture = [](const std::string& texture) {
    @@ -184,16 +76,15 @@ bool Bed3D::set_shape(const Pointfs& bed_shape, const double max_print_height, c
         m_model_filename = model_filename;
         m_extended_bounding_box = this->calc_extended_bounding_box();
     
    -    ExPolygon poly{ Polygon::new_scale(bed_shape) };
    -
    -    calc_triangles(poly);
    +    m_contour = ExPolygon(Polygon::new_scale(bed_shape));
    +    const BoundingBox bbox = m_contour.contour.bounding_box();
    +    if (!bbox.defined)
    +        throw RuntimeError(std::string("Invalid bed shape"));
    +    m_polygon = offset(m_contour.contour, (float)bbox.radius() * 1.7f, jtRound, scale_(0.5)).front();
     
    -    const BoundingBox& bed_bbox = poly.contour.bounding_box();
    -    calc_gridlines(poly, bed_bbox);
    -
    -    m_polygon = offset(poly.contour, (float)bed_bbox.radius() * 1.7f, jtRound, scale_(0.5))[0];
    -
    -    this->release_VBOs();
    +    m_triangles.reset();
    +    m_gridlines.reset();
    +    m_contourlines.reset();
         m_texture.reset();
         m_model.reset();
     
    @@ -201,6 +92,9 @@ bool Bed3D::set_shape(const Pointfs& bed_shape, const double max_print_height, c
         m_axes.set_origin({ 0.0, 0.0, static_cast(GROUND_Z) });
         m_axes.set_stem_length(0.1f * static_cast(m_build_volume.bounding_volume().max_size()));
     
    +    // unregister from picking
    +    wxGetApp().plater()->canvas3D()->remove_raycasters_for_picking(SceneRaycaster::EType::Bed);
    +
         // Let the calee to update the UI.
         return true;
     }
    @@ -215,34 +109,30 @@ Point Bed3D::point_projection(const Point& point) const
         return m_polygon.point_projection(point);
     }
     
    -void Bed3D::render(GLCanvas3D& canvas, bool bottom, float scale_factor, bool show_axes, bool show_texture)
    +void Bed3D::render(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor, bool show_texture)
     {
    -    render_internal(canvas, bottom, scale_factor, show_axes, show_texture, false);
    +    render_internal(canvas, view_matrix, projection_matrix, bottom, scale_factor, show_texture, false);
     }
     
    -void Bed3D::render_for_picking(GLCanvas3D& canvas, bool bottom, float scale_factor)
    +void Bed3D::render_for_picking(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor)
     {
    -    render_internal(canvas, bottom, scale_factor, false, false, true);
    +    render_internal(canvas, view_matrix, projection_matrix, bottom, scale_factor, false, true);
     }
     
    -void Bed3D::render_internal(GLCanvas3D& canvas, bool bottom, float scale_factor,
    -    bool show_axes, bool show_texture, bool picking)
    +void Bed3D::render_internal(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor,
    +    bool show_texture, bool picking)
     {
    -    float* factor = const_cast(&m_scale_factor);
    -    *factor = scale_factor;
    -
    -    if (show_axes)
    -        render_axes();
    +    m_scale_factor = scale_factor;
     
         glsafe(::glEnable(GL_DEPTH_TEST));
     
    -    m_model.set_color(-1, picking ? PICKING_MODEL_COLOR : DEFAULT_MODEL_COLOR);
    +    m_model.model.set_color(picking ? PICKING_MODEL_COLOR : DEFAULT_MODEL_COLOR);
     
         switch (m_type)
         {
    -    case Type::System: { render_system(canvas, bottom, show_texture); break; }
    +    case Type::System: { render_system(canvas, view_matrix, projection_matrix, bottom, show_texture); break; }
         default:
    -    case Type::Custom: { render_custom(canvas, bottom, show_texture, picking); break; }
    +    case Type::Custom: { render_custom(canvas, view_matrix, projection_matrix, bottom, show_texture, picking); break; }
         }
     
         glsafe(::glDisable(GL_DEPTH_TEST));
    @@ -259,11 +149,13 @@ BoundingBoxf3 Bed3D::calc_extended_bounding_box() const
         // Reset the build volume Z, we don't want to zoom to the top of the build volume if it is empty.
         out.min.z() = 0.0;
         out.max.z() = 0.0;
    +    // extend to origin in case origin is off bed
    +    out.merge(m_axes.get_origin());
         // extend to contain axes
         out.merge(m_axes.get_origin() + m_axes.get_total_length() * Vec3d::Ones());
    -    out.merge(out.min + Vec3d(-Axes::DefaultTipRadius, -Axes::DefaultTipRadius, out.max.z()));
    +    out.merge(out.min + Vec3d(-m_axes.get_tip_radius(), -m_axes.get_tip_radius(), out.max.z()));
         // extend to contain model, if any
    -    BoundingBoxf3 model_bb = m_model.get_bounding_box();
    +    BoundingBoxf3 model_bb = m_model.model.get_bounding_box();
         if (model_bb.defined) {
             model_bb.translate(m_model_offset);
             out.merge(model_bb);
    @@ -271,22 +163,74 @@ BoundingBoxf3 Bed3D::calc_extended_bounding_box() const
         return out;
     }
     
    -void Bed3D::calc_triangles(const ExPolygon& poly)
    +void Bed3D::init_triangles()
     {
    -    if (! m_triangles.set_from_triangles(triangulate_expolygon_2f(poly, NORMALS_UP), GROUND_Z))
    -        BOOST_LOG_TRIVIAL(error) << "Unable to create bed triangles";
    +    if (m_triangles.is_initialized())
    +        return;
    +
    +    if (m_contour.empty())
    +        return;
    +
    +    const std::vector triangles = triangulate_expolygon_2f(m_contour, NORMALS_UP);
    +    if (triangles.empty() || triangles.size() % 3 != 0)
    +        return;
    +
    +    GLModel::Geometry init_data;
    +    init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3T2 };
    +    init_data.reserve_vertices(triangles.size());
    +    init_data.reserve_indices(triangles.size() / 3);
    +
    +    Vec2f min = triangles.front();
    +    Vec2f max = min;
    +    for (const Vec2f& v : triangles) {
    +        min = min.cwiseMin(v).eval();
    +        max = max.cwiseMax(v).eval();
    +    }
    +
    +    const Vec2f size = max - min;
    +    if (size.x() <= 0.0f || size.y() <= 0.0f)
    +        return;
    +
    +    Vec2f inv_size = size.cwiseInverse();
    +    inv_size.y() *= -1.0f;
    +
    +    // vertices + indices
    +    unsigned int vertices_counter = 0;
    +    for (const Vec2f& v : triangles) {
    +        const Vec3f p = { v.x(), v.y(), GROUND_Z };
    +        init_data.add_vertex(p, (Vec2f)(v - min).cwiseProduct(inv_size).eval());
    +        ++vertices_counter;
    +        if (vertices_counter % 3 == 0)
    +            init_data.add_triangle(vertices_counter - 3, vertices_counter - 2, vertices_counter - 1);
    +    }
    +
    +    if (m_model.model.get_filename().empty() && m_model.mesh_raycaster == nullptr)
    +        // register for picking
    +        register_raycasters_for_picking(init_data, Transform3d::Identity());
    +
    +    m_triangles.init_from(std::move(init_data));
    +    m_triangles.set_color(DEFAULT_MODEL_COLOR);
     }
     
    -void Bed3D::calc_gridlines(const ExPolygon& poly, const BoundingBox& bed_bbox)
    +void Bed3D::init_gridlines()
     {
    +    if (m_gridlines.is_initialized())
    +        return;
    +
    +    if (m_contour.empty())
    +        return;
    +
    +    const BoundingBox& bed_bbox = m_contour.contour.bounding_box();
    +    const coord_t step = scale_(10.0);
    +
         Polylines axes_lines;
    -    for (coord_t x = bed_bbox.min.x(); x <= bed_bbox.max.x(); x += scale_(10.0)) {
    +    for (coord_t x = bed_bbox.min.x(); x <= bed_bbox.max.x(); x += step) {
             Polyline line;
             line.append(Point(x, bed_bbox.min.y()));
             line.append(Point(x, bed_bbox.max.y()));
             axes_lines.push_back(line);
         }
    -    for (coord_t y = bed_bbox.min.y(); y <= bed_bbox.max.y(); y += scale_(10.0)) {
    +    for (coord_t y = bed_bbox.min.y(); y <= bed_bbox.max.y(); y += step) {
             Polyline line;
             line.append(Point(bed_bbox.min.x(), y));
             line.append(Point(bed_bbox.max.x(), y));
    @@ -294,14 +238,51 @@ void Bed3D::calc_gridlines(const ExPolygon& poly, const BoundingBox& bed_bbox)
         }
     
         // clip with a slightly grown expolygon because our lines lay on the contours and may get erroneously clipped
    -    Lines gridlines = to_lines(intersection_pl(axes_lines, offset(poly, (float)SCALED_EPSILON)));
    +    Lines gridlines = to_lines(intersection_pl(axes_lines, offset(m_contour, float(SCALED_EPSILON))));
     
         // append bed contours
    -    Lines contour_lines = to_lines(poly);
    +    Lines contour_lines = to_lines(m_contour);
         std::copy(contour_lines.begin(), contour_lines.end(), std::back_inserter(gridlines));
     
    -    if (!m_gridlines.set_from_lines(gridlines, GROUND_Z))
    -        BOOST_LOG_TRIVIAL(error) << "Unable to create bed grid lines\n";
    +    GLModel::Geometry init_data;
    +    init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 };
    +    init_data.reserve_vertices(2 * gridlines.size());
    +    init_data.reserve_indices(2 * gridlines.size());
    +
    +    for (const Slic3r::Line& l : gridlines) {
    +        init_data.add_vertex(Vec3f(unscale(l.a.x()), unscale(l.a.y()), GROUND_Z));
    +        init_data.add_vertex(Vec3f(unscale(l.b.x()), unscale(l.b.y()), GROUND_Z));
    +        const unsigned int vertices_counter = (unsigned int)init_data.vertices_count();
    +        init_data.add_line(vertices_counter - 2, vertices_counter - 1);
    +    }
    +
    +    m_gridlines.init_from(std::move(init_data));
    +}
    +
    +void Bed3D::init_contourlines()
    +{
    +    if (m_contourlines.is_initialized())
    +        return;
    +
    +    if (m_contour.empty())
    +        return;
    +
    +    const Lines contour_lines = to_lines(m_contour);
    +
    +    GLModel::Geometry init_data;
    +    init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 };
    +    init_data.reserve_vertices(2 * contour_lines.size());
    +    init_data.reserve_indices(2 * contour_lines.size());
    +
    +    for (const Slic3r::Line& l : contour_lines) {
    +        init_data.add_vertex(Vec3f(unscale(l.a.x()), unscale(l.a.y()), GROUND_Z));
    +        init_data.add_vertex(Vec3f(unscale(l.b.x()), unscale(l.b.y()), GROUND_Z));
    +        const unsigned int vertices_counter = (unsigned int)init_data.vertices_count();
    +        init_data.add_line(vertices_counter - 2, vertices_counter - 1);
    +    }
    +
    +    m_contourlines.init_from(std::move(init_data));
    +    m_contourlines.set_color({ 1.0f, 1.0f, 1.0f, 0.5f });
     }
     
     // Try to match the print bed shape with the shape of an active profile. If such a match exists,
    @@ -328,248 +309,262 @@ std::tuple Bed3D::detect_type(const Point
         return { Type::Custom, {}, {} };
     }
     
    -void Bed3D::render_axes() const
    +void Bed3D::render_axes()
     {
         if (m_build_volume.valid())
    -        m_axes.render();
    +        m_axes.render(Transform3d::Identity(), 0.25f);
     }
     
    -void Bed3D::render_system(GLCanvas3D& canvas, bool bottom, bool show_texture) const
    +void Bed3D::render_system(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_texture)
     {
         if (!bottom)
    -        render_model();
    +        render_model(view_matrix, projection_matrix);
     
         if (show_texture)
    -        render_texture(bottom, canvas);
    +        render_texture(bottom, canvas, view_matrix, projection_matrix);
    +    else if (bottom)
    +        render_contour(view_matrix, projection_matrix);
     }
     
    -void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) const
    +void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix)
     {
    -    GLTexture* texture = const_cast(&m_texture);
    -    GLTexture* temp_texture = const_cast(&m_temp_texture);
    -
         if (m_texture_filename.empty()) {
    -        texture->reset();
    -        render_default(bottom, false);
    +        m_texture.reset();
    +        render_default(bottom, false, true, view_matrix, projection_matrix);
             return;
         }
     
    -    if (texture->get_id() == 0 || texture->get_source() != m_texture_filename) {
    -        texture->reset();
    +    if (m_texture.get_id() == 0 || m_texture.get_source() != m_texture_filename) {
    +        m_texture.reset();
     
             if (boost::algorithm::iends_with(m_texture_filename, ".svg")) {
                 // use higher resolution images if graphic card and opengl version allow
                 GLint max_tex_size = OpenGLManager::get_gl_info().get_max_tex_size();
    -            if (temp_texture->get_id() == 0 || temp_texture->get_source() != m_texture_filename) {
    +            if (m_temp_texture.get_id() == 0 || m_temp_texture.get_source() != m_texture_filename) {
                     // generate a temporary lower resolution texture to show while no main texture levels have been compressed
    -                if (!temp_texture->load_from_svg_file(m_texture_filename, false, false, false, max_tex_size / 8)) {
    -                    render_default(bottom, false);
    +                if (!m_temp_texture.load_from_svg_file(m_texture_filename, false, false, false, max_tex_size / 8)) {
    +                    render_default(bottom, false, true, view_matrix, projection_matrix);
                         return;
                     }
                     canvas.request_extra_frame();
                 }
     
                 // starts generating the main texture, compression will run asynchronously
    -            if (!texture->load_from_svg_file(m_texture_filename, true, true, true, max_tex_size)) {
    -                render_default(bottom, false);
    +            if (!m_texture.load_from_svg_file(m_texture_filename, true, true, true, max_tex_size)) {
    +                render_default(bottom, false, true, view_matrix, projection_matrix);
                     return;
                 }
             } 
             else if (boost::algorithm::iends_with(m_texture_filename, ".png")) {
                 // generate a temporary lower resolution texture to show while no main texture levels have been compressed
    -            if (temp_texture->get_id() == 0 || temp_texture->get_source() != m_texture_filename) {
    -                if (!temp_texture->load_from_file(m_texture_filename, false, GLTexture::None, false)) {
    -                    render_default(bottom, false);
    +            if (m_temp_texture.get_id() == 0 || m_temp_texture.get_source() != m_texture_filename) {
    +                if (!m_temp_texture.load_from_file(m_texture_filename, false, GLTexture::None, false)) {
    +                    render_default(bottom, false, true, view_matrix, projection_matrix);
                         return;
                     }
                     canvas.request_extra_frame();
                 }
     
                 // starts generating the main texture, compression will run asynchronously
    -            if (!texture->load_from_file(m_texture_filename, true, GLTexture::MultiThreaded, true)) {
    -                render_default(bottom, false);
    +            if (!m_texture.load_from_file(m_texture_filename, true, GLTexture::MultiThreaded, true)) {
    +                render_default(bottom, false, true, view_matrix, projection_matrix);
                     return;
                 }
             }
             else {
    -            render_default(bottom, false);
    +            render_default(bottom, false, true, view_matrix, projection_matrix);
                 return;
             }
         }
    -    else if (texture->unsent_compressed_data_available()) {
    +    else if (m_texture.unsent_compressed_data_available()) {
             // sends to gpu the already available compressed levels of the main texture
    -        texture->send_compressed_data_to_gpu();
    +        m_texture.send_compressed_data_to_gpu();
     
             // the temporary texture is not needed anymore, reset it
    -        if (temp_texture->get_id() != 0)
    -            temp_texture->reset();
    +        if (m_temp_texture.get_id() != 0)
    +            m_temp_texture.reset();
     
             canvas.request_extra_frame();
         }
     
    -    if (m_triangles.get_vertices_count() > 0) {
    -        GLShaderProgram* shader = wxGetApp().get_shader("printbed");
    -        if (shader != nullptr) {
    -            shader->start_using();
    -            shader->set_uniform("transparent_background", bottom);
    -            shader->set_uniform("svg_source", boost::algorithm::iends_with(m_texture.get_source(), ".svg"));
    -
    -            unsigned int* vbo_id = const_cast(&m_vbo_id);
    -
    -            if (*vbo_id == 0) {
    -                glsafe(::glGenBuffers(1, vbo_id));
    -                glsafe(::glBindBuffer(GL_ARRAY_BUFFER, *vbo_id));
    -                glsafe(::glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)m_triangles.get_vertices_data_size(), (const GLvoid*)m_triangles.get_vertices_data(), GL_STATIC_DRAW));
    -                glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0));
    -            }
    -
    -            glsafe(::glEnable(GL_DEPTH_TEST));
    -            if (bottom)
    -                glsafe(::glDepthMask(GL_FALSE));
    -
    -            glsafe(::glEnable(GL_BLEND));
    -            glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
    -
    -            if (bottom)
    -                glsafe(::glFrontFace(GL_CW));
    -
    -            unsigned int stride = m_triangles.get_vertex_data_size();
    +    init_triangles();
     
    -            GLint position_id = shader->get_attrib_location("v_position");
    -            GLint tex_coords_id = shader->get_attrib_location("v_tex_coords");
    +    GLShaderProgram* shader = wxGetApp().get_shader("printbed");
    +    if (shader != nullptr) {
    +        shader->start_using();
    +        shader->set_uniform("view_model_matrix", view_matrix);
    +        shader->set_uniform("projection_matrix", projection_matrix);
    +        shader->set_uniform("transparent_background", bottom);
    +        shader->set_uniform("svg_source", boost::algorithm::iends_with(m_texture.get_source(), ".svg"));
     
    -            // show the temporary texture while no compressed data is available
    -            GLuint tex_id = (GLuint)temp_texture->get_id();
    -            if (tex_id == 0)
    -                tex_id = (GLuint)texture->get_id();
    -
    -            glsafe(::glBindTexture(GL_TEXTURE_2D, tex_id));
    -            glsafe(::glBindBuffer(GL_ARRAY_BUFFER, *vbo_id));
    -
    -            if (position_id != -1) {
    -                glsafe(::glEnableVertexAttribArray(position_id));
    -                glsafe(::glVertexAttribPointer(position_id, 3, GL_FLOAT, GL_FALSE, stride, (GLvoid*)(intptr_t)m_triangles.get_position_offset()));
    -            }
    -            if (tex_coords_id != -1) {
    -                glsafe(::glEnableVertexAttribArray(tex_coords_id));
    -                glsafe(::glVertexAttribPointer(tex_coords_id, 2, GL_FLOAT, GL_FALSE, stride, (GLvoid*)(intptr_t)m_triangles.get_tex_coords_offset()));
    -            }
    +        glsafe(::glEnable(GL_DEPTH_TEST));
    +        if (bottom)
    +            glsafe(::glDepthMask(GL_FALSE));
     
    -            glsafe(::glDrawArrays(GL_TRIANGLES, 0, (GLsizei)m_triangles.get_vertices_count()));
    +        glsafe(::glEnable(GL_BLEND));
    +        glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
     
    -            if (tex_coords_id != -1)
    -                glsafe(::glDisableVertexAttribArray(tex_coords_id));
    +        if (bottom)
    +            glsafe(::glFrontFace(GL_CW));
     
    -            if (position_id != -1)
    -                glsafe(::glDisableVertexAttribArray(position_id));
    +        // show the temporary texture while no compressed data is available
    +        GLuint tex_id = (GLuint)m_temp_texture.get_id();
    +        if (tex_id == 0)
    +            tex_id = (GLuint)m_texture.get_id();
     
    -            glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0));
    -            glsafe(::glBindTexture(GL_TEXTURE_2D, 0));
    +        glsafe(::glBindTexture(GL_TEXTURE_2D, tex_id));
    +        m_triangles.render();
    +        glsafe(::glBindTexture(GL_TEXTURE_2D, 0));
     
    -            if (bottom)
    -                glsafe(::glFrontFace(GL_CCW));
    +        if (bottom)
    +            glsafe(::glFrontFace(GL_CCW));
     
    -            glsafe(::glDisable(GL_BLEND));
    -            if (bottom)
    -                glsafe(::glDepthMask(GL_TRUE));
    +        glsafe(::glDisable(GL_BLEND));
    +        if (bottom)
    +            glsafe(::glDepthMask(GL_TRUE));
     
    -            shader->stop_using();
    -        }
    +        shader->stop_using();
         }
     }
     
    -void Bed3D::render_model() const
    +void Bed3D::render_model(const Transform3d& view_matrix, const Transform3d& projection_matrix)
     {
         if (m_model_filename.empty())
             return;
     
    -    GLModel* model = const_cast(&m_model);
    -
    -    if (model->get_filename() != m_model_filename && model->init_from_file(m_model_filename)) {
    -        model->set_color(-1, DEFAULT_MODEL_COLOR);
    +    if (m_model.model.get_filename() != m_model_filename && m_model.model.init_from_file(m_model_filename)) {
    +        m_model.model.set_color(DEFAULT_MODEL_COLOR);
     
             // move the model so that its origin (0.0, 0.0, 0.0) goes into the bed shape center and a bit down to avoid z-fighting with the texture quad
    -        *const_cast(&m_model_offset) = to_3d(m_build_volume.bounding_volume2d().center(), -0.03);
    +        m_model_offset = to_3d(m_build_volume.bounding_volume2d().center(), -0.03);
    +
    +        // register for picking
    +        register_raycasters_for_picking(m_model.model.get_geometry(), Geometry::translation_transform(m_model_offset));
     
             // update extended bounding box
    -        const_cast(m_extended_bounding_box) = this->calc_extended_bounding_box();
    +        m_extended_bounding_box = this->calc_extended_bounding_box();
         }
     
    -    if (!model->get_filename().empty()) {
    +    if (!m_model.model.get_filename().empty()) {
             GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light");
             if (shader != nullptr) {
                 shader->start_using();
                 shader->set_uniform("emission_factor", 0.0f);
    -            glsafe(::glPushMatrix());
    -            glsafe(::glTranslated(m_model_offset.x(), m_model_offset.y(), m_model_offset.z()));
    -            model->render();
    -            glsafe(::glPopMatrix());
    +            const Transform3d model_matrix = Geometry::translation_transform(m_model_offset);
    +            shader->set_uniform("view_model_matrix", view_matrix * model_matrix);
    +            shader->set_uniform("projection_matrix", projection_matrix);
    +            const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose();
    +            shader->set_uniform("view_normal_matrix", view_normal_matrix);
    +            m_model.model.render();
                 shader->stop_using();
             }
         }
     }
     
    -void Bed3D::render_custom(GLCanvas3D& canvas, bool bottom, bool show_texture, bool picking) const
    +void Bed3D::render_custom(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_texture, bool picking)
     {
         if (m_texture_filename.empty() && m_model_filename.empty()) {
    -        render_default(bottom, picking);
    +        render_default(bottom, picking, show_texture, view_matrix, projection_matrix);
             return;
         }
     
         if (!bottom)
    -        render_model();
    +        render_model(view_matrix, projection_matrix);
     
         if (show_texture)
    -        render_texture(bottom, canvas);
    +        render_texture(bottom, canvas, view_matrix, projection_matrix);
    +    else if (bottom)
    +        render_contour(view_matrix, projection_matrix);
     }
     
    -void Bed3D::render_default(bool bottom, bool picking) const
    +void Bed3D::render_default(bool bottom, bool picking, bool show_texture, const Transform3d& view_matrix, const Transform3d& projection_matrix)
     {
    -    const_cast(&m_texture)->reset();
    +    m_texture.reset();
    +
    +    init_gridlines();
    +    init_triangles();
     
    -    unsigned int triangles_vcount = m_triangles.get_vertices_count();
    -    if (triangles_vcount > 0) {
    -        bool has_model = !m_model.get_filename().empty();
    +    GLShaderProgram* shader = wxGetApp().get_shader("flat");
    +    if (shader != nullptr) {
    +        shader->start_using();
    +
    +        shader->set_uniform("view_model_matrix", view_matrix);
    +        shader->set_uniform("projection_matrix", projection_matrix);
     
             glsafe(::glEnable(GL_DEPTH_TEST));
             glsafe(::glEnable(GL_BLEND));
             glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
     
    -        glsafe(::glEnableClientState(GL_VERTEX_ARRAY));
    -
    +        const bool has_model = !m_model.model.get_filename().empty();
             if (!has_model && !bottom) {
                 // draw background
                 glsafe(::glDepthMask(GL_FALSE));
    -            glsafe(::glColor4fv(picking ? PICKING_MODEL_COLOR.data() : DEFAULT_MODEL_COLOR.data()));
    -            glsafe(::glNormal3d(0.0f, 0.0f, 1.0f));
    -            glsafe(::glVertexPointer(3, GL_FLOAT, m_triangles.get_vertex_data_size(), (GLvoid*)m_triangles.get_vertices_data()));
    -            glsafe(::glDrawArrays(GL_TRIANGLES, 0, (GLsizei)triangles_vcount));
    +            m_triangles.render();
                 glsafe(::glDepthMask(GL_TRUE));
             }
     
    -        if (!picking) {
    +        if (show_texture) {
                 // draw grid
    -            glsafe(::glLineWidth(1.5f * m_scale_factor));
    -            if (has_model && !bottom)
    -                glsafe(::glColor4f(0.9f, 0.9f, 0.9f, 1.0f));
    -            else
    -                glsafe(::glColor4f(0.9f, 0.9f, 0.9f, 0.6f));
    -            glsafe(::glVertexPointer(3, GL_FLOAT, m_triangles.get_vertex_data_size(), (GLvoid*)m_gridlines.get_vertices_data()));
    -            glsafe(::glDrawArrays(GL_LINES, 0, (GLsizei)m_gridlines.get_vertices_count()));
    +#if ENABLE_GL_CORE_PROFILE
    +            if (!OpenGLManager::get_gl_info().is_core_profile())
    +#endif // ENABLE_GL_CORE_PROFILE
    +                glsafe(::glLineWidth(1.5f * m_scale_factor));
    +            m_gridlines.set_color(has_model && !bottom ? DEFAULT_SOLID_GRID_COLOR : DEFAULT_TRANSPARENT_GRID_COLOR);
    +            m_gridlines.render();
             }
    +        else
    +            render_contour(view_matrix, projection_matrix);
    +
    +        glsafe(::glDisable(GL_BLEND));
    +
    +        shader->stop_using();
    +    }
    +}
    +
    +void Bed3D::render_contour(const Transform3d& view_matrix, const Transform3d& projection_matrix)
    +{
    +    init_contourlines();
    +
    +    GLShaderProgram* shader = wxGetApp().get_shader("flat");
    +    if (shader != nullptr) {
    +        shader->start_using();
    +        shader->set_uniform("view_model_matrix", view_matrix);
    +        shader->set_uniform("projection_matrix", projection_matrix);
    +
    +        glsafe(::glEnable(GL_DEPTH_TEST));
    +        glsafe(::glEnable(GL_BLEND));
    +        glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
     
    -        glsafe(::glDisableClientState(GL_VERTEX_ARRAY));
    +        // draw contour
    +#if ENABLE_GL_CORE_PROFILE
    +        if (!OpenGLManager::get_gl_info().is_core_profile())
    +#endif // ENABLE_GL_CORE_PROFILE
    +            glsafe(::glLineWidth(1.5f * m_scale_factor));
    +        m_contourlines.render();
     
             glsafe(::glDisable(GL_BLEND));
    +
    +        shader->stop_using();
         }
     }
     
    -void Bed3D::release_VBOs()
    +void Bed3D::register_raycasters_for_picking(const GLModel::Geometry& geometry, const Transform3d& trafo)
     {
    -    if (m_vbo_id > 0) {
    -        glsafe(::glDeleteBuffers(1, &m_vbo_id));
    -        m_vbo_id = 0;
    +    assert(m_model.mesh_raycaster == nullptr);
    +
    +    indexed_triangle_set its;
    +    its.vertices.reserve(geometry.vertices_count());
    +    for (size_t i = 0; i < geometry.vertices_count(); ++i) {
    +        its.vertices.emplace_back(geometry.extract_position_3(i));
         }
    +    its.indices.reserve(geometry.indices_count() / 3);
    +    for (size_t i = 0; i < geometry.indices_count() / 3; ++i) {
    +        const size_t tri_id = i * 3;
    +        its.indices.emplace_back(geometry.extract_index(tri_id), geometry.extract_index(tri_id + 1), geometry.extract_index(tri_id + 2));
    +    }
    +
    +    m_model.mesh_raycaster = std::make_unique(std::make_shared(std::move(its)));
    +    wxGetApp().plater()->canvas3D()->add_raycaster_for_picking(SceneRaycaster::EType::Bed, 0, *m_model.mesh_raycaster, trafo);
     }
     
     } // GUI
    diff --git a/src/slic3r/GUI/3DBed.hpp b/src/slic3r/GUI/3DBed.hpp
    index 639dc6c1633..cf20b6a29b1 100644
    --- a/src/slic3r/GUI/3DBed.hpp
    +++ b/src/slic3r/GUI/3DBed.hpp
    @@ -3,9 +3,11 @@
     
     #include "GLTexture.hpp"
     #include "3DScene.hpp"
    -#include "GLModel.hpp"
    +#include "CoordAxes.hpp"
    +#include "MeshUtils.hpp"
     
    -#include 
    +#include "libslic3r/BuildVolume.hpp"
    +#include "libslic3r/ExPolygon.hpp"
     
     #include 
     #include 
    @@ -15,54 +17,8 @@ namespace GUI {
     
     class GLCanvas3D;
     
    -class GeometryBuffer
    -{
    -    struct Vertex
    -    {
    -        Vec3f position{ Vec3f::Zero() };
    -        Vec2f tex_coords{ Vec2f::Zero() };
    -    };
    -
    -    std::vector m_vertices;
    -
    -public:
    -    bool set_from_triangles(const std::vector &triangles, float z);
    -    bool set_from_lines(const Lines& lines, float z);
    -
    -    const float* get_vertices_data() const;
    -    unsigned int get_vertices_data_size() const { return (unsigned int)m_vertices.size() * get_vertex_data_size(); }
    -    unsigned int get_vertex_data_size() const { return (unsigned int)(5 * sizeof(float)); }
    -    size_t get_position_offset() const { return 0; }
    -    size_t get_tex_coords_offset() const { return (size_t)(3 * sizeof(float)); }
    -    unsigned int get_vertices_count() const { return (unsigned int)m_vertices.size(); }
    -};
    -
     class Bed3D
     {
    -    class Axes
    -    {
    -    public:
    -        static const float DefaultStemRadius;
    -        static const float DefaultStemLength;
    -        static const float DefaultTipRadius;
    -        static const float DefaultTipLength;
    -
    -    private:
    -        Vec3d m_origin{ Vec3d::Zero() };
    -        float m_stem_length{ DefaultStemLength };
    -        GLModel m_arrow;
    -
    -    public:
    -        const Vec3d& get_origin() const { return m_origin; }
    -        void set_origin(const Vec3d& origin) { m_origin = origin; }
    -        void set_stem_length(float length) {
    -            m_stem_length = length;
    -            m_arrow.reset();
    -        }
    -        float get_total_length() const { return m_stem_length + DefaultTipLength; }
    -        void render() const;
    -    };
    -
     public:
         enum class Type : unsigned char
         {
    @@ -79,23 +35,25 @@ class Bed3D
         std::string m_model_filename;
         // Print volume bounding box exteded with axes and model.
         BoundingBoxf3 m_extended_bounding_box;
    +    // Print bed polygon
    +    ExPolygon m_contour;
         // Slightly expanded print bed polygon, for collision detection.
         Polygon m_polygon;
    -    GeometryBuffer m_triangles;
    -    GeometryBuffer m_gridlines;
    +    GLModel m_triangles;
    +    GLModel m_gridlines;
    +    GLModel m_contourlines;
         GLTexture m_texture;
         // temporary texture shown until the main texture has still no levels compressed
         GLTexture m_temp_texture;
    -    GLModel m_model;
    +    PickingModel m_model;
         Vec3d m_model_offset{ Vec3d::Zero() };
    -    unsigned int m_vbo_id{ 0 };
    -    Axes m_axes;
    +    CoordAxes m_axes;
     
         float m_scale_factor{ 1.0f };
     
     public:
         Bed3D() = default;
    -    ~Bed3D() { release_VBOs(); }
    +    ~Bed3D() = default;
     
         // Update print bed model from configuration.
         // Return true if the bed shape changed, so the calee will update the UI.
    @@ -119,24 +77,27 @@ class Bed3D
         bool contains(const Point& point) const;
         Point point_projection(const Point& point) const;
     
    -    void render(GLCanvas3D& canvas, bool bottom, float scale_factor, bool show_axes, bool show_texture);
    -    void render_for_picking(GLCanvas3D& canvas, bool bottom, float scale_factor);
    +    void render(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor, bool show_texture);
    +    void render_axes();
    +    void render_for_picking(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor);
     
     private:
         // Calculate an extended bounding box from axes and current model for visualization purposes.
         BoundingBoxf3 calc_extended_bounding_box() const;
    -    void calc_triangles(const ExPolygon& poly);
    -    void calc_gridlines(const ExPolygon& poly, const BoundingBox& bed_bbox);
    +    void init_triangles();
    +    void init_gridlines();
    +    void init_contourlines();
         static std::tuple detect_type(const Pointfs& shape);
    -    void render_internal(GLCanvas3D& canvas, bool bottom, float scale_factor,
    -        bool show_axes, bool show_texture, bool picking);
    -    void render_axes() const;
    -    void render_system(GLCanvas3D& canvas, bool bottom, bool show_texture) const;
    -    void render_texture(bool bottom, GLCanvas3D& canvas) const;
    -    void render_model() const;
    -    void render_custom(GLCanvas3D& canvas, bool bottom, bool show_texture, bool picking) const;
    -    void render_default(bool bottom, bool picking) const;
    -    void release_VBOs();
    +    void render_internal(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor,
    +        bool show_texture, bool picking);
    +    void render_system(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_texture);
    +    void render_texture(bool bottom, GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix);
    +    void render_model(const Transform3d& view_matrix, const Transform3d& projection_matrix);
    +    void render_custom(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_texture, bool picking);
    +    void render_default(bool bottom, bool picking, bool show_texture, const Transform3d& view_matrix, const Transform3d& projection_matrix);
    +    void render_contour(const Transform3d& view_matrix, const Transform3d& projection_matrix);
    +
    +    void register_raycasters_for_picking(const GLModel::Geometry& geometry, const Transform3d& trafo);
     };
     
     } // GUI
    diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp
    index 263ba0e73ad..97975404ffb 100644
    --- a/src/slic3r/GUI/3DScene.cpp
    +++ b/src/slic3r/GUI/3DScene.cpp
    @@ -1,16 +1,11 @@
     #include 
     
    -#if ENABLE_SMOOTH_NORMALS
    -#include 
    -#include 
    -#include 
    -#endif // ENABLE_SMOOTH_NORMALS
    -
     #include "3DScene.hpp"
     #include "GLShader.hpp"
     #include "GUI_App.hpp"
     #include "Plater.hpp"
     #include "BitmapCache.hpp"
    +#include "Camera.hpp"
     
     #include "libslic3r/BuildVolume.hpp"
     #include "libslic3r/ExtrusionEntity.hpp"
    @@ -69,300 +64,157 @@ void glAssertRecentCallImpl(const char* file_name, unsigned int line, const char
     
     namespace Slic3r {
     
    -#if ENABLE_SMOOTH_NORMALS
    -static void smooth_normals_corner(TriangleMesh& mesh, std::vector& normals)
    -{
    -    using MapMatrixXfUnaligned = Eigen::Map>;
    -    using MapMatrixXiUnaligned = Eigen::Map>;
    -
    -    std::vector face_normals = its_face_normals(mesh.its);
    -
    -    Eigen::MatrixXd vertices = MapMatrixXfUnaligned(mesh.its.vertices.front().data(),
    -        Eigen::Index(mesh.its.vertices.size()), 3).cast();
    -    Eigen::MatrixXi indices = MapMatrixXiUnaligned(mesh.its.indices.front().data(),
    -        Eigen::Index(mesh.its.indices.size()), 3);
    -    Eigen::MatrixXd in_normals = MapMatrixXfUnaligned(face_normals.front().data(),
    -        Eigen::Index(face_normals.size()), 3).cast();
    -    Eigen::MatrixXd out_normals;
    -
    -    igl::per_corner_normals(vertices, indices, in_normals, 1.0, out_normals);
    -
    -    normals = std::vector(mesh.its.vertices.size());
    -    for (size_t i = 0; i < mesh.its.indices.size(); ++i) {
    -        for (size_t j = 0; j < 3; ++j) {
    -            normals[mesh.its.indices[i][j]] = out_normals.row(i * 3 + j).cast();
    -        }
    -    }
    -}
    -
    -static void smooth_normals_vertex(TriangleMesh& mesh, std::vector& normals)
    -{
    -    using MapMatrixXfUnaligned = Eigen::Map>;
    -    using MapMatrixXiUnaligned = Eigen::Map>;
    -
    -    Eigen::MatrixXd vertices = MapMatrixXfUnaligned(mesh.its.vertices.front().data(),
    -        Eigen::Index(mesh.its.vertices.size()), 3).cast();
    -    Eigen::MatrixXi indices = MapMatrixXiUnaligned(mesh.its.indices.front().data(),
    -        Eigen::Index(mesh.its.indices.size()), 3);
    -    Eigen::MatrixXd out_normals;
    -
    -//    igl::per_vertex_normals(vertices, indices, igl::PER_VERTEX_NORMALS_WEIGHTING_TYPE_UNIFORM, out_normals);
    -//    igl::per_vertex_normals(vertices, indices, igl::PER_VERTEX_NORMALS_WEIGHTING_TYPE_AREA, out_normals);
    -    igl::per_vertex_normals(vertices, indices, igl::PER_VERTEX_NORMALS_WEIGHTING_TYPE_ANGLE, out_normals);
    -//    igl::per_vertex_normals(vertices, indices, igl::PER_VERTEX_NORMALS_WEIGHTING_TYPE_DEFAULT, out_normals);
    -
    -    normals = std::vector(mesh.its.vertices.size());
    -    for (size_t i = 0; i < static_cast(out_normals.rows()); ++i) {
    -        normals[i] = out_normals.row(i).cast();
    -    }
    -}
    -#endif // ENABLE_SMOOTH_NORMALS
    -
    -#if ENABLE_SMOOTH_NORMALS
    -void GLIndexedVertexArray::load_mesh_full_shading(const TriangleMesh& mesh, bool smooth_normals)
    -#else
    -void GLIndexedVertexArray::load_mesh_full_shading(const TriangleMesh& mesh)
    -#endif // ENABLE_SMOOTH_NORMALS
    -{
    -    assert(triangle_indices.empty() && vertices_and_normals_interleaved_size == 0);
    -    assert(quad_indices.empty() && triangle_indices_size == 0);
    -    assert(vertices_and_normals_interleaved.size() % 6 == 0 && quad_indices_size == vertices_and_normals_interleaved.size());
    -
    -#if ENABLE_SMOOTH_NORMALS
    -    if (smooth_normals) {
    -        TriangleMesh new_mesh(mesh);
    -        std::vector normals;
    -        smooth_normals_corner(new_mesh, normals);
    -//        smooth_normals_vertex(new_mesh, normals);
    -
    -        this->vertices_and_normals_interleaved.reserve(this->vertices_and_normals_interleaved.size() + 3 * 2 * new_mesh.its.vertices.size());
    -        for (size_t i = 0; i < new_mesh.its.vertices.size(); ++i) {
    -            const stl_vertex& v = new_mesh.its.vertices[i];
    -            const stl_normal& n = normals[i];
    -            this->push_geometry(v(0), v(1), v(2), n(0), n(1), n(2));
    -        }
    -
    -        for (size_t i = 0; i < new_mesh.its.indices.size(); ++i) {
    -            const stl_triangle_vertex_indices& idx = new_mesh.its.indices[i];
    -            this->push_triangle(idx(0), idx(1), idx(2));
    -        }
    -    }
    -    else {
    -#endif // ENABLE_SMOOTH_NORMALS
    -        this->load_its_flat_shading(mesh.its);
    -#if ENABLE_SMOOTH_NORMALS
    -    }
    -#endif // ENABLE_SMOOTH_NORMALS
    -}
    +const float GLVolume::SinkingContours::HalfWidth = 0.25f;
     
    -void GLIndexedVertexArray::load_its_flat_shading(const indexed_triangle_set &its)
    +void GLVolume::SinkingContours::render()
     {
    -    this->vertices_and_normals_interleaved.reserve(this->vertices_and_normals_interleaved.size() + 3 * 3 * 2 * its.indices.size());
    -    unsigned int vertices_count = 0;
    -    for (int i = 0; i < int(its.indices.size()); ++ i) {
    -        stl_triangle_vertex_indices face        = its.indices[i];
    -        stl_vertex                  vertex[3]   = { its.vertices[face[0]], its.vertices[face[1]], its.vertices[face[2]] };
    -        stl_vertex                  n           = face_normal_normalized(vertex);
    -        for (int j = 0; j < 3; ++j)
    -            this->push_geometry(vertex[j](0), vertex[j](1), vertex[j](2), n(0), n(1), n(2));
    -        this->push_triangle(vertices_count, vertices_count + 1, vertices_count + 2);
    -        vertices_count += 3;
    -    }
    -}
    +    update();
     
    -void GLIndexedVertexArray::finalize_geometry(bool opengl_initialized)
    -{
    -    assert(this->vertices_and_normals_interleaved_VBO_id == 0);
    -    assert(this->triangle_indices_VBO_id == 0);
    -    assert(this->quad_indices_VBO_id == 0);
    -
    -	if (! opengl_initialized) {
    -		// Shrink the data vectors to conserve memory in case the data cannot be transfered to the OpenGL driver yet.
    -		this->shrink_to_fit();
    -		return;
    -	}
    -
    -    if (! this->vertices_and_normals_interleaved.empty()) {
    -        glsafe(::glGenBuffers(1, &this->vertices_and_normals_interleaved_VBO_id));
    -        glsafe(::glBindBuffer(GL_ARRAY_BUFFER, this->vertices_and_normals_interleaved_VBO_id));
    -        glsafe(::glBufferData(GL_ARRAY_BUFFER, this->vertices_and_normals_interleaved.size() * 4, this->vertices_and_normals_interleaved.data(), GL_STATIC_DRAW));
    -        glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0));
    -        this->vertices_and_normals_interleaved.clear();
    -    }
    -    if (! this->triangle_indices.empty()) {
    -        glsafe(::glGenBuffers(1, &this->triangle_indices_VBO_id));
    -        glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->triangle_indices_VBO_id));
    -        glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, this->triangle_indices.size() * 4, this->triangle_indices.data(), GL_STATIC_DRAW));
    -        glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
    -        this->triangle_indices.clear();
    -    }
    -    if (! this->quad_indices.empty()) {
    -        glsafe(::glGenBuffers(1, &this->quad_indices_VBO_id));
    -        glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->quad_indices_VBO_id));
    -        glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, this->quad_indices.size() * 4, this->quad_indices.data(), GL_STATIC_DRAW));
    -        glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
    -        this->quad_indices.clear();
    -    }
    -}
    +    GLShaderProgram* shader = GUI::wxGetApp().get_current_shader();
    +    if (shader == nullptr)
    +        return;
     
    -void GLIndexedVertexArray::release_geometry()
    -{
    -    if (this->vertices_and_normals_interleaved_VBO_id) {
    -        glsafe(::glDeleteBuffers(1, &this->vertices_and_normals_interleaved_VBO_id));
    -        this->vertices_and_normals_interleaved_VBO_id = 0;
    -    }
    -    if (this->triangle_indices_VBO_id) {
    -        glsafe(::glDeleteBuffers(1, &this->triangle_indices_VBO_id));
    -        this->triangle_indices_VBO_id = 0;
    -    }
    -    if (this->quad_indices_VBO_id) {
    -        glsafe(::glDeleteBuffers(1, &this->quad_indices_VBO_id));
    -        this->quad_indices_VBO_id = 0;
    -    }
    -    this->clear();
    +    const GUI::Camera& camera = GUI::wxGetApp().plater()->get_camera();
    +    shader->set_uniform("view_model_matrix", camera.get_view_matrix() * Geometry::translation_transform(m_shift));
    +    shader->set_uniform("projection_matrix", camera.get_projection_matrix());
    +    m_model.render();
     }
     
    -void GLIndexedVertexArray::render() const
    +void GLVolume::SinkingContours::update()
     {
    -    assert(this->vertices_and_normals_interleaved_VBO_id != 0);
    -    assert(this->triangle_indices_VBO_id != 0 || this->quad_indices_VBO_id != 0);
    -
    -    glsafe(::glBindBuffer(GL_ARRAY_BUFFER, this->vertices_and_normals_interleaved_VBO_id));
    -    glsafe(::glVertexPointer(3, GL_FLOAT, 6 * sizeof(float), (const void*)(3 * sizeof(float))));
    -    glsafe(::glNormalPointer(GL_FLOAT, 6 * sizeof(float), nullptr));
    -
    -    glsafe(::glEnableClientState(GL_VERTEX_ARRAY));
    -    glsafe(::glEnableClientState(GL_NORMAL_ARRAY));
    +    const int object_idx = m_parent.object_idx();
    +    const Model& model = GUI::wxGetApp().plater()->model();
     
    -    // Render using the Vertex Buffer Objects.
    -    if (this->triangle_indices_size > 0) {
    -        glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->triangle_indices_VBO_id));
    -        glsafe(::glDrawElements(GL_TRIANGLES, GLsizei(this->triangle_indices_size), GL_UNSIGNED_INT, nullptr));
    -        glsafe(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
    -    }
    -    if (this->quad_indices_size > 0) {
    -        glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->quad_indices_VBO_id));
    -        glsafe(::glDrawElements(GL_QUADS, GLsizei(this->quad_indices_size), GL_UNSIGNED_INT, nullptr));
    -        glsafe(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
    +    if (object_idx < 0 ||
    +        object_idx >= int(model.objects.size()) ||
    +        !m_parent.is_sinking() ||
    +        m_parent.is_below_printbed()){
    +        m_model.reset();
    +        return;    
         }
     
    -    glsafe(::glDisableClientState(GL_VERTEX_ARRAY));
    -    glsafe(::glDisableClientState(GL_NORMAL_ARRAY));
    -
    -    glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0));
    -}
    -
    -void GLIndexedVertexArray::render(
    -    const std::pair& tverts_range,
    -    const std::pair& qverts_range) const
    -{
    -    // this method has been called before calling finalize() ?
    -    if (this->vertices_and_normals_interleaved_VBO_id == 0 && !this->vertices_and_normals_interleaved.empty())
    +    const BoundingBoxf3& box = m_parent.transformed_convex_hull_bounding_box();
    +    if (m_old_box.size().isApprox(box.size()) &&
    +        m_old_box.min.z() == box.min.z()){
    +        // Fix it !!! It is not working all the time
    +        m_shift = box.center() - m_old_box.center();
             return;
    -
    -    assert(this->vertices_and_normals_interleaved_VBO_id != 0);
    -    assert(this->triangle_indices_VBO_id != 0 || this->quad_indices_VBO_id != 0);
    -
    -    // Render using the Vertex Buffer Objects.
    -    glsafe(::glBindBuffer(GL_ARRAY_BUFFER, this->vertices_and_normals_interleaved_VBO_id));
    -    glsafe(::glVertexPointer(3, GL_FLOAT, 6 * sizeof(float), (const void*)(3 * sizeof(float))));
    -    glsafe(::glNormalPointer(GL_FLOAT, 6 * sizeof(float), nullptr));
    -
    -    glsafe(::glEnableClientState(GL_VERTEX_ARRAY));
    -    glsafe(::glEnableClientState(GL_NORMAL_ARRAY));
    -
    -    if (this->triangle_indices_size > 0) {
    -        glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->triangle_indices_VBO_id));
    -        glsafe(::glDrawElements(GL_TRIANGLES, GLsizei(std::min(this->triangle_indices_size, tverts_range.second - tverts_range.first)), GL_UNSIGNED_INT, (const void*)(tverts_range.first * 4)));
    -        glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
    -    }
    -    if (this->quad_indices_size > 0) {
    -        glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->quad_indices_VBO_id));
    -        glsafe(::glDrawElements(GL_QUADS, GLsizei(std::min(this->quad_indices_size, qverts_range.second - qverts_range.first)), GL_UNSIGNED_INT, (const void*)(qverts_range.first * 4)));
    -        glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
    +    }    
    +    
    +    m_old_box = box;
    +    m_shift = Vec3d::Zero();
    +
    +    const TriangleMesh& mesh = model.objects[object_idx]->volumes[m_parent.volume_idx()]->mesh();
    +
    +    m_model.reset();
    +    GUI::GLModel::Geometry init_data;
    +    init_data.format = { GUI::GLModel::Geometry::EPrimitiveType::Triangles, GUI::GLModel::Geometry::EVertexLayout::P3 };
    +    init_data.color = ColorRGBA::WHITE();
    +    unsigned int vertices_counter = 0;
    +    MeshSlicingParams slicing_params;
    +    slicing_params.trafo = m_parent.world_matrix();
    +    const Polygons polygons = union_(slice_mesh(mesh.its, 0.0f, slicing_params));
    +    if (polygons.empty()) return;
    +
    +    for (const ExPolygon& expoly : diff_ex(expand(polygons, float(scale_(HalfWidth))), shrink(polygons, float(scale_(HalfWidth))))) {
    +        const std::vector triangulation = triangulate_expolygon_3d(expoly);
    +        init_data.reserve_vertices(init_data.vertices_count() + triangulation.size());
    +        init_data.reserve_indices(init_data.indices_count() + triangulation.size());
    +        for (const Vec3d& v : triangulation) {
    +            init_data.add_vertex((Vec3f)(v.cast() + 0.015f * Vec3f::UnitZ())); // add a small positive z to avoid z-fighting
    +            ++vertices_counter;
    +            if (vertices_counter % 3 == 0)
    +                init_data.add_triangle(vertices_counter - 3, vertices_counter - 2, vertices_counter - 1);
    +        }
         }
     
    -    glsafe(::glDisableClientState(GL_VERTEX_ARRAY));
    -    glsafe(::glDisableClientState(GL_NORMAL_ARRAY));
    -    
    -    glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0));
    +    if (init_data.vertices_count() > 0)
    +      m_model.init_from(std::move(init_data));
     }
     
    -const float GLVolume::SinkingContours::HalfWidth = 0.25f;
    -
    -void GLVolume::SinkingContours::render()
    +void GLVolume::NonManifoldEdges::render()
     {
         update();
     
    -    glsafe(::glPushMatrix());
    -    glsafe(::glTranslated(m_shift.x(), m_shift.y(), m_shift.z()));
    +#if ENABLE_GL_CORE_PROFILE
    +    if (!GUI::OpenGLManager::get_gl_info().is_core_profile())
    +#endif // ENABLE_GL_CORE_PROFILE
    +        glsafe(::glLineWidth(2.0f));
    +
    +    GLShaderProgram* shader = GUI::wxGetApp().get_current_shader();
    +    if (shader == nullptr)
    +        return;
    +
    +    const GUI::Camera& camera = GUI::wxGetApp().plater()->get_camera();
    +    shader->set_uniform("view_model_matrix", camera.get_view_matrix() * m_parent.world_matrix());
    +    shader->set_uniform("projection_matrix", camera.get_projection_matrix());
    +#if ENABLE_GL_CORE_PROFILE
    +    const std::array& viewport = camera.get_viewport();
    +    shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3])));
    +    shader->set_uniform("width", 0.5f);
    +    shader->set_uniform("gap_size", 0.0f);
    +#endif // ENABLE_GL_CORE_PROFILE
    +    m_model.set_color(complementary(m_parent.render_color));
         m_model.render();
    -    glsafe(::glPopMatrix());
     }
     
    -void GLVolume::SinkingContours::update()
    +void GLVolume::NonManifoldEdges::update()
     {
    -    int object_idx = m_parent.object_idx();
    -    Model& model = GUI::wxGetApp().plater()->model();
    -
    -    if (0 <= object_idx && object_idx < (int)model.objects.size() && m_parent.is_sinking() && !m_parent.is_below_printbed()) {
    -        const BoundingBoxf3& box = m_parent.transformed_convex_hull_bounding_box();
    -        if (!m_old_box.size().isApprox(box.size()) || m_old_box.min.z() != box.min.z()) {
    -            m_old_box = box;
    -            m_shift = Vec3d::Zero();
    -
    -            const TriangleMesh& mesh = model.objects[object_idx]->volumes[m_parent.volume_idx()]->mesh();
    -
    -            m_model.reset();
    -            GUI::GLModel::InitializationData init_data;
    -            MeshSlicingParams slicing_params;
    -            slicing_params.trafo = m_parent.world_matrix();
    -            Polygons polygons = union_(slice_mesh(mesh.its, 0.0f, slicing_params));
    -            for (ExPolygon &expoly : diff_ex(expand(polygons, float(scale_(HalfWidth))), shrink(polygons, float(scale_(HalfWidth))))) {
    -                GUI::GLModel::InitializationData::Entity entity;
    -                entity.type = GUI::GLModel::PrimitiveType::Triangles;
    -                const std::vector triangulation = triangulate_expolygon_3d(expoly);
    -                for (const Vec3d& v : triangulation) {
    -                    entity.positions.emplace_back(v.cast() + Vec3f(0.0f, 0.0f, 0.015f)); // add a small positive z to avoid z-fighting
    -                    entity.normals.emplace_back(Vec3f::UnitZ());
    -                    const size_t positions_count = entity.positions.size();
    -                    if (positions_count % 3 == 0) {
    -                        entity.indices.emplace_back(positions_count - 3);
    -                        entity.indices.emplace_back(positions_count - 2);
    -                        entity.indices.emplace_back(positions_count - 1);
    -                    }
    +    if (!m_update_needed)
    +        return;
    +
    +    m_model.reset();
    +    const int object_idx = m_parent.object_idx();
    +    const Model& model = GUI::wxGetApp().plater()->model();
    +    if (0 <= object_idx && object_idx < int(model.objects.size())) {
    +        const ModelObject* model_object = model.objects[object_idx];
    +        const int volume_idx = m_parent.volume_idx();
    +        if (0 <= volume_idx && volume_idx < int(model_object->volumes.size())) {
    +            const ModelVolume* model_volume = model_object->volumes[volume_idx];
    +            const TriangleMesh& mesh = model_volume->mesh();
    +            const std::vector> edges = its_get_open_edges(mesh.its);
    +            if (!edges.empty()) {
    +                GUI::GLModel::Geometry init_data;
    +                init_data.format = { GUI::GLModel::Geometry::EPrimitiveType::Lines, GUI::GLModel::Geometry::EVertexLayout::P3 };
    +                init_data.reserve_vertices(2 * edges.size());
    +                init_data.reserve_indices(2 * edges.size());
    +
    +                // vertices + indices
    +                unsigned int vertices_count = 0;
    +                for (const std::pair& edge : edges) {
    +                    init_data.add_vertex((Vec3f)mesh.its.vertices[edge.first].cast());
    +                    init_data.add_vertex((Vec3f)mesh.its.vertices[edge.second].cast());
    +                    vertices_count += 2;
    +                    init_data.add_line(vertices_count - 2, vertices_count - 1);
                     }
    -                init_data.entities.emplace_back(entity);
    +                m_model.init_from(std::move(init_data));
                 }
    -
    -            m_model.init_from(init_data);
             }
    -        else
    -            m_shift = box.center() - m_old_box.center();
         }
    -    else
    -        m_model.reset();
    +
    +    m_update_needed = false;
     }
     
    -const std::array GLVolume::SELECTED_COLOR = { 0.0f, 1.0f, 0.0f, 1.0f };
    -const std::array GLVolume::HOVER_SELECT_COLOR = { 0.4f, 0.9f, 0.1f, 1.0f };
    -const std::array GLVolume::HOVER_DESELECT_COLOR = { 1.0f, 0.75f, 0.75f, 1.0f };
    -const std::array GLVolume::OUTSIDE_COLOR = { 0.0f, 0.38f, 0.8f, 1.0f };
    -const std::array GLVolume::SELECTED_OUTSIDE_COLOR = { 0.19f, 0.58f, 1.0f, 1.0f };
    -const std::array GLVolume::DISABLED_COLOR = { 0.25f, 0.25f, 0.25f, 1.0f };
    -const std::array GLVolume::SLA_SUPPORT_COLOR = { 0.75f, 0.75f, 0.75f, 1.0f };
    -const std::array GLVolume::SLA_PAD_COLOR = { 0.0f, 0.2f, 0.0f, 1.0f };
    -const std::array GLVolume::NEUTRAL_COLOR = { 0.9f, 0.9f, 0.9f, 1.0f };
    -const std::array, 4> GLVolume::MODEL_COLOR = { {
    -    { 1.0f, 1.0f, 0.0f, 1.f },
    -    { 1.0f, 0.5f, 0.5f, 1.f },
    -    { 0.5f, 1.0f, 0.5f, 1.f },
    -    { 0.5f, 0.5f, 1.0f, 1.f }
    +const ColorRGBA GLVolume::SELECTED_COLOR         = ColorRGBA::GREEN();
    +const ColorRGBA GLVolume::HOVER_SELECT_COLOR     = { 0.4f, 0.9f, 0.1f, 1.0f };
    +const ColorRGBA GLVolume::HOVER_DESELECT_COLOR   = { 1.0f, 0.75f, 0.75f, 1.0f };
    +const ColorRGBA GLVolume::OUTSIDE_COLOR          = { 0.0f, 0.38f, 0.8f, 1.0f };
    +const ColorRGBA GLVolume::SELECTED_OUTSIDE_COLOR = { 0.19f, 0.58f, 1.0f, 1.0f };
    +const ColorRGBA GLVolume::DISABLED_COLOR         = ColorRGBA::DARK_GRAY();
    +const ColorRGBA GLVolume::SLA_SUPPORT_COLOR      = ColorRGBA::LIGHT_GRAY();
    +const ColorRGBA GLVolume::SLA_PAD_COLOR          = { 0.0f, 0.2f, 0.0f, 1.0f };
    +const ColorRGBA GLVolume::NEUTRAL_COLOR          = { 0.9f, 0.9f, 0.9f, 1.0f };
    +const std::array GLVolume::MODEL_COLOR = { {
    +    ColorRGBA::YELLOW(),
    +    { 1.0f, 0.5f, 0.5f, 1.0f },
    +    { 0.5f, 1.0f, 0.5f, 1.0f },
    +    { 0.5f, 0.5f, 1.0f, 1.0f }
     } };
     
     GLVolume::GLVolume(float r, float g, float b, float a)
         : m_sla_shift_z(0.0)
         , m_sinking_contours(*this)
    +    , m_non_manifold_edges(*this)
         // geometry_id == 0 -> invalid
         , geometry_id(std::pair(0, 0))
         , extruder_id(0)
    @@ -377,33 +229,16 @@ GLVolume::GLVolume(float r, float g, float b, float a)
         , is_modifier(false)
         , is_wipe_tower(false)
         , is_extrusion_path(false)
    -    , force_transparent(false)
         , force_native_color(false)
         , force_neutral_color(false)
         , force_sinking_contours(false)
         , tverts_range(0, size_t(-1))
    -    , qverts_range(0, size_t(-1))
     {
         color = { r, g, b, a };
         set_render_color(color);
     }
     
    -void GLVolume::set_color(const std::array& rgba)
    -{
    -    color = rgba;
    -}
    -
    -void GLVolume::set_render_color(float r, float g, float b, float a)
    -{
    -    render_color = { r, g, b, a };
    -}
    -
    -void GLVolume::set_render_color(const std::array& rgba)
    -{
    -    render_color = rgba;
    -}
    -
    -void GLVolume::set_render_color()
    +void GLVolume::set_render_color(bool force_transparent)
     {
         bool outside = is_outside || is_below_printbed();
     
    @@ -432,40 +267,28 @@ void GLVolume::set_render_color()
                 set_render_color(color);
         }
     
    -    if (!printable) {
    -        render_color[0] /= 4;
    -        render_color[1] /= 4;
    -        render_color[2] /= 4;
    -    }
    +    if (!printable)
    +        render_color = saturate(render_color, 0.25f);
     
         if (force_transparent)
    -        render_color[3] = color[3];
    +        render_color.a(color.a());
     }
     
    -std::array color_from_model_volume(const ModelVolume& model_volume)
    +ColorRGBA color_from_model_volume(const ModelVolume& model_volume)
     {
    -    std::array color;
    -    if (model_volume.is_negative_volume()) {
    -        color[0] = 0.2f;
    -        color[1] = 0.2f;
    -        color[2] = 0.2f;
    -    }
    -    else if (model_volume.is_modifier()) {
    -        color[0] = 1.0f;
    -        color[1] = 1.0f;
    -        color[2] = 0.2f;
    -    }
    -    else if (model_volume.is_support_blocker()) {
    -        color[0] = 1.0f;
    -        color[1] = 0.2f;
    -        color[2] = 0.2f;
    -    }
    -    else if (model_volume.is_support_enforcer()) {
    -        color[0] = 0.2f;
    -        color[1] = 0.2f;
    -        color[2] = 1.0f;
    -    }
    -    color[3] = model_volume.is_model_part() ? 1.f : 0.5f;
    +    ColorRGBA color;
    +    if (model_volume.is_negative_volume())
    +        color = { 0.2f, 0.2f, 0.2f, 1.0f };
    +    else if (model_volume.is_modifier())
    +        color = { 1.0, 1.0f, 0.2f, 1.0f };
    +    else if (model_volume.is_support_blocker())
    +        color = { 1.0f, 0.2f, 0.2f, 1.0f };
    +    else if (model_volume.is_support_enforcer())
    +        color = { 0.2f, 0.2f, 1.0f, 1.0f };
    +
    +    if (!model_volume.is_model_part())
    +        color.a(0.5f);
    +
         return color;
     }
     
    @@ -527,55 +350,55 @@ const BoundingBoxf3& GLVolume::transformed_non_sinking_bounding_box() const
     
     void GLVolume::set_range(double min_z, double max_z)
     {
    -    this->qverts_range.first = 0;
    -    this->qverts_range.second = this->indexed_vertex_array.quad_indices_size;
         this->tverts_range.first = 0;
    -    this->tverts_range.second = this->indexed_vertex_array.triangle_indices_size;
    -    if (! this->print_zs.empty()) {
    +    this->tverts_range.second = this->model.indices_count();
    +
    +    if (!this->print_zs.empty()) {
             // The Z layer range is specified.
             // First test whether the Z span of this object is not out of (min_z, max_z) completely.
    -        if (this->print_zs.front() > max_z || this->print_zs.back() < min_z) {
    -            this->qverts_range.second = 0;
    +        if (this->print_zs.front() > max_z || this->print_zs.back() < min_z)
                 this->tverts_range.second = 0;
    -        } else {
    +        else {
                 // Then find the lowest layer to be displayed.
                 size_t i = 0;
    -            for (; i < this->print_zs.size() && this->print_zs[i] < min_z; ++ i);
    -            if (i == this->print_zs.size()) {
    +            for (; i < this->print_zs.size() && this->print_zs[i] < min_z; ++i);
    +            if (i == this->print_zs.size())
                     // This shall not happen.
    -                this->qverts_range.second = 0;
                     this->tverts_range.second = 0;
    -            } else {
    +            else {
                     // Remember start of the layer.
    -                this->qverts_range.first = this->offsets[i * 2];
    -                this->tverts_range.first = this->offsets[i * 2 + 1];
    +                this->tverts_range.first = this->offsets[i];
                     // Some layers are above $min_z. Which?
    -                for (; i < this->print_zs.size() && this->print_zs[i] <= max_z; ++ i);
    -                if (i < this->print_zs.size()) {
    -                    this->qverts_range.second = this->offsets[i * 2];
    -                    this->tverts_range.second = this->offsets[i * 2 + 1];
    -                }
    +                for (; i < this->print_zs.size() && this->print_zs[i] <= max_z; ++i);
    +                if (i < this->print_zs.size())
    +                    this->tverts_range.second = this->offsets[i];
                 }
             }
         }
     }
     
    -void GLVolume::render() const
    +void GLVolume::render()
     {
         if (!is_active)
             return;
     
    -    if (this->is_left_handed())
    -        glFrontFace(GL_CW);
    +    GLShaderProgram* shader = GUI::wxGetApp().get_current_shader();
    +    if (shader == nullptr)
    +        return;
    +    
    +    const bool is_left_handed = this->is_left_handed();
    +
    +    if (is_left_handed)
    +        glsafe(::glFrontFace(GL_CW));
         glsafe(::glCullFace(GL_BACK));
    -    glsafe(::glPushMatrix());
    -    glsafe(::glMultMatrixd(world_matrix().data()));
     
    -    this->indexed_vertex_array.render(this->tverts_range, this->qverts_range);
    +    if (tverts_range == std::make_pair(0, -1))
    +        model.render();
    +    else
    +        model.render(this->tverts_range);
     
    -    glsafe(::glPopMatrix());
    -    if (this->is_left_handed())
    -        glFrontFace(GL_CCW);
    +    if (is_left_handed)
    +        glsafe(::glFrontFace(GL_CCW));
     }
     
     bool GLVolume::is_sla_support() const { return this->composite_id.volume_id == -int(slaposSupportTree); }
    @@ -599,46 +422,49 @@ void GLVolume::render_sinking_contours()
         m_sinking_contours.render();
     }
     
    +void GLVolume::render_non_manifold_edges()
    +{
    +    m_non_manifold_edges.render();
    +}
    +
     std::vector GLVolumeCollection::load_object(
    -    const ModelObject       *model_object,
    -    int                      obj_idx,
    -    const std::vector  &instance_idxs,
    -    const std::string       &color_by,
    -    bool 					 opengl_initialized)
    +    const ModelObject*      model_object,
    +    int                     obj_idx,
    +    const std::vector& instance_idxs)
     {
         std::vector volumes_idx;
         for (int volume_idx = 0; volume_idx < int(model_object->volumes.size()); ++volume_idx)
             for (int instance_idx : instance_idxs)
    -            volumes_idx.emplace_back(this->GLVolumeCollection::load_object_volume(model_object, obj_idx, volume_idx, instance_idx, color_by, opengl_initialized));
    +           volumes_idx.emplace_back(this->GLVolumeCollection::load_object_volume(model_object, obj_idx, volume_idx, instance_idx));
         return volumes_idx;
     }
     
     int GLVolumeCollection::load_object_volume(
    -    const ModelObject   *model_object,
    -    int                  obj_idx,
    -    int                  volume_idx,
    -    int                  instance_idx,
    -    const std::string   &color_by,
    -    bool 				 opengl_initialized)
    +    const ModelObject* model_object,
    +    int                obj_idx,
    +    int                volume_idx,
    +    int                instance_idx)
     {
         const ModelVolume   *model_volume = model_object->volumes[volume_idx];
         const int            extruder_id  = model_volume->extruder_id();
         const ModelInstance *instance 	  = model_object->instances[instance_idx];
    -    const TriangleMesh  &mesh 		  = model_volume->mesh();
    -    std::array color = GLVolume::MODEL_COLOR[((color_by == "volume") ? volume_idx : obj_idx) % 4];
    -    color[3] = model_volume->is_model_part() ? 1.f : 0.5f;
    -    this->volumes.emplace_back(new GLVolume(color));
    +    std::shared_ptr mesh = model_volume->mesh_ptr();
    +    this->volumes.emplace_back(new GLVolume());
         GLVolume& v = *this->volumes.back();
         v.set_color(color_from_model_volume(*model_volume));
    +    // apply printable value from the instance
    +    v.printable = instance->printable;
     #if ENABLE_SMOOTH_NORMALS
    -    v.indexed_vertex_array.load_mesh(mesh, true);
    +    v.model.init_from(*mesh, true);
    +    if (m_use_raycasters)
    +      v.mesh_raycaster = std::make_unique(mesh);
     #else
    -    v.indexed_vertex_array.load_mesh(mesh);
    +    v.model.init_from(*mesh);
    +    if (m_use_raycasters)
    +      v.mesh_raycaster = std::make_unique(mesh);
     #endif // ENABLE_SMOOTH_NORMALS
    -    v.indexed_vertex_array.finalize_geometry(opengl_initialized);
         v.composite_id = GLVolume::CompositeID(obj_idx, volume_idx, instance_idx);
    -    if (model_volume->is_model_part())
    -    {
    +    if (model_volume->is_model_part()) {
             // GLVolume will reference a convex hull from model_volume!
             v.set_convex_hull(model_volume->get_convex_hull_shared_ptr());
             if (extruder_id != -1)
    @@ -652,86 +478,48 @@ int GLVolumeCollection::load_object_volume(
         return int(this->volumes.size() - 1);
     }
     
    -// Load SLA auxiliary GLVolumes (for support trees or pad).
    -// This function produces volumes for multiple instances in a single shot,
    -// as some object specific mesh conversions may be expensive.
    -void GLVolumeCollection::load_object_auxiliary(
    -    const SLAPrintObject 		   *print_object,
    -    int                             obj_idx,
    -    // pairs of 
    -    const std::vector>& instances,
    -    SLAPrintObjectStep              milestone,
    -    // Timestamp of the last change of the milestone
    -    size_t                          timestamp,
    -    bool 				 			opengl_initialized)
    -{
    -    assert(print_object->is_step_done(milestone));
    -    Transform3d  mesh_trafo_inv = print_object->trafo().inverse();
    -    // Get the support mesh.
    -    TriangleMesh mesh = print_object->get_mesh(milestone);
    -    mesh.transform(mesh_trafo_inv);
    -    // Convex hull is required for out of print bed detection.
    -    TriangleMesh convex_hull = mesh.convex_hull_3d();
    -    for (const std::pair& instance_idx : instances) {
    -        const ModelInstance& model_instance = *print_object->model_object()->instances[instance_idx.first];
    -        this->volumes.emplace_back(new GLVolume((milestone == slaposPad) ? GLVolume::SLA_PAD_COLOR : GLVolume::SLA_SUPPORT_COLOR));
    -        GLVolume& v = *this->volumes.back();
    -#if ENABLE_SMOOTH_NORMALS
    -        v.indexed_vertex_array.load_mesh(mesh, true);
    +#if ENABLE_OPENGL_ES
    +int GLVolumeCollection::load_wipe_tower_preview(
    +    float pos_x, float pos_y, float width, float depth, float height, float cone_angle,
    +    float rotation_angle, bool size_unknown, float brim_width, TriangleMesh* out_mesh)
     #else
    -        v.indexed_vertex_array.load_mesh(mesh);
    -#endif // ENABLE_SMOOTH_NORMALS
    -        v.indexed_vertex_array.finalize_geometry(opengl_initialized);
    -        v.composite_id = GLVolume::CompositeID(obj_idx, -int(milestone), (int)instance_idx.first);
    -        v.geometry_id = std::pair(timestamp, model_instance.id().id);
    -        // Create a copy of the convex hull mesh for each instance. Use a move operator on the last instance.
    -        if (&instance_idx == &instances.back())
    -            v.set_convex_hull(std::move(convex_hull));
    -        else
    -            v.set_convex_hull(convex_hull);
    -        v.is_modifier = false;
    -        v.shader_outside_printer_detection_enabled = (milestone == slaposSupportTree);
    -        v.set_instance_transformation(model_instance.get_transformation());
    -        // Leave the volume transformation at identity.
    -        // v.set_volume_transformation(model_volume->get_transformation());
    -    }
    -}
    -
     int GLVolumeCollection::load_wipe_tower_preview(
    -    int obj_idx, float pos_x, float pos_y, float width, float depth, float height,
    -    float rotation_angle, bool size_unknown, float brim_width, bool opengl_initialized)
    +    float pos_x, float pos_y, float width, float depth, float height, float cone_angle,
    +    float rotation_angle, bool size_unknown, float brim_width)
    +#endif // ENABLE_OPENGL_ES
     {
    -    if (depth < 0.01f)
    -        return int(this->volumes.size() - 1);
         if (height == 0.0f)
             height = 0.1f;
     
    +    static const float brim_height = 0.2f;
    +//    const float scaled_brim_height = brim_height / height;
    +
         TriangleMesh mesh;
    -    std::array color = { 0.5f, 0.5f, 0.0f, 1.0f };
    +    ColorRGBA color = ColorRGBA::DARK_YELLOW();
     
         // In case we don't know precise dimensions of the wipe tower yet, we'll draw
         // the box with different color with one side jagged:
         if (size_unknown) {
    -        color[0] = 0.9f;
    -        color[1] = 0.6f;
    +        color.r(0.9f);
    +        color.g(0.6f);
     
             // Too narrow tower would interfere with the teeth. The estimate is not precise anyway.
             depth = std::max(depth, 10.f);
             float min_width = 30.f;
    +
             // We'll now create the box with jagged edge. y-coordinates of the pre-generated model
             // are shifted so that the front edge has y=0 and centerline of the back edge has y=depth:
             float out_points_idx[][3] = { { 0, -depth, 0 }, { 0, 0, 0 }, { 38.453f, 0, 0 }, { 61.547f, 0, 0 }, { 100.0f, 0, 0 }, { 100.0f, -depth, 0 }, { 55.7735f, -10.0f, 0 }, { 44.2265f, 10.0f, 0 },
    -        { 38.453f, 0, 1 }, { 0, 0, 1 }, { 0, -depth, 1 }, { 100.0f, -depth, 1 }, { 100.0f, 0, 1 }, { 61.547f, 0, 1 }, { 55.7735f, -10.0f, 1 }, { 44.2265f, 10.0f, 1 } };
    -        static constexpr const int out_facets_idx[][3] = { 
    +            { 38.453f, 0, 1 }, { 0, 0, 1 }, { 0, -depth, 1 }, { 100.0f, -depth, 1 }, { 100.0f, 0, 1 }, { 61.547f, 0, 1 }, { 55.7735f, -10.0f, 1 }, { 44.2265f, 10.0f, 1 } };
    +        static constexpr const int out_facets_idx[][3] = {
                 { 0, 1, 2 }, { 3, 4, 5 }, { 6, 5, 0 }, { 3, 5, 6 }, { 6, 2, 7 }, { 6, 0, 2 }, { 8, 9, 10 }, { 11, 12, 13 }, { 10, 11, 14 }, { 14, 11, 13 }, { 15, 8, 14 },
                 { 8, 10, 14 }, { 3, 12, 4 }, { 3, 13, 12 }, { 6, 13, 3 }, { 6, 14, 13 }, { 7, 14, 6 }, { 7, 15, 14 }, { 2, 15, 7 }, { 2, 8, 15 }, { 1, 8, 2 }, { 1, 9, 8 },
                 { 0, 9, 1 }, { 0, 10, 9 }, { 5, 10, 0 }, { 5, 11, 10 }, { 4, 11, 5 }, { 4, 12, 11 } };
             indexed_triangle_set its;
             for (int i = 0; i < 16; ++i)
    -            its.vertices.emplace_back(out_points_idx[i][0] / (100.f / min_width),
    -                                      out_points_idx[i][1] + depth, out_points_idx[i][2]);
    +            its.vertices.emplace_back(out_points_idx[i][0] / (100.f / min_width), out_points_idx[i][1] + depth, out_points_idx[i][2]);
             its.indices.reserve(28);
    -        for (const int *face : out_facets_idx)
    +        for (const int* face : out_facets_idx)
                 its.indices.emplace_back(face);
             TriangleMesh tooth_mesh(std::move(its));
     
    @@ -754,14 +542,34 @@ int GLVolumeCollection::load_wipe_tower_preview(
         brim_mesh.translate(-brim_width, -brim_width, 0.f);
         mesh.merge(brim_mesh);
     
    +    // Now the stabilization cone and its base.
    +    const auto [R, scale_x] = WipeTower::get_wipe_tower_cone_base(width, height, depth, cone_angle);
    +    if (R > 0.) {
    +        TriangleMesh cone_mesh(its_make_cone(R, height));
    +        cone_mesh.scale(Vec3f(1.f/scale_x, 1.f, 1.f));
    +
    +        TriangleMesh disk_mesh(its_make_cylinder(R, brim_height));
    +        disk_mesh.scale(Vec3f(1. / scale_x, 1., 1.)); // Now it matches the base, which may be elliptic.
    +        disk_mesh.scale(Vec3f(1.f + scale_x*brim_width/R, 1.f + brim_width/R, 1.f)); // Scale so the brim is not deformed.
    +        cone_mesh.merge(disk_mesh);
    +        cone_mesh.translate(width / 2., depth / 2., 0.);
    +        mesh.merge(cone_mesh);
    +    }
    +
    +
         volumes.emplace_back(new GLVolume(color));
         GLVolume& v = *volumes.back();
    -    v.indexed_vertex_array.load_mesh(mesh);
    +#if ENABLE_OPENGL_ES
    +    if (out_mesh != nullptr)
    +        *out_mesh = mesh;
    +#endif // ENABLE_OPENGL_ES
    +    v.model.init_from(mesh);
    +    v.model.set_color(color);
    +    v.mesh_raycaster = std::make_unique(std::make_shared(mesh));
         v.set_convex_hull(mesh.convex_hull_3d());
    -    v.indexed_vertex_array.finalize_geometry(opengl_initialized);
         v.set_volume_offset(Vec3d(pos_x, pos_y, 0.0));
         v.set_volume_rotation(Vec3d(0., 0., (M_PI / 180.) * rotation_angle));
    -    v.composite_id = GLVolume::CompositeID(obj_idx, 0, 0);
    +    v.composite_id = GLVolume::CompositeID(INT_MAX, 0, 0);
         v.geometry_id.first = 0;
         v.geometry_id.second = wipe_tower_instance_id().id;
         v.is_wipe_tower = true;
    @@ -769,21 +577,84 @@ int GLVolumeCollection::load_wipe_tower_preview(
         return int(volumes.size() - 1);
     }
     
    -GLVolume* GLVolumeCollection::new_toolpath_volume(const std::array& rgba, size_t reserve_vbo_floats)
    +// Load SLA auxiliary GLVolumes (for support trees or pad).
    +// This function produces volumes for multiple instances in a single shot,
    +// as some object specific mesh conversions may be expensive.
    +void GLVolumeCollection::load_object_auxiliary(
    +    const SLAPrintObject*           print_object,
    +    int                             obj_idx,
    +    // pairs of 
    +    const std::vector>& instances,
    +    SLAPrintObjectStep              milestone,
    +    // Timestamp of the last change of the milestone
    +    size_t                          timestamp)
     {
    -	GLVolume *out = new_nontoolpath_volume(rgba, reserve_vbo_floats);
    -	out->is_extrusion_path = true;
    -	return out;
    +    if (print_object->get_mesh_to_print() == nullptr)
    +        return;
    +    const Transform3d mesh_trafo_inv = print_object->trafo().inverse();
    +
    +    auto add_volume = [this, &instances, timestamp](int obj_idx, int inst_idx, const ModelInstance& model_instance, SLAPrintObjectStep step,
    +        const TriangleMesh& mesh, const ColorRGBA& color, std::optional convex_hull = std::nullopt) {
    +        if (mesh.empty())
    +            return;
    +
    +        GLVolume& v = *this->volumes.emplace_back(new GLVolume(color));
    +#if ENABLE_SMOOTH_NORMALS
    +        v.model.init_from(mesh, true);
    +#else
    +        v.model.init_from(mesh);
    +        v.model.set_color(color);
    +        v.mesh_raycaster = std::make_unique(std::make_shared(mesh));
    +#endif // ENABLE_SMOOTH_NORMALS
    +        v.composite_id = GLVolume::CompositeID(obj_idx, -int(step), inst_idx);
    +        v.geometry_id = std::pair(timestamp, model_instance.id().id);
    +        if (convex_hull.has_value())
    +            v.set_convex_hull(*convex_hull);
    +        v.is_modifier = false;
    +        v.shader_outside_printer_detection_enabled = (step == slaposSupportTree);
    +        v.set_instance_transformation(model_instance.get_transformation());
    +    };
    + 
    +    // Get the support mesh.
    +    if (milestone == SLAPrintObjectStep::slaposSupportTree) {
    +        TriangleMesh supports_mesh = print_object->support_mesh();
    +        if (!supports_mesh.empty()) {
    +            supports_mesh.transform(mesh_trafo_inv);
    +            TriangleMesh convex_hull = supports_mesh.convex_hull_3d();
    +            for (const std::pair& instance_idx : instances) {
    +              const ModelInstance& model_instance = *print_object->model_object()->instances[instance_idx.first];
    +              add_volume(obj_idx, (int)instance_idx.first, model_instance, slaposSupportTree, supports_mesh, GLVolume::SLA_SUPPORT_COLOR, convex_hull);
    +            }
    +        }
    +    }
    +
    +    // Get the pad mesh.
    +    if (milestone == SLAPrintObjectStep::slaposPad) {
    +        TriangleMesh pad_mesh = print_object->pad_mesh();
    +        if (!pad_mesh.empty()) {
    +            pad_mesh.transform(mesh_trafo_inv);
    +            TriangleMesh convex_hull = pad_mesh.convex_hull_3d();
    +            for (const std::pair& instance_idx : instances) {
    +                const ModelInstance& model_instance = *print_object->model_object()->instances[instance_idx.first];
    +                add_volume(obj_idx, (int)instance_idx.first, model_instance, slaposPad, pad_mesh, GLVolume::SLA_PAD_COLOR, convex_hull);
    +            }
    +        }
    +    }
     }
     
    -GLVolume* GLVolumeCollection::new_nontoolpath_volume(const std::array& rgba, size_t reserve_vbo_floats)
    +GLVolume* GLVolumeCollection::new_toolpath_volume(const ColorRGBA& rgba)
     {
    -	GLVolume *out = new GLVolume(rgba);
    -	out->is_extrusion_path = false;
    -	// Reserving number of vertices (3x position + 3x color)
    -	out->indexed_vertex_array.reserve(reserve_vbo_floats / 6);
    -	this->volumes.emplace_back(out);
    -	return out;
    +    GLVolume* out = new_nontoolpath_volume(rgba);
    +    out->is_extrusion_path = true;
    +    return out;
    +}
    +
    +GLVolume* GLVolumeCollection::new_nontoolpath_volume(const ColorRGBA& rgba)
    +{
    +    GLVolume* out = new GLVolume(rgba);
    +    out->is_extrusion_path = false;
    +    this->volumes.emplace_back(out);
    +    return out;
     }
     
     GLVolumeWithIdAndZList volumes_to_render(const GLVolumePtrs& volumes, GLVolumeCollection::ERenderType type, const Transform3d& view_matrix, std::function filter_func)
    @@ -793,7 +664,7 @@ GLVolumeWithIdAndZList volumes_to_render(const GLVolumePtrs& volumes, GLVolumeCo
     
         for (unsigned int i = 0; i < (unsigned int)volumes.size(); ++i) {
             GLVolume* volume = volumes[i];
    -        bool is_transparent = (volume->render_color[3] < 1.0f);
    +        bool is_transparent = volume->render_color.is_transparent();
             if (((type == GLVolumeCollection::ERenderType::Opaque && !is_transparent) ||
                  (type == GLVolumeCollection::ERenderType::Transparent && is_transparent) ||
                  type == GLVolumeCollection::ERenderType::All) &&
    @@ -819,7 +690,8 @@ GLVolumeWithIdAndZList volumes_to_render(const GLVolumePtrs& volumes, GLVolumeCo
         return list;
     }
     
    -void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disable_cullface, const Transform3d& view_matrix, std::function filter_func) const
    +void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disable_cullface, const Transform3d& view_matrix, const Transform3d& projection_matrix,
    +    std::function filter_func) const
     {
         GLVolumeWithIdAndZList to_render = volumes_to_render(volumes, type, view_matrix, filter_func);
         if (to_render.empty())
    @@ -829,9 +701,17 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab
         if (shader == nullptr)
             return;
     
    +    GLShaderProgram* sink_shader  = GUI::wxGetApp().get_shader("flat");
    +#if ENABLE_GL_CORE_PROFILE
    +    GLShaderProgram* edges_shader = GUI::OpenGLManager::get_gl_info().is_core_profile() ? GUI::wxGetApp().get_shader("dashed_thick_lines") : GUI::wxGetApp().get_shader("flat");
    +#else
    +    GLShaderProgram* edges_shader = GUI::wxGetApp().get_shader("flat");
    +#endif // ENABLE_GL_CORE_PROFILE
    +
         if (type == ERenderType::Transparent) {
             glsafe(::glEnable(GL_BLEND));
             glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
    +        glsafe(::glDepthMask(false));
         }
     
         glsafe(::glCullFace(GL_BACK));
    @@ -839,44 +719,52 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab
             glsafe(::glDisable(GL_CULL_FACE));
     
         for (GLVolumeWithIdAndZ& volume : to_render) {
    -        if (type == ERenderType::Transparent)
    -            volume.first->force_transparent = true;
    -        volume.first->set_render_color();
    -        if (type == ERenderType::Transparent)
    -            volume.first->force_transparent = false;
    +        const Transform3d& world_matrix = volume.first->world_matrix();
    +        volume.first->set_render_color(true);
     
             // render sinking contours of non-hovered volumes
    -        if (m_show_sinking_contours)
    -            if (volume.first->is_sinking() && !volume.first->is_below_printbed() &&
    -                volume.first->hover == GLVolume::HS_None && !volume.first->force_sinking_contours) {
    -                shader->stop_using();
    -                volume.first->render_sinking_contours();
    -                shader->start_using();
    +        shader->stop_using();
    +        if (sink_shader != nullptr) {
    +            sink_shader->start_using();
    +            if (m_show_sinking_contours) {
    +                if (volume.first->is_sinking() && !volume.first->is_below_printbed() &&
    +                    volume.first->hover == GLVolume::HS_None && !volume.first->force_sinking_contours) {
    +                    volume.first->render_sinking_contours();
    +                }
                 }
    -
    -        glsafe(::glEnableClientState(GL_VERTEX_ARRAY));
    -        glsafe(::glEnableClientState(GL_NORMAL_ARRAY));
    -
    -        shader->set_uniform("uniform_color", volume.first->render_color);
    -        shader->set_uniform("z_range", m_z_range, 2);
    -        shader->set_uniform("clipping_plane", m_clipping_plane, 4);
    +            sink_shader->stop_using();
    +        }
    +        shader->start_using();
    +
    +        shader->set_uniform("z_range", m_z_range);
    +        shader->set_uniform("clipping_plane", m_clipping_plane);
    +        shader->set_uniform("use_color_clip_plane", m_use_color_clip_plane);
    +        shader->set_uniform("color_clip_plane", m_color_clip_plane);
    +        shader->set_uniform("uniform_color_clip_plane_1", m_color_clip_plane_colors[0]);
    +        shader->set_uniform("uniform_color_clip_plane_2", m_color_clip_plane_colors[1]);
             shader->set_uniform("print_volume.type", static_cast(m_print_volume.type));
             shader->set_uniform("print_volume.xy_data", m_print_volume.data);
             shader->set_uniform("print_volume.z_data", m_print_volume.zs);
    -        shader->set_uniform("volume_world_matrix", volume.first->world_matrix());
    +        shader->set_uniform("volume_world_matrix", world_matrix);
             shader->set_uniform("slope.actived", m_slope.active && !volume.first->is_modifier && !volume.first->is_wipe_tower);
    -        shader->set_uniform("slope.volume_world_normal_matrix", static_cast(volume.first->world_matrix().matrix().block(0, 0, 3, 3).inverse().transpose().cast()));
    +        shader->set_uniform("slope.volume_world_normal_matrix", static_cast(world_matrix.matrix().block(0, 0, 3, 3).inverse().transpose().cast()));
             shader->set_uniform("slope.normal_z", m_slope.normal_z);
     
     #if ENABLE_ENVIRONMENT_MAP
             unsigned int environment_texture_id = GUI::wxGetApp().plater()->get_environment_texture_id();
    -        bool use_environment_texture = environment_texture_id > 0 && GUI::wxGetApp().app_config->get("use_environment_map") == "1";
    +        bool use_environment_texture = environment_texture_id > 0 && GUI::wxGetApp().app_config->get_bool("use_environment_map");
             shader->set_uniform("use_environment_tex", use_environment_texture);
             if (use_environment_texture)
                 glsafe(::glBindTexture(GL_TEXTURE_2D, environment_texture_id));
     #endif // ENABLE_ENVIRONMENT_MAP
             glcheck();
     
    +        volume.first->model.set_color(volume.first->render_color);
    +        const Transform3d model_matrix = world_matrix;
    +        shader->set_uniform("view_model_matrix", view_matrix * model_matrix);
    +        shader->set_uniform("projection_matrix", projection_matrix);
    +        const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose();
    +        shader->set_uniform("view_normal_matrix", view_normal_matrix);
             volume.first->render();
     
     #if ENABLE_ENVIRONMENT_MAP
    @@ -886,30 +774,45 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab
     
             glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0));
             glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
    -
    -        glsafe(::glDisableClientState(GL_VERTEX_ARRAY));
    -        glsafe(::glDisableClientState(GL_NORMAL_ARRAY));
         }
     
         if (m_show_sinking_contours) {
    -        for (GLVolumeWithIdAndZ& volume : to_render) {
    -            // render sinking contours of hovered/displaced volumes
    -            if (volume.first->is_sinking() && !volume.first->is_below_printbed() &&
    -                (volume.first->hover != GLVolume::HS_None || volume.first->force_sinking_contours)) {
    -                shader->stop_using();
    -                glsafe(::glDepthFunc(GL_ALWAYS));
    -                volume.first->render_sinking_contours();
    -                glsafe(::glDepthFunc(GL_LESS));
    -                shader->start_using();
    +        shader->stop_using();
    +        if (sink_shader != nullptr) {
    +            sink_shader->start_using();
    +            for (GLVolumeWithIdAndZ& volume : to_render) {
    +                // render sinking contours of hovered/displaced volumes
    +                if (volume.first->is_sinking() && !volume.first->is_below_printbed() &&
    +                    (volume.first->hover != GLVolume::HS_None || volume.first->force_sinking_contours)) {
    +                    glsafe(::glDepthFunc(GL_ALWAYS));
    +                    volume.first->render_sinking_contours();
    +                    glsafe(::glDepthFunc(GL_LESS));
    +                }
                 }
    +            sink_shader->start_using();
             }
    +        shader->start_using();
         }
     
    +    shader->stop_using();
    +    if (edges_shader != nullptr) {
    +        edges_shader->start_using();
    +        if (m_show_non_manifold_edges && GUI::wxGetApp().app_config->get_bool("non_manifold_edges")) {
    +            for (GLVolumeWithIdAndZ& volume : to_render) {
    +                volume.first->render_non_manifold_edges();
    +            }
    +        }
    +        edges_shader->stop_using();
    +    }
    +    shader->start_using();
    +
         if (disable_cullface)
             glsafe(::glEnable(GL_CULL_FACE));
     
    -    if (type == ERenderType::Transparent)
    +    if (type == ERenderType::Transparent) {
             glsafe(::glDisable(GL_BLEND));
    +        glsafe(::glDepthMask(true));
    +    }
     }
     
     bool GLVolumeCollection::check_outside_state(const BuildVolume &build_volume, ModelInstanceEPrintVolumeState *out_state) const
    @@ -972,8 +875,7 @@ bool GLVolumeCollection::check_outside_state(const BuildVolume &build_volume, Mo
     
     void GLVolumeCollection::reset_outside_state()
     {
    -    for (GLVolume* volume : this->volumes)
    -    {
    +    for (GLVolume* volume : this->volumes) {
             if (volume != nullptr)
                 volume->is_outside = false;
         }
    @@ -981,46 +883,18 @@ void GLVolumeCollection::reset_outside_state()
     
     void GLVolumeCollection::update_colors_by_extruder(const DynamicPrintConfig* config)
     {
    -    static const float inv_255 = 1.0f / 255.0f;
    -
    -    struct Color
    -    {
    -        std::string text;
    -        unsigned char rgb[3];
    -
    -        Color()
    -            : text("")
    -        {
    -            rgb[0] = 255;
    -            rgb[1] = 255;
    -            rgb[2] = 255;
    -        }
    -
    -        void set(const std::string& text, unsigned char* rgb)
    -        {
    -            this->text = text;
    -            ::memcpy((void*)this->rgb, (const void*)rgb, 3 * sizeof(unsigned char));
    -        }
    -    };
    -
    -    if (config == nullptr)
    -        return;
    +    using ColorItem = std::pair;
    +    std::vector colors;
     
    -    unsigned char rgb[3];
    -    std::vector colors;
    -
    -    if (static_cast(config->opt_int("printer_technology")) == ptSLA) 
    -    {
    +    if (static_cast(config->opt_int("printer_technology")) == ptSLA) {
             const std::string& txt_color = config->opt_string("material_colour").empty() ? 
                                            print_config_def.get("material_colour")->get_default_value()->value : 
                                            config->opt_string("material_colour");
    -        if (Slic3r::GUI::BitmapCache::parse_color(txt_color, rgb)) {
    -            colors.resize(1);
    -            colors[0].set(txt_color, rgb);
    -        }
    +        ColorRGB rgb;
    +        if (decode_color(txt_color, rgb))
    +            colors.push_back({ txt_color, rgb });
         }
    -    else 
    -    {
    +    else {
             const ConfigOptionStrings* extruders_opt = dynamic_cast(config->option("extruder_colour"));
             if (extruders_opt == nullptr)
                 return;
    @@ -1029,37 +903,35 @@ void GLVolumeCollection::update_colors_by_extruder(const DynamicPrintConfig* con
             if (filamemts_opt == nullptr)
                 return;
     
    -        unsigned int colors_count = std::max((unsigned int)extruders_opt->values.size(), (unsigned int)filamemts_opt->values.size());
    +        size_t colors_count = std::max(extruders_opt->values.size(), filamemts_opt->values.size());
             if (colors_count == 0)
                 return;
             colors.resize(colors_count);
     
             for (unsigned int i = 0; i < colors_count; ++i) {
    -            const std::string& txt_color = config->opt_string("extruder_colour", i);
    -            if (Slic3r::GUI::BitmapCache::parse_color(txt_color, rgb))
    -                colors[i].set(txt_color, rgb);
    +            const std::string& ext_color = config->opt_string("extruder_colour", i);
    +            ColorRGB rgb;
    +            if (decode_color(ext_color, rgb))
    +                colors[i] = { ext_color, rgb };
                 else {
    -                const std::string& txt_color = config->opt_string("filament_colour", i);
    -                if (Slic3r::GUI::BitmapCache::parse_color(txt_color, rgb))
    -                    colors[i].set(txt_color, rgb);
    +                const std::string& fil_color = config->opt_string("filament_colour", i);
    +                if (decode_color(fil_color, rgb))
    +                    colors[i] = { fil_color, rgb };
                 }
             }
         }
     
         for (GLVolume* volume : volumes) {
    -        if (volume == nullptr || volume->is_modifier || volume->is_wipe_tower || (volume->volume_idx() < 0))
    +        if (volume == nullptr || volume->is_modifier || volume->is_wipe_tower || volume->volume_idx() < 0)
                 continue;
     
             int extruder_id = volume->extruder_id - 1;
             if (extruder_id < 0 || (int)colors.size() <= extruder_id)
                 extruder_id = 0;
     
    -        const Color& color = colors[extruder_id];
    -        if (!color.text.empty()) {
    -            for (int i = 0; i < 3; ++i) {
    -                volume->color[i] = (float)color.rgb[i] * inv_255;
    -            }
    -        }
    +        const ColorItem& color = colors[extruder_id];
    +        if (!color.first.empty())
    +            volume->color = to_rgba(color.second, volume->color.a());
         }
     }
     
    @@ -1111,60 +983,70 @@ std::string GLVolumeCollection::log_memory_info() const
     	return " (GLVolumeCollection RAM: " + format_memsize_MB(this->cpu_memory_used()) + " GPU: " + format_memsize_MB(this->gpu_memory_used()) + " Both: " + format_memsize_MB(this->gpu_memory_used()) + ")";
     }
     
    -// caller is responsible for supplying NO lines with zero length
    -static void thick_lines_to_indexed_vertex_array(
    -    const Lines                 &lines, 
    -    const std::vector   &widths,
    -    const std::vector   &heights, 
    -    bool                         closed,
    -    double                       top_z,
    -    GLIndexedVertexArray        &volume)
    +static void thick_lines_to_geometry(
    +    const Lines&               lines,
    +    const std::vector& widths,
    +    const std::vector& heights,
    +    bool                       closed,
    +    double                     top_z,
    +    GUI::GLModel::Geometry&    geometry)
     {
    -    assert(! lines.empty());
    +    assert(!lines.empty());
         if (lines.empty())
             return;
     
    -#define LEFT    0
    -#define RIGHT   1
    -#define TOP     2
    -#define BOTTOM  3
    +    enum Direction : unsigned char
    +    {
    +        Left,
    +        Right,
    +        Top,
    +        Bottom
    +    };
     
         // right, left, top, bottom
    -    int     idx_prev[4]      = { -1, -1, -1, -1 };
    -    double  bottom_z_prev    = 0.;
    -    Vec2d   b1_prev(Vec2d::Zero());
    -    Vec2d   v_prev(Vec2d::Zero());
    -    int     idx_initial[4]   = { -1, -1, -1, -1 };
    -    double  width_initial    = 0.;
    -    double  bottom_z_initial = 0.0;
    -    double  len_prev = 0.0;
    +    std::array idx_prev    = { -1, -1, -1, -1 };
    +    std::array idx_initial = { -1, -1, -1, -1 };
    +
    +    double bottom_z_prev = 0.0;
    +    Vec2d  b1_prev(Vec2d::Zero());
    +    Vec2d  v_prev(Vec2d::Zero());
    +    double len_prev = 0.0;
    +    double width_initial = 0.0;
    +    double bottom_z_initial = 0.0;
    +
    +    // Reserve for a smooth path. Likley the path will not be that smooth, but better than nothing.
    +    // Allocated 1.5x more data than minimum.
    +    // Number of indices, not triangles.
    +    geometry.reserve_more_indices((lines.size() * 8 * 3) * 3 / 2);
    +    // Number of vertices, not floats.
    +    geometry.reserve_more_vertices(((lines.size() + 1) * 4) * 3 / 2);
     
         // loop once more in case of closed loops
    -    size_t lines_end = closed ? (lines.size() + 1) : lines.size();
    -    for (size_t ii = 0; ii < lines_end; ++ ii) {
    -        size_t i = (ii == lines.size()) ? 0 : ii;
    -        const Line &line = lines[i];
    -        double bottom_z = top_z - heights[i];
    -        double middle_z = 0.5 * (top_z + bottom_z);
    -        double width = widths[i];
    -
    -        bool is_first = (ii == 0);
    -        bool is_last = (ii == lines_end - 1);
    -        bool is_closing = closed && is_last;
    -
    -        Vec2d v = unscale(line.vector()).normalized();
    -        double len = unscale(line.length());
    -
    -        Vec2d a = unscale(line.a);
    -        Vec2d b = unscale(line.b);
    +    const size_t lines_end = closed ? (lines.size() + 1) : lines.size();
    +    for (size_t ii = 0; ii < lines_end; ++ii) {
    +        const size_t i = (ii == lines.size()) ? 0 : ii;
    +        const Line& line = lines[i];
    +        const double bottom_z = top_z - heights[i];
    +        const double middle_z = 0.5 * (top_z + bottom_z);
    +        const double width = widths[i];
    +
    +        const bool is_first = (ii == 0);
    +        const bool is_last = (ii == lines_end - 1);
    +        const bool is_closing = closed && is_last;
    +
    +        const Vec2d v = unscale(line.vector()).normalized();
    +        const double len = unscale(line.length());
    +
    +        const Vec2d a = unscale(line.a);
    +        const Vec2d b = unscale(line.b);
             Vec2d a1 = a;
             Vec2d a2 = a;
             Vec2d b1 = b;
             Vec2d b2 = b;
             {
    -            double dist = 0.5 * width;  // scaled
    -            double dx = dist * v(0);
    -            double dy = dist * v(1);
    +            const double dist = 0.5 * width;  // scaled
    +            const double dx = dist * v.x();
    +            const double dy = dist * v.y();
                 a1 += Vec2d(+dy, -dx);
                 a2 += Vec2d(-dy, +dx);
                 b1 += Vec2d(+dy, -dx);
    @@ -1172,102 +1054,101 @@ static void thick_lines_to_indexed_vertex_array(
             }
     
             // calculate new XY normals
    -        Vec2d xy_right_normal = unscale(line.normal()).normalized();
    +        const Vec2d xy_right_normal = unscale(line.normal()).normalized();
     
    -        int idx_a[4] = { 0, 0, 0, 0 }; // initialized to avoid warnings
    -        int idx_b[4] = { 0, 0, 0, 0 }; // initialized to avoid warnings
    -        int idx_last = int(volume.vertices_and_normals_interleaved.size() / 6);
    +        std::array idx_a = { 0, 0, 0, 0 };
    +        std::array idx_b = { 0, 0, 0, 0 };
    +        int idx_last = int(geometry.vertices_count());
     
    -        bool bottom_z_different = bottom_z_prev != bottom_z;
    +        const bool bottom_z_different = bottom_z_prev != bottom_z;
             bottom_z_prev = bottom_z;
     
    -        if (!is_first && bottom_z_different)
    -        {
    +        if (!is_first && bottom_z_different) {
                 // Found a change of the layer thickness -> Add a cap at the end of the previous segment.
    -            volume.push_quad(idx_b[BOTTOM], idx_b[LEFT], idx_b[TOP], idx_b[RIGHT]);
    +            geometry.add_triangle(idx_b[Bottom], idx_b[Left], idx_b[Top]);
    +            geometry.add_triangle(idx_b[Bottom], idx_b[Top], idx_b[Right]);
             }
     
             // Share top / bottom vertices if possible.
             if (is_first) {
    -            idx_a[TOP] = idx_last++;
    -            volume.push_geometry(a(0), a(1), top_z   , 0., 0.,  1.); 
    -        } else {
    -            idx_a[TOP] = idx_prev[TOP];
    +            idx_a[Top] = idx_last++;
    +            geometry.add_vertex(Vec3f(a.x(), a.y(), top_z), Vec3f(0.0f, 0.0f, 1.0f));
             }
    +        else
    +            idx_a[Top] = idx_prev[Top];
     
             if (is_first || bottom_z_different) {
                 // Start of the 1st line segment or a change of the layer thickness while maintaining the print_z.
    -            idx_a[BOTTOM] = idx_last ++;
    -            volume.push_geometry(a(0), a(1), bottom_z, 0., 0., -1.);
    -            idx_a[LEFT ] = idx_last ++;
    -            volume.push_geometry(a2(0), a2(1), middle_z, -xy_right_normal(0), -xy_right_normal(1), 0.0);
    -            idx_a[RIGHT] = idx_last ++;
    -            volume.push_geometry(a1(0), a1(1), middle_z, xy_right_normal(0), xy_right_normal(1), 0.0);
    -        }
    -        else {
    -            idx_a[BOTTOM] = idx_prev[BOTTOM];
    +            idx_a[Bottom] = idx_last++;
    +            geometry.add_vertex(Vec3f(a.x(), a.y(), bottom_z), Vec3f(0.0f, 0.0f, -1.0f));
    +            idx_a[Left] = idx_last++;
    +            geometry.add_vertex(Vec3f(a2.x(), a2.y(), middle_z), Vec3f(-xy_right_normal.x(), -xy_right_normal.y(), 0.0f));
    +            idx_a[Right] = idx_last++;
    +            geometry.add_vertex(Vec3f(a1.x(), a1.y(), middle_z), Vec3f(xy_right_normal.x(), xy_right_normal.y(), 0.0f));
             }
    +        else
    +            idx_a[Bottom] = idx_prev[Bottom];
     
             if (is_first) {
                 // Start of the 1st line segment.
    -            width_initial    = width;
    +            width_initial = width;
                 bottom_z_initial = bottom_z;
    -            memcpy(idx_initial, idx_a, sizeof(int) * 4);
    -        } else {
    +            idx_initial = idx_a;
    +        }
    +        else {
                 // Continuing a previous segment.
                 // Share left / right vertices if possible.
    -			double v_dot    = v_prev.dot(v);
    +            const double v_dot = v_prev.dot(v);
                 // To reduce gpu memory usage, we try to reuse vertices
                 // To reduce the visual artifacts, due to averaged normals, we allow to reuse vertices only when any of two adjacent edges 
                 // is longer than a fixed threshold.
                 // The following value is arbitrary, it comes from tests made on a bunch of models showing the visual artifacts
    -            double len_threshold = 2.5;
    +            const double len_threshold = 2.5;
     
                 // Generate new vertices if the angle between adjacent edges is greater than 45 degrees or thresholds conditions are met
    -            bool sharp = (v_dot < 0.707) || (len_prev > len_threshold) || (len > len_threshold);
    +            const bool sharp = (v_dot < 0.707) || (len_prev > len_threshold) || (len > len_threshold);
                 if (sharp) {
    -                if (!bottom_z_different)
    -                {
    +                if (!bottom_z_different) {
                         // Allocate new left / right points for the start of this segment as these points will receive their own normals to indicate a sharp turn.
    -                    idx_a[RIGHT] = idx_last++;
    -                    volume.push_geometry(a1(0), a1(1), middle_z, xy_right_normal(0), xy_right_normal(1), 0.0);
    -                    idx_a[LEFT] = idx_last++;
    -                    volume.push_geometry(a2(0), a2(1), middle_z, -xy_right_normal(0), -xy_right_normal(1), 0.0);
    -                    if (cross2(v_prev, v) > 0.) {
    +                    idx_a[Right] = idx_last++;
    +                    geometry.add_vertex(Vec3f(a1.x(), a1.y(), middle_z), Vec3f(xy_right_normal.x(), xy_right_normal.y(), 0.0f));
    +                    idx_a[Left] = idx_last++;
    +                    geometry.add_vertex(Vec3f(a2.x(), a2.y(), middle_z), Vec3f(-xy_right_normal.x(), -xy_right_normal.y(), 0.0f));
    +                    if (cross2(v_prev, v) > 0.0) {
                             // Right turn. Fill in the right turn wedge.
    -                        volume.push_triangle(idx_prev[RIGHT], idx_a[RIGHT], idx_prev[TOP]);
    -                        volume.push_triangle(idx_prev[RIGHT], idx_prev[BOTTOM], idx_a[RIGHT]);
    +                        geometry.add_triangle(idx_prev[Right], idx_a[Right], idx_prev[Top]);
    +                        geometry.add_triangle(idx_prev[Right], idx_prev[Bottom], idx_a[Right]);
                         }
                         else {
                             // Left turn. Fill in the left turn wedge.
    -                        volume.push_triangle(idx_prev[LEFT], idx_prev[TOP], idx_a[LEFT]);
    -                        volume.push_triangle(idx_prev[LEFT], idx_a[LEFT], idx_prev[BOTTOM]);
    +                        geometry.add_triangle(idx_prev[Left], idx_prev[Top], idx_a[Left]);
    +                        geometry.add_triangle(idx_prev[Left], idx_a[Left], idx_prev[Bottom]);
                         }
                     }
                 }
    -            else
    -            {
    -                if (!bottom_z_different)
    -                {
    +            else {
    +                if (!bottom_z_different) {
                         // The two successive segments are nearly collinear.
    -                    idx_a[LEFT ] = idx_prev[LEFT];
    -                    idx_a[RIGHT] = idx_prev[RIGHT];
    +                    idx_a[Left]  = idx_prev[Left];
    +                    idx_a[Right] = idx_prev[Right];
                     }
                 }
                 if (is_closing) {
                     if (!sharp) {
    -                    if (!bottom_z_different)
    -                    {
    +                    if (!bottom_z_different) {
                             // Closing a loop with smooth transition. Unify the closing left / right vertices.
    -                        memcpy(volume.vertices_and_normals_interleaved.data() + idx_initial[LEFT ] * 6, volume.vertices_and_normals_interleaved.data() + idx_prev[LEFT ] * 6, sizeof(float) * 6);
    -                        memcpy(volume.vertices_and_normals_interleaved.data() + idx_initial[RIGHT] * 6, volume.vertices_and_normals_interleaved.data() + idx_prev[RIGHT] * 6, sizeof(float) * 6);
    -                        volume.vertices_and_normals_interleaved.erase(volume.vertices_and_normals_interleaved.end() - 12, volume.vertices_and_normals_interleaved.end());
    -                        // Replace the left / right vertex indices to point to the start of the loop. 
    -                        for (size_t u = volume.quad_indices.size() - 16; u < volume.quad_indices.size(); ++ u) {
    -                            if (volume.quad_indices[u] == idx_prev[LEFT])
    -                                volume.quad_indices[u] = idx_initial[LEFT];
    -                            else if (volume.quad_indices[u] == idx_prev[RIGHT])
    -                                volume.quad_indices[u] = idx_initial[RIGHT];
    +                        geometry.set_vertex(idx_initial[Left], geometry.extract_position_3(idx_prev[Left]), geometry.extract_normal_3(idx_prev[Left]));
    +                        geometry.set_vertex(idx_initial[Right], geometry.extract_position_3(idx_prev[Right]), geometry.extract_normal_3(idx_prev[Right]));
    +                        geometry.remove_vertex(geometry.vertices_count() - 1);
    +                        geometry.remove_vertex(geometry.vertices_count() - 1);
    +                        // Replace the left / right vertex indices to point to the start of the loop.
    +                        const size_t indices_count = geometry.indices_count();
    +                        for (size_t u = indices_count - 24; u < indices_count; ++u) {
    +                            const unsigned int id = geometry.extract_index(u);
    +                            if (id == (unsigned int)idx_prev[Left])
    +                                geometry.set_index(u, (unsigned int)idx_initial[Left]);
    +                            else if (id == (unsigned int)idx_prev[Right])
    +                                geometry.set_index(u, (unsigned int)idx_initial[Right]);
                             }
                         }
                     }
    @@ -1277,235 +1158,232 @@ static void thick_lines_to_indexed_vertex_array(
             }
     
             // Only new allocate top / bottom vertices, if not closing a loop.
    -        if (is_closing) {
    -            idx_b[TOP] = idx_initial[TOP];
    -        } else {
    -            idx_b[TOP] = idx_last ++;
    -            volume.push_geometry(b(0), b(1), top_z   , 0., 0.,  1.);
    +        if (is_closing)
    +            idx_b[Top] = idx_initial[Top];
    +        else {
    +            idx_b[Top] = idx_last++;
    +            geometry.add_vertex(Vec3f(b.x(), b.y(), top_z), Vec3f(0.0f, 0.0f, 1.0f));
             }
     
    -        if (is_closing && (width == width_initial) && (bottom_z == bottom_z_initial)) {
    -            idx_b[BOTTOM] = idx_initial[BOTTOM];
    -        } else {
    -            idx_b[BOTTOM] = idx_last ++;
    -            volume.push_geometry(b(0), b(1), bottom_z, 0., 0., -1.);
    +        if (is_closing && width == width_initial && bottom_z == bottom_z_initial)
    +            idx_b[Bottom] = idx_initial[Bottom];
    +        else {
    +            idx_b[Bottom] = idx_last++;
    +            geometry.add_vertex(Vec3f(b.x(), b.y(), bottom_z), Vec3f(0.0f, 0.0f, -1.0f));
             }
             // Generate new vertices for the end of this line segment.
    -        idx_b[LEFT  ] = idx_last ++;
    -        volume.push_geometry(b2(0), b2(1), middle_z, -xy_right_normal(0), -xy_right_normal(1), 0.0);
    -        idx_b[RIGHT ] = idx_last ++;
    -        volume.push_geometry(b1(0), b1(1), middle_z, xy_right_normal(0), xy_right_normal(1), 0.0);
    +        idx_b[Left] = idx_last++;
    +        geometry.add_vertex(Vec3f(b2.x(), b2.y(), middle_z), Vec3f(-xy_right_normal.x(), -xy_right_normal.y(), 0.0f));
    +        idx_b[Right] = idx_last++;
    +        geometry.add_vertex(Vec3f(b1.x(), b1.y(), middle_z), Vec3f(xy_right_normal.x(), xy_right_normal.y(), 0.0f));
     
    -        memcpy(idx_prev, idx_b, 4 * sizeof(int));
    +        idx_prev = idx_b;
             bottom_z_prev = bottom_z;
             b1_prev = b1;
             v_prev = v;
             len_prev = len;
     
    -        if (bottom_z_different && (closed || (!is_first && !is_last)))
    -        {
    +        if (bottom_z_different && (closed || (!is_first && !is_last))) {
                 // Found a change of the layer thickness -> Add a cap at the beginning of this segment.
    -            volume.push_quad(idx_a[BOTTOM], idx_a[RIGHT], idx_a[TOP], idx_a[LEFT]);
    +            geometry.add_triangle(idx_a[Bottom], idx_a[Right], idx_a[Top]);
    +            geometry.add_triangle(idx_a[Bottom], idx_a[Top], idx_a[Left]);
             }
     
    -        if (! closed) {
    +        if (!closed) {
                 // Terminate open paths with caps.
    -            if (is_first)
    -                volume.push_quad(idx_a[BOTTOM], idx_a[RIGHT], idx_a[TOP], idx_a[LEFT]);
    +            if (is_first) {
    +                geometry.add_triangle(idx_a[Bottom], idx_a[Right], idx_a[Top]);
    +                geometry.add_triangle(idx_a[Bottom], idx_a[Top], idx_a[Left]);
    +            }
                 // We don't use 'else' because both cases are true if we have only one line.
    -            if (is_last)
    -                volume.push_quad(idx_b[BOTTOM], idx_b[LEFT], idx_b[TOP], idx_b[RIGHT]);
    +            if (is_last) {
    +                geometry.add_triangle(idx_b[Bottom], idx_b[Left], idx_b[Top]);
    +                geometry.add_triangle(idx_b[Bottom], idx_b[Top], idx_b[Right]);
    +            }
             }
     
             // Add quads for a straight hollow tube-like segment.
             // bottom-right face
    -        volume.push_quad(idx_a[BOTTOM], idx_b[BOTTOM], idx_b[RIGHT], idx_a[RIGHT]);
    +        geometry.add_triangle(idx_a[Bottom], idx_b[Bottom], idx_b[Right]);
    +        geometry.add_triangle(idx_a[Bottom], idx_b[Right], idx_a[Right]);
             // top-right face
    -        volume.push_quad(idx_a[RIGHT], idx_b[RIGHT], idx_b[TOP], idx_a[TOP]);
    +        geometry.add_triangle(idx_a[Right], idx_b[Right], idx_b[Top]);
    +        geometry.add_triangle(idx_a[Right], idx_b[Top], idx_a[Top]);
             // top-left face
    -        volume.push_quad(idx_a[TOP], idx_b[TOP], idx_b[LEFT], idx_a[LEFT]);
    +        geometry.add_triangle(idx_a[Top], idx_b[Top], idx_b[Left]);
    +        geometry.add_triangle(idx_a[Top], idx_b[Left], idx_a[Left]);
             // bottom-left face
    -        volume.push_quad(idx_a[LEFT], idx_b[LEFT], idx_b[BOTTOM], idx_a[BOTTOM]);
    +        geometry.add_triangle(idx_a[Left], idx_b[Left], idx_b[Bottom]);
    +        geometry.add_triangle(idx_a[Left], idx_b[Bottom], idx_a[Bottom]);
         }
    -
    -#undef LEFT
    -#undef RIGHT
    -#undef TOP
    -#undef BOTTOM
     }
     
     // caller is responsible for supplying NO lines with zero length
    -static void thick_lines_to_indexed_vertex_array(const Lines3& lines,
    +static void thick_lines_to_geometry(
    +    const Lines3&              lines,
         const std::vector& widths,
         const std::vector& heights,
    -    bool closed,
    -    GLIndexedVertexArray& volume)
    +    bool                       closed,
    +    GUI::GLModel::Geometry&    geometry)
     {
         assert(!lines.empty());
         if (lines.empty())
             return;
     
    -#define LEFT    0
    -#define RIGHT   1
    -#define TOP     2
    -#define BOTTOM  3
    +    enum Direction : unsigned char
    +    {
    +        Left,
    +        Right,
    +        Top,
    +        Bottom
    +    };
     
         // left, right, top, bottom
    -    int      idx_initial[4] = { -1, -1, -1, -1 };
    -    int      idx_prev[4] = { -1, -1, -1, -1 };
    -    double   z_prev = 0.0;
    -    double   len_prev = 0.0;
    -    Vec3d    n_right_prev = Vec3d::Zero();
    -    Vec3d    n_top_prev = Vec3d::Zero();
    -    Vec3d    unit_v_prev = Vec3d::Zero();
    -    double   width_initial = 0.0;
    +    std::array idx_prev    = { -1, -1, -1, -1 };
    +    std::array idx_initial = { -1, -1, -1, -1 };
    +
    +    double z_prev = 0.0;
    +    double len_prev = 0.0;
    +    Vec3d  n_right_prev = Vec3d::Zero();
    +    Vec3d  n_top_prev = Vec3d::Zero();
    +    Vec3d  unit_v_prev = Vec3d::Zero();
    +    double width_initial = 0.0;
     
         // new vertices around the line endpoints
         // left, right, top, bottom
    -    Vec3d a[4] = { Vec3d::Zero(), Vec3d::Zero(), Vec3d::Zero(), Vec3d::Zero() };
    -    Vec3d b[4] = { Vec3d::Zero(), Vec3d::Zero(), Vec3d::Zero(), Vec3d::Zero() };
    +    std::array a = { Vec3d::Zero(), Vec3d::Zero(), Vec3d::Zero(), Vec3d::Zero() };
    +    std::array b = { Vec3d::Zero(), Vec3d::Zero(), Vec3d::Zero(), Vec3d::Zero() };
     
         // loop once more in case of closed loops
    -    size_t lines_end = closed ? (lines.size() + 1) : lines.size();
    -    for (size_t ii = 0; ii < lines_end; ++ii)
    -    {
    -        size_t i = (ii == lines.size()) ? 0 : ii;
    +    const size_t lines_end = closed ? (lines.size() + 1) : lines.size();
    +    for (size_t ii = 0; ii < lines_end; ++ii) {
    +        const size_t i = (ii == lines.size()) ? 0 : ii;
     
             const Line3& line = lines[i];
    -        double height = heights[i];
    -        double width = widths[i];
    +        const double height = heights[i];
    +        const double width = widths[i];
     
    -        Vec3d unit_v = unscale(line.vector()).normalized();
    -        double len = unscale(line.length());
    +        const Vec3d unit_v = unscale(line.vector()).normalized();
    +        const double len = unscale(line.length());
     
             Vec3d n_top = Vec3d::Zero();
             Vec3d n_right = Vec3d::Zero();
    -        
    -        if ((line.a(0) == line.b(0)) && (line.a(1) == line.b(1)))
    -        {
    +
    +        if (line.a.x() == line.b.x() && line.a.y() == line.b.y()) {
                 // vertical segment
                 n_top = Vec3d::UnitY();
                 n_right = Vec3d::UnitX();
    -            if (line.a(2) < line.b(2))
    +            if (line.a.z() < line.b.z())
                     n_right = -n_right;
             }
    -        else
    -        {
    +        else {
                 // horizontal segment
                 n_right = unit_v.cross(Vec3d::UnitZ()).normalized();
                 n_top = n_right.cross(unit_v).normalized();
             }
     
    -        Vec3d rl_displacement = 0.5 * width * n_right;
    -        Vec3d tb_displacement = 0.5 * height * n_top;
    -        Vec3d l_a = unscale(line.a);
    -        Vec3d l_b = unscale(line.b);
    +        const Vec3d rl_displacement = 0.5 * width * n_right;
    +        const Vec3d tb_displacement = 0.5 * height * n_top;
    +        const Vec3d l_a = unscale(line.a);
    +        const Vec3d l_b = unscale(line.b);
     
    -        a[RIGHT] = l_a + rl_displacement;
    -        a[LEFT] = l_a - rl_displacement;
    -        a[TOP] = l_a + tb_displacement;
    -        a[BOTTOM] = l_a - tb_displacement;
    -        b[RIGHT] = l_b + rl_displacement;
    -        b[LEFT] = l_b - rl_displacement;
    -        b[TOP] = l_b + tb_displacement;
    -        b[BOTTOM] = l_b - tb_displacement;
    +        a[Right]  = l_a + rl_displacement;
    +        a[Left]   = l_a - rl_displacement;
    +        a[Top]    = l_a + tb_displacement;
    +        a[Bottom] = l_a - tb_displacement;
    +        b[Right]  = l_b + rl_displacement;
    +        b[Left]   = l_b - rl_displacement;
    +        b[Top]    = l_b + tb_displacement;
    +        b[Bottom] = l_b - tb_displacement;
     
    -        Vec3d n_bottom = -n_top;
    -        Vec3d n_left = -n_right;
    +        const Vec3d n_bottom = -n_top;
    +        const Vec3d n_left = -n_right;
     
    -        int idx_a[4];
    -        int idx_b[4];
    -        int idx_last = int(volume.vertices_and_normals_interleaved.size() / 6);
    +        std::array idx_a = { 0, 0, 0, 0};
    +        std::array idx_b = { 0, 0, 0, 0 };
    +        int idx_last = int(geometry.vertices_count());
     
    -        bool z_different = (z_prev != l_a(2));
    -        z_prev = l_b(2);
    +        const bool z_different = (z_prev != l_a.z());
    +        z_prev = l_b.z();
     
             // Share top / bottom vertices if possible.
    -        if (ii == 0)
    -        {
    -            idx_a[TOP] = idx_last++;
    -            volume.push_geometry(a[TOP], n_top);
    +        if (ii == 0) {
    +            idx_a[Top] = idx_last++;
    +            geometry.add_vertex((Vec3f)a[Top].cast(), (Vec3f)n_top.cast());
             }
             else
    -            idx_a[TOP] = idx_prev[TOP];
    +            idx_a[Top] = idx_prev[Top];
     
    -        if ((ii == 0) || z_different)
    -        {
    +        if (ii == 0 || z_different) {
                 // Start of the 1st line segment or a change of the layer thickness while maintaining the print_z.
    -            idx_a[BOTTOM] = idx_last++;
    -            volume.push_geometry(a[BOTTOM], n_bottom);
    -            idx_a[LEFT] = idx_last++;
    -            volume.push_geometry(a[LEFT], n_left);
    -            idx_a[RIGHT] = idx_last++;
    -            volume.push_geometry(a[RIGHT], n_right);
    +            idx_a[Bottom] = idx_last++;
    +            geometry.add_vertex((Vec3f)a[Bottom].cast(), (Vec3f)n_bottom.cast());
    +            idx_a[Left] = idx_last++;
    +            geometry.add_vertex((Vec3f)a[Left].cast(), (Vec3f)n_left.cast());
    +            idx_a[Right] = idx_last++;
    +            geometry.add_vertex((Vec3f)a[Right].cast(), (Vec3f)n_right.cast());
             }
             else
    -            idx_a[BOTTOM] = idx_prev[BOTTOM];
    +            idx_a[Bottom] = idx_prev[Bottom];
     
    -        if (ii == 0)
    -        {
    +        if (ii == 0) {
                 // Start of the 1st line segment.
                 width_initial = width;
    -            ::memcpy(idx_initial, idx_a, sizeof(int) * 4);
    +            idx_initial =  idx_a;
             }
    -        else
    -        {
    +        else {
                 // Continuing a previous segment.
                 // Share left / right vertices if possible.
    -            double v_dot = unit_v_prev.dot(unit_v);
    -            bool is_right_turn = n_top_prev.dot(unit_v_prev.cross(unit_v)) > 0.0;
    +            const double v_dot = unit_v_prev.dot(unit_v);
    +            const bool is_right_turn = n_top_prev.dot(unit_v_prev.cross(unit_v)) > 0.0;
     
                 // To reduce gpu memory usage, we try to reuse vertices
                 // To reduce the visual artifacts, due to averaged normals, we allow to reuse vertices only when any of two adjacent edges 
                 // is longer than a fixed threshold.
                 // The following value is arbitrary, it comes from tests made on a bunch of models showing the visual artifacts
    -            double len_threshold = 2.5;
    +            const double len_threshold = 2.5;
     
                 // Generate new vertices if the angle between adjacent edges is greater than 45 degrees or thresholds conditions are met
    -            bool is_sharp = (v_dot < 0.707) || (len_prev > len_threshold) || (len > len_threshold);
    -            if (is_sharp)
    -            {
    +            const bool is_sharp = v_dot < 0.707 || len_prev > len_threshold || len > len_threshold;
    +            if (is_sharp) {
                     // Allocate new left / right points for the start of this segment as these points will receive their own normals to indicate a sharp turn.
    -                idx_a[RIGHT] = idx_last++;
    -                volume.push_geometry(a[RIGHT], n_right);
    -                idx_a[LEFT] = idx_last++;
    -                volume.push_geometry(a[LEFT], n_left);
    +                idx_a[Right] = idx_last++;
    +                geometry.add_vertex((Vec3f)a[Right].cast(), (Vec3f)n_right.cast());
    +                idx_a[Left] = idx_last++;
    +                geometry.add_vertex((Vec3f)a[Left].cast(), (Vec3f)n_left.cast());
     
    -                if (is_right_turn)
    -                {
    +                if (is_right_turn) {
                         // Right turn. Fill in the right turn wedge.
    -                    volume.push_triangle(idx_prev[RIGHT], idx_a[RIGHT], idx_prev[TOP]);
    -                    volume.push_triangle(idx_prev[RIGHT], idx_prev[BOTTOM], idx_a[RIGHT]);
    +                    geometry.add_triangle(idx_prev[Right], idx_a[Right], idx_prev[Top]);
    +                    geometry.add_triangle(idx_prev[Right], idx_prev[Bottom], idx_a[Right]);
                     }
    -                else
    -                {
    +                else {
                         // Left turn. Fill in the left turn wedge.
    -                    volume.push_triangle(idx_prev[LEFT], idx_prev[TOP], idx_a[LEFT]);
    -                    volume.push_triangle(idx_prev[LEFT], idx_a[LEFT], idx_prev[BOTTOM]);
    +                    geometry.add_triangle(idx_prev[Left], idx_prev[Top], idx_a[Left]);
    +                    geometry.add_triangle(idx_prev[Left], idx_a[Left], idx_prev[Bottom]);
                     }
                 }
    -            else
    -            {
    +            else {
                     // The two successive segments are nearly collinear.
    -                idx_a[LEFT] = idx_prev[LEFT];
    -                idx_a[RIGHT] = idx_prev[RIGHT];
    +                idx_a[Left] = idx_prev[Left];
    +                idx_a[Right] = idx_prev[Right];
                 }
     
    -            if (ii == lines.size())
    -            {
    -                if (!is_sharp)
    -                {
    +            if (ii == lines.size()) {
    +                if (!is_sharp) {
                         // Closing a loop with smooth transition. Unify the closing left / right vertices.
    -                    ::memcpy(volume.vertices_and_normals_interleaved.data() + idx_initial[LEFT] * 6, volume.vertices_and_normals_interleaved.data() + idx_prev[LEFT] * 6, sizeof(float) * 6);
    -                    ::memcpy(volume.vertices_and_normals_interleaved.data() + idx_initial[RIGHT] * 6, volume.vertices_and_normals_interleaved.data() + idx_prev[RIGHT] * 6, sizeof(float) * 6);
    -                    volume.vertices_and_normals_interleaved.erase(volume.vertices_and_normals_interleaved.end() - 12, volume.vertices_and_normals_interleaved.end());
    -                    // Replace the left / right vertex indices to point to the start of the loop. 
    -                    for (size_t u = volume.quad_indices.size() - 16; u < volume.quad_indices.size(); ++u)
    -                    {
    -                        if (volume.quad_indices[u] == idx_prev[LEFT])
    -                            volume.quad_indices[u] = idx_initial[LEFT];
    -                        else if (volume.quad_indices[u] == idx_prev[RIGHT])
    -                            volume.quad_indices[u] = idx_initial[RIGHT];
    +                    geometry.set_vertex(idx_initial[Left], geometry.extract_position_3(idx_prev[Left]), geometry.extract_normal_3(idx_prev[Left]));
    +                    geometry.set_vertex(idx_initial[Right], geometry.extract_position_3(idx_prev[Right]), geometry.extract_normal_3(idx_prev[Right]));
    +                    geometry.remove_vertex(geometry.vertices_count() - 1);
    +                    geometry.remove_vertex(geometry.vertices_count() - 1);
    +                    // Replace the left / right vertex indices to point to the start of the loop.
    +                    const size_t indices_count = geometry.indices_count();
    +                    for (size_t u = indices_count - 24; u < indices_count; ++u) {
    +                        const unsigned int id = geometry.extract_index(u);
    +                        if (id == (unsigned int)idx_prev[Left])
    +                            geometry.set_index(u, (unsigned int)idx_initial[Left]);
    +                        else if (id == (unsigned int)idx_prev[Right])
    +                            geometry.set_index(u, (unsigned int)idx_initial[Right]);
                         }
                     }
     
    @@ -1515,246 +1393,161 @@ static void thick_lines_to_indexed_vertex_array(const Lines3& lines,
             }
     
             // Only new allocate top / bottom vertices, if not closing a loop.
    -        if (closed && (ii + 1 == lines.size()))
    -            idx_b[TOP] = idx_initial[TOP];
    -        else
    -        {
    -            idx_b[TOP] = idx_last++;
    -            volume.push_geometry(b[TOP], n_top);
    +        if (closed && ii + 1 == lines.size())
    +            idx_b[Top] = idx_initial[Top];
    +        else {
    +            idx_b[Top] = idx_last++;
    +            geometry.add_vertex((Vec3f)b[Top].cast(), (Vec3f)n_top.cast());
             }
     
    -        if (closed && (ii + 1 == lines.size()) && (width == width_initial))
    -            idx_b[BOTTOM] = idx_initial[BOTTOM];
    -        else
    -        {
    -            idx_b[BOTTOM] = idx_last++;
    -            volume.push_geometry(b[BOTTOM], n_bottom);
    +        if (closed && ii + 1 == lines.size() && width == width_initial)
    +            idx_b[Bottom] = idx_initial[Bottom];
    +        else {
    +            idx_b[Bottom] = idx_last++;
    +            geometry.add_vertex((Vec3f)b[Bottom].cast(), (Vec3f)n_bottom.cast());
             }
     
             // Generate new vertices for the end of this line segment.
    -        idx_b[LEFT] = idx_last++;
    -        volume.push_geometry(b[LEFT], n_left);
    -        idx_b[RIGHT] = idx_last++;
    -        volume.push_geometry(b[RIGHT], n_right);
    +        idx_b[Left] = idx_last++;
    +        geometry.add_vertex((Vec3f)b[Left].cast(), (Vec3f)n_left.cast());
    +        idx_b[Right] = idx_last++;
    +        geometry.add_vertex((Vec3f)b[Right].cast(), (Vec3f)n_right.cast());
     
    -        ::memcpy(idx_prev, idx_b, 4 * sizeof(int));
    +        idx_prev = idx_b;
             n_right_prev = n_right;
             n_top_prev = n_top;
             unit_v_prev = unit_v;
             len_prev = len;
     
    -        if (!closed)
    -        {
    +        if (!closed) {
                 // Terminate open paths with caps.
    -            if (i == 0)
    -                volume.push_quad(idx_a[BOTTOM], idx_a[RIGHT], idx_a[TOP], idx_a[LEFT]);
    +            if (i == 0) {
    +                geometry.add_triangle(idx_a[Bottom], idx_a[Right], idx_a[Top]);
    +                geometry.add_triangle(idx_a[Bottom], idx_a[Top], idx_a[Left]);
    +            }
     
                 // We don't use 'else' because both cases are true if we have only one line.
    -            if (i + 1 == lines.size())
    -                volume.push_quad(idx_b[BOTTOM], idx_b[LEFT], idx_b[TOP], idx_b[RIGHT]);
    +            if (i + 1 == lines.size()) {
    +                geometry.add_triangle(idx_b[Bottom], idx_b[Left], idx_b[Top]);
    +                geometry.add_triangle(idx_b[Bottom], idx_b[Top], idx_b[Right]);
    +            }
             }
     
             // Add quads for a straight hollow tube-like segment.
             // bottom-right face
    -        volume.push_quad(idx_a[BOTTOM], idx_b[BOTTOM], idx_b[RIGHT], idx_a[RIGHT]);
    +        geometry.add_triangle(idx_a[Bottom], idx_b[Bottom], idx_b[Right]);
    +        geometry.add_triangle(idx_a[Bottom], idx_b[Right], idx_a[Right]);
             // top-right face
    -        volume.push_quad(idx_a[RIGHT], idx_b[RIGHT], idx_b[TOP], idx_a[TOP]);
    +        geometry.add_triangle(idx_a[Right], idx_b[Right], idx_b[Top]);
    +        geometry.add_triangle(idx_a[Right], idx_b[Top], idx_a[Top]);
             // top-left face
    -        volume.push_quad(idx_a[TOP], idx_b[TOP], idx_b[LEFT], idx_a[LEFT]);
    +        geometry.add_triangle(idx_a[Top], idx_b[Top], idx_b[Left]);
    +        geometry.add_triangle(idx_a[Top], idx_b[Left], idx_a[Left]);
             // bottom-left face
    -        volume.push_quad(idx_a[LEFT], idx_b[LEFT], idx_b[BOTTOM], idx_a[BOTTOM]);
    -    }
    -
    -#undef LEFT
    -#undef RIGHT
    -#undef TOP
    -#undef BOTTOM
    -}
    -
    -static void point_to_indexed_vertex_array(const Vec3crd& point,
    -    double width,
    -    double height,
    -    GLIndexedVertexArray& volume)
    -{
    -    // builds a double piramid, with vertices on the local axes, around the point
    -
    -    Vec3d center = unscale(point);
    -
    -    double scale_factor = 1.0;
    -    double w = scale_factor * width;
    -    double h = scale_factor * height;
    -
    -    // new vertices ids
    -    int idx_last = int(volume.vertices_and_normals_interleaved.size() / 6);
    -    int idxs[6];
    -    for (int i = 0; i < 6; ++i)
    -    {
    -        idxs[i] = idx_last + i;
    +        geometry.add_triangle(idx_a[Left], idx_b[Left], idx_b[Bottom]);
    +        geometry.add_triangle(idx_a[Left], idx_b[Bottom], idx_a[Bottom]);
         }
    -
    -    Vec3d displacement_x(w, 0.0, 0.0);
    -    Vec3d displacement_y(0.0, w, 0.0);
    -    Vec3d displacement_z(0.0, 0.0, h);
    -
    -    Vec3d unit_x(1.0, 0.0, 0.0);
    -    Vec3d unit_y(0.0, 1.0, 0.0);
    -    Vec3d unit_z(0.0, 0.0, 1.0);
    -
    -    // vertices
    -    volume.push_geometry(center - displacement_x, -unit_x); // idxs[0]
    -    volume.push_geometry(center + displacement_x, unit_x);  // idxs[1]
    -    volume.push_geometry(center - displacement_y, -unit_y); // idxs[2]
    -    volume.push_geometry(center + displacement_y, unit_y);  // idxs[3]
    -    volume.push_geometry(center - displacement_z, -unit_z); // idxs[4]
    -    volume.push_geometry(center + displacement_z, unit_z);  // idxs[5]
    -
    -    // top piramid faces
    -    volume.push_triangle(idxs[0], idxs[2], idxs[5]);
    -    volume.push_triangle(idxs[2], idxs[1], idxs[5]);
    -    volume.push_triangle(idxs[1], idxs[3], idxs[5]);
    -    volume.push_triangle(idxs[3], idxs[0], idxs[5]);
    -
    -    // bottom piramid faces
    -    volume.push_triangle(idxs[2], idxs[0], idxs[4]);
    -    volume.push_triangle(idxs[1], idxs[2], idxs[4]);
    -    volume.push_triangle(idxs[3], idxs[1], idxs[4]);
    -    volume.push_triangle(idxs[0], idxs[3], idxs[4]);
     }
     
     void _3DScene::thick_lines_to_verts(
    -    const Lines                 &lines,
    -    const std::vector   &widths,
    -    const std::vector   &heights, 
    -    bool                         closed,
    -    double                       top_z,
    -    GLVolume                    &volume)
    -{
    -    thick_lines_to_indexed_vertex_array(lines, widths, heights, closed, top_z, volume.indexed_vertex_array);
    -}
    -
    -void _3DScene::thick_lines_to_verts(const Lines3& lines,
    +    const Lines&               lines,
         const std::vector& widths,
         const std::vector& heights,
    -    bool closed,
    -    GLVolume& volume)
    +    bool                       closed,
    +    double                     top_z,
    +    GUI::GLModel::Geometry&    geometry)
     {
    -    thick_lines_to_indexed_vertex_array(lines, widths, heights, closed, volume.indexed_vertex_array);
    +    thick_lines_to_geometry(lines, widths, heights, closed, top_z, geometry);
     }
     
    -static void thick_point_to_verts(const Vec3crd& point,
    -    double width,
    -    double height,
    -    GLVolume& volume)
    -{
    -    point_to_indexed_vertex_array(point, width, height, volume.indexed_vertex_array);
    -}
    -
    -void _3DScene::extrusionentity_to_verts(const Polyline &polyline, float width, float height, float print_z, GLVolume& volume)
    -{
    -	if (polyline.size() >= 2) {
    -		size_t num_segments = polyline.size() - 1;
    -		thick_lines_to_verts(polyline.lines(), std::vector(num_segments, width), std::vector(num_segments, height), false, print_z, volume);
    -	}
    -}
    -
    -// Fill in the qverts and tverts with quads and triangles for the extrusion_path.
    -void _3DScene::extrusionentity_to_verts(const ExtrusionPath &extrusion_path, float print_z, GLVolume &volume)
    +void _3DScene::thick_lines_to_verts(
    +    const Lines3&              lines,
    +    const std::vector& widths,
    +    const std::vector& heights,
    +    bool                       closed,
    +    GUI::GLModel::Geometry&    geometry)
     {
    -	extrusionentity_to_verts(extrusion_path.polyline, extrusion_path.width, extrusion_path.height, print_z, volume);
    +    thick_lines_to_geometry(lines, widths, heights, closed, geometry);
     }
     
     // Fill in the qverts and tverts with quads and triangles for the extrusion_path.
    -void _3DScene::extrusionentity_to_verts(const ExtrusionPath &extrusion_path, float print_z, const Point ©, GLVolume &volume)
    +void _3DScene::extrusionentity_to_verts(const ExtrusionPath& extrusion_path, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry)
     {
         Polyline            polyline = extrusion_path.polyline;
         polyline.remove_duplicate_points();
         polyline.translate(copy);
    -    Lines               lines = polyline.lines();
    +    const Lines               lines = polyline.lines();
         std::vector widths(lines.size(), extrusion_path.width);
         std::vector heights(lines.size(), extrusion_path.height);
    -    thick_lines_to_verts(lines, widths, heights, false, print_z, volume);
    +    thick_lines_to_verts(lines, widths, heights, false, print_z, geometry);
     }
     
     // Fill in the qverts and tverts with quads and triangles for the extrusion_loop.
    -void _3DScene::extrusionentity_to_verts(const ExtrusionLoop &extrusion_loop, float print_z, const Point ©, GLVolume &volume)
    +void _3DScene::extrusionentity_to_verts(const ExtrusionLoop& extrusion_loop, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry)
     {
         Lines               lines;
         std::vector widths;
         std::vector heights;
    -    for (const ExtrusionPath &extrusion_path : extrusion_loop.paths) {
    +    for (const ExtrusionPath& extrusion_path : extrusion_loop.paths) {
             Polyline            polyline = extrusion_path.polyline;
             polyline.remove_duplicate_points();
             polyline.translate(copy);
    -        Lines lines_this = polyline.lines();
    +        const Lines lines_this = polyline.lines();
             append(lines, lines_this);
             widths.insert(widths.end(), lines_this.size(), extrusion_path.width);
             heights.insert(heights.end(), lines_this.size(), extrusion_path.height);
         }
    -    thick_lines_to_verts(lines, widths, heights, true, print_z, volume);
    +    thick_lines_to_verts(lines, widths, heights, true, print_z, geometry);
     }
     
     // Fill in the qverts and tverts with quads and triangles for the extrusion_multi_path.
    -void _3DScene::extrusionentity_to_verts(const ExtrusionMultiPath &extrusion_multi_path, float print_z, const Point ©, GLVolume &volume)
    +void _3DScene::extrusionentity_to_verts(const ExtrusionMultiPath& extrusion_multi_path, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry)
     {
         Lines               lines;
         std::vector widths;
         std::vector heights;
    -    for (const ExtrusionPath &extrusion_path : extrusion_multi_path.paths) {
    +    for (const ExtrusionPath& extrusion_path : extrusion_multi_path.paths) {
             Polyline            polyline = extrusion_path.polyline;
             polyline.remove_duplicate_points();
             polyline.translate(copy);
    -        Lines lines_this = polyline.lines();
    +        const Lines lines_this = polyline.lines();
             append(lines, lines_this);
             widths.insert(widths.end(), lines_this.size(), extrusion_path.width);
             heights.insert(heights.end(), lines_this.size(), extrusion_path.height);
         }
    -    thick_lines_to_verts(lines, widths, heights, false, print_z, volume);
    +    thick_lines_to_verts(lines, widths, heights, false, print_z, geometry);
     }
     
    -void _3DScene::extrusionentity_to_verts(const ExtrusionEntityCollection &extrusion_entity_collection, float print_z, const Point ©, GLVolume &volume)
    +void _3DScene::extrusionentity_to_verts(const ExtrusionEntityCollection& extrusion_entity_collection, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry)
     {
    -    for (const ExtrusionEntity *extrusion_entity : extrusion_entity_collection.entities)
    -        extrusionentity_to_verts(extrusion_entity, print_z, copy, volume);
    +    for (const ExtrusionEntity* extrusion_entity : extrusion_entity_collection.entities)
    +        extrusionentity_to_verts(extrusion_entity, print_z, copy, geometry);
     }
     
    -void _3DScene::extrusionentity_to_verts(const ExtrusionEntity *extrusion_entity, float print_z, const Point ©, GLVolume &volume)
    +void _3DScene::extrusionentity_to_verts(const ExtrusionEntity* extrusion_entity, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry)
     {
         if (extrusion_entity != nullptr) {
    -        auto *extrusion_path = dynamic_cast(extrusion_entity);
    +        auto* extrusion_path = dynamic_cast(extrusion_entity);
             if (extrusion_path != nullptr)
    -            extrusionentity_to_verts(*extrusion_path, print_z, copy, volume);
    +            extrusionentity_to_verts(*extrusion_path, print_z, copy, geometry);
             else {
    -            auto *extrusion_loop = dynamic_cast(extrusion_entity);
    +            auto* extrusion_loop = dynamic_cast(extrusion_entity);
                 if (extrusion_loop != nullptr)
    -                extrusionentity_to_verts(*extrusion_loop, print_z, copy, volume);
    +                extrusionentity_to_verts(*extrusion_loop, print_z, copy, geometry);
                 else {
    -                auto *extrusion_multi_path = dynamic_cast(extrusion_entity);
    +                auto* extrusion_multi_path = dynamic_cast(extrusion_entity);
                     if (extrusion_multi_path != nullptr)
    -                    extrusionentity_to_verts(*extrusion_multi_path, print_z, copy, volume);
    +                    extrusionentity_to_verts(*extrusion_multi_path, print_z, copy, geometry);
                     else {
    -                    auto *extrusion_entity_collection = dynamic_cast(extrusion_entity);
    +                    auto* extrusion_entity_collection = dynamic_cast(extrusion_entity);
                         if (extrusion_entity_collection != nullptr)
    -                        extrusionentity_to_verts(*extrusion_entity_collection, print_z, copy, volume);
    -                    else {
    +                        extrusionentity_to_verts(*extrusion_entity_collection, print_z, copy, geometry);
    +                    else
                             throw Slic3r::RuntimeError("Unexpected extrusion_entity type in to_verts()");
    -                    }
                     }
                 }
             }
         }
     }
     
    -void _3DScene::polyline3_to_verts(const Polyline3& polyline, double width, double height, GLVolume& volume)
    -{
    -    Lines3 lines = polyline.lines();
    -    std::vector widths(lines.size(), width);
    -    std::vector heights(lines.size(), height);
    -    thick_lines_to_verts(lines, widths, heights, false, volume);
    -}
    -
    -void _3DScene::point3_to_verts(const Vec3crd& point, double width, double height, GLVolume& volume)
    -{
    -    thick_point_to_verts(point, width, height, volume);
    -}
    -
     } // namespace Slic3r
    diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp
    index 6d82e3bb7c0..2f7e0a76722 100644
    --- a/src/slic3r/GUI/3DScene.hpp
    +++ b/src/slic3r/GUI/3DScene.hpp
    @@ -7,8 +7,10 @@
     #include "libslic3r/TriangleMesh.hpp"
     #include "libslic3r/Utils.hpp"
     #include "libslic3r/Geometry.hpp"
    +#include "libslic3r/Color.hpp"
     
     #include "GLModel.hpp"
    +#include "MeshUtils.hpp"
     
     #include 
     #include 
    @@ -43,221 +45,20 @@ class ModelVolume;
     enum ModelInstanceEPrintVolumeState : unsigned char;
     
     // Return appropriate color based on the ModelVolume.
    -std::array color_from_model_volume(const ModelVolume& model_volume);
    -
    -// A container for interleaved arrays of 3D vertices and normals,
    -// possibly indexed by triangles and / or quads.
    -class GLIndexedVertexArray {
    -public:
    -    // Only Eigen types of Nx16 size are vectorized. This bounding box will not be vectorized.
    -    static_assert(sizeof(Eigen::AlignedBox) == 24, "Eigen::AlignedBox is not being vectorized, thus it does not need to be aligned");
    -    using BoundingBox = Eigen::AlignedBox;
    -
    -    GLIndexedVertexArray() { m_bounding_box.setEmpty(); }
    -    GLIndexedVertexArray(const GLIndexedVertexArray &rhs) :
    -        vertices_and_normals_interleaved(rhs.vertices_and_normals_interleaved),
    -        triangle_indices(rhs.triangle_indices),
    -        quad_indices(rhs.quad_indices),
    -        m_bounding_box(rhs.m_bounding_box)
    -        { assert(! rhs.has_VBOs()); m_bounding_box.setEmpty(); }
    -    GLIndexedVertexArray(GLIndexedVertexArray &&rhs) :
    -        vertices_and_normals_interleaved(std::move(rhs.vertices_and_normals_interleaved)),
    -        triangle_indices(std::move(rhs.triangle_indices)),
    -        quad_indices(std::move(rhs.quad_indices)),
    -        m_bounding_box(rhs.m_bounding_box)
    -        { assert(! rhs.has_VBOs()); }
    -
    -    ~GLIndexedVertexArray() { release_geometry(); }
    -
    -    GLIndexedVertexArray& operator=(const GLIndexedVertexArray &rhs)
    -    {
    -        assert(vertices_and_normals_interleaved_VBO_id == 0);
    -        assert(triangle_indices_VBO_id == 0);
    -        assert(quad_indices_VBO_id == 0);
    -        assert(rhs.vertices_and_normals_interleaved_VBO_id == 0);
    -        assert(rhs.triangle_indices_VBO_id == 0);
    -        assert(rhs.quad_indices_VBO_id == 0);
    -        this->vertices_and_normals_interleaved 		 = rhs.vertices_and_normals_interleaved;
    -        this->triangle_indices                 		 = rhs.triangle_indices;
    -        this->quad_indices                     		 = rhs.quad_indices;
    -        this->m_bounding_box                   		 = rhs.m_bounding_box;
    -        this->vertices_and_normals_interleaved_size  = rhs.vertices_and_normals_interleaved_size;
    -        this->triangle_indices_size                  = rhs.triangle_indices_size;
    -        this->quad_indices_size                      = rhs.quad_indices_size;
    -        return *this;
    -    }
    -
    -    GLIndexedVertexArray& operator=(GLIndexedVertexArray &&rhs) 
    -    {
    -        assert(vertices_and_normals_interleaved_VBO_id == 0);
    -        assert(triangle_indices_VBO_id == 0);
    -        assert(quad_indices_VBO_id == 0);
    -        assert(rhs.vertices_and_normals_interleaved_VBO_id == 0);
    -        assert(rhs.triangle_indices_VBO_id == 0);
    -        assert(rhs.quad_indices_VBO_id == 0);
    -        this->vertices_and_normals_interleaved 		 = std::move(rhs.vertices_and_normals_interleaved);
    -        this->triangle_indices                 		 = std::move(rhs.triangle_indices);
    -        this->quad_indices                     		 = std::move(rhs.quad_indices);
    -        this->m_bounding_box                   		 = rhs.m_bounding_box;
    -        this->vertices_and_normals_interleaved_size  = rhs.vertices_and_normals_interleaved_size;
    -        this->triangle_indices_size                  = rhs.triangle_indices_size;
    -        this->quad_indices_size                      = rhs.quad_indices_size;
    -        return *this;
    -    }
    -
    -    // Vertices and their normals, interleaved to be used by void glInterleavedArrays(GL_N3F_V3F, 0, x)
    -    std::vector vertices_and_normals_interleaved;
    -    std::vector   triangle_indices;
    -    std::vector   quad_indices;
    -
    -    // When the geometry data is loaded into the graphics card as Vertex Buffer Objects,
    -    // the above mentioned std::vectors are cleared and the following variables keep their original length.
    -    size_t vertices_and_normals_interleaved_size{ 0 };
    -    size_t triangle_indices_size{ 0 };
    -    size_t quad_indices_size{ 0 };
    -
    -    // IDs of the Vertex Array Objects, into which the geometry has been loaded.
    -    // Zero if the VBOs are not sent to GPU yet.
    -    unsigned int       vertices_and_normals_interleaved_VBO_id{ 0 };
    -    unsigned int       triangle_indices_VBO_id{ 0 };
    -    unsigned int       quad_indices_VBO_id{ 0 };
    -
    -#if ENABLE_SMOOTH_NORMALS
    -    void load_mesh_full_shading(const TriangleMesh& mesh, bool smooth_normals = false);
    -    void load_mesh(const TriangleMesh& mesh, bool smooth_normals = false) { this->load_mesh_full_shading(mesh, smooth_normals); }
    -#else
    -    void load_mesh_full_shading(const TriangleMesh& mesh);
    -    void load_mesh(const TriangleMesh& mesh) { this->load_mesh_full_shading(mesh); }
    -#endif // ENABLE_SMOOTH_NORMALS
    -
    -    void load_its_flat_shading(const indexed_triangle_set &its);
    -
    -    inline bool has_VBOs() const { return vertices_and_normals_interleaved_VBO_id != 0; }
    -
    -    inline void reserve(size_t sz) {
    -        this->vertices_and_normals_interleaved.reserve(sz * 6);
    -        this->triangle_indices.reserve(sz * 3);
    -        this->quad_indices.reserve(sz * 4);
    -    }
    -
    -    inline void push_geometry(float x, float y, float z, float nx, float ny, float nz) {
    -        assert(this->vertices_and_normals_interleaved_VBO_id == 0);
    -        if (this->vertices_and_normals_interleaved_VBO_id != 0)
    -            return;
    -
    -        if (this->vertices_and_normals_interleaved.size() + 6 > this->vertices_and_normals_interleaved.capacity())
    -            this->vertices_and_normals_interleaved.reserve(next_highest_power_of_2(this->vertices_and_normals_interleaved.size() + 6));
    -        this->vertices_and_normals_interleaved.emplace_back(nx);
    -        this->vertices_and_normals_interleaved.emplace_back(ny);
    -        this->vertices_and_normals_interleaved.emplace_back(nz);
    -        this->vertices_and_normals_interleaved.emplace_back(x);
    -        this->vertices_and_normals_interleaved.emplace_back(y);
    -        this->vertices_and_normals_interleaved.emplace_back(z);
    -
    -        this->vertices_and_normals_interleaved_size = this->vertices_and_normals_interleaved.size();
    -        m_bounding_box.extend(Vec3f(x, y, z));
    -    };
    -
    -    inline void push_geometry(double x, double y, double z, double nx, double ny, double nz) {
    -        push_geometry(float(x), float(y), float(z), float(nx), float(ny), float(nz));
    -    }
    -
    -    template
    -    inline void push_geometry(const Eigen::MatrixBase& p, const Eigen::MatrixBase& n) {
    -        push_geometry(float(p(0)), float(p(1)), float(p(2)), float(n(0)), float(n(1)), float(n(2)));
    -    }
    -
    -    inline void push_triangle(int idx1, int idx2, int idx3) {
    -        assert(this->vertices_and_normals_interleaved_VBO_id == 0);
    -        if (this->vertices_and_normals_interleaved_VBO_id != 0)
    -            return;
    -
    -        if (this->triangle_indices.size() + 3 > this->vertices_and_normals_interleaved.capacity())
    -            this->triangle_indices.reserve(next_highest_power_of_2(this->triangle_indices.size() + 3));
    -        this->triangle_indices.emplace_back(idx1);
    -        this->triangle_indices.emplace_back(idx2);
    -        this->triangle_indices.emplace_back(idx3);
    -        this->triangle_indices_size = this->triangle_indices.size();
    -    };
    -
    -    inline void push_quad(int idx1, int idx2, int idx3, int idx4) {
    -        assert(this->vertices_and_normals_interleaved_VBO_id == 0);
    -        if (this->vertices_and_normals_interleaved_VBO_id != 0)
    -            return;
    -
    -        if (this->quad_indices.size() + 4 > this->vertices_and_normals_interleaved.capacity())
    -            this->quad_indices.reserve(next_highest_power_of_2(this->quad_indices.size() + 4));
    -        this->quad_indices.emplace_back(idx1);
    -        this->quad_indices.emplace_back(idx2);
    -        this->quad_indices.emplace_back(idx3);
    -        this->quad_indices.emplace_back(idx4);
    -        this->quad_indices_size = this->quad_indices.size();
    -    };
    -
    -    // Finalize the initialization of the geometry & indices,
    -    // upload the geometry and indices to OpenGL VBO objects
    -    // and shrink the allocated data, possibly relasing it if it has been loaded into the VBOs.
    -    void finalize_geometry(bool opengl_initialized);
    -    // Release the geometry data, release OpenGL VBOs.
    -    void release_geometry();
    -
    -    void render() const;
    -    void render(const std::pair& tverts_range, const std::pair& qverts_range) const;
    -
    -    // Is there any geometry data stored?
    -    bool empty() const { return vertices_and_normals_interleaved_size == 0; }
    -
    -    void clear() {
    -        this->vertices_and_normals_interleaved.clear();
    -        this->triangle_indices.clear();
    -        this->quad_indices.clear();
    -        vertices_and_normals_interleaved_size = 0;
    -        triangle_indices_size = 0;
    -        quad_indices_size = 0;
    -        m_bounding_box.setEmpty();
    -    }
    -
    -    // Shrink the internal storage to tighly fit the data stored.
    -    void shrink_to_fit() {
    -        this->vertices_and_normals_interleaved.shrink_to_fit();
    -        this->triangle_indices.shrink_to_fit();
    -        this->quad_indices.shrink_to_fit();
    -    }
    -
    -    const BoundingBox& bounding_box() const { return m_bounding_box; }
    -
    -    // Return an estimate of the memory consumed by this class.
    -    size_t cpu_memory_used() const { return sizeof(*this) + vertices_and_normals_interleaved.capacity() * sizeof(float) + triangle_indices.capacity() * sizeof(int) + quad_indices.capacity() * sizeof(int); }
    -    // Return an estimate of the memory held by GPU vertex buffers.
    -    size_t gpu_memory_used() const
    -    {
    -    	size_t memsize = 0;
    -    	if (this->vertices_and_normals_interleaved_VBO_id != 0)
    -    		memsize += this->vertices_and_normals_interleaved_size * 4;
    -    	if (this->triangle_indices_VBO_id != 0)
    -    		memsize += this->triangle_indices_size * 4;
    -    	if (this->quad_indices_VBO_id != 0)
    -    		memsize += this->quad_indices_size * 4;
    -    	return memsize;
    -    }
    -    size_t total_memory_used() const { return this->cpu_memory_used() + this->gpu_memory_used(); }
    -
    -private:
    -    BoundingBox m_bounding_box;
    -};
    +extern ColorRGBA color_from_model_volume(const ModelVolume& model_volume);
     
     class GLVolume {
     public:
    -    static const std::array SELECTED_COLOR;
    -    static const std::array HOVER_SELECT_COLOR;
    -    static const std::array HOVER_DESELECT_COLOR;
    -    static const std::array OUTSIDE_COLOR;
    -    static const std::array SELECTED_OUTSIDE_COLOR;
    -    static const std::array DISABLED_COLOR;
    -    static const std::array SLA_SUPPORT_COLOR;
    -    static const std::array SLA_PAD_COLOR;
    -    static const std::array NEUTRAL_COLOR;
    -    static const std::array, 4> MODEL_COLOR;
    +    static const ColorRGBA SELECTED_COLOR;
    +    static const ColorRGBA HOVER_SELECT_COLOR;
    +    static const ColorRGBA HOVER_DESELECT_COLOR;
    +    static const ColorRGBA OUTSIDE_COLOR;
    +    static const ColorRGBA SELECTED_OUTSIDE_COLOR;
    +    static const ColorRGBA DISABLED_COLOR;
    +    static const ColorRGBA SLA_SUPPORT_COLOR;
    +    static const ColorRGBA SLA_PAD_COLOR;
    +    static const ColorRGBA NEUTRAL_COLOR;
    +    static const std::array MODEL_COLOR;
     
         enum EHoverState : unsigned char
         {
    @@ -267,8 +68,8 @@ class GLVolume {
             HS_Deselect
         };
     
    -    GLVolume(float r = 1.f, float g = 1.f, float b = 1.f, float a = 1.f);
    -    GLVolume(const std::array& rgba) : GLVolume(rgba[0], rgba[1], rgba[2], rgba[3]) {}
    +    GLVolume(float r = 1.0f, float g = 1.0f, float b = 1.0f, float a = 1.0f);
    +    GLVolume(const ColorRGBA& color) : GLVolume(color.r(), color.g(), color.b(), color.a()) {}
     
     private:
         Geometry::Transformation m_instance_transformation;
    @@ -303,11 +104,28 @@ class GLVolume {
     
         SinkingContours m_sinking_contours;
     
    +    class NonManifoldEdges
    +    {
    +        GLVolume& m_parent;
    +        GUI::GLModel m_model;
    +        bool m_update_needed{ true };
    +
    +    public:
    +        NonManifoldEdges(GLVolume& volume) : m_parent(volume) {}
    +        void render();
    +        void set_as_dirty() { m_update_needed = true; }
    +
    +    private:
    +        void update();
    +    };
    +
    +    NonManifoldEdges m_non_manifold_edges;
    +
     public:
         // Color of the triangles / quads held by this volume.
    -    std::array color;
    +    ColorRGBA color;
         // Color used to render this volume.
    -    std::array render_color;
    +    ColorRGBA render_color;
     
         struct CompositeID {
             CompositeID(int object_id, int volume_id, int instance_id) : object_id(object_id), volume_id(volume_id), instance_id(instance_id) {}
    @@ -357,24 +175,22 @@ class GLVolume {
     	    bool                is_wipe_tower : 1;
     	    // Wheter or not this volume has been generated from an extrusion path
     	    bool                is_extrusion_path : 1;
    -	    // Wheter or not to always render this volume using its own alpha 
    -	    bool                force_transparent : 1;
    -	    // Whether or not always use the volume's own color (not using SELECTED/HOVER/DISABLED/OUTSIDE)
    +        // Whether or not always use the volume's own color (not using SELECTED/HOVER/DISABLED/OUTSIDE)
     	    bool                force_native_color : 1;
             // Whether or not render this volume in neutral
             bool                force_neutral_color : 1;
             // Whether or not to force rendering of sinking contours
             bool                force_sinking_contours : 1;
    -    };
    +    }; // this gets instantiated automatically in the parent struct
     
         // Is mouse or rectangle selection over this object to select/deselect it ?
         EHoverState         	hover;
     
    -    // Interleaved triangles & normals with indexed triangles & quads.
    -    GLIndexedVertexArray        indexed_vertex_array;
    +    GUI::GLModel            model;
    +    // raycaster used for picking
    +    std::unique_ptr mesh_raycaster;
         // Ranges of triangle and quad indices to be rendered.
         std::pair   tverts_range;
    -    std::pair   qverts_range;
     
         // If the qverts or tverts contain thick extrusions, then offsets keeps pointers of the starts
         // of the extrusions per layer.
    @@ -384,33 +200,27 @@ class GLVolume {
     
         // Bounding box of this volume, in unscaled coordinates.
         BoundingBoxf3 bounding_box() const { 
    -        BoundingBoxf3 out;
    -        if (! this->indexed_vertex_array.bounding_box().isEmpty()) {
    -            out.min = this->indexed_vertex_array.bounding_box().min().cast();
    -            out.max = this->indexed_vertex_array.bounding_box().max().cast();
    -            out.defined = true;
    -        };
    -        return out;
    +        return this->model.get_bounding_box();
         }
     
    -    void set_color(const std::array& rgba);
    -    void set_render_color(float r, float g, float b, float a);
    -    void set_render_color(const std::array& rgba);
    +    void set_color(const ColorRGBA& rgba)        { color = rgba; }
    +    void set_render_color(const ColorRGBA& rgba) { render_color = rgba; }
         // Sets render color in dependence of current state
    -    void set_render_color();
    +    void set_render_color(bool force_transparent);
         // set color according to model volume
         void set_color_from_model_volume(const ModelVolume& model_volume);
     
         const Geometry::Transformation& get_instance_transformation() const { return m_instance_transformation; }
         void set_instance_transformation(const Geometry::Transformation& transformation) { m_instance_transformation = transformation; set_bounding_boxes_as_dirty(); }
    +    void set_instance_transformation(const Transform3d& transform) { m_instance_transformation.set_matrix(transform); set_bounding_boxes_as_dirty(); }
     
    -    const Vec3d& get_instance_offset() const { return m_instance_transformation.get_offset(); }
    +    Vec3d get_instance_offset() const { return m_instance_transformation.get_offset(); }
         double get_instance_offset(Axis axis) const { return m_instance_transformation.get_offset(axis); }
     
         void set_instance_offset(const Vec3d& offset) { m_instance_transformation.set_offset(offset); set_bounding_boxes_as_dirty(); }
         void set_instance_offset(Axis axis, double offset) { m_instance_transformation.set_offset(axis, offset); set_bounding_boxes_as_dirty(); }
     
    -    const Vec3d& get_instance_rotation() const { return m_instance_transformation.get_rotation(); }
    +    Vec3d get_instance_rotation() const { return m_instance_transformation.get_rotation(); }
         double get_instance_rotation(Axis axis) const { return m_instance_transformation.get_rotation(axis); }
     
         void set_instance_rotation(const Vec3d& rotation) { m_instance_transformation.set_rotation(rotation); set_bounding_boxes_as_dirty(); }
    @@ -422,7 +232,7 @@ class GLVolume {
         void set_instance_scaling_factor(const Vec3d& scaling_factor) { m_instance_transformation.set_scaling_factor(scaling_factor); set_bounding_boxes_as_dirty(); }
         void set_instance_scaling_factor(Axis axis, double scaling_factor) { m_instance_transformation.set_scaling_factor(axis, scaling_factor); set_bounding_boxes_as_dirty(); }
     
    -    const Vec3d& get_instance_mirror() const { return m_instance_transformation.get_mirror(); }
    +    Vec3d get_instance_mirror() const { return m_instance_transformation.get_mirror(); }
         double get_instance_mirror(Axis axis) const { return m_instance_transformation.get_mirror(axis); }
     
         void set_instance_mirror(const Vec3d& mirror) { m_instance_transformation.set_mirror(mirror); set_bounding_boxes_as_dirty(); }
    @@ -430,26 +240,27 @@ class GLVolume {
     
         const Geometry::Transformation& get_volume_transformation() const { return m_volume_transformation; }
         void set_volume_transformation(const Geometry::Transformation& transformation) { m_volume_transformation = transformation; set_bounding_boxes_as_dirty(); }
    +    void set_volume_transformation(const Transform3d& transform) { m_volume_transformation.set_matrix(transform); set_bounding_boxes_as_dirty(); }
     
    -    const Vec3d& get_volume_offset() const { return m_volume_transformation.get_offset(); }
    +    Vec3d get_volume_offset() const { return m_volume_transformation.get_offset(); }
         double get_volume_offset(Axis axis) const { return m_volume_transformation.get_offset(axis); }
     
         void set_volume_offset(const Vec3d& offset) { m_volume_transformation.set_offset(offset); set_bounding_boxes_as_dirty(); }
         void set_volume_offset(Axis axis, double offset) { m_volume_transformation.set_offset(axis, offset); set_bounding_boxes_as_dirty(); }
     
    -    const Vec3d& get_volume_rotation() const { return m_volume_transformation.get_rotation(); }
    +    Vec3d get_volume_rotation() const { return m_volume_transformation.get_rotation(); }
         double get_volume_rotation(Axis axis) const { return m_volume_transformation.get_rotation(axis); }
     
         void set_volume_rotation(const Vec3d& rotation) { m_volume_transformation.set_rotation(rotation); set_bounding_boxes_as_dirty(); }
         void set_volume_rotation(Axis axis, double rotation) { m_volume_transformation.set_rotation(axis, rotation); set_bounding_boxes_as_dirty(); }
     
    -    const Vec3d& get_volume_scaling_factor() const { return m_volume_transformation.get_scaling_factor(); }
    +    Vec3d get_volume_scaling_factor() const { return m_volume_transformation.get_scaling_factor(); }
         double get_volume_scaling_factor(Axis axis) const { return m_volume_transformation.get_scaling_factor(axis); }
     
         void set_volume_scaling_factor(const Vec3d& scaling_factor) { m_volume_transformation.set_scaling_factor(scaling_factor); set_bounding_boxes_as_dirty(); }
         void set_volume_scaling_factor(Axis axis, double scaling_factor) { m_volume_transformation.set_scaling_factor(axis, scaling_factor); set_bounding_boxes_as_dirty(); }
     
    -    const Vec3d& get_volume_mirror() const { return m_volume_transformation.get_mirror(); }
    +    Vec3d get_volume_mirror() const { return m_volume_transformation.get_mirror(); }
         double get_volume_mirror(Axis axis) const { return m_volume_transformation.get_mirror(axis); }
     
         void set_volume_mirror(const Vec3d& mirror) { m_volume_transformation.set_mirror(mirror); set_bounding_boxes_as_dirty(); }
    @@ -462,8 +273,8 @@ class GLVolume {
         void set_convex_hull(const TriangleMesh &convex_hull) { m_convex_hull = std::make_shared(convex_hull); }
         void set_convex_hull(TriangleMesh &&convex_hull) { m_convex_hull = std::make_shared(std::move(convex_hull)); }
     
    -    int                 object_idx() const { return this->composite_id.object_id; }
    -    int                 volume_idx() const { return this->composite_id.volume_id; }
    +    int                 object_idx() const   { return this->composite_id.object_id; }
    +    int                 volume_idx() const   { return this->composite_id.volume_id; }
         int                 instance_idx() const { return this->composite_id.instance_id; }
     
         Transform3d         world_matrix() const;
    @@ -481,14 +292,11 @@ class GLVolume {
         // convex hull
         const TriangleMesh*  convex_hull() const { return m_convex_hull.get(); }
     
    -    bool                empty() const { return this->indexed_vertex_array.empty(); }
    +    bool                empty() const { return this->model.is_empty(); }
     
         void                set_range(double low, double high);
     
    -    void                render() const;
    -
    -    void                finalize_geometry(bool opengl_initialized) { this->indexed_vertex_array.finalize_geometry(opengl_initialized); }
    -    void                release_geometry() { this->indexed_vertex_array.release_geometry(); }
    +    void                render();
     
         void                set_bounding_boxes_as_dirty() {
             m_transformed_bounding_box.reset();
    @@ -502,14 +310,15 @@ class GLVolume {
         bool                is_sinking() const;
         bool                is_below_printbed() const;
         void                render_sinking_contours();
    +    void                render_non_manifold_edges();
     
         // Return an estimate of the memory consumed by this class.
    -    size_t 				cpu_memory_used() const { 
    -    	//FIXME what to do wih m_convex_hull?
    -    	return sizeof(*this) - sizeof(this->indexed_vertex_array) + this->indexed_vertex_array.cpu_memory_used() + this->print_zs.capacity() * sizeof(coordf_t) + this->offsets.capacity() * sizeof(size_t);
    +    size_t 				cpu_memory_used() const {
    +          return sizeof(*this) + this->model.cpu_memory_used() + this->print_zs.capacity() * sizeof(coordf_t) +
    +               this->offsets.capacity() * sizeof(size_t);
         }
         // Return an estimate of the memory held by GPU vertex buffers.
    -    size_t 				gpu_memory_used() const { return this->indexed_vertex_array.gpu_memory_used(); }
    +    size_t 				gpu_memory_used() const { return this->model.gpu_memory_used(); }
         size_t 				total_memory_used() const { return this->cpu_memory_used() + this->gpu_memory_used(); }
     };
     
    @@ -545,10 +354,16 @@ class GLVolumeCollection
         PrintVolume m_print_volume;
     
         // z range for clipping in shaders
    -    float m_z_range[2];
    +    std::array m_z_range;
     
         // plane coeffs for clipping in shaders
    -    float m_clipping_plane[4];
    +    std::array m_clipping_plane;
    +
    +    // plane coeffs for render volumes with different colors in shaders
    +    // used by cut gizmo
    +    std::array m_color_clip_plane;
    +    bool m_use_color_clip_plane{ false };
    +    std::array m_color_clip_plane_colors{ ColorRGBA::RED(), ColorRGBA::BLUE() };
     
         struct Slope
         {
    @@ -558,7 +373,9 @@ class GLVolumeCollection
         };
     
         Slope m_slope;
    -    bool m_show_sinking_contours = false;
    +    bool m_show_sinking_contours{ false };
    +    bool m_show_non_manifold_edges{ true };
    +    bool m_use_raycasters{ true };
     
     public:
         GLVolumePtrs volumes;
    @@ -567,57 +384,62 @@ class GLVolumeCollection
         ~GLVolumeCollection() { clear(); }
     
         std::vector load_object(
    -        const ModelObject 		*model_object,
    +        const ModelObject* model_object,
             int                      obj_idx,
    -        const std::vector	&instance_idxs,
    -        const std::string 		&color_by,
    -        bool 					 opengl_initialized);
    +        const std::vector& instance_idxs);
     
         int load_object_volume(
    -        const ModelObject *model_object,
    +        const ModelObject* model_object,
             int                obj_idx,
             int                volume_idx,
    -        int                instance_idx,
    -        const std::string &color_by,
    -        bool 			   opengl_initialized);
    +        int                instance_idx);
    +
    +#if ENABLE_OPENGL_ES
    +    int load_wipe_tower_preview(
    +        float pos_x, float pos_y, float width, float depth, float height, float cone_angle, float rotation_angle, bool size_unknown, float brim_width, TriangleMesh* out_mesh = nullptr);
    +#else
    +    int load_wipe_tower_preview(
    +        float pos_x, float pos_y, float width, float depth, float height, float cone_angle, float rotation_angle, bool size_unknown, float brim_width);
    +#endif // ENABLE_OPENGL_ES
     
         // Load SLA auxiliary GLVolumes (for support trees or pad).
         void load_object_auxiliary(
    -        const SLAPrintObject           *print_object,
    +        const SLAPrintObject* print_object,
             int                             obj_idx,
             // pairs of 
             const std::vector>& instances,
             SLAPrintObjectStep              milestone,
             // Timestamp of the last change of the milestone
    -        size_t                          timestamp,
    -        bool 			   				opengl_initialized);
    -
    -    int load_wipe_tower_preview(
    -        int obj_idx, float pos_x, float pos_y, float width, float depth, float height, float rotation_angle, bool size_unknown, float brim_width, bool opengl_initialized);
    -
    -    GLVolume* new_toolpath_volume(const std::array& rgba, size_t reserve_vbo_floats = 0);
    -    GLVolume* new_nontoolpath_volume(const std::array& rgba, size_t reserve_vbo_floats = 0);
    +        size_t                          timestamp);
     
    +    GLVolume* new_toolpath_volume(const ColorRGBA& rgba);
    +    GLVolume* new_nontoolpath_volume(const ColorRGBA& rgba);
         // Render the volumes by OpenGL.
    -    void render(ERenderType type, bool disable_cullface, const Transform3d& view_matrix, std::function filter_func = std::function()) const;
    -
    -    // Finalize the initialization of the geometry & indices,
    -    // upload the geometry and indices to OpenGL VBO objects
    -    // and shrink the allocated data, possibly relasing it if it has been loaded into the VBOs.
    -    void finalize_geometry(bool opengl_initialized) { for (auto* v : volumes) v->finalize_geometry(opengl_initialized); }
    -    // Release the geometry data assigned to the volumes.
    -    // If OpenGL VBOs were allocated, an OpenGL context has to be active to release them.
    -    void release_geometry() { for (auto *v : volumes) v->release_geometry(); }
    +    void render(ERenderType type, bool disable_cullface, const Transform3d& view_matrix, const Transform3d& projection_matrix,
    +        std::function filter_func = std::function()) const;
    +
         // Clear the geometry
         void clear() { for (auto *v : volumes) delete v; volumes.clear(); }
     
         bool empty() const { return volumes.empty(); }
    -    void set_range(double low, double high) { for (GLVolume *vol : this->volumes) vol->set_range(low, high); }
    +    void set_range(double low, double high) { for (GLVolume* vol : this->volumes) vol->set_range(low, high); }
     
    +    void set_use_raycasters(bool value) { m_use_raycasters = value; }
         void set_print_volume(const PrintVolume& print_volume) { m_print_volume = print_volume; }
     
         void set_z_range(float min_z, float max_z) { m_z_range[0] = min_z; m_z_range[1] = max_z; }
    -    void set_clipping_plane(const double* coeffs) { m_clipping_plane[0] = coeffs[0]; m_clipping_plane[1] = coeffs[1]; m_clipping_plane[2] = coeffs[2]; m_clipping_plane[3] = coeffs[3]; }
    +    void set_clipping_plane(const std::array& coeffs) { m_clipping_plane = coeffs; }
    +
    +    const std::array& get_z_range() const { return m_z_range; }
    +    const std::array& get_clipping_plane() const { return m_clipping_plane; }
    +
    +    void set_use_color_clip_plane(bool use) { m_use_color_clip_plane = use; }
    +    void set_color_clip_plane(const Vec3d& cp_normal, double offset) {
    +        for (int i = 0; i < 3; ++i)
    +            m_color_clip_plane[i] = -cp_normal[i];
    +        m_color_clip_plane[3] = offset;
    +    }
    +    void set_color_clip_plane_colors(const std::array& colors) { m_color_clip_plane_colors = colors; }
     
         bool is_slope_active() const { return m_slope.active; }
         void set_slope_active(bool active) { m_slope.active = active; }
    @@ -626,6 +448,7 @@ class GLVolumeCollection
         void set_slope_normal_z(float normal_z) { m_slope.normal_z = normal_z; }
         void set_default_slope_normal_z() { m_slope.normal_z = -::cos(Geometry::deg2rad(90.0f - 45.0f)); }
         void set_show_sinking_contours(bool show) { m_show_sinking_contours = show; }
    +    void set_show_non_manifold_edges(bool show) { m_show_non_manifold_edges = show; }
     
         // returns true if all the volumes are completely contained in the print volume
         // returns the containment state in the given out_state, if non-null
    @@ -654,17 +477,13 @@ GLVolumeWithIdAndZList volumes_to_render(const GLVolumePtrs& volumes, GLVolumeCo
     
     struct _3DScene
     {
    -    static void thick_lines_to_verts(const Lines& lines, const std::vector& widths, const std::vector& heights, bool closed, double top_z, GLVolume& volume);
    -    static void thick_lines_to_verts(const Lines3& lines, const std::vector& widths, const std::vector& heights, bool closed, GLVolume& volume);
    -	static void extrusionentity_to_verts(const Polyline &polyline, float width, float height, float print_z, GLVolume& volume);
    -    static void extrusionentity_to_verts(const ExtrusionPath& extrusion_path, float print_z, GLVolume& volume);
    -    static void extrusionentity_to_verts(const ExtrusionPath& extrusion_path, float print_z, const Point& copy, GLVolume& volume);
    -    static void extrusionentity_to_verts(const ExtrusionLoop& extrusion_loop, float print_z, const Point& copy, GLVolume& volume);
    -    static void extrusionentity_to_verts(const ExtrusionMultiPath& extrusion_multi_path, float print_z, const Point& copy, GLVolume& volume);
    -    static void extrusionentity_to_verts(const ExtrusionEntityCollection& extrusion_entity_collection, float print_z, const Point& copy, GLVolume& volume);
    -    static void extrusionentity_to_verts(const ExtrusionEntity* extrusion_entity, float print_z, const Point& copy, GLVolume& volume);
    -    static void polyline3_to_verts(const Polyline3& polyline, double width, double height, GLVolume& volume);
    -    static void point3_to_verts(const Vec3crd& point, double width, double height, GLVolume& volume);
    +    static void thick_lines_to_verts(const Lines& lines, const std::vector& widths, const std::vector& heights, bool closed, double top_z, GUI::GLModel::Geometry& geometry);
    +    static void thick_lines_to_verts(const Lines3& lines, const std::vector& widths, const std::vector& heights, bool closed, GUI::GLModel::Geometry& geometry);
    +    static void extrusionentity_to_verts(const ExtrusionPath& extrusion_path, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry);
    +    static void extrusionentity_to_verts(const ExtrusionLoop& extrusion_loop, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry);
    +    static void extrusionentity_to_verts(const ExtrusionMultiPath& extrusion_multi_path, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry);
    +    static void extrusionentity_to_verts(const ExtrusionEntityCollection& extrusion_entity_collection, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry);
    +    static void extrusionentity_to_verts(const ExtrusionEntity* extrusion_entity, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry);
     };
     
     }
    diff --git a/src/slic3r/GUI/AboutDialog.cpp b/src/slic3r/GUI/AboutDialog.cpp
    index 54e41d3df6a..0d59f44330a 100644
    --- a/src/slic3r/GUI/AboutDialog.cpp
    +++ b/src/slic3r/GUI/AboutDialog.cpp
    @@ -2,6 +2,7 @@
     #include "I18N.hpp"
     
     #include "libslic3r/Utils.hpp"
    +#include "libslic3r/Color.hpp"
     #include "GUI.hpp"
     #include "GUI_App.hpp"
     #include "MainFrame.hpp"
    @@ -40,9 +41,9 @@ void AboutDialogLogo::onRepaint(wxEvent &event)
     // CopyrightsDialog
     // -----------------------------------------
     CopyrightsDialog::CopyrightsDialog()
    -    : DPIDialog(static_cast(wxGetApp().mainframe), wxID_ANY, from_u8((boost::format("%1% - %2%")
    -        % (wxGetApp().is_editor() ? SLIC3R_APP_NAME : GCODEVIEWER_APP_NAME)
    -        % _utf8(L("Portions copyright"))).str()),
    +    : DPIDialog(static_cast(wxGetApp().mainframe), wxID_ANY, format_wxstr("%1% - %2%"
    +        , wxGetApp().is_editor() ? SLIC3R_APP_NAME : GCODEVIEWER_APP_NAME
    +        , _L("Portions copyright")),
             wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
     {
         this->SetFont(wxGetApp().normal_font());
    @@ -113,7 +114,6 @@ void CopyrightsDialog::fill_entries()
             { "Expat"           , "1998-2000 Thai Open Source Software Center Ltd and Clark Cooper"
                                   "2001-2016 Expat maintainers"                 , "http://www.libexpat.org/" },
             { "AVRDUDE"         , "2018  Free Software Foundation, Inc."        , "http://savannah.nongnu.org/projects/avrdude" },
    -        { "Shinyprofiler"   , "2007-2010 Aidin Abedi"                       , "http://code.google.com/p/shinyprofiler/" },
             { "Real-Time DXT1/DXT5 C compression library"   
                                         , "Based on original by fabian \"ryg\" giesen v1.04. "
                                   "Custom version, modified by Yann Collet"     , "https://github.com/Cyan4973/RygsDXTc" },
    @@ -126,7 +126,9 @@ void CopyrightsDialog::fill_entries()
             { "fast_float"
                                 , "Daniel Lemire, João Paulo Magalhaes and contributors", "https://github.com/fastfloat/fast_float" },
             { "CuraEngine (Arachne, etc.)"
    -                            , "Ultimaker", "https://github.com/Ultimaker/CuraEngine" }
    +                            , "Ultimaker", "https://github.com/Ultimaker/CuraEngine" },
    +        { "Open CASCADE Technology"
    +                            , "Open Cascade SAS", "https://github.com/Open-Cascade-SAS/OCCT" }
         };
     }
     
    @@ -135,12 +137,11 @@ wxString CopyrightsDialog::get_html_text()
         wxColour bgr_clr = wxGetApp().get_window_default_clr();//wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
     
         const auto text_clr = wxGetApp().get_label_clr_default();
    -    const auto text_clr_str = wxString::Format(wxT("#%02X%02X%02X"), text_clr.Red(), text_clr.Green(), text_clr.Blue());
    -    const auto bgr_clr_str = wxString::Format(wxT("#%02X%02X%02X"), bgr_clr.Red(), bgr_clr.Green(), bgr_clr.Blue());
    +    const auto text_clr_str = encode_color(ColorRGB(text_clr.Red(), text_clr.Green(), text_clr.Blue()));
    +    const auto bgr_clr_str = encode_color(ColorRGB(bgr_clr.Red(), bgr_clr.Green(), bgr_clr.Blue()));
     
    -    const wxString copyright_str = _(L("Copyright")) + "© ";
    -    // TRN "Slic3r _is licensed under the_ License"
    -    const wxString header_str = _(L("License agreements of all following programs (libraries) are part of application license agreement"));
    +    const wxString copyright_str = _L("Copyright") + "© ";
    +    const wxString header_str = _L("License agreements of all following programs (libraries) are part of application license agreement");
     
         wxString text = wxString::Format(
             ""
    @@ -209,7 +210,7 @@ void CopyrightsDialog::onCloseDialog(wxEvent &)
     }
     
     AboutDialog::AboutDialog()
    -    : DPIDialog(static_cast(wxGetApp().mainframe), wxID_ANY, from_u8((boost::format(_utf8(L("About %s"))) % (wxGetApp().is_editor() ? SLIC3R_APP_NAME : GCODEVIEWER_APP_NAME)).str()), wxDefaultPosition,
    +    : DPIDialog(static_cast(wxGetApp().mainframe), wxID_ANY, format_wxstr(_L("About %s"), wxGetApp().is_editor() ? SLIC3R_APP_NAME : GCODEVIEWER_APP_NAME), wxDefaultPosition,
             wxDefaultSize, /*wxCAPTION*/wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
     {
         SetFont(wxGetApp().normal_font());
    @@ -222,8 +223,7 @@ AboutDialog::AboutDialog()
     	main_sizer->Add(hsizer, 0, wxEXPAND | wxALL, 20);
     
         // logo
    -    m_logo_bitmap = ScalableBitmap(this, wxGetApp().logo_name(), 192);
    -    m_logo = new wxStaticBitmap(this, wxID_ANY, m_logo_bitmap.bmp());
    +    m_logo = new wxStaticBitmap(this, wxID_ANY, *get_bmp_bundle(wxGetApp().logo_name(), 192));
     	hsizer->Add(m_logo, 1, wxALIGN_CENTER_VERTICAL);
         
         wxBoxSizer* vsizer = new wxBoxSizer(wxVERTICAL); 	
    @@ -259,25 +259,24 @@ AboutDialog::AboutDialog()
             m_html->SetMinSize(wxSize(-1, 16 * wxGetApp().em_unit()));
             wxFont font = get_default_font(this);
             const auto text_clr = wxGetApp().get_label_clr_default();
    -		auto text_clr_str = wxString::Format(wxT("#%02X%02X%02X"), text_clr.Red(), text_clr.Green(), text_clr.Blue());
    -		auto bgr_clr_str = wxString::Format(wxT("#%02X%02X%02X"), bgr_clr.Red(), bgr_clr.Green(), bgr_clr.Blue());
    +        const auto text_clr_str = encode_color(ColorRGB(text_clr.Red(), text_clr.Green(), text_clr.Blue()));
    +        const auto bgr_clr_str = encode_color(ColorRGB(bgr_clr.Red(), bgr_clr.Green(), bgr_clr.Blue()));
     
     		const int fs = font.GetPointSize()-1;
             int size[] = {fs,fs,fs,fs,fs,fs,fs};
             m_html->SetFonts(font.GetFaceName(), font.GetFaceName(), size);
             m_html->SetBorders(2);
    -        const std::string copyright_str = _utf8(L("Copyright"));
    -        // TRN "Slic3r _is licensed under the_ License"
    -        const std::string is_lecensed_str = _utf8(L("is licensed under the"));
    -        const std::string license_str = _utf8(L("GNU Affero General Public License, version 3"));
    -        const std::string based_on_str = _utf8(L("PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap community."));
    -        const std::string contributors_str = _utf8(L("Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and numerous others."));
    -        const auto text = from_u8(
    -            (boost::format(
    +        const wxString copyright_str    = _L("Copyright");
    +        // TRN AboutDialog: "Slic3r %1% GNU Affero General Public License"
    +        const wxString is_lecensed_str  = _L("is licensed under the");
    +        const wxString license_str      = _L("GNU Affero General Public License, version 3");
    +        const wxString based_on_str     = _L("PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap community.");
    +        const wxString contributors_str = _L("Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and numerous others.");
    +        const auto text = format_wxstr(
                 ""
                 ""
                 ""
    -            "%4% © 2016-2022 Prusa Research. 
    " + "%4% © 2016-2023 Prusa Research.
    " "%5% © 2011-2018 Alessandro Ranellucci.
    " "Slic3r %6% " "%7%." @@ -287,12 +286,12 @@ AboutDialog::AboutDialog() "%9%" "
    " "" - "") % bgr_clr_str % text_clr_str % text_clr_str - % copyright_str % copyright_str - % is_lecensed_str - % license_str - % based_on_str - % contributors_str).str()); + "", bgr_clr_str, text_clr_str, text_clr_str + , copyright_str, copyright_str + , is_lecensed_str + , license_str + , based_on_str + , contributors_str); m_html->SetPage(text); vsizer->Add(m_html, 1, wxEXPAND | wxBOTTOM, 10); m_html->Bind(wxEVT_HTML_LINK_CLICKED, &AboutDialog::onLinkClicked, this); @@ -323,8 +322,8 @@ AboutDialog::AboutDialog() void AboutDialog::on_dpi_changed(const wxRect &suggested_rect) { - m_logo_bitmap.msw_rescale(); - m_logo->SetBitmap(m_logo_bitmap.bmp()); +// m_logo_bitmap.msw_rescale(); +// m_logo->SetBitmap(m_logo_bitmap.bmp()); const wxFont& font = GetFont(); const int fs = font.GetPointSize() - 1; diff --git a/src/slic3r/GUI/BackgroundSlicingProcess.cpp b/src/slic3r/GUI/BackgroundSlicingProcess.cpp index 5f7b4e8d3fa..9ee6946c61e 100644 --- a/src/slic3r/GUI/BackgroundSlicingProcess.cpp +++ b/src/slic3r/GUI/BackgroundSlicingProcess.cpp @@ -76,10 +76,10 @@ std::pair SlicingProcessCompletedEvent::format_error_message( try { this->rethrow_exception(); } catch (const std::bad_alloc &ex) { - wxString errmsg = GUI::from_u8((boost::format(_utf8(L("%s has encountered an error. It was likely caused by running out of memory. " + error = GUI::format(_L("%s has encountered an error. It was likely caused by running out of memory. " "If you are sure you have enough RAM on your system, this may also be a bug and we would " - "be glad if you reported it."))) % SLIC3R_APP_NAME).str()); - error = std::string(errmsg.ToUTF8()) + "\n\n" + std::string(ex.what()); + "be glad if you reported it."), SLIC3R_APP_NAME); + error += "\n\n" + std::string(ex.what()); } catch (const HardCrash &ex) { error = GUI::format(_L("PrusaSlicer has encountered a fatal error: \"%1%\""), ex.what()) + "\n\n" + _u8L("Please save your project and restart PrusaSlicer. " @@ -144,7 +144,7 @@ std::string BackgroundSlicingProcess::output_filepath_for_project(const boost::f void BackgroundSlicingProcess::process_fff() { assert(m_print == m_fff_print); - m_print->process(); + m_print->process(); wxCommandEvent evt(m_event_slicing_completed_id); // Post the Slicing Finished message for the G-code viewer to update. // Passing the timestamp @@ -159,23 +159,12 @@ void BackgroundSlicingProcess::process_fff() wxQueueEvent(GUI::wxGetApp().mainframe->m_plater, new wxCommandEvent(m_event_export_began_id)); prepare_upload(); } else { - m_print->set_status(100, _utf8(L("Slicing complete"))); + m_print->set_status(100, _u8L("Slicing complete")); } this->set_step_done(bspsGCodeFinalize); } } -static void write_thumbnail(Zipper& zipper, const ThumbnailData& data) -{ - size_t png_size = 0; - void* png_data = tdefl_write_image_to_png_file_in_memory_ex((const void*)data.pixels.data(), data.width, data.height, 4, &png_size, MZ_DEFAULT_LEVEL, 1); - if (png_data != nullptr) - { - zipper.add_entry("thumbnail/thumbnail" + std::to_string(data.width) + "x" + std::to_string(data.height) + ".png", (const std::uint8_t*)png_data, png_size); - mz_free(png_data); - } -} - void BackgroundSlicingProcess::process_sla() { assert(m_print == m_sla_print); @@ -189,19 +178,14 @@ void BackgroundSlicingProcess::process_sla() ThumbnailsList thumbnails = this->render_thumbnails( ThumbnailsParams{current_print()->full_print_config().option("thumbnails")->values, true, true, true, true}); - Zipper zipper(export_path); - m_sla_archive.export_print(zipper, *m_sla_print); // true, false, true, true); // renders also supports and pad - for (const ThumbnailData& data : thumbnails) - if (data.is_valid()) - write_thumbnail(zipper, data); - zipper.finalize(); + m_sla_print->export_print(export_path, thumbnails); - m_print->set_status(100, (boost::format(_utf8(L("Masked SLA file exported to %1%"))) % export_path).str()); + m_print->set_status(100, GUI::format(_L("Masked SLA file exported to %1%"), export_path)); } else if (! m_upload_job.empty()) { wxQueueEvent(GUI::wxGetApp().mainframe->m_plater, new wxCommandEvent(m_event_export_began_id)); prepare_upload(); } else { - m_print->set_status(100, _utf8(L("Slicing complete"))); + m_print->set_status(100, _u8L("Slicing complete")); } this->set_step_done(bspsGCodeFinalize); } @@ -212,6 +196,12 @@ void BackgroundSlicingProcess::thread_proc() set_current_thread_name("slic3r_BgSlcPcs"); name_tbb_thread_pool_threads_set_locale(); + // Set "C" locales and enforce OSX QoS level on all threads entering an arena. + // The cost of the callback is quite low: The callback is called once per thread + // entering a parallel loop and the callback is guarded with a thread local + // variable to be executed just once. + TBBLocalesSetter setter; + assert(m_print != nullptr); assert(m_print == m_fff_print || m_print == m_sla_print); std::unique_lock lck(m_mutex); @@ -246,6 +236,9 @@ void BackgroundSlicingProcess::thread_proc() (m_state == STATE_CANCELED) ? SlicingProcessCompletedEvent::Cancelled : exception ? SlicingProcessCompletedEvent::Error : SlicingProcessCompletedEvent::Finished, exception); wxQueueEvent(GUI::wxGetApp().mainframe->m_plater, evt.Clone()); + // Cancelled by the user, not internally, thus cleanup() was not called yet. + // Otherwise cleanup() is called from Print::apply() + m_print->cleanup(); } m_print->restart(); lck.unlock(); @@ -656,7 +649,7 @@ bool BackgroundSlicingProcess::invalidate_all_steps() // Copy the final G-code to target location (possibly a SD card, if it is a removable media, then verify that the file was written without an error). void BackgroundSlicingProcess::finalize_gcode() { - m_print->set_status(95, _utf8(L("Running post-processing scripts"))); + m_print->set_status(95, _u8L("Running post-processing scripts")); // Perform the final post-processing of the export path by applying the print statistics over the file name. std::string export_path = m_fff_print->print_statistics().finalize_output_path(m_export_path); @@ -687,32 +680,32 @@ void BackgroundSlicingProcess::finalize_gcode() catch (...) { remove_post_processed_temp_file(); - throw Slic3r::ExportError(_utf8(L("Unknown error occured during exporting G-code."))); + throw Slic3r::ExportError(_u8L("Unknown error occured during exporting G-code.")); } switch (copy_ret_val) { case CopyFileResult::SUCCESS: break; // no error case CopyFileResult::FAIL_COPY_FILE: - throw Slic3r::ExportError((boost::format(_utf8(L("Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?\nError message: %1%"))) % error_message).str()); + throw Slic3r::ExportError(GUI::format(_L("Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?\nError message: %1%"), error_message)); break; case CopyFileResult::FAIL_FILES_DIFFERENT: - throw Slic3r::ExportError((boost::format(_utf8(L("Copying of the temporary G-code to the output G-code failed. There might be problem with target device, please try exporting again or using different device. The corrupted output G-code is at %1%.tmp."))) % export_path).str()); + throw Slic3r::ExportError(GUI::format(_L("Copying of the temporary G-code to the output G-code failed. There might be problem with target device, please try exporting again or using different device. The corrupted output G-code is at %1%.tmp."), export_path)); break; case CopyFileResult::FAIL_RENAMING: - throw Slic3r::ExportError((boost::format(_utf8(L("Renaming of the G-code after copying to the selected destination folder has failed. Current path is %1%.tmp. Please try exporting again."))) % export_path).str()); + throw Slic3r::ExportError(GUI::format(_L("Renaming of the G-code after copying to the selected destination folder has failed. Current path is %1%.tmp. Please try exporting again."), export_path)); break; case CopyFileResult::FAIL_CHECK_ORIGIN_NOT_OPENED: - throw Slic3r::ExportError((boost::format(_utf8(L("Copying of the temporary G-code has finished but the original code at %1% couldn't be opened during copy check. The output G-code is at %2%.tmp."))) % output_path % export_path).str()); + throw Slic3r::ExportError(GUI::format(_L("Copying of the temporary G-code has finished but the original code at %1% couldn't be opened during copy check. The output G-code is at %2%.tmp."), output_path, export_path)); break; case CopyFileResult::FAIL_CHECK_TARGET_NOT_OPENED: - throw Slic3r::ExportError((boost::format(_utf8(L("Copying of the temporary G-code has finished but the exported code couldn't be opened during copy check. The output G-code is at %1%.tmp."))) % export_path).str()); + throw Slic3r::ExportError(GUI::format(_L("Copying of the temporary G-code has finished but the exported code couldn't be opened during copy check. The output G-code is at %1%.tmp."), export_path)); break; default: - throw Slic3r::ExportError(_utf8(L("Unknown error occured during exporting G-code."))); + throw Slic3r::ExportError(_u8L("Unknown error occured during exporting G-code.")); BOOST_LOG_TRIVIAL(error) << "Unexpected fail code(" << (int)copy_ret_val << ") durring copy_file() to " << export_path << "."; break; } - m_print->set_status(100, (boost::format(_utf8(L("G-code file exported to %1%"))) % export_path).str()); + m_print->set_status(100, GUI::format(_L("G-code file exported to %1%"), export_path)); } // A print host upload job has been scheduled, enqueue it to the printhost job queue @@ -723,10 +716,10 @@ void BackgroundSlicingProcess::prepare_upload() / boost::filesystem::unique_path("." SLIC3R_APP_KEY ".upload.%%%%-%%%%-%%%%-%%%%"); if (m_print == m_fff_print) { - m_print->set_status(95, _utf8(L("Running post-processing scripts"))); + m_print->set_status(95, _u8L("Running post-processing scripts")); std::string error_message; if (copy_file(m_temp_output_path, source_path.string(), error_message) != SUCCESS) - throw Slic3r::RuntimeError(_utf8(L("Copying of the temporary G-code to the output G-code failed"))); + throw Slic3r::RuntimeError(_u8L("Copying of the temporary G-code to the output G-code failed")); m_upload_job.upload_data.upload_path = m_fff_print->print_statistics().finalize_output_path(m_upload_job.upload_data.upload_path.string()); // Make a copy of the source path, as run_post_process_scripts() is allowed to change it when making a copy of the source file // (not here, but when the final target is a file). @@ -739,16 +732,10 @@ void BackgroundSlicingProcess::prepare_upload() ThumbnailsList thumbnails = this->render_thumbnails( ThumbnailsParams{current_print()->full_print_config().option("thumbnails")->values, true, true, true, true}); - // true, false, true, true); // renders also supports and pad - Zipper zipper{source_path.string()}; - m_sla_archive.export_print(zipper, *m_sla_print, m_upload_job.upload_data.upload_path.string()); - for (const ThumbnailData& data : thumbnails) - if (data.is_valid()) - write_thumbnail(zipper, data); - zipper.finalize(); + m_sla_print->export_print(source_path.string(),thumbnails, m_upload_job.upload_data.upload_path.filename().string()); } - m_print->set_status(100, (boost::format(_utf8(L("Scheduling upload to `%1%`. See Window -> Print Host Upload Queue"))) % m_upload_job.printhost->get_host()).str()); + m_print->set_status(100, GUI::format(_L("Scheduling upload to `%1%`. See Window -> Print Host Upload Queue"), m_upload_job.printhost->get_host())); m_upload_job.upload_data.source_path = std::move(source_path); diff --git a/src/slic3r/GUI/BackgroundSlicingProcess.hpp b/src/slic3r/GUI/BackgroundSlicingProcess.hpp index 5fba237e359..00a3ab6d059 100644 --- a/src/slic3r/GUI/BackgroundSlicingProcess.hpp +++ b/src/slic3r/GUI/BackgroundSlicingProcess.hpp @@ -11,7 +11,6 @@ #include "libslic3r/PrintBase.hpp" #include "libslic3r/GCode/ThumbnailData.hpp" -#include "libslic3r/Format/SL1.hpp" #include "slic3r/Utils/PrintHost.hpp" #include "libslic3r/GCode/GCodeProcessor.hpp" @@ -84,7 +83,7 @@ class BackgroundSlicingProcess ~BackgroundSlicingProcess(); void set_fff_print(Print *print) { m_fff_print = print; } - void set_sla_print(SLAPrint *print) { m_sla_print = print; m_sla_print->set_printer(&m_sla_archive); } + void set_sla_print(SLAPrint *print) { m_sla_print = print; } void set_thumbnail_cb(ThumbnailsGeneratorCallback cb) { m_thumbnail_cb = cb; } void set_gcode_result(GCodeProcessorResult* result) { m_gcode_result = result; } @@ -218,9 +217,9 @@ class BackgroundSlicingProcess // Data structure, to which the G-code export writes its annotations. GCodeProcessorResult *m_gcode_result = nullptr; // Callback function, used to write thumbnails into gcode. - ThumbnailsGeneratorCallback m_thumbnail_cb = nullptr; - SL1Archive m_sla_archive; - // Temporary G-code, there is one defined for the BackgroundSlicingProcess, differentiated from the other processes by a process ID. + ThumbnailsGeneratorCallback m_thumbnail_cb = nullptr; + // Temporary G-code, there is one defined for the BackgroundSlicingProcess, + // differentiated from the other processes by a process ID. std::string m_temp_output_path; // Output path provided by the user. The output path may be set even if the slicing is running, // but once set, it cannot be re-set. diff --git a/src/slic3r/GUI/BedShapeDialog.cpp b/src/slic3r/GUI/BedShapeDialog.cpp index 27caedfc3a8..759b1764468 100644 --- a/src/slic3r/GUI/BedShapeDialog.cpp +++ b/src/slic3r/GUI/BedShapeDialog.cpp @@ -123,11 +123,14 @@ void BedShape::apply_optgroup_values(ConfigOptionsGroupShp optgroup) break; default: // rectangle, convex, concave... - optgroup->set_value("rect_size" , new ConfigOptionPoints{ to_2d(m_build_volume.bounding_volume().size()) }); - optgroup->set_value("rect_origin" , new ConfigOptionPoints{ - to_2d(m_build_volume.bounding_volume().min) }); + optgroup->set_value("rect_size" , to_2d(m_build_volume.bounding_volume().size())); + optgroup->set_value("rect_origin" , to_2d(-1 * m_build_volume.bounding_volume().min)); } } +BedShapeDialog::BedShapeDialog(wxWindow* parent) : DPIDialog(parent, wxID_ANY, _(L("Bed Shape")), + wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) {} + void BedShapeDialog::build_dialog(const ConfigOptionPoints& default_pt, const ConfigOptionString& custom_texture, const ConfigOptionString& custom_model) { SetFont(wxGetApp().normal_font()); @@ -425,8 +428,6 @@ void BedShapePanel::set_shape(const ConfigOptionPoints& points) m_loaded_shape = points.values; update_shape(); - - return; } void BedShapePanel::update_preview() diff --git a/src/slic3r/GUI/BedShapeDialog.hpp b/src/slic3r/GUI/BedShapeDialog.hpp index 032aa28800c..2c828a58f36 100644 --- a/src/slic3r/GUI/BedShapeDialog.hpp +++ b/src/slic3r/GUI/BedShapeDialog.hpp @@ -5,7 +5,6 @@ #include "GUI_Utils.hpp" #include "2DBed.hpp" -#include "I18N.hpp" #include @@ -18,6 +17,7 @@ namespace GUI { class ConfigOptionsGroup; using ConfigOptionsGroupShp = std::shared_ptr; +using ConfigOptionsGroupWkp = std::weak_ptr; struct BedShape { @@ -92,8 +92,7 @@ class BedShapeDialog : public DPIDialog { BedShapePanel* m_panel; public: - BedShapeDialog(wxWindow* parent) : DPIDialog(parent, wxID_ANY, _(L("Bed Shape")), - wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) {} + BedShapeDialog(wxWindow* parent); void build_dialog(const ConfigOptionPoints& default_pt, const ConfigOptionString& custom_texture, const ConfigOptionString& custom_model); diff --git a/src/slic3r/GUI/BitmapCache.cpp b/src/slic3r/GUI/BitmapCache.cpp index 39ba849d330..4a90575149c 100644 --- a/src/slic3r/GUI/BitmapCache.cpp +++ b/src/slic3r/GUI/BitmapCache.cpp @@ -6,6 +6,8 @@ #include "GUI_Utils.hpp" #include +#include +#include #ifdef __WXGTK2__ // Broken alpha workaround @@ -13,10 +15,8 @@ #include #endif /* __WXGTK2__ */ -#define NANOSVG_IMPLEMENTATION -#include "nanosvg/nanosvg.h" -#define NANOSVGRAST_IMPLEMENTATION -#include "nanosvg/nanosvgrast.h" +#include +#include namespace Slic3r { namespace GUI { @@ -34,8 +34,11 @@ void BitmapCache::clear() { for (std::pair &bitmap : m_map) delete bitmap.second; - m_map.clear(); + + for (std::pair &bitmap_bundle : m_bndl_map) + delete bitmap_bundle.second; + m_bndl_map.clear(); } static wxBitmap wxImage_to_wxBitmap_with_alpha(wxImage &&image, float scale = 1.0f) @@ -60,7 +63,168 @@ static wxBitmap wxImage_to_wxBitmap_with_alpha(wxImage &&image, float scale = 1. #endif } -wxBitmap* BitmapCache::insert(const std::string &bitmap_key, size_t width, size_t height) +wxBitmapBundle* BitmapCache::insert_bndl(const std::string& name, const std::vector& bmps) +{ + wxVector bitmaps; + + std::set scales = {1.0}; +#ifndef __linux__ + +#ifdef __APPLE__ + scales.emplace(m_scale); +#else + size_t disp_cnt = wxDisplay::GetCount(); + for (size_t disp = 0; disp < disp_cnt; ++disp) + scales.emplace(wxDisplay(disp).GetScaleFactor()); +#endif + +#endif // !__linux__ + + for (double scale : scales) { + size_t width = 0; + size_t height = 0; + for (const wxBitmapBundle* bmp_bndl : bmps) { +#ifdef __APPLE__ + wxSize size = bmp_bndl->GetDefaultSize(); +#else + wxSize size = bmp_bndl->GetPreferredBitmapSizeAtScale(scale); +#endif + width += size.GetWidth(); + height = std::max(height, size.GetHeight()); + } + + std::string bitmap_key = name + "," +float_to_string_decimal_point(scale); + +#ifdef __WXGTK2__ + // Broken alpha workaround + wxImage image(width, height); + image.InitAlpha(); + // Fill in with a white color. + memset(image.GetData(), 0x0ff, width * height * 3); + // Fill in with full transparency. + memset(image.GetAlpha(), 0, width * height); + size_t x = 0; + for (const wxBitmapBundle* bmp_bndl : bmps) { + wxBitmap bmp = bmp_bndl->GetBitmap(bmp_bndl->GetDefaultSize()); + if (bmp.GetWidth() > 0) { + if (bmp.GetDepth() == 32) { + wxAlphaPixelData data(bmp); + //FIXME The following method is missing from wxWidgets 3.1.1. + // It looks like the wxWidgets 3.0.3 called the wrapped bitmap's UseAlpha(). + //data.UseAlpha(); + if (data) { + for (int r = 0; r < bmp.GetHeight(); ++r) { + wxAlphaPixelData::Iterator src(data); + src.Offset(data, 0, r); + unsigned char* dst_pixels = image.GetData() + (x + r * width) * 3; + unsigned char* dst_alpha = image.GetAlpha() + x + r * width; + for (int c = 0; c < bmp.GetWidth(); ++c, ++src) { + *dst_pixels++ = src.Red(); + *dst_pixels++ = src.Green(); + *dst_pixels++ = src.Blue(); + *dst_alpha++ = src.Alpha(); + } + } + } + } + else if (bmp.GetDepth() == 24) { + wxNativePixelData data(bmp); + if (data) { + for (int r = 0; r < bmp.GetHeight(); ++r) { + wxNativePixelData::Iterator src(data); + src.Offset(data, 0, r); + unsigned char* dst_pixels = image.GetData() + (x + r * width) * 3; + unsigned char* dst_alpha = image.GetAlpha() + x + r * width; + for (int c = 0; c < bmp.GetWidth(); ++c, ++src) { + *dst_pixels++ = src.Red(); + *dst_pixels++ = src.Green(); + *dst_pixels++ = src.Blue(); + *dst_alpha++ = wxALPHA_OPAQUE; + } + } + } + } + } + x += bmp.GetScaledWidth(); + } + + bitmaps.push_back(* this->insert(bitmap_key, wxImage_to_wxBitmap_with_alpha(std::move(image)))); + +#else + + wxBitmap* bitmap = this->insert(bitmap_key, width, height, scale); + wxMemoryDC memDC; + memDC.SelectObject(*bitmap); + memDC.SetBackground(*wxTRANSPARENT_BRUSH); + memDC.Clear(); + size_t x = 0; + for (const wxBitmapBundle* bmp_bndl : bmps) { + wxBitmap bmp = bmp_bndl->GetBitmap(bmp_bndl->GetPreferredBitmapSizeAtScale(scale)); + + if (bmp.GetWidth() > 0) + memDC.DrawBitmap(bmp, x, 0, true); + // we should "move" with step equal to non-scaled width +#ifdef __APPLE__ + x += bmp.GetScaledWidth(); +#else + x += bmp.GetWidth(); +#endif + } + memDC.SelectObject(wxNullBitmap); + bitmaps.push_back(*bitmap); + +#endif + } + + return insert_bndl(name, bitmaps); +} + +wxBitmapBundle* BitmapCache::insert_bndl(const std::string &bitmap_key, const char* data, size_t width, size_t height) +{ + wxBitmapBundle* bndl = nullptr; + auto it = m_bndl_map.find(bitmap_key); + if (it == m_bndl_map.end()) { + bndl = new wxBitmapBundle(wxBitmapBundle::FromSVG(data, wxSize(width, height))); + m_bndl_map[bitmap_key] = bndl; + } + else { + bndl = it->second; + *bndl = wxBitmapBundle::FromSVG(data, wxSize(width, height)); + } + return bndl; +} + +wxBitmapBundle* BitmapCache::insert_bndl(const std::string& bitmap_key, const wxBitmapBundle& bmp) +{ + wxBitmapBundle* bndl = nullptr; + auto it = m_bndl_map.find(bitmap_key); + if (it == m_bndl_map.end()) { + bndl = new wxBitmapBundle(bmp); + m_bndl_map[bitmap_key] = bndl; + } + else { + bndl = it->second; + *bndl = wxBitmapBundle(bmp); + } + return bndl; +} + +wxBitmapBundle* BitmapCache::insert_bndl(const std::string& bitmap_key, const wxVector& bmps) +{ + wxBitmapBundle* bndl = nullptr; + auto it = m_bndl_map.find(bitmap_key); + if (it == m_bndl_map.end()) { + bndl = new wxBitmapBundle(wxBitmapBundle::FromBitmaps(bmps)); + m_bndl_map[bitmap_key] = bndl; + } + else { + bndl = it->second; + *bndl = wxBitmapBundle::FromBitmaps(bmps); + } + return bndl; +} + +wxBitmap* BitmapCache::insert(const std::string &bitmap_key, size_t width, size_t height, double scale/* = -1.0*/) { wxBitmap *bitmap = nullptr; auto it = m_map.find(bitmap_key); @@ -76,7 +240,7 @@ wxBitmap* BitmapCache::insert(const std::string &bitmap_key, size_t width, size_ // So, We need to let the Mac OS wxBitmap implementation // know that the image may already be scaled appropriately for Retina, // and thereby that it's not supposed to upscale it. - bitmap->CreateScaled(width, height, -1, m_scale); + bitmap->CreateScaled(width, height, -1, scale < 0.0 ? m_scale : scale); #endif m_map[bitmap_key] = bitmap; } else { @@ -105,110 +269,6 @@ wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap &bmp return bitmap; } -wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap &bmp, const wxBitmap &bmp2) -{ - // Copying the wxBitmaps is cheap as the bitmap's content is reference counted. - const wxBitmap bmps[2] = { bmp, bmp2 }; - return this->insert(bitmap_key, bmps, bmps + 2); -} - -wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap &bmp, const wxBitmap &bmp2, const wxBitmap &bmp3) -{ - // Copying the wxBitmaps is cheap as the bitmap's content is reference counted. - const wxBitmap bmps[3] = { bmp, bmp2, bmp3 }; - return this->insert(bitmap_key, bmps, bmps + 3); -} - -wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap *begin, const wxBitmap *end) -{ - size_t width = 0; - size_t height = 0; - for (const wxBitmap *bmp = begin; bmp != end; ++ bmp) { -#ifdef __APPLE__ - width += bmp->GetScaledWidth(); - height = std::max(height, bmp->GetScaledHeight()); -#else - width += bmp->GetWidth(); - height = std::max(height, bmp->GetHeight()); -#endif - } - -#ifdef __WXGTK2__ - // Broken alpha workaround - wxImage image(width, height); - image.InitAlpha(); - // Fill in with a white color. - memset(image.GetData(), 0x0ff, width * height * 3); - // Fill in with full transparency. - memset(image.GetAlpha(), 0, width * height); - size_t x = 0; - for (const wxBitmap *bmp = begin; bmp != end; ++ bmp) { - if (bmp->GetWidth() > 0) { - if (bmp->GetDepth() == 32) { - wxAlphaPixelData data(*const_cast(bmp)); - //FIXME The following method is missing from wxWidgets 3.1.1. - // It looks like the wxWidgets 3.0.3 called the wrapped bitmap's UseAlpha(). - //data.UseAlpha(); - if (data) { - for (int r = 0; r < bmp->GetHeight(); ++ r) { - wxAlphaPixelData::Iterator src(data); - src.Offset(data, 0, r); - unsigned char *dst_pixels = image.GetData() + (x + r * width) * 3; - unsigned char *dst_alpha = image.GetAlpha() + x + r * width; - for (int c = 0; c < bmp->GetWidth(); ++ c, ++ src) { - *dst_pixels ++ = src.Red(); - *dst_pixels ++ = src.Green(); - *dst_pixels ++ = src.Blue(); - *dst_alpha ++ = src.Alpha(); - } - } - } - } else if (bmp->GetDepth() == 24) { - wxNativePixelData data(*const_cast(bmp)); - if (data) { - for (int r = 0; r < bmp->GetHeight(); ++ r) { - wxNativePixelData::Iterator src(data); - src.Offset(data, 0, r); - unsigned char *dst_pixels = image.GetData() + (x + r * width) * 3; - unsigned char *dst_alpha = image.GetAlpha() + x + r * width; - for (int c = 0; c < bmp->GetWidth(); ++ c, ++ src) { - *dst_pixels ++ = src.Red(); - *dst_pixels ++ = src.Green(); - *dst_pixels ++ = src.Blue(); - *dst_alpha ++ = wxALPHA_OPAQUE; - } - } - } - } - } - x += bmp->GetWidth(); - } - return this->insert(bitmap_key, wxImage_to_wxBitmap_with_alpha(std::move(image))); - -#else - - wxBitmap *bitmap = this->insert(bitmap_key, width, height); - wxMemoryDC memDC; - memDC.SelectObject(*bitmap); - memDC.SetBackground(*wxTRANSPARENT_BRUSH); - memDC.Clear(); - size_t x = 0; - for (const wxBitmap *bmp = begin; bmp != end; ++ bmp) { - if (bmp->GetWidth() > 0) - memDC.DrawBitmap(*bmp, x, 0, true); -#ifdef __APPLE__ - // we should "move" with step equal to non-scaled width - x += bmp->GetScaledWidth(); -#else - x += bmp->GetWidth(); -#endif - } - memDC.SelectObject(wxNullBitmap); - return bitmap; - -#endif -} - wxBitmap* BitmapCache::insert_raw_rgba(const std::string &bitmap_key, unsigned width, unsigned height, const unsigned char *raw_data, const bool grayscale/* = false*/) { wxImage image(width, height); @@ -297,6 +357,92 @@ NSVGimage* BitmapCache::nsvgParseFromFileWithReplace(const char* filename, const return NULL; } +void BitmapCache::nsvgGetDataFromFileWithReplace(const char* filename, std::string& data_str, const std::map& replaces) +{ + FILE* fp = NULL; + size_t size; + char* data = NULL; + + fp = boost::nowide::fopen(filename, "rb"); + if (!fp) goto error; + fseek(fp, 0, SEEK_END); + size = ftell(fp); + fseek(fp, 0, SEEK_SET); + data = (char*)malloc(size + 1); + if (data == NULL) goto error; + if (fread(data, 1, size, fp) != size) goto error; + data[size] = '\0'; // Must be null terminated. + fclose(fp); + + data_str.assign(data); + for (auto val : replaces) + boost::replace_all(data_str, val.first, val.second); + + free(data); + return; + +error: + if (fp) fclose(fp); + if (data) free(data); + return; +} + +wxBitmapBundle* BitmapCache::from_svg(const std::string& bitmap_name, unsigned target_width, unsigned target_height, + const bool dark_mode, const std::string& new_color /*= ""*/) +{ + if (target_width == 0) + target_width = target_height; + std::string bitmap_key = bitmap_name + (target_height != 0 ? + "-h" + std::to_string(target_height) : + "-w" + std::to_string(target_width)) + + (dark_mode ? "-dm" : "") + + new_color; + + auto it = m_bndl_map.find(bitmap_key); + if (it != m_bndl_map.end()) + return it->second; + + // map of color replaces + std::map replaces; + if (dark_mode) + replaces["\"#808080\""] = "\"#FFFFFF\""; + if (!new_color.empty()) + replaces["\"#ED6B21\""] = "\"" + new_color + "\""; + + std::string str; + nsvgGetDataFromFileWithReplace(Slic3r::var(bitmap_name + ".svg").c_str(), str, replaces); + if (str.empty()) + return nullptr; + + return insert_bndl(bitmap_key, str.data(), target_width, target_height); +} + +wxBitmapBundle* BitmapCache::from_png(const std::string& bitmap_name, unsigned width, unsigned height) +{ + std::string bitmap_key = bitmap_name + (height != 0 ? + "-h" + std::to_string(height) : + "-w" + std::to_string(width)); + + auto it = m_bndl_map.find(bitmap_key); + if (it != m_bndl_map.end()) + return it->second; + + wxImage image; + if (!image.LoadFile(Slic3r::GUI::from_u8(Slic3r::var(bitmap_name + ".png")), wxBITMAP_TYPE_PNG) || + image.GetWidth() == 0 || image.GetHeight() == 0) + return nullptr; + + if (height != 0 && unsigned(image.GetHeight()) != height) + width = unsigned(0.5f + float(image.GetWidth()) * height / image.GetHeight()); + else if (width != 0 && unsigned(image.GetWidth()) != width) + height = unsigned(0.5f + float(image.GetHeight()) * width / image.GetWidth()); + + if (height != 0 && width != 0) + image.Rescale(width, height, wxIMAGE_QUALITY_BILINEAR); + + return this->insert_bndl(bitmap_key, wxImage_to_wxBitmap_with_alpha(std::move(image))); +} + wxBitmap* BitmapCache::load_svg(const std::string &bitmap_name, unsigned target_width, unsigned target_height, const bool grayscale/* = false*/, const bool dark_mode/* = false*/, const std::string& new_color /*= ""*/) { @@ -352,63 +498,130 @@ wxBitmap* BitmapCache::load_svg(const std::string &bitmap_name, unsigned target_ } //we make scaled solid bitmaps only for the cases, when its will be used with scaled SVG icon in one output bitmap -wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling/* = false*/, size_t border_width /*= 0*/, bool dark_mode/* = false*/) +//wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling/* = false* /, size_t border_width /*= 0* /, bool dark_mode/* = false* /) +//{ +// double scale = suppress_scaling ? 1.0f : m_scale; +// width *= scale; +// height *= scale; +// +// wxImage image(width, height); +// image.InitAlpha(); +// unsigned char* imgdata = image.GetData(); +// unsigned char* imgalpha = image.GetAlpha(); +// for (size_t i = 0; i < width * height; ++ i) { +// *imgdata ++ = r; +// *imgdata ++ = g; +// *imgdata ++ = b; +// *imgalpha ++ = transparency; +// } +// +// // Add border, make white/light spools easier to see +// if (border_width > 0) { +// +// // Restrict to width of image +// if (border_width > height) border_width = height - 1; +// if (border_width > width) border_width = width - 1; +// +// auto px_data = (uint8_t*)image.GetData(); +// auto a_data = (uint8_t*)image.GetAlpha(); +// +// for (size_t x = 0; x < width; ++x) { +// for (size_t y = 0; y < height; ++y) { +// if (x < border_width || y < border_width || +// x >= (width - border_width) || y >= (height - border_width)) { +// const size_t idx = (x + y * width); +// const size_t idx_rgb = (x + y * width) * 3; +// px_data[idx_rgb] = px_data[idx_rgb + 1] = px_data[idx_rgb + 2] = dark_mode ? 245u : 110u; +// a_data[idx] = 255u; +// } +// } +// } +// } +// +// return wxImage_to_wxBitmap_with_alpha(std::move(image), scale); +//} + +//we make scaled solid bitmaps only for the cases, when its will be used with scaled SVG icon in one output bitmap +wxBitmapBundle BitmapCache::mksolid(size_t width_in, size_t height_in, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, size_t border_width /*= 0*/, bool dark_mode/* = false*/) { - double scale = suppress_scaling ? 1.0f : m_scale; - width *= scale; - height *= scale; + wxVector bitmaps; - wxImage image(width, height); - image.InitAlpha(); - unsigned char* imgdata = image.GetData(); - unsigned char* imgalpha = image.GetAlpha(); - for (size_t i = 0; i < width * height; ++ i) { - *imgdata ++ = r; - *imgdata ++ = g; - *imgdata ++ = b; - *imgalpha ++ = transparency; - } + std::set scales = { 1.0 }; +#ifndef __linux__ + +#ifdef __APPLE__ + scales.emplace(m_scale); +#else + size_t disp_cnt = wxDisplay::GetCount(); + for (size_t disp = 0; disp < disp_cnt; ++disp) + scales.emplace(wxDisplay(disp).GetScaleFactor()); +#endif - // Add border, make white/light spools easier to see - if (border_width > 0) { +#endif // !__linux__ + + for (double scale : scales) { + size_t width = width_in * scale; + size_t height = height_in * scale; + + wxImage image(width, height); + image.InitAlpha(); + unsigned char* imgdata = image.GetData(); + unsigned char* imgalpha = image.GetAlpha(); + for (size_t i = 0; i < width * height; ++i) { + *imgdata++ = r; + *imgdata++ = g; + *imgdata++ = b; + *imgalpha++ = transparency; + } - // Restrict to width of image - if (border_width > height) border_width = height - 1; - if (border_width > width) border_width = width - 1; + // Add border, make white/light spools easier to see + if (border_width > 0) { - auto px_data = (uint8_t*)image.GetData(); - auto a_data = (uint8_t*)image.GetAlpha(); + // Restrict to width of image + if (border_width > height) border_width = height - 1; + if (border_width > width) border_width = width - 1; - for (size_t x = 0; x < width; ++x) { - for (size_t y = 0; y < height; ++y) { - if (x < border_width || y < border_width || - x >= (width - border_width) || y >= (height - border_width)) { - const size_t idx = (x + y * width); - const size_t idx_rgb = (x + y * width) * 3; - px_data[idx_rgb] = px_data[idx_rgb + 1] = px_data[idx_rgb + 2] = dark_mode ? 245u : 110u; - a_data[idx] = 255u; + auto px_data = (uint8_t*)image.GetData(); + auto a_data = (uint8_t*)image.GetAlpha(); + + for (size_t x = 0; x < width; ++x) { + for (size_t y = 0; y < height; ++y) { + if (x < border_width || y < border_width || + x >= (width - border_width) || y >= (height - border_width)) { + const size_t idx = (x + y * width); + const size_t idx_rgb = (x + y * width) * 3; + px_data[idx_rgb] = px_data[idx_rgb + 1] = px_data[idx_rgb + 2] = dark_mode ? 245u : 110u; + a_data[idx] = 255u; + } } } } - } - return wxImage_to_wxBitmap_with_alpha(std::move(image), scale); + bitmaps.push_back(wxImage_to_wxBitmap_with_alpha(std::move(image), scale)); + } + return wxBitmapBundle::FromBitmaps(bitmaps); } -bool BitmapCache::parse_color(const std::string& scolor, unsigned char* rgb_out) +wxBitmapBundle* BitmapCache::mksolid_bndl(size_t width, size_t height, const std::string& color, size_t border_width, bool dark_mode) { - rgb_out[0] = rgb_out[1] = rgb_out[2] = 0; - if (scolor.size() != 7 || scolor.front() != '#') - return false; - const char* c = scolor.data() + 1; - for (size_t i = 0; i < 3; ++i) { - int digit1 = hex_digit_to_int(*c++); - int digit2 = hex_digit_to_int(*c++); - if (digit1 == -1 || digit2 == -1) - return false; - rgb_out[i] = (unsigned char)(digit1 * 16 + digit2); + std::string bitmap_key = (color.empty() ? "empty" : color) + "-h" + std::to_string(height) + "-w" + std::to_string(width) + (dark_mode ? "-dm" : ""); + + wxBitmapBundle* bndl = nullptr; + auto it = m_bndl_map.find(bitmap_key); + if (it == m_bndl_map.end()) { + if (color.empty()) + bndl = new wxBitmapBundle(mksolid(width, height, 0, 0, 0, wxALPHA_TRANSPARENT, size_t(0))); + else { + ColorRGB rgb;// [3] ; + decode_color(color, rgb); + bndl = new wxBitmapBundle(mksolid(width, height, rgb.r_uchar(), rgb.g_uchar(), rgb.b_uchar(), wxALPHA_OPAQUE, border_width, dark_mode)); + } + m_bndl_map[bitmap_key] = bndl; } - return true; + else + return it->second; + + return bndl; } } // namespace GUI diff --git a/src/slic3r/GUI/BitmapCache.hpp b/src/slic3r/GUI/BitmapCache.hpp index 4d1d383c418..6ba9ae15b2e 100644 --- a/src/slic3r/GUI/BitmapCache.hpp +++ b/src/slic3r/GUI/BitmapCache.hpp @@ -9,9 +9,12 @@ #include #endif +#include "libslic3r/Color.hpp" + struct NSVGimage; -namespace Slic3r { namespace GUI { +namespace Slic3r { +namespace GUI { class BitmapCache { @@ -21,15 +24,19 @@ class BitmapCache void clear(); double scale() { return m_scale; } + wxBitmapBundle* find_bndl(const std::string &name) { auto it = m_bndl_map.find(name); return (it == m_bndl_map.end()) ? nullptr : it->second; } + const wxBitmapBundle* find_bndl(const std::string &name) const { return const_cast(this)->find_bndl(name); } wxBitmap* find(const std::string &name) { auto it = m_map.find(name); return (it == m_map.end()) ? nullptr : it->second; } const wxBitmap* find(const std::string &name) const { return const_cast(this)->find(name); } - wxBitmap* insert(const std::string &name, size_t width, size_t height); + wxBitmapBundle* insert_bndl(const std::string& bitmap_key, const char* data, size_t width, size_t height); + wxBitmapBundle* insert_bndl(const std::string& bitmap_key, const wxBitmapBundle &bmp); + wxBitmapBundle* insert_bndl(const std::string& bitmap_key, const wxVector& bmps); + wxBitmapBundle* insert_bndl(const std::string& name, const std::vector& bmps); + wxBitmapBundle* insert_raw_rgba_bndl(const std::string &bitmap_key, unsigned width, unsigned height, const unsigned char *raw_data, const bool grayscale = false); + + wxBitmap* insert(const std::string &name, size_t width, size_t height, double scale = -1.0); wxBitmap* insert(const std::string &name, const wxBitmap &bmp); - wxBitmap* insert(const std::string &name, const wxBitmap &bmp, const wxBitmap &bmp2); - wxBitmap* insert(const std::string &name, const wxBitmap &bmp, const wxBitmap &bmp2, const wxBitmap &bmp3); - wxBitmap* insert(const std::string &name, const std::vector &bmps) { return this->insert(name, &bmps.front(), &bmps.front() + bmps.size()); } - wxBitmap* insert(const std::string &name, const wxBitmap *begin, const wxBitmap *end); wxBitmap* insert_raw_rgba(const std::string &bitmap_key, unsigned width, unsigned height, const unsigned char *raw_data, const bool grayscale = false); // Load png from resources/icons. bitmap_key is given without the .png suffix. Bitmap will be rescaled to provided height/width if nonzero. @@ -39,17 +46,21 @@ class BitmapCache // And makes replases befor parsing // replace_map containes old_value->new_value static NSVGimage* nsvgParseFromFileWithReplace(const char* filename, const char* units, float dpi, const std::map& replaces); + // Gets a data from SVG file and makes replases + // replace_map containes old_value->new_value + static void nsvgGetDataFromFileWithReplace(const char* filename, std::string& data_str, const std::map& replaces); + wxBitmapBundle* from_svg(const std::string& bitmap_name, unsigned target_width, unsigned target_height, const bool dark_mode, const std::string& new_color = ""); + wxBitmapBundle* from_png(const std::string& bitmap_name, unsigned width, unsigned height); // Load svg from resources/icons. bitmap_key is given without the .svg suffix. SVG will be rasterized to provided height/width. wxBitmap* load_svg(const std::string &bitmap_key, unsigned width = 0, unsigned height = 0, const bool grayscale = false, const bool dark_mode = false, const std::string& new_color = ""); - wxBitmap mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling = false, size_t border_width = 0, bool dark_mode = false); - wxBitmap mksolid(size_t width, size_t height, const unsigned char rgb[3], bool suppress_scaling = false, size_t border_width = 0, bool dark_mode = false) { return mksolid(width, height, rgb[0], rgb[1], rgb[2], wxALPHA_OPAQUE, suppress_scaling, border_width, dark_mode); } - wxBitmap mkclear(size_t width, size_t height) { return mksolid(width, height, 0, 0, 0, wxALPHA_TRANSPARENT); } - - static bool parse_color(const std::string& scolor, unsigned char* rgb_out); + wxBitmapBundle mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, size_t border_width = 0, bool dark_mode = false); + wxBitmapBundle* mksolid_bndl(size_t width, size_t height, const std::string& color = std::string(), size_t border_width = 0, bool dark_mode = false); + wxBitmapBundle* mkclear_bndl(size_t width, size_t height) { return mksolid_bndl(width, height); } private: std::map m_map; + std::map m_bndl_map; double m_gs = 0.2; // value, used for image.ConvertToGreyscale(m_gs, m_gs, m_gs) double m_scale = 1.0; // value, used for correct scaling of SVG icons on Retina display }; diff --git a/src/slic3r/GUI/BitmapComboBox.cpp b/src/slic3r/GUI/BitmapComboBox.cpp index 3396c627bee..70c985cf905 100644 --- a/src/slic3r/GUI/BitmapComboBox.cpp +++ b/src/slic3r/GUI/BitmapComboBox.cpp @@ -54,17 +54,6 @@ using Slic3r::GUI::format_wxstr; namespace Slic3r { namespace GUI { -/* For PresetComboBox we use bitmaps that are created from images that are already scaled appropriately for Retina - * (Contrary to the intuition, the `scale` argument for Bitmap's constructor doesn't mean - * "please scale this to such and such" but rather - * "the wxImage is already sized for backing scale such and such". ) - * Unfortunately, the constructor changes the size of wxBitmap too. - * Thus We need to use unscaled size value for bitmaps that we use - * to avoid scaled size of control items. - * For this purpose control drawing methods and - * control size calculation methods (virtual) are overridden. - **/ - BitmapComboBox::BitmapComboBox(wxWindow* parent, wxWindowID id/* = wxID_ANY*/, const wxString& value/* = wxEmptyString*/, @@ -90,72 +79,6 @@ BitmapComboBox::~BitmapComboBox() { } -#ifdef __APPLE__ -bool BitmapComboBox::OnAddBitmap(const wxBitmap& bitmap) -{ - if (bitmap.IsOk()) - { - // we should use scaled! size values of bitmap - int width = (int)bitmap.GetScaledWidth(); - int height = (int)bitmap.GetScaledHeight(); - - if (m_usedImgSize.x < 0) - { - // If size not yet determined, get it from this image. - m_usedImgSize.x = width; - m_usedImgSize.y = height; - - // Adjust control size to vertically fit the bitmap - wxWindow* ctrl = GetControl(); - ctrl->InvalidateBestSize(); - wxSize newSz = ctrl->GetBestSize(); - wxSize sz = ctrl->GetSize(); - if (newSz.y > sz.y) - ctrl->SetSize(sz.x, newSz.y); - else - DetermineIndent(); - } - - wxCHECK_MSG(width == m_usedImgSize.x && height == m_usedImgSize.y, - false, - "you can only add images of same size"); - - return true; - } - - return false; -} - -void BitmapComboBox::OnDrawItem(wxDC& dc, - const wxRect& rect, - int item, - int flags) const -{ - const wxBitmap& bmp = *(static_cast(m_bitmaps[item])); - if (bmp.IsOk()) - { - // we should use scaled! size values of bitmap - wxCoord w = bmp.GetScaledWidth(); - wxCoord h = bmp.GetScaledHeight(); - - const int imgSpacingLeft = 4; - - // Draw the image centered - dc.DrawBitmap(bmp, - rect.x + (m_usedImgSize.x - w) / 2 + imgSpacingLeft, - rect.y + (rect.height - h) / 2, - true); - } - - wxString text = GetString(item); - if (!text.empty()) - dc.DrawText(text, - rect.x + m_imgAreaWidth + 1, - rect.y + (rect.height - dc.GetCharHeight()) / 2); -} -#endif - - #ifdef _WIN32 int BitmapComboBox::Append(const wxString& item) @@ -166,18 +89,11 @@ int BitmapComboBox::Append(const wxString& item) //2. But then set width to 0 value for no using of bitmap left and right spacing //3. Set this empty bitmap to the at list one item and BitmapCombobox will be recreated correct - wxBitmap bitmap(1, int(1.6 * wxGetApp().em_unit() + 1)); - { - // bitmap.SetWidth(0); is depricated now - // so, use next code - bitmap.UnShare();// AllocExclusive(); - bitmap.GetGDIImageData()->m_width = 0; - } - + wxBitmapBundle bitmap = *get_empty_bmp_bundle(1, 16); OnAddBitmap(bitmap); + const int n = wxComboBox::Append(item); - if (n != wxNOT_FOUND) - DoSetItemBitmap(n, bitmap); + return n; } diff --git a/src/slic3r/GUI/BitmapComboBox.hpp b/src/slic3r/GUI/BitmapComboBox.hpp index a77bf401d6a..545213fc3c7 100644 --- a/src/slic3r/GUI/BitmapComboBox.hpp +++ b/src/slic3r/GUI/BitmapComboBox.hpp @@ -29,28 +29,13 @@ BitmapComboBox(wxWindow* parent, #ifdef _WIN32 int Append(const wxString& item); #endif - int Append(const wxString& item, const wxBitmap& bitmap) + int Append(const wxString& item, const wxBitmapBundle& bitmap) { return wxBitmapComboBox::Append(item, bitmap); } protected: -#ifdef __APPLE__ -/* For PresetComboBox we use bitmaps that are created from images that are already scaled appropriately for Retina - * (Contrary to the intuition, the `scale` argument for Bitmap's constructor doesn't mean - * "please scale this to such and such" but rather - * "the wxImage is already sized for backing scale such and such". ) - * Unfortunately, the constructor changes the size of wxBitmap too. - * Thus We need to use unscaled size value for bitmaps that we use - * to avoid scaled size of control items. - * For this purpose control drawing methods and - * control size calculation methods (virtual) are overridden. - **/ -bool OnAddBitmap(const wxBitmap& bitmap) override; -void OnDrawItem(wxDC& dc, const wxRect& rect, int item, int flags) const override; -#endif - #ifdef _WIN32 bool MSWOnDraw(WXDRAWITEMSTRUCT* item) override; void DrawBackground_(wxDC& dc, const wxRect& rect, int WXUNUSED(item), int flags) const; diff --git a/src/slic3r/GUI/BonjourDialog.cpp b/src/slic3r/GUI/BonjourDialog.cpp index 516b1ab4a5b..060643c1ff1 100644 --- a/src/slic3r/GUI/BonjourDialog.cpp +++ b/src/slic3r/GUI/BonjourDialog.cpp @@ -5,6 +5,8 @@ #include #include +#include + #include #include #include @@ -15,6 +17,7 @@ #include "slic3r/GUI/GUI.hpp" #include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/I18N.hpp" +#include "slic3r/GUI/format.hpp" #include "slic3r/Utils/Bonjour.hpp" namespace Slic3r { @@ -221,19 +224,61 @@ void BonjourDialog::on_timer(wxTimerEvent &) // explicitly (wxTimerEvent should not be created by user code). void BonjourDialog::on_timer_process() { - const auto search_str = _utf8(L("Searching for devices")); + const auto search_str = _L("Searching for devices"); if (timer_state > 0) { const std::string dots(timer_state, '.'); - label->SetLabel(GUI::from_u8((boost::format("%1% %2%") % search_str % dots).str())); + label->SetLabel(search_str + dots); timer_state = (timer_state) % 3 + 1; } else { - label->SetLabel(GUI::from_u8((boost::format("%1%: %2%") % search_str % (_utf8(L("Finished"))+".")).str())); + label->SetLabel(search_str + ": " + _L("Finished") + "."); timer->Stop(); } } +IPListDialog::IPListDialog(wxWindow* parent, const wxString& hostname, const std::vector& ips, size_t& selected_index) + : wxDialog(parent, wxID_ANY, _(L("Multiple resolved IP addresses")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) + , m_list(new wxListView(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxSIMPLE_BORDER)) + , m_selected_index (selected_index) +{ + const int em = GUI::wxGetApp().em_unit(); + m_list->SetMinSize(wxSize(40 * em, 30 * em)); + + wxBoxSizer* vsizer = new wxBoxSizer(wxVERTICAL); + + auto* label = new wxStaticText(this, wxID_ANY, GUI::format_wxstr(_L("There are several IP addresses resolving to hostname %1%.\nPlease select one that should be used."), hostname)); + vsizer->Add(label, 0, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, em); + + m_list->SetSingleStyle(wxLC_SINGLE_SEL); + m_list->AppendColumn(_(L("Address")), wxLIST_FORMAT_LEFT, 40 * em); + + for (size_t i = 0; i < ips.size(); i++) + m_list->InsertItem(i, boost::nowide::widen(ips[i].to_string())); + + m_list->Select(0); + + vsizer->Add(m_list, 1, wxEXPAND | wxALL, em); + + wxBoxSizer* button_sizer = new wxBoxSizer(wxHORIZONTAL); + button_sizer->Add(new wxButton(this, wxID_OK, "OK"), 0, wxALL, em); + button_sizer->Add(new wxButton(this, wxID_CANCEL, "Cancel"), 0, wxALL, em); + + vsizer->Add(button_sizer, 0, wxALIGN_CENTER); + SetSizerAndFit(vsizer); + + GUI::wxGetApp().UpdateDlgDarkUI(this); +} +IPListDialog::~IPListDialog() +{ +} +void IPListDialog::EndModal(int retCode) +{ + if (retCode == wxID_OK) { + m_selected_index = (size_t)m_list->GetFirstSelected(); + } + wxDialog::EndModal(retCode); +} } diff --git a/src/slic3r/GUI/BonjourDialog.hpp b/src/slic3r/GUI/BonjourDialog.hpp index def0838d7e0..8bfc076c447 100644 --- a/src/slic3r/GUI/BonjourDialog.hpp +++ b/src/slic3r/GUI/BonjourDialog.hpp @@ -1,9 +1,13 @@ #ifndef slic3r_BonjourDialog_hpp_ #define slic3r_BonjourDialog_hpp_ +#include #include +#include + #include +#include #include "libslic3r/PrintConfig.hpp" @@ -11,7 +15,7 @@ class wxListView; class wxStaticText; class wxTimer; class wxTimerEvent; - +class address; namespace Slic3r { @@ -41,12 +45,26 @@ class BonjourDialog: public wxDialog unsigned timer_state; Slic3r::PrinterTechnology tech; - void on_reply(BonjourReplyEvent &); + virtual void on_reply(BonjourReplyEvent &); void on_timer(wxTimerEvent &); void on_timer_process(); }; +class IPListDialog : public wxDialog +{ +public: + IPListDialog(wxWindow* parent, const wxString& hostname, const std::vector& ips, size_t& selected_index); + IPListDialog(IPListDialog&&) = delete; + IPListDialog(const IPListDialog&) = delete; + IPListDialog& operator=(IPListDialog&&) = delete; + IPListDialog& operator=(const IPListDialog&) = delete; + ~IPListDialog(); + virtual void EndModal(int retCode) wxOVERRIDE; +private: + wxListView* m_list; + size_t& m_selected_index; +}; } diff --git a/src/slic3r/GUI/ButtonsDescription.cpp b/src/slic3r/GUI/ButtonsDescription.cpp index 2c5262d47c3..e6fd519dfa2 100644 --- a/src/slic3r/GUI/ButtonsDescription.cpp +++ b/src/slic3r/GUI/ButtonsDescription.cpp @@ -1,5 +1,6 @@ #include "ButtonsDescription.hpp" #include +#include #include #include #include @@ -7,19 +8,88 @@ #include "GUI.hpp" #include "GUI_App.hpp" #include "I18N.hpp" +#include "OptionsGroup.hpp" #include "wxExtensions.hpp" +#include "BitmapCache.hpp" namespace Slic3r { namespace GUI { -void ButtonsDescription::FillSizerWithTextColorDescriptions(wxSizer* sizer, wxWindow* parent, wxColourPickerCtrl** sys_colour, wxColourPickerCtrl** mod_colour) +//static ModePaletteComboBox::PalettesMap MODE_PALETTES = +static std::vector>> MODE_PALETTES = +{ + { L("Palette 1 (default)"), { "#00B000", "#FFDC00", "#E70000" } }, + { L("Palette 2"), { "#FC766A", "#B0B8B4", "#184A45" } }, + { L("Palette 3"), { "#567572", "#964F4C", "#696667" } }, + { L("Palette 4"), { "#DA291C", "#56A8CB", "#53A567" } }, + { L("Palette 5"), { "#F65058", "#FBDE44", "#28334A" } }, + { L("Palette 6"), { "#FF3EA5", "#EDFF00", "#00A4CC" } }, + { L("Palette 7"), { "#E95C20", "#006747", "#4F2C1D" } }, + { L("Palette 8"), { "#D9514E", "#2A2B2D", "#2DA8D8" } } +}; + +ModePaletteComboBox::ModePaletteComboBox(wxWindow* parent) : + BitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY) +{ + for (const auto& palette : MODE_PALETTES) + Append(_(palette.first), *get_bmp(palette.second)); +} + +void ModePaletteComboBox::UpdateSelection(const std::vector &palette_in) +{ + for (size_t idx = 0; idx < MODE_PALETTES.size(); ++idx ) { + const auto& palette = MODE_PALETTES[idx].second; + + bool is_selected = true; + for (size_t mode = 0; mode < palette_in.size(); mode++) + if (wxColour(palette[mode]) != palette_in[mode]) { + is_selected = false; + break; + } + if (is_selected) { + Select(int(idx)); + return; + } + } + + Select(-1); +} + +BitmapCache& ModePaletteComboBox::bitmap_cache() +{ + static BitmapCache bmps; + return bmps; +} + +wxBitmapBundle * ModePaletteComboBox::get_bmp(const std::vector &palette) +{ + std::string bitmap_key; + for (const auto& color : palette) + bitmap_key += color + "+"; + + const int icon_height = wxOSX ? 10 : 12; + + wxBitmapBundle* bmp_bndl = bitmap_cache().find_bndl(bitmap_key); + if (bmp_bndl == nullptr) { + // Create the bitmap with color bars. + std::vector bmps; + for (const auto& color : palette) { + bmps.emplace_back(get_bmp_bundle("mode", icon_height, color)); + bmps.emplace_back(get_empty_bmp_bundle(wxOSX ? 5 : 6, icon_height)); + } + bmp_bndl = bitmap_cache().insert_bndl(bitmap_key, bmps); + } + + return bmp_bndl; +} + +namespace GUI_Descriptions { + +void FillSizerWithTextColorDescriptions(wxSizer* sizer, wxWindow* parent, wxColourPickerCtrl** sys_colour, wxColourPickerCtrl** mod_colour) { wxFlexGridSizer* grid_sizer = new wxFlexGridSizer(3, 5, 5); sizer->Add(grid_sizer, 0, wxEXPAND); - ScalableBitmap bmp_delete = ScalableBitmap(parent, "cross"); - ScalableBitmap bmp_delete_focus = ScalableBitmap(parent, "cross_focus"); - auto add_color = [grid_sizer, parent](wxColourPickerCtrl** color_picker, const wxColour& color, const wxColour& def_color, wxString label_text) { // wrap the label_text to the max 80 characters if (label_text.Len() > 80) { @@ -51,14 +121,82 @@ void ButtonsDescription::FillSizerWithTextColorDescriptions(wxSizer* sizer, wxWi grid_sizer->Add(*color_picker, 0, wxALIGN_CENTRE_VERTICAL); grid_sizer->Add(btn, 0, wxALIGN_CENTRE_VERTICAL); - grid_sizer->Add(sys_label, 0, wxALIGN_CENTRE_VERTICAL | wxEXPAND); + grid_sizer->Add(sys_label, 0, wxALIGN_CENTRE_VERTICAL); }; add_color(sys_colour, wxGetApp().get_label_clr_sys(), wxGetApp().get_label_default_clr_system(), _L("Value is the same as the system value")); add_color(mod_colour, wxGetApp().get_label_clr_modified(),wxGetApp().get_label_default_clr_modified(), _L("Value was changed and is not equal to the system value or the last saved preset")); } -ButtonsDescription::ButtonsDescription(wxWindow* parent, const std::vector &entries) : +void FillSizerWithModeColorDescriptions( + wxSizer* sizer, wxWindow* parent, + std::vector clr_pickers, + std::vector& mode_palette) +{ + const int margin = em_unit(parent); + + auto palette_cb = new ModePaletteComboBox(parent); + palette_cb->UpdateSelection(mode_palette); + + palette_cb->Bind(wxEVT_COMBOBOX, [clr_pickers, &mode_palette](wxCommandEvent& evt) { + const int selection = evt.GetSelection(); + if (selection < 0) + return; + const auto& palette = MODE_PALETTES[selection]; + for (int mode = 0; mode < 3; mode++) + if (*clr_pickers[mode]) { + wxColour clr = wxColour(palette.second[mode]); + (*clr_pickers[mode])->SetColour(clr); + mode_palette[mode] = clr; + } + }); + + wxBoxSizer* h_sizer = new wxBoxSizer(wxHORIZONTAL); + h_sizer->Add(new wxStaticText(parent, wxID_ANY, _L("Default palette for mode markers") + ": "), 0, wxALIGN_CENTER_VERTICAL); + h_sizer->Add(palette_cb, 1, wxEXPAND); + + sizer->Add(h_sizer, 0, wxEXPAND | wxBOTTOM, margin); + + wxFlexGridSizer* grid_sizer = new wxFlexGridSizer(9, 5, 5); + sizer->Add(grid_sizer, 0, wxEXPAND); + + const std::vector names = { _L("Simple"), _CTX("Advanced", "Mode"), _L("Expert") }; + + for (size_t mode = 0; mode < names.size(); ++mode) { + wxColour& color = mode_palette[mode]; + + wxColourPickerCtrl** color_picker = clr_pickers[mode]; + *color_picker = new wxColourPickerCtrl(parent, wxID_ANY, color); + wxGetApp().UpdateDarkUI((*color_picker)->GetPickerCtrl(), true); + + (*color_picker)->Bind(wxEVT_COLOURPICKER_CHANGED, [color_picker, &color, palette_cb, &mode_palette](wxCommandEvent&) { + const wxColour new_color = (*color_picker)->GetColour(); + if (new_color != color) { + color = new_color; + palette_cb->UpdateSelection(mode_palette); + } + }); + + wxColour def_color = color; + auto btn = new ScalableButton(parent, wxID_ANY, "undo"); + btn->SetToolTip(_L("Revert color")); + + btn->Bind(wxEVT_BUTTON, [color_picker, &color, def_color, palette_cb, &mode_palette](wxEvent& event) { + color = def_color; + (*color_picker)->SetColour(def_color); + palette_cb->UpdateSelection(mode_palette); + }); + parent->Bind(wxEVT_UPDATE_UI, [color_picker, def_color](wxUpdateUIEvent& evt) { + evt.Enable((*color_picker)->GetColour() != def_color); + }, btn->GetId()); + + grid_sizer->Add(*color_picker, 0, wxALIGN_CENTRE_VERTICAL); + grid_sizer->Add(btn, 0, wxALIGN_CENTRE_VERTICAL); + grid_sizer->Add(new wxStaticText(parent, wxID_ANY, names[mode]), 0, wxALIGN_CENTRE_VERTICAL | wxRIGHT, 2*margin); + } +} + +Dialog::Dialog(wxWindow* parent, const std::vector &entries) : wxDialog(parent, wxID_ANY, _(L("Buttons And Text Colors Description")), wxDefaultPosition, wxDefaultSize), m_entries(entries) { @@ -70,20 +208,27 @@ ButtonsDescription::ButtonsDescription(wxWindow* parent, const std::vectorAdd(grid_sizer, 0, wxEXPAND | wxALL, 20); // Icon description - for (const Entry &entry : m_entries) + for (const ButtonEntry &entry : m_entries) { auto icon = new wxStaticBitmap(this, wxID_ANY, entry.bitmap->bmp()); grid_sizer->Add(icon, -1, wxALIGN_CENTRE_VERTICAL); auto description = new wxStaticText(this, wxID_ANY, _(entry.symbol)); grid_sizer->Add(description, -1, wxALIGN_CENTRE_VERTICAL); description = new wxStaticText(this, wxID_ANY, _(entry.explanation)); - grid_sizer->Add(description, -1, wxALIGN_CENTRE_VERTICAL | wxEXPAND); + grid_sizer->Add(description, -1, wxALIGN_CENTRE_VERTICAL); } // Text color description wxSizer* sizer = new wxBoxSizer(wxVERTICAL); - FillSizerWithTextColorDescriptions(sizer, this, &sys_colour, &mod_colour); - main_sizer->Add(sizer, 0, wxEXPAND | wxALL, 20); + GUI_Descriptions::FillSizerWithTextColorDescriptions(sizer, this, &sys_colour, &mod_colour); + main_sizer->Add(sizer, 0, wxEXPAND | wxALL, 20); + + // Mode color markers description + mode_palette = wxGetApp().get_mode_palette(); + + wxSizer* mode_sizer = new wxBoxSizer(wxVERTICAL); + GUI_Descriptions::FillSizerWithModeColorDescriptions(mode_sizer, this, { &simple, &advanced, &expert }, mode_palette); + main_sizer->Add(mode_sizer, 0, wxEXPAND | wxALL, 20); auto buttons = CreateStdDialogButtonSizer(wxOK|wxCANCEL); main_sizer->Add(buttons, 0, wxALIGN_CENTER_HORIZONTAL | wxBOTTOM, 10); @@ -92,8 +237,10 @@ ButtonsDescription::ButtonsDescription(wxWindow* parent, const std::vectorBind(wxEVT_BUTTON, [this](wxCommandEvent&) { wxGetApp().set_label_clr_sys(sys_colour->GetColour()); wxGetApp().set_label_clr_modified(mod_colour->GetColour()); + wxGetApp().set_mode_palette(mode_palette); + EndModal(wxID_OK); - }); + }); wxGetApp().UpdateDarkUI(btn); wxGetApp().UpdateDarkUI(static_cast(FindWindowById(wxID_CANCEL, this))); @@ -102,6 +249,7 @@ ButtonsDescription::ButtonsDescription(wxWindow* parent, const std::vectorSetSizeHints(this); } +} // GUI_Descriptions } // GUI } // Slic3r diff --git a/src/slic3r/GUI/ButtonsDescription.hpp b/src/slic3r/GUI/ButtonsDescription.hpp index fbed36c2abc..13aa909ab45 100644 --- a/src/slic3r/GUI/ButtonsDescription.hpp +++ b/src/slic3r/GUI/ButtonsDescription.hpp @@ -4,34 +4,71 @@ #include #include +#include + +#include "BitmapComboBox.hpp" + class ScalableBitmap; class wxColourPickerCtrl; namespace Slic3r { namespace GUI { -class ButtonsDescription : public wxDialog +class BitmapCache; + +// --------------------------------- +// *** PaletteComboBox *** +// --------------------------------- + +// BitmapComboBox used to palets list in GUI Preferences +class ModePaletteComboBox : public BitmapComboBox { - wxColourPickerCtrl* sys_colour{ nullptr }; - wxColourPickerCtrl* mod_colour{ nullptr }; public: - struct Entry { - Entry(ScalableBitmap *bitmap, const std::string &symbol, const std::string &explanation) : bitmap(bitmap), symbol(symbol), explanation(explanation) {} + ModePaletteComboBox(wxWindow* parent); + ~ModePaletteComboBox() = default; + + void UpdateSelection(const std::vector& palette_in); - ScalableBitmap *bitmap; - std::string symbol; - std::string explanation; - }; +protected: + // Caching bitmaps for the all bitmaps, used in preset comboboxes + static BitmapCache& bitmap_cache(); + wxBitmapBundle* get_bmp( const std::vector& palette); +}; - ButtonsDescription(wxWindow* parent, const std::vector &entries); - ~ButtonsDescription() {} +namespace GUI_Descriptions { - static void FillSizerWithTextColorDescriptions(wxSizer* sizer, wxWindow* parent, wxColourPickerCtrl** sys_colour, wxColourPickerCtrl** mod_colour); +struct ButtonEntry { + ButtonEntry(ScalableBitmap *bitmap, const std::string &symbol, const std::string &explanation) : bitmap(bitmap), symbol(symbol), explanation(explanation) {} -private: - std::vector m_entries; + ScalableBitmap *bitmap; + std::string symbol; + std::string explanation; }; +class Dialog : public wxDialog +{ + std::vector m_entries; + + wxColourPickerCtrl* sys_colour{ nullptr }; + wxColourPickerCtrl* mod_colour{ nullptr }; + + wxColourPickerCtrl* simple { nullptr }; + wxColourPickerCtrl* advanced { nullptr }; + wxColourPickerCtrl* expert { nullptr }; + + std::vector mode_palette; +public: + + Dialog(wxWindow* parent, const std::vector &entries); + ~Dialog() {} +}; + +extern void FillSizerWithTextColorDescriptions(wxSizer* sizer, wxWindow* parent, wxColourPickerCtrl** sys_colour, wxColourPickerCtrl** mod_colour); +extern void FillSizerWithModeColorDescriptions(wxSizer* sizer, wxWindow* parent, + std::vector clr_pickers, + std::vector& mode_palette); +} // GUI_Descriptions + } // GUI } // Slic3r diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index 44b0cd84a1c..4152ca35853 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -36,10 +36,8 @@ void Camera::set_type(EType type) { if (m_type != type && (type == EType::Ortho || type == EType::Perspective)) { m_type = type; - if (m_update_config_on_type_change_enabled) { + if (m_update_config_on_type_change_enabled) wxGetApp().app_config->set("use_perspective_camera", (m_type == EType::Perspective) ? "1" : "0"); - wxGetApp().app_config->save(); - } } } @@ -91,6 +89,78 @@ void Camera::select_view(const std::string& direction) look_at(m_target + m_distance * Vec3d::UnitY(), m_target, Vec3d::UnitZ()); } +double Camera::get_near_left() const +{ + switch (m_type) + { + case EType::Perspective: + return m_frustrum_zs.first * (m_projection_matrix.matrix()(0, 2) - 1.0) / m_projection_matrix.matrix()(0, 0); + default: + case EType::Ortho: + return -1.0 / m_projection_matrix.matrix()(0, 0) - 0.5 * m_projection_matrix.matrix()(0, 0) * m_projection_matrix.matrix()(0, 3); + } +} + +double Camera::get_near_right() const +{ + switch (m_type) + { + case EType::Perspective: + return m_frustrum_zs.first * (m_projection_matrix.matrix()(0, 2) + 1.0) / m_projection_matrix.matrix()(0, 0); + default: + case EType::Ortho: + return 1.0 / m_projection_matrix.matrix()(0, 0) - 0.5 * m_projection_matrix.matrix()(0, 0) * m_projection_matrix.matrix()(0, 3); + } +} + +double Camera::get_near_top() const +{ + switch (m_type) + { + case EType::Perspective: + return m_frustrum_zs.first * (m_projection_matrix.matrix()(1, 2) + 1.0) / m_projection_matrix.matrix()(1, 1); + default: + case EType::Ortho: + return 1.0 / m_projection_matrix.matrix()(1, 1) - 0.5 * m_projection_matrix.matrix()(1, 1) * m_projection_matrix.matrix()(1, 3); + } +} + +double Camera::get_near_bottom() const +{ + switch (m_type) + { + case EType::Perspective: + return m_frustrum_zs.first * (m_projection_matrix.matrix()(1, 2) - 1.0) / m_projection_matrix.matrix()(1, 1); + default: + case EType::Ortho: + return -1.0 / m_projection_matrix.matrix()(1, 1) - 0.5 * m_projection_matrix.matrix()(1, 1) * m_projection_matrix.matrix()(1, 3); + } +} + +double Camera::get_near_width() const +{ + switch (m_type) + { + case EType::Perspective: + return 2.0 * m_frustrum_zs.first / m_projection_matrix.matrix()(0, 0); + default: + case EType::Ortho: + return 2.0 / m_projection_matrix.matrix()(0, 0); + } +} + +double Camera::get_near_height() const +{ + switch (m_type) + { + case EType::Perspective: + return 2.0 * m_frustrum_zs.first / m_projection_matrix.matrix()(1, 1); + default: + case EType::Ortho: + return 2.0 / m_projection_matrix.matrix()(1, 1); + } +} + double Camera::get_fov() const { switch (m_type) @@ -103,17 +173,14 @@ double Camera::get_fov() const }; } -void Camera::apply_viewport(int x, int y, unsigned int w, unsigned int h) +void Camera::set_viewport(int x, int y, unsigned int w, unsigned int h) { - glsafe(::glViewport(0, 0, w, h)); - glsafe(::glGetIntegerv(GL_VIEWPORT, m_viewport.data())); + m_viewport = { 0, 0, int(w), int(h) }; } -void Camera::apply_view_matrix() +void Camera::apply_viewport() const { - glsafe(::glMatrixMode(GL_MODELVIEW)); - glsafe(::glLoadIdentity()); - glsafe(::glMultMatrixd(m_view_matrix.data())); + glsafe(::glViewport(m_viewport[0], m_viewport[1], m_viewport[2], m_viewport[3])); } void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double far_z) @@ -121,11 +188,7 @@ void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double fa double w = 0.0; double h = 0.0; - const double old_distance = m_distance; m_frustrum_zs = calc_tight_frustrum_zs_around(box); - if (m_distance != old_distance) - // the camera has been moved re-apply view matrix - apply_view_matrix(); if (near_z > 0.0) m_frustrum_zs.first = std::max(std::min(m_frustrum_zs.first, near_z), FrustrumMinNearZ); @@ -159,26 +222,36 @@ void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double fa } } - glsafe(::glMatrixMode(GL_PROJECTION)); - glsafe(::glLoadIdentity()); + apply_projection(-w, w, -h, h, m_frustrum_zs.first, m_frustrum_zs.second); +} + +void Camera::apply_projection(double left, double right, double bottom, double top, double near_z, double far_z) +{ + assert(left != right && bottom != top && near_z != far_z); + const double inv_dx = 1.0 / (right - left); + const double inv_dy = 1.0 / (top - bottom); + const double inv_dz = 1.0 / (far_z - near_z); switch (m_type) { default: case EType::Ortho: { - glsafe(::glOrtho(-w, w, -h, h, m_frustrum_zs.first, m_frustrum_zs.second)); + m_projection_matrix.matrix() << 2.0 * inv_dx, 0.0, 0.0, -(left + right) * inv_dx, + 0.0, 2.0 * inv_dy, 0.0, -(bottom + top) * inv_dy, + 0.0, 0.0, -2.0 * inv_dz, -(near_z + far_z) * inv_dz, + 0.0, 0.0, 0.0, 1.0; break; } case EType::Perspective: { - glsafe(::glFrustum(-w, w, -h, h, m_frustrum_zs.first, m_frustrum_zs.second)); + m_projection_matrix.matrix() << 2.0 * near_z * inv_dx, 0.0, (left + right) * inv_dx, 0.0, + 0.0, 2.0 * near_z * inv_dy, (bottom + top) * inv_dy, 0.0, + 0.0, 0.0, -(near_z + far_z) * inv_dz, -2.0 * near_z * far_z * inv_dz, + 0.0, 0.0, -1.0, 0.0; break; } } - - glsafe(::glGetDoublev(GL_PROJECTION_MATRIX, m_projection_matrix.data())); - glsafe(::glMatrixMode(GL_MODELVIEW)); } void Camera::zoom_to_box(const BoundingBoxf3& box, double margin_factor) @@ -210,7 +283,7 @@ void Camera::debug_render() const imgui.begin(std::string("Camera statistics"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); std::string type = get_type_as_string(); - if (wxGetApp().plater()->get_mouse3d_controller().connected() || (wxGetApp().app_config->get("use_free_camera") == "1")) + if (wxGetApp().plater()->get_mouse3d_controller().connected() || (wxGetApp().app_config->get_bool("use_free_camera"))) type += "/free"; else type += "/constrained"; @@ -298,8 +371,8 @@ std::pair Camera::calc_tight_frustrum_zs_around(const BoundingBo // box in eye space const BoundingBoxf3 eye_box = box.transformed(m_view_matrix); - near_z = -eye_box.max(2); - far_z = -eye_box.min(2); + near_z = -eye_box.max.z(); + far_z = -eye_box.min.z(); // apply margin near_z -= FrustrumZMargin; @@ -465,19 +538,19 @@ void Camera::look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up m_distance = (position - target).norm(); const Vec3d new_position = m_target + m_distance * unit_z; - m_view_matrix(0, 0) = unit_x(0); - m_view_matrix(0, 1) = unit_x(1); - m_view_matrix(0, 2) = unit_x(2); + m_view_matrix(0, 0) = unit_x.x(); + m_view_matrix(0, 1) = unit_x.y(); + m_view_matrix(0, 2) = unit_x.z(); m_view_matrix(0, 3) = -unit_x.dot(new_position); - m_view_matrix(1, 0) = unit_y(0); - m_view_matrix(1, 1) = unit_y(1); - m_view_matrix(1, 2) = unit_y(2); + m_view_matrix(1, 0) = unit_y.x(); + m_view_matrix(1, 1) = unit_y.y(); + m_view_matrix(1, 2) = unit_y.z(); m_view_matrix(1, 3) = -unit_y.dot(new_position); - m_view_matrix(2, 0) = unit_z(0); - m_view_matrix(2, 1) = unit_z(1); - m_view_matrix(2, 2) = unit_z(2); + m_view_matrix(2, 0) = unit_z.x(); + m_view_matrix(2, 1) = unit_z.y(); + m_view_matrix(2, 2) = unit_z.z(); m_view_matrix(2, 3) = -unit_z.dot(new_position); m_view_matrix(3, 0) = 0.0; diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp index a61eb44ec57..abca87b9d20 100644 --- a/src/slic3r/GUI/Camera.hpp +++ b/src/slic3r/GUI/Camera.hpp @@ -89,13 +89,21 @@ struct Camera double get_far_z() const { return m_frustrum_zs.second; } const std::pair& get_z_range() const { return m_frustrum_zs; } + double get_near_left() const; + double get_near_right() const; + double get_near_top() const; + double get_near_bottom() const; + double get_near_width() const; + double get_near_height() const; + double get_fov() const; - void apply_viewport(int x, int y, unsigned int w, unsigned int h); - void apply_view_matrix(); + void set_viewport(int x, int y, unsigned int w, unsigned int h); + void apply_viewport() const; // Calculates and applies the projection matrix tighting the frustrum z range around the given box. // If larger z span is needed, pass the desired values of near and far z (negative values are ignored) void apply_projection(const BoundingBoxf3& box, double near_z = -1.0, double far_z = -1.0); + void apply_projection(double left, double right, double bottom, double top, double near_z, double far_z); void zoom_to_box(const BoundingBoxf3& box, double margin_factor = DefaultZoomToBoxMarginFactor); void zoom_to_volumes(const GLVolumePtrs& volumes, double margin_factor = DefaultZoomToVolumesMarginFactor); diff --git a/src/slic3r/GUI/CameraUtils.cpp b/src/slic3r/GUI/CameraUtils.cpp new file mode 100644 index 00000000000..99d022e4bcf --- /dev/null +++ b/src/slic3r/GUI/CameraUtils.cpp @@ -0,0 +1,131 @@ +#include "CameraUtils.hpp" +#include // projecting points +#include + +#include "slic3r/GUI/3DScene.hpp" // GLVolume +#include "libslic3r/Geometry/ConvexHull.hpp" + +using namespace Slic3r; +using namespace GUI; + +Points CameraUtils::project(const Camera & camera, + const std::vector &points) +{ + Vec4i viewport(camera.get_viewport().data()); + + // Convert our std::vector to Eigen dynamic matrix. + Eigen::Matrix + pts(points.size(), 3); + for (size_t i = 0; i < points.size(); ++i) + pts.block<1, 3>(i, 0) = points[i]; + + // Get the projections. + Eigen::Matrix projections; + igl::project(pts, camera.get_view_matrix().matrix(), + camera.get_projection_matrix().matrix(), viewport, projections); + + Points result; + result.reserve(points.size()); + int window_height = viewport[3]; + + // convert to points --> loss precision + for (int i = 0; i < projections.rows(); ++i) { + double x = projections(i, 0); + double y = projections(i, 1); + // opposit direction o Y + result.emplace_back(x, window_height - y); + } + return result; +} + +Point CameraUtils::project(const Camera &camera, const Vec3d &point) +{ + // IMPROVE: do it faster when you need it (inspire in project multi point) + return project(camera, std::vector{point}).front(); +} + +Slic3r::Polygon CameraUtils::create_hull2d(const Camera & camera, + const GLVolume &volume) +{ + std::vector vertices; + const TriangleMesh *hull = volume.convex_hull(); + if (hull != nullptr) { + const indexed_triangle_set &its = hull->its; + vertices.reserve(its.vertices.size()); + // cast vector + for (const Vec3f &vertex : its.vertices) + vertices.emplace_back(vertex.cast()); + } else { + // Negative volume doesn't have convex hull so use bounding box + auto bb = volume.bounding_box(); + Vec3d &min = bb.min; + Vec3d &max = bb.max; + vertices = {min, + Vec3d(min.x(), min.y(), max.z()), + Vec3d(min.x(), max.y(), min.z()), + Vec3d(min.x(), max.y(), max.z()), + Vec3d(max.x(), min.y(), min.z()), + Vec3d(max.x(), min.y(), max.z()), + Vec3d(max.x(), max.y(), min.z()), + max}; + } + + const Transform3d &trafoMat = + volume.get_instance_transformation().get_matrix() * + volume.get_volume_transformation().get_matrix(); + for (Vec3d &vertex : vertices) + vertex = trafoMat * vertex.cast(); + + Points vertices_2d = project(camera, vertices); + return Geometry::convex_hull(vertices_2d); +} + +void CameraUtils::ray_from_screen_pos(const Camera &camera, const Vec2d &position, Vec3d &point, Vec3d &direction) { + switch (camera.get_type()) { + case Camera::EType::Ortho: return ray_from_ortho_screen_pos(camera, position, point, direction); + case Camera::EType::Perspective: return ray_from_persp_screen_pos(camera, position, point, direction); + default: break; + } +} + +Vec3d CameraUtils::screen_point(const Camera &camera, const Vec2d &position) +{ + double height = camera.get_viewport().data()[3]; + // Y coordinate has opposit direction + return Vec3d(position.x(), height - position.y(), 0.); +} + +void CameraUtils::ray_from_ortho_screen_pos(const Camera &camera, const Vec2d &position, Vec3d &point, Vec3d &direction) +{ + assert(camera.get_type() == Camera::EType::Ortho); + Matrix4d modelview = camera.get_view_matrix().matrix(); + Matrix4d projection = camera.get_projection_matrix().matrix(); + Vec4i viewport(camera.get_viewport().data()); + igl::unproject(screen_point(camera,position), modelview, projection, viewport, point); + direction = camera.get_dir_forward(); +} +void CameraUtils::ray_from_persp_screen_pos(const Camera &camera, const Vec2d &position, Vec3d &point, Vec3d &direction) +{ + assert(camera.get_type() == Camera::EType::Perspective); + Matrix4d modelview = camera.get_view_matrix().matrix(); + Matrix4d projection = camera.get_projection_matrix().matrix(); + Vec4i viewport(camera.get_viewport().data()); + igl::unproject(screen_point(camera, position), modelview, projection, viewport, point); + direction = point - camera.get_position(); +} + +Vec2d CameraUtils::get_z0_position(const Camera &camera, const Vec2d & coor) +{ + Vec3d p0, dir; + ray_from_screen_pos(camera, coor, p0, dir); + + // is approx zero + if ((fabs(dir.z()) - 1e-4) < 0) + return Vec2d(std::numeric_limits::max(), + std::numeric_limits::max()); + + // find position of ray cross plane(z = 0) + double t = p0.z() / dir.z(); + Vec3d p = p0 - t * dir; + return Vec2d(p.x(), p.y()); +} diff --git a/src/slic3r/GUI/CameraUtils.hpp b/src/slic3r/GUI/CameraUtils.hpp new file mode 100644 index 00000000000..c3e938ec426 --- /dev/null +++ b/src/slic3r/GUI/CameraUtils.hpp @@ -0,0 +1,69 @@ +#ifndef slic3r_CameraUtils_hpp_ +#define slic3r_CameraUtils_hpp_ + +#include "Camera.hpp" +#include "libslic3r/Point.hpp" +namespace Slic3r { +class GLVolume; +} + +namespace Slic3r::GUI { +/// +/// Help divide camera data and camera functions +/// This utility work with camera data by static funtions +/// +class CameraUtils +{ +public: + CameraUtils() = delete; // only static functions + + /// + /// Project point throw camera to 2d coordinate into imgui window + /// + /// Projection params + /// Point to project. + /// projected points by camera into coordinate of camera. + /// x(from left to right), y(from top to bottom) + static Points project(const Camera& camera, const std::vector &points); + static Point project(const Camera& camera, const Vec3d &point); + + /// + /// Create hull around GLVolume in 2d space of camera + /// + /// Projection params + /// Outline by 3d object + /// Polygon around object + static Polygon create_hull2d(const Camera &camera, const GLVolume &volume); + + /// + /// Create ray(point and direction) for screen coordinate + /// + /// Definition of camera + /// Position on screen(aka mouse position) + /// OUT start of ray + /// OUT direction of ray + static void ray_from_screen_pos(const Camera &camera, const Vec2d &position, Vec3d &point, Vec3d &direction); + static void ray_from_ortho_screen_pos(const Camera &camera, const Vec2d &position, Vec3d &point, Vec3d &direction); + static void ray_from_persp_screen_pos(const Camera &camera, const Vec2d &position, Vec3d &point, Vec3d &direction); + + /// + /// Unproject mouse coordinate to get position in space where z coor is zero + /// Platter surface should be in z == 0 + /// + /// Projection params + /// Mouse position + /// Position on platter under mouse + static Vec2d get_z0_position(const Camera &camera, const Vec2d &coor); + + /// + /// Create 3d screen point from 2d position + /// + /// Define camera viewport + /// Position on screen(aka mouse position) + /// Point represented screen coor in 3d + static Vec3d screen_point(const Camera &camera, const Vec2d &position); + +}; +} // Slic3r::GUI + +#endif /* slic3r_CameraUtils_hpp_ */ diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 34401327100..4c5b0fd8e21 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -7,6 +7,7 @@ #include "libslic3r/PresetBundle.hpp" #include "MsgDialog.hpp" +#include #include namespace Slic3r { @@ -76,7 +77,6 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con fill_density == 0 && ! config->opt_bool("support_material") && config->opt_int("support_material_enforce_layers") == 0 && - config->opt_bool("ensure_vertical_shell_thickness") && ! config->opt_bool("thin_walls"))) { wxString msg_text = _(L("The Spiral Vase mode requires:\n" @@ -84,7 +84,6 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con "- no top solid layers\n" "- 0% fill density\n" "- no support material\n" - "- Ensure vertical shell thickness enabled\n" "- Detect thin walls disabled")); if (is_global_config) msg_text += "\n\n" + _(L("Shall I adjust those settings in order to enable Spiral Vase?")); @@ -99,7 +98,6 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con new_conf.set_key_value("fill_density", new ConfigOptionPercent(0)); new_conf.set_key_value("support_material", new ConfigOptionBool(false)); new_conf.set_key_value("support_material_enforce_layers", new ConfigOptionInt(0)); - new_conf.set_key_value("ensure_vertical_shell_thickness", new ConfigOptionBool(true)); new_conf.set_key_value("thin_walls", new ConfigOptionBool(false)); fill_density = 0; support = false; @@ -115,44 +113,46 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con } } - if (config->opt_bool("wipe_tower") && config->opt_bool("support_material") && - config->opt_float("support_material_contact_distance") > 0. && - (config->opt_int("support_material_extruder") != 0 || config->opt_int("support_material_interface_extruder") != 0)) { - wxString msg_text = _(L("The Wipe Tower currently supports the non-soluble supports only\n" - "if they are printed with the current extruder without triggering a tool change.\n" - "(both support_material_extruder and support_material_interface_extruder need to be set to 0).")); - if (is_global_config) - msg_text += "\n\n" + _(L("Shall I adjust those settings in order to enable the Wipe Tower?")); - MessageDialog dialog (m_msg_dlg_parent, msg_text, _(L("Wipe Tower")), - wxICON_WARNING | (is_global_config ? wxYES | wxNO : wxOK)); - DynamicPrintConfig new_conf = *config; - auto answer = dialog.ShowModal(); - if (!is_global_config || answer == wxID_YES) { - new_conf.set_key_value("support_material_extruder", new ConfigOptionInt(0)); - new_conf.set_key_value("support_material_interface_extruder", new ConfigOptionInt(0)); - } - else - new_conf.set_key_value("wipe_tower", new ConfigOptionBool(false)); - apply(config, &new_conf); - } - - if (config->opt_bool("wipe_tower") && config->opt_bool("support_material") && - config->opt_float("support_material_contact_distance") == 0 && - !config->opt_bool("support_material_synchronize_layers")) { - wxString msg_text = _(L("For the Wipe Tower to work with the soluble supports, the support layers\n" - "need to be synchronized with the object layers.")); - if (is_global_config) - msg_text += "\n\n" + _(L("Shall I synchronize support layers in order to enable the Wipe Tower?")); - MessageDialog dialog(m_msg_dlg_parent, msg_text, _(L("Wipe Tower")), - wxICON_WARNING | (is_global_config ? wxYES | wxNO : wxOK)); - DynamicPrintConfig new_conf = *config; - auto answer = dialog.ShowModal(); - if (!is_global_config || answer == wxID_YES) { - new_conf.set_key_value("support_material_synchronize_layers", new ConfigOptionBool(true)); + if (config->opt_bool("wipe_tower") && config->opt_bool("support_material") && + // Organic supports are always synchronized with object layers as of now. + config->opt_enum("support_material_style") != smsOrganic) { + if (config->opt_float("support_material_contact_distance") == 0) { + if (!config->opt_bool("support_material_synchronize_layers")) { + wxString msg_text = _(L("For the Wipe Tower to work with the soluble supports, the support layers\n" + "need to be synchronized with the object layers.")); + if (is_global_config) + msg_text += "\n\n" + _(L("Shall I synchronize support layers in order to enable the Wipe Tower?")); + MessageDialog dialog(m_msg_dlg_parent, msg_text, _(L("Wipe Tower")), + wxICON_WARNING | (is_global_config ? wxYES | wxNO : wxOK)); + DynamicPrintConfig new_conf = *config; + auto answer = dialog.ShowModal(); + if (!is_global_config || answer == wxID_YES) { + new_conf.set_key_value("support_material_synchronize_layers", new ConfigOptionBool(true)); + } + else + new_conf.set_key_value("wipe_tower", new ConfigOptionBool(false)); + apply(config, &new_conf); + } + } else { + if ((config->opt_int("support_material_extruder") != 0 || config->opt_int("support_material_interface_extruder") != 0)) { + wxString msg_text = _(L("The Wipe Tower currently supports the non-soluble supports only " + "if they are printed with the current extruder without triggering a tool change. " + "(both support_material_extruder and support_material_interface_extruder need to be set to 0).")); + if (is_global_config) + msg_text += "\n\n" + _(L("Shall I adjust those settings in order to enable the Wipe Tower?")); + MessageDialog dialog (m_msg_dlg_parent, msg_text, _(L("Wipe Tower")), + wxICON_WARNING | (is_global_config ? wxYES | wxNO : wxOK)); + DynamicPrintConfig new_conf = *config; + auto answer = dialog.ShowModal(); + if (!is_global_config || answer == wxID_YES) { + new_conf.set_key_value("support_material_extruder", new ConfigOptionInt(0)); + new_conf.set_key_value("support_material_interface_extruder", new ConfigOptionInt(0)); + } + else + new_conf.set_key_value("wipe_tower", new ConfigOptionBool(false)); + apply(config, &new_conf); + } } - else - new_conf.set_key_value("wipe_tower", new ConfigOptionBool(false)); - apply(config, &new_conf); } // Check "support_material" and "overhangs" relations only on global settings level @@ -182,18 +182,14 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con } if (config->option("fill_density")->value == 100) { - std::string fill_pattern = config->option>("fill_pattern")->serialize(); - const auto &top_fill_pattern_values = config->def()->get("top_fill_pattern")->enum_values; - bool correct_100p_fill = std::find(top_fill_pattern_values.begin(), top_fill_pattern_values.end(), fill_pattern) != top_fill_pattern_values.end(); - if (!correct_100p_fill) { + const int fill_pattern = config->option>("fill_pattern")->value; + if (bool correct_100p_fill = config->option_def("top_fill_pattern")->enum_def->enum_to_index(fill_pattern).has_value(); + ! correct_100p_fill) { // get fill_pattern name from enum_labels for using this one at dialog_msg - const ConfigOptionDef *fill_pattern_def = config->def()->get("fill_pattern"); + const ConfigOptionDef *fill_pattern_def = config->option_def("fill_pattern"); assert(fill_pattern_def != nullptr); - auto it_pattern = std::find(fill_pattern_def->enum_values.begin(), fill_pattern_def->enum_values.end(), fill_pattern); - assert(it_pattern != fill_pattern_def->enum_values.end()); - if (it_pattern != fill_pattern_def->enum_values.end()) { - wxString msg_text = GUI::format_wxstr(_L("The %1% infill pattern is not supposed to work at 100%% density."), - _(fill_pattern_def->enum_labels[it_pattern - fill_pattern_def->enum_values.begin()])); + if (auto label = fill_pattern_def->enum_def->enum_to_label(fill_pattern); label.has_value()) { + wxString msg_text = GUI::format_wxstr(_L("The %1% infill pattern is not supposed to work at 100%% density."), _(*label)); if (is_global_config) msg_text += "\n\n" + _L("Shall I switch to rectilinear fill pattern?"); MessageDialog dialog(m_msg_dlg_parent, msg_text, _L("Infill"), @@ -218,11 +214,15 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) { bool have_perimeters = config->opt_int("perimeters") > 0; - for (auto el : { "extra_perimeters", "ensure_vertical_shell_thickness", "thin_walls", "overhangs", - "seam_position", "external_perimeters_first", "external_perimeter_extrusion_width", - "perimeter_speed", "small_perimeter_speed", "external_perimeter_speed" }) + for (auto el : { "extra_perimeters","extra_perimeters_on_overhangs", "thin_walls", "overhangs", + "seam_position","staggered_inner_seams", "external_perimeters_first", "external_perimeter_extrusion_width", + "perimeter_speed", "small_perimeter_speed", "external_perimeter_speed", "enable_dynamic_overhang_speeds"}) toggle_field(el, have_perimeters); + for (size_t i = 0; i < 4; i++) { + toggle_field("overhang_speed_" + std::to_string(i), config->opt_bool("enable_dynamic_overhang_speeds")); + } + bool have_infill = config->option("fill_density")->value > 0; // infill_extruder uses the same logic as in Print::extruders() for (auto el : { "fill_pattern", "infill_every_layers", "infill_only_where_needed", @@ -256,7 +256,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) bool have_default_acceleration = config->opt_float("default_acceleration") > 0; for (auto el : { "perimeter_acceleration", "infill_acceleration", "top_solid_infill_acceleration", - "solid_infill_acceleration", "external_perimeter_acceleration" + "solid_infill_acceleration", "external_perimeter_acceleration", "bridge_acceleration", "first_layer_acceleration" }) toggle_field(el, have_default_acceleration); @@ -287,6 +287,13 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) toggle_field("support_material_bottom_contact_distance", have_support_material && ! have_support_soluble); toggle_field("support_material_closing_radius", have_support_material && support_material_style == smsSnug); + const bool has_organic_supports = support_material_style == smsOrganic && + (config->opt_bool("support_material") || + config->opt_int("support_material_enforce_layers") > 0); + for (const std::string& key : { "support_tree_angle", "support_tree_angle_slow", "support_tree_branch_diameter", + "support_tree_branch_diameter_angle", "support_tree_tip_diameter", "support_tree_branch_distance", "support_tree_top_rate" }) + toggle_field(key, has_organic_supports); + for (auto el : { "support_material_bottom_interface_layers", "support_material_interface_spacing", "support_material_interface_extruder", "support_material_interface_speed", "support_material_interface_contact_loops" }) toggle_field(el, have_support_material && have_support_interface); @@ -312,10 +319,13 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) toggle_field("standby_temperature_delta", have_ooze_prevention); bool have_wipe_tower = config->opt_bool("wipe_tower"); - for (auto el : { "wipe_tower_x", "wipe_tower_y", "wipe_tower_width", "wipe_tower_rotation_angle", "wipe_tower_brim_width", - "wipe_tower_bridging", "wipe_tower_no_sparse_layers", "single_extruder_multi_material_priming" }) + for (auto el : { "wipe_tower_x", "wipe_tower_y", "wipe_tower_width", "wipe_tower_rotation_angle", "wipe_tower_brim_width", "wipe_tower_cone_angle", + "wipe_tower_extra_spacing", "wipe_tower_bridging", "wipe_tower_no_sparse_layers", "single_extruder_multi_material_priming" }) toggle_field(el, have_wipe_tower); + toggle_field("avoid_crossing_curled_overhangs", !config->opt_bool("avoid_crossing_perimeters")); + toggle_field("avoid_crossing_perimeters", !config->opt_bool("avoid_crossing_curled_overhangs")); + bool have_avoid_crossing_perimeters = config->opt_bool("avoid_crossing_perimeters"); toggle_field("avoid_crossing_perimeters_max_detour", have_avoid_crossing_perimeters); @@ -362,21 +372,47 @@ void ConfigManipulation::update_print_sla_config(DynamicPrintConfig* config, con void ConfigManipulation::toggle_print_sla_options(DynamicPrintConfig* config) { bool supports_en = config->opt_bool("supports_enable"); + sla::SupportTreeType treetype = config->opt_enum("support_tree_type"); + bool is_default_tree = treetype == sla::SupportTreeType::Default; + bool is_branching_tree = treetype == sla::SupportTreeType::Branching; + + toggle_field("support_tree_type", supports_en); + + toggle_field("support_head_front_diameter", supports_en && is_default_tree); + toggle_field("support_head_penetration", supports_en && is_default_tree); + toggle_field("support_head_width", supports_en && is_default_tree); + toggle_field("support_pillar_diameter", supports_en && is_default_tree); + toggle_field("support_small_pillar_diameter_percent", supports_en && is_default_tree); + toggle_field("support_max_bridges_on_pillar", supports_en && is_default_tree); + toggle_field("support_pillar_connection_mode", supports_en && is_default_tree); + toggle_field("support_buildplate_only", supports_en && is_default_tree); + toggle_field("support_base_diameter", supports_en && is_default_tree); + toggle_field("support_base_height", supports_en && is_default_tree); + toggle_field("support_base_safety_distance", supports_en && is_default_tree); + toggle_field("support_critical_angle", supports_en && is_default_tree); + toggle_field("support_max_bridge_length", supports_en && is_default_tree); + toggle_field("support_enforcers_only", supports_en); + toggle_field("support_max_pillar_link_distance", supports_en && is_default_tree); + toggle_field("support_pillar_widening_factor", false); + toggle_field("support_max_weight_on_model", false); + + toggle_field("branchingsupport_head_front_diameter", supports_en && is_branching_tree); + toggle_field("branchingsupport_head_penetration", supports_en && is_branching_tree); + toggle_field("branchingsupport_head_width", supports_en && is_branching_tree); + toggle_field("branchingsupport_pillar_diameter", supports_en && is_branching_tree); + toggle_field("branchingsupport_small_pillar_diameter_percent", supports_en && is_branching_tree); + toggle_field("branchingsupport_max_bridges_on_pillar", false); + toggle_field("branchingsupport_pillar_connection_mode", false); + toggle_field("branchingsupport_buildplate_only", supports_en && is_branching_tree); + toggle_field("branchingsupport_base_diameter", supports_en && is_branching_tree); + toggle_field("branchingsupport_base_height", supports_en && is_branching_tree); + toggle_field("branchingsupport_base_safety_distance", supports_en && is_branching_tree); + toggle_field("branchingsupport_critical_angle", supports_en && is_branching_tree); + toggle_field("branchingsupport_max_bridge_length", supports_en && is_branching_tree); + toggle_field("branchingsupport_max_pillar_link_distance", false); + toggle_field("branchingsupport_pillar_widening_factor", supports_en && is_branching_tree); + toggle_field("branchingsupport_max_weight_on_model", supports_en && is_branching_tree); - toggle_field("support_head_front_diameter", supports_en); - toggle_field("support_head_penetration", supports_en); - toggle_field("support_head_width", supports_en); - toggle_field("support_pillar_diameter", supports_en); - toggle_field("support_small_pillar_diameter_percent", supports_en); - toggle_field("support_max_bridges_on_pillar", supports_en); - toggle_field("support_pillar_connection_mode", supports_en); - toggle_field("support_buildplate_only", supports_en); - toggle_field("support_base_diameter", supports_en); - toggle_field("support_base_height", supports_en); - toggle_field("support_base_safety_distance", supports_en); - toggle_field("support_critical_angle", supports_en); - toggle_field("support_max_bridge_length", supports_en); - toggle_field("support_max_pillar_link_distance", supports_en); toggle_field("support_points_density_relative", supports_en); toggle_field("support_points_minimal_distance", supports_en); @@ -393,7 +429,8 @@ void ConfigManipulation::toggle_print_sla_options(DynamicPrintConfig* config) bool zero_elev = config->opt_bool("pad_around_object") && pad_en; - toggle_field("support_object_elevation", supports_en && !zero_elev); + toggle_field("support_object_elevation", supports_en && is_default_tree && !zero_elev); + toggle_field("branchingsupport_object_elevation", supports_en && is_branching_tree && !zero_elev); toggle_field("pad_object_gap", zero_elev); toggle_field("pad_around_object_everywhere", zero_elev); toggle_field("pad_object_connector_stride", zero_elev); diff --git a/src/slic3r/GUI/ConfigSnapshotDialog.cpp b/src/slic3r/GUI/ConfigSnapshotDialog.cpp index afa495d0c2b..77193c857b4 100644 --- a/src/slic3r/GUI/ConfigSnapshotDialog.cpp +++ b/src/slic3r/GUI/ConfigSnapshotDialog.cpp @@ -5,9 +5,11 @@ #include "libslic3r/Utils.hpp" #include "libslic3r/Time.hpp" +#include "libslic3r/Color.hpp" #include "GUI_App.hpp" #include "MainFrame.hpp" #include "wxExtensions.hpp" +#include "format.hpp" namespace Slic3r { namespace GUI { @@ -31,11 +33,9 @@ static wxString format_reason(const Config::Snapshot::Reason reason) static std::string get_color(wxColour colour) { - wxString clr_str = wxString::Format(wxT("#%02X%02X%02X"), colour.Red(), colour.Green(), colour.Blue()); - return clr_str.ToStdString(); + return encode_color(ColorRGB(colour.Red(), colour.Green(), colour.Blue())); }; - static wxString generate_html_row(const Config::Snapshot &snapshot, bool row_even, bool snapshot_active, bool dark_mode) { // Start by declaring a row with an alternating background color. @@ -90,10 +90,10 @@ static wxString generate_html_row(const Config::Snapshot &snapshot, bool row_eve } if (! compatible) { - text += "

    " + from_u8((boost::format(_utf8(L("Incompatible with this %s"))) % SLIC3R_APP_NAME).str()) + "

    "; + text += "

    " + format_wxstr(_L("Incompatible with this %s"), SLIC3R_APP_NAME) + "

    "; } else if (! snapshot_active) - text += "

    " + _(L("Activate")) + "

    "; + text += "

    " + _L("Activate") + "

    "; text += ""; text += ""; return text; diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp index d2df1caee98..4aa8c9df6d9 100644 --- a/src/slic3r/GUI/ConfigWizard.cpp +++ b/src/slic3r/GUI/ConfigWizard.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -27,6 +28,12 @@ #include #include +#ifdef WIN32 +#include +#include +#include +#endif // WIN32 + #ifdef _MSW_DARK_MODE #include #endif // _MSW_DARK_MODE @@ -36,6 +43,7 @@ #include "libslic3r/Config.hpp" #include "libslic3r/libslic3r.h" #include "libslic3r/Model.hpp" +#include "libslic3r/Color.hpp" #include "GUI.hpp" #include "GUI_App.hpp" #include "GUI_Utils.hpp" @@ -47,6 +55,8 @@ #include "format.hpp" #include "MsgDialog.hpp" #include "UnsavedChangesDialog.hpp" +#include "slic3r/Utils/AppUpdater.hpp" +#include "slic3r/GUI/I18N.hpp" #if defined(__linux__) && defined(__WXGTK3__) #define wxLinux_gtk3 true @@ -64,10 +74,10 @@ using Config::SnapshotDB; // Configuration data structures extensions needed for the wizard -bool Bundle::load(fs::path source_path, bool ais_in_resources, bool ais_prusa_bundle) +bool Bundle::load(fs::path source_path, BundleLocation location, bool ais_prusa_bundle) { this->preset_bundle = std::make_unique(); - this->is_in_resources = ais_in_resources; + this->location = location; this->is_prusa_bundle = ais_prusa_bundle; std::string path_string = source_path.string(); @@ -95,7 +105,7 @@ bool Bundle::load(fs::path source_path, bool ais_in_resources, bool ais_prusa_bu Bundle::Bundle(Bundle &&other) : preset_bundle(std::move(other.preset_bundle)) , vendor_profile(other.vendor_profile) - , is_in_resources(other.is_in_resources) + , location(other.location) , is_prusa_bundle(other.is_prusa_bundle) { other.vendor_profile = nullptr; @@ -106,25 +116,35 @@ BundleMap BundleMap::load() BundleMap res; const auto vendor_dir = (boost::filesystem::path(Slic3r::data_dir()) / "vendor").make_preferred(); + const auto archive_dir = (boost::filesystem::path(Slic3r::data_dir()) / "cache" / "vendor").make_preferred(); const auto rsrc_vendor_dir = (boost::filesystem::path(resources_dir()) / "profiles").make_preferred(); + // Load Prusa bundle from the datadir/vendor directory or from datadir/cache/vendor (archive) or from resources/profiles. auto prusa_bundle_path = (vendor_dir / PresetBundle::PRUSA_BUNDLE).replace_extension(".ini"); - auto prusa_bundle_rsrc = false; + BundleLocation prusa_bundle_loc = BundleLocation::IN_VENDOR; if (! boost::filesystem::exists(prusa_bundle_path)) { + prusa_bundle_path = (archive_dir / PresetBundle::PRUSA_BUNDLE).replace_extension(".ini"); + prusa_bundle_loc = BundleLocation::IN_ARCHIVE; + } + if (!boost::filesystem::exists(prusa_bundle_path)) { prusa_bundle_path = (rsrc_vendor_dir / PresetBundle::PRUSA_BUNDLE).replace_extension(".ini"); - prusa_bundle_rsrc = true; + prusa_bundle_loc = BundleLocation::IN_RESOURCES; } { Bundle prusa_bundle; - if (prusa_bundle.load(std::move(prusa_bundle_path), prusa_bundle_rsrc, true)) + if (prusa_bundle.load(std::move(prusa_bundle_path), prusa_bundle_loc, true)) res.emplace(PresetBundle::PRUSA_BUNDLE, std::move(prusa_bundle)); } // Load the other bundles in the datadir/vendor directory - // and then additionally from resources/profiles. - bool is_in_resources = false; - for (auto dir : { &vendor_dir, &rsrc_vendor_dir }) { - for (const auto &dir_entry : boost::filesystem::directory_iterator(*dir)) { + // and then additionally from datadir/cache/vendor (archive) and resources/profiles. + // Should we concider case where archive has older profiles than resources (shouldnt happen)? + typedef std::pair DirData; + std::vector dir_list { {vendor_dir, BundleLocation::IN_VENDOR}, {archive_dir, BundleLocation::IN_ARCHIVE}, {rsrc_vendor_dir, BundleLocation::IN_RESOURCES} }; + for ( auto dir : dir_list) { + if (!fs::exists(dir.first)) + continue; + for (const auto &dir_entry : boost::filesystem::directory_iterator(dir.first)) { if (Slic3r::is_ini_file(dir_entry)) { std::string id = dir_entry.path().stem().string(); // stem() = filename() without the trailing ".ini" part @@ -132,12 +152,10 @@ BundleMap BundleMap::load() if (res.find(id) != res.end()) { continue; } Bundle bundle; - if (bundle.load(dir_entry.path(), is_in_resources)) + if (bundle.load(dir_entry.path(), dir.second)) res.emplace(std::move(id), std::move(bundle)); } } - - is_in_resources = true; } return res; @@ -211,29 +229,41 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, wxSt bool is_variants = false; + const fs::path vendor_dir_path = (fs::path(Slic3r::data_dir()) / "vendor").make_preferred(); + const fs::path cache_dir_path = (fs::path(Slic3r::data_dir()) / "cache").make_preferred(); + const fs::path rsrc_dir_path = (fs::path(resources_dir()) / "profiles").make_preferred(); + for (const auto &model : models) { if (! filter(model)) { continue; } wxBitmap bitmap; int bitmap_width = 0; - auto load_bitmap = [](const wxString& bitmap_file, wxBitmap& bitmap, int& bitmap_width)->bool { - if (wxFileExists(bitmap_file)) { - bitmap.LoadFile(bitmap_file, wxBITMAP_TYPE_PNG); - bitmap_width = bitmap.GetWidth(); - return true; - } - return false; + auto load_bitmap = [](const wxString& bitmap_file, wxBitmap& bitmap, int& bitmap_width) { + bitmap.LoadFile(bitmap_file, wxBITMAP_TYPE_PNG); + bitmap_width = bitmap.GetWidth(); }; - if (!load_bitmap(GUI::from_u8(Slic3r::data_dir() + "/vendor/" + vendor.id + "/" + model.id + "_thumbnail.png"), bitmap, bitmap_width)) { - if (!load_bitmap(GUI::from_u8(Slic3r::resources_dir() + "/profiles/" + vendor.id + "/" + model.id + "_thumbnail.png"), bitmap, bitmap_width)) { - BOOST_LOG_TRIVIAL(warning) << boost::format("Can't find bitmap file `%1%` for vendor `%2%`, printer `%3%`, using placeholder icon instead") - % (Slic3r::resources_dir() + "/profiles/" + vendor.id + "/" + model.id + "_thumbnail.png") - % vendor.id - % model.id; - load_bitmap(Slic3r::var(PRINTER_PLACEHOLDER), bitmap, bitmap_width); - } + + bool found = false; + for (const fs::path& res : { rsrc_dir_path / vendor.id / model.thumbnail + , vendor_dir_path / vendor.id / model.thumbnail + , cache_dir_path / vendor.id / model.thumbnail }) + { + if (!fs::exists(res)) + continue; + load_bitmap(GUI::from_u8(res.string()), bitmap, bitmap_width); + found = true; + break; } - auto *title = new wxStaticText(this, wxID_ANY, from_u8(model.name), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT); + + if (!found) { + BOOST_LOG_TRIVIAL(warning) << boost::format("Can't find bitmap file `%1%` for vendor `%2%`, printer `%3%`, using placeholder icon instead") + % model.thumbnail + % vendor.id + % model.id; + load_bitmap(Slic3r::var(PRINTER_PLACEHOLDER), bitmap, bitmap_width); + } + + wxStaticText* title = new wxStaticText(this, wxID_ANY, from_u8(model.name), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT); title->SetFont(font_name); const int wrap_width = std::max((int)MODEL_MIN_WRAP, bitmap_width); title->Wrap(wrap_width); @@ -246,7 +276,7 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, wxSt titles.push_back(title); - auto *bitmap_widget = new wxStaticBitmap(this, wxID_ANY, bitmap); + wxStaticBitmap* bitmap_widget = new wxStaticBitmap(this, wxID_ANY, bitmap); bitmaps.push_back(bitmap_widget); auto *variants_panel = new wxPanel(this); @@ -259,7 +289,7 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, wxSt const auto &variant = model.variants[i]; const auto label = model.technology == ptFFF - ? from_u8((boost::format("%1% %2% %3%") % variant.name % _utf8(L("mm")) % _utf8(L("nozzle"))).str()) + ? format_wxstr("%1% %2% %3%", variant.name, _L("mm"), _L("nozzle")) : from_u8(model.name); if (i == 1) { @@ -269,7 +299,7 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, wxSt is_variants = true; } - auto *cbox = new Checkbox(variants_panel, label, model_id, variant.name); + Checkbox* cbox = new Checkbox(variants_panel, label, model_id, variant.name); i == 0 ? cboxes.push_back(cbox) : cboxes_alt.push_back(cbox); const bool enabled = appconfig.get_variant(vendor.id, model_id, variant.name); @@ -479,17 +509,17 @@ void ConfigWizardPage::append_spacer(int space) // Wizard pages PageWelcome::PageWelcome(ConfigWizard *parent) - : ConfigWizardPage(parent, from_u8((boost::format( + : ConfigWizardPage(parent, format_wxstr( #ifdef __APPLE__ - _utf8(L("Welcome to the %s Configuration Assistant")) + _L("Welcome to the %s Configuration Assistant") #else - _utf8(L("Welcome to the %s Configuration Wizard")) + _L("Welcome to the %s Configuration Wizard") #endif - ) % SLIC3R_APP_NAME).str()), _L("Welcome")) - , welcome_text(append_text(from_u8((boost::format( - _utf8(L("Hello, welcome to %s! This %s helps you with the initial configuration; just a few settings and you will be ready to print."))) - % SLIC3R_APP_NAME - % _utf8(ConfigWizard::name())).str()) + , SLIC3R_APP_NAME), _L("Welcome")) + , welcome_text(append_text(format_wxstr( + _L("Hello, welcome to %s! This %s helps you with the initial configuration; just a few settings and you will be ready to print.") + , SLIC3R_APP_NAME + , _(ConfigWizard::name())) )) , cbox_reset(append( new wxCheckBox(this, wxID_ANY, _L("Remove user profiles (a snapshot will be taken beforehand)")) @@ -547,7 +577,7 @@ PagePrinters::PagePrinters(ConfigWizard *parent, continue; } - const auto picker_title = family.empty() ? wxString() : from_u8((boost::format(_utf8(L("%s Family"))) % family).str()); + const auto picker_title = family.empty() ? wxString() : format_wxstr(_L("%s Family"), family); auto *picker = new PrinterPicker(this, vendor, picker_title, MAX_COLS, *appconfig, filter); picker->Bind(EVT_PRINTER_PICK, [this, appconfig](const PrinterPickerEvent &evt) { @@ -611,6 +641,7 @@ void PagePrinters::set_run_reason(ConfigWizard::RunReason run_reason) const std::string PageMaterials::EMPTY; +const std::string PageMaterials::TEMPLATES = "templates"; PageMaterials::PageMaterials(ConfigWizard *parent, Materials *materials, wxString title, wxString shortname, wxString list1name) : ConfigWizardPage(parent, std::move(title), std::move(shortname)) @@ -718,6 +749,11 @@ void PageMaterials::reload_presets() clear(); list_printer->append(_L("(All)"), &EMPTY); + + const AppConfig* app_config = wxGetApp().app_config; + if (materials->technology == T_FFF && app_config->get("no_templates") == "0") + list_printer->append(_L("(Templates)"), &TEMPLATES); + //list_printer->SetLabelMarkup("bald"); for (const Preset* printer : materials->printers) { list_printer->append(printer->name, &printer->name); @@ -746,70 +782,80 @@ void PageMaterials::set_compatible_printers_html_window(const std::vector* are not compatible with some installed printers."), materials->technology == T_FFF ? _L("Filaments") : _L("SLA materials")); + const auto bgr_clr_str = encode_color(ColorRGB(bgr_clr.Red(), bgr_clr.Green(), bgr_clr.Blue())); + const auto text_clr_str = encode_color(ColorRGB(text_clr.Red(), text_clr.Green(), text_clr.Blue())); wxString text; - if (all_printers) { - wxString second_line = format_wxstr(_L("All installed printers are compatible with the selected %1%."), materials->technology == T_FFF ? _L("filament") : _L("SLA material")); - text = wxString::Format( - "" - "" - "" - "" - "" - "%s

    %s" - "
    " - "
    " - "" - "" - , bgr_clr_str - , text_clr_str - , first_line - , second_line - ); + if (materials->technology == T_FFF && template_shown) { + // TRN ConfigWizard: Materials : "%1%" = "Filaments"/"SLA materials" + text = format_wxstr(_L("%1% visible for (\"Template\") printer are universal profiles available for all printers. These might not be compatible with your printer."), materials->technology == T_FFF ? _L("Filaments") : _L("SLA materials")); } else { - wxString second_line; - if (!printer_names.empty()) - second_line = (materials->technology == T_FFF ? - _L("Only the following installed printers are compatible with the selected filaments") : - _L("Only the following installed printers are compatible with the selected SLA materials")) + ":"; - text = wxString::Format( - "" - "" - "" - "" - "" - "%s

    %s" - "" - "" - , bgr_clr_str - , text_clr_str - , first_line - , second_line); - for (size_t i = 0; i < printer_names.size(); ++i) - { - text += wxString::Format("", boost::nowide::widen(printer_names[i])); - if (i % 3 == 2) { - text += wxString::Format( - "" - ""); + // TRN ConfigWizard: Materials : "%1%" = "Filaments"/"SLA materials" + wxString first_line = format_wxstr(_L("%1% marked with * are not compatible with some installed printers."), materials->technology == T_FFF ? _L("Filaments") : _L("SLA materials")); + + if (all_printers) { + // TRN ConfigWizard: Materials : "%1%" = "filament"/"SLA material" + wxString second_line = format_wxstr(_L("All installed printers are compatible with the selected %1%."), materials->technology == T_FFF ? _L("filament") : _L("SLA material")); + text = wxString::Format( + "" + "" + "" + "" + "" + "%s

    %s" + "
    " + "
    " + "" + "" + , bgr_clr_str + , text_clr_str + , first_line + , second_line + ); + } + else { + wxString second_line; + if (!printer_names.empty()) + second_line = (materials->technology == T_FFF ? + _L("Only the following installed printers are compatible with the selected filaments") : + _L("Only the following installed printers are compatible with the selected SLA materials")) + ":"; + text = wxString::Format( + "" + "" + "" + "" + "" + "%s

    %s" + "
    %s
    " + "" + , bgr_clr_str + , text_clr_str + , first_line + , second_line); + for (size_t i = 0; i < printer_names.size(); ++i) + { + text += wxString::Format("", boost::nowide::widen(printer_names[i])); + if (i % 3 == 2) { + text += wxString::Format( + "" + ""); + } } + text += wxString::Format( + "" + "
    %s
    " + "" + "" + "" + "" + ); } - text += wxString::Format( - "" - "" - "
    " - "
    " - "" - "" - ); } + wxFont font = get_default_font_for_dpi(this, get_dpi_for_window(this)); const int fs = font.GetPointSize(); @@ -854,6 +900,8 @@ void PageMaterials::on_material_highlighted(int sel_material) std::vector names; for (const Preset* printer : materials->printers) { for (const Preset* material : matching_materials) { + if (material->vendor && material->vendor->templates_profile) + continue; if (is_compatible_with_printer(PresetWithVendorProfile(*material, material->vendor), PresetWithVendorProfile(*printer, printer->vendor))) { names.push_back(printer->name); break; @@ -871,6 +919,8 @@ void PageMaterials::update_lists(int sel_type, int sel_vendor, int last_selected wxArrayInt sel_printers; int sel_printers_count = list_printer->GetSelections(sel_printers); + bool templates_available = list_printer->size() > 1 && list_printer->get_data(1) == TEMPLATES; + // Does our wxWidgets version support operator== for wxArrayInt ? // https://github.com/prusa3d/PrusaSlicer/issues/5152#issuecomment-787208614 #if wxCHECK_VERSION(3, 1, 1) @@ -886,13 +936,14 @@ void PageMaterials::update_lists(int sel_type, int sel_vendor, int last_selected }; if (!are_equal(sel_printers, sel_printers_prev)) { #endif - + template_shown = false; // Refresh type list list_type->Clear(); list_type->append(_L("(All)"), &EMPTY); - if (sel_printers_count > 0) { + if (sel_printers_count > 1) { // If all is selected with other printers // unselect "all" or all printers depending on last value + // same with "templates" if (sel_printers[0] == 0 && sel_printers_count > 1) { if (last_selected_printer == 0) { list_printer->SetSelection(wxNOT_FOUND); @@ -902,38 +953,63 @@ void PageMaterials::update_lists(int sel_type, int sel_vendor, int last_selected sel_printers_count = list_printer->GetSelections(sel_printers); } } - if (sel_printers[0] != 0) { - for (int i = 0; i < sel_printers_count; i++) { - const std::string& printer_name = list_printer->get_data(sel_printers[i]); - const Preset* printer = nullptr; - for (const Preset* it : materials->printers) { - if (it->name == printer_name) { - printer = it; - break; - } - } - materials->filter_presets(printer, EMPTY, EMPTY, [this](const Preset* p) { - const std::string& type = this->materials->get_type(p); - if (list_type->find(type) == wxNOT_FOUND) { - list_type->append(type, &type); - } - }); - } - } else { - //clear selection except "ALL" - list_printer->SetSelection(wxNOT_FOUND); - list_printer->SetSelection(0); - sel_printers_count = list_printer->GetSelections(sel_printers); - - materials->filter_presets(nullptr, EMPTY, EMPTY, [this](const Preset* p) { - const std::string& type = this->materials->get_type(p); - if (list_type->find(type) == wxNOT_FOUND) { - list_type->append(type, &type); - } - }); - } - sort_list_data(list_type, true, true); - } + if (materials->technology == T_FFF && templates_available && (sel_printers[0] == 1 || sel_printers[1] == 1) && sel_printers_count > 1) { + if (last_selected_printer == 1) { + list_printer->SetSelection(wxNOT_FOUND); + list_printer->SetSelection(1); + } + else if (last_selected_printer != 0) { + list_printer->SetSelection(1, false); + sel_printers_count = list_printer->GetSelections(sel_printers); + } + } + } + if (sel_printers_count > 0 && sel_printers[0] != 0 && ((materials->technology == T_FFF && templates_available && sel_printers[0] != 1) || materials->technology != T_FFF || !templates_available)) { + for (int i = 0; i < sel_printers_count; i++) { + const std::string& printer_name = list_printer->get_data(sel_printers[i]); + const Preset* printer = nullptr; + for (const Preset* it : materials->printers) { + if (it->name == printer_name) { + printer = it; + break; + } + } + materials->filter_presets(printer, printer_name, EMPTY, EMPTY, [this](const Preset* p) { + const std::string& type = this->materials->get_type(p); + if (list_type->find(type) == wxNOT_FOUND) { + list_type->append(type, &type); + } + }); + } + } + else if (sel_printers_count > 0 && last_selected_printer == 0) { + //clear selection except "ALL" + list_printer->SetSelection(wxNOT_FOUND); + list_printer->SetSelection(0); + sel_printers_count = list_printer->GetSelections(sel_printers); + + materials->filter_presets(nullptr, EMPTY, EMPTY, EMPTY, [this](const Preset* p) { + const std::string& type = this->materials->get_type(p); + if (list_type->find(type) == wxNOT_FOUND) { + list_type->append(type, &type); + } + }); + } + else if (materials->technology == T_FFF && templates_available && sel_printers_count > 0 && last_selected_printer == 1) { + //clear selection except "TEMPLATES" + list_printer->SetSelection(wxNOT_FOUND); + list_printer->SetSelection(1); + sel_printers_count = list_printer->GetSelections(sel_printers); + template_shown = true; + materials->filter_presets(nullptr, TEMPLATES, EMPTY, EMPTY, + [this](const Preset* p) { + const std::string& type = this->materials->get_type(p); + if (list_type->find(type) == wxNOT_FOUND) { + list_type->append(type, &type); + } + }); + } + sort_list_data(list_type, true, true); sel_printers_prev = sel_printers; sel_type = 0; @@ -962,7 +1038,7 @@ void PageMaterials::update_lists(int sel_type, int sel_vendor, int last_selected break; } } - materials->filter_presets(printer, type, EMPTY, [this](const Preset* p) { + materials->filter_presets(printer, printer_name, type, EMPTY, [this](const Preset* p) { const std::string& vendor = this->materials->get_vendor(p); if (list_vendor->find(vendor) == wxNOT_FOUND) { list_vendor->append(vendor, &vendor); @@ -987,7 +1063,7 @@ void PageMaterials::update_lists(int sel_type, int sel_vendor, int last_selected if (sel_printers_count != 0 && sel_type != wxNOT_FOUND && sel_vendor != wxNOT_FOUND) { const std::string& type = list_type->get_data(sel_type); const std::string& vendor = list_vendor->get_data(sel_vendor); - // finst printer preset + // first printer preset std::vector to_list; for (int i = 0; i < sel_printers_count; i++) { const std::string& printer_name = list_printer->get_data(sel_printers[i]); @@ -998,15 +1074,14 @@ void PageMaterials::update_lists(int sel_type, int sel_vendor, int last_selected break; } } - - materials->filter_presets(printer, type, vendor, [this, &to_list](const Preset* p) { + materials->filter_presets(printer, printer_name, type, vendor, [this, &to_list](const Preset* p) { const std::string& section = materials->appconfig_section(); bool checked = wizard_p()->appconfig_new.has(section, p->name); bool was_checked = false; int cur_i = list_profile->find(p->alias); if (cur_i == wxNOT_FOUND) { - cur_i = list_profile->append(p->alias + (materials->get_omnipresent(p) ? "" : " *"), &p->alias); + cur_i = list_profile->append(p->alias + (materials->get_omnipresent(p) || template_shown ? "" : " *"), &p->alias); to_list.emplace_back(p->alias, materials->get_omnipresent(p), checked); } else { @@ -1044,25 +1119,29 @@ void PageMaterials::sort_list_data(StringList* list, bool add_All_item, bool mat std::vector> prusa_profiles; std::vector> other_profiles; + bool add_TEMPLATES_item = false; for (int i = 0 ; i < list->size(); ++i) { const std::string& data = list->get_data(i); - if (data == EMPTY) // do not sort item + if (data == EMPTY) // do not sort item continue; + if (data == TEMPLATES) {// do not sort item + add_TEMPLATES_item = true; + continue; + } if (!material_type_ordering && data.find("Prusa") != std::string::npos) prusa_profiles.push_back(data); else other_profiles.push_back(data); } - if(material_type_ordering) { + if (material_type_ordering) { const ConfigOptionDef* def = print_config_def.get("filament_type"); - std::vectorenum_values = def->enum_values; size_t end_of_sorted = 0; - for (size_t vals = 0; vals < enum_values.size(); vals++) { + for (const std::string &value : def->enum_def->values()) { for (size_t profs = end_of_sorted; profs < other_profiles.size(); profs++) { // find instead compare because PET vs PETG - if (other_profiles[profs].get().find(enum_values[vals]) != std::string::npos) { + if (other_profiles[profs].get().find(value) != std::string::npos) { //swap if(profs != end_of_sorted) { std::reference_wrapper aux = other_profiles[end_of_sorted]; @@ -1086,10 +1165,13 @@ void PageMaterials::sort_list_data(StringList* list, bool add_All_item, bool mat list->Clear(); if (add_All_item) list->append(_L("(All)"), &EMPTY); + if (materials->technology == T_FFF && add_TEMPLATES_item) + list->append(_L("(Templates)"), &TEMPLATES); for (const auto& item : prusa_profiles) list->append(item, &const_cast(item.get())); for (const auto& item : other_profiles) list->append(item, &const_cast(item.get())); + } void PageMaterials::sort_list_data(PresetList* list, const std::vector& data) @@ -1116,11 +1198,11 @@ void PageMaterials::sort_list_data(PresetList* list, const std::vectorClear(); for (size_t i = 0; i < prusa_profiles.size(); ++i) { - list->append(std::string(prusa_profiles[i].name) + (prusa_profiles[i].omnipresent ? "" : " *"), &const_cast(prusa_profiles[i].name.get())); + list->append(std::string(prusa_profiles[i].name) + (prusa_profiles[i].omnipresent || template_shown ? "" : " *"), &const_cast(prusa_profiles[i].name.get())); list->Check(i, prusa_profiles[i].checked); } for (size_t i = 0; i < other_profiles.size(); ++i) { - list->append(std::string(other_profiles[i].name) + (other_profiles[i].omnipresent ? "" : " *"), &const_cast(other_profiles[i].name.get())); + list->append(std::string(other_profiles[i].name) + (other_profiles[i].omnipresent || template_shown ? "" : " *"), &const_cast(other_profiles[i].name.get())); list->Check(i + prusa_profiles.size(), other_profiles[i].checked); } } @@ -1130,6 +1212,15 @@ void PageMaterials::select_material(int i) const bool checked = list_profile->IsChecked(i); const std::string& alias_key = list_profile->get_data(i); + if (checked && template_shown && !notification_shown) { + notification_shown = true; + wxString message = _L("You have selected template filament. Please note that these filaments are available for all printers but are NOT certain to be compatible with your printer. Do you still wish to have this filament selected?\n(This message won't be displayed again.)"); + MessageDialog msg(this, message, _L("Notice"), wxYES_NO); + if (msg.ShowModal() == wxID_NO) { + list_profile->Check(i, false); + return; + } + } wizard_p()->update_presets_in_config(materials->appconfig_section(), alias_key, checked); } @@ -1175,31 +1266,20 @@ PageCustom::PageCustom(ConfigWizard *parent) : ConfigWizardPage(parent, _L("Custom Printer Setup"), _L("Custom Printer")) { cb_custom = new wxCheckBox(this, wxID_ANY, _L("Define a custom printer profile")); - tc_profile_name = new wxTextCtrl(this, wxID_ANY, default_profile_name); auto *label = new wxStaticText(this, wxID_ANY, _L("Custom profile name:")); - wxGetApp().UpdateDarkUI(tc_profile_name); - - tc_profile_name->Enable(false); - tc_profile_name->Bind(wxEVT_KILL_FOCUS, [this](wxFocusEvent &evt) { - if (tc_profile_name->GetValue().IsEmpty()) { - if (profile_name_prev.IsEmpty()) { tc_profile_name->SetValue(default_profile_name); } - else { tc_profile_name->SetValue(profile_name_prev); } - } else { - profile_name_prev = tc_profile_name->GetValue(); - } - evt.Skip(); - }); + wxBoxSizer* profile_name_sizer = new wxBoxSizer(wxVERTICAL); + profile_name_editor = new SavePresetDialog::Item{ this, profile_name_sizer, default_profile_name }; + profile_name_editor->Enable(false); - cb_custom->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent &event) { - tc_profile_name->Enable(custom_wanted()); + cb_custom->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent &) { + profile_name_editor->Enable(custom_wanted()); wizard_p()->on_custom_setup(custom_wanted()); - }); append(cb_custom); append(label); - append(tc_profile_name); + append(profile_name_sizer); } PageUpdate::PageUpdate(ConfigWizard *parent) @@ -1222,7 +1302,7 @@ PageUpdate::PageUpdate(ConfigWizard *parent) append_spacer(VERTICAL_SPACING); auto *box_presets = new wxCheckBox(this, wxID_ANY, _L("Update built-in Presets automatically")); - box_presets->SetValue(app_config->get("preset_update") == "1"); + box_presets->SetValue(app_config->get_bool("preset_update")); append(box_presets); append_text(wxString::Format(_L( "If enabled, %s downloads updates of built-in system presets in the background." @@ -1239,12 +1319,239 @@ PageUpdate::PageUpdate(ConfigWizard *parent) box_presets->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent &event) { this->preset_update = event.IsChecked(); }); } + + +namespace DownloaderUtils +{ +namespace { +#ifdef _WIN32 + wxString get_downloads_path() + { + wxString ret; + PWSTR path = NULL; + HRESULT hr = SHGetKnownFolderPath(FOLDERID_Downloads, 0, NULL, &path); + if (SUCCEEDED(hr)) { + ret = wxString(path); + } + CoTaskMemFree(path); + return ret; + } +#elif __APPLE__ + wxString get_downloads_path() + { + // call objective-c implementation + return wxString::FromUTF8(get_downloads_path_mac()); + } +#else + wxString get_downloads_path() + { + wxString command = "xdg-user-dir DOWNLOAD"; + wxArrayString output; + GUI::desktop_execute_get_result(command, output); + if (output.GetCount() > 0) { + return output[0]; + } + return wxString(); + } +#endif + } +Worker::Worker(wxWindow* parent) +: wxBoxSizer(wxHORIZONTAL) +, m_parent(parent) +{ + m_input_path = new wxTextCtrl(m_parent, wxID_ANY); + set_path_name(get_app_config()->get("url_downloader_dest")); + + auto* path_label = new wxStaticText(m_parent, wxID_ANY, _L("Download path") + ":"); + + this->Add(path_label, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 5); + this->Add(m_input_path, 1, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, 5); + + auto* button_path = new wxButton(m_parent, wxID_ANY, _L("Browse")); + this->Add(button_path, 0, wxEXPAND | wxTOP | wxLEFT, 5); + button_path->Bind(wxEVT_BUTTON, [this](wxCommandEvent& event) { + boost::filesystem::path chosen_dest(boost::nowide::narrow(m_input_path->GetValue())); + + wxDirDialog dialog(m_parent, _L("Choose folder") + ":", chosen_dest.string() ); + if (dialog.ShowModal() == wxID_OK) + this->m_input_path->SetValue(dialog.GetPath()); + }); + + for (wxSizerItem* item : this->GetChildren()) + if (item->IsWindow()) { + wxWindow* win = item->GetWindow(); + wxGetApp().UpdateDarkUI(win); + } +} + +void Worker::set_path_name(wxString path) +{ + if (path.empty()) + path = boost::nowide::widen(get_app_config()->get("url_downloader_dest")); + + if (path.empty()) { + // What should be default path? Each system has Downloads folder, that could be good one. + // Other would be program location folder - not so good: access rights, apple bin is inside bundle... + // default_path = boost::dll::program_location().parent_path().string(); + path = get_downloads_path(); + } + + m_input_path->SetValue(path); +} + +void Worker::set_path_name(const std::string& name) +{ + if (!m_input_path) + return; + + set_path_name(boost::nowide::widen(name)); +} + +} // DownLoader + +PageDownloader::PageDownloader(ConfigWizard* parent) + : ConfigWizardPage(parent, _L("Downloads from URL"), _L("Downloads")) +{ + const AppConfig* app_config = wxGetApp().app_config; + auto boldfont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); + boldfont.SetWeight(wxFONTWEIGHT_BOLD); + + append_spacer(VERTICAL_SPACING); + + auto* box_allow_downloads = new wxCheckBox(this, wxID_ANY, _L("Allow built-in downloader")); + // TODO: Do we want it like this? The downloader is allowed for very first time the wizard is run. + bool box_allow_value = (app_config->has("downloader_url_registered") ? app_config->get_bool("downloader_url_registered") : true); + box_allow_downloads->SetValue(box_allow_value); + append(box_allow_downloads); + + // TRN ConfigWizard : Downloader : %1% = "PrusaSlicer" + append_text(format_wxstr(_L( + "If enabled, %1% registers to start on custom URL on www.printables.com." + " You will be able to use button with %1% logo to open models in this %1%." + " The model will be downloaded into folder you choose bellow." + ), SLIC3R_APP_NAME)); + +#ifdef __linux__ + append_text(wxString::Format(_L( + "On Linux systems the process of registration also creates desktop integration files for this version of application." + ))); +#endif + + box_allow_downloads->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent& event) { this->m_downloader->allow(event.IsChecked()); }); + + m_downloader = new DownloaderUtils::Worker(this); + append(m_downloader); + m_downloader->allow(box_allow_value); +} + +bool PageDownloader::on_finish_downloader() const +{ + return m_downloader->on_finish(); +} + +bool DownloaderUtils::Worker::perform_register(const std::string& path_override/* = {}*/) +{ + boost::filesystem::path aux_dest (GUI::into_u8(path_name())); + if (!path_override.empty()) + aux_dest = boost::filesystem::path(path_override); + boost::system::error_code ec; + boost::filesystem::path chosen_dest = boost::filesystem::absolute(aux_dest, ec); + if(ec) + chosen_dest = aux_dest; + ec.clear(); + if (chosen_dest.empty() || !boost::filesystem::is_directory(chosen_dest, ec) || ec) { + std::string err_msg = GUI::format("%1%\n\n%2%",_L("Chosen directory for downloads does not exist.") ,chosen_dest.string()); + BOOST_LOG_TRIVIAL(error) << err_msg; + show_error(m_parent, err_msg); + return false; + } + BOOST_LOG_TRIVIAL(info) << "Downloader registration: Directory for downloads: " << chosen_dest.string(); + wxGetApp().app_config->set("url_downloader_dest", chosen_dest.string()); +#ifdef _WIN32 + // Registry key creation for "prusaslicer://" URL + + boost::filesystem::path binary_path(boost::filesystem::canonical(boost::dll::program_location())); + // the path to binary needs to be correctly saved in string with respect to localized characters + wxString wbinary = wxString::FromUTF8(binary_path.string()); + std::string binary_string = (boost::format("%1%") % wbinary).str(); + BOOST_LOG_TRIVIAL(info) << "Downloader registration: Path of binary: " << binary_string; + + //std::string key_string = "\"" + binary_string + "\" \"-u\" \"%1\""; + //std::string key_string = "\"" + binary_string + "\" \"%1\""; + std::string key_string = "\"" + binary_string + "\" \"--single-instance\" \"%1\""; + + wxRegKey key_first(wxRegKey::HKCU, "Software\\Classes\\prusaslicer"); + wxRegKey key_full(wxRegKey::HKCU, "Software\\Classes\\prusaslicer\\shell\\open\\command"); + if (!key_first.Exists()) { + key_first.Create(false); + } + key_first.SetValue("URL Protocol", ""); + + if (!key_full.Exists()) { + key_full.Create(false); + } + //key_full = "\"C:\\Program Files\\Prusa3D\\PrusaSlicer\\prusa-slicer-console.exe\" \"%1\""; + key_full = key_string; +#elif __APPLE__ + // Apple registers for custom url in info.plist thus it has to be already registered since build. + // The url will always trigger opening of prusaslicer and we have to check that user has allowed it. (GUI_App::MacOpenURL is the triggered method) +#else + // the performation should be called later during desktop integration + perform_registration_linux = true; +#endif + return true; +} + +void DownloaderUtils::Worker::deregister() +{ +#ifdef _WIN32 + std::string key_string = ""; + wxRegKey key_full(wxRegKey::HKCU, "Software\\Classes\\prusaslicer\\shell\\open\\command"); + if (!key_full.Exists()) { + return; + } + key_full = key_string; +#elif __APPLE__ + // TODO +#else + BOOST_LOG_TRIVIAL(debug) << "DesktopIntegrationDialog::undo_downloader_registration"; + DesktopIntegrationDialog::undo_downloader_registration(); + perform_registration_linux = false; +#endif +} + +bool DownloaderUtils::Worker::on_finish() { + AppConfig* app_config = wxGetApp().app_config; + bool ac_value = app_config->get_bool("downloader_url_registered"); + BOOST_LOG_TRIVIAL(debug) << "PageDownloader::on_finish_downloader ac_value " << ac_value << " downloader_checked " << downloader_checked; + if (ac_value && downloader_checked) { + // already registered but we need to do it again + if (!perform_register()) + return false; + app_config->set("downloader_url_registered", "1"); + } else if (!ac_value && downloader_checked) { + // register + if (!perform_register()) + return false; + app_config->set("downloader_url_registered", "1"); + } else if (ac_value && !downloader_checked) { + // deregister, downloads are banned now + deregister(); + app_config->set("downloader_url_registered", "0"); + } /*else if (!ac_value && !downloader_checked) { + // not registered and we dont want to do it + // do not deregister as other instance might be registered + } */ + return true; +} + + PageReloadFromDisk::PageReloadFromDisk(ConfigWizard* parent) : ConfigWizardPage(parent, _L("Reload from disk"), _L("Reload from disk")) , full_pathnames(false) { auto* box_pathnames = new wxCheckBox(this, wxID_ANY, _L("Export full pathnames of models and parts sources into 3mf and amf files")); - box_pathnames->SetValue(wxGetApp().app_config->get("export_sources_full_pathnames") == "1"); + box_pathnames->SetValue(wxGetApp().app_config->get_bool("export_sources_full_pathnames")); append(box_pathnames); append_text(_L( "If enabled, allows the Reload from disk command to automatically find and load the files when invoked.\n" @@ -1280,25 +1587,23 @@ PageMode::PageMode(ConfigWizard *parent) radio_advanced = new wxRadioButton(this, wxID_ANY, _L("Advanced mode")); radio_expert = new wxRadioButton(this, wxID_ANY, _L("Expert mode")); + std::string mode { "simple" }; + wxGetApp().app_config->get("", "view_mode", mode); + + if (mode == "advanced") { radio_advanced->SetValue(true); } + else if (mode == "expert") { radio_expert->SetValue(true); } + else { radio_simple->SetValue(true); } + append(radio_simple); append(radio_advanced); append(radio_expert); append_text("\n" + _L("The size of the object can be specified in inches")); check_inch = new wxCheckBox(this, wxID_ANY, _L("Use inches")); + check_inch->SetValue(wxGetApp().app_config->get_bool("use_inches")); append(check_inch); -} - -void PageMode::on_activate() -{ - std::string mode { "simple" }; - wxGetApp().app_config->get("", "view_mode", mode); - - if (mode == "advanced") { radio_advanced->SetValue(true); } - else if (mode == "expert") { radio_expert->SetValue(true); } - else { radio_simple->SetValue(true); } - check_inch->SetValue(wxGetApp().app_config->get("use_inches") == "1"); + on_activate(); } void PageMode::serialize_mode(AppConfig *app_config) const @@ -1309,11 +1614,6 @@ void PageMode::serialize_mode(AppConfig *app_config) const if (radio_advanced->GetValue()) { mode = "advanced"; } if (radio_expert->GetValue()) { mode = "expert"; } - // If "Mode" page wasn't selected (no one radiobutton is checked), - // we shouldn't to update a view_mode value in app_config - if (mode.empty()) - return; - app_config->set("view_mode", mode); app_config->set("use_inches", check_inch->GetValue() ? "1" : "0"); } @@ -1331,6 +1631,8 @@ PageVendors::PageVendors(ConfigWizard *parent) for (const auto &pair : wizard_p()->bundles) { const VendorProfile *vendor = pair.second.vendor_profile; if (vendor->id == PresetBundle::PRUSA_BUNDLE) { continue; } + if (vendor && vendor->templates_profile) + continue; auto *cbox = new wxCheckBox(this, wxID_ANY, vendor->name); cbox->Bind(wxEVT_CHECKBOX, [=](wxCommandEvent &event) { @@ -1362,14 +1664,14 @@ PageFirmware::PageFirmware(ConfigWizard *parent) append_text(_(gcode_opt.tooltip)); wxArrayString choices; - choices.Alloc(gcode_opt.enum_labels.size()); - for (const auto &label : gcode_opt.enum_labels) { + choices.Alloc(gcode_opt.enum_def->labels().size()); + for (const auto &label : gcode_opt.enum_def->labels()) { choices.Add(label); } gcode_picker = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, choices); wxGetApp().UpdateDarkUI(gcode_picker); - const auto &enum_values = gcode_opt.enum_values; + const auto &enum_values = gcode_opt.enum_def->values(); auto needle = enum_values.cend(); if (gcode_opt.default_value) { needle = std::find(enum_values.cbegin(), enum_values.cend(), gcode_opt.default_value->serialize()); @@ -1386,36 +1688,13 @@ PageFirmware::PageFirmware(ConfigWizard *parent) void PageFirmware::apply_custom_config(DynamicPrintConfig &config) { auto sel = gcode_picker->GetSelection(); - if (sel >= 0 && (size_t)sel < gcode_opt.enum_labels.size()) { + if (sel >= 0 && (size_t)sel < gcode_opt.enum_def->labels().size()) { auto *opt = new ConfigOptionEnum(static_cast(sel)); config.set_key_value("gcode_flavor", opt); } } -PageBedShape::PageBedShape(ConfigWizard *parent) - : ConfigWizardPage(parent, _L("Bed Shape and Size"), _L("Bed Shape"), 1) - , shape_panel(new BedShapePanel(this)) -{ - append_text(_L("Set the shape of your printer's bed.")); - - shape_panel->build_panel(*wizard_p()->custom_config->option("bed_shape"), - *wizard_p()->custom_config->option("bed_custom_texture"), - *wizard_p()->custom_config->option("bed_custom_model")); - - append(shape_panel); -} - -void PageBedShape::apply_custom_config(DynamicPrintConfig &config) -{ - const std::vector& points = shape_panel->get_shape(); - const std::string& custom_texture = shape_panel->get_custom_texture(); - const std::string& custom_model = shape_panel->get_custom_model(); - config.set_key_value("bed_shape", new ConfigOptionPoints(points)); - config.set_key_value("bed_custom_texture", new ConfigOptionString(custom_texture)); - config.set_key_value("bed_custom_model", new ConfigOptionString(custom_model)); -} - -static void focus_event(wxFocusEvent& e, wxTextCtrl* ctrl, double def_value) +static void focus_event(wxFocusEvent& e, wxTextCtrl* ctrl, double def_value) { e.Skip(); wxString str = ctrl->GetValue(); @@ -1431,7 +1710,8 @@ static void focus_event(wxFocusEvent& e, wxTextCtrl* ctrl, double def_value) val = def_value; ctrl->SetValue(double_to_string(val)); show_error(nullptr, _L("Invalid numeric input.")); - ctrl->SetFocus(); + // On Windows, this SetFocus creates an invisible marker. + //ctrl->SetFocus(); } else if (was_replaced) ctrl->SetValue(double_to_string(val)); @@ -1453,6 +1733,88 @@ class DiamTextCtrl : public wxTextCtrl ~DiamTextCtrl() {} }; +PageBedShape::PageBedShape(ConfigWizard *parent) + : ConfigWizardPage(parent, _L("Bed Shape and Size"), _L("Bed Shape"), 1) + , shape_panel(new BedShapePanel(this)) +{ + append_text(_L("Set the shape of your printer's bed.")); + + shape_panel->build_panel(*wizard_p()->custom_config->option("bed_shape"), + *wizard_p()->custom_config->option("bed_custom_texture"), + *wizard_p()->custom_config->option("bed_custom_model")); + + append(shape_panel); +} + +void PageBedShape::apply_custom_config(DynamicPrintConfig &config) +{ + const std::vector& points = shape_panel->get_shape(); + const std::string& custom_texture = shape_panel->get_custom_texture(); + const std::string& custom_model = shape_panel->get_custom_model(); + config.set_key_value("bed_shape", new ConfigOptionPoints(points)); + config.set_key_value("bed_custom_texture", new ConfigOptionString(custom_texture)); + config.set_key_value("bed_custom_model", new ConfigOptionString(custom_model)); +} + +PageBuildVolume::PageBuildVolume(ConfigWizard* parent) + // TRN ConfigWizard : Size of possible print, related on printer size + : ConfigWizardPage(parent, _L("Build Volume"), _L("Build Volume"), 1) + , build_volume(new DiamTextCtrl(this)) +{ + append_text(_L("Set vertical size of your printer.")); + + wxString value = "200"; + build_volume->SetValue(value); + + build_volume->Bind(wxEVT_KILL_FOCUS, [this](wxFocusEvent& e) { + double def_value = 200.0; + double max_value = 1200.0; + e.Skip(); + wxString str = build_volume->GetValue(); + + const char dec_sep = is_decimal_separator_point() ? '.' : ','; + const char dec_sep_alt = dec_sep == '.' ? ',' : '.'; + // Replace the first incorrect separator in decimal number. + bool was_replaced = str.Replace(dec_sep_alt, dec_sep, false) != 0; + + double val = 0.0; + if (!str.ToDouble(&val)) { + val = def_value; + build_volume->SetValue(double_to_string(val)); + show_error(nullptr, _L("Invalid numeric input.")); + //build_volume->SetFocus(); + } else if (val < 0.0) { + val = def_value; + build_volume->SetValue(double_to_string(val)); + show_error(nullptr, _L("Invalid numeric input.")); + //build_volume->SetFocus(); + } else if (val > max_value) { + val = max_value; + build_volume->SetValue(double_to_string(val)); + show_error(nullptr, _L("Invalid numeric input.")); + //build_volume->SetFocus(); + } else if (was_replaced) + build_volume->SetValue(double_to_string(val)); + }, build_volume->GetId()); + + auto* sizer_volume = new wxFlexGridSizer(3, 5, 5); + auto* text_volume = new wxStaticText(this, wxID_ANY, _L("Max print height") + ":"); + auto* unit_volume = new wxStaticText(this, wxID_ANY, _L("mm")); + sizer_volume->AddGrowableCol(0, 1); + sizer_volume->Add(text_volume, 0, wxALIGN_CENTRE_VERTICAL); + sizer_volume->Add(build_volume); + sizer_volume->Add(unit_volume, 0, wxALIGN_CENTRE_VERTICAL); + append(sizer_volume); +} + +void PageBuildVolume::apply_custom_config(DynamicPrintConfig& config) +{ + double val = 0.0; + build_volume->GetValue().ToDouble(&val); + auto* opt_volume = new ConfigOptionFloat(val); + config.set_key_value("max_print_height", opt_volume); +} + PageDiameters::PageDiameters(ConfigWizard *parent) : ConfigWizardPage(parent, _L("Filament and Nozzle Diameters"), _L("Print Diameters"), 1) , diam_nozzle(new DiamTextCtrl(this)) @@ -1472,7 +1834,7 @@ PageDiameters::PageDiameters(ConfigWizard *parent) append_text(_L("Enter the diameter of your printer's hot end nozzle.")); auto *sizer_nozzle = new wxFlexGridSizer(3, 5, 5); - auto *text_nozzle = new wxStaticText(this, wxID_ANY, _L("Nozzle Diameter:")); + auto *text_nozzle = new wxStaticText(this, wxID_ANY, _L("Nozzle Diameter") + ":"); auto *unit_nozzle = new wxStaticText(this, wxID_ANY, _L("mm")); sizer_nozzle->AddGrowableCol(0, 1); sizer_nozzle->Add(text_nozzle, 0, wxALIGN_CENTRE_VERTICAL); @@ -1486,7 +1848,7 @@ PageDiameters::PageDiameters(ConfigWizard *parent) append_text(_L("Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average.")); auto *sizer_filam = new wxFlexGridSizer(3, 5, 5); - auto *text_filam = new wxStaticText(this, wxID_ANY, _L("Filament Diameter:")); + auto *text_filam = new wxStaticText(this, wxID_ANY, _L("Filament Diameter") + ":"); auto *unit_filam = new wxStaticText(this, wxID_ANY, _L("mm")); sizer_filam->AddGrowableCol(0, 1); sizer_filam->Add(text_filam, 0, wxALIGN_CENTRE_VERTICAL); @@ -1578,7 +1940,7 @@ PageTemperatures::PageTemperatures(ConfigWizard *parent) append_text(_L("A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have no heated bed.")); auto *sizer_bed = new wxFlexGridSizer(3, 5, 5); - auto *text_bed = new wxStaticText(this, wxID_ANY, _L("Bed Temperature:")); + auto *text_bed = new wxStaticText(this, wxID_ANY, _L("Bed Temperature") + ":"); auto *unit_bed = new wxStaticText(this, wxID_ANY, _L("°C")); sizer_bed->AddGrowableCol(0, 1); sizer_bed->Add(text_bed, 0, wxALIGN_CENTRE_VERTICAL); @@ -1615,7 +1977,7 @@ ConfigWizardIndex::ConfigWizardIndex(wxWindow *parent) #ifndef __WXOSX__ SetDoubleBuffered(true);// SetDoubleBuffered exists on Win and Linux/GTK, but is missing on OSX #endif //__WXOSX__ - SetMinSize(bg.bmp().GetSize()); + SetMinSize(bg.GetSize()); const wxSize size = GetTextExtent("m"); em_w = size.x; @@ -1740,8 +2102,8 @@ void ConfigWizardIndex::on_paint(wxPaintEvent & evt) wxPaintDC dc(this); - const auto bullet_w = bullet_black.bmp().GetSize().GetWidth(); - const auto bullet_h = bullet_black.bmp().GetSize().GetHeight(); + const auto bullet_w = bullet_black.GetWidth(); + const auto bullet_h = bullet_black.GetHeight(); const int yoff_icon = bullet_h < em_h ? (em_h - bullet_h) / 2 : 0; const int yoff_text = bullet_h > em_h ? (bullet_h - em_h) / 2 : 0; const int yinc = item_height(); @@ -1754,10 +2116,10 @@ void ConfigWizardIndex::on_paint(wxPaintEvent & evt) unsigned x = em_w/2 + item.indent * em_w; if (i == item_active || (item_hover >= 0 && i == (size_t)item_hover)) { - dc.DrawBitmap(bullet_blue.bmp(), x, y + yoff_icon, false); + dc.DrawBitmap(bullet_blue.get_bitmap(), x, y + yoff_icon, false); } - else if (i < item_active) { dc.DrawBitmap(bullet_black.bmp(), x, y + yoff_icon, false); } - else if (i > item_active) { dc.DrawBitmap(bullet_white.bmp(), x, y + yoff_icon, false); } + else if (i < item_active) { dc.DrawBitmap(bullet_black.get_bitmap(), x, y + yoff_icon, false); } + else if (i > item_active) { dc.DrawBitmap(bullet_white.get_bitmap(), x, y + yoff_icon, false); } x += + bullet_w + em_w/2; const auto text_size = dc.GetTextExtent(item.label); @@ -1769,9 +2131,9 @@ void ConfigWizardIndex::on_paint(wxPaintEvent & evt) } //draw logo - if (int y = size.y - bg.GetBmpHeight(); y>=0) { - dc.DrawBitmap(bg.bmp(), 0, y, false); - index_width = std::max(index_width, bg.GetBmpWidth() + em_w / 2); + if (int y = size.y - bg.GetHeight(); y>=0) { + dc.DrawBitmap(bg.get_bitmap(), 0, y, false); + index_width = std::max(index_width, bg.GetWidth() + em_w / 2); } if (GetMinSize().x < index_width) { @@ -1803,12 +2165,8 @@ void ConfigWizardIndex::msw_rescale() em_w = size.x; em_h = size.y; - bg.msw_rescale(); - SetMinSize(bg.bmp().GetSize()); + SetMinSize(bg.GetSize()); - bullet_black.msw_rescale(); - bullet_blue.msw_rescale(); - bullet_white.msw_rescale(); Refresh(); } @@ -1925,19 +2283,27 @@ void ConfigWizard::priv::load_pages() if (page_custom->custom_wanted()) { index->add_page(page_firmware); index->add_page(page_bed); + index->add_page(page_bvolume); index->add_page(page_diams); index->add_page(page_temps); } - // Filaments & Materials + // Filaments & Materials if (any_fff_selected) { index->add_page(page_filaments); } + // Filaments page if only custom printer is selected + const AppConfig* app_config = wxGetApp().app_config; + if (!any_fff_selected && (custom_printer_selected || custom_printer_in_bundle) && (app_config->get("no_templates") == "0")) { + update_materials(T_ANY); + index->add_page(page_filaments); + } } if (any_sla_selected) { index->add_page(page_sla_materials); } // there should to be selected at least one printer - btn_finish->Enable(any_fff_selected || any_sla_selected || custom_printer_selected); + btn_finish->Enable(any_fff_selected || any_sla_selected || custom_printer_selected || custom_printer_in_bundle); index->add_page(page_update); + index->add_page(page_downloader); index->add_page(page_reload_from_disk); #ifdef _WIN32 index->add_page(page_files_association); @@ -1996,6 +2362,13 @@ void ConfigWizard::priv::load_vendors() } } + for (const auto& printer : wxGetApp().preset_bundle->printers) { + if (!printer.is_default && !printer.is_system && printer.is_visible) { + custom_printer_in_bundle = true; + break; + } + } + // Initialize the is_visible flag in printer Presets for (auto &pair : bundles) { pair.second.preset_bundle->load_installed_printers(appconfig_new); @@ -2117,7 +2490,7 @@ void ConfigWizard::priv::set_run_reason(RunReason run_reason) void ConfigWizard::priv::update_materials(Technology technology) { - if (any_fff_selected && (technology & T_FFF)) { + if ((any_fff_selected || custom_printer_in_bundle || custom_printer_selected) && (technology & T_FFF)) { filaments.clear(); aliases_fff.clear(); // Iterate filaments in all bundles @@ -2140,11 +2513,22 @@ void ConfigWizard::priv::update_materials(Technology technology) filaments.add_printer(&printer); } } - + // template filament bundle has no printers - filament would be never added + if(pair.second.vendor_profile&& pair.second.vendor_profile->templates_profile && pair.second.preset_bundle->printers.begin() == pair.second.preset_bundle->printers.end()) + { + if (!filaments.containts(&filament)) { + filaments.push(&filament); + if (!filament.alias.empty()) + aliases_fff[filament.alias].insert(filament.name); + } + } } } // count compatible printers for (const auto& preset : filaments.presets) { + // skip template filaments + if (preset->vendor && preset->vendor->templates_profile) + continue; const auto filter = [preset](const std::pair element) { return preset->alias == element.first; @@ -2152,17 +2536,19 @@ void ConfigWizard::priv::update_materials(Technology technology) if (std::find_if(filaments.compatibility_counter.begin(), filaments.compatibility_counter.end(), filter) != filaments.compatibility_counter.end()) { continue; } + // find all aliases (except templates) std::vector idx_with_same_alias; for (size_t i = 0; i < filaments.presets.size(); ++i) { - if (preset->alias == filaments.presets[i]->alias) + if (preset->alias == filaments.presets[i]->alias && ((filaments.presets[i]->vendor && !filaments.presets[i]->vendor->templates_profile) || !filaments.presets[i]->vendor)) idx_with_same_alias.push_back(i); } + // check compatibility with each printer size_t counter = 0; for (const auto& printer : filaments.printers) { if (!(*printer).is_visible || (*printer).printer_technology() != ptFFF) continue; bool compatible = false; - // Test otrher materials with same alias + // Test other materials with same alias for (size_t i = 0; i < idx_with_same_alias.size() && !compatible; ++i) { const Preset& prst = *(filaments.presets[idx_with_same_alias[i]]); const Preset& prntr = *printer; @@ -2367,6 +2753,11 @@ void ConfigWizard::priv::on_3rdparty_install(const VendorProfile *vendor, bool i bool ConfigWizard::priv::on_bnt_finish() { wxBusyCursor wait; + + if (!page_downloader->on_finish_downloader()) { + index->go_to(page_downloader); + return false; + } /* When Filaments or Sla Materials pages are activated, * materials for this pages are automaticaly updated and presets are reloaded. * @@ -2400,7 +2791,7 @@ bool ConfigWizard::priv::check_and_install_missing_materials(Technology technolo { // Walk over all installed Printer presets and verify whether there is a filament or SLA material profile installed at the same PresetBundle, // which is compatible with it. - const auto printer_models_missing_materials = [this, only_for_model_id](PrinterTechnology technology, const std::string §ion) + const auto printer_models_missing_materials = [this, only_for_model_id](PrinterTechnology technology, const std::string §ion, bool no_templates) { const std::map &appconfig_presets = appconfig_new.has_section(section) ? appconfig_new.get_section(section) : std::map(); std::set printer_models_without_material; @@ -2420,6 +2811,22 @@ bool ConfigWizard::priv::check_and_install_missing_materials(Technology technolo has_material = true; break; } + // find if preset.first is part of the templates profile (up is searching if preset.first is part of printer vendor preset) + if (!no_templates) { + for (const auto& bp : bundles) { + if (!bp.second.preset_bundle->vendors.empty() && bp.second.preset_bundle->vendors.begin()->second.templates_profile) { + const PresetCollection& template_materials = bp.second.preset_bundle->materials(technology); + const Preset* template_material = template_materials.find_preset(preset.first, false); + if (template_material && is_compatible_with_printer(PresetWithVendorProfile(*template_material, &bp.second.preset_bundle->vendors.begin()->second), PresetWithVendorProfile(printer, nullptr))) { + has_material = true; + break; + } + } + } + } + if (has_material) + break; + } } if (! has_material) @@ -2428,6 +2835,27 @@ bool ConfigWizard::priv::check_and_install_missing_materials(Technology technolo } } } + // todo: just workaround so template_profile_selected wont get to false after this function is called for SLA + // this will work unltil there are no SLA template filaments + if (technology == ptFFF) { + // template_profile_selected check + template_profile_selected = false; + for (const auto& bp : bundles) { + if (!bp.second.preset_bundle->vendors.empty() && bp.second.preset_bundle->vendors.begin()->second.templates_profile) { + for (const auto& preset : appconfig_presets) { + const PresetCollection& template_materials = bp.second.preset_bundle->materials(technology); + const Preset* template_material = template_materials.find_preset(preset.first, false); + if (template_material){ + template_profile_selected = true; + break; + } + } + if (template_profile_selected) { + break; + } + } + } + } assert(printer_models_without_material.empty() || only_for_model_id.empty() || only_for_model_id == (*printer_models_without_material.begin())->id); return printer_models_without_material; }; @@ -2451,15 +2879,17 @@ bool ConfigWizard::priv::check_and_install_missing_materials(Technology technolo return out; }; + bool no_templates = wxGetApp().app_config->get("no_templates") == "1"; + if (any_fff_selected && (technology & T_FFF)) { - std::set printer_models_without_material = printer_models_missing_materials(ptFFF, AppConfig::SECTION_FILAMENTS); + std::set printer_models_without_material = printer_models_missing_materials(ptFFF, AppConfig::SECTION_FILAMENTS, no_templates); if (! printer_models_without_material.empty()) { if (only_for_model_id.empty()) ask_and_select_default_materials( _L("The following FFF printer models have no filament selected:") + - "\n\n\t" + + "\n\n" + printer_model_list(printer_models_without_material) + - "\n\n\t" + + "\n\n" + _L("Do you want to select default filaments for these FFF printer models?"), printer_models_without_material, T_FFF); @@ -2470,14 +2900,14 @@ bool ConfigWizard::priv::check_and_install_missing_materials(Technology technolo } if (any_sla_selected && (technology & T_SLA)) { - std::set printer_models_without_material = printer_models_missing_materials(ptSLA, AppConfig::SECTION_MATERIALS); + std::set printer_models_without_material = printer_models_missing_materials(ptSLA, AppConfig::SECTION_MATERIALS, no_templates); if (! printer_models_without_material.empty()) { if (only_for_model_id.empty()) ask_and_select_default_materials( _L("The following SLA printer models have no materials selected:") + - "\n\n\t" + + "\n\n" + printer_model_list(printer_models_without_material) + - "\n\n\t" + + "\n\n" + _L("Do you want to select default SLA materials for these printer models?"), printer_models_without_material, T_SLA); @@ -2522,23 +2952,33 @@ bool ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese { wxString header, caption = _L("Configuration is edited in ConfigWizard"); const auto enabled_vendors = appconfig_new.vendors(); + const auto enabled_vendors_old = app_config->vendors(); bool suppress_sla_printer = model_has_multi_part_objects(wxGetApp().model()); PrinterTechnology preferred_pt = ptAny; - auto get_preferred_printer_technology = [enabled_vendors, suppress_sla_printer](const std::string& bundle_name, const Bundle& bundle) { + auto get_preferred_printer_technology = [enabled_vendors, enabled_vendors_old, suppress_sla_printer](const std::string& bundle_name, const Bundle& bundle) { const auto config = enabled_vendors.find(bundle_name); PrinterTechnology pt = ptAny; if (config != enabled_vendors.end()) { for (const auto& model : bundle.vendor_profile->models) { if (const auto model_it = config->second.find(model.id); model_it != config->second.end() && model_it->second.size() > 0) { - if (pt == ptAny) - pt = model.technology; - // if preferred printer model has SLA printer technology it's important to check the model for multypart state - if (pt == ptSLA && suppress_sla_printer) - continue; - else + pt = model.technology; + const auto config_old = enabled_vendors_old.find(bundle_name); + if (config_old == enabled_vendors_old.end() || config_old->second.find(model.id) == config_old->second.end()) { + // if preferred printer model has SLA printer technology it's important to check the model for multi-part state + if (pt == ptSLA && suppress_sla_printer) + continue; return pt; + } + + if (const auto model_it_old = config_old->second.find(model.id); + model_it_old == config_old->second.end() || model_it_old->second != model_it->second) { + // if preferred printer model has SLA printer technology it's important to check the model for multi-part state + if (pt == ptSLA && suppress_sla_printer) + continue; + return pt; + } } } } @@ -2564,14 +3004,14 @@ bool ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese bool check_unsaved_preset_changes = page_welcome->reset_user_profile(); if (check_unsaved_preset_changes) header = _L("All user presets will be deleted."); - int act_btns = UnsavedChangesDialog::ActionButtons::KEEP; + int act_btns = ActionButtons::KEEP; if (!check_unsaved_preset_changes) - act_btns |= UnsavedChangesDialog::ActionButtons::SAVE; + act_btns |= ActionButtons::SAVE; - // Install bundles from resources if needed: + // Install bundles from resources or cache / vendor if needed: std::vector install_bundles; for (const auto &pair : bundles) { - if (! pair.second.is_in_resources) { continue; } + if (pair.second.location == BundleLocation::IN_VENDOR) { continue; } if (pair.second.is_prusa_bundle) { // Always install Prusa bundle, because it has a lot of filaments/materials @@ -2581,7 +3021,14 @@ bool ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese } const auto vendor = enabled_vendors.find(pair.first); - if (vendor == enabled_vendors.end()) { continue; } + if (vendor == enabled_vendors.end()) { + // vendor not found + // if templates vendor and needs to be installed, add it + // then continue + if (template_profile_selected && pair.second.vendor_profile && pair.second.vendor_profile->templates_profile) + install_bundles.emplace_back(pair.first); + continue; + } size_t size_sum = 0; for (const auto &model : vendor->second) { size_sum += model.second.size(); } @@ -2597,8 +3044,11 @@ bool ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese #ifdef __linux__ // Desktop integration on Linux - if (page_welcome->integrate_desktop()) + BOOST_LOG_TRIVIAL(debug) << "ConfigWizard::priv::apply_config integrate_desktop" << page_welcome->integrate_desktop() << " perform_registration_linux " << page_downloader->m_downloader->get_perform_registration_linux(); + if (page_welcome->integrate_desktop()) DesktopIntegrationDialog::perform_desktop_integration(); + if (page_downloader->m_downloader->get_perform_registration_linux()) + DesktopIntegrationDialog::perform_downloader_desktop_integration(); #endif // Decide whether to create snapshot based on run_reason and the reset profile checkbox @@ -2630,12 +3080,14 @@ bool ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese return false; if (install_bundles.size() > 0) { - // Install bundles from resources. + // Install bundles from resources or cache / vendor. // Don't create snapshot - we've already done that above if applicable. - if (! updater->install_bundles_rsrc(std::move(install_bundles), false)) + + bool install_result = updater->install_bundles_rsrc_or_cache_vendor(std::move(install_bundles), false); + if (!install_result) return false; } else { - BOOST_LOG_TRIVIAL(info) << "No bundles need to be installed from resources"; + BOOST_LOG_TRIVIAL(info) << "No bundles need to be installed from resources or cache / vendor"; } if (page_welcome->reset_user_profile()) { @@ -2645,7 +3097,6 @@ bool ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese std::string preferred_model; std::string preferred_variant; - const auto enabled_vendors_old = app_config->vendors(); auto get_preferred_printer_model = [enabled_vendors, enabled_vendors_old, preferred_pt](const std::string& bundle_name, const Bundle& bundle, std::string& variant) { const auto config = enabled_vendors.find(bundle_name); if (config == enabled_vendors.end()) @@ -2735,7 +3186,8 @@ bool ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese // apply materials in app_config for (const std::string& section_name : {AppConfig::SECTION_FILAMENTS, AppConfig::SECTION_MATERIALS}) - app_config->set_section(section_name, appconfig_new.get_section(section_name)); + if (appconfig_new.has_section(section_name)) + app_config->set_section(section_name, appconfig_new.get_section(section_name)); app_config->set_vendors(appconfig_new); @@ -2758,7 +3210,6 @@ bool ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese // if (page_files_association->associate_gcode()) // wxGetApp().associate_gcode_files(); // } - #endif // _WIN32 page_mode->serialize_mode(app_config); @@ -2767,7 +3218,7 @@ bool ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese preset_bundle->load_presets(*app_config, ForwardCompatibilitySubstitutionRule::EnableSilentDisableSystem, {preferred_model, preferred_variant, first_added_filament, first_added_sla_material}); - if (!only_sla_mode && page_custom->custom_wanted()) { + if (!only_sla_mode && page_custom->custom_wanted() && page_custom->is_valid_profile_name()) { // if unsaved changes was not cheched till this moment if (!check_unsaved_preset_changes && !wxGetApp().check_and_keep_current_preset_changes(caption, _L("Custom printer was installed and it will be activated."), act_btns, &apply_keeped_changes)) @@ -2775,9 +3226,12 @@ bool ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese page_firmware->apply_custom_config(*custom_config); page_bed->apply_custom_config(*custom_config); + page_bvolume->apply_custom_config(*custom_config); page_diams->apply_custom_config(*custom_config); page_temps->apply_custom_config(*custom_config); + copy_bed_model_and_texture_if_needed(*custom_config); + const std::string profile_name = page_custom->profile_name(); preset_bundle->load_config_from_wizard(profile_name, *custom_config); } @@ -2916,6 +3370,7 @@ ConfigWizard::ConfigWizard(wxWindow *parent) p->add_page(p->page_update = new PageUpdate(this)); + p->add_page(p->page_downloader = new PageDownloader(this)); p->add_page(p->page_reload_from_disk = new PageReloadFromDisk(this)); #ifdef _WIN32 p->add_page(p->page_files_association = new PageFilesAssociation(this)); @@ -2923,9 +3378,10 @@ ConfigWizard::ConfigWizard(wxWindow *parent) p->add_page(p->page_mode = new PageMode(this)); p->add_page(p->page_firmware = new PageFirmware(this)); p->add_page(p->page_bed = new PageBedShape(this)); + p->add_page(p->page_bvolume = new PageBuildVolume(this)); p->add_page(p->page_diams = new PageDiameters(this)); p->add_page(p->page_temps = new PageTemperatures(this)); - + p->load_pages(); p->index->go_to(size_t{0}); diff --git a/src/slic3r/GUI/ConfigWizard.hpp b/src/slic3r/GUI/ConfigWizard.hpp index 88d2e2d7c3e..dcd0297ae9a 100644 --- a/src/slic3r/GUI/ConfigWizard.hpp +++ b/src/slic3r/GUI/ConfigWizard.hpp @@ -4,6 +4,8 @@ #include #include +#include +#include #include "GUI_Utils.hpp" @@ -14,6 +16,36 @@ class PresetUpdater; namespace GUI { +namespace DownloaderUtils { + class Worker : public wxBoxSizer + { + wxWindow* m_parent{ nullptr }; + wxTextCtrl* m_input_path{ nullptr }; + bool downloader_checked{ false }; +#ifdef __linux__ + bool perform_registration_linux{ false }; +#endif // __linux__ + + void deregister(); + + public: + Worker(wxWindow* parent); + ~Worker() {} + + void allow(bool allow_) { downloader_checked = allow_; } + bool is_checked() const { return downloader_checked; } + wxString path_name() const { return m_input_path ? m_input_path->GetValue() : wxString(); } + + void set_path_name(wxString name); + void set_path_name(const std::string& name); + + bool on_finish(); + bool perform_register(const std::string& path_override = {}); +#ifdef __linux__ + bool get_perform_registration_linux() { return perform_registration_linux; } +#endif // __linux__ + }; +} class ConfigWizard: public DPIDialog { diff --git a/src/slic3r/GUI/ConfigWizard_private.hpp b/src/slic3r/GUI/ConfigWizard_private.hpp index c822a2be810..2dc2c2e2339 100644 --- a/src/slic3r/GUI/ConfigWizard_private.hpp +++ b/src/slic3r/GUI/ConfigWizard_private.hpp @@ -10,12 +10,10 @@ #include #include -#include #include #include #include #include -#include #include #include #include @@ -26,6 +24,7 @@ #include "slic3r/Utils/PresetUpdater.hpp" #include "BedShapeDialog.hpp" #include "GUI.hpp" +#include "SavePresetDialog.hpp" #include "wxExtensions.hpp" @@ -59,23 +58,30 @@ enum Technology { T_ANY = ~0, }; +enum BundleLocation{ + IN_VENDOR, + IN_ARCHIVE, + IN_RESOURCES +}; + struct Bundle { std::unique_ptr preset_bundle; VendorProfile* vendor_profile{ nullptr }; - bool is_in_resources{ false }; + //bool is_in_resources{ false }; + BundleLocation location; bool is_prusa_bundle{ false }; Bundle() = default; Bundle(Bundle&& other); // Returns false if not loaded. Reason for that is logged as boost::log error. - bool load(fs::path source_path, bool is_in_resources, bool is_prusa_bundle = false); + bool load(fs::path source_path, BundleLocation location, bool is_prusa_bundle = false); const std::string& vendor_id() const { return vendor_profile->id; } }; -struct BundleMap : std::unordered_map +struct BundleMap : std::map { static BundleMap load(); @@ -83,74 +89,8 @@ struct BundleMap : std::unordered_map const Bundle& prusa_bundle() const; }; -struct Materials -{ - Technology technology; - // use vector for the presets to purpose of save of presets sorting in the bundle - std::vector presets; - // String is alias of material, size_t number of compatible counters - std::vector> compatibility_counter; - std::set types; - std::set printers; - - Materials(Technology technology) : technology(technology) {} - - void push(const Preset *preset); - void add_printer(const Preset* preset); - void clear(); - bool containts(const Preset *preset) const { - //return std::find(presets.begin(), presets.end(), preset) != presets.end(); - return std::find_if(presets.begin(), presets.end(), - [preset](const Preset* element) { return element == preset; }) != presets.end(); - - } - - bool get_omnipresent(const Preset* preset) { - return get_printer_counter(preset) == printers.size(); - } - - const std::vector get_presets_by_alias(const std::string name) { - std::vector ret_vec; - for (auto it = presets.begin(); it != presets.end(); ++it) { - if ((*it)->alias == name) - ret_vec.push_back((*it)); - } - return ret_vec; - } - - +struct Materials; - size_t get_printer_counter(const Preset* preset) { - for (auto it : compatibility_counter) { - if (it.first == preset->alias) - return it.second; - } - return 0; - } - - const std::string& appconfig_section() const; - const std::string& get_type(const Preset *preset) const; - const std::string& get_vendor(const Preset *preset) const; - - template void filter_presets(const Preset* printer, const std::string& type, const std::string& vendor, F cb) { - for (auto preset : presets) { - const Preset& prst = *(preset); - const Preset& prntr = *printer; - if ((printer == nullptr || is_compatible_with_printer(PresetWithVendorProfile(prst, prst.vendor), PresetWithVendorProfile(prntr, prntr.vendor))) && - (type.empty() || get_type(preset) == type) && - (vendor.empty() || get_vendor(preset) == vendor)) { - - cb(preset); - } - } - } - - static const std::string UNKNOWN; - static const std::string& get_filament_type(const Preset *preset); - static const std::string& get_filament_vendor(const Preset *preset); - static const std::string& get_material_type(const Preset *preset); - static const std::string& get_material_vendor(const Preset *preset); -}; struct PrinterPickerEvent; @@ -343,6 +283,10 @@ struct PageMaterials: ConfigWizardPage std::string empty_printers_label; bool first_paint = { false }; static const std::string EMPTY; + static const std::string TEMPLATES; + // notify user first time they choose template profile + bool template_shown = { false }; + bool notification_shown = { false }; int last_hovered_item = { -1 } ; PageMaterials(ConfigWizard *parent, Materials *materials, wxString title, wxString shortname, wxString list1name); @@ -367,19 +311,99 @@ struct PageMaterials: ConfigWizardPage virtual void on_activate() override; }; +struct Materials +{ + Technology technology; + // use vector for the presets to purpose of save of presets sorting in the bundle + std::vector presets; + // String is alias of material, size_t number of compatible counters + std::vector> compatibility_counter; + std::set types; + std::set printers; + + Materials(Technology technology) : technology(technology) {} + + void push(const Preset* preset); + void add_printer(const Preset* preset); + void clear(); + bool containts(const Preset* preset) const { + //return std::find(presets.begin(), presets.end(), preset) != presets.end(); + return std::find_if(presets.begin(), presets.end(), + [preset](const Preset* element) { return element == preset; }) != presets.end(); + + } + + bool get_omnipresent(const Preset* preset) { + return get_printer_counter(preset) == printers.size(); + } + + const std::vector get_presets_by_alias(const std::string name) { + std::vector ret_vec; + for (auto it = presets.begin(); it != presets.end(); ++it) { + if ((*it)->alias == name) + ret_vec.push_back((*it)); + } + return ret_vec; + } + + + + size_t get_printer_counter(const Preset* preset) { + for (auto it : compatibility_counter) { + if (it.first == preset->alias) + return it.second; + } + return 0; + } + + const std::string& appconfig_section() const; + const std::string& get_type(const Preset* preset) const; + const std::string& get_vendor(const Preset* preset) const; + + template void filter_presets(const Preset* printer, const std::string& printer_name, const std::string& type, const std::string& vendor, F cb) { + for (auto preset : presets) { + const Preset& prst = *(preset); + const Preset& prntr = *printer; + if (((printer == nullptr && printer_name == PageMaterials::EMPTY) || (printer != nullptr && is_compatible_with_printer(PresetWithVendorProfile(prst, prst.vendor), PresetWithVendorProfile(prntr, prntr.vendor)))) && + (type.empty() || get_type(preset) == type) && + (vendor.empty() || get_vendor(preset) == vendor) && + prst.vendor && !prst.vendor->templates_profile) { + + cb(preset); + } + else if ((printer == nullptr && printer_name == PageMaterials::TEMPLATES) && prst.vendor && prst.vendor->templates_profile && + (type.empty() || get_type(preset) == type) && + (vendor.empty() || get_vendor(preset) == vendor)) { + cb(preset); + } + } + } + + static const std::string UNKNOWN; + static const std::string& get_filament_type(const Preset* preset); + static const std::string& get_filament_vendor(const Preset* preset); + static const std::string& get_material_type(const Preset* preset); + static const std::string& get_material_vendor(const Preset* preset); +}; + + struct PageCustom: ConfigWizardPage { PageCustom(ConfigWizard *parent); + ~PageCustom() { + if (profile_name_editor) + delete profile_name_editor; + } - bool custom_wanted() const { return cb_custom->GetValue(); } - std::string profile_name() const { return into_u8(tc_profile_name->GetValue()); } + bool custom_wanted() const { return cb_custom->GetValue(); } + bool is_valid_profile_name() const { return profile_name_editor->is_valid();} + std::string profile_name() const { return profile_name_editor->preset_name(); } private: static const char* default_profile_name; - wxCheckBox *cb_custom; - wxTextCtrl *tc_profile_name; - wxString profile_name_prev; + wxCheckBox *cb_custom {nullptr}; + SavePresetDialog::Item *profile_name_editor {nullptr}; }; @@ -387,10 +411,21 @@ struct PageUpdate: ConfigWizardPage { bool version_check; bool preset_update; + wxTextCtrl* path_text_ctrl; PageUpdate(ConfigWizard *parent); }; + +struct PageDownloader : ConfigWizardPage +{ + DownloaderUtils::Worker* m_downloader { nullptr }; + + PageDownloader(ConfigWizard* parent); + + bool on_finish_downloader() const ; +}; + struct PageReloadFromDisk : ConfigWizardPage { bool full_pathnames; @@ -426,8 +461,6 @@ struct PageMode: ConfigWizardPage PageMode(ConfigWizard *parent); void serialize_mode(AppConfig *app_config) const; - - virtual void on_activate(); }; struct PageVendors: ConfigWizardPage @@ -452,6 +485,14 @@ struct PageBedShape: ConfigWizardPage virtual void apply_custom_config(DynamicPrintConfig &config); }; +struct PageBuildVolume : ConfigWizardPage +{ + wxTextCtrl* build_volume; + + PageBuildVolume(ConfigWizard* parent); + virtual void apply_custom_config(DynamicPrintConfig& config); +}; + struct PageDiameters: ConfigWizardPage { wxTextCtrl *diam_nozzle; @@ -521,7 +562,7 @@ class ConfigWizardIndex: public wxPanel ssize_t item_hover; size_t last_page; - int item_height() const { return std::max(bullet_black.bmp().GetSize().GetHeight(), em_w) + em_w; } + int item_height() const { return std::max(bullet_black.GetHeight(), em_w) + em_w; } void on_paint(wxPaintEvent &evt); void on_mouse_move(wxMouseEvent &evt); @@ -551,9 +592,11 @@ struct ConfigWizard::priv std::unique_ptr custom_config; // Backing for custom printer definition bool any_fff_selected; // Used to decide whether to display Filaments page bool any_sla_selected; // Used to decide whether to display SLA Materials page - bool custom_printer_selected { false }; + bool custom_printer_selected { false }; // New custom printer is requested + bool custom_printer_in_bundle { false }; // Older custom printer already exists when wizard starts // Set to true if there are none FFF printers on the main FFF page. If true, only SLA printers are shown (not even custum printers) bool only_sla_mode { false }; + bool template_profile_selected { false }; // This bool has one purpose - to tell that template profile should be installed if its not (because it cannot be added to appconfig) wxScrolledWindow *hscroll = nullptr; wxBoxSizer *hscroll_sizer = nullptr; @@ -572,7 +615,8 @@ struct ConfigWizard::priv PageMaterials *page_filaments = nullptr; PageMaterials *page_sla_materials = nullptr; PageCustom *page_custom = nullptr; - PageUpdate *page_update = nullptr; + PageUpdate* page_update = nullptr; + PageDownloader* page_downloader = nullptr; PageReloadFromDisk *page_reload_from_disk = nullptr; #ifdef _WIN32 PageFilesAssociation* page_files_association = nullptr; @@ -586,6 +630,7 @@ struct ConfigWizard::priv PageBedShape *page_bed = nullptr; PageDiameters *page_diams = nullptr; PageTemperatures *page_temps = nullptr; + PageBuildVolume* page_bvolume = nullptr; // Pointers to all pages (regardless or whether currently part of the ConfigWizardIndex) std::vector all_pages; @@ -619,9 +664,9 @@ struct ConfigWizard::priv bool apply_config(AppConfig *app_config, PresetBundle *preset_bundle, const PresetUpdater *updater, bool& apply_keeped_changes); // #ys_FIXME_alise void update_presets_in_config(const std::string& section, const std::string& alias_key, bool add); -#ifdef __linux__ - void perform_desktop_integration() const; -#endif +//#ifdef __linux__ +// void perform_desktop_integration() const; +//#endif bool check_fff_selected(); // Used to decide whether to display Filaments page bool check_sla_selected(); // Used to decide whether to display SLA Materials page diff --git a/src/slic3r/GUI/CoordAxes.cpp b/src/slic3r/GUI/CoordAxes.cpp new file mode 100644 index 00000000000..734f8ddfaf4 --- /dev/null +++ b/src/slic3r/GUI/CoordAxes.cpp @@ -0,0 +1,69 @@ +#include "libslic3r/libslic3r.h" + +#include "CoordAxes.hpp" +#include "GUI_App.hpp" +#include "3DScene.hpp" +#include "Plater.hpp" +#include "Camera.hpp" + +#include + +namespace Slic3r { +namespace GUI { + +const float CoordAxes::DefaultStemRadius = 0.5f; +const float CoordAxes::DefaultStemLength = 25.0f; +const float CoordAxes::DefaultTipRadius = 2.5f * CoordAxes::DefaultStemRadius; +const float CoordAxes::DefaultTipLength = 5.0f; + +void CoordAxes::render(const Transform3d& trafo, float emission_factor) +{ + auto render_axis = [this](GLShaderProgram& shader, const Transform3d& transform) { + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d& view_matrix = camera.get_view_matrix(); + const Transform3d matrix = view_matrix * transform; + shader.set_uniform("view_model_matrix", matrix); + shader.set_uniform("projection_matrix", camera.get_projection_matrix()); + shader.set_uniform("view_normal_matrix", (Matrix3d)(view_matrix.matrix().block(0, 0, 3, 3) * transform.matrix().block(0, 0, 3, 3).inverse().transpose())); + m_arrow.render(); + }; + + if (!m_arrow.is_initialized()) + m_arrow.init_from(stilized_arrow(16, m_tip_radius, m_tip_length, m_stem_radius, m_stem_length)); + + GLShaderProgram* curr_shader = wxGetApp().get_current_shader(); + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); + if (shader == nullptr) + return; + + if (curr_shader != nullptr) + curr_shader->stop_using(); + + shader->start_using(); + shader->set_uniform("emission_factor", emission_factor); + + // Scale the axes if the camera is close to them to avoid issues + // such as https://github.com/prusa3d/PrusaSlicer/issues/9483 + const Camera& camera = wxGetApp().plater()->get_camera(); + Transform3d scale_tr = Transform3d::Identity(); + scale_tr.scale(std::min(1., camera.get_inv_zoom() * 10.)); + + // x axis + m_arrow.set_color(ColorRGBA::X()); + render_axis(*shader, trafo * Geometry::translation_transform(m_origin) * Geometry::rotation_transform({ 0.0, 0.5 * M_PI, 0.0 }) * scale_tr); + + // y axis + m_arrow.set_color(ColorRGBA::Y()); + render_axis(*shader, trafo * Geometry::translation_transform(m_origin) * Geometry::rotation_transform({ -0.5 * M_PI, 0.0, 0.0 }) * scale_tr); + + // z axis + m_arrow.set_color(ColorRGBA::Z()); + render_axis(*shader, trafo * Geometry::translation_transform(m_origin) * scale_tr); + + shader->stop_using(); + if (curr_shader != nullptr) + curr_shader->start_using(); +} + +} // GUI +} // Slic3r diff --git a/src/slic3r/GUI/CoordAxes.hpp b/src/slic3r/GUI/CoordAxes.hpp new file mode 100644 index 00000000000..1d934751f23 --- /dev/null +++ b/src/slic3r/GUI/CoordAxes.hpp @@ -0,0 +1,57 @@ +#ifndef slic3r_CoordAxes_hpp_ +#define slic3r_CoordAxes_hpp_ + +#include "GLModel.hpp" + +namespace Slic3r { +namespace GUI { + +class CoordAxes +{ +public: + static const float DefaultStemRadius; + static const float DefaultStemLength; + static const float DefaultTipRadius; + static const float DefaultTipLength; + +private: + Vec3d m_origin{ Vec3d::Zero() }; + float m_stem_radius{ DefaultStemRadius }; + float m_stem_length{ DefaultStemLength }; + float m_tip_radius{ DefaultTipRadius }; + float m_tip_length{ DefaultTipLength }; + GLModel m_arrow; + +public: + const Vec3d& get_origin() const { return m_origin; } + void set_origin(const Vec3d& origin) { m_origin = origin; } + void set_stem_radius(float radius) { + m_stem_radius = radius; + m_arrow.reset(); + } + void set_stem_length(float length) { + m_stem_length = length; + m_arrow.reset(); + } + void set_tip_radius(float radius) { + m_tip_radius = radius; + m_arrow.reset(); + } + void set_tip_length(float length) { + m_tip_length = length; + m_arrow.reset(); + } + + float get_stem_radius() const { return m_stem_radius; } + float get_stem_length() const { return m_stem_length; } + float get_tip_radius() const { return m_tip_radius; } + float get_tip_length() const { return m_tip_length; } + float get_total_length() const { return m_stem_length + m_tip_length; } + + void render(const Transform3d& trafo, float emission_factor = 0.0f); +}; + +} // GUI +} // Slic3r + +#endif // slic3r_CoordAxes_hpp_ diff --git a/src/slic3r/GUI/DesktopIntegrationDialog.cpp b/src/slic3r/GUI/DesktopIntegrationDialog.cpp index 81c681bc3a7..62e8411533c 100644 --- a/src/slic3r/GUI/DesktopIntegrationDialog.cpp +++ b/src/slic3r/GUI/DesktopIntegrationDialog.cpp @@ -10,6 +10,7 @@ #include "libslic3r/Platform.hpp" #include "libslic3r/Config.hpp" +#include #include #include #include @@ -219,8 +220,7 @@ bool DesktopIntegrationDialog::integration_possible() } void DesktopIntegrationDialog::perform_desktop_integration() { - BOOST_LOG_TRIVIAL(debug) << "performing desktop integration"; - + BOOST_LOG_TRIVIAL(debug) << "performing desktop integration."; // Path to appimage const char *appimage_env = std::getenv("APPIMAGE"); std::string excutable_path; @@ -286,7 +286,7 @@ void DesktopIntegrationDialog::perform_desktop_integration() std::string target_dir_icons; std::string target_dir_desktop; - + // slicer icon // iterate thru target_candidates to find icons folder for (size_t i = 0; i < target_candidates.size(); ++i) { @@ -299,20 +299,20 @@ void DesktopIntegrationDialog::perform_desktop_integration() break; // success else target_dir_icons.clear(); // copying failed - // if all failed - try creating default home folder - if (i == target_candidates.size() - 1) { - // create $HOME/.local/share - create_path(boost::nowide::narrow(wxFileName::GetHomeDir()), ".local/share/icons" + icon_theme_dirs); - // copy icon - target_dir_icons = GUI::format("%1%/.local/share",wxFileName::GetHomeDir()); - std::string icon_path = GUI::format("%1%/icons/PrusaSlicer.png",resources_dir()); - std::string dest_path = GUI::format("%1%/icons/%2%PrusaSlicer%3%.png", target_dir_icons, icon_theme_path, version_suffix); - if (!contains_path_dir(target_dir_icons, "icons") - || !copy_icon(icon_path, dest_path)) { - // every attempt failed - icon wont be present - target_dir_icons.clear(); - } - } + } + // if all failed - try creating default home folder + if (i == target_candidates.size() - 1) { + // create $HOME/.local/share + create_path(boost::nowide::narrow(wxFileName::GetHomeDir()), ".local/share/icons" + icon_theme_dirs); + // copy icon + target_dir_icons = GUI::format("%1%/.local/share",wxFileName::GetHomeDir()); + std::string icon_path = GUI::format("%1%/icons/PrusaSlicer.png",resources_dir()); + std::string dest_path = GUI::format("%1%/icons/%2%PrusaSlicer%3%.png", target_dir_icons, icon_theme_path, version_suffix); + if (!contains_path_dir(target_dir_icons, "icons") + || !copy_icon(icon_path, dest_path)) { + // every attempt failed - icon wont be present + target_dir_icons.clear(); + } } } if(target_dir_icons.empty()) { @@ -323,57 +323,62 @@ void DesktopIntegrationDialog::perform_desktop_integration() // desktop file // iterate thru target_candidates to find applications folder - for (size_t i = 0; i < target_candidates.size(); ++i) - { + + std::string desktop_file = GUI::format( + "[Desktop Entry]\n" + "Name=PrusaSlicer%1%\n" + "GenericName=3D Printing Software\n" + "Icon=PrusaSlicer%2%\n" + "Exec=\"%3%\" %%F\n" + "Terminal=false\n" + "Type=Application\n" + "MimeType=model/stl;application/vnd.ms-3mfdocument;application/prs.wavefront-obj;application/x-amf;\n" + "Categories=Graphics;3DGraphics;Engineering;\n" + "Keywords=3D;Printing;Slicer;slice;3D;printer;convert;gcode;stl;obj;amf;SLA\n" + "StartupNotify=false\n" + "StartupWMClass=prusa-slicer\n", name_suffix, version_suffix, excutable_path); + + bool candidate_found = false; + for (size_t i = 0; i < target_candidates.size(); ++i) { if (contains_path_dir(target_candidates[i], "applications")) { target_dir_desktop = target_candidates[i]; // Write slicer desktop file - std::string desktop_file = GUI::format( - "[Desktop Entry]\n" - "Name=PrusaSlicer%1%\n" - "GenericName=3D Printing Software\n" - "Icon=PrusaSlicer%2%\n" - "Exec=\"%3%\" %%F\n" - "Terminal=false\n" - "Type=Application\n" - "MimeType=model/stl;application/vnd.ms-3mfdocument;application/prs.wavefront-obj;application/x-amf;\n" - "Categories=Graphics;3DGraphics;Engineering;\n" - "Keywords=3D;Printing;Slicer;slice;3D;printer;convert;gcode;stl;obj;amf;SLA\n" - "StartupNotify=false\n" - "StartupWMClass=prusa-slicer\n", name_suffix, version_suffix, excutable_path); - std::string path = GUI::format("%1%/applications/PrusaSlicer%2%.desktop", target_dir_desktop, version_suffix); - if (create_desktop_file(path, desktop_file)){ + if (create_desktop_file(path, desktop_file)) { + candidate_found = true; BOOST_LOG_TRIVIAL(debug) << "PrusaSlicer.desktop file installation success."; break; - } else { - // write failed - try another path + } + else { + // write failed - try another path BOOST_LOG_TRIVIAL(debug) << "Attempt to PrusaSlicer.desktop file installation failed. failed path: " << target_candidates[i]; - target_dir_desktop.clear(); + target_dir_desktop.clear(); } - // if all failed - try creating default home folder - if (i == target_candidates.size() - 1) { - // create $HOME/.local/share - create_path(boost::nowide::narrow(wxFileName::GetHomeDir()), ".local/share/applications"); - // create desktop file - target_dir_desktop = GUI::format("%1%/.local/share",wxFileName::GetHomeDir()); - std::string path = GUI::format("%1%/applications/PrusaSlicer%2%.desktop", target_dir_desktop, version_suffix); - if (contains_path_dir(target_dir_desktop, "applications")) { - if (!create_desktop_file(path, desktop_file)) { - // Desktop file not written - end desktop integration - BOOST_LOG_TRIVIAL(error) << "Performing desktop integration failed - could not create desktop file"; - return; - } - } else { - // Desktop file not written - end desktop integration - BOOST_LOG_TRIVIAL(error) << "Performing desktop integration failed because the application directory was not found."; - return; - } + } + } + // if all failed - try creating default home folder + if (!candidate_found) { + // create $HOME/.local/share + create_path(boost::nowide::narrow(wxFileName::GetHomeDir()), ".local/share/applications"); + // create desktop file + target_dir_desktop = GUI::format("%1%/.local/share", wxFileName::GetHomeDir()); + std::string path = GUI::format("%1%/applications/PrusaSlicer%2%.desktop", target_dir_desktop, version_suffix); + if (contains_path_dir(target_dir_desktop, "applications")) { + if (!create_desktop_file(path, desktop_file)) { + // Desktop file not written - end desktop integration + BOOST_LOG_TRIVIAL(error) << "Performing desktop integration failed - could not create desktop file"; + return; } } + else { + // Desktop file not written - end desktop integration + BOOST_LOG_TRIVIAL(error) << "Performing desktop integration failed because the application directory was not found."; + return; + } } - if(target_dir_desktop.empty()) { - // Desktop file not written - end desktop integration + assert(!target_dir_desktop.empty()); + if (target_dir_desktop.empty()) { + // Desktop file not written - end desktop integration BOOST_LOG_TRIVIAL(error) << "Performing desktop integration failed because the application directory was not found."; show_error(nullptr, _L("Performing desktop integration failed because the application directory was not found.")); return; @@ -397,7 +402,7 @@ void DesktopIntegrationDialog::perform_desktop_integration() } // Desktop file - std::string desktop_file = GUI::format( + std::string desktop_file_viewer = GUI::format( "[Desktop Entry]\n" "Name=Prusa Gcode Viewer%1%\n" "GenericName=3D Printing Software\n" @@ -409,9 +414,8 @@ void DesktopIntegrationDialog::perform_desktop_integration() "Categories=Graphics;3DGraphics;\n" "Keywords=3D;Printing;Slicer;\n" "StartupNotify=false\n", name_suffix, version_suffix, excutable_path); - std::string desktop_path = GUI::format("%1%/applications/PrusaSlicerGcodeViewer%2%.desktop", target_dir_desktop, version_suffix); - if (create_desktop_file(desktop_path, desktop_file)) + if (create_desktop_file(desktop_path, desktop_file_viewer)) // save path to desktop file app_config->set("desktop_integration_app_viewer_path", desktop_path); else { @@ -419,7 +423,6 @@ void DesktopIntegrationDialog::perform_desktop_integration() show_error(nullptr, _L("Performing desktop integration failed - could not create Gcodeviewer desktop file. PrusaSlicer desktop file was probably created successfully.")); } } - wxGetApp().plater()->get_notification_manager()->push_notification(NotificationType::DesktopIntegrationSuccess); } void DesktopIntegrationDialog::undo_desktop_intgration() @@ -454,6 +457,170 @@ void DesktopIntegrationDialog::undo_desktop_intgration() } wxGetApp().plater()->get_notification_manager()->push_notification(NotificationType::UndoDesktopIntegrationSuccess); } +void DesktopIntegrationDialog::perform_downloader_desktop_integration() +{ + BOOST_LOG_TRIVIAL(debug) << "performing downloader desktop integration."; + // Path to appimage + const char* appimage_env = std::getenv("APPIMAGE"); + std::string excutable_path; + if (appimage_env) { + try { + excutable_path = boost::filesystem::canonical(boost::filesystem::path(appimage_env)).string(); + } + catch (std::exception&) { + BOOST_LOG_TRIVIAL(error) << "Performing downloader desktop integration failed - boost::filesystem::canonical did not return appimage path."; + show_error(nullptr, _L("Performing downloader desktop integration failed - boost::filesystem::canonical did not return appimage path.")); + return; + } + } + else { + // not appimage - find executable + excutable_path = boost::dll::program_location().string(); + //excutable_path = wxStandardPaths::Get().GetExecutablePath().string(); + BOOST_LOG_TRIVIAL(debug) << "non-appimage path to executable: " << excutable_path; + if (excutable_path.empty()) + { + BOOST_LOG_TRIVIAL(error) << "Performing downloader desktop integration failed - no executable found."; + show_error(nullptr, _L("Performing downloader desktop integration failed - Could not find executable.")); + return; + } + } + + // Escape ' characters in appimage, other special symbols will be esacaped in desktop file by 'excutable_path' + //boost::replace_all(excutable_path, "'", "'\\''"); + excutable_path = escape_string(excutable_path); + + // Find directories icons and applications + // $XDG_DATA_HOME defines the base directory relative to which user specific data files should be stored. + // If $XDG_DATA_HOME is either not set or empty, a default equal to $HOME/.local/share should be used. + // $XDG_DATA_DIRS defines the preference-ordered set of base directories to search for data files in addition to the $XDG_DATA_HOME base directory. + // The directories in $XDG_DATA_DIRS should be seperated with a colon ':'. + // If $XDG_DATA_DIRS is either not set or empty, a value equal to /usr/local/share/:/usr/share/ should be used. + std::vectortarget_candidates; + resolve_path_from_var("XDG_DATA_HOME", target_candidates); + resolve_path_from_var("XDG_DATA_DIRS", target_candidates); + + AppConfig* app_config = wxGetApp().app_config; + // suffix string to create different desktop file for alpha, beta. + + std::string version_suffix; + std::string name_suffix; + std::string version(SLIC3R_VERSION); + if (version.find("alpha") != std::string::npos) + { + version_suffix = "-alpha"; + name_suffix = " - alpha"; + } + else if (version.find("beta") != std::string::npos) + { + version_suffix = "-beta"; + name_suffix = " - beta"; + } + + // theme path to icon destination + std::string icon_theme_path; + std::string icon_theme_dirs; + + if (platform_flavor() == PlatformFlavor::LinuxOnChromium) { + icon_theme_path = "hicolor/96x96/apps/"; + icon_theme_dirs = "/hicolor/96x96/apps"; + } + + std::string target_dir_desktop; + + // desktop file + // iterate thru target_candidates to find applications folder + + std::string desktop_file_downloader = GUI::format( + "[Desktop Entry]\n" + "Name=PrusaSlicer URL Protocol%1%\n" + "Exec=\"%2%\" --single-instance %%u\n" + "Terminal=false\n" + "Type=Application\n" + "MimeType=x-scheme-handler/prusaslicer;\n" + "StartupNotify=false\n" + "NoDisplay=true\n" + , name_suffix, excutable_path); + + // desktop file for downloader as part of main app + std::string desktop_path = GUI::format("%1%/applications/PrusaSlicerURLProtocol%2%.desktop", target_dir_desktop, version_suffix); + if (create_desktop_file(desktop_path, desktop_file_downloader)) { + // save path to desktop file + app_config->set("desktop_integration_URL_path", desktop_path); + // finish registration on mime type + std::string command = GUI::format("xdg-mime default PrusaSlicerURLProtocol%1%.desktop x-scheme-handler/prusaslicer", version_suffix); + BOOST_LOG_TRIVIAL(debug) << "system command: " << command; + int r = system(command.c_str()); + BOOST_LOG_TRIVIAL(debug) << "system result: " << r; + + } + + bool candidate_found = false; + for (size_t i = 0; i < target_candidates.size(); ++i) { + if (contains_path_dir(target_candidates[i], "applications")) { + target_dir_desktop = target_candidates[i]; + // Write slicer desktop file + std::string path = GUI::format("%1%/applications/PrusaSlicerURLProtocol%2%.desktop", target_dir_desktop, version_suffix); + if (create_desktop_file(path, desktop_file_downloader)) { + app_config->set("desktop_integration_URL_path", path); + candidate_found = true; + BOOST_LOG_TRIVIAL(debug) << "PrusaSlicerURLProtocol.desktop file installation success."; + break; + } + else { + // write failed - try another path + BOOST_LOG_TRIVIAL(debug) << "Attempt to PrusaSlicerURLProtocol.desktop file installation failed. failed path: " << target_candidates[i]; + target_dir_desktop.clear(); + } + } + } + // if all failed - try creating default home folder + if (!candidate_found) { + // create $HOME/.local/share + create_path(boost::nowide::narrow(wxFileName::GetHomeDir()), ".local/share/applications"); + // create desktop file + target_dir_desktop = GUI::format("%1%/.local/share", wxFileName::GetHomeDir()); + std::string path = GUI::format("%1%/applications/PrusaSlicerURLProtocol%2%.desktop", target_dir_desktop, version_suffix); + if (contains_path_dir(target_dir_desktop, "applications")) { + if (!create_desktop_file(path, desktop_file_downloader)) { + // Desktop file not written - end desktop integration + BOOST_LOG_TRIVIAL(error) << "Performing downloader desktop integration failed - could not create desktop file."; + return; + } + app_config->set("desktop_integration_URL_path", path); + } + else { + // Desktop file not written - end desktop integration + BOOST_LOG_TRIVIAL(error) << "Performing downloader desktop integration failed because the application directory was not found."; + return; + } + } + assert(!target_dir_desktop.empty()); + if (target_dir_desktop.empty()) { + // Desktop file not written - end desktop integration + BOOST_LOG_TRIVIAL(error) << "Performing downloader desktop integration failed because the application directory was not found."; + show_error(nullptr, _L("Performing downloader desktop integration failed because the application directory was not found.")); + return; + } + + // finish registration on mime type + std::string command = GUI::format("xdg-mime default PrusaSlicerURLProtocol%1%.desktop x-scheme-handler/prusaslicer", version_suffix); + BOOST_LOG_TRIVIAL(debug) << "system command: " << command; + int r = system(command.c_str()); + BOOST_LOG_TRIVIAL(debug) << "system result: " << r; + + wxGetApp().plater()->get_notification_manager()->push_notification(NotificationType::DesktopIntegrationSuccess); +} +void DesktopIntegrationDialog::undo_downloader_registration() +{ + const AppConfig *app_config = wxGetApp().app_config; + std::string path = std::string(app_config->get("desktop_integration_URL_path")); + if (!path.empty()) { + BOOST_LOG_TRIVIAL(debug) << "removing " << path; + std::remove(path.c_str()); + } + // There is no need to undo xdg-mime default command. It is done automatically when desktop file is deleted. +} DesktopIntegrationDialog::DesktopIntegrationDialog(wxWindow *parent) : wxDialog(parent, wxID_ANY, _(L("Desktop Integration")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER) @@ -503,4 +670,4 @@ DesktopIntegrationDialog::~DesktopIntegrationDialog() } // namespace GUI } // namespace Slic3r -#endif // __linux__ \ No newline at end of file +#endif // __linux__ diff --git a/src/slic3r/GUI/DesktopIntegrationDialog.hpp b/src/slic3r/GUI/DesktopIntegrationDialog.hpp index 74a0a68f995..19cff1fd859 100644 --- a/src/slic3r/GUI/DesktopIntegrationDialog.hpp +++ b/src/slic3r/GUI/DesktopIntegrationDialog.hpp @@ -26,9 +26,15 @@ class DesktopIntegrationDialog : public wxDialog // Creates Desktop files and icons for both PrusaSlicer and GcodeViewer. // Stores paths into App Config. // Rewrites if files already existed. + // if perform_downloader: + // Creates Destktop files for PrusaSlicer downloader feature + // Regiters PrusaSlicer to start on prusaslicer:// URL static void perform_desktop_integration(); // Deletes Desktop files and icons for both PrusaSlicer and GcodeViewer at paths stored in App Config. static void undo_desktop_intgration(); + + static void perform_downloader_desktop_integration(); + static void undo_downloader_registration(); private: }; diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index ce3309967fe..a0816c22f8d 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -86,27 +86,27 @@ Control::Control( wxWindow *parent, m_bmp_thumb_higher = (style == wxSL_HORIZONTAL ? ScalableBitmap(this, "thumb_right") : ScalableBitmap(this, "thumb_up")); m_bmp_thumb_lower = (style == wxSL_HORIZONTAL ? ScalableBitmap(this, "thumb_left") : ScalableBitmap(this, "thumb_down")); - m_thumb_size = m_bmp_thumb_lower.GetBmpSize(); + m_thumb_size = m_bmp_thumb_lower.GetSize(); m_bmp_add_tick_on = ScalableBitmap(this, "colorchange_add"); m_bmp_add_tick_off = ScalableBitmap(this, "colorchange_add_f"); m_bmp_del_tick_on = ScalableBitmap(this, "colorchange_del"); m_bmp_del_tick_off = ScalableBitmap(this, "colorchange_del_f"); - m_tick_icon_dim = m_bmp_add_tick_on.GetBmpWidth(); + m_tick_icon_dim = m_bmp_add_tick_on.GetWidth(); m_bmp_one_layer_lock_on = ScalableBitmap(this, "lock_closed"); m_bmp_one_layer_lock_off = ScalableBitmap(this, "lock_closed_f"); m_bmp_one_layer_unlock_on = ScalableBitmap(this, "lock_open"); m_bmp_one_layer_unlock_off = ScalableBitmap(this, "lock_open_f"); - m_lock_icon_dim = m_bmp_one_layer_lock_on.GetBmpWidth(); + m_lock_icon_dim = m_bmp_one_layer_lock_on.GetWidth(); m_bmp_revert = ScalableBitmap(this, "undo"); - m_revert_icon_dim = m_bmp_revert.GetBmpWidth(); + m_revert_icon_dim = m_bmp_revert.GetWidth(); m_bmp_cog = ScalableBitmap(this, "cog"); - m_cog_icon_dim = m_bmp_cog.GetBmpWidth(); + m_cog_icon_dim = m_bmp_cog.GetWidth(); m_selection = ssUndef; - m_ticks.set_pause_print_msg(_utf8(L("Place bearings in slots and resume printing"))); + m_ticks.set_pause_print_msg(_u8L("Place bearings in slots and resume printing")); m_ticks.set_extruder_colors(&m_extruder_colors); // slider events @@ -122,6 +122,10 @@ Control::Control( wxWindow *parent, this->Bind(wxEVT_KEY_UP, &Control::OnKeyUp, this); this->Bind(wxEVT_RIGHT_DOWN, &Control::OnRightDown,this); this->Bind(wxEVT_RIGHT_UP, &Control::OnRightUp, this); + this->Bind(wxEVT_SIZE, [this](wxSizeEvent& event) { + m_ruler.update(m_layers_values.empty() ? m_values : m_layers_values, get_scroll_step()); + event.Skip(); + }); // control's view variables SLIDER_MARGIN = 4 + GUI::wxGetApp().em_unit(); @@ -137,61 +141,51 @@ Control::Control( wxWindow *parent, m_line_pens = { &DARK_GREY_PEN, &GREY_PEN, &LIGHT_GREY_PEN }; m_segm_pens = { &DARK_ORANGE_PEN, &ORANGE_PEN, &LIGHT_ORANGE_PEN }; + FOCUS_RECT_PEN = wxPen(wxColour(128, 128, 10), 1, wxPENSTYLE_DOT); + FOCUS_RECT_BRUSH = wxBrush(wxColour(0, 0, 0), wxBRUSHSTYLE_TRANSPARENT); + m_font = GetFont(); this->SetMinSize(get_min_size()); + + if (style == wxSL_VERTICAL) + m_ruler.set_parent(this->GetParent()); } void Control::msw_rescale() { m_font = GUI::wxGetApp().normal_font(); - m_bmp_thumb_higher.msw_rescale(); - m_bmp_thumb_lower .msw_rescale(); - m_thumb_size = m_bmp_thumb_lower.bmp().GetSize(); - - m_bmp_add_tick_on .msw_rescale(); - m_bmp_add_tick_off.msw_rescale(); - m_bmp_del_tick_on .msw_rescale(); - m_bmp_del_tick_off.msw_rescale(); - m_tick_icon_dim = m_bmp_add_tick_on.bmp().GetSize().x; - - m_bmp_one_layer_lock_on .msw_rescale(); - m_bmp_one_layer_lock_off .msw_rescale(); - m_bmp_one_layer_unlock_on .msw_rescale(); - m_bmp_one_layer_unlock_off.msw_rescale(); - m_lock_icon_dim = m_bmp_one_layer_lock_on.bmp().GetSize().x; - - m_bmp_revert.msw_rescale(); - m_revert_icon_dim = m_bmp_revert.bmp().GetSize().x; - m_bmp_cog.msw_rescale(); - m_cog_icon_dim = m_bmp_cog.bmp().GetSize().x; + m_thumb_size = m_bmp_thumb_lower.GetSize(); + m_tick_icon_dim = m_bmp_add_tick_on.GetWidth(); + m_lock_icon_dim = m_bmp_one_layer_lock_on.GetWidth(); + m_revert_icon_dim = m_bmp_revert.GetWidth(); + m_cog_icon_dim = m_bmp_cog.GetWidth(); SLIDER_MARGIN = 4 + GUI::wxGetApp().em_unit(); SetMinSize(get_min_size()); GetParent()->Layout(); + + m_ruler.update_dpi(); + m_ruler.update(m_layers_values.empty() ? m_values : m_layers_values, get_scroll_step()); } void Control::sys_color_changed() { GUI::wxGetApp().UpdateDarkUI(GetParent()); - m_bmp_add_tick_on .msw_rescale(); - m_bmp_add_tick_off.msw_rescale(); - m_bmp_del_tick_on .msw_rescale(); - m_bmp_del_tick_off.msw_rescale(); - m_tick_icon_dim = m_bmp_add_tick_on.GetBmpWidth(); + m_bmp_add_tick_on .sys_color_changed(); + m_bmp_add_tick_off.sys_color_changed(); + m_bmp_del_tick_on .sys_color_changed(); + m_bmp_del_tick_off.sys_color_changed(); - m_bmp_one_layer_lock_on .msw_rescale(); - m_bmp_one_layer_lock_off .msw_rescale(); - m_bmp_one_layer_unlock_on .msw_rescale(); - m_bmp_one_layer_unlock_off.msw_rescale(); - m_lock_icon_dim = m_bmp_one_layer_lock_on.GetBmpWidth(); + m_bmp_one_layer_lock_on .sys_color_changed(); + m_bmp_one_layer_lock_off .sys_color_changed(); + m_bmp_one_layer_unlock_on .sys_color_changed(); + m_bmp_one_layer_unlock_off.sys_color_changed(); - m_bmp_revert.msw_rescale(); - m_revert_icon_dim = m_bmp_revert.GetBmpWidth(); - m_bmp_cog.msw_rescale(); - m_cog_icon_dim = m_bmp_cog.GetBmpWidth(); + m_bmp_revert.sys_color_changed(); + m_bmp_cog .sys_color_changed(); } int Control::GetActiveValue() const @@ -266,7 +260,11 @@ void Control::SetMaxValue(const int max_value) void Control::SetSliderValues(const std::vector& values) { m_values = values; - m_ruler.init(m_values); + m_ruler.init(m_values, get_scroll_step()); + + // When "No sparce layer" is enabled, use m_layers_values for ruler update. + // Because of m_values has duplicate values in this case. +// m_ruler.update(this->GetParent(), m_layers_values.empty() ? m_values : m_layers_values, get_scroll_step()); } void Control::draw_scroll_line(wxDC& dc, const int lower_pos, const int higher_pos) @@ -426,9 +424,12 @@ void Control::SetLayersTimes(const std::vector& layers_times, float total if (m_layers_values.size() != m_layers_times.size()) for (size_t i = m_layers_times.size(); i < m_layers_values.size(); i++) m_layers_times.push_back(total_time); + m_ruler.update(m_layers_values.empty() ? m_values : m_layers_values, get_scroll_step()); Refresh(); Update(); } + else + m_ruler.update(m_layers_values.empty() ? m_values : m_layers_values, get_scroll_step()); } void Control::SetLayersTimes(const std::vector& layers_times) @@ -494,15 +495,17 @@ void Control::get_lower_and_higher_position(int& lower_pos, int& higher_pos) } } -void Control::draw_focus_rect() +void Control::draw_focus_rect(wxDC& dc) { if (!m_is_focused) return; const wxSize sz = GetSize(); - wxPaintDC dc(this); - const wxPen pen = wxPen(wxColour(128, 128, 10), 1, wxPENSTYLE_DOT); - dc.SetPen(pen); - dc.SetBrush(wxBrush(wxColour(0, 0, 0), wxBRUSHSTYLE_TRANSPARENT)); +// wxPaintDC dc(this); + //const wxPen pen = wxPen(wxColour(128, 128, 10), 1, wxPENSTYLE_DOT); + //dc.SetPen(pen); + //dc.SetBrush(wxBrush(wxColour(0, 0, 0), wxBRUSHSTYLE_TRANSPARENT)); + dc.SetPen(FOCUS_RECT_PEN); + dc.SetBrush(FOCUS_RECT_BRUSH); dc.DrawRectangle(1, 1, sz.x - 2, sz.y - 2); } @@ -513,11 +516,12 @@ void Control::render() #else SetBackgroundColour(GetParent()->GetBackgroundColour()); #endif // _WIN32 - draw_focus_rect(); wxPaintDC dc(this); dc.SetFont(m_font); + draw_focus_rect(dc); + const wxCoord lower_pos = get_position_from_value(m_lower_value); const wxCoord higher_pos = get_position_from_value(m_higher_value); @@ -581,9 +585,12 @@ void Control::draw_action_icon(wxDC& dc, const wxPoint pt_beg, const wxPoint pt_ return; } - wxBitmap* icon = m_focus == fiActionIcon ? &m_bmp_add_tick_off.bmp() : &m_bmp_add_tick_on.bmp(); + //wxBitmap* icon = m_focus == fiActionIcon ? &m_bmp_add_tick_off.bmp() : &m_bmp_add_tick_on.bmp(); + //if (m_ticks.ticks.find(TickCode{tick}) != m_ticks.ticks.end()) + // icon = m_focus == fiActionIcon ? &m_bmp_del_tick_off.bmp() : &m_bmp_del_tick_on.bmp(); + ScalableBitmap* icon = m_focus == fiActionIcon ? &m_bmp_add_tick_off : &m_bmp_add_tick_on; if (m_ticks.ticks.find(TickCode{tick}) != m_ticks.ticks.end()) - icon = m_focus == fiActionIcon ? &m_bmp_del_tick_off.bmp() : &m_bmp_del_tick_on.bmp(); + icon = m_focus == fiActionIcon ? &m_bmp_del_tick_off : &m_bmp_del_tick_on; wxCoord x_draw, y_draw; is_horizontal() ? x_draw = pt_beg.x - 0.5*m_tick_icon_dim : y_draw = pt_beg.y - 0.5*m_tick_icon_dim; @@ -592,10 +599,12 @@ void Control::draw_action_icon(wxDC& dc, const wxPoint pt_beg, const wxPoint pt_ else is_horizontal() ? y_draw = pt_beg.y - m_tick_icon_dim-2 : x_draw = pt_end.x + 3; - if (m_draw_mode == dmSequentialFffPrint) - dc.DrawBitmap(create_scaled_bitmap("colorchange_add", nullptr, 16, true), x_draw, y_draw); + if (m_draw_mode == dmSequentialFffPrint) { + wxBitmap disabled_add = get_bmp_bundle("colorchange_add")->GetBitmapFor(this).ConvertToDisabled(); + dc.DrawBitmap(disabled_add, x_draw, y_draw); + } else - dc.DrawBitmap(*icon, x_draw, y_draw); + dc.DrawBitmap((*icon).get_bitmap(), x_draw, y_draw); //update rect of the tick action icon m_rect_tick_action = wxRect(x_draw, y_draw, m_tick_icon_dim, m_tick_icon_dim); @@ -807,7 +816,7 @@ void Control::draw_tick_text(wxDC& dc, const wxPoint& pos, int tick, LabelType l } wxColour old_clr = dc.GetTextForeground(); - const wxPen& pen = is_wipe_tower_layer(tick) && (tick == m_lower_value || tick == m_higher_value) ? DARK_ORANGE_PEN : wxPen(old_clr); + const wxPen& pen = is_wipe_tower_layer(tick) && (tick == m_lower_value || tick == m_higher_value) ? DARK_ORANGE_PEN : /*wxPen(old_clr)*/GREY_PEN; dc.SetPen(pen); dc.SetTextForeground(pen.GetColour()); @@ -828,7 +837,7 @@ void Control::draw_thumb_item(wxDC& dc, const wxPoint& pos, const SelectedSlider { wxCoord x_draw = pos.x - int(0.5 * m_thumb_size.x); wxCoord y_draw = pos.y - int(0.5 * m_thumb_size.y); - dc.DrawBitmap(selection == ssLower ? m_bmp_thumb_lower.bmp() : m_bmp_thumb_higher.bmp(), x_draw, y_draw); + dc.DrawBitmap(selection == ssLower ? m_bmp_thumb_lower.get_bitmap() : m_bmp_thumb_higher.get_bitmap(), x_draw, y_draw); // Update thumb rect update_thumb_rect(x_draw, y_draw, selection); @@ -922,12 +931,12 @@ void Control::draw_ticks(wxDC& dc) // Draw icon for "Pause print", "Custom Gcode" or conflict tick if (!icon_name.empty()) { - wxBitmap icon = create_scaled_bitmap(icon_name); + wxBitmapBundle* icon = get_bmp_bundle(icon_name); wxCoord x_draw, y_draw; is_horizontal() ? x_draw = pos - 0.5 * m_tick_icon_dim : y_draw = pos - 0.5 * m_tick_icon_dim; is_horizontal() ? y_draw = mid + 22 : x_draw = mid + m_thumb_size.x + 3; - dc.DrawBitmap(icon, x_draw, y_draw); + dc.DrawBitmap(icon->GetBitmapFor(this), x_draw, y_draw); } } } @@ -1028,8 +1037,10 @@ void Control::draw_colored_band(wxDC& dc) } } -void Control::Ruler::init(const std::vector& values) +void Control::Ruler::init(const std::vector& values, double scroll_step) { + if (!m_parent) + return; max_values.clear(); max_values.reserve(std::count(values.begin(), values.end(), values.front())); @@ -1039,14 +1050,35 @@ void Control::Ruler::init(const std::vector& values) it = std::find(it + 1, values.end(), values.front()); } max_values.push_back(*(it - 1)); + + update(values, scroll_step); +} + +void Control::Ruler::set_parent(wxWindow* parent) +{ + m_parent = parent; + update_dpi(); +} + +void Control::Ruler::update_dpi() +{ + if (m_parent) + m_DPI = GUI::get_dpi_for_window(m_parent); } -void Control::Ruler::update(wxWindow* win, const std::vector& values, double scroll_step) +void Control::Ruler::update(const std::vector& values, double scroll_step) { - if (values.empty()) + if (!m_parent || values.empty() || + // check if need to update ruler in respect to input values + (values.front() == m_min_val && values.back() == m_max_val && m_scroll_step == scroll_step && max_values.size() == m_max_values_cnt)) return; - int DPI = GUI::get_dpi_for_window(win); - int pixels_per_sm = lround((double)(DPI) * 5.0/25.4); + + m_min_val = values.front(); + m_max_val = values.back(); + m_scroll_step = scroll_step; + m_max_values_cnt = max_values.size(); + + int pixels_per_sm = lround((double)(m_DPI) * 5.0/25.4); if (lround(scroll_step) > pixels_per_sm) { long_step = -1.0; @@ -1085,15 +1117,17 @@ void Control::Ruler::update(wxWindow* win, const std::vector& values, do } long_step = step == 0 ? -1.0 : (double)step* std::pow(10, pow); + if (long_step < 0) + short_step = long_step; } void Control::draw_ruler(wxDC& dc) { - if (m_values.empty()) + if (m_values.empty() || !m_ruler.can_draw()) return; // When "No sparce layer" is enabled, use m_layers_values for ruler update. // Because of m_values has duplicate values in this case. - m_ruler.update(this->GetParent(), m_layers_values.empty() ? m_values : m_layers_values, get_scroll_step()); +// m_ruler.update(this->GetParent(), m_layers_values.empty() ? m_values : m_layers_values, get_scroll_step()); int height, width; get_size(&width, &height); @@ -1103,44 +1137,76 @@ void Control::draw_ruler(wxDC& dc) wxColour old_clr = dc.GetTextForeground(); dc.SetTextForeground(GREY_PEN.GetColour()); - if (m_ruler.long_step < 0) - for (size_t tick = 1; tick < m_values.size(); tick++) { - wxCoord pos = get_position_from_value(tick); - draw_ticks_pair(dc, pos, mid, 5); - draw_tick_text(dc, wxPoint(mid, pos), tick); + auto draw_short_ticks = [this, mid](wxDC& dc, double& current_tick, int max_tick) { + if (m_ruler.short_step <= 0.0) + return; + while (current_tick < max_tick) { + wxCoord pos = get_position_from_value(lround(current_tick)); + draw_ticks_pair(dc, pos, mid, 2); + current_tick += m_ruler.short_step; + if (current_tick > m_max_value) + break; } - else { - auto draw_short_ticks = [this, mid](wxDC& dc, double& current_tick, int max_tick) { - while (current_tick < max_tick) { - wxCoord pos = get_position_from_value(lround(current_tick)); - draw_ticks_pair(dc, pos, mid, 2); - current_tick += m_ruler.short_step; - if (current_tick > m_max_value) - break; - } - }; - - double short_tick = std::nan(""); - int tick = 0; - double value = 0.0; - size_t sequence = 0; - - int prev_y_pos = -1; - wxCoord label_height = dc.GetMultiLineTextExtent("0").y - 2; - int values_size = (int)m_values.size(); + }; - while (tick <= m_max_value) { - value += m_ruler.long_step; - if (value > m_ruler.max_values[sequence] && sequence < m_ruler.count()) { - value = m_ruler.long_step; - for (; tick < values_size; tick++) - if (m_values[tick] < value) + double short_tick = NaNd; + int tick = 0; + double value = 0.0; + size_t sequence = 0; + int prev_y_pos = -1; + wxCoord label_height = dc.GetMultiLineTextExtent("0").y - 2; + int values_size = (int)m_values.size(); + + if (m_ruler.long_step < 0) { + // sequential print when long_step wasn't detected because of a lot of printed objects + if (m_ruler.max_values.size() > 1) { + while (tick <= m_max_value && sequence < m_ruler.count()) { + // draw just ticks with max value + value = m_ruler.max_values[sequence]; + short_tick = tick; + + for (; tick < values_size; tick++) { + if (m_values[tick] == value) break; - // short ticks from the last tick to the end of current sequence - assert(! std::isnan(short_tick)); + if (m_values[tick] > value) { + if (tick > 0) + tick--; + break; + } + } + if (tick > m_max_value) + break; + + wxCoord pos = get_position_from_value(tick); + draw_ticks_pair(dc, pos, mid, 5); + if (prev_y_pos < 0 || prev_y_pos - pos >= label_height) { + draw_tick_text(dc, wxPoint(mid, pos), tick); + prev_y_pos = pos; + } draw_short_ticks(dc, short_tick, tick); + sequence++; + tick++; + } + } + // very short object or some non-trivial ruler with non-regular step (see https://github.com/prusa3d/PrusaSlicer/issues/7263) + else { + if (get_scroll_step() < 1) // step less then 1 px indicates very tall object with non-regular laayer step (probably in vase mode) + return; + for (size_t tick = 1; tick < m_values.size(); tick++) { + wxCoord pos = get_position_from_value(tick); + draw_ticks_pair(dc, pos, mid, 5); + draw_tick_text(dc, wxPoint(mid, pos), tick); } + } + } + else { + while (tick <= m_max_value) { + value += m_ruler.long_step; + + if (sequence < m_ruler.count() && value > m_ruler.max_values[sequence]) + value = m_ruler.max_values[sequence]; + short_tick = tick; for (; tick < values_size; tick++) { @@ -1164,7 +1230,7 @@ void Control::draw_ruler(wxDC& dc) draw_short_ticks(dc, short_tick, tick); - if (value == m_ruler.max_values[sequence] && sequence < m_ruler.count()) { + if (sequence < m_ruler.count() && value == m_ruler.max_values[sequence]) { value = 0.0; sequence++; tick++; @@ -1182,9 +1248,12 @@ void Control::draw_one_layer_icon(wxDC& dc) if (m_draw_mode == dmSequentialGCodeView) return; - const wxBitmap& icon = m_is_one_layer ? - m_focus == fiOneLayerIcon ? m_bmp_one_layer_lock_off.bmp() : m_bmp_one_layer_lock_on.bmp() : - m_focus == fiOneLayerIcon ? m_bmp_one_layer_unlock_off.bmp() : m_bmp_one_layer_unlock_on.bmp(); + //const wxBitmap& icon = m_is_one_layer ? + // m_focus == fiOneLayerIcon ? m_bmp_one_layer_lock_off.bmp() : m_bmp_one_layer_lock_on.bmp() : + // m_focus == fiOneLayerIcon ? m_bmp_one_layer_unlock_off.bmp() : m_bmp_one_layer_unlock_on.bmp(); + const ScalableBitmap& icon = m_is_one_layer ? + m_focus == fiOneLayerIcon ? m_bmp_one_layer_lock_off : m_bmp_one_layer_lock_on : + m_focus == fiOneLayerIcon ? m_bmp_one_layer_unlock_off : m_bmp_one_layer_unlock_on; int width, height; get_size(&width, &height); @@ -1193,7 +1262,7 @@ void Control::draw_one_layer_icon(wxDC& dc) is_horizontal() ? x_draw = width-2 : x_draw = 0.5*width - 0.5*m_lock_icon_dim; is_horizontal() ? y_draw = 0.5*height - 0.5*m_lock_icon_dim : y_draw = height-2; - dc.DrawBitmap(icon, x_draw, y_draw); + dc.DrawBitmap(icon.bmp().GetBitmapFor(this), x_draw, y_draw); //update rect of the lock/unlock icon m_rect_one_layer_icon = wxRect(x_draw, y_draw, m_lock_icon_dim, m_lock_icon_dim); @@ -1211,7 +1280,7 @@ void Control::draw_revert_icon(wxDC& dc) is_horizontal() ? x_draw = width-2 : x_draw = 0.25*SLIDER_MARGIN; is_horizontal() ? y_draw = 0.25*SLIDER_MARGIN: y_draw = height-2; - dc.DrawBitmap(m_bmp_revert.bmp(), x_draw, y_draw); + dc.DrawBitmap(m_bmp_revert.get_bitmap(), x_draw, y_draw); //update rect of the lock/unlock icon m_rect_revert_icon = wxRect(x_draw, y_draw, m_revert_icon_dim, m_revert_icon_dim); @@ -1235,7 +1304,7 @@ void Control::draw_cog_icon(wxDC& dc) is_horizontal() ? y_draw = height - m_cog_icon_dim - 2 : y_draw = height - 2; } - dc.DrawBitmap(m_bmp_cog.bmp(), x_draw, y_draw); + dc.DrawBitmap(m_bmp_cog.get_bitmap(), x_draw, y_draw); //update rect of the lock/unlock icon m_rect_cog_icon = wxRect(x_draw, y_draw, m_cog_icon_dim, m_cog_icon_dim); @@ -1593,7 +1662,7 @@ void Control::append_change_extruder_menu_item(wxMenu* menu, bool switch_current if (extruders_cnt > 1) { std::array active_extruders = get_active_extruders_for_tick(m_selection == ssLower ? m_lower_value : m_higher_value); - std::vector icons = get_extruder_color_icons(true); + std::vector icons = get_extruder_color_icons(true); wxMenu* change_extruder_menu = new wxMenu(); @@ -1604,7 +1673,7 @@ void Control::append_change_extruder_menu_item(wxMenu* menu, bool switch_current if (m_mode == MultiAsSingle) append_menu_item(change_extruder_menu, wxID_ANY, item_name, "", - [this, i](wxCommandEvent&) { add_code_as_tick(ToolChange, i); }, *icons[i-1], menu, + [this, i](wxCommandEvent&) { add_code_as_tick(ToolChange, i); }, icons[i-1], menu, [is_active_extruder]() { return !is_active_extruder; }, GUI::wxGetApp().plater()); } @@ -1642,7 +1711,7 @@ void Control::append_add_color_change_menu_item(wxMenu* menu, bool switch_curren format_wxstr(_L("Switch code to Color change (%1%) for:"), gcode(ColorChange)) : format_wxstr(_L("Add color change (%1%) for:"), gcode(ColorChange)); wxMenuItem* add_color_change_menu_item = menu->AppendSubMenu(add_color_change_menu, menu_name, ""); - add_color_change_menu_item->SetBitmap(create_menu_bitmap("colorchange_add_m")); + add_color_change_menu_item->SetBitmap(*get_bmp_bundle("colorchange_add_m")); } } @@ -1915,7 +1984,7 @@ std::set TickCodeInfo::get_used_extruders_for_tick(int tick, int only_extru std::set used_extruders; - auto it_layer_tools = std::lower_bound(tool_ordering.begin(), tool_ordering.end(), LayerTools(print_z)); + auto it_layer_tools = std::lower_bound(tool_ordering.begin(), tool_ordering.end(), print_z, [](const LayerTools &lhs, double rhs){ return lhs.print_z < rhs; }); for (; it_layer_tools != tool_ordering.end(); ++it_layer_tools) { const std::vector& extruders = it_layer_tools->extruders; for (const auto& extruder : extruders) @@ -2054,13 +2123,13 @@ void Control::show_cog_icon_context_menu() GUI::wxGetApp().plater()->PopupMenu(&menu); } -bool check_color_change(PrintObject* object, size_t frst_layer_id, size_t layers_cnt, bool check_overhangs, std::function break_condition) +bool check_color_change(const PrintObject* object, size_t frst_layer_id, size_t layers_cnt, bool check_overhangs, std::function break_condition) { double prev_area = area(object->get_layer(frst_layer_id)->lslices); bool detected = false; for (size_t i = frst_layer_id+1; i < layers_cnt; i++) { - Layer* layer = object->get_layer(i); + const Layer* layer = object->get_layer(i); double cur_area = area(layer->lslices); // check for overhangs @@ -2100,7 +2169,7 @@ void Control::auto_color_change() if (object->layer_count() < 2) continue; - check_color_change(object, 1, object->layers().size(), false, [this, extruders_cnt](Layer* layer) + check_color_change(object, 1, object->layers().size(), false, [this, extruders_cnt](const Layer* layer) { int tick = get_tick_from_value(layer->print_z); if (tick >= 0 && !m_ticks.has_tick(tick)) { @@ -2558,36 +2627,46 @@ bool Control::check_ticks_changed_event(Type type) std::string TickCodeInfo::get_color_for_tick(TickCode tick, Type type, const int extruder) { + auto opposite_one_color = [](const std::string& color) { + ColorRGB rgb; + decode_color(color, rgb); + return encode_color(opposite(rgb)); + }; + auto opposite_two_colors = [](const std::string& a, const std::string& b) { + ColorRGB rgb1; decode_color(a, rgb1); + ColorRGB rgb2; decode_color(b, rgb2); + return encode_color(opposite(rgb1, rgb2)); + }; + if (mode == SingleExtruder && type == ColorChange && m_use_default_colors) { #if 1 if (ticks.empty()) - return color_generator.get_opposite_color((*m_colors)[0]); - + return opposite_one_color((*m_colors)[0]); + auto before_tick_it = std::lower_bound(ticks.begin(), ticks.end(), tick); - if (before_tick_it == ticks.end()) - { + if (before_tick_it == ticks.end()) { while (before_tick_it != ticks.begin()) if (--before_tick_it; before_tick_it->type == ColorChange) break; if (before_tick_it->type == ColorChange) - return color_generator.get_opposite_color(before_tick_it->color); - return color_generator.get_opposite_color((*m_colors)[0]); + return opposite_one_color(before_tick_it->color); + + return opposite_one_color((*m_colors)[0]); } - if (before_tick_it == ticks.begin()) - { + if (before_tick_it == ticks.begin()) { const std::string& frst_color = (*m_colors)[0]; if (before_tick_it->type == ColorChange) - return color_generator.get_opposite_color(frst_color, before_tick_it->color); + return opposite_two_colors(frst_color, before_tick_it->color); auto next_tick_it = before_tick_it; while (next_tick_it != ticks.end()) if (++next_tick_it; next_tick_it->type == ColorChange) break; if (next_tick_it->type == ColorChange) - return color_generator.get_opposite_color(frst_color, next_tick_it->color); + return opposite_two_colors(frst_color, next_tick_it->color); - return color_generator.get_opposite_color(frst_color); + return opposite_one_color(frst_color); } std::string frst_color = ""; @@ -2608,13 +2687,15 @@ std::string TickCodeInfo::get_color_for_tick(TickCode tick, Type type, const int if (before_tick_it->type == ColorChange) { if (frst_color.empty()) - return color_generator.get_opposite_color(before_tick_it->color); - return color_generator.get_opposite_color(before_tick_it->color, frst_color); + return opposite_one_color(before_tick_it->color); + + return opposite_two_colors(before_tick_it->color, frst_color); } if (frst_color.empty()) - return color_generator.get_opposite_color((*m_colors)[0]); - return color_generator.get_opposite_color((*m_colors)[0], frst_color); + return opposite_one_color((*m_colors)[0]); + + return opposite_two_colors((*m_colors)[0], frst_color); #else const std::vector& colors = ColorPrintColors::get(); if (ticks.empty()) diff --git a/src/slic3r/GUI/DoubleSlider.hpp b/src/slic3r/GUI/DoubleSlider.hpp index 23275cf2ad0..3a862c28681 100644 --- a/src/slic3r/GUI/DoubleSlider.hpp +++ b/src/slic3r/GUI/DoubleSlider.hpp @@ -3,7 +3,6 @@ #include "libslic3r/CustomGCode.hpp" #include "wxExtensions.hpp" -#include "DoubleSlider_Utils.hpp" #include #include @@ -32,10 +31,10 @@ constexpr double epsilon() { return 0.0011; } bool equivalent_areas(const double& bottom_area, const double& top_area); // return true if color change was detected -bool check_color_change(PrintObject* object, size_t frst_layer_id, size_t layers_cnt, bool check_overhangs, +bool check_color_change(const PrintObject* object, size_t frst_layer_id, size_t layers_cnt, bool check_overhangs, // what to do with detected color change // and return true when detection have to be desturbed - std::function break_condition); + std::function break_condition); // custom message the slider sends to its parent to notify a tick-change: wxDECLARE_EVENT(wxCUSTOMEVT_TICKSCHANGED, wxEvent); @@ -119,7 +118,6 @@ class TickCodeInfo // int m_default_color_idx = 0; std::vector* m_colors {nullptr}; - ColorGenerator color_generator; std::string get_color_for_tick(TickCode tick, Type type, const int extruder); @@ -305,7 +303,7 @@ class Control : public wxControl protected: void render(); - void draw_focus_rect(); + void draw_focus_rect(wxDC& dc); void draw_action_icon(wxDC& dc, const wxPoint pt_beg, const wxPoint pt_end); void draw_scroll_line(wxDC& dc, const int lower_pos, const int higher_pos); void draw_thumb(wxDC& dc, const wxCoord& pos_coord, const SelectedSlider& selection); @@ -440,19 +438,36 @@ class Control : public wxControl wxPen GREY_PEN; wxPen LIGHT_GREY_PEN; + wxPen FOCUS_RECT_PEN; + wxBrush FOCUS_RECT_BRUSH; + std::vector m_line_pens; std::vector m_segm_pens; - struct Ruler { + class Ruler { + wxWindow* m_parent{nullptr}; // m_parent is nullptr for Unused ruler + // in this case we will not init/update/render it + // values to check if ruler has to be updated + double m_min_val; + double m_max_val; + double m_scroll_step; + size_t m_max_values_cnt; + int m_DPI; + + public: + double long_step; double short_step; std::vector max_values;// max value for each object/instance in sequence print // > 1 for sequential print - void init(const std::vector& values); - void update(wxWindow* win, const std::vector& values, double scroll_step); + void set_parent(wxWindow* parent); + void update_dpi(); + void init(const std::vector& values, double scroll_step); + void update(const std::vector& values, double scroll_step); bool is_ok() { return long_step > 0 && short_step > 0; } size_t count() { return max_values.size(); } + bool can_draw() { return m_parent != nullptr; } } m_ruler; }; diff --git a/src/slic3r/GUI/DoubleSlider_Utils.hpp b/src/slic3r/GUI/DoubleSlider_Utils.hpp deleted file mode 100644 index b5955f2fc4d..00000000000 --- a/src/slic3r/GUI/DoubleSlider_Utils.hpp +++ /dev/null @@ -1,191 +0,0 @@ -#include -#include - -#include "wx/colour.h" - -class ColorGenerator -{ - // Some of next code is borrowed from https://stackoverflow.com/questions/3018313/algorithm-to-convert-rgb-to-hsv-and-hsv-to-rgb-in-range-0-255-for-both - typedef struct { - double r; // a fraction between 0 and 1 - double g; // a fraction between 0 and 1 - double b; // a fraction between 0 and 1 - } rgb; - - typedef struct { - double h; // angle in degrees - double s; // a fraction between 0 and 1 - double v; // a fraction between 0 and 1 - } hsv; - - //static hsv rgb2hsv(rgb in); - //static rgb hsv2rgb(hsv in); - - hsv rgb2hsv(rgb in) - { - hsv out; - double min, max, delta; - - min = in.r < in.g ? in.r : in.g; - min = min < in.b ? min : in.b; - - max = in.r > in.g ? in.r : in.g; - max = max > in.b ? max : in.b; - - out.v = max; // v - delta = max - min; - if (delta < 0.00001) - { - out.s = 0; - out.h = 0; // undefined, maybe nan? - return out; - } - if (max > 0.0) { // NOTE: if Max is == 0, this divide would cause a crash - out.s = (delta / max); // s - } - else { - // if max is 0, then r = g = b = 0 - // s = 0, h is undefined - out.s = 0.0; - out.h = NAN; // its now undefined - return out; - } - if (in.r >= max) // > is bogus, just keeps compilor happy - out.h = (in.g - in.b) / delta; // between yellow & magenta - else - if (in.g >= max) - out.h = 2.0 + (in.b - in.r) / delta; // between cyan & yellow - else - out.h = 4.0 + (in.r - in.g) / delta; // between magenta & cyan - - out.h *= 60.0; // degrees - - if (out.h < 0.0) - out.h += 360.0; - - return out; - } - - hsv rgb2hsv(const std::string& str_clr_in) - { - wxColour clr(str_clr_in); - rgb in = { clr.Red() / 255.0, clr.Green() / 255.0, clr.Blue() / 255.0 }; - return rgb2hsv(in); - } - - - rgb hsv2rgb(hsv in) - { - double hh, p, q, t, ff; - long i; - rgb out; - - if (in.s <= 0.0) { // < is bogus, just shuts up warnings - out.r = in.v; - out.g = in.v; - out.b = in.v; - return out; - } - hh = in.h; - if (hh >= 360.0) hh -= 360.0;//hh = 0.0; - hh /= 60.0; - i = (long)hh; - ff = hh - i; - p = in.v * (1.0 - in.s); - q = in.v * (1.0 - (in.s * ff)); - t = in.v * (1.0 - (in.s * (1.0 - ff))); - - switch (i) { - case 0: - out.r = in.v; - out.g = t; - out.b = p; - break; - case 1: - out.r = q; - out.g = in.v; - out.b = p; - break; - case 2: - out.r = p; - out.g = in.v; - out.b = t; - break; - - case 3: - out.r = p; - out.g = q; - out.b = in.v; - break; - case 4: - out.r = t; - out.g = p; - out.b = in.v; - break; - case 5: - default: - out.r = in.v; - out.g = p; - out.b = q; - break; - } - return out; - } - - std::random_device rd; - -public: - - ColorGenerator() {} - ~ColorGenerator() {} - - double rand_val() - { - std::mt19937 rand_generator(rd()); - - // this value will be used for Saturation and Value - // to avoid extremely light/dark colors, take this value from range [0.65; 1.0] - std::uniform_real_distribution distrib(0.65, 1.0); - return distrib(rand_generator); - } - - - std::string get_opposite_color(const std::string& color) - { - std::string opp_color = ""; - - hsv hsv_clr = rgb2hsv(color); - hsv_clr.h += 65; // 65 instead 60 to avoid circle values - hsv_clr.s = rand_val(); - hsv_clr.v = rand_val(); - - rgb rgb_opp_color = hsv2rgb(hsv_clr); - - wxString clr_str = wxString::Format(wxT("#%02X%02X%02X"), (unsigned char)(rgb_opp_color.r * 255), (unsigned char)(rgb_opp_color.g * 255), (unsigned char)(rgb_opp_color.b * 255)); - opp_color = clr_str.ToStdString(); - - return opp_color; - } - - std::string get_opposite_color(const std::string& color_frst, const std::string& color_scnd) - { - std::string opp_color = ""; - - hsv hsv_frst = rgb2hsv(color_frst); - hsv hsv_scnd = rgb2hsv(color_scnd); - - double delta_h = fabs(hsv_frst.h - hsv_scnd.h); - double start_h = delta_h > 180 ? std::min(hsv_scnd.h, hsv_frst.h) : std::max(hsv_scnd.h, hsv_frst.h); - start_h += 5; // to avoid circle change of colors for 120 deg - if (delta_h < 180) - delta_h = 360 - delta_h; - - hsv hsv_opp = hsv{ start_h + 0.5 * delta_h, rand_val(), rand_val() }; - rgb rgb_opp_color = hsv2rgb(hsv_opp); - - wxString clr_str = wxString::Format(wxT("#%02X%02X%02X"), (unsigned char)(rgb_opp_color.r * 255), (unsigned char)(rgb_opp_color.g * 255), (unsigned char)(rgb_opp_color.b * 255)); - opp_color = clr_str.ToStdString(); - - return opp_color; - } -}; \ No newline at end of file diff --git a/src/slic3r/GUI/Downloader.cpp b/src/slic3r/GUI/Downloader.cpp new file mode 100644 index 00000000000..ebf275b8f96 --- /dev/null +++ b/src/slic3r/GUI/Downloader.cpp @@ -0,0 +1,247 @@ +#include "Downloader.hpp" +#include "GUI_App.hpp" +#include "NotificationManager.hpp" +#include "format.hpp" + +#include +#include + +namespace Slic3r { +namespace GUI { + +namespace { +void open_folder(const std::string& path) +{ + // Code taken from NotificationManager.cpp + + // Execute command to open a file explorer, platform dependent. + // FIXME: The const_casts aren't needed in wxWidgets 3.1, remove them when we upgrade. + +#ifdef _WIN32 + const wxString widepath = from_u8(path); + const wchar_t* argv[] = { L"explorer", widepath.GetData(), nullptr }; + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr); +#elif __APPLE__ + const char* argv[] = { "open", path.data(), nullptr }; + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr); +#else + const char* argv[] = { "xdg-open", path.data(), nullptr }; + + // Check if we're running in an AppImage container, if so, we need to remove AppImage's env vars, + // because they may mess up the environment expected by the file manager. + // Mostly this is about LD_LIBRARY_PATH, but we remove a few more too for good measure. + if (wxGetEnv("APPIMAGE", nullptr)) { + // We're running from AppImage + wxEnvVariableHashMap env_vars; + wxGetEnvMap(&env_vars); + + env_vars.erase("APPIMAGE"); + env_vars.erase("APPDIR"); + env_vars.erase("LD_LIBRARY_PATH"); + env_vars.erase("LD_PRELOAD"); + env_vars.erase("UNION_PRELOAD"); + + wxExecuteEnv exec_env; + exec_env.env = std::move(env_vars); + + wxString owd; + if (wxGetEnv("OWD", &owd)) { + // This is the original work directory from which the AppImage image was run, + // set it as CWD for the child process: + exec_env.cwd = std::move(owd); + } + + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr, &exec_env); + } + else { + // Looks like we're NOT running from AppImage, we'll make no changes to the environment. + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr, nullptr); + } +#endif +} + +std::string filename_from_url(const std::string& url) +{ + // TODO: can it be done with curl? + size_t slash = url.find_last_of("/"); + if (slash == std::string::npos && slash != url.size() - 1) + return std::string(); + return url.substr(slash + 1, url.size() - slash + 1); +} +} + +Download::Download(int ID, std::string url, wxEvtHandler* evt_handler, const boost::filesystem::path& dest_folder) + : m_id(ID) + , m_filename(filename_from_url(url)) + , m_dest_folder(dest_folder) +{ + assert(boost::filesystem::is_directory(dest_folder)); + m_final_path = dest_folder / m_filename; + m_file_get = std::make_shared(ID, std::move(url), m_filename, evt_handler, dest_folder); +} + +void Download::start() +{ + m_state = DownloadState::DownloadOngoing; + m_file_get->get(); +} +void Download::cancel() +{ + m_state = DownloadState::DownloadStopped; + m_file_get->cancel(); +} +void Download::pause() +{ + //assert(m_state == DownloadState::DownloadOngoing); + // if instead of assert - it can happen that user clicks on pause several times before the pause happens + if (m_state != DownloadState::DownloadOngoing) + return; + m_state = DownloadState::DownloadPaused; + m_file_get->pause(); +} +void Download::resume() +{ + //assert(m_state == DownloadState::DownloadPaused); + if (m_state != DownloadState::DownloadPaused) + return; + m_state = DownloadState::DownloadOngoing; + m_file_get->resume(); +} + + +Downloader::Downloader() + : wxEvtHandler() +{ + //Bind(EVT_DWNLDR_FILE_COMPLETE, [](const wxCommandEvent& evt) {}); + //Bind(EVT_DWNLDR_FILE_PROGRESS, [](const wxCommandEvent& evt) {}); + //Bind(EVT_DWNLDR_FILE_ERROR, [](const wxCommandEvent& evt) {}); + //Bind(EVT_DWNLDR_FILE_NAME_CHANGE, [](const wxCommandEvent& evt) {}); + + Bind(EVT_DWNLDR_FILE_COMPLETE, &Downloader::on_complete, this); + Bind(EVT_DWNLDR_FILE_PROGRESS, &Downloader::on_progress, this); + Bind(EVT_DWNLDR_FILE_ERROR, &Downloader::on_error, this); + Bind(EVT_DWNLDR_FILE_NAME_CHANGE, &Downloader::on_name_change, this); + Bind(EVT_DWNLDR_FILE_PAUSED, &Downloader::on_paused, this); + Bind(EVT_DWNLDR_FILE_CANCELED, &Downloader::on_canceled, this); +} + +void Downloader::start_download(const std::string& full_url) +{ + assert(m_initialized); + + // TODO: There is a misterious slash appearing in recieved msg on windows +#ifdef _WIN32 + if (!boost::starts_with(full_url, "prusaslicer://open/?file=")) { +#else + if (!boost::starts_with(full_url, "prusaslicer://open?file=")) { +#endif + BOOST_LOG_TRIVIAL(error) << "Could not start download due to wrong URL: " << full_url; + // TODO: show error? + return; + } + size_t id = get_next_id(); + // TODO: still same mistery +#ifdef _WIN32 + std::string escaped_url = FileGet::escape_url(full_url.substr(25)); +#else + std::string escaped_url = FileGet::escape_url(full_url.substr(24)); +#endif + if (!boost::starts_with(escaped_url, "https://") || !FileGet::is_subdomain(escaped_url, "printables.com")) { + std::string msg = format(_L("Download won't start. Download URL doesn't point to https://printables.com : %1%"), escaped_url); + BOOST_LOG_TRIVIAL(error) << msg; + NotificationManager* ntf_mngr = wxGetApp().notification_manager(); + ntf_mngr->push_notification(NotificationType::CustomNotification, NotificationManager::NotificationLevel::RegularNotificationLevel, msg); + return; + } + + std::string text(escaped_url); + m_downloads.emplace_back(std::make_unique(id, std::move(escaped_url), this, m_dest_folder)); + NotificationManager* ntf_mngr = wxGetApp().notification_manager(); + ntf_mngr->push_download_URL_progress_notification(id, m_downloads.back()->get_filename(), std::bind(&Downloader::user_action_callback, this, std::placeholders::_1, std::placeholders::_2)); + m_downloads.back()->start(); + BOOST_LOG_TRIVIAL(debug) << "started download"; +} + +void Downloader::on_progress(wxCommandEvent& event) +{ + size_t id = event.GetInt(); + float percent = (float)std::stoi(boost::nowide::narrow(event.GetString())) / 100.f; + //BOOST_LOG_TRIVIAL(error) << "progress " << id << ": " << percent; + NotificationManager* ntf_mngr = wxGetApp().notification_manager(); + BOOST_LOG_TRIVIAL(trace) << "Download "<< id << ": " << percent; + ntf_mngr->set_download_URL_progress(id, percent); +} +void Downloader::on_error(wxCommandEvent& event) +{ + size_t id = event.GetInt(); + set_download_state(event.GetInt(), DownloadState::DownloadError); + BOOST_LOG_TRIVIAL(error) << "Download error: " << event.GetString(); + NotificationManager* ntf_mngr = wxGetApp().notification_manager(); + ntf_mngr->set_download_URL_error(id, boost::nowide::narrow(event.GetString())); + show_error(nullptr, format_wxstr(L"%1%\n%2%", _L("The download has failed") + ":", event.GetString())); +} +void Downloader::on_complete(wxCommandEvent& event) +{ + // TODO: is this always true? : + // here we open the file itself, notification should get 1.f progress from on progress. + set_download_state(event.GetInt(), DownloadState::DownloadDone); + wxArrayString paths; + paths.Add(event.GetString()); + wxGetApp().plater()->load_files(paths); +} +bool Downloader::user_action_callback(DownloaderUserAction action, int id) +{ + for (size_t i = 0; i < m_downloads.size(); ++i) { + if (m_downloads[i]->get_id() == id) { + switch (action) { + case DownloadUserCanceled: + m_downloads[i]->cancel(); + return true; + case DownloadUserPaused: + m_downloads[i]->pause(); + return true; + case DownloadUserContinued: + m_downloads[i]->resume(); + return true; + case DownloadUserOpenedFolder: + open_folder(m_downloads[i]->get_dest_folder()); + return true; + default: + return false; + } + } + } + return false; +} + +void Downloader::on_name_change(wxCommandEvent& event) +{ + +} + +void Downloader::on_paused(wxCommandEvent& event) +{ + size_t id = event.GetInt(); + NotificationManager* ntf_mngr = wxGetApp().notification_manager(); + ntf_mngr->set_download_URL_paused(id); +} + +void Downloader::on_canceled(wxCommandEvent& event) +{ + size_t id = event.GetInt(); + NotificationManager* ntf_mngr = wxGetApp().notification_manager(); + ntf_mngr->set_download_URL_canceled(id); +} + +void Downloader::set_download_state(int id, DownloadState state) +{ + for (size_t i = 0; i < m_downloads.size(); ++i) { + if (m_downloads[i]->get_id() == id) { + m_downloads[i]->set_state(state); + return; + } + } +} + +} +} \ No newline at end of file diff --git a/src/slic3r/GUI/Downloader.hpp b/src/slic3r/GUI/Downloader.hpp new file mode 100644 index 00000000000..84a9a956974 --- /dev/null +++ b/src/slic3r/GUI/Downloader.hpp @@ -0,0 +1,99 @@ +#ifndef slic3r_Downloader_hpp_ +#define slic3r_Downloader_hpp_ + +#include "DownloaderFileGet.hpp" +#include +#include + +namespace Slic3r { +namespace GUI { + +class NotificationManager; + +enum DownloadState +{ + DownloadPending = 0, + DownloadOngoing, + DownloadStopped, + DownloadDone, + DownloadError, + DownloadPaused, + DownloadStateUnknown +}; + +enum DownloaderUserAction +{ + DownloadUserCanceled, + DownloadUserPaused, + DownloadUserContinued, + DownloadUserOpenedFolder +}; + +class Download { +public: + Download(int ID, std::string url, wxEvtHandler* evt_handler, const boost::filesystem::path& dest_folder); + void start(); + void cancel(); + void pause(); + void resume(); + + int get_id() const { return m_id; } + boost::filesystem::path get_final_path() const { return m_final_path; } + std::string get_filename() const { return m_filename; } + DownloadState get_state() const { return m_state; } + void set_state(DownloadState state) { m_state = state; } + std::string get_dest_folder() { return m_dest_folder.string(); } +private: + const int m_id; + std::string m_filename; + boost::filesystem::path m_final_path; + boost::filesystem::path m_dest_folder; + std::shared_ptr m_file_get; + DownloadState m_state { DownloadState::DownloadPending }; +}; + +class Downloader : public wxEvtHandler { +public: + Downloader(); + + bool get_initialized() { return m_initialized; } + void init(const boost::filesystem::path& dest_folder) + { + m_dest_folder = dest_folder; + m_initialized = true; + } + void start_download(const std::string& full_url); + // cancel = false -> just pause + bool user_action_callback(DownloaderUserAction action, int id); +private: + bool m_initialized { false }; + + std::vector> m_downloads; + boost::filesystem::path m_dest_folder; + + size_t m_next_id { 0 }; + size_t get_next_id() { return ++m_next_id; } + + void on_progress(wxCommandEvent& event); + void on_error(wxCommandEvent& event); + void on_complete(wxCommandEvent& event); + void on_name_change(wxCommandEvent& event); + void on_paused(wxCommandEvent& event); + void on_canceled(wxCommandEvent& event); + + void set_download_state(int id, DownloadState state); + /* + bool is_in_state(int id, DownloadState state) const; + DownloadState get_download_state(int id) const; + bool cancel_download(int id); + bool pause_download(int id); + bool resume_download(int id); + bool delete_download(int id); + wxString get_path_of(int id) const; + wxString get_folder_path_of(int id) const; + */ +}; + +} +} +#endif \ No newline at end of file diff --git a/src/slic3r/GUI/DownloaderFileGet.cpp b/src/slic3r/GUI/DownloaderFileGet.cpp new file mode 100644 index 00000000000..ee645525928 --- /dev/null +++ b/src/slic3r/GUI/DownloaderFileGet.cpp @@ -0,0 +1,391 @@ +#include "DownloaderFileGet.hpp" + +#include +#include +#include +#include +#include +#include +#include + +#include "format.hpp" +#include "GUI.hpp" +#include "I18N.hpp" + +namespace Slic3r { +namespace GUI { + +const size_t DOWNLOAD_MAX_CHUNK_SIZE = 10 * 1024 * 1024; +const size_t DOWNLOAD_SIZE_LIMIT = 1024 * 1024 * 1024; + +std::string FileGet::escape_url(const std::string& unescaped) +{ + std::string ret_val; + CURL* curl = curl_easy_init(); + if (curl) { + int decodelen; + char* decoded = curl_easy_unescape(curl, unescaped.c_str(), unescaped.size(), &decodelen); + if (decoded) { + ret_val = std::string(decoded); + curl_free(decoded); + } + curl_easy_cleanup(curl); + } + return ret_val; +} +bool FileGet::is_subdomain(const std::string& url, const std::string& domain) +{ + // domain should be f.e. printables.com (.com including) + char* host; + std::string host_string; + CURLUcode rc; + CURLU* curl = curl_url(); + if (!curl) { + BOOST_LOG_TRIVIAL(error) << "Failed to init Curl library in function is_domain."; + return false; + } + rc = curl_url_set(curl, CURLUPART_URL, url.c_str(), 0); + if (rc != CURLUE_OK) { + curl_url_cleanup(curl); + return false; + } + rc = curl_url_get(curl, CURLUPART_HOST, &host, 0); + if (rc != CURLUE_OK || !host) { + curl_url_cleanup(curl); + return false; + } + host_string = std::string(host); + curl_free(host); + // now host should be subdomain.domain or just domain + if (domain == host_string) { + curl_url_cleanup(curl); + return true; + } + if(boost::ends_with(host_string, "." + domain)) { + curl_url_cleanup(curl); + return true; + } + curl_url_cleanup(curl); + return false; +} + +namespace { +unsigned get_current_pid() +{ +#ifdef WIN32 + return GetCurrentProcessId(); +#else + return ::getpid(); +#endif +} +} + +// int = DOWNLOAD ID; string = file path +wxDEFINE_EVENT(EVT_DWNLDR_FILE_COMPLETE, wxCommandEvent); +// int = DOWNLOAD ID; string = error msg +wxDEFINE_EVENT(EVT_DWNLDR_FILE_ERROR, wxCommandEvent); +// int = DOWNLOAD ID; string = progress percent +wxDEFINE_EVENT(EVT_DWNLDR_FILE_PROGRESS, wxCommandEvent); +// int = DOWNLOAD ID; string = name +wxDEFINE_EVENT(EVT_DWNLDR_FILE_NAME_CHANGE, wxCommandEvent); +// int = DOWNLOAD ID; +wxDEFINE_EVENT(EVT_DWNLDR_FILE_PAUSED, wxCommandEvent); +// int = DOWNLOAD ID; +wxDEFINE_EVENT(EVT_DWNLDR_FILE_CANCELED, wxCommandEvent); + +struct FileGet::priv +{ + const int m_id; + std::string m_url; + std::string m_filename; + std::thread m_io_thread; + wxEvtHandler* m_evt_handler; + boost::filesystem::path m_dest_folder; + boost::filesystem::path m_tmp_path; // path when ongoing download + std::atomic_bool m_cancel { false }; + std::atomic_bool m_pause { false }; + std::atomic_bool m_stopped { false }; // either canceled or paused - download is not running + size_t m_written { 0 }; + size_t m_absolute_size { 0 }; + priv(int ID, std::string&& url, const std::string& filename, wxEvtHandler* evt_handler, const boost::filesystem::path& dest_folder); + + void get_perform(); +}; + +FileGet::priv::priv(int ID, std::string&& url, const std::string& filename, wxEvtHandler* evt_handler, const boost::filesystem::path& dest_folder) + : m_id(ID) + , m_url(std::move(url)) + , m_filename(filename) + , m_evt_handler(evt_handler) + , m_dest_folder(dest_folder) +{ +} + +void FileGet::priv::get_perform() +{ + assert(m_evt_handler); + assert(!m_url.empty()); + assert(!m_filename.empty()); + assert(boost::filesystem::is_directory(m_dest_folder)); + + m_stopped = false; + + // open dest file + if (m_written == 0) + { + boost::filesystem::path dest_path = m_dest_folder / m_filename; + std::string extension = boost::filesystem::extension(dest_path); + std::string just_filename = m_filename.substr(0, m_filename.size() - extension.size()); + std::string final_filename = just_filename; + // Find unsed filename + try { + size_t version = 0; + while (boost::filesystem::exists(m_dest_folder / (final_filename + extension)) || boost::filesystem::exists(m_dest_folder / (final_filename + extension + "." + std::to_string(get_current_pid()) + ".download"))) + { + ++version; + if (version > 999) { + wxCommandEvent* evt = new wxCommandEvent(EVT_DWNLDR_FILE_ERROR); + evt->SetString(GUI::format_wxstr(L"Failed to find suitable filename. Last name: %1%." , (m_dest_folder / (final_filename + extension)).string())); + evt->SetInt(m_id); + m_evt_handler->QueueEvent(evt); + return; + } + final_filename = GUI::format("%1%(%2%)", just_filename, std::to_string(version)); + } + } catch (const boost::filesystem::filesystem_error& e) + { + wxCommandEvent* evt = new wxCommandEvent(EVT_DWNLDR_FILE_ERROR); + evt->SetString(e.what()); + evt->SetInt(m_id); + m_evt_handler->QueueEvent(evt); + return; + } + + m_filename = final_filename + extension; + + m_tmp_path = m_dest_folder / (m_filename + "." + std::to_string(get_current_pid()) + ".download"); + + wxCommandEvent* evt = new wxCommandEvent(EVT_DWNLDR_FILE_NAME_CHANGE); + evt->SetString(boost::nowide::widen(m_filename)); + evt->SetInt(m_id); + m_evt_handler->QueueEvent(evt); + } + + boost::filesystem::path dest_path = m_dest_folder / m_filename; + + wxString temp_path_wstring(m_tmp_path.wstring()); + + //std::cout << "dest_path: " << dest_path.string() << std::endl; + //std::cout << "m_tmp_path: " << m_tmp_path.string() << std::endl; + + BOOST_LOG_TRIVIAL(info) << GUI::format("Starting download from %1% to %2%. Temp path is %3%",m_url, dest_path, m_tmp_path); + + FILE* file; + // open file for writting + if (m_written == 0) + file = fopen(temp_path_wstring.c_str(), "wb"); + else + file = fopen(temp_path_wstring.c_str(), "ab"); + + //assert(file != NULL); + if (file == NULL) { + wxCommandEvent* evt = new wxCommandEvent(EVT_DWNLDR_FILE_ERROR); + // TRN %1% = file path + evt->SetString(GUI::format_wxstr(_L("Can't create file at %1%."), temp_path_wstring)); + evt->SetInt(m_id); + m_evt_handler->QueueEvent(evt); + return; + } + + std:: string range_string = std::to_string(m_written) + "-"; + + size_t written_previously = m_written; + size_t written_this_session = 0; + Http::get(m_url) + .size_limit(DOWNLOAD_SIZE_LIMIT) //more? + .set_range(range_string) + .on_progress([&](Http::Progress progress, bool& cancel) { + // to prevent multiple calls into following ifs (m_cancel / m_pause) + if (m_stopped){ + cancel = true; + return; + } + if (m_cancel) { + m_stopped = true; + fclose(file); + // remove canceled file + std::remove(m_tmp_path.string().c_str()); + m_written = 0; + cancel = true; + wxCommandEvent* evt = new wxCommandEvent(EVT_DWNLDR_FILE_CANCELED); + evt->SetInt(m_id); + m_evt_handler->QueueEvent(evt); + return; + // TODO: send canceled event? + } + if (m_pause) { + m_stopped = true; + fclose(file); + cancel = true; + if (m_written == 0) + std::remove(m_tmp_path.string().c_str()); + wxCommandEvent* evt = new wxCommandEvent(EVT_DWNLDR_FILE_PAUSED); + evt->SetInt(m_id); + m_evt_handler->QueueEvent(evt); + return; + } + + if (m_absolute_size < progress.dltotal) { + m_absolute_size = progress.dltotal; + } + + if (progress.dlnow != 0) { + if (progress.dlnow - written_this_session > DOWNLOAD_MAX_CHUNK_SIZE || progress.dlnow == progress.dltotal) { + try + { + std::string part_for_write = progress.buffer.substr(written_this_session, progress.dlnow); + fwrite(part_for_write.c_str(), 1, part_for_write.size(), file); + } + catch (const std::exception& e) + { + // fclose(file); do it? + wxCommandEvent* evt = new wxCommandEvent(EVT_DWNLDR_FILE_ERROR); + evt->SetString(e.what()); + evt->SetInt(m_id); + m_evt_handler->QueueEvent(evt); + cancel = true; + return; + } + written_this_session = progress.dlnow; + m_written = written_previously + written_this_session; + } + wxCommandEvent* evt = new wxCommandEvent(EVT_DWNLDR_FILE_PROGRESS); + int percent_total = (written_previously + progress.dlnow) * 100 / m_absolute_size; + evt->SetString(std::to_string(percent_total)); + evt->SetInt(m_id); + m_evt_handler->QueueEvent(evt); + } + + }) + .on_error([&](std::string body, std::string error, unsigned http_status) { + if (file != NULL) + fclose(file); + wxCommandEvent* evt = new wxCommandEvent(EVT_DWNLDR_FILE_ERROR); + if (!error.empty()) + evt->SetString(GUI::from_u8(error)); + else + evt->SetString(GUI::from_u8(body)); + evt->SetInt(m_id); + m_evt_handler->QueueEvent(evt); + }) + .on_complete([&](std::string body, unsigned /* http_status */) { + + // TODO: perform a body size check + // + //size_t body_size = body.size(); + //if (body_size != expected_size) { + // return; + //} + try + { + /* + if (m_written < body.size()) + { + // this code should never be entered. As there should be on_progress call after last bit downloaded. + std::string part_for_write = body.substr(m_written); + fwrite(part_for_write.c_str(), 1, part_for_write.size(), file); + } + */ + fclose(file); + boost::filesystem::rename(m_tmp_path, dest_path); + } + catch (const std::exception& /*e*/) + { + //TODO: report? + //error_message = GUI::format("Failed to write and move %1% to %2%", tmp_path, dest_path); + wxCommandEvent* evt = new wxCommandEvent(EVT_DWNLDR_FILE_ERROR); + evt->SetString("Failed to write and move."); + evt->SetInt(m_id); + m_evt_handler->QueueEvent(evt); + return; + } + + wxCommandEvent* evt = new wxCommandEvent(EVT_DWNLDR_FILE_COMPLETE); + evt->SetString(dest_path.wstring()); + evt->SetInt(m_id); + m_evt_handler->QueueEvent(evt); + }) + .perform_sync(); + +} + +FileGet::FileGet(int ID, std::string url, const std::string& filename, wxEvtHandler* evt_handler, const boost::filesystem::path& dest_folder) + : p(new priv(ID, std::move(url), filename, evt_handler, dest_folder)) +{} + +FileGet::FileGet(FileGet&& other) : p(std::move(other.p)) {} + +FileGet::~FileGet() +{ + if (p && p->m_io_thread.joinable()) { + p->m_cancel = true; + p->m_io_thread.join(); + } +} + +void FileGet::get() +{ + assert(p); + if (p->m_io_thread.joinable()) { + // This will stop transfers being done by the thread, if any. + // Cancelling takes some time, but should complete soon enough. + p->m_cancel = true; + p->m_io_thread.join(); + } + p->m_cancel = false; + p->m_pause = false; + p->m_io_thread = std::thread([this]() { + p->get_perform(); + }); +} + +void FileGet::cancel() +{ + if(p && p->m_stopped) { + if (p->m_io_thread.joinable()) { + p->m_cancel = true; + p->m_io_thread.join(); + wxCommandEvent* evt = new wxCommandEvent(EVT_DWNLDR_FILE_CANCELED); + evt->SetInt(p->m_id); + p->m_evt_handler->QueueEvent(evt); + } + } + + if (p) + p->m_cancel = true; + +} + +void FileGet::pause() +{ + if (p) { + p->m_pause = true; + } +} +void FileGet::resume() +{ + assert(p); + if (p->m_io_thread.joinable()) { + // This will stop transfers being done by the thread, if any. + // Cancelling takes some time, but should complete soon enough. + p->m_cancel = true; + p->m_io_thread.join(); + } + p->m_cancel = false; + p->m_pause = false; + p->m_io_thread = std::thread([this]() { + p->get_perform(); + }); +} +} +} diff --git a/src/slic3r/GUI/DownloaderFileGet.hpp b/src/slic3r/GUI/DownloaderFileGet.hpp new file mode 100644 index 00000000000..022d4c0c104 --- /dev/null +++ b/src/slic3r/GUI/DownloaderFileGet.hpp @@ -0,0 +1,45 @@ +#ifndef slic3r_DownloaderFileGet_hpp_ +#define slic3r_DownloaderFileGet_hpp_ + +#include "../Utils/Http.hpp" + +#include +#include +#include +#include +#include + +namespace Slic3r { +namespace GUI { +class FileGet : public std::enable_shared_from_this { +private: + struct priv; +public: + FileGet(int ID, std::string url, const std::string& filename, wxEvtHandler* evt_handler,const boost::filesystem::path& dest_folder); + FileGet(FileGet&& other); + ~FileGet(); + + void get(); + void cancel(); + void pause(); + void resume(); + static std::string escape_url(const std::string& url); + static bool is_subdomain(const std::string& url, const std::string& domain); +private: + std::unique_ptr p; +}; +// int = DOWNLOAD ID; string = file path +wxDECLARE_EVENT(EVT_DWNLDR_FILE_COMPLETE, wxCommandEvent); +// int = DOWNLOAD ID; string = error msg +wxDECLARE_EVENT(EVT_DWNLDR_FILE_PROGRESS, wxCommandEvent); +// int = DOWNLOAD ID; string = progress percent +wxDECLARE_EVENT(EVT_DWNLDR_FILE_ERROR, wxCommandEvent); +// int = DOWNLOAD ID; string = name +wxDECLARE_EVENT(EVT_DWNLDR_FILE_NAME_CHANGE, wxCommandEvent); +// int = DOWNLOAD ID; +wxDECLARE_EVENT(EVT_DWNLDR_FILE_PAUSED, wxCommandEvent); +// int = DOWNLOAD ID; +wxDECLARE_EVENT(EVT_DWNLDR_FILE_CANCELED, wxCommandEvent); +} +} +#endif diff --git a/src/slic3r/GUI/ExtraRenderers.cpp b/src/slic3r/GUI/ExtraRenderers.cpp index d72e1dd328c..0368a2fe289 100644 --- a/src/slic3r/GUI/ExtraRenderers.cpp +++ b/src/slic3r/GUI/ExtraRenderers.cpp @@ -33,6 +33,15 @@ wxIMPLEMENT_DYNAMIC_CLASS(DataViewBitmapText, wxObject) IMPLEMENT_VARIANT_OBJECT(DataViewBitmapText) +static wxSize get_size(const wxBitmap& icon) +{ +#ifdef __WIN32__ + return icon.GetSize(); +#else + return icon.GetScaledSize(); +#endif +} + // --------------------------------------------------------- // BitmapTextRenderer // --------------------------------------------------------- @@ -124,11 +133,7 @@ bool BitmapTextRenderer::Render(wxRect rect, wxDC *dc, int state) const wxBitmap& icon = m_value.GetBitmap(); if (icon.IsOk()) { -#ifdef __APPLE__ - wxSize icon_sz = icon.GetScaledSize(); -#else - wxSize icon_sz = icon.GetSize(); -#endif + wxSize icon_sz = get_size(icon); dc->DrawBitmap(icon, rect.x, rect.y + (rect.height - icon_sz.y) / 2); xoffset = icon_sz.x + 4; } @@ -264,11 +269,13 @@ bool BitmapChoiceRenderer::Render(wxRect rect, wxDC* dc, int state) const wxBitmap& icon = m_value.GetBitmap(); if (icon.IsOk()) { - dc->DrawBitmap(icon, rect.x, rect.y + (rect.height - icon.GetHeight()) / 2); - xoffset = icon.GetWidth() + 4; + wxSize icon_sz = get_size(icon); + + dc->DrawBitmap(icon, rect.x, rect.y + (rect.height - icon_sz.GetHeight()) / 2); + xoffset = icon_sz.GetWidth() + 4; if (rect.height==0) - rect.height= icon.GetHeight(); + rect.height= icon_sz.GetHeight(); } #ifdef _WIN32 @@ -297,7 +304,7 @@ wxWindow* BitmapChoiceRenderer::CreateEditorCtrl(wxWindow* parent, wxRect labelR if (can_create_editor_ctrl && !can_create_editor_ctrl()) return nullptr; - std::vector icons = get_extruder_color_icons(); + std::vector icons = get_extruder_color_icons(); if (icons.empty()) return nullptr; diff --git a/src/slic3r/GUI/ExtruderSequenceDialog.cpp b/src/slic3r/GUI/ExtruderSequenceDialog.cpp index 42313636ecb..e1c6a7ce023 100644 --- a/src/slic3r/GUI/ExtruderSequenceDialog.cpp +++ b/src/slic3r/GUI/ExtruderSequenceDialog.cpp @@ -264,9 +264,6 @@ void ExtruderSequenceDialog::on_dpi_changed(const wxRect& suggested_rect) { SetFont(wxGetApp().normal_font()); - m_bmp_add.msw_rescale(); - m_bmp_del.msw_rescale(); - const int em = em_unit(); m_intervals_grid_sizer->SetHGap(em); diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index a18020357ff..74ad028d363 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -33,7 +33,7 @@ wxString double_to_string(double const value, const int max_precision /*= 4*/) // Style_NoTrailingZeroes does not work on OSX. It also does not work correctly with some locales on Windows. // return wxNumberFormatter::ToString(value, max_precision, wxNumberFormatter::Style_NoTrailingZeroes); - wxString s = wxNumberFormatter::ToString(value, max_precision, wxNumberFormatter::Style_None); + wxString s = wxNumberFormatter::ToString(value, std::abs(value) < 0.0001 ? 10 : max_precision, wxNumberFormatter::Style_None); // The following code comes from wxNumberFormatter::RemoveTrailingZeroes(wxString& s) // with the exception that here one sets the decimal separator explicitely to dot. @@ -175,24 +175,20 @@ void Field::on_back_to_sys_value() wxString Field::get_tooltip_text(const wxString& default_string) { - wxString tooltip_text(""); - wxString tooltip = _(m_opt.tooltip); - edit_tooltip(tooltip); + if (m_opt.tooltip.empty()) + return ""; std::string opt_id = m_opt_id; - auto hash_pos = opt_id.find("#"); + auto hash_pos = opt_id.find('#'); if (hash_pos != std::string::npos) { opt_id.replace(hash_pos, 1,"["); opt_id += "]"; } - if (tooltip.length() > 0) - tooltip_text = tooltip + "\n" + _(L("default value")) + "\t: " + + return from_u8(m_opt.tooltip) + "\n" + _L("default value") + "\t: " + (boost::iends_with(opt_id, "_gcode") ? "\n" : "") + default_string + (boost::iends_with(opt_id, "_gcode") ? "" : "\n") + - _(L("parameter name")) + "\t: " + opt_id; - - return tooltip_text; + _L("parameter name") + "\t: " + opt_id; } bool Field::is_matched(const std::string& string, const std::string& pattern) @@ -201,7 +197,14 @@ bool Field::is_matched(const std::string& string, const std::string& pattern) return std::regex_match(string, regex_pattern); } -static wxString na_value() { return _(L("N/A")); } +static wxString na_value(bool for_spin_ctrl = false) +{ +#ifdef __linux__ + if (for_spin_ctrl) + return ""; +#endif + return _(L("N/A")); +} void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true*/) { @@ -223,7 +226,7 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true } wxString label = m_opt.full_label.empty() ? _(m_opt.label) : _(m_opt.full_label); - show_error(m_parent, from_u8((boost::format(_utf8(L("%s doesn't support percentage"))) % label).str())); + show_error(m_parent, format_wxstr(_L("%s doesn't support percentage"), label)); set_value(double_to_string(m_opt.min), true); m_value = double(m_opt.min); break; @@ -290,18 +293,19 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true break; } case coString: case coStrings: + case coFloatsOrPercents: case coFloatOrPercent: { if (m_opt.type == coFloatOrPercent && m_opt.opt_key == "first_layer_height" && !str.IsEmpty() && str.Last() == '%') { // Workaroud to avoid of using of the % for first layer height // see https://github.com/prusa3d/PrusaSlicer/issues/7418 wxString label = m_opt.full_label.empty() ? _(m_opt.label) : _(m_opt.full_label); - show_error(m_parent, from_u8((boost::format(_utf8(L("%s doesn't support percentage"))) % label).str())); + show_error(m_parent, format_wxstr(_L("%s doesn't support percentage"), label)); const wxString stVal = double_to_string(0.01, 2); set_value(stVal, true); m_value = into_u8(stVal);; break; } - if (m_opt.type == coFloatOrPercent && !str.IsEmpty() && str.Last() != '%') + if ((m_opt.type == coFloatOrPercent || m_opt.type == coFloatsOrPercents) && !str.IsEmpty() && str.Last() != '%') { double val = 0.; const char dec_sep = is_decimal_separator_point() ? '.' : ','; @@ -337,9 +341,10 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true const std::string sidetext = m_opt.sidetext.rfind("mm/s") != std::string::npos ? "mm/s" : "mm"; const wxString stVal = double_to_string(val, 2); - const wxString msg_text = from_u8((boost::format(_utf8(L("Do you mean %s%% instead of %s %s?\n" - "Select YES if you want to change this value to %s%%, \n" - "or NO if you are sure that %s %s is a correct value."))) % stVal % stVal % sidetext % stVal % stVal % sidetext).str()); + // TRN %1% = Value, %2% = units + const wxString msg_text = format_wxstr(_L("Do you mean %1%%% instead of %1% %2%?\n" + "Select YES if you want to change this value to %1%%%, \n" + "or NO if you are sure that %1% %2% is a correct value."), stVal, sidetext); WarningDialog dialog(m_parent, msg_text, _L("Parameter validation") + ": " + m_opt_id, wxYES | wxNO); if ((!infill_anchors || val > 100) && dialog.ShowModal() == wxID_YES) { set_value(from_u8((boost::format("%s%%") % stVal).str()), false/*true*/); @@ -443,6 +448,13 @@ void TextCtrl::BUILD() { text_value += "%"; break; } + case coFloatsOrPercents: { + const auto val = m_opt.get_default_value()->get_at(m_opt_idx); + text_value = double_to_string(val.value); + if (val.percent) + text_value += "%"; + break; + } case coPercent: { text_value = wxString::Format(_T("%i"), int(m_opt.default_value->getFloat())); @@ -574,6 +586,7 @@ bool TextCtrl::value_was_changed() case coString: case coStrings: case coFloatOrPercent: + case coFloatsOrPercents: return boost::any_cast(m_value) != boost::any_cast(val); default: return true; @@ -582,11 +595,15 @@ bool TextCtrl::value_was_changed() void TextCtrl::propagate_value() { - if (!is_defined_input_value(window, m_opt.type) ) - // on_kill_focus() cause a call of OptionsGroup::reload_config(), - // Thus, do it only when it's really needed (when undefined value was input) + wxString val = dynamic_cast(window)->GetValue(); + if (m_opt.nullable && val != na_value()) + m_last_meaningful_value = val; + + if (!is_defined_input_value(window, m_opt.type) ) + // on_kill_focus() cause a call of OptionsGroup::reload_config(), + // Thus, do it only when it's really needed (when undefined value was input) on_kill_focus(); - else if (value_was_changed()) + else if (value_was_changed()) on_change_field(); } @@ -743,9 +760,7 @@ boost::any& CheckBox::get_value() void CheckBox::msw_rescale() { Field::msw_rescale(); - - wxCheckBox* field = dynamic_cast(window); - field->SetMinSize(wxSize(-1, int(1.5f*field->GetFont().GetPixelSize().y +0.5f))); + window->SetInitialSize(window->GetBestSize()); } @@ -755,29 +770,31 @@ void SpinCtrl::BUILD() { if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit); wxString text_value = wxString(""); - int default_value = 0; + int default_value = UNDEF_VALUE; switch (m_opt.type) { case coInt: default_value = m_opt.default_value->getInt(); - text_value = wxString::Format(_T("%i"), default_value); break; case coInts: { - const ConfigOptionInts *vec = m_opt.get_default_value(); - if (vec == nullptr || vec->empty()) break; - for (size_t id = 0; id < vec->size(); ++id) - { - default_value = vec->get_at(id); - text_value += wxString::Format(_T("%i"), default_value); - } + default_value = m_opt.get_default_value()->get_at(m_opt_idx); + if (m_opt.nullable) { + if (default_value == ConfigOptionIntsNullable::nil_value()) + m_last_meaningful_value = m_opt.opt_key == "idle_temperature" ? 30 : static_cast(m_opt.max); + else + m_last_meaningful_value = default_value; + } break; } default: break; } - const int min_val = m_opt.min == INT_MIN + if (default_value != UNDEF_VALUE) + text_value = wxString::Format(_T("%i"), default_value); + + const int min_val = m_opt.min == -FLT_MAX #ifdef __WXOSX__ // We will forcibly set the input value for SpinControl, since the value // inserted from the keyboard is not updated under OSX. @@ -786,8 +803,8 @@ void SpinCtrl::BUILD() { // less then min_val. || m_opt.min > 0 #endif - ? 0 : m_opt.min; - const int max_val = m_opt.max < 2147483647 ? m_opt.max : 2147483647; + ? (int)0 : (int)m_opt.min; + const int max_val = m_opt.max < FLT_MAX ? (int)m_opt.max : INT_MAX; auto temp = new wxSpinCtrl(m_parent, wxID_ANY, text_value, wxDefaultPosition, size, wxTE_PROCESS_ENTER | wxSP_ARROW_KEYS @@ -848,7 +865,7 @@ void SpinCtrl::BUILD() { if (!parsed || value < INT_MIN || value > INT_MAX) tmp_value = UNDEF_VALUE; else { - tmp_value = std::min(std::max((int)value, m_opt.min), m_opt.max); + tmp_value = std::min(std::max((int)value, temp->GetMin()), temp->GetMax()); #ifdef __WXOSX__ // Forcibly set the input value for SpinControl, since the value // inserted from the keyboard or clipboard is not updated under OSX @@ -875,15 +892,62 @@ void SpinCtrl::BUILD() { window = dynamic_cast(temp); } +void SpinCtrl::set_value(const boost::any& value, bool change_event/* = false*/) +{ + m_disable_change_event = !change_event; + tmp_value = boost::any_cast(value); + m_value = value; + if (m_opt.nullable) { + const bool m_is_na_val = tmp_value == ConfigOptionIntsNullable::nil_value(); + if (m_is_na_val) + dynamic_cast(window)->SetValue(na_value(true)); + else { + m_last_meaningful_value = value; + dynamic_cast(window)->SetValue(tmp_value); + } + } + else + dynamic_cast(window)->SetValue(tmp_value); + m_disable_change_event = false; +} + +void SpinCtrl::set_last_meaningful_value() +{ + const int val = boost::any_cast(m_last_meaningful_value); + dynamic_cast(window)->SetValue(val); + tmp_value = val; + propagate_value(); +} + +void SpinCtrl::set_na_value() +{ + dynamic_cast(window)->SetValue(na_value(true)); + m_value = ConfigOptionIntsNullable::nil_value(); + propagate_value(); +} + +boost::any& SpinCtrl::get_value() +{ + wxSpinCtrl* spin = static_cast(window); + if (spin->GetTextValue() == na_value(true)) + return m_value; + + int value = spin->GetValue(); + return m_value = value; +} + void SpinCtrl::propagate_value() { // check if value was really changed if (boost::any_cast(m_value) == tmp_value) return; + if (m_opt.nullable && tmp_value != ConfigOptionIntsNullable::nil_value()) + m_last_meaningful_value = tmp_value; + if (tmp_value == UNDEF_VALUE) { on_kill_focus(); - } else { + } else { #ifdef __WXOSX__ // check input value for minimum if (m_opt.min > 0 && tmp_value < m_opt.min) { @@ -924,7 +988,8 @@ void Choice::BUILD() { if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit); choice_ctrl* temp; - if (m_opt.gui_type != ConfigOptionDef::GUIType::undefined && m_opt.gui_type != ConfigOptionDef::GUIType::select_open) { + if (m_opt.gui_type != ConfigOptionDef::GUIType::undefined + && m_opt.gui_type != ConfigOptionDef::GUIType::select_close) { m_is_editable = true; temp = new choice_ctrl(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, nullptr, wxTE_PROCESS_ENTER); } @@ -954,17 +1019,13 @@ void Choice::BUILD() { // recast as a wxWindow to fit the calling convention window = dynamic_cast(temp); - if (! m_opt.enum_labels.empty() || ! m_opt.enum_values.empty()) { - if (m_opt.enum_labels.empty()) { - // Append non-localized enum_values - for (auto el : m_opt.enum_values) - temp->Append(el); - } else { - // Append localized enum_labels - for (auto el : m_opt.enum_labels) - temp->Append(_(el)); - } - set_selection(); + if (m_opt.enum_def) { + if (auto& labels = m_opt.enum_def->labels(); !labels.empty()) { + bool localized = m_opt.enum_def->has_labels(); + for (const std::string& el : labels) + temp->Append(localized ? _(from_u8(el)) : from_u8(el)); + set_selection(); + } } temp->Bind(wxEVT_MOUSEWHEEL, [this](wxMouseEvent& e) { @@ -1074,34 +1135,24 @@ void Choice::set_selection() } if (!text_value.IsEmpty()) { - size_t idx = 0; - for (auto el : m_opt.enum_values) { - if (el == text_value) - break; - ++idx; - } - idx == m_opt.enum_values.size() ? field->SetValue(text_value) : field->SetSelection(idx); + if (auto opt = m_opt.enum_def->value_to_index(into_u8(text_value)); opt.has_value()) + // This enum has a value field of the same content as text_value. Select it. + field->SetSelection(*opt); + else + field->SetValue(text_value); } } void Choice::set_value(const std::string& value, bool change_event) //! Redundant? { m_disable_change_event = !change_event; - - size_t idx=0; - for (auto el : m_opt.enum_values) - { - if (el == value) - break; - ++idx; - } - choice_ctrl* field = dynamic_cast(window); - idx == m_opt.enum_values.size() ? - field->SetValue(value) : - field->SetSelection(idx); - - m_disable_change_event = false; + if (auto opt = m_opt.enum_def->value_to_index(value); opt.has_value()) + // This enum has a value field of the same content as text_value. Select it. + field->SetSelection(*opt); + else + field->SetValue(value); + m_disable_change_event = false; } void Choice::set_value(const boost::any& value, bool change_event) @@ -1117,27 +1168,25 @@ void Choice::set_value(const boost::any& value, bool change_event) case coFloatOrPercent: case coString: case coStrings: { - wxString text_value; - if (m_opt.type == coInt) - text_value = wxString::Format(_T("%i"), int(boost::any_cast(value))); - else - text_value = boost::any_cast(value); - size_t idx = 0; - const std::vector& enums = m_opt.enum_values.empty() ? m_opt.enum_labels : m_opt.enum_values; - for (auto el : enums) - { - if (el == text_value) - break; - ++idx; - } - if (idx == enums.size()) { + wxString text_value = m_opt.type == coInt ? + wxString::Format(_T("%i"), int(boost::any_cast(value))) : + boost::any_cast(value); + int sel_idx = -1; + if (m_opt.enum_def) { + if (auto idx = m_opt.enum_def->label_to_index(into_u8(text_value)); idx.has_value()) + sel_idx = *idx; + else if (idx = m_opt.enum_def->value_to_index(into_u8(text_value)); idx.has_value()) + sel_idx = *idx; + } + + if (sel_idx >= 0 ) + field->SetSelection(sel_idx); + else { // For editable Combobox under OSX is needed to set selection to -1 explicitly, // otherwise selection doesn't be changed field->SetSelection(-1); field->SetValue(text_value); } - else - field->SetSelection(idx); if (!m_value.empty() && m_opt.opt_key == "fill_density") { // If m_value was changed before, then update m_value here too to avoid case @@ -1150,26 +1199,9 @@ void Choice::set_value(const boost::any& value, bool change_event) break; } case coEnum: { - int val = boost::any_cast(value); - if (m_opt_id.compare("host_type") == 0 && val != 0 && - m_opt.enum_values.size() > field->GetCount()) // for case, when PrusaLink isn't used as a HostType - val--; - - if (m_opt_id == "top_fill_pattern" || m_opt_id == "bottom_fill_pattern" || m_opt_id == "fill_pattern") - { - std::string key; - const t_config_enum_values& map_names = ConfigOptionEnum::get_enum_values(); - for (auto it : map_names) - if (val == it.second) { - key = it.first; - break; - } - - const std::vector& values = m_opt.enum_values; - auto it = std::find(values.begin(), values.end(), key); - val = it == values.end() ? 0 : it - values.begin(); - } - field->SetSelection(val); + auto val = m_opt.enum_def->enum_to_index(boost::any_cast(value)); + assert(val.has_value()); + field->SetSelection(val.has_value() ? *val : 0); break; } default: @@ -1232,29 +1264,21 @@ boost::any& Choice::get_value() return m_value = boost::any(ret_str); if (m_opt.type == coEnum) - { - if (m_opt_id.compare("host_type") == 0 && m_opt.enum_values.size() > field->GetCount()) { - // for case, when PrusaLink isn't used as a HostType - m_value = field->GetSelection()+1; - } else if (m_opt_id == "top_fill_pattern" || m_opt_id == "bottom_fill_pattern" || m_opt_id == "fill_pattern") { - const std::string& key = m_opt.enum_values[field->GetSelection()]; - m_value = int(ConfigOptionEnum::get_enum_values().at(key)); - } - else - m_value = field->GetSelection(); - } + // Closed enum: The combo box item index returned by the field must be convertible to an enum value. + m_value = m_opt.enum_def->index_to_enum(field->GetSelection()); else if (m_opt.gui_type == ConfigOptionDef::GUIType::f_enum_open || m_opt.gui_type == ConfigOptionDef::GUIType::i_enum_open) { + // Open enum: The combo box item index returned by the field const int ret_enum = field->GetSelection(); - if (ret_enum < 0 || m_opt.enum_values.empty() || m_opt.type == coStrings || - (ret_str != m_opt.enum_values[ret_enum] && ret_str != _(m_opt.enum_labels[ret_enum]))) + if (ret_enum < 0 || ! m_opt.enum_def->has_values() || m_opt.type == coStrings || + (into_u8(ret_str) != m_opt.enum_def->value(ret_enum) && ret_str != _(m_opt.enum_def->label(ret_enum)))) // modifies ret_string! get_value_by_opt_type(ret_str); else if (m_opt.type == coFloatOrPercent) - m_value = m_opt.enum_values[ret_enum]; + m_value = m_opt.enum_def->value(ret_enum); else if (m_opt.type == coInt) - m_value = atoi(m_opt.enum_values[ret_enum].c_str()); + m_value = atoi(m_opt.enum_def->value(ret_enum).c_str()); else - m_value = string_to_double_decimal_point(m_opt.enum_values[ret_enum]); + m_value = string_to_double_decimal_point(m_opt.enum_def->value(ret_enum)); } else // modifies ret_string! @@ -1289,22 +1313,19 @@ void Choice::msw_rescale() // Set rescaled size field->SetSize(size); - size_t idx = 0; - if (! m_opt.enum_labels.empty() || ! m_opt.enum_values.empty()) { - size_t counter = 0; - bool labels = ! m_opt.enum_labels.empty(); - for (const std::string &el : labels ? m_opt.enum_labels : m_opt.enum_values) { - wxString text = labels ? _(el) : from_u8(el); - field->Append(text); - if (text == selection) - idx = counter; - ++ counter; + if (m_opt.enum_def) { + if (auto& labels = m_opt.enum_def->labels(); !labels.empty()) { + const bool localized = m_opt.enum_def->has_labels(); + for (const std::string& el : labels) + field->Append(localized ? _(from_u8(el)) : from_u8(el)); + + if (auto opt = m_opt.enum_def->label_to_index(into_u8(selection)); opt.has_value()) + // This enum has a value field of the same content as text_value. Select it. + field->SetSelection(*opt); + else + field->SetValue(selection); } } - - idx == m_opt.enum_values.size() ? - field->SetValue(selection) : - field->SetSelection(idx); #else #ifdef _WIN32 field->Rescale(); @@ -1385,13 +1406,8 @@ void ColourPicker::set_value(const boost::any& value, bool change_event) boost::any& ColourPicker::get_value() { auto colour = static_cast(window)->GetColour(); - if (colour == wxTransparentColour) - m_value = std::string(""); - else { - auto clr_str = wxString::Format(wxT("#%02X%02X%02X"), colour.Red(), colour.Green(), colour.Blue()); - m_value = clr_str.ToStdString(); - } - return m_value; + m_value = (colour == wxTransparentColour) ? std::string("") : encode_color(ColorRGB(colour.Red(), colour.Green(), colour.Blue())); + return m_value; } void ColourPicker::msw_rescale() @@ -1423,6 +1439,14 @@ void ColourPicker::sys_color_changed() #endif } +PointCtrl::~PointCtrl() +{ + if (sizer && sizer->IsEmpty()) { + delete sizer; + sizer = nullptr; + } +} + void PointCtrl::BUILD() { auto temp = new wxBoxSizer(wxHORIZONTAL); @@ -1621,8 +1645,8 @@ void SliderCtrl::BUILD() auto temp = new wxBoxSizer(wxHORIZONTAL); auto def_val = m_opt.get_default_value()->value; - auto min = m_opt.min == INT_MIN ? 0 : m_opt.min; - auto max = m_opt.max == INT_MAX ? 100 : m_opt.max; + auto min = m_opt.min == -FLT_MAX ? 0 : (int)m_opt.min; + auto max = m_opt.max == FLT_MAX ? 100 : INT_MAX; m_slider = new wxSlider(m_parent, wxID_ANY, def_val * m_scale, min * m_scale, max * m_scale, diff --git a/src/slic3r/GUI/Field.hpp b/src/slic3r/GUI/Field.hpp index 8575001bf8f..73af0ef53da 100644 --- a/src/slic3r/GUI/Field.hpp +++ b/src/slic3r/GUI/Field.hpp @@ -39,7 +39,86 @@ using t_back_to_init = std::function; wxString double_to_string(double const value, const int max_precision = 4); wxString get_thumbnails_string(const std::vector& values); -class Field { +class UndoValueUIManager +{ + struct UndoValueUI { + // Bitmap and Tooltip text for m_Undo_btn. The wxButton will be updated only if the new wxBitmap pointer differs from the currently rendered one. + const ScalableBitmap* undo_bitmap{ nullptr }; + const wxString* undo_tooltip{ nullptr }; + // Bitmap and Tooltip text for m_Undo_to_sys_btn. The wxButton will be updated only if the new wxBitmap pointer differs from the currently rendered one. + const ScalableBitmap* undo_to_sys_bitmap{ nullptr }; + const wxString* undo_to_sys_tooltip{ nullptr }; + // Color for Label. The wxColour will be updated only if the new wxColour pointer differs from the currently rendered one. + const wxColour* label_color{ nullptr }; + // State of the blinker icon + bool blink{ false }; + + bool set_undo_bitmap(const ScalableBitmap* bmp) { + if (undo_bitmap != bmp) { + undo_bitmap = bmp; + return true; + } + return false; + } + + bool set_undo_to_sys_bitmap(const ScalableBitmap* bmp) { + if (undo_to_sys_bitmap != bmp) { + undo_to_sys_bitmap = bmp; + return true; + } + return false; + } + + bool set_label_colour(const wxColour* clr) { + if (label_color != clr) { + label_color = clr; + } + return false; + } + + bool set_undo_tooltip(const wxString* tip) { + if (undo_tooltip != tip) { + undo_tooltip = tip; + return true; + } + return false; + } + + bool set_undo_to_sys_tooltip(const wxString* tip) { + if (undo_to_sys_tooltip != tip) { + undo_to_sys_tooltip = tip; + return true; + } + return false; + } + }; + + UndoValueUI m_undo_ui; + +public: + UndoValueUIManager() {} + ~UndoValueUIManager() {} + + bool set_undo_bitmap(const ScalableBitmap* bmp) { return m_undo_ui.set_undo_bitmap(bmp); } + bool set_undo_to_sys_bitmap(const ScalableBitmap* bmp) { return m_undo_ui.set_undo_to_sys_bitmap(bmp); } + bool set_label_colour(const wxColour* clr) { return m_undo_ui.set_label_colour(clr); } + bool set_undo_tooltip(const wxString* tip) { return m_undo_ui.set_undo_tooltip(tip); } + bool set_undo_to_sys_tooltip(const wxString* tip) { return m_undo_ui.set_undo_to_sys_tooltip(tip); } + + // ui items used for revert line value + bool has_undo_ui() const { return m_undo_ui.undo_bitmap != nullptr; } + const wxBitmapBundle& undo_bitmap() const { return m_undo_ui.undo_bitmap->bmp(); } + const wxString* undo_tooltip() const { return m_undo_ui.undo_tooltip; } + const wxBitmapBundle& undo_to_sys_bitmap() const { return m_undo_ui.undo_to_sys_bitmap->bmp(); } + const wxString* undo_to_sys_tooltip() const { return m_undo_ui.undo_to_sys_tooltip; } + const wxColour* label_color() const { return m_undo_ui.label_color; } + const bool blink() const { return m_undo_ui.blink; } + bool* get_blink_ptr() { return &m_undo_ui.blink; } +}; + + +class Field : public UndoValueUIManager +{ protected: // factory function to defer and enforce creation of derived type. virtual void PostInitialize(); @@ -137,49 +216,6 @@ class Field { return std::move(p); //!p; } - bool set_undo_bitmap(const ScalableBitmap *bmp) { - if (m_undo_bitmap != bmp) { - m_undo_bitmap = bmp; - return true; - } - return false; - } - - bool set_undo_to_sys_bitmap(const ScalableBitmap *bmp) { - if (m_undo_to_sys_bitmap != bmp) { - m_undo_to_sys_bitmap = bmp; - return true; - } - return false; - } - - bool set_label_colour(const wxColour *clr) { - if (m_label_color != clr) { - m_label_color = clr; - } - return false; - } - - bool set_undo_tooltip(const wxString *tip) { - if (m_undo_tooltip != tip) { - m_undo_tooltip = tip; - return true; - } - return false; - } - - bool set_undo_to_sys_tooltip(const wxString *tip) { - if (m_undo_to_sys_tooltip != tip) { - m_undo_to_sys_tooltip = tip; - return true; - } - return false; - } - - bool* get_blink_ptr() { - return &m_blink; - } - virtual void msw_rescale(); virtual void sys_color_changed(); @@ -191,26 +227,7 @@ class Field { static int def_width_wider() ; static int def_width_thinner() ; - const ScalableBitmap* undo_bitmap() { return m_undo_bitmap; } - const wxString* undo_tooltip() { return m_undo_tooltip; } - const ScalableBitmap* undo_to_sys_bitmap() { return m_undo_to_sys_bitmap; } - const wxString* undo_to_sys_tooltip() { return m_undo_to_sys_tooltip; } - const wxColour* label_color() { return m_label_color; } - const bool blink() { return m_blink; } - protected: - // Bitmap and Tooltip text for m_Undo_btn. The wxButton will be updated only if the new wxBitmap pointer differs from the currently rendered one. - const ScalableBitmap* m_undo_bitmap = nullptr; - const wxString* m_undo_tooltip = nullptr; - // Bitmap and Tooltip text for m_Undo_to_sys_btn. The wxButton will be updated only if the new wxBitmap pointer differs from the currently rendered one. - const ScalableBitmap* m_undo_to_sys_bitmap = nullptr; - const wxString* m_undo_to_sys_tooltip = nullptr; - - bool m_blink{ false }; - - // Color for Label. The wxColour will be updated only if the new wxColour pointer differs from the currently rendered one. - const wxColour* m_label_color = nullptr; - // current value boost::any m_value; // last maeningful value @@ -313,24 +330,18 @@ class SpinCtrl : public Field { void BUILD() override; /// Propagate value from field to the OptionGroupe and Config after kill_focus/ENTER void propagate_value() ; - +/* void set_value(const std::string& value, bool change_event = false) { m_disable_change_event = !change_event; dynamic_cast(window)->SetValue(value); m_disable_change_event = false; } - void set_value(const boost::any& value, bool change_event = false) override { - m_disable_change_event = !change_event; - tmp_value = boost::any_cast(value); - m_value = value; - dynamic_cast(window)->SetValue(tmp_value); - m_disable_change_event = false; - } +*/ + void set_value(const boost::any& value, bool change_event = false) override; + void set_last_meaningful_value() override; + void set_na_value() override; - boost::any& get_value() override { - int value = static_cast(window)->GetValue(); - return m_value = value; - } + boost::any& get_value() override; void msw_rescale() override; @@ -408,7 +419,7 @@ class PointCtrl : public Field { public: PointCtrl(const ConfigOptionDef& opt, const t_config_option_key& id) : Field(opt, id) {} PointCtrl(wxWindow* parent, const ConfigOptionDef& opt, const t_config_option_key& id) : Field(parent, opt, id) {} - ~PointCtrl() {} + ~PointCtrl(); wxSizer* sizer{ nullptr }; wxTextCtrl* x_textctrl{ nullptr }; diff --git a/src/slic3r/GUI/FileArchiveDialog.cpp b/src/slic3r/GUI/FileArchiveDialog.cpp new file mode 100644 index 00000000000..233a3e19009 --- /dev/null +++ b/src/slic3r/GUI/FileArchiveDialog.cpp @@ -0,0 +1,387 @@ +#include "FileArchiveDialog.hpp" + +#include "I18N.hpp" +#include "GUI_App.hpp" +#include "GUI.hpp" +#include "MainFrame.hpp" +#include "ExtraRenderers.hpp" +#include "format.hpp" +#include +#include +#include + +namespace Slic3r { +namespace GUI { + +ArchiveViewModel::ArchiveViewModel(wxWindow* parent) + :m_parent(parent) +{} +ArchiveViewModel::~ArchiveViewModel() +{} + +std::shared_ptr ArchiveViewModel::AddFile(std::shared_ptr parent, const wxString& name, bool container) +{ + std::shared_ptr node = std::make_shared(ArchiveViewNode(name)); + node->set_container(container); + + if (parent.get() != nullptr) { + parent->get_children().push_back(node); + node->set_parent(parent); + parent->set_is_folder(true); + } else { + m_top_children.emplace_back(node); + } + + wxDataViewItem child = wxDataViewItem((void*)node.get()); + wxDataViewItem parent_item= wxDataViewItem((void*)parent.get()); + ItemAdded(parent_item, child); + + if (parent) + m_ctrl->Expand(parent_item); + return node; +} + +wxString ArchiveViewModel::GetColumnType(unsigned int col) const +{ + if (col == 0) + return "bool"; + return "string";//"DataViewBitmapText"; +} + +void ArchiveViewModel::Rescale() +{ + // There should be no pictures rendered +} + +void ArchiveViewModel::Delete(const wxDataViewItem& item) +{ + assert(item.IsOk()); + ArchiveViewNode* node = static_cast(item.GetID()); + assert(node->get_parent() != nullptr); + for (std::shared_ptr child : node->get_children()) + { + Delete(wxDataViewItem((void*)child.get())); + } + delete [] node; +} +void ArchiveViewModel::Clear() +{ +} + +wxDataViewItem ArchiveViewModel::GetParent(const wxDataViewItem& item) const +{ + assert(item.IsOk()); + ArchiveViewNode* node = static_cast(item.GetID()); + return wxDataViewItem((void*)node->get_parent().get()); +} +unsigned int ArchiveViewModel::GetChildren(const wxDataViewItem& parent, wxDataViewItemArray& array) const +{ + if (!parent.IsOk()) { + for (std::shared_ptrchild : m_top_children) { + array.push_back(wxDataViewItem((void*)child.get())); + } + return m_top_children.size(); + } + + ArchiveViewNode* node = static_cast(parent.GetID()); + for (std::shared_ptr child : node->get_children()) { + array.push_back(wxDataViewItem((void*)child.get())); + } + return node->get_children().size(); +} + +void ArchiveViewModel::GetValue(wxVariant& variant, const wxDataViewItem& item, unsigned int col) const +{ + assert(item.IsOk()); + ArchiveViewNode* node = static_cast(item.GetID()); + if (col == 0) { + variant = node->get_toggle(); + } else { + variant = node->get_name(); + } +} + +void ArchiveViewModel::untoggle_folders(const wxDataViewItem& item) +{ + assert(item.IsOk()); + ArchiveViewNode* node = static_cast(item.GetID()); + node->set_toggle(false); + if (node->get_parent().get() != nullptr) + untoggle_folders(wxDataViewItem((void*)node->get_parent().get())); +} + +bool ArchiveViewModel::SetValue(const wxVariant& variant, const wxDataViewItem& item, unsigned int col) +{ + assert(item.IsOk()); + ArchiveViewNode* node = static_cast(item.GetID()); + if (col == 0) { + node->set_toggle(variant.GetBool()); + // if folder recursivelly check all children + for (std::shared_ptr child : node->get_children()) { + SetValue(variant, wxDataViewItem((void*)child.get()), col); + } + if(!variant.GetBool() && node->get_parent()) + untoggle_folders(wxDataViewItem((void*)node->get_parent().get())); + } else { + node->set_name(variant.GetString()); + } + m_parent->Refresh(); + return true; +} +bool ArchiveViewModel::IsEnabled(const wxDataViewItem& item, unsigned int col) const +{ + // As of now, all items are always enabled. + // Returning false for col 1 would gray out text. + return true; +} + +bool ArchiveViewModel::IsContainer(const wxDataViewItem& item) const +{ + if(!item.IsOk()) + return true; + ArchiveViewNode* node = static_cast(item.GetID()); + return node->is_container(); +} + +ArchiveViewCtrl::ArchiveViewCtrl(wxWindow* parent, wxSize size) + : wxDataViewCtrl(parent, wxID_ANY, wxDefaultPosition, size, wxDV_VARIABLE_LINE_HEIGHT | wxDV_ROW_LINES +#ifdef _WIN32 + | wxBORDER_SIMPLE +#endif + ) + //, m_em_unit(em_unit(parent)) +{ + wxGetApp().UpdateDVCDarkUI(this); + + m_model = new ArchiveViewModel(parent); + this->AssociateModel(m_model); + m_model->SetAssociatedControl(this); +} + +ArchiveViewCtrl::~ArchiveViewCtrl() +{ + if (m_model) { + m_model->Clear(); + m_model->DecRef(); + } +} + +FileArchiveDialog::FileArchiveDialog(wxWindow* parent_window, mz_zip_archive* archive, std::vector>& selected_paths_w_size) + : DPIDialog(parent_window, wxID_ANY, _(L("Archive preview")), wxDefaultPosition, + wxSize(45 * wxGetApp().em_unit(), 40 * wxGetApp().em_unit()), + wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxMAXIMIZE_BOX) + , m_selected_paths_w_size (selected_paths_w_size) +{ +#ifdef _WIN32 + wxGetApp().UpdateDarkUI(this); +#else + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); +#endif + + int em = em_unit(); + + wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL); + + m_avc = new ArchiveViewCtrl(this, wxSize(45 * em, 30 * em)); + wxDataViewColumn* toggle_column = m_avc->AppendToggleColumn(L"\u2714", 0, wxDATAVIEW_CELL_ACTIVATABLE, 6 * em); + m_avc->AppendTextColumn("filename", 1); + + std::vector> stack; + + std::function >&, size_t)> reduce_stack = [] (std::vector>& stack, size_t size) { + if (size == 0) { + stack.clear(); + return; + } + while (stack.size() > size) + stack.pop_back(); + }; + // recursively stores whole structure of file onto function stack and synchoronize with stack object. + std::function>&)> adjust_stack = [&adjust_stack, &reduce_stack, &avc = m_avc](const boost::filesystem::path& const_file, std::vector>& stack)->size_t { + boost::filesystem::path file(const_file); + size_t struct_size = file.has_parent_path() ? adjust_stack(file.parent_path(), stack) : 0; + + if (stack.size() > struct_size && (file.has_extension() || file.filename().string() != stack[struct_size]->get_name())) + { + reduce_stack(stack, struct_size); + } + if (!file.has_extension() && stack.size() == struct_size) + stack.push_back(avc->get_model()->AddFile((stack.empty() ? std::shared_ptr(nullptr) : stack.back()), boost::nowide::widen(file.filename().string()), true)); // filename string to wstring? + return struct_size + 1; + }; + + const std::regex pattern_drop(".*[.](stl|obj|amf|3mf|prusa|step|stp)", std::regex::icase); + mz_uint num_entries = mz_zip_reader_get_num_files(archive); + mz_zip_archive_file_stat stat; + std::vector> filtered_entries; // second is unzipped size + for (mz_uint i = 0; i < num_entries; ++i) { + if (mz_zip_reader_file_stat(archive, i, &stat)) { + std::string extra(1024, 0); + boost::filesystem::path path; + size_t extra_size = mz_zip_reader_get_filename_from_extra(archive, i, extra.data(), extra.size()); + if (extra_size > 0) { + path = boost::filesystem::path(extra.substr(0, extra_size)); + } else { + wxString wname = boost::nowide::widen(stat.m_filename); + std::string name = boost::nowide::narrow(wname); + path = boost::filesystem::path(name); + } + assert(!path.empty()); + if (!path.has_extension()) + continue; + // filter out MACOS specific hidden files + if (boost::algorithm::starts_with(path.string(), "__MACOSX")) + continue; + filtered_entries.emplace_back(std::move(path), stat.m_uncomp_size); + } + } + // sorting files will help adjust_stack function to not create multiple same folders + std::sort(filtered_entries.begin(), filtered_entries.end(), [](const std::pair& p1, const std::pair& p2){ return p1.first.string() < p2.first.string(); }); + size_t entry_count = 0; + size_t depth = 1; + for (const auto& entry : filtered_entries) + { + const boost::filesystem::path& path = entry.first; + std::shared_ptr parent(nullptr); + + depth = std::max(depth, adjust_stack(path, stack)); + if (!stack.empty()) + parent = stack.back(); + if (std::regex_match(path.extension().string(), pattern_drop)) { // this leaves out non-compatible files + std::shared_ptr new_node = m_avc->get_model()->AddFile(parent, boost::nowide::widen(path.filename().string()), false); + new_node->set_fullpath(/*std::move(path)*/path); // filename string to wstring? + new_node->set_size(entry.second); + entry_count++; + } + } + if (entry_count == 1) + on_all_button(); + + toggle_column->SetWidth((4 + depth) * em); + + wxBoxSizer* btn_sizer = new wxBoxSizer(wxHORIZONTAL); + + wxButton* btn_all = new wxButton(this, wxID_ANY, _L("All")); + btn_all->Bind(wxEVT_BUTTON, [this](wxCommandEvent& evt) { on_all_button(); }); + btn_sizer->Add(btn_all, 0); + + wxButton* btn_none = new wxButton(this, wxID_ANY, _L("None")); + btn_none->Bind(wxEVT_BUTTON, [this](wxCommandEvent& evt) { on_none_button(); }); + btn_sizer->Add(btn_none, 0, wxLEFT, em); + + btn_sizer->AddStretchSpacer(); + wxButton* btn_run = new wxButton(this, wxID_OK, _L("Open")); + btn_run->Bind(wxEVT_BUTTON, [this](wxCommandEvent& evt) { on_open_button(); }); + btn_sizer->Add(btn_run, 0, wxRIGHT, em); + + wxButton* cancel_btn = new wxButton(this, wxID_CANCEL, _L("Cancel")); + cancel_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent& evt) { this->EndModal(wxID_CANCEL); }); + btn_sizer->Add(cancel_btn, 0, wxRIGHT, em); + + topSizer->Add(m_avc, 1, wxEXPAND | wxALL, 10); + topSizer->Add(btn_sizer, 0, wxEXPAND | wxALL, 10); + this->SetSizer(topSizer); + SetMinSize(wxSize(40 * em, 30 * em)); + + for (const wxString& id : {_L("All"), _L("None"), _L("Open"), _L("Cancel") }) + wxGetApp().UpdateDarkUI(static_cast(FindWindowByLabel(id, this))); +} + +void FileArchiveDialog::on_dpi_changed(const wxRect& suggested_rect) +{ + int em = em_unit(); + BOOST_LOG_TRIVIAL(error) << "on_dpi_changed"; + //msw_buttons_rescale(this, em, { wxID_CANCEL, m_save_btn_id, m_move_btn_id, m_continue_btn_id }); + //for (auto btn : { m_save_btn, m_transfer_btn, m_discard_btn }) + // if (btn) btn->msw_rescale(); + + const wxSize& size = wxSize(45 * em, 40 * em); + SetSize(size); + //m_tree->Rescale(em); + + Fit(); + Refresh(); +} + +void FileArchiveDialog::on_open_button() +{ + wxDataViewItemArray top_items; + m_avc->get_model()->GetChildren(wxDataViewItem(nullptr), top_items); + + std::function deep_fill = [&paths = m_selected_paths_w_size, &deep_fill](ArchiveViewNode* node){ + if (node == nullptr) + return; + if (node->get_children().empty()) { + if (node->get_toggle()) + paths.emplace_back(node->get_fullpath(), node->get_size()); + } else { + for (std::shared_ptr child : node->get_children()) + deep_fill(child.get()); + } + }; + + for (const auto& item : top_items) + { + ArchiveViewNode* node = static_cast(item.GetID()); + deep_fill(node); + } + this->EndModal(wxID_OK); +} + +void FileArchiveDialog::on_all_button() +{ + + wxDataViewItemArray top_items; + m_avc->get_model()->GetChildren(wxDataViewItem(nullptr), top_items); + + std::function deep_fill = [&deep_fill](ArchiveViewNode* node) { + if (node == nullptr) + return; + node->set_toggle(true); + if (!node->get_children().empty()) { + for (std::shared_ptr child : node->get_children()) + deep_fill(child.get()); + } + }; + + for (const auto& item : top_items) + { + ArchiveViewNode* node = static_cast(item.GetID()); + deep_fill(node); + // Fix for linux, where Refresh or Update wont help to redraw toggle checkboxes. + // It should be enough to call ValueChanged for top items. + m_avc->get_model()->ValueChanged(item, 0); + } + + Refresh(); +} + +void FileArchiveDialog::on_none_button() +{ + wxDataViewItemArray top_items; + m_avc->get_model()->GetChildren(wxDataViewItem(nullptr), top_items); + + std::function deep_fill = [&deep_fill](ArchiveViewNode* node) { + if (node == nullptr) + return; + node->set_toggle(false); + if (!node->get_children().empty()) { + for (std::shared_ptr child : node->get_children()) + deep_fill(child.get()); + } + }; + + for (const auto& item : top_items) + { + ArchiveViewNode* node = static_cast(item.GetID()); + deep_fill(node); + // Fix for linux, where Refresh or Update wont help to redraw toggle checkboxes. + // It should be enough to call ValueChanged for top items. + m_avc->get_model()->ValueChanged(item, 0); + } + + this->Refresh(); +} + +} // namespace GUI +} // namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/FileArchiveDialog.hpp b/src/slic3r/GUI/FileArchiveDialog.hpp new file mode 100644 index 00000000000..4a335c75a7a --- /dev/null +++ b/src/slic3r/GUI/FileArchiveDialog.hpp @@ -0,0 +1,123 @@ +#ifndef slic3r_GUI_FileArchiveDialog_hpp_ +#define slic3r_GUI_FileArchiveDialog_hpp_ + +#include "GUI_Utils.hpp" +#include "libslic3r/miniz_extension.hpp" + +#include +#include +#include +#include "wxExtensions.hpp" + +namespace Slic3r { +namespace GUI { + +class ArchiveViewCtrl; + +class ArchiveViewNode +{ +public: + ArchiveViewNode(const wxString& name) : m_name(name) {} + + std::vector>& get_children() { return m_children; } + void set_parent(std::shared_ptr parent) { m_parent = parent; } + // On Linux, get_parent cannot just return size of m_children. ItemAdded would than crash. + std::shared_ptr get_parent() const { return m_parent; } + bool is_container() const { return m_container; } + void set_container(bool is_container) { m_container = is_container; } + wxString get_name() const { return m_name; } + void set_name(const wxString& name) { m_name = name; } + bool get_toggle() const { return m_toggle; } + void set_toggle(bool toggle) { m_toggle = toggle; } + bool get_is_folder() const { return m_folder; } + void set_is_folder(bool is_folder) { m_folder = is_folder; } + void set_fullpath(boost::filesystem::path path) { m_fullpath = path; } + boost::filesystem::path get_fullpath() const { return m_fullpath; } + void set_size(size_t size) { m_size = size; } + size_t get_size() const { return m_size; } + +private: + wxString m_name; + std::shared_ptr m_parent { nullptr }; + std::vector> m_children; + + bool m_toggle { false }; + bool m_folder { false }; + boost::filesystem::path m_fullpath; + bool m_container { false }; + size_t m_size { 0 }; +}; + +class ArchiveViewModel : public wxDataViewModel +{ +public: + ArchiveViewModel(wxWindow* parent); + ~ArchiveViewModel(); + + /* wxDataViewItem AddFolder(wxDataViewItem& parent, wxString name); + wxDataViewItem AddFile(wxDataViewItem& parent, wxString name);*/ + + std::shared_ptr AddFile(std::shared_ptr parent,const wxString& name, bool container); + + wxString GetColumnType(unsigned int col) const override; + unsigned int GetColumnCount() const override { return 2; } + + void Rescale(); + void Delete(const wxDataViewItem& item); + void Clear(); + + wxDataViewItem GetParent(const wxDataViewItem& item) const override; + unsigned int GetChildren(const wxDataViewItem& parent, wxDataViewItemArray& array) const override; + + void SetAssociatedControl(ArchiveViewCtrl* ctrl) { m_ctrl = ctrl; } + + void GetValue(wxVariant& variant, const wxDataViewItem& item, unsigned int col) const override; + bool SetValue(const wxVariant& variant, const wxDataViewItem& item, unsigned int col) override; + + void untoggle_folders(const wxDataViewItem& item); + + bool IsEnabled(const wxDataViewItem& item, unsigned int col) const override; + bool IsContainer(const wxDataViewItem& item) const override; + // Is the container just a header or an item with all columns + // In our case it is an item with all columns + bool HasContainerColumns(const wxDataViewItem& WXUNUSED(item)) const override { return true; } + +protected: + wxWindow* m_parent { nullptr }; + ArchiveViewCtrl* m_ctrl { nullptr }; + std::vector> m_top_children; +}; + +class ArchiveViewCtrl : public wxDataViewCtrl +{ + public: + ArchiveViewCtrl(wxWindow* parent, wxSize size); + ~ArchiveViewCtrl(); + + ArchiveViewModel* get_model() const {return m_model; } +protected: + ArchiveViewModel* m_model; +}; + + +class FileArchiveDialog : public DPIDialog +{ +public: + FileArchiveDialog(wxWindow* parent_window, mz_zip_archive* archive, std::vector>& selected_paths_w_size); + +protected: + void on_dpi_changed(const wxRect& suggested_rect) override; + + void on_open_button(); + void on_all_button(); + void on_none_button(); + + // chosen files are written into this vector and returned to caller via reference. + // path in archive and decompressed size. The size can be used to distinguish between files with same path. + std::vector>& m_selected_paths_w_size; + ArchiveViewCtrl* m_avc; +}; + +} // namespace GU +} // namespace Slic3r +#endif // slic3r_GUI_FileArchiveDialog_hpp_ \ No newline at end of file diff --git a/src/slic3r/GUI/FirmwareDialog.cpp b/src/slic3r/GUI/FirmwareDialog.cpp index 7600ef4fa63..47402644f4b 100644 --- a/src/slic3r/GUI/FirmwareDialog.cpp +++ b/src/slic3r/GUI/FirmwareDialog.cpp @@ -654,7 +654,7 @@ void FirmwareDialog::priv::perform_upload() } }) .on_message([ -#ifndef __APPLE__ +#if !defined(__APPLE__) && !defined(__clang__) // clang complains when capturing constants. extra_verbose, #endif // __APPLE__ diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 208dcdd05a8..62d4314dbf9 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -1,3953 +1,4268 @@ -#include "libslic3r/libslic3r.h" -#include "GCodeViewer.hpp" - -#include "libslic3r/BuildVolume.hpp" -#include "libslic3r/Print.hpp" -#include "libslic3r/Geometry.hpp" -#include "libslic3r/Model.hpp" -#include "libslic3r/Utils.hpp" -#include "libslic3r/LocalesUtils.hpp" -#include "libslic3r/PresetBundle.hpp" - -#include "GUI_App.hpp" -#include "MainFrame.hpp" -#include "Plater.hpp" -#include "Camera.hpp" -#include "I18N.hpp" -#include "GUI_Utils.hpp" -#include "GUI.hpp" -#include "DoubleSlider.hpp" -#include "GLCanvas3D.hpp" -#include "GLToolbar.hpp" -#include "GUI_Preview.hpp" -#include "GUI_ObjectManipulation.hpp" - -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -namespace Slic3r { -namespace GUI { - -static unsigned char buffer_id(EMoveType type) { - return static_cast(type) - static_cast(EMoveType::Retract); -} - -static EMoveType buffer_type(unsigned char id) { - return static_cast(static_cast(EMoveType::Retract) + id); -} - -static std::array decode_color(const std::string& color) { - static const float INV_255 = 1.0f / 255.0f; - - std::array ret = { 0.0f, 0.0f, 0.0f, 1.0f }; - const char* c = color.data() + 1; - if (color.size() == 7 && color.front() == '#') { - for (size_t j = 0; j < 3; ++j) { - int digit1 = hex_digit_to_int(*c++); - int digit2 = hex_digit_to_int(*c++); - if (digit1 == -1 || digit2 == -1) - break; - - ret[j] = float(digit1 * 16 + digit2) * INV_255; - } - } - return ret; -} - -static std::vector> decode_colors(const std::vector& colors) { - std::vector> output(colors.size(), { 0.0f, 0.0f, 0.0f, 1.0f }); - for (size_t i = 0; i < colors.size(); ++i) { - output[i] = decode_color(colors[i]); - } - return output; -} - -// Round to a bin with minimum two digits resolution. -// Equivalent to conversion to string with sprintf(buf, "%.2g", value) and conversion back to float, but faster. -static float round_to_bin(const float value) -{ -// assert(value > 0); - constexpr float const scale [5] = { 100.f, 1000.f, 10000.f, 100000.f, 1000000.f }; - constexpr float const invscale [5] = { 0.01f, 0.001f, 0.0001f, 0.00001f, 0.000001f }; - constexpr float const threshold[5] = { 0.095f, 0.0095f, 0.00095f, 0.000095f, 0.0000095f }; - // Scaling factor, pointer to the tables above. - int i = 0; - // While the scaling factor is not yet large enough to get two integer digits after scaling and rounding: - for (; value < threshold[i] && i < 4; ++ i) ; - return std::round(value * scale[i]) * invscale[i]; -} - -void GCodeViewer::VBuffer::reset() -{ - // release gpu memory - if (!vbos.empty()) { - glsafe(::glDeleteBuffers(static_cast(vbos.size()), static_cast(vbos.data()))); - vbos.clear(); - } - sizes.clear(); - count = 0; -} - -void GCodeViewer::InstanceVBuffer::Ranges::reset() -{ - for (Range& range : ranges) { - // release gpu memory - if (range.vbo > 0) - glsafe(::glDeleteBuffers(1, &range.vbo)); - } - - ranges.clear(); -} - -void GCodeViewer::InstanceVBuffer::reset() -{ - s_ids.clear(); - buffer.clear(); - render_ranges.reset(); -} - -void GCodeViewer::IBuffer::reset() -{ - // release gpu memory - if (ibo > 0) { - glsafe(::glDeleteBuffers(1, &ibo)); - ibo = 0; - } - - vbo = 0; - count = 0; -} - -bool GCodeViewer::Path::matches(const GCodeProcessorResult::MoveVertex& move) const -{ - auto matches_percent = [](float value1, float value2, float max_percent) { - return std::abs(value2 - value1) / value1 <= max_percent; - }; - - switch (move.type) - { - case EMoveType::Tool_change: - case EMoveType::Color_change: - case EMoveType::Pause_Print: - case EMoveType::Custom_GCode: - case EMoveType::Retract: - case EMoveType::Unretract: - case EMoveType::Seam: - case EMoveType::Extrude: { - // use rounding to reduce the number of generated paths - return type == move.type && extruder_id == move.extruder_id && cp_color_id == move.cp_color_id && role == move.extrusion_role && - move.position.z() <= sub_paths.front().first.position.z() && feedrate == move.feedrate && fan_speed == move.fan_speed && - height == round_to_bin(move.height) && width == round_to_bin(move.width) && - matches_percent(volumetric_rate, move.volumetric_rate(), 0.05f); - } - case EMoveType::Travel: { - return type == move.type && feedrate == move.feedrate && extruder_id == move.extruder_id && cp_color_id == move.cp_color_id; - } - default: { return false; } - } -} - -void GCodeViewer::TBuffer::Model::reset() -{ - instances.reset(); -} - -void GCodeViewer::TBuffer::reset() -{ - vertices.reset(); - for (IBuffer& buffer : indices) { - buffer.reset(); - } - - indices.clear(); - paths.clear(); - render_paths.clear(); - model.reset(); -} - -void GCodeViewer::TBuffer::add_path(const GCodeProcessorResult::MoveVertex& move, unsigned int b_id, size_t i_id, size_t s_id) -{ - Path::Endpoint endpoint = { b_id, i_id, s_id, move.position }; - // use rounding to reduce the number of generated paths - paths.push_back({ move.type, move.extrusion_role, move.delta_extruder, - round_to_bin(move.height), round_to_bin(move.width), - move.feedrate, move.fan_speed, move.temperature, - move.volumetric_rate(), move.extruder_id, move.cp_color_id, { { endpoint, endpoint } } }); -} - -GCodeViewer::Color GCodeViewer::Extrusions::Range::get_color_at(float value) const -{ - // Input value scaled to the colors range - const float step = step_size(); - const float global_t = (step != 0.0f) ? std::max(0.0f, value - min) / step : 0.0f; // lower limit of 0.0f - - const size_t color_max_idx = Range_Colors.size() - 1; - - // Compute the two colors just below (low) and above (high) the input value - const size_t color_low_idx = std::clamp(static_cast(global_t), 0, color_max_idx); - const size_t color_high_idx = std::clamp(color_low_idx + 1, 0, color_max_idx); - - // Compute how far the value is between the low and high colors so that they can be interpolated - const float local_t = std::clamp(global_t - static_cast(color_low_idx), 0.0f, 1.0f); - - // Interpolate between the low and high colors to find exactly which color the input value should get - Color ret = { 0.0f, 0.0f, 0.0f, 1.0f }; - for (unsigned int i = 0; i < 3; ++i) { - ret[i] = lerp(Range_Colors[color_low_idx][i], Range_Colors[color_high_idx][i], local_t); - } - return ret; -} - -GCodeViewer::SequentialRangeCap::~SequentialRangeCap() { - if (ibo > 0) - glsafe(::glDeleteBuffers(1, &ibo)); -} - -void GCodeViewer::SequentialRangeCap::reset() { - if (ibo > 0) - glsafe(::glDeleteBuffers(1, &ibo)); - - buffer = nullptr; - ibo = 0; - vbo = 0; - color = { 0.0f, 0.0f, 0.0f, 1.0f }; -} - -void GCodeViewer::SequentialView::Marker::init() -{ - m_model.init_from(stilized_arrow(16, 2.0f, 4.0f, 1.0f, 8.0f)); - m_model.set_color(-1, { 1.0f, 1.0f, 1.0f, 0.5f }); -} - -void GCodeViewer::SequentialView::Marker::set_world_position(const Vec3f& position) -{ - m_world_position = position; - m_world_transform = (Geometry::assemble_transform((position + m_z_offset * Vec3f::UnitZ()).cast()) * Geometry::assemble_transform(m_model.get_bounding_box().size().z() * Vec3d::UnitZ(), { M_PI, 0.0, 0.0 })).cast(); -} - -void GCodeViewer::SequentialView::Marker::render() const -{ - if (!m_visible) - return; - - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); - if (shader == nullptr) - return; - - glsafe(::glEnable(GL_BLEND)); - glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); - - shader->start_using(); - shader->set_uniform("emission_factor", 0.0f); - - glsafe(::glPushMatrix()); - glsafe(::glMultMatrixf(m_world_transform.data())); - - m_model.render(); - - glsafe(::glPopMatrix()); - - shader->stop_using(); - - glsafe(::glDisable(GL_BLEND)); - - static float last_window_width = 0.0f; - static size_t last_text_length = 0; - - ImGuiWrapper& imgui = *wxGetApp().imgui(); - Size cnv_size = wxGetApp().plater()->get_current_canvas3D()->get_canvas_size(); - imgui.set_next_window_pos(0.5f * static_cast(cnv_size.get_width()), static_cast(cnv_size.get_height()), ImGuiCond_Always, 0.5f, 1.0f); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); - ImGui::SetNextWindowBgAlpha(0.25f); - imgui.begin(std::string("ToolPosition"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove); - imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _u8L("Tool position") + ":"); - ImGui::SameLine(); - char buf[1024]; - const Vec3f position = m_world_position + m_world_offset; - sprintf(buf, "X: %.3f, Y: %.3f, Z: %.3f", position.x(), position.y(), position.z()); - imgui.text(std::string(buf)); - - // force extra frame to automatically update window size - float width = ImGui::GetWindowWidth(); - size_t length = strlen(buf); - if (width != last_window_width || length != last_text_length) { - last_window_width = width; - last_text_length = length; - imgui.set_requires_extra_frame(); - } - - imgui.end(); - ImGui::PopStyleVar(); -} - -void GCodeViewer::SequentialView::GCodeWindow::load_gcode(const std::string& filename, std::vector &&lines_ends) -{ - assert(! m_file.is_open()); - if (m_file.is_open()) - return; - - m_filename = filename; - m_lines_ends = std::move(lines_ends); - - m_selected_line_id = 0; - m_last_lines_size = 0; - - try - { - m_file.open(boost::filesystem::path(m_filename)); - } - catch (...) - { - BOOST_LOG_TRIVIAL(error) << "Unable to map file " << m_filename << ". Cannot show G-code window."; - reset(); - } -} - -void GCodeViewer::SequentialView::GCodeWindow::render(float top, float bottom, uint64_t curr_line_id) const -{ - auto update_lines = [this](uint64_t start_id, uint64_t end_id) { - std::vector ret; - ret.reserve(end_id - start_id + 1); - for (uint64_t id = start_id; id <= end_id; ++id) { - // read line from file - const size_t start = id == 1 ? 0 : m_lines_ends[id - 2]; - const size_t len = m_lines_ends[id - 1] - start; - std::string gline(m_file.data() + start, len); - - std::string command; - std::string parameters; - std::string comment; - - // extract comment - std::vector tokens; - boost::split(tokens, gline, boost::is_any_of(";"), boost::token_compress_on); - command = tokens.front(); - if (tokens.size() > 1) - comment = ";" + tokens.back(); - - // extract gcode command and parameters - if (!command.empty()) { - boost::split(tokens, command, boost::is_any_of(" "), boost::token_compress_on); - command = tokens.front(); - if (tokens.size() > 1) { - for (size_t i = 1; i < tokens.size(); ++i) { - parameters += " " + tokens[i]; - } - } - } - ret.push_back({ command, parameters, comment }); - } - return ret; - }; - - static const ImVec4 LINE_NUMBER_COLOR = ImGuiWrapper::COL_ORANGE_LIGHT; - static const ImVec4 SELECTION_RECT_COLOR = ImGuiWrapper::COL_ORANGE_DARK; - static const ImVec4 COMMAND_COLOR = { 0.8f, 0.8f, 0.0f, 1.0f }; - static const ImVec4 PARAMETERS_COLOR = { 1.0f, 1.0f, 1.0f, 1.0f }; - static const ImVec4 COMMENT_COLOR = { 0.7f, 0.7f, 0.7f, 1.0f }; - - if (!m_visible || m_filename.empty() || m_lines_ends.empty() || curr_line_id == 0) - return; - - // window height - const float wnd_height = bottom - top; - - // number of visible lines - const float text_height = ImGui::CalcTextSize("0").y; - const ImGuiStyle& style = ImGui::GetStyle(); - const uint64_t lines_count = static_cast((wnd_height - 2.0f * style.WindowPadding.y + style.ItemSpacing.y) / (text_height + style.ItemSpacing.y)); - - if (lines_count == 0) - return; - - // visible range - const uint64_t half_lines_count = lines_count / 2; - uint64_t start_id = (curr_line_id >= half_lines_count) ? curr_line_id - half_lines_count : 0; - uint64_t end_id = start_id + lines_count - 1; - if (end_id >= static_cast(m_lines_ends.size())) { - end_id = static_cast(m_lines_ends.size()) - 1; - start_id = end_id - lines_count + 1; - } - - // updates list of lines to show, if needed - if (m_selected_line_id != curr_line_id || m_last_lines_size != end_id - start_id + 1) { - try - { - *const_cast*>(&m_lines) = update_lines(start_id, end_id); - } - catch (...) - { - BOOST_LOG_TRIVIAL(error) << "Error while loading from file " << m_filename << ". Cannot show G-code window."; - return; - } - *const_cast(&m_selected_line_id) = curr_line_id; - *const_cast(&m_last_lines_size) = m_lines.size(); - } - - // line number's column width - const float id_width = ImGui::CalcTextSize(std::to_string(end_id).c_str()).x; - - ImGuiWrapper& imgui = *wxGetApp().imgui(); - - imgui.set_next_window_pos(0.0f, top, ImGuiCond_Always, 0.0f, 0.0f); - imgui.set_next_window_size(0.0f, wnd_height, ImGuiCond_Always); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); - ImGui::SetNextWindowBgAlpha(0.6f); - imgui.begin(std::string("G-code"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove); - - // center the text in the window by pushing down the first line - const float f_lines_count = static_cast(lines_count); - ImGui::SetCursorPosY(0.5f * (wnd_height - f_lines_count * text_height - (f_lines_count - 1.0f) * style.ItemSpacing.y)); - - // render text lines - for (uint64_t id = start_id; id <= end_id; ++id) { - const Line& line = m_lines[id - start_id]; - - // rect around the current selected line - if (id == curr_line_id) { - const float pos_y = ImGui::GetCursorScreenPos().y; - const float half_ItemSpacing_y = 0.5f * style.ItemSpacing.y; - const float half_padding_x = 0.5f * style.WindowPadding.x; - ImGui::GetWindowDrawList()->AddRect({ half_padding_x, pos_y - half_ItemSpacing_y }, - { ImGui::GetCurrentWindow()->Size.x - half_padding_x, pos_y + text_height + half_ItemSpacing_y }, - ImGui::GetColorU32(SELECTION_RECT_COLOR)); - } - - // render line number - const std::string id_str = std::to_string(id); - // spacer to right align text - ImGui::Dummy({ id_width - ImGui::CalcTextSize(id_str.c_str()).x, text_height }); - ImGui::SameLine(0.0f, 0.0f); - ImGui::PushStyleColor(ImGuiCol_Text, LINE_NUMBER_COLOR); - imgui.text(id_str); - ImGui::PopStyleColor(); - - if (!line.command.empty() || !line.comment.empty()) - ImGui::SameLine(); - - // render command - if (!line.command.empty()) { - ImGui::PushStyleColor(ImGuiCol_Text, COMMAND_COLOR); - imgui.text(line.command); - ImGui::PopStyleColor(); - } - - // render parameters - if (!line.parameters.empty()) { - ImGui::SameLine(0.0f, 0.0f); - ImGui::PushStyleColor(ImGuiCol_Text, PARAMETERS_COLOR); - imgui.text(line.parameters); - ImGui::PopStyleColor(); - } - - // render comment - if (!line.comment.empty()) { - if (!line.command.empty()) - ImGui::SameLine(0.0f, 0.0f); - ImGui::PushStyleColor(ImGuiCol_Text, COMMENT_COLOR); - imgui.text(line.comment); - ImGui::PopStyleColor(); - } - } - - imgui.end(); - ImGui::PopStyleVar(); -} - -void GCodeViewer::SequentialView::GCodeWindow::stop_mapping_file() -{ - if (m_file.is_open()) - m_file.close(); -} - -void GCodeViewer::SequentialView::render(float legend_height) const -{ - marker.render(); - float bottom = wxGetApp().plater()->get_current_canvas3D()->get_canvas_size().get_height(); - if (wxGetApp().is_editor()) - bottom -= wxGetApp().plater()->get_view_toolbar().get_height(); - gcode_window.render(legend_height, bottom, static_cast(gcode_ids[current.last])); -} - -const std::vector GCodeViewer::Extrusion_Role_Colors {{ - { 0.90f, 0.70f, 0.70f, 1.0f }, // erNone - { 1.00f, 0.90f, 0.30f, 1.0f }, // erPerimeter - { 1.00f, 0.49f, 0.22f, 1.0f }, // erExternalPerimeter - { 0.12f, 0.12f, 1.00f, 1.0f }, // erOverhangPerimeter - { 0.69f, 0.19f, 0.16f, 1.0f }, // erInternalInfill - { 0.59f, 0.33f, 0.80f, 1.0f }, // erSolidInfill - { 0.94f, 0.25f, 0.25f, 1.0f }, // erTopSolidInfill - { 1.00f, 0.55f, 0.41f, 1.0f }, // erIroning - { 0.30f, 0.50f, 0.73f, 1.0f }, // erBridgeInfill - { 1.00f, 1.00f, 1.00f, 1.0f }, // erGapFill - { 0.00f, 0.53f, 0.43f, 1.0f }, // erSkirt - { 0.00f, 1.00f, 0.00f, 1.0f }, // erSupportMaterial - { 0.00f, 0.50f, 0.00f, 1.0f }, // erSupportMaterialInterface - { 0.70f, 0.89f, 0.67f, 1.0f }, // erWipeTower - { 0.37f, 0.82f, 0.58f, 1.0f }, // erCustom - { 0.00f, 0.00f, 0.00f, 1.0f } // erMixed -}}; - -const std::vector GCodeViewer::Options_Colors {{ - { 0.803f, 0.135f, 0.839f, 1.0f }, // Retractions - { 0.287f, 0.679f, 0.810f, 1.0f }, // Unretractions - { 0.900f, 0.900f, 0.900f, 1.0f }, // Seams - { 0.758f, 0.744f, 0.389f, 1.0f }, // ToolChanges - { 0.856f, 0.582f, 0.546f, 1.0f }, // ColorChanges - { 0.322f, 0.942f, 0.512f, 1.0f }, // PausePrints - { 0.886f, 0.825f, 0.262f, 1.0f } // CustomGCodes -}}; - -const std::vector GCodeViewer::Travel_Colors {{ - { 0.219f, 0.282f, 0.609f, 1.0f }, // Move - { 0.112f, 0.422f, 0.103f, 1.0f }, // Extrude - { 0.505f, 0.064f, 0.028f, 1.0f } // Retract -}}; - -#if 1 -// Normal ranges -const std::vector GCodeViewer::Range_Colors {{ - { 0.043f, 0.173f, 0.478f, 1.0f }, // bluish - { 0.075f, 0.349f, 0.522f, 1.0f }, - { 0.110f, 0.533f, 0.569f, 1.0f }, - { 0.016f, 0.839f, 0.059f, 1.0f }, - { 0.667f, 0.949f, 0.000f, 1.0f }, - { 0.988f, 0.975f, 0.012f, 1.0f }, - { 0.961f, 0.808f, 0.039f, 1.0f }, - { 0.890f, 0.533f, 0.125f, 1.0f }, - { 0.820f, 0.408f, 0.188f, 1.0f }, - { 0.761f, 0.322f, 0.235f, 1.0f }, - { 0.581f, 0.149f, 0.087f, 1.0f } // reddish -}}; -#else -// Detailed ranges -const std::vector GCodeViewer::Range_Colors{ { - { 0.043f, 0.173f, 0.478f, 1.0f }, // bluish - { 0.5f * (0.043f + 0.075f), 0.5f * (0.173f + 0.349f), 0.5f * (0.478f + 0.522f), 1.0f }, - { 0.075f, 0.349f, 0.522f, 1.0f }, - { 0.5f * (0.075f + 0.110f), 0.5f * (0.349f + 0.533f), 0.5f * (0.522f + 0.569f), 1.0f }, - { 0.110f, 0.533f, 0.569f, 1.0f }, - { 0.5f * (0.110f + 0.016f), 0.5f * (0.533f + 0.839f), 0.5f * (0.569f + 0.059f), 1.0f }, - { 0.016f, 0.839f, 0.059f, 1.0f }, - { 0.5f * (0.016f + 0.667f), 0.5f * (0.839f + 0.949f), 0.5f * (0.059f + 0.000f), 1.0f }, - { 0.667f, 0.949f, 0.000f, 1.0f }, - { 0.5f * (0.667f + 0.988f), 0.5f * (0.949f + 0.975f), 0.5f * (0.000f + 0.012f), 1.0f }, - { 0.988f, 0.975f, 0.012f, 1.0f }, - { 0.5f * (0.988f + 0.961f), 0.5f * (0.975f + 0.808f), 0.5f * (0.012f + 0.039f), 1.0f }, - { 0.961f, 0.808f, 0.039f, 1.0f }, - { 0.5f * (0.961f + 0.890f), 0.5f * (0.808f + 0.533f), 0.5f * (0.039f + 0.125f), 1.0f }, - { 0.890f, 0.533f, 0.125f, 1.0f }, - { 0.5f * (0.890f + 0.820f), 0.5f * (0.533f + 0.408f), 0.5f * (0.125f + 0.188f), 1.0f }, - { 0.820f, 0.408f, 0.188f, 1.0f }, - { 0.5f * (0.820f + 0.761f), 0.5f * (0.408f + 0.322f), 0.5f * (0.188f + 0.235f), 1.0f }, - { 0.761f, 0.322f, 0.235f, 1.0f }, - { 0.5f * (0.761f + 0.581f), 0.5f * (0.322f + 0.149f), 0.5f * (0.235f + 0.087f), 1.0f }, - { 0.581f, 0.149f, 0.087f, 1.0f } // reddishgit -} }; -#endif - -const GCodeViewer::Color GCodeViewer::Wipe_Color = { 1.0f, 1.0f, 0.0f, 1.0f }; -const GCodeViewer::Color GCodeViewer::Neutral_Color = { 0.25f, 0.25f, 0.25f, 1.0f }; - -GCodeViewer::GCodeViewer() -{ - m_extrusions.reset_role_visibility_flags(); - -// m_sequential_view.skip_invisible_moves = true; -} - -void GCodeViewer::init() -{ - if (m_gl_data_initialized) - return; - - // initializes opengl data of TBuffers - for (size_t i = 0; i < m_buffers.size(); ++i) { - TBuffer& buffer = m_buffers[i]; - EMoveType type = buffer_type(i); - switch (type) - { - default: { break; } - case EMoveType::Tool_change: - case EMoveType::Color_change: - case EMoveType::Pause_Print: - case EMoveType::Custom_GCode: - case EMoveType::Retract: - case EMoveType::Unretract: - case EMoveType::Seam: { -// if (wxGetApp().is_gl_version_greater_or_equal_to(3, 3)) { -// buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::InstancedModel; -// buffer.shader = "gouraud_light_instanced"; -// buffer.model.model.init_from(diamond(16)); -// buffer.model.color = option_color(type); -// buffer.model.instances.format = InstanceVBuffer::EFormat::InstancedModel; -// } -// else { - buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::BatchedModel; - buffer.vertices.format = VBuffer::EFormat::PositionNormal3; - buffer.shader = "gouraud_light"; - - buffer.model.data = diamond(16); - buffer.model.color = option_color(type); - buffer.model.instances.format = InstanceVBuffer::EFormat::BatchedModel; -// } - break; - } - case EMoveType::Wipe: - case EMoveType::Extrude: { - buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Triangle; - buffer.vertices.format = VBuffer::EFormat::PositionNormal3; - buffer.shader = "gouraud_light"; - break; - } - case EMoveType::Travel: { - buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Line; - buffer.vertices.format = VBuffer::EFormat::PositionNormal3; - buffer.shader = "toolpaths_lines"; - break; - } - } - - set_toolpath_move_type_visible(EMoveType::Extrude, true); - } - - // initializes tool marker - m_sequential_view.marker.init(); - - // initializes point sizes - std::array point_sizes; - ::glGetIntegerv(GL_ALIASED_POINT_SIZE_RANGE, point_sizes.data()); - m_detected_point_sizes = { static_cast(point_sizes[0]), static_cast(point_sizes[1]) }; - - m_gl_data_initialized = true; -} - -void GCodeViewer::load(const GCodeProcessorResult& gcode_result, const Print& print, bool initialized) -{ - // avoid processing if called with the same gcode_result - if (m_last_result_id == gcode_result.id) - return; - - m_last_result_id = gcode_result.id; - - // release gpu memory, if used - reset(); - - m_sequential_view.gcode_window.load_gcode(gcode_result.filename, - // Stealing out lines_ends should be safe because this gcode_result is processed only once (see the 1st if in this function). - std::move(const_cast&>(gcode_result.lines_ends))); - - if (wxGetApp().is_gcode_viewer()) - m_custom_gcode_per_print_z = gcode_result.custom_gcode_per_print_z; - - m_max_print_height = gcode_result.max_print_height; - - load_toolpaths(gcode_result); - - if (m_layers.empty()) - return; - - m_settings_ids = gcode_result.settings_ids; - m_filament_diameters = gcode_result.filament_diameters; - m_filament_densities = gcode_result.filament_densities; - - if (wxGetApp().is_editor()) - load_shells(print, initialized); - else { - Pointfs bed_shape; - std::string texture; - std::string model; - - if (!gcode_result.bed_shape.empty()) { - // bed shape detected in the gcode - bed_shape = gcode_result.bed_shape; - const auto bundle = wxGetApp().preset_bundle; - if (bundle != nullptr && !m_settings_ids.printer.empty()) { - const Preset* preset = bundle->printers.find_preset(m_settings_ids.printer); - if (preset != nullptr) { - model = PresetUtils::system_printer_bed_model(*preset); - texture = PresetUtils::system_printer_bed_texture(*preset); - } - } - } - else { - // adjust printbed size in dependence of toolpaths bbox - const double margin = 10.0; - const Vec2d min(m_paths_bounding_box.min.x() - margin, m_paths_bounding_box.min.y() - margin); - const Vec2d max(m_paths_bounding_box.max.x() + margin, m_paths_bounding_box.max.y() + margin); - - const Vec2d size = max - min; - bed_shape = { - { min.x(), min.y() }, - { max.x(), min.y() }, - { max.x(), min.y() + 0.442265 * size.y()}, - { max.x() - 10.0, min.y() + 0.4711325 * size.y()}, - { max.x() + 10.0, min.y() + 0.5288675 * size.y()}, - { max.x(), min.y() + 0.557735 * size.y()}, - { max.x(), max.y() }, - { min.x() + 0.557735 * size.x(), max.y()}, - { min.x() + 0.5288675 * size.x(), max.y() - 10.0}, - { min.x() + 0.4711325 * size.x(), max.y() + 10.0}, - { min.x() + 0.442265 * size.x(), max.y()}, - { min.x(), max.y() } }; - } - - wxGetApp().plater()->set_bed_shape(bed_shape, gcode_result.max_print_height, texture, model, gcode_result.bed_shape.empty()); - } - - m_print_statistics = gcode_result.print_statistics; - - if (m_time_estimate_mode != PrintEstimatedStatistics::ETimeMode::Normal) { - const float time = m_print_statistics.modes[static_cast(m_time_estimate_mode)].time; - if (time == 0.0f || - short_time(get_time_dhms(time)) == short_time(get_time_dhms(m_print_statistics.modes[static_cast(PrintEstimatedStatistics::ETimeMode::Normal)].time))) - m_time_estimate_mode = PrintEstimatedStatistics::ETimeMode::Normal; - } -} - -void GCodeViewer::refresh(const GCodeProcessorResult& gcode_result, const std::vector& str_tool_colors) -{ -#if ENABLE_GCODE_VIEWER_STATISTICS - auto start_time = std::chrono::high_resolution_clock::now(); -#endif // ENABLE_GCODE_VIEWER_STATISTICS - - if (m_moves_count == 0) - return; - - wxBusyCursor busy; - - if (m_view_type == EViewType::Tool && !gcode_result.extruder_colors.empty()) - // update tool colors from config stored in the gcode - m_tool_colors = decode_colors(gcode_result.extruder_colors); - else - // update tool colors - m_tool_colors = decode_colors(str_tool_colors); - - // ensure there are enough colors defined - while (m_tool_colors.size() < std::max(size_t(1), gcode_result.extruders_count)) - m_tool_colors.push_back(decode_color("#FF8000")); - - // update ranges for coloring / legend - m_extrusions.reset_ranges(); - for (size_t i = 0; i < m_moves_count; ++i) { - // skip first vertex - if (i == 0) - continue; - - const GCodeProcessorResult::MoveVertex& curr = gcode_result.moves[i]; - - switch (curr.type) - { - case EMoveType::Extrude: - { - m_extrusions.ranges.height.update_from(round_to_bin(curr.height)); - m_extrusions.ranges.width.update_from(round_to_bin(curr.width)); - m_extrusions.ranges.fan_speed.update_from(curr.fan_speed); - m_extrusions.ranges.temperature.update_from(curr.temperature); - if (curr.extrusion_role != erCustom || is_visible(erCustom)) - m_extrusions.ranges.volumetric_rate.update_from(round_to_bin(curr.volumetric_rate())); - [[fallthrough]]; - } - case EMoveType::Travel: - { - if (m_buffers[buffer_id(curr.type)].visible) - m_extrusions.ranges.feedrate.update_from(curr.feedrate); - - break; - } - default: { break; } - } - } - -#if ENABLE_GCODE_VIEWER_STATISTICS - m_statistics.refresh_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); -#endif // ENABLE_GCODE_VIEWER_STATISTICS - - // update buffers' render paths - refresh_render_paths(); - log_memory_used("Refreshed G-code extrusion paths, "); -} - -void GCodeViewer::refresh_render_paths() -{ - refresh_render_paths(false, false); -} - -void GCodeViewer::update_shells_color_by_extruder(const DynamicPrintConfig* config) -{ - if (config != nullptr) - m_shells.volumes.update_colors_by_extruder(config); -} - -void GCodeViewer::reset() -{ - m_moves_count = 0; - for (TBuffer& buffer : m_buffers) { - buffer.reset(); - } - - m_paths_bounding_box = BoundingBoxf3(); - m_max_bounding_box = BoundingBoxf3(); - m_max_print_height = 0.0f; - m_tool_colors = std::vector(); - m_extruders_count = 0; - m_extruder_ids = std::vector(); - m_filament_diameters = std::vector(); - m_filament_densities = std::vector(); - m_extrusions.reset_ranges(); - m_shells.volumes.clear(); - m_layers.reset(); - m_layers_z_range = { 0, 0 }; - m_roles = std::vector(); - m_print_statistics.reset(); - m_custom_gcode_per_print_z = std::vector(); - m_sequential_view.gcode_window.reset(); -#if ENABLE_GCODE_VIEWER_STATISTICS - m_statistics.reset_all(); -#endif // ENABLE_GCODE_VIEWER_STATISTICS - m_contained_in_bed = true; -} - -void GCodeViewer::render() -{ -#if ENABLE_GCODE_VIEWER_STATISTICS - m_statistics.reset_opengl(); - m_statistics.total_instances_gpu_size = 0; -#endif // ENABLE_GCODE_VIEWER_STATISTICS - - if (m_roles.empty()) - return; - - glsafe(::glEnable(GL_DEPTH_TEST)); - render_toolpaths(); - render_shells(); - float legend_height = 0.0f; - render_legend(legend_height); - if (m_sequential_view.current.last != m_sequential_view.endpoints.last) { - m_sequential_view.marker.set_world_position(m_sequential_view.current_position); - m_sequential_view.marker.set_world_offset(m_sequential_view.current_offset); - m_sequential_view.render(legend_height); - } -#if ENABLE_GCODE_VIEWER_STATISTICS - render_statistics(); -#endif // ENABLE_GCODE_VIEWER_STATISTICS -} - -bool GCodeViewer::can_export_toolpaths() const -{ - return has_data() && m_buffers[buffer_id(EMoveType::Extrude)].render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle; -} - -void GCodeViewer::update_sequential_view_current(unsigned int first, unsigned int last) -{ - auto is_visible = [this](unsigned int id) { - for (const TBuffer& buffer : m_buffers) { - if (buffer.visible) { - for (const Path& path : buffer.paths) { - if (path.sub_paths.front().first.s_id <= id && id <= path.sub_paths.back().last.s_id) - return true; - } - } - } - return false; - }; - - const int first_diff = static_cast(first) - static_cast(m_sequential_view.last_current.first); - const int last_diff = static_cast(last) - static_cast(m_sequential_view.last_current.last); - - unsigned int new_first = first; - unsigned int new_last = last; - - if (m_sequential_view.skip_invisible_moves) { - while (!is_visible(new_first)) { - if (first_diff > 0) - ++new_first; - else - --new_first; - } - - while (!is_visible(new_last)) { - if (last_diff > 0) - ++new_last; - else - --new_last; - } - } - - m_sequential_view.current.first = new_first; - m_sequential_view.current.last = new_last; - m_sequential_view.last_current = m_sequential_view.current; - - refresh_render_paths(true, true); - - if (new_first != first || new_last != last) - wxGetApp().plater()->update_preview_moves_slider(); -} - -bool GCodeViewer::is_toolpath_move_type_visible(EMoveType type) const -{ - size_t id = static_cast(buffer_id(type)); - return (id < m_buffers.size()) ? m_buffers[id].visible : false; -} - -void GCodeViewer::set_toolpath_move_type_visible(EMoveType type, bool visible) -{ - size_t id = static_cast(buffer_id(type)); - if (id < m_buffers.size()) - m_buffers[id].visible = visible; -} - -unsigned int GCodeViewer::get_options_visibility_flags() const -{ - auto set_flag = [](unsigned int flags, unsigned int flag, bool active) { - return active ? (flags | (1 << flag)) : flags; - }; - - unsigned int flags = 0; - flags = set_flag(flags, static_cast(Preview::OptionType::Travel), is_toolpath_move_type_visible(EMoveType::Travel)); - flags = set_flag(flags, static_cast(Preview::OptionType::Wipe), is_toolpath_move_type_visible(EMoveType::Wipe)); - flags = set_flag(flags, static_cast(Preview::OptionType::Retractions), is_toolpath_move_type_visible(EMoveType::Retract)); - flags = set_flag(flags, static_cast(Preview::OptionType::Unretractions), is_toolpath_move_type_visible(EMoveType::Unretract)); - flags = set_flag(flags, static_cast(Preview::OptionType::Seams), is_toolpath_move_type_visible(EMoveType::Seam)); - flags = set_flag(flags, static_cast(Preview::OptionType::ToolChanges), is_toolpath_move_type_visible(EMoveType::Tool_change)); - flags = set_flag(flags, static_cast(Preview::OptionType::ColorChanges), is_toolpath_move_type_visible(EMoveType::Color_change)); - flags = set_flag(flags, static_cast(Preview::OptionType::PausePrints), is_toolpath_move_type_visible(EMoveType::Pause_Print)); - flags = set_flag(flags, static_cast(Preview::OptionType::CustomGCodes), is_toolpath_move_type_visible(EMoveType::Custom_GCode)); - flags = set_flag(flags, static_cast(Preview::OptionType::Shells), m_shells.visible); - flags = set_flag(flags, static_cast(Preview::OptionType::ToolMarker), m_sequential_view.marker.is_visible()); - flags = set_flag(flags, static_cast(Preview::OptionType::Legend), is_legend_enabled()); - return flags; -} - -void GCodeViewer::set_options_visibility_from_flags(unsigned int flags) -{ - auto is_flag_set = [flags](unsigned int flag) { - return (flags & (1 << flag)) != 0; - }; - - set_toolpath_move_type_visible(EMoveType::Travel, is_flag_set(static_cast(Preview::OptionType::Travel))); - set_toolpath_move_type_visible(EMoveType::Wipe, is_flag_set(static_cast(Preview::OptionType::Wipe))); - set_toolpath_move_type_visible(EMoveType::Retract, is_flag_set(static_cast(Preview::OptionType::Retractions))); - set_toolpath_move_type_visible(EMoveType::Unretract, is_flag_set(static_cast(Preview::OptionType::Unretractions))); - set_toolpath_move_type_visible(EMoveType::Seam, is_flag_set(static_cast(Preview::OptionType::Seams))); - set_toolpath_move_type_visible(EMoveType::Tool_change, is_flag_set(static_cast(Preview::OptionType::ToolChanges))); - set_toolpath_move_type_visible(EMoveType::Color_change, is_flag_set(static_cast(Preview::OptionType::ColorChanges))); - set_toolpath_move_type_visible(EMoveType::Pause_Print, is_flag_set(static_cast(Preview::OptionType::PausePrints))); - set_toolpath_move_type_visible(EMoveType::Custom_GCode, is_flag_set(static_cast(Preview::OptionType::CustomGCodes))); - m_shells.visible = is_flag_set(static_cast(Preview::OptionType::Shells)); - m_sequential_view.marker.set_visible(is_flag_set(static_cast(Preview::OptionType::ToolMarker))); - enable_legend(is_flag_set(static_cast(Preview::OptionType::Legend))); -} - -void GCodeViewer::set_layers_z_range(const std::array& layers_z_range) -{ - bool keep_sequential_current_first = layers_z_range[0] >= m_layers_z_range[0]; - bool keep_sequential_current_last = layers_z_range[1] <= m_layers_z_range[1]; - m_layers_z_range = layers_z_range; - refresh_render_paths(keep_sequential_current_first, keep_sequential_current_last); - wxGetApp().plater()->update_preview_moves_slider(); -} - -void GCodeViewer::export_toolpaths_to_obj(const char* filename) const -{ - if (filename == nullptr) - return; - - if (!has_data()) - return; - - wxBusyCursor busy; - - // the data needed is contained into the Extrude TBuffer - const TBuffer& t_buffer = m_buffers[buffer_id(EMoveType::Extrude)]; - if (!t_buffer.has_data()) - return; - - if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Triangle) - return; - - // collect color information to generate materials - std::vector colors; - for (const RenderPath& path : t_buffer.render_paths) { - colors.push_back(path.color); - } - sort_remove_duplicates(colors); - - // save materials file - boost::filesystem::path mat_filename(filename); - mat_filename.replace_extension("mtl"); - - CNumericLocalesSetter locales_setter; - - FILE* fp = boost::nowide::fopen(mat_filename.string().c_str(), "w"); - if (fp == nullptr) { - BOOST_LOG_TRIVIAL(error) << "GCodeViewer::export_toolpaths_to_obj: Couldn't open " << mat_filename.string().c_str() << " for writing"; - return; - } - - fprintf(fp, "# G-Code Toolpaths Materials\n"); - fprintf(fp, "# Generated by %s-%s based on Slic3r\n", SLIC3R_APP_NAME, SLIC3R_VERSION); - - unsigned int colors_count = 1; - for (const Color& color : colors) { - fprintf(fp, "\nnewmtl material_%d\n", colors_count++); - fprintf(fp, "Ka 1 1 1\n"); - fprintf(fp, "Kd %g %g %g\n", color[0], color[1], color[2]); - fprintf(fp, "Ks 0 0 0\n"); - } - - fclose(fp); - - // save geometry file - fp = boost::nowide::fopen(filename, "w"); - if (fp == nullptr) { - BOOST_LOG_TRIVIAL(error) << "GCodeViewer::export_toolpaths_to_obj: Couldn't open " << filename << " for writing"; - return; - } - - fprintf(fp, "# G-Code Toolpaths\n"); - fprintf(fp, "# Generated by %s-%s based on Slic3r\n", SLIC3R_APP_NAME, SLIC3R_VERSION); - fprintf(fp, "\nmtllib ./%s\n", mat_filename.filename().string().c_str()); - - const size_t floats_per_vertex = t_buffer.vertices.vertex_size_floats(); - - std::vector out_vertices; - std::vector out_normals; - - struct VerticesOffset - { - unsigned int vbo; - size_t offset; - }; - std::vector vertices_offsets; - vertices_offsets.push_back({ t_buffer.vertices.vbos.front(), 0 }); - - // get vertices/normals data from vertex buffers on gpu - for (size_t i = 0; i < t_buffer.vertices.vbos.size(); ++i) { - const size_t floats_count = t_buffer.vertices.sizes[i] / sizeof(float); - VertexBuffer vertices(floats_count); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, t_buffer.vertices.vbos[i])); - glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, 0, static_cast(t_buffer.vertices.sizes[i]), static_cast(vertices.data()))); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); - const size_t vertices_count = floats_count / floats_per_vertex; - for (size_t j = 0; j < vertices_count; ++j) { - const size_t base = j * floats_per_vertex; - out_vertices.push_back({ vertices[base + 0], vertices[base + 1], vertices[base + 2] }); - out_normals.push_back({ vertices[base + 3], vertices[base + 4], vertices[base + 5] }); - } - - if (i < t_buffer.vertices.vbos.size() - 1) - vertices_offsets.push_back({ t_buffer.vertices.vbos[i + 1], vertices_offsets.back().offset + vertices_count }); - } - - // save vertices to file - fprintf(fp, "\n# vertices\n"); - for (const Vec3f& v : out_vertices) { - fprintf(fp, "v %g %g %g\n", v.x(), v.y(), v.z()); - } - - // save normals to file - fprintf(fp, "\n# normals\n"); - for (const Vec3f& n : out_normals) { - fprintf(fp, "vn %g %g %g\n", n.x(), n.y(), n.z()); - } - - size_t i = 0; - for (const Color& color : colors) { - // save material triangles to file - fprintf(fp, "\nusemtl material_%zu\n", i + 1); - fprintf(fp, "# triangles material %zu\n", i + 1); - - for (const RenderPath& render_path : t_buffer.render_paths) { - if (render_path.color != color) - continue; - - const IBuffer& ibuffer = t_buffer.indices[render_path.ibuffer_id]; - size_t vertices_offset = 0; - for (size_t j = 0; j < vertices_offsets.size(); ++j) { - const VerticesOffset& offset = vertices_offsets[j]; - if (offset.vbo == ibuffer.vbo) { - vertices_offset = offset.offset; - break; - } - } - - // get indices data from index buffer on gpu - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuffer.ibo)); - for (size_t j = 0; j < render_path.sizes.size(); ++j) { - IndexBuffer indices(render_path.sizes[j]); - glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast(render_path.offsets[j]), - static_cast(render_path.sizes[j] * sizeof(IBufferType)), static_cast(indices.data()))); - - const size_t triangles_count = render_path.sizes[j] / 3; - for (size_t k = 0; k < triangles_count; ++k) { - const size_t base = k * 3; - const size_t v1 = 1 + static_cast(indices[base + 0]) + vertices_offset; - const size_t v2 = 1 + static_cast(indices[base + 1]) + vertices_offset; - const size_t v3 = 1 + static_cast(indices[base + 2]) + vertices_offset; - if (v1 != v2) - // do not export dummy triangles - fprintf(fp, "f %zu//%zu %zu//%zu %zu//%zu\n", v1, v1, v2, v2, v3, v3); - } - } - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - } - ++i; - } - - fclose(fp); -} - -void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) -{ - // max index buffer size, in bytes - static const size_t IBUFFER_THRESHOLD_BYTES = 64 * 1024 * 1024; - - auto log_memory_usage = [this](const std::string& label, const std::vector& vertices, const std::vector& indices) { - int64_t vertices_size = 0; - for (const MultiVertexBuffer& buffers : vertices) { - for (const VertexBuffer& buffer : buffers) { - vertices_size += SLIC3R_STDVEC_MEMSIZE(buffer, float); - } - } - int64_t indices_size = 0; - for (const MultiIndexBuffer& buffers : indices) { - for (const IndexBuffer& buffer : buffers) { - indices_size += SLIC3R_STDVEC_MEMSIZE(buffer, IBufferType); - } - } - log_memory_used(label, vertices_size + indices_size); - }; - - // format data into the buffers to be rendered as points - auto add_vertices_as_point = [](const GCodeProcessorResult::MoveVertex& curr, VertexBuffer& vertices) { - vertices.push_back(curr.position.x()); - vertices.push_back(curr.position.y()); - vertices.push_back(curr.position.z()); - }; - auto add_indices_as_point = [](const GCodeProcessorResult::MoveVertex& curr, TBuffer& buffer, - unsigned int ibuffer_id, IndexBuffer& indices, size_t move_id) { - buffer.add_path(curr, ibuffer_id, indices.size(), move_id); - indices.push_back(static_cast(indices.size())); - }; - - // format data into the buffers to be rendered as lines - auto add_vertices_as_line = [](const GCodeProcessorResult::MoveVertex& prev, const GCodeProcessorResult::MoveVertex& curr, VertexBuffer& vertices) { - // x component of the normal to the current segment (the normal is parallel to the XY plane) - const Vec3f dir = (curr.position - prev.position).normalized(); - Vec3f normal(dir.y(), -dir.x(), 0.0); - normal.normalize(); - - auto add_vertex = [&vertices, &normal](const GCodeProcessorResult::MoveVertex& vertex) { - // add position - vertices.push_back(vertex.position.x()); - vertices.push_back(vertex.position.y()); - vertices.push_back(vertex.position.z()); - // add normal - vertices.push_back(normal.x()); - vertices.push_back(normal.y()); - vertices.push_back(normal.z()); - }; - - // add previous vertex - add_vertex(prev); - // add current vertex - add_vertex(curr); - }; - auto add_indices_as_line = [](const GCodeProcessorResult::MoveVertex& prev, const GCodeProcessorResult::MoveVertex& curr, TBuffer& buffer, - unsigned int ibuffer_id, IndexBuffer& indices, size_t move_id) { - if (buffer.paths.empty() || prev.type != curr.type || !buffer.paths.back().matches(curr)) { - // add starting index - indices.push_back(static_cast(indices.size())); - buffer.add_path(curr, ibuffer_id, indices.size() - 1, move_id - 1); - buffer.paths.back().sub_paths.front().first.position = prev.position; - } - - Path& last_path = buffer.paths.back(); - if (last_path.sub_paths.front().first.i_id != last_path.sub_paths.back().last.i_id) { - // add previous index - indices.push_back(static_cast(indices.size())); - } - - // add current index - indices.push_back(static_cast(indices.size())); - last_path.sub_paths.back().last = { ibuffer_id, indices.size() - 1, move_id, curr.position }; - }; - - // format data into the buffers to be rendered as solid - auto add_vertices_as_solid = [](const GCodeProcessorResult::MoveVertex& prev, const GCodeProcessorResult::MoveVertex& curr, TBuffer& buffer, unsigned int vbuffer_id, VertexBuffer& vertices, size_t move_id) { - auto store_vertex = [](VertexBuffer& vertices, const Vec3f& position, const Vec3f& normal) { - // append position - vertices.push_back(position.x()); - vertices.push_back(position.y()); - vertices.push_back(position.z()); - // append normal - vertices.push_back(normal.x()); - vertices.push_back(normal.y()); - vertices.push_back(normal.z()); - }; - - if (buffer.paths.empty() || prev.type != curr.type || !buffer.paths.back().matches(curr)) { - buffer.add_path(curr, vbuffer_id, vertices.size(), move_id - 1); - buffer.paths.back().sub_paths.back().first.position = prev.position; - } - - Path& last_path = buffer.paths.back(); - - const Vec3f dir = (curr.position - prev.position).normalized(); - const Vec3f right = Vec3f(dir.y(), -dir.x(), 0.0f).normalized(); - const Vec3f left = -right; - const Vec3f up = right.cross(dir); - const Vec3f down = -up; - const float half_width = 0.5f * last_path.width; - const float half_height = 0.5f * last_path.height; - const Vec3f prev_pos = prev.position - half_height * up; - const Vec3f curr_pos = curr.position - half_height * up; - const Vec3f d_up = half_height * up; - const Vec3f d_down = -half_height * up; - const Vec3f d_right = half_width * right; - const Vec3f d_left = -half_width * right; - - // vertices 1st endpoint - if (last_path.vertices_count() == 1 || vertices.empty()) { - // 1st segment or restart into a new vertex buffer - // =============================================== - store_vertex(vertices, prev_pos + d_up, up); - store_vertex(vertices, prev_pos + d_right, right); - store_vertex(vertices, prev_pos + d_down, down); - store_vertex(vertices, prev_pos + d_left, left); - } - else { - // any other segment - // ================= - store_vertex(vertices, prev_pos + d_right, right); - store_vertex(vertices, prev_pos + d_left, left); - } - - // vertices 2nd endpoint - store_vertex(vertices, curr_pos + d_up, up); - store_vertex(vertices, curr_pos + d_right, right); - store_vertex(vertices, curr_pos + d_down, down); - store_vertex(vertices, curr_pos + d_left, left); - - last_path.sub_paths.back().last = { vbuffer_id, vertices.size(), move_id, curr.position }; - }; - auto add_indices_as_solid = [&](const GCodeProcessorResult::MoveVertex& prev, const GCodeProcessorResult::MoveVertex& curr, const GCodeProcessorResult::MoveVertex* next, - TBuffer& buffer, size_t& vbuffer_size, unsigned int ibuffer_id, IndexBuffer& indices, size_t move_id) { - static Vec3f prev_dir; - static Vec3f prev_up; - static float sq_prev_length; - auto store_triangle = [](IndexBuffer& indices, IBufferType i1, IBufferType i2, IBufferType i3) { - indices.push_back(i1); - indices.push_back(i2); - indices.push_back(i3); - }; - auto append_dummy_cap = [store_triangle](IndexBuffer& indices, IBufferType id) { - store_triangle(indices, id, id, id); - store_triangle(indices, id, id, id); - }; - auto convert_vertices_offset = [](size_t vbuffer_size, const std::array& v_offsets) { - std::array ret = { - static_cast(static_cast(vbuffer_size) + v_offsets[0]), - static_cast(static_cast(vbuffer_size) + v_offsets[1]), - static_cast(static_cast(vbuffer_size) + v_offsets[2]), - static_cast(static_cast(vbuffer_size) + v_offsets[3]), - static_cast(static_cast(vbuffer_size) + v_offsets[4]), - static_cast(static_cast(vbuffer_size) + v_offsets[5]), - static_cast(static_cast(vbuffer_size) + v_offsets[6]), - static_cast(static_cast(vbuffer_size) + v_offsets[7]) - }; - return ret; - }; - auto append_starting_cap_triangles = [&](IndexBuffer& indices, const std::array& v_offsets) { - store_triangle(indices, v_offsets[0], v_offsets[2], v_offsets[1]); - store_triangle(indices, v_offsets[0], v_offsets[3], v_offsets[2]); - }; - auto append_stem_triangles = [&](IndexBuffer& indices, const std::array& v_offsets) { - store_triangle(indices, v_offsets[0], v_offsets[1], v_offsets[4]); - store_triangle(indices, v_offsets[1], v_offsets[5], v_offsets[4]); - store_triangle(indices, v_offsets[1], v_offsets[2], v_offsets[5]); - store_triangle(indices, v_offsets[2], v_offsets[6], v_offsets[5]); - store_triangle(indices, v_offsets[2], v_offsets[3], v_offsets[6]); - store_triangle(indices, v_offsets[3], v_offsets[7], v_offsets[6]); - store_triangle(indices, v_offsets[3], v_offsets[0], v_offsets[7]); - store_triangle(indices, v_offsets[0], v_offsets[4], v_offsets[7]); - }; - auto append_ending_cap_triangles = [&](IndexBuffer& indices, const std::array& v_offsets) { - store_triangle(indices, v_offsets[4], v_offsets[6], v_offsets[7]); - store_triangle(indices, v_offsets[4], v_offsets[5], v_offsets[6]); - }; - - if (buffer.paths.empty() || prev.type != curr.type || !buffer.paths.back().matches(curr)) { - buffer.add_path(curr, ibuffer_id, indices.size(), move_id - 1); - buffer.paths.back().sub_paths.back().first.position = prev.position; - } - - Path& last_path = buffer.paths.back(); - - const Vec3f dir = (curr.position - prev.position).normalized(); - const Vec3f right = Vec3f(dir.y(), -dir.x(), 0.0f).normalized(); - const Vec3f up = right.cross(dir); - const float sq_length = (curr.position - prev.position).squaredNorm(); - - const std::array first_seg_v_offsets = convert_vertices_offset(vbuffer_size, { 0, 1, 2, 3, 4, 5, 6, 7 }); - const std::array non_first_seg_v_offsets = convert_vertices_offset(vbuffer_size, { -4, 0, -2, 1, 2, 3, 4, 5 }); - const bool is_first_segment = (last_path.vertices_count() == 1); - if (is_first_segment || vbuffer_size == 0) { - // 1st segment or restart into a new vertex buffer - // =============================================== - if (is_first_segment) - // starting cap triangles - append_starting_cap_triangles(indices, first_seg_v_offsets); - // dummy triangles outer corner cap - append_dummy_cap(indices, vbuffer_size); - - // stem triangles - append_stem_triangles(indices, first_seg_v_offsets); - - vbuffer_size += 8; - } - else { - // any other segment - // ================= - float displacement = 0.0f; - const float cos_dir = prev_dir.dot(dir); - if (cos_dir > -0.9998477f) { - // if the angle between adjacent segments is smaller than 179 degrees - const Vec3f med_dir = (prev_dir + dir).normalized(); - const float half_width = 0.5f * last_path.width; - displacement = half_width * ::tan(::acos(std::clamp(dir.dot(med_dir), -1.0f, 1.0f))); - } - - const float sq_displacement = sqr(displacement); - const bool can_displace = displacement > 0.0f && sq_displacement < sq_prev_length && sq_displacement < sq_length; - - const bool is_right_turn = prev_up.dot(prev_dir.cross(dir)) <= 0.0f; - // whether the angle between adjacent segments is greater than 45 degrees - const bool is_sharp = cos_dir < 0.7071068f; - - bool right_displaced = false; - bool left_displaced = false; - - if (!is_sharp && can_displace) { - if (is_right_turn) - left_displaced = true; - else - right_displaced = true; - } - - // triangles outer corner cap - if (is_right_turn) { - if (left_displaced) - // dummy triangles - append_dummy_cap(indices, vbuffer_size); - else { - store_triangle(indices, vbuffer_size - 4, vbuffer_size + 1, vbuffer_size - 1); - store_triangle(indices, vbuffer_size + 1, vbuffer_size - 2, vbuffer_size - 1); - } - } - else { - if (right_displaced) - // dummy triangles - append_dummy_cap(indices, vbuffer_size); - else { - store_triangle(indices, vbuffer_size - 4, vbuffer_size - 3, vbuffer_size + 0); - store_triangle(indices, vbuffer_size - 3, vbuffer_size - 2, vbuffer_size + 0); - } - } - - // stem triangles - append_stem_triangles(indices, non_first_seg_v_offsets); - - vbuffer_size += 6; - } - - if (next != nullptr && (curr.type != next->type || !last_path.matches(*next))) - // ending cap triangles - append_ending_cap_triangles(indices, is_first_segment ? first_seg_v_offsets : non_first_seg_v_offsets); - - last_path.sub_paths.back().last = { ibuffer_id, indices.size() - 1, move_id, curr.position }; - prev_dir = dir; - prev_up = up; - sq_prev_length = sq_length; - }; - - // format data into the buffers to be rendered as instanced model - auto add_model_instance = [](const GCodeProcessorResult::MoveVertex& curr, InstanceBuffer& instances, InstanceIdBuffer& instances_ids, size_t move_id) { - // append position - instances.push_back(curr.position.x()); - instances.push_back(curr.position.y()); - instances.push_back(curr.position.z()); - // append width - instances.push_back(curr.width); - // append height - instances.push_back(curr.height); - - // append id - instances_ids.push_back(move_id); - }; - - // format data into the buffers to be rendered as batched model - auto add_vertices_as_model_batch = [](const GCodeProcessorResult::MoveVertex& curr, const GLModel::InitializationData& data, VertexBuffer& vertices, InstanceBuffer& instances, InstanceIdBuffer& instances_ids, size_t move_id) { - const double width = static_cast(1.5f * curr.width); - const double height = static_cast(1.5f * curr.height); - - const Transform3d trafo = Geometry::assemble_transform((curr.position - 0.5f * curr.height * Vec3f::UnitZ()).cast(), Vec3d::Zero(), { width, width, height }); - const Eigen::Matrix normal_matrix = trafo.matrix().template block<3, 3>(0, 0).inverse().transpose(); - - for (const auto& entity : data.entities) { - // append vertices - for (size_t i = 0; i < entity.positions.size(); ++i) { - // append position - const Vec3d position = trafo * entity.positions[i].cast(); - vertices.push_back(static_cast(position.x())); - vertices.push_back(static_cast(position.y())); - vertices.push_back(static_cast(position.z())); - - // append normal - const Vec3d normal = normal_matrix * entity.normals[i].cast(); - vertices.push_back(static_cast(normal.x())); - vertices.push_back(static_cast(normal.y())); - vertices.push_back(static_cast(normal.z())); - } - } - - // append instance position - instances.push_back(curr.position.x()); - instances.push_back(curr.position.y()); - instances.push_back(curr.position.z()); - // append instance id - instances_ids.push_back(move_id); - }; - - auto add_indices_as_model_batch = [](const GLModel::InitializationData& data, IndexBuffer& indices, IBufferType base_index) { - for (const auto& entity : data.entities) { - for (size_t i = 0; i < entity.indices.size(); ++i) { - indices.push_back(static_cast(entity.indices[i] + base_index)); - } - } - }; - -#if ENABLE_GCODE_VIEWER_STATISTICS - auto start_time = std::chrono::high_resolution_clock::now(); - m_statistics.results_size = SLIC3R_STDVEC_MEMSIZE(gcode_result.moves, GCodeProcessorResult::MoveVertex); - m_statistics.results_time = gcode_result.time; -#endif // ENABLE_GCODE_VIEWER_STATISTICS - - m_moves_count = gcode_result.moves.size(); - if (m_moves_count == 0) - return; - - m_extruders_count = gcode_result.extruders_count; - - unsigned int progress_count = 0; - static const unsigned int progress_threshold = 1000; - wxProgressDialog* progress_dialog = wxGetApp().is_gcode_viewer() ? - new wxProgressDialog(_L("Generating toolpaths"), "...", - 100, wxGetApp().mainframe, wxPD_AUTO_HIDE | wxPD_APP_MODAL) : nullptr; - - wxBusyCursor busy; - - // extract approximate paths bounding box from result - for (const GCodeProcessorResult::MoveVertex& move : gcode_result.moves) { - if (wxGetApp().is_gcode_viewer()) - // for the gcode viewer we need to take in account all moves to correctly size the printbed - m_paths_bounding_box.merge(move.position.cast()); - else { - if (move.type == EMoveType::Extrude && move.extrusion_role != erCustom && move.width != 0.0f && move.height != 0.0f) - m_paths_bounding_box.merge(move.position.cast()); - } - } - - // set approximate max bounding box (take in account also the tool marker) - m_max_bounding_box = m_paths_bounding_box; - m_max_bounding_box.merge(m_paths_bounding_box.max + m_sequential_view.marker.get_bounding_box().size().z() * Vec3d::UnitZ()); - - if (wxGetApp().is_editor()) - m_contained_in_bed = wxGetApp().plater()->build_volume().all_paths_inside(gcode_result, m_paths_bounding_box); - - m_sequential_view.gcode_ids.clear(); - for (size_t i = 0; i < gcode_result.moves.size(); ++i) { - const GCodeProcessorResult::MoveVertex& move = gcode_result.moves[i]; - if (move.type != EMoveType::Seam) - m_sequential_view.gcode_ids.push_back(move.gcode_id); - } - - std::vector vertices(m_buffers.size()); - std::vector indices(m_buffers.size()); - std::vector instances(m_buffers.size()); - std::vector instances_ids(m_buffers.size()); - std::vector instances_offsets(m_buffers.size()); - std::vector options_zs; - - size_t seams_count = 0; - std::vector biased_seams_ids; - - // toolpaths data -> extract vertices from result - for (size_t i = 0; i < m_moves_count; ++i) { - const GCodeProcessorResult::MoveVertex& curr = gcode_result.moves[i]; - if (curr.type == EMoveType::Seam) { - ++seams_count; - biased_seams_ids.push_back(i - biased_seams_ids.size() - 1); - } - - size_t move_id = i - seams_count; - - // skip first vertex - if (i == 0) - continue; - - const GCodeProcessorResult::MoveVertex& prev = gcode_result.moves[i - 1]; - - // update progress dialog - ++progress_count; - if (progress_dialog != nullptr && progress_count % progress_threshold == 0) { - progress_dialog->Update(int(100.0f * float(i) / (2.0f * float(m_moves_count))), - _L("Generating vertex buffer") + ": " + wxNumberFormatter::ToString(100.0 * double(i) / double(m_moves_count), 0, wxNumberFormatter::Style_None) + "%"); - progress_dialog->Fit(); - progress_count = 0; - } - - const unsigned char id = buffer_id(curr.type); - TBuffer& t_buffer = m_buffers[id]; - MultiVertexBuffer& v_multibuffer = vertices[id]; - InstanceBuffer& inst_buffer = instances[id]; - InstanceIdBuffer& inst_id_buffer = instances_ids[id]; - InstancesOffsets& inst_offsets = instances_offsets[id]; - - // ensure there is at least one vertex buffer - if (v_multibuffer.empty()) - v_multibuffer.push_back(VertexBuffer()); - - // if adding the vertices for the current segment exceeds the threshold size of the current vertex buffer - // add another vertex buffer - size_t vertices_size_to_add = (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::BatchedModel) ? t_buffer.model.data.vertices_size_bytes() : t_buffer.max_vertices_per_segment_size_bytes(); - if (v_multibuffer.back().size() * sizeof(float) > t_buffer.vertices.max_size_bytes() - vertices_size_to_add) { - v_multibuffer.push_back(VertexBuffer()); - if (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) { - Path& last_path = t_buffer.paths.back(); - if (prev.type == curr.type && last_path.matches(curr)) - last_path.add_sub_path(prev, static_cast(v_multibuffer.size()) - 1, 0, move_id - 1); - } - } - - VertexBuffer& v_buffer = v_multibuffer.back(); - - switch (t_buffer.render_primitive_type) - { - case TBuffer::ERenderPrimitiveType::Point: { add_vertices_as_point(curr, v_buffer); break; } - case TBuffer::ERenderPrimitiveType::Line: { add_vertices_as_line(prev, curr, v_buffer); break; } - case TBuffer::ERenderPrimitiveType::Triangle: { add_vertices_as_solid(prev, curr, t_buffer, static_cast(v_multibuffer.size()) - 1, v_buffer, move_id); break; } - case TBuffer::ERenderPrimitiveType::InstancedModel: - { - add_model_instance(curr, inst_buffer, inst_id_buffer, move_id); - inst_offsets.push_back(prev.position - curr.position); -#if ENABLE_GCODE_VIEWER_STATISTICS - ++m_statistics.instances_count; -#endif // ENABLE_GCODE_VIEWER_STATISTICS - break; - } - case TBuffer::ERenderPrimitiveType::BatchedModel: - { - add_vertices_as_model_batch(curr, t_buffer.model.data, v_buffer, inst_buffer, inst_id_buffer, move_id); - inst_offsets.push_back(prev.position - curr.position); -#if ENABLE_GCODE_VIEWER_STATISTICS - ++m_statistics.batched_count; -#endif // ENABLE_GCODE_VIEWER_STATISTICS - break; - } - } - - // collect options zs for later use - if (curr.type == EMoveType::Pause_Print || curr.type == EMoveType::Custom_GCode) { - const float* const last_z = options_zs.empty() ? nullptr : &options_zs.back(); - if (last_z == nullptr || curr.position[2] < *last_z - EPSILON || *last_z + EPSILON < curr.position[2]) - options_zs.emplace_back(curr.position[2]); - } - } - - // smooth toolpaths corners for the given TBuffer using triangles - auto smooth_triangle_toolpaths_corners = [&gcode_result, &biased_seams_ids](const TBuffer& t_buffer, MultiVertexBuffer& v_multibuffer) { - auto extract_position_at = [](const VertexBuffer& vertices, size_t offset) { - return Vec3f(vertices[offset + 0], vertices[offset + 1], vertices[offset + 2]); - }; - auto update_position_at = [](VertexBuffer& vertices, size_t offset, const Vec3f& position) { - vertices[offset + 0] = position.x(); - vertices[offset + 1] = position.y(); - vertices[offset + 2] = position.z(); - }; - auto match_right_vertices = [&](const Path::Sub_Path& prev_sub_path, const Path::Sub_Path& next_sub_path, - size_t curr_s_id, size_t vertex_size_floats, const Vec3f& displacement_vec) { - if (&prev_sub_path == &next_sub_path) { // previous and next segment are both contained into to the same vertex buffer - VertexBuffer& vbuffer = v_multibuffer[prev_sub_path.first.b_id]; - // offset into the vertex buffer of the next segment 1st vertex - const size_t next_1st_offset = (prev_sub_path.last.s_id - curr_s_id) * 6 * vertex_size_floats; - // offset into the vertex buffer of the right vertex of the previous segment - const size_t prev_right_offset = prev_sub_path.last.i_id - next_1st_offset - 3 * vertex_size_floats; - // new position of the right vertices - const Vec3f shared_vertex = extract_position_at(vbuffer, prev_right_offset) + displacement_vec; - // update previous segment - update_position_at(vbuffer, prev_right_offset, shared_vertex); - // offset into the vertex buffer of the right vertex of the next segment - const size_t next_right_offset = next_sub_path.last.i_id - next_1st_offset; - // update next segment - update_position_at(vbuffer, next_right_offset, shared_vertex); - } - else { // previous and next segment are contained into different vertex buffers - VertexBuffer& prev_vbuffer = v_multibuffer[prev_sub_path.first.b_id]; - VertexBuffer& next_vbuffer = v_multibuffer[next_sub_path.first.b_id]; - // offset into the previous vertex buffer of the right vertex of the previous segment - const size_t prev_right_offset = prev_sub_path.last.i_id - 3 * vertex_size_floats; - // new position of the right vertices - const Vec3f shared_vertex = extract_position_at(prev_vbuffer, prev_right_offset) + displacement_vec; - // update previous segment - update_position_at(prev_vbuffer, prev_right_offset, shared_vertex); - // offset into the next vertex buffer of the right vertex of the next segment - const size_t next_right_offset = next_sub_path.first.i_id + 1 * vertex_size_floats; - // update next segment - update_position_at(next_vbuffer, next_right_offset, shared_vertex); - } - }; - auto match_left_vertices = [&](const Path::Sub_Path& prev_sub_path, const Path::Sub_Path& next_sub_path, - size_t curr_s_id, size_t vertex_size_floats, const Vec3f& displacement_vec) { - if (&prev_sub_path == &next_sub_path) { // previous and next segment are both contained into to the same vertex buffer - VertexBuffer& vbuffer = v_multibuffer[prev_sub_path.first.b_id]; - // offset into the vertex buffer of the next segment 1st vertex - const size_t next_1st_offset = (prev_sub_path.last.s_id - curr_s_id) * 6 * vertex_size_floats; - // offset into the vertex buffer of the left vertex of the previous segment - const size_t prev_left_offset = prev_sub_path.last.i_id - next_1st_offset - 1 * vertex_size_floats; - // new position of the left vertices - const Vec3f shared_vertex = extract_position_at(vbuffer, prev_left_offset) + displacement_vec; - // update previous segment - update_position_at(vbuffer, prev_left_offset, shared_vertex); - // offset into the vertex buffer of the left vertex of the next segment - const size_t next_left_offset = next_sub_path.last.i_id - next_1st_offset + 1 * vertex_size_floats; - // update next segment - update_position_at(vbuffer, next_left_offset, shared_vertex); - } - else { // previous and next segment are contained into different vertex buffers - VertexBuffer& prev_vbuffer = v_multibuffer[prev_sub_path.first.b_id]; - VertexBuffer& next_vbuffer = v_multibuffer[next_sub_path.first.b_id]; - // offset into the previous vertex buffer of the left vertex of the previous segment - const size_t prev_left_offset = prev_sub_path.last.i_id - 1 * vertex_size_floats; - // new position of the left vertices - const Vec3f shared_vertex = extract_position_at(prev_vbuffer, prev_left_offset) + displacement_vec; - // update previous segment - update_position_at(prev_vbuffer, prev_left_offset, shared_vertex); - // offset into the next vertex buffer of the left vertex of the next segment - const size_t next_left_offset = next_sub_path.first.i_id + 3 * vertex_size_floats; - // update next segment - update_position_at(next_vbuffer, next_left_offset, shared_vertex); - } - }; - - auto extract_move_id = [&biased_seams_ids](size_t id) { - size_t new_id = size_t(-1); - auto it = std::lower_bound(biased_seams_ids.begin(), biased_seams_ids.end(), id); - if (it == biased_seams_ids.end()) - new_id = id + biased_seams_ids.size(); - else { - if (it == biased_seams_ids.begin() && *it < id) - new_id = id; - else if (it != biased_seams_ids.begin()) - new_id = id + std::distance(biased_seams_ids.begin(), it); - } - return (new_id == size_t(-1)) ? id : new_id; - }; - - const size_t vertex_size_floats = t_buffer.vertices.vertex_size_floats(); - for (const Path& path : t_buffer.paths) { - // the two segments of the path sharing the current vertex may belong - // to two different vertex buffers - size_t prev_sub_path_id = 0; - size_t next_sub_path_id = 0; - const size_t path_vertices_count = path.vertices_count(); - const float half_width = 0.5f * path.width; - for (size_t j = 1; j < path_vertices_count - 1; ++j) { - const size_t curr_s_id = path.sub_paths.front().first.s_id + j; - const size_t move_id = extract_move_id(curr_s_id); - const Vec3f& prev = gcode_result.moves[move_id - 1].position; - const Vec3f& curr = gcode_result.moves[move_id].position; - const Vec3f& next = gcode_result.moves[move_id + 1].position; - - // select the subpaths which contains the previous/next segments - if (!path.sub_paths[prev_sub_path_id].contains(curr_s_id)) - ++prev_sub_path_id; - if (!path.sub_paths[next_sub_path_id].contains(curr_s_id + 1)) - ++next_sub_path_id; - const Path::Sub_Path& prev_sub_path = path.sub_paths[prev_sub_path_id]; - const Path::Sub_Path& next_sub_path = path.sub_paths[next_sub_path_id]; - - const Vec3f prev_dir = (curr - prev).normalized(); - const Vec3f prev_right = Vec3f(prev_dir.y(), -prev_dir.x(), 0.0f).normalized(); - const Vec3f prev_up = prev_right.cross(prev_dir); - - const Vec3f next_dir = (next - curr).normalized(); - - const bool is_right_turn = prev_up.dot(prev_dir.cross(next_dir)) <= 0.0f; - const float cos_dir = prev_dir.dot(next_dir); - // whether the angle between adjacent segments is greater than 45 degrees - const bool is_sharp = cos_dir < 0.7071068f; - - float displacement = 0.0f; - if (cos_dir > -0.9998477f) { - // if the angle between adjacent segments is smaller than 179 degrees - const Vec3f med_dir = (prev_dir + next_dir).normalized(); - displacement = half_width * ::tan(::acos(std::clamp(next_dir.dot(med_dir), -1.0f, 1.0f))); - } - - const float sq_prev_length = (curr - prev).squaredNorm(); - const float sq_next_length = (next - curr).squaredNorm(); - const float sq_displacement = sqr(displacement); - const bool can_displace = displacement > 0.0f && sq_displacement < sq_prev_length && sq_displacement < sq_next_length; - - if (can_displace) { - // displacement to apply to the vertices to match - const Vec3f displacement_vec = displacement * prev_dir; - // matches inner corner vertices - if (is_right_turn) - match_right_vertices(prev_sub_path, next_sub_path, curr_s_id, vertex_size_floats, -displacement_vec); - else - match_left_vertices(prev_sub_path, next_sub_path, curr_s_id, vertex_size_floats, -displacement_vec); - - if (!is_sharp) { - // matches outer corner vertices - if (is_right_turn) - match_left_vertices(prev_sub_path, next_sub_path, curr_s_id, vertex_size_floats, displacement_vec); - else - match_right_vertices(prev_sub_path, next_sub_path, curr_s_id, vertex_size_floats, displacement_vec); - } - } - } - } - }; - -#if ENABLE_GCODE_VIEWER_STATISTICS - auto load_vertices_time = std::chrono::high_resolution_clock::now(); - m_statistics.load_vertices = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); -#endif // ENABLE_GCODE_VIEWER_STATISTICS - - // smooth toolpaths corners for TBuffers using triangles - for (size_t i = 0; i < m_buffers.size(); ++i) { - const TBuffer& t_buffer = m_buffers[i]; - if (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) - smooth_triangle_toolpaths_corners(t_buffer, vertices[i]); - } - - // dismiss, no more needed - std::vector().swap(biased_seams_ids); - - for (MultiVertexBuffer& v_multibuffer : vertices) { - for (VertexBuffer& v_buffer : v_multibuffer) { - v_buffer.shrink_to_fit(); - } - } - - // move the wipe toolpaths half height up to render them on proper position - MultiVertexBuffer& wipe_vertices = vertices[buffer_id(EMoveType::Wipe)]; - for (VertexBuffer& v_buffer : wipe_vertices) { - for (size_t i = 2; i < v_buffer.size(); i += 3) { - v_buffer[i] += 0.5f * GCodeProcessor::Wipe_Height; - } - } - - // send vertices data to gpu, where needed - for (size_t i = 0; i < m_buffers.size(); ++i) { - TBuffer& t_buffer = m_buffers[i]; - if (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::InstancedModel) { - const InstanceBuffer& inst_buffer = instances[i]; - if (!inst_buffer.empty()) { - t_buffer.model.instances.buffer = inst_buffer; - t_buffer.model.instances.s_ids = instances_ids[i]; - t_buffer.model.instances.offsets = instances_offsets[i]; - } - } - else { - if (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::BatchedModel) { - const InstanceBuffer& inst_buffer = instances[i]; - if (!inst_buffer.empty()) { - t_buffer.model.instances.buffer = inst_buffer; - t_buffer.model.instances.s_ids = instances_ids[i]; - t_buffer.model.instances.offsets = instances_offsets[i]; - } - } - const MultiVertexBuffer& v_multibuffer = vertices[i]; - for (const VertexBuffer& v_buffer : v_multibuffer) { - const size_t size_elements = v_buffer.size(); - const size_t size_bytes = size_elements * sizeof(float); - const size_t vertices_count = size_elements / t_buffer.vertices.vertex_size_floats(); - t_buffer.vertices.count += vertices_count; - -#if ENABLE_GCODE_VIEWER_STATISTICS - m_statistics.total_vertices_gpu_size += static_cast(size_bytes); - m_statistics.max_vbuffer_gpu_size = std::max(m_statistics.max_vbuffer_gpu_size, static_cast(size_bytes)); - ++m_statistics.vbuffers_count; -#endif // ENABLE_GCODE_VIEWER_STATISTICS - - GLuint id = 0; - glsafe(::glGenBuffers(1, &id)); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, id)); - glsafe(::glBufferData(GL_ARRAY_BUFFER, size_bytes, v_buffer.data(), GL_STATIC_DRAW)); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); - - t_buffer.vertices.vbos.push_back(static_cast(id)); - t_buffer.vertices.sizes.push_back(size_bytes); - } - } - } - -#if ENABLE_GCODE_VIEWER_STATISTICS - auto smooth_vertices_time = std::chrono::high_resolution_clock::now(); - m_statistics.smooth_vertices = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - load_vertices_time).count(); -#endif // ENABLE_GCODE_VIEWER_STATISTICS - log_memory_usage("Loaded G-code generated vertex buffers ", vertices, indices); - - // dismiss vertices data, no more needed - std::vector().swap(vertices); - std::vector().swap(instances); - std::vector().swap(instances_ids); - - // toolpaths data -> extract indices from result - // paths may have been filled while extracting vertices, - // so reset them, they will be filled again while extracting indices - for (TBuffer& buffer : m_buffers) { - buffer.paths.clear(); - } - - // variable used to keep track of the current vertex buffers index and size - using CurrVertexBuffer = std::pair; - std::vector curr_vertex_buffers(m_buffers.size(), { 0, 0 }); - - // variable used to keep track of the vertex buffers ids - using VboIndexList = std::vector; - std::vector vbo_indices(m_buffers.size()); - - seams_count = 0; - - for (size_t i = 0; i < m_moves_count; ++i) { - const GCodeProcessorResult::MoveVertex& curr = gcode_result.moves[i]; - if (curr.type == EMoveType::Seam) - ++seams_count; - - size_t move_id = i - seams_count; - - // skip first vertex - if (i == 0) - continue; - - const GCodeProcessorResult::MoveVertex& prev = gcode_result.moves[i - 1]; - const GCodeProcessorResult::MoveVertex* next = nullptr; - if (i < m_moves_count - 1) - next = &gcode_result.moves[i + 1]; - - ++progress_count; - if (progress_dialog != nullptr && progress_count % progress_threshold == 0) { - progress_dialog->Update(int(100.0f * float(m_moves_count + i) / (2.0f * float(m_moves_count))), - _L("Generating index buffers") + ": " + wxNumberFormatter::ToString(100.0 * double(i) / double(m_moves_count), 0, wxNumberFormatter::Style_None) + "%"); - progress_dialog->Fit(); - progress_count = 0; - } - - const unsigned char id = buffer_id(curr.type); - TBuffer& t_buffer = m_buffers[id]; - MultiIndexBuffer& i_multibuffer = indices[id]; - CurrVertexBuffer& curr_vertex_buffer = curr_vertex_buffers[id]; - VboIndexList& vbo_index_list = vbo_indices[id]; - - // ensure there is at least one index buffer - if (i_multibuffer.empty()) { - i_multibuffer.push_back(IndexBuffer()); - if (!t_buffer.vertices.vbos.empty()) - vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); - } - - // if adding the indices for the current segment exceeds the threshold size of the current index buffer - // create another index buffer - size_t indiced_size_to_add = (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::BatchedModel) ? t_buffer.model.data.indices_size_bytes() : t_buffer.max_indices_per_segment_size_bytes(); - if (i_multibuffer.back().size() * sizeof(IBufferType) >= IBUFFER_THRESHOLD_BYTES - indiced_size_to_add) { - i_multibuffer.push_back(IndexBuffer()); - vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); - if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Point && - t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::BatchedModel) { - Path& last_path = t_buffer.paths.back(); - last_path.add_sub_path(prev, static_cast(i_multibuffer.size()) - 1, 0, move_id - 1); - } - } - - // if adding the vertices for the current segment exceeds the threshold size of the current vertex buffer - // create another index buffer - size_t vertices_size_to_add = (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::BatchedModel) ? t_buffer.model.data.vertices_size_bytes() : t_buffer.max_vertices_per_segment_size_bytes(); - if (curr_vertex_buffer.second * t_buffer.vertices.vertex_size_bytes() > t_buffer.vertices.max_size_bytes() - vertices_size_to_add) { - i_multibuffer.push_back(IndexBuffer()); - - ++curr_vertex_buffer.first; - curr_vertex_buffer.second = 0; - vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); - - if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Point && - t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::BatchedModel) { - Path& last_path = t_buffer.paths.back(); - last_path.add_sub_path(prev, static_cast(i_multibuffer.size()) - 1, 0, move_id - 1); - } - } - - IndexBuffer& i_buffer = i_multibuffer.back(); - - switch (t_buffer.render_primitive_type) - { - case TBuffer::ERenderPrimitiveType::Point: { - add_indices_as_point(curr, t_buffer, static_cast(i_multibuffer.size()) - 1, i_buffer, move_id); - curr_vertex_buffer.second += t_buffer.max_vertices_per_segment(); - break; - } - case TBuffer::ERenderPrimitiveType::Line: { - add_indices_as_line(prev, curr, t_buffer, static_cast(i_multibuffer.size()) - 1, i_buffer, move_id); - curr_vertex_buffer.second += t_buffer.max_vertices_per_segment(); - break; - } - case TBuffer::ERenderPrimitiveType::Triangle: { - add_indices_as_solid(prev, curr, next, t_buffer, curr_vertex_buffer.second, static_cast(i_multibuffer.size()) - 1, i_buffer, move_id); - break; - } - case TBuffer::ERenderPrimitiveType::BatchedModel: { - add_indices_as_model_batch(t_buffer.model.data, i_buffer, curr_vertex_buffer.second); - curr_vertex_buffer.second += t_buffer.model.data.vertices_count(); - break; - } - default: { break; } - } - } - - for (MultiIndexBuffer& i_multibuffer : indices) { - for (IndexBuffer& i_buffer : i_multibuffer) { - i_buffer.shrink_to_fit(); - } - } - - // toolpaths data -> send indices data to gpu - for (size_t i = 0; i < m_buffers.size(); ++i) { - TBuffer& t_buffer = m_buffers[i]; - if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::InstancedModel) { - const MultiIndexBuffer& i_multibuffer = indices[i]; - for (const IndexBuffer& i_buffer : i_multibuffer) { - const size_t size_elements = i_buffer.size(); - const size_t size_bytes = size_elements * sizeof(IBufferType); - - // stores index buffer informations into TBuffer - t_buffer.indices.push_back(IBuffer()); - IBuffer& ibuf = t_buffer.indices.back(); - ibuf.count = size_elements; - ibuf.vbo = vbo_indices[i][t_buffer.indices.size() - 1]; - -#if ENABLE_GCODE_VIEWER_STATISTICS - m_statistics.total_indices_gpu_size += static_cast(size_bytes); - m_statistics.max_ibuffer_gpu_size = std::max(m_statistics.max_ibuffer_gpu_size, static_cast(size_bytes)); - ++m_statistics.ibuffers_count; -#endif // ENABLE_GCODE_VIEWER_STATISTICS - - glsafe(::glGenBuffers(1, &ibuf.ibo)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuf.ibo)); - glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, size_bytes, i_buffer.data(), GL_STATIC_DRAW)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - } - } - } - - if (progress_dialog != nullptr) { - progress_dialog->Update(100, ""); - progress_dialog->Fit(); - } - -#if ENABLE_GCODE_VIEWER_STATISTICS - for (const TBuffer& buffer : m_buffers) { - m_statistics.paths_size += SLIC3R_STDVEC_MEMSIZE(buffer.paths, Path); - } - - auto update_segments_count = [&](EMoveType type, int64_t& count) { - unsigned int id = buffer_id(type); - const MultiIndexBuffer& buffers = indices[id]; - int64_t indices_count = 0; - for (const IndexBuffer& buffer : buffers) { - indices_count += buffer.size(); - } - const TBuffer& t_buffer = m_buffers[id]; - if (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) - indices_count -= static_cast(12 * t_buffer.paths.size()); // remove the starting + ending caps = 4 triangles - - count += indices_count / t_buffer.indices_per_segment(); - }; - - update_segments_count(EMoveType::Travel, m_statistics.travel_segments_count); - update_segments_count(EMoveType::Wipe, m_statistics.wipe_segments_count); - update_segments_count(EMoveType::Extrude, m_statistics.extrude_segments_count); - - m_statistics.load_indices = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - smooth_vertices_time).count(); -#endif // ENABLE_GCODE_VIEWER_STATISTICS - - log_memory_usage("Loaded G-code generated indices buffers ", vertices, indices); - - // dismiss indices data, no more needed - std::vector().swap(indices); - - // layers zs / roles / extruder ids -> extract from result - size_t last_travel_s_id = 0; - seams_count = 0; - for (size_t i = 0; i < m_moves_count; ++i) { - const GCodeProcessorResult::MoveVertex& move = gcode_result.moves[i]; - if (move.type == EMoveType::Seam) - ++seams_count; - - size_t move_id = i - seams_count; - - if (move.type == EMoveType::Extrude) { - // layers zs - const double* const last_z = m_layers.empty() ? nullptr : &m_layers.get_zs().back(); - const double z = static_cast(move.position.z()); - if (last_z == nullptr || z < *last_z - EPSILON || *last_z + EPSILON < z) - m_layers.append(z, { last_travel_s_id, move_id }); - else - m_layers.get_endpoints().back().last = move_id; - // extruder ids - m_extruder_ids.emplace_back(move.extruder_id); - // roles - if (i > 0) - m_roles.emplace_back(move.extrusion_role); - } - else if (move.type == EMoveType::Travel) { - if (move_id - last_travel_s_id > 1 && !m_layers.empty()) - m_layers.get_endpoints().back().last = move_id; - - last_travel_s_id = move_id; - } - } - - // roles -> remove duplicates - sort_remove_duplicates(m_roles); - m_roles.shrink_to_fit(); - - // extruder ids -> remove duplicates - sort_remove_duplicates(m_extruder_ids); - m_extruder_ids.shrink_to_fit(); - -#if ENABLE_SPIRAL_VASE_LAYERS - // replace layers for spiral vase mode - if (!gcode_result.spiral_vase_layers.empty()) { - m_layers.reset(); - for (const auto& layer : gcode_result.spiral_vase_layers) { - m_layers.append(layer.first, { layer.second.first, layer.second.second }); - } - } -#endif // ENABLE_SPIRAL_VASE_LAYERS - - // set layers z range - if (!m_layers.empty()) - m_layers_z_range = { 0, static_cast(m_layers.size() - 1) }; - - // change color of paths whose layer contains option points - if (!options_zs.empty()) { - TBuffer& extrude_buffer = m_buffers[buffer_id(EMoveType::Extrude)]; - for (Path& path : extrude_buffer.paths) { - const float z = path.sub_paths.front().first.position.z(); - if (std::find_if(options_zs.begin(), options_zs.end(), [z](float f) { return f - EPSILON <= z && z <= f + EPSILON; }) != options_zs.end()) - path.cp_color_id = 255 - path.cp_color_id; - } - } - -#if ENABLE_GCODE_VIEWER_STATISTICS - m_statistics.load_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); -#endif // ENABLE_GCODE_VIEWER_STATISTICS - - if (progress_dialog != nullptr) - progress_dialog->Destroy(); -} - -void GCodeViewer::load_shells(const Print& print, bool initialized) -{ - if (print.objects().empty()) - // no shells, return - return; - - // adds objects' volumes - int object_id = 0; - for (const PrintObject* obj : print.objects()) { - const ModelObject* model_obj = obj->model_object(); - - std::vector instance_ids(model_obj->instances.size()); - for (int i = 0; i < (int)model_obj->instances.size(); ++i) { - instance_ids[i] = i; - } - - size_t current_volumes_count = m_shells.volumes.volumes.size(); - m_shells.volumes.load_object(model_obj, object_id, instance_ids, "object", initialized); - - // adjust shells' z if raft is present - const SlicingParameters& slicing_parameters = obj->slicing_parameters(); - if (slicing_parameters.object_print_z_min != 0.0) { - const Vec3d z_offset = slicing_parameters.object_print_z_min * Vec3d::UnitZ(); - for (size_t i = current_volumes_count; i < m_shells.volumes.volumes.size(); ++i) { - GLVolume* v = m_shells.volumes.volumes[i]; - v->set_volume_offset(v->get_volume_offset() + z_offset); - } - } - - ++object_id; - } - - if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptFFF) { - // adds wipe tower's volume - const double max_z = print.objects()[0]->model_object()->get_model()->bounding_box().max(2); - const PrintConfig& config = print.config(); - const size_t extruders_count = config.nozzle_diameter.size(); - if (extruders_count > 1 && config.wipe_tower && !config.complete_objects) { - const float depth = print.wipe_tower_data(extruders_count).depth; - const float brim_width = print.wipe_tower_data(extruders_count).brim_width; - - m_shells.volumes.load_wipe_tower_preview(1000, config.wipe_tower_x, config.wipe_tower_y, config.wipe_tower_width, depth, max_z, config.wipe_tower_rotation_angle, - !print.is_step_done(psWipeTower), brim_width, initialized); - } - } - - // remove modifiers - while (true) { - GLVolumePtrs::iterator it = std::find_if(m_shells.volumes.volumes.begin(), m_shells.volumes.volumes.end(), [](GLVolume* volume) { return volume->is_modifier; }); - if (it != m_shells.volumes.volumes.end()) { - delete (*it); - m_shells.volumes.volumes.erase(it); - } - else - break; - } - - for (GLVolume* volume : m_shells.volumes.volumes) { - volume->zoom_to_volumes = false; - volume->color[3] = 0.25f; - volume->force_native_color = true; - volume->set_render_color(); - } -} - -void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool keep_sequential_current_last) const -{ -#if ENABLE_GCODE_VIEWER_STATISTICS - auto start_time = std::chrono::high_resolution_clock::now(); -#endif // ENABLE_GCODE_VIEWER_STATISTICS - - auto extrusion_color = [this](const Path& path) { - Color color; - switch (m_view_type) - { - case EViewType::FeatureType: { color = Extrusion_Role_Colors[static_cast(path.role)]; break; } - case EViewType::Height: { color = m_extrusions.ranges.height.get_color_at(path.height); break; } - case EViewType::Width: { color = m_extrusions.ranges.width.get_color_at(path.width); break; } - case EViewType::Feedrate: { color = m_extrusions.ranges.feedrate.get_color_at(path.feedrate); break; } - case EViewType::FanSpeed: { color = m_extrusions.ranges.fan_speed.get_color_at(path.fan_speed); break; } - case EViewType::Temperature: { color = m_extrusions.ranges.temperature.get_color_at(path.temperature); break; } - case EViewType::VolumetricRate: { color = m_extrusions.ranges.volumetric_rate.get_color_at(path.volumetric_rate); break; } - case EViewType::Tool: { color = m_tool_colors[path.extruder_id]; break; } - case EViewType::ColorPrint: { - if (path.cp_color_id >= static_cast(m_tool_colors.size())) - color = { 0.5f, 0.5f, 0.5f, 1.0f }; - else - color = m_tool_colors[path.cp_color_id]; - - break; - } - default: { color = { 1.0f, 1.0f, 1.0f, 1.0f }; break; } - } - - return color; - }; - - auto travel_color = [](const Path& path) { - return (path.delta_extruder < 0.0f) ? Travel_Colors[2] /* Retract */ : - ((path.delta_extruder > 0.0f) ? Travel_Colors[1] /* Extrude */ : - Travel_Colors[0] /* Move */); - }; - - auto is_in_layers_range = [this](const Path& path, size_t min_id, size_t max_id) { - auto in_layers_range = [this, min_id, max_id](size_t id) { - return m_layers.get_endpoints_at(min_id).first <= id && id <= m_layers.get_endpoints_at(max_id).last; - }; - - return in_layers_range(path.sub_paths.front().first.s_id) && in_layers_range(path.sub_paths.back().last.s_id); - }; - - auto is_travel_in_layers_range = [this](size_t path_id, size_t min_id, size_t max_id) { - const TBuffer& buffer = m_buffers[buffer_id(EMoveType::Travel)]; - if (path_id >= buffer.paths.size()) - return false; - - Path path = buffer.paths[path_id]; - size_t first = path_id; - size_t last = path_id; - - // check adjacent paths - while (first > 0 && path.sub_paths.front().first.position.isApprox(buffer.paths[first - 1].sub_paths.back().last.position)) { - --first; - path.sub_paths.front().first = buffer.paths[first].sub_paths.front().first; - } - while (last < buffer.paths.size() - 1 && path.sub_paths.back().last.position.isApprox(buffer.paths[last + 1].sub_paths.front().first.position)) { - ++last; - path.sub_paths.back().last = buffer.paths[last].sub_paths.back().last; - } - - const size_t min_s_id = m_layers.get_endpoints_at(min_id).first; - const size_t max_s_id = m_layers.get_endpoints_at(max_id).last; - - return (min_s_id <= path.sub_paths.front().first.s_id && path.sub_paths.front().first.s_id <= max_s_id) || - (min_s_id <= path.sub_paths.back().last.s_id && path.sub_paths.back().last.s_id <= max_s_id); - }; - -#if ENABLE_GCODE_VIEWER_STATISTICS - Statistics* statistics = const_cast(&m_statistics); - statistics->render_paths_size = 0; - statistics->models_instances_size = 0; -#endif // ENABLE_GCODE_VIEWER_STATISTICS - - const bool top_layer_only = get_app_config()->get("seq_top_layer_only") == "1"; - - SequentialView::Endpoints global_endpoints = { m_moves_count , 0 }; - SequentialView::Endpoints top_layer_endpoints = global_endpoints; - SequentialView* sequential_view = const_cast(&m_sequential_view); - if (top_layer_only || !keep_sequential_current_first) sequential_view->current.first = 0; - if (!keep_sequential_current_last) sequential_view->current.last = m_moves_count; - - // first pass: collect visible paths and update sequential view data - std::vector> paths; - for (size_t b = 0; b < m_buffers.size(); ++b) { - TBuffer& buffer = const_cast(m_buffers[b]); - // reset render paths - buffer.render_paths.clear(); - - if (!buffer.visible) - continue; - - if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::InstancedModel || - buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::BatchedModel) { - for (size_t id : buffer.model.instances.s_ids) { - if (id < m_layers.get_endpoints_at(m_layers_z_range[0]).first || m_layers.get_endpoints_at(m_layers_z_range[1]).last < id) - continue; - - global_endpoints.first = std::min(global_endpoints.first, id); - global_endpoints.last = std::max(global_endpoints.last, id); - - if (top_layer_only) { - if (id < m_layers.get_endpoints_at(m_layers_z_range[1]).first || m_layers.get_endpoints_at(m_layers_z_range[1]).last < id) - continue; - - top_layer_endpoints.first = std::min(top_layer_endpoints.first, id); - top_layer_endpoints.last = std::max(top_layer_endpoints.last, id); - } - } - } - else { - for (size_t i = 0; i < buffer.paths.size(); ++i) { - const Path& path = buffer.paths[i]; - if (path.type == EMoveType::Travel) { - if (!is_travel_in_layers_range(i, m_layers_z_range[0], m_layers_z_range[1])) - continue; - } - else if (!is_in_layers_range(path, m_layers_z_range[0], m_layers_z_range[1])) - continue; - - if (path.type == EMoveType::Extrude && !is_visible(path)) - continue; - - // store valid path - for (size_t j = 0; j < path.sub_paths.size(); ++j) { - paths.push_back({ static_cast(b), path.sub_paths[j].first.b_id, static_cast(i), static_cast(j) }); - } - - global_endpoints.first = std::min(global_endpoints.first, path.sub_paths.front().first.s_id); - global_endpoints.last = std::max(global_endpoints.last, path.sub_paths.back().last.s_id); - - if (top_layer_only) { - if (path.type == EMoveType::Travel) { - if (is_travel_in_layers_range(i, m_layers_z_range[1], m_layers_z_range[1])) { - top_layer_endpoints.first = std::min(top_layer_endpoints.first, path.sub_paths.front().first.s_id); - top_layer_endpoints.last = std::max(top_layer_endpoints.last, path.sub_paths.back().last.s_id); - } - } - else if (is_in_layers_range(path, m_layers_z_range[1], m_layers_z_range[1])) { - top_layer_endpoints.first = std::min(top_layer_endpoints.first, path.sub_paths.front().first.s_id); - top_layer_endpoints.last = std::max(top_layer_endpoints.last, path.sub_paths.back().last.s_id); - } - } - } - } - } - - // update current sequential position - sequential_view->current.first = !top_layer_only && keep_sequential_current_first ? std::clamp(sequential_view->current.first, global_endpoints.first, global_endpoints.last) : global_endpoints.first; - sequential_view->current.last = keep_sequential_current_last ? std::clamp(sequential_view->current.last, global_endpoints.first, global_endpoints.last) : global_endpoints.last; - - // get the world position from the vertex buffer - bool found = false; - for (const TBuffer& buffer : m_buffers) { - if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::InstancedModel || - buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::BatchedModel) { - for (size_t i = 0; i < buffer.model.instances.s_ids.size(); ++i) { - if (buffer.model.instances.s_ids[i] == m_sequential_view.current.last) { - size_t offset = i * buffer.model.instances.instance_size_floats(); - sequential_view->current_position.x() = buffer.model.instances.buffer[offset + 0]; - sequential_view->current_position.y() = buffer.model.instances.buffer[offset + 1]; - sequential_view->current_position.z() = buffer.model.instances.buffer[offset + 2]; - sequential_view->current_offset = buffer.model.instances.offsets[i]; - found = true; - break; - } - } - } - else { - // searches the path containing the current position - for (const Path& path : buffer.paths) { - if (path.contains(m_sequential_view.current.last)) { - const int sub_path_id = path.get_id_of_sub_path_containing(m_sequential_view.current.last); - if (sub_path_id != -1) { - const Path::Sub_Path& sub_path = path.sub_paths[sub_path_id]; - unsigned int offset = static_cast(m_sequential_view.current.last - sub_path.first.s_id); - if (offset > 0) { - if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Line) - offset = 2 * offset - 1; - else if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) { - unsigned int indices_count = buffer.indices_per_segment(); - offset = indices_count * (offset - 1) + (indices_count - 2); - if (sub_path_id == 0) - offset += 6; // add 2 triangles for starting cap - } - } - offset += static_cast(sub_path.first.i_id); - - // gets the vertex index from the index buffer on gpu - const IBuffer& i_buffer = buffer.indices[sub_path.first.b_id]; - unsigned int index = 0; - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); - glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast(offset * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&index))); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - - // gets the position from the vertices buffer on gpu - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, i_buffer.vbo)); - glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, static_cast(index * buffer.vertices.vertex_size_bytes()), static_cast(3 * sizeof(float)), static_cast(sequential_view->current_position.data()))); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); - - sequential_view->current_offset = Vec3f::Zero(); - found = true; - break; - } - } - } - } - - if (found) - break; - } - - // second pass: filter paths by sequential data and collect them by color - RenderPath* render_path = nullptr; - for (const auto& [tbuffer_id, ibuffer_id, path_id, sub_path_id] : paths) { - TBuffer& buffer = const_cast(m_buffers[tbuffer_id]); - const Path& path = buffer.paths[path_id]; - const Path::Sub_Path& sub_path = path.sub_paths[sub_path_id]; - if (m_sequential_view.current.last < sub_path.first.s_id || sub_path.last.s_id < m_sequential_view.current.first) - continue; - - Color color; - switch (path.type) - { - case EMoveType::Tool_change: - case EMoveType::Color_change: - case EMoveType::Pause_Print: - case EMoveType::Custom_GCode: - case EMoveType::Retract: - case EMoveType::Unretract: - case EMoveType::Seam: { color = option_color(path.type); break; } - case EMoveType::Extrude: { - if (!top_layer_only || - m_sequential_view.current.last == global_endpoints.last || - is_in_layers_range(path, m_layers_z_range[1], m_layers_z_range[1])) - color = extrusion_color(path); - else - color = Neutral_Color; - - break; - } - case EMoveType::Travel: { - if (!top_layer_only || m_sequential_view.current.last == global_endpoints.last || is_travel_in_layers_range(path_id, m_layers_z_range[1], m_layers_z_range[1])) - color = (m_view_type == EViewType::Feedrate || m_view_type == EViewType::Tool || m_view_type == EViewType::ColorPrint) ? extrusion_color(path) : travel_color(path); - else - color = Neutral_Color; - - break; - } - case EMoveType::Wipe: { color = Wipe_Color; break; } - default: { color = { 0.0f, 0.0f, 0.0f, 1.0f }; break; } - } - - RenderPath key{ tbuffer_id, color, static_cast(ibuffer_id), path_id }; - if (render_path == nullptr || !RenderPathPropertyEqual()(*render_path, key)) { - buffer.render_paths.emplace_back(key); - render_path = const_cast(&buffer.render_paths.back()); - } - - unsigned int delta_1st = 0; - if (sub_path.first.s_id < m_sequential_view.current.first && m_sequential_view.current.first <= sub_path.last.s_id) - delta_1st = static_cast(m_sequential_view.current.first - sub_path.first.s_id); - - unsigned int size_in_indices = 0; - switch (buffer.render_primitive_type) - { - case TBuffer::ERenderPrimitiveType::Point: { - size_in_indices = buffer.indices_per_segment(); - break; - } - case TBuffer::ERenderPrimitiveType::Line: - case TBuffer::ERenderPrimitiveType::Triangle: { - unsigned int segments_count = std::min(m_sequential_view.current.last, sub_path.last.s_id) - std::max(m_sequential_view.current.first, sub_path.first.s_id); - size_in_indices = buffer.indices_per_segment() * segments_count; - break; - } - default: { break; } - } - - if (size_in_indices == 0) - continue; - - if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) { - if (sub_path_id == 0 && delta_1st == 0) - size_in_indices += 6; // add 2 triangles for starting cap - if (sub_path_id == path.sub_paths.size() - 1 && path.sub_paths.back().last.s_id <= m_sequential_view.current.last) - size_in_indices += 6; // add 2 triangles for ending cap - if (delta_1st > 0) - size_in_indices -= 6; // remove 2 triangles for corner cap - } - - render_path->sizes.push_back(size_in_indices); - - if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) { - delta_1st *= buffer.indices_per_segment(); - if (delta_1st > 0) { - delta_1st += 6; // skip 2 triangles for corner cap - if (sub_path_id == 0) - delta_1st += 6; // skip 2 triangles for starting cap - } - } - - render_path->offsets.push_back(static_cast((sub_path.first.i_id + delta_1st) * sizeof(IBufferType))); - -#if 0 - // check sizes and offsets against index buffer size on gpu - GLint buffer_size; - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer->indices[render_path->ibuffer_id].ibo)); - glsafe(::glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &buffer_size)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - if (render_path->offsets.back() + render_path->sizes.back() * sizeof(IBufferType) > buffer_size) - BOOST_LOG_TRIVIAL(error) << "GCodeViewer::refresh_render_paths: Invalid render path data"; -#endif - } - - // Removes empty render paths and sort. - for (size_t b = 0; b < m_buffers.size(); ++b) { - TBuffer* buffer = const_cast(&m_buffers[b]); - buffer->render_paths.erase(std::remove_if(buffer->render_paths.begin(), buffer->render_paths.end(), - [](const auto &path){ return path.sizes.empty() || path.offsets.empty(); }), - buffer->render_paths.end()); - } - - // second pass: for buffers using instanced and batched models, update the instances render ranges - for (size_t b = 0; b < m_buffers.size(); ++b) { - TBuffer& buffer = const_cast(m_buffers[b]); - if (buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::InstancedModel && - buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::BatchedModel) - continue; - - buffer.model.instances.render_ranges.reset(); - - if (!buffer.visible || buffer.model.instances.s_ids.empty()) - continue; - - buffer.model.instances.render_ranges.ranges.push_back({ 0, 0, 0, buffer.model.color }); - bool has_second_range = top_layer_only && m_sequential_view.current.last != m_sequential_view.global.last; - if (has_second_range) - buffer.model.instances.render_ranges.ranges.push_back({ 0, 0, 0, Neutral_Color }); - - if (m_sequential_view.current.first <= buffer.model.instances.s_ids.back() && buffer.model.instances.s_ids.front() <= m_sequential_view.current.last) { - for (size_t id : buffer.model.instances.s_ids) { - if (has_second_range) { - if (id < m_sequential_view.endpoints.first) { - ++buffer.model.instances.render_ranges.ranges.front().offset; - if (id <= m_sequential_view.current.first) - ++buffer.model.instances.render_ranges.ranges.back().offset; - else - ++buffer.model.instances.render_ranges.ranges.back().count; - } - else if (id <= m_sequential_view.current.last) - ++buffer.model.instances.render_ranges.ranges.front().count; - else - break; - } - else { - if (id <= m_sequential_view.current.first) - ++buffer.model.instances.render_ranges.ranges.front().offset; - else if (id <= m_sequential_view.current.last) - ++buffer.model.instances.render_ranges.ranges.front().count; - else - break; - } - } - } - } - - // set sequential data to their final value - sequential_view->endpoints = top_layer_only ? top_layer_endpoints : global_endpoints; - sequential_view->current.first = !top_layer_only && keep_sequential_current_first ? std::clamp(sequential_view->current.first, sequential_view->endpoints.first, sequential_view->endpoints.last) : sequential_view->endpoints.first; - sequential_view->global = global_endpoints; - - // updates sequential range caps - std::array* sequential_range_caps = const_cast*>(&m_sequential_range_caps); - (*sequential_range_caps)[0].reset(); - (*sequential_range_caps)[1].reset(); - - if (m_sequential_view.current.first != m_sequential_view.current.last) { - for (const auto& [tbuffer_id, ibuffer_id, path_id, sub_path_id] : paths) { - TBuffer& buffer = const_cast(m_buffers[tbuffer_id]); - if (buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Triangle) - continue; - - const Path& path = buffer.paths[path_id]; - const Path::Sub_Path& sub_path = path.sub_paths[sub_path_id]; - if (m_sequential_view.current.last <= sub_path.first.s_id || sub_path.last.s_id <= m_sequential_view.current.first) - continue; - - // update cap for first endpoint of current range - if (m_sequential_view.current.first > sub_path.first.s_id) { - SequentialRangeCap& cap = (*sequential_range_caps)[0]; - const IBuffer& i_buffer = buffer.indices[ibuffer_id]; - cap.buffer = &buffer; - cap.vbo = i_buffer.vbo; - - // calculate offset into the index buffer - unsigned int offset = sub_path.first.i_id; - offset += 6; // add 2 triangles for corner cap - offset += static_cast(m_sequential_view.current.first - sub_path.first.s_id) * buffer.indices_per_segment(); - if (sub_path_id == 0) - offset += 6; // add 2 triangles for starting cap - - // extract indices from index buffer - std::array indices{ 0, 0, 0, 0, 0, 0 }; - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); - glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 0) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[0]))); - glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 7) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[1]))); - glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 1) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[2]))); - glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 13) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[4]))); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - indices[3] = indices[0]; - indices[5] = indices[1]; - - // send indices to gpu - glsafe(::glGenBuffers(1, &cap.ibo)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cap.ibo)); - glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(IBufferType), indices.data(), GL_STATIC_DRAW)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - - // extract color from render path - size_t offset_bytes = offset * sizeof(IBufferType); - for (const RenderPath& render_path : buffer.render_paths) { - if (render_path.ibuffer_id == ibuffer_id) { - for (size_t j = 0; j < render_path.offsets.size(); ++j) { - if (render_path.contains(offset_bytes)) { - cap.color = render_path.color; - break; - } - } - } - } - } - - // update cap for last endpoint of current range - if (m_sequential_view.current.last < sub_path.last.s_id) { - SequentialRangeCap& cap = (*sequential_range_caps)[1]; - const IBuffer& i_buffer = buffer.indices[ibuffer_id]; - cap.buffer = &buffer; - cap.vbo = i_buffer.vbo; - - // calculate offset into the index buffer - unsigned int offset = sub_path.first.i_id; - offset += 6; // add 2 triangles for corner cap - offset += static_cast(m_sequential_view.current.last - 1 - sub_path.first.s_id) * buffer.indices_per_segment(); - if (sub_path_id == 0) - offset += 6; // add 2 triangles for starting cap - - // extract indices from index buffer - std::array indices{ 0, 0, 0, 0, 0, 0 }; - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); - glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 2) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[0]))); - glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 4) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[1]))); - glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 10) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[2]))); - glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 16) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[5]))); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - indices[3] = indices[0]; - indices[4] = indices[2]; - - // send indices to gpu - glsafe(::glGenBuffers(1, &cap.ibo)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cap.ibo)); - glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * sizeof(IBufferType), indices.data(), GL_STATIC_DRAW)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - - // extract color from render path - size_t offset_bytes = offset * sizeof(IBufferType); - for (const RenderPath& render_path : buffer.render_paths) { - if (render_path.ibuffer_id == ibuffer_id) { - for (size_t j = 0; j < render_path.offsets.size(); ++j) { - if (render_path.contains(offset_bytes)) { - cap.color = render_path.color; - break; - } - } - } - } - } - - if ((*sequential_range_caps)[0].is_renderable() && (*sequential_range_caps)[1].is_renderable()) - break; - } - } - - wxGetApp().plater()->enable_preview_moves_slider(!paths.empty()); - -#if ENABLE_GCODE_VIEWER_STATISTICS - for (const TBuffer& buffer : m_buffers) { - statistics->render_paths_size += SLIC3R_STDUNORDEREDSET_MEMSIZE(buffer.render_paths, RenderPath); - for (const RenderPath& path : buffer.render_paths) { - statistics->render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.sizes, unsigned int); - statistics->render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.offsets, size_t); - } - statistics->models_instances_size += SLIC3R_STDVEC_MEMSIZE(buffer.model.instances.buffer, float); - statistics->models_instances_size += SLIC3R_STDVEC_MEMSIZE(buffer.model.instances.s_ids, size_t); - statistics->models_instances_size += SLIC3R_STDVEC_MEMSIZE(buffer.model.instances.render_ranges.ranges, InstanceVBuffer::Ranges::Range); - } - statistics->refresh_paths_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); -#endif // ENABLE_GCODE_VIEWER_STATISTICS -} - -void GCodeViewer::render_toolpaths() -{ -#if ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS - float point_size = 20.0f; -#else - float point_size = 0.8f; -#endif // ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS - std::array light_intensity = { 0.25f, 0.70f, 0.75f, 0.75f }; - const Camera& camera = wxGetApp().plater()->get_camera(); - double zoom = camera.get_zoom(); - const std::array& viewport = camera.get_viewport(); - float near_plane_height = camera.get_type() == Camera::EType::Perspective ? static_cast(viewport[3]) / (2.0f * static_cast(2.0 * std::tan(0.5 * Geometry::deg2rad(camera.get_fov())))) : - static_cast(viewport[3]) * 0.0005; - - auto shader_init_as_points = [zoom, point_size, near_plane_height](GLShaderProgram& shader) { -#if ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS - shader.set_uniform("use_fixed_screen_size", 1); -#else - shader.set_uniform("use_fixed_screen_size", 0); -#endif // ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS - shader.set_uniform("zoom", zoom); - shader.set_uniform("percent_outline_radius", 0.0f); - shader.set_uniform("percent_center_radius", 0.33f); - shader.set_uniform("point_size", point_size); - shader.set_uniform("near_plane_height", near_plane_height); - }; - - auto render_as_points = [ -#if ENABLE_GCODE_VIEWER_STATISTICS - this -#endif // ENABLE_GCODE_VIEWER_STATISTICS - ](std::vector::iterator it_path, std::vector::iterator it_end, GLShaderProgram& shader, int uniform_color) { - glsafe(::glEnable(GL_VERTEX_PROGRAM_POINT_SIZE)); - glsafe(::glEnable(GL_POINT_SPRITE)); - - for (auto it = it_path; it != it_end && it_path->ibuffer_id == it->ibuffer_id; ++it) { - const RenderPath& path = *it; - // Some OpenGL drivers crash on empty glMultiDrawElements, see GH #7415. - assert(! path.sizes.empty()); - assert(! path.offsets.empty()); - glsafe(::glUniform4fv(uniform_color, 1, static_cast(path.color.data()))); - glsafe(::glMultiDrawElements(GL_POINTS, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); -#if ENABLE_GCODE_VIEWER_STATISTICS - ++m_statistics.gl_multi_points_calls_count; -#endif // ENABLE_GCODE_VIEWER_STATISTICS - } - - glsafe(::glDisable(GL_POINT_SPRITE)); - glsafe(::glDisable(GL_VERTEX_PROGRAM_POINT_SIZE)); - }; - - auto shader_init_as_lines = [light_intensity](GLShaderProgram &shader) { - shader.set_uniform("light_intensity", light_intensity); - }; - auto render_as_lines = [ -#if ENABLE_GCODE_VIEWER_STATISTICS - this -#endif // ENABLE_GCODE_VIEWER_STATISTICS - ](std::vector::iterator it_path, std::vector::iterator it_end, GLShaderProgram& shader, int uniform_color) { - for (auto it = it_path; it != it_end && it_path->ibuffer_id == it->ibuffer_id; ++it) { - const RenderPath& path = *it; - // Some OpenGL drivers crash on empty glMultiDrawElements, see GH #7415. - assert(! path.sizes.empty()); - assert(! path.offsets.empty()); - glsafe(::glUniform4fv(uniform_color, 1, static_cast(path.color.data()))); - glsafe(::glMultiDrawElements(GL_LINES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); -#if ENABLE_GCODE_VIEWER_STATISTICS - ++m_statistics.gl_multi_lines_calls_count; -#endif // ENABLE_GCODE_VIEWER_STATISTICS - } - }; - - auto render_as_triangles = [ -#if ENABLE_GCODE_VIEWER_STATISTICS - this -#endif // ENABLE_GCODE_VIEWER_STATISTICS - ](std::vector::iterator it_path, std::vector::iterator it_end, GLShaderProgram& shader, int uniform_color) { - for (auto it = it_path; it != it_end && it_path->ibuffer_id == it->ibuffer_id; ++it) { - const RenderPath& path = *it; - // Some OpenGL drivers crash on empty glMultiDrawElements, see GH #7415. - assert(! path.sizes.empty()); - assert(! path.offsets.empty()); - glsafe(::glUniform4fv(uniform_color, 1, static_cast(path.color.data()))); - glsafe(::glMultiDrawElements(GL_TRIANGLES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); -#if ENABLE_GCODE_VIEWER_STATISTICS - ++m_statistics.gl_multi_triangles_calls_count; -#endif // ENABLE_GCODE_VIEWER_STATISTICS - } - }; - - auto render_as_instanced_model = [ -#if ENABLE_GCODE_VIEWER_STATISTICS - this -#endif // ENABLE_GCODE_VIEWER_STATISTICS - ](TBuffer& buffer, GLShaderProgram & shader) { - for (auto& range : buffer.model.instances.render_ranges.ranges) { - if (range.vbo == 0 && range.count > 0) { - glsafe(::glGenBuffers(1, &range.vbo)); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, range.vbo)); - glsafe(::glBufferData(GL_ARRAY_BUFFER, range.count * buffer.model.instances.instance_size_bytes(), (const void*)&buffer.model.instances.buffer[range.offset * buffer.model.instances.instance_size_floats()], GL_STATIC_DRAW)); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); - } - - if (range.vbo > 0) { - buffer.model.model.set_color(-1, range.color); - buffer.model.model.render_instanced(range.vbo, range.count); -#if ENABLE_GCODE_VIEWER_STATISTICS - ++m_statistics.gl_instanced_models_calls_count; - m_statistics.total_instances_gpu_size += static_cast(range.count * buffer.model.instances.instance_size_bytes()); -#endif // ENABLE_GCODE_VIEWER_STATISTICS - } - } - }; - -#if ENABLE_GCODE_VIEWER_STATISTICS - auto render_as_batched_model = [this](TBuffer& buffer, GLShaderProgram& shader) { -#else - auto render_as_batched_model = [](TBuffer& buffer, GLShaderProgram& shader) { -#endif // ENABLE_GCODE_VIEWER_STATISTICS - - struct Range - { - unsigned int first; - unsigned int last; - bool intersects(const Range& other) const { return (other.last < first || other.first > last) ? false : true; } - }; - Range buffer_range = { 0, 0 }; - size_t indices_per_instance = buffer.model.data.indices_count(); - - for (size_t j = 0; j < buffer.indices.size(); ++j) { - const IBuffer& i_buffer = buffer.indices[j]; - buffer_range.last = buffer_range.first + i_buffer.count / indices_per_instance; - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, i_buffer.vbo)); - glsafe(::glVertexPointer(buffer.vertices.position_size_floats(), GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_bytes())); - glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); - bool has_normals = buffer.vertices.normal_size_floats() > 0; - if (has_normals) { - glsafe(::glNormalPointer(GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); - glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); - } - - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); - - for (auto& range : buffer.model.instances.render_ranges.ranges) { - Range range_range = { range.offset, range.offset + range.count }; - if (range_range.intersects(buffer_range)) { - shader.set_uniform("uniform_color", range.color); - unsigned int offset = (range_range.first > buffer_range.first) ? range_range.first - buffer_range.first : 0; - size_t offset_bytes = static_cast(offset) * indices_per_instance * sizeof(IBufferType); - Range render_range = { std::max(range_range.first, buffer_range.first), std::min(range_range.last, buffer_range.last) }; - size_t count = static_cast(render_range.last - render_range.first) * indices_per_instance; - if (count > 0) { - glsafe(::glDrawElements(GL_TRIANGLES, (GLsizei)count, GL_UNSIGNED_SHORT, (const void*)offset_bytes)); -#if ENABLE_GCODE_VIEWER_STATISTICS - ++m_statistics.gl_batched_models_calls_count; -#endif // ENABLE_GCODE_VIEWER_STATISTICS - } - } - } - - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - - if (has_normals) - glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); - - glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); - - buffer_range.first = buffer_range.last; - } - }; - - auto line_width = [](double zoom) { - return (zoom < 5.0) ? 1.0 : (1.0 + 5.0 * (zoom - 5.0) / (100.0 - 5.0)); - }; - - unsigned char begin_id = buffer_id(EMoveType::Retract); - unsigned char end_id = buffer_id(EMoveType::Count); - - for (unsigned char i = begin_id; i < end_id; ++i) { - TBuffer& buffer = m_buffers[i]; - if (!buffer.visible || !buffer.has_data()) - continue; - - GLShaderProgram* shader = wxGetApp().get_shader(buffer.shader.c_str()); - if (shader != nullptr) { - shader->start_using(); - - if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::InstancedModel) { - shader->set_uniform("emission_factor", 0.25f); - render_as_instanced_model(buffer, *shader); - shader->set_uniform("emission_factor", 0.0f); - } - else if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::BatchedModel) { - shader->set_uniform("emission_factor", 0.25f); - render_as_batched_model(buffer, *shader); - shader->set_uniform("emission_factor", 0.0f); - } - else { - switch (buffer.render_primitive_type) { - case TBuffer::ERenderPrimitiveType::Point: shader_init_as_points(*shader); break; - case TBuffer::ERenderPrimitiveType::Line: shader_init_as_lines(*shader); break; - default: break; - } - int uniform_color = shader->get_uniform_location("uniform_color"); - auto it_path = buffer.render_paths.begin(); - for (unsigned int ibuffer_id = 0; ibuffer_id < static_cast(buffer.indices.size()); ++ibuffer_id) { - const IBuffer& i_buffer = buffer.indices[ibuffer_id]; - // Skip all paths with ibuffer_id < ibuffer_id. - for (; it_path != buffer.render_paths.end() && it_path->ibuffer_id < ibuffer_id; ++ it_path) ; - if (it_path == buffer.render_paths.end() || it_path->ibuffer_id > ibuffer_id) - // Not found. This shall not happen. - continue; - - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, i_buffer.vbo)); - glsafe(::glVertexPointer(buffer.vertices.position_size_floats(), GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_bytes())); - glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); - bool has_normals = buffer.vertices.normal_size_floats() > 0; - if (has_normals) { - glsafe(::glNormalPointer(GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); - glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); - } - - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); - - // Render all elements with it_path->ibuffer_id == ibuffer_id, possible with varying colors. - switch (buffer.render_primitive_type) - { - case TBuffer::ERenderPrimitiveType::Point: { - render_as_points(it_path, buffer.render_paths.end(), *shader, uniform_color); - break; - } - case TBuffer::ERenderPrimitiveType::Line: { - glsafe(::glLineWidth(static_cast(line_width(zoom)))); - render_as_lines(it_path, buffer.render_paths.end(), *shader, uniform_color); - break; - } - case TBuffer::ERenderPrimitiveType::Triangle: { - render_as_triangles(it_path, buffer.render_paths.end(), *shader, uniform_color); - break; - } - default: { break; } - } - - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - - if (has_normals) - glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); - - glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); - } - } - - shader->stop_using(); - } - } - -#if ENABLE_GCODE_VIEWER_STATISTICS - auto render_sequential_range_cap = [this] -#else - auto render_sequential_range_cap = [] -#endif // ENABLE_GCODE_VIEWER_STATISTICS - (const SequentialRangeCap& cap) { - GLShaderProgram* shader = wxGetApp().get_shader(cap.buffer->shader.c_str()); - if (shader != nullptr) { - shader->start_using(); - - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, cap.vbo)); - glsafe(::glVertexPointer(cap.buffer->vertices.position_size_floats(), GL_FLOAT, cap.buffer->vertices.vertex_size_bytes(), (const void*)cap.buffer->vertices.position_offset_bytes())); - glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); - bool has_normals = cap.buffer->vertices.normal_size_floats() > 0; - if (has_normals) { - glsafe(::glNormalPointer(GL_FLOAT, cap.buffer->vertices.vertex_size_bytes(), (const void*)cap.buffer->vertices.normal_offset_bytes())); - glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); - } - - shader->set_uniform("uniform_color", cap.color); - - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cap.ibo)); - glsafe(::glDrawElements(GL_TRIANGLES, (GLsizei)cap.indices_count(), GL_UNSIGNED_SHORT, nullptr)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - -#if ENABLE_GCODE_VIEWER_STATISTICS - ++m_statistics.gl_triangles_calls_count; -#endif // ENABLE_GCODE_VIEWER_STATISTICS - - if (has_normals) - glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); - - glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); - - shader->stop_using(); - } - }; - - for (unsigned int i = 0; i < 2; ++i) { - if (m_sequential_range_caps[i].is_renderable()) - render_sequential_range_cap(m_sequential_range_caps[i]); - } -} - -void GCodeViewer::render_shells() -{ - if (!m_shells.visible || m_shells.volumes.empty()) - return; - - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); - if (shader == nullptr) - return; - - // when the background processing is enabled, it may happen that the shells data have been loaded - // before opengl has been initialized for the preview canvas. - // when this happens, the volumes' data have not been sent to gpu yet. - for (GLVolume* v : m_shells.volumes.volumes) { - if (!v->indexed_vertex_array.has_VBOs()) - v->finalize_geometry(true); - } - -// glsafe(::glDepthMask(GL_FALSE)); - - shader->start_using(); - m_shells.volumes.render(GLVolumeCollection::ERenderType::Transparent, true, wxGetApp().plater()->get_camera().get_view_matrix()); - shader->stop_using(); - -// glsafe(::glDepthMask(GL_TRUE)); -} - -void GCodeViewer::render_legend(float& legend_height) -{ - if (!m_legend_enabled) - return; - - const Size cnv_size = wxGetApp().plater()->get_current_canvas3D()->get_canvas_size(); - - ImGuiWrapper& imgui = *wxGetApp().imgui(); - - imgui.set_next_window_pos(0.0f, 0.0f, ImGuiCond_Always); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); - ImGui::SetNextWindowBgAlpha(0.6f); - const float max_height = 0.75f * static_cast(cnv_size.get_height()); - const float child_height = 0.3333f * max_height; - ImGui::SetNextWindowSizeConstraints({ 0.0f, 0.0f }, { -1.0f, max_height }); - imgui.begin(std::string("Legend"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove); - - enum class EItemType : unsigned char - { - Rect, - Circle, - Hexagon, - Line - }; - - const PrintEstimatedStatistics::Mode& time_mode = m_print_statistics.modes[static_cast(m_time_estimate_mode)]; - bool show_estimated_time = time_mode.time > 0.0f && (m_view_type == EViewType::FeatureType || - (m_view_type == EViewType::ColorPrint && !time_mode.custom_gcode_times.empty())); - - const float icon_size = ImGui::GetTextLineHeight(); - const float percent_bar_size = 2.0f * ImGui::GetTextLineHeight(); - - bool imperial_units = wxGetApp().app_config->get("use_inches") == "1"; - - auto append_item = [icon_size, percent_bar_size, &imgui, imperial_units](EItemType type, const Color& color, const std::string& label, - bool visible = true, const std::string& time = "", float percent = 0.0f, float max_percent = 0.0f, const std::array& offsets = { 0.0f, 0.0f, 0.0f, 0.0f }, - double used_filament_m = 0.0, double used_filament_g = 0.0, - std::function callback = nullptr) { - if (!visible) - ImGui::PushStyleVar(ImGuiStyleVar_Alpha, 0.3333f); - - ImDrawList* draw_list = ImGui::GetWindowDrawList(); - ImVec2 pos = ImGui::GetCursorScreenPos(); - switch (type) { - default: - case EItemType::Rect: { - draw_list->AddRectFilled({ pos.x + 1.0f, pos.y + 1.0f }, { pos.x + icon_size - 1.0f, pos.y + icon_size - 1.0f }, - ImGui::GetColorU32({ color[0], color[1], color[2], 1.0f })); - break; - } - case EItemType::Circle: { - ImVec2 center(0.5f * (pos.x + pos.x + icon_size), 0.5f * (pos.y + pos.y + icon_size)); - draw_list->AddCircleFilled(center, 0.5f * icon_size, ImGui::GetColorU32({ color[0], color[1], color[2], 1.0f }), 16); - break; - } - case EItemType::Hexagon: { - ImVec2 center(0.5f * (pos.x + pos.x + icon_size), 0.5f * (pos.y + pos.y + icon_size)); - draw_list->AddNgonFilled(center, 0.5f * icon_size, ImGui::GetColorU32({ color[0], color[1], color[2], 1.0f }), 6); - break; - } - case EItemType::Line: { - draw_list->AddLine({ pos.x + 1, pos.y + icon_size - 1 }, { pos.x + icon_size - 1, pos.y + 1 }, ImGui::GetColorU32({ color[0], color[1], color[2], 1.0f }), 3.0f); - break; - } - } - - // draw text - ImGui::Dummy({ icon_size, icon_size }); - ImGui::SameLine(); - if (callback != nullptr) { - if (ImGui::MenuItem(label.c_str())) - callback(); - else { - // show tooltip - if (ImGui::IsItemHovered()) { - if (!visible) - ImGui::PopStyleVar(); - ImGui::PushStyleColor(ImGuiCol_PopupBg, ImGuiWrapper::COL_WINDOW_BACKGROUND); - ImGui::BeginTooltip(); - imgui.text(visible ? _u8L("Click to hide") : _u8L("Click to show")); - ImGui::EndTooltip(); - ImGui::PopStyleColor(); - if (!visible) - ImGui::PushStyleVar(ImGuiStyleVar_Alpha, 0.3333f); - - // to avoid the tooltip to change size when moving the mouse - imgui.set_requires_extra_frame(); - } - } - - if (!time.empty()) { - ImGui::SameLine(offsets[0]); - imgui.text(time); - ImGui::SameLine(offsets[1]); - pos = ImGui::GetCursorScreenPos(); - const float width = std::max(1.0f, percent_bar_size * percent / max_percent); - draw_list->AddRectFilled({ pos.x, pos.y + 2.0f }, { pos.x + width, pos.y + icon_size - 2.0f }, - ImGui::GetColorU32(ImGuiWrapper::COL_ORANGE_LIGHT)); - ImGui::Dummy({ percent_bar_size, icon_size }); - ImGui::SameLine(); - char buf[64]; - ::sprintf(buf, "%.1f%%", 100.0f * percent); - ImGui::TextUnformatted((percent > 0.0f) ? buf : ""); - ImGui::SameLine(offsets[2]); - ::sprintf(buf, imperial_units ? "%.2f in" : "%.2f m", used_filament_m); - imgui.text(buf); - ImGui::SameLine(offsets[3]); - ::sprintf(buf, "%.2f g", used_filament_g); - imgui.text(buf); - } - } - else { - imgui.text(label); - if (used_filament_m > 0.0) { - char buf[64]; - ImGui::SameLine(offsets[0]); - ::sprintf(buf, imperial_units ? "%.2f in" : "%.2f m", used_filament_m); - imgui.text(buf); - ImGui::SameLine(offsets[1]); - ::sprintf(buf, "%.2f g", used_filament_g); - imgui.text(buf); - } - } - - if (!visible) - ImGui::PopStyleVar(); - }; - - auto append_range = [append_item](const Extrusions::Range& range, unsigned int decimals) { - auto append_range_item = [append_item](int i, float value, unsigned int decimals) { - char buf[1024]; - ::sprintf(buf, "%.*f", decimals, value); - append_item(EItemType::Rect, Range_Colors[i], buf); - }; - - if (range.count == 1) - // single item use case - append_range_item(0, range.min, decimals); - else if (range.count == 2) { - append_range_item(static_cast(Range_Colors.size()) - 1, range.max, decimals); - append_range_item(0, range.min, decimals); - } - else { - const float step_size = range.step_size(); - for (int i = static_cast(Range_Colors.size()) - 1; i >= 0; --i) { - append_range_item(i, range.min + static_cast(i) * step_size, decimals); - } - } - }; - - auto append_headers = [&imgui](const std::array& texts, const std::array& offsets) { - size_t i = 0; - for (; i < offsets.size(); i++) { - imgui.text(texts[i]); - ImGui::SameLine(offsets[i]); - } - imgui.text(texts[i]); - ImGui::Separator(); - }; - - auto max_width = [](const std::vector& items, const std::string& title, float extra_size = 0.0f) { - float ret = ImGui::CalcTextSize(title.c_str()).x; - for (const std::string& item : items) { - ret = std::max(ret, extra_size + ImGui::CalcTextSize(item.c_str()).x); - } - return ret; - }; - - auto calculate_offsets = [max_width](const std::vector& labels, const std::vector& times, - const std::array& titles, float extra_size = 0.0f) { - const ImGuiStyle& style = ImGui::GetStyle(); - std::array ret = { 0.0f, 0.0f, 0.0f, 0.0f }; - ret[0] = max_width(labels, titles[0], extra_size) + 3.0f * style.ItemSpacing.x; - for (size_t i = 1; i < titles.size(); i++) - ret[i] = ret[i-1] + max_width(times, titles[i]) + style.ItemSpacing.x; - return ret; - }; - - auto color_print_ranges = [this](unsigned char extruder_id, const std::vector& custom_gcode_per_print_z) { - std::vector>> ret; - ret.reserve(custom_gcode_per_print_z.size()); - - for (const auto& item : custom_gcode_per_print_z) { - if (extruder_id + 1 != static_cast(item.extruder)) - continue; - - if (item.type != ColorChange) - continue; - - const std::vector zs = m_layers.get_zs(); - auto lower_b = std::lower_bound(zs.begin(), zs.end(), item.print_z - Slic3r::DoubleSlider::epsilon()); - if (lower_b == zs.end()) - continue; - - const double current_z = *lower_b; - const double previous_z = (lower_b == zs.begin()) ? 0.0 : *(--lower_b); - - // to avoid duplicate values, check adding values - if (ret.empty() || !(ret.back().second.first == previous_z && ret.back().second.second == current_z)) - ret.push_back({ decode_color(item.color), { previous_z, current_z } }); - } - - return ret; - }; - - auto upto_label = [](double z) { - char buf[64]; - ::sprintf(buf, "%.2f", z); - return _u8L("up to") + " " + std::string(buf) + " " + _u8L("mm"); - }; - - auto above_label = [](double z) { - char buf[64]; - ::sprintf(buf, "%.2f", z); - return _u8L("above") + " " + std::string(buf) + " " + _u8L("mm"); - }; - - auto fromto_label = [](double z1, double z2) { - char buf1[64]; - ::sprintf(buf1, "%.2f", z1); - char buf2[64]; - ::sprintf(buf2, "%.2f", z2); - return _u8L("from") + " " + std::string(buf1) + " " + _u8L("to") + " " + std::string(buf2) + " " + _u8L("mm"); - }; - - auto role_time_and_percent = [time_mode](ExtrusionRole role) { - auto it = std::find_if(time_mode.roles_times.begin(), time_mode.roles_times.end(), [role](const std::pair& item) { return role == item.first; }); - return (it != time_mode.roles_times.end()) ? std::make_pair(it->second, it->second / time_mode.time) : std::make_pair(0.0f, 0.0f); - }; - - auto used_filament_per_role = [this, imperial_units](ExtrusionRole role) { - auto it = m_print_statistics.used_filaments_per_role.find(role); - if (it == m_print_statistics.used_filaments_per_role.end()) - return std::make_pair(0.0, 0.0); - - double koef = imperial_units ? 1000.0 / ObjectManipulation::in_to_mm : 1.0; - return std::make_pair(it->second.first * koef, it->second.second); - }; - - // data used to properly align items in columns when showing time - std::array offsets = { 0.0f, 0.0f, 0.0f, 0.0f }; - std::vector labels; - std::vector times; - std::vector percents; - std::vector used_filaments_m; - std::vector used_filaments_g; - float max_percent = 0.0f; - - if (m_view_type == EViewType::FeatureType) { - // calculate offsets to align time/percentage data - for (size_t i = 0; i < m_roles.size(); ++i) { - ExtrusionRole role = m_roles[i]; - if (role < erCount) { - labels.push_back(_u8L(ExtrusionEntity::role_to_string(role))); - auto [time, percent] = role_time_and_percent(role); - times.push_back((time > 0.0f) ? short_time(get_time_dhms(time)) : ""); - percents.push_back(percent); - max_percent = std::max(max_percent, percent); - auto [used_filament_m, used_filament_g] = used_filament_per_role(role); - used_filaments_m.push_back(used_filament_m); - used_filaments_g.push_back(used_filament_g); - } - } - - std::string longest_percentage_string; - for (double item : percents) { - char buffer[64]; - ::sprintf(buffer, "%.2f %%", item); - if (::strlen(buffer) > longest_percentage_string.length()) - longest_percentage_string = buffer; - } - longest_percentage_string += " "; - if (_u8L("Percentage").length() > longest_percentage_string.length()) - longest_percentage_string = _u8L("Percentage"); - - std::string longest_used_filament_string; - for (double item : used_filaments_m) { - char buffer[64]; - ::sprintf(buffer, imperial_units ? "%.2f in" : "%.2f m", item); - if (::strlen(buffer) > longest_used_filament_string.length()) - longest_used_filament_string = buffer; - } - - offsets = calculate_offsets(labels, times, { _u8L("Feature type"), _u8L("Time"), longest_percentage_string, longest_used_filament_string }, icon_size); - } - - // get used filament (meters and grams) from used volume in respect to the active extruder - auto get_used_filament_from_volume = [this, imperial_units](double volume, int extruder_id) { - double koef = imperial_units ? 1.0 / ObjectManipulation::in_to_mm : 0.001; - std::pair ret = { koef * volume / (PI * sqr(0.5 * m_filament_diameters[extruder_id])), - volume * m_filament_densities[extruder_id] * 0.001 }; - return ret; - }; - - if (m_view_type == EViewType::Tool) { - // calculate used filaments data - for (size_t extruder_id : m_extruder_ids) { - if (m_print_statistics.volumes_per_extruder.find(extruder_id) == m_print_statistics.volumes_per_extruder.end()) - continue; - double volume = m_print_statistics.volumes_per_extruder.at(extruder_id); - - auto [used_filament_m, used_filament_g] = get_used_filament_from_volume(volume, extruder_id); - used_filaments_m.push_back(used_filament_m); - used_filaments_g.push_back(used_filament_g); - } - - std::string longest_used_filament_string; - for (double item : used_filaments_m) { - char buffer[64]; - ::sprintf(buffer, imperial_units ? "%.2f in" : "%.2f m", item); - if (::strlen(buffer) > longest_used_filament_string.length()) - longest_used_filament_string = buffer; - } - - offsets = calculate_offsets(labels, times, { "Extruder NNN", longest_used_filament_string }, icon_size); - } - - // extrusion paths section -> title - switch (m_view_type) - { - case EViewType::FeatureType: - { - append_headers({ _u8L("Feature type"), _u8L("Time"), _u8L("Percentage"), _u8L("Used filament") }, offsets); - break; - } - case EViewType::Height: { imgui.title(_u8L("Height (mm)")); break; } - case EViewType::Width: { imgui.title(_u8L("Width (mm)")); break; } - case EViewType::Feedrate: { imgui.title(_u8L("Speed (mm/s)")); break; } - case EViewType::FanSpeed: { imgui.title(_u8L("Fan Speed (%)")); break; } - case EViewType::Temperature: { imgui.title(_u8L("Temperature (°C)")); break; } - case EViewType::VolumetricRate: { imgui.title(_u8L("Volumetric flow rate (mm³/s)")); break; } - case EViewType::Tool: - { - append_headers({ _u8L("Tool"), _u8L("Used filament") }, offsets); - break; - } - case EViewType::ColorPrint: { imgui.title(_u8L("Color Print")); break; } - default: { break; } - } - - // extrusion paths section -> items - switch (m_view_type) - { - case EViewType::FeatureType: - { - for (size_t i = 0; i < m_roles.size(); ++i) { - ExtrusionRole role = m_roles[i]; - if (role >= erCount) - continue; - const bool visible = is_visible(role); - append_item(EItemType::Rect, Extrusion_Role_Colors[static_cast(role)], labels[i], - visible, times[i], percents[i], max_percent, offsets, used_filaments_m[i], used_filaments_g[i], [this, role, visible]() { - m_extrusions.role_visibility_flags = visible ? m_extrusions.role_visibility_flags & ~(1 << role) : m_extrusions.role_visibility_flags | (1 << role); - // update buffers' render paths - refresh_render_paths(false, false); - wxGetApp().plater()->update_preview_moves_slider(); - wxGetApp().plater()->get_current_canvas3D()->set_as_dirty(); - wxGetApp().plater()->update_preview_bottom_toolbar(); - } - ); - } - break; - } - case EViewType::Height: { append_range(m_extrusions.ranges.height, 3); break; } - case EViewType::Width: { append_range(m_extrusions.ranges.width, 3); break; } - case EViewType::Feedrate: { append_range(m_extrusions.ranges.feedrate, 1); break; } - case EViewType::FanSpeed: { append_range(m_extrusions.ranges.fan_speed, 0); break; } - case EViewType::Temperature: { append_range(m_extrusions.ranges.temperature, 0); break; } - case EViewType::VolumetricRate: { append_range(m_extrusions.ranges.volumetric_rate, 3); break; } - case EViewType::Tool: - { - // shows only extruders actually used - size_t i = 0; - for (unsigned char extruder_id : m_extruder_ids) { - append_item(EItemType::Rect, m_tool_colors[extruder_id], _u8L("Extruder") + " " + std::to_string(extruder_id + 1), - true, "", 0.0f, 0.0f, offsets, used_filaments_m[i], used_filaments_g[i]); - i++; - } - break; - } - case EViewType::ColorPrint: - { - const std::vector& custom_gcode_per_print_z = wxGetApp().is_editor() ? wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes : m_custom_gcode_per_print_z; - size_t total_items = 1; - for (unsigned char i : m_extruder_ids) { - total_items += color_print_ranges(i, custom_gcode_per_print_z).size(); - } - - const bool need_scrollable = static_cast(total_items) * (icon_size + ImGui::GetStyle().ItemSpacing.y) > child_height; - - // add scrollable region, if needed - if (need_scrollable) - ImGui::BeginChild("color_prints", { -1.0f, child_height }, false); - if (m_extruders_count == 1) { // single extruder use case - const std::vector>> cp_values = color_print_ranges(0, custom_gcode_per_print_z); - const int items_cnt = static_cast(cp_values.size()); - if (items_cnt == 0) { // There are no color changes, but there are some pause print or custom Gcode - append_item(EItemType::Rect, m_tool_colors.front(), _u8L("Default color")); - } - else { - for (int i = items_cnt; i >= 0; --i) { - // create label for color change item - if (i == 0) { - append_item(EItemType::Rect, m_tool_colors[0], upto_label(cp_values.front().second.first)); - break; - } - else if (i == items_cnt) { - append_item(EItemType::Rect, cp_values[i - 1].first, above_label(cp_values[i - 1].second.second)); - continue; - } - append_item(EItemType::Rect, cp_values[i - 1].first, fromto_label(cp_values[i - 1].second.second, cp_values[i].second.first)); - } - } - } - else { // multi extruder use case - // shows only extruders actually used - for (unsigned char i : m_extruder_ids) { - const std::vector>> cp_values = color_print_ranges(i, custom_gcode_per_print_z); - const int items_cnt = static_cast(cp_values.size()); - if (items_cnt == 0) { // There are no color changes, but there are some pause print or custom Gcode - append_item(EItemType::Rect, m_tool_colors[i], _u8L("Extruder") + " " + std::to_string(i + 1) + " " + _u8L("default color")); - } - else { - for (int j = items_cnt; j >= 0; --j) { - // create label for color change item - std::string label = _u8L("Extruder") + " " + std::to_string(i + 1); - if (j == 0) { - label += " " + upto_label(cp_values.front().second.first); - append_item(EItemType::Rect, m_tool_colors[i], label); - break; - } - else if (j == items_cnt) { - label += " " + above_label(cp_values[j - 1].second.second); - append_item(EItemType::Rect, cp_values[j - 1].first, label); - continue; - } - - label += " " + fromto_label(cp_values[j - 1].second.second, cp_values[j].second.first); - append_item(EItemType::Rect, cp_values[j - 1].first, label); - } - } - } - } - if (need_scrollable) - ImGui::EndChild(); - - break; - } - default: { break; } - } - - // partial estimated printing time section - if (m_view_type == EViewType::ColorPrint) { - using Times = std::pair; - using TimesList = std::vector>; - - // helper structure containig the data needed to render the time items - struct PartialTime - { - enum class EType : unsigned char - { - Print, - ColorChange, - Pause - }; - EType type; - int extruder_id; - Color color1; - Color color2; - Times times; - std::pair used_filament {0.0f, 0.0f}; - }; - using PartialTimes = std::vector; - - auto generate_partial_times = [this, get_used_filament_from_volume](const TimesList& times, const std::vector& used_filaments) { - PartialTimes items; - - std::vector custom_gcode_per_print_z = wxGetApp().is_editor() ? wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes : m_custom_gcode_per_print_z; - std::vector last_color(m_extruders_count); - for (size_t i = 0; i < m_extruders_count; ++i) { - last_color[i] = m_tool_colors[i]; - } - int last_extruder_id = 1; - int color_change_idx = 0; - for (const auto& time_rec : times) { - switch (time_rec.first) - { - case CustomGCode::PausePrint: { - auto it = std::find_if(custom_gcode_per_print_z.begin(), custom_gcode_per_print_z.end(), [time_rec](const CustomGCode::Item& item) { return item.type == time_rec.first; }); - if (it != custom_gcode_per_print_z.end()) { - items.push_back({ PartialTime::EType::Print, it->extruder, last_color[it->extruder - 1], Color(), time_rec.second }); - items.push_back({ PartialTime::EType::Pause, it->extruder, Color(), Color(), time_rec.second }); - custom_gcode_per_print_z.erase(it); - } - break; - } - case CustomGCode::ColorChange: { - auto it = std::find_if(custom_gcode_per_print_z.begin(), custom_gcode_per_print_z.end(), [time_rec](const CustomGCode::Item& item) { return item.type == time_rec.first; }); - if (it != custom_gcode_per_print_z.end()) { - items.push_back({ PartialTime::EType::Print, it->extruder, last_color[it->extruder - 1], Color(), time_rec.second, get_used_filament_from_volume(used_filaments[color_change_idx++], it->extruder-1) }); - items.push_back({ PartialTime::EType::ColorChange, it->extruder, last_color[it->extruder - 1], decode_color(it->color), time_rec.second }); - last_color[it->extruder - 1] = decode_color(it->color); - last_extruder_id = it->extruder; - custom_gcode_per_print_z.erase(it); - } - else - items.push_back({ PartialTime::EType::Print, last_extruder_id, last_color[last_extruder_id - 1], Color(), time_rec.second, get_used_filament_from_volume(used_filaments[color_change_idx++], last_extruder_id -1) }); - - break; - } - default: { break; } - } - } - - return items; - }; - - auto append_color_change = [&imgui](const Color& color1, const Color& color2, const std::array& offsets, const Times& times) { - imgui.text(_u8L("Color change")); - ImGui::SameLine(); - - float icon_size = ImGui::GetTextLineHeight(); - ImDrawList* draw_list = ImGui::GetWindowDrawList(); - ImVec2 pos = ImGui::GetCursorScreenPos(); - pos.x -= 0.5f * ImGui::GetStyle().ItemSpacing.x; - - draw_list->AddRectFilled({ pos.x + 1.0f, pos.y + 1.0f }, { pos.x + icon_size - 1.0f, pos.y + icon_size - 1.0f }, - ImGui::GetColorU32({ color1[0], color1[1], color1[2], 1.0f })); - pos.x += icon_size; - draw_list->AddRectFilled({ pos.x + 1.0f, pos.y + 1.0f }, { pos.x + icon_size - 1.0f, pos.y + icon_size - 1.0f }, - ImGui::GetColorU32({ color2[0], color2[1], color2[2], 1.0f })); - - ImGui::SameLine(offsets[0]); - imgui.text(short_time(get_time_dhms(times.second - times.first))); - }; - - auto append_print = [&imgui, imperial_units](const Color& color, const std::array& offsets, const Times& times, std::pair used_filament) { - imgui.text(_u8L("Print")); - ImGui::SameLine(); - - float icon_size = ImGui::GetTextLineHeight(); - ImDrawList* draw_list = ImGui::GetWindowDrawList(); - ImVec2 pos = ImGui::GetCursorScreenPos(); - pos.x -= 0.5f * ImGui::GetStyle().ItemSpacing.x; - - draw_list->AddRectFilled({ pos.x + 1.0f, pos.y + 1.0f }, { pos.x + icon_size - 1.0f, pos.y + icon_size - 1.0f }, - ImGui::GetColorU32({ color[0], color[1], color[2], 1.0f })); - - ImGui::SameLine(offsets[0]); - imgui.text(short_time(get_time_dhms(times.second))); - ImGui::SameLine(offsets[1]); - imgui.text(short_time(get_time_dhms(times.first))); - if (used_filament.first > 0.0f) { - char buffer[64]; - ImGui::SameLine(offsets[2]); - ::sprintf(buffer, imperial_units ? "%.2f in" : "%.2f m", used_filament.first); - imgui.text(buffer); - - ImGui::SameLine(offsets[3]); - ::sprintf(buffer, "%.2f g", used_filament.second); - imgui.text(buffer); - } - }; - - PartialTimes partial_times = generate_partial_times(time_mode.custom_gcode_times, m_print_statistics.volumes_per_color_change); - if (!partial_times.empty()) { - labels.clear(); - times.clear(); - - for (const PartialTime& item : partial_times) { - switch (item.type) - { - case PartialTime::EType::Print: { labels.push_back(_u8L("Print")); break; } - case PartialTime::EType::Pause: { labels.push_back(_u8L("Pause")); break; } - case PartialTime::EType::ColorChange: { labels.push_back(_u8L("Color change")); break; } - } - times.push_back(short_time(get_time_dhms(item.times.second))); - } - - - std::string longest_used_filament_string; - for (const PartialTime& item : partial_times) { - if (item.used_filament.first > 0.0f) { - char buffer[64]; - ::sprintf(buffer, imperial_units ? "%.2f in" : "%.2f m", item.used_filament.first); - if (::strlen(buffer) > longest_used_filament_string.length()) - longest_used_filament_string = buffer; - } - } - - offsets = calculate_offsets(labels, times, { _u8L("Event"), _u8L("Remaining time"), _u8L("Duration"), longest_used_filament_string }, 2.0f * icon_size); - - ImGui::Spacing(); - append_headers({ _u8L("Event"), _u8L("Remaining time"), _u8L("Duration"), _u8L("Used filament") }, offsets); - const bool need_scrollable = static_cast(partial_times.size()) * (icon_size + ImGui::GetStyle().ItemSpacing.y) > child_height; - if (need_scrollable) - // add scrollable region - ImGui::BeginChild("events", { -1.0f, child_height }, false); - - for (const PartialTime& item : partial_times) { - switch (item.type) - { - case PartialTime::EType::Print: { - append_print(item.color1, offsets, item.times, item.used_filament); - break; - } - case PartialTime::EType::Pause: { - imgui.text(_u8L("Pause")); - ImGui::SameLine(offsets[0]); - imgui.text(short_time(get_time_dhms(item.times.second - item.times.first))); - break; - } - case PartialTime::EType::ColorChange: { - append_color_change(item.color1, item.color2, offsets, item.times); - break; - } - } - } - - if (need_scrollable) - ImGui::EndChild(); - } - } - - // travel paths section - if (m_buffers[buffer_id(EMoveType::Travel)].visible) { - switch (m_view_type) - { - case EViewType::Feedrate: - case EViewType::Tool: - case EViewType::ColorPrint: { - break; - } - default: { - // title - ImGui::Spacing(); - imgui.title(_u8L("Travel")); - - // items - append_item(EItemType::Line, Travel_Colors[0], _u8L("Movement")); - append_item(EItemType::Line, Travel_Colors[1], _u8L("Extrusion")); - append_item(EItemType::Line, Travel_Colors[2], _u8L("Retraction")); - - break; - } - } - } - - // wipe paths section - if (m_buffers[buffer_id(EMoveType::Wipe)].visible) { - switch (m_view_type) - { - case EViewType::Feedrate: - case EViewType::Tool: - case EViewType::ColorPrint: { break; } - default: { - // title - ImGui::Spacing(); - imgui.title(_u8L("Wipe")); - - // items - append_item(EItemType::Line, Wipe_Color, _u8L("Wipe")); - - break; - } - } - } - - auto any_option_available = [this]() { - auto available = [this](EMoveType type) { - const TBuffer& buffer = m_buffers[buffer_id(type)]; - return buffer.visible && buffer.has_data(); - }; - - return available(EMoveType::Color_change) || - available(EMoveType::Custom_GCode) || - available(EMoveType::Pause_Print) || - available(EMoveType::Retract) || - available(EMoveType::Tool_change) || - available(EMoveType::Unretract) || - available(EMoveType::Seam); - }; - - auto add_option = [this, append_item](EMoveType move_type, EOptionsColors color, const std::string& text) { - const TBuffer& buffer = m_buffers[buffer_id(move_type)]; - if (buffer.visible && buffer.has_data()) - append_item(EItemType::Circle, Options_Colors[static_cast(color)], text); - }; - - // options section - if (any_option_available()) { - // title - ImGui::Spacing(); - imgui.title(_u8L("Options")); - - // items - add_option(EMoveType::Retract, EOptionsColors::Retractions, _u8L("Retractions")); - add_option(EMoveType::Unretract, EOptionsColors::Unretractions, _u8L("Deretractions")); - add_option(EMoveType::Seam, EOptionsColors::Seams, _u8L("Seams")); - add_option(EMoveType::Tool_change, EOptionsColors::ToolChanges, _u8L("Tool changes")); - add_option(EMoveType::Color_change, EOptionsColors::ColorChanges, _u8L("Color changes")); - add_option(EMoveType::Pause_Print, EOptionsColors::PausePrints, _u8L("Print pauses")); - add_option(EMoveType::Custom_GCode, EOptionsColors::CustomGCodes, _u8L("Custom G-codes")); - } - - // settings section - bool has_settings = false; - has_settings |= !m_settings_ids.print.empty(); - has_settings |= !m_settings_ids.printer.empty(); - bool has_filament_settings = true; - has_filament_settings &= !m_settings_ids.filament.empty(); - for (const std::string& fs : m_settings_ids.filament) { - has_filament_settings &= !fs.empty(); - } - has_settings |= has_filament_settings; - bool show_settings = wxGetApp().is_gcode_viewer(); - show_settings &= (m_view_type == EViewType::FeatureType || m_view_type == EViewType::Tool); - show_settings &= has_settings; - if (show_settings) { - auto calc_offset = [this]() { - float ret = 0.0f; - if (!m_settings_ids.printer.empty()) - ret = std::max(ret, ImGui::CalcTextSize((_u8L("Printer") + std::string(":")).c_str()).x); - if (!m_settings_ids.print.empty()) - ret = std::max(ret, ImGui::CalcTextSize((_u8L("Print settings") + std::string(":")).c_str()).x); - if (!m_settings_ids.filament.empty()) { - for (unsigned char i : m_extruder_ids) { - ret = std::max(ret, ImGui::CalcTextSize((_u8L("Filament") + " " + std::to_string(i + 1) + ":").c_str()).x); - } - } - if (ret > 0.0f) - ret += 2.0f * ImGui::GetStyle().ItemSpacing.x; - return ret; - }; - - ImGui::Spacing(); - imgui.title(_u8L("Settings")); - - float offset = calc_offset(); - - if (!m_settings_ids.printer.empty()) { - imgui.text(_u8L("Printer") + ":"); - ImGui::SameLine(offset); - imgui.text(m_settings_ids.printer); - } - if (!m_settings_ids.print.empty()) { - imgui.text(_u8L("Print settings") + ":"); - ImGui::SameLine(offset); - imgui.text(m_settings_ids.print); - } - if (!m_settings_ids.filament.empty()) { - for (unsigned char i : m_extruder_ids) { - if (i < static_cast(m_settings_ids.filament.size()) && !m_settings_ids.filament[i].empty()) { - std::string txt = _u8L("Filament"); - txt += (m_extruder_ids.size() == 1) ? ":" : " " + std::to_string(i + 1); - imgui.text(txt); - ImGui::SameLine(offset); - imgui.text(m_settings_ids.filament[i]); - } - } - } - } - - // total estimated printing time section - if (show_estimated_time) { - ImGui::Spacing(); - std::string time_title = _u8L("Estimated printing times"); - auto can_show_mode_button = [this](PrintEstimatedStatistics::ETimeMode mode) { - bool show = false; - if (m_print_statistics.modes.size() > 1 && m_print_statistics.modes[static_cast(mode)].roles_times.size() > 0) { - for (size_t i = 0; i < m_print_statistics.modes.size(); ++i) { - if (i != static_cast(mode) && - m_print_statistics.modes[i].time > 0.0f && - short_time(get_time_dhms(m_print_statistics.modes[static_cast(mode)].time)) != short_time(get_time_dhms(m_print_statistics.modes[i].time))) { - show = true; - break; - } - } - } - return show; - }; - - if (can_show_mode_button(m_time_estimate_mode)) { - switch (m_time_estimate_mode) - { - case PrintEstimatedStatistics::ETimeMode::Normal: { time_title += " [" + _u8L("Normal mode") + "]"; break; } - case PrintEstimatedStatistics::ETimeMode::Stealth: { time_title += " [" + _u8L("Stealth mode") + "]"; break; } - default: { assert(false); break; } - } - } - - imgui.title(time_title + ":"); - - std::string first_str = _u8L("First layer"); - std::string total_str = _u8L("Total"); - - float max_len = 10.0f + ImGui::GetStyle().ItemSpacing.x; - if (time_mode.layers_times.empty()) - max_len += ImGui::CalcTextSize(total_str.c_str()).x; - else - max_len += std::max(ImGui::CalcTextSize(first_str.c_str()).x, ImGui::CalcTextSize(total_str.c_str()).x); - - if (!time_mode.layers_times.empty()) { - imgui.text(first_str + ":"); - ImGui::SameLine(max_len); - imgui.text(short_time(get_time_dhms(time_mode.layers_times.front()))); - } - - imgui.text(total_str + ":"); - ImGui::SameLine(max_len); - imgui.text(short_time(get_time_dhms(time_mode.time))); - - auto show_mode_button = [this, &imgui, can_show_mode_button](const wxString& label, PrintEstimatedStatistics::ETimeMode mode) { - if (can_show_mode_button(mode)) { - if (imgui.button(label)) { - m_time_estimate_mode = mode; - imgui.set_requires_extra_frame(); - } - } - }; - - switch (m_time_estimate_mode) { - case PrintEstimatedStatistics::ETimeMode::Normal: { - show_mode_button(_L("Show stealth mode"), PrintEstimatedStatistics::ETimeMode::Stealth); - break; - } - case PrintEstimatedStatistics::ETimeMode::Stealth: { - show_mode_button(_L("Show normal mode"), PrintEstimatedStatistics::ETimeMode::Normal); - break; - } - default : { assert(false); break; } - } - } - - legend_height = ImGui::GetCurrentWindow()->Size.y; - - imgui.end(); - ImGui::PopStyleVar(); -} - -#if ENABLE_GCODE_VIEWER_STATISTICS -void GCodeViewer::render_statistics() -{ - static const float offset = 275.0f; - - ImGuiWrapper& imgui = *wxGetApp().imgui(); - - auto add_time = [this, &imgui](const std::string& label, int64_t time) { - imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, label); - ImGui::SameLine(offset); - imgui.text(std::to_string(time) + " ms (" + get_time_dhms(static_cast(time) * 0.001f) + ")"); - }; - - auto add_memory = [this, &imgui](const std::string& label, int64_t memory) { - auto format_string = [memory](const std::string& units, float value) { - return std::to_string(memory) + " bytes (" + - Slic3r::float_to_string_decimal_point(float(memory) * value, 3) - + " " + units + ")"; - }; - - static const float kb = 1024.0f; - static const float inv_kb = 1.0f / kb; - static const float mb = 1024.0f * kb; - static const float inv_mb = 1.0f / mb; - static const float gb = 1024.0f * mb; - static const float inv_gb = 1.0f / gb; - imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, label); - ImGui::SameLine(offset); - if (static_cast(memory) < mb) - imgui.text(format_string("KB", inv_kb)); - else if (static_cast(memory) < gb) - imgui.text(format_string("MB", inv_mb)); - else - imgui.text(format_string("GB", inv_gb)); - }; - - auto add_counter = [this, &imgui](const std::string& label, int64_t counter) { - imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, label); - ImGui::SameLine(offset); - imgui.text(std::to_string(counter)); - }; - - imgui.set_next_window_pos(0.5f * wxGetApp().plater()->get_current_canvas3D()->get_canvas_size().get_width(), 0.0f, ImGuiCond_Once, 0.5f, 0.0f); - ImGui::SetNextWindowSizeConstraints({ 300.0f, 100.0f }, { 600.0f, 900.0f }); - imgui.begin(std::string("GCodeViewer Statistics"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize); - ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow()); - - if (ImGui::CollapsingHeader("Time")) { - add_time(std::string("GCodeProcessor:"), m_statistics.results_time); - - ImGui::Separator(); - add_time(std::string("Load:"), m_statistics.load_time); - add_time(std::string(" Load vertices:"), m_statistics.load_vertices); - add_time(std::string(" Smooth vertices:"), m_statistics.smooth_vertices); - add_time(std::string(" Load indices:"), m_statistics.load_indices); - add_time(std::string("Refresh:"), m_statistics.refresh_time); - add_time(std::string("Refresh paths:"), m_statistics.refresh_paths_time); - } - - if (ImGui::CollapsingHeader("OpenGL calls")) { - add_counter(std::string("Multi GL_POINTS:"), m_statistics.gl_multi_points_calls_count); - add_counter(std::string("Multi GL_LINES:"), m_statistics.gl_multi_lines_calls_count); - add_counter(std::string("Multi GL_TRIANGLES:"), m_statistics.gl_multi_triangles_calls_count); - add_counter(std::string("GL_TRIANGLES:"), m_statistics.gl_triangles_calls_count); - ImGui::Separator(); - add_counter(std::string("Instanced models:"), m_statistics.gl_instanced_models_calls_count); - add_counter(std::string("Batched models:"), m_statistics.gl_batched_models_calls_count); - } - - if (ImGui::CollapsingHeader("CPU memory")) { - add_memory(std::string("GCodeProcessor results:"), m_statistics.results_size); - - ImGui::Separator(); - add_memory(std::string("Paths:"), m_statistics.paths_size); - add_memory(std::string("Render paths:"), m_statistics.render_paths_size); - add_memory(std::string("Models instances:"), m_statistics.models_instances_size); - } - - if (ImGui::CollapsingHeader("GPU memory")) { - add_memory(std::string("Vertices:"), m_statistics.total_vertices_gpu_size); - add_memory(std::string("Indices:"), m_statistics.total_indices_gpu_size); - add_memory(std::string("Instances:"), m_statistics.total_instances_gpu_size); - ImGui::Separator(); - add_memory(std::string("Max VBuffer:"), m_statistics.max_vbuffer_gpu_size); - add_memory(std::string("Max IBuffer:"), m_statistics.max_ibuffer_gpu_size); - } - - if (ImGui::CollapsingHeader("Other")) { - add_counter(std::string("Travel segments count:"), m_statistics.travel_segments_count); - add_counter(std::string("Wipe segments count:"), m_statistics.wipe_segments_count); - add_counter(std::string("Extrude segments count:"), m_statistics.extrude_segments_count); - add_counter(std::string("Instances count:"), m_statistics.instances_count); - add_counter(std::string("Batched count:"), m_statistics.batched_count); - ImGui::Separator(); - add_counter(std::string("VBuffers count:"), m_statistics.vbuffers_count); - add_counter(std::string("IBuffers count:"), m_statistics.ibuffers_count); - } - - imgui.end(); -} -#endif // ENABLE_GCODE_VIEWER_STATISTICS - -void GCodeViewer::log_memory_used(const std::string& label, int64_t additional) const -{ - if (Slic3r::get_logging_level() >= 5) { - int64_t paths_size = 0; - int64_t render_paths_size = 0; - for (const TBuffer& buffer : m_buffers) { - paths_size += SLIC3R_STDVEC_MEMSIZE(buffer.paths, Path); - render_paths_size += SLIC3R_STDUNORDEREDSET_MEMSIZE(buffer.render_paths, RenderPath); - for (const RenderPath& path : buffer.render_paths) { - render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.sizes, unsigned int); - render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.offsets, size_t); - } - } - int64_t layers_size = SLIC3R_STDVEC_MEMSIZE(m_layers.get_zs(), double); - layers_size += SLIC3R_STDVEC_MEMSIZE(m_layers.get_endpoints(), Layers::Endpoints); - BOOST_LOG_TRIVIAL(trace) << label - << "(" << format_memsize_MB(additional + paths_size + render_paths_size + layers_size) << ");" - << log_memory_info(); - } -} - -GCodeViewer::Color GCodeViewer::option_color(EMoveType move_type) const -{ - switch (move_type) - { - case EMoveType::Tool_change: { return Options_Colors[static_cast(EOptionsColors::ToolChanges)]; } - case EMoveType::Color_change: { return Options_Colors[static_cast(EOptionsColors::ColorChanges)]; } - case EMoveType::Pause_Print: { return Options_Colors[static_cast(EOptionsColors::PausePrints)]; } - case EMoveType::Custom_GCode: { return Options_Colors[static_cast(EOptionsColors::CustomGCodes)]; } - case EMoveType::Retract: { return Options_Colors[static_cast(EOptionsColors::Retractions)]; } - case EMoveType::Unretract: { return Options_Colors[static_cast(EOptionsColors::Unretractions)]; } - case EMoveType::Seam: { return Options_Colors[static_cast(EOptionsColors::Seams)]; } - default: { return { 0.0f, 0.0f, 0.0f, 1.0f }; } - } -} - -} // namespace GUI -} // namespace Slic3r - +#include "libslic3r/libslic3r.h" +#include "GCodeViewer.hpp" + +#include "libslic3r/BuildVolume.hpp" +#include "libslic3r/Print.hpp" +#include "libslic3r/Geometry.hpp" +#include "libslic3r/Model.hpp" +#include "libslic3r/Utils.hpp" +#include "libslic3r/LocalesUtils.hpp" +#include "libslic3r/PresetBundle.hpp" + +#include "GUI_App.hpp" +#include "MainFrame.hpp" +#include "Plater.hpp" +#include "Camera.hpp" +#include "I18N.hpp" +#include "GUI_Utils.hpp" +#include "GUI.hpp" +#include "DoubleSlider.hpp" +#include "GLCanvas3D.hpp" +#include "GLToolbar.hpp" +#include "GUI_Preview.hpp" +#include "GUI_ObjectManipulation.hpp" + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace Slic3r { +namespace GUI { + +static unsigned char buffer_id(EMoveType type) { + return static_cast(type) - static_cast(EMoveType::Retract); +} + +static EMoveType buffer_type(unsigned char id) { + return static_cast(static_cast(EMoveType::Retract) + id); +} + +// Round to a bin with minimum two digits resolution. +// Equivalent to conversion to string with sprintf(buf, "%.2g", value) and conversion back to float, but faster. +static float round_to_bin(const float value) +{ +// assert(value >= 0); + constexpr float const scale [5] = { 100.f, 1000.f, 10000.f, 100000.f, 1000000.f }; + constexpr float const invscale [5] = { 0.01f, 0.001f, 0.0001f, 0.00001f, 0.000001f }; + constexpr float const threshold[5] = { 0.095f, 0.0095f, 0.00095f, 0.000095f, 0.0000095f }; + // Scaling factor, pointer to the tables above. + int i = 0; + // While the scaling factor is not yet large enough to get two integer digits after scaling and rounding: + for (; value < threshold[i] && i < 4; ++ i) ; + // At least on MSVC std::round() calls a complex function, which is pretty expensive. + // our fast_round_up is much cheaper and it could be inlined. +// return std::round(value * scale[i]) * invscale[i]; + double a = value * scale[i]; + assert(std::abs(a) < double(std::numeric_limits::max())); + return fast_round_up(a) * invscale[i]; +} + +void GCodeViewer::VBuffer::reset() +{ + // release gpu memory + if (!vbos.empty()) { + glsafe(::glDeleteBuffers(static_cast(vbos.size()), static_cast(vbos.data()))); + vbos.clear(); + } + +#if ENABLE_GL_CORE_PROFILE + if (!vaos.empty()) { + glsafe(::glDeleteVertexArrays(static_cast(vaos.size()), static_cast(vaos.data()))); + vaos.clear(); + } +#endif // ENABLE_GL_CORE_PROFILE + + sizes.clear(); + count = 0; +} + +void GCodeViewer::InstanceVBuffer::Ranges::reset() +{ + for (Range& range : ranges) { + // release gpu memory + if (range.vbo > 0) + glsafe(::glDeleteBuffers(1, &range.vbo)); + } + + ranges.clear(); +} + +void GCodeViewer::InstanceVBuffer::reset() +{ + s_ids.clear(); + buffer.clear(); + render_ranges.reset(); +} + +void GCodeViewer::IBuffer::reset() +{ + // release gpu memory + if (ibo > 0) { + glsafe(::glDeleteBuffers(1, &ibo)); + ibo = 0; + } + + vbo = 0; + count = 0; +} + +bool GCodeViewer::Path::matches(const GCodeProcessorResult::MoveVertex& move, bool account_for_volumetric_rate) const +{ + auto matches_percent = [](float value1, float value2, float max_percent) { + return std::abs(value2 - value1) / value1 <= max_percent; + }; + + switch (move.type) + { + case EMoveType::Tool_change: + case EMoveType::Color_change: + case EMoveType::Pause_Print: + case EMoveType::Custom_GCode: + case EMoveType::Retract: + case EMoveType::Unretract: + case EMoveType::Seam: + case EMoveType::Extrude: { + // use rounding to reduce the number of generated paths + if (account_for_volumetric_rate) + return type == move.type && extruder_id == move.extruder_id && cp_color_id == move.cp_color_id && role == move.extrusion_role && + move.position.z() <= sub_paths.front().first.position.z() && feedrate == move.feedrate && fan_speed == move.fan_speed && + height == round_to_bin(move.height) && width == round_to_bin(move.width) && + matches_percent(volumetric_rate, move.volumetric_rate(), 0.001f); + else + return type == move.type && extruder_id == move.extruder_id && cp_color_id == move.cp_color_id && role == move.extrusion_role && + move.position.z() <= sub_paths.front().first.position.z() && feedrate == move.feedrate && fan_speed == move.fan_speed && + height == round_to_bin(move.height) && width == round_to_bin(move.width); + } + case EMoveType::Travel: { + return type == move.type && feedrate == move.feedrate && extruder_id == move.extruder_id && cp_color_id == move.cp_color_id; + } + default: { return false; } + } +} + +void GCodeViewer::TBuffer::Model::reset() +{ + instances.reset(); +} + +void GCodeViewer::TBuffer::reset() +{ + vertices.reset(); + for (IBuffer& buffer : indices) { + buffer.reset(); + } + + indices.clear(); + paths.clear(); + render_paths.clear(); + model.reset(); +} + +void GCodeViewer::TBuffer::add_path(const GCodeProcessorResult::MoveVertex& move, unsigned int b_id, size_t i_id, size_t s_id) +{ + Path::Endpoint endpoint = { b_id, i_id, s_id, move.position }; + // use rounding to reduce the number of generated paths + paths.push_back({ move.type, move.extrusion_role, move.delta_extruder, + round_to_bin(move.height), round_to_bin(move.width), + move.feedrate, move.fan_speed, move.temperature, + move.volumetric_rate(), move.extruder_id, move.cp_color_id, { { endpoint, endpoint } } }); +} + +void GCodeViewer::COG::render() +{ + if (!m_visible) + return; + + init(); + + GLShaderProgram* shader = wxGetApp().get_shader("toolpaths_cog"); + if (shader == nullptr) + return; + + shader->start_using(); + + glsafe(::glDisable(GL_DEPTH_TEST)); + + const Camera& camera = wxGetApp().plater()->get_camera(); + Transform3d model_matrix = Geometry::translation_transform(cog()); + if (m_fixed_size) { + const double inv_zoom = camera.get_inv_zoom(); + model_matrix = model_matrix * Geometry::scale_transform(inv_zoom); + } + const Transform3d& view_matrix = camera.get_view_matrix(); + shader->set_uniform("view_model_matrix", view_matrix * model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); + m_model.render(); + + shader->stop_using(); + + ////Show ImGui window + //static float last_window_width = 0.0f; + //static size_t last_text_length = 0; + + //ImGuiWrapper& imgui = *wxGetApp().imgui(); + //const Size cnv_size = wxGetApp().plater()->get_current_canvas3D()->get_canvas_size(); + //imgui.set_next_window_pos(0.5f * static_cast(cnv_size.get_width()), 0.0f, ImGuiCond_Always, 0.5f, 0.0f); + //ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + //ImGui::SetNextWindowBgAlpha(0.25f); + //imgui.begin(std::string("COG"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove); + //imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _u8L("Center of mass") + ":"); + //ImGui::SameLine(); + //char buf[1024]; + //const Vec3d position = cog(); + //sprintf(buf, "X: %.3f, Y: %.3f, Z: %.3f", position.x(), position.y(), position.z()); + //imgui.text(std::string(buf)); + + //// force extra frame to automatically update window size + //const float width = ImGui::GetWindowWidth(); + //const size_t length = strlen(buf); + //if (width != last_window_width || length != last_text_length) { + // last_window_width = width; + // last_text_length = length; + // imgui.set_requires_extra_frame(); + //} + + //imgui.end(); + //ImGui::PopStyleVar(); +} + +float GCodeViewer::Extrusions::Range::step_size(EType type) const +{ + switch (type) + { + default: + case EType::Linear: { return (max > min) ? (max - min) / (static_cast(Range_Colors.size()) - 1.0f) : 0.0f; } + case EType::Logarithmic: { return (max > min && min > 0.0f) ? ::log(max / min) / (static_cast(Range_Colors.size()) - 1.0f) : 0.0f; } + } +} + +ColorRGBA GCodeViewer::Extrusions::Range::get_color_at(float value, EType type) const +{ + // Input value scaled to the colors range + float global_t = 0.0f; + const float step = step_size(type); + if (step > 0.0f) { + switch (type) + { + default: + case EType::Linear: { global_t = (value > min) ? (value - min) / step : 0.0f; break; } + case EType::Logarithmic: { global_t = (value > min && min > 0.0f) ? ::log(value / min) / step : 0.0f; break; } + } + } + + const size_t color_max_idx = Range_Colors.size() - 1; + + // Compute the two colors just below (low) and above (high) the input value + const size_t color_low_idx = std::clamp(static_cast(global_t), 0, color_max_idx); + const size_t color_high_idx = std::clamp(color_low_idx + 1, 0, color_max_idx); + + // Interpolate between the low and high colors to find exactly which color the input value should get + return lerp(Range_Colors[color_low_idx], Range_Colors[color_high_idx], global_t - static_cast(color_low_idx)); +} + +GCodeViewer::SequentialRangeCap::~SequentialRangeCap() { + if (ibo > 0) + glsafe(::glDeleteBuffers(1, &ibo)); +} + +void GCodeViewer::SequentialRangeCap::reset() { + if (ibo > 0) + glsafe(::glDeleteBuffers(1, &ibo)); + + buffer = nullptr; + ibo = 0; +#if ENABLE_GL_CORE_PROFILE + vao = 0; +#endif // ENABLE_GL_CORE_PROFILE + vbo = 0; + color = { 0.0f, 0.0f, 0.0f, 1.0f }; +} + +void GCodeViewer::SequentialView::Marker::init() +{ + m_model.init_from(stilized_arrow(16, 2.0f, 4.0f, 1.0f, 8.0f)); + m_model.set_color({ 1.0f, 1.0f, 1.0f, 0.5f }); +} + +void GCodeViewer::SequentialView::Marker::set_world_position(const Vec3f& position) +{ + m_world_position = position; + m_world_transform = (Geometry::translation_transform((position + m_z_offset * Vec3f::UnitZ()).cast()) * + Geometry::translation_transform(m_model.get_bounding_box().size().z() * Vec3d::UnitZ()) * Geometry::rotation_transform({ M_PI, 0.0, 0.0 })).cast(); +} + +void GCodeViewer::SequentialView::Marker::render() +{ + if (!m_visible) + return; + + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); + if (shader == nullptr) + return; + + glsafe(::glEnable(GL_BLEND)); + glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); + + shader->start_using(); + shader->set_uniform("emission_factor", 0.0f); + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d& view_matrix = camera.get_view_matrix(); + const Transform3d model_matrix = m_world_transform.cast(); + shader->set_uniform("view_model_matrix", view_matrix * model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); + + m_model.render(); + + shader->stop_using(); + + glsafe(::glDisable(GL_BLEND)); + + static float last_window_width = 0.0f; + static size_t last_text_length = 0; + + ImGuiWrapper& imgui = *wxGetApp().imgui(); + const Size cnv_size = wxGetApp().plater()->get_current_canvas3D()->get_canvas_size(); + imgui.set_next_window_pos(0.5f * static_cast(cnv_size.get_width()), static_cast(cnv_size.get_height()), ImGuiCond_Always, 0.5f, 1.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + ImGui::SetNextWindowBgAlpha(0.25f); + imgui.begin(std::string("ToolPosition"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _u8L("Tool position") + ":"); + ImGui::SameLine(); + char buf[1024]; + const Vec3f position = m_world_position + m_world_offset; + sprintf(buf, "X: %.3f, Y: %.3f, Z: %.3f", position.x(), position.y(), position.z()); + imgui.text(std::string(buf)); + + // force extra frame to automatically update window size + const float width = ImGui::GetWindowWidth(); + const size_t length = strlen(buf); + if (width != last_window_width || length != last_text_length) { + last_window_width = width; + last_text_length = length; + imgui.set_requires_extra_frame(); + } + + imgui.end(); + ImGui::PopStyleVar(); +} + +void GCodeViewer::SequentialView::GCodeWindow::load_gcode(const std::string& filename, const std::vector& lines_ends) +{ + assert(! m_file.is_open()); + if (m_file.is_open()) + return; + + m_filename = filename; + m_lines_ends = lines_ends; + + m_selected_line_id = 0; + m_last_lines_size = 0; + + try + { + m_file.open(boost::filesystem::path(m_filename)); + } + catch (...) + { + BOOST_LOG_TRIVIAL(error) << "Unable to map file " << m_filename << ". Cannot show G-code window."; + reset(); + } +} + +void GCodeViewer::SequentialView::GCodeWindow::render(float top, float bottom, uint64_t curr_line_id) const +{ + auto update_lines = [this](uint64_t start_id, uint64_t end_id) { + std::vector ret; + ret.reserve(end_id - start_id + 1); + for (uint64_t id = start_id; id <= end_id; ++id) { + // read line from file + const size_t start = id == 1 ? 0 : m_lines_ends[id - 2]; + const size_t len = m_lines_ends[id - 1] - start; + std::string gline(m_file.data() + start, len); + + std::string command; + std::string parameters; + std::string comment; + + // extract comment + std::vector tokens; + boost::split(tokens, gline, boost::is_any_of(";"), boost::token_compress_on); + command = tokens.front(); + if (tokens.size() > 1) + comment = ";" + tokens.back(); + + // extract gcode command and parameters + if (!command.empty()) { + boost::split(tokens, command, boost::is_any_of(" "), boost::token_compress_on); + command = tokens.front(); + if (tokens.size() > 1) { + for (size_t i = 1; i < tokens.size(); ++i) { + parameters += " " + tokens[i]; + } + } + } + ret.push_back({ command, parameters, comment }); + } + return ret; + }; + + static const ImVec4 LINE_NUMBER_COLOR = ImGuiWrapper::COL_ORANGE_LIGHT; + static const ImVec4 SELECTION_RECT_COLOR = ImGuiWrapper::COL_ORANGE_DARK; + static const ImVec4 COMMAND_COLOR = { 0.8f, 0.8f, 0.0f, 1.0f }; + static const ImVec4 PARAMETERS_COLOR = { 1.0f, 1.0f, 1.0f, 1.0f }; + static const ImVec4 COMMENT_COLOR = { 0.7f, 0.7f, 0.7f, 1.0f }; + static const ImVec4 ELLIPSIS_COLOR = { 0.0f, 0.7f, 0.0f, 1.0f }; + + if (!m_visible || m_filename.empty() || m_lines_ends.empty() || curr_line_id == 0) + return; + + // window height + const float wnd_height = bottom - top; + + // number of visible lines + const float text_height = ImGui::CalcTextSize("0").y; + const ImGuiStyle& style = ImGui::GetStyle(); + const uint64_t lines_count = static_cast((wnd_height - 2.0f * style.WindowPadding.y + style.ItemSpacing.y) / (text_height + style.ItemSpacing.y)); + + if (lines_count == 0) + return; + + // visible range + const uint64_t half_lines_count = lines_count / 2; + uint64_t start_id = (curr_line_id >= half_lines_count) ? curr_line_id - half_lines_count : 0; + uint64_t end_id = start_id + lines_count - 1; + if (end_id >= static_cast(m_lines_ends.size())) { + end_id = static_cast(m_lines_ends.size()) - 1; + start_id = end_id - lines_count + 1; + } + + // updates list of lines to show, if needed + if (m_selected_line_id != curr_line_id || m_last_lines_size != end_id - start_id + 1) { + try + { + *const_cast*>(&m_lines) = update_lines(start_id, end_id); + } + catch (...) + { + BOOST_LOG_TRIVIAL(error) << "Error while loading from file " << m_filename << ". Cannot show G-code window."; + return; + } + *const_cast(&m_selected_line_id) = curr_line_id; + *const_cast(&m_last_lines_size) = m_lines.size(); + } + + // line number's column width + const float id_width = ImGui::CalcTextSize(std::to_string(end_id).c_str()).x; + + ImGuiWrapper& imgui = *wxGetApp().imgui(); + + auto add_item_to_line = [&imgui](const std::string& txt, const ImVec4& color, float spacing, size_t& current_length) { + static const size_t LENGTH_THRESHOLD = 60; + + if (txt.empty()) + return false; + + std::string out_text = txt; + bool reduced = false; + if (current_length + out_text.length() > LENGTH_THRESHOLD) { + out_text = out_text.substr(0, LENGTH_THRESHOLD - current_length); + reduced = true; + } + + current_length += out_text.length(); + + ImGui::SameLine(0.0f, spacing); + ImGui::PushStyleColor(ImGuiCol_Text, color); + imgui.text(out_text); + ImGui::PopStyleColor(); + if (reduced) { + ImGui::SameLine(0.0f, 0.0f); + ImGui::PushStyleColor(ImGuiCol_Text, ELLIPSIS_COLOR); + imgui.text("..."); + ImGui::PopStyleColor(); + } + + return reduced; + }; + + imgui.set_next_window_pos(0.0f, top, ImGuiCond_Always, 0.0f, 0.0f); + imgui.set_next_window_size(0.0f, wnd_height, ImGuiCond_Always); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + ImGui::SetNextWindowBgAlpha(0.6f); + imgui.begin(std::string("G-code"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove); + + // center the text in the window by pushing down the first line + const float f_lines_count = static_cast(lines_count); + ImGui::SetCursorPosY(0.5f * (wnd_height - f_lines_count * text_height - (f_lines_count - 1.0f) * style.ItemSpacing.y)); + + // render text lines + for (uint64_t id = start_id; id <= end_id; ++id) { + const Line& line = m_lines[id - start_id]; + + // rect around the current selected line + if (id == curr_line_id) { + const float pos_y = ImGui::GetCursorScreenPos().y; + const float half_ItemSpacing_y = 0.5f * style.ItemSpacing.y; + const float half_padding_x = 0.5f * style.WindowPadding.x; + ImGui::GetWindowDrawList()->AddRect({ half_padding_x, pos_y - half_ItemSpacing_y }, + { ImGui::GetCurrentWindow()->Size.x - half_padding_x, pos_y + text_height + half_ItemSpacing_y }, + ImGui::GetColorU32(SELECTION_RECT_COLOR)); + } + + const std::string id_str = std::to_string(id); + // spacer to right align text + ImGui::Dummy({ id_width - ImGui::CalcTextSize(id_str.c_str()).x, text_height }); + + size_t line_length = 0; + // render line number + bool stop_adding = add_item_to_line(id_str, LINE_NUMBER_COLOR, 0.0f, line_length); + if (!stop_adding && !line.command.empty()) + // render command + stop_adding = add_item_to_line(line.command, COMMAND_COLOR, -1.0f, line_length); + if (!stop_adding && !line.parameters.empty()) + // render parameters + stop_adding = add_item_to_line(line.parameters, PARAMETERS_COLOR, 0.0f, line_length); + if (!stop_adding && !line.comment.empty()) + // render comment + stop_adding = add_item_to_line(line.comment, COMMENT_COLOR, line.command.empty() ? -1.0f : 0.0f, line_length); + } + + imgui.end(); + ImGui::PopStyleVar(); +} + +void GCodeViewer::SequentialView::GCodeWindow::stop_mapping_file() +{ + if (m_file.is_open()) + m_file.close(); +} + +void GCodeViewer::SequentialView::render(float legend_height) +{ + marker.render(); + float bottom = wxGetApp().plater()->get_current_canvas3D()->get_canvas_size().get_height(); + if (wxGetApp().is_editor()) + bottom -= wxGetApp().plater()->get_view_toolbar().get_height(); + gcode_window.render(legend_height, bottom, static_cast(gcode_ids[current.last])); +} + +const std::array(GCodeExtrusionRole::Count)> GCodeViewer::Extrusion_Role_Colors{ { + { 0.90f, 0.70f, 0.70f, 1.0f }, // GCodeExtrusionRole::None + { 1.00f, 0.90f, 0.30f, 1.0f }, // GCodeExtrusionRole::Perimeter + { 1.00f, 0.49f, 0.22f, 1.0f }, // GCodeExtrusionRole::ExternalPerimeter + { 0.12f, 0.12f, 1.00f, 1.0f }, // GCodeExtrusionRole::OverhangPerimeter + { 0.69f, 0.19f, 0.16f, 1.0f }, // GCodeExtrusionRole::InternalInfill + { 0.59f, 0.33f, 0.80f, 1.0f }, // GCodeExtrusionRole::SolidInfill + { 0.94f, 0.25f, 0.25f, 1.0f }, // GCodeExtrusionRole::TopSolidInfill + { 1.00f, 0.55f, 0.41f, 1.0f }, // GCodeExtrusionRole::Ironing + { 0.30f, 0.50f, 0.73f, 1.0f }, // GCodeExtrusionRole::BridgeInfill + { 1.00f, 1.00f, 1.00f, 1.0f }, // GCodeExtrusionRole::GapFill + { 0.00f, 0.53f, 0.43f, 1.0f }, // GCodeExtrusionRole::Skirt + { 0.00f, 1.00f, 0.00f, 1.0f }, // GCodeExtrusionRole::SupportMaterial + { 0.00f, 0.50f, 0.00f, 1.0f }, // GCodeExtrusionRole::SupportMaterialInterface + { 0.70f, 0.89f, 0.67f, 1.0f }, // GCodeExtrusionRole::WipeTower + { 0.37f, 0.82f, 0.58f, 1.0f }, // GCodeExtrusionRole::Custom +}}; + +const std::vector GCodeViewer::Options_Colors{ { + { 0.803f, 0.135f, 0.839f, 1.0f }, // Retractions + { 0.287f, 0.679f, 0.810f, 1.0f }, // Unretractions + { 0.900f, 0.900f, 0.900f, 1.0f }, // Seams + { 0.758f, 0.744f, 0.389f, 1.0f }, // ToolChanges + { 0.856f, 0.582f, 0.546f, 1.0f }, // ColorChanges + { 0.322f, 0.942f, 0.512f, 1.0f }, // PausePrints + { 0.886f, 0.825f, 0.262f, 1.0f } // CustomGCodes +}}; + +const std::vector GCodeViewer::Travel_Colors{ { + { 0.219f, 0.282f, 0.609f, 1.0f }, // Move + { 0.112f, 0.422f, 0.103f, 1.0f }, // Extrude + { 0.505f, 0.064f, 0.028f, 1.0f } // Retract +}}; + +#if 1 +// Normal ranges +const std::vector GCodeViewer::Range_Colors{ { + { 0.043f, 0.173f, 0.478f, 1.0f }, // bluish + { 0.075f, 0.349f, 0.522f, 1.0f }, + { 0.110f, 0.533f, 0.569f, 1.0f }, + { 0.016f, 0.839f, 0.059f, 1.0f }, + { 0.667f, 0.949f, 0.000f, 1.0f }, + { 0.988f, 0.975f, 0.012f, 1.0f }, + { 0.961f, 0.808f, 0.039f, 1.0f }, + { 0.890f, 0.533f, 0.125f, 1.0f }, + { 0.820f, 0.408f, 0.188f, 1.0f }, + { 0.761f, 0.322f, 0.235f, 1.0f }, + { 0.581f, 0.149f, 0.087f, 1.0f } // reddish +}}; +#else +// Detailed ranges +const std::vector GCodeViewer::Range_Colors{ { + { 0.043f, 0.173f, 0.478f, 1.0f }, // bluish + { 0.5f * (0.043f + 0.075f), 0.5f * (0.173f + 0.349f), 0.5f * (0.478f + 0.522f), 1.0f }, + { 0.075f, 0.349f, 0.522f, 1.0f }, + { 0.5f * (0.075f + 0.110f), 0.5f * (0.349f + 0.533f), 0.5f * (0.522f + 0.569f), 1.0f }, + { 0.110f, 0.533f, 0.569f, 1.0f }, + { 0.5f * (0.110f + 0.016f), 0.5f * (0.533f + 0.839f), 0.5f * (0.569f + 0.059f), 1.0f }, + { 0.016f, 0.839f, 0.059f, 1.0f }, + { 0.5f * (0.016f + 0.667f), 0.5f * (0.839f + 0.949f), 0.5f * (0.059f + 0.000f), 1.0f }, + { 0.667f, 0.949f, 0.000f, 1.0f }, + { 0.5f * (0.667f + 0.988f), 0.5f * (0.949f + 0.975f), 0.5f * (0.000f + 0.012f), 1.0f }, + { 0.988f, 0.975f, 0.012f, 1.0f }, + { 0.5f * (0.988f + 0.961f), 0.5f * (0.975f + 0.808f), 0.5f * (0.012f + 0.039f), 1.0f }, + { 0.961f, 0.808f, 0.039f, 1.0f }, + { 0.5f * (0.961f + 0.890f), 0.5f * (0.808f + 0.533f), 0.5f * (0.039f + 0.125f), 1.0f }, + { 0.890f, 0.533f, 0.125f, 1.0f }, + { 0.5f * (0.890f + 0.820f), 0.5f * (0.533f + 0.408f), 0.5f * (0.125f + 0.188f), 1.0f }, + { 0.820f, 0.408f, 0.188f, 1.0f }, + { 0.5f * (0.820f + 0.761f), 0.5f * (0.408f + 0.322f), 0.5f * (0.188f + 0.235f), 1.0f }, + { 0.761f, 0.322f, 0.235f, 1.0f }, + { 0.5f * (0.761f + 0.581f), 0.5f * (0.322f + 0.149f), 0.5f * (0.235f + 0.087f), 1.0f }, + { 0.581f, 0.149f, 0.087f, 1.0f } // reddishgit +} }; +#endif + +const ColorRGBA GCodeViewer::Wipe_Color = ColorRGBA::YELLOW(); +const ColorRGBA GCodeViewer::Neutral_Color = ColorRGBA::DARK_GRAY(); + +GCodeViewer::GCodeViewer() +{ + m_extrusions.reset_role_visibility_flags(); + m_shells.volumes.set_use_raycasters(false); +// m_sequential_view.skip_invisible_moves = true; +} + +void GCodeViewer::init() +{ + if (m_gl_data_initialized) + return; + + // initializes opengl data of TBuffers + for (size_t i = 0; i < m_buffers.size(); ++i) { + TBuffer& buffer = m_buffers[i]; + EMoveType type = buffer_type(i); + switch (type) + { + default: { break; } + case EMoveType::Tool_change: + case EMoveType::Color_change: + case EMoveType::Pause_Print: + case EMoveType::Custom_GCode: + case EMoveType::Retract: + case EMoveType::Unretract: + case EMoveType::Seam: { +#if !DISABLE_GCODEVIEWER_INSTANCED_MODELS + if (wxGetApp().is_gl_version_greater_or_equal_to(3, 3)) { + buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::InstancedModel; + buffer.shader = "gouraud_light_instanced"; + buffer.model.model.init_from(diamond(16)); + buffer.model.color = option_color(type); + buffer.model.instances.format = InstanceVBuffer::EFormat::InstancedModel; + } + else { +#endif // !DISABLE_GCODEVIEWER_INSTANCED_MODELS + buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::BatchedModel; + buffer.vertices.format = VBuffer::EFormat::PositionNormal3; + buffer.shader = "gouraud_light"; + buffer.model.data = diamond(16); + buffer.model.color = option_color(type); + buffer.model.instances.format = InstanceVBuffer::EFormat::BatchedModel; +#if !DISABLE_GCODEVIEWER_INSTANCED_MODELS + } +#endif // !DISABLE_GCODEVIEWER_INSTANCED_MODELS + break; + } + case EMoveType::Wipe: + case EMoveType::Extrude: { + buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Triangle; + buffer.vertices.format = VBuffer::EFormat::PositionNormal3; + buffer.shader = "gouraud_light"; + break; + } + case EMoveType::Travel: { + buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Line; + buffer.vertices.format = VBuffer::EFormat::Position; +#if ENABLE_GL_CORE_PROFILE + buffer.shader = OpenGLManager::get_gl_info().is_core_profile() ? "dashed_thick_lines" : "flat"; +#else + buffer.shader = "flat"; +#endif // ENABLE_GL_CORE_PROFILE + break; + } + } + + set_toolpath_move_type_visible(EMoveType::Extrude, true); + } + + // initializes tool marker + m_sequential_view.marker.init(); + + m_gl_data_initialized = true; +} + +void GCodeViewer::load(const GCodeProcessorResult& gcode_result, const Print& print) +{ + // avoid processing if called with the same gcode_result + if (m_last_result_id == gcode_result.id && + (m_last_view_type == m_view_type || (m_last_view_type != EViewType::VolumetricRate && m_view_type != EViewType::VolumetricRate))) + return; + + m_last_result_id = gcode_result.id; + m_last_view_type = m_view_type; + + // release gpu memory, if used + reset(); + + m_sequential_view.gcode_window.load_gcode(gcode_result.filename, gcode_result.lines_ends); + + if (wxGetApp().is_gcode_viewer()) + m_custom_gcode_per_print_z = gcode_result.custom_gcode_per_print_z; + + m_max_print_height = gcode_result.max_print_height; + + load_toolpaths(gcode_result); + + if (m_layers.empty()) + return; + + m_settings_ids = gcode_result.settings_ids; + m_filament_diameters = gcode_result.filament_diameters; + m_filament_densities = gcode_result.filament_densities; + + if (wxGetApp().is_editor()) + load_shells(print); + else { + Pointfs bed_shape; + std::string texture; + std::string model; + + if (!gcode_result.bed_shape.empty()) { + // bed shape detected in the gcode + bed_shape = gcode_result.bed_shape; + const auto bundle = wxGetApp().preset_bundle; + if (bundle != nullptr && !m_settings_ids.printer.empty()) { + const Preset* preset = bundle->printers.find_preset(m_settings_ids.printer); + if (preset != nullptr) { + model = PresetUtils::system_printer_bed_model(*preset); + texture = PresetUtils::system_printer_bed_texture(*preset); + } + } + } + else { + // adjust printbed size in dependence of toolpaths bbox + const double margin = 10.0; + const Vec2d min(m_paths_bounding_box.min.x() - margin, m_paths_bounding_box.min.y() - margin); + const Vec2d max(m_paths_bounding_box.max.x() + margin, m_paths_bounding_box.max.y() + margin); + + const Vec2d size = max - min; + bed_shape = { + { min.x(), min.y() }, + { max.x(), min.y() }, + { max.x(), min.y() + 0.442265 * size.y()}, + { max.x() - 10.0, min.y() + 0.4711325 * size.y()}, + { max.x() + 10.0, min.y() + 0.5288675 * size.y()}, + { max.x(), min.y() + 0.557735 * size.y()}, + { max.x(), max.y() }, + { min.x() + 0.557735 * size.x(), max.y()}, + { min.x() + 0.5288675 * size.x(), max.y() - 10.0}, + { min.x() + 0.4711325 * size.x(), max.y() + 10.0}, + { min.x() + 0.442265 * size.x(), max.y()}, + { min.x(), max.y() } }; + } + + wxGetApp().plater()->set_bed_shape(bed_shape, gcode_result.max_print_height, texture, model, gcode_result.bed_shape.empty()); + } + + m_print_statistics = gcode_result.print_statistics; + + if (m_time_estimate_mode != PrintEstimatedStatistics::ETimeMode::Normal) { + const float time = m_print_statistics.modes[static_cast(m_time_estimate_mode)].time; + if (time == 0.0f || + short_time(get_time_dhms(time)) == short_time(get_time_dhms(m_print_statistics.modes[static_cast(PrintEstimatedStatistics::ETimeMode::Normal)].time))) + m_time_estimate_mode = PrintEstimatedStatistics::ETimeMode::Normal; + } +} + +void GCodeViewer::refresh(const GCodeProcessorResult& gcode_result, const std::vector& str_tool_colors) +{ +#if ENABLE_GCODE_VIEWER_STATISTICS + auto start_time = std::chrono::high_resolution_clock::now(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + if (m_moves_count == 0) + return; + + wxBusyCursor busy; + + if (m_view_type == EViewType::Tool && !gcode_result.extruder_colors.empty()) + // update tool colors from config stored in the gcode + decode_colors(gcode_result.extruder_colors, m_tool_colors); + else + // update tool colors + decode_colors(str_tool_colors, m_tool_colors); + + ColorRGBA default_color; + decode_color("#FF8000", default_color); + + // ensure there are enough colors defined + while (m_tool_colors.size() < std::max(size_t(1), gcode_result.extruders_count)) + m_tool_colors.push_back(default_color); + + // update ranges for coloring / legend + m_extrusions.reset_ranges(); + for (size_t i = 0; i < m_moves_count; ++i) { + // skip first vertex + if (i == 0) + continue; + + const GCodeProcessorResult::MoveVertex& curr = gcode_result.moves[i]; + + switch (curr.type) + { + case EMoveType::Extrude: + { + m_extrusions.ranges.height.update_from(round_to_bin(curr.height)); + m_extrusions.ranges.width.update_from(round_to_bin(curr.width)); + m_extrusions.ranges.fan_speed.update_from(curr.fan_speed); + m_extrusions.ranges.temperature.update_from(curr.temperature); + if (curr.extrusion_role != GCodeExtrusionRole::Custom || is_visible(GCodeExtrusionRole::Custom)) + m_extrusions.ranges.volumetric_rate.update_from(round_to_bin(curr.volumetric_rate())); + [[fallthrough]]; + } + case EMoveType::Travel: + { + if (m_buffers[buffer_id(curr.type)].visible) + m_extrusions.ranges.feedrate.update_from(curr.feedrate); + + break; + } + default: { break; } + } + } + + for (size_t i = 0; i < gcode_result.print_statistics.modes.size(); ++i) { + m_layers_times[i] = gcode_result.print_statistics.modes[i].layers_times; + } + + for (size_t i = 0; i < m_layers_times.size(); ++i) { + for (float time : m_layers_times[i]) { + m_extrusions.ranges.layer_time[i].update_from(time); + } + } + +#if ENABLE_GCODE_VIEWER_STATISTICS + m_statistics.refresh_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + // update buffers' render paths + refresh_render_paths(false, false); + log_memory_used("Refreshed G-code extrusion paths, "); +} + +void GCodeViewer::update_shells_color_by_extruder(const DynamicPrintConfig* config) +{ + if (config != nullptr) + m_shells.volumes.update_colors_by_extruder(config); +} + +void GCodeViewer::reset() +{ + m_moves_count = 0; + for (TBuffer& buffer : m_buffers) { + buffer.reset(); + } + + m_paths_bounding_box = BoundingBoxf3(); + m_max_bounding_box = BoundingBoxf3(); + m_max_print_height = 0.0f; + m_tool_colors = std::vector(); + m_extruders_count = 0; + m_extruder_ids = std::vector(); + m_filament_diameters = std::vector(); + m_filament_densities = std::vector(); + m_extrusions.reset_ranges(); + m_shells.volumes.clear(); + m_layers.reset(); + m_layers_z_range = { 0, 0 }; + m_roles = std::vector(); + m_print_statistics.reset(); + for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { + m_layers_times[i] = std::vector(); + } + m_custom_gcode_per_print_z = std::vector(); + m_sequential_view.gcode_window.reset(); +#if ENABLE_GCODE_VIEWER_STATISTICS + m_statistics.reset_all(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + m_contained_in_bed = true; + m_legend_resizer.reset(); +} + +void GCodeViewer::render() +{ +#if ENABLE_GCODE_VIEWER_STATISTICS + m_statistics.reset_opengl(); + m_statistics.total_instances_gpu_size = 0; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + if (m_roles.empty()) + return; + + glsafe(::glEnable(GL_DEPTH_TEST)); + render_toolpaths(); + render_shells(); + float legend_height = 0.0f; + if (!m_layers.empty()) { + render_legend(legend_height); + if (m_sequential_view.current.last != m_sequential_view.endpoints.last) { + m_sequential_view.marker.set_world_position(m_sequential_view.current_position); + m_sequential_view.marker.set_world_offset(m_sequential_view.current_offset); + m_sequential_view.render(legend_height); + } + } +#if ENABLE_GCODE_VIEWER_STATISTICS + render_statistics(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS +} + +bool GCodeViewer::can_export_toolpaths() const +{ + return has_data() && m_buffers[buffer_id(EMoveType::Extrude)].render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle; +} + +void GCodeViewer::update_sequential_view_current(unsigned int first, unsigned int last) +{ + auto is_visible = [this](unsigned int id) { + for (const TBuffer& buffer : m_buffers) { + if (buffer.visible) { + for (const Path& path : buffer.paths) { + if (path.sub_paths.front().first.s_id <= id && id <= path.sub_paths.back().last.s_id) + return true; + } + } + } + return false; + }; + + const int first_diff = static_cast(first) - static_cast(m_sequential_view.last_current.first); + const int last_diff = static_cast(last) - static_cast(m_sequential_view.last_current.last); + + unsigned int new_first = first; + unsigned int new_last = last; + + if (m_sequential_view.skip_invisible_moves) { + while (!is_visible(new_first)) { + if (first_diff > 0) + ++new_first; + else + --new_first; + } + + while (!is_visible(new_last)) { + if (last_diff > 0) + ++new_last; + else + --new_last; + } + } + + m_sequential_view.current.first = new_first; + m_sequential_view.current.last = new_last; + m_sequential_view.last_current = m_sequential_view.current; + + refresh_render_paths(true, true); + + if (new_first != first || new_last != last) + wxGetApp().plater()->update_preview_moves_slider(); +} + +bool GCodeViewer::is_toolpath_move_type_visible(EMoveType type) const +{ + size_t id = static_cast(buffer_id(type)); + return (id < m_buffers.size()) ? m_buffers[id].visible : false; +} + +void GCodeViewer::set_toolpath_move_type_visible(EMoveType type, bool visible) +{ + size_t id = static_cast(buffer_id(type)); + if (id < m_buffers.size()) + m_buffers[id].visible = visible; +} + +unsigned int GCodeViewer::get_options_visibility_flags() const +{ + auto set_flag = [](unsigned int flags, unsigned int flag, bool active) { + return active ? (flags | (1 << flag)) : flags; + }; + + unsigned int flags = 0; + flags = set_flag(flags, static_cast(Preview::OptionType::Travel), is_toolpath_move_type_visible(EMoveType::Travel)); + flags = set_flag(flags, static_cast(Preview::OptionType::Wipe), is_toolpath_move_type_visible(EMoveType::Wipe)); + flags = set_flag(flags, static_cast(Preview::OptionType::Retractions), is_toolpath_move_type_visible(EMoveType::Retract)); + flags = set_flag(flags, static_cast(Preview::OptionType::Unretractions), is_toolpath_move_type_visible(EMoveType::Unretract)); + flags = set_flag(flags, static_cast(Preview::OptionType::Seams), is_toolpath_move_type_visible(EMoveType::Seam)); + flags = set_flag(flags, static_cast(Preview::OptionType::ToolChanges), is_toolpath_move_type_visible(EMoveType::Tool_change)); + flags = set_flag(flags, static_cast(Preview::OptionType::ColorChanges), is_toolpath_move_type_visible(EMoveType::Color_change)); + flags = set_flag(flags, static_cast(Preview::OptionType::PausePrints), is_toolpath_move_type_visible(EMoveType::Pause_Print)); + flags = set_flag(flags, static_cast(Preview::OptionType::CustomGCodes), is_toolpath_move_type_visible(EMoveType::Custom_GCode)); + flags = set_flag(flags, static_cast(Preview::OptionType::CenterOfGravity), m_cog.is_visible()); + flags = set_flag(flags, static_cast(Preview::OptionType::Shells), m_shells.visible); + flags = set_flag(flags, static_cast(Preview::OptionType::ToolMarker), m_sequential_view.marker.is_visible()); + return flags; +} + +void GCodeViewer::set_options_visibility_from_flags(unsigned int flags) +{ + auto is_flag_set = [flags](unsigned int flag) { + return (flags & (1 << flag)) != 0; + }; + + set_toolpath_move_type_visible(EMoveType::Travel, is_flag_set(static_cast(Preview::OptionType::Travel))); + set_toolpath_move_type_visible(EMoveType::Wipe, is_flag_set(static_cast(Preview::OptionType::Wipe))); + set_toolpath_move_type_visible(EMoveType::Retract, is_flag_set(static_cast(Preview::OptionType::Retractions))); + set_toolpath_move_type_visible(EMoveType::Unretract, is_flag_set(static_cast(Preview::OptionType::Unretractions))); + set_toolpath_move_type_visible(EMoveType::Seam, is_flag_set(static_cast(Preview::OptionType::Seams))); + set_toolpath_move_type_visible(EMoveType::Tool_change, is_flag_set(static_cast(Preview::OptionType::ToolChanges))); + set_toolpath_move_type_visible(EMoveType::Color_change, is_flag_set(static_cast(Preview::OptionType::ColorChanges))); + set_toolpath_move_type_visible(EMoveType::Pause_Print, is_flag_set(static_cast(Preview::OptionType::PausePrints))); + set_toolpath_move_type_visible(EMoveType::Custom_GCode, is_flag_set(static_cast(Preview::OptionType::CustomGCodes))); + m_cog.set_visible(is_flag_set(static_cast(Preview::OptionType::CenterOfGravity))); + m_shells.visible = is_flag_set(static_cast(Preview::OptionType::Shells)); + m_sequential_view.marker.set_visible(is_flag_set(static_cast(Preview::OptionType::ToolMarker))); +} + +void GCodeViewer::set_layers_z_range(const std::array& layers_z_range) +{ + bool keep_sequential_current_first = layers_z_range[0] >= m_layers_z_range[0]; + bool keep_sequential_current_last = layers_z_range[1] <= m_layers_z_range[1]; + m_layers_z_range = layers_z_range; + refresh_render_paths(keep_sequential_current_first, keep_sequential_current_last); + wxGetApp().plater()->update_preview_moves_slider(); +} + +void GCodeViewer::export_toolpaths_to_obj(const char* filename) const +{ + if (filename == nullptr) + return; + + if (!has_data()) + return; + + wxBusyCursor busy; + + // the data needed is contained into the Extrude TBuffer + const TBuffer& t_buffer = m_buffers[buffer_id(EMoveType::Extrude)]; + if (!t_buffer.has_data()) + return; + + if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Triangle) + return; + + // collect color information to generate materials + std::vector colors; + for (const RenderPath& path : t_buffer.render_paths) { + colors.push_back(path.color); + } + sort_remove_duplicates(colors); + + // save materials file + boost::filesystem::path mat_filename(filename); + mat_filename.replace_extension("mtl"); + + CNumericLocalesSetter locales_setter; + + FILE* fp = boost::nowide::fopen(mat_filename.string().c_str(), "w"); + if (fp == nullptr) { + BOOST_LOG_TRIVIAL(error) << "GCodeViewer::export_toolpaths_to_obj: Couldn't open " << mat_filename.string().c_str() << " for writing"; + return; + } + + fprintf(fp, "# G-Code Toolpaths Materials\n"); + fprintf(fp, "# Generated by %s-%s based on Slic3r\n", SLIC3R_APP_NAME, SLIC3R_VERSION); + + unsigned int colors_count = 1; + for (const ColorRGBA& color : colors) { + fprintf(fp, "\nnewmtl material_%d\n", colors_count++); + fprintf(fp, "Ka 1 1 1\n"); + fprintf(fp, "Kd %g %g %g\n", color.r(), color.g(), color.b()); + fprintf(fp, "Ks 0 0 0\n"); + } + + fclose(fp); + + // save geometry file + fp = boost::nowide::fopen(filename, "w"); + if (fp == nullptr) { + BOOST_LOG_TRIVIAL(error) << "GCodeViewer::export_toolpaths_to_obj: Couldn't open " << filename << " for writing"; + return; + } + + fprintf(fp, "# G-Code Toolpaths\n"); + fprintf(fp, "# Generated by %s-%s based on Slic3r\n", SLIC3R_APP_NAME, SLIC3R_VERSION); + fprintf(fp, "\nmtllib ./%s\n", mat_filename.filename().string().c_str()); + + const size_t floats_per_vertex = t_buffer.vertices.vertex_size_floats(); + + std::vector out_vertices; + std::vector out_normals; + + struct VerticesOffset + { + unsigned int vbo; + size_t offset; + }; + std::vector vertices_offsets; + vertices_offsets.push_back({ t_buffer.vertices.vbos.front(), 0 }); + + // get vertices/normals data from vertex buffers on gpu + for (size_t i = 0; i < t_buffer.vertices.vbos.size(); ++i) { + const size_t floats_count = t_buffer.vertices.sizes[i] / sizeof(float); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, t_buffer.vertices.vbos[i])); +#if ENABLE_OPENGL_ES + const VertexBuffer vertices = *static_cast(::glMapBufferRange(GL_ARRAY_BUFFER, 0, + static_cast(t_buffer.vertices.sizes[i]), GL_MAP_READ_BIT)); + glcheck(); + glsafe(::glUnmapBuffer(GL_ARRAY_BUFFER)); +#else + VertexBuffer vertices(floats_count); + glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, 0, static_cast(t_buffer.vertices.sizes[i]), static_cast(vertices.data()))); +#endif // ENABLE_OPENGL_ES + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + const size_t vertices_count = floats_count / floats_per_vertex; + for (size_t j = 0; j < vertices_count; ++j) { + const size_t base = j * floats_per_vertex; + out_vertices.push_back({ vertices[base + 0], vertices[base + 1], vertices[base + 2] }); + out_normals.push_back({ vertices[base + 3], vertices[base + 4], vertices[base + 5] }); + } + + if (i < t_buffer.vertices.vbos.size() - 1) + vertices_offsets.push_back({ t_buffer.vertices.vbos[i + 1], vertices_offsets.back().offset + vertices_count }); + } + + // save vertices to file + fprintf(fp, "\n# vertices\n"); + for (const Vec3f& v : out_vertices) { + fprintf(fp, "v %g %g %g\n", v.x(), v.y(), v.z()); + } + + // save normals to file + fprintf(fp, "\n# normals\n"); + for (const Vec3f& n : out_normals) { + fprintf(fp, "vn %g %g %g\n", n.x(), n.y(), n.z()); + } + + size_t i = 0; + for (const ColorRGBA& color : colors) { + // save material triangles to file + fprintf(fp, "\nusemtl material_%zu\n", i + 1); + fprintf(fp, "# triangles material %zu\n", i + 1); + + for (const RenderPath& render_path : t_buffer.render_paths) { + if (render_path.color != color) + continue; + + const IBuffer& ibuffer = t_buffer.indices[render_path.ibuffer_id]; + size_t vertices_offset = 0; + for (size_t j = 0; j < vertices_offsets.size(); ++j) { + const VerticesOffset& offset = vertices_offsets[j]; + if (offset.vbo == ibuffer.vbo) { + vertices_offset = offset.offset; + break; + } + } + + // get indices data from index buffer on gpu + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuffer.ibo)); + for (size_t j = 0; j < render_path.sizes.size(); ++j) { +#if ENABLE_OPENGL_ES + const IndexBuffer indices = *static_cast(::glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, + static_cast(render_path.offsets[j]), static_cast(render_path.sizes[j] * sizeof(IBufferType)), + GL_MAP_READ_BIT)); + glcheck(); + glsafe(::glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER)); +#else + IndexBuffer indices(render_path.sizes[j]); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast(render_path.offsets[j]), + static_cast(render_path.sizes[j] * sizeof(IBufferType)), static_cast(indices.data()))); +#endif // ENABLE_OPENGL_ES + + const size_t triangles_count = render_path.sizes[j] / 3; + for (size_t k = 0; k < triangles_count; ++k) { + const size_t base = k * 3; + const size_t v1 = 1 + static_cast(indices[base + 0]) + vertices_offset; + const size_t v2 = 1 + static_cast(indices[base + 1]) + vertices_offset; + const size_t v3 = 1 + static_cast(indices[base + 2]) + vertices_offset; + if (v1 != v2) + // do not export dummy triangles + fprintf(fp, "f %zu//%zu %zu//%zu %zu//%zu\n", v1, v1, v2, v2, v3, v3); + } + } + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + } + ++i; + } + + fclose(fp); +} + +void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) +{ + // max index buffer size, in bytes + static const size_t IBUFFER_THRESHOLD_BYTES = 64 * 1024 * 1024; + + auto log_memory_usage = [this](const std::string& label, const std::vector& vertices, const std::vector& indices) { + int64_t vertices_size = 0; + for (const MultiVertexBuffer& buffers : vertices) { + for (const VertexBuffer& buffer : buffers) { + vertices_size += SLIC3R_STDVEC_MEMSIZE(buffer, float); + } + } + int64_t indices_size = 0; + for (const MultiIndexBuffer& buffers : indices) { + for (const IndexBuffer& buffer : buffers) { + indices_size += SLIC3R_STDVEC_MEMSIZE(buffer, IBufferType); + } + } + log_memory_used(label, vertices_size + indices_size); + }; + + // format data into the buffers to be rendered as lines + auto add_vertices_as_line = [](const GCodeProcessorResult::MoveVertex& prev, const GCodeProcessorResult::MoveVertex& curr, VertexBuffer& vertices) { + auto add_vertex = [&vertices](const GCodeProcessorResult::MoveVertex& vertex) { + // add position + vertices.push_back(vertex.position.x()); + vertices.push_back(vertex.position.y()); + vertices.push_back(vertex.position.z()); + }; + + // add previous vertex + add_vertex(prev); + // add current vertex + add_vertex(curr); + }; + auto add_indices_as_line = [](const GCodeProcessorResult::MoveVertex& prev, const GCodeProcessorResult::MoveVertex& curr, TBuffer& buffer, + unsigned int ibuffer_id, IndexBuffer& indices, size_t move_id, bool account_for_volumetric_rate) { + if (buffer.paths.empty() || prev.type != curr.type || !buffer.paths.back().matches(curr, account_for_volumetric_rate)) { + // add starting index + indices.push_back(static_cast(indices.size())); + buffer.add_path(curr, ibuffer_id, indices.size() - 1, move_id - 1); + buffer.paths.back().sub_paths.front().first.position = prev.position; + } + + Path& last_path = buffer.paths.back(); + if (last_path.sub_paths.front().first.i_id != last_path.sub_paths.back().last.i_id) { + // add previous index + indices.push_back(static_cast(indices.size())); + } + + // add current index + indices.push_back(static_cast(indices.size())); + last_path.sub_paths.back().last = { ibuffer_id, indices.size() - 1, move_id, curr.position }; + }; + + // format data into the buffers to be rendered as solid + auto add_vertices_as_solid = [](const GCodeProcessorResult::MoveVertex& prev, const GCodeProcessorResult::MoveVertex& curr, TBuffer& buffer, + unsigned int vbuffer_id, VertexBuffer& vertices, size_t move_id, bool account_for_volumetric_rate) { + auto store_vertex = [](VertexBuffer& vertices, const Vec3f& position, const Vec3f& normal) { + // append position + vertices.push_back(position.x()); + vertices.push_back(position.y()); + vertices.push_back(position.z()); + // append normal + vertices.push_back(normal.x()); + vertices.push_back(normal.y()); + vertices.push_back(normal.z()); + }; + + if (buffer.paths.empty() || prev.type != curr.type || !buffer.paths.back().matches(curr, account_for_volumetric_rate)) { + buffer.add_path(curr, vbuffer_id, vertices.size(), move_id - 1); + buffer.paths.back().sub_paths.back().first.position = prev.position; + } + + Path& last_path = buffer.paths.back(); + + const Vec3f dir = (curr.position - prev.position).normalized(); + const Vec3f right = Vec3f(dir.y(), -dir.x(), 0.0f).normalized(); + const Vec3f left = -right; + const Vec3f up = right.cross(dir); + const Vec3f down = -up; + const float half_width = 0.5f * last_path.width; + const float half_height = 0.5f * last_path.height; + const Vec3f prev_pos = prev.position - half_height * up; + const Vec3f curr_pos = curr.position - half_height * up; + const Vec3f d_up = half_height * up; + const Vec3f d_down = -half_height * up; + const Vec3f d_right = half_width * right; + const Vec3f d_left = -half_width * right; + + // vertices 1st endpoint + if (last_path.vertices_count() == 1 || vertices.empty()) { + // 1st segment or restart into a new vertex buffer + // =============================================== + store_vertex(vertices, prev_pos + d_up, up); + store_vertex(vertices, prev_pos + d_right, right); + store_vertex(vertices, prev_pos + d_down, down); + store_vertex(vertices, prev_pos + d_left, left); + } + else { + // any other segment + // ================= + store_vertex(vertices, prev_pos + d_right, right); + store_vertex(vertices, prev_pos + d_left, left); + } + + // vertices 2nd endpoint + store_vertex(vertices, curr_pos + d_up, up); + store_vertex(vertices, curr_pos + d_right, right); + store_vertex(vertices, curr_pos + d_down, down); + store_vertex(vertices, curr_pos + d_left, left); + + last_path.sub_paths.back().last = { vbuffer_id, vertices.size(), move_id, curr.position }; + }; + auto add_indices_as_solid = [&](const GCodeProcessorResult::MoveVertex& prev, const GCodeProcessorResult::MoveVertex& curr, + const GCodeProcessorResult::MoveVertex* next, TBuffer& buffer, size_t& vbuffer_size, unsigned int ibuffer_id, + IndexBuffer& indices, size_t move_id, bool account_for_volumetric_rate) { + static Vec3f prev_dir; + static Vec3f prev_up; + static float sq_prev_length; + auto store_triangle = [](IndexBuffer& indices, IBufferType i1, IBufferType i2, IBufferType i3) { + indices.push_back(i1); + indices.push_back(i2); + indices.push_back(i3); + }; + auto append_dummy_cap = [store_triangle](IndexBuffer& indices, IBufferType id) { + store_triangle(indices, id, id, id); + store_triangle(indices, id, id, id); + }; + auto convert_vertices_offset = [](size_t vbuffer_size, const std::array& v_offsets) { + std::array ret = { + static_cast(static_cast(vbuffer_size) + v_offsets[0]), + static_cast(static_cast(vbuffer_size) + v_offsets[1]), + static_cast(static_cast(vbuffer_size) + v_offsets[2]), + static_cast(static_cast(vbuffer_size) + v_offsets[3]), + static_cast(static_cast(vbuffer_size) + v_offsets[4]), + static_cast(static_cast(vbuffer_size) + v_offsets[5]), + static_cast(static_cast(vbuffer_size) + v_offsets[6]), + static_cast(static_cast(vbuffer_size) + v_offsets[7]) + }; + return ret; + }; + auto append_starting_cap_triangles = [&](IndexBuffer& indices, const std::array& v_offsets) { + store_triangle(indices, v_offsets[0], v_offsets[2], v_offsets[1]); + store_triangle(indices, v_offsets[0], v_offsets[3], v_offsets[2]); + }; + auto append_stem_triangles = [&](IndexBuffer& indices, const std::array& v_offsets) { + store_triangle(indices, v_offsets[0], v_offsets[1], v_offsets[4]); + store_triangle(indices, v_offsets[1], v_offsets[5], v_offsets[4]); + store_triangle(indices, v_offsets[1], v_offsets[2], v_offsets[5]); + store_triangle(indices, v_offsets[2], v_offsets[6], v_offsets[5]); + store_triangle(indices, v_offsets[2], v_offsets[3], v_offsets[6]); + store_triangle(indices, v_offsets[3], v_offsets[7], v_offsets[6]); + store_triangle(indices, v_offsets[3], v_offsets[0], v_offsets[7]); + store_triangle(indices, v_offsets[0], v_offsets[4], v_offsets[7]); + }; + auto append_ending_cap_triangles = [&](IndexBuffer& indices, const std::array& v_offsets) { + store_triangle(indices, v_offsets[4], v_offsets[6], v_offsets[7]); + store_triangle(indices, v_offsets[4], v_offsets[5], v_offsets[6]); + }; + + if (buffer.paths.empty() || prev.type != curr.type || !buffer.paths.back().matches(curr, account_for_volumetric_rate)) { + buffer.add_path(curr, ibuffer_id, indices.size(), move_id - 1); + buffer.paths.back().sub_paths.back().first.position = prev.position; + } + + Path& last_path = buffer.paths.back(); + + const Vec3f dir = (curr.position - prev.position).normalized(); + const Vec3f right = Vec3f(dir.y(), -dir.x(), 0.0f).normalized(); + const Vec3f up = right.cross(dir); + const float sq_length = (curr.position - prev.position).squaredNorm(); + + const std::array first_seg_v_offsets = convert_vertices_offset(vbuffer_size, { 0, 1, 2, 3, 4, 5, 6, 7 }); + const std::array non_first_seg_v_offsets = convert_vertices_offset(vbuffer_size, { -4, 0, -2, 1, 2, 3, 4, 5 }); + const bool is_first_segment = (last_path.vertices_count() == 1); + if (is_first_segment || vbuffer_size == 0) { + // 1st segment or restart into a new vertex buffer + // =============================================== + if (is_first_segment) + // starting cap triangles + append_starting_cap_triangles(indices, first_seg_v_offsets); + // dummy triangles outer corner cap + append_dummy_cap(indices, vbuffer_size); + + // stem triangles + append_stem_triangles(indices, first_seg_v_offsets); + + vbuffer_size += 8; + } + else { + // any other segment + // ================= + float displacement = 0.0f; + const float cos_dir = prev_dir.dot(dir); + if (cos_dir > -0.9998477f) { + // if the angle between adjacent segments is smaller than 179 degrees + const Vec3f med_dir = (prev_dir + dir).normalized(); + const float half_width = 0.5f * last_path.width; + displacement = half_width * ::tan(::acos(std::clamp(dir.dot(med_dir), -1.0f, 1.0f))); + } + + const float sq_displacement = sqr(displacement); + const bool can_displace = displacement > 0.0f && sq_displacement < sq_prev_length && sq_displacement < sq_length; + + const bool is_right_turn = prev_up.dot(prev_dir.cross(dir)) <= 0.0f; + // whether the angle between adjacent segments is greater than 45 degrees + const bool is_sharp = cos_dir < 0.7071068f; + + bool right_displaced = false; + bool left_displaced = false; + + if (!is_sharp && can_displace) { + if (is_right_turn) + left_displaced = true; + else + right_displaced = true; + } + + // triangles outer corner cap + if (is_right_turn) { + if (left_displaced) + // dummy triangles + append_dummy_cap(indices, vbuffer_size); + else { + store_triangle(indices, vbuffer_size - 4, vbuffer_size + 1, vbuffer_size - 1); + store_triangle(indices, vbuffer_size + 1, vbuffer_size - 2, vbuffer_size - 1); + } + } + else { + if (right_displaced) + // dummy triangles + append_dummy_cap(indices, vbuffer_size); + else { + store_triangle(indices, vbuffer_size - 4, vbuffer_size - 3, vbuffer_size + 0); + store_triangle(indices, vbuffer_size - 3, vbuffer_size - 2, vbuffer_size + 0); + } + } + + // stem triangles + append_stem_triangles(indices, non_first_seg_v_offsets); + + vbuffer_size += 6; + } + + if (next != nullptr && (curr.type != next->type || !last_path.matches(*next, account_for_volumetric_rate))) + // ending cap triangles + append_ending_cap_triangles(indices, is_first_segment ? first_seg_v_offsets : non_first_seg_v_offsets); + + last_path.sub_paths.back().last = { ibuffer_id, indices.size() - 1, move_id, curr.position }; + prev_dir = dir; + prev_up = up; + sq_prev_length = sq_length; + }; + + // format data into the buffers to be rendered as instanced model + auto add_model_instance = [](const GCodeProcessorResult::MoveVertex& curr, InstanceBuffer& instances, InstanceIdBuffer& instances_ids, size_t move_id) { + // append position + instances.push_back(curr.position.x()); + instances.push_back(curr.position.y()); + instances.push_back(curr.position.z()); + // append width + instances.push_back(curr.width); + // append height + instances.push_back(curr.height); + + // append id + instances_ids.push_back(move_id); + }; + + // format data into the buffers to be rendered as batched model + auto add_vertices_as_model_batch = [](const GCodeProcessorResult::MoveVertex& curr, const GLModel::Geometry& data, VertexBuffer& vertices, InstanceBuffer& instances, InstanceIdBuffer& instances_ids, size_t move_id) { + const double width = static_cast(1.5f * curr.width); + const double height = static_cast(1.5f * curr.height); + + const Transform3d trafo = Geometry::translation_transform((curr.position - 0.5f * curr.height * Vec3f::UnitZ()).cast()) * + Geometry::scale_transform({ width, width, height }); + const Eigen::Matrix normal_matrix = trafo.matrix().template block<3, 3>(0, 0).inverse().transpose(); + + // append vertices + const size_t vertices_count = data.vertices_count(); + for (size_t i = 0; i < vertices_count; ++i) { + // append position + const Vec3d position = trafo * data.extract_position_3(i).cast(); + vertices.push_back(float(position.x())); + vertices.push_back(float(position.y())); + vertices.push_back(float(position.z())); + + // append normal + const Vec3d normal = normal_matrix * data.extract_normal_3(i).cast(); + vertices.push_back(float(normal.x())); + vertices.push_back(float(normal.y())); + vertices.push_back(float(normal.z())); + } + + // append instance position + instances.push_back(curr.position.x()); + instances.push_back(curr.position.y()); + instances.push_back(curr.position.z()); + // append instance id + instances_ids.push_back(move_id); + }; + + auto add_indices_as_model_batch = [](const GLModel::Geometry& data, IndexBuffer& indices, IBufferType base_index) { + const size_t indices_count = data.indices_count(); + for (size_t i = 0; i < indices_count; ++i) { + indices.push_back(static_cast(data.extract_index(i) + base_index)); + } + }; + +#if ENABLE_GCODE_VIEWER_STATISTICS + auto start_time = std::chrono::high_resolution_clock::now(); + m_statistics.results_size = SLIC3R_STDVEC_MEMSIZE(gcode_result.moves, GCodeProcessorResult::MoveVertex); + m_statistics.results_time = gcode_result.time; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + m_moves_count = gcode_result.moves.size(); + if (m_moves_count == 0) + return; + + m_extruders_count = gcode_result.extruders_count; + + unsigned int progress_count = 0; + static const unsigned int progress_threshold = 1000; + wxProgressDialog* progress_dialog = wxGetApp().is_gcode_viewer() ? + new wxProgressDialog(_L("Generating toolpaths"), "...", + 100, wxGetApp().mainframe, wxPD_AUTO_HIDE | wxPD_APP_MODAL) : nullptr; + + wxBusyCursor busy; + + // extract approximate paths bounding box from result + for (const GCodeProcessorResult::MoveVertex& move : gcode_result.moves) { + if (wxGetApp().is_gcode_viewer()) + // for the gcode viewer we need to take in account all moves to correctly size the printbed + m_paths_bounding_box.merge(move.position.cast()); + else { + if (move.type == EMoveType::Extrude && move.extrusion_role != GCodeExtrusionRole::Custom && move.width != 0.0f && move.height != 0.0f) + m_paths_bounding_box.merge(move.position.cast()); + } + } + + // set approximate max bounding box (take in account also the tool marker) + m_max_bounding_box = m_paths_bounding_box; + m_max_bounding_box.merge(m_paths_bounding_box.max + m_sequential_view.marker.get_bounding_box().size().z() * Vec3d::UnitZ()); + + if (wxGetApp().is_editor()) + m_contained_in_bed = wxGetApp().plater()->build_volume().all_paths_inside(gcode_result, m_paths_bounding_box); + + m_cog.reset(); + + m_sequential_view.gcode_ids.clear(); + for (size_t i = 0; i < gcode_result.moves.size(); ++i) { + const GCodeProcessorResult::MoveVertex& move = gcode_result.moves[i]; + if (move.type != EMoveType::Seam) + m_sequential_view.gcode_ids.push_back(move.gcode_id); + } + + bool account_for_volumetric_rate = m_view_type == EViewType::VolumetricRate; + + std::vector vertices(m_buffers.size()); + std::vector indices(m_buffers.size()); + std::vector instances(m_buffers.size()); + std::vector instances_ids(m_buffers.size()); + std::vector instances_offsets(m_buffers.size()); + std::vector options_zs; + + std::vector biased_seams_ids; + + // toolpaths data -> extract vertices from result + for (size_t i = 0; i < m_moves_count; ++i) { + const GCodeProcessorResult::MoveVertex& curr = gcode_result.moves[i]; + if (curr.type == EMoveType::Seam) + biased_seams_ids.push_back(i - biased_seams_ids.size() - 1); + + const size_t move_id = i - biased_seams_ids.size(); + + // skip first vertex + if (i == 0) + continue; + + const GCodeProcessorResult::MoveVertex& prev = gcode_result.moves[i - 1]; + + if (curr.type == EMoveType::Extrude && + curr.extrusion_role != GCodeExtrusionRole::Skirt && + curr.extrusion_role != GCodeExtrusionRole::SupportMaterial && + curr.extrusion_role != GCodeExtrusionRole::SupportMaterialInterface && + curr.extrusion_role != GCodeExtrusionRole::WipeTower && + curr.extrusion_role != GCodeExtrusionRole::Custom) { + const Vec3d curr_pos = curr.position.cast(); + const Vec3d prev_pos = prev.position.cast(); + m_cog.add_segment(curr_pos, prev_pos, curr.mm3_per_mm * (curr_pos - prev_pos).norm()); + } + + // update progress dialog + ++progress_count; + if (progress_dialog != nullptr && progress_count % progress_threshold == 0) { + progress_dialog->Update(int(100.0f * float(i) / (2.0f * float(m_moves_count))), + _L("Generating vertex buffer") + ": " + wxNumberFormatter::ToString(100.0 * double(i) / double(m_moves_count), 0, wxNumberFormatter::Style_None) + "%"); + progress_dialog->Fit(); + progress_count = 0; + } + + const unsigned char id = buffer_id(curr.type); + TBuffer& t_buffer = m_buffers[id]; + MultiVertexBuffer& v_multibuffer = vertices[id]; + InstanceBuffer& inst_buffer = instances[id]; + InstanceIdBuffer& inst_id_buffer = instances_ids[id]; + InstancesOffsets& inst_offsets = instances_offsets[id]; + + // ensure there is at least one vertex buffer + if (v_multibuffer.empty()) + v_multibuffer.push_back(VertexBuffer()); + + // if adding the vertices for the current segment exceeds the threshold size of the current vertex buffer + // add another vertex buffer + size_t vertices_size_to_add = (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::BatchedModel) ? t_buffer.model.data.vertices_size_bytes() : t_buffer.max_vertices_per_segment_size_bytes(); + if (v_multibuffer.back().size() * sizeof(float) > t_buffer.vertices.max_size_bytes() - vertices_size_to_add) { + v_multibuffer.push_back(VertexBuffer()); + if (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) { + Path& last_path = t_buffer.paths.back(); + if (prev.type == curr.type && last_path.matches(curr, account_for_volumetric_rate)) + last_path.add_sub_path(prev, static_cast(v_multibuffer.size()) - 1, 0, move_id - 1); + } + } + + VertexBuffer& v_buffer = v_multibuffer.back(); + + switch (t_buffer.render_primitive_type) + { + case TBuffer::ERenderPrimitiveType::Line: { add_vertices_as_line(prev, curr, v_buffer); break; } + case TBuffer::ERenderPrimitiveType::Triangle: { add_vertices_as_solid(prev, curr, t_buffer, static_cast(v_multibuffer.size()) - 1, v_buffer, move_id, account_for_volumetric_rate); break; } + case TBuffer::ERenderPrimitiveType::InstancedModel: + { + add_model_instance(curr, inst_buffer, inst_id_buffer, move_id); + inst_offsets.push_back(prev.position - curr.position); +#if ENABLE_GCODE_VIEWER_STATISTICS + ++m_statistics.instances_count; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + break; + } + case TBuffer::ERenderPrimitiveType::BatchedModel: + { + add_vertices_as_model_batch(curr, t_buffer.model.data, v_buffer, inst_buffer, inst_id_buffer, move_id); + inst_offsets.push_back(prev.position - curr.position); +#if ENABLE_GCODE_VIEWER_STATISTICS + ++m_statistics.batched_count; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + break; + } + } + + // collect options zs for later use + if (curr.type == EMoveType::Pause_Print || curr.type == EMoveType::Custom_GCode) { + const float* const last_z = options_zs.empty() ? nullptr : &options_zs.back(); + if (last_z == nullptr || curr.position[2] < *last_z - EPSILON || *last_z + EPSILON < curr.position[2]) + options_zs.emplace_back(curr.position[2]); + } + } + + // smooth toolpaths corners for the given TBuffer using triangles + auto smooth_triangle_toolpaths_corners = [&gcode_result, &biased_seams_ids](const TBuffer& t_buffer, MultiVertexBuffer& v_multibuffer) { + auto extract_position_at = [](const VertexBuffer& vertices, size_t offset) { + return Vec3f(vertices[offset + 0], vertices[offset + 1], vertices[offset + 2]); + }; + auto update_position_at = [](VertexBuffer& vertices, size_t offset, const Vec3f& position) { + vertices[offset + 0] = position.x(); + vertices[offset + 1] = position.y(); + vertices[offset + 2] = position.z(); + }; + auto match_right_vertices = [&](const Path::Sub_Path& prev_sub_path, const Path::Sub_Path& next_sub_path, + size_t curr_s_id, size_t vertex_size_floats, const Vec3f& displacement_vec) { + if (&prev_sub_path == &next_sub_path) { // previous and next segment are both contained into to the same vertex buffer + VertexBuffer& vbuffer = v_multibuffer[prev_sub_path.first.b_id]; + // offset into the vertex buffer of the next segment 1st vertex + const size_t next_1st_offset = (prev_sub_path.last.s_id - curr_s_id) * 6 * vertex_size_floats; + // offset into the vertex buffer of the right vertex of the previous segment + const size_t prev_right_offset = prev_sub_path.last.i_id - next_1st_offset - 3 * vertex_size_floats; + // new position of the right vertices + const Vec3f shared_vertex = extract_position_at(vbuffer, prev_right_offset) + displacement_vec; + // update previous segment + update_position_at(vbuffer, prev_right_offset, shared_vertex); + // offset into the vertex buffer of the right vertex of the next segment + const size_t next_right_offset = next_sub_path.last.i_id - next_1st_offset; + // update next segment + update_position_at(vbuffer, next_right_offset, shared_vertex); + } + else { // previous and next segment are contained into different vertex buffers + VertexBuffer& prev_vbuffer = v_multibuffer[prev_sub_path.first.b_id]; + VertexBuffer& next_vbuffer = v_multibuffer[next_sub_path.first.b_id]; + // offset into the previous vertex buffer of the right vertex of the previous segment + const size_t prev_right_offset = prev_sub_path.last.i_id - 3 * vertex_size_floats; + // new position of the right vertices + const Vec3f shared_vertex = extract_position_at(prev_vbuffer, prev_right_offset) + displacement_vec; + // update previous segment + update_position_at(prev_vbuffer, prev_right_offset, shared_vertex); + // offset into the next vertex buffer of the right vertex of the next segment + const size_t next_right_offset = next_sub_path.first.i_id + 1 * vertex_size_floats; + // update next segment + update_position_at(next_vbuffer, next_right_offset, shared_vertex); + } + }; + auto match_left_vertices = [&](const Path::Sub_Path& prev_sub_path, const Path::Sub_Path& next_sub_path, + size_t curr_s_id, size_t vertex_size_floats, const Vec3f& displacement_vec) { + if (&prev_sub_path == &next_sub_path) { // previous and next segment are both contained into to the same vertex buffer + VertexBuffer& vbuffer = v_multibuffer[prev_sub_path.first.b_id]; + // offset into the vertex buffer of the next segment 1st vertex + const size_t next_1st_offset = (prev_sub_path.last.s_id - curr_s_id) * 6 * vertex_size_floats; + // offset into the vertex buffer of the left vertex of the previous segment + const size_t prev_left_offset = prev_sub_path.last.i_id - next_1st_offset - 1 * vertex_size_floats; + // new position of the left vertices + const Vec3f shared_vertex = extract_position_at(vbuffer, prev_left_offset) + displacement_vec; + // update previous segment + update_position_at(vbuffer, prev_left_offset, shared_vertex); + // offset into the vertex buffer of the left vertex of the next segment + const size_t next_left_offset = next_sub_path.last.i_id - next_1st_offset + 1 * vertex_size_floats; + // update next segment + update_position_at(vbuffer, next_left_offset, shared_vertex); + } + else { // previous and next segment are contained into different vertex buffers + VertexBuffer& prev_vbuffer = v_multibuffer[prev_sub_path.first.b_id]; + VertexBuffer& next_vbuffer = v_multibuffer[next_sub_path.first.b_id]; + // offset into the previous vertex buffer of the left vertex of the previous segment + const size_t prev_left_offset = prev_sub_path.last.i_id - 1 * vertex_size_floats; + // new position of the left vertices + const Vec3f shared_vertex = extract_position_at(prev_vbuffer, prev_left_offset) + displacement_vec; + // update previous segment + update_position_at(prev_vbuffer, prev_left_offset, shared_vertex); + // offset into the next vertex buffer of the left vertex of the next segment + const size_t next_left_offset = next_sub_path.first.i_id + 3 * vertex_size_floats; + // update next segment + update_position_at(next_vbuffer, next_left_offset, shared_vertex); + } + }; + + auto extract_move_id = [&biased_seams_ids](size_t id) { + size_t new_id = size_t(-1); + auto it = std::lower_bound(biased_seams_ids.begin(), biased_seams_ids.end(), id); + if (it == biased_seams_ids.end()) + new_id = id + biased_seams_ids.size(); + else { + if (it == biased_seams_ids.begin() && *it < id) + new_id = id; + else if (it != biased_seams_ids.begin()) + new_id = id + std::distance(biased_seams_ids.begin(), it); + } + return (new_id == size_t(-1)) ? id : new_id; + }; + + const size_t vertex_size_floats = t_buffer.vertices.vertex_size_floats(); + for (const Path& path : t_buffer.paths) { + // the two segments of the path sharing the current vertex may belong + // to two different vertex buffers + size_t prev_sub_path_id = 0; + size_t next_sub_path_id = 0; + const size_t path_vertices_count = path.vertices_count(); + const float half_width = 0.5f * path.width; + for (size_t j = 1; j < path_vertices_count - 1; ++j) { + const size_t curr_s_id = path.sub_paths.front().first.s_id + j; + const size_t move_id = extract_move_id(curr_s_id); + const Vec3f& prev = gcode_result.moves[move_id - 1].position; + const Vec3f& curr = gcode_result.moves[move_id].position; + const Vec3f& next = gcode_result.moves[move_id + 1].position; + + // select the subpaths which contains the previous/next segments + if (!path.sub_paths[prev_sub_path_id].contains(curr_s_id)) + ++prev_sub_path_id; + if (!path.sub_paths[next_sub_path_id].contains(curr_s_id + 1)) + ++next_sub_path_id; + const Path::Sub_Path& prev_sub_path = path.sub_paths[prev_sub_path_id]; + const Path::Sub_Path& next_sub_path = path.sub_paths[next_sub_path_id]; + + const Vec3f prev_dir = (curr - prev).normalized(); + const Vec3f prev_right = Vec3f(prev_dir.y(), -prev_dir.x(), 0.0f).normalized(); + const Vec3f prev_up = prev_right.cross(prev_dir); + + const Vec3f next_dir = (next - curr).normalized(); + + const bool is_right_turn = prev_up.dot(prev_dir.cross(next_dir)) <= 0.0f; + const float cos_dir = prev_dir.dot(next_dir); + // whether the angle between adjacent segments is greater than 45 degrees + const bool is_sharp = cos_dir < 0.7071068f; + + float displacement = 0.0f; + if (cos_dir > -0.9998477f) { + // if the angle between adjacent segments is smaller than 179 degrees + const Vec3f med_dir = (prev_dir + next_dir).normalized(); + displacement = half_width * ::tan(::acos(std::clamp(next_dir.dot(med_dir), -1.0f, 1.0f))); + } + + const float sq_prev_length = (curr - prev).squaredNorm(); + const float sq_next_length = (next - curr).squaredNorm(); + const float sq_displacement = sqr(displacement); + const bool can_displace = displacement > 0.0f && sq_displacement < sq_prev_length && sq_displacement < sq_next_length; + + if (can_displace) { + // displacement to apply to the vertices to match + const Vec3f displacement_vec = displacement * prev_dir; + // matches inner corner vertices + if (is_right_turn) + match_right_vertices(prev_sub_path, next_sub_path, curr_s_id, vertex_size_floats, -displacement_vec); + else + match_left_vertices(prev_sub_path, next_sub_path, curr_s_id, vertex_size_floats, -displacement_vec); + + if (!is_sharp) { + // matches outer corner vertices + if (is_right_turn) + match_left_vertices(prev_sub_path, next_sub_path, curr_s_id, vertex_size_floats, displacement_vec); + else + match_right_vertices(prev_sub_path, next_sub_path, curr_s_id, vertex_size_floats, displacement_vec); + } + } + } + } + }; + +#if ENABLE_GCODE_VIEWER_STATISTICS + auto load_vertices_time = std::chrono::high_resolution_clock::now(); + m_statistics.load_vertices = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + // smooth toolpaths corners for TBuffers using triangles + for (size_t i = 0; i < m_buffers.size(); ++i) { + const TBuffer& t_buffer = m_buffers[i]; + if (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) + smooth_triangle_toolpaths_corners(t_buffer, vertices[i]); + } + + // dismiss, no more needed + std::vector().swap(biased_seams_ids); + + for (MultiVertexBuffer& v_multibuffer : vertices) { + for (VertexBuffer& v_buffer : v_multibuffer) { + v_buffer.shrink_to_fit(); + } + } + + // move the wipe toolpaths half height up to render them on proper position + MultiVertexBuffer& wipe_vertices = vertices[buffer_id(EMoveType::Wipe)]; + for (VertexBuffer& v_buffer : wipe_vertices) { + for (size_t i = 2; i < v_buffer.size(); i += 3) { + v_buffer[i] += 0.5f * GCodeProcessor::Wipe_Height; + } + } + + // send vertices data to gpu, where needed + for (size_t i = 0; i < m_buffers.size(); ++i) { + TBuffer& t_buffer = m_buffers[i]; + if (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::InstancedModel) { + const InstanceBuffer& inst_buffer = instances[i]; + if (!inst_buffer.empty()) { + t_buffer.model.instances.buffer = inst_buffer; + t_buffer.model.instances.s_ids = instances_ids[i]; + t_buffer.model.instances.offsets = instances_offsets[i]; + } + } + else { + if (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::BatchedModel) { + const InstanceBuffer& inst_buffer = instances[i]; + if (!inst_buffer.empty()) { + t_buffer.model.instances.buffer = inst_buffer; + t_buffer.model.instances.s_ids = instances_ids[i]; + t_buffer.model.instances.offsets = instances_offsets[i]; + } + } + const MultiVertexBuffer& v_multibuffer = vertices[i]; + for (const VertexBuffer& v_buffer : v_multibuffer) { + const size_t size_elements = v_buffer.size(); + const size_t size_bytes = size_elements * sizeof(float); + const size_t vertices_count = size_elements / t_buffer.vertices.vertex_size_floats(); + t_buffer.vertices.count += vertices_count; + +#if ENABLE_GCODE_VIEWER_STATISTICS + m_statistics.total_vertices_gpu_size += static_cast(size_bytes); + m_statistics.max_vbuffer_gpu_size = std::max(m_statistics.max_vbuffer_gpu_size, static_cast(size_bytes)); + ++m_statistics.vbuffers_count; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + +#if ENABLE_GL_CORE_PROFILE + GLuint vao_id = 0; + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) { + glsafe(::glGenVertexArrays(1, &vao_id)); + glsafe(::glBindVertexArray(vao_id)); + } +#endif // ENABLE_GL_CORE_PROFILE + + GLuint vbo_id = 0; + glsafe(::glGenBuffers(1, &vbo_id)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, vbo_id)); + glsafe(::glBufferData(GL_ARRAY_BUFFER, size_bytes, v_buffer.data(), GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) { + glsafe(::glBindVertexArray(0)); + t_buffer.vertices.vaos.push_back(static_cast(vao_id)); + } +#endif // ENABLE_GL_CORE_PROFILE + t_buffer.vertices.vbos.push_back(static_cast(vbo_id)); + t_buffer.vertices.sizes.push_back(size_bytes); + } + } + } + +#if ENABLE_GCODE_VIEWER_STATISTICS + auto smooth_vertices_time = std::chrono::high_resolution_clock::now(); + m_statistics.smooth_vertices = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - load_vertices_time).count(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + log_memory_usage("Loaded G-code generated vertex buffers ", vertices, indices); + + // dismiss vertices data, no more needed + std::vector().swap(vertices); + std::vector().swap(instances); + std::vector().swap(instances_ids); + + // toolpaths data -> extract indices from result + // paths may have been filled while extracting vertices, + // so reset them, they will be filled again while extracting indices + for (TBuffer& buffer : m_buffers) { + buffer.paths.clear(); + } + + // variable used to keep track of the current vertex buffers index and size + using CurrVertexBuffer = std::pair; + std::vector curr_vertex_buffers(m_buffers.size(), { 0, 0 }); + +#if ENABLE_GL_CORE_PROFILE + // variable used to keep track of the vertex buffers ids + using VIndexList = std::vector; + std::vector vao_indices(m_buffers.size()); + std::vector vbo_indices(m_buffers.size()); +#else + // variable used to keep track of the vertex buffers ids + using VboIndexList = std::vector; + std::vector vbo_indices(m_buffers.size()); +#endif // ENABLE_GL_CORE_PROFILE + + size_t seams_count = 0; + + for (size_t i = 0; i < m_moves_count; ++i) { + const GCodeProcessorResult::MoveVertex& curr = gcode_result.moves[i]; + if (curr.type == EMoveType::Seam) + ++seams_count; + + const size_t move_id = i - seams_count; + + // skip first vertex + if (i == 0) + continue; + + const GCodeProcessorResult::MoveVertex& prev = gcode_result.moves[i - 1]; + const GCodeProcessorResult::MoveVertex* next = nullptr; + if (i < m_moves_count - 1) + next = &gcode_result.moves[i + 1]; + + ++progress_count; + if (progress_dialog != nullptr && progress_count % progress_threshold == 0) { + progress_dialog->Update(int(100.0f * float(m_moves_count + i) / (2.0f * float(m_moves_count))), + _L("Generating index buffers") + ": " + wxNumberFormatter::ToString(100.0 * double(i) / double(m_moves_count), 0, wxNumberFormatter::Style_None) + "%"); + progress_dialog->Fit(); + progress_count = 0; + } + + const unsigned char id = buffer_id(curr.type); + TBuffer& t_buffer = m_buffers[id]; + MultiIndexBuffer& i_multibuffer = indices[id]; + CurrVertexBuffer& curr_vertex_buffer = curr_vertex_buffers[id]; +#if ENABLE_GL_CORE_PROFILE + VIndexList& vao_index_list = vao_indices[id]; + VIndexList& vbo_index_list = vbo_indices[id]; +#else + VboIndexList& vbo_index_list = vbo_indices[id]; +#endif // ENABLE_GL_CORE_PROFILE + + // ensure there is at least one index buffer + if (i_multibuffer.empty()) { + i_multibuffer.push_back(IndexBuffer()); +#if ENABLE_GL_CORE_PROFILE + if (!t_buffer.vertices.vaos.empty() && OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + vao_index_list.push_back(t_buffer.vertices.vaos[curr_vertex_buffer.first]); + + if (!t_buffer.vertices.vbos.empty()) + vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); +#else + if (!t_buffer.vertices.vbos.empty()) + vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); +#endif // ENABLE_GL_CORE_PROFILE + } + + // if adding the indices for the current segment exceeds the threshold size of the current index buffer + // create another index buffer + size_t indiced_size_to_add = (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::BatchedModel) ? t_buffer.model.data.indices_size_bytes() : t_buffer.max_indices_per_segment_size_bytes(); + if (i_multibuffer.back().size() * sizeof(IBufferType) >= IBUFFER_THRESHOLD_BYTES - indiced_size_to_add) { + i_multibuffer.push_back(IndexBuffer()); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + vao_index_list.push_back(t_buffer.vertices.vaos[curr_vertex_buffer.first]); +#endif // ENABLE_GL_CORE_PROFILE + vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); + if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::BatchedModel) { + Path& last_path = t_buffer.paths.back(); + last_path.add_sub_path(prev, static_cast(i_multibuffer.size()) - 1, 0, move_id - 1); + } + } + + // if adding the vertices for the current segment exceeds the threshold size of the current vertex buffer + // create another index buffer + size_t vertices_size_to_add = (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::BatchedModel) ? t_buffer.model.data.vertices_size_bytes() : t_buffer.max_vertices_per_segment_size_bytes(); + if (curr_vertex_buffer.second * t_buffer.vertices.vertex_size_bytes() > t_buffer.vertices.max_size_bytes() - vertices_size_to_add) { + i_multibuffer.push_back(IndexBuffer()); + + ++curr_vertex_buffer.first; + curr_vertex_buffer.second = 0; +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + vao_index_list.push_back(t_buffer.vertices.vaos[curr_vertex_buffer.first]); +#endif // ENABLE_GL_CORE_PROFILE + vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); + + if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::BatchedModel) { + Path& last_path = t_buffer.paths.back(); + last_path.add_sub_path(prev, static_cast(i_multibuffer.size()) - 1, 0, move_id - 1); + } + } + + IndexBuffer& i_buffer = i_multibuffer.back(); + + switch (t_buffer.render_primitive_type) + { + case TBuffer::ERenderPrimitiveType::Line: { + add_indices_as_line(prev, curr, t_buffer, static_cast(i_multibuffer.size()) - 1, i_buffer, move_id, account_for_volumetric_rate); + curr_vertex_buffer.second += t_buffer.max_vertices_per_segment(); + break; + } + case TBuffer::ERenderPrimitiveType::Triangle: { + add_indices_as_solid(prev, curr, next, t_buffer, curr_vertex_buffer.second, static_cast(i_multibuffer.size()) - 1, i_buffer, move_id, account_for_volumetric_rate); + break; + } + case TBuffer::ERenderPrimitiveType::BatchedModel: { + add_indices_as_model_batch(t_buffer.model.data, i_buffer, curr_vertex_buffer.second); + curr_vertex_buffer.second += t_buffer.model.data.vertices_count(); + break; + } + default: { break; } + } + } + + for (MultiIndexBuffer& i_multibuffer : indices) { + for (IndexBuffer& i_buffer : i_multibuffer) { + i_buffer.shrink_to_fit(); + } + } + + // toolpaths data -> send indices data to gpu + for (size_t i = 0; i < m_buffers.size(); ++i) { + TBuffer& t_buffer = m_buffers[i]; + if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::InstancedModel) { + const MultiIndexBuffer& i_multibuffer = indices[i]; + for (const IndexBuffer& i_buffer : i_multibuffer) { + const size_t size_elements = i_buffer.size(); + const size_t size_bytes = size_elements * sizeof(IBufferType); + + // stores index buffer informations into TBuffer + t_buffer.indices.push_back(IBuffer()); + IBuffer& ibuf = t_buffer.indices.back(); + ibuf.count = size_elements; +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + ibuf.vao = vao_indices[i][t_buffer.indices.size() - 1]; +#endif // ENABLE_GL_CORE_PROFILE + ibuf.vbo = vbo_indices[i][t_buffer.indices.size() - 1]; + +#if ENABLE_GCODE_VIEWER_STATISTICS + m_statistics.total_indices_gpu_size += static_cast(size_bytes); + m_statistics.max_ibuffer_gpu_size = std::max(m_statistics.max_ibuffer_gpu_size, static_cast(size_bytes)); + ++m_statistics.ibuffers_count; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + glsafe(::glGenBuffers(1, &ibuf.ibo)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuf.ibo)); + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, size_bytes, i_buffer.data(), GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + } + } + } + + if (progress_dialog != nullptr) { + progress_dialog->Update(100, ""); + progress_dialog->Fit(); + } + +#if ENABLE_GCODE_VIEWER_STATISTICS + for (const TBuffer& buffer : m_buffers) { + m_statistics.paths_size += SLIC3R_STDVEC_MEMSIZE(buffer.paths, Path); + } + + auto update_segments_count = [&](EMoveType type, int64_t& count) { + unsigned int id = buffer_id(type); + const MultiIndexBuffer& buffers = indices[id]; + int64_t indices_count = 0; + for (const IndexBuffer& buffer : buffers) { + indices_count += buffer.size(); + } + const TBuffer& t_buffer = m_buffers[id]; + if (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) + indices_count -= static_cast(12 * t_buffer.paths.size()); // remove the starting + ending caps = 4 triangles + + count += indices_count / t_buffer.indices_per_segment(); + }; + + update_segments_count(EMoveType::Travel, m_statistics.travel_segments_count); + update_segments_count(EMoveType::Wipe, m_statistics.wipe_segments_count); + update_segments_count(EMoveType::Extrude, m_statistics.extrude_segments_count); + + m_statistics.load_indices = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - smooth_vertices_time).count(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + log_memory_usage("Loaded G-code generated indices buffers ", vertices, indices); + + // dismiss indices data, no more needed + std::vector().swap(indices); + + // layers zs / roles / extruder ids -> extract from result + size_t last_travel_s_id = 0; + seams_count = 0; + for (size_t i = 0; i < m_moves_count; ++i) { + const GCodeProcessorResult::MoveVertex& move = gcode_result.moves[i]; + if (move.type == EMoveType::Seam) + ++seams_count; + + size_t move_id = i - seams_count; + + if (move.type == EMoveType::Extrude) { + if (!move.internal_only) { + // layers zs + const double* const last_z = m_layers.empty() ? nullptr : &m_layers.get_zs().back(); + const double z = static_cast(move.position.z()); + if (last_z == nullptr || z < *last_z - EPSILON || *last_z + EPSILON < z) + m_layers.append(z, { last_travel_s_id, move_id }); + else + m_layers.get_ranges().back().last = move_id; + } + // extruder ids + m_extruder_ids.emplace_back(move.extruder_id); + // roles + if (i > 0) + m_roles.emplace_back(move.extrusion_role); + } + else if (move.type == EMoveType::Travel) { + if (move_id - last_travel_s_id > 1 && !m_layers.empty()) + m_layers.get_ranges().back().last = move_id; + + last_travel_s_id = move_id; + } + } + + // roles -> remove duplicates + sort_remove_duplicates(m_roles); + m_roles.shrink_to_fit(); + + // extruder ids -> remove duplicates + sort_remove_duplicates(m_extruder_ids); + m_extruder_ids.shrink_to_fit(); + + // replace layers for spiral vase mode + if (!gcode_result.spiral_vase_layers.empty()) { + m_layers.reset(); + for (const auto& layer : gcode_result.spiral_vase_layers) { + m_layers.append(layer.first, { layer.second.first, layer.second.second }); + } + } + + // set layers z range + if (!m_layers.empty()) + m_layers_z_range = { 0, static_cast(m_layers.size() - 1) }; + + // change color of paths whose layer contains option points + if (!options_zs.empty()) { + TBuffer& extrude_buffer = m_buffers[buffer_id(EMoveType::Extrude)]; + for (Path& path : extrude_buffer.paths) { + const float z = path.sub_paths.front().first.position.z(); + if (std::find_if(options_zs.begin(), options_zs.end(), [z](float f) { return f - EPSILON <= z && z <= f + EPSILON; }) != options_zs.end()) + path.cp_color_id = 255 - path.cp_color_id; + } + } + +#if ENABLE_GCODE_VIEWER_STATISTICS + m_statistics.load_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + if (progress_dialog != nullptr) + progress_dialog->Destroy(); +} + +void GCodeViewer::load_shells(const Print& print) +{ + if (print.objects().empty()) + // no shells, return + return; + + // adds objects' volumes + int object_id = 0; + for (const PrintObject* obj : print.objects()) { + const ModelObject* model_obj = obj->model_object(); + + std::vector instance_ids(model_obj->instances.size()); + for (int i = 0; i < (int)model_obj->instances.size(); ++i) { + instance_ids[i] = i; + } + + size_t current_volumes_count = m_shells.volumes.volumes.size(); + m_shells.volumes.load_object(model_obj, object_id, instance_ids); + + // adjust shells' z if raft is present + const SlicingParameters& slicing_parameters = obj->slicing_parameters(); + if (slicing_parameters.object_print_z_min != 0.0) { + const Vec3d z_offset = slicing_parameters.object_print_z_min * Vec3d::UnitZ(); + for (size_t i = current_volumes_count; i < m_shells.volumes.volumes.size(); ++i) { + GLVolume* v = m_shells.volumes.volumes[i]; + v->set_volume_offset(v->get_volume_offset() + z_offset); + } + } + + ++object_id; + } + + if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptFFF) { + // adds wipe tower's volume + const double max_z = print.objects()[0]->model_object()->get_model()->max_z(); + const PrintConfig& config = print.config(); + const size_t extruders_count = config.nozzle_diameter.size(); + if (extruders_count > 1 && config.wipe_tower && !config.complete_objects) { + const WipeTowerData& wipe_tower_data = print.wipe_tower_data(extruders_count); + const float depth = wipe_tower_data.depth; + const float brim_width = wipe_tower_data.brim_width; + m_shells.volumes.load_wipe_tower_preview(config.wipe_tower_x, config.wipe_tower_y, config.wipe_tower_width, depth, max_z, config.wipe_tower_cone_angle, config.wipe_tower_rotation_angle, + !print.is_step_done(psWipeTower), brim_width); + } + } + + // remove modifiers + while (true) { + GLVolumePtrs::iterator it = std::find_if(m_shells.volumes.volumes.begin(), m_shells.volumes.volumes.end(), [](GLVolume* volume) { return volume->is_modifier; }); + if (it != m_shells.volumes.volumes.end()) { + delete (*it); + m_shells.volumes.volumes.erase(it); + } + else + break; + } + + for (GLVolume* volume : m_shells.volumes.volumes) { + volume->zoom_to_volumes = false; + volume->color.a(0.25f); + volume->force_native_color = true; + volume->set_render_color(true); + } +} + +void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool keep_sequential_current_last) const +{ +#if ENABLE_GCODE_VIEWER_STATISTICS + auto start_time = std::chrono::high_resolution_clock::now(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + auto extrusion_color = [this](const Path& path) { + ColorRGBA color; + switch (m_view_type) + { + case EViewType::FeatureType: { color = Extrusion_Role_Colors[static_cast(path.role)]; break; } + case EViewType::Height: { color = m_extrusions.ranges.height.get_color_at(path.height); break; } + case EViewType::Width: { color = m_extrusions.ranges.width.get_color_at(path.width); break; } + case EViewType::Feedrate: { color = m_extrusions.ranges.feedrate.get_color_at(path.feedrate); break; } + case EViewType::FanSpeed: { color = m_extrusions.ranges.fan_speed.get_color_at(path.fan_speed); break; } + case EViewType::Temperature: { color = m_extrusions.ranges.temperature.get_color_at(path.temperature); break; } + case EViewType::LayerTimeLinear: + case EViewType::LayerTimeLogarithmic: { + const Path::Sub_Path& sub_path = path.sub_paths.front(); + double z = static_cast(sub_path.first.position.z()); + const std::vector& zs = m_layers.get_zs(); + const std::vector& ranges = m_layers.get_ranges(); + size_t time_mode_id = static_cast(m_time_estimate_mode); + for (size_t i = 0; i < zs.size(); ++i) { + if (std::abs(zs[i] - z) < EPSILON) { + if (ranges[i].contains(sub_path.first.s_id)) { + color = m_extrusions.ranges.layer_time[time_mode_id].get_color_at(m_layers_times[time_mode_id][i], + (m_view_type == EViewType::LayerTimeLinear) ? Extrusions::Range::EType::Linear : Extrusions::Range::EType::Logarithmic); + break; + } + } + } + break; + } + case EViewType::VolumetricRate: { color = m_extrusions.ranges.volumetric_rate.get_color_at(path.volumetric_rate); break; } + case EViewType::Tool: { color = m_tool_colors[path.extruder_id]; break; } + case EViewType::ColorPrint: { + if (path.cp_color_id >= static_cast(m_tool_colors.size())) + color = ColorRGBA::GRAY(); + else + color = m_tool_colors[path.cp_color_id]; + + break; + } + default: { color = ColorRGBA::WHITE(); break; } + } + + return color; + }; + + auto travel_color = [](const Path& path) { + return (path.delta_extruder < 0.0f) ? Travel_Colors[2] /* Retract */ : + ((path.delta_extruder > 0.0f) ? Travel_Colors[1] /* Extrude */ : + Travel_Colors[0] /* Move */); + }; + + auto is_in_layers_range = [this](const Path& path, size_t min_id, size_t max_id) { + auto in_layers_range = [this, min_id, max_id](size_t id) { + return m_layers.get_range_at(min_id).first <= id && id <= m_layers.get_range_at(max_id).last; + }; + + return in_layers_range(path.sub_paths.front().first.s_id) && in_layers_range(path.sub_paths.back().last.s_id); + }; + + auto is_travel_in_layers_range = [this](size_t path_id, size_t min_id, size_t max_id) { + const TBuffer& buffer = m_buffers[buffer_id(EMoveType::Travel)]; + if (path_id >= buffer.paths.size()) + return false; + + Path path = buffer.paths[path_id]; + size_t first = path_id; + size_t last = path_id; + + // check adjacent paths + while (first > 0 && path.sub_paths.front().first.position.isApprox(buffer.paths[first - 1].sub_paths.back().last.position)) { + --first; + path.sub_paths.front().first = buffer.paths[first].sub_paths.front().first; + } + while (last < buffer.paths.size() - 1 && path.sub_paths.back().last.position.isApprox(buffer.paths[last + 1].sub_paths.front().first.position)) { + ++last; + path.sub_paths.back().last = buffer.paths[last].sub_paths.back().last; + } + + const size_t min_s_id = m_layers.get_range_at(min_id).first; + const size_t max_s_id = m_layers.get_range_at(max_id).last; + + return (min_s_id <= path.sub_paths.front().first.s_id && path.sub_paths.front().first.s_id <= max_s_id) || + (min_s_id <= path.sub_paths.back().last.s_id && path.sub_paths.back().last.s_id <= max_s_id); + }; + +#if ENABLE_GCODE_VIEWER_STATISTICS + Statistics* statistics = const_cast(&m_statistics); + statistics->render_paths_size = 0; + statistics->models_instances_size = 0; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + const bool top_layer_only = get_app_config()->get_bool("seq_top_layer_only"); + + SequentialView::Endpoints global_endpoints = { m_moves_count , 0 }; + SequentialView::Endpoints top_layer_endpoints = global_endpoints; + SequentialView* sequential_view = const_cast(&m_sequential_view); + if (top_layer_only || !keep_sequential_current_first) sequential_view->current.first = 0; + if (!keep_sequential_current_last) sequential_view->current.last = m_moves_count; + + // first pass: collect visible paths and update sequential view data + std::vector> paths; + for (size_t b = 0; b < m_buffers.size(); ++b) { + TBuffer& buffer = const_cast(m_buffers[b]); + // reset render paths + buffer.render_paths.clear(); + + if (!buffer.visible) + continue; + + if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::InstancedModel || + buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::BatchedModel) { + for (size_t id : buffer.model.instances.s_ids) { + if (id < m_layers.get_range_at(m_layers_z_range[0]).first || m_layers.get_range_at(m_layers_z_range[1]).last < id) + continue; + + global_endpoints.first = std::min(global_endpoints.first, id); + global_endpoints.last = std::max(global_endpoints.last, id); + + if (top_layer_only) { + if (id < m_layers.get_range_at(m_layers_z_range[1]).first || m_layers.get_range_at(m_layers_z_range[1]).last < id) + continue; + + top_layer_endpoints.first = std::min(top_layer_endpoints.first, id); + top_layer_endpoints.last = std::max(top_layer_endpoints.last, id); + } + } + } + else { + for (size_t i = 0; i < buffer.paths.size(); ++i) { + const Path& path = buffer.paths[i]; + if (path.type == EMoveType::Travel) { + if (!is_travel_in_layers_range(i, m_layers_z_range[0], m_layers_z_range[1])) + continue; + } + else if (!is_in_layers_range(path, m_layers_z_range[0], m_layers_z_range[1])) + continue; + + if (path.type == EMoveType::Extrude && !is_visible(path)) + continue; + + // store valid path + for (size_t j = 0; j < path.sub_paths.size(); ++j) { + paths.push_back({ static_cast(b), path.sub_paths[j].first.b_id, static_cast(i), static_cast(j) }); + } + + global_endpoints.first = std::min(global_endpoints.first, path.sub_paths.front().first.s_id); + global_endpoints.last = std::max(global_endpoints.last, path.sub_paths.back().last.s_id); + + if (top_layer_only) { + if (path.type == EMoveType::Travel) { + if (is_travel_in_layers_range(i, m_layers_z_range[1], m_layers_z_range[1])) { + top_layer_endpoints.first = std::min(top_layer_endpoints.first, path.sub_paths.front().first.s_id); + top_layer_endpoints.last = std::max(top_layer_endpoints.last, path.sub_paths.back().last.s_id); + } + } + else if (is_in_layers_range(path, m_layers_z_range[1], m_layers_z_range[1])) { + top_layer_endpoints.first = std::min(top_layer_endpoints.first, path.sub_paths.front().first.s_id); + top_layer_endpoints.last = std::max(top_layer_endpoints.last, path.sub_paths.back().last.s_id); + } + } + } + } + } + + // update current sequential position + sequential_view->current.first = !top_layer_only && keep_sequential_current_first ? std::clamp(sequential_view->current.first, global_endpoints.first, global_endpoints.last) : global_endpoints.first; + sequential_view->current.last = keep_sequential_current_last ? std::clamp(sequential_view->current.last, global_endpoints.first, global_endpoints.last) : global_endpoints.last; + + // get the world position from the vertex buffer + bool found = false; + for (const TBuffer& buffer : m_buffers) { + if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::InstancedModel || + buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::BatchedModel) { + for (size_t i = 0; i < buffer.model.instances.s_ids.size(); ++i) { + if (buffer.model.instances.s_ids[i] == m_sequential_view.current.last) { + size_t offset = i * buffer.model.instances.instance_size_floats(); + sequential_view->current_position.x() = buffer.model.instances.buffer[offset + 0]; + sequential_view->current_position.y() = buffer.model.instances.buffer[offset + 1]; + sequential_view->current_position.z() = buffer.model.instances.buffer[offset + 2]; + sequential_view->current_offset = buffer.model.instances.offsets[i]; + found = true; + break; + } + } + } + else { + // searches the path containing the current position + for (const Path& path : buffer.paths) { + if (path.contains(m_sequential_view.current.last)) { + const int sub_path_id = path.get_id_of_sub_path_containing(m_sequential_view.current.last); + if (sub_path_id != -1) { + const Path::Sub_Path& sub_path = path.sub_paths[sub_path_id]; + unsigned int offset = static_cast(m_sequential_view.current.last - sub_path.first.s_id); + if (offset > 0) { + if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Line) + offset = 2 * offset - 1; + else if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) { + unsigned int indices_count = buffer.indices_per_segment(); + offset = indices_count * (offset - 1) + (indices_count - 2); + if (sub_path_id == 0) + offset += 6; // add 2 triangles for starting cap + } + } + offset += static_cast(sub_path.first.i_id); + + // gets the vertex index from the index buffer on gpu + const IBuffer& i_buffer = buffer.indices[sub_path.first.b_id]; + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); +#if ENABLE_OPENGL_ES + IBufferType index = *static_cast(::glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, + static_cast(offset * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), + GL_MAP_READ_BIT)); + glcheck(); + glsafe(::glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER)); +#else + IBufferType index = 0; + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast(offset * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&index))); +#endif // ENABLE_OPENGL_ES + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + + // gets the position from the vertices buffer on gpu + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, i_buffer.vbo)); +#if ENABLE_OPENGL_ES + sequential_view->current_position = *static_cast(::glMapBufferRange(GL_ARRAY_BUFFER, + static_cast(index * buffer.vertices.vertex_size_bytes()), + static_cast(buffer.vertices.position_size_bytes()), GL_MAP_READ_BIT)); + glcheck(); + glsafe(::glUnmapBuffer(GL_ARRAY_BUFFER)); +#else + glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, static_cast(index * buffer.vertices.vertex_size_bytes()), static_cast(3 * sizeof(float)), static_cast(sequential_view->current_position.data()))); +#endif // ENABLE_OPENGL_ES + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + + sequential_view->current_offset = Vec3f::Zero(); + found = true; + break; + } + } + } + } + + if (found) + break; + } + + // second pass: filter paths by sequential data and collect them by color + RenderPath* render_path = nullptr; + for (const auto& [tbuffer_id, ibuffer_id, path_id, sub_path_id] : paths) { + TBuffer& buffer = const_cast(m_buffers[tbuffer_id]); + const Path& path = buffer.paths[path_id]; + const Path::Sub_Path& sub_path = path.sub_paths[sub_path_id]; + if (m_sequential_view.current.last < sub_path.first.s_id || sub_path.last.s_id < m_sequential_view.current.first) + continue; + + ColorRGBA color; + switch (path.type) + { + case EMoveType::Tool_change: + case EMoveType::Color_change: + case EMoveType::Pause_Print: + case EMoveType::Custom_GCode: + case EMoveType::Retract: + case EMoveType::Unretract: + case EMoveType::Seam: { color = option_color(path.type); break; } + case EMoveType::Extrude: { + if (!top_layer_only || + m_sequential_view.current.last == global_endpoints.last || + is_in_layers_range(path, m_layers_z_range[1], m_layers_z_range[1])) + color = extrusion_color(path); + else + color = Neutral_Color; + + break; + } + case EMoveType::Travel: { + if (!top_layer_only || m_sequential_view.current.last == global_endpoints.last || is_travel_in_layers_range(path_id, m_layers_z_range[1], m_layers_z_range[1])) + color = (m_view_type == EViewType::Feedrate || m_view_type == EViewType::Tool || m_view_type == EViewType::ColorPrint) ? extrusion_color(path) : travel_color(path); + else + color = Neutral_Color; + + break; + } + case EMoveType::Wipe: { color = Wipe_Color; break; } + default: { color = { 0.0f, 0.0f, 0.0f, 1.0f }; break; } + } + + RenderPath key{ tbuffer_id, color, static_cast(ibuffer_id), path_id }; + if (render_path == nullptr || !RenderPathPropertyEqual()(*render_path, key)) { + buffer.render_paths.emplace_back(key); + render_path = const_cast(&buffer.render_paths.back()); + } + + unsigned int delta_1st = 0; + if (sub_path.first.s_id < m_sequential_view.current.first && m_sequential_view.current.first <= sub_path.last.s_id) + delta_1st = static_cast(m_sequential_view.current.first - sub_path.first.s_id); + + unsigned int size_in_indices = 0; + switch (buffer.render_primitive_type) + { + case TBuffer::ERenderPrimitiveType::Line: + case TBuffer::ERenderPrimitiveType::Triangle: { + unsigned int segments_count = std::min(m_sequential_view.current.last, sub_path.last.s_id) - std::max(m_sequential_view.current.first, sub_path.first.s_id); + size_in_indices = buffer.indices_per_segment() * segments_count; + break; + } + default: { break; } + } + + if (size_in_indices == 0) + continue; + + if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) { + if (sub_path_id == 0 && delta_1st == 0) + size_in_indices += 6; // add 2 triangles for starting cap + if (sub_path_id == path.sub_paths.size() - 1 && path.sub_paths.back().last.s_id <= m_sequential_view.current.last) + size_in_indices += 6; // add 2 triangles for ending cap + if (delta_1st > 0) + size_in_indices -= 6; // remove 2 triangles for corner cap + } + + render_path->sizes.push_back(size_in_indices); + + if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) { + delta_1st *= buffer.indices_per_segment(); + if (delta_1st > 0) { + delta_1st += 6; // skip 2 triangles for corner cap + if (sub_path_id == 0) + delta_1st += 6; // skip 2 triangles for starting cap + } + } + + render_path->offsets.push_back(static_cast((sub_path.first.i_id + delta_1st) * sizeof(IBufferType))); + +#if 0 + // check sizes and offsets against index buffer size on gpu + GLint buffer_size; + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer->indices[render_path->ibuffer_id].ibo)); + glsafe(::glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &buffer_size)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + if (render_path->offsets.back() + render_path->sizes.back() * sizeof(IBufferType) > buffer_size) + BOOST_LOG_TRIVIAL(error) << "GCodeViewer::refresh_render_paths: Invalid render path data"; +#endif + } + + // Removes empty render paths and sort. + for (size_t b = 0; b < m_buffers.size(); ++b) { + TBuffer* buffer = const_cast(&m_buffers[b]); + buffer->render_paths.erase(std::remove_if(buffer->render_paths.begin(), buffer->render_paths.end(), + [](const auto &path){ return path.sizes.empty() || path.offsets.empty(); }), + buffer->render_paths.end()); + } + + // second pass: for buffers using instanced and batched models, update the instances render ranges + for (size_t b = 0; b < m_buffers.size(); ++b) { + TBuffer& buffer = const_cast(m_buffers[b]); + if (buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::InstancedModel && + buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::BatchedModel) + continue; + + buffer.model.instances.render_ranges.reset(); + + if (!buffer.visible || buffer.model.instances.s_ids.empty()) + continue; + + buffer.model.instances.render_ranges.ranges.push_back({ 0, 0, 0, buffer.model.color }); + bool has_second_range = top_layer_only && m_sequential_view.current.last != m_sequential_view.global.last; + if (has_second_range) + buffer.model.instances.render_ranges.ranges.push_back({ 0, 0, 0, Neutral_Color }); + + if (m_sequential_view.current.first <= buffer.model.instances.s_ids.back() && buffer.model.instances.s_ids.front() <= m_sequential_view.current.last) { + for (size_t id : buffer.model.instances.s_ids) { + if (has_second_range) { + if (id < m_sequential_view.endpoints.first) { + ++buffer.model.instances.render_ranges.ranges.front().offset; + if (id <= m_sequential_view.current.first) + ++buffer.model.instances.render_ranges.ranges.back().offset; + else + ++buffer.model.instances.render_ranges.ranges.back().count; + } + else if (id <= m_sequential_view.current.last) + ++buffer.model.instances.render_ranges.ranges.front().count; + else + break; + } + else { + if (id <= m_sequential_view.current.first) + ++buffer.model.instances.render_ranges.ranges.front().offset; + else if (id <= m_sequential_view.current.last) + ++buffer.model.instances.render_ranges.ranges.front().count; + else + break; + } + } + } + } + + // set sequential data to their final value + sequential_view->endpoints = top_layer_only ? top_layer_endpoints : global_endpoints; + sequential_view->current.first = !top_layer_only && keep_sequential_current_first ? std::clamp(sequential_view->current.first, sequential_view->endpoints.first, sequential_view->endpoints.last) : sequential_view->endpoints.first; + sequential_view->global = global_endpoints; + + // updates sequential range caps + std::array* sequential_range_caps = const_cast*>(&m_sequential_range_caps); + (*sequential_range_caps)[0].reset(); + (*sequential_range_caps)[1].reset(); + + if (m_sequential_view.current.first != m_sequential_view.current.last) { + for (const auto& [tbuffer_id, ibuffer_id, path_id, sub_path_id] : paths) { + TBuffer& buffer = const_cast(m_buffers[tbuffer_id]); + if (buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Triangle) + continue; + + const Path& path = buffer.paths[path_id]; + const Path::Sub_Path& sub_path = path.sub_paths[sub_path_id]; + if (m_sequential_view.current.last <= sub_path.first.s_id || sub_path.last.s_id <= m_sequential_view.current.first) + continue; + + // update cap for first endpoint of current range + if (m_sequential_view.current.first > sub_path.first.s_id) { + SequentialRangeCap& cap = (*sequential_range_caps)[0]; + const IBuffer& i_buffer = buffer.indices[ibuffer_id]; + cap.buffer = &buffer; +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + cap.vao = i_buffer.vao; +#endif // ENABLE_GL_CORE_PROFILE + cap.vbo = i_buffer.vbo; + + // calculate offset into the index buffer + unsigned int offset = sub_path.first.i_id; + offset += 6; // add 2 triangles for corner cap + offset += static_cast(m_sequential_view.current.first - sub_path.first.s_id) * buffer.indices_per_segment(); + if (sub_path_id == 0) + offset += 6; // add 2 triangles for starting cap + + // extract indices from index buffer + std::array indices{ 0, 0, 0, 0, 0, 0 }; + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); +#if ENABLE_OPENGL_ES + IBufferType* index_ptr = static_cast(::glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, + static_cast(offset * sizeof(IBufferType)), static_cast(14 * sizeof(IBufferType)), + GL_MAP_READ_BIT)); + glcheck(); + indices[0] = *(index_ptr + 0); + indices[1] = *(index_ptr + 7); + indices[2] = *(index_ptr + 1); + indices[4] = *(index_ptr + 13); + glsafe(::glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER)); +#else + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 0) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[0]))); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 7) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[1]))); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 1) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[2]))); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 13) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[4]))); +#endif // ENABLE_OPENGL_ES + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + indices[3] = indices[0]; + indices[5] = indices[1]; + + // send indices to gpu + glsafe(::glGenBuffers(1, &cap.ibo)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cap.ibo)); + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(IBufferType), indices.data(), GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + + // extract color from render path + size_t offset_bytes = offset * sizeof(IBufferType); + for (const RenderPath& render_path : buffer.render_paths) { + if (render_path.ibuffer_id == ibuffer_id) { + for (size_t j = 0; j < render_path.offsets.size(); ++j) { + if (render_path.contains(offset_bytes)) { + cap.color = render_path.color; + break; + } + } + } + } + } + + // update cap for last endpoint of current range + if (m_sequential_view.current.last < sub_path.last.s_id) { + SequentialRangeCap& cap = (*sequential_range_caps)[1]; + const IBuffer& i_buffer = buffer.indices[ibuffer_id]; + cap.buffer = &buffer; +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + cap.vao = i_buffer.vao; +#endif // ENABLE_GL_CORE_PROFILE + cap.vbo = i_buffer.vbo; + + // calculate offset into the index buffer + unsigned int offset = sub_path.first.i_id; + offset += 6; // add 2 triangles for corner cap + offset += static_cast(m_sequential_view.current.last - 1 - sub_path.first.s_id) * buffer.indices_per_segment(); + if (sub_path_id == 0) + offset += 6; // add 2 triangles for starting cap + + // extract indices from index buffer + std::array indices{ 0, 0, 0, 0, 0, 0 }; + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); +#if ENABLE_OPENGL_ES + IBufferType* index_ptr = static_cast(::glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, + static_cast(offset * sizeof(IBufferType)), static_cast(17 * sizeof(IBufferType)), + GL_MAP_READ_BIT)); + glcheck(); + indices[0] = *(index_ptr + 2); + indices[1] = *(index_ptr + 4); + indices[2] = *(index_ptr + 10); + indices[5] = *(index_ptr + 16); + glsafe(::glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER)); +#else + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 2) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[0]))); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 4) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[1]))); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 10) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[2]))); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 16) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[5]))); +#endif // ENABLE_OPENGL_ES + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + indices[3] = indices[0]; + indices[4] = indices[2]; + + // send indices to gpu + glsafe(::glGenBuffers(1, &cap.ibo)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cap.ibo)); + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * sizeof(IBufferType), indices.data(), GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + + // extract color from render path + size_t offset_bytes = offset * sizeof(IBufferType); + for (const RenderPath& render_path : buffer.render_paths) { + if (render_path.ibuffer_id == ibuffer_id) { + for (size_t j = 0; j < render_path.offsets.size(); ++j) { + if (render_path.contains(offset_bytes)) { + cap.color = render_path.color; + break; + } + } + } + } + } + + if ((*sequential_range_caps)[0].is_renderable() && (*sequential_range_caps)[1].is_renderable()) + break; + } + } + + wxGetApp().plater()->enable_preview_moves_slider(!paths.empty()); + +#if ENABLE_GCODE_VIEWER_STATISTICS + for (const TBuffer& buffer : m_buffers) { + statistics->render_paths_size += SLIC3R_STDUNORDEREDSET_MEMSIZE(buffer.render_paths, RenderPath); + for (const RenderPath& path : buffer.render_paths) { + statistics->render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.sizes, unsigned int); + statistics->render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.offsets, size_t); + } + statistics->models_instances_size += SLIC3R_STDVEC_MEMSIZE(buffer.model.instances.buffer, float); + statistics->models_instances_size += SLIC3R_STDVEC_MEMSIZE(buffer.model.instances.s_ids, size_t); + statistics->models_instances_size += SLIC3R_STDVEC_MEMSIZE(buffer.model.instances.render_ranges.ranges, InstanceVBuffer::Ranges::Range); + } + statistics->refresh_paths_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS +} + +void GCodeViewer::render_toolpaths() +{ + const Camera& camera = wxGetApp().plater()->get_camera(); +#if !ENABLE_GL_CORE_PROFILE + const double zoom = camera.get_zoom(); +#endif // !ENABLE_GL_CORE_PROFILE + + auto render_as_lines = [ +#if ENABLE_GCODE_VIEWER_STATISTICS + this +#endif // ENABLE_GCODE_VIEWER_STATISTICS + ](std::vector::iterator it_path, std::vector::iterator it_end, GLShaderProgram& shader, int uniform_color) { + for (auto it = it_path; it != it_end && it_path->ibuffer_id == it->ibuffer_id; ++it) { + const RenderPath& path = *it; + // Some OpenGL drivers crash on empty glMultiDrawElements, see GH #7415. + assert(! path.sizes.empty()); + assert(! path.offsets.empty()); + shader.set_uniform(uniform_color, path.color); +#if ENABLE_GL_CORE_PROFILE + const Camera& camera = wxGetApp().plater()->get_camera(); + const std::array& viewport = camera.get_viewport(); + const float zoom = float(camera.get_zoom()); + shader.set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader.set_uniform("width", (zoom < 5.0f) ? 0.5f : (0.5f + 5.0f * (zoom - 5.0f) / (100.0f - 5.0f))); + shader.set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE + +#if ENABLE_OPENGL_ES + for (size_t i = 0; i < path.sizes.size(); ++i) { + glsafe(::glDrawElements(GL_LINES, (GLsizei)path.sizes[i], GL_UNSIGNED_SHORT, (const void*)path.offsets[i])); + } +#else + glsafe(::glMultiDrawElements(GL_LINES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); +#endif // ENABLE_OPENGL_ES +#if ENABLE_GCODE_VIEWER_STATISTICS + ++m_statistics.gl_multi_lines_calls_count; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + } + }; + + auto render_as_triangles = [ +#if ENABLE_GCODE_VIEWER_STATISTICS + this +#endif // ENABLE_GCODE_VIEWER_STATISTICS + ](std::vector::iterator it_path, std::vector::iterator it_end, GLShaderProgram& shader, int uniform_color) { + for (auto it = it_path; it != it_end && it_path->ibuffer_id == it->ibuffer_id; ++it) { + const RenderPath& path = *it; + // Some OpenGL drivers crash on empty glMultiDrawElements, see GH #7415. + assert(! path.sizes.empty()); + assert(! path.offsets.empty()); + shader.set_uniform(uniform_color, path.color); +#if ENABLE_OPENGL_ES + for (size_t i = 0; i < path.sizes.size(); ++i) { + glsafe(::glDrawElements(GL_TRIANGLES, (GLsizei)path.sizes[i], GL_UNSIGNED_SHORT, (const void*)path.offsets[i])); + } +#else + glsafe(::glMultiDrawElements(GL_TRIANGLES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); +#endif // ENABLE_OPENGL_ES +#if ENABLE_GCODE_VIEWER_STATISTICS + ++m_statistics.gl_multi_triangles_calls_count; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + } + }; + + auto render_as_instanced_model = [ +#if ENABLE_GCODE_VIEWER_STATISTICS + this +#endif // ENABLE_GCODE_VIEWER_STATISTICS + ](TBuffer& buffer, GLShaderProgram & shader) { + for (auto& range : buffer.model.instances.render_ranges.ranges) { + if (range.vbo == 0 && range.count > 0) { + glsafe(::glGenBuffers(1, &range.vbo)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, range.vbo)); + glsafe(::glBufferData(GL_ARRAY_BUFFER, range.count * buffer.model.instances.instance_size_bytes(), (const void*)&buffer.model.instances.buffer[range.offset * buffer.model.instances.instance_size_floats()], GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + } + + if (range.vbo > 0) { + buffer.model.model.set_color(range.color); + buffer.model.model.render_instanced(range.vbo, range.count); +#if ENABLE_GCODE_VIEWER_STATISTICS + ++m_statistics.gl_instanced_models_calls_count; + m_statistics.total_instances_gpu_size += static_cast(range.count * buffer.model.instances.instance_size_bytes()); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + } + } + }; + +#if ENABLE_GCODE_VIEWER_STATISTICS + auto render_as_batched_model = [this](TBuffer& buffer, GLShaderProgram& shader, int position_id, int normal_id) { +#else + auto render_as_batched_model = [](TBuffer& buffer, GLShaderProgram& shader, int position_id, int normal_id) { +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + struct Range + { + unsigned int first; + unsigned int last; + bool intersects(const Range& other) const { return (other.last < first || other.first > last) ? false : true; } + }; + Range buffer_range = { 0, 0 }; + const size_t indices_per_instance = buffer.model.data.indices_count(); + + for (size_t j = 0; j < buffer.indices.size(); ++j) { + const IBuffer& i_buffer = buffer.indices[j]; + buffer_range.last = buffer_range.first + i_buffer.count / indices_per_instance; +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(i_buffer.vao)); +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, i_buffer.vbo)); + if (position_id != -1) { + glsafe(::glVertexAttribPointer(position_id, buffer.vertices.position_size_floats(), GL_FLOAT, GL_FALSE, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_bytes())); + glsafe(::glEnableVertexAttribArray(position_id)); + } + const bool has_normals = buffer.vertices.normal_size_floats() > 0; + if (has_normals) { + if (normal_id != -1) { + glsafe(::glVertexAttribPointer(normal_id, buffer.vertices.normal_size_floats(), GL_FLOAT, GL_FALSE, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); + glsafe(::glEnableVertexAttribArray(normal_id)); + } + } + + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); + + for (auto& range : buffer.model.instances.render_ranges.ranges) { + const Range range_range = { range.offset, range.offset + range.count }; + if (range_range.intersects(buffer_range)) { + shader.set_uniform("uniform_color", range.color); + const unsigned int offset = (range_range.first > buffer_range.first) ? range_range.first - buffer_range.first : 0; + const size_t offset_bytes = static_cast(offset) * indices_per_instance * sizeof(IBufferType); + const Range render_range = { std::max(range_range.first, buffer_range.first), std::min(range_range.last, buffer_range.last) }; + const size_t count = static_cast(render_range.last - render_range.first) * indices_per_instance; + if (count > 0) { + glsafe(::glDrawElements(GL_TRIANGLES, (GLsizei)count, GL_UNSIGNED_SHORT, (const void*)offset_bytes)); +#if ENABLE_GCODE_VIEWER_STATISTICS + ++m_statistics.gl_batched_models_calls_count; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + } + } + } + + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + + if (normal_id != -1) + glsafe(::glDisableVertexAttribArray(normal_id)); + if (position_id != -1) + glsafe(::glDisableVertexAttribArray(position_id)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(0)); +#endif // ENABLE_GL_CORE_PROFILE + + buffer_range.first = buffer_range.last; + } + }; + + auto line_width = [](double zoom) { + return (zoom < 5.0) ? 1.0 : (1.0 + 5.0 * (zoom - 5.0) / (100.0 - 5.0)); + }; + + const unsigned char begin_id = buffer_id(EMoveType::Retract); + const unsigned char end_id = buffer_id(EMoveType::Count); + + for (unsigned char i = begin_id; i < end_id; ++i) { + TBuffer& buffer = m_buffers[i]; + if (!buffer.visible || !buffer.has_data()) + continue; + + GLShaderProgram* shader = wxGetApp().get_shader(buffer.shader.c_str()); + if (shader == nullptr) + continue; + + shader->start_using(); + + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("view_normal_matrix", (Matrix3d)Matrix3d::Identity()); + + if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::InstancedModel) { + shader->set_uniform("emission_factor", 0.25f); + render_as_instanced_model(buffer, *shader); + shader->set_uniform("emission_factor", 0.0f); + } + else if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::BatchedModel) { + shader->set_uniform("emission_factor", 0.25f); + const int position_id = shader->get_attrib_location("v_position"); + const int normal_id = shader->get_attrib_location("v_normal"); + render_as_batched_model(buffer, *shader, position_id, normal_id); + shader->set_uniform("emission_factor", 0.0f); + } + else { + shader->set_uniform("emission_factor", 0.15f); + const int position_id = shader->get_attrib_location("v_position"); + const int normal_id = shader->get_attrib_location("v_normal"); + const int uniform_color = shader->get_uniform_location("uniform_color"); + + auto it_path = buffer.render_paths.begin(); + for (unsigned int ibuffer_id = 0; ibuffer_id < static_cast(buffer.indices.size()); ++ibuffer_id) { + const IBuffer& i_buffer = buffer.indices[ibuffer_id]; + // Skip all paths with ibuffer_id < ibuffer_id. + for (; it_path != buffer.render_paths.end() && it_path->ibuffer_id < ibuffer_id; ++it_path); + if (it_path == buffer.render_paths.end() || it_path->ibuffer_id > ibuffer_id) + // Not found. This shall not happen. + continue; + +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(i_buffer.vao)); +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, i_buffer.vbo)); + if (position_id != -1) { + glsafe(::glVertexAttribPointer(position_id, buffer.vertices.position_size_floats(), GL_FLOAT, GL_FALSE, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_bytes())); + glsafe(::glEnableVertexAttribArray(position_id)); + } + const bool has_normals = buffer.vertices.normal_size_floats() > 0; + if (has_normals) { + if (normal_id != -1) { + glsafe(::glVertexAttribPointer(normal_id, buffer.vertices.normal_size_floats(), GL_FLOAT, GL_FALSE, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); + glsafe(::glEnableVertexAttribArray(normal_id)); + } + } + + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); + + // Render all elements with it_path->ibuffer_id == ibuffer_id, possible with varying colors. + switch (buffer.render_primitive_type) + { + case TBuffer::ERenderPrimitiveType::Line: { +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_core_profile()) + glsafe(::glLineWidth(static_cast(line_width(camera.get_zoom())))); +#else + glsafe(::glLineWidth(static_cast(line_width(zoom)))); +#endif // ENABLE_GL_CORE_PROFILE + render_as_lines(it_path, buffer.render_paths.end(), *shader, uniform_color); + break; + } + case TBuffer::ERenderPrimitiveType::Triangle: { + render_as_triangles(it_path, buffer.render_paths.end(), *shader, uniform_color); + break; + } + default: { break; } + } + + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + + if (normal_id != -1) + glsafe(::glDisableVertexAttribArray(normal_id)); + if (position_id != -1) + glsafe(::glDisableVertexAttribArray(position_id)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(0)); +#endif // ENABLE_GL_CORE_PROFILE + } + } + + shader->stop_using(); + } + +#if ENABLE_GCODE_VIEWER_STATISTICS + auto render_sequential_range_cap = [this, &camera] +#else + auto render_sequential_range_cap = [&camera] +#endif // ENABLE_GCODE_VIEWER_STATISTICS + (const SequentialRangeCap& cap) { + const TBuffer* buffer = cap.buffer; + GLShaderProgram* shader = wxGetApp().get_shader(buffer->shader.c_str()); + if (shader == nullptr) + return; + + shader->start_using(); + + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("view_normal_matrix", (Matrix3d)Matrix3d::Identity()); + + const int position_id = shader->get_attrib_location("v_position"); + const int normal_id = shader->get_attrib_location("v_normal"); + +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(cap.vao)); +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, cap.vbo)); + if (position_id != -1) { + glsafe(::glVertexAttribPointer(position_id, buffer->vertices.position_size_floats(), GL_FLOAT, GL_FALSE, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.position_offset_bytes())); + glsafe(::glEnableVertexAttribArray(position_id)); + } + const bool has_normals = buffer->vertices.normal_size_floats() > 0; + if (has_normals) { + if (normal_id != -1) { + glsafe(::glVertexAttribPointer(normal_id, buffer->vertices.normal_size_floats(), GL_FLOAT, GL_FALSE, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.normal_offset_bytes())); + glsafe(::glEnableVertexAttribArray(normal_id)); + } + } + + shader->set_uniform("uniform_color", cap.color); + + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cap.ibo)); + glsafe(::glDrawElements(GL_TRIANGLES, (GLsizei)cap.indices_count(), GL_UNSIGNED_SHORT, nullptr)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + +#if ENABLE_GCODE_VIEWER_STATISTICS + ++m_statistics.gl_triangles_calls_count; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + if (normal_id != -1) + glsafe(::glDisableVertexAttribArray(normal_id)); + if (position_id != -1) + glsafe(::glDisableVertexAttribArray(position_id)); + + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(0)); +#endif // ENABLE_GL_CORE_PROFILE + + shader->stop_using(); + }; + + for (unsigned int i = 0; i < 2; ++i) { + if (m_sequential_range_caps[i].is_renderable()) + render_sequential_range_cap(m_sequential_range_caps[i]); + } +} + +void GCodeViewer::render_shells() +{ + if (!m_shells.visible || m_shells.volumes.empty()) + return; + + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); + if (shader == nullptr) + return; + + shader->start_using(); + const Camera& camera = wxGetApp().plater()->get_camera(); + m_shells.volumes.render(GLVolumeCollection::ERenderType::Transparent, true, camera.get_view_matrix(), camera.get_projection_matrix()); + shader->stop_using(); +} + +void GCodeViewer::render_legend(float& legend_height) +{ + if (!m_legend_enabled) + return; + + const Size cnv_size = wxGetApp().plater()->get_current_canvas3D()->get_canvas_size(); + + ImGuiWrapper& imgui = *wxGetApp().imgui(); + + imgui.set_next_window_pos(0.0f, 0.0f, ImGuiCond_Always); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + ImGui::SetNextWindowBgAlpha(0.6f); + const float max_height = 0.75f * static_cast(cnv_size.get_height()); + const float child_height = 0.3333f * max_height; + ImGui::SetNextWindowSizeConstraints({ 0.0f, 0.0f }, { -1.0f, max_height }); + imgui.begin(std::string("Legend"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove); + + enum class EItemType : unsigned char + { + Rect, + Circle, + Hexagon, + Line + }; + + const PrintEstimatedStatistics::Mode& time_mode = m_print_statistics.modes[static_cast(m_time_estimate_mode)]; + bool show_estimated_time = time_mode.time > 0.0f && (m_view_type == EViewType::FeatureType || + m_view_type == EViewType::LayerTimeLinear || m_view_type == EViewType::LayerTimeLogarithmic || + (m_view_type == EViewType::ColorPrint && !time_mode.custom_gcode_times.empty())); + + const float icon_size = ImGui::GetTextLineHeight(); + const float percent_bar_size = 2.0f * ImGui::GetTextLineHeight(); + + bool imperial_units = wxGetApp().app_config->get_bool("use_inches"); + + auto append_item = [icon_size, percent_bar_size, &imgui, imperial_units](EItemType type, const ColorRGBA& color, const std::string& label, + bool visible = true, const std::string& time = "", float percent = 0.0f, float max_percent = 0.0f, const std::array& offsets = { 0.0f, 0.0f, 0.0f, 0.0f }, + double used_filament_m = 0.0, double used_filament_g = 0.0, + std::function callback = nullptr) { + if (!visible) + ImGui::PushStyleVar(ImGuiStyleVar_Alpha, 0.3333f); + + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + ImVec2 pos = ImGui::GetCursorScreenPos(); + switch (type) { + default: + case EItemType::Rect: { + draw_list->AddRectFilled({ pos.x + 1.0f, pos.y + 1.0f }, { pos.x + icon_size - 1.0f, pos.y + icon_size - 1.0f }, + ImGuiWrapper::to_ImU32(color)); + break; + } + case EItemType::Circle: { + ImVec2 center(0.5f * (pos.x + pos.x + icon_size), 0.5f * (pos.y + pos.y + icon_size)); + draw_list->AddCircleFilled(center, 0.5f * icon_size, ImGuiWrapper::to_ImU32(color), 16); + break; + } + case EItemType::Hexagon: { + ImVec2 center(0.5f * (pos.x + pos.x + icon_size), 0.5f * (pos.y + pos.y + icon_size)); + draw_list->AddNgonFilled(center, 0.5f * icon_size, ImGuiWrapper::to_ImU32(color), 6); + break; + } + case EItemType::Line: { + draw_list->AddLine({ pos.x + 1, pos.y + icon_size - 1 }, { pos.x + icon_size - 1, pos.y + 1 }, ImGuiWrapper::to_ImU32(color), 3.0f); + break; + } + } + + // draw text + ImGui::Dummy({ icon_size, icon_size }); + ImGui::SameLine(); + if (callback != nullptr) { + if (ImGui::MenuItem(label.c_str())) + callback(); + else { + // show tooltip + if (ImGui::IsItemHovered()) { + if (!visible) + ImGui::PopStyleVar(); + ImGui::PushStyleColor(ImGuiCol_PopupBg, ImGuiWrapper::COL_WINDOW_BACKGROUND); + ImGui::BeginTooltip(); + imgui.text(visible ? _u8L("Click to hide") : _u8L("Click to show")); + ImGui::EndTooltip(); + ImGui::PopStyleColor(); + if (!visible) + ImGui::PushStyleVar(ImGuiStyleVar_Alpha, 0.3333f); + + // to avoid the tooltip to change size when moving the mouse + imgui.set_requires_extra_frame(); + } + } + + if (!time.empty()) { + ImGui::SameLine(offsets[0]); + imgui.text(time); + ImGui::SameLine(offsets[1]); + pos = ImGui::GetCursorScreenPos(); + const float width = std::max(1.0f, percent_bar_size * percent / max_percent); + draw_list->AddRectFilled({ pos.x, pos.y + 2.0f }, { pos.x + width, pos.y + icon_size - 2.0f }, + ImGui::GetColorU32(ImGuiWrapper::COL_ORANGE_LIGHT)); + ImGui::Dummy({ percent_bar_size, icon_size }); + ImGui::SameLine(); + char buf[64]; + ::sprintf(buf, "%.1f%%", 100.0f * percent); + ImGui::TextUnformatted((percent > 0.0f) ? buf : ""); + ImGui::SameLine(offsets[2]); + ::sprintf(buf, imperial_units ? "%.2f in" : "%.2f m", used_filament_m); + imgui.text(buf); + ImGui::SameLine(offsets[3]); + ::sprintf(buf, "%.2f g", used_filament_g); + imgui.text(buf); + } + } + else { + imgui.text(label); + if (!time.empty()) { + ImGui::SameLine(offsets[0]); + imgui.text(time); + ImGui::SameLine(offsets[1]); + pos = ImGui::GetCursorScreenPos(); + const float width = std::max(1.0f, percent_bar_size * percent / max_percent); + draw_list->AddRectFilled({ pos.x, pos.y + 2.0f }, { pos.x + width, pos.y + icon_size - 2.0f }, + ImGui::GetColorU32(ImGuiWrapper::COL_ORANGE_LIGHT)); + ImGui::Dummy({ percent_bar_size, icon_size }); + ImGui::SameLine(); + char buf[64]; + ::sprintf(buf, "%.1f%%", 100.0f * percent); + ImGui::TextUnformatted((percent > 0.0f) ? buf : ""); + } + else if (used_filament_m > 0.0) { + char buf[64]; + ImGui::SameLine(offsets[0]); + ::sprintf(buf, imperial_units ? "%.2f in" : "%.2f m", used_filament_m); + imgui.text(buf); + ImGui::SameLine(offsets[1]); + ::sprintf(buf, "%.2f g", used_filament_g); + imgui.text(buf); + } + } + + if (!visible) + ImGui::PopStyleVar(); + }; + + auto append_range = [append_item](const Extrusions::Range& range, unsigned int decimals) { + auto append_range_item = [append_item](int i, float value, unsigned int decimals) { + char buf[1024]; + ::sprintf(buf, "%.*f", decimals, value); + append_item(EItemType::Rect, Range_Colors[i], buf); + }; + + if (range.count == 1) + // single item use case + append_range_item(0, range.min, decimals); + else if (range.count == 2) { + // two items use case + append_range_item(static_cast(Range_Colors.size()) - 1, range.max, decimals); + append_range_item(0, range.min, decimals); + } + else { + const float step_size = range.step_size(); + for (int i = static_cast(Range_Colors.size()) - 1; i >= 0; --i) { + append_range_item(i, range.min + static_cast(i) * step_size, decimals); + } + } + }; + + auto append_time_range = [append_item](const Extrusions::Range& range, Extrusions::Range::EType type) { + auto append_range_item = [append_item](int i, float value) { + std::string str_value = get_time_dhms(value); + if (str_value == "0s") + str_value = "< 1s"; + append_item(EItemType::Rect, Range_Colors[i], str_value); + }; + + if (range.count == 1) + // single item use case + append_range_item(0, range.min); + else if (range.count == 2) { + // two items use case + append_range_item(static_cast(Range_Colors.size()) - 1, range.max); + append_range_item(0, range.min); + } + else { + float step_size = range.step_size(type); + for (int i = static_cast(Range_Colors.size()) - 1; i >= 0; --i) { + float value = 0.0f; + switch (type) + { + default: + case Extrusions::Range::EType::Linear: { value = range.min + static_cast(i) * step_size; break; } + case Extrusions::Range::EType::Logarithmic: { value = ::exp(::log(range.min) + static_cast(i) * step_size); break; } + } + append_range_item(i, value); + } + } + }; + + auto append_headers = [&imgui](const std::array& texts, const std::array& offsets) { + size_t i = 0; + for (; i < offsets.size(); i++) { + imgui.text(texts[i]); + ImGui::SameLine(offsets[i]); + } + imgui.text(texts[i]); + ImGui::Separator(); + }; + + auto max_width = [](const std::vector& items, const std::string& title, float extra_size = 0.0f) { + float ret = ImGui::CalcTextSize(title.c_str()).x; + for (const std::string& item : items) { + ret = std::max(ret, extra_size + ImGui::CalcTextSize(item.c_str()).x); + } + return ret; + }; + + auto calculate_offsets = [max_width](const std::vector& labels, const std::vector& times, + const std::array& titles, float extra_size = 0.0f) { + const ImGuiStyle& style = ImGui::GetStyle(); + std::array ret = { 0.0f, 0.0f, 0.0f, 0.0f }; + ret[0] = max_width(labels, titles[0], extra_size) + 3.0f * style.ItemSpacing.x; + for (size_t i = 1; i < titles.size(); i++) + ret[i] = ret[i-1] + max_width(times, titles[i]) + style.ItemSpacing.x; + return ret; + }; + + auto color_print_ranges = [this](unsigned char extruder_id, const std::vector& custom_gcode_per_print_z) { + std::vector>> ret; + ret.reserve(custom_gcode_per_print_z.size()); + + for (const auto& item : custom_gcode_per_print_z) { + if (extruder_id + 1 != static_cast(item.extruder)) + continue; + + if (item.type != ColorChange) + continue; + + const std::vector zs = m_layers.get_zs(); + auto lower_b = std::lower_bound(zs.begin(), zs.end(), item.print_z - Slic3r::DoubleSlider::epsilon()); + if (lower_b == zs.end()) + continue; + + const double current_z = *lower_b; + const double previous_z = (lower_b == zs.begin()) ? 0.0 : *(--lower_b); + + // to avoid duplicate values, check adding values + if (ret.empty() || !(ret.back().second.first == previous_z && ret.back().second.second == current_z)) { + ColorRGBA color; + decode_color(item.color, color); + ret.push_back({ color, { previous_z, current_z } }); + } + } + + return ret; + }; + + auto upto_label = [](double z) { + char buf[64]; + ::sprintf(buf, "%.2f", z); + return _u8L("up to") + " " + std::string(buf) + " " + _u8L("mm"); + }; + + auto above_label = [](double z) { + char buf[64]; + ::sprintf(buf, "%.2f", z); + return _u8L("above") + " " + std::string(buf) + " " + _u8L("mm"); + }; + + auto fromto_label = [](double z1, double z2) { + char buf1[64]; + ::sprintf(buf1, "%.2f", z1); + char buf2[64]; + ::sprintf(buf2, "%.2f", z2); + return _u8L("from") + " " + std::string(buf1) + " " + _u8L("to") + " " + std::string(buf2) + " " + _u8L("mm"); + }; + + auto role_time_and_percent = [time_mode](GCodeExtrusionRole role) { + auto it = std::find_if(time_mode.roles_times.begin(), time_mode.roles_times.end(), [role](const std::pair& item) { return role == item.first; }); + return (it != time_mode.roles_times.end()) ? std::make_pair(it->second, it->second / time_mode.time) : std::make_pair(0.0f, 0.0f); + }; + + auto used_filament_per_role = [this, imperial_units](GCodeExtrusionRole role) { + auto it = m_print_statistics.used_filaments_per_role.find(role); + if (it == m_print_statistics.used_filaments_per_role.end()) + return std::make_pair(0.0, 0.0); + + double koef = imperial_units ? 1000.0 / ObjectManipulation::in_to_mm : 1.0; + return std::make_pair(it->second.first * koef, it->second.second); + }; + + // data used to properly align items in columns when showing time + std::array offsets = { 0.0f, 0.0f, 0.0f, 0.0f }; + std::vector labels; + std::vector times; + std::vector percents; + std::vector used_filaments_m; + std::vector used_filaments_g; + float max_time_percent = 0.0f; + + if (m_view_type == EViewType::FeatureType) { + // calculate offsets to align time/percentage data + for (GCodeExtrusionRole role : m_roles) { + assert(role < GCodeExtrusionRole::Count); + if (role < GCodeExtrusionRole::Count) { + labels.push_back(_u8L(gcode_extrusion_role_to_string(role))); + auto [time, percent] = role_time_and_percent(role); + times.push_back((time > 0.0f) ? short_time(get_time_dhms(time)) : ""); + percents.push_back(percent); + max_time_percent = std::max(max_time_percent, percent); + auto [used_filament_m, used_filament_g] = used_filament_per_role(role); + used_filaments_m.push_back(used_filament_m); + used_filaments_g.push_back(used_filament_g); + } + } + + std::string longest_percentage_string; + for (double item : percents) { + char buffer[64]; + ::sprintf(buffer, "%.2f %%", item); + if (::strlen(buffer) > longest_percentage_string.length()) + longest_percentage_string = buffer; + } + longest_percentage_string += " "; + if (_u8L("Percentage").length() > longest_percentage_string.length()) + longest_percentage_string = _u8L("Percentage"); + + std::string longest_used_filament_string; + for (double item : used_filaments_m) { + char buffer[64]; + ::sprintf(buffer, imperial_units ? "%.2f in" : "%.2f m", item); + if (::strlen(buffer) > longest_used_filament_string.length()) + longest_used_filament_string = buffer; + } + + offsets = calculate_offsets(labels, times, { _u8L("Feature type"), _u8L("Time"), longest_percentage_string, longest_used_filament_string }, icon_size); + } + + // get used filament (meters and grams) from used volume in respect to the active extruder + auto get_used_filament_from_volume = [this, imperial_units](double volume, int extruder_id) { + double koef = imperial_units ? 1.0 / ObjectManipulation::in_to_mm : 0.001; + std::pair ret = { koef * volume / (PI * sqr(0.5 * m_filament_diameters[extruder_id])), + volume * m_filament_densities[extruder_id] * 0.001 }; + return ret; + }; + + if (m_view_type == EViewType::Tool) { + // calculate used filaments data + used_filaments_m = std::vector(m_extruders_count, 0.0); + used_filaments_g = std::vector(m_extruders_count, 0.0); + for (size_t extruder_id : m_extruder_ids) { + if (m_print_statistics.volumes_per_extruder.find(extruder_id) == m_print_statistics.volumes_per_extruder.end()) + continue; + double volume = m_print_statistics.volumes_per_extruder.at(extruder_id); + + auto [used_filament_m, used_filament_g] = get_used_filament_from_volume(volume, extruder_id); + used_filaments_m[extruder_id] = used_filament_m; + used_filaments_g[extruder_id] = used_filament_g; + } + + std::string longest_used_filament_string; + for (double item : used_filaments_m) { + char buffer[64]; + ::sprintf(buffer, imperial_units ? "%.2f in" : "%.2f m", item); + if (::strlen(buffer) > longest_used_filament_string.length()) + longest_used_filament_string = buffer; + } + + offsets = calculate_offsets(labels, times, { "Extruder NNN", longest_used_filament_string }, icon_size); + } + + // selection section + bool view_type_changed = false; + int old_view_type = static_cast(get_view_type()); + int view_type = old_view_type; + + if (!m_legend_resizer.dirty) + ImGui::SetNextItemWidth(-1.0f); + + ImGui::PushStyleColor(ImGuiCol_FrameBg, { 0.1f, 0.1f, 0.1f, 0.8f }); + ImGui::PushStyleColor(ImGuiCol_FrameBgHovered, { 0.2f, 0.2f, 0.2f, 0.8f }); + imgui.combo("", { _u8L("Feature type"), + _u8L("Height (mm)"), + _u8L("Width (mm)"), + _u8L("Speed (mm/s)"), + _u8L("Fan speed (%)"), + _u8L("Temperature (°C)"), + _u8L("Volumetric flow rate (mm³/s)"), + _u8L("Layer time (linear)"), + _u8L("Layer time (logarithmic)"), + _u8L("Tool"), + _u8L("Color Print") }, view_type, ImGuiComboFlags_HeightLargest); + ImGui::PopStyleColor(2); + + if (old_view_type != view_type) { + set_view_type(static_cast(view_type)); + wxGetApp().plater()->set_keep_current_preview_type(true); + wxGetApp().plater()->refresh_print(); + view_type_changed = true; + } + + // extrusion paths section -> title + if (m_view_type == EViewType::FeatureType) + append_headers({ "", _u8L("Time"), _u8L("Percentage"), _u8L("Used filament") }, offsets); + else if (m_view_type == EViewType::Tool) + append_headers({ "", _u8L("Used filament"), "", ""}, offsets); + else + ImGui::Separator(); + + if (!view_type_changed) { + // extrusion paths section -> items + switch (m_view_type) + { + case EViewType::FeatureType: + { + max_time_percent = std::max(max_time_percent, time_mode.travel_time / time_mode.time); + + for (size_t i = 0; i < m_roles.size(); ++i) { + GCodeExtrusionRole role = m_roles[i]; + if (role >= GCodeExtrusionRole::Count) + continue; + const bool visible = is_visible(role); + append_item(EItemType::Rect, Extrusion_Role_Colors[static_cast(role)], labels[i], + visible, times[i], percents[i], max_time_percent, offsets, used_filaments_m[i], used_filaments_g[i], [this, role, visible]() { + m_extrusions.role_visibility_flags = visible ? m_extrusions.role_visibility_flags & ~(1 << int(role)) : m_extrusions.role_visibility_flags | (1 << int(role)); + // update buffers' render paths + refresh_render_paths(false, false); + wxGetApp().plater()->update_preview_moves_slider(); + wxGetApp().plater()->get_current_canvas3D()->set_as_dirty(); + } + ); + } + + if (m_buffers[buffer_id(EMoveType::Travel)].visible) + append_item(EItemType::Line, Travel_Colors[0], _u8L("Travel"), true, short_time(get_time_dhms(time_mode.travel_time)), + time_mode.travel_time / time_mode.time, max_time_percent, offsets, 0.0f, 0.0f); + + break; + } + case EViewType::Height: { append_range(m_extrusions.ranges.height, 3); break; } + case EViewType::Width: { append_range(m_extrusions.ranges.width, 3); break; } + case EViewType::Feedrate: { append_range(m_extrusions.ranges.feedrate, 1); break; } + case EViewType::FanSpeed: { append_range(m_extrusions.ranges.fan_speed, 0); break; } + case EViewType::Temperature: { append_range(m_extrusions.ranges.temperature, 0); break; } + case EViewType::VolumetricRate: { append_range(m_extrusions.ranges.volumetric_rate, 3); break; } + case EViewType::LayerTimeLinear: { append_time_range(m_extrusions.ranges.layer_time[static_cast(m_time_estimate_mode)], Extrusions::Range::EType::Linear); break; } + case EViewType::LayerTimeLogarithmic: { append_time_range(m_extrusions.ranges.layer_time[static_cast(m_time_estimate_mode)], Extrusions::Range::EType::Logarithmic); break; } + case EViewType::Tool: { + // shows only extruders actually used + for (unsigned char extruder_id : m_extruder_ids) { + if (used_filaments_m[extruder_id] > 0.0 && used_filaments_g[extruder_id] > 0.0) + append_item(EItemType::Rect, m_tool_colors[extruder_id], _u8L("Extruder") + " " + std::to_string(extruder_id + 1), + true, "", 0.0f, 0.0f, offsets, used_filaments_m[extruder_id], used_filaments_g[extruder_id]); + } + break; + } + case EViewType::ColorPrint: + { + const std::vector& custom_gcode_per_print_z = wxGetApp().is_editor() ? wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes : m_custom_gcode_per_print_z; + size_t total_items = 1; + for (unsigned char i : m_extruder_ids) { + total_items += color_print_ranges(i, custom_gcode_per_print_z).size(); + } + + const bool need_scrollable = static_cast(total_items) * icon_size + (static_cast(total_items) - 1.0f) * ImGui::GetStyle().ItemSpacing.y > child_height; + + // add scrollable region, if needed + if (need_scrollable) + ImGui::BeginChild("color_prints", { -1.0f, child_height }, false); + if (m_extruders_count == 1) { // single extruder use case + const std::vector>> cp_values = color_print_ranges(0, custom_gcode_per_print_z); + const int items_cnt = static_cast(cp_values.size()); + if (items_cnt == 0) // There are no color changes, but there are some pause print or custom Gcode + append_item(EItemType::Rect, m_tool_colors.front(), _u8L("Default color")); + else { + for (int i = items_cnt; i >= 0; --i) { + // create label for color change item + if (i == 0) { + append_item(EItemType::Rect, m_tool_colors[0], upto_label(cp_values.front().second.first)); + break; + } + else if (i == items_cnt) { + append_item(EItemType::Rect, cp_values[i - 1].first, above_label(cp_values[i - 1].second.second)); + continue; + } + append_item(EItemType::Rect, cp_values[i - 1].first, fromto_label(cp_values[i - 1].second.second, cp_values[i].second.first)); + } + } + } + else { // multi extruder use case + // shows only extruders actually used + for (unsigned char i : m_extruder_ids) { + const std::vector>> cp_values = color_print_ranges(i, custom_gcode_per_print_z); + const int items_cnt = static_cast(cp_values.size()); + if (items_cnt == 0) + // There are no color changes, but there are some pause print or custom Gcode + append_item(EItemType::Rect, m_tool_colors[i], _u8L("Extruder") + " " + std::to_string(i + 1) + " " + _u8L("default color")); + else { + for (int j = items_cnt; j >= 0; --j) { + // create label for color change item + std::string label = _u8L("Extruder") + " " + std::to_string(i + 1); + if (j == 0) { + label += " " + upto_label(cp_values.front().second.first); + append_item(EItemType::Rect, m_tool_colors[i], label); + break; + } + else if (j == items_cnt) { + label += " " + above_label(cp_values[j - 1].second.second); + append_item(EItemType::Rect, cp_values[j - 1].first, label); + continue; + } + + label += " " + fromto_label(cp_values[j - 1].second.second, cp_values[j].second.first); + append_item(EItemType::Rect, cp_values[j - 1].first, label); + } + } + } + } + if (need_scrollable) + ImGui::EndChild(); + + break; + } + default: { break; } + } + } + + // partial estimated printing time section + if (m_view_type == EViewType::ColorPrint) { + using Times = std::pair; + using TimesList = std::vector>; + + // helper structure containig the data needed to render the time items + struct PartialTime + { + enum class EType : unsigned char + { + Print, + ColorChange, + Pause + }; + EType type; + int extruder_id; + ColorRGBA color1; + ColorRGBA color2; + Times times; + std::pair used_filament{ 0.0f, 0.0f }; + }; + using PartialTimes = std::vector; + + auto generate_partial_times = [this, get_used_filament_from_volume](const TimesList& times, const std::vector& used_filaments) { + PartialTimes items; + + std::vector custom_gcode_per_print_z = wxGetApp().is_editor() ? wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes : m_custom_gcode_per_print_z; + std::vector last_color(m_extruders_count); + for (size_t i = 0; i < m_extruders_count; ++i) { + last_color[i] = m_tool_colors[i]; + } + int last_extruder_id = 1; + int color_change_idx = 0; + for (const auto& time_rec : times) { + switch (time_rec.first) + { + case CustomGCode::PausePrint: { + auto it = std::find_if(custom_gcode_per_print_z.begin(), custom_gcode_per_print_z.end(), [time_rec](const CustomGCode::Item& item) { return item.type == time_rec.first; }); + if (it != custom_gcode_per_print_z.end()) { + items.push_back({ PartialTime::EType::Print, it->extruder, last_color[it->extruder - 1], ColorRGBA::BLACK(), time_rec.second }); + items.push_back({ PartialTime::EType::Pause, it->extruder, ColorRGBA::BLACK(), ColorRGBA::BLACK(), time_rec.second }); + custom_gcode_per_print_z.erase(it); + } + break; + } + case CustomGCode::ColorChange: { + auto it = std::find_if(custom_gcode_per_print_z.begin(), custom_gcode_per_print_z.end(), [time_rec](const CustomGCode::Item& item) { return item.type == time_rec.first; }); + if (it != custom_gcode_per_print_z.end()) { + items.push_back({ PartialTime::EType::Print, it->extruder, last_color[it->extruder - 1], ColorRGBA::BLACK(), time_rec.second, get_used_filament_from_volume(used_filaments[color_change_idx++], it->extruder - 1) }); + ColorRGBA color; + decode_color(it->color, color); + items.push_back({ PartialTime::EType::ColorChange, it->extruder, last_color[it->extruder - 1], color, time_rec.second }); + last_color[it->extruder - 1] = color; + last_extruder_id = it->extruder; + custom_gcode_per_print_z.erase(it); + } + else + items.push_back({ PartialTime::EType::Print, last_extruder_id, last_color[last_extruder_id - 1], ColorRGBA::BLACK(), time_rec.second, get_used_filament_from_volume(used_filaments[color_change_idx++], last_extruder_id - 1) }); + + break; + } + default: { break; } + } + } + + return items; + }; + + auto append_color_change = [&imgui](const ColorRGBA& color1, const ColorRGBA& color2, const std::array& offsets, const Times& times) { + imgui.text(_u8L("Color change")); + ImGui::SameLine(); + + float icon_size = ImGui::GetTextLineHeight(); + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + ImVec2 pos = ImGui::GetCursorScreenPos(); + pos.x -= 0.5f * ImGui::GetStyle().ItemSpacing.x; + + draw_list->AddRectFilled({ pos.x + 1.0f, pos.y + 1.0f }, { pos.x + icon_size - 1.0f, pos.y + icon_size - 1.0f }, + ImGuiWrapper::to_ImU32(color1)); + pos.x += icon_size; + draw_list->AddRectFilled({ pos.x + 1.0f, pos.y + 1.0f }, { pos.x + icon_size - 1.0f, pos.y + icon_size - 1.0f }, + ImGuiWrapper::to_ImU32(color2)); + + ImGui::SameLine(offsets[0]); + imgui.text(short_time(get_time_dhms(times.second - times.first))); + }; + + auto append_print = [&imgui, imperial_units](const ColorRGBA& color, const std::array& offsets, const Times& times, std::pair used_filament) { + imgui.text(_u8L("Print")); + ImGui::SameLine(); + + float icon_size = ImGui::GetTextLineHeight(); + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + ImVec2 pos = ImGui::GetCursorScreenPos(); + pos.x -= 0.5f * ImGui::GetStyle().ItemSpacing.x; + + draw_list->AddRectFilled({ pos.x + 1.0f, pos.y + 1.0f }, { pos.x + icon_size - 1.0f, pos.y + icon_size - 1.0f }, + ImGuiWrapper::to_ImU32(color)); + + ImGui::SameLine(offsets[0]); + imgui.text(short_time(get_time_dhms(times.second))); + ImGui::SameLine(offsets[1]); + imgui.text(short_time(get_time_dhms(times.first))); + if (used_filament.first > 0.0f) { + char buffer[64]; + ImGui::SameLine(offsets[2]); + ::sprintf(buffer, imperial_units ? "%.2f in" : "%.2f m", used_filament.first); + imgui.text(buffer); + + ImGui::SameLine(offsets[3]); + ::sprintf(buffer, "%.2f g", used_filament.second); + imgui.text(buffer); + } + }; + + PartialTimes partial_times = generate_partial_times(time_mode.custom_gcode_times, m_print_statistics.volumes_per_color_change); + if (!partial_times.empty()) { + labels.clear(); + times.clear(); + + for (const PartialTime& item : partial_times) { + switch (item.type) + { + case PartialTime::EType::Print: { labels.push_back(_u8L("Print")); break; } + case PartialTime::EType::Pause: { labels.push_back(_u8L("Pause")); break; } + case PartialTime::EType::ColorChange: { labels.push_back(_u8L("Color change")); break; } + } + times.push_back(short_time(get_time_dhms(item.times.second))); + } + + + std::string longest_used_filament_string; + for (const PartialTime& item : partial_times) { + if (item.used_filament.first > 0.0f) { + char buffer[64]; + ::sprintf(buffer, imperial_units ? "%.2f in" : "%.2f m", item.used_filament.first); + if (::strlen(buffer) > longest_used_filament_string.length()) + longest_used_filament_string = buffer; + } + } + + offsets = calculate_offsets(labels, times, { _u8L("Event"), _u8L("Remaining time"), _u8L("Duration"), longest_used_filament_string }, 2.0f * icon_size); + + ImGui::Spacing(); + append_headers({ _u8L("Event"), _u8L("Remaining time"), _u8L("Duration"), _u8L("Used filament") }, offsets); + const bool need_scrollable = static_cast(partial_times.size()) * icon_size + (static_cast(partial_times.size()) - 1.0f) * ImGui::GetStyle().ItemSpacing.y > child_height; + if (need_scrollable) + // add scrollable region + ImGui::BeginChild("events", { -1.0f, child_height }, false); + + for (const PartialTime& item : partial_times) { + switch (item.type) + { + case PartialTime::EType::Print: { + append_print(item.color1, offsets, item.times, item.used_filament); + break; + } + case PartialTime::EType::Pause: { + imgui.text(_u8L("Pause")); + ImGui::SameLine(offsets[0]); + imgui.text(short_time(get_time_dhms(item.times.second - item.times.first))); + break; + } + case PartialTime::EType::ColorChange: { + append_color_change(item.color1, item.color2, offsets, item.times); + break; + } + } + } + + if (need_scrollable) + ImGui::EndChild(); + } + } + + auto add_strings_row_to_table = [&imgui](const std::string& col_1, const ImVec4& col_1_color, const std::string& col_2, const ImVec4& col_2_color) { + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + imgui.text_colored(col_1_color, col_1.c_str()); + ImGui::TableSetColumnIndex(1); + imgui.text_colored(col_2_color, col_2.c_str()); + }; + + // settings section + bool has_settings = false; + has_settings |= !m_settings_ids.print.empty(); + has_settings |= !m_settings_ids.printer.empty(); + bool has_filament_settings = true; + has_filament_settings &= !m_settings_ids.filament.empty(); + for (const std::string& fs : m_settings_ids.filament) { + has_filament_settings &= !fs.empty(); + } + has_settings |= has_filament_settings; + bool show_settings = wxGetApp().is_gcode_viewer(); + show_settings &= (m_view_type == EViewType::FeatureType || m_view_type == EViewType::Tool); + show_settings &= has_settings; + if (show_settings) { + ImGui::Spacing(); + imgui.title(_u8L("Settings")); + + auto trim_text_if_needed = [](const std::string& txt) { + const float max_length = 250.0f; + const float length = ImGui::CalcTextSize(txt.c_str()).x; + if (length > max_length) { + const size_t new_len = txt.length() * max_length / length; + return txt.substr(0, new_len) + "..."; + } + return txt; + }; + + if (ImGui::BeginTable("Settings", 2)) { + if (!m_settings_ids.printer.empty()) + add_strings_row_to_table(_u8L("Printer") + ":", ImGuiWrapper::COL_ORANGE_LIGHT, + trim_text_if_needed(m_settings_ids.printer), ImGuiWrapper::to_ImVec4(ColorRGBA::WHITE())); + if (!m_settings_ids.print.empty()) + add_strings_row_to_table(_u8L("Print settings") + ":", ImGuiWrapper::COL_ORANGE_LIGHT, + trim_text_if_needed(m_settings_ids.print), ImGuiWrapper::to_ImVec4(ColorRGBA::WHITE())); + if (!m_settings_ids.filament.empty()) { + for (unsigned char i : m_extruder_ids) { + if (i < static_cast(m_settings_ids.filament.size()) && !m_settings_ids.filament[i].empty()) { + std::string txt = _u8L("Filament"); + txt += (m_extruder_ids.size() == 1) ? ":" : " " + std::to_string(i + 1); + add_strings_row_to_table(txt, ImGuiWrapper::COL_ORANGE_LIGHT, + trim_text_if_needed(m_settings_ids.filament[i]), ImGuiWrapper::to_ImVec4(ColorRGBA::WHITE())); + } + } + } + ImGui::EndTable(); + } + } + + // total estimated printing time section + if (show_estimated_time) { + ImGui::Spacing(); + std::string time_title = _u8L("Estimated printing times"); + auto can_show_mode_button = [this](PrintEstimatedStatistics::ETimeMode mode) { + bool show = false; + if (m_print_statistics.modes.size() > 1 && m_print_statistics.modes[static_cast(mode)].roles_times.size() > 0) { + for (size_t i = 0; i < m_print_statistics.modes.size(); ++i) { + if (i != static_cast(mode) && + m_print_statistics.modes[i].time > 0.0f && + short_time(get_time_dhms(m_print_statistics.modes[static_cast(mode)].time)) != short_time(get_time_dhms(m_print_statistics.modes[i].time))) { + show = true; + break; + } + } + } + return show; + }; + + if (can_show_mode_button(m_time_estimate_mode)) { + switch (m_time_estimate_mode) + { + case PrintEstimatedStatistics::ETimeMode::Normal: { time_title += " [" + _u8L("Normal mode") + "]"; break; } + case PrintEstimatedStatistics::ETimeMode::Stealth: { time_title += " [" + _u8L("Stealth mode") + "]"; break; } + default: { assert(false); break; } + } + } + + imgui.title(time_title + ":"); + + if (ImGui::BeginTable("Times", 2)) { + if (!time_mode.layers_times.empty()) { + add_strings_row_to_table(_u8L("First layer") + ":", ImGuiWrapper::COL_ORANGE_LIGHT, + short_time(get_time_dhms(time_mode.layers_times.front())), ImGuiWrapper::to_ImVec4(ColorRGBA::WHITE())); + } + + add_strings_row_to_table(_u8L("Total") + ":", ImGuiWrapper::COL_ORANGE_LIGHT, + short_time(get_time_dhms(time_mode.time)), ImGuiWrapper::to_ImVec4(ColorRGBA::WHITE())); + + ImGui::EndTable(); + } + + auto show_mode_button = [this, &imgui, can_show_mode_button](const wxString& label, PrintEstimatedStatistics::ETimeMode mode) { + if (can_show_mode_button(mode)) { + if (imgui.button(label)) { + m_time_estimate_mode = mode; + if (m_view_type == EViewType::LayerTimeLinear || m_view_type == EViewType::LayerTimeLogarithmic) + refresh_render_paths(false, false); + imgui.set_requires_extra_frame(); + } + } + }; + + switch (m_time_estimate_mode) { + case PrintEstimatedStatistics::ETimeMode::Normal: { + show_mode_button(_L("Show stealth mode"), PrintEstimatedStatistics::ETimeMode::Stealth); + break; + } + case PrintEstimatedStatistics::ETimeMode::Stealth: { + show_mode_button(_L("Show normal mode"), PrintEstimatedStatistics::ETimeMode::Normal); + break; + } + default : { assert(false); break; } + } + } + + // toolbar section + auto toggle_button = [this, &imgui, icon_size](Preview::OptionType type, const std::string& name, + std::function draw_callback) { + auto is_flag_set = [](unsigned int flags, unsigned int flag) { + return (flags & (1 << flag)) != 0; + }; + + auto set_flag = [](unsigned int flags, unsigned int flag, bool active) { + return active ? (flags | (1 << flag)) : (flags & ~(1 << flag)); + }; + + unsigned int flags = get_options_visibility_flags(); + unsigned int flag = static_cast(type); + bool active = is_flag_set(flags, flag); + + if (imgui.draw_radio_button(name, 1.5f * icon_size, active, draw_callback)) { + unsigned int new_flags = set_flag(flags, flag, !active); + set_options_visibility_from_flags(new_flags); + + const unsigned int diff_flags = flags ^ new_flags; + if (m_view_type == GCodeViewer::EViewType::Feedrate && is_flag_set(diff_flags, static_cast(Preview::OptionType::Travel))) + wxGetApp().plater()->refresh_print(); + else { + bool keep_first = m_sequential_view.current.first != m_sequential_view.global.first; + bool keep_last = m_sequential_view.current.last != m_sequential_view.global.last; + wxGetApp().plater()->get_current_canvas3D()->refresh_gcode_preview_render_paths(keep_first, keep_last); + } + wxGetApp().plater()->update_preview_moves_slider(); + } + + if (ImGui::IsItemHovered()) { + ImGui::PushStyleColor(ImGuiCol_PopupBg, ImGuiWrapper::COL_WINDOW_BACKGROUND); + ImGui::BeginTooltip(); + imgui.text(name); + ImGui::EndTooltip(); + ImGui::PopStyleColor(); + } + }; + + auto image_icon = [&imgui](ImGuiWindow& window, const ImVec2& pos, float size, const wchar_t& icon_id) { + ImGuiIO& io = ImGui::GetIO(); + const ImTextureID tex_id = io.Fonts->TexID; + const float tex_w = static_cast(io.Fonts->TexWidth); + const float tex_h = static_cast(io.Fonts->TexHeight); + const ImFontAtlas::CustomRect* const rect = imgui.GetTextureCustomRect(icon_id); + const ImVec2 uv0 = { static_cast(rect->X) / tex_w, static_cast(rect->Y) / tex_h }; + const ImVec2 uv1 = { static_cast(rect->X + rect->Width) / tex_w, static_cast(rect->Y + rect->Height) / tex_h }; + window.DrawList->AddImage(tex_id, pos, { pos.x + size, pos.y + size }, uv0, uv1, ImGuiWrapper::to_ImU32({ 1.0f, 1.0f, 1.0f, 1.0f })); + }; + + ImGui::Spacing(); + ImGui::Separator(); + ImGui::Spacing(); + ImGui::Spacing(); + toggle_button(Preview::OptionType::Travel, _u8L("Travel"), [image_icon](ImGuiWindow& window, const ImVec2& pos, float size) { + image_icon(window, pos, size, ImGui::LegendTravel); + }); + ImGui::SameLine(); + toggle_button(Preview::OptionType::Wipe, _u8L("Wipe"), [image_icon](ImGuiWindow& window, const ImVec2& pos, float size) { + image_icon(window, pos, size, ImGui::LegendWipe); + }); + ImGui::SameLine(); + toggle_button(Preview::OptionType::Retractions, _u8L("Retractions"), [image_icon](ImGuiWindow& window, const ImVec2& pos, float size) { + image_icon(window, pos, size, ImGui::LegendRetract); + }); + ImGui::SameLine(); + toggle_button(Preview::OptionType::Unretractions, _u8L("Deretractions"), [image_icon](ImGuiWindow& window, const ImVec2& pos, float size) { + image_icon(window, pos, size, ImGui::LegendDeretract); + }); + ImGui::SameLine(); + toggle_button(Preview::OptionType::Seams, _u8L("Seams"), [image_icon](ImGuiWindow& window, const ImVec2& pos, float size) { + image_icon(window, pos, size, ImGui::LegendSeams); + }); + ImGui::SameLine(); + toggle_button(Preview::OptionType::ToolChanges, _u8L("Tool changes"), [image_icon](ImGuiWindow& window, const ImVec2& pos, float size) { + image_icon(window, pos, size, ImGui::LegendToolChanges); + }); + ImGui::SameLine(); + toggle_button(Preview::OptionType::ColorChanges, _u8L("Color changes"), [image_icon](ImGuiWindow& window, const ImVec2& pos, float size) { + image_icon(window, pos, size, ImGui::LegendColorChanges); + }); + ImGui::SameLine(); + toggle_button(Preview::OptionType::PausePrints, _u8L("Print pauses"), [image_icon](ImGuiWindow& window, const ImVec2& pos, float size) { + image_icon(window, pos, size, ImGui::LegendPausePrints); + }); + ImGui::SameLine(); + toggle_button(Preview::OptionType::CustomGCodes, _u8L("Custom G-codes"), [image_icon](ImGuiWindow& window, const ImVec2& pos, float size) { + image_icon(window, pos, size, ImGui::LegendCustomGCodes); + }); + ImGui::SameLine(); + toggle_button(Preview::OptionType::CenterOfGravity, _u8L("Center of gravity"), [image_icon](ImGuiWindow& window, const ImVec2& pos, float size) { + image_icon(window, pos, size, ImGui::LegendCOG); + }); + ImGui::SameLine(); + if (!wxGetApp().is_gcode_viewer()) { + toggle_button(Preview::OptionType::Shells, _u8L("Shells"), [image_icon](ImGuiWindow& window, const ImVec2& pos, float size) { + image_icon(window, pos, size, ImGui::LegendShells); + }); + ImGui::SameLine(); + } + toggle_button(Preview::OptionType::ToolMarker, _u8L("Tool marker"), [image_icon](ImGuiWindow& window, const ImVec2& pos, float size) { + image_icon(window, pos, size, ImGui::LegendToolMarker); + }); + + bool size_dirty = !ImGui::GetCurrentWindow()->ScrollbarY && ImGui::CalcWindowNextAutoFitSize(ImGui::GetCurrentWindow()).x != ImGui::GetWindowWidth(); + if (m_legend_resizer.dirty || size_dirty != m_legend_resizer.dirty) { + wxGetApp().plater()->get_current_canvas3D()->set_as_dirty(); + wxGetApp().plater()->get_current_canvas3D()->request_extra_frame(); + } + m_legend_resizer.dirty = size_dirty; + + legend_height = ImGui::GetWindowHeight(); + + imgui.end(); + ImGui::PopStyleVar(); +} + +#if ENABLE_GCODE_VIEWER_STATISTICS +void GCodeViewer::render_statistics() +{ + static const float offset = 275.0f; + + ImGuiWrapper& imgui = *wxGetApp().imgui(); + + auto add_time = [&imgui](const std::string& label, int64_t time) { + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, label); + ImGui::SameLine(offset); + imgui.text(std::to_string(time) + " ms (" + get_time_dhms(static_cast(time) * 0.001f) + ")"); + }; + + auto add_memory = [&imgui](const std::string& label, int64_t memory) { + auto format_string = [memory](const std::string& units, float value) { + return std::to_string(memory) + " bytes (" + + Slic3r::float_to_string_decimal_point(float(memory) * value, 3) + + " " + units + ")"; + }; + + static const float kb = 1024.0f; + static const float inv_kb = 1.0f / kb; + static const float mb = 1024.0f * kb; + static const float inv_mb = 1.0f / mb; + static const float gb = 1024.0f * mb; + static const float inv_gb = 1.0f / gb; + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, label); + ImGui::SameLine(offset); + if (static_cast(memory) < mb) + imgui.text(format_string("KB", inv_kb)); + else if (static_cast(memory) < gb) + imgui.text(format_string("MB", inv_mb)); + else + imgui.text(format_string("GB", inv_gb)); + }; + + auto add_counter = [&imgui](const std::string& label, int64_t counter) { + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, label); + ImGui::SameLine(offset); + imgui.text(std::to_string(counter)); + }; + + imgui.set_next_window_pos(0.5f * wxGetApp().plater()->get_current_canvas3D()->get_canvas_size().get_width(), 0.0f, ImGuiCond_Once, 0.5f, 0.0f); + ImGui::SetNextWindowSizeConstraints({ 300.0f, 100.0f }, { 600.0f, 900.0f }); + imgui.begin(std::string("GCodeViewer Statistics"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize); + ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow()); + + if (ImGui::CollapsingHeader("Time")) { + add_time(std::string("GCodeProcessor:"), m_statistics.results_time); + + ImGui::Separator(); + add_time(std::string("Load:"), m_statistics.load_time); + add_time(std::string(" Load vertices:"), m_statistics.load_vertices); + add_time(std::string(" Smooth vertices:"), m_statistics.smooth_vertices); + add_time(std::string(" Load indices:"), m_statistics.load_indices); + add_time(std::string("Refresh:"), m_statistics.refresh_time); + add_time(std::string("Refresh paths:"), m_statistics.refresh_paths_time); + } + + if (ImGui::CollapsingHeader("OpenGL calls")) { + add_counter(std::string("Multi GL_LINES:"), m_statistics.gl_multi_lines_calls_count); + add_counter(std::string("Multi GL_TRIANGLES:"), m_statistics.gl_multi_triangles_calls_count); + add_counter(std::string("GL_TRIANGLES:"), m_statistics.gl_triangles_calls_count); + ImGui::Separator(); + add_counter(std::string("Instanced models:"), m_statistics.gl_instanced_models_calls_count); + add_counter(std::string("Batched models:"), m_statistics.gl_batched_models_calls_count); + } + + if (ImGui::CollapsingHeader("CPU memory")) { + add_memory(std::string("GCodeProcessor results:"), m_statistics.results_size); + + ImGui::Separator(); + add_memory(std::string("Paths:"), m_statistics.paths_size); + add_memory(std::string("Render paths:"), m_statistics.render_paths_size); + add_memory(std::string("Models instances:"), m_statistics.models_instances_size); + } + + if (ImGui::CollapsingHeader("GPU memory")) { + add_memory(std::string("Vertices:"), m_statistics.total_vertices_gpu_size); + add_memory(std::string("Indices:"), m_statistics.total_indices_gpu_size); + add_memory(std::string("Instances:"), m_statistics.total_instances_gpu_size); + ImGui::Separator(); + add_memory(std::string("Max VBuffer:"), m_statistics.max_vbuffer_gpu_size); + add_memory(std::string("Max IBuffer:"), m_statistics.max_ibuffer_gpu_size); + } + + if (ImGui::CollapsingHeader("Other")) { + add_counter(std::string("Travel segments count:"), m_statistics.travel_segments_count); + add_counter(std::string("Wipe segments count:"), m_statistics.wipe_segments_count); + add_counter(std::string("Extrude segments count:"), m_statistics.extrude_segments_count); + add_counter(std::string("Instances count:"), m_statistics.instances_count); + add_counter(std::string("Batched count:"), m_statistics.batched_count); + ImGui::Separator(); + add_counter(std::string("VBuffers count:"), m_statistics.vbuffers_count); + add_counter(std::string("IBuffers count:"), m_statistics.ibuffers_count); + } + + imgui.end(); +} +#endif // ENABLE_GCODE_VIEWER_STATISTICS + +void GCodeViewer::log_memory_used(const std::string& label, int64_t additional) const +{ + if (Slic3r::get_logging_level() >= 5) { + int64_t paths_size = 0; + int64_t render_paths_size = 0; + for (const TBuffer& buffer : m_buffers) { + paths_size += SLIC3R_STDVEC_MEMSIZE(buffer.paths, Path); + render_paths_size += SLIC3R_STDUNORDEREDSET_MEMSIZE(buffer.render_paths, RenderPath); + for (const RenderPath& path : buffer.render_paths) { + render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.sizes, unsigned int); + render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.offsets, size_t); + } + } + int64_t layers_size = SLIC3R_STDVEC_MEMSIZE(m_layers.get_zs(), double); + layers_size += SLIC3R_STDVEC_MEMSIZE(m_layers.get_ranges(), Layers::Range); + BOOST_LOG_TRIVIAL(trace) << label + << "(" << format_memsize_MB(additional + paths_size + render_paths_size + layers_size) << ");" + << log_memory_info(); + } +} + +ColorRGBA GCodeViewer::option_color(EMoveType move_type) const +{ + switch (move_type) + { + case EMoveType::Tool_change: { return Options_Colors[static_cast(EOptionsColors::ToolChanges)]; } + case EMoveType::Color_change: { return Options_Colors[static_cast(EOptionsColors::ColorChanges)]; } + case EMoveType::Pause_Print: { return Options_Colors[static_cast(EOptionsColors::PausePrints)]; } + case EMoveType::Custom_GCode: { return Options_Colors[static_cast(EOptionsColors::CustomGCodes)]; } + case EMoveType::Retract: { return Options_Colors[static_cast(EOptionsColors::Retractions)]; } + case EMoveType::Unretract: { return Options_Colors[static_cast(EOptionsColors::Unretractions)]; } + case EMoveType::Seam: { return Options_Colors[static_cast(EOptionsColors::Seams)]; } + default: { return { 0.0f, 0.0f, 0.0f, 1.0f }; } + } +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index a67208f10be..3eb61cfc44a 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -1,800 +1,864 @@ -#ifndef slic3r_GCodeViewer_hpp_ -#define slic3r_GCodeViewer_hpp_ - -#include "3DScene.hpp" -#include "libslic3r/GCode/GCodeProcessor.hpp" -#include "GLModel.hpp" - -#include - -#include -#include -#include -#include - -namespace Slic3r { - -class Print; -class TriangleMesh; - -namespace GUI { - -class GCodeViewer -{ - using IBufferType = unsigned short; - using Color = std::array; - using VertexBuffer = std::vector; - using MultiVertexBuffer = std::vector; - using IndexBuffer = std::vector; - using MultiIndexBuffer = std::vector; - using InstanceBuffer = std::vector; - using InstanceIdBuffer = std::vector; - using InstancesOffsets = std::vector; - - static const std::vector Extrusion_Role_Colors; - static const std::vector Options_Colors; - static const std::vector Travel_Colors; - static const std::vector Range_Colors; - static const Color Wipe_Color; - static const Color Neutral_Color; - - enum class EOptionsColors : unsigned char - { - Retractions, - Unretractions, - Seams, - ToolChanges, - ColorChanges, - PausePrints, - CustomGCodes - }; - - // vbo buffer containing vertices data used to render a specific toolpath type - struct VBuffer - { - enum class EFormat : unsigned char - { - // vertex format: 3 floats -> position.x|position.y|position.z - Position, - // vertex format: 4 floats -> position.x|position.y|position.z|normal.x - PositionNormal1, - // vertex format: 6 floats -> position.x|position.y|position.z|normal.x|normal.y|normal.z - PositionNormal3 - }; - - EFormat format{ EFormat::Position }; - // vbos id - std::vector vbos; - // sizes of the buffers, in bytes, used in export to obj - std::vector sizes; - // count of vertices, updated after data are sent to gpu - size_t count{ 0 }; - - size_t data_size_bytes() const { return count * vertex_size_bytes(); } - // We set 65536 as max count of vertices inside a vertex buffer to allow - // to use unsigned short in place of unsigned int for indices in the index buffer, to save memory - size_t max_size_bytes() const { return 65536 * vertex_size_bytes(); } - - size_t vertex_size_floats() const { return position_size_floats() + normal_size_floats(); } - size_t vertex_size_bytes() const { return vertex_size_floats() * sizeof(float); } - - size_t position_offset_floats() const { return 0; } - size_t position_offset_bytes() const { return position_offset_floats() * sizeof(float); } - - size_t position_size_floats() const { return 3; } - size_t position_size_bytes() const { return position_size_floats() * sizeof(float); } - - size_t normal_offset_floats() const { - assert(format == EFormat::PositionNormal1 || format == EFormat::PositionNormal3); - return position_size_floats(); - } - size_t normal_offset_bytes() const { return normal_offset_floats() * sizeof(float); } - - size_t normal_size_floats() const { - switch (format) - { - case EFormat::PositionNormal1: { return 1; } - case EFormat::PositionNormal3: { return 3; } - default: { return 0; } - } - } - size_t normal_size_bytes() const { return normal_size_floats() * sizeof(float); } - - void reset(); - }; - - // buffer containing instances data used to render a toolpaths using instanced or batched models - // instance record format: - // instanced models: 5 floats -> position.x|position.y|position.z|width|height (which are sent to the shader as -> vec3 (offset) + vec2 (scales) in GLModel::render_instanced()) - // batched models: 3 floats -> position.x|position.y|position.z - struct InstanceVBuffer - { - // ranges used to render only subparts of the intances - struct Ranges - { - struct Range - { - // offset in bytes of the 1st instance to render - unsigned int offset; - // count of instances to render - unsigned int count; - // vbo id - unsigned int vbo{ 0 }; - // Color to apply to the instances - Color color; - }; - - std::vector ranges; - - void reset(); - }; - - enum class EFormat : unsigned char - { - InstancedModel, - BatchedModel - }; - - EFormat format; - - // cpu-side buffer containing all instances data - InstanceBuffer buffer; - // indices of the moves for all instances - std::vector s_ids; - // position offsets, used to show the correct value of the tool position - InstancesOffsets offsets; - Ranges render_ranges; - - size_t data_size_bytes() const { return s_ids.size() * instance_size_bytes(); } - - size_t instance_size_floats() const { - switch (format) - { - case EFormat::InstancedModel: { return 5; } - case EFormat::BatchedModel: { return 3; } - default: { return 0; } - } - } - size_t instance_size_bytes() const { return instance_size_floats() * sizeof(float); } - - void reset(); - }; - - // ibo buffer containing indices data (for lines/triangles) used to render a specific toolpath type - struct IBuffer - { - // id of the associated vertex buffer - unsigned int vbo{ 0 }; - // ibo id - unsigned int ibo{ 0 }; - // count of indices, updated after data are sent to gpu - size_t count{ 0 }; - - void reset(); - }; - - // Used to identify different toolpath sub-types inside a IBuffer - struct Path - { - struct Endpoint - { - // index of the buffer in the multibuffer vector - // the buffer type may change: - // it is the vertex buffer while extracting vertices data, - // the index buffer while extracting indices data - unsigned int b_id{ 0 }; - // index into the buffer - size_t i_id{ 0 }; - // move id - size_t s_id{ 0 }; - Vec3f position{ Vec3f::Zero() }; - }; - - struct Sub_Path - { - Endpoint first; - Endpoint last; - - bool contains(size_t s_id) const { - return first.s_id <= s_id && s_id <= last.s_id; - } - }; - - EMoveType type{ EMoveType::Noop }; - ExtrusionRole role{ erNone }; - float delta_extruder{ 0.0f }; - float height{ 0.0f }; - float width{ 0.0f }; - float feedrate{ 0.0f }; - float fan_speed{ 0.0f }; - float temperature{ 0.0f }; - float volumetric_rate{ 0.0f }; - unsigned char extruder_id{ 0 }; - unsigned char cp_color_id{ 0 }; - std::vector sub_paths; - - bool matches(const GCodeProcessorResult::MoveVertex& move) const; - size_t vertices_count() const { - return sub_paths.empty() ? 0 : sub_paths.back().last.s_id - sub_paths.front().first.s_id + 1; - } - bool contains(size_t s_id) const { - return sub_paths.empty() ? false : sub_paths.front().first.s_id <= s_id && s_id <= sub_paths.back().last.s_id; - } - int get_id_of_sub_path_containing(size_t s_id) const { - if (sub_paths.empty()) - return -1; - else { - for (int i = 0; i < static_cast(sub_paths.size()); ++i) { - if (sub_paths[i].contains(s_id)) - return i; - } - return -1; - } - } - void add_sub_path(const GCodeProcessorResult::MoveVertex& move, unsigned int b_id, size_t i_id, size_t s_id) { - Endpoint endpoint = { b_id, i_id, s_id, move.position }; - sub_paths.push_back({ endpoint , endpoint }); - } - }; - - // Used to batch the indices needed to render the paths - struct RenderPath - { - // Index of the parent tbuffer - unsigned char tbuffer_id; - // Render path property - Color color; - // Index of the buffer in TBuffer::indices - unsigned int ibuffer_id; - // Render path content - // Index of the path in TBuffer::paths - unsigned int path_id; - std::vector sizes; - std::vector offsets; // use size_t because we need an unsigned integer whose size matches pointer's size (used in the call glMultiDrawElements()) - bool contains(size_t offset) const { - for (size_t i = 0; i < offsets.size(); ++i) { - if (offsets[i] <= offset && offset <= offsets[i] + static_cast(sizes[i] * sizeof(IBufferType))) - return true; - } - return false; - } - }; - struct RenderPathPropertyLower { - bool operator() (const RenderPath &l, const RenderPath &r) const { - if (l.tbuffer_id < r.tbuffer_id) - return true; - for (int i = 0; i < 3; ++i) { - if (l.color[i] < r.color[i]) - return true; - else if (l.color[i] > r.color[i]) - return false; - } - return l.ibuffer_id < r.ibuffer_id; - } - }; - struct RenderPathPropertyEqual { - bool operator() (const RenderPath &l, const RenderPath &r) const { - return l.tbuffer_id == r.tbuffer_id && l.ibuffer_id == r.ibuffer_id && l.color == r.color; - } - }; - - // buffer containing data for rendering a specific toolpath type - struct TBuffer - { - enum class ERenderPrimitiveType : unsigned char - { - Point, - Line, - Triangle, - InstancedModel, - BatchedModel - }; - - ERenderPrimitiveType render_primitive_type; - - // buffers for point, line and triangle primitive types - VBuffer vertices; - std::vector indices; - - struct Model - { - GLModel model; - Color color; - InstanceVBuffer instances; - GLModel::InitializationData data; - - void reset(); - }; - - // contain the buffer for model primitive types - Model model; - - std::string shader; - std::vector paths; - std::vector render_paths; - bool visible{ false }; - - void reset(); - - // b_id index of buffer contained in this->indices - // i_id index of first index contained in this->indices[b_id] - // s_id index of first vertex contained in this->vertices - void add_path(const GCodeProcessorResult::MoveVertex& move, unsigned int b_id, size_t i_id, size_t s_id); - - unsigned int max_vertices_per_segment() const { - switch (render_primitive_type) - { - case ERenderPrimitiveType::Point: { return 1; } - case ERenderPrimitiveType::Line: { return 2; } - case ERenderPrimitiveType::Triangle: { return 8; } - default: { return 0; } - } - } - - size_t max_vertices_per_segment_size_floats() const { return vertices.vertex_size_floats() * static_cast(max_vertices_per_segment()); } - size_t max_vertices_per_segment_size_bytes() const { return max_vertices_per_segment_size_floats() * sizeof(float); } - unsigned int indices_per_segment() const { - switch (render_primitive_type) - { - case ERenderPrimitiveType::Point: { return 1; } - case ERenderPrimitiveType::Line: { return 2; } - case ERenderPrimitiveType::Triangle: { return 30; } // 3 indices x 10 triangles - default: { return 0; } - } - } - size_t indices_per_segment_size_bytes() const { return static_cast(indices_per_segment() * sizeof(IBufferType)); } - unsigned int max_indices_per_segment() const { - switch (render_primitive_type) - { - case ERenderPrimitiveType::Point: { return 1; } - case ERenderPrimitiveType::Line: { return 2; } - case ERenderPrimitiveType::Triangle: { return 36; } // 3 indices x 12 triangles - default: { return 0; } - } - } - size_t max_indices_per_segment_size_bytes() const { return max_indices_per_segment() * sizeof(IBufferType); } - - bool has_data() const { - switch (render_primitive_type) - { - case ERenderPrimitiveType::Point: - case ERenderPrimitiveType::Line: - case ERenderPrimitiveType::Triangle: { - return !vertices.vbos.empty() && vertices.vbos.front() != 0 && !indices.empty() && indices.front().ibo != 0; - } - case ERenderPrimitiveType::InstancedModel: { return model.model.is_initialized() && !model.instances.buffer.empty(); } - case ERenderPrimitiveType::BatchedModel: { - return model.data.vertices_count() > 0 && model.data.indices_count() && - !vertices.vbos.empty() && vertices.vbos.front() != 0 && !indices.empty() && indices.front().ibo != 0; - } - default: { return false; } - } - } - }; - - // helper to render shells - struct Shells - { - GLVolumeCollection volumes; - bool visible{ false }; - }; - - // helper to render extrusion paths - struct Extrusions - { - struct Range - { - float min; - float max; - unsigned int count; - - Range() { reset(); } - - void update_from(const float value) { - if (value != max && value != min) - ++count; - min = std::min(min, value); - max = std::max(max, value); - } - void reset() { min = FLT_MAX; max = -FLT_MAX; count = 0; } - - float step_size() const { return (max - min) / (static_cast(Range_Colors.size()) - 1.0f); } - Color get_color_at(float value) const; - }; - - struct Ranges - { - // Color mapping by layer height. - Range height; - // Color mapping by extrusion width. - Range width; - // Color mapping by feedrate. - Range feedrate; - // Color mapping by fan speed. - Range fan_speed; - // Color mapping by volumetric extrusion rate. - Range volumetric_rate; - // Color mapping by extrusion temperature. - Range temperature; - - void reset() { - height.reset(); - width.reset(); - feedrate.reset(); - fan_speed.reset(); - volumetric_rate.reset(); - temperature.reset(); - } - }; - - unsigned int role_visibility_flags{ 0 }; - Ranges ranges; - - void reset_role_visibility_flags() { - role_visibility_flags = 0; - for (unsigned int i = 0; i < erCount; ++i) { - role_visibility_flags |= 1 << i; - } - } - - void reset_ranges() { ranges.reset(); } - }; - - class Layers - { - public: - struct Endpoints - { - size_t first{ 0 }; - size_t last{ 0 }; - - bool operator == (const Endpoints& other) const { return first == other.first && last == other.last; } - bool operator != (const Endpoints& other) const { return !operator==(other); } - }; - - private: - std::vector m_zs; - std::vector m_endpoints; - - public: - void append(double z, Endpoints endpoints) { - m_zs.emplace_back(z); - m_endpoints.emplace_back(endpoints); - } - - void reset() { - m_zs = std::vector(); - m_endpoints = std::vector(); - } - - size_t size() const { return m_zs.size(); } - bool empty() const { return m_zs.empty(); } - const std::vector& get_zs() const { return m_zs; } - const std::vector& get_endpoints() const { return m_endpoints; } - std::vector& get_endpoints() { return m_endpoints; } - double get_z_at(unsigned int id) const { return (id < m_zs.size()) ? m_zs[id] : 0.0; } - Endpoints get_endpoints_at(unsigned int id) const { return (id < m_endpoints.size()) ? m_endpoints[id] : Endpoints(); } - - bool operator != (const Layers& other) const { - if (m_zs != other.m_zs) - return true; - if (m_endpoints != other.m_endpoints) - return true; - return false; - } - }; - - // used to render the toolpath caps of the current sequential range - // (i.e. when sliding on the horizontal slider) - struct SequentialRangeCap - { - TBuffer* buffer{ nullptr }; - unsigned int ibo{ 0 }; - unsigned int vbo{ 0 }; - Color color; - - ~SequentialRangeCap(); - bool is_renderable() const { return buffer != nullptr; } - void reset(); - size_t indices_count() const { return 6; } - }; - -#if ENABLE_GCODE_VIEWER_STATISTICS - struct Statistics - { - // time - int64_t results_time{ 0 }; - int64_t load_time{ 0 }; - int64_t load_vertices{ 0 }; - int64_t smooth_vertices{ 0 }; - int64_t load_indices{ 0 }; - int64_t refresh_time{ 0 }; - int64_t refresh_paths_time{ 0 }; - // opengl calls - int64_t gl_multi_points_calls_count{ 0 }; - int64_t gl_multi_lines_calls_count{ 0 }; - int64_t gl_multi_triangles_calls_count{ 0 }; - int64_t gl_triangles_calls_count{ 0 }; - int64_t gl_instanced_models_calls_count{ 0 }; - int64_t gl_batched_models_calls_count{ 0 }; - // memory - int64_t results_size{ 0 }; - int64_t total_vertices_gpu_size{ 0 }; - int64_t total_indices_gpu_size{ 0 }; - int64_t total_instances_gpu_size{ 0 }; - int64_t max_vbuffer_gpu_size{ 0 }; - int64_t max_ibuffer_gpu_size{ 0 }; - int64_t paths_size{ 0 }; - int64_t render_paths_size{ 0 }; - int64_t models_instances_size{ 0 }; - // other - int64_t travel_segments_count{ 0 }; - int64_t wipe_segments_count{ 0 }; - int64_t extrude_segments_count{ 0 }; - int64_t instances_count{ 0 }; - int64_t batched_count{ 0 }; - int64_t vbuffers_count{ 0 }; - int64_t ibuffers_count{ 0 }; - - void reset_all() { - reset_times(); - reset_opengl(); - reset_sizes(); - reset_others(); - } - - void reset_times() { - results_time = 0; - load_time = 0; - load_vertices = 0; - smooth_vertices = 0; - load_indices = 0; - refresh_time = 0; - refresh_paths_time = 0; - } - - void reset_opengl() { - gl_multi_points_calls_count = 0; - gl_multi_lines_calls_count = 0; - gl_multi_triangles_calls_count = 0; - gl_triangles_calls_count = 0; - gl_instanced_models_calls_count = 0; - gl_batched_models_calls_count = 0; - } - - void reset_sizes() { - results_size = 0; - total_vertices_gpu_size = 0; - total_indices_gpu_size = 0; - total_instances_gpu_size = 0; - max_vbuffer_gpu_size = 0; - max_ibuffer_gpu_size = 0; - paths_size = 0; - render_paths_size = 0; - models_instances_size = 0; - } - - void reset_others() { - travel_segments_count = 0; - wipe_segments_count = 0; - extrude_segments_count = 0; - instances_count = 0; - batched_count = 0; - vbuffers_count = 0; - ibuffers_count = 0; - } - }; -#endif // ENABLE_GCODE_VIEWER_STATISTICS - -public: - struct SequentialView - { - class Marker - { - GLModel m_model; - Vec3f m_world_position; - Transform3f m_world_transform; - // for seams, the position of the marker is on the last endpoint of the toolpath containing it - // the offset is used to show the correct value of tool position in the "ToolPosition" window - // see implementation of render() method - Vec3f m_world_offset; - float m_z_offset{ 0.5f }; - bool m_visible{ true }; - - public: - void init(); - - const BoundingBoxf3& get_bounding_box() const { return m_model.get_bounding_box(); } - - void set_world_position(const Vec3f& position); - void set_world_offset(const Vec3f& offset) { m_world_offset = offset; } - - bool is_visible() const { return m_visible; } - void set_visible(bool visible) { m_visible = visible; } - - void render() const; - }; - - class GCodeWindow - { - struct Line - { - std::string command; - std::string parameters; - std::string comment; - }; - bool m_visible{ true }; - uint64_t m_selected_line_id{ 0 }; - size_t m_last_lines_size{ 0 }; - std::string m_filename; - boost::iostreams::mapped_file_source m_file; - // map for accessing data in file by line number - std::vector m_lines_ends; - // current visible lines - std::vector m_lines; - - public: - GCodeWindow() = default; - ~GCodeWindow() { stop_mapping_file(); } - void load_gcode(const std::string& filename, std::vector &&lines_ends); - void reset() { - stop_mapping_file(); - m_lines_ends.clear(); - m_lines.clear(); - m_filename.clear(); - } - - void toggle_visibility() { m_visible = !m_visible; } - - void render(float top, float bottom, uint64_t curr_line_id) const; - - void stop_mapping_file(); - }; - - struct Endpoints - { - size_t first{ 0 }; - size_t last{ 0 }; - }; - - bool skip_invisible_moves{ false }; - Endpoints endpoints; - Endpoints current; - Endpoints last_current; - Endpoints global; - Vec3f current_position{ Vec3f::Zero() }; - Vec3f current_offset{ Vec3f::Zero() }; - Marker marker; - GCodeWindow gcode_window; - std::vector gcode_ids; - - void render(float legend_height) const; - }; - - enum class EViewType : unsigned char - { - FeatureType, - Height, - Width, - Feedrate, - FanSpeed, - Temperature, - VolumetricRate, - Tool, - ColorPrint, - Count - }; - -private: - bool m_gl_data_initialized{ false }; - unsigned int m_last_result_id{ 0 }; - size_t m_moves_count{ 0 }; - std::vector m_buffers{ static_cast(EMoveType::Extrude) }; - // bounding box of toolpaths - BoundingBoxf3 m_paths_bounding_box; - // bounding box of toolpaths + marker tools - BoundingBoxf3 m_max_bounding_box; - float m_max_print_height{ 0.0f }; - std::vector m_tool_colors; - Layers m_layers; - std::array m_layers_z_range; - std::vector m_roles; - size_t m_extruders_count; - std::vector m_extruder_ids; - std::vector m_filament_diameters; - std::vector m_filament_densities; - Extrusions m_extrusions; - SequentialView m_sequential_view; - Shells m_shells; - EViewType m_view_type{ EViewType::FeatureType }; - bool m_legend_enabled{ true }; - PrintEstimatedStatistics m_print_statistics; - PrintEstimatedStatistics::ETimeMode m_time_estimate_mode{ PrintEstimatedStatistics::ETimeMode::Normal }; -#if ENABLE_GCODE_VIEWER_STATISTICS - Statistics m_statistics; -#endif // ENABLE_GCODE_VIEWER_STATISTICS - std::array m_detected_point_sizes = { 0.0f, 0.0f }; - GCodeProcessorResult::SettingsIds m_settings_ids; - std::array m_sequential_range_caps; - - std::vector m_custom_gcode_per_print_z; - - bool m_contained_in_bed{ true }; - -public: - GCodeViewer(); - ~GCodeViewer() { reset(); } - - void init(); - - // extract rendering data from the given parameters - void load(const GCodeProcessorResult& gcode_result, const Print& print, bool initialized); - // recalculate ranges in dependence of what is visible and sets tool/print colors - void refresh(const GCodeProcessorResult& gcode_result, const std::vector& str_tool_colors); - void refresh_render_paths(); - void update_shells_color_by_extruder(const DynamicPrintConfig* config); - - void reset(); - void render(); - - bool has_data() const { return !m_roles.empty(); } - bool can_export_toolpaths() const; - - const BoundingBoxf3& get_paths_bounding_box() const { return m_paths_bounding_box; } - const BoundingBoxf3& get_max_bounding_box() const { return m_max_bounding_box; } - const std::vector& get_layers_zs() const { return m_layers.get_zs(); } - - const SequentialView& get_sequential_view() const { return m_sequential_view; } - void update_sequential_view_current(unsigned int first, unsigned int last); - - bool is_contained_in_bed() const { return m_contained_in_bed; } - - EViewType get_view_type() const { return m_view_type; } - void set_view_type(EViewType type) { - if (type == EViewType::Count) - type = EViewType::FeatureType; - - m_view_type = type; - } - - bool is_toolpath_move_type_visible(EMoveType type) const; - void set_toolpath_move_type_visible(EMoveType type, bool visible); - unsigned int get_toolpath_role_visibility_flags() const { return m_extrusions.role_visibility_flags; } - void set_toolpath_role_visibility_flags(unsigned int flags) { m_extrusions.role_visibility_flags = flags; } - unsigned int get_options_visibility_flags() const; - void set_options_visibility_from_flags(unsigned int flags); - void set_layers_z_range(const std::array& layers_z_range); - - bool is_legend_enabled() const { return m_legend_enabled; } - void enable_legend(bool enable) { m_legend_enabled = enable; } - - void export_toolpaths_to_obj(const char* filename) const; - - void toggle_gcode_window_visibility() { m_sequential_view.gcode_window.toggle_visibility(); } - - std::vector& get_custom_gcode_per_print_z() { return m_custom_gcode_per_print_z; } - size_t get_extruders_count() { return m_extruders_count; } - -private: - void load_toolpaths(const GCodeProcessorResult& gcode_result); - void load_shells(const Print& print, bool initialized); - void refresh_render_paths(bool keep_sequential_current_first, bool keep_sequential_current_last) const; - void render_toolpaths(); - void render_shells(); - void render_legend(float& legend_height); -#if ENABLE_GCODE_VIEWER_STATISTICS - void render_statistics(); -#endif // ENABLE_GCODE_VIEWER_STATISTICS - bool is_visible(ExtrusionRole role) const { - return role < erCount && (m_extrusions.role_visibility_flags & (1 << role)) != 0; - } - bool is_visible(const Path& path) const { return is_visible(path.role); } - void log_memory_used(const std::string& label, int64_t additional = 0) const; - Color option_color(EMoveType move_type) const; -}; - -} // namespace GUI -} // namespace Slic3r - -#endif // slic3r_GCodeViewer_hpp_ - +#ifndef slic3r_GCodeViewer_hpp_ +#define slic3r_GCodeViewer_hpp_ + +#include "3DScene.hpp" +#include "libslic3r/ExtrusionRole.hpp" +#include "libslic3r/GCode/GCodeProcessor.hpp" +#include "GLModel.hpp" + +#include + +#include +#include +#include +#include + +namespace Slic3r { + +class Print; +class TriangleMesh; + +namespace GUI { + +class GCodeViewer +{ + using IBufferType = unsigned short; + using VertexBuffer = std::vector; + using MultiVertexBuffer = std::vector; + using IndexBuffer = std::vector; + using MultiIndexBuffer = std::vector; + using InstanceBuffer = std::vector; + using InstanceIdBuffer = std::vector; + using InstancesOffsets = std::vector; + + static const std::array(GCodeExtrusionRole::Count)> Extrusion_Role_Colors; + static const std::vector Options_Colors; + static const std::vector Travel_Colors; + static const std::vector Range_Colors; + static const ColorRGBA Wipe_Color; + static const ColorRGBA Neutral_Color; + + enum class EOptionsColors : unsigned char + { + Retractions, + Unretractions, + Seams, + ToolChanges, + ColorChanges, + PausePrints, + CustomGCodes + }; + + // vbo buffer containing vertices data used to render a specific toolpath type + struct VBuffer + { + enum class EFormat : unsigned char + { + // vertex format: 3 floats -> position.x|position.y|position.z + Position, + // vertex format: 4 floats -> position.x|position.y|position.z|normal.x + PositionNormal1, + // vertex format: 6 floats -> position.x|position.y|position.z|normal.x|normal.y|normal.z + PositionNormal3 + }; + + EFormat format{ EFormat::Position }; +#if ENABLE_GL_CORE_PROFILE + // vaos id + std::vector vaos; +#endif // ENABLE_GL_CORE_PROFILE + // vbos id + std::vector vbos; + // sizes of the buffers, in bytes, used in export to obj + std::vector sizes; + // count of vertices, updated after data are sent to gpu + size_t count{ 0 }; + + size_t data_size_bytes() const { return count * vertex_size_bytes(); } + // We set 65536 as max count of vertices inside a vertex buffer to allow + // to use unsigned short in place of unsigned int for indices in the index buffer, to save memory + size_t max_size_bytes() const { return 65536 * vertex_size_bytes(); } + + size_t vertex_size_floats() const { return position_size_floats() + normal_size_floats(); } + size_t vertex_size_bytes() const { return vertex_size_floats() * sizeof(float); } + + size_t position_offset_floats() const { return 0; } + size_t position_offset_bytes() const { return position_offset_floats() * sizeof(float); } + + size_t position_size_floats() const { return 3; } + size_t position_size_bytes() const { return position_size_floats() * sizeof(float); } + + size_t normal_offset_floats() const { + assert(format == EFormat::PositionNormal1 || format == EFormat::PositionNormal3); + return position_size_floats(); + } + size_t normal_offset_bytes() const { return normal_offset_floats() * sizeof(float); } + + size_t normal_size_floats() const { + switch (format) + { + case EFormat::PositionNormal1: { return 1; } + case EFormat::PositionNormal3: { return 3; } + default: { return 0; } + } + } + size_t normal_size_bytes() const { return normal_size_floats() * sizeof(float); } + + void reset(); + }; + + // buffer containing instances data used to render a toolpaths using instanced or batched models + // instance record format: + // instanced models: 5 floats -> position.x|position.y|position.z|width|height (which are sent to the shader as -> vec3 (offset) + vec2 (scales) in GLModel::render_instanced()) + // batched models: 3 floats -> position.x|position.y|position.z + struct InstanceVBuffer + { + // ranges used to render only subparts of the intances + struct Ranges + { + struct Range + { + // offset in bytes of the 1st instance to render + unsigned int offset; + // count of instances to render + unsigned int count; + // vbo id + unsigned int vbo{ 0 }; + // Color to apply to the instances + ColorRGBA color; + }; + + std::vector ranges; + + void reset(); + }; + + enum class EFormat : unsigned char + { + InstancedModel, + BatchedModel + }; + + EFormat format; + + // cpu-side buffer containing all instances data + InstanceBuffer buffer; + // indices of the moves for all instances + std::vector s_ids; + // position offsets, used to show the correct value of the tool position + InstancesOffsets offsets; + Ranges render_ranges; + + size_t data_size_bytes() const { return s_ids.size() * instance_size_bytes(); } + + size_t instance_size_floats() const { + switch (format) + { + case EFormat::InstancedModel: { return 5; } + case EFormat::BatchedModel: { return 3; } + default: { return 0; } + } + } + size_t instance_size_bytes() const { return instance_size_floats() * sizeof(float); } + + void reset(); + }; + + // ibo buffer containing indices data (for lines/triangles) used to render a specific toolpath type + struct IBuffer + { +#if ENABLE_GL_CORE_PROFILE + // id of the associated vertex array buffer + unsigned int vao{ 0 }; +#endif // ENABLE_GL_CORE_PROFILE + // id of the associated vertex buffer + unsigned int vbo{ 0 }; + // ibo id + unsigned int ibo{ 0 }; + // count of indices, updated after data are sent to gpu + size_t count{ 0 }; + + void reset(); + }; + + // Used to identify different toolpath sub-types inside a IBuffer + struct Path + { + struct Endpoint + { + // index of the buffer in the multibuffer vector + // the buffer type may change: + // it is the vertex buffer while extracting vertices data, + // the index buffer while extracting indices data + unsigned int b_id{ 0 }; + // index into the buffer + size_t i_id{ 0 }; + // move id + size_t s_id{ 0 }; + Vec3f position{ Vec3f::Zero() }; + }; + + struct Sub_Path + { + Endpoint first; + Endpoint last; + + bool contains(size_t s_id) const { + return first.s_id <= s_id && s_id <= last.s_id; + } + }; + + EMoveType type{ EMoveType::Noop }; + GCodeExtrusionRole role{ GCodeExtrusionRole::None }; + float delta_extruder{ 0.0f }; + float height{ 0.0f }; + float width{ 0.0f }; + float feedrate{ 0.0f }; + float fan_speed{ 0.0f }; + float temperature{ 0.0f }; + float volumetric_rate{ 0.0f }; + unsigned char extruder_id{ 0 }; + unsigned char cp_color_id{ 0 }; + std::vector sub_paths; + + bool matches(const GCodeProcessorResult::MoveVertex& move, bool account_for_volumetric_rate) const; + size_t vertices_count() const { + return sub_paths.empty() ? 0 : sub_paths.back().last.s_id - sub_paths.front().first.s_id + 1; + } + bool contains(size_t s_id) const { + return sub_paths.empty() ? false : sub_paths.front().first.s_id <= s_id && s_id <= sub_paths.back().last.s_id; + } + int get_id_of_sub_path_containing(size_t s_id) const { + if (sub_paths.empty()) + return -1; + else { + for (int i = 0; i < static_cast(sub_paths.size()); ++i) { + if (sub_paths[i].contains(s_id)) + return i; + } + return -1; + } + } + void add_sub_path(const GCodeProcessorResult::MoveVertex& move, unsigned int b_id, size_t i_id, size_t s_id) { + Endpoint endpoint = { b_id, i_id, s_id, move.position }; + sub_paths.push_back({ endpoint , endpoint }); + } + }; + + // Used to batch the indices needed to render the paths + struct RenderPath + { + // Index of the parent tbuffer + unsigned char tbuffer_id; + // Render path property + ColorRGBA color; + // Index of the buffer in TBuffer::indices + unsigned int ibuffer_id; + // Render path content + // Index of the path in TBuffer::paths + unsigned int path_id; + std::vector sizes; + std::vector offsets; // use size_t because we need an unsigned integer whose size matches pointer's size (used in the call glMultiDrawElements()) + bool contains(size_t offset) const { + for (size_t i = 0; i < offsets.size(); ++i) { + if (offsets[i] <= offset && offset <= offsets[i] + static_cast(sizes[i] * sizeof(IBufferType))) + return true; + } + return false; + } + }; + struct RenderPathPropertyLower { + bool operator() (const RenderPath &l, const RenderPath &r) const { + if (l.tbuffer_id < r.tbuffer_id) + return true; + if (l.color < r.color) + return true; + else if (l.color > r.color) + return false; + return l.ibuffer_id < r.ibuffer_id; + } + }; + struct RenderPathPropertyEqual { + bool operator() (const RenderPath &l, const RenderPath &r) const { + return l.tbuffer_id == r.tbuffer_id && l.ibuffer_id == r.ibuffer_id && l.color == r.color; + } + }; + + // buffer containing data for rendering a specific toolpath type + struct TBuffer + { + enum class ERenderPrimitiveType : unsigned char + { + Line, + Triangle, + InstancedModel, + BatchedModel + }; + + ERenderPrimitiveType render_primitive_type; + + // buffers for point, line and triangle primitive types + VBuffer vertices; + std::vector indices; + + struct Model + { + GLModel model; + ColorRGBA color; + InstanceVBuffer instances; + GLModel::Geometry data; + + void reset(); + }; + + // contain the buffer for model primitive types + Model model; + + std::string shader; + std::vector paths; + std::vector render_paths; + bool visible{ false }; + + void reset(); + + // b_id index of buffer contained in this->indices + // i_id index of first index contained in this->indices[b_id] + // s_id index of first vertex contained in this->vertices + void add_path(const GCodeProcessorResult::MoveVertex& move, unsigned int b_id, size_t i_id, size_t s_id); + + unsigned int max_vertices_per_segment() const { + switch (render_primitive_type) + { + case ERenderPrimitiveType::Line: { return 2; } + case ERenderPrimitiveType::Triangle: { return 8; } + default: { return 0; } + } + } + + size_t max_vertices_per_segment_size_floats() const { return vertices.vertex_size_floats() * static_cast(max_vertices_per_segment()); } + size_t max_vertices_per_segment_size_bytes() const { return max_vertices_per_segment_size_floats() * sizeof(float); } + unsigned int indices_per_segment() const { + switch (render_primitive_type) + { + case ERenderPrimitiveType::Line: { return 2; } + case ERenderPrimitiveType::Triangle: { return 30; } // 3 indices x 10 triangles + default: { return 0; } + } + } + size_t indices_per_segment_size_bytes() const { return static_cast(indices_per_segment() * sizeof(IBufferType)); } + unsigned int max_indices_per_segment() const { + switch (render_primitive_type) + { + case ERenderPrimitiveType::Line: { return 2; } + case ERenderPrimitiveType::Triangle: { return 36; } // 3 indices x 12 triangles + default: { return 0; } + } + } + size_t max_indices_per_segment_size_bytes() const { return max_indices_per_segment() * sizeof(IBufferType); } + + bool has_data() const { + switch (render_primitive_type) + { + case ERenderPrimitiveType::Line: + case ERenderPrimitiveType::Triangle: { + return !vertices.vbos.empty() && vertices.vbos.front() != 0 && !indices.empty() && indices.front().ibo != 0; + } + case ERenderPrimitiveType::InstancedModel: { return model.model.is_initialized() && !model.instances.buffer.empty(); } + case ERenderPrimitiveType::BatchedModel: { + return !model.data.vertices.empty() && !model.data.indices.empty() && + !vertices.vbos.empty() && vertices.vbos.front() != 0 && !indices.empty() && indices.front().ibo != 0; + } + default: { return false; } + } + } + }; + + // helper to render shells + struct Shells + { + GLVolumeCollection volumes; + bool visible{ false }; + }; + + // helper to render center of gravity + class COG + { + GLModel m_model; + bool m_visible{ false }; + // whether or not to render the model with fixed screen size + bool m_fixed_size{ true }; + double m_total_mass{ 0.0 }; + Vec3d m_position{ Vec3d::Zero() }; + + public: + void render(); + + void reset() { + m_position = Vec3d::Zero(); + m_total_mass = 0.0; + } + + bool is_visible() const { return m_visible; } + void set_visible(bool visible) { m_visible = visible; } + + void add_segment(const Vec3d& v1, const Vec3d& v2, double mass) { + assert(mass > 0.0); + m_position += mass * 0.5 * (v1 + v2); + m_total_mass += mass; + } + + Vec3d cog() const { return (m_total_mass > 0.0) ? (Vec3d)(m_position / m_total_mass) : Vec3d::Zero(); } + + private: + void init() { + if (m_model.is_initialized()) + return; + + const float radius = m_fixed_size ? 10.0f : 1.0f; + m_model.init_from(smooth_sphere(32, radius)); + } + }; + + // helper to render extrusion paths + struct Extrusions + { + struct Range + { + enum class EType : unsigned char + { + Linear, + Logarithmic + }; + + float min; + float max; + unsigned int count; + + Range() { reset(); } + + void update_from(const float value) { + if (value != max && value != min) + ++count; + min = std::min(min, value); + max = std::max(max, value); + } + void reset() { min = FLT_MAX; max = -FLT_MAX; count = 0; } + + float step_size(EType type = EType::Linear) const; + ColorRGBA get_color_at(float value, EType type = EType::Linear) const; + }; + + struct Ranges + { + // Color mapping by layer height. + Range height; + // Color mapping by extrusion width. + Range width; + // Color mapping by feedrate. + Range feedrate; + // Color mapping by fan speed. + Range fan_speed; + // Color mapping by volumetric extrusion rate. + Range volumetric_rate; + // Color mapping by extrusion temperature. + Range temperature; + // Color mapping by layer time. + std::array(PrintEstimatedStatistics::ETimeMode::Count)> layer_time; + + void reset() { + height.reset(); + width.reset(); + feedrate.reset(); + fan_speed.reset(); + volumetric_rate.reset(); + temperature.reset(); + for (auto& range : layer_time) { + range.reset(); + } + } + }; + + unsigned int role_visibility_flags{ 0 }; + Ranges ranges; + + void reset_role_visibility_flags() { + role_visibility_flags = 0; + for (uint32_t i = 0; i < uint32_t(GCodeExtrusionRole::Count); ++i) { + role_visibility_flags |= 1 << i; + } + } + + void reset_ranges() { ranges.reset(); } + }; + + class Layers + { + public: + struct Range + { + size_t first{ 0 }; + size_t last{ 0 }; + + bool operator == (const Range& other) const { return first == other.first && last == other.last; } + bool operator != (const Range& other) const { return !operator==(other); } + bool contains(size_t id) const { return first <= id && id <= last; } + }; + + private: + std::vector m_zs; + std::vector m_ranges; + + public: + void append(double z, const Range& range) { + m_zs.emplace_back(z); + m_ranges.emplace_back(range); + } + + void reset() { + m_zs = std::vector(); + m_ranges = std::vector(); + } + + size_t size() const { return m_zs.size(); } + bool empty() const { return m_zs.empty(); } + const std::vector& get_zs() const { return m_zs; } + const std::vector& get_ranges() const { return m_ranges; } + std::vector& get_ranges() { return m_ranges; } + double get_z_at(unsigned int id) const { return (id < m_zs.size()) ? m_zs[id] : 0.0; } + Range get_range_at(unsigned int id) const { return (id < m_ranges.size()) ? m_ranges[id] : Range(); } + + bool operator != (const Layers& other) const { + if (m_zs != other.m_zs) + return true; + if (m_ranges != other.m_ranges) + return true; + return false; + } + }; + + // used to render the toolpath caps of the current sequential range + // (i.e. when sliding on the horizontal slider) + struct SequentialRangeCap + { + TBuffer* buffer{ nullptr }; +#if ENABLE_GL_CORE_PROFILE + unsigned int vao{ 0 }; +#endif // ENABLE_GL_CORE_PROFILE + unsigned int vbo{ 0 }; + unsigned int ibo{ 0 }; + ColorRGBA color; + + ~SequentialRangeCap(); + bool is_renderable() const { return buffer != nullptr; } + void reset(); + size_t indices_count() const { return 6; } + }; + +#if ENABLE_GCODE_VIEWER_STATISTICS + struct Statistics + { + // time + int64_t results_time{ 0 }; + int64_t load_time{ 0 }; + int64_t load_vertices{ 0 }; + int64_t smooth_vertices{ 0 }; + int64_t load_indices{ 0 }; + int64_t refresh_time{ 0 }; + int64_t refresh_paths_time{ 0 }; + // opengl calls + int64_t gl_multi_lines_calls_count{ 0 }; + int64_t gl_multi_triangles_calls_count{ 0 }; + int64_t gl_triangles_calls_count{ 0 }; + int64_t gl_instanced_models_calls_count{ 0 }; + int64_t gl_batched_models_calls_count{ 0 }; + // memory + int64_t results_size{ 0 }; + int64_t total_vertices_gpu_size{ 0 }; + int64_t total_indices_gpu_size{ 0 }; + int64_t total_instances_gpu_size{ 0 }; + int64_t max_vbuffer_gpu_size{ 0 }; + int64_t max_ibuffer_gpu_size{ 0 }; + int64_t paths_size{ 0 }; + int64_t render_paths_size{ 0 }; + int64_t models_instances_size{ 0 }; + // other + int64_t travel_segments_count{ 0 }; + int64_t wipe_segments_count{ 0 }; + int64_t extrude_segments_count{ 0 }; + int64_t instances_count{ 0 }; + int64_t batched_count{ 0 }; + int64_t vbuffers_count{ 0 }; + int64_t ibuffers_count{ 0 }; + + void reset_all() { + reset_times(); + reset_opengl(); + reset_sizes(); + reset_others(); + } + + void reset_times() { + results_time = 0; + load_time = 0; + load_vertices = 0; + smooth_vertices = 0; + load_indices = 0; + refresh_time = 0; + refresh_paths_time = 0; + } + + void reset_opengl() { + gl_multi_lines_calls_count = 0; + gl_multi_triangles_calls_count = 0; + gl_triangles_calls_count = 0; + gl_instanced_models_calls_count = 0; + gl_batched_models_calls_count = 0; + } + + void reset_sizes() { + results_size = 0; + total_vertices_gpu_size = 0; + total_indices_gpu_size = 0; + total_instances_gpu_size = 0; + max_vbuffer_gpu_size = 0; + max_ibuffer_gpu_size = 0; + paths_size = 0; + render_paths_size = 0; + models_instances_size = 0; + } + + void reset_others() { + travel_segments_count = 0; + wipe_segments_count = 0; + extrude_segments_count = 0; + instances_count = 0; + batched_count = 0; + vbuffers_count = 0; + ibuffers_count = 0; + } + }; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + +public: + struct SequentialView + { + class Marker + { + GLModel m_model; + Vec3f m_world_position; + Transform3f m_world_transform; + // for seams, the position of the marker is on the last endpoint of the toolpath containing it + // the offset is used to show the correct value of tool position in the "ToolPosition" window + // see implementation of render() method + Vec3f m_world_offset; + float m_z_offset{ 0.5f }; + bool m_visible{ true }; + + public: + void init(); + + const BoundingBoxf3& get_bounding_box() const { return m_model.get_bounding_box(); } + + void set_world_position(const Vec3f& position); + void set_world_offset(const Vec3f& offset) { m_world_offset = offset; } + + bool is_visible() const { return m_visible; } + void set_visible(bool visible) { m_visible = visible; } + + void render(); + }; + + class GCodeWindow + { + struct Line + { + std::string command; + std::string parameters; + std::string comment; + }; + bool m_visible{ true }; + uint64_t m_selected_line_id{ 0 }; + size_t m_last_lines_size{ 0 }; + std::string m_filename; + boost::iostreams::mapped_file_source m_file; + // map for accessing data in file by line number + std::vector m_lines_ends; + // current visible lines + std::vector m_lines; + + public: + GCodeWindow() = default; + ~GCodeWindow() { stop_mapping_file(); } + void load_gcode(const std::string& filename, const std::vector& lines_ends); + void reset() { + stop_mapping_file(); + m_lines_ends.clear(); + m_lines.clear(); + m_filename.clear(); + } + + void toggle_visibility() { m_visible = !m_visible; } + + void render(float top, float bottom, uint64_t curr_line_id) const; + + void stop_mapping_file(); + }; + + struct Endpoints + { + size_t first{ 0 }; + size_t last{ 0 }; + }; + + bool skip_invisible_moves{ false }; + Endpoints endpoints; + Endpoints current; + Endpoints last_current; + Endpoints global; + Vec3f current_position{ Vec3f::Zero() }; + Vec3f current_offset{ Vec3f::Zero() }; + Marker marker; + GCodeWindow gcode_window; + std::vector gcode_ids; + + void render(float legend_height); + }; + + enum class EViewType : unsigned char + { + FeatureType, + Height, + Width, + Feedrate, + FanSpeed, + Temperature, + VolumetricRate, + LayerTimeLinear, + LayerTimeLogarithmic, + Tool, + ColorPrint, + Count + }; + +private: + bool m_gl_data_initialized{ false }; + unsigned int m_last_result_id{ 0 }; + EViewType m_last_view_type{ EViewType::Count }; + size_t m_moves_count{ 0 }; + std::vector m_buffers{ static_cast(EMoveType::Extrude) }; + // bounding box of toolpaths + BoundingBoxf3 m_paths_bounding_box; + // bounding box of toolpaths + marker tools + BoundingBoxf3 m_max_bounding_box; + float m_max_print_height{ 0.0f }; + std::vector m_tool_colors; + Layers m_layers; + std::array m_layers_z_range; + std::vector m_roles; + size_t m_extruders_count; + std::vector m_extruder_ids; + std::vector m_filament_diameters; + std::vector m_filament_densities; + Extrusions m_extrusions; + SequentialView m_sequential_view; + Shells m_shells; + COG m_cog; + EViewType m_view_type{ EViewType::FeatureType }; + bool m_legend_enabled{ true }; + struct LegendResizer + { + bool dirty{ true }; + void reset() { dirty = true; } + }; + LegendResizer m_legend_resizer; + PrintEstimatedStatistics m_print_statistics; + PrintEstimatedStatistics::ETimeMode m_time_estimate_mode{ PrintEstimatedStatistics::ETimeMode::Normal }; +#if ENABLE_GCODE_VIEWER_STATISTICS + Statistics m_statistics; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + GCodeProcessorResult::SettingsIds m_settings_ids; + std::array m_sequential_range_caps; + std::array, static_cast(PrintEstimatedStatistics::ETimeMode::Count)> m_layers_times; + + std::vector m_custom_gcode_per_print_z; + + bool m_contained_in_bed{ true }; + +public: + GCodeViewer(); + ~GCodeViewer() { reset(); } + + void init(); + + // extract rendering data from the given parameters + void load(const GCodeProcessorResult& gcode_result, const Print& print); + // recalculate ranges in dependence of what is visible and sets tool/print colors + void refresh(const GCodeProcessorResult& gcode_result, const std::vector& str_tool_colors); + void refresh_render_paths(bool keep_sequential_current_first, bool keep_sequential_current_last) const; + void update_shells_color_by_extruder(const DynamicPrintConfig* config); + + void reset(); + void render(); + void render_cog() { m_cog.render(); } + + bool has_data() const { return !m_roles.empty(); } + bool can_export_toolpaths() const; + + const BoundingBoxf3& get_paths_bounding_box() const { return m_paths_bounding_box; } + const BoundingBoxf3& get_max_bounding_box() const { return m_max_bounding_box; } + const std::vector& get_layers_zs() const { return m_layers.get_zs(); } + + const SequentialView& get_sequential_view() const { return m_sequential_view; } + void update_sequential_view_current(unsigned int first, unsigned int last); + + bool is_contained_in_bed() const { return m_contained_in_bed; } + + EViewType get_view_type() const { return m_view_type; } + void set_view_type(EViewType type) { + if (type == EViewType::Count) + type = EViewType::FeatureType; + + m_view_type = type; + } + + bool is_toolpath_move_type_visible(EMoveType type) const; + void set_toolpath_move_type_visible(EMoveType type, bool visible); + unsigned int get_toolpath_role_visibility_flags() const { return m_extrusions.role_visibility_flags; } + void set_toolpath_role_visibility_flags(unsigned int flags) { m_extrusions.role_visibility_flags = flags; } + unsigned int get_options_visibility_flags() const; + void set_options_visibility_from_flags(unsigned int flags); + void set_layers_z_range(const std::array& layers_z_range); + + bool is_legend_enabled() const { return m_legend_enabled; } + void enable_legend(bool enable) { m_legend_enabled = enable; } + + void export_toolpaths_to_obj(const char* filename) const; + + void toggle_gcode_window_visibility() { m_sequential_view.gcode_window.toggle_visibility(); } + + std::vector& get_custom_gcode_per_print_z() { return m_custom_gcode_per_print_z; } + size_t get_extruders_count() { return m_extruders_count; } + + void invalidate_legend() { m_legend_resizer.reset(); } + +private: + void load_toolpaths(const GCodeProcessorResult& gcode_result); + void load_shells(const Print& print); + void render_toolpaths(); + void render_shells(); + void render_legend(float& legend_height); +#if ENABLE_GCODE_VIEWER_STATISTICS + void render_statistics(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + bool is_visible(GCodeExtrusionRole role) const { + return role < GCodeExtrusionRole::Count && (m_extrusions.role_visibility_flags & (1 << int(role))) != 0; + } + bool is_visible(const Path& path) const { return is_visible(path.role); } + void log_memory_used(const std::string& label, int64_t additional = 0) const; + ColorRGBA option_color(EMoveType move_type) const; +}; + +} // namespace GUI +} // namespace Slic3r + +#endif // slic3r_GCodeViewer_hpp_ diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 31bad66fda6..fbdb46d9f3d 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1,6775 +1,7357 @@ -#include "libslic3r/libslic3r.h" -#include "GLCanvas3D.hpp" - -#include - -#include "libslic3r/BuildVolume.hpp" -#include "libslic3r/ClipperUtils.hpp" -#include "libslic3r/PrintConfig.hpp" -#include "libslic3r/GCode/ThumbnailData.hpp" -#include "libslic3r/Geometry/ConvexHull.hpp" -#include "libslic3r/ExtrusionEntity.hpp" -#include "libslic3r/Layer.hpp" -#include "libslic3r/Utils.hpp" -#include "libslic3r/Technologies.hpp" -#include "libslic3r/Tesselate.hpp" -#include "libslic3r/PresetBundle.hpp" -#include "slic3r/GUI/3DBed.hpp" -#include "slic3r/GUI/3DScene.hpp" -#include "slic3r/GUI/BackgroundSlicingProcess.hpp" -#include "slic3r/GUI/GLShader.hpp" -#include "slic3r/GUI/GUI.hpp" -#include "slic3r/GUI/Tab.hpp" -#include "slic3r/GUI/GUI_Preview.hpp" -#include "slic3r/GUI/OpenGLManager.hpp" -#include "slic3r/GUI/Plater.hpp" -#include "slic3r/GUI/MainFrame.hpp" -#include "slic3r/Utils/UndoRedo.hpp" -#include "slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp" - -#include "GUI_App.hpp" -#include "GUI_ObjectList.hpp" -#include "GUI_ObjectManipulation.hpp" -#include "Mouse3DController.hpp" -#include "I18N.hpp" -#include "NotificationManager.hpp" -#include "format.hpp" - -#if ENABLE_RETINA_GL -#include "slic3r/Utils/RetinaHelper.hpp" -#endif - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -// Print now includes tbb, and tbb includes Windows. This breaks compilation of wxWidgets if included before wx. -#include "libslic3r/Print.hpp" -#include "libslic3r/SLAPrint.hpp" - -#include "wxExtensions.hpp" - -#include -#include - -#include -#include - -#include -#include -#include -#include -#include "DoubleSlider.hpp" - -#include - -static constexpr const float TRACKBALLSIZE = 0.8f; - -static constexpr const float DEFAULT_BG_DARK_COLOR[3] = { 0.478f, 0.478f, 0.478f }; -static constexpr const float DEFAULT_BG_LIGHT_COLOR[3] = { 0.753f, 0.753f, 0.753f }; -static constexpr const float ERROR_BG_DARK_COLOR[3] = { 0.478f, 0.192f, 0.039f }; -static constexpr const float ERROR_BG_LIGHT_COLOR[3] = { 0.753f, 0.192f, 0.039f }; -//static constexpr const float AXES_COLOR[3][3] = { { 1.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, { 0.0f, 0.0f, 1.0f } }; - -// Number of floats -static constexpr const size_t MAX_VERTEX_BUFFER_SIZE = 131072 * 6; // 3.15MB -// Reserve size in number of floats. -static constexpr const size_t VERTEX_BUFFER_RESERVE_SIZE = 131072 * 2; // 1.05MB -// Reserve size in number of floats, maximum sum of all preallocated buffers. -//static constexpr const size_t VERTEX_BUFFER_RESERVE_SIZE_SUM_MAX = 1024 * 1024 * 128 / 4; // 128MB - -namespace Slic3r { -namespace GUI { - -#ifdef __WXGTK3__ -// wxGTK3 seems to simulate OSX behavior in regard to HiDPI scaling support. -RetinaHelper::RetinaHelper(wxWindow* window) : m_window(window), m_self(nullptr) {} -RetinaHelper::~RetinaHelper() {} -float RetinaHelper::get_scale_factor() { return float(m_window->GetContentScaleFactor()); } -#endif // __WXGTK3__ - -// Fixed the collision between BuildVolume::Type::Convex and macro Convex defined inside /usr/include/X11/X.h that is included by WxWidgets 3.0. -#if defined(__linux__) && defined(Convex) -#undef Convex -#endif - -Size::Size() - : m_width(0) - , m_height(0) -{ -} - -Size::Size(int width, int height, float scale_factor) - : m_width(width) - , m_height(height) - , m_scale_factor(scale_factor) -{ -} - -int Size::get_width() const -{ - return m_width; -} - -void Size::set_width(int width) -{ - m_width = width; -} - -int Size::get_height() const -{ - return m_height; -} - -void Size::set_height(int height) -{ - m_height = height; -} - -int Size::get_scale_factor() const -{ - return m_scale_factor; -} - -void Size::set_scale_factor(int scale_factor) -{ - m_scale_factor = scale_factor; -} - -GLCanvas3D::LayersEditing::~LayersEditing() -{ - if (m_z_texture_id != 0) { - glsafe(::glDeleteTextures(1, &m_z_texture_id)); - m_z_texture_id = 0; - } - delete m_slicing_parameters; -} - -const float GLCanvas3D::LayersEditing::THICKNESS_BAR_WIDTH = 70.0f; - -void GLCanvas3D::LayersEditing::init() -{ - glsafe(::glGenTextures(1, (GLuint*)&m_z_texture_id)); - glsafe(::glBindTexture(GL_TEXTURE_2D, m_z_texture_id)); - glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)); - glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)); - glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); - glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST)); - glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1)); - glsafe(::glBindTexture(GL_TEXTURE_2D, 0)); -} - -void GLCanvas3D::LayersEditing::set_config(const DynamicPrintConfig* config) -{ - m_config = config; - delete m_slicing_parameters; - m_slicing_parameters = nullptr; - m_layers_texture.valid = false; -} - -void GLCanvas3D::LayersEditing::select_object(const Model &model, int object_id) -{ - const ModelObject *model_object_new = (object_id >= 0) ? model.objects[object_id] : nullptr; - // Maximum height of an object changes when the object gets rotated or scaled. - // Changing maximum height of an object will invalidate the layer heigth editing profile. - // m_model_object->bounding_box() is cached, therefore it is cheap even if this method is called frequently. - const float new_max_z = (model_object_new == nullptr) ? 0.0f : static_cast(model_object_new->bounding_box().max.z()); - if (m_model_object != model_object_new || this->last_object_id != object_id || m_object_max_z != new_max_z || - (model_object_new != nullptr && m_model_object->id() != model_object_new->id())) { - m_layer_height_profile.clear(); - m_layer_height_profile_modified = false; - delete m_slicing_parameters; - m_slicing_parameters = nullptr; - m_layers_texture.valid = false; - this->last_object_id = object_id; - m_model_object = model_object_new; - m_object_max_z = new_max_z; - } -} - -bool GLCanvas3D::LayersEditing::is_allowed() const -{ - return wxGetApp().get_shader("variable_layer_height") != nullptr && m_z_texture_id > 0; -} - -bool GLCanvas3D::LayersEditing::is_enabled() const -{ - return m_enabled; -} - -void GLCanvas3D::LayersEditing::set_enabled(bool enabled) -{ - m_enabled = is_allowed() && enabled; -} - -float GLCanvas3D::LayersEditing::s_overlay_window_width; - -void GLCanvas3D::LayersEditing::render_overlay(const GLCanvas3D& canvas) const -{ - if (!m_enabled) - return; - - const Size& cnv_size = canvas.get_canvas_size(); - - ImGuiWrapper& imgui = *wxGetApp().imgui(); - imgui.set_next_window_pos(static_cast(cnv_size.get_width()) - imgui.get_style_scaling() * THICKNESS_BAR_WIDTH, - static_cast(cnv_size.get_height()), ImGuiCond_Always, 1.0f, 1.0f); - - imgui.begin(_L("Variable layer height"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoCollapse); - - imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _L("Left mouse button:")); - ImGui::SameLine(); - imgui.text(_L("Add detail")); - - imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _L("Right mouse button:")); - ImGui::SameLine(); - imgui.text(_L("Remove detail")); - - imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _L("Shift + Left mouse button:")); - ImGui::SameLine(); - imgui.text(_L("Reset to base")); - - imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _L("Shift + Right mouse button:")); - ImGui::SameLine(); - imgui.text(_L("Smoothing")); - - imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _L("Mouse wheel:")); - ImGui::SameLine(); - imgui.text(_L("Increase/decrease edit area")); - - ImGui::Separator(); - if (imgui.button(_L("Adaptive"))) - wxPostEvent((wxEvtHandler*)canvas.get_wxglcanvas(), Event(EVT_GLCANVAS_ADAPTIVE_LAYER_HEIGHT_PROFILE, m_adaptive_quality)); - - ImGui::SameLine(); - float text_align = ImGui::GetCursorPosX(); - ImGui::AlignTextToFramePadding(); - imgui.text(_L("Quality / Speed")); - if (ImGui::IsItemHovered()) { - ImGui::BeginTooltip(); - ImGui::TextUnformatted(_L("Higher print quality versus higher print speed.").ToUTF8()); - ImGui::EndTooltip(); - } - - ImGui::SameLine(); - float widget_align = ImGui::GetCursorPosX(); - ImGui::PushItemWidth(imgui.get_style_scaling() * 120.0f); - m_adaptive_quality = std::clamp(m_adaptive_quality, 0.0f, 1.f); - imgui.slider_float("", &m_adaptive_quality, 0.0f, 1.f, "%.2f"); - - ImGui::Separator(); - if (imgui.button(_L("Smooth"))) - wxPostEvent((wxEvtHandler*)canvas.get_wxglcanvas(), HeightProfileSmoothEvent(EVT_GLCANVAS_SMOOTH_LAYER_HEIGHT_PROFILE, m_smooth_params)); - - ImGui::SameLine(); - ImGui::SetCursorPosX(text_align); - ImGui::AlignTextToFramePadding(); - imgui.text(_L("Radius")); - ImGui::SameLine(); - ImGui::SetCursorPosX(widget_align); - ImGui::PushItemWidth(imgui.get_style_scaling() * 120.0f); - int radius = (int)m_smooth_params.radius; - if (ImGui::SliderInt("##1", &radius, 1, 10)) { - radius = std::clamp(radius, 1, 10); - m_smooth_params.radius = (unsigned int)radius; - } - - ImGui::SetCursorPosX(text_align); - ImGui::AlignTextToFramePadding(); - imgui.text(_L("Keep min")); - ImGui::SameLine(); - if (ImGui::GetCursorPosX() < widget_align) // because of line lenght after localization - ImGui::SetCursorPosX(widget_align); - - ImGui::PushItemWidth(imgui.get_style_scaling() * 120.0f); - imgui.checkbox("##2", m_smooth_params.keep_min); - - ImGui::Separator(); - if (imgui.button(_L("Reset"))) - wxPostEvent((wxEvtHandler*)canvas.get_wxglcanvas(), SimpleEvent(EVT_GLCANVAS_RESET_LAYER_HEIGHT_PROFILE)); - - GLCanvas3D::LayersEditing::s_overlay_window_width = ImGui::GetWindowSize().x /*+ (float)m_layers_texture.width/4*/; - imgui.end(); - - const Rect& bar_rect = get_bar_rect_viewport(canvas); - render_active_object_annotations(canvas, bar_rect); - render_profile(bar_rect); -} - -float GLCanvas3D::LayersEditing::get_cursor_z_relative(const GLCanvas3D& canvas) -{ - const Vec2d mouse_pos = canvas.get_local_mouse_position(); - const Rect& rect = get_bar_rect_screen(canvas); - float x = (float)mouse_pos(0); - float y = (float)mouse_pos(1); - float t = rect.get_top(); - float b = rect.get_bottom(); - - return (rect.get_left() <= x && x <= rect.get_right() && t <= y && y <= b) ? - // Inside the bar. - (b - y - 1.0f) / (b - t - 1.0f) : - // Outside the bar. - -1000.0f; -} - -bool GLCanvas3D::LayersEditing::bar_rect_contains(const GLCanvas3D& canvas, float x, float y) -{ - const Rect& rect = get_bar_rect_screen(canvas); - return rect.get_left() <= x && x <= rect.get_right() && rect.get_top() <= y && y <= rect.get_bottom(); -} - -Rect GLCanvas3D::LayersEditing::get_bar_rect_screen(const GLCanvas3D& canvas) -{ - const Size& cnv_size = canvas.get_canvas_size(); - float w = (float)cnv_size.get_width(); - float h = (float)cnv_size.get_height(); - - return { w - thickness_bar_width(canvas), 0.0f, w, h }; -} - -Rect GLCanvas3D::LayersEditing::get_bar_rect_viewport(const GLCanvas3D& canvas) -{ - const Size& cnv_size = canvas.get_canvas_size(); - float half_w = 0.5f * (float)cnv_size.get_width(); - float half_h = 0.5f * (float)cnv_size.get_height(); - float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); - return { (half_w - thickness_bar_width(canvas)) * inv_zoom, half_h * inv_zoom, half_w * inv_zoom, -half_h * inv_zoom }; -} - -bool GLCanvas3D::LayersEditing::is_initialized() const -{ - return wxGetApp().get_shader("variable_layer_height") != nullptr; -} - -std::string GLCanvas3D::LayersEditing::get_tooltip(const GLCanvas3D& canvas) const -{ - std::string ret; - if (m_enabled && m_layer_height_profile.size() >= 4) { - float z = get_cursor_z_relative(canvas); - if (z != -1000.0f) { - z *= m_object_max_z; - - float h = 0.0f; - for (size_t i = m_layer_height_profile.size() - 2; i >= 2; i -= 2) { - const float zi = static_cast(m_layer_height_profile[i]); - const float zi_1 = static_cast(m_layer_height_profile[i - 2]); - if (zi_1 <= z && z <= zi) { - float dz = zi - zi_1; - h = (dz != 0.0f) ? static_cast(lerp(m_layer_height_profile[i - 1], m_layer_height_profile[i + 1], (z - zi_1) / dz)) : - static_cast(m_layer_height_profile[i + 1]); - break; - } - } - if (h > 0.0f) - ret = std::to_string(h); - } - } - return ret; -} - -void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3D& canvas, const Rect& bar_rect) const -{ - GLShaderProgram* shader = wxGetApp().get_shader("variable_layer_height"); - if (shader == nullptr) - return; - - shader->start_using(); - - shader->set_uniform("z_to_texture_row", float(m_layers_texture.cells - 1) / (float(m_layers_texture.width) * m_object_max_z)); - shader->set_uniform("z_texture_row_to_normalized", 1.0f / (float)m_layers_texture.height); - shader->set_uniform("z_cursor", m_object_max_z * this->get_cursor_z_relative(canvas)); - shader->set_uniform("z_cursor_band_width", band_width); - shader->set_uniform("object_max_z", m_object_max_z); - - glsafe(::glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); - glsafe(::glBindTexture(GL_TEXTURE_2D, m_z_texture_id)); - - // Render the color bar - const float l = bar_rect.get_left(); - const float r = bar_rect.get_right(); - const float t = bar_rect.get_top(); - const float b = bar_rect.get_bottom(); - - ::glBegin(GL_QUADS); - ::glNormal3f(0.0f, 0.0f, 1.0f); - ::glTexCoord2f(0.0f, 0.0f); ::glVertex2f(l, b); - ::glTexCoord2f(1.0f, 0.0f); ::glVertex2f(r, b); - ::glTexCoord2f(1.0f, 1.0f); ::glVertex2f(r, t); - ::glTexCoord2f(0.0f, 1.0f); ::glVertex2f(l, t); - glsafe(::glEnd()); - glsafe(::glBindTexture(GL_TEXTURE_2D, 0)); - - shader->stop_using(); -} - -void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) const -{ - //FIXME show some kind of legend. - - if (!m_slicing_parameters) - return; - - // Make the vertical bar a bit wider so the layer height curve does not touch the edge of the bar region. - float scale_x = bar_rect.get_width() / (float)(1.12 * m_slicing_parameters->max_layer_height); - float scale_y = bar_rect.get_height() / m_object_max_z; - float x = bar_rect.get_left() + (float)m_slicing_parameters->layer_height * scale_x; - - // Baseline - glsafe(::glColor3f(0.0f, 0.0f, 0.0f)); - ::glBegin(GL_LINE_STRIP); - ::glVertex2f(x, bar_rect.get_bottom()); - ::glVertex2f(x, bar_rect.get_top()); - glsafe(::glEnd()); - - // Curve - glsafe(::glColor3f(0.0f, 0.0f, 1.0f)); - ::glBegin(GL_LINE_STRIP); - for (unsigned int i = 0; i < m_layer_height_profile.size(); i += 2) - ::glVertex2f(bar_rect.get_left() + (float)m_layer_height_profile[i + 1] * scale_x, bar_rect.get_bottom() + (float)m_layer_height_profile[i] * scale_y); - glsafe(::glEnd()); -} - -void GLCanvas3D::LayersEditing::render_volumes(const GLCanvas3D& canvas, const GLVolumeCollection& volumes) -{ - assert(this->is_allowed()); - assert(this->last_object_id != -1); - GLShaderProgram* shader = wxGetApp().get_shader("variable_layer_height"); - if (shader == nullptr) - return; - - GLShaderProgram* current_shader = wxGetApp().get_current_shader(); - if (shader->get_id() != current_shader->get_id()) - // The layer editing shader is not yet active. Activate it. - shader->start_using(); - else - // The layer editing shader was already active. - current_shader = nullptr; - - generate_layer_height_texture(); - - // Uniforms were resolved, go ahead using the layer editing shader. - shader->set_uniform("z_to_texture_row", float(m_layers_texture.cells - 1) / (float(m_layers_texture.width) * float(m_object_max_z))); - shader->set_uniform("z_texture_row_to_normalized", 1.0f / float(m_layers_texture.height)); - shader->set_uniform("z_cursor", float(m_object_max_z) * float(this->get_cursor_z_relative(canvas))); - shader->set_uniform("z_cursor_band_width", float(this->band_width)); - - // Initialize the layer height texture mapping. - GLsizei w = (GLsizei)m_layers_texture.width; - GLsizei h = (GLsizei)m_layers_texture.height; - GLsizei half_w = w / 2; - GLsizei half_h = h / 2; - glsafe(::glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); - glsafe(::glBindTexture(GL_TEXTURE_2D, m_z_texture_id)); - glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0)); - glsafe(::glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, half_w, half_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0)); - glsafe(::glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, m_layers_texture.data.data())); - glsafe(::glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, half_w, half_h, GL_RGBA, GL_UNSIGNED_BYTE, m_layers_texture.data.data() + m_layers_texture.width * m_layers_texture.height * 4)); - for (const GLVolume* glvolume : volumes.volumes) { - // Render the object using the layer editing shader and texture. - if (! glvolume->is_active || glvolume->composite_id.object_id != this->last_object_id || glvolume->is_modifier) - continue; - - shader->set_uniform("volume_world_matrix", glvolume->world_matrix()); - shader->set_uniform("object_max_z", GLfloat(0)); - glvolume->render(); - } - // Revert back to the previous shader. - glBindTexture(GL_TEXTURE_2D, 0); - if (current_shader != nullptr) - current_shader->start_using(); -} - -void GLCanvas3D::LayersEditing::adjust_layer_height_profile() -{ - this->update_slicing_parameters(); - PrintObject::update_layer_height_profile(*m_model_object, *m_slicing_parameters, m_layer_height_profile); - Slic3r::adjust_layer_height_profile(*m_slicing_parameters, m_layer_height_profile, this->last_z, this->strength, this->band_width, this->last_action); - m_layer_height_profile_modified = true; - m_layers_texture.valid = false; -} - -void GLCanvas3D::LayersEditing::reset_layer_height_profile(GLCanvas3D& canvas) -{ - const_cast(m_model_object)->layer_height_profile.clear(); - m_layer_height_profile.clear(); - m_layers_texture.valid = false; - canvas.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); - wxGetApp().obj_list()->update_info_items(last_object_id); -} - -void GLCanvas3D::LayersEditing::adaptive_layer_height_profile(GLCanvas3D& canvas, float quality_factor) -{ - this->update_slicing_parameters(); - m_layer_height_profile = layer_height_profile_adaptive(*m_slicing_parameters, *m_model_object, quality_factor); - const_cast(m_model_object)->layer_height_profile.set(m_layer_height_profile); - m_layers_texture.valid = false; - canvas.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); - wxGetApp().obj_list()->update_info_items(last_object_id); -} - -void GLCanvas3D::LayersEditing::smooth_layer_height_profile(GLCanvas3D& canvas, const HeightProfileSmoothingParams& smoothing_params) -{ - this->update_slicing_parameters(); - m_layer_height_profile = smooth_height_profile(m_layer_height_profile, *m_slicing_parameters, smoothing_params); - const_cast(m_model_object)->layer_height_profile.set(m_layer_height_profile); - m_layers_texture.valid = false; - canvas.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); - wxGetApp().obj_list()->update_info_items(last_object_id); -} - -void GLCanvas3D::LayersEditing::generate_layer_height_texture() -{ - this->update_slicing_parameters(); - // Always try to update the layer height profile. - bool update = ! m_layers_texture.valid; - if (PrintObject::update_layer_height_profile(*m_model_object, *m_slicing_parameters, m_layer_height_profile)) { - // Initialized to the default value. - m_layer_height_profile_modified = false; - update = true; - } - // Update if the layer height profile was changed, or when the texture is not valid. - if (! update && ! m_layers_texture.data.empty() && m_layers_texture.cells > 0) - // Texture is valid, don't update. - return; - - if (m_layers_texture.data.empty()) { - m_layers_texture.width = 1024; - m_layers_texture.height = 1024; - m_layers_texture.levels = 2; - m_layers_texture.data.assign(m_layers_texture.width * m_layers_texture.height * 5, 0); - } - - bool level_of_detail_2nd_level = true; - m_layers_texture.cells = Slic3r::generate_layer_height_texture( - *m_slicing_parameters, - Slic3r::generate_object_layers(*m_slicing_parameters, m_layer_height_profile), - m_layers_texture.data.data(), m_layers_texture.height, m_layers_texture.width, level_of_detail_2nd_level); - m_layers_texture.valid = true; -} - -void GLCanvas3D::LayersEditing::accept_changes(GLCanvas3D& canvas) -{ - if (last_object_id >= 0) { - if (m_layer_height_profile_modified) { - wxGetApp().plater()->take_snapshot(_L("Variable layer height - Manual edit")); - const_cast(m_model_object)->layer_height_profile.set(m_layer_height_profile); - canvas.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); - wxGetApp().obj_list()->update_info_items(last_object_id); - } - } - m_layer_height_profile_modified = false; -} - -void GLCanvas3D::LayersEditing::update_slicing_parameters() -{ - if (m_slicing_parameters == nullptr) { - m_slicing_parameters = new SlicingParameters(); - *m_slicing_parameters = PrintObject::slicing_parameters(*m_config, *m_model_object, m_object_max_z); - } -} - -float GLCanvas3D::LayersEditing::thickness_bar_width(const GLCanvas3D &canvas) -{ - return -#if ENABLE_RETINA_GL - canvas.get_canvas_size().get_scale_factor() -#else - canvas.get_wxglcanvas()->GetContentScaleFactor() -#endif - * THICKNESS_BAR_WIDTH; -} - - -const Point GLCanvas3D::Mouse::Drag::Invalid_2D_Point(INT_MAX, INT_MAX); -const Vec3d GLCanvas3D::Mouse::Drag::Invalid_3D_Point(DBL_MAX, DBL_MAX, DBL_MAX); -const int GLCanvas3D::Mouse::Drag::MoveThresholdPx = 5; - -GLCanvas3D::Mouse::Drag::Drag() - : start_position_2D(Invalid_2D_Point) - , start_position_3D(Invalid_3D_Point) - , move_volume_idx(-1) - , move_requires_threshold(false) - , move_start_threshold_position_2D(Invalid_2D_Point) -{ -} - -GLCanvas3D::Mouse::Mouse() - : dragging(false) - , position(DBL_MAX, DBL_MAX) - , scene_position(DBL_MAX, DBL_MAX, DBL_MAX) - , ignore_left_up(false) -{ -} - -void GLCanvas3D::Labels::render(const std::vector& sorted_instances) const -{ - if (!m_enabled || !is_shown()) - return; - - const Camera& camera = wxGetApp().plater()->get_camera(); - const Model* model = m_canvas.get_model(); - if (model == nullptr) - return; - - Transform3d world_to_eye = camera.get_view_matrix(); - Transform3d world_to_screen = camera.get_projection_matrix() * world_to_eye; - const std::array& viewport = camera.get_viewport(); - - struct Owner - { - int obj_idx; - int inst_idx; - size_t model_instance_id; - BoundingBoxf3 world_box; - double eye_center_z; - std::string title; - std::string label; - std::string print_order; - bool selected; - }; - - // collect owners world bounding boxes and data from volumes - std::vector owners; - const GLVolumeCollection& volumes = m_canvas.get_volumes(); - for (const GLVolume* volume : volumes.volumes) { - int obj_idx = volume->object_idx(); - if (0 <= obj_idx && obj_idx < (int)model->objects.size()) { - int inst_idx = volume->instance_idx(); - std::vector::iterator it = std::find_if(owners.begin(), owners.end(), [obj_idx, inst_idx](const Owner& owner) { - return (owner.obj_idx == obj_idx) && (owner.inst_idx == inst_idx); - }); - if (it != owners.end()) { - it->world_box.merge(volume->transformed_bounding_box()); - it->selected &= volume->selected; - } else { - const ModelObject* model_object = model->objects[obj_idx]; - Owner owner; - owner.obj_idx = obj_idx; - owner.inst_idx = inst_idx; - owner.model_instance_id = model_object->instances[inst_idx]->id().id; - owner.world_box = volume->transformed_bounding_box(); - owner.title = "object" + std::to_string(obj_idx) + "_inst##" + std::to_string(inst_idx); - owner.label = model_object->name; - if (model_object->instances.size() > 1) - owner.label += " (" + std::to_string(inst_idx + 1) + ")"; - owner.selected = volume->selected; - owners.emplace_back(owner); - } - } - } - - // updates print order strings - if (sorted_instances.size() > 1) { - for (size_t i = 0; i < sorted_instances.size(); ++i) { - size_t id = sorted_instances[i]->id().id; - std::vector::iterator it = std::find_if(owners.begin(), owners.end(), [id](const Owner& owner) { - return owner.model_instance_id == id; - }); - if (it != owners.end()) - it->print_order = std::string((_(L("Seq."))).ToUTF8()) + "#: " + std::to_string(i + 1); - } - } - - // calculate eye bounding boxes center zs - for (Owner& owner : owners) { - owner.eye_center_z = (world_to_eye * owner.world_box.center())(2); - } - - // sort owners by center eye zs and selection - std::sort(owners.begin(), owners.end(), [](const Owner& owner1, const Owner& owner2) { - if (!owner1.selected && owner2.selected) - return true; - else if (owner1.selected && !owner2.selected) - return false; - else - return (owner1.eye_center_z < owner2.eye_center_z); - }); - - ImGuiWrapper& imgui = *wxGetApp().imgui(); - - // render info windows - for (const Owner& owner : owners) { - Vec3d screen_box_center = world_to_screen * owner.world_box.center(); - float x = 0.0f; - float y = 0.0f; - if (camera.get_type() == Camera::EType::Perspective) { - x = (0.5f + 0.001f * 0.5f * (float)screen_box_center(0)) * viewport[2]; - y = (0.5f - 0.001f * 0.5f * (float)screen_box_center(1)) * viewport[3]; - } else { - x = (0.5f + 0.5f * (float)screen_box_center(0)) * viewport[2]; - y = (0.5f - 0.5f * (float)screen_box_center(1)) * viewport[3]; - } - - if (x < 0.0f || viewport[2] < x || y < 0.0f || viewport[3] < y) - continue; - - ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, owner.selected ? 3.0f : 1.5f); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); - ImGui::PushStyleColor(ImGuiCol_Border, owner.selected ? ImVec4(0.757f, 0.404f, 0.216f, 1.0f) : ImVec4(0.75f, 0.75f, 0.75f, 1.0f)); - imgui.set_next_window_pos(x, y, ImGuiCond_Always, 0.5f, 0.5f); - imgui.begin(owner.title, ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove); - ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow()); - float win_w = ImGui::GetWindowWidth(); - float label_len = imgui.calc_text_size(owner.label).x; - ImGui::SetCursorPosX(0.5f * (win_w - label_len)); - ImGui::AlignTextToFramePadding(); - imgui.text(owner.label); - - if (!owner.print_order.empty()) { - ImGui::Separator(); - float po_len = imgui.calc_text_size(owner.print_order).x; - ImGui::SetCursorPosX(0.5f * (win_w - po_len)); - ImGui::AlignTextToFramePadding(); - imgui.text(owner.print_order); - } - - // force re-render while the windows gets to its final size (it takes several frames) - if (ImGui::GetWindowContentRegionWidth() + 2.0f * ImGui::GetStyle().WindowPadding.x != ImGui::CalcWindowNextAutoFitSize(ImGui::GetCurrentWindow()).x) - imgui.set_requires_extra_frame(); - - imgui.end(); - ImGui::PopStyleColor(); - ImGui::PopStyleVar(2); - } -} - -void GLCanvas3D::Tooltip::set_text(const std::string& text) -{ - // If the mouse is inside an ImGUI dialog, then the tooltip is suppressed. - m_text = m_in_imgui ? std::string() : text; -} - -void GLCanvas3D::Tooltip::render(const Vec2d& mouse_position, GLCanvas3D& canvas) -{ - static ImVec2 size(0.0f, 0.0f); - - auto validate_position = [](const Vec2d& position, const GLCanvas3D& canvas, const ImVec2& wnd_size) { - const Size cnv_size = canvas.get_canvas_size(); - const float x = std::clamp((float)position.x(), 0.0f, (float)cnv_size.get_width() - wnd_size.x); - const float y = std::clamp((float)position.y() + 16.0f, 0.0f, (float)cnv_size.get_height() - wnd_size.y); - return Vec2f(x, y); - }; - - if (m_text.empty()) { - m_start_time = std::chrono::steady_clock::now(); - return; - } - - // draw the tooltip as hidden until the delay is expired - // use a value of alpha slightly different from 0.0f because newer imgui does not calculate properly the window size if alpha == 0.0f - const float alpha = (std::chrono::duration_cast(std::chrono::steady_clock::now() - m_start_time).count() < 500) ? 0.01f : 1.0f; - - const Vec2f position = validate_position(mouse_position, canvas, size); - - ImGuiWrapper& imgui = *wxGetApp().imgui(); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); - ImGui::PushStyleVar(ImGuiStyleVar_Alpha, alpha); - imgui.set_next_window_pos(position.x(), position.y(), ImGuiCond_Always, 0.0f, 0.0f); - - imgui.begin(wxString("canvas_tooltip"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoFocusOnAppearing); - ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow()); - ImGui::TextUnformatted(m_text.c_str()); - - // force re-render while the windows gets to its final size (it may take several frames) or while hidden - if (alpha < 1.0f || ImGui::GetWindowContentRegionWidth() + 2.0f * ImGui::GetStyle().WindowPadding.x != ImGui::CalcWindowNextAutoFitSize(ImGui::GetCurrentWindow()).x) - imgui.set_requires_extra_frame(); - - size = ImGui::GetWindowSize(); - - imgui.end(); - ImGui::PopStyleVar(2); -} - -void GLCanvas3D::SequentialPrintClearance::set_polygons(const Polygons& polygons) -{ - m_perimeter.reset(); - m_fill.reset(); - if (polygons.empty()) - return; - - size_t triangles_count = 0; - for (const Polygon& poly : polygons) { - triangles_count += poly.points.size() - 2; - } - const size_t vertices_count = 3 * triangles_count; - - if (m_render_fill) { - GLModel::InitializationData fill_data; - GLModel::InitializationData::Entity entity; - entity.type = GLModel::PrimitiveType::Triangles; - entity.color = { 0.3333f, 0.0f, 0.0f, 0.5f }; - entity.positions.reserve(vertices_count); - entity.normals.reserve(vertices_count); - entity.indices.reserve(vertices_count); - - const ExPolygons polygons_union = union_ex(polygons); - for (const ExPolygon& poly : polygons_union) { - const std::vector triangulation = triangulate_expolygon_3d(poly); - for (const Vec3d& v : triangulation) { - entity.positions.emplace_back(v.cast() + Vec3f(0.0f, 0.0f, 0.0125f)); // add a small positive z to avoid z-fighting - entity.normals.emplace_back(Vec3f::UnitZ()); - const size_t positions_count = entity.positions.size(); - if (positions_count % 3 == 0) { - entity.indices.emplace_back(positions_count - 3); - entity.indices.emplace_back(positions_count - 2); - entity.indices.emplace_back(positions_count - 1); - } - } - } - - fill_data.entities.emplace_back(entity); - m_fill.init_from(fill_data); - } - - GLModel::InitializationData perimeter_data; - for (const Polygon& poly : polygons) { - GLModel::InitializationData::Entity ent; - ent.type = GLModel::PrimitiveType::LineLoop; - ent.positions.reserve(poly.points.size()); - ent.indices.reserve(poly.points.size()); - unsigned int id_count = 0; - for (const Point& p : poly.points) { - ent.positions.emplace_back(unscale(p.x()), unscale(p.y()), 0.025f); // add a small positive z to avoid z-fighting - ent.normals.emplace_back(Vec3f::UnitZ()); - ent.indices.emplace_back(id_count++); - } - - perimeter_data.entities.emplace_back(ent); - } - - m_perimeter.init_from(perimeter_data); -} - -void GLCanvas3D::SequentialPrintClearance::render() -{ - std::array FILL_COLOR = { 1.0f, 0.0f, 0.0f, 0.5f }; - std::array NO_FILL_COLOR = { 1.0f, 1.0f, 1.0f, 0.75f }; - - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); - if (shader == nullptr) - return; - - shader->start_using(); - - glsafe(::glEnable(GL_DEPTH_TEST)); - glsafe(::glDisable(GL_CULL_FACE)); - glsafe(::glEnable(GL_BLEND)); - glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); - - m_perimeter.set_color(-1, m_render_fill ? FILL_COLOR : NO_FILL_COLOR); - m_perimeter.render(); - m_fill.render(); - - glsafe(::glDisable(GL_BLEND)); - glsafe(::glEnable(GL_CULL_FACE)); - glsafe(::glDisable(GL_DEPTH_TEST)); - - shader->stop_using(); -} - -wxDEFINE_EVENT(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS, SimpleEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_OBJECT_SELECT, SimpleEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_RIGHT_CLICK, RBtnEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_REMOVE_OBJECT, SimpleEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_ARRANGE, SimpleEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_SELECT_ALL, SimpleEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_QUESTION_MARK, SimpleEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_INCREASE_INSTANCES, Event); -wxDEFINE_EVENT(EVT_GLCANVAS_INSTANCE_MOVED, SimpleEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_INSTANCE_ROTATED, SimpleEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_INSTANCE_SCALED, SimpleEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_FORCE_UPDATE, SimpleEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_WIPETOWER_MOVED, Vec3dEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_WIPETOWER_ROTATED, Vec3dEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, Event); -wxDEFINE_EVENT(EVT_GLCANVAS_UPDATE_GEOMETRY, Vec3dsEvent<2>); -wxDEFINE_EVENT(EVT_GLCANVAS_MOUSE_DRAGGING_STARTED, SimpleEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED, SimpleEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_UPDATE_BED_SHAPE, SimpleEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_TAB, SimpleEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_RESETGIZMOS, SimpleEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_MOVE_SLIDERS, wxKeyEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_EDIT_COLOR_CHANGE, wxKeyEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_JUMP_TO, wxKeyEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_UNDO, SimpleEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_REDO, SimpleEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_COLLAPSE_SIDEBAR, SimpleEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_RESET_LAYER_HEIGHT_PROFILE, SimpleEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_ADAPTIVE_LAYER_HEIGHT_PROFILE, Event); -wxDEFINE_EVENT(EVT_GLCANVAS_SMOOTH_LAYER_HEIGHT_PROFILE, HeightProfileSmoothEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_RELOAD_FROM_DISK, SimpleEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_RENDER_TIMER, wxTimerEvent/*RenderTimerEvent*/); -wxDEFINE_EVENT(EVT_GLCANVAS_TOOLBAR_HIGHLIGHTER_TIMER, wxTimerEvent); -wxDEFINE_EVENT(EVT_GLCANVAS_GIZMO_HIGHLIGHTER_TIMER, wxTimerEvent); - -const double GLCanvas3D::DefaultCameraZoomToBoxMarginFactor = 1.25; - -void GLCanvas3D::load_arrange_settings() -{ - std::string dist_fff_str = - wxGetApp().app_config->get("arrange", "min_object_distance_fff"); - - std::string dist_fff_seq_print_str = - wxGetApp().app_config->get("arrange", "min_object_distance_fff_seq_print"); - - std::string dist_sla_str = - wxGetApp().app_config->get("arrange", "min_object_distance_sla"); - - std::string en_rot_fff_str = - wxGetApp().app_config->get("arrange", "enable_rotation_fff"); - - std::string en_rot_fff_seqp_str = - wxGetApp().app_config->get("arrange", "enable_rotation_fff_seq_print"); - - std::string en_rot_sla_str = - wxGetApp().app_config->get("arrange", "enable_rotation_sla"); - -// std::string alignment_fff_str = -// wxGetApp().app_config->get("arrange", "alignment_fff"); - -// std::string alignment_fff_seqp_str = -// wxGetApp().app_config->get("arrange", "alignment_fff_seq_pring"); - -// std::string alignment_sla_str = -// wxGetApp().app_config->get("arrange", "alignment_sla"); - - // Override default alignment and save save/load it to a temporary slot "alignment_xl" - std::string alignment_xl_str = - wxGetApp().app_config->get("arrange", "alignment_xl"); - - if (!dist_fff_str.empty()) - m_arrange_settings_fff.distance = std::stof(dist_fff_str); - - if (!dist_fff_seq_print_str.empty()) - m_arrange_settings_fff_seq_print.distance = std::stof(dist_fff_seq_print_str); - - if (!dist_sla_str.empty()) - m_arrange_settings_sla.distance = std::stof(dist_sla_str); - - if (!en_rot_fff_str.empty()) - m_arrange_settings_fff.enable_rotation = (en_rot_fff_str == "1" || en_rot_fff_str == "yes"); - - if (!en_rot_fff_seqp_str.empty()) - m_arrange_settings_fff_seq_print.enable_rotation = (en_rot_fff_seqp_str == "1" || en_rot_fff_seqp_str == "yes"); - - if (!en_rot_sla_str.empty()) - m_arrange_settings_sla.enable_rotation = (en_rot_sla_str == "1" || en_rot_sla_str == "yes"); - -// if (!alignment_sla_str.empty()) -// m_arrange_settings_sla.alignment = std::stoi(alignment_sla_str); - -// if (!alignment_fff_str.empty()) -// m_arrange_settings_fff.alignment = std::stoi(alignment_fff_str); - -// if (!alignment_fff_seqp_str.empty()) -// m_arrange_settings_fff_seq_print.alignment = std::stoi(alignment_fff_seqp_str); - - // Override default alignment and save save/load it to a temporary slot "alignment_xl" - int arr_alignment = static_cast(arrangement::Pivots::BottomLeft); - if (!alignment_xl_str.empty()) - arr_alignment = std::stoi(alignment_xl_str); - - m_arrange_settings_sla.alignment = arr_alignment ; - m_arrange_settings_fff.alignment = arr_alignment ; - m_arrange_settings_fff_seq_print.alignment = arr_alignment ; -} - -PrinterTechnology GLCanvas3D::current_printer_technology() const -{ - return m_process->current_printer_technology(); -} - -bool GLCanvas3D::is_arrange_alignment_enabled() const -{ - return m_config ? is_XL_printer(*m_config) : false; -} - -GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D &bed) - : m_canvas(canvas) - , m_context(nullptr) - , m_bed(bed) -#if ENABLE_RETINA_GL - , m_retina_helper(nullptr) -#endif - , m_in_render(false) - , m_main_toolbar(GLToolbar::Normal, "Main") - , m_undoredo_toolbar(GLToolbar::Normal, "Undo_Redo") - , m_gizmos(*this) - , m_use_clipping_planes(false) - , m_sidebar_field("") - , m_extra_frame_requested(false) - , m_config(nullptr) - , m_process(nullptr) - , m_model(nullptr) - , m_dirty(true) - , m_initialized(false) - , m_apply_zoom_to_volumes_filter(false) - , m_picking_enabled(false) - , m_moving_enabled(false) - , m_dynamic_background_enabled(false) - , m_multisample_allowed(false) - , m_moving(false) - , m_tab_down(false) - , m_cursor_type(Standard) - , m_color_by("volume") - , m_reload_delayed(false) -#if ENABLE_RENDER_PICKING_PASS - , m_show_picking_texture(false) -#endif // ENABLE_RENDER_PICKING_PASS - , m_render_sla_auxiliaries(true) - , m_labels(*this) - , m_slope(m_volumes) -{ - if (m_canvas != nullptr) { - m_timer.SetOwner(m_canvas); - m_render_timer.SetOwner(m_canvas); -#if ENABLE_RETINA_GL - m_retina_helper.reset(new RetinaHelper(canvas)); -#endif // ENABLE_RETINA_GL - } - - load_arrange_settings(); - - m_selection.set_volumes(&m_volumes.volumes); -} - -GLCanvas3D::~GLCanvas3D() -{ - reset_volumes(); -} - -void GLCanvas3D::post_event(wxEvent &&event) -{ - event.SetEventObject(m_canvas); - wxPostEvent(m_canvas, event); -} - -bool GLCanvas3D::init() -{ - if (m_initialized) - return true; - - if (m_canvas == nullptr || m_context == nullptr) - return false; - - glsafe(::glClearColor(1.0f, 1.0f, 1.0f, 1.0f)); - glsafe(::glClearDepth(1.0f)); - - glsafe(::glDepthFunc(GL_LESS)); - - glsafe(::glEnable(GL_DEPTH_TEST)); - glsafe(::glEnable(GL_CULL_FACE)); - glsafe(::glEnable(GL_BLEND)); - glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); - - // Set antialiasing / multisampling - glsafe(::glDisable(GL_LINE_SMOOTH)); - glsafe(::glDisable(GL_POLYGON_SMOOTH)); - - // ambient lighting - GLfloat ambient[4] = { 0.3f, 0.3f, 0.3f, 1.0f }; - glsafe(::glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient)); - - glsafe(::glEnable(GL_LIGHT0)); - glsafe(::glEnable(GL_LIGHT1)); - - // light from camera - GLfloat specular_cam[4] = { 0.3f, 0.3f, 0.3f, 1.0f }; - glsafe(::glLightfv(GL_LIGHT1, GL_SPECULAR, specular_cam)); - GLfloat diffuse_cam[4] = { 0.2f, 0.2f, 0.2f, 1.0f }; - glsafe(::glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse_cam)); - - // light from above - GLfloat specular_top[4] = { 0.2f, 0.2f, 0.2f, 1.0f }; - glsafe(::glLightfv(GL_LIGHT0, GL_SPECULAR, specular_top)); - GLfloat diffuse_top[4] = { 0.5f, 0.5f, 0.5f, 1.0f }; - glsafe(::glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse_top)); - - // Enables Smooth Color Shading; try GL_FLAT for (lack of) fun. - glsafe(::glShadeModel(GL_SMOOTH)); - - // A handy trick -- have surface material mirror the color. - glsafe(::glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE)); - glsafe(::glEnable(GL_COLOR_MATERIAL)); - - if (m_multisample_allowed) - glsafe(::glEnable(GL_MULTISAMPLE)); - - if (m_main_toolbar.is_enabled()) - m_layers_editing.init(); - - // on linux the gl context is not valid until the canvas is not shown on screen - // we defer the geometry finalization of volumes until the first call to render() - m_volumes.finalize_geometry(true); - - if (m_gizmos.is_enabled() && !m_gizmos.init()) - std::cout << "Unable to initialize gizmos: please, check that all the required textures are available" << std::endl; - - if (!_init_toolbars()) - return false; - - if (m_selection.is_enabled() && !m_selection.init()) - return false; - - m_initialized = true; - - return true; -} - -void GLCanvas3D::set_as_dirty() -{ - m_dirty = true; -} - -unsigned int GLCanvas3D::get_volumes_count() const -{ - return (unsigned int)m_volumes.volumes.size(); -} - -void GLCanvas3D::reset_volumes() -{ - if (!m_initialized) - return; - - if (m_volumes.empty()) - return; - - _set_current(); - - m_selection.clear(); - m_volumes.clear(); - m_dirty = true; - - _set_warning_notification(EWarning::ObjectOutside, false); -} - -ModelInstanceEPrintVolumeState GLCanvas3D::check_volumes_outside_state() const -{ - ModelInstanceEPrintVolumeState state = ModelInstanceEPrintVolumeState::ModelInstancePVS_Inside; - if (m_initialized) - m_volumes.check_outside_state(m_bed.build_volume(), &state); - return state; -} - -void GLCanvas3D::toggle_sla_auxiliaries_visibility(bool visible, const ModelObject* mo, int instance_idx) -{ - m_render_sla_auxiliaries = visible; - - for (GLVolume* vol : m_volumes.volumes) { - if (vol->composite_id.object_id == 1000) - continue; // the wipe tower - if ((mo == nullptr || m_model->objects[vol->composite_id.object_id] == mo) - && (instance_idx == -1 || vol->composite_id.instance_id == instance_idx) - && vol->composite_id.volume_id < 0) - vol->is_active = visible; - } -} - -void GLCanvas3D::toggle_model_objects_visibility(bool visible, const ModelObject* mo, int instance_idx, const ModelVolume* mv) -{ - for (GLVolume* vol : m_volumes.volumes) { - if (vol->composite_id.object_id == 1000) { // wipe tower - vol->is_active = (visible && mo == nullptr); - } - else { - if ((mo == nullptr || m_model->objects[vol->composite_id.object_id] == mo) - && (instance_idx == -1 || vol->composite_id.instance_id == instance_idx) - && (mv == nullptr || m_model->objects[vol->composite_id.object_id]->volumes[vol->composite_id.volume_id] == mv)) { - vol->is_active = visible; - - if (instance_idx == -1) { - vol->force_native_color = false; - vol->force_neutral_color = false; - } else { - const GLGizmosManager& gm = get_gizmos_manager(); - auto gizmo_type = gm.get_current_type(); - if ( (gizmo_type == GLGizmosManager::FdmSupports - || gizmo_type == GLGizmosManager::Seam) - && ! vol->is_modifier) - vol->force_neutral_color = true; - else if (gizmo_type == GLGizmosManager::MmuSegmentation) - vol->is_active = false; - else - vol->force_native_color = true; - } - } - } - } - if (visible && !mo) - toggle_sla_auxiliaries_visibility(true, mo, instance_idx); - - if (!mo && !visible && !m_model->objects.empty() && (m_model->objects.size() > 1 || m_model->objects.front()->instances.size() > 1)) - _set_warning_notification(EWarning::SomethingNotShown, true); - - if (!mo && visible) - _set_warning_notification(EWarning::SomethingNotShown, false); -} - -void GLCanvas3D::update_instance_printable_state_for_object(const size_t obj_idx) -{ - ModelObject* model_object = m_model->objects[obj_idx]; - for (int inst_idx = 0; inst_idx < (int)model_object->instances.size(); ++inst_idx) { - ModelInstance* instance = model_object->instances[inst_idx]; - - for (GLVolume* volume : m_volumes.volumes) { - if ((volume->object_idx() == (int)obj_idx) && (volume->instance_idx() == inst_idx)) - volume->printable = instance->printable; - } - } -} - -void GLCanvas3D::update_instance_printable_state_for_objects(const std::vector& object_idxs) -{ - for (size_t obj_idx : object_idxs) - update_instance_printable_state_for_object(obj_idx); -} - -void GLCanvas3D::set_config(const DynamicPrintConfig* config) -{ - m_config = config; - m_layers_editing.set_config(config); -} - -void GLCanvas3D::set_process(BackgroundSlicingProcess *process) -{ - m_process = process; -} - -void GLCanvas3D::set_model(Model* model) -{ - m_model = model; - m_selection.set_model(m_model); -} - -void GLCanvas3D::bed_shape_changed() -{ - refresh_camera_scene_box(); - wxGetApp().plater()->get_camera().requires_zoom_to_bed = true; - m_dirty = true; -} - -void GLCanvas3D::set_color_by(const std::string& value) -{ - m_color_by = value; -} - -void GLCanvas3D::refresh_camera_scene_box() -{ - wxGetApp().plater()->get_camera().set_scene_box(scene_bounding_box()); -} - -BoundingBoxf3 GLCanvas3D::volumes_bounding_box() const -{ - BoundingBoxf3 bb; - for (const GLVolume* volume : m_volumes.volumes) { - if (!m_apply_zoom_to_volumes_filter || ((volume != nullptr) && volume->zoom_to_volumes)) - bb.merge(volume->transformed_bounding_box()); - } - return bb; -} - -BoundingBoxf3 GLCanvas3D::scene_bounding_box() const -{ - BoundingBoxf3 bb = volumes_bounding_box(); - bb.merge(m_bed.extended_bounding_box()); - double h = m_bed.build_volume().max_print_height(); - //FIXME why -h? - bb.min.z() = std::min(bb.min.z(), -h); - bb.max.z() = std::max(bb.max.z(), h); - return bb; -} - -bool GLCanvas3D::is_layers_editing_enabled() const -{ - return m_layers_editing.is_enabled(); -} - -bool GLCanvas3D::is_layers_editing_allowed() const -{ - return m_layers_editing.is_allowed(); -} - -void GLCanvas3D::reset_layer_height_profile() -{ - wxGetApp().plater()->take_snapshot(_L("Variable layer height - Reset")); - m_layers_editing.reset_layer_height_profile(*this); - m_layers_editing.state = LayersEditing::Completed; - m_dirty = true; -} - -void GLCanvas3D::adaptive_layer_height_profile(float quality_factor) -{ - wxGetApp().plater()->take_snapshot(_L("Variable layer height - Adaptive")); - m_layers_editing.adaptive_layer_height_profile(*this, quality_factor); - m_layers_editing.state = LayersEditing::Completed; - m_dirty = true; -} - -void GLCanvas3D::smooth_layer_height_profile(const HeightProfileSmoothingParams& smoothing_params) -{ - wxGetApp().plater()->take_snapshot(_L("Variable layer height - Smooth all")); - m_layers_editing.smooth_layer_height_profile(*this, smoothing_params); - m_layers_editing.state = LayersEditing::Completed; - m_dirty = true; -} - -bool GLCanvas3D::is_reload_delayed() const -{ - return m_reload_delayed; -} - -void GLCanvas3D::enable_layers_editing(bool enable) -{ - m_layers_editing.set_enabled(enable); - set_as_dirty(); -} - -void GLCanvas3D::enable_legend_texture(bool enable) -{ - m_gcode_viewer.enable_legend(enable); -} - -void GLCanvas3D::enable_picking(bool enable) -{ - m_picking_enabled = enable; - m_selection.set_mode(Selection::Instance); -} - -void GLCanvas3D::enable_moving(bool enable) -{ - m_moving_enabled = enable; -} - -void GLCanvas3D::enable_gizmos(bool enable) -{ - m_gizmos.set_enabled(enable); -} - -void GLCanvas3D::enable_selection(bool enable) -{ - m_selection.set_enabled(enable); -} - -void GLCanvas3D::enable_main_toolbar(bool enable) -{ - m_main_toolbar.set_enabled(enable); -} - -void GLCanvas3D::enable_undoredo_toolbar(bool enable) -{ - m_undoredo_toolbar.set_enabled(enable); -} - -void GLCanvas3D::enable_dynamic_background(bool enable) -{ - m_dynamic_background_enabled = enable; -} - -void GLCanvas3D::allow_multisample(bool allow) -{ - m_multisample_allowed = allow; -} - -void GLCanvas3D::zoom_to_bed() -{ - BoundingBoxf3 box = m_bed.build_volume().bounding_volume(); - box.min.z() = 0.0; - box.max.z() = 0.0; - _zoom_to_box(box); -} - -void GLCanvas3D::zoom_to_volumes() -{ - m_apply_zoom_to_volumes_filter = true; - _zoom_to_box(volumes_bounding_box()); - m_apply_zoom_to_volumes_filter = false; -} - -void GLCanvas3D::zoom_to_selection() -{ - if (!m_selection.is_empty()) - _zoom_to_box(m_selection.get_bounding_box()); -} - -void GLCanvas3D::zoom_to_gcode() -{ - _zoom_to_box(m_gcode_viewer.get_paths_bounding_box(), 1.05); -} - -void GLCanvas3D::select_view(const std::string& direction) -{ - wxGetApp().plater()->get_camera().select_view(direction); - if (m_canvas != nullptr) - m_canvas->Refresh(); -} - -void GLCanvas3D::update_volumes_colors_by_extruder() -{ - if (m_config != nullptr) - m_volumes.update_colors_by_extruder(m_config); -} - -void GLCanvas3D::render() -{ - if (m_in_render) { - // if called recursively, return - m_dirty = true; - return; - } - - m_in_render = true; - Slic3r::ScopeGuard in_render_guard([this]() { m_in_render = false; }); - (void)in_render_guard; - - if (m_canvas == nullptr) - return; - - // ensures this canvas is current and initialized - if (!_is_shown_on_screen() || !_set_current() || !wxGetApp().init_opengl()) - return; - - if (!is_initialized() && !init()) - return; - - if (!m_main_toolbar.is_enabled()) - m_gcode_viewer.init(); - - if (! m_bed.build_volume().valid()) { - // this happens at startup when no data is still saved under <>\AppData\Roaming\Slic3rPE - post_event(SimpleEvent(EVT_GLCANVAS_UPDATE_BED_SHAPE)); - return; - } - -#if ENABLE_ENVIRONMENT_MAP - if (wxGetApp().is_editor()) - wxGetApp().plater()->init_environment_texture(); -#endif // ENABLE_ENVIRONMENT_MAP - - const Size& cnv_size = get_canvas_size(); - // Probably due to different order of events on Linux/GTK2, when one switched from 3D scene - // to preview, this was called before canvas had its final size. It reported zero width - // and the viewport was set incorrectly, leading to tripping glAsserts further down - // the road (in apply_projection). That's why the minimum size is forced to 10. - Camera& camera = wxGetApp().plater()->get_camera(); - camera.apply_viewport(0, 0, std::max(10u, (unsigned int)cnv_size.get_width()), std::max(10u, (unsigned int)cnv_size.get_height())); - - if (camera.requires_zoom_to_bed) { - zoom_to_bed(); - _resize((unsigned int)cnv_size.get_width(), (unsigned int)cnv_size.get_height()); - camera.requires_zoom_to_bed = false; - } - - camera.apply_view_matrix(); - camera.apply_projection(_max_bounding_box(true, true)); - - GLfloat position_cam[4] = { 1.0f, 0.0f, 1.0f, 0.0f }; - glsafe(::glLightfv(GL_LIGHT1, GL_POSITION, position_cam)); - GLfloat position_top[4] = { -0.5f, -0.5f, 1.0f, 0.0f }; - glsafe(::glLightfv(GL_LIGHT0, GL_POSITION, position_top)); - - wxGetApp().imgui()->new_frame(); - - if (m_picking_enabled) { - if (m_rectangle_selection.is_dragging()) - // picking pass using rectangle selection - _rectangular_selection_picking_pass(); - else if (!m_volumes.empty()) - // regular picking pass - _picking_pass(); - } - -#if ENABLE_RENDER_PICKING_PASS - if (!m_picking_enabled || !m_show_picking_texture) { -#endif // ENABLE_RENDER_PICKING_PASS - // draw scene - glsafe(::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); - _render_background(); - - _render_objects(GLVolumeCollection::ERenderType::Opaque); - if (!m_main_toolbar.is_enabled()) - _render_gcode(); - _render_sla_slices(); - _render_selection(); - _render_bed(!camera.is_looking_downward(), true); - _render_objects(GLVolumeCollection::ERenderType::Transparent); - - _render_sequential_clearance(); -#if ENABLE_RENDER_SELECTION_CENTER - _render_selection_center(); -#endif // ENABLE_RENDER_SELECTION_CENTER - - // we need to set the mouse's scene position here because the depth buffer - // could be invalidated by the following gizmo render methods - // this position is used later into on_mouse() to drag the objects - if (m_picking_enabled) - m_mouse.scene_position = _mouse_to_3d(m_mouse.position.cast()); - - // sidebar hints need to be rendered before the gizmos because the depth buffer - // could be invalidated by the following gizmo render methods - _render_selection_sidebar_hints(); - _render_current_gizmo(); -#if ENABLE_RENDER_PICKING_PASS - } -#endif // ENABLE_RENDER_PICKING_PASS - -#if ENABLE_SHOW_CAMERA_TARGET - _render_camera_target(); -#endif // ENABLE_SHOW_CAMERA_TARGET - - if (m_picking_enabled && m_rectangle_selection.is_dragging()) - m_rectangle_selection.render(*this); - - // draw overlays - _render_overlays(); - - if (wxGetApp().plater()->is_render_statistic_dialog_visible()) { - ImGuiWrapper& imgui = *wxGetApp().imgui(); - imgui.begin(std::string("Render statistics"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); - imgui.text("FPS (SwapBuffers() calls per second):"); - ImGui::SameLine(); - imgui.text(std::to_string(m_render_stats.get_fps_and_reset_if_needed())); - ImGui::Separator(); - imgui.text("Compressed textures:"); - ImGui::SameLine(); - imgui.text(OpenGLManager::are_compressed_textures_supported() ? "supported" : "not supported"); - imgui.text("Max texture size:"); - ImGui::SameLine(); - imgui.text(std::to_string(OpenGLManager::get_gl_info().get_max_tex_size())); - imgui.end(); - } - -#if ENABLE_PROJECT_DIRTY_STATE_DEBUG_WINDOW - if (wxGetApp().is_editor() && wxGetApp().plater()->is_view3D_shown()) - wxGetApp().plater()->render_project_state_debug_window(); -#endif // ENABLE_PROJECT_DIRTY_STATE_DEBUG_WINDOW - -#if ENABLE_CAMERA_STATISTICS - camera.debug_render(); -#endif // ENABLE_CAMERA_STATISTICS - - std::string tooltip; - - // Negative coordinate means out of the window, likely because the window was deactivated. - // In that case the tooltip should be hidden. - if (m_mouse.position.x() >= 0. && m_mouse.position.y() >= 0.) { - if (tooltip.empty()) - tooltip = m_layers_editing.get_tooltip(*this); - - if (tooltip.empty()) - tooltip = m_gizmos.get_tooltip(); - - if (tooltip.empty()) - tooltip = m_main_toolbar.get_tooltip(); - - if (tooltip.empty()) - tooltip = m_undoredo_toolbar.get_tooltip(); - - if (tooltip.empty()) - tooltip = wxGetApp().plater()->get_collapse_toolbar().get_tooltip(); - - if (tooltip.empty()) - tooltip = wxGetApp().plater()->get_view_toolbar().get_tooltip(); - } - - set_tooltip(tooltip); - - if (m_tooltip_enabled) - m_tooltip.render(m_mouse.position, *this); - - wxGetApp().plater()->get_mouse3d_controller().render_settings_dialog(*this); - - wxGetApp().plater()->get_notification_manager()->render_notifications(*this, get_overlay_window_width()); - - wxGetApp().imgui()->render(); - - m_canvas->SwapBuffers(); - m_render_stats.increment_fps_counter(); -} - -void GLCanvas3D::render_thumbnail(ThumbnailData& thumbnail_data, unsigned int w, unsigned int h, const ThumbnailsParams& thumbnail_params, Camera::EType camera_type) -{ - render_thumbnail(thumbnail_data, w, h, thumbnail_params, m_volumes, camera_type); -} - -void GLCanvas3D::render_thumbnail(ThumbnailData& thumbnail_data, unsigned int w, unsigned int h, const ThumbnailsParams& thumbnail_params, const GLVolumeCollection& volumes, Camera::EType camera_type) -{ - switch (OpenGLManager::get_framebuffers_type()) - { - case OpenGLManager::EFramebufferType::Arb: { _render_thumbnail_framebuffer(thumbnail_data, w, h, thumbnail_params, volumes, camera_type); break; } - case OpenGLManager::EFramebufferType::Ext: { _render_thumbnail_framebuffer_ext(thumbnail_data, w, h, thumbnail_params, volumes, camera_type); break; } - default: { _render_thumbnail_legacy(thumbnail_data, w, h, thumbnail_params, volumes, camera_type); break; } - } -} - -void GLCanvas3D::select_all() -{ - m_selection.add_all(); - m_dirty = true; - wxGetApp().obj_manipul()->set_dirty(); - m_gizmos.reset_all_states(); - m_gizmos.update_data(); - post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT)); -} - -void GLCanvas3D::deselect_all() -{ - m_selection.remove_all(); - wxGetApp().obj_manipul()->set_dirty(); - m_gizmos.reset_all_states(); - m_gizmos.update_data(); - post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT)); -} - -void GLCanvas3D::delete_selected() -{ - m_selection.erase(); -} - -void GLCanvas3D::ensure_on_bed(unsigned int object_idx, bool allow_negative_z) -{ - if (allow_negative_z) - return; - - typedef std::map, double> InstancesToZMap; - InstancesToZMap instances_min_z; - - for (GLVolume* volume : m_volumes.volumes) { - if (volume->object_idx() == (int)object_idx && !volume->is_modifier) { - double min_z = volume->transformed_convex_hull_bounding_box().min.z(); - std::pair instance = std::make_pair(volume->object_idx(), volume->instance_idx()); - InstancesToZMap::iterator it = instances_min_z.find(instance); - if (it == instances_min_z.end()) - it = instances_min_z.insert(InstancesToZMap::value_type(instance, DBL_MAX)).first; - - it->second = std::min(it->second, min_z); - } - } - - for (GLVolume* volume : m_volumes.volumes) { - std::pair instance = std::make_pair(volume->object_idx(), volume->instance_idx()); - InstancesToZMap::iterator it = instances_min_z.find(instance); - if (it != instances_min_z.end()) - volume->set_instance_offset(Z, volume->get_instance_offset(Z) - it->second); - } -} - - -const std::vector& GLCanvas3D::get_gcode_layers_zs() const -{ - return m_gcode_viewer.get_layers_zs(); -} - -std::vector GLCanvas3D::get_volumes_print_zs(bool active_only) const -{ - return m_volumes.get_current_print_zs(active_only); -} - -void GLCanvas3D::set_gcode_options_visibility_from_flags(unsigned int flags) -{ - m_gcode_viewer.set_options_visibility_from_flags(flags); -} - -void GLCanvas3D::set_toolpath_role_visibility_flags(unsigned int flags) -{ - m_gcode_viewer.set_toolpath_role_visibility_flags(flags); -} - -void GLCanvas3D::set_toolpath_view_type(GCodeViewer::EViewType type) -{ - m_gcode_viewer.set_view_type(type); -} - -void GLCanvas3D::set_volumes_z_range(const std::array& range) -{ - m_volumes.set_range(range[0] - 1e-6, range[1] + 1e-6); -} - -void GLCanvas3D::set_toolpaths_z_range(const std::array& range) -{ - if (m_gcode_viewer.has_data()) - m_gcode_viewer.set_layers_z_range(range); -} - -std::vector GLCanvas3D::load_object(const ModelObject& model_object, int obj_idx, std::vector instance_idxs) -{ - if (instance_idxs.empty()) { - for (unsigned int i = 0; i < model_object.instances.size(); ++i) { - instance_idxs.emplace_back(i); - } - } - return m_volumes.load_object(&model_object, obj_idx, instance_idxs, m_color_by, m_initialized); -} - -std::vector GLCanvas3D::load_object(const Model& model, int obj_idx) -{ - if (0 <= obj_idx && obj_idx < (int)model.objects.size()) { - const ModelObject* model_object = model.objects[obj_idx]; - if (model_object != nullptr) - return load_object(*model_object, obj_idx, std::vector()); - } - - return std::vector(); -} - -void GLCanvas3D::mirror_selection(Axis axis) -{ - m_selection.mirror(axis); - do_mirror(L("Mirror Object")); - wxGetApp().obj_manipul()->set_dirty(); -} - -// Reload the 3D scene of -// 1) Model / ModelObjects / ModelInstances / ModelVolumes -// 2) Print bed -// 3) SLA support meshes for their respective ModelObjects / ModelInstances -// 4) Wipe tower preview -// 5) Out of bed collision status & message overlay (texture) -void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_refresh) -{ - if (m_canvas == nullptr || m_config == nullptr || m_model == nullptr) - return; - - if (!m_initialized) - return; - - _set_current(); - - m_hover_volume_idxs.clear(); - - struct ModelVolumeState { - ModelVolumeState(const GLVolume* volume) : - model_volume(nullptr), geometry_id(volume->geometry_id), volume_idx(-1) {} - ModelVolumeState(const ModelVolume* model_volume, const ObjectID& instance_id, const GLVolume::CompositeID& composite_id) : - model_volume(model_volume), geometry_id(std::make_pair(model_volume->id().id, instance_id.id)), composite_id(composite_id), volume_idx(-1) {} - ModelVolumeState(const ObjectID& volume_id, const ObjectID& instance_id) : - model_volume(nullptr), geometry_id(std::make_pair(volume_id.id, instance_id.id)), volume_idx(-1) {} - bool new_geometry() const { return this->volume_idx == size_t(-1); } - const ModelVolume* model_volume; - // ObjectID of ModelVolume + ObjectID of ModelInstance - // or timestamp of an SLAPrintObjectStep + ObjectID of ModelInstance - std::pair geometry_id; - GLVolume::CompositeID composite_id; - // Volume index in the new GLVolume vector. - size_t volume_idx; - }; - std::vector model_volume_state; - std::vector aux_volume_state; - - struct GLVolumeState { - GLVolumeState() : - volume_idx(size_t(-1)) {} - GLVolumeState(const GLVolume* volume, unsigned int volume_idx) : - composite_id(volume->composite_id), volume_idx(volume_idx) {} - GLVolumeState(const GLVolume::CompositeID &composite_id) : - composite_id(composite_id), volume_idx(size_t(-1)) {} - - GLVolume::CompositeID composite_id; - // Volume index in the old GLVolume vector. - size_t volume_idx; - }; - - // SLA steps to pull the preview meshes for. - typedef std::array SLASteps; - SLASteps sla_steps = { slaposDrillHoles, slaposSupportTree, slaposPad }; - struct SLASupportState { - std::array::value> step; - }; - // State of the sla_steps for all SLAPrintObjects. - std::vector sla_support_state; - - std::vector instance_ids_selected; - std::vector map_glvolume_old_to_new(m_volumes.volumes.size(), size_t(-1)); - std::vector deleted_volumes; - std::vector glvolumes_new; - glvolumes_new.reserve(m_volumes.volumes.size()); - auto model_volume_state_lower = [](const ModelVolumeState& m1, const ModelVolumeState& m2) { return m1.geometry_id < m2.geometry_id; }; - - m_reload_delayed = !m_canvas->IsShown() && !refresh_immediately && !force_full_scene_refresh; - - PrinterTechnology printer_technology = current_printer_technology(); - int volume_idx_wipe_tower_old = -1; - - // Release invalidated volumes to conserve GPU memory in case of delayed refresh (see m_reload_delayed). - // First initialize model_volumes_new_sorted & model_instances_new_sorted. - for (int object_idx = 0; object_idx < (int)m_model->objects.size(); ++object_idx) { - const ModelObject* model_object = m_model->objects[object_idx]; - for (int instance_idx = 0; instance_idx < (int)model_object->instances.size(); ++instance_idx) { - const ModelInstance* model_instance = model_object->instances[instance_idx]; - for (int volume_idx = 0; volume_idx < (int)model_object->volumes.size(); ++volume_idx) { - const ModelVolume* model_volume = model_object->volumes[volume_idx]; - model_volume_state.emplace_back(model_volume, model_instance->id(), GLVolume::CompositeID(object_idx, volume_idx, instance_idx)); - } - } - } - if (printer_technology == ptSLA) { - const SLAPrint* sla_print = this->sla_print(); -#ifndef NDEBUG - // Verify that the SLAPrint object is synchronized with m_model. - check_model_ids_equal(*m_model, sla_print->model()); -#endif /* NDEBUG */ - sla_support_state.reserve(sla_print->objects().size()); - for (const SLAPrintObject* print_object : sla_print->objects()) { - SLASupportState state; - for (size_t istep = 0; istep < sla_steps.size(); ++istep) { - state.step[istep] = print_object->step_state_with_timestamp(sla_steps[istep]); - if (state.step[istep].state == PrintStateBase::DONE) { - if (!print_object->has_mesh(sla_steps[istep])) - // Consider the DONE step without a valid mesh as invalid for the purpose - // of mesh visualization. - state.step[istep].state = PrintStateBase::INVALID; - else if (sla_steps[istep] != slaposDrillHoles) - for (const ModelInstance* model_instance : print_object->model_object()->instances) - // Only the instances, which are currently printable, will have the SLA support structures kept. - // The instances outside the print bed will have the GLVolumes of their support structures released. - if (model_instance->is_printable()) - aux_volume_state.emplace_back(state.step[istep].timestamp, model_instance->id()); - } - } - sla_support_state.emplace_back(state); - } - } - std::sort(model_volume_state.begin(), model_volume_state.end(), model_volume_state_lower); - std::sort(aux_volume_state.begin(), aux_volume_state.end(), model_volume_state_lower); - // Release all ModelVolume based GLVolumes not found in the current Model. Find the GLVolume of a hollowed mesh. - for (size_t volume_id = 0; volume_id < m_volumes.volumes.size(); ++volume_id) { - GLVolume* volume = m_volumes.volumes[volume_id]; - ModelVolumeState key(volume); - ModelVolumeState* mvs = nullptr; - if (volume->volume_idx() < 0) { - auto it = std::lower_bound(aux_volume_state.begin(), aux_volume_state.end(), key, model_volume_state_lower); - if (it != aux_volume_state.end() && it->geometry_id == key.geometry_id) - // This can be an SLA support structure that should not be rendered (in case someone used undo - // to revert to before it was generated). We only reuse the volume if that's not the case. - if (m_model->objects[volume->composite_id.object_id]->sla_points_status != sla::PointsStatus::NoPoints) - mvs = &(*it); - } - else { - auto it = std::lower_bound(model_volume_state.begin(), model_volume_state.end(), key, model_volume_state_lower); - if (it != model_volume_state.end() && it->geometry_id == key.geometry_id) - mvs = &(*it); - } - // Emplace instance ID of the volume. Both the aux volumes and model volumes share the same instance ID. - // The wipe tower has its own wipe_tower_instance_id(). - if (m_selection.contains_volume(volume_id)) - instance_ids_selected.emplace_back(volume->geometry_id.second); - if (mvs == nullptr || force_full_scene_refresh) { - // This GLVolume will be released. - if (volume->is_wipe_tower) { - // There is only one wipe tower. - assert(volume_idx_wipe_tower_old == -1); - volume_idx_wipe_tower_old = (int)volume_id; - } - if (!m_reload_delayed) { - deleted_volumes.emplace_back(volume, volume_id); - delete volume; - } - } - else { - // This GLVolume will be reused. - volume->set_sla_shift_z(0.0); - map_glvolume_old_to_new[volume_id] = glvolumes_new.size(); - mvs->volume_idx = glvolumes_new.size(); - glvolumes_new.emplace_back(volume); - // Update color of the volume based on the current extruder. - if (mvs->model_volume != nullptr) { - int extruder_id = mvs->model_volume->extruder_id(); - if (extruder_id != -1) - volume->extruder_id = extruder_id; - - volume->is_modifier = !mvs->model_volume->is_model_part(); - volume->set_color(color_from_model_volume(*mvs->model_volume)); - // force update of render_color alpha channel - bool transparent = volume->color[3] < 1.0f; - if (transparent) - volume->force_transparent = true; - volume->set_render_color(); - if (transparent) - volume->force_transparent = false; - - // updates volumes transformations - volume->set_instance_transformation(mvs->model_volume->get_object()->instances[mvs->composite_id.instance_id]->get_transformation()); - volume->set_volume_transformation(mvs->model_volume->get_transformation()); - - // updates volumes convex hull - if (mvs->model_volume->is_model_part() && ! volume->convex_hull()) - // Model volume was likely changed from modifier or support blocker / enforcer to a model part. - // Only model parts require convex hulls. - volume->set_convex_hull(mvs->model_volume->get_convex_hull_shared_ptr()); - } - } - } - sort_remove_duplicates(instance_ids_selected); - auto deleted_volumes_lower = [](const GLVolumeState &v1, const GLVolumeState &v2) { return v1.composite_id < v2.composite_id; }; - std::sort(deleted_volumes.begin(), deleted_volumes.end(), deleted_volumes_lower); - - if (m_reload_delayed) - return; - - bool update_object_list = false; - if (m_volumes.volumes != glvolumes_new) - update_object_list = true; - m_volumes.volumes = std::move(glvolumes_new); - for (unsigned int obj_idx = 0; obj_idx < (unsigned int)m_model->objects.size(); ++ obj_idx) { - const ModelObject &model_object = *m_model->objects[obj_idx]; - for (int volume_idx = 0; volume_idx < (int)model_object.volumes.size(); ++ volume_idx) { - const ModelVolume &model_volume = *model_object.volumes[volume_idx]; - for (int instance_idx = 0; instance_idx < (int)model_object.instances.size(); ++ instance_idx) { - const ModelInstance &model_instance = *model_object.instances[instance_idx]; - ModelVolumeState key(model_volume.id(), model_instance.id()); - auto it = std::lower_bound(model_volume_state.begin(), model_volume_state.end(), key, model_volume_state_lower); - assert(it != model_volume_state.end() && it->geometry_id == key.geometry_id); - if (it->new_geometry()) { - // New volume. - auto it_old_volume = std::lower_bound(deleted_volumes.begin(), deleted_volumes.end(), GLVolumeState(it->composite_id), deleted_volumes_lower); - if (it_old_volume != deleted_volumes.end() && it_old_volume->composite_id == it->composite_id) - // If a volume changed its ObjectID, but it reuses a GLVolume's CompositeID, maintain its selection. - map_glvolume_old_to_new[it_old_volume->volume_idx] = m_volumes.volumes.size(); - // Note the index of the loaded volume, so that we can reload the main model GLVolume with the hollowed mesh - // later in this function. - it->volume_idx = m_volumes.volumes.size(); - m_volumes.load_object_volume(&model_object, obj_idx, volume_idx, instance_idx, m_color_by, m_initialized); - m_volumes.volumes.back()->geometry_id = key.geometry_id; - update_object_list = true; - } else { - // Recycling an old GLVolume. - GLVolume &existing_volume = *m_volumes.volumes[it->volume_idx]; - assert(existing_volume.geometry_id == key.geometry_id); - // Update the Object/Volume/Instance indices into the current Model. - if (existing_volume.composite_id != it->composite_id) { - existing_volume.composite_id = it->composite_id; - update_object_list = true; - } - } - } - } - } - if (printer_technology == ptSLA) { - size_t idx = 0; - const SLAPrint *sla_print = this->sla_print(); - std::vector shift_zs(m_model->objects.size(), 0); - double relative_correction_z = sla_print->relative_correction().z(); - if (relative_correction_z <= EPSILON) - relative_correction_z = 1.; - for (const SLAPrintObject *print_object : sla_print->objects()) { - SLASupportState &state = sla_support_state[idx ++]; - const ModelObject *model_object = print_object->model_object(); - // Find an index of the ModelObject - int object_idx; - // There may be new SLA volumes added to the scene for this print_object. - // Find the object index of this print_object in the Model::objects list. - auto it = std::find(sla_print->model().objects.begin(), sla_print->model().objects.end(), model_object); - assert(it != sla_print->model().objects.end()); - object_idx = it - sla_print->model().objects.begin(); - // Cache the Z offset to be applied to all volumes with this object_idx. - shift_zs[object_idx] = print_object->get_current_elevation() / relative_correction_z; - // Collect indices of this print_object's instances, for which the SLA support meshes are to be added to the scene. - // pairs of - std::vector> instances[std::tuple_size::value]; - for (size_t print_instance_idx = 0; print_instance_idx < print_object->instances().size(); ++ print_instance_idx) { - const SLAPrintObject::Instance &instance = print_object->instances()[print_instance_idx]; - // Find index of ModelInstance corresponding to this SLAPrintObject::Instance. - auto it = std::find_if(model_object->instances.begin(), model_object->instances.end(), - [&instance](const ModelInstance *mi) { return mi->id() == instance.instance_id; }); - assert(it != model_object->instances.end()); - int instance_idx = it - model_object->instances.begin(); - for (size_t istep = 0; istep < sla_steps.size(); ++ istep) - if (sla_steps[istep] == slaposDrillHoles) { - // Hollowing is a special case, where the mesh from the backend is being loaded into the 1st volume of an instance, - // not into its own GLVolume. - // There shall always be such a GLVolume allocated. - ModelVolumeState key(model_object->volumes.front()->id(), instance.instance_id); - auto it = std::lower_bound(model_volume_state.begin(), model_volume_state.end(), key, model_volume_state_lower); - assert(it != model_volume_state.end() && it->geometry_id == key.geometry_id); - assert(!it->new_geometry()); - GLVolume &volume = *m_volumes.volumes[it->volume_idx]; - if (! volume.offsets.empty() && state.step[istep].timestamp != volume.offsets.front()) { - // The backend either produced a new hollowed mesh, or it invalidated the one that the front end has seen. - volume.indexed_vertex_array.release_geometry(); - if (state.step[istep].state == PrintStateBase::DONE) { - TriangleMesh mesh = print_object->get_mesh(slaposDrillHoles); - assert(! mesh.empty()); - - // sla_trafo does not contain volume trafo. To get a mesh to create - // a new volume from, we have to apply vol trafo inverse separately. - const ModelObject& mo = *m_model->objects[volume.object_idx()]; - Transform3d trafo = sla_print->sla_trafo(mo) - * mo.volumes.front()->get_transformation().get_matrix(); - mesh.transform(trafo.inverse()); -#if ENABLE_SMOOTH_NORMALS - volume.indexed_vertex_array.load_mesh(mesh, true); -#else - volume.indexed_vertex_array.load_mesh(mesh); -#endif // ENABLE_SMOOTH_NORMALS - } else { - // Reload the original volume. -#if ENABLE_SMOOTH_NORMALS - volume.indexed_vertex_array.load_mesh(m_model->objects[volume.object_idx()]->volumes[volume.volume_idx()]->mesh(), true); -#else - volume.indexed_vertex_array.load_mesh(m_model->objects[volume.object_idx()]->volumes[volume.volume_idx()]->mesh()); -#endif // ENABLE_SMOOTH_NORMALS - } - volume.finalize_geometry(true); - } - //FIXME it is an ugly hack to write the timestamp into the "offsets" field to not have to add another member variable - // to the GLVolume. We should refactor GLVolume significantly, so that the GLVolume will not contain member variables - // of various concenrs (model vs. 3D print path). - volume.offsets = { state.step[istep].timestamp }; - } else if (state.step[istep].state == PrintStateBase::DONE) { - // Check whether there is an existing auxiliary volume to be updated, or a new auxiliary volume to be created. - ModelVolumeState key(state.step[istep].timestamp, instance.instance_id.id); - auto it = std::lower_bound(aux_volume_state.begin(), aux_volume_state.end(), key, model_volume_state_lower); - assert(it != aux_volume_state.end() && it->geometry_id == key.geometry_id); - if (it->new_geometry()) { - // This can be an SLA support structure that should not be rendered (in case someone used undo - // to revert to before it was generated). If that's the case, we should not generate anything. - if (model_object->sla_points_status != sla::PointsStatus::NoPoints) - instances[istep].emplace_back(std::pair(instance_idx, print_instance_idx)); - else - shift_zs[object_idx] = 0.; - } else { - // Recycling an old GLVolume. Update the Object/Instance indices into the current Model. - m_volumes.volumes[it->volume_idx]->composite_id = GLVolume::CompositeID(object_idx, m_volumes.volumes[it->volume_idx]->volume_idx(), instance_idx); - m_volumes.volumes[it->volume_idx]->set_instance_transformation(model_object->instances[instance_idx]->get_transformation()); - } - } - } - - for (size_t istep = 0; istep < sla_steps.size(); ++istep) - if (!instances[istep].empty()) - m_volumes.load_object_auxiliary(print_object, object_idx, instances[istep], sla_steps[istep], state.step[istep].timestamp, m_initialized); - } - - // Shift-up all volumes of the object so that it has the right elevation with respect to the print bed - for (GLVolume* volume : m_volumes.volumes) - if (volume->object_idx() < (int)m_model->objects.size() && m_model->objects[volume->object_idx()]->instances[volume->instance_idx()]->is_printable()) - volume->set_sla_shift_z(shift_zs[volume->object_idx()]); - } - - if (printer_technology == ptFFF && m_config->has("nozzle_diameter")) { - // Should the wipe tower be visualized ? - unsigned int extruders_count = (unsigned int)dynamic_cast(m_config->option("nozzle_diameter"))->values.size(); - - bool wt = dynamic_cast(m_config->option("wipe_tower"))->value; - bool co = dynamic_cast(m_config->option("complete_objects"))->value; - - if (extruders_count > 1 && wt && !co) { - // Height of a print (Show at least a slab) - double height = std::max(m_model->bounding_box().max(2), 10.0); - - float x = dynamic_cast(m_config->option("wipe_tower_x"))->value; - float y = dynamic_cast(m_config->option("wipe_tower_y"))->value; - float w = dynamic_cast(m_config->option("wipe_tower_width"))->value; - float a = dynamic_cast(m_config->option("wipe_tower_rotation_angle"))->value; - - const Print *print = m_process->fff_print(); - - float depth = print->wipe_tower_data(extruders_count).depth; - float brim_width = print->wipe_tower_data(extruders_count).brim_width; - - int volume_idx_wipe_tower_new = m_volumes.load_wipe_tower_preview( - 1000, x, y, w, depth, (float)height, a, !print->is_step_done(psWipeTower), - brim_width, m_initialized); - if (volume_idx_wipe_tower_old != -1) - map_glvolume_old_to_new[volume_idx_wipe_tower_old] = volume_idx_wipe_tower_new; - } - } - - update_volumes_colors_by_extruder(); - // Update selection indices based on the old/new GLVolumeCollection. - if (m_selection.get_mode() == Selection::Instance) - m_selection.instances_changed(instance_ids_selected); - else - m_selection.volumes_changed(map_glvolume_old_to_new); - - m_gizmos.update_data(); - m_gizmos.refresh_on_off_state(); - - // Update the toolbar - if (update_object_list) - post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT)); - - // checks for geometry outside the print volume to render it accordingly - if (!m_volumes.empty()) { - ModelInstanceEPrintVolumeState state; - const bool contained_min_one = m_volumes.check_outside_state(m_bed.build_volume(), &state); - const bool partlyOut = (state == ModelInstanceEPrintVolumeState::ModelInstancePVS_Partly_Outside); - const bool fullyOut = (state == ModelInstanceEPrintVolumeState::ModelInstancePVS_Fully_Outside); - - _set_warning_notification(EWarning::ObjectClashed, partlyOut); - _set_warning_notification(EWarning::ObjectOutside, fullyOut); - if (printer_technology != ptSLA || !contained_min_one) - _set_warning_notification(EWarning::SlaSupportsOutside, false); - - post_event(Event(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, - contained_min_one && !m_model->objects.empty() && !partlyOut)); - } - else { - _set_warning_notification(EWarning::ObjectOutside, false); - _set_warning_notification(EWarning::ObjectClashed, false); - _set_warning_notification(EWarning::SlaSupportsOutside, false); - post_event(Event(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, false)); - } - - refresh_camera_scene_box(); - - if (m_selection.is_empty()) { - // If no object is selected, deactivate the active gizmo, if any - // Otherwise it may be shown after cleaning the scene (if it was active while the objects were deleted) - m_gizmos.reset_all_states(); - - // If no object is selected, reset the objects manipulator on the sidebar - // to force a reset of its cache - auto manip = wxGetApp().obj_manipul(); - if (manip != nullptr) - manip->set_dirty(); - } - - // and force this canvas to be redrawn. - m_dirty = true; -} - -static void reserve_new_volume_finalize_old_volume(GLVolume& vol_new, GLVolume& vol_old, bool gl_initialized, size_t prealloc_size = VERTEX_BUFFER_RESERVE_SIZE) -{ - // Assign the large pre-allocated buffers to the new GLVolume. - vol_new.indexed_vertex_array = std::move(vol_old.indexed_vertex_array); - // Copy the content back to the old GLVolume. - vol_old.indexed_vertex_array = vol_new.indexed_vertex_array; - // Clear the buffers, but keep them pre-allocated. - vol_new.indexed_vertex_array.clear(); - // Just make sure that clear did not clear the reserved memory. - // Reserving number of vertices (3x position + 3x color) - vol_new.indexed_vertex_array.reserve(prealloc_size / 6); - // Finalize the old geometry, possibly move data to the graphics card. - vol_old.finalize_geometry(gl_initialized); -} - -void GLCanvas3D::load_gcode_preview(const GCodeProcessorResult& gcode_result, const std::vector& str_tool_colors) -{ - m_gcode_viewer.load(gcode_result, *this->fff_print(), m_initialized); - - if (wxGetApp().is_editor()) { - m_gcode_viewer.update_shells_color_by_extruder(m_config); - _set_warning_notification_if_needed(EWarning::ToolpathOutside); - } - - m_gcode_viewer.refresh(gcode_result, str_tool_colors); - set_as_dirty(); - request_extra_frame(); -} - -void GLCanvas3D::refresh_gcode_preview_render_paths() -{ - m_gcode_viewer.refresh_render_paths(); - set_as_dirty(); - request_extra_frame(); -} - -void GLCanvas3D::load_sla_preview() -{ - const SLAPrint* print = sla_print(); - if (m_canvas != nullptr && print != nullptr) { - _set_current(); - // Release OpenGL data before generating new data. - reset_volumes(); - _load_sla_shells(); - _update_sla_shells_outside_state(); - _set_warning_notification_if_needed(EWarning::SlaSupportsOutside); - } -} - -void GLCanvas3D::load_preview(const std::vector& str_tool_colors, const std::vector& color_print_values) -{ - const Print *print = this->fff_print(); - if (print == nullptr) - return; - - _set_current(); - - // Release OpenGL data before generating new data. - this->reset_volumes(); - - const BuildVolume &build_volume = m_bed.build_volume(); - _load_print_toolpaths(build_volume); - _load_wipe_tower_toolpaths(build_volume, str_tool_colors); - for (const PrintObject* object : print->objects()) - _load_print_object_toolpaths(*object, build_volume, str_tool_colors, color_print_values); - - _set_warning_notification_if_needed(EWarning::ToolpathOutside); -} - -void GLCanvas3D::bind_event_handlers() -{ - if (m_canvas != nullptr) { - m_canvas->Bind(wxEVT_SIZE, &GLCanvas3D::on_size, this); - m_canvas->Bind(wxEVT_IDLE, &GLCanvas3D::on_idle, this); - m_canvas->Bind(wxEVT_CHAR, &GLCanvas3D::on_char, this); - m_canvas->Bind(wxEVT_KEY_DOWN, &GLCanvas3D::on_key, this); - m_canvas->Bind(wxEVT_KEY_UP, &GLCanvas3D::on_key, this); - m_canvas->Bind(wxEVT_MOUSEWHEEL, &GLCanvas3D::on_mouse_wheel, this); - m_canvas->Bind(wxEVT_TIMER, &GLCanvas3D::on_timer, this); - m_canvas->Bind(EVT_GLCANVAS_RENDER_TIMER, &GLCanvas3D::on_render_timer, this); - m_toolbar_highlighter.set_timer_owner(m_canvas, 0); - m_canvas->Bind(EVT_GLCANVAS_TOOLBAR_HIGHLIGHTER_TIMER, [this](wxTimerEvent&) { m_toolbar_highlighter.blink(); }); - m_gizmo_highlighter.set_timer_owner(m_canvas, 0); - m_canvas->Bind(EVT_GLCANVAS_GIZMO_HIGHLIGHTER_TIMER, [this](wxTimerEvent&) { m_gizmo_highlighter.blink(); }); - m_canvas->Bind(wxEVT_LEFT_DOWN, &GLCanvas3D::on_mouse, this); - m_canvas->Bind(wxEVT_LEFT_UP, &GLCanvas3D::on_mouse, this); - m_canvas->Bind(wxEVT_MIDDLE_DOWN, &GLCanvas3D::on_mouse, this); - m_canvas->Bind(wxEVT_MIDDLE_UP, &GLCanvas3D::on_mouse, this); - m_canvas->Bind(wxEVT_RIGHT_DOWN, &GLCanvas3D::on_mouse, this); - m_canvas->Bind(wxEVT_RIGHT_UP, &GLCanvas3D::on_mouse, this); - m_canvas->Bind(wxEVT_MOTION, &GLCanvas3D::on_mouse, this); - m_canvas->Bind(wxEVT_ENTER_WINDOW, &GLCanvas3D::on_mouse, this); - m_canvas->Bind(wxEVT_LEAVE_WINDOW, &GLCanvas3D::on_mouse, this); - m_canvas->Bind(wxEVT_LEFT_DCLICK, &GLCanvas3D::on_mouse, this); - m_canvas->Bind(wxEVT_MIDDLE_DCLICK, &GLCanvas3D::on_mouse, this); - m_canvas->Bind(wxEVT_RIGHT_DCLICK, &GLCanvas3D::on_mouse, this); - m_canvas->Bind(wxEVT_PAINT, &GLCanvas3D::on_paint, this); - m_canvas->Bind(wxEVT_SET_FOCUS, &GLCanvas3D::on_set_focus, this); - - m_event_handlers_bound = true; - } -} - -void GLCanvas3D::unbind_event_handlers() -{ - if (m_canvas != nullptr && m_event_handlers_bound) { - m_canvas->Unbind(wxEVT_SIZE, &GLCanvas3D::on_size, this); - m_canvas->Unbind(wxEVT_IDLE, &GLCanvas3D::on_idle, this); - m_canvas->Unbind(wxEVT_CHAR, &GLCanvas3D::on_char, this); - m_canvas->Unbind(wxEVT_KEY_DOWN, &GLCanvas3D::on_key, this); - m_canvas->Unbind(wxEVT_KEY_UP, &GLCanvas3D::on_key, this); - m_canvas->Unbind(wxEVT_MOUSEWHEEL, &GLCanvas3D::on_mouse_wheel, this); - m_canvas->Unbind(wxEVT_TIMER, &GLCanvas3D::on_timer, this); - m_canvas->Unbind(EVT_GLCANVAS_RENDER_TIMER, &GLCanvas3D::on_render_timer, this); - m_canvas->Unbind(wxEVT_LEFT_DOWN, &GLCanvas3D::on_mouse, this); - m_canvas->Unbind(wxEVT_LEFT_UP, &GLCanvas3D::on_mouse, this); - m_canvas->Unbind(wxEVT_MIDDLE_DOWN, &GLCanvas3D::on_mouse, this); - m_canvas->Unbind(wxEVT_MIDDLE_UP, &GLCanvas3D::on_mouse, this); - m_canvas->Unbind(wxEVT_RIGHT_DOWN, &GLCanvas3D::on_mouse, this); - m_canvas->Unbind(wxEVT_RIGHT_UP, &GLCanvas3D::on_mouse, this); - m_canvas->Unbind(wxEVT_MOTION, &GLCanvas3D::on_mouse, this); - m_canvas->Unbind(wxEVT_ENTER_WINDOW, &GLCanvas3D::on_mouse, this); - m_canvas->Unbind(wxEVT_LEAVE_WINDOW, &GLCanvas3D::on_mouse, this); - m_canvas->Unbind(wxEVT_LEFT_DCLICK, &GLCanvas3D::on_mouse, this); - m_canvas->Unbind(wxEVT_MIDDLE_DCLICK, &GLCanvas3D::on_mouse, this); - m_canvas->Unbind(wxEVT_RIGHT_DCLICK, &GLCanvas3D::on_mouse, this); - m_canvas->Unbind(wxEVT_PAINT, &GLCanvas3D::on_paint, this); - m_canvas->Unbind(wxEVT_SET_FOCUS, &GLCanvas3D::on_set_focus, this); - - m_event_handlers_bound = false; - } -} - -void GLCanvas3D::on_size(wxSizeEvent& evt) -{ - m_dirty = true; -} - -void GLCanvas3D::on_idle(wxIdleEvent& evt) -{ - if (!m_initialized) - return; - - m_dirty |= m_main_toolbar.update_items_state(); - m_dirty |= m_undoredo_toolbar.update_items_state(); - m_dirty |= wxGetApp().plater()->get_view_toolbar().update_items_state(); - m_dirty |= wxGetApp().plater()->get_collapse_toolbar().update_items_state(); - bool mouse3d_controller_applied = wxGetApp().plater()->get_mouse3d_controller().apply(wxGetApp().plater()->get_camera()); - m_dirty |= mouse3d_controller_applied; - m_dirty |= wxGetApp().plater()->get_notification_manager()->update_notifications(*this); - auto gizmo = wxGetApp().plater()->canvas3D()->get_gizmos_manager().get_current(); - if (gizmo != nullptr) m_dirty |= gizmo->update_items_state(); - // ImGuiWrapper::m_requires_extra_frame may have been set by a render made outside of the OnIdle mechanism - bool imgui_requires_extra_frame = wxGetApp().imgui()->requires_extra_frame(); - m_dirty |= imgui_requires_extra_frame; - - if (!m_dirty) - return; - - // this needs to be done here. - // during the render launched by the refresh the value may be set again - wxGetApp().imgui()->reset_requires_extra_frame(); - - _refresh_if_shown_on_screen(); - - if (m_extra_frame_requested || mouse3d_controller_applied || imgui_requires_extra_frame || wxGetApp().imgui()->requires_extra_frame()) { - m_extra_frame_requested = false; - evt.RequestMore(); - } - else - m_dirty = false; -} - -void GLCanvas3D::on_char(wxKeyEvent& evt) -{ - if (!m_initialized) - return; - - // see include/wx/defs.h enum wxKeyCode - int keyCode = evt.GetKeyCode(); - int ctrlMask = wxMOD_CONTROL; - int shiftMask = wxMOD_SHIFT; - - auto imgui = wxGetApp().imgui(); - if (imgui->update_key_data(evt)) { - render(); - return; - } - - if (keyCode == WXK_ESCAPE && (_deactivate_undo_redo_toolbar_items() || _deactivate_search_toolbar_item() || _deactivate_arrange_menu())) - return; - - if (m_gizmos.on_char(evt)) - return; - - if ((evt.GetModifiers() & ctrlMask) != 0) { - // CTRL is pressed - switch (keyCode) { -#ifdef __APPLE__ - case 'a': - case 'A': -#else /* __APPLE__ */ - case WXK_CONTROL_A: -#endif /* __APPLE__ */ - post_event(SimpleEvent(EVT_GLCANVAS_SELECT_ALL)); - break; -#ifdef __APPLE__ - case 'c': - case 'C': -#else /* __APPLE__ */ - case WXK_CONTROL_C: -#endif /* __APPLE__ */ - post_event(SimpleEvent(EVT_GLTOOLBAR_COPY)); - break; -#ifdef __APPLE__ - case 'm': - case 'M': -#else /* __APPLE__ */ - case WXK_CONTROL_M: -#endif /* __APPLE__ */ - { -#ifdef _WIN32 - if (wxGetApp().app_config->get("use_legacy_3DConnexion") == "1") { -#endif //_WIN32 -#ifdef __APPLE__ - // On OSX use Cmd+Shift+M to "Show/Hide 3Dconnexion devices settings dialog" - if ((evt.GetModifiers() & shiftMask) != 0) { -#endif // __APPLE__ - Mouse3DController& controller = wxGetApp().plater()->get_mouse3d_controller(); - controller.show_settings_dialog(!controller.is_settings_dialog_shown()); - m_dirty = true; -#ifdef __APPLE__ - } - else - // and Cmd+M to minimize application - wxGetApp().mainframe->Iconize(); -#endif // __APPLE__ -#ifdef _WIN32 - } -#endif //_WIN32 - break; - } -#ifdef __APPLE__ - case 'v': - case 'V': -#else /* __APPLE__ */ - case WXK_CONTROL_V: -#endif /* __APPLE__ */ - post_event(SimpleEvent(EVT_GLTOOLBAR_PASTE)); - break; - - -#ifdef __APPLE__ - case 'f': - case 'F': -#else /* __APPLE__ */ - case WXK_CONTROL_F: -#endif /* __APPLE__ */ - _activate_search_toolbar_item(); - break; - - -#ifdef __APPLE__ - case 'y': - case 'Y': -#else /* __APPLE__ */ - case WXK_CONTROL_Y: -#endif /* __APPLE__ */ - post_event(SimpleEvent(EVT_GLCANVAS_REDO)); - break; -#ifdef __APPLE__ - case 'z': - case 'Z': -#else /* __APPLE__ */ - case WXK_CONTROL_Z: -#endif /* __APPLE__ */ - post_event(SimpleEvent(EVT_GLCANVAS_UNDO)); - break; - - case WXK_BACK: - case WXK_DELETE: - post_event(SimpleEvent(EVT_GLTOOLBAR_DELETE_ALL)); break; - default: evt.Skip(); - } - } else { - switch (keyCode) - { - case WXK_BACK: - case WXK_DELETE: { post_event(SimpleEvent(EVT_GLTOOLBAR_DELETE)); break; } - case WXK_ESCAPE: { deselect_all(); break; } - case WXK_F5: { - if ((wxGetApp().is_editor() && !wxGetApp().plater()->model().objects.empty()) || - (wxGetApp().is_gcode_viewer() && !wxGetApp().plater()->get_last_loaded_gcode().empty())) - post_event(SimpleEvent(EVT_GLCANVAS_RELOAD_FROM_DISK)); - break; - } - case '0': { select_view("iso"); break; } - case '1': { select_view("top"); break; } - case '2': { select_view("bottom"); break; } - case '3': { select_view("front"); break; } - case '4': { select_view("rear"); break; } - case '5': { select_view("left"); break; } - case '6': { select_view("right"); break; } - case '+': { - if (dynamic_cast(m_canvas->GetParent()) != nullptr) - post_event(wxKeyEvent(EVT_GLCANVAS_EDIT_COLOR_CHANGE, evt)); - else - post_event(Event(EVT_GLCANVAS_INCREASE_INSTANCES, +1)); - break; - } - case '-': { - if (dynamic_cast(m_canvas->GetParent()) != nullptr) - post_event(wxKeyEvent(EVT_GLCANVAS_EDIT_COLOR_CHANGE, evt)); - else - post_event(Event(EVT_GLCANVAS_INCREASE_INSTANCES, -1)); - break; - } - case '?': { post_event(SimpleEvent(EVT_GLCANVAS_QUESTION_MARK)); break; } - case 'A': - case 'a': { post_event(SimpleEvent(EVT_GLCANVAS_ARRANGE)); break; } - case 'B': - case 'b': { zoom_to_bed(); break; } - case 'C': - case 'c': { m_gcode_viewer.toggle_gcode_window_visibility(); m_dirty = true; request_extra_frame(); break; } - case 'E': - case 'e': { m_labels.show(!m_labels.is_shown()); m_dirty = true; break; } - case 'G': - case 'g': { - if ((evt.GetModifiers() & shiftMask) != 0) { - if (dynamic_cast(m_canvas->GetParent()) != nullptr) - post_event(wxKeyEvent(EVT_GLCANVAS_JUMP_TO, evt)); - } - break; - } - case 'I': - case 'i': { _update_camera_zoom(1.0); break; } - case 'K': - case 'k': { wxGetApp().plater()->get_camera().select_next_type(); m_dirty = true; break; } - case 'L': - case 'l': { - if (!m_main_toolbar.is_enabled()) { - m_gcode_viewer.enable_legend(!m_gcode_viewer.is_legend_enabled()); - m_dirty = true; - wxGetApp().plater()->update_preview_bottom_toolbar(); - } - break; - } - case 'O': - case 'o': { _update_camera_zoom(-1.0); break; } -#if ENABLE_RENDER_PICKING_PASS - case 'T': - case 't': { - m_show_picking_texture = !m_show_picking_texture; - m_dirty = true; - break; - } -#endif // ENABLE_RENDER_PICKING_PASS - case 'Z': - case 'z': { - if (!m_selection.is_empty()) - zoom_to_selection(); - else { - if (!m_volumes.empty()) - zoom_to_volumes(); - else - _zoom_to_box(m_gcode_viewer.get_paths_bounding_box()); - } - break; - } - default: { evt.Skip(); break; } - } - } -} - -class TranslationProcessor -{ - using UpAction = std::function; - using DownAction = std::function; - - UpAction m_up_action{ nullptr }; - DownAction m_down_action{ nullptr }; - - bool m_running{ false }; - Vec3d m_direction{ Vec3d::UnitX() }; - -public: - TranslationProcessor(UpAction up_action, DownAction down_action) - : m_up_action(up_action), m_down_action(down_action) - { - } - - void process(wxKeyEvent& evt) - { - const int keyCode = evt.GetKeyCode(); - wxEventType type = evt.GetEventType(); - if (type == wxEVT_KEY_UP) { - switch (keyCode) - { - case WXK_NUMPAD_LEFT: case WXK_LEFT: - case WXK_NUMPAD_RIGHT: case WXK_RIGHT: - case WXK_NUMPAD_UP: case WXK_UP: - case WXK_NUMPAD_DOWN: case WXK_DOWN: - { - m_running = false; - m_up_action(); - break; - } - default: { break; } - } - } - else if (type == wxEVT_KEY_DOWN) { - bool apply = false; - - switch (keyCode) - { - case WXK_SHIFT: - { - if (m_running) - apply = true; - - break; - } - case WXK_NUMPAD_LEFT: - case WXK_LEFT: - { - m_direction = -Vec3d::UnitX(); - apply = true; - break; - } - case WXK_NUMPAD_RIGHT: - case WXK_RIGHT: - { - m_direction = Vec3d::UnitX(); - apply = true; - break; - } - case WXK_NUMPAD_UP: - case WXK_UP: - { - m_direction = Vec3d::UnitY(); - apply = true; - break; - } - case WXK_NUMPAD_DOWN: - case WXK_DOWN: - { - m_direction = -Vec3d::UnitY(); - apply = true; - break; - } - default: { break; } - } - - if (apply) { - m_running = true; - m_down_action(m_direction, evt.ShiftDown(), evt.CmdDown()); - } - } - } -}; - -void GLCanvas3D::on_key(wxKeyEvent& evt) -{ - static TranslationProcessor translationProcessor( - [this]() { - do_move(L("Gizmo-Move")); - m_gizmos.update_data(); - - wxGetApp().obj_manipul()->set_dirty(); - // Let the plater know that the dragging finished, so a delayed refresh - // of the scene with the background processing data should be performed. - post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); - // updates camera target constraints - refresh_camera_scene_box(); - m_dirty = true; - }, - [this](const Vec3d& direction, bool slow, bool camera_space) { - m_selection.start_dragging(); - double multiplier = slow ? 1.0 : 10.0; - - Vec3d displacement; - if (camera_space) { - Eigen::Matrix inv_view_3x3 = wxGetApp().plater()->get_camera().get_view_matrix().inverse().matrix().block(0, 0, 3, 3); - displacement = multiplier * (inv_view_3x3 * direction); - displacement.z() = 0.0; - } - else - displacement = multiplier * direction; - - m_selection.translate(displacement); - m_selection.stop_dragging(); - m_dirty = true; - } - ); - - const int keyCode = evt.GetKeyCode(); - - auto imgui = wxGetApp().imgui(); - if (imgui->update_key_data(evt)) { - render(); - } - else - { - if (!m_gizmos.on_key(evt)) { - if (evt.GetEventType() == wxEVT_KEY_UP) { - if (evt.ShiftDown() && evt.ControlDown() && keyCode == WXK_SPACE) { - wxGetApp().plater()->toggle_render_statistic_dialog(); - m_dirty = true; - } - if (m_tab_down && keyCode == WXK_TAB && !evt.HasAnyModifiers()) { - // Enable switching between 3D and Preview with Tab - // m_canvas->HandleAsNavigationKey(evt); // XXX: Doesn't work in some cases / on Linux - post_event(SimpleEvent(EVT_GLCANVAS_TAB)); - } - else if (keyCode == WXK_TAB && evt.ShiftDown() && ! wxGetApp().is_gcode_viewer()) { - // Collapse side-panel with Shift+Tab - post_event(SimpleEvent(EVT_GLCANVAS_COLLAPSE_SIDEBAR)); - } - else if (keyCode == WXK_SHIFT) { - translationProcessor.process(evt); - - if (m_picking_enabled && m_rectangle_selection.is_dragging()) { - _update_selection_from_hover(); - m_rectangle_selection.stop_dragging(); - m_mouse.ignore_left_up = true; - m_dirty = true; - } -// set_cursor(Standard); - } - else if (keyCode == WXK_ALT) { - if (m_picking_enabled && m_rectangle_selection.is_dragging()) { - _update_selection_from_hover(); - m_rectangle_selection.stop_dragging(); - m_mouse.ignore_left_up = true; - m_dirty = true; - } -// set_cursor(Standard); - } - else if (keyCode == WXK_CONTROL) - m_dirty = true; - else if (m_gizmos.is_enabled() && !m_selection.is_empty()) { - translationProcessor.process(evt); - - switch (keyCode) - { - case WXK_NUMPAD_PAGEUP: case WXK_PAGEUP: - case WXK_NUMPAD_PAGEDOWN: case WXK_PAGEDOWN: - { - do_rotate(L("Gizmo-Rotate")); - m_gizmos.update_data(); - - wxGetApp().obj_manipul()->set_dirty(); - // Let the plater know that the dragging finished, so a delayed refresh - // of the scene with the background processing data should be performed. - post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); - // updates camera target constraints - refresh_camera_scene_box(); - m_dirty = true; - - break; - } - default: { break; } - } - } - } - else if (evt.GetEventType() == wxEVT_KEY_DOWN) { - m_tab_down = keyCode == WXK_TAB && !evt.HasAnyModifiers(); - if (keyCode == WXK_SHIFT) { - translationProcessor.process(evt); - - if (m_picking_enabled && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports)) - { - m_mouse.ignore_left_up = false; -// set_cursor(Cross); - } - } - else if (keyCode == WXK_ALT) { - if (m_picking_enabled && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports)) - { - m_mouse.ignore_left_up = false; -// set_cursor(Cross); - } - } - else if (keyCode == WXK_CONTROL) - m_dirty = true; - else if (m_gizmos.is_enabled() && !m_selection.is_empty()) { - auto do_rotate = [this](double angle_z_rad) { - m_selection.start_dragging(); - m_selection.rotate(Vec3d(0.0, 0.0, angle_z_rad), TransformationType(TransformationType::World_Relative_Joint)); - m_selection.stop_dragging(); - m_dirty = true; -// wxGetApp().obj_manipul()->set_dirty(); - }; - - translationProcessor.process(evt); - - switch (keyCode) - { - case WXK_NUMPAD_PAGEUP: case WXK_PAGEUP: { do_rotate(0.25 * M_PI); break; } - case WXK_NUMPAD_PAGEDOWN: case WXK_PAGEDOWN: { do_rotate(-0.25 * M_PI); break; } - default: { break; } - } - } - else if (!m_gizmos.is_enabled()) { - // DoubleSlider navigation in Preview - if (keyCode == WXK_LEFT || - keyCode == WXK_RIGHT || - keyCode == WXK_UP || - keyCode == WXK_DOWN) { - if (dynamic_cast(m_canvas->GetParent()) != nullptr) - post_event(wxKeyEvent(EVT_GLCANVAS_MOVE_SLIDERS, evt)); - } - } - } - } - } - - if (keyCode != WXK_TAB - && keyCode != WXK_LEFT - && keyCode != WXK_UP - && keyCode != WXK_RIGHT - && keyCode != WXK_DOWN) { - evt.Skip(); // Needed to have EVT_CHAR generated as well - } -} - -void GLCanvas3D::on_mouse_wheel(wxMouseEvent& evt) -{ -#ifdef WIN32 - // Try to filter out spurious mouse wheel events comming from 3D mouse. - if (wxGetApp().plater()->get_mouse3d_controller().process_mouse_wheel()) - return; -#endif - - if (!m_initialized) - return; - - // Ignore the wheel events if the middle button is pressed. - if (evt.MiddleIsDown()) - return; - -#if ENABLE_RETINA_GL - const float scale = m_retina_helper->get_scale_factor(); - evt.SetX(evt.GetX() * scale); - evt.SetY(evt.GetY() * scale); -#endif - - if (wxGetApp().imgui()->update_mouse_data(evt)) { - m_dirty = true; - return; - } - -#ifdef __WXMSW__ - // For some reason the Idle event is not being generated after the mouse scroll event in case of scrolling with the two fingers on the touch pad, - // if the event is not allowed to be passed further. - // https://github.com/prusa3d/PrusaSlicer/issues/2750 - // evt.Skip() used to trigger the needed screen refresh, but it does no more. wxWakeUpIdle() seem to work now. - wxWakeUpIdle(); -#endif /* __WXMSW__ */ - - // Performs layers editing updates, if enabled - if (is_layers_editing_enabled()) { - int object_idx_selected = m_selection.get_object_idx(); - if (object_idx_selected != -1) { - // A volume is selected. Test, whether hovering over a layer thickness bar. - if (m_layers_editing.bar_rect_contains(*this, (float)evt.GetX(), (float)evt.GetY())) { - // Adjust the width of the selection. - m_layers_editing.band_width = std::max(std::min(m_layers_editing.band_width * (1.0f + 0.1f * (float)evt.GetWheelRotation() / (float)evt.GetWheelDelta()), 10.0f), 1.5f); - if (m_canvas != nullptr) - m_canvas->Refresh(); - - return; - } - } - } - - // If the Search window or Undo/Redo list is opened, - // update them according to the event - if (m_main_toolbar.is_item_pressed("search") || - m_undoredo_toolbar.is_item_pressed("undo") || - m_undoredo_toolbar.is_item_pressed("redo")) { - m_mouse_wheel = int((double)evt.GetWheelRotation() / (double)evt.GetWheelDelta()); - return; - } - - // Inform gizmos about the event so they have the opportunity to react. - if (m_gizmos.on_mouse_wheel(evt)) - return; - - // Calculate the zoom delta and apply it to the current zoom factor - double direction_factor = (wxGetApp().app_config->get("reverse_mouse_wheel_zoom") == "1") ? -1.0 : 1.0; - _update_camera_zoom(direction_factor * (double)evt.GetWheelRotation() / (double)evt.GetWheelDelta()); -} - -void GLCanvas3D::on_timer(wxTimerEvent& evt) -{ - if (m_layers_editing.state == LayersEditing::Editing) - _perform_layer_editing_action(); -} - -void GLCanvas3D::on_render_timer(wxTimerEvent& evt) -{ - // no need to wake up idle - // right after this event, idle event is fired - // m_dirty = true; - // wxWakeUpIdle(); -} - - -void GLCanvas3D::schedule_extra_frame(int miliseconds) -{ - // Schedule idle event right now - if (miliseconds == 0) - { - // We want to wakeup idle evnt but most likely this is call inside render cycle so we need to wait - if (m_in_render) - miliseconds = 33; - else { - m_dirty = true; - wxWakeUpIdle(); - return; - } - } - int remaining_time = m_render_timer.GetInterval(); - // Timer is not running - if (!m_render_timer.IsRunning()) { - m_render_timer.StartOnce(miliseconds); - // Timer is running - restart only if new period is shorter than remaning period - } else { - if (miliseconds + 20 < remaining_time) { - m_render_timer.Stop(); - m_render_timer.StartOnce(miliseconds); - } - } -} - -#ifndef NDEBUG -// #define SLIC3R_DEBUG_MOUSE_EVENTS -#endif - -#ifdef SLIC3R_DEBUG_MOUSE_EVENTS -std::string format_mouse_event_debug_message(const wxMouseEvent &evt) -{ - static int idx = 0; - char buf[2048]; - std::string out; - sprintf(buf, "Mouse Event %d - ", idx ++); - out = buf; - - if (evt.Entering()) - out += "Entering "; - if (evt.Leaving()) - out += "Leaving "; - if (evt.Dragging()) - out += "Dragging "; - if (evt.Moving()) - out += "Moving "; - if (evt.Magnify()) - out += "Magnify "; - if (evt.LeftDown()) - out += "LeftDown "; - if (evt.LeftUp()) - out += "LeftUp "; - if (evt.LeftDClick()) - out += "LeftDClick "; - if (evt.MiddleDown()) - out += "MiddleDown "; - if (evt.MiddleUp()) - out += "MiddleUp "; - if (evt.MiddleDClick()) - out += "MiddleDClick "; - if (evt.RightDown()) - out += "RightDown "; - if (evt.RightUp()) - out += "RightUp "; - if (evt.RightDClick()) - out += "RightDClick "; - - sprintf(buf, "(%d, %d)", evt.GetX(), evt.GetY()); - out += buf; - return out; -} -#endif /* SLIC3R_DEBUG_MOUSE_EVENTS */ - -void GLCanvas3D::on_mouse(wxMouseEvent& evt) -{ - if (!m_initialized || !_set_current()) - return; - -#if ENABLE_RETINA_GL - const float scale = m_retina_helper->get_scale_factor(); - evt.SetX(evt.GetX() * scale); - evt.SetY(evt.GetY() * scale); -#endif - - Point pos(evt.GetX(), evt.GetY()); - - ImGuiWrapper* imgui = wxGetApp().imgui(); - if (m_tooltip.is_in_imgui() && evt.LeftUp()) - // ignore left up events coming from imgui windows and not processed by them - m_mouse.ignore_left_up = true; - m_tooltip.set_in_imgui(false); - if (imgui->update_mouse_data(evt)) { - m_mouse.position = evt.Leaving() ? Vec2d(-1.0, -1.0) : pos.cast(); - m_tooltip.set_in_imgui(true); - render(); -#ifdef SLIC3R_DEBUG_MOUSE_EVENTS - printf((format_mouse_event_debug_message(evt) + " - Consumed by ImGUI\n").c_str()); -#endif /* SLIC3R_DEBUG_MOUSE_EVENTS */ - m_dirty = true; - // do not return if dragging or tooltip not empty to allow for tooltip update - // also, do not return if the mouse is moving and also is inside MM gizmo to allow update seed fill selection - if (!m_mouse.dragging && m_tooltip.is_empty() && (m_gizmos.get_current_type() != GLGizmosManager::MmuSegmentation || !evt.Moving())) - return; - } - -#ifdef __WXMSW__ - bool on_enter_workaround = false; - if (! evt.Entering() && ! evt.Leaving() && m_mouse.position.x() == -1.0) { - // Workaround for SPE-832: There seems to be a mouse event sent to the window before evt.Entering() - m_mouse.position = pos.cast(); - render(); -#ifdef SLIC3R_DEBUG_MOUSE_EVENTS - printf((format_mouse_event_debug_message(evt) + " - OnEnter workaround\n").c_str()); -#endif /* SLIC3R_DEBUG_MOUSE_EVENTS */ - on_enter_workaround = true; - } else -#endif /* __WXMSW__ */ - { -#ifdef SLIC3R_DEBUG_MOUSE_EVENTS - printf((format_mouse_event_debug_message(evt) + " - other\n").c_str()); -#endif /* SLIC3R_DEBUG_MOUSE_EVENTS */ - } - - if (m_main_toolbar.on_mouse(evt, *this)) { - if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) - mouse_up_cleanup(); - m_mouse.set_start_position_3D_as_invalid(); - return; - } - - if (m_undoredo_toolbar.on_mouse(evt, *this)) { - if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) - mouse_up_cleanup(); - m_mouse.set_start_position_3D_as_invalid(); - return; - } - - if (wxGetApp().plater()->get_collapse_toolbar().on_mouse(evt, *this)) { - if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) - mouse_up_cleanup(); - m_mouse.set_start_position_3D_as_invalid(); - return; - } - - if (wxGetApp().plater()->get_view_toolbar().on_mouse(evt, *this)) { - if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) - mouse_up_cleanup(); - m_mouse.set_start_position_3D_as_invalid(); - return; - } - - for (GLVolume* volume : m_volumes.volumes) { - volume->force_sinking_contours = false; - } - - auto show_sinking_contours = [this]() { - const Selection::IndicesList& idxs = m_selection.get_volume_idxs(); - for (unsigned int idx : idxs) { - m_volumes.volumes[idx]->force_sinking_contours = true; - } - m_dirty = true; - }; - - if (m_gizmos.on_mouse(evt)) { - if (wxWindow::FindFocus() != m_canvas) - // Grab keyboard focus for input in gizmo dialogs. - m_canvas->SetFocus(); - - if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) - mouse_up_cleanup(); - - m_mouse.set_start_position_3D_as_invalid(); - m_mouse.position = pos.cast(); - - if (evt.Dragging() && current_printer_technology() == ptFFF && fff_print()->config().complete_objects) { - switch (m_gizmos.get_current_type()) - { - case GLGizmosManager::EType::Move: - case GLGizmosManager::EType::Scale: - case GLGizmosManager::EType::Rotate: - { - update_sequential_clearance(); - break; - } - default: { break; } - } - } - else if (evt.Dragging()) { - switch (m_gizmos.get_current_type()) - { - case GLGizmosManager::EType::Move: - case GLGizmosManager::EType::Scale: - case GLGizmosManager::EType::Rotate: - { - show_sinking_contours(); - break; - } - default: { break; } - } - } - - return; - } - - bool any_gizmo_active = m_gizmos.get_current() != nullptr; - - int selected_object_idx = m_selection.get_object_idx(); - int layer_editing_object_idx = is_layers_editing_enabled() ? selected_object_idx : -1; - m_layers_editing.select_object(*m_model, layer_editing_object_idx); - - if (m_mouse.drag.move_requires_threshold && m_mouse.is_move_start_threshold_position_2D_defined() && m_mouse.is_move_threshold_met(pos)) { - m_mouse.drag.move_requires_threshold = false; - m_mouse.set_move_start_threshold_position_2D_as_invalid(); - } - - if (evt.ButtonDown() && wxWindow::FindFocus() != m_canvas) - // Grab keyboard focus on any mouse click event. - m_canvas->SetFocus(); - - if (evt.Entering()) { -//#if defined(__WXMSW__) || defined(__linux__) -// // On Windows and Linux needs focus in order to catch key events - // Set focus in order to remove it from sidebar fields - if (m_canvas != nullptr) { - // Only set focus, if the top level window of this canvas is active. - auto p = dynamic_cast(evt.GetEventObject()); - while (p->GetParent()) - p = p->GetParent(); - auto *top_level_wnd = dynamic_cast(p); - if (top_level_wnd && top_level_wnd->IsActive()) - m_canvas->SetFocus(); - m_mouse.position = pos.cast(); - m_tooltip_enabled = false; - // 1) forces a frame render to ensure that m_hover_volume_idxs is updated even when the user right clicks while - // the context menu is shown, ensuring it to disappear if the mouse is outside any volume and to - // change the volume hover state if any is under the mouse - // 2) when switching between 3d view and preview the size of the canvas changes if the side panels are visible, - // so forces a resize to avoid multiple renders with different sizes (seen as flickering) - _refresh_if_shown_on_screen(); - m_tooltip_enabled = true; - } - m_mouse.set_start_position_2D_as_invalid(); -//#endif - } - else if (evt.Leaving()) { - _deactivate_undo_redo_toolbar_items(); - - // to remove hover on objects when the mouse goes out of this canvas - m_mouse.position = Vec2d(-1.0, -1.0); - m_dirty = true; - } - else if (evt.LeftDown() || evt.RightDown() || evt.MiddleDown()) { - if (_deactivate_undo_redo_toolbar_items() || _deactivate_search_toolbar_item() || _deactivate_arrange_menu()) - return; - - // If user pressed left or right button we first check whether this happened - // on a volume or not. - m_layers_editing.state = LayersEditing::Unknown; - if (layer_editing_object_idx != -1 && m_layers_editing.bar_rect_contains(*this, pos(0), pos(1))) { - // A volume is selected and the mouse is inside the layer thickness bar. - // Start editing the layer height. - m_layers_editing.state = LayersEditing::Editing; - _perform_layer_editing_action(&evt); - } - else if (evt.LeftDown() && (evt.ShiftDown() || evt.AltDown()) && m_picking_enabled) { - if (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports - && m_gizmos.get_current_type() != GLGizmosManager::FdmSupports - && m_gizmos.get_current_type() != GLGizmosManager::Seam - && m_gizmos.get_current_type() != GLGizmosManager::MmuSegmentation) { - m_rectangle_selection.start_dragging(m_mouse.position, evt.ShiftDown() ? GLSelectionRectangle::Select : GLSelectionRectangle::Deselect); - m_dirty = true; - } - } - else { - // Select volume in this 3D canvas. - // Don't deselect a volume if layer editing is enabled or any gizmo is active. We want the object to stay selected - // during the scene manipulation. - - if (m_picking_enabled && (!any_gizmo_active || !evt.CmdDown()) && (!m_hover_volume_idxs.empty() || !is_layers_editing_enabled())) { - if (evt.LeftDown() && !m_hover_volume_idxs.empty()) { - int volume_idx = get_first_hover_volume_idx(); - bool already_selected = m_selection.contains_volume(volume_idx); - bool ctrl_down = evt.CmdDown(); - - Selection::IndicesList curr_idxs = m_selection.get_volume_idxs(); - - if (already_selected && ctrl_down) - m_selection.remove(volume_idx); - else { - m_selection.add(volume_idx, !ctrl_down, true); - m_mouse.drag.move_requires_threshold = !already_selected; - if (already_selected) - m_mouse.set_move_start_threshold_position_2D_as_invalid(); - else - m_mouse.drag.move_start_threshold_position_2D = pos; - } - - // propagate event through callback - if (curr_idxs != m_selection.get_volume_idxs()) { - if (m_selection.is_empty()) - m_gizmos.reset_all_states(); - else - m_gizmos.refresh_on_off_state(); - - m_gizmos.update_data(); - post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT)); - m_dirty = true; - } - } - } - - if (!m_hover_volume_idxs.empty()) { - if (evt.LeftDown() && m_moving_enabled && m_mouse.drag.move_volume_idx == -1) { - // Only accept the initial position, if it is inside the volume bounding box. - int volume_idx = get_first_hover_volume_idx(); - BoundingBoxf3 volume_bbox = m_volumes.volumes[volume_idx]->transformed_bounding_box(); - volume_bbox.offset(1.0); - if ((!any_gizmo_active || !evt.CmdDown()) && volume_bbox.contains(m_mouse.scene_position)) { - m_volumes.volumes[volume_idx]->hover = GLVolume::HS_None; - // The dragging operation is initiated. - m_mouse.drag.move_volume_idx = volume_idx; - m_selection.start_dragging(); - m_mouse.drag.start_position_3D = m_mouse.scene_position; - m_sequential_print_clearance_first_displacement = true; - m_moving = true; - } - } - } - } - } - else if (evt.Dragging() && evt.LeftIsDown() && m_layers_editing.state == LayersEditing::Unknown && m_mouse.drag.move_volume_idx != -1) { - if (!m_mouse.drag.move_requires_threshold) { - m_mouse.dragging = true; - Vec3d cur_pos = m_mouse.drag.start_position_3D; - // we do not want to translate objects if the user just clicked on an object while pressing shift to remove it from the selection and then drag - if (m_selection.contains_volume(get_first_hover_volume_idx())) { - const Camera& camera = wxGetApp().plater()->get_camera(); - if (std::abs(camera.get_dir_forward()(2)) < EPSILON) { - // side view -> move selected volumes orthogonally to camera view direction - Linef3 ray = mouse_ray(pos); - Vec3d dir = ray.unit_vector(); - // finds the intersection of the mouse ray with the plane parallel to the camera viewport and passing throught the starting position - // use ray-plane intersection see i.e. https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection algebric form - // in our case plane normal and ray direction are the same (orthogonal view) - // when moving to perspective camera the negative z unit axis of the camera needs to be transformed in world space and used as plane normal - Vec3d inters = ray.a + (m_mouse.drag.start_position_3D - ray.a).dot(dir) / dir.squaredNorm() * dir; - // vector from the starting position to the found intersection - Vec3d inters_vec = inters - m_mouse.drag.start_position_3D; - - Vec3d camera_right = camera.get_dir_right(); - Vec3d camera_up = camera.get_dir_up(); - - // finds projection of the vector along the camera axes - double projection_x = inters_vec.dot(camera_right); - double projection_z = inters_vec.dot(camera_up); - - // apply offset - cur_pos = m_mouse.drag.start_position_3D + projection_x * camera_right + projection_z * camera_up; - } - else { - // Generic view - // Get new position at the same Z of the initial click point. - float z0 = 0.0f; - float z1 = 1.0f; - cur_pos = Linef3(_mouse_to_3d(pos, &z0), _mouse_to_3d(pos, &z1)).intersect_plane(m_mouse.drag.start_position_3D(2)); - } - } - - m_selection.translate(cur_pos - m_mouse.drag.start_position_3D); - if (current_printer_technology() == ptFFF && fff_print()->config().complete_objects) - update_sequential_clearance(); - wxGetApp().obj_manipul()->set_dirty(); - m_dirty = true; - } - } - else if (evt.Dragging() && evt.LeftIsDown() && m_picking_enabled && m_rectangle_selection.is_dragging()) { - m_rectangle_selection.dragging(pos.cast()); - m_dirty = true; - } - else if (evt.Dragging()) { - m_mouse.dragging = true; - - if (m_layers_editing.state != LayersEditing::Unknown && layer_editing_object_idx != -1) { - if (m_layers_editing.state == LayersEditing::Editing) { - _perform_layer_editing_action(&evt); - m_mouse.position = pos.cast(); - } - } - // do not process the dragging if the left mouse was set down in another canvas - else if (evt.LeftIsDown()) { - // if dragging over blank area with left button, rotate - if ((any_gizmo_active || m_hover_volume_idxs.empty()) && m_mouse.is_start_position_3D_defined()) { - const Vec3d rot = (Vec3d(pos.x(), pos.y(), 0.) - m_mouse.drag.start_position_3D) * (PI * TRACKBALLSIZE / 180.); - if (wxGetApp().app_config->get("use_free_camera") == "1") - // Virtual track ball (similar to the 3DConnexion mouse). - wxGetApp().plater()->get_camera().rotate_local_around_target(Vec3d(rot.y(), rot.x(), 0.)); - else { - // Forces camera right vector to be parallel to XY plane in case it has been misaligned using the 3D mouse free rotation. - // It is cheaper to call this function right away instead of testing wxGetApp().plater()->get_mouse3d_controller().connected(), - // which checks an atomics (flushes CPU caches). - // See GH issue #3816. - Camera& camera = wxGetApp().plater()->get_camera(); - camera.recover_from_free_camera(); - camera.rotate_on_sphere(rot.x(), rot.y(), current_printer_technology() != ptSLA); - } - - m_dirty = true; - } - m_mouse.drag.start_position_3D = Vec3d((double)pos(0), (double)pos(1), 0.0); - } - else if (evt.MiddleIsDown() || evt.RightIsDown()) { - // If dragging over blank area with right button, pan. - if (m_mouse.is_start_position_2D_defined()) { - // get point in model space at Z = 0 - float z = 0.0f; - const Vec3d& cur_pos = _mouse_to_3d(pos, &z); - Vec3d orig = _mouse_to_3d(m_mouse.drag.start_position_2D, &z); - Camera& camera = wxGetApp().plater()->get_camera(); - if (wxGetApp().app_config->get("use_free_camera") != "1") - // Forces camera right vector to be parallel to XY plane in case it has been misaligned using the 3D mouse free rotation. - // It is cheaper to call this function right away instead of testing wxGetApp().plater()->get_mouse3d_controller().connected(), - // which checks an atomics (flushes CPU caches). - // See GH issue #3816. - camera.recover_from_free_camera(); - - camera.set_target(camera.get_target() + orig - cur_pos); - m_dirty = true; - } - - m_mouse.drag.start_position_2D = pos; - } - } - else if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) { - if (evt.LeftUp()) - m_selection.stop_dragging(); - - if (m_layers_editing.state != LayersEditing::Unknown) { - m_layers_editing.state = LayersEditing::Unknown; - _stop_timer(); - m_layers_editing.accept_changes(*this); - } - else if (m_mouse.drag.move_volume_idx != -1 && m_mouse.dragging) { - do_move(L("Move Object")); - wxGetApp().obj_manipul()->set_dirty(); - // Let the plater know that the dragging finished, so a delayed refresh - // of the scene with the background processing data should be performed. - post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); - } - else if (evt.LeftUp() && m_picking_enabled && m_rectangle_selection.is_dragging()) { - if (evt.ShiftDown() || evt.AltDown()) - _update_selection_from_hover(); - - m_rectangle_selection.stop_dragging(); - } - else if (evt.LeftUp() && !m_mouse.ignore_left_up && !m_mouse.dragging && m_hover_volume_idxs.empty() && !is_layers_editing_enabled()) { - // deselect and propagate event through callback - if (!evt.ShiftDown() && (!any_gizmo_active || !evt.CmdDown()) && m_picking_enabled) - deselect_all(); - } - else if (evt.RightUp()) { - m_mouse.position = pos.cast(); - // forces a frame render to ensure that m_hover_volume_idxs is updated even when the user right clicks while - // the context menu is already shown - render(); - if (!m_hover_volume_idxs.empty()) { - // if right clicking on volume, propagate event through callback (shows context menu) - int volume_idx = get_first_hover_volume_idx(); - if (!m_volumes.volumes[volume_idx]->is_wipe_tower // no context menu for the wipe tower - && m_gizmos.get_current_type() != GLGizmosManager::SlaSupports) // disable context menu when the gizmo is open - { - // forces the selection of the volume - /* m_selection.add(volume_idx); // #et_FIXME_if_needed - * To avoid extra "Add-Selection" snapshots, - * call add() with check_for_already_contained=true - * */ - m_selection.add(volume_idx, true, true); - m_gizmos.refresh_on_off_state(); - post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT)); - m_gizmos.update_data(); - wxGetApp().obj_manipul()->set_dirty(); - // forces a frame render to update the view before the context menu is shown - render(); - } - } - Vec2d logical_pos = pos.cast(); -#if ENABLE_RETINA_GL - const float factor = m_retina_helper->get_scale_factor(); - logical_pos = logical_pos.cwiseQuotient(Vec2d(factor, factor)); -#endif // ENABLE_RETINA_GL - if (!m_mouse.dragging) { - // do not post the event if the user is panning the scene - // or if right click was done over the wipe tower - bool post_right_click_event = m_hover_volume_idxs.empty() || !m_volumes.volumes[get_first_hover_volume_idx()]->is_wipe_tower; - if (post_right_click_event) - post_event(RBtnEvent(EVT_GLCANVAS_RIGHT_CLICK, { logical_pos, m_hover_volume_idxs.empty() })); - } - } - - mouse_up_cleanup(); - } - else if (evt.Moving()) { - m_mouse.position = pos.cast(); - - // updates gizmos overlay - if (m_selection.is_empty()) - m_gizmos.reset_all_states(); - - m_dirty = true; - } - else - evt.Skip(); - - if (m_moving) - show_sinking_contours(); - -#ifdef __WXMSW__ - if (on_enter_workaround) - m_mouse.position = Vec2d(-1., -1.); -#endif /* __WXMSW__ */ -} - -void GLCanvas3D::on_paint(wxPaintEvent& evt) -{ - if (m_initialized) - m_dirty = true; - else - // Call render directly, so it gets initialized immediately, not from On Idle handler. - this->render(); -} - -void GLCanvas3D::on_set_focus(wxFocusEvent& evt) -{ - m_tooltip_enabled = false; - _refresh_if_shown_on_screen(); - m_tooltip_enabled = true; -} - -Size GLCanvas3D::get_canvas_size() const -{ - int w = 0; - int h = 0; - - if (m_canvas != nullptr) - m_canvas->GetSize(&w, &h); - -#if ENABLE_RETINA_GL - const float factor = m_retina_helper->get_scale_factor(); - w *= factor; - h *= factor; -#else - const float factor = 1.0f; -#endif - - return Size(w, h, factor); -} - -Vec2d GLCanvas3D::get_local_mouse_position() const -{ - if (m_canvas == nullptr) - return Vec2d::Zero(); - - wxPoint mouse_pos = m_canvas->ScreenToClient(wxGetMousePosition()); - const double factor = -#if ENABLE_RETINA_GL - m_retina_helper->get_scale_factor(); -#else - 1.0; -#endif - return Vec2d(factor * mouse_pos.x, factor * mouse_pos.y); -} - -void GLCanvas3D::set_tooltip(const std::string& tooltip) -{ - if (m_canvas != nullptr) - m_tooltip.set_text(tooltip); -} - -void GLCanvas3D::do_move(const std::string& snapshot_type) -{ - if (m_model == nullptr) - return; - - if (!snapshot_type.empty()) - wxGetApp().plater()->take_snapshot(_(snapshot_type)); - - std::set> done; // keeps track of modified instances - bool object_moved = false; - Vec3d wipe_tower_origin = Vec3d::Zero(); - - Selection::EMode selection_mode = m_selection.get_mode(); - - for (const GLVolume* v : m_volumes.volumes) { - int object_idx = v->object_idx(); - int instance_idx = v->instance_idx(); - int volume_idx = v->volume_idx(); - - std::pair done_id(object_idx, instance_idx); - - if (0 <= object_idx && object_idx < (int)m_model->objects.size()) { - done.insert(done_id); - - // Move instances/volumes - ModelObject* model_object = m_model->objects[object_idx]; - if (model_object != nullptr) { - if (selection_mode == Selection::Instance) - model_object->instances[instance_idx]->set_offset(v->get_instance_offset()); - else if (selection_mode == Selection::Volume) - model_object->volumes[volume_idx]->set_offset(v->get_volume_offset()); - - object_moved = true; - model_object->invalidate_bounding_box(); - } - } - else if (object_idx == 1000) - // Move a wipe tower proxy. - wipe_tower_origin = v->get_volume_offset(); - } - - // Fixes flying instances - for (const std::pair& i : done) { - ModelObject* m = m_model->objects[i.first]; - const double shift_z = m->get_instance_min_z(i.second); - if (current_printer_technology() == ptSLA || shift_z > SINKING_Z_THRESHOLD) { - const Vec3d shift(0.0, 0.0, -shift_z); - m_selection.translate(i.first, i.second, shift); - m->translate_instance(i.second, shift); - } - wxGetApp().obj_list()->update_info_items(static_cast(i.first)); - } - - // if the selection is not valid to allow for layer editing after the move, we need to turn off the tool if it is running - // similar to void Plater::priv::selection_changed() - if (!wxGetApp().plater()->can_layers_editing() && is_layers_editing_enabled()) - post_event(SimpleEvent(EVT_GLTOOLBAR_LAYERSEDITING)); - - if (object_moved) - post_event(SimpleEvent(EVT_GLCANVAS_INSTANCE_MOVED)); - - if (wipe_tower_origin != Vec3d::Zero()) - post_event(Vec3dEvent(EVT_GLCANVAS_WIPETOWER_MOVED, std::move(wipe_tower_origin))); - - reset_sequential_print_clearance(); - - m_dirty = true; -} - -void GLCanvas3D::do_rotate(const std::string& snapshot_type) -{ - if (m_model == nullptr) - return; - - if (!snapshot_type.empty()) - wxGetApp().plater()->take_snapshot(_(snapshot_type)); - - // stores current min_z of instances - std::map, double> min_zs; - for (int i = 0; i < static_cast(m_model->objects.size()); ++i) { - const ModelObject* obj = m_model->objects[i]; - for (int j = 0; j < static_cast(obj->instances.size()); ++j) { - if (snapshot_type.empty() && m_selection.get_object_idx() == i) { - // This means we are flattening this object. In that case pretend - // that it is not sinking (even if it is), so it is placed on bed - // later on (whatever is sinking will be left sinking). - min_zs[{ i, j }] = SINKING_Z_THRESHOLD; - } else - min_zs[{ i, j }] = obj->instance_bounding_box(j).min.z(); - - } - } - - std::set> done; // keeps track of modified instances - - Selection::EMode selection_mode = m_selection.get_mode(); - - for (const GLVolume* v : m_volumes.volumes) { - int object_idx = v->object_idx(); - if (object_idx == 1000) { // the wipe tower - Vec3d offset = v->get_volume_offset(); - post_event(Vec3dEvent(EVT_GLCANVAS_WIPETOWER_ROTATED, Vec3d(offset(0), offset(1), v->get_volume_rotation()(2)))); - } - if (object_idx < 0 || (int)m_model->objects.size() <= object_idx) - continue; - - int instance_idx = v->instance_idx(); - int volume_idx = v->volume_idx(); - - done.insert(std::pair(object_idx, instance_idx)); - - // Rotate instances/volumes. - ModelObject* model_object = m_model->objects[object_idx]; - if (model_object != nullptr) { - if (selection_mode == Selection::Instance) { - model_object->instances[instance_idx]->set_rotation(v->get_instance_rotation()); - model_object->instances[instance_idx]->set_offset(v->get_instance_offset()); - } - else if (selection_mode == Selection::Volume) { - model_object->volumes[volume_idx]->set_rotation(v->get_volume_rotation()); - model_object->volumes[volume_idx]->set_offset(v->get_volume_offset()); - } - model_object->invalidate_bounding_box(); - } - } - - // Fixes sinking/flying instances - for (const std::pair& i : done) { - ModelObject* m = m_model->objects[i.first]; - const double shift_z = m->get_instance_min_z(i.second); - // leave sinking instances as sinking - if (min_zs.find({ i.first, i.second })->second >= SINKING_Z_THRESHOLD || shift_z > SINKING_Z_THRESHOLD) { - const Vec3d shift(0.0, 0.0, -shift_z); - m_selection.translate(i.first, i.second, shift); - m->translate_instance(i.second, shift); - } - - wxGetApp().obj_list()->update_info_items(static_cast(i.first)); - } - - if (!done.empty()) - post_event(SimpleEvent(EVT_GLCANVAS_INSTANCE_ROTATED)); - - m_dirty = true; -} - -void GLCanvas3D::do_scale(const std::string& snapshot_type) -{ - if (m_model == nullptr) - return; - - if (!snapshot_type.empty()) - wxGetApp().plater()->take_snapshot(_(snapshot_type)); - - // stores current min_z of instances - std::map, double> min_zs; - if (!snapshot_type.empty()) { - for (int i = 0; i < static_cast(m_model->objects.size()); ++i) { - const ModelObject* obj = m_model->objects[i]; - for (int j = 0; j < static_cast(obj->instances.size()); ++j) { - min_zs[{ i, j }] = obj->instance_bounding_box(j).min.z(); - } - } - } - - std::set> done; // keeps track of modified instances - - Selection::EMode selection_mode = m_selection.get_mode(); - - for (const GLVolume* v : m_volumes.volumes) { - int object_idx = v->object_idx(); - if (object_idx < 0 || (int)m_model->objects.size() <= object_idx) - continue; - - int instance_idx = v->instance_idx(); - int volume_idx = v->volume_idx(); - - done.insert(std::pair(object_idx, instance_idx)); - - // Rotate instances/volumes - ModelObject* model_object = m_model->objects[object_idx]; - if (model_object != nullptr) { - if (selection_mode == Selection::Instance) { - model_object->instances[instance_idx]->set_scaling_factor(v->get_instance_scaling_factor()); - model_object->instances[instance_idx]->set_offset(v->get_instance_offset()); - } - else if (selection_mode == Selection::Volume) { - model_object->instances[instance_idx]->set_offset(v->get_instance_offset()); - model_object->volumes[volume_idx]->set_scaling_factor(v->get_volume_scaling_factor()); - model_object->volumes[volume_idx]->set_offset(v->get_volume_offset()); - } - model_object->invalidate_bounding_box(); - } - } - - // Fixes sinking/flying instances - for (const std::pair& i : done) { - ModelObject* m = m_model->objects[i.first]; - double shift_z = m->get_instance_min_z(i.second); - // leave sinking instances as sinking - if (min_zs.empty() || min_zs.find({ i.first, i.second })->second >= SINKING_Z_THRESHOLD || shift_z > SINKING_Z_THRESHOLD) { - Vec3d shift(0.0, 0.0, -shift_z); - m_selection.translate(i.first, i.second, shift); - m->translate_instance(i.second, shift); - } - wxGetApp().obj_list()->update_info_items(static_cast(i.first)); - } - - if (!done.empty()) - post_event(SimpleEvent(EVT_GLCANVAS_INSTANCE_SCALED)); - - m_dirty = true; -} - -void GLCanvas3D::do_flatten(const Vec3d& normal, const std::string& snapshot_type) -{ - if (!snapshot_type.empty()) - wxGetApp().plater()->take_snapshot(_(snapshot_type)); - - m_selection.flattening_rotate(normal); - do_rotate(""); // avoid taking another snapshot -} - -void GLCanvas3D::do_mirror(const std::string& snapshot_type) -{ - if (m_model == nullptr) - return; - - if (!snapshot_type.empty()) - wxGetApp().plater()->take_snapshot(_(snapshot_type)); - - // stores current min_z of instances - std::map, double> min_zs; - if (!snapshot_type.empty()) { - for (int i = 0; i < static_cast(m_model->objects.size()); ++i) { - const ModelObject* obj = m_model->objects[i]; - for (int j = 0; j < static_cast(obj->instances.size()); ++j) { - min_zs[{ i, j }] = obj->instance_bounding_box(j).min.z(); - } - } - } - - std::set> done; // keeps track of modified instances - - Selection::EMode selection_mode = m_selection.get_mode(); - - for (const GLVolume* v : m_volumes.volumes) { - int object_idx = v->object_idx(); - if (object_idx < 0 || (int)m_model->objects.size() <= object_idx) - continue; - - int instance_idx = v->instance_idx(); - int volume_idx = v->volume_idx(); - - done.insert(std::pair(object_idx, instance_idx)); - - // Mirror instances/volumes - ModelObject* model_object = m_model->objects[object_idx]; - if (model_object != nullptr) { - if (selection_mode == Selection::Instance) - model_object->instances[instance_idx]->set_mirror(v->get_instance_mirror()); - else if (selection_mode == Selection::Volume) - model_object->volumes[volume_idx]->set_mirror(v->get_volume_mirror()); - - model_object->invalidate_bounding_box(); - } - } - - // Fixes sinking/flying instances - for (const std::pair& i : done) { - ModelObject* m = m_model->objects[i.first]; - double shift_z = m->get_instance_min_z(i.second); - // leave sinking instances as sinking - if (min_zs.empty() || min_zs.find({ i.first, i.second })->second >= SINKING_Z_THRESHOLD || shift_z > SINKING_Z_THRESHOLD) { - Vec3d shift(0.0, 0.0, -shift_z); - m_selection.translate(i.first, i.second, shift); - m->translate_instance(i.second, shift); - } - wxGetApp().obj_list()->update_info_items(static_cast(i.first)); - } - - post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); - - m_dirty = true; -} - -void GLCanvas3D::update_gizmos_on_off_state() -{ - set_as_dirty(); - m_gizmos.update_data(); - m_gizmos.refresh_on_off_state(); -} - -void GLCanvas3D::handle_sidebar_focus_event(const std::string& opt_key, bool focus_on) -{ - m_sidebar_field = focus_on ? opt_key : ""; - - if (!m_sidebar_field.empty()) - m_gizmos.reset_all_states(); - - m_dirty = true; -} - -void GLCanvas3D::handle_layers_data_focus_event(const t_layer_height_range range, const EditorType type) -{ - std::string field = "layer_" + std::to_string(type) + "_" + std::to_string(range.first) + "_" + std::to_string(range.second); - handle_sidebar_focus_event(field, true); -} - -void GLCanvas3D::update_ui_from_settings() -{ - m_dirty = true; - -#if __APPLE__ - // Update OpenGL scaling on OSX after the user toggled the "use_retina_opengl" settings in Preferences dialog. - const float orig_scaling = m_retina_helper->get_scale_factor(); - - const bool use_retina = wxGetApp().app_config->get("use_retina_opengl") == "1"; - BOOST_LOG_TRIVIAL(debug) << "GLCanvas3D: Use Retina OpenGL: " << use_retina; - m_retina_helper->set_use_retina(use_retina); - const float new_scaling = m_retina_helper->get_scale_factor(); - - if (new_scaling != orig_scaling) { - BOOST_LOG_TRIVIAL(debug) << "GLCanvas3D: Scaling factor: " << new_scaling; - - Camera& camera = wxGetApp().plater()->get_camera(); - camera.set_zoom(camera.get_zoom() * new_scaling / orig_scaling); - _refresh_if_shown_on_screen(); - } -#endif // ENABLE_RETINA_GL - - if (wxGetApp().is_editor()) - wxGetApp().plater()->enable_collapse_toolbar(wxGetApp().app_config->get("show_collapse_button") == "1"); -} - -GLCanvas3D::WipeTowerInfo GLCanvas3D::get_wipe_tower_info() const -{ - WipeTowerInfo wti; - - for (const GLVolume* vol : m_volumes.volumes) { - if (vol->is_wipe_tower) { - wti.m_pos = Vec2d(m_config->opt_float("wipe_tower_x"), - m_config->opt_float("wipe_tower_y")); - wti.m_rotation = (M_PI/180.) * m_config->opt_float("wipe_tower_rotation_angle"); - const BoundingBoxf3& bb = vol->bounding_box(); - wti.m_bb = BoundingBoxf{to_2d(bb.min), to_2d(bb.max)}; - break; - } - } - - return wti; -} - -Linef3 GLCanvas3D::mouse_ray(const Point& mouse_pos) -{ - float z0 = 0.0f; - float z1 = 1.0f; - return Linef3(_mouse_to_3d(mouse_pos, &z0), _mouse_to_3d(mouse_pos, &z1)); -} - -double GLCanvas3D::get_size_proportional_to_max_bed_size(double factor) const -{ - const BoundingBoxf& bbox = m_bed.build_volume().bounding_volume2d(); - return factor * std::max(bbox.size()[0], bbox.size()[1]); -} - -void GLCanvas3D::set_cursor(ECursorType type) -{ - if ((m_canvas != nullptr) && (m_cursor_type != type)) - { - switch (type) - { - case Standard: { m_canvas->SetCursor(*wxSTANDARD_CURSOR); break; } - case Cross: { m_canvas->SetCursor(*wxCROSS_CURSOR); break; } - } - - m_cursor_type = type; - } -} - -void GLCanvas3D::msw_rescale() -{ -} - -void GLCanvas3D::update_tooltip_for_settings_item_in_main_toolbar() -{ - std::string new_tooltip = _u8L("Switch to Settings") + - "\n" + "[" + GUI::shortkey_ctrl_prefix() + "2] - " + _u8L("Print Settings Tab") + - "\n" + "[" + GUI::shortkey_ctrl_prefix() + "3] - " + (current_printer_technology() == ptFFF ? _u8L("Filament Settings Tab") : _u8L("Material Settings Tab")) + - "\n" + "[" + GUI::shortkey_ctrl_prefix() + "4] - " + _u8L("Printer Settings Tab") ; - - m_main_toolbar.set_tooltip(get_main_toolbar_item_id("settings"), new_tooltip); -} - -bool GLCanvas3D::has_toolpaths_to_export() const -{ - return m_gcode_viewer.can_export_toolpaths(); -} - -void GLCanvas3D::export_toolpaths_to_obj(const char* filename) const -{ - m_gcode_viewer.export_toolpaths_to_obj(filename); -} - -void GLCanvas3D::mouse_up_cleanup() -{ - m_moving = false; - m_mouse.drag.move_volume_idx = -1; - m_mouse.set_start_position_3D_as_invalid(); - m_mouse.set_start_position_2D_as_invalid(); - m_mouse.dragging = false; - m_mouse.ignore_left_up = false; - m_dirty = true; - - if (m_canvas->HasCapture()) - m_canvas->ReleaseMouse(); -} - -void GLCanvas3D::update_sequential_clearance() -{ - if (current_printer_technology() != ptFFF || !fff_print()->config().complete_objects) - return; - - if (m_layers_editing.is_enabled() || m_gizmos.is_dragging()) - return; - - // collects instance transformations from volumes - // first define temporary cache - unsigned int instances_count = 0; - std::vector>> instance_transforms; - for (size_t obj = 0; obj < m_model->objects.size(); ++obj) { - instance_transforms.emplace_back(std::vector>()); - const ModelObject* model_object = m_model->objects[obj]; - for (size_t i = 0; i < model_object->instances.size(); ++i) { - instance_transforms[obj].emplace_back(std::optional()); - ++instances_count; - } - } - - if (instances_count == 1) - return; - - // second fill temporary cache with data from volumes - for (const GLVolume* v : m_volumes.volumes) { - if (v->is_modifier || v->is_wipe_tower) - continue; - - auto& transform = instance_transforms[v->object_idx()][v->instance_idx()]; - if (!transform.has_value()) - transform = v->get_instance_transformation(); - } - - // calculates objects 2d hulls (see also: Print::sequential_print_horizontal_clearance_valid()) - // this is done only the first time this method is called while moving the mouse, - // the results are then cached for following displacements - if (m_sequential_print_clearance_first_displacement) { - m_sequential_print_clearance.m_hull_2d_cache.clear(); - float shrink_factor = static_cast(scale_(0.5 * fff_print()->config().extruder_clearance_radius.value - EPSILON)); - double mitter_limit = scale_(0.1); - m_sequential_print_clearance.m_hull_2d_cache.reserve(m_model->objects.size()); - for (size_t i = 0; i < m_model->objects.size(); ++i) { - ModelObject* model_object = m_model->objects[i]; - ModelInstance* model_instance0 = model_object->instances.front(); - Polygon hull_2d = offset(model_object->convex_hull_2d(Geometry::assemble_transform({ 0.0, 0.0, model_instance0->get_offset().z() }, model_instance0->get_rotation(), - model_instance0->get_scaling_factor(), model_instance0->get_mirror())), - // Shrink the extruder_clearance_radius a tiny bit, so that if the object arrangement algorithm placed the objects - // exactly by satisfying the extruder_clearance_radius, this test will not trigger collision. - shrink_factor, - jtRound, mitter_limit).front(); - - Pointf3s& cache_hull_2d = m_sequential_print_clearance.m_hull_2d_cache.emplace_back(Pointf3s()); - cache_hull_2d.reserve(hull_2d.points.size()); - for (const Point& p : hull_2d.points) { - cache_hull_2d.emplace_back(unscale(p.x()), unscale(p.y()), 0.0); - } - } - m_sequential_print_clearance_first_displacement = false; - } - - // calculates instances 2d hulls (see also: Print::sequential_print_horizontal_clearance_valid()) - Polygons polygons; - polygons.reserve(instances_count); - for (size_t i = 0; i < instance_transforms.size(); ++i) { - const auto& instances = instance_transforms[i]; - double rotation_z0 = instances.front()->get_rotation().z(); - for (const auto& instance : instances) { - Geometry::Transformation transformation; - const Vec3d& offset = instance->get_offset(); - transformation.set_offset({ offset.x(), offset.y(), 0.0 }); - transformation.set_rotation(Z, instance->get_rotation().z() - rotation_z0); - const Transform3d& trafo = transformation.get_matrix(); - const Pointf3s& hull_2d = m_sequential_print_clearance.m_hull_2d_cache[i]; - Points inst_pts; - inst_pts.reserve(hull_2d.size()); - for (size_t j = 0; j < hull_2d.size(); ++j) { - const Vec3d p = trafo * hull_2d[j]; - inst_pts.emplace_back(scaled(p.x()), scaled(p.y())); - } - polygons.emplace_back(Geometry::convex_hull(std::move(inst_pts))); - } - } - - // sends instances 2d hulls to be rendered - set_sequential_print_clearance_visible(true); - set_sequential_print_clearance_render_fill(false); - set_sequential_print_clearance_polygons(polygons); -} - -bool GLCanvas3D::is_object_sinking(int object_idx) const -{ - for (const GLVolume* v : m_volumes.volumes) { - if (v->object_idx() == object_idx && (v->is_sinking() || (!v->is_modifier && v->is_below_printbed()))) - return true; - } - return false; -} - -bool GLCanvas3D::_is_shown_on_screen() const -{ - return (m_canvas != nullptr) ? m_canvas->IsShownOnScreen() : false; -} - -// Getter for the const char*[] -static bool string_getter(const bool is_undo, int idx, const char** out_text) -{ - return wxGetApp().plater()->undo_redo_string_getter(is_undo, idx, out_text); -} - -bool GLCanvas3D::_render_undo_redo_stack(const bool is_undo, float pos_x) -{ - bool action_taken = false; - - ImGuiWrapper* imgui = wxGetApp().imgui(); - - const float x = pos_x * (float)wxGetApp().plater()->get_camera().get_zoom() + 0.5f * (float)get_canvas_size().get_width(); - imgui->set_next_window_pos(x, m_undoredo_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); - std::string title = is_undo ? L("Undo History") : L("Redo History"); - imgui->begin(_(title), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); - - int hovered = m_imgui_undo_redo_hovered_pos; - int selected = -1; - float em = static_cast(wxGetApp().em_unit()); -#if ENABLE_RETINA_GL - em *= m_retina_helper->get_scale_factor(); -#endif - - if (imgui->undo_redo_list(ImVec2(18 * em, 26 * em), is_undo, &string_getter, hovered, selected, m_mouse_wheel)) - m_imgui_undo_redo_hovered_pos = hovered; - else - m_imgui_undo_redo_hovered_pos = -1; - - if (selected >= 0) { - is_undo ? wxGetApp().plater()->undo_to(selected) : wxGetApp().plater()->redo_to(selected); - action_taken = true; - } - - imgui->text(wxString::Format(is_undo ? _L_PLURAL("Undo %1$d Action", "Undo %1$d Actions", hovered + 1) : _L_PLURAL("Redo %1$d Action", "Redo %1$d Actions", hovered + 1), hovered + 1)); - - imgui->end(); - - return action_taken; -} - -// Getter for the const char*[] for the search list -static bool search_string_getter(int idx, const char** label, const char** tooltip) -{ - return wxGetApp().plater()->search_string_getter(idx, label, tooltip); -} - -bool GLCanvas3D::_render_search_list(float pos_x) -{ - bool action_taken = false; - ImGuiWrapper* imgui = wxGetApp().imgui(); - - const float x = /*pos_x * (float)wxGetApp().plater()->get_camera().get_zoom() + */0.5f * (float)get_canvas_size().get_width(); - imgui->set_next_window_pos(x, m_main_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); - std::string title = L("Search"); - imgui->begin(_(title), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); - - int selected = -1; - bool edited = false; - float em = static_cast(wxGetApp().em_unit()); -#if ENABLE_RETINA_GL - em *= m_retina_helper->get_scale_factor(); -#endif // ENABLE_RETINA_GL - - Sidebar& sidebar = wxGetApp().sidebar(); - - std::string& search_line = sidebar.get_search_line(); - char *s = new char[255]; - strcpy(s, search_line.empty() ? _u8L("Enter a search term").c_str() : search_line.c_str()); - - imgui->search_list(ImVec2(45 * em, 30 * em), &search_string_getter, s, - sidebar.get_searcher().view_params, - selected, edited, m_mouse_wheel, wxGetApp().is_localized()); - - search_line = s; - delete [] s; - if (search_line == _u8L("Enter a search term")) - search_line.clear(); - - if (edited) - sidebar.search(); - - if (selected >= 0) { - // selected == 9999 means that Esc kye was pressed - /*// revert commit https://github.com/prusa3d/PrusaSlicer/commit/91897589928789b261ca0dc735ffd46f2b0b99f2 - if (selected == 9999) - action_taken = true; - else - sidebar.jump_to_option(selected);*/ - if (selected != 9999) - sidebar.jump_to_option(selected); - action_taken = true; - } - - imgui->end(); - - return action_taken; -} - -bool GLCanvas3D::_render_arrange_menu(float pos_x) -{ - ImGuiWrapper *imgui = wxGetApp().imgui(); - - auto canvas_w = float(get_canvas_size().get_width()); - const float x = pos_x * float(wxGetApp().plater()->get_camera().get_zoom()) + 0.5f * canvas_w; - imgui->set_next_window_pos(x, m_main_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); - - imgui->begin(_L("Arrange options"), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse); - - ArrangeSettings settings = get_arrange_settings(); - ArrangeSettings &settings_out = get_arrange_settings_ref(this); - - auto &appcfg = wxGetApp().app_config; - PrinterTechnology ptech = current_printer_technology(); - - bool settings_changed = false; - float dist_min = 0.f; - std::string dist_key = "min_object_distance"; - std::string rot_key = "enable_rotation"; - std::string align_key = "alignment"; - std::string postfix; - - if (ptech == ptSLA) { - dist_min = 0.f; - postfix = "_sla"; - } else if (ptech == ptFFF) { - auto co_opt = m_config->option("complete_objects"); - if (co_opt && co_opt->value) { - dist_min = float(min_object_distance(*m_config)); - postfix = "_fff_seq_print"; - } else { - dist_min = 0.f; - postfix = "_fff"; - } - } - - dist_key += postfix; - rot_key += postfix; - align_key += postfix; - - imgui->text(GUI::format_wxstr(_L("Press %1%left mouse button to enter the exact value"), shortkey_ctrl_prefix())); - - if (imgui->slider_float(_L("Spacing"), &settings.distance, dist_min, 100.0f, "%5.2f") || dist_min > settings.distance) { - settings.distance = std::max(dist_min, settings.distance); - settings_out.distance = settings.distance; - appcfg->set("arrange", dist_key.c_str(), float_to_string_decimal_point(settings_out.distance)); - settings_changed = true; - } - - if (imgui->checkbox(_L("Enable rotations (slow)"), settings.enable_rotation)) { - settings_out.enable_rotation = settings.enable_rotation; - appcfg->set("arrange", rot_key.c_str(), settings_out.enable_rotation? "1" : "0"); - settings_changed = true; - } - - Points bed = m_config ? get_bed_shape(*m_config) : Points{}; - - if (arrangement::is_box(bed) && settings.alignment >= 0 && - imgui->combo(_L("Alignment"), {_u8L("Center"), _u8L("Rear left"), _u8L("Front left"), _u8L("Front right"), _u8L("Rear right"), _u8L("Random") }, settings.alignment)) { - settings_out.alignment = settings.alignment; - appcfg->set("arrange", align_key.c_str(), std::to_string(settings_out.alignment)); - settings_changed = true; - } - - ImGui::Separator(); - - if (imgui->button(_L("Reset"))) { - auto alignment = settings_out.alignment; - settings_out = ArrangeSettings{}; - settings_out.distance = std::max(dist_min, settings_out.distance); - - // Default alignment for XL printers set explicitly: - if (is_arrange_alignment_enabled()) - settings_out.alignment = static_cast(arrangement::Pivots::BottomLeft); - else - settings_out.alignment = alignment; - - appcfg->set("arrange", dist_key.c_str(), float_to_string_decimal_point(settings_out.distance)); - appcfg->set("arrange", rot_key.c_str(), settings_out.enable_rotation? "1" : "0"); - settings_changed = true; - } - - ImGui::SameLine(); - - if (imgui->button(_L("Arrange"))) { - wxGetApp().plater()->arrange(); - } - - imgui->end(); - - return settings_changed; -} - -#define ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT 0 -#if ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT -static void debug_output_thumbnail(const ThumbnailData& thumbnail_data) -{ - // debug export of generated image - wxImage image(thumbnail_data.width, thumbnail_data.height); - image.InitAlpha(); - - for (unsigned int r = 0; r < thumbnail_data.height; ++r) - { - unsigned int rr = (thumbnail_data.height - 1 - r) * thumbnail_data.width; - for (unsigned int c = 0; c < thumbnail_data.width; ++c) - { - unsigned char* px = (unsigned char*)thumbnail_data.pixels.data() + 4 * (rr + c); - image.SetRGB((int)c, (int)r, px[0], px[1], px[2]); - image.SetAlpha((int)c, (int)r, px[3]); - } - } - - image.SaveFile("C:/prusa/test/test.png", wxBITMAP_TYPE_PNG); -} -#endif // ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT - -void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, const ThumbnailsParams& thumbnail_params, const GLVolumeCollection& volumes, Camera::EType camera_type) -{ - auto is_visible = [](const GLVolume& v) { - bool ret = v.printable; - ret &= (!v.shader_outside_printer_detection_enabled || !v.is_outside); - return ret; - }; - - static const std::array orange = { 0.923f, 0.504f, 0.264f, 1.0f }; - static const std::array gray = { 0.64f, 0.64f, 0.64f, 1.0f }; - - GLVolumePtrs visible_volumes; - - for (GLVolume* vol : volumes.volumes) { - if (!vol->is_modifier && !vol->is_wipe_tower && (!thumbnail_params.parts_only || vol->composite_id.volume_id >= 0)) { - if (!thumbnail_params.printable_only || is_visible(*vol)) - visible_volumes.emplace_back(vol); - } - } - - BoundingBoxf3 volumes_box; - if (!visible_volumes.empty()) { - for (const GLVolume* vol : visible_volumes) { - volumes_box.merge(vol->transformed_bounding_box()); - } - } - else - // This happens for empty projects - volumes_box = m_bed.extended_bounding_box(); - - Camera camera; - camera.set_type(camera_type); - camera.set_scene_box(scene_bounding_box()); - camera.apply_viewport(0, 0, thumbnail_data.width, thumbnail_data.height); - camera.zoom_to_box(volumes_box); - camera.apply_view_matrix(); - - double near_z = -1.0; - double far_z = -1.0; - - if (thumbnail_params.show_bed) { - // extends the near and far z of the frustrum to avoid the bed being clipped - - // box in eye space - BoundingBoxf3 t_bed_box = m_bed.extended_bounding_box().transformed(camera.get_view_matrix()); - near_z = -t_bed_box.max.z(); - far_z = -t_bed_box.min.z(); - } - - camera.apply_projection(volumes_box, near_z, far_z); - - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); - if (shader == nullptr) - return; - - if (thumbnail_params.transparent_background) - glsafe(::glClearColor(0.0f, 0.0f, 0.0f, 0.0f)); - - glsafe(::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); - glsafe(::glEnable(GL_DEPTH_TEST)); - - shader->start_using(); - shader->set_uniform("emission_factor", 0.0f); - - for (GLVolume* vol : visible_volumes) { - shader->set_uniform("uniform_color", (vol->printable && !vol->is_outside) ? (current_printer_technology() == ptSLA ? vol->color : orange) : gray); - // the volume may have been deactivated by an active gizmo - bool is_active = vol->is_active; - vol->is_active = true; - vol->render(); - vol->is_active = is_active; - } - - shader->stop_using(); - - glsafe(::glDisable(GL_DEPTH_TEST)); - - if (thumbnail_params.show_bed) - _render_bed(!camera.is_looking_downward(), false); - - // restore background color - if (thumbnail_params.transparent_background) - glsafe(::glClearColor(1.0f, 1.0f, 1.0f, 1.0f)); -} - -void GLCanvas3D::_render_thumbnail_framebuffer(ThumbnailData& thumbnail_data, unsigned int w, unsigned int h, const ThumbnailsParams& thumbnail_params, const GLVolumeCollection& volumes, Camera::EType camera_type) -{ - thumbnail_data.set(w, h); - if (!thumbnail_data.is_valid()) - return; - - bool multisample = m_multisample_allowed; - if (multisample) - glsafe(::glEnable(GL_MULTISAMPLE)); - - GLint max_samples; - glsafe(::glGetIntegerv(GL_MAX_SAMPLES, &max_samples)); - GLsizei num_samples = max_samples / 2; - - GLuint render_fbo; - glsafe(::glGenFramebuffers(1, &render_fbo)); - glsafe(::glBindFramebuffer(GL_FRAMEBUFFER, render_fbo)); - - GLuint render_tex = 0; - GLuint render_tex_buffer = 0; - if (multisample) { - // use renderbuffer instead of texture to avoid the need to use glTexImage2DMultisample which is available only since OpenGL 3.2 - glsafe(::glGenRenderbuffers(1, &render_tex_buffer)); - glsafe(::glBindRenderbuffer(GL_RENDERBUFFER, render_tex_buffer)); - glsafe(::glRenderbufferStorageMultisample(GL_RENDERBUFFER, num_samples, GL_RGBA8, w, h)); - glsafe(::glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, render_tex_buffer)); - } - else { - glsafe(::glGenTextures(1, &render_tex)); - glsafe(::glBindTexture(GL_TEXTURE_2D, render_tex)); - glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr)); - glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); - glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); - glsafe(::glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, render_tex, 0)); - } - - GLuint render_depth; - glsafe(::glGenRenderbuffers(1, &render_depth)); - glsafe(::glBindRenderbuffer(GL_RENDERBUFFER, render_depth)); - if (multisample) - glsafe(::glRenderbufferStorageMultisample(GL_RENDERBUFFER, num_samples, GL_DEPTH_COMPONENT24, w, h)); - else - glsafe(::glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, w, h)); - - glsafe(::glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, render_depth)); - - GLenum drawBufs[] = { GL_COLOR_ATTACHMENT0 }; - glsafe(::glDrawBuffers(1, drawBufs)); - - if (::glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE) { - _render_thumbnail_internal(thumbnail_data, thumbnail_params, volumes, camera_type); - - if (multisample) { - GLuint resolve_fbo; - glsafe(::glGenFramebuffers(1, &resolve_fbo)); - glsafe(::glBindFramebuffer(GL_FRAMEBUFFER, resolve_fbo)); - - GLuint resolve_tex; - glsafe(::glGenTextures(1, &resolve_tex)); - glsafe(::glBindTexture(GL_TEXTURE_2D, resolve_tex)); - glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr)); - glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); - glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); - glsafe(::glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolve_tex, 0)); - - glsafe(::glDrawBuffers(1, drawBufs)); - - if (::glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE) { - glsafe(::glBindFramebuffer(GL_READ_FRAMEBUFFER, render_fbo)); - glsafe(::glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolve_fbo)); - glsafe(::glBlitFramebuffer(0, 0, w, h, 0, 0, w, h, GL_COLOR_BUFFER_BIT, GL_LINEAR)); - - glsafe(::glBindFramebuffer(GL_READ_FRAMEBUFFER, resolve_fbo)); - glsafe(::glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, (void*)thumbnail_data.pixels.data())); - } - - glsafe(::glDeleteTextures(1, &resolve_tex)); - glsafe(::glDeleteFramebuffers(1, &resolve_fbo)); - } - else - glsafe(::glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, (void*)thumbnail_data.pixels.data())); - -#if ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT - debug_output_thumbnail(thumbnail_data); -#endif // ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT - } - - glsafe(::glBindFramebuffer(GL_FRAMEBUFFER, 0)); - glsafe(::glDeleteRenderbuffers(1, &render_depth)); - if (render_tex_buffer != 0) - glsafe(::glDeleteRenderbuffers(1, &render_tex_buffer)); - if (render_tex != 0) - glsafe(::glDeleteTextures(1, &render_tex)); - glsafe(::glDeleteFramebuffers(1, &render_fbo)); - - if (multisample) - glsafe(::glDisable(GL_MULTISAMPLE)); -} - -void GLCanvas3D::_render_thumbnail_framebuffer_ext(ThumbnailData& thumbnail_data, unsigned int w, unsigned int h, const ThumbnailsParams& thumbnail_params, const GLVolumeCollection& volumes, Camera::EType camera_type) -{ - thumbnail_data.set(w, h); - if (!thumbnail_data.is_valid()) - return; - - bool multisample = m_multisample_allowed; - if (multisample) - glsafe(::glEnable(GL_MULTISAMPLE)); - - GLint max_samples; - glsafe(::glGetIntegerv(GL_MAX_SAMPLES_EXT, &max_samples)); - GLsizei num_samples = max_samples / 2; - - GLuint render_fbo; - glsafe(::glGenFramebuffersEXT(1, &render_fbo)); - glsafe(::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, render_fbo)); - - GLuint render_tex = 0; - GLuint render_tex_buffer = 0; - if (multisample) { - // use renderbuffer instead of texture to avoid the need to use glTexImage2DMultisample which is available only since OpenGL 3.2 - glsafe(::glGenRenderbuffersEXT(1, &render_tex_buffer)); - glsafe(::glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, render_tex_buffer)); - glsafe(::glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, num_samples, GL_RGBA8, w, h)); - glsafe(::glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, render_tex_buffer)); - } - else { - glsafe(::glGenTextures(1, &render_tex)); - glsafe(::glBindTexture(GL_TEXTURE_2D, render_tex)); - glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr)); - glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); - glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); - glsafe(::glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, render_tex, 0)); - } - - GLuint render_depth; - glsafe(::glGenRenderbuffersEXT(1, &render_depth)); - glsafe(::glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, render_depth)); - if (multisample) - glsafe(::glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, num_samples, GL_DEPTH_COMPONENT24, w, h)); - else - glsafe(::glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, w, h)); - - glsafe(::glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, render_depth)); - - GLenum drawBufs[] = { GL_COLOR_ATTACHMENT0 }; - glsafe(::glDrawBuffers(1, drawBufs)); - - if (::glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) == GL_FRAMEBUFFER_COMPLETE_EXT) { - _render_thumbnail_internal(thumbnail_data, thumbnail_params, volumes, camera_type); - - if (multisample) { - GLuint resolve_fbo; - glsafe(::glGenFramebuffersEXT(1, &resolve_fbo)); - glsafe(::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, resolve_fbo)); - - GLuint resolve_tex; - glsafe(::glGenTextures(1, &resolve_tex)); - glsafe(::glBindTexture(GL_TEXTURE_2D, resolve_tex)); - glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr)); - glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); - glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); - glsafe(::glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, resolve_tex, 0)); - - glsafe(::glDrawBuffers(1, drawBufs)); - - if (::glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) == GL_FRAMEBUFFER_COMPLETE_EXT) { - glsafe(::glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, render_fbo)); - glsafe(::glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, resolve_fbo)); - glsafe(::glBlitFramebufferEXT(0, 0, w, h, 0, 0, w, h, GL_COLOR_BUFFER_BIT, GL_LINEAR)); - - glsafe(::glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, resolve_fbo)); - glsafe(::glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, (void*)thumbnail_data.pixels.data())); - } - - glsafe(::glDeleteTextures(1, &resolve_tex)); - glsafe(::glDeleteFramebuffersEXT(1, &resolve_fbo)); - } - else - glsafe(::glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, (void*)thumbnail_data.pixels.data())); - -#if ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT - debug_output_thumbnail(thumbnail_data); -#endif // ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT - } - - glsafe(::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0)); - glsafe(::glDeleteRenderbuffersEXT(1, &render_depth)); - if (render_tex_buffer != 0) - glsafe(::glDeleteRenderbuffersEXT(1, &render_tex_buffer)); - if (render_tex != 0) - glsafe(::glDeleteTextures(1, &render_tex)); - glsafe(::glDeleteFramebuffersEXT(1, &render_fbo)); - - if (multisample) - glsafe(::glDisable(GL_MULTISAMPLE)); -} - -void GLCanvas3D::_render_thumbnail_legacy(ThumbnailData& thumbnail_data, unsigned int w, unsigned int h, const ThumbnailsParams& thumbnail_params, const GLVolumeCollection& volumes, Camera::EType camera_type) -{ - // check that thumbnail size does not exceed the default framebuffer size - const Size& cnv_size = get_canvas_size(); - unsigned int cnv_w = (unsigned int)cnv_size.get_width(); - unsigned int cnv_h = (unsigned int)cnv_size.get_height(); - if (w > cnv_w || h > cnv_h) { - float ratio = std::min((float)cnv_w / (float)w, (float)cnv_h / (float)h); - w = (unsigned int)(ratio * (float)w); - h = (unsigned int)(ratio * (float)h); - } - - thumbnail_data.set(w, h); - if (!thumbnail_data.is_valid()) - return; - - _render_thumbnail_internal(thumbnail_data, thumbnail_params, volumes, camera_type); - - glsafe(::glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, (void*)thumbnail_data.pixels.data())); -#if ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT - debug_output_thumbnail(thumbnail_data); -#endif // ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT - - // restore the default framebuffer size to avoid flickering on the 3D scene - wxGetApp().plater()->get_camera().apply_viewport(0, 0, cnv_size.get_width(), cnv_size.get_height()); -} - -bool GLCanvas3D::_init_toolbars() -{ - if (!_init_main_toolbar()) - return false; - - if (!_init_undoredo_toolbar()) - return false; - - if (!_init_view_toolbar()) - return false; - - if (!_init_collapse_toolbar()) - return false; - - return true; -} - -bool GLCanvas3D::_init_main_toolbar() -{ - if (!m_main_toolbar.is_enabled()) - return true; - - BackgroundTexture::Metadata background_data; - background_data.filename = "toolbar_background.png"; - background_data.left = 16; - background_data.top = 16; - background_data.right = 16; - background_data.bottom = 16; - - if (!m_main_toolbar.init(background_data)) - { - // unable to init the toolbar texture, disable it - m_main_toolbar.set_enabled(false); - return true; - } - // init arrow - BackgroundTexture::Metadata arrow_data; - arrow_data.filename = "toolbar_arrow.svg"; - arrow_data.left = 0; - arrow_data.top = 0; - arrow_data.right = 0; - arrow_data.bottom = 0; - if (!m_main_toolbar.init_arrow(arrow_data)) - { - BOOST_LOG_TRIVIAL(error) << "Main toolbar failed to load arrow texture."; - } - // m_gizmos is created at constructor, thus we can init arrow here. - if (!m_gizmos.init_arrow(arrow_data)) - { - BOOST_LOG_TRIVIAL(error) << "Gizmos manager failed to load arrow texture."; - } - -// m_main_toolbar.set_layout_type(GLToolbar::Layout::Vertical); - m_main_toolbar.set_layout_type(GLToolbar::Layout::Horizontal); - m_main_toolbar.set_horizontal_orientation(GLToolbar::Layout::HO_Right); - m_main_toolbar.set_vertical_orientation(GLToolbar::Layout::VO_Top); - m_main_toolbar.set_border(5.0f); - m_main_toolbar.set_separator_size(5); - m_main_toolbar.set_gap_size(4); - - GLToolbarItem::Data item; - - item.name = "add"; - item.icon_filename = "add.svg"; - item.tooltip = _utf8(L("Add...")) + " [" + GUI::shortkey_ctrl_prefix() + "I]"; - item.sprite_id = 0; - item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_ADD)); }; - if (!m_main_toolbar.add_item(item)) - return false; - - item.name = "delete"; - item.icon_filename = "remove.svg"; - item.tooltip = _utf8(L("Delete")) + " [Del]"; - item.sprite_id = 1; - item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_DELETE)); }; - item.enabling_callback = []()->bool { return wxGetApp().plater()->can_delete(); }; - if (!m_main_toolbar.add_item(item)) - return false; - - item.name = "deleteall"; - item.icon_filename = "delete_all.svg"; - item.tooltip = _utf8(L("Delete all")) + " [" + GUI::shortkey_ctrl_prefix() + "Del]"; - item.sprite_id = 2; - item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_DELETE_ALL)); }; - item.enabling_callback = []()->bool { return wxGetApp().plater()->can_delete_all(); }; - if (!m_main_toolbar.add_item(item)) - return false; - - item.name = "arrange"; - item.icon_filename = "arrange.svg"; - item.tooltip = _utf8(L("Arrange")) + " [A]\n" + _utf8(L("Arrange selection")) + " [Shift+A]\n" + _utf8(L("Click right mouse button to show arrangement options")); - item.sprite_id = 3; - item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_ARRANGE)); }; - item.enabling_callback = []()->bool { return wxGetApp().plater()->can_arrange(); }; - item.right.toggable = true; - item.right.render_callback = [this](float left, float right, float, float) { - if (m_canvas != nullptr) - { - _render_arrange_menu(0.5f * (left + right)); - } - }; - if (!m_main_toolbar.add_item(item)) - return false; - - item.right.toggable = false; - item.right.render_callback = GLToolbarItem::Default_Render_Callback; - - if (!m_main_toolbar.add_separator()) - return false; - - item.name = "copy"; - item.icon_filename = "copy.svg"; - item.tooltip = _utf8(L("Copy")) + " [" + GUI::shortkey_ctrl_prefix() + "C]"; - item.sprite_id = 4; - item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_COPY)); }; - item.enabling_callback = []()->bool { return wxGetApp().plater()->can_copy_to_clipboard(); }; - if (!m_main_toolbar.add_item(item)) - return false; - - item.name = "paste"; - item.icon_filename = "paste.svg"; - item.tooltip = _utf8(L("Paste")) + " [" + GUI::shortkey_ctrl_prefix() + "V]"; - item.sprite_id = 5; - item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_PASTE)); }; - item.enabling_callback = []()->bool { return wxGetApp().plater()->can_paste_from_clipboard(); }; - if (!m_main_toolbar.add_item(item)) - return false; - - if (!m_main_toolbar.add_separator()) - return false; - - item.name = "more"; - item.icon_filename = "instance_add.svg"; - item.tooltip = _utf8(L("Add instance")) + " [+]"; - item.sprite_id = 6; - item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_MORE)); }; - item.visibility_callback = []()->bool { return wxGetApp().get_mode() != comSimple; }; - item.enabling_callback = []()->bool { return wxGetApp().plater()->can_increase_instances(); }; - - if (!m_main_toolbar.add_item(item)) - return false; - - item.name = "fewer"; - item.icon_filename = "instance_remove.svg"; - item.tooltip = _utf8(L("Remove instance")) + " [-]"; - item.sprite_id = 7; - item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_FEWER)); }; - item.visibility_callback = []()->bool { return wxGetApp().get_mode() != comSimple; }; - item.enabling_callback = []()->bool { return wxGetApp().plater()->can_decrease_instances(); }; - if (!m_main_toolbar.add_item(item)) - return false; - - if (!m_main_toolbar.add_separator()) - return false; - - item.name = "splitobjects"; - item.icon_filename = "split_objects.svg"; - item.tooltip = _utf8(L("Split to objects")); - item.sprite_id = 8; - item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_SPLIT_OBJECTS)); }; - item.visibility_callback = GLToolbarItem::Default_Visibility_Callback; - item.enabling_callback = []()->bool { return wxGetApp().plater()->can_split_to_objects(); }; - if (!m_main_toolbar.add_item(item)) - return false; - - item.name = "splitvolumes"; - item.icon_filename = "split_parts.svg"; - item.tooltip = _utf8(L("Split to parts")); - item.sprite_id = 9; - item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_SPLIT_VOLUMES)); }; - item.visibility_callback = []()->bool { return wxGetApp().get_mode() != comSimple; }; - item.enabling_callback = []()->bool { return wxGetApp().plater()->can_split_to_volumes(); }; - if (!m_main_toolbar.add_item(item)) - return false; - - if (!m_main_toolbar.add_separator()) - return false; - - item.name = "settings"; - item.icon_filename = "settings.svg"; - item.tooltip = _u8L("Switch to Settings") + "\n" + "[" + GUI::shortkey_ctrl_prefix() + "2] - " + _u8L("Print Settings Tab") + - "\n" + "[" + GUI::shortkey_ctrl_prefix() + "3] - " + (current_printer_technology() == ptFFF ? _u8L("Filament Settings Tab") : _u8L("Material Settings Tab")) + - "\n" + "[" + GUI::shortkey_ctrl_prefix() + "4] - " + _u8L("Printer Settings Tab") ; - item.sprite_id = 10; - item.enabling_callback = GLToolbarItem::Default_Enabling_Callback; - item.visibility_callback = []() { return (wxGetApp().app_config->get("new_settings_layout_mode") == "1" || - wxGetApp().app_config->get("dlg_settings_layout_mode") == "1"); }; - item.left.action_callback = []() { wxGetApp().mainframe->select_tab(); }; - if (!m_main_toolbar.add_item(item)) - return false; - - /* - if (!m_main_toolbar.add_separator()) - return false; - */ - - item.name = "search"; - item.icon_filename = "search_.svg"; - item.tooltip = _utf8(L("Search")) + " [" + GUI::shortkey_ctrl_prefix() + "F]"; - item.sprite_id = 11; - item.left.toggable = true; - item.left.render_callback = [this](float left, float right, float, float) { - if (m_canvas != nullptr) - { - if (_render_search_list(0.5f * (left + right))) - _deactivate_search_toolbar_item(); - } - }; - item.left.action_callback = GLToolbarItem::Default_Action_Callback; - item.visibility_callback = GLToolbarItem::Default_Visibility_Callback; - item.enabling_callback = GLToolbarItem::Default_Enabling_Callback; - if (!m_main_toolbar.add_item(item)) - return false; - - if (!m_main_toolbar.add_separator()) - return false; - - item.name = "layersediting"; - item.icon_filename = "layers_white.svg"; - item.tooltip = _utf8(L("Variable layer height")); - item.sprite_id = 12; - item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_LAYERSEDITING)); }; - item.visibility_callback = [this]()->bool { - bool res = current_printer_technology() == ptFFF; - // turns off if changing printer technology - if (!res && m_main_toolbar.is_item_visible("layersediting") && m_main_toolbar.is_item_pressed("layersediting")) - force_main_toolbar_left_action(get_main_toolbar_item_id("layersediting")); - - return res; - }; - item.enabling_callback = []()->bool { return wxGetApp().plater()->can_layers_editing(); }; - item.left.render_callback = GLToolbarItem::Default_Render_Callback; - if (!m_main_toolbar.add_item(item)) - return false; - - return true; -} - -bool GLCanvas3D::_init_undoredo_toolbar() -{ - if (!m_undoredo_toolbar.is_enabled()) - return true; - - BackgroundTexture::Metadata background_data; - background_data.filename = "toolbar_background.png"; - background_data.left = 16; - background_data.top = 16; - background_data.right = 16; - background_data.bottom = 16; - - if (!m_undoredo_toolbar.init(background_data)) - { - // unable to init the toolbar texture, disable it - m_undoredo_toolbar.set_enabled(false); - return true; - } - - // init arrow - BackgroundTexture::Metadata arrow_data; - arrow_data.filename = "toolbar_arrow.svg"; - arrow_data.left = 0; - arrow_data.top = 0; - arrow_data.right = 0; - arrow_data.bottom = 0; - if (!m_undoredo_toolbar.init_arrow(arrow_data)) - { - BOOST_LOG_TRIVIAL(error) << "Undo/Redo toolbar failed to load arrow texture."; - } - -// m_undoredo_toolbar.set_layout_type(GLToolbar::Layout::Vertical); - m_undoredo_toolbar.set_layout_type(GLToolbar::Layout::Horizontal); - m_undoredo_toolbar.set_horizontal_orientation(GLToolbar::Layout::HO_Left); - m_undoredo_toolbar.set_vertical_orientation(GLToolbar::Layout::VO_Top); - m_undoredo_toolbar.set_border(5.0f); - m_undoredo_toolbar.set_separator_size(5); - m_undoredo_toolbar.set_gap_size(4); - - GLToolbarItem::Data item; - - item.name = "undo"; - item.icon_filename = "undo_toolbar.svg"; - item.tooltip = _utf8(L("Undo")) + " [" + GUI::shortkey_ctrl_prefix() + "Z]\n" + _utf8(L("Click right mouse button to open/close History")); - item.sprite_id = 0; - item.left.action_callback = [this]() { post_event(SimpleEvent(EVT_GLCANVAS_UNDO)); }; - item.right.toggable = true; - item.right.action_callback = [this]() { m_imgui_undo_redo_hovered_pos = -1; }; - item.right.render_callback = [this](float left, float right, float, float) { - if (m_canvas != nullptr) - { - if (_render_undo_redo_stack(true, 0.5f * (left + right))) - _deactivate_undo_redo_toolbar_items(); - } - }; - item.enabling_callback = [this]()->bool { - bool can_undo = wxGetApp().plater()->can_undo(); - int id = m_undoredo_toolbar.get_item_id("undo"); - - std::string curr_additional_tooltip; - m_undoredo_toolbar.get_additional_tooltip(id, curr_additional_tooltip); - - std::string new_additional_tooltip; - if (can_undo) { - std::string action; - wxGetApp().plater()->undo_redo_topmost_string_getter(true, action); - new_additional_tooltip = (boost::format(_utf8(L("Next Undo action: %1%"))) % action).str(); - } - - if (new_additional_tooltip != curr_additional_tooltip) - { - m_undoredo_toolbar.set_additional_tooltip(id, new_additional_tooltip); - set_tooltip(""); - } - return can_undo; - }; - - if (!m_undoredo_toolbar.add_item(item)) - return false; - - item.name = "redo"; - item.icon_filename = "redo_toolbar.svg"; - item.tooltip = _utf8(L("Redo")) + " [" + GUI::shortkey_ctrl_prefix() + "Y]\n" + _utf8(L("Click right mouse button to open/close History")); - item.sprite_id = 1; - item.left.action_callback = [this]() { post_event(SimpleEvent(EVT_GLCANVAS_REDO)); }; - item.right.action_callback = [this]() { m_imgui_undo_redo_hovered_pos = -1; }; - item.right.render_callback = [this](float left, float right, float, float) { - if (m_canvas != nullptr) - { - if (_render_undo_redo_stack(false, 0.5f * (left + right))) - _deactivate_undo_redo_toolbar_items(); - } - }; - item.enabling_callback = [this]()->bool { - bool can_redo = wxGetApp().plater()->can_redo(); - int id = m_undoredo_toolbar.get_item_id("redo"); - - std::string curr_additional_tooltip; - m_undoredo_toolbar.get_additional_tooltip(id, curr_additional_tooltip); - - std::string new_additional_tooltip; - if (can_redo) { - std::string action; - wxGetApp().plater()->undo_redo_topmost_string_getter(false, action); - new_additional_tooltip = (boost::format(_utf8(L("Next Redo action: %1%"))) % action).str(); - } - - if (new_additional_tooltip != curr_additional_tooltip) - { - m_undoredo_toolbar.set_additional_tooltip(id, new_additional_tooltip); - set_tooltip(""); - } - return can_redo; - }; - - if (!m_undoredo_toolbar.add_item(item)) - return false; - /* - if (!m_undoredo_toolbar.add_separator()) - return false; - */ - return true; -} - -bool GLCanvas3D::_init_view_toolbar() -{ - return wxGetApp().plater()->init_view_toolbar(); -} - -bool GLCanvas3D::_init_collapse_toolbar() -{ - return wxGetApp().plater()->init_collapse_toolbar(); -} - -bool GLCanvas3D::_set_current() -{ - return m_context != nullptr && m_canvas->SetCurrent(*m_context); -} - -void GLCanvas3D::_resize(unsigned int w, unsigned int h) -{ - if (m_canvas == nullptr && m_context == nullptr) - return; - - const std::array new_size = { w, h }; - if (m_old_size == new_size) - return; - - m_old_size = new_size; - - auto *imgui = wxGetApp().imgui(); - imgui->set_display_size(static_cast(w), static_cast(h)); - const float font_size = 1.5f * wxGetApp().em_unit(); -#if ENABLE_RETINA_GL - imgui->set_scaling(font_size, 1.0f, m_retina_helper->get_scale_factor()); -#else - imgui->set_scaling(font_size, m_canvas->GetContentScaleFactor(), 1.0f); -#endif - - this->request_extra_frame(); - - // ensures that this canvas is current - _set_current(); -} - -BoundingBoxf3 GLCanvas3D::_max_bounding_box(bool include_gizmos, bool include_bed_model) const -{ - BoundingBoxf3 bb = volumes_bounding_box(); - - // The following is a workaround for gizmos not being taken in account when calculating the tight camera frustrum - // A better solution would ask the gizmo manager for the bounding box of the current active gizmo, if any - if (include_gizmos && m_gizmos.is_running()) - { - BoundingBoxf3 sel_bb = m_selection.get_bounding_box(); - Vec3d sel_bb_center = sel_bb.center(); - Vec3d extend_by = sel_bb.max_size() * Vec3d::Ones(); - bb.merge(BoundingBoxf3(sel_bb_center - extend_by, sel_bb_center + extend_by)); - } - - bb.merge(include_bed_model ? m_bed.extended_bounding_box() : m_bed.build_volume().bounding_volume()); - - if (!m_main_toolbar.is_enabled()) - bb.merge(m_gcode_viewer.get_max_bounding_box()); - - return bb; -} - -void GLCanvas3D::_zoom_to_box(const BoundingBoxf3& box, double margin_factor) -{ - wxGetApp().plater()->get_camera().zoom_to_box(box, margin_factor); - m_dirty = true; -} - -void GLCanvas3D::_update_camera_zoom(double zoom) -{ - wxGetApp().plater()->get_camera().update_zoom(zoom); - m_dirty = true; -} - -void GLCanvas3D::_refresh_if_shown_on_screen() -{ - if (_is_shown_on_screen()) { - const Size& cnv_size = get_canvas_size(); - _resize((unsigned int)cnv_size.get_width(), (unsigned int)cnv_size.get_height()); - - // Because of performance problems on macOS, where PaintEvents are not delivered - // frequently enough, we call render() here directly when we can. - render(); - } -} - -void GLCanvas3D::_picking_pass() -{ - if (m_picking_enabled && !m_mouse.dragging && m_mouse.position != Vec2d(DBL_MAX, DBL_MAX)) { - m_hover_volume_idxs.clear(); - - // Render the object for picking. - // FIXME This cannot possibly work in a multi - sampled context as the color gets mangled by the anti - aliasing. - // Better to use software ray - casting on a bounding - box hierarchy. - - if (m_multisample_allowed) - // This flag is often ignored by NVIDIA drivers if rendering into a screen buffer. - glsafe(::glDisable(GL_MULTISAMPLE)); - - glsafe(::glDisable(GL_BLEND)); - glsafe(::glEnable(GL_DEPTH_TEST)); - - glsafe(::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); - - m_camera_clipping_plane = m_gizmos.get_clipping_plane(); - if (m_camera_clipping_plane.is_active()) { - ::glClipPlane(GL_CLIP_PLANE0, (GLdouble*)m_camera_clipping_plane.get_data()); - ::glEnable(GL_CLIP_PLANE0); - } - _render_volumes_for_picking(); - if (m_camera_clipping_plane.is_active()) - ::glDisable(GL_CLIP_PLANE0); - - _render_bed_for_picking(!wxGetApp().plater()->get_camera().is_looking_downward()); - - m_gizmos.render_current_gizmo_for_picking_pass(); - - if (m_multisample_allowed) - glsafe(::glEnable(GL_MULTISAMPLE)); - - int volume_id = -1; - int gizmo_id = -1; - - GLubyte color[4] = { 0, 0, 0, 0 }; - const Size& cnv_size = get_canvas_size(); - bool inside = 0 <= m_mouse.position(0) && m_mouse.position(0) < cnv_size.get_width() && 0 <= m_mouse.position(1) && m_mouse.position(1) < cnv_size.get_height(); - if (inside) { - glsafe(::glReadPixels(m_mouse.position(0), cnv_size.get_height() - m_mouse.position(1) - 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)color)); - if (picking_checksum_alpha_channel(color[0], color[1], color[2]) == color[3]) { - // Only non-interpolated colors are valid, those have their lowest three bits zeroed. - // we reserve color = (0,0,0) for occluders (as the printbed) - // volumes' id are shifted by 1 - // see: _render_volumes_for_picking() - volume_id = color[0] + (color[1] << 8) + (color[2] << 16) - 1; - // gizmos' id are instead properly encoded by the color - gizmo_id = color[0] + (color[1] << 8) + (color[2] << 16); - } - } - if (0 <= volume_id && volume_id < (int)m_volumes.volumes.size()) { - // do not add the volume id if any gizmo is active and CTRL is pressed - if (m_gizmos.get_current_type() == GLGizmosManager::EType::Undefined || !wxGetKeyState(WXK_CONTROL)) - m_hover_volume_idxs.emplace_back(volume_id); - m_gizmos.set_hover_id(-1); - } - else - m_gizmos.set_hover_id(inside && (unsigned int)gizmo_id <= GLGizmoBase::BASE_ID ? ((int)GLGizmoBase::BASE_ID - gizmo_id) : -1); - - _update_volumes_hover_state(); - } -} - -void GLCanvas3D::_rectangular_selection_picking_pass() -{ - m_gizmos.set_hover_id(-1); - - std::set idxs; - - if (m_picking_enabled) { - if (m_multisample_allowed) - // This flag is often ignored by NVIDIA drivers if rendering into a screen buffer. - glsafe(::glDisable(GL_MULTISAMPLE)); - - glsafe(::glDisable(GL_BLEND)); - glsafe(::glEnable(GL_DEPTH_TEST)); - - glsafe(::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); - - _render_volumes_for_picking(); - _render_bed_for_picking(!wxGetApp().plater()->get_camera().is_looking_downward()); - - if (m_multisample_allowed) - glsafe(::glEnable(GL_MULTISAMPLE)); - - int width = std::max((int)m_rectangle_selection.get_width(), 1); - int height = std::max((int)m_rectangle_selection.get_height(), 1); - int px_count = width * height; - - int left = (int)m_rectangle_selection.get_left(); - int top = get_canvas_size().get_height() - (int)m_rectangle_selection.get_top(); - if (left >= 0 && top >= 0) { -#define USE_PARALLEL 1 -#if USE_PARALLEL - struct Pixel - { - std::array data; - // Only non-interpolated colors are valid, those have their lowest three bits zeroed. - bool valid() const { return picking_checksum_alpha_channel(data[0], data[1], data[2]) == data[3]; } - // we reserve color = (0,0,0) for occluders (as the printbed) - // volumes' id are shifted by 1 - // see: _render_volumes_for_picking() - int id() const { return data[0] + (data[1] << 8) + (data[2] << 16) - 1; } - }; - - std::vector frame(px_count); - glsafe(::glReadPixels(left, top, width, height, GL_RGBA, GL_UNSIGNED_BYTE, (void*)frame.data())); - - tbb::spin_mutex mutex; - tbb::parallel_for(tbb::blocked_range(0, frame.size(), (size_t)width), - [this, &frame, &idxs, &mutex](const tbb::blocked_range& range) { - for (size_t i = range.begin(); i < range.end(); ++i) - if (frame[i].valid()) { - int volume_id = frame[i].id(); - if (0 <= volume_id && volume_id < (int)m_volumes.volumes.size()) { - mutex.lock(); - idxs.insert(volume_id); - mutex.unlock(); - } - } - }); -#else - std::vector frame(4 * px_count); - glsafe(::glReadPixels(left, top, width, height, GL_RGBA, GL_UNSIGNED_BYTE, (void*)frame.data())); - - for (int i = 0; i < px_count; ++i) - { - int px_id = 4 * i; - int volume_id = frame[px_id] + (frame[px_id + 1] << 8) + (frame[px_id + 2] << 16); - if (0 <= volume_id && volume_id < (int)m_volumes.volumes.size()) - idxs.insert(volume_id); - } -#endif // USE_PARALLEL - } - } - - m_hover_volume_idxs.assign(idxs.begin(), idxs.end()); - _update_volumes_hover_state(); -} - -void GLCanvas3D::_render_background() const -{ - bool use_error_color = false; - if (wxGetApp().is_editor()) { - use_error_color = m_dynamic_background_enabled && - (current_printer_technology() != ptSLA || !m_volumes.empty()); - - if (!m_volumes.empty()) - use_error_color &= _is_any_volume_outside(); - else - use_error_color &= m_gcode_viewer.has_data() && !m_gcode_viewer.is_contained_in_bed(); - } - - glsafe(::glPushMatrix()); - glsafe(::glLoadIdentity()); - glsafe(::glMatrixMode(GL_PROJECTION)); - glsafe(::glPushMatrix()); - glsafe(::glLoadIdentity()); - - // Draws a bottom to top gradient over the complete screen. - glsafe(::glDisable(GL_DEPTH_TEST)); - - ::glBegin(GL_QUADS); - if (use_error_color) - ::glColor3fv(ERROR_BG_DARK_COLOR); - else - ::glColor3fv(DEFAULT_BG_DARK_COLOR); - - ::glVertex2f(-1.0f, -1.0f); - ::glVertex2f(1.0f, -1.0f); - - if (use_error_color) - ::glColor3fv(ERROR_BG_LIGHT_COLOR); - else - ::glColor3fv(DEFAULT_BG_LIGHT_COLOR); - - ::glVertex2f(1.0f, 1.0f); - ::glVertex2f(-1.0f, 1.0f); - glsafe(::glEnd()); - - glsafe(::glEnable(GL_DEPTH_TEST)); - - glsafe(::glPopMatrix()); - glsafe(::glMatrixMode(GL_MODELVIEW)); - glsafe(::glPopMatrix()); -} - -void GLCanvas3D::_render_bed(bool bottom, bool show_axes) -{ - float scale_factor = 1.0; -#if ENABLE_RETINA_GL - scale_factor = m_retina_helper->get_scale_factor(); -#endif // ENABLE_RETINA_GL - - bool show_texture = ! bottom || - (m_gizmos.get_current_type() != GLGizmosManager::FdmSupports - && m_gizmos.get_current_type() != GLGizmosManager::SlaSupports - && m_gizmos.get_current_type() != GLGizmosManager::Hollow - && m_gizmos.get_current_type() != GLGizmosManager::Seam - && m_gizmos.get_current_type() != GLGizmosManager::MmuSegmentation); - - m_bed.render(*this, bottom, scale_factor, show_axes, show_texture); -} - -void GLCanvas3D::_render_bed_for_picking(bool bottom) -{ - float scale_factor = 1.0; -#if ENABLE_RETINA_GL - scale_factor = m_retina_helper->get_scale_factor(); -#endif // ENABLE_RETINA_GL - - m_bed.render_for_picking(*this, bottom, scale_factor); -} - -void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type) -{ - if (m_volumes.empty()) - return; - - glsafe(::glEnable(GL_DEPTH_TEST)); - - m_camera_clipping_plane = m_gizmos.get_clipping_plane(); - - if (m_picking_enabled) - // Update the layer editing selection to the first object selected, update the current object maximum Z. - m_layers_editing.select_object(*m_model, this->is_layers_editing_enabled() ? m_selection.get_object_idx() : -1); - - if (const BuildVolume &build_volume = m_bed.build_volume(); build_volume.valid()) { - switch (build_volume.type()) { - case BuildVolume::Type::Rectangle: { - const BoundingBox3Base bed_bb = build_volume.bounding_volume().inflated(BuildVolume::SceneEpsilon); - m_volumes.set_print_volume({ 0, // circle - { float(bed_bb.min.x()), float(bed_bb.min.y()), float(bed_bb.max.x()), float(bed_bb.max.y()) }, - { 0.0f, float(build_volume.max_print_height()) } }); - break; - } - case BuildVolume::Type::Circle: { - m_volumes.set_print_volume({ 1, // rectangle - { unscaled(build_volume.circle().center.x()), unscaled(build_volume.circle().center.y()), unscaled(build_volume.circle().radius + BuildVolume::SceneEpsilon), 0.0f }, - { 0.0f, float(build_volume.max_print_height() + BuildVolume::SceneEpsilon) } }); - break; - } - default: - case BuildVolume::Type::Convex: - case BuildVolume::Type::Custom: { - m_volumes.set_print_volume({ static_cast(type), - { -FLT_MAX, -FLT_MAX, FLT_MAX, FLT_MAX }, - { -FLT_MAX, FLT_MAX } } - ); - } - } - if (m_requires_check_outside_state) { - m_volumes.check_outside_state(build_volume, nullptr); - m_requires_check_outside_state = false; - } - } - - if (m_use_clipping_planes) - m_volumes.set_z_range(-m_clipping_planes[0].get_data()[3], m_clipping_planes[1].get_data()[3]); - else - m_volumes.set_z_range(-FLT_MAX, FLT_MAX); - - m_volumes.set_clipping_plane(m_camera_clipping_plane.get_data()); - m_volumes.set_show_sinking_contours(! m_gizmos.is_hiding_instances()); - - GLShaderProgram* shader = wxGetApp().get_shader("gouraud"); - if (shader != nullptr) { - shader->start_using(); - - switch (type) - { - default: - case GLVolumeCollection::ERenderType::Opaque: - { - if (m_picking_enabled && !m_gizmos.is_dragging() && m_layers_editing.is_enabled() && (m_layers_editing.last_object_id != -1) && (m_layers_editing.object_max_z() > 0.0f)) { - int object_id = m_layers_editing.last_object_id; - m_volumes.render(type, false, wxGetApp().plater()->get_camera().get_view_matrix(), [object_id](const GLVolume& volume) { - // Which volume to paint without the layer height profile shader? - return volume.is_active && (volume.is_modifier || volume.composite_id.object_id != object_id); - }); - // Let LayersEditing handle rendering of the active object using the layer height profile shader. - m_layers_editing.render_volumes(*this, m_volumes); - } - else { - // do not cull backfaces to show broken geometry, if any - m_volumes.render(type, m_picking_enabled, wxGetApp().plater()->get_camera().get_view_matrix(), [this](const GLVolume& volume) { - return (m_render_sla_auxiliaries || volume.composite_id.volume_id >= 0); - }); - } - - // In case a painting gizmo is open, it should render the painted triangles - // before transparent objects are rendered. Otherwise they would not be - // visible when inside modifier meshes etc. - { - const GLGizmosManager& gm = get_gizmos_manager(); -// GLGizmosManager::EType type = gm.get_current_type(); - if (dynamic_cast(gm.get_current())) { - shader->stop_using(); - gm.render_painter_gizmo(); - shader->start_using(); - } - } - break; - } - case GLVolumeCollection::ERenderType::Transparent: - { - m_volumes.render(type, false, wxGetApp().plater()->get_camera().get_view_matrix()); - break; - } - } - shader->stop_using(); - } - - m_camera_clipping_plane = ClippingPlane::ClipsNothing(); -} - -void GLCanvas3D::_render_gcode() -{ - m_gcode_viewer.render(); -} - -void GLCanvas3D::_render_selection() const -{ - float scale_factor = 1.0; -#if ENABLE_RETINA_GL - scale_factor = m_retina_helper->get_scale_factor(); -#endif // ENABLE_RETINA_GL - - if (!m_gizmos.is_running()) - m_selection.render(scale_factor); -} - -void GLCanvas3D::_render_sequential_clearance() -{ - if (m_layers_editing.is_enabled() || m_gizmos.is_dragging()) - return; - - switch (m_gizmos.get_current_type()) - { - case GLGizmosManager::EType::Flatten: - case GLGizmosManager::EType::Cut: - case GLGizmosManager::EType::Hollow: - case GLGizmosManager::EType::SlaSupports: - case GLGizmosManager::EType::FdmSupports: - case GLGizmosManager::EType::Seam: { return; } - default: { break; } - } - - m_sequential_print_clearance.render(); -} - -#if ENABLE_RENDER_SELECTION_CENTER -void GLCanvas3D::_render_selection_center() const -{ - m_selection.render_center(m_gizmos.is_dragging()); -} -#endif // ENABLE_RENDER_SELECTION_CENTER - -void GLCanvas3D::_check_and_update_toolbar_icon_scale() -{ - // Don't update a toolbar scale, when we are on a Preview - if (wxGetApp().plater()->is_preview_shown()) - return; - - float scale = wxGetApp().toolbar_icon_scale(); - Size cnv_size = get_canvas_size(); - - float size = GLToolbar::Default_Icons_Size * scale; - - // Set current size for all top toolbars. It will be used for next calculations - GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); -#if ENABLE_RETINA_GL - const float sc = m_retina_helper->get_scale_factor() * scale; - m_main_toolbar.set_scale(sc); - m_undoredo_toolbar.set_scale(sc); - collapse_toolbar.set_scale(sc); - size *= m_retina_helper->get_scale_factor(); -#else - m_main_toolbar.set_icons_size(size); - m_undoredo_toolbar.set_icons_size(size); - collapse_toolbar.set_icons_size(size); -#endif // ENABLE_RETINA_GL - - float top_tb_width = m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar.get_width(); - int items_cnt = m_main_toolbar.get_visible_items_cnt() + m_undoredo_toolbar.get_visible_items_cnt() + collapse_toolbar.get_visible_items_cnt(); - float noitems_width = top_tb_width - size * items_cnt; // width of separators and borders in top toolbars - - // calculate scale needed for items in all top toolbars - float new_h_scale = (cnv_size.get_width() - noitems_width) / (items_cnt * GLToolbar::Default_Icons_Size); - - items_cnt = m_gizmos.get_selectable_icons_cnt() + 3; // +3 means a place for top and view toolbars and separators in gizmos toolbar - - // calculate scale needed for items in the gizmos toolbar - float new_v_scale = cnv_size.get_height() / (items_cnt * GLGizmosManager::Default_Icons_Size); - - // set minimum scale as a auto scale for the toolbars - float new_scale = std::min(new_h_scale, new_v_scale); -#if ENABLE_RETINA_GL - new_scale /= m_retina_helper->get_scale_factor(); -#endif - if (fabs(new_scale - scale) > 0.01) // scale is changed by 1% and more - wxGetApp().set_auto_toolbar_icon_scale(new_scale); -} - -void GLCanvas3D::_render_overlays() -{ - glsafe(::glDisable(GL_DEPTH_TEST)); - glsafe(::glPushMatrix()); - glsafe(::glLoadIdentity()); - // ensure that the textures are renderered inside the frustrum - const Camera& camera = wxGetApp().plater()->get_camera(); - glsafe(::glTranslated(0.0, 0.0, -(camera.get_near_z() + 0.005))); - // ensure that the overlay fits the frustrum near z plane - double gui_scale = camera.get_gui_scale(); - glsafe(::glScaled(gui_scale, gui_scale, 1.0)); - - _check_and_update_toolbar_icon_scale(); - - _render_gizmos_overlay(); - - // main toolbar and undoredo toolbar need to be both updated before rendering because both their sizes are needed - // to correctly place them -#if ENABLE_RETINA_GL - const float scale = m_retina_helper->get_scale_factor() * wxGetApp().toolbar_icon_scale(/*true*/); - m_main_toolbar.set_scale(scale); - m_undoredo_toolbar.set_scale(scale); - wxGetApp().plater()->get_collapse_toolbar().set_scale(scale); -#else - const float size = int(GLToolbar::Default_Icons_Size * wxGetApp().toolbar_icon_scale(/*true*/)); - m_main_toolbar.set_icons_size(size); - m_undoredo_toolbar.set_icons_size(size); - wxGetApp().plater()->get_collapse_toolbar().set_icons_size(size); -#endif // ENABLE_RETINA_GL - - _render_main_toolbar(); - _render_undoredo_toolbar(); - _render_collapse_toolbar(); - _render_view_toolbar(); - - if (m_layers_editing.last_object_id >= 0 && m_layers_editing.object_max_z() > 0.0f) - m_layers_editing.render_overlay(*this); - - const ConfigOptionBool* opt = dynamic_cast(m_config->option("complete_objects")); - bool sequential_print = opt != nullptr && opt->value; - std::vector sorted_instances; - if (sequential_print) { - for (ModelObject* model_object : m_model->objects) - for (ModelInstance* model_instance : model_object->instances) { - sorted_instances.emplace_back(model_instance); - } - } - m_labels.render(sorted_instances); - - glsafe(::glPopMatrix()); -} - -void GLCanvas3D::_render_volumes_for_picking() const -{ - static const GLfloat INV_255 = 1.0f / 255.0f; - - // do not cull backfaces to show broken geometry, if any - glsafe(::glDisable(GL_CULL_FACE)); - - glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); - glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); - - const Transform3d& view_matrix = wxGetApp().plater()->get_camera().get_view_matrix(); - for (size_t type = 0; type < 2; ++ type) { - GLVolumeWithIdAndZList to_render = volumes_to_render(m_volumes.volumes, (type == 0) ? GLVolumeCollection::ERenderType::Opaque : GLVolumeCollection::ERenderType::Transparent, view_matrix); - for (const GLVolumeWithIdAndZ& volume : to_render) - if (!volume.first->disabled && (volume.first->composite_id.volume_id >= 0 || m_render_sla_auxiliaries)) { - // Object picking mode. Render the object with a color encoding the object index. - // we reserve color = (0,0,0) for occluders (as the printbed) - // so we shift volumes' id by 1 to get the proper color - unsigned int id = 1 + volume.second.first; - unsigned int r = (id & (0x000000FF << 0)) << 0; - unsigned int g = (id & (0x000000FF << 8)) >> 8; - unsigned int b = (id & (0x000000FF << 16)) >> 16; - unsigned int a = picking_checksum_alpha_channel(r, g, b); - glsafe(::glColor4f((GLfloat)r * INV_255, (GLfloat)g * INV_255, (GLfloat)b * INV_255, (GLfloat)a * INV_255)); - volume.first->render(); - } - } - - glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); - glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); - - glsafe(::glEnable(GL_CULL_FACE)); -} - -void GLCanvas3D::_render_current_gizmo() const -{ - m_gizmos.render_current_gizmo(); -} - -void GLCanvas3D::_render_gizmos_overlay() -{ -#if ENABLE_RETINA_GL -// m_gizmos.set_overlay_scale(m_retina_helper->get_scale_factor()); - const float scale = m_retina_helper->get_scale_factor()*wxGetApp().toolbar_icon_scale(); - m_gizmos.set_overlay_scale(scale); //! #ys_FIXME_experiment -#else -// m_gizmos.set_overlay_scale(m_canvas->GetContentScaleFactor()); -// m_gizmos.set_overlay_scale(wxGetApp().em_unit()*0.1f); - const float size = int(GLGizmosManager::Default_Icons_Size * wxGetApp().toolbar_icon_scale()); - m_gizmos.set_overlay_icon_size(size); //! #ys_FIXME_experiment -#endif /* __WXMSW__ */ - - m_gizmos.render_overlay(); - - if (m_gizmo_highlighter.m_render_arrow) - { - m_gizmos.render_arrow(*this, m_gizmo_highlighter.m_gizmo_type); - } -} - -void GLCanvas3D::_render_main_toolbar() -{ - if (!m_main_toolbar.is_enabled()) - return; - - Size cnv_size = get_canvas_size(); - float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); - - float top = 0.5f * (float)cnv_size.get_height() * inv_zoom; - GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); - float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0.0f; - float left = -0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width) * inv_zoom; - - m_main_toolbar.set_position(top, left); - m_main_toolbar.render(*this); - if (m_toolbar_highlighter.m_render_arrow) - { - m_main_toolbar.render_arrow(*this, m_toolbar_highlighter.m_toolbar_item); - } -} - -void GLCanvas3D::_render_undoredo_toolbar() -{ - if (!m_undoredo_toolbar.is_enabled()) - return; - - Size cnv_size = get_canvas_size(); - float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); - - float top = 0.5f * (float)cnv_size.get_height() * inv_zoom; - GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); - float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0.0f; - float left = (m_main_toolbar.get_width() - 0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width)) * inv_zoom; - - m_undoredo_toolbar.set_position(top, left); - m_undoredo_toolbar.render(*this); - if (m_toolbar_highlighter.m_render_arrow) - { - m_undoredo_toolbar.render_arrow(*this, m_toolbar_highlighter.m_toolbar_item); - } -} - -void GLCanvas3D::_render_collapse_toolbar() const -{ - GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); - - Size cnv_size = get_canvas_size(); - float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); - - float band = m_layers_editing.is_enabled() ? (wxGetApp().imgui()->get_style_scaling() * LayersEditing::THICKNESS_BAR_WIDTH) : 0.0; - - float top = 0.5f * (float)cnv_size.get_height() * inv_zoom; - float left = (0.5f * (float)cnv_size.get_width() - (float)collapse_toolbar.get_width() - band) * inv_zoom; - - collapse_toolbar.set_position(top, left); - collapse_toolbar.render(*this); -} - -void GLCanvas3D::_render_view_toolbar() const -{ - GLToolbar& view_toolbar = wxGetApp().plater()->get_view_toolbar(); - -#if ENABLE_RETINA_GL - const float scale = m_retina_helper->get_scale_factor() * wxGetApp().toolbar_icon_scale(); -#if __APPLE__ - view_toolbar.set_scale(scale); -#else // if GTK3 - const float size = int(GLGizmosManager::Default_Icons_Size * scale); - view_toolbar.set_icons_size(size); -#endif // __APPLE__ -#else - const float size = int(GLGizmosManager::Default_Icons_Size * wxGetApp().toolbar_icon_scale()); - view_toolbar.set_icons_size(size); -#endif // ENABLE_RETINA_GL - - Size cnv_size = get_canvas_size(); - float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); - - // places the toolbar on the bottom-left corner of the 3d scene - float top = (-0.5f * (float)cnv_size.get_height() + view_toolbar.get_height()) * inv_zoom; - float left = -0.5f * (float)cnv_size.get_width() * inv_zoom; - view_toolbar.set_position(top, left); - view_toolbar.render(*this); -} - -#if ENABLE_SHOW_CAMERA_TARGET -void GLCanvas3D::_render_camera_target() const -{ - double half_length = 5.0; - - glsafe(::glDisable(GL_DEPTH_TEST)); - - glsafe(::glLineWidth(2.0f)); - ::glBegin(GL_LINES); - const Vec3d& target = m_camera.get_target(); - // draw line for x axis - ::glColor3f(1.0f, 0.0f, 0.0f); - ::glVertex3d(target(0) - half_length, target(1), target(2)); - ::glVertex3d(target(0) + half_length, target(1), target(2)); - // draw line for y axis - ::glColor3f(0.0f, 1.0f, 0.0f); - ::glVertex3d(target(0), target(1) - half_length, target(2)); - ::glVertex3d(target(0), target(1) + half_length, target(2)); - // draw line for z axis - ::glColor3f(0.0f, 0.0f, 1.0f); - ::glVertex3d(target(0), target(1), target(2) - half_length); - ::glVertex3d(target(0), target(1), target(2) + half_length); - glsafe(::glEnd()); -} -#endif // ENABLE_SHOW_CAMERA_TARGET - -void GLCanvas3D::_render_sla_slices() -{ - if (!m_use_clipping_planes || current_printer_technology() != ptSLA) - return; - - const SLAPrint* print = this->sla_print(); - const PrintObjects& print_objects = print->objects(); - if (print_objects.empty()) - // nothing to render, return - return; - - double clip_min_z = -m_clipping_planes[0].get_data()[3]; - double clip_max_z = m_clipping_planes[1].get_data()[3]; - for (unsigned int i = 0; i < (unsigned int)print_objects.size(); ++i) { - const SLAPrintObject* obj = print_objects[i]; - - if (!obj->is_step_done(slaposSliceSupports)) - continue; - - SlaCap::ObjectIdToTrianglesMap::iterator it_caps_bottom = m_sla_caps[0].triangles.find(i); - SlaCap::ObjectIdToTrianglesMap::iterator it_caps_top = m_sla_caps[1].triangles.find(i); - { - if (it_caps_bottom == m_sla_caps[0].triangles.end()) - it_caps_bottom = m_sla_caps[0].triangles.emplace(i, SlaCap::Triangles()).first; - if (!m_sla_caps[0].matches(clip_min_z)) { - m_sla_caps[0].z = clip_min_z; - it_caps_bottom->second.object.clear(); - it_caps_bottom->second.supports.clear(); - } - if (it_caps_top == m_sla_caps[1].triangles.end()) - it_caps_top = m_sla_caps[1].triangles.emplace(i, SlaCap::Triangles()).first; - if (!m_sla_caps[1].matches(clip_max_z)) { - m_sla_caps[1].z = clip_max_z; - it_caps_top->second.object.clear(); - it_caps_top->second.supports.clear(); - } - } - Pointf3s &bottom_obj_triangles = it_caps_bottom->second.object; - Pointf3s &bottom_sup_triangles = it_caps_bottom->second.supports; - Pointf3s &top_obj_triangles = it_caps_top->second.object; - Pointf3s &top_sup_triangles = it_caps_top->second.supports; - - if ((bottom_obj_triangles.empty() || bottom_sup_triangles.empty() || top_obj_triangles.empty() || top_sup_triangles.empty()) && - !obj->get_slice_index().empty()) - { - double layer_height = print->default_object_config().layer_height.value; - double initial_layer_height = print->material_config().initial_layer_height.value; - bool left_handed = obj->is_left_handed(); - - coord_t key_zero = obj->get_slice_index().front().print_level(); - // Slice at the center of the slab starting at clip_min_z will be rendered for the lower plane. - coord_t key_low = coord_t((clip_min_z - initial_layer_height + layer_height) / SCALING_FACTOR) + key_zero; - // Slice at the center of the slab ending at clip_max_z will be rendered for the upper plane. - coord_t key_high = coord_t((clip_max_z - initial_layer_height) / SCALING_FACTOR) + key_zero; - - const SliceRecord& slice_low = obj->closest_slice_to_print_level(key_low, coord_t(SCALED_EPSILON)); - const SliceRecord& slice_high = obj->closest_slice_to_print_level(key_high, coord_t(SCALED_EPSILON)); - - // Offset to avoid OpenGL Z fighting between the object's horizontal surfaces and the triangluated surfaces of the cuts. - double plane_shift_z = 0.002; - - if (slice_low.is_valid()) { - const ExPolygons& obj_bottom = slice_low.get_slice(soModel); - const ExPolygons& sup_bottom = slice_low.get_slice(soSupport); - // calculate model bottom cap - if (bottom_obj_triangles.empty() && !obj_bottom.empty()) - bottom_obj_triangles = triangulate_expolygons_3d(obj_bottom, clip_min_z - plane_shift_z, ! left_handed); - // calculate support bottom cap - if (bottom_sup_triangles.empty() && !sup_bottom.empty()) - bottom_sup_triangles = triangulate_expolygons_3d(sup_bottom, clip_min_z - plane_shift_z, ! left_handed); - } - - if (slice_high.is_valid()) { - const ExPolygons& obj_top = slice_high.get_slice(soModel); - const ExPolygons& sup_top = slice_high.get_slice(soSupport); - // calculate model top cap - if (top_obj_triangles.empty() && !obj_top.empty()) - top_obj_triangles = triangulate_expolygons_3d(obj_top, clip_max_z + plane_shift_z, left_handed); - // calculate support top cap - if (top_sup_triangles.empty() && !sup_top.empty()) - top_sup_triangles = triangulate_expolygons_3d(sup_top, clip_max_z + plane_shift_z, left_handed); - } - } - - if (!bottom_obj_triangles.empty() || !top_obj_triangles.empty() || !bottom_sup_triangles.empty() || !top_sup_triangles.empty()) { - for (const SLAPrintObject::Instance& inst : obj->instances()) { - glsafe(::glPushMatrix()); - glsafe(::glTranslated(unscale(inst.shift.x()), unscale(inst.shift.y()), 0)); - glsafe(::glRotatef(Geometry::rad2deg(inst.rotation), 0.0, 0.0, 1.0)); - if (obj->is_left_handed()) - // The polygons are mirrored by X. - glsafe(::glScalef(-1.0, 1.0, 1.0)); - glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); - glsafe(::glColor3f(1.0f, 0.37f, 0.0f)); - if (!bottom_obj_triangles.empty()) { - glsafe(::glVertexPointer(3, GL_DOUBLE, 0, (GLdouble*)bottom_obj_triangles.front().data())); - glsafe(::glDrawArrays(GL_TRIANGLES, 0, bottom_obj_triangles.size())); - } - if (! top_obj_triangles.empty()) { - glsafe(::glVertexPointer(3, GL_DOUBLE, 0, (GLdouble*)top_obj_triangles.front().data())); - glsafe(::glDrawArrays(GL_TRIANGLES, 0, top_obj_triangles.size())); - } - glsafe(::glColor3f(1.0f, 0.0f, 0.37f)); - if (! bottom_sup_triangles.empty()) { - glsafe(::glVertexPointer(3, GL_DOUBLE, 0, (GLdouble*)bottom_sup_triangles.front().data())); - glsafe(::glDrawArrays(GL_TRIANGLES, 0, bottom_sup_triangles.size())); - } - if (! top_sup_triangles.empty()) { - glsafe(::glVertexPointer(3, GL_DOUBLE, 0, (GLdouble*)top_sup_triangles.front().data())); - glsafe(::glDrawArrays(GL_TRIANGLES, 0, top_sup_triangles.size())); - } - glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); - glsafe(::glPopMatrix()); - } - } - } -} - -void GLCanvas3D::_render_selection_sidebar_hints() const -{ - m_selection.render_sidebar_hints(m_sidebar_field); -} - -void GLCanvas3D::_update_volumes_hover_state() -{ - for (GLVolume* v : m_volumes.volumes) { - v->hover = GLVolume::HS_None; - } - - if (m_hover_volume_idxs.empty()) - return; - - bool ctrl_pressed = wxGetKeyState(WXK_CONTROL); // additive select/deselect - bool shift_pressed = wxGetKeyState(WXK_SHIFT); // select by rectangle - bool alt_pressed = wxGetKeyState(WXK_ALT); // deselect by rectangle - - if (alt_pressed && (shift_pressed || ctrl_pressed)) { - // illegal combinations of keys - m_hover_volume_idxs.clear(); - return; - } - - bool selection_modifiers_only = m_selection.is_empty() || m_selection.is_any_modifier(); - - bool hover_modifiers_only = true; - for (int i : m_hover_volume_idxs) { - if (!m_volumes.volumes[i]->is_modifier) { - hover_modifiers_only = false; - break; - } - } - - std::set> hover_instances; - for (int i : m_hover_volume_idxs) { - const GLVolume& v = *m_volumes.volumes[i]; - hover_instances.insert(std::make_pair(v.object_idx(), v.instance_idx())); - } - - bool hover_from_single_instance = hover_instances.size() == 1; - - if (hover_modifiers_only && !hover_from_single_instance) { - // do not allow to select volumes from different instances - m_hover_volume_idxs.clear(); - return; - } - - for (int i : m_hover_volume_idxs) { - GLVolume& volume = *m_volumes.volumes[i]; - if (volume.hover != GLVolume::HS_None) - continue; - - bool deselect = volume.selected && ((ctrl_pressed && !shift_pressed) || alt_pressed); - // (volume->is_modifier && !selection_modifiers_only && !is_ctrl_pressed) -> allows hovering on selected modifiers belonging to selection of type Instance - bool select = (!volume.selected || (volume.is_modifier && !selection_modifiers_only && !ctrl_pressed)) && !alt_pressed; - - if (select || deselect) { - bool as_volume = - volume.is_modifier && hover_from_single_instance && !ctrl_pressed && - ( - (!deselect) || - (deselect && !m_selection.is_single_full_instance() && (volume.object_idx() == m_selection.get_object_idx()) && (volume.instance_idx() == m_selection.get_instance_idx())) - ); - - if (as_volume) - volume.hover = deselect ? GLVolume::HS_Deselect : GLVolume::HS_Select; - else { - int object_idx = volume.object_idx(); - int instance_idx = volume.instance_idx(); - - for (GLVolume* v : m_volumes.volumes) { - if (v->object_idx() == object_idx && v->instance_idx() == instance_idx) - v->hover = deselect ? GLVolume::HS_Deselect : GLVolume::HS_Select; - } - } - } - else if (volume.selected) - volume.hover = GLVolume::HS_Hover; - } -} - -void GLCanvas3D::_perform_layer_editing_action(wxMouseEvent* evt) -{ - int object_idx_selected = m_layers_editing.last_object_id; - if (object_idx_selected == -1) - return; - - // A volume is selected. Test, whether hovering over a layer thickness bar. - if (evt != nullptr) { - const Rect& rect = LayersEditing::get_bar_rect_screen(*this); - float b = rect.get_bottom(); - m_layers_editing.last_z = m_layers_editing.object_max_z() * (b - evt->GetY() - 1.0f) / (b - rect.get_top()); - m_layers_editing.last_action = - evt->ShiftDown() ? (evt->RightIsDown() ? LAYER_HEIGHT_EDIT_ACTION_SMOOTH : LAYER_HEIGHT_EDIT_ACTION_REDUCE) : - (evt->RightIsDown() ? LAYER_HEIGHT_EDIT_ACTION_INCREASE : LAYER_HEIGHT_EDIT_ACTION_DECREASE); - } - - m_layers_editing.adjust_layer_height_profile(); - _refresh_if_shown_on_screen(); - - // Automatic action on mouse down with the same coordinate. - _start_timer(); -} - -Vec3d GLCanvas3D::_mouse_to_3d(const Point& mouse_pos, float* z) -{ - if (m_canvas == nullptr) - return Vec3d(DBL_MAX, DBL_MAX, DBL_MAX); - - const Camera& camera = wxGetApp().plater()->get_camera(); - Matrix4d modelview = camera.get_view_matrix().matrix(); - Matrix4d projection= camera.get_projection_matrix().matrix(); - Vec4i viewport(camera.get_viewport().data()); - - GLint y = viewport[3] - (GLint)mouse_pos(1); - GLfloat mouse_z; - if (z == nullptr) - glsafe(::glReadPixels((GLint)mouse_pos(0), y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, (void*)&mouse_z)); - else - mouse_z = *z; - - Vec3d out; - igl::unproject(Vec3d(mouse_pos(0), y, mouse_z), modelview, projection, viewport, out); - return out; -} - -Vec3d GLCanvas3D::_mouse_to_bed_3d(const Point& mouse_pos) -{ - return mouse_ray(mouse_pos).intersect_plane(0.0); -} - -void GLCanvas3D::_start_timer() -{ - m_timer.Start(100, wxTIMER_CONTINUOUS); -} - -void GLCanvas3D::_stop_timer() -{ - m_timer.Stop(); -} - -void GLCanvas3D::_load_print_toolpaths(const BuildVolume &build_volume) -{ - const Print *print = this->fff_print(); - if (print == nullptr) - return; - - if (! print->is_step_done(psSkirtBrim)) - return; - - if (!print->has_skirt() && !print->has_brim()) - return; - - const std::array color = { 0.5f, 1.0f, 0.5f, 1.0f }; // greenish - - // number of skirt layers - size_t total_layer_count = 0; - for (const PrintObject* print_object : print->objects()) { - total_layer_count = std::max(total_layer_count, print_object->total_layer_count()); - } - size_t skirt_height = print->has_infinite_skirt() ? total_layer_count : std::min(print->config().skirt_height.value, total_layer_count); - if (skirt_height == 0 && print->has_brim()) - skirt_height = 1; - - // Get first skirt_height layers. - //FIXME This code is fishy. It may not work for multiple objects with different layering due to variable layer height feature. - // This is not critical as this is just an initial preview. - const PrintObject* highest_object = *std::max_element(print->objects().begin(), print->objects().end(), [](auto l, auto r){ return l->layers().size() < r->layers().size(); }); - std::vector print_zs; - print_zs.reserve(skirt_height * 2); - for (size_t i = 0; i < std::min(skirt_height, highest_object->layers().size()); ++ i) - print_zs.emplace_back(float(highest_object->layers()[i]->print_z)); - // Only add skirt for the raft layers. - for (size_t i = 0; i < std::min(skirt_height, std::min(highest_object->slicing_parameters().raft_layers(), highest_object->support_layers().size())); ++ i) - print_zs.emplace_back(float(highest_object->support_layers()[i]->print_z)); - sort_remove_duplicates(print_zs); - skirt_height = std::min(skirt_height, print_zs.size()); - print_zs.erase(print_zs.begin() + skirt_height, print_zs.end()); - - GLVolume *volume = m_volumes.new_toolpath_volume(color, VERTEX_BUFFER_RESERVE_SIZE); - for (size_t i = 0; i < skirt_height; ++ i) { - volume->print_zs.emplace_back(print_zs[i]); - volume->offsets.emplace_back(volume->indexed_vertex_array.quad_indices.size()); - volume->offsets.emplace_back(volume->indexed_vertex_array.triangle_indices.size()); - if (i == 0) - _3DScene::extrusionentity_to_verts(print->brim(), print_zs[i], Point(0, 0), *volume); - _3DScene::extrusionentity_to_verts(print->skirt(), print_zs[i], Point(0, 0), *volume); - // Ensure that no volume grows over the limits. If the volume is too large, allocate a new one. - if (volume->indexed_vertex_array.vertices_and_normals_interleaved.size() > MAX_VERTEX_BUFFER_SIZE) { - GLVolume &vol = *volume; - volume = m_volumes.new_toolpath_volume(vol.color); - reserve_new_volume_finalize_old_volume(*volume, vol, m_initialized); - } - } - volume->is_outside = ! build_volume.all_paths_inside_vertices_and_normals_interleaved(volume->indexed_vertex_array.vertices_and_normals_interleaved, volume->indexed_vertex_array.bounding_box()); - volume->indexed_vertex_array.finalize_geometry(m_initialized); -} - -void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, const BuildVolume& build_volume, const std::vector& str_tool_colors, const std::vector& color_print_values) -{ - std::vector> tool_colors = _parse_colors(str_tool_colors); - - struct Ctxt - { - const PrintInstances *shifted_copies; - std::vector layers; - bool has_perimeters; - bool has_infill; - bool has_support; - const std::vector>* tool_colors; - bool is_single_material_print; - int extruders_cnt; - const std::vector* color_print_values; - - static const std::array& color_perimeters() { static std::array color = { 1.0f, 1.0f, 0.0f, 1.f }; return color; } // yellow - static const std::array& color_infill() { static std::array color = { 1.0f, 0.5f, 0.5f, 1.f }; return color; } // redish - static const std::array& color_support() { static std::array color = { 0.5f, 1.0f, 0.5f, 1.f }; return color; } // greenish - static const std::array& color_pause_or_custom_code() { static std::array color = { 0.5f, 0.5f, 0.5f, 1.f }; return color; } // gray - - // For cloring by a tool, return a parsed color. - bool color_by_tool() const { return tool_colors != nullptr; } - size_t number_tools() const { return color_by_tool() ? tool_colors->size() : 0; } - const std::array& color_tool(size_t tool) const { return (*tool_colors)[tool]; } - - // For coloring by a color_print(M600), return a parsed color. - bool color_by_color_print() const { return color_print_values!=nullptr; } - const size_t color_print_color_idx_by_layer_idx(const size_t layer_idx) const { - const CustomGCode::Item value{layers[layer_idx]->print_z + EPSILON, CustomGCode::Custom, 0, ""}; - auto it = std::lower_bound(color_print_values->begin(), color_print_values->end(), value); - return (it - color_print_values->begin()) % number_tools(); - } - - const size_t color_print_color_idx_by_layer_idx_and_extruder(const size_t layer_idx, const int extruder) const - { - const coordf_t print_z = layers[layer_idx]->print_z; - - auto it = std::find_if(color_print_values->begin(), color_print_values->end(), - [print_z](const CustomGCode::Item& code) - { return fabs(code.print_z - print_z) < EPSILON; }); - if (it != color_print_values->end()) { - CustomGCode::Type type = it->type; - // pause print or custom Gcode - if (type == CustomGCode::PausePrint || - (type != CustomGCode::ColorChange && type != CustomGCode::ToolChange)) - return number_tools()-1; // last color item is a gray color for pause print or custom G-code - - // change tool (extruder) - if (type == CustomGCode::ToolChange) - return get_color_idx_for_tool_change(it, extruder); - // change color for current extruder - if (type == CustomGCode::ColorChange) { - int color_idx = get_color_idx_for_color_change(it, extruder); - if (color_idx >= 0) - return color_idx; - } - } - - const CustomGCode::Item value{print_z + EPSILON, CustomGCode::Custom, 0, ""}; - it = std::lower_bound(color_print_values->begin(), color_print_values->end(), value); - while (it != color_print_values->begin()) { - --it; - // change color for current extruder - if (it->type == CustomGCode::ColorChange) { - int color_idx = get_color_idx_for_color_change(it, extruder); - if (color_idx >= 0) - return color_idx; - } - // change tool (extruder) - if (it->type == CustomGCode::ToolChange) - return get_color_idx_for_tool_change(it, extruder); - } - - return std::min(extruders_cnt - 1, std::max(extruder - 1, 0));; - } - - private: - int get_m600_color_idx(std::vector::const_iterator it) const - { - int shift = 0; - while (it != color_print_values->begin()) { - --it; - if (it->type == CustomGCode::ColorChange) - shift++; - } - return extruders_cnt + shift; - } - - int get_color_idx_for_tool_change(std::vector::const_iterator it, const int extruder) const - { - const int current_extruder = it->extruder == 0 ? extruder : it->extruder; - if (number_tools() == size_t(extruders_cnt + 1)) // there is no one "M600" - return std::min(extruders_cnt - 1, std::max(current_extruder - 1, 0)); - - auto it_n = it; - while (it_n != color_print_values->begin()) { - --it_n; - if (it_n->type == CustomGCode::ColorChange && it_n->extruder == current_extruder) - return get_m600_color_idx(it_n); - } - - return std::min(extruders_cnt - 1, std::max(current_extruder - 1, 0)); - } - - int get_color_idx_for_color_change(std::vector::const_iterator it, const int extruder) const - { - if (extruders_cnt == 1) - return get_m600_color_idx(it); - - auto it_n = it; - bool is_tool_change = false; - while (it_n != color_print_values->begin()) { - --it_n; - if (it_n->type == CustomGCode::ToolChange) { - is_tool_change = true; - if (it_n->extruder == it->extruder || (it_n->extruder == 0 && it->extruder == extruder)) - return get_m600_color_idx(it); - break; - } - } - if (!is_tool_change && it->extruder == extruder) - return get_m600_color_idx(it); - - return -1; - } - - } ctxt; - - ctxt.has_perimeters = print_object.is_step_done(posPerimeters); - ctxt.has_infill = print_object.is_step_done(posInfill); - ctxt.has_support = print_object.is_step_done(posSupportMaterial); - ctxt.tool_colors = tool_colors.empty() ? nullptr : &tool_colors; - ctxt.color_print_values = color_print_values.empty() ? nullptr : &color_print_values; - ctxt.is_single_material_print = this->fff_print()->extruders().size()==1; - ctxt.extruders_cnt = wxGetApp().extruders_edited_cnt(); - - ctxt.shifted_copies = &print_object.instances(); - - // order layers by print_z - { - size_t nlayers = 0; - if (ctxt.has_perimeters || ctxt.has_infill) - nlayers = print_object.layers().size(); - if (ctxt.has_support) - nlayers += print_object.support_layers().size(); - ctxt.layers.reserve(nlayers); - } - if (ctxt.has_perimeters || ctxt.has_infill) - for (const Layer *layer : print_object.layers()) - ctxt.layers.emplace_back(layer); - if (ctxt.has_support) - for (const Layer *layer : print_object.support_layers()) - ctxt.layers.emplace_back(layer); - std::sort(ctxt.layers.begin(), ctxt.layers.end(), [](const Layer *l1, const Layer *l2) { return l1->print_z < l2->print_z; }); - - // Maximum size of an allocation block: 32MB / sizeof(float) - BOOST_LOG_TRIVIAL(debug) << "Loading print object toolpaths in parallel - start" << m_volumes.log_memory_info() << log_memory_info(); - - const bool is_selected_separate_extruder = m_selected_extruder > 0 && ctxt.color_by_color_print(); - - //FIXME Improve the heuristics for a grain size. - size_t grain_size = std::max(ctxt.layers.size() / 16, size_t(1)); - tbb::spin_mutex new_volume_mutex; - auto new_volume = [this, &new_volume_mutex](const std::array& color) { - // Allocate the volume before locking. - GLVolume *volume = new GLVolume(color); - volume->is_extrusion_path = true; - tbb::spin_mutex::scoped_lock lock; - // Lock by ROII, so if the emplace_back() fails, the lock will be released. - lock.acquire(new_volume_mutex); - m_volumes.volumes.emplace_back(volume); - lock.release(); - return volume; - }; - const size_t volumes_cnt_initial = m_volumes.volumes.size(); - tbb::parallel_for( - tbb::blocked_range(0, ctxt.layers.size(), grain_size), - [&ctxt, &new_volume, is_selected_separate_extruder, this](const tbb::blocked_range& range) { - GLVolumePtrs vols; - auto volume = [&ctxt, &vols](size_t layer_idx, int extruder, int feature) -> GLVolume& { - return *vols[ctxt.color_by_color_print()? - ctxt.color_print_color_idx_by_layer_idx_and_extruder(layer_idx, extruder) : - ctxt.color_by_tool() ? - std::min(ctxt.number_tools() - 1, std::max(extruder - 1, 0)) : - feature - ]; - }; - if (ctxt.color_by_color_print() || ctxt.color_by_tool()) { - for (size_t i = 0; i < ctxt.number_tools(); ++i) - vols.emplace_back(new_volume(ctxt.color_tool(i))); - } - else - vols = { new_volume(ctxt.color_perimeters()), new_volume(ctxt.color_infill()), new_volume(ctxt.color_support()) }; - for (GLVolume *vol : vols) - // Reserving number of vertices (3x position + 3x color) - vol->indexed_vertex_array.reserve(VERTEX_BUFFER_RESERVE_SIZE / 6); - for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { - const Layer *layer = ctxt.layers[idx_layer]; - - if (is_selected_separate_extruder) - { - bool at_least_one_has_correct_extruder = false; - for (const LayerRegion* layerm : layer->regions()) - { - if (layerm->slices.surfaces.empty()) - continue; - const PrintRegionConfig& cfg = layerm->region().config(); - if (cfg.perimeter_extruder.value == m_selected_extruder || - cfg.infill_extruder.value == m_selected_extruder || - cfg.solid_infill_extruder.value == m_selected_extruder ) { - at_least_one_has_correct_extruder = true; - break; - } - } - if (!at_least_one_has_correct_extruder) - continue; - } - - for (GLVolume *vol : vols) - if (vol->print_zs.empty() || vol->print_zs.back() != layer->print_z) { - vol->print_zs.emplace_back(layer->print_z); - vol->offsets.emplace_back(vol->indexed_vertex_array.quad_indices.size()); - vol->offsets.emplace_back(vol->indexed_vertex_array.triangle_indices.size()); - } - for (const PrintInstance &instance : *ctxt.shifted_copies) { - const Point © = instance.shift; - for (const LayerRegion *layerm : layer->regions()) { - if (is_selected_separate_extruder) - { - const PrintRegionConfig& cfg = layerm->region().config(); - if (cfg.perimeter_extruder.value != m_selected_extruder || - cfg.infill_extruder.value != m_selected_extruder || - cfg.solid_infill_extruder.value != m_selected_extruder) - continue; - } - if (ctxt.has_perimeters) - _3DScene::extrusionentity_to_verts(layerm->perimeters, float(layer->print_z), copy, - volume(idx_layer, layerm->region().config().perimeter_extruder.value, 0)); - if (ctxt.has_infill) { - for (const ExtrusionEntity *ee : layerm->fills.entities) { - // fill represents infill extrusions of a single island. - const auto *fill = dynamic_cast(ee); - if (! fill->entities.empty()) - _3DScene::extrusionentity_to_verts(*fill, float(layer->print_z), copy, - volume(idx_layer, - is_solid_infill(fill->entities.front()->role()) ? - layerm->region().config().solid_infill_extruder : - layerm->region().config().infill_extruder, - 1)); - } - } - } - if (ctxt.has_support) { - const SupportLayer *support_layer = dynamic_cast(layer); - if (support_layer) { - for (const ExtrusionEntity *extrusion_entity : support_layer->support_fills.entities) - _3DScene::extrusionentity_to_verts(extrusion_entity, float(layer->print_z), copy, - volume(idx_layer, - (extrusion_entity->role() == erSupportMaterial) ? - support_layer->object()->config().support_material_extruder : - support_layer->object()->config().support_material_interface_extruder, - 2)); - } - } - } - // Ensure that no volume grows over the limits. If the volume is too large, allocate a new one. - for (size_t i = 0; i < vols.size(); ++i) { - GLVolume &vol = *vols[i]; - if (vol.indexed_vertex_array.vertices_and_normals_interleaved.size() > MAX_VERTEX_BUFFER_SIZE) { - vols[i] = new_volume(vol.color); - reserve_new_volume_finalize_old_volume(*vols[i], vol, false); - } - } - } - for (GLVolume *vol : vols) - // Ideally one would call vol->indexed_vertex_array.finalize() here to move the buffers to the OpenGL driver, - // but this code runs in parallel and the OpenGL driver is not thread safe. - vol->indexed_vertex_array.shrink_to_fit(); - }); - - BOOST_LOG_TRIVIAL(debug) << "Loading print object toolpaths in parallel - finalizing results" << m_volumes.log_memory_info() << log_memory_info(); - // Remove empty volumes from the newly added volumes. - m_volumes.volumes.erase( - std::remove_if(m_volumes.volumes.begin() + volumes_cnt_initial, m_volumes.volumes.end(), - [](const GLVolume *volume) { return volume->empty(); }), - m_volumes.volumes.end()); - for (size_t i = volumes_cnt_initial; i < m_volumes.volumes.size(); ++i) { - GLVolume* v = m_volumes.volumes[i]; - v->is_outside = ! build_volume.all_paths_inside_vertices_and_normals_interleaved(v->indexed_vertex_array.vertices_and_normals_interleaved, v->indexed_vertex_array.bounding_box()); - v->indexed_vertex_array.finalize_geometry(m_initialized); - } - - BOOST_LOG_TRIVIAL(debug) << "Loading print object toolpaths in parallel - end" << m_volumes.log_memory_info() << log_memory_info(); -} - -void GLCanvas3D::_load_wipe_tower_toolpaths(const BuildVolume& build_volume, const std::vector& str_tool_colors) -{ - const Print *print = this->fff_print(); - if (print == nullptr || print->wipe_tower_data().tool_changes.empty()) - return; - - if (!print->is_step_done(psWipeTower)) - return; - - std::vector> tool_colors = _parse_colors(str_tool_colors); - - struct Ctxt - { - const Print *print; - const std::vector>* tool_colors; - Vec2f wipe_tower_pos; - float wipe_tower_angle; - - static const std::array& color_support() { static std::array color = { 0.5f, 1.0f, 0.5f, 1.f }; return color; } // greenish - - // For cloring by a tool, return a parsed color. - bool color_by_tool() const { return tool_colors != nullptr; } - size_t number_tools() const { return this->color_by_tool() ? tool_colors->size() : 0; } - const std::array& color_tool(size_t tool) const { return (*tool_colors)[tool]; } - int volume_idx(int tool, int feature) const { - return this->color_by_tool() ? std::min(this->number_tools() - 1, std::max(tool, 0)) : feature; - } - - const std::vector& tool_change(size_t idx) { - const auto &tool_changes = print->wipe_tower_data().tool_changes; - return priming.empty() ? - ((idx == tool_changes.size()) ? final : tool_changes[idx]) : - ((idx == 0) ? priming : (idx == tool_changes.size() + 1) ? final : tool_changes[idx - 1]); - } - std::vector priming; - std::vector final; - } ctxt; - - ctxt.print = print; - ctxt.tool_colors = tool_colors.empty() ? nullptr : &tool_colors; - if (print->wipe_tower_data().priming && print->config().single_extruder_multi_material_priming) - for (int i=0; i<(int)print->wipe_tower_data().priming.get()->size(); ++i) - ctxt.priming.emplace_back(print->wipe_tower_data().priming.get()->at(i)); - if (print->wipe_tower_data().final_purge) - ctxt.final.emplace_back(*print->wipe_tower_data().final_purge.get()); - - ctxt.wipe_tower_angle = ctxt.print->config().wipe_tower_rotation_angle.value/180.f * PI; - ctxt.wipe_tower_pos = Vec2f(ctxt.print->config().wipe_tower_x.value, ctxt.print->config().wipe_tower_y.value); - - BOOST_LOG_TRIVIAL(debug) << "Loading wipe tower toolpaths in parallel - start" << m_volumes.log_memory_info() << log_memory_info(); - - //FIXME Improve the heuristics for a grain size. - size_t n_items = print->wipe_tower_data().tool_changes.size() + (ctxt.priming.empty() ? 0 : 1); - size_t grain_size = std::max(n_items / 128, size_t(1)); - tbb::spin_mutex new_volume_mutex; - auto new_volume = [this, &new_volume_mutex](const std::array& color) { - auto *volume = new GLVolume(color); - volume->is_extrusion_path = true; - tbb::spin_mutex::scoped_lock lock; - lock.acquire(new_volume_mutex); - m_volumes.volumes.emplace_back(volume); - lock.release(); - return volume; - }; - const size_t volumes_cnt_initial = m_volumes.volumes.size(); - std::vector volumes_per_thread(n_items); - tbb::parallel_for( - tbb::blocked_range(0, n_items, grain_size), - [&ctxt, &new_volume](const tbb::blocked_range& range) { - // Bounding box of this slab of a wipe tower. - GLVolumePtrs vols; - if (ctxt.color_by_tool()) { - for (size_t i = 0; i < ctxt.number_tools(); ++i) - vols.emplace_back(new_volume(ctxt.color_tool(i))); - } - else - vols = { new_volume(ctxt.color_support()) }; - for (GLVolume *volume : vols) - // Reserving number of vertices (3x position + 3x color) - volume->indexed_vertex_array.reserve(VERTEX_BUFFER_RESERVE_SIZE / 6); - for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++idx_layer) { - const std::vector &layer = ctxt.tool_change(idx_layer); - for (size_t i = 0; i < vols.size(); ++i) { - GLVolume &vol = *vols[i]; - if (vol.print_zs.empty() || vol.print_zs.back() != layer.front().print_z) { - vol.print_zs.emplace_back(layer.front().print_z); - vol.offsets.emplace_back(vol.indexed_vertex_array.quad_indices.size()); - vol.offsets.emplace_back(vol.indexed_vertex_array.triangle_indices.size()); - } - } - for (const WipeTower::ToolChangeResult &extrusions : layer) { - for (size_t i = 1; i < extrusions.extrusions.size();) { - const WipeTower::Extrusion &e = extrusions.extrusions[i]; - if (e.width == 0.) { - ++i; - continue; - } - size_t j = i + 1; - if (ctxt.color_by_tool()) - for (; j < extrusions.extrusions.size() && extrusions.extrusions[j].tool == e.tool && extrusions.extrusions[j].width > 0.f; ++j); - else - for (; j < extrusions.extrusions.size() && extrusions.extrusions[j].width > 0.f; ++j); - size_t n_lines = j - i; - Lines lines; - std::vector widths; - std::vector heights; - lines.reserve(n_lines); - widths.reserve(n_lines); - heights.assign(n_lines, extrusions.layer_height); - WipeTower::Extrusion e_prev = extrusions.extrusions[i-1]; - - if (!extrusions.priming) { // wipe tower extrusions describe the wipe tower at the origin with no rotation - e_prev.pos = Eigen::Rotation2Df(ctxt.wipe_tower_angle) * e_prev.pos; - e_prev.pos += ctxt.wipe_tower_pos; - } - - for (; i < j; ++i) { - WipeTower::Extrusion e = extrusions.extrusions[i]; - assert(e.width > 0.f); - if (!extrusions.priming) { - e.pos = Eigen::Rotation2Df(ctxt.wipe_tower_angle) * e.pos; - e.pos += ctxt.wipe_tower_pos; - } - - lines.emplace_back(Point::new_scale(e_prev.pos.x(), e_prev.pos.y()), Point::new_scale(e.pos.x(), e.pos.y())); - widths.emplace_back(e.width); - - e_prev = e; - } - _3DScene::thick_lines_to_verts(lines, widths, heights, lines.front().a == lines.back().b, extrusions.print_z, - *vols[ctxt.volume_idx(e.tool, 0)]); - } - } - } - for (size_t i = 0; i < vols.size(); ++i) { - GLVolume &vol = *vols[i]; - if (vol.indexed_vertex_array.vertices_and_normals_interleaved.size() > MAX_VERTEX_BUFFER_SIZE) { - vols[i] = new_volume(vol.color); - reserve_new_volume_finalize_old_volume(*vols[i], vol, false); - } - } - for (GLVolume *vol : vols) - vol->indexed_vertex_array.shrink_to_fit(); - }); - - BOOST_LOG_TRIVIAL(debug) << "Loading wipe tower toolpaths in parallel - finalizing results" << m_volumes.log_memory_info() << log_memory_info(); - // Remove empty volumes from the newly added volumes. - m_volumes.volumes.erase( - std::remove_if(m_volumes.volumes.begin() + volumes_cnt_initial, m_volumes.volumes.end(), - [](const GLVolume *volume) { return volume->empty(); }), - m_volumes.volumes.end()); - for (size_t i = volumes_cnt_initial; i < m_volumes.volumes.size(); ++i) { - GLVolume* v = m_volumes.volumes[i]; - v->is_outside = ! build_volume.all_paths_inside_vertices_and_normals_interleaved(v->indexed_vertex_array.vertices_and_normals_interleaved, v->indexed_vertex_array.bounding_box()); - v->indexed_vertex_array.finalize_geometry(m_initialized); - } - - BOOST_LOG_TRIVIAL(debug) << "Loading wipe tower toolpaths in parallel - end" << m_volumes.log_memory_info() << log_memory_info(); -} - -// While it looks like we can call -// this->reload_scene(true, true) -// the two functions are quite different: -// 1) This function only loads objects, for which the step slaposSliceSupports already finished. Therefore objects outside of the print bed never load. -// 2) This function loads object mesh with the relative scaling correction (the "relative_correction" parameter) was applied, -// therefore the mesh may be slightly larger or smaller than the mesh shown in the 3D scene. -void GLCanvas3D::_load_sla_shells() -{ - const SLAPrint* print = this->sla_print(); - if (print->objects().empty()) - // nothing to render, return - return; - - auto add_volume = [this](const SLAPrintObject &object, int volume_id, const SLAPrintObject::Instance& instance, - const TriangleMesh& mesh, const std::array& color, bool outside_printer_detection_enabled) { - m_volumes.volumes.emplace_back(new GLVolume(color)); - GLVolume& v = *m_volumes.volumes.back(); -#if ENABLE_SMOOTH_NORMALS - v.indexed_vertex_array.load_mesh(mesh, true); -#else - v.indexed_vertex_array.load_mesh(mesh); -#endif // ENABLE_SMOOTH_NORMALS - v.indexed_vertex_array.finalize_geometry(m_initialized); - v.shader_outside_printer_detection_enabled = outside_printer_detection_enabled; - v.composite_id.volume_id = volume_id; - v.set_instance_offset(unscale(instance.shift.x(), instance.shift.y(), 0.0)); - v.set_instance_rotation({ 0.0, 0.0, (double)instance.rotation }); - v.set_instance_mirror(X, object.is_left_handed() ? -1. : 1.); - v.set_convex_hull(mesh.convex_hull_3d()); - }; - - // adds objects' volumes - for (const SLAPrintObject* obj : print->objects()) - if (obj->is_step_done(slaposSliceSupports)) { - unsigned int initial_volumes_count = (unsigned int)m_volumes.volumes.size(); - for (const SLAPrintObject::Instance& instance : obj->instances()) { - add_volume(*obj, 0, instance, obj->get_mesh_to_print(), GLVolume::MODEL_COLOR[0], true); - // Set the extruder_id and volume_id to achieve the same color as in the 3D scene when - // through the update_volumes_colors_by_extruder() call. - m_volumes.volumes.back()->extruder_id = obj->model_object()->volumes.front()->extruder_id(); - if (obj->is_step_done(slaposSupportTree) && obj->has_mesh(slaposSupportTree)) - add_volume(*obj, -int(slaposSupportTree), instance, obj->support_mesh(), GLVolume::SLA_SUPPORT_COLOR, true); - if (obj->is_step_done(slaposPad) && obj->has_mesh(slaposPad)) - add_volume(*obj, -int(slaposPad), instance, obj->pad_mesh(), GLVolume::SLA_PAD_COLOR, false); - } - double shift_z = obj->get_current_elevation(); - for (unsigned int i = initial_volumes_count; i < m_volumes.volumes.size(); ++ i) { - // apply shift z - m_volumes.volumes[i]->set_sla_shift_z(shift_z); - } - } - - update_volumes_colors_by_extruder(); -} - -void GLCanvas3D::_update_sla_shells_outside_state() -{ - check_volumes_outside_state(); -} - -void GLCanvas3D::_set_warning_notification_if_needed(EWarning warning) -{ - _set_current(); - bool show = false; - if (!m_volumes.empty()) - show = _is_any_volume_outside(); - else { - if (wxGetApp().is_editor()) { - if (current_printer_technology() != ptSLA) - show = m_gcode_viewer.has_data() && !m_gcode_viewer.is_contained_in_bed(); - } - } - - _set_warning_notification(warning, show); -} - -std::vector> GLCanvas3D::_parse_colors(const std::vector& colors) -{ - static const float INV_255 = 1.0f / 255.0f; - - std::vector> output(colors.size(), { 1.0f, 1.0f, 1.0f, 1.0f }); - for (size_t i = 0; i < colors.size(); ++i) { - const std::string& color = colors[i]; - const char* c = color.data() + 1; - if (color.size() == 7 && color.front() == '#') { - for (size_t j = 0; j < 3; ++j) { - int digit1 = hex_digit_to_int(*c++); - int digit2 = hex_digit_to_int(*c++); - if (digit1 == -1 || digit2 == -1) - break; - - output[i][j] = float(digit1 * 16 + digit2) * INV_255; - } - } - } - return output; -} - -void GLCanvas3D::_set_warning_notification(EWarning warning, bool state) -{ - enum ErrorType{ - PLATER_WARNING, - PLATER_ERROR, - SLICING_ERROR - }; - std::string text; - ErrorType error = ErrorType::PLATER_WARNING; - switch (warning) { - case EWarning::ObjectOutside: text = _u8L("An object outside the print area was detected."); break; - case EWarning::ToolpathOutside: text = _u8L("A toolpath outside the print area was detected."); error = ErrorType::SLICING_ERROR; break; - case EWarning::SlaSupportsOutside: text = _u8L("SLA supports outside the print area were detected."); error = ErrorType::PLATER_ERROR; break; - case EWarning::SomethingNotShown: text = _u8L("Some objects are not visible during editing."); break; - case EWarning::ObjectClashed: - text = _u8L("An object outside the print area was detected.\n" - "Resolve the current problem to continue slicing."); - error = ErrorType::PLATER_ERROR; - break; - } - auto& notification_manager = *wxGetApp().plater()->get_notification_manager(); - switch (error) - { - case PLATER_WARNING: - if (state) - notification_manager.push_plater_warning_notification(text); - else - notification_manager.close_plater_warning_notification(text); - break; - case PLATER_ERROR: - if (state) - notification_manager.push_plater_error_notification(text); - else - notification_manager.close_plater_error_notification(text); - break; - case SLICING_ERROR: - if (state) - notification_manager.push_slicing_error_notification(text); - else - notification_manager.close_slicing_error_notification(text); - break; - default: - break; - } -} - -bool GLCanvas3D::_is_any_volume_outside() const -{ - for (const GLVolume* volume : m_volumes.volumes) { - if (volume != nullptr && volume->is_outside) - return true; - } - - return false; -} - -void GLCanvas3D::_update_selection_from_hover() -{ - bool ctrl_pressed = wxGetKeyState(WXK_CONTROL); - bool selection_changed = false; - - if (m_hover_volume_idxs.empty()) { - if (!ctrl_pressed && (m_rectangle_selection.get_state() == GLSelectionRectangle::Select)) { - selection_changed = ! m_selection.is_empty(); - m_selection.remove_all(); - } - } - - GLSelectionRectangle::EState state = m_rectangle_selection.get_state(); - - bool hover_modifiers_only = true; - for (int i : m_hover_volume_idxs) { - if (!m_volumes.volumes[i]->is_modifier) { - hover_modifiers_only = false; - break; - } - } - - if (state == GLSelectionRectangle::Select) { - bool contains_all = true; - for (int i : m_hover_volume_idxs) { - if (!m_selection.contains_volume((unsigned int)i)) { - contains_all = false; - break; - } - } - - // the selection is going to be modified (Add) - if (!contains_all) { - wxGetApp().plater()->take_snapshot(_(L("Selection-Add from rectangle")), UndoRedo::SnapshotType::Selection); - selection_changed = true; - } - } - else { - bool contains_any = false; - for (int i : m_hover_volume_idxs) { - if (m_selection.contains_volume((unsigned int)i)) { - contains_any = true; - break; - } - } - - // the selection is going to be modified (Remove) - if (contains_any) { - wxGetApp().plater()->take_snapshot(_(L("Selection-Remove from rectangle")), UndoRedo::SnapshotType::Selection); - selection_changed = true; - } - } - - if (!selection_changed) - return; - - Plater::SuppressSnapshots suppress(wxGetApp().plater()); - - if ((state == GLSelectionRectangle::Select) && !ctrl_pressed) - m_selection.clear(); - - for (int i : m_hover_volume_idxs) { - if (state == GLSelectionRectangle::Select) { - if (hover_modifiers_only) { - const GLVolume& v = *m_volumes.volumes[i]; - m_selection.add_volume(v.object_idx(), v.volume_idx(), v.instance_idx(), false); - } - else - m_selection.add(i, false); - } - else - m_selection.remove(i); - } - - if (m_selection.is_empty()) - m_gizmos.reset_all_states(); - else - m_gizmos.refresh_on_off_state(); - - m_gizmos.update_data(); - post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT)); - m_dirty = true; -} - -bool GLCanvas3D::_deactivate_undo_redo_toolbar_items() -{ - if (m_undoredo_toolbar.is_item_pressed("undo")) { - m_undoredo_toolbar.force_right_action(m_undoredo_toolbar.get_item_id("undo"), *this); - return true; - } - else if (m_undoredo_toolbar.is_item_pressed("redo")) { - m_undoredo_toolbar.force_right_action(m_undoredo_toolbar.get_item_id("redo"), *this); - return true; - } - - return false; -} - -bool GLCanvas3D::is_search_pressed() const -{ - return m_main_toolbar.is_item_pressed("search"); -} - -bool GLCanvas3D::_deactivate_arrange_menu() -{ - if (m_main_toolbar.is_item_pressed("arrange")) { - m_main_toolbar.force_right_action(m_main_toolbar.get_item_id("arrange"), *this); - return true; - } - - return false; -} - -bool GLCanvas3D::_deactivate_search_toolbar_item() -{ - if (is_search_pressed()) { - m_main_toolbar.force_left_action(m_main_toolbar.get_item_id("search"), *this); - return true; - } - - return false; -} - -bool GLCanvas3D::_activate_search_toolbar_item() -{ - if (!m_main_toolbar.is_item_pressed("search")) { - m_main_toolbar.force_left_action(m_main_toolbar.get_item_id("search"), *this); - return true; - } - - return false; -} - -bool GLCanvas3D::_deactivate_collapse_toolbar_items() -{ - GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); - if (collapse_toolbar.is_item_pressed("print")) { - collapse_toolbar.force_left_action(collapse_toolbar.get_item_id("print"), *this); - return true; - } - - return false; -} - -void GLCanvas3D::highlight_toolbar_item(const std::string& item_name) -{ - GLToolbarItem* item = m_main_toolbar.get_item(item_name); - if (!item) - item = m_undoredo_toolbar.get_item(item_name); - if (!item || !item->is_visible()) - return; - m_toolbar_highlighter.init(item, this); -} - -void GLCanvas3D::highlight_gizmo(const std::string& gizmo_name) -{ - GLGizmosManager::EType gizmo = m_gizmos.get_gizmo_from_name(gizmo_name); - if(gizmo == GLGizmosManager::EType::Undefined) - return; - m_gizmo_highlighter.init(&m_gizmos, gizmo, this); -} - -const Print* GLCanvas3D::fff_print() const -{ - return (m_process == nullptr) ? nullptr : m_process->fff_print(); -} - -const SLAPrint* GLCanvas3D::sla_print() const -{ - return (m_process == nullptr) ? nullptr : m_process->sla_print(); -} - -void GLCanvas3D::WipeTowerInfo::apply_wipe_tower() const -{ - DynamicPrintConfig cfg; - cfg.opt("wipe_tower_x", true)->value = m_pos(X); - cfg.opt("wipe_tower_y", true)->value = m_pos(Y); - cfg.opt("wipe_tower_rotation_angle", true)->value = (180./M_PI) * m_rotation; - wxGetApp().get_tab(Preset::TYPE_PRINT)->load_config(cfg); -} - -void GLCanvas3D::RenderTimer::Notify() -{ - wxPostEvent((wxEvtHandler*)GetOwner(), RenderTimerEvent( EVT_GLCANVAS_RENDER_TIMER, *this)); -} - -void GLCanvas3D::ToolbarHighlighterTimer::Notify() -{ - wxPostEvent((wxEvtHandler*)GetOwner(), ToolbarHighlighterTimerEvent(EVT_GLCANVAS_TOOLBAR_HIGHLIGHTER_TIMER, *this)); -} - -void GLCanvas3D::GizmoHighlighterTimer::Notify() -{ - wxPostEvent((wxEvtHandler*)GetOwner(), GizmoHighlighterTimerEvent(EVT_GLCANVAS_GIZMO_HIGHLIGHTER_TIMER, *this)); -} - -void GLCanvas3D::ToolbarHighlighter::set_timer_owner(wxEvtHandler* owner, int timerid/* = wxID_ANY*/) -{ - m_timer.SetOwner(owner, timerid); -} - -void GLCanvas3D::ToolbarHighlighter::init(GLToolbarItem* toolbar_item, GLCanvas3D* canvas) -{ - if (m_timer.IsRunning()) - invalidate(); - if (!toolbar_item || !canvas) - return; - - m_timer.Start(300, false); - - m_toolbar_item = toolbar_item; - m_canvas = canvas; -} - -void GLCanvas3D::ToolbarHighlighter::invalidate() -{ - m_timer.Stop(); - - if (m_toolbar_item) { - m_toolbar_item->set_highlight(GLToolbarItem::EHighlightState::NotHighlighted); - } - m_toolbar_item = nullptr; - m_blink_counter = 0; - m_render_arrow = false; -} - -void GLCanvas3D::ToolbarHighlighter::blink() -{ - if (m_toolbar_item) { - char state = m_toolbar_item->get_highlight(); - if (state != (char)GLToolbarItem::EHighlightState::HighlightedShown) - m_toolbar_item->set_highlight(GLToolbarItem::EHighlightState::HighlightedShown); - else - m_toolbar_item->set_highlight(GLToolbarItem::EHighlightState::HighlightedHidden); - - m_render_arrow = !m_render_arrow; - m_canvas->set_as_dirty(); - } - else - invalidate(); - - if ((++m_blink_counter) >= 11) - invalidate(); -} - -void GLCanvas3D::GizmoHighlighter::set_timer_owner(wxEvtHandler* owner, int timerid/* = wxID_ANY*/) -{ - m_timer.SetOwner(owner, timerid); -} - -void GLCanvas3D::GizmoHighlighter::init(GLGizmosManager* manager, GLGizmosManager::EType gizmo, GLCanvas3D* canvas) -{ - if (m_timer.IsRunning()) - invalidate(); - if (!gizmo || !canvas) - return; - - m_timer.Start(300, false); - - m_gizmo_manager = manager; - m_gizmo_type = gizmo; - m_canvas = canvas; -} - -void GLCanvas3D::GizmoHighlighter::invalidate() -{ - m_timer.Stop(); - - if (m_gizmo_manager) { - m_gizmo_manager->set_highlight(GLGizmosManager::EType::Undefined, false); - } - m_gizmo_manager = nullptr; - m_gizmo_type = GLGizmosManager::EType::Undefined; - m_blink_counter = 0; - m_render_arrow = false; -} - -void GLCanvas3D::GizmoHighlighter::blink() -{ - if (m_gizmo_manager) { - if (m_blink_counter % 2 == 0) - m_gizmo_manager->set_highlight(m_gizmo_type, true); - else - m_gizmo_manager->set_highlight(m_gizmo_type, false); - - m_render_arrow = !m_render_arrow; - m_canvas->set_as_dirty(); - } - else - invalidate(); - - if ((++m_blink_counter) >= 11) - invalidate(); -} - -} // namespace GUI -} // namespace Slic3r +#include "libslic3r/libslic3r.h" +#include "GLCanvas3D.hpp" + +#include + +#include "libslic3r/BuildVolume.hpp" +#include "libslic3r/ClipperUtils.hpp" +#include "libslic3r/PrintConfig.hpp" +#include "libslic3r/GCode/ThumbnailData.hpp" +#include "libslic3r/Geometry/ConvexHull.hpp" +#include "libslic3r/ExtrusionEntity.hpp" +#include "libslic3r/Layer.hpp" +#include "libslic3r/Utils.hpp" +#include "libslic3r/LocalesUtils.hpp" +#include "libslic3r/Technologies.hpp" +#include "libslic3r/Tesselate.hpp" +#include "libslic3r/PresetBundle.hpp" +#include "3DBed.hpp" +#include "3DScene.hpp" +#include "BackgroundSlicingProcess.hpp" +#include "GLShader.hpp" +#include "GUI.hpp" +#include "Tab.hpp" +#include "GUI_Preview.hpp" +#include "OpenGLManager.hpp" +#include "Plater.hpp" +#include "MainFrame.hpp" +#include "GUI_App.hpp" +#include "GUI_ObjectList.hpp" +#include "GUI_ObjectManipulation.hpp" +#include "Mouse3DController.hpp" +#include "I18N.hpp" +#include "NotificationManager.hpp" +#include "format.hpp" + +#include "slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp" +#include "slic3r/Utils/UndoRedo.hpp" + +#if ENABLE_RETINA_GL +#include "slic3r/Utils/RetinaHelper.hpp" +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +// Print now includes tbb, and tbb includes Windows. This breaks compilation of wxWidgets if included before wx. +#include "libslic3r/Print.hpp" +#include "libslic3r/SLAPrint.hpp" + +#include "wxExtensions.hpp" + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include "DoubleSlider.hpp" + +#include + +static constexpr const float TRACKBALLSIZE = 0.8f; + +static const Slic3r::ColorRGBA DEFAULT_BG_DARK_COLOR = { 0.478f, 0.478f, 0.478f, 1.0f }; +static const Slic3r::ColorRGBA DEFAULT_BG_LIGHT_COLOR = { 0.753f, 0.753f, 0.753f, 1.0f }; +static const Slic3r::ColorRGBA ERROR_BG_DARK_COLOR = { 0.478f, 0.192f, 0.039f, 1.0f }; +static const Slic3r::ColorRGBA ERROR_BG_LIGHT_COLOR = { 0.753f, 0.192f, 0.039f, 1.0f }; + +// Number of floats +static constexpr const size_t MAX_VERTEX_BUFFER_SIZE = 131072 * 6; // 3.15MB + +#define SHOW_IMGUI_DEMO_WINDOW +#ifdef SHOW_IMGUI_DEMO_WINDOW +static bool show_imgui_demo_window = false; +#endif // SHOW_IMGUI_DEMO_WINDOW + +namespace Slic3r { +namespace GUI { + +#ifdef __WXGTK3__ +// wxGTK3 seems to simulate OSX behavior in regard to HiDPI scaling support. +RetinaHelper::RetinaHelper(wxWindow* window) : m_window(window), m_self(nullptr) {} +RetinaHelper::~RetinaHelper() {} +float RetinaHelper::get_scale_factor() { return float(m_window->GetContentScaleFactor()); } +#endif // __WXGTK3__ + +// Fixed the collision between BuildVolume::Type::Convex and macro Convex defined inside /usr/include/X11/X.h that is included by WxWidgets 3.0. +#if defined(__linux__) && defined(Convex) +#undef Convex +#endif + +GLCanvas3D::LayersEditing::~LayersEditing() +{ + if (m_z_texture_id != 0) { + glsafe(::glDeleteTextures(1, &m_z_texture_id)); + m_z_texture_id = 0; + } + delete m_slicing_parameters; +} + +const float GLCanvas3D::LayersEditing::THICKNESS_BAR_WIDTH = 70.0f; + +void GLCanvas3D::LayersEditing::init() +{ + glsafe(::glGenTextures(1, (GLuint*)&m_z_texture_id)); + glsafe(::glBindTexture(GL_TEXTURE_2D, m_z_texture_id)); + if (!OpenGLManager::get_gl_info().is_core_profile() || !OpenGLManager::get_gl_info().is_mesa()) { + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); + } + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1)); + glsafe(::glBindTexture(GL_TEXTURE_2D, 0)); +} + +void GLCanvas3D::LayersEditing::set_config(const DynamicPrintConfig* config) +{ + m_config = config; + delete m_slicing_parameters; + m_slicing_parameters = nullptr; + m_layers_texture.valid = false; +} + +void GLCanvas3D::LayersEditing::select_object(const Model &model, int object_id) +{ + const ModelObject *model_object_new = (object_id >= 0) ? model.objects[object_id] : nullptr; + // Maximum height of an object changes when the object gets rotated or scaled. + // Changing maximum height of an object will invalidate the layer heigth editing profile. + // m_model_object->bounding_box() is cached, therefore it is cheap even if this method is called frequently. + const float new_max_z = (model_object_new == nullptr) ? 0.0f : static_cast(model_object_new->max_z()); + if (m_model_object != model_object_new || this->last_object_id != object_id || m_object_max_z != new_max_z || + (model_object_new != nullptr && m_model_object->id() != model_object_new->id())) { + m_layer_height_profile.clear(); + m_layer_height_profile_modified = false; + delete m_slicing_parameters; + m_slicing_parameters = nullptr; + m_layers_texture.valid = false; + this->last_object_id = object_id; + m_model_object = model_object_new; + m_object_max_z = new_max_z; + } +} + +bool GLCanvas3D::LayersEditing::is_allowed() const +{ + return wxGetApp().get_shader("variable_layer_height") != nullptr && m_z_texture_id > 0; +} + +bool GLCanvas3D::LayersEditing::is_enabled() const +{ + return m_enabled; +} + +void GLCanvas3D::LayersEditing::set_enabled(bool enabled) +{ + m_enabled = is_allowed() && enabled; +} + +float GLCanvas3D::LayersEditing::s_overlay_window_width; + +void GLCanvas3D::LayersEditing::render_overlay(const GLCanvas3D& canvas) +{ + if (!m_enabled) + return; + + const Size& cnv_size = canvas.get_canvas_size(); + + ImGuiWrapper& imgui = *wxGetApp().imgui(); + imgui.set_next_window_pos(static_cast(cnv_size.get_width()) - imgui.get_style_scaling() * THICKNESS_BAR_WIDTH, + static_cast(cnv_size.get_height()), ImGuiCond_Always, 1.0f, 1.0f); + + imgui.begin(_L("Variable layer height"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoCollapse); + + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _L("Left mouse button:")); + ImGui::SameLine(); + imgui.text(_L("Add detail")); + + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _L("Right mouse button:")); + ImGui::SameLine(); + imgui.text(_L("Remove detail")); + + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _L("Shift + Left mouse button:")); + ImGui::SameLine(); + imgui.text(_L("Reset to base")); + + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _L("Shift + Right mouse button:")); + ImGui::SameLine(); + imgui.text(_L("Smoothing")); + + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _L("Mouse wheel:")); + ImGui::SameLine(); + imgui.text(_L("Increase/decrease edit area")); + + ImGui::Separator(); + if (imgui.button(_L("Adaptive"))) + wxPostEvent((wxEvtHandler*)canvas.get_wxglcanvas(), Event(EVT_GLCANVAS_ADAPTIVE_LAYER_HEIGHT_PROFILE, m_adaptive_quality)); + + ImGui::SameLine(); + float text_align = ImGui::GetCursorPosX(); + ImGui::AlignTextToFramePadding(); + imgui.text(_L("Quality / Speed")); + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::TextUnformatted(_L("Higher print quality versus higher print speed.").ToUTF8()); + ImGui::EndTooltip(); + } + + ImGui::SameLine(); + float widget_align = ImGui::GetCursorPosX(); + ImGui::PushItemWidth(imgui.get_style_scaling() * 120.0f); + m_adaptive_quality = std::clamp(m_adaptive_quality, 0.0f, 1.f); + imgui.slider_float("", &m_adaptive_quality, 0.0f, 1.f, "%.2f"); + + ImGui::Separator(); + if (imgui.button(_L("Smooth"))) + wxPostEvent((wxEvtHandler*)canvas.get_wxglcanvas(), HeightProfileSmoothEvent(EVT_GLCANVAS_SMOOTH_LAYER_HEIGHT_PROFILE, m_smooth_params)); + + ImGui::SameLine(); + ImGui::SetCursorPosX(text_align); + ImGui::AlignTextToFramePadding(); + imgui.text(_L("Radius")); + ImGui::SameLine(); + ImGui::SetCursorPosX(widget_align); + ImGui::PushItemWidth(imgui.get_style_scaling() * 120.0f); + int radius = (int)m_smooth_params.radius; + if (ImGui::SliderInt("##1", &radius, 1, 10)) { + radius = std::clamp(radius, 1, 10); + m_smooth_params.radius = (unsigned int)radius; + } + + ImGui::SetCursorPosX(text_align); + ImGui::AlignTextToFramePadding(); + imgui.text(_L("Keep min")); + ImGui::SameLine(); + if (ImGui::GetCursorPosX() < widget_align) // because of line lenght after localization + ImGui::SetCursorPosX(widget_align); + + ImGui::PushItemWidth(imgui.get_style_scaling() * 120.0f); + imgui.checkbox("##2", m_smooth_params.keep_min); + + ImGui::Separator(); + if (imgui.button(_L("Reset"))) + wxPostEvent((wxEvtHandler*)canvas.get_wxglcanvas(), SimpleEvent(EVT_GLCANVAS_RESET_LAYER_HEIGHT_PROFILE)); + + GLCanvas3D::LayersEditing::s_overlay_window_width = ImGui::GetWindowSize().x /*+ (float)m_layers_texture.width/4*/; + imgui.end(); + + render_active_object_annotations(canvas); + render_profile(canvas); +} + +float GLCanvas3D::LayersEditing::get_cursor_z_relative(const GLCanvas3D& canvas) +{ + const Vec2d mouse_pos = canvas.get_local_mouse_position(); + const Rect& rect = get_bar_rect_screen(canvas); + float x = (float)mouse_pos.x(); + float y = (float)mouse_pos.y(); + float t = rect.get_top(); + float b = rect.get_bottom(); + + return (rect.get_left() <= x && x <= rect.get_right() && t <= y && y <= b) ? + // Inside the bar. + (b - y - 1.0f) / (b - t - 1.0f) : + // Outside the bar. + -1000.0f; +} + +bool GLCanvas3D::LayersEditing::bar_rect_contains(const GLCanvas3D& canvas, float x, float y) +{ + const Rect& rect = get_bar_rect_screen(canvas); + return rect.get_left() <= x && x <= rect.get_right() && rect.get_top() <= y && y <= rect.get_bottom(); +} + +Rect GLCanvas3D::LayersEditing::get_bar_rect_screen(const GLCanvas3D& canvas) +{ + const Size& cnv_size = canvas.get_canvas_size(); + float w = (float)cnv_size.get_width(); + float h = (float)cnv_size.get_height(); + + return { w - thickness_bar_width(canvas), 0.0f, w, h }; +} + +std::pair> GLCanvas3D::LayersEditing::get_layers_height_data() +{ + if (m_slicing_parameters != nullptr) + return { *m_slicing_parameters, m_layer_height_profile }; + + assert(m_model_object != nullptr); + this->update_slicing_parameters(); + PrintObject::update_layer_height_profile(*m_model_object, *m_slicing_parameters, m_layer_height_profile); + std::pair> ret = { *m_slicing_parameters, m_layer_height_profile }; + delete m_slicing_parameters; + m_slicing_parameters = nullptr; + return ret; +} + +bool GLCanvas3D::LayersEditing::is_initialized() const +{ + return wxGetApp().get_shader("variable_layer_height") != nullptr; +} + +std::string GLCanvas3D::LayersEditing::get_tooltip(const GLCanvas3D& canvas) const +{ + std::string ret; + if (m_enabled && m_layer_height_profile.size() >= 4) { + float z = get_cursor_z_relative(canvas); + if (z != -1000.0f) { + z *= m_object_max_z; + + float h = 0.0f; + for (size_t i = m_layer_height_profile.size() - 2; i >= 2; i -= 2) { + const float zi = static_cast(m_layer_height_profile[i]); + const float zi_1 = static_cast(m_layer_height_profile[i - 2]); + if (zi_1 <= z && z <= zi) { + float dz = zi - zi_1; + h = (dz != 0.0f) ? static_cast(lerp(m_layer_height_profile[i - 1], m_layer_height_profile[i + 1], (z - zi_1) / dz)) : + static_cast(m_layer_height_profile[i + 1]); + break; + } + } + if (h > 0.0f) + ret = std::to_string(h); + } + } + return ret; +} + +void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3D& canvas) +{ + const Size cnv_size = canvas.get_canvas_size(); + const float cnv_width = (float)cnv_size.get_width(); + const float cnv_height = (float)cnv_size.get_height(); + if (cnv_width == 0.0f || cnv_height == 0.0f) + return; + + const float cnv_inv_width = 1.0f / cnv_width; + GLShaderProgram* shader = wxGetApp().get_shader("variable_layer_height"); + if (shader == nullptr) + return; + + shader->start_using(); + + shader->set_uniform("z_to_texture_row", float(m_layers_texture.cells - 1) / (float(m_layers_texture.width) * m_object_max_z)); + shader->set_uniform("z_texture_row_to_normalized", 1.0f / (float)m_layers_texture.height); + shader->set_uniform("z_cursor", m_object_max_z * this->get_cursor_z_relative(canvas)); + shader->set_uniform("z_cursor_band_width", band_width); + shader->set_uniform("object_max_z", m_object_max_z); + shader->set_uniform("view_model_matrix", Transform3d::Identity()); + shader->set_uniform("projection_matrix", Transform3d::Identity()); + shader->set_uniform("view_normal_matrix", (Matrix3d)Matrix3d::Identity()); + + glsafe(::glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); + glsafe(::glBindTexture(GL_TEXTURE_2D, m_z_texture_id)); + + // Render the color bar + if (!m_profile.background.is_initialized() || m_profile.old_canvas_width.background != cnv_width) { + m_profile.old_canvas_width.background = cnv_width; + m_profile.background.reset(); + + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3T2 }; + init_data.reserve_vertices(4); + init_data.reserve_indices(6); + + // vertices + const float l = 1.0f - 2.0f * THICKNESS_BAR_WIDTH * cnv_inv_width; + const float r = 1.0f; + const float t = 1.0f; + const float b = -1.0f; + init_data.add_vertex(Vec3f(l, b, 0.0f), Vec3f::UnitZ(), Vec2f(0.0f, 0.0f)); + init_data.add_vertex(Vec3f(r, b, 0.0f), Vec3f::UnitZ(), Vec2f(1.0f, 0.0f)); + init_data.add_vertex(Vec3f(r, t, 0.0f), Vec3f::UnitZ(), Vec2f(1.0f, 1.0f)); + init_data.add_vertex(Vec3f(l, t, 0.0f), Vec3f::UnitZ(), Vec2f(0.0f, 1.0f)); + + // indices + init_data.add_triangle(0, 1, 2); + init_data.add_triangle(2, 3, 0); + + m_profile.background.init_from(std::move(init_data)); + } + + m_profile.background.render(); + + glsafe(::glBindTexture(GL_TEXTURE_2D, 0)); + + shader->stop_using(); +} + +void GLCanvas3D::LayersEditing::render_profile(const GLCanvas3D& canvas) +{ + //FIXME show some kind of legend. + + if (!m_slicing_parameters) + return; + + const Size cnv_size = canvas.get_canvas_size(); + const float cnv_width = (float)cnv_size.get_width(); + const float cnv_height = (float)cnv_size.get_height(); + if (cnv_width == 0.0f || cnv_height == 0.0f) + return; + + // Make the vertical bar a bit wider so the layer height curve does not touch the edge of the bar region. + const float scale_x = THICKNESS_BAR_WIDTH / float(1.12 * m_slicing_parameters->max_layer_height); + const float scale_y = cnv_height / m_object_max_z; + + const float cnv_inv_width = 1.0f / cnv_width; + const float cnv_inv_height = 1.0f / cnv_height; + const float left = 1.0f - 2.0f * THICKNESS_BAR_WIDTH * cnv_inv_width; + + // Baseline + if (!m_profile.baseline.is_initialized() || m_profile.old_layer_height_profile != m_layer_height_profile || m_profile.old_canvas_width.baseline != cnv_width) { + m_profile.old_canvas_width.baseline = cnv_width; + m_profile.baseline.reset(); + + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P2 }; + init_data.color = ColorRGBA::BLACK(); + init_data.reserve_vertices(2); + init_data.reserve_indices(2); + + // vertices + const float axis_x = left + 2.0f * float(m_slicing_parameters->layer_height) * scale_x * cnv_inv_width; + init_data.add_vertex(Vec2f(axis_x, -1.0f)); + init_data.add_vertex(Vec2f(axis_x, 1.0f)); + + // indices + init_data.add_line(0, 1); + + m_profile.baseline.init_from(std::move(init_data)); + } + + if (!m_profile.profile.is_initialized() || m_profile.old_layer_height_profile != m_layer_height_profile || m_profile.old_canvas_width.profile != cnv_width) { + m_profile.old_canvas_width.profile = cnv_width; + m_profile.old_layer_height_profile = m_layer_height_profile; + m_profile.profile.reset(); + + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::LineStrip, GLModel::Geometry::EVertexLayout::P2 }; + init_data.color = ColorRGBA::BLUE(); + init_data.reserve_vertices(m_layer_height_profile.size() / 2); + init_data.reserve_indices(m_layer_height_profile.size() / 2); + + // vertices + indices + for (unsigned int i = 0; i < (unsigned int)m_layer_height_profile.size(); i += 2) { + init_data.add_vertex(Vec2f(left + 2.0f * float(m_layer_height_profile[i + 1]) * scale_x * cnv_inv_width, + 2.0f * (float(m_layer_height_profile[i]) * scale_y * cnv_inv_height - 0.5))); + init_data.add_index(i / 2); + } + + m_profile.profile.init_from(std::move(init_data)); + } + +#if ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else + GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE + if (shader != nullptr) { + shader->start_using(); + shader->set_uniform("view_model_matrix", Transform3d::Identity()); + shader->set_uniform("projection_matrix", Transform3d::Identity()); +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = wxGetApp().plater()->get_camera().get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.25f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE + m_profile.baseline.render(); + m_profile.profile.render(); + shader->stop_using(); + } +} + +void GLCanvas3D::LayersEditing::render_volumes(const GLCanvas3D& canvas, const GLVolumeCollection& volumes) +{ + assert(this->is_allowed()); + assert(this->last_object_id != -1); + + GLShaderProgram* current_shader = wxGetApp().get_current_shader(); + ScopeGuard guard([current_shader]() { if (current_shader != nullptr) current_shader->start_using(); }); + if (current_shader != nullptr) + current_shader->stop_using(); + + GLShaderProgram* shader = wxGetApp().get_shader("variable_layer_height"); + if (shader == nullptr) + return; + + shader->start_using(); + + generate_layer_height_texture(); + + // Uniforms were resolved, go ahead using the layer editing shader. + shader->set_uniform("z_to_texture_row", float(m_layers_texture.cells - 1) / (float(m_layers_texture.width) * float(m_object_max_z))); + shader->set_uniform("z_texture_row_to_normalized", 1.0f / float(m_layers_texture.height)); + shader->set_uniform("z_cursor", float(m_object_max_z) * float(this->get_cursor_z_relative(canvas))); + shader->set_uniform("z_cursor_band_width", float(this->band_width)); + + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + + // Initialize the layer height texture mapping. + const GLsizei w = (GLsizei)m_layers_texture.width; + const GLsizei h = (GLsizei)m_layers_texture.height; + const GLsizei half_w = w / 2; + const GLsizei half_h = h / 2; + glsafe(::glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); + glsafe(::glBindTexture(GL_TEXTURE_2D, m_z_texture_id)); + glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0)); + glsafe(::glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, half_w, half_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0)); + glsafe(::glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, m_layers_texture.data.data())); + glsafe(::glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, half_w, half_h, GL_RGBA, GL_UNSIGNED_BYTE, m_layers_texture.data.data() + m_layers_texture.width * m_layers_texture.height * 4)); + for (GLVolume* glvolume : volumes.volumes) { + // Render the object using the layer editing shader and texture. + if (!glvolume->is_active || glvolume->composite_id.object_id != this->last_object_id || glvolume->is_modifier) + continue; + + shader->set_uniform("volume_world_matrix", glvolume->world_matrix()); + shader->set_uniform("object_max_z", 0.0f); + const Transform3d& view_matrix = camera.get_view_matrix(); + const Transform3d model_matrix = glvolume->world_matrix(); + shader->set_uniform("view_model_matrix", view_matrix * model_matrix); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); + + glvolume->render(); + } + // Revert back to the previous shader. + glsafe(::glBindTexture(GL_TEXTURE_2D, 0)); +} + +void GLCanvas3D::LayersEditing::adjust_layer_height_profile() +{ + this->update_slicing_parameters(); + PrintObject::update_layer_height_profile(*m_model_object, *m_slicing_parameters, m_layer_height_profile); + Slic3r::adjust_layer_height_profile(*m_slicing_parameters, m_layer_height_profile, this->last_z, this->strength, this->band_width, this->last_action); + m_layer_height_profile_modified = true; + m_layers_texture.valid = false; +} + +void GLCanvas3D::LayersEditing::reset_layer_height_profile(GLCanvas3D& canvas) +{ + const_cast(m_model_object)->layer_height_profile.clear(); + m_layer_height_profile.clear(); + m_layers_texture.valid = false; + canvas.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); + wxGetApp().obj_list()->update_info_items(last_object_id); +} + +void GLCanvas3D::LayersEditing::adaptive_layer_height_profile(GLCanvas3D& canvas, float quality_factor) +{ + this->update_slicing_parameters(); + m_layer_height_profile = layer_height_profile_adaptive(*m_slicing_parameters, *m_model_object, quality_factor); + const_cast(m_model_object)->layer_height_profile.set(m_layer_height_profile); + m_layers_texture.valid = false; + canvas.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); + wxGetApp().obj_list()->update_info_items(last_object_id); +} + +void GLCanvas3D::LayersEditing::smooth_layer_height_profile(GLCanvas3D& canvas, const HeightProfileSmoothingParams& smoothing_params) +{ + this->update_slicing_parameters(); + m_layer_height_profile = smooth_height_profile(m_layer_height_profile, *m_slicing_parameters, smoothing_params); + const_cast(m_model_object)->layer_height_profile.set(m_layer_height_profile); + m_layers_texture.valid = false; + canvas.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); + wxGetApp().obj_list()->update_info_items(last_object_id); +} + +void GLCanvas3D::LayersEditing::generate_layer_height_texture() +{ + this->update_slicing_parameters(); + // Always try to update the layer height profile. + bool update = ! m_layers_texture.valid; + if (PrintObject::update_layer_height_profile(*m_model_object, *m_slicing_parameters, m_layer_height_profile)) { + // Initialized to the default value. + m_layer_height_profile_modified = false; + update = true; + } + // Update if the layer height profile was changed, or when the texture is not valid. + if (! update && ! m_layers_texture.data.empty() && m_layers_texture.cells > 0) + // Texture is valid, don't update. + return; + + if (m_layers_texture.data.empty()) { + m_layers_texture.width = 1024; + m_layers_texture.height = 1024; + m_layers_texture.levels = 2; + m_layers_texture.data.assign(m_layers_texture.width * m_layers_texture.height * 5, 0); + } + + bool level_of_detail_2nd_level = true; + m_layers_texture.cells = Slic3r::generate_layer_height_texture( + *m_slicing_parameters, + Slic3r::generate_object_layers(*m_slicing_parameters, m_layer_height_profile), + m_layers_texture.data.data(), m_layers_texture.height, m_layers_texture.width, level_of_detail_2nd_level); + m_layers_texture.valid = true; +} + +void GLCanvas3D::LayersEditing::accept_changes(GLCanvas3D& canvas) +{ + if (last_object_id >= 0) { + if (m_layer_height_profile_modified) { + wxGetApp().plater()->take_snapshot(_L("Variable layer height - Manual edit")); + const_cast(m_model_object)->layer_height_profile.set(m_layer_height_profile); + canvas.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); + wxGetApp().obj_list()->update_info_items(last_object_id); + } + } + m_layer_height_profile_modified = false; +} + +void GLCanvas3D::LayersEditing::update_slicing_parameters() +{ + if (m_slicing_parameters == nullptr) { + m_slicing_parameters = new SlicingParameters(); + *m_slicing_parameters = PrintObject::slicing_parameters(*m_config, *m_model_object, m_object_max_z); + } +} + +float GLCanvas3D::LayersEditing::thickness_bar_width(const GLCanvas3D &canvas) +{ + return +#if ENABLE_RETINA_GL + canvas.get_canvas_size().get_scale_factor() +#else + canvas.get_wxglcanvas()->GetContentScaleFactor() +#endif + * THICKNESS_BAR_WIDTH; +} + + +const Point GLCanvas3D::Mouse::Drag::Invalid_2D_Point(INT_MAX, INT_MAX); +const Vec3d GLCanvas3D::Mouse::Drag::Invalid_3D_Point(DBL_MAX, DBL_MAX, DBL_MAX); +const int GLCanvas3D::Mouse::Drag::MoveThresholdPx = 5; + +GLCanvas3D::Mouse::Drag::Drag() + : start_position_2D(Invalid_2D_Point) + , start_position_3D(Invalid_3D_Point) + , move_volume_idx(-1) + , move_requires_threshold(false) + , move_start_threshold_position_2D(Invalid_2D_Point) +{ +} + +GLCanvas3D::Mouse::Mouse() + : dragging(false) + , position(DBL_MAX, DBL_MAX) + , scene_position(DBL_MAX, DBL_MAX, DBL_MAX) + , ignore_left_up(false) +{ +} + +void GLCanvas3D::Labels::render(const std::vector& sorted_instances) const +{ + if (!m_enabled || !is_shown()) + return; + + const Camera& camera = wxGetApp().plater()->get_camera(); + const Model* model = m_canvas.get_model(); + if (model == nullptr) + return; + + Transform3d world_to_eye = camera.get_view_matrix(); + Transform3d world_to_screen = camera.get_projection_matrix() * world_to_eye; + const std::array& viewport = camera.get_viewport(); + + struct Owner + { + int obj_idx; + int inst_idx; + size_t model_instance_id; + BoundingBoxf3 world_box; + double eye_center_z; + std::string title; + std::string label; + std::string print_order; + bool selected; + }; + + // collect owners world bounding boxes and data from volumes + std::vector owners; + const GLVolumeCollection& volumes = m_canvas.get_volumes(); + for (const GLVolume* volume : volumes.volumes) { + int obj_idx = volume->object_idx(); + if (0 <= obj_idx && obj_idx < (int)model->objects.size()) { + int inst_idx = volume->instance_idx(); + std::vector::iterator it = std::find_if(owners.begin(), owners.end(), [obj_idx, inst_idx](const Owner& owner) { + return (owner.obj_idx == obj_idx) && (owner.inst_idx == inst_idx); + }); + if (it != owners.end()) { + it->world_box.merge(volume->transformed_bounding_box()); + it->selected &= volume->selected; + } else { + const ModelObject* model_object = model->objects[obj_idx]; + Owner owner; + owner.obj_idx = obj_idx; + owner.inst_idx = inst_idx; + owner.model_instance_id = model_object->instances[inst_idx]->id().id; + owner.world_box = volume->transformed_bounding_box(); + owner.title = "object" + std::to_string(obj_idx) + "_inst##" + std::to_string(inst_idx); + owner.label = model_object->name; + if (model_object->instances.size() > 1) + owner.label += " (" + std::to_string(inst_idx + 1) + ")"; + owner.selected = volume->selected; + owners.emplace_back(owner); + } + } + } + + // updates print order strings + if (sorted_instances.size() > 1) { + for (size_t i = 0; i < sorted_instances.size(); ++i) { + size_t id = sorted_instances[i]->id().id; + std::vector::iterator it = std::find_if(owners.begin(), owners.end(), [id](const Owner& owner) { + return owner.model_instance_id == id; + }); + if (it != owners.end()) + it->print_order = _u8L("Seq.") + "#: " + std::to_string(i + 1); + } + } + + // calculate eye bounding boxes center zs + for (Owner& owner : owners) { + owner.eye_center_z = (world_to_eye * owner.world_box.center())(2); + } + + // sort owners by center eye zs and selection + std::sort(owners.begin(), owners.end(), [](const Owner& owner1, const Owner& owner2) { + if (!owner1.selected && owner2.selected) + return true; + else if (owner1.selected && !owner2.selected) + return false; + else + return (owner1.eye_center_z < owner2.eye_center_z); + }); + + ImGuiWrapper& imgui = *wxGetApp().imgui(); + + // render info windows + for (const Owner& owner : owners) { + Vec3d screen_box_center = world_to_screen * owner.world_box.center(); + float x = 0.0f; + float y = 0.0f; + if (camera.get_type() == Camera::EType::Perspective) { + x = (0.5f + 0.001f * 0.5f * (float)screen_box_center(0)) * viewport[2]; + y = (0.5f - 0.001f * 0.5f * (float)screen_box_center(1)) * viewport[3]; + } else { + x = (0.5f + 0.5f * (float)screen_box_center(0)) * viewport[2]; + y = (0.5f - 0.5f * (float)screen_box_center(1)) * viewport[3]; + } + + if (x < 0.0f || viewport[2] < x || y < 0.0f || viewport[3] < y) + continue; + + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, owner.selected ? 3.0f : 1.5f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + ImGui::PushStyleColor(ImGuiCol_Border, owner.selected ? ImVec4(0.757f, 0.404f, 0.216f, 1.0f) : ImVec4(0.75f, 0.75f, 0.75f, 1.0f)); + imgui.set_next_window_pos(x, y, ImGuiCond_Always, 0.5f, 0.5f); + imgui.begin(owner.title, ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove); + ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow()); + float win_w = ImGui::GetWindowWidth(); + float label_len = ImGui::CalcTextSize(owner.label.c_str()).x; + ImGui::SetCursorPosX(0.5f * (win_w - label_len)); + ImGui::AlignTextToFramePadding(); + imgui.text(owner.label); + + if (!owner.print_order.empty()) { + ImGui::Separator(); + float po_len = ImGui::CalcTextSize(owner.print_order.c_str()).x; + ImGui::SetCursorPosX(0.5f * (win_w - po_len)); + ImGui::AlignTextToFramePadding(); + imgui.text(owner.print_order); + } + + // force re-render while the windows gets to its final size (it takes several frames) + if (ImGui::GetWindowContentRegionWidth() + 2.0f * ImGui::GetStyle().WindowPadding.x != ImGui::CalcWindowNextAutoFitSize(ImGui::GetCurrentWindow()).x) + imgui.set_requires_extra_frame(); + + imgui.end(); + ImGui::PopStyleColor(); + ImGui::PopStyleVar(2); + } +} + +static float get_cursor_height() +{ + float ret = 16.0f; +#ifdef _WIN32 + // see: https://forums.codeguru.com/showthread.php?449040-get-the-system-current-cursor-size + // this code is not perfect because it returns a maximum height equal to 31 even if the cursor bitmap shown on screen is bigger + // but at least it gives the same result as wxWidgets in the settings tabs + ICONINFO ii; + if (::GetIconInfo((HICON)GetCursor(), &ii) != 0) { + BITMAP bitmap; + ::GetObject(ii.hbmMask, sizeof(BITMAP), &bitmap); + const int width = bitmap.bmWidth; + const int height = (ii.hbmColor == nullptr) ? bitmap.bmHeight / 2 : bitmap.bmHeight; + HDC dc = ::CreateCompatibleDC(nullptr); + if (dc != nullptr) { + if (::SelectObject(dc, ii.hbmMask) != nullptr) { + for (int i = 0; i < width; ++i) { + for (int j = 0; j < height; ++j) { + if (::GetPixel(dc, i, j) != RGB(255, 255, 255)) { + if (ret < float(j)) + ret = float(j); + } + } + } + ::DeleteDC(dc); + } + } + ::DeleteObject(ii.hbmColor); + ::DeleteObject(ii.hbmMask); + } +#endif // _WIN32 + return ret; +} + +void GLCanvas3D::Tooltip::set_text(const std::string& text) +{ + // If the mouse is inside an ImGUI dialog, then the tooltip is suppressed. + const std::string& new_text = m_in_imgui ? std::string() : text; + if (m_text != new_text) { // To avoid calling the expensive call to get_cursor_height. + m_text = new_text; + m_cursor_height = get_cursor_height(); + } +} + +void GLCanvas3D::Tooltip::render(const Vec2d& mouse_position, GLCanvas3D& canvas) +{ + static ImVec2 size(0.0f, 0.0f); + + auto validate_position = [this](const Vec2d& position, const GLCanvas3D& canvas, const ImVec2& wnd_size) { + const Size cnv_size = canvas.get_canvas_size(); + const float x = std::clamp(float(position.x()), 0.0f, float(cnv_size.get_width()) - wnd_size.x); + const float y = std::clamp(float(position.y()) + m_cursor_height, 0.0f, float(cnv_size.get_height()) - wnd_size.y); + return Vec2f(x, y); + }; + + if (m_text.empty()) { + m_start_time = std::chrono::steady_clock::now(); + return; + } + + // draw the tooltip as hidden until the delay is expired + // use a value of alpha slightly different from 0.0f because newer imgui does not calculate properly the window size if alpha == 0.0f + const float alpha = (std::chrono::duration_cast(std::chrono::steady_clock::now() - m_start_time).count() < 500) ? 0.01f : 1.0f; + + const Vec2f position = validate_position(mouse_position, canvas, size); + + ImGuiWrapper& imgui = *wxGetApp().imgui(); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_Alpha, alpha); + imgui.set_next_window_pos(position.x(), position.y(), ImGuiCond_Always, 0.0f, 0.0f); + + imgui.begin(wxString("canvas_tooltip"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoFocusOnAppearing); + ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow()); + ImGui::TextUnformatted(m_text.c_str()); + + // force re-render while the windows gets to its final size (it may take several frames) or while hidden + if (alpha < 1.0f || ImGui::GetWindowContentRegionWidth() + 2.0f * ImGui::GetStyle().WindowPadding.x != ImGui::CalcWindowNextAutoFitSize(ImGui::GetCurrentWindow()).x) + imgui.set_requires_extra_frame(); + + size = ImGui::GetWindowSize(); + + imgui.end(); + ImGui::PopStyleVar(2); +} + +void GLCanvas3D::SequentialPrintClearance::set_polygons(const Polygons& polygons) +{ + m_perimeter.reset(); + m_fill.reset(); + if (polygons.empty()) + return; + + if (m_render_fill) { + GLModel::Geometry fill_data; + fill_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3 }; + fill_data.color = { 0.3333f, 0.0f, 0.0f, 0.5f }; + + // vertices + indices + const ExPolygons polygons_union = union_ex(polygons); + unsigned int vertices_counter = 0; + for (const ExPolygon& poly : polygons_union) { + const std::vector triangulation = triangulate_expolygon_3d(poly); + fill_data.reserve_vertices(fill_data.vertices_count() + triangulation.size()); + fill_data.reserve_indices(fill_data.indices_count() + triangulation.size()); + for (const Vec3d& v : triangulation) { + fill_data.add_vertex((Vec3f)(v.cast() + 0.0125f * Vec3f::UnitZ())); // add a small positive z to avoid z-fighting + ++vertices_counter; + if (vertices_counter % 3 == 0) + fill_data.add_triangle(vertices_counter - 3, vertices_counter - 2, vertices_counter - 1); + } + } + + m_fill.init_from(std::move(fill_data)); + } + + m_perimeter.init_from(polygons, 0.025f); // add a small positive z to avoid z-fighting +} + +void GLCanvas3D::SequentialPrintClearance::render() +{ + const ColorRGBA FILL_COLOR = { 1.0f, 0.0f, 0.0f, 0.5f }; + const ColorRGBA NO_FILL_COLOR = { 1.0f, 1.0f, 1.0f, 0.75f }; + + GLShaderProgram* shader = wxGetApp().get_shader("flat"); + if (shader == nullptr) + return; + + shader->start_using(); + + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + + glsafe(::glEnable(GL_DEPTH_TEST)); + glsafe(::glDisable(GL_CULL_FACE)); + glsafe(::glEnable(GL_BLEND)); + glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); + + m_perimeter.set_color(m_render_fill ? FILL_COLOR : NO_FILL_COLOR); + m_perimeter.render(); + m_fill.render(); + + glsafe(::glDisable(GL_BLEND)); + glsafe(::glEnable(GL_CULL_FACE)); + glsafe(::glDisable(GL_DEPTH_TEST)); + + shader->stop_using(); +} + +wxDEFINE_EVENT(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_OBJECT_SELECT, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_RIGHT_CLICK, RBtnEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_REMOVE_OBJECT, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_ARRANGE, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_SELECT_ALL, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_QUESTION_MARK, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_INCREASE_INSTANCES, Event); +wxDEFINE_EVENT(EVT_GLCANVAS_INSTANCE_MOVED, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_INSTANCE_ROTATED, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_RESET_SKEW, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_INSTANCE_SCALED, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_FORCE_UPDATE, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_WIPETOWER_MOVED, Vec3dEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_WIPETOWER_ROTATED, Vec3dEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, Event); +wxDEFINE_EVENT(EVT_GLCANVAS_UPDATE_GEOMETRY, Vec3dsEvent<2>); +wxDEFINE_EVENT(EVT_GLCANVAS_MOUSE_DRAGGING_STARTED, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_UPDATE_BED_SHAPE, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_TAB, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_RESETGIZMOS, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_MOVE_SLIDERS, wxKeyEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_EDIT_COLOR_CHANGE, wxKeyEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_JUMP_TO, wxKeyEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_UNDO, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_REDO, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_COLLAPSE_SIDEBAR, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_RESET_LAYER_HEIGHT_PROFILE, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_ADAPTIVE_LAYER_HEIGHT_PROFILE, Event); +wxDEFINE_EVENT(EVT_GLCANVAS_SMOOTH_LAYER_HEIGHT_PROFILE, HeightProfileSmoothEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_RELOAD_FROM_DISK, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_RENDER_TIMER, wxTimerEvent/*RenderTimerEvent*/); +wxDEFINE_EVENT(EVT_GLCANVAS_TOOLBAR_HIGHLIGHTER_TIMER, wxTimerEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_GIZMO_HIGHLIGHTER_TIMER, wxTimerEvent); + +const double GLCanvas3D::DefaultCameraZoomToBoxMarginFactor = 1.25; + +void GLCanvas3D::load_arrange_settings() +{ + std::string dist_fff_str = + wxGetApp().app_config->get("arrange", "min_object_distance_fff"); + + std::string dist_bed_fff_str = + wxGetApp().app_config->get("arrange", "min_bed_distance_fff"); + + std::string dist_fff_seq_print_str = + wxGetApp().app_config->get("arrange", "min_object_distance_fff_seq_print"); + + std::string dist_bed_fff_seq_print_str = + wxGetApp().app_config->get("arrange", "min_bed_distance_fff_seq_print"); + + std::string dist_sla_str = + wxGetApp().app_config->get("arrange", "min_object_distance_sla"); + + std::string dist_bed_sla_str = + wxGetApp().app_config->get("arrange", "min_bed_distance_sla"); + + std::string en_rot_fff_str = + wxGetApp().app_config->get("arrange", "enable_rotation_fff"); + + std::string en_rot_fff_seqp_str = + wxGetApp().app_config->get("arrange", "enable_rotation_fff_seq_print"); + + std::string en_rot_sla_str = + wxGetApp().app_config->get("arrange", "enable_rotation_sla"); + +// std::string alignment_fff_str = +// wxGetApp().app_config->get("arrange", "alignment_fff"); + +// std::string alignment_fff_seqp_str = +// wxGetApp().app_config->get("arrange", "alignment_fff_seq_pring"); + +// std::string alignment_sla_str = +// wxGetApp().app_config->get("arrange", "alignment_sla"); + + // Override default alignment and save save/load it to a temporary slot "alignment_xl" + std::string alignment_xl_str = + wxGetApp().app_config->get("arrange", "alignment_xl"); + + if (!dist_fff_str.empty()) + m_arrange_settings_fff.distance = string_to_float_decimal_point(dist_fff_str); + + if (!dist_bed_fff_str.empty()) + m_arrange_settings_fff.distance_from_bed = string_to_float_decimal_point(dist_bed_fff_str); + + if (!dist_fff_seq_print_str.empty()) + m_arrange_settings_fff_seq_print.distance = string_to_float_decimal_point(dist_fff_seq_print_str); + + if (!dist_bed_fff_seq_print_str.empty()) + m_arrange_settings_fff_seq_print.distance_from_bed = string_to_float_decimal_point(dist_bed_fff_seq_print_str); + + if (!dist_sla_str.empty()) + m_arrange_settings_sla.distance = string_to_float_decimal_point(dist_sla_str); + + if (!dist_bed_sla_str.empty()) + m_arrange_settings_sla.distance_from_bed = string_to_float_decimal_point(dist_bed_sla_str); + + if (!en_rot_fff_str.empty()) + m_arrange_settings_fff.enable_rotation = (en_rot_fff_str == "1" || en_rot_fff_str == "yes"); + + if (!en_rot_fff_seqp_str.empty()) + m_arrange_settings_fff_seq_print.enable_rotation = (en_rot_fff_seqp_str == "1" || en_rot_fff_seqp_str == "yes"); + + if (!en_rot_sla_str.empty()) + m_arrange_settings_sla.enable_rotation = (en_rot_sla_str == "1" || en_rot_sla_str == "yes"); + +// if (!alignment_sla_str.empty()) +// m_arrange_settings_sla.alignment = std::stoi(alignment_sla_str); + +// if (!alignment_fff_str.empty()) +// m_arrange_settings_fff.alignment = std::stoi(alignment_fff_str); + +// if (!alignment_fff_seqp_str.empty()) +// m_arrange_settings_fff_seq_print.alignment = std::stoi(alignment_fff_seqp_str); + + // Override default alignment and save save/load it to a temporary slot "alignment_xl" + int arr_alignment = static_cast(arrangement::Pivots::BottomLeft); + if (!alignment_xl_str.empty()) + arr_alignment = std::stoi(alignment_xl_str); + + m_arrange_settings_sla.alignment = arr_alignment ; + m_arrange_settings_fff.alignment = arr_alignment ; + m_arrange_settings_fff_seq_print.alignment = arr_alignment ; +} + +PrinterTechnology GLCanvas3D::current_printer_technology() const +{ + return m_process->current_printer_technology(); +} + +bool GLCanvas3D::is_arrange_alignment_enabled() const +{ + return m_config ? is_XL_printer(*m_config) : false; +} + +GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D &bed) + : m_canvas(canvas) + , m_context(nullptr) + , m_bed(bed) +#if ENABLE_RETINA_GL + , m_retina_helper(nullptr) +#endif + , m_in_render(false) + , m_main_toolbar(GLToolbar::Normal, "Main") + , m_undoredo_toolbar(GLToolbar::Normal, "Undo_Redo") + , m_gizmos(*this) + , m_use_clipping_planes(false) + , m_sidebar_field("") + , m_extra_frame_requested(false) + , m_config(nullptr) + , m_process(nullptr) + , m_model(nullptr) + , m_dirty(true) + , m_initialized(false) + , m_apply_zoom_to_volumes_filter(false) + , m_picking_enabled(false) + , m_moving_enabled(false) + , m_dynamic_background_enabled(false) + , m_multisample_allowed(false) + , m_moving(false) + , m_tab_down(false) + , m_cursor_type(Standard) + , m_reload_delayed(false) + , m_render_sla_auxiliaries(true) + , m_labels(*this) + , m_slope(m_volumes) +{ + if (m_canvas != nullptr) { + m_timer.SetOwner(m_canvas); + m_render_timer.SetOwner(m_canvas); +#if ENABLE_RETINA_GL + m_retina_helper.reset(new RetinaHelper(canvas)); +#endif // ENABLE_RETINA_GL + } + + load_arrange_settings(); + + m_selection.set_volumes(&m_volumes.volumes); +} + +GLCanvas3D::~GLCanvas3D() +{ + reset_volumes(); +} + +void GLCanvas3D::post_event(wxEvent &&event) +{ + event.SetEventObject(m_canvas); + wxPostEvent(m_canvas, event); +} + +bool GLCanvas3D::init() +{ + if (m_initialized) + return true; + + if (m_canvas == nullptr || m_context == nullptr) + return false; + + glsafe(::glClearColor(1.0f, 1.0f, 1.0f, 1.0f)); +#if ENABLE_OPENGL_ES + glsafe(::glClearDepthf(1.0f)); +#else + glsafe(::glClearDepth(1.0f)); +#endif // ENABLE_OPENGL_ES + + glsafe(::glDepthFunc(GL_LESS)); + + glsafe(::glEnable(GL_DEPTH_TEST)); + glsafe(::glEnable(GL_CULL_FACE)); + glsafe(::glEnable(GL_BLEND)); + glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); + + if (m_multisample_allowed) + glsafe(::glEnable(GL_MULTISAMPLE)); + + if (m_main_toolbar.is_enabled()) + m_layers_editing.init(); + + if (m_gizmos.is_enabled() && !m_gizmos.init()) + std::cout << "Unable to initialize gizmos: please, check that all the required textures are available" << std::endl; + + if (!_init_toolbars()) + return false; + + if (m_selection.is_enabled() && !m_selection.init()) + return false; + + m_initialized = true; + + return true; +} + +void GLCanvas3D::set_as_dirty() +{ + m_dirty = true; +} + +unsigned int GLCanvas3D::get_volumes_count() const +{ + return (unsigned int)m_volumes.volumes.size(); +} + +void GLCanvas3D::reset_volumes() +{ + if (!m_initialized) + return; + + if (m_volumes.empty()) + return; + + _set_current(); + + m_selection.clear(); + m_volumes.clear(); + m_dirty = true; + + _set_warning_notification(EWarning::ObjectOutside, false); +} + +ModelInstanceEPrintVolumeState GLCanvas3D::check_volumes_outside_state() const +{ + ModelInstanceEPrintVolumeState state = ModelInstanceEPrintVolumeState::ModelInstancePVS_Inside; + if (m_initialized) + m_volumes.check_outside_state(m_bed.build_volume(), &state); + return state; +} + +void GLCanvas3D::toggle_sla_auxiliaries_visibility(bool visible, const ModelObject* mo, int instance_idx) +{ + if (current_printer_technology() != ptSLA) + return; + + m_render_sla_auxiliaries = visible; + + std::vector>* raycasters = get_raycasters_for_picking(SceneRaycaster::EType::Volume); + + for (GLVolume* vol : m_volumes.volumes) { + if ((mo == nullptr || m_model->objects[vol->composite_id.object_id] == mo) + && (instance_idx == -1 || vol->composite_id.instance_id == instance_idx) + && vol->composite_id.volume_id < 0) { + vol->is_active = visible; + auto it = std::find_if(raycasters->begin(), raycasters->end(), [vol](std::shared_ptr item) { return item->get_raycaster() == vol->mesh_raycaster.get(); }); + if (it != raycasters->end()) + (*it)->set_active(vol->is_active); + } + } +} + +void GLCanvas3D::toggle_model_objects_visibility(bool visible, const ModelObject* mo, int instance_idx, const ModelVolume* mv) +{ + std::vector>* raycasters = get_raycasters_for_picking(SceneRaycaster::EType::Volume); + for (GLVolume* vol : m_volumes.volumes) { + if (vol->is_wipe_tower) + vol->is_active = (visible && mo == nullptr); + else { + if ((mo == nullptr || m_model->objects[vol->composite_id.object_id] == mo) + && (instance_idx == -1 || vol->composite_id.instance_id == instance_idx) + && (mv == nullptr || m_model->objects[vol->composite_id.object_id]->volumes[vol->composite_id.volume_id] == mv)) { + vol->is_active = visible; + if (!vol->is_modifier) + vol->color.a(1.f); + + if (instance_idx == -1) { + vol->force_native_color = false; + vol->force_neutral_color = false; + } else { + const GLGizmosManager& gm = get_gizmos_manager(); + auto gizmo_type = gm.get_current_type(); + if ( (gizmo_type == GLGizmosManager::FdmSupports + || gizmo_type == GLGizmosManager::Seam + || gizmo_type == GLGizmosManager::Cut) + && !vol->is_modifier) { + vol->force_neutral_color = true; + } + else if (gizmo_type == GLGizmosManager::MmuSegmentation) + vol->is_active = false; + else + vol->force_native_color = true; + } + } + } + + auto it = std::find_if(raycasters->begin(), raycasters->end(), [vol](std::shared_ptr item) { return item->get_raycaster() == vol->mesh_raycaster.get(); }); + if (it != raycasters->end()) + (*it)->set_active(vol->is_active); + } + + if (visible && !mo) + toggle_sla_auxiliaries_visibility(true, mo, instance_idx); + + if (!mo && !visible && !m_model->objects.empty() && (m_model->objects.size() > 1 || m_model->objects.front()->instances.size() > 1)) + _set_warning_notification(EWarning::SomethingNotShown, true); + + if (!mo && visible) + _set_warning_notification(EWarning::SomethingNotShown, false); +} + +void GLCanvas3D::update_instance_printable_state_for_object(const size_t obj_idx) +{ + ModelObject* model_object = m_model->objects[obj_idx]; + for (int inst_idx = 0; inst_idx < (int)model_object->instances.size(); ++inst_idx) { + ModelInstance* instance = model_object->instances[inst_idx]; + + for (GLVolume* volume : m_volumes.volumes) { + if (volume->object_idx() == (int)obj_idx && volume->instance_idx() == inst_idx) + volume->printable = instance->printable; + } + } +} + +void GLCanvas3D::update_instance_printable_state_for_objects(const std::vector& object_idxs) +{ + for (size_t obj_idx : object_idxs) + update_instance_printable_state_for_object(obj_idx); +} + +void GLCanvas3D::set_config(const DynamicPrintConfig* config) +{ + m_config = config; + m_layers_editing.set_config(config); +} + +void GLCanvas3D::set_process(BackgroundSlicingProcess *process) +{ + m_process = process; +} + +void GLCanvas3D::set_model(Model* model) +{ + m_model = model; + m_selection.set_model(m_model); +} + +void GLCanvas3D::bed_shape_changed() +{ + refresh_camera_scene_box(); + wxGetApp().plater()->get_camera().requires_zoom_to_bed = true; + m_dirty = true; +} + +void GLCanvas3D::refresh_camera_scene_box() +{ + wxGetApp().plater()->get_camera().set_scene_box(scene_bounding_box()); +} + +BoundingBoxf3 GLCanvas3D::volumes_bounding_box() const +{ + BoundingBoxf3 bb; + for (const GLVolume* volume : m_volumes.volumes) { + if (!m_apply_zoom_to_volumes_filter || ((volume != nullptr) && volume->zoom_to_volumes)) + bb.merge(volume->transformed_bounding_box()); + } + return bb; +} + +BoundingBoxf3 GLCanvas3D::scene_bounding_box() const +{ + BoundingBoxf3 bb = volumes_bounding_box(); + bb.merge(m_bed.extended_bounding_box()); + double h = m_bed.build_volume().max_print_height(); + //FIXME why -h? + bb.min.z() = std::min(bb.min.z(), -h); + bb.max.z() = std::max(bb.max.z(), h); + return bb; +} + +bool GLCanvas3D::is_layers_editing_enabled() const +{ + return m_layers_editing.is_enabled(); +} + +bool GLCanvas3D::is_layers_editing_allowed() const +{ + return m_layers_editing.is_allowed(); +} + +void GLCanvas3D::reset_layer_height_profile() +{ + wxGetApp().plater()->take_snapshot(_L("Variable layer height - Reset")); + m_layers_editing.reset_layer_height_profile(*this); + m_layers_editing.state = LayersEditing::Completed; + m_dirty = true; +} + +void GLCanvas3D::adaptive_layer_height_profile(float quality_factor) +{ + wxGetApp().plater()->take_snapshot(_L("Variable layer height - Adaptive")); + m_layers_editing.adaptive_layer_height_profile(*this, quality_factor); + m_layers_editing.state = LayersEditing::Completed; + m_dirty = true; +} + +void GLCanvas3D::smooth_layer_height_profile(const HeightProfileSmoothingParams& smoothing_params) +{ + wxGetApp().plater()->take_snapshot(_L("Variable layer height - Smooth all")); + m_layers_editing.smooth_layer_height_profile(*this, smoothing_params); + m_layers_editing.state = LayersEditing::Completed; + m_dirty = true; +} + +bool GLCanvas3D::is_reload_delayed() const +{ + return m_reload_delayed; +} + +void GLCanvas3D::enable_layers_editing(bool enable) +{ + m_layers_editing.set_enabled(enable); + set_as_dirty(); +} + +void GLCanvas3D::enable_legend_texture(bool enable) +{ + m_gcode_viewer.enable_legend(enable); +} + +void GLCanvas3D::enable_picking(bool enable) +{ + m_picking_enabled = enable; +} + +void GLCanvas3D::enable_moving(bool enable) +{ + m_moving_enabled = enable; +} + +void GLCanvas3D::enable_gizmos(bool enable) +{ + m_gizmos.set_enabled(enable); +} + +void GLCanvas3D::enable_selection(bool enable) +{ + m_selection.set_enabled(enable); +} + +void GLCanvas3D::enable_main_toolbar(bool enable) +{ + m_main_toolbar.set_enabled(enable); +} + +void GLCanvas3D::enable_undoredo_toolbar(bool enable) +{ + m_undoredo_toolbar.set_enabled(enable); +} + +void GLCanvas3D::enable_dynamic_background(bool enable) +{ + m_dynamic_background_enabled = enable; +} + +void GLCanvas3D::allow_multisample(bool allow) +{ + m_multisample_allowed = allow; +} + +void GLCanvas3D::zoom_to_bed() +{ + BoundingBoxf3 box = m_bed.build_volume().bounding_volume(); + box.min.z() = 0.0; + box.max.z() = 0.0; + _zoom_to_box(box); +} + +void GLCanvas3D::zoom_to_volumes() +{ + m_apply_zoom_to_volumes_filter = true; + _zoom_to_box(volumes_bounding_box()); + m_apply_zoom_to_volumes_filter = false; +} + +void GLCanvas3D::zoom_to_selection() +{ + if (!m_selection.is_empty()) + _zoom_to_box(m_selection.get_bounding_box()); +} + +void GLCanvas3D::zoom_to_gcode() +{ + _zoom_to_box(m_gcode_viewer.get_paths_bounding_box(), 1.05); +} + +void GLCanvas3D::select_view(const std::string& direction) +{ + wxGetApp().plater()->get_camera().select_view(direction); + if (m_canvas != nullptr) + m_canvas->Refresh(); +} + +void GLCanvas3D::update_volumes_colors_by_extruder() +{ + if (m_config != nullptr) + m_volumes.update_colors_by_extruder(m_config); +} + +void GLCanvas3D::render() +{ + if (m_in_render) { + // if called recursively, return + m_dirty = true; + return; + } + + m_in_render = true; + Slic3r::ScopeGuard in_render_guard([this]() { m_in_render = false; }); + (void)in_render_guard; + + if (m_canvas == nullptr) + return; + + // ensures this canvas is current and initialized + if (!_is_shown_on_screen() || !_set_current() || !wxGetApp().init_opengl()) + return; + + if (!is_initialized() && !init()) + return; + + if (!m_main_toolbar.is_enabled()) + m_gcode_viewer.init(); + + if (! m_bed.build_volume().valid()) { + // this happens at startup when no data is still saved under <>\AppData\Roaming\Slic3rPE + post_event(SimpleEvent(EVT_GLCANVAS_UPDATE_BED_SHAPE)); + return; + } + +#if ENABLE_ENVIRONMENT_MAP + if (wxGetApp().is_editor()) + wxGetApp().plater()->init_environment_texture(); +#endif // ENABLE_ENVIRONMENT_MAP + +#if ENABLE_GLMODEL_STATISTICS + GLModel::reset_statistics_counters(); +#endif // ENABLE_GLMODEL_STATISTICS + + const Size& cnv_size = get_canvas_size(); + // Probably due to different order of events on Linux/GTK2, when one switched from 3D scene + // to preview, this was called before canvas had its final size. It reported zero width + // and the viewport was set incorrectly, leading to tripping glAsserts further down + // the road (in apply_projection). That's why the minimum size is forced to 10. + Camera& camera = wxGetApp().plater()->get_camera(); + camera.set_viewport(0, 0, std::max(10u, (unsigned int)cnv_size.get_width()), std::max(10u, (unsigned int)cnv_size.get_height())); + camera.apply_viewport(); + + if (camera.requires_zoom_to_bed) { + zoom_to_bed(); + _resize((unsigned int)cnv_size.get_width(), (unsigned int)cnv_size.get_height()); + camera.requires_zoom_to_bed = false; + } + + camera.apply_projection(_max_bounding_box(true, true)); + + wxGetApp().imgui()->new_frame(); + + if (m_picking_enabled) { + if (m_rectangle_selection.is_dragging() && !m_rectangle_selection.is_empty()) + // picking pass using rectangle selection + _rectangular_selection_picking_pass(); + else if (!m_volumes.empty()) + // regular picking pass + _picking_pass(); +#if ENABLE_RAYCAST_PICKING_DEBUG + else { + ImGuiWrapper& imgui = *wxGetApp().imgui(); + imgui.begin(std::string("Hit result"), ImGuiWindowFlags_AlwaysAutoResize); + imgui.text("Picking disabled"); + imgui.end(); + } +#endif // ENABLE_RAYCAST_PICKING_DEBUG + } + +#ifdef SHOW_IMGUI_DEMO_WINDOW + if (show_imgui_demo_window) ImGui::ShowDemoWindow(); +#endif // SHOW_IMGUI_DEMO_WINDOW + + const bool is_looking_downward = camera.is_looking_downward(); + + // draw scene + glsafe(::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); + _render_background(); + + _render_objects(GLVolumeCollection::ERenderType::Opaque); + _render_sla_slices(); + _render_selection(); + _render_bed_axes(); + if (is_looking_downward) + _render_bed(camera.get_view_matrix(), camera.get_projection_matrix(), false); + if (!m_main_toolbar.is_enabled()) + _render_gcode(); + _render_objects(GLVolumeCollection::ERenderType::Transparent); + + _render_sequential_clearance(); +#if ENABLE_RENDER_SELECTION_CENTER + _render_selection_center(); +#endif // ENABLE_RENDER_SELECTION_CENTER + if (!m_main_toolbar.is_enabled()) + _render_gcode_cog(); + + // we need to set the mouse's scene position here because the depth buffer + // could be invalidated by the following gizmo render methods + // this position is used later into on_mouse() to drag the objects + if (m_picking_enabled) + m_mouse.scene_position = _mouse_to_3d(m_mouse.position.cast()); + + // sidebar hints need to be rendered before the gizmos because the depth buffer + // could be invalidated by the following gizmo render methods + _render_selection_sidebar_hints(); + _render_current_gizmo(); + if (!is_looking_downward) + _render_bed(camera.get_view_matrix(), camera.get_projection_matrix(), true); + +#if ENABLE_RAYCAST_PICKING_DEBUG + if (m_picking_enabled && !m_mouse.dragging && !m_gizmos.is_dragging() && !m_rectangle_selection.is_dragging()) + m_scene_raycaster.render_hit(camera); +#endif // ENABLE_RAYCAST_PICKING_DEBUG + +#if ENABLE_SHOW_CAMERA_TARGET + _render_camera_target(); +#endif // ENABLE_SHOW_CAMERA_TARGET + + if (m_picking_enabled && m_rectangle_selection.is_dragging()) + m_rectangle_selection.render(*this); + + // draw overlays + _render_overlays(); + + if (wxGetApp().plater()->is_render_statistic_dialog_visible()) { + ImGuiWrapper& imgui = *wxGetApp().imgui(); + imgui.begin(std::string("Render statistics"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); + imgui.text("FPS (SwapBuffers() calls per second):"); + ImGui::SameLine(); + imgui.text(std::to_string(m_render_stats.get_fps_and_reset_if_needed())); + ImGui::Separator(); + imgui.text("Compressed textures:"); + ImGui::SameLine(); + imgui.text(OpenGLManager::are_compressed_textures_supported() ? "supported" : "not supported"); + imgui.text("Max texture size:"); + ImGui::SameLine(); + imgui.text(std::to_string(OpenGLManager::get_gl_info().get_max_tex_size())); + imgui.end(); + } + +#if ENABLE_PROJECT_DIRTY_STATE_DEBUG_WINDOW + if (wxGetApp().is_editor() && wxGetApp().plater()->is_view3D_shown()) + wxGetApp().plater()->render_project_state_debug_window(); +#endif // ENABLE_PROJECT_DIRTY_STATE_DEBUG_WINDOW + +#if ENABLE_CAMERA_STATISTICS + camera.debug_render(); +#endif // ENABLE_CAMERA_STATISTICS +#if ENABLE_GLMODEL_STATISTICS + GLModel::render_statistics(); +#endif // ENABLE_GLMODEL_STATISTICS +#if ENABLE_OBJECT_MANIPULATION_DEBUG + wxGetApp().obj_manipul()->render_debug_window(); +#endif // ENABLE_OBJECT_MANIPULATION_DEBUG + + std::string tooltip; + + // Negative coordinate means out of the window, likely because the window was deactivated. + // In that case the tooltip should be hidden. + if (m_mouse.position.x() >= 0. && m_mouse.position.y() >= 0.) { + if (tooltip.empty()) + tooltip = m_layers_editing.get_tooltip(*this); + + if (tooltip.empty()) + tooltip = m_gizmos.get_tooltip(); + + if (tooltip.empty()) + tooltip = m_main_toolbar.get_tooltip(); + + if (tooltip.empty()) + tooltip = m_undoredo_toolbar.get_tooltip(); + + if (tooltip.empty()) + tooltip = wxGetApp().plater()->get_collapse_toolbar().get_tooltip(); + + if (tooltip.empty()) + tooltip = wxGetApp().plater()->get_view_toolbar().get_tooltip(); + } + + set_tooltip(tooltip); + + if (m_tooltip_enabled) + m_tooltip.render(m_mouse.position, *this); + + wxGetApp().plater()->get_mouse3d_controller().render_settings_dialog(*this); + + wxGetApp().plater()->get_notification_manager()->render_notifications(*this, get_overlay_window_width()); + + wxGetApp().imgui()->render(); + + m_canvas->SwapBuffers(); + m_render_stats.increment_fps_counter(); +} + +void GLCanvas3D::render_thumbnail(ThumbnailData& thumbnail_data, unsigned int w, unsigned int h, const ThumbnailsParams& thumbnail_params, Camera::EType camera_type) +{ + render_thumbnail(thumbnail_data, w, h, thumbnail_params, m_volumes, camera_type); +} + +void GLCanvas3D::render_thumbnail(ThumbnailData& thumbnail_data, unsigned int w, unsigned int h, const ThumbnailsParams& thumbnail_params, const GLVolumeCollection& volumes, Camera::EType camera_type) +{ + switch (OpenGLManager::get_framebuffers_type()) + { + case OpenGLManager::EFramebufferType::Arb: { _render_thumbnail_framebuffer(thumbnail_data, w, h, thumbnail_params, volumes, camera_type); break; } + case OpenGLManager::EFramebufferType::Ext: { _render_thumbnail_framebuffer_ext(thumbnail_data, w, h, thumbnail_params, volumes, camera_type); break; } + default: { _render_thumbnail_legacy(thumbnail_data, w, h, thumbnail_params, volumes, camera_type); break; } + } +} + +void GLCanvas3D::select_all() +{ + m_selection.add_all(); + m_dirty = true; + wxGetApp().obj_manipul()->set_dirty(); + m_gizmos.reset_all_states(); + m_gizmos.update_data(); + post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT)); +} + +void GLCanvas3D::deselect_all() +{ + if (m_selection.is_empty()) + return; + + m_selection.remove_all(); + wxGetApp().obj_manipul()->set_dirty(); + m_gizmos.reset_all_states(); + m_gizmos.update_data(); + post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT)); +} + +void GLCanvas3D::delete_selected() +{ + m_selection.erase(); +} + +void GLCanvas3D::ensure_on_bed(unsigned int object_idx, bool allow_negative_z) +{ + if (allow_negative_z) + return; + + typedef std::map, double> InstancesToZMap; + InstancesToZMap instances_min_z; + + for (GLVolume* volume : m_volumes.volumes) { + if (volume->object_idx() == (int)object_idx && !volume->is_modifier) { + double min_z = volume->transformed_convex_hull_bounding_box().min.z(); + std::pair instance = std::make_pair(volume->object_idx(), volume->instance_idx()); + InstancesToZMap::iterator it = instances_min_z.find(instance); + if (it == instances_min_z.end()) + it = instances_min_z.insert(InstancesToZMap::value_type(instance, DBL_MAX)).first; + + it->second = std::min(it->second, min_z); + } + } + + for (GLVolume* volume : m_volumes.volumes) { + std::pair instance = std::make_pair(volume->object_idx(), volume->instance_idx()); + InstancesToZMap::iterator it = instances_min_z.find(instance); + if (it != instances_min_z.end()) + volume->set_instance_offset(Z, volume->get_instance_offset(Z) - it->second); + } +} + + +const std::vector& GLCanvas3D::get_gcode_layers_zs() const +{ + return m_gcode_viewer.get_layers_zs(); +} + +std::vector GLCanvas3D::get_volumes_print_zs(bool active_only) const +{ + return m_volumes.get_current_print_zs(active_only); +} + +void GLCanvas3D::set_gcode_options_visibility_from_flags(unsigned int flags) +{ + m_gcode_viewer.set_options_visibility_from_flags(flags); +} + +void GLCanvas3D::set_toolpath_role_visibility_flags(unsigned int flags) +{ + m_gcode_viewer.set_toolpath_role_visibility_flags(flags); +} + +void GLCanvas3D::set_toolpath_view_type(GCodeViewer::EViewType type) +{ + m_gcode_viewer.set_view_type(type); +} + +void GLCanvas3D::set_volumes_z_range(const std::array& range) +{ + m_volumes.set_range(range[0] - 1e-6, range[1] + 1e-6); +} + +void GLCanvas3D::set_toolpaths_z_range(const std::array& range) +{ + if (m_gcode_viewer.has_data()) + m_gcode_viewer.set_layers_z_range(range); +} + +std::vector GLCanvas3D::load_object(const ModelObject& model_object, int obj_idx, std::vector instance_idxs) +{ + if (instance_idxs.empty()) { + for (unsigned int i = 0; i < model_object.instances.size(); ++i) { + instance_idxs.emplace_back(i); + } + } + return m_volumes.load_object(&model_object, obj_idx, instance_idxs); +} + +std::vector GLCanvas3D::load_object(const Model& model, int obj_idx) +{ + if (0 <= obj_idx && obj_idx < (int)model.objects.size()) { + const ModelObject* model_object = model.objects[obj_idx]; + if (model_object != nullptr) + return load_object(*model_object, obj_idx, std::vector()); + } + + return std::vector(); +} + +void GLCanvas3D::mirror_selection(Axis axis) +{ + TransformationType transformation_type; + if (wxGetApp().obj_manipul()->is_local_coordinates()) + transformation_type.set_local(); + else if (wxGetApp().obj_manipul()->is_instance_coordinates()) + transformation_type.set_instance(); + + transformation_type.set_relative(); + + m_selection.setup_cache(); + m_selection.mirror(axis, transformation_type); + + do_mirror(L("Mirror Object")); + wxGetApp().obj_manipul()->set_dirty(); +} + +// Reload the 3D scene of +// 1) Model / ModelObjects / ModelInstances / ModelVolumes +// 2) Print bed +// 3) SLA support meshes for their respective ModelObjects / ModelInstances +// 4) Wipe tower preview +// 5) Out of bed collision status & message overlay (texture) +void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_refresh) +{ + if (m_canvas == nullptr || m_config == nullptr || m_model == nullptr) + return; + + if (!m_initialized) + return; + + _set_current(); + + m_hover_volume_idxs.clear(); + + struct ModelVolumeState { + ModelVolumeState(const GLVolume* volume) : + model_volume(nullptr), geometry_id(volume->geometry_id), volume_idx(-1) {} + ModelVolumeState(const ModelVolume* model_volume, const ObjectID& instance_id, const GLVolume::CompositeID& composite_id) : + model_volume(model_volume), geometry_id(std::make_pair(model_volume->id().id, instance_id.id)), composite_id(composite_id), volume_idx(-1) {} + ModelVolumeState(const ObjectID& volume_id, const ObjectID& instance_id) : + model_volume(nullptr), geometry_id(std::make_pair(volume_id.id, instance_id.id)), volume_idx(-1) {} + bool new_geometry() const { return this->volume_idx == size_t(-1); } + const ModelVolume* model_volume; + // ObjectID of ModelVolume + ObjectID of ModelInstance + // or timestamp of an SLAPrintObjectStep + ObjectID of ModelInstance + std::pair geometry_id; + GLVolume::CompositeID composite_id; + // Volume index in the new GLVolume vector. + size_t volume_idx; + }; + std::vector model_volume_state; + std::vector aux_volume_state; + + struct GLVolumeState { + GLVolumeState() : + volume_idx(size_t(-1)) {} + GLVolumeState(const GLVolume* volume, unsigned int volume_idx) : + composite_id(volume->composite_id), volume_idx(volume_idx) {} + GLVolumeState(const GLVolume::CompositeID &composite_id) : + composite_id(composite_id), volume_idx(size_t(-1)) {} + + GLVolume::CompositeID composite_id; + // Volume index in the old GLVolume vector. + size_t volume_idx; + }; + + // SLA steps to pull the preview meshes for. + typedef std::array SLASteps; + SLASteps sla_steps = { slaposDrillHoles, slaposSupportTree, slaposPad }; + struct SLASupportState { + std::array::value> step; + }; + // State of the sla_steps for all SLAPrintObjects. + std::vector sla_support_state; + + std::vector instance_ids_selected; + std::vector map_glvolume_old_to_new(m_volumes.volumes.size(), size_t(-1)); + std::vector deleted_volumes; + std::vector glvolumes_new; + glvolumes_new.reserve(m_volumes.volumes.size()); + auto model_volume_state_lower = [](const ModelVolumeState& m1, const ModelVolumeState& m2) { return m1.geometry_id < m2.geometry_id; }; + + m_reload_delayed = !m_canvas->IsShown() && !refresh_immediately && !force_full_scene_refresh; + + PrinterTechnology printer_technology = current_printer_technology(); + int volume_idx_wipe_tower_old = -1; + + // Release invalidated volumes to conserve GPU memory in case of delayed refresh (see m_reload_delayed). + // First initialize model_volumes_new_sorted & model_instances_new_sorted. + for (int object_idx = 0; object_idx < (int)m_model->objects.size(); ++object_idx) { + const ModelObject* model_object = m_model->objects[object_idx]; + for (int instance_idx = 0; instance_idx < (int)model_object->instances.size(); ++instance_idx) { + const ModelInstance* model_instance = model_object->instances[instance_idx]; + for (int volume_idx = 0; volume_idx < (int)model_object->volumes.size(); ++volume_idx) { + const ModelVolume* model_volume = model_object->volumes[volume_idx]; + model_volume_state.emplace_back(model_volume, model_instance->id(), GLVolume::CompositeID(object_idx, volume_idx, instance_idx)); + } + } + } + + if (printer_technology == ptSLA) { + const SLAPrint* sla_print = this->sla_print(); +#ifndef NDEBUG + // Verify that the SLAPrint object is synchronized with m_model. + check_model_ids_equal(*m_model, sla_print->model()); +#endif // NDEBUG + sla_support_state.reserve(sla_print->objects().size()); + for (const SLAPrintObject* print_object : sla_print->objects()) { + SLASupportState state; + for (size_t istep = 0; istep < sla_steps.size(); ++istep) { + state.step[istep] = print_object->step_state_with_timestamp(sla_steps[istep]); + if (state.step[istep].state == PrintStateBase::State::Done) { + std::shared_ptr m = print_object->get_mesh_to_print(); + if (m == nullptr || m->empty()) + // Consider the DONE step without a valid mesh as invalid for the purpose + // of mesh visualization. + state.step[istep].state = PrintStateBase::State::Invalidated; + else { + for (const ModelInstance* model_instance : print_object->model_object()->instances) { + // Only the instances, which are currently printable, will have the SLA support structures kept. + // The instances outside the print bed will have the GLVolumes of their support structures released. + if (model_instance->is_printable()) + aux_volume_state.emplace_back(state.step[istep].timestamp, model_instance->id()); + } + } + } + } + sla_support_state.emplace_back(state); + } + } + + std::sort(model_volume_state.begin(), model_volume_state.end(), model_volume_state_lower); + std::sort(aux_volume_state.begin(), aux_volume_state.end(), model_volume_state_lower); + // Release all ModelVolume based GLVolumes not found in the current Model. Find the GLVolume of a hollowed mesh. + for (size_t volume_id = 0; volume_id < m_volumes.volumes.size(); ++volume_id) { + GLVolume* volume = m_volumes.volumes[volume_id]; + ModelVolumeState key(volume); + ModelVolumeState* mvs = nullptr; + if (volume->volume_idx() < 0) { + auto it = std::lower_bound(aux_volume_state.begin(), aux_volume_state.end(), key, model_volume_state_lower); + if (it != aux_volume_state.end() && it->geometry_id == key.geometry_id) + // This can be an SLA support structure that should not be rendered (in case someone used undo + // to revert to before it was generated). We only reuse the volume if that's not the case. + if (m_model->objects[volume->composite_id.object_id]->sla_points_status != sla::PointsStatus::NoPoints) + mvs = &(*it); + } + else { + auto it = std::lower_bound(model_volume_state.begin(), model_volume_state.end(), key, model_volume_state_lower); + if (it != model_volume_state.end() && it->geometry_id == key.geometry_id) + mvs = &(*it); + } + // Emplace instance ID of the volume. Both the aux volumes and model volumes share the same instance ID. + // The wipe tower has its own wipe_tower_instance_id(). + if (m_selection.contains_volume(volume_id)) + instance_ids_selected.emplace_back(volume->geometry_id.second); + if (mvs == nullptr || force_full_scene_refresh) { + // This GLVolume will be released. + if (volume->is_wipe_tower) { + // There is only one wipe tower. + assert(volume_idx_wipe_tower_old == -1); +#if ENABLE_OPENGL_ES + m_wipe_tower_mesh.clear(); +#endif // ENABLE_OPENGL_ES + volume_idx_wipe_tower_old = (int)volume_id; + } + if (!m_reload_delayed) { + deleted_volumes.emplace_back(volume, volume_id); + delete volume; + } + } + else { + // This GLVolume will be reused. + volume->set_sla_shift_z(0.0); + map_glvolume_old_to_new[volume_id] = glvolumes_new.size(); + mvs->volume_idx = glvolumes_new.size(); + glvolumes_new.emplace_back(volume); + // Update color of the volume based on the current extruder. + if (mvs->model_volume != nullptr) { + int extruder_id = mvs->model_volume->extruder_id(); + if (extruder_id != -1) + volume->extruder_id = extruder_id; + + volume->is_modifier = !mvs->model_volume->is_model_part(); + volume->set_color(color_from_model_volume(*mvs->model_volume)); + // force update of render_color alpha channel + volume->set_render_color(volume->color.is_transparent()); + + // updates volumes transformations + volume->set_instance_transformation(mvs->model_volume->get_object()->instances[mvs->composite_id.instance_id]->get_transformation()); + volume->set_volume_transformation(mvs->model_volume->get_transformation()); + + // updates volumes convex hull + if (mvs->model_volume->is_model_part() && ! volume->convex_hull()) + // Model volume was likely changed from modifier or support blocker / enforcer to a model part. + // Only model parts require convex hulls. + volume->set_convex_hull(mvs->model_volume->get_convex_hull_shared_ptr()); + } + } + } + sort_remove_duplicates(instance_ids_selected); + auto deleted_volumes_lower = [](const GLVolumeState &v1, const GLVolumeState &v2) { return v1.composite_id < v2.composite_id; }; + std::sort(deleted_volumes.begin(), deleted_volumes.end(), deleted_volumes_lower); + + if (m_reload_delayed) + return; + + bool update_object_list = false; + if (m_volumes.volumes != glvolumes_new) + update_object_list = true; + m_volumes.volumes = std::move(glvolumes_new); + for (unsigned int obj_idx = 0; obj_idx < (unsigned int)m_model->objects.size(); ++ obj_idx) { + const ModelObject &model_object = *m_model->objects[obj_idx]; + for (int volume_idx = 0; volume_idx < (int)model_object.volumes.size(); ++ volume_idx) { + const ModelVolume &model_volume = *model_object.volumes[volume_idx]; + for (int instance_idx = 0; instance_idx < (int)model_object.instances.size(); ++ instance_idx) { + const ModelInstance &model_instance = *model_object.instances[instance_idx]; + ModelVolumeState key(model_volume.id(), model_instance.id()); + auto it = std::lower_bound(model_volume_state.begin(), model_volume_state.end(), key, model_volume_state_lower); + assert(it != model_volume_state.end() && it->geometry_id == key.geometry_id); + if (it->new_geometry()) { + // New volume. + auto it_old_volume = std::lower_bound(deleted_volumes.begin(), deleted_volumes.end(), GLVolumeState(it->composite_id), deleted_volumes_lower); + if (it_old_volume != deleted_volumes.end() && it_old_volume->composite_id == it->composite_id) + // If a volume changed its ObjectID, but it reuses a GLVolume's CompositeID, maintain its selection. + map_glvolume_old_to_new[it_old_volume->volume_idx] = m_volumes.volumes.size(); + // Note the index of the loaded volume, so that we can reload the main model GLVolume with the hollowed mesh + // later in this function. + it->volume_idx = m_volumes.volumes.size(); + m_volumes.load_object_volume(&model_object, obj_idx, volume_idx, instance_idx); + m_volumes.volumes.back()->geometry_id = key.geometry_id; + update_object_list = true; + } else { + // Recycling an old GLVolume. + GLVolume &existing_volume = *m_volumes.volumes[it->volume_idx]; + assert(existing_volume.geometry_id == key.geometry_id); + // Update the Object/Volume/Instance indices into the current Model. + if (existing_volume.composite_id != it->composite_id) { + existing_volume.composite_id = it->composite_id; + update_object_list = true; + } + } + } + } + } + + if (printer_technology == ptSLA) { + size_t idx = 0; + const SLAPrint *sla_print = this->sla_print(); + std::vector shift_zs(m_model->objects.size(), 0); + double relative_correction_z = sla_print->relative_correction().z(); + if (relative_correction_z <= EPSILON) + relative_correction_z = 1.; + for (const SLAPrintObject *print_object : sla_print->objects()) { + SLASupportState &state = sla_support_state[idx ++]; + const ModelObject *model_object = print_object->model_object(); + // Find an index of the ModelObject + int object_idx; + // There may be new SLA volumes added to the scene for this print_object. + // Find the object index of this print_object in the Model::objects list. + auto it = std::find(sla_print->model().objects.begin(), sla_print->model().objects.end(), model_object); + assert(it != sla_print->model().objects.end()); + object_idx = it - sla_print->model().objects.begin(); + // Cache the Z offset to be applied to all volumes with this object_idx. + shift_zs[object_idx] = print_object->get_current_elevation() / relative_correction_z; + // Collect indices of this print_object's instances, for which the SLA support meshes are to be added to the scene. + // pairs of + std::vector> instances[std::tuple_size::value]; + for (size_t print_instance_idx = 0; print_instance_idx < print_object->instances().size(); ++ print_instance_idx) { + const SLAPrintObject::Instance &instance = print_object->instances()[print_instance_idx]; + // Find index of ModelInstance corresponding to this SLAPrintObject::Instance. + auto it = std::find_if(model_object->instances.begin(), model_object->instances.end(), + [&instance](const ModelInstance *mi) { return mi->id() == instance.instance_id; }); + assert(it != model_object->instances.end()); + int instance_idx = it - model_object->instances.begin(); + for (size_t istep = 0; istep < sla_steps.size(); ++istep) { + if (state.step[istep].state == PrintStateBase::State::Done) { + // Check whether there is an existing auxiliary volume to be updated, or a new auxiliary volume to be created. + ModelVolumeState key(state.step[istep].timestamp, instance.instance_id.id); + auto it = std::lower_bound(aux_volume_state.begin(), aux_volume_state.end(), key, model_volume_state_lower); + assert(it != aux_volume_state.end() && it->geometry_id == key.geometry_id); + if (it->new_geometry()) { + // This can be an SLA support structure that should not be rendered (in case someone used undo + // to revert to before it was generated). If that's the case, we should not generate anything. + if (model_object->sla_points_status != sla::PointsStatus::NoPoints) + instances[istep].emplace_back(std::pair(instance_idx, print_instance_idx)); + else + shift_zs[object_idx] = 0.; + } + else { + // Recycling an old GLVolume. Update the Object/Instance indices into the current Model. + m_volumes.volumes[it->volume_idx]->composite_id = GLVolume::CompositeID(object_idx, m_volumes.volumes[it->volume_idx]->volume_idx(), instance_idx); + m_volumes.volumes[it->volume_idx]->set_instance_transformation(model_object->instances[instance_idx]->get_transformation()); + } + } + } + } + + for (size_t istep = 0; istep < sla_steps.size(); ++istep) { + if (!instances[istep].empty()) + m_volumes.load_object_auxiliary(print_object, object_idx, instances[istep], sla_steps[istep], state.step[istep].timestamp); + } + } + + // Shift-up all volumes of the object so that it has the right elevation with respect to the print bed + for (GLVolume* volume : m_volumes.volumes) { + const ModelObject* model_object = (volume->object_idx() < (int)m_model->objects.size()) ? m_model->objects[volume->object_idx()] : nullptr; + if (model_object != nullptr && model_object->instances[volume->instance_idx()]->is_printable()) { + const SLAPrintObject* po = sla_print->get_print_object_by_model_object_id(model_object->id()); + if (po != nullptr) + volume->set_sla_shift_z(po->get_current_elevation() / sla_print->relative_correction().z()); + } + } + } + + if (printer_technology == ptFFF && m_config->has("nozzle_diameter")) { + // Should the wipe tower be visualized ? + unsigned int extruders_count = (unsigned int)dynamic_cast(m_config->option("nozzle_diameter"))->values.size(); + + const bool wt = dynamic_cast(m_config->option("wipe_tower"))->value; + const bool co = dynamic_cast(m_config->option("complete_objects"))->value; + + if (extruders_count > 1 && wt && !co) { + + const float x = dynamic_cast(m_config->option("wipe_tower_x"))->value; + const float y = dynamic_cast(m_config->option("wipe_tower_y"))->value; + const float w = dynamic_cast(m_config->option("wipe_tower_width"))->value; + const float a = dynamic_cast(m_config->option("wipe_tower_rotation_angle"))->value; + const float bw = dynamic_cast(m_config->option("wipe_tower_brim_width"))->value; + const float ca = dynamic_cast(m_config->option("wipe_tower_cone_angle"))->value; + + const Print *print = m_process->fff_print(); + const float depth = print->wipe_tower_data(extruders_count).depth; + const float height_real = print->wipe_tower_data(extruders_count).height; // -1.f = unknown + + // Height of a print (Show at least a slab). + const double height = height_real < 0.f ? std::max(m_model->max_z(), 10.0) : height_real; + +#if ENABLE_OPENGL_ES + int volume_idx_wipe_tower_new = m_volumes.load_wipe_tower_preview( + x, y, w, depth, (float)height, ca, a, !print->is_step_done(psWipeTower), + bw, &m_wipe_tower_mesh); +#else + int volume_idx_wipe_tower_new = m_volumes.load_wipe_tower_preview( + x, y, w, depth, (float)height, ca, a, !print->is_step_done(psWipeTower), + bw); +#endif // ENABLE_OPENGL_ES + if (volume_idx_wipe_tower_old != -1) + map_glvolume_old_to_new[volume_idx_wipe_tower_old] = volume_idx_wipe_tower_new; + } + } + + update_volumes_colors_by_extruder(); + // Update selection indices based on the old/new GLVolumeCollection. + if (m_selection.get_mode() == Selection::Instance) + m_selection.instances_changed(instance_ids_selected); + else + m_selection.volumes_changed(map_glvolume_old_to_new); + + m_gizmos.update_data(); + m_gizmos.refresh_on_off_state(); + + // Update the toolbar + if (update_object_list) + post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT)); + + // checks for geometry outside the print volume to render it accordingly + if (!m_volumes.empty()) { + ModelInstanceEPrintVolumeState state; + const bool contained_min_one = m_volumes.check_outside_state(m_bed.build_volume(), &state); + const bool partlyOut = (state == ModelInstanceEPrintVolumeState::ModelInstancePVS_Partly_Outside); + const bool fullyOut = (state == ModelInstanceEPrintVolumeState::ModelInstancePVS_Fully_Outside); + + if (printer_technology != ptSLA) { + _set_warning_notification(EWarning::ObjectClashed, partlyOut); + _set_warning_notification(EWarning::ObjectOutside, fullyOut); + _set_warning_notification(EWarning::SlaSupportsOutside, false); + } + else { + const auto [res, volume] = _is_any_volume_outside(); + const bool is_support = volume != nullptr && volume->is_sla_support(); + if (is_support) { + _set_warning_notification(EWarning::ObjectClashed, false); + _set_warning_notification(EWarning::ObjectOutside, false); + _set_warning_notification(EWarning::SlaSupportsOutside, partlyOut || fullyOut); + } + else { + _set_warning_notification(EWarning::ObjectClashed, partlyOut); + _set_warning_notification(EWarning::ObjectOutside, fullyOut); + _set_warning_notification(EWarning::SlaSupportsOutside, false); + } + } + + post_event(Event(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, + contained_min_one && !m_model->objects.empty() && !partlyOut)); + } + else { + _set_warning_notification(EWarning::ObjectOutside, false); + _set_warning_notification(EWarning::ObjectClashed, false); + _set_warning_notification(EWarning::SlaSupportsOutside, false); + post_event(Event(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, false)); + } + + refresh_camera_scene_box(); + + if (m_selection.is_empty()) { + // If no object is selected, deactivate the active gizmo, if any + // Otherwise it may be shown after cleaning the scene (if it was active while the objects were deleted) + m_gizmos.reset_all_states(); + + // If no object is selected, reset the objects manipulator on the sidebar + // to force a reset of its cache + auto manip = wxGetApp().obj_manipul(); + if (manip != nullptr) + manip->set_dirty(); + } + + // refresh volume raycasters for picking + m_scene_raycaster.remove_raycasters(SceneRaycaster::EType::Volume); + for (size_t i = 0; i < m_volumes.volumes.size(); ++i) { + const GLVolume* v = m_volumes.volumes[i]; + assert(v->mesh_raycaster != nullptr); + std::shared_ptr raycaster = add_raycaster_for_picking(SceneRaycaster::EType::Volume, i, *v->mesh_raycaster, v->world_matrix()); + raycaster->set_active(v->is_active); + } + + for (GLVolume* volume : m_volumes.volumes) + if (volume->object_idx() < (int)m_model->objects.size() && m_model->objects[volume->object_idx()]->instances[volume->instance_idx()]->is_printable()) { + if (volume->is_modifier && m_model->objects[volume->object_idx()]->volumes[volume->volume_idx()]->is_modifier()) + volume->is_active = printer_technology != ptSLA; + } + + // refresh gizmo elements raycasters for picking + GLGizmoBase* curr_gizmo = m_gizmos.get_current(); + if (curr_gizmo != nullptr) + curr_gizmo->unregister_raycasters_for_picking(); + m_scene_raycaster.remove_raycasters(SceneRaycaster::EType::Gizmo); + if (curr_gizmo != nullptr && !m_selection.is_empty()) + curr_gizmo->register_raycasters_for_picking(); + + // and force this canvas to be redrawn. + m_dirty = true; +} + +void GLCanvas3D::load_gcode_preview(const GCodeProcessorResult& gcode_result, const std::vector& str_tool_colors) +{ + m_gcode_viewer.load(gcode_result, *this->fff_print()); + + if (wxGetApp().is_editor()) { + m_gcode_viewer.update_shells_color_by_extruder(m_config); + _set_warning_notification_if_needed(EWarning::ToolpathOutside); + } + + m_gcode_viewer.refresh(gcode_result, str_tool_colors); + set_as_dirty(); + request_extra_frame(); +} + +void GLCanvas3D::refresh_gcode_preview_render_paths(bool keep_sequential_current_first, bool keep_sequential_current_last) +{ + m_gcode_viewer.refresh_render_paths(keep_sequential_current_first, keep_sequential_current_last); + set_as_dirty(); + request_extra_frame(); +} + +void GLCanvas3D::load_sla_preview() +{ + const SLAPrint* print = sla_print(); + if (m_canvas != nullptr && print != nullptr) { + _set_current(); + // Release OpenGL data before generating new data. + reset_volumes(); + _load_sla_shells(); + _update_sla_shells_outside_state(); + _set_warning_notification_if_needed(EWarning::ObjectClashed); + _set_warning_notification_if_needed(EWarning::SlaSupportsOutside); + } +} + +void GLCanvas3D::load_preview(const std::vector& str_tool_colors, const std::vector& color_print_values) +{ + const Print *print = this->fff_print(); + if (print == nullptr) + return; + + _set_current(); + + // Release OpenGL data before generating new data. + this->reset_volumes(); + + const BuildVolume &build_volume = m_bed.build_volume(); + _load_print_toolpaths(build_volume); + _load_wipe_tower_toolpaths(build_volume, str_tool_colors); + for (const PrintObject* object : print->objects()) + _load_print_object_toolpaths(*object, build_volume, str_tool_colors, color_print_values); + + _set_warning_notification_if_needed(EWarning::ToolpathOutside); +} + +void GLCanvas3D::bind_event_handlers() +{ + if (m_canvas != nullptr) { + m_canvas->Bind(wxEVT_SIZE, &GLCanvas3D::on_size, this); + m_canvas->Bind(wxEVT_IDLE, &GLCanvas3D::on_idle, this); + m_canvas->Bind(wxEVT_CHAR, &GLCanvas3D::on_char, this); + m_canvas->Bind(wxEVT_KEY_DOWN, &GLCanvas3D::on_key, this); + m_canvas->Bind(wxEVT_KEY_UP, &GLCanvas3D::on_key, this); + m_canvas->Bind(wxEVT_MOUSEWHEEL, &GLCanvas3D::on_mouse_wheel, this); + m_canvas->Bind(wxEVT_TIMER, &GLCanvas3D::on_timer, this); + m_canvas->Bind(EVT_GLCANVAS_RENDER_TIMER, &GLCanvas3D::on_render_timer, this); + m_toolbar_highlighter.set_timer_owner(m_canvas, 0); + m_canvas->Bind(EVT_GLCANVAS_TOOLBAR_HIGHLIGHTER_TIMER, [this](wxTimerEvent&) { m_toolbar_highlighter.blink(); }); + m_gizmo_highlighter.set_timer_owner(m_canvas, 0); + m_canvas->Bind(EVT_GLCANVAS_GIZMO_HIGHLIGHTER_TIMER, [this](wxTimerEvent&) { m_gizmo_highlighter.blink(); }); + m_canvas->Bind(wxEVT_LEFT_DOWN, &GLCanvas3D::on_mouse, this); + m_canvas->Bind(wxEVT_LEFT_UP, &GLCanvas3D::on_mouse, this); + m_canvas->Bind(wxEVT_MIDDLE_DOWN, &GLCanvas3D::on_mouse, this); + m_canvas->Bind(wxEVT_MIDDLE_UP, &GLCanvas3D::on_mouse, this); + m_canvas->Bind(wxEVT_RIGHT_DOWN, &GLCanvas3D::on_mouse, this); + m_canvas->Bind(wxEVT_RIGHT_UP, &GLCanvas3D::on_mouse, this); + m_canvas->Bind(wxEVT_MOTION, &GLCanvas3D::on_mouse, this); + m_canvas->Bind(wxEVT_ENTER_WINDOW, &GLCanvas3D::on_mouse, this); + m_canvas->Bind(wxEVT_LEAVE_WINDOW, &GLCanvas3D::on_mouse, this); + m_canvas->Bind(wxEVT_LEFT_DCLICK, &GLCanvas3D::on_mouse, this); + m_canvas->Bind(wxEVT_MIDDLE_DCLICK, &GLCanvas3D::on_mouse, this); + m_canvas->Bind(wxEVT_RIGHT_DCLICK, &GLCanvas3D::on_mouse, this); + m_canvas->Bind(wxEVT_PAINT, &GLCanvas3D::on_paint, this); + m_canvas->Bind(wxEVT_SET_FOCUS, &GLCanvas3D::on_set_focus, this); + + m_event_handlers_bound = true; + } +} + +void GLCanvas3D::unbind_event_handlers() +{ + if (m_canvas != nullptr && m_event_handlers_bound) { + m_canvas->Unbind(wxEVT_SIZE, &GLCanvas3D::on_size, this); + m_canvas->Unbind(wxEVT_IDLE, &GLCanvas3D::on_idle, this); + m_canvas->Unbind(wxEVT_CHAR, &GLCanvas3D::on_char, this); + m_canvas->Unbind(wxEVT_KEY_DOWN, &GLCanvas3D::on_key, this); + m_canvas->Unbind(wxEVT_KEY_UP, &GLCanvas3D::on_key, this); + m_canvas->Unbind(wxEVT_MOUSEWHEEL, &GLCanvas3D::on_mouse_wheel, this); + m_canvas->Unbind(wxEVT_TIMER, &GLCanvas3D::on_timer, this); + m_canvas->Unbind(EVT_GLCANVAS_RENDER_TIMER, &GLCanvas3D::on_render_timer, this); + m_canvas->Unbind(wxEVT_LEFT_DOWN, &GLCanvas3D::on_mouse, this); + m_canvas->Unbind(wxEVT_LEFT_UP, &GLCanvas3D::on_mouse, this); + m_canvas->Unbind(wxEVT_MIDDLE_DOWN, &GLCanvas3D::on_mouse, this); + m_canvas->Unbind(wxEVT_MIDDLE_UP, &GLCanvas3D::on_mouse, this); + m_canvas->Unbind(wxEVT_RIGHT_DOWN, &GLCanvas3D::on_mouse, this); + m_canvas->Unbind(wxEVT_RIGHT_UP, &GLCanvas3D::on_mouse, this); + m_canvas->Unbind(wxEVT_MOTION, &GLCanvas3D::on_mouse, this); + m_canvas->Unbind(wxEVT_ENTER_WINDOW, &GLCanvas3D::on_mouse, this); + m_canvas->Unbind(wxEVT_LEAVE_WINDOW, &GLCanvas3D::on_mouse, this); + m_canvas->Unbind(wxEVT_LEFT_DCLICK, &GLCanvas3D::on_mouse, this); + m_canvas->Unbind(wxEVT_MIDDLE_DCLICK, &GLCanvas3D::on_mouse, this); + m_canvas->Unbind(wxEVT_RIGHT_DCLICK, &GLCanvas3D::on_mouse, this); + m_canvas->Unbind(wxEVT_PAINT, &GLCanvas3D::on_paint, this); + m_canvas->Unbind(wxEVT_SET_FOCUS, &GLCanvas3D::on_set_focus, this); + + m_event_handlers_bound = false; + } +} + +void GLCanvas3D::on_size(wxSizeEvent& evt) +{ + m_dirty = true; +} + +void GLCanvas3D::on_idle(wxIdleEvent& evt) +{ + if (!m_initialized) + return; + + m_dirty |= m_main_toolbar.update_items_state(); + m_dirty |= m_undoredo_toolbar.update_items_state(); + m_dirty |= wxGetApp().plater()->get_view_toolbar().update_items_state(); + m_dirty |= wxGetApp().plater()->get_collapse_toolbar().update_items_state(); + bool mouse3d_controller_applied = wxGetApp().plater()->get_mouse3d_controller().apply(wxGetApp().plater()->get_camera()); + m_dirty |= mouse3d_controller_applied; + m_dirty |= wxGetApp().plater()->get_notification_manager()->update_notifications(*this); + auto gizmo = wxGetApp().plater()->canvas3D()->get_gizmos_manager().get_current(); + if (gizmo != nullptr) m_dirty |= gizmo->update_items_state(); + // ImGuiWrapper::m_requires_extra_frame may have been set by a render made outside of the OnIdle mechanism + bool imgui_requires_extra_frame = wxGetApp().imgui()->requires_extra_frame(); + m_dirty |= imgui_requires_extra_frame; + + if (!m_dirty) + return; + + // this needs to be done here. + // during the render launched by the refresh the value may be set again + wxGetApp().imgui()->reset_requires_extra_frame(); + + _refresh_if_shown_on_screen(); + + if (m_extra_frame_requested || mouse3d_controller_applied || imgui_requires_extra_frame || wxGetApp().imgui()->requires_extra_frame()) { + m_extra_frame_requested = false; + evt.RequestMore(); + } + else + m_dirty = false; +} + +void GLCanvas3D::on_char(wxKeyEvent& evt) +{ + if (!m_initialized) + return; + +#ifdef SHOW_IMGUI_DEMO_WINDOW + static int cur = 0; + if (wxString("demo")[cur] == evt.GetUnicodeKey()) ++cur; else cur = 0; + if (cur == 4) { show_imgui_demo_window = !show_imgui_demo_window; cur = 0;} +#endif // SHOW_IMGUI_DEMO_WINDOW + + auto imgui = wxGetApp().imgui(); + if (imgui->update_key_data(evt)) { + render(); + return; + } + + // see include/wx/defs.h enum wxKeyCode + int keyCode = evt.GetKeyCode(); + int ctrlMask = wxMOD_CONTROL; + int shiftMask = wxMOD_SHIFT; + if (keyCode == WXK_ESCAPE && (_deactivate_undo_redo_toolbar_items() || _deactivate_search_toolbar_item() || _deactivate_arrange_menu())) + return; + + if (m_gizmos.on_char(evt)) + return; + + if ((evt.GetModifiers() & ctrlMask) != 0) { + // CTRL is pressed + switch (keyCode) { +#ifdef __APPLE__ + case 'a': + case 'A': +#else /* __APPLE__ */ + case WXK_CONTROL_A: +#endif /* __APPLE__ */ + post_event(SimpleEvent(EVT_GLCANVAS_SELECT_ALL)); + break; +#ifdef __APPLE__ + case 'c': + case 'C': +#else /* __APPLE__ */ + case WXK_CONTROL_C: +#endif /* __APPLE__ */ + post_event(SimpleEvent(EVT_GLTOOLBAR_COPY)); + break; +#ifdef __APPLE__ + case 'f': + case 'F': +#else /* __APPLE__ */ + case WXK_CONTROL_F: +#endif /* __APPLE__ */ + _activate_search_toolbar_item(); + break; +#ifdef __APPLE__ + case 'm': + case 'M': +#else /* __APPLE__ */ + case WXK_CONTROL_M: +#endif /* __APPLE__ */ + { +#ifdef _WIN32 + if (wxGetApp().app_config->get_bool("use_legacy_3DConnexion")) { +#endif //_WIN32 +#ifdef __APPLE__ + // On OSX use Cmd+Shift+M to "Show/Hide 3Dconnexion devices settings dialog" + if ((evt.GetModifiers() & shiftMask) != 0) { +#endif // __APPLE__ + Mouse3DController& controller = wxGetApp().plater()->get_mouse3d_controller(); + controller.show_settings_dialog(!controller.is_settings_dialog_shown()); + m_dirty = true; +#ifdef __APPLE__ + } + else + // and Cmd+M to minimize application + wxGetApp().mainframe->Iconize(); +#endif // __APPLE__ +#ifdef _WIN32 + } +#endif //_WIN32 + break; + } +#ifdef __APPLE__ + case 'v': + case 'V': +#else /* __APPLE__ */ + case WXK_CONTROL_V: +#endif /* __APPLE__ */ + post_event(SimpleEvent(EVT_GLTOOLBAR_PASTE)); + break; +#ifdef __APPLE__ + case 'y': + case 'Y': +#else /* __APPLE__ */ + case WXK_CONTROL_Y: +#endif /* __APPLE__ */ + post_event(SimpleEvent(EVT_GLCANVAS_REDO)); + break; +#ifdef __APPLE__ + case 'z': + case 'Z': +#else /* __APPLE__ */ + case WXK_CONTROL_Z: +#endif /* __APPLE__ */ + post_event(SimpleEvent(EVT_GLCANVAS_UNDO)); + break; + + case WXK_BACK: + case WXK_DELETE: + post_event(SimpleEvent(EVT_GLTOOLBAR_DELETE_ALL)); break; + default: evt.Skip(); + } + } else { + switch (keyCode) + { + case WXK_BACK: + case WXK_DELETE: { post_event(SimpleEvent(EVT_GLTOOLBAR_DELETE)); break; } + case WXK_ESCAPE: { deselect_all(); break; } + case WXK_F5: { + if ((wxGetApp().is_editor() && !wxGetApp().plater()->model().objects.empty()) || + (wxGetApp().is_gcode_viewer() && !wxGetApp().plater()->get_last_loaded_gcode().empty())) + post_event(SimpleEvent(EVT_GLCANVAS_RELOAD_FROM_DISK)); + break; + } + case '0': { select_view("iso"); break; } + case '1': { select_view("top"); break; } + case '2': { select_view("bottom"); break; } + case '3': { select_view("front"); break; } + case '4': { select_view("rear"); break; } + case '5': { select_view("left"); break; } + case '6': { select_view("right"); break; } + case '+': { + if (dynamic_cast(m_canvas->GetParent()) != nullptr) + post_event(wxKeyEvent(EVT_GLCANVAS_EDIT_COLOR_CHANGE, evt)); + else + post_event(Event(EVT_GLCANVAS_INCREASE_INSTANCES, +1)); + break; + } + case '-': { + if (dynamic_cast(m_canvas->GetParent()) != nullptr) + post_event(wxKeyEvent(EVT_GLCANVAS_EDIT_COLOR_CHANGE, evt)); + else + post_event(Event(EVT_GLCANVAS_INCREASE_INSTANCES, -1)); + break; + } + case '?': { post_event(SimpleEvent(EVT_GLCANVAS_QUESTION_MARK)); break; } + case 'A': + case 'a': { post_event(SimpleEvent(EVT_GLCANVAS_ARRANGE)); break; } + case 'B': + case 'b': { zoom_to_bed(); break; } + case 'C': + case 'c': { m_gcode_viewer.toggle_gcode_window_visibility(); m_dirty = true; request_extra_frame(); break; } + case 'E': + case 'e': { m_labels.show(!m_labels.is_shown()); m_dirty = true; break; } + case 'G': + case 'g': { + if ((evt.GetModifiers() & shiftMask) != 0) { + if (dynamic_cast(m_canvas->GetParent()) != nullptr) + post_event(wxKeyEvent(EVT_GLCANVAS_JUMP_TO, evt)); + } + break; + } + case 'I': + case 'i': { _update_camera_zoom(1.0); break; } + case 'K': + case 'k': { wxGetApp().plater()->get_camera().select_next_type(); m_dirty = true; break; } + case 'L': + case 'l': { + if (!m_main_toolbar.is_enabled()) + show_legend(!is_legend_shown()); + break; + } + case 'O': + case 'o': { _update_camera_zoom(-1.0); break; } + case 'Z': + case 'z': { + if (!m_selection.is_empty()) + zoom_to_selection(); + else { + if (!m_volumes.empty()) + zoom_to_volumes(); + else + _zoom_to_box(m_gcode_viewer.get_paths_bounding_box()); + } + break; + } + default: { evt.Skip(); break; } + } + } +} + +class TranslationProcessor +{ + using UpAction = std::function; + using DownAction = std::function; + + UpAction m_up_action{ nullptr }; + DownAction m_down_action{ nullptr }; + + bool m_running{ false }; + Vec3d m_direction{ Vec3d::UnitX() }; + +public: + TranslationProcessor(UpAction up_action, DownAction down_action) + : m_up_action(up_action), m_down_action(down_action) + { + } + + void process(wxKeyEvent& evt) + { + const int keyCode = evt.GetKeyCode(); + wxEventType type = evt.GetEventType(); + if (type == wxEVT_KEY_UP) { + switch (keyCode) + { + case WXK_NUMPAD_LEFT: case WXK_LEFT: + case WXK_NUMPAD_RIGHT: case WXK_RIGHT: + case WXK_NUMPAD_UP: case WXK_UP: + case WXK_NUMPAD_DOWN: case WXK_DOWN: + { + m_running = false; + m_up_action(); + break; + } + default: { break; } + } + } + else if (type == wxEVT_KEY_DOWN) { + bool apply = false; + + switch (keyCode) + { + case WXK_SHIFT: + { + if (m_running) + apply = true; + + break; + } + case WXK_NUMPAD_LEFT: + case WXK_LEFT: + { + m_direction = -Vec3d::UnitX(); + apply = true; + break; + } + case WXK_NUMPAD_RIGHT: + case WXK_RIGHT: + { + m_direction = Vec3d::UnitX(); + apply = true; + break; + } + case WXK_NUMPAD_UP: + case WXK_UP: + { + m_direction = Vec3d::UnitY(); + apply = true; + break; + } + case WXK_NUMPAD_DOWN: + case WXK_DOWN: + { + m_direction = -Vec3d::UnitY(); + apply = true; + break; + } + default: { break; } + } + + if (apply) { + m_running = true; + m_down_action(m_direction, evt.ShiftDown(), evt.CmdDown()); + } + } + } +}; + +void GLCanvas3D::on_key(wxKeyEvent& evt) +{ + static TranslationProcessor translationProcessor( + [this]() { + do_move(L("Gizmo-Move")); + m_gizmos.update_data(); + + wxGetApp().obj_manipul()->set_dirty(); + // Let the plater know that the dragging finished, so a delayed refresh + // of the scene with the background processing data should be performed. + post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); + // updates camera target constraints + refresh_camera_scene_box(); + m_dirty = true; + }, + [this](const Vec3d& direction, bool slow, bool camera_space) { + m_selection.setup_cache(); + double multiplier = slow ? 1.0 : 10.0; + + Vec3d displacement; + if (camera_space) { + Eigen::Matrix inv_view_3x3 = wxGetApp().plater()->get_camera().get_view_matrix().inverse().matrix().block(0, 0, 3, 3); + displacement = multiplier * (inv_view_3x3 * direction); + displacement.z() = 0.0; + } + else + displacement = multiplier * direction; + + TransformationType trafo_type; + trafo_type.set_relative(); + m_selection.translate(displacement, trafo_type); + m_dirty = true; + } + ); + + const int keyCode = evt.GetKeyCode(); + + auto imgui = wxGetApp().imgui(); + if (imgui->update_key_data(evt)) { + render(); + } + else { + if (!m_gizmos.on_key(evt)) { + if (evt.GetEventType() == wxEVT_KEY_UP) { + if (evt.ShiftDown() && evt.ControlDown() && keyCode == WXK_SPACE) { + wxGetApp().plater()->toggle_render_statistic_dialog(); + m_dirty = true; + } + if (m_tab_down && keyCode == WXK_TAB && !evt.HasAnyModifiers()) { + // Enable switching between 3D and Preview with Tab + // m_canvas->HandleAsNavigationKey(evt); // XXX: Doesn't work in some cases / on Linux + post_event(SimpleEvent(EVT_GLCANVAS_TAB)); + } + else if (keyCode == WXK_TAB && evt.ShiftDown() && ! wxGetApp().is_gcode_viewer()) { + // Collapse side-panel with Shift+Tab + post_event(SimpleEvent(EVT_GLCANVAS_COLLAPSE_SIDEBAR)); + } + else if (keyCode == WXK_SHIFT) { + translationProcessor.process(evt); + + if (m_picking_enabled && m_rectangle_selection.is_dragging()) { + _update_selection_from_hover(); + m_rectangle_selection.stop_dragging(); + m_mouse.ignore_left_up = true; + } + m_shift_kar_filter.reset_count(); + m_dirty = true; +// set_cursor(Standard); + } + else if (keyCode == WXK_ALT) { + if (m_picking_enabled && m_rectangle_selection.is_dragging()) { + _update_selection_from_hover(); + m_rectangle_selection.stop_dragging(); + m_mouse.ignore_left_up = true; + m_dirty = true; + } +// set_cursor(Standard); + } + else if (keyCode == WXK_CONTROL) { + if (m_mouse.dragging && !m_moving) { + // if the user releases CTRL while rotating the 3D scene + // prevent from moving the selected volume + m_mouse.drag.move_volume_idx = -1; + m_mouse.set_start_position_3D_as_invalid(); + } + m_ctrl_kar_filter.reset_count(); + m_dirty = true; + } + else if (m_gizmos.is_enabled() && !m_selection.is_empty()) { + translationProcessor.process(evt); + + switch (keyCode) + { + case WXK_NUMPAD_PAGEUP: case WXK_PAGEUP: + case WXK_NUMPAD_PAGEDOWN: case WXK_PAGEDOWN: + { + do_rotate(L("Gizmo-Rotate")); + m_gizmos.update_data(); + + wxGetApp().obj_manipul()->set_dirty(); + // Let the plater know that the dragging finished, so a delayed refresh + // of the scene with the background processing data should be performed. + post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); + // updates camera target constraints + refresh_camera_scene_box(); + m_dirty = true; + + break; + } + default: { break; } + } + } + } + else if (evt.GetEventType() == wxEVT_KEY_DOWN) { + m_tab_down = keyCode == WXK_TAB && !evt.HasAnyModifiers(); + if (keyCode == WXK_SHIFT) { + translationProcessor.process(evt); + + if (m_picking_enabled && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports)) { + m_mouse.ignore_left_up = false; +// set_cursor(Cross); + } + if (m_shift_kar_filter.is_first()) + m_dirty = true; + + m_shift_kar_filter.increase_count(); + } + else if (keyCode == WXK_ALT) { + if (m_picking_enabled && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports)) { + m_mouse.ignore_left_up = false; +// set_cursor(Cross); + } + } + else if (keyCode == WXK_CONTROL) { + if (m_ctrl_kar_filter.is_first()) + m_dirty = true; + + m_ctrl_kar_filter.increase_count(); + } + else if (m_gizmos.is_enabled() && !m_selection.is_empty()) { + auto do_rotate = [this](double angle_z_rad) { + m_selection.setup_cache(); + m_selection.rotate(Vec3d(0.0, 0.0, angle_z_rad), TransformationType(TransformationType::World_Relative_Joint)); + m_dirty = true; +// wxGetApp().obj_manipul()->set_dirty(); + }; + + translationProcessor.process(evt); + + switch (keyCode) + { + case WXK_NUMPAD_PAGEUP: case WXK_PAGEUP: { do_rotate(0.25 * M_PI); break; } + case WXK_NUMPAD_PAGEDOWN: case WXK_PAGEDOWN: { do_rotate(-0.25 * M_PI); break; } + default: { break; } + } + } + else if (!m_gizmos.is_enabled()) { + // DoubleSlider navigation in Preview + if (keyCode == WXK_LEFT || + keyCode == WXK_RIGHT || + keyCode == WXK_UP || + keyCode == WXK_DOWN) { + if (dynamic_cast(m_canvas->GetParent()) != nullptr) + post_event(wxKeyEvent(EVT_GLCANVAS_MOVE_SLIDERS, evt)); + } + } + } + } + } + + if (keyCode != WXK_TAB + && keyCode != WXK_LEFT + && keyCode != WXK_UP + && keyCode != WXK_RIGHT + && keyCode != WXK_DOWN) { + evt.Skip(); // Needed to have EVT_CHAR generated as well + } +} + +void GLCanvas3D::on_mouse_wheel(wxMouseEvent& evt) +{ +#ifdef WIN32 + // Try to filter out spurious mouse wheel events comming from 3D mouse. + if (wxGetApp().plater()->get_mouse3d_controller().process_mouse_wheel()) + return; +#endif + + if (!m_initialized) + return; + + // Ignore the wheel events if the middle button is pressed. + if (evt.MiddleIsDown()) + return; + +#if ENABLE_RETINA_GL + const float scale = m_retina_helper->get_scale_factor(); + evt.SetX(evt.GetX() * scale); + evt.SetY(evt.GetY() * scale); +#endif + + if (wxGetApp().imgui()->update_mouse_data(evt)) { + m_dirty = true; + return; + } + +#ifdef __WXMSW__ + // For some reason the Idle event is not being generated after the mouse scroll event in case of scrolling with the two fingers on the touch pad, + // if the event is not allowed to be passed further. + // https://github.com/prusa3d/PrusaSlicer/issues/2750 + // evt.Skip() used to trigger the needed screen refresh, but it does no more. wxWakeUpIdle() seem to work now. + wxWakeUpIdle(); +#endif /* __WXMSW__ */ + + // Performs layers editing updates, if enabled + if (is_layers_editing_enabled()) { + int object_idx_selected = m_selection.get_object_idx(); + if (object_idx_selected != -1) { + // A volume is selected. Test, whether hovering over a layer thickness bar. + if (m_layers_editing.bar_rect_contains(*this, (float)evt.GetX(), (float)evt.GetY())) { + // Adjust the width of the selection. + m_layers_editing.band_width = std::max(std::min(m_layers_editing.band_width * (1.0f + 0.1f * (float)evt.GetWheelRotation() / (float)evt.GetWheelDelta()), 10.0f), 1.5f); + if (m_canvas != nullptr) + m_canvas->Refresh(); + + return; + } + } + } + + // If the Search window or Undo/Redo list is opened, + // update them according to the event + if (m_main_toolbar.is_item_pressed("search") || + m_undoredo_toolbar.is_item_pressed("undo") || + m_undoredo_toolbar.is_item_pressed("redo")) { + m_mouse_wheel = int((double)evt.GetWheelRotation() / (double)evt.GetWheelDelta()); + return; + } + + // Inform gizmos about the event so they have the opportunity to react. + if (m_gizmos.on_mouse_wheel(evt)) + return; + + // Calculate the zoom delta and apply it to the current zoom factor + double direction_factor = wxGetApp().app_config->get_bool("reverse_mouse_wheel_zoom") ? -1.0 : 1.0; + _update_camera_zoom(direction_factor * (double)evt.GetWheelRotation() / (double)evt.GetWheelDelta()); +} + +void GLCanvas3D::on_timer(wxTimerEvent& evt) +{ + if (m_layers_editing.state == LayersEditing::Editing) + _perform_layer_editing_action(); +} + +void GLCanvas3D::on_render_timer(wxTimerEvent& evt) +{ + // no need to wake up idle + // right after this event, idle event is fired + // m_dirty = true; + // wxWakeUpIdle(); +} + + +void GLCanvas3D::schedule_extra_frame(int miliseconds) +{ + // Schedule idle event right now + if (miliseconds == 0) + { + // We want to wakeup idle evnt but most likely this is call inside render cycle so we need to wait + if (m_in_render) + miliseconds = 33; + else { + m_dirty = true; + wxWakeUpIdle(); + return; + } + } + int remaining_time = m_render_timer.GetInterval(); + // Timer is not running + if (!m_render_timer.IsRunning()) { + m_render_timer.StartOnce(miliseconds); + // Timer is running - restart only if new period is shorter than remaning period + } else { + if (miliseconds + 20 < remaining_time) { + m_render_timer.Stop(); + m_render_timer.StartOnce(miliseconds); + } + } +} + +#ifndef NDEBUG +// #define SLIC3R_DEBUG_MOUSE_EVENTS +#endif + +#ifdef SLIC3R_DEBUG_MOUSE_EVENTS +std::string format_mouse_event_debug_message(const wxMouseEvent &evt) +{ + static int idx = 0; + char buf[2048]; + std::string out; + sprintf(buf, "Mouse Event %d - ", idx ++); + out = buf; + + if (evt.Entering()) + out += "Entering "; + if (evt.Leaving()) + out += "Leaving "; + if (evt.Dragging()) + out += "Dragging "; + if (evt.Moving()) + out += "Moving "; + if (evt.Magnify()) + out += "Magnify "; + if (evt.LeftDown()) + out += "LeftDown "; + if (evt.LeftUp()) + out += "LeftUp "; + if (evt.LeftDClick()) + out += "LeftDClick "; + if (evt.MiddleDown()) + out += "MiddleDown "; + if (evt.MiddleUp()) + out += "MiddleUp "; + if (evt.MiddleDClick()) + out += "MiddleDClick "; + if (evt.RightDown()) + out += "RightDown "; + if (evt.RightUp()) + out += "RightUp "; + if (evt.RightDClick()) + out += "RightDClick "; + + sprintf(buf, "(%d, %d)", evt.GetX(), evt.GetY()); + out += buf; + return out; +} +#endif /* SLIC3R_DEBUG_MOUSE_EVENTS */ + +void GLCanvas3D::on_mouse(wxMouseEvent& evt) +{ + if (!m_initialized || !_set_current()) + return; + +#if ENABLE_RETINA_GL + const float scale = m_retina_helper->get_scale_factor(); + evt.SetX(evt.GetX() * scale); + evt.SetY(evt.GetY() * scale); +#endif + + Point pos(evt.GetX(), evt.GetY()); + + ImGuiWrapper* imgui = wxGetApp().imgui(); + if (m_tooltip.is_in_imgui() && evt.LeftUp()) + // ignore left up events coming from imgui windows and not processed by them + m_mouse.ignore_left_up = true; + m_tooltip.set_in_imgui(false); + if (imgui->update_mouse_data(evt)) { + m_mouse.position = evt.Leaving() ? Vec2d(-1.0, -1.0) : pos.cast(); + m_tooltip.set_in_imgui(true); + render(); +#ifdef SLIC3R_DEBUG_MOUSE_EVENTS + printf((format_mouse_event_debug_message(evt) + " - Consumed by ImGUI\n").c_str()); +#endif /* SLIC3R_DEBUG_MOUSE_EVENTS */ + m_dirty = true; + // do not return if dragging or tooltip not empty to allow for tooltip update + // also, do not return if the mouse is moving and also is inside MM gizmo to allow update seed fill selection + if (!m_mouse.dragging && m_tooltip.is_empty() && (m_gizmos.get_current_type() != GLGizmosManager::MmuSegmentation || !evt.Moving())) + return; + } + +#ifdef __WXMSW__ + bool on_enter_workaround = false; + if (! evt.Entering() && ! evt.Leaving() && m_mouse.position.x() == -1.0) { + // Workaround for SPE-832: There seems to be a mouse event sent to the window before evt.Entering() + m_mouse.position = pos.cast(); + render(); +#ifdef SLIC3R_DEBUG_MOUSE_EVENTS + printf((format_mouse_event_debug_message(evt) + " - OnEnter workaround\n").c_str()); +#endif /* SLIC3R_DEBUG_MOUSE_EVENTS */ + on_enter_workaround = true; + } else +#endif /* __WXMSW__ */ + { +#ifdef SLIC3R_DEBUG_MOUSE_EVENTS + printf((format_mouse_event_debug_message(evt) + " - other\n").c_str()); +#endif /* SLIC3R_DEBUG_MOUSE_EVENTS */ + } + + if (m_main_toolbar.on_mouse(evt, *this)) { + if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) + mouse_up_cleanup(); + m_mouse.set_start_position_3D_as_invalid(); + return; + } + + if (m_undoredo_toolbar.on_mouse(evt, *this)) { + if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) + mouse_up_cleanup(); + m_mouse.set_start_position_3D_as_invalid(); + return; + } + + if (wxGetApp().plater()->get_collapse_toolbar().on_mouse(evt, *this)) { + if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) + mouse_up_cleanup(); + m_mouse.set_start_position_3D_as_invalid(); + return; + } + + if (wxGetApp().plater()->get_view_toolbar().on_mouse(evt, *this)) { + if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) + mouse_up_cleanup(); + m_mouse.set_start_position_3D_as_invalid(); + return; + } + + for (GLVolume* volume : m_volumes.volumes) { + volume->force_sinking_contours = false; + } + + auto show_sinking_contours = [this]() { + const Selection::IndicesList& idxs = m_selection.get_volume_idxs(); + for (unsigned int idx : idxs) { + m_volumes.volumes[idx]->force_sinking_contours = true; + } + m_dirty = true; + }; + + if (m_gizmos.on_mouse(evt)) { + if (wxWindow::FindFocus() != m_canvas) + // Grab keyboard focus for input in gizmo dialogs. + m_canvas->SetFocus(); + + if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) + mouse_up_cleanup(); + + m_mouse.set_start_position_3D_as_invalid(); + m_mouse.position = pos.cast(); + + // It should be detection of volume change + // Not only detection of some modifiers !!! + if (evt.Dragging()) { + GLGizmosManager::EType c = m_gizmos.get_current_type(); + if (current_printer_technology() == ptFFF && + fff_print()->config().complete_objects){ + if (c == GLGizmosManager::EType::Move || + c == GLGizmosManager::EType::Scale || + c == GLGizmosManager::EType::Rotate ) + update_sequential_clearance(); + } else { + if (c == GLGizmosManager::EType::Move || + c == GLGizmosManager::EType::Scale || + c == GLGizmosManager::EType::Rotate) + show_sinking_contours(); + } + } + else if (evt.LeftUp() && + m_gizmos.get_current_type() == GLGizmosManager::EType::Scale && + m_gizmos.get_current()->get_state() == GLGizmoBase::EState::On) { + wxGetApp().obj_list()->selection_changed(); + } + + return; + } + + bool any_gizmo_active = m_gizmos.get_current() != nullptr; + + int selected_object_idx = m_selection.get_object_idx(); + int layer_editing_object_idx = is_layers_editing_enabled() ? selected_object_idx : -1; + m_layers_editing.select_object(*m_model, layer_editing_object_idx); + + if (m_mouse.drag.move_requires_threshold && m_mouse.is_move_start_threshold_position_2D_defined() && m_mouse.is_move_threshold_met(pos)) { + m_mouse.drag.move_requires_threshold = false; + m_mouse.set_move_start_threshold_position_2D_as_invalid(); + } + + if (evt.ButtonDown() && wxWindow::FindFocus() != m_canvas) + // Grab keyboard focus on any mouse click event. + m_canvas->SetFocus(); + + if (evt.Entering()) { +//#if defined(__WXMSW__) || defined(__linux__) +// // On Windows and Linux needs focus in order to catch key events + // Set focus in order to remove it from object list + if (m_canvas != nullptr) { + // Only set focus, if the top level window of this canvas is active + // and ObjectList has a focus + auto p = dynamic_cast(evt.GetEventObject()); + while (p->GetParent()) + p = p->GetParent(); +#ifdef __WIN32__ + wxWindow* const obj_list = wxGetApp().obj_list()->GetMainWindow(); +#else + wxWindow* const obj_list = wxGetApp().obj_list(); +#endif + if (obj_list == p->FindFocus()) + m_canvas->SetFocus(); + m_mouse.position = pos.cast(); + m_tooltip_enabled = false; + // 1) forces a frame render to ensure that m_hover_volume_idxs is updated even when the user right clicks while + // the context menu is shown, ensuring it to disappear if the mouse is outside any volume and to + // change the volume hover state if any is under the mouse + // 2) when switching between 3d view and preview the size of the canvas changes if the side panels are visible, + // so forces a resize to avoid multiple renders with different sizes (seen as flickering) + _refresh_if_shown_on_screen(); + m_tooltip_enabled = true; + } + m_mouse.set_start_position_2D_as_invalid(); +//#endif + } + else if (evt.Leaving()) { + _deactivate_undo_redo_toolbar_items(); + + // to remove hover on objects when the mouse goes out of this canvas + m_mouse.position = Vec2d(-1.0, -1.0); + m_dirty = true; + } + else if (evt.LeftDown() || evt.RightDown() || evt.MiddleDown()) { + if (_deactivate_undo_redo_toolbar_items() || _deactivate_search_toolbar_item() || _deactivate_arrange_menu()) + return; + + // If user pressed left or right button we first check whether this happened + // on a volume or not. + m_layers_editing.state = LayersEditing::Unknown; + if (layer_editing_object_idx != -1 && m_layers_editing.bar_rect_contains(*this, pos(0), pos(1))) { + // A volume is selected and the mouse is inside the layer thickness bar. + // Start editing the layer height. + m_layers_editing.state = LayersEditing::Editing; + _perform_layer_editing_action(&evt); + } + else { + const bool rectangle_selection_dragging = m_rectangle_selection.is_dragging(); + if (evt.LeftDown() && (evt.ShiftDown() || evt.AltDown()) && m_picking_enabled) { + if (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports && + m_gizmos.get_current_type() != GLGizmosManager::FdmSupports && + m_gizmos.get_current_type() != GLGizmosManager::Seam && + m_gizmos.get_current_type() != GLGizmosManager::Cut && + m_gizmos.get_current_type() != GLGizmosManager::Measure && + m_gizmos.get_current_type() != GLGizmosManager::MmuSegmentation) { + m_rectangle_selection.start_dragging(m_mouse.position, evt.ShiftDown() ? GLSelectionRectangle::EState::Select : GLSelectionRectangle::EState::Deselect); + m_dirty = true; + } + } + + // Select volume in this 3D canvas. + // Don't deselect a volume if layer editing is enabled or any gizmo is active. We want the object to stay selected + // during the scene manipulation. + + if (m_picking_enabled && (!any_gizmo_active || !evt.CmdDown()) && (!m_hover_volume_idxs.empty() || !is_layers_editing_enabled()) && !rectangle_selection_dragging) { + if (evt.LeftDown() && !m_hover_volume_idxs.empty()) { + int volume_idx = get_first_hover_volume_idx(); + bool already_selected = m_selection.contains_volume(volume_idx); + bool shift_down = evt.ShiftDown(); + + Selection::IndicesList curr_idxs = m_selection.get_volume_idxs(); + + if (already_selected && shift_down) + m_selection.remove(volume_idx); + else { + m_selection.add(volume_idx, !shift_down, true); + m_mouse.drag.move_requires_threshold = !already_selected; + if (already_selected) + m_mouse.set_move_start_threshold_position_2D_as_invalid(); + else + m_mouse.drag.move_start_threshold_position_2D = pos; + } + + // propagate event through callback + if (curr_idxs != m_selection.get_volume_idxs()) { + if (m_selection.is_empty()) + m_gizmos.reset_all_states(); + else + m_gizmos.refresh_on_off_state(); + + m_gizmos.update_data(); + post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT)); + m_dirty = true; + } + } + } + + if (!m_hover_volume_idxs.empty() && !m_rectangle_selection.is_dragging()) { + if (evt.LeftDown() && m_moving_enabled && m_mouse.drag.move_volume_idx == -1) { + // Only accept the initial position, if it is inside the volume bounding box. + const int volume_idx = get_first_hover_volume_idx(); + BoundingBoxf3 volume_bbox = m_volumes.volumes[volume_idx]->transformed_bounding_box(); + volume_bbox.offset(1.0); + const bool is_cut_connector_selected = m_selection.is_any_connector(); + if ((!any_gizmo_active || !evt.CmdDown()) && volume_bbox.contains(m_mouse.scene_position) && !is_cut_connector_selected) { + m_volumes.volumes[volume_idx]->hover = GLVolume::HS_None; + // The dragging operation is initiated. + m_mouse.drag.move_volume_idx = volume_idx; + m_selection.setup_cache(); + if (!evt.CmdDown()) + m_mouse.drag.start_position_3D = m_mouse.scene_position; + m_sequential_print_clearance_first_displacement = true; + } + } + } + } + } + else if (evt.Dragging() && evt.LeftIsDown() && !evt.CmdDown() && m_layers_editing.state == LayersEditing::Unknown && + m_mouse.drag.move_volume_idx != -1 && m_mouse.is_start_position_3D_defined()) { + if (!m_mouse.drag.move_requires_threshold) { + m_mouse.dragging = true; + Vec3d cur_pos = m_mouse.drag.start_position_3D; + // we do not want to translate objects if the user just clicked on an object while pressing shift to remove it from the selection and then drag + if (m_selection.contains_volume(get_first_hover_volume_idx())) { + const Camera& camera = wxGetApp().plater()->get_camera(); + if (std::abs(camera.get_dir_forward().z()) < EPSILON) { + // side view -> move selected volumes orthogonally to camera view direction + const Linef3 ray = mouse_ray(pos); + const Vec3d dir = ray.unit_vector(); + // finds the intersection of the mouse ray with the plane parallel to the camera viewport and passing throught the starting position + // use ray-plane intersection see i.e. https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection algebric form + // in our case plane normal and ray direction are the same (orthogonal view) + // when moving to perspective camera the negative z unit axis of the camera needs to be transformed in world space and used as plane normal + const Vec3d inters = ray.a + (m_mouse.drag.start_position_3D - ray.a).dot(dir) / dir.squaredNorm() * dir; + // vector from the starting position to the found intersection + const Vec3d inters_vec = inters - m_mouse.drag.start_position_3D; + + const Vec3d camera_right = camera.get_dir_right(); + const Vec3d camera_up = camera.get_dir_up(); + + // finds projection of the vector along the camera axes + const double projection_x = inters_vec.dot(camera_right); + const double projection_z = inters_vec.dot(camera_up); + + // apply offset + cur_pos = m_mouse.drag.start_position_3D + projection_x * camera_right + projection_z * camera_up; + } + else { + // Generic view + // Get new position at the same Z of the initial click point. + cur_pos = mouse_ray(pos).intersect_plane(m_mouse.drag.start_position_3D.z()); + } + } + + m_moving = true; + TransformationType trafo_type; + trafo_type.set_relative(); + m_selection.translate(cur_pos - m_mouse.drag.start_position_3D, trafo_type); + if (current_printer_technology() == ptFFF && fff_print()->config().complete_objects) + update_sequential_clearance(); + wxGetApp().obj_manipul()->set_dirty(); + m_dirty = true; + } + } + else if (evt.Dragging() && evt.LeftIsDown() && m_picking_enabled && m_rectangle_selection.is_dragging()) { + // keeps the mouse position updated while dragging the selection rectangle + m_mouse.position = pos.cast(); + m_rectangle_selection.dragging(m_mouse.position); + m_dirty = true; + } + else if (evt.Dragging()) { + m_mouse.dragging = true; + + if (m_layers_editing.state != LayersEditing::Unknown && layer_editing_object_idx != -1) { + if (m_layers_editing.state == LayersEditing::Editing) { + _perform_layer_editing_action(&evt); + m_mouse.position = pos.cast(); + } + } + // do not process the dragging if the left mouse was set down in another canvas + else if (evt.LeftIsDown()) { + // if dragging over blank area with left button, rotate + if (!m_moving) { + if ((any_gizmo_active || evt.CmdDown() || m_hover_volume_idxs.empty()) && m_mouse.is_start_position_3D_defined()) { + const Vec3d rot = (Vec3d(pos.x(), pos.y(), 0.0) - m_mouse.drag.start_position_3D) * (PI * TRACKBALLSIZE / 180.0); + if (wxGetApp().app_config->get_bool("use_free_camera")) + // Virtual track ball (similar to the 3DConnexion mouse). + wxGetApp().plater()->get_camera().rotate_local_around_target(Vec3d(rot.y(), rot.x(), 0.0)); + else { + // Forces camera right vector to be parallel to XY plane in case it has been misaligned using the 3D mouse free rotation. + // It is cheaper to call this function right away instead of testing wxGetApp().plater()->get_mouse3d_controller().connected(), + // which checks an atomics (flushes CPU caches). + // See GH issue #3816. + Camera& camera = wxGetApp().plater()->get_camera(); + camera.recover_from_free_camera(); + camera.rotate_on_sphere(rot.x(), rot.y(), current_printer_technology() != ptSLA); + } + + m_dirty = true; + } + m_mouse.drag.start_position_3D = Vec3d((double)pos.x(), (double)pos.y(), 0.0); + } + } + else if (evt.MiddleIsDown() || evt.RightIsDown()) { + // If dragging over blank area with right/middle button, pan. + if (m_mouse.is_start_position_2D_defined()) { + // get point in model space at Z = 0 + float z = 0.0f; + const Vec3d cur_pos = _mouse_to_3d(pos, &z); + const Vec3d orig = _mouse_to_3d(m_mouse.drag.start_position_2D, &z); + Camera& camera = wxGetApp().plater()->get_camera(); + if (!wxGetApp().app_config->get_bool("use_free_camera")) + // Forces camera right vector to be parallel to XY plane in case it has been misaligned using the 3D mouse free rotation. + // It is cheaper to call this function right away instead of testing wxGetApp().plater()->get_mouse3d_controller().connected(), + // which checks an atomics (flushes CPU caches). + // See GH issue #3816. + camera.recover_from_free_camera(); + + camera.set_target(camera.get_target() + orig - cur_pos); + m_dirty = true; + } + + m_mouse.drag.start_position_2D = pos; + } + } + else if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) { + m_mouse.position = pos.cast(); + + if (m_layers_editing.state != LayersEditing::Unknown) { + m_layers_editing.state = LayersEditing::Unknown; + _stop_timer(); + m_layers_editing.accept_changes(*this); + } + else if (m_mouse.drag.move_volume_idx != -1 && m_mouse.dragging) { + do_move(L("Move Object")); + wxGetApp().obj_manipul()->set_dirty(); + // Let the plater know that the dragging finished, so a delayed refresh + // of the scene with the background processing data should be performed. + post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); + } + else if (evt.LeftUp() && m_picking_enabled && m_rectangle_selection.is_dragging()) { + if (evt.ShiftDown() || evt.AltDown()) + _update_selection_from_hover(); + + m_rectangle_selection.stop_dragging(); + } + else if (evt.LeftUp() && !m_mouse.ignore_left_up && !m_mouse.dragging && m_hover_volume_idxs.empty() && !is_layers_editing_enabled()) { + // deselect and propagate event through callback + if (!evt.ShiftDown() && (!any_gizmo_active || !evt.CmdDown()) && m_picking_enabled) + deselect_all(); + } + else if (evt.RightUp()) { + // forces a frame render to ensure that m_hover_volume_idxs is updated even when the user right clicks while + // the context menu is already shown + render(); + if (!m_hover_volume_idxs.empty()) { + // if right clicking on volume, propagate event through callback (shows context menu) + int volume_idx = get_first_hover_volume_idx(); + if (!m_volumes.volumes[volume_idx]->is_wipe_tower // no context menu for the wipe tower + && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports && m_gizmos.get_current_type() != GLGizmosManager::Measure)) // disable context menu when the gizmo is open + { + // forces the selection of the volume + /* m_selection.add(volume_idx); // #et_FIXME_if_needed + * To avoid extra "Add-Selection" snapshots, + * call add() with check_for_already_contained=true + * */ + m_selection.add(volume_idx, true, true); + m_gizmos.refresh_on_off_state(); + post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT)); + m_gizmos.update_data(); + wxGetApp().obj_manipul()->set_dirty(); + // forces a frame render to update the view before the context menu is shown + render(); + } + } + Vec2d logical_pos = pos.cast(); +#if ENABLE_RETINA_GL + const float factor = m_retina_helper->get_scale_factor(); + logical_pos = logical_pos.cwiseQuotient(Vec2d(factor, factor)); +#endif // ENABLE_RETINA_GL + if (!m_mouse.dragging) { + // do not post the event if the user is panning the scene + // or if right click was done over the wipe tower + const bool post_right_click_event = (m_hover_volume_idxs.empty() || !m_volumes.volumes[get_first_hover_volume_idx()]->is_wipe_tower) && + m_gizmos.get_current_type() != GLGizmosManager::Measure; + if (post_right_click_event) + post_event(RBtnEvent(EVT_GLCANVAS_RIGHT_CLICK, { logical_pos, m_hover_volume_idxs.empty() })); + } + } + + mouse_up_cleanup(); + } + else if (evt.Moving()) { + m_mouse.position = pos.cast(); + + // updates gizmos overlay + if (m_selection.is_empty()) + m_gizmos.reset_all_states(); + + m_dirty = true; + } + else + evt.Skip(); + + // Detection of doubleclick on text to open emboss edit window + auto type = m_gizmos.get_current_type(); + if (evt.LeftDClick() && !m_hover_volume_idxs.empty() && + (type == GLGizmosManager::EType::Undefined || + type == GLGizmosManager::EType::Move || + type == GLGizmosManager::EType::Rotate || + type == GLGizmosManager::EType::Scale || + type == GLGizmosManager::EType::Emboss) ) { + for (int hover_volume_id : m_hover_volume_idxs) { + const GLVolume &hover_gl_volume = *m_volumes.volumes[hover_volume_id]; + int object_idx = hover_gl_volume.object_idx(); + if (object_idx < 0 || static_cast(object_idx) >= m_model->objects.size()) continue; + const ModelObject* hover_object = m_model->objects[object_idx]; + int hover_volume_idx = hover_gl_volume.volume_idx(); + if (hover_volume_idx < 0 || static_cast(hover_volume_idx) >= hover_object->volumes.size()) continue; + const ModelVolume* hover_volume = hover_object->volumes[hover_volume_idx]; + if (!hover_volume->text_configuration.has_value()) continue; + m_selection.add_volumes(Selection::EMode::Volume, {(unsigned) hover_volume_id}); + if (type != GLGizmosManager::EType::Emboss) + m_gizmos.open_gizmo(GLGizmosManager::EType::Emboss); + wxGetApp().obj_list()->update_selections(); + return; + } + } + + if (m_moving) + show_sinking_contours(); + +#ifdef __WXMSW__ + if (on_enter_workaround) + m_mouse.position = Vec2d(-1., -1.); +#endif /* __WXMSW__ */ +} + +void GLCanvas3D::on_paint(wxPaintEvent& evt) +{ + if (m_initialized) + m_dirty = true; + else + // Call render directly, so it gets initialized immediately, not from On Idle handler. + this->render(); +} + +void GLCanvas3D::on_set_focus(wxFocusEvent& evt) +{ + m_tooltip_enabled = false; + _refresh_if_shown_on_screen(); + m_tooltip_enabled = true; +} + +Size GLCanvas3D::get_canvas_size() const +{ + int w = 0; + int h = 0; + + if (m_canvas != nullptr) + m_canvas->GetSize(&w, &h); + +#if ENABLE_RETINA_GL + const float factor = m_retina_helper->get_scale_factor(); + w *= factor; + h *= factor; +#else + const float factor = 1.0f; +#endif + + return Size(w, h, factor); +} + +Vec2d GLCanvas3D::get_local_mouse_position() const +{ + if (m_canvas == nullptr) + return Vec2d::Zero(); + + wxPoint mouse_pos = m_canvas->ScreenToClient(wxGetMousePosition()); + const double factor = +#if ENABLE_RETINA_GL + m_retina_helper->get_scale_factor(); +#else + 1.0; +#endif + return Vec2d(factor * mouse_pos.x, factor * mouse_pos.y); +} + +void GLCanvas3D::set_tooltip(const std::string& tooltip) +{ + if (m_canvas != nullptr) + m_tooltip.set_text(tooltip); +} + +void GLCanvas3D::do_move(const std::string& snapshot_type) +{ + if (m_model == nullptr) + return; + + if (!snapshot_type.empty()) + wxGetApp().plater()->take_snapshot(_(snapshot_type)); + + std::set> done; // keeps track of modified instances + bool object_moved = false; + Vec3d wipe_tower_origin = Vec3d::Zero(); + + Selection::EMode selection_mode = m_selection.get_mode(); + + for (const GLVolume* v : m_volumes.volumes) { + int object_idx = v->object_idx(); + int instance_idx = v->instance_idx(); + int volume_idx = v->volume_idx(); + + if (volume_idx < 0) + continue; + + std::pair done_id(object_idx, instance_idx); + + if (0 <= object_idx && object_idx < (int)m_model->objects.size()) { + done.insert(done_id); + + // Move instances/volumes + ModelObject* model_object = m_model->objects[object_idx]; + if (model_object != nullptr) { + if (selection_mode == Selection::Instance) + model_object->instances[instance_idx]->set_transformation(v->get_instance_transformation()); + else if (selection_mode == Selection::Volume) + model_object->volumes[volume_idx]->set_transformation(v->get_volume_transformation()); + + object_moved = true; + model_object->invalidate_bounding_box(); + } + } + else if (v->is_wipe_tower) + // Move a wipe tower proxy. + wipe_tower_origin = v->get_volume_offset(); + } + + // Fixes flying instances + for (const std::pair& i : done) { + ModelObject* m = m_model->objects[i.first]; + const double shift_z = m->get_instance_min_z(i.second); + if (current_printer_technology() == ptSLA || shift_z > SINKING_Z_THRESHOLD) { + const Vec3d shift(0.0, 0.0, -shift_z); + m_selection.translate(i.first, i.second, shift); + m->translate_instance(i.second, shift); + } + wxGetApp().obj_list()->update_info_items(static_cast(i.first)); + } + + // if the selection is not valid to allow for layer editing after the move, we need to turn off the tool if it is running + // similar to void Plater::priv::selection_changed() + if (!wxGetApp().plater()->can_layers_editing() && is_layers_editing_enabled()) + post_event(SimpleEvent(EVT_GLTOOLBAR_LAYERSEDITING)); + + if (object_moved) + post_event(SimpleEvent(EVT_GLCANVAS_INSTANCE_MOVED)); + + if (wipe_tower_origin != Vec3d::Zero()) + post_event(Vec3dEvent(EVT_GLCANVAS_WIPETOWER_MOVED, std::move(wipe_tower_origin))); + + reset_sequential_print_clearance(); + + m_dirty = true; +} + +void GLCanvas3D::do_rotate(const std::string& snapshot_type) +{ + if (m_model == nullptr) + return; + + if (!snapshot_type.empty()) + wxGetApp().plater()->take_snapshot(_(snapshot_type)); + + // stores current min_z of instances + std::map, double> min_zs; + for (int i = 0; i < static_cast(m_model->objects.size()); ++i) { + const ModelObject* obj = m_model->objects[i]; + for (int j = 0; j < static_cast(obj->instances.size()); ++j) { + if (snapshot_type == L("Gizmo-Place on Face") && m_selection.get_object_idx() == i) { + // This means we are flattening this object. In that case pretend + // that it is not sinking (even if it is), so it is placed on bed + // later on (whatever is sinking will be left sinking). + min_zs[{ i, j }] = SINKING_Z_THRESHOLD; + } + else + min_zs[{ i, j }] = obj->instance_bounding_box(j).min.z(); + + } + } + + std::set> done; // keeps track of modified instances + + Selection::EMode selection_mode = m_selection.get_mode(); + + for (const GLVolume* v : m_volumes.volumes) { + if (v->is_wipe_tower) { + const Vec3d offset = v->get_volume_offset(); + Vec3d rot_unit_x = v->get_volume_transformation().get_matrix().linear() * Vec3d::UnitX(); + double z_rot = std::atan2(rot_unit_x.y(), rot_unit_x.x()); + post_event(Vec3dEvent(EVT_GLCANVAS_WIPETOWER_ROTATED, Vec3d(offset.x(), offset.y(), z_rot))); + } + const int object_idx = v->object_idx(); + if (object_idx < 0 || (int)m_model->objects.size() <= object_idx) + continue; + + const int instance_idx = v->instance_idx(); + const int volume_idx = v->volume_idx(); + + if (volume_idx < 0) + continue; + + done.insert(std::pair(object_idx, instance_idx)); + + // Rotate instances/volumes. + ModelObject* model_object = m_model->objects[object_idx]; + if (model_object != nullptr) { + if (selection_mode == Selection::Instance) + model_object->instances[instance_idx]->set_transformation(v->get_instance_transformation()); + else if (selection_mode == Selection::Volume) + model_object->volumes[volume_idx]->set_transformation(v->get_volume_transformation()); + model_object->invalidate_bounding_box(); + } + } + + // Fixes sinking/flying instances + for (const std::pair& i : done) { + ModelObject* m = m_model->objects[i.first]; + const double shift_z = m->get_instance_min_z(i.second); + // leave sinking instances as sinking + if (min_zs.find({ i.first, i.second })->second >= SINKING_Z_THRESHOLD || shift_z > SINKING_Z_THRESHOLD) { + const Vec3d shift(0.0, 0.0, -shift_z); + m_selection.translate(i.first, i.second, shift); + m->translate_instance(i.second, shift); + } + + wxGetApp().obj_list()->update_info_items(static_cast(i.first)); + } + + if (!done.empty()) + post_event(SimpleEvent(EVT_GLCANVAS_INSTANCE_ROTATED)); + + m_dirty = true; +} + +void GLCanvas3D::do_scale(const std::string& snapshot_type) +{ + if (m_model == nullptr) + return; + + if (!snapshot_type.empty()) + wxGetApp().plater()->take_snapshot(_(snapshot_type)); + + // stores current min_z of instances + std::map, double> min_zs; + if (!snapshot_type.empty()) { + for (int i = 0; i < static_cast(m_model->objects.size()); ++i) { + const ModelObject* obj = m_model->objects[i]; + for (int j = 0; j < static_cast(obj->instances.size()); ++j) { + min_zs[{ i, j }] = obj->instance_bounding_box(j).min.z(); + } + } + } + + std::set> done; // keeps track of modified instances + + Selection::EMode selection_mode = m_selection.get_mode(); + + for (const GLVolume* v : m_volumes.volumes) { + const int object_idx = v->object_idx(); + if (object_idx < 0 || (int)m_model->objects.size() <= object_idx) + continue; + + const int instance_idx = v->instance_idx(); + const int volume_idx = v->volume_idx(); + + if (volume_idx < 0) + continue; + + done.insert(std::pair(object_idx, instance_idx)); + + // Rotate instances/volumes + ModelObject* model_object = m_model->objects[object_idx]; + if (model_object != nullptr) { + if (selection_mode == Selection::Instance) + model_object->instances[instance_idx]->set_transformation(v->get_instance_transformation()); + else if (selection_mode == Selection::Volume) { + model_object->instances[instance_idx]->set_transformation(v->get_instance_transformation()); + model_object->volumes[volume_idx]->set_transformation(v->get_volume_transformation()); + } + model_object->invalidate_bounding_box(); + } + } + + // Fixes sinking/flying instances + for (const std::pair& i : done) { + ModelObject* m = m_model->objects[i.first]; + const double shift_z = m->get_instance_min_z(i.second); + // leave sinking instances as sinking + if (min_zs.empty() || min_zs.find({ i.first, i.second })->second >= SINKING_Z_THRESHOLD || shift_z > SINKING_Z_THRESHOLD) { + const Vec3d shift(0.0, 0.0, -shift_z); + m_selection.translate(i.first, i.second, shift); + m->translate_instance(i.second, shift); + } + wxGetApp().obj_list()->update_info_items(static_cast(i.first)); + } + + if (!done.empty()) + post_event(SimpleEvent(EVT_GLCANVAS_INSTANCE_SCALED)); + + m_dirty = true; +} + +void GLCanvas3D::do_mirror(const std::string& snapshot_type) +{ + if (m_model == nullptr) + return; + + if (!snapshot_type.empty()) + wxGetApp().plater()->take_snapshot(_(snapshot_type)); + + // stores current min_z of instances + std::map, double> min_zs; + if (!snapshot_type.empty()) { + for (int i = 0; i < static_cast(m_model->objects.size()); ++i) { + const ModelObject* obj = m_model->objects[i]; + for (int j = 0; j < static_cast(obj->instances.size()); ++j) { + min_zs[{ i, j }] = obj->instance_bounding_box(j).min.z(); + } + } + } + + std::set> done; // keeps track of modified instances + + Selection::EMode selection_mode = m_selection.get_mode(); + + for (const GLVolume* v : m_volumes.volumes) { + int object_idx = v->object_idx(); + if (object_idx < 0 || (int)m_model->objects.size() <= object_idx) + continue; + + int instance_idx = v->instance_idx(); + int volume_idx = v->volume_idx(); + + done.insert(std::pair(object_idx, instance_idx)); + + // Mirror instances/volumes + ModelObject* model_object = m_model->objects[object_idx]; + if (model_object != nullptr) { + if (selection_mode == Selection::Instance) + model_object->instances[instance_idx]->set_transformation(v->get_instance_transformation()); + else if (selection_mode == Selection::Volume) + model_object->volumes[volume_idx]->set_transformation(v->get_volume_transformation()); + model_object->invalidate_bounding_box(); + } + } + + // Fixes sinking/flying instances + for (const std::pair& i : done) { + ModelObject* m = m_model->objects[i.first]; + double shift_z = m->get_instance_min_z(i.second); + // leave sinking instances as sinking + if (min_zs.empty() || min_zs.find({ i.first, i.second })->second >= SINKING_Z_THRESHOLD || shift_z > SINKING_Z_THRESHOLD) { + Vec3d shift(0.0, 0.0, -shift_z); + m_selection.translate(i.first, i.second, shift); + m->translate_instance(i.second, shift); + } + wxGetApp().obj_list()->update_info_items(static_cast(i.first)); + } + + post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); + + m_dirty = true; +} + +void GLCanvas3D::do_reset_skew(const std::string& snapshot_type) +{ + if (m_model == nullptr) + return; + + if (!snapshot_type.empty()) + wxGetApp().plater()->take_snapshot(_(snapshot_type)); + + // stores current min_z of instances + std::map, double> min_zs; + if (!snapshot_type.empty()) { + for (int i = 0; i < static_cast(m_model->objects.size()); ++i) { + const ModelObject* obj = m_model->objects[i]; + for (int j = 0; j < static_cast(obj->instances.size()); ++j) { + min_zs[{ i, j }] = obj->instance_bounding_box(j).min.z(); + } + } + } + + std::set> done; // keeps track of modified instances + + Selection::EMode selection_mode = m_selection.get_mode(); + + for (const GLVolume* v : m_volumes.volumes) { + int object_idx = v->object_idx(); + if (object_idx < 0 || (int)m_model->objects.size() <= object_idx) + continue; + + int instance_idx = v->instance_idx(); + int volume_idx = v->volume_idx(); + + done.insert(std::pair(object_idx, instance_idx)); + + // Mirror instances/volumes + ModelObject* model_object = m_model->objects[object_idx]; + if (model_object != nullptr) { + if (selection_mode == Selection::Instance) + model_object->instances[instance_idx]->set_transformation(v->get_instance_transformation()); + else if (selection_mode == Selection::Volume) + model_object->volumes[volume_idx]->set_transformation(v->get_volume_transformation()); + model_object->invalidate_bounding_box(); + } + } + + // Fixes sinking/flying instances + for (const std::pair& i : done) { + ModelObject* m = m_model->objects[i.first]; + double shift_z = m->get_instance_min_z(i.second); + // leave sinking instances as sinking + if (min_zs.empty() || min_zs.find({ i.first, i.second })->second >= SINKING_Z_THRESHOLD || shift_z > SINKING_Z_THRESHOLD) { + Vec3d shift(0.0, 0.0, -shift_z); + m_selection.translate(i.first, i.second, shift); + m->translate_instance(i.second, shift); + } + wxGetApp().obj_list()->update_info_items(static_cast(i.first)); + } + + post_event(SimpleEvent(EVT_GLCANVAS_RESET_SKEW)); + + m_dirty = true; +} + +void GLCanvas3D::update_gizmos_on_off_state() +{ + set_as_dirty(); + m_gizmos.update_data(); + m_gizmos.refresh_on_off_state(); +} + +void GLCanvas3D::handle_sidebar_focus_event(const std::string& opt_key, bool focus_on) +{ + m_sidebar_field = focus_on ? opt_key : ""; + if (!m_sidebar_field.empty()) + m_gizmos.reset_all_states(); + + m_dirty = true; +} + +void GLCanvas3D::handle_layers_data_focus_event(const t_layer_height_range range, const EditorType type) +{ + std::string field = "layer_" + std::to_string(type) + "_" + float_to_string_decimal_point(range.first) + "_" + float_to_string_decimal_point(range.second); + handle_sidebar_focus_event(field, true); +} + +void GLCanvas3D::update_ui_from_settings() +{ + m_dirty = true; + +#if __APPLE__ + // Update OpenGL scaling on OSX after the user toggled the "use_retina_opengl" settings in Preferences dialog. + const float orig_scaling = m_retina_helper->get_scale_factor(); + + const bool use_retina = wxGetApp().app_config->get_bool("use_retina_opengl"); + BOOST_LOG_TRIVIAL(debug) << "GLCanvas3D: Use Retina OpenGL: " << use_retina; + m_retina_helper->set_use_retina(use_retina); + const float new_scaling = m_retina_helper->get_scale_factor(); + + if (new_scaling != orig_scaling) { + BOOST_LOG_TRIVIAL(debug) << "GLCanvas3D: Scaling factor: " << new_scaling; + + Camera& camera = wxGetApp().plater()->get_camera(); + camera.set_zoom(camera.get_zoom() * new_scaling / orig_scaling); + _refresh_if_shown_on_screen(); + } +#endif // ENABLE_RETINA_GL + + if (wxGetApp().is_editor()) + wxGetApp().plater()->enable_collapse_toolbar(wxGetApp().app_config->get_bool("show_collapse_button")); +} + +GLCanvas3D::WipeTowerInfo GLCanvas3D::get_wipe_tower_info() const +{ + WipeTowerInfo wti; + + for (const GLVolume* vol : m_volumes.volumes) { + if (vol->is_wipe_tower) { + wti.m_pos = Vec2d(m_config->opt_float("wipe_tower_x"), + m_config->opt_float("wipe_tower_y")); + wti.m_rotation = (M_PI/180.) * m_config->opt_float("wipe_tower_rotation_angle"); + const BoundingBoxf3& bb = vol->bounding_box(); + wti.m_bb = BoundingBoxf{to_2d(bb.min), to_2d(bb.max)}; + break; + } + } + + return wti; +} + +Linef3 GLCanvas3D::mouse_ray(const Point& mouse_pos) +{ + float z0 = 0.0f; + float z1 = 1.0f; + return Linef3(_mouse_to_3d(mouse_pos, &z0), _mouse_to_3d(mouse_pos, &z1)); +} + +double GLCanvas3D::get_size_proportional_to_max_bed_size(double factor) const +{ + const BoundingBoxf& bbox = m_bed.build_volume().bounding_volume2d(); + return factor * std::max(bbox.size()[0], bbox.size()[1]); +} + +void GLCanvas3D::set_cursor(ECursorType type) +{ + if ((m_canvas != nullptr) && (m_cursor_type != type)) + { + switch (type) + { + case Standard: { m_canvas->SetCursor(*wxSTANDARD_CURSOR); break; } + case Cross: { m_canvas->SetCursor(*wxCROSS_CURSOR); break; } + } + + m_cursor_type = type; + } +} + +void GLCanvas3D::msw_rescale() +{ + m_gcode_viewer.invalidate_legend(); +} + +void GLCanvas3D::update_tooltip_for_settings_item_in_main_toolbar() +{ + std::string new_tooltip = _u8L("Switch to Settings") + + "\n" + "[" + GUI::shortkey_ctrl_prefix() + "2] - " + _u8L("Print Settings Tab") + + "\n" + "[" + GUI::shortkey_ctrl_prefix() + "3] - " + (current_printer_technology() == ptFFF ? _u8L("Filament Settings Tab") : _u8L("Material Settings Tab")) + + "\n" + "[" + GUI::shortkey_ctrl_prefix() + "4] - " + _u8L("Printer Settings Tab") ; + + m_main_toolbar.set_tooltip(get_main_toolbar_item_id("settings"), new_tooltip); +} + +bool GLCanvas3D::has_toolpaths_to_export() const +{ + return m_gcode_viewer.can_export_toolpaths(); +} + +void GLCanvas3D::export_toolpaths_to_obj(const char* filename) const +{ + m_gcode_viewer.export_toolpaths_to_obj(filename); +} + +void GLCanvas3D::mouse_up_cleanup() +{ + m_moving = false; + m_mouse.drag.move_volume_idx = -1; + m_mouse.set_start_position_3D_as_invalid(); + m_mouse.set_start_position_2D_as_invalid(); + m_mouse.dragging = false; + m_mouse.ignore_left_up = false; + m_dirty = true; + + if (m_canvas->HasCapture()) + m_canvas->ReleaseMouse(); +} + +void GLCanvas3D::update_sequential_clearance() +{ + if (current_printer_technology() != ptFFF || !fff_print()->config().complete_objects) + return; + + if (m_layers_editing.is_enabled() || m_gizmos.is_dragging()) + return; + + // collects instance transformations from volumes + // first define temporary cache + unsigned int instances_count = 0; + std::vector>> instance_transforms; + for (size_t obj = 0; obj < m_model->objects.size(); ++obj) { + instance_transforms.emplace_back(std::vector>()); + const ModelObject* model_object = m_model->objects[obj]; + for (size_t i = 0; i < model_object->instances.size(); ++i) { + instance_transforms[obj].emplace_back(std::optional()); + ++instances_count; + } + } + + if (instances_count == 1) + return; + + // second fill temporary cache with data from volumes + for (const GLVolume* v : m_volumes.volumes) { + if (v->is_modifier || v->is_wipe_tower) + continue; + + auto& transform = instance_transforms[v->object_idx()][v->instance_idx()]; + if (!transform.has_value()) + transform = v->get_instance_transformation(); + } + + // calculates objects 2d hulls (see also: Print::sequential_print_horizontal_clearance_valid()) + // this is done only the first time this method is called while moving the mouse, + // the results are then cached for following displacements + if (m_sequential_print_clearance_first_displacement) { + m_sequential_print_clearance.m_hull_2d_cache.clear(); + const float shrink_factor = static_cast(scale_(0.5 * fff_print()->config().extruder_clearance_radius.value - EPSILON)); + const double mitter_limit = scale_(0.1); + m_sequential_print_clearance.m_hull_2d_cache.reserve(m_model->objects.size()); + for (size_t i = 0; i < m_model->objects.size(); ++i) { + ModelObject* model_object = m_model->objects[i]; + ModelInstance* model_instance0 = model_object->instances.front(); + Geometry::Transformation trafo = model_instance0->get_transformation(); + trafo.set_offset({ 0.0, 0.0, model_instance0->get_offset().z() }); + const Polygon hull_2d = offset(model_object->convex_hull_2d(trafo.get_matrix()), + // Shrink the extruder_clearance_radius a tiny bit, so that if the object arrangement algorithm placed the objects + // exactly by satisfying the extruder_clearance_radius, this test will not trigger collision. + shrink_factor, + jtRound, mitter_limit).front(); + + Pointf3s& cache_hull_2d = m_sequential_print_clearance.m_hull_2d_cache.emplace_back(Pointf3s()); + cache_hull_2d.reserve(hull_2d.points.size()); + const Transform3d inv_trafo = trafo.get_matrix().inverse(); + for (const Point& p : hull_2d.points) { + cache_hull_2d.emplace_back(inv_trafo * Vec3d(unscale(p.x()), unscale(p.y()), 0.0)); + } + } + m_sequential_print_clearance_first_displacement = false; + } + + // calculates instances 2d hulls (see also: Print::sequential_print_horizontal_clearance_valid()) + Polygons polygons; + polygons.reserve(instances_count); + for (size_t i = 0; i < instance_transforms.size(); ++i) { + const auto& instances = instance_transforms[i]; + for (const auto& instance : instances) { + const Transform3d& trafo = instance->get_matrix(); + const Pointf3s& hull_2d = m_sequential_print_clearance.m_hull_2d_cache[i]; + Points inst_pts; + inst_pts.reserve(hull_2d.size()); + for (size_t j = 0; j < hull_2d.size(); ++j) { + const Vec3d p = trafo * hull_2d[j]; + inst_pts.emplace_back(scaled(p.x()), scaled(p.y())); + } + polygons.emplace_back(Geometry::convex_hull(std::move(inst_pts))); + } + } + + // sends instances 2d hulls to be rendered + set_sequential_print_clearance_visible(true); + set_sequential_print_clearance_render_fill(false); + set_sequential_print_clearance_polygons(polygons); +} + +bool GLCanvas3D::is_object_sinking(int object_idx) const +{ + for (const GLVolume* v : m_volumes.volumes) { + if (v->object_idx() == object_idx && (v->is_sinking() || (!v->is_modifier && v->is_below_printbed()))) + return true; + } + return false; +} + +void GLCanvas3D::apply_retina_scale(Vec2d &screen_coordinate) const +{ +#if ENABLE_RETINA_GL + double scale = static_cast(m_retina_helper->get_scale_factor()); + screen_coordinate *= scale; +#endif // ENABLE_RETINA_GL +} + +std::pair> GLCanvas3D::get_layers_height_data(int object_id) +{ + m_layers_editing.select_object(*m_model, object_id); + std::pair> ret = m_layers_editing.get_layers_height_data(); + m_layers_editing.select_object(*m_model, -1); + return ret; +} + +bool GLCanvas3D::_is_shown_on_screen() const +{ + return (m_canvas != nullptr) ? m_canvas->IsShownOnScreen() : false; +} + +// Getter for the const char*[] +static bool string_getter(const bool is_undo, int idx, const char** out_text) +{ + return wxGetApp().plater()->undo_redo_string_getter(is_undo, idx, out_text); +} + +bool GLCanvas3D::_render_undo_redo_stack(const bool is_undo, float pos_x) +{ + bool action_taken = false; + + ImGuiWrapper* imgui = wxGetApp().imgui(); + + imgui->set_next_window_pos(pos_x, m_undoredo_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); + std::string title = is_undo ? L("Undo History") : L("Redo History"); + imgui->begin(_(title), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); + + int hovered = m_imgui_undo_redo_hovered_pos; + int selected = -1; + float em = static_cast(wxGetApp().em_unit()); +#if ENABLE_RETINA_GL + em *= m_retina_helper->get_scale_factor(); +#endif + + if (imgui->undo_redo_list(ImVec2(18 * em, 26 * em), is_undo, &string_getter, hovered, selected, m_mouse_wheel)) + m_imgui_undo_redo_hovered_pos = hovered; + else + m_imgui_undo_redo_hovered_pos = -1; + + if (selected >= 0) { + is_undo ? wxGetApp().plater()->undo_to(selected) : wxGetApp().plater()->redo_to(selected); + action_taken = true; + } + + imgui->text(wxString::Format(is_undo ? _L_PLURAL("Undo %1$d Action", "Undo %1$d Actions", hovered + 1) : _L_PLURAL("Redo %1$d Action", "Redo %1$d Actions", hovered + 1), hovered + 1)); + + imgui->end(); + + return action_taken; +} + +// Getter for the const char*[] for the search list +static bool search_string_getter(int idx, const char** label, const char** tooltip) +{ + return wxGetApp().plater()->search_string_getter(idx, label, tooltip); +} + +bool GLCanvas3D::_render_search_list(float pos_x) +{ + bool action_taken = false; + ImGuiWrapper* imgui = wxGetApp().imgui(); + + imgui->set_next_window_pos(pos_x, m_main_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); + std::string title = L("Search"); + imgui->begin(_(title), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); + + int selected = -1; + bool edited = false; + float em = static_cast(wxGetApp().em_unit()); +#if ENABLE_RETINA_GL + em *= m_retina_helper->get_scale_factor(); +#endif // ENABLE_RETINA_GL + + Sidebar& sidebar = wxGetApp().sidebar(); + + std::string& search_line = sidebar.get_search_line(); + char *s = new char[255]; + strcpy(s, search_line.empty() ? _u8L("Enter a search term").c_str() : search_line.c_str()); + + imgui->search_list(ImVec2(45 * em, 30 * em), &search_string_getter, s, + sidebar.get_searcher().view_params, + selected, edited, m_mouse_wheel, wxGetApp().is_localized()); + + search_line = s; + delete [] s; + if (search_line == _u8L("Enter a search term")) + search_line.clear(); + + if (edited) + sidebar.search(); + + if (selected >= 0) { + // selected == 9999 means that Esc kye was pressed + /*// revert commit https://github.com/prusa3d/PrusaSlicer/commit/91897589928789b261ca0dc735ffd46f2b0b99f2 + if (selected == 9999) + action_taken = true; + else + sidebar.jump_to_option(selected);*/ + if (selected != 9999) { + imgui->end(); // end imgui before the jump to option + sidebar.jump_to_option(selected); + return true; + } + action_taken = true; + } + + imgui->end(); + + return action_taken; +} + +bool GLCanvas3D::_render_arrange_menu(float pos_x) +{ + ImGuiWrapper *imgui = wxGetApp().imgui(); + + imgui->set_next_window_pos(pos_x, m_main_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); + + imgui->begin(_L("Arrange options"), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse); + + ArrangeSettings settings = get_arrange_settings(); + ArrangeSettings &settings_out = get_arrange_settings_ref(this); + + auto &appcfg = wxGetApp().app_config; + PrinterTechnology ptech = current_printer_technology(); + + bool settings_changed = false; + float dist_min = 0.f; + float dist_bed_min = 0.f; + std::string dist_key = "min_object_distance"; + std::string dist_bed_key = "min_bed_distance"; + std::string rot_key = "enable_rotation"; + std::string align_key = "alignment"; + std::string postfix; + + if (ptech == ptSLA) { + postfix = "_sla"; + } else if (ptech == ptFFF) { + auto co_opt = m_config->option("complete_objects"); + if (co_opt && co_opt->value) { + dist_min = float(min_object_distance(*m_config)); + postfix = "_fff_seq_print"; + } else { + dist_min = 0.f; + postfix = "_fff"; + } + } + + dist_key += postfix; + dist_bed_key += postfix; + rot_key += postfix; + align_key += postfix; + + imgui->text(GUI::format_wxstr(_L("Press %1%left mouse button to enter the exact value"), shortkey_ctrl_prefix())); + + if (imgui->slider_float(_L("Spacing"), &settings.distance, dist_min, 100.0f, "%5.2f") || dist_min > settings.distance) { + settings.distance = std::max(dist_min, settings.distance); + settings_out.distance = settings.distance; + appcfg->set("arrange", dist_key.c_str(), float_to_string_decimal_point(settings_out.distance)); + settings_changed = true; + } + + if (imgui->slider_float(_L("Spacing from bed"), &settings.distance_from_bed, dist_bed_min, 100.0f, "%5.2f") || dist_bed_min > settings.distance_from_bed) { + settings.distance_from_bed = std::max(dist_bed_min, settings.distance_from_bed); + settings_out.distance_from_bed = settings.distance_from_bed; + appcfg->set("arrange", dist_bed_key.c_str(), float_to_string_decimal_point(settings_out.distance_from_bed)); + settings_changed = true; + } + + if (imgui->checkbox(_L("Enable rotations (slow)"), settings.enable_rotation)) { + settings_out.enable_rotation = settings.enable_rotation; + appcfg->set("arrange", rot_key.c_str(), settings_out.enable_rotation? "1" : "0"); + settings_changed = true; + } + + Points bed = m_config ? get_bed_shape(*m_config) : Points{}; + + if (arrangement::is_box(bed) && settings.alignment >= 0 && + imgui->combo(_L("Alignment"), {_u8L("Center"), _u8L("Rear left"), _u8L("Front left"), _u8L("Front right"), _u8L("Rear right"), _u8L("Random") }, settings.alignment)) { + settings_out.alignment = settings.alignment; + appcfg->set("arrange", align_key.c_str(), std::to_string(settings_out.alignment)); + settings_changed = true; + } + + ImGui::Separator(); + + if (imgui->button(_L("Reset"))) { + auto alignment = settings_out.alignment; + settings_out = ArrangeSettings{}; + settings_out.distance = std::max(dist_min, settings_out.distance); + + // Default alignment for XL printers set explicitly: + if (is_arrange_alignment_enabled()) + settings_out.alignment = static_cast(arrangement::Pivots::BottomLeft); + else + settings_out.alignment = alignment; + + appcfg->set("arrange", dist_key.c_str(), float_to_string_decimal_point(settings_out.distance)); + appcfg->set("arrange", dist_bed_key.c_str(), float_to_string_decimal_point(settings_out.distance_from_bed)); + appcfg->set("arrange", rot_key.c_str(), settings_out.enable_rotation? "1" : "0"); + settings_changed = true; + } + + ImGui::SameLine(); + + if (imgui->button(_L("Arrange"))) { + wxGetApp().plater()->arrange(); + } + + imgui->end(); + + return settings_changed; +} + +#define ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT 0 +#if ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT +static void debug_output_thumbnail(const ThumbnailData& thumbnail_data) +{ + // debug export of generated image + wxImage image(thumbnail_data.width, thumbnail_data.height); + image.InitAlpha(); + + for (unsigned int r = 0; r < thumbnail_data.height; ++r) + { + unsigned int rr = (thumbnail_data.height - 1 - r) * thumbnail_data.width; + for (unsigned int c = 0; c < thumbnail_data.width; ++c) + { + unsigned char* px = (unsigned char*)thumbnail_data.pixels.data() + 4 * (rr + c); + image.SetRGB((int)c, (int)r, px[0], px[1], px[2]); + image.SetAlpha((int)c, (int)r, px[3]); + } + } + + image.SaveFile("C:/prusa/test/test.png", wxBITMAP_TYPE_PNG); +} +#endif // ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT + +void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, const ThumbnailsParams& thumbnail_params, const GLVolumeCollection& volumes, Camera::EType camera_type) +{ + auto is_visible = [](const GLVolume& v) { + bool ret = v.printable; + ret &= (!v.shader_outside_printer_detection_enabled || !v.is_outside); + return ret; + }; + + GLVolumePtrs visible_volumes; + + for (GLVolume* vol : volumes.volumes) { + if (!vol->is_modifier && !vol->is_wipe_tower && (!thumbnail_params.parts_only || vol->composite_id.volume_id >= 0)) { + if (!thumbnail_params.printable_only || is_visible(*vol)) + visible_volumes.emplace_back(vol); + } + } + + BoundingBoxf3 volumes_box; + if (!visible_volumes.empty()) { + for (const GLVolume* vol : visible_volumes) { + volumes_box.merge(vol->transformed_bounding_box()); + } + } + else + // This happens for empty projects + volumes_box = m_bed.extended_bounding_box(); + + Camera camera; + camera.set_type(camera_type); + camera.set_scene_box(scene_bounding_box()); + camera.set_viewport(0, 0, thumbnail_data.width, thumbnail_data.height); + camera.apply_viewport(); + camera.zoom_to_box(volumes_box); + + const Transform3d& view_matrix = camera.get_view_matrix(); + + double near_z = -1.0; + double far_z = -1.0; + + if (thumbnail_params.show_bed) { + // extends the near and far z of the frustrum to avoid the bed being clipped + + // box in eye space + const BoundingBoxf3 t_bed_box = m_bed.extended_bounding_box().transformed(view_matrix); + near_z = -t_bed_box.max.z(); + far_z = -t_bed_box.min.z(); + } + + camera.apply_projection(volumes_box, near_z, far_z); + + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); + if (shader == nullptr) + return; + + if (thumbnail_params.transparent_background) + glsafe(::glClearColor(0.0f, 0.0f, 0.0f, 0.0f)); + + glsafe(::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); + glsafe(::glEnable(GL_DEPTH_TEST)); + + shader->start_using(); + shader->set_uniform("emission_factor", 0.0f); + + const Transform3d& projection_matrix = camera.get_projection_matrix(); + + for (GLVolume* vol : visible_volumes) { + vol->model.set_color((vol->printable && !vol->is_outside) ? (current_printer_technology() == ptSLA ? vol->color : ColorRGBA::ORANGE()) : ColorRGBA::GRAY()); + // the volume may have been deactivated by an active gizmo + const bool is_active = vol->is_active; + vol->is_active = true; + const Transform3d model_matrix = vol->world_matrix(); + shader->set_uniform("view_model_matrix", view_matrix * model_matrix); + shader->set_uniform("projection_matrix", projection_matrix); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); + vol->render(); + vol->is_active = is_active; + } + + shader->stop_using(); + + glsafe(::glDisable(GL_DEPTH_TEST)); + + if (thumbnail_params.show_bed) + _render_bed(view_matrix, projection_matrix, !camera.is_looking_downward()); + + // restore background color + if (thumbnail_params.transparent_background) + glsafe(::glClearColor(1.0f, 1.0f, 1.0f, 1.0f)); +} + +void GLCanvas3D::_render_thumbnail_framebuffer(ThumbnailData& thumbnail_data, unsigned int w, unsigned int h, const ThumbnailsParams& thumbnail_params, const GLVolumeCollection& volumes, Camera::EType camera_type) +{ + thumbnail_data.set(w, h); + if (!thumbnail_data.is_valid()) + return; + + bool multisample = m_multisample_allowed; + if (multisample) + glsafe(::glEnable(GL_MULTISAMPLE)); + + GLint max_samples; + glsafe(::glGetIntegerv(GL_MAX_SAMPLES, &max_samples)); + GLsizei num_samples = max_samples / 2; + + GLuint render_fbo; + glsafe(::glGenFramebuffers(1, &render_fbo)); + glsafe(::glBindFramebuffer(GL_FRAMEBUFFER, render_fbo)); + + GLuint render_tex = 0; + GLuint render_tex_buffer = 0; + if (multisample) { + // use renderbuffer instead of texture to avoid the need to use glTexImage2DMultisample which is available only since OpenGL 3.2 + glsafe(::glGenRenderbuffers(1, &render_tex_buffer)); + glsafe(::glBindRenderbuffer(GL_RENDERBUFFER, render_tex_buffer)); + glsafe(::glRenderbufferStorageMultisample(GL_RENDERBUFFER, num_samples, GL_RGBA8, w, h)); + glsafe(::glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, render_tex_buffer)); + } + else { + glsafe(::glGenTextures(1, &render_tex)); + glsafe(::glBindTexture(GL_TEXTURE_2D, render_tex)); + glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); + glsafe(::glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, render_tex, 0)); + } + + GLuint render_depth; + glsafe(::glGenRenderbuffers(1, &render_depth)); + glsafe(::glBindRenderbuffer(GL_RENDERBUFFER, render_depth)); + if (multisample) + glsafe(::glRenderbufferStorageMultisample(GL_RENDERBUFFER, num_samples, GL_DEPTH_COMPONENT24, w, h)); + else + glsafe(::glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, w, h)); + + glsafe(::glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, render_depth)); + + GLenum drawBufs[] = { GL_COLOR_ATTACHMENT0 }; + glsafe(::glDrawBuffers(1, drawBufs)); + + if (::glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE) { + _render_thumbnail_internal(thumbnail_data, thumbnail_params, volumes, camera_type); + + if (multisample) { + GLuint resolve_fbo; + glsafe(::glGenFramebuffers(1, &resolve_fbo)); + glsafe(::glBindFramebuffer(GL_FRAMEBUFFER, resolve_fbo)); + + GLuint resolve_tex; + glsafe(::glGenTextures(1, &resolve_tex)); + glsafe(::glBindTexture(GL_TEXTURE_2D, resolve_tex)); + glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); + glsafe(::glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolve_tex, 0)); + + glsafe(::glDrawBuffers(1, drawBufs)); + + if (::glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE) { + glsafe(::glBindFramebuffer(GL_READ_FRAMEBUFFER, render_fbo)); + glsafe(::glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolve_fbo)); + glsafe(::glBlitFramebuffer(0, 0, w, h, 0, 0, w, h, GL_COLOR_BUFFER_BIT, GL_LINEAR)); + + glsafe(::glBindFramebuffer(GL_READ_FRAMEBUFFER, resolve_fbo)); + glsafe(::glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, (void*)thumbnail_data.pixels.data())); + } + + glsafe(::glDeleteTextures(1, &resolve_tex)); + glsafe(::glDeleteFramebuffers(1, &resolve_fbo)); + } + else + glsafe(::glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, (void*)thumbnail_data.pixels.data())); + +#if ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT + debug_output_thumbnail(thumbnail_data); +#endif // ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT + } + + glsafe(::glBindFramebuffer(GL_FRAMEBUFFER, 0)); + glsafe(::glDeleteRenderbuffers(1, &render_depth)); + if (render_tex_buffer != 0) + glsafe(::glDeleteRenderbuffers(1, &render_tex_buffer)); + if (render_tex != 0) + glsafe(::glDeleteTextures(1, &render_tex)); + glsafe(::glDeleteFramebuffers(1, &render_fbo)); + + if (multisample) + glsafe(::glDisable(GL_MULTISAMPLE)); +} + +void GLCanvas3D::_render_thumbnail_framebuffer_ext(ThumbnailData& thumbnail_data, unsigned int w, unsigned int h, const ThumbnailsParams& thumbnail_params, const GLVolumeCollection& volumes, Camera::EType camera_type) +{ + thumbnail_data.set(w, h); + if (!thumbnail_data.is_valid()) + return; + + bool multisample = m_multisample_allowed; + if (multisample) + glsafe(::glEnable(GL_MULTISAMPLE)); + + GLint max_samples; + glsafe(::glGetIntegerv(GL_MAX_SAMPLES_EXT, &max_samples)); + GLsizei num_samples = max_samples / 2; + + GLuint render_fbo; + glsafe(::glGenFramebuffersEXT(1, &render_fbo)); + glsafe(::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, render_fbo)); + + GLuint render_tex = 0; + GLuint render_tex_buffer = 0; + if (multisample) { + // use renderbuffer instead of texture to avoid the need to use glTexImage2DMultisample which is available only since OpenGL 3.2 + glsafe(::glGenRenderbuffersEXT(1, &render_tex_buffer)); + glsafe(::glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, render_tex_buffer)); + glsafe(::glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, num_samples, GL_RGBA8, w, h)); + glsafe(::glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, render_tex_buffer)); + } + else { + glsafe(::glGenTextures(1, &render_tex)); + glsafe(::glBindTexture(GL_TEXTURE_2D, render_tex)); + glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); + glsafe(::glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, render_tex, 0)); + } + + GLuint render_depth; + glsafe(::glGenRenderbuffersEXT(1, &render_depth)); + glsafe(::glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, render_depth)); + if (multisample) + glsafe(::glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, num_samples, GL_DEPTH_COMPONENT24, w, h)); + else + glsafe(::glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, w, h)); + + glsafe(::glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, render_depth)); + + GLenum drawBufs[] = { GL_COLOR_ATTACHMENT0 }; + glsafe(::glDrawBuffers(1, drawBufs)); + + if (::glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) == GL_FRAMEBUFFER_COMPLETE_EXT) { + _render_thumbnail_internal(thumbnail_data, thumbnail_params, volumes, camera_type); + + if (multisample) { + GLuint resolve_fbo; + glsafe(::glGenFramebuffersEXT(1, &resolve_fbo)); + glsafe(::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, resolve_fbo)); + + GLuint resolve_tex; + glsafe(::glGenTextures(1, &resolve_tex)); + glsafe(::glBindTexture(GL_TEXTURE_2D, resolve_tex)); + glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); + glsafe(::glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, resolve_tex, 0)); + + glsafe(::glDrawBuffers(1, drawBufs)); + + if (::glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) == GL_FRAMEBUFFER_COMPLETE_EXT) { + glsafe(::glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, render_fbo)); + glsafe(::glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, resolve_fbo)); + glsafe(::glBlitFramebufferEXT(0, 0, w, h, 0, 0, w, h, GL_COLOR_BUFFER_BIT, GL_LINEAR)); + + glsafe(::glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, resolve_fbo)); + glsafe(::glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, (void*)thumbnail_data.pixels.data())); + } + + glsafe(::glDeleteTextures(1, &resolve_tex)); + glsafe(::glDeleteFramebuffersEXT(1, &resolve_fbo)); + } + else + glsafe(::glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, (void*)thumbnail_data.pixels.data())); + +#if ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT + debug_output_thumbnail(thumbnail_data); +#endif // ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT + } + + glsafe(::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0)); + glsafe(::glDeleteRenderbuffersEXT(1, &render_depth)); + if (render_tex_buffer != 0) + glsafe(::glDeleteRenderbuffersEXT(1, &render_tex_buffer)); + if (render_tex != 0) + glsafe(::glDeleteTextures(1, &render_tex)); + glsafe(::glDeleteFramebuffersEXT(1, &render_fbo)); + + if (multisample) + glsafe(::glDisable(GL_MULTISAMPLE)); +} + +void GLCanvas3D::_render_thumbnail_legacy(ThumbnailData& thumbnail_data, unsigned int w, unsigned int h, const ThumbnailsParams& thumbnail_params, const GLVolumeCollection& volumes, Camera::EType camera_type) +{ + // check that thumbnail size does not exceed the default framebuffer size + const Size& cnv_size = get_canvas_size(); + unsigned int cnv_w = (unsigned int)cnv_size.get_width(); + unsigned int cnv_h = (unsigned int)cnv_size.get_height(); + if (w > cnv_w || h > cnv_h) { + float ratio = std::min((float)cnv_w / (float)w, (float)cnv_h / (float)h); + w = (unsigned int)(ratio * (float)w); + h = (unsigned int)(ratio * (float)h); + } + + thumbnail_data.set(w, h); + if (!thumbnail_data.is_valid()) + return; + + _render_thumbnail_internal(thumbnail_data, thumbnail_params, volumes, camera_type); + + glsafe(::glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, (void*)thumbnail_data.pixels.data())); +#if ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT + debug_output_thumbnail(thumbnail_data); +#endif // ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT + + // restore the default framebuffer size to avoid flickering on the 3D scene + wxGetApp().plater()->get_camera().apply_viewport(); +} + +bool GLCanvas3D::_init_toolbars() +{ + if (!_init_main_toolbar()) + return false; + + if (!_init_undoredo_toolbar()) + return false; + + if (!_init_view_toolbar()) + return false; + + if (!_init_collapse_toolbar()) + return false; + + return true; +} + +bool GLCanvas3D::_init_main_toolbar() +{ + if (!m_main_toolbar.is_enabled()) + return true; + + BackgroundTexture::Metadata background_data; + background_data.filename = "toolbar_background.png"; + background_data.left = 16; + background_data.top = 16; + background_data.right = 16; + background_data.bottom = 16; + + if (!m_main_toolbar.init(background_data)) { + // unable to init the toolbar texture, disable it + m_main_toolbar.set_enabled(false); + return true; + } + // init arrow + if (!m_main_toolbar.init_arrow("toolbar_arrow_2.svg")) + BOOST_LOG_TRIVIAL(error) << "Main toolbar failed to load arrow texture."; + + // m_gizmos is created at constructor, thus we can init arrow here. + if (!m_gizmos.init_arrow("toolbar_arrow_2.svg")) + BOOST_LOG_TRIVIAL(error) << "Gizmos manager failed to load arrow texture."; + +// m_main_toolbar.set_layout_type(GLToolbar::Layout::Vertical); + m_main_toolbar.set_layout_type(GLToolbar::Layout::Horizontal); + m_main_toolbar.set_horizontal_orientation(GLToolbar::Layout::HO_Right); + m_main_toolbar.set_vertical_orientation(GLToolbar::Layout::VO_Top); + m_main_toolbar.set_border(5.0f); + m_main_toolbar.set_separator_size(5); + m_main_toolbar.set_gap_size(4); + + GLToolbarItem::Data item; + + item.name = "add"; + item.icon_filename = "add.svg"; + item.tooltip = _u8L("Add...") + " [" + GUI::shortkey_ctrl_prefix() + "I]"; + item.sprite_id = 0; + item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_ADD)); }; + if (!m_main_toolbar.add_item(item)) + return false; + + item.name = "delete"; + item.icon_filename = "remove.svg"; + item.tooltip = _u8L("Delete") + " [Del]"; + item.sprite_id = 1; + item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_DELETE)); }; + item.enabling_callback = []()->bool { return wxGetApp().plater()->can_delete(); }; + if (!m_main_toolbar.add_item(item)) + return false; + + item.name = "deleteall"; + item.icon_filename = "delete_all.svg"; + item.tooltip = _u8L("Delete all") + " [" + GUI::shortkey_ctrl_prefix() + "Del]"; + item.sprite_id = 2; + item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_DELETE_ALL)); }; + item.enabling_callback = []()->bool { return wxGetApp().plater()->can_delete_all(); }; + if (!m_main_toolbar.add_item(item)) + return false; + + item.name = "arrange"; + item.icon_filename = "arrange.svg"; + item.tooltip = _u8L("Arrange") + " [A]\n" + _u8L("Arrange selection") + " [Shift+A]\n" + _u8L("Click right mouse button to show arrangement options"); + item.sprite_id = 3; + item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_ARRANGE)); }; + item.enabling_callback = []()->bool { return wxGetApp().plater()->can_arrange(); }; + item.right.toggable = true; + item.right.render_callback = [this](float left, float right, float, float) { + if (m_canvas != nullptr) + _render_arrange_menu(0.5f * (left + right)); + }; + if (!m_main_toolbar.add_item(item)) + return false; + + item.right.toggable = false; + item.right.render_callback = GLToolbarItem::Default_Render_Callback; + + if (!m_main_toolbar.add_separator()) + return false; + + item.name = "copy"; + item.icon_filename = "copy.svg"; + item.tooltip = _u8L("Copy") + " [" + GUI::shortkey_ctrl_prefix() + "C]"; + item.sprite_id = 4; + item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_COPY)); }; + item.enabling_callback = []()->bool { return wxGetApp().plater()->can_copy_to_clipboard(); }; + if (!m_main_toolbar.add_item(item)) + return false; + + item.name = "paste"; + item.icon_filename = "paste.svg"; + item.tooltip = _u8L("Paste") + " [" + GUI::shortkey_ctrl_prefix() + "V]"; + item.sprite_id = 5; + item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_PASTE)); }; + item.enabling_callback = []()->bool { return wxGetApp().plater()->can_paste_from_clipboard(); }; + if (!m_main_toolbar.add_item(item)) + return false; + + if (!m_main_toolbar.add_separator()) + return false; + + item.name = "more"; + item.icon_filename = "instance_add.svg"; + item.tooltip = _u8L("Add instance") + " [+]"; + item.sprite_id = 6; + item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_MORE)); }; + item.visibility_callback = []()->bool { return wxGetApp().get_mode() != comSimple; }; + item.enabling_callback = []()->bool { return wxGetApp().plater()->can_increase_instances(); }; + + if (!m_main_toolbar.add_item(item)) + return false; + + item.name = "fewer"; + item.icon_filename = "instance_remove.svg"; + item.tooltip = _u8L("Remove instance") + " [-]"; + item.sprite_id = 7; + item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_FEWER)); }; + item.visibility_callback = []()->bool { return wxGetApp().get_mode() != comSimple; }; + item.enabling_callback = []()->bool { return wxGetApp().plater()->can_decrease_instances(); }; + if (!m_main_toolbar.add_item(item)) + return false; + + if (!m_main_toolbar.add_separator()) + return false; + + item.name = "splitobjects"; + item.icon_filename = "split_objects.svg"; + item.tooltip = _u8L("Split to objects"); + item.sprite_id = 8; + item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_SPLIT_OBJECTS)); }; + item.visibility_callback = GLToolbarItem::Default_Visibility_Callback; + item.enabling_callback = []()->bool { return wxGetApp().plater()->can_split_to_objects(); }; + if (!m_main_toolbar.add_item(item)) + return false; + + item.name = "splitvolumes"; + item.icon_filename = "split_parts.svg"; + item.tooltip = _u8L("Split to parts"); + item.sprite_id = 9; + item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_SPLIT_VOLUMES)); }; + item.visibility_callback = []()->bool { return wxGetApp().get_mode() != comSimple; }; + item.enabling_callback = []()->bool { return wxGetApp().plater()->can_split_to_volumes(); }; + if (!m_main_toolbar.add_item(item)) + return false; + + if (!m_main_toolbar.add_separator()) + return false; + + item.name = "settings"; + item.icon_filename = "settings.svg"; + item.tooltip = _u8L("Switch to Settings") + "\n" + "[" + GUI::shortkey_ctrl_prefix() + "2] - " + _u8L("Print Settings Tab") + + "\n" + "[" + GUI::shortkey_ctrl_prefix() + "3] - " + (current_printer_technology() == ptFFF ? _u8L("Filament Settings Tab") : _u8L("Material Settings Tab") + + "\n" + "[" + GUI::shortkey_ctrl_prefix() + "4] - " + _u8L("Printer Settings Tab")) ; + item.sprite_id = 10; + item.enabling_callback = GLToolbarItem::Default_Enabling_Callback; + item.visibility_callback = []() { return wxGetApp().app_config->get_bool("new_settings_layout_mode") || + wxGetApp().app_config->get_bool("dlg_settings_layout_mode"); }; + item.left.action_callback = []() { wxGetApp().mainframe->select_tab(); }; + if (!m_main_toolbar.add_item(item)) + return false; + + /* + if (!m_main_toolbar.add_separator()) + return false; + */ + + item.name = "search"; + item.icon_filename = "search_.svg"; + item.tooltip = _u8L("Search") + " [" + GUI::shortkey_ctrl_prefix() + "F]"; + item.sprite_id = 11; + item.left.toggable = true; + item.left.render_callback = [this](float left, float right, float, float) { + if (m_canvas != nullptr) { + if (!m_canvas->HasFocus()) + m_canvas->SetFocus(); + if (_render_search_list(0.5f * (left + right))) + _deactivate_search_toolbar_item(); + } + }; + item.left.action_callback = GLToolbarItem::Default_Action_Callback; + item.visibility_callback = GLToolbarItem::Default_Visibility_Callback; + item.enabling_callback = [this]()->bool { return m_gizmos.get_current_type() == GLGizmosManager::Undefined; }; + if (!m_main_toolbar.add_item(item)) + return false; + + if (!m_main_toolbar.add_separator()) + return false; + + item.name = "layersediting"; + item.icon_filename = "layers_white.svg"; + item.tooltip = _u8L("Variable layer height"); + item.sprite_id = 12; + item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_LAYERSEDITING)); }; + item.visibility_callback = [this]()->bool { + bool res = current_printer_technology() == ptFFF; + // turns off if changing printer technology + if (!res && m_main_toolbar.is_item_visible("layersediting") && m_main_toolbar.is_item_pressed("layersediting")) + force_main_toolbar_left_action(get_main_toolbar_item_id("layersediting")); + + return res; + }; + item.enabling_callback = []()->bool { return wxGetApp().plater()->can_layers_editing(); }; + item.left.render_callback = GLToolbarItem::Default_Render_Callback; + if (!m_main_toolbar.add_item(item)) + return false; + + return true; +} + +bool GLCanvas3D::_init_undoredo_toolbar() +{ + if (!m_undoredo_toolbar.is_enabled()) + return true; + + BackgroundTexture::Metadata background_data; + background_data.filename = "toolbar_background.png"; + background_data.left = 16; + background_data.top = 16; + background_data.right = 16; + background_data.bottom = 16; + + if (!m_undoredo_toolbar.init(background_data)) { + // unable to init the toolbar texture, disable it + m_undoredo_toolbar.set_enabled(false); + return true; + } + + // init arrow + if (!m_undoredo_toolbar.init_arrow("toolbar_arrow_2.svg")) + BOOST_LOG_TRIVIAL(error) << "Undo/Redo toolbar failed to load arrow texture."; + +// m_undoredo_toolbar.set_layout_type(GLToolbar::Layout::Vertical); + m_undoredo_toolbar.set_layout_type(GLToolbar::Layout::Horizontal); + m_undoredo_toolbar.set_horizontal_orientation(GLToolbar::Layout::HO_Left); + m_undoredo_toolbar.set_vertical_orientation(GLToolbar::Layout::VO_Top); + m_undoredo_toolbar.set_border(5.0f); + m_undoredo_toolbar.set_separator_size(5); + m_undoredo_toolbar.set_gap_size(4); + + GLToolbarItem::Data item; + + item.name = "undo"; + item.icon_filename = "undo_toolbar.svg"; + item.tooltip = _u8L("Undo") + " [" + GUI::shortkey_ctrl_prefix() + "Z]\n" + _u8L("Click right mouse button to open/close History"); + item.sprite_id = 0; + item.left.action_callback = [this]() { post_event(SimpleEvent(EVT_GLCANVAS_UNDO)); }; + item.right.toggable = true; + item.right.action_callback = [this]() { m_imgui_undo_redo_hovered_pos = -1; }; + item.right.render_callback = [this](float left, float right, float, float) { + if (m_canvas != nullptr) { + if (_render_undo_redo_stack(true, 0.5f * (left + right))) + _deactivate_undo_redo_toolbar_items(); + } + }; + item.enabling_callback = [this]()->bool { + bool can_undo = wxGetApp().plater()->can_undo(); + int id = m_undoredo_toolbar.get_item_id("undo"); + + std::string curr_additional_tooltip; + m_undoredo_toolbar.get_additional_tooltip(id, curr_additional_tooltip); + + std::string new_additional_tooltip; + if (can_undo) { + std::string action; + wxGetApp().plater()->undo_redo_topmost_string_getter(true, action); + new_additional_tooltip = format(_L("Next Undo action: %1%"), action); + } + + if (new_additional_tooltip != curr_additional_tooltip) { + m_undoredo_toolbar.set_additional_tooltip(id, new_additional_tooltip); + set_tooltip(""); + } + return can_undo; + }; + + if (!m_undoredo_toolbar.add_item(item)) + return false; + + item.name = "redo"; + item.icon_filename = "redo_toolbar.svg"; + item.tooltip = _u8L("Redo") + " [" + GUI::shortkey_ctrl_prefix() + "Y]\n" + _u8L("Click right mouse button to open/close History"); + item.sprite_id = 1; + item.left.action_callback = [this]() { post_event(SimpleEvent(EVT_GLCANVAS_REDO)); }; + item.right.action_callback = [this]() { m_imgui_undo_redo_hovered_pos = -1; }; + item.right.render_callback = [this](float left, float right, float, float) { + if (m_canvas != nullptr) { + if (_render_undo_redo_stack(false, 0.5f * (left + right))) + _deactivate_undo_redo_toolbar_items(); + } + }; + item.enabling_callback = [this]()->bool { + bool can_redo = wxGetApp().plater()->can_redo(); + int id = m_undoredo_toolbar.get_item_id("redo"); + + std::string curr_additional_tooltip; + m_undoredo_toolbar.get_additional_tooltip(id, curr_additional_tooltip); + + std::string new_additional_tooltip; + if (can_redo) { + std::string action; + wxGetApp().plater()->undo_redo_topmost_string_getter(false, action); + new_additional_tooltip = format(_L("Next Redo action: %1%"), action); + } + + if (new_additional_tooltip != curr_additional_tooltip) { + m_undoredo_toolbar.set_additional_tooltip(id, new_additional_tooltip); + set_tooltip(""); + } + return can_redo; + }; + + if (!m_undoredo_toolbar.add_item(item)) + return false; + /* + if (!m_undoredo_toolbar.add_separator()) + return false; + */ + return true; +} + +bool GLCanvas3D::_init_view_toolbar() +{ + return wxGetApp().plater()->init_view_toolbar(); +} + +bool GLCanvas3D::_init_collapse_toolbar() +{ + return wxGetApp().plater()->init_collapse_toolbar(); +} + +bool GLCanvas3D::_set_current() +{ + return m_context != nullptr && m_canvas->SetCurrent(*m_context); +} + +void GLCanvas3D::_resize(unsigned int w, unsigned int h) +{ + if (m_canvas == nullptr && m_context == nullptr) + return; + + const std::array new_size = { w, h }; + if (m_old_size == new_size) + return; + + m_old_size = new_size; + + auto *imgui = wxGetApp().imgui(); + imgui->set_display_size(static_cast(w), static_cast(h)); + const float font_size = 1.5f * wxGetApp().em_unit(); +#if ENABLE_RETINA_GL + imgui->set_scaling(font_size, 1.0f, m_retina_helper->get_scale_factor()); +#else + imgui->set_scaling(font_size, m_canvas->GetContentScaleFactor(), 1.0f); +#endif + + this->request_extra_frame(); + + // ensures that this canvas is current + _set_current(); +} + +BoundingBoxf3 GLCanvas3D::_max_bounding_box(bool include_gizmos, bool include_bed_model) const +{ + BoundingBoxf3 bb = volumes_bounding_box(); + + // The following is a workaround for gizmos not being taken in account when calculating the tight camera frustrum + // A better solution would ask the gizmo manager for the bounding box of the current active gizmo, if any + if (include_gizmos && m_gizmos.is_running()) { + const BoundingBoxf3 sel_bb = m_selection.get_bounding_box(); + const Vec3d sel_bb_center = sel_bb.center(); + const Vec3d extend_by = sel_bb.max_size() * Vec3d::Ones(); + bb.merge(BoundingBoxf3(sel_bb_center - extend_by, sel_bb_center + extend_by)); + } + + const BoundingBoxf3 bed_bb = include_bed_model ? m_bed.extended_bounding_box() : m_bed.build_volume().bounding_volume(); + bb.merge(bed_bb); + + if (!m_main_toolbar.is_enabled()) + bb.merge(m_gcode_viewer.get_max_bounding_box()); + + // clamp max bb size with respect to bed bb size + if (!m_picking_enabled) { + static const double max_scale_factor = 2.0; + const Vec3d bb_size = bb.size(); + const Vec3d bed_bb_size = m_bed.build_volume().bounding_volume().size(); + + if ((bed_bb_size.x() > 0.0 && bb_size.x() > max_scale_factor * bed_bb_size.x()) || + (bed_bb_size.y() > 0.0 && bb_size.y() > max_scale_factor * bed_bb_size.y()) || + (bed_bb_size.z() > 0.0 && bb_size.z() > max_scale_factor * bed_bb_size.z())) { + const Vec3d bed_bb_center = bed_bb.center(); + const Vec3d extend_by = max_scale_factor * bed_bb_size; + bb = BoundingBoxf3(bed_bb_center - extend_by, bed_bb_center + extend_by); + } + } + + return bb; +} + +void GLCanvas3D::_zoom_to_box(const BoundingBoxf3& box, double margin_factor) +{ + wxGetApp().plater()->get_camera().zoom_to_box(box, margin_factor); + m_dirty = true; +} + +void GLCanvas3D::_update_camera_zoom(double zoom) +{ + wxGetApp().plater()->get_camera().update_zoom(zoom); + m_dirty = true; +} + +void GLCanvas3D::_refresh_if_shown_on_screen() +{ + if (_is_shown_on_screen()) { + const Size& cnv_size = get_canvas_size(); + _resize((unsigned int)cnv_size.get_width(), (unsigned int)cnv_size.get_height()); + + // When the application starts the following call to render() triggers the opengl initialization. + // We need to ask for an extra call to reload_scene() to force the generation of the model for wipe tower + // for printers using it, which is skipped by all the previous calls to reload_scene() because m_initialized == false + const bool requires_reload_scene = !m_initialized; + + // Because of performance problems on macOS, where PaintEvents are not delivered + // frequently enough, we call render() here directly when we can. + render(); + assert(m_initialized); + if (requires_reload_scene) { + if (wxGetApp().plater()->is_view3D_shown()) + reload_scene(true); + } + } +} + +void GLCanvas3D::_picking_pass() +{ + if (!m_picking_enabled || m_mouse.dragging || m_mouse.position == Vec2d(DBL_MAX, DBL_MAX) || m_gizmos.is_dragging()) { +#if ENABLE_RAYCAST_PICKING_DEBUG + ImGuiWrapper& imgui = *wxGetApp().imgui(); + imgui.begin(std::string("Hit result"), ImGuiWindowFlags_AlwaysAutoResize); + imgui.text("Picking disabled"); + imgui.end(); +#endif // ENABLE_RAYCAST_PICKING_DEBUG + return; + } + + m_hover_volume_idxs.clear(); + + const ClippingPlane clipping_plane = m_gizmos.get_clipping_plane().inverted_normal(); + const SceneRaycaster::HitResult hit = m_scene_raycaster.hit(m_mouse.position, wxGetApp().plater()->get_camera(), &clipping_plane); + if (hit.is_valid()) { + switch (hit.type) + { + case SceneRaycaster::EType::Volume: + { + if (0 <= hit.raycaster_id && hit.raycaster_id < (int)m_volumes.volumes.size()) { + const GLVolume* volume = m_volumes.volumes[hit.raycaster_id]; + if (volume->is_active && !volume->disabled && (volume->composite_id.volume_id >= 0 || m_render_sla_auxiliaries)) { + // do not add the volume id if any gizmo is active and CTRL is pressed + if (m_gizmos.get_current_type() == GLGizmosManager::EType::Undefined || !wxGetKeyState(WXK_CONTROL)) + m_hover_volume_idxs.emplace_back(hit.raycaster_id); + m_gizmos.set_hover_id(-1); + } + } + else + assert(false); + + break; + } + case SceneRaycaster::EType::Gizmo: + { + const Size& cnv_size = get_canvas_size(); + const bool inside = 0 <= m_mouse.position.x() && m_mouse.position.x() < cnv_size.get_width() && + 0 <= m_mouse.position.y() && m_mouse.position.y() < cnv_size.get_height(); + m_gizmos.set_hover_id(inside ? hit.raycaster_id : -1); + break; + } + case SceneRaycaster::EType::Bed: + { + m_gizmos.set_hover_id(-1); + break; + } + default: + { + assert(false); + break; + } + } + } + else + m_gizmos.set_hover_id(-1); + + _update_volumes_hover_state(); + +#if ENABLE_RAYCAST_PICKING_DEBUG + ImGuiWrapper& imgui = *wxGetApp().imgui(); + imgui.begin(std::string("Hit result"), ImGuiWindowFlags_AlwaysAutoResize); + std::string object_type = "None"; + switch (hit.type) + { + case SceneRaycaster::EType::Bed: { object_type = "Bed"; break; } + case SceneRaycaster::EType::Gizmo: { object_type = "Gizmo element"; break; } + case SceneRaycaster::EType::Volume: + { + if (m_volumes.volumes[hit.raycaster_id]->is_wipe_tower) + object_type = "Volume (Wipe tower)"; + else if (m_volumes.volumes[hit.raycaster_id]->volume_idx() == -int(slaposPad)) + object_type = "Volume (SLA pad)"; + else if (m_volumes.volumes[hit.raycaster_id]->volume_idx() == -int(slaposSupportTree)) + object_type = "Volume (SLA supports)"; + else if (m_volumes.volumes[hit.raycaster_id]->is_modifier) + object_type = "Volume (Modifier)"; + else + object_type = "Volume (Part)"; + break; + } + default: { break; } + } + + auto add_strings_row_to_table = [&imgui](const std::string& col_1, const ImVec4& col_1_color, const std::string& col_2, const ImVec4& col_2_color, + const std::string& col_3 = "", const ImVec4& col_3_color = ImGui::GetStyleColorVec4(ImGuiCol_Text)) { + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + imgui.text_colored(col_1_color, col_1.c_str()); + ImGui::TableSetColumnIndex(1); + imgui.text_colored(col_2_color, col_2.c_str()); + if (!col_3.empty()) { + ImGui::TableSetColumnIndex(2); + imgui.text_colored(col_3_color, col_3.c_str()); + } + }; + + char buf[1024]; + if (hit.type != SceneRaycaster::EType::None) { + if (ImGui::BeginTable("Hit", 2)) { + add_strings_row_to_table("Object ID", ImGuiWrapper::COL_ORANGE_LIGHT, std::to_string(hit.raycaster_id), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + add_strings_row_to_table("Type", ImGuiWrapper::COL_ORANGE_LIGHT, object_type, ImGui::GetStyleColorVec4(ImGuiCol_Text)); + sprintf(buf, "%.3f, %.3f, %.3f", hit.position.x(), hit.position.y(), hit.position.z()); + add_strings_row_to_table("Position", ImGuiWrapper::COL_ORANGE_LIGHT, std::string(buf), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + sprintf(buf, "%.3f, %.3f, %.3f", hit.normal.x(), hit.normal.y(), hit.normal.z()); + add_strings_row_to_table("Normal", ImGuiWrapper::COL_ORANGE_LIGHT, std::string(buf), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + ImGui::EndTable(); + } + } + else + imgui.text("NO HIT"); + + ImGui::Separator(); + imgui.text("Registered for picking:"); + if (ImGui::BeginTable("Raycasters", 2)) { + sprintf(buf, "%d (%d)", (int)m_scene_raycaster.beds_count(), (int)m_scene_raycaster.active_beds_count()); + add_strings_row_to_table("Beds", ImGuiWrapper::COL_ORANGE_LIGHT, std::string(buf), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + sprintf(buf, "%d (%d)", (int)m_scene_raycaster.volumes_count(), (int)m_scene_raycaster.active_volumes_count()); + add_strings_row_to_table("Volumes", ImGuiWrapper::COL_ORANGE_LIGHT, std::string(buf), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + sprintf(buf, "%d (%d)", (int)m_scene_raycaster.gizmos_count(), (int)m_scene_raycaster.active_gizmos_count()); + add_strings_row_to_table("Gizmo elements", ImGuiWrapper::COL_ORANGE_LIGHT, std::string(buf), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + ImGui::EndTable(); + } + + std::vector>* gizmo_raycasters = m_scene_raycaster.get_raycasters(SceneRaycaster::EType::Gizmo); + if (gizmo_raycasters != nullptr && !gizmo_raycasters->empty()) { + ImGui::Separator(); + imgui.text("Gizmo raycasters IDs:"); + if (ImGui::BeginTable("GizmoRaycasters", 3)) { + for (size_t i = 0; i < gizmo_raycasters->size(); ++i) { + add_strings_row_to_table(std::to_string(i), ImGuiWrapper::COL_ORANGE_LIGHT, + std::to_string(SceneRaycaster::decode_id(SceneRaycaster::EType::Gizmo, (*gizmo_raycasters)[i]->get_id())), ImGui::GetStyleColorVec4(ImGuiCol_Text), + to_string(Geometry::Transformation((*gizmo_raycasters)[i]->get_transform()).get_offset()), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + } + ImGui::EndTable(); + } + } + + imgui.end(); +#endif // ENABLE_RAYCAST_PICKING_DEBUG +} + +void GLCanvas3D::_rectangular_selection_picking_pass() +{ + m_gizmos.set_hover_id(-1); + + std::set idxs; + + if (m_picking_enabled) { + const size_t width = std::max(m_rectangle_selection.get_width(), 1); + const size_t height = std::max(m_rectangle_selection.get_height(), 1); + + const OpenGLManager::EFramebufferType framebuffers_type = OpenGLManager::get_framebuffers_type(); + bool use_framebuffer = framebuffers_type != OpenGLManager::EFramebufferType::Unknown; + + GLuint render_fbo = 0; + GLuint render_tex = 0; + GLuint render_depth = 0; + if (use_framebuffer) { + // setup a framebuffer which covers only the selection rectangle + if (framebuffers_type == OpenGLManager::EFramebufferType::Arb) { + glsafe(::glGenFramebuffers(1, &render_fbo)); + glsafe(::glBindFramebuffer(GL_FRAMEBUFFER, render_fbo)); + } + else { + glsafe(::glGenFramebuffersEXT(1, &render_fbo)); + glsafe(::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, render_fbo)); + } + glsafe(::glGenTextures(1, &render_tex)); + glsafe(::glBindTexture(GL_TEXTURE_2D, render_tex)); + glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); + if (framebuffers_type == OpenGLManager::EFramebufferType::Arb) { + glsafe(::glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, render_tex, 0)); + glsafe(::glGenRenderbuffers(1, &render_depth)); + glsafe(::glBindRenderbuffer(GL_RENDERBUFFER, render_depth)); +#if ENABLE_OPENGL_ES + glsafe(::glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height)); +#else + glsafe(::glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height)); +#endif // ENABLE_OPENGL_ES + glsafe(::glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, render_depth)); + } + else { + glsafe(::glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, render_tex, 0)); + glsafe(::glGenRenderbuffersEXT(1, &render_depth)); + glsafe(::glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, render_depth)); + glsafe(::glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, width, height)); + glsafe(::glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, render_depth)); + } + const GLenum drawBufs[] = { GL_COLOR_ATTACHMENT0 }; + glsafe(::glDrawBuffers(1, drawBufs)); + if (framebuffers_type == OpenGLManager::EFramebufferType::Arb) { + if (::glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) + use_framebuffer = false; + } + else { + if (::glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) + use_framebuffer = false; + } + } + + if (m_multisample_allowed) + // This flag is often ignored by NVIDIA drivers if rendering into a screen buffer. + glsafe(::glDisable(GL_MULTISAMPLE)); + + glsafe(::glDisable(GL_BLEND)); + glsafe(::glEnable(GL_DEPTH_TEST)); + + glsafe(::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); + + const Camera& main_camera = wxGetApp().plater()->get_camera(); + Camera framebuffer_camera; + framebuffer_camera.set_type(main_camera.get_type()); + const Camera* camera = &main_camera; + if (use_framebuffer) { + // setup a camera which covers only the selection rectangle + const std::array& viewport = camera->get_viewport(); + const double near_left = camera->get_near_left(); + const double near_bottom = camera->get_near_bottom(); + const double near_width = camera->get_near_width(); + const double near_height = camera->get_near_height(); + + const double ratio_x = near_width / double(viewport[2]); + const double ratio_y = near_height / double(viewport[3]); + + const double rect_near_left = near_left + double(m_rectangle_selection.get_left()) * ratio_x; + const double rect_near_bottom = near_bottom + (double(viewport[3]) - double(m_rectangle_selection.get_bottom())) * ratio_y; + double rect_near_right = near_left + double(m_rectangle_selection.get_right()) * ratio_x; + double rect_near_top = near_bottom + (double(viewport[3]) - double(m_rectangle_selection.get_top())) * ratio_y; + + if (rect_near_left == rect_near_right) + rect_near_right = rect_near_left + ratio_x; + if (rect_near_bottom == rect_near_top) + rect_near_top = rect_near_bottom + ratio_y; + + framebuffer_camera.look_at(camera->get_position(), camera->get_target(), camera->get_dir_up()); + framebuffer_camera.apply_projection(rect_near_left, rect_near_right, rect_near_bottom, rect_near_top, camera->get_near_z(), camera->get_far_z()); + framebuffer_camera.set_viewport(0, 0, width, height); + framebuffer_camera.apply_viewport(); + camera = &framebuffer_camera; + } + + _render_volumes_for_picking(*camera); + _render_bed_for_picking(camera->get_view_matrix(), camera->get_projection_matrix(), !camera->is_looking_downward()); + + if (m_multisample_allowed) + glsafe(::glEnable(GL_MULTISAMPLE)); + + const size_t px_count = width * height; + + const size_t left = use_framebuffer ? 0 : (size_t)m_rectangle_selection.get_left(); + const size_t top = use_framebuffer ? 0 : (size_t)get_canvas_size().get_height() - (size_t)m_rectangle_selection.get_top(); +#define USE_PARALLEL 1 +#if USE_PARALLEL + struct Pixel + { + std::array data; + // Only non-interpolated colors are valid, those have their lowest three bits zeroed. + bool valid() const { return picking_checksum_alpha_channel(data[0], data[1], data[2]) == data[3]; } + // we reserve color = (0,0,0) for occluders (as the printbed) + // volumes' id are shifted by 1 + // see: _render_volumes_for_picking() + int id() const { return data[0] + (data[1] << 8) + (data[2] << 16) - 1; } + }; + + std::vector frame(px_count); + glsafe(::glReadPixels(left, top, width, height, GL_RGBA, GL_UNSIGNED_BYTE, (void*)frame.data())); + + tbb::spin_mutex mutex; + tbb::parallel_for(tbb::blocked_range(0, frame.size(), (size_t)width), + [this, &frame, &idxs, &mutex](const tbb::blocked_range& range) { + for (size_t i = range.begin(); i < range.end(); ++i) + if (frame[i].valid()) { + int volume_id = frame[i].id(); + if (0 <= volume_id && volume_id < (int)m_volumes.volumes.size()) { + mutex.lock(); + idxs.insert(volume_id); + mutex.unlock(); + } + } + }); +#else + std::vector frame(4 * px_count); + glsafe(::glReadPixels(left, top, width, height, GL_RGBA, GL_UNSIGNED_BYTE, (void*)frame.data())); + + for (int i = 0; i < px_count; ++i) { + int px_id = 4 * i; + int volume_id = frame[px_id] + (frame[px_id + 1] << 8) + (frame[px_id + 2] << 16); + if (0 <= volume_id && volume_id < (int)m_volumes.volumes.size()) + idxs.insert(volume_id); + } +#endif // USE_PARALLEL + if (camera != &main_camera) + main_camera.apply_viewport(); + + if (framebuffers_type == OpenGLManager::EFramebufferType::Arb) { + glsafe(::glBindFramebuffer(GL_FRAMEBUFFER, 0)); + if (render_depth != 0) + glsafe(::glDeleteRenderbuffers(1, &render_depth)); + if (render_fbo != 0) + glsafe(::glDeleteFramebuffers(1, &render_fbo)); + } + else if (framebuffers_type == OpenGLManager::EFramebufferType::Ext) { + glsafe(::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0)); + if (render_depth != 0) + glsafe(::glDeleteRenderbuffersEXT(1, &render_depth)); + if (render_fbo != 0) + glsafe(::glDeleteFramebuffersEXT(1, &render_fbo)); + } + + if (render_tex != 0) + glsafe(::glDeleteTextures(1, &render_tex)); + } + + m_hover_volume_idxs.assign(idxs.begin(), idxs.end()); + _update_volumes_hover_state(); +} + +void GLCanvas3D::_render_background() +{ + bool use_error_color = false; + if (wxGetApp().is_editor()) { + use_error_color = m_dynamic_background_enabled && + (current_printer_technology() != ptSLA || !m_volumes.empty()); + + if (!m_volumes.empty()) + use_error_color &= _is_any_volume_outside().first; + else + use_error_color &= m_gcode_viewer.has_data() && !m_gcode_viewer.is_contained_in_bed(); + } + + // Draws a bottom to top gradient over the complete screen. + glsafe(::glDisable(GL_DEPTH_TEST)); + + const ColorRGBA bottom_color = use_error_color ? ERROR_BG_DARK_COLOR : DEFAULT_BG_DARK_COLOR; + + if (!m_background.is_initialized()) { + m_background.reset(); + + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P2T2 }; + init_data.reserve_vertices(4); + init_data.reserve_indices(6); + + // vertices + init_data.add_vertex(Vec2f(-1.0f, -1.0f), Vec2f(0.0f, 0.0f)); + init_data.add_vertex(Vec2f(1.0f, -1.0f), Vec2f(1.0f, 0.0f)); + init_data.add_vertex(Vec2f(1.0f, 1.0f), Vec2f(1.0f, 1.0f)); + init_data.add_vertex(Vec2f(-1.0f, 1.0f), Vec2f(0.0f, 1.0f)); + + // indices + init_data.add_triangle(0, 1, 2); + init_data.add_triangle(2, 3, 0); + + m_background.init_from(std::move(init_data)); + } + + GLShaderProgram* shader = wxGetApp().get_shader("background"); + if (shader != nullptr) { + shader->start_using(); + shader->set_uniform("top_color", use_error_color ? ERROR_BG_LIGHT_COLOR : DEFAULT_BG_LIGHT_COLOR); + shader->set_uniform("bottom_color", bottom_color); + m_background.render(); + shader->stop_using(); + } + + glsafe(::glEnable(GL_DEPTH_TEST)); +} + +void GLCanvas3D::_render_bed(const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom) +{ + float scale_factor = 1.0; +#if ENABLE_RETINA_GL + scale_factor = m_retina_helper->get_scale_factor(); +#endif // ENABLE_RETINA_GL + + bool show_texture = ! bottom || + (m_gizmos.get_current_type() != GLGizmosManager::FdmSupports + && m_gizmos.get_current_type() != GLGizmosManager::SlaSupports + && m_gizmos.get_current_type() != GLGizmosManager::Hollow + && m_gizmos.get_current_type() != GLGizmosManager::Seam + && m_gizmos.get_current_type() != GLGizmosManager::MmuSegmentation); + + m_bed.render(*this, view_matrix, projection_matrix, bottom, scale_factor, show_texture); +} + +void GLCanvas3D::_render_bed_axes() +{ + m_bed.render_axes(); +} + +void GLCanvas3D::_render_bed_for_picking(const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom) +{ + float scale_factor = 1.0; +#if ENABLE_RETINA_GL + scale_factor = m_retina_helper->get_scale_factor(); +#endif // ENABLE_RETINA_GL + + m_bed.render_for_picking(*this, view_matrix, projection_matrix, bottom, scale_factor); +} + +void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type) +{ + if (m_volumes.empty()) + return; + + glsafe(::glEnable(GL_DEPTH_TEST)); + + m_camera_clipping_plane = m_gizmos.get_clipping_plane(); + + if (m_picking_enabled) + // Update the layer editing selection to the first object selected, update the current object maximum Z. + m_layers_editing.select_object(*m_model, this->is_layers_editing_enabled() ? m_selection.get_object_idx() : -1); + + if (const BuildVolume &build_volume = m_bed.build_volume(); build_volume.valid()) { + switch (build_volume.type()) { + case BuildVolume::Type::Rectangle: { + const BoundingBox3Base bed_bb = build_volume.bounding_volume().inflated(BuildVolume::SceneEpsilon); + m_volumes.set_print_volume({ 0, // circle + { float(bed_bb.min.x()), float(bed_bb.min.y()), float(bed_bb.max.x()), float(bed_bb.max.y()) }, + { 0.0f, float(build_volume.max_print_height()) } }); + break; + } + case BuildVolume::Type::Circle: { + m_volumes.set_print_volume({ 1, // rectangle + { unscaled(build_volume.circle().center.x()), unscaled(build_volume.circle().center.y()), unscaled(build_volume.circle().radius + BuildVolume::SceneEpsilon), 0.0f }, + { 0.0f, float(build_volume.max_print_height() + BuildVolume::SceneEpsilon) } }); + break; + } + default: + case BuildVolume::Type::Convex: + case BuildVolume::Type::Custom: { + m_volumes.set_print_volume({ static_cast(type), + { -FLT_MAX, -FLT_MAX, FLT_MAX, FLT_MAX }, + { -FLT_MAX, FLT_MAX } } + ); + } + } + if (m_requires_check_outside_state) { + m_volumes.check_outside_state(build_volume, nullptr); + m_requires_check_outside_state = false; + } + } + + if (m_use_clipping_planes) + m_volumes.set_z_range(-m_clipping_planes[0].get_data()[3], m_clipping_planes[1].get_data()[3]); + else + m_volumes.set_z_range(-FLT_MAX, FLT_MAX); + + m_volumes.set_clipping_plane(m_camera_clipping_plane.get_data()); + m_volumes.set_show_sinking_contours(! m_gizmos.is_hiding_instances()); + m_volumes.set_show_non_manifold_edges(!m_gizmos.is_hiding_instances() && m_gizmos.get_current_type() != GLGizmosManager::Simplify); + + GLShaderProgram* shader = wxGetApp().get_shader("gouraud"); + if (shader != nullptr) { + shader->start_using(); + + switch (type) + { + default: + case GLVolumeCollection::ERenderType::Opaque: + { + if (m_picking_enabled && !m_gizmos.is_dragging() && m_layers_editing.is_enabled() && (m_layers_editing.last_object_id != -1) && (m_layers_editing.object_max_z() > 0.0f)) { + int object_id = m_layers_editing.last_object_id; + const Camera& camera = wxGetApp().plater()->get_camera(); + m_volumes.render(type, false, camera.get_view_matrix(), camera.get_projection_matrix(), [object_id](const GLVolume& volume) { + // Which volume to paint without the layer height profile shader? + return volume.is_active && (volume.is_modifier || volume.composite_id.object_id != object_id); + }); + // Let LayersEditing handle rendering of the active object using the layer height profile shader. + m_layers_editing.render_volumes(*this, m_volumes); + } + else { + // do not cull backfaces to show broken geometry, if any + const Camera& camera = wxGetApp().plater()->get_camera(); + m_volumes.render(type, m_picking_enabled, camera.get_view_matrix(), camera.get_projection_matrix(), [this](const GLVolume& volume) { + return (m_render_sla_auxiliaries || volume.composite_id.volume_id >= 0); + }); + } + + // In case a painting gizmo is open, it should render the painted triangles + // before transparent objects are rendered. Otherwise they would not be + // visible when inside modifier meshes etc. + { + GLGizmosManager& gm = get_gizmos_manager(); +// GLGizmosManager::EType type = gm.get_current_type(); + if (dynamic_cast(gm.get_current())) { + shader->stop_using(); + gm.render_painter_gizmo(); + shader->start_using(); + } + } + break; + } + case GLVolumeCollection::ERenderType::Transparent: + { + const Camera& camera = wxGetApp().plater()->get_camera(); + m_volumes.render(type, false, camera.get_view_matrix(), camera.get_projection_matrix()); + break; + } + } + shader->stop_using(); + } + + m_camera_clipping_plane = ClippingPlane::ClipsNothing(); +} + +void GLCanvas3D::_render_gcode() +{ + m_gcode_viewer.render(); +} + +void GLCanvas3D::_render_gcode_cog() +{ + m_gcode_viewer.render_cog(); +} + +void GLCanvas3D::_render_selection() +{ + float scale_factor = 1.0; +#if ENABLE_RETINA_GL + scale_factor = m_retina_helper->get_scale_factor(); +#endif // ENABLE_RETINA_GL + + if (!m_gizmos.is_running()) + m_selection.render(scale_factor); + +#if ENABLE_MATRICES_DEBUG + m_selection.render_debug_window(); +#endif // ENABLE_MATRICES_DEBUG +} + +void GLCanvas3D::_render_sequential_clearance() +{ + if (m_layers_editing.is_enabled() || m_gizmos.is_dragging()) + return; + + switch (m_gizmos.get_current_type()) + { + case GLGizmosManager::EType::Flatten: + case GLGizmosManager::EType::Cut: + case GLGizmosManager::EType::Hollow: + case GLGizmosManager::EType::SlaSupports: + case GLGizmosManager::EType::FdmSupports: + case GLGizmosManager::EType::Seam: { return; } + default: { break; } + } + + m_sequential_print_clearance.render(); +} + +#if ENABLE_RENDER_SELECTION_CENTER +void GLCanvas3D::_render_selection_center() +{ + m_selection.render_center(m_gizmos.is_dragging()); +} +#endif // ENABLE_RENDER_SELECTION_CENTER + +void GLCanvas3D::_check_and_update_toolbar_icon_scale() +{ + // Don't update a toolbar scale, when we are on a Preview + if (wxGetApp().plater()->is_preview_shown()) + return; + + const float scale = wxGetApp().toolbar_icon_scale(); + const Size cnv_size = get_canvas_size(); + + int size = int(GLToolbar::Default_Icons_Size * scale); + + // Set current size for all top toolbars. It will be used for next calculations + GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); +#if ENABLE_RETINA_GL + const float sc = m_retina_helper->get_scale_factor() * scale; + m_main_toolbar.set_scale(sc); + m_undoredo_toolbar.set_scale(sc); + collapse_toolbar.set_scale(sc); + size *= int(m_retina_helper->get_scale_factor()); +#else + m_main_toolbar.set_icons_size(size); + m_undoredo_toolbar.set_icons_size(size); + collapse_toolbar.set_icons_size(size); +#endif // ENABLE_RETINA_GL + + const float top_tb_width = m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar.get_width(); + int items_cnt = m_main_toolbar.get_visible_items_cnt() + m_undoredo_toolbar.get_visible_items_cnt() + collapse_toolbar.get_visible_items_cnt(); + const float noitems_width = top_tb_width - float(size) * items_cnt; // width of separators and borders in top toolbars + + // calculate scale needed for items in all top toolbars + // the std::max() is there because on some Linux dialects/virtual machines this code is called when the canvas has not been properly initialized yet, + // leading to negative values for the scale. + // See: https://github.com/prusa3d/PrusaSlicer/issues/8563 + // https://github.com/supermerill/SuperSlicer/issues/854 + const float new_h_scale = std::max((cnv_size.get_width() - noitems_width), 1.0f) / (items_cnt * GLToolbar::Default_Icons_Size); + + items_cnt = m_gizmos.get_selectable_icons_cnt() + 3; // +3 means a place for top and view toolbars and separators in gizmos toolbar + + // calculate scale needed for items in the gizmos toolbar + const float new_v_scale = cnv_size.get_height() / (items_cnt * GLGizmosManager::Default_Icons_Size); + + // set minimum scale as a auto scale for the toolbars + float new_scale = std::min(new_h_scale, new_v_scale); +#if ENABLE_RETINA_GL + new_scale /= m_retina_helper->get_scale_factor(); +#endif + if (fabs(new_scale - scale) > 0.01) // scale is changed by 1% and more + wxGetApp().set_auto_toolbar_icon_scale(new_scale); +} + +void GLCanvas3D::_render_overlays() +{ + glsafe(::glDisable(GL_DEPTH_TEST)); + + // main toolbar and undoredo toolbar need to be both updated before rendering because both their sizes are needed + // to correctly place them + _check_and_update_toolbar_icon_scale(); + + _render_gizmos_overlay(); + + _render_main_toolbar(); + _render_undoredo_toolbar(); + _render_collapse_toolbar(); + _render_view_toolbar(); + + if (m_layers_editing.last_object_id >= 0 && m_layers_editing.object_max_z() > 0.0f) + m_layers_editing.render_overlay(*this); + + const ConfigOptionBool* opt = dynamic_cast(m_config->option("complete_objects")); + bool sequential_print = opt != nullptr && opt->value; + std::vector sorted_instances; + if (sequential_print) { + for (ModelObject* model_object : m_model->objects) + for (ModelInstance* model_instance : model_object->instances) { + sorted_instances.emplace_back(model_instance); + } + } + m_labels.render(sorted_instances); +} + +void GLCanvas3D::_render_volumes_for_picking(const Camera& camera) const +{ + GLShaderProgram* shader = wxGetApp().get_shader("flat_clip"); + if (shader == nullptr) + return; + + // do not cull backfaces to show broken geometry, if any + glsafe(::glDisable(GL_CULL_FACE)); + + const Transform3d& view_matrix = camera.get_view_matrix(); + for (size_t type = 0; type < 2; ++ type) { + GLVolumeWithIdAndZList to_render = volumes_to_render(m_volumes.volumes, (type == 0) ? GLVolumeCollection::ERenderType::Opaque : GLVolumeCollection::ERenderType::Transparent, view_matrix); + for (const GLVolumeWithIdAndZ& volume : to_render) + if (!volume.first->disabled && (volume.first->composite_id.volume_id >= 0 || m_render_sla_auxiliaries)) { + // Object picking mode. Render the object with a color encoding the object index. + // we reserve color = (0,0,0) for occluders (as the printbed) + // so we shift volumes' id by 1 to get the proper color + const unsigned int id = 1 + volume.second.first; + volume.first->model.set_color(picking_decode(id)); + shader->start_using(); + shader->set_uniform("view_model_matrix", view_matrix * volume.first->world_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("volume_world_matrix", volume.first->world_matrix()); + shader->set_uniform("z_range", m_volumes.get_z_range()); + shader->set_uniform("clipping_plane", m_volumes.get_clipping_plane()); + volume.first->render(); + shader->stop_using(); + } + } + + glsafe(::glEnable(GL_CULL_FACE)); +} + +void GLCanvas3D::_render_current_gizmo() const +{ + m_gizmos.render_current_gizmo(); +} + +void GLCanvas3D::_render_gizmos_overlay() +{ +#if ENABLE_RETINA_GL +// m_gizmos.set_overlay_scale(m_retina_helper->get_scale_factor()); + const float scale = m_retina_helper->get_scale_factor()*wxGetApp().toolbar_icon_scale(); + m_gizmos.set_overlay_scale(scale); //! #ys_FIXME_experiment +#else +// m_gizmos.set_overlay_scale(m_canvas->GetContentScaleFactor()); +// m_gizmos.set_overlay_scale(wxGetApp().em_unit()*0.1f); + const float size = int(GLGizmosManager::Default_Icons_Size * wxGetApp().toolbar_icon_scale()); + m_gizmos.set_overlay_icon_size(size); //! #ys_FIXME_experiment +#endif /* __WXMSW__ */ + + m_gizmos.render_overlay(); + + if (m_gizmo_highlighter.m_render_arrow) + m_gizmos.render_arrow(*this, m_gizmo_highlighter.m_gizmo_type); +} + +void GLCanvas3D::_render_main_toolbar() +{ + if (!m_main_toolbar.is_enabled()) + return; + + const Size cnv_size = get_canvas_size(); + const float top = 0.5f * (float)cnv_size.get_height(); + + GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); + const float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0.0f; + const float left = -0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width); + + m_main_toolbar.set_position(top, left); + m_main_toolbar.render(*this); + if (m_toolbar_highlighter.m_render_arrow) + m_main_toolbar.render_arrow(*this, m_toolbar_highlighter.m_toolbar_item); +} + +void GLCanvas3D::_render_undoredo_toolbar() +{ + if (!m_undoredo_toolbar.is_enabled()) + return; + + const Size cnv_size = get_canvas_size(); + const float top = 0.5f * (float)cnv_size.get_height(); + GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); + const float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0.0f; + const float left = m_main_toolbar.get_width() - 0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width); + + m_undoredo_toolbar.set_position(top, left); + m_undoredo_toolbar.render(*this); + if (m_toolbar_highlighter.m_render_arrow) + m_undoredo_toolbar.render_arrow(*this, m_toolbar_highlighter.m_toolbar_item); +} + +void GLCanvas3D::_render_collapse_toolbar() const +{ + GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); + + const Size cnv_size = get_canvas_size(); + const float band = m_layers_editing.is_enabled() ? (wxGetApp().imgui()->get_style_scaling() * LayersEditing::THICKNESS_BAR_WIDTH) : 0.0; + const float top = 0.5f * (float)cnv_size.get_height(); + const float left = 0.5f * (float)cnv_size.get_width() - collapse_toolbar.get_width() - band; + + collapse_toolbar.set_position(top, left); + collapse_toolbar.render(*this); +} + +void GLCanvas3D::_render_view_toolbar() const +{ + GLToolbar& view_toolbar = wxGetApp().plater()->get_view_toolbar(); + +#if ENABLE_RETINA_GL + const float scale = m_retina_helper->get_scale_factor() * wxGetApp().toolbar_icon_scale(); +#if __APPLE__ + view_toolbar.set_scale(scale); +#else // if GTK3 + const float size = int(GLGizmosManager::Default_Icons_Size * scale); + view_toolbar.set_icons_size(size); +#endif // __APPLE__ +#else + const float size = int(GLGizmosManager::Default_Icons_Size * wxGetApp().toolbar_icon_scale()); + view_toolbar.set_icons_size(size); +#endif // ENABLE_RETINA_GL + + const Size cnv_size = get_canvas_size(); + // places the toolbar on the bottom-left corner of the 3d scene + const float top = -0.5f * (float)cnv_size.get_height() + view_toolbar.get_height(); + const float left = -0.5f * (float)cnv_size.get_width(); + view_toolbar.set_position(top, left); + view_toolbar.render(*this); +} + +#if ENABLE_SHOW_CAMERA_TARGET +void GLCanvas3D::_render_camera_target() +{ + static const float half_length = 5.0f; + + glsafe(::glDisable(GL_DEPTH_TEST)); +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_core_profile()) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth(2.0f)); + + const Vec3f& target = wxGetApp().plater()->get_camera().get_target().cast(); + m_camera_target.target = target.cast(); + + for (int i = 0; i < 3; ++i) { + if (!m_camera_target.axis[i].is_initialized()) { + m_camera_target.axis[i].reset(); + + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; + init_data.color = (i == X) ? ColorRGBA::X() : ((i == Y) ? ColorRGBA::Y() : ColorRGBA::Z()); + init_data.reserve_vertices(2); + init_data.reserve_indices(2); + + // vertices + if (i == X) { + init_data.add_vertex(Vec3f(-half_length, 0.0f, 0.0f)); + init_data.add_vertex(Vec3f(+half_length, 0.0f, 0.0f)); + } + else if (i == Y) { + init_data.add_vertex(Vec3f(0.0f, -half_length, 0.0f)); + init_data.add_vertex(Vec3f(0.0f, +half_length, 0.0f)); + } + else { + init_data.add_vertex(Vec3f(0.0f, 0.0f, -half_length)); + init_data.add_vertex(Vec3f(0.0f, 0.0f, +half_length)); + } + + // indices + init_data.add_line(0, 1); + + m_camera_target.axis[i].init_from(std::move(init_data)); + } + } + +#if ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else + GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE + if (shader != nullptr) { + shader->start_using(); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix() * Geometry::translation_transform(m_camera_target.target)); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.5f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE + for (int i = 0; i < 3; ++i) { + m_camera_target.axis[i].render(); + } + shader->stop_using(); + } +} +#endif // ENABLE_SHOW_CAMERA_TARGET + +void GLCanvas3D::_render_sla_slices() +{ + if (!m_use_clipping_planes || current_printer_technology() != ptSLA) + return; + + const SLAPrint* print = this->sla_print(); + const PrintObjects& print_objects = print->objects(); + if (print_objects.empty()) + // nothing to render, return + return; + + double clip_min_z = -m_clipping_planes[0].get_data()[3]; + double clip_max_z = m_clipping_planes[1].get_data()[3]; + for (unsigned int i = 0; i < (unsigned int)print_objects.size(); ++i) { + const SLAPrintObject* obj = print_objects[i]; + + if (!obj->is_step_done(slaposSliceSupports)) + continue; + + SlaCap::ObjectIdToModelsMap::iterator it_caps_bottom = m_sla_caps[0].triangles.find(i); + SlaCap::ObjectIdToModelsMap::iterator it_caps_top = m_sla_caps[1].triangles.find(i); + { + if (it_caps_bottom == m_sla_caps[0].triangles.end()) + it_caps_bottom = m_sla_caps[0].triangles.emplace(i, SlaCap::Triangles()).first; + if (!m_sla_caps[0].matches(clip_min_z)) { + m_sla_caps[0].z = clip_min_z; + it_caps_bottom->second.object.reset(); + it_caps_bottom->second.supports.reset(); + } + if (it_caps_top == m_sla_caps[1].triangles.end()) + it_caps_top = m_sla_caps[1].triangles.emplace(i, SlaCap::Triangles()).first; + if (!m_sla_caps[1].matches(clip_max_z)) { + m_sla_caps[1].z = clip_max_z; + it_caps_top->second.object.reset(); + it_caps_top->second.supports.reset(); + } + } + GLModel& bottom_obj_triangles = it_caps_bottom->second.object; + GLModel& bottom_sup_triangles = it_caps_bottom->second.supports; + GLModel& top_obj_triangles = it_caps_top->second.object; + GLModel& top_sup_triangles = it_caps_top->second.supports; + + auto init_model = [](GLModel& model, const Pointf3s& triangles, const ColorRGBA& color) { + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3 }; + init_data.reserve_vertices(triangles.size()); + init_data.reserve_indices(triangles.size() / 3); + init_data.color = color; + + unsigned int vertices_count = 0; + for (const Vec3d& v : triangles) { + init_data.add_vertex((Vec3f)v.cast()); + ++vertices_count; + if (vertices_count % 3 == 0) + init_data.add_triangle(vertices_count - 3, vertices_count - 2, vertices_count - 1); + } + + if (!init_data.is_empty()) + model.init_from(std::move(init_data)); + }; + + if ((!bottom_obj_triangles.is_initialized() || !bottom_sup_triangles.is_initialized() || + !top_obj_triangles.is_initialized() || !top_sup_triangles.is_initialized()) && !obj->get_slice_index().empty()) { + double layer_height = print->default_object_config().layer_height.value; + double initial_layer_height = print->material_config().initial_layer_height.value; + bool left_handed = obj->is_left_handed(); + + coord_t key_zero = obj->get_slice_index().front().print_level(); + // Slice at the center of the slab starting at clip_min_z will be rendered for the lower plane. + coord_t key_low = coord_t((clip_min_z - initial_layer_height + layer_height) / SCALING_FACTOR) + key_zero; + // Slice at the center of the slab ending at clip_max_z will be rendered for the upper plane. + coord_t key_high = coord_t((clip_max_z - initial_layer_height) / SCALING_FACTOR) + key_zero; + + const SliceRecord& slice_low = obj->closest_slice_to_print_level(key_low, coord_t(SCALED_EPSILON)); + const SliceRecord& slice_high = obj->closest_slice_to_print_level(key_high, coord_t(SCALED_EPSILON)); + + // Offset to avoid OpenGL Z fighting between the object's horizontal surfaces and the triangluated surfaces of the cuts. + const double plane_shift_z = 0.002; + + if (slice_low.is_valid()) { + const ExPolygons& obj_bottom = slice_low.get_slice(soModel); + const ExPolygons& sup_bottom = slice_low.get_slice(soSupport); + // calculate model bottom cap + if (!bottom_obj_triangles.is_initialized() && !obj_bottom.empty()) + init_model(bottom_obj_triangles, triangulate_expolygons_3d(obj_bottom, clip_min_z - plane_shift_z, !left_handed), { 1.0f, 0.37f, 0.0f, 1.0f }); + // calculate support bottom cap + if (!bottom_sup_triangles.is_initialized() && !sup_bottom.empty()) + init_model(bottom_sup_triangles, triangulate_expolygons_3d(sup_bottom, clip_min_z - plane_shift_z, !left_handed), { 1.0f, 0.0f, 0.37f, 1.0f }); + } + + if (slice_high.is_valid()) { + const ExPolygons& obj_top = slice_high.get_slice(soModel); + const ExPolygons& sup_top = slice_high.get_slice(soSupport); + // calculate model top cap + if (!top_obj_triangles.is_initialized() && !obj_top.empty()) + init_model(top_obj_triangles, triangulate_expolygons_3d(obj_top, clip_max_z + plane_shift_z, left_handed), { 1.0f, 0.37f, 0.0f, 1.0f }); + // calculate support top cap + if (!top_sup_triangles.is_initialized() && !sup_top.empty()) + init_model(top_sup_triangles, triangulate_expolygons_3d(sup_top, clip_max_z + plane_shift_z, left_handed), { 1.0f, 0.0f, 0.37f, 1.0f }); + } + } + + GLShaderProgram* shader = wxGetApp().get_shader("flat"); + if (shader != nullptr) { + shader->start_using(); + + for (const SLAPrintObject::Instance& inst : obj->instances()) { + const Camera& camera = wxGetApp().plater()->get_camera(); + Transform3d view_model_matrix = camera.get_view_matrix() * + Geometry::translation_transform({ unscale(inst.shift.x()), unscale(inst.shift.y()), 0.0 }) * + Geometry::rotation_transform(inst.rotation * Vec3d::UnitZ()); + if (obj->is_left_handed()) + view_model_matrix = view_model_matrix * Geometry::scale_transform({ -1.0f, 1.0f, 1.0f }); + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + + bottom_obj_triangles.render(); + top_obj_triangles.render(); + bottom_sup_triangles.render(); + top_sup_triangles.render(); + } + + shader->stop_using(); + } + } +} + +void GLCanvas3D::_render_selection_sidebar_hints() +{ + m_selection.render_sidebar_hints(m_sidebar_field); +} + +void GLCanvas3D::_update_volumes_hover_state() +{ + // skip update if the Gizmo Measure is active + if (m_gizmos.get_current_type() == GLGizmosManager::Measure) + return; + + for (GLVolume* v : m_volumes.volumes) { + v->hover = GLVolume::HS_None; + } + + if (m_hover_volume_idxs.empty()) + return; + + const bool ctrl_pressed = wxGetKeyState(WXK_CONTROL); + const bool shift_pressed = wxGetKeyState(WXK_SHIFT); + const bool alt_pressed = wxGetKeyState(WXK_ALT); + + if (alt_pressed && (shift_pressed || ctrl_pressed)) { + // illegal combinations of keys + m_hover_volume_idxs.clear(); + return; + } + + bool hover_modifiers_only = true; + for (int i : m_hover_volume_idxs) { + if (!m_volumes.volumes[i]->is_modifier) { + hover_modifiers_only = false; + break; + } + } + + std::set> hover_instances; + for (int i : m_hover_volume_idxs) { + const GLVolume& v = *m_volumes.volumes[i]; + hover_instances.insert(std::make_pair(v.object_idx(), v.instance_idx())); + } + + bool hover_from_single_instance = hover_instances.size() == 1; + + if (hover_modifiers_only && !hover_from_single_instance) { + // do not allow to select volumes from different instances + m_hover_volume_idxs.clear(); + return; + } + + for (int i : m_hover_volume_idxs) { + GLVolume& volume = *m_volumes.volumes[i]; + if (volume.hover != GLVolume::HS_None) + continue; + + const bool deselect = volume.selected && ((shift_pressed && m_rectangle_selection.is_empty()) || (alt_pressed && !m_rectangle_selection.is_empty())); + const bool select = !volume.selected && (m_rectangle_selection.is_empty() || (shift_pressed && !m_rectangle_selection.is_empty())); + + if (select || deselect) { + const bool as_volume = + volume.is_modifier && hover_from_single_instance && !ctrl_pressed && + ( + !deselect || + (deselect && !m_selection.is_single_full_instance() && volume.object_idx() == m_selection.get_object_idx() && volume.instance_idx() == m_selection.get_instance_idx()) + ); + + if (as_volume) + volume.hover = deselect ? GLVolume::HS_Deselect : GLVolume::HS_Select; + else { + const int object_idx = volume.object_idx(); + const int instance_idx = volume.instance_idx(); + + for (GLVolume* v : m_volumes.volumes) { + if (v->object_idx() == object_idx && v->instance_idx() == instance_idx) + v->hover = deselect ? GLVolume::HS_Deselect : GLVolume::HS_Select; + } + } + } + else if (volume.selected) + volume.hover = GLVolume::HS_Hover; + } +} + +void GLCanvas3D::_perform_layer_editing_action(wxMouseEvent* evt) +{ + int object_idx_selected = m_layers_editing.last_object_id; + if (object_idx_selected == -1) + return; + + // A volume is selected. Test, whether hovering over a layer thickness bar. + if (evt != nullptr) { + const Rect& rect = LayersEditing::get_bar_rect_screen(*this); + float b = rect.get_bottom(); + m_layers_editing.last_z = m_layers_editing.object_max_z() * (b - evt->GetY() - 1.0f) / (b - rect.get_top()); + m_layers_editing.last_action = + evt->ShiftDown() ? (evt->RightIsDown() ? LAYER_HEIGHT_EDIT_ACTION_SMOOTH : LAYER_HEIGHT_EDIT_ACTION_REDUCE) : + (evt->RightIsDown() ? LAYER_HEIGHT_EDIT_ACTION_INCREASE : LAYER_HEIGHT_EDIT_ACTION_DECREASE); + } + + m_layers_editing.adjust_layer_height_profile(); + _refresh_if_shown_on_screen(); + + // Automatic action on mouse down with the same coordinate. + _start_timer(); +} + +Vec3d GLCanvas3D::_mouse_to_3d(const Point& mouse_pos, float* z) +{ + if (m_canvas == nullptr) + return Vec3d(DBL_MAX, DBL_MAX, DBL_MAX); + + if (z == nullptr) { + const SceneRaycaster::HitResult hit = m_scene_raycaster.hit(mouse_pos.cast(), wxGetApp().plater()->get_camera(), nullptr); + return hit.is_valid() ? hit.position.cast() : _mouse_to_bed_3d(mouse_pos); + } + else { + const Camera& camera = wxGetApp().plater()->get_camera(); + const Vec4i viewport(camera.get_viewport().data()); + Vec3d out; + igl::unproject(Vec3d(mouse_pos.x(), viewport[3] - mouse_pos.y(), *z), camera.get_view_matrix().matrix(), camera.get_projection_matrix().matrix(), viewport, out); + return out; + } +} + +Vec3d GLCanvas3D::_mouse_to_bed_3d(const Point& mouse_pos) +{ + return mouse_ray(mouse_pos).intersect_plane(0.0); +} + +void GLCanvas3D::_start_timer() +{ + m_timer.Start(100, wxTIMER_CONTINUOUS); +} + +void GLCanvas3D::_stop_timer() +{ + m_timer.Stop(); +} + +void GLCanvas3D::_load_print_toolpaths(const BuildVolume &build_volume) +{ + const Print *print = this->fff_print(); + if (print == nullptr) + return; + + if (! print->is_step_done(psSkirtBrim)) + return; + + if (!print->has_skirt() && !print->has_brim()) + return; + + const ColorRGBA color = ColorRGBA::GREENISH(); + + // number of skirt layers + size_t total_layer_count = 0; + for (const PrintObject* print_object : print->objects()) { + total_layer_count = std::max(total_layer_count, print_object->total_layer_count()); + } + size_t skirt_height = print->has_infinite_skirt() ? total_layer_count : std::min(print->config().skirt_height.value, total_layer_count); + if (skirt_height == 0 && print->has_brim()) + skirt_height = 1; + + // Get first skirt_height layers. + //FIXME This code is fishy. It may not work for multiple objects with different layering due to variable layer height feature. + // This is not critical as this is just an initial preview. + const PrintObject* highest_object = *std::max_element(print->objects().begin(), print->objects().end(), [](auto l, auto r){ return l->layers().size() < r->layers().size(); }); + std::vector print_zs; + print_zs.reserve(skirt_height * 2); + for (size_t i = 0; i < std::min(skirt_height, highest_object->layers().size()); ++ i) + print_zs.emplace_back(float(highest_object->layers()[i]->print_z)); + // Only add skirt for the raft layers. + for (size_t i = 0; i < std::min(skirt_height, std::min(highest_object->slicing_parameters().raft_layers(), highest_object->support_layers().size())); ++ i) + print_zs.emplace_back(float(highest_object->support_layers()[i]->print_z)); + sort_remove_duplicates(print_zs); + skirt_height = std::min(skirt_height, print_zs.size()); + print_zs.erase(print_zs.begin() + skirt_height, print_zs.end()); + + GLVolume* volume = m_volumes.new_toolpath_volume(color); + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + for (size_t i = 0; i < skirt_height; ++ i) { + volume->print_zs.emplace_back(print_zs[i]); + volume->offsets.emplace_back(init_data.indices_count()); + if (i == 0) + _3DScene::extrusionentity_to_verts(print->brim(), print_zs[i], Point(0, 0), init_data); + _3DScene::extrusionentity_to_verts(print->skirt(), print_zs[i], Point(0, 0), init_data); + // Ensure that no volume grows over the limits. If the volume is too large, allocate a new one. + if (init_data.vertices_size_bytes() > MAX_VERTEX_BUFFER_SIZE) { + volume->model.init_from(std::move(init_data)); + GLVolume &vol = *volume; + volume = m_volumes.new_toolpath_volume(vol.color); + } + } + volume->model.init_from(std::move(init_data)); + volume->is_outside = !contains(build_volume, volume->model); +} + +void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, const BuildVolume& build_volume, const std::vector& str_tool_colors, const std::vector& color_print_values) +{ + std::vector tool_colors; + decode_colors(str_tool_colors, tool_colors); + + struct Ctxt + { + const PrintInstances *shifted_copies; + std::vector layers; + bool has_perimeters; + bool has_infill; + bool has_support; + const std::vector* tool_colors; + bool is_single_material_print; + int extruders_cnt; + const std::vector* color_print_values; + + static ColorRGBA color_perimeters() { return ColorRGBA::YELLOW(); } + static ColorRGBA color_infill() { return ColorRGBA::REDISH(); } + static ColorRGBA color_support() { return ColorRGBA::GREENISH(); } + static ColorRGBA color_pause_or_custom_code() { return ColorRGBA::GRAY(); } + + // For cloring by a tool, return a parsed color. + bool color_by_tool() const { return tool_colors != nullptr; } + size_t number_tools() const { return color_by_tool() ? tool_colors->size() : 0; } + const ColorRGBA& color_tool(size_t tool) const { return (*tool_colors)[tool]; } + + // For coloring by a color_print(M600), return a parsed color. + bool color_by_color_print() const { return color_print_values!=nullptr; } + const size_t color_print_color_idx_by_layer_idx(const size_t layer_idx) const { + const CustomGCode::Item value{layers[layer_idx]->print_z + EPSILON, CustomGCode::Custom, 0, ""}; + auto it = std::lower_bound(color_print_values->begin(), color_print_values->end(), value); + return (it - color_print_values->begin()) % number_tools(); + } + + const size_t color_print_color_idx_by_layer_idx_and_extruder(const size_t layer_idx, const int extruder) const + { + const coordf_t print_z = layers[layer_idx]->print_z; + + auto it = std::find_if(color_print_values->begin(), color_print_values->end(), + [print_z](const CustomGCode::Item& code) + { return fabs(code.print_z - print_z) < EPSILON; }); + if (it != color_print_values->end()) { + CustomGCode::Type type = it->type; + // pause print or custom Gcode + if (type == CustomGCode::PausePrint || + (type != CustomGCode::ColorChange && type != CustomGCode::ToolChange)) + return number_tools()-1; // last color item is a gray color for pause print or custom G-code + + // change tool (extruder) + if (type == CustomGCode::ToolChange) + return get_color_idx_for_tool_change(it, extruder); + // change color for current extruder + if (type == CustomGCode::ColorChange) { + int color_idx = get_color_idx_for_color_change(it, extruder); + if (color_idx >= 0) + return color_idx; + } + } + + const CustomGCode::Item value{print_z + EPSILON, CustomGCode::Custom, 0, ""}; + it = std::lower_bound(color_print_values->begin(), color_print_values->end(), value); + while (it != color_print_values->begin()) { + --it; + // change color for current extruder + if (it->type == CustomGCode::ColorChange) { + int color_idx = get_color_idx_for_color_change(it, extruder); + if (color_idx >= 0) + return color_idx; + } + // change tool (extruder) + if (it->type == CustomGCode::ToolChange) + return get_color_idx_for_tool_change(it, extruder); + } + + return std::min(extruders_cnt - 1, std::max(extruder - 1, 0));; + } + + private: + int get_m600_color_idx(std::vector::const_iterator it) const + { + int shift = 0; + while (it != color_print_values->begin()) { + --it; + if (it->type == CustomGCode::ColorChange) + shift++; + } + return extruders_cnt + shift; + } + + int get_color_idx_for_tool_change(std::vector::const_iterator it, const int extruder) const + { + const int current_extruder = it->extruder == 0 ? extruder : it->extruder; + if (number_tools() == size_t(extruders_cnt + 1)) // there is no one "M600" + return std::min(extruders_cnt - 1, std::max(current_extruder - 1, 0)); + + auto it_n = it; + while (it_n != color_print_values->begin()) { + --it_n; + if (it_n->type == CustomGCode::ColorChange && it_n->extruder == current_extruder) + return get_m600_color_idx(it_n); + } + + return std::min(extruders_cnt - 1, std::max(current_extruder - 1, 0)); + } + + int get_color_idx_for_color_change(std::vector::const_iterator it, const int extruder) const + { + if (extruders_cnt == 1) + return get_m600_color_idx(it); + + auto it_n = it; + bool is_tool_change = false; + while (it_n != color_print_values->begin()) { + --it_n; + if (it_n->type == CustomGCode::ToolChange) { + is_tool_change = true; + if (it_n->extruder == it->extruder || (it_n->extruder == 0 && it->extruder == extruder)) + return get_m600_color_idx(it); + break; + } + } + if (!is_tool_change && it->extruder == extruder) + return get_m600_color_idx(it); + + return -1; + } + + } ctxt; + + ctxt.has_perimeters = print_object.is_step_done(posPerimeters); + ctxt.has_infill = print_object.is_step_done(posInfill); + ctxt.has_support = print_object.is_step_done(posSupportMaterial); + ctxt.tool_colors = tool_colors.empty() ? nullptr : &tool_colors; + ctxt.color_print_values = color_print_values.empty() ? nullptr : &color_print_values; + ctxt.is_single_material_print = this->fff_print()->extruders().size()==1; + ctxt.extruders_cnt = wxGetApp().extruders_edited_cnt(); + + ctxt.shifted_copies = &print_object.instances(); + + // order layers by print_z + { + size_t nlayers = 0; + if (ctxt.has_perimeters || ctxt.has_infill) + nlayers = print_object.layers().size(); + if (ctxt.has_support) + nlayers += print_object.support_layers().size(); + ctxt.layers.reserve(nlayers); + } + if (ctxt.has_perimeters || ctxt.has_infill) + for (const Layer *layer : print_object.layers()) + ctxt.layers.emplace_back(layer); + if (ctxt.has_support) + for (const Layer *layer : print_object.support_layers()) + ctxt.layers.emplace_back(layer); + std::sort(ctxt.layers.begin(), ctxt.layers.end(), [](const Layer *l1, const Layer *l2) { return l1->print_z < l2->print_z; }); + + // Maximum size of an allocation block: 32MB / sizeof(float) + BOOST_LOG_TRIVIAL(debug) << "Loading print object toolpaths in parallel - start" << m_volumes.log_memory_info() << log_memory_info(); + + const bool is_selected_separate_extruder = m_selected_extruder > 0 && ctxt.color_by_color_print(); + + //FIXME Improve the heuristics for a grain size. + size_t grain_size = std::max(ctxt.layers.size() / 16, size_t(1)); + tbb::spin_mutex new_volume_mutex; + auto new_volume = [this, &new_volume_mutex](const ColorRGBA& color) { + // Allocate the volume before locking. + GLVolume *volume = new GLVolume(color); + volume->is_extrusion_path = true; + // to prevent sending data to gpu (in the main thread) while + // editing the model geometry + volume->model.disable_render(); + tbb::spin_mutex::scoped_lock lock; + // Lock by ROII, so if the emplace_back() fails, the lock will be released. + lock.acquire(new_volume_mutex); + m_volumes.volumes.emplace_back(volume); + lock.release(); + return volume; + }; + const size_t volumes_cnt_initial = m_volumes.volumes.size(); + // Limit the number of threads as the code below does not scale well due to memory pressure. + // (most of the time is spent in malloc / free / memmove) + // Not using all the threads leaves some of the threads to G-code generator. + tbb::task_arena limited_arena(std::min(tbb::this_task_arena::max_concurrency(), 4)); + limited_arena.execute([&ctxt, grain_size, &new_volume, is_selected_separate_extruder, this]{ + tbb::parallel_for( + tbb::blocked_range(0, ctxt.layers.size(), grain_size), + [&ctxt, &new_volume, is_selected_separate_extruder, this](const tbb::blocked_range& range) { + GLVolumePtrs vols; + std::vector geometries; + auto select_geometry = [&ctxt, &geometries](size_t layer_idx, int extruder, int feature) -> GLModel::Geometry& { + return geometries[ctxt.color_by_color_print() ? + ctxt.color_print_color_idx_by_layer_idx_and_extruder(layer_idx, extruder) : + ctxt.color_by_tool() ? + std::min(ctxt.number_tools() - 1, std::max(extruder - 1, 0)) : + feature + ]; + }; + if (ctxt.color_by_color_print() || ctxt.color_by_tool()) { + for (size_t i = 0; i < ctxt.number_tools(); ++i) { + vols.emplace_back(new_volume(ctxt.color_tool(i))); + geometries.emplace_back(GLModel::Geometry()); + } + } + else { + vols = { new_volume(ctxt.color_perimeters()), new_volume(ctxt.color_infill()), new_volume(ctxt.color_support()) }; + geometries = { GLModel::Geometry(), GLModel::Geometry(), GLModel::Geometry() }; + } + + assert(vols.size() == geometries.size()); + for (GLModel::Geometry& g : geometries) { + g.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + } + for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { + const Layer *layer = ctxt.layers[idx_layer]; + + if (is_selected_separate_extruder) { + bool at_least_one_has_correct_extruder = false; + for (const LayerRegion* layerm : layer->regions()) { + if (layerm->slices().empty()) + continue; + const PrintRegionConfig& cfg = layerm->region().config(); + if (cfg.perimeter_extruder.value == m_selected_extruder || + cfg.infill_extruder.value == m_selected_extruder || + cfg.solid_infill_extruder.value == m_selected_extruder ) { + at_least_one_has_correct_extruder = true; + break; + } + } + if (!at_least_one_has_correct_extruder) + continue; + } + + for (size_t i = 0; i < vols.size(); ++i) { + GLVolume* vol = vols[i]; + if (vol->print_zs.empty() || vol->print_zs.back() != layer->print_z) { + vol->print_zs.emplace_back(layer->print_z); + vol->offsets.emplace_back(geometries[i].indices_count()); + } + } + + for (const PrintInstance &instance : *ctxt.shifted_copies) { + const Point © = instance.shift; + for (const LayerRegion *layerm : layer->regions()) { + if (is_selected_separate_extruder) { + const PrintRegionConfig& cfg = layerm->region().config(); + if (cfg.perimeter_extruder.value != m_selected_extruder || + cfg.infill_extruder.value != m_selected_extruder || + cfg.solid_infill_extruder.value != m_selected_extruder) + continue; + } + if (ctxt.has_perimeters) + _3DScene::extrusionentity_to_verts(layerm->perimeters(), float(layer->print_z), copy, + select_geometry(idx_layer, layerm->region().config().perimeter_extruder.value, 0)); + if (ctxt.has_infill) { + for (const ExtrusionEntity *ee : layerm->fills()) { + // fill represents infill extrusions of a single island. + const auto *fill = dynamic_cast(ee); + if (! fill->entities.empty()) + _3DScene::extrusionentity_to_verts(*fill, float(layer->print_z), copy, + select_geometry(idx_layer, fill->entities.front()->role().is_solid_infill() ? + layerm->region().config().solid_infill_extruder : + layerm->region().config().infill_extruder, 1)); + } + } + } + if (ctxt.has_support) { + const SupportLayer *support_layer = dynamic_cast(layer); + if (support_layer) { + for (const ExtrusionEntity *extrusion_entity : support_layer->support_fills.entities) + _3DScene::extrusionentity_to_verts(extrusion_entity, float(layer->print_z), copy, + select_geometry(idx_layer, (extrusion_entity->role() == ExtrusionRole::SupportMaterial) ? + support_layer->object()->config().support_material_extruder : + support_layer->object()->config().support_material_interface_extruder, 2)); + } + } + } + // Ensure that no volume grows over the limits. If the volume is too large, allocate a new one. + for (size_t i = 0; i < vols.size(); ++i) { + GLVolume &vol = *vols[i]; + if (geometries[i].vertices_size_bytes() > MAX_VERTEX_BUFFER_SIZE) { + vol.model.init_from(std::move(geometries[i])); + vols[i] = new_volume(vol.color); + } + } + } + + for (size_t i = 0; i < vols.size(); ++i) { + if (!geometries[i].is_empty()) + vols[i]->model.init_from(std::move(geometries[i])); + } + }); + }); // task arena + + BOOST_LOG_TRIVIAL(debug) << "Loading print object toolpaths in parallel - finalizing results" << m_volumes.log_memory_info() << log_memory_info(); + // Remove empty volumes from the newly added volumes. + { + for (auto ptr_it = m_volumes.volumes.begin() + volumes_cnt_initial; ptr_it != m_volumes.volumes.end(); ++ptr_it) + if ((*ptr_it)->empty()) { + delete *ptr_it; + *ptr_it = nullptr; + } + m_volumes.volumes.erase(std::remove(m_volumes.volumes.begin() + volumes_cnt_initial, m_volumes.volumes.end(), nullptr), m_volumes.volumes.end()); + } + for (size_t i = volumes_cnt_initial; i < m_volumes.volumes.size(); ++i) { + GLVolume* v = m_volumes.volumes[i]; + v->is_outside = !contains(build_volume, v->model); + // We are done editinig the model, now it can be sent to gpu + v->model.enable_render(); + } + + BOOST_LOG_TRIVIAL(debug) << "Loading print object toolpaths in parallel - end" << m_volumes.log_memory_info() << log_memory_info(); +} + +void GLCanvas3D::_load_wipe_tower_toolpaths(const BuildVolume& build_volume, const std::vector& str_tool_colors) +{ + const Print *print = this->fff_print(); + if (print == nullptr || print->wipe_tower_data().tool_changes.empty()) + return; + + if (!print->is_step_done(psWipeTower)) + return; + + std::vector tool_colors; + decode_colors(str_tool_colors, tool_colors); + + struct Ctxt + { + const Print *print; + const std::vector *tool_colors; + Vec2f wipe_tower_pos; + float wipe_tower_angle; + + static ColorRGBA color_support() { return ColorRGBA::GREENISH(); } + + // For cloring by a tool, return a parsed color. + bool color_by_tool() const { return tool_colors != nullptr; } + size_t number_tools() const { return this->color_by_tool() ? tool_colors->size() : 0; } + const ColorRGBA& color_tool(size_t tool) const { return (*tool_colors)[tool]; } + int volume_idx(int tool, int feature) const { + return this->color_by_tool() ? std::min(this->number_tools() - 1, std::max(tool, 0)) : feature; + } + + const std::vector& tool_change(size_t idx) { + const auto &tool_changes = print->wipe_tower_data().tool_changes; + return priming.empty() ? + ((idx == tool_changes.size()) ? final : tool_changes[idx]) : + ((idx == 0) ? priming : (idx == tool_changes.size() + 1) ? final : tool_changes[idx - 1]); + } + std::vector priming; + std::vector final; + } ctxt; + + ctxt.print = print; + ctxt.tool_colors = tool_colors.empty() ? nullptr : &tool_colors; + if (print->wipe_tower_data().priming && print->config().single_extruder_multi_material_priming) + for (int i=0; i<(int)print->wipe_tower_data().priming.get()->size(); ++i) + ctxt.priming.emplace_back(print->wipe_tower_data().priming.get()->at(i)); + if (print->wipe_tower_data().final_purge) + ctxt.final.emplace_back(*print->wipe_tower_data().final_purge.get()); + + ctxt.wipe_tower_angle = ctxt.print->config().wipe_tower_rotation_angle.value/180.f * PI; + ctxt.wipe_tower_pos = Vec2f(ctxt.print->config().wipe_tower_x.value, ctxt.print->config().wipe_tower_y.value); + + BOOST_LOG_TRIVIAL(debug) << "Loading wipe tower toolpaths in parallel - start" << m_volumes.log_memory_info() << log_memory_info(); + + //FIXME Improve the heuristics for a grain size. + size_t n_items = print->wipe_tower_data().tool_changes.size() + (ctxt.priming.empty() ? 0 : 1); + size_t grain_size = std::max(n_items / 128, size_t(1)); + tbb::spin_mutex new_volume_mutex; + auto new_volume = [this, &new_volume_mutex](const ColorRGBA& color) { + auto *volume = new GLVolume(color); + volume->is_extrusion_path = true; + // to prevent sending data to gpu (in the main thread) while + // editing the model geometry + volume->model.disable_render(); + tbb::spin_mutex::scoped_lock lock; + lock.acquire(new_volume_mutex); + m_volumes.volumes.emplace_back(volume); + lock.release(); + return volume; + }; + const size_t volumes_cnt_initial = m_volumes.volumes.size(); + std::vector volumes_per_thread(n_items); + tbb::parallel_for( + tbb::blocked_range(0, n_items, grain_size), + [&ctxt, &new_volume](const tbb::blocked_range& range) { + // Bounding box of this slab of a wipe tower. + GLVolumePtrs vols; + std::vector geometries; + if (ctxt.color_by_tool()) { + for (size_t i = 0; i < ctxt.number_tools(); ++i) { + vols.emplace_back(new_volume(ctxt.color_tool(i))); + geometries.emplace_back(GLModel::Geometry()); + } + } + else { + vols = { new_volume(ctxt.color_support()) }; + geometries = { GLModel::Geometry() }; + } + + assert(vols.size() == geometries.size()); + for (GLModel::Geometry& g : geometries) { + g.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + } + for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++idx_layer) { + const std::vector &layer = ctxt.tool_change(idx_layer); + for (size_t i = 0; i < vols.size(); ++i) { + GLVolume &vol = *vols[i]; + if (vol.print_zs.empty() || vol.print_zs.back() != layer.front().print_z) { + vol.print_zs.emplace_back(layer.front().print_z); + vol.offsets.emplace_back(geometries[i].indices_count()); + } + } + for (const WipeTower::ToolChangeResult &extrusions : layer) { + for (size_t i = 1; i < extrusions.extrusions.size();) { + const WipeTower::Extrusion &e = extrusions.extrusions[i]; + if (e.width == 0.) { + ++i; + continue; + } + size_t j = i + 1; + if (ctxt.color_by_tool()) + for (; j < extrusions.extrusions.size() && extrusions.extrusions[j].tool == e.tool && extrusions.extrusions[j].width > 0.f; ++j); + else + for (; j < extrusions.extrusions.size() && extrusions.extrusions[j].width > 0.f; ++j); + size_t n_lines = j - i; + Lines lines; + std::vector widths; + std::vector heights; + lines.reserve(n_lines); + widths.reserve(n_lines); + heights.assign(n_lines, extrusions.layer_height); + WipeTower::Extrusion e_prev = extrusions.extrusions[i-1]; + + if (!extrusions.priming) { // wipe tower extrusions describe the wipe tower at the origin with no rotation + e_prev.pos = Eigen::Rotation2Df(ctxt.wipe_tower_angle) * e_prev.pos; + e_prev.pos += ctxt.wipe_tower_pos; + } + + for (; i < j; ++i) { + WipeTower::Extrusion e = extrusions.extrusions[i]; + assert(e.width > 0.f); + if (!extrusions.priming) { + e.pos = Eigen::Rotation2Df(ctxt.wipe_tower_angle) * e.pos; + e.pos += ctxt.wipe_tower_pos; + } + + lines.emplace_back(Point::new_scale(e_prev.pos.x(), e_prev.pos.y()), Point::new_scale(e.pos.x(), e.pos.y())); + widths.emplace_back(e.width); + + e_prev = e; + } + + _3DScene::thick_lines_to_verts(lines, widths, heights, lines.front().a == lines.back().b, extrusions.print_z, + geometries[ctxt.volume_idx(e.tool, 0)]); + } + } + } + for (size_t i = 0; i < vols.size(); ++i) { + GLVolume &vol = *vols[i]; + if (geometries[i].vertices_size_bytes() > MAX_VERTEX_BUFFER_SIZE) { + vol.model.init_from(std::move(geometries[i])); + vols[i] = new_volume(vol.color); + } + } + + for (size_t i = 0; i < vols.size(); ++i) { + if (!geometries[i].is_empty()) + vols[i]->model.init_from(std::move(geometries[i])); + } + }); + + BOOST_LOG_TRIVIAL(debug) << "Loading wipe tower toolpaths in parallel - finalizing results" << m_volumes.log_memory_info() << log_memory_info(); + // Remove empty volumes from the newly added volumes. + { + for (auto ptr_it = m_volumes.volumes.begin() + volumes_cnt_initial; ptr_it != m_volumes.volumes.end(); ++ptr_it) + if ((*ptr_it)->empty()) { + delete *ptr_it; + *ptr_it = nullptr; + } + m_volumes.volumes.erase(std::remove(m_volumes.volumes.begin() + volumes_cnt_initial, m_volumes.volumes.end(), nullptr), m_volumes.volumes.end()); + } + for (size_t i = volumes_cnt_initial; i < m_volumes.volumes.size(); ++i) { + GLVolume* v = m_volumes.volumes[i]; + v->is_outside = !contains(build_volume, v->model); + // We are done editinig the model, now it can be sent to gpu + v->model.enable_render(); + } + + BOOST_LOG_TRIVIAL(debug) << "Loading wipe tower toolpaths in parallel - end" << m_volumes.log_memory_info() << log_memory_info(); +} + +// While it looks like we can call +// this->reload_scene(true, true) +// the two functions are quite different: +// 1) This function only loads objects, for which the step slaposSliceSupports already finished. Therefore objects outside of the print bed never load. +// 2) This function loads object mesh with the relative scaling correction (the "relative_correction" parameter) was applied, +// therefore the mesh may be slightly larger or smaller than the mesh shown in the 3D scene. +void GLCanvas3D::_load_sla_shells() +{ + const SLAPrint* print = this->sla_print(); + if (print->objects().empty()) + // nothing to render, return + return; + + auto add_volume = [this](const SLAPrintObject &object, int volume_id, const SLAPrintObject::Instance& instance, + const indexed_triangle_set& mesh, const ColorRGBA& color, bool outside_printer_detection_enabled) { + m_volumes.volumes.emplace_back(new GLVolume(color)); + GLVolume& v = *m_volumes.volumes.back(); +#if ENABLE_SMOOTH_NORMALS + v.model.init_from(mesh, true); +#else + v.model.init_from(mesh); +#endif // ENABLE_SMOOTH_NORMALS + v.shader_outside_printer_detection_enabled = outside_printer_detection_enabled; + v.composite_id.volume_id = volume_id; + v.set_instance_offset(unscale(instance.shift.x(), instance.shift.y(), 0.0)); + v.set_instance_rotation({ 0.0, 0.0, (double)instance.rotation }); + v.set_instance_mirror(X, object.is_left_handed() ? -1. : 1.); + v.set_convex_hull(TriangleMesh{its_convex_hull(mesh)}); + }; + + // adds objects' volumes + for (const SLAPrintObject* obj : print->objects()) { + unsigned int initial_volumes_count = (unsigned int)m_volumes.volumes.size(); + std::shared_ptr m = obj->get_mesh_to_print(); + if (m && !m->empty()) { + for (const SLAPrintObject::Instance& instance : obj->instances()) { + add_volume(*obj, 0, instance, *m, GLVolume::MODEL_COLOR[0], true); + // Set the extruder_id and volume_id to achieve the same color as in the 3D scene when + // through the update_volumes_colors_by_extruder() call. + m_volumes.volumes.back()->extruder_id = obj->model_object()->volumes.front()->extruder_id(); + if (auto &tree_mesh = obj->support_mesh().its; !tree_mesh.empty()) + add_volume(*obj, -int(slaposSupportTree), instance, tree_mesh, GLVolume::SLA_SUPPORT_COLOR, true); + if (auto &pad_mesh = obj->pad_mesh().its; !pad_mesh.empty()) + add_volume(*obj, -int(slaposPad), instance, pad_mesh, GLVolume::SLA_PAD_COLOR, false); + } + } + const double shift_z = obj->get_current_elevation(); + for (unsigned int i = initial_volumes_count; i < m_volumes.volumes.size(); ++ i) { + // apply shift z + m_volumes.volumes[i]->set_sla_shift_z(shift_z); + } + } + + update_volumes_colors_by_extruder(); +} + +void GLCanvas3D::_update_sla_shells_outside_state() +{ + check_volumes_outside_state(); +} + +void GLCanvas3D::_set_warning_notification_if_needed(EWarning warning) +{ + _set_current(); + bool show = false; + if (!m_volumes.empty()) { + if (current_printer_technology() == ptSLA) { + const auto [res, volume] = _is_any_volume_outside(); + if (res) { + if (warning == EWarning::ObjectClashed) + show = !volume->is_sla_support(); + else if (warning == EWarning::SlaSupportsOutside) + show = volume->is_sla_support(); + } + } + else + show = _is_any_volume_outside().first; + } + else { + if (wxGetApp().is_editor()) { + if (current_printer_technology() != ptSLA) + show = m_gcode_viewer.has_data() && !m_gcode_viewer.is_contained_in_bed(); + } + } + + _set_warning_notification(warning, show); +} + +void GLCanvas3D::_set_warning_notification(EWarning warning, bool state) +{ + enum ErrorType{ + PLATER_WARNING, + PLATER_ERROR, + SLICING_ERROR + }; + std::string text; + ErrorType error = ErrorType::PLATER_WARNING; + switch (warning) { + case EWarning::ObjectOutside: text = _u8L("An object outside the print area was detected."); break; + case EWarning::ToolpathOutside: text = _u8L("A toolpath outside the print area was detected."); error = ErrorType::SLICING_ERROR; break; + case EWarning::SlaSupportsOutside: text = _u8L("SLA supports outside the print area were detected."); error = ErrorType::PLATER_ERROR; break; + case EWarning::SomethingNotShown: text = _u8L("Some objects are not visible during editing."); break; + case EWarning::ObjectClashed: + text = _u8L("An object outside the print area was detected.\n" + "Resolve the current problem to continue slicing."); + error = ErrorType::PLATER_ERROR; + break; + } + auto& notification_manager = *wxGetApp().plater()->get_notification_manager(); + switch (error) + { + case PLATER_WARNING: + if (state) + notification_manager.push_plater_warning_notification(text); + else + notification_manager.close_plater_warning_notification(text); + break; + case PLATER_ERROR: + if (state) + notification_manager.push_plater_error_notification(text); + else + notification_manager.close_plater_error_notification(text); + break; + case SLICING_ERROR: + if (state) + notification_manager.push_slicing_error_notification(text); + else + notification_manager.close_slicing_error_notification(text); + break; + default: + break; + } +} + +std::pair GLCanvas3D::_is_any_volume_outside() const +{ + for (const GLVolume* volume : m_volumes.volumes) { + if (volume != nullptr && volume->is_outside) + return std::make_pair(true, volume); + } + + return std::make_pair(false, nullptr); +} + +void GLCanvas3D::_update_selection_from_hover() +{ + bool ctrl_pressed = wxGetKeyState(WXK_CONTROL); + bool selection_changed = false; + + if (m_hover_volume_idxs.empty()) { + if (!ctrl_pressed && m_rectangle_selection.get_state() == GLSelectionRectangle::EState::Select) { + selection_changed = ! m_selection.is_empty(); + m_selection.remove_all(); + } + } + + GLSelectionRectangle::EState state = m_rectangle_selection.get_state(); + + bool hover_modifiers_only = true; + for (int i : m_hover_volume_idxs) { + if (!m_volumes.volumes[i]->is_modifier) { + hover_modifiers_only = false; + break; + } + } + + if (!m_rectangle_selection.is_empty()) { + if (state == GLSelectionRectangle::EState::Select) { + bool contains_all = true; + for (int i : m_hover_volume_idxs) { + if (!m_selection.contains_volume((unsigned int)i)) { + contains_all = false; + break; + } + } + + // the selection is going to be modified (Add) + if (!contains_all) { + wxGetApp().plater()->take_snapshot(_L("Selection-Add from rectangle"), UndoRedo::SnapshotType::Selection); + selection_changed = true; + } + } + else { + bool contains_any = false; + for (int i : m_hover_volume_idxs) { + if (m_selection.contains_volume((unsigned int)i)) { + contains_any = true; + break; + } + } + + // the selection is going to be modified (Remove) + if (contains_any) { + wxGetApp().plater()->take_snapshot(_L("Selection-Remove from rectangle"), UndoRedo::SnapshotType::Selection); + selection_changed = true; + } + } + } + + if (!selection_changed) + return; + + Plater::SuppressSnapshots suppress(wxGetApp().plater()); + + if (state == GLSelectionRectangle::EState::Select && !ctrl_pressed) + m_selection.clear(); + + for (int i : m_hover_volume_idxs) { + if (state == GLSelectionRectangle::EState::Select) { + if (hover_modifiers_only) { + const GLVolume& v = *m_volumes.volumes[i]; + m_selection.add_volume(v.object_idx(), v.volume_idx(), v.instance_idx(), false); + } + else + m_selection.add(i, false); + } + else + m_selection.remove(i); + } + + if (m_selection.is_empty()) + m_gizmos.reset_all_states(); + else + m_gizmos.refresh_on_off_state(); + + m_gizmos.update_data(); + post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT)); + m_dirty = true; +} + +bool GLCanvas3D::_deactivate_undo_redo_toolbar_items() +{ + if (m_undoredo_toolbar.is_item_pressed("undo")) { + m_undoredo_toolbar.force_right_action(m_undoredo_toolbar.get_item_id("undo"), *this); + return true; + } + else if (m_undoredo_toolbar.is_item_pressed("redo")) { + m_undoredo_toolbar.force_right_action(m_undoredo_toolbar.get_item_id("redo"), *this); + return true; + } + + return false; +} + +bool GLCanvas3D::is_search_pressed() const +{ + return m_main_toolbar.is_item_pressed("search"); +} + +bool GLCanvas3D::_deactivate_arrange_menu() +{ + if (m_main_toolbar.is_item_pressed("arrange")) { + m_main_toolbar.force_right_action(m_main_toolbar.get_item_id("arrange"), *this); + return true; + } + + return false; +} + +bool GLCanvas3D::_deactivate_search_toolbar_item() +{ + if (is_search_pressed()) { + m_main_toolbar.force_left_action(m_main_toolbar.get_item_id("search"), *this); + return true; + } + + return false; +} + +bool GLCanvas3D::_activate_search_toolbar_item() +{ + if (!m_main_toolbar.is_item_pressed("search")) { + m_main_toolbar.force_left_action(m_main_toolbar.get_item_id("search"), *this); + return true; + } + + return false; +} + +bool GLCanvas3D::_deactivate_collapse_toolbar_items() +{ + GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); + if (collapse_toolbar.is_item_pressed("print")) { + collapse_toolbar.force_left_action(collapse_toolbar.get_item_id("print"), *this); + return true; + } + + return false; +} + +void GLCanvas3D::highlight_toolbar_item(const std::string& item_name) +{ + GLToolbarItem* item = m_main_toolbar.get_item(item_name); + if (!item) + item = m_undoredo_toolbar.get_item(item_name); + if (!item || !item->is_visible()) + return; + m_toolbar_highlighter.init(item, this); +} + +void GLCanvas3D::highlight_gizmo(const std::string& gizmo_name) +{ + GLGizmosManager::EType gizmo = m_gizmos.get_gizmo_from_name(gizmo_name); + if(gizmo == GLGizmosManager::EType::Undefined) + return; + m_gizmo_highlighter.init(&m_gizmos, gizmo, this); +} + +const Print* GLCanvas3D::fff_print() const +{ + return (m_process == nullptr) ? nullptr : m_process->fff_print(); +} + +const SLAPrint* GLCanvas3D::sla_print() const +{ + return (m_process == nullptr) ? nullptr : m_process->sla_print(); +} + +void GLCanvas3D::WipeTowerInfo::apply_wipe_tower() const +{ + DynamicPrintConfig cfg; + cfg.opt("wipe_tower_x", true)->value = m_pos(X); + cfg.opt("wipe_tower_y", true)->value = m_pos(Y); + cfg.opt("wipe_tower_rotation_angle", true)->value = (180./M_PI) * m_rotation; + wxGetApp().get_tab(Preset::TYPE_PRINT)->load_config(cfg); +} + +void GLCanvas3D::RenderTimer::Notify() +{ + wxPostEvent((wxEvtHandler*)GetOwner(), RenderTimerEvent( EVT_GLCANVAS_RENDER_TIMER, *this)); +} + +void GLCanvas3D::ToolbarHighlighterTimer::Notify() +{ + wxPostEvent((wxEvtHandler*)GetOwner(), ToolbarHighlighterTimerEvent(EVT_GLCANVAS_TOOLBAR_HIGHLIGHTER_TIMER, *this)); +} + +void GLCanvas3D::GizmoHighlighterTimer::Notify() +{ + wxPostEvent((wxEvtHandler*)GetOwner(), GizmoHighlighterTimerEvent(EVT_GLCANVAS_GIZMO_HIGHLIGHTER_TIMER, *this)); +} + +void GLCanvas3D::ToolbarHighlighter::set_timer_owner(wxEvtHandler* owner, int timerid/* = wxID_ANY*/) +{ + m_timer.SetOwner(owner, timerid); +} + +void GLCanvas3D::ToolbarHighlighter::init(GLToolbarItem* toolbar_item, GLCanvas3D* canvas) +{ + if (m_timer.IsRunning()) + invalidate(); + if (!toolbar_item || !canvas) + return; + + m_timer.Start(300, false); + + m_toolbar_item = toolbar_item; + m_canvas = canvas; +} + +void GLCanvas3D::ToolbarHighlighter::invalidate() +{ + m_timer.Stop(); + + if (m_toolbar_item) { + m_toolbar_item->set_highlight(GLToolbarItem::EHighlightState::NotHighlighted); + } + m_toolbar_item = nullptr; + m_blink_counter = 0; + m_render_arrow = false; +} + +void GLCanvas3D::ToolbarHighlighter::blink() +{ + if (m_toolbar_item) { + char state = m_toolbar_item->get_highlight(); + if (state != (char)GLToolbarItem::EHighlightState::HighlightedShown) + m_toolbar_item->set_highlight(GLToolbarItem::EHighlightState::HighlightedShown); + else + m_toolbar_item->set_highlight(GLToolbarItem::EHighlightState::HighlightedHidden); + + m_render_arrow = !m_render_arrow; + m_canvas->set_as_dirty(); + } + else + invalidate(); + + if ((++m_blink_counter) >= 11) + invalidate(); +} + +void GLCanvas3D::GizmoHighlighter::set_timer_owner(wxEvtHandler* owner, int timerid/* = wxID_ANY*/) +{ + m_timer.SetOwner(owner, timerid); +} + +void GLCanvas3D::GizmoHighlighter::init(GLGizmosManager* manager, GLGizmosManager::EType gizmo, GLCanvas3D* canvas) +{ + if (m_timer.IsRunning()) + invalidate(); + if (gizmo == GLGizmosManager::EType::Undefined || !canvas) + return; + + m_timer.Start(300, false); + + m_gizmo_manager = manager; + m_gizmo_type = gizmo; + m_canvas = canvas; +} + +void GLCanvas3D::GizmoHighlighter::invalidate() +{ + m_timer.Stop(); + + if (m_gizmo_manager) { + m_gizmo_manager->set_highlight(GLGizmosManager::EType::Undefined, false); + } + m_gizmo_manager = nullptr; + m_gizmo_type = GLGizmosManager::EType::Undefined; + m_blink_counter = 0; + m_render_arrow = false; +} + +void GLCanvas3D::GizmoHighlighter::blink() +{ + if (m_gizmo_manager) { + if (m_blink_counter % 2 == 0) + m_gizmo_manager->set_highlight(m_gizmo_type, true); + else + m_gizmo_manager->set_highlight(m_gizmo_type, false); + + m_render_arrow = !m_render_arrow; + m_canvas->set_as_dirty(); + } + else + invalidate(); + + if ((++m_blink_counter) >= 11) + invalidate(); +} + +const ModelVolume *get_model_volume(const GLVolume &v, const Model &model) +{ + const ModelVolume * ret = nullptr; + + if (v.object_idx() < (int)model.objects.size()) { + const ModelObject *obj = model.objects[v.object_idx()]; + if (v.volume_idx() < (int)obj->volumes.size()) + ret = obj->volumes[v.volume_idx()]; + } + + return ret; +} + +const ModelVolume *get_model_volume(const ObjectID &volume_id, const ModelObjectPtrs &objects) +{ + for (const ModelObject *obj : objects) + for (const ModelVolume *vol : obj->volumes) + if (vol->id() == volume_id) + return vol; + return nullptr; +} + +ModelVolume *get_model_volume(const GLVolume &v, const ModelObject& object) { + if (v.volume_idx() < 0) + return nullptr; + + size_t volume_idx = static_cast(v.volume_idx()); + if (volume_idx >= object.volumes.size()) + return nullptr; + + return object.volumes[volume_idx]; +} + +ModelVolume *get_model_volume(const GLVolume &v, const ModelObjectPtrs &objects) +{ + if (v.object_idx() < 0) + return nullptr; + size_t objext_idx = static_cast(v.object_idx()); + if (objext_idx >= objects.size()) + return nullptr; + if (objects[objext_idx] == nullptr) + return nullptr; + return get_model_volume(v, *objects[objext_idx]); +} + +GLVolume *get_first_hovered_gl_volume(const GLCanvas3D &canvas) { + int hovered_id_signed = canvas.get_first_hover_volume_idx(); + if (hovered_id_signed < 0) + return nullptr; + + size_t hovered_id = static_cast(hovered_id_signed); + const GLVolumePtrs &volumes = canvas.get_volumes().volumes; + if (hovered_id >= volumes.size()) + return nullptr; + + return volumes[hovered_id]; +} + +GLVolume *get_selected_gl_volume(const GLCanvas3D &canvas) { + const GLVolume *gl_volume = get_selected_gl_volume(canvas.get_selection()); + if (gl_volume == nullptr) + return nullptr; + + const GLVolumePtrs &gl_volumes = canvas.get_volumes().volumes; + for (GLVolume *v : gl_volumes) + if (v->composite_id == gl_volume->composite_id) + return v; + return nullptr; +} + +ModelObject *get_model_object(const GLVolume &gl_volume, const Model &model) { + return get_model_object(gl_volume, model.objects); +} + +ModelObject *get_model_object(const GLVolume &gl_volume, const ModelObjectPtrs &objects) { + if (gl_volume.object_idx() < 0) + return nullptr; + size_t objext_idx = static_cast(gl_volume.object_idx()); + if (objext_idx >= objects.size()) + return nullptr; + return objects[objext_idx]; +} + +ModelInstance *get_model_instance(const GLVolume &gl_volume, const Model& model) { + return get_model_instance(gl_volume, model.objects); +} + +ModelInstance *get_model_instance(const GLVolume &gl_volume, const ModelObjectPtrs &objects) { + if (gl_volume.instance_idx() < 0) + return nullptr; + ModelObject *object = get_model_object(gl_volume, objects); + return get_model_instance(gl_volume, *object); +} + +ModelInstance *get_model_instance(const GLVolume &gl_volume, const ModelObject &object) { + if (gl_volume.instance_idx() < 0) + return nullptr; + size_t instance_idx = static_cast(gl_volume.instance_idx()); + if (instance_idx >= object.instances.size()) + return nullptr; + return object.instances[instance_idx]; +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index b09496f0fa5..0f45d059748 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -16,6 +16,8 @@ #include "libslic3r/GCode/GCodeProcessor.hpp" #include "GCodeViewer.hpp" #include "Camera.hpp" +#include "SceneRaycaster.hpp" +#include "GUI_Utils.hpp" #include "libslic3r/Slicing.hpp" @@ -59,25 +61,24 @@ class RetinaHelper; class Size { - int m_width; - int m_height; - float m_scale_factor; + int m_width{ 0 }; + int m_height{ 0 }; + float m_scale_factor{ 1.0f }; public: - Size(); - Size(int width, int height, float scale_factor = 1.0); + Size() = default; + Size(int width, int height, float scale_factor = 1.0f) : m_width(width), m_height(height), m_scale_factor(scale_factor) {} - int get_width() const; - void set_width(int width); + int get_width() const { return m_width; } + void set_width(int width) { m_width = width; } - int get_height() const; - void set_height(int height); + int get_height() const { return m_height; } + void set_height(int height) { m_height = height; } - int get_scale_factor() const; - void set_scale_factor(int height); + float get_scale_factor() const { return m_scale_factor; } + void set_scale_factor(float factor) { m_scale_factor = factor; } }; - class RenderTimerEvent : public wxEvent { public: @@ -133,7 +134,6 @@ class GizmoHighlighterTimerEvent : public wxEvent wxTimer* m_timer; }; - wxDECLARE_EVENT(EVT_GLCANVAS_OBJECT_SELECT, SimpleEvent); using Vec2dEvent = Event; @@ -157,6 +157,7 @@ wxDECLARE_EVENT(EVT_GLCANVAS_INSTANCE_MOVED, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_FORCE_UPDATE, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_WIPETOWER_MOVED, Vec3dEvent); wxDECLARE_EVENT(EVT_GLCANVAS_INSTANCE_ROTATED, SimpleEvent); +wxDECLARE_EVENT(EVT_GLCANVAS_RESET_SKEW, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_INSTANCE_SCALED, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_WIPETOWER_ROTATED, Vec3dEvent); wxDECLARE_EVENT(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, Event); @@ -196,8 +197,8 @@ class GLCanvas3D }; static const float THICKNESS_BAR_WIDTH; - private: + private: bool m_enabled{ false }; unsigned int m_z_texture_id{ 0 }; // Not owned by LayersEditing. @@ -241,6 +242,22 @@ class GLCanvas3D float last_z{ 0.0f }; LayerHeightEditActionType last_action{ LAYER_HEIGHT_EDIT_ACTION_INCREASE }; + struct Profile + { + GLModel baseline; + GLModel profile; + GLModel background; + struct OldCanvasWidth + { + float background{ 0.0f }; + float baseline{ 0.0f }; + float profile{ 0.0f }; + }; + OldCanvasWidth old_canvas_width; + std::vector old_layer_height_profile; + }; + Profile m_profile; + LayersEditing() = default; ~LayersEditing(); @@ -254,7 +271,7 @@ class GLCanvas3D bool is_enabled() const; void set_enabled(bool enabled); - void render_overlay(const GLCanvas3D& canvas) const; + void render_overlay(const GLCanvas3D& canvas); void render_volumes(const GLCanvas3D& canvas, const GLVolumeCollection& volumes); void adjust_layer_height_profile(); @@ -266,22 +283,22 @@ class GLCanvas3D static float get_cursor_z_relative(const GLCanvas3D& canvas); static bool bar_rect_contains(const GLCanvas3D& canvas, float x, float y); static Rect get_bar_rect_screen(const GLCanvas3D& canvas); - static Rect get_bar_rect_viewport(const GLCanvas3D& canvas); static float get_overlay_window_width() { return LayersEditing::s_overlay_window_width; } float object_max_z() const { return m_object_max_z; } std::string get_tooltip(const GLCanvas3D& canvas) const; + std::pair> get_layers_height_data(); + private: bool is_initialized() const; void generate_layer_height_texture(); - void render_active_object_annotations(const GLCanvas3D& canvas, const Rect& bar_rect) const; - void render_profile(const Rect& bar_rect) const; + void render_active_object_annotations(const GLCanvas3D& canvas); + void render_profile(const GLCanvas3D& canvas); void update_slicing_parameters(); - static float thickness_bar_width(const GLCanvas3D &canvas); - + static float thickness_bar_width(const GLCanvas3D &canvas); }; struct Mouse @@ -327,12 +344,12 @@ class GLCanvas3D { struct Triangles { - Pointf3s object; - Pointf3s supports; + GLModel object; + GLModel supports; }; - typedef std::map ObjectIdToTrianglesMap; + typedef std::map ObjectIdToModelsMap; double z; - ObjectIdToTrianglesMap triangles; + ObjectIdToModelsMap triangles; SlaCap() { reset(); } void reset() { z = DBL_MAX; triangles.clear(); } @@ -389,6 +406,7 @@ class GLCanvas3D std::chrono::steady_clock::time_point m_start_time; // Indicator that the mouse is inside an ImGUI dialog, therefore the tooltip should be suppressed. bool m_in_imgui = false; + float m_cursor_height{ 16.0f }; public: bool is_empty() const { return m_text.empty(); } @@ -439,7 +457,8 @@ class GLCanvas3D struct ArrangeSettings { - float distance = 6.; + float distance = 6.f; + float distance_from_bed = 0.f; // float distance_seq_print = 6.; // Used when sequential print is ON // float distance_sla = 6.; float accuracy = 0.65f; // Unused currently @@ -450,6 +469,7 @@ class GLCanvas3D private: wxGLCanvas* m_canvas; wxGLContext* m_context; + SceneRaycaster m_scene_raycaster; Bed3D &m_bed; #if ENABLE_RETINA_GL std::unique_ptr m_retina_helper; @@ -464,7 +484,7 @@ class GLCanvas3D std::array m_clipping_planes; ClippingPlane m_camera_clipping_plane; bool m_use_clipping_planes; - SlaCap m_sla_caps[2]; + std::array m_sla_caps; std::string m_sidebar_field; // when true renders an extra frame by not resetting m_dirty to false // see request_extra_frame() @@ -472,6 +492,9 @@ class GLCanvas3D bool m_event_handlers_bound{ false }; GLVolumeCollection m_volumes; +#if ENABLE_OPENGL_ES + TriangleMesh m_wipe_tower_mesh; +#endif // ENABLE_OPENGL_ES GCodeViewer m_gcode_viewer; RenderTimer m_render_timer; @@ -502,14 +525,15 @@ class GLCanvas3D // I just don't want to do it now before a release (Lukas Matena 24.3.2019) bool m_render_sla_auxiliaries; - std::string m_color_by; - bool m_reload_delayed; #if ENABLE_RENDER_PICKING_PASS bool m_show_picking_texture; #endif // ENABLE_RENDER_PICKING_PASS + KeyAutoRepeatFilter m_shift_kar_filter; + KeyAutoRepeatFilter m_ctrl_kar_filter; + RenderStats m_render_stats; int m_imgui_undo_redo_hovered_pos{ -1 }; @@ -618,6 +642,17 @@ class GLCanvas3D } m_gizmo_highlighter; +#if ENABLE_SHOW_CAMERA_TARGET + struct CameraTarget + { + std::array axis; + Vec3d target{ Vec3d::Zero() }; + }; + + CameraTarget m_camera_target; +#endif // ENABLE_SHOW_CAMERA_TARGET + GLModel m_background; + public: explicit GLCanvas3D(wxGLCanvas* canvas, Bed3D &bed); ~GLCanvas3D(); @@ -632,6 +667,25 @@ class GLCanvas3D bool init(); void post_event(wxEvent &&event); + std::shared_ptr add_raycaster_for_picking(SceneRaycaster::EType type, int id, const MeshRaycaster& raycaster, + const Transform3d& trafo = Transform3d::Identity(), bool use_back_faces = false) { + return m_scene_raycaster.add_raycaster(type, id, raycaster, trafo, use_back_faces); + } + void remove_raycasters_for_picking(SceneRaycaster::EType type, int id) { + m_scene_raycaster.remove_raycasters(type, id); + } + void remove_raycasters_for_picking(SceneRaycaster::EType type) { + m_scene_raycaster.remove_raycasters(type); + } + + std::vector>* get_raycasters_for_picking(SceneRaycaster::EType type) { + return m_scene_raycaster.get_raycasters(type); + } + + void set_raycaster_gizmos_on_top(bool value) { + m_scene_raycaster.set_gizmos_on_top(value); + } + void set_as_dirty(); void requires_check_outside_state() { m_requires_check_outside_state = true; } @@ -675,7 +729,9 @@ class GLCanvas3D bool get_use_clipping_planes() const { return m_use_clipping_planes; } const std::array &get_clipping_planes() const { return m_clipping_planes; }; - void set_color_by(const std::string& value); + void set_use_color_clip_plane(bool use) { m_volumes.set_use_color_clip_plane(use); } + void set_color_clip_plane(const Vec3d& cp_normal, double offset) { m_volumes.set_color_clip_plane(cp_normal, offset); } + void set_color_clip_plane_colors(const std::array& colors) { m_volumes.set_color_clip_plane_colors(colors); } void refresh_camera_scene_box(); @@ -713,7 +769,7 @@ class GLCanvas3D void update_volumes_colors_by_extruder(); - bool is_dragging() const { return m_gizmos.is_dragging() || m_moving; } + bool is_dragging() const { return m_gizmos.is_dragging() || (m_moving && !m_mouse.scene_position.isApprox(m_mouse.drag.start_position_3D)); } void render(); // printable_only == false -> render also non printable volumes as grayed @@ -748,7 +804,7 @@ class GLCanvas3D void reload_scene(bool refresh_immediately, bool force_full_scene_refresh = false); void load_gcode_preview(const GCodeProcessorResult& gcode_result, const std::vector& str_tool_colors); - void refresh_gcode_preview_render_paths(); + void refresh_gcode_preview_render_paths(bool keep_sequential_current_first, bool keep_sequential_current_last); void set_gcode_view_preview_type(GCodeViewer::EViewType type) { return m_gcode_viewer.set_view_type(type); } GCodeViewer::EViewType get_gcode_view_preview_type() const { return m_gcode_viewer.get_view_type(); } void load_sla_preview(); @@ -770,14 +826,20 @@ class GLCanvas3D Size get_canvas_size() const; Vec2d get_local_mouse_position() const; + // store opening position of menu + std::optional m_popup_menu_positon; // position of mouse right click + void set_popup_menu_position(const Vec2d &position) { m_popup_menu_positon = position; } + const std::optional& get_popup_menu_position() const { return m_popup_menu_positon; } + void clear_popup_menu_position() { m_popup_menu_positon.reset(); } + void set_tooltip(const std::string& tooltip); // the following methods add a snapshot to the undo/redo stack, unless the given string is empty void do_move(const std::string& snapshot_type); void do_rotate(const std::string& snapshot_type); void do_scale(const std::string& snapshot_type); - void do_flatten(const Vec3d& normal, const std::string& snapshot_type); void do_mirror(const std::string& snapshot_type); + void do_reset_skew(const std::string& snapshot_type); void update_gizmos_on_off_state(); void reset_all_gizmos() { m_gizmos.reset_all_states(); } @@ -793,7 +855,7 @@ class GLCanvas3D class WipeTowerInfo { protected: - Vec2d m_pos = {std::nan(""), std::nan("")}; + Vec2d m_pos = {NaNd, NaNd}; double m_rotation = 0.; BoundingBoxf m_bb; friend class GLCanvas3D; @@ -815,7 +877,6 @@ class GLCanvas3D // Returns the view ray line, in world coordinate, at the given mouse position. Linef3 mouse_ray(const Point& mouse_pos); - void set_mouse_as_dragging() { m_mouse.dragging = true; } bool is_mouse_dragging() const { return m_mouse.dragging; } double get_size_proportional_to_max_bed_size(double factor) const; @@ -841,6 +902,9 @@ class GLCanvas3D bool are_labels_shown() const { return m_labels.is_shown(); } void show_labels(bool show) { m_labels.show(show); } + bool is_legend_shown() const { return m_gcode_viewer.is_legend_enabled(); } + void show_legend(bool show) { m_gcode_viewer.enable_legend(show); m_dirty = true; } + bool is_using_slope() const { return m_slope.is_used(); } void use_slope(bool use) { m_slope.use(use); } void set_slope_normal_angle(float angle_in_deg) { m_slope.set_normal_angle(angle_in_deg); } @@ -886,6 +950,10 @@ class GLCanvas3D bool is_object_sinking(int object_idx) const; + void apply_retina_scale(Vec2d &screen_coordinate) const; + + std::pair> get_layers_height_data(int object_id); + private: bool _is_shown_on_screen() const; @@ -907,19 +975,21 @@ class GLCanvas3D void _picking_pass(); void _rectangular_selection_picking_pass(); - void _render_background() const; - void _render_bed(bool bottom, bool show_axes); - void _render_bed_for_picking(bool bottom); + void _render_background(); + void _render_bed(const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom); + void _render_bed_axes(); + void _render_bed_for_picking(const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom); void _render_objects(GLVolumeCollection::ERenderType type); void _render_gcode(); - void _render_selection() const; + void _render_gcode_cog(); + void _render_selection(); void _render_sequential_clearance(); #if ENABLE_RENDER_SELECTION_CENTER - void _render_selection_center() const; + void _render_selection_center(); #endif // ENABLE_RENDER_SELECTION_CENTER void _check_and_update_toolbar_icon_scale(); void _render_overlays(); - void _render_volumes_for_picking() const; + void _render_volumes_for_picking(const Camera& camera) const; void _render_current_gizmo() const; void _render_gizmos_overlay(); void _render_main_toolbar(); @@ -927,10 +997,10 @@ class GLCanvas3D void _render_collapse_toolbar() const; void _render_view_toolbar() const; #if ENABLE_SHOW_CAMERA_TARGET - void _render_camera_target() const; + void _render_camera_target(); #endif // ENABLE_SHOW_CAMERA_TARGET void _render_sla_slices(); - void _render_selection_sidebar_hints() const; + void _render_selection_sidebar_hints(); bool _render_undo_redo_stack(const bool is_undo, float pos_x); bool _render_search_list(float pos_x); bool _render_arrange_menu(float pos_x); @@ -975,7 +1045,7 @@ class GLCanvas3D // generates a warning notification containing the given message void _set_warning_notification(EWarning warning, bool state); - bool _is_any_volume_outside() const; + std::pair _is_any_volume_outside() const; // updates the selection from the content of m_hover_volume_idxs void _update_selection_from_hover(); @@ -987,10 +1057,23 @@ class GLCanvas3D bool _deactivate_arrange_menu(); float get_overlay_window_width() { return LayersEditing::get_overlay_window_width(); } - - static std::vector> _parse_colors(const std::vector& colors); }; +const ModelVolume *get_model_volume(const GLVolume &v, const Model &model); +const ModelVolume *get_model_volume(const ObjectID &volume_id, const ModelObjectPtrs &objects); +ModelVolume *get_model_volume(const GLVolume &v, const ModelObjectPtrs &objects); +ModelVolume *get_model_volume(const GLVolume &v, const ModelObject &object); + +GLVolume *get_first_hovered_gl_volume(const GLCanvas3D &canvas); +GLVolume *get_selected_gl_volume(const GLCanvas3D &canvas); + +ModelObject *get_model_object(const GLVolume &gl_volume, const Model &model); +ModelObject *get_model_object(const GLVolume &gl_volume, const ModelObjectPtrs &objects); + +ModelInstance *get_model_instance(const GLVolume &gl_volume, const Model &model); +ModelInstance *get_model_instance(const GLVolume &gl_volume, const ModelObjectPtrs &objects); +ModelInstance *get_model_instance(const GLVolume &gl_volume, const ModelObject &object); + } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/GLModel.cpp b/src/slic3r/GUI/GLModel.cpp index 422b6540807..61736f9ac9d 100644 --- a/src/slic3r/GUI/GLModel.cpp +++ b/src/slic3r/GUI/GLModel.cpp @@ -4,139 +4,639 @@ #include "3DScene.hpp" #include "GUI_App.hpp" #include "GLShader.hpp" +#if ENABLE_GLMODEL_STATISTICS +#include "Plater.hpp" +#include "GLCanvas3D.hpp" +#endif // ENABLE_GLMODEL_STATISTICS #include "libslic3r/TriangleMesh.hpp" #include "libslic3r/Model.hpp" #include "libslic3r/Polygon.hpp" +#include "libslic3r/BuildVolume.hpp" +#include "libslic3r/Geometry/ConvexHull.hpp" + +#if ENABLE_GLMODEL_STATISTICS +#include +#endif // ENABLE_GLMODEL_STATISTICS #include #include +#if ENABLE_SMOOTH_NORMALS +#include +#include +#include +#endif // ENABLE_SMOOTH_NORMALS + #include namespace Slic3r { namespace GUI { -size_t GLModel::InitializationData::vertices_count() const +#if ENABLE_SMOOTH_NORMALS +static void smooth_normals_corner(const TriangleMesh& mesh, std::vector& normals) { - size_t ret = 0; - for (const Entity& entity : entities) { - ret += entity.positions.size(); + using MapMatrixXfUnaligned = Eigen::Map>; + using MapMatrixXiUnaligned = Eigen::Map>; + + std::vector face_normals = its_face_normals(mesh.its); + + Eigen::MatrixXd vertices = MapMatrixXfUnaligned(mesh.its.vertices.front().data(), + Eigen::Index(mesh.its.vertices.size()), 3).cast(); + Eigen::MatrixXi indices = MapMatrixXiUnaligned(mesh.its.indices.front().data(), + Eigen::Index(mesh.its.indices.size()), 3); + Eigen::MatrixXd in_normals = MapMatrixXfUnaligned(face_normals.front().data(), + Eigen::Index(face_normals.size()), 3).cast(); + Eigen::MatrixXd out_normals; + + igl::per_corner_normals(vertices, indices, in_normals, 1.0, out_normals); + + normals = std::vector(mesh.its.vertices.size()); + for (size_t i = 0; i < mesh.its.indices.size(); ++i) { + for (size_t j = 0; j < 3; ++j) { + normals[mesh.its.indices[i][j]] = out_normals.row(i * 3 + j).cast(); + } } - return ret; +} +#endif // ENABLE_SMOOTH_NORMALS + +void GLModel::Geometry::add_vertex(const Vec2f& position) +{ + assert(format.vertex_layout == EVertexLayout::P2); + vertices.emplace_back(position.x()); + vertices.emplace_back(position.y()); } -size_t GLModel::InitializationData::indices_count() const +void GLModel::Geometry::add_vertex(const Vec2f& position, const Vec2f& tex_coord) { - size_t ret = 0; - for (const Entity& entity : entities) { - ret += entity.indices.size(); + assert(format.vertex_layout == EVertexLayout::P2T2); + vertices.emplace_back(position.x()); + vertices.emplace_back(position.y()); + vertices.emplace_back(tex_coord.x()); + vertices.emplace_back(tex_coord.y()); +} + +void GLModel::Geometry::add_vertex(const Vec3f& position) +{ + assert(format.vertex_layout == EVertexLayout::P3); + vertices.emplace_back(position.x()); + vertices.emplace_back(position.y()); + vertices.emplace_back(position.z()); +} + +void GLModel::Geometry::add_vertex(const Vec3f& position, const Vec2f& tex_coord) +{ + assert(format.vertex_layout == EVertexLayout::P3T2); + vertices.insert(vertices.end(), position.data(), position.data() + 3); + vertices.insert(vertices.end(), tex_coord.data(), tex_coord.data() + 2); +} + +void GLModel::Geometry::add_vertex(const Vec3f& position, const Vec3f& normal, const Vec2f& tex_coord) +{ + assert(format.vertex_layout == EVertexLayout::P3N3T2); + vertices.emplace_back(position.x()); + vertices.emplace_back(position.y()); + vertices.emplace_back(position.z()); + vertices.emplace_back(normal.x()); + vertices.emplace_back(normal.y()); + vertices.emplace_back(normal.z()); + vertices.emplace_back(tex_coord.x()); + vertices.emplace_back(tex_coord.y()); +} + +#if ENABLE_OPENGL_ES +void GLModel::Geometry::add_vertex(const Vec3f& position, const Vec3f& normal, const Vec3f& extra) +{ + assert(format.vertex_layout == EVertexLayout::P3N3E3); + vertices.emplace_back(position.x()); + vertices.emplace_back(position.y()); + vertices.emplace_back(position.z()); + vertices.emplace_back(normal.x()); + vertices.emplace_back(normal.y()); + vertices.emplace_back(normal.z()); + vertices.emplace_back(extra.x()); + vertices.emplace_back(extra.y()); + vertices.emplace_back(extra.z()); +} +#endif // ENABLE_OPENGL_ES + +void GLModel::Geometry::add_vertex(const Vec4f& position) +{ + assert(format.vertex_layout == EVertexLayout::P4); + vertices.emplace_back(position.x()); + vertices.emplace_back(position.y()); + vertices.emplace_back(position.z()); + vertices.emplace_back(position.w()); +} + +void GLModel::Geometry::add_index(unsigned int id) +{ + indices.emplace_back(id); +} + +void GLModel::Geometry::add_line(unsigned int id1, unsigned int id2) +{ + indices.emplace_back(id1); + indices.emplace_back(id2); +} + +Vec2f GLModel::Geometry::extract_position_2(size_t id) const +{ + const size_t p_stride = position_stride_floats(format); + if (p_stride != 2) { + assert(false); + return { FLT_MAX, FLT_MAX }; } - return ret; + + if (vertices_count() <= id) { + assert(false); + return { FLT_MAX, FLT_MAX }; + } + + const float* start = &vertices[id * vertex_stride_floats(format) + position_offset_floats(format)]; + return { *(start + 0), *(start + 1) }; } -void GLModel::init_from(const InitializationData& data) +Vec3f GLModel::Geometry::extract_position_3(size_t id) const { - if (!m_render_data.empty()) // call reset() if you want to reuse this model - return; + const size_t p_stride = position_stride_floats(format); + if (p_stride != 3) { + assert(false); + return { FLT_MAX, FLT_MAX, FLT_MAX }; + } - for (const InitializationData::Entity& entity : data.entities) { - if (entity.positions.empty() || entity.indices.empty()) - continue; + if (vertices_count() <= id) { + assert(false); + return { FLT_MAX, FLT_MAX, FLT_MAX }; + } - assert(entity.normals.empty() || entity.normals.size() == entity.positions.size()); + const float* start = &vertices[id * vertex_stride_floats(format) + position_offset_floats(format)]; + return { *(start + 0), *(start + 1), *(start + 2) }; +} - RenderData rdata; - rdata.type = entity.type; - rdata.color = entity.color; +Vec3f GLModel::Geometry::extract_normal_3(size_t id) const +{ + const size_t n_stride = normal_stride_floats(format); + if (n_stride != 3) { + assert(false); + return { FLT_MAX, FLT_MAX, FLT_MAX }; + } - // vertices/normals data - std::vector vertices(6 * entity.positions.size()); - for (size_t i = 0; i < entity.positions.size(); ++i) { - const size_t offset = i * 6; - ::memcpy(static_cast(&vertices[offset]), static_cast(entity.positions[i].data()), 3 * sizeof(float)); - if (!entity.normals.empty()) - ::memcpy(static_cast(&vertices[3 + offset]), static_cast(entity.normals[i].data()), 3 * sizeof(float)); - } + if (vertices_count() <= id) { + assert(false); + return { FLT_MAX, FLT_MAX, FLT_MAX }; + } - // indices data - std::vector indices = entity.indices; + const float* start = &vertices[id * vertex_stride_floats(format) + normal_offset_floats(format)]; + return { *(start + 0), *(start + 1), *(start + 2) }; +} - rdata.indices_count = static_cast(indices.size()); +Vec2f GLModel::Geometry::extract_tex_coord_2(size_t id) const +{ + const size_t t_stride = tex_coord_stride_floats(format); + if (t_stride != 2) { + assert(false); + return { FLT_MAX, FLT_MAX }; + } - // update bounding box - for (size_t i = 0; i < entity.positions.size(); ++i) { - m_bounding_box.merge(entity.positions[i].cast()); - } + if (vertices_count() <= id) { + assert(false); + return { FLT_MAX, FLT_MAX }; + } + + const float* start = &vertices[id * vertex_stride_floats(format) + tex_coord_offset_floats(format)]; + return { *(start + 0), *(start + 1) }; +} + +void GLModel::Geometry::set_vertex(size_t id, const Vec3f& position, const Vec3f& normal) +{ + assert(format.vertex_layout == EVertexLayout::P3N3); + assert(id < vertices_count()); + if (id < vertices_count()) { + float* start = &vertices[id * vertex_stride_floats(format)]; + *(start + 0) = position.x(); + *(start + 1) = position.y(); + *(start + 2) = position.z(); + *(start + 3) = normal.x(); + *(start + 4) = normal.y(); + *(start + 5) = normal.z(); + } +} + +void GLModel::Geometry::set_index(size_t id, unsigned int index) +{ + assert(id < indices_count()); + if (id < indices_count()) + indices[id] = index; +} + +unsigned int GLModel::Geometry::extract_index(size_t id) const +{ + if (indices_count() <= id) { + assert(false); + return -1; + } + + return indices[id]; +} + +void GLModel::Geometry::remove_vertex(size_t id) +{ + assert(id < vertices_count()); + if (id < vertices_count()) { + const size_t stride = vertex_stride_floats(format); + std::vector::const_iterator it = vertices.begin() + id * stride; + vertices.erase(it, it + stride); + } +} - send_to_gpu(rdata, vertices, indices); - m_render_data.emplace_back(rdata); +indexed_triangle_set GLModel::Geometry::get_as_indexed_triangle_set() const +{ + indexed_triangle_set its; + its.vertices.reserve(vertices_count()); + for (size_t i = 0; i < vertices_count(); ++i) { + its.vertices.emplace_back(extract_position_3(i)); } + its.indices.reserve(indices_count() / 3); + for (size_t i = 0; i < indices_count() / 3; ++i) { + const size_t tri_id = i * 3; + its.indices.emplace_back(extract_index(tri_id), extract_index(tri_id + 1), extract_index(tri_id + 2)); + } + return its; +} + +size_t GLModel::Geometry::vertex_stride_floats(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P2: { return 2; } + case EVertexLayout::P2T2: { return 4; } + case EVertexLayout::P3: { return 3; } + case EVertexLayout::P3T2: { return 5; } + case EVertexLayout::P3N3: { return 6; } + case EVertexLayout::P3N3T2: { return 8; } +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3E3: { return 9; } +#endif // ENABLE_OPENGL_ES + case EVertexLayout::P4: { return 4; } + default: { assert(false); return 0; } + }; +} + +size_t GLModel::Geometry::position_stride_floats(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P2: + case EVertexLayout::P2T2: { return 2; } + case EVertexLayout::P3: + case EVertexLayout::P3T2: + case EVertexLayout::P3N3: +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3T2: + case EVertexLayout::P3N3E3: { return 3; } +#else + case EVertexLayout::P3N3T2: { return 3; } +#endif // ENABLE_OPENGL_ES + case EVertexLayout::P4: { return 4; } + default: { assert(false); return 0; } + }; +} + +size_t GLModel::Geometry::position_offset_floats(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P2: + case EVertexLayout::P2T2: + case EVertexLayout::P3: + case EVertexLayout::P3T2: + case EVertexLayout::P3N3: + case EVertexLayout::P3N3T2: +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3E3: +#endif // ENABLE_OPENGL_ES + case EVertexLayout::P4: { return 0; } + default: { assert(false); return 0; } + }; +} + +size_t GLModel::Geometry::normal_stride_floats(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P3N3: +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3T2: + case EVertexLayout::P3N3E3: { return 3; } +#else + case EVertexLayout::P3N3T2: { return 3; } +#endif // ENABLE_OPENGL_ES + default: { assert(false); return 0; } + }; +} + +size_t GLModel::Geometry::normal_offset_floats(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P3N3: +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3T2: + case EVertexLayout::P3N3E3: { return 3; } +#else + case EVertexLayout::P3N3T2: { return 3; } +#endif // ENABLE_OPENGL_ES + default: { assert(false); return 0; } + }; +} + +size_t GLModel::Geometry::tex_coord_stride_floats(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P2T2: + case EVertexLayout::P3T2: + case EVertexLayout::P3N3T2: { return 2; } + default: { assert(false); return 0; } + }; } -void GLModel::init_from(const indexed_triangle_set& its, const BoundingBoxf3 &bbox) +size_t GLModel::Geometry::tex_coord_offset_floats(const Format& format) { - if (!m_render_data.empty()) // call reset() if you want to reuse this model + switch (format.vertex_layout) + { + case EVertexLayout::P2T2: { return 2; } + case EVertexLayout::P3T2: { return 3; } + case EVertexLayout::P3N3T2: { return 6; } + default: { assert(false); return 0; } + }; +} + +#if ENABLE_OPENGL_ES +size_t GLModel::Geometry::extra_stride_floats(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P3N3E3: { return 3; } + default: { assert(false); return 0; } + }; +} + +size_t GLModel::Geometry::extra_offset_floats(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P3N3E3: { return 6; } + default: { assert(false); return 0; } + }; +} +#endif // ENABLE_OPENGL_ES + +size_t GLModel::Geometry::index_stride_bytes(const Geometry& data) +{ + switch (data.index_type) + { + case EIndexType::UINT: { return sizeof(unsigned int); } + case EIndexType::USHORT: { return sizeof(unsigned short); } + case EIndexType::UBYTE: { return sizeof(unsigned char); } + default: { assert(false); return 0; } + }; +} + +bool GLModel::Geometry::has_position(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P2: + case EVertexLayout::P2T2: + case EVertexLayout::P3: + case EVertexLayout::P3T2: + case EVertexLayout::P3N3: + case EVertexLayout::P3N3T2: +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3E3: +#endif // ENABLE_OPENGL_ES + case EVertexLayout::P4: { return true; } + default: { assert(false); return false; } + }; +} + +bool GLModel::Geometry::has_normal(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P2: + case EVertexLayout::P2T2: + case EVertexLayout::P3: + case EVertexLayout::P3T2: + case EVertexLayout::P4: { return false; } + case EVertexLayout::P3N3: +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3T2: + case EVertexLayout::P3N3E3: { return true; } +#else + case EVertexLayout::P3N3T2: { return true; } +#endif // ENABLE_OPENGL_ES + default: { assert(false); return false; } + }; +} + +bool GLModel::Geometry::has_tex_coord(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P2T2: + case EVertexLayout::P3T2: + case EVertexLayout::P3N3T2: { return true; } + case EVertexLayout::P2: + case EVertexLayout::P3: + case EVertexLayout::P3N3: +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3E3: +#endif // ENABLE_OPENGL_ES + case EVertexLayout::P4: { return false; } + default: { assert(false); return false; } + }; +} + +#if ENABLE_OPENGL_ES +bool GLModel::Geometry::has_extra(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P3N3E3: { return true; } + case EVertexLayout::P2: + case EVertexLayout::P2T2: + case EVertexLayout::P3: + case EVertexLayout::P3T2: + case EVertexLayout::P3N3: + case EVertexLayout::P3N3T2: + case EVertexLayout::P4: { return false; } + default: { assert(false); return false; } + }; +} +#endif // ENABLE_OPENGL_ES + +#if ENABLE_GLMODEL_STATISTICS +GLModel::Statistics GLModel::s_statistics; +#endif // ENABLE_GLMODEL_STATISTICS + +void GLModel::init_from(Geometry&& data) +{ + if (is_initialized()) { + // call reset() if you want to reuse this model + assert(false); return; + } - RenderData data; - data.type = PrimitiveType::Triangles; + if (data.vertices.empty() || data.indices.empty()) { + assert(false); + return; + } - std::vector vertices = std::vector(18 * its.indices.size()); - std::vector indices = std::vector(3 * its.indices.size()); + m_render_data.geometry = std::move(data); - unsigned int vertices_count = 0; - for (uint32_t i = 0; i < its.indices.size(); ++i) { - stl_triangle_vertex_indices face = its.indices[i]; - stl_vertex vertex[3] = { its.vertices[face[0]], its.vertices[face[1]], its.vertices[face[2]] }; - stl_vertex n = face_normal_normalized(vertex); - for (size_t j = 0; j < 3; ++ j) { - size_t offset = i * 18 + j * 6; - ::memcpy(static_cast(&vertices[offset]), static_cast(vertex[j].data()), 3 * sizeof(float)); - ::memcpy(static_cast(&vertices[3 + offset]), static_cast(n.data()), 3 * sizeof(float)); + // update bounding box + for (size_t i = 0; i < vertices_count(); ++i) { + const size_t position_stride = Geometry::position_stride_floats(data.format); + if (position_stride == 3) + m_bounding_box.merge(m_render_data.geometry.extract_position_3(i).cast()); + else if (position_stride == 2) { + const Vec2f position = m_render_data.geometry.extract_position_2(i); + m_bounding_box.merge(Vec3f(position.x(), position.y(), 0.0f).cast()); } - for (size_t j = 0; j < 3; ++j) - indices[i * 3 + j] = vertices_count + j; - vertices_count += 3; } +} + +#if ENABLE_SMOOTH_NORMALS +void GLModel::init_from(const TriangleMesh& mesh, bool smooth_normals) +{ + if (smooth_normals) { + if (is_initialized()) { + // call reset() if you want to reuse this model + assert(false); + return; + } + + if (mesh.its.vertices.empty() || mesh.its.indices.empty()) { + assert(false); + return; + } + + std::vector normals; + smooth_normals_corner(mesh, normals); + + const indexed_triangle_set& its = mesh.its; + Geometry& data = m_render_data.geometry; + data.format = { Geometry::EPrimitiveType::Triangles, Geometry::EVertexLayout::P3N3 }; + data.reserve_vertices(3 * its.indices.size()); + data.reserve_indices(3 * its.indices.size()); + + // vertices + for (size_t i = 0; i < its.vertices.size(); ++i) { + data.add_vertex(its.vertices[i], normals[i]); + } - data.indices_count = static_cast(indices.size()); - m_bounding_box = bbox; + // indices + for (size_t i = 0; i < its.indices.size(); ++i) { + const stl_triangle_vertex_indices& idx = its.indices[i]; + data.add_triangle((unsigned int)idx(0), (unsigned int)idx(1), (unsigned int)idx(2)); + } - send_to_gpu(data, vertices, indices); - m_render_data.emplace_back(data); + // update bounding box + for (size_t i = 0; i < vertices_count(); ++i) { + m_bounding_box.merge(m_render_data.geometry.extract_position_3(i).cast()); + } + } + else + init_from(mesh.its); +} +#else +void GLModel::init_from(const TriangleMesh& mesh) +{ + init_from(mesh.its); } +#endif // ENABLE_SMOOTH_NORMALS void GLModel::init_from(const indexed_triangle_set& its) { - this->init_from(its, bounding_box(its)); + if (is_initialized()) { + // call reset() if you want to reuse this model + assert(false); + return; + } + + if (its.vertices.empty() || its.indices.empty()){ + assert(false); + return; + } + + Geometry& data = m_render_data.geometry; + data.format = { Geometry::EPrimitiveType::Triangles, Geometry::EVertexLayout::P3N3 }; + data.reserve_vertices(3 * its.indices.size()); + data.reserve_indices(3 * its.indices.size()); + + // vertices + indices + unsigned int vertices_counter = 0; + for (uint32_t i = 0; i < its.indices.size(); ++i) { + const stl_triangle_vertex_indices face = its.indices[i]; + const stl_vertex vertex[3] = { its.vertices[face[0]], its.vertices[face[1]], its.vertices[face[2]] }; + const stl_vertex n = face_normal_normalized(vertex); + for (size_t j = 0; j < 3; ++j) { + data.add_vertex(vertex[j], n); + } + vertices_counter += 3; + data.add_triangle(vertices_counter - 3, vertices_counter - 2, vertices_counter - 1); + } + + // update bounding box + for (size_t i = 0; i < vertices_count(); ++i) { + m_bounding_box.merge(data.extract_position_3(i).cast()); + } } void GLModel::init_from(const Polygons& polygons, float z) { - auto append_polygon = [](const Polygon& polygon, float z, GUI::GLModel::InitializationData& data) { - if (!polygon.empty()) { - GUI::GLModel::InitializationData::Entity entity; - entity.type = GUI::GLModel::PrimitiveType::LineLoop; - // contour - entity.positions.reserve(polygon.size() + 1); - entity.indices.reserve(polygon.size() + 1); - unsigned int id = 0; - for (const Point& p : polygon) { - Vec3f position = unscale(p.x(), p.y(), 0.0).cast(); - position.z() = z; - entity.positions.emplace_back(position); - entity.indices.emplace_back(id++); - } - data.entities.emplace_back(entity); - } - }; + if (is_initialized()) { + // call reset() if you want to reuse this model + assert(false); + return; + } + + if (polygons.empty()) { + assert(false); + return; + } + + Geometry& data = m_render_data.geometry; + data.format = { Geometry::EPrimitiveType::Lines, Geometry::EVertexLayout::P3 }; - InitializationData init_data; + size_t segments_count = 0; for (const Polygon& polygon : polygons) { - append_polygon(polygon, z, init_data); + segments_count += polygon.points.size(); + } + + data.reserve_vertices(2 * segments_count); + data.reserve_indices(2 * segments_count); + + // vertices + indices + unsigned int vertices_counter = 0; + for (const Polygon& poly : polygons) { + for (size_t i = 0; i < poly.points.size(); ++i) { + const Point& p0 = poly.points[i]; + const Point& p1 = (i == poly.points.size() - 1) ? poly.points.front() : poly.points[i + 1]; + data.add_vertex(Vec3f(unscale(p0.x()), unscale(p0.y()), z)); + data.add_vertex(Vec3f(unscale(p1.x()), unscale(p1.y()), z)); + vertices_counter += 2; + data.add_line(vertices_counter - 2, vertices_counter - 1); + } + } + + // update bounding box + for (size_t i = 0; i < vertices_count(); ++i) { + m_bounding_box.merge(data.extract_position_3(i).cast()); } - init_from(init_data); } bool GLModel::init_from_file(const std::string& filename) @@ -148,206 +648,494 @@ bool GLModel::init_from_file(const std::string& filename) return false; Model model; - try - { + try { model = Model::read_from_file(filename); } - catch (std::exception&) - { + catch (std::exception&) { return false; } - TriangleMesh mesh = model.mesh(); - init_from(mesh.its, mesh.bounding_box()); + init_from(model.mesh()); m_filename = filename; return true; } -void GLModel::set_color(int entity_id, const std::array& color) -{ - for (size_t i = 0; i < m_render_data.size(); ++i) { - if (entity_id == -1 || static_cast(i) == entity_id) - m_render_data[i].color = color; - } -} - void GLModel::reset() { - for (RenderData& data : m_render_data) { - // release gpu memory - if (data.ibo_id > 0) - glsafe(::glDeleteBuffers(1, &data.ibo_id)); - if (data.vbo_id > 0) - glsafe(::glDeleteBuffers(1, &data.vbo_id)); + // release gpu memory + if (m_render_data.ibo_id > 0) { + glsafe(::glDeleteBuffers(1, &m_render_data.ibo_id)); + m_render_data.ibo_id = 0; +#if ENABLE_GLMODEL_STATISTICS + s_statistics.gpu_memory.indices.current -= indices_size_bytes(); +#endif // ENABLE_GLMODEL_STATISTICS + } + if (m_render_data.vbo_id > 0) { + glsafe(::glDeleteBuffers(1, &m_render_data.vbo_id)); + m_render_data.vbo_id = 0; +#if ENABLE_GLMODEL_STATISTICS + s_statistics.gpu_memory.vertices.current -= vertices_size_bytes(); +#endif // ENABLE_GLMODEL_STATISTICS + } +#if ENABLE_GL_CORE_PROFILE + if (m_render_data.vao_id > 0) { + glsafe(::glDeleteVertexArrays(1, &m_render_data.vao_id)); + m_render_data.vao_id = 0; } +#endif // ENABLE_GL_CORE_PROFILE - m_render_data.clear(); + m_render_data.vertices_count = 0; + m_render_data.indices_count = 0; + m_render_data.geometry.vertices = std::vector(); + m_render_data.geometry.indices = std::vector(); m_bounding_box = BoundingBoxf3(); m_filename = std::string(); } -void GLModel::render() const +static GLenum get_primitive_mode(const GLModel::Geometry::Format& format) { - GLShaderProgram* shader = wxGetApp().get_current_shader(); + switch (format.type) + { + case GLModel::Geometry::EPrimitiveType::Points: { return GL_POINTS; } + default: + case GLModel::Geometry::EPrimitiveType::Triangles: { return GL_TRIANGLES; } + case GLModel::Geometry::EPrimitiveType::TriangleStrip: { return GL_TRIANGLE_STRIP; } + case GLModel::Geometry::EPrimitiveType::TriangleFan: { return GL_TRIANGLE_FAN; } + case GLModel::Geometry::EPrimitiveType::Lines: { return GL_LINES; } + case GLModel::Geometry::EPrimitiveType::LineStrip: { return GL_LINE_STRIP; } + case GLModel::Geometry::EPrimitiveType::LineLoop: { return GL_LINE_LOOP; } + } +} - for (const RenderData& data : m_render_data) { - if (data.vbo_id == 0 || data.ibo_id == 0) - continue; - - GLenum mode; - switch (data.type) - { - default: - case PrimitiveType::Triangles: { mode = GL_TRIANGLES; break; } - case PrimitiveType::Lines: { mode = GL_LINES; break; } - case PrimitiveType::LineStrip: { mode = GL_LINE_STRIP; break; } - case PrimitiveType::LineLoop: { mode = GL_LINE_LOOP; break; } - } +static GLenum get_index_type(const GLModel::Geometry& data) +{ + switch (data.index_type) + { + default: + case GLModel::Geometry::EIndexType::UINT: { return GL_UNSIGNED_INT; } + case GLModel::Geometry::EIndexType::USHORT: { return GL_UNSIGNED_SHORT; } + case GLModel::Geometry::EIndexType::UBYTE: { return GL_UNSIGNED_BYTE; } + } +} - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, data.vbo_id)); - glsafe(::glVertexPointer(3, GL_FLOAT, 6 * sizeof(float), (const void*)0)); - glsafe(::glNormalPointer(GL_FLOAT, 6 * sizeof(float), (const void*)(3 * sizeof(float)))); +void GLModel::render() +{ + render(std::make_pair(0, indices_count())); +} - glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); - glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); +void GLModel::render(const std::pair& range) +{ + if (m_render_disabled) + return; - if (shader != nullptr) - shader->set_uniform("uniform_color", data.color); - else - glsafe(::glColor4fv(data.color.data())); + if (range.second == range.first) + return; - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.ibo_id)); - glsafe(::glDrawElements(mode, static_cast(data.indices_count), GL_UNSIGNED_INT, (const void*)0)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + GLShaderProgram* shader = wxGetApp().get_current_shader(); + if (shader == nullptr) + return; - glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); - glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); + // sends data to gpu if not done yet + if (m_render_data.vbo_id == 0 || m_render_data.ibo_id == 0) { + if (m_render_data.geometry.vertices_count() > 0 && m_render_data.geometry.indices_count() > 0 && !send_to_gpu()) + return; + } - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + const Geometry& data = m_render_data.geometry; + + const GLenum mode = get_primitive_mode(data.format); + const GLenum index_type = get_index_type(data); + + const size_t vertex_stride_bytes = Geometry::vertex_stride_bytes(data.format); + const bool position = Geometry::has_position(data.format); + const bool normal = Geometry::has_normal(data.format); + const bool tex_coord = Geometry::has_tex_coord(data.format); +#if ENABLE_OPENGL_ES + const bool extra = Geometry::has_extra(data.format); +#endif // ENABLE_OPENGL_ES + +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(m_render_data.vao_id)); + // the following binding is needed to set the vertex attributes +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_render_data.vbo_id)); + + int position_id = -1; + int normal_id = -1; + int tex_coord_id = -1; +#if ENABLE_OPENGL_ES + int extra_id = -1; +#endif // ENABLE_OPENGL_ES + + if (position) { + position_id = shader->get_attrib_location("v_position"); + if (position_id != -1) { + glsafe(::glVertexAttribPointer(position_id, Geometry::position_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (const void*)Geometry::position_offset_bytes(data.format))); + glsafe(::glEnableVertexAttribArray(position_id)); + } } + if (normal) { + normal_id = shader->get_attrib_location("v_normal"); + if (normal_id != -1) { + glsafe(::glVertexAttribPointer(normal_id, Geometry::normal_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (const void*)Geometry::normal_offset_bytes(data.format))); + glsafe(::glEnableVertexAttribArray(normal_id)); + } + } + if (tex_coord) { + tex_coord_id = shader->get_attrib_location("v_tex_coord"); + if (tex_coord_id != -1) { + glsafe(::glVertexAttribPointer(tex_coord_id, Geometry::tex_coord_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (const void*)Geometry::tex_coord_offset_bytes(data.format))); + glsafe(::glEnableVertexAttribArray(tex_coord_id)); + } + } +#if ENABLE_OPENGL_ES + if (extra) { + extra_id = shader->get_attrib_location("v_extra"); + if (extra_id != -1) { + glsafe(::glVertexAttribPointer(extra_id, Geometry::extra_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (const void*)Geometry::extra_offset_bytes(data.format))); + glsafe(::glEnableVertexAttribArray(extra_id)); + } + } +#endif // ENABLE_OPENGL_ES + + shader->set_uniform("uniform_color", data.color); + +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_render_data.ibo_id)); + glsafe(::glDrawElements(mode, range.second - range.first, index_type, (const void*)(range.first * Geometry::index_stride_bytes(data)))); +#if !ENABLE_GL_CORE_PROFILE + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); +#endif // !ENABLE_GL_CORE_PROFILE + +#if ENABLE_OPENGL_ES + if (extra_id != -1) + glsafe(::glDisableVertexAttribArray(extra_id)); +#endif // ENABLE_OPENGL_ES + if (tex_coord_id != -1) + glsafe(::glDisableVertexAttribArray(tex_coord_id)); + if (normal_id != -1) + glsafe(::glDisableVertexAttribArray(normal_id)); + if (position_id != -1) + glsafe(::glDisableVertexAttribArray(position_id)); + + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(0)); +#endif // ENABLE_GL_CORE_PROFILE + +#if ENABLE_GLMODEL_STATISTICS + ++s_statistics.render_calls; +#endif // ENABLE_GLMODEL_STATISTICS } -void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instances_count) const +void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instances_count) { - if (instances_vbo == 0) + if (instances_vbo == 0 || instances_count == 0) return; GLShaderProgram* shader = wxGetApp().get_current_shader(); - assert(shader == nullptr || boost::algorithm::iends_with(shader->get_name(), "_instanced")); + if (shader == nullptr || !boost::algorithm::iends_with(shader->get_name(), "_instanced")) + return; // vertex attributes - GLint position_id = (shader != nullptr) ? shader->get_attrib_location("v_position") : -1; - GLint normal_id = (shader != nullptr) ? shader->get_attrib_location("v_normal") : -1; - assert(position_id != -1 && normal_id != -1); + const GLint position_id = shader->get_attrib_location("v_position"); + const GLint normal_id = shader->get_attrib_location("v_normal"); + if (position_id == -1 || normal_id == -1) + return; // instance attributes - GLint offset_id = (shader != nullptr) ? shader->get_attrib_location("i_offset") : -1; - GLint scales_id = (shader != nullptr) ? shader->get_attrib_location("i_scales") : -1; - assert(offset_id != -1 && scales_id != -1); + const GLint offset_id = shader->get_attrib_location("i_offset"); + const GLint scales_id = shader->get_attrib_location("i_scales"); + if (offset_id == -1 || scales_id == -1) + return; + + if (m_render_data.vbo_id == 0 || m_render_data.ibo_id == 0) { + if (!send_to_gpu()) + return; + } + +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(m_render_data.vao_id)); +#endif // ENABLE_GL_CORE_PROFILE glsafe(::glBindBuffer(GL_ARRAY_BUFFER, instances_vbo)); - if (offset_id != -1) { - glsafe(::glVertexAttribPointer(offset_id, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (GLvoid*)0)); - glsafe(::glEnableVertexAttribArray(offset_id)); - glsafe(::glVertexAttribDivisor(offset_id, 1)); - } - if (scales_id != -1) { - glsafe(::glVertexAttribPointer(scales_id, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (GLvoid*)(3 * sizeof(float)))); - glsafe(::glEnableVertexAttribArray(scales_id)); - glsafe(::glVertexAttribDivisor(scales_id, 1)); - } - - for (const RenderData& data : m_render_data) { - if (data.vbo_id == 0 || data.ibo_id == 0) - continue; - - GLenum mode; - switch (data.type) - { - default: - case PrimitiveType::Triangles: { mode = GL_TRIANGLES; break; } - case PrimitiveType::Lines: { mode = GL_LINES; break; } - case PrimitiveType::LineStrip: { mode = GL_LINE_STRIP; break; } - case PrimitiveType::LineLoop: { mode = GL_LINE_LOOP; break; } - } + const size_t instance_stride = 5 * sizeof(float); + glsafe(::glVertexAttribPointer(offset_id, 3, GL_FLOAT, GL_FALSE, instance_stride, (const void*)0)); + glsafe(::glEnableVertexAttribArray(offset_id)); + glsafe(::glVertexAttribDivisor(offset_id, 1)); - if (shader != nullptr) - shader->set_uniform("uniform_color", data.color); - else - glsafe(::glColor4fv(data.color.data())); + glsafe(::glVertexAttribPointer(scales_id, 2, GL_FLOAT, GL_FALSE, instance_stride, (const void*)(3 * sizeof(float)))); + glsafe(::glEnableVertexAttribArray(scales_id)); + glsafe(::glVertexAttribDivisor(scales_id, 1)); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, data.vbo_id)); - if (position_id != -1) { - glsafe(::glVertexAttribPointer(position_id, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (GLvoid*)0)); - glsafe(::glEnableVertexAttribArray(position_id)); - } - if (normal_id != -1) { - glsafe(::glVertexAttribPointer(normal_id, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (GLvoid*)(3 * sizeof(float)))); - glsafe(::glEnableVertexAttribArray(normal_id)); - } + const Geometry& data = m_render_data.geometry; - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.ibo_id)); - glsafe(::glDrawElementsInstanced(mode, static_cast(data.indices_count), GL_UNSIGNED_INT, (const void*)0, instances_count)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + const GLenum mode = get_primitive_mode(data.format); + const GLenum index_type = get_index_type(data); + + const size_t vertex_stride_bytes = Geometry::vertex_stride_bytes(data.format); + const bool position = Geometry::has_position(data.format); + const bool normal = Geometry::has_normal(data.format); + +#if ENABLE_GL_CORE_PROFILE + // the following binding is needed to set the vertex attributes +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_render_data.vbo_id)); - if (normal_id != -1) - glsafe(::glDisableVertexAttribArray(normal_id)); - if (position_id != -1) - glsafe(::glDisableVertexAttribArray(position_id)); + if (position) { + glsafe(::glVertexAttribPointer(position_id, Geometry::position_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (const void*)Geometry::position_offset_bytes(data.format))); + glsafe(::glEnableVertexAttribArray(position_id)); } - if (scales_id != -1) - glsafe(::glDisableVertexAttribArray(scales_id)); - if (offset_id != -1) - glsafe(::glDisableVertexAttribArray(offset_id)); + if (normal) { + glsafe(::glVertexAttribPointer(normal_id, Geometry::normal_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (const void*)Geometry::normal_offset_bytes(data.format))); + glsafe(::glEnableVertexAttribArray(normal_id)); + } + + shader->set_uniform("uniform_color", data.color); + +#if !ENABLE_GL_CORE_PROFILE + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_render_data.ibo_id)); +#endif // !ENABLE_GL_CORE_PROFILE + glsafe(::glDrawElementsInstanced(mode, indices_count(), index_type, (const void*)0, instances_count)); +#if !ENABLE_GL_CORE_PROFILE + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); +#endif // !ENABLE_GL_CORE_PROFILE + + if (normal) + glsafe(::glDisableVertexAttribArray(normal_id)); + if (position) + glsafe(::glDisableVertexAttribArray(position_id)); + + glsafe(::glDisableVertexAttribArray(scales_id)); + glsafe(::glDisableVertexAttribArray(offset_id)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(0)); +#endif // ENABLE_GL_CORE_PROFILE + +#if ENABLE_GLMODEL_STATISTICS + ++s_statistics.render_instanced_calls; +#endif // ENABLE_GLMODEL_STATISTICS } -void GLModel::send_to_gpu(RenderData& data, const std::vector& vertices, const std::vector& indices) +bool GLModel::send_to_gpu() { - assert(data.vbo_id == 0); - assert(data.ibo_id == 0); + if (m_render_data.vbo_id > 0 || m_render_data.ibo_id > 0) { + assert(false); + return false; + } - // vertex data -> send to gpu - glsafe(::glGenBuffers(1, &data.vbo_id)); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, data.vbo_id)); - glsafe(::glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), vertices.data(), GL_STATIC_DRAW)); + Geometry& data = m_render_data.geometry; + if (data.vertices.empty() || data.indices.empty()) { + assert(false); + return false; + } + +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) { + glsafe(::glGenVertexArrays(1, &m_render_data.vao_id)); + glsafe(::glBindVertexArray(m_render_data.vao_id)); + } +#endif // ENABLE_GL_CORE_PROFILE + + // vertices + glsafe(::glGenBuffers(1, &m_render_data.vbo_id)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_render_data.vbo_id)); + glsafe(::glBufferData(GL_ARRAY_BUFFER, data.vertices_size_bytes(), data.vertices.data(), GL_STATIC_DRAW)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + m_render_data.vertices_count = vertices_count(); +#if ENABLE_GLMODEL_STATISTICS + s_statistics.gpu_memory.vertices.current += data.vertices_size_bytes(); + s_statistics.gpu_memory.vertices.max = std::max(s_statistics.gpu_memory.vertices.current, s_statistics.gpu_memory.vertices.max); +#endif // ENABLE_GLMODEL_STATISTICS + data.vertices = std::vector(); + + // indices + const size_t indices_count = data.indices.size(); + glsafe(::glGenBuffers(1, &m_render_data.ibo_id)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_render_data.ibo_id)); + if (m_render_data.vertices_count <= 256) { + // convert indices to unsigned char to save gpu memory + std::vector reduced_indices(indices_count); + for (size_t i = 0; i < indices_count; ++i) { + reduced_indices[i] = (unsigned char)data.indices[i]; + } + data.index_type = Geometry::EIndexType::UBYTE; + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices_count * sizeof(unsigned char), reduced_indices.data(), GL_STATIC_DRAW)); + } + else if (m_render_data.vertices_count <= 65536) { + // convert indices to unsigned short to save gpu memory + std::vector reduced_indices(indices_count); + for (size_t i = 0; i < data.indices.size(); ++i) { + reduced_indices[i] = (unsigned short)data.indices[i]; + } + data.index_type = Geometry::EIndexType::USHORT; + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices_count * sizeof(unsigned short), reduced_indices.data(), GL_STATIC_DRAW)); + } + else { + data.index_type = Geometry::EIndexType::UINT; + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, data.indices_size_bytes(), data.indices.data(), GL_STATIC_DRAW)); + } - // indices data -> send to gpu - glsafe(::glGenBuffers(1, &data.ibo_id)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.ibo_id)); - glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(unsigned int), indices.data(), GL_STATIC_DRAW)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + + m_render_data.indices_count = indices_count; +#if ENABLE_GLMODEL_STATISTICS + s_statistics.gpu_memory.indices.current += data.indices_size_bytes(); + s_statistics.gpu_memory.indices.max = std::max(s_statistics.gpu_memory.indices.current, s_statistics.gpu_memory.indices.max); +#endif // ENABLE_GLMODEL_STATISTICS + data.indices = std::vector(); + +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(0)); +#endif // ENABLE_GL_CORE_PROFILE + + return true; } -GLModel::InitializationData stilized_arrow(int resolution, float tip_radius, float tip_height, float stem_radius, float stem_height) +#if ENABLE_GLMODEL_STATISTICS +void GLModel::render_statistics() { - auto append_vertex = [](GLModel::InitializationData::Entity& entity, const Vec3f& position, const Vec3f& normal) { - entity.positions.emplace_back(position); - entity.normals.emplace_back(normal); + static const float offset = 175.0f; + ImGuiWrapper& imgui = *wxGetApp().imgui(); + + auto add_memory = [&imgui](const std::string& label, int64_t memory) { + auto format_string = [memory](const std::string& units, float value) { + return std::to_string(memory) + " bytes (" + + Slic3r::float_to_string_decimal_point(float(memory) * value, 3) + + " " + units + ")"; + }; + + static const float kb = 1024.0f; + static const float inv_kb = 1.0f / kb; + static const float mb = 1024.0f * kb; + static const float inv_mb = 1.0f / mb; + static const float gb = 1024.0f * mb; + static const float inv_gb = 1.0f / gb; + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, label); + ImGui::SameLine(offset); + if (static_cast(memory) < mb) + imgui.text(format_string("KB", inv_kb)); + else if (static_cast(memory) < gb) + imgui.text(format_string("MB", inv_mb)); + else + imgui.text(format_string("GB", inv_gb)); }; - auto append_indices = [](GLModel::InitializationData::Entity& entity, unsigned int v1, unsigned int v2, unsigned int v3) { - entity.indices.emplace_back(v1); - entity.indices.emplace_back(v2); - entity.indices.emplace_back(v3); + + auto add_counter = [&imgui](const std::string& label, int64_t counter) { + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, label); + ImGui::SameLine(offset); + imgui.text(std::to_string(counter)); }; - resolution = std::max(4, resolution); + imgui.set_next_window_pos(0.5f * wxGetApp().plater()->get_current_canvas3D()->get_canvas_size().get_width(), 0.0f, ImGuiCond_Once, 0.5f, 0.0f); + ImGui::SetNextWindowSizeConstraints({ 300.0f, 100.0f }, { 600.0f, 900.0f }); + imgui.begin(std::string("GLModel Statistics"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize); + ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow()); + + add_counter(std::string("Render calls:"), s_statistics.render_calls); + add_counter(std::string("Render instanced calls:"), s_statistics.render_instanced_calls); + + if (ImGui::CollapsingHeader("GPU memory")) { + ImGui::Indent(10.0f); + if (ImGui::CollapsingHeader("Vertices")) { + add_memory(std::string("Current:"), s_statistics.gpu_memory.vertices.current); + add_memory(std::string("Max:"), s_statistics.gpu_memory.vertices.max); + } + if (ImGui::CollapsingHeader("Indices")) { + add_memory(std::string("Current:"), s_statistics.gpu_memory.indices.current); + add_memory(std::string("Max:"), s_statistics.gpu_memory.indices.max); + } + ImGui::Unindent(10.0f); + } + + imgui.end(); +} +#endif // ENABLE_GLMODEL_STATISTICS + +template +inline bool all_vertices_inside(const GLModel::Geometry& geometry, Fn fn) +{ + const size_t position_stride_floats = geometry.position_stride_floats(geometry.format); + const size_t position_offset_floats = geometry.position_offset_floats(geometry.format); + assert(position_stride_floats == 3); + if (geometry.vertices.empty() || position_stride_floats != 3) + return false; + + for (auto it = geometry.vertices.begin(); it != geometry.vertices.end(); ) { + it += position_offset_floats; + if (!fn({ *it, *(it + 1), *(it + 2) })) + return false; + it += (geometry.vertex_stride_floats(geometry.format) - position_offset_floats - position_stride_floats); + } + return true; +} + +bool contains(const BuildVolume& volume, const GLModel& model, bool ignore_bottom) +{ + static constexpr const double epsilon = BuildVolume::BedEpsilon; + switch (volume.type()) { + case BuildVolume::Type::Rectangle: + { + BoundingBox3Base build_volume = volume.bounding_volume().inflated(epsilon); + if (volume.max_print_height() == 0.0) + build_volume.max.z() = std::numeric_limits::max(); + if (ignore_bottom) + build_volume.min.z() = -std::numeric_limits::max(); + const BoundingBoxf3& model_box = model.get_bounding_box(); + return build_volume.contains(model_box.min) && build_volume.contains(model_box.max); + } + case BuildVolume::Type::Circle: + { + const Geometry::Circled& circle = volume.circle(); + const Vec2f c = unscaled(circle.center); + const float r = unscaled(circle.radius) + float(epsilon); + const float r2 = sqr(r); + return volume.max_print_height() == 0.0 ? + all_vertices_inside(model.get_geometry(), [c, r2](const Vec3f& p) { return (to_2d(p) - c).squaredNorm() <= r2; }) : + + all_vertices_inside(model.get_geometry(), [c, r2, z = volume.max_print_height() + epsilon](const Vec3f& p) { return (to_2d(p) - c).squaredNorm() <= r2 && p.z() <= z; }); + } + case BuildVolume::Type::Convex: + //FIXME doing test on convex hull until we learn to do test on non-convex polygons efficiently. + case BuildVolume::Type::Custom: + return volume.max_print_height() == 0.0 ? + all_vertices_inside(model.get_geometry(), [&volume](const Vec3f& p) { return Geometry::inside_convex_polygon(volume.top_bottom_convex_hull_decomposition_bed(), to_2d(p).cast()); }) : + all_vertices_inside(model.get_geometry(), [&volume, z = volume.max_print_height() + epsilon](const Vec3f& p) { return Geometry::inside_convex_polygon(volume.top_bottom_convex_hull_decomposition_bed(), to_2d(p).cast()) && p.z() <= z; }); + default: + return true; + } +} + +GLModel::Geometry stilized_arrow(unsigned int resolution, float tip_radius, float tip_height, float stem_radius, float stem_height) +{ + resolution = std::max(4, resolution); - GLModel::InitializationData data; - GLModel::InitializationData::Entity entity; - entity.type = GLModel::PrimitiveType::Triangles; + GLModel::Geometry data; + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + data.reserve_vertices(6 * resolution + 2); + data.reserve_indices(6 * resolution * 3); - const float angle_step = 2.0f * M_PI / static_cast(resolution); + const float angle_step = 2.0f * float(PI) / float(resolution); std::vector cosines(resolution); std::vector sines(resolution); - for (int i = 0; i < resolution; ++i) { - const float angle = angle_step * static_cast(i); + for (unsigned int i = 0; i < resolution; ++i) { + const float angle = angle_step * float(i); cosines[i] = ::cos(angle); sines[i] = -::sin(angle); } @@ -355,86 +1143,76 @@ GLModel::InitializationData stilized_arrow(int resolution, float tip_radius, flo const float total_height = tip_height + stem_height; // tip vertices/normals - append_vertex(entity, { 0.0f, 0.0f, total_height }, Vec3f::UnitZ()); - for (int i = 0; i < resolution; ++i) { - append_vertex(entity, { tip_radius * sines[i], tip_radius * cosines[i], stem_height }, { sines[i], cosines[i], 0.0f }); + data.add_vertex(Vec3f(0.0f, 0.0f, total_height), (Vec3f)Vec3f::UnitZ()); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_vertex(Vec3f(tip_radius * sines[i], tip_radius * cosines[i], stem_height), Vec3f(sines[i], cosines[i], 0.0f)); } // tip triangles - for (int i = 0; i < resolution; ++i) { - const int v3 = (i < resolution - 1) ? i + 2 : 1; - append_indices(entity, 0, i + 1, v3); + for (unsigned int i = 0; i < resolution; ++i) { + const unsigned int v3 = (i < resolution - 1) ? i + 2 : 1; + data.add_triangle(0, i + 1, v3); } // tip cap outer perimeter vertices - for (int i = 0; i < resolution; ++i) { - append_vertex(entity, { tip_radius * sines[i], tip_radius * cosines[i], stem_height }, -Vec3f::UnitZ()); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_vertex(Vec3f(tip_radius * sines[i], tip_radius * cosines[i], stem_height), (Vec3f)(-Vec3f::UnitZ())); } // tip cap inner perimeter vertices - for (int i = 0; i < resolution; ++i) { - append_vertex(entity, { stem_radius * sines[i], stem_radius * cosines[i], stem_height }, -Vec3f::UnitZ()); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_vertex(Vec3f(stem_radius * sines[i], stem_radius * cosines[i], stem_height), (Vec3f)(-Vec3f::UnitZ())); } // tip cap triangles - for (int i = 0; i < resolution; ++i) { - const int v2 = (i < resolution - 1) ? i + resolution + 2 : resolution + 1; - const int v3 = (i < resolution - 1) ? i + 2 * resolution + 2 : 2 * resolution + 1; - append_indices(entity, i + resolution + 1, v3, v2); - append_indices(entity, i + resolution + 1, i + 2 * resolution + 1, v3); + for (unsigned int i = 0; i < resolution; ++i) { + const unsigned int v2 = (i < resolution - 1) ? i + resolution + 2 : resolution + 1; + const unsigned int v3 = (i < resolution - 1) ? i + 2 * resolution + 2 : 2 * resolution + 1; + data.add_triangle(i + resolution + 1, v3, v2); + data.add_triangle(i + resolution + 1, i + 2 * resolution + 1, v3); } // stem bottom vertices - for (int i = 0; i < resolution; ++i) { - append_vertex(entity, { stem_radius * sines[i], stem_radius * cosines[i], stem_height }, { sines[i], cosines[i], 0.0f }); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_vertex(Vec3f(stem_radius * sines[i], stem_radius * cosines[i], stem_height), Vec3f(sines[i], cosines[i], 0.0f)); } // stem top vertices - for (int i = 0; i < resolution; ++i) { - append_vertex(entity, { stem_radius * sines[i], stem_radius * cosines[i], 0.0f }, { sines[i], cosines[i], 0.0f }); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_vertex(Vec3f(stem_radius * sines[i], stem_radius * cosines[i], 0.0f), Vec3f(sines[i], cosines[i], 0.0f)); } // stem triangles - for (int i = 0; i < resolution; ++i) { - const int v2 = (i < resolution - 1) ? i + 3 * resolution + 2 : 3 * resolution + 1; - const int v3 = (i < resolution - 1) ? i + 4 * resolution + 2 : 4 * resolution + 1; - append_indices(entity, i + 3 * resolution + 1, v3, v2); - append_indices(entity, i + 3 * resolution + 1, i + 4 * resolution + 1, v3); + for (unsigned int i = 0; i < resolution; ++i) { + const unsigned int v2 = (i < resolution - 1) ? i + 3 * resolution + 2 : 3 * resolution + 1; + const unsigned int v3 = (i < resolution - 1) ? i + 4 * resolution + 2 : 4 * resolution + 1; + data.add_triangle(i + 3 * resolution + 1, v3, v2); + data.add_triangle(i + 3 * resolution + 1, i + 4 * resolution + 1, v3); } // stem cap vertices - append_vertex(entity, Vec3f::Zero(), -Vec3f::UnitZ()); - for (int i = 0; i < resolution; ++i) { - append_vertex(entity, { stem_radius * sines[i], stem_radius * cosines[i], 0.0f }, -Vec3f::UnitZ()); + data.add_vertex((Vec3f)Vec3f::Zero(), (Vec3f)(-Vec3f::UnitZ())); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_vertex(Vec3f(stem_radius * sines[i], stem_radius * cosines[i], 0.0f), (Vec3f)(-Vec3f::UnitZ())); } // stem cap triangles - for (int i = 0; i < resolution; ++i) { - const int v3 = (i < resolution - 1) ? i + 5 * resolution + 3 : 5 * resolution + 2; - append_indices(entity, 5 * resolution + 1, v3, i + 5 * resolution + 2); + for (unsigned int i = 0; i < resolution; ++i) { + const unsigned int v3 = (i < resolution - 1) ? i + 5 * resolution + 3 : 5 * resolution + 2; + data.add_triangle(5 * resolution + 1, v3, i + 5 * resolution + 2); } - data.entities.emplace_back(entity); return data; } -GLModel::InitializationData circular_arrow(int resolution, float radius, float tip_height, float tip_width, float stem_width, float thickness) +GLModel::Geometry circular_arrow(unsigned int resolution, float radius, float tip_height, float tip_width, float stem_width, float thickness) { - auto append_vertex = [](GLModel::InitializationData::Entity& entity, const Vec3f& position, const Vec3f& normal) { - entity.positions.emplace_back(position); - entity.normals.emplace_back(normal); - }; - auto append_indices = [](GLModel::InitializationData::Entity& entity, unsigned int v1, unsigned int v2, unsigned int v3) { - entity.indices.emplace_back(v1); - entity.indices.emplace_back(v2); - entity.indices.emplace_back(v3); - }; + resolution = std::max(2, resolution); - resolution = std::max(2, resolution); - - GLModel::InitializationData data; - GLModel::InitializationData::Entity entity; - entity.type = GLModel::PrimitiveType::Triangles; + GLModel::Geometry data; + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + data.reserve_vertices(8 * (resolution + 1) + 30); + data.reserve_indices((8 * resolution + 16) * 3); const float half_thickness = 0.5f * thickness; const float half_stem_width = 0.5f * stem_width; @@ -442,171 +1220,161 @@ GLModel::InitializationData circular_arrow(int resolution, float radius, float t const float outer_radius = radius + half_stem_width; const float inner_radius = radius - half_stem_width; - const float step_angle = 0.5f * PI / static_cast(resolution); + const float step_angle = 0.5f * float(PI) / float(resolution); // tip // top face vertices - append_vertex(entity, { 0.0f, outer_radius, half_thickness }, Vec3f::UnitZ()); - append_vertex(entity, { 0.0f, radius + half_tip_width, half_thickness }, Vec3f::UnitZ()); - append_vertex(entity, { -tip_height, radius, half_thickness }, Vec3f::UnitZ()); - append_vertex(entity, { 0.0f, radius - half_tip_width, half_thickness }, Vec3f::UnitZ()); - append_vertex(entity, { 0.0f, inner_radius, half_thickness }, Vec3f::UnitZ()); + data.add_vertex(Vec3f(0.0f, outer_radius, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(0.0f, radius + half_tip_width, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(-tip_height, radius, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(0.0f, radius - half_tip_width, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(0.0f, inner_radius, half_thickness), (Vec3f)Vec3f::UnitZ()); // top face triangles - append_indices(entity, 0, 1, 2); - append_indices(entity, 0, 2, 4); - append_indices(entity, 4, 2, 3); + data.add_triangle(0, 1, 2); + data.add_triangle(0, 2, 4); + data.add_triangle(4, 2, 3); // bottom face vertices - append_vertex(entity, { 0.0f, outer_radius, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(entity, { 0.0f, radius + half_tip_width, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(entity, { -tip_height, radius, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(entity, { 0.0f, radius - half_tip_width, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(entity, { 0.0f, inner_radius, -half_thickness }, -Vec3f::UnitZ()); + data.add_vertex(Vec3f(0.0f, outer_radius, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(0.0f, radius + half_tip_width, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(-tip_height, radius, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(0.0f, radius - half_tip_width, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(0.0f, inner_radius, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); // bottom face triangles - append_indices(entity, 5, 7, 6); - append_indices(entity, 5, 9, 7); - append_indices(entity, 9, 8, 7); + data.add_triangle(5, 7, 6); + data.add_triangle(5, 9, 7); + data.add_triangle(9, 8, 7); // side faces vertices - append_vertex(entity, { 0.0f, outer_radius, -half_thickness }, Vec3f::UnitX()); - append_vertex(entity, { 0.0f, radius + half_tip_width, -half_thickness }, Vec3f::UnitX()); - append_vertex(entity, { 0.0f, outer_radius, half_thickness }, Vec3f::UnitX()); - append_vertex(entity, { 0.0f, radius + half_tip_width, half_thickness }, Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, outer_radius, -half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, radius + half_tip_width, -half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, outer_radius, half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, radius + half_tip_width, half_thickness), (Vec3f)Vec3f::UnitX()); Vec3f normal(-half_tip_width, tip_height, 0.0f); normal.normalize(); - append_vertex(entity, { 0.0f, radius + half_tip_width, -half_thickness }, normal); - append_vertex(entity, { -tip_height, radius, -half_thickness }, normal); - append_vertex(entity, { 0.0f, radius + half_tip_width, half_thickness }, normal); - append_vertex(entity, { -tip_height, radius, half_thickness }, normal); + data.add_vertex(Vec3f(0.0f, radius + half_tip_width, -half_thickness), normal); + data.add_vertex(Vec3f(-tip_height, radius, -half_thickness), normal); + data.add_vertex(Vec3f(0.0f, radius + half_tip_width, half_thickness), normal); + data.add_vertex(Vec3f(-tip_height, radius, half_thickness), normal); - normal = Vec3f(-half_tip_width, -tip_height, 0.0f); + normal = { -half_tip_width, -tip_height, 0.0f }; normal.normalize(); - append_vertex(entity, { -tip_height, radius, -half_thickness }, normal); - append_vertex(entity, { 0.0f, radius - half_tip_width, -half_thickness }, normal); - append_vertex(entity, { -tip_height, radius, half_thickness }, normal); - append_vertex(entity, { 0.0f, radius - half_tip_width, half_thickness }, normal); + data.add_vertex(Vec3f(-tip_height, radius, -half_thickness), normal); + data.add_vertex(Vec3f(0.0f, radius - half_tip_width, -half_thickness), normal); + data.add_vertex(Vec3f(-tip_height, radius, half_thickness), normal); + data.add_vertex(Vec3f(0.0f, radius - half_tip_width, half_thickness), normal); - append_vertex(entity, { 0.0f, radius - half_tip_width, -half_thickness }, Vec3f::UnitX()); - append_vertex(entity, { 0.0f, inner_radius, -half_thickness }, Vec3f::UnitX()); - append_vertex(entity, { 0.0f, radius - half_tip_width, half_thickness }, Vec3f::UnitX()); - append_vertex(entity, { 0.0f, inner_radius, half_thickness }, Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, radius - half_tip_width, -half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, inner_radius, -half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, radius - half_tip_width, half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, inner_radius, half_thickness), (Vec3f)Vec3f::UnitX()); // side face triangles - for (int i = 0; i < 4; ++i) { - const int ii = i * 4; - append_indices(entity, 10 + ii, 11 + ii, 13 + ii); - append_indices(entity, 10 + ii, 13 + ii, 12 + ii); + for (unsigned int i = 0; i < 4; ++i) { + const unsigned int ii = i * 4; + data.add_triangle(10 + ii, 11 + ii, 13 + ii); + data.add_triangle(10 + ii, 13 + ii, 12 + ii); } // stem // top face vertices - for (int i = 0; i <= resolution; ++i) { - const float angle = static_cast(i) * step_angle; - append_vertex(entity, { inner_radius * ::sin(angle), inner_radius * ::cos(angle), half_thickness }, Vec3f::UnitZ()); + for (unsigned int i = 0; i <= resolution; ++i) { + const float angle = float(i) * step_angle; + data.add_vertex(Vec3f(inner_radius * ::sin(angle), inner_radius * ::cos(angle), half_thickness), (Vec3f)Vec3f::UnitZ()); } - for (int i = 0; i <= resolution; ++i) { - const float angle = static_cast(i) * step_angle; - append_vertex(entity, { outer_radius * ::sin(angle), outer_radius * ::cos(angle), half_thickness }, Vec3f::UnitZ()); + for (unsigned int i = 0; i <= resolution; ++i) { + const float angle = float(i) * step_angle; + data.add_vertex(Vec3f(outer_radius * ::sin(angle), outer_radius * ::cos(angle), half_thickness), (Vec3f)Vec3f::UnitZ()); } // top face triangles - for (int i = 0; i < resolution; ++i) { - append_indices(entity, 26 + i, 27 + i, 27 + resolution + i); - append_indices(entity, 27 + i, 28 + resolution + i, 27 + resolution + i); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_triangle(26 + i, 27 + i, 27 + resolution + i); + data.add_triangle(27 + i, 28 + resolution + i, 27 + resolution + i); } // bottom face vertices - for (int i = 0; i <= resolution; ++i) { - const float angle = static_cast(i) * step_angle; - append_vertex(entity, { inner_radius * ::sin(angle), inner_radius * ::cos(angle), -half_thickness }, -Vec3f::UnitZ()); + for (unsigned int i = 0; i <= resolution; ++i) { + const float angle = float(i) * step_angle; + data.add_vertex(Vec3f(inner_radius * ::sin(angle), inner_radius * ::cos(angle), -half_thickness), (Vec3f)(-Vec3f::UnitZ())); } - for (int i = 0; i <= resolution; ++i) { - const float angle = static_cast(i) * step_angle; - append_vertex(entity, { outer_radius * ::sin(angle), outer_radius * ::cos(angle), -half_thickness }, -Vec3f::UnitZ()); + for (unsigned int i = 0; i <= resolution; ++i) { + const float angle = float(i) * step_angle; + data.add_vertex(Vec3f(outer_radius * ::sin(angle), outer_radius * ::cos(angle), -half_thickness), (Vec3f)(-Vec3f::UnitZ())); } // bottom face triangles - for (int i = 0; i < resolution; ++i) { - append_indices(entity, 28 + 2 * resolution + i, 29 + 3 * resolution + i, 29 + 2 * resolution + i); - append_indices(entity, 29 + 2 * resolution + i, 29 + 3 * resolution + i, 30 + 3 * resolution + i); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_triangle(28 + 2 * resolution + i, 29 + 3 * resolution + i, 29 + 2 * resolution + i); + data.add_triangle(29 + 2 * resolution + i, 29 + 3 * resolution + i, 30 + 3 * resolution + i); } // side faces vertices and triangles - for (int i = 0; i <= resolution; ++i) { - const float angle = static_cast(i) * step_angle; + for (unsigned int i = 0; i <= resolution; ++i) { + const float angle = float(i) * step_angle; const float c = ::cos(angle); const float s = ::sin(angle); - append_vertex(entity, { inner_radius * s, inner_radius * c, -half_thickness }, { -s, -c, 0.0f }); + data.add_vertex(Vec3f(inner_radius * s, inner_radius * c, -half_thickness), Vec3f(-s, -c, 0.0f)); } - for (int i = 0; i <= resolution; ++i) { - const float angle = static_cast(i) * step_angle; + for (unsigned int i = 0; i <= resolution; ++i) { + const float angle = float(i) * step_angle; const float c = ::cos(angle); const float s = ::sin(angle); - append_vertex(entity, { inner_radius * s, inner_radius * c, half_thickness }, { -s, -c, 0.0f }); + data.add_vertex(Vec3f(inner_radius * s, inner_radius * c, half_thickness), Vec3f(-s, -c, 0.0f)); } - int first_id = 26 + 4 * (resolution + 1); - for (int i = 0; i < resolution; ++i) { - const int ii = first_id + i; - append_indices(entity, ii, ii + 1, ii + resolution + 2); - append_indices(entity, ii, ii + resolution + 2, ii + resolution + 1); + unsigned int first_id = 26 + 4 * (resolution + 1); + for (unsigned int i = 0; i < resolution; ++i) { + const unsigned int ii = first_id + i; + data.add_triangle(ii, ii + 1, ii + resolution + 2); + data.add_triangle(ii, ii + resolution + 2, ii + resolution + 1); } - append_vertex(entity, { inner_radius, 0.0f, -half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { outer_radius, 0.0f, -half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { inner_radius, 0.0f, half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { outer_radius, 0.0f, half_thickness }, -Vec3f::UnitY()); + data.add_vertex(Vec3f(inner_radius, 0.0f, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(outer_radius, 0.0f, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(inner_radius, 0.0f, half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(outer_radius, 0.0f, half_thickness), (Vec3f)(-Vec3f::UnitY())); first_id = 26 + 6 * (resolution + 1); - append_indices(entity, first_id, first_id + 1, first_id + 3); - append_indices(entity, first_id, first_id + 3, first_id + 2); + data.add_triangle(first_id, first_id + 1, first_id + 3); + data.add_triangle(first_id, first_id + 3, first_id + 2); for (int i = resolution; i >= 0; --i) { - const float angle = static_cast(i) * step_angle; + const float angle = float(i) * step_angle; const float c = ::cos(angle); const float s = ::sin(angle); - append_vertex(entity, { outer_radius * s, outer_radius * c, -half_thickness }, { s, c, 0.0f }); + data.add_vertex(Vec3f(outer_radius * s, outer_radius * c, -half_thickness), Vec3f(s, c, 0.0f)); } for (int i = resolution; i >= 0; --i) { - const float angle = static_cast(i) * step_angle; + const float angle = float(i) * step_angle; const float c = ::cos(angle); const float s = ::sin(angle); - append_vertex(entity, { outer_radius * s, outer_radius * c, +half_thickness }, { s, c, 0.0f }); + data.add_vertex(Vec3f(outer_radius * s, outer_radius * c, +half_thickness), Vec3f(s, c, 0.0f)); } first_id = 30 + 6 * (resolution + 1); - for (int i = 0; i < resolution; ++i) { - const int ii = first_id + i; - append_indices(entity, ii, ii + 1, ii + resolution + 2); - append_indices(entity, ii, ii + resolution + 2, ii + resolution + 1); + for (unsigned int i = 0; i < resolution; ++i) { + const unsigned int ii = first_id + i; + data.add_triangle(ii, ii + 1, ii + resolution + 2); + data.add_triangle(ii, ii + resolution + 2, ii + resolution + 1); } - data.entities.emplace_back(entity); return data; } -GLModel::InitializationData straight_arrow(float tip_width, float tip_height, float stem_width, float stem_height, float thickness) +GLModel::Geometry straight_arrow(float tip_width, float tip_height, float stem_width, float stem_height, float thickness) { - auto append_vertex = [](GLModel::InitializationData::Entity& entity, const Vec3f& position, const Vec3f& normal) { - entity.positions.emplace_back(position); - entity.normals.emplace_back(normal); - }; - auto append_indices = [](GLModel::InitializationData::Entity& entity, unsigned int v1, unsigned int v2, unsigned int v3) { - entity.indices.emplace_back(v1); - entity.indices.emplace_back(v2); - entity.indices.emplace_back(v3); - }; - - GLModel::InitializationData data; - GLModel::InitializationData::Entity entity; - entity.type = GLModel::PrimitiveType::Triangles; + GLModel::Geometry data; + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + data.reserve_vertices(42); + data.reserve_indices(72); const float half_thickness = 0.5f * thickness; const float half_stem_width = 0.5f * stem_width; @@ -614,133 +1382,307 @@ GLModel::InitializationData straight_arrow(float tip_width, float tip_height, fl const float total_height = tip_height + stem_height; // top face vertices - append_vertex(entity, { half_stem_width, 0.0, half_thickness }, Vec3f::UnitZ()); - append_vertex(entity, { half_stem_width, stem_height, half_thickness }, Vec3f::UnitZ()); - append_vertex(entity, { half_tip_width, stem_height, half_thickness }, Vec3f::UnitZ()); - append_vertex(entity, { 0.0, total_height, half_thickness }, Vec3f::UnitZ()); - append_vertex(entity, { -half_tip_width, stem_height, half_thickness }, Vec3f::UnitZ()); - append_vertex(entity, { -half_stem_width, stem_height, half_thickness }, Vec3f::UnitZ()); - append_vertex(entity, { -half_stem_width, 0.0, half_thickness }, Vec3f::UnitZ()); + data.add_vertex(Vec3f(half_stem_width, 0.0f, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(half_stem_width, stem_height, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(half_tip_width, stem_height, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(0.0f, total_height, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(-half_tip_width, stem_height, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(-half_stem_width, stem_height, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(-half_stem_width, 0.0f, half_thickness), (Vec3f)Vec3f::UnitZ()); // top face triangles - append_indices(entity, 0, 1, 6); - append_indices(entity, 6, 1, 5); - append_indices(entity, 4, 5, 3); - append_indices(entity, 5, 1, 3); - append_indices(entity, 1, 2, 3); + data.add_triangle(0, 1, 6); + data.add_triangle(6, 1, 5); + data.add_triangle(4, 5, 3); + data.add_triangle(5, 1, 3); + data.add_triangle(1, 2, 3); // bottom face vertices - append_vertex(entity, { half_stem_width, 0.0, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(entity, { half_stem_width, stem_height, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(entity, { half_tip_width, stem_height, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(entity, { 0.0, total_height, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(entity, { -half_tip_width, stem_height, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(entity, { -half_stem_width, stem_height, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(entity, { -half_stem_width, 0.0, -half_thickness }, -Vec3f::UnitZ()); + data.add_vertex(Vec3f(half_stem_width, 0.0f, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(half_stem_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(half_tip_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(0.0f, total_height, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(-half_tip_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(-half_stem_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(-half_stem_width, 0.0f, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); // bottom face triangles - append_indices(entity, 7, 13, 8); - append_indices(entity, 13, 12, 8); - append_indices(entity, 12, 11, 10); - append_indices(entity, 8, 12, 10); - append_indices(entity, 9, 8, 10); + data.add_triangle(7, 13, 8); + data.add_triangle(13, 12, 8); + data.add_triangle(12, 11, 10); + data.add_triangle(8, 12, 10); + data.add_triangle(9, 8, 10); // side faces vertices - append_vertex(entity, { half_stem_width, 0.0, -half_thickness }, Vec3f::UnitX()); - append_vertex(entity, { half_stem_width, stem_height, -half_thickness }, Vec3f::UnitX()); - append_vertex(entity, { half_stem_width, 0.0, half_thickness }, Vec3f::UnitX()); - append_vertex(entity, { half_stem_width, stem_height, half_thickness }, Vec3f::UnitX()); + data.add_vertex(Vec3f(half_stem_width, 0.0f, -half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(half_stem_width, stem_height, -half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(half_stem_width, 0.0f, half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(half_stem_width, stem_height, half_thickness), (Vec3f)Vec3f::UnitX()); - append_vertex(entity, { half_stem_width, stem_height, -half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { half_tip_width, stem_height, -half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { half_stem_width, stem_height, half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { half_tip_width, stem_height, half_thickness }, -Vec3f::UnitY()); + data.add_vertex(Vec3f(half_stem_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(half_tip_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(half_stem_width, stem_height, half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(half_tip_width, stem_height, half_thickness), (Vec3f)(-Vec3f::UnitY())); Vec3f normal(tip_height, half_tip_width, 0.0f); normal.normalize(); - append_vertex(entity, { half_tip_width, stem_height, -half_thickness }, normal); - append_vertex(entity, { 0.0, total_height, -half_thickness }, normal); - append_vertex(entity, { half_tip_width, stem_height, half_thickness }, normal); - append_vertex(entity, { 0.0, total_height, half_thickness }, normal); + data.add_vertex(Vec3f(half_tip_width, stem_height, -half_thickness), normal); + data.add_vertex(Vec3f(0.0f, total_height, -half_thickness), normal); + data.add_vertex(Vec3f(half_tip_width, stem_height, half_thickness), normal); + data.add_vertex(Vec3f(0.0f, total_height, half_thickness), normal); - normal = Vec3f(-tip_height, half_tip_width, 0.0f); + normal = { -tip_height, half_tip_width, 0.0f }; normal.normalize(); - append_vertex(entity, { 0.0, total_height, -half_thickness }, normal); - append_vertex(entity, { -half_tip_width, stem_height, -half_thickness }, normal); - append_vertex(entity, { 0.0, total_height, half_thickness }, normal); - append_vertex(entity, { -half_tip_width, stem_height, half_thickness }, normal); - - append_vertex(entity, { -half_tip_width, stem_height, -half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { -half_stem_width, stem_height, -half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { -half_tip_width, stem_height, half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { -half_stem_width, stem_height, half_thickness }, -Vec3f::UnitY()); - - append_vertex(entity, { -half_stem_width, stem_height, -half_thickness }, -Vec3f::UnitX()); - append_vertex(entity, { -half_stem_width, 0.0, -half_thickness }, -Vec3f::UnitX()); - append_vertex(entity, { -half_stem_width, stem_height, half_thickness }, -Vec3f::UnitX()); - append_vertex(entity, { -half_stem_width, 0.0, half_thickness }, -Vec3f::UnitX()); - - append_vertex(entity, { -half_stem_width, 0.0, -half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { half_stem_width, 0.0, -half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { -half_stem_width, 0.0, half_thickness }, -Vec3f::UnitY()); - append_vertex(entity, { half_stem_width, 0.0, half_thickness }, -Vec3f::UnitY()); + data.add_vertex(Vec3f(0.0f, total_height, -half_thickness), normal); + data.add_vertex(Vec3f(-half_tip_width, stem_height, -half_thickness), normal); + data.add_vertex(Vec3f(0.0f, total_height, half_thickness), normal); + data.add_vertex(Vec3f(-half_tip_width, stem_height, half_thickness), normal); + + data.add_vertex(Vec3f(-half_tip_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(-half_stem_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(-half_tip_width, stem_height, half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(-half_stem_width, stem_height, half_thickness), (Vec3f)(-Vec3f::UnitY())); + + data.add_vertex(Vec3f(-half_stem_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitX())); + data.add_vertex(Vec3f(-half_stem_width, 0.0f, -half_thickness), (Vec3f)(-Vec3f::UnitX())); + data.add_vertex(Vec3f(-half_stem_width, stem_height, half_thickness), (Vec3f)(-Vec3f::UnitX())); + data.add_vertex(Vec3f(-half_stem_width, 0.0f, half_thickness), (Vec3f)(-Vec3f::UnitX())); + + data.add_vertex(Vec3f(-half_stem_width, 0.0f, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(half_stem_width, 0.0f, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(-half_stem_width, 0.0f, half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(half_stem_width, 0.0f, half_thickness), (Vec3f)(-Vec3f::UnitY())); // side face triangles - for (int i = 0; i < 7; ++i) { - const int ii = i * 4; - append_indices(entity, 14 + ii, 15 + ii, 17 + ii); - append_indices(entity, 14 + ii, 17 + ii, 16 + ii); + for (unsigned int i = 0; i < 7; ++i) { + const unsigned int ii = i * 4; + data.add_triangle(14 + ii, 15 + ii, 17 + ii); + data.add_triangle(14 + ii, 17 + ii, 16 + ii); } - data.entities.emplace_back(entity); return data; } -GLModel::InitializationData diamond(int resolution) +GLModel::Geometry diamond(unsigned int resolution) { - resolution = std::max(4, resolution); + resolution = std::max(4, resolution); - GLModel::InitializationData data; - GLModel::InitializationData::Entity entity; - entity.type = GLModel::PrimitiveType::Triangles; + GLModel::Geometry data; + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + data.reserve_vertices(resolution + 2); + data.reserve_indices((2 * (resolution + 1)) * 3); const float step = 2.0f * float(PI) / float(resolution); - // positions - for (int i = 0; i < resolution; ++i) { - float ii = float(i) * step; - entity.positions.emplace_back(0.5f * ::cos(ii), 0.5f * ::sin(ii), 0.0f); - } - entity.positions.emplace_back(0.0f, 0.0f, 0.5f); - entity.positions.emplace_back(0.0f, 0.0f, -0.5f); - - // normals - for (const Vec3f& v : entity.positions) { - entity.normals.emplace_back(v.normalized()); + // vertices + for (unsigned int i = 0; i < resolution; ++i) { + const float ii = float(i) * step; + const Vec3f p = { 0.5f * ::cos(ii), 0.5f * ::sin(ii), 0.0f }; + data.add_vertex(p, (Vec3f)p.normalized()); } + Vec3f p = { 0.0f, 0.0f, 0.5f }; + data.add_vertex(p, (Vec3f)p.normalized()); + p = { 0.0f, 0.0f, -0.5f }; + data.add_vertex(p, (Vec3f)p.normalized()); // triangles // top - for (int i = 0; i < resolution; ++i) { - entity.indices.push_back(i + 0); - entity.indices.push_back(i + 1); - entity.indices.push_back(resolution); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_triangle(i + 0, i + 1, resolution); } - entity.indices.push_back(resolution - 1); - entity.indices.push_back(0); - entity.indices.push_back(resolution); + data.add_triangle(resolution - 1, 0, resolution); // bottom - for (int i = 0; i < resolution; ++i) { - entity.indices.push_back(i + 0); - entity.indices.push_back(resolution + 1); - entity.indices.push_back(i + 1); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_triangle(i + 0, resolution + 1, i + 1); + } + data.add_triangle(resolution - 1, resolution + 1, 0); + + return data; +} + +GLModel::Geometry smooth_sphere(unsigned int resolution, float radius) +{ + resolution = std::max(4, resolution); + + const unsigned int sectorCount = resolution; + const unsigned int stackCount = resolution; + + const float sectorStep = float(2.0 * M_PI / sectorCount); + const float stackStep = float(M_PI / stackCount); + + GLModel::Geometry data; + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + data.reserve_vertices((stackCount - 1) * sectorCount + 2); + data.reserve_indices((2 * (stackCount - 1) * sectorCount) * 3); + + // vertices + for (unsigned int i = 0; i <= stackCount; ++i) { + // from pi/2 to -pi/2 + const double stackAngle = 0.5 * M_PI - stackStep * i; + const double xy = double(radius) * ::cos(stackAngle); + const double z = double(radius) * ::sin(stackAngle); + if (i == 0 || i == stackCount) { + const Vec3f v(float(xy), 0.0f, float(z)); + data.add_vertex(v, (Vec3f)v.normalized()); + } + else { + for (unsigned int j = 0; j < sectorCount; ++j) { + // from 0 to 2pi + const double sectorAngle = sectorStep * j; + const Vec3f v(float(xy * std::cos(sectorAngle)), float(xy * std::sin(sectorAngle)), float(z)); + data.add_vertex(v, (Vec3f)v.normalized()); + } + } + } + + // triangles + for (unsigned int i = 0; i < stackCount; ++i) { + // Beginning of current stack. + unsigned int k1 = (i == 0) ? 0 : (1 + (i - 1) * sectorCount); + const unsigned int k1_first = k1; + // Beginning of next stack. + unsigned int k2 = (i == 0) ? 1 : (k1 + sectorCount); + const unsigned int k2_first = k2; + for (unsigned int j = 0; j < sectorCount; ++j) { + // 2 triangles per sector excluding first and last stacks + unsigned int k1_next = k1; + unsigned int k2_next = k2; + if (i != 0) { + k1_next = (j + 1 == sectorCount) ? k1_first : (k1 + 1); + data.add_triangle(k1, k2, k1_next); + } + if (i + 1 != stackCount) { + k2_next = (j + 1 == sectorCount) ? k2_first : (k2 + 1); + data.add_triangle(k1_next, k2, k2_next); + } + k1 = k1_next; + k2 = k2_next; + } + } + + return data; +} + +GLModel::Geometry smooth_cylinder(unsigned int resolution, float radius, float height) +{ + resolution = std::max(4, resolution); + + const unsigned int sectorCount = resolution; + const float sectorStep = 2.0f * float(M_PI) / float(sectorCount); + + GLModel::Geometry data; + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + data.reserve_vertices(sectorCount * 4 + 2); + data.reserve_indices(sectorCount * 4 * 3); + + auto generate_vertices_on_circle = [sectorCount, sectorStep](float radius) { + std::vector ret; + ret.reserve(sectorCount); + for (unsigned int i = 0; i < sectorCount; ++i) { + // from 0 to 2pi + const float sectorAngle = sectorStep * i; + ret.emplace_back(radius * std::cos(sectorAngle), radius * std::sin(sectorAngle), 0.0f); + } + return ret; + }; + + const std::vector base_vertices = generate_vertices_on_circle(radius); + const Vec3f h = height * Vec3f::UnitZ(); + + // stem vertices + for (unsigned int i = 0; i < sectorCount; ++i) { + const Vec3f& v = base_vertices[i]; + const Vec3f n = v.normalized(); + data.add_vertex(v, n); + data.add_vertex(v + h, n); + } + + // stem triangles + for (unsigned int i = 0; i < sectorCount; ++i) { + unsigned int v1 = i * 2; + unsigned int v2 = (i < sectorCount - 1) ? v1 + 2 : 0; + unsigned int v3 = v2 + 1; + unsigned int v4 = v1 + 1; + data.add_triangle(v1, v2, v3); + data.add_triangle(v1, v3, v4); + } + + // bottom cap vertices + Vec3f cap_center = Vec3f::Zero(); + unsigned int cap_center_id = data.vertices_count(); + Vec3f normal = -Vec3f::UnitZ(); + + data.add_vertex(cap_center, normal); + for (unsigned int i = 0; i < sectorCount; ++i) { + data.add_vertex(base_vertices[i], normal); + } + + // bottom cap triangles + for (unsigned int i = 0; i < sectorCount; ++i) { + data.add_triangle(cap_center_id, (i < sectorCount - 1) ? cap_center_id + i + 2 : cap_center_id + 1, cap_center_id + i + 1); + } + + // top cap vertices + cap_center += h; + cap_center_id = data.vertices_count(); + normal = -normal; + + data.add_vertex(cap_center, normal); + for (unsigned int i = 0; i < sectorCount; ++i) { + data.add_vertex(base_vertices[i] + h, normal); + } + + // top cap triangles + for (unsigned int i = 0; i < sectorCount; ++i) { + data.add_triangle(cap_center_id, cap_center_id + i + 1, (i < sectorCount - 1) ? cap_center_id + i + 2 : cap_center_id + 1); + } + + return data; +} + +GLModel::Geometry smooth_torus(unsigned int primary_resolution, unsigned int secondary_resolution, float radius, float thickness) +{ + const unsigned int torus_sector_count = std::max(4, primary_resolution); + const float torus_sector_step = 2.0f * float(M_PI) / float(torus_sector_count); + const unsigned int section_sector_count = std::max(4, secondary_resolution); + const float section_sector_step = 2.0f * float(M_PI) / float(section_sector_count); + + GLModel::Geometry data; + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + data.reserve_vertices(torus_sector_count * section_sector_count); + data.reserve_indices(torus_sector_count * section_sector_count * 2 * 3); + + // vertices + for (unsigned int i = 0; i < torus_sector_count; ++i) { + const float section_angle = torus_sector_step * i; + const float csa = std::cos(section_angle); + const float ssa = std::sin(section_angle); + const Vec3f section_center(radius * csa, radius * ssa, 0.0f); + for (unsigned int j = 0; j < section_sector_count; ++j) { + const float circle_angle = section_sector_step * j; + const float thickness_xy = thickness * std::cos(circle_angle); + const float thickness_z = thickness * std::sin(circle_angle); + const Vec3f v(thickness_xy * csa, thickness_xy * ssa, thickness_z); + data.add_vertex(section_center + v, (Vec3f)v.normalized()); + } + } + + // triangles + for (unsigned int i = 0; i < torus_sector_count; ++i) { + const unsigned int ii = i * section_sector_count; + const unsigned int ii_next = ((i + 1) % torus_sector_count) * section_sector_count; + for (unsigned int j = 0; j < section_sector_count; ++j) { + const unsigned int j_next = (j + 1) % section_sector_count; + const unsigned int i0 = ii + j; + const unsigned int i1 = ii_next + j; + const unsigned int i2 = ii_next + j_next; + const unsigned int i3 = ii + j_next; + data.add_triangle(i0, i1, i2); + data.add_triangle(i0, i2, i3); + } } - entity.indices.push_back(resolution - 1); - entity.indices.push_back(resolution + 1); - entity.indices.push_back(0); - data.entities.emplace_back(entity); return data; } diff --git a/src/slic3r/GUI/GLModel.hpp b/src/slic3r/GUI/GLModel.hpp index d47c56fd93c..ef4ab6d474a 100644 --- a/src/slic3r/GUI/GLModel.hpp +++ b/src/slic3r/GUI/GLModel.hpp @@ -3,6 +3,8 @@ #include "libslic3r/Point.hpp" #include "libslic3r/BoundingBox.hpp" +#include "libslic3r/Color.hpp" +#include "libslic3r/Utils.hpp" #include #include @@ -13,53 +15,192 @@ namespace Slic3r { class TriangleMesh; class Polygon; using Polygons = std::vector; +class BuildVolume; namespace GUI { class GLModel { public: - enum class PrimitiveType : unsigned char + struct Geometry { - Triangles, - Lines, - LineStrip, - LineLoop + enum class EPrimitiveType : unsigned char + { + Points, + Triangles, + TriangleStrip, + TriangleFan, + Lines, + LineStrip, + LineLoop + }; + + enum class EVertexLayout : unsigned char + { + P2, // position 2 floats + P2T2, // position 2 floats + texture coords 2 floats + P3, // position 3 floats + P3T2, // position 3 floats + texture coords 2 floats + P3N3, // position 3 floats + normal 3 floats + P3N3T2, // position 3 floats + normal 3 floats + texture coords 2 floats +#if ENABLE_OPENGL_ES + P3N3E3, // position 3 floats + normal 3 floats + extra 3 floats +#endif // ENABLE_OPENGL_ES + P4, // position 4 floats + }; + + enum class EIndexType : unsigned char + { + UINT, // unsigned int + USHORT, // unsigned short + UBYTE // unsigned byte + }; + + struct Format + { + EPrimitiveType type{ EPrimitiveType::Triangles }; + EVertexLayout vertex_layout{ EVertexLayout::P3N3 }; + }; + + Format format; + std::vector vertices; + std::vector indices; + EIndexType index_type{ EIndexType::UINT }; + ColorRGBA color{ ColorRGBA::BLACK() }; + + void reserve_vertices(size_t vertices_count) { vertices.reserve(vertices_count * vertex_stride_floats(format)); } + void reserve_more_vertices(size_t vertices_count) { vertices.reserve(next_highest_power_of_2(vertices.size() + vertices_count * vertex_stride_floats(format))); } + void reserve_indices(size_t indices_count) { indices.reserve(indices_count); } + void reserve_more_indices(size_t indices_count) { indices.reserve(next_highest_power_of_2(indices.size() + indices_count)); } + + void add_vertex(const Vec2f& position); // EVertexLayout::P2 + void add_vertex(const Vec2f& position, const Vec2f& tex_coord); // EVertexLayout::P2T2 + void add_vertex(const Vec3f& position); // EVertexLayout::P3 + void add_vertex(const Vec3f& position, const Vec2f& tex_coord); // EVertexLayout::P3T2 + void add_vertex(const Vec3f& position, const Vec3f& normal) { // EVertexLayout::P3N3 + assert(format.vertex_layout == EVertexLayout::P3N3); + vertices.insert(vertices.end(), position.data(), position.data() + 3); + vertices.insert(vertices.end(), normal.data(), normal.data() + 3); + } + void add_vertex(const Vec3f& position, const Vec3f& normal, const Vec2f& tex_coord); // EVertexLayout::P3N3T2 +#if ENABLE_OPENGL_ES + void add_vertex(const Vec3f& position, const Vec3f& normal, const Vec3f& extra); // EVertexLayout::P3N3E3 +#endif // ENABLE_OPENGL_ES + void add_vertex(const Vec4f& position); // EVertexLayout::P4 + + void set_vertex(size_t id, const Vec3f& position, const Vec3f& normal); // EVertexLayout::P3N3 + + void set_index(size_t id, unsigned int index); + + void add_index(unsigned int id); + void add_line(unsigned int id1, unsigned int id2); + void add_triangle(unsigned int id1, unsigned int id2, unsigned int id3){ + indices.emplace_back(id1); + indices.emplace_back(id2); + indices.emplace_back(id3); + } + + Vec2f extract_position_2(size_t id) const; + Vec3f extract_position_3(size_t id) const; + Vec3f extract_normal_3(size_t id) const; + Vec2f extract_tex_coord_2(size_t id) const; + + unsigned int extract_index(size_t id) const; + + void remove_vertex(size_t id); + + bool is_empty() const { return vertices_count() == 0 || indices_count() == 0; } + + size_t vertices_count() const { return vertices.size() / vertex_stride_floats(format); } + size_t indices_count() const { return indices.size(); } + + size_t vertices_size_floats() const { return vertices.size(); } + size_t vertices_size_bytes() const { return vertices_size_floats() * sizeof(float); } + size_t indices_size_bytes() const { return indices.size() * index_stride_bytes(*this); } + + indexed_triangle_set get_as_indexed_triangle_set() const; + + static size_t vertex_stride_floats(const Format& format); + static size_t vertex_stride_bytes(const Format& format) { return vertex_stride_floats(format) * sizeof(float); } + + static size_t position_stride_floats(const Format& format); + static size_t position_stride_bytes(const Format& format) { return position_stride_floats(format) * sizeof(float); } + static size_t position_offset_floats(const Format& format); + static size_t position_offset_bytes(const Format& format) { return position_offset_floats(format) * sizeof(float); } + + static size_t normal_stride_floats(const Format& format); + static size_t normal_stride_bytes(const Format& format) { return normal_stride_floats(format) * sizeof(float); } + static size_t normal_offset_floats(const Format& format); + static size_t normal_offset_bytes(const Format& format) { return normal_offset_floats(format) * sizeof(float); } + + static size_t tex_coord_stride_floats(const Format& format); + static size_t tex_coord_stride_bytes(const Format& format) { return tex_coord_stride_floats(format) * sizeof(float); } + static size_t tex_coord_offset_floats(const Format& format); + static size_t tex_coord_offset_bytes(const Format& format) { return tex_coord_offset_floats(format) * sizeof(float); } + +#if ENABLE_OPENGL_ES + static size_t extra_stride_floats(const Format& format); + static size_t extra_stride_bytes(const Format& format) { return extra_stride_floats(format) * sizeof(float); } + static size_t extra_offset_floats(const Format& format); + static size_t extra_offset_bytes(const Format& format) { return extra_offset_floats(format) * sizeof(float); } +#endif // ENABLE_OPENGL_ES + + static size_t index_stride_bytes(const Geometry& data); + + static bool has_position(const Format& format); + static bool has_normal(const Format& format); + static bool has_tex_coord(const Format& format); +#if ENABLE_OPENGL_ES + static bool has_extra(const Format& format); +#endif // ENABLE_OPENGL_ES }; struct RenderData { - PrimitiveType type; + Geometry geometry; +#if ENABLE_GL_CORE_PROFILE + unsigned int vao_id{ 0 }; +#endif // ENABLE_GL_CORE_PROFILE unsigned int vbo_id{ 0 }; unsigned int ibo_id{ 0 }; + size_t vertices_count{ 0 }; size_t indices_count{ 0 }; - std::array color{ 1.0f, 1.0f, 1.0f, 1.0f }; }; - struct InitializationData + private: +#if ENABLE_GLMODEL_STATISTICS + struct Statistics { - struct Entity + struct Buffers { - PrimitiveType type; - std::vector positions; - std::vector normals; - std::vector indices; - std::array color{ 1.0f, 1.0f, 1.0f, 1.0f }; + struct Data + { + size_t current{ 0 }; + size_t max{ 0 }; + }; + Data indices; + Data vertices; }; - std::vector entities; - - size_t vertices_count() const; - size_t vertices_size_floats() const { return vertices_count() * 6; } - size_t vertices_size_bytes() const { return vertices_size_floats() * sizeof(float); } + Buffers gpu_memory; - size_t indices_count() const; - size_t indices_size_bytes() const { return indices_count() * sizeof(unsigned int); } + int64_t render_calls{ 0 }; + int64_t render_instanced_calls{ 0 }; }; - private: - std::vector m_render_data; + static Statistics s_statistics; +#endif // ENABLE_GLMODEL_STATISTICS + + RenderData m_render_data; + // By default the vertex and index buffers data are sent to gpu at the first call to render() method. + // If you need to initialize a model from outside the main thread, so that a call to render() may happen + // before the initialization is complete, use the methods: + // disable_render() + // ... do your initialization ... + // enable_render() + // to keep the data on cpu side until needed. + bool m_render_disabled{ false }; BoundingBoxf3 m_bounding_box; std::string m_filename; @@ -67,50 +208,111 @@ namespace GUI { GLModel() = default; virtual ~GLModel() { reset(); } - void init_from(const InitializationData& data); - void init_from(const indexed_triangle_set& its, const BoundingBoxf3& bbox); + size_t vertices_count() const { return m_render_data.vertices_count > 0 ? + m_render_data.vertices_count : m_render_data.geometry.vertices_count(); } + size_t indices_count() const { return m_render_data.indices_count > 0 ? + m_render_data.indices_count : m_render_data.geometry.indices_count(); } + + size_t vertices_size_floats() const { return vertices_count() * Geometry::vertex_stride_floats(m_render_data.geometry.format); } + size_t vertices_size_bytes() const { return vertices_size_floats() * sizeof(float); } + + size_t indices_size_bytes() const { return indices_count() * Geometry::index_stride_bytes(m_render_data.geometry); } + + const Geometry& get_geometry() const { return m_render_data.geometry; } + + void init_from(Geometry&& data); +#if ENABLE_SMOOTH_NORMALS + void init_from(const TriangleMesh& mesh, bool smooth_normals = false); +#else + void init_from(const TriangleMesh& mesh); +#endif // ENABLE_SMOOTH_NORMALS void init_from(const indexed_triangle_set& its); void init_from(const Polygons& polygons, float z); bool init_from_file(const std::string& filename); - // if entity_id == -1 set the color of all entities - void set_color(int entity_id, const std::array& color); + void set_color(const ColorRGBA& color) { m_render_data.geometry.color = color; } + const ColorRGBA& get_color() const { return m_render_data.geometry.color; } void reset(); - void render() const; - void render_instanced(unsigned int instances_vbo, unsigned int instances_count) const; + void render(); + void render(const std::pair& range); + void render_instanced(unsigned int instances_vbo, unsigned int instances_count); - bool is_initialized() const { return !m_render_data.empty(); } + bool is_initialized() const { return vertices_count() > 0 && indices_count() > 0; } + bool is_empty() const { return m_render_data.geometry.is_empty(); } const BoundingBoxf3& get_bounding_box() const { return m_bounding_box; } const std::string& get_filename() const { return m_filename; } + bool is_render_disabled() const { return m_render_disabled; } + void enable_render() { m_render_disabled = false; } + void disable_render() { m_render_disabled = true; } + + size_t cpu_memory_used() const { + size_t ret = 0; + if (!m_render_data.geometry.vertices.empty()) + ret += vertices_size_bytes(); + if (!m_render_data.geometry.indices.empty()) + ret += indices_size_bytes(); + return ret; + } + size_t gpu_memory_used() const { + size_t ret = 0; + if (m_render_data.geometry.vertices.empty()) + ret += vertices_size_bytes(); + if (m_render_data.geometry.indices.empty()) + ret += indices_size_bytes(); + return ret; + } + +#if ENABLE_GLMODEL_STATISTICS + static void render_statistics(); + static void reset_statistics_counters() { + s_statistics.render_calls = 0; + s_statistics.render_instanced_calls = 0; + } +#endif // ENABLE_GLMODEL_STATISTICS + private: - void send_to_gpu(RenderData& data, const std::vector& vertices, const std::vector& indices); + bool send_to_gpu(); }; + bool contains(const BuildVolume& volume, const GLModel& model, bool ignore_bottom = true); + // create an arrow with cylindrical stem and conical tip, with the given dimensions and resolution // the origin of the arrow is in the center of the stem cap // the arrow has its axis of symmetry along the Z axis and is pointing upward // used to render bed axes and sequential marker - GLModel::InitializationData stilized_arrow(int resolution, float tip_radius, float tip_height, float stem_radius, float stem_height); + GLModel::Geometry stilized_arrow(unsigned int resolution, float tip_radius, float tip_height, float stem_radius, float stem_height); // create an arrow whose stem is a quarter of circle, with the given dimensions and resolution // the origin of the arrow is in the center of the circle // the arrow is contained in the 1st quadrant of the XY plane and is pointing counterclockwise // used to render sidebar hints for rotations - GLModel::InitializationData circular_arrow(int resolution, float radius, float tip_height, float tip_width, float stem_width, float thickness); + GLModel::Geometry circular_arrow(unsigned int resolution, float radius, float tip_height, float tip_width, float stem_width, float thickness); // create an arrow with the given dimensions // the origin of the arrow is in the center of the stem cap // the arrow is contained in XY plane and has its main axis along the Y axis // used to render sidebar hints for position and scale - GLModel::InitializationData straight_arrow(float tip_width, float tip_height, float stem_width, float stem_height, float thickness); + GLModel::Geometry straight_arrow(float tip_width, float tip_height, float stem_width, float stem_height, float thickness); // create a diamond with the given resolution // the origin of the diamond is in its center // the diamond is contained into a box with size [1, 1, 1] - GLModel::InitializationData diamond(int resolution); + GLModel::Geometry diamond(unsigned int resolution); + + // create a sphere with smooth normals + // the origin of the sphere is in its center + GLModel::Geometry smooth_sphere(unsigned int resolution, float radius); + // create a cylinder with smooth normals + // the axis of the cylinder is the Z axis + // the origin of the cylinder is the center of its bottom cap face + GLModel::Geometry smooth_cylinder(unsigned int resolution, float radius, float height); + // create a torus with smooth normals + // the axis of the torus is the Z axis + // the origin of the torus is in its center + GLModel::Geometry smooth_torus(unsigned int primary_resolution, unsigned int secondary_resolution, float radius, float thickness); } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/GLSelectionRectangle.cpp b/src/slic3r/GUI/GLSelectionRectangle.cpp index 13467499a17..12f286ddb60 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.cpp +++ b/src/slic3r/GUI/GLSelectionRectangle.cpp @@ -1,5 +1,6 @@ #include "GLSelectionRectangle.hpp" #include "Camera.hpp" +#include "CameraUtils.hpp" #include "3DScene.hpp" #include "GLCanvas3D.hpp" #include "GUI_App.hpp" @@ -13,12 +14,12 @@ namespace GUI { void GLSelectionRectangle::start_dragging(const Vec2d& mouse_position, EState state) { - if (is_dragging() || (state == Off)) + if (is_dragging() || state == EState::Off) return; m_state = state; m_start_corner = mouse_position; - m_end_corner = mouse_position; + m_end_corner = mouse_position; } void GLSelectionRectangle::dragging(const Vec2d& mouse_position) @@ -29,35 +30,19 @@ namespace GUI { m_end_corner = mouse_position; } - std::vector GLSelectionRectangle::stop_dragging(const GLCanvas3D& canvas, const std::vector& points) + std::vector GLSelectionRectangle::contains(const std::vector& points) const { std::vector out; - if (!is_dragging()) - return out; - - m_state = Off; - - const Camera& camera = wxGetApp().plater()->get_camera(); - Matrix4d modelview = camera.get_view_matrix().matrix(); - Matrix4d projection= camera.get_projection_matrix().matrix(); - Vec4i viewport(camera.get_viewport().data()); - - // Convert our std::vector to Eigen dynamic matrix. - Eigen::Matrix pts(points.size(), 3); - for (size_t i=0; i(i, 0) = points[i]; - - // Get the projections. - Eigen::Matrix projections; - igl::project(pts, modelview, projection, viewport, projections); - // bounding box created from the rectangle corners - will take care of order of the corners - BoundingBox rectangle(Points{ Point(m_start_corner.cast()), Point(m_end_corner.cast()) }); + const BoundingBox rectangle(Points{ Point(m_start_corner.cast()), Point(m_end_corner.cast()) }); // Iterate over all points and determine whether they're in the rectangle. - for (int i = 0; iget_camera(); + Points points_2d = CameraUtils::project(camera, points); + unsigned int size = static_cast(points.size()); + for (unsigned int i = 0; i< size; ++i) + if (rectangle.contains(points_2d[i])) out.push_back(i); return out; @@ -66,62 +51,136 @@ namespace GUI { void GLSelectionRectangle::stop_dragging() { if (is_dragging()) - m_state = Off; + m_state = EState::Off; } - void GLSelectionRectangle::render(const GLCanvas3D& canvas) const + void GLSelectionRectangle::render(const GLCanvas3D& canvas) { if (!is_dragging()) return; - const Camera& camera = wxGetApp().plater()->get_camera(); - float inv_zoom = (float)camera.get_inv_zoom(); - - Size cnv_size = canvas.get_canvas_size(); - float cnv_half_width = 0.5f * (float)cnv_size.get_width(); - float cnv_half_height = 0.5f * (float)cnv_size.get_height(); - if ((cnv_half_width == 0.0f) || (cnv_half_height == 0.0f)) + const Size cnv_size = canvas.get_canvas_size(); + const float cnv_width = (float)cnv_size.get_width(); + const float cnv_height = (float)cnv_size.get_height(); + if (cnv_width == 0.0f || cnv_height == 0.0f) return; - Vec2d start(m_start_corner(0) - cnv_half_width, cnv_half_height - m_start_corner(1)); - Vec2d end(m_end_corner(0) - cnv_half_width, cnv_half_height - m_end_corner(1)); - - float left = (float)std::min(start(0), end(0)) * inv_zoom; - float top = (float)std::max(start(1), end(1)) * inv_zoom; - float right = (float)std::max(start(0), end(0)) * inv_zoom; - float bottom = (float)std::min(start(1), end(1)) * inv_zoom; + const float cnv_inv_width = 1.0f / cnv_width; + const float cnv_inv_height = 1.0f / cnv_height; + const float left = 2.0f * (get_left() * cnv_inv_width - 0.5f); + const float right = 2.0f * (get_right() * cnv_inv_width - 0.5f); + const float top = -2.0f * (get_top() * cnv_inv_height - 0.5f); + const float bottom = -2.0f * (get_bottom() * cnv_inv_height - 0.5f); - glsafe(::glLineWidth(1.5f)); - float color[3]; - color[0] = (m_state == Select) ? 0.3f : 1.0f; - color[1] = (m_state == Select) ? 1.0f : 0.3f; - color[2] = 0.3f; - glsafe(::glColor3fv(color)); +#if ENABLE_GL_CORE_PROFILE + const bool core_profile = OpenGLManager::get_gl_info().is_core_profile(); + if (!core_profile) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth(1.5f)); glsafe(::glDisable(GL_DEPTH_TEST)); - glsafe(::glPushMatrix()); - glsafe(::glLoadIdentity()); - // ensure that the rectangle is renderered inside the frustrum - glsafe(::glTranslated(0.0, 0.0, -(camera.get_near_z() + 0.5))); - // ensure that the overlay fits the frustrum near z plane - double gui_scale = camera.get_gui_scale(); - glsafe(::glScaled(gui_scale, gui_scale, 1.0)); - +#if !ENABLE_OPENGL_ES +#if ENABLE_GL_CORE_PROFILE + if (!core_profile) { +#endif // ENABLE_GL_CORE_PROFILE glsafe(::glPushAttrib(GL_ENABLE_BIT)); glsafe(::glLineStipple(4, 0xAAAA)); glsafe(::glEnable(GL_LINE_STIPPLE)); - - ::glBegin(GL_LINE_LOOP); - ::glVertex2f((GLfloat)left, (GLfloat)bottom); - ::glVertex2f((GLfloat)right, (GLfloat)bottom); - ::glVertex2f((GLfloat)right, (GLfloat)top); - ::glVertex2f((GLfloat)left, (GLfloat)top); - glsafe(::glEnd()); - +#if ENABLE_GL_CORE_PROFILE + } +#endif // ENABLE_GL_CORE_PROFILE +#endif // !ENABLE_OPENGL_ES + +#if ENABLE_OPENGL_ES + GLShaderProgram* shader = wxGetApp().get_shader("dashed_lines"); +#elif ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = core_profile ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else + GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_OPENGL_ES + if (shader != nullptr) { + shader->start_using(); + + if (!m_rectangle.is_initialized() || !m_old_start_corner.isApprox(m_start_corner) || !m_old_end_corner.isApprox(m_end_corner)) { + m_old_start_corner = m_start_corner; + m_old_end_corner = m_end_corner; + m_rectangle.reset(); + + GLModel::Geometry init_data; +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P4 }; + init_data.reserve_vertices(5); + init_data.reserve_indices(8); +#else + init_data.format = { GLModel::Geometry::EPrimitiveType::LineLoop, GLModel::Geometry::EVertexLayout::P2 }; + init_data.reserve_vertices(4); + init_data.reserve_indices(4); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + + // vertices +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + const float width = right - left; + const float height = top - bottom; + float perimeter = 0.0f; + + init_data.add_vertex(Vec4f(left, bottom, 0.0f, perimeter)); + perimeter += width; + init_data.add_vertex(Vec4f(right, bottom, 0.0f, perimeter)); + perimeter += height; + init_data.add_vertex(Vec4f(right, top, 0.0f, perimeter)); + perimeter += width; + init_data.add_vertex(Vec4f(left, top, 0.0f, perimeter)); + perimeter += height; + init_data.add_vertex(Vec4f(left, bottom, 0.0f, perimeter)); + + // indices + init_data.add_line(0, 1); + init_data.add_line(1, 2); + init_data.add_line(2, 3); + init_data.add_line(3, 4); +#else + init_data.add_vertex(Vec2f(left, bottom)); + init_data.add_vertex(Vec2f(right, bottom)); + init_data.add_vertex(Vec2f(right, top)); + init_data.add_vertex(Vec2f(left, top)); + + // indices + init_data.add_index(0); + init_data.add_index(1); + init_data.add_index(2); + init_data.add_index(3); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + + m_rectangle.init_from(std::move(init_data)); + } + + shader->set_uniform("view_model_matrix", Transform3d::Identity()); + shader->set_uniform("projection_matrix", Transform3d::Identity()); +#if ENABLE_OPENGL_ES + shader->set_uniform("dash_size", 0.01f); + shader->set_uniform("gap_size", 0.0075f); +#elif ENABLE_GL_CORE_PROFILE + if (core_profile) { + const std::array& viewport = wxGetApp().plater()->get_camera().get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.25f); + shader->set_uniform("dash_size", 0.01f); + shader->set_uniform("gap_size", 0.0075f); + } +#endif // ENABLE_OPENGL_ES + + m_rectangle.set_color(ColorRGBA((m_state == EState::Select) ? 0.3f : 1.0f, (m_state == EState::Select) ? 1.0f : 0.3f, 0.3f, 1.0f)); + m_rectangle.render(); + shader->stop_using(); + } + +#if !ENABLE_OPENGL_ES +#if ENABLE_GL_CORE_PROFILE + if (!core_profile) +#endif // ENABLE_GL_CORE_PROFILE glsafe(::glPopAttrib()); - - glsafe(::glPopMatrix()); +#endif // !ENABLE_OPENGL_ES } } // namespace GUI diff --git a/src/slic3r/GUI/GLSelectionRectangle.hpp b/src/slic3r/GUI/GLSelectionRectangle.hpp index d9869771ef9..e57e02e724b 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.hpp +++ b/src/slic3r/GUI/GLSelectionRectangle.hpp @@ -2,6 +2,7 @@ #define slic3r_GLSelectionRectangle_hpp_ #include "libslic3r/Point.hpp" +#include "GLModel.hpp" namespace Slic3r { namespace GUI { @@ -11,7 +12,7 @@ class GLCanvas3D; class GLSelectionRectangle { public: - enum EState { + enum class EState { Off, Select, Deselect @@ -24,28 +25,33 @@ class GLSelectionRectangle { void dragging(const Vec2d& mouse_position); // Given a vector of points in world coordinates, the function returns indices of those - // that are in the rectangle. It then disables the rectangle. - std::vector stop_dragging(const GLCanvas3D& canvas, const std::vector& points); + // that are in the rectangle. + std::vector contains(const std::vector& points) const; // Disables the rectangle. void stop_dragging(); - void render(const GLCanvas3D& canvas) const; + void render(const GLCanvas3D& canvas); + + bool is_dragging() const { return m_state != EState::Off; } + bool is_empty() const { return m_state == EState::Off || m_start_corner.isApprox(m_end_corner); } - bool is_dragging() const { return m_state != Off; } EState get_state() const { return m_state; } - float get_width() const { return std::abs(m_start_corner(0) - m_end_corner(0)); } - float get_height() const { return std::abs(m_start_corner(1) - m_end_corner(1)); } - float get_left() const { return std::min(m_start_corner(0), m_end_corner(0)); } - float get_right() const { return std::max(m_start_corner(0), m_end_corner(0)); } - float get_top() const { return std::max(m_start_corner(1), m_end_corner(1)); } - float get_bottom() const { return std::min(m_start_corner(1), m_end_corner(1)); } + float get_width() const { return std::abs(m_start_corner.x() - m_end_corner.x()); } + float get_height() const { return std::abs(m_start_corner.y() - m_end_corner.y()); } + float get_left() const { return std::min(m_start_corner.x(), m_end_corner.x()); } + float get_right() const { return std::max(m_start_corner.x(), m_end_corner.x()); } + float get_top() const { return std::max(m_start_corner.y(), m_end_corner.y()); } + float get_bottom() const { return std::min(m_start_corner.y(), m_end_corner.y()); } private: - EState m_state = Off; - Vec2d m_start_corner; - Vec2d m_end_corner; + EState m_state{ EState::Off }; + Vec2d m_start_corner{ Vec2d::Zero() }; + Vec2d m_end_corner{ Vec2d::Zero() }; + GLModel m_rectangle; + Vec2d m_old_start_corner{ Vec2d::Zero() }; + Vec2d m_old_end_corner{ Vec2d::Zero() }; }; diff --git a/src/slic3r/GUI/GLShader.cpp b/src/slic3r/GUI/GLShader.cpp index 9c1e936525e..5146f03fc6e 100644 --- a/src/slic3r/GUI/GLShader.cpp +++ b/src/slic3r/GUI/GLShader.cpp @@ -4,6 +4,7 @@ #include "3DScene.hpp" #include "libslic3r/Utils.hpp" #include "libslic3r/format.hpp" +#include "libslic3r/Color.hpp" #include #include @@ -121,8 +122,7 @@ bool GLShaderProgram::init_from_texts(const std::string& name, const ShaderSourc for (size_t i = 0; i < static_cast(EShaderType::Count); ++i) { const std::string& source = sources[i]; - if (!source.empty()) - { + if (!source.empty()) { EShaderType type = static_cast(i); auto [result, id] = create_shader(type); if (result) @@ -206,154 +206,147 @@ void GLShaderProgram::stop_using() const glsafe(::glUseProgram(0)); } -bool GLShaderProgram::set_uniform(const char* name, int value) const +void GLShaderProgram::set_uniform(int id, int value) const { - int id = get_uniform_location(name); - if (id >= 0) { - glsafe(::glUniform1i(id, static_cast(value))); - return true; - } - return false; + if (id >= 0) + glsafe(::glUniform1i(id, value)); } -bool GLShaderProgram::set_uniform(const char* name, bool value) const +void GLShaderProgram::set_uniform(int id, bool value) const { - return set_uniform(name, value ? 1 : 0); + set_uniform(id, value ? 1 : 0); } -bool GLShaderProgram::set_uniform(const char* name, float value) const +void GLShaderProgram::set_uniform(int id, float value) const { - int id = get_uniform_location(name); - if (id >= 0) { - glsafe(::glUniform1f(id, static_cast(value))); - return true; - } - return false; + if (id >= 0) + glsafe(::glUniform1f(id, value)); } -bool GLShaderProgram::set_uniform(const char* name, double value) const +void GLShaderProgram::set_uniform(int id, double value) const { - return set_uniform(name, static_cast(value)); + set_uniform(id, static_cast(value)); } -bool GLShaderProgram::set_uniform(const char* name, const std::array& value) const +void GLShaderProgram::set_uniform(int id, const std::array& value) const { - int id = get_uniform_location(name); - if (id >= 0) { + if (id >= 0) glsafe(::glUniform2iv(id, 1, static_cast(value.data()))); - return true; - } - return false; } -bool GLShaderProgram::set_uniform(const char* name, const std::array& value) const +void GLShaderProgram::set_uniform(int id, const std::array& value) const { - int id = get_uniform_location(name); - if (id >= 0) { + if (id >= 0) glsafe(::glUniform3iv(id, 1, static_cast(value.data()))); - return true; - } - return false; } -bool GLShaderProgram::set_uniform(const char* name, const std::array& value) const +void GLShaderProgram::set_uniform(int id, const std::array& value) const { - int id = get_uniform_location(name); - if (id >= 0) { + if (id >= 0) glsafe(::glUniform4iv(id, 1, static_cast(value.data()))); - return true; - } - return false; } -bool GLShaderProgram::set_uniform(const char* name, const std::array& value) const +void GLShaderProgram::set_uniform(int id, const std::array& value) const { - int id = get_uniform_location(name); - if (id >= 0) { + if (id >= 0) glsafe(::glUniform2fv(id, 1, static_cast(value.data()))); - return true; - } - return false; } -bool GLShaderProgram::set_uniform(const char* name, const std::array& value) const +void GLShaderProgram::set_uniform(int id, const std::array& value) const { - int id = get_uniform_location(name); - if (id >= 0) { + if (id >= 0) glsafe(::glUniform3fv(id, 1, static_cast(value.data()))); - return true; - } - return false; } -bool GLShaderProgram::set_uniform(const char* name, const std::array& value) const +void GLShaderProgram::set_uniform(int id, const std::array& value) const { - int id = get_uniform_location(name); - if (id >= 0) { + if (id >= 0) glsafe(::glUniform4fv(id, 1, static_cast(value.data()))); - return true; - } - return false; } -bool GLShaderProgram::set_uniform(const char* name, const float* value, size_t size) const +void GLShaderProgram::set_uniform(int id, const std::array& value) const { - if (size == 1) - return set_uniform(name, value[0]); - else if (size < 5) { - int id = get_uniform_location(name); - if (id >= 0) { - if (size == 2) - glsafe(::glUniform2fv(id, 1, static_cast(value))); - else if (size == 3) - glsafe(::glUniform3fv(id, 1, static_cast(value))); - else - glsafe(::glUniform4fv(id, 1, static_cast(value))); - - return true; - } - } - return false; + const std::array f_value = { float(value[0]), float(value[1]), float(value[2]), float(value[3]) }; + set_uniform(id, f_value); } -bool GLShaderProgram::set_uniform(const char* name, const Transform3f& value) const +void GLShaderProgram::set_uniform(int id, const float* value, size_t size) const { - int id = get_uniform_location(name); if (id >= 0) { - glsafe(::glUniformMatrix4fv(id, 1, GL_FALSE, static_cast(value.matrix().data()))); - return true; + if (size == 1) + set_uniform(id, value[0]); + else if (size == 2) + glsafe(::glUniform2fv(id, 1, static_cast(value))); + else if (size == 3) + glsafe(::glUniform3fv(id, 1, static_cast(value))); + else if (size == 4) + glsafe(::glUniform4fv(id, 1, static_cast(value))); } - return false; } -bool GLShaderProgram::set_uniform(const char* name, const Transform3d& value) const +void GLShaderProgram::set_uniform(int id, const Transform3f& value) const { - return set_uniform(name, value.cast()); + if (id >= 0) + glsafe(::glUniformMatrix4fv(id, 1, GL_FALSE, static_cast(value.matrix().data()))); } -bool GLShaderProgram::set_uniform(const char* name, const Matrix3f& value) const +void GLShaderProgram::set_uniform(int id, const Transform3d& value) const { - int id = get_uniform_location(name); - if (id >= 0) { + set_uniform(id, value.cast()); +} + +void GLShaderProgram::set_uniform(int id, const Matrix3f& value) const +{ + if (id >= 0) glsafe(::glUniformMatrix3fv(id, 1, GL_FALSE, static_cast(value.data()))); - return true; - } - return false; } -bool GLShaderProgram::set_uniform(const char* name, const Vec3f& value) const +void GLShaderProgram::set_uniform(int id, const Matrix3d& value) const { - int id = get_uniform_location(name); - if (id >= 0) { + set_uniform(id, (Matrix3f)value.cast()); +} + +void GLShaderProgram::set_uniform(int id, const Matrix4f& value) const +{ + if (id >= 0) + glsafe(::glUniformMatrix4fv(id, 1, GL_FALSE, static_cast(value.data()))); +} + +void GLShaderProgram::set_uniform(int id, const Matrix4d& value) const +{ + set_uniform(id, (Matrix4f)value.cast()); +} + +void GLShaderProgram::set_uniform(int id, const Vec2f& value) const +{ + if (id >= 0) + glsafe(::glUniform2fv(id, 1, static_cast(value.data()))); +} + +void GLShaderProgram::set_uniform(int id, const Vec2d& value) const +{ + set_uniform(id, static_cast(value.cast())); +} + +void GLShaderProgram::set_uniform(int id, const Vec3f& value) const +{ + if (id >= 0) glsafe(::glUniform3fv(id, 1, static_cast(value.data()))); - return true; - } - return false; } -bool GLShaderProgram::set_uniform(const char* name, const Vec3d& value) const +void GLShaderProgram::set_uniform(int id, const Vec3d& value) const +{ + set_uniform(id, static_cast(value.cast())); +} + +void GLShaderProgram::set_uniform(int id, const ColorRGB& value) const +{ + set_uniform(id, value.data(), 3); +} + +void GLShaderProgram::set_uniform(int id, const ColorRGBA& value) const { - return set_uniform(name, static_cast(value.cast())); + set_uniform(id, value.data(), 4); } int GLShaderProgram::get_attrib_location(const char* name) const diff --git a/src/slic3r/GUI/GLShader.hpp b/src/slic3r/GUI/GLShader.hpp index d7b92000dfc..935daaaeaaa 100644 --- a/src/slic3r/GUI/GLShader.hpp +++ b/src/slic3r/GUI/GLShader.hpp @@ -9,6 +9,9 @@ namespace Slic3r { +class ColorRGB; +class ColorRGBA; + class GLShaderProgram { public: @@ -44,22 +47,55 @@ class GLShaderProgram void start_using() const; void stop_using() const; - bool set_uniform(const char* name, int value) const; - bool set_uniform(const char* name, bool value) const; - bool set_uniform(const char* name, float value) const; - bool set_uniform(const char* name, double value) const; - bool set_uniform(const char* name, const std::array& value) const; - bool set_uniform(const char* name, const std::array& value) const; - bool set_uniform(const char* name, const std::array& value) const; - bool set_uniform(const char* name, const std::array& value) const; - bool set_uniform(const char* name, const std::array& value) const; - bool set_uniform(const char* name, const std::array& value) const; - bool set_uniform(const char* name, const float* value, size_t size) const; - bool set_uniform(const char* name, const Transform3f& value) const; - bool set_uniform(const char* name, const Transform3d& value) const; - bool set_uniform(const char* name, const Matrix3f& value) const; - bool set_uniform(const char* name, const Vec3f& value) const; - bool set_uniform(const char* name, const Vec3d& value) const; + void set_uniform(const char* name, int value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, bool value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, float value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, double value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, const std::array& value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, const std::array& value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, const std::array& value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, const std::array& value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, const std::array& value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, const std::array& value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, const std::array& value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, const float* value, size_t size) const { set_uniform(get_uniform_location(name), value, size); } + void set_uniform(const char* name, const Transform3f& value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, const Transform3d& value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, const Matrix3f& value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, const Matrix3d& value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, const Matrix4f& value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, const Matrix4d& value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, const Vec2f& value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, const Vec2d& value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, const Vec3f& value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, const Vec3d& value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, const ColorRGB& value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, const ColorRGBA& value) const { set_uniform(get_uniform_location(name), value); } + + void set_uniform(int id, int value) const; + void set_uniform(int id, bool value) const; + void set_uniform(int id, float value) const; + void set_uniform(int id, double value) const; + void set_uniform(int id, const std::array& value) const; + void set_uniform(int id, const std::array& value) const; + void set_uniform(int id, const std::array& value) const; + void set_uniform(int id, const std::array& value) const; + void set_uniform(int id, const std::array& value) const; + void set_uniform(int id, const std::array& value) const; + void set_uniform(int id, const std::array& value) const; + void set_uniform(int id, const float* value, size_t size) const; + void set_uniform(int id, const Transform3f& value) const; + void set_uniform(int id, const Transform3d& value) const; + void set_uniform(int id, const Matrix3f& value) const; + void set_uniform(int id, const Matrix3d& value) const; + void set_uniform(int id, const Matrix4f& value) const; + void set_uniform(int id, const Matrix4d& value) const; + void set_uniform(int id, const Vec2f& value) const; + void set_uniform(int id, const Vec2d& value) const; + void set_uniform(int id, const Vec3f& value) const; + void set_uniform(int id, const Vec3d& value) const; + void set_uniform(int id, const ColorRGB& value) const; + void set_uniform(int id, const ColorRGBA& value) const; // returns -1 if not found int get_attrib_location(const char* name) const; diff --git a/src/slic3r/GUI/GLShadersManager.cpp b/src/slic3r/GUI/GLShadersManager.cpp index 7fc03d42173..e0ee02a9840 100644 --- a/src/slic3r/GUI/GLShadersManager.cpp +++ b/src/slic3r/GUI/GLShadersManager.cpp @@ -3,6 +3,9 @@ #include "GLShadersManager.hpp" #include "3DScene.hpp" #include "GUI_App.hpp" +#if ENABLE_GL_CORE_PROFILE +#include "OpenGLManager.hpp" +#endif // ENABLE_GL_CORE_PROFILE #include #include @@ -33,25 +36,53 @@ std::pair GLShadersManager::init() bool valid = true; +#if ENABLE_OPENGL_ES + const std::string prefix = "ES/"; + // used to render wireframed triangles + valid &= append_shader("wireframe", { prefix + "wireframe.vs", prefix + "wireframe.fs" }); +#else + const std::string prefix = GUI::wxGetApp().is_gl_version_greater_or_equal_to(3, 1) ? "140/" : "110/"; +#endif // ENABLE_OPENGL_ES + // imgui shader + valid &= append_shader("imgui", { prefix + "imgui.vs", prefix + "imgui.fs" }); + // basic shader, used to render all what was previously rendered using the immediate mode + valid &= append_shader("flat", { prefix + "flat.vs", prefix + "flat.fs" }); + // basic shader with plane clipping, used to render volumes in picking pass + valid &= append_shader("flat_clip", { prefix + "flat_clip.vs", prefix + "flat_clip.fs" }); + // basic shader for textures, used to render textures + valid &= append_shader("flat_texture", { prefix + "flat_texture.vs", prefix + "flat_texture.fs" }); + // used to render 3D scene background + valid &= append_shader("background", { prefix + "background.vs", prefix + "background.fs" }); +#if ENABLE_OPENGL_ES + // used to render dashed lines + valid &= append_shader("dashed_lines", { prefix + "dashed_lines.vs", prefix + "dashed_lines.fs" }); +#elif ENABLE_GL_CORE_PROFILE + if (GUI::OpenGLManager::get_gl_info().is_core_profile()) + // used to render thick and/or dashed lines + valid &= append_shader("dashed_thick_lines", { prefix + "dashed_thick_lines.vs", prefix + "dashed_thick_lines.fs", prefix + "dashed_thick_lines.gs" }); +#endif // ENABLE_OPENGL_ES + // used to render toolpaths center of gravity + valid &= append_shader("toolpaths_cog", { prefix + "toolpaths_cog.vs", prefix + "toolpaths_cog.fs" }); // used to render bed axes and model, selection hints, gcode sequential view marker model, preview shells, options in gcode preview - valid &= append_shader("gouraud_light", { "gouraud_light.vs", "gouraud_light.fs" }); + valid &= append_shader("gouraud_light", { prefix + "gouraud_light.vs", prefix + "gouraud_light.fs" }); + // extend "gouraud_light" by adding clipping, used in sla gizmos + valid &= append_shader("gouraud_light_clip", { prefix + "gouraud_light_clip.vs", prefix + "gouraud_light_clip.fs" }); // used to render printbed - valid &= append_shader("printbed", { "printbed.vs", "printbed.fs" }); + valid &= append_shader("printbed", { prefix + "printbed.vs", prefix + "printbed.fs" }); // used to render options in gcode preview - if (GUI::wxGetApp().is_gl_version_greater_or_equal_to(3, 3)) - valid &= append_shader("gouraud_light_instanced", { "gouraud_light_instanced.vs", "gouraud_light_instanced.fs" }); - // used to render extrusion and travel paths as lines in gcode preview - valid &= append_shader("toolpaths_lines", { "toolpaths_lines.vs", "toolpaths_lines.fs" }); + if (GUI::wxGetApp().is_gl_version_greater_or_equal_to(3, 3)) { + valid &= append_shader("gouraud_light_instanced", { prefix + "gouraud_light_instanced.vs", prefix + "gouraud_light_instanced.fs" }); + } // used to render objects in 3d editor - valid &= append_shader("gouraud", { "gouraud.vs", "gouraud.fs" } + valid &= append_shader("gouraud", { prefix + "gouraud.vs", prefix + "gouraud.fs" } #if ENABLE_ENVIRONMENT_MAP , { "ENABLE_ENVIRONMENT_MAP"sv } #endif // ENABLE_ENVIRONMENT_MAP ); // used to render variable layers heights in 3d editor - valid &= append_shader("variable_layer_height", { "variable_layer_height.vs", "variable_layer_height.fs" }); + valid &= append_shader("variable_layer_height", { prefix + "variable_layer_height.vs", prefix + "variable_layer_height.fs" }); // used to render highlight contour around selected triangles inside the multi-material gizmo - valid &= append_shader("mm_contour", { "mm_contour.vs", "mm_contour.fs" }); + valid &= append_shader("mm_contour", { prefix + "mm_contour.vs", prefix + "mm_contour.fs" }); // Used to render painted triangles inside the multi-material gizmo. Triangle normals are computed inside fragment shader. // For Apple's on Arm CPU computed triangle normals inside fragment shader using dFdx and dFdy has the opposite direction. // Because of this, objects had darker colors inside the multi-material gizmo. @@ -59,9 +90,9 @@ std::pair GLShadersManager::init() // Since macOS 12 (Monterey), this issue with the opposite direction on Apple's Arm CPU seems to be fixed, and computed // triangle normals inside fragment shader have the right direction. if (platform_flavor() == PlatformFlavor::OSXOnArm && wxPlatformInfo::Get().GetOSMajorVersion() < 12) - valid &= append_shader("mm_gouraud", {"mm_gouraud.vs", "mm_gouraud.fs"}, {"FLIP_TRIANGLE_NORMALS"sv}); + valid &= append_shader("mm_gouraud", { prefix + "mm_gouraud.vs", prefix + "mm_gouraud.fs" }, { "FLIP_TRIANGLE_NORMALS"sv }); else - valid &= append_shader("mm_gouraud", {"mm_gouraud.vs", "mm_gouraud.fs"}); + valid &= append_shader("mm_gouraud", { prefix + "mm_gouraud.vs", prefix + "mm_gouraud.fs" }); return { valid, error }; } diff --git a/src/slic3r/GUI/GLTexture.cpp b/src/slic3r/GUI/GLTexture.cpp index 201c37296ef..93e96a642d0 100644 --- a/src/slic3r/GUI/GLTexture.cpp +++ b/src/slic3r/GUI/GLTexture.cpp @@ -3,6 +3,9 @@ #include "3DScene.hpp" #include "OpenGLManager.hpp" +#include "GUI_App.hpp" +#include "GLModel.hpp" +#include "BitmapCache.hpp" #include @@ -18,8 +21,8 @@ #define STB_DXT_IMPLEMENTATION #include "stb_dxt/stb_dxt.h" -#include "nanosvg/nanosvg.h" -#include "nanosvg/nanosvgrast.h" +#include +#include #include "libslic3r/Utils.hpp" @@ -120,11 +123,7 @@ void GLTexture::Compressor::compress() GLTexture::Quad_UVs GLTexture::FullTextureUVs = { { 0.0f, 1.0f }, { 1.0f, 1.0f }, { 1.0f, 0.0f }, { 0.0f, 0.0f } }; GLTexture::GLTexture() - : m_id(0) - , m_width(0) - , m_height(0) - , m_source("") - , m_compressor(*this) + : m_compressor(*this) { } @@ -204,14 +203,14 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vectorwidth, image->height); // offset by 1 to leave the first pixel empty (both in x and y) - nsvgRasterize(rast, image, 1, 1, scale, sprite_data.data(), sprite_size_px, sprite_size_px, sprite_stride); + nsvgRasterize(rast, image, 1, 1, scale, sprite_data.data(), sprite_size_px_ex, sprite_size_px_ex, sprite_stride); // makes white only copy of the sprite ::memcpy((void*)sprite_white_only_data.data(), (const void*)sprite_data.data(), sprite_bytes); @@ -276,7 +275,7 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vectorstart_using(); + shader->set_uniform("view_model_matrix", Transform3d::Identity()); + shader->set_uniform("projection_matrix", Transform3d::Identity()); + model.render(); + shader->stop_using(); + } glsafe(::glBindTexture(GL_TEXTURE_2D, 0)); +#if !ENABLE_GL_CORE_PROFILE && !ENABLE_OPENGL_ES glsafe(::glDisable(GL_TEXTURE_2D)); +#endif // !ENABLE_GL_CORE_PROFILE && !ENABLE_OPENGL_ES glsafe(::glDisable(GL_BLEND)); } +static bool to_squared_power_of_two(const std::string& filename, int max_size_px, int& w, int& h) +{ + auto is_power_of_two = [](int v) { return v != 0 && (v & (v - 1)) == 0; }; + auto upper_power_of_two = [](int v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; }; + + int new_w = std::max(w, h); + if (!is_power_of_two(new_w)) + new_w = upper_power_of_two(new_w); + + while (new_w > max_size_px) { + new_w /= 2; + } + + const int new_h = new_w; + const bool ret = (new_w != w || new_h != h); + w = new_w; + h = new_h; + return ret; +} + bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps, ECompressionType compression_type, bool apply_anisotropy) { - bool compression_enabled = (compression_type != None) && GLEW_EXT_texture_compression_s3tc; + const bool compression_enabled = (compression_type != None) && OpenGLManager::are_compressed_textures_supported(); // Load a PNG with an alpha channel. wxImage image; @@ -368,6 +411,11 @@ bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps, ECo bool requires_rescale = false; + if (use_mipmaps && compression_enabled && OpenGLManager::force_power_of_two_textures()) { + if (to_squared_power_of_two(boost::filesystem::path(filename).filename().string(), OpenGLManager::get_gl_info().get_max_tex_size(), m_width, m_height)) + requires_rescale = true; + } + if (compression_enabled && compression_type == MultiThreaded) { // the stb_dxt compression library seems to like only texture sizes which are a multiple of 4 int width_rem = m_width % 4; @@ -494,7 +542,7 @@ bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps, ECo m_source = filename; - if (compression_enabled && compression_type == MultiThreaded) + if (compression_type == MultiThreaded) // start asynchronous compression m_compressor.start_compressing(); @@ -503,19 +551,25 @@ bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps, ECo bool GLTexture::load_from_svg(const std::string& filename, bool use_mipmaps, bool compress, bool apply_anisotropy, unsigned int max_size_px) { - bool compression_enabled = compress && GLEW_EXT_texture_compression_s3tc; + const bool compression_enabled = compress && OpenGLManager::are_compressed_textures_supported(); - NSVGimage* image = nsvgParseFromFile(filename.c_str(), "px", 96.0f); + NSVGimage* image = BitmapCache::nsvgParseFromFileWithReplace(filename.c_str(), "px", 96.0f, {}); if (image == nullptr) { reset(); return false; } - float scale = (float)max_size_px / std::max(image->width, image->height); + const float scale = (float)max_size_px / std::max(image->width, image->height); m_width = (int)(scale * image->width); m_height = (int)(scale * image->height); + if (use_mipmaps && compression_enabled && OpenGLManager::force_power_of_two_textures()) + to_squared_power_of_two(boost::filesystem::path(filename).filename().string(), max_size_px, m_width, m_height); + + float scale_w = (float)m_width / image->width; + float scale_h = (float)m_height / image->height; + if (compression_enabled) { // the stb_dxt compression library seems to like only texture sizes which are a multiple of 4 int width_rem = m_width % 4; @@ -528,7 +582,7 @@ bool GLTexture::load_from_svg(const std::string& filename, bool use_mipmaps, boo m_height += (4 - height_rem); } - int n_pixels = m_width * m_height; + const int n_pixels = m_width * m_height; if (n_pixels <= 0) { reset(); @@ -545,7 +599,7 @@ bool GLTexture::load_from_svg(const std::string& filename, bool use_mipmaps, boo // creates the temporary buffer only once, with max size, and reuse it for all the levels, if generating mipmaps std::vector data(n_pixels * 4, 0); - nsvgRasterize(rast, image, 0, 0, scale, data.data(), m_width, m_height, m_width * 4); + nsvgRasterizeXY(rast, image, 0, 0, scale_w, scale_h, data.data(), m_width, m_height, m_width * 4); // sends data to gpu glsafe(::glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); @@ -567,7 +621,7 @@ bool GLTexture::load_from_svg(const std::string& filename, bool use_mipmaps, boo else glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)m_width, (GLsizei)m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data())); - if (use_mipmaps && OpenGLManager::use_manually_generated_mipmaps()) { + if (use_mipmaps) { // we manually generate mipmaps because glGenerateMipmap() function is not reliable on all graphics cards int lod_w = m_width; int lod_h = m_height; @@ -577,11 +631,12 @@ bool GLTexture::load_from_svg(const std::string& filename, bool use_mipmaps, boo lod_w = std::max(lod_w / 2, 1); lod_h = std::max(lod_h / 2, 1); - scale /= 2.0f; + scale_w /= 2.0f; + scale_h /= 2.0f; data.resize(lod_w * lod_h * 4); - nsvgRasterize(rast, image, 0, 0, scale, data.data(), lod_w, lod_h, lod_w * 4); + nsvgRasterizeXY(rast, image, 0, 0, scale_w, scale_h, data.data(), lod_w, lod_h, lod_w * 4); if (compression_enabled) { // initializes the texture on GPU glsafe(::glTexImage2D(GL_TEXTURE_2D, level, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, (GLsizei)lod_w, (GLsizei)lod_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0)); @@ -596,9 +651,8 @@ bool GLTexture::load_from_svg(const std::string& filename, bool use_mipmaps, boo glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, level)); glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR)); } - } else if (use_mipmaps && !OpenGLManager::use_manually_generated_mipmaps()) { - glGenerateMipmap(GL_TEXTURE_2D); - } else { + } + else { glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0)); } diff --git a/src/slic3r/GUI/GLTexture.hpp b/src/slic3r/GUI/GLTexture.hpp index c4063b93d42..b77edfeb0e2 100644 --- a/src/slic3r/GUI/GLTexture.hpp +++ b/src/slic3r/GUI/GLTexture.hpp @@ -64,8 +64,8 @@ namespace GUI { struct UV { - float u; - float v; + float u{ 0.0f }; + float v{ 0.0f }; }; struct Quad_UVs @@ -79,9 +79,9 @@ namespace GUI { static Quad_UVs FullTextureUVs; protected: - unsigned int m_id; - int m_width; - int m_height; + unsigned int m_id{ 0 }; + int m_width{ 0 }; + int m_height{ 0 }; std::string m_source; Compressor m_compressor; diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index 86827442dbd..76075e1af03 100644 --- a/src/slic3r/GUI/GLToolbar.cpp +++ b/src/slic3r/GUI/GLToolbar.cpp @@ -85,26 +85,25 @@ bool GLToolbarItem::update_enabled_state() return ret; } -void GLToolbarItem::render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const +void GLToolbarItem::render(const GLCanvas3D& parent, unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const { - auto uvs = [this](unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) -> GLTexture::Quad_UVs - { - assert((tex_width != 0) && (tex_height != 0)); + auto uvs = [this](unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) -> GLTexture::Quad_UVs { + assert(tex_width != 0 && tex_height != 0); GLTexture::Quad_UVs ret; // tiles in the texture are spaced by 1 pixel - float icon_size_px = (float)(tex_width - 1) / ((float)Num_States + (float)Num_Rendered_Highlight_States); - char render_state = (m_highlight_state == NotHighlighted ? m_state : Num_States + m_highlight_state); - float inv_tex_width = 1.0f / (float)tex_width; - float inv_tex_height = 1.0f / (float)tex_height; + const float icon_size_px = (float)(tex_width - 1) / ((float)Num_States + (float)Num_Rendered_Highlight_States); + const char render_state = (m_highlight_state == NotHighlighted ? m_state : Num_States + m_highlight_state); + const float inv_tex_width = 1.0f / (float)tex_width; + const float inv_tex_height = 1.0f / (float)tex_height; // tiles in the texture are spaced by 1 pixel - float u_offset = 1.0f * inv_tex_width; - float v_offset = 1.0f * inv_tex_height; - float du = icon_size_px * inv_tex_width; - float dv = icon_size_px * inv_tex_height; - float left = u_offset + (float)render_state * du; - float right = left + du - u_offset; - float top = v_offset + (float)m_data.sprite_id * dv; - float bottom = top + dv - v_offset; + const float u_offset = 1.0f * inv_tex_width; + const float v_offset = 1.0f * inv_tex_height; + const float du = icon_size_px * inv_tex_width; + const float dv = icon_size_px * inv_tex_height; + const float left = u_offset + (float)render_state * du; + const float right = left + du - u_offset; + const float top = v_offset + (float)m_data.sprite_id * dv; + const float bottom = top + dv - v_offset; ret.left_top = { left, top }; ret.left_bottom = { left, bottom }; ret.right_bottom = { right, bottom }; @@ -114,12 +113,19 @@ void GLToolbarItem::render(unsigned int tex_id, float left, float right, float b GLTexture::render_sub_texture(tex_id, left, right, bottom, top, uvs(tex_width, tex_height, icon_size)); - if (is_pressed()) - { - if ((m_last_action_type == Left) && m_data.left.can_render()) - m_data.left.render_callback(left, right, bottom, top); - else if ((m_last_action_type == Right) && m_data.right.can_render()) - m_data.right.render_callback(left, right, bottom, top); + if (is_pressed()) { + const Size cnv_size = parent.get_canvas_size(); + const float cnv_w = (float)cnv_size.get_width(); + const float cnv_h = (float)cnv_size.get_height(); + + const float out_left = (0.5f * left + 0.5f) * cnv_w; + const float out_right = (0.5f * right + 0.5f) * cnv_w; + const float out_top = (0.5f * top + 0.5f) * cnv_h; + const float out_bottom = (0.5f * bottom + 0.5f) * cnv_h; + if (m_last_action_type == Left && m_data.left.can_render()) + m_data.left.render_callback(out_left, out_right, out_bottom, out_top); + else if (m_last_action_type == Right && m_data.right.can_render()) + m_data.right.render_callback(out_left, out_right, out_bottom, out_top); } } @@ -185,21 +191,13 @@ bool GLToolbar::init(const BackgroundTexture::Metadata& background_texture) return res; } -bool GLToolbar::init_arrow(const BackgroundTexture::Metadata& arrow_texture) +bool GLToolbar::init_arrow(const std::string& filename) { - if (m_arrow_texture.texture.get_id() != 0) + if (m_arrow_texture.get_id() != 0) return true; - std::string path = resources_dir() + "/icons/"; - bool res = false; - - if (!arrow_texture.filename.empty()) { - res = m_arrow_texture.texture.load_from_svg_file(path + arrow_texture.filename, false, false, false, 1000); - } - if (res) - m_arrow_texture.metadata = arrow_texture; - - return res; + const std::string path = resources_dir() + "/icons/"; + return (!filename.empty()) ? m_arrow_texture.load_from_svg_file(path + filename, false, false, false, 512) : false; } GLToolbar::Layout::EType GLToolbar::get_layout_type() const @@ -434,18 +432,16 @@ void GLToolbar::render(const GLCanvas3D& parent) { default: case Layout::Horizontal: { render_horizontal(parent); break; } - case Layout::Vertical: { render_vertical(parent); break; } + case Layout::Vertical: { render_vertical(parent); break; } } } - - bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) { if (!m_enabled) return false; - Vec2d mouse_pos((double)evt.GetX(), (double)evt.GetY()); + const Vec2d mouse_pos((double)evt.GetX(), (double)evt.GetY()); bool processed = false; // mouse anywhere @@ -493,7 +489,7 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) return false; } - int item_id = contains_mouse(mouse_pos, parent); + const int item_id = contains_mouse(mouse_pos, parent); if (item_id != -1) { // mouse inside toolbar if (evt.LeftDown() || evt.LeftDClick()) { @@ -601,16 +597,12 @@ int GLToolbar::get_visible_items_cnt() const void GLToolbar::do_action(GLToolbarItem::EActionType type, int item_id, GLCanvas3D& parent, bool check_hover) { - if ((m_pressed_toggable_id == -1) || (m_pressed_toggable_id == item_id)) - { - if ((0 <= item_id) && (item_id < (int)m_items.size())) - { + if (m_pressed_toggable_id == -1 || m_pressed_toggable_id == item_id) { + if (0 <= item_id && item_id < (int)m_items.size()) { GLToolbarItem* item = m_items[item_id]; - if ((item != nullptr) && !item->is_separator() && !item->is_disabled() && (!check_hover || item->is_hovered())) - { - if (((type == GLToolbarItem::Right) && item->is_right_toggable()) || - ((type == GLToolbarItem::Left) && item->is_left_toggable())) - { + if (item != nullptr && !item->is_separator() && !item->is_disabled() && (!check_hover || item->is_hovered())) { + if ((type == GLToolbarItem::Right && item->is_right_toggable()) || + (type == GLToolbarItem::Left && item->is_left_toggable())) { GLToolbarItem::EState state = item->get_state(); if (state == GLToolbarItem::Hover) item->set_state(GLToolbarItem::HoverPressed); @@ -628,12 +620,11 @@ void GLToolbar::do_action(GLToolbarItem::EActionType type, int item_id, GLCanvas switch (type) { default: - case GLToolbarItem::Left: { item->do_left_action(); break; } + case GLToolbarItem::Left: { item->do_left_action(); break; } case GLToolbarItem::Right: { item->do_right_action(); break; } } } - else - { + else { if (m_type == Radio) select_item(item->get_name()); else @@ -648,8 +639,7 @@ void GLToolbar::do_action(GLToolbarItem::EActionType type, int item_id, GLCanvas case GLToolbarItem::Right: { item->do_right_action(); break; } } - if ((m_type == Normal) && (item->get_state() != GLToolbarItem::Disabled)) - { + if (m_type == Normal && item->get_state() != GLToolbarItem::Disabled) { // the item may get disabled during the action, if not, set it back to hover state item->set_state(GLToolbarItem::Hover); parent.render(); @@ -669,52 +659,47 @@ void GLToolbar::update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& parent) { default: case Layout::Horizontal: { update_hover_state_horizontal(mouse_pos, parent); break; } - case Layout::Vertical: { update_hover_state_vertical(mouse_pos, parent); break; } + case Layout::Vertical: { update_hover_state_vertical(mouse_pos, parent); break; } } } void GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLCanvas3D& parent) { - // NB: mouse_pos is already scaled appropriately - - float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); - float factor = m_layout.scale * inv_zoom; - - Size cnv_size = parent.get_canvas_size(); - Vec2d scaled_mouse_pos((mouse_pos(0) - 0.5 * (double)cnv_size.get_width()) * inv_zoom, (0.5 * (double)cnv_size.get_height() - mouse_pos(1)) * inv_zoom); + const Size cnv_size = parent.get_canvas_size(); + const Vec2d scaled_mouse_pos((mouse_pos.x() - 0.5 * (double)cnv_size.get_width()), (0.5 * (double)cnv_size.get_height() - mouse_pos.y())); - float scaled_icons_size = m_layout.icons_size * factor; - float scaled_separator_size = m_layout.separator_size * factor; - float scaled_gap_size = m_layout.gap_size * factor; - float scaled_border = m_layout.border * factor; + const float icons_size = m_layout.icons_size * m_layout.scale; + const float separator_size = m_layout.separator_size * m_layout.scale; + const float gap_size = m_layout.gap_size * m_layout.scale; + const float border = m_layout.border * m_layout.scale; - float separator_stride = scaled_separator_size + scaled_gap_size; - float icon_stride = scaled_icons_size + scaled_gap_size; + const float separator_stride = separator_size + gap_size; + const float icon_stride = icons_size + gap_size; - float left = m_layout.left + scaled_border; - float top = m_layout.top - scaled_border; + float left = m_layout.left + border; + float top = m_layout.top - border; - for (GLToolbarItem* item : m_items) - { + for (GLToolbarItem* item : m_items) { if (!item->is_visible()) continue; if (item->is_separator()) left += separator_stride; - else - { - float right = left + scaled_icons_size; - float bottom = top - scaled_icons_size; + else { + const float right = left + icons_size; + const float bottom = top - icons_size; - GLToolbarItem::EState state = item->get_state(); - bool inside = (left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top); + const GLToolbarItem::EState state = item->get_state(); + bool inside = (left <= (float)scaled_mouse_pos.x()) && + ((float)scaled_mouse_pos.x() <= right) && + (bottom <= (float)scaled_mouse_pos.y()) && + ((float)scaled_mouse_pos.y() <= top); switch (state) { case GLToolbarItem::Normal: { - if (inside) - { + if (inside) { item->set_state(GLToolbarItem::Hover); parent.set_as_dirty(); } @@ -723,8 +708,7 @@ void GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLCanvas3D } case GLToolbarItem::Hover: { - if (!inside) - { + if (!inside) { item->set_state(GLToolbarItem::Normal); parent.set_as_dirty(); } @@ -733,8 +717,7 @@ void GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLCanvas3D } case GLToolbarItem::Pressed: { - if (inside) - { + if (inside) { item->set_state(GLToolbarItem::HoverPressed); parent.set_as_dirty(); } @@ -743,8 +726,7 @@ void GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLCanvas3D } case GLToolbarItem::HoverPressed: { - if (!inside) - { + if (!inside) { item->set_state(GLToolbarItem::Pressed); parent.set_as_dirty(); } @@ -753,8 +735,7 @@ void GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLCanvas3D } case GLToolbarItem::Disabled: { - if (inside) - { + if (inside) { item->set_state(GLToolbarItem::HoverDisabled); parent.set_as_dirty(); } @@ -763,8 +744,7 @@ void GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLCanvas3D } case GLToolbarItem::HoverDisabled: { - if (!inside) - { + if (!inside) { item->set_state(GLToolbarItem::Disabled); parent.set_as_dirty(); } @@ -784,45 +764,41 @@ void GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLCanvas3D void GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCanvas3D& parent) { - // NB: mouse_pos is already scaled appropriately - - float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); - float factor = m_layout.scale * inv_zoom; + const Size cnv_size = parent.get_canvas_size(); + const Vec2d scaled_mouse_pos((mouse_pos.x() - 0.5 * (double)cnv_size.get_width()), (0.5 * (double)cnv_size.get_height() - mouse_pos.y())); - Size cnv_size = parent.get_canvas_size(); - Vec2d scaled_mouse_pos((mouse_pos(0) - 0.5 * (double)cnv_size.get_width()) * inv_zoom, (0.5 * (double)cnv_size.get_height() - mouse_pos(1)) * inv_zoom); + const float icons_size = m_layout.icons_size * m_layout.scale; + const float separator_size = m_layout.separator_size * m_layout.scale; + const float gap_size = m_layout.gap_size * m_layout.scale; + const float border = m_layout.border * m_layout.scale; - float scaled_icons_size = m_layout.icons_size * factor; - float scaled_separator_size = m_layout.separator_size * factor; - float scaled_gap_size = m_layout.gap_size * factor; - float scaled_border = m_layout.border * factor; - float separator_stride = scaled_separator_size + scaled_gap_size; - float icon_stride = scaled_icons_size + scaled_gap_size; + const float separator_stride = separator_size + gap_size; + const float icon_stride = icons_size + gap_size; - float left = m_layout.left + scaled_border; - float top = m_layout.top - scaled_border; + float left = m_layout.left + border; + float top = m_layout.top - border; - for (GLToolbarItem* item : m_items) - { + for (GLToolbarItem* item : m_items) { if (!item->is_visible()) continue; if (item->is_separator()) top -= separator_stride; - else - { - float right = left + scaled_icons_size; - float bottom = top - scaled_icons_size; + else { + const float right = left + icons_size; + const float bottom = top - icons_size; GLToolbarItem::EState state = item->get_state(); - bool inside = (left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top); + const bool inside = (left <= (float)scaled_mouse_pos.x()) && + ((float)scaled_mouse_pos.x() <= right) && + (bottom <= (float)scaled_mouse_pos.y()) && + ((float)scaled_mouse_pos.y() <= top); switch (state) { case GLToolbarItem::Normal: { - if (inside) - { + if (inside) { item->set_state(GLToolbarItem::Hover); parent.set_as_dirty(); } @@ -831,8 +807,7 @@ void GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCanvas3D& } case GLToolbarItem::Hover: { - if (!inside) - { + if (!inside) { item->set_state(GLToolbarItem::Normal); parent.set_as_dirty(); } @@ -841,8 +816,7 @@ void GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCanvas3D& } case GLToolbarItem::Pressed: { - if (inside) - { + if (inside) { item->set_state(GLToolbarItem::HoverPressed); parent.set_as_dirty(); } @@ -851,8 +825,7 @@ void GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCanvas3D& } case GLToolbarItem::HoverPressed: { - if (!inside) - { + if (!inside) { item->set_state(GLToolbarItem::Pressed); parent.set_as_dirty(); } @@ -861,8 +834,7 @@ void GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCanvas3D& } case GLToolbarItem::Disabled: { - if (inside) - { + if (inside) { item->set_state(GLToolbarItem::HoverDisabled); parent.set_as_dirty(); } @@ -871,8 +843,7 @@ void GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCanvas3D& } case GLToolbarItem::HoverDisabled: { - if (!inside) - { + if (!inside) { item->set_state(GLToolbarItem::Disabled); parent.set_as_dirty(); } @@ -895,12 +866,9 @@ GLToolbarItem* GLToolbar::get_item(const std::string& item_name) if (!m_enabled) return nullptr; - for (GLToolbarItem* item : m_items) - { - if (item->get_name() == item_name) - { + for (GLToolbarItem* item : m_items) { + if (item->get_name() == item_name) return item; - } } return nullptr; } @@ -914,145 +882,148 @@ int GLToolbar::contains_mouse(const Vec2d& mouse_pos, const GLCanvas3D& parent) { default: case Layout::Horizontal: { return contains_mouse_horizontal(mouse_pos, parent); } - case Layout::Vertical: { return contains_mouse_vertical(mouse_pos, parent); } + case Layout::Vertical: { return contains_mouse_vertical(mouse_pos, parent); } } } int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3D& parent) const { - // NB: mouse_pos is already scaled appropriately - - float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); - float factor = m_layout.scale * inv_zoom; + const Size cnv_size = parent.get_canvas_size(); + const Vec2d scaled_mouse_pos((mouse_pos.x() - 0.5 * (double)cnv_size.get_width()), (0.5 * (double)cnv_size.get_height() - mouse_pos.y())); - Size cnv_size = parent.get_canvas_size(); - Vec2d scaled_mouse_pos((mouse_pos(0) - 0.5 * (double)cnv_size.get_width()) * inv_zoom, (0.5 * (double)cnv_size.get_height() - mouse_pos(1)) * inv_zoom); + const float icons_size = m_layout.icons_size * m_layout.scale; + const float separator_size = m_layout.separator_size * m_layout.scale; + const float gap_size = m_layout.gap_size * m_layout.scale; + const float border = m_layout.border * m_layout.scale; - float scaled_icons_size = m_layout.icons_size * factor; - float scaled_separator_size = m_layout.separator_size * factor; - float scaled_gap_size = m_layout.gap_size * factor; - float scaled_border = m_layout.border * factor; + float left = m_layout.left + border; + const float top = m_layout.top - border; - float left = m_layout.left + scaled_border; - float top = m_layout.top - scaled_border; - - - for (size_t id=0; idis_visible()) continue; - if (item->is_separator()) - { - float right = left + scaled_separator_size; - float bottom = top - scaled_icons_size; + if (item->is_separator()) { + float right = left + separator_size; + const float bottom = top - icons_size; // mouse inside the separator - if ((left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top)) + if (left <= (float)scaled_mouse_pos.x() && + (float)scaled_mouse_pos.x() <= right && + bottom <= (float)scaled_mouse_pos.y() && + (float)scaled_mouse_pos.y() <= top) return id; left = right; - right += scaled_gap_size; + right += gap_size; - if (id < m_items.size() - 1) - { + if (id < m_items.size() - 1) { // mouse inside the gap - if ((left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top)) + if (left <= (float)scaled_mouse_pos.x() && + (float)scaled_mouse_pos.x() <= right && + bottom <= (float)scaled_mouse_pos.y() && + (float)scaled_mouse_pos.y() <= top) return -2; } left = right; } - else - { - float right = left + scaled_icons_size; - float bottom = top - scaled_icons_size; + else { + float right = left + icons_size; + const float bottom = top - icons_size; // mouse inside the icon - if ((left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top)) + if (left <= (float)scaled_mouse_pos.x() && + (float)scaled_mouse_pos.x() <= right && + bottom <= (float)scaled_mouse_pos.y() && + (float)scaled_mouse_pos.y() <= top) return id; - + left = right; - right += scaled_gap_size; + right += gap_size; - if (id < m_items.size() - 1) - { + if (id < m_items.size() - 1) { // mouse inside the gap - if ((left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top)) + if (left <= (float)scaled_mouse_pos.x() && + (float)scaled_mouse_pos.x() <= right && + bottom <= (float)scaled_mouse_pos.y() && + (float)scaled_mouse_pos.y() <= top) return -2; } left = right; } } - + return -1; } int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& parent) const { - // NB: mouse_pos is already scaled appropriately - - float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); - float factor = m_layout.scale * inv_zoom; + const Size cnv_size = parent.get_canvas_size(); + const Vec2d scaled_mouse_pos((mouse_pos.x() - 0.5 * (double)cnv_size.get_width()), (0.5 * (double)cnv_size.get_height() - mouse_pos.y())); - Size cnv_size = parent.get_canvas_size(); - Vec2d scaled_mouse_pos((mouse_pos(0) - 0.5 * (double)cnv_size.get_width()) * inv_zoom, (0.5 * (double)cnv_size.get_height() - mouse_pos(1)) * inv_zoom); + const float icons_size = m_layout.icons_size * m_layout.scale; + const float separator_size = m_layout.separator_size * m_layout.scale; + const float gap_size = m_layout.gap_size * m_layout.scale; + const float border = m_layout.border * m_layout.scale; - float scaled_icons_size = m_layout.icons_size * factor; - float scaled_separator_size = m_layout.separator_size * factor; - float scaled_gap_size = m_layout.gap_size * factor; - float scaled_border = m_layout.border * factor; + const float left = m_layout.left + border; + float top = m_layout.top - border; - float left = m_layout.left + scaled_border; - float top = m_layout.top - scaled_border; - - for (size_t id=0; idis_visible()) continue; - if (item->is_separator()) - { - float right = left + scaled_icons_size; - float bottom = top - scaled_separator_size; + if (item->is_separator()) { + const float right = left + icons_size; + float bottom = top - separator_size; // mouse inside the separator - if ((left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top)) + if (left <= (float)scaled_mouse_pos.x() && + (float)scaled_mouse_pos.x() <= right && + bottom <= (float)scaled_mouse_pos.y() && + (float)scaled_mouse_pos.y() <= top) return id; top = bottom; - bottom -= scaled_gap_size; + bottom -= gap_size; - if (id < m_items.size() - 1) - { + if (id < m_items.size() - 1) { // mouse inside the gap - if ((left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top)) + if (left <= (float)scaled_mouse_pos.x() && + (float)scaled_mouse_pos.x() <= right && + bottom <= (float)scaled_mouse_pos.y() && + (float)scaled_mouse_pos.y() <= top) return -2; } top = bottom; } - else - { - float right = left + scaled_icons_size; - float bottom = top - scaled_icons_size; + else { + const float right = left + icons_size; + float bottom = top - icons_size; // mouse inside the icon - if ((left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top)) + if (left <= (float)scaled_mouse_pos.x() && + (float)scaled_mouse_pos.x() <= right && + bottom <= (float)scaled_mouse_pos.y() && + (float)scaled_mouse_pos.y() <= top) return id; top = bottom; - bottom -= scaled_gap_size; + bottom -= gap_size; - if (id < m_items.size() - 1) - { + if (id < m_items.size() - 1) { // mouse inside the gap - if ((left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top)) + if (left <= (float)scaled_mouse_pos.x() && + (float)scaled_mouse_pos.x() <= right && + bottom <= (float)scaled_mouse_pos.y() && + (float)scaled_mouse_pos.y() <= top) return -2; } @@ -1063,33 +1034,32 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& return -1; } -void GLToolbar::render_background(float left, float top, float right, float bottom, float border) const +void GLToolbar::render_background(float left, float top, float right, float bottom, float border_w, float border_h) const { - unsigned int tex_id = m_background_texture.texture.get_id(); - float tex_width = (float)m_background_texture.texture.get_width(); - float tex_height = (float)m_background_texture.texture.get_height(); - if ((tex_id != 0) && (tex_width > 0) && (tex_height > 0)) - { - float inv_tex_width = (tex_width != 0.0f) ? 1.0f / tex_width : 0.0f; - float inv_tex_height = (tex_height != 0.0f) ? 1.0f / tex_height : 0.0f; - - float internal_left = left + border; - float internal_right = right - border; - float internal_top = top - border; - float internal_bottom = bottom + border; - - float left_uv = 0.0f; - float right_uv = 1.0f; - float top_uv = 1.0f; - float bottom_uv = 0.0f; - - float internal_left_uv = (float)m_background_texture.metadata.left * inv_tex_width; - float internal_right_uv = 1.0f - (float)m_background_texture.metadata.right * inv_tex_width; - float internal_top_uv = 1.0f - (float)m_background_texture.metadata.top * inv_tex_height; - float internal_bottom_uv = (float)m_background_texture.metadata.bottom * inv_tex_height; + const unsigned int tex_id = m_background_texture.texture.get_id(); + const float tex_width = (float)m_background_texture.texture.get_width(); + const float tex_height = (float)m_background_texture.texture.get_height(); + if (tex_id != 0 && tex_width > 0.0f && tex_height > 0.0f) { + const float inv_tex_width = 1.0f / tex_width; + const float inv_tex_height = 1.0f / tex_height; + + const float internal_left = left + border_w; + const float internal_right = right - border_w; + const float internal_top = top - border_h; + const float internal_bottom = bottom + border_w; + + const float left_uv = 0.0f; + const float right_uv = 1.0f; + const float top_uv = 1.0f; + const float bottom_uv = 0.0f; + + const float internal_left_uv = (float)m_background_texture.metadata.left * inv_tex_width; + const float internal_right_uv = 1.0f - (float)m_background_texture.metadata.right * inv_tex_width; + const float internal_top_uv = 1.0f - (float)m_background_texture.metadata.top * inv_tex_height; + const float internal_bottom_uv = (float)m_background_texture.metadata.bottom * inv_tex_height; // top-left corner - if ((m_layout.horizontal_orientation == Layout::HO_Left) || (m_layout.vertical_orientation == Layout::VO_Top)) + if (m_layout.horizontal_orientation == Layout::HO_Left || m_layout.vertical_orientation == Layout::VO_Top) GLTexture::render_sub_texture(tex_id, left, internal_left, internal_top, top, { { internal_left_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv }, { internal_right_uv, internal_top_uv }, { internal_left_uv, internal_top_uv } }); else GLTexture::render_sub_texture(tex_id, left, internal_left, internal_top, top, { { left_uv, internal_top_uv }, { internal_left_uv, internal_top_uv }, { internal_left_uv, top_uv }, { left_uv, top_uv } }); @@ -1101,7 +1071,7 @@ void GLToolbar::render_background(float left, float top, float right, float bott GLTexture::render_sub_texture(tex_id, internal_left, internal_right, internal_top, top, { { internal_left_uv, internal_top_uv }, { internal_right_uv, internal_top_uv }, { internal_right_uv, top_uv }, { internal_left_uv, top_uv } }); // top-right corner - if ((m_layout.horizontal_orientation == Layout::HO_Right) || (m_layout.vertical_orientation == Layout::VO_Top)) + if (m_layout.horizontal_orientation == Layout::HO_Right || m_layout.vertical_orientation == Layout::VO_Top) GLTexture::render_sub_texture(tex_id, internal_right, right, internal_top, top, { { internal_left_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv }, { internal_right_uv, internal_top_uv }, { internal_left_uv, internal_top_uv } }); else GLTexture::render_sub_texture(tex_id, internal_right, right, internal_top, top, { { internal_right_uv, internal_top_uv }, { right_uv, internal_top_uv }, { right_uv, top_uv }, { internal_right_uv, top_uv } }); @@ -1122,7 +1092,7 @@ void GLToolbar::render_background(float left, float top, float right, float bott GLTexture::render_sub_texture(tex_id, internal_right, right, internal_bottom, internal_top, { { internal_right_uv, internal_bottom_uv }, { right_uv, internal_bottom_uv }, { right_uv, internal_top_uv }, { internal_right_uv, internal_top_uv } }); // bottom-left corner - if ((m_layout.horizontal_orientation == Layout::HO_Left) || (m_layout.vertical_orientation == Layout::VO_Bottom)) + if (m_layout.horizontal_orientation == Layout::HO_Left || m_layout.vertical_orientation == Layout::VO_Bottom) GLTexture::render_sub_texture(tex_id, left, internal_left, bottom, internal_bottom, { { internal_left_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv }, { internal_right_uv, internal_top_uv }, { internal_left_uv, internal_top_uv } }); else GLTexture::render_sub_texture(tex_id, left, internal_left, bottom, internal_bottom, { { left_uv, bottom_uv }, { internal_left_uv, bottom_uv }, { internal_left_uv, internal_bottom_uv }, { left_uv, internal_bottom_uv } }); @@ -1134,7 +1104,7 @@ void GLToolbar::render_background(float left, float top, float right, float bott GLTexture::render_sub_texture(tex_id, internal_left, internal_right, bottom, internal_bottom, { { internal_left_uv, bottom_uv }, { internal_right_uv, bottom_uv }, { internal_right_uv, internal_bottom_uv }, { internal_left_uv, internal_bottom_uv } }); // bottom-right corner - if ((m_layout.horizontal_orientation == Layout::HO_Right) || (m_layout.vertical_orientation == Layout::VO_Bottom)) + if (m_layout.horizontal_orientation == Layout::HO_Right || m_layout.vertical_orientation == Layout::VO_Bottom) GLTexture::render_sub_texture(tex_id, internal_right, right, bottom, internal_bottom, { { internal_left_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv }, { internal_right_uv, internal_top_uv }, { internal_left_uv, internal_top_uv } }); else GLTexture::render_sub_texture(tex_id, internal_right, right, bottom, internal_bottom, { { internal_right_uv, bottom_uv }, { right_uv, bottom_uv }, { right_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv } }); @@ -1144,22 +1114,31 @@ void GLToolbar::render_background(float left, float top, float right, float bott void GLToolbar::render_arrow(const GLCanvas3D& parent, GLToolbarItem* highlighted_item) { // arrow texture not initialized - if (m_arrow_texture.texture.get_id() == 0) + if (m_arrow_texture.get_id() == 0) return; - float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); - float factor = inv_zoom * m_layout.scale; + const Size cnv_size = parent.get_canvas_size(); + const float cnv_w = (float)cnv_size.get_width(); + const float cnv_h = (float)cnv_size.get_height(); + + if (cnv_w == 0 || cnv_h == 0) + return; - float scaled_icons_size = m_layout.icons_size * factor; - float scaled_separator_size = m_layout.separator_size * factor; - float scaled_gap_size = m_layout.gap_size * factor; - float border = m_layout.border * factor; + const float inv_cnv_w = 1.0f / cnv_w; + const float inv_cnv_h = 1.0f / cnv_h; - float separator_stride = scaled_separator_size + scaled_gap_size; - float icon_stride = scaled_icons_size + scaled_gap_size; + const float icons_size_x = 2.0f * m_layout.icons_size * m_layout.scale * inv_cnv_w; + const float icons_size_y = 2.0f * m_layout.icons_size * m_layout.scale * inv_cnv_h; + const float separator_size = 2.0f * m_layout.separator_size * m_layout.scale * inv_cnv_w; + const float gap_size = 2.0f * m_layout.gap_size * m_layout.scale * inv_cnv_w; + const float border_x = 2.0f * m_layout.border * m_layout.scale * inv_cnv_w; + const float border_y = 2.0f * m_layout.border * m_layout.scale * inv_cnv_h; - float left = m_layout.left; - float top = m_layout.top - icon_stride; + const float separator_stride = separator_size + gap_size; + const float icon_stride = icons_size_x + gap_size; + + float left = 2.0f * m_layout.left * inv_cnv_w + border_x; + float top = 2.0f * m_layout.top * inv_cnv_h - 2.0f * border_y - icons_size_y; bool found = false; for (const GLToolbarItem* item : m_items) { @@ -1168,7 +1147,7 @@ void GLToolbar::render_arrow(const GLCanvas3D& parent, GLToolbarItem* highlighte if (item->is_separator()) left += separator_stride; - else { + else { if (item->get_name() == highlighted_item->get_name()) { found = true; break; @@ -1179,77 +1158,78 @@ void GLToolbar::render_arrow(const GLCanvas3D& parent, GLToolbarItem* highlighte if (!found) return; - left += border; - top -= separator_stride; - float right = left + scaled_icons_size; + const float right = left + icons_size_x; - unsigned int tex_id = m_arrow_texture.texture.get_id(); + const unsigned int tex_id = m_arrow_texture.get_id(); // arrow width and height - float arr_tex_width = (float)m_arrow_texture.texture.get_width(); - float arr_tex_height = (float)m_arrow_texture.texture.get_height(); - if ((tex_id != 0) && (arr_tex_width > 0) && (arr_tex_height > 0)) { - float inv_tex_width = (arr_tex_width != 0.0f) ? 1.0f / arr_tex_width : 0.0f; - float inv_tex_height = (arr_tex_height != 0.0f) ? 1.0f / arr_tex_height : 0.0f; - - float internal_left = left + border - scaled_icons_size * 1.5f; // add scaled_icons_size for huge arrow - float internal_right = right - border + scaled_icons_size * 1.5f; - float internal_top = top - border; - // bottom is not moving and should be calculated from arrow texture sides ratio - float arrow_sides_ratio = (float)m_arrow_texture.texture.get_height() / (float)m_arrow_texture.texture.get_width(); - float internal_bottom = internal_top - (internal_right - internal_left) * arrow_sides_ratio ; - - float internal_left_uv = (float)m_arrow_texture.metadata.left * inv_tex_width; - float internal_right_uv = 1.0f - (float)m_arrow_texture.metadata.right * inv_tex_width; - float internal_top_uv = 1.0f - (float)m_arrow_texture.metadata.top * inv_tex_height; - float internal_bottom_uv = (float)m_arrow_texture.metadata.bottom * inv_tex_height; - - GLTexture::render_sub_texture(tex_id, internal_left, internal_right, internal_bottom, internal_top, { { internal_left_uv, internal_top_uv }, { internal_right_uv, internal_top_uv }, { internal_right_uv, internal_bottom_uv }, { internal_left_uv, internal_bottom_uv } }); + const float arr_tex_width = (float)m_arrow_texture.get_width(); + const float arr_tex_height = (float)m_arrow_texture.get_height(); + if (tex_id != 0 && arr_tex_width > 0.0f && arr_tex_height > 0.0f) { + const float arrow_size_x = 2.0f * m_layout.scale * arr_tex_width * inv_cnv_w; + const float arrow_size_y = 2.0f * m_layout.scale * arr_tex_height * inv_cnv_h; + + const float left_uv = 0.0f; + const float right_uv = 1.0f; + const float top_uv = 1.0f; + const float bottom_uv = 0.0f; + + top -= border_y; + const float bottom = top - arrow_size_y * icons_size_x / arrow_size_x; + + GLTexture::render_sub_texture(tex_id, left, right, bottom, top, { { left_uv, top_uv }, { right_uv, top_uv }, { right_uv, bottom_uv }, { left_uv, bottom_uv } }); } } void GLToolbar::render_horizontal(const GLCanvas3D& parent) { - unsigned int tex_id = m_icons_texture.get_id(); - int tex_width = m_icons_texture.get_width(); - int tex_height = m_icons_texture.get_height(); + const Size cnv_size = parent.get_canvas_size(); + const float cnv_w = (float)cnv_size.get_width(); + const float cnv_h = (float)cnv_size.get_height(); - float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); - float factor = inv_zoom * m_layout.scale; + if (cnv_w == 0 || cnv_h == 0) + return; - float scaled_icons_size = m_layout.icons_size * factor; - float scaled_separator_size = m_layout.separator_size * factor; - float scaled_gap_size = m_layout.gap_size * factor; - float scaled_border = m_layout.border * factor; - float scaled_width = get_width() * inv_zoom; - float scaled_height = get_height() * inv_zoom; + const unsigned int tex_id = m_icons_texture.get_id(); + const int tex_width = m_icons_texture.get_width(); + const int tex_height = m_icons_texture.get_height(); - float separator_stride = scaled_separator_size + scaled_gap_size; - float icon_stride = scaled_icons_size + scaled_gap_size; + if (tex_id == 0 || tex_width <= 0 || tex_height <= 0) + return; - float left = m_layout.left; - float top = m_layout.top; - float right = left + scaled_width; - float bottom = top - scaled_height; + const float inv_cnv_w = 1.0f / cnv_w; + const float inv_cnv_h = 1.0f / cnv_h; - render_background(left, top, right, bottom, scaled_border); + const float icons_size_x = 2.0f * m_layout.icons_size * m_layout.scale * inv_cnv_w; + const float icons_size_y = 2.0f * m_layout.icons_size * m_layout.scale * inv_cnv_h; + const float separator_size = 2.0f * m_layout.separator_size * m_layout.scale * inv_cnv_w; + const float gap_size = 2.0f * m_layout.gap_size * m_layout.scale * inv_cnv_w; + const float border_w = 2.0f * m_layout.border * m_layout.scale * inv_cnv_w; + const float border_h = 2.0f * m_layout.border * m_layout.scale * inv_cnv_h; + const float width = 2.0f * get_width() * inv_cnv_w; + const float height = 2.0f * get_height() * inv_cnv_h; - left += scaled_border; - top -= scaled_border; + const float separator_stride = separator_size + gap_size; + const float icon_stride = icons_size_x + gap_size; - if ((tex_id == 0) || (tex_width <= 0) || (tex_height <= 0)) - return; + float left = 2.0f * m_layout.left * inv_cnv_w; + float top = 2.0f * m_layout.top * inv_cnv_h; + const float right = left + width; + const float bottom = top - height; + + render_background(left, top, right, bottom, border_w, border_h); + + left += border_w; + top -= border_h; // renders icons - for (const GLToolbarItem* item : m_items) - { + for (const GLToolbarItem* item : m_items) { if (!item->is_visible()) continue; if (item->is_separator()) left += separator_stride; - else - { - item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_width, (unsigned int)tex_height, (unsigned int)(m_layout.icons_size * m_layout.scale)); + else { + item->render(parent, tex_id, left, left + icons_size_x, top - icons_size_y, top, (unsigned int)tex_width, (unsigned int)tex_height, (unsigned int)(m_layout.icons_size * m_layout.scale)); left += icon_stride; } } @@ -1257,35 +1237,44 @@ void GLToolbar::render_horizontal(const GLCanvas3D& parent) void GLToolbar::render_vertical(const GLCanvas3D& parent) { - unsigned int tex_id = m_icons_texture.get_id(); - int tex_width = m_icons_texture.get_width(); - int tex_height = m_icons_texture.get_height(); + const Size cnv_size = parent.get_canvas_size(); + const float cnv_w = (float)cnv_size.get_width(); + const float cnv_h = (float)cnv_size.get_height(); - float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); - float factor = inv_zoom * m_layout.scale; + if (cnv_w == 0 || cnv_h == 0) + return; - float scaled_icons_size = m_layout.icons_size * factor; - float scaled_separator_size = m_layout.separator_size * factor; - float scaled_gap_size = m_layout.gap_size * factor; - float scaled_border = m_layout.border * factor; - float scaled_width = get_width() * inv_zoom; - float scaled_height = get_height() * inv_zoom; + const unsigned int tex_id = m_icons_texture.get_id(); + const int tex_width = m_icons_texture.get_width(); + const int tex_height = m_icons_texture.get_height(); - float separator_stride = scaled_separator_size + scaled_gap_size; - float icon_stride = scaled_icons_size + scaled_gap_size; + if (tex_id == 0 || tex_width <= 0 || tex_height <= 0) + return; - float left = m_layout.left; - float top = m_layout.top; - float right = left + scaled_width; - float bottom = top - scaled_height; + const float inv_cnv_w = 1.0f / cnv_w; + const float inv_cnv_h = 1.0f / cnv_h; - render_background(left, top, right, bottom, scaled_border); + const float icons_size_x = 2.0f * m_layout.icons_size * m_layout.scale * inv_cnv_w; + const float icons_size_y = 2.0f * m_layout.icons_size * m_layout.scale * inv_cnv_h; + const float separator_size = 2.0f * m_layout.separator_size * m_layout.scale * inv_cnv_h; + const float gap_size = 2.0f * m_layout.gap_size * m_layout.scale * inv_cnv_h; + const float border_w = 2.0f * m_layout.border * m_layout.scale * inv_cnv_w; + const float border_h = 2.0f * m_layout.border * m_layout.scale * inv_cnv_h; + const float width = 2.0f * get_width() * inv_cnv_w; + const float height = 2.0f * get_height() * inv_cnv_h; - left += scaled_border; - top -= scaled_border; + const float separator_stride = separator_size + gap_size; + const float icon_stride = icons_size_y + gap_size; - if (tex_id == 0 || tex_width <= 0 || tex_height <= 0) - return; + float left = 2.0f * m_layout.left * inv_cnv_w; + float top = 2.0f * m_layout.top * inv_cnv_h; + const float right = left + width; + const float bottom = top - height; + + render_background(left, top, right, bottom, border_w, border_h); + + left += border_w; + top -= border_h; // renders icons for (const GLToolbarItem* item : m_items) { @@ -1295,7 +1284,7 @@ void GLToolbar::render_vertical(const GLCanvas3D& parent) if (item->is_separator()) top -= separator_stride; else { - item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_width, (unsigned int)tex_height, (unsigned int)(m_layout.icons_size * m_layout.scale)); + item->render(parent, tex_id, left, left + icons_size_x, top - icons_size_y, top, (unsigned int)tex_width, (unsigned int)tex_height, (unsigned int)(m_layout.icons_size * m_layout.scale)); top -= icon_stride; } } diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp index 5740db3e6cc..6961827ce8a 100644 --- a/src/slic3r/GUI/GLToolbar.hpp +++ b/src/slic3r/GUI/GLToolbar.hpp @@ -153,7 +153,8 @@ class GLToolbarItem // returns true if the state changes bool update_enabled_state(); - void render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const; + void render(const GLCanvas3D& parent, unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const; + private: void set_visible(bool visible) { m_data.visible = visible; } @@ -246,7 +247,7 @@ class GLToolbar GLTexture m_icons_texture; bool m_icons_texture_dirty; BackgroundTexture m_background_texture; - BackgroundTexture m_arrow_texture; + GLTexture m_arrow_texture; Layout m_layout; ItemsList m_items; @@ -273,7 +274,7 @@ class GLToolbar bool init(const BackgroundTexture::Metadata& background_texture); - bool init_arrow(const BackgroundTexture::Metadata& arrow_texture); + bool init_arrow(const std::string& filename); Layout::EType get_layout_type() const; void set_layout_type(Layout::EType type); @@ -344,7 +345,7 @@ class GLToolbar int contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3D& parent) const; int contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& parent) const; - void render_background(float left, float top, float right, float bottom, float border) const; + void render_background(float left, float top, float right, float bottom, float border_w, float border_h) const; void render_horizontal(const GLCanvas3D& parent); void render_vertical(const GLCanvas3D& parent); diff --git a/src/slic3r/GUI/GUI.cpp b/src/slic3r/GUI/GUI.cpp index a0b674e27e4..beee256004c 100644 --- a/src/slic3r/GUI/GUI.cpp +++ b/src/slic3r/GUI/GUI.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #if __APPLE__ #import @@ -129,6 +130,18 @@ void change_opt_value(DynamicPrintConfig& config, const t_config_option_key& opt val = boost::any_cast(value); break; } + case coFloatsOrPercents:{ + std::string str = boost::any_cast(value); + bool percent = false; + if (str.back() == '%') { + str.pop_back(); + percent = true; + } + double val = std::stod(str); // locale-dependent (on purpose - the input is the actual content of the field) + ConfigOptionFloatsOrPercents* vec_new = new ConfigOptionFloatsOrPercents({ {val, percent} }); + config.option(opt_key)->set_at(vec_new, opt_index, opt_index); + break; + } case coPercents:{ ConfigOptionPercents* vec_new = new ConfigOptionPercents{ boost::any_cast(value) }; config.option(opt_key)->set_at(vec_new, opt_index, opt_index); @@ -267,33 +280,11 @@ static void add_config_substitutions(const ConfigSubstitutions& conf_substitutio switch (def->type) { case coEnum: { - const std::vector& labels = def->enum_labels; - const std::vector& values = def->enum_values; - int val = conf_substitution.new_value->getInt(); - - bool is_infill = def->opt_key == "top_fill_pattern" || - def->opt_key == "bottom_fill_pattern" || - def->opt_key == "fill_pattern"; - - // Each infill doesn't use all list of infill declared in PrintConfig.hpp. - // So we should "convert" val to the correct one - if (is_infill) { - for (const auto& key_val : *def->enum_keys_map) - if ((int)key_val.second == val) { - auto it = std::find(values.begin(), values.end(), key_val.first); - if (it == values.end()) - break; - auto idx = it - values.begin(); - new_val = wxString("\"") + values[idx] + "\"" + " (" + from_u8(_utf8(labels[idx])) + ")"; - break; - } - if (new_val.IsEmpty()) { - assert(false); - new_val = _L("Undefined"); - } - } - else - new_val = wxString("\"") + values[val] + "\"" + " (" + from_u8(_utf8(labels[val])) + ")"; + auto opt = def->enum_def->enum_to_index(conf_substitution.new_value->getInt()); + new_val = opt.has_value() ? + wxString("\"") + def->enum_def->value(*opt) + "\"" + " (" + + _(from_u8(def->enum_def->label(*opt))) + ")" : + _L("Undefined"); break; } case coBool: @@ -476,50 +467,132 @@ void about() void desktop_open_datadir_folder() { - // Execute command to open a file explorer, platform dependent. - // FIXME: The const_casts aren't needed in wxWidgets 3.1, remove them when we upgrade. + boost::filesystem::path path(data_dir()); + desktop_open_folder(std::move(path)); +} - const auto path = data_dir(); +void desktop_open_folder(const boost::filesystem::path& path) +{ + if (!boost::filesystem::is_directory(path)) + return; + + // Execute command to open a file explorer, platform dependent. #ifdef _WIN32 - const wxString widepath = from_u8(path); - const wchar_t *argv[] = { L"explorer", widepath.GetData(), nullptr }; - ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr); + const wxString widepath = path.wstring(); + const wchar_t* argv[] = { L"explorer", widepath.GetData(), nullptr }; + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr); #elif __APPLE__ - const char *argv[] = { "open", path.data(), nullptr }; - ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr); + const char* argv[] = { "open", path.string().c_str(), nullptr }; + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr); #else - const char *argv[] = { "xdg-open", path.data(), nullptr }; - - // Check if we're running in an AppImage container, if so, we need to remove AppImage's env vars, - // because they may mess up the environment expected by the file manager. - // Mostly this is about LD_LIBRARY_PATH, but we remove a few more too for good measure. - if (wxGetEnv("APPIMAGE", nullptr)) { - // We're running from AppImage - wxEnvVariableHashMap env_vars; - wxGetEnvMap(&env_vars); - - env_vars.erase("APPIMAGE"); - env_vars.erase("APPDIR"); - env_vars.erase("LD_LIBRARY_PATH"); - env_vars.erase("LD_PRELOAD"); - env_vars.erase("UNION_PRELOAD"); - - wxExecuteEnv exec_env; - exec_env.env = std::move(env_vars); - - wxString owd; - if (wxGetEnv("OWD", &owd)) { - // This is the original work directory from which the AppImage image was run, - // set it as CWD for the child process: - exec_env.cwd = std::move(owd); - } + const char* argv[] = { "xdg-open", path.string().c_str(), nullptr }; + desktop_execute(argv); +#endif +} - ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr, &exec_env); - } else { - // Looks like we're NOT running from AppImage, we'll make no changes to the environment. - ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr, nullptr); +#ifdef __linux__ +namespace { +wxExecuteEnv get_appimage_exec_env() +{ + // If we're running in an AppImage container, we need to remove AppImage's env vars, + // because they may mess up the environment expected by the file manager. + // Mostly this is about LD_LIBRARY_PATH, but we remove a few more too for good measure. + wxEnvVariableHashMap env_vars; + wxGetEnvMap(&env_vars); + + env_vars.erase("APPIMAGE"); + env_vars.erase("APPDIR"); + env_vars.erase("LD_LIBRARY_PATH"); + env_vars.erase("LD_PRELOAD"); + env_vars.erase("UNION_PRELOAD"); + + wxExecuteEnv exec_env; + exec_env.env = std::move(env_vars); + + wxString owd; + if (wxGetEnv("OWD", &owd)) { + // This is the original work directory from which the AppImage image was run, + // set it as CWD for the child process: + exec_env.cwd = std::move(owd); + } + return exec_env; +} +} // namespace +void desktop_execute(const char* argv[]) +{ + // Check if we're running in an AppImage container, if so, we need to remove AppImage's env vars, + // because they may mess up the environment expected by the file manager. + // Mostly this is about LD_LIBRARY_PATH, but we remove a few more too for good measure. + if (wxGetEnv("APPIMAGE", nullptr)) { + // We're running from AppImage + wxExecuteEnv exec_env = get_appimage_exec_env(); + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr, &exec_env); + } + else { + // Looks like we're NOT running from AppImage, we'll make no changes to the environment. + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr, nullptr); + } +} +void desktop_execute_get_result(wxString command, wxArrayString& output) +{ + output.Clear(); + //Check if we're running in an AppImage container, if so, we need to remove AppImage's env vars, + // because they may mess up the environment expected by the file manager. + // Mostly this is about LD_LIBRARY_PATH, but we remove a few more too for good measure. + if (wxGetEnv("APPIMAGE", nullptr)) { + // We're running from AppImage + wxExecuteEnv exec_env = get_appimage_exec_env(); + ::wxExecute(command, output, wxEXEC_SYNC | wxEXEC_NOEVENTS, &exec_env); + } else { + // Looks like we're NOT running from AppImage, we'll make no changes to the environment. + ::wxExecute(command, output, wxEXEC_SYNC | wxEXEC_NOEVENTS); + } +} +#endif // __linux__ + +#ifdef _WIN32 +bool create_process(const boost::filesystem::path& path, const std::wstring& cmd_opt, std::string& error_msg) +{ + // find updater exe + if (boost::filesystem::exists(path)) { + // Using quoted string as mentioned in CreateProcessW docs. + std::wstring wcmd = L"\"" + path.wstring() + L"\""; + if (!cmd_opt.empty()) + wcmd += L" " + cmd_opt; + + // additional information + STARTUPINFOW si; + PROCESS_INFORMATION pi; + + // set the size of the structures + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + ZeroMemory(&pi, sizeof(pi)); + + // start the program up + if (CreateProcessW(NULL, // the path + wcmd.data(), // Command line + NULL, // Process handle not inheritable + NULL, // Thread handle not inheritable + FALSE, // Set handle inheritance to FALSE + 0, // No creation flags + NULL, // Use parent's environment block + NULL, // Use parent's starting directory + &si, // Pointer to STARTUPINFO structure + &pi // Pointer to PROCESS_INFORMATION structure (removed extra parentheses) + )) { + // Close process and thread handles. + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + return true; } -#endif + else + error_msg = "CreateProcessW failed to create process " + boost::nowide::narrow(path.wstring()); + } + else + error_msg = "Executable doesn't exists. Path: " + boost::nowide::narrow(path.wstring()); + return false; } +#endif //_WIN32 -} } +} } // namespaces GUI / Slic3r diff --git a/src/slic3r/GUI/GUI.hpp b/src/slic3r/GUI/GUI.hpp index 20c88287858..cb7cf54874f 100644 --- a/src/slic3r/GUI/GUI.hpp +++ b/src/slic3r/GUI/GUI.hpp @@ -13,6 +13,7 @@ class wxWindow; class wxMenuBar; class wxComboCtrl; class wxFileDialog; +class wxArrayString; class wxTopLevelWindow; namespace Slic3r { @@ -80,6 +81,24 @@ boost::filesystem::path into_path(const wxString &str); extern void about(); // Ask the destop to open the datadir using the default file explorer. extern void desktop_open_datadir_folder(); +// Ask the destop to open the directory specified by path using the default file explorer. +void desktop_open_folder(const boost::filesystem::path& path); + +#ifdef __linux__ +// Calling wxExecute on Linux with proper handling of AppImage's env vars. +// argv example: { "xdg-open", path.c_str(), nullptr } +void desktop_execute(const char* argv[]); +void desktop_execute_get_result(wxString command, wxArrayString& output); +#endif // __linux__ + +#ifdef _WIN32 +// Call CreateProcessW to start external proccess on path +// returns true on success +// path should contain path to the process +// cmd_opt can be empty or contain command line options. Example: L"/silent" +// error_msg will contain error message if create_process return false +bool create_process(const boost::filesystem::path& path, const std::wstring& cmd_opt, std::string& error_msg); +#endif //_WIN32 } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 0aeebc74ddd..e03df09bb13 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -5,7 +5,15 @@ #include "GUI_ObjectManipulation.hpp" #include "GUI_Factories.hpp" #include "format.hpp" -#include "I18N.hpp" + +// Localization headers: include libslic3r version first so everything in this file +// uses the slic3r/GUI version (the macros will take precedence over the functions). +// Also, there is a check that the former is not included from slic3r module. +// This is the only place where we want to allow that, so define an override macro. +#define SLIC3R_ALLOW_LIBSLIC3R_I18N_IN_SLIC3R +#include "libslic3r/I18N.hpp" +#undef SLIC3R_ALLOW_LIBSLIC3R_I18N_IN_SLIC3R +#include "slic3r/GUI/I18N.hpp" #include #include @@ -13,12 +21,14 @@ #include #include #include +#include #include #include #include #include #include #include +#include #include #include @@ -42,8 +52,8 @@ #include "libslic3r/Utils.hpp" #include "libslic3r/Model.hpp" -#include "libslic3r/I18N.hpp" #include "libslic3r/PresetBundle.hpp" +#include "libslic3r/Color.hpp" #include "GUI.hpp" #include "GUI_Utils.hpp" @@ -56,6 +66,8 @@ #include "../Utils/PrintHost.hpp" #include "../Utils/Process.hpp" #include "../Utils/MacDarkMode.hpp" +#include "../Utils/AppUpdater.hpp" +#include "../Utils/WinRegistry.hpp" #include "slic3r/Config/Snapshot.hpp" #include "ConfigSnapshotDialog.hpp" #include "FirmwareDialog.hpp" @@ -73,6 +85,7 @@ #include "PrintHostDialogs.hpp" #include "DesktopIntegrationDialog.hpp" #include "SendSystemInfoDialog.hpp" +#include "Downloader.hpp" #include "BitmapCache.hpp" #include "Notebook.hpp" @@ -119,15 +132,18 @@ class SplashScreen : public wxSplashScreen { wxASSERT(bitmap.IsOk()); - int init_dpi = get_dpi_for_window(this); +// int init_dpi = get_dpi_for_window(this); this->SetPosition(pos); + // The size of the SplashScreen can be hanged after its moving to another display + // So, update it from a bitmap size + this->SetClientSize(bitmap.GetWidth(), bitmap.GetHeight()); this->CenterOnScreen(); - int new_dpi = get_dpi_for_window(this); +// int new_dpi = get_dpi_for_window(this); - m_scale = (float)(new_dpi) / (float)(init_dpi); +// m_scale = (float)(new_dpi) / (float)(init_dpi); m_main_bitmap = bitmap; - scale_bitmap(m_main_bitmap, m_scale); +// scale_bitmap(m_main_bitmap, m_scale); // init constant texts and scale fonts init_constant_text(); @@ -262,12 +278,12 @@ class SplashScreen : public wxSplashScreen version = _L("Version") + " " + std::string(SLIC3R_VERSION); // credits infornation - credits = title + " " + - _L("is based on Slic3r by Alessandro Ranellucci and the RepRap community.") + "\n" + - _L("Developed by Prusa Research.")+ "\n\n" + - title + " " + _L("is licensed under the") + " " + _L("GNU Affero General Public License, version 3") + ".\n\n" + - _L("Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others.") + "\n\n" + - _L("Artwork model by Leslie Ing") + "." ; + credits = title + " " + + _L("is based on Slic3r by Alessandro Ranellucci and the RepRap community.") + "\n" + + _L("Developed by Prusa Research.") + "\n\n" + + title + " " + _L("is licensed under the") + " " + _L("GNU Affero General Public License, version 3") + ".\n\n" + + _L("Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others.") + "\n\n" + + _L("Artwork model by Creative Tools"); title_font = version_font = credits_font = init_font; } @@ -327,7 +343,7 @@ class SplashScreen : public wxSplashScreen // See https://github.com/wxWidgets/wxWidgets/blob/master/src/msw/font.cpp // void wxNativeFontInfo::SetFractionalPointSize(float pointSizeNew) wxNativeFontInfo nfi= *font.GetNativeFontInfo(); - float pointSizeNew = scale * font.GetPointSize(); + float pointSizeNew = wxDisplay(this).GetScaleFactor() * scale * font.GetPointSize(); nfi.lf.lfHeight = nfi.GetLogFontHeightAtPPI(pointSizeNew, get_dpi_for_window(this)); nfi.pointSize = pointSizeNew; font = wxFont(nfi); @@ -429,65 +445,40 @@ bool static check_old_linux_datadir(const wxString& app_name) { } #endif - #ifdef _WIN32 +#if 0 // External Updater is replaced with AppUpdater.cpp static bool run_updater_win() { // find updater exe boost::filesystem::path path_updater = boost::dll::program_location().parent_path() / "prusaslicer-updater.exe"; - if (boost::filesystem::exists(path_updater)) { - // run updater. Original args: /silent -restartapp prusa-slicer.exe -startappfirst - - // Using quoted string as mentioned in CreateProcessW docs, silent execution parameter. - std::wstring wcmd = L"\"" + path_updater.wstring() + L"\" /silent"; - - // additional information - STARTUPINFOW si; - PROCESS_INFORMATION pi; - - // set the size of the structures - ZeroMemory(&si, sizeof(si)); - si.cb = sizeof(si); - ZeroMemory(&pi, sizeof(pi)); - - // start the program up - if (CreateProcessW(NULL, // the path - wcmd.data(), // Command line - NULL, // Process handle not inheritable - NULL, // Thread handle not inheritable - FALSE, // Set handle inheritance to FALSE - 0, // No creation flags - NULL, // Use parent's environment block - NULL, // Use parent's starting directory - &si, // Pointer to STARTUPINFO structure - &pi // Pointer to PROCESS_INFORMATION structure (removed extra parentheses) - )) { - // Close process and thread handles. - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - return true; - } else { - BOOST_LOG_TRIVIAL(error) << "Failed to start prusaslicer-updater.exe with command " << wcmd; - } - } - return false; + // run updater. Original args: /silent -restartapp prusa-slicer.exe -startappfirst + std::string msg; + bool res = create_process(path_updater, L"/silent", msg); + if (!res) + BOOST_LOG_TRIVIAL(error) << msg; + return res; } -#endif //_WIN32 +#endif // 0 +#endif // _WIN32 struct FileWildcards { std::string_view title; std::vector file_extensions; }; + + static const FileWildcards file_wildcards_by_type[FT_SIZE] = { /* FT_STL */ { "STL files"sv, { ".stl"sv } }, /* FT_OBJ */ { "OBJ files"sv, { ".obj"sv } }, - /* FT_STEP */ { "STEP files"sv, { ".stp"sv, ".step"sv } }, + /* FT_OBJECT */ { "Object files"sv, { ".stl"sv, ".obj"sv } }, + /* FT_STEP */ { "STEP files"sv, { ".stp"sv, ".step"sv } }, /* FT_AMF */ { "AMF files"sv, { ".amf"sv, ".zip.amf"sv, ".xml"sv } }, /* FT_3MF */ { "3MF files"sv, { ".3mf"sv } }, /* FT_GCODE */ { "G-code files"sv, { ".gcode"sv, ".gco"sv, ".g"sv, ".ngc"sv } }, /* FT_MODEL */ { "Known files"sv, { ".stl"sv, ".obj"sv, ".3mf"sv, ".amf"sv, ".zip.amf"sv, ".xml"sv, ".step"sv, ".stp"sv } }, /* FT_PROJECT */ { "Project files"sv, { ".3mf"sv, ".amf"sv, ".zip.amf"sv } }, + /* FT_FONTS */ { "Font files"sv, { ".ttc"sv, ".ttf"sv } }, /* FT_GALLERY */ { "Known files"sv, { ".stl"sv, ".obj"sv } }, /* FT_INI */ { "INI files"sv, { ".ini"sv } }, @@ -495,9 +486,49 @@ static const FileWildcards file_wildcards_by_type[FT_SIZE] = { /* FT_TEX */ { "Texture"sv, { ".png"sv, ".svg"sv } }, - /* FT_SL1 */ { "Masked SLA files"sv, { ".sl1"sv, ".sl1s"sv } }, + /* FT_SL1 */ { "Masked SLA files"sv, { ".sl1"sv, ".sl1s"sv, ".pwmx"sv } }, + + /* FT_ZIP */ { "Zip files"sv, { ".zip"sv } }, }; +#if ENABLE_ALTERNATIVE_FILE_WILDCARDS_GENERATOR +wxString file_wildcards(FileType file_type) +{ + const FileWildcards& data = file_wildcards_by_type[file_type]; + std::string title; + std::string mask; + + // Generate cumulative first item + for (const std::string_view& ext : data.file_extensions) { + if (title.empty()) { + title = "*"; + title += ext; + mask = title; + } + else { + title += ", *"; + title += ext; + mask += ";*"; + mask += ext; + } + mask += ";*"; + mask += boost::to_upper_copy(std::string(ext)); + } + + wxString ret = GUI::format_wxstr("%s (%s)|%s", data.title, title, mask); + + // Adds an item for each of the extensions + if (data.file_extensions.size() > 1) { + for (const std::string_view& ext : data.file_extensions) { + title = "*"; + title += ext; + ret += GUI::format_wxstr("|%s (%s)|%s", data.title, title, title); + } + } + + return ret; +} +#else // This function produces a Win32 file dialog file template mask to be consumed by wxWidgets on all platforms. // The function accepts a custom extension parameter. If the parameter is provided, the custom extension // will be added as a fist to the list. This is important for a "file save" dialog on OSX, which strips @@ -550,8 +581,10 @@ wxString file_wildcards(FileType file_type, const std::string &custom_extension) mask += ";*"; mask += boost::to_upper_copy(std::string(ext)); } + return GUI::format_wxstr("%s (%s)|%s", data.title, title, mask); } +#endif // ENABLE_ALTERNATIVE_FILE_WILDCARDS_GENERATOR static std::string libslic3r_translate_callback(const char *s) { return wxGetTranslation(wxString(s, wxConvUTF8)).utf8_str().data(); } @@ -727,7 +760,9 @@ void GUI_App::post_init() if (! this->init_params->input_files.empty()) this->plater()->load_gcode(wxString::FromUTF8(this->init_params->input_files[0].c_str())); } - else { + else if (this->init_params->start_downloader) { + start_download(this->init_params->download_url); + } else { if (! this->init_params->preset_substitutions.empty()) show_substitutions_info(this->init_params->preset_substitutions); @@ -746,8 +781,15 @@ void GUI_App::post_init() this->mainframe->load_config_file(this->init_params->load_configs.back()); // If loading a 3MF file, the config is loaded from the last one. if (!this->init_params->input_files.empty()) { +#if 1 // #ysFIXME_delete_after_test_of + wxArrayString fns; + for (const std::string& name : this->init_params->input_files) + fns.Add(from_u8(name)); + if (plater()->load_files(fns) && this->init_params->input_files.size() == 1) { +#else const std::vector res = this->plater()->load_files(this->init_params->input_files, true, true); if (!res.empty() && this->init_params->input_files.size() == 1) { +#endif // Update application titlebar when opening a project file const std::string& filename = this->init_params->input_files.front(); if (boost::algorithm::iends_with(filename, ".amf") || @@ -755,13 +797,22 @@ void GUI_App::post_init() boost::algorithm::iends_with(filename, ".3mf")) this->plater()->set_project_filename(from_u8(filename)); } + if (this->init_params->delete_after_load) { + for (const std::string& p : this->init_params->input_files) { + boost::system::error_code ec; + boost::filesystem::remove(boost::filesystem::path(p), ec); + if (ec) { + BOOST_LOG_TRIVIAL(error) << ec.message(); + } + } + } } if (! this->init_params->extra_config.empty()) this->mainframe->load_config(this->init_params->extra_config); } // show "Did you know" notification - if (app_config->get("show_hints") == "1" && ! is_gcode_viewer()) + if (app_config->get_bool("show_hints") && ! is_gcode_viewer()) plater_->get_notification_manager()->push_hint_notification(true); // The extra CallAfter() is needed because of Mac, where this is the only way @@ -773,26 +824,22 @@ void GUI_App::post_init() // Configuration is not compatible and reconfigure was refused by the user. Application is closing. return; CallAfter([this] { + // preset_updater->sync downloads profile updates on background so it must begin after config wizard finished. bool cw_showed = this->config_wizard_startup(); this->preset_updater->sync(preset_bundle); if (! cw_showed) { // The CallAfter is needed as well, without it, GL extensions did not show. // Also, we only want to show this when the wizard does not, so the new user // sees something else than "we want something" on the first start. - show_send_system_info_dialog_if_needed(); - } - #ifdef _WIN32 - // Run external updater on Windows if version check is enabled. - if (this->preset_updater->version_check_enabled() && ! run_updater_win()) - // "prusaslicer-updater.exe" was not started, run our own update check. - #endif // _WIN32 - this->preset_updater->slic3r_update_notify(); + show_send_system_info_dialog_if_needed(); + } + // app version check is asynchronous and triggers blocking dialog window, better call it last + this->app_version_check(false); }); } // Set PrusaSlicer version and save to PrusaSlicer.ini or PrusaSlicerGcodeViewer.ini. app_config->set("version", SLIC3R_VERSION); - app_config->save(); #ifdef _WIN32 // Sets window property to mainframe so other instances can indentify it. @@ -809,21 +856,19 @@ GUI_App::GUI_App(EAppMode mode) , m_imgui(new ImGuiWrapper()) , m_removable_drive_manager(std::make_unique()) , m_other_instance_message_handler(std::make_unique()) + , m_downloader(std::make_unique()) { //app config initializes early becasuse it is used in instance checking in PrusaSlicer.cpp this->init_app_config(); + // init app downloader after path to datadir is set + m_app_updater = std::make_unique(); } GUI_App::~GUI_App() { - if (app_config != nullptr) - delete app_config; - - if (preset_bundle != nullptr) - delete preset_bundle; - - if (preset_updater != nullptr) - delete preset_updater; + delete app_config; + delete preset_bundle; + delete preset_updater; } // If formatted for github, plaintext with OpenGL extensions enclosed into
    . @@ -835,18 +880,23 @@ std::string GUI_App::get_gl_info(bool for_github) wxGLContext* GUI_App::init_glcontext(wxGLCanvas& canvas) { +#if ENABLE_GL_CORE_PROFILE +#if ENABLE_OPENGL_DEBUG_OPTION + return m_opengl_mgr.init_glcontext(canvas, init_params != nullptr ? init_params->opengl_version : std::make_pair(0, 0), + init_params != nullptr ? init_params->opengl_debug : false); +#else + return m_opengl_mgr.init_glcontext(canvas, init_params != nullptr ? init_params->opengl_version : std::make_pair(0, 0)); +#endif // ENABLE_OPENGL_DEBUG_OPTION +#else return m_opengl_mgr.init_glcontext(canvas); +#endif // ENABLE_GL_CORE_PROFILE } bool GUI_App::init_opengl() { -#ifdef __linux__ bool status = m_opengl_mgr.init_gl(); m_opengl_initialized = true; return status; -#else - return m_opengl_mgr.init_gl(); -#endif } // gets path to PrusaSlicer.ini, returns semver from first line comment @@ -869,10 +919,12 @@ static boost::optional parse_semver_from_ini(std::string path) void GUI_App::init_app_config() { // Profiles for the alpha are stored into the PrusaSlicer-alpha directory to not mix with the current release. - SetAppName(SLIC3R_APP_KEY); -// SetAppName(SLIC3R_APP_KEY "-alpha"); + +// SetAppName(SLIC3R_APP_KEY); + SetAppName(SLIC3R_APP_KEY "-alpha"); // SetAppName(SLIC3R_APP_KEY "-beta"); + // SetAppDisplayName(SLIC3R_APP_NAME); // Set the Slic3r data directory at the Slic3r XS module. @@ -957,7 +1009,6 @@ std::string GUI_App::check_older_app_config(Semver current_version, bool backup) return {}; BOOST_LOG_TRIVIAL(info) << "last app config file used: " << older_data_dir_path; // ask about using older data folder - InfoDialog msg(nullptr , format_wxstr(_L("You are opening %1% version %2%."), SLIC3R_APP_NAME, SLIC3R_VERSION) , backup ? @@ -1092,33 +1143,37 @@ bool GUI_App::on_init_inner() // If load_language() fails, the application closes. load_language(wxString(), true); #ifdef _MSW_DARK_MODE - bool init_dark_color_mode = app_config->get("dark_color_mode") == "1"; - bool init_sys_menu_enabled = app_config->get("sys_menu_enabled") == "1"; + bool init_dark_color_mode = app_config->get_bool("dark_color_mode"); + bool init_sys_menu_enabled = app_config->get_bool("sys_menu_enabled"); NppDarkMode::InitDarkMode(init_dark_color_mode, init_sys_menu_enabled); #endif // initialize label colors and fonts - init_label_colours(); + init_ui_colours(); init_fonts(); std::string older_data_dir_path; if (m_app_conf_exists) { - if (app_config->orig_version().valid() && app_config->orig_version() < *Semver::parse(SLIC3R_VERSION)) + if (app_config->orig_version().valid() && app_config->orig_version() < *Semver::parse(SLIC3R_VERSION)) { // Only copying configuration if it was saved with a newer slicer than the one currently running. older_data_dir_path = check_older_app_config(app_config->orig_version(), true); + m_last_app_conf_lower_version = true; + } } else { // No AppConfig exists, fresh install. Always try to copy from an alternate location, don't make backup of the current configuration. older_data_dir_path = check_older_app_config(Semver(), false); + if (!older_data_dir_path.empty()) + m_last_app_conf_lower_version = true; } #ifdef _MSW_DARK_MODE // app_config can be updated in check_older_app_config(), so check if dark_color_mode and sys_menu_enabled was changed - if (bool new_dark_color_mode = app_config->get("dark_color_mode") == "1"; + if (bool new_dark_color_mode = app_config->get_bool("dark_color_mode"); init_dark_color_mode != new_dark_color_mode) { NppDarkMode::SetDarkMode(new_dark_color_mode); - init_label_colours(); - update_label_colours_from_appconfig(); + init_ui_colours(); + update_ui_colours_from_appconfig(); } - if (bool new_sys_menu_enabled = app_config->get("sys_menu_enabled") == "1"; + if (bool new_sys_menu_enabled = app_config->get_bool("sys_menu_enabled"); init_sys_menu_enabled != new_sys_menu_enabled) NppDarkMode::SetSystemMenuForApp(new_sys_menu_enabled); #endif @@ -1144,7 +1199,7 @@ bool GUI_App::on_init_inner() } SplashScreen* scrn = nullptr; - if (app_config->get("show_splash_screen") == "1") { + if (app_config->get_bool("show_splash_screen")) { // make a bitmap with dark grey banner on the left side wxBitmap bmp = SplashScreen::MakeBitmap(wxBitmap(from_u8(var(is_editor() ? "splashscreen.jpg" : "splashscreen-gcodepreview.jpg")), wxBITMAP_TYPE_JPEG)); @@ -1152,7 +1207,7 @@ bool GUI_App::on_init_inner() // Now this position is equal to the mainframe position wxPoint splashscreen_pos = wxDefaultPosition; bool default_splashscreen_pos = true; - if (app_config->has("window_mainframe") && app_config->get("restore_win_position") == "1") { + if (app_config->has("window_mainframe") && app_config->get_bool("restore_win_position")) { auto metrics = WindowMetrics::deserialize(app_config->get("window_mainframe")); default_splashscreen_pos = metrics == boost::none; if (!default_splashscreen_pos) @@ -1166,7 +1221,7 @@ bool GUI_App::on_init_inner() } // create splash screen with updated bmp - scrn = new SplashScreen(bmp.IsOk() ? bmp : create_scaled_bitmap("PrusaSlicer", nullptr, 400), + scrn = new SplashScreen(bmp.IsOk() ? bmp : get_bmp_bundle("PrusaSlicer", 400)->GetPreferredBitmapSizeAtScale(1.0), wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_TIMEOUT, 4000, splashscreen_pos); if (!default_splashscreen_pos) @@ -1186,40 +1241,25 @@ bool GUI_App::on_init_inner() if (! older_data_dir_path.empty()) { preset_bundle->import_newer_configs(older_data_dir_path); - app_config->save(); + //app_config->save(); // It looks like redundant call of save. ysFIXME delete after testing } if (is_editor()) { #ifdef __WXMSW__ - if (app_config->get("associate_3mf") == "1") + if (app_config->get_bool("associate_3mf")) associate_3mf_files(); - if (app_config->get("associate_stl") == "1") + if (app_config->get_bool("associate_stl")) associate_stl_files(); #endif // __WXMSW__ preset_updater = new PresetUpdater(); - Bind(EVT_SLIC3R_VERSION_ONLINE, [this](const wxCommandEvent& evt) { - app_config->set("version_online", into_u8(evt.GetString())); - app_config->save(); - std::string opt = app_config->get("notify_release"); - if (this->plater_ != nullptr && (opt == "all" || opt == "release")) { - if (*Semver::parse(SLIC3R_VERSION) < *Semver::parse(into_u8(evt.GetString()))) { - this->plater_->get_notification_manager()->push_notification(NotificationType::NewAppAvailable - , NotificationManager::NotificationLevel::ImportantNotificationLevel - , Slic3r::format(_u8L("New release version %1% is available."), evt.GetString()) - , _u8L("See Download page.") - , [](wxEvtHandler* evnthndlr) {wxGetApp().open_web_page_localized("https://www.prusa3d.com/slicerweb"); return true; } - ); - } - } - }); + Bind(EVT_SLIC3R_VERSION_ONLINE, &GUI_App::on_version_read, this); Bind(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, [this](const wxCommandEvent& evt) { - app_config->save(); - if (this->plater_ != nullptr && app_config->get("notify_release") == "all") { + if (this->plater_ != nullptr && (m_app_updater->get_triggered_by_user() || app_config->get("notify_release") == "all")) { std::string evt_string = into_u8(evt.GetString()); if (*Semver::parse(SLIC3R_VERSION) < *Semver::parse(evt_string)) { auto notif_type = (evt_string.find("beta") != std::string::npos ? NotificationType::NewBetaAvailable : NotificationType::NewAlphaAvailable); - this->plater_->get_notification_manager()->push_notification( notif_type + this->plater_->get_notification_manager()->push_version_notification( notif_type , NotificationManager::NotificationLevel::ImportantNotificationLevel , Slic3r::format(_u8L("New prerelease version %1% is available."), evt_string) , _u8L("See Releases page.") @@ -1228,23 +1268,41 @@ bool GUI_App::on_init_inner() } } }); + Bind(EVT_SLIC3R_APP_DOWNLOAD_PROGRESS, [this](const wxCommandEvent& evt) { + //lm:This does not force a render. The progress bar only updateswhen the mouse is moved. + if (this->plater_ != nullptr) + this->plater_->get_notification_manager()->set_download_progress_percentage((float)std::stoi(into_u8(evt.GetString())) / 100.f ); + }); + + Bind(EVT_SLIC3R_APP_DOWNLOAD_FAILED, [this](const wxCommandEvent& evt) { + if (this->plater_ != nullptr) + this->plater_->get_notification_manager()->close_notification_of_type(NotificationType::AppDownload); + if(!evt.GetString().IsEmpty()) + show_error(nullptr, evt.GetString()); + }); + + Bind(EVT_SLIC3R_APP_OPEN_FAILED, [](const wxCommandEvent& evt) { + show_error(nullptr, evt.GetString()); + }); + } else { #ifdef __WXMSW__ - if (app_config->get("associate_gcode") == "1") + if (app_config->get_bool("associate_gcode")) associate_gcode_files(); #endif // __WXMSW__ } - + + std::string delayed_error_load_presets; // Suppress the '- default -' presets. - preset_bundle->set_default_suppressed(app_config->get("no_defaults") == "1"); + preset_bundle->set_default_suppressed(app_config->get_bool("no_defaults")); try { // Enable all substitutions (in both user and system profiles), but log the substitutions in user profiles only. // If there are substitutions in system profiles, then a "reconfigure" event shall be triggered, which will force // installation of a compatible system preset, thus nullifying the system preset substitutions. init_params->preset_substitutions = preset_bundle->load_presets(*app_config, ForwardCompatibilitySubstitutionRule::EnableSystemSilent); } catch (const std::exception &ex) { - show_error(nullptr, ex.what()); + delayed_error_load_presets = ex.what(); } #ifdef WIN32 @@ -1261,7 +1319,10 @@ bool GUI_App::on_init_inner() if (scrn && is_editor()) scrn->SetText(_L("Preparing settings tabs") + dots); - mainframe = new MainFrame(); + if (!delayed_error_load_presets.empty()) + show_error(nullptr, delayed_error_load_presets); + + mainframe = new MainFrame(app_config->has("font_size") ? atoi(app_config->get("font_size").c_str()) : -1); // hide settings tabs after first Layout if (is_editor()) mainframe->select_tab(size_t(0)); @@ -1312,19 +1373,22 @@ bool GUI_App::on_init_inner() // An ugly solution to GH #5537 in which GUI_App::init_opengl (normally called from events wxEVT_PAINT // and wxEVT_SET_FOCUS before GUI_App::post_init is called) wasn't called before GUI_App::post_init and OpenGL wasn't initialized. -#ifdef __linux__ - if (! m_post_initialized && m_opengl_initialized) { + // Since issue #9774 Where same problem occured on MacOS Ventura, we decided to have this check on MacOS as well. + +#if defined(__linux__) || defined(__APPLE__) + if (!m_post_initialized && m_opengl_initialized) { #else - if (! m_post_initialized) { + if (!m_post_initialized) { #endif m_post_initialized = true; + #ifdef WIN32 this->mainframe->register_win32_callbacks(); #endif this->post_init(); } - if (m_post_initialized && app_config->dirty() && app_config->get("autosave") == "1") + if (m_post_initialized && app_config->dirty()) app_config->save(); }); @@ -1356,7 +1420,6 @@ bool GUI_App::on_init_inner() app_config->set("restore_win_position", "0"); else if (answer == wxID_NO) app_config->set("restore_win_position", "1"); - app_config->save(); } return true; @@ -1384,9 +1447,9 @@ bool GUI_App::dark_mode() // proper dark mode was first introduced. return wxPlatformInfo::Get().CheckOSVersion(10, 14) && mac_dark_mode(); #else - return wxGetApp().app_config->get("dark_color_mode") == "1" ? true : check_dark_mode(); - //const unsigned luma = get_colour_approx_luma(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); - //return luma < 128; + if (wxGetApp().app_config->has("dark_color_mode")) + return wxGetApp().app_config->get_bool("dark_color_mode"); + return check_dark_mode(); #endif } @@ -1400,10 +1463,16 @@ const wxColour GUI_App::get_label_default_clr_modified() return dark_mode() ? wxColour(253, 111, 40) : wxColour(252, 77, 1); } -void GUI_App::init_label_colours() +const std::vector GUI_App::get_mode_default_palette() +{ + return { "#7DF028", "#FFDC00", "#E70000" }; +} + +void GUI_App::init_ui_colours() { m_color_label_modified = get_label_default_clr_modified(); m_color_label_sys = get_label_default_clr_system(); + m_mode_palette = get_mode_default_palette(); bool is_dark_mode = dark_mode(); #ifdef _WIN32 @@ -1419,19 +1488,30 @@ void GUI_App::init_label_colours() m_color_window_default = is_dark_mode ? wxColour(43, 43, 43) : wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); } -void GUI_App::update_label_colours_from_appconfig() +void GUI_App::update_ui_colours_from_appconfig() { + // load label colors if (app_config->has("label_clr_sys")) { auto str = app_config->get("label_clr_sys"); - if (str != "") + if (!str.empty()) m_color_label_sys = wxColour(str); } if (app_config->has("label_clr_modified")) { auto str = app_config->get("label_clr_modified"); - if (str != "") + if (!str.empty()) m_color_label_modified = wxColour(str); } + + // load mode markers colors + if (app_config->has("mode_palette")) { + const auto colors = app_config->get("mode_palette"); + if (!colors.empty()) { + m_mode_palette.clear(); + if (!unescape_strings_cstyle(colors, m_mode_palette)) + m_mode_palette = get_mode_default_palette(); + } + } } void GUI_App::update_label_colours() @@ -1603,10 +1683,8 @@ void GUI_App::set_label_clr_modified(const wxColour& clr) if (m_color_label_modified == clr) return; m_color_label_modified = clr; - auto clr_str = wxString::Format(wxT("#%02X%02X%02X"), clr.Red(), clr.Green(), clr.Blue()); - std::string str = clr_str.ToStdString(); + const std::string str = encode_color(ColorRGB(clr.Red(), clr.Green(), clr.Blue())); app_config->set("label_clr_modified", str); - app_config->save(); } void GUI_App::set_label_clr_sys(const wxColour& clr) @@ -1614,15 +1692,45 @@ void GUI_App::set_label_clr_sys(const wxColour& clr) if (m_color_label_sys == clr) return; m_color_label_sys = clr; - auto clr_str = wxString::Format(wxT("#%02X%02X%02X"), clr.Red(), clr.Green(), clr.Blue()); - std::string str = clr_str.ToStdString(); + const std::string str = encode_color(ColorRGB(clr.Red(), clr.Green(), clr.Blue())); app_config->set("label_clr_sys", str); - app_config->save(); +} + +const std::string& GUI_App::get_mode_btn_color(int mode_id) +{ + assert(0 <= mode_id && size_t(mode_id) < m_mode_palette.size()); + return m_mode_palette[mode_id]; +} + +std::vector GUI_App::get_mode_palette() +{ + return { wxColor(m_mode_palette[0]), + wxColor(m_mode_palette[1]), + wxColor(m_mode_palette[2]) }; +} + +void GUI_App::set_mode_palette(const std::vector& palette) +{ + bool save = false; + + for (size_t mode = 0; mode < palette.size(); ++mode) { + const wxColour& clr = palette[mode]; + std::string color_str = clr == wxTransparentColour ? std::string("") : encode_color(ColorRGB(clr.Red(), clr.Green(), clr.Blue())); + if (m_mode_palette[mode] != color_str) { + m_mode_palette[mode] = color_str; + save = true; + } + } + + if (save) { + mainframe->update_mode_markers(); + app_config->set("mode_palette", escape_strings_cstyle(m_mode_palette)); + } } bool GUI_App::tabs_as_menu() const { - return app_config->get("tabs_as_menu") == "1"; // || dark_mode(); + return app_config->get_bool("tabs_as_menu"); // || dark_mode(); } wxSize GUI_App::get_min_size() const @@ -1702,7 +1810,7 @@ void GUI_App::recreate_GUI(const wxString& msg_name) dlg.Update(10, _L("Recreating") + dots); MainFrame *old_main_frame = mainframe; - mainframe = new MainFrame(); + mainframe = new MainFrame(app_config->has("font_size") ? atoi(app_config->get("font_size").c_str()) : -1); if (is_editor()) // hide settings tabs after first Layout mainframe->select_tab(size_t(0)); @@ -1791,14 +1899,14 @@ static void update_scrolls(wxWindow* window) #ifdef _MSW_DARK_MODE void GUI_App::force_menu_update() { - NppDarkMode::SetSystemMenuForApp(app_config->get("sys_menu_enabled") == "1"); + NppDarkMode::SetSystemMenuForApp(app_config->get_bool("sys_menu_enabled")); } #endif //_MSW_DARK_MODE void GUI_App::force_colors_update() { #ifdef _MSW_DARK_MODE - NppDarkMode::SetDarkMode(app_config->get("dark_color_mode") == "1"); + NppDarkMode::SetDarkMode(app_config->get_bool("dark_color_mode")); if (WXHWND wxHWND = wxToolTip::GetToolTipCtrl()) NppDarkMode::SetDarkExplorerTheme((HWND)wxHWND); NppDarkMode::SetDarkTitleBar(mainframe->GetHWND()); @@ -1819,6 +1927,7 @@ void GUI_App::update_ui_from_settings() m_force_colors_update = false; mainframe->force_color_changed(); mainframe->diff_dialog.force_color_changed(); + mainframe->preferences_dialog->force_color_changed(); mainframe->printhost_queue_dlg()->force_color_changed(); #ifdef _MSW_DARK_MODE update_scrolls(mainframe); @@ -1876,6 +1985,17 @@ void GUI_App::import_model(wxWindow *parent, wxArrayString& input_files) const dialog.GetPaths(input_files); } +void GUI_App::import_zip(wxWindow* parent, wxString& input_file) const +{ + wxFileDialog dialog(parent ? parent : GetTopWindow(), + _L("Choose ZIP file") + ":", + from_u8(app_config->get_last_dir()), "", + file_wildcards(FT_ZIP), wxFD_OPEN | wxFD_FILE_MUST_EXIST); + + if (dialog.ShowModal() == wxID_OK) + input_file = dialog.GetPath(); +} + void GUI_App::load_gcode(wxWindow* parent, wxString& input_file) const { input_file.Clear(); @@ -1949,15 +2069,17 @@ static const wxLanguageInfo* linux_get_existing_locale_language(const wxLanguage }), locales.end()); - // Is there a candidate matching a country code of a system language? Move it to the end, - // while maintaining the order of matches, so that the best match ends up at the very end. - std::string system_country = "_" + into_u8(system_language->CanonicalName.AfterFirst('_')).substr(0, 2); - int cnt = locales.size(); - for (int i=0; iCanonicalName.AfterFirst('_')).substr(0, 2); + int cnt = locales.size(); + for (int i = 0; i < cnt; ++i) + if (locales[i].find(system_country) != std::string::npos) { + locales.emplace_back(std::move(locales[i])); + locales[i].clear(); + } + } // Now try them one by one. for (auto it = locales.rbegin(); it != locales.rend(); ++ it) @@ -2044,7 +2166,6 @@ bool GUI_App::select_language() // m_wxLocale->GetCanonicalName() // 3) new_language_info->CanonicalName is a safe bet. It points to a valid dictionary name. app_config->set("translation_language", new_language_info->CanonicalName.ToUTF8().data()); - app_config->save(); return true; } } @@ -2075,6 +2196,15 @@ bool GUI_App::load_language(wxString language, bool initial) { // Allocating a temporary locale will switch the default wxTranslations to its internal wxTranslations instance. wxLocale temp_locale; +#ifdef __WXOSX__ + // ysFIXME - temporary workaround till it isn't fixed in wxWidgets: + // Use English as an initial language, because of under OSX it try to load "inappropriate" language for wxLANGUAGE_DEFAULT. + // For example in our case it's trying to load "en_CZ" and as a result PrusaSlicer catch warning message. + // But wxWidgets guys work on it. + temp_locale.Init(wxLANGUAGE_ENGLISH); +#else + temp_locale.Init(); +#endif // __WXOSX__ // Set the current translation's language to default, otherwise GetBestTranslation() may not work (see the wxWidgets source code). wxTranslations::Get()->SetLanguage(wxLANGUAGE_DEFAULT); // Let the wxFileTranslationsLoader enumerate all translation dictionaries for PrusaSlicer @@ -2151,7 +2281,14 @@ bool GUI_App::load_language(wxString language, bool initial) } #endif +#ifdef __APPLE__ + // ysFIXME after fix for wxWidgets issue (https://github.com/wxWidgets/wxWidgets/issues/23209) + // Workaround for wxLANGUAGE_CHINESE(...) languages => Allow to continue even if wxLocale is not available. + // Because of translation will works fine, just locales will set to EN + if (! wxLocale::IsAvailable(language_info->Language) && language_info->CanonicalName.BeforeFirst('_') != "zh" ) { +#else if (! wxLocale::IsAvailable(language_info->Language)) { +#endif // Loading the language dictionary failed. wxString message = "Switching PrusaSlicer to language " + language_info->CanonicalName + " failed."; #if !defined(_WIN32) && !defined(__APPLE__) @@ -2201,13 +2338,32 @@ ConfigOptionMode GUI_App::get_mode() mode == "simple" ? comSimple : comAdvanced; } -void GUI_App::save_mode(const /*ConfigOptionMode*/int mode) +bool GUI_App::save_mode(const /*ConfigOptionMode*/int mode) { const std::string mode_str = mode == comExpert ? "expert" : mode == comSimple ? "simple" : "advanced"; + + auto can_switch_to_simple = [](Model& model) { + for (const ModelObject* model_object : model.objects) + if (model_object->volumes.size() > 1) { + for (size_t i = 1; i < model_object->volumes.size(); ++i) + if (!model_object->volumes[i]->is_support_modifier()) + return false; + } + return true; + }; + + if (mode == comSimple && !can_switch_to_simple(model())) { + show_info(nullptr, + _L("Simple mode supports manipulation with single-part object(s)\n" + "or object(s) with support modifiers only.") + "\n\n" + + _L("Please check your object list before mode changing."), + _L("Change application mode")); + return false; + } app_config->set("view_mode", mode_str); - app_config->save(); update_mode(); + return true; } // Update view mode according to selected menu @@ -2215,7 +2371,7 @@ void GUI_App::update_mode() { sidebar().update_mode(); -#ifdef _MSW_DARK_MODE +#ifdef _WIN32 //_MSW_DARK_MODE if (!wxGetApp().tabs_as_menu()) dynamic_cast(mainframe->m_tabpanel)->UpdateMode(); #endif @@ -2232,14 +2388,15 @@ void GUI_App::add_config_menu(wxMenuBar *menu) auto local_menu = new wxMenu(); wxWindowID config_id_base = wxWindow::NewControlId(int(ConfigMenuCnt)); - const auto config_wizard_name = _(ConfigWizard::name(true)); - const auto config_wizard_tooltip = from_u8((boost::format(_utf8(L("Run %s"))) % config_wizard_name).str()); + const wxString config_wizard_name = _(ConfigWizard::name(true)); + const wxString config_wizard_tooltip = from_u8((boost::format(_u8L("Run %s")) % config_wizard_name).str()); // Cmd+, is standard on OS X - what about other operating systems? if (is_editor()) { local_menu->Append(config_id_base + ConfigMenuWizard, config_wizard_name + dots, config_wizard_tooltip); local_menu->Append(config_id_base + ConfigMenuSnapshots, _L("&Configuration Snapshots") + dots, _L("Inspect / activate configuration snapshots")); local_menu->Append(config_id_base + ConfigMenuTakeSnapshot, _L("Take Configuration &Snapshot"), _L("Capture a configuration snapshot")); - local_menu->Append(config_id_base + ConfigMenuUpdate, _L("Check for Configuration Updates"), _L("Check for configuration updates")); + local_menu->Append(config_id_base + ConfigMenuUpdateConf, _L("Check for Configuration Updates"), _L("Check for configuration updates")); + local_menu->Append(config_id_base + ConfigMenuUpdateApp, _L("Check for Application Updates"), _L("Check for new version of application")); #if defined(__linux__) && defined(SLIC3R_DESKTOP_INTEGRATION) //if (DesktopIntegrationDialog::integration_possible()) local_menu->Append(config_id_base + ConfigMenuDesktopIntegration, _L("Desktop Integration"), _L("Desktop Integration")); @@ -2259,7 +2416,7 @@ void GUI_App::add_config_menu(wxMenuBar *menu) mode_menu = new wxMenu(); mode_menu->AppendRadioItem(config_id_base + ConfigMenuModeSimple, _L("Simple"), _L("Simple View Mode")); // mode_menu->AppendRadioItem(config_id_base + ConfigMenuModeAdvanced, _L("Advanced"), _L("Advanced View Mode")); - mode_menu->AppendRadioItem(config_id_base + ConfigMenuModeAdvanced, _CTX(L_CONTEXT("Advanced", "Mode"), "Mode"), _L("Advanced View Mode")); + mode_menu->AppendRadioItem(config_id_base + ConfigMenuModeAdvanced, _CTX("Advanced", "Mode"), _L("Advanced View Mode")); mode_menu->AppendRadioItem(config_id_base + ConfigMenuModeExpert, _L("Expert"), _L("Expert View Mode")); Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { if (get_mode() == comSimple) evt.Check(true); }, config_id_base + ConfigMenuModeSimple); Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { if (get_mode() == comAdvanced) evt.Check(true); }, config_id_base + ConfigMenuModeAdvanced); @@ -2281,9 +2438,12 @@ void GUI_App::add_config_menu(wxMenuBar *menu) case ConfigMenuWizard: run_wizard(ConfigWizard::RR_USER); break; - case ConfigMenuUpdate: + case ConfigMenuUpdateConf: check_updates(true); break; + case ConfigMenuUpdateApp: + app_version_check(true); + break; #ifdef __linux__ case ConfigMenuDesktopIntegration: show_desktop_integration_dialog(); @@ -2339,40 +2499,7 @@ void GUI_App::add_config_menu(wxMenuBar *menu) break; case ConfigMenuPreferences: { - bool app_layout_changed = false; - { - // the dialog needs to be destroyed before the call to recreate_GUI() - // or sometimes the application crashes into wxDialogBase() destructor - // so we put it into an inner scope - PreferencesDialog dlg(mainframe); - dlg.ShowModal(); - app_layout_changed = dlg.settings_layout_changed(); - if (dlg.seq_top_layer_only_changed()) - this->plater_->refresh_print(); - - if (dlg.recreate_GUI()) { - recreate_GUI(_L("Restart application") + dots); - return; - } -#ifdef _WIN32 - if (is_editor()) { - if (app_config->get("associate_3mf") == "1") - associate_3mf_files(); - if (app_config->get("associate_stl") == "1") - associate_stl_files(); - } - else { - if (app_config->get("associate_gcode") == "1") - associate_gcode_files(); - } -#endif // _WIN32 - } - if (app_layout_changed) { - // hide full main_sizer for mainFrame - mainframe->GetSizer()->Show(false); - mainframe->update_layout(); - mainframe->select_tab(size_t(0)); - } + open_preferences(); break; } case ConfigMenuLanguage: @@ -2420,36 +2547,34 @@ void GUI_App::add_config_menu(wxMenuBar *menu) menu->Append(local_menu, _L("&Configuration")); } -void GUI_App::open_preferences(size_t open_on_tab, const std::string& highlight_option) +void GUI_App::open_preferences(const std::string& highlight_option /*= std::string()*/, const std::string& tab_name/*= std::string()*/) { - bool app_layout_changed = false; - { - // the dialog needs to be destroyed before the call to recreate_GUI() - // or sometimes the application crashes into wxDialogBase() destructor - // so we put it into an inner scope - PreferencesDialog dlg(mainframe, open_on_tab, highlight_option); - dlg.ShowModal(); - app_layout_changed = dlg.settings_layout_changed(); + mainframe->preferences_dialog->show(highlight_option, tab_name); + + if (mainframe->preferences_dialog->recreate_GUI()) + recreate_GUI(_L("Restart application") + dots); + #if ENABLE_GCODE_LINES_ID_IN_H_SLIDER - if (dlg.seq_top_layer_only_changed() || dlg.seq_seq_top_gcode_indices_changed()) + if (dlg.seq_top_layer_only_changed() || dlg.seq_seq_top_gcode_indices_changed()) #else - if (dlg.seq_top_layer_only_changed()) + if (mainframe->preferences_dialog->seq_top_layer_only_changed()) #endif // ENABLE_GCODE_LINES_ID_IN_H_SLIDER - this->plater_->refresh_print(); + this->plater_->refresh_print(); + #ifdef _WIN32 - if (is_editor()) { - if (app_config->get("associate_3mf") == "1") - associate_3mf_files(); - if (app_config->get("associate_stl") == "1") - associate_stl_files(); - } - else { - if (app_config->get("associate_gcode") == "1") - associate_gcode_files(); - } -#endif // _WIN32 + if (is_editor()) { + if (app_config->get_bool("associate_3mf")) + associate_3mf_files(); + if (app_config->get_bool("associate_stl")) + associate_stl_files(); } - if (app_layout_changed) { + else { + if (app_config->get_bool("associate_gcode")) + associate_gcode_files(); + } +#endif // _WIN32 + + if (mainframe->preferences_dialog->settings_layout_changed()) { // hide full main_sizer for mainFrame mainframe->GetSizer()->Show(false); mainframe->update_layout(); @@ -2512,9 +2637,9 @@ bool GUI_App::check_and_save_current_preset_changes(const wxString& caption, con { if (has_current_preset_changes()) { const std::string app_config_key = remember_choice ? "default_action_on_close_application" : ""; - int act_buttons = UnsavedChangesDialog::ActionButtons::SAVE; + int act_buttons = ActionButtons::SAVE; if (dont_save_insted_of_discard) - act_buttons |= UnsavedChangesDialog::ActionButtons::DONT_SAVE; + act_buttons |= ActionButtons::DONT_SAVE; UnsavedChangesDialog dlg(caption, header, app_config_key, act_buttons); std::string act = app_config_key.empty() ? "none" : wxGetApp().app_config->get(app_config_key); if (act == "none" && dlg.ShowModal() == wxID_CANCEL) @@ -2531,8 +2656,7 @@ bool GUI_App::check_and_save_current_preset_changes(const wxString& caption, con // synchronize config.ini with the current selections. preset_bundle->export_selections(*app_config); - MessageDialog(nullptr, _L_PLURAL("The preset modifications are successfully saved", - "The presets modifications are successfully saved", dlg.get_names_and_types().size())).ShowModal(); + MessageDialog(nullptr, dlg.msg_success_saved_modifications(dlg.get_names_and_types().size())).ShowModal(); } } @@ -2592,8 +2716,7 @@ bool GUI_App::check_and_keep_current_preset_changes(const wxString& caption, con // synchronize config.ini with the current selections. preset_bundle->export_selections(*app_config); - wxString text = _L_PLURAL("The preset modifications are successfully saved", - "The presets modifications are successfully saved", preset_names_and_types.size()); + wxString text = dlg.msg_success_saved_modifications(preset_names_and_types.size()); if (!is_called_from_configwizard) text += "\n\n" + _L("For new project all modifications will be reseted"); @@ -2768,6 +2891,18 @@ void GUI_App::MacOpenFiles(const wxArrayString &fileNames) start_new_gcodeviewer(&filename); } } + +void GUI_App::MacOpenURL(const wxString& url) +{ + if (app_config && !app_config->get_bool("downloader_url_registered")) + { + notification_manager()->push_notification(NotificationType::URLNotRegistered); + BOOST_LOG_TRIVIAL(error) << "Recieved command to open URL, but it is not allowed in app configuration. URL: " << url; + return; + } + start_download(boost::nowide::narrow(url)); +} + #endif /* __APPLE */ Sidebar& GUI_App::sidebar() @@ -2815,11 +2950,21 @@ wxBookCtrlBase* GUI_App::tab_panel() const return mainframe->m_tabpanel; } -NotificationManager * GUI_App::notification_manager() +NotificationManager* GUI_App::notification_manager() { return plater_->get_notification_manager(); } +GalleryDialog* GUI_App::gallery_dialog() +{ + return mainframe->gallery_dialog(); +} + +Downloader* GUI_App::downloader() +{ + return m_downloader.get(); +} + // extruders count from selected printer preset int GUI_App::extruders_cnt() const { @@ -2871,6 +3016,14 @@ void GUI_App::open_web_page_localized(const std::string &http_address) // Because of we can't to print the multi-part objects with SLA technology. bool GUI_App::may_switch_to_SLA_preset(const wxString& caption) { + if (model_has_parameter_modifiers_in_objects(model())) { + show_info(nullptr, + _L("It's impossible to print object(s) which contains parameter modifiers with SLA technology.") + "\n\n" + + _L("Please check your object list before preset changing."), + caption); + return false; + } +/* if (model_has_multi_part_objects(model())) { show_info(nullptr, _L("It's impossible to print multi-part object(s) with SLA technology.") + "\n\n" + @@ -2878,6 +3031,14 @@ bool GUI_App::may_switch_to_SLA_preset(const wxString& caption) caption); return false; } + if (model_has_connectors(model())) { + show_info(nullptr, + _L("SLA technology doesn't support cut with connectors") + "\n\n" + + _L("Please check your object list before preset changing."), + caption); + return false; + } +*/ return true; } @@ -2886,6 +3047,9 @@ bool GUI_App::run_wizard(ConfigWizard::RunReason reason, ConfigWizard::StartPage wxCHECK_MSG(mainframe != nullptr, false, "Internal error: Main frame not created / null"); if (reason == ConfigWizard::RR_USER) { + // Cancel sync before starting wizard to prevent two downloads at same time + preset_updater->cancel_sync(); + preset_updater->update_index_db(); if (preset_updater->config_update(app_config->orig_version(), PresetUpdater::UpdateParams::FORCED_BEFORE_WIZARD) == PresetUpdater::R_ALL_CANCELED) return false; } @@ -2913,6 +3077,29 @@ void GUI_App::show_desktop_integration_dialog() #endif //__linux__ } +void GUI_App::show_downloader_registration_dialog() +{ + InfoDialog msg(nullptr + , format_wxstr(_L("Welcome to %1% version %2%."), SLIC3R_APP_NAME, SLIC3R_VERSION) + , format_wxstr(_L( + "Do you wish to register downloads from Printables.com" + "\nfor this %1% %2% executable?" + "\n\nDownloads can be registered for only 1 executable at time." + ), SLIC3R_APP_NAME, SLIC3R_VERSION) + , true, wxYES_NO); + if (msg.ShowModal() == wxID_YES) { + auto downloader_worker = new DownloaderUtils::Worker(nullptr); + downloader_worker->perform_register(app_config->get("url_downloader_dest")); +#ifdef __linux__ + if (downloader_worker->get_perform_registration_linux()) + DesktopIntegrationDialog::perform_downloader_desktop_integration(); +#endif // __linux__ + } else { + app_config->set("downloader_url_registered", "0"); + } +} + + #if ENABLE_THUMBNAIL_GENERATOR_DEBUG void GUI_App::gcode_thumbnails_debug() { @@ -2986,7 +3173,9 @@ void GUI_App::window_pos_save(wxTopLevelWindow* window, const std::string &name) WindowMetrics metrics = WindowMetrics::from_window(window); app_config->set(config_key, metrics.serialize()); - app_config->save(); + // save changed app_config here, before all action related to a close of application is processed + if (app_config->dirty()) + app_config->save(); } void GUI_App::window_pos_restore(wxTopLevelWindow* window, const std::string &name, bool default_maximized) @@ -3007,7 +3196,7 @@ void GUI_App::window_pos_restore(wxTopLevelWindow* window, const std::string &na const wxRect& rect = metrics->get_rect(); - if (app_config->get("restore_win_position") == "1") { + if (app_config->get_bool("restore_win_position")) { // workaround for crash related to the positioning of the window on secondary monitor app_config->set("restore_win_position", (boost::format("crashed_at_%1%_pos") % name).str()); app_config->save(); @@ -3060,7 +3249,13 @@ bool GUI_App::config_wizard_startup() run_wizard(ConfigWizard::RR_DATA_LEGACY); return true; + } +#ifndef __APPLE__ + else if (is_editor() && m_last_app_conf_lower_version && app_config->get_bool("downloader_url_registered")) { + show_downloader_registration_dialog(); + return true; } +#endif return false; } @@ -3068,6 +3263,7 @@ bool GUI_App::check_updates(const bool verbose) { PresetUpdater::UpdateResult updater_result; try { + preset_updater->update_index_db(); updater_result = preset_updater->config_update(app_config->orig_version(), verbose ? PresetUpdater::UpdateParams::SHOW_TEXT_BOX : PresetUpdater::UpdateParams::SHOW_NOTIFICATION); if (updater_result == PresetUpdater::R_INCOMPAT_EXIT) { mainframe->Close(); @@ -3115,11 +3311,11 @@ bool GUI_App::open_browser_with_warning_dialog(const wxString& url, wxWindow* pa } } if (launch) - launch = app_config->get(option_key) != "1"; + launch = !app_config->get_bool(option_key); } // warning dialog doesn't containe a "Remember my choice" checkbox // and will be shown only when "Suppress to open hyperlink in browser" is ON. - else if (app_config->get(option_key) == "1") { + else if (app_config->get_bool(option_key)) { MessageDialog dialog(parent, _L("Open hyperlink in default browser?"), _L("PrusaSlicer: Open hyperlink"), wxICON_QUESTION | wxYES_NO); launch = dialog.ShowModal() == wxID_YES; } @@ -3154,117 +3350,132 @@ bool GUI_App::open_browser_with_warning_dialog(const wxString& url, wxWindow* pa #ifdef __WXMSW__ -static bool set_into_win_registry(HKEY hkeyHive, const wchar_t* pszVar, const wchar_t* pszValue) +void GUI_App::associate_3mf_files() { - // see as reference: https://stackoverflow.com/questions/20245262/c-program-needs-an-file-association - wchar_t szValueCurrent[1000]; - DWORD dwType; - DWORD dwSize = sizeof(szValueCurrent); - - int iRC = ::RegGetValueW(hkeyHive, pszVar, nullptr, RRF_RT_ANY, &dwType, szValueCurrent, &dwSize); - - bool bDidntExist = iRC == ERROR_FILE_NOT_FOUND; + associate_file_type(L".3mf", L"Prusa.Slicer.1", L"PrusaSlicer", true); +} - if ((iRC != ERROR_SUCCESS) && !bDidntExist) - // an error occurred - return false; +void GUI_App::associate_stl_files() +{ + associate_file_type(L".stl", L"Prusa.Slicer.1", L"PrusaSlicer", true); +} - if (!bDidntExist) { - if (dwType != REG_SZ) - // invalid type - return false; +void GUI_App::associate_gcode_files() +{ + associate_file_type(L".gcode", L"PrusaSlicer.GCodeViewer.1", L"PrusaSlicerGCodeViewer", true); +} +#endif // __WXMSW__ - if (::wcscmp(szValueCurrent, pszValue) == 0) - // value already set - return false; +void GUI_App::on_version_read(wxCommandEvent& evt) +{ + app_config->set("version_online", into_u8(evt.GetString())); + std::string opt = app_config->get("notify_release"); + if (this->plater_ == nullptr || (!m_app_updater->get_triggered_by_user() && opt != "all" && opt != "release")) { + BOOST_LOG_TRIVIAL(info) << "Version online: " << evt.GetString() << ". User does not wish to be notified."; + return; } - - DWORD dwDisposition; - HKEY hkey; - iRC = ::RegCreateKeyExW(hkeyHive, pszVar, 0, 0, 0, KEY_ALL_ACCESS, nullptr, &hkey, &dwDisposition); - bool ret = false; - if (iRC == ERROR_SUCCESS) { - iRC = ::RegSetValueExW(hkey, L"", 0, REG_SZ, (BYTE*)pszValue, (::wcslen(pszValue) + 1) * sizeof(wchar_t)); - if (iRC == ERROR_SUCCESS) - ret = true; + if (*Semver::parse(SLIC3R_VERSION) >= *Semver::parse(into_u8(evt.GetString()))) { + if (m_app_updater->get_triggered_by_user()) + { + std::string text = (*Semver::parse(into_u8(evt.GetString())) == Semver()) + ? Slic3r::format(_u8L("Check for application update has failed.")) + : Slic3r::format(_u8L("No new version is available. Latest release version is %1%."), evt.GetString()); + + this->plater_->get_notification_manager()->push_version_notification(NotificationType::NoNewReleaseAvailable + , NotificationManager::NotificationLevel::RegularNotificationLevel + , text + , std::string() + , std::function() + ); + } + return; } - - RegCloseKey(hkey); - return ret; + // notification + /* + this->plater_->get_notification_manager()->push_notification(NotificationType::NewAppAvailable + , NotificationManager::NotificationLevel::ImportantNotificationLevel + , Slic3r::format(_u8L("New release version %1% is available."), evt.GetString()) + , _u8L("See Download page.") + , [](wxEvtHandler* evnthndlr) {wxGetApp().open_web_page_localized("https://www.prusa3d.com/slicerweb"); return true; } + ); + */ + // updater + // read triggered_by_user that was set when calling GUI_App::app_version_check + app_updater(m_app_updater->get_triggered_by_user()); } -void GUI_App::associate_3mf_files() +void GUI_App::app_updater(bool from_user) { - wchar_t app_path[MAX_PATH]; - ::GetModuleFileNameW(nullptr, app_path, sizeof(app_path)); + DownloadAppData app_data = m_app_updater->get_app_data(); - std::wstring prog_path = L"\"" + std::wstring(app_path) + L"\""; - std::wstring prog_id = L"Prusa.Slicer.1"; - std::wstring prog_desc = L"PrusaSlicer"; - std::wstring prog_command = prog_path + L" \"%1\""; - std::wstring reg_base = L"Software\\Classes"; - std::wstring reg_extension = reg_base + L"\\.3mf"; - std::wstring reg_prog_id = reg_base + L"\\" + prog_id; - std::wstring reg_prog_id_command = reg_prog_id + L"\\Shell\\Open\\Command"; + if (from_user && (!app_data.version || *app_data.version <= *Semver::parse(SLIC3R_VERSION))) + { + BOOST_LOG_TRIVIAL(info) << "There is no newer version online."; + MsgNoAppUpdates no_update_dialog; + no_update_dialog.ShowModal(); + return; + + } - bool is_new = false; - is_new |= set_into_win_registry(HKEY_CURRENT_USER, reg_extension.c_str(), prog_id.c_str()); - is_new |= set_into_win_registry(HKEY_CURRENT_USER, reg_prog_id.c_str(), prog_desc.c_str()); - is_new |= set_into_win_registry(HKEY_CURRENT_USER, reg_prog_id_command.c_str(), prog_command.c_str()); + assert(!app_data.url.empty()); + assert(!app_data.target_path.empty()); - if (is_new) - // notify Windows only when any of the values gets changed - ::SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nullptr, nullptr); + // dialog with new version info + AppUpdateAvailableDialog dialog(*Semver::parse(SLIC3R_VERSION), *app_data.version, from_user); + auto dialog_result = dialog.ShowModal(); + // checkbox "do not show again" + if (dialog.disable_version_check()) { + app_config->set("notify_release", "none"); + } + // Doesn't wish to update + if (dialog_result != wxID_OK) { + return; + } + // dialog with new version download (installer or app dependent on system) including path selection + AppUpdateDownloadDialog dwnld_dlg(*app_data.version, app_data.target_path); + dialog_result = dwnld_dlg.ShowModal(); + // Doesn't wish to download + if (dialog_result != wxID_OK) { + return; + } + app_data.target_path =dwnld_dlg.get_download_path(); + // start download + this->plater_->get_notification_manager()->push_download_progress_notification(GUI::format(_L("Downloading %1%"), app_data.target_path.filename().string()), std::bind(&AppUpdater::cancel_callback, this->m_app_updater.get())); + app_data.start_after = dwnld_dlg.run_after_download(); + m_app_updater->set_app_data(std::move(app_data)); + m_app_updater->sync_download(); } -void GUI_App::associate_stl_files() +void GUI_App::app_version_check(bool from_user) { - wchar_t app_path[MAX_PATH]; - ::GetModuleFileNameW(nullptr, app_path, sizeof(app_path)); - - std::wstring prog_path = L"\"" + std::wstring(app_path) + L"\""; - std::wstring prog_id = L"Prusa.Slicer.1"; - std::wstring prog_desc = L"PrusaSlicer"; - std::wstring prog_command = prog_path + L" \"%1\""; - std::wstring reg_base = L"Software\\Classes"; - std::wstring reg_extension = reg_base + L"\\.stl"; - std::wstring reg_prog_id = reg_base + L"\\" + prog_id; - std::wstring reg_prog_id_command = reg_prog_id + L"\\Shell\\Open\\Command"; - - bool is_new = false; - is_new |= set_into_win_registry(HKEY_CURRENT_USER, reg_extension.c_str(), prog_id.c_str()); - is_new |= set_into_win_registry(HKEY_CURRENT_USER, reg_prog_id.c_str(), prog_desc.c_str()); - is_new |= set_into_win_registry(HKEY_CURRENT_USER, reg_prog_id_command.c_str(), prog_command.c_str()); - - if (is_new) - // notify Windows only when any of the values gets changed - ::SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nullptr, nullptr); + if (from_user) { + if (m_app_updater->get_download_ongoing()) { + MessageDialog msgdlg(nullptr, _L("Download of new version is already ongoing. Do you wish to continue?"), _L("Notice"), wxYES_NO); + if (msgdlg.ShowModal() != wxID_YES) + return; + } + } + std::string version_check_url = app_config->version_check_url(); + m_app_updater->sync_version(version_check_url, from_user); } -void GUI_App::associate_gcode_files() +void GUI_App::start_download(std::string url) { - wchar_t app_path[MAX_PATH]; - ::GetModuleFileNameW(nullptr, app_path, sizeof(app_path)); - - std::wstring prog_path = L"\"" + std::wstring(app_path) + L"\""; - std::wstring prog_id = L"PrusaSlicer.GCodeViewer.1"; - std::wstring prog_desc = L"PrusaSlicerGCodeViewer"; - std::wstring prog_command = prog_path + L" \"%1\""; - std::wstring reg_base = L"Software\\Classes"; - std::wstring reg_extension = reg_base + L"\\.gcode"; - std::wstring reg_prog_id = reg_base + L"\\" + prog_id; - std::wstring reg_prog_id_command = reg_prog_id + L"\\Shell\\Open\\Command"; - - bool is_new = false; - is_new |= set_into_win_registry(HKEY_CURRENT_USER, reg_extension.c_str(), prog_id.c_str()); - is_new |= set_into_win_registry(HKEY_CURRENT_USER, reg_prog_id.c_str(), prog_desc.c_str()); - is_new |= set_into_win_registry(HKEY_CURRENT_USER, reg_prog_id_command.c_str(), prog_command.c_str()); - - if (is_new) - // notify Windows only when any of the values gets changed - ::SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nullptr, nullptr); + if (!plater_) { + BOOST_LOG_TRIVIAL(error) << "Could not start URL download: plater is nullptr."; + return; + } + //lets always init so if the download dest folder was changed, new dest is used + boost::filesystem::path dest_folder(app_config->get("url_downloader_dest")); + if (dest_folder.empty() || !boost::filesystem::is_directory(dest_folder)) { + std::string msg = _u8L("Could not start URL download. Destination folder is not set. Please choose destination folder in Configuration Wizard."); + BOOST_LOG_TRIVIAL(error) << msg; + show_error(nullptr, msg); + return; + } + m_downloader->init(dest_folder); + m_downloader->start_download(url); } -#endif // __WXMSW__ } // GUI } //Slic3r diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 8775a5f31cf..51900a9b61a 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -32,6 +32,7 @@ class PresetUpdater; class ModelObject; class PrintHostJobQueue; class Model; +class AppUpdater; namespace GUI{ @@ -45,7 +46,9 @@ class ObjectList; class ObjectLayers; class Plater; class NotificationManager; +class Downloader; struct GUI_InitParams; +class GalleryDialog; @@ -53,12 +56,14 @@ enum FileType { FT_STL, FT_OBJ, + FT_OBJECT, FT_STEP, FT_AMF, FT_3MF, FT_GCODE, FT_MODEL, FT_PROJECT, + FT_FONTS, FT_GALLERY, FT_INI, @@ -68,16 +73,23 @@ enum FileType FT_SL1, + FT_ZIP, + FT_SIZE, }; +#if ENABLE_ALTERNATIVE_FILE_WILDCARDS_GENERATOR +extern wxString file_wildcards(FileType file_type); +#else extern wxString file_wildcards(FileType file_type, const std::string &custom_extension = std::string{}); +#endif // ENABLE_ALTERNATIVE_FILE_WILDCARDS_GENERATOR enum ConfigMenuIDs { ConfigMenuWizard, ConfigMenuSnapshots, ConfigMenuTakeSnapshot, - ConfigMenuUpdate, + ConfigMenuUpdateConf, + ConfigMenuUpdateApp, ConfigMenuDesktopIntegration, ConfigMenuPreferences, ConfigMenuModeSimple, @@ -112,11 +124,10 @@ class GUI_App : public wxApp bool m_initialized { false }; bool m_post_initialized { false }; bool m_app_conf_exists{ false }; + bool m_last_app_conf_lower_version{ false }; EAppMode m_app_mode{ EAppMode::Editor }; bool m_is_recreating_gui{ false }; -#ifdef __linux__ bool m_opengl_initialized{ false }; -#endif wxColour m_color_label_modified; wxColour m_color_label_sys; @@ -130,6 +141,7 @@ class GUI_App : public wxApp wxColour m_color_selected_btn_bg; bool m_force_colors_update { false }; #endif + std::vector m_mode_palette; wxFont m_small_font; wxFont m_bold_font; @@ -153,7 +165,9 @@ class GUI_App : public wxApp std::unique_ptr m_imgui; std::unique_ptr m_printhost_job_queue; std::unique_ptr m_other_instance_message_handler; + std::unique_ptr m_app_updater; std::unique_ptr m_single_instance_checker; + std::unique_ptr m_downloader; std::string m_instance_hash_string; size_t m_instance_hash_int; @@ -184,8 +198,9 @@ class GUI_App : public wxApp static bool dark_mode(); const wxColour get_label_default_clr_system(); const wxColour get_label_default_clr_modified(); - void init_label_colours(); - void update_label_colours_from_appconfig(); + const std::vector get_mode_default_palette(); + void init_ui_colours(); + void update_ui_colours_from_appconfig(); void update_label_colours(); // update color mode for window void UpdateDarkUI(wxWindow *window, bool highlited = false, bool just_font = false); @@ -205,6 +220,9 @@ class GUI_App : public wxApp const wxColour& get_label_clr_default() { return m_color_label_default; } const wxColour& get_window_default_clr(){ return m_color_window_default; } + const std::string& get_mode_btn_color(int mode_id); + std::vector get_mode_palette(); + void set_mode_palette(const std::vector &palette); #ifdef _WIN32 const wxColour& get_label_highlight_clr() { return m_color_highlight_label_default; } @@ -234,6 +252,7 @@ class GUI_App : public wxApp void keyboard_shortcuts(); void load_project(wxWindow *parent, wxString& input_file) const; void import_model(wxWindow *parent, wxArrayString& input_files) const; + void import_zip(wxWindow* parent, wxString& input_file) const; void load_gcode(wxWindow* parent, wxString& input_file) const; static bool catch_error(std::function cb, const std::string& err); @@ -246,7 +265,7 @@ class GUI_App : public wxApp Tab* get_tab(Preset::Type type); ConfigOptionMode get_mode(); - void save_mode(const /*ConfigOptionMode*/int mode) ; + bool save_mode(const /*ConfigOptionMode*/int mode) ; void update_mode(); void add_config_menu(wxMenuBar *menu); @@ -267,7 +286,7 @@ class GUI_App : public wxApp wxString current_language_code_safe() const; bool is_localized() const { return m_wxLocale->GetLocale() != "English"; } - void open_preferences(size_t open_on_tab = 0, const std::string& highlight_option = std::string()); + void open_preferences(const std::string& highlight_option = std::string(), const std::string& tab_name = std::string()); virtual bool OnExceptionInMainLoop() override; // Calls wxLaunchDefaultBrowser if user confirms in dialog. @@ -277,6 +296,7 @@ class GUI_App : public wxApp void OSXStoreOpenFiles(const wxArrayString &files) override; // wxWidgets override to get an event on open files. void MacOpenFiles(const wxArrayString &fileNames) override; + void MacOpenURL(const wxString& url) override; #endif /* __APPLE */ Sidebar& sidebar(); @@ -287,7 +307,9 @@ class GUI_App : public wxApp Plater* plater(); const Plater* plater() const; Model& model(); - NotificationManager * notification_manager(); + NotificationManager* notification_manager(); + GalleryDialog * gallery_dialog(); + Downloader* downloader(); // Parameters extracted from the command line to be passed to GUI after initialization. GUI_InitParams* init_params { nullptr }; @@ -323,6 +345,7 @@ class GUI_App : public wxApp bool may_switch_to_SLA_preset(const wxString& caption); bool run_wizard(ConfigWizard::RunReason reason, ConfigWizard::StartPage start_page = ConfigWizard::SP_WELCOME); void show_desktop_integration_dialog(); + void show_downloader_registration_dialog(); #if ENABLE_THUMBNAIL_GENERATOR_DEBUG // temporary and debug only -> extract thumbnails from selected gcode and save them as png files @@ -342,6 +365,10 @@ class GUI_App : public wxApp void associate_gcode_files(); #endif // __WXMSW__ + + // URL download - PrusaSlicer gets system call to open prusaslicer:// URL which should contain address of download + void start_download(std::string url); + private: bool on_init_inner(); void init_app_config(); @@ -357,8 +384,14 @@ class GUI_App : public wxApp // Returns true if the configuration is fine. // Returns true if the configuration is not compatible and the user decided to rather close the slicer instead of reconfiguring. bool check_updates(const bool verbose); + void on_version_read(wxCommandEvent& evt); + // if the data from version file are already downloaded, shows dialogs to start download of new version of app + void app_updater(bool from_user); + // inititate read of version file online in separate thread + void app_version_check(bool from_user); bool m_datadir_redefined { false }; + }; DECLARE_APP(GUI_App) diff --git a/src/slic3r/GUI/GUI_Factories.cpp b/src/slic3r/GUI/GUI_Factories.cpp index c3aaa2f4ef2..60049c865e4 100644 --- a/src/slic3r/GUI/GUI_Factories.cpp +++ b/src/slic3r/GUI/GUI_Factories.cpp @@ -13,6 +13,7 @@ #include "GLCanvas3D.hpp" #include "Selection.hpp" #include "format.hpp" +#include "Gizmos/GLGizmoEmboss.hpp" #include #include "slic3r/Utils/FixModelByWin10.hpp" @@ -43,7 +44,6 @@ static bool is_improper_category(const std::string& category, const int extruder (!is_object_settings && category == "Support material"); } - //------------------------------------- // SettingsFactory //------------------------------------- @@ -142,27 +142,34 @@ std::map SettingsFactory::CATEGORY_ICON = { L("Hollowing") , "hollowing" } }; -wxBitmap SettingsFactory::get_category_bitmap(const std::string& category_name, bool menu_bmp /*= true*/) +wxBitmapBundle* SettingsFactory::get_category_bitmap(const std::string& category_name) { if (CATEGORY_ICON.find(category_name) == CATEGORY_ICON.end()) - return wxNullBitmap; - return menu_bmp ? create_menu_bitmap(CATEGORY_ICON.at(category_name)) : create_scaled_bitmap(CATEGORY_ICON.at(category_name)); + return get_bmp_bundle("empty"); + return get_bmp_bundle(CATEGORY_ICON.at(category_name)); } - //------------------------------------- // MenuFactory //------------------------------------- // Note: id accords to type of the sub-object (adding volume), so sequence of the menu items is important -const std::vector> MenuFactory::ADD_VOLUME_MENU_ITEMS { +static const constexpr std::array, 5> ADD_VOLUME_MENU_ITEMS = {{ + // menu_item Name menu_item bitmap name + {L("Add part"), "add_part" }, // ~ModelVolumeType::MODEL_PART + {L("Add negative volume"), "add_negative" }, // ~ModelVolumeType::NEGATIVE_VOLUME + {L("Add modifier"), "add_modifier"}, // ~ModelVolumeType::PARAMETER_MODIFIER + {L("Add support blocker"), "support_blocker"}, // ~ModelVolumeType::SUPPORT_BLOCKER + {L("Add support enforcer"), "support_enforcer"}, // ~ModelVolumeType::SUPPORT_ENFORCER +}}; + +// Note: id accords to type of the sub-object (adding volume), so sequence of the menu items is important +static const constexpr std::array, 3> TEXT_VOLUME_ICONS {{ // menu_item Name menu_item bitmap name - {L("Add part"), "add_part" }, // ~ModelVolumeType::MODEL_PART - {L("Add negative volume"), "add_negative" }, // ~ModelVolumeType::NEGATIVE_VOLUME - {L("Add modifier"), "add_modifier"}, // ~ModelVolumeType::PARAMETER_MODIFIER - {L("Add support blocker"), "support_blocker"}, // ~ModelVolumeType::SUPPORT_BLOCKER - {L("Add support enforcer"), "support_enforcer"}, // ~ModelVolumeType::SUPPORT_ENFORCER -}; + {L("Add text"), "add_text_part"}, // ~ModelVolumeType::MODEL_PART + {L("Add negative text"), "add_text_negative" }, // ~ModelVolumeType::NEGATIVE_VOLUME + {L("Add text modifier"), "add_text_modifier"}, // ~ModelVolumeType::PARAMETER_MODIFIER +}}; static Plater* plater() { @@ -404,7 +411,7 @@ static void create_freq_settings_popupmenu(wxMenu* menu, const bool is_object_se if (is_improper_category(category.first, extruders_cnt)) continue; - append_menu_item(menu, wxID_ANY, from_u8((boost::format(_utf8(L("Quick Add Settings (%s)"))) % _(it.first)).str()), "", + append_menu_item(menu, wxID_ANY, format_wxstr(_L("Quick Add Settings (%s)"), _(it.first)), "", [menu, item, is_object_settings, bundle](wxCommandEvent& event) { wxString category_name = menu->GetLabel(event.GetId()); std::vector options; @@ -430,12 +437,21 @@ static void create_freq_settings_popupmenu(wxMenu* menu, const bool is_object_se #endif } -std::vector MenuFactory::get_volume_bitmaps() +std::vector MenuFactory::get_volume_bitmaps() { - std::vector volume_bmps; + std::vector volume_bmps; volume_bmps.reserve(ADD_VOLUME_MENU_ITEMS.size()); for (auto item : ADD_VOLUME_MENU_ITEMS) - volume_bmps.push_back(create_menu_bitmap(item.second)); + volume_bmps.push_back(get_bmp_bundle(item.second)); + return volume_bmps; +} + +std::vector MenuFactory::get_text_volume_bitmaps() +{ + std::vector volume_bmps; + volume_bmps.reserve(TEXT_VOLUME_ICONS.size()); + for (auto item : TEXT_VOLUME_ICONS) + volume_bmps.push_back(get_bmp_bundle(item.second)); return volume_bmps; } @@ -449,24 +465,30 @@ void MenuFactory::append_menu_item_delete(wxMenu* menu) } -wxMenu* MenuFactory::append_submenu_add_generic(wxMenu* menu, ModelVolumeType type) { +wxMenu* MenuFactory::append_submenu_add_generic(wxMenu* menu, ModelVolumeType type) +{ auto sub_menu = new wxMenu; - if (wxGetApp().get_mode() == comExpert && type != ModelVolumeType::INVALID) { + const ConfigOptionMode mode = wxGetApp().get_mode(); + + if (type != ModelVolumeType::INVALID && mode > comSimple) { append_menu_item(sub_menu, wxID_ANY, _L("Load") + " " + dots, "", [type](wxCommandEvent&) { obj_list()->load_subobject(type); }, "", menu); sub_menu->AppendSeparator(); } - for (auto& item : { L("Box"), L("Cylinder"), L("Sphere"), L("Slab") }) - { - if (type == ModelVolumeType::INVALID && strncmp(item, "Slab", 4) == 0) - continue; - append_menu_item(sub_menu, wxID_ANY, _(item), "", - [type, item](wxCommandEvent&) { obj_list()->load_generic_subobject(item, type); }, "", menu); - } + //if (!(type == ModelVolumeType::MODEL_PART && mode == comAdvanced)) + for (auto& item : { L("Box"), L("Cylinder"), L("Sphere"), L("Slab") }) + { + if (type == ModelVolumeType::INVALID && strncmp(item, "Slab", 4) == 0) + continue; + append_menu_item(sub_menu, wxID_ANY, _(item), "", + [type, item](wxCommandEvent&) { obj_list()->load_generic_subobject(item, type); }, "", menu); + } - if (wxGetApp().get_mode() >= comAdvanced) { + append_menu_item_add_text(sub_menu, type); + + if (mode >= comAdvanced) { sub_menu->AppendSeparator(); append_menu_item(sub_menu, wxID_ANY, _L("Gallery"), "", [type](wxCommandEvent&) { obj_list()->load_subobject(type, true); }, "", menu); @@ -475,28 +497,71 @@ wxMenu* MenuFactory::append_submenu_add_generic(wxMenu* menu, ModelVolumeType ty return sub_menu; } -void MenuFactory::append_menu_items_add_volume(wxMenu* menu) +void MenuFactory::append_menu_item_add_text(wxMenu* menu, ModelVolumeType type, bool is_submenu_item/* = true*/) +{ + auto add_text = [type](wxCommandEvent& evt) { + GLCanvas3D* canvas = plater()->canvas3D(); + GLGizmosManager& mng = canvas->get_gizmos_manager(); + GLGizmoBase* gizmo = mng.get_gizmo(GLGizmosManager::Emboss); + GLGizmoEmboss* emboss = dynamic_cast(gizmo); + assert(emboss != nullptr); + if (emboss == nullptr) return; + + ModelVolumeType volume_type = type; + // no selected object means create new object + if (volume_type == ModelVolumeType::INVALID) + volume_type = ModelVolumeType::MODEL_PART; + + auto screen_position = canvas->get_popup_menu_position(); + if (screen_position.has_value()) { + emboss->create_volume(volume_type, *screen_position); + } else { + emboss->create_volume(volume_type); + } + }; + + if ( type == ModelVolumeType::MODEL_PART + || type == ModelVolumeType::NEGATIVE_VOLUME + || type == ModelVolumeType::PARAMETER_MODIFIER + || type == ModelVolumeType::INVALID // cannot use gizmo without selected object + ) { + wxString item_name = is_submenu_item ? "" : _(ADD_VOLUME_MENU_ITEMS[int(type)].first) + ": "; + item_name += _L("Text"); + menu->AppendSeparator(); + const std::string icon_name = is_submenu_item ? "" : ADD_VOLUME_MENU_ITEMS[int(type)].second; + append_menu_item(menu, wxID_ANY, item_name, "", add_text, icon_name, menu); + } +} + +void MenuFactory::append_menu_items_add_volume(MenuType menu_type) { - // Update "add" items(delete old & create new) settings popupmenu + wxMenu* menu = menu_type == mtObjectFFF ? &m_object_menu : menu_type == mtObjectSLA ? &m_sla_object_menu : nullptr; + if (!menu) + return; + + // Update "add" items(delete old & create new) items popupmenu for (auto& item : ADD_VOLUME_MENU_ITEMS) { - const auto settings_id = menu->FindItem(_(item.first)); - if (settings_id != wxNOT_FOUND) - menu->Destroy(settings_id); + const wxString item_name = _(item.first); + int item_id = menu->FindItem(item_name); + if (item_id != wxNOT_FOUND) + menu->Destroy(item_id); + + item_id = menu->FindItem(item_name + ": " + _L("Text")); + if (item_id != wxNOT_FOUND) + menu->Destroy(item_id); } // Update "Height range Modifier" item (delete old & create new) if (const auto range_id = menu->FindItem(_L("Height range Modifier")); range_id != wxNOT_FOUND) menu->Destroy(range_id); - const ConfigOptionMode mode = wxGetApp().get_mode(); + if (const auto range_id = menu->FindItem(_L("Height range Modifier")); range_id != wxNOT_FOUND) + menu->Destroy(range_id); + + if (wxGetApp().get_mode() == comSimple) { + //append_menu_item_add_text(menu, ModelVolumeType::MODEL_PART, false); + //append_menu_item_add_text(menu, ModelVolumeType::NEGATIVE_VOLUME, false); - if (mode == comAdvanced) { - append_menu_item(menu, wxID_ANY, _(ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::MODEL_PART)].first), "", - [](wxCommandEvent&) { obj_list()->load_subobject(ModelVolumeType::MODEL_PART); }, - ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::MODEL_PART)].second, nullptr, - []() { return obj_list()->is_instance_or_object_selected(); }, m_parent); - } - if (mode == comSimple) { append_menu_item(menu, wxID_ANY, _(ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_ENFORCER)].first), "", [](wxCommandEvent&) { obj_list()->load_generic_subobject(L("Box"), ModelVolumeType::SUPPORT_ENFORCER); }, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_ENFORCER)].second, nullptr, @@ -509,16 +574,20 @@ void MenuFactory::append_menu_items_add_volume(wxMenu* menu) return; } - for (size_t type = (mode == comExpert ? 0 : 1); type < ADD_VOLUME_MENU_ITEMS.size(); type++) - { + for (size_t type = 0; type < ADD_VOLUME_MENU_ITEMS.size(); type++) { auto& item = ADD_VOLUME_MENU_ITEMS[type]; - + if (menu_type == mtObjectSLA && ModelVolumeType(type) == ModelVolumeType::PARAMETER_MODIFIER) + continue; wxMenu* sub_menu = append_submenu_add_generic(menu, ModelVolumeType(type)); append_submenu(menu, sub_menu, wxID_ANY, _(item.first), "", item.second, - []() { return obj_list()->is_instance_or_object_selected(); }, m_parent); + [type]() { + bool can_add = type < size_t(ModelVolumeType::PARAMETER_MODIFIER) ? !obj_list()->is_selected_object_cut() : true; + return can_add && obj_list()->is_instance_or_object_selected(); + }, m_parent); } - append_menu_item_layers_editing(menu); + if (menu_type == mtObjectFFF) + append_menu_item_layers_editing(menu); } wxMenuItem* MenuFactory::append_menu_item_layers_editing(wxMenu* menu) @@ -553,13 +622,13 @@ wxMenuItem* MenuFactory::append_menu_item_settings(wxMenu* menu_) #if 0 for (auto& it : m_freq_settings_fff) { - settings_id = menu->FindItem(from_u8((boost::format(_utf8(L("Quick Add Settings (%s)"))) % _(it.first)).str())); + settings_id = menu->FindItem(format_wxstr(_L("Quick Add Settings (%s)"), _(it.first))); if (settings_id != wxNOT_FOUND) menu->Destroy(settings_id); } for (auto& it : m_freq_settings_sla) { - settings_id = menu->FindItem(from_u8((boost::format(_utf8(L("Quick Add Settings (%s)"))) % _(it.first)).str())); + settings_id = menu->FindItem(format_wxstr(_L("Quick Add Settings (%s)"), _(it.first))); if (settings_id != wxNOT_FOUND) menu->Destroy(settings_id); } @@ -569,7 +638,7 @@ wxMenuItem* MenuFactory::append_menu_item_settings(wxMenu* menu_) // If there are selected more then one instance but not all of them // don't add settings menu items const Selection& selection = get_selection(); - if ((selection.is_multiple_full_instance() && !selection.is_single_full_object()) || + if ((selection.is_multiple_full_instance() && !selection.is_single_full_object()) || (printer_technology() == ptSLA && selection.is_single_volume()) || selection.is_multiple_volume() || selection.is_mixed()) // more than one volume(part) is selected on the scene return nullptr; @@ -615,7 +684,7 @@ wxMenuItem* MenuFactory::append_menu_item_settings(wxMenu* menu_) // Add full settings list auto menu_item = new wxMenuItem(menu, wxID_ANY, menu_name); - menu_item->SetBitmap(create_menu_bitmap("cog")); + menu_item->SetBitmap(*get_bmp_bundle("cog")); menu_item->SetSubMenu(create_settings_popupmenu(menu, is_object_settings, item)); return menu->Append(menu_item); @@ -681,6 +750,21 @@ wxMenuItem* MenuFactory::append_menu_item_printable(wxMenu* menu) return menu_item_printable; } +void MenuFactory::append_menu_item_invalidate_cut_info(wxMenu* menu) +{ + const wxString menu_name = _L("Invalidate cut info"); + + auto menu_item_id = menu->FindItem(menu_name); + if (menu_item_id != wxNOT_FOUND) + // Delete old menu item if selected object isn't cut + menu->Destroy(menu_item_id); + + if (obj_list()->has_selected_cut_object()) + append_menu_item(menu, wxID_ANY, menu_name, "", + [](wxCommandEvent&) { obj_list()->invalidate_cut_info_for_selection(); }, "", menu, + []() { return true; }, m_parent); +} + void MenuFactory::append_menu_items_osx(wxMenu* menu) { append_menu_item(menu, wxID_ANY, _L("Rename"), "", @@ -712,8 +796,8 @@ wxMenuItem* MenuFactory::append_menu_item_simplify(wxMenu* menu) void MenuFactory::append_menu_item_export_stl(wxMenu* menu) { - append_menu_item(menu, wxID_ANY, _L("Export as STL") + dots, "", - [](wxCommandEvent&) { plater()->export_stl(false, true); }, "", nullptr, + append_menu_item(menu, wxID_ANY, _L("Export as STL/OBJ") + dots, "", + [](wxCommandEvent&) { plater()->export_stl_obj(false, true); }, "", nullptr, []() { const Selection& selection = plater()->canvas3D()->get_selection(); return selection.is_single_full_instance() || selection.is_single_full_object() || selection.is_single_volume() || selection.is_single_modifier(); @@ -760,7 +844,7 @@ void MenuFactory::append_menu_item_change_extruder(wxMenu* menu) return; } - std::vector icons = get_extruder_color_icons(true); + std::vector icons = get_extruder_color_icons(true); wxMenu* extruder_selection_menu = new wxMenu(); const wxString& name = sels.Count() == 1 ? names[0] : names[1]; @@ -779,7 +863,7 @@ void MenuFactory::append_menu_item_change_extruder(wxMenu* menu) (is_active_extruder ? " (" + _L("active") + ")" : ""); append_menu_item(extruder_selection_menu, wxID_ANY, item_name, "", - [i](wxCommandEvent&) { obj_list()->set_extruder_for_selected_items(i); }, *icons[icon_idx], menu, + [i](wxCommandEvent&) { obj_list()->set_extruder_for_selected_items(i); }, icons[icon_idx], menu, [is_active_extruder]() { return !is_active_extruder; }, m_parent); } @@ -817,6 +901,8 @@ void MenuFactory::append_menu_items_convert_unit(wxMenu* menu, int insert_pos/* ModelObjectPtrs objects; for (int obj_idx : obj_idxs) { ModelObject* object = obj_list()->object(obj_idx); + if (object->is_cut()) + return false; if (vol_idxs.empty()) { for (ModelVolume* volume : object->volumes) if (volume_respects_conversion(volume, conver_type)) @@ -886,6 +972,40 @@ void MenuFactory::append_menu_items_mirror(wxMenu* menu) []() { return plater()->can_mirror(); }, m_parent); } +void MenuFactory::append_menu_item_edit_text(wxMenu *menu) +{ + wxString name = _L("Edit text"); + + auto can_edit_text = []() { + if (plater() != nullptr) { + const Selection& sel = plater()->get_selection(); + if (sel.volumes_count() == 1) { + const GLVolume* gl_vol = sel.get_first_volume(); + const ModelVolume* vol = plater()->model().objects[gl_vol->object_idx()]->volumes[gl_vol->volume_idx()]; + return vol->text_configuration.has_value(); + } + } + return false; + }; + + if (menu != &m_text_part_menu) { + const int menu_item_id = menu->FindItem(name); + if (menu_item_id != wxNOT_FOUND) + menu->Destroy(menu_item_id); + if (!can_edit_text()) + return; + } + + wxString description = _L("Ability to change text, font, size, ..."); + std::string icon = ""; + append_menu_item( + menu, wxID_ANY, name, description, + [](wxCommandEvent &) { + plater()->canvas3D()->get_gizmos_manager().open_gizmo(GLGizmosManager::Emboss); + }, + icon, nullptr, can_edit_text, m_parent); +} + MenuFactory::MenuFactory() { for (int i = 0; i < mtCount; i++) { @@ -925,37 +1045,40 @@ void MenuFactory::create_common_object_menu(wxMenu* menu) append_menu_item_fix_through_netfabb(menu); append_menu_item_simplify(menu); append_menu_items_mirror(menu); + + append_menu_items_split(menu); + menu->AppendSeparator(); } -void MenuFactory::create_object_menu() +void MenuFactory::append_menu_items_split(wxMenu *menu) { - create_common_object_menu(&m_object_menu); wxMenu* split_menu = new wxMenu(); if (!split_menu) return; append_menu_item(split_menu, wxID_ANY, _L("To objects"), _L("Split the selected object into individual objects"), - [](wxCommandEvent&) { plater()->split_object(); }, "split_object_SMALL", &m_object_menu, + [](wxCommandEvent&) { plater()->split_object(); }, "split_object_SMALL", menu, []() { return plater()->can_split(true); }, m_parent); append_menu_item(split_menu, wxID_ANY, _L("To parts"), _L("Split the selected object into individual parts"), - [](wxCommandEvent&) { plater()->split_volume(); }, "split_parts_SMALL", &m_object_menu, + [](wxCommandEvent&) { plater()->split_volume(); }, "split_parts_SMALL", menu, []() { return plater()->can_split(false); }, m_parent); - append_submenu(&m_object_menu, split_menu, wxID_ANY, _L("Split"), _L("Split the selected object"), "", - []() { return plater()->can_split(true) && wxGetApp().get_mode() > comSimple; }, m_parent); - m_object_menu.AppendSeparator(); - - // "Height range Modifier" and "Add (volumes)" menu items will be added later in append_menu_items_add_volume() + append_submenu(menu, split_menu, wxID_ANY, _L("Split"), _L("Split the selected object"), "", + []() { return plater()->can_split(true); }, m_parent); } -void MenuFactory::create_sla_object_menu() +void MenuFactory::append_immutable_part_menu_items(wxMenu* menu) { - create_common_object_menu(&m_sla_object_menu); - append_menu_item(&m_sla_object_menu, wxID_ANY, _L("Split"), _L("Split the selected object into individual objects"), - [](wxCommandEvent&) { plater()->split_object(); }, "split_object_SMALL", nullptr, - []() { return plater()->can_split(true); }, m_parent); + append_menu_items_mirror(menu); + + menu->AppendSeparator(); + append_menu_item_change_type(menu); +} - m_sla_object_menu.AppendSeparator(); +void MenuFactory::append_mutable_part_menu_items(wxMenu* menu) +{ + append_menu_item_settings(menu); + append_menu_item_change_extruder(menu); } void MenuFactory::create_part_menu() @@ -970,15 +1093,24 @@ void MenuFactory::create_part_menu() append_menu_item_export_stl(menu); append_menu_item_fix_through_netfabb(menu); append_menu_item_simplify(menu); - append_menu_items_mirror(menu); append_menu_item(menu, wxID_ANY, _L("Split"), _L("Split the selected object into individual parts"), - [](wxCommandEvent&) { plater()->split_volume(); }, "split_parts_SMALL", nullptr, + [](wxCommandEvent&) { plater()->split_volume(); }, "split_parts_SMALL", nullptr, []() { return plater()->can_split(false); }, m_parent); - menu->AppendSeparator(); - append_menu_item_change_type(menu); + append_immutable_part_menu_items(menu); +} +void MenuFactory::create_text_part_menu() +{ + wxMenu* menu = &m_text_part_menu; + + append_menu_item_delete(menu); + append_menu_item_edit_text(menu); + append_menu_item_fix_through_netfabb(menu); + append_menu_item_simplify(menu); + + append_immutable_part_menu_items(menu); } void MenuFactory::create_instance_menu() @@ -994,16 +1126,17 @@ void MenuFactory::init(wxWindow* parent) m_parent = parent; create_default_menu(); - create_object_menu(); - create_sla_object_menu(); + create_common_object_menu(&m_object_menu); + create_common_object_menu(&m_sla_object_menu); create_part_menu(); + create_text_part_menu(); create_instance_menu(); } void MenuFactory::update() { update_default_menu(); - update_object_menu(); + update_objects_menu(); } wxMenu* MenuFactory::default_menu() @@ -1017,6 +1150,8 @@ wxMenu* MenuFactory::object_menu() append_menu_item_settings(&m_object_menu); append_menu_item_change_extruder(&m_object_menu); update_menu_items_instance_manipulation(mtObjectFFF); + append_menu_item_invalidate_cut_info(&m_object_menu); + append_menu_item_edit_text(&m_object_menu); return &m_object_menu; } @@ -1026,6 +1161,8 @@ wxMenu* MenuFactory::sla_object_menu() append_menu_items_convert_unit(&m_sla_object_menu, 11); append_menu_item_settings(&m_sla_object_menu); update_menu_items_instance_manipulation(mtObjectSLA); + append_menu_item_invalidate_cut_info(&m_sla_object_menu); + append_menu_item_edit_text(&m_sla_object_menu); return &m_sla_object_menu; } @@ -1033,12 +1170,19 @@ wxMenu* MenuFactory::sla_object_menu() wxMenu* MenuFactory::part_menu() { append_menu_items_convert_unit(&m_part_menu, 2); - append_menu_item_settings(&m_part_menu); - append_menu_item_change_extruder(&m_part_menu); + + append_mutable_part_menu_items(&m_part_menu); return &m_part_menu; } +wxMenu* MenuFactory::text_part_menu() +{ + append_mutable_part_menu_items(&m_text_part_menu); + + return &m_text_part_menu; +} + wxMenu* MenuFactory::instance_menu() { return &m_instance_menu; @@ -1057,6 +1201,9 @@ wxMenu* MenuFactory::multi_selection_menu() wxDataViewItemArray sels; obj_list()->GetSelections(sels); + if (sels.IsEmpty()) + return nullptr; + for (const wxDataViewItem& item : sels) if (!(list_model()->GetItemType(item) & (itVolume | itObject | itInstance))) // show this menu only for Objects(Instances mixed with Objects)/Volumes selection @@ -1071,9 +1218,15 @@ wxMenu* MenuFactory::multi_selection_menu() append_menu_item_merge_to_multipart_object(menu); if (extruders_count() > 1) append_menu_item_change_extruder(menu); - if (list_model()->GetItemType(sels[0]) != itVolume) + if (list_model()->GetItemType(sels[0]) != itVolume) { append_menu_item_printable(menu); + if (wxGetApp().get_mode() != comSimple) + append_menu_item(menu, wxID_ANY, _L("Set number of instances") + dots, _L("Change the number of instances of the selected objects"), + [](wxCommandEvent&) { plater()->set_number_of_copies(); }, "number_of_copies", nullptr, + []() { return plater()->can_increase_instances(); }, m_parent); + } + return menu; } @@ -1126,9 +1279,10 @@ void MenuFactory::update_menu_items_instance_manipulation(MenuType type) } } -void MenuFactory::update_object_menu() +void MenuFactory::update_objects_menu() { - append_menu_items_add_volume(&m_object_menu); + append_menu_items_add_volume(mtObjectFFF); + append_menu_items_add_volume(mtObjectSLA); } void MenuFactory::update_default_menu() @@ -1139,12 +1293,6 @@ void MenuFactory::update_default_menu() create_default_menu(); } -void MenuFactory::msw_rescale() -{ - for (MenuWithSeparators* menu : { &m_object_menu, &m_sla_object_menu, &m_part_menu, &m_default_menu }) - msw_rescale_menu(dynamic_cast(menu)); -} - #ifdef _WIN32 // For this class is used code from stackoverflow: // https://stackoverflow.com/questions/257288/is-it-possible-to-write-a-template-to-check-for-a-functions-existence @@ -1174,7 +1322,7 @@ static void update_menu_item_def_colors(T* item) void MenuFactory::sys_color_changed() { for (MenuWithSeparators* menu : { &m_object_menu, &m_sla_object_menu, &m_part_menu, &m_default_menu }) { - msw_rescale_menu(dynamic_cast(menu));// msw_rescale_menu updates just icons, so use it + sys_color_changed_menu(dynamic_cast(menu));// msw_rescale_menu updates just icons, so use it #ifdef _WIN32 // but under MSW we have to update item's bachground color for (wxMenuItem* item : menu->GetMenuItems()) @@ -1187,14 +1335,17 @@ void MenuFactory::sys_color_changed(wxMenuBar* menubar) { for (size_t id = 0; id < menubar->GetMenuCount(); id++) { wxMenu* menu = menubar->GetMenu(id); - msw_rescale_menu(menu); + sys_color_changed_menu(menu); +#ifndef __linux__ + menu->SetupBitmaps(); #ifdef _WIN32 // but under MSW we have to update item's bachground color for (wxMenuItem* item : menu->GetMenuItems()) update_menu_item_def_colors(item); +#endif #endif } - menubar->Refresh(); +// menubar->Refresh(); } diff --git a/src/slic3r/GUI/GUI_Factories.hpp b/src/slic3r/GUI/GUI_Factories.hpp index 0c478a97b2a..515311d0de6 100644 --- a/src/slic3r/GUI/GUI_Factories.hpp +++ b/src/slic3r/GUI/GUI_Factories.hpp @@ -25,7 +25,7 @@ struct SettingsFactory typedef std::map> Bundle; static std::map CATEGORY_ICON; - static wxBitmap get_category_bitmap(const std::string& category_name, bool menu_bmp = true); + static wxBitmapBundle* get_category_bitmap(const std::string& category_name); static Bundle get_bundle(const DynamicPrintConfig* config, bool is_object_settings); static std::vector get_options(bool is_part); }; @@ -33,17 +33,16 @@ struct SettingsFactory class MenuFactory { public: - static const std::vector> ADD_VOLUME_MENU_ITEMS; - static std::vector get_volume_bitmaps(); + static std::vector get_volume_bitmaps(); + static std::vector get_text_volume_bitmaps(); MenuFactory(); ~MenuFactory() = default; void init(wxWindow* parent); void update(); - void update_object_menu(); + void update_objects_menu(); void update_default_menu(); - void msw_rescale(); void sys_color_changed(); static void sys_color_changed(wxMenuBar* menu_bar); @@ -52,6 +51,7 @@ class MenuFactory wxMenu* object_menu(); wxMenu* sla_object_menu(); wxMenu* part_menu(); + wxMenu* text_part_menu(); wxMenu* instance_menu(); wxMenu* layer_menu(); wxMenu* multi_selection_menu(); @@ -67,6 +67,7 @@ class MenuFactory MenuWithSeparators m_object_menu; MenuWithSeparators m_part_menu; + MenuWithSeparators m_text_part_menu; MenuWithSeparators m_sla_object_menu; MenuWithSeparators m_default_menu; MenuWithSeparators m_instance_menu; @@ -78,18 +79,21 @@ class MenuFactory void create_default_menu(); void create_common_object_menu(wxMenu *menu); - void create_object_menu(); - void create_sla_object_menu(); + void append_immutable_part_menu_items(wxMenu* menu); + void append_mutable_part_menu_items(wxMenu* menu); void create_part_menu(); + void create_text_part_menu(); void create_instance_menu(); wxMenu* append_submenu_add_generic(wxMenu* menu, ModelVolumeType type); - void append_menu_items_add_volume(wxMenu* menu); + void append_menu_item_add_text(wxMenu* menu, ModelVolumeType type, bool is_submenu_item = true); + void append_menu_items_add_volume(MenuType type); wxMenuItem* append_menu_item_layers_editing(wxMenu* menu); wxMenuItem* append_menu_item_settings(wxMenu* menu); wxMenuItem* append_menu_item_change_type(wxMenu* menu); wxMenuItem* append_menu_item_instance_to_object(wxMenu* menu); wxMenuItem* append_menu_item_printable(wxMenu* menu); + void append_menu_item_invalidate_cut_info(wxMenu *menu); void append_menu_items_osx(wxMenu* menu); wxMenuItem* append_menu_item_fix_through_netfabb(wxMenu* menu); wxMenuItem* append_menu_item_simplify(wxMenu* menu); @@ -103,8 +107,10 @@ class MenuFactory void append_menu_item_merge_to_multipart_object(wxMenu *menu); // void append_menu_item_merge_to_single_object(wxMenu *menu); void append_menu_items_mirror(wxMenu *menu); + void append_menu_item_edit_text(wxMenu *menu); void append_menu_items_instance_manipulation(wxMenu *menu); void update_menu_items_instance_manipulation(MenuType type); + void append_menu_items_split(wxMenu *menu); }; }} diff --git a/src/slic3r/GUI/GUI_Geometry.cpp b/src/slic3r/GUI/GUI_Geometry.cpp new file mode 100644 index 00000000000..b0ed0e04fc5 --- /dev/null +++ b/src/slic3r/GUI/GUI_Geometry.cpp @@ -0,0 +1,9 @@ +#include "libslic3r/libslic3r.h" +#include "GUI_Geometry.hpp" + +namespace Slic3r { +namespace GUI { + + +} // namespace Slic3r +} // namespace GUI diff --git a/src/slic3r/GUI/GUI_Geometry.hpp b/src/slic3r/GUI/GUI_Geometry.hpp new file mode 100644 index 00000000000..b18e4ae5a53 --- /dev/null +++ b/src/slic3r/GUI/GUI_Geometry.hpp @@ -0,0 +1,78 @@ +#ifndef slic3r_GUI_Geometry_hpp_ +#define slic3r_GUI_Geometry_hpp_ + +namespace Slic3r { +namespace GUI { + +enum class ECoordinatesType : unsigned char +{ + World, + Instance, + Local +}; + +class TransformationType +{ +public: + enum Enum { + // Transforming in a world coordinate system + World = 0, + // Transforming in a instance coordinate system + Instance = 1, + // Transforming in a local coordinate system + Local = 2, + // Absolute transformations, allowed in local coordinate system only. + Absolute = 0, + // Relative transformations, allowed in both local and world coordinate system. + Relative = 4, + // For group selection, the transformation is performed as if the group made a single solid body. + Joint = 0, + // For group selection, the transformation is performed on each object independently. + Independent = 8, + + World_Relative_Joint = World | Relative | Joint, + World_Relative_Independent = World | Relative | Independent, + Instance_Absolute_Joint = Instance | Absolute | Joint, + Instance_Absolute_Independent = Instance | Absolute | Independent, + Instance_Relative_Joint = Instance | Relative | Joint, + Instance_Relative_Independent = Instance | Relative | Independent, + Local_Absolute_Joint = Local | Absolute | Joint, + Local_Absolute_Independent = Local | Absolute | Independent, + Local_Relative_Joint = Local | Relative | Joint, + Local_Relative_Independent = Local | Relative | Independent, + }; + + TransformationType() : m_value(World) {} + TransformationType(Enum value) : m_value(value) {} + TransformationType& operator=(Enum value) { m_value = value; return *this; } + + Enum operator()() const { return m_value; } + bool has(Enum v) const { return ((unsigned int)m_value & (unsigned int)v) != 0; } + + void set_world() { this->remove(Instance); this->remove(Local); } + void set_instance() { this->remove(Local); this->add(Instance); } + void set_local() { this->remove(Instance); this->add(Local); } + void set_absolute() { this->remove(Relative); } + void set_relative() { this->add(Relative); } + void set_joint() { this->remove(Independent); } + void set_independent() { this->add(Independent); } + + bool world() const { return !this->has(Instance) && !this->has(Local); } + bool instance() const { return this->has(Instance); } + bool local() const { return this->has(Local); } + bool absolute() const { return !this->has(Relative); } + bool relative() const { return this->has(Relative); } + bool joint() const { return !this->has(Independent); } + bool independent() const { return this->has(Independent); } + +private: + void add(Enum v) { m_value = Enum((unsigned int)m_value | (unsigned int)v); } + void remove(Enum v) { m_value = Enum((unsigned int)m_value & (~(unsigned int)v)); } + + Enum m_value; +}; + +} // namespace Slic3r +} // namespace GUI + +#endif // slic3r_GUI_Geometry_hpp_ diff --git a/src/slic3r/GUI/GUI_Init.cpp b/src/slic3r/GUI/GUI_Init.cpp index 92223a767d9..bf65ec89035 100644 --- a/src/slic3r/GUI/GUI_Init.cpp +++ b/src/slic3r/GUI/GUI_Init.cpp @@ -1,3 +1,4 @@ +#include "libslic3r/Technologies.hpp" #include "GUI_Init.hpp" #include "libslic3r/AppConfig.hpp" @@ -9,6 +10,8 @@ #include "slic3r/GUI/format.hpp" #include "slic3r/GUI/MainFrame.hpp" #include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/I18N.hpp" + // To show a message box if GUI initialization ends up with an exception thrown. #include @@ -23,6 +26,12 @@ namespace Slic3r { namespace GUI { +const std::vector OpenGLVersions::core_str = { "3.2", "3.3", "4.0", "4.1", "4.2", "4.3", "4.4", "4.5", "4.6" }; +const std::vector OpenGLVersions::precore_str = { "2.0", "2.1", "3.0", "3.1" }; + +const std::vector> OpenGLVersions::core = { {3,2}, {3,3}, {4,0}, {4,1}, {4,2}, {4,3}, {4,4}, {4,5}, {4,6} }; +const std::vector> OpenGLVersions::precore = { {2,0}, {2,1}, {3,0}, {3,1} }; + int GUI_Run(GUI_InitParams ¶ms) { #if __APPLE__ @@ -40,17 +49,15 @@ int GUI_Run(GUI_InitParams ¶ms) GUI::GUI_App* gui = new GUI::GUI_App(params.start_as_gcodeviewer ? GUI::GUI_App::EAppMode::GCodeViewer : GUI::GUI_App::EAppMode::Editor); if (gui->get_app_mode() != GUI::GUI_App::EAppMode::GCodeViewer) { // G-code viewer is currently not performing instance check, a new G-code viewer is started every time. - bool gui_single_instance_setting = gui->app_config->get("single_instance") == "1"; + bool gui_single_instance_setting = gui->app_config->get_bool("single_instance"); if (Slic3r::instance_check(params.argc, params.argv, gui_single_instance_setting)) { //TODO: do we have delete gui and other stuff? return -1; } } -// gui->autosave = m_config.opt_string("autosave"); GUI::GUI_App::SetInstance(gui); gui->init_params = ¶ms; - return wxEntry(params.argc, params.argv); } catch (const Slic3r::Exception &ex) { boost::nowide::cerr << ex.what() << std::endl; diff --git a/src/slic3r/GUI/GUI_Init.hpp b/src/slic3r/GUI/GUI_Init.hpp index 2adf618a47f..14d0c4e2804 100644 --- a/src/slic3r/GUI/GUI_Init.hpp +++ b/src/slic3r/GUI/GUI_Init.hpp @@ -8,6 +8,15 @@ namespace Slic3r { namespace GUI { +struct OpenGLVersions +{ + static const std::vector core_str; + static const std::vector precore_str; + + static const std::vector> core; + static const std::vector> precore; +}; + struct GUI_InitParams { int argc; @@ -21,6 +30,15 @@ struct GUI_InitParams std::vector input_files; bool start_as_gcodeviewer; + bool start_downloader; + bool delete_after_load; + std::string download_url; +#if ENABLE_GL_CORE_PROFILE + std::pair opengl_version; +#if ENABLE_OPENGL_DEBUG_OPTION + bool opengl_debug; +#endif // ENABLE_OPENGL_DEBUG_OPTION +#endif // ENABLE_GL_CORE_PROFILE }; int GUI_Run(GUI_InitParams ¶ms); diff --git a/src/slic3r/GUI/GUI_ObjectLayers.cpp b/src/slic3r/GUI/GUI_ObjectLayers.cpp index 0587f353fc4..6f6ec523808 100644 --- a/src/slic3r/GUI/GUI_ObjectLayers.cpp +++ b/src/slic3r/GUI/GUI_ObjectLayers.cpp @@ -234,47 +234,47 @@ void ObjectLayers::UpdateAndShow(const bool show) void ObjectLayers::msw_rescale() { - m_bmp_delete.msw_rescale(); - m_bmp_add.msw_rescale(); - - m_grid_sizer->SetHGap(wxGetApp().em_unit()); - - // rescale edit-boxes - const int cells_cnt = m_grid_sizer->GetCols() * m_grid_sizer->GetEffectiveRowsCount(); - for (int i = 0; i < cells_cnt; ++i) { - const wxSizerItem* item = m_grid_sizer->GetItem(i); - if (item->IsWindow()) { - LayerRangeEditor* editor = dynamic_cast(item->GetWindow()); - if (editor != nullptr) - editor->msw_rescale(); - } - else if (item->IsSizer()) // case when we have editor with buttons - { - wxSizerItem* e_item = item->GetSizer()->GetItem(size_t(0)); // editor - if (e_item->IsWindow()) { - LayerRangeEditor* editor = dynamic_cast(e_item->GetWindow()); - if (editor != nullptr) - editor->msw_rescale(); - } - - if (item->GetSizer()->GetItemCount() > 2) // if there are Add/Del buttons - for (size_t btn : {2, 3}) { // del_btn, add_btn - wxSizerItem* b_item = item->GetSizer()->GetItem(btn); - if (b_item->IsWindow()) { - auto button = dynamic_cast(b_item->GetWindow()); - if (button != nullptr) - button->msw_rescale(); - } - } - } - } + //m_bmp_delete.msw_rescale(); + //m_bmp_add.msw_rescale(); + + //m_grid_sizer->SetHGap(wxGetApp().em_unit()); + + //// rescale edit-boxes + //const int cells_cnt = m_grid_sizer->GetCols() * m_grid_sizer->GetEffectiveRowsCount(); + //for (int i = 0; i < cells_cnt; ++i) { + // const wxSizerItem* item = m_grid_sizer->GetItem(i); + // if (item->IsWindow()) { + // LayerRangeEditor* editor = dynamic_cast(item->GetWindow()); + // if (editor != nullptr) + // editor->msw_rescale(); + // } + // else if (item->IsSizer()) // case when we have editor with buttons + // { + // wxSizerItem* e_item = item->GetSizer()->GetItem(size_t(0)); // editor + // if (e_item->IsWindow()) { + // LayerRangeEditor* editor = dynamic_cast(e_item->GetWindow()); + // if (editor != nullptr) + // editor->msw_rescale(); + // } + + // if (item->GetSizer()->GetItemCount() > 2) // if there are Add/Del buttons + // for (size_t btn : {2, 3}) { // del_btn, add_btn + // wxSizerItem* b_item = item->GetSizer()->GetItem(btn); + // if (b_item->IsWindow()) { + // auto button = dynamic_cast(b_item->GetWindow()); + // if (button != nullptr) + // button->msw_rescale(); + // } + // } + // } + //} m_grid_sizer->Layout(); } void ObjectLayers::sys_color_changed() { - m_bmp_delete.msw_rescale(); - m_bmp_add.msw_rescale(); + m_bmp_delete.sys_color_changed(); + m_bmp_add.sys_color_changed(); // rescale edit-boxes const int cells_cnt = m_grid_sizer->GetCols() * m_grid_sizer->GetEffectiveRowsCount(); @@ -286,7 +286,7 @@ void ObjectLayers::sys_color_changed() if (b_item->IsWindow()) { auto button = dynamic_cast(b_item->GetWindow()); if (button != nullptr) - button->msw_rescale(); + button->sys_color_changed(); } } } diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 6eda34b3d74..863729fc460 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1,5 +1,6 @@ #include "libslic3r/libslic3r.h" #include "libslic3r/PresetBundle.hpp" +#include "libslic3r/TextConfiguration.hpp" #include "GUI_ObjectList.hpp" #include "GUI_Factories.hpp" #include "GUI_ObjectManipulation.hpp" @@ -11,6 +12,8 @@ #include "GalleryDialog.hpp" #include "MainFrame.hpp" #include "slic3r/Utils/UndoRedo.hpp" +#include "Gizmos/GLGizmoCut.hpp" +#include "Gizmos/GLGizmoScale.hpp" #include "OptionsGroup.hpp" #include "Tab.hpp" @@ -214,13 +217,34 @@ ObjectList::ObjectList(wxWindow* parent) : Bind(wxEVT_DATAVIEW_ITEM_DROP_POSSIBLE, &ObjectList::OnDropPossible, this); Bind(wxEVT_DATAVIEW_ITEM_DROP, &ObjectList::OnDrop, this); -#ifdef __WXMSW__ Bind(wxEVT_DATAVIEW_ITEM_EDITING_STARTED, &ObjectList::OnEditingStarted, this); -#endif /* __WXMSW__ */ Bind(wxEVT_DATAVIEW_ITEM_EDITING_DONE, &ObjectList::OnEditingDone, this); Bind(wxEVT_DATAVIEW_ITEM_VALUE_CHANGED, &ObjectList::ItemValueChanged, this); + Bind(wxEVT_DATAVIEW_ITEM_ACTIVATED, [this](wxDataViewEvent& event) { + wxDataViewItem item; + wxDataViewColumn* col; + this->HitTest(this->get_mouse_position_in_control(), item, col); + + // if there is text item to editing, than edit just a name without Text marker + if (auto type = m_objects_model->GetItemType(item); + type & (itObject | itVolume) && col->GetModelColumn() == colName) { + if (ModelObject* obj = object(m_objects_model->GetObjectIdByItem(item))) { + if (type == itObject && obj->is_text()) + m_objects_model->SetName(from_u8(obj->name), item); + else if (type == itVolume && obj->volumes[m_objects_model->GetVolumeIdByItem(item)]->is_text()) { + // we cant rename text parts + event.StopPropagation(); + return; + } + } + } + + this->EditItem(item, col); + event.StopPropagation(); + }); + Bind(wxCUSTOMEVT_LAST_VOLUME_IS_DELETED, [this](wxCommandEvent& e) { last_volume_is_deleted(e.GetInt()); }); Bind(wxEVT_SIZE, ([this](wxSizeEvent &e) { @@ -239,6 +263,8 @@ ObjectList::ObjectList(wxWindow* parent) : ObjectList::~ObjectList() { + if (m_objects_model) + m_objects_model->DecRef(); } void ObjectList::set_min_height() @@ -391,6 +417,13 @@ MeshErrorsInfo ObjectList::get_mesh_errors_info(const int obj_idx, const int vol if (obj_idx < 0) return { {}, {} }; // hide tooltip + const ModelObject* object = (*m_objects)[obj_idx]; + if (vol_idx != -1 && vol_idx >= int(object->volumes.size())) { + if (sidebar_info) + *sidebar_info = _L("Wrong volume index") + " "; + return { {}, {} }; // hide tooltip + } + const TriangleMeshStats& stats = vol_idx == -1 ? (*m_objects)[obj_idx]->get_object_stl_stats() : (*m_objects)[obj_idx]->volumes[vol_idx]->mesh().stats(); @@ -622,6 +655,11 @@ void ObjectList::update_extruder_in_config(const wxDataViewItem& item) wxGetApp().plater()->update(); } +static wxString get_item_name(const std::string& name, const bool is_text_volume) +{ + return (is_text_volume ? _L("Text") + " - " : "") + from_u8(name); +} + void ObjectList::update_name_in_model(const wxDataViewItem& item) const { const int obj_idx = m_objects_model->GetObjectIdByItem(item); @@ -632,29 +670,48 @@ void ObjectList::update_name_in_model(const wxDataViewItem& item) const ModelObject* obj = object(obj_idx); if (m_objects_model->GetItemType(item) & itObject) { - obj->name = m_objects_model->GetName(item).ToUTF8().data(); + obj->name = into_u8(m_objects_model->GetName(item)); // if object has just one volume, rename this volume too - if (obj->volumes.size() == 1) + if (obj->is_text()) { obj->volumes[0]->name = obj->name; + //update object name with text marker in ObjectList + m_objects_model->SetName(get_item_name(obj->name, true), item); + } return; } - if (volume_id < 0) return; - obj->volumes[volume_id]->name = m_objects_model->GetName(item).ToUTF8().data(); + if (volume_id < 0) + return; + + // Renaming of the text volume is suppressed + // So, revert the name in object list + if (obj->volumes[volume_id]->is_text()) { + m_objects_model->SetName(get_item_name(obj->volumes[volume_id]->name, true), item); + return; + } + obj->volumes[volume_id]->name = into_u8(m_objects_model->GetName(item)); } void ObjectList::update_name_in_list(int obj_idx, int vol_idx) const { if (obj_idx < 0) return; wxDataViewItem item = GetSelection(); - if (!item || !(m_objects_model->GetItemType(item) & (itVolume | itObject))) + auto type = m_objects_model->GetItemType(item); + if (!item || !(type & (itVolume | itObject))) return; - wxString new_name = from_u8(object(obj_idx)->volumes[vol_idx]->name); + ModelObject* obj = object(obj_idx); + const bool is_text_volume = type == itVolume ? obj->volumes[vol_idx]->is_text() : obj->is_text(); + const wxString new_name = get_item_name(object(obj_idx)->volumes[vol_idx]->name, is_text_volume); + if (new_name.IsEmpty() || m_objects_model->GetName(item) == new_name) return; m_objects_model->SetName(new_name, item); + + // if object has just one volume, rename object too + if (obj->volumes.size() == 1) + obj->name = obj->volumes.front()->name; } void ObjectList::selection_changed() @@ -663,6 +720,8 @@ void ObjectList::selection_changed() fix_multiselection_conflicts(); + fix_cut_selection(); + // update object selection on Plater if (!m_prevent_canvas_selection_update) update_selections_on_canvas(); @@ -819,7 +878,7 @@ void ObjectList::paste_objects_into_list(const std::vector& object_idxs) wxDataViewItemArray items; for (const size_t object : object_idxs) { - add_object_to_list(object); + add_object_to_list(object, false); items.Add(m_objects_model->GetItemById(object)); } @@ -949,11 +1008,17 @@ void ObjectList::show_context_menu(const bool evt_context_menu) const ItemType type = m_objects_model->GetItemType(item); if (!(type & (itObject | itVolume | itLayer | itInstance))) return; - - menu = type & itInstance ? plater->instance_menu() : - type & itLayer ? plater->layer_menu() : - m_objects_model->GetParent(item) != wxDataViewItem(nullptr) ? plater->part_menu() : - printer_technology() == ptFFF ? plater->object_menu() : plater->sla_object_menu(); + if (type & itVolume) { + int obj_idx, vol_idx; + get_selected_item_indexes(obj_idx, vol_idx, item); + if (obj_idx < 0 || vol_idx < 0) + return; + menu = object(obj_idx)->volumes[vol_idx]->text_configuration.has_value() ? plater->text_part_menu() : plater->part_menu(); + } + else + menu = type & itInstance ? plater->instance_menu() : + type & itLayer ? plater->layer_menu() : + printer_technology() == ptFFF ? plater->object_menu() : plater->sla_object_menu(); } else if (evt_context_menu) menu = plater->default_menu(); @@ -966,15 +1031,14 @@ void ObjectList::show_context_menu(const bool evt_context_menu) void ObjectList::extruder_editing() { wxDataViewItem item = GetSelection(); - if (!item || !(m_objects_model->GetItemType(item) & (itVolume | itObject))) + if (!item || !(m_objects_model->GetItemType(item) & (itVolume | itObject | itLayer))) return; - const int column_width = GetColumn(colExtruder)->GetWidth() + wxSystemSettings::GetMetric(wxSYS_VSCROLL_X) + 5; - - wxPoint pos = this->get_mouse_position_in_control(); - wxSize size = wxSize(column_width, -1); - pos.x = GetColumn(colName)->GetWidth() + GetColumn(colPrint)->GetWidth() + 5; - pos.y -= GetTextExtent("m").y; + wxRect rect = this->GetItemRect(item, GetColumn(colExtruder)); + wxPoint pos = rect.GetPosition(); + pos.y -= 4; + wxSize size = rect.GetSize(); + size.SetWidth(size.GetWidth() + 8); apply_extruder_selector(&m_extruder_editor, this, L("default"), pos, size); @@ -992,6 +1056,7 @@ void ObjectList::extruder_editing() m_extruder_editor->Hide(); update_extruder_in_config(item); + Refresh(); }; // to avoid event propagation to other sidebar items @@ -1185,7 +1250,7 @@ bool ObjectList::can_drop(const wxDataViewItem& item) const if (dragged_item_v_type == item_v_type && dragged_item_v_type != ModelVolumeType::MODEL_PART) return true; - if ((wxGetApp().app_config->get("order_volumes") == "1" && dragged_item_v_type != item_v_type) || // we can't reorder volumes outside of types + if ((wxGetApp().app_config->get_bool("order_volumes") && dragged_item_v_type != item_v_type) || // we can't reorder volumes outside of types item_v_type >= ModelVolumeType::SUPPORT_BLOCKER) // support blockers/enforcers can't change its place return false; @@ -1379,6 +1444,15 @@ bool ObjectList::is_instance_or_object_selected() return selection.is_single_full_instance() || selection.is_single_full_object(); } +bool ObjectList::is_selected_object_cut() +{ + const Selection& selection = scene_selection(); + int obj_idx = selection.get_object_idx(); + if (obj_idx < 0) + return false; + return object(obj_idx)->is_cut(); +} + void ObjectList::load_subobject(ModelVolumeType type, bool from_galery/* = false*/) { if (type == ModelVolumeType::INVALID && from_galery) { @@ -1400,9 +1474,8 @@ void ObjectList::load_subobject(ModelVolumeType type, bool from_galery/* = false wxArrayString input_files; if (from_galery) { - GalleryDialog dlg(this); - if (dlg.ShowModal() != wxID_CLOSE) - dlg.get_input_files(input_files); + if (wxGetApp().gallery_dialog()->show() != wxID_CLOSE) + wxGetApp().gallery_dialog()->get_input_files(input_files); } else wxGetApp().import_model(wxGetApp().tab_panel()->GetPage(0), input_files); @@ -1528,9 +1601,9 @@ void ObjectList::load_modifier(const wxArrayString& input_files, ModelObject& mo const BoundingBoxf3 instance_bb = model_object.instance_bounding_box(instance_idx); // First (any) GLVolume of the selected instance. They all share the same instance matrix. - const GLVolume* v = selection.get_volume(*selection.get_volume_idxs().begin()); + const GLVolume* v = selection.get_first_volume(); const Geometry::Transformation inst_transform = v->get_instance_transformation(); - const Transform3d inv_inst_transform = inst_transform.get_matrix(true).inverse(); + const Transform3d inv_inst_transform = inst_transform.get_matrix_no_offset().inverse(); const Vec3d instance_offset = v->get_instance_offset(); for (size_t i = 0; i < input_files.size(); ++i) { @@ -1579,8 +1652,8 @@ void ObjectList::load_modifier(const wxArrayString& input_files, ModelObject& mo if (from_galery) { // Transform the new modifier to be aligned with the print bed. + new_volume->set_transformation(v->get_instance_transformation().get_matrix_no_offset().inverse()); const BoundingBoxf3 mesh_bb = new_volume->mesh().bounding_box(); - new_volume->set_transformation(Geometry::Transformation::volume_to_bed_transformation(inst_transform, mesh_bb)); // Set the modifier position. // Translate the new modifier to be pickable: move to the left front corner of the instance's bounding box, lift to print bed. const Vec3d offset = Vec3d(instance_bb.max.x(), instance_bb.min.y(), instance_bb.min.z()) + 0.5 * mesh_bb.size() - instance_offset; @@ -1648,17 +1721,22 @@ void ObjectList::load_generic_subobject(const std::string& type_name, const Mode ModelVolume *new_volume = model_object.add_volume(std::move(mesh), type); // First (any) GLVolume of the selected instance. They all share the same instance matrix. - const GLVolume* v = selection.get_volume(*selection.get_volume_idxs().begin()); + const GLVolume* v = selection.get_first_volume(); // Transform the new modifier to be aligned with the print bed. - const BoundingBoxf3 mesh_bb = new_volume->mesh().bounding_box(); - new_volume->set_transformation(Geometry::Transformation::volume_to_bed_transformation(v->get_instance_transformation(), mesh_bb)); + new_volume->set_transformation(v->get_instance_transformation().get_matrix_no_offset().inverse()); + const BoundingBoxf3 mesh_bb = new_volume->mesh().bounding_box(); // Set the modifier position. - auto offset = (type_name == "Slab") ? - // Slab: Lift to print bed - Vec3d(0., 0., 0.5 * mesh_bb.size().z() + instance_bb.min.z() - v->get_instance_offset().z()) : + Vec3d offset; + if (type_name == "Slab") { + Vec3d inst_center = instance_bb.center() - v->get_instance_offset(); + // Slab: Lift to print bed and and push to the center of instance + offset = Vec3d(inst_center.x(), inst_center.y(), 0.5 * mesh_bb.size().z() + instance_bb.min.z() - v->get_instance_offset().z()); + } + else { // Translate the new modifier to be pickable: move to the left front corner of the instance's bounding box, lift to print bed. - Vec3d(instance_bb.max.x(), instance_bb.min.y(), instance_bb.min.z()) + 0.5 * mesh_bb.size() - v->get_instance_offset(); - new_volume->set_offset(v->get_instance_transformation().get_matrix(true).inverse() * offset); + offset = Vec3d(instance_bb.max.x(), instance_bb.min.y(), instance_bb.min.z()) + 0.5 * mesh_bb.size() - v->get_instance_offset(); + } + new_volume->set_offset(v->get_instance_transformation().get_matrix_no_offset().inverse() * offset); const wxString name = _L("Generic") + "-" + _(type_name); new_volume->name = into_u8(name); @@ -1679,6 +1757,9 @@ void ObjectList::load_generic_subobject(const std::string& type_name, const Mode // update printable state on canvas wxGetApp().plater()->canvas3D()->update_instance_printable_state_for_object((size_t)obj_idx); + if (model_object.is_cut()) + update_info_items(obj_idx); + selection_changed(); } @@ -1689,16 +1770,14 @@ void ObjectList::load_shape_object(const std::string& type_name) if (selection.get_object_idx() != -1) return; - const int obj_idx = m_objects->size(); - if (obj_idx < 0) - return; - take_snapshot(_L("Add Shape")); // Create mesh BoundingBoxf3 bb; TriangleMesh mesh = create_mesh(type_name, bb); - load_mesh_object(mesh, _L("Shape") + "-" + _(type_name)); + load_mesh_object(mesh, _u8L("Shape") + "-" + type_name); + if (!m_objects->empty()) + m_objects->back()->volumes.front()->source.is_from_builtin_objects = true; wxGetApp().mainframe->update_title(); } @@ -1708,10 +1787,10 @@ void ObjectList::load_shape_object_from_gallery() return;// Add nothing if something is selected on 3DScene wxArrayString input_files; - GalleryDialog gallery_dlg(this); - if (gallery_dlg.ShowModal() == wxID_CLOSE) + GalleryDialog* gallery_dlg = wxGetApp().gallery_dialog(); + if (gallery_dlg->show() == wxID_CLOSE) return; - gallery_dlg.get_input_files(input_files); + gallery_dlg->get_input_files(input_files); if (input_files.IsEmpty()) return; load_shape_object_from_gallery(input_files); @@ -1734,7 +1813,12 @@ void ObjectList::load_shape_object_from_gallery(const wxArrayString& input_files wxGetApp().mainframe->update_title(); } -void ObjectList::load_mesh_object(const TriangleMesh &mesh, const wxString &name, bool center) +void ObjectList::load_mesh_object( + const TriangleMesh & mesh, + const std::string & name, + bool center, + const TextConfiguration *text_config /* = nullptr*/, + const Transform3d * transformation /* = nullptr*/) { PlaterAfterLoadAutoArrange plater_after_load_auto_arrange; // Add mesh to model as a new object @@ -1745,22 +1829,29 @@ void ObjectList::load_mesh_object(const TriangleMesh &mesh, const wxString &name #endif /* _DEBUG */ std::vector object_idxs; - auto bb = mesh.bounding_box(); ModelObject* new_object = model.add_object(); - new_object->name = into_u8(name); + new_object->name = name; new_object->add_instance(); // each object should have at list one instance ModelVolume* new_volume = new_object->add_volume(mesh); - new_object->sort_volumes(wxGetApp().app_config->get("order_volumes") == "1"); - new_volume->name = into_u8(name); + new_object->sort_volumes(wxGetApp().app_config->get_bool("order_volumes")); + new_volume->name = name; + if (text_config) + new_volume->text_configuration = *text_config; // set a default extruder value, since user can't add it manually new_volume->config.set_key_value("extruder", new ConfigOptionInt(0)); new_object->invalidate_bounding_box(); - new_object->translate(-bb.center()); - - new_object->instances[0]->set_offset(center ? - to_3d(wxGetApp().plater()->build_volume().bounding_volume2d().center(), -new_object->origin_translation.z()) : + if (transformation) { + assert(!center); + Slic3r::Geometry::Transformation tr(*transformation); + new_object->instances[0]->set_transformation(tr); + } else { + auto bb = mesh.bounding_box(); + new_object->translate(-bb.center()); + new_object->instances[0]->set_offset( + center ? to_3d(wxGetApp().plater()->build_volume().bounding_volume2d().center(), -new_object->origin_translation.z()) : bb.center()); + } new_object->ensure_on_bed(); @@ -1776,25 +1867,26 @@ void ObjectList::load_mesh_object(const TriangleMesh &mesh, const wxString &name #endif /* _DEBUG */ } -void ObjectList::del_object(const int obj_idx) +bool ObjectList::del_object(const int obj_idx) { - wxGetApp().plater()->delete_object_from_model(obj_idx); + return wxGetApp().plater()->delete_object_from_model(obj_idx); } // Delete subobject -void ObjectList::del_subobject_item(wxDataViewItem& item) +bool ObjectList::del_subobject_item(wxDataViewItem& item) { - if (!item) return; + if (!item) return false; int obj_idx, idx; ItemType type; m_objects_model->GetItemInfo(item, type, obj_idx, idx); if (type == itUndef) - return; + return false; wxDataViewItem parent = m_objects_model->GetParent(item); + InfoItemType item_info_type = m_objects_model->GetInfoItemType(item); if (type & itSettings) del_settings_from_config(parent); else if (type & itInstanceRoot && obj_idx != -1) @@ -1804,11 +1896,9 @@ void ObjectList::del_subobject_item(wxDataViewItem& item) else if (type & itLayer && obj_idx != -1) del_layer_from_object(obj_idx, m_objects_model->GetLayerRangeByItem(item)); else if (type & itInfo && obj_idx != -1) - del_info_item(obj_idx, m_objects_model->GetInfoItemType(item)); - else if (idx == -1) - return; - else if (!del_subobject_from_object(obj_idx, idx, type)) - return; + del_info_item(obj_idx, item_info_type); + else if (idx == -1 || !del_subobject_from_object(obj_idx, idx, type)) + return false; // If last volume item with warning was deleted, unmark object item if (type & itVolume) { @@ -1816,8 +1906,13 @@ void ObjectList::del_subobject_item(wxDataViewItem& item) m_objects_model->UpdateWarningIcon(parent, icon_name); } - m_objects_model->Delete(item); - update_info_items(obj_idx); + if (!(type & itInfo) || item_info_type != InfoItemType::CutConnectors) { + // Connectors Item is already updated/deleted inside the del_info_item() + m_objects_model->Delete(item); + update_info_items(obj_idx); + } + + return true; } void ObjectList::del_info_item(const int obj_idx, InfoItemType type) @@ -1840,6 +1935,13 @@ void ObjectList::del_info_item(const int obj_idx, InfoItemType type) mv->seam_facets.reset(); break; + case InfoItemType::CutConnectors: + if (!del_from_cut_object(true)) { + // there is no need to post EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS if nothing was changed + return; + } + break; + case InfoItemType::MmuSegmentation: cnv->get_gizmos_manager().reset_all_states(); Plater::TakeSnapshot(plater, _L("Remove Multi Material painting")); @@ -1929,12 +2031,43 @@ void ObjectList::del_layers_from_object(const int obj_idx) changed_object(obj_idx); } +bool ObjectList::del_from_cut_object(bool is_cut_connector, bool is_model_part/* = false*/, bool is_negative_volume/* = false*/) +{ + const long buttons_style = is_cut_connector ? (wxYES | wxNO | wxCANCEL) : (wxYES | wxCANCEL); + + const wxString title = is_cut_connector ? _L("Delete connector from object which is a part of cut") : + is_model_part ? _L("Delete solid part from object which is a part of cut") : + is_negative_volume ? _L("Delete negative volume from object which is a part of cut") : ""; + + const wxString msg_end = is_cut_connector ? ("\n" + _L("To save cut information you can delete all connectors from all related objects.")) : ""; + + InfoDialog dialog(wxGetApp().plater(), title, + _L("This action will break a cut information.\n" + "After that PrusaSlicer can't guarantee model consistency.") + "\n\n" + + _L("To manipulate with solid parts or negative volumes you have to invalidate cut infornation first." + msg_end ), + false, buttons_style | wxCANCEL_DEFAULT | wxICON_WARNING); + + dialog.SetButtonLabel(wxID_YES, _L("Invalidate cut info")); + if (is_cut_connector) + dialog.SetButtonLabel(wxID_NO, _L("Delete all connectors")); + + const int answer = dialog.ShowModal(); + if (answer == wxID_CANCEL) + return false; + + if (answer == wxID_YES) + invalidate_cut_info_for_selection(); + else if (answer == wxID_NO) + delete_all_connectors_for_selection(); + return true; +} + bool ObjectList::del_subobject_from_object(const int obj_idx, const int idx, const int type) { assert(idx >= 0); - if (obj_idx == 1000 || idx<0) - // Cannot delete a wipe tower or volume with negative id - return false; + if (m_objects->empty() || int(m_objects->size()) <= obj_idx) + // Cannot delete a wipe tower + return false; ModelObject* object = (*m_objects)[obj_idx]; @@ -1950,19 +2083,24 @@ bool ObjectList::del_subobject_from_object(const int obj_idx, const int idx, con Slic3r::GUI::show_error(nullptr, _L("From Object List You can't delete the last solid part from object.")); return false; } + if (object->is_cut() && (volume->is_model_part() || volume->is_negative_volume())) { + del_from_cut_object(volume->is_cut_connector(), volume->is_model_part(), volume->is_negative_volume()); + // in any case return false to break the deletion + return false; + } take_snapshot(_L("Delete Subobject")); object->delete_volume(idx); if (object->volumes.size() == 1) { + wxDataViewItem obj_item = m_objects_model->GetItemById(obj_idx); const auto last_volume = object->volumes[0]; if (!last_volume->config.empty()) { object->config.apply(last_volume->config); last_volume->config.reset(); // update extruder color in ObjectList - wxDataViewItem obj_item = m_objects_model->GetItemById(obj_idx); if (obj_item) { wxString extruder = object->config.has("extruder") ? wxString::Format("%d", object->config.extruder()) : _L("default"); m_objects_model->SetExtruder(extruder, obj_item); @@ -1970,6 +2108,9 @@ bool ObjectList::del_subobject_from_object(const int obj_idx, const int idx, con // add settings to the object, if it has them add_settings_item(obj_item, &object->config.get()); } + + if (last_volume->is_text()) + m_objects_model->SetName(get_item_name(/*last_volume*/object->name, true), obj_item); } } else if (type == itInstance) { @@ -1977,6 +2118,10 @@ bool ObjectList::del_subobject_from_object(const int obj_idx, const int idx, con Slic3r::GUI::show_error(nullptr, _L("Last instance of an object cannot be deleted.")); return false; } + if (object->is_cut()) { + Slic3r::GUI::show_error(nullptr, _L("Instance cannot be deleted from cut object.")); + return false; + } take_snapshot(_L("Delete Instance")); object->delete_instance(idx); @@ -2008,36 +2153,25 @@ void ObjectList::split() take_snapshot(_(L("Split to Parts"))); - volume->split(nozzle_dmrs_cnt); - - wxBusyCursor wait; + // Before splitting volume we have to remove all custom supports, seams, and multimaterial painting. + wxGetApp().plater()->clear_before_change_mesh(obj_idx, _u8L("Custom supports, seams and multimaterial painting were " + "removed after splitting the object.")); - auto model_object = (*m_objects)[obj_idx]; - - auto parent = m_objects_model->GetTopParent(item); - if (parent) - m_objects_model->DeleteVolumeChildren(parent); - else - parent = item; + volume->split(nozzle_dmrs_cnt); - for (const ModelVolume* volume : model_object->volumes) { - const wxDataViewItem& vol_item = m_objects_model->AddVolumeChild(parent, from_u8(volume->name), - volume->type(),// is_modifier() ? ModelVolumeType::PARAMETER_MODIFIER : ModelVolumeType::MODEL_PART, - get_warning_icon_name(volume->mesh().stats()), - volume->config.has("extruder") ? volume->config.extruder() : 0, - false); - // add settings to the part, if it has those - add_settings_item(vol_item, &volume->config.get()); - } + (*m_objects)[obj_idx]->input_file.clear(); - model_object->input_file.clear(); + wxBusyCursor wait; - if (parent == item) - Expand(parent); + add_volumes_to_object_in_list(obj_idx); changed_object(obj_idx); // update printable state for new volumes on canvas3D wxGetApp().plater()->canvas3D()->update_instance_printable_state_for_object(obj_idx); + + // After removing custom supports, seams, and multimaterial painting, we have to update info about the object to remove information about + // custom supports, seams, and multimaterial painting in the right panel. + wxGetApp().obj_list()->update_info_items(obj_idx); } void ObjectList::merge(bool to_multipart_object) @@ -2179,7 +2313,7 @@ void ObjectList::merge(bool to_multipart_object) const Vec3d vol_offset = volume_offset_correction* new_volume->get_offset(); new_volume->set_offset(vol_offset); } - new_object->sort_volumes(wxGetApp().app_config->get("order_volumes") == "1"); + new_object->sort_volumes(wxGetApp().app_config->get_bool("order_volumes")); // merge settings auto new_opt_keys = config.keys(); @@ -2352,13 +2486,19 @@ bool ObjectList::is_splittable(bool to_objects) auto obj_idx = get_selected_obj_idx(); if (obj_idx < 0) return false; - if ((*m_objects)[obj_idx]->volumes.size() > 1) + const ModelObject* object = (*m_objects)[obj_idx]; + if (object->is_cut()) + return false; + if (object->volumes.size() > 1) return true; - return (*m_objects)[obj_idx]->volumes[0]->is_splittable(); + return object->volumes[0]->is_splittable(); } return false; } + if (wxGetApp().get_mode() == comSimple) + return false; // suppress to split to parts for simple mode + ModelVolume* volume; if (!get_volume_by_item(item, volume) || !volume) return false; @@ -2387,9 +2527,94 @@ bool ObjectList::can_split_instances() return selection.is_multiple_full_instance() || selection.is_single_full_instance(); } +bool ObjectList::has_selected_cut_object() const +{ + wxDataViewItemArray sels; + GetSelections(sels); + if (sels.IsEmpty()) + return false; + + for (wxDataViewItem item : sels) { + const int obj_idx = m_objects_model->GetObjectIdByItem(item); + if (obj_idx >= 0 && object(obj_idx)->is_cut()) + return true; + } + + return false; +} + +void ObjectList::invalidate_cut_info_for_selection() +{ + const wxDataViewItem item = GetSelection(); + if (item) { + const int obj_idx = m_objects_model->GetObjectIdByItem(item); + if (obj_idx >= 0) + invalidate_cut_info_for_object(size_t(obj_idx)); + } +} + +void ObjectList::invalidate_cut_info_for_object(int obj_idx) +{ + ModelObject* init_obj = object(obj_idx); + if (!init_obj->is_cut()) + return; + + take_snapshot(_L("Invalidate cut info")); + + const CutObjectBase cut_id = init_obj->cut_id; + // invalidate cut for related objects (which have the same cut_id) + for (size_t idx = 0; idx < m_objects->size(); idx++) + if (ModelObject* obj = object(int(idx)); obj->cut_id.is_equal(cut_id)) { + obj->invalidate_cut(); + update_info_items(idx); + add_volumes_to_object_in_list(idx); + } + + update_lock_icons_for_model(); +} + +void ObjectList::delete_all_connectors_for_selection() +{ + const wxDataViewItem item = GetSelection(); + if (item) { + const int obj_idx = m_objects_model->GetObjectIdByItem(item); + if (obj_idx >= 0) + delete_all_connectors_for_object(size_t(obj_idx)); + } +} + +void ObjectList::delete_all_connectors_for_object(int obj_idx) +{ + ModelObject* init_obj = object(obj_idx); + if (!init_obj->is_cut()) + return; + + take_snapshot(_L("Delete all connectors")); + + const CutObjectBase cut_id = init_obj->cut_id; + // Delete all connectors for related objects (which have the same cut_id) + Model& model = wxGetApp().plater()->model(); + for (int idx = int(m_objects->size())-1; idx >= 0; idx--) + if (ModelObject* obj = object(idx); obj->cut_id.is_equal(cut_id)) { + obj->delete_connectors(); + + if (obj->volumes.empty() || !obj->has_solid_mesh()) { + model.delete_object(idx); + m_objects_model->Delete(m_objects_model->GetItemById(idx)); + continue; + } + + update_info_items(idx); + add_volumes_to_object_in_list(idx); + changed_object(int(idx)); + } + + update_lock_icons_for_model(); +} + bool ObjectList::can_merge_to_multipart_object() const { - if (printer_technology() == ptSLA) + if (has_selected_cut_object()) return false; wxDataViewItemArray sels; @@ -2415,6 +2640,11 @@ bool ObjectList::can_merge_to_single_object() const return (*m_objects)[obj_idx]->volumes.size() > 1; } +wxPoint ObjectList::get_mouse_position_in_control() const +{ + return wxGetMousePosition() - this->GetScreenPosition(); +} + // NO_PARAMETERS function call means that changed object index will be determine from Selection() void ObjectList::changed_object(const int obj_idx/* = -1*/) const { @@ -2433,14 +2663,81 @@ void ObjectList::part_selection_changed() bool update_and_show_settings = false; bool update_and_show_layers = false; + bool enable_manipulation {true}; + bool disable_ss_manipulation {false}; + bool disable_ununiform_scale {false}; + + ECoordinatesType coordinates_type = wxGetApp().obj_manipul()->get_coordinates_type(); + const auto item = GetSelection(); - if ( multiple_selection() || (item && m_objects_model->GetItemType(item) == itInstanceRoot )) { - og_name = _L("Group manipulation"); + GLGizmosManager& gizmos_mgr = wxGetApp().plater()->canvas3D()->get_gizmos_manager(); + + if (item && m_objects_model->GetItemType(item) == itInfo && m_objects_model->GetInfoItemType(item) == InfoItemType::CutConnectors) { + og_name = _L("Cut Connectors information"); + update_and_show_manipulations = true; + enable_manipulation = false; + disable_ununiform_scale = true; + } + else if ( multiple_selection() || (item && m_objects_model->GetItemType(item) == itInstanceRoot )) { const Selection& selection = scene_selection(); - // don't show manipulation panel for case of all Object's parts selection - update_and_show_manipulations = !selection.is_single_full_instance(); + + if (selection.is_single_full_object()) { + og_name = _L("Object manipulation"); + coordinates_type = ECoordinatesType::World; + update_and_show_manipulations = true; + + obj_idx = selection.get_object_idx(); + ModelObject* object = (*m_objects)[obj_idx]; + m_config = &object->config; + disable_ss_manipulation = object->is_cut(); + } + else { + og_name = _L("Group manipulation"); + coordinates_type = ECoordinatesType::World; + + // don't show manipulation panel for case of all Object's parts selection + update_and_show_manipulations = !selection.is_single_full_instance(); + + if (int obj_idx = selection.get_object_idx(); obj_idx >= 0) { + if (selection.is_any_volume() || selection.is_any_modifier()) + enable_manipulation = !(*m_objects)[obj_idx]->is_cut(); + else// if (item && m_objects_model->GetItemType(item) == itInstanceRoot) + disable_ss_manipulation = (*m_objects)[obj_idx]->is_cut(); + } + else { + wxDataViewItemArray sels; + GetSelections(sels); + if (selection.is_single_full_object() || selection.is_multiple_full_instance() ) { + int obj_idx = m_objects_model->GetObjectIdByItem(sels.front()); + disable_ss_manipulation = (*m_objects)[obj_idx]->is_cut(); + } + else if (selection.is_mixed() || selection.is_multiple_full_object()) { + std::map> cut_objects; + + // find cut objects + for (auto item : sels) { + int obj_idx = m_objects_model->GetObjectIdByItem(item); + const ModelObject* obj = object(obj_idx); + if (obj->is_cut()) { + if (cut_objects.find(obj->cut_id) == cut_objects.end()) + cut_objects[obj->cut_id] = std::set{ obj_idx }; + else + cut_objects.at(obj->cut_id).insert(obj_idx); + } + } + + // check if selected cut objects are "full selected" + for (auto cut_object : cut_objects) + if (cut_object.first.check_sum() != cut_object.second.size()) { + disable_ss_manipulation = true; + break; + } + disable_ununiform_scale = !cut_objects.empty(); + } + } + } } else { if (item) { @@ -2448,11 +2745,14 @@ void ObjectList::part_selection_changed() const wxDataViewItem parent = m_objects_model->GetParent(item); const ItemType parent_type = m_objects_model->GetItemType(parent); obj_idx = m_objects_model->GetObjectIdByItem(item); + ModelObject* object = (*m_objects)[obj_idx]; if (parent == wxDataViewItem(nullptr) || type == itInfo) { og_name = _L("Object manipulation"); - m_config = &(*m_objects)[obj_idx]->config; + m_config = &object->config; + if (!scene_selection().is_single_full_instance() || coordinates_type > ECoordinatesType::Instance) + coordinates_type = ECoordinatesType::World; update_and_show_manipulations = true; if (type == itInfo) { @@ -2468,29 +2768,30 @@ void ObjectList::part_selection_changed() case InfoItemType::CustomSeam: case InfoItemType::MmuSegmentation: { - GLGizmosManager::EType gizmo_type = info_type == InfoItemType::CustomSupports ? GLGizmosManager::EType::FdmSupports : - info_type == InfoItemType::CustomSeam ? GLGizmosManager::EType::Seam : + GLGizmosManager::EType gizmo_type = info_type == InfoItemType::CustomSupports ? GLGizmosManager::EType::FdmSupports : + info_type == InfoItemType::CustomSeam ? GLGizmosManager::EType::Seam : GLGizmosManager::EType::MmuSegmentation; - GLGizmosManager& gizmos_mgr = wxGetApp().plater()->canvas3D()->get_gizmos_manager(); if (gizmos_mgr.get_current_type() != gizmo_type) gizmos_mgr.open_gizmo(gizmo_type); break; } - case InfoItemType::Sinking: { break; } + case InfoItemType::Sinking: default: { break; } } } + else + disable_ss_manipulation = object->is_cut(); } else { if (type & itSettings) { if (parent_type & itObject) { og_name = _L("Object Settings to modify"); - m_config = &(*m_objects)[obj_idx]->config; + m_config = &object->config; } else if (parent_type & itVolume) { og_name = _L("Part Settings to modify"); volume_id = m_objects_model->GetVolumeIdByItem(parent); - m_config = &(*m_objects)[obj_idx]->volumes[volume_id]->config; + m_config = &object->volumes[volume_id]->config; } else if (parent_type & itLayer) { og_name = _L("Layer range Settings to modify"); @@ -2501,15 +2802,18 @@ void ObjectList::part_selection_changed() else if (type & itVolume) { og_name = _L("Part manipulation"); volume_id = m_objects_model->GetVolumeIdByItem(item); - m_config = &(*m_objects)[obj_idx]->volumes[volume_id]->config; + m_config = &object->volumes[volume_id]->config; update_and_show_manipulations = true; + const ModelVolume* volume = object->volumes[volume_id]; + enable_manipulation = !(object->is_cut() && (volume->is_cut_connector() || volume->is_model_part())); } else if (type & itInstance) { og_name = _L("Instance manipulation"); update_and_show_manipulations = true; // fill m_config by object's values - m_config = &(*m_objects)[obj_idx]->config; + m_config = &object->config; + disable_ss_manipulation = object->is_cut(); } else if (type & (itLayerRoot|itLayer)) { og_name = type & itLayerRoot ? _L("Height ranges") : _L("Settings for height range"); @@ -2526,12 +2830,24 @@ void ObjectList::part_selection_changed() if (update_and_show_manipulations) { wxGetApp().obj_manipul()->get_og()->set_name(" " + og_name + " "); + if (wxGetApp().obj_manipul()->get_coordinates_type() != coordinates_type) + wxGetApp().obj_manipul()->set_coordinates_type(coordinates_type); if (item) { - // wxGetApp().obj_manipul()->get_og()->set_value("object_name", m_objects_model->GetName(item)); wxGetApp().obj_manipul()->update_item_name(m_objects_model->GetName(item)); wxGetApp().obj_manipul()->update_warning_icon_state(get_mesh_errors_info(obj_idx, volume_id)); } + + if (disable_ss_manipulation) + wxGetApp().obj_manipul()->DisableScale(); + else { + wxGetApp().obj_manipul()->Enable(enable_manipulation); + if (disable_ununiform_scale) + wxGetApp().obj_manipul()->DisableUnuniformScale(); + } + + if (GLGizmoScale3D* scale = dynamic_cast(gizmos_mgr.get_gizmo(GLGizmosManager::Scale))) + scale->enable_ununiversal_scale(!disable_ununiform_scale); } if (update_and_show_settings) @@ -2547,7 +2863,14 @@ void ObjectList::part_selection_changed() Sidebar& panel = wxGetApp().sidebar(); panel.Freeze(); - wxGetApp().plater()->canvas3D()->handle_sidebar_focus_event("", false); + std::string opt_key; + if (m_selected_object_id >= 0) { + const ManipulationEditor* const editor = wxGetApp().obj_manipul()->get_focused_editor(); + if (editor != nullptr) + opt_key = editor->get_full_opt_name(); + } + wxGetApp().plater()->canvas3D()->handle_sidebar_focus_event(opt_key, !opt_key.empty()); + wxGetApp().plater()->canvas3D()->enable_moving(enable_manipulation); // ysFIXME wxGetApp().obj_manipul() ->UpdateAndShow(update_and_show_manipulations); wxGetApp().obj_settings()->UpdateAndShow(update_and_show_settings); wxGetApp().obj_layers() ->UpdateAndShow(update_and_show_layers); @@ -2600,12 +2923,23 @@ void ObjectList::update_info_items(size_t obj_idx, wxDataViewItemArray* selectio if (obj_idx >= m_objects->size()) return; + wxDataViewItemArray sels; + if (!selections) { + GetSelections(sels); + for (wxDataViewItem item : sels) + if (item.IsOk() && m_objects_model->GetItemType(item) == itVolume) { + selections = &sels; + break; + } + } + const ModelObject* model_object = (*m_objects)[obj_idx]; wxDataViewItem item_obj = m_objects_model->GetItemById(obj_idx); assert(item_obj.IsOk()); for (InfoItemType type : {InfoItemType::CustomSupports, InfoItemType::CustomSeam, + InfoItemType::CutConnectors, InfoItemType::MmuSegmentation, InfoItemType::Sinking, InfoItemType::VariableLayerHeight}) { @@ -2626,6 +2960,9 @@ void ObjectList::update_info_items(size_t obj_idx, wxDataViewItemArray* selectio }); break; + case InfoItemType::CutConnectors: + should_show = model_object->is_cut() && model_object->has_connectors() && model_object->volumes.size() > 1; + break; case InfoItemType::VariableLayerHeight : should_show = printer_technology() == ptFFF && ! model_object->layer_height_profile.empty(); @@ -2665,32 +3002,86 @@ void ObjectList::update_info_items(size_t obj_idx, wxDataViewItemArray* selectio } } +static wxString extruder2str(int extruder) +{ + return extruder == 0 ? _L("default") : wxString::Format("%d", extruder); +} +static bool can_add_volumes_to_object(const ModelObject* object) +{ + bool can = object->volumes.size() > 1; -void ObjectList::add_object_to_list(size_t obj_idx, bool call_selection_changed) + if (can && object->is_cut()) { + int no_connectors_cnt = 0; + for (const ModelVolume* v : object->volumes) + if (!v->is_cut_connector()) { + if (!v->is_model_part()) + return true; + no_connectors_cnt++; + } + can = no_connectors_cnt > 1; + } + + return can; +} + +wxDataViewItemArray ObjectList::add_volumes_to_object_in_list(size_t obj_idx, std::function add_to_selection/* = nullptr*/) { - auto model_object = (*m_objects)[obj_idx]; - const wxString& item_name = from_u8(model_object->name); - const auto item = m_objects_model->Add(item_name, - model_object->config.has("extruder") ? model_object->config.extruder() : 0, - get_warning_icon_name(model_object->mesh().stats())); + const bool is_prevent_list_events = m_prevent_list_events; + m_prevent_list_events = true; - update_info_items(obj_idx, nullptr, call_selection_changed); + wxDataViewItem object_item = m_objects_model->GetItemById(int(obj_idx)); + m_objects_model->DeleteVolumeChildren(object_item); + + wxDataViewItemArray items; + const ModelObject* object = (*m_objects)[obj_idx]; // add volumes to the object - if (model_object->volumes.size() > 1) { - for (const ModelVolume* volume : model_object->volumes) { - const wxDataViewItem& vol_item = m_objects_model->AddVolumeChild(item, - from_u8(volume->name), + if (can_add_volumes_to_object(object)) { + if (object->volumes.size() > 1) { + wxString obj_item_name = from_u8(object->name); + if (m_objects_model->GetName(object_item) != obj_item_name) + m_objects_model->SetName(obj_item_name, object_item); + } + + int volume_idx{ -1 }; + for (const ModelVolume* volume : object->volumes) { + ++volume_idx; + if ((object->is_cut() && volume->is_cut_connector()) || + (printer_technology() == ptSLA && volume->type() == ModelVolumeType::PARAMETER_MODIFIER)) + continue; + const wxDataViewItem& vol_item = m_objects_model->AddVolumeChild(object_item, + get_item_name(volume->name, volume->is_text()), + volume_idx, volume->type(), + volume->is_text(), get_warning_icon_name(volume->mesh().stats()), - volume->config.has("extruder") ? volume->config.extruder() : 0, - false); + extruder2str(volume->config.has("extruder") ? volume->config.extruder() : 0)); add_settings_item(vol_item, &volume->config.get()); + + if (add_to_selection && add_to_selection(volume)) + items.Add(vol_item); } - Expand(item); + Expand(object_item); } + m_prevent_list_events = is_prevent_list_events; + return items; +} + +void ObjectList::add_object_to_list(size_t obj_idx, bool call_selection_changed) +{ + auto model_object = (*m_objects)[obj_idx]; + const wxString& item_name = get_item_name(model_object->name, model_object->is_text()); + const auto item = m_objects_model->AddObject(item_name, + extruder2str(model_object->config.has("extruder") ? model_object->config.extruder() : 0), + get_warning_icon_name(model_object->mesh().stats()), + model_object->is_cut()); + + update_info_items(obj_idx, nullptr, call_selection_changed); + + add_volumes_to_object_in_list(obj_idx); + // add instances to the object, if it has those if (model_object->instances.size()>1) { @@ -2743,43 +3134,58 @@ void ObjectList::delete_instance_from_list(const size_t obj_idx, const size_t in select_item([this, obj_idx, inst_idx]() { return m_objects_model->Delete(m_objects_model->GetItemByInstanceId(obj_idx, inst_idx)); }); } -void ObjectList::delete_from_model_and_list(const ItemType type, const int obj_idx, const int sub_obj_idx) +void ObjectList::update_lock_icons_for_model() { - if ( !(type&(itObject|itVolume|itInstance)) ) - return; - - take_snapshot(_(L("Delete Selected Item"))); - - if (type&itObject) { - del_object(obj_idx); - delete_object_from_list(obj_idx); - } - else { - del_subobject_from_object(obj_idx, sub_obj_idx, type); + for (size_t obj_idx = 0; obj_idx < (*m_objects).size(); ++obj_idx) + if (!(*m_objects)[obj_idx]->is_cut()) + m_objects_model->UpdateLockIcon(m_objects_model->GetItemById(int(obj_idx)), false); +} - type == itVolume ? delete_volume_from_list(obj_idx, sub_obj_idx) : - delete_instance_from_list(obj_idx, sub_obj_idx); +bool ObjectList::delete_from_model_and_list(const ItemType type, const int obj_idx, const int sub_obj_idx) +{ + if (type & (itObject | itVolume | itInstance)) { + if (type & itObject) { + bool was_cut = object(obj_idx)->is_cut(); + if (del_object(obj_idx)) { + delete_object_from_list(obj_idx); + if (was_cut) + update_lock_icons_for_model(); + return true; + } + return false; + } + if (del_subobject_from_object(obj_idx, sub_obj_idx, type)) { + type == itVolume ? delete_volume_from_list(obj_idx, sub_obj_idx) : + delete_instance_from_list(obj_idx, sub_obj_idx); + return true; + } } + return false; } -void ObjectList::delete_from_model_and_list(const std::vector& items_for_delete) +bool ObjectList::delete_from_model_and_list(const std::vector& items_for_delete) { if (items_for_delete.empty()) - return; + return false; m_prevent_list_events = true; + ScopeGuard sg_prevent_list_events = ScopeGuard([this]() { m_prevent_list_events = false; }); std::set modified_objects_ids; for (std::vector::const_reverse_iterator item = items_for_delete.rbegin(); item != items_for_delete.rend(); ++item) { if (!(item->type&(itObject | itVolume | itInstance))) continue; if (item->type&itObject) { - del_object(item->obj_idx); + bool was_cut = object(item->obj_idx)->is_cut(); + if (!del_object(item->obj_idx)) + return false;// continue; m_objects_model->Delete(m_objects_model->GetItemById(item->obj_idx)); + if (was_cut) + update_lock_icons_for_model(); } else { if (!del_subobject_from_object(item->obj_idx, item->sub_obj_idx, item->type)) - continue; + return false;// continue; if (item->type&itVolume) { m_objects_model->Delete(m_objects_model->GetItemByVolumeId(item->obj_idx, item->sub_obj_idx)); ModelObject* obj = object(item->obj_idx); @@ -2805,8 +3211,12 @@ void ObjectList::delete_from_model_and_list(const std::vector& it update_info_items(id); } - m_prevent_list_events = true; + m_prevent_list_events = false; + if (modified_objects_ids.empty()) + return false; part_selection_changed(); + + return true; } void ObjectList::delete_all_objects_from_list() @@ -2911,8 +3321,10 @@ void ObjectList::remove() { wxDataViewItem parent = m_objects_model->GetParent(item); ItemType type = m_objects_model->GetItemType(item); - if (type & itObject) - delete_from_model_and_list(itObject, m_objects_model->GetIdByItem(item), -1); + if (type & itObject) { + if (!delete_from_model_and_list(itObject, m_objects_model->GetIdByItem(item), -1)) + return item; + } else { if (type & (itLayer | itInstance)) { // In case there is just one layer or two instances and we delete it, del_subobject_item will @@ -2922,7 +3334,8 @@ void ObjectList::remove() parent = m_objects_model->GetTopParent(item); } - del_subobject_item(item); + if (!del_subobject_item(item)) + return item; } return parent; @@ -2948,6 +3361,8 @@ void ObjectList::remove() if (m_objects_model->InvalidItem(item)) // item can be deleted for this moment (like last 2 Instances or Volumes) continue; parent = delete_item(item); + if (parent == item && m_objects_model->GetItemType(item) & itObject) // Object wasn't deleted + break; } } @@ -3140,7 +3555,7 @@ void ObjectList::add_layer_item(const t_layer_height_range& range, const auto layer_item = m_objects_model->AddLayersChild(layers_item, range, - config.opt_int("extruder"), + extruder2str(config.opt_int("extruder")), layer_idx); add_settings_item(layer_item, &config); } @@ -3234,6 +3649,24 @@ bool ObjectList::is_selected(const ItemType type) const return false; } +bool ObjectList::is_connectors_item_selected() const +{ + const wxDataViewItem& item = GetSelection(); + if (item) + return m_objects_model->GetItemType(item) == itInfo && m_objects_model->GetInfoItemType(item) == InfoItemType::CutConnectors; + + return false; +} + +bool ObjectList::is_connectors_item_selected(const wxDataViewItemArray& sels) const +{ + for (auto item : sels) + if (m_objects_model->GetItemType(item) == itInfo && m_objects_model->GetInfoItemType(item) == InfoItemType::CutConnectors) + return true; + + return false; +} + int ObjectList::get_selected_layers_range_idx() const { const wxDataViewItem& item = GetSelection(); @@ -3265,8 +3698,8 @@ void ObjectList::update_selections() return; sels.Add(m_objects_model->GetItemById(selection.get_object_idx())); } - else if (selection.is_single_volume() || selection.is_any_modifier()) { - const auto gl_vol = selection.get_volume(*selection.get_volume_idxs().begin()); + else if (selection.is_single_volume_or_modifier()) { + const auto gl_vol = selection.get_first_volume(); if (m_objects_model->GetVolumeIdByItem(m_objects_model->GetParent(item)) == gl_vol->volume_idx()) return; } @@ -3356,11 +3789,18 @@ void ObjectList::update_selections() else { for (auto idx : selection.get_volume_idxs()) { const auto gl_vol = selection.get_volume(idx); - if (gl_vol->volume_idx() >= 0) + if (gl_vol->volume_idx() >= 0) { // Only add GLVolumes with non-negative volume_ids. GLVolumes with negative volume ids // are not associated with ModelVolumes, but they are temporarily generated by the backend // (for example, SLA supports or SLA pad). - sels.Add(m_objects_model->GetItemByVolumeId(gl_vol->object_idx(), gl_vol->volume_idx())); + int obj_idx = gl_vol->object_idx(); + int vol_idx = gl_vol->volume_idx(); + assert(obj_idx >= 0 && vol_idx >= 0); + if (object(obj_idx)->volumes[vol_idx]->is_cut_connector()) + sels.Add(m_objects_model->GetInfoItemByType(m_objects_model->GetItemById(obj_idx), InfoItemType::CutConnectors)); + else + sels.Add(m_objects_model->GetItemByVolumeId(obj_idx, vol_idx)); + } } m_selection_mode = smVolume; } } @@ -3410,11 +3850,34 @@ void ObjectList::update_selections() if (sels.size() == 0 || m_selection_mode & smSettings) m_selection_mode = smUndef; - - select_items(sels); - // Scroll selected Item in the middle of an object list - ensure_current_item_visible(); + if (fix_cut_selection(sels) || is_connectors_item_selected(sels)) { + m_prevent_list_events = true; + + // If some part is selected, unselect all items except of selected parts of the current object + UnselectAll(); + SetSelections(sels); + + m_prevent_list_events = false; + + // update object selection on Plater + if (!m_prevent_canvas_selection_update) + update_selections_on_canvas(); + + // to update the toolbar and info sizer + if (!GetSelection() || m_objects_model->GetItemType(GetSelection()) == itObject || is_connectors_item_selected()) { + auto event = SimpleEvent(EVT_OBJ_LIST_OBJECT_SELECT); + event.SetEventObject(this); + wxPostEvent(this, event); + } + part_selection_changed(); + } + else { + select_items(sels); + + // Scroll selected Item in the middle of an object list + ensure_current_item_visible(); + } } void ObjectList::update_selections_on_canvas() @@ -3448,16 +3911,29 @@ void ObjectList::update_selections_on_canvas() volume_idxs.insert(volume_idxs.end(), idxs.begin(), idxs.end()); } else if (type == itInfo) { - // When selecting an info item, select one instance of the - // respective object - a gizmo may want to be opened. - int inst_idx = selection.get_instance_idx(); - int scene_obj_idx = selection.get_object_idx(); - mode = Selection::Instance; - // select first instance, unless an instance of the object is already selected - if (scene_obj_idx == -1 || inst_idx == -1 || scene_obj_idx != obj_idx) - inst_idx = 0; - std::vector idxs = selection.get_volume_idxs_from_instance(obj_idx, inst_idx); - volume_idxs.insert(volume_idxs.end(), idxs.begin(), idxs.end()); + if (m_objects_model->GetInfoItemType(item) == InfoItemType::CutConnectors) { + mode = Selection::Volume; + + // When selecting CutConnectors info item, select all object volumes, which are marked as a connector + const ModelObject* obj = object(obj_idx); + for (unsigned int vol_idx = 0; vol_idx < obj->volumes.size(); vol_idx++) + if (obj->volumes[vol_idx]->is_cut_connector()) { + std::vector idxs = selection.get_volume_idxs_from_volume(obj_idx, std::max(instance_idx, 0), vol_idx); + volume_idxs.insert(volume_idxs.end(), idxs.begin(), idxs.end()); + } + } + else { + // When selecting an info item, select one instance of the + // respective object - a gizmo may want to be opened. + int inst_idx = selection.get_instance_idx(); + int scene_obj_idx = selection.get_object_idx(); + mode = Selection::Instance; + // select first instance, unless an instance of the object is already selected + if (scene_obj_idx == -1 || inst_idx == -1 || scene_obj_idx != obj_idx) + inst_idx = 0; + std::vector idxs = selection.get_volume_idxs_from_instance(obj_idx, inst_idx); + volume_idxs.insert(volume_idxs.end(), idxs.begin(), idxs.end()); + } } else { @@ -3473,6 +3949,8 @@ void ObjectList::update_selections_on_canvas() if (sel_cnt == 1) { wxDataViewItem item = GetSelection(); + if (m_objects_model->GetInfoItemType(item) == InfoItemType::CutConnectors) + selection.remove_all(); if (m_objects_model->GetItemType(item) & (itSettings | itInstanceRoot | itLayerRoot | itLayer)) add_to_selection(m_objects_model->GetParent(item), selection, instance_idx, mode); else @@ -3743,6 +4221,53 @@ void ObjectList::fix_multiselection_conflicts() m_prevent_list_events = false; } +bool ObjectList::fix_cut_selection(wxDataViewItemArray& sels) +{ + if (wxGetApp().plater()->canvas3D()->get_gizmos_manager().get_current_type() == GLGizmosManager::Scale) { + for (const auto& item : sels) { + if (m_objects_model->GetItemType(item) & (itInstance | itObject) || + (m_objects_model->GetItemType(item) & itSettings && + m_objects_model->GetItemType(m_objects_model->GetParent(item)) & itObject)) { + + bool is_instance_selection = m_objects_model->GetItemType(item) & itInstance; + + int object_idx = m_objects_model->GetObjectIdByItem(item); + int inst_idx = is_instance_selection ? m_objects_model->GetInstanceIdByItem(item) : 0; + + if (auto obj = object(object_idx); obj->is_cut()) { + sels.Clear(); + + auto cut_id = obj->cut_id; + + int objects_cnt = int((*m_objects).size()); + for (int obj_idx = 0; obj_idx < objects_cnt; ++obj_idx) { + auto object = (*m_objects)[obj_idx]; + if (object->is_cut() && object->cut_id.has_same_id(cut_id)) + sels.Add(is_instance_selection ? m_objects_model->GetItemByInstanceId(obj_idx, inst_idx) : m_objects_model->GetItemById(obj_idx)); + } + return true; + } + } + } + } + return false; +} + +void ObjectList::fix_cut_selection() +{ + wxDataViewItemArray sels; + GetSelections(sels); + if (fix_cut_selection(sels)) { + m_prevent_list_events = true; + + // If some part is selected, unselect all items except of selected parts of the current object + UnselectAll(); + SetSelections(sels); + + m_prevent_list_events = false; + } +} + ModelVolume* ObjectList::get_selected_model_volume() { wxDataViewItem item = GetSelection(); @@ -3773,10 +4298,11 @@ void ObjectList::change_part_type() if (obj_idx < 0) return; const ModelVolumeType type = volume->type(); + const ModelObject* obj = object(obj_idx); if (type == ModelVolumeType::MODEL_PART) { int model_part_cnt = 0; - for (auto vol : (*m_objects)[obj_idx]->volumes) { + for (auto vol : obj->volumes) { if (vol->type() == ModelVolumeType::MODEL_PART) ++model_part_cnt; } @@ -3787,8 +4313,35 @@ void ObjectList::change_part_type() } } - const wxString names[] = { _L("Part"), _L("Negative Volume"), _L("Modifier"), _L("Support Blocker"), _L("Support Enforcer") }; - auto new_type = ModelVolumeType(wxGetApp().GetSingleChoiceIndex(_L("Type:"), _L("Select type of part"), wxArrayString(5, names), int(type))); + const bool is_cut_object = obj->is_cut(); + wxArrayString names; + std::vector types; + types.reserve(5); + if (!is_cut_object) { + for (const wxString& name : { _L("Part"), _L("Negative Volume") }) + names.Add(name); + for (const ModelVolumeType type_id : { ModelVolumeType::MODEL_PART, ModelVolumeType::NEGATIVE_VOLUME }) + types.emplace_back(type_id); + } + + if (printer_technology() != ptSLA) { + names.Add(_L("Modifier")); + types.emplace_back(ModelVolumeType::PARAMETER_MODIFIER); + } + + if (!volume->text_configuration.has_value()) { + for (const wxString& name : { _L("Support Blocker"), _L("Support Enforcer") }) + names.Add(name); + for (const ModelVolumeType type_id : { ModelVolumeType::SUPPORT_BLOCKER, ModelVolumeType::SUPPORT_ENFORCER }) + types.emplace_back(type_id); + } + + int selection = 0; + if (auto it = std::find(types.begin(), types.end(), type); it != types.end()) + selection = it - types.begin(); + + auto choice = wxGetApp().GetSingleChoiceIndex(_L("Type:"), _L("Select type of part"), names, selection); + const auto new_type = choice >= 0 ? types[choice] : ModelVolumeType::INVALID; if (new_type == type || new_type == ModelVolumeType::INVALID) return; @@ -3874,8 +4427,9 @@ void ObjectList::update_object_list_by_printer_technology() m_objects_model->GetChildren(wxDataViewItem(nullptr), object_items); for (auto& object_item : object_items) { + const int obj_idx = m_objects_model->GetObjectIdByItem(object_item); // update custom supports info - update_info_items(m_objects_model->GetObjectIdByItem(object_item), &sel); + update_info_items(obj_idx, &sel); // Update Settings Item for object update_settings_item_and_selection(object_item, sel); @@ -3883,10 +4437,26 @@ void ObjectList::update_object_list_by_printer_technology() // Update settings for Volumes wxDataViewItemArray all_object_subitems; m_objects_model->GetChildren(object_item, all_object_subitems); + + bool was_selected_some_subitem = false; for (auto item : all_object_subitems) - if (m_objects_model->GetItemType(item) & itVolume) - // update settings for volume - update_settings_item_and_selection(item, sel); + if (m_objects_model->GetItemType(item) & itVolume) { + if (sel.Index(item) != wxNOT_FOUND) { + sel.Remove(item); + was_selected_some_subitem = true; + } + else if (const wxDataViewItem vol_settings_item = m_objects_model->GetSettingsItem(item); + sel.Index(vol_settings_item) != wxNOT_FOUND) { + sel.Remove(vol_settings_item); + was_selected_some_subitem = true; + break; + } + } + if (was_selected_some_subitem) + sel.Add(object_item); + + // Update volumes list in respect to the print mode + add_volumes_to_object_in_list(obj_idx); // Update Layers Items wxDataViewItem layers_item = m_objects_model->GetLayerRootItem(object_item); @@ -3928,6 +4498,8 @@ void ObjectList::update_object_list_by_printer_technology() // restore selection: SetSelections(sel); m_prevent_canvas_selection_update = false; + + update_selections_on_canvas(); } void ObjectList::instances_to_separated_object(const int obj_idx, const std::set& inst_idxs) @@ -4023,11 +4595,18 @@ void ObjectList::split_instances() void ObjectList::rename_item() { const wxDataViewItem item = GetSelection(); - if (!item || !(m_objects_model->GetItemType(item) & (itVolume | itObject))) + auto type = m_objects_model->GetItemType(item); + if (!item || !(type & (itVolume | itObject))) return ; - const wxString new_name = wxGetTextFromUser(_(L("Enter new name"))+":", _(L("Renaming")), - m_objects_model->GetName(item), this); + wxString input_name = m_objects_model->GetName(item); + if (ModelObject* obj = object(m_objects_model->GetObjectIdByItem(item))) { + // if there is text item to editing, than edit just a name without Text marker + if (type == itObject && obj->is_text()) + input_name = from_u8(obj->name); + } + + const wxString new_name = wxGetTextFromUser(_L("Enter new name")+":", _L("Renaming"), input_name, this); if (new_name.IsEmpty()) return; @@ -4099,7 +4678,8 @@ void ObjectList::fix_through_netfabb() msg += "\n"; } - plater->clear_before_change_mesh(obj_idx); + plater->clear_before_change_mesh(obj_idx, _u8L("Custom supports, seams and multimaterial painting were " + "removed after repairing the mesh.")); std::string res; if (!fix_model_by_win10_sdk_gui(*(object(obj_idx)), vol_idx, progress_dlg, msg, res)) return false; @@ -4211,9 +4791,6 @@ void ObjectList::msw_rescale() GetColumn(colExtruder)->SetWidth( 8 * em); GetColumn(colEditing )->SetWidth( 3 * em); - // rescale/update existing items with bitmaps - m_objects_model->Rescale(); - Layout(); } @@ -4221,7 +4798,10 @@ void ObjectList::sys_color_changed() { wxGetApp().UpdateDVCDarkUI(this, true); - msw_rescale(); + // update existing items with bitmaps + m_objects_model->UpdateBitmaps(); + + Layout(); } void ObjectList::ItemValueChanged(wxDataViewEvent &event) @@ -4236,17 +4816,19 @@ void ObjectList::ItemValueChanged(wxDataViewEvent &event) } } +void ObjectList::OnEditingStarted(wxDataViewEvent &event) +{ + m_is_editing_started = true; #ifdef __WXMSW__ // Workaround for entering the column editing mode on Windows. Simulate keyboard enter when another column of the active line is selected. // Here the last active column is forgotten, so when leaving the editing mode, the next mouse click will not enter the editing mode of the newly selected column. -void ObjectList::OnEditingStarted(wxDataViewEvent &event) -{ m_last_selected_column = -1; -} #endif //__WXMSW__ +} void ObjectList::OnEditingDone(wxDataViewEvent &event) { + m_is_editing_started = false; if (event.GetColumn() != colName) return; @@ -4309,39 +4891,20 @@ void ObjectList::set_extruder_for_selected_items(const int extruder) const wxGetApp().plater()->update(); } -wxDataViewItemArray ObjectList::reorder_volumes_and_get_selection(int obj_idx, std::function add_to_selection/* = nullptr*/) +wxDataViewItemArray ObjectList::reorder_volumes_and_get_selection(size_t obj_idx, std::function add_to_selection/* = nullptr*/) { - wxDataViewItemArray items; - - ModelObject* object = (*m_objects)[obj_idx]; - if (object->volumes.size() <= 1) - return items; + (*m_objects)[obj_idx]->sort_volumes(wxGetApp().app_config->get_bool("order_volumes")); - object->sort_volumes(wxGetApp().app_config->get("order_volumes") == "1"); + wxDataViewItemArray items = add_volumes_to_object_in_list(obj_idx, std::move(add_to_selection)); - wxDataViewItem object_item = m_objects_model->GetItemById(obj_idx); - m_objects_model->DeleteVolumeChildren(object_item); - - for (const ModelVolume* volume : object->volumes) { - wxDataViewItem vol_item = m_objects_model->AddVolumeChild(object_item, from_u8(volume->name), - volume->type(), - get_warning_icon_name(volume->mesh().stats()), - volume->config.has("extruder") ? volume->config.extruder() : 0, - false); - // add settings to the part, if it has those - add_settings_item(vol_item, &volume->config.get()); + changed_object(int(obj_idx)); - if (add_to_selection && add_to_selection(volume)) - items.Add(vol_item); - } - - changed_object(obj_idx); return items; } void ObjectList::apply_volumes_order() { - if (wxGetApp().app_config->get("order_volumes") != "1" || !m_objects) + if (!wxGetApp().app_config->get_bool("order_volumes") || !m_objects) return; for (size_t obj_idx = 0; obj_idx < m_objects->size(); obj_idx++) diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index 51d69eaee52..d2965c77e32 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -27,6 +27,7 @@ class ModelConfig; class ModelObject; class ModelVolume; class TriangleMesh; +struct TextConfiguration; enum class ModelVolumeType : int; // FIXME: broken build on mac os because of this is missing: @@ -175,6 +176,7 @@ class ObjectList : public wxDataViewCtrl // Workaround for entering the column editing mode on Windows. Simulate keyboard enter when another column of the active line is selected. int m_last_selected_column = -1; #endif /* __MSW__ */ + bool m_is_editing_started{ false }; #if 0 SettingsFactory::Bundle m_freq_settings_fff; @@ -191,7 +193,7 @@ class ObjectList : public wxDataViewCtrl public: ObjectList(wxWindow* parent); - ~ObjectList(); + ~ObjectList() override; void set_min_height(); void update_min_height(); @@ -247,7 +249,7 @@ class ObjectList : public wxDataViewCtrl void add_category_to_settings_from_frequent(const std::vector& category_options, wxDataViewItem item); void show_settings(const wxDataViewItem settings_item); bool is_instance_or_object_selected(); - + bool is_selected_object_cut(); void load_subobject(ModelVolumeType type, bool from_galery = false); // ! ysFIXME - delete commented code after testing and rename "load_modifier" to something common //void load_part(ModelObject& model_object, std::vector& added_volumes, ModelVolumeType type, bool from_galery = false); @@ -256,13 +258,15 @@ class ObjectList : public wxDataViewCtrl void load_shape_object(const std::string &type_name); void load_shape_object_from_gallery(); void load_shape_object_from_gallery(const wxArrayString& input_files); - void load_mesh_object(const TriangleMesh &mesh, const wxString &name, bool center = true); - void del_object(const int obj_idx); - void del_subobject_item(wxDataViewItem& item); + void load_mesh_object(const TriangleMesh &mesh, const std::string &name, bool center = true, + const TextConfiguration* text_config = nullptr, const Transform3d* transformation = nullptr); + bool del_object(const int obj_idx); + bool del_subobject_item(wxDataViewItem& item); void del_settings_from_config(const wxDataViewItem& parent_item); void del_instances_from_object(const int obj_idx); void del_layer_from_object(const int obj_idx, const t_layer_height_range& layer_range); void del_layers_from_object(const int obj_idx); + bool del_from_cut_object(bool is_connector, bool is_model_part = false, bool is_negative_volume = false); bool del_subobject_from_object(const int obj_idx, const int idx, const int type); void del_info_item(const int obj_idx, InfoItemType type); void split(); @@ -277,10 +281,15 @@ class ObjectList : public wxDataViewCtrl bool is_splittable(bool to_objects); bool selected_instances_of_same_object(); bool can_split_instances(); + bool has_selected_cut_object() const; + void invalidate_cut_info_for_selection(); + void invalidate_cut_info_for_object(int obj_idx); + void delete_all_connectors_for_selection(); + void delete_all_connectors_for_object(int obj_idx); bool can_merge_to_multipart_object() const; bool can_merge_to_single_object() const; - wxPoint get_mouse_position_in_control() const { return wxGetMousePosition() - this->GetScreenPosition(); } + wxPoint get_mouse_position_in_control() const; wxBoxSizer* get_sizer() {return m_sizer;} int get_selected_obj_idx() const; ModelConfig& get_item_config(const wxDataViewItem& item) const; @@ -288,6 +297,9 @@ class ObjectList : public wxDataViewCtrl void changed_object(const int obj_idx = -1) const; void part_selection_changed(); + // Add object's volumes to the list + // Return selected items, if add_to_selection is defined + wxDataViewItemArray add_volumes_to_object_in_list(size_t obj_idx, std::function add_to_selection = nullptr); // Add object to the list void add_object_to_list(size_t obj_idx, bool call_selection_changed = true); // Delete object from the list @@ -295,8 +307,9 @@ class ObjectList : public wxDataViewCtrl void delete_object_from_list(const size_t obj_idx); void delete_volume_from_list(const size_t obj_idx, const size_t vol_idx); void delete_instance_from_list(const size_t obj_idx, const size_t inst_idx); - void delete_from_model_and_list(const ItemType type, const int obj_idx, const int sub_obj_idx); - void delete_from_model_and_list(const std::vector& items_for_delete); + void update_lock_icons_for_model(); + bool delete_from_model_and_list(const ItemType type, const int obj_idx, const int sub_obj_idx); + bool delete_from_model_and_list(const std::vector& items_for_delete); // Delete all objects from the list void delete_all_objects_from_list(); // Increase instances count @@ -339,6 +352,8 @@ class ObjectList : public wxDataViewCtrl void init_objects(); bool multiple_selection() const ; bool is_selected(const ItemType type) const; + bool is_connectors_item_selected() const; + bool is_connectors_item_selected(const wxDataViewItemArray& sels) const; int get_selected_layers_range_idx() const; void set_selected_layers_range_idx(const int range_idx) { m_selected_layers_range_idx = range_idx; } void set_selection_mode(SELECTION_MODE mode) { m_selection_mode = mode; } @@ -353,6 +368,9 @@ class ObjectList : public wxDataViewCtrl bool check_last_selection(wxString& msg_str); // correct current selections to avoid of the possible conflicts void fix_multiselection_conflicts(); + // correct selection in respect to the cut_id if any exists + void fix_cut_selection(); + bool fix_cut_selection(wxDataViewItemArray& sels); ModelVolume* get_selected_model_volume(); void change_part_type(); @@ -388,10 +406,12 @@ class ObjectList : public wxDataViewCtrl void toggle_printable_state(); void set_extruder_for_selected_items(const int extruder) const ; - wxDataViewItemArray reorder_volumes_and_get_selection(int obj_idx, std::function add_to_selection = nullptr); + wxDataViewItemArray reorder_volumes_and_get_selection(size_t obj_idx, std::function add_to_selection = nullptr); void apply_volumes_order(); bool has_paint_on_segmentation(); + bool is_editing() const { return m_is_editing_started; } + private: #ifdef __WXOSX__ // void OnChar(wxKeyEvent& event); @@ -405,10 +425,8 @@ class ObjectList : public wxDataViewCtrl bool can_drop(const wxDataViewItem& item) const ; void ItemValueChanged(wxDataViewEvent &event); -#ifdef __WXMSW__ // Workaround for entering the column editing mode on Windows. Simulate keyboard enter when another column of the active line is selected. void OnEditingStarted(wxDataViewEvent &event); -#endif /* __WXMSW__ */ void OnEditingDone(wxDataViewEvent &event); }; diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index 18e58efb88e..7c8df40b384 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -1,5 +1,6 @@ #include "GUI_ObjectManipulation.hpp" #include "I18N.hpp" +#include "format.hpp" #include "BitmapComboBox.hpp" #include "GLCanvas3D.hpp" @@ -23,7 +24,7 @@ namespace GUI { const double ObjectManipulation::in_to_mm = 25.4; -const double ObjectManipulation::mm_to_in = 0.0393700787; +const double ObjectManipulation::mm_to_in = 1 / ObjectManipulation::in_to_mm; // Helper function to be used by drop to bed button. Returns lowest point of this // volume in world coordinate system. @@ -52,10 +53,10 @@ static choice_ctrl* create_word_local_combo(wxWindow *parent) temp->SetFont(Slic3r::GUI::wxGetApp().normal_font()); if (!wxOSX) temp->SetBackgroundStyle(wxBG_STYLE_PAINT); - temp->Append(_L("World coordinates")); - temp->Append(_L("Local coordinates")); - temp->SetSelection(0); - temp->SetValue(temp->GetString(0)); + temp->Append(ObjectManipulation::coordinate_type_str(ECoordinatesType::World)); + temp->Append(ObjectManipulation::coordinate_type_str(ECoordinatesType::Instance)); + temp->Append(ObjectManipulation::coordinate_type_str(ECoordinatesType::Local)); + temp->Select((int)ECoordinatesType::World); temp->SetToolTip(_L("Select coordinate space, in which the transformation will be performed.")); return temp; @@ -81,8 +82,9 @@ void msw_rescale_word_local_combo(choice_ctrl* combo) // Set rescaled size combo->SetSize(size); - combo->Append(_L("World coordinates")); - combo->Append(_L("Local coordinates")); + combo->Append(ObjectManipulation::coordinate_type_str(ECoordinatesType::World)); + combo->Append(ObjectManipulation::coordinate_type_str(ECoordinatesType::Instance)); + combo->Append(ObjectManipulation::coordinate_type_str(ECoordinatesType::Local)); combo->SetValue(selection); #else @@ -101,18 +103,17 @@ static void set_font_and_background_style(wxWindow* win, const wxFont& font) static const wxString axes_color_text[] = { "#990000", "#009900", "#000099" }; static const wxString axes_color_back[] = { "#f5dcdc", "#dcf5dc", "#dcdcf5" }; + ObjectManipulation::ObjectManipulation(wxWindow* parent) : OG_Settings(parent, true) { - m_imperial_units = wxGetApp().app_config->get("use_inches") == "1"; - m_use_colors = wxGetApp().app_config->get("color_mapinulation_panel") == "1"; + m_imperial_units = wxGetApp().app_config->get_bool("use_inches"); + m_use_colors = wxGetApp().app_config->get_bool("color_mapinulation_panel"); m_manifold_warning_bmp = ScalableBitmap(parent, "exclamation"); // Load bitmaps to be used for the mirroring buttons: m_mirror_bitmap_on = ScalableBitmap(parent, "mirroring_on"); - m_mirror_bitmap_off = ScalableBitmap(parent, "mirroring_off"); - m_mirror_bitmap_hidden = ScalableBitmap(parent, "mirroring_transparent.png"); const int border = wxOSX ? 0 : 4; const int em = wxGetApp().em_unit(); @@ -156,9 +157,7 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : // Add world local combobox m_word_local_combo = create_word_local_combo(parent); - m_word_local_combo->Bind(wxEVT_COMBOBOX, ([this](wxCommandEvent& evt) { - this->set_world_coordinates(evt.GetSelection() != 1); - }), m_word_local_combo->GetId()); + m_word_local_combo->Bind(wxEVT_COMBOBOX, ([this](wxCommandEvent& evt) { this->set_coordinates_type(evt.GetString()); }), m_word_local_combo->GetId()); // Small trick to correct layouting in different view_mode : // Show empty string of a same height as a m_word_local_combo, when m_word_local_combo is hidden @@ -215,7 +214,7 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : add_label(&m_scale_Label, L("Scale"), v_sizer); wxStaticText* size_Label {nullptr}; - add_label(&size_Label, L("Size"), v_sizer); + add_label(&size_Label, L("Size [World]"), v_sizer); if (wxOSX) set_font_and_background_style(size_Label, wxGetApp().normal_font()); sizer->Add(v_sizer, 0, wxLEFT, border); @@ -239,47 +238,34 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : // axis_name->SetForegroundColour(wxColour(axes_color_text[axis_idx])); sizer = new wxBoxSizer(wxHORIZONTAL); - // Under OSX we use font, smaller than default font, so + // Under OSX or Linux with GTK3 we use font, smaller than default font, so // there is a next trick for an equivalent layout of coordinates combobox and axes labels in they own sizers - if (wxOSX) + if (wxOSX || wxGTK3) sizer->SetMinSize(-1, m_word_local_combo->GetBestHeight(-1)); sizer->Add(axis_name, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, border); // We will add a button to toggle mirroring to each axis: auto btn = new ScalableButton(parent, wxID_ANY, "mirroring_off", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER | wxTRANSPARENT_WINDOW); - btn->SetToolTip(wxString::Format(_L("Toggle %c axis mirroring"), (int)label)); - btn->SetBitmapDisabled_(m_mirror_bitmap_hidden); - - m_mirror_buttons[axis_idx].first = btn; - m_mirror_buttons[axis_idx].second = mbShown; + btn->SetToolTip(format_wxstr(_L("Mirror along %1% axis"), label)); + m_mirror_buttons[axis_idx] = btn; sizer->AddStretchSpacer(2); sizer->Add(btn, 0, wxALIGN_CENTER_VERTICAL); btn->Bind(wxEVT_BUTTON, [this, axis_idx](wxCommandEvent&) { - Axis axis = (Axis)(axis_idx + X); - if (m_mirror_buttons[axis_idx].second == mbHidden) - return; - GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); Selection& selection = canvas->get_selection(); + TransformationType transformation_type; + if (is_local_coordinates()) + transformation_type.set_local(); + else if (is_instance_coordinates()) + transformation_type.set_instance(); - if (selection.is_single_volume() || selection.is_single_modifier()) { - GLVolume* volume = const_cast(selection.get_volume(*selection.get_volume_idxs().begin())); - volume->set_volume_mirror(axis, -volume->get_volume_mirror(axis)); - } - else if (selection.is_single_full_instance()) { - for (unsigned int idx : selection.get_volume_idxs()) { - GLVolume* volume = const_cast(selection.get_volume(idx)); - volume->set_instance_mirror(axis, -volume->get_instance_mirror(axis)); - } - } - else - return; + transformation_type.set_relative(); + + selection.setup_cache(); + selection.mirror((Axis)axis_idx, transformation_type); - // Update mirroring at the GLVolumes. - selection.synchronize_unselected_instances(Selection::SYNC_ROTATION_GENERAL); - selection.synchronize_unselected_volumes(); // Copy mirroring values from GLVolumes into Model (ModelInstance / ModelVolume), trigger background processing. canvas->do_mirror(L("Set Mirror")); UpdateAndShow(true); @@ -288,7 +274,8 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : editors_grid_sizer->Add(sizer, 0, wxALIGN_CENTER_HORIZONTAL); } - editors_grid_sizer->AddStretchSpacer(1); + m_mirror_warning_bitmap = new wxStaticBitmap(parent, wxID_ANY, wxNullBitmap); + editors_grid_sizer->Add(m_mirror_warning_bitmap, 0, wxALIGN_CENTER_VERTICAL); editors_grid_sizer->AddStretchSpacer(1); // add EditBoxes @@ -327,27 +314,36 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); Selection& selection = canvas->get_selection(); - if (selection.is_single_volume() || selection.is_single_modifier()) { - const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); - - const Geometry::Transformation& instance_trafo = volume->get_instance_transformation(); - const Vec3d diff = m_cache.position - instance_trafo.get_matrix(true).inverse() * Vec3d(0., 0., get_volume_min_z(*volume)); + if (selection.is_single_volume_or_modifier()) { + const GLVolume* volume = selection.get_first_volume(); + const double min_z = get_volume_min_z(*volume); + if (!is_world_coordinates()) { + const Vec3d diff = m_cache.position - volume->get_instance_transformation().get_matrix_no_offset().inverse() * (min_z * Vec3d::UnitZ()); - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Drop to bed")); - change_position_value(0, diff.x()); - change_position_value(1, diff.y()); - change_position_value(2, diff.z()); + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Drop to bed")); + change_position_value(0, diff.x()); + change_position_value(1, diff.y()); + change_position_value(2, diff.z()); + } + else { + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Drop to bed")); + change_position_value(2, m_cache.position.z() - min_z); + } } else if (selection.is_single_full_instance()) { - const ModelObjectPtrs& objects = wxGetApp().model().objects; - const int idx = selection.get_object_idx(); - if (0 <= idx && idx < static_cast(objects.size())) { - const ModelObject* mo = wxGetApp().model().objects[idx]; - const double min_z = mo->bounding_box().min.z(); - if (std::abs(min_z) > SINKING_Z_THRESHOLD) { - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Drop to bed")); - change_position_value(2, m_cache.position.z() - min_z); - } + const double min_z = selection.get_scaled_instance_bounding_box().min.z(); + if (!is_world_coordinates()) { + const GLVolume* volume = selection.get_first_volume(); + const Vec3d diff = m_cache.position - volume->get_instance_transformation().get_matrix_no_offset().inverse() * (min_z * Vec3d::UnitZ()); + + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Drop to bed")); + change_position_value(0, diff.x()); + change_position_value(1, diff.y()); + change_position_value(2, diff.z()); + } + else { + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Drop to bed")); + change_position_value(2, m_cache.position.z() - min_z); } } }); @@ -364,23 +360,28 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : m_reset_rotation_button->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) { GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); Selection& selection = canvas->get_selection(); - - if (selection.is_single_volume() || selection.is_single_modifier()) { - GLVolume* volume = const_cast(selection.get_volume(*selection.get_volume_idxs().begin())); - volume->set_volume_rotation(Vec3d::Zero()); + selection.setup_cache(); + if (selection.is_single_volume_or_modifier()) { + GLVolume* vol = const_cast(selection.get_first_volume()); + Geometry::Transformation trafo = vol->get_volume_transformation(); + trafo.reset_rotation(); + vol->set_volume_transformation(trafo); } else if (selection.is_single_full_instance()) { + Geometry::Transformation trafo = selection.get_first_volume()->get_instance_transformation(); + trafo.reset_rotation(); for (unsigned int idx : selection.get_volume_idxs()) { - GLVolume* volume = const_cast(selection.get_volume(idx)); - volume->set_instance_rotation(Vec3d::Zero()); + const_cast(selection.get_volume(idx))->set_instance_transformation(trafo); } } else return; - // Update rotation at the GLVolumes. - selection.synchronize_unselected_instances(Selection::SYNC_ROTATION_GENERAL); + // Synchronize instances/volumes. + + selection.synchronize_unselected_instances(Selection::SyncRotationType::RESET); selection.synchronize_unselected_volumes(); + // Copy rotation values from GLVolumes into Model (ModelInstance / ModelVolume), trigger background processing. canvas->do_rotate(L("Reset Rotation")); @@ -397,11 +398,32 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : m_reset_scale_button = new ScalableButton(parent, wxID_ANY, ScalableBitmap(parent, "undo")); m_reset_scale_button->SetToolTip(_L("Reset scale")); m_reset_scale_button->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) { - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Reset scale")); - change_scale_value(0, 100.); - change_scale_value(1, 100.); - change_scale_value(2, 100.); - }); + GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); + Selection& selection = canvas->get_selection(); + selection.setup_cache(); + if (selection.is_single_volume_or_modifier()) { + GLVolume* vol = const_cast(selection.get_first_volume()); + Geometry::Transformation trafo = vol->get_volume_transformation(); + trafo.reset_scaling_factor(); + vol->set_volume_transformation(trafo); + } + else if (selection.is_single_full_instance()) { + Geometry::Transformation trafo = selection.get_first_volume()->get_instance_transformation(); + trafo.reset_scaling_factor(); + for (unsigned int idx : selection.get_volume_idxs()) { + const_cast(selection.get_volume(idx))->set_instance_transformation(trafo); + } + } + else + return; + + // Synchronize instances/volumes. + selection.synchronize_unselected_instances(Selection::SyncRotationType::GENERAL); + selection.synchronize_unselected_volumes(); + + canvas->do_scale(L("Reset scale")); + UpdateAndShow(true); + }); editors_grid_sizer->Add(m_reset_scale_button); for (size_t axis_idx = 0; axis_idx < sizeof(axes); axis_idx++) @@ -411,6 +433,23 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : m_main_grid_sizer->Add(editors_grid_sizer, 1, wxEXPAND); + m_skew_label = new wxStaticText(parent, wxID_ANY, _L("Skew [World]")); + m_main_grid_sizer->Add(m_skew_label, 1, wxEXPAND); + + m_reset_skew_button = new ScalableButton(parent, wxID_ANY, ScalableBitmap(parent, "undo")); + m_reset_skew_button->SetToolTip(_L("Reset skew")); + m_reset_skew_button->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) { + GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); + Selection& selection = canvas->get_selection(); + if (selection.is_single_full_instance() || selection.is_single_volume_or_modifier()) { + selection.setup_cache(); + selection.reset_skew(); + canvas->do_reset_skew(L("Reset skew")); + UpdateAndShow(true); + } + }); + m_main_grid_sizer->Add(m_reset_skew_button); + m_check_inch = new wxCheckBox(parent, wxID_ANY, _L("Inches")); m_check_inch->SetFont(wxGetApp().normal_font()); @@ -429,9 +468,9 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : void ObjectManipulation::Show(const bool show) { - if (show != IsShown()) { - // Show all lines of the panel. Some of these lines will be hidden in the lines below. - m_og->Show(show); + if (show != IsShown()) { + // Show all lines of the panel. Some of these lines will be hidden in the lines below. + m_og->Show(show); if (show && wxGetApp().get_mode() != comSimple) { // Show the label and the name of the STL in simple mode only. @@ -442,12 +481,27 @@ void ObjectManipulation::Show(const bool show) } } - if (show) { - // Show the "World Coordinates" / "Local Coordintes" Combo in Advanced / Expert mode only. - bool show_world_local_combo = wxGetApp().plater()->canvas3D()->get_selection().is_single_full_instance() && wxGetApp().get_mode() != comSimple; - m_word_local_combo->Show(show_world_local_combo); + if (show) { + ECoordinatesType coordinates_type = m_coordinates_type; + + // Show the "World Coordinates" / "Local Coordintes" Combo in Advanced / Expert mode only. + const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); + bool show_world_local_combo = wxGetApp().get_mode() != comSimple && (selection.is_single_full_instance() || selection.is_single_volume_or_modifier()); + if (selection.is_single_volume_or_modifier() && m_word_local_combo->GetCount() < 3) { +#ifdef __linux__ + m_word_local_combo->Insert(coordinate_type_str(ECoordinatesType::Local), 2); +#else + m_word_local_combo->Insert(coordinate_type_str(ECoordinatesType::Local), wxNullBitmap, 2); +#endif // __linux__ + } + else if (selection.is_single_full_instance() && m_word_local_combo->GetCount() > 2) { + m_word_local_combo->Delete(2); + if (coordinates_type > ECoordinatesType::Instance) + coordinates_type = ECoordinatesType::World; + } + m_word_local_combo->Show(show_world_local_combo); m_empty_str->Show(!show_world_local_combo); - } + } } bool ObjectManipulation::IsShown() @@ -465,10 +519,32 @@ void ObjectManipulation::UpdateAndShow(const bool show) OG_Settings::UpdateAndShow(show); } +void ObjectManipulation::Enable(const bool enadle) +{ + for (auto editor : m_editors) + editor->Enable(enadle); + for (wxWindow* win : std::initializer_list{ m_reset_scale_button, m_reset_rotation_button, m_drop_to_bed_button, m_check_inch, m_lock_bnt + , m_reset_skew_button }) + win->Enable(enadle); +} + +void ObjectManipulation::DisableScale() +{ + for (auto editor : m_editors) + editor->Enable(editor->has_opt_key("scale") || editor->has_opt_key("size") ? false : true); + for (wxWindow* win : std::initializer_list{ m_reset_scale_button, m_lock_bnt, m_reset_skew_button }) + win->Enable(false); +} + +void ObjectManipulation::DisableUnuniformScale() +{ + m_lock_bnt->Enable(false); +} + void ObjectManipulation::update_ui_from_settings() { - if (m_imperial_units != (wxGetApp().app_config->get("use_inches") == "1")) { - m_imperial_units = wxGetApp().app_config->get("use_inches") == "1"; + if (m_imperial_units != wxGetApp().app_config->get_bool("use_inches")) { + m_imperial_units = wxGetApp().app_config->get_bool("use_inches"); auto update_unit_text = [](const wxString& new_unit_text, wxStaticText* widget) { widget->SetLabel(new_unit_text); @@ -479,7 +555,10 @@ void ObjectManipulation::update_ui_from_settings() for (int i = 0; i < 3; ++i) { auto update = [this, i](/*ManipulationEditorKey*/int key_id, const Vec3d& new_value) { - wxString new_text = double_to_string(m_imperial_units ? new_value(i) * mm_to_in : new_value(i), 2); + double value = new_value(i); + if (m_imperial_units) + value *= mm_to_in; + wxString new_text = double_to_string(value, m_imperial_units && key_id == 3/*meSize*/ ? 4 : 2); const int id = key_id * 3 + i; if (id >= 0) m_editors[id]->set_value(new_text); }; @@ -489,9 +568,8 @@ void ObjectManipulation::update_ui_from_settings() } m_check_inch->SetValue(m_imperial_units); - if (m_use_colors != (wxGetApp().app_config->get("color_mapinulation_panel") == "1")) - { - m_use_colors = wxGetApp().app_config->get("color_mapinulation_panel") == "1"; + if (m_use_colors != wxGetApp().app_config->get_bool("color_mapinulation_panel")) { + m_use_colors = wxGetApp().app_config->get_bool("color_mapinulation_panel"); // update colors for edit-boxes int axis_id = 0; for (ManipulationEditor* editor : m_editors) { @@ -518,38 +596,36 @@ void ObjectManipulation::update_ui_from_settings() void ObjectManipulation::update_settings_value(const Selection& selection) { - m_new_move_label_string = L("Position"); + if (selection.is_empty()) { + // No selection, reset the cache. + reset_settings_value(); + return; + } + + m_new_move_label_string = L("Position"); m_new_rotate_label_string = L("Rotation"); m_new_scale_label_string = L("Scale factors"); - if (wxGetApp().get_mode() == comSimple) - m_world_coordinates = true; - ObjectList* obj_list = wxGetApp().obj_list(); if (selection.is_single_full_instance()) { // all volumes in the selection belongs to the same instance, any of them contains the needed instance data, so we take the first one - const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); - m_new_position = volume->get_instance_offset(); - - // Verify whether the instance rotation is multiples of 90 degrees, so that the scaling in world coordinates is possible. - if (m_world_coordinates && ! m_uniform_scale && - ! Geometry::is_rotation_ninety_degrees(volume->get_instance_rotation())) { - // Manipulating an instance in the world coordinate system, rotation is not multiples of ninety degrees, therefore enforce uniform scaling. - m_uniform_scale = true; - m_lock_bnt->SetLock(true); - } - - if (m_world_coordinates) { - m_new_rotate_label_string = L("Rotate"); - m_new_rotation = Vec3d::Zero(); - m_new_size = selection.get_scaled_instance_bounding_box().size(); - m_new_scale = m_new_size.cwiseProduct(selection.get_unscaled_instance_bounding_box().size().cwiseInverse()) * 100.; - } + const GLVolume* volume = selection.get_first_volume(); + + if (is_world_coordinates()) { + m_new_position = volume->get_instance_offset(); + m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); + m_new_scale = m_new_size.cwiseQuotient(selection.get_unscaled_instance_bounding_box().size()) * 100.0; + m_new_rotate_label_string = L("Rotate (relative)"); + m_new_rotation = Vec3d::Zero(); + } else { - m_new_rotation = volume->get_instance_rotation() * (180. / M_PI); - m_new_size = volume->get_instance_scaling_factor().cwiseProduct(wxGetApp().model().objects[volume->object_idx()]->raw_mesh_bounding_box().size()); - m_new_scale = volume->get_instance_scaling_factor() * 100.; - } + m_new_move_label_string = L("Translate (relative) [World]"); + m_new_rotate_label_string = L("Rotate (relative)"); + m_new_position = Vec3d::Zero(); + m_new_rotation = Vec3d::Zero(); + m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); + m_new_scale = m_new_size.cwiseQuotient(selection.get_full_unscaled_instance_local_bounding_box().size()) * 100.0; + } m_new_enabled = true; } @@ -557,34 +633,53 @@ void ObjectManipulation::update_settings_value(const Selection& selection) const BoundingBoxf3& box = selection.get_bounding_box(); m_new_position = box.center(); m_new_rotation = Vec3d::Zero(); - m_new_scale = Vec3d(100., 100., 100.); - m_new_size = box.size(); + m_new_scale = Vec3d(100.0, 100.0, 100.0); + m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); m_new_rotate_label_string = L("Rotate"); - m_new_scale_label_string = L("Scale"); + m_new_scale_label_string = L("Scale"); m_new_enabled = true; } - else if (selection.is_single_modifier() || selection.is_single_volume()) { + else if (selection.is_single_volume_or_modifier()) { // the selection contains a single volume - const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); - m_new_position = volume->get_volume_offset(); - m_new_rotation = volume->get_volume_rotation() * (180. / M_PI); - m_new_scale = volume->get_volume_scaling_factor() * 100.; - m_new_size = volume->get_instance_scaling_factor().cwiseProduct(volume->get_volume_scaling_factor().cwiseProduct(volume->bounding_box().size())); + const GLVolume* volume = selection.get_first_volume(); + if (is_world_coordinates()) { + const Geometry::Transformation trafo(volume->world_matrix()); + + const Vec3d& offset = trafo.get_offset(); + + m_new_position = offset; + m_new_rotate_label_string = L("Rotate (relative)"); + m_new_scale_label_string = L("Scale"); + m_new_scale = Vec3d(100.0, 100.0, 100.0); + m_new_rotation = Vec3d::Zero(); + m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); + } + else if (is_local_coordinates()) { + m_new_move_label_string = L("Translate (relative) [World]"); + m_new_rotate_label_string = L("Rotate (relative)"); + m_new_position = Vec3d::Zero(); + m_new_rotation = Vec3d::Zero(); + m_new_scale = volume->get_volume_scaling_factor() * 100.0; + m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); + } + else { + m_new_position = volume->get_volume_offset(); + m_new_rotate_label_string = L("Rotate (relative)"); + m_new_rotation = Vec3d::Zero(); + m_new_scale_label_string = L("Scale"); + m_new_scale = Vec3d(100.0, 100.0, 100.0); + m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); + } m_new_enabled = true; } - else if (obj_list->multiple_selection() || obj_list->is_selected(itInstanceRoot)) { + else if (obj_list->is_connectors_item_selected() || obj_list->multiple_selection() || obj_list->is_selected(itInstanceRoot)) { reset_settings_value(); - m_new_move_label_string = L("Translate"); - m_new_rotate_label_string = L("Rotate"); - m_new_scale_label_string = L("Scale"); - m_new_size = selection.get_bounding_box().size(); + m_new_move_label_string = L("Translate"); + m_new_rotate_label_string = L("Rotate"); + m_new_scale_label_string = L("Scale"); + m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); m_new_enabled = true; } - else { - // No selection, reset the cache. -// assert(selection.is_empty()); - reset_settings_value(); - } } void ObjectManipulation::update_if_dirty() @@ -617,14 +712,22 @@ void ObjectManipulation::update_if_dirty() for (int i = 0; i < 3; ++ i) { auto update = [this, i](Vec3d &cached, Vec3d &cached_rounded, ManipulationEditorKey key_id, const Vec3d &new_value) { - wxString new_text = double_to_string(new_value(i), 2); + wxString new_text = double_to_string(new_value(i), m_imperial_units && key_id == meSize ? 4 : 2); double new_rounded; new_text.ToDouble(&new_rounded); if (std::abs(cached_rounded(i) - new_rounded) > EPSILON) { cached_rounded(i) = new_rounded; const int id = key_id*3+i; - if (m_imperial_units && (key_id == mePosition || key_id == meSize)) - new_text = double_to_string(new_value(i)*mm_to_in, 2); + if (m_imperial_units) { + double inch_value = new_value(i) * mm_to_in; + if (key_id == mePosition) + new_text = double_to_string(inch_value, 2); + if (key_id == meSize) { + if(std::abs(m_cache.size_inches(i) - inch_value) > EPSILON) + m_cache.size_inches(i) = inch_value; + new_text = double_to_string(inch_value, 4); + } + } if (id >= 0) m_editors[id]->set_value(new_text); } cached(i) = new_value(i); @@ -635,78 +738,64 @@ void ObjectManipulation::update_if_dirty() update(m_cache.rotation, m_cache.rotation_rounded, meRotation, m_new_rotation); } - if (selection.requires_uniform_scale()) { - m_lock_bnt->SetLock(true); - m_lock_bnt->SetToolTip(_L("You cannot use non-uniform scaling mode for multiple objects/parts selection")); - m_lock_bnt->disable(); - } - else { - m_lock_bnt->SetLock(m_uniform_scale); - m_lock_bnt->SetToolTip(wxEmptyString); - m_lock_bnt->enable(); - } - - { - int new_selection = m_world_coordinates ? 0 : 1; - if (m_word_local_combo->GetSelection() != new_selection) - m_word_local_combo->SetSelection(new_selection); - } + m_lock_bnt->SetLock(m_uniform_scale); + m_lock_bnt->SetToolTip(wxEmptyString); + m_lock_bnt->enable(); if (m_new_enabled) m_og->enable(); else m_og->disable(); - if (!selection.is_dragging()) { + if (!wxGetApp().plater()->canvas3D()->is_dragging()) { update_reset_buttons_visibility(); - update_mirror_buttons_visibility(); + update_mirror_buttons_visibility(); } m_dirty = false; } - - void ObjectManipulation::update_reset_buttons_visibility() { GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); if (!canvas) return; - const Selection& selection = canvas->get_selection(); + bool show_drop_to_bed = false; bool show_rotation = false; bool show_scale = false; - bool show_drop_to_bed = false; - - if (selection.is_single_full_instance() || selection.is_single_modifier() || selection.is_single_volume()) { - const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); - Vec3d rotation; - Vec3d scale; - double min_z = 0.; + bool show_mirror = false; + bool show_skew = false; - if (selection.is_single_full_instance()) { - rotation = volume->get_instance_rotation(); - scale = volume->get_instance_scaling_factor(); - min_z = wxGetApp().model().objects[volume->composite_id.object_id]->bounding_box().min.z(); - } - else { - rotation = volume->get_volume_rotation(); - scale = volume->get_volume_scaling_factor(); - min_z = get_volume_min_z(*volume); - } - show_rotation = !rotation.isApprox(Vec3d::Zero()); - show_scale = !scale.isApprox(Vec3d::Ones()); - show_drop_to_bed = std::abs(min_z) > SINKING_Z_THRESHOLD; + const Selection& selection = canvas->get_selection(); + if (selection.is_single_full_instance() || selection.is_single_volume_or_modifier()) { + const double min_z = selection.is_single_full_instance() ? selection.get_scaled_instance_bounding_box().min.z() : + get_volume_min_z(*selection.get_first_volume()); + + show_drop_to_bed = std::abs(min_z) > EPSILON; + const GLVolume* volume = selection.get_first_volume(); + const Geometry::Transformation trafo = selection.is_single_full_instance() ? volume->get_instance_transformation() : volume->get_volume_transformation(); + + const Geometry::TransformationSVD trafo_svd(trafo); + show_rotation = trafo_svd.rotation; + show_scale = trafo_svd.scale; + show_mirror = trafo_svd.mirror; + show_skew = Geometry::TransformationSVD(volume->world_matrix()).skew; } - wxGetApp().CallAfter([this, show_rotation, show_scale, show_drop_to_bed] { + wxGetApp().CallAfter([this, show_drop_to_bed, show_rotation, show_scale, show_mirror, show_skew] { // There is a case (under OSX), when this function is called after the Manipulation panel is hidden // So, let check if Manipulation panel is still shown for this moment if (!this->IsShown()) return; + m_drop_to_bed_button->Show(show_drop_to_bed); m_reset_rotation_button->Show(show_rotation); m_reset_scale_button->Show(show_scale); - m_drop_to_bed_button->Show(show_drop_to_bed); + m_mirror_warning_bitmap->SetBitmap(show_mirror ? m_manifold_warning_bmp.bmp() : wxNullBitmap); + m_mirror_warning_bitmap->SetMinSize(show_mirror ? m_manifold_warning_bmp.GetSize() : wxSize(0, 0)); + m_mirror_warning_bitmap->SetToolTip(show_mirror ? _L("Left handed") : ""); + m_reset_skew_button->Show(show_skew); + m_skew_label->Show(show_skew); // Because of CallAfter we need to layout sidebar after Show/hide of reset buttons one more time Sidebar& panel = wxGetApp().sidebar(); @@ -718,49 +807,12 @@ void ObjectManipulation::update_reset_buttons_visibility() }); } - - void ObjectManipulation::update_mirror_buttons_visibility() { - GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); - Selection& selection = canvas->get_selection(); - std::array new_states = {mbHidden, mbHidden, mbHidden}; - - if (!m_world_coordinates) { - if (selection.is_single_full_instance() || selection.is_single_modifier() || selection.is_single_volume()) { - const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); - Vec3d mirror; - - if (selection.is_single_full_instance()) - mirror = volume->get_instance_mirror(); - else - mirror = volume->get_volume_mirror(); - - for (unsigned char i=0; i<3; ++i) - new_states[i] = (mirror[i] < 0. ? mbActive : mbShown); - } + const bool can_mirror = wxGetApp().plater()->can_mirror(); + for (ScalableButton* button : m_mirror_buttons) { + button->Enable(can_mirror); } - else { - // the mirroring buttons should be hidden in world coordinates, - // unless we make it actually mirror in world coords. - } - - // Hiding the buttons through Hide() always messed up the sizers. As a workaround, the button - // is assigned a transparent bitmap. We must of course remember the actual state. - wxGetApp().CallAfter([this, new_states]{ - for (int i=0; i<3; ++i) { - if (new_states[i] != m_mirror_buttons[i].second) { - const ScalableBitmap* bmp = nullptr; - switch (new_states[i]) { - case mbHidden : bmp = &m_mirror_bitmap_hidden; m_mirror_buttons[i].first->Enable(false); break; - case mbShown : bmp = &m_mirror_bitmap_off; m_mirror_buttons[i].first->Enable(true); break; - case mbActive : bmp = &m_mirror_bitmap_on; m_mirror_buttons[i].first->Enable(true); break; - } - m_mirror_buttons[i].first->SetBitmap_(*bmp); - m_mirror_buttons[i].second = new_states[i]; - } - } - }); } @@ -788,10 +840,34 @@ void ObjectManipulation::update_warning_icon_state(const MeshErrorsInfo& warning m_manifold_warning_bmp = ScalableBitmap(m_parent, warning_icon_name); const wxString& tooltip = warning.tooltip; m_fix_throught_netfab_bitmap->SetBitmap(tooltip.IsEmpty() ? wxNullBitmap : m_manifold_warning_bmp.bmp()); - m_fix_throught_netfab_bitmap->SetMinSize(tooltip.IsEmpty() ? wxSize(0,0) : m_manifold_warning_bmp.bmp().GetSize()); + m_fix_throught_netfab_bitmap->SetMinSize(tooltip.IsEmpty() ? wxSize(0,0) : m_manifold_warning_bmp.GetSize()); m_fix_throught_netfab_bitmap->SetToolTip(tooltip); } +wxString ObjectManipulation::coordinate_type_str(ECoordinatesType type) +{ + switch (type) + { + case ECoordinatesType::World: { return _L("World coordinates"); } + case ECoordinatesType::Instance: { return _L("Object coordinates"); } + case ECoordinatesType::Local: { return _L("Part coordinates"); } + default: { assert(false); return _L("Unknown"); } + } +} + +#if ENABLE_OBJECT_MANIPULATION_DEBUG +void ObjectManipulation::render_debug_window() +{ + ImGuiWrapper& imgui = *wxGetApp().imgui(); +// ImGui::SetNextWindowCollapsed(true, ImGuiCond_Once); + imgui.begin(std::string("ObjectManipulation"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "Coordinates type"); + ImGui::SameLine(); + imgui.text(coordinate_type_str(m_coordinates_type)); + imgui.end(); +} +#endif // ENABLE_OBJECT_MANIPULATION_DEBUG + void ObjectManipulation::reset_settings_value() { m_new_position = Vec3d::Zero(); @@ -814,9 +890,16 @@ void ObjectManipulation::change_position_value(int axis, double value) auto canvas = wxGetApp().plater()->canvas3D(); Selection& selection = canvas->get_selection(); - selection.start_dragging(); - selection.translate(position - m_cache.position, selection.requires_local_axes()); - selection.stop_dragging(); + selection.setup_cache(); + TransformationType trafo_type; + trafo_type.set_relative(); + switch (get_coordinates_type()) + { + case ECoordinatesType::Instance: { trafo_type.set_instance(); break; } + case ECoordinatesType::Local: { trafo_type.set_local(); break; } + default: { break; } + } + selection.translate(position - m_cache.position, trafo_type); canvas->do_move(L("Set Position")); m_cache.position = position; @@ -835,20 +918,21 @@ void ObjectManipulation::change_rotation_value(int axis, double value) GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); Selection& selection = canvas->get_selection(); - TransformationType transformation_type(TransformationType::World_Relative_Joint); - if (selection.is_single_full_instance() || selection.requires_local_axes()) - transformation_type.set_independent(); - if (selection.is_single_full_instance() && ! m_world_coordinates) { - //FIXME Selection::rotate() does not process absoulte rotations correctly: It does not recognize the axis index, which was changed. - // transformation_type.set_absolute(); - transformation_type.set_local(); - } + TransformationType transformation_type; + transformation_type.set_relative(); + if (selection.is_single_full_instance()) + transformation_type.set_independent(); + + if (is_local_coordinates()) + transformation_type.set_local(); - selection.start_dragging(); + if (is_instance_coordinates()) + transformation_type.set_instance(); + + selection.setup_cache(); selection.rotate( (M_PI / 180.0) * (transformation_type.absolute() ? rotation : rotation - m_cache.rotation), transformation_type); - selection.stop_dragging(); canvas->do_rotate(L("Set Orientation")); m_cache.rotation = rotation; @@ -865,13 +949,22 @@ void ObjectManipulation::change_scale_value(int axis, double value) return; Vec3d scale = m_cache.scale; - scale(axis) = value; + scale(axis) = value; + + const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); + Vec3d ref_scale = m_cache.scale; + if (selection.is_single_volume_or_modifier()) { + scale = scale.cwiseQuotient(ref_scale); + ref_scale = Vec3d::Ones(); + } + else if (selection.is_single_full_instance()) + ref_scale = 100.0 * Vec3d::Ones(); - this->do_scale(axis, 0.01 * scale); + this->do_scale(axis, scale.cwiseQuotient(ref_scale)); m_cache.scale = scale; - m_cache.scale_rounded(axis) = DBL_MAX; - this->UpdateAndShow(true); + m_cache.scale_rounded(axis) = DBL_MAX; + this->UpdateAndShow(true); } @@ -880,6 +973,13 @@ void ObjectManipulation::change_size_value(int axis, double value) if (value <= 0.0) return; + if (m_imperial_units) { + if (std::abs(m_cache.size_inches(axis) - value) < EPSILON) + return; + m_cache.size_inches(axis) = value; + value *= in_to_mm; + } + if (std::abs(m_cache.size_rounded(axis) - value) < EPSILON) return; @@ -889,46 +989,56 @@ void ObjectManipulation::change_size_value(int axis, double value) const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); Vec3d ref_size = m_cache.size; - if (selection.is_single_volume() || selection.is_single_modifier()) { - const GLVolume* v = selection.get_volume(*selection.get_volume_idxs().begin()); - const Vec3d local_size = size.cwiseQuotient(v->get_instance_scaling_factor()); - const Vec3d local_ref_size = v->bounding_box().size().cwiseProduct(v->get_volume_scaling_factor()); - const Vec3d local_change = local_size.cwiseQuotient(local_ref_size); - - size = local_change.cwiseProduct(v->get_volume_scaling_factor()); + if (selection.is_single_volume_or_modifier()) { + size = size.cwiseQuotient(ref_size); ref_size = Vec3d::Ones(); } - else if (selection.is_single_full_instance()) - ref_size = m_world_coordinates ? - selection.get_unscaled_instance_bounding_box().size() : - wxGetApp().model().objects[selection.get_volume(*selection.get_volume_idxs().begin())->object_idx()]->raw_mesh_bounding_box().size(); + else if (selection.is_single_full_instance()) { + if (is_world_coordinates()) + ref_size = selection.get_full_unscaled_instance_bounding_box().size(); + else + ref_size = selection.get_full_unscaled_instance_local_bounding_box().size(); + } - this->do_scale(axis, size.cwiseQuotient(ref_size)); + this->do_size(axis, size.cwiseQuotient(ref_size)); m_cache.size = size; - m_cache.size_rounded(axis) = DBL_MAX; - this->UpdateAndShow(true); + m_cache.size_rounded(axis) = DBL_MAX; + this->UpdateAndShow(true); } void ObjectManipulation::do_scale(int axis, const Vec3d &scale) const { + TransformationType transformation_type; + if (is_local_coordinates()) + transformation_type.set_local(); + else if (is_instance_coordinates()) + transformation_type.set_instance(); + Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); - Vec3d scaling_factor = scale; + if (selection.is_single_volume_or_modifier() && !is_local_coordinates()) + transformation_type.set_relative(); - TransformationType transformation_type(TransformationType::World_Relative_Joint); - if (selection.is_single_full_instance()) { - transformation_type.set_absolute(); - if (! m_world_coordinates) - transformation_type.set_local(); - } + const Vec3d scaling_factor = m_uniform_scale ? scale(axis) * Vec3d::Ones() : scale; + selection.setup_cache(); + selection.scale(scaling_factor, transformation_type); + wxGetApp().plater()->canvas3D()->do_scale(L("Set Scale")); +} - if (m_uniform_scale || selection.requires_uniform_scale()) - scaling_factor = scale(axis) * Vec3d::Ones(); +void ObjectManipulation::do_size(int axis, const Vec3d& scale) const +{ + Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); + + TransformationType transformation_type; + if (is_local_coordinates()) + transformation_type.set_local(); + else if (is_instance_coordinates()) + transformation_type.set_instance(); - selection.start_dragging(); + const Vec3d scaling_factor = m_uniform_scale ? scale(axis) * Vec3d::Ones() : scale; + selection.setup_cache(); selection.scale(scaling_factor, transformation_type); - selection.stop_dragging(); - wxGetApp().plater()->canvas3D()->do_scale(L("Set Scale")); + wxGetApp().plater()->canvas3D()->do_scale(L("Set Size")); } void ObjectManipulation::on_change(const std::string& opt_key, int axis, double new_value) @@ -936,11 +1046,11 @@ void ObjectManipulation::on_change(const std::string& opt_key, int axis, double if (!m_cache.is_valid()) return; - if (m_imperial_units && (opt_key == "position" || opt_key == "size")) - new_value *= in_to_mm; - - if (opt_key == "position") + if (opt_key == "position") { + if (m_imperial_units) + new_value *= in_to_mm; change_position_value(axis, new_value); + } else if (opt_key == "rotation") change_rotation_value(axis, new_value); else if (opt_key == "scale") { @@ -957,47 +1067,45 @@ void ObjectManipulation::on_change(const std::string& opt_key, int axis, double if (new_value > 0.0) change_size_value(axis, new_value); else { - new_value = m_cache.size(axis); - m_cache.size(axis) = 0.0; + Vec3d& size = m_imperial_units ? m_cache.size_inches : m_cache.size; + new_value = size(axis); + size(axis) = 0.0; m_cache.size_rounded(axis) = DBL_MAX; change_size_value(axis, new_value); } } } -void ObjectManipulation::set_uniform_scaling(const bool new_value) +void ObjectManipulation::set_uniform_scaling(const bool use_uniform_scale) { - const Selection &selection = wxGetApp().plater()->canvas3D()->get_selection(); - if (selection.is_single_full_instance() && m_world_coordinates && !new_value) { - // Verify whether the instance rotation is multiples of 90 degrees, so that the scaling in world coordinates is possible. - // all volumes in the selection belongs to the same instance, any of them contains the needed instance data, so we take the first one - const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); - // Is the angle close to a multiple of 90 degrees? - if (! Geometry::is_rotation_ninety_degrees(volume->get_instance_rotation())) { - // Cannot apply scaling in the world coordinate system. - //wxMessageDialog dlg(GUI::wxGetApp().mainframe, - MessageDialog dlg(GUI::wxGetApp().mainframe, - _L("The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n" - "Non-uniform scaling of tilted objects is only possible in the World coordinate system,\n" - "once the rotation is embedded into the object coordinates.") + "\n" + - _L("This operation is irreversible.\n" - "Do you want to proceed?"), - SLIC3R_APP_NAME, - wxYES_NO | wxCANCEL | wxCANCEL_DEFAULT | wxICON_QUESTION); - if (dlg.ShowModal() != wxID_YES) { - // Enforce uniform scaling. - m_lock_bnt->SetLock(true); - return; - } - // Bake the rotation into the meshes of the object. - wxGetApp().model().objects[volume->composite_id.object_id]->bake_xy_rotation_into_meshes(volume->composite_id.instance_id); - // Update the 3D scene, selections etc. - wxGetApp().plater()->update(); - // Recalculate cached values at this panel, refresh the screen. - this->UpdateAndShow(true); - } - } - m_uniform_scale = new_value; + if (!use_uniform_scale) + // Recalculate cached values at this panel, refresh the screen. + this->UpdateAndShow(true); + + m_uniform_scale = use_uniform_scale; + set_dirty(); +} + +void ObjectManipulation::set_coordinates_type(ECoordinatesType type) +{ + if (wxGetApp().get_mode() == comSimple) + type = ECoordinatesType::World; + + if (m_coordinates_type == type) + return; + + m_coordinates_type = type; + m_word_local_combo->SetSelection((int)m_coordinates_type); + this->UpdateAndShow(true); + GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); + canvas->get_gizmos_manager().update_data(); + canvas->set_as_dirty(); + canvas->request_extra_frame(); +} + +ECoordinatesType ObjectManipulation::get_coordinates_type() const +{ + return m_coordinates_type; } void ObjectManipulation::msw_rescale() @@ -1006,22 +1114,10 @@ void ObjectManipulation::msw_rescale() m_item_name->SetMinSize(wxSize(20*em, wxDefaultCoord)); msw_rescale_word_local_combo(m_word_local_combo); m_word_local_combo_sizer->SetMinSize(wxSize(-1, m_word_local_combo->GetBestHeight(-1))); - m_manifold_warning_bmp.msw_rescale(); const wxString& tooltip = m_fix_throught_netfab_bitmap->GetToolTipText(); m_fix_throught_netfab_bitmap->SetBitmap(tooltip.IsEmpty() ? wxNullBitmap : m_manifold_warning_bmp.bmp()); - m_fix_throught_netfab_bitmap->SetMinSize(tooltip.IsEmpty() ? wxSize(0, 0) : m_manifold_warning_bmp.bmp().GetSize()); - - m_mirror_bitmap_on.msw_rescale(); - m_mirror_bitmap_off.msw_rescale(); - m_mirror_bitmap_hidden.msw_rescale(); - m_reset_scale_button->msw_rescale(); - m_reset_rotation_button->msw_rescale(); - m_drop_to_bed_button->msw_rescale(); - m_lock_bnt->msw_rescale(); - - for (int id = 0; id < 3; ++id) - m_mirror_buttons[id].first->msw_rescale(); + m_fix_throught_netfab_bitmap->SetMinSize(tooltip.IsEmpty() ? wxSize(0, 0) : m_manifold_warning_bmp.GetSize()); // rescale label-heights // Text trick to grid sizer layout: @@ -1035,7 +1131,7 @@ void ObjectManipulation::msw_rescale() editor->msw_rescale(); // rescale "inches" checkbox - m_check_inch->SetMinSize(wxSize(-1, int(1.5f * m_check_inch->GetFont().GetPixelSize().y + 0.5f))); + m_check_inch->SetInitialSize(m_check_inch->GetBestSize()); get_og()->msw_rescale(); } @@ -1050,17 +1146,25 @@ void ObjectManipulation::sys_color_changed() for (ManipulationEditor* editor : m_editors) editor->sys_color_changed(this); - // btn...->msw_rescale() updates icon on button, so use it - m_mirror_bitmap_on.msw_rescale(); - m_mirror_bitmap_off.msw_rescale(); - m_mirror_bitmap_hidden.msw_rescale(); - m_reset_scale_button->msw_rescale(); - m_reset_rotation_button->msw_rescale(); - m_drop_to_bed_button->msw_rescale(); - m_lock_bnt->msw_rescale(); - - for (int id = 0; id < 3; ++id) - m_mirror_buttons[id].first->msw_rescale(); + m_mirror_bitmap_on.sys_color_changed(); + m_reset_scale_button->sys_color_changed(); + m_reset_rotation_button->sys_color_changed(); + m_drop_to_bed_button->sys_color_changed(); + m_lock_bnt->sys_color_changed(); + + for (int id = 0; id < 3; ++id) { + m_mirror_buttons[id]->sys_color_changed(); + } +} + +void ObjectManipulation::set_coordinates_type(const wxString& type_string) +{ + if (type_string == coordinate_type_str(ECoordinatesType::Instance)) + this->set_coordinates_type(ECoordinatesType::Instance); + else if (type_string == coordinate_type_str(ECoordinatesType::Local)) + this->set_coordinates_type(ECoordinatesType::Local); + else + this->set_coordinates_type(ECoordinatesType::World); } static const char axes[] = { 'x', 'y', 'z' }; @@ -1105,7 +1209,7 @@ ManipulationEditor::ManipulationEditor(ObjectManipulation* parent, if (!m_enter_pressed) kill_focus(parent); - + e.Skip(); }, this->GetId()); diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.hpp b/src/slic3r/GUI/GUI_ObjectManipulation.hpp index a15c72fb8ed..428ffc24b38 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.hpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.hpp @@ -5,6 +5,7 @@ #include "GUI_ObjectSettings.hpp" #include "GUI_ObjectList.hpp" +#include "GUI_Geometry.hpp" #include "libslic3r/Point.hpp" #include @@ -57,6 +58,10 @@ class ManipulationEditor : public wxTextCtrl void set_value(const wxString& new_value); void kill_focus(ObjectManipulation *parent); + const std::string& get_full_opt_name() const { return m_full_opt_name; } + + bool has_opt_key(const std::string& key) { return m_opt_key == key; } + private: double get_value(); }; @@ -78,6 +83,7 @@ class ObjectManipulation : public OG_Settings Vec3d scale; Vec3d scale_rounded; Vec3d size; + Vec3d size_inches; Vec3d size_rounded; wxString move_label_string; @@ -113,53 +119,46 @@ class ObjectManipulation : public OG_Settings wxStaticText* m_empty_str = nullptr; // Non-owning pointers to the reset buttons, so we can hide and show them. - ScalableButton* m_reset_scale_button = nullptr; - ScalableButton* m_reset_rotation_button = nullptr; - ScalableButton* m_drop_to_bed_button = nullptr; + ScalableButton* m_reset_scale_button{ nullptr }; + ScalableButton* m_reset_rotation_button{ nullptr }; + ScalableButton* m_reset_skew_button{ nullptr }; + ScalableButton* m_drop_to_bed_button{ nullptr }; wxCheckBox* m_check_inch {nullptr}; - // Mirroring buttons and their current state - enum MirrorButtonState { - mbHidden, - mbShown, - mbActive - }; - std::array, 3> m_mirror_buttons; + std::array m_mirror_buttons; // Bitmaps for the mirroring buttons. ScalableBitmap m_mirror_bitmap_on; - ScalableBitmap m_mirror_bitmap_off; - ScalableBitmap m_mirror_bitmap_hidden; // Needs to be updated from OnIdle? bool m_dirty = false; // Cached labels for the delayed update, not localized! std::string m_new_move_label_string; - std::string m_new_rotate_label_string; - std::string m_new_scale_label_string; + std::string m_new_rotate_label_string; + std::string m_new_scale_label_string; Vec3d m_new_position; Vec3d m_new_rotation; Vec3d m_new_scale; Vec3d m_new_size; bool m_new_enabled {true}; bool m_uniform_scale {true}; - // Does the object manipulation panel work in World or Local coordinates? - bool m_world_coordinates = true; + ECoordinatesType m_coordinates_type{ ECoordinatesType::World }; LockButton* m_lock_bnt{ nullptr }; choice_ctrl* m_word_local_combo { nullptr }; ScalableBitmap m_manifold_warning_bmp; - wxStaticBitmap* m_fix_throught_netfab_bitmap; + wxStaticBitmap* m_fix_throught_netfab_bitmap{ nullptr }; + wxStaticBitmap* m_mirror_warning_bitmap{ nullptr }; -#ifndef __APPLE__ // Currently focused editor (nullptr if none) - ManipulationEditor* m_focused_editor {nullptr}; -#endif // __APPLE__ + ManipulationEditor* m_focused_editor{ nullptr }; wxFlexGridSizer* m_main_grid_sizer; wxFlexGridSizer* m_labels_grid_sizer; + wxStaticText* m_skew_label{ nullptr }; + // sizers, used for msw_rescale wxBoxSizer* m_word_local_combo_sizer; std::vector m_rescalable_sizers; @@ -173,6 +172,10 @@ class ObjectManipulation : public OG_Settings void Show(const bool show) override; bool IsShown() override; void UpdateAndShow(const bool show) override; + void Enable(const bool enadle = true); + void Disable() { Enable(false); } + void DisableScale(); + void DisableUnuniformScale(); void update_ui_from_settings(); bool use_colors() { return m_use_colors; } @@ -180,11 +183,14 @@ class ObjectManipulation : public OG_Settings // Called from the App to update the UI if dirty. void update_if_dirty(); - void set_uniform_scaling(const bool uniform_scale); + void set_uniform_scaling(const bool use_uniform_scale); bool get_uniform_scaling() const { return m_uniform_scale; } - // Does the object manipulation panel work in World or Local coordinates? - void set_world_coordinates(const bool world_coordinates) { m_world_coordinates = world_coordinates; this->UpdateAndShow(true); } - bool get_world_coordinates() const { return m_world_coordinates; } + + void set_coordinates_type(ECoordinatesType type); + ECoordinatesType get_coordinates_type() const; + bool is_world_coordinates() const { return m_coordinates_type == ECoordinatesType::World; } + bool is_instance_coordinates() const { return m_coordinates_type == ECoordinatesType::Instance; } + bool is_local_coordinates() const { return m_coordinates_type == ECoordinatesType::Local; } void reset_cache() { m_cache.reset(); } #ifndef __APPLE__ @@ -200,11 +206,17 @@ class ObjectManipulation : public OG_Settings void sys_color_changed(); void on_change(const std::string& opt_key, int axis, double new_value); void set_focused_editor(ManipulationEditor* focused_editor) { -#ifndef __APPLE__ m_focused_editor = focused_editor; -#endif // __APPLE__ } + ManipulationEditor* get_focused_editor() { return m_focused_editor; } + + static wxString coordinate_type_str(ECoordinatesType type); + +#if ENABLE_OBJECT_MANIPULATION_DEBUG + void render_debug_window(); +#endif // ENABLE_OBJECT_MANIPULATION_DEBUG + private: void reset_settings_value(); void update_settings_value(const Selection& selection); @@ -220,6 +232,9 @@ class ObjectManipulation : public OG_Settings void change_scale_value(int axis, double value); void change_size_value(int axis, double value); void do_scale(int axis, const Vec3d &scale) const; + void do_size(int axis, const Vec3d& scale) const; + + void set_coordinates_type(const wxString& type_string); }; }} diff --git a/src/slic3r/GUI/GUI_ObjectSettings.cpp b/src/slic3r/GUI/GUI_ObjectSettings.cpp index 291013fe9d5..a6d85cef71d 100644 --- a/src/slic3r/GUI/GUI_ObjectSettings.cpp +++ b/src/slic3r/GUI/GUI_ObjectSettings.cpp @@ -12,6 +12,7 @@ #include #include "I18N.hpp" +#include "format.hpp" #include "ConfigManipulation.hpp" #include @@ -99,10 +100,10 @@ bool ObjectSettings::update_settings_list() btn->SetToolTip(_(L("Remove parameter"))); btn->SetBitmapFocus(m_bmp_delete_focus.bmp()); - btn->SetBitmapHover(m_bmp_delete_focus.bmp()); + btn->SetBitmapCurrent(m_bmp_delete_focus.bmp()); btn->Bind(wxEVT_BUTTON, [opt_key, config, this](wxEvent &event) { - wxGetApp().plater()->take_snapshot(from_u8((boost::format(_utf8(L("Delete Option %s"))) % opt_key).str())); + wxGetApp().plater()->take_snapshot(format_wxstr(_L("Delete Option %s"), opt_key)); config->erase(opt_key); wxGetApp().obj_list()->changed_object(); wxTheApp->CallAfter([this]() { @@ -133,7 +134,7 @@ bool ObjectSettings::update_settings_list() return; ctrl->SetBitmap_(m_bmp_delete); ctrl->SetBitmapFocus(m_bmp_delete_focus.bmp()); - ctrl->SetBitmapHover(m_bmp_delete_focus.bmp()); + ctrl->SetBitmapCurrent(m_bmp_delete_focus.bmp()); }; const bool is_extruders_cat = cat.first == "Extruders"; @@ -151,7 +152,7 @@ bool ObjectSettings::update_settings_list() for (auto& opt : cat.second) optgroup->get_field(opt)->m_on_change = [optgroup](const std::string& opt_id, const boost::any& value) { // first of all take a snapshot and then change value in configuration - wxGetApp().plater()->take_snapshot(from_u8((boost::format(_utf8(L("Change Option %s"))) % opt_id).str())); + wxGetApp().plater()->take_snapshot(format_wxstr(_L("Change Option %s"), opt_id)); optgroup->on_change_OG(opt_id, value); }; @@ -268,15 +269,6 @@ void ObjectSettings::UpdateAndShow(const bool show) OG_Settings::UpdateAndShow(show ? update_settings_list() : false); } -void ObjectSettings::msw_rescale() -{ - m_bmp_delete.msw_rescale(); - m_bmp_delete_focus.msw_rescale(); - - for (auto group : m_og_settings) - group->msw_rescale(); -} - void ObjectSettings::sys_color_changed() { m_og->sys_color_changed(); diff --git a/src/slic3r/GUI/GUI_ObjectSettings.hpp b/src/slic3r/GUI/GUI_ObjectSettings.hpp index e5a6937f114..677c6ab8234 100644 --- a/src/slic3r/GUI/GUI_ObjectSettings.hpp +++ b/src/slic3r/GUI/GUI_ObjectSettings.hpp @@ -30,6 +30,7 @@ class OG_Settings virtual wxSizer* get_sizer(); ConfigOptionsGroup* get_og() { return m_og.get(); } + const ConfigOptionsGroup* get_og() const { return m_og.get(); } wxWindow* parent() const {return m_parent; } }; @@ -56,7 +57,6 @@ class ObjectSettings : public OG_Settings bool add_missed_options(ModelConfig *config_to, const DynamicPrintConfig &config_from); void update_config_values(ModelConfig *config); void UpdateAndShow(const bool show) override; - void msw_rescale(); void sys_color_changed(); }; diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 156444a514f..656bc0b5381 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -63,8 +63,9 @@ bool View3D::init(wxWindow* parent, Bed3D& bed, Model* model, DynamicPrintConfig m_canvas->set_context(wxGetApp().init_glcontext(*m_canvas_widget)); m_canvas->allow_multisample(OpenGLManager::can_multisample()); - // XXX: If have OpenGL + m_canvas->enable_picking(true); + m_canvas->get_selection().set_mode(Selection::Instance); m_canvas->enable_moving(true); // XXX: more config from 3D.pm m_canvas->set_model(model); @@ -208,68 +209,6 @@ bool Preview::init(wxWindow* parent, Bed3D& bed, Model* model) m_layers_slider_sizer = create_layers_slider_sizer(); wxGetApp().UpdateDarkUI(m_bottom_toolbar_panel = new wxPanel(this)); - m_label_view_type = new wxStaticText(m_bottom_toolbar_panel, wxID_ANY, _L("View")); -#ifdef _WIN32 - wxGetApp().UpdateDarkUI(m_choice_view_type = new BitmapComboBox(m_bottom_toolbar_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY)); -#else - m_choice_view_type = new wxComboBox(m_bottom_toolbar_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY); -#endif - m_choice_view_type->Append(_L("Feature type")); - m_choice_view_type->Append(_L("Height")); - m_choice_view_type->Append(_L("Width")); - m_choice_view_type->Append(_L("Speed")); - m_choice_view_type->Append(_L("Fan speed")); - m_choice_view_type->Append(_L("Temperature")); - m_choice_view_type->Append(_L("Volumetric flow rate")); - m_choice_view_type->Append(_L("Tool")); - m_choice_view_type->Append(_L("Color Print")); - m_choice_view_type->SetSelection(0); - - m_label_show = new wxStaticText(m_bottom_toolbar_panel, wxID_ANY, _L("Show")); - -#ifdef _WIN32 - long combo_style = wxCB_READONLY | wxBORDER_SIMPLE; //set border allows use default color instead of theme color wich is allways light under MSW -#else - long combo_style = wxCB_READONLY; -#endif - m_combochecklist_features = new wxComboCtrl(); - m_combochecklist_features->Create(m_bottom_toolbar_panel, wxID_ANY, _L("Feature types"), wxDefaultPosition, wxDefaultSize, combo_style); - std::string feature_items = GUI::into_u8( - _L("Unknown") + "|1|" + - _L("Perimeter") + "|1|" + - _L("External perimeter") + "|1|" + - _L("Overhang perimeter") + "|1|" + - _L("Internal infill") + "|1|" + - _L("Solid infill") + "|1|" + - _L("Top solid infill") + "|1|" + - _L("Ironing") + "|1|" + - _L("Bridge infill") + "|1|" + - _L("Gap fill") + "|1|" + - _L("Skirt/Brim") + "|1|" + - _L("Support material") + "|1|" + - _L("Support material interface") + "|1|" + - _L("Wipe tower") + "|1|" + - _L("Custom") + "|1" - ); - Slic3r::GUI::create_combochecklist(m_combochecklist_features, GUI::into_u8(_L("Feature types")), feature_items); - - m_combochecklist_options = new wxComboCtrl(); - m_combochecklist_options->Create(m_bottom_toolbar_panel, wxID_ANY, _L("Options"), wxDefaultPosition, wxDefaultSize, combo_style); - std::string options_items = GUI::into_u8( - get_option_type_string(OptionType::Travel) + "|0|" + - get_option_type_string(OptionType::Wipe) + "|0|" + - get_option_type_string(OptionType::Retractions) + "|0|" + - get_option_type_string(OptionType::Unretractions) + "|0|" + - get_option_type_string(OptionType::Seams) + "|0|" + - get_option_type_string(OptionType::ToolChanges) + "|0|" + - get_option_type_string(OptionType::ColorChanges) + "|0|" + - get_option_type_string(OptionType::PausePrints) + "|0|" + - get_option_type_string(OptionType::CustomGCodes) + "|0|" + - get_option_type_string(OptionType::Shells) + "|0|" + - get_option_type_string(OptionType::ToolMarker) + "|1|" + - get_option_type_string(OptionType::Legend) + "|1" - ); - Slic3r::GUI::create_combochecklist(m_combochecklist_options, GUI::into_u8(_L("Options")), options_items); m_left_sizer = new wxBoxSizer(wxVERTICAL); m_left_sizer->Add(m_canvas_widget, 1, wxALL | wxEXPAND, 0); @@ -281,17 +220,6 @@ bool Preview::init(wxWindow* parent, Bed3D& bed, Model* model) m_moves_slider->SetDrawMode(DoubleSlider::dmSequentialGCodeView); wxBoxSizer* bottom_toolbar_sizer = new wxBoxSizer(wxHORIZONTAL); - bottom_toolbar_sizer->AddSpacer(5); - bottom_toolbar_sizer->Add(m_label_view_type, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 5); - bottom_toolbar_sizer->Add(m_choice_view_type, 0, wxALIGN_CENTER_VERTICAL, 0); - bottom_toolbar_sizer->AddSpacer(5); - bottom_toolbar_sizer->Add(m_label_show, 0, wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT, 5); - bottom_toolbar_sizer->Add(m_combochecklist_options, 0, wxALIGN_CENTER_VERTICAL, 0); - // change the following number if editing the layout of the bottom toolbar sizer. It is used into update_bottom_toolbar() - m_combochecklist_features_pos = 6; - bottom_toolbar_sizer->Add(m_combochecklist_features, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, 5); - bottom_toolbar_sizer->Hide(m_combochecklist_features); - bottom_toolbar_sizer->AddSpacer(5); bottom_toolbar_sizer->Add(m_moves_slider, 1, wxALL | wxEXPAND, 0); m_bottom_toolbar_panel->SetSizer(bottom_toolbar_sizer); @@ -353,7 +281,6 @@ void Preview::load_print(bool keep_z_range) else if (tech == ptSLA) load_print_as_sla(); - update_bottom_toolbar(); Layout(); } @@ -396,10 +323,6 @@ void Preview::refresh_print() void Preview::msw_rescale() { -#ifdef _WIN32 - m_choice_view_type->Rescale(); - m_choice_view_type->SetMinSize(m_choice_view_type->GetSize()); -#endif // rescale slider if (m_layers_slider != nullptr) m_layers_slider->msw_rescale(); if (m_moves_slider != nullptr) m_moves_slider->msw_rescale(); @@ -415,14 +338,8 @@ void Preview::sys_color_changed() { #ifdef _WIN32 wxWindowUpdateLocker noUpdates(this); - wxGetApp().UpdateAllStaticTextDarkUI(m_bottom_toolbar_panel); - wxGetApp().UpdateDarkUI(m_choice_view_type); - wxGetApp().UpdateDarkUI(m_combochecklist_features); - wxGetApp().UpdateDarkUI(static_cast(m_combochecklist_features->GetPopupControl())); - wxGetApp().UpdateDarkUI(m_combochecklist_options); - wxGetApp().UpdateDarkUI(static_cast(m_combochecklist_options->GetPopupControl())); -#endif +#endif // _WIN32 if (m_layers_slider != nullptr) m_layers_slider->sys_color_changed(); @@ -445,19 +362,13 @@ void Preview::edit_layers_slider(wxKeyEvent& evt) void Preview::bind_event_handlers() { - this->Bind(wxEVT_SIZE, &Preview::on_size, this); - m_choice_view_type->Bind(wxEVT_COMBOBOX, &Preview::on_choice_view_type, this); - m_combochecklist_features->Bind(wxEVT_CHECKLISTBOX, &Preview::on_combochecklist_features, this); - m_combochecklist_options->Bind(wxEVT_CHECKLISTBOX, &Preview::on_combochecklist_options, this); + Bind(wxEVT_SIZE, &Preview::on_size, this); m_moves_slider->Bind(wxEVT_SCROLL_CHANGED, &Preview::on_moves_slider_scroll_changed, this); } void Preview::unbind_event_handlers() { - this->Unbind(wxEVT_SIZE, &Preview::on_size, this); - m_choice_view_type->Unbind(wxEVT_COMBOBOX, &Preview::on_choice_view_type, this); - m_combochecklist_features->Unbind(wxEVT_CHECKLISTBOX, &Preview::on_combochecklist_features, this); - m_combochecklist_options->Unbind(wxEVT_CHECKLISTBOX, &Preview::on_combochecklist_options, this); + Unbind(wxEVT_SIZE, &Preview::on_size, this); m_moves_slider->Unbind(wxEVT_SCROLL_CHANGED, &Preview::on_moves_slider_scroll_changed, this); } @@ -478,73 +389,6 @@ void Preview::on_size(wxSizeEvent& evt) Refresh(); } -void Preview::on_choice_view_type(wxCommandEvent& evt) -{ - int selection = m_choice_view_type->GetCurrentSelection(); - if (0 <= selection && selection < static_cast(GCodeViewer::EViewType::Count)) { - m_canvas->set_toolpath_view_type(static_cast(selection)); - m_keep_current_preview_type = true; - } - refresh_print(); -} - -void Preview::on_combochecklist_features(wxCommandEvent& evt) -{ - unsigned int flags = Slic3r::GUI::combochecklist_get_flags(m_combochecklist_features); - m_canvas->set_toolpath_role_visibility_flags(flags); - refresh_print(); -} - -void Preview::on_combochecklist_options(wxCommandEvent& evt) -{ - const unsigned int curr_flags = m_canvas->get_gcode_options_visibility_flags(); - const unsigned int new_flags = Slic3r::GUI::combochecklist_get_flags(m_combochecklist_options); - if (curr_flags == new_flags) - return; - - m_canvas->set_gcode_options_visibility_from_flags(new_flags); - if (m_canvas->get_gcode_view_type() == GCodeViewer::EViewType::Feedrate) { - const unsigned int diff_flags = curr_flags ^ new_flags; - if ((diff_flags & (1 << static_cast(Preview::OptionType::Travel))) != 0) - refresh_print(); - else - m_canvas->refresh_gcode_preview_render_paths(); - } - else - m_canvas->refresh_gcode_preview_render_paths(); - - update_moves_slider(); -} - -void Preview::update_bottom_toolbar() -{ - combochecklist_set_flags(m_combochecklist_features, m_canvas->get_toolpath_role_visibility_flags()); - combochecklist_set_flags(m_combochecklist_options, m_canvas->get_gcode_options_visibility_flags()); - - // updates visibility of features combobox - if (m_bottom_toolbar_panel->IsShown()) { - wxSizer* sizer = m_bottom_toolbar_panel->GetSizer(); - bool show = !m_canvas->is_gcode_legend_enabled() || m_canvas->get_gcode_view_type() != GCodeViewer::EViewType::FeatureType; - - if (show) { - if (sizer->GetItem(m_combochecklist_features) == nullptr) { - sizer->Insert(m_combochecklist_features_pos, m_combochecklist_features, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, 5); - sizer->Show(m_combochecklist_features); - sizer->Layout(); - Refresh(); - } - } - else { - if (sizer->GetItem(m_combochecklist_features) != nullptr) { - sizer->Hide(m_combochecklist_features); - sizer->Detach(m_combochecklist_features); - sizer->Layout(); - Refresh(); - } - } - } -} - wxBoxSizer* Preview::create_layers_slider_sizer() { wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); @@ -684,8 +528,18 @@ void Preview::update_layers_slider(const std::vector& layers_z, bool kee m_layers_slider->SetLayersTimes(print_mode_stat.layers_times, print_mode_stat.time); } + // check if ticks_info_from_model contains ColorChange g-code + bool color_change_already_exists = false; + for (const CustomGCode::Item& gcode: ticks_info_from_model.gcodes) + if (gcode.type == CustomGCode::Type::ColorChange) { + color_change_already_exists = true; + break; + } + // Suggest the auto color change, if model looks like sign - if (m_layers_slider->IsNewPrint()) + if (!color_change_already_exists && + wxGetApp().app_config->get_bool("allow_auto_color_change") && + m_layers_slider->IsNewPrint()) { const Print& print = wxGetApp().plater()->fff_print(); @@ -721,7 +575,7 @@ void Preview::update_layers_slider(const std::vector& layers_z, bool kee if (i < min_solid_height) continue; - if (DoubleSlider::check_color_change(object, i, num_layers, true, [this, object](Layer*) { + if (DoubleSlider::check_color_change(object, i, num_layers, true, [this, object](const Layer*) { NotificationManager* notif_mngr = wxGetApp().plater()->get_notification_manager(); notif_mngr->push_notification( NotificationType::SignDetected, NotificationManager::NotificationLevel::PrintInfoNotificationLevel, @@ -782,6 +636,7 @@ void Preview::update_layers_slider_mode() for (const auto& range : object->layer_config_ranges) if (range.second.has("extruder") && + range.second.option("extruder")->getInt() != 0 && // extruder isn't default range.second.option("extruder")->getInt() != extruder) return false; } @@ -838,20 +693,34 @@ void Preview::update_moves_slider() if (view.endpoints.last < view.endpoints.first) return; - std::vector values(view.endpoints.last - view.endpoints.first + 1); - std::vector alternate_values(view.endpoints.last - view.endpoints.first + 1); - unsigned int count = 0; + assert(view.endpoints.first <= view.current.first && view.current.first <= view.endpoints.last); + assert(view.endpoints.first <= view.current.last && view.current.last <= view.endpoints.last); + + std::vector values; + values.reserve(view.endpoints.last - view.endpoints.first + 1); + std::vector alternate_values; + alternate_values.reserve(view.endpoints.last - view.endpoints.first + 1); + unsigned int last_gcode_id = view.gcode_ids[view.endpoints.first]; for (unsigned int i = view.endpoints.first; i <= view.endpoints.last; ++i) { - values[count] = static_cast(i + 1); - if (view.gcode_ids[i] > 0) - alternate_values[count] = static_cast(view.gcode_ids[i]); - ++count; + if (i > view.endpoints.first) { + // skip consecutive moves with same gcode id (resulting from processing G2 and G3 lines) + if (last_gcode_id == view.gcode_ids[i]) { + values.back() = static_cast(i + 1); + alternate_values.back() = static_cast(view.gcode_ids[i]); + continue; + } + else + last_gcode_id = view.gcode_ids[i]; + } + + values.emplace_back(static_cast(i + 1)); + alternate_values.emplace_back(static_cast(view.gcode_ids[i])); } m_moves_slider->SetSliderValues(values); m_moves_slider->SetSliderAlternateValues(alternate_values); - m_moves_slider->SetMaxValue(view.endpoints.last - view.endpoints.first); - m_moves_slider->SetSelectionSpan(view.current.first - view.endpoints.first, view.current.last - view.endpoints.first); + m_moves_slider->SetMaxValue(int(values.size()) - 1); + m_moves_slider->SetSelectionSpan(values.front() - 1 - view.endpoints.first, values.back() - 1 - view.endpoints.first); } void Preview::enable_moves_slider(bool enable) @@ -931,10 +800,11 @@ void Preview::load_print_as_fff(bool keep_z_range) if (gcode_preview_data_valid) { // Load the real G-code preview. m_canvas->load_gcode_preview(*m_gcode_result, colors); - m_left_sizer->Show(m_bottom_toolbar_panel); m_left_sizer->Layout(); Refresh(); zs = m_canvas->get_gcode_layers_zs(); + if (!zs.empty()) + m_left_sizer->Show(m_bottom_toolbar_panel); m_loaded = true; } else if (wxGetApp().is_editor()) { @@ -945,6 +815,11 @@ void Preview::load_print_as_fff(bool keep_z_range) Refresh(); zs = m_canvas->get_volumes_print_zs(true); } + else { + m_left_sizer->Hide(m_bottom_toolbar_panel); + m_left_sizer->Layout(); + Refresh(); + } if (!zs.empty() && !m_keep_current_preview_type) { unsigned int number_extruders = wxGetApp().is_editor() ? @@ -953,19 +828,16 @@ void Preview::load_print_as_fff(bool keep_z_range) std::vector gcodes = wxGetApp().is_editor() ? wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes : m_canvas->get_custom_gcode_per_print_z(); - const wxString choice = !gcodes.empty() ? - _L("Color Print") : - (number_extruders > 1) ? _L("Tool") : _L("Feature type"); - - int type = m_choice_view_type->FindString(choice); - if (m_choice_view_type->GetSelection() != type) { - if (0 <= type && type < static_cast(GCodeViewer::EViewType::Count)) { - m_choice_view_type->SetSelection(type); - m_canvas->set_gcode_view_preview_type(static_cast(type)); - if (wxGetApp().is_gcode_viewer()) - m_keep_current_preview_type = true; - refresh_print(); - } + const bool contains_color_gcodes = std::any_of(std::begin(gcodes), std::end(gcodes), + [] (auto const& item) { return item.type == CustomGCode::Type::ColorChange; }); + const GCodeViewer::EViewType choice = contains_color_gcodes ? + GCodeViewer::EViewType::ColorPrint : + (number_extruders > 1) ? GCodeViewer::EViewType::Tool : GCodeViewer::EViewType::FeatureType; + if (choice != gcode_view_type) { + m_canvas->set_gcode_view_preview_type(choice); + if (wxGetApp().is_gcode_viewer()) + m_keep_current_preview_type = true; + refresh_print(); } } @@ -1008,7 +880,6 @@ void Preview::load_print_as_sla() if (IsShown()) { m_canvas->load_sla_preview(); m_left_sizer->Hide(m_bottom_toolbar_panel); - m_left_sizer->Hide(m_bottom_toolbar_panel); m_left_sizer->Layout(); Refresh(); @@ -1042,25 +913,5 @@ void Preview::on_moves_slider_scroll_changed(wxCommandEvent& event) m_canvas->render(); } -wxString Preview::get_option_type_string(OptionType type) const -{ - switch (type) - { - case OptionType::Travel: { return _L("Travel"); } - case OptionType::Wipe: { return _L("Wipe"); } - case OptionType::Retractions: { return _L("Retractions"); } - case OptionType::Unretractions: { return _L("Deretractions"); } - case OptionType::Seams: { return _L("Seams"); } - case OptionType::ToolChanges: { return _L("Tool changes"); } - case OptionType::ColorChanges: { return _L("Color changes"); } - case OptionType::PausePrints: { return _L("Print pauses"); } - case OptionType::CustomGCodes: { return _L("Custom G-codes"); } - case OptionType::Shells: { return _L("Shells"); } - case OptionType::ToolMarker: { return _L("Tool marker"); } - case OptionType::Legend: { return _L("Legend/Estimated printing time"); } - default: { return ""; } - } -} - } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index 42246aa181c..25d9fe08463 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -80,16 +80,6 @@ class Preview : public wxPanel wxBoxSizer* m_left_sizer { nullptr }; wxBoxSizer* m_layers_slider_sizer { nullptr }; wxPanel* m_bottom_toolbar_panel { nullptr }; - wxStaticText* m_label_view_type { nullptr }; -#ifdef _WIN32 - BitmapComboBox* m_choice_view_type { nullptr }; -#else - wxComboBox* m_choice_view_type { nullptr }; -#endif - wxStaticText* m_label_show { nullptr }; - wxComboCtrl* m_combochecklist_features { nullptr }; - size_t m_combochecklist_features_pos { 0 }; - wxComboCtrl* m_combochecklist_options { nullptr }; DynamicPrintConfig* m_config; BackgroundSlicingProcess* m_process; @@ -124,9 +114,9 @@ class Preview : public wxPanel ColorChanges, PausePrints, CustomGCodes, + CenterOfGravity, Shells, ToolMarker, - Legend }; Preview(wxWindow* parent, Bed3D& bed, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process, @@ -154,12 +144,13 @@ class Preview : public wxPanel bool is_loaded() const { return m_loaded; } - void update_bottom_toolbar(); void update_moves_slider(); void enable_moves_slider(bool enable); void move_moves_slider(wxKeyEvent& evt); void hide_layers_slider(); + void set_keep_current_preview_type(bool value) { m_keep_current_preview_type = value; } + private: bool init(wxWindow* parent, Bed3D& bed, Model* model); @@ -167,9 +158,6 @@ class Preview : public wxPanel void unbind_event_handlers(); void on_size(wxSizeEvent& evt); - void on_choice_view_type(wxCommandEvent& evt); - void on_combochecklist_features(wxCommandEvent& evt); - void on_combochecklist_options(wxCommandEvent& evt); // Create/Update/Reset double slider on 3dPreview wxBoxSizer* create_layers_slider_sizer(); @@ -186,7 +174,6 @@ class Preview : public wxPanel void on_layers_slider_scroll_changed(wxCommandEvent& event); void on_moves_slider_scroll_changed(wxCommandEvent& event); - wxString get_option_type_string(OptionType type) const; }; } // namespace GUI diff --git a/src/slic3r/GUI/GUI_Utils.cpp b/src/slic3r/GUI/GUI_Utils.cpp index 73bfb3becd3..fad47035b5b 100644 --- a/src/slic3r/GUI/GUI_Utils.cpp +++ b/src/slic3r/GUI/GUI_Utils.cpp @@ -153,15 +153,6 @@ wxFont get_default_font_for_dpi(const wxWindow *window, int dpi) } bool check_dark_mode() { -#if 0 //#ifdef _WIN32 // #ysDarkMSW - Allow it when we deside to support the sustem colors for application - wxRegKey rk(wxRegKey::HKCU, - "Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"); - if (rk.Exists() && rk.HasValue("AppsUseLightTheme")) { - long value = -1; - rk.QueryValue("AppsUseLightTheme", &value); - return value <= 0; - } -#endif #if wxCHECK_VERSION(3,1,3) return wxSystemSettings::GetAppearance().IsDark(); #else @@ -174,7 +165,7 @@ bool check_dark_mode() { #ifdef _WIN32 void update_dark_ui(wxWindow* window) { - bool is_dark = wxGetApp().app_config->get("dark_color_mode") == "1";// ? true : check_dark_mode();// #ysDarkMSW - Allow it when we deside to support the sustem colors for application + bool is_dark = wxGetApp().app_config->get_bool("dark_color_mode");// ? true : check_dark_mode();// #ysDarkMSW - Allow it when we deside to support the sustem colors for application window->SetBackgroundColour(is_dark ? wxColour(43, 43, 43) : wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); window->SetForegroundColour(is_dark ? wxColour(250, 250, 250) : wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); } diff --git a/src/slic3r/GUI/GUI_Utils.hpp b/src/slic3r/GUI/GUI_Utils.hpp index a5ba218b520..624e7e1a343 100644 --- a/src/slic3r/GUI/GUI_Utils.hpp +++ b/src/slic3r/GUI/GUI_Utils.hpp @@ -82,7 +82,7 @@ template class DPIAware : public P { public: DPIAware(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &pos=wxDefaultPosition, - const wxSize &size=wxDefaultSize, long style=wxDEFAULT_FRAME_STYLE, const wxString &name=wxFrameNameStr) + const wxSize &size=wxDefaultSize, long style=wxDEFAULT_FRAME_STYLE, const wxString &name= wxFrameNameStr, const int font_point_size = -1) : P(parent, id, title, pos, size, style, name) { int dpi = get_dpi_for_window(this); @@ -90,6 +90,9 @@ template class DPIAware : public P m_prev_scale_factor = m_scale_factor; m_normal_font = get_default_font_for_dpi(this, dpi); + if (font_point_size > 0) + m_normal_font.SetPointSize(font_point_size); + /* Because of default window font is a primary display font, * We should set correct font for window before getting em_unit value. */ @@ -406,14 +409,6 @@ class WindowMetrics std::ostream& operator<<(std::ostream &os, const WindowMetrics& metrics); -inline int hex_digit_to_int(const char c) -{ - return - (c >= '0' && c <= '9') ? int(c - '0') : - (c >= 'A' && c <= 'F') ? int(c - 'A') + 10 : - (c >= 'a' && c <= 'f') ? int(c - 'a') + 10 : -1; -} - class TaskTimer { std::chrono::milliseconds start_timer; @@ -424,6 +419,16 @@ class TaskTimer ~TaskTimer(); }; +class KeyAutoRepeatFilter +{ + size_t m_count{ 0 }; + +public: + void increase_count() { ++m_count; } + void reset_count() { m_count = 0; } + bool is_first() const { return m_count == 0; } +}; + }} #endif diff --git a/src/slic3r/GUI/GalleryDialog.cpp b/src/slic3r/GUI/GalleryDialog.cpp index bc914722df7..a08673e235a 100644 --- a/src/slic3r/GUI/GalleryDialog.cpp +++ b/src/slic3r/GUI/GalleryDialog.cpp @@ -65,7 +65,7 @@ bool GalleryDropTarget::OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& f } -GalleryDialog::GalleryDialog(wxWindow* parent, bool modify_gallery/* = false*/) : +GalleryDialog::GalleryDialog(wxWindow* parent) : DPIDialog(parent, wxID_ANY, _L("Shape Gallery"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) { #ifndef _WIN32 @@ -94,12 +94,9 @@ GalleryDialog::GalleryDialog(wxWindow* parent, bool modify_gallery/* = false*/) #endif wxStdDialogButtonSizer* buttons = this->CreateStdDialogButtonSizer(wxOK | wxCLOSE); - wxButton* ok_btn = static_cast(FindWindowById(wxID_OK, this)); - ok_btn->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(!m_selected_items.empty()); }); - if (modify_gallery) { - ok_btn->SetLabel(_L("Add to bed")); - ok_btn->SetToolTip(_L("Add selected shape(s) to the bed")); - } + m_ok_btn = static_cast(FindWindowById(wxID_OK, this)); + m_ok_btn->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(!m_selected_items.empty()); }); + static_cast(FindWindowById(wxID_CLOSE, this))->Bind(wxEVT_BUTTON, [this](wxCommandEvent&){ this->EndModal(wxID_CLOSE); }); this->SetEscapeId(wxID_CLOSE); auto add_btn = [this, buttons]( size_t pos, int& ID, wxString title, wxString tooltip, @@ -140,6 +137,14 @@ GalleryDialog::~GalleryDialog() { } +int GalleryDialog::show(bool show_from_menu) +{ + m_ok_btn->SetLabel( show_from_menu ? _L("Add to bed") : _L("OK")); + m_ok_btn->SetToolTip(show_from_menu ? _L("Add selected shape(s) to the bed") : ""); + + return this->ShowModal(); +} + bool GalleryDialog::can_delete() { if (m_selected_items.empty()) @@ -157,8 +162,9 @@ bool GalleryDialog::can_change_thumbnail() void GalleryDialog::on_dpi_changed(const wxRect& suggested_rect) { - const int& em = em_unit(); + update(); + const int& em = em_unit(); msw_buttons_rescale(this, em, { ID_BTN_ADD_CUSTOM_SHAPE, ID_BTN_DEL_CUSTOM_SHAPE, ID_BTN_REPLACE_CUSTOM_PNG, wxID_OK, wxID_CLOSE }); wxSize size = wxSize(50 * em, 35 * em); @@ -169,13 +175,14 @@ void GalleryDialog::on_dpi_changed(const wxRect& suggested_rect) Refresh(); } -static void add_lock(wxImage& image) +static void add_lock(wxImage& image, wxWindow* parent_win) { - int lock_sz = 22; + wxBitmapBundle* bmp_bndl = get_bmp_bundle("lock", 22); #ifdef __APPLE__ - lock_sz /= mac_max_scaling_factor(); + wxBitmap bmp = bmp_bndl->GetBitmap(bmp_bndl->GetDefaultSize() * mac_max_scaling_factor()); +#else + wxBitmap bmp = bmp_bndl->GetBitmapFor(parent_win); #endif - wxBitmap bmp = create_scaled_bitmap("lock", nullptr, lock_sz); wxImage lock_image = bmp.ConvertToImage(); if (!lock_image.IsOk() || lock_image.GetWidth() == 0 || lock_image.GetHeight() == 0) @@ -213,21 +220,28 @@ static void add_lock(wxImage& image) } } -static void add_default_image(wxImageList* img_list, bool is_system) +static void add_default_image(wxImageList* img_list, bool is_system, wxWindow* parent_win) { - int sz = IMG_PX_CNT; + wxBitmapBundle* bmp_bndl = get_bmp_bundle("cog", IMG_PX_CNT); #ifdef __APPLE__ - sz /= mac_max_scaling_factor(); + wxBitmap bmp = bmp_bndl->GetBitmap(bmp_bndl->GetDefaultSize() * mac_max_scaling_factor()); +#else + wxBitmap bmp = bmp_bndl->GetBitmapFor(parent_win); #endif - wxBitmap bmp = create_scaled_bitmap("cog", nullptr, sz, true); + bmp = bmp.ConvertToDisabled(); if (is_system) { wxImage image = bmp.ConvertToImage(); if (image.IsOk() && image.GetWidth() != 0 && image.GetHeight() != 0) { - add_lock(image); + add_lock(image, parent_win); +#ifdef __APPLE__ + bmp = wxBitmap(std::move(image), -1, mac_max_scaling_factor()); +#else bmp = wxBitmap(std::move(image)); +#endif } } + img_list->Add(bmp); }; @@ -274,9 +288,8 @@ static void generate_thumbnail_from_model(const std::string& filename) GLVolumeCollection volumes; volumes.volumes.push_back(new GLVolume()); - GLVolume* volume = volumes.volumes[0]; - volume->indexed_vertex_array.load_mesh(model.mesh()); - volume->indexed_vertex_array.finalize_geometry(true); + GLVolume* volume = volumes.volumes.back(); + volume->model.init_from(model.mesh()); volume->set_instance_transformation(model.objects[0]->instances[0]->get_transformation()); volume->set_volume_transformation(model.objects[0]->volumes[0]->get_transformation()); @@ -340,8 +353,13 @@ void GalleryDialog::load_label_icon_list() // Make an image list containing large icons +#ifdef __APPLE__ + m_image_list = new wxImageList(IMG_PX_CNT, IMG_PX_CNT); + int px_cnt = IMG_PX_CNT * mac_max_scaling_factor(); +#else int px_cnt = (int)(em_unit() * IMG_PX_CNT * 0.1f + 0.5f); m_image_list = new wxImageList(px_cnt, px_cnt); +#endif for (const auto& item : list_items) { fs::path model_path = fs::path((item.is_system ? m_sys_dir_path : m_cust_dir_path) + item.name); @@ -358,7 +376,7 @@ void GalleryDialog::load_label_icon_list() if (can_generate_thumbnail) generate_thumbnail_from_model(model_name); else { - add_default_image(m_image_list, item.is_system); + add_default_image(m_image_list, item.is_system, this); continue; } } @@ -367,14 +385,18 @@ void GalleryDialog::load_label_icon_list() if (!image.CanRead(from_u8(img_name)) || !image.LoadFile(from_u8(img_name), wxBITMAP_TYPE_PNG) || image.GetWidth() == 0 || image.GetHeight() == 0) { - add_default_image(m_image_list, item.is_system); + add_default_image(m_image_list, item.is_system, this); continue; } image.Rescale(px_cnt, px_cnt, wxIMAGE_QUALITY_BILINEAR); if (item.is_system) - add_lock(image); + add_lock(image, this); +#ifdef __APPLE__ + wxBitmap bmp = wxBitmap(std::move(image), -1, mac_max_scaling_factor()); +#else wxBitmap bmp = wxBitmap(std::move(image)); +#endif m_image_list->Add(bmp); } diff --git a/src/slic3r/GUI/GalleryDialog.hpp b/src/slic3r/GUI/GalleryDialog.hpp index 2aa04ffa2ea..7d56d1af1b7 100644 --- a/src/slic3r/GUI/GalleryDialog.hpp +++ b/src/slic3r/GUI/GalleryDialog.hpp @@ -20,6 +20,7 @@ class GalleryDialog : public DPIDialog { wxListCtrl* m_list_ctrl { nullptr }; wxImageList* m_image_list { nullptr }; + wxButton* m_ok_btn { nullptr }; struct Item { std::string name; @@ -48,9 +49,10 @@ class GalleryDialog : public DPIDialog void update(); public: - GalleryDialog(wxWindow* parent, bool modify_gallery = false); + GalleryDialog(wxWindow* parent); ~GalleryDialog(); + int show(bool show_from_menu = false); void get_input_files(wxArrayString& input_files); bool load_files(const wxArrayString& input_files); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index 30f303dee75..eacc6be914e 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -1,268 +1,345 @@ -#include "GLGizmoBase.hpp" -#include "slic3r/GUI/GLCanvas3D.hpp" - -#include - -#include "slic3r/GUI/GUI_App.hpp" - -// TODO: Display tooltips quicker on Linux - -namespace Slic3r { -namespace GUI { - -const float GLGizmoBase::Grabber::SizeFactor = 0.05f; -const float GLGizmoBase::Grabber::MinHalfSize = 1.5f; -const float GLGizmoBase::Grabber::DraggingScaleFactor = 1.25f; - -GLGizmoBase::Grabber::Grabber() - : center(Vec3d::Zero()) - , angles(Vec3d::Zero()) - , dragging(false) - , enabled(true) -{ - color = { 1.0f, 1.0f, 1.0f, 1.0f }; -} - -void GLGizmoBase::Grabber::render(bool hover, float size) const -{ - std::array render_color; - if (hover) { - render_color[0] = (1.0f - color[0]); - render_color[1] = (1.0f - color[1]); - render_color[2] = (1.0f - color[2]); - render_color[3] = color[3]; - } - else - render_color = color; - - render(size, render_color, false); -} - -float GLGizmoBase::Grabber::get_half_size(float size) const -{ - return std::max(size * SizeFactor, MinHalfSize); -} - -float GLGizmoBase::Grabber::get_dragging_half_size(float size) const -{ - return get_half_size(size) * DraggingScaleFactor; -} - -void GLGizmoBase::Grabber::render(float size, const std::array& render_color, bool picking) const -{ - if (! cube_initialized) { - // This cannot be done in constructor, OpenGL is not yet - // initialized at that point (on Linux at least). - indexed_triangle_set mesh = its_make_cube(1., 1., 1.); - its_translate(mesh, Vec3f(-0.5, -0.5, -0.5)); - const_cast(cube).init_from(mesh, BoundingBoxf3{ { -0.5, -0.5, -0.5 }, { 0.5, 0.5, 0.5 } }); - const_cast(cube_initialized) = true; - } - - float fullsize = 2 * (dragging ? get_dragging_half_size(size) : get_half_size(size)); - - const_cast(&cube)->set_color(-1, render_color); - - glsafe(::glPushMatrix()); - glsafe(::glTranslated(center.x(), center.y(), center.z())); - glsafe(::glRotated(Geometry::rad2deg(angles.z()), 0.0, 0.0, 1.0)); - glsafe(::glRotated(Geometry::rad2deg(angles.y()), 0.0, 1.0, 0.0)); - glsafe(::glRotated(Geometry::rad2deg(angles.x()), 1.0, 0.0, 0.0)); - glsafe(::glScaled(fullsize, fullsize, fullsize)); - cube.render(); - glsafe(::glPopMatrix()); -} - - -GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) - : m_parent(parent) - , m_group_id(-1) - , m_state(Off) - , m_shortcut_key(0) - , m_icon_filename(icon_filename) - , m_sprite_id(sprite_id) - , m_hover_id(-1) - , m_dragging(false) - , m_imgui(wxGetApp().imgui()) - , m_first_input_window_render(true) - , m_dirty(false) -{ - m_base_color = DEFAULT_BASE_COLOR; - m_drag_color = DEFAULT_DRAG_COLOR; - m_highlight_color = DEFAULT_HIGHLIGHT_COLOR; - m_cone.init_from(its_make_cone(1., 1., 2 * PI / 24)); - m_sphere.init_from(its_make_sphere(1., (2 * M_PI) / 24.)); - m_cylinder.init_from(its_make_cylinder(1., 1., 2 * PI / 24.)); -} - -void GLGizmoBase::set_hover_id(int id) -{ - if (m_grabbers.empty() || (id < (int)m_grabbers.size())) - { - m_hover_id = id; - on_set_hover_id(); - } -} - -void GLGizmoBase::set_highlight_color(const std::array& color) -{ - m_highlight_color = color; -} - -void GLGizmoBase::enable_grabber(unsigned int id) -{ - if (id < m_grabbers.size()) - m_grabbers[id].enabled = true; - - on_enable_grabber(id); -} - -void GLGizmoBase::disable_grabber(unsigned int id) -{ - if (id < m_grabbers.size()) - m_grabbers[id].enabled = false; - - on_disable_grabber(id); -} - -void GLGizmoBase::start_dragging() -{ - m_dragging = true; - - for (int i = 0; i < (int)m_grabbers.size(); ++i) - { - m_grabbers[i].dragging = (m_hover_id == i); - } - - on_start_dragging(); -} - -void GLGizmoBase::stop_dragging() -{ - m_dragging = false; - - for (int i = 0; i < (int)m_grabbers.size(); ++i) - { - m_grabbers[i].dragging = false; - } - - on_stop_dragging(); -} - -void GLGizmoBase::update(const UpdateData& data) -{ - if (m_hover_id != -1) - on_update(data); -} - -bool GLGizmoBase::update_items_state() -{ - bool res = m_dirty; - m_dirty = false; - return res; -}; - -std::array GLGizmoBase::picking_color_component(unsigned int id) const -{ - static const float INV_255 = 1.0f / 255.0f; - - id = BASE_ID - id; - - if (m_group_id > -1) - id -= m_group_id; - - // color components are encoded to match the calculation of volume_id made into GLCanvas3D::_picking_pass() - return std::array { - float((id >> 0) & 0xff) * INV_255, // red - float((id >> 8) & 0xff) * INV_255, // green - float((id >> 16) & 0xff) * INV_255, // blue - float(picking_checksum_alpha_channel(id & 0xff, (id >> 8) & 0xff, (id >> 16) & 0xff))* INV_255 // checksum for validating against unwanted alpha blending and multi sampling - }; -} - -void GLGizmoBase::render_grabbers(const BoundingBoxf3& box) const -{ - render_grabbers((float)((box.size().x() + box.size().y() + box.size().z()) / 3.0)); -} - -void GLGizmoBase::render_grabbers(float size) const -{ - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); - if (shader == nullptr) - return; - shader->start_using(); - shader->set_uniform("emission_factor", 0.1f); - for (int i = 0; i < (int)m_grabbers.size(); ++i) { - if (m_grabbers[i].enabled) - m_grabbers[i].render(m_hover_id == i, size); - } - shader->stop_using(); -} - -void GLGizmoBase::render_grabbers_for_picking(const BoundingBoxf3& box) const -{ - float mean_size = (float)((box.size().x() + box.size().y() + box.size().z()) / 3.0); - - for (unsigned int i = 0; i < (unsigned int)m_grabbers.size(); ++i) { - if (m_grabbers[i].enabled) { - std::array color = picking_color_component(i); - m_grabbers[i].color = color; - m_grabbers[i].render_for_picking(mean_size); - } - } -} - -std::string GLGizmoBase::format(float value, unsigned int decimals) const -{ - return Slic3r::string_printf("%.*f", decimals, value); -} - -void GLGizmoBase::set_dirty() { - m_dirty = true; -} - -void GLGizmoBase::render_input_window(float x, float y, float bottom_limit) -{ - on_render_input_window(x, y, bottom_limit); - if (m_first_input_window_render) { - // imgui windows that don't have an initial size needs to be processed once to get one - // and are not rendered in the first frame - // so, we forces to render another frame the first time the imgui window is shown - // https://github.com/ocornut/imgui/issues/2949 - m_parent.set_as_dirty(); - m_parent.request_extra_frame(); - m_first_input_window_render = false; - } -} - - - -std::string GLGizmoBase::get_name(bool include_shortcut) const -{ - int key = get_shortcut_key(); - std::string out = on_get_name(); - if (include_shortcut && key >= WXK_CONTROL_A && key <= WXK_CONTROL_Z) - out += std::string(" [") + char(int('A') + key - int(WXK_CONTROL_A)) + "]"; - return out; -} - - - -// Produce an alpha channel checksum for the red green blue components. The alpha channel may then be used to verify, whether the rgb components -// were not interpolated by alpha blending or multi sampling. -unsigned char picking_checksum_alpha_channel(unsigned char red, unsigned char green, unsigned char blue) -{ - // 8 bit hash for the color - unsigned char b = ((((37 * red) + green) & 0x0ff) * 37 + blue) & 0x0ff; - // Increase enthropy by a bit reversal - b = (b & 0xF0) >> 4 | (b & 0x0F) << 4; - b = (b & 0xCC) >> 2 | (b & 0x33) << 2; - b = (b & 0xAA) >> 1 | (b & 0x55) << 1; - // Flip every second bit to increase the enthropy even more. - b ^= 0x55; - return b; -} - - -} // namespace GUI -} // namespace Slic3r +#include "GLGizmoBase.hpp" +#include "slic3r/GUI/GLCanvas3D.hpp" + +#include + +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/GUI_ObjectManipulation.hpp" +#include "slic3r/GUI/Plater.hpp" + +// TODO: Display tooltips quicker on Linux + +namespace Slic3r { +namespace GUI { + +const float GLGizmoBase::Grabber::SizeFactor = 0.05f; +const float GLGizmoBase::Grabber::MinHalfSize = 1.5f; +const float GLGizmoBase::Grabber::DraggingScaleFactor = 1.25f; + +PickingModel GLGizmoBase::Grabber::s_cube; +PickingModel GLGizmoBase::Grabber::s_cone; + +GLGizmoBase::Grabber::~Grabber() +{ + if (s_cube.model.is_initialized()) + s_cube.model.reset(); + + if (s_cone.model.is_initialized()) + s_cone.model.reset(); +} + +float GLGizmoBase::Grabber::get_half_size(float size) const +{ + return std::max(size * SizeFactor, MinHalfSize); +} + +float GLGizmoBase::Grabber::get_dragging_half_size(float size) const +{ + return get_half_size(size) * DraggingScaleFactor; +} + +void GLGizmoBase::Grabber::register_raycasters_for_picking(int id) +{ + picking_id = id; + // registration will happen on next call to render() +} + +void GLGizmoBase::Grabber::unregister_raycasters_for_picking() +{ + wxGetApp().plater()->canvas3D()->remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, picking_id); + picking_id = -1; + raycasters = { nullptr }; +} + +void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color) +{ + GLShaderProgram* shader = wxGetApp().get_current_shader(); + if (shader == nullptr) + return; + + if (!s_cube.model.is_initialized()) { + // This cannot be done in constructor, OpenGL is not yet + // initialized at that point (on Linux at least). + indexed_triangle_set its = its_make_cube(1.0, 1.0, 1.0); + its_translate(its, -0.5f * Vec3f::Ones()); + s_cube.model.init_from(its); + s_cube.mesh_raycaster = std::make_unique(std::make_shared(std::move(its))); + } + + if (!s_cone.model.is_initialized()) { + indexed_triangle_set its = its_make_cone(0.375, 1.5, double(PI) / 18.0); + s_cone.model.init_from(its); + s_cone.mesh_raycaster = std::make_unique(std::make_shared(std::move(its))); + } + + const float half_size = dragging ? get_dragging_half_size(size) : get_half_size(size); + + s_cube.model.set_color(render_color); + s_cone.model.set_color(render_color); + + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + const Transform3d& view_matrix = camera.get_view_matrix(); + const Matrix3d view_matrix_no_offset = view_matrix.matrix().block(0, 0, 3, 3); + std::vector elements_matrices(GRABBER_ELEMENTS_MAX_COUNT, Transform3d::Identity()); + elements_matrices[0] = matrix * Geometry::translation_transform(center) * Geometry::rotation_transform(angles) * Geometry::scale_transform(2.0 * half_size); + Transform3d view_model_matrix = view_matrix * elements_matrices[0]; + + shader->set_uniform("view_model_matrix", view_model_matrix); + Matrix3d view_normal_matrix = view_matrix_no_offset * elements_matrices[0].matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); + s_cube.model.render(); + + auto render_extension = [&view_matrix, &view_matrix_no_offset, shader](const Transform3d& matrix) { + const Transform3d view_model_matrix = view_matrix * matrix; + shader->set_uniform("view_model_matrix", view_model_matrix); + const Matrix3d view_normal_matrix = view_matrix_no_offset * matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); + s_cone.model.render(); + }; + + if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::PosX)) != 0) { + elements_matrices[1] = elements_matrices[0] * Geometry::translation_transform(Vec3d::UnitX()) * Geometry::rotation_transform({ 0.0, 0.5 * double(PI), 0.0 }); + render_extension(elements_matrices[1]); + } + if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::NegX)) != 0) { + elements_matrices[2] = elements_matrices[0] * Geometry::translation_transform(-Vec3d::UnitX()) * Geometry::rotation_transform({ 0.0, -0.5 * double(PI), 0.0 }); + render_extension(elements_matrices[2]); + } + if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::PosY)) != 0) { + elements_matrices[3] = elements_matrices[0] * Geometry::translation_transform(Vec3d::UnitY()) * Geometry::rotation_transform({ -0.5 * double(PI), 0.0, 0.0 }); + render_extension(elements_matrices[3]); + } + if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::NegY)) != 0) { + elements_matrices[4] = elements_matrices[0] * Geometry::translation_transform(-Vec3d::UnitY()) * Geometry::rotation_transform({ 0.5 * double(PI), 0.0, 0.0 }); + render_extension(elements_matrices[4]); + } + if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::PosZ)) != 0) { + elements_matrices[5] = elements_matrices[0] * Geometry::translation_transform(Vec3d::UnitZ()); + render_extension(elements_matrices[5]); + } + if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::NegZ)) != 0) { + elements_matrices[6] = elements_matrices[0] * Geometry::translation_transform(-Vec3d::UnitZ()) * Geometry::rotation_transform({ double(PI), 0.0, 0.0 }); + render_extension(elements_matrices[6]); + } + + if (raycasters[0] == nullptr) { + GLCanvas3D& canvas = *wxGetApp().plater()->canvas3D(); + raycasters[0] = canvas.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, picking_id, *s_cube.mesh_raycaster, elements_matrices[0]); + if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::PosX)) != 0) + raycasters[1] = canvas.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, picking_id, *s_cone.mesh_raycaster, elements_matrices[1]); + if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::NegX)) != 0) + raycasters[2] = canvas.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, picking_id, *s_cone.mesh_raycaster, elements_matrices[2]); + if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::PosY)) != 0) + raycasters[3] = canvas.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, picking_id, *s_cone.mesh_raycaster, elements_matrices[3]); + if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::NegY)) != 0) + raycasters[4] = canvas.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, picking_id, *s_cone.mesh_raycaster, elements_matrices[4]); + if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::PosZ)) != 0) + raycasters[5] = canvas.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, picking_id, *s_cone.mesh_raycaster, elements_matrices[5]); + if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::NegZ)) != 0) + raycasters[6] = canvas.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, picking_id, *s_cone.mesh_raycaster, elements_matrices[6]); + } + else { + for (size_t i = 0; i < GRABBER_ELEMENTS_MAX_COUNT; ++i) { + if (raycasters[i] != nullptr) + raycasters[i]->set_transform(elements_matrices[i]); + } + } +} + +GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) + : m_parent(parent) + , m_group_id(-1) + , m_state(Off) + , m_shortcut_key(NO_SHORTCUT_KEY_VALUE) + , m_icon_filename(icon_filename) + , m_sprite_id(sprite_id) + , m_imgui(wxGetApp().imgui()) +{ +} + + +std::string GLGizmoBase::get_action_snapshot_name() const +{ + return _u8L("Gizmo action"); +} + +void GLGizmoBase::set_hover_id(int id) +{ + // do not change hover id during dragging + assert(!m_dragging); + + // allow empty grabbers when not using grabbers but use hover_id - flatten, rotate +// if (!m_grabbers.empty() && id >= (int) m_grabbers.size()) +// return; + + m_hover_id = id; + on_set_hover_id(); +} + +bool GLGizmoBase::update_items_state() +{ + bool res = m_dirty; + m_dirty = false; + return res; +} + +void GLGizmoBase::register_grabbers_for_picking() +{ + for (size_t i = 0; i < m_grabbers.size(); ++i) { + m_grabbers[i].register_raycasters_for_picking((m_group_id >= 0) ? m_group_id : i); + } +} + +void GLGizmoBase::unregister_grabbers_for_picking() +{ + for (size_t i = 0; i < m_grabbers.size(); ++i) { + m_grabbers[i].unregister_raycasters_for_picking(); + } +} + +void GLGizmoBase::render_grabbers(const BoundingBoxf3& box) const +{ + render_grabbers((float)((box.size().x() + box.size().y() + box.size().z()) / 3.0)); +} + +void GLGizmoBase::render_grabbers(float size) const +{ + render_grabbers(0, m_grabbers.size() - 1, size, false); +} + +void GLGizmoBase::render_grabbers(size_t first, size_t last, float size, bool force_hover) const +{ + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); + if (shader == nullptr) + return; + shader->start_using(); + shader->set_uniform("emission_factor", 0.1f); + glsafe(::glDisable(GL_CULL_FACE)); + for (size_t i = first; i <= last; ++i) { + if (m_grabbers[i].enabled) + m_grabbers[i].render(force_hover ? true : m_hover_id == (int)i, size); + } + glsafe(::glEnable(GL_CULL_FACE)); + shader->stop_using(); +} + +// help function to process grabbers +// call start_dragging, stop_dragging, on_dragging +bool GLGizmoBase::use_grabbers(const wxMouseEvent &mouse_event) { + bool is_dragging_finished = false; + if (mouse_event.Moving()) { + // it should not happen but for sure + assert(!m_dragging); + if (m_dragging) is_dragging_finished = true; + else return false; + } + + if (mouse_event.LeftDown()) { + Selection &selection = m_parent.get_selection(); + if (!selection.is_empty() && m_hover_id != -1 /* && + (m_grabbers.empty() || m_hover_id < static_cast(m_grabbers.size()))*/) { + selection.setup_cache(); + + m_dragging = true; + for (auto &grabber : m_grabbers) grabber.dragging = false; +// if (!m_grabbers.empty() && m_hover_id < int(m_grabbers.size())) +// m_grabbers[m_hover_id].dragging = true; + + on_start_dragging(); + + // Let the plater know that the dragging started + m_parent.post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_STARTED)); + m_parent.set_as_dirty(); + return true; + } + } else if (m_dragging) { + // when mouse cursor leave window than finish actual dragging operation + bool is_leaving = mouse_event.Leaving(); + if (mouse_event.Dragging()) { + Point mouse_coord(mouse_event.GetX(), mouse_event.GetY()); + auto ray = m_parent.mouse_ray(mouse_coord); + UpdateData data(ray, mouse_coord); + + on_dragging(data); + + wxGetApp().obj_manipul()->set_dirty(); + m_parent.set_as_dirty(); + return true; + } + else if (mouse_event.LeftUp() || is_leaving || is_dragging_finished) { + do_stop_dragging(is_leaving); + return true; + } + } + return false; +} + +void GLGizmoBase::do_stop_dragging(bool perform_mouse_cleanup) +{ + for (auto& grabber : m_grabbers) grabber.dragging = false; + m_dragging = false; + + // NOTE: This should be part of GLCanvas3D + // Reset hover_id when leave window + if (perform_mouse_cleanup) m_parent.mouse_up_cleanup(); + + on_stop_dragging(); + + // There is prediction that after draggign, data are changed + // Data are updated twice also by canvas3D::reload_scene. + // Should be fixed. + m_parent.get_gizmos_manager().update_data(); + + wxGetApp().obj_manipul()->set_dirty(); + + // Let the plater know that the dragging finished, so a delayed + // refresh of the scene with the background processing data should + // be performed. + m_parent.post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); + // updates camera target constraints + m_parent.refresh_camera_scene_box(); +} + +std::string GLGizmoBase::format(float value, unsigned int decimals) const +{ + return Slic3r::string_printf("%.*f", decimals, value); +} + +void GLGizmoBase::set_dirty() { + m_dirty = true; +} + + + +void GLGizmoBase::render_input_window(float x, float y, float bottom_limit) +{ + on_render_input_window(x, y, bottom_limit); + if (m_first_input_window_render) { + // imgui windows that don't have an initial size needs to be processed once to get one + // and are not rendered in the first frame + // so, we forces to render another frame the first time the imgui window is shown + // https://github.com/ocornut/imgui/issues/2949 + m_parent.set_as_dirty(); + m_parent.request_extra_frame(); + m_first_input_window_render = false; + } +} + + + +std::string GLGizmoBase::get_name(bool include_shortcut) const +{ + std::string out = on_get_name(); + if (!include_shortcut) return out; + + int key = get_shortcut_key(); + assert(key==NO_SHORTCUT_KEY_VALUE || (key >= WXK_CONTROL_A && key <= WXK_CONTROL_Z)); + out += std::string(" [") + char(int('A') + key - int(WXK_CONTROL_A)) + "]"; + return out; +} + + +} // namespace GUI +} // namespace Slic3r + diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index 66ca4fca27f..82bcba91ff3 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -2,13 +2,16 @@ #define slic3r_GLGizmoBase_hpp_ #include "libslic3r/Point.hpp" +#include "libslic3r/Color.hpp" -#include "slic3r/GUI/I18N.hpp" #include "slic3r/GUI/GLModel.hpp" +#include "slic3r/GUI/MeshUtils.hpp" +#include "slic3r/GUI/SceneRaycaster.hpp" #include class wxWindow; +class wxMouseEvent; namespace Slic3r { @@ -18,21 +21,16 @@ class ModelObject; namespace GUI { -static const std::array DEFAULT_BASE_COLOR = { 0.625f, 0.625f, 0.625f, 1.0f }; -static const std::array DEFAULT_DRAG_COLOR = { 1.0f, 1.0f, 1.0f, 1.0f }; -static const std::array DEFAULT_HIGHLIGHT_COLOR = { 1.0f, 0.38f, 0.0f, 1.0f }; -static const std::array, 3> AXES_COLOR = {{ - { 0.75f, 0.0f, 0.0f, 1.0f }, - { 0.0f, 0.75f, 0.0f, 1.0f }, - { 0.0f, 0.0f, 0.75f, 1.0f } - }}; -static const std::array CONSTRAINED_COLOR = { 0.5f, 0.5f, 0.5f, 1.0f }; +static const ColorRGBA DEFAULT_BASE_COLOR = { 0.625f, 0.625f, 0.625f, 1.0f }; +static const ColorRGBA DEFAULT_DRAG_COLOR = ColorRGBA::WHITE(); +static const ColorRGBA DEFAULT_HIGHLIGHT_COLOR = ColorRGBA::ORANGE(); +static const std::array AXES_COLOR = {{ ColorRGBA::X(), ColorRGBA::Y(), ColorRGBA::Z() }}; +static const ColorRGBA CONSTRAINED_COLOR = ColorRGBA::GRAY(); class ImGuiWrapper; class GLCanvas3D; enum class CommonGizmosDataID; class CommonGizmosDataPool; -class Selection; class GLGizmoBase { @@ -40,6 +38,21 @@ class GLGizmoBase // Starting value for ids to avoid clashing with ids used by GLVolumes // (254 is choosen to leave some space for forward compatibility) static const unsigned int BASE_ID = 255 * 255 * 254; + static const unsigned int GRABBER_ELEMENTS_MAX_COUNT = 7; + + enum class EGrabberExtension + { + None = 0, + PosX = 1 << 0, + NegX = 1 << 1, + PosY = 1 << 2, + NegY = 1 << 3, + PosZ = 1 << 4, + NegZ = 1 << 5, + }; + + // Represents NO key(button on keyboard) value + static const int NO_SHORTCUT_KEY_VALUE = 0; protected: struct Grabber @@ -48,25 +61,33 @@ class GLGizmoBase static const float MinHalfSize; static const float DraggingScaleFactor; - Vec3d center; - Vec3d angles; - std::array color; - bool enabled; - bool dragging; + bool enabled{ true }; + bool dragging{ false }; + Vec3d center{ Vec3d::Zero() }; + Vec3d angles{ Vec3d::Zero() }; + Transform3d matrix{ Transform3d::Identity() }; + ColorRGBA color{ ColorRGBA::WHITE() }; + EGrabberExtension extensions{ EGrabberExtension::None }; + // the picking id shared by all the elements + int picking_id{ -1 }; + std::array, GRABBER_ELEMENTS_MAX_COUNT> raycasters = { nullptr }; - Grabber(); + Grabber() = default; + ~Grabber(); - void render(bool hover, float size) const; - void render_for_picking(float size) const { render(size, color, true); } + void render(bool hover, float size) { render(size, hover ? complementary(color) : color); } float get_half_size(float size) const; float get_dragging_half_size(float size) const; + void register_raycasters_for_picking(int id); + void unregister_raycasters_for_picking(); + private: - void render(float size, const std::array& render_color, bool picking) const; + void render(float size, const ColorRGBA& render_color); - GLModel cube; - bool cube_initialized = false; + static PickingModel s_cube; + static PickingModel s_cone; }; public: @@ -90,30 +111,23 @@ class GLGizmoBase protected: GLCanvas3D& m_parent; - int m_group_id; + int m_group_id; // TODO: remove only for rotate EState m_state; int m_shortcut_key; std::string m_icon_filename; unsigned int m_sprite_id; - int m_hover_id; - bool m_dragging; - std::array m_base_color; - std::array m_drag_color; - std::array m_highlight_color; + int m_hover_id{ -1 }; + bool m_dragging{ false }; mutable std::vector m_grabbers; ImGuiWrapper* m_imgui; - bool m_first_input_window_render; - mutable std::string m_tooltip; - CommonGizmosDataPool* m_c; - GLModel m_cone; - GLModel m_cylinder; - GLModel m_sphere; + bool m_first_input_window_render{ true }; + CommonGizmosDataPool* m_c{ nullptr }; public: GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); - virtual ~GLGizmoBase() {} + virtual ~GLGizmoBase() = default; bool init() { return on_init(); } @@ -122,9 +136,6 @@ class GLGizmoBase std::string get_name(bool include_shortcut = true) const; - int get_group_id() const { return m_group_id; } - void set_group_id(int id) { m_group_id = id; } - EState get_state() const { return m_state; } void set_state(EState state) { m_state = state; on_set_state(); } @@ -138,7 +149,7 @@ class GLGizmoBase virtual bool wants_enter_leave_snapshots() const { return false; } virtual std::string get_gizmo_entering_text() const { assert(false); return ""; } virtual std::string get_gizmo_leaving_text() const { assert(false); return ""; } - virtual std::string get_action_snapshot_name() { return _u8L("Gizmo action"); } + virtual std::string get_action_snapshot_name() const; void set_common_data_pool(CommonGizmosDataPool* ptr) { m_c = ptr; } unsigned int get_sprite_id() const { return m_sprite_id; } @@ -146,27 +157,39 @@ class GLGizmoBase int get_hover_id() const { return m_hover_id; } void set_hover_id(int id); - void set_highlight_color(const std::array& color); - - void enable_grabber(unsigned int id); - void disable_grabber(unsigned int id); - - void start_dragging(); - void stop_dragging(); - bool is_dragging() const { return m_dragging; } - void update(const UpdateData& data); - // returns True when Gizmo changed its state bool update_items_state(); - void render() { m_tooltip.clear(); on_render(); } - void render_for_picking() { on_render_for_picking(); } + void render() { on_render(); } void render_input_window(float x, float y, float bottom_limit); + /// + /// Mouse tooltip text + /// + /// Text to be visible in mouse tooltip virtual std::string get_tooltip() const { return ""; } + /// + /// Is called when data (Selection) is changed + /// + virtual void data_changed(){}; + + /// + /// Implement when want to process mouse events in gizmo + /// Click, Right click, move, drag, ... + /// + /// Keep information about mouse click + /// Return True when use the information and don't want to propagate it otherwise False. + virtual bool on_mouse(const wxMouseEvent &mouse_event) { return false; } + + void register_raycasters_for_picking() { register_grabbers_for_picking(); on_register_raycasters_for_picking(); } + void unregister_raycasters_for_picking() { unregister_grabbers_for_picking(); on_unregister_raycasters_for_picking(); } + + virtual bool is_in_editing_mode() const { return false; } + virtual bool is_selection_rectangle_dragging() const { return false; } + protected: virtual bool on_init() = 0; virtual void on_load(cereal::BinaryInputArchive& ar) {} @@ -179,34 +202,46 @@ class GLGizmoBase virtual CommonGizmosDataID on_get_requirements() const { return CommonGizmosDataID(0); } virtual void on_enable_grabber(unsigned int id) {} virtual void on_disable_grabber(unsigned int id) {} + + // called inside use_grabbers virtual void on_start_dragging() {} virtual void on_stop_dragging() {} - virtual void on_update(const UpdateData& data) {} + virtual void on_dragging(const UpdateData& data) {} + virtual void on_render() = 0; - virtual void on_render_for_picking() = 0; virtual void on_render_input_window(float x, float y, float bottom_limit) {} - // Returns the picking color for the given id, based on the BASE_ID constant - // No check is made for clashing with other picking color (i.e. GLVolumes) - std::array picking_color_component(unsigned int id) const; + void register_grabbers_for_picking(); + void unregister_grabbers_for_picking(); + virtual void on_register_raycasters_for_picking() {} + virtual void on_unregister_raycasters_for_picking() {} + void render_grabbers(const BoundingBoxf3& box) const; void render_grabbers(float size) const; - void render_grabbers_for_picking(const BoundingBoxf3& box) const; + void render_grabbers(size_t first, size_t last, float size, bool force_hover) const; std::string format(float value, unsigned int decimals) const; // Mark gizmo as dirty to Re-Render when idle() void set_dirty(); + + /// + /// function which + /// Set up m_dragging and call functions + /// on_start_dragging / on_dragging / on_stop_dragging + /// + /// Keep information about mouse click + /// same as on_mouse + bool use_grabbers(const wxMouseEvent &mouse_event); + + void do_stop_dragging(bool perform_mouse_cleanup); + private: // Flag for dirty visible state of Gizmo // When True then need new rendering - bool m_dirty; + bool m_dirty{ false }; }; -// Produce an alpha channel checksum for the red green blue components. The alpha channel may then be used to verify, whether the rgb components -// were not interpolated by alpha blending or multi sampling. -extern unsigned char picking_checksum_alpha_channel(unsigned char red, unsigned char green, unsigned char blue); - } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp index f77c007fe6f..5d8a69e417e 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp @@ -1,327 +1,2522 @@ -// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro. #include "GLGizmoCut.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include -#include -#include -#include -#include - #include #include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/GUI_ObjectManipulation.hpp" +#include "slic3r/GUI/format.hpp" +#include "slic3r/Utils/UndoRedo.hpp" #include "libslic3r/AppConfig.hpp" -#include "libslic3r/Model.hpp" #include "libslic3r/TriangleMeshSlicer.hpp" +#include "imgui/imgui_internal.h" +#include "slic3r/GUI/MsgDialog.hpp" + namespace Slic3r { namespace GUI { -const double GLGizmoCut::Offset = 10.0; -const double GLGizmoCut::Margin = 20.0; -const std::array GLGizmoCut::GrabberColor = { 1.0, 0.5, 0.0, 1.0 }; +static const ColorRGBA GRABBER_COLOR = ColorRGBA::YELLOW(); +static const ColorRGBA UPPER_PART_COLOR = ColorRGBA::CYAN(); +static const ColorRGBA LOWER_PART_COLOR = ColorRGBA::MAGENTA(); -GLGizmoCut::GLGizmoCut(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) - : GLGizmoBase(parent, icon_filename, sprite_id) -{} +// connector colors +static const ColorRGBA PLAG_COLOR = ColorRGBA::YELLOW(); +static const ColorRGBA DOWEL_COLOR = ColorRGBA::DARK_YELLOW(); +static const ColorRGBA HOVERED_PLAG_COLOR = ColorRGBA::CYAN(); +static const ColorRGBA HOVERED_DOWEL_COLOR = ColorRGBA(0.0f, 0.5f, 0.5f, 1.0f); +static const ColorRGBA SELECTED_PLAG_COLOR = ColorRGBA::GRAY(); +static const ColorRGBA SELECTED_DOWEL_COLOR = ColorRGBA::DARK_GRAY(); +static const ColorRGBA CONNECTOR_DEF_COLOR = ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f); +static const ColorRGBA CONNECTOR_ERR_COLOR = ColorRGBA(1.0f, 0.3f, 0.3f, 0.5f); +static const ColorRGBA HOVERED_ERR_COLOR = ColorRGBA(1.0f, 0.3f, 0.3f, 1.0f); + +const unsigned int AngleResolution = 64; +const unsigned int ScaleStepsCount = 72; +const float ScaleStepRad = 2.0f * float(PI) / ScaleStepsCount; +const unsigned int ScaleLongEvery = 2; +const float ScaleLongTooth = 0.1f; // in percent of radius +const unsigned int SnapRegionsCount = 8; -std::string GLGizmoCut::get_tooltip() const +const float UndefFloat = -999.f; +const std::string UndefLabel = " "; + +using namespace Geometry; + +// Generates mesh for a line +static GLModel::Geometry its_make_line(Vec3f beg_pos, Vec3f end_pos) { - double cut_z = m_cut_z; - if (wxGetApp().app_config->get("use_inches") == "1") - cut_z *= ObjectManipulation::mm_to_in; + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; + init_data.reserve_vertices(2); + init_data.reserve_indices(2); - return (m_hover_id == 0 || m_grabbers[0].dragging) ? "Z: " + format(cut_z, 2) : ""; + // vertices + init_data.add_vertex(beg_pos); + init_data.add_vertex(end_pos); + + // indices + init_data.add_line(0, 1); + return init_data; } -bool GLGizmoCut::on_init() +//! -- #ysFIXME those functions bodies are ported from GizmoRotation +// Generates mesh for a circle +static void init_from_circle(GLModel& model, double radius) { - m_grabbers.emplace_back(); - m_shortcut_key = WXK_CONTROL_C; - return true; + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::LineLoop, GLModel::Geometry::EVertexLayout::P3 }; + init_data.reserve_vertices(ScaleStepsCount); + init_data.reserve_indices(ScaleStepsCount); + + // vertices + indices + for (unsigned int i = 0; i < ScaleStepsCount; ++i) { + const float angle = float(i * ScaleStepRad); + init_data.add_vertex(Vec3f(::cos(angle) * float(radius), ::sin(angle) * float(radius), 0.0f)); + init_data.add_index(i); + } + + model.init_from(std::move(init_data)); + model.set_color(ColorRGBA::WHITE()); } -std::string GLGizmoCut::on_get_name() const +// Generates mesh for a scale +static void init_from_scale(GLModel& model, double radius) { - return _u8L("Cut"); + const float out_radius_long = float(radius) * (1.0f + ScaleLongTooth); + const float out_radius_short = float(radius) * (1.0f + 0.5f * ScaleLongTooth); + + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; + init_data.reserve_vertices(2 * ScaleStepsCount); + init_data.reserve_indices(2 * ScaleStepsCount); + + // vertices + indices + for (unsigned int i = 0; i < ScaleStepsCount; ++i) { + const float angle = float(i * ScaleStepRad); + const float cosa = ::cos(angle); + const float sina = ::sin(angle); + const float in_x = cosa * float(radius); + const float in_y = sina * float(radius); + const float out_x = (i % ScaleLongEvery == 0) ? cosa * out_radius_long : cosa * out_radius_short; + const float out_y = (i % ScaleLongEvery == 0) ? sina * out_radius_long : sina * out_radius_short; + + // vertices + init_data.add_vertex(Vec3f(in_x, in_y, 0.0f)); + init_data.add_vertex(Vec3f(out_x, out_y, 0.0f)); + + // indices + init_data.add_line(i * 2, i * 2 + 1); + } + + model.init_from(std::move(init_data)); + model.set_color(ColorRGBA::WHITE()); } -void GLGizmoCut::on_set_state() +// Generates mesh for a snap_radii +static void init_from_snap_radii(GLModel& model, double radius) { - // Reset m_cut_z on gizmo activation - if (get_state() == On) - m_cut_z = bounding_box().center().z(); + const float step = 2.0f * float(PI) / float(SnapRegionsCount); + const float in_radius = float(radius) / 3.0f; + const float out_radius = 2.0f * in_radius; + + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; + init_data.reserve_vertices(2 * ScaleStepsCount); + init_data.reserve_indices(2 * ScaleStepsCount); + + // vertices + indices + for (unsigned int i = 0; i < ScaleStepsCount; ++i) { + const float angle = float(i) * step; + const float cosa = ::cos(angle); + const float sina = ::sin(angle); + const float in_x = cosa * in_radius; + const float in_y = sina * in_radius; + const float out_x = cosa * out_radius; + const float out_y = sina * out_radius; + + // vertices + init_data.add_vertex(Vec3f(in_x, in_y, 0.0f)); + init_data.add_vertex(Vec3f(out_x, out_y, 0.0f)); + + // indices + init_data.add_line(i * 2, i * 2 + 1); + } + + model.init_from(std::move(init_data)); + model.set_color(ColorRGBA::WHITE()); } -bool GLGizmoCut::on_is_activable() const +// Generates mesh for a angle_arc +static void init_from_angle_arc(GLModel& model, double angle, double radius) { - const Selection& selection = m_parent.get_selection(); - return selection.is_single_full_instance() && !selection.is_wipe_tower(); + model.reset(); + + const float step_angle = float(angle) / float(AngleResolution); + const float ex_radius = float(radius); + + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::LineStrip, GLModel::Geometry::EVertexLayout::P3 }; + init_data.reserve_vertices(1 + AngleResolution); + init_data.reserve_indices(1 + AngleResolution); + + // vertices + indices + for (unsigned int i = 0; i <= AngleResolution; ++i) { + const float angle = float(i) * step_angle; + init_data.add_vertex(Vec3f(::cos(angle) * ex_radius, ::sin(angle) * ex_radius, 0.0f)); + init_data.add_index(i); + } + + model.init_from(std::move(init_data)); } -void GLGizmoCut::on_start_dragging() +//! -- + +GLGizmoCut3D::GLGizmoCut3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) + : GLGizmoBase(parent, icon_filename, sprite_id) + , m_connectors_group_id (GrabberID::Count) + , m_connector_type (CutConnectorType::Plug) + , m_connector_style (size_t(CutConnectorStyle::Prism)) + , m_connector_shape_id (size_t(CutConnectorShape::Circle)) { - if (m_hover_id == -1) - return; +// m_modes = { _u8L("Planar"), _u8L("Grid") +// , _u8L("Radial"), _u8L("Modular") +// }; - const BoundingBoxf3 box = bounding_box(); - m_max_z = box.max.z(); - m_start_z = m_cut_z; - m_drag_pos = m_grabbers[m_hover_id].center; - m_drag_center = box.center(); - m_drag_center.z() = m_cut_z; + m_connector_modes = { _u8L("Auto"), _u8L("Manual") }; + + std::map connetor_types = { + {ImGui::PlugMarker , _u8L("Plug") }, + {ImGui::DowelMarker, _u8L("Dowel") }, + }; + for (auto connector : connetor_types) { + std::string type_label = " " + connector.second + " "; + type_label += connector.first; + m_connector_types.push_back(type_label); + } + + m_connector_styles = { _u8L("Prism"), _u8L("Frustum") +// , _u8L("Claw") + }; + + m_connector_shapes = { _u8L("Triangle"), _u8L("Square"), _u8L("Hexagon"), _u8L("Circle") +// , _u8L("D-shape") + }; + + m_axis_names = { "X", "Y", "Z" }; + + m_part_orientation_names = { + {"none", _L("Keep orientation")}, + {"on_cut", _L("Place on cut")}, + {"flip", _L("Flip upside down")}, + }; + + m_labels_map = { + {"Connectors" , _u8L("Connectors")}, + {"Type" , _u8L("Type")}, + {"Style" , _u8L("Style")}, + {"Shape" , _u8L("Shape")}, + {"Depth ratio" , _u8L("Depth ratio")}, + {"Size" , _u8L("Size")}, + }; + + update_connector_shape(); } -void GLGizmoCut::on_update(const UpdateData& data) +std::string GLGizmoCut3D::get_tooltip() const { - if (m_hover_id != -1) - set_cut_z(m_start_z + calc_projection(data.mouse_ray)); + std::string tooltip; + if (m_hover_id == Z || (m_dragging && m_hover_id == CutPlane)) { + double koef = m_imperial_units ? ObjectManipulation::mm_to_in : 1.0; + std::string unit_str = " " + (m_imperial_units ? _u8L("in") : _u8L("mm")); + const BoundingBoxf3& tbb = m_transformed_bounding_box; + + const std::string name = m_keep_as_parts ? _u8L("Part") : _u8L("Object"); + if (tbb.max.z() >= 0.0) { + double top = (tbb.min.z() <= 0.0 ? tbb.max.z() : tbb.size().z()) * koef; + tooltip += format(static_cast(top), 2) + " " + unit_str + " (" + name + " A)"; + if (tbb.min.z() <= 0.0) + tooltip += "\n"; + } + if (tbb.min.z() <= 0.0) { + double bottom = (tbb.max.z() <= 0.0 ? tbb.size().z() : (tbb.min.z() * (-1))) * koef; + tooltip += format(static_cast(bottom), 2) + " " + unit_str + " (" + name + " B)"; + } + return tooltip; + } + + if (!m_dragging && m_hover_id == CutPlane) + return _u8L("Click to flip the cut plane\n" + "Drag to move the cut plane"); + + if (tooltip.empty() && (m_hover_id == X || m_hover_id == Y)) { + std::string axis = m_hover_id == X ? "X" : "Y"; + return axis + ": " + format(float(rad2deg(m_angle)), 1) + _u8L("°"); + } + + return tooltip; } -void GLGizmoCut::on_render() +bool GLGizmoCut3D::on_mouse(const wxMouseEvent &mouse_event) { - const BoundingBoxf3 box = bounding_box(); - Vec3d plane_center = box.center(); - plane_center.z() = m_cut_z; - m_max_z = box.max.z(); - set_cut_z(m_cut_z); + Vec2i mouse_coord(mouse_event.GetX(), mouse_event.GetY()); + Vec2d mouse_pos = mouse_coord.cast(); - update_contours(); + if (mouse_event.ShiftDown() && mouse_event.LeftDown()) + return gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), mouse_event.CmdDown()); + if (mouse_event.CmdDown() && mouse_event.LeftDown()) + return false; + if (cut_line_processing()) { + if (mouse_event.ShiftDown()) { + if (mouse_event.Moving()|| mouse_event.Dragging()) + return gizmo_event(SLAGizmoEventType::Moving, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), mouse_event.CmdDown()); + if (mouse_event.LeftUp()) + return gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), mouse_event.CmdDown()); + } + discard_cut_line_processing(); + } + else if (mouse_event.Moving()) + return false; - const float min_x = box.min.x() - Margin; - const float max_x = box.max.x() + Margin; - const float min_y = box.min.y() - Margin; - const float max_y = box.max.y() + Margin; - glsafe(::glEnable(GL_DEPTH_TEST)); - glsafe(::glDisable(GL_CULL_FACE)); - glsafe(::glEnable(GL_BLEND)); - glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); + if (use_grabbers(mouse_event)) { + if (m_hover_id >= m_connectors_group_id) { + if (mouse_event.LeftDown() && !mouse_event.CmdDown() && !mouse_event.AltDown()) + unselect_all_connectors(); + if (mouse_event.LeftUp() && !mouse_event.ShiftDown()) + gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), mouse_event.CmdDown()); + } + else if (m_hover_id == CutPlane) { + if (mouse_event.LeftDown()) + m_was_cut_plane_dragged = false; + else if (mouse_event.LeftUp() && !m_was_cut_plane_dragged) + flip_cut_plane(); + } + return true; + } + + static bool pending_right_up = false; + if (mouse_event.LeftDown()) { + bool grabber_contains_mouse = (get_hover_id() != -1); + const bool shift_down = mouse_event.ShiftDown(); + if ((!shift_down || grabber_contains_mouse) && + gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false)) + return true; + } + else if (mouse_event.Dragging()) { + bool control_down = mouse_event.CmdDown(); + if (m_parent.get_move_volume_id() != -1) { + // don't allow dragging objects with the Sla gizmo on + return true; + } + if (!control_down && + gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false)) { + // the gizmo got the event and took some action, no need to do + // anything more here + m_parent.set_as_dirty(); + return true; + } + if (control_down && (mouse_event.LeftIsDown() || mouse_event.RightIsDown())) { + // CTRL has been pressed while already dragging -> stop current action + if (mouse_event.LeftIsDown()) + gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true); + else if (mouse_event.RightIsDown()) + pending_right_up = false; + } + } + else if (mouse_event.LeftUp() && !m_parent.is_mouse_dragging()) { + // in case SLA/FDM gizmo is selected, we just pass the LeftUp event + // and stop processing - neither object moving or selecting is + // suppressed in that case + gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), mouse_event.CmdDown()); + return true; + } + else if (mouse_event.RightDown()) { + if (m_parent.get_selection().get_object_idx() != -1 && + gizmo_event(SLAGizmoEventType::RightDown, mouse_pos, false, false, false)) { + // we need to set the following right up as processed to avoid showing + // the context menu if the user release the mouse over the object + pending_right_up = true; + // event was taken care of by the SlaSupports gizmo + return true; + } + } + else if (pending_right_up && mouse_event.RightUp()) { + pending_right_up = false; + return true; + } + return false; +} - // Draw the cutting plane - ::glBegin(GL_QUADS); - ::glColor4f(0.8f, 0.8f, 0.8f, 0.5f); - ::glVertex3f(min_x, min_y, plane_center.z()); - ::glVertex3f(max_x, min_y, plane_center.z()); - ::glVertex3f(max_x, max_y, plane_center.z()); - ::glVertex3f(min_x, max_y, plane_center.z()); - glsafe(::glEnd()); +void GLGizmoCut3D::shift_cut(double delta) +{ + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Move cut plane"), UndoRedo::SnapshotType::GizmoAction); + set_center(m_plane_center + m_cut_normal * delta, true); + m_ar_plane_center = m_plane_center; +} - glsafe(::glEnable(GL_CULL_FACE)); - glsafe(::glDisable(GL_BLEND)); +void GLGizmoCut3D::rotate_vec3d_around_plane_center(Vec3d&vec) +{ + vec = Transformation(translation_transform(m_plane_center) * m_rotation_m * translation_transform(-m_plane_center)).get_matrix() * vec; +} + +void GLGizmoCut3D::put_connectors_on_cut_plane(const Vec3d& cp_normal, double cp_offset) +{ + ModelObject* mo = m_c->selection_info()->model_object(); + if (CutConnectors& connectors = mo->cut_connectors; !connectors.empty()) { + const float sla_shift = m_c->selection_info()->get_sla_shift(); + const Vec3d& instance_offset = mo->instances[m_c->selection_info()->get_active_instance()]->get_offset(); - // TODO: draw cut part contour? + for (auto& connector : connectors) { + // convert connetor pos to the world coordinates + Vec3d pos = connector.pos + instance_offset; + pos[Z] += sla_shift; + // scalar distance from point to plane along the normal + double distance = -cp_normal.dot(pos) + cp_offset; + // move connector + connector.pos += distance * cp_normal; + } + } +} - // Draw the grabber and the connecting line - m_grabbers[0].center = plane_center; - m_grabbers[0].center.z() = plane_center.z() + Offset; +// returns true if the camera (forward) is pointing in the negative direction of the cut normal +bool GLGizmoCut3D::is_looking_forward() const +{ + const Camera& camera = wxGetApp().plater()->get_camera(); + const double dot = camera.get_dir_forward().dot(m_cut_normal); + return dot < 0.05; +} - glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); +void GLGizmoCut3D::update_clipper() +{ + // update cut_normal + Vec3d normal = m_rotation_m * Vec3d::UnitZ(); + normal.normalize(); + m_cut_normal = normal; - glsafe(::glLineWidth(m_hover_id != -1 ? 2.0f : 1.5f)); - glsafe(::glColor3f(1.0, 1.0, 0.0)); - ::glBegin(GL_LINES); - ::glVertex3dv(plane_center.data()); - ::glVertex3dv(m_grabbers[0].center.data()); - glsafe(::glEnd()); + // calculate normal and offset for clipping plane + Vec3d beg = m_bb_center; + beg[Z] -= m_radius; + rotate_vec3d_around_plane_center(beg); - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); - if (shader == nullptr) - return; - shader->start_using(); - shader->set_uniform("emission_factor", 0.1f); + m_clp_normal = normal; + double offset = normal.dot(m_plane_center); + double dist = normal.dot(beg); - m_grabbers[0].color = GrabberColor; - m_grabbers[0].render(m_hover_id == 0, (float)((box.size().x() + box.size().y() + box.size().z()) / 3.0)); + m_parent.set_color_clip_plane(normal, offset); - shader->stop_using(); + if (!is_looking_forward()) { + // recalculate normal and offset for clipping plane, if camera is looking downward to cut plane + normal = m_rotation_m * (-1. * Vec3d::UnitZ()); + normal.normalize(); + + beg = m_bb_center; + beg[Z] += m_radius; + rotate_vec3d_around_plane_center(beg); + + m_clp_normal = normal; + offset = normal.dot(m_plane_center); + dist = normal.dot(beg); + } - glsafe(::glPushMatrix()); - glsafe(::glTranslated(m_cut_contours.shift.x(), m_cut_contours.shift.y(), m_cut_contours.shift.z())); - glsafe(::glLineWidth(2.0f)); - m_cut_contours.contours.render(); - glsafe(::glPopMatrix()); + m_c->object_clipper()->set_range_and_pos(normal, offset, dist); + + put_connectors_on_cut_plane(normal, offset); + + if (m_raycasters.empty()) + on_register_raycasters_for_picking(); + else + update_raycasters_for_picking_transform(); } -void GLGizmoCut::on_render_for_picking() +void GLGizmoCut3D::set_center(const Vec3d& center, bool update_tbb /*=false*/) { - glsafe(::glDisable(GL_DEPTH_TEST)); - render_grabbers_for_picking(m_parent.get_selection().get_bounding_box()); + set_center_pos(center, update_tbb); + update_clipper(); } -void GLGizmoCut::on_render_input_window(float x, float y, float bottom_limit) +bool GLGizmoCut3D::render_combo(const std::string& label, const std::vector& lines, size_t& selection_idx) { - static float last_y = 0.0f; - static float last_h = 0.0f; - - m_imgui->begin(_L("Cut"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); + ImGui::AlignTextToFramePadding(); + m_imgui->text(label); + ImGui::SameLine(m_label_width); + ImGui::PushItemWidth(m_control_width); + + size_t selection_out = selection_idx; + // It is necessary to use BeginGroup(). Otherwise, when using SameLine() is called, then other items will be drawn inside the combobox. + ImGui::BeginGroup(); + ImVec2 combo_pos = ImGui::GetCursorScreenPos(); + if (ImGui::BeginCombo(("##"+label).c_str(), "")) { + for (size_t line_idx = 0; line_idx < lines.size(); ++line_idx) { + ImGui::PushID(int(line_idx)); + if (ImGui::Selectable("", line_idx == selection_idx)) + selection_out = line_idx; - const bool imperial_units = wxGetApp().app_config->get("use_inches") == "1"; + ImGui::SameLine(); + ImGui::Text("%s", lines[line_idx].c_str()); + ImGui::PopID(); + } - // adjust window position to avoid overlap the view toolbar - const float win_h = ImGui::GetWindowHeight(); - y = std::min(y, bottom_limit - win_h); - ImGui::SetWindowPos(ImVec2(x, y), ImGuiCond_Always); - if (last_h != win_h || last_y != y) { - // ask canvas for another frame to render the window in the correct position - m_imgui->set_requires_extra_frame(); - if (last_h != win_h) - last_h = win_h; - if (last_y != y) - last_y = y; + ImGui::EndCombo(); } + ImVec2 backup_pos = ImGui::GetCursorScreenPos(); + ImGuiStyle& style = ImGui::GetStyle(); + + ImGui::SetCursorScreenPos(ImVec2(combo_pos.x + style.FramePadding.x, combo_pos.y + style.FramePadding.y)); + ImGui::Text("%s", selection_out < lines.size() ? lines[selection_out].c_str() : UndefLabel.c_str()); + ImGui::SetCursorScreenPos(backup_pos); + ImGui::EndGroup(); + + bool is_changed = selection_idx != selection_out; + selection_idx = selection_out; + + if (is_changed) + update_connector_shape(); + + return is_changed; +} + +bool GLGizmoCut3D::render_double_input(const std::string& label, double& value_in) +{ ImGui::AlignTextToFramePadding(); - m_imgui->text("Z"); + m_imgui->text(label); + ImGui::SameLine(m_label_width); + ImGui::PushItemWidth(m_control_width); + + double value = value_in; + if (m_imperial_units) + value *= ObjectManipulation::mm_to_in; + double old_val = value; + ImGui::InputDouble(("##" + label).c_str(), &value, 0.0f, 0.0f, "%.2f", ImGuiInputTextFlags_CharsDecimal); + + ImGui::SameLine(); + m_imgui->text(m_imperial_units ? _L("in") : _L("mm")); + + value_in = value * (m_imperial_units ? ObjectManipulation::in_to_mm : 1.0); + return !is_approx(old_val, value); +} + +bool GLGizmoCut3D::render_slider_double_input(const std::string& label, float& value_in, float& tolerance_in) +{ + constexpr float UndefMinVal = -0.1f; + const float f_mm_to_in = static_cast(ObjectManipulation::mm_to_in); + + auto render_slider = [this, UndefMinVal, f_mm_to_in] + (const std::string& label, float& val, float def_val, float max_val, const wxString& tooltip) { + float min_val = val < 0.f ? UndefMinVal : def_val; + float value = val; + if (m_imperial_units) { + min_val *= f_mm_to_in; + value *= f_mm_to_in; + } + const float old_val = value; + const std::string format = val < 0.f ? UndefLabel : (m_imperial_units ? "%.4f " + _u8L("in") : "%.2f " + _u8L("mm")); + + m_imgui->slider_float(label.c_str(), &value, min_val, max_val, format.c_str(), 1.f, true, tooltip); + val = value * (m_imperial_units ? static_cast(ObjectManipulation::in_to_mm) : 1.f); + + return !is_approx(old_val, value); + }; + + const BoundingBoxf3 bbox = m_bounding_box; + const float mean_size = float((bbox.size().x() + bbox.size().y() + bbox.size().z()) / 9.0) * (m_imperial_units ? f_mm_to_in : 1.f); + + ImGuiWrapper::text(label); + + ImGui::SameLine(m_label_width); + ImGui::PushItemWidth(m_control_width * 0.7f); + + const bool is_value_changed = render_slider("##" + label, value_in, 1.f, mean_size, _L("Value")); + ImGui::SameLine(); - ImGui::PushItemWidth(m_imgui->get_style_scaling() * 150.0f); + ImGui::PushItemWidth(m_control_width * 0.45f); + + const bool is_tolerance_changed = render_slider("##tolerance_" + label, tolerance_in, 0.f, 0.5f * mean_size, _L("Tolerance")); - double cut_z = m_cut_z; - if (imperial_units) - cut_z *= ObjectManipulation::mm_to_in; - ImGui::InputDouble("", &cut_z, 0.0f, 0.0f, "%.2f", ImGuiInputTextFlags_CharsDecimal); + return is_value_changed || is_tolerance_changed; +} +void GLGizmoCut3D::render_move_center_input(int axis) +{ + m_imgui->text(m_axis_names[axis]+":"); ImGui::SameLine(); - m_imgui->text(imperial_units ? _L("in") : _L("mm")); + ImGui::PushItemWidth(0.3f*m_control_width); - m_cut_z = cut_z * (imperial_units ? ObjectManipulation::in_to_mm : 1.0); + Vec3d move = m_plane_center; + double in_val, value = in_val = move[axis]; + if (m_imperial_units) + value *= ObjectManipulation::mm_to_in; + ImGui::InputDouble(("##move_" + m_axis_names[axis]).c_str(), &value, 0.0, 0.0, "%.2f", ImGuiInputTextFlags_CharsDecimal); + ImGui::SameLine(); - ImGui::Separator(); + double val = value * (m_imperial_units ? ObjectManipulation::in_to_mm : 1.0); - m_imgui->checkbox(_L("Keep upper part"), m_keep_upper); - m_imgui->checkbox(_L("Keep lower part"), m_keep_lower); - m_imgui->checkbox(_L("Rotate lower part upwards"), m_rotate_lower); + if (in_val != val) { + move[axis] = val; + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Move cut plane"), UndoRedo::SnapshotType::GizmoAction); + set_center(move, true); + m_ar_plane_center = m_plane_center; + } +} - ImGui::Separator(); +bool GLGizmoCut3D::render_connect_type_radio_button(CutConnectorType type) +{ + ImGui::SameLine(type == CutConnectorType::Plug ? m_label_width : 0); + ImGui::PushItemWidth(m_control_width); + if (ImGui::RadioButton(m_connector_types[size_t(type)].c_str(), m_connector_type == type)) { + m_connector_type = type; + update_connector_shape(); + return true; + } + return false; +} - m_imgui->disabled_begin((!m_keep_upper && !m_keep_lower) || m_cut_z <= 0.0 || m_max_z <= m_cut_z); - const bool cut_clicked = m_imgui->button(_L("Perform cut")); - m_imgui->disabled_end(); +void GLGizmoCut3D::render_connect_mode_radio_button(CutConnectorMode mode) +{ + ImGui::SameLine(mode == CutConnectorMode::Auto ? m_label_width : 2 * m_label_width); + ImGui::PushItemWidth(m_control_width); + if (ImGui::RadioButton(m_connector_modes[int(mode)].c_str(), m_connector_mode == mode)) + m_connector_mode = mode; +} - m_imgui->end(); +bool GLGizmoCut3D::render_reset_button(const std::string& label_id, const std::string& tooltip) const +{ + const ImGuiStyle& style = ImGui::GetStyle(); + + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, { 1, style.ItemSpacing.y }); + + ImGui::PushStyleColor(ImGuiCol_Button, { 0.25f, 0.25f, 0.25f, 0.0f }); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, { 0.4f, 0.4f, 0.4f, 1.0f }); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, { 0.4f, 0.4f, 0.4f, 1.0f }); + + std::string btn_label; + btn_label += ImGui::RevertButton; + const bool revert = ImGui::Button((btn_label +"##" + label_id).c_str()); + + ImGui::PopStyleColor(3); + + if (ImGui::IsItemHovered()) + m_imgui->tooltip(tooltip.c_str(), ImGui::GetFontSize() * 20.0f); + + ImGui::PopStyleVar(); + + return revert; +} + +void GLGizmoCut3D::render_cut_plane() +{ + if (cut_line_processing()) + return; - if (cut_clicked && (m_keep_upper || m_keep_lower)) - perform_cut(m_parent.get_selection()); + GLShaderProgram* shader = wxGetApp().get_shader("flat"); + if (shader == nullptr) + return; + + glsafe(::glEnable(GL_DEPTH_TEST)); + glsafe(::glDisable(GL_CULL_FACE)); + glsafe(::glEnable(GL_BLEND)); + glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); + + shader->start_using(); + + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d view_model_matrix = camera.get_view_matrix() * translation_transform(m_plane_center) * m_rotation_m; + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + + if (can_perform_cut() && has_valid_contour()) { + if (m_hover_id == CutPlane) + m_plane.model.set_color({ 0.9f, 0.9f, 0.9f, 0.5f }); + else + m_plane.model.set_color({ 0.8f, 0.8f, 0.8f, 0.5f }); + } + else + m_plane.model.set_color({ 1.0f, 0.8f, 0.8f, 0.5f }); + m_plane.model.render(); + + glsafe(::glEnable(GL_CULL_FACE)); + glsafe(::glDisable(GL_BLEND)); + + shader->stop_using(); } -void GLGizmoCut::set_cut_z(double cut_z) +static double get_grabber_mean_size(const BoundingBoxf3& bb) { - // Clamp the plane to the object's bounding box - m_cut_z = std::clamp(cut_z, 0.0, m_max_z); + return (bb.size().x() + bb.size().y() + bb.size().z()) / 30.; } -void GLGizmoCut::perform_cut(const Selection& selection) +static double get_half_size(double size) { - const int instance_idx = selection.get_instance_idx(); - const int object_idx = selection.get_object_idx(); + return std::max(size * 0.35, 0.05); +} - wxCHECK_RET(instance_idx >= 0 && object_idx >= 0, "GLGizmoCut: Invalid object selection"); +static double get_dragging_half_size(double size) +{ + return get_half_size(size) * 1.25; +} - // m_cut_z is the distance from the bed. Subtract possible SLA elevation. - const GLVolume* first_glvolume = selection.get_volume(*selection.get_volume_idxs().begin()); - const double object_cut_z = m_cut_z - first_glvolume->get_sla_shift_z(); - - if (0.0 < object_cut_z && object_cut_z < m_max_z) - wxGetApp().plater()->cut(object_idx, instance_idx, object_cut_z, - only_if(m_keep_upper, ModelObjectCutAttribute::KeepUpper) | - only_if(m_keep_lower, ModelObjectCutAttribute::KeepLower) | - only_if(m_rotate_lower, ModelObjectCutAttribute::FlipLower)); - else { - // the object is SLA-elevated and the plane is under it. +void GLGizmoCut3D::render_model(GLModel& model, const ColorRGBA& color, Transform3d view_model_matrix) +{ + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); + if (shader) { + shader->start_using(); + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", wxGetApp().plater()->get_camera().get_projection_matrix()); + + model.set_color(color); + model.render(); + + shader->stop_using(); } } -double GLGizmoCut::calc_projection(const Linef3& mouse_ray) const +void GLGizmoCut3D::render_line(GLModel& line_model, const ColorRGBA& color, Transform3d view_model_matrix, float width) { - double projection = 0.0; + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); + if (shader) { + shader->start_using(); - const Vec3d starting_vec = m_drag_pos - m_drag_center; - const double len_starting_vec = starting_vec.norm(); - if (len_starting_vec != 0.0) { - const Vec3d mouse_dir = mouse_ray.unit_vector(); - // finds the intersection of the mouse ray with the plane parallel to the camera viewport and passing throught the starting position - // use ray-plane intersection see i.e. https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection algebric form - // in our case plane normal and ray direction are the same (orthogonal view) - // when moving to perspective camera the negative z unit axis of the camera needs to be transformed in world space and used as plane normal - const Vec3d inters = mouse_ray.a + (m_drag_pos - mouse_ray.a).dot(mouse_dir) / mouse_dir.squaredNorm() * mouse_dir; - // vector from the starting position to the found intersection - const Vec3d inters_vec = inters - m_drag_pos; + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", wxGetApp().plater()->get_camera().get_projection_matrix()); + shader->set_uniform("width", width); - // finds projection of the vector along the staring direction - projection = inters_vec.dot(starting_vec.normalized()); + line_model.set_color(color); + line_model.render(); + + shader->stop_using(); } - return projection; } -BoundingBoxf3 GLGizmoCut::bounding_box() const +void GLGizmoCut3D::render_rotation_snapping(GrabberID axis, const ColorRGBA& color) { - BoundingBoxf3 ret; - const Selection& selection = m_parent.get_selection(); - const Selection::IndicesList& idxs = selection.get_volume_idxs(); - for (unsigned int i : idxs) { - const GLVolume* volume = selection.get_volume(i); - if (!volume->is_modifier) - ret.merge(volume->transformed_convex_hull_bounding_box()); + GLShaderProgram* line_shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); + if (!line_shader) + return; + + const Camera& camera = wxGetApp().plater()->get_camera(); + Transform3d view_model_matrix = camera.get_view_matrix() * translation_transform(m_plane_center) * m_start_dragging_m; + + if (axis == X) + view_model_matrix = view_model_matrix * rotation_transform(0.5 * PI * Vec3d::UnitY()) * rotation_transform(-PI * Vec3d::UnitZ()); + else + view_model_matrix = view_model_matrix * rotation_transform(-0.5 * PI * Vec3d::UnitZ()) * rotation_transform(-0.5 * PI * Vec3d::UnitY()); + + line_shader->start_using(); + line_shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + line_shader->set_uniform("view_model_matrix", view_model_matrix); + line_shader->set_uniform("width", 0.25f); + + m_circle.render(); + m_scale.render(); + m_snap_radii.render(); + m_reference_radius.render(); + if (m_dragging) { + line_shader->set_uniform("width", 1.5f); + m_angle_arc.set_color(color); + m_angle_arc.render(); } - return ret; + + line_shader->stop_using(); } -void GLGizmoCut::update_contours() +void GLGizmoCut3D::render_grabber_connection(const ColorRGBA& color, Transform3d view_matrix) { - const Selection& selection = m_parent.get_selection(); - const GLVolume* first_glvolume = selection.get_volume(*selection.get_volume_idxs().begin()); - const BoundingBoxf3& box = first_glvolume->transformed_convex_hull_bounding_box(); + const Transform3d line_view_matrix = view_matrix * scale_transform(Vec3d(1.0, 1.0, m_grabber_connection_len)); - const ModelObject* model_object = wxGetApp().model().objects[selection.get_object_idx()]; - const int instance_idx = selection.get_instance_idx(); - std::vector volumes_idxs = std::vector(model_object->volumes.size()); - std::vector volumes_trafos = std::vector(model_object->volumes.size()); - for (size_t i = 0; i < model_object->volumes.size(); ++i) { - volumes_idxs[i] = model_object->volumes[i]->id(); - volumes_trafos[i] = model_object->volumes[i]->get_matrix(); - } - - bool trafos_match = std::equal(volumes_trafos.begin(), volumes_trafos.end(), - m_cut_contours.volumes_trafos.begin(), m_cut_contours.volumes_trafos.end(), - [](const Transform3d& a, const Transform3d& b) { return a.isApprox(b); }); - - if (0.0 < m_cut_z && m_cut_z < m_max_z) { - if (m_cut_contours.cut_z != m_cut_z || m_cut_contours.object_id != model_object->id() || - m_cut_contours.instance_idx != instance_idx || m_cut_contours.volumes_idxs != volumes_idxs || - !trafos_match) { - m_cut_contours.cut_z = m_cut_z; - - if (m_cut_contours.object_id != model_object->id() || m_cut_contours.volumes_idxs != volumes_idxs || !trafos_match) - m_cut_contours.mesh = model_object->raw_mesh(); - - m_cut_contours.position = box.center(); - m_cut_contours.shift = Vec3d::Zero(); - m_cut_contours.object_id = model_object->id(); - m_cut_contours.instance_idx = instance_idx; - m_cut_contours.volumes_idxs = volumes_idxs; - m_cut_contours.volumes_trafos = volumes_trafos; - m_cut_contours.contours.reset(); - - MeshSlicingParams slicing_params; - slicing_params.trafo = first_glvolume->get_instance_transformation().get_matrix(); - slicing_params.trafo.pretranslate(Vec3d(0., 0., first_glvolume->get_sla_shift_z())); - - const Polygons polys = slice_mesh(m_cut_contours.mesh.its, m_cut_z, slicing_params); - if (!polys.empty()) { - m_cut_contours.contours.init_from(polys, static_cast(m_cut_z)); - m_cut_contours.contours.set_color(-1, { 1.0f, 1.0f, 1.0f, 1.0f }); - } + render_line(m_grabber_connection, color, line_view_matrix, 0.2f); +}; + +void GLGizmoCut3D::render_cut_plane_grabbers() +{ + glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); + + ColorRGBA color = ColorRGBA::GRAY(); + + const Transform3d view_matrix = wxGetApp().plater()->get_camera().get_view_matrix() * translation_transform(m_plane_center) * m_rotation_m; + + const double mean_size = get_grabber_mean_size(m_bounding_box); + double size; + + const bool dragging_by_cut_plane = m_dragging && m_hover_id == CutPlane; + + if (!dragging_by_cut_plane) { + render_grabber_connection(GRABBER_COLOR, view_matrix); + + // render sphere grabber + size = m_dragging ? get_dragging_half_size(mean_size) : get_half_size(mean_size); + color = m_hover_id == Y ? complementary(ColorRGBA::GREEN()) : + m_hover_id == X ? complementary(ColorRGBA::RED()) : + m_hover_id == Z ? GRABBER_COLOR : ColorRGBA::GRAY(); + render_model(m_sphere.model, color, view_matrix * translation_transform(m_grabber_connection_len * Vec3d::UnitZ()) * scale_transform(size)); + } + + const bool no_one_grabber_hovered = !m_dragging && (m_hover_id < 0 || m_hover_id == CutPlane); + + // render X grabber + + if (no_one_grabber_hovered || m_hover_id == X) + { + size = m_dragging && m_hover_id == X ? get_dragging_half_size(mean_size) : get_half_size(mean_size); + const Vec3d cone_scale = Vec3d(0.75 * size, 0.75 * size, 1.8 * size); + color = m_hover_id == X ? complementary(ColorRGBA::RED()) : ColorRGBA::RED(); + + if (m_hover_id == X) { + render_grabber_connection(color, view_matrix); + render_rotation_snapping(X, color); } - else if (box.center() != m_cut_contours.position) { - m_cut_contours.shift = box.center() - m_cut_contours.position; + + Vec3d offset = Vec3d(0.0, 1.25 * size, m_grabber_connection_len); + render_model(m_cone.model, color, view_matrix * translation_transform(offset) * rotation_transform(-0.5 * PI * Vec3d::UnitX()) * scale_transform(cone_scale)); + offset = Vec3d(0.0, -1.25 * size, m_grabber_connection_len); + render_model(m_cone.model, color, view_matrix * translation_transform(offset) * rotation_transform(0.5 * PI * Vec3d::UnitX()) * scale_transform(cone_scale)); + } + + // render Y grabber + + if (no_one_grabber_hovered || m_hover_id == Y) + { + size = m_dragging && m_hover_id == Y ? get_dragging_half_size(mean_size) : get_half_size(mean_size); + const Vec3d cone_scale = Vec3d(0.75 * size, 0.75 * size, 1.8 * size); + color = m_hover_id == Y ? complementary(ColorRGBA::GREEN()) : ColorRGBA::GREEN(); + + if (m_hover_id == Y) { + render_grabber_connection(color, view_matrix); + render_rotation_snapping(Y, color); } + + Vec3d offset = Vec3d(1.25 * size, 0.0, m_grabber_connection_len); + render_model(m_cone.model, color, view_matrix * translation_transform(offset) * rotation_transform(0.5 * PI * Vec3d::UnitY()) * scale_transform(cone_scale)); + offset = Vec3d(-1.25 * size, 0.0, m_grabber_connection_len); + render_model(m_cone.model, color, view_matrix * translation_transform(offset)* rotation_transform(-0.5 * PI * Vec3d::UnitY()) * scale_transform(cone_scale)); } - else - m_cut_contours.contours.reset(); } +void GLGizmoCut3D::render_cut_line() +{ + if (!cut_line_processing() || m_line_end.isApprox(Vec3d::Zero())) + return; + + glsafe(::glEnable(GL_DEPTH_TEST)); + glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); + + m_cut_line.reset(); + m_cut_line.init_from(its_make_line((Vec3f)m_line_beg.cast(), (Vec3f)m_line_end.cast())); + + render_line(m_cut_line, GRABBER_COLOR, wxGetApp().plater()->get_camera().get_view_matrix(), 0.25f); +} + +bool GLGizmoCut3D::on_init() +{ + m_grabbers.emplace_back(); + m_shortcut_key = WXK_CONTROL_C; + + // initiate info shortcuts + const wxString ctrl = GUI::shortkey_ctrl_prefix(); + const wxString alt = GUI::shortkey_alt_prefix(); + const wxString shift = "Shift+"; + + m_shortcuts.push_back(std::make_pair(_L("Left click"), _L("Add connector"))); + m_shortcuts.push_back(std::make_pair(_L("Right click"), _L("Remove connector"))); + m_shortcuts.push_back(std::make_pair(_L("Drag"), _L("Move connector"))); + m_shortcuts.push_back(std::make_pair(shift + _L("Left click"), _L("Add connector to selection"))); + m_shortcuts.push_back(std::make_pair(alt + _L("Left click"), _L("Remove connector from selection"))); + m_shortcuts.push_back(std::make_pair(ctrl + "A", _L("Select all connectors"))); + + return true; +} + +void GLGizmoCut3D::on_load(cereal::BinaryInputArchive& ar) +{ + ar( m_keep_upper, m_keep_lower, m_rotate_lower, m_rotate_upper, m_hide_cut_plane, m_mode, m_connectors_editing, + m_ar_plane_center, m_rotation_m); + + m_transformed_bounding_box = transformed_bounding_box(m_ar_plane_center, m_rotation_m); + set_center_pos(m_ar_plane_center); + + m_parent.request_extra_frame(); +} + +void GLGizmoCut3D::on_save(cereal::BinaryOutputArchive& ar) const +{ + ar( m_keep_upper, m_keep_lower, m_rotate_lower, m_rotate_upper, m_hide_cut_plane, m_mode, m_connectors_editing, + m_ar_plane_center, m_start_dragging_m); +} + +std::string GLGizmoCut3D::on_get_name() const +{ + return _u8L("Cut"); +} + +void GLGizmoCut3D::on_set_state() +{ + if (m_state == On) { + m_parent.set_use_color_clip_plane(true); + m_parent.set_color_clip_plane_colors({ UPPER_PART_COLOR , LOWER_PART_COLOR }); + + update_bb(); + m_connectors_editing = !m_selected.empty(); + m_transformed_bounding_box = transformed_bounding_box(m_plane_center, m_rotation_m); + + // initiate archived values + m_ar_plane_center = m_plane_center; + m_start_dragging_m = m_rotation_m; + + m_parent.request_extra_frame(); + } + else { + if (auto oc = m_c->object_clipper()) { + oc->set_behavior(true, true, 0.); + oc->release(); + } + m_selected.clear(); + m_parent.set_use_color_clip_plane(false); + m_c->selection_info()->set_use_shift(false); + } +} + +void GLGizmoCut3D::on_register_raycasters_for_picking() +{ + assert(m_raycasters.empty()); + // the gizmo grabbers are rendered on top of the scene, so the raytraced picker should take it into account + m_parent.set_raycaster_gizmos_on_top(true); + + init_picking_models(); + + if (m_connectors_editing) { + if (CommonGizmosDataObjects::SelectionInfo* si = m_c->selection_info()) { + const CutConnectors& connectors = si->model_object()->cut_connectors; + for (int i = 0; i < int(connectors.size()); ++i) + m_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, i + m_connectors_group_id, *(m_shapes[connectors[i].attribs]).mesh_raycaster, Transform3d::Identity())); + } + } + else if (!cut_line_processing()) { + m_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, X, *m_cone.mesh_raycaster, Transform3d::Identity())); + m_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, X, *m_cone.mesh_raycaster, Transform3d::Identity())); + + m_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, Y, *m_cone.mesh_raycaster, Transform3d::Identity())); + m_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, Y, *m_cone.mesh_raycaster, Transform3d::Identity())); + + m_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, Z, *m_sphere.mesh_raycaster, Transform3d::Identity())); + + m_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, CutPlane, *m_plane.mesh_raycaster, Transform3d::Identity())); + } + + update_raycasters_for_picking_transform(); +} + +void GLGizmoCut3D::on_unregister_raycasters_for_picking() +{ + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo); + m_raycasters.clear(); + // the gizmo grabbers are rendered on top of the scene, so the raytraced picker should take it into account + m_parent.set_raycaster_gizmos_on_top(false); +} + +void GLGizmoCut3D::update_raycasters_for_picking() +{ + on_unregister_raycasters_for_picking(); + on_register_raycasters_for_picking(); +} + +void GLGizmoCut3D::set_volumes_picking_state(bool state) +{ + std::vector>* raycasters = m_parent.get_raycasters_for_picking(SceneRaycaster::EType::Volume); + if (raycasters != nullptr) { + const Selection& selection = m_parent.get_selection(); + const Selection::IndicesList ids = selection.get_volume_idxs(); + for (unsigned int id : ids) { + const GLVolume* v = selection.get_volume(id); + auto it = std::find_if(raycasters->begin(), raycasters->end(), [v](std::shared_ptr item) { return item->get_raycaster() == v->mesh_raycaster.get(); }); + if (it != raycasters->end()) + (*it)->set_active(state); + } + } +} + +void GLGizmoCut3D::update_raycasters_for_picking_transform() +{ + if (m_connectors_editing) { + CommonGizmosDataObjects::SelectionInfo* si = m_c->selection_info(); + if (!si) + return; + const ModelObject* mo = si->model_object(); + const CutConnectors& connectors = mo->cut_connectors; + if (connectors.empty()) + return; + auto inst_id = m_c->selection_info()->get_active_instance(); + if (inst_id < 0) + return; + + const Vec3d& instance_offset = mo->instances[inst_id]->get_offset(); + const double sla_shift = double(m_c->selection_info()->get_sla_shift()); + + const bool looking_forward = is_looking_forward(); + + for (size_t i = 0; i < connectors.size(); ++i) { + const CutConnector& connector = connectors[i]; + + float height = connector.height; + // recalculate connector position to world position + Vec3d pos = connector.pos + instance_offset; + if (connector.attribs.type == CutConnectorType::Dowel && + connector.attribs.style == CutConnectorStyle::Prism) { + height = 0.05f; + if (!looking_forward) + pos += 0.05 * m_clp_normal; + } + pos[Z] += sla_shift; + + const Transform3d scale_trafo = scale_transform(Vec3f(connector.radius, connector.radius, height).cast()); + m_raycasters[i]->set_transform(translation_transform(pos) * m_rotation_m * scale_trafo); + } + } + else if (!cut_line_processing()){ + const Transform3d trafo = translation_transform(m_plane_center) * m_rotation_m; + + const BoundingBoxf3 box = m_bounding_box; + + const double size = get_half_size(get_grabber_mean_size(box)); + Vec3d scale = Vec3d(0.75 * size, 0.75 * size, 1.8 * size); + + int id = 0; + + Vec3d offset = Vec3d(0.0, 1.25 * size, m_grabber_connection_len); + m_raycasters[id++]->set_transform(trafo * translation_transform(offset) * rotation_transform(-0.5 * PI * Vec3d::UnitX()) * scale_transform(scale)); + offset = Vec3d(0.0, -1.25 * size, m_grabber_connection_len); + m_raycasters[id++]->set_transform(trafo * translation_transform(offset) * rotation_transform(0.5 * PI * Vec3d::UnitX()) * scale_transform(scale)); + + offset = Vec3d(1.25 * size, 0.0, m_grabber_connection_len); + m_raycasters[id++]->set_transform(trafo * translation_transform(offset) * rotation_transform(0.5 * PI * Vec3d::UnitY()) * scale_transform(scale)); + offset = Vec3d(-1.25 * size, 0.0, m_grabber_connection_len); + m_raycasters[id++]->set_transform(trafo * translation_transform(offset) * rotation_transform(-0.5 * PI * Vec3d::UnitY()) * scale_transform(scale)); + + offset = 1.25 * size * Vec3d::UnitZ(); + m_raycasters[id++]->set_transform(trafo * translation_transform(m_grabber_connection_len * Vec3d::UnitZ()) * scale_transform(size)); + + m_raycasters[id++]->set_transform(trafo); + } +} + +void GLGizmoCut3D::on_set_hover_id() +{ +} + +bool GLGizmoCut3D::on_is_activable() const +{ + const Selection& selection = m_parent.get_selection(); + const int object_idx = selection.get_object_idx(); + if (object_idx < 0 || selection.is_wipe_tower()) + return false; + + if (const ModelObject* mo = wxGetApp().plater()->model().objects[object_idx]; + mo->is_cut() && mo->volumes.size() == 1) { + const ModelVolume* volume = mo->volumes[0]; + if (volume->is_cut_connector() && volume->cut_info.connector_type == CutConnectorType::Dowel) + return false; + } + + // This is assumed in GLCanvas3D::do_rotate, do not change this + // without updating that function too. + return selection.is_single_full_instance() && !m_parent.is_layers_editing_enabled(); +} + +bool GLGizmoCut3D::on_is_selectable() const +{ + return wxGetApp().get_mode() != comSimple; +} + +Vec3d GLGizmoCut3D::mouse_position_in_local_plane(GrabberID axis, const Linef3& mouse_ray) const +{ + double half_pi = 0.5 * PI; + + Transform3d m = Transform3d::Identity(); + + switch (axis) + { + case X: + { + m.rotate(Eigen::AngleAxisd(half_pi, Vec3d::UnitZ())); + m.rotate(Eigen::AngleAxisd(-half_pi, Vec3d::UnitY())); + break; + } + case Y: + { + m.rotate(Eigen::AngleAxisd(half_pi, Vec3d::UnitY())); + m.rotate(Eigen::AngleAxisd(half_pi, Vec3d::UnitZ())); + break; + } + default: + case Z: + { + // no rotation applied + break; + } + } + + m = m * m_start_dragging_m.inverse(); + m.translate(-m_plane_center); + + return transform(mouse_ray, m).intersect_plane(0.0); +} + +void GLGizmoCut3D::dragging_grabber_z(const GLGizmoBase::UpdateData &data) +{ + const Vec3d grabber_init_pos = (m_hover_id == CutPlane ? 0. : m_grabber_connection_len) * Vec3d::UnitZ(); + const Vec3d starting_drag_position = translation_transform(m_plane_center) * m_rotation_m * grabber_init_pos; + double projection = 0.0; + + Vec3d starting_vec = m_rotation_m * Vec3d::UnitZ(); + if (starting_vec.norm() != 0.0) { + const Vec3d mouse_dir = data.mouse_ray.unit_vector(); + // finds the intersection of the mouse ray with the plane parallel to the camera viewport and passing throught the starting position + // use ray-plane intersection see i.e. https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection algebric form + // in our case plane normal and ray direction are the same (orthogonal view) + // when moving to perspective camera the negative z unit axis of the camera needs to be transformed in world space and used as plane normal + const Vec3d inters = data.mouse_ray.a + (starting_drag_position - data.mouse_ray.a).dot(mouse_dir) * mouse_dir; + // vector from the starting position to the found intersection + const Vec3d inters_vec = inters - starting_drag_position; + + starting_vec.normalize(); + // finds projection of the vector along the staring direction + projection = inters_vec.dot(starting_vec); + } + if (wxGetKeyState(WXK_SHIFT)) + projection = m_snap_step * std::round(projection / m_snap_step); + + const Vec3d shift = starting_vec * projection; + + // move cut plane center + set_center(m_plane_center + shift, true); + + m_was_cut_plane_dragged = true; +} + +void GLGizmoCut3D::dragging_grabber_xy(const GLGizmoBase::UpdateData &data) +{ + const Vec2d mouse_pos = to_2d(mouse_position_in_local_plane((GrabberID)m_hover_id, data.mouse_ray)); + + const Vec2d orig_dir = Vec2d::UnitX(); + const Vec2d new_dir = mouse_pos.normalized(); + + const double two_pi = 2.0 * PI; + + double theta = ::acos(std::clamp(new_dir.dot(orig_dir), -1.0, 1.0)); + if (cross2(orig_dir, new_dir) < 0.0) + theta = two_pi - theta; + + const double len = mouse_pos.norm(); + // snap to coarse snap region + if (m_snap_coarse_in_radius <= len && len <= m_snap_coarse_out_radius) { + const double step = two_pi / double(SnapRegionsCount); + theta = step * std::round(theta / step); + } + // snap to fine snap region (scale) + else if (m_snap_fine_in_radius <= len && len <= m_snap_fine_out_radius) { + const double step = two_pi / double(ScaleStepsCount); + theta = step * std::round(theta / step); + } + + if (is_approx(theta, two_pi)) + theta = 0.0; + if (m_hover_id == X) + theta += 0.5 * PI; + + Vec3d rotation = Vec3d::Zero(); + rotation[m_hover_id] = theta; + + const Transform3d rotation_tmp = m_start_dragging_m * rotation_transform(rotation); + const bool update_tbb = !m_rotation_m.rotation().isApprox(rotation_tmp.rotation()); + m_rotation_m = rotation_tmp; + if (update_tbb) + m_transformed_bounding_box = transformed_bounding_box(m_plane_center, m_rotation_m); + + m_angle = theta; + while (m_angle > two_pi) + m_angle -= two_pi; + if (m_angle < 0.0) + m_angle += two_pi; + + update_clipper(); +} + +void GLGizmoCut3D::dragging_connector(const GLGizmoBase::UpdateData &data) +{ + CutConnectors& connectors = m_c->selection_info()->model_object()->cut_connectors; + Vec3d pos; + Vec3d pos_world; + + if (unproject_on_cut_plane(data.mouse_pos.cast(), pos, pos_world)) { + connectors[m_hover_id - m_connectors_group_id].pos = pos; + update_raycasters_for_picking_transform(); + } +} + +void GLGizmoCut3D::on_dragging(const UpdateData& data) +{ + if (m_hover_id < 0) + return; + if (m_hover_id == Z || m_hover_id == CutPlane) + dragging_grabber_z(data); + else if (m_hover_id == X || m_hover_id == Y) + dragging_grabber_xy(data); + else if (m_hover_id >= m_connectors_group_id && m_connector_mode == CutConnectorMode::Manual) + dragging_connector(data); +} + +void GLGizmoCut3D::on_start_dragging() +{ + m_angle = 0.0; + if (m_hover_id >= m_connectors_group_id && m_connector_mode == CutConnectorMode::Manual) + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Move connector"), UndoRedo::SnapshotType::GizmoAction); + + if (m_hover_id == X || m_hover_id == Y) + m_start_dragging_m = m_rotation_m; +} + +void GLGizmoCut3D::on_stop_dragging() +{ + if (m_hover_id == X || m_hover_id == Y) { + m_angle_arc.reset(); + m_angle = 0.0; + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Rotate cut plane"), UndoRedo::SnapshotType::GizmoAction); + m_start_dragging_m = m_rotation_m; + } + else if (m_hover_id == Z || m_hover_id == CutPlane) { + if (m_was_cut_plane_dragged) + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Move cut plane"), UndoRedo::SnapshotType::GizmoAction); + m_ar_plane_center = m_plane_center; + } +} + +void GLGizmoCut3D::set_center_pos(const Vec3d& center_pos, bool update_tbb /*=false*/) +{ + BoundingBoxf3 tbb = m_transformed_bounding_box; + if (update_tbb) { + Vec3d normal = m_rotation_m.inverse() * Vec3d(m_plane_center - center_pos); + tbb.translate(normal.z() * Vec3d::UnitZ()); + } + + bool can_set_center_pos = false; + { + if (tbb.max.z() > -.5 && tbb.min.z() < .5) + can_set_center_pos = true; + else { + const double old_dist = (m_bb_center - m_plane_center).norm(); + const double new_dist = (m_bb_center - center_pos).norm(); + // check if forcing is reasonable + if (new_dist < old_dist) + can_set_center_pos = true; + } + } + + if (can_set_center_pos) { + m_transformed_bounding_box = tbb; + m_plane_center = center_pos; + m_center_offset = m_plane_center - m_bb_center; + } +} + +BoundingBoxf3 GLGizmoCut3D::bounding_box() const +{ + BoundingBoxf3 ret; + const Selection& selection = m_parent.get_selection(); + const Selection::IndicesList& idxs = selection.get_volume_idxs(); + for (unsigned int i : idxs) { + const GLVolume* volume = selection.get_volume(i); + // respect just to the solid parts for FFF and ignore pad and supports for SLA + if (!volume->is_modifier && !volume->is_sla_pad() && !volume->is_sla_support()) + ret.merge(volume->transformed_convex_hull_bounding_box()); + } + return ret; +} + +BoundingBoxf3 GLGizmoCut3D::transformed_bounding_box(const Vec3d& plane_center, const Transform3d& rotation_m/* = Transform3d::Identity()*/) const +{ + const Selection& selection = m_parent.get_selection(); + + const auto first_volume = selection.get_first_volume(); + Vec3d instance_offset = first_volume->get_instance_offset(); + instance_offset[Z] += first_volume->get_sla_shift_z(); + + const auto cut_matrix = Transform3d::Identity() * rotation_m.inverse() * translation_transform(instance_offset - plane_center); + + const Selection::IndicesList& idxs = selection.get_volume_idxs(); + BoundingBoxf3 ret; + for (unsigned int i : idxs) { + const GLVolume* volume = selection.get_volume(i); + // respect just to the solid parts for FFF and ignore pad and supports for SLA + if (!volume->is_modifier && !volume->is_sla_pad() && !volume->is_sla_support()) { + + const auto instance_matrix = volume->get_instance_transformation().get_matrix_no_offset(); + auto volume_trafo = instance_matrix * volume->get_volume_transformation().get_matrix(); + ret.merge(volume->transformed_convex_hull_bounding_box(cut_matrix * volume_trafo)); + } + } + return ret; +} + +void GLGizmoCut3D::update_bb() +{ + const BoundingBoxf3 box = bounding_box(); + if (!box.defined) + return; + if (!m_max_pos.isApprox(box.max) || !m_min_pos.isApprox(box.min)) { + + m_bounding_box = box; + + invalidate_cut_plane(); + + m_max_pos = box.max; + m_min_pos = box.min; + m_bb_center = box.center(); + m_transformed_bounding_box = transformed_bounding_box(m_bb_center); + if (box.contains(m_center_offset)) + set_center_pos(m_bb_center + m_center_offset); + else + set_center_pos(m_bb_center); + + m_radius = box.radius(); + m_grabber_connection_len = 0.5 * m_radius;// std::min(0.75 * m_radius, 35.0); + m_grabber_radius = m_grabber_connection_len * 0.85; + + m_snap_coarse_in_radius = m_grabber_radius / 3.0; + m_snap_coarse_out_radius = m_snap_coarse_in_radius * 2.; + m_snap_fine_in_radius = m_grabber_connection_len * 0.85; + m_snap_fine_out_radius = m_grabber_connection_len * 1.15; + + m_plane.reset(); + m_cone.reset(); + m_sphere.reset(); + m_grabber_connection.reset(); + m_circle.reset(); + m_scale.reset(); + m_snap_radii.reset(); + m_reference_radius.reset(); + + on_unregister_raycasters_for_picking(); + + clear_selection(); + if (CommonGizmosDataObjects::SelectionInfo* selection = m_c->selection_info(); + selection && selection->model_object()) + m_selected.resize(selection->model_object()->cut_connectors.size(), false); + } +} + +void GLGizmoCut3D::init_picking_models() +{ + if (!m_cone.model.is_initialized()) { + indexed_triangle_set its = its_make_cone(1.0, 1.0, PI / 12.0); + m_cone.model.init_from(its); + m_cone.mesh_raycaster = std::make_unique(std::make_shared(std::move(its))); + } + if (!m_sphere.model.is_initialized()) { + indexed_triangle_set its = its_make_sphere(1.0, PI / 12.0); + m_sphere.model.init_from(its); + m_sphere.mesh_raycaster = std::make_unique(std::make_shared(std::move(its))); + } + + if (!m_plane.model.is_initialized() && !m_hide_cut_plane && !m_connectors_editing) { + const double cp_width = 0.02 * get_grabber_mean_size(m_bounding_box); + indexed_triangle_set its = its_make_frustum_dowel((double)m_cut_plane_radius_koef * m_radius, cp_width, m_cut_plane_as_circle ? 180 : 4); + m_plane.model.init_from(its); + m_plane.mesh_raycaster = std::make_unique(std::make_shared(std::move(its))); + } + + if (m_shapes.empty()) + init_connector_shapes(); +} + +void GLGizmoCut3D::init_rendering_items() +{ + if (!m_grabber_connection.is_initialized()) + m_grabber_connection.init_from(its_make_line(Vec3f::Zero(), Vec3f::UnitZ())); + if (!m_circle.is_initialized()) + init_from_circle(m_circle, m_grabber_radius); + if (!m_scale.is_initialized()) + init_from_scale(m_scale, m_grabber_radius); + if (!m_snap_radii.is_initialized()) + init_from_snap_radii(m_snap_radii, m_grabber_radius); + if (!m_reference_radius.is_initialized()) { + m_reference_radius.init_from(its_make_line(Vec3f::Zero(), m_grabber_connection_len * Vec3f::UnitX())); + m_reference_radius.set_color(ColorRGBA::WHITE()); + } + if (!m_angle_arc.is_initialized() || m_angle != 0.0) + init_from_angle_arc(m_angle_arc, m_angle, m_grabber_connection_len); +} + +void GLGizmoCut3D::render_clipper_cut() +{ + if (! m_connectors_editing) + ::glDisable(GL_DEPTH_TEST); + m_c->object_clipper()->render_cut(); + if (! m_connectors_editing) + ::glEnable(GL_DEPTH_TEST); +} + +void GLGizmoCut3D::on_render() +{ + if (m_state == On) { + // This gizmo is showing the object elevated. Tell the common + // SelectionInfo object to lie about the actual shift. + m_c->selection_info()->set_use_shift(true); + } + + update_clipper(); + + init_picking_models(); + + init_rendering_items(); + + render_connectors(); + + render_clipper_cut(); + + if (!m_hide_cut_plane && !m_connectors_editing) { + render_cut_plane(); + render_cut_plane_grabbers(); + } + + render_cut_line(); + + m_selection_rectangle.render(m_parent); +} + +void GLGizmoCut3D::render_debug_input_window(float x) +{ + return; + m_imgui->begin(wxString("DEBUG")); + + ImVec2 pos = ImGui::GetWindowPos(); + pos.x = x; + ImGui::SetWindowPos(pos, ImGuiCond_Always); +/* + static bool hide_clipped = false; + static bool fill_cut = false; + static float contour_width = 0.4f; + + m_imgui->checkbox(_L("Hide cut plane and grabbers"), m_hide_cut_plane); + if (m_imgui->checkbox("hide_clipped", hide_clipped) && !hide_clipped) + m_clp_normal = m_c->object_clipper()->get_clipping_plane()->get_normal(); + m_imgui->checkbox("fill_cut", fill_cut); + m_imgui->slider_float("contour_width", &contour_width, 0.f, 3.f); + if (auto oc = m_c->object_clipper()) + oc->set_behavior(hide_clipped || m_connectors_editing, fill_cut || m_connectors_editing, double(contour_width)); +*/ + ImGui::PushItemWidth(0.5f * m_label_width); + if (auto oc = m_c->object_clipper(); oc && m_imgui->slider_float("contour_width", &m_contour_width, 0.f, 3.f)) + oc->set_behavior(m_connectors_editing, m_connectors_editing, double(m_contour_width)); + + ImGui::Separator(); + + if (m_imgui->checkbox(_L("Render cut plane as circle"), m_cut_plane_as_circle)) + m_plane.reset(); + + ImGui::PushItemWidth(0.5f * m_label_width); + if (m_imgui->slider_float("cut_plane_radius_koef", &m_cut_plane_radius_koef, 1.f, 2.f)) + m_plane.reset(); + + m_imgui->end(); +} + +void GLGizmoCut3D::adjust_window_position(float x, float y, float bottom_limit) +{ + static float last_y = 0.0f; + static float last_h = 0.0f; + + const float win_h = ImGui::GetWindowHeight(); + y = std::min(y, bottom_limit - win_h); + + ImGui::SetWindowPos(ImVec2(x, y), ImGuiCond_Always); + + if (!is_approx(last_h, win_h) || !is_approx(last_y, y)) { + // ask canvas for another frame to render the window in the correct position + m_imgui->set_requires_extra_frame(); + if (!is_approx(last_h, win_h)) + last_h = win_h; + if (!is_approx(last_y, y)) + last_y = y; + } +} + +void GLGizmoCut3D::unselect_all_connectors() +{ + std::fill(m_selected.begin(), m_selected.end(), false); + m_selected_count = 0; + validate_connector_settings(); +} + +void GLGizmoCut3D::select_all_connectors() +{ + std::fill(m_selected.begin(), m_selected.end(), true); + m_selected_count = int(m_selected.size()); +} + +void GLGizmoCut3D::render_shortcuts() +{ + if (m_imgui->button("? " + (m_show_shortcuts ? wxString(ImGui::CollapseBtn) : wxString(ImGui::ExpandBtn)))) + m_show_shortcuts = !m_show_shortcuts; + + if (m_shortcut_label_width < 0.f) { + for (const auto& shortcut : m_shortcuts) { + const float width = m_imgui->calc_text_size(shortcut.first).x; + if (m_shortcut_label_width < width) + m_shortcut_label_width = width; + } + m_shortcut_label_width += +m_imgui->scaled(1.f); + } + + if (m_show_shortcuts) + for (const auto&shortcut : m_shortcuts ){ + m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, shortcut.first); + ImGui::SameLine(m_shortcut_label_width); + m_imgui->text(shortcut.second); + } +} + +void GLGizmoCut3D::apply_selected_connectors(std::function apply_fn) +{ + for (size_t idx = 0; idx < m_selected.size(); idx++) + if (m_selected[idx]) + apply_fn(idx); + + update_raycasters_for_picking_transform(); +} + +void GLGizmoCut3D::render_connectors_input_window(CutConnectors &connectors) +{ + // add shortcuts panel + render_shortcuts(); + + // Connectors section + + ImGui::Separator(); + + // WIP : Auto : Need to implement + // m_imgui->text(_L("Mode")); + // render_connect_mode_radio_button(CutConnectorMode::Auto); + // render_connect_mode_radio_button(CutConnectorMode::Manual); + + ImGui::AlignTextToFramePadding(); + m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, m_labels_map["Connectors"]); + + m_imgui->disabled_begin(connectors.empty()); + ImGui::SameLine(m_label_width); + const wxString act_name = _L("Remove connectors"); + if (render_reset_button("connectors", into_u8(act_name))) { + Plater::TakeSnapshot snapshot(wxGetApp().plater(), act_name, UndoRedo::SnapshotType::GizmoAction); + reset_connectors(); + } + m_imgui->disabled_end(); + + render_flip_plane_button(m_connectors_editing && connectors.empty()); + + m_imgui->text(m_labels_map["Type"]); + bool type_changed = render_connect_type_radio_button(CutConnectorType::Plug); + type_changed |= render_connect_type_radio_button(CutConnectorType::Dowel); + if (type_changed) + apply_selected_connectors([this, &connectors] (size_t idx) { connectors[idx].attribs.type = CutConnectorType(m_connector_type); }); + + m_imgui->disabled_begin(m_connector_type == CutConnectorType::Dowel); + if (type_changed && m_connector_type == CutConnectorType::Dowel) { + m_connector_style = size_t(CutConnectorStyle::Prism); + apply_selected_connectors([this, &connectors](size_t idx) { connectors[idx].attribs.style = CutConnectorStyle(m_connector_style); }); + } + if (render_combo(m_labels_map["Style"], m_connector_styles, m_connector_style)) + apply_selected_connectors([this, &connectors](size_t idx) { connectors[idx].attribs.style = CutConnectorStyle(m_connector_style); }); + m_imgui->disabled_end(); + + if (render_combo(m_labels_map["Shape"], m_connector_shapes, m_connector_shape_id)) + apply_selected_connectors([this, &connectors](size_t idx) { connectors[idx].attribs.shape = CutConnectorShape(m_connector_shape_id); }); + + if (render_slider_double_input(m_labels_map["Depth ratio"], m_connector_depth_ratio, m_connector_depth_ratio_tolerance)) + apply_selected_connectors([this, &connectors](size_t idx) { + if (m_connector_depth_ratio > 0) + connectors[idx].height = m_connector_depth_ratio; + if (m_connector_depth_ratio_tolerance >= 0) + connectors[idx].height_tolerance = m_connector_depth_ratio_tolerance; + }); + + if (render_slider_double_input(m_labels_map["Size"], m_connector_size, m_connector_size_tolerance)) + apply_selected_connectors([this, &connectors](size_t idx) { + if (m_connector_size > 0) + connectors[idx].radius = 0.5f * m_connector_size; + if (m_connector_size_tolerance >= 0) + connectors[idx].radius_tolerance = 0.5f * m_connector_size_tolerance; + }); + + ImGui::Separator(); + + if (m_imgui->button(_L("Confirm connectors"))) { + unselect_all_connectors(); + set_connectors_editing(false); + } + + ImGui::SameLine(m_label_width + 1.15f * m_control_width); + + if (m_imgui->button(_L("Cancel"))) { + reset_connectors(); + set_connectors_editing(false); + } +} + +void GLGizmoCut3D::render_build_size() +{ + double koef = m_imperial_units ? ObjectManipulation::mm_to_in : 1.0; + wxString unit_str = " " + (m_imperial_units ? _L("in") : _L("mm")); + + Vec3d tbb_sz = m_transformed_bounding_box.size(); + wxString size = "X: " + double_to_string(tbb_sz.x() * koef, 2) + unit_str + + ", Y: " + double_to_string(tbb_sz.y() * koef, 2) + unit_str + + ", Z: " + double_to_string(tbb_sz.z() * koef, 2) + unit_str; + + ImGui::AlignTextToFramePadding(); + m_imgui->text(_L("Build Volume")); + ImGui::SameLine(); + m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, size); +} + +void GLGizmoCut3D::reset_cut_plane() +{ + m_angle_arc.reset(); + m_transformed_bounding_box = transformed_bounding_box(m_bb_center); + set_center(m_bb_center); + m_start_dragging_m = m_rotation_m = Transform3d::Identity(); + m_ar_plane_center = m_plane_center; +} + +void GLGizmoCut3D::invalidate_cut_plane() +{ + m_rotation_m = Transform3d::Identity(); + m_plane_center = Vec3d::Zero(); + m_min_pos = Vec3d::Zero(); + m_max_pos = Vec3d::Zero(); + m_bb_center = Vec3d::Zero(); + m_center_offset = Vec3d::Zero(); +} + +void GLGizmoCut3D::set_connectors_editing(bool connectors_editing) +{ + if (m_connectors_editing == connectors_editing) + return; + + m_connectors_editing = connectors_editing; + update_raycasters_for_picking(); + + m_c->object_clipper()->set_behavior(m_connectors_editing, m_connectors_editing, double(m_contour_width)); + + m_parent.request_extra_frame(); +} + +void GLGizmoCut3D::flip_cut_plane() +{ + m_rotation_m = m_rotation_m * rotation_transform(PI * Vec3d::UnitX()); + m_transformed_bounding_box = transformed_bounding_box(m_plane_center, m_rotation_m); + + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Flip cut plane"), UndoRedo::SnapshotType::GizmoAction); + m_start_dragging_m = m_rotation_m; + + update_clipper(); +} + +void GLGizmoCut3D::render_flip_plane_button(bool disable_pred /*=false*/) +{ + ImGui::SameLine(); + + if (m_hover_id == CutPlane) + ImGui::PushStyleColor(ImGuiCol_Button, ImGui::GetColorU32(ImGuiCol_ButtonHovered)); + + m_imgui->disabled_begin(disable_pred); + if (m_imgui->button(_L("Flip cut plane"))) + flip_cut_plane(); + m_imgui->disabled_end(); + + if (m_hover_id == CutPlane) + ImGui::PopStyleColor(); +} + +void GLGizmoCut3D::add_vertical_scaled_interval(float interval) +{ + ImGui::GetCurrentWindow()->DC.CursorPos.y += m_imgui->scaled(interval); +} + +void GLGizmoCut3D::add_horizontal_scaled_interval(float interval) +{ + ImGui::GetCurrentWindow()->DC.CursorPos.x += m_imgui->scaled(interval); +} + +void GLGizmoCut3D::add_horizontal_shift(float shift) +{ + ImGui::GetCurrentWindow()->DC.CursorPos.x += shift; +} + +void GLGizmoCut3D::render_color_marker(float size, const ImU32& color) +{ + ImGui::SameLine(); + const float radius = 0.5f * size; + ImVec2 pos = ImGui::GetCurrentWindow()->DC.CursorPos; + pos.x += size; + pos.y += 1.25f * radius; + ImGui::GetCurrentWindow()->DrawList->AddNgonFilled(pos, radius, color, 6); + ImGuiWrapper::text(" "); +} + +void GLGizmoCut3D::render_cut_plane_input_window(CutConnectors &connectors) +{ + // WIP : cut plane mode + // render_combo(_u8L("Mode"), m_modes, m_mode); + + if (m_mode == size_t(CutMode::cutPlanar)) { + ImGui::AlignTextToFramePadding(); + ImGuiWrapper::text(wxString(ImGui::InfoMarkerSmall)); + ImGui::SameLine(); + ImGuiWrapper::text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, + get_wraped_wxString(_L("Hold SHIFT key to draw a cut line"), 40)); + ImGui::Separator(); + + render_build_size(); + + ImGui::AlignTextToFramePadding(); + ImGuiWrapper::text(_L("Cut position") + ": "); + ImGui::SameLine(); + render_move_center_input(Z); + ImGui::SameLine(); + + const bool has_connectors = !connectors.empty(); + + const bool is_cut_plane_init = m_rotation_m.isApprox(Transform3d::Identity()) && m_bb_center.isApprox(m_plane_center); + m_imgui->disabled_begin(is_cut_plane_init); + wxString act_name = _L("Reset cutting plane"); + if (render_reset_button("cut_plane", into_u8(act_name))) { + Plater::TakeSnapshot snapshot(wxGetApp().plater(), act_name, UndoRedo::SnapshotType::GizmoAction); + reset_cut_plane(); + } + m_imgui->disabled_end(); + +// render_flip_plane_button(); + + add_vertical_scaled_interval(0.75f); + + m_imgui->disabled_begin(!m_keep_upper || !m_keep_lower || m_keep_as_parts); + if (m_imgui->button(has_connectors ? _L("Edit connectors") : _L("Add connectors"))) + set_connectors_editing(true); + m_imgui->disabled_end(); + + ImGui::SameLine(1.5f * m_control_width); + + m_imgui->disabled_begin(is_cut_plane_init && !has_connectors); + act_name = _L("Reset cut"); + if (m_imgui->button(act_name, _L("Reset cutting plane and remove connectors"))) { + Plater::TakeSnapshot snapshot(wxGetApp().plater(), act_name, UndoRedo::SnapshotType::GizmoAction); + reset_cut_plane(); + reset_connectors(); + } + m_imgui->disabled_end(); + + ImGui::Separator(); + + // render "After Cut" section + + ImVec2 label_size; + for (const auto& item : m_part_orientation_names) { + const ImVec2 text_size = ImGuiWrapper::calc_text_size(item.second); + if (label_size.x < text_size.x) + label_size.x = text_size.x; + if (label_size.y < text_size.y) + label_size.y = text_size.y; + } + const float h_shift = label_size.x + m_imgui->scaled(3.f); + const float marker_size = label_size.y; + + auto render_part_name = [this, marker_size, has_connectors](const wxString& name, bool& keep_part, const ImU32& color) { + bool keep = true; + add_horizontal_shift(m_imgui->scaled(1.2f)); + m_imgui->checkbox((m_keep_as_parts ? _L("Part") : _L("Object")) + " " + name, has_connectors ? keep : keep_part); + render_color_marker(marker_size, color); + }; + + auto render_part_actions = [this, h_shift] (const wxString& suffix, const bool& keep_part, bool& place_on_cut_part, bool& rotate_part) + { + float shift = m_imgui->scaled(1.2f); + if (suffix == "##lower") + shift += h_shift; + m_imgui->disabled_begin(!keep_part || m_keep_as_parts); + add_horizontal_shift(shift); + if (m_imgui->radio_button(m_part_orientation_names.at("none") + suffix, !place_on_cut_part && !rotate_part)) { + rotate_part = false; + place_on_cut_part = false; + } + + add_horizontal_shift(shift); + if (m_imgui->radio_button(m_part_orientation_names.at("on_cut") + suffix, place_on_cut_part)) { + place_on_cut_part = !place_on_cut_part; + rotate_part = false; + } + + add_horizontal_shift(shift); + if (m_imgui->radio_button(m_part_orientation_names.at("flip") + suffix, rotate_part)) { + rotate_part = !rotate_part; + place_on_cut_part = false; + } + m_imgui->disabled_end(); + }; + + ImGuiWrapper::text(_L("After cut") + ": "); + add_vertical_scaled_interval(0.5f); + + m_imgui->disabled_begin(has_connectors || m_keep_as_parts); + render_part_name("A", m_keep_upper, m_imgui->to_ImU32(UPPER_PART_COLOR)); + ImGui::SameLine(h_shift + ImGui::GetCurrentWindow()->WindowPadding.x); + render_part_name("B", m_keep_lower, m_imgui->to_ImU32(LOWER_PART_COLOR)); + m_imgui->disabled_end(); + + add_vertical_scaled_interval(0.5f); + + const ImVec2 pos = ImGui::GetCurrentWindow()->DC.CursorPos; + render_part_actions("##upper", m_keep_upper, m_place_on_cut_upper, m_rotate_upper); + + ImGui::GetCurrentWindow()->DC.CursorPos = pos; + render_part_actions("##lower", m_keep_lower, m_place_on_cut_lower, m_rotate_lower); + + add_vertical_scaled_interval(0.75f); + + m_imgui->disabled_begin(has_connectors); + ImGuiWrapper::text(_L("Cut to") + ":"); + + add_horizontal_scaled_interval(1.2f); + // TRN CutGizmo: RadioButton Cut to ... + if (m_imgui->radio_button(_L("Objects"), !m_keep_as_parts)) + m_keep_as_parts = false; + ImGui::SameLine(); + // TRN CutGizmo: RadioButton Cut to ... + if (m_imgui->radio_button(_L("Parts"), m_keep_as_parts)) + m_keep_as_parts = true; + + if (m_keep_as_parts) { + m_keep_upper = m_keep_lower = true; + m_place_on_cut_upper = m_place_on_cut_lower = false; + m_rotate_upper = m_rotate_lower = false; + } + m_imgui->disabled_end(); + } + + ImGui::Separator(); + + m_imgui->disabled_begin(!m_is_contour_changed && !can_perform_cut()); + if(m_imgui->button(_L("Perform cut"))) + perform_cut(m_parent.get_selection()); + m_imgui->disabled_end(); +} + +void GLGizmoCut3D::validate_connector_settings() +{ + if (m_connector_depth_ratio < 0.f) + m_connector_depth_ratio = 3.f; + if (m_connector_depth_ratio_tolerance < 0.f) + m_connector_depth_ratio_tolerance = 0.1f; + if (m_connector_size < 0.f) + m_connector_size = 2.5f; + if (m_connector_size_tolerance < 0.f) + m_connector_size_tolerance = 0.f; + + if (m_connector_type == CutConnectorType::Undef) + m_connector_type = CutConnectorType::Plug; + if (m_connector_style == size_t(CutConnectorStyle::Undef)) + m_connector_style = size_t(CutConnectorStyle::Prism); + if (m_connector_shape_id == size_t(CutConnectorShape::Undef)) + m_connector_shape_id = size_t(CutConnectorShape::Circle); +} + +void GLGizmoCut3D::init_input_window_data(CutConnectors &connectors) +{ + m_imperial_units = wxGetApp().app_config->get_bool("use_inches"); + m_control_width = m_imgui->get_font_size() * 9.f; + + if (m_connectors_editing && m_selected_count > 0) { + float depth_ratio { UndefFloat }; + float depth_ratio_tolerance { UndefFloat }; + float radius { UndefFloat }; + float radius_tolerance { UndefFloat }; + CutConnectorType type { CutConnectorType::Undef }; + CutConnectorStyle style { CutConnectorStyle::Undef }; + CutConnectorShape shape { CutConnectorShape::Undef }; + + bool is_init = false; + for (size_t idx = 0; idx < m_selected.size(); idx++) + if (m_selected[idx]) { + const CutConnector& connector = connectors[idx]; + if (!is_init) { + depth_ratio = connector.height; + depth_ratio_tolerance = connector.height_tolerance; + radius = connector.radius; + radius_tolerance = connector.radius_tolerance; + type = connector.attribs.type; + style = connector.attribs.style; + shape = connector.attribs.shape; + + if (m_selected_count == 1) + break; + is_init = true; + } + else { + if (!is_approx(depth_ratio, connector.height)) + depth_ratio = UndefFloat; + if (!is_approx(depth_ratio_tolerance, connector.height_tolerance)) + depth_ratio_tolerance = UndefFloat; + if (!is_approx(radius,connector.radius)) + radius = UndefFloat; + if (!is_approx(radius_tolerance, connector.radius_tolerance)) + radius_tolerance = UndefFloat; + + if (type != connector.attribs.type) + type = CutConnectorType::Undef; + if (style != connector.attribs.style) + style = CutConnectorStyle::Undef; + if (shape != connector.attribs.shape) + shape = CutConnectorShape::Undef; + } + } + + m_connector_depth_ratio = depth_ratio; + m_connector_depth_ratio_tolerance = depth_ratio_tolerance; + m_connector_size = 2.f * radius; + m_connector_size_tolerance = 2.f * radius_tolerance; + m_connector_type = type; + m_connector_style = size_t(style); + m_connector_shape_id = size_t(shape); + } + + if (m_label_width == 0.f) { + for (const auto& item : m_labels_map) { + const float width = ImGuiWrapper::calc_text_size(item.second).x; + if (m_label_width < width) + m_label_width = width; + } + m_label_width += m_imgui->scaled(1.f); + } +} + +void GLGizmoCut3D::render_input_window_warning() const +{ + if (m_is_contour_changed) + return; + if (m_has_invalid_connector) { + wxString out = wxString(ImGui::WarningMarkerSmall) + _L("Invalid connectors detected") + ":"; + if (m_info_stats.outside_cut_contour > size_t(0)) + out += "\n - " + format_wxstr(_L_PLURAL("%1$d connector is out of cut contour", "%1$d connectors are out of cut contour", m_info_stats.outside_cut_contour), + m_info_stats.outside_cut_contour); + if (m_info_stats.outside_bb > size_t(0)) + out += "\n - " + format_wxstr(_L_PLURAL("%1$d connector is out of object", "%1$d connectors are out of object", m_info_stats.outside_bb), + m_info_stats.outside_bb); + if (m_info_stats.is_overlap) + out += "\n - " + _L("Some connectors are overlapped"); + m_imgui->text(out); + } + if (!m_keep_upper && !m_keep_lower) + m_imgui->text(wxString(ImGui::WarningMarkerSmall) + _L("Invalid state. \nNo one part is selected for keep after cut")); + if (!has_valid_contour()) + m_imgui->text(wxString(ImGui::WarningMarkerSmall) + _L("Warning state. \nCut plane is placed out of object")); +} + +void GLGizmoCut3D::on_render_input_window(float x, float y, float bottom_limit) +{ + m_imgui->begin(get_name(), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); + + // adjust window position to avoid overlap the view toolbar + adjust_window_position(x, y, bottom_limit); + + CutConnectors& connectors = m_c->selection_info()->model_object()->cut_connectors; + + init_input_window_data(connectors); + + if (m_connectors_editing) // connectors mode + render_connectors_input_window(connectors); + else + render_cut_plane_input_window(connectors); + + render_input_window_warning(); + + m_imgui->end(); + + if (!m_connectors_editing) // connectors mode + render_debug_input_window(x); +} + +bool GLGizmoCut3D::is_outside_of_cut_contour(size_t idx, const CutConnectors& connectors, const Vec3d cur_pos) +{ + // check if connector pos is out of clipping plane + if (m_c->object_clipper() && !m_c->object_clipper()->is_projection_inside_cut(cur_pos)) { + m_info_stats.outside_cut_contour++; + return true; + } + + // check if connector bottom contour is out of clipping plane + const CutConnector& cur_connector = connectors[idx]; + const CutConnectorShape shape = CutConnectorShape(cur_connector.attribs.shape); + const int sectorCount = shape == CutConnectorShape::Triangle ? 3 : + shape == CutConnectorShape::Square ? 4 : + shape == CutConnectorShape::Circle ? 60: // supposably, 60 points are enough for conflict detection + shape == CutConnectorShape::Hexagon ? 6 : 1 ; + + indexed_triangle_set mesh; + auto& vertices = mesh.vertices; + vertices.reserve(sectorCount + 1); + + float fa = 2 * PI / sectorCount; + auto vec = Eigen::Vector2f(0, cur_connector.radius); + for (float angle = 0; angle < 2.f * PI; angle += fa) { + Vec2f p = Eigen::Rotation2Df(angle) * vec; + vertices.emplace_back(Vec3f(p(0), p(1), 0.f)); + } + its_transform(mesh, translation_transform(cur_pos) * m_rotation_m); + + for (auto vertex : vertices) { + if (m_c->object_clipper() && !m_c->object_clipper()->is_projection_inside_cut(vertex.cast())) { + m_info_stats.outside_cut_contour++; + return true; + } + } + + return false; +} + +bool GLGizmoCut3D::is_conflict_for_connector(size_t idx, const CutConnectors& connectors, const Vec3d cur_pos) +{ + if (is_outside_of_cut_contour(idx, connectors, cur_pos)) + return true; + + const CutConnector& cur_connector = connectors[idx]; + + const Transform3d matrix = translation_transform(cur_pos) * m_rotation_m * + scale_transform(Vec3f(cur_connector.radius, cur_connector.radius, cur_connector.height).cast()); + const BoundingBoxf3 cur_tbb = m_shapes[cur_connector.attribs].model.get_bounding_box().transformed(matrix); + + // check if connector's bounding box is inside the object's bounding box + if (!m_bounding_box.contains(cur_tbb)) { + m_info_stats.outside_bb++; + return true; + } + + // check if connectors are overlapping + for (size_t i = 0; i < connectors.size(); ++i) { + if (i == idx) + continue; + const CutConnector& connector = connectors[i]; + + if ((connector.pos - cur_connector.pos).norm() < double(connector.radius + cur_connector.radius)) { + m_info_stats.is_overlap = true; + return true; + } + } + + return false; +} + +void GLGizmoCut3D::render_connectors() +{ + ::glEnable(GL_DEPTH_TEST); + + if (m_is_contour_changed || cut_line_processing() || + m_connector_mode == CutConnectorMode::Auto || !m_c->selection_info()) + return; + + const ModelObject* mo = m_c->selection_info()->model_object(); + auto inst_id = m_c->selection_info()->get_active_instance(); + if (inst_id < 0) + return; + const CutConnectors& connectors = mo->cut_connectors; + if (connectors.size() != m_selected.size()) { + // #ysFIXME + clear_selection(); + m_selected.resize(connectors.size(), false); + } + + ColorRGBA render_color = CONNECTOR_DEF_COLOR; + + const ModelInstance* mi = mo->instances[inst_id]; + const Vec3d& instance_offset = mi->get_offset(); + const double sla_shift = double(m_c->selection_info()->get_sla_shift()); + + m_has_invalid_connector = false; + m_info_stats.invalidate(); + + const bool looking_forward = is_looking_forward(); + + for (size_t i = 0; i < connectors.size(); ++i) { + const CutConnector& connector = connectors[i]; + + float height = connector.height; + // recalculate connector position to world position + Vec3d pos = connector.pos + instance_offset + sla_shift * Vec3d::UnitZ(); + + // First decide about the color of the point. + const bool conflict_connector = is_conflict_for_connector(i, connectors, pos); + if (conflict_connector) { + m_has_invalid_connector = true; + render_color = CONNECTOR_ERR_COLOR; + } + else // default connector color + render_color = connector.attribs.type == CutConnectorType::Dowel ? DOWEL_COLOR : PLAG_COLOR; + + if (!m_connectors_editing) + render_color = CONNECTOR_ERR_COLOR; + else if (size_t(m_hover_id - m_connectors_group_id) == i) + render_color = conflict_connector ? HOVERED_ERR_COLOR : + connector.attribs.type == CutConnectorType::Dowel ? HOVERED_DOWEL_COLOR : HOVERED_PLAG_COLOR; + else if (m_selected[i]) + render_color = connector.attribs.type == CutConnectorType::Dowel ? SELECTED_DOWEL_COLOR : SELECTED_PLAG_COLOR; + + const Camera& camera = wxGetApp().plater()->get_camera(); + if (connector.attribs.type == CutConnectorType::Dowel && + connector.attribs.style == CutConnectorStyle::Prism) { + if (m_connectors_editing) { + height = 0.05f; + if (!looking_forward) + pos += 0.05 * m_clp_normal; + } + else { + if (looking_forward) + pos -= static_cast(height) * m_clp_normal; + else + pos += static_cast(height) * m_clp_normal; + height *= 2; + } + } + else if (!looking_forward) + pos += 0.05 * m_clp_normal; + + const Transform3d view_model_matrix = camera.get_view_matrix() * translation_transform(pos) * m_rotation_m * + scale_transform(Vec3f(connector.radius, connector.radius, height).cast()); + + render_model(m_shapes[connector.attribs].model, render_color, view_model_matrix); + } +} + +bool GLGizmoCut3D::can_perform_cut() const +{ + if (m_has_invalid_connector || (!m_keep_upper && !m_keep_lower) || m_connectors_editing) + return false; + + return true;// has_valid_contour(); +} + +bool GLGizmoCut3D::has_valid_contour() const +{ + const auto clipper = m_c->object_clipper(); + return clipper && clipper->has_valid_contour(); +} + +void GLGizmoCut3D::apply_connectors_in_model(ModelObject* mo, bool &create_dowels_as_separate_object) +{ + if (m_connector_mode == CutConnectorMode::Manual) { + clear_selection(); + + for (CutConnector&connector : mo->cut_connectors) { + connector.rotation_m = m_rotation_m; + + if (connector.attribs.type == CutConnectorType::Dowel) { + if (connector.attribs.style == CutConnectorStyle::Prism) + connector.height *= 2; + create_dowels_as_separate_object = true; + } + else { + // calculate shift of the connector center regarding to the position on the cut plane + connector.pos += m_cut_normal * 0.5 * double(connector.height); + } + } + mo->apply_cut_connectors(_u8L("Connector")); + } +} + +void GLGizmoCut3D::perform_cut(const Selection& selection) +{ + if (!can_perform_cut()) + return; + const int instance_idx = selection.get_instance_idx(); + const int object_idx = selection.get_object_idx(); + + wxCHECK_RET(instance_idx >= 0 && object_idx >= 0, "GLGizmoCut: Invalid object selection"); + + Plater* plater = wxGetApp().plater(); + ModelObject* mo = plater->model().objects[object_idx]; + if (!mo) + return; + + // deactivate CutGizmo and than perform a cut + m_parent.reset_all_gizmos(); + + // m_cut_z is the distance from the bed. Subtract possible SLA elevation. + const double sla_shift_z = selection.get_first_volume()->get_sla_shift_z(); + + const Vec3d instance_offset = mo->instances[instance_idx]->get_offset(); + Vec3d cut_center_offset = m_plane_center - instance_offset; + cut_center_offset[Z] -= sla_shift_z; + + // perform cut + { + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Cut by Plane")); + + bool create_dowels_as_separate_object = false; + const bool has_connectors = !mo->cut_connectors.empty(); + // update connectors pos as offset of its center before cut performing + apply_connectors_in_model(mo, create_dowels_as_separate_object); + + plater->cut(object_idx, instance_idx, translation_transform(cut_center_offset) * m_rotation_m, + only_if(has_connectors ? true : m_keep_upper, ModelObjectCutAttribute::KeepUpper) | + only_if(has_connectors ? true : m_keep_lower, ModelObjectCutAttribute::KeepLower) | + only_if(has_connectors ? false: m_keep_as_parts, ModelObjectCutAttribute::KeepAsParts) | + only_if(m_place_on_cut_upper, ModelObjectCutAttribute::PlaceOnCutUpper) | + only_if(m_place_on_cut_lower, ModelObjectCutAttribute::PlaceOnCutLower) | + only_if(m_rotate_upper, ModelObjectCutAttribute::FlipUpper) | + only_if(m_rotate_lower, ModelObjectCutAttribute::FlipLower) | + only_if(create_dowels_as_separate_object, ModelObjectCutAttribute::CreateDowels) | + only_if(!has_connectors, ModelObjectCutAttribute::InvalidateCutInfo)); + } +} + + + +// Unprojects the mouse position on the mesh and saves hit point and normal of the facet into pos_and_normal +// Return false if no intersection was found, true otherwise. +bool GLGizmoCut3D::unproject_on_cut_plane(const Vec2d& mouse_position, Vec3d& pos, Vec3d& pos_world) +{ + const float sla_shift = m_c->selection_info()->get_sla_shift(); + + const ModelObject* mo = m_c->selection_info()->model_object(); + const ModelInstance* mi = mo->instances[m_c->selection_info()->get_active_instance()]; + const Camera& camera = wxGetApp().plater()->get_camera(); + + // Calculate intersection with the clipping plane. + const ClippingPlane* cp = m_c->object_clipper()->get_clipping_plane(true); + Vec3d point; + Vec3d direction; + Vec3d hit; + MeshRaycaster::line_from_mouse_pos(mouse_position, Transform3d::Identity(), camera, point, direction); + Vec3d normal = -cp->get_normal().cast(); + double den = normal.dot(direction); + if (den != 0.) { + double t = (-cp->get_offset() - normal.dot(point))/den; + hit = (point + t * direction); + } else + return false; + + if (! m_c->object_clipper()->is_projection_inside_cut(hit)) + return false; + + // recalculate hit to object's local position + Vec3d hit_d = hit; + hit_d -= mi->get_offset(); + hit_d[Z] -= sla_shift; + + // Return both the point and the facet normal. + pos = hit_d; + pos_world = hit; + + return true; +} + +void GLGizmoCut3D::clear_selection() +{ + m_selected.clear(); + m_selected_count = 0; +} + +void GLGizmoCut3D::reset_connectors() +{ + m_c->selection_info()->model_object()->cut_connectors.clear(); + update_raycasters_for_picking(); + clear_selection(); +} + +void GLGizmoCut3D::init_connector_shapes() +{ + for (const CutConnectorType& type : {CutConnectorType::Dowel, CutConnectorType::Plug}) + for (const CutConnectorStyle& style : {CutConnectorStyle::Frustum, CutConnectorStyle::Prism}) { + if (type == CutConnectorType::Dowel && style == CutConnectorStyle::Frustum) + continue; + for (const CutConnectorShape& shape : {CutConnectorShape::Circle, CutConnectorShape::Hexagon, CutConnectorShape::Square, CutConnectorShape::Triangle}) { + const CutConnectorAttributes attribs = { type, style, shape }; + const indexed_triangle_set its = ModelObject::get_connector_mesh(attribs); + m_shapes[attribs].model.init_from(its); + m_shapes[attribs].mesh_raycaster = std::make_unique(std::make_shared(std::move(its))); + } + } +} + +void GLGizmoCut3D::update_connector_shape() +{ + CutConnectorAttributes attribs = { m_connector_type, CutConnectorStyle(m_connector_style), CutConnectorShape(m_connector_shape_id) }; + + const indexed_triangle_set its = ModelObject::get_connector_mesh(attribs); + m_connector_mesh.clear(); + m_connector_mesh = TriangleMesh(its); +} + +bool GLGizmoCut3D::cut_line_processing() const +{ + return !m_line_beg.isApprox(Vec3d::Zero()); +} + +void GLGizmoCut3D::discard_cut_line_processing() +{ + m_line_beg = m_line_end = Vec3d::Zero(); +} + +bool GLGizmoCut3D::process_cut_line(SLAGizmoEventType action, const Vec2d& mouse_position) +{ + const Camera& camera = wxGetApp().plater()->get_camera(); + + Vec3d pt; + Vec3d dir; + MeshRaycaster::line_from_mouse_pos(mouse_position, Transform3d::Identity(), camera, pt, dir); + dir.normalize(); + pt += dir; // Move the pt along dir so it is not clipped. + + if (action == SLAGizmoEventType::LeftDown && !cut_line_processing()) { + m_line_beg = pt; + m_line_end = pt; + on_unregister_raycasters_for_picking(); + return true; + } + + if (cut_line_processing()) { + m_line_end = pt; + if (action == SLAGizmoEventType::LeftDown || action == SLAGizmoEventType::LeftUp) { + Vec3d line_dir = m_line_end - m_line_beg; + if (line_dir.norm() < 3.0) + return true; + + Vec3d cross_dir = line_dir.cross(dir).normalized(); + Eigen::Quaterniond q; + Transform3d m = Transform3d::Identity(); + m.matrix().block(0, 0, 3, 3) = q.setFromTwoVectors(Vec3d::UnitZ(), cross_dir).toRotationMatrix(); + + const Vec3d new_plane_center = m_bb_center + cross_dir * cross_dir.dot(pt - m_bb_center); + // update transformed bb + const auto new_tbb = transformed_bounding_box(new_plane_center, m); + const GLVolume* first_volume = m_parent.get_selection().get_first_volume(); + Vec3d instance_offset = first_volume->get_instance_offset(); + instance_offset[Z] += first_volume->get_sla_shift_z(); + + const Vec3d trans_center_pos = m.inverse() * (new_plane_center - instance_offset) + new_tbb.center(); + if (new_tbb.contains(trans_center_pos)) { + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Cut by line"), UndoRedo::SnapshotType::GizmoAction); + m_transformed_bounding_box = new_tbb; + set_center(new_plane_center); + m_start_dragging_m = m_rotation_m = m; + m_ar_plane_center = m_plane_center; + } + + m_angle_arc.reset(); + discard_cut_line_processing(); + } + else if (action == SLAGizmoEventType::Moving) + this->set_dirty(); + return true; + } + return false; +} + +bool GLGizmoCut3D::add_connector(CutConnectors& connectors, const Vec2d& mouse_position) +{ + if (!m_connectors_editing) + return false; + + Vec3d pos; + Vec3d pos_world; + if (unproject_on_cut_plane(mouse_position.cast(), pos, pos_world)) { + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Add connector"), UndoRedo::SnapshotType::GizmoAction); + unselect_all_connectors(); + + connectors.emplace_back(pos, m_rotation_m, + m_connector_size * 0.5f, m_connector_depth_ratio, + m_connector_size_tolerance * 0.5f, m_connector_depth_ratio_tolerance, + CutConnectorAttributes( CutConnectorType(m_connector_type), + CutConnectorStyle(m_connector_style), + CutConnectorShape(m_connector_shape_id))); + m_selected.push_back(true); + m_selected_count = 1; + assert(m_selected.size() == connectors.size()); + update_raycasters_for_picking(); + m_parent.set_as_dirty(); + + return true; + } + return false; +} + +bool GLGizmoCut3D::delete_selected_connectors(CutConnectors& connectors) +{ + if (connectors.empty()) + return false; + + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Delete connector"), UndoRedo::SnapshotType::GizmoAction); + + // remove connectors + for (int i = int(connectors.size()) - 1; i >= 0; i--) + if (m_selected[i]) + connectors.erase(connectors.begin() + i); + // remove selections + m_selected.erase(std::remove_if(m_selected.begin(), m_selected.end(), [](const auto& selected) { + return selected; }), m_selected.end()); + m_selected_count = 0; + + assert(m_selected.size() == connectors.size()); + update_raycasters_for_picking(); + m_parent.set_as_dirty(); + return true; +} + +void GLGizmoCut3D::select_connector(int idx, bool select) +{ + m_selected[idx] = select; + if (select) + ++m_selected_count; + else + --m_selected_count; +} + +bool GLGizmoCut3D::is_selection_changed(bool alt_down, bool shift_down) +{ + if (m_hover_id >= m_connectors_group_id) { + if (alt_down) + select_connector(m_hover_id - m_connectors_group_id, false); + else { + if (!shift_down) + unselect_all_connectors(); + select_connector(m_hover_id - m_connectors_group_id, true); + } + return true; + } + return false; +} + +void GLGizmoCut3D::process_selection_rectangle(CutConnectors &connectors) +{ + GLSelectionRectangle::EState rectangle_status = m_selection_rectangle.get_state(); + + ModelObject* mo = m_c->selection_info()->model_object(); + int active_inst = m_c->selection_info()->get_active_instance(); + + // First collect positions of all the points in world coordinates. + Transformation trafo = mo->instances[active_inst]->get_transformation(); + trafo.set_offset(trafo.get_offset() + double(m_c->selection_info()->get_sla_shift()) * Vec3d::UnitZ()); + + std::vector points; + for (const CutConnector&connector : connectors) + points.push_back(connector.pos + trafo.get_offset()); + + // Now ask the rectangle which of the points are inside. + std::vector points_idxs = m_selection_rectangle.contains(points); + m_selection_rectangle.stop_dragging(); + + for (size_t idx : points_idxs) + select_connector(int(idx), rectangle_status == GLSelectionRectangle::EState::Select); +} + +bool GLGizmoCut3D::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down) +{ + if (is_dragging() || m_connector_mode == CutConnectorMode::Auto) + return false; + + if ( (m_hover_id < 0 || m_hover_id == CutPlane) && shift_down && ! m_connectors_editing && + (action == SLAGizmoEventType::LeftDown || action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::Moving) ) + return process_cut_line(action, mouse_position); + + if (!m_keep_upper || !m_keep_lower) + return false; + + if (!m_connectors_editing) { + if (0 && action == SLAGizmoEventType::LeftDown) { + // disable / enable current contour + Vec3d pos; + Vec3d pos_world; + if (unproject_on_cut_plane(mouse_position.cast(), pos, pos_world)) { + // Following would inform the clipper about the mouse click, so it can + // toggle the respective contour as disabled. + m_c->object_clipper()->pass_mouse_click(pos_world); + return true; + } + } + return false; + } + + CutConnectors& connectors = m_c->selection_info()->model_object()->cut_connectors; + + if (action == SLAGizmoEventType::LeftDown) { + if (shift_down || alt_down) { + // left down with shift - show the selection rectangle: + if (m_hover_id == -1) + m_selection_rectangle.start_dragging(mouse_position, shift_down ? GLSelectionRectangle::EState::Select : GLSelectionRectangle::EState::Deselect); + } + else + // If there is no selection and no hovering, add new point + if (m_hover_id == -1 && !shift_down && !alt_down) + if (!add_connector(connectors, mouse_position)) + m_ldown_mouse_position = mouse_position; + return true; + } + + if (action == SLAGizmoEventType::LeftUp && !m_selection_rectangle.is_dragging()) { + if ((m_ldown_mouse_position - mouse_position).norm() < 5.) + unselect_all_connectors(); + return is_selection_changed(alt_down, shift_down); + } + + // left up with selection rectangle - select points inside the rectangle: + if ((action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::ShiftUp || action == SLAGizmoEventType::AltUp) && m_selection_rectangle.is_dragging()) { + // Is this a selection or deselection rectangle? + process_selection_rectangle(connectors); + return true; + } + + // dragging the selection rectangle: + if (action == SLAGizmoEventType::Dragging) { + if (m_selection_rectangle.is_dragging()) { + m_selection_rectangle.dragging(mouse_position); + return true; + } + return false; + } + + if (action == SLAGizmoEventType::RightDown && !shift_down) { + // If any point is in hover state, this should initiate its move - return control back to GLCanvas: + if (m_hover_id < m_connectors_group_id) + return false; + unselect_all_connectors(); + select_connector(m_hover_id - m_connectors_group_id, true); + return delete_selected_connectors(connectors); + } + + if (action == SLAGizmoEventType::Delete) + return delete_selected_connectors(connectors); + + if (action == SLAGizmoEventType::SelectAll) { + select_all_connectors(); + return true; + } + + return false; +} + +CommonGizmosDataID GLGizmoCut3D::on_get_requirements() const { + return CommonGizmosDataID( + int(CommonGizmosDataID::SelectionInfo) + | int(CommonGizmosDataID::InstancesHider) + | int(CommonGizmosDataID::ObjectClipper)); +} + +void GLGizmoCut3D::data_changed() +{ + update_bb(); + if (auto oc = m_c->object_clipper()) + oc->set_behavior(m_connectors_editing, m_connectors_editing, double(m_contour_width)); +} + + } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp index 6af0223bf70..ee804686e1f 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp @@ -2,69 +2,300 @@ #define slic3r_GLGizmoCut_hpp_ #include "GLGizmoBase.hpp" +#include "slic3r/GUI/GLSelectionRectangle.hpp" #include "slic3r/GUI/GLModel.hpp" +#include "slic3r/GUI/I18N.hpp" #include "libslic3r/TriangleMesh.hpp" -#include "libslic3r/ObjectID.hpp" +#include "libslic3r/Model.hpp" +#include "imgui/imgui.h" namespace Slic3r { + +enum class CutConnectorType : int; +class ModelVolume; +struct CutConnectorAttributes; + namespace GUI { +class Selection; -class GLGizmoCut : public GLGizmoBase +enum class SLAGizmoEventType : unsigned char; + +class GLGizmoCut3D : public GLGizmoBase { - static const double Offset; - static const double Margin; - static const std::array GrabberColor; - - double m_cut_z{ 0.0 }; - double m_max_z{ 0.0 }; - double m_start_z{ 0.0 }; - Vec3d m_drag_pos; - Vec3d m_drag_center; + enum GrabberID { + X = 0, + Y, + Z, + CutPlane, + Count, + }; + + Transform3d m_rotation_m{ Transform3d::Identity() }; + double m_snap_step{ 1.0 }; + int m_connectors_group_id; + + // archived values + Vec3d m_ar_plane_center { Vec3d::Zero() }; + Transform3d m_start_dragging_m{ Transform3d::Identity() }; + + Vec3d m_plane_center{ Vec3d::Zero() }; + // data to check position of the cut palne center on gizmo activation + Vec3d m_min_pos{ Vec3d::Zero() }; + Vec3d m_max_pos{ Vec3d::Zero() }; + Vec3d m_bb_center{ Vec3d::Zero() }; + Vec3d m_center_offset{ Vec3d::Zero() }; + + BoundingBoxf3 m_bounding_box; + BoundingBoxf3 m_transformed_bounding_box; + + // values from RotationGizmo + double m_radius{ 0.0 }; + double m_grabber_radius{ 0.0 }; + double m_grabber_connection_len{ 0.0 }; + + double m_snap_coarse_in_radius{ 0.0 }; + double m_snap_coarse_out_radius{ 0.0 }; + double m_snap_fine_in_radius{ 0.0 }; + double m_snap_fine_out_radius{ 0.0 }; + + // dragging angel in hovered axes + double m_angle{ 0.0 }; + + TriangleMesh m_connector_mesh; + // workaround for using of the clipping plane normal + Vec3d m_clp_normal{ Vec3d::Ones() }; + + Vec3d m_line_beg{ Vec3d::Zero() }; + Vec3d m_line_end{ Vec3d::Zero() }; + + Vec2d m_ldown_mouse_position{ Vec2d::Zero() }; + + GLModel m_grabber_connection; + GLModel m_cut_line; + + PickingModel m_plane; + PickingModel m_sphere; + PickingModel m_cone; + std::map m_shapes; + std::vector> m_raycasters; + + GLModel m_circle; + GLModel m_scale; + GLModel m_snap_radii; + GLModel m_reference_radius; + GLModel m_angle_arc; + + Vec3d m_old_center; + Vec3d m_cut_normal; + + struct InvalidConnectorsStatistics + { + unsigned int outside_cut_contour; + unsigned int outside_bb; + bool is_overlap; + + void invalidate() { + outside_cut_contour = 0; + outside_bb = 0; + is_overlap = false; + } + } m_info_stats; + bool m_keep_upper{ true }; bool m_keep_lower{ true }; + bool m_keep_as_parts{ false }; + bool m_place_on_cut_upper{ true }; + bool m_place_on_cut_lower{ false }; + bool m_rotate_upper{ false }; bool m_rotate_lower{ false }; - struct CutContours - { - TriangleMesh mesh; - GLModel contours; - double cut_z{ 0.0 }; - Vec3d position{ Vec3d::Zero() }; - Vec3d shift{ Vec3d::Zero() }; - ObjectID object_id; - int instance_idx{ -1 }; - std::vector volumes_idxs; - std::vector volumes_trafos; + bool m_hide_cut_plane{ false }; + bool m_connectors_editing{ false }; + bool m_cut_plane_as_circle{ false }; + + float m_connector_depth_ratio{ 3.f }; + float m_connector_size{ 2.5f }; + + float m_connector_depth_ratio_tolerance{ 0.1f }; + float m_connector_size_tolerance{ 0.f }; + + float m_label_width{ 0.f }; + float m_control_width{ 200.f }; + bool m_imperial_units{ false }; + + float m_contour_width{ 0.4f }; + float m_cut_plane_radius_koef{ 1.5f }; + bool m_is_contour_changed{ false }; + float m_shortcut_label_width{ -1.f }; + + mutable std::vector m_selected; // which pins are currently selected + int m_selected_count{ 0 }; + + GLSelectionRectangle m_selection_rectangle; + + bool m_has_invalid_connector{ false }; + bool m_was_cut_plane_dragged { false }; + + bool m_show_shortcuts{ false }; + std::vector> m_shortcuts; + + enum class CutMode { + cutPlanar + , cutGrig + //,cutRadial + //,cutModular }; - CutContours m_cut_contours; + enum class CutConnectorMode { + Auto + , Manual + }; -public: - GLGizmoCut(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); +// std::vector m_modes; + size_t m_mode{ size_t(CutMode::cutPlanar) }; + + std::vector m_connector_modes; + CutConnectorMode m_connector_mode{ CutConnectorMode::Manual }; + + std::vector m_connector_types; + CutConnectorType m_connector_type; + + std::vector m_connector_styles; + size_t m_connector_style; + + std::vector m_connector_shapes; + size_t m_connector_shape_id; + + std::vector m_axis_names; + + std::map m_part_orientation_names; - double get_cut_z() const { return m_cut_z; } - void set_cut_z(double cut_z); + std::map m_labels_map; + +public: + GLGizmoCut3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); std::string get_tooltip() const override; + bool unproject_on_cut_plane(const Vec2d& mouse_pos, Vec3d& pos, Vec3d& pos_world); + bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); + + bool is_in_editing_mode() const override { return m_connectors_editing; } + bool is_selection_rectangle_dragging() const override { return m_selection_rectangle.is_dragging(); } + bool is_looking_forward() const; + + /// + /// Drag of plane + /// + /// Keep information about mouse click + /// Return True when use the information otherwise False. + bool on_mouse(const wxMouseEvent &mouse_event) override; + + void shift_cut(double delta); + void rotate_vec3d_around_plane_center(Vec3d&vec); + void put_connectors_on_cut_plane(const Vec3d& cp_normal, double cp_offset); + void update_clipper(); + void invalidate_cut_plane(); + + BoundingBoxf3 bounding_box() const; + BoundingBoxf3 transformed_bounding_box(const Vec3d& plane_center, const Transform3d& rotation_m = Transform3d::Identity()) const; protected: - virtual bool on_init() override; - virtual void on_load(cereal::BinaryInputArchive& ar) override { ar(m_cut_z, m_keep_upper, m_keep_lower, m_rotate_lower); } - virtual void on_save(cereal::BinaryOutputArchive& ar) const override { ar(m_cut_z, m_keep_upper, m_keep_lower, m_rotate_lower); } - virtual std::string on_get_name() const override; - virtual void on_set_state() override; - virtual bool on_is_activable() const override; - virtual void on_start_dragging() override; - virtual void on_update(const UpdateData& data) override; - virtual void on_render() override; - virtual void on_render_for_picking() override; - virtual void on_render_input_window(float x, float y, float bottom_limit) override; + bool on_init() override; + void on_load(cereal::BinaryInputArchive&ar) override; + void on_save(cereal::BinaryOutputArchive&ar) const override; + std::string on_get_name() const override; + void on_set_state() override; + CommonGizmosDataID on_get_requirements() const override; + void on_set_hover_id() override; + bool on_is_activable() const override; + bool on_is_selectable() const override; + Vec3d mouse_position_in_local_plane(GrabberID axis, const Linef3&mouse_ray) const; + void dragging_grabber_z(const GLGizmoBase::UpdateData &data); + void dragging_grabber_xy(const GLGizmoBase::UpdateData &data); + void dragging_connector(const GLGizmoBase::UpdateData &data); + void on_dragging(const UpdateData&data) override; + void on_start_dragging() override; + void on_stop_dragging() override; + void on_render() override; + + void render_debug_input_window(float x); + void adjust_window_position(float x, float y, float bottom_limit); + void unselect_all_connectors(); + void select_all_connectors(); + void render_shortcuts(); + void apply_selected_connectors(std::function apply_fn); + void render_connectors_input_window(CutConnectors &connectors); + void render_build_size(); + void reset_cut_plane(); + void set_connectors_editing(bool connectors_editing); + void flip_cut_plane(); + void render_flip_plane_button(bool disable_pred = false); + void add_vertical_scaled_interval(float interval); + void add_horizontal_scaled_interval(float interval); + void add_horizontal_shift(float shift); + void render_color_marker(float size, const ImU32& color); + void render_cut_plane_input_window(CutConnectors &connectors); + void init_input_window_data(CutConnectors &connectors); + void render_input_window_warning() const; + bool add_connector(CutConnectors&connectors, const Vec2d&mouse_position); + bool delete_selected_connectors(CutConnectors&connectors); + void select_connector(int idx, bool select); + bool is_selection_changed(bool alt_down, bool shift_down); + void process_selection_rectangle(CutConnectors &connectors); + + virtual void on_register_raycasters_for_picking() override; + virtual void on_unregister_raycasters_for_picking() override; + void update_raycasters_for_picking(); + void set_volumes_picking_state(bool state); + void update_raycasters_for_picking_transform(); + + void on_render_input_window(float x, float y, float bottom_limit) override; + + bool wants_enter_leave_snapshots() const override { return true; } + std::string get_gizmo_entering_text() const override { return _u8L("Entering Cut gizmo"); } + std::string get_gizmo_leaving_text() const override { return _u8L("Leaving Cut gizmo"); } + std::string get_action_snapshot_name() const override { return _u8L("Cut gizmo editing"); } + + void data_changed() override; private: - void perform_cut(const Selection& selection); - double calc_projection(const Linef3& mouse_ray) const; - BoundingBoxf3 bounding_box() const; - void update_contours(); + void set_center(const Vec3d& center, bool update_tbb = false); + bool render_combo(const std::string& label, const std::vector& lines, size_t& selection_idx); + bool render_double_input(const std::string& label, double& value_in); + bool render_slider_double_input(const std::string& label, float& value_in, float& tolerance_in); + void render_move_center_input(int axis); + void render_connect_mode_radio_button(CutConnectorMode mode); + bool render_reset_button(const std::string& label_id, const std::string& tooltip) const; + bool render_connect_type_radio_button(CutConnectorType type); + bool is_outside_of_cut_contour(size_t idx, const CutConnectors& connectors, const Vec3d cur_pos); + bool is_conflict_for_connector(size_t idx, const CutConnectors& connectors, const Vec3d cur_pos); + void render_connectors(); + + bool can_perform_cut() const; + bool has_valid_contour() const; + void apply_connectors_in_model(ModelObject* mo, bool &create_dowels_as_separate_object); + bool cut_line_processing() const; + void discard_cut_line_processing(); + + void render_cut_plane(); + void render_model(GLModel& model, const ColorRGBA& color, Transform3d view_model_matrix); + void render_line(GLModel& line_model, const ColorRGBA& color, Transform3d view_model_matrix, float width); + void render_rotation_snapping(GrabberID axis, const ColorRGBA& color); + void render_grabber_connection(const ColorRGBA& color, Transform3d view_matrix); + void render_cut_plane_grabbers(); + void render_cut_line(); + void perform_cut(const Selection&selection); + void set_center_pos(const Vec3d¢er_pos, bool update_tbb = false); + void update_bb(); + void init_picking_models(); + void init_rendering_items(); + void render_clipper_cut(); + void clear_selection(); + void reset_connectors(); + void init_connector_shapes(); + void update_connector_shape(); + void validate_connector_settings(); + bool process_cut_line(SLAGizmoEventType action, const Vec2d& mouse_position); }; } // namespace GUI diff --git a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp new file mode 100644 index 00000000000..31bd299e10c --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp @@ -0,0 +1,3580 @@ +#include "GLGizmoEmboss.hpp" +#include "slic3r/GUI/GLCanvas3D.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/GUI_ObjectList.hpp" +#include "slic3r/GUI/GUI_ObjectManipulation.hpp" +#include "slic3r/GUI/MainFrame.hpp" // to update title when add text +#include "slic3r/GUI/NotificationManager.hpp" +#include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/MsgDialog.hpp" +#include "slic3r/GUI/format.hpp" +#include "slic3r/GUI/CameraUtils.hpp" +#include "slic3r/GUI/Jobs/EmbossJob.hpp" +#include "slic3r/GUI/Jobs/CreateFontNameImageJob.hpp" +#include "slic3r/GUI/Jobs/NotificationProgressIndicator.hpp" +#include "slic3r/Utils/WxFontUtils.hpp" +#include "slic3r/Utils/UndoRedo.hpp" + +// TODO: remove include +#include "libslic3r/SVG.hpp" // debug store +#include "libslic3r/Geometry.hpp" // covex hull 2d +#include "libslic3r/Timer.hpp" + +#include "libslic3r/NSVGUtils.hpp" +#include "libslic3r/Model.hpp" +#include "libslic3r/Preset.hpp" +#include "libslic3r/ClipperUtils.hpp" // union_ex +#include "libslic3r/AppConfig.hpp" // store/load font list +#include "libslic3r/Format/OBJ.hpp" // load obj file for default object +#include "libslic3r/BuildVolume.hpp" + +#include "imgui/imgui_stdlib.h" // using std::string for inputs +#include "nanosvg/nanosvg.h" // load SVG file + +#include +#include +#include +#include +#include // detection of change DPI + +#include + +#include +#include // measure enumeration of fonts + +// uncomment for easier debug +//#define ALLOW_DEBUG_MODE +#ifdef ALLOW_DEBUG_MODE +#define ALLOW_ADD_FONT_BY_FILE +#define ALLOW_ADD_FONT_BY_OS_SELECTOR +#define SHOW_WX_FONT_DESCRIPTOR // OS specific descriptor | file path --> in edit style +#define SHOW_FONT_FILE_PROPERTY // ascent, descent, line gap, cache --> in advanced +#define SHOW_CONTAIN_3MF_FIX // when contain fix matrix --> show gray '3mf' next to close button +#define SHOW_OFFSET_DURING_DRAGGING // when drag with text over surface visualize used center +#define SHOW_IMGUI_ATLAS +#define SHOW_ICONS_TEXTURE +#define SHOW_FINE_POSITION // draw convex hull around volume +#define DRAW_PLACE_TO_ADD_TEXT // Interactive draw of window position +#define ALLOW_OPEN_NEAR_VOLUME +#define EXECUTE_PROCESS_ON_MAIN_THREAD // debug execution on main thread +#endif // ALLOW_DEBUG_MODE + +//#define USE_PIXEL_SIZE_IN_WX_FONT + +using namespace Slic3r; +using namespace Slic3r::Emboss; +using namespace Slic3r::GUI; +using namespace Slic3r::GUI::Emboss; + +namespace priv { +template struct MinMax { T min; T max;}; +template struct Limit { + // Limitation for view slider range in GUI + MinMax gui; + // Real limits for setting exacts values + MinMax values; +}; + +// Variable keep limits for variables +static const struct Limits +{ + MinMax emboss{0.01f, 1e4f}; // in mm + MinMax size_in_mm{0.1f, 1000.f}; // in mm + Limit boldness{{-200.f, 200.f}, {-2e4f, 2e4f}}; // in font points + Limit skew{{-1.f, 1.f}, {-100.f, 100.f}}; // ration without unit + MinMax char_gap{-20000, 20000}; // in font points + MinMax line_gap{-20000, 20000}; // in font points + // distance text object from surface + MinMax angle{-180.f, 180.f}; // in degrees + + template + static bool apply(std::optional &val, const MinMax &limit) { + if (val.has_value()) + return apply(*val, limit); + return false; + } + template + static bool apply(T &val, const MinMax &limit) + { + if (val > limit.max) { + val = limit.max; + return true; + } + if (val < limit.min) { + val = limit.min; + return true; + } + return false; + } + +} limits; + +// Define where is up vector on model +constexpr double up_limit = 0.9; + +// Normalize radian angle from -PI to PI +template void to_range_pi_pi(T& angle) +{ + if (angle > PI || angle < -PI) { + int count = static_cast(std::round(angle / (2 * PI))); + angle -= static_cast(count * 2 * PI); + } +} +} // namespace priv +using namespace priv; + +GLGizmoEmboss::GLGizmoEmboss(GLCanvas3D &parent) + : GLGizmoBase(parent, M_ICON_FILENAME, -2) + , m_volume(nullptr) + , m_is_unknown_font(false) + , m_rotate_gizmo(parent, GLGizmoRotate::Axis::Z) // grab id = 2 (Z axis) + , m_style_manager(m_imgui->get_glyph_ranges(), create_default_styles) + , m_job_cancel(nullptr) +{ + m_rotate_gizmo.set_group_id(0); + m_rotate_gizmo.set_force_local_coordinate(true); + // TODO: add suggestion to use https://fontawesome.com/ + // (copy & paste) unicode symbols from web + // paste HEX unicode into notepad move cursor after unicode press [alt] + [x] +} + +// Private namespace with helper function for create volume +namespace priv { + +/// +/// Check if volume type is possible use for new text volume +/// +/// Type +/// True when allowed otherwise false +static bool is_valid(ModelVolumeType volume_type); + +/// +/// Prepare data for emboss +/// +/// Text to emboss +/// Keep actual selected style +/// Cancel for previous job +/// Base data for emboss text +static DataBase create_emboss_data_base(const std::string &text, StyleManager &style_manager, std::shared_ptr> &cancel); + +/// +/// Start job for add new volume to object with given transformation +/// +/// Define where to add +/// Volume transformation +/// Define text +/// Type of volume +static void start_create_volume_job(const ModelObject *object, + const Transform3d volume_trmat, + DataBase &emboss_data, + ModelVolumeType volume_type); + +/// +/// Start job for add new volume on surface of object defined by screen coor +/// +/// Define params of text +/// Emboss / engrave +/// Mouse position which define position +/// Volume to find surface for create +/// Ability to ray cast to model +/// Contain already used scene RayCasters +/// True when start creation, False when there is no hit surface by screen coor +static bool start_create_volume_on_surface_job(DataBase &emboss_data, + ModelVolumeType volume_type, + const Vec2d &screen_coor, + const GLVolume *gl_volume, + RaycastManager &raycaster, + GLCanvas3D &canvas); + +/// +/// Find volume in selected object with closest convex hull to screen center. +/// Return +/// +/// Define where to search for closest +/// Canvas center(dependent on camera settings) +/// Actual objects +/// OUT: coordinate of controid of closest volume +/// OUT: closest volume +static void find_closest_volume(const Selection &selection, + const Vec2d &screen_center, + const Camera &camera, + const ModelObjectPtrs &objects, + Vec2d *closest_center, + const GLVolume **closest_volume); + +/// +/// Start job for add object with text into scene +/// +/// Define params of text +/// Screen coordinat, where to create new object laying on bed +static void start_create_object_job(DataBase &emboss_data, const Vec2d &coor); + +// Loaded icons enum +// Have to match order of files in function GLGizmoEmboss::init_icons() +enum class IconType : unsigned { + rename = 0, + erase, + add, + save, + undo, + italic, + unitalic, + bold, + unbold, + system_selector, + open_file, + exclamation, + lock, + lock_bold, + unlock, + unlock_bold, + // automatic calc of icon's count + _count +}; +// Define rendered version of icon +enum class IconState : unsigned { activable = 0, hovered /*1*/, disabled /*2*/ }; +// selector for icon by enum +const IconManager::Icon &get_icon(const IconManager::VIcons& icons, IconType type, IconState state); +// short call of Slic3r::GUI::button +static bool draw_button(const IconManager::VIcons& icons, IconType type, bool disable = false); + +/// +/// Apply camera direction for emboss direction +/// +/// Define view vector +/// Containe Selected Model to modify +/// True when apply change otherwise false +static bool apply_camera_dir(const Camera &camera, GLCanvas3D &canvas); + +} // namespace priv + +void GLGizmoEmboss::create_volume(ModelVolumeType volume_type, const Vec2d& mouse_pos) +{ + if (!priv::is_valid(volume_type)) return; + m_style_manager.discard_style_changes(); + set_default_text(); + + GLVolume *gl_volume = get_first_hovered_gl_volume(m_parent); + DataBase emboss_data = priv::create_emboss_data_base(m_text, m_style_manager, m_job_cancel); + if (gl_volume != nullptr) { + // Try to cast ray into scene and find object for add volume + if (!priv::start_create_volume_on_surface_job(emboss_data, volume_type, mouse_pos, gl_volume, m_raycast_manager, m_parent)) { + // When model is broken. It could appear that hit miss the object. + // So add part near by in simmilar manner as right panel do + create_volume(volume_type); + } + } else { + // object is not under mouse position soo create object on plater + priv::start_create_object_job(emboss_data, mouse_pos); + } +} + +// Designed for create volume without information of mouse in scene +void GLGizmoEmboss::create_volume(ModelVolumeType volume_type) +{ + if (!priv::is_valid(volume_type)) return; + m_style_manager.discard_style_changes(); + set_default_text(); + + // select position by camera position and view direction + const Selection &selection = m_parent.get_selection(); + int object_idx = selection.get_object_idx(); + + Size s = m_parent.get_canvas_size(); + Vec2d screen_center(s.get_width() / 2., s.get_height() / 2.); + DataBase emboss_data = priv::create_emboss_data_base(m_text, m_style_manager, m_job_cancel); + const ModelObjectPtrs &objects = selection.get_model()->objects; + // No selected object so create new object + if (selection.is_empty() || object_idx < 0 || static_cast(object_idx) >= objects.size()) { + // create Object on center of screen + // when ray throw center of screen not hit bed it create object on center of bed + priv::start_create_object_job(emboss_data, screen_center); + return; + } + + // create volume inside of selected object + Vec2d coor; + const GLVolume *vol = nullptr; + const Camera &camera = wxGetApp().plater()->get_camera(); + priv::find_closest_volume(selection, screen_center, camera, objects, &coor, &vol); + if (vol == nullptr) { + priv::start_create_object_job(emboss_data, screen_center); + } else if (!priv::start_create_volume_on_surface_job(emboss_data, volume_type, coor, vol, m_raycast_manager, m_parent)) { + // in centroid of convex hull is not hit with object + // soo create transfomation on border of object + + // there is no point on surface so no use of surface will be applied + FontProp &prop = emboss_data.text_configuration.style.prop; + if (prop.use_surface) + prop.use_surface = false; + + // Transformation is inspired add generic volumes in ObjectList::load_generic_subobject + const ModelObject *obj = objects[vol->object_idx()]; + BoundingBoxf3 instance_bb = obj->instance_bounding_box(vol->instance_idx()); + // Translate the new modifier to be pickable: move to the left front corner of the instance's bounding box, lift to print bed. + Transform3d tr = vol->get_instance_transformation().get_matrix_no_offset().inverse(); + Vec3d offset_tr(0, // center of instance - Can't suggest width of text before it will be created + - instance_bb.size().y() / 2 - prop.size_in_mm / 2, // under + prop.emboss / 2 - instance_bb.size().z() / 2 // lay on bed + ); + Transform3d volume_trmat = tr * Eigen::Translation3d(offset_tr); + priv::start_create_volume_job(obj, volume_trmat, emboss_data, volume_type); + } +} + +bool GLGizmoEmboss::on_mouse_for_rotation(const wxMouseEvent &mouse_event) +{ + if (mouse_event.Moving()) return false; + + bool used = use_grabbers(mouse_event); + if (!m_dragging) return used; + + if (mouse_event.Dragging()) { + if (!m_rotate_start_angle.has_value()) { + // when m_rotate_start_angle is not set mean it is not Dragging + // when angle_opt is not set mean angle is Zero + const std::optional &angle_opt = m_style_manager.get_font_prop().angle; + m_rotate_start_angle = angle_opt.has_value() ? *angle_opt : 0.f; + } + + double angle = m_rotate_gizmo.get_angle(); + angle -= PI / 2; // Grabber is upward + + // temporary rotation + const TransformationType transformation_type = m_parent.get_selection().is_single_text() ? + TransformationType::Local_Relative_Joint : TransformationType::World_Relative_Joint; + m_parent.get_selection().rotate(Vec3d(0., 0., angle), transformation_type); + + angle += *m_rotate_start_angle; + // move to range <-M_PI, M_PI> + priv::to_range_pi_pi(angle); + + // set into activ style + assert(m_style_manager.is_active_font()); + if (m_style_manager.is_active_font()) { + std::optional angle_opt; + if (!is_approx(angle, 0.)) + angle_opt = angle; + m_style_manager.get_font_prop().angle = angle_opt; + } + } + return used; +} + +bool GLGizmoEmboss::on_mouse_for_translate(const wxMouseEvent &mouse_event) +{ + // exist selected volume? + if (m_volume == nullptr) + return false; + + std::optional up_limit; + if (m_keep_up) up_limit = priv::up_limit; + const Camera &camera = wxGetApp().plater()->get_camera(); + bool was_dragging = m_surface_drag.has_value(); + bool res = on_mouse_surface_drag(mouse_event, camera, m_surface_drag, m_parent, m_raycast_manager, up_limit); + bool is_dragging = m_surface_drag.has_value(); + + // End with surface dragging? + if (was_dragging && !is_dragging) { + // Update surface by new position + if (m_volume->text_configuration->style.prop.use_surface) + process(); + + // Show correct value of height & depth inside of inputs + calculate_scale(); + } + + // Start with dragging + else if (!was_dragging && is_dragging) { + // Cancel job to prevent interuption of dragging (duplicit result) + if (m_job_cancel != nullptr) + m_job_cancel->store(true); + } + + // during drag + else if (was_dragging && is_dragging) { + // update scale of selected volume --> should be approx the same + calculate_scale(); + + // Recalculate angle for GUI + if (!m_keep_up) { + const GLVolume *gl_volume = get_selected_gl_volume(m_parent.get_selection()); + assert(gl_volume != nullptr); + assert(m_style_manager.is_active_font()); + if (gl_volume == nullptr || !m_style_manager.is_active_font()) + return res; + + m_style_manager.get_style().prop.angle = calc_up(gl_volume->world_matrix(), priv::up_limit); + } + } + return res; +} + +bool GLGizmoEmboss::on_mouse(const wxMouseEvent &mouse_event) +{ + // not selected volume + if (m_volume == nullptr || + get_model_volume(m_volume_id, m_parent.get_selection().get_model()->objects) == nullptr || + !m_volume->text_configuration.has_value()) return false; + + if (on_mouse_for_rotation(mouse_event)) return true; + if (on_mouse_for_translate(mouse_event)) return true; + + return false; +} + +bool GLGizmoEmboss::on_init() +{ + m_rotate_gizmo.init(); + ColorRGBA gray_color(.6f, .6f, .6f, .3f); + m_rotate_gizmo.set_highlight_color(gray_color); + m_shortcut_key = WXK_CONTROL_T; + + // initialize text styles + m_style_manager.init(wxGetApp().app_config); + + // Set rotation gizmo upwardrotate + m_rotate_gizmo.set_angle(PI / 2); + return true; +} + +std::string GLGizmoEmboss::on_get_name() const { return _u8L("Emboss"); } + +void GLGizmoEmboss::on_render() { + // no volume selected + if (m_volume == nullptr || + get_model_volume(m_volume_id, m_parent.get_selection().get_model()->objects) == nullptr) + return; + Selection &selection = m_parent.get_selection(); + if (selection.is_empty()) return; + + // prevent get local coordinate system on multi volumes + if (!selection.is_single_volume_or_modifier() && + !selection.is_single_volume_instance()) return; + bool is_surface_dragging = m_surface_drag.has_value(); + bool is_parent_dragging = m_parent.is_mouse_dragging(); + // Do NOT render rotation grabbers when dragging object + bool is_rotate_by_grabbers = m_dragging; + if (is_rotate_by_grabbers || + (!is_surface_dragging && !is_parent_dragging)) { + glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); + m_rotate_gizmo.render(); + } +} + +void GLGizmoEmboss::on_register_raycasters_for_picking(){ + m_rotate_gizmo.register_raycasters_for_picking(); +} +void GLGizmoEmboss::on_unregister_raycasters_for_picking(){ + m_rotate_gizmo.unregister_raycasters_for_picking(); +} + +#ifdef SHOW_FINE_POSITION +// draw suggested position of window +static void draw_fine_position(const Selection &selection, + const Size &canvas, + const ImVec2 &windows_size) +{ + const Selection::IndicesList& indices = selection.get_volume_idxs(); + // no selected volume + if (indices.empty()) return; + const GLVolume *volume = selection.get_volume(*indices.begin()); + // bad volume selected (e.g. deleted one) + if (volume == nullptr) return; + + const Camera &camera = wxGetApp().plater()->get_camera(); + Slic3r::Polygon hull = CameraUtils::create_hull2d(camera, *volume); + ImVec2 canvas_size(canvas.get_width(), canvas.get_height()); + ImVec2 offset = ImGuiWrapper::suggest_location(windows_size, hull, + canvas_size); + Slic3r::Polygon rect( + {Point(offset.x, offset.y), Point(offset.x + windows_size.x, offset.y), + Point(offset.x + windows_size.x, offset.y + windows_size.y), + Point(offset.x, offset.y + windows_size.y)}); + ImGuiWrapper::draw(hull); + ImGuiWrapper::draw(rect); +} +#endif // SHOW_FINE_POSITION + +#ifdef DRAW_PLACE_TO_ADD_TEXT +static void draw_place_to_add_text() +{ + ImVec2 mp = ImGui::GetMousePos(); + Vec2d mouse_pos(mp.x, mp.y); + const Camera &camera = wxGetApp().plater()->get_camera(); + Vec3d p1 = CameraUtils::get_z0_position(camera, mouse_pos); + std::vector rect3d{p1 + Vec3d(5, 5, 0), p1 + Vec3d(-5, 5, 0), + p1 + Vec3d(-5, -5, 0), p1 + Vec3d(5, -5, 0)}; + Points rect2d = CameraUtils::project(camera, rect3d); + ImGuiWrapper::draw(Slic3r::Polygon(rect2d)); +} +#endif // DRAW_PLACE_TO_ADD_TEXT + +#ifdef SHOW_OFFSET_DURING_DRAGGING +static void draw_mouse_offset(const std::optional &offset) +{ + if (!offset.has_value()) return; + // debug draw + auto draw_list = ImGui::GetOverlayDrawList(); + ImVec2 p1 = ImGui::GetMousePos(); + ImVec2 p2(p1.x + offset->x(), p1.y + offset->y()); + ImU32 color = ImGui::GetColorU32(ImGuiWrapper::COL_ORANGE_LIGHT); + float thickness = 3.f; + draw_list->AddLine(p1, p2, color, thickness); +} +#endif // SHOW_OFFSET_DURING_DRAGGING + +void GLGizmoEmboss::on_render_input_window(float x, float y, float bottom_limit) +{ + set_volume_by_selection(); + // Do not render window for not selected text volume + if (m_volume == nullptr || + get_model_volume(m_volume_id, m_parent.get_selection().get_model()->objects) == nullptr || + !m_volume->text_configuration.has_value()) { + close(); + return; + } + + // Not known situation when could happend this is only for sure + if (!m_is_unknown_font && !m_style_manager.is_active_font()) + create_notification_not_valid_font("No active font in style. Select correct one."); + else if (!m_is_unknown_font && !m_style_manager.get_wx_font().IsOk()) + create_notification_not_valid_font("WxFont is not loaded properly."); + + // Configuration creation + double screen_scale = wxDisplay(wxGetApp().plater()).GetScaleFactor(); + float main_toolbar_height = m_parent.get_main_toolbar_height(); + if (!m_gui_cfg.has_value() || // Exist configuration - first run + m_gui_cfg->screen_scale != screen_scale || // change of DPI + m_gui_cfg->main_toolbar_height != main_toolbar_height // change size of view port + ) { + // Create cache for gui offsets + GuiCfg cfg = create_gui_configuration(); + cfg.screen_scale = screen_scale; + cfg.main_toolbar_height = main_toolbar_height; + m_gui_cfg.emplace(std::move(cfg)); + // set position near toolbar + m_set_window_offset = ImVec2(-1.f, -1.f); + + // change resolution regenerate icons + init_icons(); + m_style_manager.clear_imgui_font(); + } + + const ImVec2 &min_window_size = get_minimal_window_size(); + ImGui::PushStyleVar(ImGuiStyleVar_WindowMinSize, min_window_size); + + // Draw origin position of text during dragging + if (m_surface_drag.has_value()) { + ImVec2 mouse_pos = ImGui::GetMousePos(); + ImVec2 center( + mouse_pos.x + m_surface_drag->mouse_offset.x(), + mouse_pos.y + m_surface_drag->mouse_offset.y()); + ImU32 color = ImGui::GetColorU32( + m_surface_drag->exist_hit ? + ImVec4(1.f, 1.f, 1.f, .75f) : // transparent white + ImVec4(1.f, .3f, .3f, .75f) + ); // Warning color + const float radius = 16.f; + ImGuiWrapper::draw_cross_hair(center, radius, color); + } + +#ifdef SHOW_FINE_POSITION + draw_fine_position(m_parent.get_selection(), m_parent.get_canvas_size(), min_window_size); +#endif // SHOW_FINE_POSITION +#ifdef DRAW_PLACE_TO_ADD_TEXT + draw_place_to_add_text(); +#endif // DRAW_PLACE_TO_ADD_TEXT +#ifdef SHOW_OFFSET_DURING_DRAGGING + draw_mouse_offset(m_dragging_mouse_offset); +#endif // SHOW_OFFSET_DURING_DRAGGING + + // check if is set window offset + if (m_set_window_offset.has_value()) { + if (m_set_window_offset->y < 0) + // position near toolbar + m_set_window_offset = ImVec2(x, std::min(y, bottom_limit - min_window_size.y)); + + ImGui::SetNextWindowPos(*m_set_window_offset, ImGuiCond_Always); + m_set_window_offset.reset(); + } else if (!m_allow_open_near_volume) { + y = std::min(y, bottom_limit - min_window_size.y); + // position near toolbar + ImVec2 pos(x, y); + ImGui::SetNextWindowPos(pos, ImGuiCond_Once); + } + + bool is_opened = true; + ImGuiWindowFlags flag = ImGuiWindowFlags_NoCollapse; + if (ImGui::Begin(on_get_name().c_str(), &is_opened, flag)) { + // Need to pop var before draw window + ImGui::PopStyleVar(); // WindowMinSize + draw_window(); + } else { + ImGui::PopStyleVar(); // WindowMinSize + } + + // after change volume from object to volume it is necessary to recalculate + // minimal windows size because of set type + if (m_should_set_minimal_windows_size) { + m_should_set_minimal_windows_size = false; + ImGui::SetWindowSize(ImVec2(0.f, min_window_size.y), ImGuiCond_Always); + } + + ImGui::End(); + if (!is_opened) + close(); +} + +namespace priv { +/// +/// Move window for edit emboss text near to embossed object +/// NOTE: embossed object must be selected +/// +static ImVec2 calc_fine_position(const Selection &selection, const ImVec2 &windows_size, const Size &canvas_size); + +/// +/// Change position of emboss window +/// +/// +/// When True Only move to be full visible otherwise reset position +static void change_window_position(std::optional &output_window_offset, bool try_to_fix); +} // namespace priv + +void GLGizmoEmboss::on_set_state() +{ + // enable / disable bed from picking + // Rotation gizmo must work through bed + m_parent.set_raycaster_gizmos_on_top(GLGizmoBase::m_state == GLGizmoBase::On); + + m_rotate_gizmo.set_state(GLGizmoBase::m_state); + + // Closing gizmo. e.g. selecting another one + if (GLGizmoBase::m_state == GLGizmoBase::Off) { + // refuse outgoing during text preview + if (false) { + GLGizmoBase::m_state = GLGizmoBase::On; + auto notification_manager = wxGetApp().plater()->get_notification_manager(); + notification_manager->push_notification( + NotificationType::CustomNotification, + NotificationManager::NotificationLevel::RegularNotificationLevel, + _u8L("ERROR: Wait until ends or Cancel process.")); + return; + } + reset_volume(); + // Store order and last activ index into app.ini + // TODO: what to do when can't store into file? + m_style_manager.store_styles_to_app_config(false); + remove_notification_not_valid_font(); + } else if (GLGizmoBase::m_state == GLGizmoBase::On) { + // to reload fonts from system, when install new one + wxFontEnumerator::InvalidateCache(); + + // Try(when exist) set text configuration by volume + set_volume_by_selection(); + + // when open window by "T" and no valid volume is selected, so Create new one + if (m_volume == nullptr || + get_model_volume(m_volume_id, m_parent.get_selection().get_model()->objects) == nullptr ) { + // reopen gizmo when new object is created + GLGizmoBase::m_state = GLGizmoBase::Off; + if (wxGetApp().get_mode() == comSimple || wxGetApp().obj_list()->has_selected_cut_object()) + // It's impossible to add a part in simple mode + return; + // start creating new object + create_volume(ModelVolumeType::MODEL_PART); + } + + // change position of just opened emboss window + if (m_allow_open_near_volume) { + m_set_window_offset = priv::calc_fine_position(m_parent.get_selection(), get_minimal_window_size(), m_parent.get_canvas_size()); + } else { + if (m_gui_cfg.has_value()) + priv::change_window_position(m_set_window_offset, false); + else + m_set_window_offset = ImVec2(-1, -1); + } + + // when open by hyperlink it needs to show up + // or after key 'T' windows doesn't appear + m_parent.set_as_dirty(); + } +} + +void GLGizmoEmboss::data_changed() { + set_volume_by_selection(); +} + +void GLGizmoEmboss::on_start_dragging() { m_rotate_gizmo.start_dragging(); } +void GLGizmoEmboss::on_stop_dragging() +{ + m_rotate_gizmo.stop_dragging(); + + // TODO: when start second rotatiton previous rotation rotate draggers + // This is fast fix for second try to rotate + // When fixing, move grabber above text (not on side) + m_rotate_gizmo.set_angle(PI/2); + + // apply rotation + m_parent.do_rotate(L("Text-Rotate")); + + // Re-Calculate current angle of up vector + const GLVolume *gl_volume = get_selected_gl_volume(m_parent.get_selection()); + assert(m_style_manager.is_active_font()); + assert(gl_volume != nullptr); + if (m_style_manager.is_active_font() && gl_volume != nullptr) + m_style_manager.get_font_prop().angle = calc_up(gl_volume->world_matrix(), priv::up_limit); + + m_rotate_start_angle.reset(); + + // recalculate for surface cut + const FontProp &font_prop = m_style_manager.get_style().prop; + if (font_prop.use_surface) process(); +} +void GLGizmoEmboss::on_dragging(const UpdateData &data) { m_rotate_gizmo.dragging(data); } + +GLGizmoEmboss::GuiCfg GLGizmoEmboss::create_gui_configuration() +{ + GuiCfg cfg; // initialize by default values; + + float line_height = ImGui::GetTextLineHeight(); + float line_height_with_spacing = ImGui::GetTextLineHeightWithSpacing(); + float space = line_height_with_spacing - line_height; + const ImGuiStyle &style = ImGui::GetStyle(); + + cfg.max_style_name_width = ImGui::CalcTextSize("Maximal font name, extended").x; + + cfg.icon_width = static_cast(std::ceil(line_height)); + // make size pair number + if (cfg.icon_width % 2 != 0) ++cfg.icon_width; + + cfg.delete_pos_x = cfg.max_style_name_width + space; + int count_line_of_text = 3; + cfg.text_size = ImVec2(-FLT_MIN, line_height_with_spacing * count_line_of_text); + ImVec2 letter_m_size = ImGui::CalcTextSize("M"); + int count_letter_M_in_input = 12; + cfg.input_width = letter_m_size.x * count_letter_M_in_input; + GuiCfg::Translations &tr = cfg.translations; + + tr.font = _u8L("Font"); + tr.height = _u8L("Height"); + tr.depth = _u8L("Depth"); + + float max_text_width = std::max({ + ImGui::CalcTextSize(tr.font.c_str()).x, + ImGui::CalcTextSize(tr.height.c_str()).x, + ImGui::CalcTextSize(tr.depth.c_str()).x}); + cfg.indent = static_cast(cfg.icon_width); + cfg.input_offset = style.WindowPadding.x + cfg.indent + max_text_width + space; + + tr.use_surface = _u8L("Use surface"); + tr.char_gap = _u8L("Char gap"); + tr.line_gap = _u8L("Line gap"); + tr.boldness = _u8L("Boldness"); + tr.skew_ration = _u8L("Skew ratio"); + tr.from_surface = _u8L("From surface"); + tr.rotation = _u8L("Rotation"); + tr.keep_up = "Keep Rotation"; + tr.collection = _u8L("Collection"); + + float max_advanced_text_width = std::max({ + ImGui::CalcTextSize(tr.use_surface.c_str()).x, + ImGui::CalcTextSize(tr.char_gap.c_str()).x, + ImGui::CalcTextSize(tr.line_gap.c_str()).x, + ImGui::CalcTextSize(tr.boldness.c_str()).x, + ImGui::CalcTextSize(tr.skew_ration.c_str()).x, + ImGui::CalcTextSize(tr.from_surface.c_str()).x, + ImGui::CalcTextSize(tr.rotation.c_str()).x + cfg.icon_width + 2*space, + ImGui::CalcTextSize(tr.keep_up.c_str()).x, + ImGui::CalcTextSize(tr.collection.c_str()).x }); + cfg.advanced_input_offset = max_advanced_text_width + + 3 * space + cfg.indent; + cfg.lock_offset = cfg.advanced_input_offset - (cfg.icon_width + space); + // calculate window size + float window_title = line_height + 2*style.FramePadding.y + 2 * style.WindowTitleAlign.y; + float input_height = line_height_with_spacing + 2*style.FramePadding.y; + float tree_header = line_height_with_spacing; + float separator_height = 1 + style.FramePadding.y; + + // "Text is to object" + radio buttons + cfg.height_of_volume_type_selector = separator_height + line_height_with_spacing + input_height; + + float window_height = + window_title + // window title + cfg.text_size.y + // text field + input_height * 4 + // font name + height + depth + style selector + tree_header + // advance tree + separator_height + // presets separator line + line_height_with_spacing + // "Presets" + 2 * style.WindowPadding.y; + float window_width = cfg.input_offset + cfg.input_width + 2*style.WindowPadding.x + + 2 * (cfg.icon_width + space); + cfg.minimal_window_size = ImVec2(window_width, window_height); + + // 8 = useSurface, charGap, lineGap, bold, italic, surfDist, rotation, textFaceToCamera + // 4 = 1px for fix each edit image of drag float + float advance_height = input_height * 8 + 8; + cfg.minimal_window_size_with_advance = + ImVec2(cfg.minimal_window_size.x, + cfg.minimal_window_size.y + advance_height); + + cfg.minimal_window_size_with_collections = + ImVec2(cfg.minimal_window_size_with_advance.x, + cfg.minimal_window_size_with_advance.y + input_height); + + int max_style_image_width = cfg.max_style_name_width /2 - + 2 * style.FramePadding.x; + int max_style_image_height = 1.5 * input_height; + cfg.max_style_image_size = Vec2i(max_style_image_width, max_style_image_height); + cfg.face_name_size.y() = line_height_with_spacing; + return cfg; +} + +EmbossStyles GLGizmoEmboss::create_default_styles() +{ + wxFontEnumerator::InvalidateCache(); + wxArrayString facenames = wxFontEnumerator::GetFacenames(Facenames::encoding); + + wxFont wx_font_normal = *wxNORMAL_FONT; +#ifdef __APPLE__ + // Set normal font to helvetica when possible + for (const wxString &facename : facenames) { + if (facename.IsSameAs("Helvetica")) { + wx_font_normal = wxFont(wxFontInfo().FaceName(facename).Encoding(Facenames::encoding)); + break; + } + } +#endif // __APPLE__ + + // https://docs.wxwidgets.org/3.0/classwx_font.html + // Predefined objects/pointers: wxNullFont, wxNORMAL_FONT, wxSMALL_FONT, wxITALIC_FONT, wxSWISS_FONT + EmbossStyles styles = { + WxFontUtils::create_emboss_style(wx_font_normal, _u8L("NORMAL")), // wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) + WxFontUtils::create_emboss_style(*wxSMALL_FONT, _u8L("SMALL")), // A font using the wxFONTFAMILY_SWISS family and 2 points smaller than wxNORMAL_FONT. + WxFontUtils::create_emboss_style(*wxITALIC_FONT, _u8L("ITALIC")), // A font using the wxFONTFAMILY_ROMAN family and wxFONTSTYLE_ITALIC style and of the same size of wxNORMAL_FONT. + WxFontUtils::create_emboss_style(*wxSWISS_FONT, _u8L("SWISS")), // A font identic to wxNORMAL_FONT except for the family used which is wxFONTFAMILY_SWISS. + WxFontUtils::create_emboss_style(wxFont(10, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD), _u8L("MODERN")), + }; + + // Not all predefined font for wx must be valid TTF, but at least one style must be loadable + styles.erase(std::remove_if(styles.begin(), styles.end(), [](const EmbossStyle& style) { + wxFont wx_font = WxFontUtils::create_wxFont(style); + + // check that face name is setabled + if (style.prop.face_name.has_value()) { + wxString face_name(style.prop.face_name->c_str()); + wxFont wx_font_temp; + if (!wx_font_temp.SetFaceName(face_name)) + return true; + } + + // Check that exsit valid TrueType Font for wx font + return WxFontUtils::create_font_file(wx_font) == nullptr; + }),styles.end() + ); + + // exist some valid style? + if (!styles.empty()) + return styles; + + // No valid style in defult list + // at least one style must contain loadable font + wxFont wx_font; + for (const wxString &face : facenames) { + wx_font = wxFont(face); + if (WxFontUtils::create_font_file(wx_font) != nullptr) + break; + wx_font = wxFont(); // NotOk + } + + if (wx_font.IsOk()) { + // use first alphabetic sorted installed font + styles.push_back(WxFontUtils::create_emboss_style(wx_font, _u8L("First font"))); + } else { + // On current OS is not installed any correct TTF font + // use font packed with Slic3r + std::string font_path = Slic3r::resources_dir() + "/fonts/NotoSans-Regular.ttf"; + styles.push_back(EmbossStyle{_u8L("Default font"), font_path, EmbossStyle::Type::file_path}); + } + return styles; +} + +void GLGizmoEmboss::set_default_text(){ m_text = _u8L("Embossed text"); } + +void GLGizmoEmboss::set_volume_by_selection() +{ + const Selection &selection = m_parent.get_selection(); + const GLVolume *gl_volume = get_selected_gl_volume(selection); + if (gl_volume == nullptr) + return reset_volume(); + + const ModelObjectPtrs &objects = selection.get_model()->objects; + ModelVolume *volume =get_model_volume(*gl_volume, objects); + if (volume == nullptr) + return reset_volume(); + + // is same volume as actual selected? + if (volume->id() == m_volume_id) + return; + + // for changed volume notification is NOT valid + remove_notification_not_valid_font(); + + // Do not use focused input value when switch volume(it must swith value) + if (m_volume != nullptr && + m_volume != volume) // when update volume it changed id BUT not pointer + ImGuiWrapper::left_inputs(); + + // Is selected volume text volume? + const std::optional& tc_opt = volume->text_configuration; + if (!tc_opt.has_value()) + return reset_volume(); + + const TextConfiguration &tc = *tc_opt; + const EmbossStyle &style = tc.style; + + // Could exist OS without getter on face_name, + // but it is able to restore font from descriptor + // Soo default value must be TRUE + bool is_font_installed = true; + wxString face_name; + std::optional face_name_opt = style.prop.face_name; + if (face_name_opt.has_value()) { + face_name = wxString(face_name_opt->c_str()); + + // search in enumerated fonts + // refresh list of installed font in the OS. + init_face_names(m_face_names); + m_face_names.is_init = false; + + auto cmp = [](const FaceName &fn, const wxString& face_name)->bool { return fn.wx_name < face_name; }; + const std::vector &faces = m_face_names.faces; + auto it = std::lower_bound(faces.begin(), faces.end(), face_name, cmp); + is_font_installed = it != faces.end() && it->wx_name == face_name; + + if (!is_font_installed) { + const std::vector &bad = m_face_names.bad; + auto it_bad = std::lower_bound(bad.begin(), bad.end(), face_name); + if (it_bad == bad.end() || *it_bad != face_name){ + // check if wx allowed to set it up - another encoding of name + wxFontEnumerator::InvalidateCache(); + wxFont wx_font_; // temporary structure + if (wx_font_.SetFaceName(face_name) && + WxFontUtils::create_font_file(wx_font_) != nullptr // can load TTF file? + ) { + is_font_installed = true; + // QUESTION: add this name to allowed faces? + // Could create twin of font face name + // When not add it will be hard to select it again when change font + } + } + } + } + + wxFont wx_font; + // load wxFont from same OS when font name is installed + if (style.type == WxFontUtils::get_actual_type() && is_font_installed) + wx_font = WxFontUtils::load_wxFont(style.path); + + // Flag that is selected same font + bool is_exact_font = true; + // Different OS or try found on same OS + if (!wx_font.IsOk()) { + is_exact_font = false; + // Try create similar wx font by FontFamily + wx_font = WxFontUtils::create_wxFont(style); + if (is_font_installed) + is_exact_font = wx_font.SetFaceName(face_name); + + // Have to use some wxFont + if (!wx_font.IsOk()) + wx_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); + } + assert(wx_font.IsOk()); + + // Load style to style manager + const auto& styles = m_style_manager.get_styles(); + auto has_same_name = [&style](const StyleManager::Item &style_item) -> bool { + const EmbossStyle &es = style_item.style; + return es.name == style.name; + }; + auto it = std::find_if(styles.begin(), styles.end(), has_same_name); + if (it == styles.end()) { + // style was not found + m_style_manager.load_style(style, wx_font); + } else { + // style name is in styles list + size_t style_index = it - styles.begin(); + if (!m_style_manager.load_style(style_index)) { + // can`t load stored style + m_style_manager.erase(style_index); + m_style_manager.load_style(style, wx_font); + } else { + // stored style is loaded, now set modification of style + m_style_manager.get_style() = style; + m_style_manager.set_wx_font(wx_font); + } + } + + if (!is_exact_font) + create_notification_not_valid_font(tc); + + // The change of volume could show or hide part with setter on volume type + if (m_volume == nullptr || + get_model_volume(m_volume_id, objects) == nullptr || + (m_volume->get_object()->volumes.size() == 1) != + (volume->get_object()->volumes.size() == 1)){ + m_should_set_minimal_windows_size = true; + } + + // cancel previous job + if (m_job_cancel != nullptr) { + m_job_cancel->store(true); + m_job_cancel = nullptr; + } + + m_text = tc.text; + m_volume = volume; + m_volume_id = volume->id(); + + // Calculate current angle of up vector + assert(m_style_manager.is_active_font()); + if (m_style_manager.is_active_font()) + m_style_manager.get_font_prop().angle = calc_up(gl_volume->world_matrix(), priv::up_limit); + + // calculate scale for height and depth inside of scaled object instance + calculate_scale(); +} + +void GLGizmoEmboss::reset_volume() +{ + if (m_volume == nullptr) + return; // already reseted + + m_volume = nullptr; + m_volume_id.id = 0; + + // No more need of current notification + remove_notification_not_valid_font(); +} + +void GLGizmoEmboss::calculate_scale() { + Transform3d to_world = m_parent.get_selection().get_first_volume()->world_matrix(); + auto to_world_linear = to_world.linear(); + auto calc = [&to_world_linear](const Vec3d &axe, std::optional& scale)->bool { + Vec3d axe_world = to_world_linear * axe; + double norm_sq = axe_world.squaredNorm(); + if (is_approx(norm_sq, 1.)) { + if (scale.has_value()) + scale.reset(); + else + return false; + } else { + scale = sqrt(norm_sq); + } + return true; + }; + + bool exist_change = calc(Vec3d::UnitY(), m_scale_height); + exist_change |= calc(Vec3d::UnitZ(), m_scale_depth); + + // Change of scale has to change font imgui font size + if (exist_change) + m_style_manager.clear_imgui_font(); +} + +#ifdef EXECUTE_PROCESS_ON_MAIN_THREAD +namespace priv { +// Run Job on main thread (blocking) - ONLY DEBUG +static inline void execute_job(std::shared_ptr j) +{ + struct MyCtl : public Job::Ctl + { + void update_status(int st, const std::string &msg = "") override{}; + bool was_canceled() const override { return false; } + std::future call_on_main_thread(std::function fn) override + { + return std::future{}; + } + } ctl; + j->process(ctl); + wxGetApp().plater()->CallAfter([j]() { + std::exception_ptr e_ptr = nullptr; + j->finalize(false, e_ptr); + }); +} +} // namespace priv +#endif + +bool GLGizmoEmboss::process() +{ + // no volume is selected -> selection from right panel + assert(m_volume != nullptr); + if (m_volume == nullptr) return false; + + // without text there is nothing to emboss + if (m_text.empty()) return false; + + // exist loaded font file? + if (!m_style_manager.is_active_font()) return false; + + DataUpdate data{priv::create_emboss_data_base(m_text, m_style_manager, m_job_cancel), m_volume->id()}; + + std::unique_ptr job = nullptr; + + // check cutting from source mesh + bool &use_surface = data.text_configuration.style.prop.use_surface; + bool is_object = m_volume->get_object()->volumes.size() == 1; + if (use_surface && is_object) + use_surface = false; + + if (use_surface) { + // Model to cut surface from. + SurfaceVolumeData::ModelSources sources = create_volume_sources(m_volume); + if (sources.empty()) return false; + + Transform3d text_tr = m_volume->get_matrix(); + auto& fix_3mf = m_volume->text_configuration->fix_3mf_tr; + if (fix_3mf.has_value()) + text_tr = text_tr * fix_3mf->inverse(); + + // when it is new applying of use surface than move origin onto surfaca + if (!m_volume->text_configuration->style.prop.use_surface) { + auto offset = calc_surface_offset(m_parent.get_selection(), m_raycast_manager); + if (offset.has_value()) + text_tr *= Eigen::Translation(*offset); + } + + bool is_outside = m_volume->is_model_part(); + // check that there is not unexpected volume type + assert(is_outside || m_volume->is_negative_volume() || + m_volume->is_modifier()); + UpdateSurfaceVolumeData surface_data{std::move(data), {text_tr, is_outside, std::move(sources)}}; + job = std::make_unique(std::move(surface_data)); + } else { + job = std::make_unique(std::move(data)); + } + +#ifndef EXECUTE_PROCESS_ON_MAIN_THREAD + auto &worker = wxGetApp().plater()->get_ui_job_worker(); + queue_job(worker, std::move(job)); +#else + // Run Job on main thread (blocking) - ONLY DEBUG + priv::execute_job(std::move(job)); +#endif // EXECUTE_PROCESS_ON_MAIN_THREAD + + // notification is removed befor object is changed by job + remove_notification_not_valid_font(); + return true; +} + +namespace priv { +static bool is_text_empty(const std::string &text) { return text.empty() || text.find_first_not_of(" \n\t\r") == std::string::npos; } +} + +void GLGizmoEmboss::close() +{ + // remove volume when text is empty + if (m_volume != nullptr && + m_volume->text_configuration.has_value() && + priv::is_text_empty(m_text)) { + Plater &p = *wxGetApp().plater(); + // is the text object? + if (m_volume->is_the_only_one_part()) { + // delete whole object + p.remove(m_parent.get_selection().get_object_idx()); + } else { + // delete text volume + p.remove_selected(); + } + } + + // close gizmo == open it again + auto& mng = m_parent.get_gizmos_manager(); + if (mng.get_current_type() == GLGizmosManager::Emboss) + mng.open_gizmo(GLGizmosManager::Emboss); +} + +void GLGizmoEmboss::draw_window() +{ +#ifdef ALLOW_DEBUG_MODE + if (ImGui::Button("re-process")) process(); + if (ImGui::Button("add svg")) choose_svg_file(); +#endif // ALLOW_DEBUG_MODE + + // Setter of indent must be befor disable !!! + ImGui::PushStyleVar(ImGuiStyleVar_IndentSpacing, m_gui_cfg->indent); + ScopeGuard indent_sc([](){ ImGui::PopStyleVar(/*ImGuiStyleVar_IndentSpacing*/); }); + + // Disable all except selection of font, when open text from 3mf with unknown font + m_imgui->disabled_begin(m_is_unknown_font); + ScopeGuard unknown_font_sc([imgui = m_imgui]() { imgui->disabled_end(/*m_is_unknown_font*/); }); + + draw_text_input(); + + ImGui::Indent(); + // When unknown font is inside .3mf only font selection is allowed + m_imgui->disabled_end(/*m_is_unknown_font*/); + draw_font_list_line(); + m_imgui->disabled_begin(m_is_unknown_font); + bool use_inch = wxGetApp().app_config->get_bool("use_inches"); + draw_height(use_inch); + draw_depth(use_inch); + ImGui::Unindent(); + + // close advanced style property when unknown font is selected + if (m_is_unknown_font && m_is_advanced_edit_style) + ImGui::SetNextTreeNodeOpen(false); + + if (ImGui::TreeNode(_u8L("Advanced").c_str())) { + if (!m_is_advanced_edit_style) { + set_minimal_window_size(true); + } else { + draw_advanced(); + } + ImGui::TreePop(); + } else if (m_is_advanced_edit_style) + set_minimal_window_size(false); + + ImGui::Separator(); + + draw_style_list(); + + // Do not select volume type, when it is text object + if (m_volume->get_object()->volumes.size() != 1) { + ImGui::Separator(); + draw_model_type(); + } + +#ifdef SHOW_WX_FONT_DESCRIPTOR + if (is_selected_style) + m_imgui->text_colored(ImGuiWrapper::COL_GREY_DARK, m_style_manager.get_style().path); +#endif // SHOW_WX_FONT_DESCRIPTOR + +#ifdef SHOW_CONTAIN_3MF_FIX + if (m_volume!=nullptr && + m_volume->text_configuration.has_value() && + m_volume->text_configuration->fix_3mf_tr.has_value()) { + ImGui::SameLine(); + m_imgui->text_colored(ImGuiWrapper::COL_GREY_DARK, ".3mf"); + if (ImGui::IsItemHovered()) { + Transform3d &fix = *m_volume->text_configuration->fix_3mf_tr; + std::stringstream ss; + ss << fix.matrix(); + std::string filename = (m_volume->source.input_file.empty())? "unknown.3mf" : + m_volume->source.input_file + ".3mf"; + ImGui::SetTooltip("Text configuation contain \n" + "Fix Transformation Matrix \n" + "%s\n" + "loaded from \"%s\" file.", + ss.str().c_str(), filename.c_str() + ); + } + } +#endif // SHOW_CONTAIN_3MF_FIX +#ifdef SHOW_ICONS_TEXTURE + auto &t = m_icons_texture; + ImGui::Image((void *) t.get_id(), ImVec2(t.get_width(), t.get_height())); +#endif //SHOW_ICONS_TEXTURE +#ifdef SHOW_IMGUI_ATLAS + const auto &atlas = m_style_manager.get_atlas(); + ImGui::Image(atlas.TexID, ImVec2(atlas.TexWidth, atlas.TexHeight)); +#endif // SHOW_IMGUI_ATLAS + +#ifdef ALLOW_OPEN_NEAR_VOLUME + ImGui::SameLine(); + if (ImGui::Checkbox("##ALLOW_OPEN_NEAR_VOLUME", &m_allow_open_near_volume)) { + if (m_allow_open_near_volume) + m_set_window_offset = priv::calc_fine_position(m_parent.get_selection(), get_minimal_window_size(), m_parent.get_canvas_size()); + } else if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("%s", ((m_allow_open_near_volume) ? + "Fix settings position": + "Allow floating window near text").c_str()); + } +#endif // ALLOW_FLOAT_WINDOW + } + +#include "imgui/imgui_internal.h" // scroll bar existence + +void GLGizmoEmboss::draw_text_input() +{ + auto create_range_text_prep = [&mng = m_style_manager, &text = m_text, &exist_unknown = m_text_contain_unknown_glyph]() { + auto& ff = mng.get_font_file_with_cache(); + assert(ff.has_value()); + const auto &cn = mng.get_font_prop().collection_number; + unsigned int font_index = (cn.has_value()) ? *cn : 0; + return create_range_text(text, *ff.font_file, font_index, &exist_unknown); + }; + + double scale = m_scale_height.has_value() ? *m_scale_height : 1.; + ImFont *imgui_font = m_style_manager.get_imgui_font(); + if (imgui_font == nullptr) { + // try create new imgui font + double screen_scale = wxDisplay(wxGetApp().plater()).GetScaleFactor(); + double imgui_scale = scale * screen_scale; + m_style_manager.create_imgui_font(create_range_text_prep(), imgui_scale); + imgui_font = m_style_manager.get_imgui_font(); + } + bool exist_font = + imgui_font != nullptr && + imgui_font->IsLoaded() && + imgui_font->Scale > 0.f && + imgui_font->ContainerAtlas != nullptr; + // NOTE: Symbol fonts doesn't have atlas + // when their glyph range is out of language character range + if (exist_font) ImGui::PushFont(imgui_font); + + // show warning about incorrectness view of font + std::string warning_tool_tip; + if (!exist_font) { + warning_tool_tip = _u8L("The text cannot be written using the selected font. Please try choosing a different font."); + } else { + auto append_warning = [&warning_tool_tip](std::string t) { + if (!warning_tool_tip.empty()) + warning_tool_tip += "\n"; + warning_tool_tip += t; + }; + + if (priv::is_text_empty(m_text)) + append_warning(_u8L("Embossed text cannot contain only white spaces.")); + if (m_text_contain_unknown_glyph) + append_warning(_u8L("Text contains character glyph (represented by '?') unknown by font.")); + + const FontProp &prop = m_style_manager.get_font_prop(); + if (prop.skew.has_value()) append_warning(_u8L("Text input doesn't show font skew.")); + if (prop.boldness.has_value()) append_warning(_u8L("Text input doesn't show font boldness.")); + if (prop.line_gap.has_value()) + append_warning(_u8L("Text input doesn't show gap between lines.")); + auto &ff = m_style_manager.get_font_file_with_cache(); + float imgui_size = StyleManager::get_imgui_font_size(prop, *ff.font_file, scale); + if (imgui_size > StyleManager::max_imgui_font_size) + append_warning(_u8L("Too tall, diminished font height inside text input.")); + if (imgui_size < StyleManager::min_imgui_font_size) + append_warning(_u8L("Too small, enlarged font height inside text input.")); + } + + // flag for extend font ranges if neccessary + // ranges can't be extend during font is activ(pushed) + std::string range_text; + float window_height = ImGui::GetWindowHeight(); + float minimal_height = get_minimal_window_size().y; + float extra_height = window_height - minimal_height; + ImVec2 input_size(m_gui_cfg->text_size.x, m_gui_cfg->text_size.y + extra_height); + const ImGuiInputTextFlags flags = ImGuiInputTextFlags_AllowTabInput | ImGuiInputTextFlags_AutoSelectAll; + if (ImGui::InputTextMultiline("##Text", &m_text, input_size, flags)) { + process(); + range_text = create_range_text_prep(); + } + + if (exist_font) ImGui::PopFont(); + + // warning tooltip has to be with default font + if (!warning_tool_tip.empty()) { + // Multiline input has hidden window for scrolling + ImGuiWindow *input = ImGui::GetCurrentWindow()->DC.ChildWindows.front(); + + const ImGuiStyle &style = ImGui::GetStyle(); + float scrollbar_width = (input->ScrollbarY) ? style.ScrollbarSize : 0.f; + float scrollbar_height = (input->ScrollbarX) ? style.ScrollbarSize : 0.f; + + bool hovered = ImGui::IsItemHovered(); + if (hovered) + ImGui::SetTooltip("%s", warning_tool_tip.c_str()); + + ImVec2 cursor = ImGui::GetCursorPos(); + float width = ImGui::GetContentRegionAvailWidth(); + const ImVec2& padding = style.FramePadding; + ImVec2 icon_pos(width - m_gui_cfg->icon_width - scrollbar_width + padding.x, + cursor.y - m_gui_cfg->icon_width - scrollbar_height - 2*padding.y); + + ImGui::SetCursorPos(icon_pos); + draw(get_icon(m_icons, IconType::exclamation, IconState::hovered)); + ImGui::SetCursorPos(cursor); + } + + // NOTE: must be after ImGui::font_pop() + // -> imgui_font has to be unused + // IMPROVE: only extend not clear + // Extend font ranges + if (!range_text.empty() && + !m_imgui->contain_all_glyphs(imgui_font, range_text) ) + m_style_manager.clear_imgui_font(); +} + +#include +#include "wx/hashmap.h" +std::size_t hash_value(wxString const &s) +{ + boost::hash hasher; + return hasher(s.ToStdString()); +} + +static std::string concat(std::vector data) { + std::stringstream ss; + for (const auto &d : data) + ss << d.c_str() << ", "; + return ss.str(); +} + +#include +static boost::filesystem::path get_fontlist_cache_path() +{ + return boost::filesystem::path(data_dir()) / "cache" / "fonts.cereal"; +} + +// cache font list by cereal +#include +#include +#include +#include + +// increase number when change struct FacenamesSerializer +#define FACENAMES_VERSION 1 +struct FacenamesSerializer +{ + // hash number for unsorted vector of installed font into system + size_t hash = 0; + // assumption that is loadable + std::vector good; + // Can't load for some reason + std::vector bad; +}; + +template void save(Archive &archive, wxString const &d) +{ std::string s(d.ToUTF8().data()); archive(s);} +template void load(Archive &archive, wxString &d) +{ std::string s; archive(s); d = s;} + +template void serialize(Archive &ar, FacenamesSerializer &t, const std::uint32_t version) +{ + // When performing a load, the version associated with the class + // is whatever it was when that data was originally serialized + // When we save, we'll use the version that is defined in the macro + if (version != FACENAMES_VERSION) return; + ar(t.hash, t.good, t.bad); +} +CEREAL_CLASS_VERSION(FacenamesSerializer, FACENAMES_VERSION); // register class version + +#include +bool GLGizmoEmboss::store(const Facenames &facenames) { + std::string cache_path = get_fontlist_cache_path().string(); + boost::nowide::ofstream file(cache_path, std::ios::binary); + cereal::BinaryOutputArchive archive(file); + std::vector good; + good.reserve(facenames.faces.size()); + for (const FaceName &face : facenames.faces) good.push_back(face.wx_name); + FacenamesSerializer data = {facenames.hash, good, facenames.bad}; + + assert(std::is_sorted(data.bad.begin(), data.bad.end())); + assert(std::is_sorted(data.good.begin(), data.good.end())); + + try { + archive(data); + } catch (const std::exception &ex) { + BOOST_LOG_TRIVIAL(error) << "Failed to write fontlist cache - " << cache_path << ex.what(); + return false; + } + return true; +} + +bool GLGizmoEmboss::load(Facenames &facenames) { + boost::filesystem::path path = get_fontlist_cache_path(); + std::string path_str = path.string(); + if (!boost::filesystem::exists(path)) { + BOOST_LOG_TRIVIAL(warning) << "Fontlist cache - '" << path_str << "' does not exists."; + return false; + } + boost::nowide::ifstream file(path_str, std::ios::binary); + cereal::BinaryInputArchive archive(file); + + FacenamesSerializer data; + try { + archive(data); + } catch (const std::exception &ex) { + BOOST_LOG_TRIVIAL(error) << "Failed to load fontlist cache - '" << path_str << "'. Exception: " << ex.what(); + return false; + } + + assert(std::is_sorted(data.bad.begin(), data.bad.end())); + assert(std::is_sorted(data.good.begin(), data.good.end())); + + facenames.hash = data.hash; + facenames.faces.reserve(data.good.size()); + for (const wxString &face : data.good) + facenames.faces.push_back({face}); + facenames.bad = data.bad; + return true; +} + +void GLGizmoEmboss::init_truncated_names(Facenames &face_names, float max_width) +{ + for (FaceName &face : face_names.faces) { + std::string name_str(face.wx_name.ToUTF8().data()); + face.name_truncated = ImGuiWrapper::trunc(name_str, max_width); + } + face_names.has_truncated_names = true; +} + +void GLGizmoEmboss::init_face_names(Facenames &face_names) +{ + Timer t("enumerate_fonts"); + if (face_names.is_init) return; + face_names.is_init = true; + + // to reload fonts from system, when install new one + wxFontEnumerator::InvalidateCache(); + + // try load cache + // Only not OS enumerated face has hash value 0 + if (face_names.hash == 0) { + load(face_names); + face_names.has_truncated_names = false; + } + + using namespace std::chrono; + steady_clock::time_point enumerate_start = steady_clock::now(); + ScopeGuard sg([&enumerate_start, &face_names = face_names]() { + steady_clock::time_point enumerate_end = steady_clock::now(); + long long enumerate_duration = duration_cast(enumerate_end - enumerate_start).count(); + BOOST_LOG_TRIVIAL(info) << "OS enumerate " << face_names.faces.size() << " fonts " + << "(+ " << face_names.bad.size() << " can't load " + << "= " << face_names.faces.size() + face_names.bad.size() << " fonts) " + << "in " << enumerate_duration << " ms\n" << concat(face_names.bad); + }); + wxArrayString facenames = wxFontEnumerator::GetFacenames(face_names.encoding); + size_t hash = boost::hash_range(facenames.begin(), facenames.end()); + // Zero value is used as uninitialized hash + if (hash == 0) hash = 1; + // check if it is same as last time + if (face_names.hash == hash) { + // no new installed font + BOOST_LOG_TRIVIAL(info) << "Same FontNames hash, cache is used. " + << "For clear cache delete file: " << get_fontlist_cache_path().string(); + return; + } + + BOOST_LOG_TRIVIAL(info) << ((face_names.hash == 0) ? + "FontName list is generate from scratch." : + "Hash are different. Only previous bad fonts are used and set again as bad"); + face_names.hash = hash; + + // validation lambda + auto is_valid_font = [encoding = face_names.encoding, bad = face_names.bad /*copy*/](const wxString &name) { + if (name.empty()) return false; + + // vertical font start with @, we will filter it out + // Not sure if it is only in Windows so filtering is on all platforms + if (name[0] == '@') return false; + + // previously detected bad font + auto it = std::lower_bound(bad.begin(), bad.end(), name); + if (it != bad.end() && *it == name) return false; + + wxFont wx_font(wxFontInfo().FaceName(name).Encoding(encoding)); + //* + // Faster chech if wx_font is loadable but not 100% + // names could contain not loadable font + if (!WxFontUtils::can_load(wx_font)) return false; + + /*/ + // Slow copy of font files to try load font + // After this all files are loadable + auto font_file = WxFontUtils::create_font_file(wx_font); + if (font_file == nullptr) + return false; // can't create font file + // */ + return true; + }; + + face_names.faces.clear(); + face_names.bad.clear(); + face_names.faces.reserve(facenames.size()); + std::sort(facenames.begin(), facenames.end()); + for (const wxString &name : facenames) { + if (is_valid_font(name)) { + face_names.faces.push_back({name}); + }else{ + face_names.bad.push_back(name); + } + } + assert(std::is_sorted(face_names.bad.begin(), face_names.bad.end())); + face_names.has_truncated_names = false; + store(face_names); +} + +// create texture for visualization font face +void GLGizmoEmboss::init_font_name_texture() { + Timer t("init_font_name_texture"); + // check if already exists + GLuint &id = m_face_names.texture_id; + if (id != 0) return; + // create texture for font + GLenum target = GL_TEXTURE_2D; + glsafe(::glGenTextures(1, &id)); + glsafe(::glBindTexture(target, id)); + glsafe(::glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); + glsafe(::glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); + const Vec2i &size = m_gui_cfg->face_name_size; + GLint w = size.x(), h = m_face_names.count_cached_textures * size.y(); + std::vector data(4*w * h, {0}); + const GLenum format = GL_RGBA, type = GL_UNSIGNED_BYTE; + const GLint level = 0, internal_format = GL_RGBA, border = 0; + glsafe(::glTexImage2D(target, level, internal_format, w, h, border, format, type, data.data())); + + // bind default texture + GLuint no_texture_id = 0; + glsafe(::glBindTexture(target, no_texture_id)); + + // clear info about creation of texture - no one is initialized yet + for (FaceName &face : m_face_names.faces) { + face.cancel = nullptr; + face.is_created = nullptr; + } + + // Prepare filtration cache + m_face_names.hide = std::vector(m_face_names.faces.size(), {false}); +} + +void GLGizmoEmboss::draw_font_preview(FaceName& face, bool is_visible) +{ + // Limit for opened font files at one moment + unsigned int &count_opened_fonts = m_face_names.count_opened_font_files; + // Size of texture + ImVec2 size(m_gui_cfg->face_name_size.x(), m_gui_cfg->face_name_size.y()); + float count_cached_textures_f = static_cast(m_face_names.count_cached_textures); + std::string state_text; + // uv0 and uv1 set to pixel 0,0 in texture + ImVec2 uv0(0.f, 0.f), uv1(1.f / size.x, 1.f / size.y / count_cached_textures_f); + if (face.is_created != nullptr) { + // not created preview + if (*face.is_created) { + // Already created preview + size_t texture_index = face.texture_index; + uv0 = ImVec2(0.f, texture_index / count_cached_textures_f); + uv1 = ImVec2(1.f, (texture_index + 1) / count_cached_textures_f); + } else { + // Not finished preview + if (is_visible) { + // when not canceled still loading + state_text = std::string(" ") + (face.cancel->load() ? + _u8L("No symbol") : + (dots.ToStdString() + _u8L("Loading"))); + } else { + // not finished and not visible cancel job + face.is_created = nullptr; + face.cancel->store(true); + } + } + } else if (is_visible && count_opened_fonts < m_gui_cfg->max_count_opened_font_files) { + ++count_opened_fonts; + face.cancel = std::make_shared(false); + face.is_created = std::make_shared(false); + + const unsigned char gray_level = 5; + // format type and level must match to texture data + const GLenum format = GL_RGBA, type = GL_UNSIGNED_BYTE; + const GLint level = 0; + // select next texture index + size_t texture_index = (m_face_names.texture_index + 1) % m_face_names.count_cached_textures; + + // set previous cach as deleted + for (FaceName &f : m_face_names.faces) + if (f.texture_index == texture_index) { + if (f.cancel != nullptr) f.cancel->store(true); + f.is_created = nullptr; + } + + m_face_names.texture_index = texture_index; + face.texture_index = texture_index; + + // render text to texture + FontImageData data{ + m_text, + face.wx_name, + m_face_names.encoding, + m_face_names.texture_id, + m_face_names.texture_index, + m_gui_cfg->face_name_size, + gray_level, + format, + type, + level, + &count_opened_fonts, + face.cancel, // copy + face.is_created // copy + }; + auto job = std::make_unique(std::move(data)); + auto &worker = wxGetApp().plater()->get_ui_job_worker(); + queue_job(worker, std::move(job)); + } else { + // cant start new thread at this moment so wait in queue + state_text = " " + dots.ToStdString() + " " + _u8L("Queue"); + } + + if (!state_text.empty()) { + ImGui::SameLine(m_gui_cfg->face_name_texture_offset_x); + m_imgui->text(state_text); + } + + ImGui::SameLine(m_gui_cfg->face_name_texture_offset_x); + ImTextureID tex_id = (void *) (intptr_t) m_face_names.texture_id; + ImGui::Image(tex_id, size, uv0, uv1); +} + +bool GLGizmoEmboss::select_facename(const wxString &facename) +{ + if (!wxFontEnumerator::IsValidFacename(facename)) return false; + // Select font + const wxFontEncoding &encoding = m_face_names.encoding; + wxFont wx_font(wxFontInfo().FaceName(facename).Encoding(encoding)); + if (!wx_font.IsOk()) return false; +#ifdef USE_PIXEL_SIZE_IN_WX_FONT + // wx font could change source file by size of font + int point_size = static_cast(m_style_manager.get_font_prop().size_in_mm); + wx_font.SetPointSize(point_size); +#endif // USE_PIXEL_SIZE_IN_WX_FONT + if (!m_style_manager.set_wx_font(wx_font)) return false; + process(); + return true; +} + +void GLGizmoEmboss::draw_font_list_line() +{ + bool exist_stored_style = m_style_manager.exist_stored_style(); + bool exist_change_in_font = m_style_manager.is_font_changed(); + const std::string& font_text = m_gui_cfg->translations.font; + if (exist_change_in_font || !exist_stored_style) + ImGuiWrapper::text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, font_text); + else + ImGuiWrapper::text(font_text); + + ImGui::SameLine(m_gui_cfg->input_offset); + + draw_font_list(); + + bool exist_change = false; + if (!m_is_unknown_font) { + ImGui::SameLine(); + if (draw_italic_button()) + exist_change = true; + ImGui::SameLine(); + if (draw_bold_button()) + exist_change = true; + } else { + // when exist unknown font add confirmation button + ImGui::SameLine(); + // Apply for actual selected font + if (ImGui::Button(_u8L("Apply").c_str())) + exist_change = true; + } + + EmbossStyle &style = m_style_manager.get_style(); + if (exist_change_in_font) { + ImGui::SameLine(ImGui::GetStyle().FramePadding.x); + if (draw_button(m_icons, IconType::undo)) { + const EmbossStyle *stored_style = m_style_manager.get_stored_style(); + + style.path = stored_style->path; + style.prop.boldness = stored_style->prop.boldness; + style.prop.skew = stored_style->prop.skew; + + wxFont new_wx_font = WxFontUtils::load_wxFont(style.path); + if (new_wx_font.IsOk() && m_style_manager.set_wx_font(new_wx_font)) + exist_change = true; + } else if (ImGui::IsItemHovered()) + ImGui::SetTooltip("%s", _u8L("Revert font changes.").c_str()); + } + + if (exist_change) { + m_style_manager.clear_glyphs_cache(); + process(); + } +} + +void GLGizmoEmboss::draw_font_list() +{ + // Set partial + wxString actual_face_name; + if (m_style_manager.is_active_font()) { + const wxFont &wx_font = m_style_manager.get_wx_font(); + if (wx_font.IsOk()) + actual_face_name = wx_font.GetFaceName(); + } + // name of actual selected font + const char * selected = (!actual_face_name.empty()) ? + actual_face_name.ToUTF8().data() : " --- "; + + // Do not remove font face during enumeration + // When deletation of font appear this variable is set + std::optional del_index; + + // Code + const char *popup_id = "##font_list_popup"; + const char *input_id = "##font_list_input"; + ImGui::SetNextItemWidth(m_gui_cfg->input_width); + + // change color of hint to normal text + bool is_popup_open = ImGui::IsPopupOpen(popup_id); + if (!is_popup_open) { + ImGui::PushStyleColor(ImGuiCol_TextDisabled, ImGui::GetStyleColorVec4(ImGuiCol_Text)); + + // Fix clearance of search input, + // Sometime happens that search text not disapear after font select + m_face_names.search.clear(); + } + + if (ImGui::InputTextWithHint(input_id, selected, &m_face_names.search)) { + // update filtration result + m_face_names.hide = std::vector(m_face_names.faces.size(), {false}); + + // search to uppercase + std::string search = m_face_names.search; // copy + std::transform(search.begin(), search.end(), search.begin(), ::toupper); + + for (FaceName &face : m_face_names.faces) { + size_t index = &face - &m_face_names.faces.front(); + + // font name to uppercase + std::string name(face.wx_name.ToUTF8().data()); + std::transform(name.begin(), name.end(), name.begin(), ::toupper); + + // It should use C++ 20 feature https://en.cppreference.com/w/cpp/string/basic_string/starts_with + bool start_with = boost::starts_with(name, search); + m_face_names.hide[index] = !start_with; + } + } + if (!is_popup_open) + ImGui::PopStyleColor(); // revert changes for hint color + + const bool is_input_text_active = ImGui::IsItemActive(); + + // is_input_text_activated + if (ImGui::IsItemActivated()) + ImGui::OpenPopup(popup_id); + + ImGui::SetNextWindowPos(ImVec2(ImGui::GetItemRectMin().x, ImGui::GetItemRectMax().y)); + ImGui::SetNextWindowSize({2*m_gui_cfg->input_width, ImGui::GetTextLineHeight()*10}); + ImGuiWindowFlags popup_flags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | + ImGuiWindowFlags_NoResize | ImGuiWindowFlags_ChildWindow; + if (ImGui::BeginPopup(popup_id, popup_flags)) + { + bool set_selection_focus = false; + if (!m_face_names.is_init) { + init_face_names(m_face_names); + set_selection_focus = true; + } + + if (!m_face_names.has_truncated_names) + init_truncated_names(m_face_names, m_gui_cfg->face_name_max_width); + + if (m_face_names.texture_id == 0) + init_font_name_texture(); + + for (FaceName &face : m_face_names.faces) { + const wxString &wx_face_name = face.wx_name; + size_t index = &face - &m_face_names.faces.front(); + + // Filter for face names + if (m_face_names.hide[index]) + continue; + + ImGui::PushID(index); + ScopeGuard sg([]() { ImGui::PopID(); }); + bool is_selected = (actual_face_name == wx_face_name); + ImVec2 selectable_size(0, m_gui_cfg->face_name_size.y()); + ImGuiSelectableFlags flags = 0; + if (ImGui::Selectable(face.name_truncated.c_str(), is_selected, flags, selectable_size)) { + if (!select_facename(wx_face_name)) { + del_index = index; + wxMessageBox(GUI::format(_L("Font face \"%1%\" can't be selected."), wx_face_name)); + } + } + // tooltip as full name of font face + if (ImGui::IsItemHovered()) + ImGui::SetTooltip("%s", wx_face_name.ToUTF8().data()); + + // on first draw set focus on selected font + if (set_selection_focus && is_selected) + ImGui::SetScrollHereY(); + draw_font_preview(face, ImGui::IsItemVisible()); + } + + if (!ImGui::IsWindowFocused() || + (!is_input_text_active && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Escape)))) { + // closing of popup + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); + } else if (m_face_names.is_init) { + // Just one after close combo box + // free texture and set id to zero + m_face_names.is_init = false; + m_face_names.hide.clear(); + // cancel all process for generation of texture + for (FaceName &face : m_face_names.faces) + if (face.cancel != nullptr) + face.cancel->store(true); + glsafe(::glDeleteTextures(1, &m_face_names.texture_id)); + m_face_names.texture_id = 0; + + // Remove value from search input + ImGuiWrapper::left_inputs(); + m_face_names.search.clear(); + } + + // delete unloadable face name when try to use + if (del_index.has_value()) { + auto face = m_face_names.faces.begin() + (*del_index); + std::vector& bad = m_face_names.bad; + // sorted insert into bad fonts + auto it = std::upper_bound(bad.begin(), bad.end(), face->wx_name); + bad.insert(it, face->wx_name); + m_face_names.faces.erase(face); + // update cached file + store(m_face_names); + } + +#ifdef ALLOW_ADD_FONT_BY_FILE + ImGui::SameLine(); + // select font file by file browser + if (draw_button(IconType::open_file)) { + if (choose_true_type_file()) { + process(); + } + } else if (ImGui::IsItemHovered()) + ImGui::SetTooltip("Add file with font(.ttf, .ttc)"); +#endif // ALLOW_ADD_FONT_BY_FILE + +#ifdef ALLOW_ADD_FONT_BY_OS_SELECTOR + ImGui::SameLine(); + if (draw_button(IconType::system_selector)) { + if (choose_font_by_wxdialog()) { + process(); + } + } else if (ImGui::IsItemHovered()) + ImGui::SetTooltip("Open dialog for choose from fonts."); +#endif // ALLOW_ADD_FONT_BY_OS_SELECTOR + +} + +void GLGizmoEmboss::draw_model_type() +{ + bool is_last_solid_part = m_volume->is_the_only_one_part(); + std::string title = _u8L("Operation"); + if (is_last_solid_part) { + ImVec4 color{.5f, .5f, .5f, 1.f}; + m_imgui->text_colored(color, title.c_str()); + } else { + ImGui::Text("%s", title.c_str()); + } + + std::optional new_type; + ModelVolumeType modifier = ModelVolumeType::PARAMETER_MODIFIER; + ModelVolumeType negative = ModelVolumeType::NEGATIVE_VOLUME; + ModelVolumeType part = ModelVolumeType::MODEL_PART; + ModelVolumeType type = m_volume->type(); + + //TRN EmbossOperation + if (ImGui::RadioButton(_u8L("Join").c_str(), type == part)) + new_type = part; + else if (ImGui::IsItemHovered()) + ImGui::SetTooltip("%s", _u8L("Click to change text into object part.").c_str()); + ImGui::SameLine(); + + std::string last_solid_part_hint = _u8L("You can't change a type of the last solid part of the object."); + if (ImGui::RadioButton(_CTX_utf8(L_CONTEXT("Cut", "EmbossOperation"), "EmbossOperation").c_str(), type == negative)) + new_type = negative; + else if (ImGui::IsItemHovered()) { + if (is_last_solid_part) + ImGui::SetTooltip("%s", last_solid_part_hint.c_str()); + else if (type != negative) + ImGui::SetTooltip("%s", _u8L("Click to change part type into negative volume.").c_str()); + } + + // In simple mode are not modifiers + if (wxGetApp().plater()->printer_technology() != ptSLA && wxGetApp().get_mode() != ConfigOptionMode::comSimple) { + ImGui::SameLine(); + if (ImGui::RadioButton(_u8L("Modifier").c_str(), type == modifier)) + new_type = modifier; + else if (ImGui::IsItemHovered()) { + if (is_last_solid_part) + ImGui::SetTooltip("%s", last_solid_part_hint.c_str()); + else if (type != modifier) + ImGui::SetTooltip("%s", _u8L("Click to change part type into modifier.").c_str()); + } + } + + if (m_volume != nullptr && new_type.has_value() && !is_last_solid_part) { + GUI_App &app = wxGetApp(); + Plater * plater = app.plater(); + Plater::TakeSnapshot snapshot(plater, _L("Change Text Type"), UndoRedo::SnapshotType::GizmoAction); + m_volume->set_type(*new_type); + + // Update volume position when switch from part or into part + if (m_volume->text_configuration->style.prop.use_surface) { + // move inside + bool is_volume_move_inside = (type == part); + bool is_volume_move_outside = (*new_type == part); + if (is_volume_move_inside || is_volume_move_outside) process(); + } + + // inspiration in ObjectList::change_part_type() + // how to view correct side panel with objects + ObjectList *obj_list = app.obj_list(); + wxDataViewItemArray sel = obj_list->reorder_volumes_and_get_selection( + obj_list->get_selected_obj_idx(), + [volume = m_volume](const ModelVolume *vol) { return vol == volume; }); + if (!sel.IsEmpty()) obj_list->select_item(sel.front()); + + // NOTE: on linux, function reorder_volumes_and_get_selection call GLCanvas3D::reload_scene(refresh_immediately = false) + // which discard m_volume pointer and set it to nullptr also selection is cleared so gizmo is automaticaly closed + auto &mng = m_parent.get_gizmos_manager(); + if (mng.get_current_type() != GLGizmosManager::Emboss) + mng.open_gizmo(GLGizmosManager::Emboss); + // TODO: select volume back - Ask @Sasa + } +} + +void GLGizmoEmboss::draw_style_rename_popup() { + std::string& new_name = m_style_manager.get_style().name; + const std::string &old_name = m_style_manager.get_stored_style()->name; + std::string text_in_popup = GUI::format(_L("Rename style(%1%) for embossing text"), old_name) + ": "; + ImGui::Text("%s", text_in_popup.c_str()); + + bool is_unique = true; + for (const auto &item : m_style_manager.get_styles()) { + const EmbossStyle &style = item.style; + if (&style == &m_style_manager.get_style()) + continue; // could be same as original name + if (style.name == new_name) is_unique = false; + } + bool allow_change = false; + if (new_name.empty()) { + m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_DARK, _u8L("Name can't be empty.")); + }else if (!is_unique) { + m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_DARK, _u8L("Name has to be unique.")); + } else { + ImGui::NewLine(); + allow_change = true; + } + + bool store = false; + ImGuiInputTextFlags flags = ImGuiInputTextFlags_EnterReturnsTrue; + if (ImGui::InputText("##rename style", &new_name, flags) && allow_change) store = true; + if (m_imgui->button(_L("OK"), ImVec2(0.f, 0.f), allow_change)) store = true; + ImGui::SameLine(); + if (ImGui::Button(_u8L("Cancel").c_str())) { + new_name = old_name; + ImGui::CloseCurrentPopup(); + } + + if (store) { + // rename style in all objects and volumes + for (ModelObject *mo :wxGetApp().plater()->model().objects) { + for (ModelVolume *mv : mo->volumes) { + if (!mv->text_configuration.has_value()) continue; + std::string& name = mv->text_configuration->style.name; + if (name != old_name) continue; + name = new_name; + } + } + + m_style_manager.rename(new_name); + m_style_manager.store_styles_to_app_config(); + ImGui::CloseCurrentPopup(); + } +} + +void GLGizmoEmboss::draw_style_rename_button() +{ + bool can_rename = m_style_manager.exist_stored_style(); + std::string title = _u8L("Rename style"); + const char * popup_id = title.c_str(); + if (priv::draw_button(m_icons, IconType::rename, !can_rename)) { + assert(m_style_manager.get_stored_style()); + ImGui::OpenPopup(popup_id); + } + else if (ImGui::IsItemHovered()) { + if (can_rename) ImGui::SetTooltip("%s", _u8L("Rename current style.").c_str()); + else ImGui::SetTooltip("%s", _u8L("Can't rename temporary style.").c_str()); + } + if (ImGui::BeginPopupModal(popup_id, 0, ImGuiWindowFlags_AlwaysAutoResize)) { + m_imgui->disable_background_fadeout_animation(); + draw_style_rename_popup(); + ImGui::EndPopup(); + } +} + +void GLGizmoEmboss::draw_style_save_button(bool is_modified) +{ + if (draw_button(m_icons, IconType::save, !is_modified)) { + // save styles to app config + m_style_manager.store_styles_to_app_config(); + }else if (ImGui::IsItemHovered()) { + std::string tooltip; + if (!m_style_manager.exist_stored_style()) { + tooltip = _u8L("First Add style to list."); + } else if (is_modified) { + tooltip = GUI::format(_L("Save %1% style"), m_style_manager.get_style().name); + } else { + tooltip = _u8L("No changes to save."); + } + ImGui::SetTooltip("%s", tooltip.c_str()); + } +} + +void GLGizmoEmboss::draw_style_save_as_popup() { + ImGui::Text("%s", (_u8L("New name of style") +": ").c_str()); + + // use name inside of volume configuration as temporary new name + std::string &new_name = m_volume->text_configuration->style.name; + + bool is_unique = true; + for (const auto &item : m_style_manager.get_styles()) + if (item.style.name == new_name) is_unique = false; + + bool allow_change = false; + if (new_name.empty()) { + m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_DARK, _u8L("Name can't be empty.")); + }else if (!is_unique) { + m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_DARK, _u8L("Name has to be unique.")); + } else { + ImGui::NewLine(); + allow_change = true; + } + + bool save_style = false; + ImGuiInputTextFlags flags = ImGuiInputTextFlags_EnterReturnsTrue; + if (ImGui::InputText("##save as style", &new_name, flags)) + save_style = true; + + if (m_imgui->button(_L("OK"), ImVec2(0.f, 0.f), allow_change)) + save_style = true; + + ImGui::SameLine(); + if (ImGui::Button(_u8L("Cancel").c_str())){ + // write original name to volume TextConfiguration + new_name = m_style_manager.get_style().name; + ImGui::CloseCurrentPopup(); + } + + if (save_style && allow_change) { + m_style_manager.add_style(new_name); + m_style_manager.store_styles_to_app_config(); + ImGui::CloseCurrentPopup(); + } +} + +void GLGizmoEmboss::draw_style_add_button() +{ + bool only_add_style = !m_style_manager.exist_stored_style(); + bool can_add = true; + if (only_add_style && + m_volume->text_configuration->style.type != WxFontUtils::get_actual_type()) + can_add = false; + + std::string title = _u8L("Save as new style"); + const char *popup_id = title.c_str(); + // save as new style + ImGui::SameLine(); + if (draw_button(m_icons, IconType::add, !can_add)) { + if (!m_style_manager.exist_stored_style()) { + m_style_manager.store_styles_to_app_config(wxGetApp().app_config); + } else { + ImGui::OpenPopup(popup_id); + } + } else if (ImGui::IsItemHovered()) { + if (!can_add) { + ImGui::SetTooltip("%s", _u8L("Only valid font can be added to style.").c_str()); + }else if (only_add_style) { + ImGui::SetTooltip("%s", _u8L("Add style to my list.").c_str()); + } else { + ImGui::SetTooltip("%s", _u8L("Save as new style.").c_str()); + } + } + + if (ImGui::BeginPopupModal(popup_id, 0, ImGuiWindowFlags_AlwaysAutoResize)) { + m_imgui->disable_background_fadeout_animation(); + draw_style_save_as_popup(); + ImGui::EndPopup(); + } +} + +void GLGizmoEmboss::draw_delete_style_button() { + bool is_stored = m_style_manager.exist_stored_style(); + bool is_last = m_style_manager.get_styles().size() == 1; + bool can_delete = is_stored && !is_last; + + if (draw_button(m_icons, IconType::erase, !can_delete)) { + std::string style_name = m_style_manager.get_style().name; // copy + wxString dialog_title = _L("Remove style"); + size_t next_style_index = std::numeric_limits::max(); + Plater *plater = wxGetApp().plater(); + bool exist_change = false; + while (true) { + // NOTE: can't use previous loaded activ index -> erase could change index + size_t active_index = m_style_manager.get_style_index(); + next_style_index = (active_index > 0) ? active_index - 1 : + active_index + 1; + + if (next_style_index >= m_style_manager.get_styles().size()) { + MessageDialog msg(plater, _L("Can't remove the last exising style."), dialog_title, wxICON_ERROR | wxOK); + msg.ShowModal(); + break; + } + + // IMPROVE: add function can_load? + // clean unactivable styles + if (!m_style_manager.load_style(next_style_index)) { + m_style_manager.erase(next_style_index); + exist_change = true; + continue; + } + + wxString message = GUI::format_wxstr(_L("Are you sure,\nthat you want permanently and unrecoverable \nremove \"%1%\" style?"), style_name); + MessageDialog msg(plater, message, dialog_title, wxICON_WARNING | wxYES | wxNO); + if (msg.ShowModal() == wxID_YES) { + // delete style + m_style_manager.erase(active_index); + exist_change = true; + process(); + } else { + // load back style + m_style_manager.load_style(active_index); + } + break; + } + if (exist_change) + m_style_manager.store_styles_to_app_config(wxGetApp().app_config); + } + + if (ImGui::IsItemHovered()) { + const std::string &style_name = m_style_manager.get_style().name; + std::string tooltip; + if (can_delete) tooltip = GUI::format(_L("Delete \"%1%\" style."), style_name); + else if (is_last) tooltip = GUI::format(_L("Can't delete \"%1%\". It is last style."), style_name); + else/*if(!is_stored)*/ tooltip = GUI::format(_L("Can't delete temporary style \"%1%\"."), style_name); + ImGui::SetTooltip("%s", tooltip.c_str()); + } +} + +// FIX IT: it should not change volume position before successfull change +void GLGizmoEmboss::fix_transformation(const FontProp &from, + const FontProp &to) +{ + // fix Z rotation when exists difference in styles + const std::optional &f_angle_opt = from.angle; + const std::optional &t_angle_opt = to.angle; + if (!is_approx(f_angle_opt, t_angle_opt)) { + // fix rotation + float f_angle = f_angle_opt.has_value() ? *f_angle_opt : .0f; + float t_angle = t_angle_opt.has_value() ? *t_angle_opt : .0f; + do_rotate(t_angle - f_angle); + } + + // fix distance (Z move) when exists difference in styles + const std::optional &f_move_opt = from.distance; + const std::optional &t_move_opt = to.distance; + if (!is_approx(f_move_opt, t_move_opt)) { + float f_move = f_move_opt.has_value() ? *f_move_opt : .0f; + float t_move = t_move_opt.has_value() ? *t_move_opt : .0f; + do_translate(Vec3d::UnitZ() * (t_move - f_move)); + } +} + +void GLGizmoEmboss::draw_style_list() { + if (!m_style_manager.is_active_font()) return; + + const EmbossStyle *stored_style = nullptr; + bool is_stored = m_style_manager.exist_stored_style(); + if (is_stored) + stored_style = m_style_manager.get_stored_style(); + const EmbossStyle &actual_style = m_style_manager.get_style(); + bool is_changed = (stored_style)? !(*stored_style == actual_style) : true; + bool is_modified = is_stored && is_changed; + + const float &max_style_name_width = m_gui_cfg->max_style_name_width; + std::string &trunc_name = m_style_manager.get_truncated_name(); + if (trunc_name.empty()) { + // generate trunc name + std::string current_name = actual_style.name; + ImGuiWrapper::escape_double_hash(current_name); + trunc_name = ImGuiWrapper::trunc(current_name, max_style_name_width); + } + + std::string title = _u8L("Styles"); + if (m_style_manager.exist_stored_style()) + ImGui::Text("%s", title.c_str()); + else + ImGui::TextColored(ImGuiWrapper::COL_ORANGE_LIGHT, "%s", title.c_str()); + + ImGui::SetNextItemWidth(m_gui_cfg->input_width); + auto add_text_modify = [&is_modified](const std::string& name) { + if (!is_modified) return name; + return name + Preset::suffix_modified(); + }; + std::optional selected_style_index; + if (ImGui::BeginCombo("##style_selector", add_text_modify(trunc_name).c_str())) { + m_style_manager.init_style_images(m_gui_cfg->max_style_image_size, m_text); + m_style_manager.init_trunc_names(max_style_name_width); + std::optional> swap_indexes; + const std::vector &styles = m_style_manager.get_styles(); + for (const auto &item : styles) { + size_t index = &item - &styles.front(); + const EmbossStyle &style = item.style; + const std::string &actual_style_name = style.name; + ImGui::PushID(actual_style_name.c_str()); + bool is_selected = (index == m_style_manager.get_style_index()); + + ImVec2 select_size(0,m_gui_cfg->max_style_image_size.y()); // 0,0 --> calculate in draw + const std::optional &img = item.image; + // allow click delete button + ImGuiSelectableFlags_ flags = ImGuiSelectableFlags_AllowItemOverlap; + if (ImGui::Selectable(item.truncated_name.c_str(), is_selected, flags, select_size)) { + selected_style_index = index; + } else if (ImGui::IsItemHovered()) + ImGui::SetTooltip("%s", actual_style_name.c_str()); + + // reorder items + if (ImGui::IsItemActive() && !ImGui::IsItemHovered()) { + if (ImGui::GetMouseDragDelta(0).y < 0.f) { + if (index > 0) + swap_indexes = {index, index - 1}; + } else if ((index + 1) < styles.size()) + swap_indexes = {index, index + 1}; + if (swap_indexes.has_value()) + ImGui::ResetMouseDragDelta(); + } + + // draw style name + if (img.has_value()) { + ImGui::SameLine(max_style_name_width); + ImGui::Image(img->texture_id, img->tex_size, img->uv0, img->uv1); + } + + ImGui::PopID(); + } + if (swap_indexes.has_value()) + m_style_manager.swap(swap_indexes->first, + swap_indexes->second); + ImGui::EndCombo(); + } else { + // do not keep in memory style images when no combo box open + m_style_manager.free_style_images(); + if (ImGui::IsItemHovered()) { + std::string style_name = add_text_modify(actual_style.name); + std::string tooltip = is_modified? + GUI::format(_L("Modified style \"%1%\""), actual_style.name): + GUI::format(_L("Current style is \"%1%\""), actual_style.name); + ImGui::SetTooltip(" %s", tooltip.c_str()); + } + } + + // Check whether user wants lose actual style modification + if (selected_style_index.has_value() && is_modified) { + wxString title = _L("Style modification will be lost."); + const EmbossStyle &style = m_style_manager.get_styles()[*selected_style_index].style; + wxString message = GUI::format_wxstr(_L("Changing style to '%1%' will discard current style modification.\n\n Would you like to continue anyway?"), style.name); + MessageDialog not_loaded_style_message(nullptr, message, title, wxICON_WARNING | wxYES|wxNO); + if (not_loaded_style_message.ShowModal() != wxID_YES) + selected_style_index.reset(); + } + + // selected style from combo box + if (selected_style_index.has_value()) { + const EmbossStyle &style = m_style_manager.get_styles()[*selected_style_index].style; + // create copy to be able do fix transformation only when successfully load style + FontProp act_prop = actual_style.prop; // copy + FontProp new_prop = style.prop; // copy + if (m_style_manager.load_style(*selected_style_index)) { + fix_transformation(act_prop, new_prop); + process(); + } else { + wxString title = _L("Not valid style."); + wxString message = GUI::format_wxstr(_L("Style '%1%' can't be used and will be removed from a list."), style.name); + MessageDialog not_loaded_style_message(nullptr, message, title, wxOK); + not_loaded_style_message.ShowModal(); + m_style_manager.erase(*selected_style_index); + } + } + + ImGui::SameLine(); + draw_style_rename_button(); + + ImGui::SameLine(); + draw_style_save_button(is_modified); + + ImGui::SameLine(); + draw_style_add_button(); + + // delete button + ImGui::SameLine(); + draw_delete_style_button(); +} + +bool GLGizmoEmboss::draw_italic_button() +{ + const wxFont &wx_font = m_style_manager.get_wx_font(); + const auto& ff = m_style_manager.get_font_file_with_cache(); + if (!wx_font.IsOk() || !ff.has_value()) { + draw(get_icon(m_icons, IconType::italic, IconState::disabled)); + return false; + } + + std::optional &skew = m_style_manager.get_font_prop().skew; + bool is_font_italic = skew.has_value() || WxFontUtils::is_italic(wx_font); + if (is_font_italic) { + // unset italic + if (clickable(get_icon(m_icons, IconType::italic, IconState::hovered), + get_icon(m_icons, IconType::unitalic, IconState::hovered))) { + skew.reset(); + if (wx_font.GetStyle() != wxFontStyle::wxFONTSTYLE_NORMAL) { + wxFont new_wx_font = wx_font; // copy + new_wx_font.SetStyle(wxFontStyle::wxFONTSTYLE_NORMAL); + if(!m_style_manager.set_wx_font(new_wx_font)) + return false; + } + return true; + } + if (ImGui::IsItemHovered()) + ImGui::SetTooltip("%s", _u8L("Unset italic").c_str()); + } else { + // set italic + if (draw_button(m_icons, IconType::italic)) { + wxFont new_wx_font = wx_font; // copy + auto new_ff = WxFontUtils::set_italic(new_wx_font, *ff.font_file); + if (new_ff != nullptr) { + if(!m_style_manager.set_wx_font(new_wx_font, std::move(new_ff))) + return false; + } else { + // italic font doesn't exist + // add skew when wxFont can't set it + skew = 0.2f; + } + return true; + } + if (ImGui::IsItemHovered()) + ImGui::SetTooltip("%s", _u8L("Set italic").c_str()); + } + return false; +} + +bool GLGizmoEmboss::draw_bold_button() { + const wxFont &wx_font = m_style_manager.get_wx_font(); + const auto& ff = m_style_manager.get_font_file_with_cache(); + if (!wx_font.IsOk() || !ff.has_value()) { + draw(get_icon(m_icons, IconType::bold, IconState::disabled)); + return false; + } + + std::optional &boldness = m_style_manager.get_font_prop().boldness; + bool is_font_bold = boldness.has_value() || WxFontUtils::is_bold(wx_font); + if (is_font_bold) { + // unset bold + if (clickable(get_icon(m_icons, IconType::bold, IconState::hovered), + get_icon(m_icons, IconType::unbold, IconState::hovered))) { + boldness.reset(); + if (wx_font.GetWeight() != wxFontWeight::wxFONTWEIGHT_NORMAL) { + wxFont new_wx_font = wx_font; // copy + new_wx_font.SetWeight(wxFontWeight::wxFONTWEIGHT_NORMAL); + if(!m_style_manager.set_wx_font(new_wx_font)) + return false; + } + return true; + } + if (ImGui::IsItemHovered()) + ImGui::SetTooltip("%s", _u8L("Unset bold").c_str()); + } else { + // set bold + if (draw_button(m_icons, IconType::bold)) { + wxFont new_wx_font = wx_font; // copy + auto new_ff = WxFontUtils::set_bold(new_wx_font, *ff.font_file); + if (new_ff != nullptr) { + if(!m_style_manager.set_wx_font(new_wx_font, std::move(new_ff))) + return false; + } else { + // bold font can't be loaded + // set up boldness + boldness = 20.f; + //font_file->cache.empty(); + } + return true; + } + if (ImGui::IsItemHovered()) + ImGui::SetTooltip("%s", _u8L("Set bold").c_str()); + } + return false; +} + +template bool exist_change(const T &value, const T *default_value){ + if (default_value == nullptr) return false; + return (value != *default_value); +} + +template<> bool exist_change(const std::optional &value, const std::optional *default_value){ + if (default_value == nullptr) return false; + return !is_approx(value, *default_value); +} + +template<> bool exist_change(const float &value, const float *default_value){ + if (default_value == nullptr) return false; + return !is_approx(value, *default_value); +} + +template +bool GLGizmoEmboss::revertible(const std::string &name, + T &value, + const T *default_value, + const std::string &undo_tooltip, + float undo_offset, + Draw draw) +{ + bool changed = exist_change(value, default_value); + if (changed || default_value == nullptr) + ImGuiWrapper::text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, name); + else + ImGuiWrapper::text(name); + + bool result = draw(); + // render revert changes button + if (changed) { + ImGui::SameLine(undo_offset); + if (draw_button(m_icons, IconType::undo)) { + value = *default_value; + return true; + } else if (ImGui::IsItemHovered()) + ImGui::SetTooltip("%s", undo_tooltip.c_str()); + } + return result; +} + + +bool GLGizmoEmboss::rev_input(const std::string &name, + float &value, + const float *default_value, + const std::string &undo_tooltip, + float step, + float step_fast, + const char *format, + ImGuiInputTextFlags flags) +{ + // draw offseted input + auto draw_offseted_input = [&]()->bool{ + float input_offset = m_gui_cfg->input_offset; + float input_width = m_gui_cfg->input_width; + ImGui::SameLine(input_offset); + ImGui::SetNextItemWidth(input_width); + return ImGui::InputFloat(("##" + name).c_str(), + &value, step, step_fast, format, flags); + }; + float undo_offset = ImGui::GetStyle().FramePadding.x; + return revertible(name, value, default_value, undo_tooltip, undo_offset, draw_offseted_input); +} + +bool GLGizmoEmboss::rev_input_mm(const std::string &name, + float &value, + const float *default_value_ptr, + const std::string &undo_tooltip, + float step, + float step_fast, + const char *format, + bool use_inch, + const std::optional& scale) +{ + // _variable which temporary keep value + float value_ = value; + float default_value_; + if (use_inch) { + // calc value in inch + value_ *= ObjectManipulation::mm_to_in; + if (default_value_ptr) { + default_value_ = ObjectManipulation::mm_to_in * (*default_value_ptr); + default_value_ptr = &default_value_; + } + } + if (scale.has_value()) + value_ *= *scale; + bool use_correction = use_inch || scale.has_value(); + if (rev_input(name, use_correction ? value_ : value, default_value_ptr, undo_tooltip, step, step_fast, format)) { + if (use_correction) { + value = value_; + if (use_inch) + value *= ObjectManipulation::in_to_mm; + if (scale.has_value()) + value /= *scale; + } + return true; + } + return false; +} + +bool GLGizmoEmboss::rev_checkbox(const std::string &name, + bool &value, + const bool *default_value, + const std::string &undo_tooltip) +{ + // draw offseted input + auto draw_offseted_input = [&]() -> bool { + ImGui::SameLine(m_gui_cfg->advanced_input_offset); + return ImGui::Checkbox(("##" + name).c_str(), &value); + }; + float undo_offset = ImGui::GetStyle().FramePadding.x; + return revertible(name, value, default_value, undo_tooltip, + undo_offset, draw_offseted_input); +} + +bool GLGizmoEmboss::set_height() { + float &value = m_style_manager.get_style().prop.size_in_mm; + + // size can't be zero or negative + priv::Limits::apply(value, priv::limits.size_in_mm); + + if (m_volume == nullptr || !m_volume->text_configuration.has_value()) { + assert(false); + return false; + } + + // only different value need process + if (is_approx(value, m_volume->text_configuration->style.prop.size_in_mm)) + return false; + +#ifdef USE_PIXEL_SIZE_IN_WX_FONT + // store font size into path serialization + const wxFont &wx_font = m_style_manager.get_wx_font(); + if (wx_font.IsOk()) { + wxFont wx_font_new = wx_font; // copy + wx_font_new.SetPointSize(static_cast(value)); + m_style_manager.set_wx_font(wx_font_new); + } +#endif + return true; +} + +void GLGizmoEmboss::draw_height(bool use_inch) +{ + float &value = m_style_manager.get_style().prop.size_in_mm; + const EmbossStyle* stored_style = m_style_manager.get_stored_style(); + const float *stored = (stored_style != nullptr)? &stored_style->prop.size_in_mm : nullptr; + const char *size_format = use_inch ? "%.2f in" : "%.1f mm"; + const std::string revert_text_size = _u8L("Revert text size."); + const std::string& name = m_gui_cfg->translations.height; + if (rev_input_mm(name, value, stored, revert_text_size, 0.1f, 1.f, size_format, use_inch, m_scale_height)) + if (set_height()) + process(); +} + +bool GLGizmoEmboss::set_depth() +{ + float &value = m_style_manager.get_style().prop.emboss; + + // size can't be zero or negative + priv::Limits::apply(value, priv::limits.emboss); + + // only different value need process + return !is_approx(value, m_volume->text_configuration->style.prop.emboss); +} + +void GLGizmoEmboss::draw_depth(bool use_inch) +{ + float &value = m_style_manager.get_style().prop.emboss; + const EmbossStyle* stored_style = m_style_manager.get_stored_style(); + const float *stored = ((stored_style)? &stored_style->prop.emboss : nullptr); + const std::string revert_emboss_depth = _u8L("Revert embossed depth."); + const char *size_format = ((use_inch) ? "%.3f in" : "%.2f mm"); + const std::string name = m_gui_cfg->translations.depth; + if (rev_input_mm(name, value, stored, revert_emboss_depth, 0.1f, 1.f, size_format, use_inch, m_scale_depth)) + if (set_depth()) + process(); +} + +bool GLGizmoEmboss::rev_slider(const std::string &name, + std::optional& value, + const std::optional *default_value, + const std::string &undo_tooltip, + int v_min, + int v_max, + const std::string& format, + const wxString &tooltip) +{ + auto draw_slider_optional_int = [&]() -> bool { + float slider_offset = m_gui_cfg->advanced_input_offset; + float slider_width = m_gui_cfg->input_width; + ImGui::SameLine(slider_offset); + ImGui::SetNextItemWidth(slider_width); + return m_imgui->slider_optional_int( ("##" + name).c_str(), value, + v_min, v_max, format.c_str(), 1.f, false, tooltip); + }; + float undo_offset = ImGui::GetStyle().FramePadding.x; + return revertible(name, value, default_value, + undo_tooltip, undo_offset, draw_slider_optional_int); +} + +bool GLGizmoEmboss::rev_slider(const std::string &name, + std::optional& value, + const std::optional *default_value, + const std::string &undo_tooltip, + float v_min, + float v_max, + const std::string& format, + const wxString &tooltip) +{ + auto draw_slider_optional_float = [&]() -> bool { + float slider_offset = m_gui_cfg->advanced_input_offset; + float slider_width = m_gui_cfg->input_width; + ImGui::SameLine(slider_offset); + ImGui::SetNextItemWidth(slider_width); + return m_imgui->slider_optional_float(("##" + name).c_str(), value, + v_min, v_max, format.c_str(), 1.f, false, tooltip); + }; + float undo_offset = ImGui::GetStyle().FramePadding.x; + return revertible(name, value, default_value, + undo_tooltip, undo_offset, draw_slider_optional_float); +} + +bool GLGizmoEmboss::rev_slider(const std::string &name, + float &value, + const float *default_value, + const std::string &undo_tooltip, + float v_min, + float v_max, + const std::string &format, + const wxString &tooltip) +{ + auto draw_slider_float = [&]() -> bool { + float slider_offset = m_gui_cfg->advanced_input_offset; + float slider_width = m_gui_cfg->input_width; + ImGui::SameLine(slider_offset); + ImGui::SetNextItemWidth(slider_width); + return m_imgui->slider_float("##" + name, &value, v_min, v_max, + format.c_str(), 1.f, false, tooltip); + }; + float undo_offset = ImGui::GetStyle().FramePadding.x; + return revertible(name, value, default_value, + undo_tooltip, undo_offset, draw_slider_float); +} + +void GLGizmoEmboss::do_translate(const Vec3d &relative_move) +{ + assert(m_volume != nullptr); + assert(m_volume->text_configuration.has_value()); + Selection &selection = m_parent.get_selection(); + assert(!selection.is_empty()); + selection.setup_cache(); + selection.translate(relative_move, TransformationType::Local); + + std::string snapshot_name; // empty mean no store undo / redo + // NOTE: it use L instead of _L macro because prefix _ is appended inside + // function do_move + // snapshot_name = L("Set surface distance"); + m_parent.do_move(snapshot_name); +} + +void GLGizmoEmboss::do_rotate(float relative_z_angle) +{ + assert(m_volume != nullptr); + assert(m_volume->text_configuration.has_value()); + Selection &selection = m_parent.get_selection(); + assert(!selection.is_empty()); + selection.setup_cache(); + TransformationType transformation_type = TransformationType::Local_Relative_Joint; + selection.rotate(Vec3d(0., 0., relative_z_angle), transformation_type); + + std::string snapshot_name; // empty meand no store undo / redo + // NOTE: it use L instead of _L macro because prefix _ is appended + // inside function do_move + // snapshot_name = L("Set text rotation"); + m_parent.do_rotate(snapshot_name); +} + +void GLGizmoEmboss::draw_advanced() +{ + const auto &ff = m_style_manager.get_font_file_with_cache(); + if (!ff.has_value()) { + ImGui::Text("%s", _u8L("Advanced font options could be changed only for correct font.\n" + "Start with select correct font.").c_str()); + return; + } + + FontProp &font_prop = m_style_manager.get_style().prop; + const auto &cn = m_style_manager.get_font_prop().collection_number; + unsigned int font_index = (cn.has_value()) ? *cn : 0; + const auto &font_info = ff.font_file->infos[font_index]; + +#ifdef SHOW_FONT_FILE_PROPERTY + ImGui::SameLine(); + int cache_size = ff.has_value()? (int)ff.cache->size() : 0; + std::string ff_property = + "ascent=" + std::to_string(font_info.ascent) + + ", descent=" + std::to_string(font_info.descent) + + ", lineGap=" + std::to_string(font_info.linegap) + + ", unitPerEm=" + std::to_string(font_info.unit_per_em) + + ", cache(" + std::to_string(cache_size) + " glyphs)"; + if (font_file->infos.size() > 1) { + unsigned int collection = font_prop.collection_number.has_value() ? + *font_prop.collection_number : 0; + ff_property += ", collect=" + std::to_string(collection+1) + "/" + std::to_string(font_file->infos.size()); + } + m_imgui->text_colored(ImGuiWrapper::COL_GREY_DARK, ff_property); +#endif // SHOW_FONT_FILE_PROPERTY + + bool exist_change = false; + auto &tr = m_gui_cfg->translations; + + const EmbossStyle *stored_style = nullptr; + if (m_style_manager.exist_stored_style()) + stored_style = m_style_manager.get_stored_style(); + + bool can_use_surface = (m_volume==nullptr)? false : + (font_prop.use_surface)? true : // already used surface must have option to uncheck + (m_volume->get_object()->volumes.size() > 1); + m_imgui->disabled_begin(!can_use_surface); + const bool *def_use_surface = stored_style ? + &stored_style->prop.use_surface : nullptr; + if (rev_checkbox(tr.use_surface, font_prop.use_surface, def_use_surface, + _u8L("Revert using of model surface."))) { + if (font_prop.use_surface) { + // when using surface distance is not used + font_prop.distance.reset(); + + // there should be minimal embossing depth + if (font_prop.emboss < 0.1) + font_prop.emboss = 1; + } + process(); + } + m_imgui->disabled_end(); // !can_use_surface + // TRN EmbossGizmo: font units + std::string units = _u8L("points"); + std::string units_fmt = "%.0f " + units; + + // input gap between characters + auto def_char_gap = stored_style ? + &stored_style->prop.char_gap : nullptr; + + int half_ascent = font_info.ascent / 2; + int min_char_gap = -half_ascent, max_char_gap = half_ascent; + if (rev_slider(tr.char_gap, font_prop.char_gap, def_char_gap, _u8L("Revert gap between characters"), + min_char_gap, max_char_gap, units_fmt, _L("Distance between characters"))){ + // Condition prevent recalculation when insertint out of limits value by imgui input + if (!priv::Limits::apply(font_prop.char_gap, priv::limits.char_gap) || + !m_volume->text_configuration->style.prop.char_gap.has_value() || + m_volume->text_configuration->style.prop.char_gap != font_prop.char_gap) { + // char gap is stored inside of imgui font atlas + m_style_manager.clear_imgui_font(); + exist_change = true; + } + } + + // input gap between lines + auto def_line_gap = stored_style ? + &stored_style->prop.line_gap : nullptr; + int min_line_gap = -half_ascent, max_line_gap = half_ascent; + if (rev_slider(tr.line_gap, font_prop.line_gap, def_line_gap, _u8L("Revert gap between lines"), + min_line_gap, max_line_gap, units_fmt, _L("Distance between lines"))){ + // Condition prevent recalculation when insertint out of limits value by imgui input + if (!priv::Limits::apply(font_prop.line_gap, priv::limits.line_gap) || + !m_volume->text_configuration->style.prop.line_gap.has_value() || + m_volume->text_configuration->style.prop.line_gap != font_prop.line_gap) { + // line gap is planed to be stored inside of imgui font atlas + m_style_manager.clear_imgui_font(); + exist_change = true; + } + } + + // input boldness + auto def_boldness = stored_style ? + &stored_style->prop.boldness : nullptr; + if (rev_slider(tr.boldness, font_prop.boldness, def_boldness, _u8L("Undo boldness"), + priv::limits.boldness.gui.min, priv::limits.boldness.gui.max, units_fmt, _L("Tiny / Wide glyphs"))){ + if (!priv::Limits::apply(font_prop.boldness, priv::limits.boldness.values) || + !m_volume->text_configuration->style.prop.boldness.has_value() || + m_volume->text_configuration->style.prop.boldness != font_prop.boldness) + exist_change = true; + } + + // input italic + auto def_skew = stored_style ? + &stored_style->prop.skew : nullptr; + if (rev_slider(tr.skew_ration, font_prop.skew, def_skew, _u8L("Undo letter's skew"), + priv::limits.skew.gui.min, priv::limits.skew.gui.max, "%.2f", _L("Italic strength ratio"))){ + if (!priv::Limits::apply(font_prop.skew, priv::limits.skew.values) || + !m_volume->text_configuration->style.prop.skew.has_value() || + m_volume->text_configuration->style.prop.skew != font_prop.skew) + exist_change = true; + } + + // input surface distance + bool allowe_surface_distance = + !m_volume->text_configuration->style.prop.use_surface && + !m_volume->is_the_only_one_part(); + std::optional &distance = font_prop.distance; + float prev_distance = distance.has_value() ? *distance : .0f, + min_distance = -2 * font_prop.emboss, + max_distance = 2 * font_prop.emboss; + auto def_distance = stored_style ? + &stored_style->prop.distance : nullptr; + m_imgui->disabled_begin(!allowe_surface_distance); + + const std::string undo_move_tooltip = _u8L("Undo translation"); + const wxString move_tooltip = _L("Distance of the center of the text to the model surface."); + bool is_moved = false; + bool use_inch = wxGetApp().app_config->get_bool("use_inches"); + if (use_inch) { + std::optional distance_inch; + if (distance.has_value()) distance_inch = (*distance * ObjectManipulation::mm_to_in); + std::optional def_distance_inch; + if (def_distance != nullptr) { + if (def_distance->has_value()) def_distance_inch = ObjectManipulation::mm_to_in * (*(*def_distance)); + def_distance = &def_distance_inch; + } + min_distance *= ObjectManipulation::mm_to_in; + max_distance *= ObjectManipulation::mm_to_in; + if (rev_slider(tr.from_surface, distance_inch, def_distance, undo_move_tooltip, min_distance, max_distance, "%.3f in", move_tooltip)) { + if (distance_inch.has_value()) { + font_prop.distance = *distance_inch * ObjectManipulation::in_to_mm; + } else { + font_prop.distance.reset(); + } + is_moved = true; + } + } else { + if (rev_slider(tr.from_surface, distance, def_distance, undo_move_tooltip, + min_distance, max_distance, "%.2f mm", move_tooltip)) is_moved = true; + } + + if (is_moved){ + m_volume->text_configuration->style.prop.distance = font_prop.distance; + float act_distance = font_prop.distance.has_value() ? *font_prop.distance : .0f; + do_translate(Vec3d::UnitZ() * (act_distance - prev_distance)); + } + m_imgui->disabled_end(); + + // slider for Clock-wise angle in degress + // stored angle is optional CCW and in radians + // Convert stored value to degress + // minus create clock-wise roation from CCW + const std::optional &angle_opt = m_style_manager.get_font_prop().angle; + float angle = angle_opt.has_value() ? *angle_opt: 0.f; + float angle_deg = static_cast(-angle * 180 / M_PI); + float def_angle_deg_val = + (!stored_style || !stored_style->prop.angle.has_value()) ? + 0.f : (*stored_style->prop.angle * -180 / M_PI); + float* def_angle_deg = stored_style ? + &def_angle_deg_val : nullptr; + if (rev_slider(tr.rotation, angle_deg, def_angle_deg, _u8L("Undo rotation"), + priv::limits.angle.min, priv::limits.angle.max, u8"%.2f °", + _L("Rotate text Clock-wise."))) { + // convert back to radians and CCW + float angle_rad = static_cast(-angle_deg * M_PI / 180.0); + priv::to_range_pi_pi(angle_rad); + + + float diff_angle = angle_rad - angle; + do_rotate(diff_angle); + + // calc angle after rotation + const GLVolume *gl_volume = get_selected_gl_volume(m_parent.get_selection()); + assert(gl_volume != nullptr); + assert(m_style_manager.is_active_font()); + if (m_style_manager.is_active_font() && gl_volume != nullptr) + m_style_manager.get_font_prop().angle = calc_up(gl_volume->world_matrix(), priv::up_limit); + + // recalculate for surface cut + if (font_prop.use_surface) + process(); + } + + // Keep up - lock button icon + ImGui::SameLine(m_gui_cfg->lock_offset); + const IconManager::Icon &icon = get_icon(m_icons, m_keep_up ? IconType::lock : IconType::unlock, IconState::activable); + const IconManager::Icon &icon_hover = get_icon(m_icons, m_keep_up ? IconType::lock_bold : IconType::unlock_bold, IconState::activable); + const IconManager::Icon &icon_disable = get_icon(m_icons, m_keep_up ? IconType::lock : IconType::unlock, IconState::disabled); + if (button(icon, icon_hover, icon_disable)) { + m_keep_up = !m_keep_up; + if (m_keep_up) { + // copy angle to volume + m_volume->text_configuration->style.prop.angle = font_prop.angle; + } + } + if (ImGui::IsItemHovered()) + ImGui::SetTooltip("%s", (m_keep_up? + _u8L("Unlock the text's rotation when moving text along the object's surface."): + _u8L("Lock the text's rotation when moving text along the object's surface.") + ).c_str()); + + // when more collection add selector + if (ff.font_file->infos.size() > 1) { + ImGui::Text("%s", tr.collection.c_str()); + ImGui::SameLine(m_gui_cfg->advanced_input_offset); + ImGui::SetNextItemWidth(m_gui_cfg->input_width); + unsigned int selected = font_prop.collection_number.has_value() ? + *font_prop.collection_number : 0; + if (ImGui::BeginCombo("## Font collection", std::to_string(selected).c_str())) { + for (unsigned int i = 0; i < ff.font_file->infos.size(); ++i) { + ImGui::PushID(1 << (10 + i)); + bool is_selected = (i == selected); + if (ImGui::Selectable(std::to_string(i).c_str(), is_selected)) { + if (i == 0) font_prop.collection_number.reset(); + else font_prop.collection_number = i; + exist_change = true; + } + ImGui::PopID(); + } + ImGui::EndCombo(); + } else if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("%s", _u8L("Select from True Type Collection.").c_str()); + } + } + + if (exist_change) { + m_style_manager.clear_glyphs_cache(); + process(); + } + + if (ImGui::Button(_u8L("Set text to face camera").c_str())) { + assert(get_selected_volume(m_parent.get_selection()) == m_volume); + const Camera &cam = wxGetApp().plater()->get_camera(); + bool use_surface = m_style_manager.get_style().prop.use_surface; + if (priv::apply_camera_dir(cam, m_parent) && use_surface) + process(); + } else if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("%s", _u8L("Use camera direction for text orientation").c_str()); + } +#ifdef ALLOW_DEBUG_MODE + ImGui::Text("family = %s", (font_prop.family.has_value() ? + font_prop.family->c_str() : + " --- ")); + ImGui::Text("face name = %s", (font_prop.face_name.has_value() ? + font_prop.face_name->c_str() : + " --- ")); + ImGui::Text("style = %s", + (font_prop.style.has_value() ? font_prop.style->c_str() : + " --- ")); + ImGui::Text("weight = %s", (font_prop.weight.has_value() ? + font_prop.weight->c_str() : + " --- ")); + + std::string descriptor = style.path; + ImGui::Text("descriptor = %s", descriptor.c_str()); +#endif // ALLOW_DEBUG_MODE +} + +void GLGizmoEmboss::set_minimal_window_size(bool is_advance_edit_style) +{ + ImVec2 window_size = ImGui::GetWindowSize(); + const ImVec2& min_win_size_prev = get_minimal_window_size(); + //ImVec2 diff(window_size.x - min_win_size_prev.x, + // window_size.y - min_win_size_prev.y); + float diff_y = window_size.y - min_win_size_prev.y; + m_is_advanced_edit_style = is_advance_edit_style; + const ImVec2 &min_win_size = get_minimal_window_size(); + ImGui::SetWindowSize(ImVec2(0.f, min_win_size.y + diff_y), + ImGuiCond_Always); + priv::change_window_position(m_set_window_offset, true); +} + +ImVec2 GLGizmoEmboss::get_minimal_window_size() const +{ + ImVec2 res; + if (!m_is_advanced_edit_style) + res = m_gui_cfg->minimal_window_size; + else if (!m_style_manager.has_collections()) + res = m_gui_cfg->minimal_window_size_with_advance; + else + res = m_gui_cfg->minimal_window_size_with_collections; + + bool is_object = m_volume->get_object()->volumes.size() == 1; + if (!is_object) + res.y += m_gui_cfg->height_of_volume_type_selector; + return res; +} + +#ifdef ALLOW_ADD_FONT_BY_OS_SELECTOR +bool GLGizmoEmboss::choose_font_by_wxdialog() +{ + wxFontData data; + data.EnableEffects(false); + data.RestrictSelection(wxFONTRESTRICT_SCALABLE); + // set previous selected font + EmbossStyle &selected_style = m_style_manager.get_style(); + if (selected_style.type == WxFontUtils::get_actual_type()) { + std::optional selected_font = WxFontUtils::load_wxFont( + selected_style.path); + if (selected_font.has_value()) data.SetInitialFont(*selected_font); + } + + wxFontDialog font_dialog(wxGetApp().mainframe, data); + if (font_dialog.ShowModal() != wxID_OK) return false; + + data = font_dialog.GetFontData(); + wxFont wx_font = data.GetChosenFont(); + size_t font_index = m_style_manager.get_fonts().size(); + EmbossStyle emboss_style = WxFontUtils::create_emboss_style(wx_font); + + // Check that deserialization NOT influence font + // false - use direct selected wxFont in dialog + // true - use font item (serialize and deserialize wxFont) + bool use_deserialized_font = false; + + // Try load and use new added font + if ((use_deserialized_font && !m_style_manager.load_style(font_index)) || + (!use_deserialized_font && !m_style_manager.load_style(emboss_style, wx_font))) { + m_style_manager.erase(font_index); + wxString message = GUI::format_wxstr( + "Font '%1%' can't be used. Please select another.", + emboss_style.name); + wxString title = "Selected font is NOT True-type."; + MessageDialog not_loaded_font_message(nullptr, message, title, wxOK); + not_loaded_font_message.ShowModal(); + return choose_font_by_wxdialog(); + } + + // fix dynamic creation of italic font + const auto& cn = m_style_manager.get_font_prop().collection_number; + unsigned int font_collection = cn.has_value() ? *cn : 0; + const auto&ff = m_style_manager.get_font_file_with_cache(); + if (WxFontUtils::is_italic(wx_font) && + !Emboss::is_italic(*ff.font_file, font_collection)) { + m_style_manager.get_style().prop.skew = 0.2; + } + return true; +} +#endif // ALLOW_ADD_FONT_BY_OS_SELECTOR + +#if defined ALLOW_ADD_FONT_BY_FILE or defined ALLOW_DEBUG_MODE +namespace priv { +static std::string get_file_name(const std::string &file_path) +{ + size_t pos_last_delimiter = file_path.find_last_of("/\\"); + size_t pos_point = file_path.find_last_of('.'); + size_t offset = pos_last_delimiter + 1; + size_t count = pos_point - pos_last_delimiter - 1; + return file_path.substr(offset, count); +} +} // namespace priv +#endif // ALLOW_ADD_FONT_BY_FILE || ALLOW_DEBUG_MODE + +#ifdef ALLOW_ADD_FONT_BY_FILE +bool GLGizmoEmboss::choose_true_type_file() +{ + wxArrayString input_files; + wxString fontDir = wxEmptyString; + wxString selectedFile = wxEmptyString; + wxFileDialog dialog(nullptr, "Choose one or more files (TTF, TTC):", + fontDir, selectedFile, file_wildcards(FT_FONTS), + wxFD_OPEN | wxFD_FILE_MUST_EXIST); + if (dialog.ShowModal() == wxID_OK) dialog.GetPaths(input_files); + if (input_files.IsEmpty()) return false; + size_t index = m_style_manager.get_fonts().size(); + // use first valid font + for (auto &input_file : input_files) { + std::string path = std::string(input_file.c_str()); + std::string name = priv::get_file_name(path); + //make_unique_name(name, m_font_list); + const FontProp& prop = m_style_manager.get_font_prop(); + EmbossStyle style{ name, path, EmbossStyle::Type::file_path, prop }; + m_style_manager.add_font(style); + // set first valid added font as active + if (m_style_manager.load_style(index)) return true; + m_style_manager.erase(index); + } + return false; +} +#endif // ALLOW_ADD_FONT_BY_FILE + +#ifdef ALLOW_DEBUG_MODE +bool GLGizmoEmboss::choose_svg_file() +{ + wxArrayString input_files; + wxString fontDir = wxEmptyString; + wxString selectedFile = wxEmptyString; + wxFileDialog dialog(nullptr, _L("Choose SVG file")+":", fontDir, + selectedFile, file_wildcards(FT_SVG), + wxFD_OPEN | wxFD_FILE_MUST_EXIST); + if (dialog.ShowModal() == wxID_OK) dialog.GetPaths(input_files); + if (input_files.IsEmpty()) return false; + if (input_files.size() != 1) return false; + auto & input_file = input_files.front(); + std::string path = std::string(input_file.c_str()); + std::string name = priv::get_file_name(path); + + NSVGimage *image = nsvgParseFromFile(path.c_str(), "mm", 96.0f); + ExPolygons polys = NSVGUtils::to_ExPolygons(image); + nsvgDelete(image); + + BoundingBox bb; + for (const auto &p : polys) bb.merge(p.contour.points); + const FontProp &fp = m_style_manager.get_style().prop; + float scale = fp.size_in_mm / std::max(bb.max.x(), bb.max.y()); + auto project = std::make_unique( + std::make_unique(fp.emboss / scale), scale); + indexed_triangle_set its = polygons2model(polys, *project); + return false; + // test store: + // for (auto &poly : polys) poly.scale(1e5); + // SVG svg("converted.svg", BoundingBox(polys.front().contour.points)); + // svg.draw(polys); + //return add_volume(name, its); +} +#endif // ALLOW_DEBUG_MODE + +void GLGizmoEmboss::create_notification_not_valid_font( + const TextConfiguration &tc) +{ + const EmbossStyle &es = m_style_manager.get_style(); + const auto &face_name_opt = es.prop.face_name; + const std::string &face_name_3mf = tc.style.prop.face_name.value_or(tc.style.path); + + std::optional face_name_by_wx; + if (!face_name_opt.has_value()) { + const wxFont& wx_font = m_style_manager.get_wx_font(); + if (wx_font.IsOk()) { + wxString wx_face_name = wx_font.GetFaceName(); + if (!wx_face_name.empty()) + face_name_by_wx = std::string(wx_face_name.ToUTF8().data()); + } + } + const std::string &face_name = face_name_opt.value_or(face_name_by_wx.value_or(es.path)); + std::string text = + GUI::format(_L("Can't load exactly same font(\"%1%\"). " + "Aplication selected a similar one(\"%2%\"). " + "You have to specify font for enable edit text."), + face_name_3mf, face_name); + create_notification_not_valid_font(text); +} + +void GLGizmoEmboss::create_notification_not_valid_font(const std::string &text) { + // not neccessary, but for sure that old notification doesnt exist + if (m_is_unknown_font) + remove_notification_not_valid_font(); + m_is_unknown_font = true; + + auto type = NotificationType::UnknownFont; + auto level = NotificationManager::NotificationLevel::WarningNotificationLevel; + auto notification_manager = wxGetApp().plater()->get_notification_manager(); + notification_manager->push_notification(type, level, text); +} + +void GLGizmoEmboss::remove_notification_not_valid_font() +{ + if (!m_is_unknown_font) return; + m_is_unknown_font = false; + auto type = NotificationType::UnknownFont; + auto notification_manager = wxGetApp().plater()->get_notification_manager(); + notification_manager->close_notification_of_type(type); +} + +void GLGizmoEmboss::init_icons() +{ + // icon order has to match the enum IconType + std::vector filenames{ + "edit_button.svg", + "delete.svg", + "add_copies.svg", + "save.svg", + "undo.svg", + "make_italic.svg", + "make_unitalic.svg", + "make_bold.svg", + "make_unbold.svg", + "search.svg", + "open.svg", + "exclamation.svg", + "lock_closed.svg", // lock, + "lock_closed_f.svg",// lock_bold, + "lock_open.svg", // unlock, + "lock_open_f.svg" // unlock_bold, + }; + assert(filenames.size() == static_cast(IconType::_count)); + std::string path = resources_dir() + "/icons/"; + for (std::string &filename : filenames) filename = path + filename; + + ImVec2 size(m_gui_cfg->icon_width, m_gui_cfg->icon_width); + auto type = IconManager::RasterType::color_wite_gray; + m_icons = m_icon_manager.init(filenames, size, type); +} + +const IconManager::Icon &priv::get_icon(const IconManager::VIcons& icons, IconType type, IconState state) { return *icons[(unsigned) type][(unsigned) state]; } +bool priv::draw_button(const IconManager::VIcons &icons, IconType type, bool disable) +{ + return Slic3r::GUI::button( + get_icon(icons, type, IconState::activable), + get_icon(icons, type, IconState::hovered), + get_icon(icons, type, IconState::disabled), + disable + ); +} + +///////////// +// priv namespace implementation +/////////////// + +bool priv::is_valid(ModelVolumeType volume_type) +{ + if (volume_type == ModelVolumeType::MODEL_PART || volume_type == ModelVolumeType::NEGATIVE_VOLUME || + volume_type == ModelVolumeType::PARAMETER_MODIFIER) + return true; + + BOOST_LOG_TRIVIAL(error) << "Can't create embossed volume with this type: " << (int) volume_type; + return false; +} + +DataBase priv::create_emboss_data_base(const std::string &text, StyleManager &style_manager, std::shared_ptr>& cancel) +{ + // create volume_name + std::string volume_name = text; // copy + // contain_enter? + if (volume_name.find('\n') != std::string::npos) + // change enters to space + std::replace(volume_name.begin(), volume_name.end(), '\n', ' '); + + if (!style_manager.is_active_font()) + style_manager.load_valid_style(); + assert(style_manager.is_active_font()); + + const EmbossStyle &es = style_manager.get_style(); + // actualize font path - during changes in gui it could be corrupted + // volume must store valid path + assert(style_manager.get_wx_font().IsOk()); + assert(es.path.compare(WxFontUtils::store_wxFont(style_manager.get_wx_font())) == 0); + TextConfiguration tc{es, text}; + + // Cancel previous Job, when it is in process + // worker.cancel(); --> Use less in this case I want cancel only previous EmbossJob no other jobs + // Cancel only EmbossUpdateJob no others + if (cancel != nullptr) + cancel->store(true); + // create new shared ptr to cancel new job + cancel = std::make_shared>(false); + return Slic3r::GUI::Emboss::DataBase{style_manager.get_font_file_with_cache(), tc, volume_name, cancel}; +} + +void priv::start_create_object_job(DataBase &emboss_data, const Vec2d &coor) +{ + // start creation of new object + Plater *plater = wxGetApp().plater(); + const Camera &camera = plater->get_camera(); + const Pointfs &bed_shape = plater->build_volume().bed_shape(); + + // can't create new object with distance from surface + FontProp &prop = emboss_data.text_configuration.style.prop; + if (prop.distance.has_value()) prop.distance.reset(); + + // can't create new object with using surface + if (prop.use_surface) + prop.use_surface = false; + + // Transform3d volume_tr = priv::create_transformation_on_bed(mouse_pos, camera, bed_shape, prop.emboss / 2); + DataCreateObject data{std::move(emboss_data), coor, camera, bed_shape}; + auto job = std::make_unique(std::move(data)); + Worker &worker = plater->get_ui_job_worker(); + queue_job(worker, std::move(job)); +} + +void priv::start_create_volume_job(const ModelObject *object, + const Transform3d volume_trmat, + DataBase &emboss_data, + ModelVolumeType volume_type) +{ + bool &use_surface = emboss_data.text_configuration.style.prop.use_surface; + std::unique_ptr job; + if (use_surface) { + // Model to cut surface from. + SurfaceVolumeData::ModelSources sources = create_sources(object->volumes); + if (sources.empty()) { + use_surface = false; + } else { + bool is_outside = volume_type == ModelVolumeType::MODEL_PART; + // check that there is not unexpected volume type + assert(is_outside || volume_type == ModelVolumeType::NEGATIVE_VOLUME || volume_type == ModelVolumeType::PARAMETER_MODIFIER); + SurfaceVolumeData sfvd{volume_trmat, is_outside, std::move(sources)}; + CreateSurfaceVolumeData surface_data{std::move(emboss_data), std::move(sfvd), volume_type, object->id()}; + job = std::make_unique(std::move(surface_data)); + } + } + if (!use_surface) { + // create volume + DataCreateVolume data{std::move(emboss_data), volume_type, object->id(), volume_trmat}; + job = std::make_unique(std::move(data)); + } + + Plater *plater = wxGetApp().plater(); + Worker &worker = plater->get_ui_job_worker(); + queue_job(worker, std::move(job)); +} + +bool priv::start_create_volume_on_surface_job( + DataBase &emboss_data, ModelVolumeType volume_type, const Vec2d &screen_coor, const GLVolume *gl_volume, RaycastManager &raycaster, GLCanvas3D& canvas) +{ + assert(gl_volume != nullptr); + if (gl_volume == nullptr) return false; + if (gl_volume->volume_idx() < 0) return false; + + Plater *plater = wxGetApp().plater(); + const ModelObjectPtrs &objects = plater->model().objects; + + int object_idx = gl_volume->object_idx(); + if (object_idx < 0 || static_cast(object_idx) >= objects.size()) return false; + ModelObject *obj = objects[object_idx]; + size_t vol_id = obj->volumes[gl_volume->volume_idx()]->id().id; + auto cond = RaycastManager::AllowVolumes({vol_id}); + + RaycastManager::Meshes meshes = create_meshes(canvas, cond); + raycaster.actualize(*obj, &cond, &meshes); + + const Camera &camera = plater->get_camera(); + std::optional hit = ray_from_camera(raycaster, screen_coor, camera, &cond); + + // context menu for add text could be open only by right click on an + // object. After right click, object is selected and object_idx is set + // also hit must exist. But there is options to add text by object list + if (!hit.has_value()) + return false; + + // Create result volume transformation + Transform3d surface_trmat = create_transformation_onto_surface(hit->position, hit->normal, priv::up_limit); + const FontProp &font_prop = emboss_data.text_configuration.style.prop; + apply_transformation(font_prop, surface_trmat); + Transform3d instance = gl_volume->get_instance_transformation().get_matrix(); + Transform3d volume_trmat = instance.inverse() * surface_trmat; + start_create_volume_job(obj, volume_trmat, emboss_data, volume_type); + return true; +} + +void priv::find_closest_volume(const Selection &selection, + const Vec2d &screen_center, + const Camera &camera, + const ModelObjectPtrs &objects, + Vec2d *closest_center, + const GLVolume **closest_volume) +{ + assert(closest_center != nullptr); + assert(closest_volume != nullptr); + assert(*closest_volume == nullptr); + const Selection::IndicesList &indices = selection.get_volume_idxs(); + assert(!indices.empty()); // no selected volume + if (indices.empty()) return; + + double center_sq_distance = std::numeric_limits::max(); + for (unsigned int id : indices) { + const GLVolume *gl_volume = selection.get_volume(id); + const ModelVolume *volume = get_model_volume(*gl_volume, objects); + if (volume == nullptr || !volume->is_model_part()) continue; + Slic3r::Polygon hull = CameraUtils::create_hull2d(camera, *gl_volume); + Vec2d c = hull.centroid().cast(); + Vec2d d = c - screen_center; + bool is_bigger_x = std::fabs(d.x()) > std::fabs(d.y()); + if ((is_bigger_x && d.x() * d.x() > center_sq_distance) || + (!is_bigger_x && d.y() * d.y() > center_sq_distance)) continue; + + double distance = d.squaredNorm(); + if (center_sq_distance < distance) continue; + center_sq_distance = distance; + *closest_center = c; + *closest_volume = gl_volume; + } +} + +ImVec2 priv::calc_fine_position(const Selection &selection, const ImVec2 &windows_size, const Size &canvas_size) +{ + const Selection::IndicesList indices = selection.get_volume_idxs(); + // no selected volume + if (indices.empty()) + return {}; + const GLVolume *volume = selection.get_volume(*indices.begin()); + // bad volume selected (e.g. deleted one) + if (volume == nullptr) + return {}; + + const Camera &camera = wxGetApp().plater()->get_camera(); + Slic3r::Polygon hull = CameraUtils::create_hull2d(camera, *volume); + + ImVec2 c_size(canvas_size.get_width(), canvas_size.get_height()); + ImVec2 offset = ImGuiWrapper::suggest_location(windows_size, hull, c_size); + return offset; +} + +// Need internals to get window +#include "imgui/imgui_internal.h" +void priv::change_window_position(std::optional& output_window_offset, bool try_to_fix) { + const char* name = "Emboss"; + ImGuiWindow *window = ImGui::FindWindowByName(name); + // is window just created + if (window == NULL) + return; + + // position of window on screen + ImVec2 position = window->Pos; + ImVec2 size = window->SizeFull; + + // screen size + ImVec2 screen = ImGui::GetMainViewport()->Size; + + if (position.x < 0) { + if (position.y < 0) + output_window_offset = ImVec2(0, 0); + else + output_window_offset = ImVec2(0, position.y); + } else if (position.y < 0) { + output_window_offset = ImVec2(position.x, 0); + } else if (screen.x < (position.x + size.x)) { + if (screen.y < (position.y + size.y)) + output_window_offset = ImVec2(screen.x - size.x, screen.y - size.y); + else + output_window_offset = ImVec2(screen.x - size.x, position.y); + } else if (screen.y < (position.y + size.y)) { + output_window_offset = ImVec2(position.x, screen.y - size.y); + } + + if (!try_to_fix && output_window_offset.has_value()) + output_window_offset = ImVec2(-1, -1); // Cannot +} + + +bool priv::apply_camera_dir(const Camera &camera, GLCanvas3D &canvas) { + const Vec3d &cam_dir = camera.get_dir_forward(); + + Selection &sel = canvas.get_selection(); + if (sel.is_empty()) return false; + + // camera direction transformed into volume coordinate system + Transform3d to_world = world_matrix_fixed(sel); + Vec3d cam_dir_tr = to_world.inverse().linear() * cam_dir; + cam_dir_tr.normalize(); + + Vec3d emboss_dir(0., 0., -1.); + + // check wether cam_dir is already used + if (is_approx(cam_dir_tr, emboss_dir)) return false; + + assert(sel.get_volume_idxs().size() == 1); + GLVolume *gl_volume = sel.get_volume(*sel.get_volume_idxs().begin()); + + Transform3d vol_rot; + Transform3d vol_tr = gl_volume->get_volume_transformation().get_matrix(); + // check whether cam_dir is opposit to emboss dir + if (is_approx(cam_dir_tr, -emboss_dir)) { + // rotate 180 DEG by y + vol_rot = Eigen::AngleAxis(M_PI_2, Vec3d(0., 1., 0.)); + } else { + // calc params for rotation + Vec3d axe = emboss_dir.cross(cam_dir_tr); + axe.normalize(); + double angle = std::acos(emboss_dir.dot(cam_dir_tr)); + vol_rot = Eigen::AngleAxis(angle, axe); + } + + Vec3d offset = vol_tr * Vec3d::Zero(); + Vec3d offset_inv = vol_rot.inverse() * offset; + Transform3d res = vol_tr * + Eigen::Translation(-offset) * + vol_rot * + Eigen::Translation(offset_inv); + //Transform3d res = vol_tr * vol_rot; + gl_volume->set_volume_transformation(Geometry::Transformation(res)); + get_model_volume(*gl_volume, sel.get_model()->objects)->set_transformation(res); + return true; +} + +// any existing icon filename to not influence GUI +const std::string GLGizmoEmboss::M_ICON_FILENAME = "cut.svg"; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp new file mode 100644 index 00000000000..b66f42b0fbd --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp @@ -0,0 +1,337 @@ +#ifndef slic3r_GLGizmoEmboss_hpp_ +#define slic3r_GLGizmoEmboss_hpp_ + +#include "GLGizmoBase.hpp" +#include "GLGizmoRotate.hpp" +#include "slic3r/GUI/IconManager.hpp" +#include "slic3r/GUI/SurfaceDrag.hpp" +#include "slic3r/GUI/I18N.hpp" +#include "slic3r/Utils/RaycastManager.hpp" +#include "slic3r/Utils/EmbossStyleManager.hpp" + +#include +#include +#include + +#include "libslic3r/Emboss.hpp" +#include "libslic3r/Point.hpp" +#include "libslic3r/Model.hpp" +#include "libslic3r/TextConfiguration.hpp" + +#include +#include + +class wxFont; +namespace Slic3r{ + class AppConfig; + class GLVolume; + enum class ModelVolumeType : int; +} + +namespace Slic3r::GUI { +class GLGizmoEmboss : public GLGizmoBase +{ +public: + GLGizmoEmboss(GLCanvas3D& parent); + + /// + /// Create new embossed text volume by type on position of mouse + /// + /// Object part / Negative volume / Modifier + /// Define position of new volume + void create_volume(ModelVolumeType volume_type, const Vec2d &mouse_pos); + + /// + /// Create new text without given position + /// + /// Object part / Negative volume / Modifier + void create_volume(ModelVolumeType volume_type); + +protected: + bool on_init() override; + std::string on_get_name() const override; + void on_render() override; + virtual void on_register_raycasters_for_picking() override; + virtual void on_unregister_raycasters_for_picking() override; + void on_render_input_window(float x, float y, float bottom_limit) override; + bool on_is_activable() const override { return true; } + bool on_is_selectable() const override { return false; } + void on_set_state() override; + void data_changed() override; // selection changed + void on_set_hover_id() override{ m_rotate_gizmo.set_hover_id(m_hover_id); } + void on_enable_grabber(unsigned int id) override { m_rotate_gizmo.enable_grabber(); } + void on_disable_grabber(unsigned int id) override { m_rotate_gizmo.disable_grabber(); } + void on_start_dragging() override; + void on_stop_dragging() override; + void on_dragging(const UpdateData &data) override; + + /// + /// Rotate by text on dragging rotate grabers + /// + /// Information about mouse + /// Propagete normaly return false. + bool on_mouse(const wxMouseEvent &mouse_event) override; + + bool wants_enter_leave_snapshots() const override { return true; } + std::string get_gizmo_entering_text() const override { return _u8L("Enter emboss gizmo"); } + std::string get_gizmo_leaving_text() const override { return _u8L("Leave emboss gizmo"); } + std::string get_action_snapshot_name() const override { return _u8L("Embossing actions"); } +private: + static EmbossStyles create_default_styles(); + // localized default text + void set_default_text(); + + void set_volume_by_selection(); + void reset_volume(); + + // create volume from text - main functionality + bool process(); + void close(); + void draw_window(); + void draw_text_input(); + void draw_model_type(); + void fix_transformation(const FontProp &from, const FontProp &to); + void draw_style_list(); + void draw_delete_style_button(); + void draw_style_rename_popup(); + void draw_style_rename_button(); + void draw_style_save_button(bool is_modified); + void draw_style_save_as_popup(); + void draw_style_add_button(); + void init_font_name_texture(); + struct FaceName; + void draw_font_preview(FaceName &face, bool is_visible); + void draw_font_list_line(); + void draw_font_list(); + void draw_height(bool use_inch); + void draw_depth(bool use_inch); + + // call after set m_style_manager.get_style().prop.size_in_mm + bool set_height(); + // call after set m_style_manager.get_style().prop.emboss + bool set_depth(); + + bool draw_italic_button(); + bool draw_bold_button(); + void draw_advanced(); + + bool select_facename(const wxString& facename); + + void do_translate(const Vec3d& relative_move); + void do_rotate(float relative_z_angle); + + bool rev_input_mm(const std::string &name, float &value, const float *default_value, + const std::string &undo_tooltip, float step, float step_fast, const char *format, + bool use_inch, const std::optional& scale); + + /// + /// Reversible input float with option to restor default value + /// TODO: make more general, static and move to ImGuiWrapper + /// + /// True when value changed otherwise FALSE. + bool rev_input(const std::string &name, float &value, const float *default_value, + const std::string &undo_tooltip, float step, float step_fast, const char *format, + ImGuiInputTextFlags flags = 0); + bool rev_checkbox(const std::string &name, bool &value, const bool* default_value, const std::string &undo_tooltip); + bool rev_slider(const std::string &name, std::optional& value, const std::optional *default_value, + const std::string &undo_tooltip, int v_min, int v_max, const std::string &format, const wxString &tooltip); + bool rev_slider(const std::string &name, std::optional& value, const std::optional *default_value, + const std::string &undo_tooltip, float v_min, float v_max, const std::string &format, const wxString &tooltip); + bool rev_slider(const std::string &name, float &value, const float *default_value, + const std::string &undo_tooltip, float v_min, float v_max, const std::string &format, const wxString &tooltip); + template + bool revertible(const std::string &name, T &value, const T *default_value, const std::string &undo_tooltip, float undo_offset, Draw draw); + + bool m_should_set_minimal_windows_size = false; + void set_minimal_window_size(bool is_advance_edit_style); + ImVec2 get_minimal_window_size() const; + + // process mouse event + bool on_mouse_for_rotation(const wxMouseEvent &mouse_event); + bool on_mouse_for_translate(const wxMouseEvent &mouse_event); + + // When open text loaded from .3mf it could be written with unknown font + bool m_is_unknown_font; + void create_notification_not_valid_font(const TextConfiguration& tc); + void create_notification_not_valid_font(const std::string& text); + void remove_notification_not_valid_font(); + + // This configs holds GUI layout size given by translated texts. + // etc. When language changes, GUI is recreated and this class constructed again, + // so the change takes effect. (info by GLGizmoFdmSupports.hpp) + struct GuiCfg + { + // Detect invalid config values when change monitor DPI + double screen_scale; + float main_toolbar_height; + + // Zero means it is calculated in init function + ImVec2 minimal_window_size = ImVec2(0, 0); + ImVec2 minimal_window_size_with_advance = ImVec2(0, 0); + ImVec2 minimal_window_size_with_collections = ImVec2(0, 0); + float height_of_volume_type_selector = 0.f; + float input_width = 0.f; + float delete_pos_x = 0.f; + float max_style_name_width = 0.f; + unsigned int icon_width = 0; + + // maximal width and height of style image + Vec2i max_style_image_size = Vec2i(0, 0); + + float indent = 0.f; + float input_offset = 0.f; + float advanced_input_offset = 0.f; + + float lock_offset = 0.f; + + ImVec2 text_size; + + // maximal size of face name image + Vec2i face_name_size = Vec2i(100, 0); + float face_name_max_width = 100.f; + float face_name_texture_offset_x = 105.f; + + // maximal texture generate jobs running at once + unsigned int max_count_opened_font_files = 10; + + // Only translations needed for calc GUI size + struct Translations + { + std::string font; + std::string height; + std::string depth; + std::string use_surface; + + // advanced + std::string char_gap; + std::string line_gap; + std::string boldness; + std::string skew_ration; + std::string from_surface; + std::string rotation; + std::string keep_up; + std::string collection; + }; + Translations translations; + }; + std::optional m_gui_cfg; + static GuiCfg create_gui_configuration(); + + // Is open tree with advanced options + bool m_is_advanced_edit_style = false; + + // when true window will appear near to text volume when open + // When false it opens on last position + bool m_allow_open_near_volume = false; + // setted only when wanted to use - not all the time + std::optional m_set_window_offset; + + // Keep information about stored styles and loaded actual style to compare with + Emboss::StyleManager m_style_manager; + + struct FaceName{ + wxString wx_name; + std::string name_truncated = ""; + size_t texture_index = 0; + // State for generation of texture + // when start generate create share pointers + std::shared_ptr> cancel = nullptr; + // R/W only on main thread - finalize of job + std::shared_ptr is_created = nullptr; + }; + + // Keep sorted list of loadable face names + struct Facenames + { + // flag to keep need of enumeration fonts from OS + // false .. wants new enumeration check by Hash + // true .. already enumerated(During opened combo box) + bool is_init = false; + + bool has_truncated_names = false; + + // data of can_load() faces + std::vector faces = {}; + // Sorter set of Non valid face names in OS + std::vector bad = {}; + + // Configuration of font encoding + static constexpr wxFontEncoding encoding = wxFontEncoding::wxFONTENCODING_SYSTEM; + + // Identify if preview texture exists + GLuint texture_id = 0; + + // protection for open too much font files together + // Gtk:ERROR:../../../../gtk/gtkiconhelper.c:494:ensure_surface_for_gicon: assertion failed (error == NULL): Failed to load /usr/share/icons/Yaru/48x48/status/image-missing.png: Error opening file /usr/share/icons/Yaru/48x48/status/image-missing.png: Too many open files (g-io-error-quark, 31) + // This variable must exist until no CreateFontImageJob is running + unsigned int count_opened_font_files = 0; + + // Configuration for texture height + const int count_cached_textures = 32; + + // index for new generated texture index(must be lower than count_cached_textures) + size_t texture_index = 0; + + // hash created from enumerated font from OS + // check when new font was installed + size_t hash = 0; + + // filtration pattern + std::string search = ""; + std::vector hide; // result of filtration + } m_face_names; + static bool store(const Facenames &facenames); + static bool load(Facenames &facenames); + + static void init_face_names(Facenames &facenames); + static void init_truncated_names(Facenames &face_names, float max_width); + + // Text to emboss + std::string m_text; // Sequence of Unicode UTF8 symbols + + // When true keep up vector otherwise relative rotation + bool m_keep_up = true; + + // current selected volume + // NOTE: Be carefull could be uninitialized (removed from Model) + ModelVolume *m_volume; + + // When work with undo redo stack there could be situation that + // m_volume point to unexisting volume so One need also objectID + ObjectID m_volume_id; + + // True when m_text contain character unknown by selected font + bool m_text_contain_unknown_glyph = false; + + // cancel for previous update of volume to cancel finalize part + std::shared_ptr> m_job_cancel; + + // Rotation gizmo + GLGizmoRotate m_rotate_gizmo; + // Value is set only when dragging rotation to calculate actual angle + std::optional m_rotate_start_angle; + + // Keep data about dragging only during drag&drop + std::optional m_surface_drag; + + // TODO: it should be accessible by other gizmo too. + // May be move to plater? + RaycastManager m_raycast_manager; + + // For text on scaled objects + std::optional m_scale_height; + std::optional m_scale_depth; + void calculate_scale(); + + // drawing icons + IconManager m_icon_manager; + IconManager::VIcons m_icons; + void init_icons(); + + // only temporary solution + static const std::string M_ICON_FILENAME; +}; + +} // namespace Slic3r::GUI + +#endif // slic3r_GLGizmoEmboss_hpp_ diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp index d79d193d94d..92b46aaa249 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp @@ -3,6 +3,8 @@ #include "libslic3r/Model.hpp" //#include "slic3r/GUI/3DScene.hpp" +#include "libslic3r/SupportSpotsGenerator.hpp" +#include "libslic3r/TriangleSelectorWrapper.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/ImGuiWrapper.hpp" @@ -10,6 +12,8 @@ #include "slic3r/GUI/GUI_ObjectList.hpp" #include "slic3r/GUI/format.hpp" #include "slic3r/Utils/UndoRedo.hpp" +#include "libslic3r/Print.hpp" +#include "slic3r/GUI/MsgDialog.hpp" #include @@ -39,6 +43,9 @@ bool GLGizmoFdmSupports::on_init() { m_shortcut_key = WXK_CONTROL_L; + m_desc["autopaint"] = _L("Automatic painting"); + // TRN GizmoFdmSupports : message line during the waiting for autogenerated supports + m_desc["painting"] = _L("painting") + dots; m_desc["clipping_of_view"] = _L("Clipping of view") + ": "; m_desc["reset_direction"] = _L("Reset direction"); m_desc["cursor_size"] = _L("Brush size") + ": "; @@ -69,9 +76,7 @@ bool GLGizmoFdmSupports::on_init() return true; } - - -void GLGizmoFdmSupports::render_painter_gizmo() const +void GLGizmoFdmSupports::render_painter_gizmo() { const Selection& selection = m_parent.get_selection(); @@ -93,7 +98,7 @@ void GLGizmoFdmSupports::on_render_input_window(float x, float y, float bottom_l if (! m_c->selection_info()->model_object()) return; - const float approx_height = m_imgui->scaled(23.f); + const float approx_height = m_imgui->scaled(25.f); y = std::min(y, bottom_limit - approx_height); m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); @@ -155,6 +160,15 @@ void GLGizmoFdmSupports::on_render_input_window(float x, float y, float bottom_l ImGui::Separator(); + if (waiting_for_autogenerated_supports) { + m_imgui->text(m_desc.at("painting")); + } else { + bool generate = m_imgui->button(m_desc.at("autopaint")); + if (generate) + auto_generate(); + } + ImGui::Separator(); + float position_before_text_y = ImGui::GetCursorPos().y; ImGui::AlignTextToFramePadding(); m_imgui->text_wrapped(m_desc["highlight_by_angle"] + ":", autoset_slider_label_max_width); @@ -297,7 +311,7 @@ void GLGizmoFdmSupports::on_render_input_window(float x, float y, float bottom_l else { if (m_imgui->button(m_desc.at("reset_direction"))) { wxGetApp().CallAfter([this](){ - m_c->object_clipper()->set_position(-1., false); + m_c->object_clipper()->set_position_by_ratio(-1., false); }); } } @@ -306,7 +320,7 @@ void GLGizmoFdmSupports::on_render_input_window(float x, float y, float bottom_l ImGui::SameLine(sliders_left_width); ImGui::PushItemWidth(window_width - sliders_left_width - slider_icon_width); if (m_imgui->slider_float("##clp_dist", &clp_dist, 0.f, 1.f, "%.2f", 1.0f, true, _L("Ctrl + Mouse wheel"))) - m_c->object_clipper()->set_position(clp_dist, true); + m_c->object_clipper()->set_position_by_ratio(clp_dist, true); ImGui::Separator(); if (m_imgui->button(m_desc.at("remove_all"))) { @@ -321,6 +335,7 @@ void GLGizmoFdmSupports::on_render_input_window(float x, float y, float bottom_l } update_model_object(); + this->waiting_for_autogenerated_supports = false; m_parent.set_as_dirty(); } @@ -343,7 +358,7 @@ void GLGizmoFdmSupports::select_facets_by_angle(float threshold_deg, bool block) ++mesh_id; - const Transform3d trafo_matrix = mi->get_matrix(true) * mv->get_matrix(true); + const Transform3d trafo_matrix = mi->get_matrix_no_offset() * mv->get_matrix_no_offset(); Vec3f down = (trafo_matrix.inverse() * (-Vec3d::UnitZ())).cast().normalized(); Vec3f limit = (trafo_matrix.inverse() * Vec3d(std::sin(threshold), 0, -std::cos(threshold))).cast().normalized(); @@ -364,10 +379,74 @@ void GLGizmoFdmSupports::select_facets_by_angle(float threshold_deg, bool block) Plater::TakeSnapshot snapshot(wxGetApp().plater(), block ? _L("Block supports by angle") : _L("Add supports by angle")); update_model_object(); + this->waiting_for_autogenerated_supports = false; m_parent.set_as_dirty(); } +void GLGizmoFdmSupports::data_changed() +{ + GLGizmoPainterBase::data_changed(); + if (! m_c->selection_info()) + return; + ModelObject* mo = m_c->selection_info()->model_object(); + if (mo && this->waiting_for_autogenerated_supports) { + apply_data_from_backend(); + } else { + this->waiting_for_autogenerated_supports = false; + } +} + +void GLGizmoFdmSupports::apply_data_from_backend() +{ + if (!has_backend_supports()) + return; + ModelObject *mo = m_c->selection_info()->model_object(); + if (!mo) { + this->waiting_for_autogenerated_supports = false; + return; + } + + // find the respective PrintObject, we need a pointer to it + for (const PrintObject *po : m_parent.fff_print()->objects()) { + if (po->model_object()->id() == mo->id()) { + std::unordered_map selectors; + SupportSpotsGenerator::SupportPoints support_points = po->shared_regions()->generated_support_points->support_points; + auto obj_transform = po->shared_regions()->generated_support_points->object_transform; + for (ModelVolume *model_volume : po->model_object()->volumes) { + if (model_volume->is_model_part()) { + Transform3d mesh_transformation = obj_transform * model_volume->get_matrix(); + Transform3d inv_transform = mesh_transformation.inverse(); + selectors.emplace(model_volume->id().id, TriangleSelectorWrapper{model_volume->mesh(), mesh_transformation}); + + for (const SupportSpotsGenerator::SupportPoint &support_point : support_points) { + Vec3f point = Vec3f(inv_transform.cast() * support_point.position); + Vec3f origin = Vec3f(inv_transform.cast() * + Vec3f(support_point.position.x(), support_point.position.y(), 0.0f)); + selectors.at(model_volume->id().id).enforce_spot(point, origin, support_point.spot_radius); + } + } + } + + int mesh_id = -1.0f; + for (ModelVolume *mv : mo->volumes) { + if (mv->is_model_part()) { + mesh_id++; + auto selector = selectors.find(mv->id().id); + if (selector != selectors.end()) { + mv->supported_facets.set(selector->second.selector); + m_triangle_selectors[mesh_id]->deserialize(mv->supported_facets.get_data(), true); + m_triangle_selectors[mesh_id]->request_update_render_data(); + } + } + } + + m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); + m_parent.set_as_dirty(); + } + this->waiting_for_autogenerated_supports = false; + } +} void GLGizmoFdmSupports::update_model_object() const { @@ -389,8 +468,6 @@ void GLGizmoFdmSupports::update_model_object() const } } - - void GLGizmoFdmSupports::update_from_model_object() { wxBusyCursor wait; @@ -415,6 +492,65 @@ void GLGizmoFdmSupports::update_from_model_object() } } +bool GLGizmoFdmSupports::has_backend_supports() +{ + const ModelObject *mo = m_c->selection_info()->model_object(); + if (!mo) { + waiting_for_autogenerated_supports = false; + return false; + } + + // find PrintObject with this ID + bool done = false; + for (const PrintObject *po : m_parent.fff_print()->objects()) { + if (po->model_object()->id() == mo->id()) + done = done || po->is_step_done(posSupportSpotsSearch); + } + + if (!done && !wxGetApp().plater()->is_background_process_update_scheduled()) { + waiting_for_autogenerated_supports = false; + } + + return done; +} + +void GLGizmoFdmSupports::auto_generate() +{ + std::string err = wxGetApp().plater()->fff_print().validate(); + if (!err.empty()) { + MessageDialog dlg(GUI::wxGetApp().plater(), _L("Automatic painting requires valid print setup.") + " \n" + from_u8(err), _L("Warning"), wxOK); + dlg.ShowModal(); + return; + } + + ModelObject *mo = m_c->selection_info()->model_object(); + bool not_painted = std::all_of(mo->volumes.begin(), mo->volumes.end(), [](const ModelVolume* vol){ + return vol->type() != ModelVolumeType::MODEL_PART || vol->supported_facets.empty(); + }); + + MessageDialog dlg(GUI::wxGetApp().plater(), + _L("Automatic painting will erase all currently painted areas.") + "\n\n" + + _L("Are you sure you want to do it?") + "\n", + _L("Warning"), wxICON_WARNING | wxYES | wxNO); + + if (not_painted || dlg.ShowModal() == wxID_YES) { + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Automatic painting support points")); + int mesh_id = -1.0f; + for (ModelVolume *mv : mo->volumes) { + if (mv->is_model_part()) { + mesh_id++; + mv->supported_facets.reset(); + m_triangle_selectors[mesh_id]->reset(); + m_triangle_selectors[mesh_id]->request_update_render_data(); + } + } + + wxGetApp().CallAfter([this]() { + wxGetApp().plater()->reslice_FFF_until_step(posSupportSpotsSearch, *m_c->selection_info()->model_object(), false); + this->waiting_for_autogenerated_supports = true; + }); + } +} PainterGizmoType GLGizmoFdmSupports::get_painter_type() const diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp index 4929714a2b3..aee669199fd 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp @@ -3,6 +3,8 @@ #include "GLGizmoPainterBase.hpp" +#include "slic3r/GUI/I18N.hpp" + namespace Slic3r::GUI { class GLGizmoFdmSupports : public GLGizmoPainterBase @@ -11,7 +13,7 @@ class GLGizmoFdmSupports : public GLGizmoPainterBase GLGizmoFdmSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) : GLGizmoPainterBase(parent, icon_filename, sprite_id) {} - void render_painter_gizmo() const override; + void render_painter_gizmo() override; protected: void on_render_input_window(float x, float y, float bottom_limit) override; @@ -21,11 +23,12 @@ class GLGizmoFdmSupports : public GLGizmoPainterBase std::string get_gizmo_entering_text() const override { return _u8L("Entering Paint-on supports"); } std::string get_gizmo_leaving_text() const override { return _u8L("Leaving Paint-on supports"); } - std::string get_action_snapshot_name() override { return _u8L("Paint-on supports editing"); } + std::string get_action_snapshot_name() const override { return _u8L("Paint-on supports editing"); } private: bool on_init() override; + void data_changed() override; void update_model_object() const override; void update_from_model_object() override; @@ -39,6 +42,12 @@ class GLGizmoFdmSupports : public GLGizmoPainterBase // This map holds all translated description texts, so they can be easily referenced during layout calculations // etc. When language changes, GUI is recreated and this class constructed again, so the change takes effect. std::map m_desc; + + + bool waiting_for_autogenerated_supports = false; + bool has_backend_supports(); + void auto_generate(); + void apply_data_from_backend(); }; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp index 4413a4e429e..fea8ddc0656 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp @@ -1,6 +1,8 @@ -// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro. #include "GLGizmoFlatten.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/GUI_ObjectManipulation.hpp" #include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp" #include "libslic3r/Geometry/ConvexHull.hpp" @@ -13,12 +15,56 @@ namespace Slic3r { namespace GUI { +static const Slic3r::ColorRGBA DEFAULT_PLANE_COLOR = { 0.9f, 0.9f, 0.9f, 0.5f }; +static const Slic3r::ColorRGBA DEFAULT_HOVER_PLANE_COLOR = { 0.9f, 0.9f, 0.9f, 0.75f }; GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) : GLGizmoBase(parent, icon_filename, sprite_id) - , m_normal(Vec3d::Zero()) - , m_starting_center(Vec3d::Zero()) +{} + +bool GLGizmoFlatten::on_mouse(const wxMouseEvent &mouse_event) { + if (mouse_event.Moving()) { + // only for sure + m_mouse_left_down = false; + return false; + } + if (mouse_event.LeftDown()) { + if (m_hover_id != -1) { + m_mouse_left_down = true; + Selection &selection = m_parent.get_selection(); + if (selection.is_single_full_instance()) { + // Rotate the object so the normal points downward: + selection.flattening_rotate(m_planes[m_hover_id].normal); + m_parent.do_rotate(L("Gizmo-Place on Face")); + wxGetApp().obj_manipul()->set_dirty(); + } + return true; + } + } + else if (mouse_event.LeftUp()) { + if (m_mouse_left_down) { + // responsible for mouse left up after selecting plane + m_mouse_left_down = false; + return true; + } + + } + else if (mouse_event.Leaving()) + m_mouse_left_down = false; + + return false; +} + +void GLGizmoFlatten::data_changed() +{ + const Selection & selection = m_parent.get_selection(); + const ModelObject *model_object = nullptr; + if (selection.is_single_full_instance() || + selection.is_from_single_object() ) { + model_object = selection.get_model()->objects[selection.get_object_idx()]; + } + set_flattening_data(model_object); } bool GLGizmoFlatten::on_init() @@ -48,77 +94,73 @@ bool GLGizmoFlatten::on_is_activable() const return m_parent.get_selection().is_single_full_instance(); } -void GLGizmoFlatten::on_start_dragging() -{ - if (m_hover_id != -1) { - assert(m_planes_valid); - m_normal = m_planes[m_hover_id].normal; - m_starting_center = m_parent.get_selection().get_bounding_box().center(); - } -} - void GLGizmoFlatten::on_render() { const Selection& selection = m_parent.get_selection(); + GLShaderProgram* shader = wxGetApp().get_shader("flat"); + if (shader == nullptr) + return; + + shader->start_using(); + glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); glsafe(::glEnable(GL_DEPTH_TEST)); glsafe(::glEnable(GL_BLEND)); if (selection.is_single_full_instance()) { - const Transform3d& m = selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(); - glsafe(::glPushMatrix()); - glsafe(::glTranslatef(0.f, 0.f, selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z())); - glsafe(::glMultMatrixd(m.data())); + const Transform3d& inst_matrix = selection.get_first_volume()->get_instance_transformation().get_matrix(); + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d model_matrix = Geometry::translation_transform(selection.get_first_volume()->get_sla_shift_z() * Vec3d::UnitZ()) * inst_matrix; + const Transform3d view_model_matrix = camera.get_view_matrix() * model_matrix; + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); if (this->is_plane_update_necessary()) update_planes(); for (int i = 0; i < (int)m_planes.size(); ++i) { - if (i == m_hover_id) - glsafe(::glColor4f(0.9f, 0.9f, 0.9f, 0.75f)); - else - glsafe(::glColor4f(0.9f, 0.9f, 0.9f, 0.5f)); - - if (m_planes[i].vbo.has_VBOs()) - m_planes[i].vbo.render(); + m_planes[i].vbo.model.set_color(i == m_hover_id ? DEFAULT_HOVER_PLANE_COLOR : DEFAULT_PLANE_COLOR); + m_planes[i].vbo.model.render(); } - glsafe(::glPopMatrix()); } glsafe(::glEnable(GL_CULL_FACE)); glsafe(::glDisable(GL_BLEND)); + + shader->stop_using(); } -void GLGizmoFlatten::on_render_for_picking() +void GLGizmoFlatten::on_register_raycasters_for_picking() { - const Selection& selection = m_parent.get_selection(); + // the gizmo grabbers are rendered on top of the scene, so the raytraced picker should take it into account + m_parent.set_raycaster_gizmos_on_top(true); - glsafe(::glDisable(GL_DEPTH_TEST)); - glsafe(::glDisable(GL_BLEND)); + assert(m_planes_casters.empty()); + + if (!m_planes.empty()) { + const Selection& selection = m_parent.get_selection(); + const Transform3d matrix = Geometry::translation_transform(selection.get_first_volume()->get_sla_shift_z() * Vec3d::UnitZ()) * + selection.get_first_volume()->get_instance_transformation().get_matrix(); - if (selection.is_single_full_instance() && !wxGetKeyState(WXK_CONTROL)) { - const Transform3d& m = selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(); - glsafe(::glPushMatrix()); - glsafe(::glTranslatef(0.f, 0.f, selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z())); - glsafe(::glMultMatrixd(m.data())); - if (this->is_plane_update_necessary()) - update_planes(); for (int i = 0; i < (int)m_planes.size(); ++i) { - glsafe(::glColor4fv(picking_color_component(i).data())); - m_planes[i].vbo.render(); + m_planes_casters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, i, *m_planes[i].vbo.mesh_raycaster, matrix)); } - glsafe(::glPopMatrix()); } +} - glsafe(::glEnable(GL_CULL_FACE)); +void GLGizmoFlatten::on_unregister_raycasters_for_picking() +{ + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo); + m_parent.set_raycaster_gizmos_on_top(false); + m_planes_casters.clear(); } void GLGizmoFlatten::set_flattening_data(const ModelObject* model_object) { - m_starting_center = Vec3d::Zero(); if (model_object != m_old_model_object) { m_planes.clear(); - m_planes_valid = false; + on_unregister_raycasters_for_picking(); } } @@ -135,7 +177,8 @@ void GLGizmoFlatten::update_planes() } ch = ch.convex_hull_3d(); m_planes.clear(); - const Transform3d& inst_matrix = mo->instances.front()->get_matrix(true); + on_unregister_raycasters_for_picking(); + const Transform3d inst_matrix = mo->instances.front()->get_matrix_no_offset(); // Following constants are used for discarding too small polygons. const float minimal_area = 5.f; // in square mm (world coordinates) @@ -194,9 +237,7 @@ void GLGizmoFlatten::update_planes() } // Let's prepare transformation of the normal vector from mesh to instance coordinates. - Geometry::Transformation t(inst_matrix); - Vec3d scaling = t.get_scaling_factor(); - t.set_scaling_factor(Vec3d(1./scaling(0), 1./scaling(1), 1./scaling(2))); + const Matrix3d normal_matrix = inst_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); // Now we'll go through all the polygons, transform the points into xy plane to process them: for (unsigned int polygon_id=0; polygon_id < m_planes.size(); ++polygon_id) { @@ -204,7 +245,7 @@ void GLGizmoFlatten::update_planes() const Vec3d& normal = m_planes[polygon_id].normal; // transform the normal according to the instance matrix: - Vec3d normal_transformed = t.get_matrix() * normal; + const Vec3d normal_transformed = normal_matrix * normal; // We are going to rotate about z and y to flatten the plane Eigen::Quaterniond q; @@ -217,7 +258,7 @@ void GLGizmoFlatten::update_planes() // And yes, it is a nasty thing to do. Whoever has time is free to refactor. Vec3d bb_size = BoundingBoxf3(polygon).size(); float sf = std::min(1./bb_size(0), 1./bb_size(1)); - Transform3d tr = Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), Vec3d(sf, sf, 1.f)); + Transform3d tr = Geometry::scale_transform({ sf, sf, 1.f }); polygon = transform(polygon, tr); polygon = Slic3r::Geometry::convex_hull(polygon); polygon = transform(polygon, tr.inverse()); @@ -326,30 +367,41 @@ void GLGizmoFlatten::update_planes() // And finally create respective VBOs. The polygon is convex with // the vertices in order, so triangulation is trivial. for (auto& plane : m_planes) { - plane.vbo.reserve(plane.vertices.size()); - for (const auto& vert : plane.vertices) - plane.vbo.push_geometry(vert, plane.normal); - for (size_t i=1; i()); + } + for (size_t i = 1; i < plane.vertices.size() - 1; ++i) { + its.indices.emplace_back(0, i, i + 1); // triangle fan + } + + plane.vbo.model.init_from(its); + if (Geometry::Transformation(inst_matrix).is_left_handed()) { + // we need to swap face normals in case the object is mirrored + // for the raycaster to work properly + for (stl_triangle_vertex_indices& face : its.indices) { + if (its_face_normal(its, face).cast().dot(plane.normal) < 0.0) + std::swap(face[1], face[2]); + } + } + plane.vbo.mesh_raycaster = std::make_unique(std::make_shared(std::move(its))); + // vertices are no more needed, clear memory + plane.vertices = std::vector(); } - m_planes_valid = true; + on_register_raycasters_for_picking(); } - bool GLGizmoFlatten::is_plane_update_necessary() const { const ModelObject* mo = m_c->selection_info()->model_object(); if (m_state != On || ! mo || mo->instances.empty()) return false; - if (! m_planes_valid || mo != m_old_model_object - || mo->volumes.size() != m_volumes_matrices.size()) + if (m_planes.empty() || mo != m_old_model_object + || mo->volumes.size() != m_volumes_matrices.size()) return true; // We want to recalculate when the scale changes - some planes could (dis)appear. @@ -365,13 +417,5 @@ bool GLGizmoFlatten::is_plane_update_necessary() const return false; } -Vec3d GLGizmoFlatten::get_flattening_normal() const -{ - Vec3d out = m_normal; - m_normal = Vec3d::Zero(); - m_starting_center = Vec3d::Zero(); - return out; -} - } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp index ab3c2c7bab1..0444fa2172a 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp @@ -2,8 +2,8 @@ #define slic3r_GLGizmoFlatten_hpp_ #include "GLGizmoBase.hpp" -#include "slic3r/GUI/3DScene.hpp" - +#include "slic3r/GUI/GLModel.hpp" +#include "slic3r/GUI/MeshUtils.hpp" namespace Slic3r { @@ -18,13 +18,15 @@ class GLGizmoFlatten : public GLGizmoBase // This gizmo does not use grabbers. The m_hover_id relates to polygon managed by the class itself. private: - mutable Vec3d m_normal; + + GLModel arrow; struct PlaneData { std::vector vertices; // should be in fact local in update_planes() - GLIndexedVertexArray vbo; + PickingModel vbo; Vec3d normal; float area; + int picking_id{ -1 }; }; // This holds information to decide whether recalculation is necessary: @@ -34,10 +36,9 @@ class GLGizmoFlatten : public GLGizmoBase Vec3d m_first_instance_mirror; std::vector m_planes; - bool m_planes_valid = false; - mutable Vec3d m_starting_center; + std::vector> m_planes_casters; + bool m_mouse_left_down = false; // for detection left_up of this gizmo const ModelObject* m_old_model_object = nullptr; - std::vector instances_matrices; void update_planes(); bool is_plane_update_necessary() const; @@ -46,17 +47,24 @@ class GLGizmoFlatten : public GLGizmoBase GLGizmoFlatten(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); void set_flattening_data(const ModelObject* model_object); - Vec3d get_flattening_normal() const; - + + /// + /// Apply rotation on select plane + /// + /// Keep information about mouse click + /// Return True when use the information otherwise False. + bool on_mouse(const wxMouseEvent &mouse_event) override; + + void data_changed() override; protected: - virtual bool on_init() override; - virtual std::string on_get_name() const override; - virtual bool on_is_activable() const override; - virtual void on_start_dragging() override; - virtual void on_render() override; - virtual void on_render_for_picking() override; - virtual void on_set_state() override; - virtual CommonGizmosDataID on_get_requirements() const override; + bool on_init() override; + std::string on_get_name() const override; + bool on_is_activable() const override; + void on_render() override; + virtual void on_register_raycasters_for_picking() override; + virtual void on_unregister_raycasters_for_picking() override; + void on_set_state() override; + CommonGizmosDataID on_get_requirements() const override; }; } // namespace GUI diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 9f423ac50cf..374f19edd46 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -1,6 +1,6 @@ +#include "libslic3r/libslic3r.h" #include "GLGizmoHollow.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" -#include "slic3r/GUI/Camera.hpp" #include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp" #include @@ -10,17 +10,16 @@ #include "slic3r/GUI/GUI_ObjectList.hpp" #include "slic3r/GUI/Plater.hpp" #include "libslic3r/PresetBundle.hpp" +#include "libslic3r/SLAPrint.hpp" #include "libslic3r/Model.hpp" - namespace Slic3r { namespace GUI { GLGizmoHollow::GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) - : GLGizmoBase(parent, icon_filename, sprite_id) + : GLGizmoSlaBase(parent, icon_filename, sprite_id, slaposAssembly) { - m_vbo_cylinder.init_from(its_make_cylinder(1., 1.)); } @@ -43,7 +42,7 @@ bool GLGizmoHollow::on_init() return true; } -void GLGizmoHollow::set_sla_support_data(ModelObject*, const Selection&) +void GLGizmoHollow::data_changed() { if (! m_c->selection_info()) return; @@ -54,8 +53,22 @@ void GLGizmoHollow::set_sla_support_data(ModelObject*, const Selection&) reload_cache(); m_old_mo_id = mo->id(); } - if (m_c->hollowed_mesh() && m_c->hollowed_mesh()->get_hollowed_mesh()) - m_holes_in_drilled_mesh = mo->sla_drain_holes; + + const SLAPrintObject* po = m_c->selection_info()->print_object(); + if (po != nullptr) { + std::shared_ptr preview_mesh_ptr = po->get_mesh_to_print(); + if (!preview_mesh_ptr || preview_mesh_ptr->empty()) + reslice_until_step(slaposAssembly); + } + + update_volumes(); + + if (m_hole_raycasters.empty()) + register_hole_raycasters_for_picking(); + else + update_hole_raycasters_for_picking_transform(); + + m_c->instances_hider()->set_hide_full_scene(true); } } @@ -74,112 +87,103 @@ void GLGizmoHollow::on_render() return; } + if (m_state == On) { + // This gizmo is showing the object elevated. Tell the common + // SelectionInfo object to lie about the actual shift. + m_c->selection_info()->set_use_shift(true); + } + glsafe(::glEnable(GL_BLEND)); glsafe(::glEnable(GL_DEPTH_TEST)); - if (selection.is_from_single_instance()) - render_points(selection, false); + render_volumes(); + render_points(selection); m_selection_rectangle.render(m_parent); m_c->object_clipper()->render_cut(); - m_c->supports_clipper()->render_cut(); + if (are_sla_supports_shown()) + m_c->supports_clipper()->render_cut(); glsafe(::glDisable(GL_BLEND)); } - -void GLGizmoHollow::on_render_for_picking() +void GLGizmoHollow::on_register_raycasters_for_picking() { - const Selection& selection = m_parent.get_selection(); -//#if ENABLE_RENDER_PICKING_PASS -// m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); -//#endif + register_hole_raycasters_for_picking(); + register_volume_raycasters_for_picking(); +} - glsafe(::glEnable(GL_DEPTH_TEST)); - render_points(selection, true); +void GLGizmoHollow::on_unregister_raycasters_for_picking() +{ + unregister_hole_raycasters_for_picking(); + unregister_volume_raycasters_for_picking(); } -void GLGizmoHollow::render_points(const Selection& selection, bool picking) const +void GLGizmoHollow::render_points(const Selection& selection) { - GLShaderProgram* shader = picking ? nullptr : wxGetApp().get_shader("gouraud_light"); - if (shader) - shader->start_using(); - ScopeGuard guard([shader]() { if (shader) shader->stop_using(); }); + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); + if (shader == nullptr) + return; + + shader->start_using(); + ScopeGuard guard([shader]() { shader->stop_using(); }); - const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); - Geometry::Transformation trafo = vol->get_instance_transformation() * vol->get_volume_transformation(); - const Transform3d& instance_scaling_matrix_inverse = trafo.get_matrix(true, true, false, true).inverse(); - const Transform3d& instance_matrix = trafo.get_matrix(); + auto *inst = m_c->selection_info()->model_instance(); + if (!inst) + return; - glsafe(::glPushMatrix()); - glsafe(::glTranslated(0.0, 0.0, m_c->selection_info()->get_sla_shift())); - glsafe(::glMultMatrixd(instance_matrix.data())); + double shift_z = m_c->selection_info()->print_object()->get_current_elevation(); + Transform3d trafo(inst->get_transformation().get_matrix()); + trafo.translation()(2) += shift_z; + const Geometry::Transformation transformation{trafo}; - std::array render_color; + const Transform3d instance_scaling_matrix_inverse = transformation.get_scaling_factor_matrix().inverse(); + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d& view_matrix = camera.get_view_matrix(); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + + ColorRGBA render_color; const sla::DrainHoles& drain_holes = m_c->selection_info()->model_object()->sla_drain_holes; - size_t cache_size = drain_holes.size(); + const size_t cache_size = drain_holes.size(); for (size_t i = 0; i < cache_size; ++i) { const sla::DrainHole& drain_hole = drain_holes[i]; - const bool& point_selected = m_selected[i]; + const bool point_selected = m_selected[i]; - if (is_mesh_point_clipped(drain_hole.pos.cast())) + const bool clipped = is_mesh_point_clipped(drain_hole.pos.cast()); + m_hole_raycasters[i]->set_active(!clipped); + if (clipped) continue; // First decide about the color of the point. - if (picking) { - std::array color = picking_color_component(i); - render_color = color; - } - else { - if (size_t(m_hover_id) == i) { - render_color = {0.f, 1.f, 1.f, 1.f}; - } - else if (m_c->hollowed_mesh() && - i < m_c->hollowed_mesh()->get_drainholes().size() && - m_c->hollowed_mesh()->get_drainholes()[i].failed) { - render_color = {1.f, 0.f, 0.f, .5f}; - } - else { // neigher hover nor picking - - render_color[0] = point_selected ? 1.0f : 1.f; - render_color[1] = point_selected ? 0.3f : 1.f; - render_color[2] = point_selected ? 0.3f : 1.f; - render_color[3] = 0.5f; - } - } - - const_cast(&m_vbo_cylinder)->set_color(-1, render_color); + if (size_t(m_hover_id) == i) + render_color = ColorRGBA::CYAN(); + else + render_color = point_selected ? ColorRGBA(1.0f, 0.3f, 0.3f, 0.5f) : ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f); + m_cylinder.model.set_color(render_color); // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. - glsafe(::glPushMatrix()); - glsafe(::glTranslatef(drain_hole.pos(0), drain_hole.pos(1), drain_hole.pos(2))); - glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); + const Transform3d hole_matrix = Geometry::translation_transform(drain_hole.pos.cast()) * instance_scaling_matrix_inverse; - if (vol->is_left_handed()) - glFrontFace(GL_CW); + if (transformation.is_left_handed()) + glsafe(::glFrontFace(GL_CW)); // Matrices set, we can render the point mark now. Eigen::Quaterniond q; - q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); - Eigen::AngleAxisd aa(q); - glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2))); - glsafe(::glPushMatrix()); - glsafe(::glTranslated(0., 0., -drain_hole.height)); - glsafe(::glScaled(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); - m_vbo_cylinder.render(); - glsafe(::glPopMatrix()); - - if (vol->is_left_handed()) - glFrontFace(GL_CCW); - glsafe(::glPopMatrix()); + q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); + const Eigen::AngleAxisd aa(q); + const Transform3d model_matrix = trafo * hole_matrix * Transform3d(aa.toRotationMatrix()) * + Geometry::translation_transform(-drain_hole.height * Vec3d::UnitZ()) * Geometry::scale_transform(Vec3d(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); + shader->set_uniform("view_model_matrix", view_matrix * model_matrix); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); + m_cylinder.model.render(); + + if (transformation.is_left_handed()) + glsafe(::glFrontFace(GL_CCW)); } - - glsafe(::glPopMatrix()); } - - bool GLGizmoHollow::is_mesh_point_clipped(const Vec3d& point) const { if (m_c->object_clipper()->get_position() == 0.) @@ -195,56 +199,6 @@ bool GLGizmoHollow::is_mesh_point_clipped(const Vec3d& point) const return m_c->object_clipper()->get_clipping_plane()->is_point_clipped(transformed_point); } - - -// Unprojects the mouse position on the mesh and saves hit point and normal of the facet into pos_and_normal -// Return false if no intersection was found, true otherwise. -bool GLGizmoHollow::unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal) -{ - if (! m_c->raycaster()->raycaster()) - return false; - - const Camera& camera = wxGetApp().plater()->get_camera(); - const Selection& selection = m_parent.get_selection(); - const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); - Geometry::Transformation trafo = volume->get_instance_transformation() * volume->get_volume_transformation(); - trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_c->selection_info()->get_sla_shift())); - - double clp_dist = m_c->object_clipper()->get_position(); - const ClippingPlane* clp = m_c->object_clipper()->get_clipping_plane(); - - // The raycaster query - Vec3f hit; - Vec3f normal; - if (m_c->raycaster()->raycaster()->unproject_on_mesh( - mouse_pos, - trafo.get_matrix(), - camera, - hit, - normal, - clp_dist != 0. ? clp : nullptr)) - { - if (m_c->hollowed_mesh() && m_c->hollowed_mesh()->get_hollowed_mesh()) { - // in this case the raycaster sees the hollowed and drilled mesh. - // if the point lies on the surface created by the hole, we want - // to ignore it. - for (const sla::DrainHole& hole : m_holes_in_drilled_mesh) { - sla::DrainHole outer(hole); - outer.radius *= 1.001f; - outer.height *= 1.001f; - if (outer.is_inside(hit)) - return false; - } - } - - // Return both the point and the facet normal. - pos_and_normal = std::make_pair(hit, normal); - return true; - } - else - return false; -} - // Following function is called from GLCanvas3D to inform the gizmo about a mouse/keyboard event. // The gizmo has an opportunity to react - if it does, it should return true so that the Canvas3D is // aware that the event was reacted to and stops trying to make different sense of it. If the gizmo @@ -258,9 +212,8 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos // left down with shift - show the selection rectangle: if (action == SLAGizmoEventType::LeftDown && (shift_down || alt_down || control_down)) { if (m_hover_id == -1) { - if (shift_down || alt_down) { - m_selection_rectangle.start_dragging(mouse_position, shift_down ? GLSelectionRectangle::Select : GLSelectionRectangle::Deselect); - } + if (shift_down || alt_down) + m_selection_rectangle.start_dragging(mouse_position, shift_down ? GLSelectionRectangle::EState::Select : GLSelectionRectangle::EState::Deselect); } else { if (m_selected[m_hover_id]) @@ -284,7 +237,7 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos if (m_selection_empty) { std::pair pos_and_normal; if (unproject_on_mesh(mouse_position, pos_and_normal)) { // we got an intersection - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Add drainage hole"))); + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Add drainage hole")); mo->sla_drain_holes.emplace_back(pos_and_normal.first, -pos_and_normal.second, m_new_hole_radius, m_new_hole_height); @@ -292,6 +245,8 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos assert(m_selected.size() == mo->sla_drain_holes.size()); m_parent.set_as_dirty(); m_wait_for_up_event = true; + unregister_hole_raycasters_for_picking(); + register_hole_raycasters_for_picking(); } else return false; @@ -316,7 +271,8 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos // Now ask the rectangle which of the points are inside. std::vector points_inside; - std::vector points_idxs = m_selection_rectangle.stop_dragging(m_parent, points); + std::vector points_idxs = m_selection_rectangle.contains(points); + m_selection_rectangle.stop_dragging(); for (size_t idx : points_idxs) points_inside.push_back(points[idx].cast()); @@ -325,7 +281,7 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos trafo, wxGetApp().plater()->get_camera(), points_inside, m_c->object_clipper()->get_clipping_plane())) { - if (rectangle_status == GLSelectionRectangle::Deselect) + if (rectangle_status == GLSelectionRectangle::EState::Deselect) unselect_point(points_idxs[idx]); else select_point(points_idxs[idx]); @@ -379,19 +335,19 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos if (action == SLAGizmoEventType::MouseWheelUp && control_down) { double pos = m_c->object_clipper()->get_position(); pos = std::min(1., pos + 0.01); - m_c->object_clipper()->set_position(pos, true); + m_c->object_clipper()->set_position_by_ratio(pos, true); return true; } if (action == SLAGizmoEventType::MouseWheelDown && control_down) { double pos = m_c->object_clipper()->get_position(); pos = std::max(0., pos - 0.01); - m_c->object_clipper()->set_position(pos, true); + m_c->object_clipper()->set_position_by_ratio(pos, true); return true; } if (action == SLAGizmoEventType::ResetClippingPlane) { - m_c->object_clipper()->set_position(-1., false); + m_c->object_clipper()->set_position_by_ratio(-1., false); return true; } @@ -410,31 +366,133 @@ void GLGizmoHollow::delete_selected_points() } } + unregister_hole_raycasters_for_picking(); + register_hole_raycasters_for_picking(); select_point(NoPoints); } -void GLGizmoHollow::on_update(const UpdateData& data) +bool GLGizmoHollow::on_mouse(const wxMouseEvent &mouse_event) { - sla::DrainHoles& drain_holes = m_c->selection_info()->model_object()->sla_drain_holes; + if (!is_input_enabled()) return true; + if (mouse_event.Moving()) return false; + if (use_grabbers(mouse_event)) return true; + + // wxCoord == int --> wx/types.h + Vec2i mouse_coord(mouse_event.GetX(), mouse_event.GetY()); + Vec2d mouse_pos = mouse_coord.cast(); + + static bool pending_right_up = false; + if (mouse_event.LeftDown()) { + bool control_down = mouse_event.CmdDown(); + bool grabber_contains_mouse = (get_hover_id() != -1); + if ((!control_down || grabber_contains_mouse) && + gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false)) + // the gizmo got the event and took some action, there is no need + // to do anything more + return true; + } else if (mouse_event.Dragging()) { + if (m_parent.get_move_volume_id() != -1) + // don't allow dragging objects with the Sla gizmo on + return true; - if (m_hover_id != -1) { - std::pair pos_and_normal; - if (! unproject_on_mesh(data.mouse_pos.cast(), pos_and_normal)) - return; - drain_holes[m_hover_id].pos = pos_and_normal.first; - drain_holes[m_hover_id].normal = -pos_and_normal.second; + bool control_down = mouse_event.CmdDown(); + if (control_down) { + // CTRL has been pressed while already dragging -> stop current action + if (mouse_event.LeftIsDown()) + gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true); + else if (mouse_event.RightIsDown()) { + pending_right_up = false; + } + } else if(gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false)) { + // the gizmo got the event and took some action, no need to do + // anything more here + m_parent.set_as_dirty(); + return true; + } + } else if (mouse_event.LeftUp()) { + if (!m_parent.is_mouse_dragging()) { + bool control_down = mouse_event.CmdDown(); + // in case gizmo is selected, we just pass the LeftUp event + // and stop processing - neither object moving or selecting is + // suppressed in that case + gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), control_down); + return true; + } + } else if (mouse_event.RightDown()) { + if (m_parent.get_selection().get_object_idx() != -1 && + gizmo_event(SLAGizmoEventType::RightDown, mouse_pos, false, false, false)) { + // we need to set the following right up as processed to avoid showing + // the context menu if the user release the mouse over the object + pending_right_up = true; + // event was taken care of by the SlaSupports gizmo + return true; + } + } else if (mouse_event.RightUp()) { + if (pending_right_up) { + pending_right_up = false; + return true; + } } + return false; } +void GLGizmoHollow::register_hole_raycasters_for_picking() +{ + assert(m_hole_raycasters.empty()); -void GLGizmoHollow::hollow_mesh(bool postpone_error_messages) + init_cylinder_model(); + + const CommonGizmosDataObjects::SelectionInfo* info = m_c->selection_info(); + if (info != nullptr && !info->model_object()->sla_drain_holes.empty()) { + const sla::DrainHoles& drain_holes = info->model_object()->sla_drain_holes; + for (int i = 0; i < (int)drain_holes.size(); ++i) { + m_hole_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, i, *m_cylinder.mesh_raycaster, Transform3d::Identity())); + } + update_hole_raycasters_for_picking_transform(); + } +} + +void GLGizmoHollow::unregister_hole_raycasters_for_picking() { - wxGetApp().CallAfter([this, postpone_error_messages]() { - wxGetApp().plater()->reslice_SLA_hollowing( - *m_c->selection_info()->model_object(), postpone_error_messages); - }); + for (size_t i = 0; i < m_hole_raycasters.size(); ++i) { + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, i); + } + m_hole_raycasters.clear(); } +void GLGizmoHollow::update_hole_raycasters_for_picking_transform() +{ + const CommonGizmosDataObjects::SelectionInfo* info = m_c->selection_info(); + if (info != nullptr) { + const sla::DrainHoles& drain_holes = info->model_object()->sla_drain_holes; + if (!drain_holes.empty()) { + assert(!m_hole_raycasters.empty()); + + const GLVolume* vol = m_parent.get_selection().get_first_volume(); + Geometry::Transformation transformation(vol->get_instance_transformation()); + + auto *inst = m_c->selection_info()->model_instance(); + if (inst && m_c->selection_info() && m_c->selection_info()->print_object()) { + double shift_z = m_c->selection_info()->print_object()->get_current_elevation(); + auto trafo = inst->get_transformation().get_matrix(); + trafo.translation()(2) += shift_z; + transformation.set_matrix(trafo); + } + const Transform3d instance_scaling_matrix_inverse = transformation.get_scaling_factor_matrix().inverse(); + + for (size_t i = 0; i < drain_holes.size(); ++i) { + const sla::DrainHole& drain_hole = drain_holes[i]; + const Transform3d hole_matrix = Geometry::translation_transform(drain_hole.pos.cast()) * instance_scaling_matrix_inverse; + Eigen::Quaterniond q; + q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); + const Eigen::AngleAxisd aa(q); + const Transform3d matrix = transformation.get_matrix() * hole_matrix * Transform3d(aa.toRotationMatrix()) * + Geometry::translation_transform(-drain_hole.height * Vec3d::UnitZ()) * Geometry::scale_transform(Vec3d(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); + m_hole_raycasters[i]->set_transform(matrix); + } + } + } +} std::vector> GLGizmoHollow::get_config_options(const std::vector& keys) const @@ -451,14 +509,14 @@ GLGizmoHollow::get_config_options(const std::vector& keys) const for (const std::string& key : keys) { if (object_cfg.has(key)) - out.emplace_back(object_cfg.option(key), &object_cfg.def()->options.at(key)); // at() needed for const map + out.emplace_back(object_cfg.option(key), object_cfg.option_def(key)); else if (print_cfg.has(key)) - out.emplace_back(print_cfg.option(key), &print_cfg.def()->options.at(key)); + out.emplace_back(print_cfg.option(key), print_cfg.option_def(key)); else { // we must get it from defaults if (default_cfg == nullptr) default_cfg.reset(DynamicPrintConfig::new_from_defaults_keys(keys)); - out.emplace_back(default_cfg->option(key), &default_cfg->def()->options.at(key)); + out.emplace_back(default_cfg->option(key), default_cfg->option_def(key)); } } @@ -527,9 +585,11 @@ void GLGizmoHollow::on_render_input_window(float x, float y, float bottom_limit) float window_width = minimal_slider_width + std::max({settings_sliders_left, clipping_slider_left, diameter_slider_left}); window_width = std::max(window_width, button_preview_width); + m_imgui->disabled_begin(!is_input_enabled()); + if (m_imgui->button(m_desc["preview"])) - hollow_mesh(); - + reslice_until_step(slaposDrillHoles); + bool config_changed = false; ImGui::Separator(); @@ -544,7 +604,10 @@ void GLGizmoHollow::on_render_input_window(float x, float y, float bottom_limit) } } - m_imgui->disabled_begin(! m_enable_hollowing); + m_imgui->disabled_end(); + + m_imgui->disabled_begin(!is_input_enabled() || !m_enable_hollowing); + ImGui::AlignTextToFramePadding(); m_imgui->text(m_desc.at("offset")); ImGui::SameLine(settings_sliders_left, m_imgui->get_item_spacing().x); @@ -587,7 +650,7 @@ void GLGizmoHollow::on_render_input_window(float x, float y, float bottom_limit) mo->config.set("hollowing_min_thickness", m_offset_stash); mo->config.set("hollowing_quality", m_quality_stash); mo->config.set("hollowing_closing_distance", m_closing_d_stash); - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Hollowing parameter change"))); + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Hollowing parameter change")); } mo->config.set("hollowing_min_thickness", offset); mo->config.set("hollowing_quality", quality); @@ -610,12 +673,15 @@ void GLGizmoHollow::on_render_input_window(float x, float y, float bottom_limit) if (m_new_hole_radius * 2.f > diameter_upper_cap) m_new_hole_radius = diameter_upper_cap / 2.f; ImGui::AlignTextToFramePadding(); + + m_imgui->disabled_begin(!is_input_enabled()); + m_imgui->text(m_desc.at("hole_diameter")); ImGui::SameLine(diameter_slider_left, m_imgui->get_item_spacing().x); ImGui::PushItemWidth(window_width - diameter_slider_left); - float diam = 2.f * m_new_hole_radius; m_imgui->slider_float("##hole_diameter", &diam, 1.f, 25.f, "%.1f mm", 1.f, false); + // Let's clamp the value (which could have been entered by keyboard) to a larger range // than the slider. This allows entering off-scale values and still protects against //complete non-sense. @@ -626,9 +692,13 @@ void GLGizmoHollow::on_render_input_window(float x, float y, float bottom_limit) bool deactivated = m_imgui->get_last_slider_status().deactivated_after_edit; ImGui::AlignTextToFramePadding(); + m_imgui->text(m_desc["hole_depth"]); ImGui::SameLine(diameter_slider_left, m_imgui->get_item_spacing().x); m_imgui->slider_float("##hole_depth", &m_new_hole_height, 0.f, 10.f, "%.1f mm", 1.f, false); + + m_imgui->disabled_end(); + // Same as above: m_new_hole_height = std::clamp(m_new_hole_height, 0.f, 100.f); @@ -664,24 +734,24 @@ void GLGizmoHollow::on_render_input_window(float x, float y, float bottom_limit) break; } } - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Change drainage hole diameter"))); + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Change drainage hole diameter")); m_new_hole_radius = backup_rad; m_new_hole_height = backup_hei; mo->sla_drain_holes = new_holes; } } - m_imgui->disabled_begin(m_selection_empty); + m_imgui->disabled_begin(!is_input_enabled() || m_selection_empty); remove_selected = m_imgui->button(m_desc.at("remove_selected")); m_imgui->disabled_end(); - m_imgui->disabled_begin(mo->sla_drain_holes.empty()); + m_imgui->disabled_begin(!is_input_enabled() || mo->sla_drain_holes.empty()); remove_all = m_imgui->button(m_desc.at("remove_all")); m_imgui->disabled_end(); // Following is rendered in both editing and non-editing mode: - // m_imgui->text(""); ImGui::Separator(); + m_imgui->disabled_begin(!is_input_enabled()); if (m_c->object_clipper()->get_position() == 0.f) { ImGui::AlignTextToFramePadding(); m_imgui->text(m_desc.at("clipping_of_view")); @@ -689,7 +759,7 @@ void GLGizmoHollow::on_render_input_window(float x, float y, float bottom_limit) else { if (m_imgui->button(m_desc.at("reset_direction"))) { wxGetApp().CallAfter([this](){ - m_c->object_clipper()->set_position(-1., false); + m_c->object_clipper()->set_position_by_ratio(-1., false); }); } } @@ -698,15 +768,17 @@ void GLGizmoHollow::on_render_input_window(float x, float y, float bottom_limit) ImGui::PushItemWidth(window_width - settings_sliders_left); float clp_dist = m_c->object_clipper()->get_position(); if (m_imgui->slider_float("##clp_dist", &clp_dist, 0.f, 1.f, "%.2f")) - m_c->object_clipper()->set_position(clp_dist, true); + m_c->object_clipper()->set_position_by_ratio(clp_dist, true); // make sure supports are shown/hidden as appropriate - bool show_sups = m_c->instances_hider()->are_supports_shown(); + ImGui::Separator(); + bool show_sups = are_sla_supports_shown(); if (m_imgui->checkbox(m_desc["show_supports"], show_sups)) { - m_c->instances_hider()->show_supports(show_sups); + show_sla_supports(show_sups); force_refresh = true; } + m_imgui->disabled_end(); m_imgui->end(); @@ -739,7 +811,7 @@ bool GLGizmoHollow::on_is_activable() const const Selection& selection = m_parent.get_selection(); if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA - || !selection.is_from_single_instance()) + || !selection.is_single_full_instance()) return false; // Check that none of the selected volumes is outside. Only SLA auxiliaries (supports) are allowed outside. @@ -761,26 +833,18 @@ std::string GLGizmoHollow::on_get_name() const return _u8L("Hollow and drill"); } - -CommonGizmosDataID GLGizmoHollow::on_get_requirements() const -{ - return CommonGizmosDataID( - int(CommonGizmosDataID::SelectionInfo) - | int(CommonGizmosDataID::InstancesHider) - | int(CommonGizmosDataID::Raycaster) - | int(CommonGizmosDataID::HollowedMesh) - | int(CommonGizmosDataID::ObjectClipper) - | int(CommonGizmosDataID::SupportsClipper)); -} - - void GLGizmoHollow::on_set_state() { if (m_state == m_old_state) return; - if (m_state == Off && m_old_state != Off) // the gizmo was just turned Off + if (m_state == Off && m_old_state != Off) { + // the gizmo was just turned Off m_parent.post_event(SimpleEvent(EVT_GLCANVAS_FORCE_UPDATE)); + m_c->instances_hider()->set_hide_full_scene(false); + m_c->selection_info()->set_use_shift(false); // see top of on_render for details + } + m_old_state = m_state; } @@ -816,6 +880,17 @@ void GLGizmoHollow::on_stop_dragging() } +void GLGizmoHollow::on_dragging(const UpdateData &data) +{ + assert(m_hover_id != -1); + std::pair pos_and_normal; + if (!unproject_on_mesh(data.mouse_pos.cast(), pos_and_normal)) + return; + sla::DrainHoles &drain_holes = m_c->selection_info()->model_object()->sla_drain_holes; + drain_holes[m_hover_id].pos = pos_and_normal.first; + drain_holes[m_hover_id].normal = -pos_and_normal.second; +} + void GLGizmoHollow::on_load(cereal::BinaryInputArchive& ar) { @@ -847,7 +922,7 @@ void GLGizmoHollow::select_point(int i) m_selected.assign(m_selected.size(), i == AllPoints); m_selection_empty = (i == NoPoints); - if (i == AllPoints && ! drain_holes.empty()) { + if (i == AllPoints && !drain_holes.empty()) { m_new_hole_radius = drain_holes[0].radius; m_new_hole_height = drain_holes[0].height; } @@ -884,10 +959,21 @@ void GLGizmoHollow::reload_cache() void GLGizmoHollow::on_set_hover_id() { + if (m_c->selection_info()->model_object() == nullptr) + return; + if (int(m_c->selection_info()->model_object()->sla_drain_holes.size()) <= m_hover_id) m_hover_id = -1; } +void GLGizmoHollow::init_cylinder_model() +{ + if (!m_cylinder.model.is_initialized()) { + indexed_triangle_set its = its_make_cylinder(1.0, 1.0); + m_cylinder.model.init_from(its); + m_cylinder.mesh_raycaster = std::make_unique(std::make_shared(std::move(its))); + } +} diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index 2cf08de2a0a..abfb2503faf 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -1,7 +1,7 @@ #ifndef slic3r_GLGizmoHollow_hpp_ #define slic3r_GLGizmoHollow_hpp_ -#include "GLGizmoBase.hpp" +#include "GLGizmoSlaBase.hpp" #include "slic3r/GUI/GLSelectionRectangle.hpp" #include @@ -19,36 +19,43 @@ class ConfigOptionDef; namespace GUI { enum class SLAGizmoEventType : unsigned char; - -class GLGizmoHollow : public GLGizmoBase +class Selection; +class GLGizmoHollow : public GLGizmoSlaBase { -private: - bool unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal); - - public: GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); - virtual ~GLGizmoHollow() = default; - void set_sla_support_data(ModelObject* model_object, const Selection& selection); + void data_changed() override; bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); void delete_selected_points(); - bool is_selection_rectangle_dragging() const { + bool is_selection_rectangle_dragging() const override { return m_selection_rectangle.is_dragging(); } + + /// + /// Postpone to Grabber for move + /// Detect move of object by dragging + /// + /// Keep information about mouse click + /// Return True when use the information otherwise False. + bool on_mouse(const wxMouseEvent &mouse_event) override; -private: +protected: bool on_init() override; - void on_update(const UpdateData& data) override; void on_render() override; - void on_render_for_picking() override; + virtual void on_register_raycasters_for_picking() override; + virtual void on_unregister_raycasters_for_picking() override; - void render_points(const Selection& selection, bool picking = false) const; - void hollow_mesh(bool postpone_error_messages = false); - bool unsaved_changes() const; +private: + void render_points(const Selection& selection); + void register_hole_raycasters_for_picking(); + void unregister_hole_raycasters_for_picking(); + void update_hole_raycasters_for_picking_transform(); ObjectID m_old_mo_id = -1; - GLModel m_vbo_cylinder; + PickingModel m_cylinder; + std::vector> m_hole_raycasters; + float m_new_hole_radius = 2.f; // Size of a new hole. float m_new_hole_height = 6.f; mutable std::vector m_selected; // which holes are currently selected @@ -93,14 +100,16 @@ class GLGizmoHollow : public GLGizmoBase void on_set_hover_id() override; void on_start_dragging() override; void on_stop_dragging() override; + void on_dragging(const UpdateData &data) override; void on_render_input_window(float x, float y, float bottom_limit) override; - virtual CommonGizmosDataID on_get_requirements() const override; std::string on_get_name() const override; bool on_is_activable() const override; bool on_is_selectable() const override; void on_load(cereal::BinaryInputArchive& ar) override; void on_save(cereal::BinaryOutputArchive& ar) const override; + + void init_cylinder_model(); }; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp new file mode 100644 index 00000000000..e8f6ad4afe9 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp @@ -0,0 +1,2137 @@ +#include "GLGizmoMeasure.hpp" +#include "slic3r/GUI/GLCanvas3D.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/GUI_ObjectManipulation.hpp" + + +#include "libslic3r/PresetBundle.hpp" +#include "libslic3r/MeasureUtils.hpp" + +#include + +#include + +#include + +#include + +namespace Slic3r { +namespace GUI { + +static const Slic3r::ColorRGBA SELECTED_1ST_COLOR = { 0.25f, 0.75f, 0.75f, 1.0f }; +static const Slic3r::ColorRGBA SELECTED_2ND_COLOR = { 0.75f, 0.25f, 0.75f, 1.0f }; +static const Slic3r::ColorRGBA NEUTRAL_COLOR = { 0.5f, 0.5f, 0.5f, 1.0f }; + +static const int POINT_ID = 100; +static const int EDGE_ID = 200; +static const int CIRCLE_ID = 300; +static const int PLANE_ID = 400; +static const int SEL_SPHERE_1_ID = 501; +static const int SEL_SPHERE_2_ID = 502; + +static const float TRIANGLE_BASE = 10.0f; +static const float TRIANGLE_HEIGHT = TRIANGLE_BASE * 1.618033f; + +static const std::string CTRL_STR = +#ifdef __APPLE__ +"⌘" +#else +"Ctrl" +#endif //__APPLE__ +; + +static std::string format_double(double value) +{ + char buf[1024]; + sprintf(buf, "%.3f", value); + return std::string(buf); +} + +static std::string format_vec3(const Vec3d& v) +{ + char buf[1024]; + sprintf(buf, "X: %.3f, Y: %.3f, Z: %.3f", v.x(), v.y(), v.z()); + return std::string(buf); +} + +static std::string surface_feature_type_as_string(Measure::SurfaceFeatureType type) +{ + switch (type) + { + default: + case Measure::SurfaceFeatureType::Undef: { return _u8L("No feature"); } + case Measure::SurfaceFeatureType::Point: { return _u8L("Vertex"); } + case Measure::SurfaceFeatureType::Edge: { return _u8L("Edge"); } + case Measure::SurfaceFeatureType::Circle: { return _u8L("Circle"); } + case Measure::SurfaceFeatureType::Plane: { return _u8L("Plane"); } + } +} + +static std::string point_on_feature_type_as_string(Measure::SurfaceFeatureType type, int hover_id) +{ + std::string ret; + switch (type) { + case Measure::SurfaceFeatureType::Point: { ret = _u8L("Vertex"); break; } + case Measure::SurfaceFeatureType::Edge: { ret = _u8L("Point on edge"); break; } + case Measure::SurfaceFeatureType::Circle: { ret = _u8L("Point on circle"); break; } + case Measure::SurfaceFeatureType::Plane: { ret = _u8L("Point on plane"); break; } + default: { assert(false); break; } + } + return ret; +} + +static std::string center_on_feature_type_as_string(Measure::SurfaceFeatureType type) +{ + std::string ret; + switch (type) { + case Measure::SurfaceFeatureType::Edge: { ret = _u8L("Center of edge"); break; } + case Measure::SurfaceFeatureType::Circle: { ret = _u8L("Center of circle"); break; } + default: { assert(false); break; } + } + return ret; +} + +static GLModel::Geometry init_plane_data(const indexed_triangle_set& its, const std::vector& triangle_indices) +{ + GLModel::Geometry init_data; + init_data.format = { GUI::GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + unsigned int i = 0; + for (int idx : triangle_indices) { + const Vec3f& v0 = its.vertices[its.indices[idx][0]]; + const Vec3f& v1 = its.vertices[its.indices[idx][1]]; + const Vec3f& v2 = its.vertices[its.indices[idx][2]]; + + const Vec3f n = (v1 - v0).cross(v2 - v0).normalized(); + init_data.add_vertex(v0, n); + init_data.add_vertex(v1, n); + init_data.add_vertex(v2, n); + init_data.add_triangle(i, i + 1, i + 2); + i += 3; + } + + return init_data; +} + +static GLModel::Geometry init_torus_data(unsigned int primary_resolution, unsigned int secondary_resolution, const Vec3f& center, + float radius, float thickness, const Vec3f& model_axis, const Transform3f& world_trafo) +{ + const unsigned int torus_sector_count = std::max(4, primary_resolution); + const unsigned int section_sector_count = std::max(4, secondary_resolution); + const float torus_sector_step = 2.0f * float(M_PI) / float(torus_sector_count); + const float section_sector_step = 2.0f * float(M_PI) / float(section_sector_count); + + GLModel::Geometry data; + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + data.reserve_vertices(torus_sector_count * section_sector_count); + data.reserve_indices(torus_sector_count * section_sector_count * 2 * 3); + + // vertices + const Transform3f local_to_world_matrix = world_trafo * Geometry::translation_transform(center.cast()).cast() * + Eigen::Quaternion::FromTwoVectors(Vec3f::UnitZ(), model_axis); + for (unsigned int i = 0; i < torus_sector_count; ++i) { + const float section_angle = torus_sector_step * i; + const Vec3f radius_dir(std::cos(section_angle), std::sin(section_angle), 0.0f); + const Vec3f local_section_center = radius * radius_dir; + const Vec3f world_section_center = local_to_world_matrix * local_section_center; + const Vec3f local_section_normal = local_section_center.normalized().cross(Vec3f::UnitZ()).normalized(); + const Vec3f world_section_normal = (Vec3f)(local_to_world_matrix.matrix().block(0, 0, 3, 3) * local_section_normal).normalized(); + const Vec3f base_v = thickness * radius_dir; + for (unsigned int j = 0; j < section_sector_count; ++j) { + const Vec3f v = Eigen::AngleAxisf(section_sector_step * j, world_section_normal) * base_v; + data.add_vertex(world_section_center + v, (Vec3f)v.normalized()); + } + } + + // triangles + for (unsigned int i = 0; i < torus_sector_count; ++i) { + const unsigned int ii = i * section_sector_count; + const unsigned int ii_next = ((i + 1) % torus_sector_count) * section_sector_count; + for (unsigned int j = 0; j < section_sector_count; ++j) { + const unsigned int j_next = (j + 1) % section_sector_count; + const unsigned int i0 = ii + j; + const unsigned int i1 = ii_next + j; + const unsigned int i2 = ii_next + j_next; + const unsigned int i3 = ii + j_next; + data.add_triangle(i0, i1, i2); + data.add_triangle(i0, i2, i3); + } + } + + return data; +} + +static bool is_feature_with_center(const Measure::SurfaceFeature& feature) +{ + const Measure::SurfaceFeatureType type = feature.get_type(); + return (type == Measure::SurfaceFeatureType::Circle || (type == Measure::SurfaceFeatureType::Edge && feature.get_extra_point().has_value())); +} + +static Vec3d get_feature_offset(const Measure::SurfaceFeature& feature) +{ + Vec3d ret; + switch (feature.get_type()) + { + case Measure::SurfaceFeatureType::Circle: + { + const auto [center, radius, normal] = feature.get_circle(); + ret = center; + break; + } + case Measure::SurfaceFeatureType::Edge: + { + std::optional p = feature.get_extra_point(); + assert(p.has_value()); + ret = *p; + break; + } + case Measure::SurfaceFeatureType::Point: + { + ret = feature.get_point(); + break; + } + default: { assert(false); } + } + + return ret; +} + +class TransformHelper +{ + struct Cache + { + std::array viewport; + Matrix4d ndc_to_ss_matrix; + Transform3d ndc_to_ss_matrix_inverse; + }; + + static Cache s_cache; + +public: + static Vec3d model_to_world(const Vec3d& model, const Transform3d& world_matrix) { + return world_matrix * model; + } + + static Vec4d world_to_clip(const Vec3d& world, const Matrix4d& projection_view_matrix) { + return projection_view_matrix * Vec4d(world.x(), world.y(), world.z(), 1.0); + } + + static Vec3d clip_to_ndc(const Vec4d& clip) { + return Vec3d(clip.x(), clip.y(), clip.z()) / clip.w(); + } + + static Vec2d ndc_to_ss(const Vec3d& ndc, const std::array& viewport) { + const double half_w = 0.5 * double(viewport[2]); + const double half_h = 0.5 * double(viewport[3]); + return { half_w * ndc.x() + double(viewport[0]) + half_w, half_h * ndc.y() + double(viewport[1]) + half_h }; + }; + + static Vec4d model_to_clip(const Vec3d& model, const Transform3d& world_matrix, const Matrix4d& projection_view_matrix) { + return world_to_clip(model_to_world(model, world_matrix), projection_view_matrix); + } + + static Vec3d model_to_ndc(const Vec3d& model, const Transform3d& world_matrix, const Matrix4d& projection_view_matrix) { + return clip_to_ndc(world_to_clip(model_to_world(model, world_matrix), projection_view_matrix)); + } + + static Vec2d model_to_ss(const Vec3d& model, const Transform3d& world_matrix, const Matrix4d& projection_view_matrix, const std::array& viewport) { + return ndc_to_ss(clip_to_ndc(world_to_clip(model_to_world(model, world_matrix), projection_view_matrix)), viewport); + } + + static Vec2d world_to_ss(const Vec3d& world, const Matrix4d& projection_view_matrix, const std::array& viewport) { + return ndc_to_ss(clip_to_ndc(world_to_clip(world, projection_view_matrix)), viewport); + } + + static const Matrix4d& ndc_to_ss_matrix(const std::array& viewport) { + update(viewport); + return s_cache.ndc_to_ss_matrix; + } + + static const Transform3d ndc_to_ss_matrix_inverse(const std::array& viewport) { + update(viewport); + return s_cache.ndc_to_ss_matrix_inverse; + } + +private: + static void update(const std::array& viewport) { + if (s_cache.viewport == viewport) + return; + + const double half_w = 0.5 * double(viewport[2]); + const double half_h = 0.5 * double(viewport[3]); + s_cache.ndc_to_ss_matrix << half_w, 0.0, 0.0, double(viewport[0]) + half_w, + 0.0, half_h, 0.0, double(viewport[1]) + half_h, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.0, 0.0, 1.0; + + s_cache.ndc_to_ss_matrix_inverse = s_cache.ndc_to_ss_matrix.inverse(); + s_cache.viewport = viewport; + } +}; + +TransformHelper::Cache TransformHelper::s_cache = { { 0, 0, 0, 0 }, Matrix4d::Identity(), Transform3d::Identity() }; + +GLGizmoMeasure::GLGizmoMeasure(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) +: GLGizmoBase(parent, icon_filename, sprite_id) +{ + GLModel::Geometry sphere_geometry = smooth_sphere(16, 7.5f); + m_sphere.mesh_raycaster = std::make_unique(std::make_shared(sphere_geometry.get_as_indexed_triangle_set())); + m_sphere.model.init_from(std::move(sphere_geometry)); + + GLModel::Geometry cylinder_geometry = smooth_cylinder(16, 5.0f, 1.0f); + m_cylinder.mesh_raycaster = std::make_unique(std::make_shared(cylinder_geometry.get_as_indexed_triangle_set())); + m_cylinder.model.init_from(std::move(cylinder_geometry)); +} + +bool GLGizmoMeasure::on_mouse(const wxMouseEvent &mouse_event) +{ + m_mouse_pos = { double(mouse_event.GetX()), double(mouse_event.GetY()) }; + + if (mouse_event.Moving()) { + // only for sure + m_mouse_left_down = false; + return false; + } + else if (mouse_event.Dragging()) { + // Enable/Disable panning/rotating the 3D scene + // Ctrl is pressed or the mouse is not hovering a selected volume + bool unlock_dragging = mouse_event.CmdDown() || (m_hover_id == -1 && !m_parent.get_selection().contains_volume(m_parent.get_first_hover_volume_idx())); + // mode is not center selection or mouse is not hovering a center + unlock_dragging &= !mouse_event.ShiftDown() || (m_hover_id != SEL_SPHERE_1_ID && m_hover_id != SEL_SPHERE_2_ID && m_hover_id != POINT_ID); + return !unlock_dragging; + } + else if (mouse_event.LeftDown()) { + // let the event pass through to allow panning/rotating the 3D scene + if (mouse_event.CmdDown()) + return false; + + if (m_hover_id != -1) { + m_mouse_left_down = true; + + auto detect_current_item = [this]() { + SelectedFeatures::Item item; + if (m_hover_id == SEL_SPHERE_1_ID) { + if (m_selected_features.first.is_center) + // mouse is hovering over a selected center + item = { true, m_selected_features.first.source, { Measure::SurfaceFeature(get_feature_offset(*m_selected_features.first.source)) } }; + else if (is_feature_with_center(*m_selected_features.first.feature)) + // mouse is hovering over a unselected center + item = { true, m_selected_features.first.feature, { Measure::SurfaceFeature(get_feature_offset(*m_selected_features.first.feature)) } }; + else + // mouse is hovering over a point + item = m_selected_features.first; + } + else if (m_hover_id == SEL_SPHERE_2_ID) { + if (m_selected_features.second.is_center) + // mouse is hovering over a selected center + item = { true, m_selected_features.second.source, { Measure::SurfaceFeature(get_feature_offset(*m_selected_features.second.source)) } }; + else if (is_feature_with_center(*m_selected_features.second.feature)) + // mouse is hovering over a center + item = { true, m_selected_features.second.feature, { Measure::SurfaceFeature(get_feature_offset(*m_selected_features.second.feature)) } }; + else + // mouse is hovering over a point + item = m_selected_features.second; + } + else { + switch (m_mode) + { + case EMode::FeatureSelection: { item = { false, m_curr_feature, m_curr_feature }; break; } + case EMode::PointSelection: { item = { false, m_curr_feature, Measure::SurfaceFeature(*m_curr_point_on_feature_position) }; break; } + } + } + return item; + }; + + auto requires_sphere_raycaster_for_picking = [this](const SelectedFeatures::Item& item) { + if (m_mode == EMode::PointSelection || item.feature->get_type() == Measure::SurfaceFeatureType::Point) + return true; + else if (m_mode == EMode::FeatureSelection) { + if (is_feature_with_center(*item.feature)) + return true; + } + return false; + }; + + if (m_selected_features.first.feature.has_value()) { + const SelectedFeatures::Item item = detect_current_item(); + if (m_selected_features.first != item) { + bool processed = false; + if (item.is_center) { + if (item.source == m_selected_features.first.feature) { + // switch 1st selection from feature to its center + m_selected_features.first = item; + processed = true; + } + else if (item.source == m_selected_features.second.feature) { + // switch 2nd selection from feature to its center + m_selected_features.second = item; + processed = true; + } + } + else if (is_feature_with_center(*item.feature)) { + if (m_selected_features.first.is_center && m_selected_features.first.source == item.feature) { + // switch 1st selection from center to its feature + m_selected_features.first = item; + processed = true; + } + else if (m_selected_features.second.is_center && m_selected_features.second.source == item.feature) { + // switch 2nd selection from center to its feature + m_selected_features.second = item; + processed = true; + } + } + + if (!processed) { + remove_selected_sphere_raycaster(SEL_SPHERE_2_ID); + if (m_selected_features.second == item) + // 2nd feature deselection + m_selected_features.second.reset(); + else { + // 2nd feature selection + m_selected_features.second = item; + if (requires_sphere_raycaster_for_picking(item)) + m_selected_sphere_raycasters.push_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, SEL_SPHERE_2_ID, *m_sphere.mesh_raycaster)); + } + } + } + else { + remove_selected_sphere_raycaster(SEL_SPHERE_1_ID); + if (m_selected_features.second.feature.has_value()) { + // promote 2nd feature to 1st feature + remove_selected_sphere_raycaster(SEL_SPHERE_2_ID); + m_selected_features.first = m_selected_features.second; + if (requires_sphere_raycaster_for_picking(m_selected_features.first)) + m_selected_sphere_raycasters.push_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, SEL_SPHERE_1_ID, *m_sphere.mesh_raycaster)); + m_selected_features.second.reset(); + } + else + // 1st feature deselection + m_selected_features.first.reset(); + } + } + else { + // 1st feature selection + const SelectedFeatures::Item item = detect_current_item(); + m_selected_features.first = item; + if (requires_sphere_raycaster_for_picking(item)) + m_selected_sphere_raycasters.push_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, SEL_SPHERE_1_ID, *m_sphere.mesh_raycaster)); + } + + update_measurement_result(); + + m_imgui->set_requires_extra_frame(); + + return true; + } + else + // if the mouse pointer is on any volume, filter out the event to prevent the user to move it + // equivalent tp: return (m_parent.get_first_hover_volume_idx() != -1); + return m_curr_feature.has_value(); + + // fix: prevent restart gizmo when reselect object + // take responsibility for left up + if (m_parent.get_first_hover_volume_idx() >= 0) + m_mouse_left_down = true; + } + else if (mouse_event.LeftUp()) { + if (m_mouse_left_down) { + // responsible for mouse left up after selecting plane + m_mouse_left_down = false; + return true; + } + if (m_hover_id == -1 && !m_parent.is_mouse_dragging()) + // avoid closing the gizmo if the user clicks outside of any volume + return true; + } + else if (mouse_event.RightDown()) { + // let the event pass through to allow panning/rotating the 3D scene + if (mouse_event.CmdDown()) + return false; + } + else if (mouse_event.Leaving()) + m_mouse_left_down = false; + + return false; +} + +void GLGizmoMeasure::data_changed() +{ + m_parent.toggle_sla_auxiliaries_visibility(false, nullptr, -1); + + update_if_needed(); + + m_last_inv_zoom = 0.0f; + m_last_plane_idx = -1; + if (m_pending_scale) { + update_measurement_result(); + m_pending_scale = false; + } + else + m_selected_features.reset(); + m_selected_sphere_raycasters.clear(); + m_editing_distance = false; + m_is_editing_distance_first_frame = true; +} + +bool GLGizmoMeasure::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down) +{ + if (action == SLAGizmoEventType::ShiftDown) { + if (m_shift_kar_filter.is_first()) { + m_mode = EMode::PointSelection; + disable_scene_raycasters(); + } + m_shift_kar_filter.increase_count(); + } + else if (action == SLAGizmoEventType::ShiftUp) { + m_shift_kar_filter.reset_count(); + m_mode = EMode::FeatureSelection; + restore_scene_raycasters_state(); + } + else if (action == SLAGizmoEventType::Delete) { + m_selected_features.reset(); + m_selected_sphere_raycasters.clear(); + m_parent.request_extra_frame(); + } + else if (action == SLAGizmoEventType::Escape) { + if (!m_selected_features.first.feature.has_value()) { + update_measurement_result(); + return false; + } + else { + if (m_selected_features.second.feature.has_value()) { + remove_selected_sphere_raycaster(SEL_SPHERE_2_ID); + m_selected_features.second.feature.reset(); + } + else { + remove_selected_sphere_raycaster(SEL_SPHERE_1_ID); + m_selected_features.first.feature.reset(); + } + + update_measurement_result(); + } + } + + return true; +} + +bool GLGizmoMeasure::on_init() +{ + m_shortcut_key = WXK_CONTROL_U; + return true; +} + +void GLGizmoMeasure::on_set_state() +{ + if (m_state == Off) { + m_parent.toggle_sla_auxiliaries_visibility(true, nullptr, -1); + m_shift_kar_filter.reset_count(); + m_curr_feature.reset(); + m_curr_point_on_feature_position.reset(); + restore_scene_raycasters_state(); + m_editing_distance = false; + m_is_editing_distance_first_frame = true; + m_measuring.reset(); + m_raycaster.reset(); + } + else { + m_mode = EMode::FeatureSelection; + // store current state of scene raycaster for later use + m_scene_raycasters.clear(); + auto scene_raycasters = m_parent.get_raycasters_for_picking(SceneRaycaster::EType::Volume); + if (scene_raycasters != nullptr) { + m_scene_raycasters.reserve(scene_raycasters->size()); + for (auto r : *scene_raycasters) { + SceneRaycasterState state = { r, r->is_active() }; + m_scene_raycasters.emplace_back(state); + } + } + } +} + +std::string GLGizmoMeasure::on_get_name() const +{ + return _u8L("Measure"); +} + +bool GLGizmoMeasure::on_is_activable() const +{ + const Selection& selection = m_parent.get_selection(); + bool res = (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA) ? + selection.is_single_full_instance() : + selection.is_single_full_instance() || selection.is_single_volume() || selection.is_single_modifier(); + if (res) + res &= !selection.contains_sinking_volumes(); + + return res; +} + +void GLGizmoMeasure::on_render() +{ +#if ENABLE_MEASURE_GIZMO_DEBUG + render_debug_dialog(); +#endif // ENABLE_MEASURE_GIZMO_DEBUG + +// // do not render if the user is panning/rotating the 3d scene +// if (m_parent.is_mouse_dragging()) +// return; + + update_if_needed(); + + const Camera& camera = wxGetApp().plater()->get_camera(); + const float inv_zoom = (float)camera.get_inv_zoom(); + + Vec3f position_on_model; + Vec3f normal_on_model; + size_t model_facet_idx; + const bool mouse_on_object = m_raycaster->unproject_on_mesh(m_mouse_pos, Transform3d::Identity(), camera, position_on_model, normal_on_model, nullptr, &model_facet_idx); + const bool is_hovering_on_feature = m_mode == EMode::PointSelection && m_hover_id != -1; + + auto update_circle = [this, inv_zoom]() { + if (m_last_inv_zoom != inv_zoom || m_last_circle != m_curr_feature) { + m_last_inv_zoom = inv_zoom; + m_last_circle = m_curr_feature; + m_circle.reset(); + const auto [center, radius, normal] = m_curr_feature->get_circle(); + GLModel::Geometry circle_geometry = init_torus_data(64, 16, center.cast(), float(radius), 5.0f * inv_zoom, normal.cast(), Transform3f::Identity()); + m_circle.mesh_raycaster = std::make_unique(std::make_shared(circle_geometry.get_as_indexed_triangle_set())); + m_circle.model.init_from(std::move(circle_geometry)); + return true; + } + return false; + }; + + if (m_mode == EMode::FeatureSelection || m_mode == EMode::PointSelection) { + if (m_hover_id == SEL_SPHERE_1_ID || m_hover_id == SEL_SPHERE_2_ID) { + // Skip feature detection if hovering on a selected point/center + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, POINT_ID); + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, EDGE_ID); + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, PLANE_ID); + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, CIRCLE_ID); + m_curr_feature.reset(); + m_curr_point_on_feature_position.reset(); + } + else { + std::optional curr_feature = wxGetMouseState().LeftIsDown() ? m_curr_feature : + mouse_on_object ? m_measuring->get_feature(model_facet_idx, position_on_model.cast()) : std::nullopt; + + if (m_curr_feature != curr_feature || + (curr_feature.has_value() && curr_feature->get_type() == Measure::SurfaceFeatureType::Circle && (m_curr_feature != curr_feature || m_last_inv_zoom != inv_zoom))) { + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, POINT_ID); + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, EDGE_ID); + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, PLANE_ID); + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, CIRCLE_ID); + m_raycasters.clear(); + m_curr_feature = curr_feature; + if (!m_curr_feature.has_value()) + return; + + switch (m_curr_feature->get_type()) { + default: { assert(false); break; } + case Measure::SurfaceFeatureType::Point: + { + m_raycasters.insert({ POINT_ID, m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, POINT_ID, *m_sphere.mesh_raycaster) }); + break; + } + case Measure::SurfaceFeatureType::Edge: + { + m_raycasters.insert({ EDGE_ID, m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, EDGE_ID, *m_cylinder.mesh_raycaster) }); + break; + } + case Measure::SurfaceFeatureType::Circle: + { + update_circle(); + m_raycasters.insert({ CIRCLE_ID, m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, CIRCLE_ID, *m_circle.mesh_raycaster) }); + break; + } + case Measure::SurfaceFeatureType::Plane: + { + const auto [idx, normal, point] = m_curr_feature->get_plane(); + if (m_last_plane_idx != idx) { + m_last_plane_idx = idx; + const indexed_triangle_set& its = m_measuring->get_mesh().its; + const std::vector& plane_triangles = m_measuring->get_plane_triangle_indices(idx); + GLModel::Geometry init_data = init_plane_data(its, plane_triangles); + m_plane.reset(); + m_plane.mesh_raycaster = std::make_unique(std::make_shared(init_data.get_as_indexed_triangle_set())); + } + + m_raycasters.insert({ PLANE_ID, m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, PLANE_ID, *m_plane.mesh_raycaster) }); + break; + } + } + } + } + } + + if (m_mode != EMode::PointSelection) + m_curr_point_on_feature_position.reset(); + else if (is_hovering_on_feature) { + auto position_on_feature = [this](int feature_type_id, const Camera& camera, std::function callback = nullptr) -> Vec3d { + auto it = m_raycasters.find(feature_type_id); + if (it != m_raycasters.end() && it->second != nullptr) { + Vec3f p; + Vec3f n; + const Transform3d& trafo = it->second->get_transform(); + bool res = it->second->get_raycaster()->closest_hit(m_mouse_pos, trafo, camera, p, n); + if (res) { + if (callback) + p = callback(p); + return trafo * p.cast(); + } + } + return Vec3d(DBL_MAX, DBL_MAX, DBL_MAX); + }; + + if (m_curr_feature.has_value()) { + switch (m_curr_feature->get_type()) + { + default: { assert(false); break; } + case Measure::SurfaceFeatureType::Point: + { + m_curr_point_on_feature_position = m_curr_feature->get_point(); + break; + } + case Measure::SurfaceFeatureType::Edge: + { + const std::optional extra = m_curr_feature->get_extra_point(); + if (extra.has_value() && m_hover_id == POINT_ID) + m_curr_point_on_feature_position = *extra; + else { + const Vec3d pos = position_on_feature(EDGE_ID, camera, [](const Vec3f& v) { return Vec3f(0.0f, 0.0f, v.z()); }); + if (!pos.isApprox(Vec3d(DBL_MAX, DBL_MAX, DBL_MAX))) + m_curr_point_on_feature_position = pos; + } + break; + } + case Measure::SurfaceFeatureType::Plane: + { + m_curr_point_on_feature_position = position_on_feature(PLANE_ID, camera); + break; + } + case Measure::SurfaceFeatureType::Circle: + { + const auto [center, radius, normal] = m_curr_feature->get_circle(); + if (m_hover_id == POINT_ID) + m_curr_point_on_feature_position = center; + else { + const Vec3d world_pof = position_on_feature(CIRCLE_ID, camera, [](const Vec3f& v) { return v; }); + const Eigen::Hyperplane plane(normal, center); + const Transform3d local_to_model_matrix = Geometry::translation_transform(center) * Eigen::Quaternion::FromTwoVectors(Vec3d::UnitZ(), normal); + const Vec3d local_proj = local_to_model_matrix.inverse() * plane.projection(world_pof); + double angle = std::atan2(local_proj.y(), local_proj.x()); + if (angle < 0.0) + angle += 2.0 * double(M_PI); + + const Vec3d local_pos = radius * Vec3d(std::cos(angle), std::sin(angle), 0.0); + m_curr_point_on_feature_position = local_to_model_matrix * local_pos; + } + break; + } + } + } + } + else { + m_curr_point_on_feature_position.reset(); + if (m_curr_feature.has_value() && m_curr_feature->get_type() == Measure::SurfaceFeatureType::Circle) { + if (update_circle()) { + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, CIRCLE_ID); + auto it = m_raycasters.find(CIRCLE_ID); + if (it != m_raycasters.end()) + m_raycasters.erase(it); + m_raycasters.insert({ CIRCLE_ID, m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, CIRCLE_ID, *m_circle.mesh_raycaster) }); + } + } + } + + if (!m_curr_feature.has_value() && !m_selected_features.first.feature.has_value()) + return; + + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); + if (shader == nullptr) + return; + + shader->start_using(); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + + glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); + glsafe(::glEnable(GL_DEPTH_TEST)); + const bool old_cullface = ::glIsEnabled(GL_CULL_FACE); + glsafe(::glDisable(GL_CULL_FACE)); + + const Transform3d& view_matrix = camera.get_view_matrix(); + + auto set_matrix_uniforms = [shader, &view_matrix](const Transform3d& model_matrix) { + const Transform3d view_model_matrix = view_matrix * model_matrix; + shader->set_uniform("view_model_matrix", view_model_matrix); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); + }; + + auto set_emission_uniform = [shader](const ColorRGBA& color, bool hover) { + shader->set_uniform("emission_factor", (color == GLVolume::SELECTED_COLOR) ? 0.0f : + hover ? 0.5f : 0.25f); + }; + + auto render_feature = [this, set_matrix_uniforms, set_emission_uniform](const Measure::SurfaceFeature& feature, const std::vector& colors, + float inv_zoom, bool hover, bool update_raycasters_transform) { + switch (feature.get_type()) + { + default: { assert(false); break; } + case Measure::SurfaceFeatureType::Point: + { + const Transform3d feature_matrix = Geometry::translation_transform(feature.get_point()) * Geometry::scale_transform(inv_zoom); + set_matrix_uniforms(feature_matrix); + set_emission_uniform(colors.front(), hover); + m_sphere.model.set_color(colors.front()); + m_sphere.model.render(); + if (update_raycasters_transform) { + auto it = m_raycasters.find(POINT_ID); + if (it != m_raycasters.end() && it->second != nullptr) + it->second->set_transform(feature_matrix); + } + break; + } + case Measure::SurfaceFeatureType::Circle: + { + const auto& [center, radius, normal] = feature.get_circle(); + // render circle + const Transform3d circle_matrix = Transform3d::Identity(); + set_matrix_uniforms(circle_matrix); + if (update_raycasters_transform) { + set_emission_uniform(colors.front(), hover); + m_circle.model.set_color(colors.front()); + m_circle.model.render(); + auto it = m_raycasters.find(CIRCLE_ID); + if (it != m_raycasters.end() && it->second != nullptr) + it->second->set_transform(circle_matrix); + } + else { + GLModel circle; + GLModel::Geometry circle_geometry = init_torus_data(64, 16, center.cast(), float(radius), 5.0f * inv_zoom, normal.cast(), Transform3f::Identity()); + circle.init_from(std::move(circle_geometry)); + set_emission_uniform(colors.front(), hover); + circle.set_color(colors.front()); + circle.render(); + } + // render center + if (colors.size() > 1) { + const Transform3d center_matrix = Geometry::translation_transform(center) * Geometry::scale_transform(inv_zoom); + set_matrix_uniforms(center_matrix); + set_emission_uniform(colors.back(), hover); + m_sphere.model.set_color(colors.back()); + m_sphere.model.render(); + auto it = m_raycasters.find(POINT_ID); + if (it != m_raycasters.end() && it->second != nullptr) + it->second->set_transform(center_matrix); + } + break; + } + case Measure::SurfaceFeatureType::Edge: + { + const auto& [from, to] = feature.get_edge(); + // render edge + const Transform3d edge_matrix = Geometry::translation_transform(from) * + Eigen::Quaternion::FromTwoVectors(Vec3d::UnitZ(), to - from) * + Geometry::scale_transform({ (double)inv_zoom, (double)inv_zoom, (to - from).norm() }); + set_matrix_uniforms(edge_matrix); + set_emission_uniform(colors.front(), hover); + m_cylinder.model.set_color(colors.front()); + m_cylinder.model.render(); + if (update_raycasters_transform) { + auto it = m_raycasters.find(EDGE_ID); + if (it != m_raycasters.end() && it->second != nullptr) + it->second->set_transform(edge_matrix); + } + + // render extra point + if (colors.size() > 1) { + const std::optional extra = feature.get_extra_point(); + if (extra.has_value()) { + const Transform3d point_matrix = Geometry::translation_transform(*extra) * Geometry::scale_transform(inv_zoom); + set_matrix_uniforms(point_matrix); + set_emission_uniform(colors.back(), hover); + m_sphere.model.set_color(colors.back()); + m_sphere.model.render(); + auto it = m_raycasters.find(POINT_ID); + if (it != m_raycasters.end() && it->second != nullptr) + it->second->set_transform(point_matrix); + } + } + break; + } + case Measure::SurfaceFeatureType::Plane: + { + const auto& [idx, normal, pt] = feature.get_plane(); + assert(idx < m_plane_models_cache.size()); + set_matrix_uniforms(Transform3d::Identity()); + set_emission_uniform(colors.front(), hover); + m_plane_models_cache[idx].set_color(colors.front()); + m_plane_models_cache[idx].render(); + if (update_raycasters_transform) { + auto it = m_raycasters.find(PLANE_ID); + if (it != m_raycasters.end() && it->second != nullptr) + it->second->set_transform(Transform3d::Identity()); + } + break; + } + } + }; + + auto hover_selection_color = [this]() { + return ((m_mode == EMode::PointSelection && !m_selected_features.first.feature.has_value()) || + (m_mode != EMode::PointSelection && (!m_selected_features.first.feature.has_value() || *m_curr_feature == *m_selected_features.first.feature))) ? + SELECTED_1ST_COLOR : SELECTED_2ND_COLOR; + }; + + auto hovering_color = [this, hover_selection_color]() { + return (m_mode == EMode::PointSelection) ? GLVolume::SELECTED_COLOR : hover_selection_color(); + }; + + if (m_curr_feature.has_value()) { + // render hovered feature + + std::vector colors; + if (m_selected_features.first.feature.has_value() && *m_curr_feature == *m_selected_features.first.feature) { + // hovering over the 1st selected feature + if (m_selected_features.first.is_center) + // hovering over a center + colors = { NEUTRAL_COLOR, hovering_color() }; + else if (is_feature_with_center(*m_selected_features.first.feature)) + // hovering over a feature with center + colors = { hovering_color(), NEUTRAL_COLOR }; + else + colors = { hovering_color() }; + } + else if (m_selected_features.second.feature.has_value() && *m_curr_feature == *m_selected_features.second.feature) { + // hovering over the 2nd selected feature + if (m_selected_features.second.is_center) + // hovering over a center + colors = { NEUTRAL_COLOR, hovering_color() }; + else if (is_feature_with_center(*m_selected_features.second.feature)) + // hovering over a feature with center + colors = { hovering_color(), NEUTRAL_COLOR }; + else + colors = { hovering_color() }; + } + else { + switch (m_curr_feature->get_type()) + { + default: { assert(false); break; } + case Measure::SurfaceFeatureType::Point: + { + colors.emplace_back(hover_selection_color()); + break; + } + case Measure::SurfaceFeatureType::Edge: + case Measure::SurfaceFeatureType::Circle: + { + if (m_selected_features.first.is_center && m_curr_feature == m_selected_features.first.source) + colors = { SELECTED_1ST_COLOR, NEUTRAL_COLOR }; + else if (m_selected_features.second.is_center && m_curr_feature == m_selected_features.second.source) + colors = { SELECTED_2ND_COLOR, NEUTRAL_COLOR }; + else + colors = { hovering_color(), hovering_color() }; + break; + } + case Measure::SurfaceFeatureType::Plane: + { + colors.emplace_back(hovering_color()); + break; + } + } + } + + render_feature(*m_curr_feature, colors, inv_zoom, true, true); + } + + if (m_selected_features.first.feature.has_value() && (!m_curr_feature.has_value() || *m_curr_feature != *m_selected_features.first.feature)) { + // render 1st selected feature + + std::optional feature_to_render; + std::vector colors; + bool requires_raycaster_update = false; + if (m_hover_id == SEL_SPHERE_1_ID && (m_selected_features.first.is_center || is_feature_with_center(*m_selected_features.first.feature))) { + // hovering over a center + feature_to_render = m_selected_features.first.source; + colors = { NEUTRAL_COLOR, SELECTED_1ST_COLOR }; + requires_raycaster_update = true; + } + else if (is_feature_with_center(*m_selected_features.first.feature)) { + // hovering over a feature with center + feature_to_render = m_selected_features.first.feature; + colors = { SELECTED_1ST_COLOR, NEUTRAL_COLOR }; + requires_raycaster_update = true; + } + else { + feature_to_render = m_selected_features.first.feature; + colors = { SELECTED_1ST_COLOR }; + requires_raycaster_update = m_selected_features.first.feature->get_type() == Measure::SurfaceFeatureType::Point; + } + + render_feature(*feature_to_render, colors, inv_zoom, m_hover_id == SEL_SPHERE_1_ID, false); + + if (requires_raycaster_update) { + auto it = std::find_if(m_selected_sphere_raycasters.begin(), m_selected_sphere_raycasters.end(), + [](std::shared_ptr item) { return SceneRaycaster::decode_id(SceneRaycaster::EType::Gizmo, item->get_id()) == SEL_SPHERE_1_ID; }); + if (it != m_selected_sphere_raycasters.end()) + (*it)->set_transform(Geometry::translation_transform(get_feature_offset(*m_selected_features.first.feature)) * Geometry::scale_transform(inv_zoom)); + } + } + + if (m_selected_features.second.feature.has_value() && (!m_curr_feature.has_value() || *m_curr_feature != *m_selected_features.second.feature)) { + // render 2nd selected feature + + std::optional feature_to_render; + std::vector colors; + bool requires_raycaster_update = false; + if (m_hover_id == SEL_SPHERE_2_ID && (m_selected_features.second.is_center || is_feature_with_center(*m_selected_features.second.feature))) { + // hovering over a center + feature_to_render = m_selected_features.second.source; + colors = { NEUTRAL_COLOR, SELECTED_2ND_COLOR }; + requires_raycaster_update = true; + } + else if (is_feature_with_center(*m_selected_features.second.feature)) { + // hovering over a feature with center + feature_to_render = m_selected_features.second.feature; + colors = { SELECTED_2ND_COLOR, NEUTRAL_COLOR }; + requires_raycaster_update = true; + } + else { + feature_to_render = m_selected_features.second.feature; + colors = { SELECTED_2ND_COLOR }; + requires_raycaster_update = m_selected_features.second.feature->get_type() == Measure::SurfaceFeatureType::Point; + } + + render_feature(*feature_to_render, colors, inv_zoom, m_hover_id == SEL_SPHERE_2_ID, false); + + if (requires_raycaster_update) { + auto it = std::find_if(m_selected_sphere_raycasters.begin(), m_selected_sphere_raycasters.end(), + [](std::shared_ptr item) { return SceneRaycaster::decode_id(SceneRaycaster::EType::Gizmo, item->get_id()) == SEL_SPHERE_2_ID; }); + if (it != m_selected_sphere_raycasters.end()) + (*it)->set_transform(Geometry::translation_transform(get_feature_offset(*m_selected_features.second.feature)) * Geometry::scale_transform(inv_zoom)); + } + } + + if (is_hovering_on_feature && m_curr_point_on_feature_position.has_value()) { + if (m_hover_id != POINT_ID) { + // render point on feature while SHIFT is pressed + const Transform3d matrix = Geometry::translation_transform(*m_curr_point_on_feature_position) * Geometry::scale_transform(inv_zoom); + set_matrix_uniforms(matrix); + const ColorRGBA color = hover_selection_color(); + set_emission_uniform(color, true); + m_sphere.model.set_color(color); + m_sphere.model.render(); + } + } + + shader->stop_using(); + + if (old_cullface) + glsafe(::glEnable(GL_CULL_FACE)); + + render_dimensioning(); +} + +void GLGizmoMeasure::update_if_needed() +{ + auto update_plane_models_cache = [this](const indexed_triangle_set& its) { + m_plane_models_cache.clear(); + for (int idx = 0; idx < m_measuring->get_num_of_planes(); ++idx) { + m_plane_models_cache.emplace_back(GLModel()); + GLModel::Geometry init_data = init_plane_data(its, m_measuring->get_plane_triangle_indices(idx)); + m_plane_models_cache.back().init_from(std::move(init_data)); + } + }; + + auto do_update = [this, update_plane_models_cache](const std::vector& volumes_cache, const Selection& selection) { + TriangleMesh composite_mesh; + for (const auto& vol : volumes_cache) { +// if (selection.is_single_full_instance() && vol.volume->is_modifier()) +// continue; + + TriangleMesh volume_mesh = vol.volume->mesh(); + volume_mesh.transform(vol.world_trafo); + + if (vol.world_trafo.matrix().determinant() < 0.0) + volume_mesh.flip_triangles(); + + composite_mesh.merge(volume_mesh); + } + + m_measuring.reset(new Measure::Measuring(composite_mesh.its)); + update_plane_models_cache(m_measuring->get_mesh().its); + m_raycaster.reset(new MeshRaycaster(std::make_shared(m_measuring->get_mesh()))); + m_volumes_cache = volumes_cache; + }; + + const Selection& selection = m_parent.get_selection(); + if (selection.is_empty()) + return; + + const Selection::IndicesList& idxs = selection.get_volume_idxs(); + std::vector volumes_cache; + volumes_cache.reserve(idxs.size()); + for (unsigned int idx : idxs) { + const GLVolume* v = selection.get_volume(idx); + const int volume_idx = v->volume_idx(); + if (volume_idx < 0) + continue; + + const ModelObject* obj = selection.get_model()->objects[v->object_idx()]; + const ModelInstance* inst = obj->instances[v->instance_idx()]; + const ModelVolume* vol = obj->volumes[volume_idx]; + const VolumeCacheItem item = { + obj, inst, vol, + Geometry::translation_transform(selection.get_first_volume()->get_sla_shift_z() * Vec3d::UnitZ()) * inst->get_matrix() * vol->get_matrix() + }; + volumes_cache.emplace_back(item); + } + + if (m_state != On || volumes_cache.empty()) + return; + + if (m_measuring == nullptr || m_volumes_cache != volumes_cache) + do_update(volumes_cache, selection); +} + +void GLGizmoMeasure::disable_scene_raycasters() +{ + for (auto r : m_scene_raycasters) { + r.raycaster->set_active(false); + } +} + +void GLGizmoMeasure::restore_scene_raycasters_state() +{ + for (auto r : m_scene_raycasters) { + r.raycaster->set_active(r.state); + } +} + +void GLGizmoMeasure::render_dimensioning() +{ + static SelectedFeatures last_selected_features; + + if (!m_selected_features.first.feature.has_value()) + return; + + if (!m_selected_features.second.feature.has_value() && m_selected_features.first.feature->get_type() != Measure::SurfaceFeatureType::Circle) + return; + + GLShaderProgram* shader = wxGetApp().get_shader("flat"); + if (shader == nullptr) + return; + + auto point_point = [this, &shader](const Vec3d& v1, const Vec3d& v2, float distance) { + if ((v2 - v1).squaredNorm() < 0.000001 || distance < 0.001f) + return; + + const Camera& camera = wxGetApp().plater()->get_camera(); + const Matrix4d projection_view_matrix = camera.get_projection_matrix().matrix() * camera.get_view_matrix().matrix(); + const std::array& viewport = camera.get_viewport(); + + // screen coordinates + const Vec2d v1ss = TransformHelper::world_to_ss(v1, projection_view_matrix, viewport); + const Vec2d v2ss = TransformHelper::world_to_ss(v2, projection_view_matrix, viewport); + + if (v1ss.isApprox(v2ss)) + return; + + const Vec2d v12ss = v2ss - v1ss; + const double v12ss_len = v12ss.norm(); + + const bool overlap = v12ss_len - 2.0 * TRIANGLE_HEIGHT < 0.0; + + const auto q12ss = Eigen::Quaternion::FromTwoVectors(Vec3d::UnitX(), Vec3d(v12ss.x(), v12ss.y(), 0.0)); + const auto q21ss = Eigen::Quaternion::FromTwoVectors(Vec3d::UnitX(), Vec3d(-v12ss.x(), -v12ss.y(), 0.0)); + + shader->set_uniform("projection_matrix", Transform3d::Identity()); + + const Vec3d v1ss_3 = { v1ss.x(), v1ss.y(), 0.0 }; + const Vec3d v2ss_3 = { v2ss.x(), v2ss.y(), 0.0 }; + + const Transform3d ss_to_ndc_matrix = TransformHelper::ndc_to_ss_matrix_inverse(viewport); + +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_core_profile()) { + shader->stop_using(); + + shader = wxGetApp().get_shader("dashed_thick_lines"); + if (shader == nullptr) + return; + + shader->start_using(); + shader->set_uniform("projection_matrix", Transform3d::Identity()); + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 1.0f); + shader->set_uniform("gap_size", 0.0f); + } + else +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth(2.0f)); + + // stem + shader->set_uniform("view_model_matrix", overlap ? + ss_to_ndc_matrix * Geometry::translation_transform(v1ss_3) * q12ss * Geometry::translation_transform(-2.0 * TRIANGLE_HEIGHT * Vec3d::UnitX()) * Geometry::scale_transform({ v12ss_len + 4.0 * TRIANGLE_HEIGHT, 1.0f, 1.0f }) : + ss_to_ndc_matrix * Geometry::translation_transform(v1ss_3) * q12ss * Geometry::scale_transform({ v12ss_len, 1.0f, 1.0f })); + m_dimensioning.line.set_color(ColorRGBA::WHITE()); + m_dimensioning.line.render(); + +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_core_profile()) { + shader->stop_using(); + + shader = wxGetApp().get_shader("flat"); + if (shader == nullptr) + return; + + shader->start_using(); + } + else +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth(1.0f)); + + // arrow 1 + shader->set_uniform("view_model_matrix", overlap ? + ss_to_ndc_matrix * Geometry::translation_transform(v1ss_3) * q12ss : + ss_to_ndc_matrix * Geometry::translation_transform(v1ss_3) * q21ss); + m_dimensioning.triangle.render(); + + // arrow 2 + shader->set_uniform("view_model_matrix", overlap ? + ss_to_ndc_matrix * Geometry::translation_transform(v2ss_3) * q21ss : + ss_to_ndc_matrix * Geometry::translation_transform(v2ss_3) * q12ss); + m_dimensioning.triangle.render(); + + const bool use_inches = wxGetApp().app_config->get_bool("use_inches"); + const double curr_value = use_inches ? ObjectManipulation::mm_to_in * distance : distance; + const std::string curr_value_str = format_double(curr_value); + const std::string units = use_inches ? _u8L("in") : _u8L("mm"); + const float value_str_width = 20.0f + ImGui::CalcTextSize(curr_value_str.c_str()).x; + static double edit_value = 0.0; + + const Vec2d label_position = 0.5 * (v1ss + v2ss); + m_imgui->set_next_window_pos(label_position.x(), viewport[3] - label_position.y(), ImGuiCond_Always, 0.0f, 1.0f); + m_imgui->set_next_window_bg_alpha(0.0f); + + if (!m_editing_distance) { + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, { 1.0f, 1.0f }); + m_imgui->begin(std::string("distance"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration); + ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow()); + ImGui::AlignTextToFramePadding(); + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + const ImVec2 pos = ImGui::GetCursorScreenPos(); + const std::string txt = curr_value_str + " " + units; + ImVec2 txt_size = ImGui::CalcTextSize(txt.c_str()); + const ImGuiStyle& style = ImGui::GetStyle(); + draw_list->AddRectFilled({ pos.x - style.FramePadding.x, pos.y + style.FramePadding.y }, { pos.x + txt_size.x + 2.0f * style.FramePadding.x , pos.y + txt_size.y + 2.0f * style.FramePadding.y }, + ImGuiWrapper::to_ImU32(ColorRGBA(0.5f, 0.5f, 0.5f, 0.5f))); + ImGui::SetCursorScreenPos({ pos.x + style.FramePadding.x, pos.y }); + m_imgui->text(txt); + ImGui::SameLine(); + if (m_imgui->image_button(ImGui::SliderFloatEditBtnIcon, _L("Edit to scale"))) { + m_editing_distance = true; + edit_value = curr_value; + m_imgui->requires_extra_frame(); + } + m_imgui->end(); + ImGui::PopStyleVar(3); + } + + if (m_editing_distance && !ImGui::IsPopupOpen("distance_popup")) + ImGui::OpenPopup("distance_popup"); + + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, { 1.0f, 1.0f }); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, { 4.0f, 0.0f }); + if (ImGui::BeginPopupModal("distance_popup", nullptr, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration)) { + auto perform_scale = [this](double new_value, double old_value) { + if (new_value == old_value || new_value <= 0.0) + return; + + const double ratio = new_value / old_value; + wxGetApp().plater()->take_snapshot(_L("Scale")); + + struct TrafoData + { + double ratio; + Vec3d old_pivot; + Vec3d new_pivot; + Transform3d scale_matrix; + + TrafoData(double ratio, const Vec3d& old_pivot, const Vec3d& new_pivot) { + this->ratio = ratio; + this->scale_matrix = Geometry::scale_transform(ratio); + this->old_pivot = old_pivot; + this->new_pivot = new_pivot; + } + + Vec3d transform(const Vec3d& point) const { return this->scale_matrix * (point - this->old_pivot) + this->new_pivot; } + }; + + auto scale_feature = [](Measure::SurfaceFeature& feature, const TrafoData& trafo_data) { + switch (feature.get_type()) + { + case Measure::SurfaceFeatureType::Point: + { + feature = Measure::SurfaceFeature(trafo_data.transform(feature.get_point())); + break; + } + case Measure::SurfaceFeatureType::Edge: + { + const auto [from, to] = feature.get_edge(); + const std::optional extra = feature.get_extra_point(); + const std::optional new_extra = extra.has_value() ? trafo_data.transform(*extra) : extra; + feature = Measure::SurfaceFeature(Measure::SurfaceFeatureType::Edge, trafo_data.transform(from), trafo_data.transform(to), new_extra); + break; + } + case Measure::SurfaceFeatureType::Circle: + { + const auto [center, radius, normal] = feature.get_circle(); + feature = Measure::SurfaceFeature(Measure::SurfaceFeatureType::Circle, trafo_data.transform(center), normal, std::nullopt, trafo_data.ratio * radius); + break; + } + case Measure::SurfaceFeatureType::Plane: + { + const auto [idx, normal, origin] = feature.get_plane(); + feature = Measure::SurfaceFeature(Measure::SurfaceFeatureType::Plane, normal, trafo_data.transform(origin), std::nullopt, idx); + break; + } + default: { break; } + } + }; + + // apply scale + TransformationType type; + type.set_world(); + type.set_relative(); + type.set_joint(); + + // scale selection + Selection& selection = m_parent.get_selection(); + const Vec3d old_center = selection.get_bounding_box().center(); + selection.setup_cache(); + selection.scale(ratio * Vec3d::Ones(), type); + wxGetApp().plater()->canvas3D()->do_scale(""); // avoid storing another snapshot + wxGetApp().obj_manipul()->set_dirty(); + + // scale dimensioning + const Vec3d new_center = selection.get_bounding_box().center(); + const TrafoData trafo_data(ratio, old_center, new_center); + scale_feature(*m_selected_features.first.feature, trafo_data); + if (m_selected_features.second.feature.has_value()) + scale_feature(*m_selected_features.second.feature, trafo_data); + + // update measure on next call to data_changed() + m_pending_scale = true; + }; + auto action_exit = [this]() { + m_editing_distance = false; + m_is_editing_distance_first_frame = true; + ImGui::CloseCurrentPopup(); + }; + auto action_scale = [perform_scale, action_exit](double new_value, double old_value) { + perform_scale(new_value, old_value); + action_exit(); + }; + + m_imgui->disable_background_fadeout_animation(); + ImGui::PushItemWidth(value_str_width); + if (ImGui::InputDouble("##distance", &edit_value, 0.0f, 0.0f, "%.3f")) { + } + + // trick to auto-select text in the input widgets on 1st frame + if (m_is_editing_distance_first_frame) { + ImGui::SetKeyboardFocusHere(0); + m_is_editing_distance_first_frame = false; + m_imgui->set_requires_extra_frame(); + } + + // handle keys input + if (ImGui::IsKeyPressedMap(ImGuiKey_Enter) || ImGui::IsKeyPressedMap(ImGuiKey_KeyPadEnter)) + action_scale(edit_value, curr_value); + else if (ImGui::IsKeyPressedMap(ImGuiKey_Escape)) + action_exit(); + + ImGui::SameLine(); + if (m_imgui->button(_CTX(L_CONTEXT("Scale", "Verb"), "Verb"))) + action_scale(edit_value, curr_value); + ImGui::SameLine(); + if (m_imgui->button(_L("Cancel"))) + action_exit(); + ImGui::EndPopup(); + } + ImGui::PopStyleVar(4); + }; + + auto point_edge = [this, shader](const Measure::SurfaceFeature& f1, const Measure::SurfaceFeature& f2) { + assert(f1.get_type() == Measure::SurfaceFeatureType::Point && f2.get_type() == Measure::SurfaceFeatureType::Edge); + std::pair e = f2.get_edge(); + const Vec3d v_proj = m_measurement_result.distance_infinite->to; + const Vec3d e1e2 = e.second - e.first; + const Vec3d v_proje1 = v_proj - e.first; + const bool on_e1_side = v_proje1.dot(e1e2) < -EPSILON; + const bool on_e2_side = !on_e1_side && v_proje1.norm() > e1e2.norm(); + if (on_e1_side || on_e2_side) { + const Camera& camera = wxGetApp().plater()->get_camera(); + const Matrix4d projection_view_matrix = camera.get_projection_matrix().matrix() * camera.get_view_matrix().matrix(); + const std::array& viewport = camera.get_viewport(); + const Transform3d ss_to_ndc_matrix = TransformHelper::ndc_to_ss_matrix_inverse(viewport); + + const Vec2d v_projss = TransformHelper::world_to_ss(v_proj, projection_view_matrix, viewport); + auto render_extension = [this, &v_projss, &projection_view_matrix, &viewport, &ss_to_ndc_matrix, shader](const Vec3d& p) { + const Vec2d pss = TransformHelper::world_to_ss(p, projection_view_matrix, viewport); + if (!pss.isApprox(v_projss)) { + const Vec2d pv_projss = v_projss - pss; + const double pv_projss_len = pv_projss.norm(); + + const auto q = Eigen::Quaternion::FromTwoVectors(Vec3d::UnitX(), Vec3d(pv_projss.x(), pv_projss.y(), 0.0)); + + shader->set_uniform("projection_matrix", Transform3d::Identity()); + shader->set_uniform("view_model_matrix", ss_to_ndc_matrix * Geometry::translation_transform({ pss.x(), pss.y(), 0.0 }) * q * + Geometry::scale_transform({ pv_projss_len, 1.0f, 1.0f })); + m_dimensioning.line.set_color(ColorRGBA::LIGHT_GRAY()); + m_dimensioning.line.render(); + } + }; + + render_extension(on_e1_side ? e.first : e.second); + } + }; + + auto arc_edge_edge = [this, &shader](const Measure::SurfaceFeature& f1, const Measure::SurfaceFeature& f2, double radius = 0.0) { + assert(f1.get_type() == Measure::SurfaceFeatureType::Edge && f2.get_type() == Measure::SurfaceFeatureType::Edge); + if (!m_measurement_result.angle.has_value()) + return; + + const double angle = m_measurement_result.angle->angle; + const Vec3d center = m_measurement_result.angle->center; + const std::pair e1 = m_measurement_result.angle->e1; + const std::pair e2 = m_measurement_result.angle->e2; + const double calc_radius = m_measurement_result.angle->radius; + const bool coplanar = m_measurement_result.angle->coplanar; + + if (std::abs(angle) < EPSILON || std::abs(calc_radius) < EPSILON) + return; + + const double draw_radius = (radius > 0.0) ? radius : calc_radius; + + const Vec3d e1_unit = Measure::edge_direction(e1); + const Vec3d e2_unit = Measure::edge_direction(e2); + + const unsigned int resolution = std::max(2, 64 * angle / double(PI)); + const double step = angle / double(resolution); + const Vec3d normal = e1_unit.cross(e2_unit).normalized(); + + if (!m_dimensioning.arc.is_initialized()) { + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::LineStrip, GLModel::Geometry::EVertexLayout::P3 }; + init_data.color = ColorRGBA::WHITE(); + init_data.reserve_vertices(resolution + 1); + init_data.reserve_indices(resolution + 1); + + // vertices + indices + for (unsigned int i = 0; i <= resolution; ++i) { + const double a = step * double(i); + const Vec3d v = draw_radius * (Eigen::Quaternion(Eigen::AngleAxisd(a, normal)) * e1_unit); + init_data.add_vertex((Vec3f)v.cast()); + init_data.add_index(i); + } + + m_dimensioning.arc.init_from(std::move(init_data)); + } + + const Camera& camera = wxGetApp().plater()->get_camera(); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_core_profile()) { + shader->stop_using(); + + shader = wxGetApp().get_shader("dashed_thick_lines"); + if (shader == nullptr) + return; + + shader->start_using(); + shader->set_uniform("projection_matrix", Transform3d::Identity()); + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 1.0f); + shader->set_uniform("gap_size", 0.0f); + } + else +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth(2.0f)); + + // arc + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("view_model_matrix", camera.get_view_matrix() * Geometry::translation_transform(center)); + m_dimensioning.arc.render(); + +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_core_profile()) { + shader->stop_using(); + + shader = wxGetApp().get_shader("flat"); + if (shader == nullptr) + return; + + shader->start_using(); + } + else +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth(1.0f)); + + // arrows + auto render_arrow = [this, shader, &camera, &normal, ¢er, &e1_unit, draw_radius, step, resolution](unsigned int endpoint_id) { + const double angle = (endpoint_id == 1) ? 0.0 : step * double(resolution); + const Vec3d position_model = Geometry::translation_transform(center) * (draw_radius * (Eigen::Quaternion(Eigen::AngleAxisd(angle, normal)) * e1_unit)); + const Vec3d direction_model = (endpoint_id == 1) ? -normal.cross(position_model - center).normalized() : normal.cross(position_model - center).normalized(); + const auto qz = Eigen::Quaternion::FromTwoVectors(Vec3d::UnitZ(), (endpoint_id == 1) ? normal : -normal); + const auto qx = Eigen::Quaternion::FromTwoVectors(qz * Vec3d::UnitX(), direction_model); + const Transform3d view_model_matrix = camera.get_view_matrix() * Geometry::translation_transform(position_model) * + qx * qz * Geometry::scale_transform(camera.get_inv_zoom()); + shader->set_uniform("view_model_matrix", view_model_matrix); + m_dimensioning.triangle.render(); + }; + + glsafe(::glDisable(GL_CULL_FACE)); + render_arrow(1); + render_arrow(2); + glsafe(::glEnable(GL_CULL_FACE)); + + // edge 1 extension + const Vec3d e11e12 = e1.second - e1.first; + const Vec3d e11center = center - e1.first; + const double e11center_len = e11center.norm(); + if (e11center_len > EPSILON && e11center.dot(e11e12) < 0.0) { + shader->set_uniform("view_model_matrix", camera.get_view_matrix() * Geometry::translation_transform(center) * + Eigen::Quaternion::FromTwoVectors(Vec3d::UnitX(), Measure::edge_direction(e1.first, e1.second)) * + Geometry::scale_transform({ e11center_len, 1.0f, 1.0f })); + m_dimensioning.line.set_color(ColorRGBA::LIGHT_GRAY()); + m_dimensioning.line.render(); + } + + // edge 2 extension + const Vec3d e21center = center - e2.first; + const double e21center_len = e21center.norm(); + if (e21center_len > EPSILON) { + shader->set_uniform("view_model_matrix", camera.get_view_matrix() * Geometry::translation_transform(center) * + Eigen::Quaternion::FromTwoVectors(Vec3d::UnitX(), Measure::edge_direction(e2.first, e2.second)) * + Geometry::scale_transform({ (coplanar && radius > 0.0) ? e21center_len : draw_radius, 1.0f, 1.0f })); + m_dimensioning.line.set_color(ColorRGBA::LIGHT_GRAY()); + m_dimensioning.line.render(); + } + + // label + // label world coordinates + const Vec3d label_position_world = Geometry::translation_transform(center) * (draw_radius * (Eigen::Quaternion(Eigen::AngleAxisd(step * 0.5 * double(resolution), normal)) * e1_unit)); + + // label screen coordinates + const std::array& viewport = camera.get_viewport(); + const Vec2d label_position_ss = TransformHelper::world_to_ss(label_position_world, + camera.get_projection_matrix().matrix() * camera.get_view_matrix().matrix(), viewport); + + m_imgui->set_next_window_pos(label_position_ss.x(), viewport[3] - label_position_ss.y(), ImGuiCond_Always, 0.0f, 1.0f); + m_imgui->set_next_window_bg_alpha(0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); + m_imgui->begin(wxString("##angle"), ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove); + ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow()); + ImGui::AlignTextToFramePadding(); + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + const ImVec2 pos = ImGui::GetCursorScreenPos(); + const std::string txt = format_double(Geometry::rad2deg(angle)) + "°"; + ImVec2 txt_size = ImGui::CalcTextSize(txt.c_str()); + const ImGuiStyle& style = ImGui::GetStyle(); + draw_list->AddRectFilled({ pos.x - style.FramePadding.x, pos.y + style.FramePadding.y }, { pos.x + txt_size.x + 2.0f * style.FramePadding.x , pos.y + txt_size.y + 2.0f * style.FramePadding.y }, + ImGuiWrapper::to_ImU32(ColorRGBA(0.5f, 0.5f, 0.5f, 0.5f))); + ImGui::SetCursorScreenPos({ pos.x + style.FramePadding.x, pos.y }); + m_imgui->text(txt); + m_imgui->end(); + ImGui::PopStyleVar(); + }; + + auto arc_edge_plane = [this, arc_edge_edge](const Measure::SurfaceFeature& f1, const Measure::SurfaceFeature& f2) { + assert(f1.get_type() == Measure::SurfaceFeatureType::Edge && f2.get_type() == Measure::SurfaceFeatureType::Plane); + if (!m_measurement_result.angle.has_value()) + return; + + const std::pair e1 = m_measurement_result.angle->e1; + const std::pair e2 = m_measurement_result.angle->e2; + const double calc_radius = m_measurement_result.angle->radius; + + if (calc_radius == 0.0) + return; + + arc_edge_edge(Measure::SurfaceFeature(Measure::SurfaceFeatureType::Edge, e1.first, e1.second), + Measure::SurfaceFeature(Measure::SurfaceFeatureType::Edge, e2.first, e2.second), calc_radius); + }; + + auto arc_plane_plane = [this, arc_edge_edge](const Measure::SurfaceFeature& f1, const Measure::SurfaceFeature& f2) { + assert(f1.get_type() == Measure::SurfaceFeatureType::Plane && f2.get_type() == Measure::SurfaceFeatureType::Plane); + if (!m_measurement_result.angle.has_value()) + return; + + const std::pair e1 = m_measurement_result.angle->e1; + const std::pair e2 = m_measurement_result.angle->e2; + const double calc_radius = m_measurement_result.angle->radius; + + if (calc_radius == 0.0) + return; + + arc_edge_edge(Measure::SurfaceFeature(Measure::SurfaceFeatureType::Edge, e1.first, e1.second), + Measure::SurfaceFeature(Measure::SurfaceFeatureType::Edge, e2.first, e2.second), calc_radius); + }; + + shader->start_using(); + + if (!m_dimensioning.line.is_initialized()) { + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; + init_data.color = ColorRGBA::WHITE(); + init_data.reserve_vertices(2); + init_data.reserve_indices(2); + + // vertices + init_data.add_vertex(Vec3f(0.0f, 0.0f, 0.0f)); + init_data.add_vertex(Vec3f(1.0f, 0.0f, 0.0f)); + + // indices + init_data.add_line(0, 1); + + m_dimensioning.line.init_from(std::move(init_data)); + } + + if (!m_dimensioning.triangle.is_initialized()) { + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3 }; + init_data.color = ColorRGBA::WHITE(); + init_data.reserve_vertices(3); + init_data.reserve_indices(3); + + // vertices + init_data.add_vertex(Vec3f(0.0f, 0.0f, 0.0f)); + init_data.add_vertex(Vec3f(-TRIANGLE_HEIGHT, 0.5f * TRIANGLE_BASE, 0.0f)); + init_data.add_vertex(Vec3f(-TRIANGLE_HEIGHT, -0.5f * TRIANGLE_BASE, 0.0f)); + + // indices + init_data.add_triangle(0, 1, 2); + + m_dimensioning.triangle.init_from(std::move(init_data)); + } + + if (last_selected_features != m_selected_features) + m_dimensioning.arc.reset(); + + glsafe(::glDisable(GL_DEPTH_TEST)); + + const bool has_distance = m_measurement_result.has_distance_data(); + + const Measure::SurfaceFeature* f1 = &(*m_selected_features.first.feature); + const Measure::SurfaceFeature* f2 = nullptr; + std::unique_ptr temp_feature; + if (m_selected_features.second.feature.has_value()) + f2 = &(*m_selected_features.second.feature); + else { + assert(m_selected_features.first.feature->get_type() == Measure::SurfaceFeatureType::Circle); + temp_feature = std::make_unique(std::get<0>(m_selected_features.first.feature->get_circle())); + f2 = temp_feature.get(); + } + + if (!m_selected_features.second.feature.has_value() && m_selected_features.first.feature->get_type() != Measure::SurfaceFeatureType::Circle) + return; + + Measure::SurfaceFeatureType ft1 = f1->get_type(); + Measure::SurfaceFeatureType ft2 = f2->get_type(); + + // Order features by type so following conditions are simple. + if (ft1 > ft2) { + std::swap(ft1, ft2); + std::swap(f1, f2); + } + + // If there is an angle to show, draw the arc: + if (ft1 == Measure::SurfaceFeatureType::Edge && ft2 == Measure::SurfaceFeatureType::Edge) + arc_edge_edge(*f1, *f2); + else if (ft1 == Measure::SurfaceFeatureType::Edge && ft2 == Measure::SurfaceFeatureType::Plane) + arc_edge_plane(*f1, *f2); + else if (ft1 == Measure::SurfaceFeatureType::Plane && ft2 == Measure::SurfaceFeatureType::Plane) + arc_plane_plane(*f1, *f2); + + if (has_distance){ + // Where needed, draw the extension of the edge to where the dist is measured: + if (ft1 == Measure::SurfaceFeatureType::Point && ft2 == Measure::SurfaceFeatureType::Edge) + point_edge(*f1, *f2); + + // Render the arrow between the points that the backend passed: + const Measure::DistAndPoints& dap = m_measurement_result.distance_infinite.has_value() + ? *m_measurement_result.distance_infinite + : *m_measurement_result.distance_strict; + point_point(dap.from, dap.to, dap.dist); + } + + glsafe(::glEnable(GL_DEPTH_TEST)); + + shader->stop_using(); +} + +static void add_row_to_table(std::function col_1 = nullptr, std::function col_2 = nullptr) +{ + assert(col_1 != nullptr && col_2 != nullptr); + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + col_1(); + ImGui::TableSetColumnIndex(1); + col_2(); +} + +static void add_strings_row_to_table(ImGuiWrapper& imgui, const std::string& col_1, const ImVec4& col_1_color, const std::string& col_2, const ImVec4& col_2_color) +{ + add_row_to_table([&]() { imgui.text_colored(col_1_color, col_1); }, [&]() { imgui.text_colored(col_2_color, col_2); }); +}; + +#if ENABLE_MEASURE_GIZMO_DEBUG +void GLGizmoMeasure::render_debug_dialog() +{ + auto add_feature_data = [this](const SelectedFeatures::Item& item) { + const std::string text = (item.source == item.feature) ? surface_feature_type_as_string(item.feature->get_type()) : point_on_feature_type_as_string(item.source->get_type(), m_hover_id); + add_strings_row_to_table(*m_imgui, "Type", ImGuiWrapper::COL_ORANGE_LIGHT, text, ImGui::GetStyleColorVec4(ImGuiCol_Text)); + switch (item.feature->get_type()) + { + case Measure::SurfaceFeatureType::Point: + { + add_strings_row_to_table(*m_imgui, "m_pt1", ImGuiWrapper::COL_ORANGE_LIGHT, format_vec3(item.feature->get_point()), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + break; + } + case Measure::SurfaceFeatureType::Edge: + { + auto [from, to] = item.feature->get_edge(); + add_strings_row_to_table(*m_imgui, "m_pt1", ImGuiWrapper::COL_ORANGE_LIGHT, format_vec3(from), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + add_strings_row_to_table(*m_imgui, "m_pt2", ImGuiWrapper::COL_ORANGE_LIGHT, format_vec3(to), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + break; + } + case Measure::SurfaceFeatureType::Plane: + { + auto [idx, normal, origin] = item.feature->get_plane(); + add_strings_row_to_table(*m_imgui, "m_pt1", ImGuiWrapper::COL_ORANGE_LIGHT, format_vec3(normal), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + add_strings_row_to_table(*m_imgui, "m_pt2", ImGuiWrapper::COL_ORANGE_LIGHT, format_vec3(origin), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + add_strings_row_to_table(*m_imgui, "m_value", ImGuiWrapper::COL_ORANGE_LIGHT, format_double(idx), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + break; + } + case Measure::SurfaceFeatureType::Circle: + { + auto [center, radius, normal] = item.feature->get_circle(); + const Vec3d on_circle = center + radius * Measure::get_orthogonal(normal, true); + radius = (on_circle - center).norm(); + add_strings_row_to_table(*m_imgui, "m_pt1", ImGuiWrapper::COL_ORANGE_LIGHT, format_vec3(center), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + add_strings_row_to_table(*m_imgui, "m_pt2", ImGuiWrapper::COL_ORANGE_LIGHT, format_vec3(normal), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + add_strings_row_to_table(*m_imgui, "m_value", ImGuiWrapper::COL_ORANGE_LIGHT, format_double(radius), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + break; + } + } + std::optional extra_point = item.feature->get_extra_point(); + if (extra_point.has_value()) + add_strings_row_to_table(*m_imgui, "m_pt3", ImGuiWrapper::COL_ORANGE_LIGHT, format_vec3(*extra_point), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + }; + + m_imgui->begin("Measure tool debug", ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); + if (ImGui::BeginTable("Mode", 2)) { + std::string txt; + switch (m_mode) + { + case EMode::FeatureSelection: { txt = "Feature selection"; break; } + case EMode::PointSelection: { txt = "Point selection"; break; } + default: { assert(false); break; } + } + add_strings_row_to_table(*m_imgui, "Mode", ImGuiWrapper::COL_ORANGE_LIGHT, txt, ImGui::GetStyleColorVec4(ImGuiCol_Text)); + ImGui::EndTable(); + } + + ImGui::Separator(); + if (ImGui::BeginTable("Hover", 2)) { + add_strings_row_to_table(*m_imgui, "Hover id", ImGuiWrapper::COL_ORANGE_LIGHT, std::to_string(m_hover_id), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + const std::string txt = m_curr_feature.has_value() ? surface_feature_type_as_string(m_curr_feature->get_type()) : "None"; + add_strings_row_to_table(*m_imgui, "Current feature", ImGuiWrapper::COL_ORANGE_LIGHT, txt, ImGui::GetStyleColorVec4(ImGuiCol_Text)); + ImGui::EndTable(); + } + + ImGui::Separator(); + if (!m_selected_features.first.feature.has_value() && !m_selected_features.second.feature.has_value()) + m_imgui->text("Empty selection"); + else { + const ImGuiTableFlags flags = ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersH; + if (m_selected_features.first.feature.has_value()) { + m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "Selection 1"); + if (ImGui::BeginTable("Selection 1", 2, flags)) { + add_feature_data(m_selected_features.first); + ImGui::EndTable(); + } + } + if (m_selected_features.second.feature.has_value()) { + m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "Selection 2"); + if (ImGui::BeginTable("Selection 2", 2, flags)) { + add_feature_data(m_selected_features.second); + ImGui::EndTable(); + } + } + } + m_imgui->end(); +} +#endif // ENABLE_MEASURE_GIZMO_DEBUG + +void GLGizmoMeasure::on_render_input_window(float x, float y, float bottom_limit) +{ + static std::optional last_feature; + static EMode last_mode = EMode::FeatureSelection; + static SelectedFeatures last_selected_features; + + static float last_y = 0.0f; + static float last_h = 0.0f; + + if (m_editing_distance) + return; + + m_imgui->begin(get_name(), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); + + // adjust window position to avoid overlap the view toolbar + const float win_h = ImGui::GetWindowHeight(); + y = std::min(y, bottom_limit - win_h); + ImGui::SetWindowPos(ImVec2(x, y), ImGuiCond_Always); + if (last_h != win_h || last_y != y) { + // ask canvas for another frame to render the window in the correct position + m_imgui->set_requires_extra_frame(); + if (last_h != win_h) + last_h = win_h; + if (last_y != y) + last_y = y; + } + + if (ImGui::BeginTable("Commands", 2)) { + unsigned int row_count = 1; + add_row_to_table( + [this]() { + m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _u8L("Left mouse button")); + }, + [this]() { + std::string text; + ColorRGBA color; + if (m_selected_features.second.feature.has_value()) { + if (m_selected_features.first.feature == m_curr_feature && m_mode == EMode::FeatureSelection) { + // hovering over 1st selected feature + text = _u8L("Unselect feature"); + color = SELECTED_1ST_COLOR; + } + else if (m_hover_id == SEL_SPHERE_1_ID) { + if (m_selected_features.first.is_center) { + // hovering over center selected as 1st feature + text = _u8L("Unselect center"); + color = SELECTED_1ST_COLOR; + } + else if (is_feature_with_center(*m_selected_features.first.feature)) { + // hovering over center of 1st selected feature + text = _u8L("Select center"); + color = SELECTED_1ST_COLOR; + } + else { + // hovering over point selected as 1st feature + text = _u8L("Unselect point"); + color = SELECTED_1ST_COLOR; + } + } + else if (m_selected_features.first.is_center && m_selected_features.first.source == m_curr_feature) { + // hovering over feature whose center is selected as 1st feature + text = _u8L("Select feature"); + color = SELECTED_1ST_COLOR; + } + else if (m_selected_features.second.feature == m_curr_feature && m_mode == EMode::FeatureSelection) { + // hovering over 2nd selected feature + text = _u8L("Unselect feature"); + color = SELECTED_2ND_COLOR; + } + else if (m_hover_id == SEL_SPHERE_2_ID) { + if (m_selected_features.second.is_center) { + // hovering over center selected as 2nd feature + text = _u8L("Unselect feature"); + color = SELECTED_2ND_COLOR; + } + else if (is_feature_with_center(*m_selected_features.second.feature)) { + // hovering over center of 2nd selected feature + text = _u8L("Select center"); + color = SELECTED_2ND_COLOR; + } + else { + // hovering over point selected as 2nd feature + text = _u8L("Unselect point"); + color = SELECTED_2ND_COLOR; + } + } + else if (m_selected_features.second.is_center && m_selected_features.second.source == m_curr_feature) { + // hovering over feature whose center is selected as 2nd feature + text = _u8L("Select feature"); + color = SELECTED_2ND_COLOR; + } + else { + // 1st feature selected + text = (m_mode == EMode::PointSelection) ? _u8L("Select point") : _u8L("Select feature"); + color = SELECTED_2ND_COLOR; + } + } + else { + if (m_selected_features.first.feature.has_value()) { + if (m_selected_features.first.feature == m_curr_feature && m_mode == EMode::FeatureSelection) { + // hovering over 1st selected feature + text = _u8L("Unselect feature"); + color = SELECTED_1ST_COLOR; + } + else { + if (m_hover_id == SEL_SPHERE_1_ID) { + if (m_selected_features.first.is_center) { + // hovering over center selected as 1st feature + text = _u8L("Unselect feature"); + color = SELECTED_1ST_COLOR; + } + else if (is_feature_with_center(*m_selected_features.first.feature)) { + // hovering over center of 1st selected feature + text = _u8L("Select center"); + color = SELECTED_1ST_COLOR; + } + else { + // hovering over point selected as 1st feature + text = _u8L("Unselect point"); + color = SELECTED_1ST_COLOR; + } + } + else { + if (m_selected_features.first.is_center && m_selected_features.first.source == m_curr_feature) { + // hovering over feature whose center is selected as 1st feature + text = _u8L("Select feature"); + color = SELECTED_1ST_COLOR; + } + else { + // 1st feature selected + text = (m_mode == EMode::PointSelection) ? _u8L("Select point") : _u8L("Select feature"); + color = SELECTED_2ND_COLOR; + } + } + } + } + else { + // nothing is selected + text = (m_mode == EMode::PointSelection) ? _u8L("Select point") : _u8L("Select feature"); + color = SELECTED_1ST_COLOR; + } + } + + assert(!text.empty()); + + m_imgui->text_colored(ImGui::GetStyleColorVec4(ImGuiCol_Text), text); + ImGui::SameLine(); + const ImVec2 pos = ImGui::GetCursorScreenPos(); + const float rect_size = ImGui::GetTextLineHeight(); + ImGui::GetWindowDrawList()->AddRectFilled(ImVec2(pos.x + 1.0f, pos.y + 1.0f), ImVec2(pos.x + rect_size, pos.y + rect_size), ImGuiWrapper::to_ImU32(color)); + ImGui::Dummy(ImVec2(rect_size, rect_size)); + } + ); + + if (m_mode == EMode::FeatureSelection && m_hover_id != -1) { + add_strings_row_to_table(*m_imgui, "Shift", ImGuiWrapper::COL_ORANGE_LIGHT, _u8L("Enable point selection"), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + ++row_count; + } + + if (m_selected_features.first.feature.has_value()) { + add_strings_row_to_table(*m_imgui, "Delete", ImGuiWrapper::COL_ORANGE_LIGHT, _u8L("Restart selection"), ImGui::GetStyleColorVec4(ImGuiCol_Text)); + ++row_count; + } + + if (m_selected_features.first.feature.has_value() || m_selected_features.second.feature.has_value()) { + add_row_to_table( + [this]() { + m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "Esc"); + }, + [this]() { + m_imgui->text_colored(ImGui::GetStyleColorVec4(ImGuiCol_Text), _u8L("Unselect")); + ImGui::SameLine(); + const ImVec2 pos = ImGui::GetCursorScreenPos(); + const float rect_size = ImGui::GetTextLineHeight(); + const ColorRGBA color = m_selected_features.second.feature.has_value() ? SELECTED_2ND_COLOR : SELECTED_1ST_COLOR; + ImGui::GetWindowDrawList()->AddRectFilled(ImVec2(pos.x + 1.0f, pos.y + 1.0f), ImVec2(pos.x + rect_size, pos.y + rect_size), ImGuiWrapper::to_ImU32(color)); + ImGui::Dummy(ImVec2(rect_size, rect_size)); + } + ); + + ++row_count; + } + + // add dummy rows to keep dialog size fixed + for (unsigned int i = row_count; i < 4; ++i) { + add_strings_row_to_table(*m_imgui, " ", ImGuiWrapper::COL_ORANGE_LIGHT, " ", ImGui::GetStyleColorVec4(ImGuiCol_Text)); + } + + ImGui::EndTable(); + } + + const bool use_inches = wxGetApp().app_config->get_bool("use_inches"); + const std::string units = use_inches ? " " + _u8L("in") : " " + _u8L("mm"); + + ImGui::Separator(); + const ImGuiTableFlags flags = ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersH; + if (ImGui::BeginTable("Selection", 2, flags)) { + auto format_item_text = [this, use_inches, &units](const SelectedFeatures::Item& item) { + if (!item.feature.has_value()) + return _u8L("None"); + + std::string text = (item.source == item.feature) ? surface_feature_type_as_string(item.feature->get_type()) : + item.is_center ? center_on_feature_type_as_string(item.source->get_type()) : point_on_feature_type_as_string(item.source->get_type(), m_hover_id); + if (item.feature.has_value() && item.feature->get_type() == Measure::SurfaceFeatureType::Circle) { + auto [center, radius, normal] = item.feature->get_circle(); + const Vec3d on_circle = center + radius * Measure::get_orthogonal(normal, true); + radius = (on_circle - center).norm(); + if (use_inches) + radius = ObjectManipulation::mm_to_in * radius; + text += " (" + _u8L("Diameter") + ": " + format_double(2.0 * radius) + units + ")"; + } + else if (item.feature.has_value() && item.feature->get_type() == Measure::SurfaceFeatureType::Edge) { + auto [start, end] = item.feature->get_edge(); + double length = (end - start).norm(); + if (use_inches) + length = ObjectManipulation::mm_to_in * length; + text += " (" + _u8L("Length") + ": " + format_double(length) + units + ")"; + } + return text; + }; + + add_strings_row_to_table(*m_imgui, _u8L("Selection") + " 1:", ImGuiWrapper::to_ImVec4(SELECTED_1ST_COLOR), format_item_text(m_selected_features.first), + ImGuiWrapper::to_ImVec4(SELECTED_1ST_COLOR)); + add_strings_row_to_table(*m_imgui, _u8L("Selection") + " 2:", ImGuiWrapper::to_ImVec4(SELECTED_2ND_COLOR), format_item_text(m_selected_features.second), + ImGuiWrapper::to_ImVec4(SELECTED_2ND_COLOR)); + ImGui::EndTable(); + } + + m_imgui->disabled_begin(!m_selected_features.first.feature.has_value()); + if (m_imgui->button(_L("Restart selection"))) { + m_selected_features.reset(); + m_selected_sphere_raycasters.clear(); + m_imgui->set_requires_extra_frame(); + } + m_imgui->disabled_end(); + + auto add_measure_row_to_table = [this](const std::string& col_1, const ImVec4& col_1_color, const std::string& col_2, const ImVec4& col_2_color) { + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + m_imgui->text_colored(col_1_color, col_1); + ImGui::TableSetColumnIndex(1); + m_imgui->text_colored(col_2_color, col_2); + ImGui::TableSetColumnIndex(2); + if (m_imgui->image_button(ImGui::ClipboardBtnIcon, _L("Copy to clipboard"))) { + wxTheClipboard->Open(); + wxTheClipboard->SetData(new wxTextDataObject(col_1 + ": " + col_2)); + wxTheClipboard->Close(); + } + }; + + ImGui::Separator(); + m_imgui->text(_u8L("Measure")); + + const unsigned int max_measure_row_count = 2; + unsigned int measure_row_count = 0; + if (ImGui::BeginTable("Measure", 4)) { + if (m_selected_features.second.feature.has_value()) { + const Measure::MeasurementResult& measure = m_measurement_result; + if (measure.angle.has_value()) { + ImGui::PushID("ClipboardAngle"); + add_measure_row_to_table(_u8L("Angle"), ImGuiWrapper::COL_ORANGE_LIGHT, format_double(Geometry::rad2deg(measure.angle->angle)) + "°", + ImGui::GetStyleColorVec4(ImGuiCol_Text)); + ++measure_row_count; + ImGui::PopID(); + } + + const bool show_strict = measure.distance_strict.has_value() && + (!measure.distance_infinite.has_value() || std::abs(measure.distance_strict->dist - measure.distance_infinite->dist) > EPSILON); + + if (measure.distance_infinite.has_value()) { + double distance = measure.distance_infinite->dist; + if (use_inches) + distance = ObjectManipulation::mm_to_in * distance; + ImGui::PushID("ClipboardDistanceInfinite"); + add_measure_row_to_table(show_strict ? _u8L("Perpendicular distance") : _u8L("Distance"), ImGuiWrapper::COL_ORANGE_LIGHT, format_double(distance) + units, + ImGui::GetStyleColorVec4(ImGuiCol_Text)); + ++measure_row_count; + ImGui::PopID(); + } + if (show_strict) { + double distance = measure.distance_strict->dist; + if (use_inches) + distance = ObjectManipulation::mm_to_in * distance; + ImGui::PushID("ClipboardDistanceStrict"); + add_measure_row_to_table(_u8L("Direct distance"), ImGuiWrapper::COL_ORANGE_LIGHT, format_double(distance) + units, + ImGui::GetStyleColorVec4(ImGuiCol_Text)); + ++measure_row_count; + ImGui::PopID(); + } + if (measure.distance_xyz.has_value() && measure.distance_xyz->norm() > EPSILON) { + Vec3d distance = *measure.distance_xyz; + if (use_inches) + distance = ObjectManipulation::mm_to_in * distance; + ImGui::PushID("ClipboardDistanceXYZ"); + add_measure_row_to_table(_u8L("Distance XYZ"), ImGuiWrapper::COL_ORANGE_LIGHT, format_vec3(distance), + ImGui::GetStyleColorVec4(ImGuiCol_Text)); + ++measure_row_count; + ImGui::PopID(); + } + } + + // add dummy rows to keep dialog size fixed + for (unsigned int i = measure_row_count; i < max_measure_row_count; ++i) { + add_strings_row_to_table(*m_imgui, " ", ImGuiWrapper::COL_ORANGE_LIGHT, " ", ImGui::GetStyleColorVec4(ImGuiCol_Text)); + } + ImGui::EndTable(); + } + + if (last_feature != m_curr_feature || last_mode != m_mode || last_selected_features != m_selected_features) { + // the dialog may have changed its size, ask for an extra frame to render it properly + last_feature = m_curr_feature; + last_mode = m_mode; + last_selected_features = m_selected_features; + m_imgui->set_requires_extra_frame(); + } + + m_imgui->end(); +} + +void GLGizmoMeasure::on_register_raycasters_for_picking() +{ + // the features are rendered on top of the scene, so the raytraced picker should take it into account + m_parent.set_raycaster_gizmos_on_top(true); +} + +void GLGizmoMeasure::on_unregister_raycasters_for_picking() +{ + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo); + m_parent.set_raycaster_gizmos_on_top(false); + m_raycasters.clear(); + m_selected_sphere_raycasters.clear(); +} + +void GLGizmoMeasure::remove_selected_sphere_raycaster(int id) +{ + auto it = std::find_if(m_selected_sphere_raycasters.begin(), m_selected_sphere_raycasters.end(), + [id](std::shared_ptr item) { return SceneRaycaster::decode_id(SceneRaycaster::EType::Gizmo, item->get_id()) == id; }); + if (it != m_selected_sphere_raycasters.end()) + m_selected_sphere_raycasters.erase(it); + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, id); +} + +void GLGizmoMeasure::update_measurement_result() +{ + if (!m_selected_features.first.feature.has_value()) + m_measurement_result = Measure::MeasurementResult(); + else if (m_selected_features.second.feature.has_value()) + m_measurement_result = Measure::get_measurement(*m_selected_features.first.feature, *m_selected_features.second.feature, m_measuring.get()); + else if (!m_selected_features.second.feature.has_value() && m_selected_features.first.feature->get_type() == Measure::SurfaceFeatureType::Circle) + m_measurement_result = Measure::get_measurement(*m_selected_features.first.feature, Measure::SurfaceFeature(std::get<0>(m_selected_features.first.feature->get_circle())), m_measuring.get()); +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp new file mode 100644 index 00000000000..cc43b068efd --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp @@ -0,0 +1,186 @@ +#ifndef slic3r_GLGizmoMeasure_hpp_ +#define slic3r_GLGizmoMeasure_hpp_ + +#include "GLGizmoBase.hpp" +#include "slic3r/GUI/GLModel.hpp" +#include "slic3r/GUI/GUI_Utils.hpp" +#include "slic3r/GUI/MeshUtils.hpp" +#include "slic3r/GUI/I18N.hpp" +#include "libslic3r/Measure.hpp" +#include "libslic3r/Model.hpp" + +namespace Slic3r { + +enum class ModelVolumeType : int; + +namespace Measure { class Measuring; } + + +namespace GUI { + +enum class SLAGizmoEventType : unsigned char; + +class GLGizmoMeasure : public GLGizmoBase +{ + enum class EMode : unsigned char + { + FeatureSelection, + PointSelection + }; + + struct SelectedFeatures + { + struct Item + { + bool is_center{ false }; + std::optional source; + std::optional feature; + + bool operator == (const Item& other) const { + return this->is_center == other.is_center && this->source == other.source && this->feature == other.feature; + } + + bool operator != (const Item& other) const { + return !operator == (other); + } + + void reset() { + is_center = false; + source.reset(); + feature.reset(); + } + }; + + Item first; + Item second; + + void reset() { + first.reset(); + second.reset(); + } + + bool operator == (const SelectedFeatures & other) const { + if (this->first != other.first) return false; + return this->second == other.second; + } + + bool operator != (const SelectedFeatures & other) const { + return !operator == (other); + } + }; + + struct VolumeCacheItem + { + const ModelObject* object{ nullptr }; + const ModelInstance* instance{ nullptr }; + const ModelVolume* volume{ nullptr }; + Transform3d world_trafo; + + bool operator == (const VolumeCacheItem& other) const { + return this->object == other.object && this->instance == other.instance && this->volume == other.volume && + this->world_trafo.isApprox(other.world_trafo); + } + }; + + std::vector m_volumes_cache; + + EMode m_mode{ EMode::FeatureSelection }; + Measure::MeasurementResult m_measurement_result; + + std::unique_ptr m_measuring; // PIMPL + + PickingModel m_sphere; + PickingModel m_cylinder; + PickingModel m_circle; + PickingModel m_plane; + struct Dimensioning + { + GLModel line; + GLModel triangle; + GLModel arc; + }; + Dimensioning m_dimensioning; + + // Uses a standalone raycaster and not the shared one because of the + // difference in how the mesh is updated + std::unique_ptr m_raycaster; + + std::vector m_plane_models_cache; + std::map> m_raycasters; + // used to keep the raycasters for point/center spheres + std::vector> m_selected_sphere_raycasters; + std::optional m_curr_feature; + std::optional m_curr_point_on_feature_position; + struct SceneRaycasterState + { + std::shared_ptr raycaster{ nullptr }; + bool state{true}; + + }; + std::vector m_scene_raycasters; + + // These hold information to decide whether recalculation is necessary: + float m_last_inv_zoom{ 0.0f }; + std::optional m_last_circle; + int m_last_plane_idx{ -1 }; + + bool m_mouse_left_down{ false }; // for detection left_up of this gizmo + + Vec2d m_mouse_pos{ Vec2d::Zero() }; + + KeyAutoRepeatFilter m_shift_kar_filter; + + SelectedFeatures m_selected_features; + bool m_pending_scale{ false }; + bool m_editing_distance{ false }; + bool m_is_editing_distance_first_frame{ true }; + + void update_if_needed(); + + void disable_scene_raycasters(); + void restore_scene_raycasters_state(); + + void render_dimensioning(); + +#if ENABLE_MEASURE_GIZMO_DEBUG + void render_debug_dialog(); +#endif // ENABLE_MEASURE_GIZMO_DEBUG + +public: + GLGizmoMeasure(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); + + /// + /// Apply rotation on select plane + /// + /// Keep information about mouse click + /// Return True when use the information otherwise False. + bool on_mouse(const wxMouseEvent &mouse_event) override; + + void data_changed() override; + + bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); + + bool wants_enter_leave_snapshots() const override { return true; } + std::string get_gizmo_entering_text() const override { return _u8L("Entering Measure gizmo"); } + std::string get_gizmo_leaving_text() const override { return _u8L("Leaving Measure gizmo"); } + std::string get_action_snapshot_name() const override { return _u8L("Measure gizmo editing"); } + +protected: + bool on_init() override; + std::string on_get_name() const override; + bool on_is_activable() const override; + void on_render() override; + void on_set_state() override; + + virtual void on_render_input_window(float x, float y, float bottom_limit) override; + virtual void on_register_raycasters_for_picking() override; + virtual void on_unregister_raycasters_for_picking() override; + + void remove_selected_sphere_raycaster(int id); + void update_measurement_result(); +}; + +} // namespace GUI +} // namespace Slic3r + +#endif // slic3r_GLGizmoMeasure_hpp_ diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp index 69d5ff9ed03..fd7963050f0 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp @@ -9,6 +9,7 @@ #include "slic3r/GUI/format.hpp" #include "slic3r/GUI/GUI_ObjectList.hpp" #include "slic3r/GUI/NotificationManager.hpp" +#include "slic3r/GUI/OpenGLManager.hpp" #include "libslic3r/PresetBundle.hpp" #include "libslic3r/Model.hpp" #include "slic3r/Utils/UndoRedo.hpp" @@ -56,18 +57,12 @@ bool GLGizmoMmuSegmentation::on_is_activable() const return GLGizmoPainterBase::on_is_activable() && wxGetApp().extruders_edited_cnt() > 1; } -static std::vector> get_extruders_colors() +static std::vector get_extruders_colors() { - unsigned char rgb_color[3] = {}; - std::vector colors = Slic3r::GUI::wxGetApp().plater()->get_extruder_colors_from_plater_config(); - std::vector> colors_out(colors.size()); - for (const std::string &color : colors) { - Slic3r::GUI::BitmapCache::parse_color(color, rgb_color); - size_t color_idx = &color - &colors.front(); - colors_out[color_idx] = {float(rgb_color[0]) / 255.f, float(rgb_color[1]) / 255.f, float(rgb_color[2]) / 255.f, 1.f}; - } - - return colors_out; + std::vector colors = Slic3r::GUI::wxGetApp().plater()->get_extruder_colors_from_plater_config(); + std::vector ret; + decode_colors(colors, ret); + return ret; } static std::vector get_extruders_names() @@ -136,7 +131,7 @@ bool GLGizmoMmuSegmentation::on_init() return true; } -void GLGizmoMmuSegmentation::render_painter_gizmo() const +void GLGizmoMmuSegmentation::render_painter_gizmo() { const Selection& selection = m_parent.get_selection(); @@ -152,10 +147,9 @@ void GLGizmoMmuSegmentation::render_painter_gizmo() const glsafe(::glDisable(GL_BLEND)); } -void GLGizmoMmuSegmentation::set_painter_gizmo_data(const Selection &selection) +void GLGizmoMmuSegmentation::data_changed() { - GLGizmoPainterBase::set_painter_gizmo_data(selection); - + GLGizmoPainterBase::data_changed(); if (m_state != On || wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptFFF || wxGetApp().extruders_edited_cnt() <= 1) return; @@ -195,35 +189,34 @@ void GLGizmoMmuSegmentation::render_triangles(const Selection &selection) const const Transform3d trafo_matrix = mo->instances[selection.get_instance_idx()]->get_transformation().get_matrix() * mv->get_matrix(); - bool is_left_handed = trafo_matrix.matrix().determinant() < 0.; + const bool is_left_handed = trafo_matrix.matrix().determinant() < 0.0; if (is_left_handed) glsafe(::glFrontFace(GL_CW)); - glsafe(::glPushMatrix()); - glsafe(::glMultMatrixd(trafo_matrix.data())); + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d& view_matrix = camera.get_view_matrix(); + shader->set_uniform("view_model_matrix", view_matrix * trafo_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * trafo_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); shader->set_uniform("volume_world_matrix", trafo_matrix); shader->set_uniform("volume_mirrored", is_left_handed); - m_triangle_selectors[mesh_id]->render(m_imgui); + m_triangle_selectors[mesh_id]->render(m_imgui, trafo_matrix); - glsafe(::glPopMatrix()); if (is_left_handed) glsafe(::glFrontFace(GL_CCW)); } } -static void render_extruders_combo(const std::string &label, - const std::vector &extruders, - const std::vector> &extruders_colors, - size_t &selection_idx) +static void render_extruders_combo(const std::string& label, + const std::vector& extruders, + const std::vector& extruders_colors, + size_t& selection_idx) { assert(!extruders_colors.empty()); assert(extruders_colors.size() == extruders_colors.size()); - auto convert_to_imu32 = [](const std::array &color) -> ImU32 { - return IM_COL32(uint8_t(color[0] * 255.f), uint8_t(color[1] * 255.f), uint8_t(color[2] * 255.f), uint8_t(color[3] * 255.f)); - }; - size_t selection_out = selection_idx; // It is necessary to use BeginGroup(). Otherwise, when using SameLine() is called, then other items will be drawn inside the combobox. ImGui::BeginGroup(); @@ -239,7 +232,7 @@ static void render_extruders_combo(const std::string &labe ImGui::SameLine(); ImGuiStyle &style = ImGui::GetStyle(); float height = ImGui::GetTextLineHeight(); - ImGui::GetWindowDrawList()->AddRectFilled(start_position, ImVec2(start_position.x + height + height / 2, start_position.y + height), convert_to_imu32(extruders_colors[extruder_idx])); + ImGui::GetWindowDrawList()->AddRectFilled(start_position, ImVec2(start_position.x + height + height / 2, start_position.y + height), ImGuiWrapper::to_ImU32(extruders_colors[extruder_idx])); ImGui::GetWindowDrawList()->AddRect(start_position, ImVec2(start_position.x + height + height / 2, start_position.y + height), IM_COL32_BLACK); ImGui::SetCursorScreenPos(ImVec2(start_position.x + height + height / 2 + style.FramePadding.x, start_position.y)); @@ -257,7 +250,7 @@ static void render_extruders_combo(const std::string &labe ImVec2 p = ImGui::GetCursorScreenPos(); float height = ImGui::GetTextLineHeight(); - ImGui::GetWindowDrawList()->AddRectFilled(p, ImVec2(p.x + height + height / 2, p.y + height), convert_to_imu32(extruders_colors[selection_idx])); + ImGui::GetWindowDrawList()->AddRectFilled(p, ImVec2(p.x + height + height / 2, p.y + height), ImGuiWrapper::to_ImU32(extruders_colors[selection_idx])); ImGui::GetWindowDrawList()->AddRect(p, ImVec2(p.x + height + height / 2, p.y + height), IM_COL32_BLACK); ImGui::SetCursorScreenPos(ImVec2(p.x + height + height / 2 + style.FramePadding.x, p.y)); @@ -292,7 +285,7 @@ void GLGizmoMmuSegmentation::on_render_input_window(float x, float y, float bott const float button_width = m_imgui->calc_text_size(m_desc.at("remove_all")).x + m_imgui->scaled(1.f); const float buttons_width = m_imgui->scaled(0.5f); const float minimal_slider_width = m_imgui->scaled(4.f); - const float color_button_width = m_imgui->calc_text_size("").x + m_imgui->scaled(1.75f); + const float color_button_width = m_imgui->scaled(1.75f); const float combo_label_width = std::max(m_imgui->calc_text_size(m_desc.at("first_color")).x, m_imgui->calc_text_size(m_desc.at("second_color")).x) + m_imgui->scaled(1.f); @@ -339,10 +332,10 @@ void GLGizmoMmuSegmentation::on_render_input_window(float x, float y, float bott render_extruders_combo("##first_color_combo", m_original_extruders_names, m_original_extruders_colors, m_first_selected_extruder_idx); ImGui::SameLine(); - const std::array &select_first_color = m_modified_extruders_colors[m_first_selected_extruder_idx]; - ImVec4 first_color = ImVec4(select_first_color[0], select_first_color[1], select_first_color[2], select_first_color[3]); - if(ImGui::ColorEdit4("First color##color_picker", (float*)&first_color, ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel)) - m_modified_extruders_colors[m_first_selected_extruder_idx] = {first_color.x, first_color.y, first_color.z, first_color.w}; + const ColorRGBA& select_first_color = m_modified_extruders_colors[m_first_selected_extruder_idx]; + ImVec4 first_color = ImGuiWrapper::to_ImVec4(select_first_color); + if (ImGui::ColorEdit4("First color##color_picker", (float*)&first_color, ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel)) + m_modified_extruders_colors[m_first_selected_extruder_idx] = ImGuiWrapper::from_ImVec4(first_color); ImGui::AlignTextToFramePadding(); m_imgui->text(m_desc.at("second_color")); @@ -351,10 +344,10 @@ void GLGizmoMmuSegmentation::on_render_input_window(float x, float y, float bott render_extruders_combo("##second_color_combo", m_original_extruders_names, m_original_extruders_colors, m_second_selected_extruder_idx); ImGui::SameLine(); - const std::array &select_second_color = m_modified_extruders_colors[m_second_selected_extruder_idx]; - ImVec4 second_color = ImVec4(select_second_color[0], select_second_color[1], select_second_color[2], select_second_color[3]); - if(ImGui::ColorEdit4("Second color##color_picker", (float*)&second_color, ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel)) - m_modified_extruders_colors[m_second_selected_extruder_idx] = {second_color.x, second_color.y, second_color.z, second_color.w}; + const ColorRGBA& select_second_color = m_modified_extruders_colors[m_second_selected_extruder_idx]; + ImVec4 second_color = ImGuiWrapper::to_ImVec4(select_second_color); + if (ImGui::ColorEdit4("Second color##color_picker", (float*)&second_color, ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel)) + m_modified_extruders_colors[m_second_selected_extruder_idx] = ImGuiWrapper::from_ImVec4(second_color); const float max_tooltip_width = ImGui::GetFontSize() * 20.0f; @@ -473,7 +466,7 @@ void GLGizmoMmuSegmentation::on_render_input_window(float x, float y, float bott m_imgui->text(m_desc.at("clipping_of_view")); } else { if (m_imgui->button(m_desc.at("reset_direction"))) { - wxGetApp().CallAfter([this]() { m_c->object_clipper()->set_position(-1., false); }); + wxGetApp().CallAfter([this]() { m_c->object_clipper()->set_position_by_ratio(-1., false); }); } } @@ -481,7 +474,7 @@ void GLGizmoMmuSegmentation::on_render_input_window(float x, float y, float bott ImGui::SameLine(sliders_left_width); ImGui::PushItemWidth(window_width - sliders_left_width - slider_icon_width); if (m_imgui->slider_float("##clp_dist", &clp_dist, 0.f, 1.f, "%.2f", 1.0f, true, _L("Ctrl + Mouse wheel"))) - m_c->object_clipper()->set_position(clp_dist, true); + m_c->object_clipper()->set_position_by_ratio(clp_dist, true); ImGui::Separator(); if (m_imgui->button(m_desc.at("remove_all"))) { @@ -565,19 +558,21 @@ PainterGizmoType GLGizmoMmuSegmentation::get_painter_type() const return PainterGizmoType::MMU_SEGMENTATION; } -std::array GLGizmoMmuSegmentation::get_cursor_sphere_left_button_color() const +ColorRGBA GLGizmoMmuSegmentation::get_cursor_sphere_left_button_color() const { - const std::array &color = m_modified_extruders_colors[m_first_selected_extruder_idx]; - return {color[0], color[1], color[2], 0.25f}; + ColorRGBA color = m_modified_extruders_colors[m_first_selected_extruder_idx]; + color.a(0.25f); + return color; } -std::array GLGizmoMmuSegmentation::get_cursor_sphere_right_button_color() const +ColorRGBA GLGizmoMmuSegmentation::get_cursor_sphere_right_button_color() const { - const std::array &color = m_modified_extruders_colors[m_second_selected_extruder_idx]; - return {color[0], color[1], color[2], 0.25f}; + ColorRGBA color = m_modified_extruders_colors[m_second_selected_extruder_idx]; + color.a(0.25f); + return color; } -void TriangleSelectorMmGui::render(ImGuiWrapper *imgui) +void TriangleSelectorMmGui::render(ImGuiWrapper* imgui, const Transform3d& matrix) { if (m_update_render_data) update_render_data(); @@ -586,8 +581,14 @@ void TriangleSelectorMmGui::render(ImGuiWrapper *imgui) if (!shader) return; assert(shader->get_name() == "mm_gouraud"); - - for (size_t color_idx = 0; color_idx < m_gizmo_scene.triangle_indices.size(); ++color_idx) + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d& view_matrix = camera.get_view_matrix(); + shader->set_uniform("view_model_matrix", view_matrix * matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); + + for (size_t color_idx = 0; color_idx < m_gizmo_scene.triangle_indices.size(); ++color_idx) { if (m_gizmo_scene.has_VBOs(color_idx)) { if (color_idx > m_colors.size()) // Seed fill VBO shader->set_uniform("uniform_color", TriangleSelectorGUI::get_seed_fill_color(color_idx == (m_colors.size() + 1) ? m_default_volume_color : m_colors[color_idx - (m_colors.size() + 1) - 1])); @@ -596,21 +597,9 @@ void TriangleSelectorMmGui::render(ImGuiWrapper *imgui) m_gizmo_scene.render(color_idx); } - - if (m_paint_contour.has_VBO()) { - ScopeGuard guard_mm_gouraud([shader]() { shader->start_using(); }); - shader->stop_using(); - - auto *contour_shader = wxGetApp().get_shader("mm_contour"); - contour_shader->start_using(); - - glsafe(::glDepthFunc(GL_LEQUAL)); - m_paint_contour.render(); - glsafe(::glDepthFunc(GL_LESS)); - - contour_shader->stop_using(); } + render_paint_contour(matrix); m_update_render_data = false; } @@ -643,25 +632,7 @@ void TriangleSelectorMmGui::update_render_data() m_gizmo_scene.triangle_indices_sizes[color_idx] = m_gizmo_scene.triangle_indices[color_idx].size(); m_gizmo_scene.finalize_triangle_indices(); - - m_paint_contour.release_geometry(); - std::vector contour_edges = this->get_seed_fill_contour(); - m_paint_contour.contour_vertices.reserve(contour_edges.size() * 6); - for (const Vec2i &edge : contour_edges) { - m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(0)].v.x()); - m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(0)].v.y()); - m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(0)].v.z()); - - m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(1)].v.x()); - m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(1)].v.y()); - m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(1)].v.z()); - } - - m_paint_contour.contour_indices.assign(m_paint_contour.contour_vertices.size() / 3, 0); - std::iota(m_paint_contour.contour_indices.begin(), m_paint_contour.contour_indices.end(), 0); - m_paint_contour.contour_indices_size = m_paint_contour.contour_indices.size(); - - m_paint_contour.finalize_geometry(); + update_paint_contour(); } wxString GLGizmoMmuSegmentation::handle_snapshot_action_name(bool shift_down, GLGizmoPainterBase::Button button_down) const @@ -685,6 +656,13 @@ void GLMmSegmentationGizmo3DScene::release_geometry() { glsafe(::glDeleteBuffers(1, &triangle_indices_VBO_id)); triangle_indices_VBO_id = 0; } +#if ENABLE_GL_CORE_PROFILE + if (this->vertices_VAO_id > 0) { + glsafe(::glDeleteVertexArrays(1, &this->vertices_VAO_id)); + this->vertices_VAO_id = 0; + } +#endif // ENABLE_GL_CORE_PROFILE + this->clear(); } @@ -692,35 +670,71 @@ void GLMmSegmentationGizmo3DScene::render(size_t triangle_indices_idx) const { assert(triangle_indices_idx < this->triangle_indices_VBO_ids.size()); assert(this->triangle_indices_sizes.size() == this->triangle_indices_VBO_ids.size()); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + assert(this->vertices_VAO_id != 0); +#endif // ENABLE_GL_CORE_PROFILE assert(this->vertices_VBO_id != 0); assert(this->triangle_indices_VBO_ids[triangle_indices_idx] != 0); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, this->vertices_VBO_id)); - glsafe(::glVertexPointer(3, GL_FLOAT, 3 * sizeof(float), (const void*)(0 * sizeof(float)))); + GLShaderProgram* shader = wxGetApp().get_current_shader(); + if (shader == nullptr) + return; - glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(this->vertices_VAO_id)); + // the following binding is needed to set the vertex attributes +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, this->vertices_VBO_id)); + const GLint position_id = shader->get_attrib_location("v_position"); + if (position_id != -1) { + glsafe(::glVertexAttribPointer(position_id, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (GLvoid*)0)); + glsafe(::glEnableVertexAttribArray(position_id)); + } // Render using the Vertex Buffer Objects. - if (this->triangle_indices_sizes[triangle_indices_idx] > 0) { + if (this->triangle_indices_VBO_ids[triangle_indices_idx] != 0 && + this->triangle_indices_sizes[triangle_indices_idx] > 0) { glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->triangle_indices_VBO_ids[triangle_indices_idx])); glsafe(::glDrawElements(GL_TRIANGLES, GLsizei(this->triangle_indices_sizes[triangle_indices_idx]), GL_UNSIGNED_INT, nullptr)); - glsafe(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); } - glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); + if (position_id != -1) + glsafe(::glDisableVertexAttribArray(position_id)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(0)); +#endif // ENABLE_GL_CORE_PROFILE } void GLMmSegmentationGizmo3DScene::finalize_vertices() { +#if ENABLE_GL_CORE_PROFILE + assert(this->vertices_VAO_id == 0); +#endif // ENABLE_GL_CORE_PROFILE assert(this->vertices_VBO_id == 0); if (!this->vertices.empty()) { +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) { + glsafe(::glGenVertexArrays(1, &this->vertices_VAO_id)); + glsafe(::glBindVertexArray(this->vertices_VAO_id)); + } +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glGenBuffers(1, &this->vertices_VBO_id)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, this->vertices_VBO_id)); glsafe(::glBufferData(GL_ARRAY_BUFFER, this->vertices.size() * sizeof(float), this->vertices.data(), GL_STATIC_DRAW)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); this->vertices.clear(); + +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(0)); +#endif // ENABLE_GL_CORE_PROFILE } } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp index 577db8ed5a1..ee32c459630 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp @@ -3,6 +3,8 @@ #include "GLGizmoPainterBase.hpp" +#include "slic3r/GUI/I18N.hpp" + namespace Slic3r::GUI { class GLMmSegmentationGizmo3DScene @@ -55,26 +57,27 @@ class GLMmSegmentationGizmo3DScene // IDs of the Vertex Array Objects, into which the geometry has been loaded. // Zero if the VBOs are not sent to GPU yet. - unsigned int vertices_VBO_id{0}; +#if ENABLE_GL_CORE_PROFILE + unsigned int vertices_VAO_id{ 0 }; +#endif // ENABLE_GL_CORE_PROFILE + unsigned int vertices_VBO_id{ 0 }; std::vector triangle_indices_VBO_ids; }; class TriangleSelectorMmGui : public TriangleSelectorGUI { public: // Plus 1 in the initialization of m_gizmo_scene is because the first position is allocated for non-painted triangles, and the indices above colors.size() are allocated for seed fill. - explicit TriangleSelectorMmGui(const TriangleMesh &mesh, const std::vector> &colors, const std::array &default_volume_color) + TriangleSelectorMmGui(const TriangleMesh& mesh, const std::vector& colors, const ColorRGBA& default_volume_color) : TriangleSelectorGUI(mesh), m_colors(colors), m_default_volume_color(default_volume_color), m_gizmo_scene(2 * (colors.size() + 1)) {} ~TriangleSelectorMmGui() override = default; - // Render current selection. Transformation matrices are supposed - // to be already set. - void render(ImGuiWrapper* imgui) override; + void render(ImGuiWrapper* imgui, const Transform3d& matrix) override; private: void update_render_data(); - const std::vector> &m_colors; - const std::array m_default_volume_color; + const std::vector& m_colors; + const ColorRGBA m_default_volume_color; GLMmSegmentationGizmo3DScene m_gizmo_scene; }; @@ -85,9 +88,9 @@ class GLGizmoMmuSegmentation : public GLGizmoPainterBase : GLGizmoPainterBase(parent, icon_filename, sprite_id) {} ~GLGizmoMmuSegmentation() override = default; - void render_painter_gizmo() const override; + void render_painter_gizmo() override; - void set_painter_gizmo_data(const Selection& selection) override; + void data_changed() override; void render_triangles(const Selection& selection) const override; @@ -100,8 +103,8 @@ class GLGizmoMmuSegmentation : public GLGizmoPainterBase const float get_cursor_radius_min() const override { return CursorRadiusMin; } protected: - std::array get_cursor_sphere_left_button_color() const override; - std::array get_cursor_sphere_right_button_color() const override; + ColorRGBA get_cursor_sphere_left_button_color() const override; + ColorRGBA get_cursor_sphere_right_button_color() const override; EnforcerBlockerType get_left_button_state_type() const override { return EnforcerBlockerType(m_first_selected_extruder_idx + 1); } EnforcerBlockerType get_right_button_state_type() const override { return EnforcerBlockerType(m_second_selected_extruder_idx + 1); } @@ -116,13 +119,13 @@ class GLGizmoMmuSegmentation : public GLGizmoPainterBase std::string get_gizmo_entering_text() const override { return _u8L("Entering Multimaterial painting"); } std::string get_gizmo_leaving_text() const override { return _u8L("Leaving Multimaterial painting"); } - std::string get_action_snapshot_name() override { return _u8L("Multimaterial painting editing"); } + std::string get_action_snapshot_name() const override { return _u8L("Multimaterial painting editing"); } size_t m_first_selected_extruder_idx = 0; size_t m_second_selected_extruder_idx = 1; std::vector m_original_extruders_names; - std::vector> m_original_extruders_colors; - std::vector> m_modified_extruders_colors; + std::vector m_original_extruders_colors; + std::vector m_modified_extruders_colors; std::vector m_original_volumes_extruder_idxs; static const constexpr float CursorRadiusMin = 0.1f; // cannot be zero diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index e73a85647ef..3d697c63c2b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -1,7 +1,9 @@ -// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro. #include "GLGizmoMove.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/GUI_ObjectManipulation.hpp" +#include "slic3r/GUI/Plater.hpp" +#include "libslic3r/Model.hpp" #include @@ -14,37 +16,38 @@ const double GLGizmoMove3D::Offset = 10.0; GLGizmoMove3D::GLGizmoMove3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) : GLGizmoBase(parent, icon_filename, sprite_id) - , m_displacement(Vec3d::Zero()) - , m_snap_step(1.0) - , m_starting_drag_position(Vec3d::Zero()) - , m_starting_box_center(Vec3d::Zero()) - , m_starting_box_bottom_center(Vec3d::Zero()) -{ - m_vbo_cone.init_from(its_make_cone(1., 1., 2*PI/36)); -} +{} std::string GLGizmoMove3D::get_tooltip() const { - const Selection& selection = m_parent.get_selection(); - bool show_position = selection.is_single_full_instance(); - const Vec3d& position = selection.get_bounding_box().center(); - - if (m_hover_id == 0 || m_grabbers[0].dragging) - return "X: " + format(show_position ? position(0) : m_displacement(0), 2); - else if (m_hover_id == 1 || m_grabbers[1].dragging) - return "Y: " + format(show_position ? position(1) : m_displacement(1), 2); - else if (m_hover_id == 2 || m_grabbers[2].dragging) - return "Z: " + format(show_position ? position(2) : m_displacement(2), 2); + if (m_hover_id == 0) + return "X: " + format(m_displacement.x(), 2); + else if (m_hover_id == 1) + return "Y: " + format(m_displacement.y(), 2); + else if (m_hover_id == 2) + return "Z: " + format(m_displacement.z(), 2); else return ""; } +bool GLGizmoMove3D::on_mouse(const wxMouseEvent &mouse_event) { + return use_grabbers(mouse_event); +} + +void GLGizmoMove3D::data_changed() { + m_grabbers[2].enabled = !m_parent.get_selection().is_wipe_tower(); +} + bool GLGizmoMove3D::on_init() { for (int i = 0; i < 3; ++i) { m_grabbers.push_back(Grabber()); + m_grabbers.back().extensions = GLGizmoBase::EGrabberExtension::PosZ; } + m_grabbers[0].angles = { 0.0, 0.5 * double(PI), 0.0 }; + m_grabbers[1].angles = { -0.5 * double(PI), 0.0, 0.0 }; + m_shortcut_key = WXK_CONTROL_M; return true; @@ -57,27 +60,39 @@ std::string GLGizmoMove3D::on_get_name() const bool GLGizmoMove3D::on_is_activable() const { - return !m_parent.get_selection().is_empty(); + const Selection& selection = m_parent.get_selection(); + return !selection.is_any_cut_volume() && !selection.is_any_connector() && !selection.is_empty(); } void GLGizmoMove3D::on_start_dragging() { - if (m_hover_id != -1) { - m_displacement = Vec3d::Zero(); - const BoundingBoxf3& box = m_parent.get_selection().get_bounding_box(); - m_starting_drag_position = m_grabbers[m_hover_id].center; - m_starting_box_center = box.center(); - m_starting_box_bottom_center = box.center(); - m_starting_box_bottom_center(2) = box.min(2); + assert(m_hover_id != -1); + + m_displacement = Vec3d::Zero(); + const Selection& selection = m_parent.get_selection(); + const ECoordinatesType coordinates_type = wxGetApp().obj_manipul()->get_coordinates_type(); + if (coordinates_type == ECoordinatesType::World) + m_starting_drag_position = m_center + m_grabbers[m_hover_id].center; + else if (coordinates_type == ECoordinatesType::Local && selection.is_single_volume_or_modifier()) { + const GLVolume& v = *selection.get_first_volume(); + m_starting_drag_position = m_center + v.get_instance_transformation().get_rotation_matrix() * v.get_volume_transformation().get_rotation_matrix() * m_grabbers[m_hover_id].center; + } + else { + const GLVolume& v = *selection.get_first_volume(); + m_starting_drag_position = m_center + v.get_instance_transformation().get_rotation_matrix() * m_grabbers[m_hover_id].center; } + m_starting_box_center = m_center; + m_starting_box_bottom_center = m_center; + m_starting_box_bottom_center.z() = m_bounding_box.min.z(); } void GLGizmoMove3D::on_stop_dragging() { + m_parent.do_move(L("Gizmo-Move")); m_displacement = Vec3d::Zero(); } -void GLGizmoMove3D::on_update(const UpdateData& data) +void GLGizmoMove3D::on_dragging(const UpdateData& data) { if (m_hover_id == 0) m_displacement.x() = calc_projection(data); @@ -85,98 +100,171 @@ void GLGizmoMove3D::on_update(const UpdateData& data) m_displacement.y() = calc_projection(data); else if (m_hover_id == 2) m_displacement.z() = calc_projection(data); + + Selection &selection = m_parent.get_selection(); + TransformationType trafo_type; + trafo_type.set_relative(); + switch (wxGetApp().obj_manipul()->get_coordinates_type()) + { + case ECoordinatesType::Instance: { trafo_type.set_instance(); break; } + case ECoordinatesType::Local: { trafo_type.set_local(); break; } + default: { break; } + } + selection.translate(m_displacement, trafo_type); } void GLGizmoMove3D::on_render() { - const Selection& selection = m_parent.get_selection(); - glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); glsafe(::glEnable(GL_DEPTH_TEST)); - const BoundingBoxf3& box = selection.get_bounding_box(); - const Vec3d& center = box.center(); + const Selection& selection = m_parent.get_selection(); + const auto& [box, box_trafo] = selection.get_bounding_box_in_current_reference_system(); + m_bounding_box = box; + m_center = box_trafo.translation(); + const Transform3d base_matrix = local_transform(m_parent.get_selection()); + for (int i = 0; i < 3; ++i) { + m_grabbers[i].matrix = base_matrix; + } + + const Vec3d zero = Vec3d::Zero(); + const Vec3d half_box_size = 0.5 * m_bounding_box.size(); // x axis - m_grabbers[0].center = { box.max.x() + Offset, center.y(), center.z() }; + m_grabbers[0].center = { half_box_size.x() + Offset, 0.0, 0.0 }; m_grabbers[0].color = AXES_COLOR[0]; // y axis - m_grabbers[1].center = { center.x(), box.max.y() + Offset, center.z() }; + m_grabbers[1].center = { 0.0, half_box_size.y() + Offset, 0.0 }; m_grabbers[1].color = AXES_COLOR[1]; // z axis - m_grabbers[2].center = { center.x(), center.y(), box.max.z() + Offset }; + m_grabbers[2].center = { 0.0, 0.0, half_box_size.z() + Offset }; m_grabbers[2].color = AXES_COLOR[2]; - glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_core_profile()) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); + + auto render_grabber_connection = [this, &zero](unsigned int id) { + if (m_grabbers[id].enabled) { + if (!m_grabber_connections[id].model.is_initialized() || !m_grabber_connections[id].old_center.isApprox(m_grabbers[id].center)) { + m_grabber_connections[id].old_center = m_grabbers[id].center; + m_grabber_connections[id].model.reset(); + + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; + init_data.color = AXES_COLOR[id]; + init_data.vertices.reserve(2); + init_data.indices.reserve(2); + + // vertices + init_data.add_vertex((Vec3f)zero.cast()); + init_data.add_vertex((Vec3f)m_grabbers[id].center.cast()); + + // indices + init_data.add_line(0, 1); + + m_grabber_connections[id].model.init_from(std::move(init_data)); + } + + m_grabber_connections[id].model.render(); + } + }; if (m_hover_id == -1) { - // draw axes - for (unsigned int i = 0; i < 3; ++i) { - if (m_grabbers[i].enabled) { - glsafe(::glColor4fv(AXES_COLOR[i].data())); - ::glBegin(GL_LINES); - ::glVertex3dv(center.data()); - ::glVertex3dv(m_grabbers[i].center.data()); - glsafe(::glEnd()); +#if ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else + GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE + if (shader != nullptr) { + shader->start_using(); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix() * base_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.25f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE + + // draw axes + for (unsigned int i = 0; i < 3; ++i) { + render_grabber_connection(i); } + + shader->stop_using(); } // draw grabbers - render_grabbers(box); - for (unsigned int i = 0; i < 3; ++i) { - if (m_grabbers[i].enabled) - render_grabber_extension((Axis)i, box, false); - } + render_grabbers(m_bounding_box); } else { // draw axis - glsafe(::glColor4fv(AXES_COLOR[m_hover_id].data())); - ::glBegin(GL_LINES); - ::glVertex3dv(center.data()); - ::glVertex3dv(m_grabbers[m_hover_id].center.data()); - glsafe(::glEnd()); +#if ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else + GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE + if (shader != nullptr) { + shader->start_using(); - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()* base_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.5f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE + + render_grabber_connection(m_hover_id); + shader->stop_using(); + } + + shader = wxGetApp().get_shader("gouraud_light"); if (shader != nullptr) { shader->start_using(); shader->set_uniform("emission_factor", 0.1f); // draw grabber - float mean_size = (float)((box.size().x() + box.size().y() + box.size().z()) / 3.0); + const Vec3d box_size = m_bounding_box.size(); + const float mean_size = (float)((box_size.x() + box_size.y() + box_size.z()) / 3.0); m_grabbers[m_hover_id].render(true, mean_size); shader->stop_using(); } - render_grabber_extension((Axis)m_hover_id, box, false); } } -void GLGizmoMove3D::on_render_for_picking() +void GLGizmoMove3D::on_register_raycasters_for_picking() { - glsafe(::glDisable(GL_DEPTH_TEST)); + // the gizmo grabbers are rendered on top of the scene, so the raytraced picker should take it into account + m_parent.set_raycaster_gizmos_on_top(true); +} - const BoundingBoxf3& box = m_parent.get_selection().get_bounding_box(); - render_grabbers_for_picking(box); - render_grabber_extension(X, box, true); - render_grabber_extension(Y, box, true); - render_grabber_extension(Z, box, true); +void GLGizmoMove3D::on_unregister_raycasters_for_picking() +{ + m_parent.set_raycaster_gizmos_on_top(false); } double GLGizmoMove3D::calc_projection(const UpdateData& data) const { double projection = 0.0; - Vec3d starting_vec = m_starting_drag_position - m_starting_box_center; - double len_starting_vec = starting_vec.norm(); + const Vec3d starting_vec = m_starting_drag_position - m_starting_box_center; + const double len_starting_vec = starting_vec.norm(); if (len_starting_vec != 0.0) { - Vec3d mouse_dir = data.mouse_ray.unit_vector(); + const Vec3d mouse_dir = data.mouse_ray.unit_vector(); // finds the intersection of the mouse ray with the plane parallel to the camera viewport and passing throught the starting position // use ray-plane intersection see i.e. https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection algebric form // in our case plane normal and ray direction are the same (orthogonal view) // when moving to perspective camera the negative z unit axis of the camera needs to be transformed in world space and used as plane normal - Vec3d inters = data.mouse_ray.a + (m_starting_drag_position - data.mouse_ray.a).dot(mouse_dir) / mouse_dir.squaredNorm() * mouse_dir; + const Vec3d inters = data.mouse_ray.a + (m_starting_drag_position - data.mouse_ray.a).dot(mouse_dir) * mouse_dir; // vector from the starting position to the found intersection - Vec3d inters_vec = inters - m_starting_drag_position; + const Vec3d inters_vec = inters - m_starting_drag_position; // finds projection of the vector along the staring direction projection = inters_vec.dot(starting_vec.normalized()); @@ -188,46 +276,18 @@ double GLGizmoMove3D::calc_projection(const UpdateData& data) const return projection; } -void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box, bool picking) const +Transform3d GLGizmoMove3D::local_transform(const Selection& selection) const { - float mean_size = (float)((box.size().x() + box.size().y() + box.size().z()) / 3.0); - double size = m_dragging ? (double)m_grabbers[axis].get_dragging_half_size(mean_size) : (double)m_grabbers[axis].get_half_size(mean_size); - - std::array color = m_grabbers[axis].color; - if (!picking && m_hover_id != -1) { - color[0] = 1.0f - color[0]; - color[1] = 1.0f - color[1]; - color[2] = 1.0f - color[2]; - color[3] = color[3]; - } - - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); - if (shader == nullptr) - return; - - const_cast(&m_vbo_cone)->set_color(-1, color); - if (!picking) { - shader->start_using(); - shader->set_uniform("emission_factor", 0.1f); + Transform3d ret = Geometry::translation_transform(m_center); + if (!wxGetApp().obj_manipul()->is_world_coordinates()) { + const GLVolume& v = *selection.get_first_volume(); + Transform3d orient_matrix = v.get_instance_transformation().get_rotation_matrix(); + if (selection.is_single_volume_or_modifier() && wxGetApp().obj_manipul()->is_local_coordinates()) + orient_matrix = orient_matrix * v.get_volume_transformation().get_rotation_matrix(); + ret = ret * orient_matrix; } - - glsafe(::glPushMatrix()); - glsafe(::glTranslated(m_grabbers[axis].center.x(), m_grabbers[axis].center.y(), m_grabbers[axis].center.z())); - if (axis == X) - glsafe(::glRotated(90.0, 0.0, 1.0, 0.0)); - else if (axis == Y) - glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0)); - - glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); - glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); - m_vbo_cone.render(); - glsafe(::glPopMatrix()); - - if (! picking) - shader->stop_using(); + return ret; } - - } // namespace GUI -} // namespace Slic3r +} // namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp index baa2df7391b..371cda80a51 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp @@ -7,19 +7,26 @@ namespace Slic3r { namespace GUI { +class Selection; + class GLGizmoMove3D : public GLGizmoBase { static const double Offset; - Vec3d m_displacement; - - double m_snap_step; - - Vec3d m_starting_drag_position; - Vec3d m_starting_box_center; - Vec3d m_starting_box_bottom_center; - - GLModel m_vbo_cone; + Vec3d m_displacement{ Vec3d::Zero() }; + Vec3d m_center{ Vec3d::Zero() }; + BoundingBoxf3 m_bounding_box; + double m_snap_step{ 1.0 }; + Vec3d m_starting_drag_position{ Vec3d::Zero() }; + Vec3d m_starting_box_center{ Vec3d::Zero() }; + Vec3d m_starting_box_bottom_center{ Vec3d::Zero() }; + + struct GrabberConnection + { + GLModel model; + Vec3d old_center{ Vec3d::Zero() }; + }; + std::array m_grabber_connections; public: GLGizmoMove3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); @@ -28,28 +35,37 @@ class GLGizmoMove3D : public GLGizmoBase double get_snap_step(double step) const { return m_snap_step; } void set_snap_step(double step) { m_snap_step = step; } - const Vec3d& get_displacement() const { return m_displacement; } - std::string get_tooltip() const override; + /// + /// Postpone to Grabber for move + /// + /// Keep information about mouse click + /// Return True when use the information otherwise False. + bool on_mouse(const wxMouseEvent &mouse_event) override; + + /// + /// Detect reduction of move for wipetover on selection change + /// + void data_changed() override; protected: - virtual bool on_init() override; - virtual std::string on_get_name() const override; - virtual bool on_is_activable() const override; - virtual void on_start_dragging() override; - virtual void on_stop_dragging() override; - virtual void on_update(const UpdateData& data) override; - virtual void on_render() override; - virtual void on_render_for_picking() override; + bool on_init() override; + std::string on_get_name() const override; + bool on_is_activable() const override; + void on_start_dragging() override; + void on_stop_dragging() override; + void on_dragging(const UpdateData& data) override; + void on_render() override; + virtual void on_register_raycasters_for_picking() override; + virtual void on_unregister_raycasters_for_picking() override; private: double calc_projection(const UpdateData& data) const; - void render_grabber_extension(Axis axis, const BoundingBoxf3& box, bool picking) const; + Transform3d local_transform(const Selection& selection) const; }; - } // namespace GUI } // namespace Slic3r -#endif // slic3r_GLGizmoMove_hpp_ +#endif // slic3r_GLGizmoMove_hpp_ \ No newline at end of file diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index 5bcc888ed81..0a2f9f098d9 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -1,4 +1,3 @@ -// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro. #include "GLGizmoPainterBase.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp" @@ -8,6 +7,7 @@ #include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/Camera.hpp" #include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/OpenGLManager.hpp" #include "slic3r/Utils/UndoRedo.hpp" #include "libslic3r/Model.hpp" #include "libslic3r/PresetBundle.hpp" @@ -18,22 +18,26 @@ namespace Slic3r::GUI { +std::shared_ptr GLGizmoPainterBase::s_sphere = nullptr; GLGizmoPainterBase::GLGizmoPainterBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) : GLGizmoBase(parent, icon_filename, sprite_id) { - // Make sphere and save it into a vertex buffer. - m_vbo_sphere.load_its_flat_shading(its_make_sphere(1., (2*M_PI)/24.)); - m_vbo_sphere.finalize_geometry(true); } -void GLGizmoPainterBase::set_painter_gizmo_data(const Selection& selection) +GLGizmoPainterBase::~GLGizmoPainterBase() +{ + if (s_sphere != nullptr) + s_sphere.reset(); +} + +void GLGizmoPainterBase::data_changed() { if (m_state != On) return; const ModelObject* mo = m_c->selection_info() ? m_c->selection_info()->model_object() : nullptr; - + const Selection & selection = m_parent.get_selection(); if (mo && selection.is_from_single_instance() && (m_schedule_update || mo->id() != m_old_mo_id || mo->volumes.size() != m_old_volumes_size)) { @@ -92,8 +96,12 @@ void GLGizmoPainterBase::render_triangles(const Selection& selection) const if (is_left_handed) glsafe(::glFrontFace(GL_CW)); - glsafe(::glPushMatrix()); - glsafe(::glMultMatrixd(trafo_matrix.data())); + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d& view_matrix = camera.get_view_matrix(); + shader->set_uniform("view_model_matrix", view_matrix * trafo_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * trafo_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); // For printers with multiple extruders, it is necessary to pass trafo_matrix // to the shader input variable print_box.volume_world_matrix before @@ -101,16 +109,13 @@ void GLGizmoPainterBase::render_triangles(const Selection& selection) const // wrong transformation matrix is used for "Clipping of view". shader->set_uniform("volume_world_matrix", trafo_matrix); - m_triangle_selectors[mesh_id]->render(m_imgui); - - glsafe(::glPopMatrix()); + m_triangle_selectors[mesh_id]->render(m_imgui, trafo_matrix); if (is_left_handed) glsafe(::glFrontFace(GL_CCW)); } } - -void GLGizmoPainterBase::render_cursor() const +void GLGizmoPainterBase::render_cursor() { // First check that the mouse pointer is on an object. const ModelObject* mo = m_c->selection_info()->model_object(); @@ -137,79 +142,160 @@ void GLGizmoPainterBase::render_cursor() const } } - - -void GLGizmoPainterBase::render_cursor_circle() const +void GLGizmoPainterBase::render_cursor_circle() { - const Camera &camera = wxGetApp().plater()->get_camera(); - auto zoom = (float) camera.get_zoom(); - float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; - - Size cnv_size = m_parent.get_canvas_size(); - float cnv_half_width = 0.5f * (float) cnv_size.get_width(); - float cnv_half_height = 0.5f * (float) cnv_size.get_height(); - if ((cnv_half_width == 0.0f) || (cnv_half_height == 0.0f)) + const Size cnv_size = m_parent.get_canvas_size(); + const float cnv_width = float(cnv_size.get_width()); + const float cnv_height = float(cnv_size.get_height()); + if (cnv_width == 0.0f || cnv_height == 0.0f) return; - Vec2d mouse_pos(m_parent.get_local_mouse_position()(0), m_parent.get_local_mouse_position()(1)); - Vec2d center(mouse_pos(0) - cnv_half_width, cnv_half_height - mouse_pos(1)); - center = center * inv_zoom; - glsafe(::glLineWidth(1.5f)); - static const std::array color = {0.f, 1.f, 0.3f}; - glsafe(::glColor3fv(color.data())); + const float cnv_inv_width = 1.0f / cnv_width; + const float cnv_inv_height = 1.0f / cnv_height; + + const Vec2d center = m_parent.get_local_mouse_position(); +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + const float zoom = float(wxGetApp().plater()->get_camera().get_zoom()); + const float radius = m_cursor_radius * zoom; +#else + const float radius = m_cursor_radius * float(wxGetApp().plater()->get_camera().get_zoom()); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_core_profile()) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth(1.5f)); glsafe(::glDisable(GL_DEPTH_TEST)); - glsafe(::glPushMatrix()); - glsafe(::glLoadIdentity()); - // ensure that the circle is renderered inside the frustrum - glsafe(::glTranslated(0.0, 0.0, -(camera.get_near_z() + 0.5))); - // ensure that the overlay fits the frustrum near z plane - double gui_scale = camera.get_gui_scale(); - glsafe(::glScaled(gui_scale, gui_scale, 1.0)); - +#if !ENABLE_GL_CORE_PROFILE && !ENABLE_OPENGL_ES glsafe(::glPushAttrib(GL_ENABLE_BIT)); glsafe(::glLineStipple(4, 0xAAAA)); glsafe(::glEnable(GL_LINE_STIPPLE)); +#endif // !ENABLE_GL_CORE_PROFILE && !ENABLE_OPENGL_ES + +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + if (!m_circle.is_initialized() || std::abs(m_old_cursor_radius - radius) > EPSILON) { + m_old_cursor_radius = radius; + m_circle.reset(); +#else + if (!m_circle.is_initialized() || !m_old_center.isApprox(center) || std::abs(m_old_cursor_radius - radius) > EPSILON) { + m_old_cursor_radius = radius; + m_old_center = center; + m_circle.reset(); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + + GLModel::Geometry init_data; +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + const unsigned int StepsCount = (unsigned int)(2 * (4 + int(252 * (zoom - 1.0f) / (250.0f - 1.0f)))); + const float StepSize = 2.0f * float(PI) / float(StepsCount); + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P2 }; +#else + static const unsigned int StepsCount = 32; + static const float StepSize = 2.0f * float(PI) / float(StepsCount); + init_data.format = { GLModel::Geometry::EPrimitiveType::LineLoop, GLModel::Geometry::EVertexLayout::P2 }; +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + init_data.color = { 0.0f, 1.0f, 0.3f, 1.0f }; + init_data.reserve_vertices(StepsCount); + init_data.reserve_indices(StepsCount); + + // vertices + indices + for (unsigned int i = 0; i < StepsCount; ++i) { +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + if (i % 2 != 0) continue; + + const float angle_i = float(i) * StepSize; + const unsigned int j = (i + 1) % StepsCount; + const float angle_j = float(j) * StepSize; + const Vec2d v_i(::cos(angle_i), ::sin(angle_i)); + const Vec2d v_j(::cos(angle_j), ::sin(angle_j)); + init_data.add_vertex(Vec2f(v_i.x(), v_i.y())); + init_data.add_vertex(Vec2f(v_j.x(), v_j.y())); + const size_t vcount = init_data.vertices_count(); + init_data.add_line(vcount - 2, vcount - 1); +#else + const float angle = float(i) * StepSize; + init_data.add_vertex(Vec2f(2.0f * ((center.x() + ::cos(angle) * radius) * cnv_inv_width - 0.5f), + -2.0f * ((center.y() + ::sin(angle) * radius) * cnv_inv_height - 0.5f))); + init_data.add_index(i); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + } - ::glBegin(GL_LINE_LOOP); - for (double angle=0; angle<2*M_PI; angle+=M_PI/20.) - ::glVertex2f(GLfloat(center.x()+m_cursor_radius*cos(angle)), GLfloat(center.y()+m_cursor_radius*sin(angle))); - glsafe(::glEnd()); + m_circle.init_from(std::move(init_data)); + } + +#if ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else + GLShaderProgram* shader = GUI::wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE + if (shader != nullptr) { + shader->start_using(); +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + const Transform3d view_model_matrix = Geometry::translation_transform(Vec3d(2.0f * (center.x() * cnv_inv_width - 0.5f), -2.0f * (center.y() * cnv_inv_height - 0.5f), 0.0)) * + Geometry::scale_transform(Vec3d(2.0f * radius * cnv_inv_width, 2.0f * radius * cnv_inv_height, 1.0f)); + shader->set_uniform("view_model_matrix", view_model_matrix); +#else + shader->set_uniform("view_model_matrix", Transform3d::Identity()); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + shader->set_uniform("projection_matrix", Transform3d::Identity()); +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = wxGetApp().plater()->get_camera().get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.25f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE + m_circle.render(); + shader->stop_using(); + } +#if !ENABLE_GL_CORE_PROFILE && !ENABLE_OPENGL_ES glsafe(::glPopAttrib()); - glsafe(::glPopMatrix()); +#endif // !ENABLE_GL_CORE_PROFILE && !ENABLE_OPENGL_ES glsafe(::glEnable(GL_DEPTH_TEST)); } void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const { - const Transform3d complete_scaling_matrix_inverse = Geometry::Transformation(trafo).get_matrix(true, true, false, true).inverse(); - const bool is_left_handed = Geometry::Transformation(trafo).is_left_handed(); + if (s_sphere == nullptr) { + s_sphere = std::make_shared(); + s_sphere->init_from(its_make_sphere(1.0, double(PI) / 12.0)); + } - glsafe(::glPushMatrix()); - glsafe(::glMultMatrixd(trafo.data())); - // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. - glsafe(::glTranslatef(m_rr.hit(0), m_rr.hit(1), m_rr.hit(2))); - glsafe(::glMultMatrixd(complete_scaling_matrix_inverse.data())); - glsafe(::glScaled(m_cursor_radius, m_cursor_radius, m_cursor_radius)); + GLShaderProgram* shader = wxGetApp().get_shader("flat"); + if (shader == nullptr) + return; - if (is_left_handed) - glFrontFace(GL_CW); + const Transform3d complete_scaling_matrix_inverse = Geometry::Transformation(trafo).get_scaling_factor_matrix().inverse(); - std::array render_color = {0.f, 0.f, 0.f, 0.25f}; + ColorRGBA render_color = { 0.0f, 0.0f, 0.0f, 0.25f }; if (m_button_down == Button::Left) render_color = this->get_cursor_sphere_left_button_color(); else if (m_button_down == Button::Right) render_color = this->get_cursor_sphere_right_button_color(); - glsafe(::glColor4fv(render_color.data())); - m_vbo_sphere.render(); + shader->start_using(); + + const Camera& camera = wxGetApp().plater()->get_camera(); + Transform3d view_model_matrix = camera.get_view_matrix() * trafo * + Geometry::translation_transform(m_rr.hit.cast()) * complete_scaling_matrix_inverse * + Geometry::scale_transform(m_cursor_radius * Vec3d::Ones()); + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + const bool is_left_handed = Geometry::Transformation(view_model_matrix).is_left_handed(); if (is_left_handed) - glFrontFace(GL_CCW); + glsafe(::glFrontFace(GL_CW)); - glsafe(::glPopMatrix()); + assert(s_sphere != nullptr); + s_sphere->set_color(render_color); + s_sphere->render(); + + if (is_left_handed) + glsafe(::glFrontFace(GL_CCW)); + + shader->stop_using(); } @@ -358,7 +444,7 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous pos = action == SLAGizmoEventType::MouseWheelDown ? std::max(0., pos - 0.01) : std::min(1., pos + 0.01); - m_c->object_clipper()->set_position(pos, true); + m_c->object_clipper()->set_position_by_ratio(pos, true); return true; } else if (alt_down) { @@ -375,7 +461,7 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous const Selection &selection = m_parent.get_selection(); const ModelObject *mo = m_c->selection_info()->model_object(); const ModelInstance *mi = mo->instances[selection.get_instance_idx()]; - const Transform3d trafo_matrix_not_translate = mi->get_transformation().get_matrix(true) * mo->volumes[m_rr.mesh_id]->get_matrix(true); + const Transform3d trafo_matrix_not_translate = mi->get_transformation().get_matrix_no_offset() * mo->volumes[m_rr.mesh_id]->get_matrix_no_offset(); const Transform3d trafo_matrix = mi->get_transformation().get_matrix() * mo->volumes[m_rr.mesh_id]->get_matrix(); m_triangle_selectors[m_rr.mesh_id]->seed_fill_select_triangles(m_rr.hit, int(m_rr.facet), trafo_matrix_not_translate, this->get_clipping_plane_in_volume_coordinates(trafo_matrix), m_smart_fill_angle, m_paint_on_overhangs_only ? m_highlight_by_angle_threshold_deg : 0.f, true); @@ -390,7 +476,7 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous } if (action == SLAGizmoEventType::ResetClippingPlane) { - m_c->object_clipper()->set_position(-1., false); + m_c->object_clipper()->set_position_by_ratio(-1., false); return true; } @@ -414,7 +500,7 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous const ModelObject *mo = m_c->selection_info()->model_object(); const ModelInstance *mi = mo->instances[selection.get_instance_idx()]; const Transform3d instance_trafo = mi->get_transformation().get_matrix(); - const Transform3d instance_trafo_not_translate = mi->get_transformation().get_matrix(true); + const Transform3d instance_trafo_not_translate = mi->get_transformation().get_matrix_no_offset(); // Precalculate transformations of individual meshes. std::vector trafo_matrices; @@ -422,7 +508,7 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous for (const ModelVolume *mv : mo->volumes) if (mv->is_model_part()) { trafo_matrices.emplace_back(instance_trafo * mv->get_matrix()); - trafo_matrices_not_translate.emplace_back(instance_trafo_not_translate * mv->get_matrix(true)); + trafo_matrices_not_translate.emplace_back(instance_trafo_not_translate * mv->get_matrix_no_offset()); } std::vector> projected_mouse_positions_by_mesh = get_projected_mouse_positions(mouse_position, 1., trafo_matrices); @@ -504,7 +590,7 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous const ModelObject *mo = m_c->selection_info()->model_object(); const ModelInstance *mi = mo->instances[selection.get_instance_idx()]; const Transform3d instance_trafo = mi->get_transformation().get_matrix(); - const Transform3d instance_trafo_not_translate = mi->get_transformation().get_matrix(true); + const Transform3d instance_trafo_not_translate = mi->get_transformation().get_matrix_no_offset(); // Precalculate transformations of individual meshes. std::vector trafo_matrices; @@ -512,7 +598,7 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous for (const ModelVolume *mv : mo->volumes) if (mv->is_model_part()) { trafo_matrices.emplace_back(instance_trafo * mv->get_matrix()); - trafo_matrices_not_translate.emplace_back(instance_trafo_not_translate * mv->get_matrix(true)); + trafo_matrices_not_translate.emplace_back(instance_trafo_not_translate* mv->get_matrix_no_offset()); } // Now "click" into all the prepared points and spill paint around them. @@ -570,7 +656,72 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous return false; } +bool GLGizmoPainterBase::on_mouse(const wxMouseEvent &mouse_event) +{ + // wxCoord == int --> wx/types.h + Vec2i mouse_coord(mouse_event.GetX(), mouse_event.GetY()); + Vec2d mouse_pos = mouse_coord.cast(); + + if (mouse_event.Moving()) { + gizmo_event(SLAGizmoEventType::Moving, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false); + return false; + } + // when control is down we allow scene pan and rotation even when clicking + // over some object + bool control_down = mouse_event.CmdDown(); + bool grabber_contains_mouse = (get_hover_id() != -1); + + const Selection &selection = m_parent.get_selection(); + int selected_object_idx = selection.get_object_idx(); + if (mouse_event.LeftDown()) { + if ((!control_down || grabber_contains_mouse) && + gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false)) + // the gizmo got the event and took some action, there is no need + // to do anything more + return true; + } else if (mouse_event.RightDown()){ + if (!control_down && selected_object_idx != -1 && + gizmo_event(SLAGizmoEventType::RightDown, mouse_pos, false, false, false)) + // event was taken care of + return true; + } else if (mouse_event.Dragging()) { + if (m_parent.get_move_volume_id() != -1) + // don't allow dragging objects with the Sla gizmo on + return true; + if (!control_down && gizmo_event(SLAGizmoEventType::Dragging, + mouse_pos, mouse_event.ShiftDown(), + mouse_event.AltDown(), false)) { + // the gizmo got the event and took some action, no need to do + // anything more here + m_parent.set_as_dirty(); + return true; + } + if(control_down && (mouse_event.LeftIsDown() || mouse_event.RightIsDown())) + { + // CTRL has been pressed while already dragging -> stop current action + if (mouse_event.LeftIsDown()) + gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true); + else if (mouse_event.RightIsDown()) + gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true); + return false; + } + } else if (mouse_event.LeftUp()) { + if (!m_parent.is_mouse_dragging()) { + // in case SLA/FDM gizmo is selected, we just pass the LeftUp + // event and stop processing - neither object moving or selecting + // is suppressed in that case + gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), control_down); + return true; + } + } else if (mouse_event.RightUp()) { + if (!m_parent.is_mouse_dragging()) { + gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), control_down); + return true; + } + } + return false; +} void GLGizmoPainterBase::update_raycast_cache(const Vec2d& mouse_position, const Camera& camera, @@ -698,15 +849,15 @@ TriangleSelector::ClippingPlane GLGizmoPainterBase::get_clipping_plane_in_volume return TriangleSelector::ClippingPlane({float(normal_transformed.x()), float(normal_transformed.y()), float(normal_transformed.z()), offset_transformed}); } -std::array TriangleSelectorGUI::get_seed_fill_color(const std::array &base_color) +ColorRGBA TriangleSelectorGUI::get_seed_fill_color(const ColorRGBA& base_color) { - return {base_color[0] * 0.75f, base_color[1] * 0.75f, base_color[2] * 0.75f, 1.f}; + return saturate(base_color, 0.75f); } -void TriangleSelectorGUI::render(ImGuiWrapper* imgui) +void TriangleSelectorGUI::render(ImGuiWrapper* imgui, const Transform3d& matrix) { - static constexpr std::array enforcers_color{0.47f, 0.47f, 1.f, 1.f}; - static constexpr std::array blockers_color{1.f, 0.44f, 0.44f, 1.f}; + static const ColorRGBA enforcers_color = { 0.47f, 0.47f, 1.0f, 1.0f }; + static const ColorRGBA blockers_color = { 1.0f, 0.44f, 0.44f, 1.0f }; if (m_update_render_data) { update_render_data(); @@ -716,47 +867,32 @@ void TriangleSelectorGUI::render(ImGuiWrapper* imgui) auto* shader = wxGetApp().get_current_shader(); if (! shader) return; + assert(shader->get_name() == "gouraud"); - ScopeGuard guard([shader]() { if (shader) shader->set_uniform("offset_depth_buffer", false);}); - shader->set_uniform("offset_depth_buffer", true); + for (auto iva : {std::make_pair(&m_iva_enforcers, enforcers_color), std::make_pair(&m_iva_blockers, blockers_color)}) { - if (iva.first->has_VBOs()) { - shader->set_uniform("uniform_color", iva.second); - iva.first->render(); - } + iva.first->set_color(iva.second); + iva.first->render(); } - for (auto &iva : m_iva_seed_fills) - if (iva.has_VBOs()) { - size_t color_idx = &iva - &m_iva_seed_fills.front(); - const std::array &color = TriangleSelectorGUI::get_seed_fill_color(color_idx == 1 ? enforcers_color : - color_idx == 2 ? blockers_color : - GLVolume::NEUTRAL_COLOR); - shader->set_uniform("uniform_color", color); - iva.render(); - } - - if (m_paint_contour.has_VBO()) { - ScopeGuard guard_gouraud([shader]() { shader->start_using(); }); - shader->stop_using(); - - auto *contour_shader = wxGetApp().get_shader("mm_contour"); - contour_shader->start_using(); - - glsafe(::glDepthFunc(GL_LEQUAL)); - m_paint_contour.render(); - glsafe(::glDepthFunc(GL_LESS)); - - contour_shader->stop_using(); + for (auto& iva : m_iva_seed_fills) { + size_t color_idx = &iva - &m_iva_seed_fills.front(); + const ColorRGBA& color = TriangleSelectorGUI::get_seed_fill_color(color_idx == 1 ? enforcers_color : + color_idx == 2 ? blockers_color : + GLVolume::NEUTRAL_COLOR); + iva.set_color(color); + iva.render(); } + render_paint_contour(matrix); + #ifdef PRUSASLICER_TRIANGLE_SELECTOR_DEBUG if (imgui) render_debug(imgui); else assert(false); // If you want debug output, pass ptr to ImGuiWrapper. -#endif +#endif // PRUSASLICER_TRIANGLE_SELECTOR_DEBUG } void TriangleSelectorGUI::update_render_data() @@ -765,20 +901,33 @@ void TriangleSelectorGUI::update_render_data() int blc_cnt = 0; std::vector seed_fill_cnt(m_iva_seed_fills.size(), 0); - for (auto *iva : {&m_iva_enforcers, &m_iva_blockers}) - iva->release_geometry(); + for (auto* iva : { &m_iva_enforcers, &m_iva_blockers }) { + iva->reset(); + } + + for (auto& iva : m_iva_seed_fills) { + iva.reset(); + } + + GLModel::Geometry iva_enforcers_data; + iva_enforcers_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + GLModel::Geometry iva_blockers_data; + iva_blockers_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + std::array iva_seed_fills_data; + for (auto& data : iva_seed_fills_data) + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; - for (auto &iva : m_iva_seed_fills) - iva.release_geometry(); + // small value used to offset triangles along their normal to avoid z-fighting + static const float offset = 0.001f; for (const Triangle &tr : m_triangles) { if (!tr.valid() || tr.is_split() || (tr.get_state() == EnforcerBlockerType::NONE && !tr.is_selected_by_seed_fill())) continue; int tr_state = int(tr.get_state()); - GLIndexedVertexArray &iva = tr.is_selected_by_seed_fill() ? m_iva_seed_fills[tr_state] : - tr.get_state() == EnforcerBlockerType::ENFORCER ? m_iva_enforcers : - m_iva_blockers; + GLModel::Geometry &iva = tr.is_selected_by_seed_fill() ? iva_seed_fills_data[tr_state] : + tr.get_state() == EnforcerBlockerType::ENFORCER ? iva_enforcers_data : + iva_blockers_data; int &cnt = tr.is_selected_by_seed_fill() ? seed_fill_cnt[tr_state] : tr.get_state() == EnforcerBlockerType::ENFORCER ? enf_cnt : blc_cnt; @@ -788,95 +937,25 @@ void TriangleSelectorGUI::update_render_data() //FIXME the normal may likely be pulled from m_triangle_selectors, but it may not be worth the effort // or the current implementation may be more cache friendly. const Vec3f n = (v1 - v0).cross(v2 - v1).normalized(); - iva.push_geometry(v0, n); - iva.push_geometry(v1, n); - iva.push_geometry(v2, n); - iva.push_triangle(cnt, cnt + 1, cnt + 2); + // small value used to offset triangles along their normal to avoid z-fighting + const Vec3f offset_n = offset * n; + iva.add_vertex(v0 + offset_n, n); + iva.add_vertex(v1 + offset_n, n); + iva.add_vertex(v2 + offset_n, n); + iva.add_triangle((unsigned int)cnt, (unsigned int)cnt + 1, (unsigned int)cnt + 2); cnt += 3; } - for (auto *iva : {&m_iva_enforcers, &m_iva_blockers}) - iva->finalize_geometry(true); - - for (auto &iva : m_iva_seed_fills) - iva.finalize_geometry(true); - - m_paint_contour.release_geometry(); - std::vector contour_edges = this->get_seed_fill_contour(); - m_paint_contour.contour_vertices.reserve(contour_edges.size() * 6); - for (const Vec2i &edge : contour_edges) { - m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(0)].v.x()); - m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(0)].v.y()); - m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(0)].v.z()); - - m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(1)].v.x()); - m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(1)].v.y()); - m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(1)].v.z()); - } - - m_paint_contour.contour_indices.assign(m_paint_contour.contour_vertices.size() / 3, 0); - std::iota(m_paint_contour.contour_indices.begin(), m_paint_contour.contour_indices.end(), 0); - m_paint_contour.contour_indices_size = m_paint_contour.contour_indices.size(); - - m_paint_contour.finalize_geometry(); -} - -void GLPaintContour::render() const -{ - assert(this->m_contour_VBO_id != 0); - assert(this->m_contour_EBO_id != 0); - - glsafe(::glLineWidth(4.0f)); - - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, this->m_contour_VBO_id)); - glsafe(::glVertexPointer(3, GL_FLOAT, 3 * sizeof(float), nullptr)); - - glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); - - if (this->contour_indices_size > 0) { - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->m_contour_EBO_id)); - glsafe(::glDrawElements(GL_LINES, GLsizei(this->contour_indices_size), GL_UNSIGNED_INT, nullptr)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - } - - glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); - - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); -} - -void GLPaintContour::finalize_geometry() -{ - assert(this->m_contour_VBO_id == 0); - assert(this->m_contour_EBO_id == 0); - - if (!this->contour_vertices.empty()) { - glsafe(::glGenBuffers(1, &this->m_contour_VBO_id)); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, this->m_contour_VBO_id)); - glsafe(::glBufferData(GL_ARRAY_BUFFER, this->contour_vertices.size() * sizeof(float), this->contour_vertices.data(), GL_STATIC_DRAW)); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); - this->contour_vertices.clear(); - } - - if (!this->contour_indices.empty()) { - glsafe(::glGenBuffers(1, &this->m_contour_EBO_id)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->m_contour_EBO_id)); - glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, this->contour_indices.size() * sizeof(unsigned int), this->contour_indices.data(), GL_STATIC_DRAW)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - this->contour_indices.clear(); + if (!iva_enforcers_data.is_empty()) + m_iva_enforcers.init_from(std::move(iva_enforcers_data)); + if (!iva_blockers_data.is_empty()) + m_iva_blockers.init_from(std::move(iva_blockers_data)); + for (size_t i = 0; i < m_iva_seed_fills.size(); ++i) { + if (!iva_seed_fills_data[i].is_empty()) + m_iva_seed_fills[i].init_from(std::move(iva_seed_fills_data[i])); } -} -void GLPaintContour::release_geometry() -{ - if (this->m_contour_VBO_id) { - glsafe(::glDeleteBuffers(1, &this->m_contour_VBO_id)); - this->m_contour_VBO_id = 0; - } - if (this->m_contour_EBO_id) { - glsafe(::glDeleteBuffers(1, &this->m_contour_EBO_id)); - this->m_contour_EBO_id = 0; - } - this->clear(); + update_paint_contour(); } #ifdef PRUSASLICER_TRIANGLE_SELECTOR_DEBUG @@ -915,59 +994,124 @@ void TriangleSelectorGUI::render_debug(ImGuiWrapper* imgui) }; for (auto& va : m_varrays) - va.release_geometry(); + va.reset(); std::array cnts; ::glScalef(1.01f, 1.01f, 1.01f); + std::array varrays_data; + for (auto& data : varrays_data) + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::UINT }; + for (int tr_id=0; tr_idpush_geometry(double(m_vertices[tr.verts_idxs[i]].v[0]), - double(m_vertices[tr.verts_idxs[i]].v[1]), - double(m_vertices[tr.verts_idxs[i]].v[2]), - 0., 0., 1.); - va->push_triangle(*cnt, - *cnt+1, - *cnt+2); + for (int i = 0; i < 3; ++i) { + va->add_vertex(m_vertices[tr.verts_idxs[i]].v, Vec3f(0.0f, 0.0f, 1.0f)); + } + va->add_uint_triangle((unsigned int)*cnt, (unsigned int)*cnt + 1, (unsigned int)*cnt + 2); *cnt += 3; } + for (int i = 0; i < 3; ++i) { + if (!varrays_data[i].is_empty()) + m_varrays[i].init_from(std::move(varrays_data[i])); + } + + GLShaderProgram* curr_shader = wxGetApp().get_current_shader(); + if (curr_shader != nullptr) + curr_shader->stop_using(); + + GLShaderProgram* shader = wxGetApp().get_shader("flat"); + if (shader != nullptr) { + shader->start_using(); + + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + ::glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); for (vtype i : {ORIGINAL, SPLIT, INVALID}) { - GLIndexedVertexArray& va = m_varrays[i]; - va.finalize_geometry(true); - if (va.has_VBOs()) { - switch (i) { - case ORIGINAL : ::glColor3f(0.f, 0.f, 1.f); break; - case SPLIT : ::glColor3f(1.f, 0.f, 0.f); break; - case INVALID : ::glColor3f(1.f, 1.f, 0.f); break; - } - va.render(); + GLModel& va = m_varrays[i]; + switch (i) { + case ORIGINAL: va.set_color({ 0.0f, 0.0f, 1.0f, 1.0f }); break; + case SPLIT: va.set_color({ 1.0f, 0.0f, 0.0f, 1.0f }); break; + case INVALID: va.set_color({ 1.0f, 1.0f, 0.0f, 1.0f }); break; } + va.render(); } ::glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); + + shader->stop_using(); + } + + if (curr_shader != nullptr) + curr_shader->start_using(); } -#endif +#endif // PRUSASLICER_TRIANGLE_SELECTOR_DEBUG +void TriangleSelectorGUI::update_paint_contour() +{ + m_paint_contour.reset(); + + GLModel::Geometry init_data; + const std::vector contour_edges = this->get_seed_fill_contour(); + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; + init_data.reserve_vertices(2 * contour_edges.size()); + init_data.reserve_indices(2 * contour_edges.size()); + init_data.color = ColorRGBA::WHITE(); + + // vertices + indices + unsigned int vertices_count = 0; + for (const Vec2i& edge : contour_edges) { + init_data.add_vertex(m_vertices[edge(0)].v); + init_data.add_vertex(m_vertices[edge(1)].v); + vertices_count += 2; + init_data.add_line(vertices_count - 2, vertices_count - 1); + } + + if (!init_data.is_empty()) + m_paint_contour.init_from(std::move(init_data)); +} + +void TriangleSelectorGUI::render_paint_contour(const Transform3d& matrix) +{ + auto* curr_shader = wxGetApp().get_current_shader(); + if (curr_shader != nullptr) + curr_shader->stop_using(); + + auto* contour_shader = wxGetApp().get_shader("mm_contour"); + if (contour_shader != nullptr) { + contour_shader->start_using(); + + contour_shader->set_uniform("offset", OpenGLManager::get_gl_info().is_mesa() ? 0.0005 : 0.00001); + const Camera& camera = wxGetApp().plater()->get_camera(); + contour_shader->set_uniform("view_model_matrix", camera.get_view_matrix() * matrix); + contour_shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + m_paint_contour.render(); + contour_shader->stop_using(); + } + + if (curr_shader != nullptr) + curr_shader->start_using(); +} } // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp index 44476a5e3a3..1fd718a252f 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp @@ -3,7 +3,7 @@ #include "GLGizmoBase.hpp" -#include "slic3r/GUI/3DScene.hpp" +#include "slic3r/GUI/GLModel.hpp" #include "libslic3r/ObjectID.hpp" #include "libslic3r/TriangleSelector.hpp" @@ -12,6 +12,8 @@ #include #include +#include +#include namespace Slic3r::GUI { @@ -20,6 +22,7 @@ enum class SLAGizmoEventType : unsigned char; class ClippingPlane; struct Camera; class GLGizmoMmuSegmentation; +class Selection; enum class PainterGizmoType { FDM_SUPPORTS, @@ -27,76 +30,43 @@ enum class PainterGizmoType { MMU_SEGMENTATION }; -class GLPaintContour -{ -public: - GLPaintContour() = default; - - void render() const; - - inline bool has_VBO() const { return this->m_contour_EBO_id != 0; } - - // Release the geometry data, release OpenGL VBOs. - void release_geometry(); - - // Finalize the initialization of the contour geometry and the indices, upload both to OpenGL VBO objects - // and possibly releasing it if it has been loaded into the VBOs. - void finalize_geometry(); - - void clear() - { - this->contour_vertices.clear(); - this->contour_indices.clear(); - this->contour_indices_size = 0; - } - - std::vector contour_vertices; - std::vector contour_indices; - - // When the triangle indices are loaded into the graphics card as Vertex Buffer Objects, - // the above mentioned std::vectors are cleared and the following variables keep their original length. - size_t contour_indices_size{0}; - - // IDs of the Vertex Array Objects, into which the geometry has been loaded. - // Zero if the VBOs are not sent to GPU yet. - GLuint m_contour_VBO_id{0}; - GLuint m_contour_EBO_id{0}; -}; - class TriangleSelectorGUI : public TriangleSelector { public: explicit TriangleSelectorGUI(const TriangleMesh& mesh) : TriangleSelector(mesh) {} virtual ~TriangleSelectorGUI() = default; - // Render current selection. Transformation matrices are supposed - // to be already set. - virtual void render(ImGuiWrapper *imgui); - void render() { this->render(nullptr); } + virtual void render(ImGuiWrapper* imgui, const Transform3d& matrix); + void render(const Transform3d& matrix) { this->render(nullptr, matrix); } - void request_update_render_data() { m_update_render_data = true; }; + void request_update_render_data() { m_update_render_data = true; } #ifdef PRUSASLICER_TRIANGLE_SELECTOR_DEBUG void render_debug(ImGuiWrapper* imgui); bool m_show_triangles{false}; bool m_show_invalid{false}; -#endif +#endif // PRUSASLICER_TRIANGLE_SELECTOR_DEBUG protected: bool m_update_render_data = false; - static std::array get_seed_fill_color(const std::array &base_color); + static ColorRGBA get_seed_fill_color(const ColorRGBA& base_color); private: void update_render_data(); - GLIndexedVertexArray m_iva_enforcers; - GLIndexedVertexArray m_iva_blockers; - std::array m_iva_seed_fills; - std::array m_varrays; + GLModel m_iva_enforcers; + GLModel m_iva_blockers; + std::array m_iva_seed_fills; +#ifdef PRUSASLICER_TRIANGLE_SELECTOR_DEBUG + std::array m_varrays; +#endif // PRUSASLICER_TRIANGLE_SELECTOR_DEBUG protected: - GLPaintContour m_paint_contour; + GLModel m_paint_contour; + + void update_paint_contour(); + void render_paint_contour(const Transform3d& matrix); }; @@ -109,33 +79,42 @@ class GLGizmoPainterBase : public GLGizmoBase ObjectID m_old_mo_id; size_t m_old_volumes_size = 0; void on_render() override {} - void on_render_for_picking() override {} + public: GLGizmoPainterBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); - ~GLGizmoPainterBase() override = default; - virtual void set_painter_gizmo_data(const Selection& selection); + ~GLGizmoPainterBase() override; + void data_changed() override; virtual bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); // Following function renders the triangles and cursor. Having this separated // from usual on_render method allows to render them before transparent // objects, so they can be seen inside them. The usual on_render is called // after all volumes (including transparent ones) are rendered. - virtual void render_painter_gizmo() const = 0; + virtual void render_painter_gizmo() = 0; virtual const float get_cursor_radius_min() const { return CursorRadiusMin; } virtual const float get_cursor_radius_max() const { return CursorRadiusMax; } virtual const float get_cursor_radius_step() const { return CursorRadiusStep; } + /// + /// Implement when want to process mouse events in gizmo + /// Click, Right click, move, drag, ... + /// + /// Keep information about mouse click + /// Return True when use the information and don't want to + /// propagate it otherwise False. + bool on_mouse(const wxMouseEvent &mouse_event) override; + protected: virtual void render_triangles(const Selection& selection) const; - void render_cursor() const; - void render_cursor_circle() const; + void render_cursor(); + void render_cursor_circle(); void render_cursor_sphere(const Transform3d& trafo) const; virtual void update_model_object() const = 0; virtual void update_from_model_object() = 0; - virtual std::array get_cursor_sphere_left_button_color() const { return {0.f, 0.f, 1.f, 0.25f}; } - virtual std::array get_cursor_sphere_right_button_color() const { return {1.f, 0.f, 0.f, 0.25f}; } + virtual ColorRGBA get_cursor_sphere_left_button_color() const { return { 0.0f, 0.0f, 1.0f, 0.25f }; } + virtual ColorRGBA get_cursor_sphere_right_button_color() const { return { 1.0f, 0.0f, 0.0f, 0.25f }; } virtual EnforcerBlockerType get_left_button_state_type() const { return EnforcerBlockerType::ENFORCER; } virtual EnforcerBlockerType get_right_button_state_type() const { return EnforcerBlockerType::BLOCKER; } @@ -170,6 +149,12 @@ class GLGizmoPainterBase : public GLGizmoBase bool m_paint_on_overhangs_only = false; float m_highlight_by_angle_threshold_deg = 0.f; + GLModel m_circle; +#if !ENABLE_GL_CORE_PROFILE + Vec2d m_old_center{ Vec2d::Zero() }; +#endif // !ENABLE_GL_CORE_PROFILE + float m_old_cursor_radius{ 0.0f }; + static constexpr float SmartFillAngleMin = 0.0f; static constexpr float SmartFillAngleMax = 90.f; static constexpr float SmartFillAngleStep = 1.f; @@ -202,7 +187,7 @@ class GLGizmoPainterBase : public GLGizmoBase const Camera& camera, const std::vector& trafo_matrices) const; - GLIndexedVertexArray m_vbo_sphere; + static std::shared_ptr s_sphere; bool m_internal_stack_active = false; bool m_schedule_update = false; @@ -224,9 +209,6 @@ class GLGizmoPainterBase : public GLGizmoBase protected: void on_set_state() override; - void on_start_dragging() override {} - void on_stop_dragging() override {} - virtual void on_opening() = 0; virtual void on_shutdown() = 0; virtual PainterGizmoType get_painter_type() const = 0; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index 61fe6e7095d..2636486a78e 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -1,26 +1,26 @@ -// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro. #include "GLGizmoRotate.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/ImGuiWrapper.hpp" - -#include +#include "slic3r/GUI/GUI_ObjectManipulation.hpp" #include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/GUI.hpp" #include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/Jobs/RotoptimizeJob.hpp" + #include "libslic3r/PresetBundle.hpp" +#include "libslic3r/Model.hpp" -#include "slic3r/GUI/Jobs/RotoptimizeJob.hpp" +#include namespace Slic3r { namespace GUI { const float GLGizmoRotate::Offset = 5.0f; -const unsigned int GLGizmoRotate::CircleResolution = 64; const unsigned int GLGizmoRotate::AngleResolution = 64; const unsigned int GLGizmoRotate::ScaleStepsCount = 72; -const float GLGizmoRotate::ScaleStepRad = 2.0f * (float)PI / GLGizmoRotate::ScaleStepsCount; +const float GLGizmoRotate::ScaleStepRad = 2.0f * float(PI) / GLGizmoRotate::ScaleStepsCount; const unsigned int GLGizmoRotate::ScaleLongEvery = 2; const float GLGizmoRotate::ScaleLongTooth = 0.1f; // in percent of radius const unsigned int GLGizmoRotate::SnapRegionsCount = 8; @@ -36,26 +36,20 @@ GLGizmoRotate::GLGizmoRotate(GLCanvas3D& parent, GLGizmoRotate::Axis axis) , m_snap_coarse_out_radius(0.0f) , m_snap_fine_in_radius(0.0f) , m_snap_fine_out_radius(0.0f) + , m_drag_color(DEFAULT_DRAG_COLOR) + , m_highlight_color(DEFAULT_HIGHLIGHT_COLOR) { + m_group_id = static_cast(axis); } -GLGizmoRotate::GLGizmoRotate(const GLGizmoRotate& other) - : GLGizmoBase(other.m_parent, other.m_icon_filename, other.m_sprite_id) - , m_axis(other.m_axis) - , m_angle(other.m_angle) - , m_center(other.m_center) - , m_radius(other.m_radius) - , m_snap_coarse_in_radius(other.m_snap_coarse_in_radius) - , m_snap_coarse_out_radius(other.m_snap_coarse_out_radius) - , m_snap_fine_in_radius(other.m_snap_fine_in_radius) - , m_snap_fine_out_radius(other.m_snap_fine_out_radius) +void GLGizmoRotate::set_highlight_color(const ColorRGBA &color) { + m_highlight_color = color; } - void GLGizmoRotate::set_angle(double angle) { - if (std::abs(angle - 2.0 * (double)PI) < EPSILON) + if (std::abs(angle - 2.0 * double(PI)) < EPSILON) angle = 0.0; m_angle = angle; @@ -70,56 +64,69 @@ std::string GLGizmoRotate::get_tooltip() const case Y: { axis = "Y"; break; } case Z: { axis = "Z"; break; } } - return (m_hover_id == 0 || m_grabbers[0].dragging) ? axis + ": " + format((float)Geometry::rad2deg(m_angle), 4) : ""; + return (m_hover_id == 0 || m_grabbers.front().dragging) ? axis + ": " + format(float(Geometry::rad2deg(m_angle)), 4) : ""; +} + +bool GLGizmoRotate::on_mouse(const wxMouseEvent &mouse_event) +{ + return use_grabbers(mouse_event); +} + +void GLGizmoRotate::dragging(const UpdateData &data) { on_dragging(data); } + +void GLGizmoRotate::start_dragging() +{ + m_grabbers[0].dragging = true; + on_start_dragging(); } +void GLGizmoRotate::stop_dragging() +{ + m_grabbers[0].dragging = false; + on_stop_dragging(); +} + +void GLGizmoRotate::enable_grabber() { m_grabbers[0].enabled = true; } +void GLGizmoRotate::disable_grabber() { m_grabbers[0].enabled = false; } + bool GLGizmoRotate::on_init() { m_grabbers.push_back(Grabber()); + m_grabbers.back().extensions = (GLGizmoBase::EGrabberExtension)(int(GLGizmoBase::EGrabberExtension::PosY) | int(GLGizmoBase::EGrabberExtension::NegY)); return true; } void GLGizmoRotate::on_start_dragging() { - const BoundingBoxf3& box = m_parent.get_selection().get_bounding_box(); - m_center = box.center(); - m_radius = Offset + box.radius(); - m_snap_coarse_in_radius = m_radius / 3.0f; - m_snap_coarse_out_radius = 2.0f * m_snap_coarse_in_radius; - m_snap_fine_in_radius = m_radius; - m_snap_fine_out_radius = m_snap_fine_in_radius + m_radius * ScaleLongTooth; + init_data_from_selection(m_parent.get_selection()); } -void GLGizmoRotate::on_update(const UpdateData& data) +void GLGizmoRotate::on_dragging(const UpdateData &data) { - Vec2d mouse_pos = to_2d(mouse_position_in_local_plane(data.mouse_ray, m_parent.get_selection())); - - Vec2d orig_dir = Vec2d::UnitX(); - Vec2d new_dir = mouse_pos.normalized(); + const Vec2d mouse_pos = to_2d(mouse_position_in_local_plane(data.mouse_ray)); + const Vec2d orig_dir = Vec2d::UnitX(); + const Vec2d new_dir = mouse_pos.normalized(); double theta = ::acos(std::clamp(new_dir.dot(orig_dir), -1.0, 1.0)); if (cross2(orig_dir, new_dir) < 0.0) theta = 2.0 * (double)PI - theta; - double len = mouse_pos.norm(); + const double len = mouse_pos.norm(); // snap to coarse snap region - if ((m_snap_coarse_in_radius <= len) && (len <= m_snap_coarse_out_radius)) - { - double step = 2.0 * (double)PI / (double)SnapRegionsCount; - theta = step * (double)std::round(theta / step); + if (m_snap_coarse_in_radius <= len && len <= m_snap_coarse_out_radius) { + const double step = 2.0 * double(PI) / double(SnapRegionsCount); + theta = step * std::round(theta / step); } - else - { + else { // snap to fine snap region (scale) - if ((m_snap_fine_in_radius <= len) && (len <= m_snap_fine_out_radius)) - { - double step = 2.0 * (double)PI / (double)ScaleStepsCount; - theta = step * (double)std::round(theta / step); + if (m_snap_fine_in_radius <= len && len <= m_snap_fine_out_radius) { + const double step = 2.0 * double(PI) / double(ScaleStepsCount); + theta = step * std::round(theta / step); } } - if (theta == 2.0 * (double)PI) + if (theta == 2.0 * double(PI)) theta = 0.0; m_angle = theta; @@ -127,63 +134,80 @@ void GLGizmoRotate::on_update(const UpdateData& data) void GLGizmoRotate::on_render() { - if (!m_grabbers[0].enabled) + if (!m_grabbers.front().enabled) return; const Selection& selection = m_parent.get_selection(); - const BoundingBoxf3& box = selection.get_bounding_box(); - - if (m_hover_id != 0 && !m_grabbers[0].dragging) { - m_center = box.center(); - m_radius = Offset + box.radius(); - m_snap_coarse_in_radius = m_radius / 3.0f; - m_snap_coarse_out_radius = 2.0f * m_snap_coarse_in_radius; - m_snap_fine_in_radius = m_radius; - m_snap_fine_out_radius = m_radius * (1.0f + ScaleLongTooth); - } + if (m_hover_id != 0 && !m_grabbers.front().dragging) + init_data_from_selection(selection); - glsafe(::glEnable(GL_DEPTH_TEST)); - - glsafe(::glPushMatrix()); - transform_to_local(selection); + const double grabber_radius = (double)m_radius * (1.0 + (double)GrabberOffset); + m_grabbers.front().center = Vec3d(::cos(m_angle) * grabber_radius, ::sin(m_angle) * grabber_radius, 0.0); + m_grabbers.front().angles.z() = m_angle; - glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); - glsafe(::glColor4fv((m_hover_id != -1) ? m_drag_color.data() : m_highlight_color.data())); + glsafe(::glEnable(GL_DEPTH_TEST)); - render_circle(); + m_grabbers.front().matrix = local_transform(selection); - if (m_hover_id != -1) { - render_scale(); - render_snap_radii(); - render_reference_radius(); - } +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_core_profile()) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); - glsafe(::glColor4fv(m_highlight_color.data())); +#if ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else + GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE + if (shader != nullptr) { + shader->start_using(); - if (m_hover_id != -1) - render_angle(); + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d view_model_matrix = camera.get_view_matrix() * m_grabbers.front().matrix; + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.25f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE + + const bool radius_changed = std::abs(m_old_radius - m_radius) > EPSILON; + m_old_radius = m_radius; + + const ColorRGBA color = (m_hover_id != -1) ? m_drag_color : m_highlight_color; + render_circle(color, radius_changed); + if (m_hover_id != -1) { + const bool hover_radius_changed = std::abs(m_old_hover_radius - m_radius) > EPSILON; + m_old_hover_radius = m_radius; + + render_scale(color, hover_radius_changed); + render_snap_radii(color, hover_radius_changed); + render_reference_radius(color, hover_radius_changed); + render_angle_arc(m_highlight_color, hover_radius_changed); + } - render_grabber(box); - render_grabber_extension(box, false); + render_grabber_connection(color, radius_changed); + shader->stop_using(); + } - glsafe(::glPopMatrix()); + render_grabber(m_bounding_box); } -void GLGizmoRotate::on_render_for_picking() +void GLGizmoRotate::init_data_from_selection(const Selection& selection) { - const Selection& selection = m_parent.get_selection(); - - glsafe(::glDisable(GL_DEPTH_TEST)); - - glsafe(::glPushMatrix()); - - transform_to_local(selection); - - const BoundingBoxf3& box = selection.get_bounding_box(); - render_grabbers_for_picking(box); - render_grabber_extension(box, true); + const auto [box, box_trafo] = m_force_local_coordinate ? + selection.get_bounding_box_in_reference_system(ECoordinatesType::Local) : selection.get_bounding_box_in_current_reference_system(); + m_bounding_box = box; + m_center = box_trafo.translation(); + m_orient_matrix = box_trafo; - glsafe(::glPopMatrix()); + m_radius = Offset + m_bounding_box.radius(); + m_snap_coarse_in_radius = m_radius / 3.0f; + m_snap_coarse_out_radius = 2.0f * m_snap_coarse_in_radius; + m_snap_fine_in_radius = m_radius; + m_snap_fine_out_radius = m_snap_fine_in_radius + m_radius * ScaleLongTooth; } void GLGizmoRotate3D::on_render_input_window(float x, float y, float bottom_limit) @@ -216,188 +240,223 @@ void GLGizmoRotate3D::load_rotoptimize_state() } } -void GLGizmoRotate::render_circle() const +void GLGizmoRotate::render_circle(const ColorRGBA& color, bool radius_changed) { - ::glBegin(GL_LINE_LOOP); - for (unsigned int i = 0; i < ScaleStepsCount; ++i) - { - float angle = (float)i * ScaleStepRad; - float x = ::cos(angle) * m_radius; - float y = ::sin(angle) * m_radius; - float z = 0.0f; - ::glVertex3f((GLfloat)x, (GLfloat)y, (GLfloat)z); + if (!m_circle.is_initialized() || radius_changed) { + m_circle.reset(); + + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::LineLoop, GLModel::Geometry::EVertexLayout::P3 }; + init_data.reserve_vertices(ScaleStepsCount); + init_data.reserve_indices(ScaleStepsCount); + + // vertices + indices + for (unsigned int i = 0; i < ScaleStepsCount; ++i) { + const float angle = float(i * ScaleStepRad); + init_data.add_vertex(Vec3f(::cos(angle) * m_radius, ::sin(angle) * m_radius, 0.0f)); + init_data.add_index(i); + } + + m_circle.init_from(std::move(init_data)); } - glsafe(::glEnd()); + + m_circle.set_color(color); + m_circle.render(); } -void GLGizmoRotate::render_scale() const +void GLGizmoRotate::render_scale(const ColorRGBA& color, bool radius_changed) { - float out_radius_long = m_snap_fine_out_radius; - float out_radius_short = m_radius * (1.0f + 0.5f * ScaleLongTooth); + const float out_radius_long = m_snap_fine_out_radius; + const float out_radius_short = m_radius * (1.0f + 0.5f * ScaleLongTooth); + + if (!m_scale.is_initialized() || radius_changed) { + m_scale.reset(); + + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; + init_data.reserve_vertices(2 * ScaleStepsCount); + init_data.reserve_indices(2 * ScaleStepsCount); + + // vertices + indices + for (unsigned int i = 0; i < ScaleStepsCount; ++i) { + const float angle = float(i * ScaleStepRad); + const float cosa = ::cos(angle); + const float sina = ::sin(angle); + const float in_x = cosa * m_radius; + const float in_y = sina * m_radius; + const float out_x = (i % ScaleLongEvery == 0) ? cosa * out_radius_long : cosa * out_radius_short; + const float out_y = (i % ScaleLongEvery == 0) ? sina * out_radius_long : sina * out_radius_short; + + // vertices + init_data.add_vertex(Vec3f(in_x, in_y, 0.0f)); + init_data.add_vertex(Vec3f(out_x, out_y, 0.0f)); + + // indices + init_data.add_line(i * 2, i * 2 + 1); + } - ::glBegin(GL_LINES); - for (unsigned int i = 0; i < ScaleStepsCount; ++i) - { - float angle = (float)i * ScaleStepRad; - float cosa = ::cos(angle); - float sina = ::sin(angle); - float in_x = cosa * m_radius; - float in_y = sina * m_radius; - float in_z = 0.0f; - float out_x = (i % ScaleLongEvery == 0) ? cosa * out_radius_long : cosa * out_radius_short; - float out_y = (i % ScaleLongEvery == 0) ? sina * out_radius_long : sina * out_radius_short; - float out_z = 0.0f; - ::glVertex3f((GLfloat)in_x, (GLfloat)in_y, (GLfloat)in_z); - ::glVertex3f((GLfloat)out_x, (GLfloat)out_y, (GLfloat)out_z); + m_scale.init_from(std::move(init_data)); } - glsafe(::glEnd()); + + m_scale.set_color(color); + m_scale.render(); } -void GLGizmoRotate::render_snap_radii() const +void GLGizmoRotate::render_snap_radii(const ColorRGBA& color, bool radius_changed) { - float step = 2.0f * (float)PI / (float)SnapRegionsCount; - - float in_radius = m_radius / 3.0f; - float out_radius = 2.0f * in_radius; + const float step = 2.0f * float(PI) / float(SnapRegionsCount); + const float in_radius = m_radius / 3.0f; + const float out_radius = 2.0f * in_radius; + + if (!m_snap_radii.is_initialized() || radius_changed) { + m_snap_radii.reset(); + + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; + init_data.reserve_vertices(2 * ScaleStepsCount); + init_data.reserve_indices(2 * ScaleStepsCount); + + // vertices + indices + for (unsigned int i = 0; i < ScaleStepsCount; ++i) { + const float angle = float(i * step); + const float cosa = ::cos(angle); + const float sina = ::sin(angle); + const float in_x = cosa * in_radius; + const float in_y = sina * in_radius; + const float out_x = cosa * out_radius; + const float out_y = sina * out_radius; + + // vertices + init_data.add_vertex(Vec3f(in_x, in_y, 0.0f)); + init_data.add_vertex(Vec3f(out_x, out_y, 0.0f)); + + // indices + init_data.add_line(i * 2, i * 2 + 1); + } - ::glBegin(GL_LINES); - for (unsigned int i = 0; i < SnapRegionsCount; ++i) - { - float angle = (float)i * step; - float cosa = ::cos(angle); - float sina = ::sin(angle); - float in_x = cosa * in_radius; - float in_y = sina * in_radius; - float in_z = 0.0f; - float out_x = cosa * out_radius; - float out_y = sina * out_radius; - float out_z = 0.0f; - ::glVertex3f((GLfloat)in_x, (GLfloat)in_y, (GLfloat)in_z); - ::glVertex3f((GLfloat)out_x, (GLfloat)out_y, (GLfloat)out_z); + m_snap_radii.init_from(std::move(init_data)); } - glsafe(::glEnd()); -} -void GLGizmoRotate::render_reference_radius() const -{ - ::glBegin(GL_LINES); - ::glVertex3f(0.0f, 0.0f, 0.0f); - ::glVertex3f((GLfloat)(m_radius * (1.0f + GrabberOffset)), 0.0f, 0.0f); - glsafe(::glEnd()); + m_snap_radii.set_color(color); + m_snap_radii.render(); } -void GLGizmoRotate::render_angle() const +void GLGizmoRotate::render_reference_radius(const ColorRGBA& color, bool radius_changed) { - float step_angle = (float)m_angle / AngleResolution; - float ex_radius = m_radius * (1.0f + GrabberOffset); + if (!m_reference_radius.is_initialized() || radius_changed) { + m_reference_radius.reset(); - ::glBegin(GL_LINE_STRIP); - for (unsigned int i = 0; i <= AngleResolution; ++i) - { - float angle = (float)i * step_angle; - float x = ::cos(angle) * ex_radius; - float y = ::sin(angle) * ex_radius; - float z = 0.0f; - ::glVertex3f((GLfloat)x, (GLfloat)y, (GLfloat)z); + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; + init_data.reserve_vertices(2); + init_data.reserve_indices(2); + + // vertices + init_data.add_vertex(Vec3f(0.0f, 0.0f, 0.0f)); + init_data.add_vertex(Vec3f(m_radius * (1.0f + GrabberOffset), 0.0f, 0.0f)); + + // indices + init_data.add_line(0, 1); + + m_reference_radius.init_from(std::move(init_data)); } - glsafe(::glEnd()); + + m_reference_radius.set_color(color); + m_reference_radius.render(); } -void GLGizmoRotate::render_grabber(const BoundingBoxf3& box) const +void GLGizmoRotate::render_angle_arc(const ColorRGBA& color, bool radius_changed) { - double grabber_radius = (double)m_radius * (1.0 + (double)GrabberOffset); - m_grabbers[0].center = Vec3d(::cos(m_angle) * grabber_radius, ::sin(m_angle) * grabber_radius, 0.0); - m_grabbers[0].angles(2) = m_angle; - - glsafe(::glColor4fv((m_hover_id != -1) ? m_drag_color.data() : m_highlight_color.data())); + const float step_angle = float(m_angle) / float(AngleResolution); + const float ex_radius = m_radius * (1.0f + GrabberOffset); + + const bool angle_changed = std::abs(m_old_angle - m_angle) > EPSILON; + m_old_angle = m_angle; + + if (!m_angle_arc.is_initialized() || radius_changed || angle_changed) { + m_angle_arc.reset(); + if (m_angle > 0.0f) { + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::LineStrip, GLModel::Geometry::EVertexLayout::P3 }; + init_data.reserve_vertices(1 + AngleResolution); + init_data.reserve_indices(1 + AngleResolution); + + // vertices + indices + for (unsigned int i = 0; i <= AngleResolution; ++i) { + const float angle = float(i) * step_angle; + init_data.add_vertex(Vec3f(::cos(angle) * ex_radius, ::sin(angle) * ex_radius, 0.0f)); + init_data.add_index(i); + } - ::glBegin(GL_LINES); - ::glVertex3f(0.0f, 0.0f, 0.0f); - ::glVertex3dv(m_grabbers[0].center.data()); - glsafe(::glEnd()); + m_angle_arc.init_from(std::move(init_data)); + } + } - m_grabbers[0].color = m_highlight_color; - render_grabbers(box); + m_angle_arc.set_color(color); + m_angle_arc.render(); } -void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool picking) const +void GLGizmoRotate::render_grabber_connection(const ColorRGBA& color, bool radius_changed) { - float mean_size = (float)((box.size()(0) + box.size()(1) + box.size()(2)) / 3.0); - double size = m_dragging ? (double)m_grabbers[0].get_dragging_half_size(mean_size) : (double)m_grabbers[0].get_half_size(mean_size); + if (!m_grabber_connection.model.is_initialized() || radius_changed || !m_grabber_connection.old_center.isApprox(m_grabbers.front().center)) { + m_grabber_connection.model.reset(); + m_grabber_connection.old_center = m_grabbers.front().center; - std::array color = m_grabbers[0].color; - if (!picking && m_hover_id != -1) { - color[0] = 1.0f - color[0]; - color[1] = 1.0f - color[1]; - color[2] = 1.0f - color[2]; - } + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; + init_data.reserve_vertices(2); + init_data.reserve_indices(2); - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); - if (shader == nullptr) - return; + // vertices + init_data.add_vertex(Vec3f(0.0f, 0.0f, 0.0f)); + init_data.add_vertex((Vec3f)m_grabbers.front().center.cast()); - const_cast(&m_cone)->set_color(-1, color); - if (!picking) { - shader->start_using(); - shader->set_uniform("emission_factor", 0.1f); + // indices + init_data.add_line(0, 1); + + m_grabber_connection.model.init_from(std::move(init_data)); } - glsafe(::glPushMatrix()); - glsafe(::glTranslated(m_grabbers[0].center.x(), m_grabbers[0].center.y(), m_grabbers[0].center.z())); - glsafe(::glRotated(Geometry::rad2deg(m_angle), 0.0, 0.0, 1.0)); - glsafe(::glRotated(90.0, 1.0, 0.0, 0.0)); - glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); - glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); - m_cone.render(); - glsafe(::glPopMatrix()); - glsafe(::glPushMatrix()); - glsafe(::glTranslated(m_grabbers[0].center.x(), m_grabbers[0].center.y(), m_grabbers[0].center.z())); - glsafe(::glRotated(Geometry::rad2deg(m_angle), 0.0, 0.0, 1.0)); - glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0)); - glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); - glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); - m_cone.render(); - glsafe(::glPopMatrix()); - - if (! picking) - shader->stop_using(); + m_grabber_connection.model.set_color(color); + m_grabber_connection.model.render(); } -void GLGizmoRotate::transform_to_local(const Selection& selection) const +void GLGizmoRotate::render_grabber(const BoundingBoxf3& box) { - glsafe(::glTranslated(m_center(0), m_center(1), m_center(2))); + m_grabbers.front().color = m_highlight_color; + render_grabbers(box); +} - if (selection.is_single_volume() || selection.is_single_modifier() || selection.requires_local_axes()) { - Transform3d orient_matrix = selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(true, false, true, true); - glsafe(::glMultMatrixd(orient_matrix.data())); - } +Transform3d GLGizmoRotate::local_transform(const Selection& selection) const +{ + Transform3d ret; switch (m_axis) { case X: { - glsafe(::glRotatef(90.0f, 0.0f, 1.0f, 0.0f)); - glsafe(::glRotatef(-90.0f, 0.0f, 0.0f, 1.0f)); + ret = Geometry::rotation_transform(0.5 * PI * Vec3d::UnitY()) * Geometry::rotation_transform(-0.5 * PI * Vec3d::UnitZ()); break; } case Y: { - glsafe(::glRotatef(-90.0f, 0.0f, 0.0f, 1.0f)); - glsafe(::glRotatef(-90.0f, 0.0f, 1.0f, 0.0f)); + ret = Geometry::rotation_transform(-0.5 * PI * Vec3d::UnitZ()) * Geometry::rotation_transform(-0.5 * PI * Vec3d::UnitY()); break; } default: case Z: { - // no rotation + ret = Transform3d::Identity(); break; } } + + return m_orient_matrix * ret; } -Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray, const Selection& selection) const +Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray) const { - double half_pi = 0.5 * (double)PI; + const double half_pi = 0.5 * double(PI); Transform3d m = Transform3d::Identity(); @@ -423,38 +482,78 @@ Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray, cons } } - if (selection.is_single_volume() || selection.is_single_modifier() || selection.requires_local_axes()) - m = m * selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(true, false, true, true).inverse(); + m = m * Geometry::Transformation(m_orient_matrix).get_matrix_no_offset().inverse(); m.translate(-m_center); - return transform(mouse_ray, m).intersect_plane(0.0); + const Linef3 local_mouse_ray = transform(mouse_ray, m); + if (std::abs(local_mouse_ray.vector().dot(Vec3d::UnitZ())) < EPSILON) { + // if the ray is parallel to the plane containing the circle + if (std::abs(local_mouse_ray.vector().dot(Vec3d::UnitY())) > 1.0 - EPSILON) + // if the ray is parallel to grabber direction + return Vec3d::UnitX(); + else { + const Vec3d world_pos = (local_mouse_ray.a.x() >= 0.0) ? mouse_ray.a - m_center : mouse_ray.b - m_center; + m.translate(m_center); + return m * world_pos; + } + } + else + return local_mouse_ray.intersect_plane(0.0); } GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) : GLGizmoBase(parent, icon_filename, sprite_id) + , m_gizmos({ + GLGizmoRotate(parent, GLGizmoRotate::X), + GLGizmoRotate(parent, GLGizmoRotate::Y), + GLGizmoRotate(parent, GLGizmoRotate::Z) }) { - m_gizmos.emplace_back(parent, GLGizmoRotate::X); - m_gizmos.emplace_back(parent, GLGizmoRotate::Y); - m_gizmos.emplace_back(parent, GLGizmoRotate::Z); + load_rotoptimize_state(); +} - for (unsigned int i = 0; i < 3; ++i) { - m_gizmos[i].set_group_id(i); +bool GLGizmoRotate3D::on_mouse(const wxMouseEvent &mouse_event) +{ + if (mouse_event.Dragging() && m_dragging) { + // Apply new temporary rotations + TransformationType transformation_type; + if (m_parent.get_selection().is_wipe_tower()) + transformation_type = TransformationType::World_Relative_Joint; + else { + switch (wxGetApp().obj_manipul()->get_coordinates_type()) + { + default: + case ECoordinatesType::World: { transformation_type = TransformationType::World_Relative_Joint; break; } + case ECoordinatesType::Instance: { transformation_type = TransformationType::Instance_Relative_Joint; break; } + case ECoordinatesType::Local: { transformation_type = TransformationType::Local_Relative_Joint; break; } + } + } + if (mouse_event.AltDown()) + transformation_type.set_independent(); + m_parent.get_selection().rotate(get_rotation(), transformation_type); } + return use_grabbers(mouse_event); +} - load_rotoptimize_state(); +void GLGizmoRotate3D::data_changed() { + if (m_parent.get_selection().is_wipe_tower()) { + m_gizmos[0].disable_grabber(); + m_gizmos[1].disable_grabber(); + } + else { + m_gizmos[0].enable_grabber(); + m_gizmos[1].enable_grabber(); + } + set_rotation(Vec3d::Zero()); } bool GLGizmoRotate3D::on_init() { - for (GLGizmoRotate& g : m_gizmos) { - if (!g.init()) - return false; - } + for (GLGizmoRotate& g : m_gizmos) + if (!g.init()) return false; - for (unsigned int i = 0; i < 3; ++i) { + for (unsigned int i = 0; i < 3; ++i) m_gizmos[i].set_highlight_color(AXES_COLOR[i]); - } m_shortcut_key = WXK_CONTROL_R; @@ -468,19 +567,27 @@ std::string GLGizmoRotate3D::on_get_name() const bool GLGizmoRotate3D::on_is_activable() const { - return !m_parent.get_selection().is_empty(); + const Selection& selection = m_parent.get_selection(); + return !selection.is_any_cut_volume() && !selection.is_any_connector() && !selection.is_empty(); } void GLGizmoRotate3D::on_start_dragging() { - if ((0 <= m_hover_id) && (m_hover_id < 3)) - m_gizmos[m_hover_id].start_dragging(); + assert(0 <= m_hover_id && m_hover_id < 3); + m_gizmos[m_hover_id].start_dragging(); } void GLGizmoRotate3D::on_stop_dragging() { - if ((0 <= m_hover_id) && (m_hover_id < 3)) - m_gizmos[m_hover_id].stop_dragging(); + assert(0 <= m_hover_id && m_hover_id < 3); + m_parent.do_rotate(L("Gizmo-Rotate")); + m_gizmos[m_hover_id].stop_dragging(); +} + +void GLGizmoRotate3D::on_dragging(const UpdateData &data) +{ + assert(0 <= m_hover_id && m_hover_id < 3); + m_gizmos[m_hover_id].dragging(data); } void GLGizmoRotate3D::on_render() @@ -497,6 +604,23 @@ void GLGizmoRotate3D::on_render() m_gizmos[Z].render(); } +void GLGizmoRotate3D::on_register_raycasters_for_picking() +{ + // the gizmo grabbers are rendered on top of the scene, so the raytraced picker should take it into account + m_parent.set_raycaster_gizmos_on_top(true); + for (GLGizmoRotate& g : m_gizmos) { + g.register_raycasters_for_picking(); + } +} + +void GLGizmoRotate3D::on_unregister_raycasters_for_picking() +{ + for (GLGizmoRotate& g : m_gizmos) { + g.unregister_raycasters_for_picking(); + } + m_parent.set_raycaster_gizmos_on_top(false); +} + GLGizmoRotate3D::RotoptimzeWindow::RotoptimzeWindow(ImGuiWrapper * imgui, State & state, const Alignment &alignment) @@ -554,11 +678,12 @@ GLGizmoRotate3D::RotoptimzeWindow::RotoptimzeWindow(ImGuiWrapper * imgui, ImVec2 button_sz = {btn_txt_sz.x + padding.x, btn_txt_sz.y + padding.y}; ImGui::SetCursorPosX(padding.x + sz.x - button_sz.x); - if (wxGetApp().plater()->is_any_job_running()) + if (!wxGetApp().plater()->get_ui_job_worker().is_idle()) imgui->disabled_begin(true); if ( imgui->button(btn_txt) ) { - wxGetApp().plater()->optimize_rotation(); + replace_job(wxGetApp().plater()->get_ui_job_worker(), + std::make_unique()); } imgui->disabled_end(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp index 3245c4dbe87..a1bb2ee4454 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp @@ -2,16 +2,14 @@ #define slic3r_GLGizmoRotate_hpp_ #include "GLGizmoBase.hpp" -#include "../Jobs/RotoptimizeJob.hpp" - namespace Slic3r { namespace GUI { +class Selection; class GLGizmoRotate : public GLGizmoBase { static const float Offset; - static const unsigned int CircleResolution; static const unsigned int AngleResolution; static const unsigned int ScaleStepsCount; static const float ScaleStepRad; @@ -23,26 +21,46 @@ class GLGizmoRotate : public GLGizmoBase public: enum Axis : unsigned char { - X, - Y, - Z + X=0, + Y=1, + Z=2 }; private: Axis m_axis; - double m_angle; + double m_angle{ 0.0 }; + Vec3d m_center{ Vec3d::Zero() }; + float m_radius{ 0.0f }; + float m_snap_coarse_in_radius{ 0.0f }; + float m_snap_coarse_out_radius{ 0.0f }; + float m_snap_fine_in_radius{ 0.0f }; + float m_snap_fine_out_radius{ 0.0f }; + BoundingBoxf3 m_bounding_box; + Transform3d m_orient_matrix{ Transform3d::Identity() }; + + GLModel m_circle; + GLModel m_scale; + GLModel m_snap_radii; + GLModel m_reference_radius; + GLModel m_angle_arc; + struct GrabberConnection + { + GLModel model; + Vec3d old_center{ Vec3d::Zero() }; + }; + GrabberConnection m_grabber_connection; + float m_old_radius{ 0.0f }; + float m_old_hover_radius{ 0.0f }; + float m_old_angle{ 0.0f }; - mutable Vec3d m_center; - mutable float m_radius; + // emboss need to draw rotation gizmo in local coordinate systems + bool m_force_local_coordinate{ false }; - mutable float m_snap_coarse_in_radius; - mutable float m_snap_coarse_out_radius; - mutable float m_snap_fine_in_radius; - mutable float m_snap_fine_out_radius; + ColorRGBA m_drag_color; + ColorRGBA m_highlight_color; public: GLGizmoRotate(GLCanvas3D& parent, Axis axis); - GLGizmoRotate(const GLGizmoRotate& other); virtual ~GLGizmoRotate() = default; double get_angle() const { return m_angle; } @@ -50,40 +68,61 @@ class GLGizmoRotate : public GLGizmoBase std::string get_tooltip() const override; + void set_group_id(int group_id) { m_group_id = group_id; } + void set_force_local_coordinate(bool use) { m_force_local_coordinate = use; } + + void start_dragging(); + void stop_dragging(); + + void enable_grabber(); + void disable_grabber(); + + void set_highlight_color(const ColorRGBA &color); + + /// + /// Postpone to Grabber for move + /// Detect move of object by dragging + /// + /// Keep information about mouse click + /// Return True when use the information otherwise False. + bool on_mouse(const wxMouseEvent &mouse_event) override; + void dragging(const UpdateData &data); + protected: bool on_init() override; std::string on_get_name() const override { return ""; } void on_start_dragging() override; - void on_update(const UpdateData& data) override; + void on_dragging(const UpdateData &data) override; void on_render() override; - void on_render_for_picking() override; private: - void render_circle() const; - void render_scale() const; - void render_snap_radii() const; - void render_reference_radius() const; - void render_angle() const; - void render_grabber(const BoundingBoxf3& box) const; - void render_grabber_extension(const BoundingBoxf3& box, bool picking) const; - - void transform_to_local(const Selection& selection) const; + void render_circle(const ColorRGBA& color, bool radius_changed); + void render_scale(const ColorRGBA& color, bool radius_changed); + void render_snap_radii(const ColorRGBA& color, bool radius_changed); + void render_reference_radius(const ColorRGBA& color, bool radius_changed); + void render_angle_arc(const ColorRGBA& color, bool radius_changed); + void render_grabber_connection(const ColorRGBA& color, bool radius_changed); + void render_grabber(const BoundingBoxf3& box); + + Transform3d local_transform(const Selection& selection) const; + // returns the intersection of the mouse ray with the plane perpendicular to the gizmo axis, in local coordinate - Vec3d mouse_position_in_local_plane(const Linef3& mouse_ray, const Selection& selection) const; + Vec3d mouse_position_in_local_plane(const Linef3& mouse_ray) const; + + void init_data_from_selection(const Selection& selection); }; class GLGizmoRotate3D : public GLGizmoBase { - std::vector m_gizmos; + std::array m_gizmos; public: GLGizmoRotate3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); Vec3d get_rotation() const { return Vec3d(m_gizmos[X].get_angle(), m_gizmos[Y].get_angle(), m_gizmos[Z].get_angle()); } - void set_rotation(const Vec3d& rotation) { m_gizmos[X].set_angle(rotation(0)); m_gizmos[Y].set_angle(rotation(1)); m_gizmos[Z].set_angle(rotation(2)); } + void set_rotation(const Vec3d& rotation) { m_gizmos[X].set_angle(rotation.x()); m_gizmos[Y].set_angle(rotation.y()); m_gizmos[Z].set_angle(rotation.z()); } - std::string get_tooltip() const override - { + std::string get_tooltip() const override { std::string tooltip = m_gizmos[X].get_tooltip(); if (tooltip.empty()) tooltip = m_gizmos[Y].get_tooltip(); @@ -92,54 +131,51 @@ class GLGizmoRotate3D : public GLGizmoBase return tooltip; } + /// + /// Postpone to Rotation + /// + /// Keep information about mouse click + /// Return True when use the information otherwise False. + bool on_mouse(const wxMouseEvent &mouse_event) override; + + void data_changed() override; protected: bool on_init() override; std::string on_get_name() const override; - void on_set_state() override - { + void on_set_state() override { for (GLGizmoRotate& g : m_gizmos) g.set_state(m_state); } - void on_set_hover_id() override - { + void on_set_hover_id() override { for (int i = 0; i < 3; ++i) m_gizmos[i].set_hover_id((m_hover_id == i) ? 0 : -1); } - void on_enable_grabber(unsigned int id) override - { + void on_enable_grabber(unsigned int id) override { if (id < 3) - m_gizmos[id].enable_grabber(0); + m_gizmos[id].enable_grabber(); } - void on_disable_grabber(unsigned int id) override - { + void on_disable_grabber(unsigned int id) override { if (id < 3) - m_gizmos[id].disable_grabber(0); + m_gizmos[id].disable_grabber(); } bool on_is_activable() const override; void on_start_dragging() override; void on_stop_dragging() override; - void on_update(const UpdateData& data) override - { - for (GLGizmoRotate& g : m_gizmos) { - g.update(data); - } - } + void on_dragging(const UpdateData &data) override; + void on_render() override; - void on_render_for_picking() override - { - for (GLGizmoRotate& g : m_gizmos) { - g.render_for_picking(); - } - } + virtual void on_register_raycasters_for_picking() override; + virtual void on_unregister_raycasters_for_picking() override; void on_render_input_window(float x, float y, float bottom_limit) override; private: - class RotoptimzeWindow { + class RotoptimzeWindow + { ImGuiWrapper *m_imgui = nullptr; - public: + public: struct State { float accuracy = 1.f; int method_id = 0; @@ -167,4 +203,4 @@ class GLGizmoRotate3D : public GLGizmoBase } // namespace GUI } // namespace Slic3r -#endif // slic3r_GLGizmoRotate_hpp_ +#endif // slic3r_GLGizmoRotate_hpp_ \ No newline at end of file diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp index b97507166b2..5e6ab1ae681 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -1,76 +1,116 @@ -// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro. #include "GLGizmoScale.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/GUI_ObjectManipulation.hpp" +#include "slic3r/GUI/Plater.hpp" +#include "libslic3r/Model.hpp" #include -#include +#include namespace Slic3r { namespace GUI { -const float GLGizmoScale3D::Offset = 5.0f; +const double GLGizmoScale3D::Offset = 5.0; GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) : GLGizmoBase(parent, icon_filename, sprite_id) , m_scale(Vec3d::Ones()) - , m_offset(Vec3d::Zero()) , m_snap_step(0.05) + , m_base_color(DEFAULT_BASE_COLOR) + , m_drag_color(DEFAULT_DRAG_COLOR) + , m_highlight_color(DEFAULT_HIGHLIGHT_COLOR) { + m_grabber_connections[0].grabber_indices = { 0, 1 }; + m_grabber_connections[1].grabber_indices = { 2, 3 }; + m_grabber_connections[2].grabber_indices = { 4, 5 }; + m_grabber_connections[3].grabber_indices = { 6, 7 }; + m_grabber_connections[4].grabber_indices = { 7, 8 }; + m_grabber_connections[5].grabber_indices = { 8, 9 }; + m_grabber_connections[6].grabber_indices = { 9, 6 }; } std::string GLGizmoScale3D::get_tooltip() const { - const Selection& selection = m_parent.get_selection(); - - bool single_instance = selection.is_single_full_instance(); - bool single_volume = selection.is_single_modifier() || selection.is_single_volume(); - - Vec3f scale = 100.0f * Vec3f::Ones(); - if (single_instance) - scale = 100.0f * selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_scaling_factor().cast(); - else if (single_volume) - scale = 100.0f * selection.get_volume(*selection.get_volume_idxs().begin())->get_volume_scaling_factor().cast(); + const Vec3d scale = 100.0 * m_scale; if (m_hover_id == 0 || m_hover_id == 1 || m_grabbers[0].dragging || m_grabbers[1].dragging) - return "X: " + format(scale(0), 4) + "%"; + return "X: " + format(scale.x(), 4) + "%"; else if (m_hover_id == 2 || m_hover_id == 3 || m_grabbers[2].dragging || m_grabbers[3].dragging) - return "Y: " + format(scale(1), 4) + "%"; + return "Y: " + format(scale.y(), 4) + "%"; else if (m_hover_id == 4 || m_hover_id == 5 || m_grabbers[4].dragging || m_grabbers[5].dragging) - return "Z: " + format(scale(2), 4) + "%"; + return "Z: " + format(scale.z(), 4) + "%"; else if (m_hover_id == 6 || m_hover_id == 7 || m_hover_id == 8 || m_hover_id == 9 || m_grabbers[6].dragging || m_grabbers[7].dragging || m_grabbers[8].dragging || m_grabbers[9].dragging) { - std::string tooltip = "X: " + format(scale(0), 4) + "%\n"; - tooltip += "Y: " + format(scale(1), 4) + "%\n"; - tooltip += "Z: " + format(scale(2), 4) + "%"; + std::string tooltip = "X: " + format(scale.x(), 4) + "%\n"; + tooltip += "Y: " + format(scale.y(), 4) + "%\n"; + tooltip += "Z: " + format(scale.z(), 4) + "%"; return tooltip; } else return ""; } -bool GLGizmoScale3D::on_init() +static int constraint_id(int grabber_id) { - for (int i = 0; i < 10; ++i) - { - m_grabbers.push_back(Grabber()); + static const std::vector id_map = { 1, 0, 3, 2, 5, 4, 8, 9, 6, 7 }; + return (0 <= grabber_id && grabber_id < (int)id_map.size()) ? id_map[grabber_id] : -1; +} + +bool GLGizmoScale3D::on_mouse(const wxMouseEvent &mouse_event) +{ + if (mouse_event.Dragging()) { + if (m_dragging) { + // Apply new temporary scale factors + TransformationType transformation_type; + if (wxGetApp().obj_manipul()->is_local_coordinates()) + transformation_type.set_local(); + else if (wxGetApp().obj_manipul()->is_instance_coordinates()) + transformation_type.set_instance(); + + transformation_type.set_relative(); + + if (mouse_event.AltDown()) + transformation_type.set_independent(); + + Selection& selection = m_parent.get_selection(); + selection.scale(m_scale, transformation_type); + if (m_starting.ctrl_down) { + // constrained scale: + // uses the performed scale to calculate the new position of the constrained grabber + // and from that calculates the offset (in world coordinates) to be applied to fullfill the constraint + update_render_data(); + const Vec3d constraint_position = m_grabbers_transform * m_grabbers[constraint_id(m_hover_id)].center; + // re-apply the scale because the selection always applies the transformations with respect to the initial state + // set into on_start_dragging() with the call to selection.setup_cache() + m_parent.get_selection().scale_and_translate(m_scale, m_starting.constraint_position - constraint_position, transformation_type); + } + } } + return use_grabbers(mouse_event); +} - double half_pi = 0.5 * (double)PI; +void GLGizmoScale3D::enable_ununiversal_scale(bool enable) +{ + for (unsigned int i = 0; i < 6; ++i) + m_grabbers[i].enabled = enable; +} - // x axis - m_grabbers[0].angles(1) = half_pi; - m_grabbers[1].angles(1) = half_pi; +void GLGizmoScale3D::data_changed() +{ + set_scale(Vec3d::Ones()); +} - // y axis - m_grabbers[2].angles(0) = half_pi; - m_grabbers[3].angles(0) = half_pi; +bool GLGizmoScale3D::on_init() +{ + for (int i = 0; i < 10; ++i) { + m_grabbers.push_back(Grabber()); + } m_shortcut_key = WXK_CONTROL_S; - return true; } @@ -82,34 +122,33 @@ std::string GLGizmoScale3D::on_get_name() const bool GLGizmoScale3D::on_is_activable() const { const Selection& selection = m_parent.get_selection(); - return !selection.is_empty() && !selection.is_wipe_tower(); + return !selection.is_any_cut_volume() && !selection.is_any_connector() && !selection.is_empty() && !selection.is_wipe_tower(); } void GLGizmoScale3D::on_start_dragging() { - if (m_hover_id != -1) - { - m_starting.drag_position = m_grabbers[m_hover_id].center; - m_starting.ctrl_down = wxGetKeyState(WXK_CONTROL); - m_starting.box = (m_starting.ctrl_down && (m_hover_id < 6)) ? m_box : m_parent.get_selection().get_bounding_box(); - - const Vec3d& center = m_starting.box.center(); - m_starting.pivots[0] = m_transform * Vec3d(m_starting.box.max(0), center(1), center(2)); - m_starting.pivots[1] = m_transform * Vec3d(m_starting.box.min(0), center(1), center(2)); - m_starting.pivots[2] = m_transform * Vec3d(center(0), m_starting.box.max(1), center(2)); - m_starting.pivots[3] = m_transform * Vec3d(center(0), m_starting.box.min(1), center(2)); - m_starting.pivots[4] = m_transform * Vec3d(center(0), center(1), m_starting.box.max(2)); - m_starting.pivots[5] = m_transform * Vec3d(center(0), center(1), m_starting.box.min(2)); - } + assert(m_hover_id != -1); + m_starting.ctrl_down = wxGetKeyState(WXK_CONTROL); + m_starting.drag_position = m_grabbers_transform * m_grabbers[m_hover_id].center; + m_starting.box = m_bounding_box; + m_starting.center = m_center; + m_starting.instance_center = m_instance_center; + m_starting.constraint_position = m_grabbers_transform * m_grabbers[constraint_id(m_hover_id)].center; } -void GLGizmoScale3D::on_update(const UpdateData& data) +void GLGizmoScale3D::on_stop_dragging() { - if ((m_hover_id == 0) || (m_hover_id == 1)) + m_parent.do_scale(L("Gizmo-Scale")); + m_starting.ctrl_down = false; +} + +void GLGizmoScale3D::on_dragging(const UpdateData& data) +{ + if (m_hover_id == 0 || m_hover_id == 1) do_scale_along_axis(X, data); - else if ((m_hover_id == 2) || (m_hover_id == 3)) + else if (m_hover_id == 2 || m_hover_id == 3) do_scale_along_axis(Y, data); - else if ((m_hover_id == 4) || (m_hover_id == 5)) + else if (m_hover_id == 4 || m_hover_id == 5) do_scale_along_axis(Z, data); else if (m_hover_id >= 6) do_scale_uniform(data); @@ -117,260 +156,268 @@ void GLGizmoScale3D::on_update(const UpdateData& data) void GLGizmoScale3D::on_render() { - const Selection& selection = m_parent.get_selection(); - - bool single_instance = selection.is_single_full_instance(); - bool single_volume = selection.is_single_modifier() || selection.is_single_volume(); - glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); glsafe(::glEnable(GL_DEPTH_TEST)); - m_box.reset(); - m_transform = Transform3d::Identity(); - // Transforms grabbers' offsets to world refefence system - Transform3d offsets_transform = Transform3d::Identity(); - m_offsets_transform = Transform3d::Identity(); - Vec3d angles = Vec3d::Zero(); - - if (single_instance) { - // calculate bounding box in instance local reference system - const Selection::IndicesList& idxs = selection.get_volume_idxs(); - for (unsigned int idx : idxs) { - const GLVolume* vol = selection.get_volume(idx); - m_box.merge(vol->bounding_box().transformed(vol->get_volume_transformation().get_matrix())); - } - - // gets transform from first selected volume - const GLVolume* v = selection.get_volume(*idxs.begin()); - m_transform = v->get_instance_transformation().get_matrix(); - // gets angles from first selected volume - angles = v->get_instance_rotation(); - // consider rotation+mirror only components of the transform for offsets - offsets_transform = Geometry::assemble_transform(Vec3d::Zero(), angles, Vec3d::Ones(), v->get_instance_mirror()); - m_offsets_transform = offsets_transform; - } - else if (single_volume) { - const GLVolume* v = selection.get_volume(*selection.get_volume_idxs().begin()); - m_box = v->bounding_box(); - m_transform = v->world_matrix(); - angles = Geometry::extract_euler_angles(m_transform); - // consider rotation+mirror only components of the transform for offsets - offsets_transform = Geometry::assemble_transform(Vec3d::Zero(), angles, Vec3d::Ones(), v->get_instance_mirror()); - m_offsets_transform = Geometry::assemble_transform(Vec3d::Zero(), v->get_volume_rotation(), Vec3d::Ones(), v->get_volume_mirror()); - } - else - m_box = selection.get_bounding_box(); - - const Vec3d& center = m_box.center(); - Vec3d offset_x = offsets_transform * Vec3d((double)Offset, 0.0, 0.0); - Vec3d offset_y = offsets_transform * Vec3d(0.0, (double)Offset, 0.0); - Vec3d offset_z = offsets_transform * Vec3d(0.0, 0.0, (double)Offset); - - bool ctrl_down = (m_dragging && m_starting.ctrl_down) || (!m_dragging && wxGetKeyState(WXK_CONTROL)); - - // x axis - m_grabbers[0].center = m_transform * Vec3d(m_box.min(0), center(1), center(2)) - offset_x; - m_grabbers[0].color = (ctrl_down && (m_hover_id == 1)) ? CONSTRAINED_COLOR : AXES_COLOR[0]; - m_grabbers[1].center = m_transform * Vec3d(m_box.max(0), center(1), center(2)) + offset_x; - m_grabbers[1].color = (ctrl_down && (m_hover_id == 0)) ? CONSTRAINED_COLOR : AXES_COLOR[0]; - - // y axis - m_grabbers[2].center = m_transform * Vec3d(center(0), m_box.min(1), center(2)) - offset_y; - m_grabbers[2].color = (ctrl_down && (m_hover_id == 3)) ? CONSTRAINED_COLOR : AXES_COLOR[1]; - m_grabbers[3].center = m_transform * Vec3d(center(0), m_box.max(1), center(2)) + offset_y; - m_grabbers[3].color = (ctrl_down && (m_hover_id == 2)) ? CONSTRAINED_COLOR : AXES_COLOR[1]; - - // z axis - m_grabbers[4].center = m_transform * Vec3d(center(0), center(1), m_box.min(2)) - offset_z; - m_grabbers[4].color = (ctrl_down && (m_hover_id == 5)) ? CONSTRAINED_COLOR : AXES_COLOR[2]; - m_grabbers[5].center = m_transform * Vec3d(center(0), center(1), m_box.max(2)) + offset_z; - m_grabbers[5].color = (ctrl_down && (m_hover_id == 4)) ? CONSTRAINED_COLOR : AXES_COLOR[2]; - - // uniform - m_grabbers[6].center = m_transform * Vec3d(m_box.min(0), m_box.min(1), center(2)) - offset_x - offset_y; - m_grabbers[7].center = m_transform * Vec3d(m_box.max(0), m_box.min(1), center(2)) + offset_x - offset_y; - m_grabbers[8].center = m_transform * Vec3d(m_box.max(0), m_box.max(1), center(2)) + offset_x + offset_y; - m_grabbers[9].center = m_transform * Vec3d(m_box.min(0), m_box.max(1), center(2)) - offset_x + offset_y; - for (int i = 6; i < 10; ++i) { - m_grabbers[i].color = m_highlight_color; - } - - // sets grabbers orientation - for (int i = 0; i < 10; ++i) { - m_grabbers[i].angles = angles; - } - - glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); + update_render_data(); - const BoundingBoxf3& selection_box = selection.get_bounding_box(); +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_core_profile()) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); - float grabber_mean_size = (float)((selection_box.size()(0) + selection_box.size()(1) + selection_box.size()(2)) / 3.0); + const float grabber_mean_size = (float)((m_bounding_box.size().x() + m_bounding_box.size().y() + m_bounding_box.size().z()) / 3.0); if (m_hover_id == -1) { // draw connections - if (m_grabbers[0].enabled && m_grabbers[1].enabled) { - glsafe(::glColor4fv(m_grabbers[0].color.data())); - render_grabbers_connection(0, 1); - } - if (m_grabbers[2].enabled && m_grabbers[3].enabled) { - glsafe(::glColor4fv(m_grabbers[2].color.data())); - render_grabbers_connection(2, 3); - } - if (m_grabbers[4].enabled && m_grabbers[5].enabled) { - glsafe(::glColor4fv(m_grabbers[4].color.data())); - render_grabbers_connection(4, 5); +#if ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else + GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE + if (shader != nullptr) { + shader->start_using(); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix() * m_grabbers_transform); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.25f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE + if (m_grabbers[0].enabled && m_grabbers[1].enabled) + render_grabbers_connection(0, 1, m_grabbers[0].color); + if (m_grabbers[2].enabled && m_grabbers[3].enabled) + render_grabbers_connection(2, 3, m_grabbers[2].color); + if (m_grabbers[4].enabled && m_grabbers[5].enabled) + render_grabbers_connection(4, 5, m_grabbers[4].color); + render_grabbers_connection(6, 7, m_base_color); + render_grabbers_connection(7, 8, m_base_color); + render_grabbers_connection(8, 9, m_base_color); + render_grabbers_connection(9, 6, m_base_color); + shader->stop_using(); } - glsafe(::glColor4fv(m_base_color.data())); - render_grabbers_connection(6, 7); - render_grabbers_connection(7, 8); - render_grabbers_connection(8, 9); - render_grabbers_connection(9, 6); + // draw grabbers render_grabbers(grabber_mean_size); } - else if (m_hover_id == 0 || m_hover_id == 1) { - // draw connection - glsafe(::glColor4fv(m_grabbers[0].color.data())); - render_grabbers_connection(0, 1); + else if ((m_hover_id == 0 || m_hover_id == 1) && m_grabbers[0].enabled && m_grabbers[1].enabled) { + // draw connections +#if ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else + GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE + if (shader != nullptr) { + shader->start_using(); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix() * m_grabbers_transform); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.25f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE + render_grabbers_connection(0, 1, m_grabbers[0].color); + shader->stop_using(); + } - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); + // draw grabbers + shader = wxGetApp().get_shader("gouraud_light"); if (shader != nullptr) { shader->start_using(); shader->set_uniform("emission_factor", 0.1f); - // draw grabbers - m_grabbers[0].render(true, grabber_mean_size); - m_grabbers[1].render(true, grabber_mean_size); + render_grabbers(0, 1, grabber_mean_size, true); shader->stop_using(); } } - else if (m_hover_id == 2 || m_hover_id == 3) { - // draw connection - glsafe(::glColor4fv(m_grabbers[2].color.data())); - render_grabbers_connection(2, 3); + else if ((m_hover_id == 2 || m_hover_id == 3) && m_grabbers[2].enabled && m_grabbers[3].enabled) { + // draw connections +#if ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else + GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE + if (shader != nullptr) { + shader->start_using(); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix() * m_grabbers_transform); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.25f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE + render_grabbers_connection(2, 3, m_grabbers[2].color); + shader->stop_using(); + } - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); + // draw grabbers + shader = wxGetApp().get_shader("gouraud_light"); if (shader != nullptr) { shader->start_using(); shader->set_uniform("emission_factor", 0.1f); - // draw grabbers - m_grabbers[2].render(true, grabber_mean_size); - m_grabbers[3].render(true, grabber_mean_size); + render_grabbers(2, 3, grabber_mean_size, true); shader->stop_using(); } } - else if (m_hover_id == 4 || m_hover_id == 5) { - // draw connection - glsafe(::glColor4fv(m_grabbers[4].color.data())); - render_grabbers_connection(4, 5); + else if ((m_hover_id == 4 || m_hover_id == 5) && m_grabbers[4].enabled && m_grabbers[5].enabled) { + // draw connections +#if ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else + GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE + if (shader != nullptr) { + shader->start_using(); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix() * m_grabbers_transform); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.25f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE + render_grabbers_connection(4, 5, m_grabbers[4].color); + shader->stop_using(); + } - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); + // draw grabbers + shader = wxGetApp().get_shader("gouraud_light"); if (shader != nullptr) { shader->start_using(); shader->set_uniform("emission_factor", 0.1f); - // draw grabbers - m_grabbers[4].render(true, grabber_mean_size); - m_grabbers[5].render(true, grabber_mean_size); + render_grabbers(4, 5, grabber_mean_size, true); shader->stop_using(); } } else if (m_hover_id >= 6) { - // draw connection - glsafe(::glColor4fv(m_drag_color.data())); - render_grabbers_connection(6, 7); - render_grabbers_connection(7, 8); - render_grabbers_connection(8, 9); - render_grabbers_connection(9, 6); - - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); + // draw connections +#if ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else + GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE + if (shader != nullptr) { + shader->start_using(); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix() * m_grabbers_transform); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.25f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE + render_grabbers_connection(6, 7, m_drag_color); + render_grabbers_connection(7, 8, m_drag_color); + render_grabbers_connection(8, 9, m_drag_color); + render_grabbers_connection(9, 6, m_drag_color); + shader->stop_using(); + } + + // draw grabbers + shader = wxGetApp().get_shader("gouraud_light"); if (shader != nullptr) { shader->start_using(); shader->set_uniform("emission_factor", 0.1f); - // draw grabbers - for (int i = 6; i < 10; ++i) { - m_grabbers[i].render(true, grabber_mean_size); - } + render_grabbers(6, 9, grabber_mean_size, true); shader->stop_using(); } } } -void GLGizmoScale3D::on_render_for_picking() +void GLGizmoScale3D::on_register_raycasters_for_picking() { - glsafe(::glDisable(GL_DEPTH_TEST)); - render_grabbers_for_picking(m_parent.get_selection().get_bounding_box()); + // the gizmo grabbers are rendered on top of the scene, so the raytraced picker should take it into account + m_parent.set_raycaster_gizmos_on_top(true); } -void GLGizmoScale3D::render_grabbers_connection(unsigned int id_1, unsigned int id_2) const +void GLGizmoScale3D::on_unregister_raycasters_for_picking() { - unsigned int grabbers_count = (unsigned int)m_grabbers.size(); - if ((id_1 < grabbers_count) && (id_2 < grabbers_count)) - { - ::glBegin(GL_LINES); - ::glVertex3dv(m_grabbers[id_1].center.data()); - ::glVertex3dv(m_grabbers[id_2].center.data()); - glsafe(::glEnd()); + m_parent.set_raycaster_gizmos_on_top(false); +} + +void GLGizmoScale3D::render_grabbers_connection(unsigned int id_1, unsigned int id_2, const ColorRGBA& color) +{ + auto grabber_connection = [this](unsigned int id_1, unsigned int id_2) { + for (int i = 0; i < int(m_grabber_connections.size()); ++i) { + if (m_grabber_connections[i].grabber_indices.first == id_1 && m_grabber_connections[i].grabber_indices.second == id_2) + return i; + } + return -1; + }; + + const int id = grabber_connection(id_1, id_2); + if (id == -1) + return; + + if (!m_grabber_connections[id].model.is_initialized() || + !m_grabber_connections[id].old_v1.isApprox(m_grabbers[id_1].center) || + !m_grabber_connections[id].old_v2.isApprox(m_grabbers[id_2].center)) { + m_grabber_connections[id].old_v1 = m_grabbers[id_1].center; + m_grabber_connections[id].old_v2 = m_grabbers[id_2].center; + m_grabber_connections[id].model.reset(); + + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; + init_data.reserve_vertices(2); + init_data.reserve_indices(2); + + // vertices + init_data.add_vertex((Vec3f)m_grabbers[id_1].center.cast()); + init_data.add_vertex((Vec3f)m_grabbers[id_2].center.cast()); + + // indices + init_data.add_line(0, 1); + + m_grabber_connections[id].model.init_from(std::move(init_data)); } + + m_grabber_connections[id].model.set_color(color); + m_grabber_connections[id].model.render(); } void GLGizmoScale3D::do_scale_along_axis(Axis axis, const UpdateData& data) { double ratio = calc_ratio(data); - if (ratio > 0.0) - { - m_scale(axis) = m_starting.scale(axis) * ratio; - if (m_starting.ctrl_down) - { - double local_offset = 0.5 * (m_scale(axis) - m_starting.scale(axis)) * m_starting.box.size()(axis); - if (m_hover_id == 2 * axis) - local_offset *= -1.0; - - Vec3d local_offset_vec; - switch (axis) - { - case X: { local_offset_vec = local_offset * Vec3d::UnitX(); break; } - case Y: { local_offset_vec = local_offset * Vec3d::UnitY(); break; } - case Z: { local_offset_vec = local_offset * Vec3d::UnitZ(); break; } - default: break; - } - - m_offset = m_offsets_transform * local_offset_vec; - } - else - m_offset = Vec3d::Zero(); + if (ratio > 0.0) { + Vec3d curr_scale = m_scale; + curr_scale(axis) = m_starting.scale(axis) * ratio; + m_scale = curr_scale; } } -void GLGizmoScale3D::do_scale_uniform(const UpdateData& data) +void GLGizmoScale3D::do_scale_uniform(const UpdateData & data) { - double ratio = calc_ratio(data); + const double ratio = calc_ratio(data); if (ratio > 0.0) - { m_scale = m_starting.scale * ratio; - m_offset = Vec3d::Zero(); - } } double GLGizmoScale3D::calc_ratio(const UpdateData& data) const { double ratio = 0.0; + const Vec3d starting_vec = m_starting.drag_position - m_starting.center; - Vec3d pivot = (m_starting.ctrl_down && (m_hover_id < 6)) ? m_starting.pivots[m_hover_id] : m_starting.box.center(); + const double len_starting_vec = starting_vec.norm(); - Vec3d starting_vec = m_starting.drag_position - pivot; - double len_starting_vec = starting_vec.norm(); - if (len_starting_vec != 0.0) - { - Vec3d mouse_dir = data.mouse_ray.unit_vector(); + if (len_starting_vec != 0.0) { + const Vec3d mouse_dir = data.mouse_ray.unit_vector(); // finds the intersection of the mouse ray with the plane parallel to the camera viewport and passing throught the starting position // use ray-plane intersection see i.e. https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection algebric form // in our case plane normal and ray direction are the same (orthogonal view) // when moving to perspective camera the negative z unit axis of the camera needs to be transformed in world space and used as plane normal - Vec3d inters = data.mouse_ray.a + (m_starting.drag_position - data.mouse_ray.a).dot(mouse_dir) / mouse_dir.squaredNorm() * mouse_dir; + const Vec3d inters = data.mouse_ray.a + (m_starting.drag_position - data.mouse_ray.a).dot(mouse_dir) * mouse_dir; // vector from the starting position to the found intersection - Vec3d inters_vec = inters - m_starting.drag_position; + const Vec3d inters_vec = inters - m_starting.drag_position; // finds projection of the vector along the staring direction - double proj = inters_vec.dot(starting_vec.normalized()); + const double proj = inters_vec.dot(starting_vec.normalized()); ratio = (len_starting_vec + proj) / len_starting_vec; } @@ -381,5 +428,50 @@ double GLGizmoScale3D::calc_ratio(const UpdateData& data) const return ratio; } +void GLGizmoScale3D::update_render_data() +{ + const Selection& selection = m_parent.get_selection(); + const auto& [box, box_trafo] = selection.get_bounding_box_in_current_reference_system(); + m_bounding_box = box; + m_center = box_trafo.translation(); + m_grabbers_transform = box_trafo; + m_instance_center = (selection.is_single_full_instance() || selection.is_single_volume_or_modifier()) ? selection.get_first_volume()->get_instance_offset() : m_center; + + const Vec3d box_half_size = 0.5 * m_bounding_box.size(); + bool use_constrain = wxGetKeyState(WXK_CONTROL); + + // x axis + m_grabbers[0].center = { -(box_half_size.x() + Offset), 0.0, 0.0 }; + m_grabbers[0].color = (use_constrain && m_hover_id == 1) ? CONSTRAINED_COLOR : AXES_COLOR[0]; + m_grabbers[1].center = { box_half_size.x() + Offset, 0.0, 0.0 }; + m_grabbers[1].color = (use_constrain && m_hover_id == 0) ? CONSTRAINED_COLOR : AXES_COLOR[0]; + + // y axis + m_grabbers[2].center = { 0.0, -(box_half_size.y() + Offset), 0.0 }; + m_grabbers[2].color = (use_constrain && m_hover_id == 3) ? CONSTRAINED_COLOR : AXES_COLOR[1]; + m_grabbers[3].center = { 0.0, box_half_size.y() + Offset, 0.0 }; + m_grabbers[3].color = (use_constrain && m_hover_id == 2) ? CONSTRAINED_COLOR : AXES_COLOR[1]; + + // z axis + m_grabbers[4].center = { 0.0, 0.0, -(box_half_size.z() + Offset) }; + m_grabbers[4].color = (use_constrain && m_hover_id == 5) ? CONSTRAINED_COLOR : AXES_COLOR[2]; + m_grabbers[5].center = { 0.0, 0.0, box_half_size.z() + Offset }; + m_grabbers[5].color = (use_constrain && m_hover_id == 4) ? CONSTRAINED_COLOR : AXES_COLOR[2]; + + // uniform + m_grabbers[6].center = { -(box_half_size.x() + Offset), -(box_half_size.y() + Offset), 0.0 }; + m_grabbers[6].color = (use_constrain && m_hover_id == 8) ? CONSTRAINED_COLOR : m_highlight_color; + m_grabbers[7].center = { box_half_size.x() + Offset, -(box_half_size.y() + Offset), 0.0 }; + m_grabbers[7].color = (use_constrain && m_hover_id == 9) ? CONSTRAINED_COLOR : m_highlight_color; + m_grabbers[8].center = { box_half_size.x() + Offset, box_half_size.y() + Offset, 0.0 }; + m_grabbers[8].color = (use_constrain && m_hover_id == 6) ? CONSTRAINED_COLOR : m_highlight_color; + m_grabbers[9].center = { -(box_half_size.x() + Offset), box_half_size.y() + Offset, 0.0 }; + m_grabbers[9].color = (use_constrain && m_hover_id == 7) ? CONSTRAINED_COLOR : m_highlight_color; + + for (int i = 0; i < 10; ++i) { + m_grabbers[i].matrix = m_grabbers_transform; + } +} + } // namespace GUI -} // namespace Slic3r +} // namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp index 35615df4a70..d0b239c338e 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp @@ -3,36 +3,46 @@ #include "GLGizmoBase.hpp" -#include "libslic3r/BoundingBox.hpp" - - namespace Slic3r { namespace GUI { +class Selection; + class GLGizmoScale3D : public GLGizmoBase { - static const float Offset; + static const double Offset; struct StartingData { - Vec3d scale; - Vec3d drag_position; + bool ctrl_down{ false }; + Vec3d scale{ Vec3d::Ones() }; + Vec3d drag_position{ Vec3d::Zero() }; + Vec3d center{ Vec3d::Zero() }; + Vec3d instance_center{ Vec3d::Zero() }; + Vec3d constraint_position{ Vec3d::Zero() }; BoundingBoxf3 box; - Vec3d pivots[6]; - bool ctrl_down; - - StartingData() : scale(Vec3d::Ones()), drag_position(Vec3d::Zero()), ctrl_down(false) { for (int i = 0; i < 5; ++i) { pivots[i] = Vec3d::Zero(); } } }; - mutable BoundingBoxf3 m_box; - mutable Transform3d m_transform; - // Transforms grabbers offsets to the proper reference system (world for instances, instance for volumes) - mutable Transform3d m_offsets_transform; - Vec3d m_scale; - Vec3d m_offset; - double m_snap_step; + BoundingBoxf3 m_bounding_box; + Transform3d m_grabbers_transform; + Vec3d m_center{ Vec3d::Zero() }; + Vec3d m_instance_center{ Vec3d::Zero() }; + Vec3d m_scale{ Vec3d::Ones() }; + double m_snap_step{ 0.05 }; StartingData m_starting; + struct GrabberConnection + { + GLModel model; + std::pair grabber_indices; + Vec3d old_v1{ Vec3d::Zero() }; + Vec3d old_v2{ Vec3d::Zero() }; + }; + std::array m_grabber_connections; + + ColorRGBA m_base_color; + ColorRGBA m_drag_color; + ColorRGBA m_highlight_color; public: GLGizmoScale3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); @@ -42,30 +52,40 @@ class GLGizmoScale3D : public GLGizmoBase const Vec3d& get_scale() const { return m_scale; } void set_scale(const Vec3d& scale) { m_starting.scale = scale; m_scale = scale; } - const Vec3d& get_offset() const { return m_offset; } - std::string get_tooltip() const override; + /// + /// Postpone to Grabber for scale + /// + /// Keep information about mouse click + /// Return True when use the information otherwise False. + bool on_mouse(const wxMouseEvent &mouse_event) override; + + void data_changed() override; + void enable_ununiversal_scale(bool enable); protected: virtual bool on_init() override; virtual std::string on_get_name() const override; virtual bool on_is_activable() const override; virtual void on_start_dragging() override; - virtual void on_update(const UpdateData& data) override; + virtual void on_stop_dragging() override; + virtual void on_dragging(const UpdateData& data) override; virtual void on_render() override; - virtual void on_render_for_picking() override; + virtual void on_register_raycasters_for_picking() override; + virtual void on_unregister_raycasters_for_picking() override; private: - void render_grabbers_connection(unsigned int id_1, unsigned int id_2) const; + void render_grabbers_connection(unsigned int id_1, unsigned int id_2, const ColorRGBA& color); void do_scale_along_axis(Axis axis, const UpdateData& data); void do_scale_uniform(const UpdateData& data); double calc_ratio(const UpdateData& data) const; + void update_render_data(); }; } // namespace GUI } // namespace Slic3r -#endif // slic3r_GLGizmoScale_hpp_ +#endif // slic3r_GLGizmoScale_hpp_ \ No newline at end of file diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp index 00921aa9c8e..a493565792a 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp @@ -52,9 +52,7 @@ std::string GLGizmoSeam::on_get_name() const return _u8L("Seam painting"); } - - -void GLGizmoSeam::render_painter_gizmo() const +void GLGizmoSeam::render_painter_gizmo() { const Selection& selection = m_parent.get_selection(); @@ -112,8 +110,7 @@ void GLGizmoSeam::on_render_input_window(float x, float y, float bottom_limit) window_width = std::max(window_width, cursor_type_radio_left + cursor_type_radio_sphere + cursor_type_radio_circle); auto draw_text_with_caption = [this, &caption_max](const wxString& caption, const wxString& text) { - static const ImVec4 ORANGE(1.0f, 0.49f, 0.22f, 1.0f); - m_imgui->text_colored(ORANGE, caption); + m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, caption); ImGui::SameLine(caption_max); m_imgui->text(text); }; @@ -159,7 +156,7 @@ void GLGizmoSeam::on_render_input_window(float x, float y, float bottom_limit) else { if (m_imgui->button(m_desc.at("reset_direction"))) { wxGetApp().CallAfter([this](){ - m_c->object_clipper()->set_position(-1., false); + m_c->object_clipper()->set_position_by_ratio(-1., false); }); } } @@ -168,7 +165,7 @@ void GLGizmoSeam::on_render_input_window(float x, float y, float bottom_limit) ImGui::SameLine(sliders_left_width); ImGui::PushItemWidth(window_width - sliders_left_width - slider_icon_width); if (m_imgui->slider_float("##clp_dist", &clp_dist, 0.f, 1.f, "%.2f", 1.0f, true, _L("Ctrl + Mouse wheel"))) - m_c->object_clipper()->set_position(clp_dist, true); + m_c->object_clipper()->set_position_by_ratio(clp_dist, true); ImGui::Separator(); if (m_imgui->button(m_desc.at("remove_all"))) { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp index 408c2ec4c16..c1a6d7dfaca 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp @@ -3,6 +3,8 @@ #include "GLGizmoPainterBase.hpp" +#include "slic3r/GUI/I18N.hpp" + namespace Slic3r::GUI { class GLGizmoSeam : public GLGizmoPainterBase @@ -11,7 +13,7 @@ class GLGizmoSeam : public GLGizmoPainterBase GLGizmoSeam(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) : GLGizmoPainterBase(parent, icon_filename, sprite_id) {} - void render_painter_gizmo() const override; + void render_painter_gizmo() override; protected: void on_render_input_window(float x, float y, float bottom_limit) override; @@ -22,7 +24,7 @@ class GLGizmoSeam : public GLGizmoPainterBase std::string get_gizmo_entering_text() const override { return _u8L("Entering Seam painting"); } std::string get_gizmo_leaving_text() const override { return _u8L("Leaving Seam painting"); } - std::string get_action_snapshot_name() override { return _u8L("Paint-on seam editing"); } + std::string get_action_snapshot_name() const override { return _u8L("Paint-on seam editing"); } private: bool on_init() override; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp index 65d73e7c62d..d60784758fb 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp @@ -7,6 +7,7 @@ #include "slic3r/GUI/NotificationManager.hpp" #include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/format.hpp" +#include "slic3r/GUI/OpenGLManager.hpp" #include "libslic3r/AppConfig.hpp" #include "libslic3r/Model.hpp" #include "libslic3r/QuadricEdgeCollapse.hpp" @@ -36,33 +37,70 @@ static void call_after_if_active(std::function fn, GUI_App* app = &wxGet }); } -static ModelVolume* get_model_volume(const Selection& selection, Model& model) +static std::set get_volume_ids(const Selection &selection) { - const Selection::IndicesList& idxs = selection.get_volume_idxs(); - // only one selected volume - if (idxs.size() != 1) - return nullptr; - const GLVolume* selected_volume = selection.get_volume(*idxs.begin()); - if (selected_volume == nullptr) - return nullptr; - - const GLVolume::CompositeID& cid = selected_volume->composite_id; - const ModelObjectPtrs& objs = model.objects; - if (cid.object_id < 0 || objs.size() <= static_cast(cid.object_id)) - return nullptr; - const ModelObject* obj = objs[cid.object_id]; - if (cid.volume_id < 0 || obj->volumes.size() <= static_cast(cid.volume_id)) - return nullptr; - return obj->volumes[cid.volume_id]; + const Selection::IndicesList &volume_ids = selection.get_volume_idxs(); + const ModelObjectPtrs &model_objects = selection.get_model()->objects; + std::set result; + for (auto volume_id : volume_ids) { + const GLVolume *selected_volume = selection.get_volume(volume_id); + assert(selected_volume != nullptr); + + const GLVolume::CompositeID &cid = selected_volume->composite_id; + + assert(cid.object_id >= 0); + assert(model_objects.size() > static_cast(cid.object_id)); + + const ModelObject *obj = model_objects[cid.object_id]; + const ModelVolume *volume = obj->volumes[cid.volume_id]; + const ObjectID & id = volume->id(); + + // prevent selection of volume without inidces + if (volume->mesh().its.indices.empty()) continue; + + assert(result.find(id) == result.end()); + result.insert(id); + } + return result; +} + +// return ModelVolume from selection by object id +static ModelVolume *get_volume(const ObjectID &id, const Selection &selection) { + const Selection::IndicesList &volume_ids = selection.get_volume_idxs(); + const ModelObjectPtrs &model_objects = selection.get_model()->objects; + for (auto volume_id : volume_ids) { + const GLVolume *selected_volume = selection.get_volume(volume_id); + const GLVolume::CompositeID &cid = selected_volume->composite_id; + ModelObject *obj = model_objects[cid.object_id]; + ModelVolume *volume = obj->volumes[cid.volume_id]; + if (id == volume->id()) return volume; + } + return nullptr; +} + +static std::string create_volumes_name(const std::set& ids, const Selection &selection){ + assert(!ids.empty()); + std::string name; + bool is_first = true; + for (const ObjectID &id : ids) { + if (is_first) + is_first = false; + else + name += " + "; + + const ModelVolume *volume = get_volume(id, selection); + assert(volume != nullptr); + name += volume->name; + } + return name; } -GLGizmoSimplify::GLGizmoSimplify(GLCanvas3D & parent, - const std::string &icon_filename, - unsigned int sprite_id) - : GLGizmoBase(parent, icon_filename, -1) - , m_volume(nullptr) +GLGizmoSimplify::GLGizmoSimplify(GLCanvas3D &parent) + : GLGizmoBase(parent, M_ICON_FILENAME, -1) , m_show_wireframe(false) , m_move_to_center(false) + , m_original_triangle_count(0) + , m_triangle_count(0) // translation for GUI size , tr_mesh_name(_u8L("Mesh name")) , tr_triangles(_u8L("Triangles")) @@ -75,15 +113,11 @@ GLGizmoSimplify::~GLGizmoSimplify() stop_worker_thread_request(); if (m_worker.joinable()) m_worker.join(); - m_glmodel.reset(); } bool GLGizmoSimplify::on_esc_key_down() { - return false; - /*if (!m_is_worker_running) - return false; - stop_worker_thread_request(); - return true;*/ + //close(); + return stop_worker_thread_request(); } // while opening needs GLGizmoSimplify to set window position @@ -111,7 +145,7 @@ void GLGizmoSimplify::add_simplify_suggestion_notification( for (size_t object_id : big_ids) { std::string t = GUI::format(_L( "Processing model '%1%' with more than 1M triangles " - "could be slow. It is highly recommend to reduce " + "could be slow. It is highly recommended to reduce " "amount of triangles."), objects[object_id]->name); std::string hypertext = _u8L("Simplify model"); @@ -147,8 +181,8 @@ void GLGizmoSimplify::on_render_input_window(float x, float y, float bottom_limi { create_gui_cfg(); const Selection &selection = m_parent.get_selection(); - const ModelVolume *act_volume = get_model_volume(selection, wxGetApp().plater()->model()); - if (act_volume == nullptr) { + auto act_volume_ids = get_volume_ids(selection); + if (act_volume_ids.empty()) { stop_worker_thread_request(); close(); if (! m_parent.get_selection().is_single_volume()) { @@ -163,83 +197,93 @@ void GLGizmoSimplify::on_render_input_window(float x, float y, float bottom_limi bool is_cancelling = false; bool is_worker_running = false; bool is_result_ready = false; - int progress = 0; + int progress = 0; { std::lock_guard lk(m_state_mutex); is_cancelling = m_state.status == State::cancelling; is_worker_running = m_state.status == State::running; - is_result_ready = bool(m_state.result); + is_result_ready = !m_state.result.empty(); progress = m_state.progress; } // Whether to trigger calculation after rendering is done. bool start_process = false; - - // Check selection of new volume + // Check selection of new volume (or change) // Do not reselect object when processing - if (act_volume != m_volume) { - bool change_window_position = (m_volume == nullptr); + if (m_volume_ids != act_volume_ids) { + bool change_window_position = m_volume_ids.empty(); // select different model // close suggestion notification auto notification_manager = wxGetApp().plater()->get_notification_manager(); - notification_manager->remove_simplify_suggestion_with_id(act_volume->get_object()->id()); + for (const auto &id : act_volume_ids) + notification_manager->remove_simplify_suggestion_with_id(id); + + m_volume_ids = std::move(act_volume_ids); + init_model(); + + // triangle count is calculated in init model + m_original_triangle_count = m_triangle_count; - m_volume = act_volume; + // Default value of configuration m_configuration.decimate_ratio = 50.; // default value - m_configuration.fix_count_by_ratio(m_volume->mesh().its.indices.size()); - init_model(m_volume->mesh().its); + m_configuration.fix_count_by_ratio(m_original_triangle_count); + m_configuration.use_count = false; + + // Create volumes name to describe what will be simplified + std::string name = create_volumes_name(m_volume_ids, selection); + if (name.length() > m_gui_cfg->max_char_in_name) + name = name.substr(0, m_gui_cfg->max_char_in_name - 3) + "..."; + m_volumes_name = name; // Start processing. If we switched from another object, process will // stop the background thread and it will restart itself later. start_process = true; // set window position - if (m_move_to_center && change_window_position) { - m_move_to_center = false; - auto parent_size = m_parent.get_canvas_size(); - ImVec2 pos(parent_size.get_width() / 2 - m_gui_cfg->window_offset_x, - parent_size.get_height() / 2 - m_gui_cfg->window_offset_y); - ImGui::SetNextWindowPos(pos, ImGuiCond_Always); - }else if (change_window_position) { - ImVec2 pos = ImGui::GetMousePos(); - pos.x -= m_gui_cfg->window_offset_x; - pos.y -= m_gui_cfg->window_offset_y; - // minimal top left value - ImVec2 tl(m_gui_cfg->window_padding, m_gui_cfg->window_padding + m_parent.get_main_toolbar_height()); - if (pos.x < tl.x) pos.x = tl.x; - if (pos.y < tl.y) pos.y = tl.y; - // maximal bottom right value - auto parent_size = m_parent.get_canvas_size(); - ImVec2 br( - parent_size.get_width() - (2 * m_gui_cfg->window_offset_x + m_gui_cfg->window_padding), - parent_size.get_height() - (2 * m_gui_cfg->window_offset_y + m_gui_cfg->window_padding)); - if (pos.x > br.x) pos.x = br.x; - if (pos.y > br.y) pos.y = br.y; + if (change_window_position) { + ImVec2 pos; + Size parent_size = m_parent.get_canvas_size(); + if (m_move_to_center) { + m_move_to_center = false; + pos = ImVec2(parent_size.get_width() / 2 - m_gui_cfg->window_offset_x, + parent_size.get_height() / 2 - m_gui_cfg->window_offset_y); + } else { + // keep window wisible on canvas and close to mouse click + pos = ImGui::GetMousePos(); + pos.x -= m_gui_cfg->window_offset_x; + pos.y -= m_gui_cfg->window_offset_y; + // minimal top left value + ImVec2 tl(m_gui_cfg->window_padding, + m_gui_cfg->window_padding + m_parent.get_main_toolbar_height()); + if (pos.x < tl.x) pos.x = tl.x; + if (pos.y < tl.y) pos.y = tl.y; + // maximal bottom right value + ImVec2 br(parent_size.get_width() - (2 * m_gui_cfg->window_offset_x + m_gui_cfg->window_padding), + parent_size.get_height() -(2 * m_gui_cfg->window_offset_y + m_gui_cfg->window_padding)); + if (pos.x > br.x) pos.x = br.x; + if (pos.y > br.y) pos.y = br.y; + } ImGui::SetNextWindowPos(pos, ImGuiCond_Always); } } + bool is_multipart = (m_volume_ids.size() > 1); int flag = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse; m_imgui->begin(on_get_name(), flag); m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, tr_mesh_name + ":"); ImGui::SameLine(m_gui_cfg->top_left_width); - std::string name = m_volume->name; - if (name.length() > m_gui_cfg->max_char_in_name) - name = name.substr(0, m_gui_cfg->max_char_in_name - 3) + "..."; - m_imgui->text(name); + m_imgui->text(m_volumes_name); m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, tr_triangles + ":"); ImGui::SameLine(m_gui_cfg->top_left_width); - size_t orig_triangle_count = m_volume->mesh().its.indices.size(); - m_imgui->text(std::to_string(orig_triangle_count)); - + m_imgui->text(std::to_string(m_original_triangle_count)); ImGui::Separator(); - if(ImGui::RadioButton("##use_error", !m_configuration.use_count)) { + if(ImGui::RadioButton("##use_error", !m_configuration.use_count) && !is_multipart) { m_configuration.use_count = !m_configuration.use_count; start_process = true; } @@ -270,17 +314,22 @@ void GLGizmoSimplify::on_render_input_window(float x, float y, float bottom_limi } m_imgui->disabled_end(); // !use_count - if (ImGui::RadioButton("##use_count", m_configuration.use_count)) { + if (ImGui::RadioButton("##use_count", m_configuration.use_count) && !is_multipart) { m_configuration.use_count = !m_configuration.use_count; start_process = true; - } + } else if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && is_multipart) + // TRN %1% = "Detail level", %2% = "Decimate ratio" + ImGui::SetTooltip("%s", GUI::format(_L( + "Multipart object can be simplified only by %1%. " + "If you want specify %2% process it separately."), + tr_detail_level, tr_decimate_ratio).c_str()); ImGui::SameLine(); // show preview result triangle count (percent) if (!m_configuration.use_count) { m_configuration.wanted_count = static_cast(m_triangle_count); m_configuration.decimate_ratio = - (1.0f - (m_configuration.wanted_count / (float) orig_triangle_count)) * 100.f; + (1.0f - (m_configuration.wanted_count / (float) m_original_triangle_count)) * 100.f; } m_imgui->disabled_begin(!m_configuration.use_count); @@ -295,7 +344,7 @@ void GLGizmoSimplify::on_render_input_window(float x, float y, float bottom_limi m_configuration.decimate_ratio = 0.01f; if (m_configuration.decimate_ratio > 100.f) m_configuration.decimate_ratio = 100.f; - m_configuration.fix_count_by_ratio(orig_triangle_count); + m_configuration.fix_count_by_ratio(m_original_triangle_count); start_process = true; } @@ -342,11 +391,13 @@ void GLGizmoSimplify::close() { gizmos_mgr.open_gizmo(GLGizmosManager::EType::Simplify); } -void GLGizmoSimplify::stop_worker_thread_request() +bool GLGizmoSimplify::stop_worker_thread_request() { std::lock_guard lk(m_state_mutex); - if (m_state.status == State::running) - m_state.status = State::Status::cancelling; + if (m_state.status != State::running) return false; + + m_state.status = State::Status::cancelling; + return true; } @@ -366,9 +417,11 @@ void GLGizmoSimplify::worker_finished() m_worker.join(); if (GLGizmoBase::m_state == Off) return; - if (m_state.result) - init_model(*m_state.result); - if (m_state.config != m_configuration || m_state.mv != m_volume) { + const auto &result = m_state.result; + if (!result.empty()) + update_model(result); + + if (m_state.config != m_configuration || m_state.volume_ids != m_volume_ids) { // Settings were changed, restart the worker immediately. process(); } @@ -377,16 +430,16 @@ void GLGizmoSimplify::worker_finished() void GLGizmoSimplify::process() { - if (m_volume == nullptr || m_volume->mesh().its.indices.empty()) - return; + if (m_volume_ids.empty()) return; + // m_volume->mesh().its.indices.empty() bool configs_match = false; bool result_valid = false; bool is_worker_running = false; { std::lock_guard lk(m_state_mutex); - configs_match = (m_volume == m_state.mv && m_state.config == m_configuration); - result_valid = bool(m_state.result); + configs_match = (m_volume_ids == m_state.volume_ids && m_state.config == m_configuration); + result_valid = !m_state.result.empty(); is_worker_running = m_state.status == State::running; } @@ -411,15 +464,20 @@ void GLGizmoSimplify::process() // Copy configuration that will be used. m_state.config = m_configuration; - m_state.mv = m_volume; + m_state.volume_ids = m_volume_ids; m_state.status = State::running; - // Create a copy of current mesh to pass to the worker thread. + // Create a copy of current meshes to pass to the worker thread. // Using unique_ptr instead of pass-by-value to avoid an extra // copy (which would happen when passing to std::thread). - auto its = std::make_unique(m_volume->mesh().its); - - m_worker = std::thread([this](std::unique_ptr its) { + const Selection& selection = m_parent.get_selection(); + State::Data its; + for (const auto &id : m_volume_ids) { + const ModelVolume *volume = get_volume(id, selection); + its[id] = std::make_unique(volume->mesh().its); // copy + } + + m_worker = std::thread([this](State::Data its) { // Checks that the UI thread did not request cancellation, throws if so. std::function throw_on_cancel = [this]() { @@ -446,13 +504,16 @@ void GLGizmoSimplify::process() if (! m_state.config.use_count) max_error = m_state.config.max_error; m_state.progress = 0; - m_state.result.reset(); + m_state.result.clear(); m_state.status = State::Status::running; } // Start the actual calculation. try { - its_quadric_edge_collapse(*its, triangle_count, &max_error, throw_on_cancel, statusfn); + for (const auto& it : its) { + float me = max_error; + its_quadric_edge_collapse(*it.second, triangle_count, &me, throw_on_cancel, statusfn); + } } catch (SimplifyCanceledException &) { std::lock_guard lk(m_state_mutex); m_state.status = State::idle; @@ -471,25 +532,38 @@ void GLGizmoSimplify::process() } void GLGizmoSimplify::apply_simplify() { + // worker must be stopped + assert(m_state.status == State::Status::idle); - const Selection& selection = m_parent.get_selection(); - int object_idx = selection.get_object_idx(); + // check that there is NO change of volume + assert(m_state.volume_ids == m_volume_ids); + const Selection& selection = m_parent.get_selection(); auto plater = wxGetApp().plater(); - plater->take_snapshot(GUI::format(_u8L("Simplify %1%"), m_volume->name)); - plater->clear_before_change_mesh(object_idx); - - ModelVolume* mv = get_model_volume(selection, wxGetApp().model()); - assert(mv == m_volume); - - mv->set_mesh(std::move(*m_state.result)); - m_state.result.reset(); - mv->calculate_convex_hull(); - mv->set_new_unique_id(); - mv->get_object()->invalidate_bounding_box(); - mv->get_object()->ensure_on_bed(true); // allow negative z - - // fix hollowing, sla support points, modifiers, ... + // TRN %1% = volumes name + plater->take_snapshot(Slic3r::format(_u8L("Simplify %1%"), create_volumes_name(m_volume_ids, selection))); + plater->clear_before_change_mesh(selection.get_object_idx(), _u8L("Custom supports, seams and multimaterial painting were " + "removed after simplifying the mesh.")); + // After removing custom supports, seams, and multimaterial painting, we have to update info about the object to remove information about + // custom supports, seams, and multimaterial painting in the right panel. + wxGetApp().obj_list()->update_info_items(selection.get_object_idx()); + + for (const auto &item: m_state.result) { + const ObjectID &id = item.first; + const indexed_triangle_set &its = *item.second; + ModelVolume *volume = get_volume(id, selection); + assert(volume != nullptr); + ModelObject *obj = volume->get_object(); + + volume->set_mesh(std::move(its)); + volume->calculate_convex_hull(); + volume->set_new_unique_id(); + obj->invalidate_bounding_box(); + obj->ensure_on_bed(true); // allow negative z + } + m_state.result.clear(); + // fix hollowing, sla support points, modifiers, ... + int object_idx = selection.get_object_idx(); plater->changed_mesh(object_idx); // Fix warning icon in object list wxGetApp().obj_list()->update_item_error_icon(object_idx, -1); @@ -508,8 +582,8 @@ void GLGizmoSimplify::on_set_state() m_parent.toggle_model_objects_visibility(true); stop_worker_thread_request(); - m_volume = nullptr; // invalidate selected model - m_glmodel.reset(); + m_volume_ids.clear(); // invalidate selected model + m_glmodels.clear(); // free gpu memory } else if (GLGizmoBase::m_state == GLGizmoBase::On) { // when open by hyperlink it needs to show up request_rerender(); @@ -518,7 +592,7 @@ void GLGizmoSimplify::on_set_state() void GLGizmoSimplify::create_gui_cfg() { if (m_gui_cfg.has_value()) return; - int space_size = m_imgui->calc_text_size(":MM").x; + int space_size = m_imgui->calc_text_size(std::string_view{":MM"}).x; GuiCfg cfg; cfg.top_left_width = std::max(m_imgui->calc_text_size(tr_mesh_name).x, m_imgui->calc_text_size(tr_triangles).x) @@ -550,65 +624,183 @@ void GLGizmoSimplify::set_center_position() { m_move_to_center = true; } - -void GLGizmoSimplify::init_model(const indexed_triangle_set& its) +void GLGizmoSimplify::init_model() { - if (its.indices.empty()) - return; + // volume ids must be set before init model + assert(!m_volume_ids.empty()); - m_glmodel.reset(); - m_glmodel.init_from(its); m_parent.toggle_model_objects_visibility(true); // selected volume may have changed - m_parent.toggle_model_objects_visibility(false, m_c->selection_info()->model_object(), - m_c->selection_info()->get_active_instance(), m_volume); - - if (const Selection&sel = m_parent.get_selection(); sel.get_volume_idxs().size() == 1) - m_glmodel.set_color(-1, sel.get_volume(*sel.get_volume_idxs().begin())->color); - m_triangle_count = its.indices.size(); + const auto info = m_c->selection_info(); + + const Selection &selection = m_parent.get_selection(); + Model & model = *selection.get_model(); + const Selection::IndicesList &volume_ids = selection.get_volume_idxs(); + const ModelObjectPtrs &model_objects = model.objects; + + m_glmodels.clear(); + //m_glmodels.reserve(volume_ids.size()); + m_triangle_count = 0; + for (const ObjectID& id: m_volume_ids) { + + const GLVolume *selected_volume; + const ModelVolume *volume = nullptr; + for (auto volume_id : volume_ids) { + selected_volume = selection.get_volume(volume_id); + const GLVolume::CompositeID &cid = selected_volume->composite_id; + ModelObject * obj = model_objects[cid.object_id]; + ModelVolume * act_volume = obj->volumes[cid.volume_id]; + if (id == act_volume->id()) { + volume = act_volume; + break; + } + } + assert(volume != nullptr); + + // set actual triangle count + m_triangle_count += volume->mesh().its.indices.size(); + + assert(m_glmodels.find(id) == m_glmodels.end()); + GLModel &glmodel = m_glmodels[id]; // create new glmodel + glmodel.init_from(volume->mesh()); + glmodel.set_color(selected_volume->color); + + m_parent.toggle_model_objects_visibility(false, info->model_object(), + info->get_active_instance(), + volume); + } } -void GLGizmoSimplify::on_render() +void GLGizmoSimplify::update_model(const State::Data &data) { - if (! m_glmodel.is_initialized()) - return; + // check that model exist + if (m_glmodels.empty()) return; - const auto& selection = m_parent.get_selection(); - const auto& volume_idxs = selection.get_volume_idxs(); - if (volume_idxs.empty() || volume_idxs.size() != 1) return; - const GLVolume *selected_volume = selection.get_volume(*volume_idxs.begin()); + // check that result is for actual gl models + size_t model_count = m_glmodels.size(); + if (data.size() != model_count) return; + + m_triangle_count = 0; + for (const auto &item : data) { + const indexed_triangle_set &its = *item.second; + + auto it = m_glmodels.find(item.first); + assert(it != m_glmodels.end()); + + GLModel &glmodel = it->second; + auto color = glmodel.get_color(); + // when not reset it keeps old shape + glmodel.reset(); +#if ENABLE_OPENGL_ES + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3E3 }; + init_data.reserve_vertices(3 * its.indices.size()); + init_data.reserve_indices(3 * its.indices.size()); + + // vertices + indices + std::array barycentric_coords = { Vec3f::UnitX(), Vec3f::UnitY(), Vec3f::UnitZ() }; + unsigned int vertices_counter = 0; + for (uint32_t i = 0; i < its.indices.size(); ++i) { + const stl_triangle_vertex_indices face = its.indices[i]; + const stl_vertex vertex[3] = { its.vertices[face[0]], its.vertices[face[1]], its.vertices[face[2]] }; + const stl_vertex n = face_normal_normalized(vertex); + for (size_t j = 0; j < 3; ++j) { + init_data.add_vertex(vertex[j], n, barycentric_coords[j]); + } + vertices_counter += 3; + init_data.add_triangle(vertices_counter - 3, vertices_counter - 2, vertices_counter - 1); + } - // Check that the GLVolume still belongs to the ModelObject we work on. - if (m_volume != get_model_volume(selection, wxGetApp().model())) - return; + glmodel.init_from(std::move(init_data)); +#else + glmodel.init_from(its); +#endif // ENABLE_OPENGL_ES + glmodel.set_color(color); - const Transform3d trafo_matrix = selected_volume->world_matrix(); - glsafe(::glPushMatrix()); - glsafe(::glMultMatrixd(trafo_matrix.data())); - - auto *gouraud_shader = wxGetApp().get_shader("gouraud_light"); - glsafe(::glPushAttrib(GL_DEPTH_TEST)); - glsafe(::glEnable(GL_DEPTH_TEST)); - gouraud_shader->start_using(); - m_glmodel.render(); - gouraud_shader->stop_using(); - - if (m_show_wireframe) { - auto* contour_shader = wxGetApp().get_shader("mm_contour"); - contour_shader->start_using(); - glsafe(::glLineWidth(1.0f)); - glsafe(::glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)); - //ScopeGuard offset_fill_guard([]() { glsafe(::glDisable(GL_POLYGON_OFFSET_FILL)); }); - //glsafe(::glEnable(GL_POLYGON_OFFSET_FILL)); - //glsafe(::glPolygonOffset(5.0, 5.0)); - m_glmodel.render(); - glsafe(::glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)); - contour_shader->stop_using(); + m_triangle_count += its.indices.size(); } - - glsafe(::glPopAttrib()); - glsafe(::glPopMatrix()); } +void GLGizmoSimplify::on_render() +{ + if (m_glmodels.empty()) return; + + const Selection & selection = m_parent.get_selection(); + + // Check that the GLVolume still belongs to the ModelObject we work on. + if (m_volume_ids != get_volume_ids(selection)) return; + + const ModelObjectPtrs &model_objects = selection.get_model()->objects; + const Selection::IndicesList &volume_idxs = selection.get_volume_idxs(); + + // no need to render nothing + if (volume_idxs.empty()) return; + + // Iteration over selection because of world transformation matrix of object + for (auto volume_id : volume_idxs) { + const GLVolume *selected_volume = selection.get_volume(volume_id); + const GLVolume::CompositeID &cid = selected_volume->composite_id; + + ModelObject *obj = model_objects[cid.object_id]; + ModelVolume *volume = obj->volumes[cid.volume_id]; + + auto it = m_glmodels.find(volume->id()); + assert(it != m_glmodels.end()); + + GLModel &glmodel = it->second; + + const Transform3d trafo_matrix = selected_volume->world_matrix(); + auto* gouraud_shader = wxGetApp().get_shader("gouraud_light"); +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + bool depth_test_enabled = ::glIsEnabled(GL_DEPTH_TEST); +#else + glsafe(::glPushAttrib(GL_DEPTH_TEST)); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + glsafe(::glEnable(GL_DEPTH_TEST)); + gouraud_shader->start_using(); + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d& view_matrix = camera.get_view_matrix(); + const Transform3d view_model_matrix = view_matrix * trafo_matrix; + gouraud_shader->set_uniform("view_model_matrix", view_model_matrix); + gouraud_shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * trafo_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + gouraud_shader->set_uniform("view_normal_matrix", view_normal_matrix); + glmodel.render(); + gouraud_shader->stop_using(); + + if (m_show_wireframe) { +#if ENABLE_OPENGL_ES + auto* contour_shader = wxGetApp().get_shader("wireframe"); +#else + auto *contour_shader = wxGetApp().get_shader("mm_contour"); +#endif // ENABLE_OPENGL_ES + contour_shader->start_using(); + contour_shader->set_uniform("offset", OpenGLManager::get_gl_info().is_mesa() ? 0.0005 : 0.00001); + contour_shader->set_uniform("view_model_matrix", view_model_matrix); + contour_shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + const ColorRGBA color = glmodel.get_color(); + glmodel.set_color(ColorRGBA::WHITE()); +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_core_profile()) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth(1.0f)); +#if !ENABLE_OPENGL_ES + glsafe(::glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)); +#endif // !ENABLE_OPENGL_ES + glmodel.render(); +#if !ENABLE_OPENGL_ES + glsafe(::glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)); +#endif // !ENABLE_OPENGL_ES + glmodel.set_color(color); + contour_shader->stop_using(); + } +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + if (depth_test_enabled) + glsafe(::glEnable(GL_DEPTH_TEST)); +#else + glsafe(::glPopAttrib()); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + } +} CommonGizmosDataID GLGizmoSimplify::on_get_requirements() const { @@ -616,7 +808,6 @@ CommonGizmosDataID GLGizmoSimplify::on_get_requirements() const int(CommonGizmosDataID::SelectionInfo)); } - void GLGizmoSimplify::Configuration::fix_count_by_ratio(size_t triangle_count) { if (decimate_ratio <= 0.f) @@ -628,4 +819,7 @@ void GLGizmoSimplify::Configuration::fix_count_by_ratio(size_t triangle_count) triangle_count * (100.f - decimate_ratio) / 100.f)); } +// any existing icon filename to not influence GUI +const std::string GLGizmoSimplify::M_ICON_FILENAME = "cut.svg"; + } // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.hpp index 39093e14d67..1a56b77913f 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.hpp @@ -1,17 +1,17 @@ #ifndef slic3r_GLGizmoSimplify_hpp_ #define slic3r_GLGizmoSimplify_hpp_ -// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, -// which overrides our localization "L" macro. #include "GLGizmoBase.hpp" #include "slic3r/GUI/3DScene.hpp" +#include "slic3r/GUI/I18N.hpp" #include "admesh/stl.h" // indexed_triangle_set #include #include namespace Slic3r { -class ModelVolume; +class ModelObject; class Model; +class ObjectID; namespace GUI { class NotificationManager; // for simplify suggestion @@ -19,7 +19,7 @@ class NotificationManager; // for simplify suggestion class GLGizmoSimplify: public GLGizmoBase { public: - GLGizmoSimplify(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); + GLGizmoSimplify(GLCanvas3D& parent); virtual ~GLGizmoSimplify(); bool on_esc_key_down(); static void add_simplify_suggestion_notification( @@ -37,7 +37,6 @@ class GLGizmoSimplify: public GLGizmoBase // must implement virtual bool on_init() override { return true;}; virtual void on_render() override; - virtual void on_render_for_picking() override{}; CommonGizmosDataID on_get_requirements() const override; @@ -46,12 +45,11 @@ class GLGizmoSimplify: public GLGizmoBase void close(); void process(); - void stop_worker_thread_request(); + bool stop_worker_thread_request(); void worker_finished(); void create_gui_cfg(); void request_rerender(bool force = false); - void init_model(const indexed_triangle_set& its); void set_center_position(); @@ -76,10 +74,14 @@ class GLGizmoSimplify: public GLGizmoBase bool m_move_to_center; // opening gizmo - const ModelVolume *m_volume; // keep pointer to actual working volume + std::set m_volume_ids; // keep pointers to actual working volumes + std::string m_volumes_name; + size_t m_original_triangle_count; bool m_show_wireframe; - GLModel m_glmodel; + std::map m_glmodels; + + size_t m_triangle_count; // triangle count of the model currently shown // Timestamp of the last rerender request. Only accessed from UI thread. @@ -88,6 +90,8 @@ class GLGizmoSimplify: public GLGizmoBase // Following struct is accessed by both UI and worker thread. // Accesses protected by a mutex. struct State { + //using Data = std::vector >; + using Data = std::map >; enum Status { idle, running, @@ -97,10 +101,15 @@ class GLGizmoSimplify: public GLGizmoBase Status status = idle; int progress = 0; // percent of done work Configuration config; // Configuration we started with. - const ModelVolume* mv = nullptr; - std::unique_ptr result; + const ModelObject* mo = nullptr; + + Data result; + std::set volume_ids; // is same as result keys - store separate for faster check }; + void init_model(); // initialize glModels from selection + void update_model(const State::Data &data); + std::thread m_worker; std::mutex m_state_mutex; // guards m_state State m_state; // accessed by both threads @@ -142,6 +151,9 @@ class GLGizmoSimplify: public GLGizmoBase return L("Model simplification has been canceled"); } }; + + // only temporary solution + static const std::string M_ICON_FILENAME; }; } // namespace GUI diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaBase.cpp new file mode 100644 index 00000000000..348fa5ca750 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaBase.cpp @@ -0,0 +1,206 @@ +#include "libslic3r/libslic3r.h" +#include "GLGizmoSlaBase.hpp" +#include "slic3r/GUI/Camera.hpp" +#include "slic3r/GUI/GLCanvas3D.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp" + +namespace Slic3r { +namespace GUI { + +static const ColorRGBA DISABLED_COLOR = ColorRGBA::DARK_GRAY(); +static const int VOLUME_RAYCASTERS_BASE_ID = (int)SceneRaycaster::EIdBase::Gizmo; + +GLGizmoSlaBase::GLGizmoSlaBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id, SLAPrintObjectStep min_step) +: GLGizmoBase(parent, icon_filename, sprite_id) +, m_min_sla_print_object_step((int)min_step) +{} + +void GLGizmoSlaBase::reslice_until_step(SLAPrintObjectStep step, bool postpone_error_messages) +{ + wxGetApp().CallAfter([this, step, postpone_error_messages]() { + wxGetApp().plater()->reslice_SLA_until_step(step, *m_c->selection_info()->model_object(), postpone_error_messages); + }); +} + +CommonGizmosDataID GLGizmoSlaBase::on_get_requirements() const +{ + return CommonGizmosDataID( + int(CommonGizmosDataID::SelectionInfo) + | int(CommonGizmosDataID::InstancesHider) + | int(CommonGizmosDataID::Raycaster) + | int(CommonGizmosDataID::ObjectClipper) + | int(CommonGizmosDataID::SupportsClipper)); +} + +void GLGizmoSlaBase::update_volumes() +{ + m_volumes.clear(); + unregister_volume_raycasters_for_picking(); + + const ModelObject* mo = m_c->selection_info()->model_object(); + if (mo == nullptr) + return; + + const SLAPrintObject* po = m_c->selection_info()->print_object(); + if (po == nullptr) + return; + + m_input_enabled = false; + + TriangleMesh backend_mesh; + std::shared_ptr preview_mesh_ptr = po->get_mesh_to_print(); + if (preview_mesh_ptr != nullptr) + backend_mesh = TriangleMesh(*preview_mesh_ptr); + + if (!backend_mesh.empty()) { + auto last_comp_step = static_cast(po->last_completed_step()); + if (last_comp_step == slaposCount) + last_comp_step = -1; + + m_input_enabled = last_comp_step >= m_min_sla_print_object_step; + + const int object_idx = m_parent.get_selection().get_object_idx(); + const int instance_idx = m_parent.get_selection().get_instance_idx(); + const Geometry::Transformation& inst_trafo = po->model_object()->instances[instance_idx]->get_transformation(); + const double current_elevation = po->get_current_elevation(); + + auto add_volume = [this, object_idx, instance_idx, &inst_trafo, current_elevation](const TriangleMesh& mesh, int volume_id, bool add_mesh_raycaster = false) { + GLVolume* volume = m_volumes.volumes.emplace_back(new GLVolume()); + volume->model.init_from(mesh); + volume->set_instance_transformation(inst_trafo); + volume->set_sla_shift_z(current_elevation); + if (add_mesh_raycaster) + volume->mesh_raycaster = std::make_unique(mesh); + if (m_input_enabled) + volume->selected = true; // to set the proper color + else + volume->set_color(DISABLED_COLOR); + volume->composite_id = GLVolume::CompositeID(object_idx, volume_id, instance_idx); + }; + + const Transform3d po_trafo_inverse = po->trafo().inverse(); + + // main mesh + backend_mesh.transform(po_trafo_inverse); + add_volume(backend_mesh, 0, true); + + // supports mesh + TriangleMesh supports_mesh = po->support_mesh(); + if (!supports_mesh.empty()) { + supports_mesh.transform(po_trafo_inverse); + add_volume(supports_mesh, -int(slaposSupportTree)); + } + + // pad mesh + TriangleMesh pad_mesh = po->pad_mesh(); + if (!pad_mesh.empty()) { + pad_mesh.transform(po_trafo_inverse); + add_volume(pad_mesh, -int(slaposPad)); + } + } + + if (m_volumes.volumes.empty()) { + // No valid mesh found in the backend. Use the selection to duplicate the volumes + const Selection& selection = m_parent.get_selection(); + const Selection::IndicesList& idxs = selection.get_volume_idxs(); + for (unsigned int idx : idxs) { + const GLVolume* v = selection.get_volume(idx); + if (!v->is_modifier) { + m_volumes.volumes.emplace_back(new GLVolume()); + GLVolume* new_volume = m_volumes.volumes.back(); + const TriangleMesh& mesh = mo->volumes[v->volume_idx()]->mesh(); + new_volume->model.init_from(mesh); + new_volume->set_instance_transformation(v->get_instance_transformation()); + new_volume->set_volume_transformation(v->get_volume_transformation()); + new_volume->set_sla_shift_z(v->get_sla_shift_z()); + new_volume->set_color(DISABLED_COLOR); + new_volume->mesh_raycaster = std::make_unique(mesh); + } + } + } + + register_volume_raycasters_for_picking(); +} + +void GLGizmoSlaBase::render_volumes() +{ + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light_clip"); + if (shader == nullptr) + return; + + shader->start_using(); + shader->set_uniform("emission_factor", 0.0f); + const Camera& camera = wxGetApp().plater()->get_camera(); + + ClippingPlane clipping_plane = (m_c->object_clipper()->get_position() == 0.0) ? ClippingPlane::ClipsNothing() : *m_c->object_clipper()->get_clipping_plane(); + clipping_plane.set_normal(-clipping_plane.get_normal()); + m_volumes.set_clipping_plane(clipping_plane.get_data()); + + for (GLVolume* v : m_volumes.volumes) { + v->is_active = m_show_sla_supports || (!v->is_sla_pad() && !v->is_sla_support()); + } + + m_volumes.render(GLVolumeCollection::ERenderType::Opaque, true, camera.get_view_matrix(), camera.get_projection_matrix()); + shader->stop_using(); +} + +void GLGizmoSlaBase::register_volume_raycasters_for_picking() +{ + for (size_t i = 0; i < m_volumes.volumes.size(); ++i) { + const GLVolume* v = m_volumes.volumes[i]; + if (!v->is_sla_pad() && !v->is_sla_support()) + m_volume_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, VOLUME_RAYCASTERS_BASE_ID + (int)i, *v->mesh_raycaster, v->world_matrix())); + } +} + +void GLGizmoSlaBase::unregister_volume_raycasters_for_picking() +{ + for (size_t i = 0; i < m_volume_raycasters.size(); ++i) { + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, VOLUME_RAYCASTERS_BASE_ID + (int)i); + } + m_volume_raycasters.clear(); +} + +// Unprojects the mouse position on the mesh and saves hit point and normal of the facet into pos_and_normal +// Return false if no intersection was found, true otherwise. +bool GLGizmoSlaBase::unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal) +{ + if (m_c->raycaster()->raycasters().size() != 1) + return false; + if (!m_c->raycaster()->raycaster()) + return false; + if (m_volumes.volumes.empty()) + return false; + + auto *inst = m_c->selection_info()->model_instance(); + if (!inst) + return false; + + Transform3d trafo = m_volumes.volumes.front()->world_matrix(); + if (m_c->selection_info() && m_c->selection_info()->print_object()) { + double shift_z = m_c->selection_info()->print_object()->get_current_elevation(); + trafo = inst->get_transformation().get_matrix(); + trafo.translation()(2) += shift_z; + } + + // The raycaster query + Vec3f hit; + Vec3f normal; + if (m_c->raycaster()->raycaster()->unproject_on_mesh( + mouse_pos, + trafo/*m_volumes.volumes.front()->world_matrix()*/, + wxGetApp().plater()->get_camera(), + hit, + normal, + m_c->object_clipper()->get_position() != 0.0 ? m_c->object_clipper()->get_clipping_plane() : nullptr)) { + // Return both the point and the facet normal. + pos_and_normal = std::make_pair(hit, normal); + return true; + } + return false; +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaBase.hpp new file mode 100644 index 00000000000..acda5a8a168 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaBase.hpp @@ -0,0 +1,59 @@ +#ifndef slic3r_GLGizmoSlaBase_hpp_ +#define slic3r_GLGizmoSlaBase_hpp_ + +#include "GLGizmoBase.hpp" +#include "slic3r/GUI/3DScene.hpp" +#include "slic3r/GUI/SceneRaycaster.hpp" +#include "libslic3r/SLAPrint.hpp" +#include "libslic3r/Point.hpp" + +#include +#include +#include + +namespace Slic3r { + +class SLAPrint; + +namespace GUI { + +class GLCanvas3D; + +class GLGizmoSlaBase : public GLGizmoBase +{ +public: + GLGizmoSlaBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id, SLAPrintObjectStep min_step); + + void reslice_until_step(SLAPrintObjectStep step, bool postpone_error_messages = false); + +protected: + virtual CommonGizmosDataID on_get_requirements() const override; + + void update_volumes(); + void render_volumes(); + + void register_volume_raycasters_for_picking(); + void unregister_volume_raycasters_for_picking(); + + bool is_input_enabled() const { return m_input_enabled; } + int get_min_sla_print_object_step() const { return m_min_sla_print_object_step; } + + bool unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal); + + bool are_sla_supports_shown() const { return m_show_sla_supports; } + void show_sla_supports(bool show) { m_show_sla_supports = show; } + + const GLVolumeCollection &volumes() const { return m_volumes; } + +private: + GLVolumeCollection m_volumes; + bool m_input_enabled{ false }; + bool m_show_sla_supports{ false }; + int m_min_sla_print_object_step{ -1 }; + std::vector> m_volume_raycasters; +}; + +} // namespace GUI +} // namespace Slic3r + +#endif // slic3r_GLGizmoSlaBase_hpp_ diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index eb2dc3eeb0b..5ff491d2d00 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -1,8 +1,5 @@ -// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro. +#include "libslic3r/libslic3r.h" #include "GLGizmoSlaSupports.hpp" -#include "slic3r/GUI/GLCanvas3D.hpp" -#include "slic3r/GUI/Camera.hpp" -#include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp" #include "slic3r/GUI/MainFrame.hpp" #include "slic3r/Utils/UndoRedo.hpp" @@ -12,26 +9,26 @@ #include #include -#include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/GUI.hpp" #include "slic3r/GUI/GUI_ObjectSettings.hpp" #include "slic3r/GUI/GUI_ObjectList.hpp" -#include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/NotificationManager.hpp" #include "slic3r/GUI/MsgDialog.hpp" #include "libslic3r/PresetBundle.hpp" #include "libslic3r/SLAPrint.hpp" +static const double CONE_RADIUS = 0.25; +static const double CONE_HEIGHT = 0.75; namespace Slic3r { namespace GUI { GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) - : GLGizmoBase(parent, icon_filename, sprite_id) +: GLGizmoSlaBase(parent, icon_filename, sprite_id, slaposDrillHoles) { + show_sla_supports(true); } - bool GLGizmoSlaSupports::on_init() { m_shortcut_key = WXK_CONTROL_L; @@ -48,11 +45,11 @@ bool GLGizmoSlaSupports::on_init() m_desc["manual_editing"] = _L("Manual editing"); m_desc["clipping_of_view"] = _L("Clipping of view")+ ": "; m_desc["reset_direction"] = _L("Reset direction"); - + return true; } -void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const Selection& selection) +void GLGizmoSlaSupports::data_changed() { if (! m_c->selection_info()) return; @@ -63,20 +60,55 @@ void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const S disable_editing_mode(); reload_cache(); m_old_mo_id = mo->id(); - m_c->instances_hider()->show_supports(true); } // If we triggered autogeneration before, check backend and fetch results if they are there if (mo) { + m_c->instances_hider()->set_hide_full_scene(true); + const SLAPrintObject* po = m_c->selection_info()->print_object(); + const int required_step = get_min_sla_print_object_step(); + auto last_comp_step = static_cast(po->last_completed_step()); + if (last_comp_step == slaposCount) + last_comp_step = -1; + + if (po != nullptr && last_comp_step < required_step) + reslice_until_step((SLAPrintObjectStep)required_step, false); + + update_volumes(); + if (mo->sla_points_status == sla::PointsStatus::Generating) get_data_from_backend(); + + if (m_point_raycasters.empty()) + register_point_raycasters_for_picking(); + else + update_point_raycasters_for_picking_transform(); } + +// m_parent.toggle_model_objects_visibility(false); } void GLGizmoSlaSupports::on_render() { + if (m_state == On) { + // This gizmo is showing the object elevated. Tell the common + // SelectionInfo object to lie about the actual shift. + m_c->selection_info()->set_use_shift(true); + } + + if (!m_sphere.model.is_initialized()) { + indexed_triangle_set its = its_make_sphere(1.0, double(PI) / 12.0); + m_sphere.model.init_from(its); + m_sphere.mesh_raycaster = std::make_unique(std::make_shared(std::move(its))); + } + if (!m_cone.model.is_initialized()) { + indexed_triangle_set its = its_make_cone(1.0, 1.0, double(PI) / 12.0); + m_cone.model.init_from(its); + m_cone.mesh_raycaster = std::make_unique(std::make_shared(std::move(its))); + } + ModelObject* mo = m_c->selection_info()->model_object(); const Selection& selection = m_parent.get_selection(); @@ -91,8 +123,8 @@ void GLGizmoSlaSupports::on_render() glsafe(::glEnable(GL_BLEND)); glsafe(::glEnable(GL_DEPTH_TEST)); - if (selection.is_from_single_instance()) - render_points(selection, false); + render_volumes(); + render_points(selection); m_selection_rectangle.render(m_parent); m_c->object_clipper()->render_cut(); @@ -101,84 +133,87 @@ void GLGizmoSlaSupports::on_render() glsafe(::glDisable(GL_BLEND)); } +void GLGizmoSlaSupports::on_register_raycasters_for_picking() +{ + register_point_raycasters_for_picking(); + register_volume_raycasters_for_picking(); +} -void GLGizmoSlaSupports::on_render_for_picking() +void GLGizmoSlaSupports::on_unregister_raycasters_for_picking() { - const Selection& selection = m_parent.get_selection(); - //glsafe(::glEnable(GL_DEPTH_TEST)); - render_points(selection, true); + unregister_point_raycasters_for_picking(); + unregister_volume_raycasters_for_picking(); } -void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) const +void GLGizmoSlaSupports::render_points(const Selection& selection) { - size_t cache_size = m_editing_mode ? m_editing_cache.size() : m_normal_cache.size(); + const size_t cache_size = m_editing_mode ? m_editing_cache.size() : m_normal_cache.size(); - bool has_points = (cache_size != 0); - bool has_holes = (! m_c->hollowed_mesh()->get_hollowed_mesh() - && ! m_c->selection_info()->model_object()->sla_drain_holes.empty()); + const bool has_points = (cache_size != 0); + if (!has_points) + return; - if (! has_points && ! has_holes) + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); + if (shader == nullptr) return; - GLShaderProgram* shader = picking ? nullptr : wxGetApp().get_shader("gouraud_light"); - if (shader != nullptr) - shader->start_using(); - ScopeGuard guard([shader]() { - if (shader != nullptr) - shader->stop_using(); - }); + shader->start_using(); + ScopeGuard guard([shader]() { shader->stop_using(); }); - const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); - Geometry::Transformation transformation(vol->get_instance_transformation().get_matrix() * vol->get_volume_transformation().get_matrix()); - const Transform3d& instance_scaling_matrix_inverse = transformation.get_matrix(true, true, false, true).inverse(); - const Transform3d& instance_matrix = transformation.get_matrix(); - const float z_shift = m_c->selection_info()->get_sla_shift(); - glsafe(::glPushMatrix()); - glsafe(::glTranslated(0.0, 0.0, z_shift)); - glsafe(::glMultMatrixd(instance_matrix.data())); + auto *inst = m_c->selection_info()->model_instance(); + if (!inst) + return; + + double shift_z = m_c->selection_info()->print_object()->get_current_elevation(); + Transform3d trafo = inst->get_transformation().get_matrix(); + trafo.translation()(2) += shift_z; + const Geometry::Transformation transformation{trafo}; + + const Transform3d instance_scaling_matrix_inverse = transformation.get_scaling_factor_matrix().inverse(); + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d& view_matrix = camera.get_view_matrix(); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); - std::array render_color; + ColorRGBA render_color; for (size_t i = 0; i < cache_size; ++i) { const sla::SupportPoint& support_point = m_editing_mode ? m_editing_cache[i].support_point : m_normal_cache[i]; - const bool& point_selected = m_editing_mode ? m_editing_cache[i].selected : false; + const bool point_selected = m_editing_mode ? m_editing_cache[i].selected : false; - if (is_mesh_point_clipped(support_point.pos.cast())) + const bool clipped = is_mesh_point_clipped(support_point.pos.cast()); + if (i < m_point_raycasters.size()) { + m_point_raycasters[i].first->set_active(!clipped); + m_point_raycasters[i].second->set_active(!clipped); + } + if (clipped) continue; // First decide about the color of the point. - if (picking) - render_color = picking_color_component(i); - else { - if (size_t(m_hover_id) == i && m_editing_mode) // ignore hover state unless editing mode is active - render_color = { 0.f, 1.f, 1.f, 1.f }; - else { // neigher hover nor picking - bool supports_new_island = m_lock_unique_islands && support_point.is_new_island; - if (m_editing_mode) { - if (point_selected) - render_color = { 1.f, 0.3f, 0.3f, 1.f}; - else - if (supports_new_island) - render_color = { 0.3f, 0.3f, 1.f, 1.f }; - else - render_color = { 0.7f, 0.7f, 0.7f, 1.f }; - } + if (size_t(m_hover_id) == i && m_editing_mode) // ignore hover state unless editing mode is active + render_color = { 0.f, 1.f, 1.f, 1.f }; + else { // neigher hover nor picking + bool supports_new_island = m_lock_unique_islands && support_point.is_new_island; + if (m_editing_mode) { + if (point_selected) + render_color = { 1.f, 0.3f, 0.3f, 1.f}; else - render_color = { 0.5f, 0.5f, 0.5f, 1.f }; + if (supports_new_island) + render_color = { 0.3f, 0.3f, 1.f, 1.f }; + else + render_color = { 0.7f, 0.7f, 0.7f, 1.f }; } + else + render_color = { 0.5f, 0.5f, 0.5f, 1.f }; } - const_cast(&m_cone)->set_color(-1, render_color); - const_cast(&m_sphere)->set_color(-1, render_color); - if (shader && !picking) - shader->set_uniform("emission_factor", 0.5f); + m_cone.model.set_color(render_color); + m_sphere.model.set_color(render_color); + shader->set_uniform("emission_factor", 0.5f); // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. - glsafe(::glPushMatrix()); - glsafe(::glTranslatef(support_point.pos(0), support_point.pos(1), support_point.pos(2))); - glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); + const Transform3d support_matrix = Geometry::translation_transform(support_point.pos.cast()) * instance_scaling_matrix_inverse; - if (vol->is_left_handed()) - glFrontFace(GL_CW); + if (transformation.is_left_handed()) + glsafe(::glFrontFace(GL_CW)); // Matrices set, we can render the point mark now. // If in editing mode, we'll also render a cone pointing to the sphere. @@ -188,79 +223,30 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) m_c->raycaster()->raycaster()->get_closest_point(m_editing_cache[i].support_point.pos, &m_editing_cache[i].normal); Eigen::Quaterniond q; - q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * m_editing_cache[i].normal.cast()); - Eigen::AngleAxisd aa(q); - glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2))); - - const double cone_radius = 0.25; // mm - const double cone_height = 0.75; - glsafe(::glPushMatrix()); - glsafe(::glTranslatef(0.f, 0.f, cone_height + support_point.head_front_radius * RenderPointScale)); - glsafe(::glPushMatrix()); - glsafe(::glRotated(180., 1., 0., 0.)); - glsafe(::glScaled(cone_radius, cone_radius, cone_height)); - m_cone.render(); - glsafe(::glPopMatrix()); - glsafe(::glTranslatef(0.f, 0.f, cone_height)); - glsafe(::glPopMatrix()); + q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * m_editing_cache[i].normal.cast()); + const Eigen::AngleAxisd aa(q); + const Transform3d model_matrix = transformation.get_matrix() * support_matrix * Transform3d(aa.toRotationMatrix()) * + Geometry::translation_transform((CONE_HEIGHT + support_point.head_front_radius * RenderPointScale) * Vec3d::UnitZ()) * + Geometry::rotation_transform({ double(PI), 0.0, 0.0 }) * Geometry::scale_transform({ CONE_RADIUS, CONE_RADIUS, CONE_HEIGHT }); + + shader->set_uniform("view_model_matrix", view_matrix * model_matrix); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); + m_cone.model.render(); } - glsafe(::glPushMatrix()); - double radius = (double)support_point.head_front_radius * RenderPointScale; - glsafe(::glScaled(radius, radius, radius)); - m_sphere.render(); - glsafe(::glPopMatrix()); - - if (vol->is_left_handed()) - glFrontFace(GL_CCW); + const double radius = (double)support_point.head_front_radius * RenderPointScale; + const Transform3d model_matrix = transformation.get_matrix() * support_matrix * Geometry::scale_transform(radius); + shader->set_uniform("view_model_matrix", view_matrix * model_matrix); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); + m_sphere.model.render(); - glsafe(::glPopMatrix()); + if (transformation.is_left_handed()) + glsafe(::glFrontFace(GL_CCW)); } - - // Now render the drain holes: - if (has_holes && ! picking) { - render_color[0] = 0.7f; - render_color[1] = 0.7f; - render_color[2] = 0.7f; - render_color[3] = 0.7f; - const_cast(&m_cylinder)->set_color(-1, render_color); - if (shader) - shader->set_uniform("emission_factor", 0.5f); - for (const sla::DrainHole& drain_hole : m_c->selection_info()->model_object()->sla_drain_holes) { - if (is_mesh_point_clipped(drain_hole.pos.cast())) - continue; - - // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. - glsafe(::glPushMatrix()); - glsafe(::glTranslatef(drain_hole.pos(0), drain_hole.pos(1), drain_hole.pos(2))); - glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); - - if (vol->is_left_handed()) - glFrontFace(GL_CW); - - // Matrices set, we can render the point mark now. - - Eigen::Quaterniond q; - q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); - Eigen::AngleAxisd aa(q); - glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2))); - glsafe(::glPushMatrix()); - glsafe(::glTranslated(0., 0., -drain_hole.height)); - glsafe(::glScaled(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); - m_cylinder.render(); - glsafe(::glPopMatrix()); - - if (vol->is_left_handed()) - glFrontFace(GL_CCW); - glsafe(::glPopMatrix()); - } - } - - glsafe(::glPopMatrix()); } - - bool GLGizmoSlaSupports::is_mesh_point_clipped(const Vec3d& point) const { if (m_c->object_clipper()->get_position() == 0.) @@ -276,59 +262,6 @@ bool GLGizmoSlaSupports::is_mesh_point_clipped(const Vec3d& point) const return m_c->object_clipper()->get_clipping_plane()->is_point_clipped(transformed_point); } - - -// Unprojects the mouse position on the mesh and saves hit point and normal of the facet into pos_and_normal -// Return false if no intersection was found, true otherwise. -bool GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal) -{ - if (! m_c->raycaster()->raycaster()) - return false; - - const Camera& camera = wxGetApp().plater()->get_camera(); - const Selection& selection = m_parent.get_selection(); - const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); - Geometry::Transformation trafo = volume->get_instance_transformation() * volume->get_volume_transformation(); - trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_c->selection_info()->get_sla_shift())); - - double clp_dist = m_c->object_clipper()->get_position(); - const ClippingPlane* clp = m_c->object_clipper()->get_clipping_plane(); - - // The raycaster query - Vec3f hit; - Vec3f normal; - if (m_c->raycaster()->raycaster()->unproject_on_mesh( - mouse_pos, - trafo.get_matrix(), - camera, - hit, - normal, - clp_dist != 0. ? clp : nullptr)) - { - // Check whether the hit is in a hole - bool in_hole = false; - // In case the hollowed and drilled mesh is available, we can allow - // placing points in holes, because they should never end up - // on surface that's been drilled away. - if (! m_c->hollowed_mesh()->get_hollowed_mesh()) { - sla::DrainHoles drain_holes = m_c->selection_info()->model_object()->sla_drain_holes; - for (const sla::DrainHole& hole : drain_holes) { - if (hole.is_inside(hit)) { - in_hole = true; - break; - } - } - } - if (! in_hole) { - // Return both the point and the facet normal. - pos_and_normal = std::make_pair(hit, normal); - return true; - } - } - - return false; -} - // Following function is called from GLCanvas3D to inform the gizmo about a mouse/keyboard event. // The gizmo has an opportunity to react - if it does, it should return true so that the Canvas3D is // aware that the event was reacted to and stops trying to make different sense of it. If the gizmo @@ -344,7 +277,7 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous if (action == SLAGizmoEventType::LeftDown && (shift_down || alt_down || control_down)) { if (m_hover_id == -1) { if (shift_down || alt_down) { - m_selection_rectangle.start_dragging(mouse_position, shift_down ? GLSelectionRectangle::Select : GLSelectionRectangle::Deselect); + m_selection_rectangle.start_dragging(mouse_position, shift_down ? GLSelectionRectangle::EState::Select : GLSelectionRectangle::EState::Deselect); } } else { @@ -373,6 +306,8 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous m_editing_cache.emplace_back(sla::SupportPoint(pos_and_normal.first, m_new_point_head_diameter/2.f, false), false, pos_and_normal.second); m_parent.set_as_dirty(); m_wait_for_up_event = true; + unregister_point_raycasters_for_picking(); + register_point_raycasters_for_picking(); } else return false; @@ -397,7 +332,8 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous // Now ask the rectangle which of the points are inside. std::vector points_inside; - std::vector points_idxs = m_selection_rectangle.stop_dragging(m_parent, points); + std::vector points_idxs = m_selection_rectangle.contains(points); + m_selection_rectangle.stop_dragging(); for (size_t idx : points_idxs) points_inside.push_back(points[idx].cast()); @@ -410,12 +346,12 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous points_inside.emplace_back((trafo.get_matrix().cast() * (m_editing_cache[idx].support_point.pos + m_editing_cache[idx].normal)).cast()); for (size_t idx : m_c->raycaster()->raycaster()->get_unobscured_idxs( - trafo, wxGetApp().plater()->get_camera(), points_inside, + trafo, wxGetApp().plater()->get_camera(), points_inside, m_c->object_clipper()->get_clipping_plane())) { if (idx >= orig_pts_num) // this is a cone-base, get index of point it belongs to idx -= orig_pts_num; - if (rectangle_status == GLSelectionRectangle::Deselect) + if (rectangle_status == GLSelectionRectangle::EState::Deselect) unselect_point(points_idxs[idx]); else select_point(points_idxs[idx]); @@ -493,19 +429,19 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous if (action == SLAGizmoEventType::MouseWheelUp && control_down) { double pos = m_c->object_clipper()->get_position(); pos = std::min(1., pos + 0.01); - m_c->object_clipper()->set_position(pos, true); + m_c->object_clipper()->set_position_by_ratio(pos, true); return true; } if (action == SLAGizmoEventType::MouseWheelDown && control_down) { double pos = m_c->object_clipper()->get_position(); pos = std::max(0., pos - 0.01); - m_c->object_clipper()->set_position(pos, true); + m_c->object_clipper()->set_position_by_ratio(pos, true); return true; } if (action == SLAGizmoEventType::ResetClippingPlane) { - m_c->object_clipper()->set_position(-1., false); + m_c->object_clipper()->set_position_by_ratio(-1., false); return true; } @@ -527,25 +463,11 @@ void GLGizmoSlaSupports::delete_selected_points(bool force) } } + unregister_point_raycasters_for_picking(); + register_point_raycasters_for_picking(); select_point(NoPoints); } -void GLGizmoSlaSupports::on_update(const UpdateData& data) -{ - if (! m_editing_mode) - return; - else { - if (m_hover_id != -1 && (! m_editing_cache[m_hover_id].support_point.is_new_island || !m_lock_unique_islands)) { - std::pair pos_and_normal; - if (! unproject_on_mesh(data.mouse_pos.cast(), pos_and_normal)) - return; - m_editing_cache[m_hover_id].support_point.pos = pos_and_normal.first; - m_editing_cache[m_hover_id].support_point.is_new_island = false; - m_editing_cache[m_hover_id].normal = pos_and_normal.second; - } - } -} - std::vector GLGizmoSlaSupports::get_config_options(const std::vector& keys) const { std::vector out; @@ -641,8 +563,7 @@ void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_l float win_h = ImGui::GetWindowHeight(); y = std::min(y, bottom_limit - win_h); ImGui::SetWindowPos(ImVec2(x, y), ImGuiCond_Always); - if ((last_h != win_h) || (last_y != y)) - { + if (last_h != win_h || last_y != y) { // ask canvas for another frame to render the window in the correct position m_imgui->set_requires_extra_frame(); if (last_h != win_h) @@ -673,6 +594,7 @@ void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_l if (m_new_point_head_diameter > diameter_upper_cap) m_new_point_head_diameter = diameter_upper_cap; ImGui::AlignTextToFramePadding(); + m_imgui->text(m_desc.at("head_diameter")); ImGui::SameLine(diameter_slider_left); ImGui::PushItemWidth(window_width - diameter_slider_left); @@ -733,6 +655,8 @@ void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_l } } else { // not in editing mode: + m_imgui->disabled_begin(!is_input_enabled()); + ImGui::AlignTextToFramePadding(); m_imgui->text(m_desc.at("minimal_distance")); ImGui::SameLine(settings_sliders_left); @@ -782,7 +706,9 @@ void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_l if (m_imgui->button(m_desc.at("manual_editing"))) switch_to_editing_mode(); - m_imgui->disabled_begin(m_normal_cache.empty()); + m_imgui->disabled_end(); + + m_imgui->disabled_begin(!is_input_enabled() || m_normal_cache.empty()); remove_all = m_imgui->button(m_desc.at("remove_all")); m_imgui->disabled_end(); @@ -795,6 +721,7 @@ void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_l // Following is rendered in both editing and non-editing mode: + m_imgui->disabled_begin(!is_input_enabled()); ImGui::Separator(); if (m_c->object_clipper()->get_position() == 0.f) { ImGui::AlignTextToFramePadding(); @@ -803,7 +730,7 @@ void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_l else { if (m_imgui->button(m_desc.at("reset_direction"))) { wxGetApp().CallAfter([this](){ - m_c->object_clipper()->set_position(-1., false); + m_c->object_clipper()->set_position_by_ratio(-1., false); }); } } @@ -812,8 +739,7 @@ void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_l ImGui::PushItemWidth(window_width - clipping_slider_left); float clp_dist = m_c->object_clipper()->get_position(); if (m_imgui->slider_float("##clp_dist", &clp_dist, 0.f, 1.f, "%.2f")) - m_c->object_clipper()->set_position(clp_dist, true); - + m_c->object_clipper()->set_position_by_ratio(clp_dist, true); if (m_imgui->button("?")) { wxGetApp().CallAfter([]() { @@ -822,6 +748,8 @@ void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_l }); } + m_imgui->disabled_end(); + m_imgui->end(); if (remove_selected || remove_all) { @@ -854,7 +782,7 @@ bool GLGizmoSlaSupports::on_is_activable() const const Selection& selection = m_parent.get_selection(); if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA - || !selection.is_from_single_instance()) + || !selection.is_single_full_instance()) return false; // Check that none of the selected volumes is outside. Only SLA auxiliaries (supports) are allowed outside. @@ -876,19 +804,6 @@ std::string GLGizmoSlaSupports::on_get_name() const return _u8L("SLA Support Points"); } -CommonGizmosDataID GLGizmoSlaSupports::on_get_requirements() const -{ - return CommonGizmosDataID( - int(CommonGizmosDataID::SelectionInfo) - | int(CommonGizmosDataID::InstancesHider) - | int(CommonGizmosDataID::Raycaster) - | int(CommonGizmosDataID::HollowedMesh) - | int(CommonGizmosDataID::ObjectClipper) - | int(CommonGizmosDataID::SupportsClipper)); -} - - - void GLGizmoSlaSupports::ask_about_changes_call_after(std::function on_yes, std::function on_no) { wxGetApp().CallAfter([on_yes, on_no]() { @@ -928,6 +843,11 @@ void GLGizmoSlaSupports::on_set_state() disable_editing_mode(); // so it is not active next time the gizmo opens m_old_mo_id = -1; } + + if (m_state == Off) { + m_c->instances_hider()->set_hide_full_scene(false); + m_c->selection_info()->set_use_shift(false); // see top of on_render for details + } } m_old_state = m_state; } @@ -962,7 +882,21 @@ void GLGizmoSlaSupports::on_stop_dragging() m_point_before_drag = CacheEntry(); } +void GLGizmoSlaSupports::on_dragging(const UpdateData &data) +{ + assert(m_hover_id != -1); + if (!m_editing_mode) return; + if (m_editing_cache[m_hover_id].support_point.is_new_island && m_lock_unique_islands) + return; + + std::pair pos_and_normal; + if (!unproject_on_mesh(data.mouse_pos.cast(), pos_and_normal)) + return; + m_editing_cache[m_hover_id].support_point.pos = pos_and_normal.first; + m_editing_cache[m_hover_id].support_point.is_new_island = false; + m_editing_cache[m_hover_id].normal = pos_and_normal.second; +} void GLGizmoSlaSupports::on_load(cereal::BinaryInputArchive& ar) { @@ -998,7 +932,7 @@ void GLGizmoSlaSupports::select_point(int i) point_and_selection.selected = ( i == AllPoints ); m_selection_empty = (i == NoPoints); - if (i == AllPoints && ! m_editing_cache.empty()) + if (i == AllPoints && !m_editing_cache.empty()) m_new_point_head_diameter = m_editing_cache[0].support_point.head_front_radius * 2.f; } else { @@ -1059,7 +993,7 @@ void GLGizmoSlaSupports::editing_mode_apply_changes() mo->sla_support_points.clear(); mo->sla_support_points = m_normal_cache; - reslice_SLA_supports(); + reslice_until_step(slaposPad); } } @@ -1091,12 +1025,62 @@ bool GLGizmoSlaSupports::has_backend_supports() const return false; } -void GLGizmoSlaSupports::reslice_SLA_supports(bool postpone_error_messages) const +bool GLGizmoSlaSupports::on_mouse(const wxMouseEvent &mouse_event) { - wxGetApp().CallAfter([this, postpone_error_messages]() { - wxGetApp().plater()->reslice_SLA_supports( - *m_c->selection_info()->model_object(), postpone_error_messages); - }); + if (!is_input_enabled()) return true; + if (mouse_event.Moving()) return false; + if (!mouse_event.ShiftDown() && !mouse_event.AltDown() + && use_grabbers(mouse_event)) return true; + + // wxCoord == int --> wx/types.h + Vec2i mouse_coord(mouse_event.GetX(), mouse_event.GetY()); + Vec2d mouse_pos = mouse_coord.cast(); + + static bool pending_right_up = false; + if (mouse_event.LeftDown()) { + bool grabber_contains_mouse = (get_hover_id() != -1); + bool control_down = mouse_event.CmdDown(); + if ((!control_down || grabber_contains_mouse) && + gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false)) + return true; + } else if (mouse_event.Dragging()) { + bool control_down = mouse_event.CmdDown(); + if (m_parent.get_move_volume_id() != -1) { + // don't allow dragging objects with the Sla gizmo on + return true; + } else if (!control_down && + gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false)) { + // the gizmo got the event and took some action, no need to do + // anything more here + m_parent.set_as_dirty(); + return true; + } else if (control_down && (mouse_event.LeftIsDown() || mouse_event.RightIsDown())){ + // CTRL has been pressed while already dragging -> stop current action + if (mouse_event.LeftIsDown()) + gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true); + else if (mouse_event.RightIsDown()) + pending_right_up = false; + } + } else if (mouse_event.LeftUp() && !m_parent.is_mouse_dragging()) { + // in case SLA/FDM gizmo is selected, we just pass the LeftUp event + // and stop processing - neither object moving or selecting is + // suppressed in that case + gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), mouse_event.CmdDown()); + return true; + }else if (mouse_event.RightDown()){ + if (m_parent.get_selection().get_object_idx() != -1 && + gizmo_event(SLAGizmoEventType::RightDown, mouse_pos, false, false, false)) { + // we need to set the following right up as processed to avoid showing + // the context menu if the user release the mouse over the object + pending_right_up = true; + // event was taken care of by the SlaSupports gizmo + return true; + } + } else if (pending_right_up && mouse_event.RightUp()) { + pending_right_up = false; + return true; + } + return false; } void GLGizmoSlaSupports::get_data_from_backend() @@ -1110,7 +1094,7 @@ void GLGizmoSlaSupports::get_data_from_backend() if (po->model_object()->id() == mo->id()) { m_normal_cache.clear(); const std::vector& points = po->get_support_points(); - auto mat = (po->trafo() * po->model_object()->volumes.front()->get_transformation().get_matrix()).inverse().cast(); + auto mat = po->trafo().inverse().cast(); for (unsigned int i=0; isla_points_status != sla::PointsStatus::UserModified || m_normal_cache.empty() || dlg.ShowModal() == wxID_YES) { Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Autogenerate support points")); - wxGetApp().CallAfter([this]() { reslice_SLA_supports(); }); + wxGetApp().CallAfter([this]() { reslice_until_step(slaposPad); }); mo->sla_points_status = sla::PointsStatus::Generating; } } @@ -1151,8 +1135,7 @@ void GLGizmoSlaSupports::switch_to_editing_mode() for (const sla::SupportPoint& sp : m_normal_cache) m_editing_cache.emplace_back(sp); select_point(NoPoints); - - m_c->instances_hider()->show_supports(false); + register_point_raycasters_for_picking(); m_parent.set_as_dirty(); } @@ -1162,8 +1145,8 @@ void GLGizmoSlaSupports::disable_editing_mode() if (m_editing_mode) { m_editing_mode = false; wxGetApp().plater()->leave_gizmos_stack(); - m_c->instances_hider()->show_supports(true); m_parent.set_as_dirty(); + unregister_point_raycasters_for_picking(); } wxGetApp().plater()->get_notification_manager()->close_notification_of_type(NotificationType::QuitSLAManualMode); } @@ -1182,6 +1165,66 @@ bool GLGizmoSlaSupports::unsaved_changes() const return false; } +void GLGizmoSlaSupports::register_point_raycasters_for_picking() +{ + assert(m_point_raycasters.empty()); + + if (m_editing_mode && !m_editing_cache.empty()) { + for (size_t i = 0; i < m_editing_cache.size(); ++i) { + m_point_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, i, *m_sphere.mesh_raycaster, Transform3d::Identity()), + m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, i, *m_cone.mesh_raycaster, Transform3d::Identity())); + } + update_point_raycasters_for_picking_transform(); + } +} + +void GLGizmoSlaSupports::unregister_point_raycasters_for_picking() +{ + for (size_t i = 0; i < m_point_raycasters.size(); ++i) { + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, i); + } + m_point_raycasters.clear(); +} + +void GLGizmoSlaSupports::update_point_raycasters_for_picking_transform() +{ + if (m_editing_cache.empty()) + return; + + assert(!m_point_raycasters.empty()); + + const GLVolume* vol = m_parent.get_selection().get_first_volume(); + Geometry::Transformation transformation(vol->world_matrix()); + + auto *inst = m_c->selection_info()->model_instance(); + if (inst && m_c->selection_info() && m_c->selection_info()->print_object()) { + double shift_z = m_c->selection_info()->print_object()->get_current_elevation(); + auto trafo = inst->get_transformation().get_matrix(); + trafo.translation()(2) += shift_z; + transformation.set_matrix(trafo); + } + + const Transform3d instance_scaling_matrix_inverse = transformation.get_scaling_factor_matrix().inverse(); + for (size_t i = 0; i < m_editing_cache.size(); ++i) { + const Transform3d support_matrix = Geometry::translation_transform(m_editing_cache[i].support_point.pos.cast()) * instance_scaling_matrix_inverse; + + if (m_editing_cache[i].normal == Vec3f::Zero()) + m_c->raycaster()->raycaster()->get_closest_point(m_editing_cache[i].support_point.pos, &m_editing_cache[i].normal); + + Eigen::Quaterniond q; + q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * m_editing_cache[i].normal.cast()); + const Eigen::AngleAxisd aa(q); + const Transform3d cone_matrix = transformation.get_matrix() * support_matrix * Transform3d(aa.toRotationMatrix()) * + Geometry::assemble_transform((CONE_HEIGHT + m_editing_cache[i].support_point.head_front_radius * RenderPointScale) * Vec3d::UnitZ(), + Vec3d(PI, 0.0, 0.0), Vec3d(CONE_RADIUS, CONE_RADIUS, CONE_HEIGHT)); + m_point_raycasters[i].second->set_transform(cone_matrix); + + const double radius = (double)m_editing_cache[i].support_point.head_front_radius * RenderPointScale; + const Transform3d sphere_matrix = transformation.get_matrix() * support_matrix * Geometry::scale_transform(radius); + m_point_raycasters[i].first->set_transform(sphere_matrix); + } +} + SlaGizmoHelpDialog::SlaGizmoHelpDialog() : wxDialog(nullptr, wxID_ANY, _L("SLA gizmo keyboard shortcuts"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER) { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp index 35e6a73089c..bb0513682ce 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp @@ -1,8 +1,9 @@ #ifndef slic3r_GLGizmoSlaSupports_hpp_ #define slic3r_GLGizmoSlaSupports_hpp_ -#include "GLGizmoBase.hpp" +#include "GLGizmoSlaBase.hpp" #include "slic3r/GUI/GLSelectionRectangle.hpp" +#include "slic3r/GUI/I18N.hpp" #include "libslic3r/SLA/SupportPoint.hpp" #include "libslic3r/ObjectID.hpp" @@ -16,16 +17,13 @@ namespace Slic3r { class ConfigOption; namespace GUI { - +class Selection; enum class SLAGizmoEventType : unsigned char; -class GLGizmoSlaSupports : public GLGizmoBase +class GLGizmoSlaSupports : public GLGizmoSlaBase { private: - - bool unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal); - - const float RenderPointScale = 1.f; + static constexpr float RenderPointScale = 1.f; class CacheEntry { public: @@ -57,28 +55,37 @@ class GLGizmoSlaSupports : public GLGizmoBase public: GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); virtual ~GLGizmoSlaSupports() = default; - void set_sla_support_data(ModelObject* model_object, const Selection& selection); + void data_changed() override; bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); void delete_selected_points(bool force = false); //ClippingPlane get_sla_clipping_plane() const; - bool is_in_editing_mode() const { return m_editing_mode; } - bool is_selection_rectangle_dragging() const { return m_selection_rectangle.is_dragging(); } + bool is_in_editing_mode() const override { return m_editing_mode; } + bool is_selection_rectangle_dragging() const override { return m_selection_rectangle.is_dragging(); } bool has_backend_supports() const; - void reslice_SLA_supports(bool postpone_error_messages = false) const; bool wants_enter_leave_snapshots() const override { return true; } std::string get_gizmo_entering_text() const override { return _u8L("Entering SLA support points"); } std::string get_gizmo_leaving_text() const override { return _u8L("Leaving SLA support points"); } + + /// + /// Process mouse event + /// + /// Keep information about mouse click + /// Return True when use the information otherwise False. + bool on_mouse(const wxMouseEvent &mouse_event) override; private: bool on_init() override; - void on_update(const UpdateData& data) override; void on_render() override; - void on_render_for_picking() override; + virtual void on_register_raycasters_for_picking() override; + virtual void on_unregister_raycasters_for_picking() override; - void render_points(const Selection& selection, bool picking = false) const; + void render_points(const Selection& selection); bool unsaved_changes() const; + void register_point_raycasters_for_picking(); + void unregister_point_raycasters_for_picking(); + void update_point_raycasters_for_picking_transform(); bool m_lock_unique_islands = false; bool m_editing_mode = false; // Is editing mode active? @@ -91,6 +98,10 @@ class GLGizmoSlaSupports : public GLGizmoBase std::vector m_normal_cache; // to restore after discarding changes or undo/redo ObjectID m_old_mo_id; + PickingModel m_sphere; + PickingModel m_cone; + std::vector, std::shared_ptr>> m_point_raycasters; + // This map holds all translated description texts, so they can be easily referenced during layout calculations // etc. When language changes, GUI is recreated and this class constructed again, so the change takes effect. std::map m_desc; @@ -103,7 +114,6 @@ class GLGizmoSlaSupports : public GLGizmoBase std::vector get_config_options(const std::vector& keys) const; bool is_mesh_point_clipped(const Vec3d& point) const; - bool is_point_in_hole(const Vec3f& pt) const; //void find_intersecting_facets(const igl::AABB* aabb, const Vec3f& normal, double offset, std::vector& out) const; // Methods that do the model_object and editing cache synchronization, @@ -125,20 +135,18 @@ class GLGizmoSlaSupports : public GLGizmoBase protected: void on_set_state() override; - void on_set_hover_id() override - - { + void on_set_hover_id() override { if (! m_editing_mode || (int)m_editing_cache.size() <= m_hover_id) m_hover_id = -1; } void on_start_dragging() override; void on_stop_dragging() override; + void on_dragging(const UpdateData &data) override; void on_render_input_window(float x, float y, float bottom_limit) override; std::string on_get_name() const override; bool on_is_activable() const override; bool on_is_selectable() const override; - virtual CommonGizmosDataID on_get_requirements() const override; void on_load(cereal::BinaryInputArchive& ar) override; void on_save(cereal::BinaryOutputArchive& ar) const override; }; diff --git a/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp b/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp index 4488715a8d5..debb2253583 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp @@ -23,7 +23,7 @@ CommonGizmosDataPool::CommonGizmosDataPool(GLCanvas3D* canvas) using c = CommonGizmosDataID; m_data[c::SelectionInfo].reset( new SelectionInfo(this)); m_data[c::InstancesHider].reset( new InstancesHider(this)); - m_data[c::HollowedMesh].reset( new HollowedMesh(this)); +// m_data[c::HollowedMesh].reset( new HollowedMesh(this)); m_data[c::Raycaster].reset( new Raycaster(this)); m_data[c::ObjectClipper].reset( new ObjectClipper(this)); m_data[c::SupportsClipper].reset( new SupportsClipper(this)); @@ -59,13 +59,6 @@ InstancesHider* CommonGizmosDataPool::instances_hider() const return inst_hider->is_valid() ? inst_hider : nullptr; } -HollowedMesh* CommonGizmosDataPool::hollowed_mesh() const -{ - HollowedMesh* hol_mesh = dynamic_cast(m_data.at(CommonGizmosDataID::HollowedMesh).get()); - assert(hol_mesh); - return hol_mesh->is_valid() ? hol_mesh : nullptr; -} - Raycaster* CommonGizmosDataPool::raycaster() const { Raycaster* rc = dynamic_cast(m_data.at(CommonGizmosDataID::Raycaster).get()); @@ -117,23 +110,35 @@ bool CommonGizmosDataPool::check_dependencies(CommonGizmosDataID required) const void SelectionInfo::on_update() { const Selection& selection = get_pool()->get_canvas()->get_selection(); + + m_model_object = nullptr; + m_print_object = nullptr; + if (selection.is_single_full_instance()) { m_model_object = selection.get_model()->objects[selection.get_object_idx()]; - m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); + if (m_model_object) + m_print_object = get_pool()->get_canvas()->sla_print()->get_print_object_by_model_object_id(m_model_object->id()); + + m_z_shift = m_print_object ? m_print_object->get_current_elevation() : selection.get_first_volume()->get_sla_shift_z(); } - else - m_model_object = nullptr; } void SelectionInfo::on_release() { m_model_object = nullptr; + m_model_volume = nullptr; +} + +ModelInstance *SelectionInfo::model_instance() const +{ + int inst_idx = get_active_instance(); + return inst_idx < int(m_model_object->instances.size()) ? + m_model_object->instances[get_active_instance()] : nullptr; } int SelectionInfo::get_active_instance() const { - const Selection& selection = get_pool()->get_canvas()->get_selection(); - return selection.get_instance_idx(); + return get_pool()->get_canvas()->get_selection().get_instance_idx(); } @@ -148,8 +153,10 @@ void InstancesHider::on_update() if (mo && active_inst != -1) { canvas->toggle_model_objects_visibility(false); - canvas->toggle_model_objects_visibility(true, mo, active_inst); - canvas->toggle_sla_auxiliaries_visibility(m_show_supports, mo, active_inst); + if (!m_hide_full_scene) { + canvas->toggle_model_objects_visibility(true, mo, active_inst); + canvas->toggle_sla_auxiliaries_visibility(false, mo, active_inst); + } canvas->set_use_clipping_planes(true); // Some objects may be sinking, do not show whatever is below the bed. canvas->set_clipping_plane(0, ClippingPlane(Vec3d::UnitZ(), -SINKING_Z_THRESHOLD)); @@ -165,7 +172,7 @@ void InstancesHider::on_update() for (const TriangleMesh* mesh : meshes) { m_clippers.emplace_back(new MeshClipper); m_clippers.back()->set_plane(ClippingPlane(-Vec3d::UnitZ(), -SINKING_Z_THRESHOLD)); - m_clippers.back()->set_mesh(*mesh); + m_clippers.back()->set_mesh(mesh->its); } m_old_meshes = meshes; } @@ -182,9 +189,10 @@ void InstancesHider::on_release() m_clippers.clear(); } -void InstancesHider::show_supports(bool show) { - if (m_show_supports != show) { - m_show_supports = show; +void InstancesHider::set_hide_full_scene(bool hide) +{ + if (m_hide_full_scene != hide) { + m_hide_full_scene = hide; on_update(); } } @@ -209,131 +217,75 @@ void InstancesHider::render_cut() const ClippingPlane clp = *get_pool()->object_clipper()->get_clipping_plane(); clp.set_normal(-clp.get_normal()); clipper->set_limiting_plane(clp); - } else + } + else clipper->set_limiting_plane(ClippingPlane::ClipsNothing()); - glsafe(::glPushMatrix()); - if (mv->is_model_part()) - glsafe(::glColor3f(0.8f, 0.3f, 0.0f)); - else { - const std::array& c = color_from_model_volume(*mv); - glsafe(::glColor4f(c[0], c[1], c[2], c[3])); - } +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + bool depth_test_enabled = ::glIsEnabled(GL_DEPTH_TEST); +#else glsafe(::glPushAttrib(GL_DEPTH_TEST)); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES glsafe(::glDisable(GL_DEPTH_TEST)); - clipper->render_cut(); + clipper->render_cut(mv->is_model_part() ? ColorRGBA(0.8f, 0.3f, 0.0f, 1.0f) : color_from_model_volume(*mv)); +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + if (depth_test_enabled) + glsafe(::glEnable(GL_DEPTH_TEST)); +#else glsafe(::glPopAttrib()); - glsafe(::glPopMatrix()); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES ++clipper_id; } } - -void HollowedMesh::on_update() -{ - const ModelObject* mo = get_pool()->selection_info()->model_object(); - bool is_sla = wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology() == ptSLA; - if (! mo || ! is_sla) - return; - - const GLCanvas3D* canvas = get_pool()->get_canvas(); - const PrintObjects& print_objects = canvas->sla_print()->objects(); - const SLAPrintObject* print_object = m_print_object_idx != -1 - ? print_objects[m_print_object_idx] - : nullptr; - - // Find the respective SLAPrintObject. - if (m_print_object_idx < 0 || m_print_objects_count != int(print_objects.size())) { - m_print_objects_count = print_objects.size(); - m_print_object_idx = -1; - for (const SLAPrintObject* po : print_objects) { - ++m_print_object_idx; - if (po->model_object()->id() == mo->id()) { - print_object = po; - break; - } - } - } - - // If there is a valid SLAPrintObject, check state of Hollowing step. - if (print_object) { - if (print_object->is_step_done(slaposDrillHoles) && print_object->has_mesh(slaposDrillHoles)) { - size_t timestamp = print_object->step_state_with_timestamp(slaposDrillHoles).timestamp; - if (timestamp > m_old_hollowing_timestamp) { - const TriangleMesh& backend_mesh = print_object->get_mesh_to_slice(); - if (! backend_mesh.empty()) { - m_hollowed_mesh_transformed.reset(new TriangleMesh(backend_mesh)); - Transform3d trafo_inv = (canvas->sla_print()->sla_trafo(*mo) * print_object->model_object()->volumes.front()->get_transformation().get_matrix()).inverse(); - m_hollowed_mesh_transformed->transform(trafo_inv); - m_drainholes = print_object->model_object()->sla_drain_holes; - m_old_hollowing_timestamp = timestamp; - - indexed_triangle_set interior = print_object->hollowed_interior_mesh(); - its_flip_triangles(interior); - m_hollowed_interior_transformed = std::make_unique(std::move(interior)); - m_hollowed_interior_transformed->transform(trafo_inv); - } - else { - m_hollowed_mesh_transformed.reset(nullptr); - } - } - } - else - m_hollowed_mesh_transformed.reset(nullptr); - } -} - - -void HollowedMesh::on_release() -{ - m_hollowed_mesh_transformed.reset(); - m_old_hollowing_timestamp = 0; - m_print_object_idx = -1; -} - - -const TriangleMesh* HollowedMesh::get_hollowed_mesh() const -{ - return m_hollowed_mesh_transformed.get(); -} - -const TriangleMesh* HollowedMesh::get_hollowed_interior() const -{ - return m_hollowed_interior_transformed.get(); -} - - - - void Raycaster::on_update() { wxBusyCursor wait; const ModelObject* mo = get_pool()->selection_info()->model_object(); + const ModelVolume* mv = get_pool()->selection_info()->model_volume(); - if (! mo) + if (mo == nullptr && mv == nullptr) return; + std::vector mvs; + if (mv != nullptr) + mvs.push_back(const_cast(mv)); + else + mvs = mo->volumes; + std::vector meshes; - const std::vector& mvs = mo->volumes; - if (mvs.size() == 1) { - assert(mvs.front()->is_model_part()); - const HollowedMesh* hollowed_mesh_tracker = get_pool()->hollowed_mesh(); - if (hollowed_mesh_tracker && hollowed_mesh_tracker->get_hollowed_mesh()) - meshes.push_back(hollowed_mesh_tracker->get_hollowed_mesh()); + bool force_raycaster_regeneration = false; + if (wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology() == ptSLA) { + // For sla printers we use the mesh generated by the backend + std::shared_ptr preview_mesh_ptr; + const SLAPrintObject* po = get_pool()->selection_info()->print_object(); + if (po) + preview_mesh_ptr = po->get_mesh_to_print(); + + if (preview_mesh_ptr) + m_sla_mesh_cache = TriangleMesh{*preview_mesh_ptr}; + + if (!m_sla_mesh_cache.empty()) { + m_sla_mesh_cache.transform(po->trafo().inverse()); + meshes.emplace_back(&m_sla_mesh_cache); + force_raycaster_regeneration = true; + } } + if (meshes.empty()) { + const std::vector& mvs = mo->volumes; for (const ModelVolume* mv : mvs) { if (mv->is_model_part()) meshes.push_back(&mv->mesh()); } } - if (meshes != m_old_meshes) { + if (force_raycaster_regeneration || meshes != m_old_meshes) { m_raycasters.clear(); for (const TriangleMesh* mesh : meshes) - m_raycasters.emplace_back(new MeshRaycaster(*mesh)); + m_raycasters.emplace_back(new MeshRaycaster(std::make_shared(*mesh))); m_old_meshes = meshes; } } @@ -352,8 +304,9 @@ std::vector Raycaster::raycasters() const return mrcs; } +} // namespace GUI - +namespace GUI { void ObjectClipper::on_update() @@ -364,24 +317,42 @@ void ObjectClipper::on_update() // which mesh should be cut? std::vector meshes; - bool has_hollowed = get_pool()->hollowed_mesh() && get_pool()->hollowed_mesh()->get_hollowed_mesh(); - if (has_hollowed) - meshes.push_back(get_pool()->hollowed_mesh()->get_hollowed_mesh()); + std::vector trafos; + bool force_clipper_regeneration = false; + + std::unique_ptr mc; + Geometry::Transformation mc_tr; + if (wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology() == ptSLA) { + // For sla printers we use the mesh generated by the backend + const SLAPrintObject* po = get_pool()->selection_info()->print_object(); + if (po) { + auto partstoslice = po->get_parts_to_slice(); + if (! partstoslice.empty()) { + mc = std::make_unique(); + mc->set_mesh(range(partstoslice)); + mc_tr = Geometry::Transformation{po->trafo().inverse().cast()}; + } + } + } - if (meshes.empty()) - for (const ModelVolume* mv : mo->volumes) - meshes.push_back(&mv->mesh()); + if (!mc && meshes.empty()) { + for (const ModelVolume* mv : mo->volumes) { + meshes.emplace_back(&mv->mesh()); + trafos.emplace_back(mv->get_transformation()); + } + } - if (meshes != m_old_meshes) { + if (mc || force_clipper_regeneration || meshes != m_old_meshes) { m_clippers.clear(); - for (const TriangleMesh* mesh : meshes) { - m_clippers.emplace_back(new MeshClipper); - m_clippers.back()->set_mesh(*mesh); + for (size_t i = 0; i < meshes.size(); ++i) { + m_clippers.emplace_back(new MeshClipper, trafos[i]); + m_clippers.back().first->set_mesh(meshes[i]->its); } - m_old_meshes = meshes; + m_old_meshes = std::move(meshes); - if (has_hollowed) - m_clippers.front()->set_negative_mesh(*get_pool()->hollowed_mesh()->get_hollowed_interior()); + if (mc) { + m_clippers.emplace_back(std::move(mc), mc_tr); + } m_active_inst_bb_radius = mo->instance_bounding_box(get_pool()->selection_info()->get_active_instance()).radius(); @@ -403,30 +374,30 @@ void ObjectClipper::render_cut() const if (m_clp_ratio == 0.) return; const SelectionInfo* sel_info = get_pool()->selection_info(); - const ModelObject* mo = sel_info->model_object(); - Geometry::Transformation inst_trafo = mo->instances[sel_info->get_active_instance()]->get_transformation(); - - size_t clipper_id = 0; - for (const ModelVolume* mv : mo->volumes) { - Geometry::Transformation vol_trafo = mv->get_transformation(); - Geometry::Transformation trafo = inst_trafo * vol_trafo; - trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., sel_info->get_sla_shift())); - - auto& clipper = m_clippers[clipper_id]; - clipper->set_plane(*m_clp); - clipper->set_transformation(trafo); - clipper->set_limiting_plane(ClippingPlane(Vec3d::UnitZ(), -SINKING_Z_THRESHOLD)); - glsafe(::glPushMatrix()); - glsafe(::glColor3f(1.0f, 0.37f, 0.0f)); - clipper->render_cut(); - glsafe(::glPopMatrix()); - - ++clipper_id; + const Geometry::Transformation inst_trafo = sel_info->model_object()->instances[sel_info->get_active_instance()]->get_transformation(); + + for (auto& clipper : m_clippers) { + Geometry::Transformation trafo = inst_trafo * clipper.second; + trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., sel_info->get_sla_shift())); + clipper.first->set_plane(*m_clp); + clipper.first->set_transformation(trafo); + clipper.first->set_limiting_plane(ClippingPlane(Vec3d::UnitZ(), -SINKING_Z_THRESHOLD)); + clipper.first->render_cut({ 1.0f, 0.37f, 0.0f, 1.0f }); + clipper.first->render_contour({ 1.f, 1.f, 1.f, 1.f }); } } +bool ObjectClipper::is_projection_inside_cut(const Vec3d& point) const +{ + return m_clp_ratio != 0. && std::any_of(m_clippers.begin(), m_clippers.end(), [point](const auto& cl) { return cl.first->is_projection_inside_cut(point); }); +} -void ObjectClipper::set_position(double pos, bool keep_normal) +bool ObjectClipper::has_valid_contour() const +{ + return m_clp_ratio != 0. && std::any_of(m_clippers.begin(), m_clippers.end(), [](const auto& cl) { return cl.first->has_valid_contour(); }); +} + +void ObjectClipper::set_position_by_ratio(double pos, bool keep_normal) { const ModelObject* mo = get_pool()->selection_info()->model_object(); int active_inst = get_pool()->selection_info()->get_active_instance(); @@ -444,7 +415,36 @@ void ObjectClipper::set_position(double pos, bool keep_normal) get_pool()->get_canvas()->set_as_dirty(); } +void ObjectClipper::set_range_and_pos(const Vec3d& cpl_normal, double cpl_offset, double pos) +{ + m_clp.reset(new ClippingPlane(cpl_normal, cpl_offset)); + m_clp_ratio = pos; + get_pool()->get_canvas()->set_as_dirty(); +} +const ClippingPlane* ObjectClipper::get_clipping_plane(bool ignore_hide_clipped) const +{ + static const ClippingPlane no_clip = ClippingPlane::ClipsNothing(); + return (ignore_hide_clipped || m_hide_clipped) ? m_clp.get() : &no_clip; +} + +void ObjectClipper::set_behavior(bool hide_clipped, bool fill_cut, double contour_width) +{ + m_hide_clipped = hide_clipped; + for (auto& clipper : m_clippers) + clipper.first->set_behaviour(fill_cut, contour_width); +} + +void ObjectClipper::pass_mouse_click(const Vec3d& pt) +{ + for (auto& clipper : m_clippers) + clipper.first->pass_mouse_click(pt); +} + +std::vector ObjectClipper::get_disabled_contours() const +{ + return std::vector(); +} void SupportsClipper::on_update() { @@ -453,86 +453,74 @@ void SupportsClipper::on_update() if (! mo || ! is_sla) return; - const GLCanvas3D* canvas = get_pool()->get_canvas(); - const PrintObjects& print_objects = canvas->sla_print()->objects(); - const SLAPrintObject* print_object = m_print_object_idx != -1 - ? print_objects[m_print_object_idx] - : nullptr; - - // Find the respective SLAPrintObject. - if (m_print_object_idx < 0 || m_print_objects_count != int(print_objects.size())) { - m_print_objects_count = print_objects.size(); - m_print_object_idx = -1; - for (const SLAPrintObject* po : print_objects) { - ++m_print_object_idx; - if (po->model_object()->id() == mo->id()) { - print_object = po; - break; - } - } + const SLAPrintObject* po = get_pool()->selection_info()->print_object(); + if (po == nullptr) + return; + + if (po->get_mesh_to_print() == nullptr) { + // The object has been not sliced yet. We better dump the cached data. + m_supports_clipper.reset(); + m_pad_clipper.reset(); + return; } - if (print_object - && print_object->is_step_done(slaposSupportTree) - && ! print_object->support_mesh().empty()) - { - // If the supports are already calculated, save the timestamp of the respective step - // so we can later tell they were recalculated. - size_t timestamp = print_object->step_state_with_timestamp(slaposSupportTree).timestamp; - if (! m_clipper || timestamp != m_old_timestamp) { - // The timestamp has changed. - m_clipper.reset(new MeshClipper); - // The mesh should already have the shared vertices calculated. - m_clipper->set_mesh(print_object->support_mesh()); - m_old_timestamp = timestamp; - } + const TriangleMesh& support_mesh = po->support_mesh(); + if (support_mesh.empty()) { + // The supports are not available yet. We better dump the cached data. + m_supports_clipper.reset(); + } + else { + m_supports_clipper.reset(new MeshClipper); + m_supports_clipper->set_mesh(support_mesh.its); + } + + const TriangleMesh& pad_mesh = po->pad_mesh(); + if (pad_mesh.empty()) { + // The supports are not available yet. We better dump the cached data. + m_pad_clipper.reset(); + } + else { + m_pad_clipper.reset(new MeshClipper); + m_pad_clipper->set_mesh(pad_mesh.its); } - else - // The supports are not valid. We better dump the cached data. - m_clipper.reset(); } void SupportsClipper::on_release() { - m_clipper.reset(); - m_old_timestamp = 0; + m_supports_clipper.reset(); + m_pad_clipper.reset(); m_print_object_idx = -1; } void SupportsClipper::render_cut() const { const CommonGizmosDataObjects::ObjectClipper* ocl = get_pool()->object_clipper(); - if (ocl->get_position() == 0. - || ! get_pool()->instances_hider()->are_supports_shown() - || ! m_clipper) + if (ocl->get_position() == 0.) + return; + + const SLAPrintObject* po = get_pool()->selection_info()->print_object(); + if (po == nullptr) return; + Geometry::Transformation po_trafo(po->trafo()); + const SelectionInfo* sel_info = get_pool()->selection_info(); - const ModelObject* mo = sel_info->model_object(); - Geometry::Transformation inst_trafo = mo->instances[sel_info->get_active_instance()]->get_transformation(); - //Geometry::Transformation vol_trafo = mo->volumes.front()->get_transformation(); - Geometry::Transformation trafo = inst_trafo;// * vol_trafo; - trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., sel_info->get_sla_shift())); - - - // Get transformation of supports - Geometry::Transformation supports_trafo = trafo; - supports_trafo.set_scaling_factor(Vec3d::Ones()); - supports_trafo.set_offset(Vec3d(trafo.get_offset()(0), trafo.get_offset()(1), sel_info->get_sla_shift())); - supports_trafo.set_rotation(Vec3d(0., 0., trafo.get_rotation()(2))); - // I don't know why, but following seems to be correct. - supports_trafo.set_mirror(Vec3d(trafo.get_mirror()(0) * trafo.get_mirror()(1) * trafo.get_mirror()(2), - 1, - 1.)); - - m_clipper->set_plane(*ocl->get_clipping_plane()); - m_clipper->set_transformation(supports_trafo); - - glsafe(::glPushMatrix()); - glsafe(::glColor3f(1.0f, 0.f, 0.37f)); - m_clipper->render_cut(); - glsafe(::glPopMatrix()); + Geometry::Transformation inst_trafo = sel_info->model_object()->instances[sel_info->get_active_instance()]->get_transformation(); + inst_trafo = Geometry::Transformation(inst_trafo.get_matrix() * po_trafo.get_matrix().inverse()); + inst_trafo.set_offset(inst_trafo.get_offset() + Vec3d(0.0, 0.0, sel_info->get_sla_shift())); + + if (m_supports_clipper != nullptr) { + m_supports_clipper->set_plane(*ocl->get_clipping_plane()); + m_supports_clipper->set_transformation(inst_trafo); + m_supports_clipper->render_cut({ 1.0f, 0.f, 0.37f, 1.0f }); + } + + if (m_pad_clipper != nullptr) { + m_pad_clipper->set_plane(*ocl->get_clipping_plane()); + m_pad_clipper->set_transformation(inst_trafo); + m_pad_clipper->render_cut({ 0.6f, 0.f, 0.222f, 1.0f }); + } } diff --git a/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp b/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp index 228f5b58c3e..785c6607668 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp @@ -5,12 +5,13 @@ #include #include "slic3r/GUI/MeshUtils.hpp" -#include "libslic3r/SLA/Hollowing.hpp" namespace Slic3r { class ModelObject; - +class ModelInstance; +class SLAPrintObject; +class ModelVolume; namespace GUI { @@ -24,8 +25,12 @@ enum class SLAGizmoEventType : unsigned char { Dragging, Delete, SelectAll, + CtrlDown, + CtrlUp, + ShiftDown, ShiftUp, AltUp, + Escape, ApplyChanges, DiscardChanges, AutomaticGeneration, @@ -60,7 +65,6 @@ enum class CommonGizmosDataID { None = 0, SelectionInfo = 1 << 0, InstancesHider = 1 << 1, - HollowedMesh = 1 << 2, Raycaster = 1 << 3, ObjectClipper = 1 << 4, SupportsClipper = 1 << 5, @@ -73,7 +77,7 @@ enum class CommonGizmosDataID { // by GLGizmoManager, the gizmos keep a pointer to it. class CommonGizmosDataPool { public: - CommonGizmosDataPool(GLCanvas3D* canvas); + explicit CommonGizmosDataPool(GLCanvas3D* canvas); // Update all resources and release what is not used. // Accepts a bitmask of currently required resources. @@ -82,7 +86,7 @@ class CommonGizmosDataPool { // Getters for the data that need to be accessed from the gizmos directly. CommonGizmosDataObjects::SelectionInfo* selection_info() const; CommonGizmosDataObjects::InstancesHider* instances_hider() const; - CommonGizmosDataObjects::HollowedMesh* hollowed_mesh() const; +// CommonGizmosDataObjects::HollowedMesh* hollowed_mesh() const; CommonGizmosDataObjects::Raycaster* raycaster() const; CommonGizmosDataObjects::ObjectClipper* object_clipper() const; CommonGizmosDataObjects::SupportsClipper* supports_clipper() const; @@ -134,7 +138,6 @@ class CommonGizmosDataBase { virtual void on_update() = 0; CommonGizmosDataPool* get_pool() const { return m_common; } - private: bool m_is_valid = false; CommonGizmosDataPool* m_common = nullptr; @@ -153,9 +156,15 @@ class SelectionInfo : public CommonGizmosDataBase explicit SelectionInfo(CommonGizmosDataPool* cgdp) : CommonGizmosDataBase(cgdp) {} + // Returns a non-null pointer if the selection is a single full instance ModelObject* model_object() const { return m_model_object; } + const SLAPrintObject *print_object() const { return m_print_object; } + // Returns a non-null pointer if the selection is a single volume + ModelVolume* model_volume() const { return m_model_volume; } + ModelInstance *model_instance() const; int get_active_instance() const; - float get_sla_shift() const { return m_z_shift; } + float get_sla_shift() const { return m_use_shift ? m_z_shift : 0.f; } + void set_use_shift(bool use) { m_use_shift = use; } protected: void on_update() override; @@ -163,8 +172,11 @@ class SelectionInfo : public CommonGizmosDataBase private: ModelObject* m_model_object = nullptr; + const SLAPrintObject *m_print_object = nullptr; + ModelVolume* m_model_volume = nullptr; // int m_active_inst = -1; float m_z_shift = 0.f; + bool m_use_shift = false; }; @@ -178,8 +190,7 @@ class InstancesHider : public CommonGizmosDataBase CommonGizmosDataID get_dependencies() const override { return CommonGizmosDataID::SelectionInfo; } #endif // NDEBUG - void show_supports(bool show); - bool are_supports_shown() const { return m_show_supports; } + void set_hide_full_scene(bool hide); void render_cut() const; protected: @@ -187,42 +198,13 @@ class InstancesHider : public CommonGizmosDataBase void on_release() override; private: - bool m_show_supports = false; + bool m_hide_full_scene{ false }; std::vector m_old_meshes; std::vector> m_clippers; }; -class HollowedMesh : public CommonGizmosDataBase -{ -public: - explicit HollowedMesh(CommonGizmosDataPool* cgdp) - : CommonGizmosDataBase(cgdp) {} -#ifndef NDEBUG - CommonGizmosDataID get_dependencies() const override { return CommonGizmosDataID::SelectionInfo; } -#endif // NDEBUG - - const sla::DrainHoles &get_drainholes() const { return m_drainholes; } - - const TriangleMesh* get_hollowed_mesh() const; - const TriangleMesh* get_hollowed_interior() const; - -protected: - void on_update() override; - void on_release() override; - -private: - std::unique_ptr m_hollowed_mesh_transformed; - std::unique_ptr m_hollowed_interior_transformed; - size_t m_old_hollowing_timestamp = 0; - int m_print_object_idx = -1; - int m_print_objects_count = 0; - sla::DrainHoles m_drainholes; -}; - - - class Raycaster : public CommonGizmosDataBase { public: @@ -242,6 +224,8 @@ class Raycaster : public CommonGizmosDataBase private: std::vector> m_raycasters; std::vector m_old_meshes; + // Used to store the sla mesh coming from the backend + TriangleMesh m_sla_mesh_cache; }; @@ -255,10 +239,19 @@ class ObjectClipper : public CommonGizmosDataBase CommonGizmosDataID get_dependencies() const override { return CommonGizmosDataID::SelectionInfo; } #endif // NDEBUG - void set_position(double pos, bool keep_normal); + void set_normal(const Vec3d& dir); double get_position() const { return m_clp_ratio; } - ClippingPlane* get_clipping_plane() const { return m_clp.get(); } + const ClippingPlane* get_clipping_plane(bool ignore_hide_clipped = false) const; void render_cut() const; + void set_position_by_ratio(double pos, bool keep_normal); + void set_range_and_pos(const Vec3d& cpl_normal, double cpl_offset, double pos); + void set_behavior(bool hide_clipped, bool fill_cut, double contour_width); + + void pass_mouse_click(const Vec3d& pt); + std::vector get_disabled_contours() const; + + bool is_projection_inside_cut(const Vec3d& point_in) const; + bool has_valid_contour() const; protected: @@ -267,10 +260,13 @@ class ObjectClipper : public CommonGizmosDataBase private: std::vector m_old_meshes; - std::vector> m_clippers; + // Used to store the sla mesh coming from the backend + TriangleMesh m_sla_mesh_cache; + std::vector, Geometry::Transformation>> m_clippers; std::unique_ptr m_clp; double m_clp_ratio = 0.; double m_active_inst_bb_radius = 0.; + bool m_hide_clipped = true; }; @@ -297,10 +293,10 @@ class SupportsClipper : public CommonGizmosDataBase void on_release() override; private: - size_t m_old_timestamp = 0; int m_print_object_idx = -1; int m_print_objects_count = 0; - std::unique_ptr m_clipper; + std::unique_ptr m_supports_clipper; + std::unique_ptr m_pad_clipper; }; } // namespace CommonGizmosDataObjects diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 514db73c020..af93c07df38 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -21,6 +21,8 @@ #include "slic3r/GUI/Gizmos/GLGizmoSeam.hpp" #include "slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp" #include "slic3r/GUI/Gizmos/GLGizmoSimplify.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoEmboss.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoMeasure.hpp" #include "libslic3r/format.hpp" #include "libslic3r/Model.hpp" @@ -38,6 +40,7 @@ GLGizmosManager::GLGizmosManager(GLCanvas3D& parent) , m_enabled(false) , m_icons_texture_dirty(true) , m_current(Undefined) + , m_hover(Undefined) , m_tooltip("") , m_serializing(false) { @@ -46,33 +49,34 @@ GLGizmosManager::GLGizmosManager(GLCanvas3D& parent) std::vector GLGizmosManager::get_selectable_idxs() const { std::vector out; + out.reserve(m_gizmos.size()); for (size_t i=0; iis_selectable()) out.push_back(i); return out; } -size_t GLGizmosManager::get_gizmo_idx_from_mouse(const Vec2d& mouse_pos) const +GLGizmosManager::EType GLGizmosManager::get_gizmo_from_mouse(const Vec2d &mouse_pos) const { - if (! m_enabled) - return Undefined; + if (!m_enabled) return Undefined; - float cnv_h = (float)m_parent.get_canvas_size().get_height(); - float height = get_scaled_total_height(); + float cnv_h = (float) m_parent.get_canvas_size().get_height(); + float height = get_scaled_total_height(); float icons_size = m_layout.scaled_icons_size(); - float border = m_layout.scaled_border(); - float stride_y = m_layout.scaled_stride_y(); - float top_y = 0.5f * (cnv_h - height) + border; + float border = m_layout.scaled_border(); + float stride_y = m_layout.scaled_stride_y(); + float top_y = 0.5f * (cnv_h - height) + border; // is mouse horizontally in the area? - if ((border <= (float)mouse_pos(0) && ((float)mouse_pos(0) <= border + icons_size))) { + if ((border <= (float) mouse_pos(0) && + ((float) mouse_pos(0) <= border + icons_size))) { // which icon is it on? - size_t from_top = (size_t)((float)mouse_pos(1) - top_y) / stride_y; + size_t from_top = (size_t) ((float) mouse_pos(1) - top_y) / stride_y; // is it really on the icon or already past the border? - if ((float)mouse_pos(1) <= top_y + from_top * stride_y + icons_size) { + if ((float) mouse_pos(1) <= top_y + from_top * stride_y + icons_size) { std::vector selectable = get_selectable_idxs(); - if (from_top < selectable.size()) - return selectable[from_top]; + if (from_top < selectable.size()) + return static_cast(selectable[from_top]); } } return Undefined; @@ -97,13 +101,15 @@ bool GLGizmosManager::init() m_gizmos.emplace_back(new GLGizmoScale3D(m_parent, "scale.svg", 1)); m_gizmos.emplace_back(new GLGizmoRotate3D(m_parent, "rotate.svg", 2)); m_gizmos.emplace_back(new GLGizmoFlatten(m_parent, "place.svg", 3)); - m_gizmos.emplace_back(new GLGizmoCut(m_parent, "cut.svg", 4)); + m_gizmos.emplace_back(new GLGizmoCut3D(m_parent, "cut.svg", 4)); m_gizmos.emplace_back(new GLGizmoHollow(m_parent, "hollow.svg", 5)); m_gizmos.emplace_back(new GLGizmoSlaSupports(m_parent, "sla_supports.svg", 6)); m_gizmos.emplace_back(new GLGizmoFdmSupports(m_parent, "fdm_supports.svg", 7)); m_gizmos.emplace_back(new GLGizmoSeam(m_parent, "seam.svg", 8)); m_gizmos.emplace_back(new GLGizmoMmuSegmentation(m_parent, "mmu_segmentation.svg", 9)); - m_gizmos.emplace_back(new GLGizmoSimplify(m_parent, "cut.svg", 10)); + m_gizmos.emplace_back(new GLGizmoMeasure(m_parent, "measure.svg", 10)); + m_gizmos.emplace_back(new GLGizmoEmboss(m_parent)); + m_gizmos.emplace_back(new GLGizmoSimplify(m_parent)); m_common_gizmos_data.reset(new CommonGizmosDataPool(&m_parent)); @@ -122,20 +128,13 @@ bool GLGizmosManager::init() return true; } -bool GLGizmosManager::init_arrow(const BackgroundTexture::Metadata& arrow_texture) +bool GLGizmosManager::init_arrow(const std::string& filename) { - if (m_arrow_texture.texture.get_id() != 0) + if (m_arrow_texture.get_id() != 0) return true; - std::string path = resources_dir() + "/icons/"; - bool res = false; - - if (!arrow_texture.filename.empty()) - res = m_arrow_texture.texture.load_from_svg_file(path + arrow_texture.filename, false, false, false, 1000); - if (res) - m_arrow_texture.metadata = arrow_texture; - - return res; + const std::string path = resources_dir() + "/icons/"; + return (!filename.empty()) ? m_arrow_texture.load_from_svg_file(path + filename, false, false, false, 512) : false; } void GLGizmosManager::set_overlay_icon_size(float size) @@ -161,9 +160,9 @@ void GLGizmosManager::refresh_on_off_state() if (m_serializing || m_current == Undefined || m_gizmos.empty()) return; - if (m_current != Undefined - && ! m_gizmos[m_current]->is_activable() && activate_gizmo(Undefined)) - update_data(); + // FS: Why update data after Undefined gizmo activation? + if (!m_gizmos[m_current]->is_activable() && activate_gizmo(Undefined)) + update_data(); } void GLGizmosManager::reset_all_states() @@ -171,15 +170,24 @@ void GLGizmosManager::reset_all_states() if (! m_enabled || m_serializing) return; + const EType current = get_current_type(); + if (current != Undefined) + // close any open gizmo + open_gizmo(current); + activate_gizmo(Undefined); m_hover = Undefined; } bool GLGizmosManager::open_gizmo(EType type) { - int idx = int(type); - if (m_gizmos[idx]->is_activable() - && activate_gizmo(m_current == idx ? Undefined : (EType)idx)) { + int idx = static_cast(type); + + // re-open same type cause closing + if (m_current == type) type = Undefined; + + if (m_gizmos[idx]->is_activable() && activate_gizmo(type)) { + // remove update data into gizmo itself update_data(); return true; } @@ -208,87 +216,14 @@ void GLGizmosManager::set_hover_id(int id) m_gizmos[m_current]->set_hover_id(id); } -void GLGizmosManager::enable_grabber(EType type, unsigned int id, bool enable) -{ - if (!m_enabled || type == Undefined || m_gizmos.empty()) - return; - - if (enable) - m_gizmos[type]->enable_grabber(id); - else - m_gizmos[type]->disable_grabber(id); -} - -void GLGizmosManager::update(const Linef3& mouse_ray, const Point& mouse_pos) -{ - if (!m_enabled) - return; - - GLGizmoBase* curr = get_current(); - if (curr != nullptr) - curr->update(GLGizmoBase::UpdateData(mouse_ray, mouse_pos)); -} - void GLGizmosManager::update_data() { - if (!m_enabled) - return; - - const Selection& selection = m_parent.get_selection(); - - bool is_wipe_tower = selection.is_wipe_tower(); - enable_grabber(Move, 2, !is_wipe_tower); - enable_grabber(Rotate, 0, !is_wipe_tower); - enable_grabber(Rotate, 1, !is_wipe_tower); - - bool enable_scale_xyz = selection.is_single_full_instance() || selection.is_single_volume() || selection.is_single_modifier(); - for (unsigned int i = 0; i < 6; ++i) - { - enable_grabber(Scale, i, enable_scale_xyz); - } - + if (!m_enabled) return; if (m_common_gizmos_data) m_common_gizmos_data->update(get_current() ? get_current()->get_requirements() : CommonGizmosDataID(0)); - - if (selection.is_single_full_instance()) - { - // all volumes in the selection belongs to the same instance, any of them contains the needed data, so we take the first - const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); - set_scale(volume->get_instance_scaling_factor()); - set_rotation(Vec3d::Zero()); - ModelObject* model_object = selection.get_model()->objects[selection.get_object_idx()]; - set_flattening_data(model_object); - set_sla_support_data(model_object); - set_painter_gizmo_data(); - } - else if (selection.is_single_volume() || selection.is_single_modifier()) - { - const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); - set_scale(volume->get_volume_scaling_factor()); - set_rotation(Vec3d::Zero()); - set_flattening_data(nullptr); - set_sla_support_data(nullptr); - set_painter_gizmo_data(); - } - else if (is_wipe_tower) - { - DynamicPrintConfig& config = wxGetApp().preset_bundle->prints.get_edited_preset().config; - set_scale(Vec3d::Ones()); - set_rotation(Vec3d(0., 0., (M_PI/180.) * dynamic_cast(config.option("wipe_tower_rotation_angle"))->value)); - set_flattening_data(nullptr); - set_sla_support_data(nullptr); - set_painter_gizmo_data(); - } - else - { - set_scale(Vec3d::Ones()); - set_rotation(Vec3d::Zero()); - set_flattening_data(selection.is_from_single_object() ? selection.get_model()->objects[selection.get_object_idx()] : nullptr); - set_sla_support_data(selection.is_from_single_instance() ? selection.get_model()->objects[selection.get_object_idx()] : nullptr); - set_painter_gizmo_data(); - } + if (m_current != Undefined) m_gizmos[m_current]->data_changed(); } bool GLGizmosManager::is_running() const @@ -328,107 +263,6 @@ bool GLGizmosManager::is_dragging() const return m_gizmos[m_current]->is_dragging(); } -void GLGizmosManager::start_dragging() -{ - if (! m_enabled || m_current == Undefined) - return; - m_gizmos[m_current]->start_dragging(); -} - -void GLGizmosManager::stop_dragging() -{ - if (! m_enabled || m_current == Undefined) - return; - - m_gizmos[m_current]->stop_dragging(); -} - -Vec3d GLGizmosManager::get_displacement() const -{ - if (!m_enabled) - return Vec3d::Zero(); - - return dynamic_cast(m_gizmos[Move].get())->get_displacement(); -} - -Vec3d GLGizmosManager::get_scale() const -{ - if (!m_enabled) - return Vec3d::Ones(); - - return dynamic_cast(m_gizmos[Scale].get())->get_scale(); -} - -void GLGizmosManager::set_scale(const Vec3d& scale) -{ - if (!m_enabled || m_gizmos.empty()) - return; - - dynamic_cast(m_gizmos[Scale].get())->set_scale(scale); -} - -Vec3d GLGizmosManager::get_scale_offset() const -{ - if (!m_enabled || m_gizmos.empty()) - return Vec3d::Zero(); - - return dynamic_cast(m_gizmos[Scale].get())->get_offset(); -} - -Vec3d GLGizmosManager::get_rotation() const -{ - if (!m_enabled || m_gizmos.empty()) - return Vec3d::Zero(); - - return dynamic_cast(m_gizmos[Rotate].get())->get_rotation(); -} - -void GLGizmosManager::set_rotation(const Vec3d& rotation) -{ - if (!m_enabled || m_gizmos.empty()) - return; - dynamic_cast(m_gizmos[Rotate].get())->set_rotation(rotation); -} - -Vec3d GLGizmosManager::get_flattening_normal() const -{ - if (!m_enabled || m_gizmos.empty()) - return Vec3d::Zero(); - - return dynamic_cast(m_gizmos[Flatten].get())->get_flattening_normal(); -} - -void GLGizmosManager::set_flattening_data(const ModelObject* model_object) -{ - if (!m_enabled || m_gizmos.empty()) - return; - - dynamic_cast(m_gizmos[Flatten].get())->set_flattening_data(model_object); -} - -void GLGizmosManager::set_sla_support_data(ModelObject* model_object) -{ - if (! m_enabled - || m_gizmos.empty() - || wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA) - return; - - auto* gizmo_hollow = dynamic_cast(m_gizmos[Hollow].get()); - auto* gizmo_supports = dynamic_cast(m_gizmos[SlaSupports].get()); - gizmo_hollow->set_sla_support_data(model_object, m_parent.get_selection()); - gizmo_supports->set_sla_support_data(model_object, m_parent.get_selection()); -} - -void GLGizmosManager::set_painter_gizmo_data() -{ - if (!m_enabled || m_gizmos.empty()) - return; - - dynamic_cast(m_gizmos[FdmSupports].get())->set_painter_gizmo_data(m_parent.get_selection()); - dynamic_cast(m_gizmos[Seam].get())->set_painter_gizmo_data(m_parent.get_selection()); - dynamic_cast(m_gizmos[MmuSegmentation].get())->set_painter_gizmo_data(m_parent.get_selection()); -} - // Returns true if the gizmo used the event to do something, false otherwise. bool GLGizmosManager::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down) { @@ -445,6 +279,10 @@ bool GLGizmosManager::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_p return dynamic_cast(m_gizmos[Seam].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); else if (m_current == MmuSegmentation) return dynamic_cast(m_gizmos[MmuSegmentation].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); + else if (m_current == Measure) + return dynamic_cast(m_gizmos[Measure].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); + else if (m_current == Cut) + return dynamic_cast(m_gizmos[Cut].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); else return false; } @@ -475,7 +313,7 @@ void GLGizmosManager::render_current_gizmo() const m_gizmos[m_current]->render(); } -void GLGizmosManager::render_painter_gizmo() const +void GLGizmosManager::render_painter_gizmo() { // This function shall only be called when current gizmo is // derived from GLGizmoPainterBase. @@ -488,16 +326,7 @@ void GLGizmosManager::render_painter_gizmo() const gizmo->render_painter_gizmo(); } -void GLGizmosManager::render_current_gizmo_for_picking_pass() const -{ - if (! m_enabled || m_current == Undefined) - - return; - - m_gizmos[m_current]->render_for_picking(); -} - -void GLGizmosManager::render_overlay() const +void GLGizmosManager::render_overlay() { if (!m_enabled) return; @@ -517,7 +346,7 @@ std::string GLGizmosManager::get_tooltip() const return (curr != nullptr) ? curr->get_tooltip() : ""; } -bool GLGizmosManager::on_mouse_wheel(wxMouseEvent& evt) +bool GLGizmosManager::on_mouse_wheel(const wxMouseEvent &evt) { bool processed = false; @@ -530,227 +359,114 @@ bool GLGizmosManager::on_mouse_wheel(wxMouseEvent& evt) return processed; } -bool GLGizmosManager::on_mouse(wxMouseEvent& evt) -{ - // used to set a right up event as processed when needed - static bool pending_right_up = false; - - Point pos(evt.GetX(), evt.GetY()); - Vec2d mouse_pos((double)evt.GetX(), (double)evt.GetY()); - - Selection& selection = m_parent.get_selection(); - int selected_object_idx = selection.get_object_idx(); - bool processed = false; - - // when control is down we allow scene pan and rotation even when clicking over some object - bool control_down = evt.CmdDown(); - - // mouse anywhere - if (evt.Moving()) { - m_tooltip = update_hover_state(mouse_pos); - if (m_current == MmuSegmentation || m_current == FdmSupports) - gizmo_event(SLAGizmoEventType::Moving, mouse_pos, evt.ShiftDown(), evt.AltDown()); - } else if (evt.LeftUp()) { - if (m_mouse_capture.left) { - processed = true; - m_mouse_capture.left = false; - } - else if (is_dragging()) { - switch (m_current) { - case Move: { m_parent.do_move(L("Gizmo-Move")); break; } - case Scale: { m_parent.do_scale(L("Gizmo-Scale")); break; } - case Rotate: { m_parent.do_rotate(L("Gizmo-Rotate")); break; } - default: break; - } - - stop_dragging(); - update_data(); - - wxGetApp().obj_manipul()->set_dirty(); - // Let the plater know that the dragging finished, so a delayed refresh - // of the scene with the background processing data should be performed. - m_parent.post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); - // updates camera target constraints - m_parent.refresh_camera_scene_box(); - - processed = true; - } -// else -// return false; - } - else if (evt.MiddleUp()) { - if (m_mouse_capture.middle) { - processed = true; - m_mouse_capture.middle = false; - } - else +bool GLGizmosManager::gizmos_toolbar_on_mouse(const wxMouseEvent &mouse_event) { + assert(m_enabled); + // keep information about events to process + struct MouseCapture + { + bool left = false; + bool middle = false; + bool right = false; + bool exist_tooltip = false; + MouseCapture() = default; + bool any() const { return left || middle || right; } + void reset() { + left = false; + middle = false; + right = false; + } + }; + static MouseCapture mc; + + // wxCoord == int --> wx/types.h + Vec2i mouse_coord(mouse_event.GetX(), mouse_event.GetY()); + Vec2d mouse_pos = mouse_coord.cast(); + + EType gizmo = get_gizmo_from_mouse(mouse_pos); + bool selected_gizmo = gizmo != Undefined; + + // fast reaction on move mouse + if (mouse_event.Moving()) { + assert(!mc.any()); + if (selected_gizmo) { + mc.exist_tooltip = true; + update_hover_state(gizmo); + // at this moment is enebled to process mouse move under gizmo + // tools bar e.g. Do not interupt dragging. return false; - } - else if (evt.RightUp()) { - if (pending_right_up) { - pending_right_up = false; - return true; } - if (m_mouse_capture.right) { - processed = true; - m_mouse_capture.right = false; + else if (mc.exist_tooltip) { + // first move out of gizmo tool bar - unselect tooltip + mc.exist_tooltip = false; + update_hover_state(Undefined); + return false; } -// else -// return false; - } - else if (evt.Dragging() && !is_dragging()) { - if (m_mouse_capture.any()) - // if the button down was done on this toolbar, prevent from dragging into the scene - processed = true; -// else -// return false; + return false; } - else if (evt.Dragging() && is_dragging()) { - if (!m_parent.get_wxglcanvas()->HasCapture()) - m_parent.get_wxglcanvas()->CaptureMouse(); - - m_parent.set_mouse_as_dragging(); - update(m_parent.mouse_ray(pos), pos); - switch (m_current) - { - case Move: - { - // Apply new temporary offset - selection.translate(get_displacement()); - wxGetApp().obj_manipul()->set_dirty(); - break; - } - case Scale: - { - // Apply new temporary scale factors - TransformationType transformation_type(TransformationType::Local_Absolute_Joint); - if (evt.AltDown()) - transformation_type.set_independent(); - selection.scale(get_scale(), transformation_type); - if (control_down) - selection.translate(get_scale_offset(), true); - wxGetApp().obj_manipul()->set_dirty(); - break; + if (selected_gizmo) { + // mouse is above toolbar + if (mouse_event.LeftDown() || mouse_event.LeftDClick()) { + mc.left = true; + open_gizmo(gizmo); + return true; } - case Rotate: - { - // Apply new temporary rotations - TransformationType transformation_type(TransformationType::World_Relative_Joint); - if (evt.AltDown()) - transformation_type.set_independent(); - selection.rotate(get_rotation(), transformation_type); - wxGetApp().obj_manipul()->set_dirty(); - break; + else if (mouse_event.RightDown()) { + mc.right = true; + return true; } - default: - break; + else if (mouse_event.MiddleDown()) { + mc.middle = true; + return true; } - - m_parent.set_as_dirty(); - processed = true; } - if (get_gizmo_idx_from_mouse(mouse_pos) == Undefined) { - // mouse is outside the toolbar - m_tooltip.clear(); - - if (evt.LeftDown() && (!control_down || grabber_contains_mouse())) { - if ((m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports || m_current == Seam || m_current == MmuSegmentation) - && gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, evt.ShiftDown(), evt.AltDown())) - // the gizmo got the event and took some action, there is no need to do anything more - processed = true; - else if (!selection.is_empty() && grabber_contains_mouse()) { - update_data(); - selection.start_dragging(); - start_dragging(); - - // Let the plater know that the dragging started - m_parent.post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_STARTED)); - - if (m_current == Flatten) { - // Rotate the object so the normal points downward: - m_parent.do_flatten(get_flattening_normal(), L("Gizmo-Place on Face")); - wxGetApp().obj_manipul()->set_dirty(); - } - - m_parent.set_as_dirty(); - processed = true; + if (mc.any()) { + // Check if exist release of event started above toolbar? + if (mouse_event.Dragging()) { + if (!selected_gizmo && mc.exist_tooltip) { + // dragging out of gizmo let tooltip disapear + mc.exist_tooltip = false; + update_hover_state(Undefined); } + // draging start on toolbar so no propagation into scene + return true; } - else if (evt.RightDown() && selected_object_idx != -1 && (m_current == SlaSupports || m_current == Hollow) - && gizmo_event(SLAGizmoEventType::RightDown, mouse_pos)) { - // we need to set the following right up as processed to avoid showing the context menu if the user release the mouse over the object - pending_right_up = true; - // event was taken care of by the SlaSupports gizmo - processed = true; - } - else if (evt.RightDown() && !control_down && selected_object_idx != -1 && (m_current == FdmSupports || m_current == Seam || m_current == MmuSegmentation) - && gizmo_event(SLAGizmoEventType::RightDown, mouse_pos)) { - // event was taken care of by the FdmSupports / Seam / MMUPainting gizmo - processed = true; - } - else if (evt.Dragging() && m_parent.get_move_volume_id() != -1 - && (m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports || m_current == Seam || m_current == MmuSegmentation)) - // don't allow dragging objects with the Sla gizmo on - processed = true; - else if (evt.Dragging() && !control_down && (m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports || m_current == Seam || m_current == MmuSegmentation) - && gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, evt.ShiftDown(), evt.AltDown())) { - // the gizmo got the event and took some action, no need to do anything more here - m_parent.set_as_dirty(); - processed = true; - } - else if (evt.Dragging() && control_down && (evt.LeftIsDown() || evt.RightIsDown())) { - // CTRL has been pressed while already dragging -> stop current action - if (evt.LeftIsDown()) - gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, evt.ShiftDown(), evt.AltDown(), true); - else if (evt.RightIsDown()) - gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, evt.ShiftDown(), evt.AltDown(), true); - } - else if (evt.LeftUp() && (m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports || m_current == Seam || m_current == MmuSegmentation) && !m_parent.is_mouse_dragging()) { - // in case SLA/FDM gizmo is selected, we just pass the LeftUp event and stop processing - neither - // object moving or selecting is suppressed in that case - gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, evt.ShiftDown(), evt.AltDown(), control_down); - processed = true; - } - else if (evt.LeftUp() && m_current == Flatten && m_gizmos[m_current]->get_hover_id() != -1) { - // to avoid to loose the selection when user clicks an the white faces of a different object while the Flatten gizmo is active - selection.stop_dragging(); - wxGetApp().obj_manipul()->set_dirty(); - processed = true; - } - else if (evt.RightUp() && (m_current == FdmSupports || m_current == Seam || m_current == MmuSegmentation) && !m_parent.is_mouse_dragging()) { - gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, evt.ShiftDown(), evt.AltDown(), control_down); - processed = true; - } - else if (evt.LeftUp()) { - selection.stop_dragging(); - wxGetApp().obj_manipul()->set_dirty(); - } - } - else { - // mouse inside toolbar - if (evt.LeftDown() || evt.LeftDClick()) { - m_mouse_capture.left = true; - m_mouse_capture.parent = &m_parent; - processed = true; - if (!selection.is_empty()) { - update_on_off_state(mouse_pos); - update_data(); - m_parent.set_as_dirty(); - } + else if (mc.left && mouse_event.LeftUp()) { + mc.left = false; + return true; } - else if (evt.MiddleDown()) { - m_mouse_capture.middle = true; - m_mouse_capture.parent = &m_parent; + else if (mc.right && mouse_event.RightUp()) { + mc.right = false; + return true; } - else if (evt.RightDown()) { - m_mouse_capture.right = true; - m_mouse_capture.parent = &m_parent; + else if (mc.middle && mouse_event.MiddleUp()) { + mc.middle = false; + return true; } + + // event out of window is not porocessed + // left down on gizmo -> keep down -> move out of window -> release left + if (mouse_event.Leaving()) mc.reset(); } + return false; +} - return processed; +bool GLGizmosManager::on_mouse(const wxMouseEvent &mouse_event) +{ + if (!m_enabled) return false; + + // tool bar wants to use event? + if (gizmos_toolbar_on_mouse(mouse_event)) return true; + + // current gizmo wants to use event? + if (m_current != Undefined && + // check if gizmo override method could be slower than simple call virtual function + // &m_gizmos[m_current]->on_mouse != &GLGizmoBase::on_mouse && + m_gizmos[m_current]->on_mouse(mouse_event)) + return true; + + return false; } bool GLGizmosManager::on_char(wxKeyEvent& evt) @@ -761,8 +477,7 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) bool processed = false; - if ((evt.GetModifiers() & ctrlMask) != 0) - { + if ((evt.GetModifiers() & ctrlMask) != 0) { switch (keyCode) { #ifdef __APPLE__ @@ -773,23 +488,24 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) #endif /* __APPLE__ */ { // Sla gizmo selects all support points - if ((m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::SelectAll)) + if ((m_current == SlaSupports || m_current == Hollow || m_current == Cut) && gizmo_event(SLAGizmoEventType::SelectAll)) processed = true; break; } } } - else if (!evt.HasModifiers()) - { + else if (!evt.HasModifiers()) { switch (keyCode) { // key ESC case WXK_ESCAPE: { - if (m_current != Undefined) - { - if ((m_current != SlaSupports) || !gizmo_event(SLAGizmoEventType::DiscardChanges)) + if (m_current != Undefined) { + if (m_current == Measure && gizmo_event(SLAGizmoEventType::Escape)) { + // do nothing + } + else if (m_current != SlaSupports || !gizmo_event(SLAGizmoEventType::DiscardChanges)) reset_all_states(); processed = true; @@ -817,7 +533,7 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) case WXK_BACK: case WXK_DELETE: { - if ((m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::Delete)) + if ((m_current == SlaSupports || m_current == Hollow || m_current == Cut || m_current == Measure) && gizmo_event(SLAGizmoEventType::Delete)) processed = true; break; @@ -825,8 +541,7 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) case 'A': case 'a': { - if (m_current == SlaSupports) - { + if (m_current == SlaSupports) { gizmo_event(SLAGizmoEventType::AutomaticGeneration); // set as processed no matter what's returned by gizmo_event() to avoid the calling canvas to process 'A' as arrange processed = true; @@ -844,8 +559,7 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) case 'F': case 'f': { - if (m_current == Scale) - { + if (m_current == Scale) { if (!is_dragging()) wxGetApp().plater()->scale_selection_to_fit_print_volume(); @@ -857,8 +571,7 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) } } - if (!processed && !evt.HasModifiers()) - { + if (!processed && !evt.HasModifiers()) { if (handle_shortcut(keyCode)) processed = true; } @@ -874,53 +587,43 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) const int keyCode = evt.GetKeyCode(); bool processed = false; - if (evt.GetEventType() == wxEVT_KEY_UP) - { - if (m_current == SlaSupports || m_current == Hollow) - { - bool is_editing = true; - bool is_rectangle_dragging = false; - - if (m_current == SlaSupports) { - GLGizmoSlaSupports* gizmo = dynamic_cast(get_current()); - is_editing = gizmo->is_in_editing_mode(); - is_rectangle_dragging = gizmo->is_selection_rectangle_dragging(); - } - else { - GLGizmoHollow* gizmo = dynamic_cast(get_current()); - is_rectangle_dragging = gizmo->is_selection_rectangle_dragging(); - } + if (evt.GetEventType() == wxEVT_KEY_UP) { + if (m_current == SlaSupports || m_current == Hollow || m_current == Cut) { + GLGizmoBase* gizmo = get_current(); + const bool is_editing = m_current == Hollow ? true : gizmo->is_in_editing_mode(); + const bool is_rectangle_dragging = gizmo->is_selection_rectangle_dragging(); - if (keyCode == WXK_SHIFT) - { + if (keyCode == WXK_SHIFT) { // shift has been just released - SLA gizmo might want to close rectangular selection. if (gizmo_event(SLAGizmoEventType::ShiftUp) || (is_editing && is_rectangle_dragging)) processed = true; } - else if (keyCode == WXK_ALT) - { + else if (keyCode == WXK_ALT) { // alt has been just released - SLA gizmo might want to close rectangular selection. if (gizmo_event(SLAGizmoEventType::AltUp) || (is_editing && is_rectangle_dragging)) processed = true; } } + else if (m_current == Measure) { + if (keyCode == WXK_CONTROL) + gizmo_event(SLAGizmoEventType::CtrlUp, Vec2d::Zero(), evt.ShiftDown(), evt.AltDown(), evt.CmdDown()); + else if (keyCode == WXK_SHIFT) + gizmo_event(SLAGizmoEventType::ShiftUp, Vec2d::Zero(), evt.ShiftDown(), evt.AltDown(), evt.CmdDown()); + } // if (processed) // m_parent.set_cursor(GLCanvas3D::Standard); } - else if (evt.GetEventType() == wxEVT_KEY_DOWN) - { - if ((m_current == SlaSupports) && ((keyCode == WXK_SHIFT) || (keyCode == WXK_ALT)) - && dynamic_cast(get_current())->is_in_editing_mode()) - { + else if (evt.GetEventType() == wxEVT_KEY_DOWN) { + if (m_current == SlaSupports && (keyCode == WXK_SHIFT || keyCode == WXK_ALT) + && get_current()->is_in_editing_mode()) { // m_parent.set_cursor(GLCanvas3D::Cross); processed = true; } - else if (m_current == Cut) - { + else if (m_current == Cut) { auto do_move = [this, &processed](double delta_z) { - GLGizmoCut* cut = dynamic_cast(get_current()); - cut->set_cut_z(delta_z + cut->get_cut_z()); + GLGizmoCut3D* cut = dynamic_cast(get_current()); + cut->shift_cut(delta_z); processed = true; }; @@ -928,13 +631,23 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) { case WXK_NUMPAD_UP: case WXK_UP: { do_move(1.0); break; } case WXK_NUMPAD_DOWN: case WXK_DOWN: { do_move(-1.0); break; } + case WXK_SHIFT : case WXK_ALT: { + processed = get_current()->is_in_editing_mode(); + } default: { break; } } - } else if (m_current == Simplify && keyCode == WXK_ESCAPE) { + } + else if (m_current == Simplify && keyCode == WXK_ESCAPE) { GLGizmoSimplify *simplify = dynamic_cast(get_current()); if (simplify != nullptr) processed = simplify->on_esc_key_down(); } + else if (m_current == Measure) { + if (keyCode == WXK_CONTROL) + gizmo_event(SLAGizmoEventType::CtrlDown, Vec2d::Zero(), evt.ShiftDown(), evt.AltDown(), evt.CmdDown()); + else if (keyCode == WXK_SHIFT) + gizmo_event(SLAGizmoEventType::ShiftDown, Vec2d::Zero(), evt.ShiftDown(), evt.AltDown(), evt.CmdDown()); + } } if (processed) @@ -949,33 +662,32 @@ void GLGizmosManager::update_after_undo_redo(const UndoRedo::Snapshot& snapshot) m_serializing = false; if (m_current == SlaSupports && snapshot.snapshot_data.flags & UndoRedo::SnapshotData::RECALCULATE_SLA_SUPPORTS) - dynamic_cast(m_gizmos[SlaSupports].get())->reslice_SLA_supports(true); + dynamic_cast(m_gizmos[SlaSupports].get())->reslice_until_step(slaposPad, true); } -void GLGizmosManager::render_background(float left, float top, float right, float bottom, float border) const +void GLGizmosManager::render_background(float left, float top, float right, float bottom, float border_w, float border_h) const { - unsigned int tex_id = m_background_texture.texture.get_id(); - float tex_width = (float)m_background_texture.texture.get_width(); - float tex_height = (float)m_background_texture.texture.get_height(); - if ((tex_id != 0) && (tex_width > 0) && (tex_height > 0)) - { - float inv_tex_width = (tex_width != 0.0f) ? 1.0f / tex_width : 0.0f; - float inv_tex_height = (tex_height != 0.0f) ? 1.0f / tex_height : 0.0f; + const unsigned int tex_id = m_background_texture.texture.get_id(); + const float tex_width = float(m_background_texture.texture.get_width()); + const float tex_height = float(m_background_texture.texture.get_height()); + if (tex_id != 0 && tex_width > 0 && tex_height > 0) { + const float inv_tex_width = (tex_width != 0.0f) ? 1.0f / tex_width : 0.0f; + const float inv_tex_height = (tex_height != 0.0f) ? 1.0f / tex_height : 0.0f; - float internal_left = left + border; - float internal_right = right - border; - float internal_top = top - border; - float internal_bottom = bottom + border; + const float internal_left = left + border_w; + const float internal_right = right - border_w; + const float internal_top = top - border_h; + const float internal_bottom = bottom + border_h; // float left_uv = 0.0f; - float right_uv = 1.0f; - float top_uv = 1.0f; - float bottom_uv = 0.0f; + const float right_uv = 1.0f; + const float top_uv = 1.0f; + const float bottom_uv = 0.0f; - float internal_left_uv = (float)m_background_texture.metadata.left * inv_tex_width; - float internal_right_uv = 1.0f - (float)m_background_texture.metadata.right * inv_tex_width; - float internal_top_uv = 1.0f - (float)m_background_texture.metadata.top * inv_tex_height; - float internal_bottom_uv = (float)m_background_texture.metadata.bottom * inv_tex_height; + const float internal_left_uv = float(m_background_texture.metadata.left) * inv_tex_width; + const float internal_right_uv = 1.0f - float(m_background_texture.metadata.right) * inv_tex_width; + const float internal_top_uv = 1.0f - float(m_background_texture.metadata.top) * inv_tex_height; + const float internal_bottom_uv = float(m_background_texture.metadata.bottom) * inv_tex_height; // top-left corner GLTexture::render_sub_texture(tex_id, left, internal_left, internal_top, top, { { internal_left_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv }, { internal_right_uv, internal_top_uv }, { internal_left_uv, internal_top_uv } }); @@ -1008,116 +720,122 @@ void GLGizmosManager::render_background(float left, float top, float right, floa void GLGizmosManager::render_arrow(const GLCanvas3D& parent, EType highlighted_type) const { - - std::vector selectable_idxs = get_selectable_idxs(); + const std::vector selectable_idxs = get_selectable_idxs(); if (selectable_idxs.empty()) return; - float cnv_w = (float)m_parent.get_canvas_size().get_width(); - float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); - float height = get_scaled_total_height(); - float zoomed_border = m_layout.scaled_border() * inv_zoom; - float zoomed_top_x = (-0.5f * cnv_w) * inv_zoom; - float zoomed_top_y = (0.5f * height) * inv_zoom; - zoomed_top_x += zoomed_border; - zoomed_top_y -= zoomed_border; - float icons_size = m_layout.scaled_icons_size(); - float zoomed_icons_size = icons_size * inv_zoom; - float zoomed_stride_y = m_layout.scaled_stride_y() * inv_zoom; - for (size_t idx : selectable_idxs) - { - if (idx == highlighted_type) { - int tex_width = m_icons_texture.get_width(); - int tex_height = m_icons_texture.get_height(); - unsigned int tex_id = m_arrow_texture.texture.get_id(); - float inv_tex_width = (tex_width != 0.0f) ? 1.0f / tex_width : 0.0f; - float inv_tex_height = (tex_height != 0.0f) ? 1.0f / tex_height : 0.0f; - - float internal_left_uv = (float)m_arrow_texture.metadata.left * inv_tex_width; - float internal_right_uv = 1.0f - (float)m_arrow_texture.metadata.right * inv_tex_width; - float internal_top_uv = 1.0f - (float)m_arrow_texture.metadata.top * inv_tex_height; - float internal_bottom_uv = (float)m_arrow_texture.metadata.bottom * inv_tex_height; - - float arrow_sides_ratio = (float)m_arrow_texture.texture.get_height() / (float)m_arrow_texture.texture.get_width(); - - GLTexture::render_sub_texture(tex_id, zoomed_top_x + zoomed_icons_size * 1.2f, zoomed_top_x + zoomed_icons_size * 1.2f + zoomed_icons_size * 2.2f * arrow_sides_ratio, zoomed_top_y - zoomed_icons_size * 1.6f , zoomed_top_y + zoomed_icons_size * 0.6f, { { internal_left_uv, internal_bottom_uv }, { internal_left_uv, internal_top_uv }, { internal_right_uv, internal_top_uv }, { internal_right_uv, internal_bottom_uv } }); + + const Size cnv_size = m_parent.get_canvas_size(); + const float cnv_w = (float)cnv_size.get_width(); + const float cnv_h = (float)cnv_size.get_height(); + + if (cnv_w == 0 || cnv_h == 0) + return; + + const float inv_cnv_w = 1.0f / cnv_w; + const float inv_cnv_h = 1.0f / cnv_h; + + const float top_x = -1.0f; + float top_y = get_scaled_total_height() * inv_cnv_h; + + const float icons_size_x = 2.0f * m_layout.scaled_icons_size() * inv_cnv_w; + const float icons_size_y = 2.0f * m_layout.scaled_icons_size() * inv_cnv_h; + const float stride_y = 2.0f * m_layout.scaled_stride_y() * inv_cnv_h; + top_y -= stride_y; + + for (size_t idx : selectable_idxs) { + if (idx == highlighted_type) { + const int tex_width = m_arrow_texture.get_width(); + const int tex_height = m_arrow_texture.get_height(); + const unsigned int tex_id = m_arrow_texture.get_id(); + + const float arrow_size_x = 2.0f * m_layout.scale * float(tex_height) * inv_cnv_w; + const float arrow_size_y = 2.0f * m_layout.scale * float(tex_width) * inv_cnv_h; + + const float left_uv = 0.0f; + const float right_uv = 1.0f; + const float top_uv = 1.0f; + const float bottom_uv = 0.0f; + + const float left = top_x + icons_size_x + 6.0f * m_layout.scaled_border() * inv_cnv_w; + const float right = left + arrow_size_x * icons_size_y / arrow_size_y; + + GLTexture::render_sub_texture(tex_id, left, right, top_y, top_y + icons_size_y, { { left_uv, bottom_uv }, { left_uv, top_uv }, { right_uv, top_uv }, { right_uv, bottom_uv } }); break; } - zoomed_top_y -= zoomed_stride_y; + top_y -= stride_y; } } void GLGizmosManager::do_render_overlay() const { - std::vector selectable_idxs = get_selectable_idxs(); + const std::vector selectable_idxs = get_selectable_idxs(); if (selectable_idxs.empty()) return; - float cnv_w = (float)m_parent.get_canvas_size().get_width(); - float cnv_h = (float)m_parent.get_canvas_size().get_height(); - float zoom = (float)wxGetApp().plater()->get_camera().get_zoom(); - float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); + const Size cnv_size = m_parent.get_canvas_size(); + const float cnv_w = (float)cnv_size.get_width(); + const float cnv_h = (float)cnv_size.get_height(); - float height = get_scaled_total_height(); - float width = get_scaled_total_width(); - float zoomed_border = m_layout.scaled_border() * inv_zoom; + if (cnv_w == 0 || cnv_h == 0) + return; - float zoomed_top_x = (-0.5f * cnv_w) * inv_zoom; - float zoomed_top_y = (0.5f * height) * inv_zoom; + const float inv_cnv_w = 1.0f / cnv_w; + const float inv_cnv_h = 1.0f / cnv_h; - float zoomed_left = zoomed_top_x; - float zoomed_top = zoomed_top_y; - float zoomed_right = zoomed_left + width * inv_zoom; - float zoomed_bottom = zoomed_top - height * inv_zoom; + const float height = 2.0f * get_scaled_total_height() * inv_cnv_h; + const float width = 2.0f * get_scaled_total_width() * inv_cnv_w; + const float border_h = 2.0f * m_layout.scaled_border() * inv_cnv_h; + const float border_w = 2.0f * m_layout.scaled_border() * inv_cnv_w; - render_background(zoomed_left, zoomed_top, zoomed_right, zoomed_bottom, zoomed_border); + float top_x = -1.0f; + float top_y = 0.5f * height; - zoomed_top_x += zoomed_border; - zoomed_top_y -= zoomed_border; + render_background(top_x, top_y, top_x + width, top_y - height, border_w, border_h); - float icons_size = m_layout.scaled_icons_size(); - float zoomed_icons_size = icons_size * inv_zoom; - float zoomed_stride_y = m_layout.scaled_stride_y() * inv_zoom; + top_x += border_w; + top_y -= border_h; - unsigned int icons_texture_id = m_icons_texture.get_id(); - int tex_width = m_icons_texture.get_width(); - int tex_height = m_icons_texture.get_height(); + const float icons_size_x = 2.0f * m_layout.scaled_icons_size() * inv_cnv_w; + const float icons_size_y = 2.0f * m_layout.scaled_icons_size() * inv_cnv_h; + const float stride_y = 2.0f * m_layout.scaled_stride_y() * inv_cnv_h; - if ((icons_texture_id == 0) || (tex_width <= 1) || (tex_height <= 1)) + const unsigned int icons_texture_id = m_icons_texture.get_id(); + const int tex_width = m_icons_texture.get_width(); + const int tex_height = m_icons_texture.get_height(); + + if (icons_texture_id == 0 || tex_width <= 1 || tex_height <= 1) return; - float du = (float)(tex_width - 1) / (6.0f * (float)tex_width); // 6 is the number of possible states if the icons - float dv = (float)(tex_height - 1) / (float)(m_gizmos.size() * tex_height); + const float du = (float)(tex_width - 1) / (6.0f * (float)tex_width); // 6 is the number of possible states if the icons + const float dv = (float)(tex_height - 1) / (float)(m_gizmos.size() * tex_height); // tiles in the texture are spaced by 1 pixel - float u_offset = 1.0f / (float)tex_width; - float v_offset = 1.0f / (float)tex_height; + const float u_offset = 1.0f / (float)tex_width; + const float v_offset = 1.0f / (float)tex_height; - float current_y = FLT_MAX; - for (size_t idx : selectable_idxs) - { + float current_y = FLT_MAX; + for (size_t idx : selectable_idxs) { GLGizmoBase* gizmo = m_gizmos[idx].get(); - unsigned int sprite_id = gizmo->get_sprite_id(); + const unsigned int sprite_id = gizmo->get_sprite_id(); // higlighted state needs to be decided first so its highlighting in every other state - int icon_idx = (m_highlight.first == idx ? (m_highlight.second ? 4 : 5) : (m_current == idx) ? 2 : ((m_hover == idx) ? 1 : (gizmo->is_activable()? 0 : 3))); + const int icon_idx = (m_highlight.first == idx ? (m_highlight.second ? 4 : 5) : (m_current == idx) ? 2 : ((m_hover == idx) ? 1 : (gizmo->is_activable() ? 0 : 3))); - float v_top = v_offset + sprite_id * dv; - float u_left = u_offset + icon_idx * du; - float v_bottom = v_top + dv - v_offset; - float u_right = u_left + du - u_offset; + const float u_left = u_offset + icon_idx * du; + const float u_right = u_left + du - u_offset; + const float v_top = v_offset + sprite_id * dv; + const float v_bottom = v_top + dv - v_offset; - GLTexture::render_sub_texture(icons_texture_id, zoomed_top_x, zoomed_top_x + zoomed_icons_size, zoomed_top_y - zoomed_icons_size, zoomed_top_y, { { u_left, v_bottom }, { u_right, v_bottom }, { u_right, v_top }, { u_left, v_top } }); + GLTexture::render_sub_texture(icons_texture_id, top_x, top_x + icons_size_x, top_y - icons_size_y, top_y, { { u_left, v_bottom }, { u_right, v_bottom }, { u_right, v_top }, { u_left, v_top } }); if (idx == m_current || current_y == FLT_MAX) { // The FLT_MAX trick is here so that even non-selectable but activable // gizmos are passed some meaningful value. - current_y = 0.5f * cnv_h - zoomed_top_y * zoom; + current_y = 0.5f * cnv_h - 0.5f * top_y * cnv_h; } - zoomed_top_y -= zoomed_stride_y; + top_y -= stride_y; } - if (m_current != Undefined) { - float toolbar_top = cnv_h - wxGetApp().plater()->get_view_toolbar().get_height(); - m_gizmos[m_current]->render_input_window(width, current_y, toolbar_top); - } + if (m_current != Undefined) + m_gizmos[m_current]->render_input_window(get_scaled_total_width(), current_y, cnv_h - wxGetApp().plater()->get_view_toolbar().get_height()); } float GLGizmosManager::get_scaled_total_height() const @@ -1135,6 +853,11 @@ GLGizmoBase* GLGizmosManager::get_current() const return ((m_current == Undefined) || m_gizmos.empty()) ? nullptr : m_gizmos[m_current].get(); } +GLGizmoBase* GLGizmosManager::get_gizmo(GLGizmosManager::EType type) const +{ + return ((type == Undefined) || m_gizmos.empty()) ? nullptr : m_gizmos[type].get(); +} + GLGizmosManager::EType GLGizmosManager::get_gizmo_from_name(const std::string& gizmo_name) const { std::vector selectable_idxs = get_selectable_idxs(); @@ -1148,15 +871,16 @@ GLGizmosManager::EType GLGizmosManager::get_gizmo_from_name(const std::string& g return GLGizmosManager::EType::Undefined; } -bool GLGizmosManager::generate_icons_texture() const +bool GLGizmosManager::generate_icons_texture() { std::string path = resources_dir() + "/icons/"; std::vector filenames; for (size_t idx=0; idxget_icon_filename(); + const std::string& icon_filename = gizmo->get_icon_filename(); if (!icon_filename.empty()) filenames.push_back(path + icon_filename); } @@ -1182,68 +906,72 @@ bool GLGizmosManager::generate_icons_texture() const return res; } -void GLGizmosManager::update_on_off_state(const Vec2d& mouse_pos) +void GLGizmosManager::update_hover_state(const EType &type) { - if (!m_enabled) + assert(m_enabled); + if (type == Undefined) { + m_hover = Undefined; + m_tooltip.clear(); return; - - size_t idx = get_gizmo_idx_from_mouse(mouse_pos); - if (idx != Undefined && m_gizmos[idx]->is_activable() && m_hover == idx) { - activate_gizmo(m_current == idx ? Undefined : (EType)idx); - wxGetApp().obj_list()->select_object_item((EType)idx <= Rotate); } -} - -std::string GLGizmosManager::update_hover_state(const Vec2d& mouse_pos) -{ - std::string name = ""; - - if (!m_enabled) - return name; - - m_hover = Undefined; - size_t idx = get_gizmo_idx_from_mouse(mouse_pos); - if (idx != Undefined) { - name = m_gizmos[idx]->get_name(); + const GLGizmoBase &hovered_gizmo = *m_gizmos[type]; + m_hover = hovered_gizmo.is_activable() ? type : Undefined; + m_tooltip = hovered_gizmo.get_name(); +} - if (m_gizmos[idx]->is_activable()) - m_hover = (EType)idx; - } - return name; -} +// Activate given gizmo. Returns true if successful, false in case that current +// gizmo vetoed its deactivation. bool GLGizmosManager::activate_gizmo(EType type) { - if (m_gizmos.empty() || m_current == type) - return true; + assert(!m_gizmos.empty()); - GLGizmoBase* old_gizmo = m_current == Undefined ? nullptr : m_gizmos[m_current].get(); - GLGizmoBase* new_gizmo = type == Undefined ? nullptr : m_gizmos[type].get(); + // already activated + if (m_current == type) return true; - if (old_gizmo) { - old_gizmo->set_state(GLGizmoBase::Off); - if (old_gizmo->get_state() != GLGizmoBase::Off) + if (m_current != Undefined) { + // clean up previous gizmo + GLGizmoBase &old_gizmo = *m_gizmos[m_current]; + old_gizmo.set_state(GLGizmoBase::Off); + if (old_gizmo.get_state() != GLGizmoBase::Off) return false; // gizmo refused to be turned off, do nothing. - if (! m_parent.get_gizmos_manager().is_serializing() - && old_gizmo->wants_enter_leave_snapshots()) - Plater::TakeSnapshot snapshot(wxGetApp().plater(), - old_gizmo->get_gizmo_leaving_text(), - UndoRedo::SnapshotType::LeavingGizmoWithAction); + old_gizmo.unregister_raycasters_for_picking(); + + if (!m_serializing && old_gizmo.wants_enter_leave_snapshots()) + Plater::TakeSnapshot + snapshot(wxGetApp().plater(), + old_gizmo.get_gizmo_leaving_text(), + UndoRedo::SnapshotType::LeavingGizmoWithAction); + } + + if (type == Undefined) { + // it is deactivation of gizmo + m_current = Undefined; + return true; } - if (new_gizmo && ! m_parent.get_gizmos_manager().is_serializing() - && new_gizmo->wants_enter_leave_snapshots()) + // set up new gizmo + GLGizmoBase& new_gizmo = *m_gizmos[type]; + if (!new_gizmo.is_activable()) return false; + + if (!m_serializing && new_gizmo.wants_enter_leave_snapshots()) Plater::TakeSnapshot snapshot(wxGetApp().plater(), - new_gizmo->get_gizmo_entering_text(), - UndoRedo::SnapshotType::EnteringGizmo); + new_gizmo.get_gizmo_entering_text(), + UndoRedo::SnapshotType::EnteringGizmo); m_current = type; + new_gizmo.set_state(GLGizmoBase::On); + if (new_gizmo.get_state() != GLGizmoBase::On) { + m_current = Undefined; + return false; // gizmo refused to be turned on. + } + + new_gizmo.register_raycasters_for_picking(); - if (new_gizmo) - new_gizmo->set_state(GLGizmoBase::On); + // sucessful activation of gizmo return true; } @@ -1281,11 +1009,5 @@ bool GLGizmosManager::is_hiding_instances() const && m_common_gizmos_data->instances_hider()->is_valid()); } - -int GLGizmosManager::get_shortcut_key(GLGizmosManager::EType type) const -{ - return m_gizmos[type]->get_shortcut_key(); -} - } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp index ed02574dfa9..8c98596bfdd 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp @@ -25,16 +25,24 @@ class CommonGizmosDataPool; class Rect { - float m_left; - float m_top; - float m_right; - float m_bottom; + float m_left{ 0.0f }; + float m_top{ 0.0f }; + float m_right{ 0.0f }; + float m_bottom{ 0.0f }; public: - Rect() : m_left(0.0f) , m_top(0.0f) , m_right(0.0f) , m_bottom(0.0f) {} - + Rect() = default; Rect(float left, float top, float right, float bottom) : m_left(left) , m_top(top) , m_right(right) , m_bottom(bottom) {} + bool operator == (const Rect& other) const { + if (std::abs(m_left - other.m_left) > EPSILON) return false; + if (std::abs(m_top - other.m_top) > EPSILON) return false; + if (std::abs(m_right - other.m_right) > EPSILON) return false; + if (std::abs(m_bottom - other.m_bottom) > EPSILON) return false; + return true; + } + bool operator != (const Rect& other) const { return !operator==(other); } + float get_left() const { return m_left; } void set_left(float left) { m_left = left; } @@ -69,6 +77,8 @@ class GLGizmosManager : public Slic3r::ObjectBase FdmSupports, Seam, MmuSegmentation, + Measure, + Emboss, Simplify, Undefined }; @@ -92,44 +102,38 @@ class GLGizmosManager : public Slic3r::ObjectBase GLCanvas3D& m_parent; bool m_enabled; std::vector> m_gizmos; - mutable GLTexture m_icons_texture; - mutable bool m_icons_texture_dirty; + GLTexture m_icons_texture; + bool m_icons_texture_dirty; BackgroundTexture m_background_texture; - BackgroundTexture m_arrow_texture; + GLTexture m_arrow_texture; Layout m_layout; EType m_current; EType m_hover; std::pair m_highlight; // bool true = higlightedShown, false = highlightedHidden std::vector get_selectable_idxs() const; - size_t get_gizmo_idx_from_mouse(const Vec2d& mouse_pos) const; + EType get_gizmo_from_mouse(const Vec2d &mouse_pos) const; bool activate_gizmo(EType type); - struct MouseCapture - { - bool left; - bool middle; - bool right; - GLCanvas3D* parent; - - MouseCapture() { reset(); } - - bool any() const { return left || middle || right; } - void reset() { left = middle = right = false; parent = nullptr; } - }; - - MouseCapture m_mouse_capture; std::string m_tooltip; bool m_serializing; std::unique_ptr m_common_gizmos_data; + /// + /// Process mouse event on gizmo toolbar + /// + /// Event descriptor + /// TRUE when take responsibility for event otherwise FALSE. + /// On true, event should not be process by others. + /// On false, event should be process by others. + bool gizmos_toolbar_on_mouse(const wxMouseEvent &mouse_event); public: explicit GLGizmosManager(GLCanvas3D& parent); bool init(); - bool init_arrow(const BackgroundTexture::Metadata& arrow_texture); + bool init_arrow(const std::string& filename); template void load(Archive& ar) @@ -174,46 +178,27 @@ class GLGizmosManager : public Slic3r::ObjectBase void refresh_on_off_state(); void reset_all_states(); - bool is_serializing() const { return m_serializing; } bool open_gizmo(EType type); bool check_gizmos_closed_except(EType) const; void set_hover_id(int id); - void enable_grabber(EType type, unsigned int id, bool enable); - void update(const Linef3& mouse_ray, const Point& mouse_pos); + /// + /// Distribute information about different data into active gizmo + /// Should be called when selection changed + /// void update_data(); EType get_current_type() const { return m_current; } GLGizmoBase* get_current() const; + GLGizmoBase* get_gizmo(GLGizmosManager::EType type) const; EType get_gizmo_from_name(const std::string& gizmo_name) const; bool is_running() const; bool handle_shortcut(int key); bool is_dragging() const; - void start_dragging(); - void stop_dragging(); - - Vec3d get_displacement() const; - Vec3d get_scale() const; - void set_scale(const Vec3d& scale); - - Vec3d get_scale_offset() const; - - Vec3d get_rotation() const; - void set_rotation(const Vec3d& rotation); - - Vec3d get_flattening_normal() const; - - void set_flattening_data(const ModelObject* model_object); - - void set_sla_support_data(ModelObject* model_object); - - void set_painter_gizmo_data(); - - bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position = Vec2d::Zero(), bool shift_down = false, bool alt_down = false, bool control_down = false); ClippingPlane get_clipping_plane() const; bool wants_reslice_supports_on_undo() const; @@ -221,41 +206,44 @@ class GLGizmosManager : public Slic3r::ObjectBase bool is_hiding_instances() const; void render_current_gizmo() const; - void render_current_gizmo_for_picking_pass() const; - void render_painter_gizmo() const; + void render_painter_gizmo(); - void render_overlay() const; + void render_overlay(); void render_arrow(const GLCanvas3D& parent, EType highlighted_type) const; std::string get_tooltip() const; - bool on_mouse(wxMouseEvent& evt); - bool on_mouse_wheel(wxMouseEvent& evt); + bool on_mouse(const wxMouseEvent &mouse_event); + bool on_mouse_wheel(const wxMouseEvent &evt); bool on_char(wxKeyEvent& evt); bool on_key(wxKeyEvent& evt); void update_after_undo_redo(const UndoRedo::Snapshot& snapshot); int get_selectable_icons_cnt() const { return get_selectable_idxs().size(); } - int get_shortcut_key(GLGizmosManager::EType) const; // To end highlight set gizmo = undefined void set_highlight(EType gizmo, bool highlight_shown) { m_highlight = std::pair(gizmo, highlight_shown); } bool get_highlight_state() const { return m_highlight.second; } private: - void render_background(float left, float top, float right, float bottom, float border) const; + bool gizmo_event(SLAGizmoEventType action, + const Vec2d & mouse_position = Vec2d::Zero(), + bool shift_down = false, + bool alt_down = false, + bool control_down = false); + void render_background(float left, float top, float right, float bottom, float border_w, float border_h) const; + void do_render_overlay() const; float get_scaled_total_height() const; float get_scaled_total_width() const; - bool generate_icons_texture() const; + bool generate_icons_texture(); - void update_on_off_state(const Vec2d& mouse_pos); - std::string update_hover_state(const Vec2d& mouse_pos); + void update_hover_state(const EType &type); bool grabber_contains_mouse() const; }; diff --git a/src/slic3r/GUI/HintNotification.cpp b/src/slic3r/GUI/HintNotification.cpp index e88947d4dd0..95583a3cdd8 100644 --- a/src/slic3r/GUI/HintNotification.cpp +++ b/src/slic3r/GUI/HintNotification.cpp @@ -14,12 +14,14 @@ #include "libslic3r/Config.hpp" #include "libslic3r/PrintConfig.hpp" +#include + #include #include #include #include #include -#include + #include #include #include @@ -65,7 +67,7 @@ inline void push_style_color(ImGuiCol idx, const ImVec4& col, bool fading_out, f void write_used_binary(const std::vector& ids) { - boost::filesystem::ofstream file((boost::filesystem::path(data_dir()) / "cache" / "hints.cereal"), std::ios::binary); + boost::nowide::ofstream file((boost::filesystem::path(data_dir()) / "cache" / "hints.cereal").string(), std::ios::binary); cereal::BinaryOutputArchive archive(file); HintsCerealData cd { ids }; try @@ -84,7 +86,7 @@ void read_used_binary(std::vector& ids) BOOST_LOG_TRIVIAL(warning) << "Failed to load to hints.cereal. File does not exists. " << path.string(); return; } - boost::filesystem::ifstream file(path); + boost::nowide::ifstream file(path.string(), std::ios::binary); cereal::BinaryInputArchive archive(file); HintsCerealData cd; try @@ -342,7 +344,7 @@ void HintDatabase::load_hints_from_file(const boost::filesystem::path& path) bool was_displayed = is_used(id_string); //unescape text1 unescape_string_cstyle(dict["text"], fulltext); - fulltext = _utf8(fulltext); + fulltext = into_u8(_(fulltext)); #ifdef __APPLE__ boost::replace_all(fulltext, "Ctrl+", "⌘"); #endif //__APPLE__ @@ -368,19 +370,19 @@ void HintDatabase::load_hints_from_file(const boost::filesystem::path& path) fulltext.erase(hypertext_start, HYPERTEXT_MARKER_START.size()); if (fulltext.find(HYPERTEXT_MARKER_START) != std::string::npos) { // This must not happen - only 1 hypertext allowed - BOOST_LOG_TRIVIAL(error) << "Hint notification with multiple hypertexts: " << _utf8(dict["text"]); + BOOST_LOG_TRIVIAL(error) << "Hint notification with multiple hypertexts: " << dict["text"]; continue; } size_t hypertext_end = fulltext.find(HYPERTEXT_MARKER_END); if (hypertext_end == std::string::npos) { // hypertext was not correctly ended - BOOST_LOG_TRIVIAL(error) << "Hint notification without hypertext end marker: " << _utf8(dict["text"]); + BOOST_LOG_TRIVIAL(error) << "Hint notification without hypertext end marker: " << dict["text"]; continue; } fulltext.erase(hypertext_end, HYPERTEXT_MARKER_END.size()); if (fulltext.find(HYPERTEXT_MARKER_END) != std::string::npos) { // This must not happen - only 1 hypertext end allowed - BOOST_LOG_TRIVIAL(error) << "Hint notification with multiple hypertext end markers: " << _utf8(dict["text"]); + BOOST_LOG_TRIVIAL(error) << "Hint notification with multiple hypertext end markers: " << dict["text"]; continue; } @@ -421,9 +423,9 @@ void HintDatabase::load_hints_from_file(const boost::filesystem::path& path) m_loaded_hints.emplace_back(hint_data); // open preferences } else if(dict["hypertext_type"] == "preferences") { - int page = static_cast(std::atoi(dict["hypertext_preferences_page"].c_str())); + std::string page = dict["hypertext_preferences_page"]; std::string item = dict["hypertext_preferences_item"]; - HintData hint_data{ id_string, text1, weight, was_displayed, hypertext_text, follow_text, disabled_tags, enabled_tags, false, documentation_link, [page, item]() { wxGetApp().open_preferences(page, item); } }; + HintData hint_data{ id_string, text1, weight, was_displayed, hypertext_text, follow_text, disabled_tags, enabled_tags, false, documentation_link, [page, item]() { wxGetApp().open_preferences(item, page); } }; m_loaded_hints.emplace_back(hint_data); } else if (dict["hypertext_type"] == "plater") { std::string item = dict["hypertext_plater_item"]; @@ -881,7 +883,7 @@ void NotificationManager::HintNotification::render_close_button(ImGuiWrapper& im //render_right_arrow_button(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); render_logo(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); render_preferences_button(imgui, win_pos_x, win_pos_y); - if (!m_documentation_link.empty() && wxGetApp().app_config->get("suppress_hyperlinks") != "1") + if (!m_documentation_link.empty() && !wxGetApp().app_config->get_bool("suppress_hyperlinks")) { render_documentation_button(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); } @@ -928,7 +930,7 @@ void NotificationManager::HintNotification::render_preferences_button(ImGuiWrapp } if (imgui.button(button_text.c_str(), button_size.x, button_size.y)) { - wxGetApp().open_preferences(2, "show_hints"); + wxGetApp().open_preferences("show_hints", "GUI"); } ImGui::PopStyleColor(5); diff --git a/src/slic3r/GUI/I18N.hpp b/src/slic3r/GUI/I18N.hpp index 7bad6880e92..8616628eaf9 100644 --- a/src/slic3r/GUI/I18N.hpp +++ b/src/slic3r/GUI/I18N.hpp @@ -1,7 +1,6 @@ #ifndef _ #define _(s) Slic3r::GUI::I18N::translate((s)) #define _L(s) Slic3r::GUI::I18N::translate((s)) -#define _utf8(s) Slic3r::GUI::I18N::translate_utf8((s)) #define _u8L(s) Slic3r::GUI::I18N::translate_utf8((s)) #endif /* _ */ diff --git a/src/slic3r/GUI/IconManager.cpp b/src/slic3r/GUI/IconManager.cpp new file mode 100644 index 00000000000..45c76887c39 --- /dev/null +++ b/src/slic3r/GUI/IconManager.cpp @@ -0,0 +1,204 @@ +#include "IconManager.hpp" +#include +#include + +using namespace Slic3r::GUI; + +namespace priv { +// set shared pointer to point on bad texture +static void clear(IconManager::Icons &icons); +static const std::vector>& get_states(IconManager::RasterType type); +static void draw_transparent_icon(const IconManager::Icon &icon); // only help function +} + +IconManager::~IconManager() { + priv::clear(m_icons); + // release opengl texture is made in ~GLTexture() +} + +std::vector IconManager::init(const InitTypes &input) +{ + BOOST_LOG_TRIVIAL(error) << "Not implemented yet"; + return {}; +} + +std::vector IconManager::init(const std::vector &file_paths, const ImVec2 &size, RasterType type) +{ + // TODO: remove in future + if (!m_icons.empty()) { + // not first initialization + priv::clear(m_icons); + m_icons.clear(); + m_icons_texture.reset(); + } + + // only rectangle are supported + assert(size.x == size.y); + // no subpixel supported + unsigned int width = static_cast(std::abs(std::round(size.x))); + assert(size.x == static_cast(width)); + + // state order has to match the enum IconState + const auto& states = priv::get_states(type); + + bool compress = false; + bool is_loaded = m_icons_texture.load_from_svg_files_as_sprites_array(file_paths, states, width, compress); + if (!is_loaded || (size_t) m_icons_texture.get_width() < (states.size() * width) || + (size_t) m_icons_texture.get_height() < (file_paths.size() * width)) { + // bad load of icons, but all usage of m_icons_texture check that texture is initialized + assert(false); + m_icons_texture.reset(); + return {}; + } + + unsigned count_files = file_paths.size(); + // count icons per file + unsigned count = states.size(); + // create result + std::vector result; + result.reserve(count_files); + + Icon def_icon; + def_icon.tex_id = m_icons_texture.get_id(); + def_icon.size = size; + + // float beacouse of dividing + float tex_height = static_cast(m_icons_texture.get_height()); + float tex_width = static_cast(m_icons_texture.get_width()); + + //for (const auto &f: file_paths) { + for (unsigned f = 0; f < count_files; ++f) { + // NOTE: there are space between icons + unsigned start_y = static_cast(f) * (width + 1) + 1; + float y1 = start_y / tex_height; + float y2 = (start_y + width) / tex_height; + Icons file_icons; + file_icons.reserve(count); + //for (const auto &s : states) { + for (unsigned j = 0; j < count; ++j) { + auto icon = std::make_shared(def_icon); + // NOTE: there are space between icons + unsigned start_x = static_cast(j) * (width + 1) + 1; + float x1 = start_x / tex_width; + float x2 = (start_x + width) / tex_width; + icon->tl = ImVec2(x1, y1); + icon->br = ImVec2(x2, y2); + file_icons.push_back(icon); + m_icons.push_back(std::move(icon)); + } + result.emplace_back(std::move(file_icons)); + } + return result; +} + +void IconManager::release() { + BOOST_LOG_TRIVIAL(error) << "Not implemented yet"; +} + +void priv::clear(IconManager::Icons &icons) { + std::string message; + for (auto &icon : icons) { + // Exist more than this instance of shared ptr? + long count = icon.use_count(); + if (count != 1) { + // in existing icon change texture to non existing one + icon->tex_id = 0; + + std::string descr = + ((count > 2) ? (std::to_string(count - 1) + "x") : "") + // count + std::to_string(icon->size.x) + "x" + std::to_string(icon->size.y); // resolution + if (message.empty()) + message = descr; + else + message += ", " + descr; + } + } + + if (!message.empty()) + BOOST_LOG_TRIVIAL(warning) << "There is still used icons(" << message << ")."; +} + +const std::vector> &priv::get_states(IconManager::RasterType type) { + static std::vector> color = {std::make_pair(0, false)}; + static std::vector> white = {std::make_pair(1, false)}; + static std::vector> gray = {std::make_pair(2, false)}; + static std::vector> color_wite_gray = { + std::make_pair(1, false), // Activable + std::make_pair(0, false), // Hovered + std::make_pair(2, false) // Disabled + }; + + switch (type) { + case IconManager::RasterType::color: return color; + case IconManager::RasterType::white_only_data: return white; + case IconManager::RasterType::gray_only_data: return gray; + case IconManager::RasterType::color_wite_gray: return color_wite_gray; + default: return color; + } +} + +void priv::draw_transparent_icon(const IconManager::Icon &icon) +{ + // Check input + if (!icon.is_valid()) { + assert(false); + BOOST_LOG_TRIVIAL(warning) << "Drawing invalid Icon."; + ImGui::Text("?"); + return; + } + + // size UV texture coors [in texture ratio] + ImVec2 size_uv(icon.br.x - icon.tl.x, icon.br.y - icon.tl.y); + ImVec2 one_px(size_uv.x / icon.size.x, size_uv.y / icon.size.y); + + // use top left corner of first icon + IconManager::Icon icon_px = icon; // copy + // reduce uv coors to one pixel + icon_px.tl = ImVec2(0, 0); + icon_px.br = one_px; + draw(icon_px); +} + +namespace Slic3r::GUI { + +void draw(const IconManager::Icon &icon, const ImVec2 &size, const ImVec4 &tint_col, const ImVec4 &border_col) +{ + // Check input + if (!icon.is_valid()) { + assert(false); + BOOST_LOG_TRIVIAL(warning) << "Drawing invalid Icon."; + ImGui::Text("?"); + return; + } + + ImTextureID id = (void *)static_cast(icon.tex_id); + const ImVec2 &s = (size.x < 1 || size.y < 1) ? icon.size : size; + ImGui::Image(id, s, icon.tl, icon.br, tint_col, border_col); +} + +bool clickable(const IconManager::Icon &icon, const IconManager::Icon &icon_hover) +{ + // check of hover + float cursor_x = ImGui::GetCursorPosX(); + priv::draw_transparent_icon(icon); + ImGui::SameLine(cursor_x); + if (ImGui::IsItemHovered()) { + // redraw image + draw(icon_hover); + } else { + // redraw normal image + draw(icon); + } + return ImGui::IsItemClicked(); +} + +bool button(const IconManager::Icon &activ, const IconManager::Icon &hover, const IconManager::Icon &disable, bool disabled) +{ + if (disabled) { + draw(disable); + return false; + } + return clickable(activ, hover); +} + +} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/IconManager.hpp b/src/slic3r/GUI/IconManager.hpp new file mode 100644 index 00000000000..aa7afda8009 --- /dev/null +++ b/src/slic3r/GUI/IconManager.hpp @@ -0,0 +1,132 @@ +#ifndef slic3r_IconManager_hpp_ +#define slic3r_IconManager_hpp_ + +#include +#include +#include "imgui/imgui.h" // ImVec2 +#include "slic3r/GUI/GLTexture.hpp" // texture storage + +namespace Slic3r::GUI { + +/// +/// Keep texture with icons for UI +/// Manage texture live -> create and destruct texture +/// by live of icon shared pointers. +/// +class IconManager +{ +public: + /// + /// Release texture + /// Set shared pointers to invalid texture + /// + ~IconManager(); + + /// + /// Define way to convert svg data to raster + /// + enum class RasterType: int{ + color = 1 << 1, + white_only_data = 1 << 2, + gray_only_data = 1 << 3, + color_wite_gray = color | white_only_data | gray_only_data + // TODO: add type with backgrounds + }; + + struct InitType { + // path to file with image .. svg + std::string filepath; + + // resolution of stored rasterized icon + ImVec2 size; // float will be rounded + + // could contain more than one type + RasterType type = RasterType::color; + // together color, white and gray = color | white_only_data | gray_only_data + }; + using InitTypes = std::vector; + + /// + /// Data for render texture with icon + /// + struct Icon { + // stored texture size + ImVec2 size = ImVec2(-1, -1); // [in px] --> unsigned int values stored as float + + // SubTexture UV coordinate in range from 0. to 1. + ImVec2 tl; // top left -> uv0 + ImVec2 br; // bottom right -> uv1 + + // OpenGL texture id + unsigned int tex_id = 0; + bool is_valid() const { return tex_id != 0;} + // && size.x > 0 && size.y > 0 && tl.x != br.x && tl.y != br.y; + }; + using Icons = std::vector >; + // Vector of icons, each vector contain multiple use of a SVG render + using VIcons = std::vector; + + /// + /// Initialize raster texture on GPU with given images + /// NOTE: Have to be called after OpenGL initialization + /// + /// Define files and its + /// Rasterized icons stored on GPU, + /// Same size and order as input, each item of vector is set of texture in order by RasterType + VIcons init(const InitTypes &input); + + /// + /// Initialize multiple icons with same settings for size and type + /// NOTE: Have to be called after OpenGL initialization + /// + /// Define files with icon + /// Size of stored texture[in px], float will be rounded + /// Define way to rasterize icon, + /// together color, white and gray = RasterType::color | RasterType::white_only_data | RasterType::gray_only_data + /// Rasterized icons stored on GPU, + /// Same size and order as file_paths, each item of vector is set of texture in order by RasterType + VIcons init(const std::vector &file_paths, const ImVec2 &size, RasterType type = RasterType::color); + + /// + /// Release icons which are hold only by this manager + /// May change texture and position of icons. + /// + void release(); + +private: + // keep data stored on GPU + GLTexture m_icons_texture; + Icons m_icons; +}; + +/// +/// Draw imgui image with icon +/// +/// Place in texture +/// [optional]Size of image, wen zero than use same size as stored texture +/// viz ImGui::Image +/// viz ImGui::Image +void draw(const IconManager::Icon &icon, + const ImVec2 &size = ImVec2(0, 0), + const ImVec4 &tint_col = ImVec4(1, 1, 1, 1), + const ImVec4 &border_col = ImVec4(0, 0, 0, 0)); + +/// +/// Draw icon which change on hover +/// +/// Draw when no hover +/// Draw when hover +/// True when click, otherwise False +bool clickable(const IconManager::Icon &icon, const IconManager::Icon &icon_hover); + +/// +/// Use icon as button with 3 states activ hover and disabled +/// +/// Not disabled not hovered image +/// Hovered image +/// Disabled image +/// True when click on enabled, otherwise False +bool button(const IconManager::Icon &activ, const IconManager::Icon &hover, const IconManager::Icon &disable, bool disabled = false); + +} // namespace Slic3r::GUI +#endif // slic3r_IconManager_hpp_ \ No newline at end of file diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index 66f1b6d4d71..55bf576028a 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -25,15 +25,21 @@ #include "libslic3r/libslic3r.h" #include "libslic3r/Utils.hpp" +#include "libslic3r/Color.hpp" + #include "3DScene.hpp" #include "GUI.hpp" #include "I18N.hpp" #include "Search.hpp" #include "BitmapCache.hpp" +#include "GUI_App.hpp" #include "../Utils/MacDarkMode.hpp" -#include "nanosvg/nanosvg.h" -#include "nanosvg/nanosvgrast.h" +#include +#include + +// suggest location +#include "libslic3r/ClipperUtils.hpp" // Slic3r::intersection namespace Slic3r { namespace GUI { @@ -52,8 +58,30 @@ static const std::map font_icons = { {ImGui::PreferencesButton , "notification_preferences" }, {ImGui::PreferencesHoverButton, "notification_preferences_hover"}, {ImGui::SliderFloatEditBtnIcon, "edit_button" }, + {ImGui::SliderFloatEditBtnPressedIcon, "edit_button_pressed" }, + {ImGui::ClipboardBtnIcon , "copy_menu" }, + {ImGui::ExpandBtn , "expand_btn" }, + {ImGui::CollapseBtn , "collapse_btn" }, + {ImGui::RevertButton , "undo" }, + {ImGui::WarningMarkerSmall , "notification_warning" }, + {ImGui::InfoMarkerSmall , "notification_info" }, + {ImGui::PlugMarker , "plug" }, + {ImGui::DowelMarker , "dowel" }, }; + static const std::map font_icons_large = { + {ImGui::LegendTravel , "legend_travel" }, + {ImGui::LegendWipe , "legend_wipe" }, + {ImGui::LegendRetract , "legend_retract" }, + {ImGui::LegendDeretract , "legend_deretract" }, + {ImGui::LegendSeams , "legend_seams" }, + {ImGui::LegendToolChanges , "legend_toolchanges" }, + {ImGui::LegendColorChanges , "legend_colorchanges" }, + {ImGui::LegendPausePrints , "legend_pauseprints" }, + {ImGui::LegendCustomGCodes , "legend_customgcodes" }, + {ImGui::LegendCOG , "legend_cog" }, + {ImGui::LegendShells , "legend_shells" }, + {ImGui::LegendToolMarker , "legend_toolmarker" }, {ImGui::CloseNotifButton , "notification_close" }, {ImGui::CloseNotifHoverButton , "notification_close_hover" }, {ImGui::EjectButton , "notification_eject_sd" }, @@ -70,22 +98,26 @@ static const std::map font_icons_large = { {ImGui::DocumentationButton , "notification_documentation" }, {ImGui::DocumentationHoverButton, "notification_documentation_hover"}, {ImGui::InfoMarker , "notification_info" }, - + {ImGui::PlayButton , "notification_play" }, + {ImGui::PlayHoverButton , "notification_play_hover" }, + {ImGui::PauseButton , "notification_pause" }, + {ImGui::PauseHoverButton , "notification_pause_hover" }, + {ImGui::OpenButton , "notification_open" }, + {ImGui::OpenHoverButton , "notification_open_hover" }, }; static const std::map font_icons_extra_large = { {ImGui::ClippyMarker , "notification_clippy" }, - }; -const ImVec4 ImGuiWrapper::COL_GREY_DARK = { 0.333f, 0.333f, 0.333f, 1.0f }; +const ImVec4 ImGuiWrapper::COL_GREY_DARK = { 0.33f, 0.33f, 0.33f, 1.0f }; const ImVec4 ImGuiWrapper::COL_GREY_LIGHT = { 0.4f, 0.4f, 0.4f, 1.0f }; -const ImVec4 ImGuiWrapper::COL_ORANGE_DARK = { 0.757f, 0.404f, 0.216f, 1.0f }; -const ImVec4 ImGuiWrapper::COL_ORANGE_LIGHT = { 1.0f, 0.49f, 0.216f, 1.0f }; -const ImVec4 ImGuiWrapper::COL_WINDOW_BACKGROUND = { 0.133f, 0.133f, 0.133f, 0.8f }; +const ImVec4 ImGuiWrapper::COL_ORANGE_DARK = { 0.67f, 0.36f, 0.19f, 1.0f }; +const ImVec4 ImGuiWrapper::COL_ORANGE_LIGHT = to_ImVec4(ColorRGBA::ORANGE()); +const ImVec4 ImGuiWrapper::COL_WINDOW_BACKGROUND = { 0.13f, 0.13f, 0.13f, 0.8f }; const ImVec4 ImGuiWrapper::COL_BUTTON_BACKGROUND = COL_ORANGE_DARK; const ImVec4 ImGuiWrapper::COL_BUTTON_HOVERED = COL_ORANGE_LIGHT; -const ImVec4 ImGuiWrapper::COL_BUTTON_ACTIVE = ImGuiWrapper::COL_BUTTON_HOVERED; +const ImVec4 ImGuiWrapper::COL_BUTTON_ACTIVE = COL_BUTTON_HOVERED; ImGuiWrapper::ImGuiWrapper() { @@ -211,6 +243,9 @@ bool ImGuiWrapper::update_mouse_data(wxMouseEvent& evt) io.MouseDown[0] = evt.LeftIsDown(); io.MouseDown[1] = evt.RightIsDown(); io.MouseDown[2] = evt.MiddleIsDown(); + io.MouseDoubleClicked[0] = evt.LeftDClick(); + io.MouseDoubleClicked[1] = evt.RightDClick(); + io.MouseDoubleClicked[2] = evt.MiddleDClick(); float wheel_delta = static_cast(evt.GetWheelDelta()); if (wheel_delta != 0.0f) io.MouseWheel = static_cast(evt.GetWheelRotation()) / wheel_delta; @@ -229,20 +264,39 @@ bool ImGuiWrapper::update_key_data(wxKeyEvent &evt) return false; } + auto to_string = [](wxEventType type) -> std::string { + if (type == wxEVT_CHAR) return "Char"; + if (type == wxEVT_KEY_DOWN) return "KeyDown"; + if (type == wxEVT_KEY_UP) return "KeyUp"; + return "Other"; + }; + + wxEventType type = evt.GetEventType(); ImGuiIO& io = ImGui::GetIO(); + BOOST_LOG_TRIVIAL(debug) << "ImGui - key event(" << to_string(type) << "):" + //<< " Unicode(" << evt.GetUnicodeKey() << ")" + << " KeyCode(" << evt.GetKeyCode() << ")"; - if (evt.GetEventType() == wxEVT_CHAR) { + if (type == wxEVT_CHAR) { // Char event - const auto key = evt.GetUnicodeKey(); + const auto key = evt.GetUnicodeKey(); + + // Release BackSpace, Delete, ... when miss wxEVT_KEY_UP event + // Already Fixed at begining of new frame + // unsigned int key_u = static_cast(key); + //if (key_u >= 0 && key_u < IM_ARRAYSIZE(io.KeysDown) && io.KeysDown[key_u]) { + // io.KeysDown[key_u] = false; + //} + if (key != 0) { io.AddInputCharacter(key); } - } else { + } else if (type == wxEVT_KEY_DOWN || type == wxEVT_KEY_UP) { // Key up/down event int key = evt.GetKeyCode(); wxCHECK_MSG(key >= 0 && key < IM_ARRAYSIZE(io.KeysDown), false, "Received invalid key code"); - io.KeysDown[key] = evt.GetEventType() == wxEVT_KEY_DOWN; + io.KeysDown[key] = (type == wxEVT_KEY_DOWN); io.KeyShift = evt.ShiftDown(); io.KeyCtrl = evt.ControlDown(); io.KeyAlt = evt.AltDown(); @@ -254,6 +308,7 @@ bool ImGuiWrapper::update_key_data(wxKeyEvent &evt) return ret; } +#include void ImGuiWrapper::new_frame() { if (m_new_frame_open) { @@ -264,6 +319,35 @@ void ImGuiWrapper::new_frame() init_font(true); } + ImGuiIO& io = ImGui::GetIO(); + // synchronize key states + // when the application loses the focus it may happen that the key up event is not processed + + // synchronize modifier keys + constexpr std::array, 3> imgui_mod_keys{ + std::make_pair(ImGuiKeyModFlags_Ctrl, WXK_CONTROL), + std::make_pair(ImGuiKeyModFlags_Shift, WXK_SHIFT), + std::make_pair(ImGuiKeyModFlags_Alt, WXK_ALT)}; + for (const std::pair& key : imgui_mod_keys) { + if ((io.KeyMods & key.first) != 0 && !wxGetKeyState(key.second)) + io.KeyMods &= ~key.first; + } + + // Not sure if it is neccessary + // values from 33 to 126 are reserved for the standard ASCII characters + for (size_t i = 33; i <= 126; ++i) { + wxKeyCode keycode = static_cast(i); + if (io.KeysDown[i] && keycode != WXK_NONE && !wxGetKeyState(keycode)) + io.KeysDown[i] = false; + } + + // special keys: delete, backspace, ... + for (int key: io.KeyMap) { + wxKeyCode keycode = static_cast(key); + if (io.KeysDown[key] && keycode != WXK_NONE && !wxGetKeyState(keycode)) + io.KeysDown[key] = false; + } + ImGui::NewFrame(); m_new_frame_open = true; } @@ -275,10 +359,27 @@ void ImGuiWrapper::render() m_new_frame_open = false; } -ImVec2 ImGuiWrapper::calc_text_size(const wxString &text, float wrap_width) const +ImVec2 ImGuiWrapper::calc_text_size(std::string_view text, + bool hide_text_after_double_hash, + float wrap_width) +{ + return ImGui::CalcTextSize(text.data(), text.data() + text.length(), + hide_text_after_double_hash, wrap_width); +} + +ImVec2 ImGuiWrapper::calc_text_size(const std::string& text, + bool hide_text_after_double_hash, + float wrap_width) +{ + return ImGui::CalcTextSize(text.c_str(), NULL, hide_text_after_double_hash, wrap_width); +} + +ImVec2 ImGuiWrapper::calc_text_size(const wxString &text, + bool hide_text_after_double_hash, + float wrap_width) { auto text_utf8 = into_u8(text); - ImVec2 size = ImGui::CalcTextSize(text_utf8.c_str(), NULL, false, wrap_width); + ImVec2 size = ImGui::CalcTextSize(text_utf8.c_str(), NULL, hide_text_after_double_hash, wrap_width); /*#ifdef __linux__ size.x *= m_style_scaling; @@ -352,10 +453,17 @@ void ImGuiWrapper::end() ImGui::End(); } -bool ImGuiWrapper::button(const wxString &label) +bool ImGuiWrapper::button(const wxString &label, const wxString& tooltip) { auto label_utf8 = into_u8(label); - return ImGui::Button(label_utf8.c_str()); + const bool ret = ImGui::Button(label_utf8.c_str()); + + if (!tooltip.IsEmpty() && ImGui::IsItemHovered()) { + auto tooltip_utf8 = into_u8(tooltip); + ImGui::SetTooltip(tooltip_utf8.c_str()); + } + + return ret; } bool ImGuiWrapper::button(const wxString& label, float width, float height) @@ -364,45 +472,56 @@ bool ImGuiWrapper::button(const wxString& label, float width, float height) return ImGui::Button(label_utf8.c_str(), ImVec2(width, height)); } -bool ImGuiWrapper::radio_button(const wxString &label, bool active) +bool ImGuiWrapper::button(const wxString& label, const ImVec2 &size, bool enable) { + disabled_begin(!enable); + auto label_utf8 = into_u8(label); - return ImGui::RadioButton(label_utf8.c_str(), active); -} + bool res = ImGui::Button(label_utf8.c_str(), size); -bool ImGuiWrapper::image_button() -{ - return false; + disabled_end(); + return (enable) ? res : false; } -bool ImGuiWrapper::input_double(const std::string &label, const double &value, const std::string &format) -{ - return ImGui::InputDouble(label.c_str(), const_cast(&value), 0.0f, 0.0f, format.c_str(), ImGuiInputTextFlags_CharsDecimal); -} -bool ImGuiWrapper::input_double(const wxString &label, const double &value, const std::string &format) +bool ImGuiWrapper::radio_button(const wxString &label, bool active) { auto label_utf8 = into_u8(label); - return input_double(label_utf8, value, format); + return ImGui::RadioButton(label_utf8.c_str(), active); } -bool ImGuiWrapper::input_vec3(const std::string &label, const Vec3d &value, float width, const std::string &format) +bool ImGuiWrapper::draw_radio_button(const std::string& name, float size, bool active, + std::function draw_callback) { - bool value_changed = false; + ImGuiWindow& window = *ImGui::GetCurrentWindow(); + if (window.SkipItems) + return false; - ImGui::BeginGroup(); + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const ImGuiID id = window.GetID(name.c_str()); - for (int i = 0; i < 3; ++i) - { - std::string item_label = (i == 0) ? "X" : ((i == 1) ? "Y" : "Z"); - ImGui::PushID(i); - ImGui::PushItemWidth(width); - value_changed |= ImGui::InputDouble(item_label.c_str(), const_cast(&value(i)), 0.0f, 0.0f, format.c_str()); - ImGui::PopID(); - } - ImGui::EndGroup(); + const ImVec2 pos = window.DC.CursorPos; + const ImRect total_bb(pos, pos + ImVec2(size, size + style.FramePadding.y * 2.0f)); + ImGui::ItemSize(total_bb, style.FramePadding.y); + if (!ImGui::ItemAdd(total_bb, id)) + return false; + + bool hovered, held; + bool pressed = ImGui::ButtonBehavior(total_bb, id, &hovered, &held); + if (pressed) + ImGui::MarkItemEdited(id); + + if (hovered) + window.DrawList->AddRect({ pos.x - 1.0f, pos.y - 1.0f }, { pos.x + size + 1.0f, pos.y + size + 1.0f }, ImGui::GetColorU32(ImGuiCol_CheckMark)); - return value_changed; + if (active) + window.DrawList->AddRect(pos, { pos.x + size, pos.y + size }, ImGui::GetColorU32(ImGuiCol_CheckMark)); + + draw_callback(window, pos, size); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window.DC.LastItemStatusFlags); + return pressed; } bool ImGuiWrapper::checkbox(const wxString &label, bool &value) @@ -418,13 +537,13 @@ void ImGuiWrapper::text(const char *label) void ImGuiWrapper::text(const std::string &label) { - this->text(label.c_str()); + ImGuiWrapper::text(label.c_str()); } void ImGuiWrapper::text(const wxString &label) { auto label_utf8 = into_u8(label); - this->text(label_utf8.c_str()); + ImGuiWrapper::text(label_utf8.c_str()); } void ImGuiWrapper::text_colored(const ImVec4& color, const char* label) @@ -434,13 +553,13 @@ void ImGuiWrapper::text_colored(const ImVec4& color, const char* label) void ImGuiWrapper::text_colored(const ImVec4& color, const std::string& label) { - this->text_colored(color, label.c_str()); + ImGuiWrapper::text_colored(color, label.c_str()); } void ImGuiWrapper::text_colored(const ImVec4& color, const wxString& label) { auto label_utf8 = into_u8(label); - this->text_colored(color, label_utf8.c_str()); + ImGuiWrapper::text_colored(color, label_utf8.c_str()); } void ImGuiWrapper::text_wrapped(const char *label, float wrap_width) @@ -463,20 +582,20 @@ void ImGuiWrapper::text_wrapped(const wxString &label, float wrap_width) void ImGuiWrapper::tooltip(const char *label, float wrap_width) { + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 4.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, { 8.0f, 8.0f }); ImGui::BeginTooltip(); ImGui::PushTextWrapPos(wrap_width); ImGui::TextUnformatted(label); ImGui::PopTextWrapPos(); ImGui::EndTooltip(); + ImGui::PopStyleVar(3); } void ImGuiWrapper::tooltip(const wxString &label, float wrap_width) { - ImGui::BeginTooltip(); - ImGui::PushTextWrapPos(wrap_width); - ImGui::TextUnformatted(label.ToUTF8().data()); - ImGui::PopTextWrapPos(); - ImGui::EndTooltip(); + tooltip(label.ToUTF8().data(), wrap_width); } ImVec2 ImGuiWrapper::get_slider_icon_size() const @@ -489,7 +608,7 @@ bool ImGuiWrapper::slider_float(const char* label, float* v, float v_min, float const float max_tooltip_width = ImGui::GetFontSize() * 20.0f; // let the label string start with "##" to hide the automatic label from ImGui::SliderFloat() - bool label_visible = !boost::algorithm::istarts_with(label, "##"); + bool label_visible = !boost::algorithm::starts_with(label, "##"); std::string str_label = label_visible ? std::string("##") + std::string(label) : std::string(label); // removes 2nd evenience of "##", if present @@ -497,6 +616,9 @@ bool ImGuiWrapper::slider_float(const char* label, float* v, float v_min, float if (pos != std::string::npos) str_label = str_label.substr(0, pos) + str_label.substr(pos + 2); + // the current slider edit state needs to be detected here before calling SliderFloat() + bool slider_editing = ImGui::GetCurrentWindow()->GetID(str_label.c_str()) == ImGui::GetActiveID(); + bool ret = ImGui::SliderFloat(str_label.c_str(), v, v_min, v_max, format, power); m_last_slider_status.hovered = ImGui::IsItemHovered(); @@ -514,15 +636,32 @@ bool ImGuiWrapper::slider_float(const char* label, float* v, float v_min, float if (show_edit_btn) { ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, { 1, style.ItemSpacing.y }); ImGui::SameLine(); - std::wstring btn_name = ImGui::SliderFloatEditBtnIcon + boost::nowide::widen(str_label); + + ImGuiIO& io = ImGui::GetIO(); + assert(io.Fonts->TexWidth > 0 && io.Fonts->TexHeight > 0); + float inv_tex_w = 1.0f / float(io.Fonts->TexWidth); + float inv_tex_h = 1.0f / float(io.Fonts->TexHeight); + + const ImFontAtlasCustomRect* const rect = GetTextureCustomRect(slider_editing ? ImGui::SliderFloatEditBtnPressedIcon : ImGui::SliderFloatEditBtnIcon); + const ImVec2 size = { float(rect->Width), float(rect->Height) }; + const ImVec2 uv0 = ImVec2(float(rect->X) * inv_tex_w, float(rect->Y) * inv_tex_h); + const ImVec2 uv1 = ImVec2(float(rect->X + rect->Width) * inv_tex_w, float(rect->Y + rect->Height) * inv_tex_h); + ImGui::PushStyleColor(ImGuiCol_Button, { 0.25f, 0.25f, 0.25f, 0.0f }); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, { 0.5f, 0.5f, 0.5f, 1.0f }); - ImGui::PushStyleColor(ImGuiCol_ButtonActive, { 0.5f, 0.5f, 0.5f, 1.0f }); - if (ImGui::Button(into_u8(btn_name).c_str())) { - ImGui::SetKeyboardFocusHere(-1); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, { 0.4f, 0.4f, 0.4f, 1.0f }); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, { 0.4f, 0.4f, 0.4f, 1.0f }); + + const ImTextureID tex_id = io.Fonts->TexID; + if (image_button(tex_id, size, uv0, uv1, -1, ImVec4(0.0, 0.0, 0.0, 0.0), ImVec4(1.0, 1.0, 1.0, 1.0), ImGuiButtonFlags_PressedOnClick)) { + if (!slider_editing) + ImGui::SetKeyboardFocusHere(-1); + else + ImGui::ClearActiveID(); this->set_requires_extra_frame(); } + ImGui::PopStyleColor(3); + if (ImGui::IsItemHovered()) this->tooltip(into_u8(_L("Edit")).c_str(), max_tooltip_width); @@ -556,17 +695,84 @@ bool ImGuiWrapper::slider_float(const wxString& label, float* v, float v_min, fl return this->slider_float(label_utf8.c_str(), v, v_min, v_max, format, power, clamp, tooltip, show_edit_btn); } -bool ImGuiWrapper::combo(const wxString& label, const std::vector& options, int& selection) +static bool image_button_ex(ImGuiID id, ImTextureID texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec2& padding, const ImVec4& bg_col, const ImVec4& tint_col, ImGuiButtonFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = ImGui::GetCurrentWindow(); + if (window->SkipItems) + return false; + + const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size + padding * 2); + ImGui::ItemSize(bb); + if (!ImGui::ItemAdd(bb, id)) + return false; + + bool hovered, held; + bool pressed = ImGui::ButtonBehavior(bb, id, &hovered, &held, flags); + + // Render + const ImU32 col = ImGui::GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); + ImGui::RenderNavHighlight(bb, id); + ImGui::RenderFrame(bb.Min, bb.Max, col, true, ImClamp((float)ImMin(padding.x, padding.y), 0.0f, g.Style.FrameRounding)); + if (bg_col.w > 0.0f) + window->DrawList->AddRectFilled(bb.Min + padding, bb.Max - padding, ImGui::GetColorU32(bg_col)); + window->DrawList->AddImage(texture_id, bb.Min + padding, bb.Max - padding, uv0, uv1, ImGui::GetColorU32(tint_col)); + + return pressed; +} + +bool ImGuiWrapper::image_button(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, int frame_padding, const ImVec4& bg_col, const ImVec4& tint_col, ImGuiButtonFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return false; + + // Default to using texture ID as ID. User can still push string/integer prefixes. + ImGui::PushID((void*)(intptr_t)user_texture_id); + const ImGuiID id = window->GetID("#image"); + ImGui::PopID(); + + const ImVec2 padding = (frame_padding >= 0) ? ImVec2((float)frame_padding, (float)frame_padding) : g.Style.FramePadding; + return image_button_ex(id, user_texture_id, size, uv0, uv1, padding, bg_col, tint_col, flags); +} + +bool ImGuiWrapper::image_button(const wchar_t icon, const wxString& tooltip) +{ + const ImGuiIO& io = ImGui::GetIO(); + const ImTextureID tex_id = io.Fonts->TexID; + assert(io.Fonts->TexWidth > 0 && io.Fonts->TexHeight > 0); + const float inv_tex_w = 1.0f / float(io.Fonts->TexWidth); + const float inv_tex_h = 1.0f / float(io.Fonts->TexHeight); + const ImFontAtlasCustomRect* const rect = GetTextureCustomRect(icon); + const ImVec2 size = { float(rect->Width), float(rect->Height) }; + const ImVec2 uv0 = ImVec2(float(rect->X) * inv_tex_w, float(rect->Y) * inv_tex_h); + const ImVec2 uv1 = ImVec2(float(rect->X + rect->Width) * inv_tex_w, float(rect->Y + rect->Height) * inv_tex_h); + ImGui::PushStyleColor(ImGuiCol_Button, { 0.25f, 0.25f, 0.25f, 0.0f }); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, { 0.4f, 0.4f, 0.4f, 1.0f }); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, { 0.25f, 0.25f, 0.25f, 1.0f }); + const bool res = image_button(tex_id, size, uv0, uv1); + ImGui::PopStyleColor(3); + + if (!tooltip.empty() && ImGui::IsItemHovered()) + this->tooltip(tooltip, ImGui::GetFontSize() * 20.0f); + + return res; +} + +bool ImGuiWrapper::combo(const wxString& label, const std::vector& options, int& selection, ImGuiComboFlags flags) { // this is to force the label to the left of the widget: - text(label); - ImGui::SameLine(); + if (!label.empty()) { + text(label); + ImGui::SameLine(); + } int selection_out = selection; bool res = false; const char *selection_str = selection < int(options.size()) && selection >= 0 ? options[selection].c_str() : ""; - if (ImGui::BeginCombo("", selection_str)) { + if (ImGui::BeginCombo("", selection_str, flags)) { for (int i = 0; i < (int)options.size(); i++) { if (ImGui::Selectable(options[i].c_str(), i == selection)) { selection_out = i; @@ -876,7 +1082,7 @@ void ImGuiWrapper::search_list(const ImVec2& size_, bool (*items_getter)(int, co // The press on Esc key invokes editing of InputText (removes last changes) // So we should save previous value... std::string str = search_str; - ImGui::InputTextEx("", NULL, search_str, 40, search_size, ImGuiInputTextFlags_AutoSelectAll, NULL, NULL); + ImGui::InputTextEx("", NULL, search_str, 240, search_size, ImGuiInputTextFlags_AutoSelectAll, NULL, NULL); edited = ImGui::IsItemEdited(); if (edited) hovered_id = 0; @@ -1010,6 +1216,353 @@ bool ImGuiWrapper::want_any_input() const return io.WantCaptureMouse || io.WantCaptureKeyboard || io.WantTextInput; } +ImFontAtlasCustomRect* ImGuiWrapper::GetTextureCustomRect(const wchar_t& tex_id) +{ + auto item = m_custom_glyph_rects_ids.find(tex_id); + return (item != m_custom_glyph_rects_ids.end()) ? ImGui::GetIO().Fonts->GetCustomRectByIndex(m_custom_glyph_rects_ids[tex_id]) : nullptr; +} + +void ImGuiWrapper::disable_background_fadeout_animation() +{ + GImGui->DimBgRatio = 1.0f; +} + +ImU32 ImGuiWrapper::to_ImU32(const ColorRGBA& color) +{ + return ImGui::GetColorU32({ color.r(), color.g(), color.b(), color.a() }); +} + +ImVec4 ImGuiWrapper::to_ImVec4(const ColorRGBA& color) +{ + return { color.r(), color.g(), color.b(), color.a() }; +} + +ColorRGBA ImGuiWrapper::from_ImU32(const ImU32& color) +{ + return from_ImVec4(ImGui::ColorConvertU32ToFloat4(color)); +} + +ColorRGBA ImGuiWrapper::from_ImVec4(const ImVec4& color) +{ + return { color.x, color.y, color.z, color.w }; +} + +template +static bool input_optional(std::optional &v, Func& f, std::function is_default, const T& def_val) +{ + if (v.has_value()) { + if (f(*v)) { + if (is_default(*v)) v.reset(); + return true; + } + } else { + T val = def_val; + if (f(val)) { + if (!is_default(val)) v = val; + return true; + } + } + return false; +} + +bool ImGuiWrapper::input_optional_int(const char * label, + std::optional& v, + int step, + int step_fast, + ImGuiInputTextFlags flags, + int def_val) +{ + auto func = [&](int &value) { + return ImGui::InputInt(label, &value, step, step_fast, flags); + }; + std::function is_default = + [def_val](const int &value) -> bool { return value == def_val; }; + return input_optional(v, func, is_default, def_val); +} + +bool ImGuiWrapper::input_optional_float(const char * label, + std::optional &v, + float step, + float step_fast, + const char * format, + ImGuiInputTextFlags flags, + float def_val) +{ + auto func = [&](float &value) { + return ImGui::InputFloat(label, &value, step, step_fast, format, flags); + }; + std::function is_default = + [def_val](const float &value) -> bool { + return std::fabs(value-def_val) <= std::numeric_limits::epsilon(); + }; + return input_optional(v, func, is_default, def_val); +} + +bool ImGuiWrapper::drag_optional_float(const char * label, + std::optional &v, + float v_speed, + float v_min, + float v_max, + const char * format, + float power, + float def_val) +{ + auto func = [&](float &value) { + return ImGui::DragFloat(label, &value, v_speed, v_min, v_max, format, power); + }; + std::function is_default = + [def_val](const float &value) -> bool { + return std::fabs(value-def_val) <= std::numeric_limits::epsilon(); + }; + return input_optional(v, func, is_default, def_val); +} + +bool ImGuiWrapper::slider_optional_float(const char *label, + std::optional &v, + float v_min, + float v_max, + const char *format, + float power, + bool clamp, + const wxString &tooltip, + bool show_edit_btn, + float def_val) +{ + auto func = [&](float &value) { + return slider_float(label, &value, v_min, v_max, format, power, clamp, tooltip, show_edit_btn); + }; + std::function is_default = + [def_val](const float &value) -> bool { + return std::fabs(value - def_val) <= std::numeric_limits::epsilon(); + }; + return input_optional(v, func, is_default, def_val); +} + +bool ImGuiWrapper::slider_optional_int(const char *label, + std::optional &v, + int v_min, + int v_max, + const char *format, + float power, + bool clamp, + const wxString &tooltip, + bool show_edit_btn, + int def_val) +{ + std::optional val; + if (v.has_value()) val = static_cast(*v); + auto func = [&](float &value) { + return slider_float(label, &value, v_min, v_max, format, power, clamp, tooltip, show_edit_btn); + }; + std::function is_default = + [def_val](const float &value) -> bool { + return std::fabs(value - def_val) < 0.9f; + }; + + float default_value = static_cast(def_val); + if (input_optional(val, func, is_default, default_value)) { + if (val.has_value()) + v = static_cast(std::round(*val)); + else + v.reset(); + return true; + } else return false; +} + +void ImGuiWrapper::left_inputs() { + ImGui::ClearActiveID(); +} + +std::string ImGuiWrapper::trunc(const std::string &text, + float width, + const char * tail) +{ + float text_width = ImGui::CalcTextSize(text.c_str()).x; + if (text_width < width) return text; + float tail_width = ImGui::CalcTextSize(tail).x; + assert(width > tail_width); + if (width <= tail_width) return "Error: Can't add tail and not be under wanted width."; + float allowed_width = width - tail_width; + + // guess approx count of letter + float average_letter_width = calc_text_size(std::string_view("n")).x; // average letter width + unsigned count_letter = static_cast(allowed_width / average_letter_width); + + std::string_view text_ = text; + std::string_view result_text = text_.substr(0, count_letter); + text_width = calc_text_size(result_text).x; + if (text_width < allowed_width) { + // increase letter count + while (count_letter < text.length()) { + ++count_letter; + std::string_view act_text = text_.substr(0, count_letter); + text_width = calc_text_size(act_text).x; + if (text_width > allowed_width) break; + result_text = act_text; + } + } else { + // decrease letter count + while (count_letter > 1) { + --count_letter; + result_text = text_.substr(0, count_letter); + text_width = calc_text_size(result_text).x; + if (text_width < allowed_width) break; + } + } + return std::string(result_text) + tail; +} + +void ImGuiWrapper::escape_double_hash(std::string &text) +{ + // add space between hashes + const std::string search = "##"; + const std::string replace = "# #"; + size_t pos = 0; + while ((pos = text.find(search, pos)) != std::string::npos) + text.replace(pos, search.length(), replace); +} + +ImVec2 ImGuiWrapper::suggest_location(const ImVec2 &dialog_size, + const Slic3r::Polygon &interest, + const ImVec2 &canvas_size) +{ + // IMPROVE 1: do not select place over menu + // BoundingBox top_menu; + // GLGizmosManager &gizmo_mng = canvas->get_gizmos_manager(); + // BoundingBox side_menu; // gizmo_mng.get_size(); + // BoundingBox left_bottom_menu; // is permanent? + // NotificationManager *notify_mng = plater->get_notification_manager(); + // BoundingBox notifications; // notify_mng->get_size(); + // m_window_width, m_window_height + position + + // IMPROVE 2: use polygon of interest not only bounding box + BoundingBox bb(interest.points); + Point center = bb.center(); // interest.centroid(); + + // area size + Point window_center(canvas_size.x / 2, canvas_size.y / 2); + + // mov on side + Point bb_half_size = (bb.max - bb.min) / 2 + Point(1,1); + Point diff_center = window_center - center; + Vec2d diff_norm(diff_center.x() / (double) bb_half_size.x(), + diff_center.y() / (double) bb_half_size.y()); + if (diff_norm.x() > 1.) diff_norm.x() = 1.; + if (diff_norm.x() < -1.) diff_norm.x() = -1.; + if (diff_norm.y() > 1.) diff_norm.y() = 1.; + if (diff_norm.y() < -1.) diff_norm.y() = -1.; + + Vec2d abs_diff(abs(diff_norm.x()), abs(diff_norm.y())); + if (abs_diff.x() < 1. && abs_diff.y() < 1.) { + if (abs_diff.x() > abs_diff.y()) + diff_norm.x() = (diff_norm.x() < 0.) ? (-1.) : 1.; + else + diff_norm.y() = (diff_norm.y() < 0.) ? (-1.) : 1.; + } + + Point half_dialog_size(dialog_size.x / 2., dialog_size.y / 2.); + Point move_size = bb_half_size + half_dialog_size; + Point offseted_center = center - half_dialog_size; + Vec2d offset(offseted_center.x() + diff_norm.x() * move_size.x(), + offseted_center.y() + diff_norm.y() * move_size.y()); + + // move offset close to center + Points window_polygon = {offset.cast(), + Point(offset.x(), offset.y() + dialog_size.y), + Point(offset.x() + dialog_size.x, + offset.y() + dialog_size.y), + Point(offset.x() + dialog_size.x, offset.y())}; + // check that position by Bounding box is not intersecting + assert(Slic3r::intersection(interest, Polygon(window_polygon)).empty()); + + double allowed_space = 10; // in px + double allowed_space_sq = allowed_space * allowed_space; + Vec2d move_vec = (center - (offset.cast() + half_dialog_size)) + .cast(); + Vec2d result_move(0, 0); + do { + move_vec = move_vec / 2.; + Point move_point = (move_vec + result_move).cast(); + Points moved_polygon = window_polygon; // copy + for (Point &p : moved_polygon) p += move_point; + if (Slic3r::intersection(interest, Polygon(moved_polygon)).empty()) + result_move += move_vec; + + } while (move_vec.squaredNorm() >= allowed_space_sq); + offset += result_move; + + return ImVec2(offset.x(), offset.y()); +} + +void ImGuiWrapper::draw( + const Polygon &polygon, + ImDrawList * draw_list /* = ImGui::GetOverlayDrawList()*/, + ImU32 color /* = ImGui::GetColorU32(COL_ORANGE_LIGHT)*/, + float thickness /* = 3.f*/) +{ + // minimal one line consist of 2 points + if (polygon.size() < 2) return; + // need a place to draw + if (draw_list == nullptr) return; + + const Point *prev_point = &polygon.points.back(); + for (const Point &point : polygon.points) { + ImVec2 p1(prev_point->x(), prev_point->y()); + ImVec2 p2(point.x(), point.y()); + draw_list->AddLine(p1, p2, color, thickness); + prev_point = &point; + } +} + +void ImGuiWrapper::draw_cross_hair(const ImVec2 &position, float radius, ImU32 color, int num_segments, float thickness) { + auto draw_list = ImGui::GetOverlayDrawList(); + draw_list->AddCircle(position, radius, color, num_segments, thickness); + auto dirs = {ImVec2{0, 1}, ImVec2{1, 0}, ImVec2{0, -1}, ImVec2{-1, 0}}; + for (const ImVec2 &dir : dirs) { + ImVec2 start(position.x + dir.x * 0.5 * radius, position.y + dir.y * 0.5 * radius); + ImVec2 end(position.x + dir.x * 1.5 * radius, position.y + dir.y * 1.5 * radius); + draw_list->AddLine(start, end, color, thickness); + } +} + +bool ImGuiWrapper::contain_all_glyphs(const ImFont *font, + const std::string &text) +{ + if (font == nullptr) return false; + if (!font->IsLoaded()) return false; + const ImFontConfig *fc = font->ConfigData; + if (fc == nullptr) return false; + if (text.empty()) return true; + return is_chars_in_ranges(fc->GlyphRanges, text.c_str()); +} + +bool ImGuiWrapper::is_char_in_ranges(const ImWchar *ranges, + unsigned int letter) +{ + for (const ImWchar *range = ranges; range[0] && range[1]; range += 2) { + ImWchar from = range[0]; + ImWchar to = range[1]; + if (from <= letter && letter <= to) return true; + if (letter < to) return false; // ranges should be sorted + } + return false; +}; + +bool ImGuiWrapper::is_chars_in_ranges(const ImWchar *ranges, + const char *chars_ptr) +{ + while (*chars_ptr) { + unsigned int c = 0; + // UTF-8 to 32-bit character need imgui_internal + int c_len = ImTextCharFromUtf8(&c, chars_ptr, NULL); + chars_ptr += c_len; + if (c_len == 0) break; + if (!is_char_in_ranges(ranges, c)) return false; + } + return true; +} + + #ifdef __APPLE__ static const ImWchar ranges_keyboard_shortcuts[] = { @@ -1064,7 +1617,7 @@ void ImGuiWrapper::init_font(bool compress) // Create ranges of characters from m_glyph_ranges, possibly adding some OS specific special characters. ImVector ranges; - ImFontAtlas::GlyphRangesBuilder builder; + ImFontGlyphRangesBuilder builder; builder.AddRanges(m_glyph_ranges); if (m_font_cjk) { @@ -1107,12 +1660,18 @@ void ImGuiWrapper::init_font(bool compress) int rect_id = io.Fonts->CustomRects.Size; // id of the rectangle added next // add rectangles for the icons to the font atlas - for (auto& icon : font_icons) - io.Fonts->AddCustomRectFontGlyph(font, icon.first, icon_sz, icon_sz, 3.0 * font_scale + icon_sz); - for (auto& icon : font_icons_large) - io.Fonts->AddCustomRectFontGlyph(font, icon.first, icon_sz * 2, icon_sz * 2, 3.0 * font_scale + icon_sz * 2); - for (auto& icon : font_icons_extra_large) - io.Fonts->AddCustomRectFontGlyph(font, icon.first, icon_sz * 4, icon_sz * 4, 3.0 * font_scale + icon_sz * 4); + for (auto& icon : font_icons) { + m_custom_glyph_rects_ids[icon.first] = + io.Fonts->AddCustomRectFontGlyph(font, icon.first, icon_sz, icon_sz, 3.0 * font_scale + icon_sz); + } + for (auto& icon : font_icons_large) { + m_custom_glyph_rects_ids[icon.first] = + io.Fonts->AddCustomRectFontGlyph(font, icon.first, icon_sz * 2, icon_sz * 2, 3.0 * font_scale + icon_sz * 2); + } + for (auto& icon : font_icons_extra_large) { + m_custom_glyph_rects_ids[icon.first] = + io.Fonts->AddCustomRectFontGlyph(font, icon.first, icon_sz * 4, icon_sz * 4, 3.0 * font_scale + icon_sz * 4); + } // Build texture atlas unsigned char* pixels; @@ -1175,7 +1734,7 @@ void ImGuiWrapper::init_font(bool compress) glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); glsafe(::glPixelStorei(GL_UNPACK_ROW_LENGTH, 0)); - if (compress && GLEW_EXT_texture_compression_s3tc) + if (compress && OpenGLManager::are_compressed_textures_supported()) glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels)); else glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels)); @@ -1280,100 +1839,213 @@ void ImGuiWrapper::init_style() void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) { + if (draw_data == nullptr || draw_data->CmdListsCount == 0) + return; + + GLShaderProgram* shader = wxGetApp().get_shader("imgui"); + if (shader == nullptr) + return; + // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates) ImGuiIO& io = ImGui::GetIO(); - int fb_width = (int)(draw_data->DisplaySize.x * io.DisplayFramebufferScale.x); - int fb_height = (int)(draw_data->DisplaySize.y * io.DisplayFramebufferScale.y); + const int fb_width = (int)(draw_data->DisplaySize.x * io.DisplayFramebufferScale.x); + const int fb_height = (int)(draw_data->DisplaySize.y * io.DisplayFramebufferScale.y); if (fb_width == 0 || fb_height == 0) return; - draw_data->ScaleClipRects(io.DisplayFramebufferScale); + GLShaderProgram* curr_shader = wxGetApp().get_current_shader(); + if (curr_shader != nullptr) + curr_shader->stop_using(); + + shader->start_using(); + +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + // Backup GL state + GLenum last_active_texture; glsafe(::glGetIntegerv(GL_ACTIVE_TEXTURE, (GLint*)&last_active_texture)); + GLuint last_program; glsafe(::glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&last_program)); + GLuint last_texture; glsafe(::glGetIntegerv(GL_TEXTURE_BINDING_2D, (GLint*)&last_texture)); + GLuint last_array_buffer; glsafe(::glGetIntegerv(GL_ARRAY_BUFFER_BINDING, (GLint*)&last_array_buffer)); + GLuint last_vertex_array_object = 0; + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glGetIntegerv(GL_VERTEX_ARRAY_BINDING, (GLint*)&last_vertex_array_object)); + GLint last_viewport[4]; glsafe(::glGetIntegerv(GL_VIEWPORT, last_viewport)); + GLint last_scissor_box[4]; glsafe(::glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box)); + GLenum last_blend_src_rgb; glsafe(::glGetIntegerv(GL_BLEND_SRC_RGB, (GLint*)&last_blend_src_rgb)); + GLenum last_blend_dst_rgb; glsafe(::glGetIntegerv(GL_BLEND_DST_RGB, (GLint*)&last_blend_dst_rgb)); + GLenum last_blend_src_alpha; glsafe(::glGetIntegerv(GL_BLEND_SRC_ALPHA, (GLint*)&last_blend_src_alpha)); + GLenum last_blend_dst_alpha; glsafe(::glGetIntegerv(GL_BLEND_DST_ALPHA, (GLint*)&last_blend_dst_alpha)); + GLenum last_blend_equation_rgb; glsafe(::glGetIntegerv(GL_BLEND_EQUATION_RGB, (GLint*)&last_blend_equation_rgb)); + GLenum last_blend_equation_alpha; glsafe(::glGetIntegerv(GL_BLEND_EQUATION_ALPHA, (GLint*)&last_blend_equation_alpha)); + GLboolean last_enable_blend = ::glIsEnabled(GL_BLEND); + GLboolean last_enable_cull_face = ::glIsEnabled(GL_CULL_FACE); + GLboolean last_enable_depth_test = ::glIsEnabled(GL_DEPTH_TEST); + GLboolean last_enable_stencil_test = ::glIsEnabled(GL_STENCIL_TEST); + GLboolean last_enable_scissor_test = ::glIsEnabled(GL_SCISSOR_TEST); + + // set new GL state + glsafe(::glActiveTexture(GL_TEXTURE0)); + glsafe(::glEnable(GL_BLEND)); + glsafe(::glBlendEquation(GL_FUNC_ADD)); + glsafe(::glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); + glsafe(::glDisable(GL_CULL_FACE)); + glsafe(::glDisable(GL_DEPTH_TEST)); + glsafe(::glDisable(GL_STENCIL_TEST)); + glsafe(::glEnable(GL_SCISSOR_TEST)); +#else // We are using the OpenGL fixed pipeline to make the example code simpler to read! // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers, polygon fill. - GLint last_texture; glsafe(::glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture)); - GLint last_polygon_mode[2]; glsafe(::glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode)); - GLint last_viewport[4]; glsafe(::glGetIntegerv(GL_VIEWPORT, last_viewport)); - GLint last_scissor_box[4]; glsafe(::glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box)); + GLint last_texture; glsafe(::glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture)); + GLint last_polygon_mode[2]; glsafe(::glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode)); + GLint last_viewport[4]; glsafe(::glGetIntegerv(GL_VIEWPORT, last_viewport)); + GLint last_scissor_box[4]; glsafe(::glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box)); + GLint last_texture_env_mode; glsafe(::glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &last_texture_env_mode)); glsafe(::glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_TRANSFORM_BIT)); glsafe(::glEnable(GL_BLEND)); glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); glsafe(::glDisable(GL_CULL_FACE)); glsafe(::glDisable(GL_DEPTH_TEST)); - glsafe(::glDisable(GL_LIGHTING)); - glsafe(::glDisable(GL_COLOR_MATERIAL)); + glsafe(::glDisable(GL_STENCIL_TEST)); glsafe(::glEnable(GL_SCISSOR_TEST)); - glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); - glsafe(::glEnableClientState(GL_TEXTURE_COORD_ARRAY)); - glsafe(::glEnableClientState(GL_COLOR_ARRAY)); glsafe(::glEnable(GL_TEXTURE_2D)); glsafe(::glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)); glsafe(::glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)); - GLint texture_env_mode = GL_MODULATE; - glsafe(::glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &texture_env_mode)); - glsafe(::glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)); - //glUseProgram(0); // You may want this if using this code in an OpenGL 3+ context where shaders may be bound +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES // Setup viewport, orthographic projection matrix - // Our visible imgui space lies from draw_data->DisplayPps (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayMin is typically (0,0) for single viewport apps. + // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps. glsafe(::glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height)); - glsafe(::glMatrixMode(GL_PROJECTION)); - glsafe(::glPushMatrix()); - glsafe(::glLoadIdentity()); - glsafe(::glOrtho(draw_data->DisplayPos.x, draw_data->DisplayPos.x + draw_data->DisplaySize.x, draw_data->DisplayPos.y + draw_data->DisplaySize.y, draw_data->DisplayPos.y, -1.0f, +1.0f)); - glsafe(::glMatrixMode(GL_MODELVIEW)); - glsafe(::glPushMatrix()); - glsafe(::glLoadIdentity()); + const float L = draw_data->DisplayPos.x; + const float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x; + const float T = draw_data->DisplayPos.y; + const float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y; + + Matrix4f ortho_projection; + ortho_projection << + 2.0f / (R - L), 0.0f, 0.0f, (R + L) / (L - R), + 0.0f, 2.0f / (T - B), 0.0f, (T + B) / (B - T), + 0.0f, 0.0f, -1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f; + + shader->set_uniform("Texture", 0); + shader->set_uniform("ProjMtx", ortho_projection); + + // Will project scissor/clipping rectangles into framebuffer space + const ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports + const ImVec2 clip_scale = draw_data->FramebufferScale; // (1,1) unless using retina display which are often (2,2) // Render command lists - ImVec2 pos = draw_data->DisplayPos; - for (int n = 0; n < draw_data->CmdListsCount; n++) - { + for (int n = 0; n < draw_data->CmdListsCount; ++n) { const ImDrawList* cmd_list = draw_data->CmdLists[n]; const ImDrawVert* vtx_buffer = cmd_list->VtxBuffer.Data; - const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data; - glsafe(::glVertexPointer(2, GL_FLOAT, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, pos)))); - glsafe(::glTexCoordPointer(2, GL_FLOAT, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, uv)))); - glsafe(::glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, col)))); + const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data; + const GLsizeiptr vtx_buffer_size = (GLsizeiptr)cmd_list->VtxBuffer.Size * (int)sizeof(ImDrawVert); + const GLsizeiptr idx_buffer_size = (GLsizeiptr)cmd_list->IdxBuffer.Size * (int)sizeof(ImDrawIdx); + +#if ENABLE_GL_CORE_PROFILE + GLuint vao_id = 0; + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) { + glsafe(::glGenVertexArrays(1, &vao_id)); + glsafe(::glBindVertexArray(vao_id)); + } +#endif // ENABLE_GL_CORE_PROFILE - for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) - { + GLuint vbo_id; + glsafe(::glGenBuffers(1, &vbo_id)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, vbo_id)); + glsafe(::glBufferData(GL_ARRAY_BUFFER, vtx_buffer_size, vtx_buffer, GL_STATIC_DRAW)); + + const int position_id = shader->get_attrib_location("Position"); + if (position_id != -1) { + glsafe(::glVertexAttribPointer(position_id, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (const void*)IM_OFFSETOF(ImDrawVert, pos))); + glsafe(::glEnableVertexAttribArray(position_id)); + } + const int uv_id = shader->get_attrib_location("UV"); + if (uv_id != -1) { + glsafe(::glVertexAttribPointer(uv_id, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (const void*)IM_OFFSETOF(ImDrawVert, uv))); + glsafe(::glEnableVertexAttribArray(uv_id)); + } + const int color_id = shader->get_attrib_location("Color"); + if (color_id != -1) { + glsafe(::glVertexAttribPointer(color_id, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (const void*)IM_OFFSETOF(ImDrawVert, col))); + glsafe(::glEnableVertexAttribArray(color_id)); + } + + GLuint ibo_id; + glsafe(::glGenBuffers(1, &ibo_id)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_id)); + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, idx_buffer_size, idx_buffer, GL_STATIC_DRAW)); + + for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; ++cmd_i) { const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; if (pcmd->UserCallback) - { // User callback (registered via ImDrawList::AddCallback) pcmd->UserCallback(cmd_list, pcmd); + else { + // Project scissor/clipping rectangles into framebuffer space + const ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y); + const ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y); + if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y) + continue; + + // Apply scissor/clipping rectangle (Y is inverted in OpenGL) + glsafe(::glScissor((int)clip_min.x, (int)(fb_height - clip_max.y), (int)(clip_max.x - clip_min.x), (int)(clip_max.y - clip_min.y))); + + // Bind texture, Draw + glsafe(::glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->GetTexID())); + glsafe(::glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(intptr_t)(pcmd->IdxOffset * sizeof(ImDrawIdx)))); } - else - { - ImVec4 clip_rect = ImVec4(pcmd->ClipRect.x - pos.x, pcmd->ClipRect.y - pos.y, pcmd->ClipRect.z - pos.x, pcmd->ClipRect.w - pos.y); - if (clip_rect.x < fb_width && clip_rect.y < fb_height && clip_rect.z >= 0.0f && clip_rect.w >= 0.0f) - { - // Apply scissor/clipping rectangle - glsafe(::glScissor((int)clip_rect.x, (int)(fb_height - clip_rect.w), (int)(clip_rect.z - clip_rect.x), (int)(clip_rect.w - clip_rect.y))); - - // Bind texture, Draw - glsafe(::glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->TextureId)); - glsafe(::glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer)); - } - } - idx_buffer += pcmd->ElemCount; } + + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + + if (color_id != -1) + glsafe(::glDisableVertexAttribArray(color_id)); + if (uv_id != -1) + glsafe(::glDisableVertexAttribArray(uv_id)); + if (position_id != -1) + glsafe(::glDisableVertexAttribArray(position_id)); + + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + + glsafe(::glDeleteBuffers(1, &ibo_id)); + glsafe(::glDeleteBuffers(1, &vbo_id)); +#if ENABLE_GL_CORE_PROFILE + if (vao_id > 0) + glsafe(::glDeleteVertexArrays(1, &vao_id)); +#endif // ENABLE_GL_CORE_PROFILE } +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + // Restore modified GL state + glsafe(::glBindTexture(GL_TEXTURE_2D, last_texture)); + glsafe(::glActiveTexture(last_active_texture)); + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(last_vertex_array_object)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer)); + glsafe(::glBlendEquationSeparate(last_blend_equation_rgb, last_blend_equation_alpha)); + glsafe(::glBlendFuncSeparate(last_blend_src_rgb, last_blend_dst_rgb, last_blend_src_alpha, last_blend_dst_alpha)); + if (last_enable_blend) glsafe(::glEnable(GL_BLEND)); else glsafe(::glDisable(GL_BLEND)); + if (last_enable_cull_face) glsafe(::glEnable(GL_CULL_FACE)); else glsafe(::glDisable(GL_CULL_FACE)); + if (last_enable_depth_test) glsafe(::glEnable(GL_DEPTH_TEST)); else glsafe(::glDisable(GL_DEPTH_TEST)); + if (last_enable_stencil_test) glsafe(::glEnable(GL_STENCIL_TEST)); else glsafe(::glDisable(GL_STENCIL_TEST)); + if (last_enable_scissor_test) glsafe(::glEnable(GL_SCISSOR_TEST)); else glsafe(::glDisable(GL_SCISSOR_TEST)); + glsafe(::glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3])); + glsafe(::glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3])); +#else // Restore modified state - glsafe(::glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, texture_env_mode)); - glsafe(::glDisableClientState(GL_COLOR_ARRAY)); - glsafe(::glDisableClientState(GL_TEXTURE_COORD_ARRAY)); - glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); + glsafe(::glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, last_texture_env_mode)); glsafe(::glBindTexture(GL_TEXTURE_2D, (GLuint)last_texture)); - glsafe(::glMatrixMode(GL_MODELVIEW)); - glsafe(::glPopMatrix()); - glsafe(::glMatrixMode(GL_PROJECTION)); - glsafe(::glPopMatrix()); glsafe(::glPopAttrib()); - glsafe(::glPolygonMode(GL_FRONT, (GLenum)last_polygon_mode[0]); glPolygonMode(GL_BACK, (GLenum)last_polygon_mode[1])); + glsafe(::glPolygonMode(GL_FRONT, (GLenum)last_polygon_mode[0]); + glsafe(::glPolygonMode(GL_BACK, (GLenum)last_polygon_mode[1]))); glsafe(::glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3])); glsafe(::glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3])); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + + shader->stop_using(); + + if (curr_shader != nullptr) + curr_shader->start_using(); } bool ImGuiWrapper::display_initialized() const @@ -1399,7 +2071,11 @@ const char* ImGuiWrapper::clipboard_get(void* user_data) const char* res = ""; if (wxTheClipboard->Open()) { - if (wxTheClipboard->IsSupported(wxDF_TEXT)) { + if (wxTheClipboard->IsSupported(wxDF_TEXT) +#if wxUSE_UNICODE + || wxTheClipboard->IsSupported(wxDF_UNICODETEXT) +#endif // wxUSE_UNICODE + ) { wxTextDataObject data; wxTheClipboard->GetData(data); diff --git a/src/slic3r/GUI/ImGuiWrapper.hpp b/src/slic3r/GUI/ImGuiWrapper.hpp index d75d6529ab2..077bf568de7 100644 --- a/src/slic3r/GUI/ImGuiWrapper.hpp +++ b/src/slic3r/GUI/ImGuiWrapper.hpp @@ -2,6 +2,7 @@ #define slic3r_ImGuiWrapper_hpp_ #include +#include #include #include @@ -9,15 +10,20 @@ #include #include "libslic3r/Point.hpp" +#include "libslic3r/Color.hpp" +#include "libslic3r/Polygon.hpp" -namespace Slic3r {namespace Search { +namespace Slic3r { +namespace Search { struct OptionViewParameters; -}} +} // namespace Search +} // namespace Slic3r class wxString; class wxMouseEvent; class wxKeyEvent; +struct IMGUI_API ImGuiWindow; namespace Slic3r { namespace GUI { @@ -34,6 +40,7 @@ class ImGuiWrapper bool m_disabled{ false }; bool m_new_frame_open{ false }; bool m_requires_extra_frame{ false }; + std::map m_custom_glyph_rects_ids; std::string m_clipboard_text; public: @@ -47,8 +54,6 @@ class ImGuiWrapper ImGuiWrapper(); ~ImGuiWrapper(); - void read_glsl_version(); - void set_language(const std::string &language); void set_display_size(float w, float h); void set_scaling(float font_size, float scale_style, float scale_both); @@ -57,13 +62,19 @@ class ImGuiWrapper float get_font_size() const { return m_font_size; } float get_style_scaling() const { return m_style_scaling; } + const ImWchar *get_glyph_ranges() const { return m_glyph_ranges; } // language specific void new_frame(); void render(); float scaled(float x) const { return x * m_font_size; } ImVec2 scaled(float x, float y) const { return ImVec2(x * m_font_size, y * m_font_size); } - ImVec2 calc_text_size(const wxString &text, float wrap_width = -1.0f) const; + /// + /// Extend ImGui::CalcTextSize to use string_view + /// + static ImVec2 calc_text_size(std::string_view text, bool hide_text_after_double_hash = false, float wrap_width = -1.0f); + static ImVec2 calc_text_size(const std::string& text, bool hide_text_after_double_hash = false, float wrap_width = -1.0f); + static ImVec2 calc_text_size(const wxString &text, bool hide_text_after_double_hash = false, float wrap_width = -1.0f); ImVec2 calc_button_size(const wxString &text, const ImVec2 &button_size = ImVec2(0, 0)) const; ImVec2 get_item_spacing() const; @@ -80,20 +91,18 @@ class ImGuiWrapper bool begin(const wxString& name, bool* close, int flags = 0); void end(); - bool button(const wxString &label); + bool button(const wxString &label, const wxString& tooltip = {}); bool button(const wxString& label, float width, float height); + bool button(const wxString& label, const ImVec2 &size, bool enable); // default size = ImVec2(0.f, 0.f) bool radio_button(const wxString &label, bool active); - bool image_button(); - bool input_double(const std::string &label, const double &value, const std::string &format = "%.3f"); - bool input_double(const wxString &label, const double &value, const std::string &format = "%.3f"); - bool input_vec3(const std::string &label, const Vec3d &value, float width, const std::string &format = "%.3f"); + bool draw_radio_button(const std::string& name, float size, bool active, std::function draw_callback); bool checkbox(const wxString &label, bool &value); - void text(const char *label); - void text(const std::string &label); - void text(const wxString &label); - void text_colored(const ImVec4& color, const char* label); - void text_colored(const ImVec4& color, const std::string& label); - void text_colored(const ImVec4& color, const wxString& label); + static void text(const char *label); + static void text(const std::string &label); + static void text(const wxString &label); + static void text_colored(const ImVec4& color, const char* label); + static void text_colored(const ImVec4& color, const std::string& label); + static void text_colored(const ImVec4& color, const wxString& label); void text_wrapped(const char *label, float wrap_width); void text_wrapped(const std::string &label, float wrap_width); void text_wrapped(const wxString &label, float wrap_width); @@ -106,7 +115,11 @@ class ImGuiWrapper bool slider_float(const std::string& label, float* v, float v_min, float v_max, const char* format = "%.3f", float power = 1.0f, bool clamp = true, const wxString& tooltip = {}, bool show_edit_btn = true); bool slider_float(const wxString& label, float* v, float v_min, float v_max, const char* format = "%.3f", float power = 1.0f, bool clamp = true, const wxString& tooltip = {}, bool show_edit_btn = true); - bool combo(const wxString& label, const std::vector& options, int& selection); // Use -1 to not mark any option as selected + bool image_button(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0.0, 0.0), const ImVec2& uv1 = ImVec2(1.0, 1.0), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0.0, 0.0, 0.0, 0.0), const ImVec4& tint_col = ImVec4(1.0, 1.0, 1.0, 1.0), ImGuiButtonFlags flags = 0); + bool image_button(const wchar_t icon, const wxString& tooltip = L""); + + // Use selection = -1 to not mark any option as selected + bool combo(const wxString& label, const std::vector& options, int& selection, ImGuiComboFlags flags = 0); bool undo_redo_list(const ImVec2& size, const bool is_undo, bool (*items_getter)(const bool, int, const char**), int& hovered, int& selected, int& mouse_wheel); void search_list(const ImVec2& size, bool (*items_getter)(int, const char** label, const char** tooltip), char* search_str, Search::OptionViewParameters& view_params, int& selected, bool& edited, int& mouse_wheel, bool is_localized); @@ -120,10 +133,110 @@ class ImGuiWrapper bool want_text_input() const; bool want_any_input() const; + // Optional inputs are used for set up value inside of an optional, with default value + // + // Extended function ImGui::InputInt to work with std::optional, when value == def_val optional is released. + static bool input_optional_int(const char *label, std::optional& v, int step=1, int step_fast=100, ImGuiInputTextFlags flags=0, int def_val = 0); + // Extended function ImGui::InputFloat to work with std::optional value near def_val cause release of optional + static bool input_optional_float(const char* label, std::optional &v, float step = 0.0f, float step_fast = 0.0f, const char* format = "%.3f", ImGuiInputTextFlags flags = 0, float def_val = .0f); + // Extended function ImGui::DragFloat to work with std::optional value near def_val cause release of optional + static bool drag_optional_float(const char* label, std::optional &v, float v_speed, float v_min, float v_max, const char* format, float power, float def_val = .0f); + // Extended function ImGuiWrapper::slider_float to work with std::optional value near def_val cause release of optional + bool slider_optional_float(const char* label, std::optional &v, float v_min, float v_max, const char* format = "%.3f", float power = 1.0f, bool clamp = true, const wxString& tooltip = {}, bool show_edit_btn = true, float def_val = .0f); + // Extended function ImGuiWrapper::slider_float to work with std::optional, when value == def_val than optional release its value + bool slider_optional_int(const char* label, std::optional &v, int v_min, int v_max, const char* format = "%.3f", float power = 1.0f, bool clamp = true, const wxString& tooltip = {}, bool show_edit_btn = true, int def_val = 0); + + /// + /// Use ImGui internals to unactivate (lose focus) in input. + /// When input is activ it can't change value by application. + /// + static void left_inputs(); + + /// + /// Truncate text by ImGui draw function to specific width + /// NOTE 1: ImGui must be initialized + /// NOTE 2: Calculation for actual acive imgui font + /// + /// Text to be truncated + /// Maximal width before truncate + /// String puted on end of text to be visible truncation + /// Truncated text + static std::string trunc(const std::string &text, + float width, + const char *tail = " .."); + + /// + /// Escape ## in data by add space between hashes + /// Needed when user written text is visualized by ImGui. + /// + /// In/Out text to be escaped + static void escape_double_hash(std::string &text); + + /// + /// Suggest loacation of dialog window, + /// dependent on actual visible thing on platter + /// like Gizmo menu size, notifications, ... + /// To be near of polygon interest and not over it. + /// And also not out of visible area. + /// + /// Define width and height of diaog window + /// Area of interest. Result should be close to it + /// Available space a.k.a GLCanvas3D::get_current_canvas3D() + /// Suggestion for dialog offest + static ImVec2 suggest_location(const ImVec2 &dialog_size, + const Slic3r::Polygon &interest, + const ImVec2 &canvas_size); + + /// + /// Visualization of polygon + /// + /// Define what to draw + /// Define where to draw it + /// Color of polygon + /// Width of polygon line + static void draw(const Polygon &polygon, + ImDrawList * draw_list = ImGui::GetOverlayDrawList(), + ImU32 color = ImGui::GetColorU32(COL_ORANGE_LIGHT), + float thickness = 3.f); + + /// + /// Draw symbol of cross hair + /// + /// Center of cross hair + /// Circle radius + /// Color of symbol + /// Precission of circle + /// Thickness of Line in symbol + static void draw_cross_hair(const ImVec2 &position, + float radius = 16.f, + ImU32 color = ImGui::GetColorU32(ImVec4(1.f, 1.f, 1.f, .75f)), + int num_segments = 0, + float thickness = 4.f); + + /// + /// Check that font ranges contain all chars in string + /// (rendered Unicodes are stored in GlyphRanges) + /// + /// Contain glyph ranges + /// Vector of character to check + /// True when all glyphs from text are in font ranges + static bool contain_all_glyphs(const ImFont *font, const std::string &text); + static bool is_chars_in_ranges(const ImWchar *ranges, const char *chars_ptr); + static bool is_char_in_ranges(const ImWchar *ranges, unsigned int letter); + bool requires_extra_frame() const { return m_requires_extra_frame; } void set_requires_extra_frame() { m_requires_extra_frame = true; } void reset_requires_extra_frame() { m_requires_extra_frame = false; } + void disable_background_fadeout_animation(); + + static ImU32 to_ImU32(const ColorRGBA& color); + static ImVec4 to_ImVec4(const ColorRGBA& color); + static ColorRGBA from_ImU32(const ImU32& color); + static ColorRGBA from_ImVec4(const ImVec4& color); + + ImFontAtlasCustomRect* GetTextureCustomRect(const wchar_t& tex_id); + static const ImVec4 COL_GREY_DARK; static const ImVec4 COL_GREY_LIGHT; static const ImVec4 COL_ORANGE_DARK; diff --git a/src/slic3r/GUI/InstanceCheck.cpp b/src/slic3r/GUI/InstanceCheck.cpp index 81d5e01febf..4831b908450 100644 --- a/src/slic3r/GUI/InstanceCheck.cpp +++ b/src/slic3r/GUI/InstanceCheck.cpp @@ -373,6 +373,7 @@ bool instance_check(int argc, char** argv, bool app_config_single_instance) namespace GUI { wxDEFINE_EVENT(EVT_LOAD_MODEL_OTHER_INSTANCE, LoadFromOtherInstanceEvent); +wxDEFINE_EVENT(EVT_START_DOWNLOAD_OTHER_INSTANCE, StartDownloadOtherInstanceEvent); wxDEFINE_EVENT(EVT_INSTANCE_GO_TO_FRONT, InstanceGoToFrontEvent); void OtherInstanceMessageHandler::init(wxEvtHandler* callback_evt_handler) @@ -501,12 +502,20 @@ void OtherInstanceMessageHandler::handle_message(const std::string& message) } std::vector paths; + std::vector downloads; // Skip the first argument, it is the path to the slicer executable. auto it = args.begin(); for (++ it; it != args.end(); ++ it) { boost::filesystem::path p = MessageHandlerInternal::get_path(*it); if (! p.string().empty()) paths.emplace_back(p); +// TODO: There is a misterious slash appearing in recieved msg on windows +#ifdef _WIN32 + else if (it->rfind("prusaslicer://open/?file=", 0) == 0) +#else + else if (it->rfind("prusaslicer://open?file=", 0) == 0) +#endif + downloads.emplace_back(*it); } if (! paths.empty()) { //wxEvtHandler* evt_handler = wxGetApp().plater(); //assert here? @@ -514,6 +523,10 @@ void OtherInstanceMessageHandler::handle_message(const std::string& message) wxPostEvent(m_callback_evt_handler, LoadFromOtherInstanceEvent(GUI::EVT_LOAD_MODEL_OTHER_INSTANCE, std::vector(std::move(paths)))); //} } + if (!downloads.empty()) + { + wxPostEvent(m_callback_evt_handler, StartDownloadOtherInstanceEvent(GUI::EVT_START_DOWNLOAD_OTHER_INSTANCE, std::vector(std::move(downloads)))); + } } #ifdef __APPLE__ @@ -545,6 +558,9 @@ namespace MessageHandlerDBusInternal " " " " " " + " " + " " + " " " " " "; @@ -553,6 +569,7 @@ namespace MessageHandlerDBusInternal dbus_connection_send(connection, reply, NULL); dbus_message_unref(reply); } + //method AnotherInstance receives message from another PrusaSlicer instance static void handle_method_another_instance(DBusConnection *connection, DBusMessage *request) { @@ -587,6 +604,9 @@ namespace MessageHandlerDBusInternal } else if (0 == strcmp(our_interface.c_str(), interface_name) && 0 == strcmp("AnotherInstance", member_name)) { handle_method_another_instance(connection, message); return DBUS_HANDLER_RESULT_HANDLED; + } else if (0 == strcmp(our_interface.c_str(), interface_name) && 0 == strcmp("Introspect", member_name)) { + respond_to_introspect(connection, message); + return DBUS_HANDLER_RESULT_HANDLED; } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } diff --git a/src/slic3r/GUI/InstanceCheck.hpp b/src/slic3r/GUI/InstanceCheck.hpp index 10ccf7b9250..54ec12c31fa 100644 --- a/src/slic3r/GUI/InstanceCheck.hpp +++ b/src/slic3r/GUI/InstanceCheck.hpp @@ -43,8 +43,9 @@ class MainFrame; #endif // __linux__ using LoadFromOtherInstanceEvent = Event>; +using StartDownloadOtherInstanceEvent = Event>; wxDECLARE_EVENT(EVT_LOAD_MODEL_OTHER_INSTANCE, LoadFromOtherInstanceEvent); - +wxDECLARE_EVENT(EVT_START_DOWNLOAD_OTHER_INSTANCE, StartDownloadOtherInstanceEvent); using InstanceGoToFrontEvent = SimpleEvent; wxDECLARE_EVENT(EVT_INSTANCE_GO_TO_FRONT, InstanceGoToFrontEvent); diff --git a/src/slic3r/GUI/Jobs/ArrangeJob.cpp b/src/slic3r/GUI/Jobs/ArrangeJob.cpp index db32fe601cc..8115136a57c 100644 --- a/src/slic3r/GUI/Jobs/ArrangeJob.cpp +++ b/src/slic3r/GUI/Jobs/ArrangeJob.cpp @@ -1,8 +1,10 @@ #include "ArrangeJob.hpp" #include "libslic3r/BuildVolume.hpp" -#include "libslic3r/MTUtils.hpp" #include "libslic3r/Model.hpp" +#include "libslic3r/Print.hpp" +#include "libslic3r/SLAPrint.hpp" +#include "libslic3r/Geometry/ConvexHull.hpp" #include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" @@ -12,6 +14,7 @@ #include "slic3r/GUI/NotificationManager.hpp" #include "slic3r/GUI/format.hpp" + #include "libnest2d/common.hpp" #include @@ -94,28 +97,28 @@ void ArrangeJob::prepare_all() { void ArrangeJob::prepare_selected() { clear_input(); - + Model &model = m_plater->model(); double stride = bed_stride(m_plater); - + std::vector obj_sel(model.objects.size(), nullptr); for (auto &s : m_plater->get_selection().get_content()) if (s.first < int(obj_sel.size())) obj_sel[size_t(s.first)] = &s.second; - + // Go through the objects and check if inside the selection for (size_t oidx = 0; oidx < model.objects.size(); ++oidx) { const Selection::InstanceIdxsList * instlist = obj_sel[oidx]; ModelObject *mo = model.objects[oidx]; - + std::vector inst_sel(mo->instances.size(), false); - + if (instlist) for (auto inst_id : *instlist) inst_sel[size_t(inst_id)] = true; - + for (size_t i = 0; i < inst_sel.size(); ++i) { ModelInstance * mi = mo->instances[i]; ArrangePolygon &&ap = get_arrange_poly_(mi); @@ -124,11 +127,11 @@ void ArrangeJob::prepare_selected() { (inst_sel[i] ? m_selected : m_unselected) : m_unprintable; - + cont.emplace_back(std::move(ap)); } } - + if (auto wti = get_wipe_tower(*m_plater)) { ArrangePolygon &&ap = get_arrange_poly(wti, m_plater); @@ -136,14 +139,77 @@ void ArrangeJob::prepare_selected() { m_unselected; cont.emplace_back(std::move(ap)); } - + // If the selection was empty arrange everything - if (m_selected.empty()) m_selected.swap(m_unselected); - + if (m_selected.empty()) + m_selected.swap(m_unselected); + // The strides have to be removed from the fixed items. For the // arrangeable (selected) items bed_idx is ignored and the // translation is irrelevant. - for (auto &p : m_unselected) p.translation(X) -= p.bed_idx * stride; + for (auto &p : m_unselected) + p.translation(X) -= p.bed_idx * stride; +} + +static void update_arrangepoly_slaprint(arrangement::ArrangePolygon &ret, + const SLAPrintObject &po, + const ModelInstance &inst) +{ + // The 1.1 multiplier is a safety gap, as the offset might be bigger + // in sharp edges of a polygon, depending on clipper's offset algorithm + coord_t pad_infl = 0; + { + double infl = po.config().pad_enable.getBool() * ( + po.config().pad_brim_size.getFloat() + + po.config().pad_around_object.getBool() * + po.config().pad_object_gap.getFloat() ); + + pad_infl = scaled(1.1 * infl); + } + + auto laststep = po.last_completed_step(); + + if (laststep < slaposCount && laststep > slaposSupportTree) { + auto omesh = po.get_mesh_to_print(); + auto &smesh = po.support_mesh(); + + Vec3d rotation = inst.get_rotation(); + rotation.z() = 0.; + Transform3f trafo_instance = + Geometry::assemble_transform(inst.get_offset().z() * Vec3d::UnitZ(), + rotation, + inst.get_scaling_factor(), + inst.get_mirror()).cast(); + + trafo_instance = trafo_instance * po.trafo().cast().inverse(); + + auto polys = reserve_vector(3); + auto zlvl = -po.get_elevation(); + + if (omesh) { + polys.emplace_back(its_convex_hull_2d_above(*omesh, trafo_instance, zlvl)); + ret.poly.contour = polys.back(); + ret.poly.holes = {}; + } + + polys.emplace_back(its_convex_hull_2d_above(smesh.its, trafo_instance, zlvl)); + ret.poly.contour = Geometry::convex_hull(polys); + ret.poly.holes = {}; + } + + ret.inflation = pad_infl; +} + +static coord_t brim_offset(const PrintObject &po, const ModelInstance &inst) +{ + const BrimType brim_type = po.config().brim_type.value; + const float brim_separation = po.config().brim_separation.getFloat(); + const float brim_width = po.config().brim_width.getFloat(); + const bool has_outer_brim = brim_type == BrimType::btOuterOnly || + brim_type == BrimType::btOuterAndInner; + + // How wide is the brim? (in scaled units) + return has_outer_brim ? scaled(brim_width + brim_separation) : 0; } arrangement::ArrangePolygon ArrangeJob::get_arrange_poly_(ModelInstance *mi) @@ -160,55 +226,86 @@ arrangement::ArrangePolygon ArrangeJob::get_arrange_poly_(ModelInstance *mi) return ap; } +coord_t get_skirt_offset(const Plater* plater) { + float skirt_inset = 0.f; + // Try to subtract the skirt from the bed shape so we don't arrange outside of it. + if (plater->printer_technology() == ptFFF && plater->fff_print().has_skirt()) { + const auto& print = plater->fff_print(); + skirt_inset = print.config().skirts.value * print.skirt_flow().width() + + print.config().skirt_distance.value; + } + + return scaled(skirt_inset); +} + void ArrangeJob::prepare() { wxGetKeyState(WXK_SHIFT) ? prepare_selected() : prepare_all(); -} -void ArrangeJob::on_exception(const std::exception_ptr &eptr) -{ - try { - if (eptr) - std::rethrow_exception(eptr); - } catch (libnest2d::GeometryException &) { - show_error(m_plater, _(L("Could not arrange model objects! " - "Some geometries may be invalid."))); - } catch (std::exception &) { - PlaterJob::on_exception(eptr); + coord_t min_offset = 0; + for (auto &ap : m_selected) { + min_offset = std::max(ap.inflation, min_offset); + } + + if (m_plater->printer_technology() == ptSLA) { + // Apply the max offset for all the objects + for (auto &ap : m_selected) { + ap.inflation = min_offset; + } + } else { // it's fff, brims only need to be minded from bed edges + for (auto &ap : m_selected) { + ap.inflation = 0; + } + m_min_bed_inset = min_offset; } } -void ArrangeJob::process() +void ArrangeJob::process(Ctl &ctl) { - static const auto arrangestr = _(L("Arranging")); + static const auto arrangestr = _u8L("Arranging"); - arrangement::ArrangeParams params = get_arrange_params(m_plater); - - auto count = unsigned(m_selected.size() + m_unprintable.size()); + arrangement::ArrangeParams params; arrangement::ArrangeBed bed; - get_bed_shape(*m_plater->config(), bed); - - params.stopcondition = [this]() { return was_canceled(); }; - - params.progressind = [this, count](unsigned st) { + ctl.call_on_main_thread([this, ¶ms, &bed]{ + prepare(); + params = get_arrange_params(m_plater); + get_bed_shape(*m_plater->config(), bed); + coord_t min_inset = get_skirt_offset(m_plater) + m_min_bed_inset; + params.min_bed_distance = std::max(params.min_bed_distance, min_inset); + }).wait(); + + auto count = unsigned(m_selected.size() + m_unprintable.size()); + + if (count == 0) // Should be taken care of by plater, but doesn't hurt + return; + + ctl.update_status(0, arrangestr); + + params.stopcondition = [&ctl]() { return ctl.was_canceled(); }; + + params.progressind = [this, count, &ctl](unsigned st) { st += m_unprintable.size(); - if (st > 0) update_status(int(count - st), arrangestr); + if (st > 0) ctl.update_status(int(count - st) * 100 / status_range(), arrangestr); }; + ctl.update_status(0, arrangestr); + arrangement::arrange(m_selected, m_unselected, bed, params); - params.progressind = [this, count](unsigned st) { - if (st > 0) update_status(int(count - st), arrangestr); + params.progressind = [this, count, &ctl](unsigned st) { + if (st > 0) ctl.update_status(int(count - st) * 100 / status_range(), arrangestr); }; arrangement::arrange(m_unprintable, {}, bed, params); // finalize just here. - update_status(int(count), - was_canceled() ? _(L("Arranging canceled.")) - : _(L("Arranging done."))); + ctl.update_status(int(count) * 100 / status_range(), ctl.was_canceled() ? + _u8L("Arranging canceled.") : + _u8L("Arranging done.")); } +ArrangeJob::ArrangeJob() : m_plater{wxGetApp().plater()} {} + static std::string concat_strings(const std::set &strings, const std::string &delim = "\n") { @@ -219,10 +316,21 @@ static std::string concat_strings(const std::set &strings, }); } -void ArrangeJob::finalize() { - // Ignore the arrange result if aborted. - if (was_canceled()) return; - +void ArrangeJob::finalize(bool canceled, std::exception_ptr &eptr) { + try { + if (eptr) + std::rethrow_exception(eptr); + } catch (libnest2d::GeometryException &) { + show_error(m_plater, _(L("Could not arrange model objects! " + "Some geometries may be invalid."))); + eptr = nullptr; + } catch(...) { + eptr = std::current_exception(); + } + + if (canceled || eptr) + return; + // Unprintable items go to the last virtual bed int beds = 0; @@ -238,7 +346,9 @@ void ArrangeJob::finalize() { // Move the unprintable items to the last virtual bed. for (ArrangePolygon &ap : m_unprintable) { - ap.bed_idx += beds + 1; + if (ap.bed_idx >= 0) + ap.bed_idx += beds + 1; + ap.apply(); } @@ -254,8 +364,6 @@ void ArrangeJob::finalize() { _L("Arrangement ignored the following objects which can't fit into a single bed:\n%s"), concat_strings(names, "\n"))); } - - Job::finalize(); } std::optional @@ -276,7 +384,26 @@ template<> arrangement::ArrangePolygon get_arrange_poly(ModelInstance *inst, const Plater * plater) { - return get_arrange_poly(PtrWrapper{inst}, plater); + auto ap = get_arrange_poly(PtrWrapper{inst}, plater); + + auto obj_id = inst->get_object()->id(); + if (plater->printer_technology() == ptSLA) { + const SLAPrintObject *po = + plater->sla_print().get_print_object_by_model_object_id(obj_id); + + if (po) { + update_arrangepoly_slaprint(ap, *po, *inst); + } + } else { + const PrintObject *po = + plater->fff_print().get_print_object_by_model_object_id(obj_id); + + if (po) { + ap.inflation = brim_offset(*po, *inst); + } + } + + return ap; } arrangement::ArrangeParams get_arrange_params(Plater *p) @@ -287,6 +414,7 @@ arrangement::ArrangeParams get_arrange_params(Plater *p) arrangement::ArrangeParams params; params.allow_rotations = settings.enable_rotation; params.min_obj_distance = scaled(settings.distance); + params.min_bed_distance = scaled(settings.distance_from_bed); arrangement::Pivots pivot = arrangement::Pivots::Center; diff --git a/src/slic3r/GUI/Jobs/ArrangeJob.hpp b/src/slic3r/GUI/Jobs/ArrangeJob.hpp index a5ecc0c8341..a422d440706 100644 --- a/src/slic3r/GUI/Jobs/ArrangeJob.hpp +++ b/src/slic3r/GUI/Jobs/ArrangeJob.hpp @@ -1,7 +1,9 @@ #ifndef ARRANGEJOB_HPP #define ARRANGEJOB_HPP -#include "PlaterJob.hpp" +#include + +#include "Job.hpp" #include "libslic3r/Arrange.hpp" namespace Slic3r { @@ -10,13 +12,18 @@ class ModelInstance; namespace GUI { -class ArrangeJob : public PlaterJob +class Plater; + +class ArrangeJob : public Job { using ArrangePolygon = arrangement::ArrangePolygon; using ArrangePolygons = arrangement::ArrangePolygons; ArrangePolygons m_selected, m_unselected, m_unprintable; std::vector m_unarranged; + coord_t m_min_bed_inset = 0.; + + Plater *m_plater; // clear m_selected and m_unselected, reserve space for next usage void clear_input(); @@ -30,25 +37,20 @@ class ArrangeJob : public PlaterJob ArrangePolygon get_arrange_poly_(ModelInstance *mi); -protected: - - void prepare() override; +public: - void on_exception(const std::exception_ptr &) override; + void prepare(); - void process() override; + void process(Ctl &ctl) override; -public: - ArrangeJob(std::shared_ptr pri, Plater *plater) - : PlaterJob{std::move(pri), plater} - {} + ArrangeJob(); - int status_range() const override + int status_range() const { return int(m_selected.size() + m_unprintable.size()); } - void finalize() override; + void finalize(bool canceled, std::exception_ptr &e) override; }; std::optional get_wipe_tower_arrangepoly(const Plater &); @@ -102,6 +104,8 @@ arrangement::ArrangePolygon get_arrange_poly(ModelInstance *inst, arrangement::ArrangeParams get_arrange_params(Plater *p); +coord_t get_skirt_offset(const Plater* plater); + }} // namespace Slic3r::GUI #endif // ARRANGEJOB_HPP diff --git a/src/slic3r/GUI/Jobs/BoostThreadWorker.cpp b/src/slic3r/GUI/Jobs/BoostThreadWorker.cpp new file mode 100644 index 00000000000..a4f22be559c --- /dev/null +++ b/src/slic3r/GUI/Jobs/BoostThreadWorker.cpp @@ -0,0 +1,181 @@ +#include + +#include "BoostThreadWorker.hpp" + +namespace Slic3r { namespace GUI { + +void BoostThreadWorker::WorkerMessage::deliver(BoostThreadWorker &runner) +{ + switch(MsgType(get_type())) { + case Empty: break; + case Status: { + auto info = boost::get(m_data); + if (runner.get_pri()) { + runner.get_pri()->set_progress(info.status); + runner.get_pri()->set_status_text(info.msg.c_str()); + } + break; + } + case Finalize: { + auto& entry = boost::get(m_data); + entry.job->finalize(entry.canceled, entry.eptr); + + // Unhandled exceptions are rethrown without mercy. + if (entry.eptr) + std::rethrow_exception(entry.eptr); + + break; + } + case MainThreadCall: { + auto &calldata = boost::get(m_data); + calldata.fn(); + calldata.promise.set_value(); + + break; + } + } +} + +void BoostThreadWorker::run() +{ + bool stop = false; + while (!stop) { + m_input_queue + .consume_one(BlockingWait{0, &m_running}, [this, &stop](JobEntry &e) { + if (!e.job) + stop = true; + else { + m_canceled.store(false); + + try { + e.job->process(*this); + } catch (...) { + e.eptr = std::current_exception(); + } + + e.canceled = m_canceled.load(); + m_output_queue.push(std::move(e)); // finalization message + } + m_running.store(false); + }); + }; +} + +void BoostThreadWorker::update_status(int st, const std::string &msg) +{ + m_output_queue.push(st, msg); +} + +std::future BoostThreadWorker::call_on_main_thread(std::function fn) +{ + MainThreadCallData cbdata{std::move(fn), {}}; + std::future future = cbdata.promise.get_future(); + + m_output_queue.push(std::move(cbdata)); + + return future; +} + +BoostThreadWorker::BoostThreadWorker(std::shared_ptr pri, + boost::thread::attributes &attribs, + const char * name) + : m_progress(std::move(pri)), m_name{name} +{ + if (m_progress) + m_progress->set_cancel_callback([this](){ cancel(); }); + + m_thread = create_thread(attribs, [this] { this->run(); }); + + std::string nm{name}; + if (!nm.empty()) set_thread_name(m_thread, name); +} + +constexpr int ABORT_WAIT_MAX_MS = 10000; + +BoostThreadWorker::~BoostThreadWorker() +{ + bool joined = false; + try { + cancel_all(); + wait_for_idle(ABORT_WAIT_MAX_MS); + m_input_queue.push(JobEntry{nullptr}); + joined = join(ABORT_WAIT_MAX_MS); + } catch(...) {} + + if (!joined) + BOOST_LOG_TRIVIAL(error) + << "Could not join worker thread '" << m_name << "'"; +} + +bool BoostThreadWorker::join(int timeout_ms) +{ + if (!m_thread.joinable()) + return true; + + if (timeout_ms <= 0) { + m_thread.join(); + } + else if (m_thread.try_join_for(boost::chrono::milliseconds(timeout_ms))) { + return true; + } + else + return false; + + return true; +} + +void BoostThreadWorker::process_events() +{ + while (m_output_queue.consume_one([this](WorkerMessage &msg) { + msg.deliver(*this); + })); +} + +bool BoostThreadWorker::wait_for_current_job(unsigned timeout_ms) +{ + bool ret = true; + + if (!is_idle()) { + bool was_finish = false; + bool timeout_reached = false; + while (!timeout_reached && !was_finish) { + timeout_reached = + !m_output_queue.consume_one(BlockingWait{timeout_ms}, + [this, &was_finish]( + WorkerMessage &msg) { + msg.deliver(*this); + if (msg.get_type() == + WorkerMessage::Finalize) + was_finish = true; + }); + } + + ret = !timeout_reached; + } + + return ret; +} + +bool BoostThreadWorker::wait_for_idle(unsigned timeout_ms) +{ + bool timeout_reached = false; + while (!timeout_reached && !is_idle()) { + timeout_reached = !m_output_queue + .consume_one(BlockingWait{timeout_ms}, + [this](WorkerMessage &msg) { + msg.deliver(*this); + }); + } + + return !timeout_reached; +} + +bool BoostThreadWorker::push(std::unique_ptr job) +{ + if (job) + m_input_queue.push(JobEntry{std::move(job)}); + + return bool{job}; +} + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Jobs/BoostThreadWorker.hpp b/src/slic3r/GUI/Jobs/BoostThreadWorker.hpp new file mode 100644 index 00000000000..2fe39c0a7b7 --- /dev/null +++ b/src/slic3r/GUI/Jobs/BoostThreadWorker.hpp @@ -0,0 +1,140 @@ +#ifndef BOOSTTHREADWORKER_HPP +#define BOOSTTHREADWORKER_HPP + +#include + +#include "Worker.hpp" + +#include +#include + +#include "ThreadSafeQueue.hpp" + +namespace Slic3r { namespace GUI { + +// An implementation of the Worker interface which uses the boost::thread +// API and two thread safe message queues to communicate with the main thread +// back and forth. The queue from the main thread to the worker thread holds the +// job entries that will be performed on the worker. The other queue holds messages +// from the worker to the main thread. These messages include status updates, +// finishing operation and arbitrary functiors that need to be performed +// on the main thread during the jobs execution, like displaying intermediate +// results. +class BoostThreadWorker : public Worker, private Job::Ctl +{ + struct JobEntry // Goes into worker and also out of worker as a finalize msg + { + std::unique_ptr job; + bool canceled = false; + std::exception_ptr eptr = nullptr; + }; + + // A message data for status updates. Only goes from worker to main thread. + struct StatusInfo { int status; std::string msg; }; + + // An arbitrary callback to be called on the main thread. Only from worker + // to main thread. + struct MainThreadCallData + { + std::function fn; + std::promise promise; + }; + + struct EmptyMessage {}; + + class WorkerMessage + { + public: + enum MsgType { Empty, Status, Finalize, MainThreadCall }; + + private: + boost::variant m_data; + + public: + WorkerMessage() = default; + WorkerMessage(int s, std::string txt) + : m_data{StatusInfo{s, std::move(txt)}} + {} + WorkerMessage(JobEntry &&entry) : m_data{std::move(entry)} {} + WorkerMessage(MainThreadCallData fn) : m_data{std::move(fn)} {} + + int get_type () const { return m_data.which(); } + + void deliver(BoostThreadWorker &runner); + }; + + using JobQueue = ThreadSafeQueueSPSC; + using MessageQueue = ThreadSafeQueueSPSC; + + boost::thread m_thread; + std::atomic m_running{false}, m_canceled{false}; + std::shared_ptr m_progress; + JobQueue m_input_queue; // from main thread to worker + MessageQueue m_output_queue; // form worker to main thread + std::string m_name; + + void run(); + + bool join(int timeout_ms = 0); + +protected: + // Implement Job::Ctl interface: + + void update_status(int st, const std::string &msg = "") override; + + bool was_canceled() const override { return m_canceled.load(); } + + std::future call_on_main_thread(std::function fn) override; + +public: + explicit BoostThreadWorker(std::shared_ptr pri, + boost::thread::attributes & attr, + const char * name = ""); + + explicit BoostThreadWorker(std::shared_ptr pri, + boost::thread::attributes && attr, + const char * name = "") + : BoostThreadWorker{std::move(pri), attr, name} + {} + + explicit BoostThreadWorker(std::shared_ptr pri, + const char * name = "") + : BoostThreadWorker{std::move(pri), {}, name} + {} + + ~BoostThreadWorker(); + + BoostThreadWorker(const BoostThreadWorker &) = delete; + BoostThreadWorker(BoostThreadWorker &&) = delete; + BoostThreadWorker &operator=(const BoostThreadWorker &) = delete; + BoostThreadWorker &operator=(BoostThreadWorker &&) = delete; + + bool push(std::unique_ptr job) override; + + bool is_idle() const override + { + // The assumption is that jobs can only be queued from a single main + // thread from which this method is also called. And the output + // messages are also processed only in this calling thread. In that + // case, if the input queue is empty, it will remain so during this + // function call. If the worker thread is also not running and the + // output queue is already processed, we can safely say that the + // worker is dormant. + return m_input_queue.empty() && !m_running.load() && m_output_queue.empty(); + } + + void cancel() override { m_canceled.store(true); } + void cancel_all() override { m_input_queue.clear(); cancel(); } + + ProgressIndicator * get_pri() { return m_progress.get(); } + const ProgressIndicator * get_pri() const { return m_progress.get(); } + + void process_events() override; + bool wait_for_current_job(unsigned timeout_ms = 0) override; + bool wait_for_idle(unsigned timeout_ms = 0) override; + +}; + +}} // namespace Slic3r::GUI + +#endif // BOOSTTHREADWORKER_HPP diff --git a/src/slic3r/GUI/Jobs/BusyCursorJob.hpp b/src/slic3r/GUI/Jobs/BusyCursorJob.hpp new file mode 100644 index 00000000000..8504d1eb933 --- /dev/null +++ b/src/slic3r/GUI/Jobs/BusyCursorJob.hpp @@ -0,0 +1,53 @@ +#ifndef BUSYCURSORJOB_HPP +#define BUSYCURSORJOB_HPP + +#include "Job.hpp" + +#include +#include + +namespace Slic3r { namespace GUI { + +struct CursorSetterRAII +{ + Job::Ctl &ctl; + CursorSetterRAII(Job::Ctl &c) : ctl{c} + { + ctl.call_on_main_thread([] { wxBeginBusyCursor(); }); + } + ~CursorSetterRAII() + { + try { + ctl.call_on_main_thread([] { wxEndBusyCursor(); }); + } catch(...) { + BOOST_LOG_TRIVIAL(error) << "Can't revert cursor from busy to normal"; + } + } +}; + +template +class BusyCursored: public Job { + JobSubclass m_job; + +public: + template + BusyCursored(Args &&...args) : m_job{std::forward(args)...} + {} + + void process(Ctl &ctl) override + { + CursorSetterRAII cursor_setter{ctl}; + m_job.process(ctl); + } + + void finalize(bool canceled, std::exception_ptr &eptr) override + { + m_job.finalize(canceled, eptr); + } +}; + + +} +} + +#endif // BUSYCURSORJOB_HPP diff --git a/src/slic3r/GUI/Jobs/CreateFontNameImageJob.cpp b/src/slic3r/GUI/Jobs/CreateFontNameImageJob.cpp new file mode 100644 index 00000000000..4057b730dd5 --- /dev/null +++ b/src/slic3r/GUI/Jobs/CreateFontNameImageJob.cpp @@ -0,0 +1,166 @@ +#include "CreateFontNameImageJob.hpp" + +#include "libslic3r/Emboss.hpp" +// rasterization of ExPoly +#include "libslic3r/SLA/AGGRaster.hpp" + +#include "slic3r/Utils/WxFontUtils.hpp" +#include "slic3r/GUI/3DScene.hpp" // ::glsafe + +// ability to request new frame after finish rendering +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/GLCanvas3D.hpp" + +#include "wx/fontenum.h" + +#include + +using namespace Slic3r; +using namespace Slic3r::GUI; + +const std::string CreateFontImageJob::default_text = "AaBbCc 123"; + +CreateFontImageJob::CreateFontImageJob(FontImageData &&input) + : m_input(std::move(input)) +{ + assert(wxFontEnumerator::IsValidFacename(m_input.font_name)); + assert(m_input.gray_level > 0 && m_input.gray_level < 255); + assert(m_input.texture_id != 0); +} + +void CreateFontImageJob::process(Ctl &ctl) +{ + if (!wxFontEnumerator::IsValidFacename(m_input.font_name)) return; + // Select font + wxFont wx_font( + wxFontInfo().FaceName(m_input.font_name).Encoding(m_input.encoding)); + if (!wx_font.IsOk()) return; + + std::unique_ptr font_file = + WxFontUtils::create_font_file(wx_font); + if (font_file == nullptr) return; + + Emboss::FontFileWithCache font_file_with_cache(std::move(font_file)); + // use only first line of text + std::string& text = m_input.text; + if (text.empty()) + text = default_text; // copy + + size_t enter_pos = text.find('\n'); + if (enter_pos < text.size()) { + // text start with enter + if (enter_pos == 0) return; + // exist enter, soo delete all after enter + text = text.substr(0, enter_pos); + } + + std::function was_canceled = [&ctl, cancel = m_input.cancel]() -> bool { + if (ctl.was_canceled()) return true; + if (cancel->load()) return true; + return false; + }; + + FontProp fp; // create default font parameters + ExPolygons shapes = Emboss::text2shapes(font_file_with_cache, text.c_str(), fp, was_canceled); + + // select some character from font e.g. default text + if (shapes.empty()) + shapes = Emboss::text2shapes(font_file_with_cache, default_text.c_str(), fp, was_canceled); + if (shapes.empty()) { + m_input.cancel->store(true); + return; + } + + // normalize height of font + BoundingBox bounding_box; + for (ExPolygon &shape : shapes) + bounding_box.merge(BoundingBox(shape.contour.points)); + if (bounding_box.size().x() < 1 || bounding_box.size().y() < 1) { + m_input.cancel->store(true); + return; + } + double scale = m_input.size.y() / (double) bounding_box.size().y(); + BoundingBoxf bb2(bounding_box.min.cast(), + bounding_box.max.cast()); + bb2.scale(scale); + Vec2d size_f = bb2.size(); + m_tex_size = Point(std::ceil(size_f.x()), std::ceil(size_f.y())); + // crop image width + if (m_tex_size.x() > m_input.size.x()) m_tex_size.x() = m_input.size.x(); + if (m_tex_size.y() > m_input.size.y()) m_tex_size.y() = m_input.size.y(); + + // Set up result + unsigned bit_count = 4; // RGBA + m_result = std::vector(m_tex_size.x() * m_tex_size.y() * bit_count, {255}); + + sla::Resolution resolution(m_tex_size.x(), m_tex_size.y()); + double pixel_dim = SCALING_FACTOR / scale; + sla::PixelDim dim(pixel_dim, pixel_dim); + double gamma = 1.; + std::unique_ptr r = + sla::create_raster_grayscale_aa(resolution, dim, gamma); + for (ExPolygon &shape : shapes) shape.translate(-bounding_box.min); + for (const ExPolygon &shape : shapes) r->draw(shape); + + // copy rastered data to pixels + sla::RasterEncoder encoder = + [&pix = m_result, w = m_tex_size.x(), h = m_tex_size.y(), + gray_level = m_input.gray_level] + (const void *ptr, size_t width, size_t height, size_t num_components) { + size_t size {static_cast(w*h)}; + const unsigned char *ptr2 = (const unsigned char *) ptr; + for (size_t x = 0; x < width; ++x) + for (size_t y = 0; y < height; ++y) { + size_t index = y*w + x; + assert(index < size); + if (index >= size) continue; + pix[3+4*index] = ptr2[y * width + x] / gray_level; + } + return sla::EncodedRaster(); + }; + r->encode(encoder); +} + +void CreateFontImageJob::finalize(bool canceled, std::exception_ptr &) +{ + if (m_input.count_opened_font_files) + --(*m_input.count_opened_font_files); + if (canceled || m_input.cancel->load()) return; + + *m_input.is_created = true; + + // Exist result bitmap with preview? + // (not valid input. e.g. not loadable font) + if (m_result.empty()) { + // TODO: write text cannot load into texture + m_result = std::vector(m_tex_size.x() * m_tex_size.y() * 4, {255}); + } + + // upload texture on GPU + const GLenum target = GL_TEXTURE_2D; + glsafe(::glBindTexture(target, m_input.texture_id)); + + GLsizei w = m_tex_size.x(), h = m_tex_size.y(); + GLint xoffset = m_input.size.x() - m_tex_size.x(), // arrange right + yoffset = m_input.size.y() * m_input.index; + glsafe(::glTexSubImage2D(target, m_input.level, xoffset, yoffset, w, h, + m_input.format, m_input.type, m_result.data())); + + // clear rest of texture + std::vector empty_data(xoffset * h * 4, {0}); + glsafe(::glTexSubImage2D(target, m_input.level, 0, yoffset, xoffset, h, + m_input.format, m_input.type, empty_data.data())); + + // bind default texture + GLuint no_texture_id = 0; + glsafe(::glBindTexture(target, no_texture_id)); + + // show rendered texture + wxGetApp().plater()->canvas3D()->schedule_extra_frame(0); + + BOOST_LOG_TRIVIAL(info) + << "Generate Preview font('" << m_input.font_name << "' id:" << m_input.index << ") " + << "with text: '" << m_input.text << "' " + << "texture_size " << m_input.size.x() << " x " << m_input.size.y(); +} \ No newline at end of file diff --git a/src/slic3r/GUI/Jobs/CreateFontNameImageJob.hpp b/src/slic3r/GUI/Jobs/CreateFontNameImageJob.hpp new file mode 100644 index 00000000000..36c3e5e7f72 --- /dev/null +++ b/src/slic3r/GUI/Jobs/CreateFontNameImageJob.hpp @@ -0,0 +1,81 @@ +#ifndef slic3r_CreateFontNameImageJob_hpp_ +#define slic3r_CreateFontNameImageJob_hpp_ + +#include +#include +#include +#include +#include +#include "Job.hpp" +#include "libslic3r/Point.hpp" // Vec2i + +namespace Slic3r::GUI { + +/// +/// Keep data for rasterization of text by font face +/// +struct FontImageData +{ + // Text to rasterize + std::string text; + // Define font face + wxString font_name; + wxFontEncoding encoding; + // texture for copy result to + // texture MUST BE initialized + GLuint texture_id; + // Index of face name, define place in texture + size_t index; + // Height of each text + // And Limit for width + Vec2i size; // in px + + // bigger value create darker image + // divide value 255 + unsigned char gray_level = 5; + + // texture meta data + GLenum format = GL_ALPHA, type = GL_UNSIGNED_BYTE; + GLint level = 0; + + // prevent opening too much files + // it is decreased in finalize phase + unsigned int *count_opened_font_files = nullptr; + + std::shared_ptr> cancel = nullptr; + std::shared_ptr is_created = nullptr; +}; + +/// +/// Create image for face name +/// +class CreateFontImageJob : public Job +{ + FontImageData m_input; + std::vector m_result; + Point m_tex_size; +public: + CreateFontImageJob(FontImageData &&input); + /// + /// Rasterize text into image (result) + /// + /// Check for cancelation + void process(Ctl &ctl) override; + + /// + /// Copy image data into OpenGL texture + /// + /// + /// + void finalize(bool canceled, std::exception_ptr &) override; + + /// + /// Text used for generate preview for empty text + /// and when no glyph for given m_input.text + /// + static const std::string default_text; +}; + +} // namespace Slic3r::GUI + +#endif // slic3r_CreateFontNameImageJob_hpp_ diff --git a/src/slic3r/GUI/Jobs/CreateFontStyleImagesJob.cpp b/src/slic3r/GUI/Jobs/CreateFontStyleImagesJob.cpp new file mode 100644 index 00000000000..8aa9e23cb95 --- /dev/null +++ b/src/slic3r/GUI/Jobs/CreateFontStyleImagesJob.cpp @@ -0,0 +1,155 @@ +#include "CreateFontStyleImagesJob.hpp" + +// rasterization of ExPoly +#include "libslic3r/SLA/AGGRaster.hpp" +#include "slic3r/GUI/3DScene.hpp" // ::glsafe + +// ability to request new frame after finish rendering +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/GLCanvas3D.hpp" + +using namespace Slic3r; +using namespace Slic3r::Emboss; +using namespace Slic3r::GUI; +using namespace Slic3r::GUI::Emboss; + + +CreateFontStyleImagesJob::CreateFontStyleImagesJob(StyleManager::StyleImagesData &&input) + : m_input(std::move(input)), m_width(0), m_height(0) +{ + assert(m_input.result != nullptr); + assert(!m_input.styles.empty()); + assert(!m_input.text.empty()); + assert(m_input.max_size.x() > 1); + assert(m_input.max_size.y() > 1); + assert(m_input.ppm > 1e-5); +} + +void CreateFontStyleImagesJob::process(Ctl &ctl) +{ + // create shapes and calc size (bounding boxes) + std::vector name_shapes(m_input.styles.size()); + std::vector scales(m_input.styles.size()); + m_images = std::vector(m_input.styles.size()); + + for (auto &item : m_input.styles) { + size_t index = &item - &m_input.styles.front(); + ExPolygons &shapes = name_shapes[index]; + shapes = text2shapes(item.font, m_input.text.c_str(), item.prop); + + // create image description + StyleManager::StyleImage &image = m_images[index]; + BoundingBox &bounding_box = image.bounding_box; + for (ExPolygon &shape : shapes) + bounding_box.merge(BoundingBox(shape.contour.points)); + for (ExPolygon &shape : shapes) shape.translate(-bounding_box.min); + + // calculate conversion from FontPoint to screen pixels by size of font + const auto &cn = item.prop.collection_number; + unsigned int font_index = (cn.has_value()) ? *cn : 0; + double unit_per_em = item.font.font_file->infos[font_index].unit_per_em; + double scale = item.prop.size_in_mm / unit_per_em * SHAPE_SCALE * m_input.ppm; + scales[index] = scale; + + //double scale = font_prop.size_in_mm * SCALING_FACTOR; + BoundingBoxf bb2(bounding_box.min.cast(), + bounding_box.max.cast()); + bb2.scale(scale); + image.tex_size.x = std::ceil(bb2.max.x() - bb2.min.x()); + image.tex_size.y = std::ceil(bb2.max.y() - bb2.min.y()); + + // crop image width + if (image.tex_size.x > m_input.max_size.x()) + image.tex_size.x = m_input.max_size.x(); + // crop image height + if (image.tex_size.y > m_input.max_size.y()) + image.tex_size.y = m_input.max_size.y(); + } + + // arrange bounding boxes + int offset_y = 0; + m_width = 0; + for (StyleManager::StyleImage &image : m_images) { + image.offset.y() = offset_y; + offset_y += image.tex_size.y+1; + if (m_width < image.tex_size.x) + m_width = image.tex_size.x; + } + m_height = offset_y; + for (StyleManager::StyleImage &image : m_images) { + const Point &o = image.offset; + const ImVec2 &s = image.tex_size; + image.uv0 = ImVec2(o.x() / (double) m_width, + o.y() / (double) m_height); + image.uv1 = ImVec2((o.x() + s.x) / (double) m_width, + (o.y() + s.y) / (double) m_height); + } + + // Set up result + m_pixels = std::vector(4 * m_width * m_height, {255}); + + // upload sub textures + for (StyleManager::StyleImage &image : m_images) { + sla::Resolution resolution(image.tex_size.x, image.tex_size.y); + size_t index = &image - &m_images.front(); + double pixel_dim = SCALING_FACTOR / scales[index]; + sla::PixelDim dim(pixel_dim, pixel_dim); + double gamma = 1.; + std::unique_ptr r = + sla::create_raster_grayscale_aa(resolution, dim, gamma); + for (const ExPolygon &shape : name_shapes[index]) r->draw(shape); + + // copy rastered data to pixels + sla::RasterEncoder encoder = [&offset = image.offset, &pix = m_pixels, w=m_width,h=m_height] + (const void *ptr, size_t width, size_t height, size_t num_components) { + // bigger value create darker image + unsigned char gray_level = 5; + size_t size {static_cast(w*h)}; + assert((offset.x() + width) <= (size_t)w); + assert((offset.y() + height) <= (size_t)h); + const unsigned char *ptr2 = (const unsigned char *) ptr; + for (size_t x = 0; x < width; ++x) + for (size_t y = 0; y < height; ++y) { + size_t index = (offset.y() + y)*w + offset.x() + x; + assert(index < size); + if (index >= size) continue; + pix[4*index+3] = ptr2[y * width + x] / gray_level; + } + return sla::EncodedRaster(); + }; + r->encode(encoder); + } +} + +void CreateFontStyleImagesJob::finalize(bool canceled, std::exception_ptr &) +{ + if (canceled) return; + // upload texture on GPU + GLuint tex_id; + GLenum target = GL_TEXTURE_2D, format = GL_RGBA, type = GL_UNSIGNED_BYTE; + GLint level = 0, border = 0; + glsafe(::glGenTextures(1, &tex_id)); + glsafe(::glBindTexture(target, tex_id)); + glsafe(::glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); + glsafe(::glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); + GLint w = m_width, h = m_height; + glsafe(::glTexImage2D(target, level, GL_RGBA, w, h, border, format, type, + (const void *) m_pixels.data())); + + // set up texture id + void *texture_id = (void *) (intptr_t) tex_id; + for (StyleManager::StyleImage &image : m_images) + image.texture_id = texture_id; + + // move to result + m_input.result->styles = std::move(m_input.styles); + m_input.result->images = std::move(m_images); + + // bind default texture + GLuint no_texture_id = 0; + glsafe(::glBindTexture(target, no_texture_id)); + + // show rendered texture + wxGetApp().plater()->canvas3D()->schedule_extra_frame(0); +} \ No newline at end of file diff --git a/src/slic3r/GUI/Jobs/CreateFontStyleImagesJob.hpp b/src/slic3r/GUI/Jobs/CreateFontStyleImagesJob.hpp new file mode 100644 index 00000000000..b8c2757a626 --- /dev/null +++ b/src/slic3r/GUI/Jobs/CreateFontStyleImagesJob.hpp @@ -0,0 +1,36 @@ +#ifndef slic3r_CreateFontStyleImagesJob_hpp_ +#define slic3r_CreateFontStyleImagesJob_hpp_ + +#include +#include +#include +#include "slic3r/Utils/EmbossStyleManager.hpp" +#include "Job.hpp" + +namespace Slic3r::GUI::Emboss { + +/// +/// Create texture with name of styles written by its style +/// NOTE: Access to glyph cache is possible only from job +/// +class CreateFontStyleImagesJob : public Job +{ + StyleManager::StyleImagesData m_input; + + // Output data + // texture size + int m_width, m_height; + // texture data + std::vector m_pixels; + // descriptors of sub textures + std::vector m_images; + +public: + CreateFontStyleImagesJob(StyleManager::StyleImagesData &&input); + void process(Ctl &ctl) override; + void finalize(bool canceled, std::exception_ptr &) override; +}; + +} // namespace Slic3r::GUI + +#endif // slic3r_CreateFontStyleImagesJob_hpp_ diff --git a/src/slic3r/GUI/Jobs/EmbossJob.cpp b/src/slic3r/GUI/Jobs/EmbossJob.cpp new file mode 100644 index 00000000000..a265c4de9f6 --- /dev/null +++ b/src/slic3r/GUI/Jobs/EmbossJob.cpp @@ -0,0 +1,859 @@ +#include "EmbossJob.hpp" + +#include + +#include +#include // load_obj for default mesh +#include // use surface cuts + +#include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/NotificationManager.hpp" +#include "slic3r/GUI/GLCanvas3D.hpp" +#include "slic3r/GUI/GUI_ObjectList.hpp" +#include "slic3r/GUI/MainFrame.hpp" +#include "slic3r/GUI/GUI.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoEmboss.hpp" +#include "slic3r/GUI/CameraUtils.hpp" +#include "slic3r/GUI/format.hpp" +#include "slic3r/Utils/UndoRedo.hpp" + +using namespace Slic3r; +using namespace Slic3r::Emboss; +using namespace Slic3r::GUI; +using namespace Slic3r::GUI::Emboss; + +// private namespace +namespace priv{ +// create sure that emboss object is bigger than source object [in mm] +constexpr float safe_extension = 1.0f; + +/// +/// Assert check of inputs data +/// +/// +/// +bool check(const DataBase &input, bool check_fontfile = true, bool use_surface = false); +bool check(const DataCreateVolume &input, bool is_main_thread = false); +bool check(const DataCreateObject &input); +bool check(const DataUpdate &input, bool is_main_thread = false, bool use_surface = false); +bool check(const CreateSurfaceVolumeData &input, bool is_main_thread = false); +bool check(const UpdateSurfaceVolumeData &input, bool is_main_thread = false); + +template static ExPolygons create_shape(DataBase &input, Fnc was_canceled); + +// +/// Try to create mesh from text +/// +/// Text to convert on mesh +/// + Shape of characters + Property of font +/// Font file with cache +/// NOTE: Cache glyphs is changed +/// To check if process was canceled +/// Triangle mesh model +template static TriangleMesh try_create_mesh(DataBase &input, Fnc was_canceled); +template static TriangleMesh create_mesh(DataBase &input, Fnc was_canceled, Job::Ctl &ctl); + +/// +/// Create default mesh for embossed text +/// +/// Not empty model(index trinagle set - its) +static TriangleMesh create_default_mesh(); + +/// +/// Must be called on main thread +/// +/// New mesh data +/// Text configuration, ... +/// Transformation of volume +static void update_volume(TriangleMesh &&mesh, const DataUpdate &data, Transform3d *tr = nullptr); + +/// +/// Add new volume to object +/// +/// triangles of new volume +/// Object where to add volume +/// Type of new volume +/// Transformation of volume inside of object +/// Text configuration and New VolumeName +static void create_volume(TriangleMesh &&mesh, const ObjectID& object_id, + const ModelVolumeType type, const Transform3d trmat, const DataBase &data); + +/// +/// Select Volume from objects +/// +/// All objects in scene +/// Identifier of volume in object +/// Pointer to volume when exist otherwise nullptr +static ModelVolume *get_volume(ModelObjectPtrs &objects, const ObjectID &volume_id); + +/// +/// Create projection for cut surface from mesh +/// +/// Volume transformation in object +/// Convert shape to milimeters +/// Bounding box 3d of model volume for projection ranges +/// Orthogonal cut_projection +static OrthoProject create_projection_for_cut(Transform3d tr, double shape_scale, const std::pair &z_range); + +/// +/// Create tranformation for emboss Cutted surface +/// +/// True .. raise, False .. engrave +/// Depth of embossing +/// Text voliume transformation inside object +/// Cutted surface from model +/// Projection +static OrthoProject3d create_emboss_projection(bool is_outside, float emboss, Transform3d tr, SurfaceCut &cut); + +/// +/// Cut surface into triangle mesh +/// +/// (can't be const - cache of font) +/// SurfaceVolume data +/// Check to interupt execution +/// Extruded object from cuted surace +static TriangleMesh cut_surface(/*const*/ DataBase &input1, const SurfaceVolumeData &input2, std::function was_canceled); + +static void create_message(const std::string &message); // only in finalize +static bool process(std::exception_ptr &eptr); +static bool finalize(bool canceled, std::exception_ptr &eptr, const DataBase &input); + +class JobException : public std::runtime_error { +public: JobException(const char* message):runtime_error(message){}}; + +}// namespace priv + +///////////////// +/// Create Volume +CreateVolumeJob::CreateVolumeJob(DataCreateVolume &&input) + : m_input(std::move(input)) +{ + assert(priv::check(m_input, true)); +} + +void CreateVolumeJob::process(Ctl &ctl) { + if (!priv::check(m_input)) throw std::runtime_error("Bad input data for EmbossCreateVolumeJob."); + auto was_canceled = [&ctl]()->bool { return ctl.was_canceled(); }; + m_result = priv::create_mesh(m_input, was_canceled, ctl); + // center result + Vec3f c = m_result.bounding_box().center().cast(); + if (!c.isApprox(Vec3f::Zero())) m_result.translate(-c); +} + +void CreateVolumeJob::finalize(bool canceled, std::exception_ptr &eptr) { + if (!priv::finalize(canceled, eptr, m_input)) + return; + if (m_result.its.empty()) + return priv::create_message("Can't create empty volume."); + + priv::create_volume(std::move(m_result), m_input.object_id, m_input.volume_type, m_input.trmat, m_input); +} + + +///////////////// +/// Create Object +CreateObjectJob::CreateObjectJob(DataCreateObject &&input) + : m_input(std::move(input)) +{ + assert(priv::check(m_input)); +} + +void CreateObjectJob::process(Ctl &ctl) +{ + if (!priv::check(m_input)) + throw std::runtime_error("Bad input data for EmbossCreateObjectJob."); + + auto was_canceled = [&ctl]()->bool { return ctl.was_canceled(); }; + m_result = priv::create_mesh(m_input, was_canceled, ctl); + if (was_canceled()) return; + + // Create new object + // calculate X,Y offset position for lay on platter in place of + // mouse click + Vec2d bed_coor = CameraUtils::get_z0_position( + m_input.camera, m_input.screen_coor); + + // check point is on build plate: + Points bed_shape_; + bed_shape_.reserve(m_input.bed_shape.size()); + for (const Vec2d &p : m_input.bed_shape) + bed_shape_.emplace_back(p.cast()); + Polygon bed(bed_shape_); + if (!bed.contains(bed_coor.cast())) + // mouse pose is out of build plate so create object in center of plate + bed_coor = bed.centroid().cast(); + + double z = m_input.text_configuration.style.prop.emboss / 2; + Vec3d offset(bed_coor.x(), bed_coor.y(), z); + offset -= m_result.center(); + Transform3d::TranslationType tt(offset.x(), offset.y(), offset.z()); + m_transformation = Transform3d(tt); +} + +void CreateObjectJob::finalize(bool canceled, std::exception_ptr &eptr) +{ + if (!priv::finalize(canceled, eptr, m_input)) + return; + + // only for sure + if (m_result.empty()) + return priv::create_message("Can't create empty object."); + + GUI_App &app = wxGetApp(); + Plater *plater = app.plater(); + ObjectList *obj_list = app.obj_list(); + GLCanvas3D *canvas = plater->canvas3D(); + + plater->take_snapshot(_L("Add Emboss text object")); + + // Create new object and change selection + bool center = false; + obj_list->load_mesh_object(std::move(m_result), m_input.volume_name, + center, &m_input.text_configuration, + &m_transformation); + + // When add new object selection is empty. + // When cursor move and no one object is selected than + // Manager::reset_all() So Gizmo could be closed before end of creation object + GLGizmosManager &manager = canvas->get_gizmos_manager(); + if (manager.get_current_type() != GLGizmosManager::Emboss) + manager.open_gizmo(GLGizmosManager::Emboss); + + // redraw scene + canvas->reload_scene(true); +} + +///////////////// +/// Update Volume +UpdateJob::UpdateJob(DataUpdate&& input) + : m_input(std::move(input)) +{ + assert(priv::check(m_input, true)); +} + +void UpdateJob::process(Ctl &ctl) +{ + if (!priv::check(m_input)) + throw std::runtime_error("Bad input data for EmbossUpdateJob."); + + auto was_canceled = [&ctl, &cancel = m_input.cancel]()->bool { + if (cancel->load()) return true; + return ctl.was_canceled(); + }; + m_result = priv::try_create_mesh(m_input, was_canceled); + if (was_canceled()) return; + if (m_result.its.empty()) + throw priv::JobException(_u8L("Created text volume is empty. Change text or font.").c_str()); + + // center triangle mesh + Vec3d shift = m_result.bounding_box().center(); + m_result.translate(-shift.cast()); +} + +void UpdateJob::finalize(bool canceled, std::exception_ptr &eptr) +{ + if (!priv::finalize(canceled, eptr, m_input)) + return; + priv::update_volume(std::move(m_result), m_input); +} + +namespace Slic3r::GUI::Emboss { + +SurfaceVolumeData::ModelSources create_sources(const ModelVolumePtrs &volumes, std::optional text_volume_id) +{ + SurfaceVolumeData::ModelSources result; + result.reserve(volumes.size() - 1); + for (const ModelVolume *v : volumes) { + if (text_volume_id.has_value() && v->id().id == *text_volume_id) continue; + // skip modifiers and negative volumes, ... + if (!v->is_model_part()) continue; + const TriangleMesh &tm = v->mesh(); + if (tm.empty()) continue; + if (tm.its.empty()) continue; + result.push_back({v->get_mesh_shared_ptr(), v->get_matrix()}); + } + return result; +} + +SurfaceVolumeData::ModelSources create_volume_sources(const ModelVolume *text_volume) +{ + if (text_volume == nullptr) return {}; + if (!text_volume->text_configuration.has_value()) return {}; + const ModelVolumePtrs &volumes = text_volume->get_object()->volumes; + // no other volume in object + if (volumes.size() <= 1) return {}; + return create_sources(volumes, text_volume->id().id); +} + +} // namespace Slic3r::GUI::Emboss + +///////////////// +/// Create Surface volume +CreateSurfaceVolumeJob::CreateSurfaceVolumeJob(CreateSurfaceVolumeData &&input) + : m_input(std::move(input)) +{ + assert(priv::check(m_input, true)); +} + +void CreateSurfaceVolumeJob::process(Ctl &ctl) { + if (!priv::check(m_input)) + throw std::runtime_error("Bad input data for CreateSurfaceVolumeJob."); + // check cancelation of process + auto was_canceled = [&ctl]() -> bool { return ctl.was_canceled(); }; + m_result = priv::cut_surface(m_input, m_input, was_canceled); +} + +void CreateSurfaceVolumeJob::finalize(bool canceled, std::exception_ptr &eptr) { + if (!priv::finalize(canceled, eptr, m_input)) + return; + priv::create_volume(std::move(m_result), m_input.object_id, + m_input.volume_type, m_input.text_tr, m_input); +} + +///////////////// +/// Cut Surface +UpdateSurfaceVolumeJob::UpdateSurfaceVolumeJob(UpdateSurfaceVolumeData &&input) + : m_input(std::move(input)) +{ + assert(priv::check(m_input, true)); +} + +void UpdateSurfaceVolumeJob::process(Ctl &ctl) +{ + if (!priv::check(m_input)) + throw std::runtime_error("Bad input data for UseSurfaceJob."); + + // check cancelation of process + auto was_canceled = [&ctl, &cancel = m_input.cancel]()->bool { + if (cancel->load()) return true; + return ctl.was_canceled(); + }; + m_result = priv::cut_surface(m_input, m_input, was_canceled); +} + +void UpdateSurfaceVolumeJob::finalize(bool canceled, std::exception_ptr &eptr) +{ + if (!priv::finalize(canceled, eptr, m_input)) + return; + + // when start using surface it is wanted to move text origin on surface of model + // also when repeteadly move above surface result position should match + Transform3d *tr = &m_input.text_tr; + priv::update_volume(std::move(m_result), m_input, tr); +} + +//////////////////////////// +/// private namespace implementation +bool priv::check(const DataBase &input, bool check_fontfile, bool use_surface) +{ + bool res = true; + if (check_fontfile) { + assert(input.font_file.has_value()); + res &= input.font_file.has_value(); + } + assert(!input.text_configuration.fix_3mf_tr.has_value()); + res &= !input.text_configuration.fix_3mf_tr.has_value(); + assert(!input.text_configuration.text.empty()); + res &= !input.text_configuration.text.empty(); + assert(!input.volume_name.empty()); + res &= !input.volume_name.empty(); + assert(input.text_configuration.style.prop.use_surface == use_surface); + res &= input.text_configuration.style.prop.use_surface == use_surface; + return res; +} +bool priv::check(const DataCreateVolume &input, bool is_main_thread) { + bool check_fontfile = false; + bool res = check((DataBase) input, check_fontfile); + assert(input.volume_type != ModelVolumeType::INVALID); + res &= input.volume_type != ModelVolumeType::INVALID; + assert(input.object_id.id >= 0); + res &= input.object_id.id >= 0; + return res; +} +bool priv::check(const DataCreateObject &input) { + bool check_fontfile = false; + bool res = check((DataBase) input, check_fontfile); + assert(input.screen_coor.x() >= 0.); + res &= input.screen_coor.x() >= 0.; + assert(input.screen_coor.y() >= 0.); + res &= input.screen_coor.y() >= 0.; + assert(input.bed_shape.size() >= 3); // at least triangle + res &= input.bed_shape.size() >= 3; + return res; +} +bool priv::check(const DataUpdate &input, bool is_main_thread, bool use_surface){ + bool check_fontfile = true; + bool res = check((DataBase) input, check_fontfile, use_surface); + assert(input.volume_id.id >= 0); + res &= input.volume_id.id >= 0; + if (is_main_thread) + assert(get_volume(wxGetApp().model().objects, input.volume_id) != nullptr); + assert(input.cancel != nullptr); + res &= input.cancel != nullptr; + if (is_main_thread) + assert(!input.cancel->load()); + return res; +} +bool priv::check(const CreateSurfaceVolumeData &input, bool is_main_thread) +{ + bool use_surface = true; + bool res = check((DataBase)input, is_main_thread, use_surface); + assert(!input.sources.empty()); + res &= !input.sources.empty(); + return res; +} +bool priv::check(const UpdateSurfaceVolumeData &input, bool is_main_thread){ + bool use_surface = true; + bool res = check((DataUpdate)input, is_main_thread, use_surface); + assert(!input.sources.empty()); + res &= !input.sources.empty(); + return res; +} + +template +ExPolygons priv::create_shape(DataBase &input, Fnc was_canceled) { + FontFileWithCache &font = input.font_file; + const TextConfiguration &tc = input.text_configuration; + const char *text = tc.text.c_str(); + const FontProp &prop = tc.style.prop; + + assert(font.has_value()); + if (!font.has_value()) + return {}; + + return text2shapes(font, text, prop, was_canceled); +} + +template +TriangleMesh priv::try_create_mesh(DataBase &input, Fnc was_canceled) +{ + ExPolygons shapes = priv::create_shape(input, was_canceled); + if (shapes.empty()) return {}; + if (was_canceled()) return {}; + + const FontProp &prop = input.text_configuration.style.prop; + const std::optional &cn = prop.collection_number; + unsigned int font_index = (cn.has_value()) ? *cn : 0; + const FontFileWithCache &font = input.font_file; + assert(font_index < font.font_file->infos.size()); + int unit_per_em = font.font_file->infos[font_index].unit_per_em; + float scale = prop.size_in_mm / unit_per_em; + float depth = prop.emboss / scale; + auto projectZ = std::make_unique(depth); + ProjectScale project(std::move(projectZ), scale); + if (was_canceled()) return {}; + return TriangleMesh(polygons2model(shapes, project)); +} + +template +TriangleMesh priv::create_mesh(DataBase &input, Fnc was_canceled, Job::Ctl& ctl) +{ + // It is neccessary to create some shape + // Emboss text window is opened by creation new emboss text object + TriangleMesh result; + if (input.font_file.has_value()) { + result = try_create_mesh(input, was_canceled); + if (was_canceled()) return {}; + } + + if (result.its.empty()) { + result = priv::create_default_mesh(); + if (was_canceled()) return {}; + // only info + ctl.call_on_main_thread([]() { + create_message("It is used default volume for embossed " + "text, try to change text or font to fix it."); + }); + } + + assert(!result.its.empty()); + return result; +} + +TriangleMesh priv::create_default_mesh() +{ + // When cant load any font use default object loaded from file + std::string path = Slic3r::resources_dir() + "/data/embossed_text.obj"; + TriangleMesh triangle_mesh; + if (!load_obj(path.c_str(), &triangle_mesh)) { + // when can't load mesh use cube + return TriangleMesh(its_make_cube(36., 4., 2.5)); + } + return triangle_mesh; +} + +namespace{ +void update_volume_name(const ModelVolume &volume, const ObjectList *obj_list) +{ + if (obj_list == nullptr) + return; + + const std::vector* objects = obj_list->objects(); + if (objects == nullptr) + return; + + int object_idx = -1; + int volume_idx = -1; + for (size_t oi = 0; oi < objects->size(); ++oi) { + const ModelObject *mo = objects->at(oi); + if (mo == nullptr) + continue; + if (volume.get_object()->id() != mo->id()) + continue; + const ModelVolumePtrs& volumes = mo->volumes; + for (size_t vi = 0; vi < volumes.size(); ++vi) { + const ModelVolume *mv = volumes[vi]; + if (mv == nullptr) + continue; + if (mv->id() == volume.id()){ + object_idx = static_cast(oi); + volume_idx = static_cast(vi); + break; + } + } + if (volume_idx > 0) + break; + } + obj_list->update_name_in_list(object_idx, volume_idx); +} +} + +void UpdateJob::update_volume(ModelVolume *volume, + TriangleMesh &&mesh, + const TextConfiguration &text_configuration, + std::string_view volume_name) +{ + // check inputs + bool is_valid_input = + volume != nullptr && + !mesh.empty() && + !volume_name.empty(); + assert(is_valid_input); + if (!is_valid_input) return; + + // update volume + volume->set_mesh(std::move(mesh)); + volume->set_new_unique_id(); + volume->calculate_convex_hull(); + volume->get_object()->invalidate_bounding_box(); + volume->text_configuration = text_configuration; + + // discard information about rotation, should not be stored in volume + volume->text_configuration->style.prop.angle.reset(); + + GUI_App &app = wxGetApp(); // may be move ObjectList and Plater to input? + + // update volume name in right panel( volume / object name) + if (volume->name != volume_name) { + volume->name = volume_name; + update_volume_name(*volume, app.obj_list()); + } + + // When text is object. + // When text positive volume is lowest part of object than modification of text + // have to move object on bed. + if (volume->type() == ModelVolumeType::MODEL_PART) + volume->get_object()->ensure_on_bed(); + + // redraw scene + Plater *plater = app.plater(); + if (plater == nullptr) + return; + + // Update Model and redraw scene + plater->update(); +} + +void priv::update_volume(TriangleMesh &&mesh, const DataUpdate &data, Transform3d* tr) +{ + // for sure that some object will be created + if (mesh.its.empty()) + return create_message("Empty mesh can't be created."); + + Plater *plater = wxGetApp().plater(); + GLCanvas3D *canvas = plater->canvas3D(); + + // Check emboss gizmo is still open + GLGizmosManager &manager = canvas->get_gizmos_manager(); + if (manager.get_current_type() != GLGizmosManager::Emboss) + return; + + std::string snap_name = GUI::format(_L("Text: %1%"), data.text_configuration.text); + Plater::TakeSnapshot snapshot(plater, snap_name, UndoRedo::SnapshotType::GizmoAction); + ModelVolume *volume = get_volume(plater->model().objects, data.volume_id); + + // could appear when user delete edited volume + if (volume == nullptr) + return; + + if (tr) { + volume->set_transformation(*tr); + } else { + // apply fix matrix made by store to .3mf + const auto &tc = volume->text_configuration; + assert(tc.has_value()); + if (tc.has_value() && tc->fix_3mf_tr.has_value()) + volume->set_transformation(volume->get_matrix() * tc->fix_3mf_tr->inverse()); + } + + UpdateJob::update_volume(volume, std::move(mesh), data.text_configuration, data.volume_name); +} + +void priv::create_volume( + TriangleMesh &&mesh, const ObjectID& object_id, + const ModelVolumeType type, const Transform3d trmat, const DataBase &data) +{ + GUI_App &app = wxGetApp(); + Plater *plater = app.plater(); + ObjectList *obj_list = app.obj_list(); + GLCanvas3D *canvas = plater->canvas3D(); + ModelObjectPtrs &objects = plater->model().objects; + + ModelObject *obj = nullptr; + size_t object_idx = 0; + for (; object_idx < objects.size(); ++object_idx) { + ModelObject *o = objects[object_idx]; + if (o->id() == object_id) { + obj = o; + break; + } + } + + // Parent object for text volume was propably removed. + // Assumption: User know what he does, so text volume is no more needed. + if (obj == nullptr) + return priv::create_message("Bad object to create volume."); + + if (mesh.its.empty()) + return priv::create_message("Can't create empty volume."); + + plater->take_snapshot(_L("Add Emboss text Volume")); + + // NOTE: be carefull add volume also center mesh !!! + // So first add simple shape(convex hull is also calculated) + ModelVolume *volume = obj->add_volume(make_cube(1., 1., 1.), type); + + // TODO: Refactor to create better way to not set cube at begining + // Revert mesh centering by set mesh after add cube + volume->set_mesh(std::move(mesh)); + volume->calculate_convex_hull(); + + + // set a default extruder value, since user can't add it manually + volume->config.set_key_value("extruder", new ConfigOptionInt(0)); + + // do not allow model reload from disk + volume->source.is_from_builtin_objects = true; + + volume->name = data.volume_name; // copy + volume->text_configuration = data.text_configuration; // copy + + // discard information about rotation, should not be stored in volume + volume->text_configuration->style.prop.angle.reset(); + + volume->set_transformation(trmat); + + // update printable state on canvas + if (type == ModelVolumeType::MODEL_PART) { + volume->get_object()->ensure_on_bed(); + canvas->update_instance_printable_state_for_object(object_idx); + } + + // update volume name in object list + // updata selection after new volume added + // change name of volume in right panel + // select only actual volume + // when new volume is created change selection to this volume + auto add_to_selection = [volume](const ModelVolume *vol) { return vol == volume; }; + wxDataViewItemArray sel = obj_list->reorder_volumes_and_get_selection(object_idx, add_to_selection); + if (!sel.IsEmpty()) obj_list->select_item(sel.front()); + + obj_list->selection_changed(); + + // Now is valid text volume selected open emboss gizmo + GLGizmosManager &manager = canvas->get_gizmos_manager(); + if (manager.get_current_type() != GLGizmosManager::Emboss) + manager.open_gizmo(GLGizmosManager::Emboss); + + // update model and redraw scene + //canvas->reload_scene(true); + plater->update(); +} + +ModelVolume *priv::get_volume(ModelObjectPtrs &objects, + const ObjectID &volume_id) +{ + for (ModelObject *obj : objects) + for (ModelVolume *vol : obj->volumes) + if (vol->id() == volume_id) return vol; + return nullptr; +}; + +OrthoProject priv::create_projection_for_cut( + Transform3d tr, + double shape_scale, + const std::pair &z_range) +{ + double min_z = z_range.first - priv::safe_extension; + double max_z = z_range.second + priv::safe_extension; + assert(min_z < max_z); + // range between min and max value + double projection_size = max_z - min_z; + Matrix3d transformation_for_vector = tr.linear(); + // Projection must be negative value. + // System of text coordinate + // X .. from left to right + // Y .. from bottom to top + // Z .. from text to eye + Vec3d untransformed_direction(0., 0., projection_size); + Vec3d project_direction = transformation_for_vector * untransformed_direction; + + // Projection is in direction from far plane + tr.translate(Vec3d(0., 0., min_z)); + tr.scale(shape_scale); + return OrthoProject(tr, project_direction); +} + +OrthoProject3d priv::create_emboss_projection( + bool is_outside, float emboss, Transform3d tr, SurfaceCut &cut) +{ + // Offset of clossed side to model + const float surface_offset = 0.015f; // [in mm] + float + front_move = (is_outside) ? emboss : surface_offset, + back_move = -((is_outside) ? surface_offset : emboss); + its_transform(cut, tr.pretranslate(Vec3d(0., 0., front_move))); + Vec3d from_front_to_back(0., 0., back_move - front_move); + return OrthoProject3d(from_front_to_back); +} + +// input can't be const - cache of font +TriangleMesh priv::cut_surface(DataBase& input1, const SurfaceVolumeData& input2, std::function was_canceled) +{ + ExPolygons shapes = create_shape(input1, was_canceled); + if (shapes.empty()) + throw JobException(_u8L("Font doesn't have any shape for given text.").c_str()); + + if (was_canceled()) return {}; + + // Define alignment of text - left, right, center, top bottom, .... + BoundingBox bb = get_extents(shapes); + Point projection_center = bb.center(); + for (ExPolygon &shape : shapes) shape.translate(-projection_center); + bb.translate(-projection_center); + + const FontFile &ff = *input1.font_file.font_file; + const FontProp &fp = input1.text_configuration.style.prop; + double shape_scale = get_shape_scale(fp, ff); + + const SurfaceVolumeData::ModelSources &sources = input2.sources; + const SurfaceVolumeData::ModelSource *biggest = nullptr; + + size_t biggest_count = 0; + // convert index from (s)ources to (i)ndexed (t)riangle (s)ets + std::vector s_to_itss(sources.size(), std::numeric_limits::max()); + std::vector itss; + itss.reserve(sources.size()); + for (const SurfaceVolumeData::ModelSource &s : sources) { + Transform3d mesh_tr_inv = s.tr.inverse(); + Transform3d cut_projection_tr = mesh_tr_inv * input2.text_tr; + std::pair z_range{0., 1.}; + OrthoProject cut_projection = create_projection_for_cut(cut_projection_tr, shape_scale, z_range); + // copy only part of source model + indexed_triangle_set its = its_cut_AoI(s.mesh->its, bb, cut_projection); + if (its.indices.empty()) continue; + if (biggest_count < its.vertices.size()) { + biggest_count = its.vertices.size(); + biggest = &s; + } + size_t source_index = &s - &sources.front(); + size_t its_index = itss.size(); + s_to_itss[source_index] = its_index; + itss.emplace_back(std::move(its)); + } + if (itss.empty()) + throw JobException(_u8L("There is no volume in projection direction.").c_str()); + + Transform3d tr_inv = biggest->tr.inverse(); + Transform3d cut_projection_tr = tr_inv * input2.text_tr; + + size_t itss_index = s_to_itss[biggest - &sources.front()]; + BoundingBoxf3 mesh_bb = bounding_box(itss[itss_index]); + for (const SurfaceVolumeData::ModelSource &s : sources) { + size_t itss_index = s_to_itss[&s - &sources.front()]; + if (itss_index == std::numeric_limits::max()) continue; + if (&s == biggest) + continue; + + Transform3d tr = s.tr * tr_inv; + bool fix_reflected = true; + indexed_triangle_set &its = itss[itss_index]; + its_transform(its, tr, fix_reflected); + BoundingBoxf3 bb = bounding_box(its); + mesh_bb.merge(bb); + } + + // tr_inv = transformation of mesh inverted + Transform3d emboss_tr = cut_projection_tr.inverse(); + BoundingBoxf3 mesh_bb_tr = mesh_bb.transformed(emboss_tr); + std::pair z_range{mesh_bb_tr.min.z(), mesh_bb_tr.max.z()}; + OrthoProject cut_projection = create_projection_for_cut(cut_projection_tr, shape_scale, z_range); + float projection_ratio = (-z_range.first + safe_extension) / (z_range.second - z_range.first + 2 * safe_extension); + + bool is_text_reflected = Slic3r::has_reflection(input2.text_tr); + if (is_text_reflected) { + // revert order of points in expolygons + // CW --> CCW + for (ExPolygon &shape : shapes) { + shape.contour.reverse(); + for (Slic3r::Polygon &hole : shape.holes) + hole.reverse(); + } + } + + // Use CGAL to cut surface from triangle mesh + SurfaceCut cut = cut_surface(shapes, itss, cut_projection, projection_ratio); + + if (is_text_reflected) { + for (SurfaceCut::Contour &c : cut.contours) + std::reverse(c.begin(), c.end()); + for (Vec3i &t : cut.indices) + std::swap(t[0], t[1]); + } + + if (cut.empty()) throw JobException(_u8L("There is no valid surface for text projection.").c_str()); + if (was_canceled()) return {}; + + // !! Projection needs to transform cut + OrthoProject3d projection = create_emboss_projection(input2.is_outside, fp.emboss, emboss_tr, cut); + indexed_triangle_set new_its = cut2model(cut, projection); + assert(!new_its.empty()); + if (was_canceled()) return {}; + return TriangleMesh(std::move(new_its)); +} + +bool priv::process(std::exception_ptr &eptr) { + if (!eptr) return false; + try { + std::rethrow_exception(eptr); + } catch (priv::JobException &e) { + create_message(e.what()); + eptr = nullptr; + } + return true; +} + +bool priv::finalize(bool canceled, std::exception_ptr &eptr, const DataBase &input) +{ + // doesn't care about exception when process was canceled by user + if (canceled || input.cancel->load()) { + eptr = nullptr; + return false; + } + return !process(eptr); +} + +void priv::create_message(const std::string &message) { + show_error(nullptr, message.c_str()); +} diff --git a/src/slic3r/GUI/Jobs/EmbossJob.hpp b/src/slic3r/GUI/Jobs/EmbossJob.hpp new file mode 100644 index 00000000000..d4b32cf616d --- /dev/null +++ b/src/slic3r/GUI/Jobs/EmbossJob.hpp @@ -0,0 +1,236 @@ +#ifndef slic3r_EmbossJob_hpp_ +#define slic3r_EmbossJob_hpp_ + +#include +#include +#include +#include +#include "slic3r/Utils/RaycastManager.hpp" +#include "slic3r/GUI/Camera.hpp" +#include "Job.hpp" + +namespace Slic3r { +class ModelVolume; +class TriangleMesh; +} + +namespace Slic3r::GUI::Emboss { + +/// +/// Base data holder for embossing +/// +struct DataBase +{ + // Keep pointer on Data of font (glyph shapes) + Slic3r::Emboss::FontFileWithCache font_file; + // font item is not used for create object + TextConfiguration text_configuration; + // new volume name created from text + std::string volume_name; + + // flag that job is canceled + // for time after process. + std::shared_ptr> cancel; +}; + +/// +/// Hold neccessary data to create ModelVolume in job +/// Volume is created on the surface of existing volume in object. +/// NOTE: EmbossDataBase::font_file doesn't have to be valid !!! +/// +struct DataCreateVolume : public DataBase +{ + // define embossed volume type + ModelVolumeType volume_type; + + // parent ModelObject index where to create volume + ObjectID object_id; + + // new created volume transformation + Transform3d trmat; +}; + +/// +/// Create new TextVolume on the surface of ModelObject +/// Should not be stopped +/// NOTE: EmbossDataBase::font_file doesn't have to be valid !!! +/// +class CreateVolumeJob : public Job +{ + DataCreateVolume m_input; + TriangleMesh m_result; + +public: + CreateVolumeJob(DataCreateVolume&& input); + void process(Ctl &ctl) override; + void finalize(bool canceled, std::exception_ptr &eptr) override; +}; + +/// +/// Hold neccessary data to create ModelObject in job +/// Object is placed on bed under screen coor +/// OR to center of scene when it is out of bed shape +/// +struct DataCreateObject : public DataBase +{ + // define position on screen where to create object + Vec2d screen_coor; + + // projection property + Camera camera; + + // shape of bed in case of create volume on bed + std::vector bed_shape; +}; + +/// +/// Create new TextObject on the platter +/// Should not be stopped +/// +class CreateObjectJob : public Job +{ + DataCreateObject m_input; + TriangleMesh m_result; + Transform3d m_transformation; +public: + CreateObjectJob(DataCreateObject&& input); + void process(Ctl &ctl) override; + void finalize(bool canceled, std::exception_ptr &eptr) override; +}; + +/// +/// Hold neccessary data to update embossed text object in job +/// +struct DataUpdate : public DataBase +{ + // unique identifier of volume to change + ObjectID volume_id; +}; + +/// +/// Update text shape in existing text volume +/// Predict that there is only one runnig(not canceled) instance of it +/// +class UpdateJob : public Job +{ + DataUpdate m_input; + TriangleMesh m_result; + +public: + // move params to private variable + UpdateJob(DataUpdate &&input); + + /// + /// Create new embossed volume by m_input data and store to m_result + /// + /// Control containing cancel flag + void process(Ctl &ctl) override; + + /// + /// Update volume - change object_id + /// + /// Was process canceled. + /// NOTE: Be carefull it doesn't care about + /// time between finished process and started finalize part. + /// unused + void finalize(bool canceled, std::exception_ptr &eptr) override; + + /// + /// Update text volume + /// + /// Volume to be updated + /// New Triangle mesh for volume + /// Parametric description of volume + /// Name of volume + static void update_volume(ModelVolume *volume, + TriangleMesh &&mesh, + const TextConfiguration &text_configuration, + std::string_view volume_name); +}; + +struct SurfaceVolumeData +{ + // Transformation of text volume inside of object + Transform3d text_tr; + + // Define projection move + // True (raised) .. move outside from surface + // False (engraved).. move into object + bool is_outside; + + struct ModelSource + { + // source volumes + std::shared_ptr mesh; + // Transformation of volume inside of object + Transform3d tr; + }; + using ModelSources = std::vector; + ModelSources sources; +}; + +/// +/// Hold neccessary data to create(cut) volume from surface object in job +/// +struct CreateSurfaceVolumeData : public DataBase, public SurfaceVolumeData{ + // define embossed volume type + ModelVolumeType volume_type; + + // parent ModelObject index where to create volume + ObjectID object_id; +}; + +/// +/// Cut surface from object and create cutted volume +/// Should not be stopped +/// +class CreateSurfaceVolumeJob : public Job +{ + CreateSurfaceVolumeData m_input; + TriangleMesh m_result; + +public: + CreateSurfaceVolumeJob(CreateSurfaceVolumeData &&input); + void process(Ctl &ctl) override; + void finalize(bool canceled, std::exception_ptr &eptr) override; +}; + +/// +/// Hold neccessary data to update embossed text object in job +/// +struct UpdateSurfaceVolumeData : public DataUpdate, public SurfaceVolumeData{}; + +/// +/// Copied triangles from object to be able create mesh for cut surface from +/// +/// Source object volumes for cut surface from +/// Source volume id +/// Source data for cut surface from +SurfaceVolumeData::ModelSources create_sources(const ModelVolumePtrs &volumes, std::optional text_volume_id = {}); + +/// +/// Copied triangles from object to be able create mesh for cut surface from +/// +/// Define text in object +/// Source data for cut surface from +SurfaceVolumeData::ModelSources create_volume_sources(const ModelVolume *text_volume); + + +/// +/// Update text volume to use surface from object +/// +class UpdateSurfaceVolumeJob : public Job +{ + UpdateSurfaceVolumeData m_input; + TriangleMesh m_result; + +public: + // move params to private variable + UpdateSurfaceVolumeJob(UpdateSurfaceVolumeData &&input); + void process(Ctl &ctl) override; + void finalize(bool canceled, std::exception_ptr &eptr) override; +}; + +} // namespace Slic3r::GUI + +#endif // slic3r_EmbossJob_hpp_ diff --git a/src/slic3r/GUI/Jobs/FillBedJob.cpp b/src/slic3r/GUI/Jobs/FillBedJob.cpp index c6c76078625..b8a579ed5d8 100644 --- a/src/slic3r/GUI/Jobs/FillBedJob.cpp +++ b/src/slic3r/GUI/Jobs/FillBedJob.cpp @@ -3,6 +3,7 @@ #include "libslic3r/Model.hpp" #include "libslic3r/ClipperUtils.hpp" +#include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI_ObjectList.hpp" @@ -17,6 +18,7 @@ void FillBedJob::prepare() m_selected.clear(); m_unselected.clear(); m_bedpts.clear(); + m_min_bed_inset = 0.; m_object_idx = m_plater->get_selected_object_idx(); if (m_object_idx == -1) @@ -28,7 +30,7 @@ void FillBedJob::prepare() m_selected.reserve(model_object->instances.size()); for (ModelInstance *inst : model_object->instances) if (inst->printable) { - ArrangePolygon ap = get_arrange_poly(PtrWrapper{inst}, m_plater); + ArrangePolygon ap = get_arrange_poly(inst, m_plater); // Existing objects need to be included in the result. Only // the needed amount of object will be added, no more. ++ap.priority; @@ -100,23 +102,48 @@ void FillBedJob::prepare() for (auto &p : m_unselected) if (p.bed_idx > 0) p.translation(X) -= p.bed_idx * stride; + + coord_t min_offset = 0; + for (auto &ap : m_selected) { + min_offset = std::max(ap.inflation, min_offset); + } + + if (m_plater->printer_technology() == ptSLA) { + // Apply the max offset for all the objects + for (auto &ap : m_selected) { + ap.inflation = min_offset; + } + } else { // it's fff, brims only need to be minded from bed edges + for (auto &ap : m_selected) { + ap.inflation = 0; + } + m_min_bed_inset = min_offset; + } } -void FillBedJob::process() +void FillBedJob::process(Ctl &ctl) { + auto statustxt = _u8L("Filling bed"); + arrangement::ArrangeParams params; + ctl.call_on_main_thread([this, ¶ms] { + prepare(); + params = get_arrange_params(m_plater); + coord_t min_inset = get_skirt_offset(m_plater) + m_min_bed_inset; + params.min_bed_distance = std::max(params.min_bed_distance, min_inset); + }).wait(); + ctl.update_status(0, statustxt); + if (m_object_idx == -1 || m_selected.empty()) return; - arrangement::ArrangeParams params = get_arrange_params(m_plater); - bool do_stop = false; - params.stopcondition = [this, &do_stop]() { - return was_canceled() || do_stop; + params.stopcondition = [&ctl, &do_stop]() { + return ctl.was_canceled() || do_stop; }; - params.progressind = [this](unsigned st) { + params.progressind = [this, &ctl, &statustxt](unsigned st) { if (st > 0) - update_status(int(m_status_range - st), _(L("Filling bed"))); + ctl.update_status(int(m_status_range - st) * 100 / status_range(), statustxt); }; params.on_packed = [&do_stop] (const ArrangePolygon &ap) { @@ -126,15 +153,18 @@ void FillBedJob::process() arrangement::arrange(m_selected, m_unselected, m_bedpts, params); // finalize just here. - update_status(m_status_range, was_canceled() ? - _(L("Bed filling canceled.")) : - _(L("Bed filling done."))); + ctl.update_status(100, ctl.was_canceled() ? + _u8L("Bed filling canceled.") : + _u8L("Bed filling done.")); } -void FillBedJob::finalize() +FillBedJob::FillBedJob() : m_plater{wxGetApp().plater()} {} + +void FillBedJob::finalize(bool canceled, std::exception_ptr &eptr) { // Ignore the arrange result if aborted. - if (was_canceled()) return; + if (canceled || eptr) + return; if (m_object_idx == -1) return; @@ -163,8 +193,6 @@ void FillBedJob::finalize() m_plater->sidebar() .obj_list()->increase_object_instances(m_object_idx, size_t(added_cnt)); } - - Job::finalize(); } }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Jobs/FillBedJob.hpp b/src/slic3r/GUI/Jobs/FillBedJob.hpp index bf407656d17..b953e0e981b 100644 --- a/src/slic3r/GUI/Jobs/FillBedJob.hpp +++ b/src/slic3r/GUI/Jobs/FillBedJob.hpp @@ -7,36 +7,34 @@ namespace Slic3r { namespace GUI { class Plater; -class FillBedJob : public PlaterJob +class FillBedJob : public Job { - int m_object_idx = -1; + int m_object_idx = -1; using ArrangePolygon = arrangement::ArrangePolygon; using ArrangePolygons = arrangement::ArrangePolygons; ArrangePolygons m_selected; ArrangePolygons m_unselected; + coord_t m_min_bed_inset = 0.; Points m_bedpts; int m_status_range = 0; - -protected: - - void prepare() override; - void process() override; + Plater *m_plater; public: - FillBedJob(std::shared_ptr pri, Plater *plater) - : PlaterJob{std::move(pri), plater} - {} + void prepare(); + void process(Ctl &ctl) override; + + FillBedJob(); - int status_range() const override + int status_range() const /*override*/ { return m_status_range; } - void finalize() override; + void finalize(bool canceled, std::exception_ptr &e) override; }; }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Jobs/Job.cpp b/src/slic3r/GUI/Jobs/Job.cpp deleted file mode 100644 index 9d0d4bc80c3..00000000000 --- a/src/slic3r/GUI/Jobs/Job.cpp +++ /dev/null @@ -1,158 +0,0 @@ -#include -#include - -#include "Job.hpp" -#include -#include - -namespace Slic3r { - -void GUI::Job::run(std::exception_ptr &eptr) -{ - m_running.store(true); - try { - process(); - } catch (...) { - eptr = std::current_exception(); - } - - m_running.store(false); - - // ensure to call the last status to finalize the job - update_status(status_range(), ""); -} - -void GUI::Job::update_status(int st, const wxString &msg) -{ - auto evt = new wxThreadEvent(wxEVT_THREAD, m_thread_evt_id); - evt->SetInt(st); - evt->SetString(msg); - wxQueueEvent(this, evt); -} - -GUI::Job::Job(std::shared_ptr pri) - : m_progress(std::move(pri)) -{ - m_thread_evt_id = wxNewId(); - - Bind(wxEVT_THREAD, [this](const wxThreadEvent &evt) { - if (m_finalizing) return; - - auto msg = evt.GetString(); - if (!msg.empty() && !m_worker_error) - m_progress->set_status_text(msg.ToUTF8().data()); - - if (m_finalized) return; - - m_progress->set_progress(evt.GetInt()); - if (evt.GetInt() == status_range() || m_worker_error) { - // set back the original range and cancel callback - m_progress->set_range(m_range); - // Make sure progress indicators get the last value of their range - // to make sure they close, fade out, whathever - m_progress->set_progress(m_range); - m_progress->set_cancel_callback(); - wxEndBusyCursor(); - - if (m_worker_error) { - m_finalized = true; - m_progress->set_status_text(""); - m_progress->set_progress(m_range); - on_exception(m_worker_error); - } - else { - // This is an RAII solution to remember that finalization is - // running. The run method calls update_status(status_range(), "") - // at the end, which queues up a call to this handler in all cases. - // If process also calls update_status with maxed out status arg - // it will call this handler twice. It is not a problem unless - // yield is called inside the finilize() method, which would - // jump out of finalize and call this handler again. - struct Finalizing { - bool &flag; - Finalizing (bool &f): flag(f) { flag = true; } - ~Finalizing() { flag = false; } - } fin(m_finalizing); - - finalize(); - } - - // dont do finalization again for the same process - m_finalized = true; - } - }, m_thread_evt_id); -} - -void GUI::Job::start() -{ // Start the job. No effect if the job is already running - if (!m_running.load()) { - prepare(); - - // Save the current status indicatior range and push the new one - m_range = m_progress->get_range(); - m_progress->set_range(status_range()); - - // init cancellation flag and set the cancel callback - m_canceled.store(false); - m_progress->set_cancel_callback( - [this]() { m_canceled.store(true); }); - - m_finalized = false; - m_finalizing = false; - - // Changing cursor to busy - wxBeginBusyCursor(); - - try { // Execute the job - m_worker_error = nullptr; - m_thread = create_thread([this] { this->run(m_worker_error); }); - } catch (std::exception &) { - update_status(status_range(), - _(L("ERROR: not enough resources to " - "execute a new job."))); - } - - // The state changes will be undone when the process hits the - // last status value, in the status update handler (see ctor) - } -} - -bool GUI::Job::join(int timeout_ms) -{ - if (!m_thread.joinable()) return true; - - if (timeout_ms <= 0) - m_thread.join(); - else if (!m_thread.try_join_for(boost::chrono::milliseconds(timeout_ms))) - return false; - - return true; -} - -void GUI::ExclusiveJobGroup::start(size_t jid) { - assert(jid < m_jobs.size()); - stop_all(); - m_jobs[jid]->start(); -} - -void GUI::ExclusiveJobGroup::join_all(int wait_ms) -{ - std::vector aborted(m_jobs.size(), false); - - for (size_t jid = 0; jid < m_jobs.size(); ++jid) - aborted[jid] = m_jobs[jid]->join(wait_ms); - - if (!std::all_of(aborted.begin(), aborted.end(), [](bool t) { return t; })) - BOOST_LOG_TRIVIAL(error) << "Could not abort a job!"; -} - -bool GUI::ExclusiveJobGroup::is_any_running() const -{ - return std::any_of(m_jobs.begin(), m_jobs.end(), - [](const std::unique_ptr &j) { - return j->is_running(); - }); -} - -} - diff --git a/src/slic3r/GUI/Jobs/Job.hpp b/src/slic3r/GUI/Jobs/Job.hpp index 8243ce94300..824c0b8303d 100644 --- a/src/slic3r/GUI/Jobs/Job.hpp +++ b/src/slic3r/GUI/Jobs/Job.hpp @@ -3,119 +3,53 @@ #include #include +#include #include "libslic3r/libslic3r.h" - -#include - #include "ProgressIndicator.hpp" -#include +namespace Slic3r { namespace GUI { -#include +// A class representing a job that is to be run in the background, not blocking +// the main thread. Running it is up to a Worker object (see Worker interface) +class Job { +public: -namespace Slic3r { namespace GUI { + // A controller interface that informs the job about cancellation and + // makes it possible for the job to advertise its status. + class Ctl { + public: + virtual ~Ctl() = default; -// A class to handle UI jobs like arranging and optimizing rotation. -// These are not instant jobs, the user has to be informed about their -// state in the status progress indicator. On the other hand they are -// separated from the background slicing process. Ideally, these jobs should -// run when the background process is not running. -// -// TODO: A mechanism would be useful for blocking the plater interactions: -// objects would be frozen for the user. In case of arrange, an animation -// could be shown, or with the optimize orientations, partial results -// could be displayed. -class Job : public wxEvtHandler -{ - int m_range = 100; - int m_thread_evt_id = wxID_ANY; - boost::thread m_thread; - std::atomic m_running{false}, m_canceled{false}; - bool m_finalized = false, m_finalizing = false; - std::shared_ptr m_progress; - std::exception_ptr m_worker_error = nullptr; - - void run(std::exception_ptr &); - -protected: - // status range for a particular job - virtual int status_range() const { return 100; } - - // status update, to be used from the work thread (process() method) - void update_status(int st, const wxString &msg = ""); + // status update, to be used from the work thread (process() method) + virtual void update_status(int st, const std::string &msg = "") = 0; - bool was_canceled() const { return m_canceled.load(); } + // Returns true if the job was asked to cancel itself. + virtual bool was_canceled() const = 0; - // Launched just before start(), a job can use it to prepare internals - virtual void prepare() {} + // Execute a functor on the main thread. Note that the exact time of + // execution is hard to determine. This can be used to make modifications + // on the UI, like displaying some intermediate results or modify the + // cursor. + // This function returns a std::future object which enables the + // caller to optionally wait for the main thread to finish the function call. + virtual std::future call_on_main_thread(std::function fn) = 0; + }; - // The method where the actual work of the job should be defined. - virtual void process() = 0; - - // Launched when the job is finished. It refreshes the 3Dscene by def. - virtual void finalize() { m_finalized = true; } + virtual ~Job() = default; - // Exceptions occuring in process() are redirected from the worker thread - // into the main (UI) thread. This method is called from the main thread and - // can be overriden to handle these exceptions. - virtual void on_exception(const std::exception_ptr &eptr) - { - if (eptr) std::rethrow_exception(eptr); - } - -public: - Job(std::shared_ptr pri); - - bool is_finalized() const { return m_finalized; } - - Job(const Job &) = delete; - Job(Job &&) = delete; - Job &operator=(const Job &) = delete; - Job &operator=(Job &&) = delete; - - void start(); - - // To wait for the running job and join the threads. False is - // returned if the timeout has been reached and the job is still - // running. Call cancel() before this fn if you want to explicitly - // end the job. - bool join(int timeout_ms = 0); - - bool is_running() const { return m_running.load(); } - void cancel() { m_canceled.store(true); } -}; + // The method where the actual work of the job should be defined. This is + // run on the worker thread. + virtual void process(Ctl &ctl) = 0; -// Jobs defined inside the group class will be managed so that only one can -// run at a time. Also, the background process will be stopped if a job is -// started. -class ExclusiveJobGroup -{ - static const int ABORT_WAIT_MAX_MS = 10000; - - std::vector> m_jobs; - -protected: - virtual void before_start() {} - -public: - virtual ~ExclusiveJobGroup() = default; - - size_t add_job(std::unique_ptr &&job) - { - m_jobs.emplace_back(std::move(job)); - return m_jobs.size() - 1; - } - - void start(size_t jid); - - void cancel_all() { for (auto& j : m_jobs) j->cancel(); } - - void join_all(int wait_ms = 0); - - void stop_all() { cancel_all(); join_all(ABORT_WAIT_MAX_MS); } - - bool is_any_running() const; + // Launched when the job is finished on the UI thread. + // If the job was cancelled, the first parameter will have a true value. + // Exceptions occuring in process() are redirected from the worker thread + // into the main (UI) thread. This method receives the exception and can + // handle it properly. Assign nullptr to this second argument before + // function return to prevent further action. Leaving it with a non-null + // value will result in rethrowing by the worker. + virtual void finalize(bool /*canceled*/, std::exception_ptr &) {} }; }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Jobs/NotificationProgressIndicator.cpp b/src/slic3r/GUI/Jobs/NotificationProgressIndicator.cpp index cb71705687a..f398f733391 100644 --- a/src/slic3r/GUI/Jobs/NotificationProgressIndicator.cpp +++ b/src/slic3r/GUI/Jobs/NotificationProgressIndicator.cpp @@ -12,11 +12,15 @@ void NotificationProgressIndicator::set_range(int range) void NotificationProgressIndicator::set_cancel_callback(CancelFn fn) { - m_nm->progress_indicator_set_cancel_callback(std::move(fn)); + m_cancelfn = std::move(fn); + m_nm->progress_indicator_set_cancel_callback(m_cancelfn); } void NotificationProgressIndicator::set_progress(int pr) { + if (!pr) + set_cancel_callback(m_cancelfn); + m_nm->progress_indicator_set_progress(pr); } diff --git a/src/slic3r/GUI/Jobs/NotificationProgressIndicator.hpp b/src/slic3r/GUI/Jobs/NotificationProgressIndicator.hpp index 6b03af69df0..b31cb7f7cdf 100644 --- a/src/slic3r/GUI/Jobs/NotificationProgressIndicator.hpp +++ b/src/slic3r/GUI/Jobs/NotificationProgressIndicator.hpp @@ -9,7 +9,7 @@ class NotificationManager; class NotificationProgressIndicator: public ProgressIndicator { NotificationManager *m_nm = nullptr; - + CancelFn m_cancelfn; public: explicit NotificationProgressIndicator(NotificationManager *nm); diff --git a/src/slic3r/GUI/Jobs/PlaterJob.cpp b/src/slic3r/GUI/Jobs/PlaterJob.cpp deleted file mode 100644 index 4af205d41b4..00000000000 --- a/src/slic3r/GUI/Jobs/PlaterJob.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "PlaterJob.hpp" -#include "slic3r/GUI/GUI.hpp" -#include "slic3r/GUI/Plater.hpp" - -namespace Slic3r { namespace GUI { - -void PlaterJob::on_exception(const std::exception_ptr &eptr) -{ - try { - if (eptr) - std::rethrow_exception(eptr); - } catch (std::exception &e) { - show_error(m_plater, _(L("An unexpected error occured")) + ": "+ e.what()); - } -} - -}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Jobs/PlaterJob.hpp b/src/slic3r/GUI/Jobs/PlaterJob.hpp deleted file mode 100644 index fcf0a54b809..00000000000 --- a/src/slic3r/GUI/Jobs/PlaterJob.hpp +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef PLATERJOB_HPP -#define PLATERJOB_HPP - -#include "Job.hpp" - -namespace Slic3r { namespace GUI { - -class Plater; - -class PlaterJob : public Job { -protected: - Plater *m_plater; - - void on_exception(const std::exception_ptr &) override; - -public: - - PlaterJob(std::shared_ptr pri, Plater *plater): - Job{std::move(pri)}, m_plater{plater} {} -}; - -}} // namespace Slic3r::GUI - -#endif // PLATERJOB_HPP diff --git a/src/slic3r/GUI/Jobs/PlaterWorker.hpp b/src/slic3r/GUI/Jobs/PlaterWorker.hpp new file mode 100644 index 00000000000..a3559869a08 --- /dev/null +++ b/src/slic3r/GUI/Jobs/PlaterWorker.hpp @@ -0,0 +1,146 @@ +#ifndef PLATERWORKER_HPP +#define PLATERWORKER_HPP + +#include +#include + +#include "Worker.hpp" +#include "BusyCursorJob.hpp" + +#include "slic3r/GUI/GUI.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/I18N.hpp" +#include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/GLCanvas3D.hpp" + +namespace Slic3r { namespace GUI { + +class Plater; + +template +class PlaterWorker: public Worker { + WorkerSubclass m_w; + Plater *m_plater; + + class PlaterJob : public Job { + std::unique_ptr m_job; + Plater *m_plater; + long long m_process_duration; // [ms] + + public: + void process(Ctl &c) override + { + // Ensure that wxWidgets processing wakes up to handle outgoing + // messages in plater's wxIdle handler. Otherwise it might happen + // that the message will only be processed when an event like mouse + // move comes along which might be too late. + struct WakeUpCtl: Ctl { + Ctl &ctl; + WakeUpCtl(Ctl &c) : ctl{c} {} + + void update_status(int st, const std::string &msg = "") override + { + ctl.update_status(st, msg); + wxWakeUpIdle(); + } + + bool was_canceled() const override { return ctl.was_canceled(); } + + std::future call_on_main_thread(std::function fn) override + { + auto ftr = ctl.call_on_main_thread(std::move(fn)); + wxWakeUpIdle(); + + return ftr; + } + + } wctl{c}; + + CursorSetterRAII busycursor{wctl}; + + using namespace std::chrono; + steady_clock::time_point process_start = steady_clock::now(); + m_job->process(wctl); + steady_clock::time_point process_end = steady_clock::now(); + m_process_duration = duration_cast(process_end - process_start).count(); + } + + void finalize(bool canceled, std::exception_ptr &eptr) override + { + using namespace std::chrono; + steady_clock::time_point finalize_start = steady_clock::now(); + m_job->finalize(canceled, eptr); + steady_clock::time_point finalize_end = steady_clock::now(); + long long finalize_duration = duration_cast(finalize_end - finalize_start).count(); + + BOOST_LOG_TRIVIAL(info) + << std::fixed // do not use scientific notations + << "Job '" << typeid(*m_job).name() << "' " + << "spend " << m_process_duration + finalize_duration << "ms " + << "(process " << m_process_duration << "ms + finalize " << finalize_duration << "ms)"; + + if (eptr) try { + std::rethrow_exception(eptr); + } catch (std::exception &e) { + show_error(m_plater, _L("An unexpected error occured: ") + e.what()); + eptr = nullptr; + } + } + + PlaterJob(Plater *p, std::unique_ptr j) + : m_job{std::move(j)}, m_plater{p} + { + // TODO: decide if disabling slice button during UI job is what we + // want. + // if (m_plater) + // m_plater->sidebar().enable_buttons(false); + } + + ~PlaterJob() override + { + // TODO: decide if disabling slice button during UI job is what we want. + + // Reload scene ensures that the slice button gets properly + // enabled or disabled after the job finishes, depending on the + // state of slicing. This might be an overkill but works for now. + // if (m_plater) + // m_plater->canvas3D()->reload_scene(false); + } + }; + +public: + + template + PlaterWorker(Plater *plater, WorkerArgs &&...args) + : m_w{std::forward(args)...}, m_plater{plater} + { + // Ensure that messages from the worker thread to the UI thread are + // processed continuously. + plater->Bind(wxEVT_IDLE, [this](wxIdleEvent &) { + process_events(); + }); + } + + // Always package the job argument into a PlaterJob + bool push(std::unique_ptr job) override + { + return m_w.push(std::make_unique(m_plater, std::move(job))); + } + + bool is_idle() const override { return m_w.is_idle(); } + void cancel() override { m_w.cancel(); } + void cancel_all() override { m_w.cancel_all(); } + void process_events() override { m_w.process_events(); } + bool wait_for_current_job(unsigned timeout_ms = 0) override + { + return m_w.wait_for_current_job(timeout_ms); + } + bool wait_for_idle(unsigned timeout_ms = 0) override + { + return m_w.wait_for_idle(timeout_ms); + } +}; + +}} // namespace Slic3r::GUI + +#endif // PLATERJOB_HPP diff --git a/src/slic3r/GUI/Jobs/RotoptimizeJob.cpp b/src/slic3r/GUI/Jobs/RotoptimizeJob.cpp index 340be5d11f3..d33bee1a8dd 100644 --- a/src/slic3r/GUI/Jobs/RotoptimizeJob.cpp +++ b/src/slic3r/GUI/Jobs/RotoptimizeJob.cpp @@ -12,6 +12,8 @@ #include "slic3r/GUI/GUI_App.hpp" #include "libslic3r/AppConfig.hpp" +#include + namespace Slic3r { namespace GUI { void RotoptimizeJob::prepare() @@ -45,20 +47,23 @@ void RotoptimizeJob::prepare() } } -void RotoptimizeJob::process() +void RotoptimizeJob::process(Ctl &ctl) { int prev_status = 0; + auto statustxt = _u8L("Searching for optimal orientation"); + ctl.update_status(0, statustxt); + auto params = sla::RotOptimizeParams{} .accuracy(m_accuracy) .print_config(&m_default_print_cfg) - .statucb([this, &prev_status](int s) + .statucb([this, &prev_status, &ctl, &statustxt](int s) { if (s > 0 && s < 100) - update_status(prev_status + s / m_selected_object_ids.size(), - _(L("Searching for optimal orientation"))); + ctl.update_status(prev_status + s / m_selected_object_ids.size(), + statustxt); - return !was_canceled(); + return !ctl.was_canceled(); }); @@ -71,16 +76,20 @@ void RotoptimizeJob::process() prev_status += 100 / m_selected_object_ids.size(); - if (was_canceled()) break; + if (ctl.was_canceled()) break; } - update_status(100, was_canceled() ? _(L("Orientation search canceled.")) : - _(L("Orientation found."))); + ctl.update_status(100, ctl.was_canceled() ? + _u8L("Orientation search canceled.") : + _u8L("Orientation found.")); } -void RotoptimizeJob::finalize() +RotoptimizeJob::RotoptimizeJob() : m_plater{wxGetApp().plater()} { prepare(); } + +void RotoptimizeJob::finalize(bool canceled, std::exception_ptr &eptr) { - if (was_canceled()) return; + if (canceled || eptr) + return; for (const ObjRot &objrot : m_selected_object_ids) { ModelObject *o = m_plater->model().objects[size_t(objrot.idx)]; @@ -109,14 +118,20 @@ void RotoptimizeJob::finalize() // Correct the z offset of the object which was corrupted be // the rotation o->ensure_on_bed(); - -// m_plater->find_new_position(o->instances); } - if (!was_canceled()) + if (!canceled) m_plater->update(); - - Job::finalize(); +} + +std::string RotoptimizeJob::get_method_name(size_t i) +{ + return into_u8(_(Methods[i].name)); +} + +std::string RotoptimizeJob::get_method_description(size_t i) +{ + return into_u8(_(Methods[i].descr)); } }} diff --git a/src/slic3r/GUI/Jobs/RotoptimizeJob.hpp b/src/slic3r/GUI/Jobs/RotoptimizeJob.hpp index cdb367f23a7..02aafb551ee 100644 --- a/src/slic3r/GUI/Jobs/RotoptimizeJob.hpp +++ b/src/slic3r/GUI/Jobs/RotoptimizeJob.hpp @@ -1,16 +1,17 @@ #ifndef ROTOPTIMIZEJOB_HPP #define ROTOPTIMIZEJOB_HPP -#include "PlaterJob.hpp" +#include "Job.hpp" #include "libslic3r/SLA/Rotfinder.hpp" #include "libslic3r/PrintConfig.hpp" +#include "slic3r/GUI/I18N.hpp" -namespace Slic3r { +namespace Slic3r { namespace GUI { -namespace GUI { +class Plater; -class RotoptimizeJob : public PlaterJob +class RotoptimizeJob : public Job { using FindFn = std::function; @@ -44,31 +45,22 @@ class RotoptimizeJob : public PlaterJob }; std::vector m_selected_object_ids; - -protected: - - void prepare() override; - void process() override; + Plater *m_plater; public: - RotoptimizeJob(std::shared_ptr pri, Plater *plater) - : PlaterJob{std::move(pri), plater} - {} + void prepare(); + void process(Ctl &ctl) override; + + RotoptimizeJob(); - void finalize() override; + void finalize(bool canceled, std::exception_ptr &) override; static constexpr size_t get_methods_count() { return std::size(Methods); } - static std::string get_method_name(size_t i) - { - return _utf8(Methods[i].name); - } + static std::string get_method_name(size_t i); - static std::string get_method_description(size_t i) - { - return _utf8(Methods[i].descr); - } + static std::string get_method_description(size_t i); }; }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Jobs/SLAImportDialog.hpp b/src/slic3r/GUI/Jobs/SLAImportDialog.hpp new file mode 100644 index 00000000000..fed84600c2c --- /dev/null +++ b/src/slic3r/GUI/Jobs/SLAImportDialog.hpp @@ -0,0 +1,177 @@ +#ifndef SLAIMPORTDIALOG_HPP +#define SLAIMPORTDIALOG_HPP + +#include "SLAImportJob.hpp" + +#include +#include +#include +#include +#include + +#include "libslic3r/AppConfig.hpp" +#include "libslic3r/Format/SLAArchiveReader.hpp" + +#include "slic3r/GUI/I18N.hpp" + +#include "slic3r/GUI/GUI.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Plater.hpp" + +#include + +//#include "libslic3r/Model.hpp" +//#include "libslic3r/PresetBundle.hpp" + +namespace Slic3r { namespace GUI { + +std::string get_readers_wildcard() +{ + std::string ret; + + for (const char *archtype : SLAArchiveReader::registered_archives()) { + ret += into_u8(_(SLAArchiveReader::get_description(archtype))); + ret += " ("; + auto extensions = SLAArchiveReader::get_extensions(archtype); + for (const char * ext : extensions) { + ret += "*."; + ret += ext; + ret += ", "; + } + // remove last ", " + if (!extensions.empty()) { + ret.pop_back(); + ret.pop_back(); + } + + ret += ")|"; + + for (std::string ext : extensions) { + boost::algorithm::to_lower(ext); + ret += "*."; + ret += ext; + ret += ";"; + + boost::algorithm::to_upper(ext); + ret += "*."; + ret += ext; + ret += ";"; + } + + // remove last ';' + if (!extensions.empty()) + ret.pop_back(); + + ret += "|"; + } + + if (ret.back() == '|') + ret.pop_back(); + + return ret; +} + +class SLAImportDialog: public wxDialog, public SLAImportJobView { + wxFilePickerCtrl *m_filepicker; + wxComboBox *m_import_dropdown, *m_quality_dropdown; + +public: + SLAImportDialog(Plater *plater) + : wxDialog{plater, wxID_ANY, "Import SLA archive"} + { + auto szvert = new wxBoxSizer{wxVERTICAL}; + auto szfilepck = new wxBoxSizer{wxHORIZONTAL}; + + m_filepicker = new wxFilePickerCtrl(this, wxID_ANY, + from_u8(wxGetApp().app_config->get_last_dir()), _(L("Choose SLA archive:")), + get_readers_wildcard(), + wxDefaultPosition, wxDefaultSize, wxFLP_DEFAULT_STYLE | wxFD_OPEN | wxFD_FILE_MUST_EXIST); + + szfilepck->Add(new wxStaticText(this, wxID_ANY, _L("Import file") + ": "), 0, wxALIGN_CENTER); + szfilepck->Add(m_filepicker, 1); + szvert->Add(szfilepck, 0, wxALL | wxEXPAND, 5); + + auto szchoices = new wxBoxSizer{wxHORIZONTAL}; + + static const std::vector inp_choices = { + _(L("Import model and profile")), + _(L("Import profile only")), + _(L("Import model only")) + }; + + m_import_dropdown = new wxComboBox( + this, wxID_ANY, inp_choices[0], wxDefaultPosition, wxDefaultSize, + inp_choices.size(), inp_choices.data(), wxCB_READONLY | wxCB_DROPDOWN); + + szchoices->Add(m_import_dropdown); + szchoices->AddStretchSpacer(1); + szchoices->Add(new wxStaticText(this, wxID_ANY, _L("Quality") + ": "), 0, wxALIGN_CENTER | wxALL, 5); + + static const std::vector qual_choices = { + _(L("Accurate")), + _(L("Balanced")), + _(L("Quick")) + }; + + m_quality_dropdown = new wxComboBox( + this, wxID_ANY, qual_choices[1], wxDefaultPosition, wxDefaultSize, + qual_choices.size(), qual_choices.data(), wxCB_READONLY | wxCB_DROPDOWN); + szchoices->Add(m_quality_dropdown, 1); + + m_import_dropdown->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &) { + if (get_selection() == Sel::profileOnly) + m_quality_dropdown->Disable(); + else m_quality_dropdown->Enable(); + }); + + szvert->Add(szchoices, 1, wxEXPAND | wxALL, 5); + auto szbtn = new wxBoxSizer(wxHORIZONTAL); + szbtn->Add(new wxButton{this, wxID_CANCEL}, 0, wxRIGHT, 5); + szbtn->Add(new wxButton{this, wxID_OK}); + szvert->Add(szbtn, 0, wxALIGN_RIGHT | wxALL, 5); + + SetSizerAndFit(szvert); + wxGetApp().UpdateDlgDarkUI(this); + } + + int ShowModal() override + { + CenterOnParent(); + return wxDialog::ShowModal(); + } + + Sel get_selection() const override + { + int sel = m_import_dropdown->GetSelection(); + return Sel(std::min(int(Sel::modelOnly), std::max(0, sel))); + } + + SLAImportQuality get_quality() const override + { + switch(m_quality_dropdown->GetSelection()) + { + case 2: return SLAImportQuality::Fast; + case 1: return SLAImportQuality::Balanced; + case 0: return SLAImportQuality::Accurate; + default: + return SLAImportQuality::Balanced; + } + } + + std::string get_path() const override + { + return m_filepicker->GetPath().ToUTF8().data(); + } + + std::string get_archive_format() const override + { + // TODO: the choosen format is inside the file dialog which is not + // accessible from the file picker object. The file picker could be + // changed to a custom file dialog. + return {}; + } +}; + +}} // namespace Slic3r::GUI + +#endif // SLAIMPORTDIALOG_HPP diff --git a/src/slic3r/GUI/Jobs/SLAImportJob.cpp b/src/slic3r/GUI/Jobs/SLAImportJob.cpp index 8377ddc73e8..0b3c4cb2859 100644 --- a/src/slic3r/GUI/Jobs/SLAImportJob.cpp +++ b/src/slic3r/GUI/Jobs/SLAImportJob.cpp @@ -1,9 +1,10 @@ #include "SLAImportJob.hpp" +#include "libslic3r/SLAPrint.hpp" #include "libslic3r/Format/SL1.hpp" +#include "libslic3r/Format/SLAArchiveReader.hpp" #include "slic3r/GUI/GUI.hpp" -#include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/GUI_ObjectList.hpp" #include "slic3r/GUI/NotificationManager.hpp" @@ -11,104 +12,10 @@ #include "libslic3r/Model.hpp" #include "libslic3r/PresetBundle.hpp" -#include -#include -#include #include -#include namespace Slic3r { namespace GUI { -enum class Sel { modelAndProfile, profileOnly, modelOnly}; - -class ImportDlg: public wxDialog { - wxFilePickerCtrl *m_filepicker; - wxComboBox *m_import_dropdown, *m_quality_dropdown; - -public: - ImportDlg(Plater *plater) - : wxDialog{plater, wxID_ANY, "Import SLA archive"} - { - auto szvert = new wxBoxSizer{wxVERTICAL}; - auto szfilepck = new wxBoxSizer{wxHORIZONTAL}; - - m_filepicker = new wxFilePickerCtrl(this, wxID_ANY, - from_u8(wxGetApp().app_config->get_last_dir()), _(L("Choose SLA archive:")), - "SL1 / SL1S archive files (*.sl1, *.sl1s, *.zip)|*.sl1;*.SL1;*.sl1s;*.SL1S;*.zip;*.ZIP", - wxDefaultPosition, wxDefaultSize, wxFLP_DEFAULT_STYLE | wxFD_OPEN | wxFD_FILE_MUST_EXIST); - - szfilepck->Add(new wxStaticText(this, wxID_ANY, _L("Import file") + ": "), 0, wxALIGN_CENTER); - szfilepck->Add(m_filepicker, 1); - szvert->Add(szfilepck, 0, wxALL | wxEXPAND, 5); - - auto szchoices = new wxBoxSizer{wxHORIZONTAL}; - - static const std::vector inp_choices = { - _(L("Import model and profile")), - _(L("Import profile only")), - _(L("Import model only")) - }; - - m_import_dropdown = new wxComboBox( - this, wxID_ANY, inp_choices[0], wxDefaultPosition, wxDefaultSize, - inp_choices.size(), inp_choices.data(), wxCB_READONLY | wxCB_DROPDOWN); - - szchoices->Add(m_import_dropdown); - szchoices->Add(new wxStaticText(this, wxID_ANY, _L("Quality") + ": "), 0, wxALIGN_CENTER | wxALL, 5); - - static const std::vector qual_choices = { - _(L("Accurate")), - _(L("Balanced")), - _(L("Quick")) - }; - - m_quality_dropdown = new wxComboBox( - this, wxID_ANY, qual_choices[0], wxDefaultPosition, wxDefaultSize, - qual_choices.size(), qual_choices.data(), wxCB_READONLY | wxCB_DROPDOWN); - szchoices->Add(m_quality_dropdown); - - m_import_dropdown->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &) { - if (get_selection() == Sel::profileOnly) - m_quality_dropdown->Disable(); - else m_quality_dropdown->Enable(); - }); - - szvert->Add(szchoices, 0, wxALL, 5); - szvert->AddStretchSpacer(1); - auto szbtn = new wxBoxSizer(wxHORIZONTAL); - szbtn->Add(new wxButton{this, wxID_CANCEL}); - szbtn->Add(new wxButton{this, wxID_OK}); - szvert->Add(szbtn, 0, wxALIGN_RIGHT | wxALL, 5); - - SetSizerAndFit(szvert); - } - - Sel get_selection() const - { - int sel = m_import_dropdown->GetSelection(); - return Sel(std::min(int(Sel::modelOnly), std::max(0, sel))); - } - - Vec2i get_marchsq_windowsize() const - { - enum { Accurate, Balanced, Fast}; - - switch(m_quality_dropdown->GetSelection()) - { - case Fast: return {8, 8}; - case Balanced: return {4, 4}; - default: - case Accurate: - return {2, 2}; - } - } - - wxString get_path() const - { - return m_filepicker->GetPath(); - } -}; - class SLAImportJob::priv { public: Plater *plater; @@ -118,59 +25,74 @@ class SLAImportJob::priv { indexed_triangle_set mesh; DynamicPrintConfig profile; wxString path; - Vec2i win = {2, 2}; + Quality quality = Quality::Balanced; std::string err; ConfigSubstitutions config_substitutions; - ImportDlg import_dlg; + const SLAImportJobView * import_dlg; - priv(Plater *plt) : plater{plt}, import_dlg{plt} {} + priv(Plater *plt, const SLAImportJobView *view) : plater{plt}, import_dlg{view} {} }; -SLAImportJob::SLAImportJob(std::shared_ptr pri, Plater *plater) - : PlaterJob{std::move(pri), plater}, p{std::make_unique(plater)} -{} +SLAImportJob::SLAImportJob(const SLAImportJobView *view) + : p{std::make_unique(wxGetApp().plater(), view)} +{ + prepare(); +} SLAImportJob::~SLAImportJob() = default; -void SLAImportJob::process() +void SLAImportJob::process(Ctl &ctl) { - auto progr = [this](int s) { + if (p->path.empty() || ! p->err.empty()) return; + + auto statustxt = _u8L("Importing SLA archive"); + ctl.update_status(0, statustxt); + + auto progr = [&ctl, &statustxt](int s) { if (s < 100) - update_status(int(s), _(L("Importing SLA archive"))); - return !was_canceled(); + ctl.update_status(int(s), statustxt); + return !ctl.was_canceled(); }; - if (p->path.empty() || ! p->err.empty()) return; - std::string path = p->path.ToUTF8().data(); + std::string format_id = p->import_dlg->get_archive_format(); + try { switch (p->sel) { case Sel::modelAndProfile: case Sel::modelOnly: - p->config_substitutions = import_sla_archive(path, p->win, p->mesh, p->profile, progr); + p->config_substitutions = import_sla_archive(path, + format_id, + p->mesh, + p->profile, + p->quality, progr); break; case Sel::profileOnly: - p->config_substitutions = import_sla_archive(path, p->profile); + p->config_substitutions = import_sla_archive(path, format_id, + p->profile); break; } } catch (MissingProfileError &) { p->err = _u8L("The SLA archive doesn't contain any presets. " - "Please activate some SLA printer preset first before importing that SLA archive."); - } catch (std::exception &ex) { + "Please activate some SLA printer preset first before " + "importing that SLA archive."); + } catch (ReaderUnimplementedError &) { + p->err = _u8L("Import is unavailable for this archive format."); + }catch (std::exception &ex) { p->err = ex.what(); } - update_status(100, was_canceled() ? _(L("Importing canceled.")) : - _(L("Importing done."))); + ctl.update_status(100, ctl.was_canceled() ? _u8L("Importing canceled.") : + _u8L("Importing done.")); } void SLAImportJob::reset() { p->sel = Sel::modelAndProfile; p->mesh = {}; - p->profile = m_plater->sla_print().full_print_config(); - p->win = {2, 2}; + p->profile = p->plater->sla_print().full_print_config(); + p->quality = SLAImportQuality::Balanced; p->path.Clear(); p->err = ""; } @@ -179,26 +101,24 @@ void SLAImportJob::prepare() { reset(); - if (p->import_dlg.ShowModal() == wxID_OK) { - auto path = p->import_dlg.get_path(); - auto nm = wxFileName(path); - p->path = !nm.Exists(wxFILE_EXISTS_REGULAR) ? "" : nm.GetFullPath(); - if (p->path.empty()) { - p->err = _u8L("The file does not exist."); - return; - } - p->sel = p->import_dlg.get_selection(); - p->win = p->import_dlg.get_marchsq_windowsize(); - p->config_substitutions.clear(); - } else { - p->path = ""; + auto path = p->import_dlg->get_path(); + auto nm = wxFileName(path); + p->path = !nm.Exists(wxFILE_EXISTS_REGULAR) ? "" : nm.GetFullPath(); + if (p->path.empty()) { + p->err = _u8L("The file does not exist."); + return; } + p->sel = p->import_dlg->get_selection(); + p->quality = p->import_dlg->get_quality(); + + p->config_substitutions.clear(); } -void SLAImportJob::finalize() +void SLAImportJob::finalize(bool canceled, std::exception_ptr &eptr) { // Ignore the arrange result if aborted. - if (was_canceled()) return; + if (canceled || eptr) + return; if (!p->err.empty()) { show_error(p->plater, p->err); @@ -206,16 +126,10 @@ void SLAImportJob::finalize() return; } - if (p->path.empty()) { - // This happens when the user cancels the import dialog. That is not - // an error to report, but we cannot continue either. - return; - } - std::string name = wxFileName(p->path).GetName().ToUTF8().data(); if (p->profile.empty()) { - m_plater->get_notification_manager()->push_notification( + p->plater->get_notification_manager()->push_notification( NotificationType::CustomNotification, NotificationManager::NotificationLevel::WarningNotificationLevel, _u8L("The imported SLA archive did not contain any presets. " @@ -224,7 +138,7 @@ void SLAImportJob::finalize() if (p->sel != Sel::modelOnly) { if (p->profile.empty()) - p->profile = m_plater->sla_print().full_print_config(); + p->profile = p->plater->sla_print().full_print_config(); const ModelObjectPtrs& objects = p->plater->model().objects; for (auto object : objects) @@ -241,14 +155,27 @@ void SLAImportJob::finalize() config.apply(SLAFullPrintConfig::defaults()); config += std::move(p->profile); - wxGetApp().preset_bundle->load_config_model(name, std::move(config)); - wxGetApp().load_current_presets(); + if (Preset::printer_technology(config) == ptSLA) { + wxGetApp().preset_bundle->load_config_model(name, std::move(config)); + p->plater->check_selected_presets_visibility(ptSLA); + wxGetApp().load_current_presets(); + } else { + p->plater->get_notification_manager()->push_notification( + NotificationType::CustomNotification, + NotificationManager::NotificationLevel::WarningNotificationLevel, + _u8L("The profile in the imported archive is corrupted and will not be loaded.")); + } } if (!p->mesh.empty()) { bool is_centered = false; p->plater->sidebar().obj_list()->load_mesh_object(TriangleMesh{std::move(p->mesh)}, name, is_centered); + } else if (p->sel == Sel::modelOnly || p->sel == Sel::modelAndProfile) { + p->plater->get_notification_manager()->push_notification( + NotificationType::CustomNotification, + NotificationManager::NotificationLevel::WarningNotificationLevel, + _u8L("No object could be retrieved from the archive. The slices might be corrupted or missing.")); } if (! p->config_substitutions.empty()) diff --git a/src/slic3r/GUI/Jobs/SLAImportJob.hpp b/src/slic3r/GUI/Jobs/SLAImportJob.hpp index c2ca10ef691..3a578855c1f 100644 --- a/src/slic3r/GUI/Jobs/SLAImportJob.hpp +++ b/src/slic3r/GUI/Jobs/SLAImportJob.hpp @@ -1,22 +1,39 @@ #ifndef SLAIMPORTJOB_HPP #define SLAIMPORTJOB_HPP -#include "PlaterJob.hpp" +#include "Job.hpp" + +#include "libslic3r/Format/SLAArchiveReader.hpp" namespace Slic3r { namespace GUI { -class SLAImportJob : public PlaterJob { +class SLAImportJobView { +public: + enum Sel { modelAndProfile, profileOnly, modelOnly}; + + virtual ~SLAImportJobView() = default; + + virtual Sel get_selection() const = 0; + virtual SLAImportQuality get_quality() const = 0; + virtual std::string get_path() const = 0; + virtual std::string get_archive_format() const { return ""; } +}; + +class Plater; + +class SLAImportJob : public Job { class priv; std::unique_ptr p; - -protected: - void prepare() override; - void process() override; - void finalize() override; + using Sel = SLAImportJobView::Sel; + using Quality = SLAImportQuality; public: - SLAImportJob(std::shared_ptr pri, Plater *plater); + void prepare(); + void process(Ctl &ctl) override; + void finalize(bool canceled, std::exception_ptr &) override; + + SLAImportJob(const SLAImportJobView *); ~SLAImportJob(); void reset(); diff --git a/src/slic3r/GUI/Jobs/ThreadSafeQueue.hpp b/src/slic3r/GUI/Jobs/ThreadSafeQueue.hpp new file mode 100644 index 00000000000..d400490137c --- /dev/null +++ b/src/slic3r/GUI/Jobs/ThreadSafeQueue.hpp @@ -0,0 +1,123 @@ +#ifndef THREADSAFEQUEUE_HPP +#define THREADSAFEQUEUE_HPP + +#include +#include +#include +#include +#include + +namespace Slic3r { namespace GUI { + +// Helper structure for overloads of ThreadSafeQueueSPSC::consume_one() +// to block if the queue is empty. +struct BlockingWait +{ + // Timeout to wait for the arrival of new element into the queue. + unsigned timeout_ms = 0; + + // An optional atomic flag to set true if an incoming element gets + // consumed. The flag will be atomically set to true when popping the + // front of the queue. + std::atomic *pop_flag = nullptr; +}; + +// A thread safe queue for one producer and one consumer. +template class Container = std::deque, + class... ContainerArgs> +class ThreadSafeQueueSPSC +{ + std::queue> m_queue; + mutable std::mutex m_mutex; + std::condition_variable m_cond_var; +public: + + // Consume one element, block if the queue is empty. + template bool consume_one(const BlockingWait &blkw, Fn &&fn) + { + static_assert(!std::is_reference_v, ""); + static_assert(std::is_default_constructible_v, ""); + static_assert(std::is_move_assignable_v || std::is_copy_assignable_v, ""); + + T el; + { + std::unique_lock lk{m_mutex}; + + auto pred = [this]{ return !m_queue.empty(); }; + if (blkw.timeout_ms > 0) { + auto timeout = std::chrono::milliseconds(blkw.timeout_ms); + if (!m_cond_var.wait_for(lk, timeout, pred)) + return false; + } + else + m_cond_var.wait(lk, pred); + + if constexpr (std::is_move_assignable_v) + el = std::move(m_queue.front()); + else + el = m_queue.front(); + + m_queue.pop(); + + if (blkw.pop_flag) + // The optional flag is set before the lock us unlocked. + blkw.pop_flag->store(true); + } + + fn(el); + return true; + } + + // Consume one element, return true if consumed, false if queue was empty. + template bool consume_one(Fn &&fn) + { + T el; + { + std::unique_lock lk{m_mutex}; + if (!m_queue.empty()) { + if constexpr (std::is_move_assignable_v) + el = std::move(m_queue.front()); + else + el = m_queue.front(); + + m_queue.pop(); + } else + return false; + } + + fn(el); + + return true; + } + + // Push element into the queue. + template void push(TArgs&&...el) + { + std::lock_guard lk{m_mutex}; + m_queue.emplace(std::forward(el)...); + m_cond_var.notify_one(); + } + + bool empty() const + { + std::lock_guard lk{m_mutex}; + return m_queue.empty(); + } + + size_t size() const + { + std::lock_guard lk{m_mutex}; + return m_queue.size(); + } + + void clear() + { + std::lock_guard lk{m_mutex}; + while (!m_queue.empty()) m_queue.pop(); + } +}; + +}} // namespace Slic3r::GUI + +#endif // THREADSAFEQUEUE_HPP diff --git a/src/slic3r/GUI/Jobs/UIThreadWorker.hpp b/src/slic3r/GUI/Jobs/UIThreadWorker.hpp new file mode 100644 index 00000000000..91213c23916 --- /dev/null +++ b/src/slic3r/GUI/Jobs/UIThreadWorker.hpp @@ -0,0 +1,133 @@ +#ifndef UITHREADWORKER_HPP +#define UITHREADWORKER_HPP + +#include +#include + +#include "Worker.hpp" +#include "ProgressIndicator.hpp" + +namespace Slic3r { namespace GUI { + +// Implementation of a worker which does not create any additional threads. +class UIThreadWorker : public Worker, private Job::Ctl { + std::queue, std::deque>> m_jobqueue; + std::shared_ptr m_progress; + bool m_running = false; + bool m_canceled = false; + + void process_front() + { + std::unique_ptr job; + + if (!m_jobqueue.empty()) { + job = std::move(m_jobqueue.front()); + m_jobqueue.pop(); + } + + if (job) { + std::exception_ptr eptr; + m_running = true; + + try { + job->process(*this); + } catch (...) { + eptr= std::current_exception(); + } + + job->finalize(m_canceled, eptr); + + // Unhandled exceptions are rethrown without mercy. + if (eptr) + std::rethrow_exception(eptr); + + m_running = false; + + m_canceled = false; + } + } + +protected: + // Implement Job::Ctl interface: + + void update_status(int st, const std::string &msg = "") override + { + if (m_progress) { + m_progress->set_progress(st); + m_progress->set_status_text(msg.c_str()); + } + } + + bool was_canceled() const override { return m_canceled; } + + std::future call_on_main_thread(std::function fn) override + { + std::future ftr = std::async(std::launch::deferred, [fn]{ fn(); }); + + // So, it seems that the destructor of std::future will not call the + // packaged function. The future needs to be accessed at least ones + // or waited upon. Calling wait() instead of get() will keep the + // returned future's state valid. + ftr.wait(); + + return ftr; + } + +public: + explicit UIThreadWorker(std::shared_ptr pri, + const std::string & /*name*/ = "") + : m_progress{pri} + { + if (m_progress) + m_progress->set_cancel_callback([this]() { cancel(); }); + } + + UIThreadWorker() = default; + + bool push(std::unique_ptr job) override + { + m_canceled = false; + + if (job) + m_jobqueue.push(std::move(job)); + + return bool(job); + } + + bool is_idle() const override { return !m_running && m_jobqueue.empty(); } + + void cancel() override { m_canceled = true; } + + void cancel_all() override + { + m_canceled = true; + process_front(); + + while (!m_jobqueue.empty()) + m_jobqueue.pop(); + } + + void process_events() override { + while (!m_jobqueue.empty()) + process_front(); + } + + bool wait_for_current_job(unsigned /*timeout_ms*/ = 0) override { + process_front(); + + return true; + } + + bool wait_for_idle(unsigned /*timeout_ms*/ = 0) override { + process_events(); + + return true; + } + + ProgressIndicator * get_pri() { return m_progress.get(); } + const ProgressIndicator * get_pri() const { return m_progress.get(); } +}; + +}} // namespace Slic3r::GUI + +#endif // UITHREADWORKER_HPP diff --git a/src/slic3r/GUI/Jobs/Worker.hpp b/src/slic3r/GUI/Jobs/Worker.hpp new file mode 100644 index 00000000000..0bc7bc08632 --- /dev/null +++ b/src/slic3r/GUI/Jobs/Worker.hpp @@ -0,0 +1,119 @@ +#ifndef PRUSALSICER_WORKER_HPP +#define PRUSALSICER_WORKER_HPP + +#include + +#include "Job.hpp" + +namespace Slic3r { namespace GUI { + +// An interface of a worker that runs jobs on a dedicated worker thread, one +// after the other. It is assumed that every method of this class is called +// from the same main thread. +class Worker { +public: + // Queue up a new job after the current one. This call does not block. + // Returns false if the job gets discarded. + virtual bool push(std::unique_ptr job) = 0; + + // Returns true if no job is running, the job queue is empty and no job + // message is left to be processed. This means that nothing is left to + // finalize or take care of in the main thread. + virtual bool is_idle() const = 0; + + // Ask the current job gracefully to cancel. This call is not blocking and + // the job may or may not cancel eventually, depending on its + // implementation. Note that it is not trivial to kill a thread forcefully + // and we don't need that. + virtual void cancel() = 0; + + // This method will delete the queued jobs and cancel the current one. + virtual void cancel_all() = 0; + + // Needs to be called continuously to process events (like status update + // or finalizing of jobs) in the main thread. This can be done e.g. in a + // wxIdle handler. + virtual void process_events() = 0; + + // Wait until the current job finishes. Timeout will only be considered + // if not zero. Returns false if timeout is reached but the job has not + // finished. + virtual bool wait_for_current_job(unsigned timeout_ms = 0) = 0; + + // Wait until the whole job queue finishes. Timeout will only be considered + // if not zero. Returns false only if timeout is reached but the worker has + // not reached the idle state. + virtual bool wait_for_idle(unsigned timeout_ms = 0) = 0; + + // The destructor shall properly close the worker thread. + virtual ~Worker() = default; +}; + +template constexpr bool IsProcessFn = std::is_invocable_v; +template constexpr bool IsFinishFn = std::is_invocable_v; + +// Helper function to use the worker with arbitrary functors. +template>, + class = std::enable_if_t> > +bool queue_job(Worker &w, ProcessFn fn, FinishFn finishfn) +{ + struct LambdaJob: Job { + ProcessFn fn; + FinishFn finishfn; + + LambdaJob(ProcessFn pfn, FinishFn ffn) + : fn{std::move(pfn)}, finishfn{std::move(ffn)} + {} + + void process(Ctl &ctl) override { fn(ctl); } + void finalize(bool canceled, std::exception_ptr &eptr) override + { + finishfn(canceled, eptr); + } + }; + + auto j = std::make_unique(std::move(fn), std::move(finishfn)); + return w.push(std::move(j)); +} + +template>> +bool queue_job(Worker &w, ProcessFn fn) +{ + return queue_job(w, std::move(fn), [](bool, std::exception_ptr &) {}); +} + +inline bool queue_job(Worker &w, std::unique_ptr j) +{ + return w.push(std::move(j)); +} + +// Replace the current job queue with a new job. The signature is the same +// as for queue_job(). This cancels all jobs and +// will not wait. The new job will begin after the queue cancels properly. +// Note that this can be called from the UI thread and will not block it if +// the jobs take longer to cancel. +template bool replace_job(Worker &w, Args&& ...args) +{ + w.cancel_all(); + return queue_job(w, std::forward(args)...); +} + +// Cancel the current job and wait for it to actually be stopped. +inline bool stop_current_job(Worker &w, unsigned timeout_ms = 0) +{ + w.cancel(); + return w.wait_for_current_job(timeout_ms); +} + +// Cancel all pending jobs including current one and wait until the worker +// becomes idle. +inline bool stop_queue(Worker &w, unsigned timeout_ms = 0) +{ + w.cancel_all(); + return w.wait_for_idle(timeout_ms); +} + +}} // namespace Slic3r::GUI + +#endif // WORKER_HPP diff --git a/src/slic3r/GUI/KBShortcutsDialog.cpp b/src/slic3r/GUI/KBShortcutsDialog.cpp index 892a780ab0e..66961b2cd40 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.cpp +++ b/src/slic3r/GUI/KBShortcutsDialog.cpp @@ -53,12 +53,21 @@ KBShortcutsDialog::KBShortcutsDialog() SetSizer(main_sizer); main_sizer->SetSizeHints(this); this->CenterOnParent(); + +#ifdef __linux__ + // workaround to correct pages layout + book->Bind(wxEVT_NOTEBOOK_PAGE_CHANGED, [book](wxBookCtrlEvent& e) { + book->GetPage(e.GetSelection())->Fit(); + }); + const wxSize sz = this->GetBestSize(); + this->SetSize(sz.x + 1, sz.y); +#endif } void KBShortcutsDialog::on_dpi_changed(const wxRect& suggested_rect) { - m_logo_bmp.msw_rescale(); - m_header_bitmap->SetBitmap(m_logo_bmp.bmp()); + //m_logo_bmp.msw_rescale(); + //m_header_bitmap->SetBitmap(m_logo_bmp.bmp()); msw_buttons_rescale(this, em_unit(), { wxID_OK }); Layout(); @@ -154,6 +163,7 @@ void KBShortcutsDialog::fill_shortcuts() { "L", L("Gizmo FDM paint-on supports") }, { "P", L("Gizmo FDM paint-on seam") }, { "N", L("Gizmo Multi Material painting") }, + { "T", L("Gizmo Text emboss / engrave")}, { "Esc", L("Unselect gizmo or clear selection") }, { "K", L("Change camera type (perspective, orthographic)") }, { "B", L("Zoom to Bed") }, @@ -172,10 +182,6 @@ void KBShortcutsDialog::fill_shortcuts() { ctrl + "M", L("Show/Hide 3Dconnexion devices settings dialog") }, #endif // __APPLE__ #endif // _WIN32 -#if ENABLE_RENDER_PICKING_PASS - // Don't localize debugging texts. - { "P", "Toggle picking pass texture rendering on/off" }, -#endif // ENABLE_RENDER_PICKING_PASS }; m_full_shortcuts.push_back({ { _L("Plater"), "" }, plater_shortcuts }); @@ -223,7 +229,7 @@ void KBShortcutsDialog::fill_shortcuts() { "A", L("Horizontal slider - Move active thumb Left") }, { "D", L("Horizontal slider - Move active thumb Right") }, { "X", L("On/Off one layer mode of the vertical slider") }, - { "L", L("Show/Hide Legend and Estimated printing time") }, + { "L", L("Show/Hide legend") }, { "C", L("Show/Hide G-code window") }, }; @@ -270,8 +276,8 @@ wxPanel* KBShortcutsDialog::create_header(wxWindow* parent, const wxFont& bold_f sizer->AddStretchSpacer(); // logo - m_logo_bmp = ScalableBitmap(this, wxGetApp().logo_name(), 32); - m_header_bitmap = new wxStaticBitmap(panel, wxID_ANY, m_logo_bmp.bmp()); + m_header_bitmap = new wxStaticBitmap(panel, wxID_ANY, *get_bmp_bundle(wxGetApp().logo_name(), 32)); + sizer->Add(m_header_bitmap, 0, wxEXPAND | wxLEFT | wxRIGHT, 10); // text diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index b90ccd5d9eb..4c9e8332ad7 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -14,6 +14,7 @@ #include #include +#include #include #include "libslic3r/Print.hpp" @@ -47,6 +48,7 @@ #include "GUI_ObjectList.hpp" #include "GalleryDialog.hpp" #include "NotificationManager.hpp" +#include "Preferences.hpp" #ifdef _WIN32 #include @@ -120,8 +122,8 @@ static wxIcon main_frame_icon(GUI_App::EAppMode app_mode) #endif // _WIN32 } -MainFrame::MainFrame() : -DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, "mainframe"), +MainFrame::MainFrame(const int font_point_size) : +DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, "mainframe", font_point_size), m_printhost_queue_dlg(new PrintHostQueueDialog(this)) , m_recent_projects(9) , m_settings_dialog(this) @@ -270,11 +272,54 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S update_ui_from_settings(); // FIXME (?) if (m_plater != nullptr) { - m_plater->get_collapse_toolbar().set_enabled(wxGetApp().app_config->get("show_collapse_button") == "1"); + m_plater->get_collapse_toolbar().set_enabled(wxGetApp().app_config->get_bool("show_collapse_button")); m_plater->show_action_buttons(true); + + preferences_dialog = new PreferencesDialog(this); } + + // bind events from DiffDlg + + bind_diff_dialog(); +} + +void MainFrame::bind_diff_dialog() +{ + auto get_tab = [](Preset::Type type) { + Tab* null_tab = nullptr; + for (Tab* tab : wxGetApp().tabs_list) + if (tab->type() == type) + return tab; + return null_tab; + }; + + auto transfer = [this, get_tab](Preset::Type type) { + get_tab(type)->transfer_options(diff_dialog.get_left_preset_name(type), + diff_dialog.get_right_preset_name(type), + diff_dialog.get_selected_options(type)); + }; + + auto update_presets = [this, get_tab](Preset::Type type) { + get_tab(type)->update_preset_choice(); + m_plater->sidebar().update_presets(type); + }; + + auto process_options = [this](std::function process) { + const Preset::Type diff_dlg_type = diff_dialog.view_type(); + if (diff_dlg_type == Preset::TYPE_INVALID) { + for (const Preset::Type& type : diff_dialog.types_list() ) + process(type); + } + else + process(diff_dlg_type); + }; + + diff_dialog.Bind(EVT_DIFF_DIALOG_TRANSFER, [process_options, transfer](SimpleEvent&) { process_options(transfer); }); + + diff_dialog.Bind(EVT_DIFF_DIALOG_UPDATE_PRESETS,[process_options, update_presets](SimpleEvent&) { process_options(update_presets); }); } + #ifdef _MSW_DARK_MODE static wxString pref() { return " [ "; } static wxString suff() { return " ] "; } @@ -397,9 +442,9 @@ void MainFrame::update_layout() }; ESettingsLayout layout = wxGetApp().is_gcode_viewer() ? ESettingsLayout::GCodeViewer : - (wxGetApp().app_config->get("old_settings_layout_mode") == "1" ? ESettingsLayout::Old : - wxGetApp().app_config->get("new_settings_layout_mode") == "1" ? ( wxGetApp().tabs_as_menu() ? ESettingsLayout::Old : ESettingsLayout::New) : - wxGetApp().app_config->get("dlg_settings_layout_mode") == "1" ? ESettingsLayout::Dlg : ESettingsLayout::Old); + (wxGetApp().app_config->get_bool("old_settings_layout_mode") ? ESettingsLayout::Old : + wxGetApp().app_config->get_bool("new_settings_layout_mode") ? ( wxGetApp().tabs_as_menu() ? ESettingsLayout::Old : ESettingsLayout::New) : + wxGetApp().app_config->get_bool("dlg_settings_layout_mode") ? ESettingsLayout::Dlg : ESettingsLayout::Old); if (m_layout == layout) return; @@ -491,7 +536,7 @@ void MainFrame::update_layout() case ESettingsLayout::GCodeViewer: { m_main_sizer->Add(m_plater, 1, wxEXPAND); - m_plater->set_bed_shape({ { 0.0, 0.0 }, { 200.0, 0.0 }, { 200.0, 200.0 }, { 0.0, 200.0 } }, 0.0, {}, {}, true); + m_plater->set_default_bed_shape(); m_plater->get_collapse_toolbar().set_enabled(false); m_plater->collapse_sidebar(true); m_plater->Show(); @@ -571,7 +616,7 @@ void MainFrame::shutdown() #endif // _WIN32 if (m_plater != nullptr) { - m_plater->stop_jobs(); + m_plater->get_ui_job_worker().cancel_all(); // Unbinding of wxWidgets event handling in canvases needs to be done here because on MAC, // when closing the application using Command+Q, a mouse event is triggered after this lambda is completed, @@ -607,7 +652,8 @@ void MainFrame::shutdown() wxGetApp().other_instance_message_handler()->shutdown(this); // Save the slic3r.ini.Usually the ini file is saved from "on idle" callback, // but in rare cases it may not have been called yet. - wxGetApp().app_config->save(); + if (wxGetApp().app_config->dirty()) + wxGetApp().app_config->save(); // if (m_plater) // m_plater->print = undef; // Slic3r::GUI::deregister_on_request_update_callback(); @@ -618,6 +664,13 @@ void MainFrame::shutdown() wxGetApp().plater_ = nullptr; } +GalleryDialog* MainFrame::gallery_dialog() +{ + if (!m_gallery_dialog) + m_gallery_dialog = new GalleryDialog(this); + return m_gallery_dialog; +} + void MainFrame::update_title() { wxString title = wxEmptyString; @@ -634,7 +687,9 @@ void MainFrame::update_title() } } - std::string build_id = wxGetApp().is_editor() ? SLIC3R_BUILD_ID : GCODEVIEWER_BUILD_ID; + std::string build_id = SLIC3R_BUILD_ID; + if (! wxGetApp().is_editor()) + boost::replace_first(build_id, SLIC3R_APP_NAME, GCODEVIEWER_APP_NAME); size_t idx_plus = build_id.find('+'); if (idx_plus != build_id.npos) { // Parse what is behind the '+'. If there is a number, then it is a build number after the label, and full build ID is shown. @@ -659,6 +714,8 @@ void MainFrame::update_title() void MainFrame::init_tabpanel() { + wxGetApp().update_ui_colours_from_appconfig(); + // wxNB_NOPAGETHEME: Disable Windows Vista theme for the Notebook background. The theme performance is terrible on Windows 10 // with multiple high resolution displays connected. #ifdef _MSW_DARK_MODE @@ -703,6 +760,10 @@ void MainFrame::init_tabpanel() // before the MainFrame is fully set up. tab->OnActivate(); m_last_selected_tab = m_tabpanel->GetSelection(); +#ifdef _MSW_DARK_MODE + if (wxGetApp().tabs_as_menu()) + tab->SetFocus(); +#endif } else select_tab(size_t(0)); // select Plater @@ -787,7 +848,6 @@ void MainFrame::register_win32_callbacks() void MainFrame::create_preset_tabs() { - wxGetApp().update_label_colours_from_appconfig(); add_created_tab(new TabPrint(m_tabpanel), "cog"); add_created_tab(new TabFilament(m_tabpanel), "spool"); add_created_tab(new TabSLAPrint(m_tabpanel), "cog"); @@ -884,7 +944,7 @@ bool MainFrame::can_export_supports() const const PrintObjects& objects = m_plater->sla_print().objects(); for (const SLAPrintObject* object : objects) { - if (object->has_mesh(slaposPad) || object->has_mesh(slaposSupportTree)) + if (!object->support_mesh().empty() || !object->pad_mesh().empty()) { can_export = true; break; @@ -941,7 +1001,7 @@ bool MainFrame::can_eject() const bool MainFrame::can_slice() const { - bool bg_proc = wxGetApp().app_config->get("background_processing") == "1"; + bool bg_proc = wxGetApp().app_config->get_bool("background_processing"); return (m_plater != nullptr) ? !m_plater->model().objects.empty() && !bg_proc : false; } @@ -1004,9 +1064,6 @@ void MainFrame::on_dpi_changed(const wxRect& suggested_rect) for (auto tab : wxGetApp().tabs_list) tab->msw_rescale(); - for (size_t id = 0; id < m_menubar->GetMenuCount(); id++) - msw_rescale_menu(m_menubar->GetMenu(id)); - // Workarounds for correct Window rendering after rescale /* Even if Window is maximized during moving, @@ -1034,14 +1091,16 @@ void MainFrame::on_sys_color_changed() wxBusyCursor wait; // update label colors in respect to the system mode - wxGetApp().init_label_colours(); + wxGetApp().init_ui_colours(); + // but if there are some ui colors in appconfig, they have to be applied + wxGetApp().update_ui_colours_from_appconfig(); #ifdef __WXMSW__ wxGetApp().UpdateDarkUI(m_tabpanel); // m_statusbar->update_dark_ui(); #ifdef _MSW_DARK_MODE // update common mode sizer if (!wxGetApp().tabs_as_menu()) - dynamic_cast(m_tabpanel)->Rescale(); + dynamic_cast(m_tabpanel)->OnColorsChanged(); #endif #endif @@ -1057,6 +1116,24 @@ void MainFrame::on_sys_color_changed() this->Refresh(); } +void MainFrame::update_mode_markers() +{ +#ifdef __WXMSW__ +#ifdef _MSW_DARK_MODE + // update markers in common mode sizer + if (!wxGetApp().tabs_as_menu()) + dynamic_cast(m_tabpanel)->UpdateModeMarkers(); +#endif +#endif + + // update mode markers on side_bar + wxGetApp().sidebar().update_mode_markers(); + + // update mode markers in tabs + for (auto tab : wxGetApp().tabs_list) + tab->update_mode_markers(); +} + #ifdef _MSC_VER // \xA0 is a non-breaking space. It is entered here to spoil the automatic accelerators, // as the simple numeric accelerators spoil all numeric data entry. @@ -1121,10 +1198,10 @@ static void add_common_view_menu_items(wxMenu* view_menu, MainFrame* mainFrame, append_menu_item(view_menu, wxID_ANY, _L("Iso") + sep + "&0", _L("Iso View"), [mainFrame](wxCommandEvent&) { mainFrame->select_view("iso"); }, "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame); view_menu->AppendSeparator(); - //TRN To be shown in the main menu View->Top + //TRN Main menu: View->Top append_menu_item(view_menu, wxID_ANY, _L("Top") + sep + "&1", _L("Top View"), [mainFrame](wxCommandEvent&) { mainFrame->select_view("top"); }, "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame); - //TRN To be shown in the main menu View->Bottom + //TRN Main menu: View->Bottom append_menu_item(view_menu, wxID_ANY, _L("Bottom") + sep + "&2", _L("Bottom View"), [mainFrame](wxCommandEvent&) { mainFrame->select_view("bottom"); }, "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame); append_menu_item(view_menu, wxID_ANY, _L("Front") + sep + "&3", _L("Front View"), [mainFrame](wxCommandEvent&) { mainFrame->select_view("front"); }, @@ -1177,7 +1254,6 @@ void MainFrame::init_menubar_as_editor() recent_projects.push_back(into_u8(m_recent_projects.GetHistoryFile(i))); } wxGetApp().app_config->set_recent_projects(recent_projects); - wxGetApp().app_config->save(); } } }, wxID_FILE1, wxID_FILE9); @@ -1213,10 +1289,14 @@ void MainFrame::init_menubar_as_editor() [this](wxCommandEvent&) { if (m_plater) m_plater->add_model(true); }, "import_plater", nullptr, [this](){return m_plater != nullptr; }, this); - append_menu_item(import_menu, wxID_ANY, _L("Import SL1 / SL1S Archive") + dots, _L("Load an SL1 / Sl1S archive"), + append_menu_item(import_menu, wxID_ANY, _L("Import SLA Archive") + dots, _L("Load an SLA archive"), [this](wxCommandEvent&) { if (m_plater) m_plater->import_sl1_archive(); }, "import_plater", nullptr, - [this](){return m_plater != nullptr && !m_plater->is_any_job_running(); }, this); + [this](){return m_plater != nullptr && m_plater->get_ui_job_worker().is_idle(); }, this); + append_menu_item(import_menu, wxID_ANY, _L("Import ZIP Archive") + dots, _L("Load a ZIP archive"), + [this](wxCommandEvent&) { if (m_plater) m_plater->import_zip_archive(); }, "import_plater", nullptr, + [this]() {return m_plater != nullptr; }, this); + import_menu->AppendSeparator(); append_menu_item(import_menu, wxID_ANY, _L("Import &Config") + dots + "\tCtrl+L", _L("Load exported configuration file"), [this](wxCommandEvent&) { load_config_file(); }, "import_config", nullptr, @@ -1243,11 +1323,11 @@ void MainFrame::init_menubar_as_editor() [this](wxCommandEvent&) { if (m_plater) m_plater->export_gcode(true); }, "export_to_sd", nullptr, [this]() {return can_export_gcode_sd(); }, this); export_menu->AppendSeparator(); - append_menu_item(export_menu, wxID_ANY, _L("Export Plate as &STL") + dots, _L("Export current plate as STL"), - [this](wxCommandEvent&) { if (m_plater) m_plater->export_stl(); }, "export_plater", nullptr, + append_menu_item(export_menu, wxID_ANY, _L("Export Plate as &STL/OBJ") + dots, _L("Export current plate as STL/OBJ"), + [this](wxCommandEvent&) { if (m_plater) m_plater->export_stl_obj(); }, "export_plater", nullptr, [this](){return can_export_model(); }, this); - append_menu_item(export_menu, wxID_ANY, _L("Export Plate as STL &Including Supports") + dots, _L("Export current plate as STL including supports"), - [this](wxCommandEvent&) { if (m_plater) m_plater->export_stl(true); }, "export_plater", nullptr, + append_menu_item(export_menu, wxID_ANY, _L("Export Plate as STL/OBJ &Including Supports") + dots, _L("Export current plate as STL/OBJ including supports"), + [this](wxCommandEvent&) { if (m_plater) m_plater->export_stl_obj(true); }, "export_plater", nullptr, [this](){return can_export_supports(); }, this); // Deprecating AMF export. Let's wait for user feedback. // append_menu_item(export_menu, wxID_ANY, _L("Export Plate as &AMF") + dots, _L("Export current plate as AMF"), @@ -1308,7 +1388,11 @@ void MainFrame::init_menubar_as_editor() append_menu_item(fileMenu, wxID_ANY, _L("&G-code Preview") + dots, _L("Open G-code viewer"), [this](wxCommandEvent&) { start_new_gcodeviewer_open_file(this); }, "", nullptr); fileMenu->AppendSeparator(); - append_menu_item(fileMenu, wxID_EXIT, _L("&Quit"), wxString::Format(_L("Quit %s"), SLIC3R_APP_NAME), + #ifdef _WIN32 + append_menu_item(fileMenu, wxID_EXIT, _L("E&xit"), wxString::Format(_L("Exit %s"), SLIC3R_APP_NAME), + #else + append_menu_item(fileMenu, wxID_EXIT, _L("&Quit"), wxString::Format(_L("Quit %s"), SLIC3R_APP_NAME), + #endif [this](wxCommandEvent&) { Close(false); }, "exit"); } @@ -1402,11 +1486,10 @@ void MainFrame::init_menubar_as_editor() windowMenu->AppendSeparator(); append_menu_item(windowMenu, wxID_ANY, _L("Shape Gallery"), _L("Open the dialog to modify shape gallery"), - [this](wxCommandEvent&) { - GalleryDialog dlg(this, true); - if (dlg.ShowModal() == wxID_OK) { + [this](wxCommandEvent&) { + if (gallery_dialog()->show(true) == wxID_OK) { wxArrayString input_files; - dlg.get_input_files(input_files); + m_gallery_dialog->get_input_files(input_files); if (!input_files.IsEmpty()) m_plater->sidebar().obj_list()->load_shape_object_from_gallery(input_files); } @@ -1418,7 +1501,7 @@ void MainFrame::init_menubar_as_editor() windowMenu->AppendSeparator(); append_menu_item(windowMenu, wxID_ANY, _L("Open New Instance") + "\tCtrl+Shift+I", _L("Open a new PrusaSlicer instance"), - [](wxCommandEvent&) { start_new_slicer(); }, "", nullptr, [this]() {return m_plater != nullptr && wxGetApp().app_config->get("single_instance") != "1"; }, this); + [](wxCommandEvent&) { start_new_slicer(); }, "", nullptr, [this]() {return m_plater != nullptr && !wxGetApp().app_config->get_bool("single_instance"); }, this); windowMenu->AppendSeparator(); append_menu_item(windowMenu, wxID_ANY, _L("Compare Presets")/* + "\tCtrl+F"*/, _L("Compare presets"), @@ -1434,6 +1517,9 @@ void MainFrame::init_menubar_as_editor() append_menu_check_item(viewMenu, wxID_ANY, _L("Show &Labels") + sep + "E", _L("Show object/instance labels in 3D scene"), [this](wxCommandEvent&) { m_plater->show_view3D_labels(!m_plater->are_view3D_labels_shown()); }, this, [this]() { return m_plater->is_view3D_shown(); }, [this]() { return m_plater->are_view3D_labels_shown(); }, this); + append_menu_check_item(viewMenu, wxID_ANY, _L("Show Legen&d") + sep + "L", _L("Show legend in preview"), + [this](wxCommandEvent&) { m_plater->show_legend(!m_plater->is_legend_shown()); }, this, + [this]() { return m_plater->is_preview_shown(); }, [this]() { return m_plater->is_legend_shown(); }, this); append_menu_check_item(viewMenu, wxID_ANY, _L("&Collapse Sidebar") + sep + "Shift+" + sep_space + "Tab", _L("Collapse sidebar"), [this](wxCommandEvent&) { m_plater->collapse_sidebar(!m_plater->is_sidebar_collapsed()); }, this, []() { return true; }, [this]() { return m_plater->is_sidebar_collapsed(); }, this); @@ -1454,6 +1540,7 @@ void MainFrame::init_menubar_as_editor() // assign menubar to frame after appending items, otherwise special items // will not be handled correctly m_menubar = new wxMenuBar(); + m_menubar->SetFont(this->normal_font()); m_menubar->Append(fileMenu, _L("&File")); if (editMenu) m_menubar->Append(editMenu, _L("&Edit")); m_menubar->Append(windowMenu, _L("&Window")); @@ -1551,6 +1638,10 @@ void MainFrame::init_menubar_as_gcodeviewer() if (m_plater != nullptr) { viewMenu = new wxMenu(); add_common_view_menu_items(viewMenu, this, std::bind(&MainFrame::can_change_view, this)); + viewMenu->AppendSeparator(); + append_menu_check_item(viewMenu, wxID_ANY, _L("Show Legen&d") + sep + "L", _L("Show legend"), + [this](wxCommandEvent&) { m_plater->show_legend(!m_plater->is_legend_shown()); }, this, + [this]() { return m_plater->is_preview_shown(); }, [this]() { return m_plater->is_legend_shown(); }, this); } // helpmenu @@ -1587,9 +1678,9 @@ void MainFrame::update_menubar() m_changeable_menu_items[miSend] ->SetItemLabel((is_fff ? _L("S&end G-code") : _L("S&end to print")) + dots + "\tCtrl+Shift+G"); m_changeable_menu_items[miMaterialTab] ->SetItemLabel((is_fff ? _L("&Filament Settings Tab") : _L("Mate&rial Settings Tab")) + "\tCtrl+3"); - m_changeable_menu_items[miMaterialTab] ->SetBitmap(create_menu_bitmap(is_fff ? "spool" : "resin")); + m_changeable_menu_items[miMaterialTab] ->SetBitmap(*get_bmp_bundle(is_fff ? "spool" : "resin")); - m_changeable_menu_items[miPrinterTab] ->SetBitmap(create_menu_bitmap(is_fff ? "printer" : "sla_printer")); + m_changeable_menu_items[miPrinterTab] ->SetBitmap(*get_bmp_bundle(is_fff ? "printer" : "sla_printer")); } #if 0 @@ -1665,7 +1756,7 @@ void MainFrame::quick_slice(const int qs) } else if (qs & qsSaveAs) { // The following line may die if the output_filename_format template substitution fails. - wxFileDialog dlg(this, from_u8((boost::format(_utf8(L("Save %s file as:"))) % ((qs & qsExportSVG) ? _L("SVG") : _L("G-code"))).str()), + wxFileDialog dlg(this, format_wxstr(_L("Save %s file as:"), ((qs & qsExportSVG) ? _L("SVG") : _L("G-code"))), wxGetApp().app_config->get_last_output_dir(get_dir_name(output_file)), get_base_name(input_file), qs & qsExportSVG ? file_wildcards(FT_SVG) : file_wildcards(FT_GCODE), wxFD_SAVE | wxFD_OVERWRITE_PROMPT); @@ -1687,8 +1778,8 @@ void MainFrame::quick_slice(const int qs) // show processbar dialog m_progress_dialog = new wxProgressDialog(_L("Slicing") + dots, - // TRN "Processing input_file_basename" - from_u8((boost::format(_utf8(L("Processing %s"))) % (input_file_basename + dots)).str()), + // TRN ProgressDialog on reslicing: "input file basename" + format_wxstr(_L("Processing %s"), (input_file_basename + dots)), 100, nullptr, wxPD_AUTO_HIDE); m_progress_dialog->Pulse(); { @@ -1807,6 +1898,8 @@ bool MainFrame::load_config_file(const std::string &path) show_error(this, ex.what()); return false; } + + m_plater->check_selected_presets_visibility(ptFFF); wxGetApp().load_current_presets(); return true; } @@ -2002,8 +2095,13 @@ void MainFrame::select_tab(size_t tab/* = size_t(-1)*/) m_plater->SetFocus(); Layout(); } - else + else { select(false); +#ifdef _MSW_DARK_MODE + if (wxGetApp().tabs_as_menu() && tab == 0) + m_plater->SetFocus(); +#endif + } // When we run application in ESettingsLayout::New or ESettingsLayout::Dlg mode, tabpanel is hidden from the very beginning // and as a result Tab::update_changed_tree_ui() function couldn't update m_is_nonsys_values values, @@ -2089,15 +2187,11 @@ void MainFrame::add_to_recent_projects(const wxString& filename) recent_projects.push_back(into_u8(m_recent_projects.GetHistoryFile(i))); } wxGetApp().app_config->set_recent_projects(recent_projects); - wxGetApp().app_config->save(); } } void MainFrame::technology_changed() { - // upadte DiffDlg - diff_dialog.update_presets(); - // update menu titles PrinterTechnology pt = plater()->printer_technology(); if (int id = m_menubar->FindMenu(pt == ptFFF ? _L("Material Settings") : _L("Filament Settings")); id != wxNOT_FOUND) @@ -2113,7 +2207,7 @@ void MainFrame::technology_changed() // Update the UI based on the current preferences. void MainFrame::update_ui_from_settings() { -// const bool bp_on = wxGetApp().app_config->get("background_processing") == "1"; +// const bool bp_on = wxGetApp().app_config->get_bool("background_processing"); // m_menu_item_reslice_now->Enable(!bp_on); // m_plater->sidebar().show_reslice(!bp_on); // m_plater->sidebar().show_export(bp_on); @@ -2144,7 +2238,7 @@ std::string MainFrame::get_dir_name(const wxString &full_name) const // ---------------------------------------------------------------------------- SettingsDialog::SettingsDialog(MainFrame* mainframe) -:DPIFrame(NULL, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _L("Settings"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, "settings_dialog"), +:DPIFrame(NULL, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _L("Settings"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, "settings_dialog", mainframe->normal_font().GetPointSize()), //: DPIDialog(mainframe, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _L("Settings"), wxDefaultPosition, wxDefaultSize, // wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxMINIMIZE_BOX | wxMAXIMIZE_BOX, "settings_dialog"), m_main_frame(mainframe) diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index 951ed70a1d7..c9fa601e1cf 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -32,6 +32,8 @@ class Tab; class PrintHostQueueDialog; class Plater; class MainFrame; +class PreferencesDialog; +class GalleryDialog; enum QuickSlice { @@ -105,6 +107,7 @@ class MainFrame : public DPIFrame bool can_delete() const; bool can_delete_all() const; bool can_reslice() const; + void bind_diff_dialog(); // MenuBar items changeable in respect to printer technology enum MenuItems @@ -136,15 +139,17 @@ class MainFrame : public DPIFrame virtual void on_sys_color_changed() override; public: - MainFrame(); + MainFrame(const int font_point_size); ~MainFrame() = default; void update_layout(); + void update_mode_markers(); // Called when closing the application and when switching the application language. void shutdown(); Plater* plater() { return m_plater; } + GalleryDialog* gallery_dialog(); void update_title(); @@ -203,8 +208,10 @@ class MainFrame : public DPIFrame DiffPresetDialog diff_dialog; wxWindow* m_plater_page{ nullptr }; // wxProgressDialog* m_progress_dialog { nullptr }; + PreferencesDialog* preferences_dialog { nullptr }; PrintHostQueueDialog* m_printhost_queue_dlg; // std::shared_ptr m_statusbar; + GalleryDialog* m_gallery_dialog{ nullptr }; #ifdef __APPLE__ std::unique_ptr m_taskbar_icon; diff --git a/src/slic3r/GUI/MeshUtils.cpp b/src/slic3r/GUI/MeshUtils.cpp index 440b0ec0dbc..59be6cabbe1 100644 --- a/src/slic3r/GUI/MeshUtils.cpp +++ b/src/slic3r/GUI/MeshUtils.cpp @@ -5,22 +5,39 @@ #include "libslic3r/TriangleMeshSlicer.hpp" #include "libslic3r/ClipperUtils.hpp" #include "libslic3r/Model.hpp" +#include "libslic3r/CSGMesh/SliceCSGMesh.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/Camera.hpp" +#include "slic3r/GUI/CameraUtils.hpp" + #include #include +#include + namespace Slic3r { namespace GUI { +void MeshClipper::set_behaviour(bool fill_cut, double contour_width) +{ + if (fill_cut != m_fill_cut || ! is_approx(contour_width, m_contour_width)) + m_result.reset(); + m_fill_cut = fill_cut; + m_contour_width = contour_width; +} + + + void MeshClipper::set_plane(const ClippingPlane& plane) { if (m_plane != plane) { m_plane = plane; - m_triangles_valid = false; + m_result.reset(); } } @@ -29,27 +46,41 @@ void MeshClipper::set_limiting_plane(const ClippingPlane& plane) { if (m_limiting_plane != plane) { m_limiting_plane = plane; - m_triangles_valid = false; + m_result.reset(); } } -void MeshClipper::set_mesh(const TriangleMesh& mesh) +void MeshClipper::set_mesh(const indexed_triangle_set& mesh) { - if (m_mesh != &mesh) { + if (m_mesh.get() != &mesh) { m_mesh = &mesh; - m_triangles_valid = false; - m_triangles2d.resize(0); + m_result.reset(); + } +} + +void MeshClipper::set_mesh(AnyPtr &&ptr) +{ + if (m_mesh.get() != ptr.get()) { + m_mesh = std::move(ptr); + m_result.reset(); } } -void MeshClipper::set_negative_mesh(const TriangleMesh& mesh) +void MeshClipper::set_negative_mesh(const indexed_triangle_set& mesh) { - if (m_negative_mesh != &mesh) { + if (m_negative_mesh.get() != &mesh) { m_negative_mesh = &mesh; - m_triangles_valid = false; - m_triangles2d.resize(0); + m_result.reset(); + } +} + +void MeshClipper::set_negative_mesh(AnyPtr &&ptr) +{ + if (m_negative_mesh.get() != ptr.get()) { + m_negative_mesh = std::move(ptr); + m_result.reset(); } } @@ -59,44 +90,122 @@ void MeshClipper::set_transformation(const Geometry::Transformation& trafo) { if (! m_trafo.get_matrix().isApprox(trafo.get_matrix())) { m_trafo = trafo; - m_triangles_valid = false; - m_triangles2d.resize(0); + m_result.reset(); } } +void MeshClipper::render_cut(const ColorRGBA& color) +{ + if (! m_result) + recalculate_triangles(); + GLShaderProgram* curr_shader = wxGetApp().get_current_shader(); + if (curr_shader != nullptr) + curr_shader->stop_using(); + + GLShaderProgram* shader = wxGetApp().get_shader("flat"); + if (shader != nullptr) { + shader->start_using(); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + for (CutIsland& isl : m_result->cut_islands) { + isl.model.set_color(isl.disabled ? ColorRGBA(0.5f, 0.5f, 0.5f, 1.f) : color); + isl.model.render(); + } + shader->stop_using(); + } + + if (curr_shader != nullptr) + curr_shader->start_using(); +} -void MeshClipper::render_cut() +void MeshClipper::render_contour(const ColorRGBA& color) { - if (! m_triangles_valid) + if (! m_result) recalculate_triangles(); - if (m_vertex_array.has_VBOs()) - m_vertex_array.render(); + GLShaderProgram* curr_shader = wxGetApp().get_current_shader(); + if (curr_shader != nullptr) + curr_shader->stop_using(); + + GLShaderProgram* shader = wxGetApp().get_shader("flat"); + if (shader != nullptr) { + shader->start_using(); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + for (CutIsland& isl : m_result->cut_islands) { + isl.model_expanded.set_color(isl.disabled ? ColorRGBA(1.f, 0.f, 0.f, 1.f) : color); + isl.model_expanded.render(); + } + shader->stop_using(); + } + + if (curr_shader != nullptr) + curr_shader->start_using(); +} + +bool MeshClipper::is_projection_inside_cut(const Vec3d& point_in) const +{ + if (!m_result || m_result->cut_islands.empty()) + return false; + Vec3d point = m_result->trafo.inverse() * point_in; + Point pt_2d = Point::new_scale(Vec2d(point.x(), point.y())); + + for (const CutIsland& isl : m_result->cut_islands) { + if (isl.expoly_bb.contains(pt_2d) && isl.expoly.contains(pt_2d)) + return !isl.disabled; + } + return false; } +bool MeshClipper::has_valid_contour() const +{ + return m_result && std::any_of(m_result->cut_islands.begin(), m_result->cut_islands.end(), [](const CutIsland& isl) { return !isl.expoly.empty(); }); +} +void MeshClipper::pass_mouse_click(const Vec3d& point_in) +{ + if (! m_result || m_result->cut_islands.empty()) + return; + Vec3d point = m_result->trafo.inverse() * point_in; + Point pt_2d = Point::new_scale(Vec2d(point.x(), point.y())); + + for (CutIsland& isl : m_result->cut_islands) { + if (isl.expoly_bb.contains(pt_2d) && isl.expoly.contains(pt_2d)) + isl.disabled = ! isl.disabled; + } +} + void MeshClipper::recalculate_triangles() { - const Transform3f& instance_matrix_no_translation_no_scaling = m_trafo.get_matrix(true,false,true).cast(); - // Calculate clipping plane normal in mesh coordinates. - const Vec3f up_noscale = instance_matrix_no_translation_no_scaling.inverse() * m_plane.get_normal().cast(); - const Vec3d up = up_noscale.cast().cwiseProduct(m_trafo.get_scaling_factor()); - // Calculate distance from mesh origin to the clipping plane (in mesh coordinates). - const float height_mesh = m_plane.distance(m_trafo.get_offset()) * (up_noscale.norm()/up.norm()); + m_result = ClipResult(); + + auto plane_mesh = Eigen::Hyperplane(m_plane.get_normal(), -m_plane.distance(Vec3d::Zero())).transform(m_trafo.get_matrix().inverse()); + const Vec3d up = plane_mesh.normal(); + const float height_mesh = -plane_mesh.offset(); // Now do the cutting MeshSlicingParams slicing_params; slicing_params.trafo.rotate(Eigen::Quaternion::FromTwoVectors(up, Vec3d::UnitZ())); - ExPolygons expolys = union_ex(slice_mesh(m_mesh->its, height_mesh, slicing_params)); + ExPolygons expolys; + + if (m_csgmesh.empty()) { + if (m_mesh) + expolys = union_ex(slice_mesh(*m_mesh, height_mesh, slicing_params)); - if (m_negative_mesh && !m_negative_mesh->empty()) { - const ExPolygons neg_expolys = union_ex(slice_mesh(m_negative_mesh->its, height_mesh, slicing_params)); - expolys = diff_ex(expolys, neg_expolys); + if (m_negative_mesh && !m_negative_mesh->empty()) { + const ExPolygons neg_expolys = union_ex(slice_mesh(*m_negative_mesh, height_mesh, slicing_params)); + expolys = diff_ex(expolys, neg_expolys); + } + } else { + expolys = std::move(csg::slice_csgmesh_ex(range(m_csgmesh), {height_mesh}, MeshSlicingParamsEx{slicing_params}).front()); } + // Triangulate and rotate the cut into world coords: Eigen::Quaterniond q; q.setFromTwoVectors(Vec3d::UnitZ(), up); @@ -104,6 +213,8 @@ void MeshClipper::recalculate_triangles() tr.rotate(q); tr = m_trafo.get_matrix() * tr; + m_result->trafo = tr; + if (m_limiting_plane != ClippingPlane::ClipsNothing()) { // Now remove whatever ended up below the limiting plane (e.g. sinking objects). @@ -149,7 +260,7 @@ void MeshClipper::recalculate_triangles() // it so it lies on our line. This will be the figure to subtract // from the cut. The coordinates must not overflow after the transform, // make the rectangle a bit smaller. - const coord_t size = (std::numeric_limits::max() - scale_(std::max(std::abs(e*a), std::abs(e*b)))) / 4; + const coord_t size = (std::numeric_limits::max()/2 - scale_(std::max(std::abs(e * a), std::abs(e * b)))) / 4; Polygons ep {Polygon({Point(-size, 0), Point(size, 0), Point(size, 2*size), Point(-size, 2*size)})}; ep.front().rotate(angle); ep.front().translate(scale_(-e * a), scale_(-e * b)); @@ -157,21 +268,97 @@ void MeshClipper::recalculate_triangles() } } - m_triangles2d = triangulate_expolygons_2f(expolys, m_trafo.get_matrix().matrix().determinant() < 0.); - tr.pretranslate(0.001 * m_plane.get_normal().normalized()); // to avoid z-fighting + Transform3d tr2 = tr; + tr2.pretranslate(0.002 * m_plane.get_normal().normalized()); - m_vertex_array.release_geometry(); - for (auto it=m_triangles2d.cbegin(); it != m_triangles2d.cend(); it=it+3) { - m_vertex_array.push_geometry(tr * Vec3d((*(it+0))(0), (*(it+0))(1), height_mesh), up); - m_vertex_array.push_geometry(tr * Vec3d((*(it+1))(0), (*(it+1))(1), height_mesh), up); - m_vertex_array.push_geometry(tr * Vec3d((*(it+2))(0), (*(it+2))(1), height_mesh), up); - const size_t idx = it - m_triangles2d.cbegin(); - m_vertex_array.push_triangle(idx, idx+1, idx+2); - } - m_vertex_array.finalize_geometry(true); - m_triangles_valid = true; + std::vector triangles2d; + + for (const ExPolygon& exp : expolys) { + triangles2d.clear(); + + m_result->cut_islands.push_back(CutIsland()); + CutIsland& isl = m_result->cut_islands.back(); + + if (m_fill_cut) { + triangles2d = triangulate_expolygon_2f(exp, m_trafo.get_matrix().matrix().determinant() < 0.); + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + init_data.reserve_vertices(triangles2d.size()); + init_data.reserve_indices(triangles2d.size()); + + // vertices + indices + for (auto it = triangles2d.cbegin(); it != triangles2d.cend(); it = it + 3) { + init_data.add_vertex((Vec3f)(tr * Vec3d((*(it + 0)).x(), (*(it + 0)).y(), height_mesh)).cast(), (Vec3f)up.cast()); + init_data.add_vertex((Vec3f)(tr * Vec3d((*(it + 1)).x(), (*(it + 1)).y(), height_mesh)).cast(), (Vec3f)up.cast()); + init_data.add_vertex((Vec3f)(tr * Vec3d((*(it + 2)).x(), (*(it + 2)).y(), height_mesh)).cast(), (Vec3f)up.cast()); + const size_t idx = it - triangles2d.cbegin(); + init_data.add_triangle((unsigned int)idx, (unsigned int)idx + 1, (unsigned int)idx + 2); + } + + if (!init_data.is_empty()) + isl.model.init_from(std::move(init_data)); + } + + if (m_contour_width != 0. && ! exp.contour.empty()) { + triangles2d.clear(); + + // The contours must not scale with the object. Check the scale factor + // in the respective directions, create a scaled copy of the ExPolygon + // offset it and then unscale the result again. + + Transform3d t = tr; + t.translation() = Vec3d::Zero(); + double scale_x = (t * Vec3d::UnitX()).norm(); + double scale_y = (t * Vec3d::UnitY()).norm(); + + // To prevent overflow after scaling, downscale the input if needed: + double extra_scale = 1.; + int32_t limit = int32_t(std::min(std::numeric_limits::max() / (2. * std::max(1., scale_x)), std::numeric_limits::max() / (2. * std::max(1., scale_y)))); + int32_t max_coord = 0; + for (const Point& pt : exp.contour) + max_coord = std::max(max_coord, std::max(std::abs(pt.x()), std::abs(pt.y()))); + if (max_coord + m_contour_width >= limit) + extra_scale = 0.9 * double(limit) / max_coord; + + ExPolygon exp_copy = exp; + if (extra_scale != 1.) + exp_copy.scale(extra_scale); + exp_copy.scale(scale_x, scale_y); + + ExPolygons expolys_exp = offset_ex(exp_copy, scale_(m_contour_width)); + expolys_exp = diff_ex(expolys_exp, ExPolygons({exp_copy})); + + for (ExPolygon& e : expolys_exp) { + e.scale(1./scale_x, 1./scale_y); + if (extra_scale != 1.) + e.scale(1./extra_scale); + } + + + triangles2d = triangulate_expolygons_2f(expolys_exp, m_trafo.get_matrix().matrix().determinant() < 0.); + GLModel::Geometry init_data = GLModel::Geometry(); + init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + init_data.reserve_vertices(triangles2d.size()); + init_data.reserve_indices(triangles2d.size()); + + // vertices + indices + for (auto it = triangles2d.cbegin(); it != triangles2d.cend(); it = it + 3) { + init_data.add_vertex((Vec3f)(tr2 * Vec3d((*(it + 0)).x(), (*(it + 0)).y(), height_mesh)).cast(), (Vec3f)up.cast()); + init_data.add_vertex((Vec3f)(tr2 * Vec3d((*(it + 1)).x(), (*(it + 1)).y(), height_mesh)).cast(), (Vec3f)up.cast()); + init_data.add_vertex((Vec3f)(tr2 * Vec3d((*(it + 2)).x(), (*(it + 2)).y(), height_mesh)).cast(), (Vec3f)up.cast()); + const size_t idx = it - triangles2d.cbegin(); + init_data.add_triangle((unsigned short)idx, (unsigned short)idx + 1, (unsigned short)idx + 2); + } + + if (!init_data.is_empty()) + isl.model_expanded.init_from(std::move(init_data)); + } + + isl.expoly = std::move(exp); + isl.expoly_bb = get_extents(exp); + } } @@ -180,38 +367,26 @@ Vec3f MeshRaycaster::get_triangle_normal(size_t facet_idx) const return m_normals[facet_idx]; } -void MeshRaycaster::line_from_mouse_pos(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, - Vec3d& point, Vec3d& direction) const +void MeshRaycaster::line_from_mouse_pos(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, Vec3d& point, Vec3d& direction) { - Matrix4d modelview = camera.get_view_matrix().matrix(); - Matrix4d projection= camera.get_projection_matrix().matrix(); - Vec4i viewport(camera.get_viewport().data()); - - Vec3d pt1; - Vec3d pt2; - igl::unproject(Vec3d(mouse_pos(0), viewport[3] - mouse_pos(1), 0.), - modelview, projection, viewport, pt1); - igl::unproject(Vec3d(mouse_pos(0), viewport[3] - mouse_pos(1), 1.), - modelview, projection, viewport, pt2); - + CameraUtils::ray_from_screen_pos(camera, mouse_pos, point, direction); Transform3d inv = trafo.inverse(); - pt1 = inv * pt1; - pt2 = inv * pt2; - - point = pt1; - direction = pt2-pt1; + point = inv*point; + direction = inv.linear()*direction; } - bool MeshRaycaster::unproject_on_mesh(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, Vec3f& position, Vec3f& normal, const ClippingPlane* clipping_plane, size_t* facet_idx) const { Vec3d point; Vec3d direction; - line_from_mouse_pos(mouse_pos, trafo, camera, point, direction); + CameraUtils::ray_from_screen_pos(camera, mouse_pos, point, direction); + Transform3d inv = trafo.inverse(); + point = inv*point; + direction = inv.linear()*direction; - std::vector hits = m_emesh.query_ray_hits(point, direction); + std::vector hits = m_emesh.query_ray_hits(point, direction); if (hits.empty()) return false; // no intersection found @@ -244,12 +419,24 @@ bool MeshRaycaster::unproject_on_mesh(const Vec2d& mouse_pos, const Transform3d& } + +bool MeshRaycaster::is_valid_intersection(Vec3d point, Vec3d direction, const Transform3d& trafo) const +{ + point = trafo.inverse() * point; + + std::vector hits = m_emesh.query_ray_hits(point, direction); + std::vector neg_hits = m_emesh.query_ray_hits(point, -direction); + + return !hits.empty() && !neg_hits.empty(); +} + + std::vector MeshRaycaster::get_unobscured_idxs(const Geometry::Transformation& trafo, const Camera& camera, const std::vector& points, const ClippingPlane* clipping_plane) const { std::vector out; - const Transform3d& instance_matrix_no_translation_no_scaling = trafo.get_matrix(true,false,true); + const Transform3d instance_matrix_no_translation_no_scaling = trafo.get_rotation_matrix(); Vec3d direction_to_camera = -camera.get_dir_forward(); Vec3d direction_to_camera_mesh = (instance_matrix_no_translation_no_scaling.inverse() * direction_to_camera).normalized().eval(); direction_to_camera_mesh = direction_to_camera_mesh.cwiseProduct(trafo.get_scaling_factor()); @@ -262,7 +449,7 @@ std::vector MeshRaycaster::get_unobscured_idxs(const Geometry::Transfo bool is_obscured = false; // Cast a ray in the direction of the camera and look for intersection with the mesh: - std::vector hits; + std::vector hits; // Offset the start of the ray by EPSILON to account for numerical inaccuracies. hits = m_emesh.query_ray_hits((inverse_trafo * pt.cast() + direction_to_camera_mesh * EPSILON), direction_to_camera_mesh); @@ -292,13 +479,47 @@ std::vector MeshRaycaster::get_unobscured_idxs(const Geometry::Transfo return out; } +bool MeshRaycaster::closest_hit(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, + Vec3f& position, Vec3f& normal, const ClippingPlane* clipping_plane, size_t* facet_idx) const +{ + Vec3d point; + Vec3d direction; + line_from_mouse_pos(mouse_pos, trafo, camera, point, direction); + + const std::vector hits = m_emesh.query_ray_hits(point, direction.normalized()); + + if (hits.empty()) + return false; // no intersection found + + size_t hit_id = 0; + if (clipping_plane != nullptr) { + while (hit_id < hits.size() && clipping_plane->is_point_clipped(trafo * hits[hit_id].position())) { + ++hit_id; + } + } + + if (hit_id == hits.size()) + return false; // all points are obscured or cut by the clipping plane. + + const AABBMesh::hit_result& hit = hits[hit_id]; + + position = hit.position().cast(); + normal = hit.normal().cast(); + + if (facet_idx != nullptr) + *facet_idx = hit.face(); + + return true; +} Vec3f MeshRaycaster::get_closest_point(const Vec3f& point, Vec3f* normal) const { int idx = 0; Vec3d closest_point; - m_emesh.squared_distance(point.cast(), idx, closest_point); + Vec3d pointd = point.cast(); + m_emesh.squared_distance(pointd, idx, closest_point); if (normal) + // TODO: consider: get_normal(m_emesh, pointd).cast(); *normal = m_normals[idx]; return closest_point.cast(); diff --git a/src/slic3r/GUI/MeshUtils.hpp b/src/slic3r/GUI/MeshUtils.hpp index bb8a1aa6187..b10fa5ff8f3 100644 --- a/src/slic3r/GUI/MeshUtils.hpp +++ b/src/slic3r/GUI/MeshUtils.hpp @@ -3,15 +3,19 @@ #include "libslic3r/Point.hpp" #include "libslic3r/Geometry.hpp" -#include "libslic3r/SLA/IndexedMesh.hpp" +#include "libslic3r/TriangleMesh.hpp" +#include "libslic3r/AABBMesh.hpp" +#include "libslic3r/CSGMesh/TriangleMeshAdapter.hpp" +#include "libslic3r/CSGMesh/CSGMeshCopy.hpp" #include "admesh/stl.h" -#include "slic3r/GUI/3DScene.hpp" +#include "slic3r/GUI/GLModel.hpp" #include +#include +#include namespace Slic3r { - namespace GUI { struct Camera; @@ -20,16 +24,14 @@ struct Camera; // lm_FIXME: Following class might possibly be replaced by Eigen::Hyperplane class ClippingPlane { - double m_data[4]; + std::array m_data; public: - ClippingPlane() - { + ClippingPlane() { *this = ClipsNothing(); } - ClippingPlane(const Vec3d& direction, double offset) - { + ClippingPlane(const Vec3d& direction, double offset) { set_normal(direction); set_offset(offset); } @@ -45,8 +47,7 @@ class ClippingPlane } bool is_point_clipped(const Vec3d& point) const { return distance(point) < 0.; } - void set_normal(const Vec3d& normal) - { + void set_normal(const Vec3d& normal) { const Vec3d norm_dir = normal.normalized(); m_data[0] = norm_dir.x(); m_data[1] = norm_dir.y(); @@ -55,22 +56,28 @@ class ClippingPlane void set_offset(double offset) { m_data[3] = offset; } double get_offset() const { return m_data[3]; } Vec3d get_normal() const { return Vec3d(m_data[0], m_data[1], m_data[2]); } + void invert_normal() { m_data[0] *= -1.0; m_data[1] *= -1.0; m_data[2] *= -1.0; } + ClippingPlane inverted_normal() const { return ClippingPlane(-get_normal(), get_offset()); } bool is_active() const { return m_data[3] != DBL_MAX; } static ClippingPlane ClipsNothing() { return ClippingPlane(Vec3d(0., 0., 1.), DBL_MAX); } - const double* get_data() const { return m_data; } + const std::array& get_data() const { return m_data; } // Serialization through cereal library template - void serialize( Archive & ar ) - { + void serialize( Archive & ar ) { ar( m_data[0], m_data[1], m_data[2], m_data[3] ); } }; // MeshClipper class cuts a mesh and is able to return a triangulated cut. -class MeshClipper { +class MeshClipper +{ public: + // Set whether the cut should be triangulated and whether a cut + // contour should be calculated and shown. + void set_behaviour(bool fill_cut, double contour_width); + // Inform MeshClipper about which plane we want to use to cut the mesh // This is supposed to be in world coordinates. void set_plane(const ClippingPlane& plane); @@ -82,9 +89,25 @@ class MeshClipper { // Which mesh to cut. MeshClipper remembers const * to it, caller // must make sure that it stays valid. - void set_mesh(const TriangleMesh& mesh); + void set_mesh(const indexed_triangle_set& mesh); + void set_mesh(AnyPtr &&ptr); - void set_negative_mesh(const TriangleMesh &mesh); + void set_negative_mesh(const indexed_triangle_set &mesh); + void set_negative_mesh(AnyPtr &&ptr); + + template + void set_mesh(const Range &csgrange, bool copy_meshes = false) + { + if (! csg::is_same(range(m_csgmesh), csgrange)) { + m_csgmesh.clear(); + if (copy_meshes) + csg::copy_csgrange_deep(csgrange, std::back_inserter(m_csgmesh)); + else + csg::copy_csgrange_shallow(csgrange, std::back_inserter(m_csgmesh)); + + m_result.reset(); + } + } // Inform the MeshClipper about the transformation that transforms the mesh // into world coordinates. @@ -92,19 +115,39 @@ class MeshClipper { // Render the triangulated cut. Transformation matrices should // be set in world coords. - void render_cut(); + void render_cut(const ColorRGBA& color); + void render_contour(const ColorRGBA& color); + + void pass_mouse_click(const Vec3d& pt); + + bool is_projection_inside_cut(const Vec3d& point) const; + bool has_valid_contour() const; private: void recalculate_triangles(); Geometry::Transformation m_trafo; - const TriangleMesh* m_mesh = nullptr; - const TriangleMesh* m_negative_mesh = nullptr; + AnyPtr m_mesh; + AnyPtr m_negative_mesh; + std::vector m_csgmesh; + ClippingPlane m_plane; ClippingPlane m_limiting_plane = ClippingPlane::ClipsNothing(); - std::vector m_triangles2d; - GLIndexedVertexArray m_vertex_array; - bool m_triangles_valid = false; + + struct CutIsland { + GLModel model; + GLModel model_expanded; + ExPolygon expoly; + BoundingBox expoly_bb; + bool disabled = false; + }; + struct ClipResult { + std::vector cut_islands; + Transform3d trafo; // this rotates the cut into world coords + }; + std::optional m_result; + bool m_fill_cut = true; + double m_contour_width = 0.; }; @@ -113,16 +156,21 @@ class MeshClipper { // whether certain points are visible or obscured by the mesh etc. class MeshRaycaster { public: - // The class references extern TriangleMesh, which must stay alive - // during MeshRaycaster existence. - MeshRaycaster(const TriangleMesh& mesh) - : m_emesh(mesh, true) // calculate epsilon for triangle-ray intersection from an average edge length - , m_normals(its_face_normals(mesh.its)) + explicit MeshRaycaster(std::shared_ptr mesh) + : m_mesh(std::move(mesh)) + , m_emesh(*m_mesh, true) // calculate epsilon for triangle-ray intersection from an average edge length + , m_normals(its_face_normals(m_mesh->its)) { + assert(m_mesh); } - void line_from_mouse_pos(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, - Vec3d& point, Vec3d& direction) const; + explicit MeshRaycaster(const TriangleMesh &mesh) + : MeshRaycaster(std::make_unique(mesh)) + {} + + // DEPRICATED - use CameraUtils::ray_from_screen_pos + static void line_from_mouse_pos(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, + Vec3d& point, Vec3d& direction); // Given a mouse position, this returns true in case it is on the mesh. bool unproject_on_mesh( @@ -134,6 +182,10 @@ class MeshRaycaster { const ClippingPlane* clipping_plane = nullptr, // clipping plane (if active) size_t* facet_idx = nullptr // index of the facet hit ) const; + + const AABBMesh &get_aabb_mesh() const { return m_emesh; } + + bool is_valid_intersection(Vec3d point, Vec3d direction, const Transform3d& trafo) const; // Given a vector of points in woorld coordinates, this returns vector // of indices of points that are visible (i.e. not cut by clipping plane @@ -145,10 +197,22 @@ class MeshRaycaster { const ClippingPlane* clipping_plane = nullptr // clipping plane (if active) ) const; + // Returns true if the ray, built from mouse position and camera direction, intersects the mesh. + // In this case, position and normal contain the position and normal, in model coordinates, of the intersection closest to the camera, + // depending on the position/orientation of the clipping_plane, if specified + bool closest_hit( + const Vec2d& mouse_pos, + const Transform3d& trafo, // how to get the mesh into world coords + const Camera& camera, // current camera position + Vec3f& position, // where to save the positibon of the hit (mesh coords) + Vec3f& normal, // normal of the triangle that was hit + const ClippingPlane* clipping_plane = nullptr, // clipping plane (if active) + size_t* facet_idx = nullptr // index of the facet hit + ) const; + // Given a point in world coords, the method returns closest point on the mesh. // The output is in mesh coords. // normal* can be used to also get normal of the respective triangle. - Vec3f get_closest_point(const Vec3f& point, Vec3f* normal = nullptr) const; // Given a point in mesh coords, the method returns the closest facet from mesh. @@ -157,11 +221,22 @@ class MeshRaycaster { Vec3f get_triangle_normal(size_t facet_idx) const; private: - sla::IndexedMesh m_emesh; + std::shared_ptr m_mesh; + AABBMesh m_emesh; std::vector m_normals; }; - +struct PickingModel +{ + GLModel model; + std::unique_ptr mesh_raycaster; + + void reset() { + model.reset(); + mesh_raycaster.reset(); + } +}; + } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/Mouse3DController.cpp b/src/slic3r/GUI/Mouse3DController.cpp index e5ad5d64f40..1ce67175392 100644 --- a/src/slic3r/GUI/Mouse3DController.cpp +++ b/src/slic3r/GUI/Mouse3DController.cpp @@ -668,6 +668,11 @@ void Mouse3DController::init() #ifndef _WIN32 // Don't start the background thread on Windows, as the HID messages are sent as Windows messages. m_thread = std::thread(&Mouse3DController::run, this); +#else + // For some reason, HID message routing does not work well with remote session. Requires further investigation + if (::GetSystemMetrics(SM_REMOTESESSION)) { + m_thread = std::thread(&Mouse3DController::run, this); + } #endif // _WIN32 } } diff --git a/src/slic3r/GUI/MsgDialog.cpp b/src/slic3r/GUI/MsgDialog.cpp index 90ed274673a..cce159903e4 100644 --- a/src/slic3r/GUI/MsgDialog.cpp +++ b/src/slic3r/GUI/MsgDialog.cpp @@ -14,6 +14,7 @@ #include "libslic3r/libslic3r.h" #include "libslic3r/Utils.hpp" +#include "libslic3r/Color.hpp" #include "GUI.hpp" #include "format.hpp" #include "I18N.hpp" @@ -98,9 +99,10 @@ void MsgDialog::apply_style(long style) if (style & wxNO) add_button(wxID_NO, (style & wxNO_DEFAULT)); if (style & wxCANCEL) add_button(wxID_CANCEL, (style & wxCANCEL_DEFAULT)); - logo->SetBitmap( create_scaled_bitmap(style & wxICON_WARNING ? "exclamation" : - style & wxICON_INFORMATION ? "info" : - style & wxICON_QUESTION ? "question" : "PrusaSlicer", this, 64, style & wxICON_ERROR)); + std::string icon_name = style & wxICON_WARNING ? "exclamation" : + style & wxICON_INFORMATION ? "info" : + style & wxICON_QUESTION ? "question" : "PrusaSlicer"; + logo->SetBitmap(*get_bmp_bundle(icon_name, 64)); } void MsgDialog::finalize() @@ -134,7 +136,7 @@ static void add_msg_content(wxWindow* parent, wxBoxSizer* content_sizer, wxStrin msg_lines++; } - wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); + wxFont font = wxGetApp().normal_font();//wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); wxFont monospace = wxGetApp().code_font(); wxColour text_clr = wxGetApp().get_label_clr_default(); wxColour bgr_clr = parent->GetBackgroundColour(); @@ -151,10 +153,8 @@ static void add_msg_content(wxWindow* parent, wxBoxSizer* content_sizer, wxStrin bgr_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); #endif - - - auto text_clr_str = wxString::Format(wxT("#%02X%02X%02X"), text_clr.Red(), text_clr.Green(), text_clr.Blue()); - auto bgr_clr_str = wxString::Format(wxT("#%02X%02X%02X"), bgr_clr.Red(), bgr_clr.Green(), bgr_clr.Blue()); + auto text_clr_str = encode_color(ColorRGB(text_clr.Red(), text_clr.Green(), text_clr.Blue())); + auto bgr_clr_str = encode_color(ColorRGB(bgr_clr.Red(), bgr_clr.Green(), bgr_clr.Blue())); const int font_size = font.GetPointSize(); int size[] = { font_size, font_size, font_size, font_size, font_size, font_size, font_size }; html->SetFonts(font.GetFaceName(), monospace.GetFaceName(), size); @@ -231,7 +231,7 @@ ErrorDialog::ErrorDialog(wxWindow *parent, const wxString &msg, bool monospaced_ add_msg_content(this, content_sizer, msg, monospaced_font); // Use a small bitmap with monospaced font, as the error text will not be wrapped. - logo->SetBitmap(create_scaled_bitmap("PrusaSlicer_192px_grayscale.png", this, monospaced_font ? 48 : /*1*/84)); + logo->SetBitmap(*get_bmp_bundle("PrusaSlicer_192px_grayscale.png", monospaced_font ? 48 : /*1*/84)); SetMaxSize(wxSize(-1, CONTENT_MAX_HEIGHT*wxGetApp().em_unit())); diff --git a/src/slic3r/GUI/MsgDialog.hpp b/src/slic3r/GUI/MsgDialog.hpp index 874629343f5..4ccc90792ac 100644 --- a/src/slic3r/GUI/MsgDialog.hpp +++ b/src/slic3r/GUI/MsgDialog.hpp @@ -160,8 +160,8 @@ class RichMessageDialog : public MsgDialog // customization of the message box buttons virtual bool SetYesNoLabels(const wxMD::ButtonLabel& yes, const wxMD::ButtonLabel& no) { - DoSetCustomLabel(m_yes, yes); - DoSetCustomLabel(m_no, no); + DoSetCustomLabel(m_yes, yes, wxID_YES); + DoSetCustomLabel(m_no, no, wxID_NO); return true; } @@ -169,29 +169,29 @@ class RichMessageDialog : public MsgDialog const wxMD::ButtonLabel& no, const wxMD::ButtonLabel& cancel) { - DoSetCustomLabel(m_yes, yes); - DoSetCustomLabel(m_no, no); - DoSetCustomLabel(m_cancel, cancel); + DoSetCustomLabel(m_yes, yes, wxID_YES); + DoSetCustomLabel(m_no, no, wxID_NO); + DoSetCustomLabel(m_cancel, cancel, wxID_CANCEL); return true; } virtual bool SetOKLabel(const wxMD::ButtonLabel& ok) { - DoSetCustomLabel(m_ok, ok); + DoSetCustomLabel(m_ok, ok, wxID_OK); return true; } virtual bool SetOKCancelLabels(const wxMD::ButtonLabel& ok, const wxMD::ButtonLabel& cancel) { - DoSetCustomLabel(m_ok, ok); - DoSetCustomLabel(m_cancel, cancel); + DoSetCustomLabel(m_ok, ok, wxID_OK); + DoSetCustomLabel(m_cancel, cancel, wxID_CANCEL); return true; } virtual bool SetHelpLabel(const wxMD::ButtonLabel& help) { - DoSetCustomLabel(m_help, help); + DoSetCustomLabel(m_help, help, wxID_HELP); return true; } // test if any custom labels were set @@ -230,9 +230,10 @@ class RichMessageDialog : public MsgDialog // the value to var with possibly some transformation (e.g. Cocoa version // currently uses this to remove any accelerators from the button strings // while GTK+ one handles stock items specifically here) - void DoSetCustomLabel(wxString& var, const wxMD::ButtonLabel& label) + void DoSetCustomLabel(wxString& var, const wxMD::ButtonLabel& label, wxWindowID btn_id) { var = label.GetAsString(); + SetButtonLabel(btn_id, var); } // these functions return the custom label or empty string and should be diff --git a/src/slic3r/GUI/Notebook.cpp b/src/slic3r/GUI/Notebook.cpp index 9c5ccb834ef..71d09516010 100644 --- a/src/slic3r/GUI/Notebook.cpp +++ b/src/slic3r/GUI/Notebook.cpp @@ -95,10 +95,6 @@ void ButtonsListCtrl::UpdateMode() void ButtonsListCtrl::Rescale() { - m_mode_sizer->msw_rescale(); - for (ScalableButton* btn : m_pageButtons) - btn->msw_rescale(); - int em = em_unit(this); m_btn_margin = std::lround(0.3 * em); m_line_margin = std::lround(0.1 * em); @@ -108,6 +104,21 @@ void ButtonsListCtrl::Rescale() m_sizer->Layout(); } +void ButtonsListCtrl::OnColorsChanged() +{ + for (ScalableButton* btn : m_pageButtons) + btn->sys_color_changed(); + + m_mode_sizer->sys_color_changed(); + + m_sizer->Layout(); +} + +void ButtonsListCtrl::UpdateModeMarkers() +{ + m_mode_sizer->update_mode_markers(); +} + void ButtonsListCtrl::SetSelection(int sel) { if (m_selection == sel) diff --git a/src/slic3r/GUI/Notebook.hpp b/src/slic3r/GUI/Notebook.hpp index af03a6a080f..c945be3001a 100644 --- a/src/slic3r/GUI/Notebook.hpp +++ b/src/slic3r/GUI/Notebook.hpp @@ -21,6 +21,8 @@ class ButtonsListCtrl : public wxControl void SetSelection(int sel); void UpdateMode(); void Rescale(); + void OnColorsChanged(); + void UpdateModeMarkers(); bool InsertPage(size_t n, const wxString& text, bool bSelect = false, const std::string& bmp_name = ""); void RemovePage(size_t n); bool SetPageImage(size_t n, const std::string& bmp_name) const; @@ -245,6 +247,16 @@ class Notebook: public wxBookCtrlBase GetBtnsListCtrl()->Rescale(); } + void OnColorsChanged() + { + GetBtnsListCtrl()->OnColorsChanged(); + } + + void UpdateModeMarkers() + { + GetBtnsListCtrl()->UpdateModeMarkers(); + } + void OnNavigationKey(wxNavigationKeyEvent& event) { if (event.IsWindowChange()) { diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index 6e9bc267fdc..3f7e58b7ef5 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -202,8 +202,14 @@ void NotificationManager::PopNotification::render(GLCanvas3D& canvas, float init if (m_id == 0) m_id = m_id_provider.allocate_id(); std::string name = "!!Ntfctn" + std::to_string(m_id); + + int flags = ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar | + ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | + ImGuiWindowFlags_NoScrollbar | + ImGuiWindowFlags_NoScrollWithMouse | + ImGuiWindowFlags_NoFocusOnAppearing; - if (imgui.begin(name, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse)) { + if (imgui.begin(name, flags)) { ImVec2 win_size = ImGui::GetWindowSize(); render_left_sign(imgui); @@ -318,7 +324,8 @@ void NotificationManager::PopNotification::count_lines() } m_lines_count++; } - // hypertext calculation + // original hypertext calculation (when there was no text2) + /* if (!m_hypertext.empty()) { int prev_end = m_endlines.size() > 1 ? m_endlines[m_endlines.size() - 2] : 0; // m_endlines.size() - 2 because we are fitting hypertext instead of last endline if (ImGui::CalcTextSize((escape_string_cstyle(text.substr(prev_end, last_end - prev_end)) + m_hypertext).c_str()).x > m_window_width - m_window_width_offset) { @@ -326,9 +333,84 @@ void NotificationManager::PopNotification::count_lines() m_lines_count++; } } + */ + int prev_end = m_endlines.size() > 1 ? m_endlines[m_endlines.size() - 2] : 0; + int size_of_last_line = ImGui::CalcTextSize(text.substr(prev_end, last_end - prev_end).c_str()).x; + // hypertext calculation + if (!m_hypertext.empty()) { + if (size_of_last_line + ImGui::CalcTextSize(m_hypertext.c_str()).x > m_window_width - m_window_width_offset) { + // hypertext on new line + size_of_last_line = ImGui::CalcTextSize((m_hypertext + " ").c_str()).x; + m_endlines.push_back(last_end); + m_lines_count++; + } + else { + size_of_last_line += ImGui::CalcTextSize((m_hypertext + " ").c_str()).x; + } + } + // text after hypertext calculation + if (!m_text2.empty()) { + text = m_text2; + last_end = 0; + m_endlines2.clear(); + // if size_of_last_line too large to fit anything + size_t first_end = std::min(text.find_first_of('\n'), text.find_first_of(' ')); + if (size_of_last_line >= m_window_width - m_window_width_offset - ImGui::CalcTextSize(text.substr(0, first_end).c_str()).x) { + m_endlines2.push_back(0); + size_of_last_line = 0; + } + while (last_end < text.length() - 1) + { + size_t next_hard_end = text.find_first_of('\n', last_end); + if (next_hard_end != std::string::npos && ImGui::CalcTextSize(text.substr(last_end, next_hard_end - last_end).c_str()).x < m_window_width - m_window_width_offset - size_of_last_line) { + //next line is ended by '/n' + m_endlines2.push_back(next_hard_end); + last_end = next_hard_end + 1; + } + else { + // find next suitable endline + if (ImGui::CalcTextSize(text.substr(last_end).c_str()).x >= m_window_width - m_window_width_offset - size_of_last_line) { + // more than one line till end + size_t next_space = text.find_first_of(' ', last_end); + if (next_space > 0) { + size_t next_space_candidate = text.find_first_of(' ', next_space + 1); + while (next_space_candidate > 0 && ImGui::CalcTextSize(text.substr(last_end, next_space_candidate - last_end).c_str()).x < m_window_width - m_window_width_offset - size_of_last_line) { + next_space = next_space_candidate; + next_space_candidate = text.find_first_of(' ', next_space + 1); + } + } + else { + next_space = text.length(); + } + // when one word longer than line. + if (ImGui::CalcTextSize(text.substr(last_end, next_space - last_end).c_str()).x > m_window_width - m_window_width_offset - size_of_last_line || + ImGui::CalcTextSize(text.substr(last_end, next_space - last_end).c_str()).x + size_of_last_line < (m_window_width - m_window_width_offset) / 5 * 3 + ) { + float width_of_a = ImGui::CalcTextSize("a").x; + int letter_count = (int)((m_window_width - m_window_width_offset - size_of_last_line) / width_of_a); + while (last_end + letter_count < text.size() && ImGui::CalcTextSize(text.substr(last_end, letter_count).c_str()).x < m_window_width - m_window_width_offset - size_of_last_line) { + letter_count += get_utf8_sequence_length(text, last_end + letter_count); + } + m_endlines2.push_back(last_end + letter_count); + last_end += letter_count; + } + else { + m_endlines2.push_back(next_space); + last_end = next_space + 1; + } + } + else { + m_endlines2.push_back(text.length()); + last_end = text.length(); + } - // m_text_2 (text after hypertext) is not used for regular notifications right now. - // its caluculation is in HintNotification::count_lines() + } + if (size_of_last_line == 0) // if first line is continuation of previous text, do not add to line count. + m_lines_count++; + size_of_last_line = 0; // should countain value only for first line (with hypertext) + + } + } } void NotificationManager::PopNotification::init() @@ -340,7 +422,7 @@ void NotificationManager::PopNotification::init() count_spaces(); count_lines(); - if (m_lines_count == 3) + if (m_lines_count == m_normal_lines_count + 1) m_multiline = true; m_notification_start = GLCanvas3D::timestamp_now(); if (m_state == EState::Unknown) @@ -349,8 +431,8 @@ void NotificationManager::PopNotification::init() void NotificationManager::PopNotification::set_next_window_size(ImGuiWrapper& imgui) { m_window_height = m_multiline ? - std::max(m_lines_count, (size_t)2) * m_line_height : - 2 * m_line_height; + std::max(m_lines_count, m_normal_lines_count) * m_line_height : + m_normal_lines_count * m_line_height; m_window_height += 1 * m_line_height; // top and bottom } @@ -362,19 +444,20 @@ void NotificationManager::PopNotification::render_text(ImGuiWrapper& imgui, cons float shift_y = m_line_height; std::string line; - for (size_t i = 0; i < (m_multiline ? m_endlines.size() : std::min(m_endlines.size(), (size_t)2)); i++) { + for (size_t i = 0; i < (m_multiline ? m_endlines.size() : std::min(m_endlines.size(), m_normal_lines_count)); i++) { assert(m_endlines.size() > i && m_text1.size() >= m_endlines[i]); line.clear(); ImGui::SetCursorPosX(x_offset); ImGui::SetCursorPosY(starting_y + i * shift_y); if (m_endlines.size() > i && m_text1.size() >= m_endlines[i]) { - if (i == 1 && m_endlines.size() > 2 && !m_multiline) { + if (i == m_normal_lines_count - 1 && m_endlines.size() > m_normal_lines_count && !m_multiline) { // second line with "more" hypertext - line = m_text1.substr(m_endlines[0] + (m_text1[m_endlines[0]] == '\n' || m_text1[m_endlines[0]] == ' ' ? 1 : 0), m_endlines[1] - m_endlines[0] - (m_text1[m_endlines[0]] == '\n' || m_text1[m_endlines[0]] == ' ' ? 1 : 0)); - while (ImGui::CalcTextSize(line.c_str()).x > m_window_width - m_window_width_offset - ImGui::CalcTextSize((".." + _u8L("More")).c_str()).x) { + assert(m_normal_lines_count - 2 >= 0); + line = m_text1.substr(m_endlines[m_normal_lines_count - 2] + (m_text1[m_endlines[m_normal_lines_count - 2]] == '\n' || m_text1[m_endlines[m_normal_lines_count - 2]] == ' ' ? 1 : 0), m_endlines[m_normal_lines_count - 1] - m_endlines[m_normal_lines_count - 2] - (m_text1[m_endlines[m_normal_lines_count - 2]] == '\n' || m_text1[m_endlines[m_normal_lines_count - 2]] == ' ' ? 1 : 0)); + while (ImGui::CalcTextSize(line.c_str()).x > m_window_width - m_window_width_offset - ImGui::CalcTextSize((" [" + _u8L("More") + "]").c_str()).x) { line = line.substr(0, line.length() - 1); } - line += ".."; + line += " ";//".."; } else { // regural line @@ -387,15 +470,36 @@ void NotificationManager::PopNotification::render_text(ImGuiWrapper& imgui, cons } } //hyperlink text - if (!m_multiline && m_lines_count > 2) { - render_hypertext(imgui, x_offset + ImGui::CalcTextSize((line + " ").c_str()).x, starting_y + shift_y, _u8L("More"), true); + if (!m_multiline && m_lines_count > m_normal_lines_count) { + render_hypertext(imgui, x_offset + ImGui::CalcTextSize((line + " ").c_str()).x, starting_y + (m_normal_lines_count -1) *shift_y, "[" + _u8L("More") + "]", true); } else if (!m_hypertext.empty()) { render_hypertext(imgui, x_offset + ImGui::CalcTextSize((line + (line.empty() ? "" : " ")).c_str()).x, starting_y + (m_endlines.size() - 1) * shift_y, m_hypertext); } - // text2 (text after hypertext) is not rendered for regular notifications - // its rendering is in HintNotification::render_text + // text2 + if (!m_text2.empty() && (m_multiline|| m_lines_count <= m_normal_lines_count)) { + starting_y += (m_endlines.size() - 1) * shift_y; + last_end = 0; + for (size_t i = 0; i < (m_multiline ? m_endlines2.size() : m_normal_lines_count); i++) { + if (i == 0) //first line X is shifted by hypertext + ImGui::SetCursorPosX(x_offset + ImGui::CalcTextSize((line + m_hypertext + (line.empty() ? " " : " ")).c_str()).x); + else + ImGui::SetCursorPosX(x_offset); + + ImGui::SetCursorPosY(starting_y + i * shift_y); + line.clear(); + if (m_endlines2.size() > i && m_text2.size() >= m_endlines2[i]) { + + // regular line + line = m_text2.substr(last_end, m_endlines2[i] - last_end); + last_end = m_endlines2[i]; + if (m_text2.size() > m_endlines2[i]) + last_end += (m_text2[m_endlines2[i]] == '\n' || m_text2[m_endlines2[i]] == ' ' ? 1 : 0); + imgui.text(line.c_str()); + } + } + } } void NotificationManager::PopNotification::render_hypertext(ImGuiWrapper& imgui, const float text_x, const float text_y, const std::string text, bool more) @@ -411,7 +515,7 @@ void NotificationManager::PopNotification::render_hypertext(ImGuiWrapper& imgui, { if (more) { - m_multiline = true; + on_more_hypertext_click(); set_next_window_size(imgui); } else if (on_text_click()) { @@ -532,6 +636,11 @@ bool NotificationManager::PopNotification::on_text_click() return m_data.callback(m_evt_handler); return false; } +void NotificationManager::PopNotification::on_more_hypertext_click() +{ + m_multiline = true; +} + void NotificationManager::PopNotification::update(const NotificationData& n) { m_text1 = n.text1; @@ -692,6 +801,7 @@ void NotificationManager::ExportFinishedNotification::render_eject_button(ImGuiW ImVec2(win_pos.x - m_line_height * 2.5f, win_pos.y + win_size.y), true)) { + button_text = ImGui::EjectHoverButton; // tooltip long time_now = wxGetLocalTime(); @@ -701,12 +811,21 @@ void NotificationManager::ExportFinishedNotification::render_eject_button(ImGuiW imgui.text(_u8L("Eject drive") + " " + GUI::shortkey_ctrl_prefix() + "T"); ImGui::EndTooltip(); ImGui::PopStyleColor(); + // somehow the tooltip wont show if the render doesnt run twice + if (m_hover_once) { + wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(0); + m_hover_once = false; + } } - if (m_hover_time == 0) + if (m_hover_time == 0) { m_hover_time = time_now; - } else + m_hover_once = true; + wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(1500); + } + } else { m_hover_time = 0; - + m_hover_once = false; + } ImVec2 button_pic_size = ImGui::CalcTextSize(button_text.c_str()); ImVec2 button_size(button_pic_size.x * 1.25f, button_pic_size.y * 1.25f); ImGui::SetCursorPosX(win_size.x - m_line_height * 5.0f); @@ -731,6 +850,15 @@ void NotificationManager::ExportFinishedNotification::render_eject_button(ImGuiW } ImGui::PopStyleColor(5); } + +bool NotificationManager::ExportFinishedNotification::update_state(bool paused, const int64_t delta) +{ + bool ret = PopNotification::update_state(paused, delta); + if (!ret && m_hover_time != 0 && m_hover_time < wxGetLocalTime()) + return true; + return false; +} + bool NotificationManager::ExportFinishedNotification::on_text_click() { open_folder(m_export_dir_path); @@ -738,7 +866,7 @@ bool NotificationManager::ExportFinishedNotification::on_text_click() } void NotificationManager::ExportFinishedNotification::on_eject_click() { - NotificationData data{ get_data().type, get_data().level , 0, _utf8("Ejecting.") }; + NotificationData data{ get_data().type, get_data().level , 0, _u8L("Ejecting.") }; m_eject_pending = true; m_multiline = false; update(data); @@ -753,7 +881,7 @@ void NotificationManager::ProgressBarNotification::init() m_endlines.push_back(0); } if(m_lines_count >= 2) { - m_lines_count = 3; + m_lines_count = 3; m_multiline = true; while (m_endlines.size() < 3) m_endlines.push_back(m_endlines.back()); @@ -814,16 +942,363 @@ void NotificationManager::ProgressBarNotification::render_bar(ImGuiWrapper& imgu std::stringstream stream; stream << std::fixed << std::setprecision(2) << (int)(m_percentage * 100) << "%"; text = stream.str(); - ImGui::SetCursorPosX(m_left_indentation); - ImGui::SetCursorPosY(win_size_y / 2 + win_size_y / 6 - (m_multiline ? 0 : m_line_height / 4)); - imgui.text(text.c_str()); + ImGui::SetCursorPosX(m_left_indentation); + ImGui::SetCursorPosY(win_size_y / 2 + win_size_y / 6 - (m_multiline ? 0 : m_line_height / 4)); + imgui.text(text.c_str()); + } +} + +//------ProgressBarWithCancelNotification---------------- + +void NotificationManager::ProgressBarWithCancelNotification::render_close_button(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) +{ + if (m_percentage < 0.f || m_percentage >= 1.f) + render_close_button_inner(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); + else + render_cancel_button_inner(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); +} +void NotificationManager::ProgressBarWithCancelNotification::render_close_button_inner(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) +{ + ImVec2 win_size(win_size_x, win_size_y); + ImVec2 win_pos(win_pos_x, win_pos_y); + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(.0f, .0f, .0f, .0f)); + push_style_color(ImGuiCol_Text, ImVec4(1.f, 1.f, 1.f, 1.f), m_state == EState::FadingOut, m_current_fade_opacity); + push_style_color(ImGuiCol_TextSelectedBg, ImVec4(0, .75f, .75f, 1.f), m_state == EState::FadingOut, m_current_fade_opacity); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(.0f, .0f, .0f, .0f)); + + + std::string button_text; + button_text = ImGui::CloseNotifButton; + + if (ImGui::IsMouseHoveringRect(ImVec2(win_pos.x - win_size.x / 10.f, win_pos.y), + ImVec2(win_pos.x, win_pos.y + win_size.y - (m_minimize_b_visible ? 2 * m_line_height : 0)), + true)) + { + button_text = ImGui::CloseNotifHoverButton; + } + ImVec2 button_pic_size = ImGui::CalcTextSize(button_text.c_str()); + ImVec2 button_size(button_pic_size.x * 1.25f, button_pic_size.y * 1.25f); + ImGui::SetCursorPosX(win_size.x - m_line_height * 2.75f); + ImGui::SetCursorPosY(win_size.y / 2 - button_size.y); + if (imgui.button(button_text.c_str(), button_size.x, button_size.y)) + { + close(); + } + + //invisible large button + ImGui::SetCursorPosX(win_size.x - m_line_height * 2.35f); + ImGui::SetCursorPosY(0); + if (imgui.button(" ", m_line_height * 2.125, win_size.y - (m_minimize_b_visible ? 2 * m_line_height : 0))) + { + close(); + } + ImGui::PopStyleColor(5); + +} + +void NotificationManager::ProgressBarWithCancelNotification::render_cancel_button_inner(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) +{ + ImVec2 win_size(win_size_x, win_size_y); + ImVec2 win_pos(win_pos_x, win_pos_y); + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(.0f, .0f, .0f, .0f)); + push_style_color(ImGuiCol_Text, ImVec4(1.f, 1.f, 1.f, 1.f), m_state == EState::FadingOut, m_current_fade_opacity); + push_style_color(ImGuiCol_TextSelectedBg, ImVec4(0, .75f, .75f, 1.f), m_state == EState::FadingOut, m_current_fade_opacity); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(.0f, .0f, .0f, .0f)); + + + std::string button_text; + button_text = ImGui::CancelButton; + + if (ImGui::IsMouseHoveringRect(ImVec2(win_pos.x - win_size.x / 10.f, win_pos.y), + ImVec2(win_pos.x, win_pos.y + win_size.y - (m_minimize_b_visible ? 2 * m_line_height : 0)), + true)) + { + button_text = ImGui::CancelHoverButton; + } + ImVec2 button_pic_size = ImGui::CalcTextSize(button_text.c_str()); + ImVec2 button_size(button_pic_size.x * 1.25f, button_pic_size.y * 1.25f); + ImGui::SetCursorPosX(win_size.x - m_line_height * 2.75f); + ImGui::SetCursorPosY(win_size.y / 2 - button_size.y); + if (imgui.button(button_text.c_str(), button_size.x, button_size.y)) + { + on_cancel_button(); + } + + //invisible large button + ImGui::SetCursorPosX(win_size.x - m_line_height * 2.35f); + ImGui::SetCursorPosY(0); + if (imgui.button(" ", m_line_height * 2.125, win_size.y - (m_minimize_b_visible ? 2 * m_line_height : 0))) + { + on_cancel_button(); + } + ImGui::PopStyleColor(5); + +} + +void NotificationManager::ProgressBarWithCancelNotification::on_cancel_button() +{ + if (m_cancel_callback) { + if (m_cancel_callback()) { + close(); + } + } +} + +void NotificationManager::ProgressBarWithCancelNotification::render_bar(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) +{ + ProgressBarNotification::render_bar(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); + std::string text; + if (m_percentage < 0.f) { + text = _u8L("ERROR"); + } else { + std::stringstream stream; + stream << std::fixed << std::setprecision(2) << (int)(m_percentage * 100) << "%"; + text = stream.str(); + } + ImGui::SetCursorPosX(m_left_indentation); + ImGui::SetCursorPosY(win_size_y / 2 + win_size_y / 6 - (m_multiline ? 0 : m_line_height / 4)); + imgui.text(text.c_str()); +} + +//------URLDownloadNotification---------------- + +void NotificationManager::URLDownloadNotification::render_close_button(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) +{ + if (m_percentage < 0.f || m_percentage >= 1.f) { + render_close_button_inner(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); + if (m_percentage >= 1.f) + render_open_button_inner(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); + } else + render_pause_cancel_buttons_inner(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); +} +void NotificationManager::URLDownloadNotification::render_close_button_inner(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) +{ + ImVec2 win_size(win_size_x, win_size_y); + ImVec2 win_pos(win_pos_x, win_pos_y); + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(.0f, .0f, .0f, .0f)); + push_style_color(ImGuiCol_Text, ImVec4(1.f, 1.f, 1.f, 1.f), m_state == EState::FadingOut, m_current_fade_opacity); + push_style_color(ImGuiCol_TextSelectedBg, ImVec4(0, .75f, .75f, 1.f), m_state == EState::FadingOut, m_current_fade_opacity); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(.0f, .0f, .0f, .0f)); + + + std::string button_text; + button_text = ImGui::CloseNotifButton; + + if (ImGui::IsMouseHoveringRect(ImVec2(win_pos.x - win_size.x / 10.f, win_pos.y), + ImVec2(win_pos.x, win_pos.y + win_size.y - (m_minimize_b_visible ? 2 * m_line_height : 0)), + true)) + { + button_text = ImGui::CloseNotifHoverButton; + } + ImVec2 button_pic_size = ImGui::CalcTextSize(button_text.c_str()); + ImVec2 button_size(button_pic_size.x * 1.25f, button_pic_size.y * 1.25f); + ImGui::SetCursorPosX(win_size.x - m_line_height * 2.75f); + ImGui::SetCursorPosY(win_size.y / 2 - button_size.y); + if (imgui.button(button_text.c_str(), button_size.x, button_size.y)) + { + close(); + } + + //invisible large button + ImGui::SetCursorPosX(win_size.x - m_line_height * 2.35f); + ImGui::SetCursorPosY(0); + if (imgui.button(" ", m_line_height * 2.125, win_size.y - (m_minimize_b_visible ? 2 * m_line_height : 0))) + { + close(); + } + ImGui::PopStyleColor(5); + +} + +void NotificationManager::URLDownloadNotification::render_pause_cancel_buttons_inner(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) +{ + + render_cancel_button_inner(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); + render_pause_button_inner(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); +} +void NotificationManager::URLDownloadNotification::render_pause_button_inner(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) +{ + ImVec2 win_size(win_size_x, win_size_y); + ImVec2 win_pos(win_pos_x, win_pos_y); + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(.0f, .0f, .0f, .0f)); + push_style_color(ImGuiCol_Text, ImVec4(1.f, 1.f, 1.f, 1.f), m_state == EState::FadingOut, m_current_fade_opacity); + push_style_color(ImGuiCol_TextSelectedBg, ImVec4(0, .75f, .75f, 1.f), m_state == EState::FadingOut, m_current_fade_opacity); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(.0f, .0f, .0f, .0f)); + + std::wstring button_text; + button_text = (m_download_paused ? ImGui::PlayButton : ImGui::PauseButton); + + if (ImGui::IsMouseHoveringRect(ImVec2(win_pos.x - m_line_height * 5.f, win_pos.y), + ImVec2(win_pos.x - m_line_height * 2.5f, win_pos.y + win_size.y), + true)) + { + button_text = (m_download_paused ? ImGui::PlayHoverButton : ImGui::PauseHoverButton); + } + + ImVec2 button_pic_size = ImGui::CalcTextSize(boost::nowide::narrow(button_text).c_str()); + ImVec2 button_size(button_pic_size.x * 1.25f, button_pic_size.y * 1.25f); + ImGui::SetCursorPosX(win_size.x - m_line_height * 5.0f); + ImGui::SetCursorPosY(win_size.y / 2 - button_size.y); + if (imgui.button(button_text.c_str(), button_size.x, button_size.y)) + { + trigger_user_action_callback(m_download_paused ? DownloaderUserAction::DownloadUserContinued : DownloaderUserAction::DownloadUserPaused); + } + + //invisible large button + ImGui::SetCursorPosX(win_size.x - m_line_height * 4.625f); + ImGui::SetCursorPosY(0); + if (imgui.button(" ", m_line_height * 2.f, win_size.y)) + { + trigger_user_action_callback(m_download_paused ? DownloaderUserAction::DownloadUserContinued : DownloaderUserAction::DownloadUserPaused); + } + ImGui::PopStyleColor(5); +} + +void NotificationManager::URLDownloadNotification::render_open_button_inner(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) +{ + ImVec2 win_size(win_size_x, win_size_y); + ImVec2 win_pos(win_pos_x, win_pos_y); + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(.0f, .0f, .0f, .0f)); + push_style_color(ImGuiCol_Text, ImVec4(1.f, 1.f, 1.f, 1.f), m_state == EState::FadingOut, m_current_fade_opacity); + push_style_color(ImGuiCol_TextSelectedBg, ImVec4(0, .75f, .75f, 1.f), m_state == EState::FadingOut, m_current_fade_opacity); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(.0f, .0f, .0f, .0f)); + + std::wstring button_text; + button_text = ImGui::OpenButton; + + if (ImGui::IsMouseHoveringRect(ImVec2(win_pos.x - m_line_height * 5.f, win_pos.y), + ImVec2(win_pos.x - m_line_height * 2.5f, win_pos.y + win_size.y), + true)) + { + button_text = ImGui::OpenHoverButton; + } + + ImVec2 button_pic_size = ImGui::CalcTextSize(boost::nowide::narrow(button_text).c_str()); + ImVec2 button_size(button_pic_size.x * 1.25f, button_pic_size.y * 1.25f); + ImGui::SetCursorPosX(win_size.x - m_line_height * 5.0f); + ImGui::SetCursorPosY(win_size.y / 2 - button_size.y); + if (imgui.button(button_text.c_str(), button_size.x, button_size.y)) + { + trigger_user_action_callback(DownloaderUserAction::DownloadUserOpenedFolder); + } + + //invisible large button + ImGui::SetCursorPosX(win_size.x - m_line_height * 4.625f); + ImGui::SetCursorPosY(0); + if (imgui.button(" ", m_line_height * 2.f, win_size.y)) + { + trigger_user_action_callback(DownloaderUserAction::DownloadUserOpenedFolder); + } + ImGui::PopStyleColor(5); +} + +void NotificationManager::URLDownloadNotification::render_cancel_button_inner(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) +{ + ImVec2 win_size(win_size_x, win_size_y); + ImVec2 win_pos(win_pos_x, win_pos_y); + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(.0f, .0f, .0f, .0f)); + push_style_color(ImGuiCol_Text, ImVec4(1.f, 1.f, 1.f, 1.f), m_state == EState::FadingOut, m_current_fade_opacity); + push_style_color(ImGuiCol_TextSelectedBg, ImVec4(0, .75f, .75f, 1.f), m_state == EState::FadingOut, m_current_fade_opacity); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(.0f, .0f, .0f, .0f)); + + + std::string button_text; + button_text = ImGui::CancelButton; + + if (ImGui::IsMouseHoveringRect(ImVec2(win_pos.x - win_size.x / 10.f, win_pos.y), + ImVec2(win_pos.x, win_pos.y + win_size.y - (m_minimize_b_visible ? 2 * m_line_height : 0)), + true)) + { + button_text = ImGui::CancelHoverButton; + } + ImVec2 button_pic_size = ImGui::CalcTextSize(button_text.c_str()); + ImVec2 button_size(button_pic_size.x * 1.25f, button_pic_size.y * 1.25f); + ImGui::SetCursorPosX(win_size.x - m_line_height * 2.75f); + ImGui::SetCursorPosY(win_size.y / 2 - button_size.y); + if (imgui.button(button_text.c_str(), button_size.x, button_size.y)) + { + trigger_user_action_callback(DownloaderUserAction::DownloadUserCanceled); + } + + //invisible large button + ImGui::SetCursorPosX(win_size.x - m_line_height * 2.35f); + ImGui::SetCursorPosY(0); + if (imgui.button(" ", m_line_height * 2.125, win_size.y - (m_minimize_b_visible ? 2 * m_line_height : 0))) + { + trigger_user_action_callback(DownloaderUserAction::DownloadUserCanceled); + } + ImGui::PopStyleColor(5); + +} + +void NotificationManager::URLDownloadNotification::trigger_user_action_callback(DownloaderUserAction action) +{ + if (m_user_action_callback) { + if (m_user_action_callback(action, m_download_id)) {} + } +} + + +void NotificationManager::URLDownloadNotification::render_bar(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) +{ + auto shorten_to_line = [this](const std::string& text, bool dots) -> std::string { + std::string line = text; + bool did_shorten = false; + while (ImGui::CalcTextSize(line.c_str()).x > m_window_width - m_window_width_offset) { + line = line.substr(0, line.length() - 1); + did_shorten = true; + } + if (did_shorten && dots) { + line = line.substr(0, line.length() - 2); + line += "..."; + } + return line; + }; + + ProgressBarNotification::render_bar(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); + std::string text; + if (m_percentage < 0.f) { + text = _u8L("ERROR") + ": " + m_error_message; + } else if (m_percentage >= 1.f) { + text = _u8L("COMPLETED"); + } else { + std::stringstream stream; + stream << std::fixed << std::setprecision(2) << (int)(m_percentage * 100) << "%"; + text = stream.str(); } + ImGui::SetCursorPosX(m_left_indentation); + ImGui::SetCursorPosY(win_size_y / 2 + win_size_y / 6 - (m_multiline ? 0 : m_line_height / 4)); + imgui.text(shorten_to_line(text, true).c_str()); +} + +void NotificationManager::URLDownloadNotification::count_spaces() +{ + ProgressBarNotification::count_spaces(); + m_window_width_offset = m_line_height * 6; } + //------PrintHostUploadNotification---------------- void NotificationManager::PrintHostUploadNotification::init() { - ProgressBarNotification::init(); - if (m_state == EState::NotFading && m_uj_state == UploadJobState::PB_COMPLETED) + if (is_finished()) + return; + // count_spaces before text - generate_text needs to know width of line + count_spaces(); + generate_text(); + + if (m_uj_state == UploadJobState::PB_COMPLETED || m_uj_state == UploadJobState::PB_COMPLETED_WITH_WARNING) { + PopNotification::init(); + m_multiline = m_more_hypertext_used; + } else + ProgressBarNotification::init(); + + if (m_state == EState::NotFading && (m_uj_state == UploadJobState::PB_COMPLETED || m_uj_state == UploadJobState::PB_COMPLETED_WITH_WARNING)) m_state = EState::Shown; } void NotificationManager::PrintHostUploadNotification::count_spaces() @@ -832,40 +1307,147 @@ void NotificationManager::PrintHostUploadNotification::count_spaces() m_line_height = ImGui::CalcTextSize("A").y; m_left_indentation = m_line_height; - if (m_uj_state == UploadJobState::PB_ERROR) { + if (m_uj_state == UploadJobState::PB_ERROR || m_uj_state == UploadJobState::PB_COMPLETED_WITH_WARNING) { std::string text; - text = (m_data.level == NotificationLevel::ErrorNotificationLevel ? ImGui::ErrorMarker : ImGui::WarningMarker); + //text = (m_data.level == NotificationLevel::ErrorNotificationLevel ? ImGui::ErrorMarker : ImGui::WarningMarker); its always progressbar level (not error or warning) + text = (m_uj_state == UploadJobState::PB_ERROR ? ImGui::ErrorMarker : ImGui::WarningMarker); float picture_width = ImGui::CalcTextSize(text.c_str()).x; m_left_indentation = picture_width + m_line_height / 2; } - m_window_width_offset = m_line_height * 6; //(m_has_cancel_button ? 6 : 4); + m_window_width_offset = m_line_height * 6; m_window_width = m_line_height * 25; } bool NotificationManager::PrintHostUploadNotification::push_background_color() { - if (m_uj_state == UploadJobState::PB_ERROR) { ImVec4 backcolor = ImGui::GetStyleColorVec4(ImGuiCol_WindowBg); backcolor.x += 0.3f; push_style_color(ImGuiCol_WindowBg, backcolor, m_state == EState::FadingOut, m_current_fade_opacity); return true; + } else if (m_uj_state == UploadJobState::PB_COMPLETED_WITH_WARNING) { + ImVec4 backcolor = ImGui::GetStyleColorVec4(ImGuiCol_WindowBg); + backcolor.x += 0.3f; + backcolor.y += 0.15f; + push_style_color(ImGuiCol_WindowBg, backcolor, m_state == EState::FadingOut, m_current_fade_opacity); + return true; } return false; } + +void NotificationManager::PrintHostUploadNotification::generate_text() +{ + auto shorten_to_line = [this](const std::string& text, bool dots) -> std::string { + std::string line = text; + bool did_shorten = false; + while (ImGui::CalcTextSize(line.c_str()).x > m_window_width - m_window_width_offset) { + line = line.substr(0, line.length() - 1); + did_shorten = true; + } + if (did_shorten && dots) { + line = line.substr(0, line.length() - 2); + line += "..."; + } + return line; + }; + + // whole text is no longer than 2 lines, filename is max 1 line long. + std::string rest = " -> " + (m_original_host == m_host ? m_host : m_host + " (" + m_original_host + ")"); + std::string line1; + if (ImGui::CalcTextSize(m_filename.c_str()).x > m_window_width - m_window_width_offset) { + line1 = shorten_to_line(m_filename, true); + } else { + line1 = shorten_to_line(m_filename + rest, false); + size_t over = line1.size() - m_filename.size(); + if (over < 0) + over = 0; + if (over < rest.size()) + rest = rest.substr(over); + else if (over >= rest.size()) + rest.clear(); + } + std::string line2 = shorten_to_line(rest, true); + + // ... if in total that makes more than 1 line, whole notification will behave as 3 line notification (as base height) + if (ImGui::CalcTextSize((line1 + line2).c_str()).x > m_window_width - m_window_width_offset) + m_normal_lines_count = 3; + else + m_normal_lines_count = 2; + + if (m_uj_state == UploadJobState::PB_COMPLETED || m_uj_state == UploadJobState::PB_COMPLETED_WITH_WARNING) + m_text1 = line1 + line2 + "\n" + _u8L("COMPLETED") + "\n" + m_status_message; + else + m_text1 = line1 + line2; +} + void NotificationManager::PrintHostUploadNotification::set_percentage(float percent) { m_percentage = percent; - if (percent >= 1.0f) { - m_uj_state = UploadJobState::PB_COMPLETED; - m_has_cancel_button = false; - init(); + if (m_complete_on_100 && percent >= 1.0f) { + complete(); } else if (percent < 0.0f) { error(); - } else { + } else if (m_uj_state != UploadJobState::PB_COMPLETED && m_uj_state != UploadJobState::PB_COMPLETED_WITH_WARNING){ + if (m_percentage > 1.f) + m_percentage = 1.f; m_uj_state = UploadJobState::PB_PROGRESS; m_has_cancel_button = true; } } + +void NotificationManager::PrintHostUploadNotification::complete() +{ + m_uj_state = UploadJobState::PB_COMPLETED; + m_has_cancel_button = false; + init(); +} + +void NotificationManager::PrintHostUploadNotification::complete_with_warning() +{ + m_uj_state = UploadJobState::PB_COMPLETED_WITH_WARNING; + m_has_cancel_button = false; + init(); +} + +void NotificationManager::PrintHostUploadNotification::render_text(ImGuiWrapper& imgui,const float win_size_x, const float win_size_y,const float win_pos_x, const float win_pos_y) +{ + // If not completed, the text rendering is very similar to progressbar notification except it doesnt use m_multiline to decide. + // If completed, whole text is part of m_text_1 and is rendered by PopNotification function. + + if (m_uj_state != UploadJobState::PB_COMPLETED && m_uj_state != UploadJobState::PB_COMPLETED_WITH_WARNING) { + // hypertext is not rendered at all. If it is needed, it needs to be added here. + // m_endlines should have endline for each line and then for hypertext thus m_endlines[1] should always be in m_text1 + if (m_endlines[0] != m_endlines[1]) { + assert(m_text1.size() >= m_endlines[0] || m_text1.size() >= m_endlines[1]); + if (m_endlines[0] > m_text1.size() || m_endlines[1] > m_text1.size()) + return; + // two lines text (what doesnt fit, wont show), one line bar + ImGui::SetCursorPosX(m_left_indentation); + ImGui::SetCursorPosY(m_line_height / 4); + imgui.text(m_text1.substr(0, m_endlines[0]).c_str()); + ImGui::SetCursorPosX(m_left_indentation); + ImGui::SetCursorPosY(m_line_height + m_line_height / 4); + std::string line = m_text1.substr(m_endlines[0] + (m_text1[m_endlines[0]] == '\n' || m_text1[m_endlines[0]] == ' ' ? 1 : 0), m_endlines[1] - m_endlines[0] - (m_text1[m_endlines[0]] == '\n' || m_text1[m_endlines[0]] == ' ' ? 1 : 0)); + imgui.text(line.c_str()); + // uncomment only if close and stop button should be next to each other + //if (m_has_cancel_button) + // render_cancel_button(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); + render_bar(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); + } + else { + assert(m_text1.size() >= m_endlines[0]); + if (m_endlines[0] > m_text1.size()) + return; + //one line text, one line bar + ImGui::SetCursorPosX(m_left_indentation); + ImGui::SetCursorPosY(/*win_size_y / 2 - win_size_y / 6 -*/ m_line_height / 4); + imgui.text(m_text1.substr(0, m_endlines[0]).c_str()); + if (m_has_cancel_button) + render_cancel_button(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); + render_bar(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); + } + } else + PopNotification::render_text(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); +} void NotificationManager::PrintHostUploadNotification::render_bar(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) { std::string text; @@ -881,6 +1463,11 @@ void NotificationManager::PrintHostUploadNotification::render_bar(ImGuiWrapper& ImGui::SetCursorPosY(win_size_y / 2 + win_size_y / 6 - (m_multiline ? 0 : m_line_height / 4)); break; } + case Slic3r::GUI::NotificationManager::PrintHostUploadNotification::UploadJobState::PB_RESOLVING: + text = _u8L("RESOLVING ADDRESS"); + ImGui::SetCursorPosX(m_left_indentation); + ImGui::SetCursorPosY(win_size_y / 2 + win_size_y / 6 - (m_multiline ? m_line_height / 4 : m_line_height / 2)); + break; case Slic3r::GUI::NotificationManager::PrintHostUploadNotification::UploadJobState::PB_ERROR: text = _u8L("ERROR"); ImGui::SetCursorPosX(m_left_indentation); @@ -892,9 +1479,8 @@ void NotificationManager::PrintHostUploadNotification::render_bar(ImGuiWrapper& ImGui::SetCursorPosY(win_size_y / 2 + win_size_y / 6 - (m_multiline ? m_line_height / 4 : m_line_height / 2)); break; case Slic3r::GUI::NotificationManager::PrintHostUploadNotification::UploadJobState::PB_COMPLETED: - text = _u8L("COMPLETED"); - ImGui::SetCursorPosX(m_left_indentation); - ImGui::SetCursorPosY(win_size_y / 2 + win_size_y / 6 - (m_multiline ? m_line_height / 4 : m_line_height / 2)); + case Slic3r::GUI::NotificationManager::PrintHostUploadNotification::UploadJobState::PB_COMPLETED_WITH_WARNING: + // whole text with both "COMPLETED" and status message is generated in generate_text() break; } @@ -909,8 +1495,23 @@ void NotificationManager::PrintHostUploadNotification::render_left_sign(ImGuiWra ImGui::SetCursorPosX(m_line_height / 3); ImGui::SetCursorPosY(m_window_height / 2 - m_line_height); imgui.text(text.c_str()); + } else if (m_uj_state == UploadJobState::PB_COMPLETED_WITH_WARNING) { + std::string text; + text = ImGui::WarningMarker; + ImGui::SetCursorPosX(m_line_height / 3); + ImGui::SetCursorPosY(m_window_height / 2 - m_line_height); + imgui.text(text.c_str()); } } + +void NotificationManager::PrintHostUploadNotification::render_close_button(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) +{ + if (m_has_cancel_button) + render_cancel_button(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); + else + ProgressBarNotification::render_close_button(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); +} + void NotificationManager::PrintHostUploadNotification::render_cancel_button(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) { ImVec2 win_size(win_size_x, win_size_y); @@ -921,6 +1522,56 @@ void NotificationManager::PrintHostUploadNotification::render_cancel_button(ImGu push_style_color(ImGuiCol_TextSelectedBg, ImVec4(0, .75f, .75f, 1.f), m_state == EState::FadingOut, m_current_fade_opacity); ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(.0f, .0f, .0f, .0f)); + + std::string button_text; + button_text = ImGui::CancelButton; + + if (ImGui::IsMouseHoveringRect(ImVec2(win_pos.x - win_size.x / 10.f, win_pos.y), + ImVec2(win_pos.x, win_pos.y + win_size.y - (m_minimize_b_visible ? 2 * m_line_height : 0)), + true)) + { + button_text = ImGui::CancelHoverButton; + // tooltip + long time_now = wxGetLocalTime(); + if (m_hover_time > 0 && m_hover_time < time_now) { + ImGui::PushStyleColor(ImGuiCol_PopupBg, ImGuiWrapper::COL_WINDOW_BACKGROUND); + ImGui::BeginTooltip(); + imgui.text(_u8L("Cancel upload") + " " + GUI::shortkey_ctrl_prefix() + "T"); + ImGui::EndTooltip(); + ImGui::PopStyleColor(); + } + if (m_hover_time == 0) + m_hover_time = time_now; + } + ImVec2 button_pic_size = ImGui::CalcTextSize(button_text.c_str()); + ImVec2 button_size(button_pic_size.x * 1.25f, button_pic_size.y * 1.25f); + ImGui::SetCursorPosX(win_size.x - m_line_height * 2.75f); + ImGui::SetCursorPosY(win_size.y / 2 - button_size.y); + if (imgui.button(button_text.c_str(), button_size.x, button_size.y)) + { + wxGetApp().printhost_job_queue().cancel(m_job_id - 1); + } + + //invisible large button + ImGui::SetCursorPosX(win_size.x - m_line_height * 2.35f); + ImGui::SetCursorPosY(0); + if (imgui.button(" ", m_line_height * 2.125, win_size.y - (m_minimize_b_visible ? 2 * m_line_height : 0))) + { + wxGetApp().printhost_job_queue().cancel(m_job_id - 1); + } + ImGui::PopStyleColor(5); + + // bellow is version where both close and stop button are rendered next to each other + + /* + ImVec2 win_size(win_size_x, win_size_y); + ImVec2 win_pos(win_pos_x, win_pos_y); + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(.0f, .0f, .0f, .0f)); + push_style_color(ImGuiCol_Text, ImVec4(1.f, 1.f, 1.f, 1.f), m_state == EState::FadingOut, m_current_fade_opacity); + push_style_color(ImGuiCol_TextSelectedBg, ImVec4(0, .75f, .75f, 1.f), m_state == EState::FadingOut, m_current_fade_opacity); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(.0f, .0f, .0f, .0f)); + std::string button_text; button_text = ImGui::CancelButton; @@ -961,6 +1612,7 @@ void NotificationManager::PrintHostUploadNotification::render_cancel_button(ImGu wxGetApp().printhost_job_queue().cancel(m_job_id - 1); } ImGui::PopStyleColor(5); + */ } //------UpdatedItemsInfoNotification------- void NotificationManager::UpdatedItemsInfoNotification::count_spaces() @@ -998,6 +1650,7 @@ void NotificationManager::UpdatedItemsInfoNotification::add_type(InfoItemType ty case InfoItemType::MmuSegmentation: text += format(_L_PLURAL("%1$d object was loaded with multimaterial painting.", "%1$d objects were loaded with multimaterial painting.",(*it).second), (*it).second) + "\n"; break; case InfoItemType::VariableLayerHeight: text += format(_L_PLURAL("%1$d object was loaded with variable layer height.", "%1$d objects were loaded with variable layer height.", (*it).second), (*it).second) + "\n"; break; case InfoItemType::Sinking: text += format(_L_PLURAL("%1$d object was loaded with partial sinking.", "%1$d objects were loaded with partial sinking.", (*it).second), (*it).second) + "\n"; break; + case InfoItemType::CutConnectors: text += format(_L_PLURAL("%1$d object was loaded as a part of cut object.", "%1$d objects were loaded as parts of cut object", (*it).second), (*it).second) + "\n"; break; default: BOOST_LOG_TRIVIAL(error) << "Unknown InfoItemType: " << (*it).second; break; } } @@ -1427,10 +2080,11 @@ void NotificationManager::push_notification(NotificationType type, const std::string& text, const std::string& hypertext, std::function callback, + const std::string& text_after, int timestamp) { int duration = get_standard_duration(level); - push_notification_data({ type, level, duration, text, hypertext, callback }, timestamp); + push_notification_data({ type, level, duration, text, hypertext, callback, text_after }, timestamp); } void NotificationManager::push_delayed_notification(const NotificationType type, std::function condition_callback, int64_t initial_delay, int64_t delay_interval) @@ -1556,6 +2210,29 @@ void NotificationManager::push_simplify_suggestion_notification(const std::stri notification->object_id = object_id; push_notification_data(std::move(notification), 0); } +void NotificationManager::push_version_notification(NotificationType type, NotificationLevel level, const std::string& text, const std::string& hypertext, std::function callback) +{ + assert (type == NotificationType::NewAlphaAvailable + || type == NotificationType::NewBetaAvailable + || type == NotificationType::NoNewReleaseAvailable); + + for (std::unique_ptr& notification : m_pop_notifications) { + // NoNewReleaseAvailable must not show if alfa / beta is on. + NotificationType nttype = notification->get_type(); + if (type == NotificationType::NoNewReleaseAvailable + && (notification->get_type() == NotificationType::NewAlphaAvailable + || notification->get_type() == NotificationType::NewBetaAvailable)) { + return; + } + // NoNewReleaseAvailable must close if alfa / beta is being push. + if (notification->get_type() == NotificationType::NoNewReleaseAvailable + && (type == NotificationType::NewAlphaAvailable + || type == NotificationType::NewBetaAvailable)) { + notification->close(); + } + } + push_notification(type, level, text, hypertext, callback); +} void NotificationManager::close_notification_of_type(const NotificationType type) { for (std::unique_ptr ¬ification : m_pop_notifications) { @@ -1609,9 +2286,12 @@ void NotificationManager::push_upload_job_notification(int id, float filesize, return; } } - std::string text = PrintHostUploadNotification::get_upload_job_text(id, filename, host); + // filename is created from boost::filesystem::path.string() which if created by path / "file" return \\ as folder division. But could also contain / as folder division. Lets unite this into "/" only. + std::string correct_filename(filename); + std::replace(correct_filename.begin(), correct_filename.end(), '\\', '/'); + std::string text = correct_filename + " -> " + host; NotificationData data{ NotificationType::PrintHostUpload, NotificationLevel::ProgressBarNotificationLevel, 10, text }; - push_notification_data(std::make_unique(data, m_id_provider, m_evt_handler, 0, id, filesize), 0); + push_notification_data(std::make_unique(data, m_id_provider, m_evt_handler, 0, id, filesize, filename, host), 0); } void NotificationManager::set_upload_job_notification_percentage(int id, const std::string& filename, const std::string& host, float percentage) { @@ -1620,12 +2300,83 @@ void NotificationManager::set_upload_job_notification_percentage(int id, const s PrintHostUploadNotification* phun = dynamic_cast(notification.get()); if (phun->compare_job_id(id)) { phun->set_percentage(percentage); + if (phun->get_host() != host) + phun->set_host(host); + wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(0); + break; + } + } + } +} +void NotificationManager::set_upload_job_notification_host(int id, const std::string& host) +{ + for (std::unique_ptr& notification : m_pop_notifications) { + if (notification->get_type() == NotificationType::PrintHostUpload) { + PrintHostUploadNotification* phun = dynamic_cast(notification.get()); + if (phun->compare_job_id(id)) { + phun->set_host(host); + wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(0); + break; + } + } + } +} + +void NotificationManager::set_upload_job_notification_status(int id, const std::string& status) +{ + for (std::unique_ptr& notification : m_pop_notifications) { + if (notification->get_type() == NotificationType::PrintHostUpload) { + PrintHostUploadNotification* phun = dynamic_cast(notification.get()); + if (phun->compare_job_id(id)) { + phun->set_status(status); + wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(0); + break; + } + } + } +} + +void NotificationManager::set_upload_job_notification_comp_on_100(int id, bool comp) +{ + for (std::unique_ptr& notification : m_pop_notifications) { + if (notification->get_type() == NotificationType::PrintHostUpload) { + PrintHostUploadNotification* phun = dynamic_cast(notification.get()); + if (phun->compare_job_id(id)) { + phun->set_complete_on_100(comp); + break; + } + } + } +} + +void NotificationManager::set_upload_job_notification_completed(int id) +{ + for (std::unique_ptr& notification : m_pop_notifications) { + if (notification->get_type() == NotificationType::PrintHostUpload) { + PrintHostUploadNotification* phun = dynamic_cast(notification.get()); + if (phun->compare_job_id(id)) { + phun->complete(); + wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(0); + break; + } + } + } +} + +void NotificationManager::set_upload_job_notification_completed_with_warning(int id) +{ + for (std::unique_ptr& notification : m_pop_notifications) { + if (notification->get_type() == NotificationType::PrintHostUpload) { + PrintHostUploadNotification* phun = dynamic_cast(notification.get()); + if (phun->compare_job_id(id)) { + phun->complete_with_warning(); wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(0); break; } } } } + void NotificationManager::upload_job_notification_show_canceled(int id, const std::string& filename, const std::string& host) { for (std::unique_ptr& notification : m_pop_notifications) { @@ -1633,6 +2384,8 @@ void NotificationManager::upload_job_notification_show_canceled(int id, const st PrintHostUploadNotification* phun = dynamic_cast(notification.get()); if (phun->compare_job_id(id)) { phun->cancel(); + if (phun->get_host() != host) + phun->set_host(host); wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(0); break; } @@ -1646,18 +2399,125 @@ void NotificationManager::upload_job_notification_show_error(int id, const std:: PrintHostUploadNotification* phun = dynamic_cast(notification.get()); if(phun->compare_job_id(id)) { phun->error(); + if (phun->get_host() != host) + phun->set_host(host); wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(0); break; } } } } +void NotificationManager::push_download_progress_notification(const std::string& text, std::function cancel_callback) +{ + // If already exists, change text and reset progress + for (std::unique_ptr& notification : m_pop_notifications) { + if (notification->get_type() == NotificationType::AppDownload) { + notification->update({ NotificationType::AppDownload, NotificationLevel::ProgressBarNotificationLevel, 10, text }); + auto* pbwcn = dynamic_cast(notification.get()); + pbwcn->set_percentage(0.0f); + pbwcn->set_cancel_callback(cancel_callback); + return; + } + } + // push new one + NotificationData data{ NotificationType::AppDownload, NotificationLevel::ProgressBarNotificationLevel, 10, text }; + push_notification_data(std::make_unique(data, m_id_provider, m_evt_handler, cancel_callback), 0); +} +void NotificationManager::set_download_progress_percentage(float percentage) +{ + for (std::unique_ptr& notification : m_pop_notifications) { + if (notification->get_type() == NotificationType::AppDownload) { + ProgressBarWithCancelNotification* pbwcn = dynamic_cast(notification.get()); + // if this changes the percentage, it should be shown now + float percent_b4 = pbwcn->get_percentage(); + pbwcn->set_percentage(percentage); + if (pbwcn->get_percentage() != percent_b4) + wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(0); + return; + } + } +} + +void NotificationManager::push_download_URL_progress_notification(size_t id, const std::string& text, std::function user_action_callback) +{ + // If already exists + for (std::unique_ptr& notification : m_pop_notifications) { + if (notification->get_type() == NotificationType::URLDownload && dynamic_cast(notification.get())->get_download_id() == id) { + return; + } + } + // push new one + NotificationData data{ NotificationType::URLDownload, NotificationLevel::ProgressBarNotificationLevel, 5, _u8L("Download") + ": " + text }; + push_notification_data(std::make_unique(data, m_id_provider, m_evt_handler, id, user_action_callback), 0); +} + +void NotificationManager::set_download_URL_progress(size_t id, float percentage) +{ + for (std::unique_ptr& notification : m_pop_notifications) { + if (notification->get_type() == NotificationType::URLDownload) { + URLDownloadNotification* ntf = dynamic_cast(notification.get()); + if (ntf->get_download_id() != id) + continue; + // if this changes the percentage, it should be shown now + float percent_b4 = ntf->get_percentage(); + ntf->set_percentage(percentage); + ntf->set_paused(false); + if (ntf->get_percentage() != percent_b4) + wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(0); + return; + } + } +} + +void NotificationManager::set_download_URL_paused(size_t id) +{ + for (std::unique_ptr& notification : m_pop_notifications) { + if (notification->get_type() == NotificationType::URLDownload) { + URLDownloadNotification* ntf = dynamic_cast(notification.get()); + if (ntf->get_download_id() != id) + continue; + ntf->set_paused(true); + wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(0); + return; + } + } +} + +void NotificationManager::set_download_URL_canceled(size_t id) +{ + for (std::unique_ptr& notification : m_pop_notifications) { + if (notification->get_type() == NotificationType::URLDownload) { + URLDownloadNotification* ntf = dynamic_cast(notification.get()); + if (ntf->get_download_id() != id) + continue; + ntf->close(); + wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(0); + return; + } + } +} +void NotificationManager::set_download_URL_error(size_t id, const std::string& text) +{ + for (std::unique_ptr& notification : m_pop_notifications) { + if (notification->get_type() == NotificationType::URLDownload) { + URLDownloadNotification* ntf = dynamic_cast(notification.get()); + if (ntf->get_download_id() != id) + continue; + float percent_b4 = ntf->get_percentage(); + ntf->set_percentage(-1.f); + ntf->set_error_message(text); + if (ntf->get_percentage() != percent_b4) + wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(0); + return; + } + } +} void NotificationManager::init_slicing_progress_notification(std::function cancel_callback) { for (std::unique_ptr& notification : m_pop_notifications) { if (notification->get_type() == NotificationType::SlicingProgress) { - dynamic_cast(notification.get())->set_cancel_callback(cancel_callback); + dynamic_cast(notification.get())->set_cancel_callback(cancel_callback); return; } } diff --git a/src/slic3r/GUI/NotificationManager.hpp b/src/slic3r/GUI/NotificationManager.hpp index 9265cb55e4e..778f99bfa3b 100644 --- a/src/slic3r/GUI/NotificationManager.hpp +++ b/src/slic3r/GUI/NotificationManager.hpp @@ -7,6 +7,7 @@ #include "Event.hpp" #include "I18N.hpp" #include "Jobs/ProgressIndicator.hpp" +#include "Downloader.hpp" #include #include @@ -55,6 +56,7 @@ enum class NotificationType // Like NewAppAvailable but with text and link for alpha / bet release NewAlphaAvailable, NewBetaAvailable, + NoNewReleaseAvailable, // Notification on the start of PrusaSlicer, when updates of system profiles are detected. // Contains a hyperlink to execute installation of the new system profiles. PresetUpdateAvailable, @@ -78,6 +80,8 @@ enum class NotificationType ProgressBar, // Progress bar with info from Print Host Upload Queue dialog. PrintHostUpload, + // Progress bar of download next version app. + AppDownload, // Progress bar with cancel button, cannot be closed // On end of slicing and G-code processing (the full G-code preview is available), // contains a hyperlink to export the G-code to a removable media or hdd. @@ -109,10 +113,16 @@ enum class NotificationType // Give user advice to simplify object with big amount of triangles // Contains ObjectID for closing when object is deleted SimplifySuggestion, + // Change of text will change font to similar one on. + UnknownFont, // information about netfabb is finished repairing model (blocking proccess) NetfabbFinished, // Short meesage to fill space between start and finish of export ExportOngoing, + // Progressbar of download from prusaslicer:// url + URLDownload, + // MacOS specific - PS comes forward even when downloader is not allowed + URLNotRegistered, }; class NotificationManager @@ -152,7 +162,7 @@ class NotificationManager // Push a NotificationType::CustomNotification with provided notification level and 10s for RegularNotificationLevel. // ErrorNotificationLevel are never faded out. void push_notification(NotificationType type, NotificationLevel level, const std::string& text, const std::string& hypertext = "", - std::function callback = std::function(), int timestamp = 0); + std::function callback = std::function(), const std::string& text_after = "", int timestamp = 0); // Pushes basic_notification with delay. See push_delayed_notification_data. void push_delayed_notification(const NotificationType type, std::function condition_callback, int64_t initial_delay, int64_t delay_interval); // Removes all notifications of type from m_waiting_notifications @@ -184,6 +194,9 @@ class NotificationManager // Object warning with ObjectID, closes when object is deleted. ID used is of object not print like in slicing warning. void push_simplify_suggestion_notification(const std::string& text, ObjectID object_id, const std::string& hypertext = "", std::function callback = std::function()); + // Could be either NewAlphaAvailable, NewBetaAvailable or NoNewReleaseAvailable - this function only makes sure only 1 is visible. + void push_version_notification(NotificationType type, NotificationLevel level, const std::string& text, const std::string& hypertext, + std::function callback); // Close object warnings, whose ObjectID is not in the list. // living_oids is expected to be sorted. void remove_simplify_suggestion_of_released_objects(const std::vector& living_oids); @@ -201,8 +214,22 @@ class NotificationManager // print host upload void push_upload_job_notification(int id, float filesize, const std::string& filename, const std::string& host, float percentage = 0); void set_upload_job_notification_percentage(int id, const std::string& filename, const std::string& host, float percentage); + void set_upload_job_notification_host(int id, const std::string& host); + void set_upload_job_notification_status(int id, const std::string& status); + void set_upload_job_notification_comp_on_100(int id, bool comp); + void set_upload_job_notification_completed(int id); + void set_upload_job_notification_completed_with_warning(int id); void upload_job_notification_show_canceled(int id, const std::string& filename, const std::string& host); void upload_job_notification_show_error(int id, const std::string& filename, const std::string& host); + // Download App progress + void push_download_progress_notification(const std::string& text, std::function cancel_callback); + void set_download_progress_percentage(float percentage); + // Download URL progress notif + void push_download_URL_progress_notification(size_t id, const std::string& text, std::function user_action_callback); + void set_download_URL_progress(size_t id, float percentage); + void set_download_URL_paused(size_t id); + void set_download_URL_canceled(size_t id); + void set_download_URL_error(size_t id, const std::string& text); // slicing progress void init_slicing_progress_notification(std::function cancel_callback); void set_slicing_progress_began(); @@ -344,7 +371,8 @@ class NotificationManager // Hypertext action, returns true if notification should close. // Action is stored in NotificationData::callback as std::function virtual bool on_text_click(); - + // "More" hypertext to show full message + virtual void on_more_hypertext_click(); // Part of init(), counts horizontal spacing like left indentation virtual void count_spaces(); // Part of init(), counts end lines @@ -405,6 +433,8 @@ class NotificationManager // True if minimized button is rendered, helps to decide where is area for invisible close button bool m_minimize_b_visible { false }; size_t m_lines_count{ 1 }; + // Number of lines to be shown when m_multiline = false. If m_lines_count = m_normal_lines_count + 1 -> all lines are shown, + size_t m_normal_lines_count { 2 }; // Target for wxWidgets events sent by clicking on the hyperlink available at some notifications. wxEvtHandler* m_evt_handler; }; @@ -437,6 +467,7 @@ class NotificationManager ProgressBarNotification(const NotificationData& n, NotificationIDProvider& id_provider, wxEvtHandler* evt_handler) : PopNotification(n, id_provider, evt_handler) { } virtual void set_percentage(float percent) { m_percentage = percent; } + float get_percentage() const { return m_percentage; } protected: virtual void init() override; virtual void render_text(ImGuiWrapper& imgui, @@ -459,7 +490,91 @@ class NotificationManager }; - + class ProgressBarWithCancelNotification : public ProgressBarNotification + { + public: + ProgressBarWithCancelNotification(const NotificationData& n, NotificationIDProvider& id_provider, wxEvtHandler* evt_handler, std::function cancel_callback) + : ProgressBarNotification(n, id_provider, evt_handler) + , m_cancel_callback(cancel_callback) + { + } + void set_percentage(float percent) override { m_percentage = percent; if(m_percentage >= 1.f) m_state = EState::FadingOut; else m_state = EState::NotFading; } + void set_cancel_callback(std::function cancel_callback) { m_cancel_callback = cancel_callback; } + + protected: + void render_close_button(ImGuiWrapper& imgui, + const float win_size_x, const float win_size_y, + const float win_pos_x, const float win_pos_y) override; + void render_close_button_inner(ImGuiWrapper& imgui, + const float win_size_x, const float win_size_y, + const float win_pos_x, const float win_pos_y); + void render_cancel_button_inner(ImGuiWrapper& imgui, + const float win_size_x, const float win_size_y, + const float win_pos_x, const float win_pos_y); + void render_bar(ImGuiWrapper& imgui, + const float win_size_x, const float win_size_y, + const float win_pos_x, const float win_pos_y) override; + void on_cancel_button(); + + std::function m_cancel_callback; + long m_hover_time{ 0 }; + }; + + class URLDownloadNotification : public ProgressBarNotification + { + public: + URLDownloadNotification(const NotificationData& n, NotificationIDProvider& id_provider, wxEvtHandler* evt_handler, size_t download_id, std::function user_action_callback) + //: ProgressBarWithCancelNotification(n, id_provider, evt_handler, cancel_callback) + : ProgressBarNotification(n, id_provider, evt_handler) + , m_download_id(download_id) + , m_user_action_callback(user_action_callback) + { + } + void set_percentage(float percent) override + { + m_percentage = percent; + if (m_percentage >= 1.f) { + m_notification_start = GLCanvas3D::timestamp_now(); + m_state = EState::Shown; + } else + m_state = EState::NotFading; + } + size_t get_download_id() { return m_download_id; } + void set_user_action_callback(std::function user_action_callback) { m_user_action_callback = user_action_callback; } + void set_paused(bool paused) { m_download_paused = paused; } + void set_error_message(const std::string& message) { m_error_message = message; } + bool compare_text(const std::string& text) const override { return false; }; + protected: + void render_close_button(ImGuiWrapper& imgui, + const float win_size_x, const float win_size_y, + const float win_pos_x, const float win_pos_y) override; + void render_close_button_inner(ImGuiWrapper& imgui, + const float win_size_x, const float win_size_y, + const float win_pos_x, const float win_pos_y); + void render_pause_cancel_buttons_inner(ImGuiWrapper& imgui, + const float win_size_x, const float win_size_y, + const float win_pos_x, const float win_pos_y); + void render_open_button_inner(ImGuiWrapper& imgui, + const float win_size_x, const float win_size_y, + const float win_pos_x, const float win_pos_y); + void render_cancel_button_inner(ImGuiWrapper& imgui, + const float win_size_x, const float win_size_y, + const float win_pos_x, const float win_pos_y); + void render_pause_button_inner(ImGuiWrapper& imgui, + const float win_size_x, const float win_size_y, + const float win_pos_x, const float win_pos_y); + void render_bar(ImGuiWrapper& imgui, + const float win_size_x, const float win_size_y, + const float win_pos_x, const float win_pos_y) override; + void trigger_user_action_callback(DownloaderUserAction action); + + void count_spaces() override; + + size_t m_download_id; + std::function m_user_action_callback; + bool m_download_paused {false}; + std::string m_error_message; + }; class PrintHostUploadNotification : public ProgressBarNotification { @@ -469,39 +584,67 @@ class NotificationManager PB_PROGRESS, PB_ERROR, PB_CANCELLED, - PB_COMPLETED + PB_COMPLETED, + PB_COMPLETED_WITH_WARNING, + PB_RESOLVING }; - PrintHostUploadNotification(const NotificationData& n, NotificationIDProvider& id_provider, wxEvtHandler* evt_handler, float percentage, int job_id, float filesize) + PrintHostUploadNotification(const NotificationData& n, NotificationIDProvider& id_provider, wxEvtHandler* evt_handler, float percentage, int job_id, float filesize, const std::string& filename, const std::string& host) :ProgressBarNotification(n, id_provider, evt_handler) , m_job_id(job_id) , m_file_size(filesize) + , m_filename(filename) + , m_host(host) + , m_original_host(host) { m_has_cancel_button = true; - set_percentage(percentage); + if (percentage != 0.f) + set_percentage(percentage); } - static std::string get_upload_job_text(int id, const std::string& filename, const std::string& host) { return /*"[" + std::to_string(id) + "] " + */filename + " -> " + host; } void set_percentage(float percent) override; void cancel() { m_uj_state = UploadJobState::PB_CANCELLED; m_has_cancel_button = false; } void error() { m_uj_state = UploadJobState::PB_ERROR; m_has_cancel_button = false; init(); } bool compare_job_id(const int other_id) const { return m_job_id == other_id; } bool compare_text(const std::string& text) const override { return false; } + void set_host(const std::string& host) { m_host = host; init(); } + std::string get_host() const { return m_host; } + void set_status(const std::string& status) { m_status_message = status; init(); } + void set_complete_on_100(bool val) { m_complete_on_100 = val; } + void complete(); + void complete_with_warning(); protected: void init() override; void count_spaces() override; bool push_background_color() override; + virtual void render_text(ImGuiWrapper& imgui, + const float win_size_x, const float win_size_y, + const float win_pos_x, const float win_pos_y) override; void render_bar(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) override; + virtual void render_close_button(ImGuiWrapper& imgui, + const float win_size_x, const float win_size_y, + const float win_pos_x, const float win_pos_y) override; void render_cancel_button(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) override; void render_left_sign(ImGuiWrapper& imgui) override; + + void generate_text(); + void on_more_hypertext_click() override { ProgressBarNotification::on_more_hypertext_click(); m_more_hypertext_used = true; } + // Identifies job in cancel callback int m_job_id; // Size of uploaded size to be displayed in MB float m_file_size; long m_hover_time{ 0 }; - UploadJobState m_uj_state{ UploadJobState::PB_PROGRESS }; + UploadJobState m_uj_state{ UploadJobState::PB_RESOLVING }; + std::string m_filename; + std::string m_host; + std::string m_original_host; // when hostname is resolved into ip address, we can still display original hostname (that user inserted) + std::string m_status_message; + bool m_more_hypertext_used { false }; + // When m_complete_on_100 is set to false - percent >= 1 wont switch to PB_COMPLETED state. + bool m_complete_on_100 { true }; }; class SlicingProgressNotification : public ProgressBarNotification @@ -627,6 +770,8 @@ class NotificationManager bool m_to_removable; std::string m_export_path; std::string m_export_dir_path; + + bool update_state(bool paused, const int64_t delta) override; protected: // Reserves space on right for more buttons void count_spaces() override; @@ -646,6 +791,7 @@ class NotificationManager void on_eject_click(); // local time of last hover for showing tooltip long m_hover_time { 0 }; + bool m_hover_once { false }; bool m_eject_pending { false }; }; @@ -744,7 +890,8 @@ class NotificationManager NotificationType::PlaterWarning, NotificationType::ProgressBar, NotificationType::PrintHostUpload, - NotificationType::SimplifySuggestion + NotificationType::SimplifySuggestion, + NotificationType::URLDownload }; //prepared (basic) notifications // non-static so its not loaded too early. If static, the translations wont load correctly. @@ -771,6 +918,16 @@ class NotificationManager {NotificationType::UndoDesktopIntegrationFail, NotificationLevel::WarningNotificationLevel, 10, _u8L("Undo desktop integration failed.") }, {NotificationType::ExportOngoing, NotificationLevel::RegularNotificationLevel, 0, _u8L("Exporting.") }, + {NotificationType::URLNotRegistered + , NotificationLevel::RegularNotificationLevel + , 10 + , _u8L("PrusaSlicer recieved a download request from Printables.com, but it's not allowed. You can allow it") + , _u8L("here.") + , [](wxEvtHandler* evnthndlr) { + wxGetApp().open_preferences("downloader_url_registered", "Other"); + return true; + } }, + //{NotificationType::NewAppAvailable, NotificationLevel::ImportantNotificationLevel, 20, _u8L("New version is available."), _u8L("See Releases page."), [](wxEvtHandler* evnthndlr) { // wxGetApp().open_browser_with_warning_dialog("https://github.com/prusa3d/PrusaSlicer/releases"); return true; }}, //{NotificationType::NewAppAvailable, NotificationLevel::ImportantNotificationLevel, 20, _u8L("New vesion of PrusaSlicer is available.", _u8L("Download page.") }, diff --git a/src/slic3r/GUI/OG_CustomCtrl.cpp b/src/slic3r/GUI/OG_CustomCtrl.cpp index f67f6b4304a..a3cb345b420 100644 --- a/src/slic3r/GUI/OG_CustomCtrl.cpp +++ b/src/slic3r/GUI/OG_CustomCtrl.cpp @@ -19,12 +19,12 @@ static bool is_point_in_rect(const wxPoint& pt, const wxRect& rect) rect.GetTop() <= pt.y && pt.y <= rect.GetBottom(); } -static wxSize get_bitmap_size(const wxBitmap& bmp) +static wxSize get_bitmap_size(const wxBitmapBundle* bmp, wxWindow* parent) { -#ifdef __APPLE__ - return bmp.GetScaledSize(); +#ifdef __WIN32__ + return bmp->GetBitmapFor(parent).GetSize(); #else - return bmp.GetSize(); + return bmp->GetDefaultSize(); #endif } @@ -45,8 +45,8 @@ OG_CustomCtrl::OG_CustomCtrl( wxWindow* parent, m_v_gap = lround(1.0 * m_em_unit); m_h_gap = lround(0.2 * m_em_unit); - m_bmp_mode_sz = get_bitmap_size(create_scaled_bitmap("mode_simple", this, wxOSX ? 10 : 12)); - m_bmp_blinking_sz = get_bitmap_size(create_scaled_bitmap("search_blink", this)); + m_bmp_mode_sz = get_bitmap_size(get_bmp_bundle("mode", wxOSX ? 10 : 12), this); + m_bmp_blinking_sz = get_bitmap_size(get_bmp_bundle("search_blink"), this); init_ctrl_lines();// from og.lines() @@ -145,7 +145,7 @@ wxPoint OG_CustomCtrl::get_pos(const Line& line, Field* field_in/* = nullptr*/) int blinking_button_width = m_bmp_blinking_sz.GetWidth() + m_h_gap; if (line.widget) { - h_pos += blinking_button_width; + h_pos += (line.has_undo_ui() ? 3 : 1) * blinking_button_width; for (auto child : line.widget_sizer->GetChildren()) if (child->IsWindow()) @@ -173,8 +173,8 @@ wxPoint OG_CustomCtrl::get_pos(const Line& line, Field* field_in/* = nullptr*/) ConfigOptionDef option = opt.opt; // add label if any if (is_multioption_line && !option.label.empty()) { - //! To correct translation by context have to use wxGETTEXT_IN_CONTEXT macro from wxWidget 3.1.1 - label = (option.label == L_CONTEXT("Top", "Layers") || option.label == L_CONTEXT("Bottom", "Layers")) ? + // those two parameter names require localization with context + label = (option.label == "Top" || option.label == "Bottom") ? _CTX(option.label, "Layers") : _(option.label); label += ":"; @@ -188,7 +188,7 @@ wxPoint OG_CustomCtrl::get_pos(const Line& line, Field* field_in/* = nullptr*/) #else GetTextExtent(label, &label_w, &label_h, 0, 0, &m_font); #endif //__WXMSW__ - h_pos += label_w + 1 + m_h_gap; + h_pos += label_w + m_h_gap; } h_pos += (opt.opt.gui_type == ConfigOptionDef::GUIType::legend ? 1 : 3) * blinking_button_width; @@ -199,7 +199,7 @@ wxPoint OG_CustomCtrl::get_pos(const Line& line, Field* field_in/* = nullptr*/) if (opt.opt.gui_type == ConfigOptionDef::GUIType::legend) h_pos += 2 * blinking_button_width; - h_pos += field->getWindow()->GetSize().x; + h_pos += field->getWindow()->GetSize().x + m_h_gap; if (option_set.size() == 1 && option_set.front().opt.full_width) break; @@ -246,7 +246,7 @@ void OG_CustomCtrl::OnMotion(wxMouseEvent& event) wxString language = wxGetApp().app_config->get("translation_language"); - bool suppress_hyperlinks = get_app_config()->get("suppress_hyperlinks") == "1"; + const bool suppress_hyperlinks = get_app_config()->get_bool("suppress_hyperlinks"); for (CtrlLine& line : ctrl_lines) { line.is_focused = is_point_in_rect(pos, line.rect_label); @@ -257,22 +257,28 @@ void OG_CustomCtrl::OnMotion(wxMouseEvent& event) break; } - for (size_t opt_idx = 0; opt_idx < line.rects_undo_icon.size(); opt_idx++) + size_t undo_icons_cnt = line.rects_undo_icon.size(); + assert(line.rects_undo_icon.size() == line.rects_undo_to_sys_icon.size()); + + const std::vector

    Cs5;Zpu&+h7* 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 Y587hbA)UWEv$4wZ#$T`+Gk47Y0J?tYLjV8( literal 0 HcmV?d00001 diff --git a/resources/profiles/MakerGear/MAKERGEAR_M3_DUPLICATION_thumbnail.png b/resources/profiles/MakerGear/MAKERGEAR_M3_DUPLICATION_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..879a1b0678ff2483c0a3c59528edc46db30dfaec GIT binary patch literal 32512 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 E0VGwxHUIzs literal 0 HcmV?d00001 diff --git a/resources/profiles/MakerGear/MAKERGEAR_M3_SE_thumbnail.png b/resources/profiles/MakerGear/MAKERGEAR_M3_SE_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..b8791bec059660760c50c67ca19eff00057acb8e GIT binary patch literal 39835 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 h$ic`-%$lv(3Z)9n4k+P_0$~eum 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 T*%229cwQhg86W+DFr-qGmT literal 0 HcmV?d00001 diff --git a/resources/profiles/MakerGear/MAKERGEAR_M3_thumbnail.png b/resources/profiles/MakerGear/MAKERGEAR_M3_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..c3dc4e756f368ef7b0b0d8d4ae199a804ca45a23 GIT binary patch literal 38366 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%0ADgY@V~c(k!9Q1VUM`a2l&ZX9iO`|~cP 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 #}6x)y19IE8e>gN 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 literal 0 HcmV?d00001 diff --git a/resources/profiles/MakerGear/MAKERGEAR_MICRO_thumbnail.png b/resources/profiles/MakerGear/MAKERGEAR_MICRO_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..cfcd8a8e85a939111b8bbd869ebf4ff2615153f6 GIT binary patch literal 48460 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∋monM+kvJo%%p9&#{LX05c^Nw4Fb*4QUk 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